diff --git a/.gitignore b/.gitignore index fc163b32a..3b37b1657 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,32 @@ -*.pyc -pos/is4c/ini/ini.php -*~ +*.pyc +pos/is4c/ini/ini.php +*~ +pos/is4c-nf/log/*.log +pos/is4c-nf/ini.php +pos/is4c-web/ini.php +pos/is4c-web/lib/pp-api-credentials.php +fannie/reports/cash_report/image_area/* +fannie/config.php +fannie/logs/*.log +fannie/logs/*.txt +pos/is4c-nf/scale-drivers/drivers/rs232/ssd +*/tmp/* +fannie/item/images/done/* +fannie/item/images/new/* +fannie/legacy/FE/overshort/acct +fannie/cache/cachefiles +fannie/inventory/archive/* +fannie/reports/Store-Specific/WFC/CCSettle/xmlcache/*.xml +fannie/auth/shadowread/shadowread +fannie/src/Credentials/* +dist/deb/DEBS/*.deb +dist/rpm/BUILD/* +dist/rpm/RPMS/* +dist/rpm/SOURCES/* +dist/rpm/SRPMS/* +fannie/pi_food_net +fannie/pi_food_net/scalesDistro +*.dll +*.exe +fannie/INSTALL +README diff --git a/INSTALL b/INSTALL old mode 100644 new mode 100755 index 8b66d4c16..4a8283dfc --- a/INSTALL +++ b/INSTALL @@ -1,17 +1,9 @@ Installing the software ---------------------------------------- -TODO: Someone else should really write this section... +See documentation/IS4C & documentation/Fannie Installing the database ---------------------------------------- -(Note that the following instructions only work with MySQL.) - -To install the server databases and account: - - $ python pos/installation/install_server.py - -To install the lane databases and account: - - $ python pos/installation/install_lane.py +Same as above diff --git a/README b/README old mode 100644 new mode 100755 index f57dfc9a2..ef8db4b50 --- a/README +++ b/README @@ -1,6 +1,6 @@ IS4C - The POS, the backend, the movie, the book, reporting system -This is intended to act as the destination for the IS4C v2 project which is currently available at http://is4c.coop +This is development branch is based off WFC's release. Up to date code can be found on github. Whereas the FLOSS-POS project is a fork of this project, the reposity here should aim to complete the currently available code. The feature set may be more limited, but hopefully robust enough to have a clear upgrade path to any future versions of IS4C/FLOSS-POS/??? diff --git a/pos/is4c/is4c_errrors b/dist/deb/DEBS/.dummyfile old mode 100755 new mode 100644 similarity index 100% rename from pos/is4c/is4c_errrors rename to dist/deb/DEBS/.dummyfile diff --git a/dist/deb/README.CentOS b/dist/deb/README.CentOS new file mode 100644 index 000000000..004f90d03 --- /dev/null +++ b/dist/deb/README.CentOS @@ -0,0 +1,28 @@ +Deb packages are generated using alien. To get alien set up +on CentOS: + +1. Install some pre-requisites from official repos +$ yum install fakeroot dpkg-devel + +2. Install Getopt from rpmforge. If done via yum, this conflicts +(just on a manpage; can be safely ignored). +$ yum install perl-Getopt-Long +$ rpm -Uvh --force /var/cache/yum/rpmforge/packages/perl-Getopt-Long* + +3. Get debhelper (source version) from debian. It's just a bunch of perl +scripts. +$ tar xzf debhelper* +$ cd debhelper* +$ make install + +4. Get alien (source version and .deb version) from debian. Use alien to +convert itself. +$ tar xzf alien*.tar.gz +$ cd alien +$ mv ../alien*.deb . +$ ./alien.pl -r alien*.deb +$ rpm -Uvh alien*.rpm + +Everything's now installed. Alien installs to an odd path though, so +you have to correct for it in the shell before using the alien command. +$ export PERL5LIB="/usr/share/perl5" diff --git a/dist/deb/make-debs.sh b/dist/deb/make-debs.sh new file mode 100755 index 000000000..b0d443611 --- /dev/null +++ b/dist/deb/make-debs.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +if [ $# -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Base package: +# Add dependencies +# Adjust /etc path to apache2 +if [ -f ../rpm/RPMS/noarch/it-core-$1-$2.noarch.rpm ]; then + echo "Building it-core base package" + alien --keep-version --generate --scripts ../rpm/RPMS/noarch/it-core-$1-$2.noarch.rpm + cd it-core-$1/ + sed -e "s/Depends:.*/Depends: php5, php5-mysql, libapache2-mod-php5, mysql-server (>=5.0)/g" --in-place="" debian/control + mv etc/httpd etc/apache2 + dpkg-buildpackage -d -b + cd .. + rm -rf it-core-$1/ + rm -rf it-core-$1.orig/ +else + echo "File not found: it-core-$1-$2.noarch.rpm" +fi + +if [ -f ../rpm/RPMS/noarch/it-core-doc-$1-$2.noarch.rpm ]; then + echo "Building it-core doc package" + alien --keep-version --generate --scripts ../rpm/RPMS/noarch/it-core-doc-$1-$2.noarch.rpm + cd it-core-doc-$1/ + sed -e "s/Depends:.*/Depends: it-core (=$1-$2)/g" --in-place="" debian/control + dpkg-buildpackage -d -b + cd .. + rm -rf it-core-doc-$1/ + rm -rf it-core-doc-$1.orig/ +else + echo "File not found: it-core-doc-$1-$2.noarch.rpm" +fi + +# Fannie package: +# Change apache user to www-data +if [ -f ../rpm/RPMS/noarch/it-core-fannie-$1-$2.noarch.rpm ]; then + echo "Building it-core fannie package" + alien --keep-version --generate --scripts ../rpm/RPMS/noarch/it-core-fannie-$1-$2.noarch.rpm + cd it-core-fannie-$1/ + sed -e "s/Depends:.*/Depends: it-core (=$1-$2)/g" --in-place="" debian/control + sed -e "s/apache/www-data/g" --in-place="" debian/postinst + sed -e "s/apache/www-data/g" --in-place="" debian/preinst + dpkg-buildpackage -d -b + cd .. + rm -rf it-core-fannie-$1/ + rm -rf it-core-fannie-$1.orig/ +else + echo "File not found: it-core-fannie-$1-$2.noarch.rpm" +fi + +# IS4C-nf package: +# Change apache user to www-data +if [ -f ../rpm/RPMS/noarch/it-core-is4c-nf-$1-$2.noarch.rpm ]; then + echo "Building it-core is4c-nf package" + alien --keep-version --generate --scripts ../rpm/RPMS/noarch/it-core-is4c-nf-$1-$2.noarch.rpm + cd it-core-is4c-nf-$1/ + sed -e "s/Depends:.*/Depends: it-core (=$1-$2)/g" --in-place="" debian/control + sed -e "s/apache/www-data/g" --in-place="" debian/postinst + dpkg-buildpackage -d -b + cd .. + rm -rf it-core-is4c-nf-$1/ + rm -rf it-core-is4c-nf-$1.orig/ +else + echo "File not found: it-core-is4c-nf-$1-$2.noarch.rpm" +fi + +# mono scale driver +# Change apache user to www-data +if [ -f ../rpm/RPMS/noarch/it-core-posdriver-sph-$1-$2.noarch.rpm ]; then + echo "Building it-core posdriver-sph package" + alien --keep-version --generate --scripts ../rpm/RPMS/noarch/it-core-posdriver-sph-$1-$2.noarch.rpm + cd it-core-posdriver-sph-$1/ + sed -e "s/apache/www-data/g" --in-place="" debian/postinst + dpkg-buildpackage -d -b + cd .. + rm -rf it-core-posdriver-sph-$1/ + rm -rf it-core-posdriver-sph-$1.orig/ +else + echo "File not found: it-core-posdriver-sph-$1-$2.noarch.rpm" +fi + +# ssd scale driver +if [ -f ../rpm/RPMS/noarch/it-core-posdriver-ssd-$1-$2.noarch.rpm ]; then + echo "Building it-core posdriver-ssd package" + alien --keep-version --generate --scripts ../rpm/RPMS/noarch/it-core-posdriver-ssd-$1-$2.noarch.rpm + cd it-core-posdriver-ssd-$1/ + dpkg-buildpackage -d -b + cd .. + rm -rf it-core-posdriver-ssd-$1/ + rm -rf it-core-posdriver-ssd-$1.orig/ +else + echo "File not found: it-core-posdriver-sph-$1-$2.noarch.rpm" +fi + +rm *.changes +mv *.deb DEBS/ diff --git a/dist/nightlies.sh b/dist/nightlies.sh new file mode 100755 index 000000000..9da393d19 --- /dev/null +++ b/dist/nightlies.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +VERSION=1.0.0 +RELEASE=`date +%Y.%m.%d` + +git pull + +# build RPMs +cd rpm +./setup-here.sh $VERSION +cd SPECS +sed -e "s/Release:.*/Release: $RELEASE/g" --in-place="" it-core.spec +cd .. +rpmbuild -ba SPECS/it-core.spec + +# build DEBs +cd ../deb +export PERL5LIB="/usr/share/perl5/" +./make-debs.sh $VERSION $RELEASE + +# remove old binaries +cd .. +find . -name '*.rpm' -mtime +7 | xargs rm +find . -name '*.deb' -mtime +7 | xargs rm diff --git a/pos/is4c/log/is4c_errors b/dist/rpm/BUILD/.dummyfile similarity index 100% rename from pos/is4c/log/is4c_errors rename to dist/rpm/BUILD/.dummyfile diff --git a/pos/testbottlecap b/dist/rpm/RPMS/.dummyfile similarity index 100% rename from pos/testbottlecap rename to dist/rpm/RPMS/.dummyfile diff --git a/dist/rpm/SOURCES/.dummyfile b/dist/rpm/SOURCES/.dummyfile new file mode 100644 index 000000000..e69de29bb diff --git a/dist/rpm/SPECS/it-core.spec b/dist/rpm/SPECS/it-core.spec new file mode 100644 index 000000000..e6715ffcb --- /dev/null +++ b/dist/rpm/SPECS/it-core.spec @@ -0,0 +1,192 @@ +Name: it-core +Version: 1.0.0 +Release: 2011.08.10 +Summary: IT CORE Point of Sale +AutoReqProv: no +Group: Applications/Internet +License: GPLv2 +BuildArch: noarch +URL: http://github.com/gohanman/IS4C +Source0: it-core-1.0.0.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +#BuildRequires: +Requires: php >= 5, php-mysql, php-xml, php-pear, php-ldap, mysql >= 5, httpd >= 2 + +%description +IT CORE is a collection of front end and back end +point of sale tools. This main package contains +the license and an Apache config addition + +%package doc +Summary: IT CORE Documentation +Group: Applications/Internet +Requires: %{name} = %{version}-%{release} +%description doc +IT Core Web-based Documenation. Installs +to http://localhost/it-core/documentation/ + +%package fannie +Summary: IT CORE Backend +Group: Applications/Internet +Requires: %{name} = %{version}-%{release} +%description fannie +IT Core Backend tool collection "Fannie". Installs +to http://localhost/it-core/fannie/ + +%package is4c-nf +Summary: IT CORE Frontend +Group: Applications/Internet +Requires: %{name} = %{version}-%{release} +%description is4c-nf +A frameless IT CORE front end derived from IS4C +Installs to http://localhost/it-core/is4c-nf/ + +%package posdriver-sph +Summary: IT CORE Scale Driver +Group: Applications/Internet +Requires: %{name} = %{version}-%{release}, it-core-is4c-nf = %{version}-%{release}, mono-core +BuildRequires: mono-devel +%description posdriver-sph +A mono-based driver for monitoring serial port(s) +and reading UDP input + +%package posdriver-ssd +Summary: IT CORE Scale Driver +Group: Applications/Internet +Requires: %{name} = %{version}-%{release}, it-core-is4c-nf = %{version}-%{release} +%description posdriver-ssd +A C-based driver for monitoring serial port(s) + +# debug script fails on filenames with spaces so disabling... +%define debug_package %{nil} + +%prep +%setup -q +# scrub binaries to mono requirements aren't auto-added +rm pos/is4c-nf/scale-drivers/drivers/NewMagellan/*.exe +rm pos/is4c-nf/scale-drivers/drivers/NewMagellan/*.dll +# ditto for libc binaries +rm pos/is4c-nf/scale-drivers/c-wrappers/nm + +# fixup paths +sed -e 's/.*private static String MAGELLAN_OUTPUT_DIR.*/private static String MAGELLAN_OUTPUT_DIR = "ss-output";/g' --in-place="" pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs + +%build +cd pos/is4c-nf/scale-drivers/drivers/NewMagellan && make +cd ../../../../../ +cd pos/is4c-nf/scale-drivers/drivers/rs232 && make + +%install +rm -rf $RPM_BUILD_ROOT + +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/init.d/ +mkdir -p $RPM_BUILD_ROOT%{_datadir}/it-core +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/posdriver-sph +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/posdriver-ssd + +cat << 'EOF' > $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/it-core.conf +# simple apache redirection +Alias /it-core %{_datadir}/it-core + + + Options Indexes FollowSymLinks + +EOF + +cat << 'EOF' > fannie/config.php + +EOF + +cat << 'EOF' > pos/is4c-nf/ini.php + +EOF + +cp -r fannie $RPM_BUILD_ROOT%{_datadir}/it-core/ +cp -r documentation $RPM_BUILD_ROOT%{_datadir}/it-core/ +cp -r pos/is4c-nf $RPM_BUILD_ROOT%{_datadir}/it-core/ +cp -r license $RPM_BUILD_ROOT%{_datadir}/it-core/ + +# grab init scripts, create empty log files +mv $RPM_BUILD_ROOT%{_datadir}/it-core/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph $RPM_BUILD_ROOT%{_sysconfdir}/init.d +mv $RPM_BUILD_ROOT%{_datadir}/it-core/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd $RPM_BUILD_ROOT%{_sysconfdir}/init.d +touch $RPM_BUILD_ROOT%{_localstatedir}/run/posdriver-sph/pos.log +touch $RPM_BUILD_ROOT%{_localstatedir}/run/posdriver-ssd/ssd.log + +%clean +rm -rf $RPM_BUILD_ROOT + +%post fannie +chown apache:apache %{_datadir}/it-core/fannie/config.php +chmod 644 %{_datadir}/it-core/fannie/config.php + +%post is4c-nf +chown apache:apache %{_datadir}/it-core/is4c-nf/ini.php +chmod 644 %{_datadir}/it-core/is4c-nf/ini.php + +%post posdriver-sph +chown apache:apache %{_datadir}/it-core/is4c-nf/scale-drivers/drivers/NewMagellan/ports.conf +chmod -R 777 %{_datadir}/it-core/is4c-nf/scale-drivers/drivers/NewMagellan/ss-output + +%post posdriver-ssd +chown nobody:nobody %{_localstatedir}/posdriver-ssd + +%files +%defattr(-,root,root,-) +%{_datadir}/it-core/license +%{_sysconfdir}/httpd/conf.d/it-core.conf + +%files doc +%defattr(-,root,root,-) +%{_datadir}/it-core/documentation + +%files fannie +%defattr(-,root,root,-) +%{_datadir}/it-core/fannie + +%files is4c-nf +%defattr(-,root,root,-) +%{_datadir}/it-core/is4c-nf/*.* +%{_datadir}/it-core/is4c-nf/DEV_README +%{_datadir}/it-core/is4c-nf/WFC_VS_RELEASE +%{_datadir}/it-core/is4c-nf/ajax-callbacks/ +%{_datadir}/it-core/is4c-nf/cc-modules/ +%{_datadir}/it-core/is4c-nf/graphics/ +%{_datadir}/it-core/is4c-nf/gui-class-lib/ +%{_datadir}/it-core/is4c-nf/gui-modules/ +%{_datadir}/it-core/is4c-nf/install/ +%{_datadir}/it-core/is4c-nf/js/ +%{_datadir}/it-core/is4c-nf/lib/ +%{_datadir}/it-core/is4c-nf/log/ +%{_datadir}/it-core/is4c-nf/parser-class-lib/ +%{_datadir}/it-core/is4c-nf/quickkeys/ +%{_datadir}/it-core/is4c-nf/test/ +%{_datadir}/it-core/is4c-nf/scale-drivers/c-wrappers/ +%{_datadir}/it-core/is4c-nf/scale-drivers/drivers/Magellan/ +%{_datadir}/it-core/is4c-nf/scale-drivers/php-wrappers/ScaleDriverWrapper.php + +%files posdriver-sph +%defattr(-,root,root,-) +%{_datadir}/it-core/is4c-nf/scale-drivers/drivers/NewMagellan/ +%{_datadir}/it-core/is4c-nf/scale-drivers/php-wrappers/NewMagellan.php +%{_datadir}/it-core/is4c-nf/scale-drivers/php-wrappers/NM_Ingenico.php +%{_sysconfdir}/init.d/posdriver-sph +%dir %{_localstatedir}/run/posdriver-sph +%ghost %{_localstatedir}/run/posdriver-sph/pos.log + +%files posdriver-ssd +%defattr(-,root,root,-) +%{_datadir}/it-core/is4c-nf/scale-drivers/drivers/rs232/ +%{_datadir}/it-core/is4c-nf/scale-drivers/php-wrappers/ssd.php +%{_sysconfdir}/init.d/posdriver-ssd +%dir %{_localstatedir}/run/posdriver-ssd +%ghost %{_localstatedir}/run/posdriver-ssd/ssd.log + +%changelog diff --git a/dist/rpm/SRPMS/.dummyfile b/dist/rpm/SRPMS/.dummyfile new file mode 100644 index 000000000..e69de29bb diff --git a/dist/rpm/just-prep.sh b/dist/rpm/just-prep.sh new file mode 100755 index 000000000..a5819087b --- /dev/null +++ b/dist/rpm/just-prep.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +cd ../.. + +# clean old sources +rm -rf dist/rpm/SOURCES/it-core-* +mkdir dist/rpm/SOURCES/it-core-$1 + +# tar once into a new it-core top level directory +# then extract and re-tar with the new top level directory +# this seems like the easiest way to leverage .gitignore +# in exlcuding files and get the top level directory name +# that rpmbuild demands +tar cf dist/rpm/SOURCES/it-core-$1/it-core-$1.tar -X .gitignore documentation fannie license pos/is4c-nf +cd dist/rpm/SOURCES/it-core-$1/ +tar xf it-core-$1.tar +rm it-core-$1.tar +cd .. +tar czf it-core-$1.tar.gz it-core-$1 +rm -rf it-core-$1 + +# fix-up spec file for correct version +cd ../SPECS +sed -e "s/Version:.*/Version: $1/g" --in-place="" it-core.spec +sed -e "s/Source0:.*/Source0: it-core-$1.tar.gz/g" --in-place="" it-core.spec +cd .. + +cp SPECS/it-core.spec . +mv SOURCES/it-core-$1.tar.gz . + +echo "Preparation is done" +echo "Spec and tarball in this directory can be used elsewhere" diff --git a/dist/rpm/setup-here.sh b/dist/rpm/setup-here.sh new file mode 100755 index 000000000..ed5032130 --- /dev/null +++ b/dist/rpm/setup-here.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +cd ../.. + +# clean old sources +rm -rf dist/rpm/SOURCES/it-core-* +mkdir dist/rpm/SOURCES/it-core-$1 + +# tar once into a new it-core top level directory +# then extract and re-tar with the new top level directory +# this seems like the easiest way to leverage .gitignore +# in exlcuding files and get the top level directory name +# that rpmbuild demands +tar cf dist/rpm/SOURCES/it-core-$1/it-core-$1.tar.gz -X .gitignore documentation fannie license pos/is4c-nf +cd dist/rpm/SOURCES/it-core-$1/ +tar xf it-core-$1.tar.gz +rm it-core-$1.tar.gz +cd .. +tar czf it-core-$1.tar.gz it-core-$1 +rm -rf it-core-$1 + +# fix-up spec file for correct version +cd ../SPECS +sed -e "s/Version:.*/Version: $1/g" --in-place="" it-core.spec +sed -e "s/Source0:.*/Source0: it-core-$1.tar.gz/g" --in-place="" it-core.spec +cd .. + +# update rpmmacros +PWD=`pwd` +echo "%_topdir $PWD" > ~/.rpmmacros + diff --git a/documentation/.DS_Store b/documentation/.DS_Store new file mode 100755 index 000000000..669052f19 Binary files /dev/null and b/documentation/.DS_Store differ diff --git a/documentation/Fannie/developer/auth.html b/documentation/Fannie/developer/auth.html new file mode 100644 index 000000000..51a2592ad --- /dev/null +++ b/documentation/Fannie/developer/auth.html @@ -0,0 +1,145 @@ + + + Authentication System + + + +

Authentication System

+
+ updated as of: November 11, 2012
+ last author: Eric Lee
+ original author: Andy Theuninck +
+The backend eventually needs access controls. +In my opinion, the "backendsecurity" column +in the employees table isn't going to work. There's +enough going on that tiered access just doesn't +make sense. For example, the front end manager +should be able to edit cashiers but probably not +products. Buyers or scanning should be able to +edit products but probably not cashiers. +

+We need something more nuanced (mandatory access +controls if you're into terminology). The system +described here is included with fannie. It isn't +perfect (frankly, the table structure is just +bone-headed) but it works and is reasonably +flexible. +

+

Authenticating Users

+The auth package is primarily SQL based. The UI lets +you add and remove users, change passwords, etc. +The system can be run entirely this way with usernames +and (encrypted) passwords right in the database. +Users generally don't like keeping track of lots +of passwords, so I've added a couple alternatives. +

+You can authenticate against an /etc/shadow file. +A small utility, shadowread, is included to +let apache pull password hashes out without +making /etc/shadow readable for all users +(PHP-PAM integration was in rough shape when I wrote +this). This is just for name & password matching; +the user still exists in SQL. +

+You can authenticate against an LDAP server. I use +it with openldap. It could probably be done with +Active Directory in a Windows environment. +Again this is just for name & password matching. +

+Both LDAP and shadow logins will automatically +create users in the database if needed. +

Permissions

+The auth package is structured around the notion +of authorization classes. An authorization class +is simply something a user is allowed to do - +for instance "edit_prices" could be an authorization class. +

+For finer granularity, there are optional sub-class limits. +These are pretty flexible. These don't have to mean the same +thing in all contexts, and can be anything that works in a SQL +BETWEEN statements. For example, you could use these to give +someone permission to edit prices, but only for products in +departments 10 through 15. Or you could give someone permission +to edit members, but only if their member type is 1. +

Groups

+You can put users in groups and then assign authorization classes +to the group. The table structure for this is idiotic but functional. +It saves some headaches rolling out a new tool +or trying to remember all the authorizations a new employee needs. +

Tying it all together

+There are really only two functions that get used a lot to access +user information from Fannie: +
    +
  • checkLogin() returns the name of the user, or false +if the user has not logged in.
  • +
  • validateUserQuiet(string $auth_class [,string $sub_start, string $sub_end]) +returns the name of the user if they are logged in and have the +requested authorization. Otherwise it returns false.
  • +
+The login page (auth/ui/loginform.php) accepts an optional GET argument +in the URL, redirect. So a fannie tool that uses authentication will +have a little section like this: +
+include($FANNIE_ROOT."auth/login.php");
+if (!validateUserQuiet("edit_prices")){
+	$redirect = $FANNIE_URL."item/itemMaint.php";
+	$loginpage = $FANNIE_URL."auth/ui/loginform.php";
+	header("Location: $loginpage?redirect=$redirect");
+	exit;
+}
+
+This sends the user to a login form, if needed, and once they +enter a valid username and password brings them right +back to what they were doing. +

Installation

+
    +
  • In the Authentication section ("tab") of the Fannie Install page + select "Yes" for Authentican Enabled and click "Re-run".
  • +
  • After that, if no Users have been entered yet there will be input boxes for + Username and Password for an initial one with "admin" authorization. Click "Re-run". +
  • +
  • These credentials will let you log in to the Authentication interface at FANNIE/auth/ui/ +
    However other protected pages may still be closed to a user who only has "admin" authorization. +
  • +
+
+10Nov12 EL This procedure may have been superseded by the above:
+The auth packages uses itself to check who can edit users, +permissions, etc so there's a little backdoor for initial +installation. +
    +
  1. Create a file in auth/ named init.php. It can be empty.
  2. +
  3. Go to auth/ui/menu.php in a browser.
  4. +
  5. Create a user for yourself. Remember your password.
  6. +
  7. Give your user the authorization "admin". This provides +access to manage the auth package.
  8. +
  9. Delete the init.php file created in step one.
  10. +
+
+

Drawbacks and/or Gotchas

+Just stuff to be aware of. Some can probably be fixed, some are inherent. +
    +
  • You will not remember the names of all the authorization +classes. It's easy enough to go look in the code, but it's an +annoying extra step. A drop down list of existing authorizations +would help some. Groups help some.
  • +
  • Groups must have at least one user. groups.php could be +re-written around a new schema, but it's not a priority for me.
  • +
  • The example code above, which is used throughout fannie, is kind +of sloppy. If someone has a valid username & password but not +that particular authorization, the redirect loops. It works - +anyone who should have access will call IT to ask what's going on - +but could be handled more gracefully.
  • +
  • All three name & password systems are enabled. Turning one +off involves editing either auth/ui/loginform.php or auth/login.php. +This should probably be configurable.
  • +
  • LDAP configuration is hard coded in auth/login.php. Probably not +a big deal until it's been tested with several different LDAP servers +to get an idea just how many config options will be needed.
  • +
+ + diff --git a/documentation/Fannie/developer/cron.html b/documentation/Fannie/developer/cron.html new file mode 100644 index 000000000..f63790ac4 --- /dev/null +++ b/documentation/Fannie/developer/cron.html @@ -0,0 +1,77 @@ + + + Scheduled Tasks + + +
+ updated as of: August 20, 2012
+ last author: Andy Theuninck +
+ + + + +N.B. - pretty much all of this only applies if fannie +is installed a unix-style system +

+To facilitate the use of a single configuration file and +minimize the number of languages required to run fannie, +I'm proposing scripts to run various scheduled tasks be +written in PHP when reasonably possible. +

+To keep scripts portable, the web interface for configuring +jobs will start all scripts with a working directory of +{FANNIE}/cron/. This is rather vital. Starting each script +in a consistent relative path means the script can locate +fannie's configuration file without hard-coding any paths. +

+To make scripts available to the web interface, they must +be located in {FANNIE}/cron/. Scripts can be placed in +further subdirectories; just keep in mind the inital working +directory will always be {FANNIE}/cron/. +

+If you place a comment block in your script containing the +string HELP, this comment will be used as user-facing +documentation explaining what the script does +that is available by clicking the link in the 'Command' +column of the web interface, {FANNIE}/cron/management/index.php . +

+By default, the web interface will direct script output +to {FANNIE}/logs/dayend.log. +

Example

+Here's a sample script to backup the products table. For +the sake of the example, consider the file to be +{FANNIE}/cron/TableBackups/products.php. The function +cron_msg() simply appends a timestamp and filename to +the given string for better logging. +
+<?php
+/* HELP
+
+   TableBackups/products.php
+
+   This script makes a copy of products in
+   prodBackup.
+*/
+
+chdir("TableBackups"); // because of inital working directory
+
+include("../../config.php");
+include($FANNIE_ROOT."src/mysql_connect.php");
+include($FANNIE_ROOT."src/cron_msg.php");
+
+$result1 = $dbc->query("TRUNCATE TABLE prodBackup");
+$result2 = $dbc->query("INSERT INTO prodBackup SELECT * FROM products");
+
+if ($result1 === false || $result2 === false)
+	echo cron_msg("Error backing up table: products");
+else
+	echo cron_msg("Successfully backed up products");
+?>
+
+ + diff --git a/documentation/Fannie/developer/db-alteration.html b/documentation/Fannie/developer/db-alteration.html new file mode 100644 index 000000000..9f66ac20d --- /dev/null +++ b/documentation/Fannie/developer/db-alteration.html @@ -0,0 +1,36 @@ + + + Database Alteration System + + +
+ updated as of: August 20, 2012
+ last author: Andy Theuninck +
+Occasionally a developer may wish to change an existing table +or view. This has the potential to be more disruptive to other +users, so the process is a bit different and requires confirmation +rather than being automated. +

+Updates must be placed in the install/updates directory. +Update files should be named with a date and time stamp - +i.e., YYYYMMDDHHMMSS.php. This means they sort sensibly into +chronological order. +

+The update file should contain a class named +update_YYYYMMDDHHMMSS the extends the provided base +class UpdateObj (class names can't start with a number). +In most cases an update class will just define a few properties: +

    +
  • $timestamp should be the same YYYYMMDDHHMMSS date and time. +
  • $author should say who you are +
  • $description should explain what the update does. +
  • $queries is the the actual update. It should contain +three entries with keys: op, trans, and archive. +Each entry is an array of queries to perform on the respective +databases. +
+Look at existing updates for examples. It's very light coding; you're +really just defining variables. + + diff --git a/documentation/Fannie/developer/db-creation.html b/documentation/Fannie/developer/db-creation.html new file mode 100644 index 000000000..91c2582c6 --- /dev/null +++ b/documentation/Fannie/developer/db-creation.html @@ -0,0 +1,46 @@ + + + Database Creation System + + +
+ updated as of: August 20, 2012
+ last author: Andy Theuninck +
+I revised database creation a bit. It still takes place in the +install script (install/index.php), the work is no longer +all in one multi-thousand line file. +

+The create_if_needed function (install/db.php) does most of the +heavy lifting. It takes five arguments: +

    +
  • $con - a SQLManager object connected to the appropriate database
  • +
  • $dbms - the database system. Probably MYSQL or MSSQL
  • +
  • $db_name - the user defined database name
  • +
  • $table_name - the table to create
  • +
  • $stddb - a standardized database name
  • +
+The only real gotcha is the double database names. There are two +so that the user doesn't have to call their databases is4c_op +and is4c_log, but the create_if_needed function can still discern +which database we're talking about. By convention, $stddb should +be op, trans, or arch. Yay brevity. +

+Next are create statement scripts. Each table or view should have +it's own create statement script. These PHP files live in the +install/sql directory, with a subdirectory for each database. +The name of the file should match the name of the table. Example: +the create statement script for the products table is +install/sql/op/products.php. +

+A create statement script should generate a query string that will +create the appropriate table or view and assign it to the variable +$CREATE[$stdb.$table_name]. Example: products would assign its +query to $CREATE["op.products"]. Create statement scripts are +included directly; no need to return anything. The array-entry naming +convention is just a sanity check. +

+Comment your create statement scripts. Any comments included are +used to auto-generate HTML documentation for the database. + + diff --git a/documentation/Fannie/developer/framework.html b/documentation/Fannie/developer/framework.html new file mode 100644 index 000000000..cd7805724 --- /dev/null +++ b/documentation/Fannie/developer/framework.html @@ -0,0 +1,26 @@ + + + Framework + + +

+ updated as of: August 20, 2012
+ last author: Andy Theuninck +
+ A framework needs some rules. I hate rules, so let's keep this short. I think we can share code if everyone can live with just two requirements. +

One configuration

+ Let's all agree on one configuration file. I say it should be config.php and it should live at the root of fannie. The upside is every script needs just one relative include; variables in the config then fill in the rest of what you need. This lets fannie sit in subdirectories and lets any given tool/report find the top of fannie, regardless of whose store it's running at. +

Database Best Practices

+ This is the hard part. Ideally, we'd all keep the same schema. With a little caution, I think we can at least have scripts that degrade gracefully when the underlying structure changes. These are not meant as permanent solutions; there practices should merely streamline schema changes and make them less disruptive. Ideas: +
    +
  • Grab row values by column name instead of numeric index. As long as the column exists, you'll get the right value, regardless of actual layout
  • +
  • Use the SQLManager class where you can. I know most people are using MySQL, but I don't see any downside to keeping the system fairly open. If someone wants to run IS4C on top of Postgres, it's a much easier port down the line. There are also a couple bits of handy functionality: +
      +
    • SQLManager::smart_insert(table_name,value_array) - this method takes an array of column names & values, polls the given table to see which of those columns are available, then forms an appropriate INSERT statement. Obviously this doesn't guarantee all your information will be written, but it increases the chances of basic success. If your script is trying to create a products record, it'll probably at least get a row into that table with upc, price, department, etc.
    • +
    • SQLManager::smart_update(table_name,value_array,where_clause) - this method takes an array of column names & values, polls the given table to see which columns are available, then forms an appropriate UPDATE statement. Again, not all data is necessarily saved, but if your script is trying to change a price it'll likely manage to do so. This only works for single-table updates, but those are the norm in Fannie anyway.
    • +
    +
  • +
  • Put CREATE statements in install.php when you need new tables. This makes it easy for other developers (and regular users) to add the tables your script needs. Don't drop and recreate tables that already exist; deleting someone else's data is impolite.
  • +
  • Publish schema updates via the provided system. + + diff --git a/documentation/Fannie/developer/get-going.html b/documentation/Fannie/developer/get-going.html new file mode 100644 index 000000000..1eb23d1bb --- /dev/null +++ b/documentation/Fannie/developer/get-going.html @@ -0,0 +1,18 @@ + + + Dive in + + +
    + updated as of: August 20, 2012
    + last author: Andy Theuninck +
    + Want to just start shoe-horning the tools you need into this structure? Here's the anatomy of a PHP tool under fannie. You'll need to add one to four lines to an existing tool. I know, demanding. +

    Grab the config

    + The first thing every script should do is include config.php. This gives you a variable named $FANNIE_ROOT that is the absolute path to the top of fannie. Any other files you need can be included using this variable. +

    Need a database connection?

    + If you need a database connection, include $FANNIE_ROOT."src/mysql_connect.php". The name is historic; it works with mssql too. This include brings in a variable named $dbc. $dbc is not a mysql resource; it's a class wrapped around ADOdb for multiple dbms support. If you want to use this class, it's pretty intuitive. $dbc->query is equivalent to mysql_query, $dbc->num_rows is equivalent to mysql_num_rows, etc. +

    Want a skin

    + If you want the "outer frame" of fannie with menu, include two more files: $FANNIE_ROOT."src/header.html" and $FANNIE_ROOT."src/footer.html". It's optional. I don't always use it when I want the full screen width. + + diff --git a/documentation/Fannie/developer/index-core.html b/documentation/Fannie/developer/index-core.html new file mode 100644 index 000000000..f9f5c96ba --- /dev/null +++ b/documentation/Fannie/developer/index-core.html @@ -0,0 +1,19 @@ + + + Index + + + Hooray, a menu! + + + + diff --git a/documentation/Fannie/developer/index.html b/documentation/Fannie/developer/index.html new file mode 100644 index 000000000..f9f43d2fd --- /dev/null +++ b/documentation/Fannie/developer/index.html @@ -0,0 +1,23 @@ + + + Index + + + The recommended way to extend or alter CORE's functionality is via plugins. + Documentation on other functionality is available as well but plugin + developers should not rely too heavily on it. The plugin API is meant to be + quite stable but the underlying functionality behind the API may be subject + to change. +

    + Stores already running some version of Fannie may want to start with + the Porting documentation. It's more of a step by step approach that + makes sense when you already have a bunch of code as opposed to someone + who's starting from scratch. +

    + + + + + Fannie Installation + + + +
    + updated as of: August 20, 2012
    + last author: Andy Theuninck +
    + + NB: File paths are suggestions for clarify. Fannie can go anywhere on your server. + Documentation is for installing fannie locally. Replace localhost with a proper + URL if that's not the case. +

    Pre-requisites

    + Exact steps will vary by OS. Skip ahead if you know your way around a LAMP/WAMP stack. +
      +
    • Install Apache Web Server. Version 2+ recommended
    • +
    • Install PHP. Version 5+ strongly recommended. PHP4 will probably work, but it's not guaranteed.
    • +
    • Install MySQL database server. Version 5+ required
    • +
    + Start Apache and MySQL services. Windows-based installers probably did this for + you. On linux, try "/etc/init.d/mysqld start" or "/etc/init.d/httpd start". The + exact name of the init script may vary depending on your distribution. +

    + Configure Apache and MySQL to start at boot-time. Again, Windows likely did + this for you. If not, right click my Computer and see Manage => Services. + On Red Hat-ish linux distros, "/sbin/chkconfig/[init script name] on" should + do the trick. On Debian/Ubuntu, seek documentation on service management... +

    + Sanity check: make sure Apache+PHP is in business. Copy this into a file named + index.php: +

    +	<?php
    +	phpinfo();
    +	?>
    +	
    + Place your index.php in Apache's web root. This is probably: +
      +
    • Windows: C:\Program Files\Apache Group\Apache 2\htdocs\
    • +
    • Linux: /var/www/html/
    • +
    • Mac: /Library/WebServer/Documents/
    • +
    + Point a browser at http://localhost/. If you get a big mess of PHP installation + info, you're in business. If you get an Apache place holder page, either PHP isn't + enabled (fiddle with Apache configuration), or the index.php file isn't in the + right place (check DocumentRoot in Apache configuration). If you get a connection + refused error, Apache probably isn't running. For other problems, you're on your + own. +

    Installing Fannie

    +
      +
    1. Place the fannie directory in your web root. See prerequisites + for OS-specific possibilities. If you made an index.php file for + testing purposes, the fannie directory should go in the same place.
    2. +
    3. Point a browser at http://localhost/fannie/install/. This page is + used for initial fannie installation and configuration options.
    4. +
        +
      • The install script tries to write the configuration file, http://localhost/fannie/config.php. It'll tell you what the web server's uid is and whether or not the config file is writable. If it isn't, you need to fix that or none of the settings wills save.
      • +
      • Enter database connection information under the Main Server heading. In a basic setup, the server host is localhost, the type is MySQL, the database username is root and hopefully you know the password. You can name the operational and transaction databases whatever you like or just accept the defaults. +
      • +
      • Click Re-Run at the bottom of the page. This may take a little while as the databases get built. (Depending on your hardware and software configuration, you might even hit a PHP time/memory error. Try refreshing, maybe even a couple times.) If MySQL is running and the connection settings are correct, you should see + both Testing Connection lines under Main Server showing Succeeded.
      • +
      +
    5. Fannie is now installed and functional, albeit on a very basic level
    6. +
    + + diff --git a/documentation/Fannie/developer/plugins/db.html b/documentation/Fannie/developer/plugins/db.html new file mode 100644 index 000000000..42863caca --- /dev/null +++ b/documentation/Fannie/developer/plugins/db.html @@ -0,0 +1,29 @@ + + +Fannie Plugins + + +

    Plugin Database Use / Access

    +

    +All database interactions are conducted via the SQLManager class. A full list of its +methods is beyond the scope of this document, but its primary purpose is to allow +for different DBMSes (e.g., MySQL, Postgres, etc) without altering PHP code. In general, +its methods correspond to PHP's MySQL functions with the "mysql_" removed (e.g., query(), +fetch_row(), num_rows(), error(), etc). Learning all the classes' methods +is encouraged but probably overkill when just getting started. +

    +

    +Request a database connection via the FannieDB class. It contains a static method, get($db_name [string]) +where $db_name is the name of a database. The global configuration variables $FANNIE_OP_DB, $FANNIE_TRANS_DB, +and $FANNIE_ARCHIVE_DB contain the names of Fannie's three default databases. These are user-customizable so +don't hardcode common defaults like "core_op" or "is4c_trans". +

    +

    +If your plugin needs additional tables and/or views, include a database name option in the plugins' settings +so the user has the option of keeping the plugins' tables/views in a separate database. This reduces the +chances of running into name problems where two plugins want to use the same name for a table/view and makes +it easier for the user to manage data related to the plugin. Deleting tables or views when the plugin is +disabled is generally a bad idea unless that data can be easily recreated. Losing data due to a mistaken +configuration change is bad. Clearly keeping the plugins' tables/views separate makes it more reasonable +for the user to decide what is safe to manually delete. +

    diff --git a/documentation/Fannie/developer/plugins/define-a-plugin.html b/documentation/Fannie/developer/plugins/define-a-plugin.html new file mode 100644 index 000000000..aae35fa05 --- /dev/null +++ b/documentation/Fannie/developer/plugins/define-a-plugin.html @@ -0,0 +1,64 @@ + + +Fannie Plugins + + +

    Defining a Plugin

    +

    +User-defined plugins go in modules/plugins2.0. To get started, make a new +directory there. This will contain your plugin. Inside that directory create a +new PHP file to define your plugin. This definition tells Fannie a little information +about your plugin. To do so, it needs to define a class extending FanniePlugin like this: +

    +
    +include_once(dirname(__FILE__).'/../../../config.php');
    +
    +

    +This line includes Fannie's global configuration file. It's almost always a good idea +to do this first so all user-defined settings are accessible. Note that the path does not +assume Fannie is in a particular directory like /var/www. This is important for compatibility +with various systems. Using "dirname(__FILE__)" is preferred over using "__DIR__" since +the latter is only available in relatively new versions of PHP. +

    +
    +if (!class_exists('FanniePlugin')) include($FANNIE_ROOT.'classlib2.0/FanniePlugin.php');
    +
    +

    +This line includes the definition for the base class FanniePlugin. The variable $FANNIE_ROOT +is provided by Fannie's global configuration file. It points to the directory containing Fannie +and can be used to reference paths without using lots of "../" strings. +

    +
    +class CalendarPlugin extends FanniePlugin {
    +}
    +
    +

    +Finally, define the plugin class. The name of the subclass should match the name of the PHP file. +So, for example, in this case the file should be named CalendarPlugin.php. As a best practice, this +applies to any PHP file that defines a class. +

    +

    Further Options

    +At this point, the plugin definition is technically complete. Possible additions include: +
      +
    • A description of your plugin is generally a good idea. +
      +public $plugin_description = 'Plugin for calendars';
      +
      +
    • If your plugin has any user-configurable settings, you can define them in the +settings array. Each setting needs a name, default value, description, and label. +Settings will be saved in the global configuration variable $FANNIE_PLUGIN_SETTINGS +via the name key. An example setting like this: +
      +public $plugin_settings = array(
      +'CalendarDatabase' => array('default'=>'core_calendar','label'=>'Database',
      +		'description'=>'Database to calendars. Can
      +				be one of the default CORE databases or a 
      +				separate one.')
      +);
      +
      +would be saved as $FANNIE_PLUGIN_SETTINGS['CalendarDatabase']. +
    • Define triggers. The FanniePlugin class includes methods +named plugin_enable(), plugin_disable(), and +setting_change(). These are called when the plugin +is enabled, disabled, or its settings are updated (respectively). +
    diff --git a/documentation/Fannie/developer/plugins/index.html b/documentation/Fannie/developer/plugins/index.html new file mode 100644 index 000000000..df6597d72 --- /dev/null +++ b/documentation/Fannie/developer/plugins/index.html @@ -0,0 +1,25 @@ + + +Fannie Plugins + + +

    Writing Plugins for Fannie

    +

    +Fannie's plugin system is object oriented. Writing plugins often involves +classes. If you are not familiar with object-oriented programming, consider +reviewing information on the topic +in general +and PHP's implementation. +Inheritence is the most important concept in terms of interacting with +API functionality exposed via Fannie's base classes. PHP5 syntax is preferred and +the understanding the difference between static and instance methods is necessary +to call API functions correctly. +

    +Plugin Subtopics: + + + diff --git a/documentation/Fannie/developer/plugins/pages.html b/documentation/Fannie/developer/plugins/pages.html new file mode 100644 index 000000000..f90faf5db --- /dev/null +++ b/documentation/Fannie/developer/plugins/pages.html @@ -0,0 +1,75 @@ + + +Fannie Plugins + + +

    Create a Page

    +User-facing pages can be constructed easily using the FanniePage class +(or one of its specialized subclasses). A basic page definition looks like +this: +
    +include_once(dirname(__FILE__).'/../../../config.php');
    +if (!class_exists('FanniePage')) include($FANNIE_ROOT.'classlib2.0/FanniePage.php');
    +
    +class CalendarMainPage extends FanniePage {
    +}
    +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){
    +	$obj = new CalendarMainPage();
    +	$obj->draw_page();
    +}
    +
    +

    +As in the plugin definition, the global configuration file and API class definition +are included then a subclass is defined. In compliance with naming conventions +this particular file should be named CalendarMainPage.php. The last lines will +print the page but only if this file is called directly. Blocking off the draw_page() +call with this if statement makes it safe for other developers to include() this +file if they want to reuse or extends our class. +

    +

    +FanniePage is designed to let developers easily maintain consistent look and feel +without repeating lots of code as well as tie into lots of different sections of the +page. A subclass may override any of the following: +

      +
    • Members +
        +
      • title [string] is displayed in the window's title bar. +
      • header [string] at the top of Fannie's main, righthand section. +
      • window_dressing [bool] indicates whether or not to include Fannie's header, + footer, and menu. True means these should be included. +
      +
    • +
    • Methods +
        +
      • preprocess() [returns bool] is the very first method called. If it returns + True, the rest of the page will be drawn. If it returns False, nothing else + runs. This function is typically used to process form input. +
      • body_content() [returns string] draws the main content of the page. +
      • javascript_content() [returns string] defines any custom javascript. + <script> tags should not be included; they're added automatically. +
      • css_content() [returns string] defines any custom CSS. + <style> tags should not be included; they're added automatically. +
      +
    • +
    +

    +

    FanniePage also includes some helper methods. They are not meant to be overriden but can be +useful in the above methods or any additional custom methods.

    +
      +
    • add_script($file_url [string], $type [string]) include a script file. The + $type argument is optional. If omitted, the type is assumed to be + "text/javascript". +
    • add_css_file($file_url [string]) include a stylesheet file. +
    • add_onload_command($str [string]) runs the javascript command $str when the page + loads. The method can be called multiple times. The commands will all run in the + order that they're added. +
    +

    +URL best practices: like filesystem paths, no assumptions should be made about where Fannie is installed. +To get a URL to somewhere within your plugin, create an instance of your plugin definition class then +call its plugin_url() method. This returns the URL of the directory containing your plugin. +To reference a URL somewhere else in Fannie, use the global configuration variable $FANNIE_URL. It points +to the directory containing Fannie. +

    + + diff --git a/documentation/Fannie/developer/porting.html b/documentation/Fannie/developer/porting.html new file mode 100644 index 000000000..8afedb063 --- /dev/null +++ b/documentation/Fannie/developer/porting.html @@ -0,0 +1,142 @@ + + + Porting Existing Code + + +

    Porting Existing Code Into Fannie

    +Got something that already works and what to start integrating +it into Fannie? Great! Get started here. There are a few key +tasks to make your code get along with Fannie and behave nicely +for others as well as your self. +
      +
    • Interact with the configuration file
    • +
    • Avoid absolute paths
    • +
    • Access the database
    • +
    +

    Interact with the configuration file

    +Fannie provides a global configuration file for storing settings. +It lives in the root directory and is aptly named config.php. +Including this file is almost always the first thing you should +do in a script. It defines a bunch of helpful global variables. +

    Avoid absolute paths

    +Since Fannie is meant to exist at many locations with various +configurations, we cannot make any assumptions about file +paths. If your code is in /var/www/fannie/my-new-feature/index.php, +don't write this: +
    +include('/var/www/fannie/config.php');
    +
    +That's not portable. If someone else tries to use this code +and they have fannie in a different directory, it won't work. +Either of these options would work as an alternative: +
    +include('../config.php');
    +include(dirname(__FILE__).'/../config.php');
    +
    +The second option is slightly less likely to cause path problems +but either will work in most cases. You can use a similar notation +for further includes or use the variable $FANNIE_ROOT that's defined +in config.php and contains the filesystem path for fannie's top +directory. Similarly, the variable $FANNIE_URL provides a URL for +fannie's top directory. +

    Access the Database

    +There are a couple ways to connect to the database. The recommended +way is using objects. +
    +include($FANNIE_ROOT.'classlib2.0/data/FannieDB.php);
    +$dbc = FannieDB::get($FANNIE_OP_DB);
    +
    +The older way, at least in some versions of Fannie, still exists too. +
    +include($FANNIE_ROOT.'src/mysql_connect.php');
    +
    +This include file also provides a similar variable named $dbc. +

    +One important thing to note is that $dbc is not a mysql connection +resource; it's an instance of the SQLManager class. In a lot of cases that +won't matter yet, but if you're passing the optional connection argument to +mysql functions they may object. For example: +

    +mysql_query($someQuery, $dbc); // may cause error
    +mysql_query($someQuery);       // should work
    +
    +

    +

    Next Steps

    +Hopefully at this point your feature works (or mostly works). What should you do +next? These are a few options: +
      +
    • Use the SQLManager class
    • +
    • Add your own settings to Fannie's configuration
    • +
    • Use Fannie's look & feel on your pages
    • +
    + +

    Use the SQLManager class

    +

    +The SQLManager class is a layer between Fannie and the database. Its primary purpose +is to prevent database-specific function calls and query syntax as much as possible. +If anyone ever wants or needs to run Fannie on something other than MySQL this makes +the process a lot easier. It also enables some nifty tricks like unified logging of +all failed queries and prepared statements and transfering data between different +hosts. +

    +

    +The biggest task here is to convert mysql_* functions. This is usually pretty easy +since SQLManager's method names are based on the mysql_* functions. Just remove +"mysql_" like this: +

    +mysql_query($someQuery);
    +$dbc->query($someQuery);
    +
    +mysql_num_rows($result);
    +$dbc->num_rows($result);
    +
    +mysql_fetch_row($result);
    +$dbc->fetch_row($result);
    +
    +Often you can just use find and replace in your editor +to change all instances of "mysql_" to "$dbc->". One +potential issue to be aware of is you have to keep track +of the connection object. If you have a query inside a function, +you need to pass it $dbc or use the global keyword +to get access to it. +
    +function updateV1($dbc){
    +	$dbc->query($someQuery);
    +}
    +// or
    +function updateV2(){
    +	global $dbc;
    +	$dbc->query($someQuery);
    +}
    +
    +

    +

    Add your own settings to Fannie's configuration

    +If your feature has (or needs) user configurable settings, +you can add them by writing a plugin class +(details). +You don't have to do anything special to the rest of your +files. This is just the easiest to define your settings +and hook into the web interface without mucking around in +some fairly ugly code. +

    Use Fannie's look & feel on your pages

    +Like accessing the database, there are two ways to +add Fannie's header, footer, and menu to your page(s): +an object-oriented way and the old way. The +object-oriented way is +very structured for consistency and its subclasses can +automatically provide a bunch of functionality for +certain tasks (e.g., generating a report or uploading a +file). The traditional way is quicker and there's no API +to learn: +
    +$header = 'My Page Header';
    +$page_title = 'My Window Title';
    +include($FANNIE_ROOT.'src/header.html');
    +
    +/*
    +All your code for printing
    +*/
    +
    +include($FANNIE_ROOT.'src/footer.html');
    +
    + diff --git a/documentation/Fannie/end-user/auth-classes.html b/documentation/Fannie/end-user/auth-classes.html new file mode 100644 index 000000000..674e21719 --- /dev/null +++ b/documentation/Fannie/end-user/auth-classes.html @@ -0,0 +1,103 @@ + + +Crappy documentation via find/grep/sed! +

    +./cron/management/index.php: 'admin'
    +./auth/ui/pose.php: 'admin'
    +./batches/newbatch/index.php: 'batches'
    +./batches/newbatch/index.php: 'batches_audited'
    +./admin/labels/index.php: 'barcodes'
    +./admin/Cashiers/edit.php: 'editcashiers'
    +./admin/Cashiers/add.php: 'editcashiers'
    +./admin/Cashiers/index.php: 'editcashiers'
    +./admin/Cashiers/overshort.php: 'overshorts'
    +./admin/Cashiers/view.php: 'editcashiers'
    +./admin/Tenders/delete.php: 'tenders'
    +./admin/Tenders/index.php: 'tenders'
    +./item/updateItems.php: 'pricechange'
    +./item/updateItems.php: 'audited_pricechange'
    +./item/updateItems.php: 'pricechange'
    +./item/scaleDelete.php: 'delete_items'
    +./item/likecodes/index.php: 'manage_likecodes'
    +./item/deleteItem.php: 'delete_items'
    +./item/insertItem.php: 'pricechange'
    +./item/insertItem.php: 'audited_pricechange'
    +./item/insertItem.php: 'pricechange'
    +./item/productListCallback.php: 'delete_items'
    +./mem/new.php: 'memgen'
    +./mem/types.php: 'editmembers'
    +./ordering/ajax-calls.php: 'ordering_edit'
    +./legacy/queries/updateItemTest.php: 'pricechange'
    +./legacy/queries/updateItemTest.php: 'audited_pricechange'
    +./legacy/queries/updateItemTest.php: 'pricechange'
    +./legacy/queries/enterTestItem.php: 'pricechange'
    +./legacy/queries/enterTestItem.php: 'audited_pricechange'
    +./legacy/queries/enterTestItem.php: 'pricechange'
    +./legacy/queries/listDel.php: 'delete_items'
    +./legacy/queries/labels/index.php: 'barcodes'
    +./legacy/queries/prodFunction.php: 'pricechange'
    +./legacy/FE/overshortSingleEmp.php: 'overshorts'
    +./legacy/FE/overshort.php: 'overshorts'
    +./legacy/members/alterstatus.php: 'editmembers'
    +./legacy/members/alterstatus.php: 'editmembers_csc'
    +./legacy/members/memAddress.php: 'editmembers'
    +./legacy/members/memAddress.php: 'editmembers_csc'
    +./legacy/members/memAddress.php: 'editmembers'
    +./legacy/members/memAddress.php: 'editmembers'
    +./legacy/members/memAddress.php: 'editmembers'
    +./legacy/members/memAddress.php: 'editmembers'
    +./legacy/members/memGen.php: 'editmembers_csc'
    +./legacy/members/memGen.php: 'editmembers'
    +./legacy/members/staffAR.php: 'staffar'
    +./legacy/members/insertEdit.php: 'editmembers'
    +./legacy/members/index.php: 'memgen'
    +./legacy/members/limitedEdit.php: 'editmembers'
    +./legacy/members/limitedEdit.php: 'editmembers_csc'
    +./legacy/members/memDBHistory.php: 'editmembers'
    +./legacy/members/genNums.php: 'memgen'
    +./legacy/members/testEdit.php: 'editmembers'
    +./legacy/members/limitedSave.php: 'editmembers'
    +./legacy/members/limitedSave.php: 'editmembers_csc'
    +./legacy/it/hours/pps.php: 'view_all_hours'
    +./legacy/it/hours/menu.php: 'view_all_hours'
    +./legacy/it/hours/eval/list.php: 'evals'
    +./legacy/it/hours/eval/report.php: 'evals'
    +./legacy/it/hours/eval/index.php: 'evals'
    +./legacy/it/hours/eval/view.php: 'evals'
    +./legacy/it/hours/list.php: 'view_all_hours'
    +./legacy/it/hours/list.php: 'view_all_hours'
    +./legacy/it/hours/list.php: 'edit_employees'
    +./legacy/it/hours/upload.php: 'upload_hours_data'
    +./legacy/it/hours/viewEmployeeSalary.php: 'view_all_hours'
    +./legacy/it/hours/csvdump.php: 'view_all_hours'
    +./legacy/it/hours/csvdump.php: 'view_all_hours'
    +./legacy/it/hours/viewEmployee.php: 'view_all_hours'
    +./legacy/it/hours/viewEmployee.php: 'view_all_hours'
    +./legacy/it/hours/importUTO.php: 'upload_hours_data'
    +./legacy/it/hours/report.php: 'view_all_hours'
    +./legacy/it/hours/importWeekly.php: 'upload_hours_data'
    +./legacy/it/hours/editEmployee.php: 'edit_employees'
    +./legacy/it/hours/empWeekly.php: 'view_all_hours'
    +./legacy/it/hours/index.php: 'view_all_hours'
    +./legacy/it/hours/weeklyReport.php: 'view_all_hours'
    +./legacy/it/likecode_manager/edit.php: 'manage_likecodes'
    +./legacy/it/likecode_manager/delete.php: 'manage_likecodes'
    +./legacy/it/likecode_manager/index.php: 'manage_likecodes'
    +./legacy/it/mas90/journal.php: 'mas90_journal'
    +./legacy/it/ApplicationTracking/list.php: 'apptracking'
    +./legacy/it/ApplicationTracking/list.php: 'apptracking'
    +./legacy/it/ApplicationTracking/comment.php: 'apptracking'
    +./legacy/it/ApplicationTracking/set_interview.php: 'apptracking'
    +./legacy/it/ApplicationTracking/view.php: 'apptracking'
    +./legacy/it/newbatch/index.php: 'batches'
    +./legacy/it/newbatch/index.php: 'batches_audited'
    +./legacy/it/delimenu/index.php: 'delimenu'
    +./legacy/it/projects/project.php: 'admin'
    +./legacy/it/projects/project.php: 'projects'
    +./legacy/it/projects/addnote.php: 'projects'
    +./legacy/it/projects/index.php: 'projects'
    +./legacy/it/adjust/index.php: 'backvoids'
    +./logs/index.php: 'admin'
    +./reports/cash_report/index.php: 'cashierPerformance'
    + + diff --git a/documentation/Fannie/end-user/batches.html b/documentation/Fannie/end-user/batches.html new file mode 100644 index 000000000..f8370bbbd --- /dev/null +++ b/documentation/Fannie/end-user/batches.html @@ -0,0 +1,104 @@ + + + Sales Batches + + +
    + updated as of: August 20, 2012
    + last author: Andy Theuninck +
    +Sale pricing is managed through batches. A batch is a +group of items and sale prices that will have sale pricing +for a pre-defined time period and conditions. +

    +What sort of conditions? Out of the box, IS4C supports +two types of sale price: sale prices that are applicable +to all customers and sale prices that apply only to +members. The third type of batch, Price Change, isn't +really a sale but sort of fits the batch model. It will +be discussed later. +

    +

    Batch Types

    +Before you can make sales batches, you need to define +a batch type or two. Batch types define the exist to +define conditions - that is, how the sale price is applied +- and for organizational purposes. You can have multiple +batch types with the same style of pricing - e.g., +Co+op Deals as well as Public Sales - to match batches +with store signage or other internal logistics. To add, +remove, or adjust batch types click Sales Batches +on Fannie's left hand menu, then Manage Batch types. +Note edits are saved automatically. +

    Creating a Sales Batch

    +With batch types in place, you can create a sales batch. +Go to Sales Batches in Fannie's left hand menu, +then select the menu option Sales Batches. At the +top of this page are fields to create a new batch. The +remainder of the page lists existing batches. You can view +all batches, pending batches (haven't happened yet), current +batches (on sale now), or historical batches (done & over). +

    +Batches can be tagged and filtered by owner. This feature is +dependent on super departments. It's also optional, so feel +free to ignore it. +

    +To create a new batch, select a type at the top and plug +in a name for the batch, a start date, and an end date, then +click the Add button. This simply adds a new batch to the list +below. +

    +To add item to your batch, click on the batch's name. To +make any alterations to the batch type, name, or dates, click +the edit/pencil icon. To delete a batch, click the red X icon. +

    +Clicking a batch's name goes to the item level view. From here, +you can add, remove, or re-price items in a batch. First, enter +a UPC and click add (or press enter). If the item is found, its +description and regular price are displayed with a field +for sale price. Plug in a sale price and hit enter again. Tip: +if you miskeyed the UPC, just leave sale price blank and hit enter +to start over. +

    +The list of items in the batch is editable in a similar manner to +the list of batches. Click the red X to remove an item from the +batch or the pencil icon to edit the sale price. When editing, +sale prices are expressed as two numbers, e.g. 1 for $1.99. You can +use this to set up quantity-specific sales like 3-for-$1; this option +is omited from the default "add item" interface simply because +it's not used very often. +

    +The last option of note in the item view is Force Batch. Typically +sale pricing is applied on the start date during normal nightly +database tasks. If you need an item on sale immediately - for +instance, if a new item was just added to a live sale - this option +will re-price all items in the batch. +

    Price Change Batches

    +Price change batches are similar to sales batches - they consist +of a group of items and alternate prices, but rather than applying +a sale price to items, these batches alter the items' regular price. +Add and print shelftag options are used mainly with price change +batches. The general idea is to get new signage ready for a group +of items, then push new prices with the Force Batch option. +

    Intentionally Left Out (for now)

    +A couple links and options aren't covered above. What/why: +
      +
    1. Likecodes are groups of items with different UPCs that + POS considers identical (think produce). The concept + itself isn't well documented yet, but in the batch + context they're just an alternative to entering + items by upc.
    2. +
    3. Add limit puts a cap on sale prices per transaction + i.e., one per customer. This was used for some one-time WFC + promotions and I'm not 100% sure it still works. Probably does, + but test it first.
    4. +
    5. The Cut option next to items removes an item from a batch + and stores it on a background "clipboard". If there + are items on your clipboard, you can paste them into + another batch. Each user gets their own clipboard, but + authentication needs to be turned on for that to + work.
    6. +
    +

    See also:

    +Specialty Batch Tools + + diff --git a/documentation/Fannie/end-user/data-loading.html b/documentation/Fannie/end-user/data-loading.html new file mode 100644 index 000000000..fbefcabdf --- /dev/null +++ b/documentation/Fannie/end-user/data-loading.html @@ -0,0 +1,95 @@ + + + Data Loading + + +
    + updated as of: August 20, 2012
    + last author: Andy Theuninck +
    +The install process creates a skeleton database. This guide will +take you through the minimaly required data population. In the process, +you'll walk through a few basic tools. +

    Members

    +IS4C and Fannie are designed around co-ops, so the idea of membership +is integral. Every transaction must be associated with a member. To start, +we're going to create a new membership type and at least one member. +
      +
    1. Choose Admin => Member Management from fannie's left-hand menu, then +Manage Member Types +
        +
      1. Click create a new member type. Assign a different ID number if you'd + like, then click Create New Type
      2. +
      3. Optionally, you can now edit the type your just created. +
          +
        • Description is used primarily for reporting purposes
        • +
        • The member check box denotes whether this type of member + should receive member-related benefits. If you sell to non-members, + it's useful to have a default account number to associate with + those sales (again, every transaction must be associated with + a "member"). +
        • Discount is a percentage discount applied to an entire transaction. + Use integer numbers - i.e., 10% = 10, not 0.10.
        • +
        • Staff denotes an employee. Mostly for reporting currently.
        • +
        • SSI is historically for senior citizens. I don't think it does anything + any more
        • +
        +
      4. +
      +
    2. +
    3. Return to Admin => Member Management and this time choose Create New Members. +
        +
      • Specify what type of member you'd like to create as well as how many and + click Create Members
      • +
      • Members are created in order. If you're starting from scratch and ask for + 10 new accounts, they'll be numbered one through ten.
      • +
      • For minimal testing purposes, you'll need at least one membership.
      • +
      • Migrating existing memberships into fannie with account numbers intact + is possible, but beyond the scope of this document.
      • +
      +
    4. +
    +

    Employees

    +The other people involved in a transaction are cashiers. You need at least one +cashier to login and run a live transaction (a testing cashier, 9999, is built in +if you're only doing test transactions). +
      +
    1. Select Admin => Cashier Management from fannie's left hand menu, then +Add a new cashier.
    2. +
    3. Specify a first and/or last name (note: this shows up on screen at the checkouts, +so using full names is a bad idea from a staff privacy standpoint).
    4. +
    5. Select privileges. The only current difference is a Manager can +override anyone's login (including another manager's). If someone leaves a screen +locked, forgets to sign out, or otherwise puts a lane in a weird, unworkable state, +manager-level accounts will still work.
    6. +
    7. If you want to change the automatically-generated password, return to +Admin => Cashier Management and choose the other option, View/edit cashiers.
    8. +
    +

    Tenders

    +Tenders are the various forms of payments your store accepts. The simplest option +is to load up the defaults provided. You can remove ones you don't want later. +
      +
    1. Go to the fannie configuration page (http://your-server/fannie/install/) and +click the Sample Data link at the top.
    2. +
    3. Click the Load default tenders
    4. button. +
    +To make adjustments to your tenders, select Admin => Tenders from fannie's +left hand menu. Options are as follows: +
      +
    • Code is the key sequence used to enter a tender at the front end. It's +recommended you don't edit these. Doing so may cause incompatibilities with +the mainstream front end code.
    • +
    • Name and Change Msg are what will show up on screen as well +as on receipts when a tender is used.
    • +
    • Min and Max are soft limits for a tender type. If an entry is +outside this range, the cashier is promted to confirm the amount was not a miskey.
    • +
    • Type and Refund Limit don't really do anything.
    • +
    +Options to add and remove tenders are at the bottom of the page. +

    Tax Rates

    +This doesn't have a menu entry yet, but the tools if found at +http://your-server/fannie/admin/TaxRates/. A "NoTax" rate is included +automatically. Add rates as decimal numbers, not percentages - e.g., +5% sales tax is 0.05. + + diff --git a/documentation/Fannie/end-user/departments.html b/documentation/Fannie/end-user/departments.html new file mode 100644 index 000000000..47738558a --- /dev/null +++ b/documentation/Fannie/end-user/departments.html @@ -0,0 +1,103 @@ + + + Departments + + +
    +

    Departments

    +Revised: 2Sep2012 +
    +

    +

    +
    +>>>>>>> upstream/master +IS4C/Fannie organizes items into departments. You'll need at least one, but +putting all items in a single department isn't ideal. Separating items into +departments allows better reporting options as well as data normalization +(e.g., quickly see if all items in a grouping are taxed correctly). +

    +How you organize your items likely depends on what you sell, how your +staff is structured, and what reporting options you want. The purpose of +this document is to explain the department options that are available +so you can design a scheme that fits your organization. +

    +IS4C/Fannie provides three levels of granularity. Super Departments +contain Departments which in turn contain Sub Departments. +We're going to examine the middle tier first. +

    Departments

    +Historically, departments were the first product category provided. As a +result, they're key to both the front and back end. Basically every tool +in IS4C/Fannie understands departments; the same is not necessarily true +of other layers that were added later to meet various stores' needs. +Departments are the only categorization that's mandatory. +

    +For the most part, departments are the only categorization the +front end understands. Transaction data is tagged by department. +Open rings are assigned to a department. If you need to distinguish +between two types of product in any and all circumstances, put them +in separate departments. +

    +Departments are created and edited by going to Item Maintenance => +Manage Departments in fannie's left hand menu, then Manage departments. +Options for a department include: +

      +
    • Name that shows up in reporting and open rings
    • +
    • Tax status. Besides affecting open rings, department-level tax +status can provide sane defaults for new products. For example, placing +water and soda in separate departments might be better than a single +beverages department if your state taxes those products differently.
    • +
    • Foodstamp like tax, except whether an item can be purchased +with foodstamps.
    • +
    • Discount like tax, except whether an item is included in +transaction-level discounts (equity or gift card purchases are good examples +of departments that should not receive any discounts).
    • +
    • Min and Max are soft limits for open rings. Amounts outside +the range will prompt the cashier to confirm.
    • +
    • Margin (table departmentMargin) is used to calculate pricing (if item cost is available)
    • +
    • Sales Code (table departmentSalesCodes) is yet another way of grouping departments. Plug whatever +you want here to roll out custom reporting.
    • +
    +

    Super Departments

    +Super Departments provide a categorization tier above departments. +Whether you need super departments and how to arrange them depends a lot on +your staff structure. They're used primarily in back end tools to help an employee +narrow in on the group of departments they normally deal with. +They are techncially optional; +however, WFC uses them extensively and some tools may still mistakenly assume that super departments +are in use. Creating a single super department containing all your departments should alleviate +these kind of problems if you need a particular tool to work ASAP. +For example, you might want to group a number of departments as "Grocery" or "Produce". +

    +Super Departments are created/managed by selecting Item Maintaince => Manage Departments, +then Manage Super Departments. Select "Create" from the drop down to make a new one, +otherwise choose the one you want to edit and add/remove departments using the arrow +buttons. +

    Sub Departments

    +Sub Departments provide a categorization tier below departments. They are also optional. +For example, you could have white/wheat/rye sub departments under a general "Bread" department. +Whether you wnat or need these is again dependent on your organization. +

    +Sub Departments are created/managed by selecting Item Maintaince => Manage Departments, +then Manage Sub Departments. Choose a department from the drop down, then +add/remove sub departments as needed. + +

    +
    +Change Log:
    + 2Sep12 Eric Lee Add notes about tables that extend departments.
    +                  Add H1 title, revision date, change log.
    +20Aug12 Andy Theuninck
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/documentation/Fannie/end-user/index.html b/documentation/Fannie/end-user/index.html new file mode 100644 index 000000000..65187d961 --- /dev/null +++ b/documentation/Fannie/end-user/index.html @@ -0,0 +1,13 @@ + + +
      +
    • Installation
    • +
    • Basic Database Preparation
    • +
    • Create a Department Scheme
    • +
    • Membership
    • +
    • Products & Pricing
    • +
    • Sales Batches
    • +
    • Vendors
    • +
    • Authorization classes
    • + + diff --git a/documentation/Fannie/end-user/members.html b/documentation/Fannie/end-user/members.html new file mode 100644 index 000000000..f14d43200 --- /dev/null +++ b/documentation/Fannie/end-user/members.html @@ -0,0 +1,145 @@ + + + Members + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +This document will guide you through some basic member related tasks. +If you're starting from scratch, these should go roughly in order. +

      Membership Types

      +Every transaction is associated with an account. Membership types +let you group accounts for reporting purposes as well as confer +different benefits to different accounts. +

      +Member Types are edited by choosing Admin => Member Management +from Fannie's left hand menu, then Manage Member Types. +Each membership type is given a description for reporting purposes. +The member column denotes whether the account type is actually +a member. Non-member account types are an option to provide sales +to the general public. Accounts may also be assigned a percentage +discount or marked as store staff. +

      +Set up as many types as you need. Stores that only sell to members +will require at least one member type. Stores that sell to the +general public will need at least one type marked member and +on non-member type. +

      Membership-related Settings

      +Fannie's configuration page (if you've been following this guide, probably +http://localhost/fannie/install/) has a few membership options. Click the +Members link at the top of the configuration page. +

      +The first is Names per membership, near the top of the page. If more +than one person's name can be associated with a membership, increase this +option accordingly. +

      +The next option is Equity Department(s), near the bottom of the page. +If you want to track member equity via POS, you must define dedicated equity +departments. At minimum there must be one, but you may define multiple +equity department if needed (e.g., to track voting & non-voting shares +separately). Separate multiple departments however you like - spaces, commas, +whatever. +

      +Store Charge Department(s) are used to provide limited credit accounts +to members. WFC strongly advises against using this feature widely. The +administrative overhead required for the small subset of customers that +actually use it is nightmarish. As an accounts receivable system for +businesses, it's an OK solution. +

      +The last option is Enabled Modules. Membership can mean slightly (or very) +different things to different people, so the idea here is to manage member +information in small, independent pieces to maximize flexibility. For example, +a store might use the default modules for member contact information and member +type management, but use a customized module for equity. Or a store might +disable irrelevant modules all together. +

      +Enabling & disabling modules primarily impacts what the member +view/edit interface looks like. The Adjust Module Display Order link +gives a little additional control of that interface layout. Disabling a module +also doesn't remove any existing information or disable all related options. +For instance, you could choose not to display equity information on the +member editing interface but equity reports would still work. +

      +Existing modules: +

        +
      • AR is for store charge accounts (heed warning above!). + It displays current balance and the account's limit. The + transfer/convert links are for fixing cashier mistakes related + to A/R.
      • +
      • ContactInfo stores primary member name, mailing address, + email address, and two phone numbers. The Gets Mail checkbox + is currently used to avoid sending newsletters, coupons, and + other optional stuff to members who don't want it while + keeping their info in the system for mandatory stuff like + patronage rebates.
      • +
      • Equity lists current balance with a links to the member's + equity history, a tool for transfering equity from one + member to another, and a tool for converting equity from + one form to another (only applicable if there are multiple + equity departments).
      • +
      • Household Members manages additional names associated + with the membership.
      • +
      • MemDates provides start date and end date fields for the + membership.
      • +
      • MemType adjusts membership type. It also displays the + percentage discount associated with that type.
      • +
      • Notes is a generic comment box for any miscellaneous + information. Older comments are kept for reference via + the History link.
      • +
      • Suspension is for removing member benefits from an + account, either temporarily or permanently. The process + automatically saves & restores a couple settings + besides membership type to streamline the process and + reduce mistakes. The Fannie implementation isn't quite + done yet.
      • +
      +Minimally, most stores will need ContactInfo or something replacing it +to get member names into the system as well as MemType if there is more +than one type of account. +

      Importing Existing Memberships

      +Many stores already have members and re-entering them all by hand +is less than ideal. If you can export your data into some form of spreadsheet +and save it as a CSV, mass importing is a quicker option. Select +Admin => Member Management from Fannie's left hand menu, then +Import Data. +

      +First, bring in Names & Numbers. Your spreadsheet should contain +columns for member number, first name, and last name. If you've defined +membership types, you may also include a type column as well. It doesn't +matter what order the columns are in or if there are extra columns; you +can specify where the relevant data is during the import. If Fannie can't +upload data sheets, there will be a giant warning telling you which +directory needs write permissions. +

      +Next, bring in Contact Information. Your spreadsheet must have +a column for member number, and may include any combination of the +following: street address, second line of street address, city, +state, zip code, phone number, alternate phone number, and email address. +Same flexibility applies with regard to column order and extra +columns. +

      +

      Brief Detour: Equity Tracking

      +If you plan to track equity through POS, there's an implementation detail to be +aware of. Equity is stored as a list of equity-related transactions. At any given +time, a member's equity balance is the sum of all their equity purchases. Storing +equity this way provides a history that can be verified against transaction logs +in the event of a dispute as well as greater flexibility in coping with varying +equity requirements. +

      +If you're opening a new store, you can just define a equity department (or more +than one) and be done. If you already have members though, you need to bring +their existing equity balances in as a starting point for POS. +

      +

      Back to Importing Data

      +The last import option is existing equity. At minimum, your spreadsheet +should provide a member number and an equity amount. Optionally, you can +include a transaction identifier referencing your previous system, a IS4C +department number to distinguish a specific type of equity, or a date +(YYYY-MM-DD) of purchase. You don't have to bring in existing balances as +a lump sum; if it's useful for reporting purposes or enforcing member-equity +requirements, you can specify multiple rows per member (collectively these should +add up to the current balance). + + diff --git a/documentation/Fannie/end-user/pricing.html b/documentation/Fannie/end-user/pricing.html new file mode 100644 index 000000000..2bfb91c3a --- /dev/null +++ b/documentation/Fannie/end-user/pricing.html @@ -0,0 +1,166 @@ + + + Products & Pricing + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      + +This is the master list of product and price related +management. We're going to reference the price change +page a whole lot, so to get there: +Click Item Maintenance in Fannie's left hand menu. + + +

      How do I add an item to POS?

      +Go to the price change page. Enter your item's UPC. Leading +zeroes are not necessary. At minimum, enter a +description and price, then select a Dept +(department). All other fields are optional. Click +Create Item. Tax and +foodstamp status is assigned automatically based on department. +
      + +

      That's tedious. How do I import a bunch of items?

      +There's a preliminary tool for this. Go to http://your-server/fannie/item/import/. +Upload a CSV file containing UPCs, descriptions, and prices for +your products. Optionally, department numbers can be included. Including +departments is highly recommended. Editing departments one product at a +time will be tedious and that's what we're trying to avoid here. +
      + +

      How do I add two items with the same UPC?

      +This is not allowed. +
      + +

      How do I change an item's price?

      +Go to the price change page. Enter your item's UPC. Alter +the Price field. Click Update Item. +
      + +

      How do I find an item without the UPC?

      +Go to the price change page. Enter part of the item's +description. This will list all item's with a matching +description. Click on the one that you want. If only one +item has that description, it'll skip straight to editing +that item. +
      + +

      Why isn't my item the same price at all lanes?

      +There are a few possibilities. First, go to the price +change page and look up the item. Now scroll down to +the Lane Status section. +
        +
      • If some or all of your lanes aren't listed here, +they need to be added to Fannie's configuration. Do so, +or contact the IT staff in charge of doing so, then revisit +this guide.
      • +
      • If can't connect messages show up for some +or all of the lanes, there's a configuration error or +network problem. Contact the staff in charge of fixing that, +then revisit this guide.
      • +
      • If all lanes show prices for the item, just not +the correct prices, just click Update Item. This will +update all lane prices. If one of the two issues above +was not the problem, perhaps notify IT so they can +determine where prices got out of sync.
      • +
      +
      + +

      Why does the item I entered say "not found" at the lanes

      +First look up the item on the price change page and scroll +down to the lane section. If any lanes are missing or show +incorrect information, see the above question why isn't +my item the same price at all lanes to resolve problems, +then click Update Item to re-send it to the lanes. +

      +If lane status appears correct, the next mostly likely issue +is check digits (or lack thereof). Write down the exact +UPC shown on the lane's item not found error. The item +must be entered with this exact UPC. If your scanner includes +check digits, include check digits in Fannie. If your scanner +omits check digits, omit them in Fannie. EAN-style barcodes +cause the most problems here as the check digit is harder +to identify. +


      + +

      Why does an item ring up with "w/ volume adjust" messages?

      +A volume price scheme may have been added accidentially. +Look up the item on the price change page. Click the Price +drop down and choose Volume Price. Delete any entries here +and uncheck the checkbox, then click Update Item. +
      + +

      How do I put an item on sale?

      +Create a sales batch and add the item, or simply add it to an +existing batch. If it needs to go on sale immediately, use the +Force Batch option. See Sales Batches +for more details. +
      + +

      How do I take an item off sale?

      +First look up the item on the price change page. Examine the green +Sale Price row to find out which batch the item is in. Then +go to that batch and delete the item. You may need to return to the +price change page and re-submit the item to make the change +immediate. +
      + +

      Why does an item show a message about not being for sale?

      +It's likely not marked InUse. It's a soft error that cashiers +can bypass, but to remove the warning look up the item on the +price change page, check InUse under Extra Info, then +click Update Item. +
      + +

      Why is the lane saying "place item on scale"?

      +The item is marked as sold by weight. Look up the item on the price change +page, then uncheck the Scale box and Update Item. +
      + +

      Why isn't the lane weighing an item?

      +The item is not marked as sold by weight. Look up the item on the price change +page, then check the Scale box and Update Item. +
      + +

      How do I enter variable-weight, pre-stickered items such as from a Hobart deli scale?

      +First, set your scale to use UPC prefix "2" and include the price in the UPC +rather than the weight. This is generally the default anyway. Now, examing a sticker +UPC, the first digit should be 2. The next five digits are the item number, +and the five digits after that are the price. Last is the check digit (note: +if you're not omitting check digits, this feature probably doesn't work). Go +to the price change page. Enter the first six digits of the the sticker UPC +followed by five zeroes. For example, an item with sticker UPC +21234500199 (plus check digit) should be entered as 21234500000. Entering a price +is largely optional, but otherwise the settings work like any other item. +
      + +

      How do I put a variable-weight, pre-stickered item on sale?

      +If the item is stickered by count rather than by weight, just enter it into +a sales batch normally, with the UPC adjusted as listed in the above question. +

      +If the item is stickered by weight, you need to make a couple adjustments. +Look up the item on the price change page. Make sure the price field is set to +the item's regular, non-sale price. This is used at check-out time to calculate +how much the item weighs which affects sale price. Also make sure the Scale +box is checked. With these two settings correct, click Update Item, then +go add the appropriate UPC and sale price-per-weight in a sales batch. +


      + +

      How do I ensure an item is not discounted?

      +If you use transaction-level discounts, like 5% off an entire transaction, some items +may need to be included such as loss-leaders, gift cards, or equity. To exclude an +item from this type of discount, look it up on the price change page and +check the NoDisc box. Then Update Item. +
      + +

      How do I require the cashier to enter a quantity for an item?

      +This feature is typically used with product PLUs that aren't weighed. Look up the +item on the price change page, then check the QtyFrc box. Click +Update Item. +
      + +

      How do I pull price updates from a spreadsheet my vendor sent?

      +That needs a longer answer. diff --git a/documentation/Fannie/end-user/speciality-batches.html b/documentation/Fannie/end-user/speciality-batches.html new file mode 100644 index 000000000..f80db50fc --- /dev/null +++ b/documentation/Fannie/end-user/speciality-batches.html @@ -0,0 +1,38 @@ + + + Speciality Batch Tools + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +This is more of a state of tools report than proper end-user +documentation at this point. +

      Co+op Deals

      +This ought to work most places. The first option, +Upload Price File, just takes a co-op deals flyer saved as +a CSV. You may need to delete some of the column titles in the +first row. Multi-line values produce malformed CSVs with some +spreadsheet tools. +

      +After uploading the CSV, you'll see a preview of the first few +rows. On this screen, select which column contains an appropriate +value. UPC and Sale Price are most important. +

      +The other option, Review & create lists Co+op Deals +items that exist in POS and has fields for start/end dates to +generate batches containing all the appropriate items. The main +snag is this depends on super departments. Creating a single +super department that encompasses all departments would be +sufficient to make this work (producing one big Deals batch). +

      Vendor Pricing

      +This one takes a vendor pricing CSV and updates item costs. +Vendor spreadsheets don't conform to any sort of standard, so +there's typically a separate PHP script for each vendor (in some +cases, there may be more than one if different stores want to +import a particular catalog differently). You can choose which +script to use for a given vendor from the vendor create/edit +tool. + + diff --git a/documentation/Fannie/end-user/vendorImports.html b/documentation/Fannie/end-user/vendorImports.html new file mode 100644 index 000000000..06e913a49 --- /dev/null +++ b/documentation/Fannie/end-user/vendorImports.html @@ -0,0 +1,134 @@ + + + Import Vendor Pricing + + +
      +

      Import Vendor Pricing

      +Revised: 2Sep2012 +
      + +

      This document discusses how to import spreadsheets of +vendor pricing info. This information is used to +calculate pricing based on desired margins. +

      + +

      Step 1: Create Vendor(s)

      +To import vendor information, you need vendors. +Select Item Maintenance => Manage Vendors +from Fannie's left hand menu. In the drop down, choose New vendor... +and give the vendor a name. +

      +You can optionally enter a vendor's department scheme +(e.g., UNFI's categories). This is to support vendor-specific +margins. See Calculating SRPs below. +

      +You can upload vendor CSVs here using the Update catalog +link. This works OK for small vendors, but not so well for +really large catalogs. Dedicated loading scripts work better +in these cases. Fannie +currently includes scripts for the following vendors: +

        +
      • Eclectic Institute - loadECLECTICprices.php
      • +
      • Herb Pharm - loadHPprices.php
      • +
      • Natural Factors - loadNFACTORprices.php
      • +
      • Nature's Plus - loadNPATHprices.php
      • +
      • Oregon's Wild Harvest - loadOWHprices.php
      • +
      • Select - loadSELECTprices.php
      • +
      • Simpler's - loadSIMPprices.php
      • +
      • Suki - loadSUKIprices.php
      • +
      • UNFI - loadUNFIprices.php
      • +
      • Vitamer - loadVITAMERprices.php
      • +
      +You do have to type or copy/paste the name of the appropriate +script manually. Sorry. +These scripts are all designed around the spreadsheets WFC +has received. I don't know if all these vendors use a consistent +format. The bigger ones like UNFI probably do, but that's not a +guarantee. + +

      Step 2: Change the spreadsheet to a CSV

      +Fannie doesn't speak Excel, at least in this case. Open the file, +and use Save As to change the format to CSV (if you get more than +one CSV option, look for one mentioning Windows to get correct +line-endings). If the file is larger than a couple MBs, you may +need to compress it to avoid upload limits. Use the utility of your +choose to zip it. + +

      Step 3: Upload the file

      +Select Sales Batches => Vendor Pricing from Fannie's left +hand menu. On the next page choose Upload Price Sheet. Choose +the correct vendor from the drop down menu, then upload your CSV +(or zipped CSV). +

      +This upload can take a long time. Like 10-15 minutes. Part of this +is weird voodoo to avoid memory/CPU limits on old hardware, and part of +it is dealing with partial pricing files. Many vendors only include +changed items in the file; updating items one at a time rather than +dumping all info and rebuilding essentially doubles execution time. + +

      Step 4: Calculate SRPs

      +Return to the Vendor Pricing menu via Fannie's menu (Sales Batches +=> Vendor Pricing) and choose Recalculate SRPs. Select the +vendor, then click recalculate. +

      +Fannie checks two places for desired margin. Top priority is vendor +department settings. You can load vendor's department numbering +scheme (e.g., UNFI's categories) and assign these margin percentages. +This is currently a manual process to nag your DBA about. If vendor +departments aren't used for this vendor, Fannie uses the POS department +margin setting. See departments for +instructions on defining department margins [2Sep2012 it does not in +fact have instructions about that]. +

      + +

      Step 5: Create a Price Change Batch

      +Return to the Vendor Pricing menu via Fannie's menu (Sales Batches +=> Vendor Pricing) and choose Create Price Change Batch. +Select the vendor and optionally super department. All is fine +if you aren't using super departments. The default value, No, for +Show All Items excludes everything where the current POS price +matches the calculated SRP. Click Continue. +

      +A price change batch is created immediately. Its name is listed at the +top of the page. If you return to this tool on the same day, it will +just resume editing that same batch. +

      +Green rows show items where current margin exceeds desired margin. +Red rows show items where current margin is below desired margin. +White rows show items marked in the Var column. This is for +marking items that purposely ignore normal margin. +

      +Clicking Add will put that item into the price change batch +with the listed SRP. You can also adjust the calculated SRPs by +click on them. Click Del to remove an item from the price +change batch if it was added by mistake. + +

      Step 6: Apply new prices

      +Go to the batch tool (Sales Batches in Fannie's left hand menu) +and either manually force your price change batch or give it +a start date for a later, automated application. + +
      +
      +Change Log:
      +
      + 2Sep12 EL Fix link to departments page and add note about it.
      +           Add H1 title, revision date, change log.
      +20Aug12 Andy Theuninck
      +19Aug12 Eric Lee Change h1 to h2 and add whitespace for source readability
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + diff --git a/documentation/Fannie/index.html b/documentation/Fannie/index.html new file mode 100644 index 000000000..c21174286 --- /dev/null +++ b/documentation/Fannie/index.html @@ -0,0 +1,25 @@ + + + CORE-POS/IS4C Fannie/Backend Documentation ToC + + +
      +

      CORE-POS/IS4C Fannie/Backend Documentation ToC

      +Rudimentary ToC to /IS4C/documentation/IS4C +
      as of: August 11, 2012 +
      + +

      Documentation Top > Fannie/Backend +
      There is more detail at the top level. +

      + +

      All links open in new tabs

      + + + + diff --git a/documentation/IS4C/developer/api/adminlogin.html b/documentation/IS4C/developer/api/adminlogin.html new file mode 100644 index 000000000..29e03cb9e --- /dev/null +++ b/documentation/IS4C/developer/api/adminlogin.html @@ -0,0 +1,82 @@ + + + Authentication Prompt + + +
      +

      Prompting for a Password

      + +
      as of: August 13, 2013 +
      +

      +Sometimes POS functionality is restricted to only +supervisor/manager cashiers. The built in adminlogin.php +gui-module lets you display a password prompt and then +continue on only if a valid password is entered. +To use this functionality, pass the name of an +appropriate class to adminlogin.php as the URL parameter +class. The class does not have to inherit from any +particular base class; it merely has to provide the methods +and properties that requestInfo.php needs (i.e., duck typing). +This structure lets you attach an information request to another +class. +

      +
      +static string adminLoginMsg
      +static int adminLoginLevel
      +static mixed adminLoginCallback(boolean $success)
      +
      +

      +The proprty adminLoginMsg is the prompt displayed on the +cashier's login screen. The property adminLoginLevel corresponds +to the value of frontendsecurity in the employees table that is +required to get past the prompt. +

      +

      +The method adminLoginCallback is called after the prompt +is done. If the cashier did not provide a valid password, $success +will be False. In this case the method's return value does not matter. +Control will always return to the main POS page after the callback +method completes. If the cashier provided a valid password, $success +will be True. In this case return a URL indicating which page POS should +go to next. Returning boolean True is a synonym for the URL for +the main POS page. +

      +

      +Example: Allow member sales even if they normally +would not apply to the current member. +

      +class ForceMemPricing extends Parser {
      +	function check($str){
      +		if ($str == 'MPO') return True;
      +		else return False;
      +	}
      +
      +	function parse($str){
      +		$ret = $this->default_json();
      +		// redirect to the prompt page
      +		$ret['main_frame'] = MiscLib::base_url().'gui-modules/adminlogin.php?class=ForceMemPricing';
      +		return $ret;
      +	}
      +
      +	public static $adminLoginMsg = 'grant member pricing';
      +
      +	public static $adminLoginLevel = 30;
      +
      +	public static function adminLoginCallback($success){
      +		global $CORE_LOCAL;
      +		if ($success){
      +			$CORE_LOCAL->set('isMember', 1);
      +			PrehLib::ttl();
      +			return True;
      +		}
      +		else
      +			return False;
      +	}
      +}
      +
      +

      + + diff --git a/documentation/IS4C/developer/api/autoloader.html b/documentation/IS4C/developer/api/autoloader.html new file mode 100644 index 000000000..ab4e6cc23 --- /dev/null +++ b/documentation/IS4C/developer/api/autoloader.html @@ -0,0 +1,34 @@ + + + The AutoLoader + + +
      +

      The AutoLoader

      + +
      as of: February 14, 2013 +
      +

      +The AutoLoader is the backbone of the POS module system. +It's responsible for discovering and including all the +available modules. There are a few things to be aware of +when interacting with this system: +

      +
        +
      • The name of your module's class must match the file's name. If + you create a class named MyNewModule it needs to go in a file named + MyNewModule.php. The AutoLoader will not find the module correctly + if the class and file names do not correspond.
      • +
      • Modules are identified via inheritence. If your module's class does not + extend one of the base module AutoLoader won't find it.
      • +
      • Modules located inside plugins are only loaded if that plugin is enabled.
      • +
      • AutoLoader::ListModules($base_class) will return a list of all modules that + implement a specified base class. This list is ordered such that all + plugin-provided modules are at the front of the list before any of the modules + that are included by default. Plugins can often use this fact to override + default behavior.
      • +
      + + diff --git a/documentation/IS4C/developer/api/discountmodule.html b/documentation/IS4C/developer/api/discountmodule.html new file mode 100644 index 000000000..1f04b5ae4 --- /dev/null +++ b/documentation/IS4C/developer/api/discountmodule.html @@ -0,0 +1,50 @@ + + + DiscountModule + + +
      +

      DiscountModule

      + +
      as of: July 13, 2013 +
      +

      +DiscountModules calculate transaction-level discounts. The default +behavior is to multiply items with discountable=1 by the percentage +in custdata's Discount column. Subclasses may provide an entirely +different calculation if necessary. +

      +
      +double calculate()
      +
      +

      +The return value should be the current discount based on the +transaction's state. This value is normally positive. +

      +

      +Example: give members an extra 5% discount on +Wednesdays +

      +class WednesdayDiscount extends DiscountModule {
      +	function calculate(){
      +		global $CORE_LOCAL;
      +		// Not a Wednesday or not a member
      +		if (date('w') != 3 || $CORE_LOCAL->get('isMember') != 1)
      +			return parent::calculate();
      +
      +		// get regular member discount
      +		$custdataDiscount = $CORE_LOCAL->get('percentDiscount');
      +		// get discountable total
      +		$discountable = $CORE_LOCAL->get('discountableTotal');
      +	
      +		// increase discount by 5%
      +		$discount = $discountable * ( ($custdataDiscount + 5.0) / 100.00 );
      +		return MiscLib::truncate2($discount);
      +	}
      +}
      +
      +

      + + diff --git a/documentation/IS4C/developer/api/index.html b/documentation/IS4C/developer/api/index.html new file mode 100644 index 000000000..4c814dbd7 --- /dev/null +++ b/documentation/IS4C/developer/api/index.html @@ -0,0 +1,52 @@ + + + POS Module API + + +
      +

      POS Module API

      + +
      as of: August 13, 2013 +
      +

      +POS is designed to be altered and extended via the use of modules. +The structure is object oriented so modules are classes and they +are discovered via the parent class(es) they inherit from. This document +describes the modules that are available. +

      + + + + diff --git a/documentation/IS4C/developer/api/kicker.html b/documentation/IS4C/developer/api/kicker.html new file mode 100644 index 000000000..0e03f705b --- /dev/null +++ b/documentation/IS4C/developer/api/kicker.html @@ -0,0 +1,57 @@ + + + Kicker + + +
      +

      Kicker

      + +
      as of: February 14, 2013 +
      +

      +Kicker modules control whether or not the cash drawer +opens. The base class provides methods for three different +scenarios. Subclasses may override any combination of the +three. +

      +
      +boolean doKick()
      +boolean kickOnSignIn()
      +boolean kickOnSignOut() +
      +

      +For all three methods, a return value of True means the +drawer should open and a return value of False means it +should not. The kickOnSignIn method is checked when the +cashier first signs into POS. The doKick method is checked +at the end of each transaction. The kickOnSignOut method +is checked when the cashier signs out. +

      +

      +Example: open the drawer on another tender type in addition +the default, cash. +

      +class KickCCandCA extends Kicker {
      +	function doKick(){
      +		$db = Database::tDataConnect();
      +
      +		/* check for any records that match the conditions */
      +		$query = "SELECT trans_id FROM localtemptrans
      +			WHERE trans_subtype = 'CC' OR
      +			(trans_subtype = 'CA' AND total <> 0)";
      +		$result = $db->query($query);
      +
      +		$num_rows = $db->num_rows($result);
      +
      +		if ($num_rows > 0)
      +			return True;
      +		else
      +			return False;
      +	}
      +}
      +
      +

      + + diff --git a/documentation/IS4C/developer/api/memberlookup.html b/documentation/IS4C/developer/api/memberlookup.html new file mode 100644 index 000000000..5056ca41e --- /dev/null +++ b/documentation/IS4C/developer/api/memberlookup.html @@ -0,0 +1,85 @@ + + + MemberLookup + + +
      +

      MemberLookup

      + +
      as of: July 30, 2013 +
      +

      +Member Lookup modules take cashier input and search for +member accounts. Custom modules could provide additional search +methods beyond the default member number / last name options. +Custom modules could also provide additional processing or even +reroute POS entirely to a different page for additional input. +

      +

      Methods +

        +
      • boolean handle_numbers()
        +Indicates whether the module handles numeric input. +Defaults to true.
      • +
      • boolean handle_text()
        +Indicates whether the module handles text input. +Defaults to true.
      • +
      • array lookup_by_number(integer $num)
        +Search by numeric input. See Return Values for +details on search result format.
      • +
      • array lookup_by_text(string $text)
        +Search by text input. See Return Values for +details on search result format.
      • +
      +

      +

      +Return Values
      +Search results should return a keyed array. The class method +default_value() provides an empty, default return value. +The array should have two keys. +

        +
      • url - string URL or boolean False. Return a string value +will redirect POS to that page.
      • +
      • results - an array of matching memberships to display as +a <select> field. Array keys for results should be +custdata.CardNo::custdata.personNum. Array values are the labels that +will appear on the screen.
      • +
      +

      +

      +Example: find member by phone number +

      +class LookupByPhone extends MemberLookup {
      +
      +	public function handle_text(){
      +		return False;
      +	}
      +
      +	public function lookup_by_number($num){
      +		$db = Database::pDataConnect();
      +		$ret = $this->default_value();
      +
      +		// need table for lookup
      +		if (!$db->table_exists('meminfo'))
      +			return $ret;
      +
      +		$query = 'SELECT CardNo,personNum,
      +			LastName,FirstName,phone
      +			FROM custdata AS c LEFT JOIN
      +			meminfo AS m ON c.CardNo=m.card_no
      +			WHERE m.phone='.((int)$num);
      +		$result = $db->query($query);
      +		while($row = $db->fetch_row($result)){
      +			$key = $row['CardNo'].'::'.$row['personNum'];
      +			$label = $row['LastName'].', '.$row['FirstName']
      +				.' ('.$row['phone'].')';
      +			$ret['results'][$key] = $label;
      +		}
      +		return $ret;
      +	}
      +}
      +
      +

      + + diff --git a/documentation/IS4C/developer/api/productsearch.html b/documentation/IS4C/developer/api/productsearch.html new file mode 100644 index 000000000..ddd4c2834 --- /dev/null +++ b/documentation/IS4C/developer/api/productsearch.html @@ -0,0 +1,66 @@ + + + ProductSearch + + +
      +

      ProductSearch

      + +
      as of: February 14, 2013 +
      +

      +The ProductSearch module is used to look up products. +The base class provides a single method that modules may implement: +

      +
      +array search(string $input) +
      +

      +The parameter $input is a string entered by the cashier. The return value +is an array of records keyed by UPC. Each record should contain entries for +upc, description, normal_price, and scale. An example return value: +

      +array(
      +  "0000000004011" => array(
      +      "upc" => "0000000004011",
      +      "description" => "BANANAS",
      +      "normal_price" => "0.99",
      +      "scale" => "1",
      +  )
      +);
      +
      +

      +

      +Example: this product search only checks certain departments: +

      +class CustomDeptProductSearch extends ProductSearch {
      +
      +	function search($input){
      +		/* get a database connect */
      +		$db = Database::pDataConnect();
      +
      +		/* perform custom look up query */
      +		$query = "SELECT upc,description,normal_price,scale
      +			FROM products WHERE inUse=1 AND
      +			department BETWEEN 10 AND 25
      +			AND description like '%$input%'
      +			ORDER BY description";
      +		$results = $db->query($query);
      +	
      +		/* build a return value array */
      +		$return_value = array();
      +		while($row = $db->fetch_row($results)){
      +			$upc = $row['upc'];
      +			$return_value[$upc] = $row;
      +		}
      +
      +		/* finish up */
      +		$db->close();
      +		return $return_value;
      +	}
      +
      +}
      +
      +

      diff --git a/documentation/IS4C/developer/api/receipt/fetch.html b/documentation/IS4C/developer/api/receipt/fetch.html new file mode 100644 index 000000000..38cecdbe0 --- /dev/null +++ b/documentation/IS4C/developer/api/receipt/fetch.html @@ -0,0 +1,49 @@ + + + DefaultReceiptDataFetch + + +
      +

      DefaultReceiptDataFetch

      +Revised: 10Apr2013 +
      +

      Fetching data is the first step in building a receipt. Modules +implementing DefaultReceiptDataFetch are responsible for +retreiving transaction data from the database. Unless you provide +replacement modules for every stage, the data should be based on +localtemptrans but you can join in data from other tables so +that modules in later steps don't need to issue additional queries. +

      +Subclasses must implement one method, fetch. This method +takes three optional arguments and returns an SQL result. If the +employee number, register number, and transaction number are provided +the subclass should fetch reprint data for that transaction. If the +arguments are omitted, the subclass should fetch data for the +current transaction. +

      +

      Example: +

      +class ExampleFetchData extends DefaultReceiptDataFetch {
      +	function fetch($empNo=False,$laneNo=False,$transNo=False){
      +		$db = Database::tDataConnect();
      +		if ($empNo && $laneNo && $transNo){
      +			return $db->query("SELECT * FROM localtranstoday
      +				WHERE emp_no=$empNo AND
      +				register_no=$laneNo AND
      +				trans_no=$transNo");
      +		}
      +		else {
      +			return $db->query('SELECT * FROM localtemptrans');
      +		}
      +	}
      +}
      +
      +

      +
      +
      +Change Log:
      +
      +10Apr13 Andy Theuninck - Created document
      +
      + + diff --git a/documentation/IS4C/developer/api/receipt/filter.html b/documentation/IS4C/developer/api/receipt/filter.html new file mode 100644 index 000000000..2d7124393 --- /dev/null +++ b/documentation/IS4C/developer/api/receipt/filter.html @@ -0,0 +1,40 @@ + + + DefaultReceiptFilter + + +
      +

      DefaultReceiptFilter

      +Revised: 10Apr2013 +
      +

      Filtering data is the second step in building a receipt. Modules +implementing DefaultReceiptFilter take the SQL result from the first +step and return an array of records. The filtering step may discard +some of the records from the SQL result, create additional records, +or both. Subclasses must implement the method filter which +takes a SQL result as an argument and returns an array of records. +

      +

      Example: +

      +class ExampleFilter extends DefaultReceiptFilter {
      +	function filter($data){
      +		$db = Database::tDataConnect();
      +		$results = array();
      +		while($row = $db->fetch_row($data)){
      +			// filter out logging records
      +			if ($row['trans_type'] != 'L')
      +				$results[] = $row;
      +		}
      +		return $results;
      +	}
      +}
      +
      +

      +
      +
      +Change Log:
      +
      +10Apr13 Andy Theuninck - Created document
      +
      + + diff --git a/documentation/IS4C/developer/api/receipt/format.html b/documentation/IS4C/developer/api/receipt/format.html new file mode 100644 index 000000000..0038599d4 --- /dev/null +++ b/documentation/IS4C/developer/api/receipt/format.html @@ -0,0 +1,43 @@ + + + DefaultReceiptFormat + + +
      +

      DefaultReceiptFormat

      +Revised: 10Apr2013 +
      +

      Formatting data is the final step in building a receipt. Modules +implementing DefaultReceiptFormat take a single record of data +and return a formatted string to print on the receipt. Format modules +are not configured directly; they're loaded based on tags so classes +should always be named [tag value]ReceiptFormat (e.g., ItemReceiptFormat, +TenderReceiptFormat, etc). Subclasses must implement the method format +which takes an array of data and returns a string. Modules may also adjust +the class property is_bold. The default is false. If you switch it +to true, that line will be printed in bold. +

      +

      Example: +

      +class CustomBananasReceiptFormat extends DefaultReceiptFormat {
      +	function format($row){
      +		$line = str_pad($row['description'],30,' ',STR_PAD_RIGHT);
      +		$line .= str_pad('MONKEY CHOW',14,' ',STR_PAD_RIGHT);
      +		$price = sprintf('%.2f',$row['total']);
      +		$line .= str_pad($price,8,' ',STR_PAD_LEFT);
      +
      +		$this->is_bold = True;
      +
      +		return $line;
      +	}
      +}
      +
      +

      +
      +
      +Change Log:
      +
      +10Apr13 Andy Theuninck - Created document
      +
      + + diff --git a/documentation/IS4C/developer/api/receipt/sort.html b/documentation/IS4C/developer/api/receipt/sort.html new file mode 100644 index 000000000..d8182bda7 --- /dev/null +++ b/documentation/IS4C/developer/api/receipt/sort.html @@ -0,0 +1,32 @@ + + + DefaultReceiptSort + + +
      +

      DefaultReceiptSort

      +Revised: 10Apr2013 +
      +

      Sorting data is the third step in building a receipt. Modules +implementing DefaultReceiptSort take the array of records from +the second step, rearrange the order, and return it. Subclasses +must implement the method sort which takes an array of +records as an argument and also returns an array of records. +

      +

      Example: +

      +class ExampleSort extends DefaultReceiptSort {
      +	function filter($rowset){
      +		return array_reverse($rowset);
      +	}
      +}
      +
      +

      +
      +
      +Change Log:
      +
      +10Apr13 Andy Theuninck - Created document
      +
      + + diff --git a/documentation/IS4C/developer/api/receipt/tag.html b/documentation/IS4C/developer/api/receipt/tag.html new file mode 100644 index 000000000..0387fe3f0 --- /dev/null +++ b/documentation/IS4C/developer/api/receipt/tag.html @@ -0,0 +1,42 @@ + + + DefaultReceiptTag + + +
      +

      DefaultReceiptTag

      +Revised: 10Apr2013 +
      +

      Tagging data is the forth step in building a receipt. Modules +implementing DefaultReceiptTag take the array of records from +the third step and add a tag field to each one. The tag +setting is used to route each record to the correct formatting +module for final display. A record tagged as Item will +be rendered using ItemReceiptFormat; a record tagged +as Tender will be rendered using TenderReceiptFormat; +etc. When applying tags, make sure a corresponding ReceiptFormat +module exists. Subclasses must implement the method tag +which takes an array of records and returns an array of +records with the "tag" field added to each one. +

      +

      Example: +

      +class ExampleTag extends DefaultReceiptTag {
      +	function tag($rowset){
      +		$rowset = parent::tag($rowset);
      +		for($i=0;$i<count($rowset);$i++){
      +			if($rowset[$i]['upc'] == '0000000004011')
      +				$rowset[$i]['tag'] = 'CustomBananas';
      +		return $rowset;
      +	}
      +}
      +
      +

      +
      +
      +Change Log:
      +
      +10Apr13 Andy Theuninck - Created document
      +
      + + diff --git a/documentation/IS4C/developer/api/requestinfo.html b/documentation/IS4C/developer/api/requestinfo.html new file mode 100644 index 000000000..f8bfed150 --- /dev/null +++ b/documentation/IS4C/developer/api/requestinfo.html @@ -0,0 +1,76 @@ + + + Requesting Information + + +
      +

      Requesting Information from the User

      + +
      as of: August 13, 2013 +
      +

      +If you want to prompt the cashier to enter some text, you +can use the built-in requestInfo.php gui-module rather +than writing a separate page. This is well-suited for cases +where you simply want to show a text entry box and get the +result. To use this functionality, pass the name of an +appropriate class to requestInfo.php as the URL parameter +class. The class does not have to inherit from any +particular base class; it merely has to provide the methods +and properties that requestInfo.php needs (i.e., duck typing). +This structure lets you attach an information request to another +class. +

      +
      +static string requestInfoHeader
      +static string requestInfoMsg
      +static mixed requestInfoCallback(string $info)
      +
      +

      +The strings properties are prompts displayed for the cashier. +requestInfoHeader appears above the input box; +requestInfoMsg appears below the input box. When the cashier +enters information, that string is passed to requestInfoCallback. +If the string is not a valid entry, return boolean False to prompt +the cashier to re-enter. If the string is valid, do whatever processing +is necessary then return a URL indicating which page to go to next. +If you want to return to the main POS screen, returning boolean True +will be interpretted as that URL. +

      +

      +Example: Add member's phone number to the transaction +

      +class GetMemPhone extends Parser {
      +	function check($str){
      +		if ($str == 'GETPH') return True;
      +		else return False;
      +	}
      +
      +	function parse($str){
      +		$ret = $this->default_json();
      +		// redirect to the prompt page
      +		$ret['main_frame'] = MiscLib::base_url().'gui-modules/requestInfo.php?class=GetMemPhone';
      +		return $ret;
      +	}
      +
      +	public static $requestInfoHeader = 'member phone #';
      +
      +	public static $requestInfoMsg = 'type phone number XXX-XXX-XXXX';
      +
      +	public static function requestInfoCallback($info){
      +		// if the entry is valid, add a comment to
      +		// the transaction
      +		if (preg_match('/^\d\d\d-\d\d\d-\d\d\d\d$/',trim($info)) == 1){
      +			TransRecord::addcomment('PH: '.trim($info));
      +			return True;
      +		}
      +		else
      +			return False;
      +	}
      +}
      +
      +

      + + diff --git a/documentation/IS4C/developer/api/specialdept.html b/documentation/IS4C/developer/api/specialdept.html new file mode 100644 index 000000000..4dfc3f2c0 --- /dev/null +++ b/documentation/IS4C/developer/api/specialdept.html @@ -0,0 +1,71 @@ + + + SpecialDept + + +
      +

      SpecialDept

      + +
      as of: February 14, 2013 +
      +

      +SpecialDept modules are used to associate an arbitrary actions +with open rings to a certain department or departments. The base +class exposes one method: +

      +
      +array handle(integer $department, float $amount, array $json) +
      +

      +The $department parameter is the department number. Checking +this parameter to make sure it matches an specific value or values is +frowned upon. Doing so makes it harder for anyone else to re-use your +module and the configuration of SpecialDept module mappings can +effecitvely impose the same restrictions. +

      +

      +The $amount parameter is the amount entered. +

      +

      +The $json parameter is a Parser-module formatted array. You should +almost always return this value. Modifying it first can be useful. +Most notably setting a URL for the main_frame key will redirect +POS to another page of your choosing. You may want to use a $CORE_LOCAL +(i.e., session) setting here and at the destination page to avoid +winding up in a loop. +

      +

      +The return value is a Parser-module formatted array. Hence the advice above +about returning $json. That ensures the return format is correct. +

      +

      Example: redirect to an extra cashier prompt to confirm an Equity sale. +Note the use of $CORE_LOCAL to alternate behavior. The first time the module +is called, it redirects for confirmation but the second time - after the cashier +has provided confirmation - it returns $json unmodified. +

      +class EquityWarnDept extends SpecialDept {
      +
      +	function handle($deptID,$amount,$json){
      +		global $CORE_LOCAL;
      +
      +		if ($CORE_LOCAL->get("warned") == 1 and $CORE_LOCAL->get("warnBoxType") == "warnEquity"){
      +			$CORE_LOCAL->set("warned",0);
      +			$CORE_LOCAL->set("warnBoxType","");
      +		}
      +		else {
      +			$CORE_LOCAL->set("warned",1);
      +			$CORE_LOCAL->set("warnBoxType","warnEquity");
      +			$CORE_LOCAL->set("boxMsg","<b>Equity Sale</b><br>please confirm<br>
      +				<font size=-1>[enter] to continue, [clear] to cancel</font>");
      +			$json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php';
      +		}
      +
      +		return $json;
      +	}
      +}
      +
      +

      + + diff --git a/documentation/IS4C/developer/api/tenderreport.html b/documentation/IS4C/developer/api/tenderreport.html new file mode 100644 index 000000000..4c4d8829e --- /dev/null +++ b/documentation/IS4C/developer/api/tenderreport.html @@ -0,0 +1,42 @@ + + + TenderReport + + +
      +

      TenderReport

      +Revised: 14Feb2013 +
      +

      +Tender reporting needs and conventions can vary pretty widely. If the included +reports don't meet your needs, you can create a custom one. Just create a class +that inherits from the TenderReport base class. Inside the class, define a static +method named get. This method should return a string containing what you'd +like to print. Functions in the ReceiptLib class are useful for text formatting +and positioning. Functions in the Database class are useful for consulting +transaction data to determine what to print. The details are entirely up to you. +

      +

      +By convention, the file name should match the class name (i.e., the example would +be named ExampleTenderReport.php). If the file is in lib/ReceiptBuilding/TenderReports +or anywhere inside an enabled plugin, the custom tender report will be +listed as an option on the Extras tab of the configuration page. +

      +

      Example: +

      +class ExampleTenderReport extends TenderReport {
      +	public static function get(){
      +		return ReceiptLib::centerString('A very useless report');
      +	}
      +}
      +
      +

      +
      +
      +Change Log:
      +
      +14Feb13 Andy Theuninck - Moved into API section
      +12Feb13 Andy Theuninck - Created document
      +
      + + diff --git a/documentation/IS4C/developer/api/tenders.html b/documentation/IS4C/developer/api/tenders.html new file mode 100644 index 000000000..c85e518ce --- /dev/null +++ b/documentation/IS4C/developer/api/tenders.html @@ -0,0 +1,76 @@ + + + TenderModule + + +
      +

      TenderModule

      + +
      as of: August 13, 2013 +
      +

      +Tender modules may be attached to one or more tenders. Tender modules +can impose error conditions, set up session variables, or display +prompts for the cashier. All modules should inherit from TenderModule. +

      +

      +TenderModules have the following properties. The base class constructor +will populate these proprties. Be careful if you choose to override that +function. +

      +string tender_code (corresponds to opdata.tenders.TenderCode)
      +string name_string (corresponds to opdata.tenders.TenderName)
      +string change_type (corresponds to opdata.tenders.TenderType)
      +string change_string (corresponds to opdata.tenders.ChangeMessage)
      +number min_limit (corresponds to opdata.tenders.MinAmount)
      +number max_limit (corresponds to opdata.tenders.MaxAmount)
      +mixed amount the number entered or boolean False if no number was provided. +
      +

      +

      TenderModules have the following methods: +

        +
      • mixed ErrorCheck()
        +This checks the transaction and returns an error if there is any reason the +tender cannot be used. It returns an HTML string describing the problem or +boolean True if no error is found. Note that the base class version of +ErrorCheck() is always called. It's not necessary to duplicate those checks +in subclasses.
      • +
      • mixed PreReqCheck()
        +This sets up any necessary session variables and optionally directs the cashier +to another page. Typically redirects are to get a confirmation before continuing +with the tender. It returns a URL string to redirect or boolean True if no +redirect is necessary. Note that the base class version of PreReqCheck() +is always called. It's not necessary to duplicate any of that functionality in +subclasses.
      • +
      • [none] Add()
        +Add a tender record to the transaction. Not usually overridden.
      • +
      • string ChangeType()
        +Returns the tender code that should be used for the change record (if there is one). +The default is simply the object's change_type property. +
      • +
      • boolean AllowDefault()
        +Allow the tender to be used without specifying an amount. +The default is True.
      • +
      • number DefaultTotal()
        +The value to use for an amount if none has been specified. +The default is the session variable runningTotal.
      • +
      • string DefaultPrompt()
        +Sets up session variables then returns a URL for the prompt page. +Override to alter the prompt text, go to a different page, add +additional actions like check endorsing, etc.
      • +
      • string DisabledPrompt()
        +Returns an HTML error message when an amount is required but +none was provided. Override to alter the message.
      • +
      +

      +

      +I'm not going to sketch out an illustrative example. Something that tried +to use all the methods at once would be really contrived. I suggest looking +at GiftCardTender.php for a nice example of using ErrorCheck() +and PreReqCheck. GiftCertificateTender.php is a fairly +straightforward example of overriding DefaultPrompt(). +

      + + diff --git a/documentation/IS4C/developer/framework.html b/documentation/IS4C/developer/framework.html new file mode 100644 index 000000000..0f3448342 --- /dev/null +++ b/documentation/IS4C/developer/framework.html @@ -0,0 +1,33 @@ + + + Framework + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +

      Install-anywhere

      + IS4C should be able to function without any specific path requirements. For the most part, the AutoLoader class takes care of this. Include that file using a relative path and you should be all set. +

      Modular Parsing

      + All parsing is done by two arrays of parser objects. All parser objects have the same base class. Adding and removing them is as simple as dropping a file in the appropriate directory: parser-class-lib/parse or parser-class-lib/preparse. Note that class name and file name should match. +

      Classes for UI

      + The classes in gui-class-lib provide a uniform way to do screen output. Using one of these classes makes it easier to create a new "page" that matches the rest of IS4C visually and ensures doctype, css, and js are brought in correctly. +

      Modular Paycards

      + The various payment gateways I've worked with have a lot of similarities. Exact implementation can probably be interchangeable as far as the rest of IS4C is concerned. Since sharing the exact implementation for a gateway isn't always permitted, pushing as much as possible into a generic base class ought to streamline the implementation when people are forced to re-invent the details. +

      Hardware Flexibility

      + There should be classes to deal with printers, scales, and other peripherals so support for new hardware can be added without revising existing code. +

      Database Best Practices

      + This is the hard part. Ideally, we'd all keep the same schema. Realistically, I don't see this happening. With a little caution, I think we can at least have scripts that degrade gracefully when the underlying structure changes. Ideas: +
        +
      • Grab row values by column name instead of numeric index. As long as the column exists, you'll get the right value, regardless of actual layout
      • +
      • Use the SQLManager class where you can. I know most people are using MySQL, but I don't see any downside to keeping the system fairly open. If someone wants to run IS4C on top of Postgres, it's a much easier port down the line. There are also a couple bits of handy functionality: +
          +
        • SQLManager::smart_insert(table_name,value_array) - this method takes an array of column names & values, polls the given table to see which of those columns are available, then forms an appropriate INSERT statement. Obviously this doesn't guarantee all your information will be written, but it increases the chances of basic success. If your script is trying to create a products record, it'll probably at least get a row into that table with upc, price, department, etc.
        • +
        • SQLManager::smart_update(table_name,value_array,where_clause) - coming soon!
        • +
        +
      • +
      • Put CREATE statements in install script when you need new tables. This makes it easy for other developers (and regular users) to add the tables your script needs. Don't drop and recreate tables that already exist; deleting someone else's data is impolite.
      • +
      + + diff --git a/documentation/IS4C/developer/get-going.html b/documentation/IS4C/developer/get-going.html new file mode 100644 index 000000000..deaef479f --- /dev/null +++ b/documentation/IS4C/developer/get-going.html @@ -0,0 +1,15 @@ + + + Dive in + + + Want to just start shoe-horning the tools you need into this structure? Here are some how-tos for various operations. + + + diff --git a/documentation/IS4C/developer/howto-cc.html b/documentation/IS4C/developer/howto-cc.html new file mode 100644 index 000000000..13171643f --- /dev/null +++ b/documentation/IS4C/developer/howto-cc.html @@ -0,0 +1,109 @@ + + + Howto Write A Paycard Module + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      + This is a guide to writing a paycard class that can be used with + IS4C. This is not a guide to PCI compliance. Asking whether is a + given module is PCI compliant is probably the wrong approach. + Modules shouldn't retain any credit card numbers, but I highly + encourage you to trace through and verify that to your own satisfaction. + Even that, however, is a small facet of PCI compliance. +

      + OK, no more soapbox. Most payment gateways are actually pretty simple. + You take some data - card info, amount, transaction type, etc - format + it to the gateway's liking - as HTTP, XML, SOAP, etc - and send it + to an HTTPS URL. The gateway sends a response, again formatted somehow, + telling you what happened. Generally this response is approved, + declined, or an error message. +

      + In a lot of cases, all that really varies from one gateway to another + is the formatting of what you send and the formatting of how it + replies. That leaves a lot of potential for code re-use and + interchangeable payment modules. +

      Primer: Credit Cards

      + Some collective knowledge on cards isn't a bad idea, although doubtless I don't know everything. +

      + Your basic credit card transaction consists of two parts: an auth transaction requests + funds from the customer's bank, and a settle transaction that actually transfers + funds to your account. A settle must correspond to an existing auth. Most + gateways provide another type of transaction that combines the two - an auth that will + automatically settle - but terminology varies from one to another. +

      + The other common credit card operations are void and credit. A void + transaction cancels an existing auth - sort of. If you void an auth, + it will never settle, but it may hang on the cardholder's account as a pending + charge. How long this pending charge sticks around is up to the issuing bank; as the + merchant, it's out of your control. A credit transaction is a refund. +

      + Most gateways will accept either a card number, commonly called PAN, and expiration + date or track data. Track data is what's on the magnetic stripe. Sending track + data will generally result in significantly lower processing charges. Most cards have + two tracks, actually called Track 1 and Track 2. You may or may not + get both depending on the card and how readable the stripe is. You can generally + send either or both. The exact format required may vary from processor to processor. + Note the parsing functions in lib/paycardLib.php remove start and end sentinel + characters; if your gateway wants them, the start and end for track 1 are + (normally) "%" and "?". The start and end for track 2 are ";" and "?". +

      Primer: Gift Cards

      + These probably vary more from provider to provider. When a customer uses their gift card + as tender, IS4C calls this an auth transaction. Gift cards also usually include + transaction types to check current balance, activate a new card, and add value + to an activated card. Refunds to a gift card map nicely to add value. If there + isn't a specific void transaction, you can fake one with auths and add values + to reverse earlier transactions. +

      BasicCCModule Class

      + This class has a few methods that are required by every implementation + and a few utility functions that may be helpful. First, required methods: +
        +
      • handlesType(string_type) - paycard types are defined in lib/paycardLib.php. + A paycard module should return True for the types of transaction (credit, gift, + etc) that it handles and False for all other. When multiple modules are enabled, + this method dictates which is used for a given entry.
      • +
      • entered(bool_validate,array_json) - this method is called during parsing, so + it should return a json array like a parser module. Normally one is passed in + that you can work with. Mostly what happens here is validating the given card + can be processed and setting up session variables. If your module uses the + existing efsnet* or valutec* tables, you can probably copy + this out of an existing credit or gift module (depending what you're writing) + without much modification.
      • +
      • paycard-void(int_transID) - this method is similar to entered() but focused + on voids. Again the return is a json array. + There are a few extra checks to ensure a void-able transaction occurred, + it hasn't been voided already, etc. Again, you can likely lift this out of an + existing gift or credit module.
      • +
      • doSend(string_type) - this method should send formatted data to + the gateway and process the results. WFC's modules all follow a similar structure + for doing this, but following the pattern isn't required. The return value should be + PAYCARD_ERR_OK, a defined constant, if the transaction succeeded. If the transaction + didn't succeed, the return value can be anything else. Failed doSend()s are + directed to gui-modules/boxMsg2.php. Set any error message to display in + $IS4C_LOCAL->boxMsg.
      • +
      • cleanup(array_json) - this method is called when doSend succeeds. The return + type is a json array. Typical things to do here include printing receipts and + tendering.
      • +
      + I normally put a switch statement in doSend and have a separate send function for each sub-type of + transaction (auth, void, etc). Each send function builds an appropriate data "block" + and sends it using curlSend(). In turn, curlSend() gives the result to handlesResponse(). + From there I use another switch on type with handleResponse functions for each type. + There's no particular reason doSend needs to be implemented this way, but if you're trying to + trace along that's the general plan. +

      What's Going to Go Wrong?

      + Implementation isn't so bad, but there are potential problems (if anyone knows solutions, clue + me in and I'll happily trim this list). +
        +
      • The big, glaring one: if your internet goes down, so does card processing. I have separate, + dedicated terminals around anyway for PIN transactions and those can do dial up transactions. + That may be the simplest, albeit not cheapest, solution.
      • +
      • Curl Errors: sometimes the send/receive process fails. If it's just a random hiccup, + most gateways provide a method for querying transaction status. I don't do this; normally + when I have connection problems, I have several in a row, so I batch-void everything + that had problems on a regular basis.
      • +
      + + diff --git a/documentation/IS4C/developer/howto-gs1.html b/documentation/IS4C/developer/howto-gs1.html new file mode 100644 index 000000000..ab11964d7 --- /dev/null +++ b/documentation/IS4C/developer/howto-gs1.html @@ -0,0 +1,51 @@ + + + GS1 Databar + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +This document is a work in progress; suggested practices more likely to +change than in other documentation +

      +IS4C needs to handle GS1 Databar barcodes. This affects a couple parts of the +POS: scale drivers and data storage. I'm suggesting some +best practices to avoid unnecessary incompatibilites in implementation. +

      Scale Drivers

      +When scale drivers read a GS1 barcode, they should affix a prefix to +the barcode digits consisting of: GS1~ plus a two character code +denoting the databar's type. Current codes are R4 for regular +databars and RX for extended databars. +

      +These code values are derived from the Magellan scale's default behavior. +This implementation does not actually use the two character codes for +anything, but drivers should still provide them in case other co-ops' +parsing relies on them. +

      +This idea is based on the Wedge's suggestion and may be revised +if I misunderstood their prefixing +

      Data Storage

      +When parsing input on the PHP side, GS1 databars can be +identified by the prefix assigned above above. Some databars +may contain more than 13 digits - in fact, many more than 13 digits - +which makes storing them in existing UPC fields problematic. Different +handling for different databar Application Identifiers is likely +the best solution. +

      +The application identifier 01 denotes a GTIN-14 product identifier. +GTIN-14 is analogous to UPC or EAN but 14 digits. In this case, discard the +prefix 01 and the 14th digit of the GTIN-14 (a check digit) to get +a 13 digit product identifier. This value will map cleanly into the +UPC fields and no real information has been lost. +

      +The application identifier 8110 denotes a coupon. Coupon barcodes are +always much more than 13 digits. Each coupon does contain a 6 to 12 digit +manufacturer prefix just like traditional UPC and EAN coupons. To simplify +scanning, this prefix should be stored in the transaction table's UPC +column such that the prefix "lines up" with the UPCs for matching products. +Storing all coupon information will require additional table(s) and/or +field(s). Those have not yet been decided on. + + diff --git a/documentation/IS4C/developer/howto-gui.html b/documentation/IS4C/developer/howto-gui.html new file mode 100644 index 000000000..a2ba90abc --- /dev/null +++ b/documentation/IS4C/developer/howto-gui.html @@ -0,0 +1,43 @@ + + + Howto Write a GUI Object + + +

      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      + The classes in gui-class-lib provide a structured way to draw screen output. + All subclasses follow a nearly identical path; the variations on BasicPage + just automatically fill in some common variations. +

      How a page is generated

      +
        +
      1. The preprocess() method is called. If the return is False, nothing is + drawn. Preprocess is typically used to deal with session and/or form data, + and to redirect to other pages when applicable. Setting headers to redirect + is really the only reason I can think of to return false.
      2. +
      3. Doctype, html and head tags, the default css, and jquery are all + output automatically, then head_content() is called. If a store.css file is + present, it will also be included after the default pos.css. + Use head_content() to add more javascript or custom CSS.
      4. +
      5. A closing head tag and opening body tag are output, then body_content() + is called. Print the main contents here.
      6. +
      7. Closing tags are added and all javascript specified by calls to the + add_onload_commands() method are called. These stack; you can call + add_onload_commands() multiple times to execute multiple actions on page-load. +
      8. +
      +

      Variants

      +
        +
      • InputPage - this variant includes an input box at the top of the screen, similar to + input.php in the framed version of IS4C, and includes the totals footer. The input form's action + is PHP_SELF. If you need a different action, use BasicPage and call the input_header() method + manually. It accepts an optional "action" argument.
      • +
      • NoInputPage - this variant omits the input box but still has time and standalone + status, similar to noinput.php in the framed version of IS4C. It also includes the totals + footer.
      • +
      • PaycardProcessPage - this variant includes some extra javascript functions that + are useful for submitting paycard requests via AJAX calls.
      • +
      + + diff --git a/documentation/IS4C/developer/howto-newmagellan-2.html b/documentation/IS4C/developer/howto-newmagellan-2.html new file mode 100644 index 000000000..5466fe10b --- /dev/null +++ b/documentation/IS4C/developer/howto-newmagellan-2.html @@ -0,0 +1,306 @@ + + + + Installing NewMagellan Scanner/Scale Driver + + + +
      +

      Installing NewMagellan Scanner/Scale Driver

      +
      + +
      + updated as of: November 8, 2012
      + original author: Eric Lee +
      + + + +

      This describes setting up (installing, configuring), under Linux, +the software that +supports a Magellan scanner/scale +that IS4C is communicating with through the NewMagellan driver. +It assumes the physical installation is done and also the lane level +port and driver (NewMagellan) choices at http://laneX.foo.coop/IS4C/pos/is4c-nf/install/extra_config.php +have been made. +

      + +

      If, after that is done, everything is fine, +that is both scanned barcodes and weights are appearing in your PoS transactions, +then you need read no further. +

      + +

      +However, if this is a new installation, +you need to learn about compiling and starting the driver, +which is not started by default, +and, for a production (not test) environment, about running it in the background +and starting it at bootup. +

      + +

      +This document describes how to do those things and offers some tips about solving +problems at this level. + +

      + +
        +
      1. Open a terminal window and go to where the NewMagellan driver resides, possibly: +
        $ cd /var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/NewMagellan +
      2. + +
      3. Make sure the serial port you named can be written to by the driver and Apache/PHP. +
        $ sudo chmod 666 /dev/ttyS0 +
      4. + +
      5. See that data is getting from the scanner-scale to the serial port: +
        $ cat /dev/ttyS0 +
        Then scan a barcode. The number should appear, with a prefix e.g. S08A + if the scanner has been programmed to supply them. The whole string might then be: +
        S08A03120044618, with checkdigit already removed. +
        If nothing appears then check that the scanner-scale is connected to the correct + serial port and that your configuration names that port. +
        If you want to get a weight response at this level + you first have to send the scale a weigh-request. In another terminal window: +
        $ echo -e "S11\r" > /dev/ttyS0 +
        and then put something on the scale. + If it weighs 0.23 lb you will see something like: +
        S110023 + +
        It will be superimposed on the previous output if you are under Linux + and the scanner-scale terminates its output with a Carriage Return (\r): +
        S11002320044618 +
        Type Ctrl-C to stop display from the serial port. + Note that the driver will not have access to what the scanner-scale is sending as long + as this cat is getting it first. +
      6. + +
      7. You can do further experiments at the level of communicating directly with the + serial port using this utility: +
        $ sscom.sh +
        (that is still a work in progress). +
      8. + +
      9. Make sure the directory ss-output and everthing in it is writable by the driver: +
        $ sudo chmod -R 777 ss-output +
      10. + +
      11. Check the assignment of MAGELLAN_OUTPUT_DIR in SPH_Magellan_Scales.cs +
        $ grep MAGELLAN_OUTPUT_DIR SPH_Magellan_Scales.cs + +
        +It should be ss-output/, the same as the directory above. + +If it isn't, open SPH_Magellan_Scales.cs in a text editor and change it. Note the trailing slash. +
      12. + +
      13. Compile the driver, pos.exe: +
        +$ make clean +
        +$ make +
        + This has to be done once for any Linux installation even if pos.exe already exists + and you haven't changed any of the source (*.cs) files. +
      14. + +
      15. Check that the mono program is available: +
        $ which mono +
        # Should report something like +
        /usr/bin/mono +
        +
        If which finds nothing, then install mono: +
        + $ sudo apt-get install mono-devel +
        # or +
        $ sudo apt-get install build-essential +
        +
      16. + +
      17. Run the driver in the foreground: +
        +$ sudo mono pos.exe + +
        If it starts OK it will immediately write to the terminal: +
        Reading serial data + +
        and there may be another line of scale or scanner data such as +
        +S110000 + +
      18. + +
      19. +Now scan a barcode. It should be echoed to the window running pos.exe. E.g.: +
        +03120044618 + +
      20. + +
      21. +Then put something on the scale. Expect to see something like: +
        +S110023 + +
        +where "23" is the weight, 23/100ths of a pound in this case. +
        Remove the thing from the scale and two more lines will probably appear: +
        +S141 +
        +S1100000 +
        +
        the second indicating the scale is back to zero. +
        (These "S" codes are from an SL384 but I'm pretty sure they are the same for +other Magellan-series scanner/scales.) +
      22. + +
      23. +To stop the driver: type Ctrl-C +
      24. + +
      25. You can run the driver in the foreground and use the PoS at the same time. +The items you scan and weigh will appear +in the transaction in the usual way as well as being written to the screen. +
      26. + +
      27. Still no joy? Try searching the techhub forum for NewMagellan +
        If that doesn't help post to the forum yourself. +
      28. + +
      29. +A second attempt to run the driver in the foreground may get a message like: +
        $ sudo mono pos.exe
        +
        +Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
        +  at System.TermInfoDriver.CheckWindowDimensions () [0x00000] 
        +  at System.TermInfoDriver.get_WindowWidth () [0x00000] 
        +  at System.TermInfoDriver.IncrementX () [0x00000] 
        +  at System.TermInfoDriver.IsSpecialKey (ConsoleKeyInfo key) [0x00000] 
        +  at System.TermInfoDriver.IsSpecialKey (Char c) [0x00000] 
        +  at System.IO.CStreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] 
        +  at System.IO.CStreamWriter.Write (System.Char[] val) [0x00000] 
        +  at System.IO.CStreamWriter.Write (System.String val) [0x00000] 
        +  at System.IO.TextWriter.WriteLine (System.String value) [0x00000] 
        +  at System.IO.SynchronizedWriter.WriteLine (System.String value) [0x00000] 
        +  at System.Console.WriteLine (System.String value) [0x00000] 
        +  at SPH.SPH_Magellan_Scale.Read () [0x00000]
        +I don't know what to do about this. +Running it again gets the same message. +
        +You can try: Start the driver in the background (see below), do a couple scans, stop it; +then running it in foreground may work again. +
      30. + +
      31. Running the driver in the background. +In order to not have a terminal window open while the lane is running +you can run the driver in the background. +In Linux this is called running as a daemon. +You will also likely want the convenience of having the daemon started +automatically when the computer boots and stopped when it is shut down. + +There are two wrapper scripts for this in the NewMagellan directory: +
          +
        • posdriver-sph-debian
          for Ubuntu and other Debian-derived Linuxes +
        • posdriver-sph
          for other flavours +
        + + + +The script needs to be copied to /etc/init.d +so the startup and shutdown processes will be able to find it. +
        $ sudo cp script-name /etc/init.d + + +
        After that, tell startup/shutdown about it: +
        $ sudo update-rc.d script-name defaults + +
        A daemon installed this way is called a service. +
      32. + +
      33. The script posd.sh can be used to manage the service, + including installing, starting, stopping and installing new versions + and cleaning up after crashes or failures. +
        $ posd.sh -h +
        Usage: posd.sh stop|start|restart|status|clean|swap|remove|install +
        +
        Edit its variable POSD to refer to the service script you are using: +
        + POSD=posdriver-sph-debian +
        # or +
        POSD=posdriver-sph +
        +
        If you change the driver (pos.exe) you need to + stop and start the service. +
        + +
      34. + +
      + +

      Some notes on what the driver is doing behind the scenes:

      +
        + +
      • Open another terminal window and cd to the ss-ouput directory. +
        $ls -l will show something like: +
        -rwxrwxrwx 1 nobody   nogroup     8 2012-10-27 17:14 13930410
        +-rw-r--r-- 1 root     root        8 2012-10-27 17:34 15184740
        +-rw-r--r-- 1 root     root       12 2012-10-27 17:35 15206202
        +-rw-r--r-- 1 root     root       12 2012-10-27 17:35 15210526
        +-rw-r--r-- 1 root     root        8 2012-10-27 17:35 15216206
        +-rw-r--r-- 1 root     root        5 2012-10-27 17:35 15217402
        +Each file contains output like that echoed to the screen +when the driver is running in the foreground. +
      • + +
      • While the driver is running in the background, +scan and scale events are also logged to +a file named in the driver start script, e.g. posdriver-sph, for example: +
        +/var/run/posdriver-sph/sph.log + +
        +You can watch this as it accumulates with: +
        +$ tail -f /var/run/posdriver-sph/sph.log
        +Reading serial data
        +S110000
        +Received: rePoll
        +S110000
        +03120044618
        +Received: goodBeep
        +S110024
        +Received: goodBeep
        +S141
        +S110000
        +85794100187 
        +Ctrl-C to stop the display. +
      • +
      + + + diff --git a/documentation/IS4C/developer/howto-newmagellan.html b/documentation/IS4C/developer/howto-newmagellan.html new file mode 100644 index 000000000..65f2314f4 --- /dev/null +++ b/documentation/IS4C/developer/howto-newmagellan.html @@ -0,0 +1,58 @@ + + + New Magellan + + + +
      + updated as of: November 8, 2012 +
      last author: Eric Lee +
      original author: Andy Theuninck +
      +NewMagellan is one of the scale drivers included in this release. +It works to connect IS4C to a Magellan scanner/scale, but it also +serves as a base point for communicating with multiple external +devices. +

      +NewMagellan is written in C# .NET. All traces of winforms have been +stripped out for the sake of mono compatibility. It doesn't require +Visual Studio on Windows; the .NET 2 SDK includes a command line that's +sufficient. Both a makefile for linux and a batch file for compiling +on windows included. +

      +How it works +

      +Magellan reads ports.conf to see what drivers to use. Entries are just +a port (COM1, /dev/Stty1, etc) and a driver name (e.g., SPH_Magellan_Scale). +You can have more than one driver running - say a scanner/scale +and a signature capture device. +

      +Each driver is launched in its own thread. Other than implementing the +SerialPortHandler class, there's no hard and fast requirements what a driver +actually has to do. Reading from the relevant serial port would probably +be the most common. Writing to the file system is the easiest way I've found +to pass info to IS4C (similar to what ssd does). +

      +After starting all the drivers, Magellan launches one more thread with +a simple UDP server. All it does is listen (port 9450 by default) and +pass any received messages to each driver. This way IS4C can send +commands to devices directly without intermediary files. +

      +The current version accepts command line input of messages, too. +Re an init script to background the process see +Installing NewMagellan Scanner/Scale Driver +The windows version +compiles a second executable that can be registered as a windows service. +

      +Win32 service notes: the port/driver configuration is hard-coded into +the executable, so you have to recompile to make changes (alternately you +could hard-code the path to ports.conf, but that would mean a recompile +too). The .NET SDK includes a utility called installutil.exe. To install, +run installutil.exe posSVC.exe. To remove, run installutil.exe /u posSVC.exe. +Installation prompts for a username and password. The username has to +include the machine name (e.g., POS1\is4c_user) to work. It took me awhile +to figure that out. + + diff --git a/documentation/IS4C/developer/howto-parse.html b/documentation/IS4C/developer/howto-parse.html new file mode 100644 index 000000000..9eb94e54f --- /dev/null +++ b/documentation/IS4C/developer/howto-parse.html @@ -0,0 +1,124 @@ + + + Writing a Parser object + + +

      +

      Quick Parsing Primer

      +Revised: 22Aug2012 +
      + Parsing currently happens in ajax-callbacks/ajax-parser.php. Two arrays of parser objects + are automatically built from the files in parser-class-lib/preparse and parser-class-lib/parse. + These arrays are cached in $_SESSION, so you may need to close & relaunch your browser + to enable a new module. +
      +

      Preparse Objects

      + Preparse object inherit from parser-class-lib/Parser.php. The check() method is called for + every available preparse object. If check() returns true, parse() is called for that object. + The return value of parse() replaces the current user input. +

      + The following sets the toggletax value in session, then + removes the trigger prefix from the input string. + Includes are omitted for simplicity; see any module included + in the release for greater detail. +

      Example Preparse Object

      +
      +	class TaxShift extends Parser {
      +		function check($str){	
      +			if (substr($str,0,3) == "1TN")
      +				return True;
      +			return False;
      +		}
      +
      +		function parse($str){
      +			global $CORE_LOCAL;
      +			$CORE_LOCAL->set("toggletax",1);
      +			return substr($str,3);
      +		}
      +	}
      +	
      +

      Parse Objects

      + Parse objects also inherit from parser-class-lib/Parser.php. Here, the check() method is called for each object + in turn until one returns true. The parse() method is called for that class and input processing stops. Parse + objects are slightly more complicated because the parse() function must return an array. +

      + The return value of parse() in this case should be a keyed array. This structure converts easily to a JSON, which + in turn makes passing data to javascript more reliable and well-defined. The base class, Parser, provides a method + default_json() that generates a proper array with sane defaults. +

      + Return value structure
      + main_frame URL string, default false. If this is set, the browser moves to the specified URL. This option + overrides all others.
      + target CSS selector, default ".baseHeight". If this is set, output will be written to the current screen + inside the element specified. Any JQuery selector is valid here.
      + output HTML string, default false. If set, this is written in the element specified by target.
      + redraw_footer boolean, default false. If set, the footer values (you saved, total, etc) are re-drawn.
      + receipt string receipt type, default false. If set, prints the given receipt type.
      + scale string scale input, default false. If set, this updates the HTML scale display accordingly.
      + udpmsg string, default false. If set, this string is streamed directly to the scale driver via UDP. Experimental.
      + retry string, default false. If set, the string is reparsed in 70 milliseconds. I "waiting for the scale" on + by weight items is the only actual use for this. +

      Parse Examples

      + It's not as bad as it sounds. Here's an example of a parse object that + sends the browser to a new screen when "CAB" is entered (again, includes omitted): +
      +	class CabCoupon extends Parser {
      +		function check($str){
      +			if ($str == "CAB") return True;
      +			return False;
      +		}
      +
      +		function parse($str){
      +			$return_value = $this->default_json();
      +			$return_value['main_frame'] = MiscLib::base_url()."gui-modules/CabDisplay.php";	
      +			return $return_value;
      +		}
      +	}
      +	
      + Here's another example. This example prints a partial + receipt & displays a notification: +
      +	class PartialPrint extends Parser {
      +		function check($str){
      +			if ($str == "PRP") return True;
      +			return False;
      +		}
      +
      +		function parse($str){
      +			$return_value = $this->default_json();
      +			$return_value['output'] = DisplayLib::boxMsg("Printing Receipt");
      +			$return_value['receipt'] = "partial";
      +			return $return_value;
      +		}
      +	}
      +	
      +

      Testing

      + One downside (depending on perspective) of the AJAX system with JSON returns is your code has to be + clean. Any PHP warnings or errors result in invalid JSON objects. + The form in the "test" directory ( /IS4C/pos/is4c-nf/test/index.php ) lets you + post input to the parser and see exactly what's being output. Useful for debugging. + Try it at: Parse Tester , + treating the textbox as though it were the one on pos2.php. + (Have at least a login page open in the same browser in order establish session vars.) +
      +
      +
      +
      +Change Log:
      +
      +22Aug12 Eric Lee In "Testing" added some text and a link to Parse Tester.
      +20Aug12 Andy Theuninck
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + diff --git a/documentation/IS4C/developer/howto-plugins.html b/documentation/IS4C/developer/howto-plugins.html new file mode 100644 index 000000000..4889d3924 --- /dev/null +++ b/documentation/IS4C/developer/howto-plugins.html @@ -0,0 +1,43 @@ + + + Writing a Plugin + + +
      + updated as of: October 23, 2012
      + last author: Andy Theuninck +
      + + The current version of IS4C has many areas of functionality that + are extensible via modules. The structure, however, is very rigid. + Class files for a given area of functionality (e.g., parsing) have + to be placed in a specific directory. This is not conducive to 3rd + party development; their additions end up scattered throughout the + the upstream version. Plugins attempt to address this issue. + +

      + + A plugin is a self-contained collection of modules. It consists of: +

        +
      1. A directory under "plugins" (for example, MyPlugin +
      2. A file with the same name containing a Plugin subclass of the same name + (for example, a file MyPlugin.php containing the class MyPlugin) +
      3. As many other modules as needed +
      + + The actual Plugin module contains metadata about the plugin. It specifies any + settings that should be exposed to the user and provides hooks to take action + when the plugin is enabled or disabled. The additional modules provided by the + plugin are identified by base class. When a plugin is enabled, these additional + modules automatically appear as new options in appropriate sections of IS4C's + configuration. Class names should match file names, but + otherwise file and directory structure is entirely up to the developer. + +

      + + Doxygen documentation is available for the Plugin class. The included MemberCard + plugin is a decent illustrative example. It provides one module (a special UPC handler) + and uses the plugin system to expose the necessary prefix setting. + + + diff --git a/documentation/IS4C/developer/howto-scale.html b/documentation/IS4C/developer/howto-scale.html new file mode 100644 index 000000000..81917acd1 --- /dev/null +++ b/documentation/IS4C/developer/howto-scale.html @@ -0,0 +1,52 @@ + + + Scale Drivers + + +

      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +Interacting with a scanner scale is one of the more complicated parts +of IS4C. Often this isn't even written in PHP. To make scale interactions +consistent with various devices and OSes, each driver should provide +a lightweight PHP wrapper class that extends ScaleDriverWrapper. +
      +For the sake of orderliness, each driver implementation should have its +own directory in scale-drivers/drivers/. PHP wrapper classes should be in +scale-drivers/php-wrappers. The PHP file name and class name should correspond, +but naming conventions for the actual driver implmentation are up to the +individual developer. +
      +ScaleDriverWrapper provides the following methods: +
        +
      • SavePortConfiguration(string port_name) - This function is called +when the user changes the driver or serial port on the installation/configuration +page. Typically this function will re-write some small piece of the actual +implementation.
      • +
      • SaveDirectoryConfiguration(string absolute_path) - This function is +also called when the user changes the driver or serial port on the config page. +The argument is the absolute path to the top of IS4C, including a trailing +slash. Some driver implementations involve file i/o and need to be tweaked +depending on IS4C's file system location.
      • +
      • ReadFromScale() - This function reads input from the device +and prints a JSON object. The object may contain two fields: scale, +which is an HTML string to display as the current weight or scale status, +and scans, which is a UPC. Output may include either or +both fields. Using the scaledisplaymsg() function (lib/DisplayLib.php) to +generate scale HTML is highly recommended as that function will also +update necessary session variables.
      • +
      • WriteToScale(string command) - This function sends commands +to the scale. Current commands are: +
          +
        • goodBeep
        • +
        • errorBeep
        • +
        • twoPairs
        • +
        • rePoll
        • +
        • wakeup
        • +
        +Commands are not case sensitive. A driver does not necessarily +have to handle all known commands.
      • +
      + + diff --git a/documentation/IS4C/developer/howto-scanning.html b/documentation/IS4C/developer/howto-scanning.html new file mode 100644 index 000000000..07bddff41 --- /dev/null +++ b/documentation/IS4C/developer/howto-scanning.html @@ -0,0 +1,127 @@ + +Scanning UPCs + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +The UPC parser module is currently +hard to trace through and should probably be more flexible. I think +it should [eventually] be modular in three ways: handle special +store-specific UPCs so they don't have to be hard-coded, allow +discounts to be calculated differently by location, and allow +pricing methods to vary by location. +
      +

      Special UPCs

      +This collection of classes handles UPCs that aren't actually +products. For example, at WFC I use UPC prefix "4" on barcoded +member cards and custom coupons; someone else may use the prefix +differently or just not need that code enabled. +

      +Note: Special UPCs cannot exist in the products table or they +will be treated like normal items +

      +All Special UPC object should subclass SpecialUPC (lib/Scanning/SpecialUPC.php) +and implement two methods: +

        +
      • is_special(string upc) - return true is the module handles this upc, false +otherwise
      • +
      • handle(string upc, array json) - perform whatever operations the +upc should trigger. handle() should return a json array with the same +formatting as a parser object (Reference). +The json argument passed in will have all the required fields; handle() +just needs to make updates.
      • +
      +

      Example

      +UPC 8005 switches to a member list at some store (or used to at some point and +was still hardcoded in) +
      +class WackyPLU extends SpecialUPC {
      +
      +	function is_special($upc){
      +		if ($upc == "0000000008005")
      +			return true;
      +		return false;
      +	}
      +	
      +	function handle($upc,$json){
      +		$json['main_frame'] = MiscLib::base_url().'gui-modules/memlist.php';
      +		return $json;
      +	}
      +}
      +
      +
      +

      Discount Types

      +Calculating discounts and pricing is done based on opdata.products.discounttype. +This column is an integer, and simply hard-coding checks for a specific value is +bound to eventually conflict with another location's usage. Discount Type modules +are are a simple solution. Each store can specify an array of modules in their +configuration and opdata.products.discounttype maps into that array. Then it +doesn't matter if discounttype==4 means something different at WFC than it does +at the Wedge. +

      +All Discount Type objects should subclass DiscountType (lib/Scanning/DiscountType.php) +and implement the following method: +

        +
      • priceInfo(array $row, integer $quantity) - given the $row from opdata.products, +this method should return a keyed array with four entries: regPrice, unitPrice, +discount, and memDiscount. These entries correspond with columns of the same +name in translog.localtemptrans.
      • +
      +There are four additional, optional methods that may be define as needed: +
        +
      • addDiscountLine() - if you want to add an informational "YOU SAVED" line +to the transaction, do so here.
      • +
      • isSale() - returns true if this is the discount type for "normal" pricing. +Parent version return false.
      • +
      • isMemberOnly() - returns true if the sale is only applicable to members. +Parent version return false.
      • +
      • isStaffOnly() - returns true is the sale is only applicable to staff. +Parent version return false.
      • +
      +

      Example

      +Here's a simple sale (see actual implementation for optional methods): +
      +class EveryoneSale extends DiscountType {
      +
      +	function priceInfo($row, $quantity){
      +		$ret = array(
      +			'regPrice'  => $row['normal_price'],
      +			'unitPrice' => $row['special_price'],
      +			'memDiscount'  => 0
      +		);
      +
      +		$ret['discount'] = ($ret['regPrice'] - $ret['unitPrice']) * $quantity;
      +
      +		return $ret;
      +	}
      +}
      +
      +
      +

      Price Methods

      +Price Methods also deal with calculating prices and discounts, but +based on opdata.products.pricemethod (or opdata.products.specialpricemethod +for sales). There's a bit of overlap with Discount Types in that respect. +The key difference is that price method objects are responsible +for adding the item to the transaction. In general, additional price +methods beyond the basic case have to do with grouped sales and keep +track of which items in a transaction are part of the group. +

      +Like discount types, each store can specify an array of price method +modules in their configuration and opdata.products.pricemethod +maps into that array. The same reasons to avoid hard coding apply +here, too. +

      +All Price Method objects should subclass PriceMethod (lib/Scanning/PriceMethod.php) +and implement the following method: +

        +
      • addItem(array $row, double $quantity, object $priceObj) - given +the row from opdata.products, quantity, and discount type object +(see above), this method should add the item to the transaction. +The return value of this method is currently ignored. +
      • +
      +
      + + diff --git a/documentation/IS4C/developer/i18n.html b/documentation/IS4C/developer/i18n.html new file mode 100644 index 000000000..d7c0d47c4 --- /dev/null +++ b/documentation/IS4C/developer/i18n.html @@ -0,0 +1,50 @@ + + + Internationalization + + +
      + updated as of: August 20, 2012
      + last author: Andy Theuninck +
      +This is a quick primer on using gettext in conjunction with PHP +to store message strings in various languages. +

      In PHP

      +Using gettext in PHP is pretty simple. Instead of writing: +
      +echo "I am awesome"
      +
      +use on of the following: +
      +echo gettext("I am awesome")
      +echo _("I am awesome")
      +
      +I tend to use the underscore version. If the string hasn't been translated, +everything will still work fine. It'll just return exactly the input unmodified. +

      Creating / Managing Language Files

      +
      This is by no means the only method. Other tools exist for +editing these kind of files. Examples are command-line based, executed +from the pos/is4c-nf directory
      +First, we need a list of all the messages. This is normally in a .pot file. +Generate it like this: +
      +find . -name '*.php' | xargs xgettext -L PHP -d pos-nf -o locale/pos-nf.pot --no-wrap -j
      +
      +Try not to forget the -j option. That merges things so existing translations +in the .pot file are preserved. The .pot file is just a text file. Update the msgstr +values in it as needed. +

      +Next, we need to translate the .pot file into a .po file. The command is this: +

      +msgmerge -U locale/pos-nf_en_US.po locale/pos-nf.pot
      +
      +Some programs can edit .po files directly. +

      +Finally, we need to translate the .po file into a .mo file. The .mo is the +binary file that gettext actually uses to look up translations. The .po to .mo +command is this: +

      +msgfmt -v -o locale/en_US/LC_MESSAGES/pos-nf.mo locale/pos-nf_en_US.po
      +
      + + diff --git a/documentation/IS4C/developer/index.html b/documentation/IS4C/developer/index.html new file mode 100644 index 000000000..ed2932531 --- /dev/null +++ b/documentation/IS4C/developer/index.html @@ -0,0 +1,15 @@ + + + Index + + + Hooray, a menu! +
        +
      • Installation
      • +
      • Framework Requirements/Theory
      • +
      • GS1 Databar Practices
      • +
      • Screw Theory - I Want to Start Coding
      • +
      • Internationalization w/ gettext
      • + + + diff --git a/documentation/IS4C/developer/installation.html b/documentation/IS4C/developer/installation.html new file mode 100644 index 000000000..7a5e01597 --- /dev/null +++ b/documentation/IS4C/developer/installation.html @@ -0,0 +1,25 @@ + + + IS4C (no frames) Installation + + +
        + updated as of: August 20, 2012
        + last author: Andy Theuninck +
        + Installing IS4C is supposed to be easy. +
          +
        1. Drop it on a webserver
        2. +
        3. Navigate to the install directory with a browser +
            +
          • The install script tries to write the configuration file, ini.php. It'll tell you what the web server's uid is and whether or not the config file is writable. If it isn't, you need to fix that.
          • +
          • Once you plug in your database connection values, the install script creates all the tables and views it needs (in theory). +
          • +
          +
        4. There is no step 3
        5. +
        +
        + If you're pointing IS4C at an pre-existing database, you're probably ready to go. + Otherwise, sample data is provided and can be loaded from the install script. + + diff --git a/documentation/IS4C/end-user/basics.html b/documentation/IS4C/end-user/basics.html new file mode 100644 index 000000000..ebbf8c877 --- /dev/null +++ b/documentation/IS4C/end-user/basics.html @@ -0,0 +1,94 @@ + + + Basics + + +
        + updated as of: August 20, 2012
        + last author: Andy Theuninck +
        +Alright, let's sell some products! This document lists full +commands, but IS4C is normally used with a programmable keyboard +so cashiers don't have to memorize commands. Unless otherwise noted, +commands are not case sensitive. +

        The [clear] command

        +One very important command to know is clear: type CL then press enter. +This key sequence will dismiss most errors and warnings and cancel +most procedures taking you back to the "main" screen. +

        Logging in

        +The first screen is a login screen. A cashier must enter a numeric +password to begin. Type the password and press enter. +If you're just testing, 9999 is the built in +training password, and 52 and 7000 are the passwords provided +in the sample employee data. +

        +By default, if a logged in register is idle for awhile, it will +automatically lock. To unlock a register, type the same password you +used to log in and press enter. +

        Ringing Up Items

        +
          +
        • By UPC/PLU type in the item's UPC or PLU and hit enter. +Leading zeroes may be omitted. Whether or not to include check +digits is a store-specific decision (I think most don't). If you +include check digits in your product table, they should be included +here and vice versa
        • +
        • Open Rings type the amount, DP, the department's number, +zero, and hit enter. Amounts in IS4C typically do not include a +decimal point and are measured in cents. So to ring up one +dollar to department number one, you would type "100DP10" then +press enter.
        • +
        • Made a mistake? there are two ways to void an item +that was already entered. First, scroll up or down using the arrow +keys until the item is highlighted. Then type VD and press enter. +Alternately, you can type VD then the item's UPC or PLU and +press enter.
        • +
        • Buying more than one? if a customer is buying lots +of the same product, you can enter the quantity they're buying, +an asterisk, and the UPC or PLU then press enter. With items +that are sold by weight, you can also enter fractional quantities. +This is one situation where a decimal point is used. +It can be useful for testing without a scale present.
        • +
        +

        Entering the member number

        +IS4C is built for co-ops, and with that in mind every transaction +requires a member number. Non-member transactions require a number, too, +but you can use the same number for all non-member transactions. Which +number is up to you. The setting is located in +Additional Configuration. +
          +
        • If the member number is known, type the member number, then +ID, and press enter. This takes you to a list of names on the membership. +Scroll up or down with the arrow keys, then press enter to select one. +The name selection step is omitted for the generic non-member number, +but otherwise always included - even for memberships with just one name +on the account. Confirming the member's name helps catch occasional typos +when entering the member number.
        • +
        • If the member number is not known, type ID and press enter. +The member search accepts both member numbers and last names. Partial +last names are permitted but are matched from the beginning - i.e., +searching for "john" will find a member whose last name is Johnson, +but searching for "ohnson" will not.
        • +
        +

        Accepting tender

        +The most common error with tenders will state "transaction must be totaled" +or some variation of that. Entering the member number (see above) totals +the transaction. However, if you continue ringing up items after entering +the member number, the transaction must be re-totaled. To re-total a transaction, +type TL then press enter. +

        +The default to enter tender is to type the amount (in cents) and the two +character tender code, then press enter. For example, to tender $2.50 in cash, +you would type 250CA and press enter. You can add as many as you like, but +common tenders in the default installation include: +

          +
        • CA - Cash
        • +
        • CK - Check
        • +
        • CC - Credit Card
        • +
        • DC - Debit Card
        • +
        • CP - Coupon
        • +
        • GD - Gift Card
        • +
        +If peripherals are present, at this point the receipt prints and +the till drawer opens. + + diff --git a/documentation/IS4C/end-user/commands.html b/documentation/IS4C/end-user/commands.html new file mode 100644 index 000000000..76ca08b6d --- /dev/null +++ b/documentation/IS4C/end-user/commands.html @@ -0,0 +1,54 @@ + + + Other commands + + +
        + updated as of: August 20, 2012
        + last author: Andy Theuninck +
        +

        Other Keyboard Commands

        +This document lists full commands, but IS4C is normally used with a programmable keyboard +so cashiers don't have to memorize commands. Unless otherwise noted, +commands are not case sensitive. + +

        Sign out the current cashier

        +Type SO then press enter. This returns to the log in screen and opens +the till drawer if present. You can not sign out in the middle of a transaction. + +

        Lock the register

        +Type LOCK then press enter. You must re-enter the cashier password to unlock +the register before proceeding with any other actions. + +

        Cancel the current transaction

        +Type CN then press enter. Canceling a +transaction requires an actual cashier's password. You cannot use the 9999 +training password here. + +

        Accept foodstamps

        +Before foodstamps can be tendered, you must generate a foodstamp total. Type +FNTL then press enter. This total is all items on the current transaction that +are marked as foodstampable. Sales tax is not collected on items purchased +using foodstamps. Proper procedure may well vary from state to state, so +check your local regulations. + +

        Disable sales tax for this transaction

        +Type TETL then press enter. You will be prompted for an optional tax exemption +ID. This is added to the transaction as a comment for the sake of +record keeping. + +

        Suspend/Resume

        +If you want to finish the current transaction later, the transaction can be suspended. +If a server database is available, the suspended transaction is sent there +and can be resumed from any register. If no server is available, the transaction +is suspended locally and must be resumed from the same register. +

        +To suspend the current transaction, type MG then press enter. Scroll down to +"Suspend Transaction" using the arrow keys, then press enter again. +

        +To resume the a transaction, type MG then press enter. Scroll down to +"Resume Transaction" using the arrow keys, then press enter again. Scroll +through the list of available suspended transactions, and press enter on +more time to select the one you'd like to resume. Note +that you may not resume a transaction if another transaction is currently +in progress. diff --git a/documentation/IS4C/end-user/configuration.html b/documentation/IS4C/end-user/configuration.html new file mode 100644 index 000000000..a41e7771f --- /dev/null +++ b/documentation/IS4C/end-user/configuration.html @@ -0,0 +1,49 @@ + + + IS4C Configuration Options + + +

        + updated as of: August 20, 2012
        + last author: Andy Theuninck +
        +The installation script for IS4C also servers as a configuration +page. It's broken into three sections (links at the top): +Necessities, which is the bare minimum to get a lane up and running, +Additional Configuration, which deals with per-store +customizations and peripheral configuration, and Sample Data, +which populates part of the database for quick testing. +

        Necessities

        +
          +
        • ini.php status. This file is IS4C's configuration. It must be writable +or you can't save changes. On Unix-style systems, the best option is +to change ownership of the file to whichever user is running apache (the install +script will try to determine who that is for you). On Windows, the whole file system +is probably writable.
        • +
        • OS choices are Windows (for Windows) and *nix (for anything else). If this +isn't set correctly, database connections will likely fail.
        • +
        • Lane Number transactions logs include a lane number. Having a unique number +for each production lane is probably a good idea.
        • +
        • Lane Databases connection requires a host, DBMS type, username, and password. +The two lane database are traditionally called opdata and translog, but do not +have to be. Once the correct connection information is entered, the install script will +automatically create any missing databases, tables, and views.
        • +
        • Server Database connection has similar requirements to the lane database +connection. Again the install script will create missing databases, tables, and views. +If you skip this configuration, the lane will operate in standalone mode. For testing +purposes, that's probably fine. Note: it is highly recommended that the server +database name differ from the lane database names. The default is is4c_op.
        • +
        • Taxes is for sales tax rates. Bear in mind that a given item can only have +one tax rate. If, for example, you have a state sales tax of 5% and a city sales tax +of 3%, you may need to enter tax rates of 3%, 5%, and 8%, depending on how +the rates overlap.
        • +

          Additional Configuration

          +These options are all labeled pretty clearly on the install page. +

          Sample Data

          +This page lets you load employees, customers (custdata), products, and departments. +Customers and products are the only items strictly necessary to get going. +There is a training login number, 9999, built into IS4C. Departments don't actually +have to exist at the register unless you're doing open rings. +
        + + diff --git a/documentation/IS4C/end-user/index.html b/documentation/IS4C/end-user/index.html new file mode 100644 index 000000000..a65cc5e41 --- /dev/null +++ b/documentation/IS4C/end-user/index.html @@ -0,0 +1,12 @@ + + + End User Documentation + + + + + diff --git a/documentation/IS4C/end-user/installation.html b/documentation/IS4C/end-user/installation.html new file mode 100644 index 000000000..7a5e01597 --- /dev/null +++ b/documentation/IS4C/end-user/installation.html @@ -0,0 +1,25 @@ + + + IS4C (no frames) Installation + + +
        + updated as of: August 20, 2012
        + last author: Andy Theuninck +
        + Installing IS4C is supposed to be easy. +
          +
        1. Drop it on a webserver
        2. +
        3. Navigate to the install directory with a browser +
            +
          • The install script tries to write the configuration file, ini.php. It'll tell you what the web server's uid is and whether or not the config file is writable. If it isn't, you need to fix that.
          • +
          • Once you plug in your database connection values, the install script creates all the tables and views it needs (in theory). +
          • +
          +
        4. There is no step 3
        5. +
        +
        + If you're pointing IS4C at an pre-existing database, you're probably ready to go. + Otherwise, sample data is provided and can be loaded from the install script. + + diff --git a/documentation/IS4C/index.html b/documentation/IS4C/index.html new file mode 100644 index 000000000..073ebe212 --- /dev/null +++ b/documentation/IS4C/index.html @@ -0,0 +1,27 @@ + + + CORE-POS/IS4C PoS/Lane Documentation ToC + + +
        +

        CORE-POS/IS4C PoS/Lane Documentation ToC

        +Rudimentary ToC to /IS4C/documentation/IS4C +
        as of: August 11, 2012 +
        + +

        Documentation Top > Lane or PoS +
        There is more detail at the top level. +

        + +

        All links open in new tabs

        + + + + diff --git a/documentation/IS4C/keyboard.php b/documentation/IS4C/keyboard.php new file mode 100644 index 000000000..ef2c53b77 --- /dev/null +++ b/documentation/IS4C/keyboard.php @@ -0,0 +1,30 @@ +$cn"; + print $instance->doc(); + print "
        "; + } + closedir($dh); +} + +?> diff --git a/documentation/IT/Database_Administrator/._core_op_ERD_PDF.pdf b/documentation/IT/Database_Administrator/._core_op_ERD_PDF.pdf new file mode 100644 index 000000000..e041ba800 Binary files /dev/null and b/documentation/IT/Database_Administrator/._core_op_ERD_PDF.pdf differ diff --git a/pos/documentation/Database Administrator Files/Server_is4c_op_database_layout.pdf b/documentation/IT/Database_Administrator/Server_is4c_op_database_layout.pdf similarity index 100% rename from pos/documentation/Database Administrator Files/Server_is4c_op_database_layout.pdf rename to documentation/IT/Database_Administrator/Server_is4c_op_database_layout.pdf diff --git a/documentation/IT/Database_Administrator/backup.html b/documentation/IT/Database_Administrator/backup.html new file mode 100644 index 000000000..1ca13fd8e --- /dev/null +++ b/documentation/IT/Database_Administrator/backup.html @@ -0,0 +1,52 @@ + + + Backups + + +Fannie includes a default task for creating MySQL database +backups. For other database systems, you're on your own. +This document is tailored towards MySQL in a Linux/UNIX +environment. Making it work in Windows should be possible though. +

        Backup Basics

        +Nothing overly fancy is going on here. Backups are performed using +mysqldump. The main advantage is utilizing fannie's configuration +so there's one master file with database connection info +that all tools and scripts rely on. If you rotate database passwords +periodically, that means just one file to update. +

        Configuration

        +Fannie's main install/config page exposes a few configuration options +for database backups: +
          +
        • Path to backups is where to store the backups. Each + database (default is4c_op, is4c_trans, & trans_archve) is + given its own subdirectory here. This path should be writeable + and of course have adequate free space
        • +
        • Path to mysqldump is your system directory for mysql-related + programs. The default, /usr/bin/, should be fine on most systems. Some + systems given cron a very limited shell, so full paths with binaries + provide some error-proofing.
        • +
        • Number of backups is how many backups, per database, to + store. Backups are named with a date stamp (e.g., is4c_opYYYYMMDD.sql). + When the number of existing backups exceeds this setting, the oldest + one(s) are deleted.
        • +
        • Compress backups is optional. Turning this one just passes + the backup through gzip. The normal mysql dumps are plain text, so + space savings from compression are pretty significant. For very large + databases, the CPU overhead of compression is also significant though. + For multi-GB databses, a bigger disk may be a better solution.
        • +
        +Once the configuration is set, just enable and schedule the job +nightly.db.backup.php via Fannie Dayend Polling => Scheduled Tasks. +

        Restoring a Backup

        +First, if you used compression, decompress the desired backup file. In most +graphical environments, that's just double-clicking it. On the command line, +try gzip -d <backup file>. +

        +Next, load the backup file. If you're using any sort of GUI tool to manage +your MySQL server, just find it's backup/restore option and restore from your +backup file. The format's pretty universal, so any tool should handle it. Working +on the command line, try mysql -u <mysql username> -p <mysql password> +-h <mysql host IP> < <backup file>. Example for clarity: +mysql -u root -p secret_passcode -h localhost < is4c_op20120101.sql. + + diff --git a/documentation/IT/Database_Administrator/core_op_ERD_PDF.pdf b/documentation/IT/Database_Administrator/core_op_ERD_PDF.pdf new file mode 100644 index 000000000..7a9384d2a Binary files /dev/null and b/documentation/IT/Database_Administrator/core_op_ERD_PDF.pdf differ diff --git a/documentation/IT/Database_Administrator/core_trans_ERD_PDF.pdf b/documentation/IT/Database_Administrator/core_trans_ERD_PDF.pdf new file mode 100644 index 000000000..ba321743c Binary files /dev/null and b/documentation/IT/Database_Administrator/core_trans_ERD_PDF.pdf differ diff --git a/documentation/IT/Database_Administrator/flow.html b/documentation/IT/Database_Administrator/flow.html new file mode 100644 index 000000000..9ae4e1105 --- /dev/null +++ b/documentation/IT/Database_Administrator/flow.html @@ -0,0 +1,53 @@ + + + Normal Data Flow + + +During normal operation, information is copied from +a lane's database to the server database and vice versa. +Some of these operations happen automatically. Others +occur manually by default but can be scheduled to +occur periodically. +

        Lane => Server Data

        +The lane sends transaction data to the server. At the end of +a transaction, the tables dtransactions and alog +are inserted into corresponding tables on the server. Upon +successful transfer, the lane tables are truncated. +

        +If the +server is unavailable (e.g., network is down), the lane just +keeps adding to dtransactions and alog until the server +becomes available again. If bringing the server back online +after a long outage, keep in mind that large transfers will +be required to get all accumulated transactions. In extreme +cases, the lane might stop responding for a couple minutes +until the transfer query completes. +

        Server => Lane Data

        +Each lane maintains its own copy of the following server +tables: products, custdata, employees, +tenders, and departments. These tables contain +items for sale, member accounts, cashier logins, payments +accepted, and item categories (respectively). By default, copying +these tables from the server to the lanes is manual. The +Synchronize menu in Fannie provides options. +

        +Employees, tenders, and deparmtents normally don't change often +enough to merit any automated updates, but nightly tasks +to reload products and custdata from the server may be a good idea. +This should be scheduled after any other nightly tasks that +manipulate products or custdata. +

        +Note that Fannie tools for editing individual products and +custdata accounts will push those changes to the lanes +immediately. Updating a record or two is more efficient than +reloading an entire table. +

        Lane => Server => Lane Data

        +For the sake of completeness, suspending and resuming transactions +involves moving data in both directions. When suspending a transaction, +the contents of localtemptrans on the lane are copied to +suspended on the server. When resuming a transaction, appropriate +records from suspended on the server are copied to +localtemptrans on the lane. Both operations are always +manual as the cashier has to input suspend or resume commands. + + diff --git a/documentation/IT/Database_Administrator/index.html b/documentation/IT/Database_Administrator/index.html new file mode 100644 index 000000000..f5f4f3327 --- /dev/null +++ b/documentation/IT/Database_Administrator/index.html @@ -0,0 +1,15 @@ + + + Database Admin Info + + + + + diff --git a/documentation/IT/Database_Administrator/newreports.html b/documentation/IT/Database_Administrator/newreports.html new file mode 100644 index 000000000..aa628655b --- /dev/null +++ b/documentation/IT/Database_Administrator/newreports.html @@ -0,0 +1,30 @@ + + + Creating new reports + + +

        Creating new reports

        +Eventually a time will come when you need a different sort +of report beyond what Fannie provides out of the box. If that +time comes before you've learned any PHP and/or HTML, +that's okay. Glance over the table & view docs if needed and +get somebody who speaks SQL. Yourself, another staffer, a kidnapped +consultant, whatever. +

        +Head over to Fannie's report generator +(fannie/reports/DBA/ if you're reading this elsewhere). Put your query in the +big box. There's some keyword scrubbing to prevent you from shooting yourself in the +foot, but don't go trying to create a disaster. +If you're querying transaction data and you provide dates (or just a +start date), the tool will automatically replace dlog and/or dtransactions +with appropriate references to the archive structure. This is entirely optional; you +can type references to archive tables and views manually, too. +

        +Default output is a webpage. Check the download results box to get a spreadsheet +instead. Some newer versions of Excel complain that the file isn't really in +correct XLS format, but they can still open it. +

        +If you're going to run a report often, you can save it by putting a name in the +Save As field. + + diff --git a/documentation/IT/Database_Administrator/nightly.html b/documentation/IT/Database_Administrator/nightly.html new file mode 100644 index 000000000..6a2fe6d4d --- /dev/null +++ b/documentation/IT/Database_Administrator/nightly.html @@ -0,0 +1,75 @@ + + + Maintenance Tasks + + +The primary focus of this document is periodic +data manipulations required for IS4C. Tasks can +be managed through Dayend Polling => Scheduled +Tasks. This is just a light wrapper around +cron; manipulating your own crontab directly +is perfectly fine, too. +

        The Transaction Shuffle

        +The most important nightly task to understand is +transaction archiving. +Sooner or later, depending on one's +hardware budget, reporting queries against all transaction +data, ever get unbearably slow, so transaction data +is segmented into monthly tables. At any given time: +
          +
        • dtransactions on the transaction database (default: is4c_trans) + contains today's transactions.
        • +
        • transarchive on the transaction database (default: is4c_trans) + contains the previous 90 days' transactions.
        • +
        • transArchiveYYYYMM on the archive database (default: trans_archive) + contains transactions for the month MM in year YYYY.
        • +
        +At some point each night, dtransactions' data is copied into both transarchive +and the correct monthly table, then dtransactions is truncated in preparation +for the next day. +The included task nightly.dtrans.php handles this rotation. Any other +nightly tasks that examine or manipulate the current day's transactions need +to know where that data is. +

        The Transaction Shuffle, Pt. 2

        +Fannie supports an alternate archiving structure using partitions instead of +monthly tables. This feature is experimental at the moment and only supported +with MySQL. MySQL's performance with multiple monthly archive tables is very +poor; this alternative addresses that problem. The structure changes to this: +
          +
        • dtransactions on the transaction database (default: is4c_trans) + contains today's transactions.
        • +
        • transarchive on the transaction database (default: is4c_trans) + contains the previous 90 days' transactions.
        • +
        • bigArchive on the archive database (default: trans_archive) + contains all transactions prior to the current day + and is partitioned by month
        • +
        +To use this alternative, select "partitions" instead of "tables" as the Archive Method +on Fannie's install/config page. The same included task nightly.dtrans.php +handles the rotation and creates new partitions as needed. +

        Batches

        +There are two related tasks here. nightly.batch.php takes all items +off sale (resetting them to normal_price), then applies any current sales +batches based on batch start and end dates. Schedule this batch at or shortly +after midnight to make start and end dates behave sensibly. +

        +The other task, nightly.pcbatch.php updates items' regular, non-sale +price (i.e., normal_price) based on any price change batches with a matching +start date. Price change batches are only applied once, so their end date +is irrelevant. This task should also run after midnight. +

        +It doesn't matter which batch task runs first. Scheduling them at the +exact same time might be unsafe though; leave a couple minutes in between at +least. +

        Equity Tracking

        +Equity purchases are stored in the table stockpurchases. To keep this +up to date, run the task nightly.equity.php nightly. This task should +be run after the dtransactions rotation and after midnight. +

        Table Copies

        +The included task nightly.table.snapshot.php copies the contents +of table to backup tables. These are no substitute for a proper database +backup, but allow for retreiving a small bit of old information from +without loading up a backup of the entire database. Currently, it +copies products and custdata to productBackup and custdataBackup. + + diff --git a/documentation/IT/Hardware/index.html b/documentation/IT/Hardware/index.html new file mode 100644 index 000000000..3657d9e4d --- /dev/null +++ b/documentation/IT/Hardware/index.html @@ -0,0 +1,131 @@ + + + Hardware Requirements + + +

        Lane Machine

        +A typical IS4C lane set up includes a fairly standard PC +and a few peripherals. +
          +
        • PC Requirements: pretty lightweight. It's probably not possible to buy a new +PC that isn't capable of running IS4C with acceptable performance. RAM is usually +the biggest bottleneck, but even then many stores are operating registers with +less than the 2-4GB that's practically standard these days. Multi-core likely helps +with the database+webserver workload, but again that's pretty common now. Disk space +is dirt cheap; just get something in the 250GB range and never worry about it again. +Gigabit ethernet +would be a nice boost if you have infrastructure for it through out, but certainly +isn't a requirement. Be aware that many POS peripherals rely on PC ports - +serial, parallel, and ps/2 - that are rapidly disappearing on newer PCs, especially +if you get something in a small form factor. USB adapters are usually a workable solution.
        • +
        • Scanner-Scale: nearly all existing code is targeted for and tested on +DataLogic Magellan 8xxx series scales. Go with one of these.
        • +
        • Receipt Printer: again, the easiest solution is to recommend what's already in +use: Epson TM-H6000II. Other Epson POS printers may speak a similar enough +dialect to be useable. If other stores are using different models, we should +add them to this list.
        • +
        • Cash Drawer: anything that's compatible with your printer (POS cash drawers +typically connect to receipt printers).
        • +
        • Keyboard: IS4C is best operated using a programmable keyboard. The QWERTY keys +are used when looking up members or products by name; exactly how many programmable +keys you need will vary by how many tenders you accept, departments/products you +need shortcuts for, etc. Aim high. It's far better to have extra keys than to +run out. A double-zero button on the number pad and an over-sized enter button +are both handy features that are reasonably common on POS-keyboards.
        • +
        • Mouse: strictly speaking, you don't need one, but it's nice for OS-related +stuff like shutting down or restarting a machine (especially when a programmed +keyboard lacks some normal characters & navigation keys). A trackball is +a nice solution for tighter spaces.
        • +
        • Monitor(s): it's far easier to operate with one. IS4C works fine in 1024x768 +or ever 800x600. Finding an incompatible display ought to be nearly impossible. +For separate customer and cashier displays, just put in a simple VGA splitter +to send the same output to both monitors.
        • +
        +

        Server Machine(s)

        +You want some more serious horsepower here. Overall performance is tied to +database performance, which again is bottlenecked principally by RAM. Disk space +is a slightly greater concern here than on the lanes because transaction history +grows continuously and you'll likely want local and external backups. For +reference, WFC runs ~40,000 transactions a day and has a transaction history +dating back to late 2004 a full database back up is ~14GB. That's not perfectly +indicative of growth rate; our transactions per day have increased over the +same time period, but in a world where disks are measured in hundreds of GBs +(if not in TBs) running out of space isn't a big issue. Now, options: +
          +
        • If you're going to use one server: +
            +
          • Get a multi-core, 64-bit processor. 64 bit software is mature enough + that the extra RAM ceiling is worth having, even if you start out + with 4GB or less.
          • +
          • Get a bunch of RAM. 4GB with slots open for expanion is probably + a good starting point. If you can afford more, more is always + better.
          • +
          • Get a bunch of disk space. 250GB is probably sufficient for a long + time. Fast disks will help database performance. An SSD plus + a normal disk for backups might be the best option these days + (as opposed to SAS/SCSI RAID array), both in price/performance + ratio and ease of set up management. This would be strictly + a performance bonsus; IS4C will run fine on a 7200RPM SATA + disk. Two physicals disks total is a good idea to protect + local backups from a single drive failure.
          • +
          • Gigabit ethernet would be nice if your infrastructure supports it + throughout
          • +
          • Dual NICs could be handy if you want POS separated from the rest + of your network.
          • +
          +
        • +
        • If you're going to use two servers: +
            +
          • Get a heavier duty machine exactly as above. Put the database on this machine.
          • +
          • Get a lighter weight machine and put Apache+Fannie on that. This is a much lower + workload. Basically anything you can lay hands on will be sufficient.
          • +
          • Advantages of this set up include: +
              +
            • DB Server can dedicate all resources to the most intensive task.
            • +
            • Dual servers provide convenient backup locations for each other. + You still want off sites of course, but this protects you in + the event of a dead disk controller, exploding power supply. + or other "entire machine" failure
            • +
            • If the Apache machine has dual NICs, the demarcation between POS + and non-POS networks is cleaner. Firewall rules that simply + don't allow any traffic across that point are simpler than + rules permitting certain ports.
            • +
            • If one machine fails, you can roll-over to a single server model + (quickly and easily if they have mutual backups) while waiting + for replacement parts or a replacement server. If the stronger + machine goes down, interim performance won't be ideal, but + it will at least be functional.
            • +
            +
          • +
          +
        • +
        • If you're going to use three servers: +
            +
          • Get a lightweight machine for Apache + Fannie.
          • +
          • Get a heavy duty machine for database work. Put historical transaction data + on this machine and use it to generate reports.
          • +
          • Get a machine somewhere inbetween these two to act as the + POS server.
          • +
          + Note: the three server set up is not officially supported yet. The main idea of this + set up is to alleviate pressure on the main POS server. The only database functionality + that's truly resource intensive is querying against a large segment of transaction data. + Shipping this data to a dedicated machine means complex or long term reporting - which + isn't really time-sensitive - won't bog down anything else. +
        +

        Label-printing scales (Deli/Bulk/Prepack/Etc)

        +A few stores have had success sending data directly to Hobart Quantum TCP scales and there's +some basic support for it in Fannie. If it's something you're interested in, going with +that model is probably easiest; if you have a different model, try to find out if it supports +Hobart's Data GateWeigh utility. This utility is Windows-based, so you may need a dedicated +[ultra low resource] box just to run it (depending on other infrastructure, spare machines, etc). + +Of note: when Quantum TCPs go into powersave/sleep mode, they seem to forget about wireless +settings. Just waking it up isn't sufficient to fix this; it takes a full powercycling. Unless +the scale is in fairly constant use through the day, this isn't the most useful feature. +

        Shelf tags

        +Shelf tag are generated in 8.5" x 11" layouts. There's no special printer requirement for these. +We should probably make some layout for specific standards (Avery #s or something) rather than +the random, no-name stack WFC uses. + + diff --git a/documentation/IT/Security/index.html b/documentation/IT/Security/index.html new file mode 100644 index 000000000..4c78acda1 --- /dev/null +++ b/documentation/IT/Security/index.html @@ -0,0 +1,106 @@ + + + Security + + +This document covers IS4C authentication and general security tips. +Almost all of this is optional, and there are certainly existing stores +ignoring different parts of it to no real ill effect. IS4C does not store +any particularly sensitive information, and there are [unfortunately] far +easier ways to steal from a retail establishment than breaking into the POS. +

        Firewall(s)

        +A firewall is your first line of defense. There's no reason to allow any +one but your staff access to Fannie or POS. Regardless of what firewall software +you use, keeping the public off your network is recommended. +

        +Putting employee workstations and front end POS on different subnets is +recommended, if possible. The easiest way to accomplish this is to use a +machine with two NICs for your Fannie server. If the workstation network is +192.168.1.x and the POS network is 192.168.2.x, the server is accessible +from both without allowing any traffic from one subnet to the other. +

        Front End Authentication

        +Authentication at the registers is fairly simplistic. Employees are +assigned a numeric passcode (via Fannie's Admin => Cashier Management menu item). +Front End employees are subdivided into two tiers of access. Regular cashiers +can only log into a lane if the lane is not currently in use. Manager cashiers +can always log into a lane, even if someone else is already logged in. Primarily, the +higher level is used when a regular employee goes home for the day without +logging out properly. +

        Back End Authentication

        +First and foremost, Fannie's authentication system is optional. If you run into +headaches, you can always turn it off. You can also ignore it entirely if you +so choose. +

        +Fannie relies on a more elaborate authentication systems. Users log in with a user +name and password. Rather than arrange users in tiers, access is granted on a +per-task basis. This is for maximum flexibility; one user might have permission +to edit products but not members while another might have permission to edit +members but not products. +

        +To get started with authentication, follow the Authentication link on +Fannie's configuration. First set Authentication Enabled to Yes (ignore +the other options for now; they'll be covered later). User accounts and permissions +are stored in the database. After authentication is enabled, if no users exist +you will be prompted to create an initial user. Enter a username and password. +If nothing goes wrong, that user will be created with admin privileges. +

        +With an admin account created, go to the user account administration section, +http://localhost/fannie/auth/ui/ (substituting a correct host name and path +to fannie if needed). Log in and you get a big menu of options. You can: +

          +
        • View existing users, create new ones, and delete users
        • +
        • View authorizations for a user, assign new authorizations, or delete existing ones
        • +
        • Manipulate groups
        • +
        • Switch to another user (useful for testing/troubleshooting other people's accounts)
        • +
        +Creating and deleting users is pretty straightforward. Authorizations are the permission +system. The authorization class refers to the task, and optional subclasses allow further +refinement. For example, the authorization class admin (subclass all, all) grants +access to all these user / authorization / group tools. GIANT TODO: make list of existing +auth classes in fannie... +

        +While task based permissions are flexible, they're also a bit unwieldy if someone needs +a lot of access. Arranging users into groups helps alleviate this. Assigning an authorization +to a group is the same as adding the authorization to each of the groups member's individually. +Similarly, adding a user to a group gives that user all the authorizations assigned to that +group. +

        +Now, about those other configuration options. User permissions are always stored in +the database, but there are a few options for validating username and password combinations. +

          +
        1. SQL. User passwords (hashes) are stored directly in the database. This one's mandatory.
        2. +
        3. Shadow. This option matches usernames and passwords against entries in the /etc/shadow file. +This is a Linux-only option. If the server is providing other services - e.g., email, samba, etc - +and already has user accounts, Fannie can use those. This option relies on the included +shadowread utility. If the config page reports any errors with shadowread, just recompile +and install it (very simple. make, sudo make install)
        4. +
        5. LDAP. This options checks usernames and passwords against an LDAP server. The defaults +are tailored to openldap, but in theory you can use any LDAP server provided the field +names are correct. Active Directory is obviously the other major option; if someone figures +out appropriate field names for AD, they'll be added here as suggestions.
        6. +
        +Shadow and LDAP authentication are both optional; if you don't have existing accounts to re-use, +SQL authentication works fine. The only disadvantage is it's yet another set up process +for users to go through and yet another password to remember. If you do use shadow or LDAP, keep +in mind that accounts are imported into the database passively - i.e., when a user logins in the +first time, that account is imported - rather than all at once. +

        Configuration Files

        +You may not want the web-based install/config pages accessible to everyone (in practice, this has +never been an issue). Fannie includes a shell script, secure.sh, in the install directory that will +generate a username/password combo and apply it to that directory. If this results in a 500 Internal +Server error, you most likely need to add AuthConfig to your main apache config's +AllowOverride line. Copy the same script to lanes' install directory and re-run if the same restriction +is desired there. +

        +Windows folks: the script creates an .htaccess that looks like this: + +AuthType Basic +AuthName "Fannie Config" +AuthUserFile /path/to/password/file +Require valid-user + +Correct the path for password file as needed. You're on your own to figure out +how to actually create a htpasswd file on Windows. Maybe there's a command for it +in C:\{Whatever}\Apache\bin + + diff --git a/documentation/IT/index.html b/documentation/IT/index.html new file mode 100644 index 000000000..066a42c88 --- /dev/null +++ b/documentation/IT/index.html @@ -0,0 +1,47 @@ + + + CORE-POS/IS4C IT Documentation ToC + + +

        +

        CORE-POS/IS4C IT Documentation ToC

        +Rudimentary ToC to /IS4C/documentation/IT +
        as of: August 11, 2012 +
        + +

        Documentation Top > IT +
        There is more detail at the top level. +

        + +

        All links open in new tabs

        + + + + + diff --git a/documentation/MultiStore/index.html b/documentation/MultiStore/index.html new file mode 100644 index 000000000..40600373f --- /dev/null +++ b/documentation/MultiStore/index.html @@ -0,0 +1,73 @@ + + + Multi Store + + +
        Very alpha draft; document may contain design philosophy + and pointless asides as well as practical, useful information. +
        +

        Architecture

        +Each store has its own IS4C server. This server is responsible for +managing that store's lanes. One server may be denoted the Master +server. Functionally, all servers have the same software. The Master +server just gets to wear a special hat. +

        +The advantages of having what's basically a two tier system despite +three obvious tiers (lane, store server, master organization-wide server) +are flexibility in provisioning and robustness in the event of failure. +

        +A two store operation could purchase two store servers, one for each store, +and simply denote on of them master. Alternatively, they could purchase +three store servers, one for each store and a third with no actual lanes of +its own to act as master. In the two store, three server set up, the +organization can temporarily cope with any single hardware failure with simple configuration +changes; there's no additional software to install. +

        Configuration

        +There's a Stores link at the top of Fannie's configuration. Each store server +has its own copy of Fannie and own unique configuration file. Configuration for each +server is as follows: +
          +
        1. Enter the number of other stores and re-run to expose additional fields. Remember, +a dedicated master server counts as a store, too.
        2. +
        3. Enter databse connection information for the other stores. Technically, only the +master store needs to know about all stores; the other stores just need to know how +to reach the master.
        4. +
        5. Mark which store server is the Master.
        6. +
        7. Enter the name of the archive database for the Master server.
        8. +
        9. Hit re-run again to save additional configuration.
        10. +
        +

        Store => Master Transaction Info

        +Since the Master Store is functionally identical to other stores, transaction data +is archived in the same way. Snapshot tables exist for each month and the transarchive +table holds the previous 90 days. If the master server is a dedicated machine with +no lanes, dtransactions will simply be empty. See DBA docs for more info on transaction +archive structure. +

        +The provided cron script nightly.hq.dtrans.php will transfer transaction data from a store +to the master database. First it creates a temporary table on the master server. This table +is named based on the store's IP. If multiple stores are sending data to master simultaneously +and different store servers have the same IP, this could go haywire. Give your store servers +different IPs. The store then copies its dtransactions to the temporary table on master. +

        +Next the script copies data from the temporary table into transarchive and the appropriate monthly +snapshot. Finally it drops the temporary table. Overall, using a temporary table should be slightly +faster since data only goes over the network once. The extra, unique table also simplifies concurrency +issues if multiple stores are submitting transaction data to master simultaneously. +

        +Misc: this job should happen before the store's local transaction archiving, or dtransactions +will be empty. This also copies data one record at a time to accomodate WFC's mess of a +store server on SQL Server + Windows and a master server on MySQL + OS X (and the Apache side of +Fannie on CentOS for maximum platform inconsistency... er platform independence...). Piping +mysqldump would probably be faster if all machines are MySQL, but current performance is +still only 30-40 seconds, tops. +

        Syncing Operational Data

        +Manual syncing is accessible from Fannie. Click Synchronize, then Synch Stores. +Options depend on whether you're at the master store. You can send a table: +
          +
        • From master to all other stores
        • +
        • From master to a single store
        • +
        • From a regular store to the master store
        • +
        +This tool replaces data at the destination store(s) rather than adds to it. + + diff --git a/documentation/Packaging/building.html b/documentation/Packaging/building.html new file mode 100644 index 000000000..eba0dae22 --- /dev/null +++ b/documentation/Packaging/building.html @@ -0,0 +1,70 @@ + + + Packaging + + +The dist directory contains files & scripts for +building distributable packages. +

        RPM packaging

        +Tools for making rpms are in dist/rpm. To build, go +to that directory and run one of the two shell scripts. +
          +
        • setup-here.sh requires one argument, a version number. +It builds an appropriate source tarball,modifies the spec file +and sets a user config file (~/.rpmmacros) to use this directory.
        • +
        • just-prep.sh is for users that already have their own +rpm build environment. It also takes one argument, a version number, +and simply produces an appropriate source tarball and spec file for +use elsewhere.
        • +
        +The build doesn't have any requirements other than rpmbuild itself (note: +if you have trouble finding it, the OS package containing rpmbuild +is often hyphenated as rpm-build.) The whole procedure looks like this +
        +$ ./setup-here.sh
        +$ rpmbuild -ba SPECS/it-core.spec
        +
        +This creates four RPMs. Paths given below are typical and may vary on some +distributions: +
          +
        • it-core contains the license (/usr/share/it-core/license) and +an apache config directive to point http://localhost/it-core at +/usr/share/it-core. This directory is chosen to comply with Red Hat +packaging guidelines for web applications, should IT CORE ever be submitted +for formal inclusion in a distribution.
        • +
        • it-core-doc contains the documentation and installs to +/usr/share/it-core/documentation
        • +
        • it-core-fannie contains the backend and installs to +/usr/share/it-core/fannie. This package also assigns appropriate config +file permissions.
        • +
        • it-core-is4c-nf contains the front-end and installs to +/usr/share/it-core/is4c-nf. This package also assigns appropriate config +file permissions.
        • +
        +All RPMs require PHP 5+, Apache 2+, MySQL 5+, and php-mysql. The subpackages +each require the main it-core but are otherwise independent. +

        +Installation would look like this: +

        +$ cd BUILD/noarch
        +$ sudo rpm -Uvh it-core-<version>.rpm
        +$ sudo /etc/init.d/httpd restart
        +$ sudo rpm -Uvh it-core-doc-<version>.rpm
        +$ sudo rpm -Uvh it-core-fannie-<version>.rpm
        +$ sudo rpm -Uvh it-core-is4c-nf-<version>.rpm
        +
        +Any of the last three lines could be omitted, although omitting all three would +be kind of silly. +

        DEB Packaging

        +The dist/deb contains a single alien-based script for converting .rpm files +to .deb files. To create deb packges: +
          +
        1. Set up a dkpg+alien environment ($deity help you if you're on an rpm-based system +and have to do this from source packages)
        2. +
        3. Build RPMs under dist/rpm as described above.
        4. +
        5. Go to dist/deb and run the make-debs.sh script. This script requires +both a version number and a build number (e.g., if the RPM is it-core-0.1.0-1.noarch.rpm, +run make-debs.sh 0.1.0 1).
        6. +
        + + diff --git a/documentation/Packaging/index.html b/documentation/Packaging/index.html new file mode 100644 index 000000000..9bdb15e78 --- /dev/null +++ b/documentation/Packaging/index.html @@ -0,0 +1,12 @@ + + + Packaging + + + + + diff --git a/documentation/Packaging/install-deb.html b/documentation/Packaging/install-deb.html new file mode 100644 index 000000000..54b7b7d64 --- /dev/null +++ b/documentation/Packaging/install-deb.html @@ -0,0 +1,85 @@ + + + Install Guide: DEB + + +This guide is for installing it-core from DEBs. These instructions +are based on Ubuntu, but should work on any Debian-ish distro. +

        +This mostly command-line references. Be not afraid. It's just more +concise and accurate than verbally describing graphic interfaces. +

        +

        Step one

        +Install your OS. If your chosen distribution doesn't have good +documentation for this step, choose a new distribution. +

        +

        Step two

        +Install some required packages. +
        +$ sudo apt-get install apache2 mysql-server php5 php5-mysql php5-ldap php5-cli php5-curl php-pear
        +
        +The first command, sudo, changes to the root user. You will be prompted for +root's password. The remainder installs a bunch of packages via apt, Debian's +package manager. The install process prompts you to set up a mysql password. +

        Step three

        +Download and install it-core. Your filenames may differ slightly, depending on +the version number. +
        +$ sudo dpkg -i it-core-0.1.0-1_all.deb
        +$ sudo dpkg -i it-core-doc-0.1.0-1_all.deb
        +$ sudo dpkg -i it-core-fannie-0.1.0-1_all.deb
        +$ sudo dpkg -i it-core-is4c-nf-0.1.0-1_all.deb
        +
        +These commands should be run as root. The base it-core package is always +required. The it-core-doc package is just documentation and thus always +optional. The it-core-fannie package contains the backend server; it-core-is4c-nf +contains the lane point of sale system. Neither is strictly required, but +omitting both wouldn't make much sense. +

        Step four

        +Start required services +
        +$ sudo /etc/init.d/mysql start
        +$ sudo update-rc.d mysql defaults 
        +
        +The first command starts the mysql database. The second makes mysql start +automatically when the machine boots. Now do the same for apache. +
        +$ sudo /etc/init.d/apache2 start
        +$ sudo update-rc.d apache2 defaults
        +
        +

        Step five

        +Open a browser and go to http://localhost/it-core/. You should see at least a +license as well as documentation, fannie, and/or is4c-nf folders depending +on what you installed. +
        +

        Further ideas (Production environment)

        +
          +
        • You probably want a static IP address. Go to System Settings => Internet and Network +=> Network Connections (if your menu is different, try running nm-connection-editor +from the command line). Pick the appropriate connection - wired is recommended +- and edit.
        • +
        • You probably want SSH access. Ubuntu does not include it by default. +
          +$ sudo apt-get install openssh-server
          +$ sudo /etc/init.d/ssh start
          +$ sudo update-rc.d ssh defaults
          +
          +
        • +
        • VNC can be useful for remote debugging. Go to System Settings => +Internet and Network => Remote Desktop (if your menu is different, try running +vino-preferences from the command line). Turn on sharing. Security options +are up to you. A password is recommended. Automatically accepting connections +is not recommended. Tunneling VNC through SSH is more secure. +
        • +
        • Setting up a firewall is probably a good idea. +
          +$ sudo ufw enable
          +$ sudo ufw default deny
          +$ sudo ufw allow ssh
          +$ sudo ufw allow from 127.0.0.1
          +
          +In order this turns on the firewall, denies all access by default, permits remote access via SSH, and permits full access locally. +
        • +
        + + diff --git a/documentation/Packaging/install-rpm.html b/documentation/Packaging/install-rpm.html new file mode 100644 index 000000000..fe6569180 --- /dev/null +++ b/documentation/Packaging/install-rpm.html @@ -0,0 +1,127 @@ + + + Install Guide: RPM + + +This guide is for installing it-core from RPMs. These instructions +are based on Fedora, but should work on any Redhat-ish distro. +

        +This mostly command-line references. Be not afraid. It's just more +concise and accurate than verbally describing graphic interfaces. +

        +

        Step one

        +Install your OS. If your chosen distribution doesn't have good +documentation for this step, choose a new distribution. +

        +If your distro includes SELinux (Fedora, CentOS, and Red Hat Enterprise +all do), disable it. There's no GUI for this. Edit /etc/sysconfig/selinux +and change the line: +

        +SELINUX=enforcing
        +
        +to +
        +SELINUX=disabled
        +
        +This will fix a lot of permission headaches. You have to reboot +for the change to take effect. +

        Step two

        +Install some required packages. +
        +$ su
        +# yum -y install httpd mysql-server php php-mysql php-xml php-pear php-ldap php-process
        +
        +The first command, su, changes to the root user. You will be prompted for +root's password. The second command install a bunch of packages via +Red Hat package manager, yum. +

        Step three

        +Download and install it-core. Your filenames may differ slightly, depending on +the version number. +
        +# rpm -Uvh it-core-0.1.0-1.noarch.rpm
        +# rpm -Uvh it-core-doc-0.1.0-1.noarch.rpm
        +# rpm -Uvh it-core-fannie-0.1.0-1.noarch.rpm
        +# rpm -Uvh it-core-is4c-nf-0.1.0-1.noarch.rpm
        +
        +These commands should be run as root. The base it-core package is always +required. The it-core-doc package is just documentation and thus always +optional. The it-core-fannie package contains the backend server; it-core-is4c-nf +contains the lane point of sale system. Neither is strictly required, but +omitting both wouldn't make much sense. +

        Step four

        +Start required services +
        +# /etc/init.d/mysqld start
        +# mysqladmin password
        +# /etc/init.d/mysqld restart
        +# /sbin/chkconfig mysqld on
        +
        +The first command starts the mysql database. The second sets a root password. The +third command just restarts the database so the password change takes affect. +The fourth sets the database to automatically run on boot. Next is apache: +
        +# /etc/init.d/httpd start
        +# /sbin/chkconfig httpd on
        +
        +This one's simpler. Start the service, configure it to start on boot. +

        Step five

        +Open a browser and go to http://localhost/it-core/. You should see at least a +license as well as documentation, fannie, and/or is4c-nf folders depending +on what you installed. +
        +

        Further ideas (Production environment)

        +
          +
        • You probably want a static IP address. Go to Applications => Other +=> Network (if your menu is different, try running nm-connection-editor +from the command line). Pick the appropriate connection - wired is recommended +- and edit.
        • +
        • You probably want SSH access through the firewall. Go to Applications => +Other => Firewall (if your menu is different, try running system-config-firewall +from the command line). Scroll down services and check the box for SSH. If it's +already checked, toggle it off then back on just to be sure. Hit Apply to save +the updated rules, then Reload to restart the firewall. Linux veterans +can find the firewall configuration file at /etc/sysconfig/iptables. +
        • +
        • You'll need remote MySQL access. First allow port 3306 through the firewall +(see SSH above). Then make some modifications via MySQL itself: +
          +$ mysql -u root -p -h localhost
          +> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password';
          +> FLUSH PRIVILEGES
          +> EXIT
          +
          +
        • +
        • VNC can be useful for remote debugging. Go to Applications => +Other => Remote Desktop (if your menu is different, try running +vino-preferences from the command line). Turn on sharing. Security options +are up to you. A password is recommended. Automatically accepting connections +is not recommended. Depending on your network setup, allowing port 5900 through the +see SSH above) might make sense.
        • + +
        +
        +

        Troubleshooting

        +An unsorted collection of gotchas as I discover them: +
          +
        • Printer isn't working: I've had issues with Fedora auto-detecting printers. +Maybe the cutting edge cool kids don't use parallel ports anymore. Look in +/dev. If you see a file lp0, that's the printer (which is good). If you just see +a file parport0, you've got a parallel port but no printer (if there's no parport, +maybe the parallel port is disabled in your BIOS). Open up a terminal and try: +
          +# /sbin/modprobe lp
          +
          +This should create the /dev/lp0 file. To make this happen on boot, paste this into +/etc/sysconfig/modules/lp.modules: +
          +#!/bin/sh
          +
          +if [ ! -c /dev/lp0 ] ; then
          +        exec /sbin/modprobe lp >/dev/null 2>&1
          +fi
          +
          +Save the file and make it executable (chmod +x /etc/sysconfig/modules/lp.modules). +
        • +
        + + diff --git a/pos/backend/admin/index.php b/documentation/Reference Code/Wedge/backend/admin/index.php similarity index 100% rename from pos/backend/admin/index.php rename to documentation/Reference Code/Wedge/backend/admin/index.php diff --git a/pos/backend/batch/batch.css b/documentation/Reference Code/Wedge/backend/batch/batch.css similarity index 100% rename from pos/backend/batch/batch.css rename to documentation/Reference Code/Wedge/backend/batch/batch.css diff --git a/pos/backend/batch/batch.js b/documentation/Reference Code/Wedge/backend/batch/batch.js similarity index 100% rename from pos/backend/batch/batch.js rename to documentation/Reference Code/Wedge/backend/batch/batch.js diff --git a/pos/backend/batch/edit.php b/documentation/Reference Code/Wedge/backend/batch/edit.php similarity index 100% rename from pos/backend/batch/edit.php rename to documentation/Reference Code/Wedge/backend/batch/edit.php diff --git a/pos/backend/batch/index.php b/documentation/Reference Code/Wedge/backend/batch/index.php similarity index 100% rename from pos/backend/batch/index.php rename to documentation/Reference Code/Wedge/backend/batch/index.php diff --git a/pos/backend/batch/sql.php b/documentation/Reference Code/Wedge/backend/batch/sql.php similarity index 100% rename from pos/backend/batch/sql.php rename to documentation/Reference Code/Wedge/backend/batch/sql.php diff --git a/pos/backend/define.conf b/documentation/Reference Code/Wedge/backend/define.conf similarity index 100% rename from pos/backend/define.conf rename to documentation/Reference Code/Wedge/backend/define.conf diff --git a/pos/backend/index.php b/documentation/Reference Code/Wedge/backend/index.php similarity index 100% rename from pos/backend/index.php rename to documentation/Reference Code/Wedge/backend/index.php diff --git a/pos/backend/item/form.php b/documentation/Reference Code/Wedge/backend/item/form.php similarity index 100% rename from pos/backend/item/form.php rename to documentation/Reference Code/Wedge/backend/item/form.php diff --git a/pos/backend/item/index.php b/documentation/Reference Code/Wedge/backend/item/index.php similarity index 100% rename from pos/backend/item/index.php rename to documentation/Reference Code/Wedge/backend/item/index.php diff --git a/pos/backend/item/item.css b/documentation/Reference Code/Wedge/backend/item/item.css similarity index 100% rename from pos/backend/item/item.css rename to documentation/Reference Code/Wedge/backend/item/item.css diff --git a/pos/backend/item/item.js b/documentation/Reference Code/Wedge/backend/item/item.js similarity index 100% rename from pos/backend/item/item.js rename to documentation/Reference Code/Wedge/backend/item/item.js diff --git a/pos/backend/item/results.php b/documentation/Reference Code/Wedge/backend/item/results.php similarity index 100% rename from pos/backend/item/results.php rename to documentation/Reference Code/Wedge/backend/item/results.php diff --git a/pos/backend/item/sql.php b/documentation/Reference Code/Wedge/backend/item/sql.php similarity index 100% rename from pos/backend/item/sql.php rename to documentation/Reference Code/Wedge/backend/item/sql.php diff --git a/pos/backend/label/Screenshot.png b/documentation/Reference Code/Wedge/backend/label/Screenshot.png similarity index 100% rename from pos/backend/label/Screenshot.png rename to documentation/Reference Code/Wedge/backend/label/Screenshot.png diff --git a/pos/backend/label/index.php b/documentation/Reference Code/Wedge/backend/label/index.php similarity index 100% rename from pos/backend/label/index.php rename to documentation/Reference Code/Wedge/backend/label/index.php diff --git a/pos/backend/lib/materialized_batch.php b/documentation/Reference Code/Wedge/backend/lib/materialized_batch.php similarity index 100% rename from pos/backend/lib/materialized_batch.php rename to documentation/Reference Code/Wedge/backend/lib/materialized_batch.php diff --git a/pos/backend/lib/table_batchHeaders.php b/documentation/Reference Code/Wedge/backend/lib/table_batchHeaders.php similarity index 100% rename from pos/backend/lib/table_batchHeaders.php rename to documentation/Reference Code/Wedge/backend/lib/table_batchHeaders.php diff --git a/pos/backend/lib/table_batchTypes.php b/documentation/Reference Code/Wedge/backend/lib/table_batchTypes.php similarity index 100% rename from pos/backend/lib/table_batchTypes.php rename to documentation/Reference Code/Wedge/backend/lib/table_batchTypes.php diff --git a/pos/backend/lib/table_departments.php b/documentation/Reference Code/Wedge/backend/lib/table_departments.php similarity index 100% rename from pos/backend/lib/table_departments.php rename to documentation/Reference Code/Wedge/backend/lib/table_departments.php diff --git a/pos/backend/lib/table_subdepts.php b/documentation/Reference Code/Wedge/backend/lib/table_subdepts.php similarity index 100% rename from pos/backend/lib/table_subdepts.php rename to documentation/Reference Code/Wedge/backend/lib/table_subdepts.php diff --git a/pos/backend/src/htmlparts.php b/documentation/Reference Code/Wedge/backend/src/htmlparts.php similarity index 100% rename from pos/backend/src/htmlparts.php rename to documentation/Reference Code/Wedge/backend/src/htmlparts.php diff --git a/pos/backend/src/images/store.png b/documentation/Reference Code/Wedge/backend/src/images/store.png similarity index 100% rename from pos/backend/src/images/store.png rename to documentation/Reference Code/Wedge/backend/src/images/store.png diff --git a/pos/backend/src/screen.css b/documentation/Reference Code/Wedge/backend/src/screen.css similarity index 100% rename from pos/backend/src/screen.css rename to documentation/Reference Code/Wedge/backend/src/screen.css diff --git a/pos/backend/sync/index.php b/documentation/Reference Code/Wedge/backend/sync/index.php similarity index 100% rename from pos/backend/sync/index.php rename to documentation/Reference Code/Wedge/backend/sync/index.php diff --git a/pos/backend/sync/reload.php b/documentation/Reference Code/Wedge/backend/sync/reload.php similarity index 100% rename from pos/backend/sync/reload.php rename to documentation/Reference Code/Wedge/backend/sync/reload.php diff --git a/pos/backend/sync/synchronize.php b/documentation/Reference Code/Wedge/backend/sync/synchronize.php similarity index 100% rename from pos/backend/sync/synchronize.php rename to documentation/Reference Code/Wedge/backend/sync/synchronize.php diff --git a/pos/backend/sync/synchronizeproducts.php b/documentation/Reference Code/Wedge/backend/sync/synchronizeproducts.php similarity index 100% rename from pos/backend/sync/synchronizeproducts.php rename to documentation/Reference Code/Wedge/backend/sync/synchronizeproducts.php diff --git a/pos/db_connect b/documentation/Reference Code/Wedge/db_connect similarity index 100% rename from pos/db_connect rename to documentation/Reference Code/Wedge/db_connect diff --git a/pos/installation/get-lane.sh b/documentation/Reference Code/Wedge/installation/get-lane.sh similarity index 100% rename from pos/installation/get-lane.sh rename to documentation/Reference Code/Wedge/installation/get-lane.sh diff --git a/pos/installation/get-server.sh b/documentation/Reference Code/Wedge/installation/get-server.sh similarity index 100% rename from pos/installation/get-server.sh rename to documentation/Reference Code/Wedge/installation/get-server.sh diff --git a/pos/installation/install_lane.py b/documentation/Reference Code/Wedge/installation/install_lane.py similarity index 100% rename from pos/installation/install_lane.py rename to documentation/Reference Code/Wedge/installation/install_lane.py diff --git a/pos/installation/install_server.py b/documentation/Reference Code/Wedge/installation/install_server.py similarity index 100% rename from pos/installation/install_server.py rename to documentation/Reference Code/Wedge/installation/install_server.py diff --git a/pos/installation/installers.py b/documentation/Reference Code/Wedge/installation/installers.py similarity index 100% rename from pos/installation/installers.py rename to documentation/Reference Code/Wedge/installation/installers.py diff --git a/pos/installation/mysql/is4c_log/tables/activitylog.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/activitylog.table similarity index 100% rename from pos/installation/mysql/is4c_log/tables/activitylog.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/activitylog.table diff --git a/pos/installation/mysql/is4c_log/tables/batchMerges.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/batchMerges.table similarity index 100% rename from pos/installation/mysql/is4c_log/tables/batchMerges.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/batchMerges.table diff --git a/pos/installation/mysql/is4c_log/tables/dtransactions.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/dtransactions.table similarity index 100% rename from pos/installation/mysql/is4c_log/tables/dtransactions.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/dtransactions.table diff --git a/pos/installation/mysql/is4c_log/tables/productsLog.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/productsLog.table similarity index 100% rename from pos/installation/mysql/is4c_log/tables/productsLog.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/productsLog.table diff --git a/pos/installation/mysql/is4c_log/tables/suspended.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/suspended.table similarity index 100% rename from pos/installation/mysql/is4c_log/tables/suspended.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/suspended.table diff --git a/pos/installation/mysql/is4c_log/tables/synchronizationLog.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/synchronizationLog.table similarity index 100% rename from pos/installation/mysql/is4c_log/tables/synchronizationLog.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/tables/synchronizationLog.table diff --git a/pos/installation/mysql/is4c_log/views/buspasstotals.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/buspasstotals.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/buspasstotals.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/buspasstotals.viw diff --git a/pos/installation/mysql/is4c_log/views/cctenders.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cctenders.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/cctenders.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cctenders.viw diff --git a/pos/installation/mysql/is4c_log/views/cctendertotal.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cctendertotal.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/cctendertotal.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cctendertotal.viw diff --git a/pos/installation/mysql/is4c_log/views/cktenders.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cktenders.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/cktenders.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cktenders.viw diff --git a/pos/installation/mysql/is4c_log/views/cktendertotal.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cktendertotal.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/cktendertotal.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/cktendertotal.viw diff --git a/pos/installation/mysql/is4c_log/views/dctenders.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/dctenders.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/dctenders.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/dctenders.viw diff --git a/pos/installation/mysql/is4c_log/views/dctendertotal.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/dctendertotal.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/dctendertotal.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/dctendertotal.viw diff --git a/pos/installation/mysql/is4c_log/views/dlog.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/dlog.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/dlog.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/dlog.viw diff --git a/pos/installation/mysql/is4c_log/views/fstenders.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/fstenders.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/fstenders.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/fstenders.viw diff --git a/pos/installation/mysql/is4c_log/views/fstendertotal.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/fstendertotal.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/fstendertotal.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/fstendertotal.viw diff --git a/pos/installation/mysql/is4c_log/views/memchargebalance.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/memchargebalance.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/memchargebalance.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/memchargebalance.viw diff --git a/pos/installation/mysql/is4c_log/views/memchargetotals.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/memchargetotals.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/memchargetotals.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/memchargetotals.viw diff --git a/pos/installation/mysql/is4c_log/views/mitenders.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/mitenders.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/mitenders.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/mitenders.viw diff --git a/pos/installation/mysql/is4c_log/views/mitendertotal.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/mitendertotal.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/mitendertotal.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/mitendertotal.viw diff --git a/pos/installation/mysql/is4c_log/views/suspendedtoday.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/suspendedtoday.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/suspendedtoday.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/suspendedtoday.viw diff --git a/pos/installation/mysql/is4c_log/views/tendertape.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/tendertape.viw similarity index 100% rename from pos/installation/mysql/is4c_log/views/tendertape.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_log/views/tendertape.viw diff --git a/pos/installation/mysql/is4c_op/data/batchHeaders.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/batchHeaders.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/batchHeaders.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/batchHeaders.insert diff --git a/pos/installation/mysql/is4c_op/data/batchTypes.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/batchTypes.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/batchTypes.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/batchTypes.insert diff --git a/pos/installation/mysql/is4c_op/data/custdata.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/custdata.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/custdata.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/custdata.insert diff --git a/pos/installation/mysql/is4c_op/data/departments.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/departments.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/departments.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/departments.insert diff --git a/pos/installation/mysql/is4c_op/data/employees.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/employees.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/employees.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/employees.insert diff --git a/pos/installation/mysql/is4c_op/data/globalvalues.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/globalvalues.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/globalvalues.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/globalvalues.insert diff --git a/pos/installation/mysql/is4c_op/data/memtype.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/memtype.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/memtype.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/memtype.insert diff --git a/pos/installation/mysql/is4c_op/data/products.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/products.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/products.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/products.insert diff --git a/pos/installation/mysql/is4c_op/data/subdepts.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/subdepts.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/subdepts.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/subdepts.insert diff --git a/pos/installation/mysql/is4c_op/data/tenders.insert b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/tenders.insert similarity index 100% rename from pos/installation/mysql/is4c_op/data/tenders.insert rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/data/tenders.insert diff --git a/pos/installation/mysql/is4c_op/tables/UNFI.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/UNFI.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/UNFI.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/UNFI.table diff --git a/pos/installation/mysql/is4c_op/tables/batchHeaders.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/batchHeaders.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/batchHeaders.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/batchHeaders.table diff --git a/pos/installation/mysql/is4c_op/tables/batchProducts.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/batchProducts.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/batchProducts.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/batchProducts.table diff --git a/pos/installation/mysql/is4c_op/tables/batchTypes.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/batchTypes.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/batchTypes.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/batchTypes.table diff --git a/pos/installation/mysql/is4c_op/tables/brands.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/brands.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/brands.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/brands.table diff --git a/pos/installation/mysql/is4c_op/tables/chargecode.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/chargecode.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/chargecode.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/chargecode.table diff --git a/pos/installation/mysql/is4c_op/tables/couponcodes.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/couponcodes.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/couponcodes.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/couponcodes.table diff --git a/pos/installation/mysql/is4c_op/tables/custdata.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/custdata.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/custdata.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/custdata.table diff --git a/pos/installation/mysql/is4c_op/tables/departments.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/departments.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/departments.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/departments.table diff --git a/pos/installation/mysql/is4c_op/tables/employees.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/employees.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/employees.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/employees.table diff --git a/pos/installation/mysql/is4c_op/tables/error_log.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/error_log.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/error_log.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/error_log.table diff --git a/pos/installation/mysql/is4c_op/tables/globalvalues.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/globalvalues.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/globalvalues.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/globalvalues.table diff --git a/pos/installation/mysql/is4c_op/tables/likecodes.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/likecodes.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/likecodes.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/likecodes.table diff --git a/pos/installation/mysql/is4c_op/tables/meminfo.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/meminfo.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/meminfo.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/meminfo.table diff --git a/pos/installation/mysql/is4c_op/tables/memtype.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/memtype.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/memtype.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/memtype.table diff --git a/pos/installation/mysql/is4c_op/tables/newMembers.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/newMembers.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/newMembers.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/newMembers.table diff --git a/pos/installation/mysql/is4c_op/tables/prodUpdate.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/prodUpdate.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/prodUpdate.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/prodUpdate.table diff --git a/pos/installation/mysql/is4c_op/tables/products.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/products.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/products.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/products.table diff --git a/pos/installation/mysql/is4c_op/tables/promomsgs.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/promomsgs.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/promomsgs.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/promomsgs.table diff --git a/pos/installation/mysql/is4c_op/tables/subdepts.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/subdepts.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/subdepts.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/subdepts.table diff --git a/pos/installation/mysql/is4c_op/tables/tenders.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/tenders.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/tenders.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/tenders.table diff --git a/pos/installation/mysql/is4c_op/tables/upclike.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/upclike.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/upclike.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/upclike.table diff --git a/pos/installation/mysql/is4c_op/tables/vendors.table b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/vendors.table similarity index 100% rename from pos/installation/mysql/is4c_op/tables/vendors.table rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/tables/vendors.table diff --git a/pos/installation/mysql/is4c_op/views/chargecodeview.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/chargecodeview.viw similarity index 100% rename from pos/installation/mysql/is4c_op/views/chargecodeview.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/chargecodeview.viw diff --git a/pos/installation/mysql/is4c_op/views/memchargebalance.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/memchargebalance.viw similarity index 100% rename from pos/installation/mysql/is4c_op/views/memchargebalance.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/memchargebalance.viw diff --git a/pos/installation/mysql/is4c_op/views/subdeptIndex.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/subdeptIndex.viw similarity index 100% rename from pos/installation/mysql/is4c_op/views/subdeptIndex.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/subdeptIndex.viw diff --git a/pos/installation/mysql/is4c_op/views/volunteerDiscounts.viw b/documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/volunteerDiscounts.viw similarity index 100% rename from pos/installation/mysql/is4c_op/views/volunteerDiscounts.viw rename to documentation/Reference Code/Wedge/installation/mysql/is4c_op/views/volunteerDiscounts.viw diff --git a/pos/installation/mysql/opdata/data/configuration.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/configuration.insert similarity index 100% rename from pos/installation/mysql/opdata/data/configuration.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/configuration.insert diff --git a/pos/installation/mysql/opdata/data/configurationGroups.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/configurationGroups.insert similarity index 100% rename from pos/installation/mysql/opdata/data/configurationGroups.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/configurationGroups.insert diff --git a/pos/installation/mysql/opdata/data/couponcodes.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/couponcodes.insert similarity index 100% rename from pos/installation/mysql/opdata/data/couponcodes.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/couponcodes.insert diff --git a/pos/installation/mysql/opdata/data/custdata.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/custdata.insert similarity index 100% rename from pos/installation/mysql/opdata/data/custdata.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/custdata.insert diff --git a/pos/installation/mysql/opdata/data/departments.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/departments.insert similarity index 100% rename from pos/installation/mysql/opdata/data/departments.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/departments.insert diff --git a/pos/installation/mysql/opdata/data/employees.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/employees.insert similarity index 100% rename from pos/installation/mysql/opdata/data/employees.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/employees.insert diff --git a/pos/installation/mysql/opdata/data/globalvalues.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/globalvalues.insert similarity index 100% rename from pos/installation/mysql/opdata/data/globalvalues.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/globalvalues.insert diff --git a/pos/installation/mysql/opdata/data/products.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/products.insert similarity index 100% rename from pos/installation/mysql/opdata/data/products.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/products.insert diff --git a/pos/installation/mysql/opdata/data/subdepts.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/subdepts.insert similarity index 100% rename from pos/installation/mysql/opdata/data/subdepts.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/subdepts.insert diff --git a/pos/installation/mysql/opdata/data/tenders.insert b/documentation/Reference Code/Wedge/installation/mysql/opdata/data/tenders.insert similarity index 100% rename from pos/installation/mysql/opdata/data/tenders.insert rename to documentation/Reference Code/Wedge/installation/mysql/opdata/data/tenders.insert diff --git a/pos/installation/mysql/opdata/jobs/dayend b/documentation/Reference Code/Wedge/installation/mysql/opdata/jobs/dayend similarity index 100% rename from pos/installation/mysql/opdata/jobs/dayend rename to documentation/Reference Code/Wedge/installation/mysql/opdata/jobs/dayend diff --git a/pos/installation/mysql/opdata/jobs/dayendreset b/documentation/Reference Code/Wedge/installation/mysql/opdata/jobs/dayendreset similarity index 100% rename from pos/installation/mysql/opdata/jobs/dayendreset rename to documentation/Reference Code/Wedge/installation/mysql/opdata/jobs/dayendreset diff --git a/pos/installation/mysql/opdata/tables/chargecode.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/chargecode.table similarity index 100% rename from pos/installation/mysql/opdata/tables/chargecode.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/chargecode.table diff --git a/pos/installation/mysql/opdata/tables/configuration.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/configuration.table similarity index 100% rename from pos/installation/mysql/opdata/tables/configuration.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/configuration.table diff --git a/pos/installation/mysql/opdata/tables/configurationGroups.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/configurationGroups.table similarity index 100% rename from pos/installation/mysql/opdata/tables/configurationGroups.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/configurationGroups.table diff --git a/pos/installation/mysql/opdata/tables/couponcodes.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/couponcodes.table similarity index 100% rename from pos/installation/mysql/opdata/tables/couponcodes.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/couponcodes.table diff --git a/pos/installation/mysql/opdata/tables/custdata.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/custdata.table similarity index 100% rename from pos/installation/mysql/opdata/tables/custdata.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/custdata.table diff --git a/pos/installation/mysql/opdata/tables/departments.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/departments.table similarity index 100% rename from pos/installation/mysql/opdata/tables/departments.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/departments.table diff --git a/pos/installation/mysql/opdata/tables/employees.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/employees.table similarity index 100% rename from pos/installation/mysql/opdata/tables/employees.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/employees.table diff --git a/pos/installation/mysql/opdata/tables/globalvalues.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/globalvalues.table similarity index 100% rename from pos/installation/mysql/opdata/tables/globalvalues.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/globalvalues.table diff --git a/pos/installation/mysql/opdata/tables/products.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/products.table similarity index 100% rename from pos/installation/mysql/opdata/tables/products.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/products.table diff --git a/pos/installation/mysql/opdata/tables/promomsgs.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/promomsgs.table similarity index 100% rename from pos/installation/mysql/opdata/tables/promomsgs.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/promomsgs.table diff --git a/pos/installation/mysql/opdata/tables/tenders.table b/documentation/Reference Code/Wedge/installation/mysql/opdata/tables/tenders.table similarity index 100% rename from pos/installation/mysql/opdata/tables/tenders.table rename to documentation/Reference Code/Wedge/installation/mysql/opdata/tables/tenders.table diff --git a/pos/installation/mysql/opdata/views/chargecodeview.viw b/documentation/Reference Code/Wedge/installation/mysql/opdata/views/chargecodeview.viw similarity index 100% rename from pos/installation/mysql/opdata/views/chargecodeview.viw rename to documentation/Reference Code/Wedge/installation/mysql/opdata/views/chargecodeview.viw diff --git a/pos/installation/mysql/opdata/views/memchargebalance.viw b/documentation/Reference Code/Wedge/installation/mysql/opdata/views/memchargebalance.viw similarity index 100% rename from pos/installation/mysql/opdata/views/memchargebalance.viw rename to documentation/Reference Code/Wedge/installation/mysql/opdata/views/memchargebalance.viw diff --git a/pos/installation/mysql/script/create_lane_acct.sql b/documentation/Reference Code/Wedge/installation/mysql/script/create_lane_acct.sql similarity index 100% rename from pos/installation/mysql/script/create_lane_acct.sql rename to documentation/Reference Code/Wedge/installation/mysql/script/create_lane_acct.sql diff --git a/pos/installation/mysql/script/create_lane_db.sql b/documentation/Reference Code/Wedge/installation/mysql/script/create_lane_db.sql similarity index 100% rename from pos/installation/mysql/script/create_lane_db.sql rename to documentation/Reference Code/Wedge/installation/mysql/script/create_lane_db.sql diff --git a/pos/installation/mysql/script/create_server_acct.sql b/documentation/Reference Code/Wedge/installation/mysql/script/create_server_acct.sql similarity index 100% rename from pos/installation/mysql/script/create_server_acct.sql rename to documentation/Reference Code/Wedge/installation/mysql/script/create_server_acct.sql diff --git a/pos/installation/mysql/script/create_server_db.sql b/documentation/Reference Code/Wedge/installation/mysql/script/create_server_db.sql similarity index 100% rename from pos/installation/mysql/script/create_server_db.sql rename to documentation/Reference Code/Wedge/installation/mysql/script/create_server_db.sql diff --git a/pos/installation/mysql/translog/tables/activities.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/activities.table similarity index 100% rename from pos/installation/mysql/translog/tables/activities.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/activities.table diff --git a/pos/installation/mysql/translog/tables/activitylog.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/activitylog.table similarity index 100% rename from pos/installation/mysql/translog/tables/activitylog.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/activitylog.table diff --git a/pos/installation/mysql/translog/tables/activitytemplog.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/activitytemplog.table similarity index 100% rename from pos/installation/mysql/translog/tables/activitytemplog.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/activitytemplog.table diff --git a/pos/installation/mysql/translog/tables/alog.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/alog.table similarity index 100% rename from pos/installation/mysql/translog/tables/alog.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/alog.table diff --git a/pos/installation/mysql/translog/tables/dtransactions.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/dtransactions.table similarity index 100% rename from pos/installation/mysql/translog/tables/dtransactions.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/dtransactions.table diff --git a/pos/installation/mysql/translog/tables/localtemptrans.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/localtemptrans.table similarity index 100% rename from pos/installation/mysql/translog/tables/localtemptrans.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/localtemptrans.table diff --git a/pos/installation/mysql/translog/tables/localtrans.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/localtrans.table similarity index 100% rename from pos/installation/mysql/translog/tables/localtrans.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/localtrans.table diff --git a/pos/installation/mysql/translog/tables/localtransarchive.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/localtransarchive.table similarity index 100% rename from pos/installation/mysql/translog/tables/localtransarchive.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/localtransarchive.table diff --git a/pos/installation/mysql/translog/tables/suspended.table b/documentation/Reference Code/Wedge/installation/mysql/translog/tables/suspended.table similarity index 100% rename from pos/installation/mysql/translog/tables/suspended.table rename to documentation/Reference Code/Wedge/installation/mysql/translog/tables/suspended.table diff --git a/pos/installation/mysql/translog/views/localtranstoday.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/localtranstoday.viw similarity index 100% rename from pos/installation/mysql/translog/views/localtranstoday.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/localtranstoday.viw diff --git a/pos/installation/mysql/translog/views/ltt_receipt.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/ltt_receipt.viw similarity index 100% rename from pos/installation/mysql/translog/views/ltt_receipt.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/ltt_receipt.viw diff --git a/pos/installation/mysql/translog/views/lttsubtotals.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/lttsubtotals.viw similarity index 100% rename from pos/installation/mysql/translog/views/lttsubtotals.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/lttsubtotals.viw diff --git a/pos/installation/mysql/translog/views/lttsummary.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/lttsummary.viw similarity index 100% rename from pos/installation/mysql/translog/views/lttsummary.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/lttsummary.viw diff --git a/pos/installation/mysql/translog/views/memchargetotals.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/memchargetotals.viw similarity index 100% rename from pos/installation/mysql/translog/views/memchargetotals.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/memchargetotals.viw diff --git a/pos/installation/mysql/translog/views/memdiscountadd.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/memdiscountadd.viw similarity index 100% rename from pos/installation/mysql/translog/views/memdiscountadd.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/memdiscountadd.viw diff --git a/pos/installation/mysql/translog/views/memdiscountremove.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/memdiscountremove.viw similarity index 100% rename from pos/installation/mysql/translog/views/memdiscountremove.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/memdiscountremove.viw diff --git a/pos/installation/mysql/translog/views/receipt.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/receipt.viw similarity index 100% rename from pos/installation/mysql/translog/views/receipt.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/receipt.viw diff --git a/pos/installation/mysql/translog/views/rp_list.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_list.viw similarity index 100% rename from pos/installation/mysql/translog/views/rp_list.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_list.viw diff --git a/pos/installation/mysql/translog/views/rp_ltt_receipt.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_ltt_receipt.viw similarity index 100% rename from pos/installation/mysql/translog/views/rp_ltt_receipt.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_ltt_receipt.viw diff --git a/pos/installation/mysql/translog/views/rp_receipt.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_receipt.viw similarity index 100% rename from pos/installation/mysql/translog/views/rp_receipt.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_receipt.viw diff --git a/pos/installation/mysql/translog/views/rp_receipt_header.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_receipt_header.viw similarity index 100% rename from pos/installation/mysql/translog/views/rp_receipt_header.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/rp_receipt_header.viw diff --git a/pos/installation/mysql/translog/views/screendisplay.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/screendisplay.viw similarity index 100% rename from pos/installation/mysql/translog/views/screendisplay.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/screendisplay.viw diff --git a/pos/installation/mysql/translog/views/staffdiscountadd.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/staffdiscountadd.viw similarity index 100% rename from pos/installation/mysql/translog/views/staffdiscountadd.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/staffdiscountadd.viw diff --git a/pos/installation/mysql/translog/views/staffdiscountremove.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/staffdiscountremove.viw similarity index 100% rename from pos/installation/mysql/translog/views/staffdiscountremove.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/staffdiscountremove.viw diff --git a/pos/installation/mysql/translog/views/subtotals.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/subtotals.viw similarity index 100% rename from pos/installation/mysql/translog/views/subtotals.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/subtotals.viw diff --git a/pos/installation/mysql/translog/views/suspendedlist.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/suspendedlist.viw similarity index 100% rename from pos/installation/mysql/translog/views/suspendedlist.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/suspendedlist.viw diff --git a/pos/installation/mysql/translog/views/suspendedtoday.viw b/documentation/Reference Code/Wedge/installation/mysql/translog/views/suspendedtoday.viw similarity index 100% rename from pos/installation/mysql/translog/views/suspendedtoday.viw rename to documentation/Reference Code/Wedge/installation/mysql/translog/views/suspendedtoday.viw diff --git a/pos/installation/ubuntu/apache_lane.pl b/documentation/Reference Code/Wedge/installation/ubuntu/apache_lane.pl similarity index 100% rename from pos/installation/ubuntu/apache_lane.pl rename to documentation/Reference Code/Wedge/installation/ubuntu/apache_lane.pl diff --git a/pos/installation/ubuntu/apache_server.pl b/documentation/Reference Code/Wedge/installation/ubuntu/apache_server.pl similarity index 100% rename from pos/installation/ubuntu/apache_server.pl rename to documentation/Reference Code/Wedge/installation/ubuntu/apache_server.pl diff --git a/pos/installation/ubuntu/default.ubuntu b/documentation/Reference Code/Wedge/installation/ubuntu/default.ubuntu similarity index 100% rename from pos/installation/ubuntu/default.ubuntu rename to documentation/Reference Code/Wedge/installation/ubuntu/default.ubuntu diff --git a/pos/installation/ubuntu/install-lane.sh b/documentation/Reference Code/Wedge/installation/ubuntu/install-lane.sh similarity index 100% rename from pos/installation/ubuntu/install-lane.sh rename to documentation/Reference Code/Wedge/installation/ubuntu/install-lane.sh diff --git a/pos/installation/ubuntu/install-server.sh b/documentation/Reference Code/Wedge/installation/ubuntu/install-server.sh similarity index 100% rename from pos/installation/ubuntu/install-server.sh rename to documentation/Reference Code/Wedge/installation/ubuntu/install-server.sh diff --git a/pos/installation/ubuntu/is4c.conf b/documentation/Reference Code/Wedge/installation/ubuntu/is4c.conf similarity index 100% rename from pos/installation/ubuntu/is4c.conf rename to documentation/Reference Code/Wedge/installation/ubuntu/is4c.conf diff --git a/pos/installation/ubuntu/php_lane.pl b/documentation/Reference Code/Wedge/installation/ubuntu/php_lane.pl similarity index 100% rename from pos/installation/ubuntu/php_lane.pl rename to documentation/Reference Code/Wedge/installation/ubuntu/php_lane.pl diff --git a/pos/installation/ubuntu/php_server.pl b/documentation/Reference Code/Wedge/installation/ubuntu/php_server.pl similarity index 100% rename from pos/installation/ubuntu/php_server.pl rename to documentation/Reference Code/Wedge/installation/ubuntu/php_server.pl diff --git a/pos/installation/ubuntu/rclocal_lane.pl b/documentation/Reference Code/Wedge/installation/ubuntu/rclocal_lane.pl similarity index 100% rename from pos/installation/ubuntu/rclocal_lane.pl rename to documentation/Reference Code/Wedge/installation/ubuntu/rclocal_lane.pl diff --git a/pos/installation/ubuntu/ssd_server.sh b/documentation/Reference Code/Wedge/installation/ubuntu/ssd_server.sh similarity index 100% rename from pos/installation/ubuntu/ssd_server.sh rename to documentation/Reference Code/Wedge/installation/ubuntu/ssd_server.sh diff --git a/pos/installation/ubuntu/startssd.pl b/documentation/Reference Code/Wedge/installation/ubuntu/startssd.pl similarity index 100% rename from pos/installation/ubuntu/startssd.pl rename to documentation/Reference Code/Wedge/installation/ubuntu/startssd.pl diff --git a/pos/installation/ubuntu/ubuntu.php.ini b/documentation/Reference Code/Wedge/installation/ubuntu/ubuntu.php.ini similarity index 100% rename from pos/installation/ubuntu/ubuntu.php.ini rename to documentation/Reference Code/Wedge/installation/ubuntu/ubuntu.php.ini diff --git a/pos/is4c/additem.php b/documentation/Reference Code/Wedge/is4c/additem.php similarity index 100% rename from pos/is4c/additem.php rename to documentation/Reference Code/Wedge/is4c/additem.php diff --git a/pos/is4c/adminlist.php b/documentation/Reference Code/Wedge/is4c/adminlist.php similarity index 100% rename from pos/is4c/adminlist.php rename to documentation/Reference Code/Wedge/is4c/adminlist.php diff --git a/pos/is4c/admintasks.php b/documentation/Reference Code/Wedge/is4c/admintasks.php similarity index 100% rename from pos/is4c/admintasks.php rename to documentation/Reference Code/Wedge/is4c/admintasks.php diff --git a/pos/is4c/authenticate3.php b/documentation/Reference Code/Wedge/is4c/authenticate3.php similarity index 100% rename from pos/is4c/authenticate3.php rename to documentation/Reference Code/Wedge/is4c/authenticate3.php diff --git a/pos/is4c/bdBoxMsg2.php b/documentation/Reference Code/Wedge/is4c/bdBoxMsg2.php similarity index 100% rename from pos/is4c/bdBoxMsg2.php rename to documentation/Reference Code/Wedge/is4c/bdBoxMsg2.php diff --git a/pos/is4c/bdDecision.php b/documentation/Reference Code/Wedge/is4c/bdDecision.php similarity index 100% rename from pos/is4c/bdDecision.php rename to documentation/Reference Code/Wedge/is4c/bdDecision.php diff --git a/pos/is4c/boxMsg2.php b/documentation/Reference Code/Wedge/is4c/boxMsg2.php similarity index 100% rename from pos/is4c/boxMsg2.php rename to documentation/Reference Code/Wedge/is4c/boxMsg2.php diff --git a/pos/is4c/bye.html b/documentation/Reference Code/Wedge/is4c/bye.html similarity index 100% rename from pos/is4c/bye.html rename to documentation/Reference Code/Wedge/is4c/bye.html diff --git a/pos/is4c/ccApproved.php b/documentation/Reference Code/Wedge/is4c/ccApproved.php similarity index 100% rename from pos/is4c/ccApproved.php rename to documentation/Reference Code/Wedge/is4c/ccApproved.php diff --git a/pos/is4c/ccDecision.php b/documentation/Reference Code/Wedge/is4c/ccDecision.php similarity index 100% rename from pos/is4c/ccDecision.php rename to documentation/Reference Code/Wedge/is4c/ccDecision.php diff --git a/pos/is4c/ccDrawerKick.php b/documentation/Reference Code/Wedge/is4c/ccDrawerKick.php similarity index 100% rename from pos/is4c/ccDrawerKick.php rename to documentation/Reference Code/Wedge/is4c/ccDrawerKick.php diff --git a/pos/is4c/ccEntered.php b/documentation/Reference Code/Wedge/is4c/ccEntered.php similarity index 100% rename from pos/is4c/ccEntered.php rename to documentation/Reference Code/Wedge/is4c/ccEntered.php diff --git a/pos/is4c/ccLib.php b/documentation/Reference Code/Wedge/is4c/ccLib.php similarity index 100% rename from pos/is4c/ccLib.php rename to documentation/Reference Code/Wedge/is4c/ccLib.php diff --git a/pos/is4c/ccSlipDecision.php b/documentation/Reference Code/Wedge/is4c/ccSlipDecision.php similarity index 100% rename from pos/is4c/ccSlipDecision.php rename to documentation/Reference Code/Wedge/is4c/ccSlipDecision.php diff --git a/pos/is4c/ccTender.php b/documentation/Reference Code/Wedge/is4c/ccTender.php similarity index 100% rename from pos/is4c/ccTender.php rename to documentation/Reference Code/Wedge/is4c/ccTender.php diff --git a/pos/is4c/ccauthorize.php b/documentation/Reference Code/Wedge/is4c/ccauthorize.php similarity index 100% rename from pos/is4c/ccauthorize.php rename to documentation/Reference Code/Wedge/is4c/ccauthorize.php diff --git a/pos/is4c/ccboxMsg2.php b/documentation/Reference Code/Wedge/is4c/ccboxMsg2.php similarity index 100% rename from pos/is4c/ccboxMsg2.php rename to documentation/Reference Code/Wedge/is4c/ccboxMsg2.php diff --git a/pos/is4c/chgName.php b/documentation/Reference Code/Wedge/is4c/chgName.php similarity index 100% rename from pos/is4c/chgName.php rename to documentation/Reference Code/Wedge/is4c/chgName.php diff --git a/pos/is4c/chkscale.html b/documentation/Reference Code/Wedge/is4c/chkscale.html similarity index 100% rename from pos/is4c/chkscale.html rename to documentation/Reference Code/Wedge/is4c/chkscale.html diff --git a/pos/is4c/chkscale.php b/documentation/Reference Code/Wedge/is4c/chkscale.php similarity index 100% rename from pos/is4c/chkscale.php rename to documentation/Reference Code/Wedge/is4c/chkscale.php diff --git a/pos/is4c/chkscanner.html b/documentation/Reference Code/Wedge/is4c/chkscanner.html similarity index 100% rename from pos/is4c/chkscanner.html rename to documentation/Reference Code/Wedge/is4c/chkscanner.html diff --git a/pos/is4c/chkscanner.php b/documentation/Reference Code/Wedge/is4c/chkscanner.php similarity index 100% rename from pos/is4c/chkscanner.php rename to documentation/Reference Code/Wedge/is4c/chkscanner.php diff --git a/pos/is4c/chkserial.php b/documentation/Reference Code/Wedge/is4c/chkserial.php similarity index 100% rename from pos/is4c/chkserial.php rename to documentation/Reference Code/Wedge/is4c/chkserial.php diff --git a/pos/is4c/chrisFunct.php b/documentation/Reference Code/Wedge/is4c/chrisFunct.php similarity index 100% rename from pos/is4c/chrisFunct.php rename to documentation/Reference Code/Wedge/is4c/chrisFunct.php diff --git a/pos/is4c/clearscanner.php b/documentation/Reference Code/Wedge/is4c/clearscanner.php similarity index 100% rename from pos/is4c/clearscanner.php rename to documentation/Reference Code/Wedge/is4c/clearscanner.php diff --git a/pos/is4c/clientscripts.php b/documentation/Reference Code/Wedge/is4c/clientscripts.php similarity index 100% rename from pos/is4c/clientscripts.php rename to documentation/Reference Code/Wedge/is4c/clientscripts.php diff --git a/pos/is4c/clock.php b/documentation/Reference Code/Wedge/is4c/clock.php similarity index 100% rename from pos/is4c/clock.php rename to documentation/Reference Code/Wedge/is4c/clock.php diff --git a/pos/is4c/clubCard.php b/documentation/Reference Code/Wedge/is4c/clubCard.php similarity index 100% rename from pos/is4c/clubCard.php rename to documentation/Reference Code/Wedge/is4c/clubCard.php diff --git a/pos/is4c/configure.php b/documentation/Reference Code/Wedge/is4c/configure.php similarity index 100% rename from pos/is4c/configure.php rename to documentation/Reference Code/Wedge/is4c/configure.php diff --git a/pos/is4c/connect.php b/documentation/Reference Code/Wedge/is4c/connect.php similarity index 100% rename from pos/is4c/connect.php rename to documentation/Reference Code/Wedge/is4c/connect.php diff --git a/pos/is4c/coupondec.php b/documentation/Reference Code/Wedge/is4c/coupondec.php similarity index 100% rename from pos/is4c/coupondec.php rename to documentation/Reference Code/Wedge/is4c/coupondec.php diff --git a/pos/is4c/coupondeptinvalid.php b/documentation/Reference Code/Wedge/is4c/coupondeptinvalid.php similarity index 100% rename from pos/is4c/coupondeptinvalid.php rename to documentation/Reference Code/Wedge/is4c/coupondeptinvalid.php diff --git a/pos/is4c/coupondeptsearch.php b/documentation/Reference Code/Wedge/is4c/coupondeptsearch.php similarity index 100% rename from pos/is4c/coupondeptsearch.php rename to documentation/Reference Code/Wedge/is4c/coupondeptsearch.php diff --git a/pos/is4c/css/is4c.css b/documentation/Reference Code/Wedge/is4c/css/is4c.css similarity index 100% rename from pos/is4c/css/is4c.css rename to documentation/Reference Code/Wedge/is4c/css/is4c.css diff --git a/pos/is4c/datetime.js b/documentation/Reference Code/Wedge/is4c/datetime.js similarity index 100% rename from pos/is4c/datetime.js rename to documentation/Reference Code/Wedge/is4c/datetime.js diff --git a/pos/is4c/decision.php b/documentation/Reference Code/Wedge/is4c/decision.php similarity index 100% rename from pos/is4c/decision.php rename to documentation/Reference Code/Wedge/is4c/decision.php diff --git a/pos/is4c/deptscaearch.php b/documentation/Reference Code/Wedge/is4c/deptscaearch.php similarity index 100% rename from pos/is4c/deptscaearch.php rename to documentation/Reference Code/Wedge/is4c/deptscaearch.php diff --git a/pos/is4c/display.php b/documentation/Reference Code/Wedge/is4c/display.php similarity index 100% rename from pos/is4c/display.php rename to documentation/Reference Code/Wedge/is4c/display.php diff --git a/pos/is4c/drawscreen.php b/documentation/Reference Code/Wedge/is4c/drawscreen.php similarity index 100% rename from pos/is4c/drawscreen.php rename to documentation/Reference Code/Wedge/is4c/drawscreen.php diff --git a/pos/is4c/dupuser.php b/documentation/Reference Code/Wedge/is4c/dupuser.php similarity index 100% rename from pos/is4c/dupuser.php rename to documentation/Reference Code/Wedge/is4c/dupuser.php diff --git a/pos/is4c/end.php b/documentation/Reference Code/Wedge/is4c/end.php similarity index 100% rename from pos/is4c/end.php rename to documentation/Reference Code/Wedge/is4c/end.php diff --git a/pos/is4c/endorse.php b/documentation/Reference Code/Wedge/is4c/endorse.php similarity index 100% rename from pos/is4c/endorse.php rename to documentation/Reference Code/Wedge/is4c/endorse.php diff --git a/pos/is4c/graphics/BLUEDOT.GIF b/documentation/Reference Code/Wedge/is4c/graphics/BLUEDOT.GIF similarity index 100% rename from pos/is4c/graphics/BLUEDOT.GIF rename to documentation/Reference Code/Wedge/is4c/graphics/BLUEDOT.GIF diff --git a/pos/is4c/graphics/GREENDOT.GIF b/documentation/Reference Code/Wedge/is4c/graphics/GREENDOT.GIF similarity index 100% rename from pos/is4c/graphics/GREENDOT.GIF rename to documentation/Reference Code/Wedge/is4c/graphics/GREENDOT.GIF diff --git a/pos/is4c/graphics/REDDOT.GIF b/documentation/Reference Code/Wedge/is4c/graphics/REDDOT.GIF similarity index 100% rename from pos/is4c/graphics/REDDOT.GIF rename to documentation/Reference Code/Wedge/is4c/graphics/REDDOT.GIF diff --git a/pos/is4c/graphics/acg_bg.gif b/documentation/Reference Code/Wedge/is4c/graphics/acg_bg.gif similarity index 100% rename from pos/is4c/graphics/acg_bg.gif rename to documentation/Reference Code/Wedge/is4c/graphics/acg_bg.gif diff --git a/pos/is4c/graphics/acg_login.gif b/documentation/Reference Code/Wedge/is4c/graphics/acg_login.gif similarity index 100% rename from pos/is4c/graphics/acg_login.gif rename to documentation/Reference Code/Wedge/is4c/graphics/acg_login.gif diff --git a/pos/is4c/graphics/bluekey4.gif b/documentation/Reference Code/Wedge/is4c/graphics/bluekey4.gif similarity index 100% rename from pos/is4c/graphics/bluekey4.gif rename to documentation/Reference Code/Wedge/is4c/graphics/bluekey4.gif diff --git a/pos/is4c/graphics/crossD.gif b/documentation/Reference Code/Wedge/is4c/graphics/crossD.gif similarity index 100% rename from pos/is4c/graphics/crossD.gif rename to documentation/Reference Code/Wedge/is4c/graphics/crossD.gif diff --git a/pos/is4c/graphics/exclaimC.gif b/documentation/Reference Code/Wedge/is4c/graphics/exclaimC.gif similarity index 100% rename from pos/is4c/graphics/exclaimC.gif rename to documentation/Reference Code/Wedge/is4c/graphics/exclaimC.gif diff --git a/pos/is4c/graphics/redkey4.gif b/documentation/Reference Code/Wedge/is4c/graphics/redkey4.gif similarity index 100% rename from pos/is4c/graphics/redkey4.gif rename to documentation/Reference Code/Wedge/is4c/graphics/redkey4.gif diff --git a/pos/is4c/graphics/switchblue2.gif b/documentation/Reference Code/Wedge/is4c/graphics/switchblue2.gif similarity index 100% rename from pos/is4c/graphics/switchblue2.gif rename to documentation/Reference Code/Wedge/is4c/graphics/switchblue2.gif diff --git a/pos/is4c/graphics/switchred2.gif b/documentation/Reference Code/Wedge/is4c/graphics/switchred2.gif similarity index 100% rename from pos/is4c/graphics/switchred2.gif rename to documentation/Reference Code/Wedge/is4c/graphics/switchred2.gif diff --git a/pos/is4c/ini/ini.php.sample b/documentation/Reference Code/Wedge/is4c/ini/ini.php.sample similarity index 100% rename from pos/is4c/ini/ini.php.sample rename to documentation/Reference Code/Wedge/is4c/ini/ini.php.sample diff --git a/pos/is4c/input.js b/documentation/Reference Code/Wedge/is4c/input.js similarity index 100% rename from pos/is4c/input.js rename to documentation/Reference Code/Wedge/is4c/input.js diff --git a/pos/is4c/input.php b/documentation/Reference Code/Wedge/is4c/input.php similarity index 100% rename from pos/is4c/input.php rename to documentation/Reference Code/Wedge/is4c/input.php diff --git a/pos/is4c/invalid.php b/documentation/Reference Code/Wedge/is4c/invalid.php similarity index 100% rename from pos/is4c/invalid.php rename to documentation/Reference Code/Wedge/is4c/invalid.php diff --git a/pos/is4c/invalid3.php b/documentation/Reference Code/Wedge/is4c/invalid3.php similarity index 100% rename from pos/is4c/invalid3.php rename to documentation/Reference Code/Wedge/is4c/invalid3.php diff --git a/pos/is4c/is4c.css b/documentation/Reference Code/Wedge/is4c/is4c.css similarity index 100% rename from pos/is4c/is4c.css rename to documentation/Reference Code/Wedge/is4c/is4c.css diff --git a/documentation/Reference Code/Wedge/is4c/is4c_errrors b/documentation/Reference Code/Wedge/is4c/is4c_errrors new file mode 100755 index 000000000..e69de29bb diff --git a/pos/is4c/js/jquery-1.4.2.min.js b/documentation/Reference Code/Wedge/is4c/js/jquery-1.4.2.min.js similarity index 100% rename from pos/is4c/js/jquery-1.4.2.min.js rename to documentation/Reference Code/Wedge/is4c/js/jquery-1.4.2.min.js diff --git a/pos/is4c/laneSync.php b/documentation/Reference Code/Wedge/is4c/laneSync.php similarity index 100% rename from pos/is4c/laneSync.php rename to documentation/Reference Code/Wedge/is4c/laneSync.php diff --git a/pos/is4c/lane_db-install b/documentation/Reference Code/Wedge/is4c/lane_db-install similarity index 100% rename from pos/is4c/lane_db-install rename to documentation/Reference Code/Wedge/is4c/lane_db-install diff --git a/pos/is4c/lib.php b/documentation/Reference Code/Wedge/is4c/lib.php similarity index 100% rename from pos/is4c/lib.php rename to documentation/Reference Code/Wedge/is4c/lib.php diff --git a/pos/is4c/lib/apply_configurations.php b/documentation/Reference Code/Wedge/is4c/lib/apply_configurations.php similarity index 100% rename from pos/is4c/lib/apply_configurations.php rename to documentation/Reference Code/Wedge/is4c/lib/apply_configurations.php diff --git a/pos/is4c/lib/authenticate.php b/documentation/Reference Code/Wedge/is4c/lib/authenticate.php similarity index 100% rename from pos/is4c/lib/authenticate.php rename to documentation/Reference Code/Wedge/is4c/lib/authenticate.php diff --git a/pos/is4c/lib/conf.php b/documentation/Reference Code/Wedge/is4c/lib/conf.php similarity index 100% rename from pos/is4c/lib/conf.php rename to documentation/Reference Code/Wedge/is4c/lib/conf.php diff --git a/pos/is4c/lib/initialize.php b/documentation/Reference Code/Wedge/is4c/lib/initialize.php similarity index 100% rename from pos/is4c/lib/initialize.php rename to documentation/Reference Code/Wedge/is4c/lib/initialize.php diff --git a/pos/is4c/lib/query.php b/documentation/Reference Code/Wedge/is4c/lib/query.php similarity index 100% rename from pos/is4c/lib/query.php rename to documentation/Reference Code/Wedge/is4c/lib/query.php diff --git a/pos/is4c/license.txt b/documentation/Reference Code/Wedge/is4c/license.txt similarity index 100% rename from pos/is4c/license.txt rename to documentation/Reference Code/Wedge/is4c/license.txt diff --git a/pos/is4c/listitems.php b/documentation/Reference Code/Wedge/is4c/listitems.php similarity index 100% rename from pos/is4c/listitems.php rename to documentation/Reference Code/Wedge/is4c/listitems.php diff --git a/pos/is4c/liveclock.js b/documentation/Reference Code/Wedge/is4c/liveclock.js similarity index 100% rename from pos/is4c/liveclock.js rename to documentation/Reference Code/Wedge/is4c/liveclock.js diff --git a/pos/is4c/loadconfig.php b/documentation/Reference Code/Wedge/is4c/loadconfig.php similarity index 100% rename from pos/is4c/loadconfig.php rename to documentation/Reference Code/Wedge/is4c/loadconfig.php diff --git a/pos/is4c/loanadd.php b/documentation/Reference Code/Wedge/is4c/loanadd.php similarity index 100% rename from pos/is4c/loanadd.php rename to documentation/Reference Code/Wedge/is4c/loanadd.php diff --git a/pos/is4c/loanform.php b/documentation/Reference Code/Wedge/is4c/loanform.php similarity index 100% rename from pos/is4c/loanform.php rename to documentation/Reference Code/Wedge/is4c/loanform.php diff --git a/documentation/Reference Code/Wedge/is4c/log/is4c_errors b/documentation/Reference Code/Wedge/is4c/log/is4c_errors new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c/login.php b/documentation/Reference Code/Wedge/is4c/login.php similarity index 100% rename from pos/is4c/login.php rename to documentation/Reference Code/Wedge/is4c/login.php diff --git a/pos/is4c/logintest.php b/documentation/Reference Code/Wedge/is4c/logintest.php similarity index 100% rename from pos/is4c/logintest.php rename to documentation/Reference Code/Wedge/is4c/logintest.php diff --git a/pos/is4c/maindisplay.php b/documentation/Reference Code/Wedge/is4c/maindisplay.php similarity index 100% rename from pos/is4c/maindisplay.php rename to documentation/Reference Code/Wedge/is4c/maindisplay.php diff --git a/pos/is4c/mcoupon.php b/documentation/Reference Code/Wedge/is4c/mcoupon.php similarity index 100% rename from pos/is4c/mcoupon.php rename to documentation/Reference Code/Wedge/is4c/mcoupon.php diff --git a/pos/is4c/memberCommentPlus.php b/documentation/Reference Code/Wedge/is4c/memberCommentPlus.php similarity index 100% rename from pos/is4c/memberCommentPlus.php rename to documentation/Reference Code/Wedge/is4c/memberCommentPlus.php diff --git a/pos/is4c/memid.php b/documentation/Reference Code/Wedge/is4c/memid.php similarity index 100% rename from pos/is4c/memid.php rename to documentation/Reference Code/Wedge/is4c/memid.php diff --git a/pos/is4c/memlist.php b/documentation/Reference Code/Wedge/is4c/memlist.php similarity index 100% rename from pos/is4c/memlist.php rename to documentation/Reference Code/Wedge/is4c/memlist.php diff --git a/pos/is4c/memsearch.php b/documentation/Reference Code/Wedge/is4c/memsearch.php similarity index 100% rename from pos/is4c/memsearch.php rename to documentation/Reference Code/Wedge/is4c/memsearch.php diff --git a/pos/is4c/mgrauthenticate.php b/documentation/Reference Code/Wedge/is4c/mgrauthenticate.php similarity index 100% rename from pos/is4c/mgrauthenticate.php rename to documentation/Reference Code/Wedge/is4c/mgrauthenticate.php diff --git a/pos/is4c/mgrinvalid.php b/documentation/Reference Code/Wedge/is4c/mgrinvalid.php similarity index 100% rename from pos/is4c/mgrinvalid.php rename to documentation/Reference Code/Wedge/is4c/mgrinvalid.php diff --git a/pos/is4c/mgrlogin.php b/documentation/Reference Code/Wedge/is4c/mgrlogin.php similarity index 100% rename from pos/is4c/mgrlogin.php rename to documentation/Reference Code/Wedge/is4c/mgrlogin.php diff --git a/pos/is4c/msgscreen.php b/documentation/Reference Code/Wedge/is4c/msgscreen.php similarity index 100% rename from pos/is4c/msgscreen.php rename to documentation/Reference Code/Wedge/is4c/msgscreen.php diff --git a/pos/is4c/noinput.php b/documentation/Reference Code/Wedge/is4c/noinput.php similarity index 100% rename from pos/is4c/noinput.php rename to documentation/Reference Code/Wedge/is4c/noinput.php diff --git a/pos/is4c/nsauthenticate.php b/documentation/Reference Code/Wedge/is4c/nsauthenticate.php similarity index 100% rename from pos/is4c/nsauthenticate.php rename to documentation/Reference Code/Wedge/is4c/nsauthenticate.php diff --git a/pos/is4c/nsinvalid.php b/documentation/Reference Code/Wedge/is4c/nsinvalid.php similarity index 100% rename from pos/is4c/nsinvalid.php rename to documentation/Reference Code/Wedge/is4c/nsinvalid.php diff --git a/pos/is4c/nslogin.php b/documentation/Reference Code/Wedge/is4c/nslogin.php similarity index 100% rename from pos/is4c/nslogin.php rename to documentation/Reference Code/Wedge/is4c/nslogin.php diff --git a/pos/is4c/phpinfo.php b/documentation/Reference Code/Wedge/is4c/phpinfo.php similarity index 100% rename from pos/is4c/phpinfo.php rename to documentation/Reference Code/Wedge/is4c/phpinfo.php diff --git a/pos/is4c/pos.php b/documentation/Reference Code/Wedge/is4c/pos.php similarity index 100% rename from pos/is4c/pos.php rename to documentation/Reference Code/Wedge/is4c/pos.php diff --git a/pos/is4c/pos2.php b/documentation/Reference Code/Wedge/is4c/pos2.php similarity index 100% rename from pos/is4c/pos2.php rename to documentation/Reference Code/Wedge/is4c/pos2.php diff --git a/pos/is4c/prehkeys.php b/documentation/Reference Code/Wedge/is4c/prehkeys.php similarity index 100% rename from pos/is4c/prehkeys.php rename to documentation/Reference Code/Wedge/is4c/prehkeys.php diff --git a/pos/is4c/printLib.php b/documentation/Reference Code/Wedge/is4c/printLib.php similarity index 100% rename from pos/is4c/printLib.php rename to documentation/Reference Code/Wedge/is4c/printLib.php diff --git a/pos/is4c/printReceipt.php b/documentation/Reference Code/Wedge/is4c/printReceipt.php similarity index 100% rename from pos/is4c/printReceipt.php rename to documentation/Reference Code/Wedge/is4c/printReceipt.php diff --git a/pos/is4c/productlist.php b/documentation/Reference Code/Wedge/is4c/productlist.php similarity index 100% rename from pos/is4c/productlist.php rename to documentation/Reference Code/Wedge/is4c/productlist.php diff --git a/pos/is4c/productsearch.php b/documentation/Reference Code/Wedge/is4c/productsearch.php similarity index 100% rename from pos/is4c/productsearch.php rename to documentation/Reference Code/Wedge/is4c/productsearch.php diff --git a/pos/is4c/productselected.php b/documentation/Reference Code/Wedge/is4c/productselected.php similarity index 100% rename from pos/is4c/productselected.php rename to documentation/Reference Code/Wedge/is4c/productselected.php diff --git a/pos/is4c/promptbox.php b/documentation/Reference Code/Wedge/is4c/promptbox.php similarity index 100% rename from pos/is4c/promptbox.php rename to documentation/Reference Code/Wedge/is4c/promptbox.php diff --git a/pos/is4c/qtty.php b/documentation/Reference Code/Wedge/is4c/qtty.php similarity index 100% rename from pos/is4c/qtty.php rename to documentation/Reference Code/Wedge/is4c/qtty.php diff --git a/pos/is4c/qtty2.php b/documentation/Reference Code/Wedge/is4c/qtty2.php similarity index 100% rename from pos/is4c/qtty2.php rename to documentation/Reference Code/Wedge/is4c/qtty2.php diff --git a/pos/is4c/qttyauth.php b/documentation/Reference Code/Wedge/is4c/qttyauth.php similarity index 100% rename from pos/is4c/qttyauth.php rename to documentation/Reference Code/Wedge/is4c/qttyauth.php diff --git a/pos/is4c/qttyinvalid.php b/documentation/Reference Code/Wedge/is4c/qttyinvalid.php similarity index 100% rename from pos/is4c/qttyinvalid.php rename to documentation/Reference Code/Wedge/is4c/qttyinvalid.php diff --git a/pos/is4c/refresh.php b/documentation/Reference Code/Wedge/is4c/refresh.php similarity index 100% rename from pos/is4c/refresh.php rename to documentation/Reference Code/Wedge/is4c/refresh.php diff --git a/pos/is4c/reload.php b/documentation/Reference Code/Wedge/is4c/reload.php similarity index 100% rename from pos/is4c/reload.php rename to documentation/Reference Code/Wedge/is4c/reload.php diff --git a/pos/is4c/reloadlanes.php b/documentation/Reference Code/Wedge/is4c/reloadlanes.php similarity index 100% rename from pos/is4c/reloadlanes.php rename to documentation/Reference Code/Wedge/is4c/reloadlanes.php diff --git a/pos/is4c/reprint.php b/documentation/Reference Code/Wedge/is4c/reprint.php similarity index 100% rename from pos/is4c/reprint.php rename to documentation/Reference Code/Wedge/is4c/reprint.php diff --git a/pos/is4c/resume.php b/documentation/Reference Code/Wedge/is4c/resume.php similarity index 100% rename from pos/is4c/resume.php rename to documentation/Reference Code/Wedge/is4c/resume.php diff --git a/pos/is4c/right.php b/documentation/Reference Code/Wedge/is4c/right.php similarity index 100% rename from pos/is4c/right.php rename to documentation/Reference Code/Wedge/is4c/right.php diff --git a/pos/is4c/rplist.php b/documentation/Reference Code/Wedge/is4c/rplist.php similarity index 100% rename from pos/is4c/rplist.php rename to documentation/Reference Code/Wedge/is4c/rplist.php diff --git a/pos/is4c/rs232/README b/documentation/Reference Code/Wedge/is4c/rs232/README similarity index 100% rename from pos/is4c/rs232/README rename to documentation/Reference Code/Wedge/is4c/rs232/README diff --git a/pos/is4c/rs232/errorBeep b/documentation/Reference Code/Wedge/is4c/rs232/errorBeep similarity index 100% rename from pos/is4c/rs232/errorBeep rename to documentation/Reference Code/Wedge/is4c/rs232/errorBeep diff --git a/pos/is4c/rs232/goodBeep b/documentation/Reference Code/Wedge/is4c/rs232/goodBeep similarity index 100% rename from pos/is4c/rs232/goodBeep rename to documentation/Reference Code/Wedge/is4c/rs232/goodBeep diff --git a/pos/is4c/rs232/lptty b/documentation/Reference Code/Wedge/is4c/rs232/lptty similarity index 100% rename from pos/is4c/rs232/lptty rename to documentation/Reference Code/Wedge/is4c/rs232/lptty diff --git a/pos/is4c/rs232/rePoll b/documentation/Reference Code/Wedge/is4c/rs232/rePoll similarity index 100% rename from pos/is4c/rs232/rePoll rename to documentation/Reference Code/Wedge/is4c/rs232/rePoll diff --git a/pos/is4c/rs232/scale b/documentation/Reference Code/Wedge/is4c/rs232/scale similarity index 100% rename from pos/is4c/rs232/scale rename to documentation/Reference Code/Wedge/is4c/rs232/scale diff --git a/pos/is4c/rs232/scanner b/documentation/Reference Code/Wedge/is4c/rs232/scanner similarity index 100% rename from pos/is4c/rs232/scanner rename to documentation/Reference Code/Wedge/is4c/rs232/scanner diff --git a/pos/is4c/rs232/scannerscale.c b/documentation/Reference Code/Wedge/is4c/rs232/scannerscale.c similarity index 100% rename from pos/is4c/rs232/scannerscale.c rename to documentation/Reference Code/Wedge/is4c/rs232/scannerscale.c diff --git a/pos/is4c/rs232/setport b/documentation/Reference Code/Wedge/is4c/rs232/setport similarity index 100% rename from pos/is4c/rs232/setport rename to documentation/Reference Code/Wedge/is4c/rs232/setport diff --git a/pos/is4c/rs232/ssd.c b/documentation/Reference Code/Wedge/is4c/rs232/ssd.c similarity index 100% rename from pos/is4c/rs232/ssd.c rename to documentation/Reference Code/Wedge/is4c/rs232/ssd.c diff --git a/pos/is4c/rs232/twoPairs b/documentation/Reference Code/Wedge/is4c/rs232/twoPairs similarity index 100% rename from pos/is4c/rs232/twoPairs rename to documentation/Reference Code/Wedge/is4c/rs232/twoPairs diff --git a/pos/is4c/rs232/wakeup b/documentation/Reference Code/Wedge/is4c/rs232/wakeup similarity index 100% rename from pos/is4c/rs232/wakeup rename to documentation/Reference Code/Wedge/is4c/rs232/wakeup diff --git a/pos/is4c/scale.php b/documentation/Reference Code/Wedge/is4c/scale.php similarity index 100% rename from pos/is4c/scale.php rename to documentation/Reference Code/Wedge/is4c/scale.php diff --git a/pos/is4c/sessFunction.php b/documentation/Reference Code/Wedge/is4c/sessFunction.php similarity index 100% rename from pos/is4c/sessFunction.php rename to documentation/Reference Code/Wedge/is4c/sessFunction.php diff --git a/pos/is4c/session.php b/documentation/Reference Code/Wedge/is4c/session.php similarity index 100% rename from pos/is4c/session.php rename to documentation/Reference Code/Wedge/is4c/session.php diff --git a/pos/is4c/setDrawerKick.php b/documentation/Reference Code/Wedge/is4c/setDrawerKick.php similarity index 100% rename from pos/is4c/setDrawerKick.php rename to documentation/Reference Code/Wedge/is4c/setDrawerKick.php diff --git a/pos/is4c/special.php b/documentation/Reference Code/Wedge/is4c/special.php similarity index 100% rename from pos/is4c/special.php rename to documentation/Reference Code/Wedge/is4c/special.php diff --git a/pos/is4c/stnd.xdr b/documentation/Reference Code/Wedge/is4c/stnd.xdr similarity index 100% rename from pos/is4c/stnd.xdr rename to documentation/Reference Code/Wedge/is4c/stnd.xdr diff --git a/pos/is4c/suspendedlist.php b/documentation/Reference Code/Wedge/is4c/suspendedlist.php similarity index 100% rename from pos/is4c/suspendedlist.php rename to documentation/Reference Code/Wedge/is4c/suspendedlist.php diff --git a/pos/is4c/tenderReport.php b/documentation/Reference Code/Wedge/is4c/tenderReport.php similarity index 100% rename from pos/is4c/tenderReport.php rename to documentation/Reference Code/Wedge/is4c/tenderReport.php diff --git a/pos/is4c/test.php b/documentation/Reference Code/Wedge/is4c/test.php similarity index 100% rename from pos/is4c/test.php rename to documentation/Reference Code/Wedge/is4c/test.php diff --git a/pos/is4c/test2.php b/documentation/Reference Code/Wedge/is4c/test2.php similarity index 100% rename from pos/is4c/test2.php rename to documentation/Reference Code/Wedge/is4c/test2.php diff --git a/pos/is4c/testbeep.php b/documentation/Reference Code/Wedge/is4c/testbeep.php similarity index 100% rename from pos/is4c/testbeep.php rename to documentation/Reference Code/Wedge/is4c/testbeep.php diff --git a/pos/is4c/testing.php b/documentation/Reference Code/Wedge/is4c/testing.php similarity index 100% rename from pos/is4c/testing.php rename to documentation/Reference Code/Wedge/is4c/testing.php diff --git a/pos/is4c/testkeys.html b/documentation/Reference Code/Wedge/is4c/testkeys.html similarity index 100% rename from pos/is4c/testkeys.html rename to documentation/Reference Code/Wedge/is4c/testkeys.html diff --git a/pos/is4c/testping.php b/documentation/Reference Code/Wedge/is4c/testping.php similarity index 100% rename from pos/is4c/testping.php rename to documentation/Reference Code/Wedge/is4c/testping.php diff --git a/pos/is4c/upcscanned.php b/documentation/Reference Code/Wedge/is4c/upcscanned.php similarity index 100% rename from pos/is4c/upcscanned.php rename to documentation/Reference Code/Wedge/is4c/upcscanned.php diff --git a/pos/is4c/variables.php b/documentation/Reference Code/Wedge/is4c/variables.php similarity index 100% rename from pos/is4c/variables.php rename to documentation/Reference Code/Wedge/is4c/variables.php diff --git a/pos/is4c/void.php b/documentation/Reference Code/Wedge/is4c/void.php similarity index 100% rename from pos/is4c/void.php rename to documentation/Reference Code/Wedge/is4c/void.php diff --git a/documentation/Reference Code/Wedge/testbottlecap b/documentation/Reference Code/Wedge/testbottlecap new file mode 100644 index 000000000..e69de29bb diff --git a/documentation/doxy/README b/documentation/doxy/README new file mode 100644 index 000000000..a272153bf --- /dev/null +++ b/documentation/doxy/README @@ -0,0 +1,7 @@ +Run doxy in the top directory of the git repo +to make pathing work. + +E.g., + +doxygen documentation/doxy/config/is4c-nf.doxyfile +doxygen documentation/doxy/config/fannie.doxyfile diff --git a/documentation/doxy/config/fannie.doxyfile b/documentation/doxy/config/fannie.doxyfile new file mode 100644 index 000000000..3b56b5dc7 --- /dev/null +++ b/documentation/doxy/config/fannie.doxyfile @@ -0,0 +1,1800 @@ +# Doxyfile 1.8.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "CORE POS - Fannie" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "The CORE POS back end" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = "documentation/doxy/output/fannie" + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = "fannie/" + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = "*.php" + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = "fannie/adodb5" + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = "documentation/doxy/examples/fannie/" + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = YES + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/documentation/doxy/config/is4c.doxyfile b/documentation/doxy/config/is4c.doxyfile new file mode 100644 index 000000000..abda901bb --- /dev/null +++ b/documentation/doxy/config/is4c.doxyfile @@ -0,0 +1,1800 @@ +# Doxyfile 1.8.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "CORE POS - IS4C" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "The CORE POS front end" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = "documentation/doxy/output/is4c-nf" + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = "pos/is4c-nf/" + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = "*.php" + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = "pos/is4c-nf/lib/adodb5" + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = "documentation/doxy/examples/is4c-nf/" + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = YES + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/documentation/doxy/examples/fannie/BetterHelloWorld.php b/documentation/doxy/examples/fannie/BetterHelloWorld.php new file mode 100644 index 000000000..2a9852ffd --- /dev/null +++ b/documentation/doxy/examples/fannie/BetterHelloWorld.php @@ -0,0 +1,17 @@ + diff --git a/documentation/doxy/examples/fannie/CronJob.php b/documentation/doxy/examples/fannie/CronJob.php new file mode 100644 index 000000000..36fbd0385 --- /dev/null +++ b/documentation/doxy/examples/fannie/CronJob.php @@ -0,0 +1,30 @@ +query("TRUNCATE TABLE batchMergeTable"); + if ($chk === False) + echo $this->cron_msg("Could not truncate batchMergeTable"); + + $chk = $sql->query("INSERT INTO batchMergeTable SELECT * FROM batchMergeProd"); + if ($chk === False) + echo $this->cron_msg("Could not load data from batchMergeProd"); + + $chk = $sql->query("INSERT INTO batchMergeTable SELECT * FROM batchMergeLC"); + if ($chk === False) + echo $this->cron_msg("Could not load data from batchMergeLC"); + + echo $this->cron_msg("Task complete"); + + $sql->close(); + } +} + +?> diff --git a/documentation/doxy/examples/fannie/FunctionLibrary.php b/documentation/doxy/examples/fannie/FunctionLibrary.php new file mode 100644 index 000000000..c95963e81 --- /dev/null +++ b/documentation/doxy/examples/fannie/FunctionLibrary.php @@ -0,0 +1,27 @@ +'.$str.''; +} + +function fl_pow_function($base, $exp){ + if ($exp == 0) return 1; + elseif($exp == 1) return $base; + else return $base*fl_pow_function($base,$exp-1); +} + +?> diff --git a/documentation/doxy/examples/fannie/SimpleHelloWorld.php b/documentation/doxy/examples/fannie/SimpleHelloWorld.php new file mode 100644 index 000000000..e57c24325 --- /dev/null +++ b/documentation/doxy/examples/fannie/SimpleHelloWorld.php @@ -0,0 +1,14 @@ + diff --git a/documentation/doxy/examples/fannie/SimpleReport.php b/documentation/doxy/examples/fannie/SimpleReport.php new file mode 100644 index 000000000..2cb39b6fd --- /dev/null +++ b/documentation/doxy/examples/fannie/SimpleReport.php @@ -0,0 +1,60 @@ +form_tag(); + ?> + Enter department number: + + + + array('col' => 'upc'), + 'Description' => array('col' => 'description'), + 'Price' => array('col' => 'normal_price', + 'align' => 'right', + 'format' => '%.2f'), + 'Last Modified' => array('col' => 'modified', + 'date' => 'm/d/Y') + ); + + $report = get_sortable_table($dbc, $query, $columns, + $this->module_url(), $order, $excel); + + if ($excel){ + $this->download('report.xls', 'excel'); + } + + $dbc->close(); + return $report; + } + + function preprocess(){ + if (isset($_REQUEST['submit'])){ + $this->mode = 'results'; + $this->window_dressing = False; + } + } +} + +?> diff --git a/documentation/doxy/examples/is4c-nf/271828.php b/documentation/doxy/examples/is4c-nf/271828.php new file mode 100644 index 000000000..6f3aa8e5f --- /dev/null +++ b/documentation/doxy/examples/is4c-nf/271828.php @@ -0,0 +1,14 @@ + diff --git a/documentation/doxy/examples/is4c-nf/EgoFooter.php b/documentation/doxy/examples/is4c-nf/EgoFooter.php new file mode 100644 index 000000000..e2392cf74 --- /dev/null +++ b/documentation/doxy/examples/is4c-nf/EgoFooter.php @@ -0,0 +1,18 @@ + diff --git a/documentation/doxy/examples/is4c-nf/HW_Parser.php b/documentation/doxy/examples/is4c-nf/HW_Parser.php new file mode 100644 index 000000000..38937352f --- /dev/null +++ b/documentation/doxy/examples/is4c-nf/HW_Parser.php @@ -0,0 +1,31 @@ +default_json(); + + if ($CORE_LOCAL->get("LastID") != "0"){ + $return_value['output'] = DisplayLib::boxMsg("transaction in progress"); + } + else { + $return_value['main_frame'] = MiscLib::base_url().'gui-modules/HelloWorld.php'; + } + + return $return_value; + } + +} + +?> diff --git a/documentation/doxy/examples/is4c-nf/HelloWorld.php b/documentation/doxy/examples/is4c-nf/HelloWorld.php new file mode 100644 index 000000000..58c68f3c8 --- /dev/null +++ b/documentation/doxy/examples/is4c-nf/HelloWorld.php @@ -0,0 +1,31 @@ +input_header(); + + echo '
        '; + echo DisplayLib::boxMsg('Hello World!
        + Enter anything to continue'); + echo '
        '; + + $this->footer(); + } + + function preprocess(){ + if (isset($_REQUEST['reginput'])){ + header("Location: {$this->page_url}gui-modules/pos2.php"); + return False; + } + + return True; + } + +} + +new HelloWorld(); + +?> diff --git a/documentation/doxy/output/fannie/html/_better_hello_world_8php-example.html b/documentation/doxy/output/fannie/html/_better_hello_world_8php-example.html new file mode 100644 index 000000000..bb74497c6 --- /dev/null +++ b/documentation/doxy/output/fannie/html/_better_hello_world_8php-example.html @@ -0,0 +1,48 @@ + + +CORE POS - Fannie: BetterHelloWorld.php + + + + +
        +
        +

        BetterHelloWorld.php

        Using FanniePage for this module means the header, footer, and menu will be included. The body_content() method defines what goes in the main content area of the page.

        +

        00001 <?php
        +00002 
        +00003 class BetterHelloWorld extends FanniePage {
        +00004         
        +00005         public $required = False;
        +00006 
        +00007         public $description = "A better Hello World module";
        +00008         
        +00009         protected $title = 'Hello World';
        +00010         protected $header = "Fannie :: Hello World";
        +00011 
        +00012         function body_content(){
        +00013                 return "Welcome to Fannie programming!";
        +00014         }
        +00015 }
        +00016 
        +00017 ?>
        +

        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_cron_job_8php-example.html b/documentation/doxy/output/fannie/html/_cron_job_8php-example.html new file mode 100644 index 000000000..dff3367a8 --- /dev/null +++ b/documentation/doxy/output/fannie/html/_cron_job_8php-example.html @@ -0,0 +1,61 @@ + + +CORE POS - Fannie: CronJob.php + + + + +
        +
        +

        CronJob.php

        Most jobs will only need to define a task() method. The cron_msg() method just adds some formatting to messages.

        +

        00001 <?php
        +00002 
        +00003 class CronJob extends FannieCron {
        +00004 
        +00005         public $advertised = True;
        +00006 
        +00007         public $description = "Reload speedup tables for batch merge views";
        +00008 
        +00009         function task(){
        +00010                 $sql = op_connect();
        +00011 
        +00012                 $chk = $sql->query("TRUNCATE TABLE batchMergeTable");
        +00013                 if ($chk === False)
        +00014                         echo $this->cron_msg("Could not truncate batchMergeTable");
        +00015 
        +00016                 $chk = $sql->query("INSERT INTO batchMergeTable SELECT * FROM batchMergeProd");
        +00017                 if ($chk === False)
        +00018                         echo $this->cron_msg("Could not load data from batchMergeProd");
        +00019 
        +00020                 $chk = $sql->query("INSERT INTO batchMergeTable SELECT * FROM batchMergeLC");
        +00021                 if ($chk === False)
        +00022                         echo $this->cron_msg("Could not load data from batchMergeLC");
        +00023 
        +00024                 echo $this->cron_msg("Task complete");
        +00025 
        +00026                 $sql->close();
        +00027         }
        +00028 }
        +00029 
        +00030 ?>
        +

        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_fannie_functions_8php.html b/documentation/doxy/output/fannie/html/_fannie_functions_8php.html new file mode 100644 index 000000000..8a9e8d539 --- /dev/null +++ b/documentation/doxy/output/fannie/html/_fannie_functions_8php.html @@ -0,0 +1,276 @@ + + +CORE POS - Fannie: fannie/class-lib/FannieFunctions.php File Reference + + + + +
        +
        + +

        fannie/class-lib/FannieFunctions.php File Reference

        Base fannie functions. More... +

        + + + + + + + + + + + + + + + + + + + + + + +

        Classes

        class  FannieFunctions

        Functions

         register_symbols ($file, $functions=null, $classes=null)
         unregister_symbols ($functions=null, $classes=null)
         save_symbols ()
         unpack_symbols ()
         load_function ($function)
         load_class ($class)
        use_module ($module)
         get_available_modules ($dir, &$ret, $base_class="FannieModule")
        +


        Detailed Description

        +Base fannie functions. +

        +


        Function Documentation

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        get_available_modules ( dir,
        &$  ret,
        base_class = "FannieModule" 
        )
        +
        +
        + +

        +Find all modules

        Parameters:
        + + + + +
        $dir directory to search
        $ret return value by reference
        $base_class only modules with this parent class
        +
        +Upon return, $ret will contain an array of filenames keyed by class names +
        +

        + +

        +
        + + + + + + + + + +
        load_class ( class  ) 
        +
        +
        + +

        +Include the definition for a registered class

        Parameters:
        + + +
        $class the class name
        +
        +
        Returns:
        True or False
        + +
        +

        + +

        +
        + + + + + + + + + +
        load_function ( function  ) 
        +
        +
        + +

        +Include the definition for a registered function

        Parameters:
        + + +
        $function the function name
        +
        +
        Returns:
        True or False
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        register_symbols ( file,
        functions = null,
        classes = null 
        )
        +
        +
        + +

        +Register available function(s) and class(es)

        Parameters:
        + + + + +
        $file is the file providing the function(s) and/or class(es)
        $functions is a function name or array of function names
        $classes is a class name or array of class names
        +
        + +
        +

        + +

        +
        + + + + + + + + +
        save_symbols (  ) 
        +
        +
        + +

        +Write current symbols to Fannie config.php

        +Symbols are encoded and serialized to simplify saving and quoting issues. +

        +

        + +

        +
        + + + + + + + + +
        unpack_symbols (  ) 
        +
        +
        + +

        +Decode symbols if needed +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        unregister_symbols ( functions = null,
        classes = null 
        )
        +
        +
        + +

        +Unregister available function(s) and class(es)

        Parameters:
        + + + + +
        $file is the file providing the function(s) and/or class(es)
        $functions is a function name or array of function names
        $classes is a class name or array of class names
        +
        + +
        +

        +


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_fannie_page_8php.html b/documentation/doxy/output/fannie/html/_fannie_page_8php.html new file mode 100644 index 000000000..f7d0a8759 --- /dev/null +++ b/documentation/doxy/output/fannie/html/_fannie_page_8php.html @@ -0,0 +1,87 @@ + + +CORE POS - Fannie: fannie/class-lib/FanniePage.php File Reference + + + + +
        +
        + +

        fannie/class-lib/FanniePage.php File Reference

        Functions provided by FanniePage. More... +

        + + + + + + + + +

        Classes

        class  FanniePage

        Functions

         get_form_value ($name, $default='')
        +


        Detailed Description

        +Functions provided by FanniePage. +

        +


        Function Documentation

        + +
        +
        + + + + + + + + + + + + + + + + + + +
        get_form_value ( name,
        default = '' 
        )
        +
        +
        + +

        +Safely fetch a form value

        Parameters:
        + + + +
        $name the field name
        $default default value if the form value doesn't exist
        +
        +
        Returns:
        The form value, if available, otherwise the default.
        +
        Examples:
        +SimpleReport.php.
        +
        +

        +


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_fannie_report_8php.html b/documentation/doxy/output/fannie/html/_fannie_report_8php.html new file mode 100644 index 000000000..9a683993a --- /dev/null +++ b/documentation/doxy/output/fannie/html/_fannie_report_8php.html @@ -0,0 +1,117 @@ + + +CORE POS - Fannie: fannie/class-lib/FannieReport.php File Reference + + + + +
        +
        + +

        fannie/class-lib/FannieReport.php File Reference

        Functions provided by FannieReport. More... +

        + + + + + + + + +

        Classes

        class  FannieReport

        Functions

         get_sortable_table ($dbc, $query, $columns, $url, $current, $nolinks=False)
        +


        Detailed Description

        +Functions provided by FannieReport. +

        +


        Function Documentation

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        get_sortable_table ( dbc,
        query,
        columns,
        url,
        current,
        nolinks = False 
        )
        +
        +
        + +

        +Create a sortable table from a query

        Parameters:
        + + + + + + + +
        $dbc A connected SQLManager object
        $query the query
        $columns An array describing columns (see below)
        $url URL of the page
        $current current sort column
        $nolinks omit sorting links
        +
        +
        Returns:
        An HTML string
        +$columns is a keyed array describing how the ouput should be displayed. Each key is a column header and each entry is an array of details including:
          +
        • col (required) the column name in the query
        • align (optional) align output left/right/center
        • format (optional) a printf style string for formatting displayed value
        • date (optional) a PHP date() style string for formatting displayed value
        • sort (optional) use a different column for sorting. If for instance a column contains text month names, sorting by a different column containing numeric months may make more sense
        +
        Examples:
        +SimpleReport.php.
        +
        +

        +


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_file_formats_8php.html b/documentation/doxy/output/fannie/html/_file_formats_8php.html new file mode 100644 index 000000000..1e84a1f6b --- /dev/null +++ b/documentation/doxy/output/fannie/html/_file_formats_8php.html @@ -0,0 +1,212 @@ + + +CORE POS - Fannie: fannie/class-lib/formats/FileFormats.php File Reference + + + + +
        +
        + +

        fannie/class-lib/formats/FileFormats.php File Reference

        Provides file manipulation functions. More... +

        + + + + + + + + + + + + + + + + + + + + + +

        Classes

        class  FileFormats

        Functions

         csv_parser ($input, $q="\"", $s=",")
         sanitize_xls_money ($val)
         array_to_csv ($array)
         array_to_xls ($array)
         html_to_array ($str)

        Variables

        $tempfile = tempnam(__FILE__,'')
        +return null
        +


        Detailed Description

        +Provides file manipulation functions. +

        +


        Function Documentation

        + +
        +
        + + + + + + + + + +
        array_to_csv ( array  ) 
        +
        +
        + +

        +Convert array to CSV file

        Parameters:
        + + +
        $array two dimensional array
        +
        +
        Returns:
        string CSV contents
        + +
        +

        + +

        +
        + + + + + + + + + +
        array_to_xls ( array  ) 
        +
        +
        + +

        +Convert an array to XLS file

        Parameters:
        + + +
        $array a two dimensional array
        +
        +
        Returns:
        string XLS contents
        +This function requires Pear and will return False if Pear is not found. +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        csv_parser ( input,
        q = "\"",
        s = "," 
        )
        +
        +
        + +

        +Convert a CSV line into an array

        Parameters:
        + + + + +
        $input the line
        $q the quoting character (default double quote)
        $s the separator (default comma)
        +
        +
        Returns:
        An array of field values
        + +
        +

        + +

        +
        + + + + + + + + + +
        html_to_array ( str  ) 
        +
        +
        + +

        +Convert an HTML table to an array

        Parameters:
        + + +
        $str An HTML string
        +
        +
        Returns:
        Two dimensional array
        + +
        +

        + +

        +
        + + + + + + + + + +
        sanitize_xls_money ( val  ) 
        +
        +
        + +

        +Convert currency-formatted XLS numbers to sane values

        Parameters:
        + + +
        $val the XLS value
        +
        +
        Returns:
        a numeric value
        + +
        +

        +


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_function_library_8php-example.html b/documentation/doxy/output/fannie/html/_function_library_8php-example.html new file mode 100644 index 000000000..71e455647 --- /dev/null +++ b/documentation/doxy/output/fannie/html/_function_library_8php-example.html @@ -0,0 +1,59 @@ + + +CORE POS - Fannie: FunctionLibrary.php + + + + +
        +
        +

        FunctionLibrary.php

        A module that provides functions.

        +The class is portion of the module is responsible for defining what functions the module provides.

        +

        00001 <?php
        +00002 
        +00003 class FunctionLibrary extends FannieModule {
        +00004         
        +00005         public $required = False;
        +00006         
        +00007         public $description = "A function library";
        +00008 
        +00009         function provided_functions(){
        +00010                 return array(
        +00011                         'fl_blink_function',
        +00012                         'fl_pow_function'
        +00013                 );
        +00014         }
        +00015 }
        +00016 
        +00017 function fl_blink_function($str){
        +00018         return '<blink>'.$str.'</blink>';
        +00019 }
        +00020 
        +00021 function fl_pow_function($base, $exp){
        +00022         if ($exp == 0) return 1;
        +00023         elseif($exp == 1) return $base;
        +00024         else return $base*fl_pow_function($base,$exp-1);
        +00025 }
        +00026 
        +00027 ?>
        +

        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_simple_hello_world_8php-example.html b/documentation/doxy/output/fannie/html/_simple_hello_world_8php-example.html new file mode 100644 index 000000000..defb7ab6f --- /dev/null +++ b/documentation/doxy/output/fannie/html/_simple_hello_world_8php-example.html @@ -0,0 +1,46 @@ + + +CORE POS - Fannie: SimpleHelloWorld.php + + + + +
        +
        +

        SimpleHelloWorld.php

        The most basic module possible.

        +The run_module() method is invoked to let the module do whatever it's supposed to do. Most user-facing modules will use likely use FanniePage or one of its subclasses.

        +

        00001 <?php
        +00002 
        +00003 class SimpleHelloWorld extends FannieModule {
        +00004 
        +00005         public $required = False;
        +00006 
        +00007         public $description = "A very simple hello world module";
        +00008 
        +00009         function run_module(){
        +00010                 echo 'Hello World';
        +00011         }
        +00012 }
        +00013 
        +00014 ?>
        +

        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/_simple_report_8php-example.html b/documentation/doxy/output/fannie/html/_simple_report_8php-example.html new file mode 100644 index 000000000..38e5e114f --- /dev/null +++ b/documentation/doxy/output/fannie/html/_simple_report_8php-example.html @@ -0,0 +1,96 @@ + + +CORE POS - Fannie: SimpleReport.php + + + + +
        +
        +

        SimpleReport.php

        This is a an example of a typical report. Many reports follow this general format with one screen where a user can enter some values and a second screen that shows the generated report.

        +The report_form() method creates the screen where a user can enter report parameters. This method should return an HTML string, but output buffering can be used as shown if you want to include raw HTML. Note the use of FanniePage::form_tag(). This is ensures your module will receive the form input.

        +The report_results() method cretes the screen where with the generated report. Like report_form(), it returns an HTML string. This is by no means the only way to generate results, but it demonstrates some useful functions:

          +
        • get_form_value fetches input from $_GET or $_POST and you don't have to worry about which. The second argument sets a default value in case the form value doesn't exist.
        • op_connect provides a database connection
        • get_sortable_table builds an HTML table from a query. The table can is sortable by the column headers. $columns demonstrates how columns are defined and some of the formatting options.
        • FannieReport::Download() generates proper headers to output the report as a downloadable file
        +

        +The preprocess() function simply changes the mode if a form submission is detected. Mode control which of the above screens is shown. Disabling window_dressing removes Fannie's normal header, menu, and footer. This is useful with wide reports that have many columns and vital if you're going to use FannieReport::Download(). Excel can read a simple HTML table, but a full HTML page with CSS styling and lots of divs won't work well.

        +

        00001 <?php
        +00002 
        +00003 class SimpleReport extends FannieReport {
        +00004 
        +00005         public $description = "Report products in a department";
        +00006         protected $title = "Simple Report";
        +00007         protected $header = "Fannie :: Simple Report";
        +00008 
        +00009         function report_form(){
        +00010                 ob_start();
        +00011                 echo $this->form_tag();
        +00012                 ?>
        +00013                 Enter department number:
        +00014                 <input type="text" size="4" name="department" />
        +00015                 <input type="submit" name="submit" value="Run Report" />
        +00016                 </form>
        +00017                 <?php
        +00018                 return ob_get_clean();
        +00019         }
        +00020 
        +00021         function report_results(){
        +00022                 $department = get_form_value('department', 0);
        +00023                 $order = get_form_value('order', 'upc');
        +00024                 $dir = get_form_value('dir', 'ASC');
        +00025                 $excel = get_form_value('excel', False);
        +00026 
        +00027                 $dbc = op_connect();
        +00028                 $query = "SELECT upc, description, normal_price, modified
        +00029                         FROM products WHERE department=$department
        +00030                         ORDER BY $order $dir";
        +00031                 $columns = array(
        +00032                         'UPC' => array('col' => 'upc'),
        +00033                         'Description' => array('col' => 'description'),
        +00034                         'Price' => array('col' => 'normal_price',
        +00035                                          'align' => 'right',
        +00036                                          'format' => '%.2f'),
        +00037                         'Last Modified' => array('col' => 'modified',
        +00038                                                  'date' => 'm/d/Y')
        +00039                 );
        +00040 
        +00041                 $report = get_sortable_table($dbc, $query, $columns,
        +00042                                 $this->module_url(), $order, $excel);   
        +00043 
        +00044                 if ($excel){
        +00045                         $this->download('report.xls', 'excel');
        +00046                 }
        +00047 
        +00048                 $dbc->close();
        +00049                 return $report;
        +00050         }
        +00051 
        +00052         function preprocess(){
        +00053                 if (isset($_REQUEST['submit'])){
        +00054                         $this->mode = 'results';
        +00055                         $this->window_dressing = False;
        +00056                 }
        +00057         }
        +00058 }
        +00059 
        +00060 ?>
        +

        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/annotated.html b/documentation/doxy/output/fannie/html/annotated.html new file mode 100644 index 000000000..7d06a62b2 --- /dev/null +++ b/documentation/doxy/output/fannie/html/annotated.html @@ -0,0 +1,51 @@ + + +CORE POS - Fannie: Class List + + + + +
        +
        + +

        CORE POS - Fannie Class List

        Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + + + + + + + + +
        BarcodePDF
        DatabaseFunctions
        FannieCron
        FannieFunctions
        FannieModule
        FanniePage
        FannieReport
        FileFormats
        LabelPDF
        PrintShelftags
        Spreadsheet_Excel_Reader
        SQLManagerA SQL abstraction layer
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/bc_s.png b/documentation/doxy/output/fannie/html/bc_s.png new file mode 100644 index 000000000..51ba0066d Binary files /dev/null and b/documentation/doxy/output/fannie/html/bc_s.png differ diff --git a/documentation/doxy/output/fannie/html/bdwn.png b/documentation/doxy/output/fannie/html/bdwn.png new file mode 100644 index 000000000..d0b575b75 Binary files /dev/null and b/documentation/doxy/output/fannie/html/bdwn.png differ diff --git a/documentation/doxy/output/fannie/html/class_a_r-members.html b/documentation/doxy/output/fannie/html/class_a_r-members.html new file mode 100644 index 000000000..ae8de2a3f --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_a_r-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        AR Member List
        +
        +
        +This is the complete list of members for AR, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in AR)AR
        ShowEditForm($memNum) (defined in AR)AR
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_a_r.html b/documentation/doxy/output/fannie/html/class_a_r.html new file mode 100644 index 000000000..aaa241be9 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_a_r.html @@ -0,0 +1,119 @@ + + + + + +CORE POS - Fannie: AR Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        AR Class Reference
        +
        +
        +
        +Inheritance diagram for AR:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        SaveFormData ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/AR.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_a_r.png b/documentation/doxy/output/fannie/html/class_a_r.png new file mode 100644 index 000000000..23aff3d41 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_a_r.png differ diff --git a/documentation/doxy/output/fannie/html/class_barcode_p_d_f-members.html b/documentation/doxy/output/fannie/html/class_barcode_p_d_f-members.html new file mode 100644 index 000000000..7d9a205b8 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_barcode_p_d_f-members.html @@ -0,0 +1,48 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        BarcodePDF Member List

        This is the complete list of members for BarcodePDF, including all inherited members.

        + + + + + + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in BarcodePDF)BarcodePDF
        Barcode($x, $y, $barcode, $h, $w, $len, $nonumbers=False) (defined in BarcodePDF)BarcodePDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in BarcodePDF)BarcodePDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in BarcodePDF)BarcodePDF
        GetCheckDigit($barcode) (defined in BarcodePDF)BarcodePDF
        GetCheckDigit($barcode) (defined in BarcodePDF)BarcodePDF
        TestCheckDigit($barcode) (defined in BarcodePDF)BarcodePDF
        TestCheckDigit($barcode) (defined in BarcodePDF)BarcodePDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in BarcodePDF)BarcodePDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35, $nonumbers=False) (defined in BarcodePDF)BarcodePDF


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_barcode_p_d_f.html b/documentation/doxy/output/fannie/html/class_barcode_p_d_f.html new file mode 100644 index 000000000..16fdd8914 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_barcode_p_d_f.html @@ -0,0 +1,76 @@ + + +CORE POS - Fannie: BarcodePDF Class Reference + + + + +
        +
        + +

        BarcodePDF Class Reference

        List of all members. + + + + + + + + + + + + + + + + + + + + + + +

        Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35, $nonumbers=False)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len, $nonumbers=False)
        +

        Detailed Description

        +Extends regular FPDF class to deal with barcodes +

        +


        The documentation for this class was generated from the following files:
          +
        • fannie/class-lib/formats/LabelPDF.php
        • fannie/legacy/members/equity_letters/barcodepdf.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_contact_info-members.html b/documentation/doxy/output/fannie/html/class_contact_info-members.html new file mode 100644 index 000000000..7ea937ee0 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_contact_info-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        ContactInfo Member List
        +
        +
        +This is the complete list of members for ContactInfo, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in ContactInfo)ContactInfo
        HasSearch() (defined in ContactInfo)ContactInfo
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in ContactInfo)ContactInfo
        ShowEditForm($memNum) (defined in ContactInfo)ContactInfo
        ShowSearchForm() (defined in ContactInfo)ContactInfo
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_contact_info.html b/documentation/doxy/output/fannie/html/class_contact_info.html new file mode 100644 index 000000000..886296cc2 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_contact_info.html @@ -0,0 +1,125 @@ + + + + + +CORE POS - Fannie: ContactInfo Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        ContactInfo Class Reference
        +
        +
        +
        +Inheritance diagram for ContactInfo:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        SaveFormData ($memNum)
        HasSearch ()
        ShowSearchForm ()
        GetSearchResults ()
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/ContactInfo.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_contact_info.png b/documentation/doxy/output/fannie/html/class_contact_info.png new file mode 100644 index 000000000..4cc0dec28 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_contact_info.png differ diff --git a/documentation/doxy/output/fannie/html/class_database_functions-members.html b/documentation/doxy/output/fannie/html/class_database_functions-members.html new file mode 100644 index 000000000..04490212a --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_database_functions-members.html @@ -0,0 +1,45 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        DatabaseFunctions Member List

        This is the complete list of members for DatabaseFunctions, including all inherited members.

        + + + + + + + +
        $description (defined in DatabaseFunctions)DatabaseFunctions
        $required (defined in DatabaseFunctions)DatabaseFunctions
        disable()FannieModule
        enable()FannieModule
        provided_functions()FannieModule
        provides_functions() (defined in DatabaseFunctions)DatabaseFunctions
        run_module()FannieModule


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_database_functions.html b/documentation/doxy/output/fannie/html/class_database_functions.html new file mode 100644 index 000000000..147b284ad --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_database_functions.html @@ -0,0 +1,81 @@ + + +CORE POS - Fannie: DatabaseFunctions Class Reference + + + + +
        +
        + +

        DatabaseFunctions Class Reference

        Inheritance diagram for DatabaseFunctions: +

        + +FannieModule + +List of all members. + + + + + + + + + +

        Public Member Functions

        provides_functions ()

        Public Attributes

        $required = True
         $description
        +

        Detailed Description

        +Functions for common database tasks +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        DatabaseFunctions::$description
        +
        +
        + +

        +Initial value:

         "
        +        Provides functions for common database tasks
        +        "
        +
        +

        +Reimplemented from FannieModule. +

        +

        +


        The documentation for this class was generated from the following file:
          +
        • fannie/class-lib/db/DatabaseFunctions.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_database_functions.png b/documentation/doxy/output/fannie/html/class_database_functions.png new file mode 100644 index 000000000..0396a6c0d Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_database_functions.png differ diff --git a/documentation/doxy/output/fannie/html/class_equity-members.html b/documentation/doxy/output/fannie/html/class_equity-members.html new file mode 100644 index 000000000..c16572058 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_equity-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Equity Member List
        +
        +
        +This is the complete list of members for Equity, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in MemberModule)MemberModule
        ShowEditForm($memNum) (defined in Equity)Equity
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_equity.html b/documentation/doxy/output/fannie/html/class_equity.html new file mode 100644 index 000000000..3e2da99c8 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_equity.html @@ -0,0 +1,117 @@ + + + + + +CORE POS - Fannie: Equity Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Equity Class Reference
        +
        +
        +
        +Inheritance diagram for Equity:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/Equity.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_equity.png b/documentation/doxy/output/fannie/html/class_equity.png new file mode 100644 index 000000000..22ae9616a Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_equity.png differ diff --git a/documentation/doxy/output/fannie/html/class_fannie___standard___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_fannie___standard___p_d_f-members.html new file mode 100644 index 000000000..fe9b6b6e4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie___standard___p_d_f-members.html @@ -0,0 +1,101 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Fannie_Standard_PDF Member List
        +
        +
        +This is the complete list of members for Fannie_Standard_PDF, including all inherited members. + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in Fannie_Standard_PDF)Fannie_Standard_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in Fannie_Standard_PDF)Fannie_Standard_PDF
        GetCheckDigit($barcode) (defined in Fannie_Standard_PDF)Fannie_Standard_PDF
        TestCheckDigit($barcode) (defined in Fannie_Standard_PDF)Fannie_Standard_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in Fannie_Standard_PDF)Fannie_Standard_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_fannie___standard___p_d_f.html b/documentation/doxy/output/fannie/html/class_fannie___standard___p_d_f.html new file mode 100644 index 000000000..397513e40 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie___standard___p_d_f.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: Fannie_Standard_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Fannie_Standard_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/Fannie_Standard.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_cron-members.html b/documentation/doxy/output/fannie/html/class_fannie_cron-members.html new file mode 100644 index 000000000..30295e761 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_cron-members.html @@ -0,0 +1,50 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        FannieCron Member List

        This is the complete list of members for FannieCron, including all inherited members.

        + + + + + + + + + + + + +
        $advertisedFannieCron
        $description (defined in FannieCron)FannieCron
        $logfile (defined in FannieCron)FannieCron [protected]
        $required (defined in FannieCron)FannieCron
        cron_msg($str)FannieCron
        disable()FannieModule
        enable()FannieModule
        get_job_directory()FannieCron
        provided_functions()FannieModule
        run_module()FannieCron
        schedule_command()FannieCron
        task()FannieCron


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_cron.html b/documentation/doxy/output/fannie/html/class_fannie_cron.html new file mode 100644 index 000000000..1927f21e3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_cron.html @@ -0,0 +1,221 @@ + + +CORE POS - Fannie: FannieCron Class Reference + + + + +
        +
        + +

        FannieCron Class Reference

        Inheritance diagram for FannieCron: +

        + +FannieModule + +List of all members. + + + + + + + + + + + + + + + + + + + + + + +

        Public Member Functions

         get_job_directory ()
         run_module ()
         task ()
         cron_msg ($str)
         schedule_command ()

        Public Attributes

        $required = True
         $description
         $advertised = False

        Protected Attributes

        $logfile = "dayend.log"
        +

        Detailed Description

        +Module for building cronjobs
        Examples:
        + +

        +CronJob.php.

        +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + + +
        FannieCron::cron_msg ( str  ) 
        +
        +
        + +

        +Format string for logging

        Parameters:
        + + +
        $str message
        +
        +
        Returns:
        formatted message
        +Default format prepends datetime and module filename. Override as needed.
        Examples:
        +CronJob.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FannieCron::get_job_directory (  ) 
        +
        +
        + +

        +Get module's directory.

        Returns:
        string directory path
        + +
        +

        + +

        +
        + + + + + + + + +
        FannieCron::run_module (  ) 
        +
        +
        + +

        +Called when the module is used +

        +Reimplemented from FannieModule. +

        +

        + +

        +
        + + + + + + + + +
        FannieCron::schedule_command (  ) 
        +
        +
        + +

        +Get command for running module via command line

        Returns:
        command string
        + +
        +

        + +

        +
        + + + + + + + + +
        FannieCron::task (  ) 
        +
        +
        + +

        +Define your job here.

        Examples:
        +CronJob.php.
        +
        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        FannieCron::$advertised = False
        +
        +
        + +

        +Display this task in Fannie's task scheduler. Disable for store-specific jobs or jobs that must run as a different user than the web server. Fannie cannot schedule jobs for other users. +

        +

        + +

        +
        + + + + +
        FannieCron::$description
        +
        +
        + +

        +Initial value:

         "
        +        Base module for building cron jobs.
        +        "
        +
        +

        +Reimplemented from FannieModule. +

        +

        +


        The documentation for this class was generated from the following file:
          +
        • fannie/class-lib/FannieCron.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_cron.png b/documentation/doxy/output/fannie/html/class_fannie_cron.png new file mode 100644 index 000000000..d7d1a51a9 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_fannie_cron.png differ diff --git a/documentation/doxy/output/fannie/html/class_fannie_functions-members.html b/documentation/doxy/output/fannie/html/class_fannie_functions-members.html new file mode 100644 index 000000000..61f08c404 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_functions-members.html @@ -0,0 +1,44 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        FannieFunctions Member List

        This is the complete list of members for FannieFunctions, including all inherited members.

        + + + + + + +
        $description (defined in FannieFunctions)FannieFunctions
        $required (defined in FannieFunctions)FannieFunctions
        disable()FannieModule
        enable()FannieModule
        provided_functions()FannieFunctions
        run_module()FannieModule


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_functions.html b/documentation/doxy/output/fannie/html/class_fannie_functions.html new file mode 100644 index 000000000..d041d54f6 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_functions.html @@ -0,0 +1,104 @@ + + +CORE POS - Fannie: FannieFunctions Class Reference + + + + +
        +
        + +

        FannieFunctions Class Reference

        Inheritance diagram for FannieFunctions: +

        + +FannieModule + +List of all members. + + + + + + + + + +

        Public Member Functions

         provided_functions ()

        Public Attributes

        $required = True
         $description
        +

        Detailed Description

        +Functions for loading and registering modules +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + +
        FannieFunctions::provided_functions (  ) 
        +
        +
        + +

        +Get list of non-class functions this module provides

        Returns:
        array of function names
        + +

        +Reimplemented from FannieModule. +

        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        FannieFunctions::$description
        +
        +
        + +

        +Initial value:

         "
        +        Provides functions for registering
        +        and loading other modules.
        +        "
        +
        +

        +Reimplemented from FannieModule. +

        +

        +


        The documentation for this class was generated from the following file: +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_functions.png b/documentation/doxy/output/fannie/html/class_fannie_functions.png new file mode 100644 index 000000000..b439b3b7e Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_fannie_functions.png differ diff --git a/documentation/doxy/output/fannie/html/class_fannie_module-members.html b/documentation/doxy/output/fannie/html/class_fannie_module-members.html new file mode 100644 index 000000000..dd953560d --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_module-members.html @@ -0,0 +1,44 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        FannieModule Member List

        This is the complete list of members for FannieModule, including all inherited members.

        + + + + + + +
        $description (defined in FannieModule)FannieModule
        $required (defined in FannieModule)FannieModule
        disable()FannieModule
        enable()FannieModule
        provided_functions()FannieModule
        run_module()FannieModule


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_module.html b/documentation/doxy/output/fannie/html/class_fannie_module.html new file mode 100644 index 000000000..fae550efa --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_module.html @@ -0,0 +1,179 @@ + + +CORE POS - Fannie: FannieModule Class Reference + + + + +
        +
        + +

        FannieModule Class Reference

        Inheritance diagram for FannieModule: +

        + +DatabaseFunctions +FannieCron +FannieFunctions +FanniePage +FileFormats +LabelPDF +SQLManager +FannieReport +PrintShelftags + +List of all members. + + + + + + + + + + + + + + + +

        Public Member Functions

         enable ()
         disable ()
         run_module ()
         provided_functions ()

        Public Attributes

        $required = True
         $description
        +

        Detailed Description

        +Base class for Fannie.
        Examples:
        + +

        +FunctionLibrary.php, and SimpleHelloWorld.php.

        +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + +
        FannieModule::disable (  ) 
        +
        +
        + +

        +Called when module is disabled Automatically unregisters class +

        +

        + +

        +
        + + + + + + + + +
        FannieModule::enable (  ) 
        +
        +
        + +

        +Called when module is enabled Automatically registers class +

        +

        + +

        +
        + + + + + + + + +
        FannieModule::provided_functions (  ) 
        +
        +
        + +

        +Get list of non-class functions this module provides

        Returns:
        array of function names
        + +

        +Reimplemented in FannieFunctions.

        Examples:
        +FunctionLibrary.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FannieModule::run_module (  ) 
        +
        +
        + +

        +Called when the module is used +

        +Reimplemented in FannieCron, FanniePage, and LabelPDF.

        Examples:
        +SimpleHelloWorld.php.
        +
        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        FannieModule::$description
        +
        +
        + +

        +Initial value:

         "
        +        Base class for all Fannie Modules.
        +        "
        +
        +
        +

        +


        The documentation for this class was generated from the following file:
          +
        • fannie/class-lib/FannieModule.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_module.png b/documentation/doxy/output/fannie/html/class_fannie_module.png new file mode 100644 index 000000000..fa452be36 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_fannie_module.png differ diff --git a/documentation/doxy/output/fannie/html/class_fannie_page-members.html b/documentation/doxy/output/fannie/html/class_fannie_page-members.html new file mode 100644 index 000000000..a037e10c7 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_page-members.html @@ -0,0 +1,61 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        FanniePage Member List

        This is the complete list of members for FanniePage, including all inherited members.

        + + + + + + + + + + + + + + + + + + + + + + + +
        $description (defined in FanniePage)FanniePage
        $header (defined in FanniePage)FanniePage [protected]
        $onload_commands (defined in FanniePage)FanniePage [protected]
        $required (defined in FanniePage)FanniePage
        $scripts (defined in FanniePage)FanniePage [protected]
        $title (defined in FanniePage)FanniePage [protected]
        $window_dressing (defined in FanniePage)FanniePage [protected]
        add_onload_command($str)FanniePage
        add_script($file_url, $type="text/javascript")FanniePage
        body_content()FanniePage
        css_content()FanniePage
        disable()FannieModule
        enable()FannieModule
        form_tag($type='post')FanniePage
        get_footer()FanniePage
        get_header()FanniePage
        has_menus($menus)FanniePage
        javascript_content()FanniePage
        module_url()FanniePage
        preprocess()FanniePage
        provided_functions()FannieModule
        provides_functions() (defined in FanniePage)FanniePage
        run_module()FanniePage


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_page.html b/documentation/doxy/output/fannie/html/class_fannie_page.html new file mode 100644 index 000000000..4d788a516 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_page.html @@ -0,0 +1,406 @@ + + +CORE POS - Fannie: FanniePage Class Reference + + + + +
        +
        + +

        FanniePage Class Reference

        Inheritance diagram for FanniePage: +

        + +FannieModule +FannieReport +PrintShelftags + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Public Member Functions

         has_menus ($menus)
         get_header ()
         get_footer ()
         preprocess ()
         body_content ()
         javascript_content ()
         add_script ($file_url, $type="text/javascript")
         css_content ()
         add_onload_command ($str)
         run_module ()
         form_tag ($type='post')
         module_url ()
        provides_functions ()

        Public Attributes

        $required = True
         $description

        Protected Attributes

        $title = 'Page window title'
        $header = 'Page displayed header'
        $window_dressing = True
        $onload_commands = array()
        $scripts = array()
        +

        Detailed Description

        +Class for drawing screens
        Examples:
        + +

        +BetterHelloWorld.php.

        +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + + +
        FanniePage::add_onload_command ( str  ) 
        +
        +
        + +

        +Queue javascript commands to run on page load +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        FanniePage::add_script ( file_url,
        type = "text/javascript" 
        )
        +
        +
        + +

        +Add a script to the page using <script> tags

        Parameters:
        + + + +
        $file_url the script URL
        $type the script type
        +
        + +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::body_content (  ) 
        +
        +
        + +

        +Define the main displayed content

        Returns:
        An HTML string
        + +

        +Reimplemented in FannieReport, and PrintShelftags.

        Examples:
        +BetterHelloWorld.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::css_content (  ) 
        +
        +
        + +

        +Define any CSS needed

        Returns:
        A CSS string
        + +

        +Reimplemented in PrintShelftags. +

        +

        + +

        +
        + + + + + + + + + +
        FanniePage::form_tag ( type = 'post'  ) 
        +
        +
        + +

        +Get a form tag with this module as the action

        Parameters:
        + + +
        $type form method (get or post)
        +
        +
        Returns:
        An HTML string
        +
        Examples:
        +SimpleReport.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::get_footer (  ) 
        +
        +
        + +

        +Get the standard footer

        Returns:
        An HTML string
        + +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::get_header (  ) 
        +
        +
        + +

        +Get the standard header

        Returns:
        An HTML string
        + +
        +

        + +

        +
        + + + + + + + + + +
        FanniePage::has_menus ( menus  ) 
        +
        +
        + +

        +Toggle using menus

        Parameters:
        + + +
        $menus boolean
        +
        + +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::javascript_content (  ) 
        +
        +
        + +

        +Define any javascript needed

        Returns:
        A javascript string
        + +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::module_url (  ) 
        +
        +
        + +

        +Get the URL for this page

        Returns:
        A URL string
        +
        Examples:
        +SimpleReport.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::preprocess (  ) 
        +
        +
        + +

        +Handle pre-display tasks such as input processing

        Returns:
          +
        • True if the page should be displayed
        • False to stop here
        +
        +Common uses include redirecting to a different module and altering body content based on input +

        +Reimplemented in PrintShelftags.

        Examples:
        +SimpleReport.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FanniePage::run_module (  ) 
        +
        +
        + +

        +Check for input and display the page +

        +Reimplemented from FannieModule. +

        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        FanniePage::$description
        +
        +
        + +

        +Initial value:

         "
        +        Base class for creating HTML pages.
        +        "
        +
        +

        +Reimplemented from FannieModule. +

        +

        +


        The documentation for this class was generated from the following file: +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_page.png b/documentation/doxy/output/fannie/html/class_fannie_page.png new file mode 100644 index 000000000..182b3341a Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_fannie_page.png differ diff --git a/documentation/doxy/output/fannie/html/class_fannie_report-members.html b/documentation/doxy/output/fannie/html/class_fannie_report-members.html new file mode 100644 index 000000000..7575b7b51 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_report-members.html @@ -0,0 +1,65 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        FannieReport Member List

        This is the complete list of members for FannieReport, including all inherited members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $description (defined in FannieReport)FannieReport
        $header (defined in FanniePage)FanniePage [protected]
        $modeFannieReport [protected]
        $onload_commands (defined in FanniePage)FanniePage [protected]
        $required (defined in FannieReport)FannieReport
        $scripts (defined in FanniePage)FanniePage [protected]
        $title (defined in FanniePage)FanniePage [protected]
        $window_dressing (defined in FanniePage)FanniePage [protected]
        add_onload_command($str)FanniePage
        add_script($file_url, $type="text/javascript")FanniePage
        body_content()FannieReport
        css_content()FanniePage
        disable()FannieModule
        download($filename, $type)FannieReport
        enable()FannieModule
        form_tag($type='post')FanniePage
        get_footer()FanniePage
        get_header()FanniePage
        has_menus($menus)FanniePage
        javascript_content()FanniePage
        module_url()FanniePage
        preprocess()FanniePage
        provided_functions()FannieModule
        provides_functions() (defined in FannieReport)FannieReport
        report_form()FannieReport
        report_results()FannieReport
        run_module()FanniePage


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_report.html b/documentation/doxy/output/fannie/html/class_fannie_report.html new file mode 100644 index 000000000..c4bf35c6e --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_fannie_report.html @@ -0,0 +1,217 @@ + + +CORE POS - Fannie: FannieReport Class Reference + + + + +
        +
        + +

        FannieReport Class Reference

        Inheritance diagram for FannieReport: +

        + +FanniePage +FannieModule + +List of all members. + + + + + + + + + + + + + + + + + + + + +

        Public Member Functions

         body_content ()
         report_form ()
         report_results ()
         download ($filename, $type)
        provides_functions ()

        Public Attributes

        $required = True
         $description

        Protected Attributes

         $mode = 'form'
        +

        Detailed Description

        +Class for creating reports
        Examples:
        + +

        +SimpleReport.php.

        +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + +
        FannieReport::body_content (  ) 
        +
        +
        + +

        +Define the main displayed content

        Returns:
        An HTML string
        + +

        +Reimplemented from FanniePage. +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        FannieReport::download ( filename,
        type 
        )
        +
        +
        + +

        +Send headers and remove extra HTML for download

        Parameters:
        + + + +
        $filename the file name
        $type the file type. Currently allowed:
          +
        • excel
        +
        +
        +
        Examples:
        +SimpleReport.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FannieReport::report_form (  ) 
        +
        +
        + +

        +If the mode property is 'form', this function is called for main content

        Returns:
        An HTML string
        +
        Examples:
        +SimpleReport.php.
        +
        +

        + +

        +
        + + + + + + + + +
        FannieReport::report_results (  ) 
        +
        +
        + +

        +If the mode property is 'results', this function is called for main content

        Returns:
        An HTML string
        +
        Examples:
        +SimpleReport.php.
        +
        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        FannieReport::$description
        +
        +
        + +

        +Initial value:

         "
        +        Class for creating downloadable reports
        +        "
        +
        +

        +Reimplemented from FanniePage. +

        +

        + +

        +
        + + + + +
        FannieReport::$mode = 'form' [protected]
        +
        +
        + +

        +Many reports have two display modes: One is a form to allow user input(s) and the other shows the resulting report

        +FannieReport provides separate methods for these two common display modes. You can change $mode to alter which display method is used.

        + +
        +

        +


        The documentation for this class was generated from the following file: +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_fannie_report.png b/documentation/doxy/output/fannie/html/class_fannie_report.png new file mode 100644 index 000000000..2b3dd5cc7 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_fannie_report.png differ diff --git a/documentation/doxy/output/fannie/html/class_file_formats-members.html b/documentation/doxy/output/fannie/html/class_file_formats-members.html new file mode 100644 index 000000000..450e8c8a6 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_file_formats-members.html @@ -0,0 +1,45 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        FileFormats Member List

        This is the complete list of members for FileFormats, including all inherited members.

        + + + + + + + +
        $description (defined in FileFormats)FileFormats
        $required (defined in FileFormats)FileFormats
        disable()FannieModule
        enable()FannieModule
        provided_functions()FannieModule
        provides_functions() (defined in FileFormats)FileFormats
        run_module()FannieModule


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_file_formats.html b/documentation/doxy/output/fannie/html/class_file_formats.html new file mode 100644 index 000000000..c417eb60c --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_file_formats.html @@ -0,0 +1,82 @@ + + +CORE POS - Fannie: FileFormats Class Reference + + + + +
        +
        + +

        FileFormats Class Reference

        Inheritance diagram for FileFormats: +

        + +FannieModule + +List of all members. + + + + + + + + + +

        Public Member Functions

        provides_functions ()

        Public Attributes

        $required = True
         $description
        +

        Detailed Description

        +Functions for manipulating common file formats +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        FileFormats::$description
        +
        +
        + +

        +Initial value:

         "
        +        Provides functions for manipulating files of
        +        various formats.
        +        "
        +
        +

        +Reimplemented from FannieModule. +

        +

        +


        The documentation for this class was generated from the following file: +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_file_formats.png b/documentation/doxy/output/fannie/html/class_file_formats.png new file mode 100644 index 000000000..8b609acc6 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_file_formats.png differ diff --git a/documentation/doxy/output/fannie/html/class_household_members-members.html b/documentation/doxy/output/fannie/html/class_household_members-members.html new file mode 100644 index 000000000..e7ec8f4fb --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_household_members-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        HouseholdMembers Member List
        +
        +
        +This is the complete list of members for HouseholdMembers, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in HouseholdMembers)HouseholdMembers
        ShowEditForm($memNum) (defined in HouseholdMembers)HouseholdMembers
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_household_members.html b/documentation/doxy/output/fannie/html/class_household_members.html new file mode 100644 index 000000000..861bb2823 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_household_members.html @@ -0,0 +1,119 @@ + + + + + +CORE POS - Fannie: HouseholdMembers Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        HouseholdMembers Class Reference
        +
        +
        +
        +Inheritance diagram for HouseholdMembers:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        SaveFormData ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/HouseholdMembers.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_household_members.png b/documentation/doxy/output/fannie/html/class_household_members.png new file mode 100644 index 000000000..c35ab9093 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_household_members.png differ diff --git a/documentation/doxy/output/fannie/html/class_label_p_d_f-members.html b/documentation/doxy/output/fannie/html/class_label_p_d_f-members.html new file mode 100644 index 000000000..9b95245a4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_label_p_d_f-members.html @@ -0,0 +1,47 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        LabelPDF Member List

        This is the complete list of members for LabelPDF, including all inherited members.

        + + + + + + + + + +
        $description (defined in LabelPDF)LabelPDF
        $required (defined in LabelPDF)LabelPDF
        disable()FannieModule
        enable()FannieModule
        output_pdf()LabelPDF
        provided_functions()FannieModule
        run_module()LabelPDF
        set_data($d)LabelPDF
        set_offset($o)LabelPDF


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_label_p_d_f.html b/documentation/doxy/output/fannie/html/class_label_p_d_f.html new file mode 100644 index 000000000..0bbe52891 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_label_p_d_f.html @@ -0,0 +1,169 @@ + + +CORE POS - Fannie: LabelPDF Class Reference + + + + +
        +
        + +

        LabelPDF Class Reference

        Inheritance diagram for LabelPDF: +

        + +FannieModule + +List of all members. + + + + + + + + + + + + + + + +

        Public Member Functions

         set_data ($d)
         set_offset ($o)
         run_module ()
         output_pdf ()

        Public Attributes

        $required = True
        $description = "Module for generating label PDFs"
        +

        Detailed Description

        +Fannie module for generating label PDFs +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + +
        LabelPDF::output_pdf (  ) 
        +
        +
        + +

        +Create and output the PDF. The easiest way is using BarcodePDF's Output() method. +

        +set up location variable starts

        +increment through items in query

        +check to see if we have made 32 labels. if we have start a new page....

        +check to see if we have reached the right most label if we have reset all left hands back to initial values

        +instantiate variables for printing on barcode from $testQ query result set

        +determine check digit using barcode.php function

        +get tag creation date (today)

        +begin creating tag

        +add check digit to pid from testQ

        +increment label parameters for next label

        +write to PDF +

        +

        + +

        +
        + + + + + + + + +
        LabelPDF::run_module (  ) 
        +
        +
        + +

        +Called when the module is used +

        +Reimplemented from FannieModule. +

        +

        + +

        +
        + + + + + + + + + +
        LabelPDF::set_data ( d  ) 
        +
        +
        + +

        +Set label data

        Parameters:
        + + +
        $d an array of records
        +
        + +
        +

        + +

        +
        + + + + + + + + + +
        LabelPDF::set_offset ( o  ) 
        +
        +
        + +

        +Set offset (skip first X labels)

        Parameters:
        + + +
        $o number of labels to skip
        +
        + +
        +

        +


        The documentation for this class was generated from the following file:
          +
        • fannie/class-lib/formats/LabelPDF.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_label_p_d_f.png b/documentation/doxy/output/fannie/html/class_label_p_d_f.png new file mode 100644 index 000000000..f0d3a3cc1 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_label_p_d_f.png differ diff --git a/documentation/doxy/output/fannie/html/class_mem_dates-members.html b/documentation/doxy/output/fannie/html/class_mem_dates-members.html new file mode 100644 index 000000000..37058b8a3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_mem_dates-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        MemDates Member List
        +
        +
        +This is the complete list of members for MemDates, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in MemDates)MemDates
        ShowEditForm($memNum) (defined in MemDates)MemDates
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_mem_dates.html b/documentation/doxy/output/fannie/html/class_mem_dates.html new file mode 100644 index 000000000..52b656a30 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_mem_dates.html @@ -0,0 +1,119 @@ + + + + + +CORE POS - Fannie: MemDates Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        MemDates Class Reference
        +
        +
        +
        +Inheritance diagram for MemDates:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        SaveFormData ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/MemDates.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_mem_dates.png b/documentation/doxy/output/fannie/html/class_mem_dates.png new file mode 100644 index 000000000..42d3ab08e Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_mem_dates.png differ diff --git a/documentation/doxy/output/fannie/html/class_mem_type-members.html b/documentation/doxy/output/fannie/html/class_mem_type-members.html new file mode 100644 index 000000000..d5989f96f --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_mem_type-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        MemType Member List
        +
        +
        +This is the complete list of members for MemType, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in MemType)MemType
        ShowEditForm($memNum) (defined in MemType)MemType
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_mem_type.html b/documentation/doxy/output/fannie/html/class_mem_type.html new file mode 100644 index 000000000..402e8e929 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_mem_type.html @@ -0,0 +1,119 @@ + + + + + +CORE POS - Fannie: MemType Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        MemType Class Reference
        +
        +
        +
        +Inheritance diagram for MemType:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        SaveFormData ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/MemType.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_mem_type.png b/documentation/doxy/output/fannie/html/class_mem_type.png new file mode 100644 index 000000000..9e7146457 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_mem_type.png differ diff --git a/documentation/doxy/output/fannie/html/class_member_module-members.html b/documentation/doxy/output/fannie/html/class_member_module-members.html new file mode 100644 index 000000000..7d25de01a --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_member_module-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        MemberModule Member List
        +
        +
        +This is the complete list of members for MemberModule, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in MemberModule)MemberModule
        ShowEditForm($memNum) (defined in MemberModule)MemberModule
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_member_module.html b/documentation/doxy/output/fannie/html/class_member_module.html new file mode 100644 index 000000000..37d27d27c --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_member_module.html @@ -0,0 +1,136 @@ + + + + + +CORE POS - Fannie: MemberModule Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        MemberModule Class Reference
        +
        +
        +
        +Inheritance diagram for MemberModule:
        +
        +
        + + +AR +ContactInfo +Equity +HouseholdMembers +MemDates +MemType +Notes +Suspension + +
        + +

        List of all members.

        + + + + + + + + + +

        +Public Member Functions

        db ()
        ShowEditForm ($memNum)
        SaveFormData ($memNum)
        HasSearch ()
        ShowSearchForm ()
        GetSearchResults ()
        RunCron ()
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/MemberModule.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_member_module.png b/documentation/doxy/output/fannie/html/class_member_module.png new file mode 100644 index 000000000..5230262ea Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_member_module.png differ diff --git a/documentation/doxy/output/fannie/html/class_no___barcode___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_no___barcode___p_d_f-members.html new file mode 100644 index 000000000..4e4cb81cd --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_no___barcode___p_d_f-members.html @@ -0,0 +1,101 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        No_Barcode_PDF Member List
        +
        +
        +This is the complete list of members for No_Barcode_PDF, including all inherited members. + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in No_Barcode_PDF)No_Barcode_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in No_Barcode_PDF)No_Barcode_PDF
        GetCheckDigit($barcode) (defined in No_Barcode_PDF)No_Barcode_PDF
        TestCheckDigit($barcode) (defined in No_Barcode_PDF)No_Barcode_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in No_Barcode_PDF)No_Barcode_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_no___barcode___p_d_f.html b/documentation/doxy/output/fannie/html/class_no___barcode___p_d_f.html new file mode 100644 index 000000000..2e9eb5ea4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_no___barcode___p_d_f.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: No_Barcode_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        No_Barcode_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/No_Barcode.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_notes-members.html b/documentation/doxy/output/fannie/html/class_notes-members.html new file mode 100644 index 000000000..604a46509 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_notes-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Notes Member List
        +
        +
        +This is the complete list of members for Notes, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in MemberModule)MemberModule
        ShowEditForm($memNum) (defined in Notes)Notes
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_notes.html b/documentation/doxy/output/fannie/html/class_notes.html new file mode 100644 index 000000000..517a2d7e7 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_notes.html @@ -0,0 +1,117 @@ + + + + + +CORE POS - Fannie: Notes Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Notes Class Reference
        +
        +
        +
        +Inheritance diagram for Notes:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/Notes.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_notes.png b/documentation/doxy/output/fannie/html/class_notes.png new file mode 100644 index 000000000..466345ba9 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_notes.png differ diff --git a/documentation/doxy/output/fannie/html/class_o_l_e-members.html b/documentation/doxy/output/fannie/html/class_o_l_e-members.html new file mode 100644 index 000000000..ea1010698 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e-members.html @@ -0,0 +1,121 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        OLE Member List
        +
        +
        +This is the complete list of members for OLE, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_file_handle (defined in OLE)OLE
        $_list (defined in OLE)OLE
        $bbat (defined in OLE)OLE
        $bigBlockSize (defined in OLE)OLE
        $root (defined in OLE)OLE
        $sbat (defined in OLE)OLE
        $smallBlockSize (defined in OLE)OLE
        _getBlockOffset($blockId)OLE
        _OLE()OLE
        _ppsTreeComplete($index)OLE
        _readInt1($fh)OLE
        _readInt2($fh)OLE
        _readInt4($fh)OLE
        _readPpsWks($blockId)OLE
        Asc2Ucs($ascii)OLE [static]
        getData($index, $position, $length)OLE
        getDataLength($index)OLE
        getStream($blockIdOrPps)OLE
        isFile($index)OLE
        isRoot($index)OLE
        LocalDate2OLE($date=null)OLE [static]
        OLE()OLE
        OLE2LocalDate($string)OLE [static]
        ppsTotal()OLE
        read($file)OLE
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e.html b/documentation/doxy/output/fannie/html/class_o_l_e.html new file mode 100644 index 000000000..5cfa49aca --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e.html @@ -0,0 +1,596 @@ + + + + + +CORE POS - Fannie: OLE Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        + +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         OLE ()
         _OLE ()
         read ($file)
         _getBlockOffset ($blockId)
         getStream ($blockIdOrPps)
         _readInt1 ($fh)
         _readInt2 ($fh)
         _readInt4 ($fh)
         _readPpsWks ($blockId)
         _ppsTreeComplete ($index)
         isFile ($index)
         isRoot ($index)
         ppsTotal ()
         getData ($index, $position, $length)
         getDataLength ($index)

        +Static Public Member Functions

         Asc2Ucs ($ascii)
         LocalDate2OLE ($date=null)
         OLE2LocalDate ($string)

        +Public Attributes

        $_file_handle
        $_list
        $root
        $bbat
        $sbat
        $bigBlockSize
        $smallBlockSize
        +

        Member Function Documentation

        + +
        +
        + + + + + + + + +
        OLE::_getBlockOffset (blockId)
        +
        +
        +
        Parameters:
        + + +
        int$blockIdblock id
        +
        +
        +
        Returns:
        int byte offset from beginning of file private
        + +
        +
        + +
        +
        + + + + + + + +
        OLE::_OLE ()
        +
        +
        +

        Destructor (using PEAR) Just closes the file handle on the OLE file.

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::_ppsTreeComplete (index)
        +
        +
        +

        It checks whether the PPS tree is complete (all PPS's read) starting with the given PPS (not necessarily root)

        +

        private

        +
        Parameters:
        + + +
        integer$indexThe index of the PPS from which we are checking
        +
        +
        +
        Returns:
        boolean Whether the PPS tree for the given PPS is complete
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::_readInt1 (fh)
        +
        +
        +

        Reads a signed char.

        +
        Parameters:
        + + +
        resource$fhfile handle
        +
        +
        +
        Returns:
        int private
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::_readInt2 (fh)
        +
        +
        +

        Reads an unsigned short (2 octets).

        +
        Parameters:
        + + +
        resource$fhfile handle
        +
        +
        +
        Returns:
        int private
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::_readInt4 (fh)
        +
        +
        +

        Reads an unsigned long (4 octets).

        +
        Parameters:
        + + +
        resourcefile handle
        +
        +
        +
        Returns:
        int private
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::_readPpsWks (blockId)
        +
        +
        +

        Gets information about all PPS's on the OLE container from the PPS WK's creates an OLE_PPS object for each one.

        +

        private

        +
        Parameters:
        + + +
        integer$blockIdthe block id of the first block
        +
        +
        +
        Returns:
        mixed true on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::Asc2Ucs (ascii) [static]
        +
        +
        +

        Utility function to transform ASCII text to Unicode

        +

        public

        +
        Parameters:
        + + +
        string$asciiThe ASCII string to transform
        +
        +
        +
        Returns:
        string The string in Unicode
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        OLE::getData (index,
        position,
        length 
        )
        +
        +
        +

        Gets data from a PPS If there is no PPS for the index given, it will return an empty string.

        +
        Parameters:
        + + + + +
        integer$indexThe index for the PPS
        integer$positionThe position from which to start reading (relative to the PPS)
        integer$lengthThe amount of bytes to read (at most)
        +
        +
        +
        Returns:
        string The binary string containing the data requested public
        +
        See also:
        OLE_PPS_File::getStream()
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::getDataLength (index)
        +
        +
        +

        Gets the data length from a PPS If there is no PPS for the index given, it will return 0.

        +
        Parameters:
        + + +
        integer$indexThe index for the PPS
        +
        +
        +
        Returns:
        integer The amount of bytes in data the PPS has public
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::getStream (blockIdOrPps)
        +
        +
        +

        Returns a stream for use with fread() etc. External callers should use OLE_PPS_File::getStream().

        +
        Parameters:
        + + +
        int | PPS$blockIdOrPpsblock id or PPS
        +
        +
        +
        Returns:
        resource read-only stream
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::isFile (index)
        +
        +
        +

        Checks whether a PPS is a File PPS or not. If there is no PPS for the index given, it will return false.

        +
        Parameters:
        + + +
        integer$indexThe index for the PPS
        +
        +
        +
        Returns:
        bool true if it's a File PPS, false otherwise public
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::isRoot (index)
        +
        +
        +

        Checks whether a PPS is a Root PPS or not. If there is no PPS for the index given, it will return false.

        +
        Parameters:
        + + +
        integer$indexThe index for the PPS.
        +
        +
        +
        Returns:
        bool true if it's a Root PPS, false otherwise public
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::LocalDate2OLE (date = null) [static]
        +
        +
        +

        Utility function Returns a string for the OLE container with the date given

        +

        public

        +
        Parameters:
        + + +
        integer$dateA timestamp
        +
        +
        +
        Returns:
        string The string for the OLE container
        + +
        +
        + +
        +
        + + + + + + + +
        OLE::OLE ()
        +
        +
        +

        Creates a new OLE object public

        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::OLE2LocalDate (string) [static]
        +
        +
        +

        Returns a timestamp from an OLE container's date

        +
        Parameters:
        + + +
        integer$stringA binary string with the encoded date
        +
        +
        +
        Returns:
        string The timestamp corresponding to the string public
        + +
        +
        + +
        +
        + + + + + + + +
        OLE::ppsTotal ()
        +
        +
        +

        Gives the total number of PPS's found in the OLE container.

        +
        Returns:
        integer The total number of PPS's found in the OLE container public
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE::read (file)
        +
        +
        +

        Reads an OLE container from the contents of the file given.

        +

        public

        +
        Parameters:
        + + +
        string$file
        +
        +
        +
        Returns:
        mixed true on success, PEAR_Error on failure
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/OLE/OLE.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___chained_block_stream-members.html b/documentation/doxy/output/fannie/html/class_o_l_e___chained_block_stream-members.html new file mode 100644 index 000000000..eaaa05c86 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___chained_block_stream-members.html @@ -0,0 +1,107 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        OLE_ChainedBlockStream Member List
        +
        + + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___chained_block_stream.html b/documentation/doxy/output/fannie/html/class_o_l_e___chained_block_stream.html new file mode 100644 index 000000000..d9269547e --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___chained_block_stream.html @@ -0,0 +1,308 @@ + + + + + +CORE POS - Fannie: OLE_ChainedBlockStream Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        OLE_ChainedBlockStream Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + + + +

        +Public Member Functions

         stream_open ($path, $mode, $options, &$openedPath)
         stream_close ()
         stream_read ($count)
         stream_eof ()
         stream_tell ()
         stream_seek ($offset, $whence)
         stream_stat ()

        +Public Attributes

        $ole
        $params
        $data
        $pos
        +

        Member Function Documentation

        + +
        + +
        +

        Implements support for fclose().

        +
        Returns:
        string
        + +
        +
        + +
        + +
        +

        Implements support for feof().

        +
        Returns:
        bool TRUE if the file pointer is at EOF; otherwise FALSE
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        OLE_ChainedBlockStream::stream_open (path,
        mode,
        options,
        &$ openedPath 
        )
        +
        +
        +

        Implements support for fopen(). For creating streams using this wrapper, use OLE_PPS_File::getStream().

        +
        Parameters:
        + + + + + +
        stringresource name including scheme, e.g. ole-chainedblockstream://oleInstanceId=1
        stringonly "r" is supported
        intmask of STREAM_REPORT_ERRORS and STREAM_USE_PATH
        stringabsolute path of the opened stream (out parameter)
        +
        +
        +
        Returns:
        bool true on success
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_ChainedBlockStream::stream_read (count)
        +
        +
        +

        Implements support for fread(), fgets() etc.

        +
        Parameters:
        + + +
        intmaximum number of bytes to read
        +
        +
        +
        Returns:
        string
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        OLE_ChainedBlockStream::stream_seek (offset,
        whence 
        )
        +
        +
        +

        Implements support for fseek().

        +
        Parameters:
        + + + +
        intbyte offset
        intSEEK_SET, SEEK_CUR or SEEK_END
        +
        +
        +
        Returns:
        bool
        + +
        +
        + +
        + +
        +

        Implements support for fstat(). Currently the only supported field is "size".

        +
        Returns:
        array
        + +
        +
        + +
        + +
        +

        Returns the position of the file pointer, i.e. its offset into the file stream. Implements support for ftell().

        +
        Returns:
        int
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/OLE/ChainedBlockStream.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s-members.html b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s-members.html new file mode 100644 index 000000000..c98a91c37 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s-members.html @@ -0,0 +1,113 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        OLE_PPS Member List
        +
        +
        +This is the complete list of members for OLE_PPS, including all inherited members. + + + + + + + + + + + + + + + + + +
        $_data (defined in OLE_PPS)OLE_PPS
        $_StartBlock (defined in OLE_PPS)OLE_PPS
        $children (defined in OLE_PPS)OLE_PPS
        $DirPps (defined in OLE_PPS)OLE_PPS
        $Name (defined in OLE_PPS)OLE_PPS
        $NextPps (defined in OLE_PPS)OLE_PPS
        $No (defined in OLE_PPS)OLE_PPS
        $ole (defined in OLE_PPS)OLE_PPS
        $PrevPps (defined in OLE_PPS)OLE_PPS
        $Size (defined in OLE_PPS)OLE_PPS
        $Time1st (defined in OLE_PPS)OLE_PPS
        $Time2nd (defined in OLE_PPS)OLE_PPS
        $Type (defined in OLE_PPS)OLE_PPS
        _DataLen()OLE_PPS
        _getPpsWk()OLE_PPS
        _savePpsSetPnt(&$pps_array)OLE_PPS
        OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children)OLE_PPS
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s.html b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s.html new file mode 100644 index 000000000..403a242c9 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s.html @@ -0,0 +1,306 @@ + + + + + +CORE POS - Fannie: OLE_PPS Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        OLE_PPS Class Reference
        +
        +
        +
        +Inheritance diagram for OLE_PPS:
        +
        +
        + + +OLE_PPS_File +OLE_PPS_Root + +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         OLE_PPS ($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children)
         _DataLen ()
         _getPpsWk ()
         _savePpsSetPnt (&$pps_array)

        +Public Attributes

        $No
        $Name
        $Type
        $PrevPps
        $NextPps
        $DirPps
        $Time1st
        $Time2nd
        $_StartBlock
        $Size
        $_data
        $children = array()
        $ole
        +

        Member Function Documentation

        + +
        +
        + + + + + + + +
        OLE_PPS::_DataLen ()
        +
        +
        +

        Returns the amount of data saved for this PPS

        +

        private

        +
        Returns:
        integer The amount of data (in bytes)
        + +
        +
        + +
        +
        + + + + + + + +
        OLE_PPS::_getPpsWk ()
        +
        +
        +

        Returns a string with the PPS's WK (What is a WK?)

        +

        private

        +
        Returns:
        string The binary string
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS::_savePpsSetPnt (&$ pps_array)
        +
        +
        +

        Updates index and pointers to previous, next and children PPS's for this PPS. I don't think it'll work with Dir PPS's.

        +

        private

        +
        Parameters:
        + + +
        array&$pps_arrayReference to the array of PPS's for the whole OLE container
        +
        +
        +
        Returns:
        integer The index for this PPS
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        OLE_PPS::OLE_PPS (No,
        name,
        type,
        prev,
        next,
        dir,
        time_1st,
        time_2nd,
        data,
        children 
        )
        +
        +
        +

        The constructor

        +

        public

        +
        Parameters:
        + + + + + + + + + + + +
        integer$NoThe PPS index
        string$nameThe PPS name
        integer$typeThe PPS type. Dir, Root or File
        integer$prevThe index of the previous PPS
        integer$nextThe index of the next PPS
        integer$dirThe index of it's first child if this is a Dir or Root PPS
        integer$time_1stA timestamp
        integer$time_2ndA timestamp
        string$dataThe (usually binary) source data of the PPS
        array$childrenArray containing children PPS for this PPS
        +
        +
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/OLE/PPS.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s.png b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s.png new file mode 100644 index 000000000..aa987247c Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s.png differ diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file-members.html b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file-members.html new file mode 100644 index 000000000..237a08408 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file-members.html @@ -0,0 +1,119 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        OLE_PPS_File Member List
        +
        +
        +This is the complete list of members for OLE_PPS_File, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + +
        $_data (defined in OLE_PPS)OLE_PPS
        $_StartBlock (defined in OLE_PPS)OLE_PPS
        $_tmp_dir (defined in OLE_PPS_File)OLE_PPS_File
        $children (defined in OLE_PPS)OLE_PPS
        $DirPps (defined in OLE_PPS)OLE_PPS
        $Name (defined in OLE_PPS)OLE_PPS
        $NextPps (defined in OLE_PPS)OLE_PPS
        $No (defined in OLE_PPS)OLE_PPS
        $ole (defined in OLE_PPS)OLE_PPS
        $PrevPps (defined in OLE_PPS)OLE_PPS
        $Size (defined in OLE_PPS)OLE_PPS
        $Time1st (defined in OLE_PPS)OLE_PPS
        $Time2nd (defined in OLE_PPS)OLE_PPS
        $Type (defined in OLE_PPS)OLE_PPS
        _DataLen()OLE_PPS
        _getPpsWk()OLE_PPS
        _savePpsSetPnt(&$pps_array)OLE_PPS
        append($data)OLE_PPS_File
        getStream()OLE_PPS_File
        init()OLE_PPS_File
        OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children)OLE_PPS
        OLE_PPS_File($name)OLE_PPS_File
        setTempDir($dir)OLE_PPS_File
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file.html b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file.html new file mode 100644 index 000000000..1bcaf41d3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file.html @@ -0,0 +1,240 @@ + + + + + +CORE POS - Fannie: OLE_PPS_File Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        OLE_PPS_File Class Reference
        +
        +
        +
        +Inheritance diagram for OLE_PPS_File:
        +
        +
        + + +OLE_PPS + +
        + +

        List of all members.

        + + + + + + + + + +

        +Public Member Functions

         OLE_PPS_File ($name)
         setTempDir ($dir)
         init ()
         append ($data)
         getStream ()

        +Public Attributes

        $_tmp_dir
        +

        Member Function Documentation

        + +
        +
        + + + + + + + + +
        OLE_PPS_File::append (data)
        +
        +
        +

        Append data to PPS

        +

        public

        +
        Parameters:
        + + +
        string$dataThe data to append
        +
        +
        + +
        +
        + +
        +
        + + + + + + + +
        OLE_PPS_File::getStream ()
        +
        +
        +

        Returns a stream for reading this file using fread() etc.

        +
        Returns:
        resource a read-only stream
        + +
        +
        + +
        +
        + + + + + + + +
        OLE_PPS_File::init ()
        +
        +
        +

        Initialization method. Has to be called right after OLE_PPS_File().

        +

        public

        +
        Returns:
        mixed true on success. PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_File::OLE_PPS_File (name)
        +
        +
        +

        The constructor

        +

        public

        +
        Parameters:
        + + +
        string$nameThe name of the file (in Unicode)
        +
        +
        +
        See also:
        OLE::Asc2Ucs()
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_File::setTempDir (dir)
        +
        +
        +

        Sets the temp dir used for storing the OLE file

        +

        public

        +
        Parameters:
        + + +
        string$dirThe dir to be used as temp dir
        +
        +
        +
        Returns:
        true if given dir is valid, false otherwise
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/OLE/PPS/File.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file.png b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file.png new file mode 100644 index 000000000..1b7fdc261 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___file.png differ diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root-members.html b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root-members.html new file mode 100644 index 000000000..3ebe21fb2 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root-members.html @@ -0,0 +1,124 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        OLE_PPS_Root Member List
        +
        +
        +This is the complete list of members for OLE_PPS_Root, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_data (defined in OLE_PPS)OLE_PPS
        $_StartBlock (defined in OLE_PPS)OLE_PPS
        $_tmp_dir (defined in OLE_PPS_Root)OLE_PPS_Root
        $children (defined in OLE_PPS)OLE_PPS
        $DirPps (defined in OLE_PPS)OLE_PPS
        $Name (defined in OLE_PPS)OLE_PPS
        $NextPps (defined in OLE_PPS)OLE_PPS
        $No (defined in OLE_PPS)OLE_PPS
        $ole (defined in OLE_PPS)OLE_PPS
        $PrevPps (defined in OLE_PPS)OLE_PPS
        $Size (defined in OLE_PPS)OLE_PPS
        $Time1st (defined in OLE_PPS)OLE_PPS
        $Time2nd (defined in OLE_PPS)OLE_PPS
        $Type (defined in OLE_PPS)OLE_PPS
        _adjust2($i2)OLE_PPS_Root
        _calcSize(&$raList)OLE_PPS_Root
        _DataLen()OLE_PPS
        _getPpsWk()OLE_PPS
        _makeSmallData(&$raList)OLE_PPS_Root
        _saveBbd($iSbdSize, $iBsize, $iPpsCnt)OLE_PPS_Root
        _saveBigData($iStBlk, &$raList)OLE_PPS_Root
        _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt)OLE_PPS_Root
        _savePps(&$raList)OLE_PPS_Root
        _savePpsSetPnt(&$pps_array)OLE_PPS
        OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children)OLE_PPS
        OLE_PPS_Root($time_1st, $time_2nd, $raChild)OLE_PPS_Root
        save($filename)OLE_PPS_Root
        setTempDir($dir)OLE_PPS_Root
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root.html b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root.html new file mode 100644 index 000000000..32a5b8821 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root.html @@ -0,0 +1,449 @@ + + + + + +CORE POS - Fannie: OLE_PPS_Root Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        OLE_PPS_Root Class Reference
        +
        +
        +
        +Inheritance diagram for OLE_PPS_Root:
        +
        +
        + + +OLE_PPS + +
        + +

        List of all members.

        + + + + + + + + + + + + + + +

        +Public Member Functions

         OLE_PPS_Root ($time_1st, $time_2nd, $raChild)
         setTempDir ($dir)
         save ($filename)
         _calcSize (&$raList)
         _adjust2 ($i2)
         _saveHeader ($iSBDcnt, $iBBcnt, $iPPScnt)
         _saveBigData ($iStBlk, &$raList)
         _makeSmallData (&$raList)
         _savePps (&$raList)
         _saveBbd ($iSbdSize, $iBsize, $iPpsCnt)

        +Public Attributes

        $_tmp_dir
        +

        Member Function Documentation

        + +
        +
        + + + + + + + + +
        OLE_PPS_Root::_adjust2 (i2)
        +
        +
        +

        Helper function for caculating a magic value for block sizes

        +

        private

        +
        Parameters:
        + + +
        integer$i2The argument
        +
        +
        +
        See also:
        save()
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_Root::_calcSize (&$ raList)
        +
        +
        +

        Calculate some numbers

        +

        private

        +
        Parameters:
        + + +
        array$raListReference to an array of PPS's
        +
        +
        +
        Returns:
        array The array of numbers
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_Root::_makeSmallData (&$ raList)
        +
        +
        +

        get small data (PPS's with data smaller than OLE_DATA_SIZE_SMALL)

        +

        private

        +
        Parameters:
        + + +
        array&$raListReference to array of PPS's
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        OLE_PPS_Root::_saveBbd (iSbdSize,
        iBsize,
        iPpsCnt 
        )
        +
        +
        +

        Saving Big Block Depot

        +

        private

        +
        Parameters:
        + + + + +
        integer$iSbdSize
        integer$iBsize
        integer$iPpsCnt
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        OLE_PPS_Root::_saveBigData (iStBlk,
        &$ raList 
        )
        +
        +
        +

        Saving big data (PPS's with data bigger than OLE_DATA_SIZE_SMALL)

        +

        private

        +
        Parameters:
        + + + +
        integer$iStBlk
        array&$raListReference to array of PPS's
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        OLE_PPS_Root::_saveHeader (iSBDcnt,
        iBBcnt,
        iPPScnt 
        )
        +
        +
        +

        Save OLE header

        +

        private

        +
        Parameters:
        + + + + +
        integer$iSBDcnt
        integer$iBBcnt
        integer$iPPScnt
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_Root::_savePps (&$ raList)
        +
        +
        +

        Saves all the PPS's WKs

        +

        private

        +
        Parameters:
        + + +
        array$raListReference to an array with all PPS's
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        OLE_PPS_Root::OLE_PPS_Root (time_1st,
        time_2nd,
        raChild 
        )
        +
        +
        +

        Constructor

        +

        public

        +
        Parameters:
        + + + +
        integer$time_1stA timestamp
        integer$time_2ndA timestamp
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_Root::save (filename)
        +
        +
        +

        Method for saving the whole OLE container (including files). In fact, if called with an empty argument (or '-'), it saves to a temporary file and then outputs it's contents to stdout.

        +
        Parameters:
        + + +
        string$filenameThe name of the file where to save the OLE container public
        +
        +
        +
        Returns:
        mixed true on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        OLE_PPS_Root::setTempDir (dir)
        +
        +
        +

        Sets the temp dir used for storing the OLE file

        +

        public

        +
        Parameters:
        + + +
        string$dirThe dir to be used as temp dir
        +
        +
        +
        Returns:
        true if given dir is valid, false otherwise
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/OLE/PPS/Root.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root.png b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root.png new file mode 100644 index 000000000..4e5ed2a8e Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_o_l_e___p_p_s___root.png differ diff --git a/documentation/doxy/output/fannie/html/class_p_d_f-members.html b/documentation/doxy/output/fannie/html/class_p_d_f-members.html new file mode 100644 index 000000000..0ffad535e --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_p_d_f-members.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        PDF Member List
        +
        +
        +This is the complete list of members for PDF, including all inherited members. + + + + + + + + + + + + + + + + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in PDF)PDF
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in PDF)PDF
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in PDF)PDF
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in PDF)PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        GetCheckDigit($barcode) (defined in PDF)PDF
        GetCheckDigit($barcode) (defined in PDF)PDF
        GetCheckDigit($barcode) (defined in PDF)PDF
        GetCheckDigit($barcode) (defined in PDF)PDF
        TestCheckDigit($barcode) (defined in PDF)PDF
        TestCheckDigit($barcode) (defined in PDF)PDF
        TestCheckDigit($barcode) (defined in PDF)PDF
        TestCheckDigit($barcode) (defined in PDF)PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in PDF)PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_p_d_f.html b/documentation/doxy/output/fannie/html/class_p_d_f.html new file mode 100644 index 000000000..3eb506dda --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_p_d_f.html @@ -0,0 +1,149 @@ + + + + + +CORE POS - Fannie: PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following files:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/legacy/IT/barcode.php
        • +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/legacy/queries/labels/barcodenarrow.php
        • +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/legacy/queries/labels/barcodenew.php
        • +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/legacy/queries/UNFIsales.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_print_shelftags-members.html b/documentation/doxy/output/fannie/html/class_print_shelftags-members.html new file mode 100644 index 000000000..8d176c198 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_print_shelftags-members.html @@ -0,0 +1,68 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        PrintShelftags Member List

        This is the complete list of members for PrintShelftags, including all inherited members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $description (defined in PrintShelftags)PrintShelftags
        $header (defined in PrintShelftags)PrintShelftags [protected]
        $onload_commands (defined in FanniePage)FanniePage [protected]
        $required (defined in PrintShelftags)PrintShelftags
        $scripts (defined in FanniePage)FanniePage [protected]
        $title (defined in PrintShelftags)PrintShelftags [protected]
        $window_dressing (defined in FanniePage)FanniePage [protected]
        add_onload_command($str)FanniePage
        add_script($file_url, $type="text/javascript")FanniePage
        batch_tags_display() (defined in PrintShelftags)PrintShelftags
        body_content()PrintShelftags
        css_content()PrintShelftags
        delete_tags_display() (defined in PrintShelftags)PrintShelftags
        disable()FannieModule
        edit_tags_display() (defined in PrintShelftags)PrintShelftags
        enable()FannieModule
        form_tag($type='post')FanniePage
        get_batch_records($ids) (defined in PrintShelftags)PrintShelftags
        get_footer()FanniePage
        get_header()FanniePage
        get_regular_records($id) (defined in PrintShelftags)PrintShelftags
        has_menus($menus)FanniePage
        javascript_content()FanniePage
        layout_modules() (defined in PrintShelftags)PrintShelftags
        module_url()FanniePage
        preprocess()PrintShelftags
        provided_functions()FannieModule
        provides_functions() (defined in FanniePage)FanniePage
        regular_tags_display() (defined in PrintShelftags)PrintShelftags
        run_module()FanniePage


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_print_shelftags.html b/documentation/doxy/output/fannie/html/class_print_shelftags.html new file mode 100644 index 000000000..55a720a9f --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_print_shelftags.html @@ -0,0 +1,182 @@ + + +CORE POS - Fannie: PrintShelftags Class Reference + + + + +
        +
        + +

        PrintShelftags Class Reference

        Inheritance diagram for PrintShelftags: +

        + +FanniePage +FannieModule + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Public Member Functions

         preprocess ()
         body_content ()
         css_content ()
        regular_tags_display ()
        batch_tags_display ()
        delete_tags_display ()
        edit_tags_display ()
        layout_modules ()
        get_regular_records ($id)
        get_batch_records ($ids)

        Public Attributes

        $required = False
         $description

        Protected Attributes

        $header = "Fannie :: Print Shelf Tags"
        $title = "Print Shelf Tags"
        +

        Detailed Description

        +Module for printing shelf tags +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + +
        PrintShelftags::body_content (  ) 
        +
        +
        + +

        +Define the main displayed content

        Returns:
        An HTML string
        + +

        +Reimplemented from FanniePage. +

        +

        + +

        +
        + + + + + + + + +
        PrintShelftags::css_content (  ) 
        +
        +
        + +

        +Define any CSS needed

        Returns:
        A CSS string
        + +

        +Reimplemented from FanniePage. +

        +

        + +

        +
        + + + + + + + + +
        PrintShelftags::preprocess (  ) 
        +
        +
        + +

        +Handle pre-display tasks such as input processing

        Returns:
          +
        • True if the page should be displayed
        • False to stop here
        +
        +Common uses include redirecting to a different module and altering body content based on input +

        +Reimplemented from FanniePage. +

        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        PrintShelftags::$description
        +
        +
        + +

        +Initial value:

         "
        +        Module for printing shelftags
        +        "
        +
        +

        +Reimplemented from FanniePage. +

        +

        +


        The documentation for this class was generated from the following file:
          +
        • fannie/modules/plugins/shelftags/PrintShelftags.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_print_shelftags.png b/documentation/doxy/output/fannie/html/class_print_shelftags.png new file mode 100644 index 000000000..135d55b20 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_print_shelftags.png differ diff --git a/documentation/doxy/output/fannie/html/class_s_q_l_manager-members.html b/documentation/doxy/output/fannie/html/class_s_q_l_manager-members.html new file mode 100644 index 000000000..11eb2cba0 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_s_q_l_manager-members.html @@ -0,0 +1,128 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        SQLManager Member List

        This is the complete list of members for SQLManager, including all inherited members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $connectionsSQLManager
        $default_dbSQLManager
        $description (defined in SQLManager)SQLManager
        $required (defined in SQLManager)SQLManager
        add_connection($server, $type, $database, $username, $password='', $persistent=False)SQLManager
        add_connection($server, $type, $database, $username, $password='', $persistent=False)SQLManager
        add_select_limit($query, $int_limit, $which_connection='')SQLManager
        add_select_limit($query, $int_limit, $which_connection='')SQLManager
        aff_rows($result) (defined in SQLManager)SQLManager
        aff_rows($result) (defined in SQLManager)SQLManager
        affected_rows($which_connection='')SQLManager
        affected_rows($which_connection='')SQLManager
        cleanDateTime($str)SQLManager
        cleanDateTime($str)SQLManager
        close($which_connection='')SQLManager
        close($which_connection='')SQLManager
        concat()SQLManager
        concat()SQLManager
        convert($expr, $type, $which_connection='')SQLManager
        convert($expr, $type, $which_connection='')SQLManager
        currency($which_connection='')SQLManager
        currency($which_connection='')SQLManager
        data_seek($result_object, $rownum, $which_connection='')SQLManager
        data_seek($result_object, $rownum, $which_connection='')SQLManager
        date_equals($col, $dateStr)SQLManager
        date_equals($col, $dateStr)SQLManager
        datediff($date1, $date2, $which_connection='')SQLManager
        datediff($date1, $date2, $which_connection='')SQLManager
        dateymd($date1, $which_connection='')SQLManager
        dateymd($date1, $which_connection='')SQLManager
        dayofweek($field, $which_connection='')SQLManager
        dayofweek($field, $which_connection='')SQLManager
        disable()FannieModule
        enable()FannieModule
        error($which_connection='')SQLManager
        error($which_connection='')SQLManager
        escape($query_text, $which_connection='')SQLManager
        escape($query_text, $which_connection='')SQLManager
        fetch_array($result_object, $which_connection='')SQLManager
        fetch_array($result_object, $which_connection='')SQLManager
        fetch_field($result_object, $index, $which_connection='')SQLManager
        fetch_field($result_object, $index, $which_connection='')SQLManager
        fetch_object($result_object, $which_connection='')SQLManager
        fetch_object($result_object, $which_connection='')SQLManager
        fetch_row($result_object, $which_connection='')SQLManager
        fetch_row($result_object, $which_connection='')SQLManager
        field_name($result_object, $index, $which_connection='')SQLManager
        field_name($result_object, $index, $which_connection='')SQLManager
        field_type($result_object, $index, $which_connection='')SQLManager
        field_type($result_object, $index, $which_connection='')SQLManager
        get_result($host, $user, $pass, $data_base, $query) (defined in SQLManager)SQLManager
        get_result($host, $user, $pass, $data_base, $query) (defined in SQLManager)SQLManager
        hour($field, $which_connection='')SQLManager
        hour($field, $which_connection='')SQLManager
        insert_id($which_connection='')SQLManager
        insert_id($which_connection='')SQLManager
        locate($substr, $str, $which_connection='')SQLManager
        locate($substr, $str, $which_connection='')SQLManager
        monthdiff($date1, $date2, $which_connection='')SQLManager
        monthdiff($date1, $date2, $which_connection='')SQLManager
        now($which_connection='')SQLManager
        now($which_connection='')SQLManager
        num_fields($result_object, $which_connection='')SQLManager
        num_fields($result_object, $which_connection='')SQLManager
        num_rows($result_object, $which_connection='')SQLManager
        num_rows($result_object, $which_connection='')SQLManager
        provided_functions()FannieModule
        query($query_text, $which_connection='')SQLManager
        query($query_text, $which_connection='')SQLManager
        query_all($query_text)SQLManager
        query_all($query_text)SQLManager
        run_module()FannieModule
        seconddiff($date1, $date2, $which_connection='')SQLManager
        seconddiff($date1, $date2, $which_connection='')SQLManager
        sep($which_connection='')SQLManager
        sep($which_connection='')SQLManager
        smart_insert($table_name, $values, $which_connection='')SQLManager
        smart_insert($table_name, $values, $which_connection='')SQLManager
        smart_update($table_name, $values, $where_clause, $which_connection='')SQLManager
        smart_update($table_name, $values, $where_clause, $which_connection='')SQLManager
        SQLManager($server='', $type='', $database='', $username='', $password='', $persistent=False)SQLManager
        SQLManager($server, $type, $database, $username, $password='', $persistent=False)SQLManager
        table_definition($table_name, $which_connection='')SQLManager
        table_definition($table_name, $which_connection='')SQLManager
        table_exists($table_name, $which_connection='')SQLManager
        table_exists($table_name, $which_connection='')SQLManager
        transfer($source_db, $select_query, $dest_db, $insert_query)SQLManager
        transfer($source_db, $select_query, $dest_db, $insert_query)SQLManager
        weekdiff($date1, $date2, $which_connection='')SQLManager
        weekdiff($date1, $date2, $which_connection='')SQLManager


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_s_q_l_manager.html b/documentation/doxy/output/fannie/html/class_s_q_l_manager.html new file mode 100644 index 000000000..b22ca4479 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_s_q_l_manager.html @@ -0,0 +1,3208 @@ + + +CORE POS - Fannie: SQLManager Class Reference + + + + +
        +
        + +

        SQLManager Class Reference

        A SQL abstraction layer. +More... +

        +

        Inheritance diagram for SQLManager: +

        + +FannieModule + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Public Member Functions

         SQLManager ($server='', $type='', $database='', $username='', $password='', $persistent=False)
         add_connection ($server, $type, $database, $username, $password='', $persistent=False)
         close ($which_connection='')
         query ($query_text, $which_connection='')
         query_all ($query_text)
         escape ($query_text, $which_connection='')
         num_rows ($result_object, $which_connection='')
         data_seek ($result_object, $rownum, $which_connection='')
         num_fields ($result_object, $which_connection='')
         fetch_array ($result_object, $which_connection='')
         fetch_object ($result_object, $which_connection='')
         fetch_row ($result_object, $which_connection='')
         now ($which_connection='')
         datediff ($date1, $date2, $which_connection='')
         monthdiff ($date1, $date2, $which_connection='')
         seconddiff ($date1, $date2, $which_connection='')
         dateymd ($date1, $which_connection='')
         convert ($expr, $type, $which_connection='')
         locate ($substr, $str, $which_connection='')
         concat ()
         weekdiff ($date1, $date2, $which_connection='')
         fetch_field ($result_object, $index, $which_connection='')
         transfer ($source_db, $select_query, $dest_db, $insert_query)
         field_type ($result_object, $index, $which_connection='')
         field_name ($result_object, $index, $which_connection='')
         dayofweek ($field, $which_connection='')
         hour ($field, $which_connection='')
         cleanDateTime ($str)
         table_exists ($table_name, $which_connection='')
         table_definition ($table_name, $which_connection='')
         currency ($which_connection='')
         add_select_limit ($query, $int_limit, $which_connection='')
         sep ($which_connection='')
         error ($which_connection='')
         insert_id ($which_connection='')
         affected_rows ($which_connection='')
         smart_insert ($table_name, $values, $which_connection='')
         smart_update ($table_name, $values, $where_clause, $which_connection='')
         date_equals ($col, $dateStr)
        get_result ($host, $user, $pass, $data_base, $query)
        aff_rows ($result)
         SQLManager ($server, $type, $database, $username, $password='', $persistent=False)
         add_connection ($server, $type, $database, $username, $password='', $persistent=False)
         close ($which_connection='')
         query ($query_text, $which_connection='')
         query_all ($query_text)
         escape ($query_text, $which_connection='')
         num_rows ($result_object, $which_connection='')
         data_seek ($result_object, $rownum, $which_connection='')
         num_fields ($result_object, $which_connection='')
         fetch_array ($result_object, $which_connection='')
         fetch_object ($result_object, $which_connection='')
         fetch_row ($result_object, $which_connection='')
         now ($which_connection='')
         datediff ($date1, $date2, $which_connection='')
         monthdiff ($date1, $date2, $which_connection='')
         seconddiff ($date1, $date2, $which_connection='')
         dateymd ($date1, $which_connection='')
         convert ($expr, $type, $which_connection='')
         locate ($substr, $str, $which_connection='')
         concat ()
         weekdiff ($date1, $date2, $which_connection='')
         fetch_field ($result_object, $index, $which_connection='')
         transfer ($source_db, $select_query, $dest_db, $insert_query)
         field_type ($result_object, $index, $which_connection='')
         field_name ($result_object, $index, $which_connection='')
         dayofweek ($field, $which_connection='')
         hour ($field, $which_connection='')
         cleanDateTime ($str)
         table_exists ($table_name, $which_connection='')
         table_definition ($table_name, $which_connection='')
         currency ($which_connection='')
         add_select_limit ($query, $int_limit, $which_connection='')
         sep ($which_connection='')
         error ($which_connection='')
         insert_id ($which_connection='')
         affected_rows ($which_connection='')
         smart_insert ($table_name, $values, $which_connection='')
         smart_update ($table_name, $values, $where_clause, $which_connection='')
         date_equals ($col, $dateStr)
        get_result ($host, $user, $pass, $data_base, $query)
        aff_rows ($result)

        Public Attributes

        $required = True
         $description
         $connections
         $default_db
        +

        Detailed Description

        +A SQL abstraction layer. +

        +Custom SQL abstraction based on ADOdb. Provides some limited functionality for queries across two servers that are useful for lane-server communication +

        +


        Member Function Documentation

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::add_connection ( server,
        type,
        database,
        username,
        password = '',
        persistent = False 
        )
        +
        +
        + +

        +Add another connection

        Parameters:
        + + + + + + + +
        $server Database server host
        $type Database type. Most supported are 'mysql' and 'mssql' but anything ADOdb supports will kind of work
        $database Database name
        $username Database username
        $password Database password
        $persistent Make persistent connection.
        +
        +When dealing with multiple connections, user the database name to distinguish which is to be used +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::add_connection ( server,
        type,
        database,
        username,
        password = '',
        persistent = False 
        )
        +
        +
        + +

        +Add another connection

        Parameters:
        + + + + + + + +
        $server Database server host
        $type Database type. Most supported are 'mysql' and 'mssql' but anything ADOdb supports will kind of work
        $database Database name
        $username Database username
        $password Database password
        $persistent Make persistent connection.
        +
        +When dealing with multiple connections, user the database name to distinguish which is to be used +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::add_select_limit ( query,
        int_limit,
        which_connection = '' 
        )
        +
        +
        + +

        +Add row limit to a select query

        Parameters:
        + + + + +
        $query The select query
        $int_limit Max rows
        which_connection see method close
        +
        +This method currently only suport MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::add_select_limit ( query,
        int_limit,
        which_connection = '' 
        )
        +
        +
        + +

        +Add row limit to a select query

        Parameters:
        + + + + +
        $query The select query
        $int_limit Max rows
        which_connection see method close
        +
        +This method currently only suport MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::affected_rows ( which_connection = ''  ) 
        +
        +
        + +

        +Check how many rows the last query affected

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        Number of rows
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::affected_rows ( which_connection = ''  ) 
        +
        +
        + +

        +Check how many rows the last query affected

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        Number of rows
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::cleanDateTime ( str  ) 
        +
        +
        + +

        +Reformat a datetime to YYYY-MM-DD HH:MM:SS

        Parameters:
        + + +
        $str A datetime string
        +
        +
        Returns:
        The reformatted string
        +This is a utility method to support transfer() +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::cleanDateTime ( str  ) 
        +
        +
        + +

        +Reformat a datetime to YYYY-MM-DD HH:MM:SS

        Parameters:
        + + +
        $str A datetime string
        +
        +
        Returns:
        The reformatted string
        +This is a utility method to support transfer() +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::close ( which_connection = ''  ) 
        +
        +
        + +

        +Close a database connection

        Parameters:
        + + +
        $which_connection If there are multiple connections, this is the database name for the connection you want to close
        +
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::close ( which_connection = ''  ) 
        +
        +
        + +

        +Close a database connection

        Parameters:
        + + +
        $which_connection If there are multiple connections, this is the database name for the connection you want to close
        +
        + +
        +

        + +

        +
        + + + + + + + + +
        SQLManager::concat (  ) 
        +
        +
        + +

        +Concatenate strings

        Parameters:
        + + +
        Arbitrary; see below
        +
        +
        Returns:
        The SQL expression
        +This function takes an arbitrary number of arguments and concatenates them. The last argument is the standard $which_connection but in this case it is not optional. You may pass the empty string to use the default database though.

        +This method currently only supports MySQL and MSSQL +

        +

        + +

        +
        + + + + + + + + +
        SQLManager::concat (  ) 
        +
        +
        + +

        +Concatenate strings

        Parameters:
        + + +
        Arbitrary; see below
        +
        +
        Returns:
        The SQL expression
        +This function takes an arbitrary number of arguments and concatenates them. The last argument is the standard $which_connection but in this case it is not optional. You may pass the empty string to use the default database though.

        +This method currently only supports MySQL and MSSQL +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::convert ( expr,
        type,
        which_connection = '' 
        )
        +
        +
        + +

        +Get a SQL convert function

        Parameters:
        + + + + +
        $expr An SQL expression
        $type Convert to this SQL type
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::convert ( expr,
        type,
        which_connection = '' 
        )
        +
        +
        + +

        +Get a SQL convert function

        Parameters:
        + + + + +
        $expr An SQL expression
        $type Convert to this SQL type
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::currency ( which_connection = ''  ) 
        +
        +
        + +

        +Get database's currency type

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        The SQL type
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::currency ( which_connection = ''  ) 
        +
        +
        + +

        +Get database's currency type

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        The SQL type
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::data_seek ( result_object,
        rownum,
        which_connection = '' 
        )
        +
        +
        + +

        +Move result cursor to specified record

        Parameters:
        + + + + +
        $result_object A result set
        $rownum The record index
        $which_connection see method close()
        +
        +
        Returns:
        True on success, False on failure
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::data_seek ( result_object,
        rownum,
        which_connection = '' 
        )
        +
        +
        + +

        +Move result cursor to specified record

        Parameters:
        + + + + +
        $result_object A result set
        $rownum The record index
        $which_connection see method close()
        +
        +
        Returns:
        True on success, False on failure
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::date_equals ( col,
        dateStr 
        )
        +
        +
        + +

        +See if a datetime is on a given date using BETWEEN

        Parameters:
        + + + +
        $col datetime expression
        $dateStr String date
        +
        +
        Returns:
        SQL BETWEEN comparision
        +Which MySQL partitioning by date this is MUCH faster than using datediff($col,$dateStr)==0 +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::date_equals ( col,
        dateStr 
        )
        +
        +
        + +

        +See if a datetime is on a given date using BETWEEN

        Parameters:
        + + + +
        $col datetime expression
        $dateStr String date
        +
        +
        Returns:
        SQL BETWEEN comparision
        +Which MySQL partitioning by date this is MUCH faster than using datediff($col,$dateStr)==0 +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::datediff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the database's date difference function

        Parameters:
        + + + + +
        $date1 First date
        $date2 Second date
        $which_connection see method close()
        +
        +
        Returns:
        The appropriate function
        +Arguments are inverted for some databases to ensure consistent results. If $date1 is today and $date2 is yesterday, this method returns a SQL function that evaluates to 1. +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::datediff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the database's date difference function

        Parameters:
        + + + + +
        $date1 First date
        $date2 Second date
        $which_connection see method close()
        +
        +
        Returns:
        The appropriate function
        +Arguments are inverted for some databases to ensure consistent results. If $date1 is today and $date2 is yesterday, this method returns a SQL function that evaluates to 1. +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::dateymd ( date1,
        which_connection = '' 
        )
        +
        +
        + +

        +Get a date formatted YYYYMMDD

        Parameters:
        + + + +
        $date1 The date (or datetime)
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::dateymd ( date1,
        which_connection = '' 
        )
        +
        +
        + +

        +Get a date formatted YYYYMMDD

        Parameters:
        + + + +
        $date1 The date (or datetime)
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::dayofweek ( field,
        which_connection = '' 
        )
        +
        +
        + +

        +Get day of week number

        Parameters:
        + + + +
        $field A date expression
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only suport MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::dayofweek ( field,
        which_connection = '' 
        )
        +
        +
        + +

        +Get day of week number

        Parameters:
        + + + +
        $field A date expression
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only suport MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::error ( which_connection = ''  ) 
        +
        +
        + +

        +Get last error message

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        The message
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::error ( which_connection = ''  ) 
        +
        +
        + +

        +Get last error message

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        The message
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::escape ( query_text,
        which_connection = '' 
        )
        +
        +
        + +

        +Escape a string for SQL-safety

        Parameters:
        + + + +
        $query_text The string to escape
        $which_connection see method close()
        +
        +
        Returns:
        The escaped string
        +Note that the return value will include start and end single quotes +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::escape ( query_text,
        which_connection = '' 
        )
        +
        +
        + +

        +Escape a string for SQL-safety

        Parameters:
        + + + +
        $query_text The string to escape
        $which_connection see method close()
        +
        +
        Returns:
        The escaped string
        +Note that the return value will include start and end single quotes +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_array ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get next record from a result set

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        An array of values
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_array ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get next record from a result set

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        An array of values
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_field ( result_object,
        index,
        which_connection = '' 
        )
        +
        +
        + +

        +Get a column name by index

        Parameters:
        + + + + +
        $result_object A result set
        $index Integer index
        $which_connection see method close()
        +
        +
        Returns:
        The column name
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_field ( result_object,
        index,
        which_connection = '' 
        )
        +
        +
        + +

        +Get a column name by index

        Parameters:
        + + + + +
        $result_object A result set
        $index Integer index
        $which_connection see method close()
        +
        +
        Returns:
        The column name
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_object ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get next record from a result set but as an object

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        An object with member containing values
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_object ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get next record from a result set but as an object

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        An object with member containing values
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_row ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +An alias for the method fetch_array() +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::fetch_row ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +An alias for the method fetch_array() +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::field_name ( result_object,
        index,
        which_connection = '' 
        )
        +
        +
        + +

        +Alias of method fetch_field() +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::field_name ( result_object,
        index,
        which_connection = '' 
        )
        +
        +
        + +

        +Alias of method fetch_field() +

        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::field_type ( result_object,
        index,
        which_connection = '' 
        )
        +
        +
        + +

        +Get column type

        Parameters:
        + + + + +
        $result_object A result set
        $index Integer index
        $which_connection see method close()
        +
        +
        Returns:
        The column type
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::field_type ( result_object,
        index,
        which_connection = '' 
        )
        +
        +
        + +

        +Get column type

        Parameters:
        + + + + +
        $result_object A result set
        $index Integer index
        $which_connection see method close()
        +
        +
        Returns:
        The column type
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::hour ( field,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the hour from a datetime

        Parameters:
        + + + +
        $field A datetime expression
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::hour ( field,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the hour from a datetime

        Parameters:
        + + + +
        $field A datetime expression
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::insert_id ( which_connection = ''  ) 
        +
        +
        + +

        +Get auto incremented ID from last insert

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        The new ID value
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::insert_id ( which_connection = ''  ) 
        +
        +
        + +

        +Get auto incremented ID from last insert

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        The new ID value
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::locate ( substr,
        str,
        which_connection = '' 
        )
        +
        +
        + +

        +Find index of a substring within a larger string

        Parameters:
        + + + + +
        $substr Search string (needle)
        $str Target string (haystack)
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::locate ( substr,
        str,
        which_connection = '' 
        )
        +
        +
        + +

        +Find index of a substring within a larger string

        Parameters:
        + + + + +
        $substr Search string (needle)
        $str Target string (haystack)
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::monthdiff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the databases' month difference function

        Parameters:
        + + + + +
        $date1 First date
        $date2 Second date
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +Arguments are inverted for some databases to ensure consistent results. If $date1 is this month and $date2 is last month, this method returns a SQL expression that evaluates to 1. +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::monthdiff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the databases' month difference function

        Parameters:
        + + + + +
        $date1 First date
        $date2 Second date
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +Arguments are inverted for some databases to ensure consistent results. If $date1 is this month and $date2 is last month, this method returns a SQL expression that evaluates to 1. +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::now ( which_connection = ''  ) 
        +
        +
        + +

        +Get the database's function for present time

        Parameters:
        + + +
        $which_connection see method close()
        +
        +
        Returns:
        The appropriate function
        +For example, with MySQL this will return the string 'NOW()'. +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::now ( which_connection = ''  ) 
        +
        +
        + +

        +Get the database's function for present time

        Parameters:
        + + +
        $which_connection see method close()
        +
        +
        Returns:
        The appropriate function
        +For example, with MySQL this will return the string 'NOW()'. +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::num_fields ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get number of fields in a result set

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        Integer number or False if there's an error
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::num_fields ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get number of fields in a result set

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        Integer number or False if there's an error
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::num_rows ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get number of rows in a result set

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        Integer number or False if there's an error
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::num_rows ( result_object,
        which_connection = '' 
        )
        +
        +
        + +

        +Get number of rows in a result set

        Parameters:
        + + + +
        $result_object A result set
        $which_connection see method close()
        +
        +
        Returns:
        Integer number or False if there's an error
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::query ( query_text,
        which_connection = '' 
        )
        +
        +
        + +

        +Execute a query

        Parameters:
        + + + +
        $query_text The query
        which_connection see method close
        +
        +
        Returns:
        A result object on success, False on failure
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::query ( query_text,
        which_connection = '' 
        )
        +
        +
        + +

        +Execute a query

        Parameters:
        + + + +
        $query_text The query
        which_connection see method close
        +
        +
        Returns:
        A result object on success, False on failure
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::query_all ( query_text  ) 
        +
        +
        + +

        +Execute a query on all connected databases

        Parameters:
        + + +
        $query_text The query
        +
        +
        Returns:
        An array keyed by database name. Entries will be result objects where queries succeeded and False where they failed
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::query_all ( query_text  ) 
        +
        +
        + +

        +Execute a query on all connected databases

        Parameters:
        + + +
        $query_text The query
        +
        +
        Returns:
        An array keyed by database name. Entries will be result objects where queries succeeded and False where they failed
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::seconddiff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the difference between two dates in seconds

        Parameters:
        + + + + +
        $date1 First date (or datetime)
        $date2 Second date (or datetime)
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only suport MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::seconddiff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the difference between two dates in seconds

        Parameters:
        + + + + +
        $date1 First date (or datetime)
        $date2 Second date (or datetime)
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only suport MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::sep ( which_connection = ''  ) 
        +
        +
        + +

        +Get database scope separator

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        String separator
        + +
        +

        + +

        +
        + + + + + + + + + +
        SQLManager::sep ( which_connection = ''  ) 
        +
        +
        + +

        +Get database scope separator

        Parameters:
        + + +
        which_connection see method close
        +
        +
        Returns:
        String separator
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::smart_insert ( table_name,
        values,
        which_connection = '' 
        )
        +
        +
        + +

        +Insert as much data as possible

        Parameters:
        + + + + +
        $table_name Table to insert into
        $values An array of column name => column value
        which_connection see method close
        +
        +
        Returns:
        Same as INSERT via query() method
        +This method polls the table to see which columns actually exist then inserts those values +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::smart_insert ( table_name,
        values,
        which_connection = '' 
        )
        +
        +
        + +

        +Insert as much data as possible

        Parameters:
        + + + + +
        $table_name Table to insert into
        $values An array of column name => column value
        which_connection see method close
        +
        +
        Returns:
        Same as INSERT via query() method
        +This method polls the table to see which columns actually exist then inserts those values +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::smart_update ( table_name,
        values,
        where_clause,
        which_connection = '' 
        )
        +
        +
        + +

        +Update as much data as possible

        Parameters:
        + + + + + +
        $table_name The table to update
        $values An array of column name => column value
        $where_clause The query WHERE clause
        which_connection see method close
        +
        +
        Returns:
        Same as an UPDATE via query() method
        +This method checks which columns actually exist then updates those values

        +Caveat: There are a couple places this could break down

          +
        • If your WHERE clause requires a column that doesn't exist, the query will fail. No way around it. Auto-modifying WHERE clauses seems like a terrible idea
        • This only works with a single table. Updates involving joins are rare in the code base though.
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::smart_update ( table_name,
        values,
        where_clause,
        which_connection = '' 
        )
        +
        +
        + +

        +Update as much data as possible

        Parameters:
        + + + + + +
        $table_name The table to update
        $values An array of column name => column value
        $where_clause The query WHERE clause
        which_connection see method close
        +
        +
        Returns:
        Same as an UPDATE via query() method
        +This method checks which columns actually exist then updates those values

        +Caveat: There are a couple places this could break down

          +
        • If your WHERE clause requires a column that doesn't exist, the query will fail. No way around it. Auto-modifying WHERE clauses seems like a terrible idea
        • This only works with a single table. Updates involving joins are rare in the code base though.
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::SQLManager ( server,
        type,
        database,
        username,
        password = '',
        persistent = False 
        )
        +
        +
        + +

        +Constructor

        Parameters:
        + + + + + + + +
        $server Database server host
        $type Database type. Most supported are 'mysql' and 'mssql' but anything ADOdb supports will kind of work
        $database Database name
        $username Database username
        $password Database password
        $persistent Make persistent connection.
        +
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::SQLManager ( server = '',
        type = '',
        database = '',
        username = '',
        password = '',
        persistent = False 
        )
        +
        +
        + +

        +Constructor

        Parameters:
        + + + + + + + +
        $server Database server host
        $type Database type. Most supported are 'mysql' and 'mssql' but anything ADOdb supports will kind of work
        $database Database name
        $username Database username
        $password Database password
        $persistent Make persistent connection.
        +
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::table_definition ( table_name,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the table's definition

        Parameters:
        + + + +
        $table_name The table's name
        which_connection see method close
        +
        +
        Returns:
          +
        • Array of (column name, column type) table found
        • False No such table
        • -1 Operation not supported for this database type
        +
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::table_definition ( table_name,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the table's definition

        Parameters:
        + + + +
        $table_name The table's name
        which_connection see method close
        +
        +
        Returns:
          +
        • Array of (column name, column type) table found
        • False No such table
        • -1 Operation not supported for this database type
        +
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::table_exists ( table_name,
        which_connection = '' 
        )
        +
        +
        + +

        +Check whether the given table exists

        Parameters:
        + + + +
        $table_name The table's name
        which_connection see method close
        +
        +
        Returns:
          +
        • True The table exists
        • False The table doesn't exist
        • -1 Operation not supported for this database type
        +
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + +
        SQLManager::table_exists ( table_name,
        which_connection = '' 
        )
        +
        +
        + +

        +Check whether the given table exists

        Parameters:
        + + + +
        $table_name The table's name
        which_connection see method close
        +
        +
        Returns:
          +
        • True The table exists
        • False The table doesn't exist
        • -1 Operation not supported for this database type
        +
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::transfer ( source_db,
        select_query,
        dest_db,
        insert_query 
        )
        +
        +
        + +

        +Copy a table from one database to another, not necessarily on the same server or format.

        +

        Parameters:
        + + + + + +
        $source_db The database name of the source
        $select_query The query that will get the data
        $dest_db The database name of the destination
        $insert_query The beginning of the query that will add the data to the destination (specify everything before VALUES)
        +
        +
        Returns:
        False if any record cannot be transfered, True otherwise
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::transfer ( source_db,
        select_query,
        dest_db,
        insert_query 
        )
        +
        +
        + +

        +Copy a table from one database to another, not necessarily on the same server or format.

        +

        Parameters:
        + + + + + +
        $source_db The database name of the source
        $select_query The query that will get the data
        $dest_db The database name of the destination
        $insert_query The beginning of the query that will add the data to the destination (specify everything before VALUES)
        +
        +
        Returns:
        False if any record cannot be transfered, True otherwise
        + +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::weekdiff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the differnces between two dates in weeks

        Parameters:
        + + + + +
        $date1 First date
        $date2 Second date
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        + +

        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        SQLManager::weekdiff ( date1,
        date2,
        which_connection = '' 
        )
        +
        +
        + +

        +Get the differnces between two dates in weeks

        Parameters:
        + + + + +
        $date1 First date
        $date2 Second date
        $which_connection see method close()
        +
        +
        Returns:
        The SQL expression
        +This method currently only supports MySQL and MSSQL +
        +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        SQLManager::$connections
        +
        +
        + +

        +Array of connections +

        +

        + +

        +
        + + + + +
        SQLManager::$default_db
        +
        +
        + +

        +Default database connection +

        +

        + +

        +
        + + + + +
        SQLManager::$description
        +
        +
        + +

        +Initial value:

         "
        +        Provides database connectivity
        +        "
        +
        +

        +Reimplemented from FannieModule. +

        +

        +


        The documentation for this class was generated from the following files:
          +
        • fannie/class-lib/db/SQLManager.php
        • fannie/src/SQLManager.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_s_q_l_manager.png b/documentation/doxy/output/fannie/html/class_s_q_l_manager.png new file mode 100644 index 000000000..3f166149f Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_s_q_l_manager.png differ diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___reader-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___reader-members.html new file mode 100644 index 000000000..b0db307aa --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___reader-members.html @@ -0,0 +1,52 @@ + + +CORE POS - Fannie: Member List + + + + +
        +
        + +

        Spreadsheet_Excel_Reader Member List

        This is the complete list of members for Spreadsheet_Excel_Reader, including all inherited members.

        + + + + + + + + + + + + + + +
        $_coloffset (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $_columnsFormat (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $_defaultEncoding (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $_defaultFormat (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $_ole (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $_rowoffset (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $boundsheets (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $data (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $dateFormats (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $description (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $formatRecords (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $required (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $sheets (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader
        $sst (defined in Spreadsheet_Excel_Reader)Spreadsheet_Excel_Reader


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___reader.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___reader.html new file mode 100644 index 000000000..b8ee5a455 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___reader.html @@ -0,0 +1,120 @@ + + +CORE POS - Fannie: Spreadsheet_Excel_Reader Class Reference + + + + +
        +
        + +

        Spreadsheet_Excel_Reader Class Reference

        List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Public Attributes

        $required = False
        $description = "An open source module for reading XLS files"
        $boundsheets = array()
        $formatRecords = array()
        $sst = array()
        $sheets = array()
        $data
        $_ole
        $_defaultEncoding
        $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT
        $_columnsFormat = array()
        $_rowoffset = 1
        $_coloffset = 1
         $dateFormats
        +

        Detailed Description

        +A class for reading Microsoft Excel Spreadsheets.

        +Originally developed by Vadim Tkachenko under the name PHPExcelReader. (http://sourceforge.net/projects/phpexcelreader) Based on the Java version by Andy Khan (http://www.andykhan.com). Now maintained by David Sanders. Reads only Biff 7 and Biff 8 formats.

        +

        Author:
        Vadim Tkachenko <vt@phpapache.com> 1997-2005 The PHP Group http://www.php.net/license/3_0.txt PHP License 3.0
        +
        Version:
        Release: @ OLE, Spreadsheet_Excel_Writer
        + +

        +


        Member Data Documentation

        + +
        +
        + + + + +
        Spreadsheet_Excel_Reader::$dateFormats
        +
        +
        + +

        +Initial value:

         array (
        +        0xe => "d/m/Y",
        +        0xf => "d-M-Y",
        +        0x10 => "d-M",
        +        0x11 => "M-Y",
        +        0x12 => "h:i a",
        +        0x13 => "h:i:s a",
        +        0x14 => "H:i",
        +        0x15 => "H:i:s",
        +        0x16 => "d/m/Y H:i",
        +        0x2d => "i:s",
        +        0x2e => "H:i:s",
        +        0x2f => "i:s.S")
        +
        +
        +

        +


        The documentation for this class was generated from the following files:
          +
        • fannie/class-lib/formats/Excel/Spreadsheet_Excel_Reader.php
        • fannie/src/Excel/reader.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer-members.html new file mode 100644 index 000000000..dc1716283 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer-members.html @@ -0,0 +1,168 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer Member List
        +
        +
        +This is the complete list of members for Spreadsheet_Excel_Writer, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_1904 (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_activesheet (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_BIFF_version (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_biffsize (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_byte_order (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_codepage (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_country_code (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_data (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_datasize (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_fileclosed (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_filename (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_firstsheet (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_formats (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_limit (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_palette (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_parser (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_selected (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_sheetname (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_sheetnames (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_string_sizeinfo_size (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_tmp_dir (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_tmp_format (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_url_format (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_worksheets (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_xf_index (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        _addContinue($data)Spreadsheet_Excel_Writer_BIFFwriter
        _append($data)Spreadsheet_Excel_Writer_BIFFwriter
        _calcSheetOffsets()Spreadsheet_Excel_Writer_Workbook
        _calculateSharedStringsSizes()Spreadsheet_Excel_Writer_Workbook
        _prepend($data)Spreadsheet_Excel_Writer_BIFFwriter
        _setByteOrder()Spreadsheet_Excel_Writer_BIFFwriter
        _setPaletteXl97()Spreadsheet_Excel_Writer_Workbook
        _storeAllFonts()Spreadsheet_Excel_Writer_Workbook
        _storeAllNumFormats()Spreadsheet_Excel_Writer_Workbook
        _storeAllStyles()Spreadsheet_Excel_Writer_Workbook
        _storeAllXfs()Spreadsheet_Excel_Writer_Workbook
        _storeBof($type)Spreadsheet_Excel_Writer_BIFFwriter
        _storeBoundsheet($sheetname, $offset)Spreadsheet_Excel_Writer_Workbook
        _storeCodepage()Spreadsheet_Excel_Writer_Workbook
        _storeCountry()Spreadsheet_Excel_Writer_Workbook
        _storeDatemode()Spreadsheet_Excel_Writer_Workbook
        _storeEof()Spreadsheet_Excel_Writer_BIFFwriter
        _storeExterncount($cxals)Spreadsheet_Excel_Writer_Workbook
        _storeExterns()Spreadsheet_Excel_Writer_Workbook
        _storeExternsheet($sheetname)Spreadsheet_Excel_Writer_Workbook
        _storeExternsheetBiff8()Spreadsheet_Excel_Writer_Workbook
        _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax)Spreadsheet_Excel_Writer_Workbook
        _storeNames()Spreadsheet_Excel_Writer_Workbook
        _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax)Spreadsheet_Excel_Writer_Workbook
        _storeNumFormat($format, $ifmt)Spreadsheet_Excel_Writer_Workbook
        _storeOLEFile()Spreadsheet_Excel_Writer_Workbook
        _storePalette()Spreadsheet_Excel_Writer_Workbook
        _storeSharedStringsTable()Spreadsheet_Excel_Writer_Workbook
        _storeStyle()Spreadsheet_Excel_Writer_Workbook
        _storeSupbookInternal()Spreadsheet_Excel_Writer_Workbook
        _storeWindow1()Spreadsheet_Excel_Writer_Workbook
        _storeWorkbook()Spreadsheet_Excel_Writer_Workbook
        addFormat($properties=array())Spreadsheet_Excel_Writer_Workbook
        addValidator()Spreadsheet_Excel_Writer_Workbook
        addWorksheet($name= '')Spreadsheet_Excel_Writer_Workbook
        close()Spreadsheet_Excel_Writer_Workbook
        rowcolToCell($row, $col)Spreadsheet_Excel_Writer [static]
        send($filename)Spreadsheet_Excel_Writer
        setCountry($code)Spreadsheet_Excel_Writer_Workbook
        setCustomColor($index, $red, $green, $blue)Spreadsheet_Excel_Writer_Workbook
        setTempDir($dir)Spreadsheet_Excel_Writer_BIFFwriter
        setVersion($version)Spreadsheet_Excel_Writer_Workbook
        sheets()Spreadsheet_Excel_Writer_Workbook
        Spreadsheet_Excel_Writer($filename= '')Spreadsheet_Excel_Writer
        Spreadsheet_Excel_Writer_BIFFwriter()Spreadsheet_Excel_Writer_BIFFwriter
        Spreadsheet_Excel_Writer_Workbook($filename)Spreadsheet_Excel_Writer_Workbook
        worksheets()Spreadsheet_Excel_Writer_Workbook
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer.html new file mode 100644 index 000000000..a54e0fea3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer.html @@ -0,0 +1,209 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer Class Reference
        +
        +
        +
        +Inheritance diagram for Spreadsheet_Excel_Writer:
        +
        +
        + + +Spreadsheet_Excel_Writer_Workbook +Spreadsheet_Excel_Writer_BIFFwriter + +
        + +

        List of all members.

        + + + + + + +

        +Public Member Functions

         Spreadsheet_Excel_Writer ($filename= '')
         send ($filename)

        +Static Public Member Functions

         rowcolToCell ($row, $col)
        +

        Member Function Documentation

        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer::rowcolToCell (row,
        col 
        ) [static]
        +
        +
        +

        Utility function for writing formulas Converts a cell's coordinates to the A1 format.

        +

        public

        +
        Parameters:
        + + + +
        integer$rowRow for the cell to convert (0-indexed).
        integer$colColumn for the cell to convert (0-indexed).
        +
        +
        +
        Returns:
        string The cell identifier in A1 format
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer::send (filename)
        +
        +
        +

        Send HTTP headers for the Excel file.

        +
        Parameters:
        + + +
        string$filenameThe filename to use for HTTP headers public
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer::Spreadsheet_Excel_Writer (filename = '')
        +
        +
        +

        The constructor. It just creates a Workbook

        +
        Parameters:
        + + +
        string$filenameThe optional filename for the Workbook.
        +
        +
        +
        Returns:
        Spreadsheet_Excel_Writer_Workbook The Workbook created
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer.png b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer.png new file mode 100644 index 000000000..3920c6ac3 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer.png differ diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter-members.html new file mode 100644 index 000000000..7057398fa --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter-members.html @@ -0,0 +1,110 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer_BIFFwriter Member List
        +
        + + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter.html new file mode 100644 index 000000000..2f2a1dfd1 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter.html @@ -0,0 +1,321 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer_BIFFwriter Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer_BIFFwriter Class Reference
        +
        +
        +
        +Inheritance diagram for Spreadsheet_Excel_Writer_BIFFwriter:
        +
        +
        + + +Spreadsheet_Excel_Writer_Workbook +Spreadsheet_Excel_Writer_Worksheet +Spreadsheet_Excel_Writer + +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         Spreadsheet_Excel_Writer_BIFFwriter ()
         _setByteOrder ()
         _prepend ($data)
         _append ($data)
         _storeBof ($type)
         _storeEof ()
         _addContinue ($data)
         setTempDir ($dir)

        +Public Attributes

        $_BIFF_version = 0x0500
        $_byte_order
        $_data
        $_datasize
        $_limit
        $_tmp_dir
        +

        Member Function Documentation

        + +
        + +
        +

        Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In Excel 97 the limit is 8228 bytes. Records that are longer than these limits must be split up into CONTINUE blocks.

        +

        This function takes a long BIFF record and inserts CONTINUE records as necessary.

        +
        Parameters:
        + + +
        string$dataThe original binary data to be written
        +
        +
        +
        Returns:
        string A very convenient string of continue blocks private
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_BIFFwriter::_append (data)
        +
        +
        +

        General storage function

        +
        Parameters:
        + + +
        string$databinary data to append private
        +
        +
        + +

        Reimplemented in Spreadsheet_Excel_Writer_Worksheet.

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_BIFFwriter::_prepend (data)
        +
        +
        +

        General storage function

        +
        Parameters:
        + + +
        string$databinary data to prepend private
        +
        +
        + +
        +
        + +
        + +
        +

        Determine the byte order and store it as class data to avoid recalculating it for each call to new().

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_BIFFwriter::_storeBof (type)
        +
        +
        +

        Writes Excel BOF record to indicate the beginning of a stream or sub-stream in the BIFF file.

        +
        Parameters:
        + + +
        integer$typeType of BIFF file to write: 0x0005 Workbook, 0x0010 Worksheet. private
        +
        +
        + +
        +
        + +
        + +
        +

        Writes Excel EOF record to indicate the end of a BIFF stream.

        +

        private

        + +
        +
        + +
        + +
        +

        Sets the temp dir used for storing the OLE file

        +

        public

        +
        Parameters:
        + + +
        string$dirThe dir to be used as temp dir
        +
        +
        +
        Returns:
        true if given dir is valid, false otherwise
        + +
        +
        + +
        + +
        +

        Constructor

        +

        public

        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/BIFFwriter.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter.png b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter.png new file mode 100644 index 000000000..c736a5841 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___b_i_f_fwriter.png differ diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___format-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___format-members.html new file mode 100644 index 000000000..23aa0fdfe --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___format-members.html @@ -0,0 +1,167 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer_Format Member List
        +
        +
        +This is the complete list of members for Spreadsheet_Excel_Writer_Format, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_bg_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_bold (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_bottom (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_bottom_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_fg_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_charset (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_family (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_name (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_outline (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_script (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_shadow (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_font_strikeout (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_hidden (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_italic (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_left (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_left_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_locked (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_num_format (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_pattern (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_right (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_right_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_rotation (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_size (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_text_h_align (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_text_justlast (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_text_v_align (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_text_wrap (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_top (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_top_color (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_underline (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $_xf_index (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        $font_index (defined in Spreadsheet_Excel_Writer_Format)Spreadsheet_Excel_Writer_Format
        _getColor($name_color= '')Spreadsheet_Excel_Writer_Format
        getFont()Spreadsheet_Excel_Writer_Format
        getFontKey()Spreadsheet_Excel_Writer_Format
        getXf($style)Spreadsheet_Excel_Writer_Format
        getXfIndex()Spreadsheet_Excel_Writer_Format
        setAlign($location)Spreadsheet_Excel_Writer_Format
        setBgColor($color)Spreadsheet_Excel_Writer_Format
        setBold($weight=1)Spreadsheet_Excel_Writer_Format
        setBorder($style)Spreadsheet_Excel_Writer_Format
        setBorderColor($color)Spreadsheet_Excel_Writer_Format
        setBottom($style)Spreadsheet_Excel_Writer_Format
        setBottomColor($color)Spreadsheet_Excel_Writer_Format
        setColor($color)Spreadsheet_Excel_Writer_Format
        setFgColor($color)Spreadsheet_Excel_Writer_Format
        setFontFamily($font_family)Spreadsheet_Excel_Writer_Format
        setHAlign($location)Spreadsheet_Excel_Writer_Format
        setItalic()Spreadsheet_Excel_Writer_Format
        setLeft($style)Spreadsheet_Excel_Writer_Format
        setLeftColor($color)Spreadsheet_Excel_Writer_Format
        setLocked()Spreadsheet_Excel_Writer_Format
        setMerge()Spreadsheet_Excel_Writer_Format
        setNumFormat($num_format)Spreadsheet_Excel_Writer_Format
        setOutLine()Spreadsheet_Excel_Writer_Format
        setPattern($arg=1)Spreadsheet_Excel_Writer_Format
        setRight($style)Spreadsheet_Excel_Writer_Format
        setRightColor($color)Spreadsheet_Excel_Writer_Format
        setScript($script)Spreadsheet_Excel_Writer_Format
        setShadow()Spreadsheet_Excel_Writer_Format
        setSize($size)Spreadsheet_Excel_Writer_Format
        setStrikeOut()Spreadsheet_Excel_Writer_Format
        setTextRotation($angle)Spreadsheet_Excel_Writer_Format
        setTextWrap()Spreadsheet_Excel_Writer_Format
        setTop($style)Spreadsheet_Excel_Writer_Format
        setTopColor($color)Spreadsheet_Excel_Writer_Format
        setUnderline($underline)Spreadsheet_Excel_Writer_Format
        setUnLocked()Spreadsheet_Excel_Writer_Format
        setVAlign($location)Spreadsheet_Excel_Writer_Format
        Spreadsheet_Excel_Writer_Format($BIFF_version, $index=0, $properties=array())Spreadsheet_Excel_Writer_Format
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___format.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___format.html new file mode 100644 index 000000000..841d4b163 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___format.html @@ -0,0 +1,1106 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer_Format Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer_Format Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         Spreadsheet_Excel_Writer_Format ($BIFF_version, $index=0, $properties=array())
         getXf ($style)
         getFont ()
         getFontKey ()
         getXfIndex ()
         _getColor ($name_color= '')
         setAlign ($location)
         setHAlign ($location)
         setVAlign ($location)
         setMerge ()
         setBold ($weight=1)
         setBottom ($style)
         setTop ($style)
         setLeft ($style)
         setRight ($style)
         setBorder ($style)
         setBorderColor ($color)
         setBottomColor ($color)
         setTopColor ($color)
         setLeftColor ($color)
         setRightColor ($color)
         setFgColor ($color)
         setBgColor ($color)
         setColor ($color)
         setPattern ($arg=1)
         setUnderline ($underline)
         setItalic ()
         setSize ($size)
         setTextWrap ()
         setTextRotation ($angle)
         setNumFormat ($num_format)
         setStrikeOut ()
         setOutLine ()
         setShadow ()
         setScript ($script)
         setLocked ()
         setUnLocked ()
         setFontFamily ($font_family)

        +Public Attributes

        $_xf_index
        $font_index
        $_font_name
        $_size
        $_bold
        $_italic
        $_color
        $_underline
        $_font_strikeout
        $_font_outline
        $_font_shadow
        $_font_script
        $_font_family
        $_font_charset
        $_num_format
        $_hidden
        $_locked
        $_text_h_align
        $_text_wrap
        $_text_v_align
        $_text_justlast
        $_rotation
        $_fg_color
        $_bg_color
        $_pattern
        $_bottom
        $_bottom_color
        $_top
        $_top_color
        $_left
        $_left_color
        $_right
        $_right_color
        +

        Member Function Documentation

        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::_getColor (name_color = '')
        +
        +
        +

        Used in conjunction with the set_xxx_color methods to convert a color string into a number. Color range is 0..63 but we will restrict it to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15.

        +

        private

        +
        Parameters:
        + + +
        string$name_colorname of the color (i.e.: 'blue', 'red', etc..). Optional.
        +
        +
        +
        Returns:
        integer The color index
        + +
        +
        + +
        + +
        +

        Generate an Excel BIFF FONT record.

        +
        Returns:
        string The FONT record
        + +
        +
        + +
        + +
        +

        Returns a unique hash key for a font. Used by Spreadsheet_Excel_Writer_Workbook::_storeAllFonts()

        +

        The elements that form the key are arranged to increase the probability of generating a unique key. Elements that hold a large range of numbers (eg. _color) are placed between two binary elements such as _italic

        +
        Returns:
        string A key for this font
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::getXf (style)
        +
        +
        +

        Generate an Excel BIFF XF record (style or cell).

        +
        Parameters:
        + + +
        string$styleThe type of the XF record ('style' or 'cell').
        +
        +
        +
        Returns:
        string The XF record
        + +
        +
        + +
        + +
        +

        Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF()

        +
        Returns:
        integer The index for the XF record
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setAlign (location)
        +
        +
        +

        Set cell alignment.

        +

        public

        +
        Parameters:
        + + +
        string$locationalignment for the cell ('left', 'right', etc...).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setBgColor (color)
        +
        +
        +

        Sets the cell's background color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setBold (weight = 1)
        +
        +
        +

        Sets the boldness of the text. Bold has a range 100..1000. 0 (400) is normal. 1 (700) is bold.

        +

        public

        +
        Parameters:
        + + +
        integer$weightWeight for the text, 0 maps to 400 (normal text), 1 maps to 700 (bold text). Valid range is: 100-1000. It's Optional, default is 1 (bold).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setBorder (style)
        +
        +
        +

        Set cells borders to the same style

        +

        public

        +
        Parameters:
        + + +
        integer$stylestyle to apply for all cell borders. 1 => thin, 2 => thick.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setBorderColor (color)
        +
        +
        +

        Sets all the cell's borders to the same color

        +

        public

        +
        Parameters:
        + + +
        mixed$colorThe color we are setting. Either a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setBottom (style)
        +
        +
        +

        Sets the width for the bottom border of the cell

        +

        public

        +
        Parameters:
        + + +
        integer$stylestyle of the cell border. 1 => thin, 2 => thick.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setBottomColor (color)
        +
        +
        +

        Sets the cell's bottom border color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setColor (color)
        +
        +
        +

        Sets the cell's color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setFgColor (color)
        +
        +
        +

        Sets the cell's foreground color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setFontFamily (font_family)
        +
        +
        +

        Sets the font family name.

        +

        public

        +
        Parameters:
        + + +
        string$fontfamilyThe font family name. Possible values are: 'Times New Roman', 'Arial', 'Courier'.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setHAlign (location)
        +
        +
        +

        Set cell horizontal alignment.

        +

        public

        +
        Parameters:
        + + +
        string$locationalignment for the cell ('left', 'right', etc...).
        +
        +
        + +
        +
        + +
        + +
        +

        Sets the font style as italic

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setLeft (style)
        +
        +
        +

        Sets the width for the left border of the cell

        +

        public

        +
        Parameters:
        + + +
        integer$stylestyle of the cell left border. 1 => thin, 2 => thick.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setLeftColor (color)
        +
        +
        +

        Sets the cell's left border color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        + +
        +

        Locks a cell.

        +

        public

        + +
        +
        + +
        + +
        +

        This is an alias for the unintuitive setAlign('merge')

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setNumFormat (num_format)
        +
        +
        +

        Sets the numeric format. It can be date, time, currency, etc...

        +

        public

        +
        Parameters:
        + + +
        integer$num_formatThe numeric format.
        +
        +
        + +
        +
        + +
        + +
        +

        Sets outlining for a font.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setPattern (arg = 1)
        +
        +
        +

        Sets the fill pattern attribute of a cell

        +

        public

        +
        Parameters:
        + + +
        integer$argOptional. Defaults to 1. Meaningful values are: 0-18, 0 meaning no background.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setRight (style)
        +
        +
        +

        Sets the width for the right border of the cell

        +

        public

        +
        Parameters:
        + + +
        integer$stylestyle of the cell right border. 1 => thin, 2 => thick.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setRightColor (color)
        +
        +
        +

        Sets the cell's right border color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setScript (script)
        +
        +
        +

        Sets the script type of the text

        +

        public

        +
        Parameters:
        + + +
        integer$scriptThe value for script type. Possible values are: 1 => superscript, 2 => subscript.
        +
        +
        + +
        +
        + +
        + +
        +

        Sets font as shadow.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setSize (size)
        +
        +
        +

        Sets the font size

        +

        public

        +
        Parameters:
        + + +
        integer$sizeThe font size (in pixels I think).
        +
        +
        + +
        +
        + +
        + +
        +

        Sets font as strikeout.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setTextRotation (angle)
        +
        +
        +

        Sets the orientation of the text

        +

        public

        +
        Parameters:
        + + +
        integer$angleThe rotation angle for the text (clockwise). Possible values are: 0, 90, 270 and -1 for stacking top-to-bottom.
        +
        +
        + +
        +
        + +
        + +
        +

        Sets text wrapping

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setTop (style)
        +
        +
        +

        Sets the width for the top border of the cell

        +

        public

        +
        Parameters:
        + + +
        integer$stylestyle of the cell top border. 1 => thin, 2 => thick.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setTopColor (color)
        +
        +
        +

        Sets the cell's top border color

        +

        public

        +
        Parameters:
        + + +
        mixed$coloreither a string (like 'blue'), or an integer (range is [8...63]).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setUnderline (underline)
        +
        +
        +

        Sets the underline of the text

        +

        public

        +
        Parameters:
        + + +
        integer$underlineThe value for underline. Possible values are: 1 => underline, 2 => double underline.
        +
        +
        + +
        +
        + +
        + +
        +

        Unlocks a cell. Useful for unprotecting particular cells of a protected sheet.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::setVAlign (location)
        +
        +
        +

        Set cell vertical alignment.

        +

        public

        +
        Parameters:
        + + +
        string$locationalignment for the cell ('top', 'vleft', 'vright', etc...).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Format::Spreadsheet_Excel_Writer_Format (BIFF_version,
        index = 0,
        properties = array() 
        )
        +
        +
        +

        Constructor

        +

        private

        +
        Parameters:
        + + + +
        integer$indexthe XF index for the format.
        array$propertiesarray with properties to be set on initialization.
        +
        +
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Format.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___parser-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___parser-members.html new file mode 100644 index 000000000..246b8647d --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___parser-members.html @@ -0,0 +1,133 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer_Parser Member List
        +
        +
        +This is the complete list of members for Spreadsheet_Excel_Writer_Parser, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_BIFF_version (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_byte_order (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_current_char (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_current_token (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_ext_sheets (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_formula (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_lookahead (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_parse_tree (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        $_references (defined in Spreadsheet_Excel_Writer_Parser)Spreadsheet_Excel_Writer_Parser
        _advance()Spreadsheet_Excel_Writer_Parser
        _cellToPackedRowcol($cell)Spreadsheet_Excel_Writer_Parser
        _cellToRowcol($cell)Spreadsheet_Excel_Writer_Parser
        _condition()Spreadsheet_Excel_Writer_Parser
        _convert($token)Spreadsheet_Excel_Writer_Parser
        _convertFunction($token, $num_args)Spreadsheet_Excel_Writer_Parser
        _convertNumber($num)Spreadsheet_Excel_Writer_Parser
        _convertRange2d($range, $class=0)Spreadsheet_Excel_Writer_Parser
        _convertRange3d($token)Spreadsheet_Excel_Writer_Parser
        _convertRef2d($cell)Spreadsheet_Excel_Writer_Parser
        _convertRef3d($cell)Spreadsheet_Excel_Writer_Parser
        _convertString($string)Spreadsheet_Excel_Writer_Parser
        _createTree($value, $left, $right)Spreadsheet_Excel_Writer_Parser
        _expression()Spreadsheet_Excel_Writer_Parser
        _fact()Spreadsheet_Excel_Writer_Parser
        _func()Spreadsheet_Excel_Writer_Parser
        _getRefIndex($ext_ref)Spreadsheet_Excel_Writer_Parser
        _getSheetIndex($sheet_name)Spreadsheet_Excel_Writer_Parser
        _initializeHashes()Spreadsheet_Excel_Writer_Parser
        _match($token)Spreadsheet_Excel_Writer_Parser
        _packExtRef($ext_ref)Spreadsheet_Excel_Writer_Parser
        _parenthesizedExpression()Spreadsheet_Excel_Writer_Parser
        _rangeToPackedRange($range)Spreadsheet_Excel_Writer_Parser
        _term()Spreadsheet_Excel_Writer_Parser
        parse($formula)Spreadsheet_Excel_Writer_Parser
        setExtSheet($name, $index)Spreadsheet_Excel_Writer_Parser
        Spreadsheet_Excel_Writer_Parser($byte_order, $biff_version)Spreadsheet_Excel_Writer_Parser
        toReversePolish($tree=array())Spreadsheet_Excel_Writer_Parser
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___parser.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___parser.html new file mode 100644 index 000000000..806a983cd --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___parser.html @@ -0,0 +1,887 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer_Parser Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer_Parser Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         Spreadsheet_Excel_Writer_Parser ($byte_order, $biff_version)
         _initializeHashes ()
         _convert ($token)
         _convertNumber ($num)
         _convertString ($string)
         _convertFunction ($token, $num_args)
         _convertRange2d ($range, $class=0)
         _convertRange3d ($token)
         _convertRef2d ($cell)
         _convertRef3d ($cell)
         _packExtRef ($ext_ref)
         _getRefIndex ($ext_ref)
         _getSheetIndex ($sheet_name)
         setExtSheet ($name, $index)
         _cellToPackedRowcol ($cell)
         _rangeToPackedRange ($range)
         _cellToRowcol ($cell)
         _advance ()
         _match ($token)
         parse ($formula)
         _condition ()
         _expression ()
         _parenthesizedExpression ()
         _term ()
         _fact ()
         _func ()
         _createTree ($value, $left, $right)
         toReversePolish ($tree=array())

        +Public Attributes

        $_current_char
        $_current_token
        $_formula
        $_lookahead
        $_parse_tree
        $_byte_order
        $_ext_sheets
        $_references
        $_BIFF_version
        +

        Member Function Documentation

        + +
        + +
        +

        Advance to the next valid token.

        +

        private

        + +
        +
        + +
        + +
        +

        pack() row and column into the required 3 or 4 byte format.

        +

        private

        +
        Parameters:
        + + +
        string$cellThe Excel cell reference to be packed
        +
        +
        +
        Returns:
        array Array containing the row and column in packed() format
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_cellToRowcol (cell)
        +
        +
        +

        Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero indexed row and column number. Also returns two (0,1) values to indicate whether the row or column are relative references.

        +

        private

        +
        Parameters:
        + + +
        string$cellThe Excel cell reference in A1 format.
        +
        +
        +
        Returns:
        array
        + +
        +
        + +
        + +
        +

        It parses a condition. It assumes the following rule: Cond -> Expr [(">" | "<") Expr]

        +

        private

        +
        Returns:
        mixed The parsed ptg'd tree on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convert (token)
        +
        +
        +

        Convert a token to the proper ptg value.

        +

        private

        +
        Parameters:
        + + +
        mixed$tokenThe token to convert.
        +
        +
        +
        Returns:
        mixed the converted token on success. PEAR_Error if the token is not recognized
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convertFunction (token,
        num_args 
        )
        +
        +
        +

        Convert a function to a ptgFunc or ptgFuncVarV depending on the number of args that it takes.

        +

        private

        +
        Parameters:
        + + + +
        string$tokenThe name of the function for convertion to ptg value.
        integer$num_argsThe number of arguments the function receives.
        +
        +
        +
        Returns:
        string The packed ptg for the function
        + +
        +
        + +
        + +
        +

        Convert a number token to ptgInt or ptgNum

        +

        private

        +
        Parameters:
        + + +
        mixed$numan integer or double for conversion to its ptg value
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convertRange2d (range,
        class = 0 
        )
        +
        +
        +

        Convert an Excel range such as A1:D4 to a ptgRefV.

        +

        private

        +
        Parameters:
        + + +
        string$rangeAn Excel range in the A1:A2 or A1..A2 format.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convertRange3d (token)
        +
        +
        +

        Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to a ptgArea3d.

        +

        private

        +
        Parameters:
        + + +
        string$tokenAn Excel range in the Sheet1!A1:A2 format.
        +
        +
        +
        Returns:
        mixed The packed ptgArea3d token on success, PEAR_Error on failure.
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convertRef2d (cell)
        +
        +
        +

        Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV.

        +

        private

        +
        Parameters:
        + + +
        string$cellAn Excel cell reference
        +
        +
        +
        Returns:
        string The cell in packed() format with the corresponding ptg
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convertRef3d (cell)
        +
        +
        +

        Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a ptgRef3d.

        +

        private

        +
        Parameters:
        + + +
        string$cellAn Excel cell reference
        +
        +
        +
        Returns:
        mixed The packed ptgRef3d token on success, PEAR_Error on failure.
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_convertString (string)
        +
        +
        +

        Convert a string token to ptgStr

        +

        private

        +
        Parameters:
        + + +
        string$stringA string for conversion to its ptg value.
        +
        +
        +
        Returns:
        mixed the converted token on success. PEAR_Error if the string is longer than 255 characters.
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_createTree (value,
        left,
        right 
        )
        +
        +
        +

        Creates a tree. In fact an array which may have one or two arrays (sub-trees) as elements.

        +

        private

        +
        Parameters:
        + + + + +
        mixed$valueThe value of this node.
        mixed$leftThe left array (sub-tree) or a final node.
        mixed$rightThe right array (sub-tree) or a final node.
        +
        +
        +
        Returns:
        array A tree
        + +
        +
        + +
        + +
        +

        It parses a expression. It assumes the following rule: Expr -> Term [("+" | "-") Term] -> "string" -> "-" Term

        +

        private

        +
        Returns:
        mixed The parsed ptg'd tree on success, PEAR_Error on failure
        + +
        +
        + +
        + +
        +

        It parses a factor. It assumes the following rule: Fact -> ( Expr ) | CellRef | CellRange | Number | Function

        +

        private

        +
        Returns:
        mixed The parsed ptg'd tree on success, PEAR_Error on failure
        + +
        +
        + +
        + +
        +

        It parses a function call. It assumes the following rule: Func -> ( Expr [,Expr]* )

        +

        private

        +
        Returns:
        mixed The parsed ptg'd tree on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_getRefIndex (ext_ref)
        +
        +
        +

        Look up the REF index that corresponds to an external sheet name (or range). If it doesn't exist yet add it to the workbook's references array. It assumes all sheet names given must exist.

        +

        private

        +
        Parameters:
        + + +
        string$ext_refThe name of the external reference
        +
        +
        +
        Returns:
        mixed The reference index in packed() format on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_getSheetIndex (sheet_name)
        +
        +
        +

        Look up the index that corresponds to an external sheet name. The hash of sheet names is updated by the addworksheet() method of the Spreadsheet_Excel_Writer_Workbook class.

        +

        private

        +
        Returns:
        integer The sheet index, -1 if the sheet was not found
        + +
        +
        + +
        + +
        +

        Initialize the ptg and function hashes.

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_match (token)
        +
        +
        +

        Checks if it's a valid token.

        +

        private

        +
        Parameters:
        + + +
        mixed$tokenThe token to check.
        +
        +
        +
        Returns:
        mixed The checked token or false on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::_packExtRef (ext_ref)
        +
        +
        +

        Convert the sheet name part of an external reference, for example "Sheet1" or "Sheet1:Sheet2", to a packed structure.

        +

        private

        +
        Parameters:
        + + +
        string$ext_refThe name of the external reference
        +
        +
        +
        Returns:
        string The reference index in packed() format
        + +
        +
        + +
        + +
        +

        This function just introduces a ptgParen element in the tree, so that Excel doesn't get confused when working with a parenthesized formula afterwards.

        +

        private

        +
        See also:
        _fact()
        +
        Returns:
        array The parsed ptg'd tree
        + +
        +
        + +
        + +
        +

        pack() row range into the required 3 or 4 byte format. Just using maximum col/rows, which is probably not the correct solution

        +

        private

        +
        Parameters:
        + + +
        string$rangeThe Excel range to be packed
        +
        +
        +
        Returns:
        array Array containing (row1,col1,row2,col2) in packed() format
        + +
        +
        + +
        + +
        +

        It parses a term. It assumes the following rule: Term -> Fact [("*" | "/") Fact]

        +

        private

        +
        Returns:
        mixed The parsed ptg'd tree on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::parse (formula)
        +
        +
        +

        The parsing method. It parses a formula.

        +

        public

        +
        Parameters:
        + + +
        string$formulaThe formula to parse, without the initial equal sign (=).
        +
        +
        +
        Returns:
        mixed true on success, PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::setExtSheet (name,
        index 
        )
        +
        +
        +

        This method is used to update the array of sheet names. It is called by the addWorksheet() method of the Spreadsheet_Excel_Writer_Workbook class.

        +

        public

        +
        See also:
        Spreadsheet_Excel_Writer_Workbook::addWorksheet()
        +
        Parameters:
        + + + +
        string$nameThe name of the worksheet being added
        integer$indexThe index of the worksheet being added
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::Spreadsheet_Excel_Writer_Parser (byte_order,
        biff_version 
        )
        +
        +
        +

        The class constructor

        +
        Parameters:
        + + +
        integer$byte_orderThe byte order (Little endian or Big endian) of the architecture (optional). 1 => big endian, 0 (default) little endian.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Parser::toReversePolish (tree = array())
        +
        +
        +

        Builds a string containing the tree in reverse polish notation (What you would use in a HP calculator stack). The following tree:

        +
          +
        • / \ 2 3
        • +
        +

        produces: "23+"

        +

        The following tree:

        +
          +
        • / \ 3 * / \ 6 A1
        • +
        +

        produces: "36A1*+"

        +

        In fact all operands, functions, references, etc... are written as ptg's

        +

        public

        +
        Parameters:
        + + +
        array$treeThe optional tree to convert.
        +
        +
        +
        Returns:
        string The tree in reverse polish notation
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Parser.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___validator-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___validator-members.html new file mode 100644 index 000000000..4a4892820 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___validator-members.html @@ -0,0 +1,122 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer_Validator Member List
        +
        +
        +This is the complete list of members for Spreadsheet_Excel_Writer_Validator, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_blank (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_descr_error (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_descr_prompt (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_fixedList (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_formula1 (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_formula2 (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_incell (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_operator (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_parser (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_showerror (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_showprompt (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_style (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_title_error (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_title_prompt (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        $_type (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        _getData() (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        _getOptions() (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        allowBlank() (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        onInvalidInfo() (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        onInvalidStop() (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        onInvalidWarn() (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        setError($errorTitle="\x00", $errorDescription="\x00", $showError=true) (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        setFormula1($formula) (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        setFormula2($formula) (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        setPrompt($promptTitle="\x00", $promptDescription="\x00", $showPrompt=true) (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        Spreadsheet_Excel_Writer_Validator(&$parser) (defined in Spreadsheet_Excel_Writer_Validator)Spreadsheet_Excel_Writer_Validator
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___validator.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___validator.html new file mode 100644 index 000000000..aba7ee89b --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___validator.html @@ -0,0 +1,161 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer_Validator Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer_Validator Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        Spreadsheet_Excel_Writer_Validator (&$parser)
        setPrompt ($promptTitle="\x00", $promptDescription="\x00", $showPrompt=true)
        setError ($errorTitle="\x00", $errorDescription="\x00", $showError=true)
        allowBlank ()
        onInvalidStop ()
        onInvalidWarn ()
        onInvalidInfo ()
        setFormula1 ($formula)
        setFormula2 ($formula)
        _getOptions ()
        _getData ()

        +Public Attributes

        $_type
        $_style
        $_fixedList
        $_blank
        $_incell
        $_showprompt
        $_showerror
        $_title_prompt
        $_descr_prompt
        $_title_error
        $_descr_error
        $_operator
        $_formula1
        $_formula2
        $_parser
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Validator.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook-members.html new file mode 100644 index 000000000..80de12420 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook-members.html @@ -0,0 +1,165 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer_Workbook Member List
        +
        +
        +This is the complete list of members for Spreadsheet_Excel_Writer_Workbook, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_1904 (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_activesheet (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_BIFF_version (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_biffsize (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_byte_order (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_codepage (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_country_code (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_data (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_datasize (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_fileclosed (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_filename (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_firstsheet (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_formats (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_limit (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_palette (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_parser (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_selected (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_sheetname (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_sheetnames (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_string_sizeinfo_size (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_tmp_dir (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_tmp_format (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_url_format (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_worksheets (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        $_xf_index (defined in Spreadsheet_Excel_Writer_Workbook)Spreadsheet_Excel_Writer_Workbook
        _addContinue($data)Spreadsheet_Excel_Writer_BIFFwriter
        _append($data)Spreadsheet_Excel_Writer_BIFFwriter
        _calcSheetOffsets()Spreadsheet_Excel_Writer_Workbook
        _calculateSharedStringsSizes()Spreadsheet_Excel_Writer_Workbook
        _prepend($data)Spreadsheet_Excel_Writer_BIFFwriter
        _setByteOrder()Spreadsheet_Excel_Writer_BIFFwriter
        _setPaletteXl97()Spreadsheet_Excel_Writer_Workbook
        _storeAllFonts()Spreadsheet_Excel_Writer_Workbook
        _storeAllNumFormats()Spreadsheet_Excel_Writer_Workbook
        _storeAllStyles()Spreadsheet_Excel_Writer_Workbook
        _storeAllXfs()Spreadsheet_Excel_Writer_Workbook
        _storeBof($type)Spreadsheet_Excel_Writer_BIFFwriter
        _storeBoundsheet($sheetname, $offset)Spreadsheet_Excel_Writer_Workbook
        _storeCodepage()Spreadsheet_Excel_Writer_Workbook
        _storeCountry()Spreadsheet_Excel_Writer_Workbook
        _storeDatemode()Spreadsheet_Excel_Writer_Workbook
        _storeEof()Spreadsheet_Excel_Writer_BIFFwriter
        _storeExterncount($cxals)Spreadsheet_Excel_Writer_Workbook
        _storeExterns()Spreadsheet_Excel_Writer_Workbook
        _storeExternsheet($sheetname)Spreadsheet_Excel_Writer_Workbook
        _storeExternsheetBiff8()Spreadsheet_Excel_Writer_Workbook
        _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax)Spreadsheet_Excel_Writer_Workbook
        _storeNames()Spreadsheet_Excel_Writer_Workbook
        _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax)Spreadsheet_Excel_Writer_Workbook
        _storeNumFormat($format, $ifmt)Spreadsheet_Excel_Writer_Workbook
        _storeOLEFile()Spreadsheet_Excel_Writer_Workbook
        _storePalette()Spreadsheet_Excel_Writer_Workbook
        _storeSharedStringsTable()Spreadsheet_Excel_Writer_Workbook
        _storeStyle()Spreadsheet_Excel_Writer_Workbook
        _storeSupbookInternal()Spreadsheet_Excel_Writer_Workbook
        _storeWindow1()Spreadsheet_Excel_Writer_Workbook
        _storeWorkbook()Spreadsheet_Excel_Writer_Workbook
        addFormat($properties=array())Spreadsheet_Excel_Writer_Workbook
        addValidator()Spreadsheet_Excel_Writer_Workbook
        addWorksheet($name= '')Spreadsheet_Excel_Writer_Workbook
        close()Spreadsheet_Excel_Writer_Workbook
        setCountry($code)Spreadsheet_Excel_Writer_Workbook
        setCustomColor($index, $red, $green, $blue)Spreadsheet_Excel_Writer_Workbook
        setTempDir($dir)Spreadsheet_Excel_Writer_BIFFwriter
        setVersion($version)Spreadsheet_Excel_Writer_Workbook
        sheets()Spreadsheet_Excel_Writer_Workbook
        Spreadsheet_Excel_Writer_BIFFwriter()Spreadsheet_Excel_Writer_BIFFwriter
        Spreadsheet_Excel_Writer_Workbook($filename)Spreadsheet_Excel_Writer_Workbook
        worksheets()Spreadsheet_Excel_Writer_Workbook
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook.html new file mode 100644 index 000000000..0aea5283e --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook.html @@ -0,0 +1,1063 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer_Workbook Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer_Workbook Class Reference
        +
        +
        +
        +Inheritance diagram for Spreadsheet_Excel_Writer_Workbook:
        +
        +
        + + +Spreadsheet_Excel_Writer_BIFFwriter +Spreadsheet_Excel_Writer + +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         Spreadsheet_Excel_Writer_Workbook ($filename)
         close ()
         sheets ()
         worksheets ()
         setVersion ($version)
         setCountry ($code)
        addWorksheet ($name= '')
        addFormat ($properties=array())
        addValidator ()
         setCustomColor ($index, $red, $green, $blue)
         _setPaletteXl97 ()
         _storeWorkbook ()
         _storeOLEFile ()
         _calcSheetOffsets ()
         _storeAllFonts ()
         _storeAllNumFormats ()
         _storeAllXfs ()
         _storeAllStyles ()
         _storeExterns ()
         _storeNames ()
         _storeCodepage ()
         _storeWindow1 ()
         _storeBoundsheet ($sheetname, $offset)
         _storeSupbookInternal ()
         _storeExternsheetBiff8 ()
         _storeStyle ()
         _storeNumFormat ($format, $ifmt)
         _storeDatemode ()
         _storeExterncount ($cxals)
         _storeExternsheet ($sheetname)
         _storeNameShort ($index, $type, $rowmin, $rowmax, $colmin, $colmax)
         _storeNameLong ($index, $type, $rowmin, $rowmax, $colmin, $colmax)
         _storeCountry ()
         _storePalette ()
         _calculateSharedStringsSizes ()
         _storeSharedStringsTable ()

        +Public Attributes

        $_filename
        $_parser
        $_1904
        $_activesheet
        $_firstsheet
        $_selected
        $_xf_index
        $_fileclosed
        $_biffsize
        $_sheetname
        $_tmp_format
        $_worksheets
        $_sheetnames
        $_formats
        $_palette
        $_url_format
        $_codepage
        $_country_code
        $_string_sizeinfo_size
        +

        Member Function Documentation

        + +
        + +
        +

        Calculate offsets for Worksheet BOF records.

        +

        private

        + +
        +
        + +
        + +
        +

        Calculate Handling of the SST continue blocks is complicated by the need to include an additional continuation byte depending on whether the string is split between blocks or whether it starts at the beginning of the block. (There are also additional complications that will arise later when/if Rich Strings are supported).

        +

        private

        + +
        +
        + +
        + +
        +

        Sets the colour palette to the Excel 97+ default.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the Excel FONT records.

        +

        private

        + +
        +
        + +
        + +
        +

        Store user defined numerical formats i.e. FORMAT records

        +

        private

        + +
        +
        + +
        + +
        +

        Write all STYLE records.

        +

        private

        + +
        +
        + +
        + +
        +

        Write all XF records.

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::_storeBoundsheet (sheetname,
        offset 
        )
        +
        +
        +

        Writes Excel BIFF BOUNDSHEET record. FIXME: inconsistent with BIFF documentation

        +
        Parameters:
        + + + +
        string$sheetnameWorksheet name
        integer$offsetLocation of worksheet BOF private
        +
        +
        + +
        +
        + +
        + +
        +

        Stores the CODEPAGE biff record.

        +

        private

        + +
        +
        + +
        + +
        +

        Stores the COUNTRY record for localization

        +

        private

        + +
        +
        + +
        + +
        +

        Write DATEMODE record to indicate the date system in use (1904 or 1900).

        +

        private

        + +
        +
        + +
        + +
        +

        Write BIFF record EXTERNCOUNT to indicate the number of external sheet references in the workbook.

        +

        Excel only stores references to external sheets that are used in NAME. The workbook NAME record is required to define the print area and the repeat rows and columns.

        +

        A similar method is used in Worksheet.php for a slightly different purpose.

        +
        Parameters:
        + + +
        integer$cxalsNumber of external references private
        +
        +
        + +
        +
        + +
        + +
        +

        Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for the NAME records.

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::_storeExternsheet (sheetname)
        +
        +
        +

        Writes the Excel BIFF EXTERNSHEET record. These references are used by formulas. NAME record is required to define the print area and the repeat rows and columns.

        +

        A similar method is used in Worksheet.php for a slightly different purpose.

        +
        Parameters:
        + + +
        string$sheetnameWorksheet name private
        +
        +
        + +
        +
        + +
        + +
        +

        Writes the Excel BIFF EXTERNSHEET record. These references are used by formulas.

        +
        Parameters:
        + + +
        string$sheetnameWorksheet name private
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::_storeNameLong (index,
        type,
        rowmin,
        rowmax,
        colmin,
        colmax 
        )
        +
        +
        +

        Store the NAME record in the long format that is used for storing the repeat rows and columns when both are specified. This shares a lot of code with _storeNameShort() but we use a separate method to keep the code clean. Code abstraction for reuse can be carried too far, and I should know. ;-)

        +
        Parameters:
        + + + + + + + +
        integer$indexSheet index
        integer$typeBuilt-in name type
        integer$rowminStart row
        integer$rowmaxEnd row
        integer$colminStart colum
        integer$colmaxEnd column private
        +
        +
        + +
        +
        + +
        + +
        +

        Write the NAME record to define the print area and the repeat rows and cols.

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::_storeNameShort (index,
        type,
        rowmin,
        rowmax,
        colmin,
        colmax 
        )
        +
        +
        +

        Store the NAME record in the short format that is used for storing the print area, repeat rows only and repeat columns only.

        +
        Parameters:
        + + + + + + + +
        integer$indexSheet index
        integer$typeBuilt-in name type
        integer$rowminStart row
        integer$rowmaxEnd row
        integer$colminStart colum
        integer$colmaxEnd column private
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::_storeNumFormat (format,
        ifmt 
        )
        +
        +
        +

        Writes Excel FORMAT record for non "built-in" numerical formats.

        +
        Parameters:
        + + + +
        string$formatCustom format string
        integer$ifmtFormat index code private
        +
        +
        + +
        +
        + +
        + +
        +

        Store the workbook in an OLE container

        +

        private

        +
        Returns:
        mixed true on success. PEAR_Error on failure
        + +
        +
        + +
        + +
        +

        Stores the PALETTE biff record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write all of the workbooks strings into an indexed array. See the comments in _calculate_shared_string_sizes() for more information.

        +

        The Excel documentation says that the SST record should be followed by an EXTSST record. The EXTSST record is a hash table that is used to optimise access to SST. However, despite the documentation it doesn't seem to be required so we will ignore it.

        +

        private

        + +
        +
        + +
        + +
        +

        Write Excel BIFF STYLE records.

        +

        private

        + +
        +
        + +
        + +
        +

        Write Internal SUPBOOK record

        +

        private

        + +
        +
        + +
        + +
        +

        Write Excel BIFF WINDOW1 record.

        +

        private

        + +
        +
        + +
        + +
        +

        Assemble worksheets into a workbook and send the BIFF data to an OLE storage.

        +

        private

        +
        Returns:
        mixed true on success. PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        & Spreadsheet_Excel_Writer_Workbook::addFormat (properties = array())
        +
        +
        +

        Add a new format to the Excel workbook. Also, pass any properties to the Format constructor.

        +

        public

        +
        Parameters:
        + + +
        array$propertiesarray with properties for initializing the format.
        +
        +
        +
        Returns:
        &Spreadsheet_Excel_Writer_Format reference to an Excel Format
        + +
        +
        + +
        + +
        +

        Create new validator.

        +

        public

        +
        Returns:
        &Spreadsheet_Excel_Writer_Validator reference to a Validator
        + +
        +
        + +
        +
        + + + + + + + + +
        & Spreadsheet_Excel_Writer_Workbook::addWorksheet (name = '')
        +
        +
        +

        Add a new worksheet to the Excel workbook. If no name is given the name of the worksheet will be Sheeti$i, with $i in [1..].

        +

        public

        +
        Parameters:
        + + +
        string$namethe optional name of the worksheet
        +
        +
        +
        Returns:
        mixed reference to a worksheet object on success, PEAR_Error on failure
        + +
        +
        + +
        + +
        +

        Calls finalization methods. This method should always be the last one to be called on every workbook

        +

        public

        +
        Returns:
        mixed true on success. PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::setCountry (code)
        +
        +
        +

        Set the country identifier for the workbook

        +

        public

        +
        Parameters:
        + + +
        integer$codeIs the international calling country code for the chosen country.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::setCustomColor (index,
        red,
        green,
        blue 
        )
        +
        +
        +

        Change the RGB components of the elements in the colour palette.

        +

        public

        +
        Parameters:
        + + + + + +
        integer$indexcolour index
        integer$redred RGB value [0-255]
        integer$greengreen RGB value [0-255]
        integer$blueblue RGB value [0-255]
        +
        +
        +
        Returns:
        integer The palette index for the custom color
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Workbook::setVersion (version)
        +
        +
        +

        Sets the BIFF version. This method exists just to access experimental functionality from BIFF8. It will be deprecated ! Only possible value is 8 (Excel 97/2000). For any other value it fails silently.

        +

        public

        +
        Parameters:
        + + +
        integer$versionThe BIFF version
        +
        +
        + +
        +
        + +
        + +
        +

        An accessor for the _worksheets[] array Returns an array of the worksheet objects in a workbook It actually calls to worksheets()

        +

        public

        +
        See also:
        worksheets()
        +
        Returns:
        array
        + +
        +
        + +
        + +
        +

        Class constructor

        +
        Parameters:
        + + +
        stringfilename for storing the workbook. "-" for writing to stdout. public
        +
        +
        + +
        +
        + +
        + +
        +

        An accessor for the _worksheets[] array. Returns an array of the worksheet objects in a workbook

        +

        public

        +
        Returns:
        array
        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Workbook.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook.png b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook.png new file mode 100644 index 000000000..a7f8c2d3e Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___workbook.png differ diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet-members.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet-members.html new file mode 100644 index 000000000..a6067a244 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet-members.html @@ -0,0 +1,279 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Spreadsheet_Excel_Writer_Worksheet Member List
        +
        +
        +This is the complete list of members for Spreadsheet_Excel_Writer_Worksheet, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        $_active_pane (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_BIFF_version (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_byte_order (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_colinfo (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_data (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_datasize (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_dim_colmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_dim_colmin (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_dim_rowmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_dim_rowmin (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_filehandle (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_fit_height (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_fit_page (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_fit_width (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_footer (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_frozen (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_hcenter (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_header (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_input_encoding (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_limit (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_margin_bottom (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_margin_foot (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_margin_head (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_margin_left (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_margin_right (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_margin_top (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_merged_ranges (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_orientation (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_outline_below (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_outline_on (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_outline_right (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_outline_row_level (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_outline_style (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_panes (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_paper_size (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_parser (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_selection (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_str_table (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_str_total (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_str_unique (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_tmp_dir (defined in Spreadsheet_Excel_Writer_BIFFwriter)Spreadsheet_Excel_Writer_BIFFwriter
        $_url_format (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_using_tmpfile (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_vcenter (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_xls_colmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_xls_rowmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $_xls_strmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $absolute (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $data (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $dir_long (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $dir_long_len (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $dir_short (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $dir_short_len (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $header (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $index (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $length (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $link_type (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $link_type (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $name (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $print_colmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $print_colmin (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $print_rowmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $print_rowmin (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $record (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $selected (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $str_error (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $stream_len (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $title_colmin (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $title_rowmax (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $title_rowmin (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $unknown1 (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $unknown2 (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $unknown3 (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $unknown4 (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $up_count (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $url (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        $url (defined in Spreadsheet_Excel_Writer_Worksheet)Spreadsheet_Excel_Writer_Worksheet
        _addContinue($data)Spreadsheet_Excel_Writer_BIFFwriter
        _append($data)Spreadsheet_Excel_Writer_Worksheet
        _cellToRowcol($cell)Spreadsheet_Excel_Writer_Worksheet
        _checkRowCol($row, $col)Spreadsheet_Excel_Writer_Worksheet
        _encodePassword($plaintext)Spreadsheet_Excel_Writer_Worksheet
        _initialize()Spreadsheet_Excel_Writer_Worksheet
        _positionImage($col_start, $row_start, $x1, $y1, $width, $height)Spreadsheet_Excel_Writer_Worksheet
        _prepend($data)Spreadsheet_Excel_Writer_BIFFwriter
        _processBitmap($bitmap)Spreadsheet_Excel_Writer_Worksheet
        _setByteOrder()Spreadsheet_Excel_Writer_BIFFwriter
        _sizeCol($col)Spreadsheet_Excel_Writer_Worksheet
        _sizeRow($row)Spreadsheet_Excel_Writer_Worksheet
        _storeBof($type)Spreadsheet_Excel_Writer_BIFFwriter
        _storeColinfo($col_array)Spreadsheet_Excel_Writer_Worksheet
        _storeDataValidity()Spreadsheet_Excel_Writer_Worksheet
        _storeDefcol()Spreadsheet_Excel_Writer_Worksheet
        _storeDimensions()Spreadsheet_Excel_Writer_Worksheet
        _storeEof()Spreadsheet_Excel_Writer_BIFFwriter
        _storeExterncount($count)Spreadsheet_Excel_Writer_Worksheet
        _storeExternsheet($sheetname)Spreadsheet_Excel_Writer_Worksheet
        _storeFooter()Spreadsheet_Excel_Writer_Worksheet
        _storeGridset()Spreadsheet_Excel_Writer_Worksheet
        _storeGuts()Spreadsheet_Excel_Writer_Worksheet
        _storeHbreak()Spreadsheet_Excel_Writer_Worksheet
        _storeHcenter()Spreadsheet_Excel_Writer_Worksheet
        _storeHeader()Spreadsheet_Excel_Writer_Worksheet
        _storeMarginBottom()Spreadsheet_Excel_Writer_Worksheet
        _storeMarginLeft()Spreadsheet_Excel_Writer_Worksheet
        _storeMarginRight()Spreadsheet_Excel_Writer_Worksheet
        _storeMarginTop()Spreadsheet_Excel_Writer_Worksheet
        _storeMergedCells()Spreadsheet_Excel_Writer_Worksheet
        _storeObjPicture($colL, $dxL, $rwT, $dyT, $colR, $dxR, $rwB, $dyB)Spreadsheet_Excel_Writer_Worksheet
        _storePanes($panes)Spreadsheet_Excel_Writer_Worksheet
        _storePassword()Spreadsheet_Excel_Writer_Worksheet
        _storePrintGridlines()Spreadsheet_Excel_Writer_Worksheet
        _storePrintHeaders()Spreadsheet_Excel_Writer_Worksheet
        _storeProtect()Spreadsheet_Excel_Writer_Worksheet
        _storeSelection($array)Spreadsheet_Excel_Writer_Worksheet
        _storeSetup()Spreadsheet_Excel_Writer_Worksheet
        _storeVbreak()Spreadsheet_Excel_Writer_Worksheet
        _storeVcenter()Spreadsheet_Excel_Writer_Worksheet
        _storeWindow2()Spreadsheet_Excel_Writer_Worksheet
        _storeWsbool()Spreadsheet_Excel_Writer_Worksheet
        _storeZoom()Spreadsheet_Excel_Writer_Worksheet
        _substituteCellref($cell)Spreadsheet_Excel_Writer_Worksheet
        _writeUrlExternal($row1, $col1, $row2, $col2, $url, $str, $format=null)Spreadsheet_Excel_Writer_Worksheet
        _writeUrlInternal($row1, $col1, $row2, $col2, $url, $str, $format=null)Spreadsheet_Excel_Writer_Worksheet
        _writeUrlRange($row1, $col1, $row2, $col2, $url, $string= '', $format=null)Spreadsheet_Excel_Writer_Worksheet
        _writeUrlWeb($row1, $col1, $row2, $col2, $url, $str, $format=null)Spreadsheet_Excel_Writer_Worksheet
        _XF(&$format)Spreadsheet_Excel_Writer_Worksheet
        activate()Spreadsheet_Excel_Writer_Worksheet
        centerHorizontally($center=1)Spreadsheet_Excel_Writer_Worksheet
        centerVertically($center=1)Spreadsheet_Excel_Writer_Worksheet
        close($sheetnames)Spreadsheet_Excel_Writer_Worksheet
        fitToPages($width, $height)Spreadsheet_Excel_Writer_Worksheet
        freezePanes($panes)Spreadsheet_Excel_Writer_Worksheet
        getData()Spreadsheet_Excel_Writer_Worksheet
        getName()Spreadsheet_Excel_Writer_Worksheet
        hideGridlines()Spreadsheet_Excel_Writer_Worksheet
        hideScreenGridlines()Spreadsheet_Excel_Writer_Worksheet
        insertBitmap($row, $col, $bitmap, $x=0, $y=0, $scale_x=1, $scale_y=1)Spreadsheet_Excel_Writer_Worksheet
        mergeCells($first_row, $first_col, $last_row, $last_col)Spreadsheet_Excel_Writer_Worksheet
        printArea($first_row, $first_col, $last_row, $last_col)Spreadsheet_Excel_Writer_Worksheet
        printRowColHeaders($print=1)Spreadsheet_Excel_Writer_Worksheet
        protect($password)Spreadsheet_Excel_Writer_Worksheet
        repeatColumns($first_col, $last_col=null)Spreadsheet_Excel_Writer_Worksheet
        repeatRows($first_row, $last_row=null)Spreadsheet_Excel_Writer_Worksheet
        select()Spreadsheet_Excel_Writer_Worksheet
        setColumn($firstcol, $lastcol, $width, $format=null, $hidden=0, $level=0)Spreadsheet_Excel_Writer_Worksheet
        setFirstSheet()Spreadsheet_Excel_Writer_Worksheet
        setFooter($string, $margin=0.50)Spreadsheet_Excel_Writer_Worksheet
        setHeader($string, $margin=0.50)Spreadsheet_Excel_Writer_Worksheet
        setHPagebreaks($breaks)Spreadsheet_Excel_Writer_Worksheet
        setInputEncoding($encoding)Spreadsheet_Excel_Writer_Worksheet
        setLandscape()Spreadsheet_Excel_Writer_Worksheet
        setMarginBottom($margin=1.00)Spreadsheet_Excel_Writer_Worksheet
        setMarginLeft($margin=0.75)Spreadsheet_Excel_Writer_Worksheet
        setMarginRight($margin=0.75)Spreadsheet_Excel_Writer_Worksheet
        setMargins($margin)Spreadsheet_Excel_Writer_Worksheet
        setMargins_LR($margin)Spreadsheet_Excel_Writer_Worksheet
        setMargins_TB($margin)Spreadsheet_Excel_Writer_Worksheet
        setMarginTop($margin=1.00)Spreadsheet_Excel_Writer_Worksheet
        setMerge($first_row, $first_col, $last_row, $last_col)Spreadsheet_Excel_Writer_Worksheet
        setOutline($visible=true, $symbols_below=true, $symbols_right=true, $auto_style=false)Spreadsheet_Excel_Writer_Worksheet
        setPaper($size=0)Spreadsheet_Excel_Writer_Worksheet
        setPortrait()Spreadsheet_Excel_Writer_Worksheet
        setPrintScale($scale=100)Spreadsheet_Excel_Writer_Worksheet
        setRow($row, $height, $format=null, $hidden=false, $level=0)Spreadsheet_Excel_Writer_Worksheet
        setSelection($first_row, $first_column, $last_row, $last_column)Spreadsheet_Excel_Writer_Worksheet
        setTempDir($dir)Spreadsheet_Excel_Writer_BIFFwriter
        setValidation($row1, $col1, $row2, $col2, &$validator)Spreadsheet_Excel_Writer_Worksheet
        setVPagebreaks($breaks)Spreadsheet_Excel_Writer_Worksheet
        setZoom($scale=100)Spreadsheet_Excel_Writer_Worksheet
        Spreadsheet_Excel_Writer_BIFFwriter()Spreadsheet_Excel_Writer_BIFFwriter
        Spreadsheet_Excel_Writer_Worksheet($BIFF_version, $name, $index, &$activesheet, &$firstsheet, &$str_total, &$str_unique, &$str_table, &$url_format, &$parser, $tmp_dir)Spreadsheet_Excel_Writer_Worksheet
        thawPanes($panes)Spreadsheet_Excel_Writer_Worksheet
        write($row, $col, $token, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeBlank($row, $col, $format)Spreadsheet_Excel_Writer_Worksheet
        writeCol($row, $col, $val, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeFormula($row, $col, $formula, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeNote($row, $col, $note)Spreadsheet_Excel_Writer_Worksheet
        writeNumber($row, $col, $num, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeRow($row, $col, $val, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeString($row, $col, $str, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeStringBIFF8($row, $col, $str, $format=null)Spreadsheet_Excel_Writer_Worksheet
        writeUrl($row, $col, $url, $string= '', $format=null)Spreadsheet_Excel_Writer_Worksheet
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet.html b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet.html new file mode 100644 index 000000000..78b4c2091 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet.html @@ -0,0 +1,3590 @@ + + + + + +CORE POS - Fannie: Spreadsheet_Excel_Writer_Worksheet Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Spreadsheet_Excel_Writer_Worksheet Class Reference
        +
        +
        +
        +Inheritance diagram for Spreadsheet_Excel_Writer_Worksheet:
        +
        +
        + + +Spreadsheet_Excel_Writer_BIFFwriter + +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

         Spreadsheet_Excel_Writer_Worksheet ($BIFF_version, $name, $index, &$activesheet, &$firstsheet, &$str_total, &$str_unique, &$str_table, &$url_format, &$parser, $tmp_dir)
         _initialize ()
         close ($sheetnames)
         getName ()
         getData ()
         setMerge ($first_row, $first_col, $last_row, $last_col)
         select ()
         activate ()
         setFirstSheet ()
         protect ($password)
         setColumn ($firstcol, $lastcol, $width, $format=null, $hidden=0, $level=0)
         setSelection ($first_row, $first_column, $last_row, $last_column)
         freezePanes ($panes)
         thawPanes ($panes)
         setPortrait ()
         setLandscape ()
         setPaper ($size=0)
         setHeader ($string, $margin=0.50)
         setFooter ($string, $margin=0.50)
         centerHorizontally ($center=1)
         centerVertically ($center=1)
         setMargins ($margin)
         setMargins_LR ($margin)
         setMargins_TB ($margin)
         setMarginLeft ($margin=0.75)
         setMarginRight ($margin=0.75)
         setMarginTop ($margin=1.00)
         setMarginBottom ($margin=1.00)
         repeatRows ($first_row, $last_row=null)
         repeatColumns ($first_col, $last_col=null)
         printArea ($first_row, $first_col, $last_row, $last_col)
         hideGridlines ()
         hideScreenGridlines ()
         printRowColHeaders ($print=1)
         fitToPages ($width, $height)
         setHPagebreaks ($breaks)
         setVPagebreaks ($breaks)
         setZoom ($scale=100)
         setPrintScale ($scale=100)
         write ($row, $col, $token, $format=null)
         writeRow ($row, $col, $val, $format=null)
         writeCol ($row, $col, $val, $format=null)
         _XF (&$format)
         _append ($data)
         _substituteCellref ($cell)
         _cellToRowcol ($cell)
         _encodePassword ($plaintext)
         setOutline ($visible=true, $symbols_below=true, $symbols_right=true, $auto_style=false)
         writeNumber ($row, $col, $num, $format=null)
         writeString ($row, $col, $str, $format=null)
         setInputEncoding ($encoding)
         writeStringBIFF8 ($row, $col, $str, $format=null)
         _checkRowCol ($row, $col)
         writeNote ($row, $col, $note)
         writeBlank ($row, $col, $format)
         writeFormula ($row, $col, $formula, $format=null)
         writeUrl ($row, $col, $url, $string= '', $format=null)
         _writeUrlRange ($row1, $col1, $row2, $col2, $url, $string= '', $format=null)
         _writeUrlWeb ($row1, $col1, $row2, $col2, $url, $str, $format=null)
         _writeUrlInternal ($row1, $col1, $row2, $col2, $url, $str, $format=null)
         _writeUrlExternal ($row1, $col1, $row2, $col2, $url, $str, $format=null)
         setRow ($row, $height, $format=null, $hidden=false, $level=0)
         _storeDimensions ()
         _storeWindow2 ()
         _storeDefcol ()
         _storeColinfo ($col_array)
         _storeSelection ($array)
         _storeMergedCells ()
         _storeExterncount ($count)
         _storeExternsheet ($sheetname)
         _storePanes ($panes)
         _storeSetup ()
         _storeHeader ()
         _storeFooter ()
         _storeHcenter ()
         _storeVcenter ()
         _storeMarginLeft ()
         _storeMarginRight ()
         _storeMarginTop ()
         _storeMarginBottom ()
         mergeCells ($first_row, $first_col, $last_row, $last_col)
         _storePrintHeaders ()
         _storePrintGridlines ()
         _storeGridset ()
         _storeGuts ()
         _storeWsbool ()
         _storeHbreak ()
         _storeVbreak ()
         _storeProtect ()
         _storePassword ()
         insertBitmap ($row, $col, $bitmap, $x=0, $y=0, $scale_x=1, $scale_y=1)
         _positionImage ($col_start, $row_start, $x1, $y1, $width, $height)
         _sizeCol ($col)
         _sizeRow ($row)
         _storeObjPicture ($colL, $dxL, $rwT, $dyT, $colR, $dxR, $rwB, $dyB)
         _processBitmap ($bitmap)
         _storeZoom ()
         setValidation ($row1, $col1, $row2, $col2, &$validator)
         _storeDataValidity ()

        +Public Attributes

        $name
        $index
        $_url_format
        $_parser
        $_filehandle
        $_using_tmpfile
        $_xls_rowmax
        $_xls_colmax
        $_xls_strmax
        $_dim_rowmin
        $_dim_rowmax
        $_dim_colmin
        $_dim_colmax
        $_colinfo
        $_selection
        $_panes
        $_active_pane
        $_frozen
        $selected
        $_paper_size
        $_orientation
        $_header
        $_footer
        $_hcenter
        $_vcenter
        $_margin_head
        $_margin_foot
        $_margin_left
        $_margin_right
        $_margin_top
        $_margin_bottom
        $title_rowmin
        $title_rowmax
        $title_colmin
        $print_rowmin
        $print_rowmax
        $print_colmin
        $print_colmax
        $_outline_on
        $_outline_style
        $_outline_below
        $_outline_right
        $_outline_row_level
        $_fit_page
        $_fit_width
        $_fit_height
        $_str_total
        $_str_unique
        $_str_table
        $_merged_ranges
        $_input_encoding
        $record = 0x01B8
        $length = 0x00000
        +if(!$format) $url = preg_replace('/^external:/', '', $url)
        $url = preg_replace('/\//', "\\", $url)
        +if($str== '') $str_error = $this->writeString($row1, $col1, $str, $format)
        +if(($str_error==-2) or($str_error==-3)) $absolute = 0x02
        +if(!preg_match("/\\\/", $url))
        +if(preg_match("/^\.\.\\\/",
        +$url) 
        $link_type ) = 0x01 | $absolute
        $dir_long = $url
        +if(preg_match("/\#/", $url)) $link_type = pack("V", $link_type)
        $up_count = preg_match_all("/\.\.\\\/", $dir_long, $useless)
        $dir_short = "\0"
        $dir_short_len = pack("V", strlen($dir_short) )
        $dir_long_len = pack("V", strlen($dir_long) )
        $stream_len = pack("V", 0)
        $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' )
        $unknown2 = pack("H*",'0303000000000000C000000000000046' )
        $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000')
        $unknown4 = pack("v", 0x03 )
         $data
        $header = pack("vv", $record, $length)
        +

        Member Function Documentation

        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_append (data)
        +
        +
        +

        Store Worksheet data in memory using the parent's class append() or to a temporary file, the default.

        +

        private

        +
        Parameters:
        + + +
        string$dataThe binary data to append
        +
        +
        + +

        Reimplemented from Spreadsheet_Excel_Writer_BIFFwriter.

        + +
        +
        + +
        + +
        +

        Convert an Excel cell reference in A1 notation to a zero based row and column reference; converts C1 to (0, 2).

        +

        private

        +
        Parameters:
        + + +
        string$cellThe cell reference.
        +
        +
        +
        Returns:
        array containing (row, column)
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_checkRowCol (row,
        col 
        )
        +
        +
        +

        Check row and col before writing to a cell, and update the sheet's dimensions accordingly

        +

        private

        +
        Parameters:
        + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        +
        +
        +
        Returns:
        boolean true for success, false if row and/or col are grester then maximums allowed.
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_encodePassword (plaintext)
        +
        +
        +

        Based on the algorithm provided by Daniel Rentz of OpenOffice.

        +

        private

        +
        Parameters:
        + + +
        string$plaintextThe password to be encoded in plaintext.
        +
        +
        +
        Returns:
        string The encoded password
        + +
        +
        + +
        + +
        +

        Open a tmp file to store the majority of the Worksheet data. If this fails, for example due to write permissions, store the data in memory. This can be slow for large files.

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_positionImage (col_start,
        row_start,
        x1,
        y1,
        width,
        height 
        )
        +
        +
        +

        Calculate the vertices that define the position of the image as required by the OBJ record.

        +
            +------------+------------+
        +    |     A      |      B     |
        +

        +-----+------------+------------+ | |(x1,y1) | | | 1 |(A1)._______|______ | | | | | | | | | | | +-----+----| BITMAP |-----+ | | | | | | 2 | |______________. | | | | (B2)| | | | (x2,y2)| +---- +------------+------------+

        +

        Example of a bitmap that covers some of the area from cell A1 to cell B2.

        +

        Based on the width and height of the bitmap we need to calculate 8 vars: $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. The width and height of the cells are also variable and have to be taken into account. The values of $col_start and $row_start are passed in from the calling function. The values of $col_end and $row_end are calculated by subtracting the width and height of the bitmap from the width and height of the underlying cells. The vertices are expressed as a percentage of the underlying cell width as follows (rhs values are in pixels):

        +
          x1 = X / W *1024
        +  y1 = Y / H *256
        +  x2 = (X-1) / W *1024
        +  y2 = (Y-1) / H *256
        +
        +  Where:  X is distance from the left side of the underlying cell
        +          Y is distance from the top of the underlying cell
        +          W is the width of the cell
        +          H is the height of the cell

        private

        +
        Note:
        the SDK incorrectly states that the height should be expressed as a percentage of 1024.
        +
        Parameters:
        + + + + + + + +
        integer$col_startCol containing upper left corner of object
        integer$row_startRow containing top left corner of object
        integer$x1Distance to left side of object
        integer$y1Distance to top of object
        integer$widthWidth of image frame
        integer$heightHeight of image frame
        +
        +
        + +
        +
        + +
        + +
        +

        Convert a 24 bit bitmap into the modified internal format used by Windows. This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the MSDN library.

        +

        private

        +
        Parameters:
        + + +
        string$bitmapThe bitmap to process
        +
        +
        +
        Returns:
        array Array with data and properties of the bitmap
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_sizeCol (col)
        +
        +
        +

        Convert the width of a cell from user's units to pixels. By interpolation the relationship is: y = 7x +5. If the width hasn't been set by the user we use the default value. If the col is hidden we use a value of zero.

        +

        private

        +
        Parameters:
        + + +
        integer$colThe column
        +
        +
        +
        Returns:
        integer The width in pixels
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_sizeRow (row)
        +
        +
        +

        Convert the height of a cell from user's units to pixels. By interpolation the relationship is: y = 4/3x. If the height hasn't been set by the user we use the default value. If the row is hidden we use a value of zero. (Not possible to hide row yet).

        +

        private

        +
        Parameters:
        + + +
        integer$rowThe row
        +
        +
        +
        Returns:
        integer The width in pixels
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_storeColinfo (col_array)
        +
        +
        +

        Write BIFF record COLINFO to define column widths

        +

        Note: The SDK says the record length is 0x0B but Excel writes a 0x0C length record.

        +

        private

        +
        Parameters:
        + + +
        array$col_arrayThis is the only parameter received and is composed of the following: 0 => First formatted column, 1 => Last formatted column, 2 => Col width (8.43 is Excel default), 3 => The optional XF format of the column, 4 => Option flags. 5 => Optional outline level
        +
        +
        + +
        +
        + +
        + +
        +

        Store the DVAL and DV records.

        +

        private

        + +
        +
        + +
        + +
        +

        Write BIFF record DEFCOLWIDTH if COLINFO records are in use.

        +

        private

        + +
        +
        + +
        + +
        +

        Writes Excel DIMENSIONS to define the area in which there is data.

        +

        private

        + +
        +
        + +
        + +
        +

        Write BIFF record EXTERNCOUNT to indicate the number of external sheet references in a worksheet.

        +

        Excel only stores references to external sheets that are used in formulas. For simplicity we store references to all the sheets in the workbook regardless of whether they are used or not. This reduces the overall complexity and eliminates the need for a two way dialogue between the formula parser the worksheet objects.

        +

        private

        +
        Parameters:
        + + +
        integer$countThe number of external sheet references in this worksheet
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_storeExternsheet (sheetname)
        +
        +
        +

        Writes the Excel BIFF EXTERNSHEET record. These references are used by formulas. A formula references a sheet name via an index. Since we store a reference to all of the external worksheets the EXTERNSHEET index is the same as the worksheet index.

        +

        private

        +
        Parameters:
        + + +
        string$sheetnameThe name of a external worksheet
        +
        +
        + +
        +
        + +
        + +
        +

        Store the footer caption BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write the GRIDSET BIFF record. Must be used in conjunction with the PRINTGRIDLINES record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write the GUTS BIFF record. This is used to configure the gutter margins where Excel outline symbols are displayed. The visibility of the gutters is controlled by a flag in WSBOOL.

        +
        See also:
        _storeWsbool() private
        + +
        +
        + +
        + +
        +

        Write the HORIZONTALPAGEBREAKS BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the horizontal centering HCENTER BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the header caption BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the BOTTOMMARGIN BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the LEFTMARGIN BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the RIGHTMARGIN BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the TOPMARGIN BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the MERGEDCELLS record for all ranges of merged cells

        +

        private

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_storeObjPicture (colL,
        dxL,
        rwT,
        dyT,
        colR,
        dxR,
        rwB,
        dyB 
        )
        +
        +
        +

        Store the OBJ record that precedes an IMDATA record. This could be generalise to support other Excel objects.

        +

        private

        +
        Parameters:
        + + + + + + + + + +
        integer$colLColumn containing upper left corner of object
        integer$dxLDistance from left side of cell
        integer$rwTRow containing top left corner of object
        integer$dyTDistance from top of cell
        integer$colRColumn containing lower right corner of object
        integer$dxRDistance from right of cell
        integer$rwBRow containing bottom right corner of object
        integer$dyBDistance from bottom of cell
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_storePanes (panes)
        +
        +
        +

        Writes the Excel BIFF PANE record. The panes can either be frozen or thawed (unfrozen). Frozen panes are specified in terms of an integer number of rows and columns. Thawed panes are specified in terms of Excel's units for rows and columns.

        +

        private

        +
        Parameters:
        + + +
        array$panesThis is the only parameter received and is composed of the following: 0 => Vertical split position, 1 => Horizontal split position 2 => Top row visible 3 => Leftmost column visible 4 => Active pane
        +
        +
        + +
        +
        + +
        + +
        +

        Write the worksheet PASSWORD record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the GRIDSET record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write the PRINTHEADERS BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Set the Biff PROTECT record to indicate that the worksheet is protected.

        +

        private

        + +
        +
        + +
        + +
        +

        Write BIFF record SELECTION.

        +

        private

        +
        Parameters:
        + + +
        array$arrayarray containing ($rwFirst,$colFirst,$rwLast,$colLast)
        +
        +
        +
        See also:
        setSelection()
        + +
        +
        + +
        + +
        +

        Store the page setup SETUP BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write the VERTICALPAGEBREAKS BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the vertical centering VCENTER BIFF record.

        +

        private

        + +
        +
        + +
        + +
        +

        Write BIFF record Window2.

        +

        private

        + +
        +
        + +
        + +
        +

        Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction with the SETUP record.

        +

        private

        + +
        +
        + +
        + +
        +

        Store the window zoom factor. This should be a reduced fraction but for simplicity we will store all fractions with a numerator of 100.

        +

        private

        + +
        +
        + +
        + +
        +

        Substitute an Excel cell reference in A1 notation for zero based row and column values in an argument list.

        +

        Ex: ("A4", "Hello") is converted to (3, 0, "Hello").

        +

        private

        +
        Parameters:
        + + +
        string$cellThe cell reference. Or range of cells.
        +
        +
        +
        Returns:
        array
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_writeUrlExternal (row1,
        col1,
        row2,
        col2,
        url,
        str,
        format = null 
        )
        +
        +
        +

        Write links to external directory names such as 'c:.xls', c:.xls::Sheet1!A1', '../../foo.xls'. and '../../foo.xls::Sheet1!A1'.

        +

        Note: Excel writes some relative links with the $dir_long string. We ignore these cases for the sake of simpler code.

        +

        private

        +
        See also:
        writeUrl()
        +
        Parameters:
        + + + + + + + + +
        integer$row1Start row
        integer$col1Start column
        integer$row2End row
        integer$col2End column
        string$urlURL string
        string$strAlternative label
        mixed$formatThe cell format
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_writeUrlInternal (row1,
        col1,
        row2,
        col2,
        url,
        str,
        format = null 
        )
        +
        +
        +

        Used to write internal reference hyperlinks such as "Sheet1!A1".

        +

        private

        +
        See also:
        writeUrl()
        +
        Parameters:
        + + + + + + + + +
        integer$row1Start row
        integer$col1Start column
        integer$row2End row
        integer$col2End column
        string$urlURL string
        string$strAlternative label
        mixed$formatThe cell format
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_writeUrlRange (row1,
        col1,
        row2,
        col2,
        url,
        string = '',
        format = null 
        )
        +
        +
        +

        This is the more general form of writeUrl(). It allows a hyperlink to be written to a range of cells. This function also decides the type of hyperlink to be written. These are either, Web (http, ftp, mailto), Internal (Sheet1!A1) or external ('c:.xls::Sheet1!A1').

        +

        private

        +
        See also:
        writeUrl()
        +
        Parameters:
        + + + + + + + + +
        integer$row1Start row
        integer$col1Start column
        integer$row2End row
        integer$col2End column
        string$urlURL string
        string$stringAlternative label
        mixed$formatThe cell format
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_writeUrlWeb (row1,
        col1,
        row2,
        col2,
        url,
        str,
        format = null 
        )
        +
        +
        +

        Used to write http, ftp and mailto hyperlinks. The link type ($options) is 0x03 is the same as absolute dir ref without sheet. However it is differentiated by the $unknown2 data stream.

        +

        private

        +
        See also:
        writeUrl()
        +
        Parameters:
        + + + + + + + + +
        integer$row1Start row
        integer$col1Start column
        integer$row2End row
        integer$col2End column
        string$urlURL string
        string$strAlternative label
        mixed$formatThe cell format
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::_XF (&$ format)
        +
        +
        +

        Returns an index to the XF record in the workbook

        +

        private

        +
        Parameters:
        + + +
        mixed&$formatThe optional XF format
        +
        +
        +
        Returns:
        integer The XF record index
        + +
        +
        + +
        + +
        +

        Set this worksheet as the active worksheet, i.e. the worksheet that is displayed when the workbook is opened. Also set it as selected.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::centerHorizontally (center = 1)
        +
        +
        +

        Center the page horinzontally.

        +

        public

        +
        Parameters:
        + + +
        integer$centerthe optional value for centering. Defaults to 1 (center).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::centerVertically (center = 1)
        +
        +
        +

        Center the page vertically.

        +

        public

        +
        Parameters:
        + + +
        integer$centerthe optional value for centering. Defaults to 1 (center).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::close (sheetnames)
        +
        +
        +

        Add data to the beginning of the workbook (note the reverse order) and to the end of the workbook.

        +

        public

        +
        See also:
        Spreadsheet_Excel_Writer_Workbook::storeWorkbook()
        +
        Parameters:
        + + +
        array$sheetnamesThe array of sheetnames from the Workbook this worksheet belongs to
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::fitToPages (width,
        height 
        )
        +
        +
        +

        Set the vertical and horizontal number of pages that will define the maximum area printed. It doesn't seem to work with OpenOffice.

        +

        public

        +
        Parameters:
        + + + +
        integer$widthMaximun width of printed area in pages
        integer$heightMaximun heigth of printed area in pages
        +
        +
        +
        See also:
        setPrintScale()
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::freezePanes (panes)
        +
        +
        +

        Set panes and mark them as frozen.

        +

        public

        +
        Parameters:
        + + +
        array$panesThis is the only parameter received and is composed of the following: 0 => Vertical split position, 1 => Horizontal split position 2 => Top row visible 3 => Leftmost column visible 4 => Active pane
        +
        +
        + +
        +
        + +
        + +
        +

        Retrieves data from memory in one chunk, or from disk in $buffer sized chunks.

        +
        Returns:
        string The data
        + +
        +
        + +
        + +
        +

        Retrieve the worksheet name. This is usefull when creating worksheets without a name.

        +

        public

        +
        Returns:
        string The worksheet's name
        + +
        +
        + +
        + +
        +

        Set the option to hide gridlines on the printed page.

        +

        public

        + +
        +
        + +
        + +
        +

        Set the option to hide gridlines on the worksheet (as seen on the screen).

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::insertBitmap (row,
        col,
        bitmap,
        x = 0,
        y = 0,
        scale_x = 1,
        scale_y = 1 
        )
        +
        +
        +

        Insert a 24bit bitmap image in a worksheet.

        +

        public

        +
        Parameters:
        + + + + + + + + +
        integer$rowThe row we are going to insert the bitmap into
        integer$colThe column we are going to insert the bitmap into
        string$bitmapThe bitmap filename
        integer$xThe horizontal position (offset) of the image inside the cell.
        integer$yThe vertical position (offset) of the image inside the cell.
        integer$scale_xThe horizontal scale
        integer$scale_yThe vertical scale
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::mergeCells (first_row,
        first_col,
        last_row,
        last_col 
        )
        +
        +
        +

        Merges the area given by its arguments. This is an Excel97/2000 method. It is required to perform more complicated merging than the normal setAlign('merge').

        +

        public

        +
        Parameters:
        + + + + + +
        integer$first_rowFirst row of the area to merge
        integer$first_colFirst column of the area to merge
        integer$last_rowLast row of the area to merge
        integer$last_colLast column of the area to merge
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::printArea (first_row,
        first_col,
        last_row,
        last_col 
        )
        +
        +
        +

        Set the area of each worksheet that will be printed.

        +

        public

        +
        Parameters:
        + + + + + +
        integer$first_rowFirst row of the area to print
        integer$first_colFirst column of the area to print
        integer$last_rowLast row of the area to print
        integer$last_colLast column of the area to print
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::printRowColHeaders (print = 1)
        +
        +
        +

        Set the option to print the row and column headers on the printed page.

        +

        public

        +
        Parameters:
        + + +
        integer$printWhether to print the headers or not. Defaults to 1 (print).
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::protect (password)
        +
        +
        +

        Set the worksheet protection flag to prevent accidental modification and to hide formulas if the locked and hidden format properties have been set.

        +

        public

        +
        Parameters:
        + + +
        string$passwordThe password to use for protecting the sheet.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::repeatColumns (first_col,
        last_col = null 
        )
        +
        +
        +

        Set the columns to repeat at the left hand side of each printed page.

        +

        public

        +
        Parameters:
        + + + +
        integer$first_colFirst column to repeat
        integer$last_colLast column to repeat. Optional.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::repeatRows (first_row,
        last_row = null 
        )
        +
        +
        +

        Set the rows to repeat at the top of each printed page.

        +

        public

        +
        Parameters:
        + + + +
        integer$first_rowFirst row to repeat
        integer$last_rowLast row to repeat. Optional.
        +
        +
        + +
        +
        + +
        + +
        +

        Set this worksheet as a selected worksheet, i.e. the worksheet has its tab highlighted.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setColumn (firstcol,
        lastcol,
        width,
        format = null,
        hidden = 0,
        level = 0 
        )
        +
        +
        +

        Set the width of a single column or a range of columns.

        +

        public

        +
        Parameters:
        + + + + + + + +
        integer$firstcolfirst column on the range
        integer$lastcollast column on the range
        integer$widthwidth to set
        mixed$formatThe optional XF format to apply to the columns
        integer$hiddenThe optional hidden atribute
        integer$levelThe optional outline level
        +
        +
        + +
        +
        + +
        + +
        +

        Set this worksheet as the first visible sheet. This is necessary when there are a large number of worksheets and the activated worksheet is not visible on the screen.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setFooter (string,
        margin = 0.50 
        )
        +
        +
        +

        Set the page footer caption and optional margin.

        +

        public

        +
        Parameters:
        + + + +
        string$stringThe footer text
        float$marginoptional foot margin in inches.
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setHeader (string,
        margin = 0.50 
        )
        +
        +
        +

        Set the page header caption and optional margin.

        +

        public

        +
        Parameters:
        + + + +
        string$stringThe header text
        float$marginoptional head margin in inches.
        +
        +
        + +
        +
        + +
        + +
        +

        Store the horizontal page breaks on a worksheet (for printing). The breaks represent the row after which the break is inserted.

        +

        public

        +
        Parameters:
        + + +
        array$breaksArray containing the horizontal page breaks
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setInputEncoding (encoding)
        +
        +
        +

        Sets Input Encoding for writing strings

        +

        public

        +
        Parameters:
        + + +
        string$encodingThe encoding. Ex: 'UTF-16LE', 'utf-8', 'ISO-859-7'
        +
        +
        + +
        +
        + +
        + +
        +

        Set the page orientation as landscape.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMarginBottom (margin = 1.00)
        +
        +
        +

        Set the bottom margin in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMarginLeft (margin = 0.75)
        +
        +
        +

        Set the left margin in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMarginRight (margin = 0.75)
        +
        +
        +

        Set the right margin in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMargins (margin)
        +
        +
        +

        Set all the page margins to the same value in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMargins_LR (margin)
        +
        +
        +

        Set the left and right margins to the same value in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMargins_TB (margin)
        +
        +
        +

        Set the top and bottom margins to the same value in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMarginTop (margin = 1.00)
        +
        +
        +

        Set the top margin in inches.

        +

        public

        +
        Parameters:
        + + +
        float$marginThe margin to set in inches
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setMerge (first_row,
        first_col,
        last_row,
        last_col 
        )
        +
        +
        +

        Sets a merged cell range

        +

        public

        +
        Parameters:
        + + + + + +
        integer$first_rowFirst row of the area to merge
        integer$first_colFirst column of the area to merge
        integer$last_rowLast row of the area to merge
        integer$last_colLast column of the area to merge
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setOutline (visible = true,
        symbols_below = true,
        symbols_right = true,
        auto_style = false 
        )
        +
        +
        +

        This method sets the properties for outlining and grouping. The defaults correspond to Excel's defaults.

        +
        Parameters:
        + + + + + +
        bool$visible
        bool$symbols_below
        bool$symbols_right
        bool$auto_style
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setPaper (size = 0)
        +
        +
        +

        Set the paper type. Ex. 1 = US Letter, 9 = A4

        +

        public

        +
        Parameters:
        + + +
        integer$sizeThe type of paper size to use
        +
        +
        + +
        +
        + +
        + +
        +

        Set the page orientation as portrait.

        +

        public

        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setPrintScale (scale = 100)
        +
        +
        +

        Set the scale factor for the printed page. It turns off the "fit to page" option

        +

        public

        +
        Parameters:
        + + +
        integer$scaleThe optional scale factor. Defaults to 100
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setRow (row,
        height,
        format = null,
        hidden = false,
        level = 0 
        )
        +
        +
        +

        This method is used to set the height and format for a row.

        +

        public

        +
        Parameters:
        + + + + + + +
        integer$rowThe row to set
        integer$heightHeight we are giving to the row. Use null to set XF without setting height
        mixed$formatXF format we are giving to the row
        bool$hiddenThe optional hidden attribute
        integer$levelThe optional outline level for row, in range [0,7]
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setSelection (first_row,
        first_column,
        last_row,
        last_column 
        )
        +
        +
        +

        Set which cell or cells are selected in a worksheet

        +

        public

        +
        Parameters:
        + + + + + +
        integer$first_rowfirst row in the selected quadrant
        integer$first_columnfirst column in the selected quadrant
        integer$last_rowlast row in the selected quadrant
        integer$last_columnlast column in the selected quadrant
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setValidation (row1,
        col1,
        row2,
        col2,
        &$ validator 
        )
        +
        +
        +

        FIXME: add comments

        + +
        +
        + +
        + +
        +

        Store the vertical page breaks on a worksheet (for printing). The breaks represent the column after which the break is inserted.

        +

        public

        +
        Parameters:
        + + +
        array$breaksArray containing the vertical page breaks
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::setZoom (scale = 100)
        +
        +
        +

        Set the worksheet zoom factor.

        +

        public

        +
        Parameters:
        + + +
        integer$scaleThe zoom factor
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::Spreadsheet_Excel_Writer_Worksheet (BIFF_version,
        name,
        index,
        &$ activesheet,
        &$ firstsheet,
        &$ str_total,
        &$ str_unique,
        &$ str_table,
        &$ url_format,
        &$ parser,
        tmp_dir 
        )
        +
        +
        +

        Constructor

        +
        Parameters:
        + + + + + + + + +
        string$nameThe name of the new worksheet
        integer$indexThe index of the new worksheet
        mixed&$activesheetThe current activesheet of the workbook we belong to
        mixed&$firstsheetThe first worksheet in the workbook we belong to
        mixed&$url_formatThe default format for hyperlinks
        mixed&$parserThe formula parser created for the Workbook
        string$tmp_dirThe path to the directory for temporary files private
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::thawPanes (panes)
        +
        +
        +

        Set panes and mark them as unfrozen.

        +

        public

        +
        Parameters:
        + + +
        array$panesThis is the only parameter received and is composed of the following: 0 => Vertical split position, 1 => Horizontal split position 2 => Top row visible 3 => Leftmost column visible 4 => Active pane
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::write (row,
        col,
        token,
        format = null 
        )
        +
        +
        +

        Map to the appropriate write method acording to the token recieved.

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowThe row of the cell we are writing to
        integer$colThe column of the cell we are writing to
        mixed$tokenWhat we are writing
        mixed$formatThe optional format to apply to the cell
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeBlank (row,
        col,
        format 
        )
        +
        +
        +

        Write a blank cell to the specified row and column (zero indexed). A blank cell is used to specify formatting without adding a string or a number.

        +

        A blank cell without a format serves no purpose. Therefore, we don't write a BLANK record unless a format is specified.

        +

        Returns 0 : normal termination (including no format) -1 : insufficient number of arguments -2 : row or column out of range

        +

        public

        +
        Parameters:
        + + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        mixed$formatThe XF format
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeCol (row,
        col,
        val,
        format = null 
        )
        +
        +
        +

        Write an array of values as a column

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowThe first row (uppermost row) we are writing to
        integer$colThe col we are writing to
        array$valThe array of values to write
        mixed$formatThe optional format to apply to the cell
        +
        +
        +
        Returns:
        mixed PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeFormula (row,
        col,
        formula,
        format = null 
        )
        +
        +
        +

        Write a formula to the specified row and column (zero indexed). The textual representation of the formula is passed to the parser in Parser.php which returns a packed binary string.

        +

        Returns 0 : normal termination -1 : formula errors (bad formula) -2 : row or column out of range

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        string$formulaThe formula text string
        mixed$formatThe optional XF format
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeNote (row,
        col,
        note 
        )
        +
        +
        +

        Writes a note associated with the cell given by the row and column. NOTE records don't have a length limit.

        +

        public

        +
        Parameters:
        + + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        string$noteThe note to write
        +
        +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeNumber (row,
        col,
        num,
        format = null 
        )
        +
        +
        +

        Write a double to the specified row and column (zero indexed). An integer can be written as a double. Excel will display an integer. $format is optional.

        +

        Returns 0 : normal termination -2 : row or column out of range

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        float$numThe number to write
        mixed$formatThe optional XF format
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeRow (row,
        col,
        val,
        format = null 
        )
        +
        +
        +

        Write an array of values as a row

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowThe row we are writing to
        integer$colThe first col (leftmost col) we are writing to
        array$valThe array of values to write
        mixed$formatThe optional format to apply to the cell
        +
        +
        +
        Returns:
        mixed PEAR_Error on failure
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeString (row,
        col,
        str,
        format = null 
        )
        +
        +
        +

        Write a string to the specified row and column (zero indexed). NOTE: there is an Excel 5 defined limit of 255 characters. $format is optional. Returns 0 : normal termination -2 : row or column out of range -3 : long string truncated to 255 chars

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        string$strThe string to write
        mixed$formatThe XF format for the cell
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeStringBIFF8 (row,
        col,
        str,
        format = null 
        )
        +
        +
        +

        Write a string to the specified row and column (zero indexed). This is the BIFF8 version (no 255 chars limit). $format is optional. Returns 0 : normal termination -2 : row or column out of range -3 : long string truncated to 255 chars

        +

        public

        +
        Parameters:
        + + + + + +
        integer$rowZero indexed row
        integer$colZero indexed column
        string$strThe string to write
        mixed$formatThe XF format for the cell
        +
        +
        +
        Returns:
        integer
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Spreadsheet_Excel_Writer_Worksheet::writeUrl (row,
        col,
        url,
        string = '',
        format = null 
        )
        +
        +
        +

        Write a hyperlink. This is comprised of two elements: the visible label and the invisible link. The visible label is the same as the link unless an alternative string is specified. The label is written using the writeString() method. Therefore the 255 characters string limit applies. $string and $format are optional.

        +

        The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external directory url.

        +

        Returns 0 : normal termination -2 : row or column out of range -3 : long string truncated to 255 chars

        +

        public

        +
        Parameters:
        + + + + + + +
        integer$rowRow
        integer$colColumn
        string$urlURL string
        string$stringAlternative label
        mixed$formatThe cell format
        +
        +
        +
        Returns:
        integer
        + +
        +
        +

        Member Data Documentation

        + +
        +
        + + + + +
        Spreadsheet_Excel_Writer_Worksheet::$data
        +
        +
        +Initial value:
         pack("vvvv", $row1, $row2, $col1, $col2) .
        +                          $unknown1     .
        +                          $link_type    .
        +                          $unknown2     .
        +                          $up_count     .
        +                          $dir_short_len.
        +                          $dir_short    .
        +                          $unknown3     .
        +                          $stream_len
        +
        +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Worksheet.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet.png b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet.png new file mode 100644 index 000000000..82bc879e8 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_spreadsheet___excel___writer___worksheet.png differ diff --git a/documentation/doxy/output/fannie/html/class_suspension-members.html b/documentation/doxy/output/fannie/html/class_suspension-members.html new file mode 100644 index 000000000..aff98620b --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_suspension-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        Suspension Member List
        +
        +
        +This is the complete list of members for Suspension, including all inherited members. + + + + + + + +
        db() (defined in MemberModule)MemberModule
        GetSearchResults() (defined in MemberModule)MemberModule
        HasSearch() (defined in MemberModule)MemberModule
        RunCron() (defined in MemberModule)MemberModule
        SaveFormData($memNum) (defined in MemberModule)MemberModule
        ShowEditForm($memNum) (defined in Suspension)Suspension
        ShowSearchForm() (defined in MemberModule)MemberModule
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_suspension.html b/documentation/doxy/output/fannie/html/class_suspension.html new file mode 100644 index 000000000..87e84e4d4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_suspension.html @@ -0,0 +1,117 @@ + + + + + +CORE POS - Fannie: Suspension Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        Suspension Class Reference
        +
        +
        +
        +Inheritance diagram for Suspension:
        +
        +
        + + +MemberModule + +
        + +

        List of all members.

        + + + +

        +Public Member Functions

        ShowEditForm ($memNum)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/mem/modules/Suspension.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_suspension.png b/documentation/doxy/output/fannie/html/class_suspension.png new file mode 100644 index 000000000..df757cad6 Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_suspension.png differ diff --git a/documentation/doxy/output/fannie/html/class_update_obj-members.html b/documentation/doxy/output/fannie/html/class_update_obj-members.html new file mode 100644 index 000000000..d39863024 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_update_obj-members.html @@ -0,0 +1,105 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        UpdateObj Member List
        +
        +
        +This is the complete list of members for UpdateObj, including all inherited members. + + + + + + + + + +
        $author (defined in UpdateObj)UpdateObj [protected]
        $description (defined in UpdateObj)UpdateObj [protected]
        $queries (defined in UpdateObj)UpdateObj [protected]
        $timestamp (defined in UpdateObj)UpdateObj [protected]
        ApplyUpdates() (defined in UpdateObj)UpdateObj
        CheckStatus() (defined in UpdateObj)UpdateObj
        HtmlInfo() (defined in UpdateObj)UpdateObj
        HtmlQueries() (defined in UpdateObj)UpdateObj
        SetStatus($st) (defined in UpdateObj)UpdateObj
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_update_obj.html b/documentation/doxy/output/fannie/html/class_update_obj.html new file mode 100644 index 000000000..dc902c75a --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_update_obj.html @@ -0,0 +1,154 @@ + + + + + +CORE POS - Fannie: UpdateObj Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        UpdateObj Class Reference
        +
        +
        +
        +Inheritance diagram for UpdateObj:
        +
        +
        + + +update_20120412114913 + +
        + +

        List of all members.

        + + + + + + + + + + + + +

        +Public Member Functions

        HtmlInfo ()
        HtmlQueries ()
        ApplyUpdates ()
        CheckStatus ()
        SetStatus ($st)

        +Protected Attributes

        $timestamp = 'YYYYMMDDHHMMSS'
        $description = 'Describe what your update does'
        $author = 'Say who you are'
         $queries
        +

        Member Data Documentation

        + +
        +
        + + + + +
        UpdateObj::$queries [protected]
        +
        +
        +Initial value:
         array(
        +                'op' => array(),
        +                'trans' => array(),
        +                'archive' => array()
        +        )
        +
        +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/install/updates/Update.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_update_obj.png b/documentation/doxy/output/fannie/html/class_update_obj.png new file mode 100644 index 000000000..09f9e6dcf Binary files /dev/null and b/documentation/doxy/output/fannie/html/class_update_obj.png differ diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___narrow___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_w_f_c___narrow___p_d_f-members.html new file mode 100644 index 000000000..7f6fd6f8a --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___narrow___p_d_f-members.html @@ -0,0 +1,101 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        WFC_Narrow_PDF Member List
        +
        +
        +This is the complete list of members for WFC_Narrow_PDF, including all inherited members. + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in WFC_Narrow_PDF)WFC_Narrow_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Narrow_PDF)WFC_Narrow_PDF
        GetCheckDigit($barcode) (defined in WFC_Narrow_PDF)WFC_Narrow_PDF
        TestCheckDigit($barcode) (defined in WFC_Narrow_PDF)WFC_Narrow_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Narrow_PDF)WFC_Narrow_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___narrow___p_d_f.html b/documentation/doxy/output/fannie/html/class_w_f_c___narrow___p_d_f.html new file mode 100644 index 000000000..b546a5430 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___narrow___p_d_f.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: WFC_Narrow_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        WFC_Narrow_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/WFC_Narrow.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___new___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_w_f_c___new___p_d_f-members.html new file mode 100644 index 000000000..f07fd364d --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___new___p_d_f-members.html @@ -0,0 +1,103 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        WFC_New_PDF Member List
        +
        +
        +This is the complete list of members for WFC_New_PDF, including all inherited members. + + + + + + + +
        $tagdate (defined in WFC_New_PDF)WFC_New_PDF
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in WFC_New_PDF)WFC_New_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_New_PDF)WFC_New_PDF
        GetCheckDigit($barcode) (defined in WFC_New_PDF)WFC_New_PDF
        setTagDate($str) (defined in WFC_New_PDF)WFC_New_PDF
        TestCheckDigit($barcode) (defined in WFC_New_PDF)WFC_New_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_New_PDF)WFC_New_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___new___p_d_f.html b/documentation/doxy/output/fannie/html/class_w_f_c___new___p_d_f.html new file mode 100644 index 000000000..d753fe8ad --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___new___p_d_f.html @@ -0,0 +1,123 @@ + + + + + +CORE POS - Fannie: WFC_New_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        WFC_New_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + +

        +Public Member Functions

        setTagDate ($str)
        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)

        +Public Attributes

        $tagdate
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/WFC_New.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___old___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_w_f_c___old___p_d_f-members.html new file mode 100644 index 000000000..b0da03fdd --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___old___p_d_f-members.html @@ -0,0 +1,101 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        WFC_Old_PDF Member List
        +
        +
        +This is the complete list of members for WFC_Old_PDF, including all inherited members. + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in WFC_Old_PDF)WFC_Old_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Old_PDF)WFC_Old_PDF
        GetCheckDigit($barcode) (defined in WFC_Old_PDF)WFC_Old_PDF
        TestCheckDigit($barcode) (defined in WFC_Old_PDF)WFC_Old_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Old_PDF)WFC_Old_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___old___p_d_f.html b/documentation/doxy/output/fannie/html/class_w_f_c___old___p_d_f.html new file mode 100644 index 000000000..96e330149 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___old___p_d_f.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: WFC_Old_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        WFC_Old_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/WFC_Old.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___standard___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_w_f_c___standard___p_d_f-members.html new file mode 100644 index 000000000..4f3b0da03 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___standard___p_d_f-members.html @@ -0,0 +1,106 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        WFC_Standard_PDF Member List
        +
        +
        +This is the complete list of members for WFC_Standard_PDF, including all inherited members. + + + + + + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        GetCheckDigit($barcode) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        GetCheckDigit($barcode) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        TestCheckDigit($barcode) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        TestCheckDigit($barcode) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Standard_PDF)WFC_Standard_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___standard___p_d_f.html b/documentation/doxy/output/fannie/html/class_w_f_c___standard___p_d_f.html new file mode 100644 index 000000000..1d08223b4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___standard___p_d_f.html @@ -0,0 +1,127 @@ + + + + + +CORE POS - Fannie: WFC_Standard_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        WFC_Standard_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following files:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/WFC_Standard.php
        • +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/barcodepdf.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___windows___p_d_f-members.html b/documentation/doxy/output/fannie/html/class_w_f_c___windows___p_d_f-members.html new file mode 100644 index 000000000..2f56b0c6f --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___windows___p_d_f-members.html @@ -0,0 +1,101 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        WFC_Windows_PDF Member List
        +
        +
        +This is the complete list of members for WFC_Windows_PDF, including all inherited members. + + + + + +
        Barcode($x, $y, $barcode, $h, $w, $len) (defined in WFC_Windows_PDF)WFC_Windows_PDF
        EAN13($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Windows_PDF)WFC_Windows_PDF
        GetCheckDigit($barcode) (defined in WFC_Windows_PDF)WFC_Windows_PDF
        TestCheckDigit($barcode) (defined in WFC_Windows_PDF)WFC_Windows_PDF
        UPC_A($x, $y, $barcode, $h=16, $w=.35) (defined in WFC_Windows_PDF)WFC_Windows_PDF
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/class_w_f_c___windows___p_d_f.html b/documentation/doxy/output/fannie/html/class_w_f_c___windows___p_d_f.html new file mode 100644 index 000000000..23bff2bdb --- /dev/null +++ b/documentation/doxy/output/fannie/html/class_w_f_c___windows___p_d_f.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: WFC_Windows_PDF Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        WFC_Windows_PDF Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        EAN13 ($x, $y, $barcode, $h=16, $w=.35)
        UPC_A ($x, $y, $barcode, $h=16, $w=.35)
        GetCheckDigit ($barcode)
        TestCheckDigit ($barcode)
        Barcode ($x, $y, $barcode, $h, $w, $len)
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/admin/labels/pdf_layouts/WFC_Windows.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classchained_selectors-members.html b/documentation/doxy/output/fannie/html/classchained_selectors-members.html new file mode 100644 index 000000000..49d317c86 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classchained_selectors-members.html @@ -0,0 +1,105 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        chainedSelectors Member List
        +
        +
        +This is the complete list of members for chainedSelectors, including all inherited members. + + + + + + + + + +
        $data (defined in chainedSelectors)chainedSelectors
        $longestTargetChoice (defined in chainedSelectors)chainedSelectors
        $maxTargetChoices (defined in chainedSelectors)chainedSelectors
        $names (defined in chainedSelectors)chainedSelectors
        $uniqueChoices (defined in chainedSelectors)chainedSelectors
        chainedSelectors($names, $data) (defined in chainedSelectors)chainedSelectors
        initialize() (defined in chainedSelectors)chainedSelectors
        printSelectors($item_selected) (defined in chainedSelectors)chainedSelectors
        printUpdateFunction($selected_item) (defined in chainedSelectors)chainedSelectors
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classchained_selectors.html b/documentation/doxy/output/fannie/html/classchained_selectors.html new file mode 100644 index 000000000..b5e9c0886 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classchained_selectors.html @@ -0,0 +1,127 @@ + + + + + +CORE POS - Fannie: chainedSelectors Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        chainedSelectors Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + +

        +Public Member Functions

        chainedSelectors ($names, $data)
        printUpdateFunction ($selected_item)
        printSelectors ($item_selected)
        initialize ()

        +Public Attributes

        $names
        $data
        $uniqueChoices
        $maxTargetChoices
        $longestTargetChoice
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/chainedSelectors.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classcl__wrapper-members.html b/documentation/doxy/output/fannie/html/classcl__wrapper-members.html new file mode 100644 index 000000000..5485c3a48 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classcl__wrapper-members.html @@ -0,0 +1,100 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        cl_wrapper Member List
        +
        +
        +This is the complete list of members for cl_wrapper, including all inherited members. + + + + +
        $CL (defined in cl_wrapper)cl_wrapper
        cl_wrapper() (defined in cl_wrapper)cl_wrapper
        get($k) (defined in cl_wrapper)cl_wrapper
        set($k, $v) (defined in cl_wrapper)cl_wrapper
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classcl__wrapper.html b/documentation/doxy/output/fannie/html/classcl__wrapper.html new file mode 100644 index 000000000..6d983dd81 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classcl__wrapper.html @@ -0,0 +1,117 @@ + + + + + +CORE POS - Fannie: cl_wrapper Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        cl_wrapper Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + +

        +Public Member Functions

        cl_wrapper ()
        get ($k)
        set ($k, $v)

        +Public Attributes

        $CL
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/install/lane_config/ini.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classes.html b/documentation/doxy/output/fannie/html/classes.html new file mode 100644 index 000000000..5d3c35490 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classes.html @@ -0,0 +1,46 @@ + + +CORE POS - Fannie: Alphabetical List + + + + +
        +
        + +

        CORE POS - Fannie Class Index

        B | D | F | L | P | S

        + +
          B  
        +
          F  
        +
        FanniePage   LabelPDF   
          S  
        +
        BarcodePDF   FannieCron   FannieReport   
          P  
        +
        Spreadsheet_Excel_Reader   
          D  
        +
        FannieFunctions   FileFormats   PrintShelftags   SQLManager   
        DatabaseFunctions   FannieModule   
          L  
        +

        B | D | F | L | P | S

        +


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/classupdate__20120412114913-members.html b/documentation/doxy/output/fannie/html/classupdate__20120412114913-members.html new file mode 100644 index 000000000..a742d4f4c --- /dev/null +++ b/documentation/doxy/output/fannie/html/classupdate__20120412114913-members.html @@ -0,0 +1,105 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        update_20120412114913 Member List
        +
        +
        +This is the complete list of members for update_20120412114913, including all inherited members. + + + + + + + + + +
        $author (defined in update_20120412114913)update_20120412114913 [protected]
        $description (defined in update_20120412114913)update_20120412114913 [protected]
        $queries (defined in update_20120412114913)update_20120412114913 [protected]
        $timestamp (defined in update_20120412114913)update_20120412114913 [protected]
        ApplyUpdates() (defined in UpdateObj)UpdateObj
        CheckStatus() (defined in UpdateObj)UpdateObj
        HtmlInfo() (defined in UpdateObj)UpdateObj
        HtmlQueries() (defined in UpdateObj)UpdateObj
        SetStatus($st) (defined in UpdateObj)UpdateObj
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classupdate__20120412114913.html b/documentation/doxy/output/fannie/html/classupdate__20120412114913.html new file mode 100644 index 000000000..7765292b4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classupdate__20120412114913.html @@ -0,0 +1,141 @@ + + + + + +CORE POS - Fannie: update_20120412114913 Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        update_20120412114913 Class Reference
        +
        +
        +
        +Inheritance diagram for update_20120412114913:
        +
        +
        + + +UpdateObj + +
        + +

        List of all members.

        + + + + + + +

        +Protected Attributes

        $timestamp = '20120412114913'
         $description
        $author = 'Andy Theuninck (WFC)'
        $queries
        +

        Member Data Documentation

        + +
        +
        + + + + +
        update_20120412114913::$description [protected]
        +
        +
        +Initial value:
         'This update adds primary keys
        +to many operational database tables that currently have no primary key.
        +It also adds indexes to some of the tables.'
        +
        +

        Reimplemented from UpdateObj.

        + +
        +
        +
        The documentation for this class was generated from the following file:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/install/updates/20120412114913.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classupdate__20120412114913.png b/documentation/doxy/output/fannie/html/classupdate__20120412114913.png new file mode 100644 index 000000000..09b95db36 Binary files /dev/null and b/documentation/doxy/output/fannie/html/classupdate__20120412114913.png differ diff --git a/documentation/doxy/output/fannie/html/classxml_data-members.html b/documentation/doxy/output/fannie/html/classxml_data-members.html new file mode 100644 index 000000000..f54940f49 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classxml_data-members.html @@ -0,0 +1,116 @@ + + + + + +CORE POS - Fannie: Member List + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        +
        +
        xmlData Member List
        +
        +
        +This is the complete list of members for xmlData, including all inherited members. + + + + + + + + + + + + + + + + + + + + +
        $curTag (defined in xmlData)xmlData
        $DATA (defined in xmlData)xmlData
        $parser (defined in xmlData)xmlData
        $valid (defined in xmlData)xmlData
        array_dump() (defined in xmlData)xmlData
        array_dump() (defined in xmlData)xmlData
        endTag($parser, $name) (defined in xmlData)xmlData
        endTag($parser, $name) (defined in xmlData)xmlData
        get($tagname) (defined in xmlData)xmlData
        get($tagname) (defined in xmlData)xmlData
        get_first($tagname) (defined in xmlData)xmlData
        get_first($tagname) (defined in xmlData)xmlData
        isValid() (defined in xmlData)xmlData
        isValid() (defined in xmlData)xmlData
        startTag($parser, $name, $attr) (defined in xmlData)xmlData
        startTag($parser, $name, $attr) (defined in xmlData)xmlData
        tagData($parser, $data) (defined in xmlData)xmlData
        tagData($parser, $data) (defined in xmlData)xmlData
        xmlData($str) (defined in xmlData)xmlData
        xmlData($str) (defined in xmlData)xmlData
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/classxml_data.html b/documentation/doxy/output/fannie/html/classxml_data.html new file mode 100644 index 000000000..b973e4ab8 --- /dev/null +++ b/documentation/doxy/output/fannie/html/classxml_data.html @@ -0,0 +1,150 @@ + + + + + +CORE POS - Fannie: xmlData Class Reference + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + +
        +
        + +
        +
        xmlData Class Reference
        +
        +
        + +

        List of all members.

        + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        xmlData ($str)
        startTag ($parser, $name, $attr)
        endTag ($parser, $name)
        tagData ($parser, $data)
        get ($tagname)
        isValid ()
        get_first ($tagname)
        array_dump ()
        xmlData ($str)
        startTag ($parser, $name, $attr)
        endTag ($parser, $name)
        tagData ($parser, $data)
        get ($tagname)
        isValid ()
        get_first ($tagname)
        array_dump ()

        +Public Attributes

        $parser
        $DATA
        $curTag
        $valid
        +
        The documentation for this class was generated from the following files:
          +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/reports/Store-Specific/WFC/CCSettle/xmlData.php
        • +
        • C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/IS4C/fannie/src/xmlData.php
        • +
        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/closed.png b/documentation/doxy/output/fannie/html/closed.png new file mode 100644 index 000000000..b7d4bd9fe Binary files /dev/null and b/documentation/doxy/output/fannie/html/closed.png differ diff --git a/documentation/doxy/output/fannie/html/doxygen.css b/documentation/doxy/output/fannie/html/doxygen.css new file mode 100644 index 000000000..5d583694e --- /dev/null +++ b/documentation/doxy/output/fannie/html/doxygen.css @@ -0,0 +1,358 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.nav { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} +A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} +A.codeRef:link { font-weight: normal; color: #0000FF} +A.codeRef:visited { font-weight: normal; color: #0000FF} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { background: #e8eef2; + font-weight: bold; +} +HR { height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; +} +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eef3f5; + border-width: 1px; + border-style: solid; + border-color: #dedeee; + -moz-border-radius: 8px 8px 8px 8px; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #d5e1e8; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #84b0c7; + font-weight: bold; + -moz-border-radius: 8px 8px 8px 8px; +} +.paramkey { + text-align: right; +} +.paramtype { + white-space: nowrap; +} +.paramname { + color: #602020; + font-style: italic; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +.directory { font-size: 9pt; font-weight: bold; } +.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } +.directory > h3 { margin-top: 0; } +.directory p { margin: 0px; white-space: nowrap; } +.directory div { display: none; margin: 0px; } +.directory img { vertical-align: -30%; } + diff --git a/documentation/doxy/output/fannie/html/doxygen.png b/documentation/doxy/output/fannie/html/doxygen.png new file mode 100644 index 000000000..f0a274bba Binary files /dev/null and b/documentation/doxy/output/fannie/html/doxygen.png differ diff --git a/documentation/doxy/output/fannie/html/examples.html b/documentation/doxy/output/fannie/html/examples.html new file mode 100644 index 000000000..dfd6ef61d --- /dev/null +++ b/documentation/doxy/output/fannie/html/examples.html @@ -0,0 +1,37 @@ + + +CORE POS - Fannie: Examples + + + + +
        +
        +

        CORE POS - Fannie Examples

        Here is a list of all examples: +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/files.html b/documentation/doxy/output/fannie/html/files.html new file mode 100644 index 000000000..0cc1859ca --- /dev/null +++ b/documentation/doxy/output/fannie/html/files.html @@ -0,0 +1,42 @@ + + +CORE POS - Fannie: File Index + + + + +
        +
        + +

        CORE POS - Fannie File List

        Here is a list of all documented files with brief descriptions: + + + + + +
        fannie/class-lib/FannieFunctions.phpBase fannie functions
        fannie/class-lib/FanniePage.phpFunctions provided by FanniePage
        fannie/class-lib/FannieReport.phpFunctions provided by FannieReport
        fannie/class-lib/formats/FileFormats.phpProvides file manipulation functions
        fannie/src/select_dlog.php
        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/functions.html b/documentation/doxy/output/fannie/html/functions.html new file mode 100644 index 000000000..6c0ddf528 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions.html @@ -0,0 +1,183 @@ + + +CORE POS - Fannie: Class Members + + + + +
        +
        + +
        + +
        +
        + +
        + +

        +Here is a list of all documented class members with links to the class documentation for each member: +

        +

        - $ -

        +

        - a -

        +

        - b -

        +

        - c -

        +

        - d -

        +

        - e -

        +

        - f -

        +

        - g -

        +

        - h -

        +

        - i -

        +

        - j -

        +

        - l -

        +

        - m -

        +

        - n -

        +

        - o -

        +

        - p -

        +

        - q -

        +

        - r -

        +

        - s -

        +

        - t -

        +

        - w -

        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/functions_0x5f.html b/documentation/doxy/output/fannie/html/functions_0x5f.html new file mode 100644 index 000000000..c19c442f9 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x5f.html @@ -0,0 +1,481 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - _ -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x61.html b/documentation/doxy/output/fannie/html/functions_0x61.html new file mode 100644 index 000000000..d4d07ce83 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x61.html @@ -0,0 +1,153 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - a -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x63.html b/documentation/doxy/output/fannie/html/functions_0x63.html new file mode 100644 index 000000000..c26b328b2 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x63.html @@ -0,0 +1,152 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - c -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x64.html b/documentation/doxy/output/fannie/html/functions_0x64.html new file mode 100644 index 000000000..75e47b8db --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x64.html @@ -0,0 +1,138 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - d -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x65.html b/documentation/doxy/output/fannie/html/functions_0x65.html new file mode 100644 index 000000000..c28f169b7 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x65.html @@ -0,0 +1,132 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - e -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x66.html b/documentation/doxy/output/fannie/html/functions_0x66.html new file mode 100644 index 000000000..8da6fbca3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x66.html @@ -0,0 +1,150 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - f -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x67.html b/documentation/doxy/output/fannie/html/functions_0x67.html new file mode 100644 index 000000000..adacfa4e7 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x67.html @@ -0,0 +1,152 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - g -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x68.html b/documentation/doxy/output/fannie/html/functions_0x68.html new file mode 100644 index 000000000..54f807513 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x68.html @@ -0,0 +1,135 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - h -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x69.html b/documentation/doxy/output/fannie/html/functions_0x69.html new file mode 100644 index 000000000..dad5af2be --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x69.html @@ -0,0 +1,144 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - i -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x6c.html b/documentation/doxy/output/fannie/html/functions_0x6c.html new file mode 100644 index 000000000..17a1c0f0f --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x6c.html @@ -0,0 +1,132 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - l -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x6d.html b/documentation/doxy/output/fannie/html/functions_0x6d.html new file mode 100644 index 000000000..b243fe756 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x6d.html @@ -0,0 +1,132 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - m -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x6e.html b/documentation/doxy/output/fannie/html/functions_0x6e.html new file mode 100644 index 000000000..9ae342ae3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x6e.html @@ -0,0 +1,135 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - n -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x6f.html b/documentation/doxy/output/fannie/html/functions_0x6f.html new file mode 100644 index 000000000..f1baf8079 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x6f.html @@ -0,0 +1,141 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - o -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x70.html b/documentation/doxy/output/fannie/html/functions_0x70.html new file mode 100644 index 000000000..b27330cd8 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x70.html @@ -0,0 +1,141 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - p -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x71.html b/documentation/doxy/output/fannie/html/functions_0x71.html new file mode 100644 index 000000000..597624a40 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x71.html @@ -0,0 +1,132 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - q -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x72.html b/documentation/doxy/output/fannie/html/functions_0x72.html new file mode 100644 index 000000000..daf2346ba --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x72.html @@ -0,0 +1,139 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - r -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x73.html b/documentation/doxy/output/fannie/html/functions_0x73.html new file mode 100644 index 000000000..cd2bff3fb --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x73.html @@ -0,0 +1,393 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - s -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x74.html b/documentation/doxy/output/fannie/html/functions_0x74.html new file mode 100644 index 000000000..233c4518a --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x74.html @@ -0,0 +1,141 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - t -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_0x77.html b/documentation/doxy/output/fannie/html/functions_0x77.html new file mode 100644 index 000000000..785588053 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_0x77.html @@ -0,0 +1,162 @@ + + + + + +CORE POS - Fannie: Class Members + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +
        Here is a list of all documented class members with links to the class documentation for each member:
        + +

        - w -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func.html b/documentation/doxy/output/fannie/html/functions_func.html new file mode 100644 index 000000000..80664b54f --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func.html @@ -0,0 +1,176 @@ + + +CORE POS - Fannie: Class Members - Functions + + + + +
        +
        + +
        + +
        +
        + +
        + +

        +  +

        +

        - a -

        +

        - b -

        +

        - c -

        +

        - d -

        +

        - e -

        +

        - f -

        +

        - g -

        +

        - h -

        +

        - i -

        +

        - j -

        +

        - l -

        +

        - m -

        +

        - n -

        +

        - o -

        +

        - p -

        +

        - q -

        +

        - r -

        +

        - s -

        +

        - t -

        +

        - w -

        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x61.html b/documentation/doxy/output/fannie/html/functions_func_0x61.html new file mode 100644 index 000000000..54c249137 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x61.html @@ -0,0 +1,152 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - a -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x63.html b/documentation/doxy/output/fannie/html/functions_func_0x63.html new file mode 100644 index 000000000..d8ac9c848 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x63.html @@ -0,0 +1,151 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - c -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x64.html b/documentation/doxy/output/fannie/html/functions_func_0x64.html new file mode 100644 index 000000000..99f629b07 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x64.html @@ -0,0 +1,137 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - d -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x65.html b/documentation/doxy/output/fannie/html/functions_func_0x65.html new file mode 100644 index 000000000..482d7395e --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x65.html @@ -0,0 +1,131 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - e -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x66.html b/documentation/doxy/output/fannie/html/functions_func_0x66.html new file mode 100644 index 000000000..eeb0cf7b5 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x66.html @@ -0,0 +1,149 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - f -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x67.html b/documentation/doxy/output/fannie/html/functions_func_0x67.html new file mode 100644 index 000000000..1e16e4905 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x67.html @@ -0,0 +1,151 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - g -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x68.html b/documentation/doxy/output/fannie/html/functions_func_0x68.html new file mode 100644 index 000000000..18dccfde4 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x68.html @@ -0,0 +1,134 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - h -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x69.html b/documentation/doxy/output/fannie/html/functions_func_0x69.html new file mode 100644 index 000000000..ff9a66de8 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x69.html @@ -0,0 +1,143 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - i -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x6c.html b/documentation/doxy/output/fannie/html/functions_func_0x6c.html new file mode 100644 index 000000000..227590c62 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x6c.html @@ -0,0 +1,131 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - l -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x6d.html b/documentation/doxy/output/fannie/html/functions_func_0x6d.html new file mode 100644 index 000000000..13a3fa818 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x6d.html @@ -0,0 +1,131 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - m -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x6e.html b/documentation/doxy/output/fannie/html/functions_func_0x6e.html new file mode 100644 index 000000000..f62c0e509 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x6e.html @@ -0,0 +1,134 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - n -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x6f.html b/documentation/doxy/output/fannie/html/functions_func_0x6f.html new file mode 100644 index 000000000..4f868001c --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x6f.html @@ -0,0 +1,140 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - o -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x70.html b/documentation/doxy/output/fannie/html/functions_func_0x70.html new file mode 100644 index 000000000..4b61a8053 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x70.html @@ -0,0 +1,140 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - p -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x71.html b/documentation/doxy/output/fannie/html/functions_func_0x71.html new file mode 100644 index 000000000..b29eb9d66 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x71.html @@ -0,0 +1,131 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - q -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x72.html b/documentation/doxy/output/fannie/html/functions_func_0x72.html new file mode 100644 index 000000000..1ea5712a3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x72.html @@ -0,0 +1,138 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - r -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x73.html b/documentation/doxy/output/fannie/html/functions_func_0x73.html new file mode 100644 index 000000000..d7b81dc4f --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x73.html @@ -0,0 +1,392 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - s -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x74.html b/documentation/doxy/output/fannie/html/functions_func_0x74.html new file mode 100644 index 000000000..33d5ddba6 --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x74.html @@ -0,0 +1,140 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        +
        +  + +

        - t -

        +
        + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_func_0x77.html b/documentation/doxy/output/fannie/html/functions_func_0x77.html new file mode 100644 index 000000000..0c49e022e --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_func_0x77.html @@ -0,0 +1,161 @@ + + + + + +CORE POS - Fannie: Class Members - Functions + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + +
        +
        CORE POS - Fannie + +
        +
        The CORE POS back end
        +
        +
        + + + + + + + +
        + + + + + + + diff --git a/documentation/doxy/output/fannie/html/functions_vars.html b/documentation/doxy/output/fannie/html/functions_vars.html new file mode 100644 index 000000000..b6c656e1a --- /dev/null +++ b/documentation/doxy/output/fannie/html/functions_vars.html @@ -0,0 +1,52 @@ + + +CORE POS - Fannie: Class Members - Variables + + + + +
        +
        + +
        + +
        +  +

        +

        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/globals.html b/documentation/doxy/output/fannie/html/globals.html new file mode 100644 index 000000000..2ced8ef9f --- /dev/null +++ b/documentation/doxy/output/fannie/html/globals.html @@ -0,0 +1,61 @@ + + +CORE POS - Fannie: Class Members + + + + +
        +
        + +
        + +
        +Here is a list of all documented file members with links to the documentation: +

        +

        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/globals_func.html b/documentation/doxy/output/fannie/html/globals_func.html new file mode 100644 index 000000000..a43b06dfe --- /dev/null +++ b/documentation/doxy/output/fannie/html/globals_func.html @@ -0,0 +1,61 @@ + + +CORE POS - Fannie: Class Members + + + + +
        +
        + +
        + +
        +  +

        +

        +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/hierarchy.html b/documentation/doxy/output/fannie/html/hierarchy.html new file mode 100644 index 000000000..47d13310e --- /dev/null +++ b/documentation/doxy/output/fannie/html/hierarchy.html @@ -0,0 +1,55 @@ + + +CORE POS - Fannie: Hierarchical Index + + + + +
        +
        + +

        CORE POS - Fannie Class Hierarchy

        This inheritance list is sorted roughly, but not completely, alphabetically: +
        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/index.html b/documentation/doxy/output/fannie/html/index.html new file mode 100644 index 000000000..6677718bd --- /dev/null +++ b/documentation/doxy/output/fannie/html/index.html @@ -0,0 +1,32 @@ + + +CORE POS - Fannie: Main Page + + + + +
        +
        +

        CORE POS - Fannie Documentation

        +

        +


        Generated on Thu Apr 26 12:39:03 2012 for CORE POS - Fannie by  + +doxygen 1.4.7
        + + diff --git a/documentation/doxy/output/fannie/html/installdox b/documentation/doxy/output/fannie/html/installdox new file mode 100755 index 000000000..9b89fe025 --- /dev/null +++ b/documentation/doxy/output/fannie/html/installdox @@ -0,0 +1,117 @@ +#!/usr/bin/perl + +%subst = ( ); +$quiet = 0; + +if (open(F,"search.cfg")) +{ + $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; + $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; +} + +while ( @ARGV ) { + $_ = shift @ARGV; + if ( s/^-// ) { + if ( /^l(.*)/ ) { + $v = ($1 eq "") ? shift @ARGV : $1; + ($v =~ /\/$/) || ($v .= "/"); + $_ = $v; + if ( /(.+)\@(.+)/ ) { + if ( exists $subst{$1} ) { + $subst{$1} = $2; + } else { + print STDERR "Unknown tag file $1 given with option -l\n"; + &usage(); + } + } else { + print STDERR "Argument $_ is invalid for option -l\n"; + &usage(); + } + } + elsif ( /^q/ ) { + $quiet = 1; + } + elsif ( /^\?|^h/ ) { + &usage(); + } + else { + print STDERR "Illegal option -$_\n"; + &usage(); + } + } + else { + push (@files, $_ ); + } +} + +foreach $sub (keys %subst) +{ + if ( $subst{$sub} eq "" ) + { + print STDERR "No substitute given for tag file `$sub'\n"; + &usage(); + } + elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) + { + print "Substituting $subst{$sub} for each occurence of tag file $sub\n"; + } +} + +if ( ! @files ) { + if (opendir(D,".")) { + foreach $file ( readdir(D) ) { + $match = ".html"; + next if ( $file =~ /^\.\.?$/ ); + ($file =~ /$match/) && (push @files, $file); + ($file =~ "tree.js") && (push @files, $file); + } + closedir(D); + } +} + +if ( ! @files ) { + print STDERR "Warning: No input files given and none found!\n"; +} + +foreach $f (@files) +{ + if ( ! $quiet ) { + print "Editing: $f...\n"; + } + $oldf = $f; + $f .= ".bak"; + unless (rename $oldf,$f) { + print STDERR "Error: cannot rename file $oldf\n"; + exit 1; + } + if (open(F,"<$f")) { + unless (open(G,">$oldf")) { + print STDERR "Error: opening file $oldf for writing\n"; + exit 1; + } + if ($oldf ne "tree.js") { + while () { + s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; + print G "$_"; + } + } + else { + while () { + s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; + print G "$_"; + } + } + } + else { + print STDERR "Warning file $f does not exist\n"; + } + unlink $f; +} + +sub usage { + print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; + print STDERR "Options:\n"; + print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; + print STDERR " -q Quiet mode\n\n"; + exit 1; +} diff --git a/documentation/doxy/output/fannie/html/jquery.js b/documentation/doxy/output/fannie/html/jquery.js new file mode 100644 index 000000000..90b3a2bc3 --- /dev/null +++ b/documentation/doxy/output/fannie/html/jquery.js @@ -0,0 +1,64 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
        "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
        ","
        "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

        ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
        ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0) +{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
        ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function() +{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
        ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); + +/* + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('"; + break; + case 'poll2': + echo "
        ";
        +			$this->Poll($pollsecs);
        +			break;
        +		
        +		case 'dosql':
        +			if (!$allowsql) break;
        +			
        +			$this->DoSQLForm();
        +			break;
        +		case 'viewsql':
        +			if (empty($_GET['hidem']))
        +				echo "  Clear SQL Log
        "; + echo($this->SuspiciousSQL($nsql)); + echo($this->ExpensiveSQL($nsql)); + echo($this->InvalidSQL($nsql)); + break; + case 'tables': + echo $this->Tables(); break; + } + global $ADODB_vers; + echo "

        $ADODB_vers Sponsored by phpLens
        "; + } + + /* + Runs in infinite loop, returning real-time statistics + */ + function Poll($secs=5) + { + $this->conn->fnExecute = false; + //$this->conn->debug=1; + if ($secs <= 1) $secs = 1; + echo "Accumulating statistics, every $secs seconds...\n";flush(); + $arro = $this->PollParameters(); + $cnt = 0; + set_time_limit(0); + sleep($secs); + while (1) { + + $arr = $this->PollParameters(); + + $hits = sprintf('%2.2f',$arr[0]); + $reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs); + $writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs); + $sess = sprintf('%5d',$arr[3]); + + $load = $this->CPULoad(); + if ($load !== false) { + $oslabel = 'WS-CPU%'; + $osval = sprintf(" %2.1f ",(float) $load); + }else { + $oslabel = ''; + $osval = ''; + } + if ($cnt % 10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n"; + $cnt += 1; + echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n"; + flush(); + + if (connection_aborted()) return; + + sleep($secs); + $arro = $arr; + } + } + + /* + Returns basic health check in a command line interface + */ + function HealthCheckCLI() + { + return $this->HealthCheck(true); + } + + + /* + Returns basic health check as HTML + */ + function HealthCheck($cli=false) + { + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + if ($cli) $html = ''; + else $html = $this->table.'

        '.$this->conn->databaseType.'

        '.$this->titles; + + $oldc = false; + $bgc = ''; + foreach($this->settings as $name => $arr) { + if ($arr === false) break; + + if (!is_string($name)) { + if ($cli) $html .= " -- $arr -- \n"; + else $html .= "color>$arr  "; + continue; + } + + if (!is_array($arr)) break; + $category = $arr[0]; + $how = $arr[1]; + if (sizeof($arr)>2) $desc = $arr[2]; + else $desc = '   '; + + + if ($category == 'HIDE') continue; + + $val = $this->_DBParameter($how); + + if ($desc && strncmp($desc,"=",1) === 0) { + $fn = substr($desc,1); + $desc = $this->$fn($val); + } + + if ($val === false) { + $m = $this->conn->ErrorMsg(); + $val = "Error: $m"; + } else { + if (is_numeric($val) && $val >= 256*1024) { + if ($val % (1024*1024) == 0) { + $val /= (1024*1024); + $val .= 'M'; + } else if ($val % 1024 == 0) { + $val /= 1024; + $val .= 'K'; + } + //$val = htmlspecialchars($val); + } + } + if ($category != $oldc) { + $oldc = $category; + //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color; + } + if (strlen($desc)==0) $desc = ' '; + if (strlen($val)==0) $val = ' '; + if ($cli) { + $html .= str_replace(' ','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc))); + + }else { + $html .= "".$name.''.$val.''.$desc."\n"; + } + } + + if (!$cli) $html .= "\n"; + $this->conn->fnExecute = $saveE; + + return $html; + } + + function Tables($orderby='1') + { + if (!$this->tablesSQL) return false; + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby); + $this->conn->LogSQL($savelog); + $html = rs2html($rs,false,false,false,false); + return $html; + } + + + function CreateLogTable() + { + if (!$this->createTableSQL) return false; + + $table = $this->table(); + $sql = str_replace('adodb_logsql',$table,$this->createTableSQL); + $savelog = $this->conn->LogSQL(false); + $ok = $this->conn->Execute($sql); + $this->conn->LogSQL($savelog); + return ($ok) ? true : false; + } + + function DoSQLForm() + { + + + $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); + $sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : ''; + + if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows']; + else $rows = 3; + + if (isset($_REQUEST['SMALLER'])) { + $rows /= 2; + if ($rows < 3) $rows = 3; + $_SESSION['phplens_sqlrows'] = $rows; + } + if (isset($_REQUEST['BIGGER'])) { + $rows *= 2; + $_SESSION['phplens_sqlrows'] = $rows; + } + +?> + +
        + + + + + + +
        Form size: + + +
        +
        +
        + +undomq(trim($sql)); + if (substr($sql,strlen($sql)-1) === ';') { + $print = true; + $sqla = $this->SplitSQL($sql); + } else { + $print = false; + $sqla = array($sql); + } + foreach($sqla as $sqls) { + + if (!$sqls) continue; + + if ($print) { + print "

        ".htmlspecialchars($sqls)."

        "; + flush(); + } + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($sqls); + $this->conn->LogSQL($savelog); + if ($rs && is_object($rs) && !$rs->EOF) { + rs2html($rs); + while ($rs->NextRecordSet()) { + print "
         
        "; + rs2html($rs); + } + } else { + $e1 = (integer) $this->conn->ErrorNo(); + $e2 = $this->conn->ErrorMsg(); + if (($e1) || ($e2)) { + if (empty($e1)) $e1 = '-1'; // postgresql fix + print '   '.$e1.': '.$e2; + } else { + print "

        No Recordset returned

        "; + } + } + } // foreach + } + + function SplitSQL($sql) + { + $arr = explode(';',$sql); + return $arr; + } + + function undomq($m) + { + if (get_magic_quotes_gpc()) { + // undo the damage + $m = str_replace('\\\\','\\',$m); + $m = str_replace('\"','"',$m); + $m = str_replace('\\\'','\'',$m); + } + return $m; +} + + + /************************************************************************/ + + /** + * Reorganise multiple table-indices/statistics/.. + * OptimizeMode could be given by last Parameter + * + * @example + *
        +     *          optimizeTables( 'tableA');
        +     *      
        + *
        +     *          optimizeTables( 'tableA', 'tableB', 'tableC');
        +     *      
        + *
        +     *          optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW);
        +     *      
        + * + * @param string table name of the table to optimize + * @param int mode optimization-mode + * ADODB_OPT_HIGH for full optimization + * ADODB_OPT_LOW for CPU-less optimization + * Default is LOW ADODB_OPT_LOW + * @author Markus Staab + * @return Returns true on success and false on error + */ + function OptimizeTables() + { + $args = func_get_args(); + $numArgs = func_num_args(); + + if ( $numArgs == 0) return false; + + $mode = ADODB_OPT_LOW; + $lastArg = $args[ $numArgs - 1]; + if ( !is_string($lastArg)) { + $mode = $lastArg; + unset( $args[ $numArgs - 1]); + } + + foreach( $args as $table) { + $this->optimizeTable( $table, $mode); + } + } + + /** + * Reorganise the table-indices/statistics/.. depending on the given mode. + * Default Implementation throws an error. + * + * @param string table name of the table to optimize + * @param int mode optimization-mode + * ADODB_OPT_HIGH for full optimization + * ADODB_OPT_LOW for CPU-less optimization + * Default is LOW ADODB_OPT_LOW + * @author Markus Staab + * @return Returns true on success and false on error + */ + function OptimizeTable( $table, $mode = ADODB_OPT_LOW) + { + ADOConnection::outp( sprintf( "

        %s: '%s' not implemented for driver '%s'

        ", __CLASS__, __FUNCTION__, $this->conn->databaseType)); + return false; + } + + /** + * Reorganise current database. + * Default implementation loops over all MetaTables() and + * optimize each using optmizeTable() + * + * @author Markus Staab + * @return Returns true on success and false on error + */ + function optimizeDatabase() + { + $conn = $this->conn; + if ( !$conn) return false; + + $tables = $conn->MetaTables( 'TABLES'); + if ( !$tables ) return false; + + foreach( $tables as $table) { + if ( !$this->optimizeTable( $table)) { + return false; + } + } + + return true; + } + // end hack +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/adodb-php4.inc.php b/fannie/adodb5/adodb-php4.inc.php new file mode 100644 index 000000000..788d9ec30 --- /dev/null +++ b/fannie/adodb5/adodb-php4.inc.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/fannie/adodb5/adodb-time.inc.php b/fannie/adodb5/adodb-time.inc.php new file mode 100644 index 000000000..076389507 --- /dev/null +++ b/fannie/adodb5/adodb-time.inc.php @@ -0,0 +1,1426 @@ + 4 digit year conversion. The maximum is billions of years in the +future, but this is a theoretical limit as the computation of that year +would take too long with the current implementation of adodb_mktime(). + +This library replaces native functions as follows: + +
        	
        +	getdate()  with  adodb_getdate()
        +	date()     with  adodb_date() 
        +	gmdate()   with  adodb_gmdate()
        +	mktime()   with  adodb_mktime()
        +	gmmktime() with  adodb_gmmktime()
        +	strftime() with  adodb_strftime()
        +	strftime() with  adodb_gmstrftime()
        +
        + +The parameters are identical, except that adodb_date() accepts a subset +of date()'s field formats. Mktime() will convert from local time to GMT, +and date() will convert from GMT to local time, but daylight savings is +not handled currently. + +This library is independant of the rest of ADOdb, and can be used +as standalone code. + +PERFORMANCE + +For high speed, this library uses the native date functions where +possible, and only switches to PHP code when the dates fall outside +the 32-bit signed integer range. + +GREGORIAN CORRECTION + +Pope Gregory shortened October of A.D. 1582 by ten days. Thursday, +October 4, 1582 (Julian) was followed immediately by Friday, October 15, +1582 (Gregorian). + +Since 0.06, we handle this correctly, so: + +adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582) + == 24 * 3600 (1 day) + +============================================================================= + +COPYRIGHT + +(c) 2003-2005 John Lim and released under BSD-style license except for code by +jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year +and originally found at http://www.php.net/manual/en/function.mktime.php + +============================================================================= + +BUG REPORTS + +These should be posted to the ADOdb forums at + + http://phplens.com/lens/lensforum/topics.php?id=4 + +============================================================================= + +FUNCTION DESCRIPTIONS + + +** FUNCTION adodb_getdate($date=false) + +Returns an array containing date information, as getdate(), but supports +dates greater than 1901 to 2038. The local date/time format is derived from a +heuristic the first time adodb_getdate is called. + + +** FUNCTION adodb_date($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. If $timestamp is not defined, the +current timestamp is used. Unlike the function date(), it supports dates +outside the 1901 to 2038 range. + +The format fields that adodb_date supports: + +
        +	a - "am" or "pm" 
        +	A - "AM" or "PM" 
        +	d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" 
        +	D - day of the week, textual, 3 letters; e.g. "Fri" 
        +	F - month, textual, long; e.g. "January" 
        +	g - hour, 12-hour format without leading zeros; i.e. "1" to "12" 
        +	G - hour, 24-hour format without leading zeros; i.e. "0" to "23" 
        +	h - hour, 12-hour format; i.e. "01" to "12" 
        +	H - hour, 24-hour format; i.e. "00" to "23" 
        +	i - minutes; i.e. "00" to "59" 
        +	j - day of the month without leading zeros; i.e. "1" to "31" 
        +	l (lowercase 'L') - day of the week, textual, long; e.g. "Friday"  
        +	L - boolean for whether it is a leap year; i.e. "0" or "1" 
        +	m - month; i.e. "01" to "12" 
        +	M - month, textual, 3 letters; e.g. "Jan" 
        +	n - month without leading zeros; i.e. "1" to "12" 
        +	O - Difference to Greenwich time in hours; e.g. "+0200" 
        +	Q - Quarter, as in 1, 2, 3, 4 
        +	r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" 
        +	s - seconds; i.e. "00" to "59" 
        +	S - English ordinal suffix for the day of the month, 2 characters; 
        +	   			i.e. "st", "nd", "rd" or "th" 
        +	t - number of days in the given month; i.e. "28" to "31"
        +	T - Timezone setting of this machine; e.g. "EST" or "MDT" 
        +	U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)  
        +	w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday) 
        +	Y - year, 4 digits; e.g. "1999" 
        +	y - year, 2 digits; e.g. "99" 
        +	z - day of the year; i.e. "0" to "365" 
        +	Z - timezone offset in seconds (i.e. "-43200" to "43200"). 
        +	   			The offset for timezones west of UTC is always negative, 
        +				and for those east of UTC is always positive. 
        +
        + +Unsupported: +
        +	B - Swatch Internet time 
        +	I (capital i) - "1" if Daylight Savings Time, "0" otherwise.
        +	W - ISO-8601 week number of year, weeks starting on Monday 
        +
        +
        + + +** FUNCTION adodb_date2($fmt, $isoDateString = false) +Same as adodb_date, but 2nd parameter accepts iso date, eg. + + adodb_date2('d-M-Y H:i','2003-12-25 13:01:34'); + + +** FUNCTION adodb_gmdate($fmt, $timestamp = false) + +Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the +current timestamp is used. Unlike the function date(), it supports dates +outside the 1901 to 2038 range. + + +** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year]) + +Converts a local date to a unix timestamp. Unlike the function mktime(), it supports +dates outside the 1901 to 2038 range. All parameters are optional. + + +** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year]) + +Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports +dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters +are currently compulsory. + +** FUNCTION adodb_gmstrftime($fmt, $timestamp = false) +Convert a timestamp to a formatted GMT date. + +** FUNCTION adodb_strftime($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. Internally converts $fmt into +adodb_date format, then echo result. + +For best results, you can define the local date format yourself. Define a global +variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using +adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax. + + eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s'); + + Supported format codes: + +
        +	%a - abbreviated weekday name according to the current locale 
        +	%A - full weekday name according to the current locale 
        +	%b - abbreviated month name according to the current locale 
        +	%B - full month name according to the current locale 
        +	%c - preferred date and time representation for the current locale 
        +	%d - day of the month as a decimal number (range 01 to 31) 
        +	%D - same as %m/%d/%y 
        +	%e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31') 
        +	%h - same as %b
        +	%H - hour as a decimal number using a 24-hour clock (range 00 to 23) 
        +	%I - hour as a decimal number using a 12-hour clock (range 01 to 12) 
        +	%m - month as a decimal number (range 01 to 12) 
        +	%M - minute as a decimal number 
        +	%n - newline character 
        +	%p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale 
        +	%r - time in a.m. and p.m. notation 
        +	%R - time in 24 hour notation 
        +	%S - second as a decimal number 
        +	%t - tab character 
        +	%T - current time, equal to %H:%M:%S 
        +	%x - preferred date representation for the current locale without the time 
        +	%X - preferred time representation for the current locale without the date 
        +	%y - year as a decimal number without a century (range 00 to 99) 
        +	%Y - year as a decimal number including the century 
        +	%Z - time zone or name or abbreviation 
        +	%% - a literal `%' character 
        +
        + + Unsupported codes: +
        +	%C - century number (the year divided by 100 and truncated to an integer, range 00 to 99) 
        +	%g - like %G, but without the century. 
        +	%G - The 4-digit year corresponding to the ISO week number (see %V). 
        +	     This has the same format and value as %Y, except that if the ISO week number belongs 
        +		 to the previous or next year, that year is used instead. 
        +	%j - day of the year as a decimal number (range 001 to 366) 
        +	%u - weekday as a decimal number [1,7], with 1 representing Monday 
        +	%U - week number of the current year as a decimal number, starting 
        +	    with the first Sunday as the first day of the first week 
        +	%V - The ISO 8601:1988 week number of the current year as a decimal number, 
        +	     range 01 to 53, where week 1 is the first week that has at least 4 days in the 
        +		 current year, and with Monday as the first day of the week. (Use %G or %g for 
        +		 the year component that corresponds to the week number for the specified timestamp.) 
        +	%w - day of the week as a decimal, Sunday being 0 
        +	%W - week number of the current year as a decimal number, starting with the 
        +	     first Monday as the first day of the first week 
        +
        + +============================================================================= + +NOTES + +Useful url for generating test timestamps: + http://www.4webhelp.net/us/timestamp.php + +Possible future optimizations include + +a. Using an algorithm similar to Plauger's in "The Standard C Library" +(page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not +work outside 32-bit signed range, so i decided not to implement it. + +b. Implement daylight savings, which looks awfully complicated, see + http://webexhibits.org/daylightsaving/ + + +CHANGELOG + +- 11 Feb 2008 0.33 +* Bug in 0.32 fix for hour handling. Fixed. + +- 1 Feb 2008 0.32 +* Now adodb_mktime(0,0,0,12+$m,20,2040) works properly. + +- 10 Jan 2008 0.31 +* Now adodb_mktime(0,0,0,24,1,2037) works correctly. + +- 15 July 2007 0.30 +Added PHP 5.2.0 compatability fixes. + * gmtime behaviour for 1970 has changed. We use the actual date if it is between 1970 to 2038 to get the + * timezone, otherwise we use the current year as the baseline to retrieve the timezone. + * Also the timezone's in php 5.2.* support historical data better, eg. if timezone today was +8, but + in 1970 it was +7:30, then php 5.2 return +7:30, while this library will use +8. + * + +- 19 March 2006 0.24 +Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used. + +- 10 Feb 2006 0.23 +PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000. + In PHP4, we will still use -0000 for 100% compat with PHP4. + +- 08 Sept 2005 0.22 +In adodb_date2(), $is_gmt not supported properly. Fixed. + +- 18 July 2005 0.21 +In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat. +Added support for negative months in adodb_mktime(). + +- 24 Feb 2005 0.20 +Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date(). + +- 21 Dec 2004 0.17 +In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false. +Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro. + +- 17 Nov 2004 0.16 +Removed intval typecast in adodb_mktime() for secs, allowing: + adodb_mktime(0,0,0 + 2236672153,1,1,1934); +Suggested by Ryan. + +- 18 July 2004 0.15 +All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory. +This brings it more in line with mktime (still not identical). + +- 23 June 2004 0.14 + +Allow you to define your own daylights savings function, adodb_daylight_sv. +If the function is defined (somewhere in an include), then you can correct for daylights savings. + +In this example, we apply daylights savings in June or July, adding one hour. This is extremely +unrealistic as it does not take into account time-zone, geographic location, current year. + +function adodb_daylight_sv(&$arr, $is_gmt) +{ + if ($is_gmt) return; + $m = $arr['mon']; + if ($m == 6 || $m == 7) $arr['hours'] += 1; +} + +This is only called by adodb_date() and not by adodb_mktime(). + +The format of $arr is +Array ( + [seconds] => 0 + [minutes] => 0 + [hours] => 0 + [mday] => 1 # day of month, eg 1st day of the month + [mon] => 2 # month (eg. Feb) + [year] => 2102 + [yday] => 31 # days in current year + [leap] => # true if leap year + [ndays] => 28 # no of days in current month + ) + + +- 28 Apr 2004 0.13 +Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov. + +- 20 Mar 2004 0.12 +Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32. + +- 26 Oct 2003 0.11 +Because of daylight savings problems (some systems apply daylight savings to +January!!!), changed adodb_get_gmt_diff() to ignore daylight savings. + +- 9 Aug 2003 0.10 +Fixed bug with dates after 2038. +See http://phplens.com/lens/lensforum/msgs.php?id=6980 + +- 1 July 2003 0.09 +Added support for Q (Quarter). +Added adodb_date2(), which accepts ISO date in 2nd param + +- 3 March 2003 0.08 +Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS +if you want PHP to handle negative timestamps between 1901 to 1969. + +- 27 Feb 2003 0.07 +All negative numbers handled by adodb now because of RH 7.3+ problems. +See http://bugs.php.net/bug.php?id=20048&edit=2 + +- 4 Feb 2003 0.06 +Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates +are now correctly handled. + +- 29 Jan 2003 0.05 + +Leap year checking differs under Julian calendar (pre 1582). Also +leap year code optimized by checking for most common case first. + +We also handle month overflow correctly in mktime (eg month set to 13). + +Day overflow for less than one month's days is supported. + +- 28 Jan 2003 0.04 + +Gregorian correction handled. In PHP5, we might throw an error if +mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10. +Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582. + +- 27 Jan 2003 0.03 + +Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION. +Fixed calculation of days since start of year for <1970. + +- 27 Jan 2003 0.02 + +Changed _adodb_getdate() to inline leap year checking for better performance. +Fixed problem with time-zones west of GMT +0000. + +- 24 Jan 2003 0.01 + +First implementation. +*/ + + +/* Initialization */ + +/* + Version Number +*/ +define('ADODB_DATE_VERSION',0.33); + +$ADODB_DATETIME_CLASS = (PHP_VERSION >= 5.2); + +/* + This code was originally for windows. But apparently this problem happens + also with Linux, RH 7.3 and later! + + glibc-2.2.5-34 and greater has been changed to return -1 for dates < + 1970. This used to work. The problem exists with RedHat 7.3 and 8.0 + echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1 + + References: + http://bugs.php.net/bug.php?id=20048&edit=2 + http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html +*/ + +if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1); + +function adodb_date_test_date($y1,$m,$d=13) +{ + $h = round(rand()% 24); + $t = adodb_mktime($h,0,0,$m,$d,$y1); + $rez = adodb_date('Y-n-j H:i:s',$t); + if ($h == 0) $h = '00'; + else if ($h < 10) $h = '0'.$h; + if ("$y1-$m-$d $h:00:00" != $rez) { + print "$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez
        "; + return false; + } + return true; +} + +function adodb_date_test_strftime($fmt) +{ + $s1 = strftime($fmt); + $s2 = adodb_strftime($fmt); + + if ($s1 == $s2) return true; + + echo "error for $fmt, strftime=$s1, adodb=$s2
        "; + return false; +} + +/** + Test Suite +*/ +function adodb_date_test() +{ + + for ($m=-24; $m<=24; $m++) + echo "$m :",adodb_date('d-m-Y',adodb_mktime(0,0,0,1+$m,20,2040)),"
        "; + + error_reporting(E_ALL); + print "

        Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."

        "; + @set_time_limit(0); + $fail = false; + + // This flag disables calling of PHP native functions, so we can properly test the code + if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1); + + $t = time(); + + + $fmt = 'Y-m-d H:i:s'; + echo '
        ';
        +	echo 'adodb: ',adodb_date($fmt,$t),'
        '; + echo 'php : ',date($fmt,$t),'
        '; + echo '
        '; + + adodb_date_test_strftime('%Y %m %x %X'); + adodb_date_test_strftime("%A %d %B %Y"); + adodb_date_test_strftime("%H %M S"); + + $t = adodb_mktime(0,0,0); + if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'
        '; + + $t = adodb_mktime(0,0,0,6,1,2102); + if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
        '; + + $t = adodb_mktime(0,0,0,2,1,2102); + if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
        '; + + + print "

        Testing gregorian <=> julian conversion

        "; + $t = adodb_mktime(0,0,0,10,11,1492); + //http://www.holidayorigins.com/html/columbus_day.html - Friday check + if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing
        '; + + $t = adodb_mktime(0,0,0,2,29,1500); + if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years
        '; + + $t = adodb_mktime(0,0,0,2,29,1700); + if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years
        '; + + print adodb_mktime(0,0,0,10,4,1582).' '; + print adodb_mktime(0,0,0,10,15,1582); + $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)); + if ($diff != 3600*24) print " Error in gregorian correction = ".($diff/3600/24)." days
        "; + + print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : 'Error')."
        "; + print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : 'Error')."
        "; + + print "

        Testing overflow

        "; + + $t = adodb_mktime(0,0,0,3,33,1965); + if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1
        '; + $t = adodb_mktime(0,0,0,4,33,1971); + if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2
        '; + $t = adodb_mktime(0,0,0,1,60,1965); + if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).'
        '; + $t = adodb_mktime(0,0,0,12,32,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).'
        '; + $t = adodb_mktime(0,0,0,12,63,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).'
        '; + $t = adodb_mktime(0,0,0,13,3,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1
        '; + + print "Testing 2-digit => 4-digit year conversion

        "; + if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000
        "; + if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010
        "; + if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020
        "; + if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030
        "; + if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940
        "; + if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950
        "; + if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990
        "; + + // Test string formating + print "

        Testing date formating

        "; + + $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003'; + $s1 = date($fmt,0); + $s2 = adodb_date($fmt,0); + if ($s1 != $s2) { + print " date() 0 failed
        $s1
        $s2
        "; + } + flush(); + for ($i=100; --$i > 0; ) { + + $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000); + $s1 = date($fmt,$ts); + $s2 = adodb_date($fmt,$ts); + //print "$s1
        $s2

        "; + $pos = strcmp($s1,$s2); + + if (($s1) != ($s2)) { + for ($j=0,$k=strlen($s1); $j < $k; $j++) { + if ($s1[$j] != $s2[$j]) { + print substr($s1,$j).' '; + break; + } + } + print "Error date(): $ts

         
        +  \"$s1\" (date len=".strlen($s1).")
        +  \"$s2\" (adodb_date len=".strlen($s2).")

        "; + $fail = true; + } + + $a1 = getdate($ts); + $a2 = adodb_getdate($ts); + $rez = array_diff($a1,$a2); + if (sizeof($rez)>0) { + print "Error getdate() $ts
        "; + print_r($a1); + print "
        "; + print_r($a2); + print "

        "; + $fail = true; + } + } + + // Test generation of dates outside 1901-2038 + print "

        Testing random dates between 100 and 4000

        "; + adodb_date_test_date(100,1); + for ($i=100; --$i >= 0;) { + $y1 = 100+rand(0,1970-100); + $m = rand(1,12); + adodb_date_test_date($y1,$m); + + $y1 = 3000-rand(0,3000-1970); + adodb_date_test_date($y1,$m); + } + print '

        '; + $start = 1960+rand(0,10); + $yrs = 12; + $i = 365.25*86400*($start-1970); + $offset = 36000+rand(10000,60000); + $max = 365*$yrs*86400; + $lastyear = 0; + + // we generate a timestamp, convert it to a date, and convert it back to a timestamp + // and check if the roundtrip broke the original timestamp value. + print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: "; + $cnt = 0; + for ($max += $i; $i < $max; $i += $offset) { + $ret = adodb_date('m,d,Y,H,i,s',$i); + $arr = explode(',',$ret); + if ($lastyear != $arr[2]) { + $lastyear = $arr[2]; + print " $lastyear "; + flush(); + } + $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]); + if ($i != $newi) { + print "Error at $i, adodb_mktime returned $newi ($ret)"; + $fail = true; + break; + } + $cnt += 1; + } + echo "Tested $cnt dates
        "; + if (!$fail) print "

        Passed !

        "; + else print "

        Failed :-(

        "; +} + +/** + Returns day of week, 0 = Sunday,... 6=Saturday. + Algorithm from PEAR::Date_Calc +*/ +function adodb_dow($year, $month, $day) +{ +/* +Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and +proclaimed that from that time onwards 3 days would be dropped from the calendar +every 400 years. + +Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian). +*/ + if ($year <= 1582) { + if ($year < 1582 || + ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3; + else + $greg_correction = 0; + } else + $greg_correction = 0; + + if($month > 2) + $month -= 2; + else { + $month += 10; + $year--; + } + + $day = floor((13 * $month - 1) / 5) + + $day + ($year % 100) + + floor(($year % 100) / 4) + + floor(($year / 100) / 4) - 2 * + floor($year / 100) + 77 + $greg_correction; + + return $day - 7 * floor($day / 7); +} + + +/** + Checks for leap year, returns true if it is. No 2-digit year check. Also + handles julian calendar correctly. +*/ +function _adodb_is_leap_year($year) +{ + if ($year % 4 != 0) return false; + + if ($year % 400 == 0) { + return true; + // if gregorian calendar (>1582), century not-divisible by 400 is not leap + } else if ($year > 1582 && $year % 100 == 0 ) { + return false; + } + + return true; +} + + +/** + checks for leap year, returns true if it is. Has 2-digit year check +*/ +function adodb_is_leap_year($year) +{ + return _adodb_is_leap_year(adodb_year_digit_check($year)); +} + +/** + Fix 2-digit years. Works for any century. + Assumes that if 2-digit is more than 30 years in future, then previous century. +*/ +function adodb_year_digit_check($y) +{ + if ($y < 100) { + + $yr = (integer) date("Y"); + $century = (integer) ($yr /100); + + if ($yr%100 > 50) { + $c1 = $century + 1; + $c0 = $century; + } else { + $c1 = $century; + $c0 = $century - 1; + } + $c1 *= 100; + // if 2-digit year is less than 30 years in future, set it to this century + // otherwise if more than 30 years in future, then we set 2-digit year to the prev century. + if (($y + $c1) < $yr+30) $y = $y + $c1; + else $y = $y + $c0*100; + } + return $y; +} + +function adodb_get_gmt_diff_ts($ts) +{ + if (0 <= $ts && $ts <= 0x7FFFFFFF) { // check if number in 32-bit signed range) { + $arr = getdate($ts); + $y = $arr['year']; + $m = $arr['mon']; + $d = $arr['mday']; + return adodb_get_gmt_diff($y,$m,$d); + } else { + return adodb_get_gmt_diff(false,false,false); + } + +} + +/** + get local time zone offset from GMT. Does not handle historical timezones before 1970. +*/ +function adodb_get_gmt_diff($y,$m,$d) +{ +static $TZ,$tzo; +global $ADODB_DATETIME_CLASS; + + if (!defined('ADODB_TEST_DATES')) $y = false; + else if ($y < 1970 || $y >= 2038) $y = false; + + if ($ADODB_DATETIME_CLASS && $y !== false) { + $dt = new DateTime(); + $dt->setISODate($y,$m,$d); + if (empty($tzo)) { + $tzo = new DateTimeZone(date_default_timezone_get()); + # $tzt = timezone_transitions_get( $tzo ); + } + return -$tzo->getOffset($dt); + } else { + if (isset($TZ)) return $TZ; + $y = date('Y'); + $TZ = mktime(0,0,0,12,2,$y,0) - gmmktime(0,0,0,12,2,$y,0); + } + + return $TZ; +} + +/** + Returns an array with date info. +*/ +function adodb_getdate($d=false,$fast=false) +{ + if ($d === false) return getdate(); + if (!defined('ADODB_TEST_DATES')) { + if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer + return @getdate($d); + } + } + return _adodb_getdate($d); +} + +/* +// generate $YRS table for _adodb_getdate() +function adodb_date_gentable($out=true) +{ + + for ($i=1970; $i >= 1600; $i-=10) { + $s = adodb_gmmktime(0,0,0,1,1,$i); + echo "$i => $s,
        "; + } +} +adodb_date_gentable(); + +for ($i=1970; $i > 1500; $i--) { + +echo "
        $i "; + adodb_date_test_date($i,1,1); +} + +*/ + + +$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); +$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + +function adodb_validdate($y,$m,$d) +{ +global $_month_table_normal,$_month_table_leaf; + + if (_adodb_is_leap_year($y)) $marr = $_month_table_leaf; + else $marr = $_month_table_normal; + + if ($m > 12 || $m < 1) return false; + + if ($d > 31 || $d < 1) return false; + + if ($marr[$m] < $d) return false; + + if ($y < 1000 && $y > 3000) return false; + + return true; +} + +/** + Low-level function that returns the getdate() array. We have a special + $fast flag, which if set to true, will return fewer array values, + and is much faster as it does not calculate dow, etc. +*/ +function _adodb_getdate($origd=false,$fast=false,$is_gmt=false) +{ +static $YRS; +global $_month_table_normal,$_month_table_leaf; + + $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff_ts($origd)); + $_day_power = 86400; + $_hour_power = 3600; + $_min_power = 60; + + if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction + + $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); + $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + + $d366 = $_day_power * 366; + $d365 = $_day_power * 365; + + if ($d < 0) { + + if (empty($YRS)) $YRS = array( + 1970 => 0, + 1960 => -315619200, + 1950 => -631152000, + 1940 => -946771200, + 1930 => -1262304000, + 1920 => -1577923200, + 1910 => -1893456000, + 1900 => -2208988800, + 1890 => -2524521600, + 1880 => -2840140800, + 1870 => -3155673600, + 1860 => -3471292800, + 1850 => -3786825600, + 1840 => -4102444800, + 1830 => -4417977600, + 1820 => -4733596800, + 1810 => -5049129600, + 1800 => -5364662400, + 1790 => -5680195200, + 1780 => -5995814400, + 1770 => -6311347200, + 1760 => -6626966400, + 1750 => -6942499200, + 1740 => -7258118400, + 1730 => -7573651200, + 1720 => -7889270400, + 1710 => -8204803200, + 1700 => -8520336000, + 1690 => -8835868800, + 1680 => -9151488000, + 1670 => -9467020800, + 1660 => -9782640000, + 1650 => -10098172800, + 1640 => -10413792000, + 1630 => -10729324800, + 1620 => -11044944000, + 1610 => -11360476800, + 1600 => -11676096000); + + if ($is_gmt) $origd = $d; + // The valid range of a 32bit signed timestamp is typically from + // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT + // + + # old algorithm iterates through all years. new algorithm does it in + # 10 year blocks + + /* + # old algo + for ($a = 1970 ; --$a >= 0;) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d += $d366; + else $d += $d365; + + if ($d >= 0) { + $year = $a; + break; + } + } + */ + + $lastsecs = 0; + $lastyear = 1970; + foreach($YRS as $year => $secs) { + if ($d >= $secs) { + $a = $lastyear; + break; + } + $lastsecs = $secs; + $lastyear = $year; + } + + $d -= $lastsecs; + if (!isset($a)) $a = $lastyear; + + //echo ' yr=',$a,' ', $d,'.'; + + for (; --$a >= 0;) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d += $d366; + else $d += $d365; + + if ($d >= 0) { + $year = $a; + break; + } + } + /**/ + + $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd; + + $d = $lastd; + $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; + for ($a = 13 ; --$a > 0;) { + $lastd = $d; + $d += $mtab[$a] * $_day_power; + if ($d >= 0) { + $month = $a; + $ndays = $mtab[$a]; + break; + } + } + + $d = $lastd; + $day = $ndays + ceil(($d+1) / ($_day_power)); + + $d += ($ndays - $day+1)* $_day_power; + $hour = floor($d/$_hour_power); + + } else { + for ($a = 1970 ;; $a++) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d -= $d366; + else $d -= $d365; + if ($d < 0) { + $year = $a; + break; + } + } + $secsInYear = $lastd; + $d = $lastd; + $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; + for ($a = 1 ; $a <= 12; $a++) { + $lastd = $d; + $d -= $mtab[$a] * $_day_power; + if ($d < 0) { + $month = $a; + $ndays = $mtab[$a]; + break; + } + } + $d = $lastd; + $day = ceil(($d+1) / $_day_power); + $d = $d - ($day-1) * $_day_power; + $hour = floor($d /$_hour_power); + } + + $d -= $hour * $_hour_power; + $min = floor($d/$_min_power); + $secs = $d - $min * $_min_power; + if ($fast) { + return array( + 'seconds' => $secs, + 'minutes' => $min, + 'hours' => $hour, + 'mday' => $day, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secsInYear/$_day_power), + 'leap' => $leaf, + 'ndays' => $ndays + ); + } + + + $dow = adodb_dow($year,$month,$day); + + return array( + 'seconds' => $secs, + 'minutes' => $min, + 'hours' => $hour, + 'mday' => $day, + 'wday' => $dow, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secsInYear/$_day_power), + 'weekday' => gmdate('l',$_day_power*(3+$dow)), + 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)), + 0 => $origd + ); +} +/* + if ($isphp5) + $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36); + else + $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36); + break;*/ +function adodb_tz_offset($gmt,$isphp5) +{ + $zhrs = abs($gmt)/3600; + $hrs = floor($zhrs); + if ($isphp5) + return sprintf('%s%02d%02d',($gmt<=0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); + else + return sprintf('%s%02d%02d',($gmt<0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); +} + + +function adodb_gmdate($fmt,$d=false) +{ + return adodb_date($fmt,$d,true); +} + +// accepts unix timestamp and iso date format in $d +function adodb_date2($fmt, $d=false, $is_gmt=false) +{ + if ($d !== false) { + if (!preg_match( + "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", + ($d), $rr)) return adodb_date($fmt,false,$is_gmt); + + if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt); + + // h-m-s-MM-DD-YY + if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt); + else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt); + } + + return adodb_date($fmt,$d,$is_gmt); +} + + +/** + Return formatted date based on timestamp $d +*/ +function adodb_date($fmt,$d=false,$is_gmt=false) +{ +static $daylight; +global $ADODB_DATETIME_CLASS; + + if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt); + if (!defined('ADODB_TEST_DATES')) { + if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer + return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d); + + } + } + $_day_power = 86400; + + $arr = _adodb_getdate($d,true,$is_gmt); + + if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv'); + if ($daylight) adodb_daylight_sv($arr, $is_gmt); + + $year = $arr['year']; + $month = $arr['mon']; + $day = $arr['mday']; + $hour = $arr['hours']; + $min = $arr['minutes']; + $secs = $arr['seconds']; + + $max = strlen($fmt); + $dates = ''; + + $isphp5 = PHP_VERSION >= 5; + + /* + at this point, we have the following integer vars to manipulate: + $year, $month, $day, $hour, $min, $secs + */ + for ($i=0; $i < $max; $i++) { + switch($fmt[$i]) { + case 'T': + if ($ADODB_DATETIME_CLASS) { + $dt = new DateTime(); + $dt->SetDate($year,$month,$day); + $dates .= $dt->Format('T'); + } else + $dates .= date('T'); + break; + // YEAR + case 'L': $dates .= $arr['leap'] ? '1' : '0'; break; + case 'r': // Thu, 21 Dec 2000 16:01:07 +0200 + + // 4.3.11 uses '04 Jun 2004' + // 4.3.8 uses ' 4 Jun 2004' + $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', ' + . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' '; + + if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour; + + if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min; + + if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs; + + $gmt = adodb_get_gmt_diff($year,$month,$day); + + $dates .= ' '.adodb_tz_offset($gmt,$isphp5); + break; + + case 'Y': $dates .= $year; break; + case 'y': $dates .= substr($year,strlen($year)-2,2); break; + // MONTH + case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break; + case 'Q': $dates .= ($month+3)>>2; break; + case 'n': $dates .= $month; break; + case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break; + case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break; + // DAY + case 't': $dates .= $arr['ndays']; break; + case 'z': $dates .= $arr['yday']; break; + case 'w': $dates .= adodb_dow($year,$month,$day); break; + case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break; + case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break; + case 'j': $dates .= $day; break; + case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break; + case 'S': + $d10 = $day % 10; + if ($d10 == 1) $dates .= 'st'; + else if ($d10 == 2 && $day != 12) $dates .= 'nd'; + else if ($d10 == 3) $dates .= 'rd'; + else $dates .= 'th'; + break; + + // HOUR + case 'Z': + $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff($year,$month,$day); break; + case 'O': + $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$month,$day); + + $dates .= adodb_tz_offset($gmt,$isphp5); + break; + + case 'H': + if ($hour < 10) $dates .= '0'.$hour; + else $dates .= $hour; + break; + case 'h': + if ($hour > 12) $hh = $hour - 12; + else { + if ($hour == 0) $hh = '12'; + else $hh = $hour; + } + + if ($hh < 10) $dates .= '0'.$hh; + else $dates .= $hh; + break; + + case 'G': + $dates .= $hour; + break; + + case 'g': + if ($hour > 12) $hh = $hour - 12; + else { + if ($hour == 0) $hh = '12'; + else $hh = $hour; + } + $dates .= $hh; + break; + // MINUTES + case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break; + // SECONDS + case 'U': $dates .= $d; break; + case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break; + // AM/PM + // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM + case 'a': + if ($hour>=12) $dates .= 'pm'; + else $dates .= 'am'; + break; + case 'A': + if ($hour>=12) $dates .= 'PM'; + else $dates .= 'AM'; + break; + default: + $dates .= $fmt[$i]; break; + // ESCAPE + case "\\": + $i++; + if ($i < $max) $dates .= $fmt[$i]; + break; + } + } + return $dates; +} + +/** + Returns a timestamp given a GMT/UTC time. + Note that $is_dst is not implemented and is ignored. +*/ +function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false) +{ + return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true); +} + +/** + Return a timestamp given a local time. Originally by jackbbs. + Note that $is_dst is not implemented and is ignored. + + Not a very fast algorithm - O(n) operation. Could be optimized to O(1). +*/ +function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false) +{ + if (!defined('ADODB_TEST_DATES')) { + + if ($mon === false) { + return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec); + } + + // for windows, we don't check 1970 because with timezone differences, + // 1 Jan 1970 could generate negative timestamp, which is illegal + $usephpfns = (1970 < $year && $year < 2038 + || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038) + ); + + + if ($usephpfns && ($year + $mon/12+$day/365.25+$hr/(24*365.25) >= 2038)) $usephpfns = false; + + if ($usephpfns) { + return $is_gmt ? + @gmmktime($hr,$min,$sec,$mon,$day,$year): + @mktime($hr,$min,$sec,$mon,$day,$year); + } + } + + $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$mon,$day); + + /* + # disabled because some people place large values in $sec. + # however we need it for $mon because we use an array... + $hr = intval($hr); + $min = intval($min); + $sec = intval($sec); + */ + $mon = intval($mon); + $day = intval($day); + $year = intval($year); + + + $year = adodb_year_digit_check($year); + + if ($mon > 12) { + $y = floor(($mon-1)/ 12); + $year += $y; + $mon -= $y*12; + } else if ($mon < 1) { + $y = ceil((1-$mon) / 12); + $year -= $y; + $mon += $y*12; + } + + $_day_power = 86400; + $_hour_power = 3600; + $_min_power = 60; + + $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); + $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + + $_total_date = 0; + if ($year >= 1970) { + for ($a = 1970 ; $a <= $year; $a++) { + $leaf = _adodb_is_leap_year($a); + if ($leaf == true) { + $loop_table = $_month_table_leaf; + $_add_date = 366; + } else { + $loop_table = $_month_table_normal; + $_add_date = 365; + } + if ($a < $year) { + $_total_date += $_add_date; + } else { + for($b=1;$b<$mon;$b++) { + $_total_date += $loop_table[$b]; + } + } + } + $_total_date +=$day-1; + $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different; + + } else { + for ($a = 1969 ; $a >= $year; $a--) { + $leaf = _adodb_is_leap_year($a); + if ($leaf == true) { + $loop_table = $_month_table_leaf; + $_add_date = 366; + } else { + $loop_table = $_month_table_normal; + $_add_date = 365; + } + if ($a > $year) { $_total_date += $_add_date; + } else { + for($b=12;$b>$mon;$b--) { + $_total_date += $loop_table[$b]; + } + } + } + $_total_date += $loop_table[$mon] - $day; + + $_day_time = $hr * $_hour_power + $min * $_min_power + $sec; + $_day_time = $_day_power - $_day_time; + $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different); + if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction + else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582. + } + //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret; + return $ret; +} + +function adodb_gmstrftime($fmt, $ts=false) +{ + return adodb_strftime($fmt,$ts,true); +} + +// hack - convert to adodb_date +function adodb_strftime($fmt, $ts=false,$is_gmt=false) +{ +global $ADODB_DATE_LOCALE; + + if (!defined('ADODB_TEST_DATES')) { + if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer + return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts); + + } + } + + if (empty($ADODB_DATE_LOCALE)) { + /* + $tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am + $sep = substr($tstr,2,1); + $hasAM = strrpos($tstr,'M') !== false; + */ + # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24 + $dstr = gmstrftime('%x',31366800); // 30 Dec 1970, 1 am + $sep = substr($dstr,2,1); + $tstr = strtoupper(gmstrftime('%X',31366800)); // 30 Dec 1970, 1 am + $hasAM = strrpos($tstr,'M') !== false; + + $ADODB_DATE_LOCALE = array(); + $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y'; + $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s'; + + } + $inpct = false; + $fmtdate = ''; + for ($i=0,$max = strlen($fmt); $i < $max; $i++) { + $ch = $fmt[$i]; + if ($ch == '%') { + if ($inpct) { + $fmtdate .= '%'; + $inpct = false; + } else + $inpct = true; + } else if ($inpct) { + + $inpct = false; + switch($ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'E': + case 'O': + /* ignore format modifiers */ + $inpct = true; + break; + + case 'a': $fmtdate .= 'D'; break; + case 'A': $fmtdate .= 'l'; break; + case 'h': + case 'b': $fmtdate .= 'M'; break; + case 'B': $fmtdate .= 'F'; break; + case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break; + case 'C': $fmtdate .= '\C?'; break; // century + case 'd': $fmtdate .= 'd'; break; + case 'D': $fmtdate .= 'm/d/y'; break; + case 'e': $fmtdate .= 'j'; break; + case 'g': $fmtdate .= '\g?'; break; //? + case 'G': $fmtdate .= '\G?'; break; //? + case 'H': $fmtdate .= 'H'; break; + case 'I': $fmtdate .= 'h'; break; + case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd + case 'm': $fmtdate .= 'm'; break; + case 'M': $fmtdate .= 'i'; break; + case 'n': $fmtdate .= "\n"; break; + case 'p': $fmtdate .= 'a'; break; + case 'r': $fmtdate .= 'h:i:s a'; break; + case 'R': $fmtdate .= 'H:i:s'; break; + case 'S': $fmtdate .= 's'; break; + case 't': $fmtdate .= "\t"; break; + case 'T': $fmtdate .= 'H:i:s'; break; + case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break; + case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break; + case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'y': $fmtdate .= 'y'; break; + case 'Y': $fmtdate .= 'Y'; break; + case 'Z': $fmtdate .= 'T'; break; + } + } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' )) + $fmtdate .= "\\".$ch; + else + $fmtdate .= $ch; + } + //echo "fmt=",$fmtdate,"
        "; + if ($ts === false) $ts = time(); + $ret = adodb_date($fmtdate, $ts, $is_gmt); + return $ret; +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/adodb-xmlschema.inc.php b/fannie/adodb5/adodb-xmlschema.inc.php new file mode 100644 index 000000000..b2f0ddc5c --- /dev/null +++ b/fannie/adodb5/adodb-xmlschema.inc.php @@ -0,0 +1,2223 @@ +parent = $parent; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + + } + + function create() { + return array(); + } + + /** + * Destroys the object + */ + function destroy() { + unset( $this ); + } + + /** + * Checks whether the specified RDBMS is supported by the current + * database object or its ranking ancestor. + * + * @param string $platform RDBMS platform name (from ADODB platform list). + * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE. + */ + function supportedPlatform( $platform = NULL ) { + return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE; + } + + /** + * Returns the prefix set by the ranking ancestor of the database object. + * + * @param string $name Prefix string. + * @return string Prefix. + */ + function prefix( $name = '' ) { + return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name; + } + + /** + * Extracts a field ID from the specified field. + * + * @param string $field Field. + * @return string Field ID. + */ + function FieldID( $field ) { + return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) ); + } +} + +/** +* Creates a table object in ADOdb's datadict format +* +* This class stores information about a database table. As charactaristics +* of the table are loaded from the external source, methods and properties +* of this class are used to build up the table description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbTable extends dbObject { + + /** + * @var string Table name + */ + var $name; + + /** + * @var array Field specifier: Meta-information about each field + */ + var $fields = array(); + + /** + * @var array List of table indexes. + */ + var $indexes = array(); + + /** + * @var array Table options: Table-level options + */ + var $opts = array(); + + /** + * @var string Field index: Keeps track of which field is currently being processed + */ + var $current_field; + + /** + * @var boolean Mark table for destruction + * @access private + */ + var $drop_table; + + /** + * @var boolean Mark field for destruction (not yet implemented) + * @access private + */ + var $drop_field = array(); + + /** + * Iniitializes a new table object. + * + * @param string $prefix DB Object prefix + * @param array $attributes Array of table attributes. + */ + function dbTable( &$parent, $attributes = NULL ) { + $this->parent = $parent; + $this->name = $this->prefix($attributes['NAME']); + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'INDEX': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addIndex( $attributes ) ); + } + break; + case 'DATA': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addData( $attributes ) ); + } + break; + case 'DROP': + $this->drop(); + break; + case 'FIELD': + // Add a field + $fieldName = $attributes['NAME']; + $fieldType = $attributes['TYPE']; + $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL; + $fieldOpts = isset( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL; + + $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts ); + break; + case 'KEY': + case 'NOTNULL': + case 'AUTOINCREMENT': + // Add a field option + $this->addFieldOpt( $this->current_field, $this->currentElement ); + break; + case 'DEFAULT': + // Add a field option to the table object + + // Work around ADOdb datadict issue that misinterprets empty strings. + if( $attributes['VALUE'] == '' ) { + $attributes['VALUE'] = " '' "; + } + + $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); + break; + case 'DEFDATE': + case 'DEFTIMESTAMP': + // Add a field option to the table object + $this->addFieldOpt( $this->current_field, $this->currentElement ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Table constraint + case 'CONSTRAINT': + if( isset( $this->current_field ) ) { + $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata ); + } else { + $this->addTableOpt( $cdata ); + } + break; + // Table option + case 'OPT': + $this->addTableOpt( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'TABLE': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + case 'FIELD': + unset($this->current_field); + break; + + } + } + + /** + * Adds an index to a table object + * + * @param array $attributes Index attributes + * @return object dbIndex object + */ + function addIndex( $attributes ) { + $name = strtoupper( $attributes['NAME'] ); + $this->indexes[$name] = new dbIndex( $this, $attributes ); + return $this->indexes[$name]; + } + + /** + * Adds data to a table object + * + * @param array $attributes Data attributes + * @return object dbData object + */ + function addData( $attributes ) { + if( !isset( $this->data ) ) { + $this->data = new dbData( $this, $attributes ); + } + return $this->data; + } + + /** + * Adds a field to a table object + * + * $name is the name of the table to which the field should be added. + * $type is an ADODB datadict field type. The following field types + * are supported as of ADODB 3.40: + * - C: varchar + * - X: CLOB (character large object) or largest varchar size + * if CLOB is not supported + * - C2: Multibyte varchar + * - X2: Multibyte CLOB + * - B: BLOB (binary large object) + * - D: Date (some databases do not support this, and we return a datetime type) + * - T: Datetime or Timestamp + * - L: Integer field suitable for storing booleans (0 or 1) + * - I: Integer (mapped to I4) + * - I1: 1-byte integer + * - I2: 2-byte integer + * - I4: 4-byte integer + * - I8: 8-byte integer + * - F: Floating point number + * - N: Numeric or decimal number + * + * @param string $name Name of the table to which the field will be added. + * @param string $type ADODB datadict field type. + * @param string $size Field size + * @param array $opts Field options array + * @return array Field specifier array + */ + function addField( $name, $type, $size = NULL, $opts = NULL ) { + $field_id = $this->FieldID( $name ); + + // Set the field index so we know where we are + $this->current_field = $field_id; + + // Set the field name (required) + $this->fields[$field_id]['NAME'] = $name; + + // Set the field type (required) + $this->fields[$field_id]['TYPE'] = $type; + + // Set the field size (optional) + if( isset( $size ) ) { + $this->fields[$field_id]['SIZE'] = $size; + } + + // Set the field options + if( isset( $opts ) ) { + $this->fields[$field_id]['OPTS'][] = $opts; + } + } + + /** + * Adds a field option to the current field specifier + * + * This method adds a field option allowed by the ADOdb datadict + * and appends it to the given field. + * + * @param string $field Field name + * @param string $opt ADOdb field option + * @param mixed $value Field option value + * @return array Field specifier array + */ + function addFieldOpt( $field, $opt, $value = NULL ) { + if( !isset( $value ) ) { + $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt; + // Add the option and value + } else { + $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value ); + } + } + + /** + * Adds an option to the table + * + * This method takes a comma-separated list of table-level options + * and appends them to the table object. + * + * @param string $opt Table option + * @return array Options + */ + function addTableOpt( $opt ) { + if(isset($this->currentPlatform)) { + $this->opts[$this->parent->db->databaseType] = $opt; + } + return $this->opts; + } + + + /** + * Generates the SQL that will create the table in the database + * + * @param object $xmls adoSchema object + * @return array Array containing table creation SQL + */ + function create( &$xmls ) { + $sql = array(); + + // drop any existing indexes + if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) { + foreach( $legacy_indexes as $index => $index_details ) { + $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name ); + } + } + + // remove fields to be dropped from table object + foreach( $this->drop_field as $field ) { + unset( $this->fields[$field] ); + } + + // if table exists + if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) { + // drop table + if( $this->drop_table ) { + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + + return $sql; + } + + // drop any existing fields not in schema + foreach( $legacy_fields as $field_id => $field ) { + if( !isset( $this->fields[$field_id] ) ) { + $sql[] = $xmls->dict->DropColumnSQL( $this->name, '`'.$field->name.'`' ); + } + } + // if table doesn't exist + } else { + if( $this->drop_table ) { + return $sql; + } + + $legacy_fields = array(); + } + + // Loop through the field specifier array, building the associative array for the field options + $fldarray = array(); + + foreach( $this->fields as $field_id => $finfo ) { + // Set an empty size if it isn't supplied + if( !isset( $finfo['SIZE'] ) ) { + $finfo['SIZE'] = ''; + } + + // Initialize the field array with the type and size + $fldarray[$field_id] = array( + 'NAME' => $finfo['NAME'], + 'TYPE' => $finfo['TYPE'], + 'SIZE' => $finfo['SIZE'] + ); + + // Loop through the options array and add the field options. + if( isset( $finfo['OPTS'] ) ) { + foreach( $finfo['OPTS'] as $opt ) { + // Option has an argument. + if( is_array( $opt ) ) { + $key = key( $opt ); + $value = $opt[key( $opt )]; + @$fldarray[$field_id][$key] .= $value; + // Option doesn't have arguments + } else { + $fldarray[$field_id][$opt] = $opt; + } + } + } + } + + if( empty( $legacy_fields ) ) { + // Create the new table + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + logMsg( end( $sql ), 'Generated CreateTableSQL' ); + } else { + // Upgrade an existing table + logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" ); + switch( $xmls->upgrade ) { + // Use ChangeTableSQL + case 'ALTER': + logMsg( 'Generated ChangeTableSQL (ALTERing table)' ); + $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts ); + break; + case 'REPLACE': + logMsg( 'Doing upgrade REPLACE (testing)' ); + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + break; + // ignore table + default: + return array(); + } + } + + foreach( $this->indexes as $index ) { + $sql[] = $index->create( $xmls ); + } + + if( isset( $this->data ) ) { + $sql[] = $this->data->create( $xmls ); + } + + return $sql; + } + + /** + * Marks a field or table for destruction + */ + function drop() { + if( isset( $this->current_field ) ) { + // Drop the current field + logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" ); + // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field ); + $this->drop_field[$this->current_field] = $this->current_field; + } else { + // Drop the current table + logMsg( "Dropping table '{$this->name}'" ); + // $this->drop_table = $xmls->dict->DropTableSQL( $this->name ); + $this->drop_table = TRUE; + } + } +} + +/** +* Creates an index object in ADOdb's datadict format +* +* This class stores information about a database index. As charactaristics +* of the index are loaded from the external source, methods and properties +* of this class are used to build up the index description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbIndex extends dbObject { + + /** + * @var string Index name + */ + var $name; + + /** + * @var array Index options: Index-level options + */ + var $opts = array(); + + /** + * @var array Indexed fields: Table columns included in this index + */ + var $columns = array(); + + /** + * @var boolean Mark index for destruction + * @access private + */ + var $drop = FALSE; + + /** + * Initializes the new dbIndex object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbIndex( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + $this->name = $this->prefix ($attributes['NAME']); + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'DROP': + $this->drop(); + break; + case 'CLUSTERED': + case 'BITMAP': + case 'UNIQUE': + case 'FULLTEXT': + case 'HASH': + // Add index Option + $this->addIndexOpt( $this->currentElement ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'COL': + $this->addField( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'INDEX': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the index + * + * @param string $name Field name + * @return string Field list + */ + function addField( $name ) { + $this->columns[$this->FieldID( $name )] = $name; + + // Return the field list + return $this->columns; + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addIndexOpt( $opt ) { + $this->opts[] = $opt; + + // Return the options list + return $this->opts; + } + + /** + * Generates the SQL that will create the index in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + if( $this->drop ) { + return NULL; + } + + // eliminate any columns that aren't in the table + foreach( $this->columns as $id => $col ) { + if( !isset( $this->parent->fields[$id] ) ) { + unset( $this->columns[$id] ); + } + } + + return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts ); + } + + /** + * Marks an index for destruction + */ + function drop() { + $this->drop = TRUE; + } +} + +/** +* Creates a data object in ADOdb's datadict format +* +* This class stores information about table data. +* +* @package axmls +* @access private +*/ +class dbData extends dbObject { + + var $data = array(); + + var $row; + + /** + * Initializes the new dbIndex object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbData( &$parent, $attributes = NULL ) { + $this->parent = $parent; + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'ROW': + $this->row = count( $this->data ); + $this->data[$this->row] = array(); + break; + case 'F': + $this->addField($attributes); + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'F': + $this->addData( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'DATA': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the index + * + * @param string $name Field name + * @return string Field list + */ + function addField( $attributes ) { + if( isset( $attributes['NAME'] ) ) { + $name = $attributes['NAME']; + } else { + $name = count($this->data[$this->row]); + } + + // Set the field index so we know where we are + $this->current_field = $this->FieldID( $name ); + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addData( $cdata ) { + if( !isset( $this->data[$this->row] ) ) { + $this->data[$this->row] = array(); + } + + if( !isset( $this->data[$this->row][$this->current_field] ) ) { + $this->data[$this->row][$this->current_field] = ''; + } + + $this->data[$this->row][$this->current_field] .= $cdata; + } + + /** + * Generates the SQL that will create the index in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + $table = $xmls->dict->TableName($this->parent->name); + $table_field_count = count($this->parent->fields); + $sql = array(); + + // eliminate any columns that aren't in the table + foreach( $this->data as $row ) { + $table_fields = $this->parent->fields; + $fields = array(); + + foreach( $row as $field_id => $field_data ) { + if( !array_key_exists( $field_id, $table_fields ) ) { + if( is_numeric( $field_id ) ) { + $field_id = reset( array_keys( $table_fields ) ); + } else { + continue; + } + } + + $name = $table_fields[$field_id]['NAME']; + + switch( $table_fields[$field_id]['TYPE'] ) { + case 'C': + case 'C2': + case 'X': + case 'X2': + $fields[$name] = $xmls->db->qstr( $field_data ); + break; + case 'I': + case 'I1': + case 'I2': + case 'I4': + case 'I8': + $fields[$name] = intval($field_data); + break; + default: + $fields[$name] = $field_data; + } + + unset($table_fields[$field_id]); + } + + // check that at least 1 column is specified + if( empty( $fields ) ) { + continue; + } + + // check that no required columns are missing + if( count( $fields ) < $table_field_count ) { + foreach( $table_fields as $field ) { + if (isset( $field['OPTS'] )) + if( ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) { + continue(2); + } + } + } + + $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; + } + + return $sql; + } +} + +/** +* Creates the SQL to execute a list of provided SQL queries +* +* @package axmls +* @access private +*/ +class dbQuerySet extends dbObject { + + /** + * @var array List of SQL queries + */ + var $queries = array(); + + /** + * @var string String used to build of a query line by line + */ + var $query; + + /** + * @var string Query prefix key + */ + var $prefixKey = ''; + + /** + * @var boolean Auto prefix enable (TRUE) + */ + var $prefixMethod = 'AUTO'; + + /** + * Initializes the query set. + * + * @param object $parent Parent object + * @param array $attributes Attributes + */ + function dbQuerySet( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + // Overrides the manual prefix key + if( isset( $attributes['KEY'] ) ) { + $this->prefixKey = $attributes['KEY']; + } + + $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : ''; + + // Enables or disables automatic prefix prepending + switch( $prefixMethod ) { + case 'AUTO': + $this->prefixMethod = 'AUTO'; + break; + case 'MANUAL': + $this->prefixMethod = 'MANUAL'; + break; + case 'NONE': + $this->prefixMethod = 'NONE'; + break; + } + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: QUERY. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'QUERY': + // Create a new query in a SQL queryset. + // Ignore this query set if a platform is specified and it's different than the + // current connection platform. + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->newQuery(); + } else { + $this->discardQuery(); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Line of queryset SQL data + case 'QUERY': + $this->buildQuery( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'QUERY': + // Add the finished query to the open query set. + $this->addQuery(); + break; + case 'SQL': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + default: + + } + } + + /** + * Re-initializes the query. + * + * @return boolean TRUE + */ + function newQuery() { + $this->query = ''; + + return TRUE; + } + + /** + * Discards the existing query. + * + * @return boolean TRUE + */ + function discardQuery() { + unset( $this->query ); + + return TRUE; + } + + /** + * Appends a line to a query that is being built line by line + * + * @param string $data Line of SQL data or NULL to initialize a new query + * @return string SQL query string. + */ + function buildQuery( $sql = NULL ) { + if( !isset( $this->query ) OR empty( $sql ) ) { + return FALSE; + } + + $this->query .= $sql; + + return $this->query; + } + + /** + * Adds a completed query to the query list + * + * @return string SQL of added query + */ + function addQuery() { + if( !isset( $this->query ) ) { + return FALSE; + } + + $this->queries[] = $return = trim($this->query); + + unset( $this->query ); + + return $return; + } + + /** + * Creates and returns the current query set + * + * @param object $xmls adoSchema object + * @return array Query set + */ + function create( &$xmls ) { + foreach( $this->queries as $id => $query ) { + switch( $this->prefixMethod ) { + case 'AUTO': + // Enable auto prefix replacement + + // Process object prefix. + // Evaluate SQL statements to prepend prefix to objects + $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + + // SELECT statements aren't working yet + #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); + + case 'MANUAL': + // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX. + // If prefixKey is not set, we use the default constant XMLS_PREFIX + if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) { + // Enable prefix override + $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query ); + } else { + // Use default replacement + $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query ); + } + } + + $this->queries[$id] = trim( $query ); + } + + // Return the query set array + return $this->queries; + } + + /** + * Rebuilds the query with the prefix attached to any objects + * + * @param string $regex Regex used to add prefix + * @param string $query SQL query string + * @param string $prefix Prefix to be appended to tables, indices, etc. + * @return string Prefixed SQL query string. + */ + function prefixQuery( $regex, $query, $prefix = NULL ) { + if( !isset( $prefix ) ) { + return $query; + } + + if( preg_match( $regex, $query, $match ) ) { + $preamble = $match[1]; + $postamble = $match[5]; + $objectList = explode( ',', $match[3] ); + // $prefix = $prefix . '_'; + + $prefixedList = ''; + + foreach( $objectList as $object ) { + if( $prefixedList !== '' ) { + $prefixedList .= ', '; + } + + $prefixedList .= $prefix . trim( $object ); + } + + $query = $preamble . ' ' . $prefixedList . ' ' . $postamble; + } + + return $query; + } +} + +/** +* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements +* +* This class is used to load and parse the XML file, to create an array of SQL statements +* that can be used to build a database, and to build the database using the SQL array. +* +* @tutorial getting_started.pkg +* +* @author Richard Tango-Lowy & Dan Cech +* @version $Revision: 1.12 $ +* +* @package axmls +*/ +class adoSchema { + + /** + * @var array Array containing SQL queries to generate all objects + * @access private + */ + var $sqlArray; + + /** + * @var object ADOdb connection object + * @access private + */ + var $db; + + /** + * @var object ADOdb Data Dictionary + * @access private + */ + var $dict; + + /** + * @var string Current XML element + * @access private + */ + var $currentElement = ''; + + /** + * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database + * @access private + */ + var $upgrade = ''; + + /** + * @var string Optional object prefix + * @access private + */ + var $objectPrefix = ''; + + /** + * @var long Original Magic Quotes Runtime value + * @access private + */ + var $mgq; + + /** + * @var long System debug + * @access private + */ + var $debug; + + /** + * @var string Regular expression to find schema version + * @access private + */ + var $versionRegex = '//'; + + /** + * @var string Current schema version + * @access private + */ + var $schemaVersion; + + /** + * @var int Success of last Schema execution + */ + var $success; + + /** + * @var bool Execute SQL inline as it is generated + */ + var $executeInline; + + /** + * @var bool Continue SQL execution if errors occur + */ + var $continueOnError; + + /** + * Creates an adoSchema object + * + * Creating an adoSchema object is the first step in processing an XML schema. + * The only parameter is an ADOdb database connection object, which must already + * have been created. + * + * @param object $db ADOdb database connection object. + */ + function adoSchema( &$db ) { + // Initialize the environment + $this->mgq = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + + $this->db = $db; + $this->debug = $this->db->debug; + $this->dict = NewDataDictionary( $this->db ); + $this->sqlArray = array(); + $this->schemaVersion = XMLS_SCHEMA_VERSION; + $this->executeInline( XMLS_EXECUTE_INLINE ); + $this->continueOnError( XMLS_CONTINUE_ON_ERROR ); + $this->setUpgradeMethod(); + } + + /** + * Sets the method to be used for upgrading an existing database + * + * Use this method to specify how existing database objects should be upgraded. + * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to + * alter each database object directly, REPLACE attempts to rebuild each object + * from scratch, BEST attempts to determine the best upgrade method for each + * object, and NONE disables upgrading. + * + * This method is not yet used by AXMLS, but exists for backward compatibility. + * The ALTER method is automatically assumed when the adoSchema object is + * instantiated; other upgrade methods are not currently supported. + * + * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE) + * @returns string Upgrade method used + */ + function SetUpgradeMethod( $method = '' ) { + if( !is_string( $method ) ) { + return FALSE; + } + + $method = strtoupper( $method ); + + // Handle the upgrade methods + switch( $method ) { + case 'ALTER': + $this->upgrade = $method; + break; + case 'REPLACE': + $this->upgrade = $method; + break; + case 'BEST': + $this->upgrade = 'ALTER'; + break; + case 'NONE': + $this->upgrade = 'NONE'; + break; + default: + // Use default if no legitimate method is passed. + $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD; + } + + return $this->upgrade; + } + + /** + * Enables/disables inline SQL execution. + * + * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution), + * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode + * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema() + * to apply the schema to the database. + * + * @param bool $mode execute + * @return bool current execution mode + * + * @see ParseSchema(), ExecuteSchema() + */ + function ExecuteInline( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->executeInline = $mode; + } + + return $this->executeInline; + } + + /** + * Enables/disables SQL continue on error. + * + * Call this method to enable or disable continuation of SQL execution if an error occurs. + * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs. + * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing + * of the schema will continue. + * + * @param bool $mode execute + * @return bool current continueOnError mode + * + * @see addSQL(), ExecuteSchema() + */ + function ContinueOnError( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->continueOnError = $mode; + } + + return $this->continueOnError; + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to create the database described. + * @see ParseSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function ParseSchema( $filename, $returnSchema = FALSE ) { + return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema from a file (see the DTD for the proper format) + * and generate the SQL necessary to create the database described by the schema. + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + * + * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() + * @see ParseSchema(), ParseSchemaString() + */ + function ParseSchemaFile( $filename, $returnSchema = FALSE ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + // die( 'Unable to open file' ); + return FALSE; + } + + // do version detection here + if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) { + return FALSE; + } + + if ( $returnSchema ) + { + $xmlstring = ''; + while( $data = fread( $fp, 100000 ) ) { + $xmlstring .= $data; + } + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Converts an XML schema string to SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to create the database described by the schema. + * @see ParseSchema() + * + * @param string $xmlstring XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + return FALSE; + } + + // do version detection here + if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) { + return FALSE; + } + + if ( $returnSchema ) + { + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Loads an XML schema from a file and converts it to uninstallation SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to remove the database described. + * @see RemoveSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function RemoveSchema( $filename, $returnSchema = FALSE ) { + return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Converts an XML schema string to uninstallation SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to uninstall the database described by the schema. + * @see RemoveSchema() + * + * @param string $schema XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function RemoveSchemaString( $schema, $returnSchema = FALSE ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema ); + } + + /** + * Applies the current XML schema to the database (post execution). + * + * Call this method to apply the current schema (generally created by calling + * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes, + * and executing other SQL specified in the schema) after parsing. + * @see ParseSchema(), ParseSchemaString(), ExecuteInline() + * + * @param array $sqlArray Array of SQL statements that will be applied rather than + * the current schema. + * @param boolean $continueOnErr Continue to apply the schema even if an error occurs. + * @returns integer 0 if failure, 1 if errors, 2 if successful. + */ + function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) { + if( !is_bool( $continueOnErr ) ) { + $continueOnErr = $this->ContinueOnError(); + } + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + $this->success = 0; + } else { + $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr ); + } + + return $this->success; + } + + /** + * Returns the current SQL array. + * + * Call this method to fetch the array of SQL queries resulting from + * ParseSchema() or ParseSchemaString(). + * + * @param string $format Format: HTML, TEXT, or NONE (PHP array) + * @return array Array of SQL statements or FALSE if an error occurs + */ + function PrintSQL( $format = 'NONE' ) { + $sqlArray = null; + return $this->getSQL( $format, $sqlArray ); + } + + /** + * Saves the current SQL array to the local filesystem as a list of SQL queries. + * + * Call this method to save the array of SQL queries (generally resulting from a + * parsed XML schema) to the filesystem. + * + * @param string $filename Path and name where the file should be saved. + * @return boolean TRUE if save is successful, else FALSE. + */ + function SaveSQL( $filename = './schema.sql' ) { + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + if( !isset( $sqlArray ) ) { + return FALSE; + } + + $fp = fopen( $filename, "w" ); + + foreach( $sqlArray as $key => $query ) { + fwrite( $fp, $query . ";\n" ); + } + fclose( $fp ); + } + + /** + * Create an xml parser + * + * @return object PHP XML parser object + * + * @access private + */ + function create_parser() { + // Create the parser + $xmlParser = xml_parser_create(); + xml_set_object( $xmlParser, $this ); + + // Initialize the XML callback functions + xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' ); + xml_set_character_data_handler( $xmlParser, '_tag_cdata' ); + + return $xmlParser; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + switch( strtoupper( $tag ) ) { + case 'TABLE': + $this->obj = new dbTable( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + break; + case 'SQL': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->obj = new dbQuerySet( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + } + + /** + * XML Callback to process end elements + * + * @access private + * @internal + */ + function _tag_close( &$parser, $tag ) { + + } + + /** + * Converts an XML schema string to the specified DTD version. + * + * Call this method to convert a string containing an XML schema to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaFile() + * + * @param string $schema String containing XML schema that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = $schema; + } else { + $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + // compat for pre-4.3 - jlim + function _file_get_contents($path) + { + if (function_exists('file_get_contents')) return file_get_contents($path); + return join('',file($path)); + } + + /** + * Converts an XML schema file to the specified DTD version. + * + * Call this method to convert the specified XML schema file to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaString() + * + * @param string $filename Name of XML schema file that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaFileVersion( $filename ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = _file_get_contents( $filename ); + + // remove unicode BOM if present + if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) { + $result = substr( $result, 3 ); + } + } else { + $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' ); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + function TransformSchema( $schema, $xsl, $schematype='string' ) + { + // Fail if XSLT extension is not available + if( ! function_exists( 'xslt_create' ) ) { + return FALSE; + } + + $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl'; + + // look for xsl + if( !is_readable( $xsl_file ) ) { + return FALSE; + } + + switch( $schematype ) + { + case 'file': + if( !is_readable( $schema ) ) { + return FALSE; + } + + $schema = _file_get_contents( $schema ); + break; + case 'string': + default: + if( !is_string( $schema ) ) { + return FALSE; + } + } + + $arguments = array ( + '/_xml' => $schema, + '/_xsl' => _file_get_contents( $xsl_file ) + ); + + // create an XSLT processor + $xh = xslt_create (); + + // set error handler + xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler')); + + // process the schema + $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); + + xslt_free ($xh); + + return $result; + } + + /** + * Processes XSLT transformation errors + * + * @param object $parser XML parser object + * @param integer $errno Error number + * @param integer $level Error level + * @param array $fields Error information fields + * + * @access private + */ + function xslt_error_handler( $parser, $errno, $level, $fields ) { + if( is_array( $fields ) ) { + $msg = array( + 'Message Type' => ucfirst( $fields['msgtype'] ), + 'Message Code' => $fields['code'], + 'Message' => $fields['msg'], + 'Error Number' => $errno, + 'Level' => $level + ); + + switch( $fields['URI'] ) { + case 'arg:/_xml': + $msg['Input'] = 'XML'; + break; + case 'arg:/_xsl': + $msg['Input'] = 'XSL'; + break; + default: + $msg['Input'] = $fields['URI']; + } + + $msg['Line'] = $fields['line']; + } else { + $msg = array( + 'Message Type' => 'Error', + 'Error Number' => $errno, + 'Level' => $level, + 'Fields' => var_export( $fields, TRUE ) + ); + } + + $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n" + . '' . "\n"; + + foreach( $msg as $label => $details ) { + $error_details .= '' . "\n"; + } + + $error_details .= '
        ' . $label . ': ' . htmlentities( $details ) . '
        '; + + trigger_error( $error_details, E_USER_ERROR ); + } + + /** + * Returns the AXMLS Schema Version of the requested XML schema file. + * + * Call this method to obtain the AXMLS DTD version of the requested XML schema file. + * @see SchemaStringVersion() + * + * @param string $filename AXMLS schema file + * @return string Schema version number or FALSE on error + */ + function SchemaFileVersion( $filename ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + // die( 'Unable to open file' ); + return FALSE; + } + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( preg_match( $this->versionRegex, $data, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + } + + return FALSE; + } + + /** + * Returns the AXMLS Schema Version of the provided XML schema string. + * + * Call this method to obtain the AXMLS DTD version of the provided XML schema string. + * @see SchemaFileVersion() + * + * @param string $xmlstring XML schema string + * @return string Schema version number or FALSE on error + */ + function SchemaStringVersion( $xmlstring ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + return FALSE; + } + + if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + + return FALSE; + } + + /** + * Extracts an XML schema from an existing database. + * + * Call this method to create an XML schema string from an existing database. + * If the data parameter is set to TRUE, AXMLS will include the data from the database + * in the schema. + * + * @param boolean $data Include data in schema dump + * @return string Generated XML schema + */ + function ExtractSchema( $data = FALSE ) { + $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM ); + + $schema = '' . "\n" + . '' . "\n"; + + if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) { + foreach( $tables as $table ) { + $schema .= ' ' . "\n"; + + // grab details from database + $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE 1=1' ); + $fields = $this->db->MetaColumns( $table ); + $indexes = $this->db->MetaIndexes( $table ); + + if( is_array( $fields ) ) { + foreach( $fields as $details ) { + $extra = ''; + $content = array(); + + if( $details->max_length > 0 ) { + $extra .= ' size="' . $details->max_length . '"'; + } + + if( $details->primary_key ) { + $content[] = ''; + } elseif( $details->not_null ) { + $content[] = ''; + } + + if( $details->has_default ) { + $content[] = ''; + } + + if( $details->auto_increment ) { + $content[] = ''; + } + + // this stops the creation of 'R' columns, + // AUTOINCREMENT is used to create auto columns + $details->primary_key = 0; + $type = $rs->MetaType( $details ); + + $schema .= ' '; + + if( !empty( $content ) ) { + $schema .= "\n " . implode( "\n ", $content ) . "\n "; + } + + $schema .= '' . "\n"; + } + } + + if( is_array( $indexes ) ) { + foreach( $indexes as $index => $details ) { + $schema .= ' ' . "\n"; + + if( $details['unique'] ) { + $schema .= ' ' . "\n"; + } + + foreach( $details['columns'] as $column ) { + $schema .= ' ' . $column . '' . "\n"; + } + + $schema .= ' ' . "\n"; + } + } + + if( $data ) { + $rs = $this->db->Execute( 'SELECT * FROM ' . $table ); + + if( is_object( $rs ) ) { + $schema .= ' ' . "\n"; + + while( $row = $rs->FetchRow() ) { + foreach( $row as $key => $val ) { + $row[$key] = htmlentities($val); + } + + $schema .= ' ' . implode( '', $row ) . '' . "\n"; + } + + $schema .= ' ' . "\n"; + } + } + + $schema .= '
        ' . "\n"; + } + } + + $this->db->SetFetchMode( $old_mode ); + + $schema .= '
        '; + return $schema; + } + + /** + * Sets a prefix for database objects + * + * Call this method to set a standard prefix that will be prepended to all database tables + * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix. + * + * @param string $prefix Prefix that will be prepended. + * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix. + * @return boolean TRUE if successful, else FALSE + */ + function SetPrefix( $prefix = '', $underscore = TRUE ) { + switch( TRUE ) { + // clear prefix + case empty( $prefix ): + logMsg( 'Cleared prefix' ); + $this->objectPrefix = ''; + return TRUE; + // prefix too long + case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: + // prefix contains invalid characters + case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ): + logMsg( 'Invalid prefix: ' . $prefix ); + return FALSE; + } + + if( $underscore AND substr( $prefix, -1 ) != '_' ) { + $prefix .= '_'; + } + + // prefix valid + logMsg( 'Set prefix: ' . $prefix ); + $this->objectPrefix = $prefix; + return TRUE; + } + + /** + * Returns an object name with the current prefix prepended. + * + * @param string $name Name + * @return string Prefixed name + * + * @access private + */ + function prefix( $name = '' ) { + // if prefix is set + if( !empty( $this->objectPrefix ) ) { + // Prepend the object prefix to the table name + // prepend after quote if used + return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name ); + } + + // No prefix set. Use name provided. + return $name; + } + + /** + * Checks if element references a specific platform + * + * @param string $platform Requested platform + * @returns boolean TRUE if platform check succeeds + * + * @access private + */ + function supportedPlatform( $platform = NULL ) { + $regex = '/^(\w*\|)*' . $this->db->databaseType . '(\|\w*)*$/'; + + if( !isset( $platform ) OR preg_match( $regex, $platform ) ) { + logMsg( "Platform $platform is supported" ); + return TRUE; + } else { + logMsg( "Platform $platform is NOT supported" ); + return FALSE; + } + } + + /** + * Clears the array of generated SQL. + * + * @access private + */ + function clearSQL() { + $this->sqlArray = array(); + } + + /** + * Adds SQL into the SQL array. + * + * @param mixed $sql SQL to Add + * @return boolean TRUE if successful, else FALSE. + * + * @access private + */ + function addSQL( $sql = NULL ) { + if( is_array( $sql ) ) { + foreach( $sql as $line ) { + $this->addSQL( $line ); + } + + return TRUE; + } + + if( is_string( $sql ) ) { + $this->sqlArray[] = $sql; + + // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL. + if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) { + $saved = $this->db->debug; + $this->db->debug = $this->debug; + $ok = $this->db->Execute( $sql ); + $this->db->debug = $saved; + + if( !$ok ) { + if( $this->debug ) { + ADOConnection::outp( $this->db->ErrorMsg() ); + } + + $this->success = 1; + } + } + + return TRUE; + } + + return FALSE; + } + + /** + * Gets the SQL array in the specified format. + * + * @param string $format Format + * @return mixed SQL + * + * @access private + */ + function getSQL( $format = NULL, $sqlArray = NULL ) { + if( !is_array( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + return FALSE; + } + + switch( strtolower( $format ) ) { + case 'string': + case 'text': + return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : ''; + case'html': + return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : ''; + } + + return $this->sqlArray; + } + + /** + * Destroys an adoSchema object. + * + * Call this method to clean up after an adoSchema object that is no longer in use. + * @deprecated adoSchema now cleans up automatically. + */ + function Destroy() { + set_magic_quotes_runtime( $this->mgq ); + unset( $this ); + } +} + +/** +* Message logging function +* +* @access private +*/ +function logMsg( $msg, $title = NULL, $force = FALSE ) { + if( XMLS_DEBUG or $force ) { + echo '
        ';
        +		
        +		if( isset( $title ) ) {
        +			echo '

        ' . htmlentities( $title ) . '

        '; + } + + if( is_object( $this ) ) { + echo '[' . get_class( $this ) . '] '; + } + + print_r( $msg ); + + echo '
        '; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/adodb-xmlschema03.inc.php b/fannie/adodb5/adodb-xmlschema03.inc.php new file mode 100644 index 000000000..cbd49b9d8 --- /dev/null +++ b/fannie/adodb5/adodb-xmlschema03.inc.php @@ -0,0 +1,2404 @@ +parent = $parent; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + + } + + function create() { + return array(); + } + + /** + * Destroys the object + */ + function destroy() { + unset( $this ); + } + + /** + * Checks whether the specified RDBMS is supported by the current + * database object or its ranking ancestor. + * + * @param string $platform RDBMS platform name (from ADODB platform list). + * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE. + */ + function supportedPlatform( $platform = NULL ) { + return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE; + } + + /** + * Returns the prefix set by the ranking ancestor of the database object. + * + * @param string $name Prefix string. + * @return string Prefix. + */ + function prefix( $name = '' ) { + return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name; + } + + /** + * Extracts a field ID from the specified field. + * + * @param string $field Field. + * @return string Field ID. + */ + function FieldID( $field ) { + return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) ); + } +} + +/** +* Creates a table object in ADOdb's datadict format +* +* This class stores information about a database table. As charactaristics +* of the table are loaded from the external source, methods and properties +* of this class are used to build up the table description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbTable extends dbObject { + + /** + * @var string Table name + */ + var $name; + + /** + * @var array Field specifier: Meta-information about each field + */ + var $fields = array(); + + /** + * @var array List of table indexes. + */ + var $indexes = array(); + + /** + * @var array Table options: Table-level options + */ + var $opts = array(); + + /** + * @var string Field index: Keeps track of which field is currently being processed + */ + var $current_field; + + /** + * @var boolean Mark table for destruction + * @access private + */ + var $drop_table; + + /** + * @var boolean Mark field for destruction (not yet implemented) + * @access private + */ + var $drop_field = array(); + + /** + * @var array Platform-specific options + * @access private + */ + var $currentPlatform = true; + + + /** + * Iniitializes a new table object. + * + * @param string $prefix DB Object prefix + * @param array $attributes Array of table attributes. + */ + function dbTable( &$parent, $attributes = NULL ) { + $this->parent = $parent; + $this->name = $this->prefix($attributes['NAME']); + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'INDEX': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addIndex( $attributes ) ); + } + break; + case 'DATA': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addData( $attributes ) ); + } + break; + case 'DROP': + $this->drop(); + break; + case 'FIELD': + // Add a field + $fieldName = $attributes['NAME']; + $fieldType = $attributes['TYPE']; + $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL; + $fieldOpts = !empty( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL; + + $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts ); + break; + case 'KEY': + case 'NOTNULL': + case 'AUTOINCREMENT': + case 'DEFDATE': + case 'DEFTIMESTAMP': + case 'UNSIGNED': + // Add a field option + $this->addFieldOpt( $this->current_field, $this->currentElement ); + break; + case 'DEFAULT': + // Add a field option to the table object + + // Work around ADOdb datadict issue that misinterprets empty strings. + if( $attributes['VALUE'] == '' ) { + $attributes['VALUE'] = " '' "; + } + + $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); + break; + case 'OPT': + case 'CONSTRAINT': + // Accept platform-specific options + $this->currentPlatform = ( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Table/field constraint + case 'CONSTRAINT': + if( isset( $this->current_field ) ) { + $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata ); + } else { + $this->addTableOpt( $cdata ); + } + break; + // Table/field option + case 'OPT': + if( isset( $this->current_field ) ) { + $this->addFieldOpt( $this->current_field, $cdata ); + } else { + $this->addTableOpt( $cdata ); + } + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'TABLE': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + case 'FIELD': + unset($this->current_field); + break; + case 'OPT': + case 'CONSTRAINT': + $this->currentPlatform = true; + break; + default: + + } + } + + /** + * Adds an index to a table object + * + * @param array $attributes Index attributes + * @return object dbIndex object + */ + function addIndex( $attributes ) { + $name = strtoupper( $attributes['NAME'] ); + $this->indexes[$name] = new dbIndex( $this, $attributes ); + return $this->indexes[$name]; + } + + /** + * Adds data to a table object + * + * @param array $attributes Data attributes + * @return object dbData object + */ + function addData( $attributes ) { + if( !isset( $this->data ) ) { + $this->data = new dbData( $this, $attributes ); + } + return $this->data; + } + + /** + * Adds a field to a table object + * + * $name is the name of the table to which the field should be added. + * $type is an ADODB datadict field type. The following field types + * are supported as of ADODB 3.40: + * - C: varchar + * - X: CLOB (character large object) or largest varchar size + * if CLOB is not supported + * - C2: Multibyte varchar + * - X2: Multibyte CLOB + * - B: BLOB (binary large object) + * - D: Date (some databases do not support this, and we return a datetime type) + * - T: Datetime or Timestamp + * - L: Integer field suitable for storing booleans (0 or 1) + * - I: Integer (mapped to I4) + * - I1: 1-byte integer + * - I2: 2-byte integer + * - I4: 4-byte integer + * - I8: 8-byte integer + * - F: Floating point number + * - N: Numeric or decimal number + * + * @param string $name Name of the table to which the field will be added. + * @param string $type ADODB datadict field type. + * @param string $size Field size + * @param array $opts Field options array + * @return array Field specifier array + */ + function addField( $name, $type, $size = NULL, $opts = NULL ) { + $field_id = $this->FieldID( $name ); + + // Set the field index so we know where we are + $this->current_field = $field_id; + + // Set the field name (required) + $this->fields[$field_id]['NAME'] = $name; + + // Set the field type (required) + $this->fields[$field_id]['TYPE'] = $type; + + // Set the field size (optional) + if( isset( $size ) ) { + $this->fields[$field_id]['SIZE'] = $size; + } + + // Set the field options + if( isset( $opts ) ) { + $this->fields[$field_id]['OPTS'] = array($opts); + } else { + $this->fields[$field_id]['OPTS'] = array(); + } + } + + /** + * Adds a field option to the current field specifier + * + * This method adds a field option allowed by the ADOdb datadict + * and appends it to the given field. + * + * @param string $field Field name + * @param string $opt ADOdb field option + * @param mixed $value Field option value + * @return array Field specifier array + */ + function addFieldOpt( $field, $opt, $value = NULL ) { + if( $this->currentPlatform ) { + if( !isset( $value ) ) { + $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt; + // Add the option and value + } else { + $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value ); + } + } + } + + /** + * Adds an option to the table + * + * This method takes a comma-separated list of table-level options + * and appends them to the table object. + * + * @param string $opt Table option + * @return array Options + */ + function addTableOpt( $opt ) { + if(isset($this->currentPlatform)) { + $this->opts[$this->parent->db->databaseType] = $opt; + } + return $this->opts; + } + + + /** + * Generates the SQL that will create the table in the database + * + * @param object $xmls adoSchema object + * @return array Array containing table creation SQL + */ + function create( &$xmls ) { + $sql = array(); + + // drop any existing indexes + if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) { + foreach( $legacy_indexes as $index => $index_details ) { + $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name ); + } + } + + // remove fields to be dropped from table object + foreach( $this->drop_field as $field ) { + unset( $this->fields[$field] ); + } + + // if table exists + if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) { + // drop table + if( $this->drop_table ) { + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + + return $sql; + } + + // drop any existing fields not in schema + foreach( $legacy_fields as $field_id => $field ) { + if( !isset( $this->fields[$field_id] ) ) { + $sql[] = $xmls->dict->DropColumnSQL( $this->name, $field->name ); + } + } + // if table doesn't exist + } else { + if( $this->drop_table ) { + return $sql; + } + + $legacy_fields = array(); + } + + // Loop through the field specifier array, building the associative array for the field options + $fldarray = array(); + + foreach( $this->fields as $field_id => $finfo ) { + // Set an empty size if it isn't supplied + if( !isset( $finfo['SIZE'] ) ) { + $finfo['SIZE'] = ''; + } + + // Initialize the field array with the type and size + $fldarray[$field_id] = array( + 'NAME' => $finfo['NAME'], + 'TYPE' => $finfo['TYPE'], + 'SIZE' => $finfo['SIZE'] + ); + + // Loop through the options array and add the field options. + if( isset( $finfo['OPTS'] ) ) { + foreach( $finfo['OPTS'] as $opt ) { + // Option has an argument. + if( is_array( $opt ) ) { + $key = key( $opt ); + $value = $opt[key( $opt )]; + @$fldarray[$field_id][$key] .= $value; + // Option doesn't have arguments + } else { + $fldarray[$field_id][$opt] = $opt; + } + } + } + } + + if( empty( $legacy_fields ) ) { + // Create the new table + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + logMsg( end( $sql ), 'Generated CreateTableSQL' ); + } else { + // Upgrade an existing table + logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" ); + switch( $xmls->upgrade ) { + // Use ChangeTableSQL + case 'ALTER': + logMsg( 'Generated ChangeTableSQL (ALTERing table)' ); + $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts ); + break; + case 'REPLACE': + logMsg( 'Doing upgrade REPLACE (testing)' ); + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + break; + // ignore table + default: + return array(); + } + } + + foreach( $this->indexes as $index ) { + $sql[] = $index->create( $xmls ); + } + + if( isset( $this->data ) ) { + $sql[] = $this->data->create( $xmls ); + } + + return $sql; + } + + /** + * Marks a field or table for destruction + */ + function drop() { + if( isset( $this->current_field ) ) { + // Drop the current field + logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" ); + // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field ); + $this->drop_field[$this->current_field] = $this->current_field; + } else { + // Drop the current table + logMsg( "Dropping table '{$this->name}'" ); + // $this->drop_table = $xmls->dict->DropTableSQL( $this->name ); + $this->drop_table = TRUE; + } + } +} + +/** +* Creates an index object in ADOdb's datadict format +* +* This class stores information about a database index. As charactaristics +* of the index are loaded from the external source, methods and properties +* of this class are used to build up the index description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbIndex extends dbObject { + + /** + * @var string Index name + */ + var $name; + + /** + * @var array Index options: Index-level options + */ + var $opts = array(); + + /** + * @var array Indexed fields: Table columns included in this index + */ + var $columns = array(); + + /** + * @var boolean Mark index for destruction + * @access private + */ + var $drop = FALSE; + + /** + * Initializes the new dbIndex object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbIndex( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + $this->name = $this->prefix ($attributes['NAME']); + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'DROP': + $this->drop(); + break; + case 'CLUSTERED': + case 'BITMAP': + case 'UNIQUE': + case 'FULLTEXT': + case 'HASH': + // Add index Option + $this->addIndexOpt( $this->currentElement ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'COL': + $this->addField( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'INDEX': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the index + * + * @param string $name Field name + * @return string Field list + */ + function addField( $name ) { + $this->columns[$this->FieldID( $name )] = $name; + + // Return the field list + return $this->columns; + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addIndexOpt( $opt ) { + $this->opts[] = $opt; + + // Return the options list + return $this->opts; + } + + /** + * Generates the SQL that will create the index in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + if( $this->drop ) { + return NULL; + } + + // eliminate any columns that aren't in the table + foreach( $this->columns as $id => $col ) { + if( !isset( $this->parent->fields[$id] ) ) { + unset( $this->columns[$id] ); + } + } + + return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts ); + } + + /** + * Marks an index for destruction + */ + function drop() { + $this->drop = TRUE; + } +} + +/** +* Creates a data object in ADOdb's datadict format +* +* This class stores information about table data, and is called +* when we need to load field data into a table. +* +* @package axmls +* @access private +*/ +class dbData extends dbObject { + + var $data = array(); + + var $row; + + /** + * Initializes the new dbData object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbData( &$parent, $attributes = NULL ) { + $this->parent = $parent; + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: ROW and F (field). + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'ROW': + $this->row = count( $this->data ); + $this->data[$this->row] = array(); + break; + case 'F': + $this->addField($attributes); + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'F': + $this->addData( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'DATA': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the insert + * + * @param string $name Field name + * @return string Field list + */ + function addField( $attributes ) { + // check we're in a valid row + if( !isset( $this->row ) || !isset( $this->data[$this->row] ) ) { + return; + } + + // Set the field index so we know where we are + if( isset( $attributes['NAME'] ) ) { + $this->current_field = $this->FieldID( $attributes['NAME'] ); + } else { + $this->current_field = count( $this->data[$this->row] ); + } + + // initialise data + if( !isset( $this->data[$this->row][$this->current_field] ) ) { + $this->data[$this->row][$this->current_field] = ''; + } + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addData( $cdata ) { + // check we're in a valid field + if ( isset( $this->data[$this->row][$this->current_field] ) ) { + // add data to field + $this->data[$this->row][$this->current_field] .= $cdata; + } + } + + /** + * Generates the SQL that will add/update the data in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + $table = $xmls->dict->TableName($this->parent->name); + $table_field_count = count($this->parent->fields); + $tables = $xmls->db->MetaTables(); + $sql = array(); + + $ukeys = $xmls->db->MetaPrimaryKeys( $table ); + if( !empty( $this->parent->indexes ) and !empty( $ukeys ) ) { + foreach( $this->parent->indexes as $indexObj ) { + if( !in_array( $indexObj->name, $ukeys ) ) $ukeys[] = $indexObj->name; + } + } + + // eliminate any columns that aren't in the table + foreach( $this->data as $row ) { + $table_fields = $this->parent->fields; + $fields = array(); + $rawfields = array(); // Need to keep some of the unprocessed data on hand. + + foreach( $row as $field_id => $field_data ) { + if( !array_key_exists( $field_id, $table_fields ) ) { + if( is_numeric( $field_id ) ) { + $field_id = reset( array_keys( $table_fields ) ); + } else { + continue; + } + } + + $name = $table_fields[$field_id]['NAME']; + + switch( $table_fields[$field_id]['TYPE'] ) { + case 'I': + case 'I1': + case 'I2': + case 'I4': + case 'I8': + $fields[$name] = intval($field_data); + break; + case 'C': + case 'C2': + case 'X': + case 'X2': + default: + $fields[$name] = $xmls->db->qstr( $field_data ); + $rawfields[$name] = $field_data; + } + + unset($table_fields[$field_id]); + + } + + // check that at least 1 column is specified + if( empty( $fields ) ) { + continue; + } + + // check that no required columns are missing + if( count( $fields ) < $table_field_count ) { + foreach( $table_fields as $field ) { + if( isset( $field['OPTS'] ) and ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) { + continue(2); + } + } + } + + // The rest of this method deals with updating existing data records. + + if( !in_array( $table, $tables ) or ( $mode = $xmls->existingData() ) == XMLS_MODE_INSERT ) { + // Table doesn't yet exist, so it's safe to insert. + logMsg( "$table doesn't exist, inserting or mode is INSERT" ); + $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; + continue; + } + + // Prepare to test for potential violations. Get primary keys and unique indexes + $mfields = array_merge( $fields, $rawfields ); + $keyFields = array_intersect( $ukeys, array_keys( $mfields ) ); + + if( empty( $ukeys ) or count( $keyFields ) == 0 ) { + // No unique keys in schema, so safe to insert + logMsg( "Either schema or data has no unique keys, so safe to insert" ); + $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; + continue; + } + + // Select record containing matching unique keys. + $where = ''; + foreach( $ukeys as $key ) { + if( isset( $mfields[$key] ) and $mfields[$key] ) { + if( $where ) $where .= ' AND '; + $where .= $key . ' = ' . $xmls->db->qstr( $mfields[$key] ); + } + } + $records = $xmls->db->Execute( 'SELECT * FROM ' . $table . ' WHERE ' . $where ); + switch( $records->RecordCount() ) { + case 0: + // No matching record, so safe to insert. + logMsg( "No matching records. Inserting new row with unique data" ); + $sql[] = $xmls->db->GetInsertSQL( $records, $mfields ); + break; + case 1: + // Exactly one matching record, so we can update if the mode permits. + logMsg( "One matching record..." ); + if( $mode == XMLS_MODE_UPDATE ) { + logMsg( "...Updating existing row from unique data" ); + $sql[] = $xmls->db->GetUpdateSQL( $records, $mfields ); + } + break; + default: + // More than one matching record; the result is ambiguous, so we must ignore the row. + logMsg( "More than one matching record. Ignoring row." ); + } + } + return $sql; + } +} + +/** +* Creates the SQL to execute a list of provided SQL queries +* +* @package axmls +* @access private +*/ +class dbQuerySet extends dbObject { + + /** + * @var array List of SQL queries + */ + var $queries = array(); + + /** + * @var string String used to build of a query line by line + */ + var $query; + + /** + * @var string Query prefix key + */ + var $prefixKey = ''; + + /** + * @var boolean Auto prefix enable (TRUE) + */ + var $prefixMethod = 'AUTO'; + + /** + * Initializes the query set. + * + * @param object $parent Parent object + * @param array $attributes Attributes + */ + function dbQuerySet( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + // Overrides the manual prefix key + if( isset( $attributes['KEY'] ) ) { + $this->prefixKey = $attributes['KEY']; + } + + $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : ''; + + // Enables or disables automatic prefix prepending + switch( $prefixMethod ) { + case 'AUTO': + $this->prefixMethod = 'AUTO'; + break; + case 'MANUAL': + $this->prefixMethod = 'MANUAL'; + break; + case 'NONE': + $this->prefixMethod = 'NONE'; + break; + } + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: QUERY. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'QUERY': + // Create a new query in a SQL queryset. + // Ignore this query set if a platform is specified and it's different than the + // current connection platform. + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->newQuery(); + } else { + $this->discardQuery(); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Line of queryset SQL data + case 'QUERY': + $this->buildQuery( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'QUERY': + // Add the finished query to the open query set. + $this->addQuery(); + break; + case 'SQL': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + default: + + } + } + + /** + * Re-initializes the query. + * + * @return boolean TRUE + */ + function newQuery() { + $this->query = ''; + + return TRUE; + } + + /** + * Discards the existing query. + * + * @return boolean TRUE + */ + function discardQuery() { + unset( $this->query ); + + return TRUE; + } + + /** + * Appends a line to a query that is being built line by line + * + * @param string $data Line of SQL data or NULL to initialize a new query + * @return string SQL query string. + */ + function buildQuery( $sql = NULL ) { + if( !isset( $this->query ) OR empty( $sql ) ) { + return FALSE; + } + + $this->query .= $sql; + + return $this->query; + } + + /** + * Adds a completed query to the query list + * + * @return string SQL of added query + */ + function addQuery() { + if( !isset( $this->query ) ) { + return FALSE; + } + + $this->queries[] = $return = trim($this->query); + + unset( $this->query ); + + return $return; + } + + /** + * Creates and returns the current query set + * + * @param object $xmls adoSchema object + * @return array Query set + */ + function create( &$xmls ) { + foreach( $this->queries as $id => $query ) { + switch( $this->prefixMethod ) { + case 'AUTO': + // Enable auto prefix replacement + + // Process object prefix. + // Evaluate SQL statements to prepend prefix to objects + $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + + // SELECT statements aren't working yet + #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); + + case 'MANUAL': + // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX. + // If prefixKey is not set, we use the default constant XMLS_PREFIX + if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) { + // Enable prefix override + $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query ); + } else { + // Use default replacement + $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query ); + } + } + + $this->queries[$id] = trim( $query ); + } + + // Return the query set array + return $this->queries; + } + + /** + * Rebuilds the query with the prefix attached to any objects + * + * @param string $regex Regex used to add prefix + * @param string $query SQL query string + * @param string $prefix Prefix to be appended to tables, indices, etc. + * @return string Prefixed SQL query string. + */ + function prefixQuery( $regex, $query, $prefix = NULL ) { + if( !isset( $prefix ) ) { + return $query; + } + + if( preg_match( $regex, $query, $match ) ) { + $preamble = $match[1]; + $postamble = $match[5]; + $objectList = explode( ',', $match[3] ); + // $prefix = $prefix . '_'; + + $prefixedList = ''; + + foreach( $objectList as $object ) { + if( $prefixedList !== '' ) { + $prefixedList .= ', '; + } + + $prefixedList .= $prefix . trim( $object ); + } + + $query = $preamble . ' ' . $prefixedList . ' ' . $postamble; + } + + return $query; + } +} + +/** +* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements +* +* This class is used to load and parse the XML file, to create an array of SQL statements +* that can be used to build a database, and to build the database using the SQL array. +* +* @tutorial getting_started.pkg +* +* @author Richard Tango-Lowy & Dan Cech +* @version $Revision: 1.62 $ +* +* @package axmls +*/ +class adoSchema { + + /** + * @var array Array containing SQL queries to generate all objects + * @access private + */ + var $sqlArray; + + /** + * @var object ADOdb connection object + * @access private + */ + var $db; + + /** + * @var object ADOdb Data Dictionary + * @access private + */ + var $dict; + + /** + * @var string Current XML element + * @access private + */ + var $currentElement = ''; + + /** + * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database + * @access private + */ + var $upgrade = ''; + + /** + * @var string Optional object prefix + * @access private + */ + var $objectPrefix = ''; + + /** + * @var long Original Magic Quotes Runtime value + * @access private + */ + var $mgq; + + /** + * @var long System debug + * @access private + */ + var $debug; + + /** + * @var string Regular expression to find schema version + * @access private + */ + var $versionRegex = '//'; + + /** + * @var string Current schema version + * @access private + */ + var $schemaVersion; + + /** + * @var int Success of last Schema execution + */ + var $success; + + /** + * @var bool Execute SQL inline as it is generated + */ + var $executeInline; + + /** + * @var bool Continue SQL execution if errors occur + */ + var $continueOnError; + + /** + * @var int How to handle existing data rows (insert, update, or ignore) + */ + var $existingData; + + /** + * Creates an adoSchema object + * + * Creating an adoSchema object is the first step in processing an XML schema. + * The only parameter is an ADOdb database connection object, which must already + * have been created. + * + * @param object $db ADOdb database connection object. + */ + function adoSchema( &$db ) { + // Initialize the environment + $this->mgq = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + + $this->db = $db; + $this->debug = $this->db->debug; + $this->dict = NewDataDictionary( $this->db ); + $this->sqlArray = array(); + $this->schemaVersion = XMLS_SCHEMA_VERSION; + $this->executeInline( XMLS_EXECUTE_INLINE ); + $this->continueOnError( XMLS_CONTINUE_ON_ERROR ); + $this->existingData( XMLS_EXISTING_DATA ); + $this->setUpgradeMethod(); + } + + /** + * Sets the method to be used for upgrading an existing database + * + * Use this method to specify how existing database objects should be upgraded. + * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to + * alter each database object directly, REPLACE attempts to rebuild each object + * from scratch, BEST attempts to determine the best upgrade method for each + * object, and NONE disables upgrading. + * + * This method is not yet used by AXMLS, but exists for backward compatibility. + * The ALTER method is automatically assumed when the adoSchema object is + * instantiated; other upgrade methods are not currently supported. + * + * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE) + * @returns string Upgrade method used + */ + function SetUpgradeMethod( $method = '' ) { + if( !is_string( $method ) ) { + return FALSE; + } + + $method = strtoupper( $method ); + + // Handle the upgrade methods + switch( $method ) { + case 'ALTER': + $this->upgrade = $method; + break; + case 'REPLACE': + $this->upgrade = $method; + break; + case 'BEST': + $this->upgrade = 'ALTER'; + break; + case 'NONE': + $this->upgrade = 'NONE'; + break; + default: + // Use default if no legitimate method is passed. + $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD; + } + + return $this->upgrade; + } + + /** + * Specifies how to handle existing data row when there is a unique key conflict. + * + * The existingData setting specifies how the parser should handle existing rows + * when a unique key violation occurs during the insert. This can happen when inserting + * data into an existing table with one or more primary keys or unique indexes. + * The existingData method takes one of three options: XMLS_MODE_INSERT attempts + * to always insert the data as a new row. In the event of a unique key violation, + * the database will generate an error. XMLS_MODE_UPDATE attempts to update the + * any existing rows with the new data based upon primary or unique key fields in + * the schema. If the data row in the schema specifies no unique fields, the row + * data will be inserted as a new row. XMLS_MODE_IGNORE specifies that any data rows + * that would result in a unique key violation be ignored; no inserts or updates will + * take place. For backward compatibility, the default setting is XMLS_MODE_INSERT, + * but XMLS_MODE_UPDATE will generally be the most appropriate setting. + * + * @param int $mode XMLS_MODE_INSERT, XMLS_MODE_UPDATE, or XMLS_MODE_IGNORE + * @return int current mode + */ + function ExistingData( $mode = NULL ) { + if( is_int( $mode ) ) { + switch( $mode ) { + case XMLS_MODE_UPDATE: + $mode = XMLS_MODE_UPDATE; + break; + case XMLS_MODE_IGNORE: + $mode = XMLS_MODE_IGNORE; + break; + case XMLS_MODE_INSERT: + $mode = XMLS_MODE_INSERT; + break; + default: + $mode = XMLS_EXISTING_DATA; + break; + } + $this->existingData = $mode; + } + + return $this->existingData; + } + + /** + * Enables/disables inline SQL execution. + * + * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution), + * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode + * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema() + * to apply the schema to the database. + * + * @param bool $mode execute + * @return bool current execution mode + * + * @see ParseSchema(), ExecuteSchema() + */ + function ExecuteInline( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->executeInline = $mode; + } + + return $this->executeInline; + } + + /** + * Enables/disables SQL continue on error. + * + * Call this method to enable or disable continuation of SQL execution if an error occurs. + * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs. + * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing + * of the schema will continue. + * + * @param bool $mode execute + * @return bool current continueOnError mode + * + * @see addSQL(), ExecuteSchema() + */ + function ContinueOnError( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->continueOnError = $mode; + } + + return $this->continueOnError; + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to create the database + * described. This method automatically converts the schema to the latest + * axmls schema version. + * @see ParseSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function ParseSchema( $filename, $returnSchema = FALSE ) { + return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema directly from a file (see + * the DTD for the proper format) and generate the SQL necessary to create + * the database described by the schema. Use this method when you are dealing + * with large schema files. Otherwise, ParseSchema() is faster. + * This method does not automatically convert the schema to the latest axmls + * schema version. You must convert the schema manually using either the + * ConvertSchemaFile() or ConvertSchemaString() method. + * @see ParseSchema() + * @see ConvertSchemaFile() + * @see ConvertSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + * + * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() + * @see ParseSchema(), ParseSchemaString() + */ + function ParseSchemaFile( $filename, $returnSchema = FALSE ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + logMsg( 'Unable to open file' ); + return FALSE; + } + + // do version detection here + if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) { + logMsg( 'Invalid Schema Version' ); + return FALSE; + } + + if( $returnSchema ) { + $xmlstring = ''; + while( $data = fread( $fp, 4096 ) ) { + $xmlstring .= $data . "\n"; + } + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Converts an XML schema string to SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to create the database described by the schema. + * @see ParseSchema() + * + * @param string $xmlstring XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + logMsg( 'Empty or Invalid Schema' ); + return FALSE; + } + + // do version detection here + if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) { + logMsg( 'Invalid Schema Version' ); + return FALSE; + } + + if( $returnSchema ) { + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Loads an XML schema from a file and converts it to uninstallation SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to remove the database described. + * @see RemoveSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function RemoveSchema( $filename, $returnSchema = FALSE ) { + return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Converts an XML schema string to uninstallation SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to uninstall the database described by the schema. + * @see RemoveSchema() + * + * @param string $schema XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function RemoveSchemaString( $schema, $returnSchema = FALSE ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema ); + } + + /** + * Applies the current XML schema to the database (post execution). + * + * Call this method to apply the current schema (generally created by calling + * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes, + * and executing other SQL specified in the schema) after parsing. + * @see ParseSchema(), ParseSchemaString(), ExecuteInline() + * + * @param array $sqlArray Array of SQL statements that will be applied rather than + * the current schema. + * @param boolean $continueOnErr Continue to apply the schema even if an error occurs. + * @returns integer 0 if failure, 1 if errors, 2 if successful. + */ + function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) { + if( !is_bool( $continueOnErr ) ) { + $continueOnErr = $this->ContinueOnError(); + } + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + $this->success = 0; + } else { + $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr ); + } + + return $this->success; + } + + /** + * Returns the current SQL array. + * + * Call this method to fetch the array of SQL queries resulting from + * ParseSchema() or ParseSchemaString(). + * + * @param string $format Format: HTML, TEXT, or NONE (PHP array) + * @return array Array of SQL statements or FALSE if an error occurs + */ + function PrintSQL( $format = 'NONE' ) { + $sqlArray = null; + return $this->getSQL( $format, $sqlArray ); + } + + /** + * Saves the current SQL array to the local filesystem as a list of SQL queries. + * + * Call this method to save the array of SQL queries (generally resulting from a + * parsed XML schema) to the filesystem. + * + * @param string $filename Path and name where the file should be saved. + * @return boolean TRUE if save is successful, else FALSE. + */ + function SaveSQL( $filename = './schema.sql' ) { + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + if( !isset( $sqlArray ) ) { + return FALSE; + } + + $fp = fopen( $filename, "w" ); + + foreach( $sqlArray as $key => $query ) { + fwrite( $fp, $query . ";\n" ); + } + fclose( $fp ); + } + + /** + * Create an xml parser + * + * @return object PHP XML parser object + * + * @access private + */ + function create_parser() { + // Create the parser + $xmlParser = xml_parser_create(); + xml_set_object( $xmlParser, $this ); + + // Initialize the XML callback functions + xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' ); + xml_set_character_data_handler( $xmlParser, '_tag_cdata' ); + + return $xmlParser; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + switch( strtoupper( $tag ) ) { + case 'TABLE': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->obj = new dbTable( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + } + break; + case 'SQL': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->obj = new dbQuerySet( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + } + + /** + * XML Callback to process end elements + * + * @access private + * @internal + */ + function _tag_close( &$parser, $tag ) { + + } + + /** + * Converts an XML schema string to the specified DTD version. + * + * Call this method to convert a string containing an XML schema to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaFile() + * + * @param string $schema String containing XML schema that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = $schema; + } else { + $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + /* + // compat for pre-4.3 - jlim + function _file_get_contents($path) + { + if (function_exists('file_get_contents')) return file_get_contents($path); + return join('',file($path)); + }*/ + + /** + * Converts an XML schema file to the specified DTD version. + * + * Call this method to convert the specified XML schema file to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaString() + * + * @param string $filename Name of XML schema file that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaFileVersion( $filename ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = _file_get_contents( $filename ); + + // remove unicode BOM if present + if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) { + $result = substr( $result, 3 ); + } + } else { + $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' ); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + function TransformSchema( $schema, $xsl, $schematype='string' ) + { + // Fail if XSLT extension is not available + if( ! function_exists( 'xslt_create' ) ) { + return FALSE; + } + + $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl'; + + // look for xsl + if( !is_readable( $xsl_file ) ) { + return FALSE; + } + + switch( $schematype ) + { + case 'file': + if( !is_readable( $schema ) ) { + return FALSE; + } + + $schema = _file_get_contents( $schema ); + break; + case 'string': + default: + if( !is_string( $schema ) ) { + return FALSE; + } + } + + $arguments = array ( + '/_xml' => $schema, + '/_xsl' => _file_get_contents( $xsl_file ) + ); + + // create an XSLT processor + $xh = xslt_create (); + + // set error handler + xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler')); + + // process the schema + $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); + + xslt_free ($xh); + + return $result; + } + + /** + * Processes XSLT transformation errors + * + * @param object $parser XML parser object + * @param integer $errno Error number + * @param integer $level Error level + * @param array $fields Error information fields + * + * @access private + */ + function xslt_error_handler( $parser, $errno, $level, $fields ) { + if( is_array( $fields ) ) { + $msg = array( + 'Message Type' => ucfirst( $fields['msgtype'] ), + 'Message Code' => $fields['code'], + 'Message' => $fields['msg'], + 'Error Number' => $errno, + 'Level' => $level + ); + + switch( $fields['URI'] ) { + case 'arg:/_xml': + $msg['Input'] = 'XML'; + break; + case 'arg:/_xsl': + $msg['Input'] = 'XSL'; + break; + default: + $msg['Input'] = $fields['URI']; + } + + $msg['Line'] = $fields['line']; + } else { + $msg = array( + 'Message Type' => 'Error', + 'Error Number' => $errno, + 'Level' => $level, + 'Fields' => var_export( $fields, TRUE ) + ); + } + + $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n" + . '' . "\n"; + + foreach( $msg as $label => $details ) { + $error_details .= '' . "\n"; + } + + $error_details .= '
        ' . $label . ': ' . htmlentities( $details ) . '
        '; + + trigger_error( $error_details, E_USER_ERROR ); + } + + /** + * Returns the AXMLS Schema Version of the requested XML schema file. + * + * Call this method to obtain the AXMLS DTD version of the requested XML schema file. + * @see SchemaStringVersion() + * + * @param string $filename AXMLS schema file + * @return string Schema version number or FALSE on error + */ + function SchemaFileVersion( $filename ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + // die( 'Unable to open file' ); + return FALSE; + } + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( preg_match( $this->versionRegex, $data, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + } + + return FALSE; + } + + /** + * Returns the AXMLS Schema Version of the provided XML schema string. + * + * Call this method to obtain the AXMLS DTD version of the provided XML schema string. + * @see SchemaFileVersion() + * + * @param string $xmlstring XML schema string + * @return string Schema version number or FALSE on error + */ + function SchemaStringVersion( $xmlstring ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + return FALSE; + } + + if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + + return FALSE; + } + + /** + * Extracts an XML schema from an existing database. + * + * Call this method to create an XML schema string from an existing database. + * If the data parameter is set to TRUE, AXMLS will include the data from the database + * in the schema. + * + * @param boolean $data Include data in schema dump + * @indent string indentation to use + * @prefix string extract only tables with given prefix + * @stripprefix strip prefix string when storing in XML schema + * @return string Generated XML schema + */ + function ExtractSchema( $data = FALSE, $indent = ' ', $prefix = '' , $stripprefix=false) { + $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM ); + + $schema = '' . "\n" + . '' . "\n"; + + if( is_array( $tables = $this->db->MetaTables( 'TABLES' , ($prefix) ? $prefix.'%' : '') ) ) { + foreach( $tables as $table ) { + if ($stripprefix) $table = str_replace(str_replace('\\_', '_', $pfx ), '', $table); + $schema .= $indent . '' . "\n"; + + // grab details from database + $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE -1' ); + $fields = $this->db->MetaColumns( $table ); + $indexes = $this->db->MetaIndexes( $table ); + + if( is_array( $fields ) ) { + foreach( $fields as $details ) { + $extra = ''; + $content = array(); + + if( isset($details->max_length) && $details->max_length > 0 ) { + $extra .= ' size="' . $details->max_length . '"'; + } + + if( isset($details->primary_key) && $details->primary_key ) { + $content[] = ''; + } elseif( isset($details->not_null) && $details->not_null ) { + $content[] = ''; + } + + if( isset($details->has_default) && $details->has_default ) { + $content[] = ''; + } + + if( isset($details->auto_increment) && $details->auto_increment ) { + $content[] = ''; + } + + if( isset($details->unsigned) && $details->unsigned ) { + $content[] = ''; + } + + // this stops the creation of 'R' columns, + // AUTOINCREMENT is used to create auto columns + $details->primary_key = 0; + $type = $rs->MetaType( $details ); + + $schema .= str_repeat( $indent, 2 ) . '' . "\n"; + } else { + $schema .= "/>\n"; + } + } + } + + if( is_array( $indexes ) ) { + foreach( $indexes as $index => $details ) { + $schema .= str_repeat( $indent, 2 ) . '' . "\n"; + + if( $details['unique'] ) { + $schema .= str_repeat( $indent, 3 ) . '' . "\n"; + } + + foreach( $details['columns'] as $column ) { + $schema .= str_repeat( $indent, 3 ) . '' . htmlentities( $column ) . '' . "\n"; + } + + $schema .= str_repeat( $indent, 2 ) . '' . "\n"; + } + } + + if( $data ) { + $rs = $this->db->Execute( 'SELECT * FROM ' . $table ); + + if( is_object( $rs ) && !$rs->EOF ) { + $schema .= str_repeat( $indent, 2 ) . "\n"; + + while( $row = $rs->FetchRow() ) { + foreach( $row as $key => $val ) { + if ( $val != htmlentities( $val ) ) { + $row[$key] = ''; + } + } + + $schema .= str_repeat( $indent, 3 ) . '' . implode( '', $row ) . "\n"; + } + + $schema .= str_repeat( $indent, 2 ) . "\n"; + } + } + + $schema .= $indent . "
        \n"; + } + } + + $this->db->SetFetchMode( $old_mode ); + + $schema .= '
        '; + return $schema; + } + + /** + * Sets a prefix for database objects + * + * Call this method to set a standard prefix that will be prepended to all database tables + * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix. + * + * @param string $prefix Prefix that will be prepended. + * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix. + * @return boolean TRUE if successful, else FALSE + */ + function SetPrefix( $prefix = '', $underscore = TRUE ) { + switch( TRUE ) { + // clear prefix + case empty( $prefix ): + logMsg( 'Cleared prefix' ); + $this->objectPrefix = ''; + return TRUE; + // prefix too long + case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: + // prefix contains invalid characters + case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ): + logMsg( 'Invalid prefix: ' . $prefix ); + return FALSE; + } + + if( $underscore AND substr( $prefix, -1 ) != '_' ) { + $prefix .= '_'; + } + + // prefix valid + logMsg( 'Set prefix: ' . $prefix ); + $this->objectPrefix = $prefix; + return TRUE; + } + + /** + * Returns an object name with the current prefix prepended. + * + * @param string $name Name + * @return string Prefixed name + * + * @access private + */ + function prefix( $name = '' ) { + // if prefix is set + if( !empty( $this->objectPrefix ) ) { + // Prepend the object prefix to the table name + // prepend after quote if used + return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name ); + } + + // No prefix set. Use name provided. + return $name; + } + + /** + * Checks if element references a specific platform + * + * @param string $platform Requested platform + * @returns boolean TRUE if platform check succeeds + * + * @access private + */ + function supportedPlatform( $platform = NULL ) { + if( !empty( $platform ) ) { + $regex = '/(^|\|)' . $this->db->databaseType . '(\||$)/i'; + + if( preg_match( '/^- /', $platform ) ) { + if (preg_match ( $regex, substr( $platform, 2 ) ) ) { + logMsg( 'Platform ' . $platform . ' is NOT supported' ); + return FALSE; + } + } else { + if( !preg_match ( $regex, $platform ) ) { + logMsg( 'Platform ' . $platform . ' is NOT supported' ); + return FALSE; + } + } + } + + logMsg( 'Platform ' . $platform . ' is supported' ); + return TRUE; + } + + /** + * Clears the array of generated SQL. + * + * @access private + */ + function clearSQL() { + $this->sqlArray = array(); + } + + /** + * Adds SQL into the SQL array. + * + * @param mixed $sql SQL to Add + * @return boolean TRUE if successful, else FALSE. + * + * @access private + */ + function addSQL( $sql = NULL ) { + if( is_array( $sql ) ) { + foreach( $sql as $line ) { + $this->addSQL( $line ); + } + + return TRUE; + } + + if( is_string( $sql ) ) { + $this->sqlArray[] = $sql; + + // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL. + if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) { + $saved = $this->db->debug; + $this->db->debug = $this->debug; + $ok = $this->db->Execute( $sql ); + $this->db->debug = $saved; + + if( !$ok ) { + if( $this->debug ) { + ADOConnection::outp( $this->db->ErrorMsg() ); + } + + $this->success = 1; + } + } + + return TRUE; + } + + return FALSE; + } + + /** + * Gets the SQL array in the specified format. + * + * @param string $format Format + * @return mixed SQL + * + * @access private + */ + function getSQL( $format = NULL, $sqlArray = NULL ) { + if( !is_array( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + return FALSE; + } + + switch( strtolower( $format ) ) { + case 'string': + case 'text': + return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : ''; + case'html': + return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : ''; + } + + return $this->sqlArray; + } + + /** + * Destroys an adoSchema object. + * + * Call this method to clean up after an adoSchema object that is no longer in use. + * @deprecated adoSchema now cleans up automatically. + */ + function Destroy() { + set_magic_quotes_runtime( $this->mgq ); + unset( $this ); + } +} + +/** +* Message logging function +* +* @access private +*/ +function logMsg( $msg, $title = NULL, $force = FALSE ) { + if( XMLS_DEBUG or $force ) { + echo '
        ';
        +		
        +		if( isset( $title ) ) {
        +			echo '

        ' . htmlentities( $title ) . '

        '; + } + + if( @is_object( $this ) ) { + echo '[' . get_class( $this ) . '] '; + } + + print_r( $msg ); + + echo '
        '; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/adodb.inc.php b/fannie/adodb5/adodb.inc.php new file mode 100644 index 000000000..02b375aeb --- /dev/null +++ b/fannie/adodb5/adodb.inc.php @@ -0,0 +1,4400 @@ +fields is available on EOF + $ADODB_FETCH_MODE, // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default... + $ADODB_GETONE_EOF, + $ADODB_QUOTE_FIELDNAMES; // Allows you to force quotes (backticks) around field names in queries generated by getinsertsql and getupdatesql. + + //============================================================================================== + // GLOBAL SETUP + //============================================================================================== + + $ADODB_EXTENSION = defined('ADODB_EXTENSION'); + + //********************************************************// + /* + Controls $ADODB_FORCE_TYPE mode. Default is ADODB_FORCE_VALUE (3). + Used in GetUpdateSql and GetInsertSql functions. Thx to Niko, nuko#mbnet.fi + + 0 = ignore empty fields. All empty fields in array are ignored. + 1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values. + 2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values. + 3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and empty fields '' are set to empty '' sql values. + */ + define('ADODB_FORCE_IGNORE',0); + define('ADODB_FORCE_NULL',1); + define('ADODB_FORCE_EMPTY',2); + define('ADODB_FORCE_VALUE',3); + //********************************************************// + + + if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) { + + define('ADODB_BAD_RS','

        Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;

        '); + + // allow [ ] @ ` " and . in table names + define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)'); + + // prefetching used by oracle + if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10); + + + /* + Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names. + This currently works only with mssql, odbc, oci8po and ibase derived drivers. + + 0 = assoc lowercase field names. $rs->fields['orderid'] + 1 = assoc uppercase field names. $rs->fields['ORDERID'] + 2 = use native-case field names. $rs->fields['OrderID'] + */ + + define('ADODB_FETCH_DEFAULT',0); + define('ADODB_FETCH_NUM',1); + define('ADODB_FETCH_ASSOC',2); + define('ADODB_FETCH_BOTH',3); + + if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100); + + // PHP's version scheme makes converting to numbers difficult - workaround + $_adodb_ver = (float) PHP_VERSION; + if ($_adodb_ver >= 5.2) { + define('ADODB_PHPVER',0x5200); + } else if ($_adodb_ver >= 5.0) { + define('ADODB_PHPVER',0x5000); + } else + die("PHP5 or later required. You are running ".PHP_VERSION); + } + + + //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); + + + /** + Accepts $src and $dest arrays, replacing string $data + */ + function ADODB_str_replace($src, $dest, $data) + { + if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data); + + $s = reset($src); + $d = reset($dest); + while ($s !== false) { + $data = str_replace($s,$d,$data); + $s = next($src); + $d = next($dest); + } + return $data; + } + + function ADODB_Setup() + { + GLOBAL + $ADODB_vers, // database version + $ADODB_COUNTRECS, // count number of records returned - slows down query + $ADODB_CACHE_DIR, // directory to cache recordsets + $ADODB_FETCH_MODE, + $ADODB_CACHE, + $ADODB_CACHE_CLASS, + $ADODB_FORCE_TYPE, + $ADODB_GETONE_EOF, + $ADODB_QUOTE_FIELDNAMES; + + if (empty($ADODB_CACHE_CLASS)) $ADODB_CACHE_CLASS = 'ADODB_Cache_File' ; + $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT; + $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE; + $ADODB_GETONE_EOF = null; + + if (!isset($ADODB_CACHE_DIR)) { + $ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp'; + } else { + // do not accept url based paths, eg. http:/ or ftp:/ + if (strpos($ADODB_CACHE_DIR,'://') !== false) + die("Illegal path http:// or ftp://"); + } + + + // Initialize random number generator for randomizing cache flushes + // -- note Since PHP 4.2.0, the seed becomes optional and defaults to a random value if omitted. + srand(((double)microtime())*1000000); + + /** + * ADODB version as a string. + */ + $ADODB_vers = 'V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. Released BSD & LGPL.'; + + /** + * Determines whether recordset->RecordCount() is used. + * Set to false for highest performance -- RecordCount() will always return -1 then + * for databases that provide "virtual" recordcounts... + */ + if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true; + } + + + //============================================================================================== + // CHANGE NOTHING BELOW UNLESS YOU ARE DESIGNING ADODB + //============================================================================================== + + ADODB_Setup(); + + //============================================================================================== + // CLASS ADOFieldObject + //============================================================================================== + /** + * Helper class for FetchFields -- holds info on a column + */ + class ADOFieldObject { + var $name = ''; + var $max_length=0; + var $type=""; +/* + // additional fields by dannym... (danny_milo@yahoo.com) + var $not_null = false; + // actually, this has already been built-in in the postgres, fbsql AND mysql module? ^-^ + // so we can as well make not_null standard (leaving it at "false" does not harm anyways) + + var $has_default = false; // this one I have done only in mysql and postgres for now ... + // others to come (dannym) + var $default_value; // default, if any, and supported. Check has_default first. +*/ + } + + // for transaction handling + + function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection) + { + //print "Errorno ($fn errno=$errno m=$errmsg) "; + $thisConnection->_transOK = false; + if ($thisConnection->_oldRaiseFn) { + $fn = $thisConnection->_oldRaiseFn; + $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection); + } + } + + //------------------ + // class for caching + class ADODB_Cache_File { + + var $createdir = true; // requires creation of temp dirs + + function ADODB_Cache_File() + { + global $ADODB_INCLUDED_CSV; + if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); + } + + // write serialised recordset to cache item/file + function writecache($filename, $contents, $debug, $secs2cache) + { + return adodb_write_file($filename, $contents,$debug); + } + + // load serialised recordset and unserialise it + function &readcache($filename, &$err, $secs2cache, $rsClass) + { + $rs = csv2rs($filename,$err,$secs2cache,$rsClass); + return $rs; + } + + // flush all items in cache + function flushall($debug=false) + { + global $ADODB_CACHE_DIR; + + $rez = false; + + if (strlen($ADODB_CACHE_DIR) > 1) { + $rez = $this->_dirFlush($ADODB_CACHE_DIR); + if ($debug) ADOConnection::outp( "flushall: $dir
        \n". $rez."
        "); + } + return $rez; + } + + // flush one file in cache + function flushcache($f, $debug=false) + { + if (!@unlink($f)) { + if ($debug) ADOConnection::outp( "flushcache: failed for $f"); + } + } + + function getdirname($hash) + { + global $ADODB_CACHE_DIR; + if (!isset($this->notSafeMode)) $this->notSafeMode = !ini_get('safe_mode'); + return ($this->notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($hash,0,2) : $ADODB_CACHE_DIR; + } + + // create temp directories + function createdir($hash, $debug) + { + $dir = $this->getdirname($hash); + if ($this->notSafeMode && !file_exists($dir)) { + $oldu = umask(0); + if (!@mkdir($dir,0771)) if(!is_dir($dir) && $debug) ADOConnection::outp("Cannot create $dir"); + umask($oldu); + } + + return $dir; + } + + /** + * Private function to erase all of the files and subdirectories in a directory. + * + * Just specify the directory, and tell it if you want to delete the directory or just clear it out. + * Note: $kill_top_level is used internally in the function to flush subdirectories. + */ + function _dirFlush($dir, $kill_top_level = false) + { + if(!$dh = @opendir($dir)) return; + + while (($obj = readdir($dh))) { + if($obj=='.' || $obj=='..') continue; + $f = $dir.'/'.$obj; + + if (strpos($obj,'.cache')) @unlink($f); + if (is_dir($f)) $this->_dirFlush($f, true); + } + if ($kill_top_level === true) @rmdir($dir); + return true; + } + } + + //============================================================================================== + // CLASS ADOConnection + //============================================================================================== + + /** + * Connection object. For connecting to databases, and executing queries. + */ + class ADOConnection { + // + // PUBLIC VARS + // + var $dataProvider = 'native'; + var $databaseType = ''; /// RDBMS currently in use, eg. odbc, mysql, mssql + var $database = ''; /// Name of database to be used. + var $host = ''; /// The hostname of the database server + var $user = ''; /// The username which is used to connect to the database server. + var $password = ''; /// Password for the username. For security, we no longer store it. + var $debug = false; /// if set to true will output sql statements + var $maxblobsize = 262144; /// maximum size of blobs or large text fields (262144 = 256K)-- some db's die otherwise like foxpro + var $concat_operator = '+'; /// default concat operator -- change to || for Oracle/Interbase + var $substr = 'substr'; /// substring operator + var $length = 'length'; /// string length ofperator + var $random = 'rand()'; /// random function + var $upperCase = 'upper'; /// uppercase function + var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d, h:i:s A'"; /// used by DBTimeStamp as the default timestamp fmt. + var $true = '1'; /// string that represents TRUE for a database + var $false = '0'; /// string that represents FALSE for a database + var $replaceQuote = "\\'"; /// string to use to replace quotes + var $nameQuote = '"'; /// string to use to quote identifiers and names + var $charSet=false; /// character set to use - only for interbase, postgres and oci8 + var $metaDatabasesSQL = ''; + var $metaTablesSQL = ''; + var $uniqueOrderBy = false; /// All order by columns have to be unique + var $emptyDate = ' '; + var $emptyTimeStamp = ' '; + var $lastInsID = false; + //-- + var $hasInsertID = false; /// supports autoincrement ID? + var $hasAffectedRows = false; /// supports affected rows for update/delete? + var $hasTop = false; /// support mssql/access SELECT TOP 10 * FROM TABLE + var $hasLimit = false; /// support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + var $readOnly = false; /// this is a readonly database - used by phpLens + var $hasMoveFirst = false; /// has ability to run MoveFirst(), scrolling backwards + var $hasGenID = false; /// can generate sequences using GenID(); + var $hasTransactions = true; /// has transactions + //-- + var $genID = 0; /// sequence id used by GenID(); + var $raiseErrorFn = false; /// error function to call + var $isoDates = false; /// accepts dates in ISO format + var $cacheSecs = 3600; /// cache for 1 hour + + // memcache + var $memCache = false; /// should we use memCache instead of caching in files + var $memCacheHost; /// memCache host + var $memCachePort = 11211; /// memCache port + var $memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) + + var $sysDate = false; /// name of function that returns the current date + var $sysTimeStamp = false; /// name of function that returns the current timestamp + var $sysUTimeStamp = false; // name of function that returns the current timestamp accurate to the microsecond or nearest fraction + var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets + + var $noNullStrings = false; /// oracle specific stuff - if true ensures that '' is converted to ' ' + var $numCacheHits = 0; + var $numCacheMisses = 0; + var $pageExecuteCountRows = true; + var $uniqueSort = false; /// indicates that all fields in order by must be unique + var $leftOuter = false; /// operator to use for left outer join in WHERE clause + var $rightOuter = false; /// operator to use for right outer join in WHERE clause + var $ansiOuter = false; /// whether ansi outer join syntax supported + var $autoRollback = false; // autoRollback on PConnect(). + var $poorAffectedRows = false; // affectedRows not working or unreliable + + var $fnExecute = false; + var $fnCacheExecute = false; + var $blobEncodeType = false; // false=not required, 'I'=encode to integer, 'C'=encode to char + var $rsPrefix = "ADORecordSet_"; + + var $autoCommit = true; /// do not modify this yourself - actually private + var $transOff = 0; /// temporarily disable transactions + var $transCnt = 0; /// count of nested transactions + + var $fetchMode=false; + + var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null + // + // PRIVATE VARS + // + var $_oldRaiseFn = false; + var $_transOK = null; + var $_connectionID = false; /// The returned link identifier whenever a successful database connection is made. + var $_errorMsg = false; /// A variable which was used to keep the returned last error message. The value will + /// then returned by the errorMsg() function + var $_errorCode = false; /// Last error code, not guaranteed to be used - only by oci8 + var $_queryID = false; /// This variable keeps the last created result link identifier + + var $_isPersistentConnection = false; /// A boolean variable to state whether its a persistent connection or normal connection. */ + var $_bindInputArray = false; /// set to true if ADOConnection.Execute() permits binding of array parameters. + var $_evalAll = false; + var $_affected = false; + var $_logsql = false; + var $_transmode = ''; // transaction mode + + + + /** + * Constructor + */ + function ADOConnection() + { + die('Virtual Class -- cannot instantiate'); + } + + static function Version() + { + global $ADODB_vers; + + return (float) substr($ADODB_vers,1); + } + + /** + Get server version info... + + @returns An array with 2 elements: $arr['string'] is the description string, + and $arr[version] is the version (also a string). + */ + function ServerInfo() + { + return array('description' => '', 'version' => ''); + } + + function IsConnected() + { + return !empty($this->_connectionID); + } + + function _findvers($str) + { + if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1]; + else return ''; + } + + /** + * All error messages go through this bottleneck function. + * You can define your own handler by defining the function name in ADODB_OUTP. + */ + static function outp($msg,$newline=true) + { + global $ADODB_FLUSH,$ADODB_OUTP; + + if (defined('ADODB_OUTP')) { + $fn = ADODB_OUTP; + $fn($msg,$newline); + return; + } else if (isset($ADODB_OUTP)) { + $fn = $ADODB_OUTP; + $fn($msg,$newline); + return; + } + + if ($newline) $msg .= "
        \n"; + + if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg; + else echo strip_tags($msg); + + + if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan + + } + + function Time() + { + $rs = $this->_Execute("select $this->sysTimeStamp"); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + + /** + * Connect to database + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * @param [forceNew] force new connection + * + * @return true or false + */ + function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false) + { + if ($argHostname != "") $this->host = $argHostname; + if ($argUsername != "") $this->user = $argUsername; + if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons + if ($argDatabaseName != "") $this->database = $argDatabaseName; + + $this->_isPersistentConnection = false; + + global $ADODB_CACHE; + if (empty($ADODB_CACHE)) $this->_CreateCache(); + + if ($forceNew) { + if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true; + } else { + if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true; + } + if (isset($rez)) { + $err = $this->ErrorMsg(); + if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; + $ret = false; + } else { + $err = "Missing extension for ".$this->dataProvider; + $ret = 0; + } + if ($fn = $this->raiseErrorFn) + $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); + + + $this->_connectionID = false; + if ($this->debug) ADOConnection::outp( $this->host.': '.$err); + return $ret; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName); + } + + + /** + * Always force a new connection to database - currently only works with oracle + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * + * @return true or false + */ + function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") + { + return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true); + } + + /** + * Establish persistent connect to database + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * + * @return return true or false + */ + function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") + { + + if (defined('ADODB_NEVER_PERSIST')) + return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName); + + if ($argHostname != "") $this->host = $argHostname; + if ($argUsername != "") $this->user = $argUsername; + if ($argPassword != "") $this->password = $argPassword; + if ($argDatabaseName != "") $this->database = $argDatabaseName; + + $this->_isPersistentConnection = true; + + global $ADODB_CACHE; + if (empty($ADODB_CACHE)) $this->_CreateCache(); + + if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true; + if (isset($rez)) { + $err = $this->ErrorMsg(); + if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; + $ret = false; + } else { + $err = "Missing extension for ".$this->dataProvider; + $ret = 0; + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); + } + + $this->_connectionID = false; + if ($this->debug) ADOConnection::outp( $this->host.': '.$err); + return $ret; + } + + function outp_throw($msg,$src='WARN',$sql='') + { + if (defined('ADODB_ERROR_HANDLER') && ADODB_ERROR_HANDLER == 'adodb_throw') { + adodb_throw($this->databaseType,$src,-9999,$msg,$sql,false,$this); + return; + } + ADOConnection::outp($msg); + } + + // create cache class. Code is backward compat with old memcache implementation + function _CreateCache() + { + global $ADODB_CACHE, $ADODB_CACHE_CLASS; + + if ($this->memCache) { + global $ADODB_INCLUDED_MEMCACHE; + + if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); + $ADODB_CACHE = new ADODB_Cache_MemCache($this); + } else + $ADODB_CACHE = new $ADODB_CACHE_CLASS($this); + + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysDate; + return $col; // child class implement + } + + /** + * Should prepare the sql statement and return the stmt resource. + * For databases that do not support this, we return the $sql. To ensure + * compatibility with databases that do not support prepare: + * + * $stmt = $db->Prepare("insert into table (id, name) values (?,?)"); + * $db->Execute($stmt,array(1,'Jill')) or die('insert failed'); + * $db->Execute($stmt,array(2,'Joe')) or die('insert failed'); + * + * @param sql SQL to send to database + * + * @return return FALSE, or the prepared statement, or the original sql if + * if the database does not support prepare. + * + */ + function Prepare($sql) + { + return $sql; + } + + /** + * Some databases, eg. mssql require a different function for preparing + * stored procedures. So we cannot use Prepare(). + * + * Should prepare the stored procedure and return the stmt resource. + * For databases that do not support this, we return the $sql. To ensure + * compatibility with databases that do not support prepare: + * + * @param sql SQL to send to database + * + * @return return FALSE, or the prepared statement, or the original sql if + * if the database does not support prepare. + * + */ + function PrepareSP($sql,$param=true) + { + return $this->Prepare($sql,$param); + } + + /** + * PEAR DB Compat + */ + function Quote($s) + { + return $this->qstr($s,false); + } + + /** + Requested by "Karsten Dambekalns" + */ + function QMagic($s) + { + return $this->qstr($s,get_magic_quotes_gpc()); + } + + function q(&$s) + { + #if (!empty($this->qNull)) if ($s == 'null') return $s; + $s = $this->qstr($s,false); + } + + /** + * PEAR DB Compat - do not use internally. + */ + function ErrorNative() + { + return $this->ErrorNo(); + } + + + /** + * PEAR DB Compat - do not use internally. + */ + function nextId($seq_name) + { + return $this->GenID($seq_name); + } + + /** + * Lock a row, will escalate and lock the table if row locking not supported + * will normally free the lock at the end of the transaction + * + * @param $table name of table to lock + * @param $where where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock + */ + function RowLock($table,$where) + { + return false; + } + + function CommitLock($table) + { + return $this->CommitTrans(); + } + + function RollbackLock($table) + { + return $this->RollbackTrans(); + } + + /** + * PEAR DB Compat - do not use internally. + * + * The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical + * for easy porting :-) + * + * @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM + * @returns The previous fetch mode + */ + function SetFetchMode($mode) + { + $old = $this->fetchMode; + $this->fetchMode = $mode; + + if ($old === false) { + global $ADODB_FETCH_MODE; + return $ADODB_FETCH_MODE; + } + return $old; + } + + + /** + * PEAR DB Compat - do not use internally. + */ + function Query($sql, $inputarr=false) + { + $rs = $this->Execute($sql, $inputarr); + if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); + return $rs; + } + + + /** + * PEAR DB Compat - do not use internally + */ + function LimitQuery($sql, $offset, $count, $params=false) + { + $rs = $this->SelectLimit($sql, $count, $offset, $params); + if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); + return $rs; + } + + + /** + * PEAR DB Compat - do not use internally + */ + function Disconnect() + { + return $this->Close(); + } + + /* + Returns placeholder for parameter, eg. + $DB->Param('a') + + will return ':a' for Oracle, and '?' for most other databases... + + For databases that require positioned params, eg $1, $2, $3 for postgresql, + pass in Param(false) before setting the first parameter. + */ + function Param($name,$type='C') + { + return '?'; + } + + /* + InParameter and OutParameter are self-documenting versions of Parameter(). + */ + function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + return $this->Parameter($stmt,$var,$name,false,$maxLen,$type); + } + + /* + */ + function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + return $this->Parameter($stmt,$var,$name,true,$maxLen,$type); + + } + + + /* + Usage in oracle + $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',64); + $db->Execute(); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + */ + function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) + { + return false; + } + + + function IgnoreErrors($saveErrs=false) + { + if (!$saveErrs) { + $saveErrs = array($this->raiseErrorFn,$this->_transOK); + $this->raiseErrorFn = false; + return $saveErrs; + } else { + $this->raiseErrorFn = $saveErrs[0]; + $this->_transOK = $saveErrs[1]; + } + } + + /** + Improved method of initiating a transaction. Used together with CompleteTrans(). + Advantages include: + + a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans. + Only the outermost block is treated as a transaction.
        + b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.
        + c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block + are disabled, making it backward compatible. + */ + function StartTrans($errfn = 'ADODB_TransMonitor') + { + if ($this->transOff > 0) { + $this->transOff += 1; + return true; + } + + $this->_oldRaiseFn = $this->raiseErrorFn; + $this->raiseErrorFn = $errfn; + $this->_transOK = true; + + if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans"); + $ok = $this->BeginTrans(); + $this->transOff = 1; + return $ok; + } + + + /** + Used together with StartTrans() to end a transaction. Monitors connection + for sql errors, and will commit or rollback as appropriate. + + @autoComplete if true, monitor sql errors and commit and rollback as appropriate, + and if set to false force rollback even if no SQL error detected. + @returns true on commit, false on rollback. + */ + function CompleteTrans($autoComplete = true) + { + if ($this->transOff > 1) { + $this->transOff -= 1; + return true; + } + $this->raiseErrorFn = $this->_oldRaiseFn; + + $this->transOff = 0; + if ($this->_transOK && $autoComplete) { + if (!$this->CommitTrans()) { + $this->_transOK = false; + if ($this->debug) ADOConnection::outp("Smart Commit failed"); + } else + if ($this->debug) ADOConnection::outp("Smart Commit occurred"); + } else { + $this->_transOK = false; + $this->RollbackTrans(); + if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred"); + } + + return $this->_transOK; + } + + /* + At the end of a StartTrans/CompleteTrans block, perform a rollback. + */ + function FailTrans() + { + if ($this->debug) + if ($this->transOff == 0) { + ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans"); + } else { + ADOConnection::outp("FailTrans was called"); + adodb_backtrace(); + } + $this->_transOK = false; + } + + /** + Check if transaction has failed, only for Smart Transactions. + */ + function HasFailedTrans() + { + if ($this->transOff > 0) return $this->_transOK == false; + return false; + } + + /** + * Execute SQL + * + * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) + * @param [inputarr] holds the input data to bind to. Null elements will be set to null. + * @return RecordSet or false + */ + function Execute($sql,$inputarr=false) + { + if ($this->fnExecute) { + $fn = $this->fnExecute; + $ret = $fn($this,$sql,$inputarr); + if (isset($ret)) return $ret; + } + if ($inputarr) { + if (!is_array($inputarr)) $inputarr = array($inputarr); + + $element0 = reset($inputarr); + # is_object check because oci8 descriptors can be passed in + $array_2d = is_array($element0) && !is_object(reset($element0)); + //remove extra memory copy of input -mikefedyk + unset($element0); + + if (!is_array($sql) && !$this->_bindInputArray) { + $sqlarr = explode('?',$sql); + $nparams = sizeof($sqlarr)-1; + if (!$array_2d) $inputarr = array($inputarr); + foreach($inputarr as $arr) { + $sql = ''; $i = 0; + //Use each() instead of foreach to reduce memory usage -mikefedyk + while(list(, $v) = each($arr)) { + $sql .= $sqlarr[$i]; + // from Ron Baldwin + // Only quote string types + $typ = gettype($v); + if ($typ == 'string') + //New memory copy of input created here -mikefedyk + $sql .= $this->qstr($v); + else if ($typ == 'double') + $sql .= str_replace(',','.',$v); // locales fix so 1.1 does not get converted to 1,1 + else if ($typ == 'boolean') + $sql .= $v ? $this->true : $this->false; + else if ($typ == 'object') { + if (method_exists($v, '__toString')) $sql .= $this->qstr($v->__toString()); + else $sql .= $this->qstr((string) $v); + } else if ($v === null) + $sql .= 'NULL'; + else + $sql .= $v; + $i += 1; + + if ($i == $nparams) break; + } // while + if (isset($sqlarr[$i])) { + $sql .= $sqlarr[$i]; + if ($i+1 != sizeof($sqlarr)) $this->outp_throw( "Input Array does not match ?: ".htmlspecialchars($sql),'Execute'); + } else if ($i != sizeof($sqlarr)) + $this->outp_throw( "Input array does not match ?: ".htmlspecialchars($sql),'Execute'); + + $ret = $this->_Execute($sql); + if (!$ret) return $ret; + } + } else { + if ($array_2d) { + if (is_string($sql)) + $stmt = $this->Prepare($sql); + else + $stmt = $sql; + + foreach($inputarr as $arr) { + $ret = $this->_Execute($stmt,$arr); + if (!$ret) return $ret; + } + } else { + $ret = $this->_Execute($sql,$inputarr); + } + } + } else { + $ret = $this->_Execute($sql,false); + } + + return $ret; + } + + + function _Execute($sql,$inputarr=false) + { + if ($this->debug) { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr); + } else { + $this->_queryID = @$this->_query($sql,$inputarr); + } + + /************************ + // OK, query executed + *************************/ + + if ($this->_queryID === false) { // error handling if query fails + if ($this->debug == 99) adodb_backtrace(true,5); + $fn = $this->raiseErrorFn; + if ($fn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this); + } + $false = false; + return $false; + } + + if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead + $rsclass = $this->rsPrefix.'empty'; + $rs = (class_exists($rsclass)) ? new $rsclass(): new ADORecordSet_empty(); + + return $rs; + } + + // return real recordset from select statement + $rsclass = $this->rsPrefix.$this->databaseType; + $rs = new $rsclass($this->_queryID,$this->fetchMode); + $rs->connection = $this; // Pablo suggestion + $rs->Init(); + if (is_array($sql)) $rs->sql = $sql[0]; + else $rs->sql = $sql; + if ($rs->_numOfRows <= 0) { + global $ADODB_COUNTRECS; + if ($ADODB_COUNTRECS) { + if (!$rs->EOF) { + $rs = $this->_rs2rs($rs,-1,-1,!is_array($sql)); + $rs->_queryID = $this->_queryID; + } else + $rs->_numOfRows = 0; + } + } + return $rs; + } + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if (empty($this->_genSeqSQL)) return false; + return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); + } + + function DropSequence($seqname='adodbseq') + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /** + * Generates a sequence id and stores it in $this->genID; + * GenID is only available if $this->hasGenID = true; + * + * @param seqname name of sequence to use + * @param startID if sequence does not exist, start at this ID + * @return 0 if not supported, otherwise a sequence id + */ + function GenID($seqname='adodbseq',$startID=1) + { + if (!$this->hasGenID) { + return 0; // formerly returns false pre 1.60 + } + + $getnext = sprintf($this->_genIDSQL,$seqname); + + $holdtransOK = $this->_transOK; + + $save_handler = $this->raiseErrorFn; + $this->raiseErrorFn = ''; + @($rs = $this->Execute($getnext)); + $this->raiseErrorFn = $save_handler; + + if (!$rs) { + $this->_transOK = $holdtransOK; //if the status was ok before reset + $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); + $rs = $this->Execute($getnext); + } + if ($rs && !$rs->EOF) $this->genID = reset($rs->fields); + else $this->genID = 0; // false + + if ($rs) $rs->Close(); + + return $this->genID; + } + + /** + * @param $table string name of the table, not needed by all databases (eg. mysql), default '' + * @param $column string name of the column, not needed by all databases (eg. mysql), default '' + * @return the last inserted ID. Not all databases support this. + */ + function Insert_ID($table='',$column='') + { + if ($this->_logsql && $this->lastInsID) return $this->lastInsID; + if ($this->hasInsertID) return $this->_insertid($table,$column); + if ($this->debug) { + ADOConnection::outp( '

        Insert_ID error

        '); + adodb_backtrace(); + } + return false; + } + + + /** + * Portable Insert ID. Pablo Roca + * + * @return the last inserted ID. All databases support this. But aware possible + * problems in multiuser environments. Heavy test this before deploying. + */ + function PO_Insert_ID($table="", $id="") + { + if ($this->hasInsertID){ + return $this->Insert_ID($table,$id); + } else { + return $this->GetOne("SELECT MAX($id) FROM $table"); + } + } + + /** + * @return # rows affected by UPDATE/DELETE + */ + function Affected_Rows() + { + if ($this->hasAffectedRows) { + if ($this->fnExecute === 'adodb_log_sql') { + if ($this->_logsql && $this->_affected !== false) return $this->_affected; + } + $val = $this->_affectedrows(); + return ($val < 0) ? false : $val; + } + + if ($this->debug) ADOConnection::outp( '

        Affected_Rows error

        ',false); + return false; + } + + + /** + * @return the last error message + */ + function ErrorMsg() + { + if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg; + else return ''; + } + + + /** + * @return the last error number. Normally 0 means no error. + */ + function ErrorNo() + { + return ($this->_errorMsg) ? -1 : 0; + } + + function MetaError($err=false) + { + include_once(ADODB_DIR."/adodb-error.inc.php"); + if ($err === false) $err = $this->ErrorNo(); + return adodb_error($this->dataProvider,$this->databaseType,$err); + } + + function MetaErrorMsg($errno) + { + include_once(ADODB_DIR."/adodb-error.inc.php"); + return adodb_errormsg($errno); + } + + /** + * @returns an array with the primary key columns in it. + */ + function MetaPrimaryKeys($table, $owner=false) + { + // owner not used in base class - see oci8 + $p = array(); + $objs = $this->MetaColumns($table); + if ($objs) { + foreach($objs as $v) { + if (!empty($v->primary_key)) + $p[] = $v->name; + } + } + if (sizeof($p)) return $p; + if (function_exists('ADODB_VIEW_PRIMARYKEYS')) + return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner); + return false; + } + + /** + * @returns assoc array where keys are tables, and values are foreign keys + */ + function MetaForeignKeys($table, $owner=false, $upper=false) + { + return false; + } + /** + * Choose a database to connect to. Many databases do not support this. + * + * @param dbName is the name of the database to select + * @return true or false + */ + function SelectDB($dbName) + {return false;} + + + /** + * Will select, getting rows from $offset (1-based), for $nrows. + * This simulates the MySQL "select * from table limit $offset,$nrows" , and + * the PostgreSQL "select * from table limit $nrows offset $offset". Note that + * MySQL and PostgreSQL parameter ordering is the opposite of the other. + * eg. + * SelectLimit('select * from table',3); will return rows 1 to 3 (1-based) + * SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based) + * + * Uses SELECT TOP for Microsoft databases (when $this->hasTop is set) + * BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set + * + * @param sql + * @param [offset] is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to get + * @param [inputarr] array of bind variables + * @param [secs2cache] is a private parameter only used by jlim + * @return the recordset ($rs->databaseType == 'array') + */ + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($this->hasTop && $nrows > 0) { + // suggested by Reinhard Balling. Access requires top after distinct + // Informix requires first before distinct - F Riosa + $ismssql = (strpos($this->databaseType,'mssql') !== false); + if ($ismssql) $isaccess = false; + else $isaccess = (strpos($this->databaseType,'access') !== false); + + if ($offset <= 0) { + + // access includes ties in result + if ($isaccess) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + + if ($secs2cache != 0) { + $ret = $this->CacheExecute($secs2cache, $sql,$inputarr); + } else { + $ret = $this->Execute($sql,$inputarr); + } + return $ret; // PHP5 fix + } else if ($ismssql){ + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + } else { + $sql = preg_replace( + '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + } + } else { + $nn = $nrows + $offset; + if ($isaccess || $ismssql) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); + } else { + $sql = preg_replace( + '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); + } + } + } + + // if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows + // 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS. + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + + if ($secs2cache != 0) $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + else $rs = $this->Execute($sql,$inputarr); + + $ADODB_COUNTRECS = $savec; + if ($rs && !$rs->EOF) { + $rs = $this->_rs2rs($rs,$nrows,$offset); + } + //print_r($rs); + return $rs; + } + + /** + * Create serializable recordset. Breaks rs link to connection. + * + * @param rs the recordset to serialize + */ + function SerializableRS(&$rs) + { + $rs2 = $this->_rs2rs($rs); + $ignore = false; + $rs2->connection = $ignore; + + return $rs2; + } + + /** + * Convert database recordset to an array recordset + * input recordset's cursor should be at beginning, and + * old $rs will be closed. + * + * @param rs the recordset to copy + * @param [nrows] number of rows to retrieve (optional) + * @param [offset] offset by number of rows (optional) + * @return the new recordset + */ + function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true) + { + if (! $rs) { + $false = false; + return $false; + } + $dbtype = $rs->databaseType; + if (!$dbtype) { + $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ? + return $rs; + } + if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) { + $rs->MoveFirst(); + $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ? + return $rs; + } + $flds = array(); + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { + $flds[] = $rs->FetchField($i); + } + + $arr = $rs->GetArrayLimit($nrows,$offset); + //print_r($arr); + if ($close) $rs->Close(); + + $arrayClass = $this->arrayClass; + + $rs2 = new $arrayClass(); + $rs2->connection = $this; + $rs2->sql = $rs->sql; + $rs2->dataProvider = $this->dataProvider; + $rs2->InitArrayFields($arr,$flds); + $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; + return $rs2; + } + + /* + * Return all rows. Compat with PEAR DB + */ + function GetAll($sql, $inputarr=false) + { + $arr = $this->GetArray($sql,$inputarr); + return $arr; + } + + function GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false) + { + $rs = $this->Execute($sql, $inputarr); + if (!$rs) { + $false = false; + return $false; + } + $arr = $rs->GetAssoc($force_array,$first2cols); + return $arr; + } + + function CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false) + { + if (!is_numeric($secs2cache)) { + $first2cols = $force_array; + $force_array = $inputarr; + } + $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); + if (!$rs) { + $false = false; + return $false; + } + $arr = $rs->GetAssoc($force_array,$first2cols); + return $arr; + } + + /** + * Return first element of first row of sql statement. Recordset is disposed + * for you. + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetOne($sql,$inputarr=false) + { + global $ADODB_COUNTRECS,$ADODB_GETONE_EOF; + $crecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + $ret = false; + $rs = $this->Execute($sql,$inputarr); + if ($rs) { + if ($rs->EOF) $ret = $ADODB_GETONE_EOF; + else $ret = reset($rs->fields); + + $rs->Close(); + } + $ADODB_COUNTRECS = $crecs; + return $ret; + } + + // $where should include 'WHERE fld=value' + function GetMedian($table, $field,$where = '') + { + $total = $this->GetOne("select count(*) from $table $where"); + if (!$total) return false; + + $midrow = (integer) ($total/2); + $rs = $this->SelectLimit("select $field from $table $where order by 1",1,$midrow); + if ($rs && !$rs->EOF) return reset($rs->fields); + return false; + } + + + function CacheGetOne($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_GETONE_EOF; + $ret = false; + $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + if ($rs) { + if ($rs->EOF) $ret = $ADODB_GETONE_EOF; + else $ret = reset($rs->fields); + $rs->Close(); + } + + return $ret; + } + + function GetCol($sql, $inputarr = false, $trim = false) + { + + $rs = $this->Execute($sql, $inputarr); + if ($rs) { + $rv = array(); + if ($trim) { + while (!$rs->EOF) { + $rv[] = trim(reset($rs->fields)); + $rs->MoveNext(); + } + } else { + while (!$rs->EOF) { + $rv[] = reset($rs->fields); + $rs->MoveNext(); + } + } + $rs->Close(); + } else + $rv = false; + return $rv; + } + + function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false) + { + $rs = $this->CacheExecute($secs, $sql, $inputarr); + if ($rs) { + $rv = array(); + if ($trim) { + while (!$rs->EOF) { + $rv[] = trim(reset($rs->fields)); + $rs->MoveNext(); + } + } else { + while (!$rs->EOF) { + $rv[] = reset($rs->fields); + $rs->MoveNext(); + } + } + $rs->Close(); + } else + $rv = false; + + return $rv; + } + + function Transpose(&$rs,$addfieldnames=true) + { + $rs2 = $this->_rs2rs($rs); + $false = false; + if (!$rs2) return $false; + + $rs2->_transpose($addfieldnames); + return $rs2; + } + + /* + Calculate the offset of a date for a particular database and generate + appropriate SQL. Useful for calculating future/past dates and storing + in a database. + + If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour. + */ + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + return '('.$date.'+'.$dayFraction.')'; + } + + + /** + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetArray($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $rs = $this->Execute($sql,$inputarr); + $ADODB_COUNTRECS = $savec; + if (!$rs) + if (defined('ADODB_PEAR')) { + $cls = ADODB_PEAR_Error(); + return $cls; + } else { + $false = false; + return $false; + } + $arr = $rs->GetArray(); + $rs->Close(); + return $arr; + } + + function CacheGetAll($secs2cache,$sql=false,$inputarr=false) + { + $arr = $this->CacheGetArray($secs2cache,$sql,$inputarr); + return $arr; + } + + function CacheGetArray($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + $ADODB_COUNTRECS = $savec; + + if (!$rs) + if (defined('ADODB_PEAR')) { + $cls = ADODB_PEAR_Error(); + return $cls; + } else { + $false = false; + return $false; + } + $arr = $rs->GetArray(); + $rs->Close(); + return $arr; + } + + function GetRandRow($sql, $arr= false) + { + $rezarr = $this->GetAll($sql, $arr); + $sz = sizeof($rezarr); + return $rezarr[abs(rand()) % $sz]; + } + + /** + * Return one row of sql statement. Recordset is disposed for you. + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetRow($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + $crecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + $rs = $this->Execute($sql,$inputarr); + + $ADODB_COUNTRECS = $crecs; + if ($rs) { + if (!$rs->EOF) $arr = $rs->fields; + else $arr = array(); + $rs->Close(); + return $arr; + } + + $false = false; + return $false; + } + + function CacheGetRow($secs2cache,$sql=false,$inputarr=false) + { + $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + if ($rs) { + if (!$rs->EOF) $arr = $rs->fields; + else $arr = array(); + + $rs->Close(); + return $arr; + } + $false = false; + return $false; + } + + /** + * Insert or replace a single record. Note: this is not the same as MySQL's replace. + * ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL. + * Also note that no table locking is done currently, so it is possible that the + * record be inserted twice by two programs... + * + * $this->Replace('products', array('prodname' =>"'Nails'","price" => 3.99), 'prodname'); + * + * $table table name + * $fieldArray associative array of data (you must quote strings yourself). + * $keyCol the primary key field name or if compound key, array of field names + * autoQuote set to true to use a hueristic to quote strings. Works with nulls and numbers + * but does not work with dates nor SQL functions. + * has_autoinc the primary key is an auto-inc field, so skip in insert. + * + * Currently blob replace not supported + * + * returns 0 = fail, 1 = update, 2 = insert + */ + + function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + + return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc); + } + + + /** + * Will select, getting rows from $offset (1-based), for $nrows. + * This simulates the MySQL "select * from table limit $offset,$nrows" , and + * the PostgreSQL "select * from table limit $nrows offset $offset". Note that + * MySQL and PostgreSQL parameter ordering is the opposite of the other. + * eg. + * CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based) + * CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based) + * + * BUG: Currently CacheSelectLimit fails with $sql with LIMIT or TOP clause already set + * + * @param [secs2cache] seconds to cache data, set to 0 to force query. This is optional + * @param sql + * @param [offset] is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to get + * @param [inputarr] array of bind variables + * @return the recordset ($rs->databaseType == 'array') + */ + function CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false) + { + if (!is_numeric($secs2cache)) { + if ($sql === false) $sql = -1; + if ($offset == -1) $offset = false; + // sql, nrows, offset,inputarr + $rs = $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs); + } else { + if ($sql === false) $this->outp_throw("Warning: \$sql missing from CacheSelectLimit()",'CacheSelectLimit'); + $rs = $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + } + return $rs; + } + + + /** + * Flush cached recordsets that match a particular $sql statement. + * If $sql == false, then we purge all files in the cache. + */ + + /** + * Flush cached recordsets that match a particular $sql statement. + * If $sql == false, then we purge all files in the cache. + */ + function CacheFlush($sql=false,$inputarr=false) + { + global $ADODB_CACHE_DIR, $ADODB_CACHE; + + if (!$sql) { + $ADODB_CACHE->flushall($this->debug); + return; + } + + $f = $this->_gencachename($sql.serialize($inputarr),false); + return $ADODB_CACHE->flushcache($f, $this->debug); + } + + + /** + * Private function to generate filename for caching. + * Filename is generated based on: + * + * - sql statement + * - database type (oci8, ibase, ifx, etc) + * - database name + * - userid + * - setFetchMode (adodb 4.23) + * + * When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR). + * Assuming that we can have 50,000 files per directory with good performance, + * then we can scale to 12.8 million unique cached recordsets. Wow! + */ + function _gencachename($sql,$createdir) + { + global $ADODB_CACHE, $ADODB_CACHE_DIR; + + if ($this->fetchMode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } else { + $mode = $this->fetchMode; + } + $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode); + if (!$ADODB_CACHE->createdir) return $m; + if (!$createdir) $dir = $ADODB_CACHE->getdirname($m); + else $dir = $ADODB_CACHE->createdir($m, $this->debug); + + return $dir.'/adodb_'.$m.'.cache'; + } + + + /** + * Execute SQL, caching recordsets. + * + * @param [secs2cache] seconds to cache data, set to 0 to force query. + * This is an optional parameter. + * @param sql SQL statement to execute + * @param [inputarr] holds the input data to bind to + * @return RecordSet or false + */ + function CacheExecute($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_CACHE; + + if (!is_numeric($secs2cache)) { + $inputarr = $sql; + $sql = $secs2cache; + $secs2cache = $this->cacheSecs; + } + + if (is_array($sql)) { + $sqlparam = $sql; + $sql = $sql[0]; + } else + $sqlparam = $sql; + + + $md5file = $this->_gencachename($sql.serialize($inputarr),true); + $err = ''; + + if ($secs2cache > 0){ + $rs = $ADODB_CACHE->readcache($md5file,$err,$secs2cache,$this->arrayClass); + $this->numCacheHits += 1; + } else { + $err='Timeout 1'; + $rs = false; + $this->numCacheMisses += 1; + } + + if (!$rs) { + // no cached rs found + if ($this->debug) { + if (get_magic_quotes_runtime() && !$this->memCache) { + ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :("); + } + if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)"); + } + + $rs = $this->Execute($sqlparam,$inputarr); + + if ($rs) { + + $eof = $rs->EOF; + $rs = $this->_rs2rs($rs); // read entire recordset into memory immediately + $rs->timeCreated = time(); // used by caching + $txt = _rs2serialize($rs,false,$sql); // serialize + + $ok = $ADODB_CACHE->writecache($md5file,$txt,$this->debug, $secs2cache); + if (!$ok) { + if ($ok === false) { + $em = 'Cache write error'; + $en = -32000; + + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'CacheExecute', $en, $em, $md5file,$sql,$this); + } + } else { + $em = 'Cache file locked warning'; + $en = -32001; + // do not call error handling for just a warning + } + + if ($this->debug) ADOConnection::outp( " ".$em); + } + if ($rs->EOF && !$eof) { + $rs->MoveFirst(); + //$rs = csv2rs($md5file,$err); + $rs->connection = $this; // Pablo suggestion + } + + } else if (!$this->memCache) + $ADODB_CACHE->flushcache($md5file); + } else { + $this->_errorMsg = ''; + $this->_errorCode = 0; + + if ($this->fnCacheExecute) { + $fn = $this->fnCacheExecute; + $fn($this, $secs2cache, $sql, $inputarr); + } + // ok, set cached object found + $rs->connection = $this; // Pablo suggestion + if ($this->debug){ + if ($this->debug == 99) adodb_backtrace(); + $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); + $ttl = $rs->timeCreated + $secs2cache - time(); + $s = is_array($sql) ? $sql[0] : $sql; + if ($inBrowser) $s = ''.htmlspecialchars($s).''; + + ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]"); + } + } + return $rs; + } + + + /* + Similar to PEAR DB's autoExecute(), except that + $mode can be 'INSERT' or 'UPDATE' or DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + If $mode == 'UPDATE', then $where is compulsory as a safety measure. + + $forceUpdate means that even if the data has not changed, perform update. + */ + function AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false) + { + $false = false; + $sql = 'SELECT * FROM '.$table; + if ($where!==FALSE) $sql .= ' WHERE '.$where; + else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) { + $this->outp_throw('AutoExecute: Illegal mode=UPDATE with empty WHERE clause','AutoExecute'); + return $false; + } + + $rs = $this->SelectLimit($sql,1); + if (!$rs) return $false; // table does not exist + $rs->tableName = $table; + + switch((string) $mode) { + case 'UPDATE': + case '2': + $sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq); + break; + case 'INSERT': + case '1': + $sql = $this->GetInsertSQL($rs, $fields_values, $magicq); + break; + default: + $this->outp_throw("AutoExecute: Unknown mode=$mode",'AutoExecute'); + return $false; + } + $ret = false; + if ($sql) $ret = $this->Execute($sql); + if ($ret) $ret = true; + return $ret; + } + + + /** + * Generates an Update Query based on an existing recordset. + * $arrFields is an associative array of fields with the value + * that should be assigned. + * + * Note: This function should only be used on a recordset + * that is run against a single table and sql should only + * be a simple select stmt with no groupby/orderby/limit + * + * "Jonathan Younger" + */ + function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=null) + { + global $ADODB_INCLUDED_LIB; + + //********************************************************// + //This is here to maintain compatibility + //with older adodb versions. Sets force type to force nulls if $forcenulls is set. + if (!isset($force)) { + global $ADODB_FORCE_TYPE; + $force = $ADODB_FORCE_TYPE; + } + //********************************************************// + + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$force); + } + + /** + * Generates an Insert Query based on an existing recordset. + * $arrFields is an associative array of fields with the value + * that should be assigned. + * + * Note: This function should only be used on a recordset + * that is run against a single table. + */ + function GetInsertSQL(&$rs, $arrFields,$magicq=false,$force=null) + { + global $ADODB_INCLUDED_LIB; + if (!isset($force)) { + global $ADODB_FORCE_TYPE; + $force = $ADODB_FORCE_TYPE; + + } + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$force); + } + + + /** + * Update a blob column, given a where clause. There are more sophisticated + * blob handling functions that we could have implemented, but all require + * a very complex API. Instead we have chosen something that is extremely + * simple to understand and use. + * + * Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course. + * + * Usage to update a $blobvalue which has a primary key blob_id=1 into a + * field blobtable.blobcolumn: + * + * UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1'); + * + * Insert example: + * + * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + * $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + /** + * Usage: + * UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1'); + * + * $blobtype supports 'BLOB' and 'CLOB' + * + * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + * $conn->UpdateBlob('blobtable','blobcol',$blobpath,'id=1'); + */ + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + $fd = fopen($path,'rb'); + if ($fd === false) return false; + $val = fread($fd,filesize($path)); + fclose($fd); + return $this->UpdateBlob($table,$column,$val,$where,$blobtype); + } + + function BlobDecode($blob) + { + return $blob; + } + + function BlobEncode($blob) + { + return $blob; + } + + function SetCharSet($charset) + { + return false; + } + + function IfNull( $field, $ifNull ) + { + return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; + } + + function LogSQL($enable=true) + { + include_once(ADODB_DIR.'/adodb-perf.inc.php'); + + if ($enable) $this->fnExecute = 'adodb_log_sql'; + else $this->fnExecute = false; + + $old = $this->_logsql; + $this->_logsql = $enable; + if ($enable && !$old) $this->_affected = false; + return $old; + } + + function GetCharSet() + { + return false; + } + + /** + * Usage: + * UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB'); + * + * $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)'); + * $conn->UpdateClob('clobtable','clobcol',$clob,'id=1'); + */ + function UpdateClob($table,$column,$val,$where) + { + return $this->UpdateBlob($table,$column,$val,$where,'CLOB'); + } + + // not the fastest implementation - quick and dirty - jlim + // for best performance, use the actual $rs->MetaType(). + function MetaType($t,$len=-1,$fieldobj=false) + { + + if (empty($this->_metars)) { + $rsclass = $this->rsPrefix.$this->databaseType; + $this->_metars = new $rsclass(false,$this->fetchMode); + $this->_metars->connection = $this; + } + return $this->_metars->MetaType($t,$len,$fieldobj); + } + + + /** + * Change the SQL connection locale to a specified locale. + * This is used to get the date formats written depending on the client locale. + */ + function SetDateLocale($locale = 'En') + { + $this->locale = $locale; + switch (strtoupper($locale)) + { + case 'EN': + $this->fmtDate="'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + break; + + case 'US': + $this->fmtDate = "'m-d-Y'"; + $this->fmtTimeStamp = "'m-d-Y H:i:s'"; + break; + + case 'PT_BR': + case 'NL': + case 'FR': + case 'RO': + case 'IT': + $this->fmtDate="'d-m-Y'"; + $this->fmtTimeStamp = "'d-m-Y H:i:s'"; + break; + + case 'GE': + $this->fmtDate="'d.m.Y'"; + $this->fmtTimeStamp = "'d.m.Y H:i:s'"; + break; + + default: + $this->fmtDate="'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + break; + } + } + + /** + * GetActiveRecordsClass Performs an 'ALL' query + * + * @param mixed $class This string represents the class of the current active record + * @param mixed $table Table used by the active record object + * @param mixed $whereOrderBy Where, order, by clauses + * @param mixed $bindarr + * @param mixed $primkeyArr + * @param array $extra Query extras: limit, offset... + * @param mixed $relations Associative array: table's foreign name, "hasMany", "belongsTo" + * @access public + * @return void + */ + function GetActiveRecordsClass( + $class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false, + $extra=array(), + $relations=array()) + { + global $_ADODB_ACTIVE_DBS; + ## reduce overhead of adodb.inc.php -- moved to adodb-active-record.inc.php + ## if adodb-active-recordx is loaded -- should be no issue as they will probably use Find() + if (!isset($_ADODB_ACTIVE_DBS))include_once(ADODB_DIR.'/adodb-active-record.inc.php'); + return adodb_GetActiveRecordsClass($this, $class, $table, $whereOrderBy, $bindarr, $primkeyArr, $extra, $relations); + } + + function GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false) + { + $arr = $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr); + return $arr; + } + + /** + * Close Connection + */ + function Close() + { + $rez = $this->_close(); + $this->_connectionID = false; + return $rez; + } + + /** + * Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans(). + * + * @return true if succeeded or false if database does not support transactions + */ + function BeginTrans() + { + if ($this->debug) ADOConnection::outp("BeginTrans: Transactions not supported for this driver"); + return false; + } + + /* set transaction mode */ + function SetTransactionMode( $transaction_mode ) + { + $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider); + $this->_transmode = $transaction_mode; + } +/* +http://msdn2.microsoft.com/en-US/ms173763.aspx +http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-isolation.html +http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html +http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm +*/ + function MetaTransaction($mode,$db) + { + $mode = strtoupper($mode); + $mode = str_replace('ISOLATION LEVEL ','',$mode); + + switch($mode) { + + case 'READ UNCOMMITTED': + switch($db) { + case 'oci8': + case 'oracle': + return 'ISOLATION LEVEL READ COMMITTED'; + default: + return 'ISOLATION LEVEL READ UNCOMMITTED'; + } + break; + + case 'READ COMMITTED': + return 'ISOLATION LEVEL READ COMMITTED'; + break; + + case 'REPEATABLE READ': + switch($db) { + case 'oci8': + case 'oracle': + return 'ISOLATION LEVEL SERIALIZABLE'; + default: + return 'ISOLATION LEVEL REPEATABLE READ'; + } + break; + + case 'SERIALIZABLE': + return 'ISOLATION LEVEL SERIALIZABLE'; + break; + + default: + return $mode; + } + } + + /** + * If database does not support transactions, always return true as data always commited + * + * @param $ok set to false to rollback transaction, true to commit + * + * @return true/false. + */ + function CommitTrans($ok=true) + { return true;} + + + /** + * If database does not support transactions, rollbacks always fail, so return false + * + * @return true/false. + */ + function RollbackTrans() + { return false;} + + + /** + * return the databases that the driver can connect to. + * Some databases will return an empty array. + * + * @return an array of database names. + */ + function MetaDatabases() + { + global $ADODB_FETCH_MODE; + + if ($this->metaDatabasesSQL) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $arr = $this->GetCol($this->metaDatabasesSQL); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + return $arr; + } + + return false; + } + + + /** + * @param ttype can either be 'VIEW' or 'TABLE' or false. + * If false, both views and tables are returned. + * "VIEW" returns only views + * "TABLE" returns only tables + * @param showSchema returns the schema/user with the table name, eg. USER.TABLE + * @param mask is the input mask - only supported by oci8 and postgresql + * + * @return array of tables for current database. + */ + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + global $ADODB_FETCH_MODE; + + + $false = false; + if ($mask) { + return $false; + } + if ($this->metaTablesSQL) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute($this->metaTablesSQL); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) return $false; + $arr = $rs->GetArray(); + $arr2 = array(); + + if ($hast = ($ttype && isset($arr[0][1]))) { + $showt = strncmp($ttype,'T',1); + } + + for ($i=0; $i < sizeof($arr); $i++) { + if ($hast) { + if ($showt == 0) { + if (strncmp($arr[$i][1],'T',1) == 0) $arr2[] = trim($arr[$i][0]); + } else { + if (strncmp($arr[$i][1],'V',1) == 0) $arr2[] = trim($arr[$i][0]); + } + } else + $arr2[] = trim($arr[$i][0]); + } + $rs->Close(); + return $arr2; + } + return $false; + } + + + function _findschema(&$table,&$schema) + { + if (!$schema && ($at = strpos($table,'.')) !== false) { + $schema = substr($table,0,$at); + $table = substr($table,$at+1); + } + } + + /** + * List columns in a database as an array of ADOFieldObjects. + * See top of file for definition of object. + * + * @param $table table name to query + * @param $normalize makes table name case-insensitive (required by some databases) + * @schema is optional database schema to use - not supported by all databases. + * + * @return array of ADOFieldObjects for current table. + */ + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + + if (!empty($this->metaColumnsSQL)) { + + $schema = false; + $this->_findschema($table,$schema); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs === false || $rs->EOF) return $false; + + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + if (isset($rs->fields[3]) && $rs->fields[3]) { + if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3]; + $fld->scale = $rs->fields[4]; + if ($fld->scale>0) $fld->max_length += 1; + } else + $fld->max_length = $rs->fields[2]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return $false; + } + + /** + * List indexes on a table as an array. + * @param table table name to query + * @param primary true to only show primary keys. Not actually used for most databases + * + * @return array of indexes on current table. Each element represents an index, and is itself an associative array. + + Array ( + [name_of_index] => Array + ( + [unique] => true or false + [columns] => Array + ( + [0] => firstname + [1] => lastname + ) + ) + */ + function MetaIndexes($table, $primary = false, $owner = false) + { + $false = false; + return $false; + } + + /** + * List columns names in a table as an array. + * @param table table name to query + * + * @return array of column names for current table. + */ + function MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */) + { + $objarr = $this->MetaColumns($table); + if (!is_array($objarr)) { + $false = false; + return $false; + } + $arr = array(); + if ($numIndexes) { + $i = 0; + if ($useattnum) { + foreach($objarr as $v) + $arr[$v->attnum] = $v->name; + + } else + foreach($objarr as $v) $arr[$i++] = $v->name; + } else + foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name; + + return $arr; + } + + /** + * Different SQL databases used different methods to combine strings together. + * This function provides a wrapper. + * + * param s variable number of string parameters + * + * Usage: $db->Concat($str1,$str2); + * + * @return concatenated string + */ + function Concat() + { + $arr = func_get_args(); + return implode($this->concat_operator, $arr); + } + + + /** + * Converts a date "d" to a string that the database can understand. + * + * @param d a date in Unix date time format. + * + * @return date string in database date format + */ + function DBDate($d, $isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return $d; + + if (is_object($d)) return $d->format($this->fmtDate); + + + if (is_string($d) && !is_numeric($d)) { + if ($d === 'null' || strncmp($d,"'",1) === 0) return $d; + if ($this->isoDates) return "'$d'"; + $d = ADOConnection::UnixDate($d); + } + + return adodb_date($this->fmtDate,$d); + } + + function BindDate($d) + { + $d = $this->DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($d) + { + $d = $this->DBTimeStamp($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + + /** + * Converts a timestamp "ts" to a string that the database can understand. + * + * @param ts a timestamp in Unix date time format. + * + * @return timestamp string in database timestamp format + */ + function DBTimeStamp($ts,$isfld=false) + { + if (empty($ts) && $ts !== 0) return 'null'; + if ($isfld) return $ts; + if (is_object($ts)) return $ts->format($this->fmtTimeStamp); + + # strlen(14) allows YYYYMMDDHHMMSS format + if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14)) + return adodb_date($this->fmtTimeStamp,$ts); + + if ($ts === 'null') return $ts; + if ($this->isoDates && strlen($ts) !== 14) return "'$ts'"; + + $ts = ADOConnection::UnixTimeStamp($ts); + return adodb_date($this->fmtTimeStamp,$ts); + } + + /** + * Also in ADORecordSet. + * @param $v is a date string in YYYY-MM-DD format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixDate($v) + { + if (is_object($v)) { + // odbtp support + //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) + return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); + } + + if (is_numeric($v) && strlen($v) !== 8) return $v; + if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|", + ($v), $rr)) return false; + + if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0; + // h-m-s-MM-DD-YY + return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); + } + + + /** + * Also in ADORecordSet. + * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixTimeStamp($v) + { + if (is_object($v)) { + // odbtp support + //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) + return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); + } + + if (!preg_match( + "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", + ($v), $rr)) return false; + + if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0; + + // h-m-s-MM-DD-YY + if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); + return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]); + } + + /** + * Also in ADORecordSet. + * + * Format database date based on user defined format. + * + * @param v is the character date in YYYY-MM-DD format, returned by database + * @param fmt is the format to apply to it, using date() + * + * @return a date formated as user desires + */ + + function UserDate($v,$fmt='Y-m-d',$gmt=false) + { + $tt = $this->UnixDate($v); + + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + else if ($tt == 0) return $this->emptyDate; + else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR + } + + return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); + + } + + /** + * + * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format + * @param fmt is the format to apply to it, using date() + * + * @return a timestamp formated as user desires + */ + function UserTimeStamp($v,$fmt='Y-m-d H:i:s',$gmt=false) + { + if (!isset($v)) return $this->emptyTimeStamp; + # strlen(14) allows YYYYMMDDHHMMSS format + if (is_numeric($v) && strlen($v)<14) return ($gmt) ? adodb_gmdate($fmt,$v) : adodb_date($fmt,$v); + $tt = $this->UnixTimeStamp($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + if ($tt == 0) return $this->emptyTimeStamp; + return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); + } + + function escape($s,$magic_quotes=false) + { + return $this->addq($s,$magic_quotes); + } + + /** + * Quotes a string, without prefixing nor appending quotes. + */ + function addq($s,$magic_quotes=false) + { + if (!$magic_quotes) { + + if ($this->replaceQuote[0] == '\\'){ + // only since php 4.0.5 + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); + } + return str_replace("'",$this->replaceQuote,$s); + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + + if ($this->replaceQuote == "\\'" || ini_get('magic_quotes_sybase')) // ' already quoted, no need to change anything + return $s; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return str_replace("\\'",$this->replaceQuote,$s); + } + } + + /** + * Correctly quotes a string so that all strings are escaped. We prefix and append + * to the string single-quotes. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + if (!$magic_quotes) { + + if ($this->replaceQuote[0] == '\\'){ + // only since php 4.0.5 + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + + if ($this->replaceQuote == "\\'" || ini_get('magic_quotes_sybase')) // ' already quoted, no need to change anything + return "'$s'"; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } + } + + + /** + * Will select the supplied $page number from a recordset, given that it is paginated in pages of + * $nrows rows per page. It also saves two boolean values saying if the given page is the first + * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination. + * + * See readme.htm#ex8 for an example of usage. + * + * @param sql + * @param nrows is the number of rows per page to get + * @param page is the page number to get (1-based) + * @param [inputarr] array of bind variables + * @param [secs2cache] is a private parameter only used by jlim + * @return the recordset ($rs->databaseType == 'array') + * + * NOTE: phpLens uses a different algorithm and does not use PageExecute(). + * + */ + function PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + if ($this->pageExecuteCountRows) $rs = _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache); + else $rs = _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache); + return $rs; + } + + + /** + * Will select the supplied $page number from a recordset, given that it is paginated in pages of + * $nrows rows per page. It also saves two boolean values saying if the given page is the first + * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination. + * + * @param secs2cache seconds to cache data, set to 0 to force query + * @param sql + * @param nrows is the number of rows per page to get + * @param page is the page number to get (1-based) + * @param [inputarr] array of bind variables + * @return the recordset ($rs->databaseType == 'array') + */ + function CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false) + { + /*switch($this->dataProvider) { + case 'postgres': + case 'mysql': + break; + default: $secs2cache = 0; break; + }*/ + $rs = $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache); + return $rs; + } + +} // end class ADOConnection + + + + //============================================================================================== + // CLASS ADOFetchObj + //============================================================================================== + + /** + * Internal placeholder for record objects. Used by ADORecordSet->FetchObj(). + */ + class ADOFetchObj { + }; + + //============================================================================================== + // CLASS ADORecordSet_empty + //============================================================================================== + + class ADODB_Iterator_empty implements Iterator { + + private $rs; + + function __construct($rs) + { + $this->rs = $rs; + } + function rewind() + { + } + + function valid() + { + return !$this->rs->EOF; + } + + function key() + { + return false; + } + + function current() + { + return false; + } + + function next() + { + } + + function __call($func, $params) + { + return call_user_func_array(array($this->rs, $func), $params); + } + + function hasMore() + { + return false; + } + + } + + + /** + * Lightweight recordset when there are no records to be returned + */ + class ADORecordSet_empty implements IteratorAggregate + { + var $dataProvider = 'empty'; + var $databaseType = false; + var $EOF = true; + var $_numOfRows = 0; + var $fields = false; + var $connection = false; + function RowCount() {return 0;} + function RecordCount() {return 0;} + function PO_RecordCount(){return 0;} + function Close(){return true;} + function FetchRow() {return false;} + function FieldCount(){ return 0;} + function Init() {} + function getIterator() {return new ADODB_Iterator_empty($this);} + } + + //============================================================================================== + // DATE AND TIME FUNCTIONS + //============================================================================================== + if (!defined('ADODB_DATE_VERSION')) include(ADODB_DIR.'/adodb-time.inc.php'); + + //============================================================================================== + // CLASS ADORecordSet + //============================================================================================== + + class ADODB_Iterator implements Iterator { + + private $rs; + + function __construct($rs) + { + $this->rs = $rs; + } + function rewind() + { + $this->rs->MoveFirst(); + } + + function valid() + { + return !$this->rs->EOF; + } + + function key() + { + return $this->rs->_currentRow; + } + + function current() + { + return $this->rs->fields; + } + + function next() + { + $this->rs->MoveNext(); + } + + function __call($func, $params) + { + return call_user_func_array(array($this->rs, $func), $params); + } + + + function hasMore() + { + return !$this->rs->EOF; + } + + } + + + + /** + * RecordSet class that represents the dataset returned by the database. + * To keep memory overhead low, this class holds only the current row in memory. + * No prefetching of data is done, so the RecordCount() can return -1 ( which + * means recordcount not known). + */ + class ADORecordSet implements IteratorAggregate { + /* + * public variables + */ + var $dataProvider = "native"; + var $fields = false; /// holds the current row data + var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob + /// in other words, we use a text area for editing. + var $canSeek = false; /// indicates that seek is supported + var $sql; /// sql text + var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object. + + var $emptyTimeStamp = ' '; /// what to display when $time==0 + var $emptyDate = ' '; /// what to display when $time==0 + var $debug = false; + var $timeCreated=0; /// datetime in Unix format rs created -- for cached recordsets + + var $bind = false; /// used by Fields() to hold array - should be private? + var $fetchMode; /// default fetch mode + var $connection = false; /// the parent connection + /* + * private variables + */ + var $_numOfRows = -1; /** number of rows, or -1 */ + var $_numOfFields = -1; /** number of fields in recordset */ + var $_queryID = -1; /** This variable keeps the result link identifier. */ + var $_currentRow = -1; /** This variable keeps the current row in the Recordset. */ + var $_closed = false; /** has recordset been closed */ + var $_inited = false; /** Init() should only be called once */ + var $_obj; /** Used by FetchObj */ + var $_names; /** Used by FetchObj */ + + var $_currentPage = -1; /** Added by Iván Oliva to implement recordset pagination */ + var $_atFirstPage = false; /** Added by Iván Oliva to implement recordset pagination */ + var $_atLastPage = false; /** Added by Iván Oliva to implement recordset pagination */ + var $_lastPageNo = -1; + var $_maxRecordCount = 0; + var $datetime = false; + + /** + * Constructor + * + * @param queryID this is the queryID returned by ADOConnection->_query() + * + */ + function ADORecordSet($queryID) + { + $this->_queryID = $queryID; + } + + function getIterator() + { + return new ADODB_Iterator($this); + } + + /* this is experimental - i don't really know what to return... */ + function __toString() + { + include_once(ADODB_DIR.'/toexport.inc.php'); + return _adodb_export($this,',',',',false,true); + } + + + function Init() + { + if ($this->_inited) return; + $this->_inited = true; + if ($this->_queryID) @$this->_initrs(); + else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + } + if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) { + + $this->_currentRow = 0; + if ($this->EOF = ($this->_fetch() === false)) { + $this->_numOfRows = 0; // _numOfRows could be -1 + } + } else { + $this->EOF = true; + } + } + + + /** + * Generate a SELECT tag string from a recordset, and return the string. + * If the recordset has 2 cols, we treat the 1st col as the containing + * the text to display to the user, and 2nd col as the return value. Default + * strings are compared with the FIRST column. + * + * @param name name of SELECT tag + * @param [defstr] the value to hilite. Use an array for multiple hilites for listbox. + * @param [blank1stItem] true to leave the 1st item in list empty + * @param [multiple] true for listbox, false for popup + * @param [size] #rows to show for listbox. not used by popup + * @param [selectAttr] additional attributes to defined for SELECT tag. + * useful for holding javascript onChange='...' handlers. + & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with + * column 0 (1st col) if this is true. This is not documented. + * + * @return HTML + * + * changes by glen.davies@cce.ac.nz to support multiple hilited items + */ + function GetMenu($name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,$compareFields0); + } + + + + /** + * Generate a SELECT tag string from a recordset, and return the string. + * If the recordset has 2 cols, we treat the 1st col as the containing + * the text to display to the user, and 2nd col as the return value. Default + * strings are compared with the SECOND column. + * + */ + function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='') + { + return $this->GetMenu($name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,false); + } + + /* + Grouped Menu + */ + function GetMenu3($name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='') + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getmenu_gp($this, $name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,false); + } + + /** + * return recordset as a 2-dimensional array. + * + * @param [nRows] is the number of rows to return. -1 means every row. + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function GetArray($nRows = -1) + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) { + $results = adodb_getall($this,$nRows); + return $results; + } + $results = array(); + $cnt = 0; + while (!$this->EOF && $nRows != $cnt) { + $results[] = $this->fields; + $this->MoveNext(); + $cnt++; + } + return $results; + } + + function GetAll($nRows = -1) + { + $arr = $this->GetArray($nRows); + return $arr; + } + + /* + * Some databases allow multiple recordsets to be returned. This function + * will return true if there is a next recordset, or false if no more. + */ + function NextRecordSet() + { + return false; + } + + /** + * return recordset as a 2-dimensional array. + * Helper function for ADOConnection->SelectLimit() + * + * @param offset is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to return + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr = $this->GetArray($nrows); + return $arr; + } + + $this->Move($offset); + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + /** + * Synonym for GetArray() for compatibility with ADO. + * + * @param [nRows] is the number of rows to return. -1 means every row. + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function GetRows($nRows = -1) + { + $arr = $this->GetArray($nRows); + return $arr; + } + + /** + * return whole recordset as a 2-dimensional associative array if there are more than 2 columns. + * The first column is treated as the key and is not included in the array. + * If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless + * $force_array == true. + * + * @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional + * array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing, + * read the source. + * + * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and + * instead of returning array[col0] => array(remaining cols), return array[col0] => col1 + * + * @return an associative array indexed by the first column of the array, + * or false if the data has less than 2 cols. + */ + function GetAssoc($force_array = false, $first2cols = false) + { + global $ADODB_EXTENSION; + + $cols = $this->_numOfFields; + if ($cols < 2) { + $false = false; + return $false; + } + $numIndex = isset($this->fields[0]); + $results = array(); + + if (!$first2cols && ($cols > 2 || $force_array)) { + if ($ADODB_EXTENSION) { + if ($numIndex) { + while (!$this->EOF) { + $results[trim($this->fields[0])] = array_slice($this->fields, 1); + adodb_movenext($this); + } + } else { + while (!$this->EOF) { + // Fix for array_slice re-numbering numeric associative keys + $keys = array_slice(array_keys($this->fields), 1); + $sliced_array = array(); + + foreach($keys as $key) { + $sliced_array[$key] = $this->fields[$key]; + } + + $results[trim(reset($this->fields))] = $sliced_array; + adodb_movenext($this); + } + } + } else { + if ($numIndex) { + while (!$this->EOF) { + $results[trim($this->fields[0])] = array_slice($this->fields, 1); + $this->MoveNext(); + } + } else { + while (!$this->EOF) { + // Fix for array_slice re-numbering numeric associative keys + $keys = array_slice(array_keys($this->fields), 1); + $sliced_array = array(); + + foreach($keys as $key) { + $sliced_array[$key] = $this->fields[$key]; + } + + $results[trim(reset($this->fields))] = $sliced_array; + $this->MoveNext(); + } + } + } + } else { + if ($ADODB_EXTENSION) { + // return scalar values + if ($numIndex) { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $results[trim(($this->fields[0]))] = $this->fields[1]; + adodb_movenext($this); + } + } else { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $v1 = trim(reset($this->fields)); + $v2 = ''.next($this->fields); + $results[$v1] = $v2; + adodb_movenext($this); + } + } + } else { + if ($numIndex) { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $results[trim(($this->fields[0]))] = $this->fields[1]; + $this->MoveNext(); + } + } else { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $v1 = trim(reset($this->fields)); + $v2 = ''.next($this->fields); + $results[$v1] = $v2; + $this->MoveNext(); + } + } + } + } + + $ref = $results; # workaround accelerator incompat with PHP 4.4 :( + return $ref; + } + + + /** + * + * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format + * @param fmt is the format to apply to it, using date() + * + * @return a timestamp formated as user desires + */ + function UserTimeStamp($v,$fmt='Y-m-d H:i:s') + { + if (is_numeric($v) && strlen($v)<14) return adodb_date($fmt,$v); + $tt = $this->UnixTimeStamp($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + if ($tt === 0) return $this->emptyTimeStamp; + return adodb_date($fmt,$tt); + } + + + /** + * @param v is the character date in YYYY-MM-DD format, returned by database + * @param fmt is the format to apply to it, using date() + * + * @return a date formated as user desires + */ + function UserDate($v,$fmt='Y-m-d') + { + $tt = $this->UnixDate($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + else if ($tt == 0) return $this->emptyDate; + else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR + } + return adodb_date($fmt,$tt); + } + + + /** + * @param $v is a date string in YYYY-MM-DD format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixDate($v) + { + return ADOConnection::UnixDate($v); + } + + + /** + * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixTimeStamp($v) + { + return ADOConnection::UnixTimeStamp($v); + } + + + /** + * PEAR DB Compat - do not use internally + */ + function Free() + { + return $this->Close(); + } + + + /** + * PEAR DB compat, number of rows + */ + function NumRows() + { + return $this->_numOfRows; + } + + + /** + * PEAR DB compat, number of cols + */ + function NumCols() + { + return $this->_numOfFields; + } + + /** + * Fetch a row, returning false if no more rows. + * This is PEAR DB compat mode. + * + * @return false or array containing the current record + */ + function FetchRow() + { + if ($this->EOF) { + $false = false; + return $false; + } + $arr = $this->fields; + $this->_currentRow++; + if (!$this->_fetch()) $this->EOF = true; + return $arr; + } + + + /** + * Fetch a row, returning PEAR_Error if no more rows. + * This is PEAR DB compat mode. + * + * @return DB_OK or error object + */ + function FetchInto(&$arr) + { + if ($this->EOF) return (defined('PEAR_ERROR_RETURN')) ? new PEAR_Error('EOF',-1): false; + $arr = $this->fields; + $this->MoveNext(); + return 1; // DB_OK + } + + + /** + * Move to the first row in the recordset. Many databases do NOT support this. + * + * @return true or false + */ + function MoveFirst() + { + if ($this->_currentRow == 0) return true; + return $this->Move(0); + } + + + /** + * Move to the last row in the recordset. + * + * @return true or false + */ + function MoveLast() + { + if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1); + if ($this->EOF) return false; + while (!$this->EOF) { + $f = $this->fields; + $this->MoveNext(); + } + $this->fields = $f; + $this->EOF = false; + return true; + } + + + /** + * Move to next record in the recordset. + * + * @return true if there still rows available, or false if there are no more rows (EOF). + */ + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_fetch()) return true; + } + $this->EOF = true; + /* -- tested error handling when scrolling cursor -- seems useless. + $conn = $this->connection; + if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) { + $fn = $conn->raiseErrorFn; + $fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database); + } + */ + return false; + } + + + /** + * Random access to a specific row in the recordset. Some databases do not support + * access to previous rows in the databases (no scrolling backwards). + * + * @param rowNumber is the row to move to (0-based) + * + * @return true if there still rows available, or false if there are no more rows (EOF). + */ + function Move($rowNumber = 0) + { + $this->EOF = false; + if ($rowNumber == $this->_currentRow) return true; + if ($rowNumber >= $this->_numOfRows) + if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2; + + if ($this->canSeek) { + + if ($this->_seek($rowNumber)) { + $this->_currentRow = $rowNumber; + if ($this->_fetch()) { + return true; + } + } else { + $this->EOF = true; + return false; + } + } else { + if ($rowNumber < $this->_currentRow) return false; + global $ADODB_EXTENSION; + if ($ADODB_EXTENSION) { + while (!$this->EOF && $this->_currentRow < $rowNumber) { + adodb_movenext($this); + } + } else { + + while (! $this->EOF && $this->_currentRow < $rowNumber) { + $this->_currentRow++; + + if (!$this->_fetch()) $this->EOF = true; + } + } + return !($this->EOF); + } + + $this->fields = false; + $this->EOF = true; + return false; + } + + + /** + * Get the value of a field in the current row by column name. + * Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM. + * + * @param colname is the field to access + * + * @return the value of $colname column + */ + function Fields($colname) + { + return $this->fields[$colname]; + } + + function GetAssocKeys($upper=true) + { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + if ($upper === 2) $this->bind[$o->name] = $i; + else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i; + } + } + + /** + * Use associative array to get fields array for databases that do not support + * associative arrays. Submitted by Paolo S. Asioli paolo.asioli#libero.it + * + * If you don't want uppercase cols, set $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC + * before you execute your SQL statement, and access $rs->fields['col'] directly. + * + * $upper 0 = lowercase, 1 = uppercase, 2 = whatever is returned by FetchField + */ + function GetRowAssoc($upper=1) + { + $record = array(); + // if (!$this->fields) return $record; + + if (!$this->bind) { + $this->GetAssocKeys($upper); + } + + foreach($this->bind as $k => $v) { + $record[$k] = $this->fields[$v]; + } + + return $record; + } + + + /** + * Clean up recordset + * + * @return true or false + */ + function Close() + { + // free connection object - this seems to globally free the object + // and not merely the reference, so don't do this... + // $this->connection = false; + if (!$this->_closed) { + $this->_closed = true; + return $this->_close(); + } else + return true; + } + + /** + * synonyms RecordCount and RowCount + * + * @return the number of rows or -1 if this is not supported + */ + function RecordCount() {return $this->_numOfRows;} + + + /* + * If we are using PageExecute(), this will return the maximum possible rows + * that can be returned when paging a recordset. + */ + function MaxRecordCount() + { + return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount(); + } + + /** + * synonyms RecordCount and RowCount + * + * @return the number of rows or -1 if this is not supported + */ + function RowCount() {return $this->_numOfRows;} + + + /** + * Portable RecordCount. Pablo Roca + * + * @return the number of records from a previous SELECT. All databases support this. + * + * But aware possible problems in multiuser environments. For better speed the table + * must be indexed by the condition. Heavy test this before deploying. + */ + function PO_RecordCount($table="", $condition="") { + + $lnumrows = $this->_numOfRows; + // the database doesn't support native recordcount, so we do a workaround + if ($lnumrows == -1 && $this->connection) { + IF ($table) { + if ($condition) $condition = " WHERE " . $condition; + $resultrows = $this->connection->Execute("SELECT COUNT(*) FROM $table $condition"); + if ($resultrows) $lnumrows = reset($resultrows->fields); + } + } + return $lnumrows; + } + + + /** + * @return the current row in the recordset. If at EOF, will return the last row. 0-based. + */ + function CurrentRow() {return $this->_currentRow;} + + /** + * synonym for CurrentRow -- for ADO compat + * + * @return the current row in the recordset. If at EOF, will return the last row. 0-based. + */ + function AbsolutePosition() {return $this->_currentRow;} + + /** + * @return the number of columns in the recordset. Some databases will set this to 0 + * if no records are returned, others will return the number of columns in the query. + */ + function FieldCount() {return $this->_numOfFields;} + + + /** + * Get the ADOFieldObject of a specific column. + * + * @param fieldoffset is the column position to access(0-based). + * + * @return the ADOFieldObject for that column, or false. + */ + function FetchField($fieldoffset = -1) + { + // must be defined by child class + + $false = false; + return $false; + } + + /** + * Get the ADOFieldObjects of all columns in an array. + * + */ + function FieldTypesArray() + { + $arr = array(); + for ($i=0, $max=$this->_numOfFields; $i < $max; $i++) + $arr[] = $this->FetchField($i); + return $arr; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default case is lowercase field names. + * + * @return the object with the properties set to the fields of the current row + */ + function FetchObj() + { + $o = $this->FetchObject(false); + return $o; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default case is uppercase. + * + * @param $isupper to set the object property names to uppercase + * + * @return the object with the properties set to the fields of the current row + */ + function FetchObject($isupper=true) + { + if (empty($this->_obj)) { + $this->_obj = new ADOFetchObj(); + $this->_names = array(); + for ($i=0; $i <$this->_numOfFields; $i++) { + $f = $this->FetchField($i); + $this->_names[] = $f->name; + } + } + $i = 0; + if (PHP_VERSION >= 5) $o = clone($this->_obj); + else $o = $this->_obj; + + for ($i=0; $i <$this->_numOfFields; $i++) { + $name = $this->_names[$i]; + if ($isupper) $n = strtoupper($name); + else $n = $name; + + $o->$n = $this->Fields($name); + } + return $o; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default is lower-case field names. + * + * @return the object with the properties set to the fields of the current row, + * or false if EOF + * + * Fixed bug reported by tim@orotech.net + */ + function FetchNextObj() + { + $o = $this->FetchNextObject(false); + return $o; + } + + + /** + * Return the fields array of the current row as an object for convenience. + * The default is upper case field names. + * + * @param $isupper to set the object property names to uppercase + * + * @return the object with the properties set to the fields of the current row, + * or false if EOF + * + * Fixed bug reported by tim@orotech.net + */ + function FetchNextObject($isupper=true) + { + $o = false; + if ($this->_numOfRows != 0 && !$this->EOF) { + $o = $this->FetchObject($isupper); + $this->_currentRow++; + if ($this->_fetch()) return $o; + } + $this->EOF = true; + return $o; + } + + /** + * Get the metatype of the column. This is used for formatting. This is because + * many databases use different names for the same type, so we transform the original + * type to our standardised version which uses 1 character codes: + * + * @param t is the type passed in. Normally is ADOFieldObject->type. + * @param len is the maximum length of that field. This is because we treat character + * fields bigger than a certain size as a 'B' (blob). + * @param fieldobj is the field object returned by the database driver. Can hold + * additional info (eg. primary_key for mysql). + * + * @return the general type of the data: + * C for character < 250 chars + * X for teXt (>= 250 chars) + * B for Binary + * N for numeric or floating point + * D for date + * T for timestamp + * L for logical/Boolean + * I for integer + * R for autoincrement counter/integer + * + * + */ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + // changed in 2.32 to hashing instead of switch stmt for speed... + static $typeMap = array( + 'VARCHAR' => 'C', + 'VARCHAR2' => 'C', + 'CHAR' => 'C', + 'C' => 'C', + 'STRING' => 'C', + 'NCHAR' => 'C', + 'NVARCHAR' => 'C', + 'VARYING' => 'C', + 'BPCHAR' => 'C', + 'CHARACTER' => 'C', + 'INTERVAL' => 'C', # Postgres + 'MACADDR' => 'C', # postgres + 'VAR_STRING' => 'C', # mysql + ## + 'LONGCHAR' => 'X', + 'TEXT' => 'X', + 'NTEXT' => 'X', + 'M' => 'X', + 'X' => 'X', + 'CLOB' => 'X', + 'NCLOB' => 'X', + 'LVARCHAR' => 'X', + ## + 'BLOB' => 'B', + 'IMAGE' => 'B', + 'BINARY' => 'B', + 'VARBINARY' => 'B', + 'LONGBINARY' => 'B', + 'B' => 'B', + ## + 'YEAR' => 'D', // mysql + 'DATE' => 'D', + 'D' => 'D', + ## + 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server + ## + 'SMALLDATETIME' => 'T', + 'TIME' => 'T', + 'TIMESTAMP' => 'T', + 'DATETIME' => 'T', + 'TIMESTAMPTZ' => 'T', + 'T' => 'T', + 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql + ## + 'BOOL' => 'L', + 'BOOLEAN' => 'L', + 'BIT' => 'L', + 'L' => 'L', + ## + 'COUNTER' => 'R', + 'R' => 'R', + 'SERIAL' => 'R', // ifx + 'INT IDENTITY' => 'R', + ## + 'INT' => 'I', + 'INT2' => 'I', + 'INT4' => 'I', + 'INT8' => 'I', + 'INTEGER' => 'I', + 'INTEGER UNSIGNED' => 'I', + 'SHORT' => 'I', + 'TINYINT' => 'I', + 'SMALLINT' => 'I', + 'I' => 'I', + ## + 'LONG' => 'N', // interbase is numeric, oci8 is blob + 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers + 'DECIMAL' => 'N', + 'DEC' => 'N', + 'REAL' => 'N', + 'DOUBLE' => 'N', + 'DOUBLE PRECISION' => 'N', + 'SMALLFLOAT' => 'N', + 'FLOAT' => 'N', + 'NUMBER' => 'N', + 'NUM' => 'N', + 'NUMERIC' => 'N', + 'MONEY' => 'N', + + ## informix 9.2 + 'SQLINT' => 'I', + 'SQLSERIAL' => 'I', + 'SQLSMINT' => 'I', + 'SQLSMFLOAT' => 'N', + 'SQLFLOAT' => 'N', + 'SQLMONEY' => 'N', + 'SQLDECIMAL' => 'N', + 'SQLDATE' => 'D', + 'SQLVCHAR' => 'C', + 'SQLCHAR' => 'C', + 'SQLDTIME' => 'T', + 'SQLINTERVAL' => 'N', + 'SQLBYTES' => 'B', + 'SQLTEXT' => 'X', + ## informix 10 + "SQLINT8" => 'I8', + "SQLSERIAL8" => 'I8', + "SQLNCHAR" => 'C', + "SQLNVCHAR" => 'C', + "SQLLVARCHAR" => 'X', + "SQLBOOL" => 'L' + ); + + $tmap = false; + $t = strtoupper($t); + $tmap = (isset($typeMap[$t])) ? $typeMap[$t] : 'N'; + switch ($tmap) { + case 'C': + + // is the char field is too long, return as text field... + if ($this->blobSize >= 0) { + if ($len > $this->blobSize) return 'X'; + } else if ($len > 250) { + return 'X'; + } + return 'C'; + + case 'I': + if (!empty($fieldobj->primary_key)) return 'R'; + return 'I'; + + case false: + return 'N'; + + case 'B': + if (isset($fieldobj->binary)) + return ($fieldobj->binary) ? 'B' : 'X'; + return 'B'; + + case 'D': + if (!empty($this->connection) && !empty($this->connection->datetime)) return 'T'; + return 'D'; + + default: + if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B'; + return $tmap; + } + } + + + function _close() {} + + /** + * set/returns the current recordset page when paginating + */ + function AbsolutePage($page=-1) + { + if ($page != -1) $this->_currentPage = $page; + return $this->_currentPage; + } + + /** + * set/returns the status of the atFirstPage flag when paginating + */ + function AtFirstPage($status=false) + { + if ($status != false) $this->_atFirstPage = $status; + return $this->_atFirstPage; + } + + function LastPageNo($page = false) + { + if ($page != false) $this->_lastPageNo = $page; + return $this->_lastPageNo; + } + + /** + * set/returns the status of the atLastPage flag when paginating + */ + function AtLastPage($status=false) + { + if ($status != false) $this->_atLastPage = $status; + return $this->_atLastPage; + } + +} // end class ADORecordSet + + //============================================================================================== + // CLASS ADORecordSet_array + //============================================================================================== + + /** + * This class encapsulates the concept of a recordset created in memory + * as an array. This is useful for the creation of cached recordsets. + * + * Note that the constructor is different from the standard ADORecordSet + */ + + class ADORecordSet_array extends ADORecordSet + { + var $databaseType = 'array'; + + var $_array; // holds the 2-dimensional data array + var $_types; // the array of types of each column (C B I L M) + var $_colnames; // names of each column in array + var $_skiprow1; // skip 1st row because it holds column names + var $_fieldobjects; // holds array of field objects + var $canSeek = true; + var $affectedrows = false; + var $insertid = false; + var $sql = ''; + var $compat = false; + /** + * Constructor + * + */ + function ADORecordSet_array($fakeid=1) + { + global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH; + + // fetch() on EOF does not delete $this->fields + $this->compat = !empty($ADODB_COMPAT_FETCH); + $this->ADORecordSet($fakeid); // fake queryID + $this->fetchMode = $ADODB_FETCH_MODE; + } + + function _transpose($addfieldnames=true) + { + global $ADODB_INCLUDED_LIB; + + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + $hdr = true; + + $fobjs = $addfieldnames ? $this->_fieldobjects : false; + adodb_transpose($this->_array, $newarr, $hdr, $fobjs); + //adodb_pr($newarr); + + $this->_skiprow1 = false; + $this->_array = $newarr; + $this->_colnames = $hdr; + + adodb_probetypes($newarr,$this->_types); + + $this->_fieldobjects = array(); + + foreach($hdr as $k => $name) { + $f = new ADOFieldObject(); + $f->name = $name; + $f->type = $this->_types[$k]; + $f->max_length = -1; + $this->_fieldobjects[] = $f; + } + $this->fields = reset($this->_array); + + $this->_initrs(); + + } + + /** + * Setup the array. + * + * @param array is a 2-dimensional array holding the data. + * The first row should hold the column names + * unless paramter $colnames is used. + * @param typearr holds an array of types. These are the same types + * used in MetaTypes (C,B,L,I,N). + * @param [colnames] array of column names. If set, then the first row of + * $array should not hold the column names. + */ + function InitArray($array,$typearr,$colnames=false) + { + $this->_array = $array; + $this->_types = $typearr; + if ($colnames) { + $this->_skiprow1 = false; + $this->_colnames = $colnames; + } else { + $this->_skiprow1 = true; + $this->_colnames = $array[0]; + } + $this->Init(); + } + /** + * Setup the Array and datatype file objects + * + * @param array is a 2-dimensional array holding the data. + * The first row should hold the column names + * unless paramter $colnames is used. + * @param fieldarr holds an array of ADOFieldObject's. + */ + function InitArrayFields(&$array,&$fieldarr) + { + $this->_array = $array; + $this->_skiprow1= false; + if ($fieldarr) { + $this->_fieldobjects = $fieldarr; + } + $this->Init(); + } + + function GetArray($nRows=-1) + { + if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) { + return $this->_array; + } else { + $arr = ADORecordSet::GetArray($nRows); + return $arr; + } + } + + function _initrs() + { + $this->_numOfRows = sizeof($this->_array); + if ($this->_skiprow1) $this->_numOfRows -= 1; + + $this->_numOfFields =(isset($this->_fieldobjects)) ? + sizeof($this->_fieldobjects):sizeof($this->_types); + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode; + + if ($mode & ADODB_FETCH_ASSOC) { + if (!isset($this->fields[$colname]) && !is_null($this->fields[$colname])) $colname = strtolower($colname); + return $this->fields[$colname]; + } + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function FetchField($fieldOffset = -1) + { + if (isset($this->_fieldobjects)) { + return $this->_fieldobjects[$fieldOffset]; + } + $o = new ADOFieldObject(); + $o->name = $this->_colnames[$fieldOffset]; + $o->type = $this->_types[$fieldOffset]; + $o->max_length = -1; // length not known + + return $o; + } + + function _seek($row) + { + if (sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) { + $this->_currentRow = $row; + if ($this->_skiprow1) $row += 1; + $this->fields = $this->_array[$row]; + return true; + } + return false; + } + + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + + $pos = $this->_currentRow; + + if ($this->_numOfRows <= $pos) { + if (!$this->compat) $this->fields = false; + } else { + if ($this->_skiprow1) $pos += 1; + $this->fields = $this->_array[$pos]; + return true; + } + $this->EOF = true; + } + + return false; + } + + function _fetch() + { + $pos = $this->_currentRow; + + if ($this->_numOfRows <= $pos) { + if (!$this->compat) $this->fields = false; + return false; + } + if ($this->_skiprow1) $pos += 1; + $this->fields = $this->_array[$pos]; + return true; + } + + function _close() + { + return true; + } + + } // ADORecordSet_array + + //============================================================================================== + // HELPER FUNCTIONS + //============================================================================================== + + /** + * Synonym for ADOLoadCode. Private function. Do not use. + * + * @deprecated + */ + function ADOLoadDB($dbType) + { + return ADOLoadCode($dbType); + } + + /** + * Load the code for a specific database driver. Private function. Do not use. + */ + function ADOLoadCode($dbType) + { + global $ADODB_LASTDB; + + if (!$dbType) return false; + $db = strtolower($dbType); + switch ($db) { + case 'ado': + if (PHP_VERSION >= 5) $db = 'ado5'; + $class = 'ado'; + break; + case 'ifx': + case 'maxsql': $class = $db = 'mysqlt'; break; + case 'postgres': + case 'postgres8': + case 'pgsql': $class = $db = 'postgres7'; break; + default: + $class = $db; break; + } + + $file = ADODB_DIR."/drivers/adodb-".$db.".inc.php"; + @include_once($file); + $ADODB_LASTDB = $class; + if (class_exists("ADODB_" . $class)) return $class; + + //ADOConnection::outp(adodb_pr(get_declared_classes(),true)); + if (!file_exists($file)) ADOConnection::outp("Missing file: $file"); + else ADOConnection::outp("Syntax error in file: $file"); + return false; + } + + /** + * synonym for ADONewConnection for people like me who cannot remember the correct name + */ + function NewADOConnection($db='') + { + $tmp = ADONewConnection($db); + return $tmp; + } + + /** + * Instantiate a new Connection class for a specific database driver. + * + * @param [db] is the database Connection object to create. If undefined, + * use the last database driver that was loaded by ADOLoadCode(). + * + * @return the freshly created instance of the Connection class. + */ + function ADONewConnection($db='') + { + GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB; + + if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); + $errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false; + $false = false; + if (($at = strpos($db,'://')) !== FALSE) { + $origdsn = $db; + $fakedsn = 'fake'.substr($origdsn,$at); + if (($at2 = strpos($origdsn,'@/')) !== FALSE) { + // special handling of oracle, which might not have host + $fakedsn = str_replace('@/','@adodb-fakehost/',$fakedsn); + } + $dsna = @parse_url($fakedsn); + if (!$dsna) { + return $false; + } + $dsna['scheme'] = substr($origdsn,0,$at); + if ($at2 !== FALSE) { + $dsna['host'] = ''; + } + + if (strncmp($origdsn,'pdo',3) == 0) { + $sch = explode('_',$dsna['scheme']); + if (sizeof($sch)>1) { + + $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; + if ($sch[1] == 'sqlite') + $dsna['host'] = rawurlencode($sch[1].':'.rawurldecode($dsna['host'])); + else + $dsna['host'] = rawurlencode($sch[1].':host='.rawurldecode($dsna['host'])); + $dsna['scheme'] = 'pdo'; + } + } + + $db = @$dsna['scheme']; + if (!$db) return $false; + $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; + $dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : ''; + $dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : ''; + $dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : ''; # strip off initial / + + if (isset($dsna['query'])) { + $opt1 = explode('&',$dsna['query']); + foreach($opt1 as $k => $v) { + $arr = explode('=',$v); + $opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1; + } + } else $opt = array(); + } + /* + * phptype: Database backend used in PHP (mysql, odbc etc.) + * dbsyntax: Database used with regards to SQL syntax etc. + * protocol: Communication protocol to use (tcp, unix etc.) + * hostspec: Host specification (hostname[:port]) + * database: Database to use on the DBMS server + * username: User name for login + * password: Password for login + */ + if (!empty($ADODB_NEWCONNECTION)) { + $obj = $ADODB_NEWCONNECTION($db); + + } + + if(empty($obj)) { + + if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = ''; + if (empty($db)) $db = $ADODB_LASTDB; + + if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db); + + if (!$db) { + if (isset($origdsn)) $db = $origdsn; + if ($errorfn) { + // raise an error + $ignore = false; + $errorfn('ADONewConnection', 'ADONewConnection', -998, + "could not load the database driver for '$db'", + $db,false,$ignore); + } else + ADOConnection::outp( "

        ADONewConnection: Unable to load database driver '$db'

        ",false); + + return $false; + } + + $cls = 'ADODB_'.$db; + if (!class_exists($cls)) { + adodb_backtrace(); + return $false; + } + + $obj = new $cls(); + } + + # constructor should not fail + if ($obj) { + if ($errorfn) $obj->raiseErrorFn = $errorfn; + if (isset($dsna)) { + if (isset($dsna['port'])) $obj->port = $dsna['port']; + foreach($opt as $k => $v) { + switch(strtolower($k)) { + case 'new': + $nconnect = true; $persist = true; break; + case 'persist': + case 'persistent': $persist = $v; break; + case 'debug': $obj->debug = (integer) $v; break; + #ibase + case 'role': $obj->role = $v; break; + case 'dialect': $obj->dialect = (integer) $v; break; + case 'charset': $obj->charset = $v; $obj->charSet=$v; break; + case 'buffers': $obj->buffers = $v; break; + case 'fetchmode': $obj->SetFetchMode($v); break; + #ado + case 'charpage': $obj->charPage = $v; break; + #mysql, mysqli + case 'clientflags': $obj->clientFlags = $v; break; + #mysql, mysqli, postgres + case 'port': $obj->port = $v; break; + #mysqli + case 'socket': $obj->socket = $v; break; + #oci8 + case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v; break; + case 'cachesecs': $obj->cacheSecs = $v; break; + case 'memcache': + $varr = explode(':',$v); + $vlen = sizeof($varr); + if ($vlen == 0) break; + $obj->memCache = true; + $obj->memCacheHost = explode(',',$varr[0]); + if ($vlen == 1) break; + $obj->memCachePort = $varr[1]; + if ($vlen == 2) break; + $obj->memCacheCompress = $varr[2] ? true : false; + break; + } + } + if (empty($persist)) + $ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + else if (empty($nconnect)) + $ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + else + $ok = $obj->NConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + + if (!$ok) return $false; + } + } + return $obj; + } + + + + // $perf == true means called by NewPerfMonitor(), otherwise for data dictionary + function _adodb_getdriver($provider,$drivername,$perf=false) + { + switch ($provider) { + case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6); + case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5); + case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4); + case 'native': break; + default: + return $provider; + } + + switch($drivername) { + case 'mysqlt': + case 'mysqli': + $drivername='mysql'; + break; + case 'postgres7': + case 'postgres8': + $drivername = 'postgres'; + break; + case 'firebird15': $drivername = 'firebird'; break; + case 'oracle': $drivername = 'oci8'; break; + case 'access': if ($perf) $drivername = ''; break; + case 'db2' : break; + case 'sapdb' : break; + default: + $drivername = 'generic'; + break; + } + return $drivername; + } + + function NewPerfMonitor(&$conn) + { + $false = false; + $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType,true); + if (!$drivername || $drivername == 'generic') return $false; + include_once(ADODB_DIR.'/adodb-perf.inc.php'); + @include_once(ADODB_DIR."/perf/perf-$drivername.inc.php"); + $class = "Perf_$drivername"; + if (!class_exists($class)) return $false; + $perf = new $class($conn); + + return $perf; + } + + function NewDataDictionary(&$conn,$drivername=false) + { + $false = false; + if (!$drivername) $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType); + + include_once(ADODB_DIR.'/adodb-lib.inc.php'); + include_once(ADODB_DIR.'/adodb-datadict.inc.php'); + $path = ADODB_DIR."/datadict/datadict-$drivername.inc.php"; + + if (!file_exists($path)) { + ADOConnection::outp("Dictionary driver '$path' not available"); + return $false; + } + include_once($path); + $class = "ADODB2_$drivername"; + $dict = new $class(); + $dict->dataProvider = $conn->dataProvider; + $dict->connection = $conn; + $dict->upperName = strtoupper($drivername); + $dict->quote = $conn->nameQuote; + if (!empty($conn->_connectionID)) + $dict->serverInfo = $conn->ServerInfo(); + + return $dict; + } + + + + /* + Perform a print_r, with pre tags for better formatting. + */ + function adodb_pr($var,$as_string=false) + { + if ($as_string) ob_start(); + + if (isset($_SERVER['HTTP_USER_AGENT'])) { + echo "
        \n";print_r($var);echo "
        \n"; + } else + print_r($var); + + if ($as_string) { + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + } + + /* + Perform a stack-crawl and pretty print it. + + @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then). + @param levels Number of levels to display + */ + function adodb_backtrace($printOrArr=true,$levels=9999,$ishtml=null) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_backtrace($printOrArr,$levels,0,$ishtml); + } + + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/contrib/toxmlrpc.inc.php b/fannie/adodb5/contrib/toxmlrpc.inc.php new file mode 100644 index 000000000..030d60aff --- /dev/null +++ b/fannie/adodb5/contrib/toxmlrpc.inc.php @@ -0,0 +1,183 @@ +GetArray()) would work with: + * - ADODB_FETCH_BOTH + * - null values + */ + + /** + * Include the main libraries + */ + require_once('xmlrpc.inc'); + if (!defined('ADODB_DIR')) require_once('adodb.inc.php'); + + /** + * Builds an xmlrpc struct value out of an AdoDB recordset + */ + function rs2xmlrpcval(&$adodbrs) { + + $header = rs2xmlrpcval_header($adodbrs); + $body = rs2xmlrpcval_body($adodbrs); + + // put it all together and build final xmlrpc struct + $xmlrpcrs = new xmlrpcval ( array( + "header" => $header, + "body" => $body, + ), "struct"); + + return $xmlrpcrs; + + } + + /** + * Builds an xmlrpc struct value describing an AdoDB recordset + */ + function rs2xmlrpcval_header($adodbrs) + { + $numfields = $adodbrs->FieldCount(); + $numrecords = $adodbrs->RecordCount(); + + // build structure holding recordset information + $fieldstruct = array(); + for ($i = 0; $i < $numfields; $i++) { + $fld = $adodbrs->FetchField($i); + $fieldarray = array(); + if (isset($fld->name)) + $fieldarray["name"] = new xmlrpcval ($fld->name); + if (isset($fld->type)) + $fieldarray["type"] = new xmlrpcval ($fld->type); + if (isset($fld->max_length)) + $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int"); + if (isset($fld->not_null)) + $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean"); + if (isset($fld->has_default)) + $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean"); + if (isset($fld->default_value)) + $fieldarray["default_value"] = new xmlrpcval ($fld->default_value); + $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct"); + } + $fieldcount = new xmlrpcval ($numfields, "int"); + $recordcount = new xmlrpcval ($numrecords, "int"); + $sql = new xmlrpcval ($adodbrs->sql); + $fieldinfo = new xmlrpcval ($fieldstruct, "array"); + + $header = new xmlrpcval ( array( + "fieldcount" => $fieldcount, + "recordcount" => $recordcount, + "sql" => $sql, + "fieldinfo" => $fieldinfo + ), "struct"); + + return $header; + } + + /** + * Builds an xmlrpc struct value out of an AdoDB recordset + * (data values only, no data definition) + */ + function rs2xmlrpcval_body($adodbrs) + { + $numfields = $adodbrs->FieldCount(); + + // build structure containing recordset data + $adodbrs->MoveFirst(); + $rows = array(); + while (!$adodbrs->EOF) { + $columns = array(); + // This should work on all cases of fetch mode: assoc, num, both or default + if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount()) + for ($i = 0; $i < $numfields; $i++) + if ($adodbrs->fields[$i] === null) + $columns[$i] = new xmlrpcval (''); + else + $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]); + else + foreach ($adodbrs->fields as $val) + if ($val === null) + $columns[] = new xmlrpcval (''); + else + $columns[] = xmlrpc_encode ($val); + + $rows[] = new xmlrpcval ($columns, "array"); + + $adodbrs->MoveNext(); + } + $body = new xmlrpcval ($rows, "array"); + + return $body; + } + + /** + * Returns an xmlrpc struct value as string out of an AdoDB recordset + */ + function rs2xmlrpcstring (&$adodbrs) { + $xmlrpc = rs2xmlrpcval ($adodbrs); + if ($xmlrpc) + return $xmlrpc->serialize(); + else + return null; + } + + /** + * Given a well-formed xmlrpc struct object returns an AdoDB object + * + * @todo add some error checking on the input value + */ + function xmlrpcval2rs (&$xmlrpcval) { + + $fields_array = array(); + $data_array = array(); + + // rebuild column information + $header = $xmlrpcval->structmem('header'); + + $numfields = $header->structmem('fieldcount'); + $numfields = $numfields->scalarval(); + $numrecords = $header->structmem('recordcount'); + $numrecords = $numrecords->scalarval(); + $sqlstring = $header->structmem('sql'); + $sqlstring = $sqlstring->scalarval(); + + $fieldinfo = $header->structmem('fieldinfo'); + for ($i = 0; $i < $numfields; $i++) { + $temp = $fieldinfo->arraymem($i); + $fld = new ADOFieldObject(); + while (list($key,$value) = $temp->structeach()) { + if ($key == "name") $fld->name = $value->scalarval(); + if ($key == "type") $fld->type = $value->scalarval(); + if ($key == "max_length") $fld->max_length = $value->scalarval(); + if ($key == "not_null") $fld->not_null = $value->scalarval(); + if ($key == "has_default") $fld->has_default = $value->scalarval(); + if ($key == "default_value") $fld->default_value = $value->scalarval(); + } // while + $fields_array[] = $fld; + } // for + + // fetch recordset information into php array + $body = $xmlrpcval->structmem('body'); + for ($i = 0; $i < $numrecords; $i++) { + $data_array[$i]= array(); + $xmlrpcrs_row = $body->arraymem($i); + for ($j = 0; $j < $numfields; $j++) { + $temp = $xmlrpcrs_row->arraymem($j); + $data_array[$i][$j] = $temp->scalarval(); + } // for j + } // for i + + // finally build in-memory recordset object and return it + $rs = new ADORecordSet_array(); + $rs->InitArrayFields($data_array,$fields_array); + return $rs; + + } + +?> \ No newline at end of file diff --git a/fannie/adodb5/cute_icons_for_site/adodb.gif b/fannie/adodb5/cute_icons_for_site/adodb.gif new file mode 100644 index 000000000..c5e8dfc6d Binary files /dev/null and b/fannie/adodb5/cute_icons_for_site/adodb.gif differ diff --git a/fannie/adodb5/cute_icons_for_site/adodb2.gif b/fannie/adodb5/cute_icons_for_site/adodb2.gif new file mode 100644 index 000000000..f12ae2037 Binary files /dev/null and b/fannie/adodb5/cute_icons_for_site/adodb2.gif differ diff --git a/fannie/adodb5/datadict/datadict-access.inc.php b/fannie/adodb5/datadict/datadict-access.inc.php new file mode 100644 index 000000000..906c8a74e --- /dev/null +++ b/fannie/adodb5/datadict/datadict-access.inc.php @@ -0,0 +1,96 @@ +debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)"); + } + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function CreateDatabase($dbname,$options=false) + { + return array(); + } + + + function SetSchema($schema) + { + } + + function AlterColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-db2.inc.php b/fannie/adodb5/datadict/datadict-db2.inc.php new file mode 100644 index 000000000..5f02f23ec --- /dev/null +++ b/fannie/adodb5/datadict/datadict-db2.inc.php @@ -0,0 +1,144 @@ +debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + + + function ChangeTableSQL($tablename, $flds, $tableoptions = false) + { + + /** + Allow basic table changes to DB2 databases + DB2 will fatally reject changes to non character columns + + */ + + $validTypes = array("CHAR","VARC"); + $invalidTypes = array("BIGI","BLOB","CLOB","DATE", "DECI","DOUB", "INTE", "REAL","SMAL", "TIME"); + // check table exists + $cols = $this->MetaColumns($tablename); + if ( empty($cols)) { + return $this->CreateTableSQL($tablename, $flds, $tableoptions); + } + + // already exists, alter table instead + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $this->TableName($tablename); + $sql = array(); + + foreach ( $lines as $id => $v ) { + if ( isset($cols[$id]) && is_object($cols[$id]) ) { + /** + If the first field of $v is the fieldname, and + the second is the field type/size, we assume its an + attempt to modify the column size, so check that it is allowed + $v can have an indeterminate number of blanks between the + fields, so account for that too + */ + $vargs = explode(' ' , $v); + // assume that $vargs[0] is the field name. + $i=0; + // Find the next non-blank value; + for ($i=1;$ialterCol . ' ' . $v; + } else { + $sql[] = $alter . $this->addCol . ' ' . $v; + } + } + + return $sql; + } + +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-firebird.inc.php b/fannie/adodb5/datadict/datadict-firebird.inc.php new file mode 100644 index 000000000..5794c8b2f --- /dev/null +++ b/fannie/adodb5/datadict/datadict-firebird.inc.php @@ -0,0 +1,152 @@ +connection) ) { + return $name; + } + + $quote = $this->connection->nameQuote; + + // if name is of the form `name`, quote it + if ( preg_match('/^`(.+)`$/', $name, $matches) ) { + return $quote . $matches[1] . $quote; + } + + // if name contains special characters, quote it + if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) { + return $quote . $name . $quote; + } + + return $quote . $name . $quote; + } + + function CreateDatabase($dbname, $options=false) + { + $options = $this->_Options($options); + $sql = array(); + + $sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'"; + + return $sql; + } + + function _DropAutoIncrement($t) + { + if (strpos($t,'.') !== false) { + $tarr = explode('.',$t); + return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"'; + } + return 'DROP GENERATOR "GEN_'.$t; + } + + + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fautoinc) $this->seqField = $fname; + if ($fconstraint) $suffix .= ' '.$fconstraint; + + return $suffix; + } + +/* +CREATE or replace TRIGGER jaddress_insert +before insert on jaddress +for each row +begin +IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN + NEW."seqField" = GEN_ID("GEN_tabname", 1); +end; +*/ + function _Triggers($tabname,$tableoptions) + { + if (!$this->seqField) return array(); + + $tab1 = preg_replace( '/"/', '', $tabname ); + if ($this->schema) { + $t = strpos($tab1,'.'); + if ($t !== false) $tab = substr($tab1,$t+1); + else $tab = $tab1; + $seqField = $this->seqField; + $seqname = $this->schema.'.'.$this->seqPrefix.$tab; + $trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab; + } else { + $seqField = $this->seqField; + $seqname = $this->seqPrefix.$tab1; + $trigname = 'trig_'.$seqname; + } + if (isset($tableoptions['REPLACE'])) + { $sql[] = "DROP GENERATOR \"$seqname\""; + $sql[] = "CREATE GENERATOR \"$seqname\""; + $sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END"; + } + else + { $sql[] = "CREATE GENERATOR \"$seqname\""; + $sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END"; + } + + $this->seqField = false; + return $sql; + } + +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-generic.inc.php b/fannie/adodb5/datadict/datadict-generic.inc.php new file mode 100644 index 000000000..8f24d37e7 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-generic.inc.php @@ -0,0 +1,126 @@ +debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + +} + +/* +//db2 + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'X': return 'VARCHAR'; + + case 'C2': return 'VARCHAR'; // up to 32K + case 'X2': return 'VARCHAR'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'T': return 'TIMESTAMP'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'BIGINT'; + + case 'F': return 'DOUBLE'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + +// ifx +function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR';// 255 + case 'X': return 'TEXT'; + + case 'C2': return 'NVARCHAR'; + case 'X2': return 'TEXT'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'T': return 'DATETIME'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'DECIMAL(20)'; + + case 'F': return 'FLOAT'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } +*/ +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-ibase.inc.php b/fannie/adodb5/datadict/datadict-ibase.inc.php new file mode 100644 index 000000000..6bbd334f3 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-ibase.inc.php @@ -0,0 +1,68 @@ +debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-informix.inc.php b/fannie/adodb5/datadict/datadict-informix.inc.php new file mode 100644 index 000000000..a0d966723 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-informix.inc.php @@ -0,0 +1,81 @@ +debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + + // return string must begin with space + function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + if ($fautoinc) { + $ftype = 'SERIAL'; + return ''; + } + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-mssql.inc.php b/fannie/adodb5/datadict/datadict-mssql.inc.php new file mode 100644 index 000000000..b4c9f8618 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-mssql.inc.php @@ -0,0 +1,284 @@ +type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'R': + case 'INT': + case 'INTEGER': return 'I'; + case 'BIT': + case 'TINYINT': return 'I1'; + case 'SMALLINT': return 'I2'; + case 'BIGINT': return 'I8'; + case 'SMALLDATETIME': return 'T'; + case 'REAL': + case 'FLOAT': return 'F'; + default: return parent::MetaType($t,$len,$fieldobj); + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + + case 'C': return 'VARCHAR'; + case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT'; + case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle + case 'C2': return 'NVARCHAR'; + case 'X2': return 'NTEXT'; + + case 'B': return 'IMAGE'; + + case 'D': return 'DATETIME'; + + case 'TS': + case 'T': return 'DATETIME'; + case 'L': return 'BIT'; + + case 'R': + case 'I': return 'INT'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'REAL'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname $this->addCol"; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + /* + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + + return $sql; + } + */ + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) + $flds = explode(',',$flds); + $f = array(); + $s = 'ALTER TABLE ' . $tabname; + foreach($flds as $v) { + $f[] = "\n$this->dropCol ".$this->NameQuote($v); + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' IDENTITY(1,1)'; + if ($fnotnull) $suffix .= ' NOT NULL'; + else if ($suffix == '') $suffix .= ' NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* +CREATE TABLE + [ database_name.[ owner ] . | owner. ] table_name + ( { < column_definition > + | column_name AS computed_column_expression + | < table_constraint > ::= [ CONSTRAINT constraint_name ] } + + | [ { PRIMARY KEY | UNIQUE } [ ,...n ] + ) + +[ ON { filegroup | DEFAULT } ] +[ TEXTIMAGE_ON { filegroup | DEFAULT } ] + +< column_definition > ::= { column_name data_type } + [ COLLATE < collation_name > ] + [ [ DEFAULT constant_expression ] + | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] + ] + [ ROWGUIDCOL] + [ < column_constraint > ] [ ...n ] + +< column_constraint > ::= [ CONSTRAINT constraint_name ] + { [ NULL | NOT NULL ] + | [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + [ WITH FILLFACTOR = fillfactor ] + [ON {filegroup | DEFAULT} ] ] + ] + | [ [ FOREIGN KEY ] + REFERENCES ref_table [ ( ref_column ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + ] + | CHECK [ NOT FOR REPLICATION ] + ( logical_expression ) + } + +< table_constraint > ::= [ CONSTRAINT constraint_name ] + { [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + { ( column [ ASC | DESC ] [ ,...n ] ) } + [ WITH FILLFACTOR = fillfactor ] + [ ON { filegroup | DEFAULT } ] + ] + | FOREIGN KEY + [ ( column [ ,...n ] ) ] + REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + | CHECK [ NOT FOR REPLICATION ] + ( search_conditions ) + } + + + */ + + /* + CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name + ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) + [ WITH < index_option > [ ,...n] ] + [ ON filegroup ] + < index_option > :: = + { PAD_INDEX | + FILLFACTOR = fillfactor | + IGNORE_DUP_KEY | + DROP_EXISTING | + STATISTICS_NORECOMPUTE | + SORT_IN_TEMPDB + } +*/ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + + $sql[] = $s; + + return $sql; + } + + + function _GetSize($ftype, $ty, $fsize, $fprec) + { + switch ($ftype) { + case 'INT': + case 'SMALLINT': + case 'TINYINT': + case 'BIGINT': + return $ftype; + } + if ($ty == 'T') return $ftype; + return parent::_GetSize($ftype, $ty, $fsize, $fprec); + + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-mssqlnative.inc.php b/fannie/adodb5/datadict/datadict-mssqlnative.inc.php new file mode 100644 index 000000000..08f413319 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-mssqlnative.inc.php @@ -0,0 +1,282 @@ +type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'R': + case 'INT': + case 'INTEGER': return 'I'; + case 'BIT': + case 'TINYINT': return 'I1'; + case 'SMALLINT': return 'I2'; + case 'BIGINT': return 'I8'; + + case 'REAL': + case 'FLOAT': return 'F'; + default: return parent::MetaType($t,$len,$fieldobj); + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + + case 'C': return 'VARCHAR'; + case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT'; + case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle + case 'C2': return 'NVARCHAR'; + case 'X2': return 'NTEXT'; + + case 'B': return 'IMAGE'; + + case 'D': return 'DATETIME'; + case 'T': return 'DATETIME'; + case 'L': return 'BIT'; + + case 'R': + case 'I': return 'INT'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'REAL'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname $this->addCol"; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + /* + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + + return $sql; + } + */ + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) + $flds = explode(',',$flds); + $f = array(); + $s = 'ALTER TABLE ' . $tabname; + foreach($flds as $v) { + $f[] = "\n$this->dropCol ".$this->NameQuote($v); + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' IDENTITY(1,1)'; + if ($fnotnull) $suffix .= ' NOT NULL'; + else if ($suffix == '') $suffix .= ' NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* +CREATE TABLE + [ database_name.[ owner ] . | owner. ] table_name + ( { < column_definition > + | column_name AS computed_column_expression + | < table_constraint > ::= [ CONSTRAINT constraint_name ] } + + | [ { PRIMARY KEY | UNIQUE } [ ,...n ] + ) + +[ ON { filegroup | DEFAULT } ] +[ TEXTIMAGE_ON { filegroup | DEFAULT } ] + +< column_definition > ::= { column_name data_type } + [ COLLATE < collation_name > ] + [ [ DEFAULT constant_expression ] + | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] + ] + [ ROWGUIDCOL] + [ < column_constraint > ] [ ...n ] + +< column_constraint > ::= [ CONSTRAINT constraint_name ] + { [ NULL | NOT NULL ] + | [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + [ WITH FILLFACTOR = fillfactor ] + [ON {filegroup | DEFAULT} ] ] + ] + | [ [ FOREIGN KEY ] + REFERENCES ref_table [ ( ref_column ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + ] + | CHECK [ NOT FOR REPLICATION ] + ( logical_expression ) + } + +< table_constraint > ::= [ CONSTRAINT constraint_name ] + { [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + { ( column [ ASC | DESC ] [ ,...n ] ) } + [ WITH FILLFACTOR = fillfactor ] + [ ON { filegroup | DEFAULT } ] + ] + | FOREIGN KEY + [ ( column [ ,...n ] ) ] + REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + | CHECK [ NOT FOR REPLICATION ] + ( search_conditions ) + } + + + */ + + /* + CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name + ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) + [ WITH < index_option > [ ,...n] ] + [ ON filegroup ] + < index_option > :: = + { PAD_INDEX | + FILLFACTOR = fillfactor | + IGNORE_DUP_KEY | + DROP_EXISTING | + STATISTICS_NORECOMPUTE | + SORT_IN_TEMPDB + } +*/ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + + $sql[] = $s; + + return $sql; + } + + + function _GetSize($ftype, $ty, $fsize, $fprec) + { + switch ($ftype) { + case 'INT': + case 'SMALLINT': + case 'TINYINT': + case 'BIGINT': + return $ftype; + } + if ($ty == 'T') return $ftype; + return parent::_GetSize($ftype, $ty, $fsize, $fprec); + + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-mysql.inc.php b/fannie/adodb5/datadict/datadict-mysql.inc.php new file mode 100644 index 000000000..8b703d66c --- /dev/null +++ b/fannie/adodb5/datadict/datadict-mysql.inc.php @@ -0,0 +1,182 @@ +type; + $len = $fieldobj->max_length; + } + $is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->auto_increment; + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + return !empty($fieldobj->binary) ? 'B' : 'X'; + + case 'YEAR': + case 'DATE': return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': return 'T'; + + case 'FLOAT': + case 'DOUBLE': + return 'F'; + + case 'INT': + case 'INTEGER': return $is_serial ? 'R' : 'I'; + case 'TINYINT': return $is_serial ? 'R' : 'I1'; + case 'SMALLINT': return $is_serial ? 'R' : 'I2'; + case 'MEDIUMINT': return $is_serial ? 'R' : 'I4'; + case 'BIGINT': return $is_serial ? 'R' : 'I8'; + default: return 'N'; + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + case 'C': return 'VARCHAR'; + case 'XL':return 'LONGTEXT'; + case 'X': return 'TEXT'; + + case 'C2': return 'VARCHAR'; + case 'X2': return 'LONGTEXT'; + + case 'B': return 'LONGBLOB'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'DATETIME'; + case 'L': return 'TINYINT'; + + case 'R': + case 'I4': + case 'I': return 'INTEGER'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'DOUBLE'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if ($funsigned) $suffix .= ' UNSIGNED'; + if ($fnotnull) $suffix .= ' NOT NULL'; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' AUTO_INCREMENT'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* + CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] + [table_options] [select_statement] + create_definition: + col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] + [PRIMARY KEY] [reference_definition] + or PRIMARY KEY (index_col_name,...) + or KEY [index_name] (index_col_name,...) + or INDEX [index_name] (index_col_name,...) + or UNIQUE [INDEX] [index_name] (index_col_name,...) + or FULLTEXT [INDEX] [index_name] (index_col_name,...) + or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) + [reference_definition] + or CHECK (expr) + */ + + /* + CREATE [UNIQUE|FULLTEXT] INDEX index_name + ON tbl_name (col_name[(length)],... ) + */ + + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname"; + else $sql[] = sprintf($this->dropIndex, $idxname, $tabname); + + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + if (isset($idxoptions['FULLTEXT'])) { + $unique = ' FULLTEXT'; + } elseif (isset($idxoptions['UNIQUE'])) { + $unique = ' UNIQUE'; + } else { + $unique = ''; + } + + if ( is_array($flds) ) $flds = implode(', ',$flds); + + if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname "; + else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname; + + $s .= ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + $sql[] = $s; + + return $sql; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-oci8.inc.php b/fannie/adodb5/datadict/datadict-oci8.inc.php new file mode 100644 index 000000000..0b7ce05a8 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-oci8.inc.php @@ -0,0 +1,297 @@ +type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'VARCHAR': + case 'VARCHAR2': + case 'CHAR': + case 'VARBINARY': + case 'BINARY': + if (isset($this) && $len <= $this->blobSize) return 'C'; + return 'X'; + + case 'NCHAR': + case 'NVARCHAR2': + case 'NVARCHAR': + if (isset($this) && $len <= $this->blobSize) return 'C2'; + return 'X2'; + + case 'NCLOB': + case 'CLOB': + return 'XL'; + + case 'LONG RAW': + case 'LONG VARBINARY': + case 'BLOB': + return 'B'; + + case 'TIMESTAMP': + return 'TS'; + + case 'DATE': + return 'T'; + + case 'INT': + case 'SMALLINT': + case 'INTEGER': + return 'I'; + + default: + return 'N'; + } + } + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'X': return $this->typeX; + case 'XL': return $this->typeXL; + + case 'C2': return 'NVARCHAR2'; + case 'X2': return 'NVARCHAR2(4000)'; + + case 'B': return 'BLOB'; + + case 'TS': + return 'TIMESTAMP'; + + case 'D': + case 'T': return 'DATE'; + case 'L': return 'NUMBER(1)'; + case 'I1': return 'NUMBER(3)'; + case 'I2': return 'NUMBER(5)'; + case 'I': + case 'I4': return 'NUMBER(10)'; + + case 'I8': return 'NUMBER(20)'; + case 'F': return 'NUMBER'; + case 'N': return 'NUMBER'; + case 'R': return 'NUMBER(20)'; + default: + return $meta; + } + } + + function CreateDatabase($dbname, $options=false) + { + $options = $this->_Options($options); + $password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger'; + $tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : ''; + $sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace; + $sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname"; + + return $sql; + } + + function AddColumnSQL($tabname, $flds) + { + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname ADD ("; + foreach($lines as $v) { + $f[] = "\n $v"; + } + + $s .= implode(', ',$f).')'; + $sql[] = $s; + return $sql; + } + + function AlterColumnSQL($tabname, $flds) + { + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname MODIFY("; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f).')'; + $sql[] = $s; + return $sql; + } + + function DropColumnSQL($tabname, $flds) + { + if (!is_array($flds)) $flds = explode(',',$flds); + foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v); + + $sql = array(); + $s = "ALTER TABLE $tabname DROP("; + $s .= implode(', ',$flds).') CASCADE CONSTRAINTS'; + $sql[] = $s; + return $sql; + } + + function _DropAutoIncrement($t) + { + if (strpos($t,'.') !== false) { + $tarr = explode('.',$t); + return "drop sequence ".$tarr[0].".seq_".$tarr[1]; + } + return "drop sequence seq_".$t; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + + if ($fdefault == "''" && $fnotnull) {// this is null in oracle + $fnotnull = false; + if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle"); + } + + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + + if ($fautoinc) $this->seqField = $fname; + if ($fconstraint) $suffix .= ' '.$fconstraint; + + return $suffix; + } + +/* +CREATE or replace TRIGGER jaddress_insert +before insert on jaddress +for each row +begin +select seqaddress.nextval into :new.A_ID from dual; +end; +*/ + function _Triggers($tabname,$tableoptions) + { + if (!$this->seqField) return array(); + + if ($this->schema) { + $t = strpos($tabname,'.'); + if ($t !== false) $tab = substr($tabname,$t+1); + else $tab = $tabname; + $seqname = $this->schema.'.'.$this->seqPrefix.$tab; + $trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab; + } else { + $seqname = $this->seqPrefix.$tabname; + $trigname = $this->trigPrefix.$seqname; + } + + if (strlen($seqname) > 30) { + $seqname = $this->seqPrefix.uniqid(''); + } // end if + if (strlen($trigname) > 30) { + $trigname = $this->trigPrefix.uniqid(''); + } // end if + + if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname"; + $seqCache = ''; + if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];} + $seqIncr = ''; + if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];} + $seqStart = ''; + if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];} + $sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache"; + $sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;"; + + $this->seqField = false; + return $sql; + } + + /* + CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] + [table_options] [select_statement] + create_definition: + col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] + [PRIMARY KEY] [reference_definition] + or PRIMARY KEY (index_col_name,...) + or KEY [index_name] (index_col_name,...) + or INDEX [index_name] (index_col_name,...) + or UNIQUE [INDEX] [index_name] (index_col_name,...) + or FULLTEXT [INDEX] [index_name] (index_col_name,...) + or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) + [reference_definition] + or CHECK (expr) + */ + + + + function _IndexSQL($idxname, $tabname, $flds,$idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + if (isset($idxoptions['BITMAP'])) { + $unique = ' BITMAP'; + } elseif (isset($idxoptions['UNIQUE'])) { + $unique = ' UNIQUE'; + } else { + $unique = ''; + } + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if (isset($idxoptions['oci8'])) + $s .= $idxoptions['oci8']; + + + $sql[] = $s; + + return $sql; + } + + function GetCommentSQL($table,$col) + { + $table = $this->connection->qstr($table); + $col = $this->connection->qstr($col); + return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col"; + } + + function SetCommentSQL($table,$col,$cmt) + { + $cmt = $this->connection->qstr($cmt); + return "COMMENT ON COLUMN $table.$col IS $cmt"; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-postgres.inc.php b/fannie/adodb5/datadict/datadict-postgres.inc.php new file mode 100644 index 000000000..f31bdd758 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-postgres.inc.php @@ -0,0 +1,448 @@ +type; + $len = $fieldobj->max_length; + } + $is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique && + $fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval('; + + switch (strtoupper($t)) { + case 'INTERVAL': + case 'CHAR': + case 'CHARACTER': + case 'VARCHAR': + case 'NAME': + case 'BPCHAR': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + return 'X'; + + case 'IMAGE': // user defined type + case 'BLOB': // user defined type + case 'BIT': // This is a bit string, not a single bit, so don't return 'L' + case 'VARBIT': + case 'BYTEA': + return 'B'; + + case 'BOOL': + case 'BOOLEAN': + return 'L'; + + case 'DATE': + return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + case 'TIMESTAMPTZ': + return 'T'; + + case 'INTEGER': return !$is_serial ? 'I' : 'R'; + case 'SMALLINT': + case 'INT2': return !$is_serial ? 'I2' : 'R'; + case 'INT4': return !$is_serial ? 'I4' : 'R'; + case 'BIGINT': + case 'INT8': return !$is_serial ? 'I8' : 'R'; + + case 'OID': + case 'SERIAL': + return 'R'; + + case 'FLOAT4': + case 'FLOAT8': + case 'DOUBLE PRECISION': + case 'REAL': + return 'F'; + + default: + return 'N'; + } + } + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'TEXT'; + + case 'C2': return 'VARCHAR'; + case 'X2': return 'TEXT'; + + case 'B': return 'BYTEA'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'TIMESTAMP'; + + case 'L': return 'BOOLEAN'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'INT2'; + case 'I4': return 'INT4'; + case 'I8': return 'INT8'; + + case 'F': return 'FLOAT8'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + /** + * Adding a new Column + * + * reimplementation of the default function as postgres does NOT allow to set the default in the same statement + * + * @param string $tabname table-name + * @param string $flds column-names and types for the changed columns + * @return array with SQL strings + */ + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; + foreach($lines as $v) { + if (($not_null = preg_match('/NOT NULL/i',$v))) { + $v = preg_replace('/NOT NULL/i','',$v); + } + if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) { + list(,$colname,$default) = $matches; + $sql[] = $alter . str_replace('DEFAULT '.$default,'',$v); + $sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default; + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default; + } else { + $sql[] = $alter . $v; + } + if ($not_null) { + list($colname) = explode(' ',$v); + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL'; + } + } + return $sql; + } + + + function DropIndexSQL ($idxname, $tabname = NULL) + { + return array(sprintf($this->dropIndex, $this->TableName($idxname), $this->TableName($tabname))); + } + + /** + * Change the definition of one column + * + * Postgres can't do that on it's own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds complete defintion of the new table, eg. for postgres, default '' + * @param array/ $tableoptions options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + /* + function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + if (!$tableflds) { + if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL"); + return array(); + } + return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions); + }*/ + + function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + // Check if alter single column datatype available - works with 8.0+ + $has_alter_column = 8.0 <= (float) @$this->serverInfo['version']; + + if ($has_alter_column) { + $tabname = $this->TableName($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; + foreach($lines as $v) { + if ($not_null = preg_match('/NOT NULL/i',$v)) { + $v = preg_replace('/NOT NULL/i','',$v); + } + // this next block doesn't work - there is no way that I can see to + // explicitly ask a column to be null using $flds + else if ($set_null = preg_match('/NULL/i',$v)) { + // if they didn't specify not null, see if they explicitely asked for null + $v = preg_replace('/\sNULL/i','',$v); + } + + if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) { + list(,$colname,$default) = $matches; + $v = preg_replace('/^' . preg_quote($colname) . '\s/', '', $v); + $sql[] = $alter . $colname . ' TYPE ' . str_replace('DEFAULT '.$default,'',$v); + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default; + } + else { + // drop default? + preg_match ('/^\s*(\S+)\s+(.*)$/',$v,$matches); + list (,$colname,$rest) = $matches; + $sql[] = $alter . $colname . ' TYPE ' . $rest; + } + + list($colname) = explode(' ',$v); + if ($not_null) { + // this does not error out if the column is already not null + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL'; + } + if ($set_null) { + // this does not error out if the column is already null + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' DROP NOT NULL'; + } + } + return $sql; + } + + // does not have alter column + if (!$tableflds) { + if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL"); + return array(); + } + return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions); + } + + /** + * Drop one column + * + * Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds complete defintion of the new table, eg. for postgres, default '' + * @param array/ $tableoptions options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + $has_drop_column = 7.3 <= (float) @$this->serverInfo['version']; + if (!$has_drop_column && !$tableflds) { + if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3"); + return array(); + } + if ($has_drop_column) { + return ADODB_DataDict::DropColumnSQL($tabname, $flds); + } + return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions); + } + + /** + * Save the content into a temp. table, drop and recreate the original table and copy the content back in + * + * We also take care to set the values of the sequenz and recreate the indexes. + * All this is done in a transaction, to not loose the content of the table, if something went wrong! + * @internal + * @param string $tabname table-name + * @param string $dropflds column-names to drop + * @param string $tableflds complete defintion of the new table, eg. for postgres + * @param array/string $tableoptions options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='') + { + if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds); + $copyflds = array(); + foreach($this->MetaColumns($tabname) as $fld) { + if (!$dropflds || !in_array($fld->name,$dropflds)) { + // we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one + if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) && + in_array($fld->type,array('varchar','char','text','bytea'))) { + $copyflds[] = "to_number($fld->name,'S9999999999999D99')"; + } else { + $copyflds[] = $fld->name; + } + // identify the sequence name and the fld its on + if ($fld->primary_key && $fld->has_default && + preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) { + $seq_name = $matches[1]; + $seq_fld = $fld->name; + } + } + } + $copyflds = implode(', ',$copyflds); + + $tempname = $tabname.'_tmp'; + $aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table + $aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname"; + $aSql = array_merge($aSql,$this->DropTableSQL($tabname)); + $aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions)); + $aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname"; + if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again + $seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence + $aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname"; + } + $aSql[] = "DROP TABLE $tempname"; + // recreate the indexes, if they not contain one of the droped columns + foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data) + { + if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) { + $aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'], + $idx_data['unique'] ? array('UNIQUE') : False)); + } + } + $aSql[] = 'COMMIT'; + return $aSql; + } + + function DropTableSQL($tabname) + { + $sql = ADODB_DataDict::DropTableSQL($tabname); + + $drop_seq = $this->_DropAutoIncrement($tabname); + if ($drop_seq) $sql[] = $drop_seq; + + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + if ($fautoinc) { + $ftype = 'SERIAL'; + return ''; + } + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + // search for a sequece for the given table (asumes the seqence-name contains the table-name!) + // if yes return sql to drop it + // this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!! + function _DropAutoIncrement($tabname) + { + $tabname = $this->connection->quote('%'.$tabname.'%'); + + $seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'"); + + // check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly + if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) { + return False; + } + return "DROP SEQUENCE ".$seq; + } + + function RenameTableSQL($tabname,$newname) + { + if (!empty($this->schema)) { + $rename_from = $this->TableName($tabname); + $schema_save = $this->schema; + $this->schema = false; + $rename_to = $this->TableName($newname); + $this->schema = $schema_save; + return array (sprintf($this->renameTable, $rename_from, $rename_to)); + } + + return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); + } + + /* + CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( + { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ] + | table_constraint } [, ... ] + ) + [ INHERITS ( parent_table [, ... ] ) ] + [ WITH OIDS | WITHOUT OIDS ] + where column_constraint is: + [ CONSTRAINT constraint_name ] + { NOT NULL | NULL | UNIQUE | PRIMARY KEY | + CHECK (expression) | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ] + [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + and table_constraint is: + [ CONSTRAINT constraint_name ] + { UNIQUE ( column_name [, ... ] ) | + PRIMARY KEY ( column_name [, ... ] ) | + CHECK ( expression ) | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + */ + + + /* + CREATE [ UNIQUE ] INDEX index_name ON table +[ USING acc_method ] ( column [ ops_name ] [, ...] ) +[ WHERE predicate ] +CREATE [ UNIQUE ] INDEX index_name ON table +[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] ) +[ WHERE predicate ] + */ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; + + if (isset($idxoptions['HASH'])) + $s .= 'USING HASH '; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s .= '(' . $flds . ')'; + $sql[] = $s; + + return $sql; + } + + function _GetSize($ftype, $ty, $fsize, $fprec) + { + if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) { + $ftype .= "(".$fsize; + if (strlen($fprec)) $ftype .= ",".$fprec; + $ftype .= ')'; + } + return $ftype; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-sapdb.inc.php b/fannie/adodb5/datadict/datadict-sapdb.inc.php new file mode 100644 index 000000000..d4143d103 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-sapdb.inc.php @@ -0,0 +1,122 @@ +type; + $len = $fieldobj->max_length; + } + static $maxdb_type2adodb = array( + 'VARCHAR' => 'C', + 'CHARACTER' => 'C', + 'LONG' => 'X', // no way to differ between 'X' and 'B' :-( + 'DATE' => 'D', + 'TIMESTAMP' => 'T', + 'BOOLEAN' => 'L', + 'INTEGER' => 'I4', + 'SMALLINT' => 'I2', + 'FLOAT' => 'F', + 'FIXED' => 'N', + ); + $type = isset($maxdb_type2adodb[$t]) ? $maxdb_type2adodb[$t] : 'C'; + + // convert integer-types simulated with fixed back to integer + if ($t == 'FIXED' && !$fieldobj->scale && ($len == 20 || $len == 3)) { + $type = $len == 20 ? 'I8' : 'I1'; + } + if ($fieldobj->auto_increment) $type = 'R'; + + return $type; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if ($funsigned) $suffix .= ' UNSIGNED'; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fautoinc) $suffix .= ' DEFAULT SERIAL'; + elseif (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + return array( 'ALTER TABLE ' . $tabname . ' ADD (' . implode(', ',$lines) . ')' ); + } + + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + return array( 'ALTER TABLE ' . $tabname . ' MODIFY (' . implode(', ',$lines) . ')' ); + } + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + foreach($flds as $k => $v) { + $flds[$k] = $this->NameQuote($v); + } + return array( 'ALTER TABLE ' . $tabname . ' DROP (' . implode(', ',$flds) . ')' ); + } +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/datadict/datadict-sybase.inc.php b/fannie/adodb5/datadict/datadict-sybase.inc.php new file mode 100644 index 000000000..075bd7148 --- /dev/null +++ b/fannie/adodb5/datadict/datadict-sybase.inc.php @@ -0,0 +1,229 @@ +type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + + case 'INT': + case 'INTEGER': return 'I'; + case 'BIT': + case 'TINYINT': return 'I1'; + case 'SMALLINT': return 'I2'; + case 'BIGINT': return 'I8'; + + case 'REAL': + case 'FLOAT': return 'F'; + default: return parent::MetaType($t,$len,$fieldobj); + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'TEXT'; + + case 'C2': return 'NVARCHAR'; + case 'X2': return 'NTEXT'; + + case 'B': return 'IMAGE'; + + case 'D': return 'DATETIME'; + case 'TS': + case 'T': return 'DATETIME'; + case 'L': return 'BIT'; + + case 'I': return 'INT'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'REAL'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname $this->addCol"; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + + return $sql; + } + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + $f = array(); + $s = "ALTER TABLE $tabname"; + foreach($flds as $v) { + $f[] = "\n$this->dropCol ".$this->NameQuote($v); + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT'; + if ($fnotnull) $suffix .= ' NOT NULL'; + else if ($suffix == '') $suffix .= ' NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* +CREATE TABLE + [ database_name.[ owner ] . | owner. ] table_name + ( { < column_definition > + | column_name AS computed_column_expression + | < table_constraint > ::= [ CONSTRAINT constraint_name ] } + + | [ { PRIMARY KEY | UNIQUE } [ ,...n ] + ) + +[ ON { filegroup | DEFAULT } ] +[ TEXTIMAGE_ON { filegroup | DEFAULT } ] + +< column_definition > ::= { column_name data_type } + [ COLLATE < collation_name > ] + [ [ DEFAULT constant_expression ] + | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] + ] + [ ROWGUIDCOL] + [ < column_constraint > ] [ ...n ] + +< column_constraint > ::= [ CONSTRAINT constraint_name ] + { [ NULL | NOT NULL ] + | [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + [ WITH FILLFACTOR = fillfactor ] + [ON {filegroup | DEFAULT} ] ] + ] + | [ [ FOREIGN KEY ] + REFERENCES ref_table [ ( ref_column ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + ] + | CHECK [ NOT FOR REPLICATION ] + ( logical_expression ) + } + +< table_constraint > ::= [ CONSTRAINT constraint_name ] + { [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + { ( column [ ASC | DESC ] [ ,...n ] ) } + [ WITH FILLFACTOR = fillfactor ] + [ ON { filegroup | DEFAULT } ] + ] + | FOREIGN KEY + [ ( column [ ,...n ] ) ] + REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + | CHECK [ NOT FOR REPLICATION ] + ( search_conditions ) + } + + + */ + + /* + CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name + ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) + [ WITH < index_option > [ ,...n] ] + [ ON filegroup ] + < index_option > :: = + { PAD_INDEX | + FILLFACTOR = fillfactor | + IGNORE_DUP_KEY | + DROP_EXISTING | + STATISTICS_NORECOMPUTE | + SORT_IN_TEMPDB + } +*/ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + $sql[] = $s; + + return $sql; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/docs/docs-active-record.htm b/fannie/adodb5/docs/docs-active-record.htm new file mode 100644 index 000000000..236dbb875 --- /dev/null +++ b/fannie/adodb5/docs/docs-active-record.htm @@ -0,0 +1,1079 @@ + + +ADOdb Active Record + +

        ADOdb Active Record

        +

        (c) 2000-2009 John Lim (jlim#natsoft.com)

        +

        This software is dual licensed using BSD-Style and LGPL. This + means you can use it in compiled proprietary and commercial products.

        +


        +
          + +

        1. Introduction
        2. +

          +ADOdb_Active_Record is an Object Relation Mapping (ORM) implementation using PHP. In an ORM system, the tables and rows of the database are abstracted into native PHP objects. This allows the programmer to focus more on manipulating the data and less on writing SQL queries. +

          +This implementation differs from Zend Framework's implementation in the following ways: +

            +
          • Works with PHP4 and PHP5 and provides equivalent functionality in both versions of PHP.

            +

          • ADOdb_Active_Record works when you are connected to multiple databases. Zend's only works when connected to a default database.

            +

          • Support for $ADODB_ASSOC_CASE. The field names are upper-cased, lower-cased or left in natural case depending on this setting.

            +

          • No field name conversion to camel-caps style, unlike Zend's implementation which will convert field names such as 'first_name' to 'firstName'.

            +

          • NewADOConnection::GetActiveRecords() and ADOConnection::GetActiveRecordsClass() functions in adodb.inc.php.

            +

          • Caching of table metadata so it is only queried once per table, no matter how many Active Records are created.

            +

          • PHP5 version of ADOdb_Active_Record now supports one-to-many relationships.

            +

          • New adodb-active-recordx.inc.php, which is an Active Record eXtended implementation that support JOINs for higher performance when loading children, and other nice features.

            +

          • Lots of additional functionality.

            +

          +

          +ADOdb_Active_Record is designed upon the principles of the "ActiveRecord" design pattern, which was first described by Martin Fowler. The ActiveRecord pattern has been implemented in many forms across the spectrum of programming languages. ADOdb_Active_Record attempts to represent the database as closely to native PHP objects as possible. +

          +ADOdb_Active_Record maps a database table to a PHP class, and each instance of that class represents a table row. Relations between tables can also be defined, allowing the ADOdb_Active_Record objects to be nested. +

          + +

        3. Setting the Database Connection
        4. +

          +The first step to using ADOdb_Active_Record is to set the default connection that an ADOdb_Active_Record objects will use to connect to a database. + +

          +require_once('adodb/adodb-active-record.inc.php');
          +
          +$db = NewADOConnection('mysql://root:pwd@localhost/dbname');
          +ADOdb_Active_Record::SetDatabaseAdapter($db);
          +
          + +

        5. Table Rows as Objects
        6. +

          +First, let's create a temporary table in our MySQL database that we can use for demonstrative purposes throughout the rest of this tutorial. We can do this by sending a CREATE query: + +

          +$db->Execute("CREATE TEMPORARY TABLE `persons` (
          +                `id` int(10) unsigned NOT NULL auto_increment,
          +                `name_first` varchar(100) NOT NULL default '',
          +                `name_last` varchar(100) NOT NULL default '',
          +                `favorite_color` varchar(100) NOT NULL default '',
          +                PRIMARY KEY  (`id`)
          +            ) ENGINE=MyISAM;
          +           ");
          + 
          +

          +ADOdb_Active_Records are object representations of table rows. Each table in the database is represented by a class in PHP. To begin working with a table as a ADOdb_Active_Record, a class that extends ADOdb_Active_Record needs to be created for it. + +

          +class person extends ADOdb_Active_Record{}
          +$person = new person();
          +
          + +

          +In the above example, a new ADOdb_Active_Record object $person was created to access the "persons" table. Zend_Db_DataObject takes the name of the class, pluralizes it (according to American English rules), and assumes that this is the name of the table in the database. Also note that with MySQL, table names are case-sensitive, so your class name must match the table name's case. With other databases with case-insensitive tables, your class can be capitalized differently. +

          +This kind of behavior is typical of ADOdb_Active_Record. It will assume as much as possible by convention rather than explicit configuration. In situations where it isn't possible to use the conventions that ADOdb_Active_Record expects, options can be overridden as we'll see later. + +

        7. Table Columns as Object Properties
        8. +

          +When the $person object was instantiated, ADOdb_Active_Record read the table metadata from the database itself, and then exposed the table's columns (fields) as object properties. +

          +Our "persons" table has three fields: "name_first", "name_last", and "favorite_color". Each of these fields is now a property of the $person object. To see all these properties, use the ADOdb_Active_Record::getAttributeNames() method: +

          +var_dump($person->getAttributeNames());
          +
          +/**
          + * Outputs the following:
          + * array(4) {
          + *    [0]=>
          + *    string(2) "id"
          + *    [1]=>
          + *    string(9) "name_first"
          + *    [2]=>
          + *    string(8) "name_last"
          + *    [3]=>
          + *    string(13) "favorite_color"
          + *  }
          + */
          +    
          +

          +One big difference between ADOdb and Zend's implementation is we do not automatically convert to camelCaps style. +

          +

        9. Inserting and Updating a Record
        10. + +An ADOdb_Active_Record object is a representation of a single table row. However, when our $person object is instantiated, it does not reference any particular row. It is a blank record that does not yet exist in the database. An ADOdb_Active_Record object is considered blank when its primary key is NULL. The primary key in our persons table is "id". +

          +To insert a new record into the database, change the object's properties and then call the ADOdb_Active_Record::save() method: +

          +$person = new person();
          +$person->name_first = 'Andi';
          +$person->name_last  = 'Gutmans';
          +$person->save();
          + 
          +

          +Oh, no! The above code snippet does not insert a new record into the database. Instead, outputs an error: +

          +1048: Column 'favorite_color' cannot be null
          + 
          +

          +This error occurred because MySQL rejected the INSERT query that was generated by ADOdb_Active_Record. If exceptions are enabled in ADOdb and you are using PHP5, an error will be thrown. In the definition of our table, we specified all of the fields as NOT NULL; i.e., they must contain a value. +

          +ADOdb_Active_Records are bound by the same contraints as the database tables they represent. If the field in the database cannot be NULL, the corresponding property in the ADOdb_Active_Record also cannot be NULL. In the example above, we failed to set the property $person->favoriteColor, which caused the INSERT to be rejected by MySQL. +

          +To insert a new ADOdb_Active_Record in the database, populate all of ADOdb_Active_Record's properties so that they satisfy the constraints of the database table, and then call the save() method: +

          +/**
          + * Calling the save() method will successfully INSERT
          + * this $person into the database table.
          + */
          +$person = new person();
          +$person->name_first     = 'Andi';
          +$person->name_last      = 'Gutmans';
          +$person->favorite_color = 'blue';
          +$person->save();
          +
          +

          +Once this $person has been INSERTed into the database by calling save(), the primary key can now be read as a property. Since this is the first row inserted into our temporary table, its "id" will be 1: +

          +var_dump($person->id);
          +
          +/**
          + * Outputs the following:
          + * string(1)
          + */
          + 
          +

          +From this point on, updating it is simply a matter of changing the object's properties and calling the save() method again: + +

          +$person->favorite_color = 'red';
          +$person->save();
          +   
          +

          +The code snippet above will change the favorite color to red, and then UPDATE the record in the database. + + +

          ADOdb Specific Functionality

          +

        11. Setting the Table Name
        12. +

          The default behaviour on creating an ADOdb_Active_Record is to "pluralize" the class name and + use that as the table name. Often, this is not the case. For example, the person class could be reading + from the "People" table. +

          We provide two ways to define your own table: +

          1. Use a constructor parameter to override the default table naming behaviour. +

          +	class person extends ADOdb_Active_Record{}
          +	$person = new person('People');
          +
          +

          2. Define it in a class declaration: +

          +	class person extends ADOdb_Active_Record
          +	{
          +	var $_table = 'People';
          +	}
          +	$person = new person();
          +
          + +

        13. $ADODB_ASSOC_CASE
        14. +

          This allows you to control the case of field names and properties. For example, all field names in Oracle are upper-case by default. So you +can force field names to be lowercase using $ADODB_ASSOC_CASE. Legal values are as follows: +

          + 0: lower-case
          + 1: upper-case
          + 2: native-case
          +
          +

          So to force all Oracle field names to lower-case, use +

          +$ADODB_ASSOC_CASE = 0;
          +$person = new person('People');
          +$person->name = 'Lily';
          +$ADODB_ASSOC_CASE = 2;
          +$person2 = new person('People');
          +$person2->NAME = 'Lily'; 
          +
          + +

          Also see $ADODB_ASSOC_CASE. + +

        15. ADOdb_Active_Record::Save()
        16. +

          +Saves a record by executing an INSERT or UPDATE SQL statement as appropriate. +

          Returns false on unsuccessful INSERT, true if successsful INSERT. +

          Returns 0 on failed UPDATE, and 1 on UPDATE if data has changed, and -1 if no data was changed, so no UPDATE statement was executed. + +

        17. ADOdb_Active_Record::Replace()
        18. +

          +ADOdb supports replace functionality, whereby the record is inserted if it does not exists, or updated otherwise. +

          +$rec = new ADOdb_Active_Record("product");
          +$rec->name = 'John';
          +$rec->tel_no = '34111145';
          +$ok = $rec->replace(); // 0=failure, 1=update, 2=insert
          +
          + + +

        19. ADOdb_Active_Record::Load($where)
        20. +

          Sometimes, we want to load a single record into an Active Record. We can do so using: +

          +$person->load("id=3");
          +
          +// or using bind parameters
          +
          +$person->load("id=?", array(3));
          +
          +

          Returns false if an error occurs. + +

        21. ADOdb_Active_Record::Find($whereOrderBy, $bindarr=false, $pkeyArr=false)
        22. +

          We want to retrieve an array of active records based on some search criteria. For example: +

          +class person extends ADOdb_Active_Record {
          +var $_table = 'people';
          +}
          +
          +$person = new person();
          +$peopleArray = $person->Find("name like ? order by age", array('Sm%'));
          +
          + +

        23. Quoting Identifiers
        24. +

          You can force column names to be quoted in INSERT and UPDATE statements, typically because you are using reserved words as column names by setting +

          +ADODB_Active_Record::$_quoteNames = true;
          +
          +

          Default is false. + +

        25. Error Handling and Debugging
        26. +

          +In PHP5, if adodb-exceptions.inc.php is included, then errors are thrown. Otherwise errors are handled by returning a value. False by default means an error has occurred. You can get the last error message using the ErrorMsg() function. +

          +To check for errors in ADOdb_Active_Record, do not poll ErrorMsg() as the last error message will always be returned, even if it occurred several operations ago. Do this instead: +

          +# right!
          +$ok = $rec->Save();
          +if (!$ok) $err = $rec->ErrorMsg();
          +
          +# wrong :(
          +$rec->Save();
          +if ($rec->ErrorMsg()) echo "Wrong way to detect error";
          +
          +

          The ADOConnection::Debug property is obeyed. So +if $db->debug is enabled, then ADOdb_Active_Record errors are also outputted to standard output and written to the browser. + +

        27. ADOdb_Active_Record::Set()
        28. +

          You can convert an array to an ADOdb_Active_Record using Set(). The array must be numerically indexed, and have all fields of the table defined in the array. The elements of the array must be in the table's natural order too. +

          +$row = $db->GetRow("select * from tablex where id=$id");
          +
          +# PHP4 or PHP5 without enabling exceptions
          +$obj = new ADOdb_Active_Record('Products');
          +if ($obj->ErrorMsg()){
          +	echo $obj->ErrorMsg();
          +} else {
          +	$obj->Set($row);
          +}
          +
          +# in PHP5, with exceptions enabled:
          +
          +include('adodb-exceptions.inc.php');
          +try {
          +	$obj = new ADOdb_Active_Record('Products');
          +	$obj->Set($row);
          +} catch(exceptions $e) {
          +	echo $e->getMessage();
          +}
          +
          +

          +

        29. Primary Keys
        30. +

          +ADOdb_Active_Record does not require the table to have a primary key. You can insert records for such a table, but you will not be able to update nor delete. +

          Sometimes you are retrieving data from a view or table that has no primary key, but has a unique index. You can dynamically set the primary key of a table through the constructor, or using ADOdb_Active_Record::SetPrimaryKeys(): +

          +	$pkeys = array('category','prodcode');
          +	
          +	// set primary key using constructor
          +	$rec = new ADOdb_Active_Record('Products', $pkeys);
          +	
          +	 // or use method
          +	$rec->SetPrimaryKeys($pkeys);
          +
          + + +

        31. Retrieval of Auto-incrementing ID
        32. +When creating a new record, the retrieval of the last auto-incrementing ID is not reliable for databases that do not support the Insert_ID() function call (check $connection->hasInsertID). In this case we perform a SELECT MAX($primarykey) FROM $table, which will not work reliably in a multi-user environment. You can override the ADOdb_Active_Record::LastInsertID() function in this case. + +

        33. Dealing with Multiple Databases
        34. +

          +Sometimes we want to load data from one database and insert it into another using ActiveRecords. This can be done using the optional parameter of the ADOdb_Active_Record constructor. In the following example, we read data from db.table1 and store it in db2.table2: +

          +$db = NewADOConnection(...);
          +$db2 = NewADOConnection(...);
          +
          +ADOdb_Active_Record::SetDatabaseAdapter($db2);
          +
          +$activeRecs = $db->GetActiveRecords('table1');
          +
          +foreach($activeRecs as $rec) {
          +	$rec2 = new ADOdb_Active_Record('table2',$db2);
          +	$rec2->id = $rec->id;
          +	$rec2->name = $rec->name;
          +	
          +	$rec2->Save();
          +}
          +
          +

          +If you have to pass in a primary key called "id" and the 2nd db connection in the constructor, you can do so too: +

          +$rec = new ADOdb_Active_Record("table1",array("id"),$db2);
          +
          +

          You can now give a named label in SetDatabaseAdapter, allowing to determine in your class definition which database to load, using var $_dbat. +

          +$db1 = NewADOConnection(...); // some ADOdb DB
          +ADOdb_Active_Record::SetDatabaseAdapter($db1, 'mysql');
          +$db2 = NewADOConnection(...); // some ADOdb DB
          +ADOdb_Active_Record::SetDatabaseAdapter($db2, 'oracle');
          +
          +class FooRecord extends ADOdb_Active_Record
          +{
          +var $_dbat = 'mysql';  // uses 'mysql' connection
          +...
          +}
          +
          +

        35. $ADODB_ACTIVE_CACHESECS
        36. +

          You can cache the table metadata (field names, types, and other info such primary keys) in $ADODB_CACHE_DIR (which defaults to /tmp) by setting +the global variable $ADODB_ACTIVE_CACHESECS to a value greater than 0. This will be the number of seconds to cache. + You should set this to a value of 30 seconds or greater for optimal performance. + +

        37. Active Record Considered Bad?
        38. +

          Although the Active Record concept is useful, you have to be aware of some pitfalls when using Active Record. The level of granularity of Active Record is individual records. It encourages code like the following, used to increase the price of all furniture products by 10%: +

          + $recs = $db->GetActiveRecords("Products","category='Furniture'");
          + foreach($recs as $rec) {
          +    $rec->price *= 1.1; // increase price by 10% for all Furniture products
          +    $rec->save();
          + }
          +
          +Of course an UPDATE statement is superior because it's simpler and much more efficient (probably by a factor of x10 or more): +
          +   $db->Execute("update Products set price = price * 1.1 where category='Furniture'");
          +
          +

          For performance sensitive code, using direct SQL will always be faster than using Active Records due to overhead and the fact that all fields in a row are retrieved (rather than only the subset you need) whenever an Active Record is loaded. + +

        39. Transactions
        40. +

          +The default transaction mode in ADOdb is autocommit. So that is the default with active record too. +The general rules for managing transactions still apply. Active Record to the database is a set of insert/update/delete statements, and the db has no knowledge of active records. +

          +Smart transactions, that does an auto-rollback if an error occurs, is still the best method to multiple activities (inserts/updates/deletes) that need to be treated as a single transaction: +

          +$conn->StartTrans();
          +$parent->save();
          +$child->save();
          +$conn->CompleteTrans();
          +
          + + +

          One to Many Relations

          +

          Since ADOdb 5.06, we support parent child relationships. This is done using the ClassBelongsTo() and ClassHasMany() functions. + +

        41. ClassHasMany
        42. +

          To globally define a one-to-many relationship we use the static function ADODB_Active_Record::ClassHasMany($class, $relation, $foreignKey = '', $foreignClass = 'ADODB_Active_Record'). For example, we have 2 tables, persons (parent table) and children (child table) +linked by persons.id = children.person_id. The variable $person->children is an array that holds the children. To define this relationship: +

          +	class person extends ADOdb_Active_Record{}
          +	ADODB_Active_Record::ClassHasMany('person', 'children','person_id');
          +	
          +	$person = new person();
          +	$person->Load("id=1");
          +	foreach($person->children as $c) {
          +		echo " $c->name_first ";
          +		$c->name_first .= ' K.';
          +		$c->Save();  ## each child record must be saved individually
          +	}
          +
          +

          If no data is loaded, then children is set to an empty array: +

          +	$person2 = new person();
          +	$p = $person2->children;  ## $p is an empty array()
          +
          +

          By default, data returned by HasMany() is unsorted. To define an order by clause (or define a SELECT LIMIT window), see LoadRelations() below. Another point is that all children are loaded only when the child member is accessed (in __get), and not when the Load() function of the parent object is called. This helps to conserve memory. + +

          To create and save new parent and child records: +

          +
          +	class person extends ADOdb_Active_Record{}
          +	class children extends ADOdb_Active_Record{}
          +	ADODB_Active_Record::ClassHasMany('person', 'children','person_id');
          +	
          +	$person = new person();
          +	
          +	for ($i=0; $i<10; $i++) 
          +		$person->children[0] = new children('children');
          +	 
          +	 // modify fields of $person, then...
          +	$person->save();
          +	
          +	foreach($person->children as $c) {
          +		// modify fields of $c then...
          +		$c->save();
          +	}
          +
          +

          You can have multiple relationships (warning: relations are case-sensitive, 'Children' !== 'children'): +

          +	ADODB_Active_Record::ClassHasMany('person', 'children','person_id');
          +	ADODB_Active_Record::ClassHasMany('person', 'siblings','person_id');
          +	$person = new person();
          +	$person->Load('id=1');
          +	var_dump($person->children);
          +	var_dump($person->siblings);
          +
          +

          By default, the child class is ADOdb_Active_Record. Sometimes you might want the child class to be based on your own class which has additional functions. You can do so using the last parameter: +

          +	class person extends ADOdb_Active_Record{}
          +	class child extends ADOdb_Active_Record { .... some modifications here ... }
          +	ADODB_Active_Record::ClassHasMany('person', 'children','person_id', 'child');
          +
          +

          Lastly some troubleshooting issues. We use the __get() method to set +$p->children below. So once $p->children is defined by accessing it, we don't change the child reference, as shown below: +

          +	ADODB_Active_Record::ClassHasMany('person', 'children','person_id');
          +	$p = new person();
          +	$p->Load('id=1');
          +	# $p->children points to person_id = 1
          +	var_dump($p->children);
          +	
          +	$p->Load('id=2');
          +	# $p->children still points to person_id = 1
          +	var_dump($p->children); 
          +
          +

          The solution to the above is to unset($p->children) before $p->Load('id=2'). +

        43. TableHasMany
        44. +For some classes, the mapping between class name and table name (which is the pluralised version) might not match. For example, +the class name might be person, but the table name might be people. So we have 2 tables, people (parent table) and children (child table) +linked by people.id = children.person_id. +

          Then you use the following static function + ADODB_Active_Record::TableHasMany($table, $relation, $foreignKey = '', $foreignClass = 'ADODB_Active_Record') like this: +

          +ADODB_Active_Record::TableHasMany('people', 'children', 'person_id')
          +
          +

        45. TableKeyHasMany
        46. +For some classes, the mapping between class name and table name (which is the pluralised version) might not match or the primary key is not the default id. For example, +the class name might be person, but the table name might be people. So we have 2 tables, people (parent table) and children (child table) +linked by people.pid = children.person_id. +

          Then you use the following static function + ADODB_Active_Record::TableKeyHasMany($table, $tablePKey, $relation, $foreignKey = '', $foreignClass = 'ADODB_Active_Record') like this: +

          +ADODB_Active_Record::TableKeyHasMany('people', 'pid', 'children', 'person_id')
          +
          + + +

        47. A Complete ClassHasMany example
        48. +

          Here is sample usage using mysql: +

          +	include_once('../adodb.inc.php');
          +	include_once('../adodb-active-record.inc.php');
          +
          +	$db = NewADOConnection('mysql://root@localhost/northwind');
          +	ADOdb_Active_Record::SetDatabaseAdapter($db);
          +
          +	$db->Execute("CREATE TEMPORARY TABLE `persons` (
          +	                `id` int(10) unsigned NOT NULL auto_increment,
          +	                `name_first` varchar(100) NOT NULL default '',
          +	                `name_last` varchar(100) NOT NULL default '',
          +	                `favorite_color` varchar(100) NOT NULL default '',
          +	                PRIMARY KEY  (`id`)
          +	            ) ENGINE=MyISAM;
          +	           ");
          +			   
          +	$db->Execute("CREATE TEMPORARY TABLE `children` (
          +	                `id` int(10) unsigned NOT NULL auto_increment,
          +					`person_id` int(10) unsigned NOT NULL,
          +					`gender` varchar(10) default 'F',
          +	                `name_first` varchar(100) NOT NULL default '',
          +	                `name_last` varchar(100) NOT NULL default '',
          +	                `favorite_pet` varchar(100) NOT NULL default '',
          +	                PRIMARY KEY  (`id`)
          +	            ) ENGINE=MyISAM;
          +	           ");
          +			   
          +	$db->Execute("insert into children (person_id,name_first,name_last) values (1,'Jill','Lim')");
          +	$db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')");
          +	$db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')");
          +			   
          +	class person extends ADOdb_Active_Record{}
          +	ADODB_Active_Record::ClassHasMany('person', 'children','person_id');	
          +	
          +	$person = new person();
          +	
          +	$person->name_first     = 'John';
          +	$person->name_last      = 'Lim';
          +	$person->favorite_color = 'lavender';
          +	$person->save(); // this save will perform an INSERT successfully
          +	
          +	$person2 = new person(); # no need to define HasMany() again, adodb remembers definition
          +	$person2->Load('id=1');
          +	
          +	$c = $person2->children;
          +	if (is_array($c) && sizeof($c) == 3 && $c[0]->name_first=='Jill' && $c[1]->name_first=='Joan'
          +		&& $c[2]->name_first == 'JAMIE') echo "OK Loaded HasMany<br>";
          +	else {
          +		echo "Error loading hasMany should have 3 array elements Jill Joan Jamie<br>";
          +	}
          +
          + +

        49. HasMany
        50. +

          This older method is deprecated and ClassHasMany/TableHasMany/TableKeyHasMany should be used. +

          The older way to define a one-to-many relationship is to use $parentobj->HasMany($relation, $foreignKey = ''). For example, we have 2 tables, persons (parent table) and children (child table) +linked by persons.id = children.person_id. The variable $person->children is an array that holds the children. To define this relationship: +

          +	class person extends ADOdb_Active_Record{}
          +	
          +	$person = new person();
          +	$person->HasMany('children','person_id');
          +	$person->Load("id=1");
          +	foreach($person->children as $c) {
          +		echo " $c->name_first ";
          +		$c->name_first .= ' K.';
          +		$c->Save();  ## each child record must be saved individually
          +	}
          +
          +

          This HasMany() definition is global for the current script. This means that you only need to define it once. In the following example, $person2 knows about children. +

          +	$person = new person();
          +	$person->HasMany('children','person_id');
          +	
          +	$person2 = new person();
          +	$person->Load("id=1");
          +	$p = $person2->children;
          +
          + + +

        51. ClassBelongsTo
        52. +

          You can define the parent of the current object using ADODB_Active_Record::ClassBelongsTo($class, $relationName, $foreignKey, $parentPrimaryKey = 'id', $parentClass = 'ADODB_Active_Record'). In the example below, +we have a child table kids, and a parent table person. We have a link kids.person_id = persons.id. We create a child first, then link it to the parent: +

          +	class kid extends ADOdb_Active_Record{};
          +	ADODB_Active_Record::ClassBelongsTo('kid','person','person_id','id'); 
          +
          +	$ch = new kid(); // default tablename will be 'kids', with primary key 'id' 
          +	$ch->Load('id=1');
          +	$p = $ch->person;
          +	if (!$p || $p->name_first != 'John') echo "Error loading belongsTo<br>";
          +	else echo "OK loading BelongTo<br>";
          +
          +

          +

          Note that relationships are case-sensitive, so ClassBelongsTo('kid','PARENT', 'parent_id') and ClassBelongsTo('kid', 'parent', 'parent_id') are not the same. +

          Also if no data is loaded into the child instance, then $p will return null; +

          +	ADODB_Active_Record::ClassBelongsTo('kid','person','person_id','id'); 
          +	
          +	$ch = new kid();
          +	$p = $ch->person; # $p is null
          +
          +

          Another way to define the class of the parent (which otherwise defaults to ADODB_Active_Record) as follows: +

          +
          +	class kid extends ADOdb_Active_Record{};
          +	class person extends ADOdb_Active_Record{... your modifications ... };
          +	ADODB_Active_Record::ClassBelongsTo('kid','person','person_id','id', 'person'); 
          +
          +

        53. TableBelongsTo
        54. +

          If the child table differs from the convention that the child table name is the plural of the child class name, use this function: +ADODB_Active_Record::TableBelongsTo($childTable, $relationName, $foreignKey, $parentPrimaryKey = 'id', $parentClass = 'ADODB_Active_Record'). +

          E.g. the class is child, but the table name is children, and the link between the two tables is children.person_id = person.id: +

          +	ADODB_Active_Record::TableBelongsTo('children','person','person_id','id');
          +
          +

        55. TableKeyBelongsTo
        56. +

          If the child table differs from the convention that the child table name is the plural of the child class name or the primary key is not 'id', use this function: +ADODB_Active_Record::TableKeyBelongsTo($childTable, $childKey, $relationName, $foreignKey, $parentPrimaryKey = 'id', $parentClass = 'ADODB_Active_Record'). +

          E.g. the class is child, but the table name is children and primary key is ch_id, and the link between the two tables is children.person_id = person.id: +

          +	ADODB_Active_Record::TableKeyBelongsTo('children','ch_id', 'person','person_id','id');
          +
          +

        57. BelongsTo
        58. +

          The following is deprecated. Use ClassBelongsTo/TableBelongsTo/TableKeyBelongsTo instead. +

          The older way to define the parent of the current object is using BelongsTo($relationName, $foreignKey, $parentPrimaryKey = 'id'). In the example below, +we have a child table children, and a parent table person. We have a link children.person_id = persons.id. We create a child first, then link it to the parent: +

          +	class Child extends ADOdb_Active_Record{};
          +	$ch = new Child('children',array('id'));
          +	$ch->BelongsTo('person','person_id','id');  ## this can be simplified to $ch->BelongsTo('person')
          +	                                            ## as foreign key defaults to $table.'_id' and 
          +	                                            ## parent pkey defaults to 'id' 
          +	$ch->Load('id=1');
          +	$p = $ch->person;
          +	if (!$p || $p->name_first != 'John') echo "Error loading belongsTo<br>";
          +	else echo "OK loading BelongTo<br>";
          +
          +

          You only need to define BelongsTo() once in a script as it is global for all instances. + +

        59. LoadRelations
        60. +

          Sometimes you want to load only a subset of data in a relationship. For example, you could load all female children sorted by children.name +using LoadRelations($relation, $whereOrderBy = '', $offset = -1, $limit = -1): +

          +	# assume this has been called: 
          +	#   ADODB_Active_Record::ClassHasMany('person', 'children','person_id');
          +	$person = new person(); 
          +	$person->Load('id=23');  
          +	# Load doesn't load children until $person->children is accessed or LoadRelations is called:
          +	$person->LoadRelations('children',"gender='F' order by name");
          +
          +

          Lastly, if you have lots of child data, you can define a window of data of records to load. In the following +example, we load a window of 100 records at a time: +

          +
          +	# assume this has been called: 
          +	#  ADODB_Active_Record::ClassHasMany('Account', 'transactions','account_id'); 
          +	$acc = new Account();
          +	$acc->Load('id=23');
          +	while(true) {
          +		$start = 0;
          +		$acc->LoadRelations('transactions',"tx_done=0 order by trxdate", $start, $start+100);
          +		if (!$acc->transactions) break;
          +		foreach ($acc->transactions as $k => $trx) {
          +			## process
          +			$trx->tx_done = 1;
          +			$trx->save();
          +		}
          +		$start += 100;
          +	}
          +
          +

          The $offset is 0-based, and $limit is the number of records to retrieve. The default is to ignore $offset (-1) and $limit (-1). +

        61. Acknowledgements
        62. +

          Thanks to Chris Ravenscroft for original one-to-many code (chris#voilaweb.com). +

          ADOConnection Supplement

          + +

        63. ADOConnection::GetActiveRecords()
        64. +

          +This allows you to retrieve an array of ADOdb_Active_Records. Returns false if an error occurs. +

          +$table = 'products';
          +$whereOrderBy = "name LIKE 'A%' ORDER BY Name";
          +$activeRecArr = $db->GetActiveRecords($table, $whereOrderBy);
          +foreach($activeRecArr as $rec) {
          +	$rec->id = rand();
          +	$rec->save();
          +}
          +
          +

          +And to retrieve all records ordered by specific fields: +

          +$whereOrderBy = "1=1 ORDER BY Name";
          +$activeRecArr = $db->GetActiveRecords($table);
          +
          +

          +To use bind variables (assuming ? is the place-holder for your database): +

          +$activeRecArr = $db->GetActiveRecords($tableName, 'name LIKE ?',
          +						array('A%'));
          +
          +

          You can also define the primary keys of the table by passing an array of field names: +

          +$activeRecArr = $db->GetActiveRecords($tableName, 'name LIKE ?',
          +						array('A%'), array('id'));
          +
          + +

        65. ADOConnection::GetActiveRecordsClass()
        66. +

          +This allows you to retrieve an array of objects derived from ADOdb_Active_Records. Returns false if an error occurs. +

          +class Product extends ADOdb_Active_Record{};
          +$table = 'products';
          +$whereOrderBy = "name LIKE 'A%' ORDER BY Name";
          +$activeRecArr = $db->GetActiveRecordsClass('Product',$table, $whereOrderBy);
          +
          +# the objects in $activeRecArr are of class 'Product'
          +foreach($activeRecArr as $rec) {
          +	$rec->id = rand();
          +	$rec->save();
          +}
          +
          +

          +To use bind variables (assuming ? is the place-holder for your database): +

          +$activeRecArr = $db->GetActiveRecordsClass($className,$tableName, 'name LIKE ?',
          +						array('A%'));
          +
          +

          You can also define the primary keys of the table by passing an array of field names: +

          +$activeRecArr = $db->GetActiveRecordsClass($className,$tableName, 'name LIKE ?',
          +						array('A%'), array('id'));
          +
          + +
        + +

      • ADOConnection::ErrorMsg()
      • +

        Returns last error message. +

      • ADOConnection::ErrorNo()
      • +

        Returns last error number. + +

        ActiveRecord Code Sample

        +

        The following works with PHP4 and PHP5 +

        +include('../adodb.inc.php');
        +include('../adodb-active-record.inc.php');
        +
        +// uncomment the following if you want to test exceptions
        +#if (PHP_VERSION >= 5) include('../adodb-exceptions.inc.php');
        +
        +$db = NewADOConnection('mysql://root@localhost/northwind');
        +$db->debug=1;
        +ADOdb_Active_Record::SetDatabaseAdapter($db);
        +
        +$db->Execute("CREATE TEMPORARY TABLE `persons` (
        +                `id` int(10) unsigned NOT NULL auto_increment,
        +                `name_first` varchar(100) NOT NULL default '',
        +                `name_last` varchar(100) NOT NULL default '',
        +                `favorite_color` varchar(100) NOT NULL default '',
        +                PRIMARY KEY  (`id`)
        +            ) ENGINE=MyISAM;
        +           ");
        +		   
        +class person extends ADOdb_Active_Record{}
        +$person = new person();
        +
        +echo "<p>Output of getAttributeNames: ";
        +var_dump($person->getAttributeNames());
        +
        +/**
        + * Outputs the following:
        + * array(4) {
        + *    [0]=>
        + *    string(2) "id"
        + *    [1]=>
        + *    string(9) "name_first"
        + *    [2]=>
        + *    string(8) "name_last"
        + *    [3]=>
        + *    string(13) "favorite_color"
        + *  }
        + */
        +
        +$person = new person();
        +$person->name_first = 'Andi';
        +$person->name_last  = 'Gutmans';
        +$person->save(); // this save() will fail on INSERT as favorite_color is a must fill...
        +
        +
        +$person = new person();
        +$person->name_first     = 'Andi';
        +$person->name_last      = 'Gutmans';
        +$person->favorite_color = 'blue';
        +$person->save(); // this save will perform an INSERT successfully
        +
        +echo "<p>The Insert ID generated:"; print_r($person->id);
        +
        +$person->favorite_color = 'red';
        +$person->save(); // this save() will perform an UPDATE
        +
        +$person = new person();
        +$person->name_first     = 'John';
        +$person->name_last      = 'Lim';
        +$person->favorite_color = 'lavender';
        +$person->save(); // this save will perform an INSERT successfully
        +
        +// load record where id=2 into a new ADOdb_Active_Record
        +$person2 = new person();
        +$person2->Load('id=2');
        +var_dump($person2);
        +
        +// retrieve an array of records
        +$activeArr = $db->GetActiveRecordsClass($class = "person",$table = "persons","id=".$db->Param(0),array(2));
        +$person2 = $activeArr[0];
        +echo "<p>Name first (should be John): ",$person->name_first, "<br>Class = ",get_class($person2);	
        +
        + + + +
        +

        Active Record eXtended

        +

        This is the original one-to-many Active Record implementation submitted by +Chris Ravenscroft (chris#voilaweb.com). The reason why we are offering both versions is that the Extended version +is more powerful but more complex. My personal preference is to keep it simpler, but your view may vary. +

        To use, just include adodb-active-recordx.inc.php instead of adodb-active-record.inc.php. +

        It provides a new function called Find() that is quite intuitive to use as shown in the example below. It also supports loading all relationships using a single query (using joins). +

        +<?php
        +	function ar_assert($obj, $cond)
        +	{
        +		global $err_count;
        +		$res = var_export($obj, true);
        +		return (strpos($res, $cond));
        +	}
        +
        +	include_once('../adodb.inc.php');
        +	include_once('../adodb-active-recordx.inc.php');
        +	
        +
        +	$db = NewADOConnection('mysql://root@localhost/northwind');
        +	$db->debug=0;
        +	ADOdb_Active_Record::SetDatabaseAdapter($db);
        +	echo "<pre>\n";
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "Preparing database using SQL queries (creating 'people', 'children')\n";
        +
        +	$db->Execute("DROP TABLE `people`");
        +	$db->Execute("DROP TABLE `children`");
        +
        +	$db->Execute("CREATE TABLE `people` (
        +	                `id` int(10) unsigned NOT NULL auto_increment,
        +	                `name_first` varchar(100) NOT NULL default '',
        +	                `name_last` varchar(100) NOT NULL default '',
        +	                `favorite_color` varchar(100) NOT NULL default '',
        +	                PRIMARY KEY  (`id`)
        +	            ) ENGINE=MyISAM;
        +	           ");
        +	$db->Execute("CREATE TABLE `children` (
        +	                `id` int(10) unsigned NOT NULL auto_increment,
        +					`person_id` int(10) unsigned NOT NULL,
        +	                `name_first` varchar(100) NOT NULL default '',
        +	                `name_last` varchar(100) NOT NULL default '',
        +	                `favorite_pet` varchar(100) NOT NULL default '',
        +	                PRIMARY KEY  (`id`)
        +	            ) ENGINE=MyISAM;
        +	           ");
        +			   
        +	
        +	$db->Execute("insert into children (person_id,name_first,name_last,favorite_pet) values (1,'Jill','Lim','tortoise')");
        +	$db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')");
        +	$db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')");
        +			   
        +	// This class _implicitely_ relies on the 'people' table (pluralized form of 'person')
        +	class Person extends ADOdb_Active_Record
        +	{
        +		function __construct()
        +		{
        +			parent::__construct();
        +			$this->hasMany('children');
        +		}
        +	}
        +	// This class _implicitely_ relies on the 'children' table
        +	class Child extends ADOdb_Active_Record
        +	{
        +		function __construct()
        +		{
        +			parent::__construct();
        +			$this->belongsTo('person');
        +		}
        +	}
        +	// This class _explicitely_ relies on the 'children' table and shares its metadata with Child
        +	class Kid extends ADOdb_Active_Record
        +	{
        +		function __construct()
        +		{
        +			parent::__construct('children');
        +			$this->belongsTo('person');
        +		}
        +	}
        +	// This class _explicitely_ relies on the 'children' table but does not share its metadata
        +	class Rugrat extends ADOdb_Active_Record
        +	{
        +		function __construct()
        +		{
        +			parent::__construct('children', false, false, array('new' => true));
        +		}
        +	}
        +	
        +	echo "Inserting person in 'people' table ('John Lim, he likes lavender')\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$person = new Person();
        +	$person->name_first     = 'John';
        +	$person->name_last      = 'Lim';
        +	$person->favorite_color = 'lavender';
        +	$person->save(); // this save will perform an INSERT successfully
        +
        +	$err_count = 0;
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "person->Find('id=1') [Lazy Method]\n";
        +	echo "person is loaded but its children will be loaded on-demand later on\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$person5 = new Person();
        +	$people5 = $person5->Find('id=1');
        +	echo (ar_assert($people5, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n";
        +	echo (ar_assert($people5, "'favorite_pet' => 'tortoise'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation yet\n";
        +	foreach($people5 as $person)
        +	{
        +		foreach($person->children as $child)
        +		{
        +			if($child->name_first);
        +		}
        +	}
        +	echo (ar_assert($people5, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "person->Find('id=1' ... ADODB_WORK_AR) [Worker Method]\n";
        +	echo "person is loaded, and so are its children\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$person6 = new Person();
        +	$people6 = $person6->Find('id=1', false, false, array('loading' => ADODB_WORK_AR));
        +	echo (ar_assert($people6, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n";
        +	echo (ar_assert($people6, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "person->Find('id=1' ... ADODB_JOIN_AR) [Join Method]\n";
        +	echo "person and its children are loaded using a single query\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$person7 = new Person();
        +	// When I specifically ask for a join, I have to specify which table id I am looking up
        +	// otherwise the SQL parser will wonder which table's id that would be.
        +	$people7 = $person7->Find('people.id=1', false, false, array('loading' => ADODB_JOIN_AR));
        +	echo (ar_assert($people7, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n";
        +	echo (ar_assert($people7, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n";
        +	
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "person->Load('people.id=1') [Join Method]\n";
        +	echo "Load() always uses the join method since it returns only one row\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$person2 = new Person();
        +	// Under the hood, Load(), since it returns only one row, always perform a join
        +	// Therefore we need to clarify which id we are talking about.
        +	$person2->Load('people.id=1');
        +	echo (ar_assert($person2, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n";
        +	echo (ar_assert($person2, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "child->Load('children.id=1') [Join Method]\n";
        +	echo "We are now loading from the 'children' table, not from 'people'\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch = new Child();
        +	$ch->Load('children.id=1');
        +	echo (ar_assert($ch, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ch, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "child->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch2 = new Child();
        +	$ach2 = $ch2->Find('id=1', false, false, array('loading' => ADODB_WORK_AR));
        +	echo (ar_assert($ach2, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ach2, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n";
        +	echo "Where we see that kid shares relationships with child because they are stored\n";
        +	echo "in the common table's metadata structure.\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch3 = new Kid('children');
        +	$ach3 = $ch3->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR));
        +	echo (ar_assert($ach3, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ach3, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "kid->Find('children.id=1' ... ADODB_LAZY_AR) [Lazy Method]\n";
        +	echo "Of course, lazy loading also retrieve medata information...\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch32 = new Kid('children');
        +	$ach32 = $ch32->Find('children.id=1', false, false, array('loading' => ADODB_LAZY_AR));
        +	echo (ar_assert($ach32, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ach32, "'favorite_color' => 'lavender'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation yet\n";
        +	foreach($ach32 as $akid)
        +	{
        +		if($akid->person);
        +	}
        +	echo (ar_assert($ach32, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n";
        +	
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n";
        +	echo "In rugrat's constructor it is specified that\nit must forget any existing relation\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch4 = new Rugrat('children');
        +	$ach4 = $ch4->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR));
        +	echo (ar_assert($ach4, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ach4, "'favorite_color' => 'lavender'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation found\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n";
        +	echo "Note how only rugrat forgot its relations - kid is fine.\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch5 = new Kid('children');
        +	$ach5 = $ch5->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR));
        +	echo (ar_assert($ach5, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ach5, "'favorite_color' => 'lavender'")) ? "[OK] I did not forget relation: person\n" : "[!!] I should not have forgotten relation: person\n";
        +	
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n";
        +	echo "---------------------------------------------------------------------------\n";
        +	$ch6 = new Rugrat('children');
        +	$ch6s = $ch6->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR));
        +	$ach6 = $ch6s[0];
        +	echo (ar_assert($ach6, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n";
        +	echo (ar_assert($ach6, "'favorite_color' => 'lavender'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation yet\n";
        +	echo "\nLoading relations:\n";
        +	$ach6->belongsTo('person');
        +	$ach6->LoadRelations('person', 'order by id', 0, 2);
        +	echo (ar_assert($ach6, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n";
        +
        +	echo "\n\n---------------------------------------------------------------------------\n";
        +	echo "Test suite complete.\n";
        +	echo "---------------------------------------------------------------------------\n";
        +?>
        +
        +

        Todo (Code Contributions welcome)

        +

        Check _original and current field values before update, only update changes. Also if the primary key value is changed, then on update, we should save and use the original primary key values in the WHERE clause! + +

        PHP5 specific: Make GetActiveRecords*() return an Iterator. +

        PHP5 specific: Change PHP5 implementation of Active Record to use __get() and __set() for better performance. + +

        Change Log

        +

        0.93 +

        You can force column names to be quoted in INSERT and UPDATE statements, typically because you are using reserved words as column names by setting +ADODB_Active_Record::$_quoteNames = true; + +

        0.92 +

        Fixed some issues with incompatible fetch modes (ADODB_FETCH_ASSOC) causing problems in UpdateActiveTable. +

        Added support for functions that support predefining one-to-many relationships:
        ClassHasMany ClassBelongsTo TableHasMany TableBelongsTo TableKeyHasMany TableKeyBelongsTo.
        +

        You can also define your child/parent class in these functions, instead of the default ADODB_Active_Record. + +

        0.91 +

        HasMany hardcoded primary key field name to "id". Fixed. + +

        0.90 +

        Support for belongsTo and hasMany. Thanks to Chris Ravenscroft (chris#voilaweb.com). +

        Added LoadRelations(). + +

        0.08 +Added support for assoc arrays in Set(). + +

        0.07 +

        $ADODB_ASSOC_CASE=2 did not work properly. Fixed. +

        Added === check in ADODB_SetDatabaseAdapter for $db, adodb-active-record.inc.php. Thx Christian Affolter. + +

        0.06 +

        Added ErrorNo(). +

        Fixed php 5.2.0 compat issues. + +

        0.05 +

        If inserting a record and the value of a primary key field is null, then we do not insert that field in as +we assume it is an auto-increment field. Needed by mssql. + +

        0.04 5 June 2006
        +

        Added support for declaring table name in $_table in class declaration. Thx Bill Dueber for idea. +

        Added find($where,$bindarr=false) method to retrieve an array of active record objects. + +

        0.03
        +- Now we only update fields that have changed, using $this->_original.
        +- We do not include auto_increment fields in replace(). Thx Travis Cline
        +- Added ADODB_ACTIVE_CACHESECS.
        + +

        0.02
        +- Much better error handling. ErrorMsg() implemented. Throw implemented if adodb-exceptions.inc.php detected.
        +- You can now define the primary keys of the view or table you are accessing manually.
        +- The Active Record allows you to create an object which does not have a primary key. You can INSERT but not UPDATE in this case. +- Set() documented.
        +- Fixed _pluralize bug with y suffix. + +

        + 0.01 6 Mar 2006
        +- Fixed handling of nulls when saving (it didn't save nulls, saved them as '').
        +- Better error handling messages.
        +- Factored out a new method GetPrimaryKeys().
        +

        + 0.00 5 Mar 2006
        + 1st release + + \ No newline at end of file diff --git a/fannie/adodb5/docs/docs-adodb.htm b/fannie/adodb5/docs/docs-adodb.htm new file mode 100644 index 000000000..40057389a --- /dev/null +++ b/fannie/adodb5/docs/docs-adodb.htm @@ -0,0 +1,7731 @@ + + + + + + + + + + +ADODB Manual + + + + + + + + + + + + + +

        + +

        ADOdb Library for PHP

        + +

        V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com)

        + +

        This software is dual licensed using BSD-Style +and LGPL. This means you can use it in compiled proprietary and commercial +products.

        + +

        Useful ADOdb links: DownloadOther Docs

        + +

        Introduction
        +Unique Features
        +How People are using ADOdb
        +Feature Requests and Bug Reports
        +Installation
        +Minimum Install
        +Initializing Code and Connectioning to Databases
        +
          Data Source +Name (DSN) Support   Connection Examples +
        +High Speed ADOdb - tuning tips
        +Hacking and Modifying ADOdb Safely
        +PHP5 Features

        +foreach iterators exceptions
        +Supported Databases
        +Tutorials
        +Example 1: Select
        +Example 2: Advanced Select
        +Example 3: Insert
        +Example 4: Debugging  rs2html +example
        +Example 5: MySQL and Menus
        +Example 6: Connecting to Multiple Databases at once
        +Example 7: Generating Update and Insert SQL
        +Example 8: Implementing Scrolling with Next and Previous
        +Example 9: Exporting in CSV or Tab-Delimited Format
        +Example 10: Custom filters
        +Example 11: Smart Transactions
        +
        +Using Custom Error Handlers and PEAR_Error
        +Data Source Names
        +Caching

        +    MemCache
        +    Caching API
        +Pivot Tables

        + +

        REFERENCE

        + +

        Variables: $ADODB_COUNTRECS +$ADODB_ANSI_PADDING_OFF $ADODB_CACHE_DIR
        +        $ADODB_FORCE_TYPE $ADODB_FETCH_MODE $ADODB_LANG +ADODB_QUOTE_FIELDNAMES
        +Constants: ADODB_ASSOC_CASE

        +ADOConnection
        +Connections: Connect PConnect NConnect IsConnected
        +Executing SQL: Execute CacheExecute +SelectLimit CacheSelectLimit +Param Prepare PrepareSP +InParameter OutParameter +AutoExecute
        +              GetOne CacheGetOne GetRow CacheGetRow GetAll CacheGetAll GetCol CacheGetCol GetAssoc CacheGetAssoc +Replace GetMedian
        +               ExecuteCursor (oci8 only)
        +Generates SQL strings: GetUpdateSQL GetInsertSQL Concat IfNull length random +substr qstr Param +OffsetDate SQLDate DBDate DBTimeStamp BindDate BindTimeStamp
        +Blobs: UpdateBlob UpdateClob +UpdateBlobFile BlobEncode +BlobDecode
        +Paging/Scrolling: PageExecute CachePageExecute
        +Cleanup: CacheFlush Close
        +Transactions: StartTrans CompleteTrans +FailTrans HasFailedTrans +BeginTrans CommitTrans RollbackTrans SetTransactionMode
        +Fetching Data: SetFetchMode
        +Strings: concat length qstr quote substr
        +Dates: DBDate DBTimeStamp UnixDate BindDate BindTimeStamp UnixTimeStamp +OffsetDate SQLDate
        +Row Management: Affected_Rows Insert_ID RowLock GenID CreateSequence DropSequence
        +Error Handling: ErrorMsg ErrorNo +MetaError MetaErrorMsg IgnoreErrors
        +Data Dictionary (metadata): MetaDatabases MetaTables MetaColumns MetaColumnNames MetaPrimaryKeys +MetaForeignKeys ServerInfo +
        +Statistics and Query-Rewriting: LogSQL fnExecute and fnCacheExecute
        +Deprecated: Bind BlankRecordSet +Parameter

        +ADORecordSet

        +Returns one field: Fields
        +Returns one row:FetchRow FetchInto +FetchObject FetchNextObject +FetchObj FetchNextObj GetRowAssoc
        +Returns all rows:GetArray GetRows +GetAssoc
        +Scrolling:Move MoveNext MoveFirst MoveLast AbsolutePosition CurrentRow AtFirstPage AtLastPage AbsolutePage
        +Menu generation:GetMenu GetMenu2
        +Dates:UserDate UserTimeStamp +UnixDate UnixTimeStamp
        +
        Recordset Info:RecordCount PO_RecordCount NextRecordSet
        +Field Info:FieldCount FetchField +MetaType
        +Cleanup: Close

        + +

        rs2html  example
        +Differences between ADOdb and ADO
        +Database Driver Guide
        +
        Change Log

        + +

        Introduction

        + +

        PHP's database access functions are not standardised. This creates a need +for a database class library to hide the differences between the different +database API's (encapsulate the differences) so we can easily switch databases. +PHP 4.0.5 or later is now required (because we use array-based str_replace).

        + +

        We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL +Anywhere, Informix, PostgreSQL, FrontBase, SQLite, Interbase (Firebird and +Borland variants), Foxpro, Access, ADO, +DB2, SAP DB and ODBC. We have had successful reports of connecting to Progress +and CacheLite via ODBC. We hope more people will contribute drivers to support +other databases.

        + +

        PHP4 supports session variables. You can store your session information +using ADOdb for true portability and scalability. See adodb-session.php for +more information.

        + +

        Also read tips_portable_sql.htm +for tips on writing portable SQL.

        + +

        Unique Features of ADOdb

        + +
          +
        • Easy for Windows + programmers to adapt to because many of the conventions are similar to + Microsoft's ADO.
        • +
        • Unlike other PHP database + classes which focus only on select statements, we provide support code + to handle inserts and updates which can be adapted to multiple databases + quickly. Methods are provided for date handling, string concatenation + and string quoting characters for differing databases.
        • +
        • A metatype system is + built in so that we can figure out that types such as CHAR, TEXT and + STRING are equivalent in different databases.
        • +
        • Easy to port because + all the database dependant code are stored in stub functions. You do not + need to port the core logic of the classes.
        • +
        • Portable table and index + creation with the datadict classes.
        • +
        • Database performance + monitoring and SQL tuning with the performance + monitoring classes.
        • +
        • Database-backed sessions + with the session management classes. + Supports session expiry notification.
        • +
        • Object-Relational + Mapping using ADOdb_Active_Record + classes.
        • +
        + +

        How People are using ADOdb

        + +

        Here are some examples of how people are using ADOdb (for a +much longer list, visit adodb-cool-apps):

        + +
          +
        • PhpLens is a commercial data grid component + that allows both cool Web designers and serious unshaved programmers to + develop and maintain databases on the Web easily. Developed by the author + of ADOdb.
        • +
        • PHAkt: PHP Extension for DreamWeaver + Ultradev allows you to script PHP in the popular Web page editor. + Database handling provided by ADOdb.
        • +
        • Analysis + Console for Intrusion Databases (ACID): PHP-based analysis engine to + search and process a database of security incidents generated by + security-related software such as IDSes and firewalls (e.g. Snort, + ipchains). By Roman Danyliw.
        • +
        • PostNuke is a very popular free + content management system and weblog system. It offers full CSS support, + HTML 4.01 transitional compliance throughout, an advanced blocks system, + and is fully multi-lingual enabled.
        • +
        • EasyPublish + CMS is another free content management system for managing information + and integrated modules on your internet, intranet- and extranet-sites. + From Norway.
        • +
        • NOLA is a full featured accounting, + inventory, and job tracking application. It is licensed under the GPL, and + developed by Noguska.
        • +
        + +

        Feature Requests and Bug Reports

        + +

        Feature requests and bug reports can be emailed to jlim#natsoft.com or posted to the ADOdb Help +forums at http://phplens.com/lens/lensforum/topics.php?id=4.

        + +

        Installation Guide

        + +

        Make sure you are running PHP 4.0.5 or later. Unpack all the files into a +directory accessible by your webserver.

        + +

        To test, try modifying some of the tutorial examples. Make sure you +customize the connection settings correctly. You can debug using $db->debug += true as shown below:

        + +
        <?php
        +         include('adodb/adodb.inc.php');
        +         $db = ADONewConnection($dbdriver); # eg 'mysql' or 'postgres'
        +         $db->debug = true;
        +         $db->Connect($server, $user, $password, $database);
        +         $rs = $db->Execute('select * from some_small_table');
        +         print "<pre>";
        +         print_r($rs->GetRows());
        +         print "</pre>";
        +?>
        + +

        Minimum Install

        + +

        For developers who want to release a minimal install of ADOdb, you will +need:

        + +
          +
        • adodb.inc.php
        • +
        • adodb-lib.inc.php
        • +
        • adodb-time.inc.php
        • +
        • drivers/adodb-$database.inc.php +
        • +
        • license.txt (for legal + reasons)
        • +
        • adodb-php4.inc.php
        • +
        • adodb-iterator.inc.php + (php5 functionality)
        • +
        + +

        Optional:

        + +
          +
        • adodb-error.inc.php and + lang/adodb-$lang.inc.php (if you use MetaError())
        • +
        • adodb-csvlib.inc.php (if + you use cached recordsets - CacheExecute(), etc)
        • +
        • adodb-exceptions.inc.php + and adodb-errorhandler.inc.php (if you use adodb error handler or php5 + exceptions).
        • +
        • adodb-active-record.inc.php + if you use Active Records.
        • +
        + +

        Code Initialization Examples

        + +

        When running ADOdb, at least two files are loaded. First is +adodb/adodb.inc.php, which contains all functions used by all database classes. +The code specific to a particular database is in the +adodb/driver/adodb-????.inc.php file.

        + +

        For example, to connect to a mysql database:

        + +
        include('/path/to/set/here/adodb.inc.php');
        +$conn = &ADONewConnection('mysql');
        + +

        Whenever you need to connect to a database, you create a Connection object +using the ADONewConnection($driver) function. NewADOConnection($driver) +is an alternative name for the same function.

        + +

        At this point, you are not connected to the database (no longer true if you +pass in a dsn). You will first need to decide whether +to use persistent or non-persistent connections. The advantage of +persistent connections is that they are faster, as the database +connection is never closed (even when you call Close()). Non-persistent connections +take up much fewer resources though, reducing the risk of your database and +your web-server becoming overloaded.

        + +

        For persistent connections, use $conn->PConnect(), +or $conn->Connect() for non-persistent connections. +Some database drivers also support NConnect(), which +forces the creation of a new connection.

        + +

        Connection Gotcha: If you create two connections, but both use the +same userid and password, PHP will share the same connection. This can cause +problems if the connections are meant to different databases. The solution is +to always use different userid's for different databases, or use NConnect().

        + +

        Data Source Name (DSN) Support

        + +

        Since ADOdb 4.51, you can connect to a database by passing a dsn to +NewADOConnection() (or ADONewConnection, which is the same function). The dsn +format is:

        + +
                 $driver://$username:$password@hostname/$database?options[=value]
        + +

        NewADOConnection() calls Connect() or PConnect() internally for you. If the +connection fails, false is returned.

        + +
                 # non-persistent connection
                 $dsn = 'mysql://root:pwd@localhost/mydb'; 
                 $db = NewADOConnection($dsn);
                 if (!$db) die("Connection failed");   
                 
                 # no need to call connect/pconnect!
                 $arr = $db->GetArray("select * from table");
                 
                 # persistent connection
        +
                 $dsn2 = 'mysql://root:pwd@localhost/mydb?persist'; 
        +
        +
                 # non-persistent connection on port 3000
        +
                 $dsn2 = 'mysqli://root:pwd@localhost/mydb?persist=0&port=3000';
        +
        + +

        If you have special characters such as /:?_ in your dsn, then you need to +rawurlencode them first:

        + +
                 $pwd = rawurlencode($pwd);
        +         $dsn = "mysql://root:$pwd@localhost/mydb";
                 $dsn2=rawurlencode("sybase_ase")."://user:pass@host/path?query";
        + +

        Legal options are:

        + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        For all drivers

        +
        +

        'persist', 'persistent', 'debug', 'fetchmode', 'new' , 'cachesecs', 'memcache'

        +
        +

        Interbase/Firebird

        +
        +

        'dialect','charset','buffers','role'

        +
        +

        M'soft ADO

        +
        +

        'charpage'

        +
        +

        MySQL

        +
        +

        'clientflags'

        +
        +

        MySQLi

        +
        +

        'port', 'socket', 'clientflags'

        +
        +

        Oci8

        +
        +

        'nls_date_format','charset'

        +
        + +
        + +

        For all drivers, when the options persist or persistent are +set, a persistent connection is forced; similarly, when new is set, then +a new connection will be created using NConnect if the underlying driver +supports it. The debug option enables debugging. The fetchmode +calls SetFetchMode(). If no value is defined for an +option, then the value is set to 1.

        + +

        Since ADOdb 5.09, we added 2 new parameters:

        +
          +
        • cachesecs which globally determines how many seconds to cache recordsets (default is 3600 secs if not defined) when +CacheExecute() and CacheSelectLimit() are called and no cache-time parameter is passed into these functions. +
        • memcache which defines the memcache host, port and whether to use compression. For example: +
          +	# we have a memcache server at 10.1.1.22 using default port 11211, no compression
          +	$dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22'; 
          +	
          +	# we have a memcache server 10.1.1.22 port 8888, compression=on
          +	$dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22:8888:1';
          +	 	
          +	# we have a memcache servers mem1,mem2 on port 8888, compression=off
          +	$dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0'; 
          +	
          +	# we have a memcache servers mem1,mem2 on port 8888, compression=off and cachesecs=120
          +	$dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0&cachesecs=120';
          +
          +
        + +

        ADOdb DSN's are compatible with version 1.0 of PEAR DB's DSN format.

        + +

        Examples of Connecting to Databases

        + +

        MySQL and Most Other Database Drivers

        + +

        MySQL connections are very +straightforward, and the parameters are identical to mysql_connect:

        + +
                 $conn = &ADONewConnection('mysql'); 
        +         $conn->PConnect('localhost','userid','password','database');
        +        
        +        
        # or dsn
                 $dsn = 'mysql://user:pwd@localhost/mydb'; 
                 $conn = ADONewConnection($dsn);  # no need for Connect()
                 
                 # or persistent dsn
                 $dsn = 'mysql://user:pwd@localhost/mydb?persist'; 
                 $conn = ADONewConnection($dsn);  # no need for PConnect()
                 
                 # a more complex example:
                 $pwd = urlencode($pwd);
                 $flags =  MYSQL_CLIENT_COMPRESS;
                 $dsn = "mysql://user:$pwd@localhost/mydb?persist&clientflags=$flags";
                 $conn = ADONewConnection($dsn);  # no need for PConnect()
         
        + +

        For most drivers, you can use the +standard function: Connect($server, $user, $password, $database), or a DSN since ADOdb 4.51. Exceptions to this are listed +below.

        + +

        PDO

        + +

        PDO, which only works with PHP5, accepts a +driver specific connection string:

        + +
         
                 $conn =& NewADConnection('pdo');
                 $conn->Connect('mysql:host=localhost',$user,$pwd,$mydb);
                 $conn->Connect('mysql:host=localhost;dbname=mydb',$user,$pwd);
                 $conn->Connect("mysql:host=localhost;dbname=mydb;username=$user;password=$pwd");
        + +

        The DSN mechanism is also supported:

        + +
         
                 $conn =& NewADConnection("pdo_mysql://user:pwd@localhost/mydb?persist"); # persist is optional
        + +

        PostgreSQL

        + +

        PostgreSQL 7 and 8 accepts connections using: +

        + +

        a. the standard connection string:

        + +
                 $conn = &ADONewConnection('postgres');  
        +         $conn->PConnect('host=localhost port=5432 dbname=mary');
        + +

        b. the classical 4 parameters:

        + +
                 $conn->PConnect('localhost','userid','password','database');
        + 
        + +

        c. dsn:

        + +
                 $dsn = 'postgres://user:pwd@localhost/mydb?persist';  # persist is optional
                 $conn = ADONewConnection($dsn);  # no need for Connect/PConnect
        + + + +

        LDAP

        + +

        Here is an example of querying a LDAP server. Thanks to Josh Eldridge for +the driver and this example:

        + +
         
        require('/path/to/adodb.inc.php');
         
        /* Make sure to set this BEFORE calling Connect() */
        $LDAP_CONNECT_OPTIONS = Array(
                 Array ("OPTION_NAME"=>LDAP_OPT_DEREF, "OPTION_VALUE"=>2),
                 Array ("OPTION_NAME"=>LDAP_OPT_SIZELIMIT,"OPTION_VALUE"=>100),
                 Array ("OPTION_NAME"=>LDAP_OPT_TIMELIMIT,"OPTION_VALUE"=>30),
                 Array ("OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,"OPTION_VALUE"=>3),
                 Array ("OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,"OPTION_VALUE"=>13),
                 Array ("OPTION_NAME"=>LDAP_OPT_REFERRALS,"OPTION_VALUE"=>FALSE),
                 Array ("OPTION_NAME"=>LDAP_OPT_RESTART,"OPTION_VALUE"=>FALSE)
        );
        $host = 'ldap.baylor.edu';
        $ldapbase = 'ou=People,o=Baylor University,c=US';
         
        $ldap = NewADOConnection( 'ldap' );
        $ldap->Connect( $host, $user_name='', $password='', $ldapbase );
         
        echo "<pre>";
         
        print_r( $ldap->ServerInfo() );
        $ldap->SetFetchMode(ADODB_FETCH_ASSOC);
        $userName = 'eldridge';
        $filter="(|(CN=$userName*)(sn=$userName*)(givenname=$userName*)(uid=$userName*))";
         
        $rs = $ldap->Execute( $filter );
        if ($rs)
                 while ($arr = $rs->FetchRow()) {
                      print_r($arr);       
                 }
         
        $rs = $ldap->Execute( $filter );
        if ($rs) 
                 while (!$rs->EOF) {
                         print_r($rs->fields);     
                         $rs->MoveNext();
                 } 
                 
        print_r( $ldap->GetArray( $filter ) );
        print_r( $ldap->GetRow( $filter ) );
         
        $ldap->Close();
        echo "</pre>";
        + +

        Using DSN:

        + +
         
        $dsn = "ldap://ldap.baylor.edu/ou=People,o=Baylor University,c=US";
        $db = NewADOConnection($dsn);
        + +

        Interbase/Firebird

        + +

        You define the database in the $host parameter:

        + +
                 $conn = &ADONewConnection('ibase'); 
        +         $conn->PConnect('localhost:c:\ibase\employee.gdb','sysdba','masterkey');
        + +

        Or dsn:

        + +
                 $dsn = 'firebird://user:pwd@localhost/mydb?persist&dialect=3';  # persist is optional
        +         $conn = ADONewConnection($dsn);  # no need for Connect/PConnect
        + +

        SQLite

        + +

        Sqlite will create the database file if it does not exist.

        + +
                 $conn = &ADONewConnection('sqlite');
                 $conn->PConnect('c:\path\to\sqlite.db'); # sqlite will create if does not exist
        + +

        Or dsn:

        + +
                 $path = urlencode('c:\path\to\sqlite.db');
                 $dsn = "sqlite://$path/?persist";  # persist is optional
                 $conn = ADONewConnection($dsn);  # no need for Connect/PConnect
        + +

        Oracle (oci8)

        + +

        With oci8, you can connect in multiple ways. Note that oci8 works fine with +newer versions of the Oracle, eg. 9i and 10g.

        + +

        a. PHP and Oracle reside on the same machine, use default SID.

        + +
                 $conn->Connect(false, 'scott', 'tiger');
        + +

        b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS'

        + +
                 $conn->PConnect(false, 'scott', 'tiger', 'myTNS');
        + +

        or

        + +
                 $conn->PConnect('myTNS', 'scott', 'tiger');
        + +

        c. Host Address and SID

        + +
         
                 # with adodb 5.06 or 4.991 and later
                 $conn->Connect('192.168.0.1', 'scott', 'tiger', "SID=$SID");
                 
                 # OR with all versions of ADOdb
                 $conn->connectSID = true;
                 $conn->Connect('192.168.0.1', 'scott', 'tiger', $SID);
                 
        + +

        d. Host Address and Service Name

        + +
                 $conn->Connect('192.168.0.1', 'scott', 'tiger', 'servicename');
        + +

        e. Oracle connection string:

        + +
                 $cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))
        +                          (CONNECT_DATA=(SID=$sid)))";
        +         $conn->Connect($cstr, 'scott', 'tiger');
        + +

        f. ADOdb dsn:

        + +
                 $dsn = 'oci8://user:pwd@tnsname/?persist';  # persist is optional
        +         $conn = ADONewConnection($dsn);  # no need for Connect/PConnect
        +        
        +         $dsn = 'oci8://user:pwd@host/sid';
        +         $conn = ADONewConnection($dsn);
        +        
        +         $dsn = 'oci8://user:pwd@/';   # oracle on local machine
        +         $conn = ADONewConnection($dsn);
        + +

        You can also set the charSet for Oracle 9.2 and later, supported since PHP +4.3.2, ADOdb 4.54:

        + +
                 $conn->charSet = 'we8iso8859p1';
        +         $conn->Connect(...);
        +        
        +         # or
        +         $dsn = 'oci8://user:pwd@tnsname/?charset=WE8MSWIN1252';
        +         $db = ADONewConnection($dsn);
        + +

        DSN-less ODBC ( Access, MSSQL and DB2 examples)

        + +

        ODBC DSN's can be created in the ODBC control panel, or you can use a +DSN-less connection.To use DSN-less connections with ODBC you need PHP 4.3 or +later.

        + +

        For Microsoft Access:

        + +
                 $db =& ADONewConnection('access');
        +         $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\\northwind.mdb;Uid=Admin;Pwd=;";
                 $db->Connect($dsn);
        + +

        For Microsoft SQL Server:

        + +
                 $db =& ADONewConnection('odbc_mssql');
        +         $dsn = "Driver={SQL Server};Server=localhost;Database=northwind;";
        +         $db->Connect($dsn,'userid','password');
        + +

        or if you prefer to use the mssql extension (which is +limited to mssql 6.5 functionality):

        + +
                 $db =& ADONewConnection('mssql');
        +         $db->Execute('localhost', 'userid', 'password', 'northwind');
        + +

        For DB2:

        + +
         
                 $dbms = 'db2'; # or 'odbc_db2' if db2 extension not available
                 $db =& ADONewConnection($dbms);
                 $dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP;".
                                           "uid=root; pwd=secret";
        +         $db->Connect($dsn);
        + +

        DSN-less Connections with ADO
        +If you are using versions of PHP earlier than PHP 4.3.0, DSN-less connections +only work with Microsoft's ADO, +which is Microsoft's COM based API. An example using the ADOdb library and +Microsoft's ADO: +

        + +
        <?php
        +         include('adodb.inc.php');
        +         $db = &ADONewConnection("ado_mssql");
        +         print "<h1>Connecting DSN-less $db->databaseType...</h1>";
        +                
        +         $myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};"
        +                 . "SERVER=flipper;DATABASE=ai;UID=sa;PWD=;"  ;
                 $db->Connect($myDSN);
                 
                 $rs = $db->Execute("select * from table");
                 $arr = $rs->GetArray();
                 print_r($arr);
        ?>
        + +

        High Speed ADOdb - tuning tips

        + +

        ADOdb is a big class library, yet it consistently +beats all other PHP class libraries in performance. This is because it is +designed in a layered fashion, like an onion, with the fastest functions in the +innermost layer. Stick to the following functions for best performance:

        + +
        + + + + + + + + +
        +

        Innermost Layer

        +
        +

        Connect, PConnect, NConnect
        + Execute, CacheExecute
        + SelectLimit, CacheSelectLimit
        + MoveNext, Close
        + qstr, Affected_Rows, Insert_ID

        +
        + +
        + +

        The fastest way to access the field data is by accessing the array +$recordset->fields directly. Also set the global variables $ADODB_FETCH_MODE = ADODB_FETCH_NUM, and (for +oci8, ibase/firebird and odbc) $ADODB_COUNTRECS += false before you connect to your database.

        + +

        Consider using bind parameters if your database supports it, as it improves +query plan reuse. Use ADOdb's performance tuning system to identify bottlenecks +quickly. At the time of writing (Dec 2003), this means oci8 and odbc drivers.

        + +

        Lastly make sure you have a PHP accelerator cache installed such as APC, +Turck MMCache, Zend Accelerator or ionCube.

        + +

        Some examples:

        + +
        + + + + + + + + + + +
        +

        Fastest data retrieval using PHP

        +
        +

        Fastest data retrieval using ADOdb extension

        +
        +
        $rs =& $rs->Execute($sql);
        +while (!$rs->EOF) {
        +          var_dump($rs->fields);
        +          $rs->MoveNext();
        +}
        +
        +
        $rs =& $rs->Execute($sql);
        +$array = adodb_getall($rs);
        +var_dump($array);
        +
        +
        +
        + +
        + +

        Advanced Tips

        + +

        If you have the ADOdb C +extension installed, you can replace your calls to $rs->MoveNext() with +adodb_movenext($rs). This doubles the speed of this operation. For retrieving +entire recordsets at once, use GetArray(), which uses the high speed extension +function adodb_getall($rs) internally.

        + +

        Execute() is the default way to run queries. You can use the low-level +functions _Execute() and _query() to reduce query overhead. Both these +functions share the same parameters as Execute().

        + +

        If you do not have any bind parameters or your database supports binding +(without emulation), then you can call _Execute() directly. Calling this +function bypasses bind emulation. Debugging is still supported in _Execute().

        + +

        If you do not require debugging facilities nor emulated binding, and do not +require a recordset to be returned, then you can call _query. This is great for +inserts, updates and deletes. Calling this function bypasses emulated binding, +debugging, and recordset handling. Either the resultid, true or false are +returned by _query().

        + +

        For Informix, you can disable scrollable cursors with $db->cursorType = +0.

        + +

        Hacking ADOdb Safely

        + +

        You might want to modify ADOdb for your own purposes. Luckily you can still +maintain backward compatibility by sub-classing ADOdb and using the +$ADODB_NEWCONNECTION variable. $ADODB_NEWCONNECTION allows you to override the +behaviour of ADONewConnection(). ADOConnection() checks for this variable and +will call the function-name stored in this variable if it is defined.

        + +

        In the following example, new functionality for the connection object is +placed in the hack_mysql and hack_postgres7 classes. The +recordset class naming convention can be controlled using $rsPrefix. Here we +set it to 'hack_rs_', which will make ADOdb use hack_rs_mysql and hack_rs_postgres7 +as the recordset classes.

        + +
        class hack_mysql extends adodb_mysql {
        +var $rsPrefix = 'hack_rs_';
        +  /* Your mods here */
        +}
        +
        +class hack_rs_mysql extends ADORecordSet_mysql {
        +          /* Your mods here */
        +}
        +
        +class hack_postgres7 extends adodb_postgres7 {
        +var $rsPrefix = 'hack_rs_';
        +  /* Your mods here */
        +}
        +
        +class hack_rs_postgres7 extends ADORecordSet_postgres7 {
        + /* Your mods here */
        +}
        +
        +$ADODB_NEWCONNECTION = 'hack_factory';
        +
        +function& hack_factory($driver)
        +{
        +         if ($driver !== 'mysql' && $driver !== 'postgres7') return false;
        +        
        +         $driver = 'hack_'.$driver;
        +         $obj = new $driver();
        +         return $obj;
        +}
        +
        +include_once('adodb.inc.php');
        + +

        Don't forget to call the constructor of the parent class in your +constructor. If you want to use the default ADOdb drivers return false in the +above hack_factory() function. Also you can define your own +ADORecordSet_empty() class, by defining a class $$this->rsPrefix.'empty' +since 4.96/5.02.

        + +

        PHP5 Features

        + +

        ADOdb 4.02 or later will transparently determine which +version of PHP you are using. If PHP5 is detected, the following features become +available:

        + +
          +
        • PDO: PDO drivers + are available. See the connection examples. Currently + PDO drivers are not as powerful as native drivers, and should be treated + as experimental.
        • +
        • Foreach iterators: + This is a very natural way of going through a recordset:
        • +
        + +
          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +  $rs = $db->Execute($sql);
        +  foreach($rs as $k => $row) {
        +           echo "r1=".$row[0]." r2=".$row[1]."<br>";
        +  }
        + +
          +
        • Exceptions: + Just include adodb-exceptions.inc.php and you can now catch + exceptions on errors as they occur.
        • +
        + +
          include("../adodb-exceptions.inc.php"); 
        +  include("../adodb.inc.php");      
        +  try {
        +           $db = NewADOConnection("oci8");
        +           $db->Connect('','scott','bad-password');
        +  } catch (exception $e) {
        +           var_dump($e);
        +           adodb_backtrace($e->gettrace());
        +  }
        + +

        Note that reaching EOF is not considered +an error nor an exception.

        + +

        Databases Supported

        + +

        The name below is the value you pass to +NewADOConnection($name) to create a connection object for that database.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        Name

        +
        +

        Tested

        +
        +

        Database

        +
        +

        RecordCount() usable

        +
        +

        Prerequisites

        +
        +

        Operating Systems

        +
        +

        access

        +
        +

        B

        +
        +

        Microsoft Access/Jet. You + need to create an ODBC DSN.

        +
        +

        Y/N

        +
        +

        ODBC

        +
        +

        Windows only

        +
        +

        ado

        +
        +

        B

        +
        +

        Generic ADO, not tuned for specific databases. + Allows DSN-less connections. For best performance, use an OLEDB provider. + This is the base class for all ado drivers.

        +

        You can set $db->codePage before + connecting.

        +
        +

        ? depends on database

        +
        +

        ADO or OLEDB provider

        +
        +

        Windows only

        +
        +

        ado_access

        +
        +

        B

        +
        +

        Microsoft Access/Jet using ADO. Allows DSN-less + connections. For best performance, use an OLEDB provider.

        +
        +

        Y/N

        +
        +

        ADO or OLEDB provider

        +
        +

        Windows only

        +
        +

        ado_mssql

        +
        +

        B

        +
        +

        Microsoft SQL Server using ADO. Allows DSN-less + connections. For best performance, use an OLEDB provider.

        +
        +

        Y/N

        +
        +

        ADO or OLEDB provider

        +
        +

        Windows only

        +
        +

        db2

        +
        +

        C

        +
        +

        Uses PHP's db2-specific + extension for better performance.

        +
        +

        Y/N

        +
        +

        DB2 CLI/ODBC interface

        +
        +

        Unix and Windows. Requires IBM DB2 + Universal Database client.

        +
        +

        odbc_db2

        +
        +

        C

        +
        +

        Connects to DB2 using + generic ODBC extension.

        +
        +

        Y/N

        +
        +

        DB2 CLI/ODBC interface

        +
        +

        Unix and Windows. Unix + install hints. I have had reports that the $host and $database params + have to be reversed in Connect() when using the CLI interface.

        +
        +

        vfp

        +
        +

        A

        +
        +

        Microsoft Visual FoxPro. + You need to create an ODBC DSN.

        +
        +

        Y/N

        +
        +

        ODBC

        +
        +

        Windows only

        +
        +

        fbsql

        +
        +

        C

        +
        +

        FrontBase.

        +
        +

        Y

        +
        +

        ?

        +
        +

        Unix and Windows

        +
        +

        ibase

        +
        +

        B

        +
        +

        Interbase 6 or earlier. + Some users report you might need to use this
        + $db->PConnect('localhost:c:/ibase/employee.gdb', "sysdba", + "masterkey") to connect. Lacks Affected_Rows currently.
        +
        + You can set $db->role, $db->dialect, $db->buffers and + $db->charSet before connecting.

        +
        +

        Y/N

        +
        +

        Interbase client

        +
        +

        Unix and Windows

        +
        +

        firebird

        +
        +

        C

        +
        +

        Firebird version of + interbase.

        +
        +

        Y/N

        +
        +

        Interbase client

        +
        +

        Unix and Windows

        +
        +

        borland_ibase

        +
        +

        C

        +
        +

        Borland version of + Interbase 6.5 or later. Very sad that the forks differ.

        +
        +

        Y/N

        +
        +

        Interbase client

        +
        +

        Unix and Windows

        +
        +

        informix

        +
        +

        C

        +
        +

        Generic informix driver. + Use this if you are using Informix 7.3 or later.

        +
        +

        Y/N

        +
        +

        Informix client

        +
        +

        Unix and Windows

        +
        +

        informix72

        +
        +

        C

        +
        +

        Informix databases before + Informix 7.3 that do no support SELECT FIRST.

        +
        +

        Y/N

        +
        +

        Informix client

        +
        +

        Unix and Windows

        +
        +

        ldap

        +
        +

        C

        +
        +

        LDAP driver. See this + example for usage information.

        +
        +

         

        +
        +

        LDAP extension

        +
        +

        ?

        +
        +

        mssql

        +
        +

        A

        +
        +

        Microsoft SQL Server 7 and later. Works + with Microsoft SQL Server 2000 also. Note that date formating is problematic + with this driver. For example, the PHP mssql extension does not return the + seconds for datetime!

        +
        +

        Y/N

        +
        +

        Mssql client

        +
        +

        Unix and Windows.
        + Unix install + howto and another + one.

        +
        +

        mssqlpo

        +
        +

        A

        +
        +

        Portable mssql driver. Identical to above mssql + driver, except that '||', the concatenation operator, is converted to '+'. + Useful for porting scripts from most other sql variants that use ||.

        +
        +

        Y/N

        +
        +

        Mssql client

        +
        +

        Unix and Windows.
        + Unix install howto
        .

        +
        +

        mssqlnative

        +
        +

        C

        +
        +

        Native mssql driver from M'soft.

        +
        +

        ?

        +
        +

        ?

        +
        +

        Windows. Tq Garrett Serack of M'soft.

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        mysql

        +
        +

        A

        +
        +

        MySQL without transaction + support. You can also set $db->clientFlags before connecting.

        +
        +

        Y

        +
        +

        MySQL client

        +
        +

        Unix and Windows

        +
        +

        mysqlt or maxsql

        +
        +

        A

        +
        +

        MySQL with transaction support. We + recommend using || as the concat operator for best portability. This can be + done by running MySQL using:
        + mysqld --ansi or mysqld --sql-mode=PIPES_AS_CONCAT

        +
        +

        Y/N

        +
        +

        MySQL client

        +
        +

        Unix and Windows

        +
        +

        oci8

        +
        +

        A

        +
        +

        Oracle 8/9. Has more + functionality than oracle driver (eg. Affected_Rows). You might have + to putenv('ORACLE_HOME=...') before Connect/PConnect.

        +

        There are 2 ways of connecting - with + server IP and service name:
        + PConnect('serverip:1521','scott','tiger','service')
        + or using an entry in TNSNAMES.ORA or ONAMES or HOSTNAMES:
        + PConnect(false, 'scott', 'tiger', $oraname).

        +

        Since 2.31, we support Oracle REF cursor + variables directly (see ExecuteCursor).

        +
        +

        Y/N

        +
        +

        Oracle client

        +
        +

        Unix and Windows

        +
        +

        oci805

        +
        +

        C

        +
        +

        Supports reduced Oracle + functionality for Oracle 8.0.5. SelectLimit is not as efficient as in the + oci8 or oci8po drivers.

        +
        +

        Y/N

        +
        +

        Oracle client

        +
        +

        Unix and Windows

        +
        +

        oci8po

        +
        +

        A

        +
        +

        Oracle 8/9 portable driver. + This is nearly identical with the oci8 driver except (a) bind variables in + Prepare() use the ? convention, instead of :bindvar, (b) field names use the + more common PHP convention of lowercase names.

        +

        Use this driver if porting from other + databases is important. Otherwise the oci8 driver offers better performance.

        +
        +

        Y/N

        +
        +

        Oracle client

        +
        +

        Unix and Windows

        +
        +

        odbc

        +
        +

        A

        +
        +

        Generic ODBC, not tuned for + specific databases. To connect, use
        + PConnect('DSN','user','pwd'). This is the base class for all odbc derived + drivers.

        +
        +

        ? depends on database

        +
        +

        ODBC

        +
        +

        Unix and Windows. Unix hints.

        +
        +

        odbc_mssql

        +
        +

        C

        +
        +

        Uses ODBC to connect to + MSSQL

        +
        +

        Y/N

        +
        +

        ODBC

        +
        +

        Unix and Windows.

        +
        +

        odbc_oracle

        +
        +

        C

        +
        +

        Uses ODBC to connect to + Oracle

        +
        +

        Y/N

        +
        +

        ODBC

        +
        +

        Unix and Windows.

        +
        +

        odbtp

        +
        +

        C

        +
        +

        Generic odbtp driver. Odbtp is a software for accessing + Windows ODBC data sources from other operating systems.

        +
        +

        Y/N

        +
        +

        odbtp

        +
        +

        Unix and Windows

        +
        +

        odbtp_unicode

        +
        +

        C

        +
        +

        Odtbp with unicode support

        +
        +

        Y/N

        +
        +

        odbtp

        +
        +

        Unix and Windows

        +
        +

        oracle

        +
        +

        C

        +
        +

        Implements old Oracle 7 + client API. Use oci8 driver if possible for better performance.

        +
        +

        Y/N

        +
        +

        Oracle client

        +
        +

        Unix and Windows

        +
        +

        netezza

        +
        +

        C

        +
        +

        Netezza driver. Netezza is + based on postgres code-base.

        +
        +

        Y

        +
        +

        ?

        +
        +

        ?

        +
        +

        pdo

        +
        +

        C

        +
        +

        Generic PDO driver for + PHP5.

        +
        +

        Y

        +
        +

        PDO extension and database + specific drivers

        +
        +

        Unix and Windows.

        +
        +

        postgres

        +
        +

        A

        +
        +

        Generic PostgreSQL driver. + Currently identical to postgres7 driver.

        +
        +

        Y

        +
        +

        PostgreSQL client

        +
        +

        Unix and Windows.

        +
        +

        postgres64

        +
        +

        A

        +
        +

        For PostgreSQL 6.4 and + earlier which does not support LIMIT internally.

        +
        +

        Y

        +
        +

        PostgreSQL client

        +
        +

        Unix and Windows.

        +
        +

        postgres7

        +
        +

        A

        +
        +

        PostgreSQL which supports + LIMIT and other version 7 functionality.

        +
        +

        Y

        +
        +

        PostgreSQL client

        +
        +

        Unix and Windows.

        +
        +

        postgres8

        +
        +

        A

        +
        +

        PostgreSQL which supports + version 8 functionality.

        +
        +

        Y

        +
        +

        PostgreSQL client

        +
        +

        Unix and Windows.

        +
        +

        sapdb

        +
        +

        C

        +
        +

        SAP DB. Should work + reliably as based on ODBC driver.

        +
        +

        Y/N

        +
        +

        SAP ODBC client

        +
        +

        ?

        +
        +

        sqlanywhere

        +
        +

        C

        +
        +

        Sybase SQL Anywhere. Should + work reliably as based on ODBC driver.

        +
        +

        Y/N

        +
        +

        SQL Anywhere ODBC client

        +
        +

        ?

        +
        +

        sqlite

        +
        +

        B

        +
        +

        SQLite.

        +
        +

        Y

        +
        +

        -

        +
        +

        Unix and Windows.

        +
        +

        sqlitepo

        +
        +

        B

        +
        +

        Portable SQLite driver. This + is because assoc mode does not work like other drivers in sqlite. Namely, + when selecting (joining) multiple tables, the table names are included in the + assoc keys in the "sqlite" driver.

        +

        In "sqlitepo" driver, the table + names are stripped from the returned column names. When this results in a + conflict, the first field get preference.

        +
        +

        Y

        +
        +

        -

        +
        +

        Unix and Windows.

        +
        +

        sybase

        +
        +

        C

        +
        +

        Sybase.

        +
        +

        Y/N

        +
        +

        Sybase client

        +
        +

        Unix and Windows.

        +
        +

        sybase_ase

        +
        +

        C

        +
        +

        Sybase ASE.

        +
        +

        Y/N

        +
        +

        Sybase client

        +
        +

        Unix and Windows.

        +
        + +

        The "Tested" column indicates how extensively the code has been +tested and used.
        +A = well tested and used by many people
        +B = tested and usable, but some features might not be implemented
        +C = user contributed or experimental driver. Might not fully support all of the +latest features of ADOdb.

        + +

        The column "RecordCount() usable" indicates whether RecordCount() +return the number of rows, or returns -1 when a SELECT statement is executed. +If this column displays Y/N then the RecordCount() is emulated when the global +variable $ADODB_COUNTRECS=true (this is the default). Note that for large +recordsets, it might be better to disable RecordCount() emulation because +substantial amounts of memory are required to cache the recordset for counting. +Also there is a speed penalty of 40-50% if emulation is required. This is +emulated in most databases except for PostgreSQL and MySQL. This variable is +checked every time a query is executed, so you can selectively choose which +recordsets to count.

        + +
        + +
        + +
        + +

        Tutorials

        + +

        Example 1: Select Statement

        + +

        Task: Connect to the Access Northwind DSN, display the first 2 columns of +each row.

        + +

        In this example, we create a ADOConnection object, which represents the +connection to the database. The connection is initiated with PConnect, which is a persistent +connection. Whenever we want to query the database, we call the ADOConnection.Execute() +function. This returns an ADORecordSet object which is actually a cursor that +holds the current row in the array fields[]. +We use MoveNext() +to move from row to row.

        + +

        NB: A useful function that is not used in this example is SelectLimit, +which allows us to limit the number of rows shown.

        + +
        <?
        +include('adodb.inc.php');    # load code common to ADOdb
        +$conn = &ADONewConnection('access');        # create a connection
        +$conn->PConnect('northwind');   # connect to MS-Access, northwind DSN
        +$recordSet = &$conn->Execute('select * from products');
        +if (!$recordSet)
        +         print $conn->ErrorMsg();
        +else
        +while (!$recordSet->EOF) {
        +         print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
        +         $recordSet->MoveNext();
        +}
         
        $recordSet->Close(); # optional
        +$conn->Close(); # optional
        +
        +
        ?>
        + +

        The $recordSet returned +stores the current row in the $recordSet->fields +array, indexed by column number (starting from zero). We use the MoveNext() +function to move to the next row. The EOF +property is set to true when end-of-file is reached. If an error occurs in +Execute(), we return false instead of a recordset.

        + +

        The $recordSet->fields[] +array is generated by the PHP database extension. Some database extensions only +index by number and do not index the array by field name. To force indexing by +name - that is associative arrays - use the SetFetchMode function. Each +recordset saves and uses whatever fetch mode was set when the recordset was +created in Execute() or SelectLimit().

        + +
                 $db->SetFetchMode(ADODB_FETCH_NUM);
        +         $rs1 = $db->Execute('select * from table');
        +         $db->SetFetchMode(ADODB_FETCH_ASSOC);
        +         $rs2 = $db->Execute('select * from table');
        +         print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1')
                 print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')
        + +

        To get the number of rows in the select statement, you can use $recordSet->RecordCount(). +Note that it can return -1 if the number of rows returned cannot be determined.

        + +

        Example 2: Advanced Select with Field Objects

        + +

        Select a table, display the first two columns. If the second column is a +date or timestamp, reformat the date to US format.

        + +
        <?
        +include('adodb.inc.php');    # load code common to ADOdb
        +$conn = &ADONewConnection('access');        # create a connection
        +$conn->PConnect('northwind');   # connect to MS-Access, northwind dsn
        +$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders');
        +if (!$recordSet)
        +         print $conn->ErrorMsg();
        +else
        +while (!$recordSet->EOF) {
        +         $fld = $recordSet->FetchField(1);
                 $type = $recordSet->MetaType($fld->type);
        +
        +         if ( $type == 'D' || $type == 'T')
        +                 print $recordSet->fields[0].' '.
        +                          $recordSet->UserDate($recordSet->fields[1],'m/d/Y').'<BR>';
        +         else
                         print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
        +
        +         $recordSet->MoveNext();
        +}
        $recordSet->Close(); # optional
        +$conn->Close(); # optional
        +
        +
        ?>
        + +

        In this example, we check the field type of the second column using FetchField(). +This returns an object with at least 3 fields.

        + +
          +
        • name: name of column
        • +
        • type: native field + type of column
        • +
        • max_length: maximum + length of field. Some databases such as MySQL do not return the maximum + length of the field correctly. In these cases max_length will be set to + -1.
        • +
        + +

        We then use MetaType() +to translate the native type to a generic type. Currently the following generic +types are defined:

        + +
          +
        • C: character fields + that should be shown in a <input type="text"> tag.
        • +
        • X: TeXt, large text + fields that should be shown in a <textarea>
        • +
        • B: Blobs, or Binary + Large Objects. Typically images.
        • +
        • D: Date field
        • +
        • T: Timestamp field
        • +
        • L: Logical field + (boolean or bit-field)
        • +
        • I:  Integer + field
        • +
        • N: Numeric field. + Includes autoincrement, numeric, floating point, real and integer.
        • +
        • R: Serial field. + Includes serial, autoincrement integers. This works for selected + databases.
        • +
        + +

        If the metatype is of type date or timestamp, then we print it using the +user defined date format with UserDate(), which converts the PHP SQL date string +format to a user defined one. Another use for MetaType() is data validation before doing an SQL +insert or update.

        + +

        Example 3: Inserting

        + +

        Insert a row to the Orders table containing dates and strings that need to +be quoted before they can be accepted by the database, eg: the single-quote in +the word John's.

        + +
        <?
        +include('adodb.inc.php');    # load code common to ADOdb
        +$conn = &ADONewConnection('access');        # create a connection
        +
        +$conn->PConnect('northwind');   # connect to MS-Access, northwind dsn
        +$shipto = $conn->qstr("John's Old Shoppe");
        +
        +$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
        +$sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";
        +
        +if ($conn->Execute($sql) === false) {
        +         print 'error inserting: '.$conn->ErrorMsg().'<BR>';
        +}
        +?>
        + +

        In this example, we see the advanced date and quote handling facilities of +ADOdb. The unix timestamp (which is a long integer) is appropriately formated +for Access with DBDate(), +and the right escape character is used for quoting the John's Old Shoppe, +which is John''s Old Shoppe and not PHP's default John's +Old Shoppe with qstr(). +

        + +

        Observe the error-handling of the Execute statement. False is returned by Execute() if +an error occured. The error message for the last error that occurred is +displayed in ErrorMsg(). +Note: php_track_errors might have to be enabled for error messages to be +saved.

        + +

        Example 4: Debugging

        + +
        <?
        +include('adodb.inc.php');    # load code common to ADOdb
        +$conn = &ADONewConnection('access');        # create a connection
        +$conn->PConnect('northwind');   # connect to MS-Access, northwind dsn
        +$shipto = $conn->qstr("John's Old Shoppe");
        +$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
        +$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
        +$conn->debug = true;
        if ($conn->Execute($sql) === false) print 'error inserting';
        ?>
        + +

        In the above example, we have turned on debugging by setting debug = true. +This will display the SQL statement before execution, and also show any error +messages. There is no need to call ErrorMsg() in this case. For displaying the +recordset, see the rs2html() +example.

        + +

        Also see the section on Custom Error Handlers.

        + +

        Example 5: MySQL and Menus

        + +

        Connect to MySQL database agora, and generate a <select> menu +from an SQL statement where the <option> captions are in the 1st column, +and the value to send back to the server is in the 2nd column.

        + +
        <?
        +include('adodb.inc.php'); # load code common to ADOdb
        +$conn = &ADONewConnection('mysql');  # create a connection
        +$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
        +$sql = 'select CustomerName, CustomerID from customers';
        +$rs = $conn->Execute($sql);
        +print $rs->GetMenu('GetCust','Mary Rosli');
        +?>
        + +

        Here we define a menu named GetCust, with the menu option 'Mary Rosli' +selected. See GetMenu(). We also have functions that return +the recordset as an array: GetArray(), and as an associative array with the +key being the first column: GetAssoc().

        + +

        Example 6: Connecting to 2 Databases At Once

        + +
        <?
        +include('adodb.inc.php'); # load code common to ADOdb
        +$conn1 = &ADONewConnection('mysql');  # create a mysql connection
        +$conn2 = &ADONewConnection('oracle');  # create a oracle connection
        +
        +$conn1->PConnect($server, $userid, $password, $database);
        +$conn2->PConnect(false, $ora_userid, $ora_pwd, $oraname);
        +
        +$conn1->Execute('insert ...');
        +$conn2->Execute('update ...');
        +?>
        + +

        Example 7: Generating Update and Insert SQL

        + +

        Since ADOdb 4.56, we support AutoExecute(), +which simplifies things by providing an advanced wrapper for GetInsertSQL() and +GetUpdateSQL(). For example, an INSERT can be carried out with:

        + +
         
            $record["firstname"] = "Bob"; 
            $record["lastname"] = "Smith"; 
            $record["created"] = time(); 
            $insertSQL = $conn->AutoExecute($rs, $record, 'INSERT'); 
        + +

        and an UPDATE with:

        + +
         
            $record["firstname"] = "Caroline"; 
            $record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith 
            $insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1'); 
        + +

        The rest of this section is out-of-date:

        + +

        ADOdb 1.31 and later supports two new recordset functions: GetUpdateSQL( ) +and GetInsertSQL( ). This allow you to perform a "SELECT * FROM table +query WHERE...", make a copy of the $rs->fields, modify the fields, and +then generate the SQL to update or insert into the table automatically.

        + +

        We show how the functions can be used when accessing a table with the +following fields: (ID, FirstName, LastName, Created).

        + +

        Before these functions can be called, you need to initialize the recordset by +performing a select on the table. Idea and code by Jonathan Younger +jyounger#unilab.com. Since ADOdb 2.42, you can pass a table name instead of a +recordset into GetInsertSQL (in $rs), and it will generate an insert statement +for that table.

        + +
        <?
        +#==============================================
        +# SAMPLE GetUpdateSQL() and GetInsertSQL() code
        +#==============================================
        +include('adodb.inc.php');
        +include('tohtml.inc.php');
        +
        +#==========================
        +# This code tests an insert
        +
        +$sql = "SELECT * FROM ADOXYZ WHERE id = -1";
        +# Select an empty record from the database
        +
        +$conn = &ADONewConnection("mysql");  # create a connection
        +$conn->debug=1;
        +$conn->PConnect("localhost", "admin", "", "test"); # connect to MySQL, testdb
        +$rs = $conn->Execute($sql); # Execute the query and get the empty recordset
        +
        +$record = array(); # Initialize an array to hold the record data to insert
        +
        +# Set the values for the fields in the record
        +# Note that field names are case-insensitive
        +$record["firstname"] = "Bob";
        +$record["lastNamE"] = "Smith";
        +$record["creaTed"] = time();
        +
        +# Pass the empty recordset and the array containing the data to insert
        +# into the GetInsertSQL function. The function will process the data and return
        +# a fully formatted insert sql statement.
        +$insertSQL = $conn->GetInsertSQL($rs, $record);
        +
        +$conn->Execute($insertSQL); # Insert the record into the database
        +
        +#==========================
        +# This code tests an update
        +
        +$sql = "SELECT * FROM ADOXYZ WHERE id = 1";
        +# Select a record to update
        +
        +$rs = $conn->Execute($sql); # Execute the query and get the existing record to update
        +
        +$record = array(); # Initialize an array to hold the record data to update
        +
        +# Set the values for the fields in the record
        +# Note that field names are case-insensitive
        +$record["firstname"] = "Caroline";
        +$record["LasTnAme"] = "Smith"; # Update Caroline's lastname from Miranda to Smith
        +
        +# Pass the single record recordset and the array containing the data to update
        +# into the GetUpdateSQL function. The function will process the data and return
        +# a fully formatted update sql statement with the correct WHERE clause.
        +# If the data has not changed, no recordset is returned
        +$updateSQL = $conn->GetUpdateSQL($rs, $record);
        +
        +$conn->Execute($updateSQL); # Update the record in the database
        +$conn->Close();
        +?>
        + +

        $ADODB_FORCE_TYPE

        + +

        The behaviour of AutoExecute(), GetUpdateSQL() and GetInsertSQL() when +converting empty or null PHP variables to SQL is controlled by the global +$ADODB_FORCE_TYPE variable. Set it to one of the values below. Default is +ADODB_FORCE_VALUE (3):

        + +
        0 = ignore empty fields. All empty fields in array are ignored.
        +1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values.
        +2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values.
        +3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and
        +    empty fields '' are set to empty '' sql values.
        +
        +define('ADODB_FORCE_IGNORE',0);
        +define('ADODB_FORCE_NULL',1);
        +define('ADODB_FORCE_EMPTY',2);
        +define('ADODB_FORCE_VALUE',3);
        + +

        Thanks to Niko (nuko#mbnet.fi) for the $ADODB_FORCE_TYPE code.

        + +

        Note: the constant ADODB_FORCE_NULLS is obsolete since 4.52 and is ignored. +Set $ADODB_FORCE_TYPE = ADODB_FORCE_NULL for equivalent behaviour.

        + +

        Since 4.62, the table name to be used can be overridden by setting +$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called.

        + +

        Example 8: Implementing Scrolling with Next and Previous

        + +

        The following code creates a very simple recordset pager, where you can +scroll from page to page of a recordset.

        + +
        include_once('../adodb.inc.php');
        +include_once('../adodb-pager.inc.php');
        +session_start();
        +
        +$db = NewADOConnection('mysql');
        +
        +$db->Connect('localhost','root','','xphplens');
        +
        +$sql = "select * from adoxyz ";
        +
        +$pager = new ADODB_Pager($db,$sql);
        +$pager->Render($rows_per_page=5);
        + +

        This will create a basic record pager that looks like this:

        + + + + + + + + + + + +
        +

        |< +   << +   >> +   >| +  

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        ID

        +
        +

        First Name

        +
        +

        Last Name

        +
        +

        Date Created

        +
        +

        36 

        +
        +

        Alan 

        +
        +

        Turing 

        +
        +

        Sat 06, Oct 2001 

        +
        +

        37 

        +
        +

        Serena 

        +
        +

        Williams 

        +
        +

        Sat 06, Oct 2001 

        +
        +

        38 

        +
        +

        Yat Sun 

        +
        +

        Sun 

        +
        +

        Sat 06, Oct 2001 

        +
        +

        39 

        +
        +

        Wai Hun 

        +
        +

        See 

        +
        +

        Sat 06, Oct 2001 

        +
        +

        40 

        +
        +

        Steven 

        +
        +

        Oey 

        +
        +

        Sat 06, Oct 2001 

        +
        +

        +
        +

        Page 8/10

        +
        + +

        The number of rows to display at one time is controled by the Render($rows) +method. If you do not pass any value to Render(), ADODB_Pager will default to +10 records per page.

        + +

        You can control the column titles by modifying your SQL (supported by most +databases):

        + +
        $sql = 'select id as "ID", firstname as "First Name", 
        +                   lastname as "Last Name", created as "Date Created"
        +                 from adoxyz';
        + +

        The above code can be found in the adodb/tests/testpaging.php example +included with this release, and the class ADODB_Pager in adodb/adodb-pager.inc.php. +The ADODB_Pager code can be adapted by a programmer so that the text links can +be replaced by images, and the dull white background be replaced with more +interesting colors.

        + +

        You can also allow display of html by setting $pager->htmlSpecialChars = +false.

        + +

        Some of the code used here was contributed by Iván Oliva and Cornel G.

        + +

        Example 9: Exporting in CSV or Tab-Delimited Format

        + +

        We provide some helper functions to export in comma-separated-value (CSV) +and tab-delimited formats:

        + +
        include_once('/path/to/adodb/toexport.inc.php');
        +include_once('/path/to/adodb/adodb.inc.php');
        +
        +
        $db = &NewADOConnection('mysql');
        +$db->Connect($server, $userid, $password, $database);
        +
        +$rs = $db->Execute('select fname as "First Name", surname as "Surname" from table');
        +
        +print "<pre>";
        +print rs2csv($rs); # return a string, CSV format
        + +

        print '<hr>';
        +
        +$rs->MoveFirst(); # note, some databases do not support MoveFirst
        +print rs2tab($rs,false); # return a string, tab-delimited
        +                                                     # false == suppress field names in first line

        + +
        print '<hr>';
        +$rs->MoveFirst();
        +rs2tabout($rs); # send to stdout directly (there is also an rs2csvout function)
        +print "</pre>";
        +
        +$rs->MoveFirst();
        +$fp = fopen($path, "w");
        +if ($fp) {
        +  rs2csvfile($rs, $fp); # write to file (there is also an rs2tabfile function)
        +  fclose($fp);
        +}
        + +

        Carriage-returns or newlines are converted to spaces. Field names are +returned in the first line of text. Strings containing the delimiter character +are quoted with double-quotes. Double-quotes are double-quoted again. This +conforms to Excel import and export guide-lines.

        + +

        All the above functions take as an optional last parameter, $addtitles which +defaults to true. When set to false field names in the first line +are suppressed.

        + +

        Example 10: Recordset Filters

        + +

        Sometimes we want to pre-process all rows in a recordset before we use it. +For example, we want to ucwords all text in recordset.

        + +
        include_once('adodb/rsfilter.inc.php');
        +include_once('adodb/adodb.inc.php');
        +
        +// ucwords() every element in the recordset
        +function do_ucwords(&$arr,$rs)
        +{
        +         foreach($arr as $k => $v) {
        +                 $arr[$k] = ucwords($v);
        +         }
        +}
        +
        +$db = NewADOConnection('mysql');
        +$db->PConnect('server','user','pwd','db');
        +
        +$rs = $db->Execute('select ... from table');
        +$rs = RSFilter($rs,'do_ucwords');
        + +

        The RSFilter function takes 2 parameters, the recordset, and the name +of the filter function. It returns the processed recordset scrolled to +the first record. The filter function takes two parameters, the current +row as an array, and the recordset object. For future compatibility, you should +not use the original recordset object.

        + +

        Example 11: Smart Transactions

        + +

        The old way of doing transactions required you to use

        + +
        $conn->BeginTrans();
        +$ok = $conn->Execute($sql);
        +if ($ok) $ok = $conn->Execute($sql2);
        +if (!$ok) $conn->RollbackTrans();
        +else $conn->CommitTrans();
        + +

        This is very complicated for large projects because you have +to track the error status. Smart Transactions is much simpler. You start a +smart transaction by calling StartTrans():

        + +
        $conn->StartTrans();
        +$conn->Execute($sql);
        +$conn->Execute($Sql2);
        +$conn->CompleteTrans();
        + +

        CompleteTrans() detects when an SQL error occurs, and will +Rollback/Commit as appropriate. To specificly force a rollback even if no error +occured, use FailTrans(). Note that the rollback is done in CompleteTrans(), +and not in FailTrans().

        + +
        $conn->StartTrans();
        +$conn->Execute($sql);
        +if (!CheckRecords()) $conn->FailTrans();
        +$conn->Execute($Sql2);
        +$conn->CompleteTrans();
        + +

        You can also check if a transaction has failed, using HasFailedTrans(), +which returns true if FailTrans() was called, or there was an error in the SQL +execution. Make sure you call HasFailedTrans() before you call CompleteTrans(), +as it is only works between StartTrans/CompleteTrans.

        + +

        Lastly, StartTrans/CompleteTrans is nestable, and only the outermost block +is executed. In contrast, BeginTrans/CommitTrans/RollbackTrans is NOT nestable. +

        + +
        $conn->StartTrans();
        +$conn->Execute($sql);
        +  $conn->StartTrans();    # ignored
          if (!CheckRecords()) $conn->FailTrans();
          $conn->CompleteTrans(); # ignored
        $conn->Execute($Sql2);
        $conn->CompleteTrans();
        + +

        Note: Savepoints are currently not supported.

        + +

        Using Custom Error Handlers and PEAR_Error

        + +

        ADOdb supports PHP5 exceptions. Just include adodb-exceptions.inc.php +and you can now catch exceptions on errors as they occur.

        + +
                 include("../adodb-exceptions.inc.php"); 
        +         include("../adodb.inc.php");      
        +         try {
        +                 $db = NewADOConnection("oci8://scott:bad-password@mytns/");
        +         } catch (exception $e) {
        +                 var_dump($e);
        +                 adodb_backtrace($e->gettrace());
        +         }
        + +

        ADOdb also provides two custom handlers which you can modify for your needs. +The first one is in the adodb-errorhandler.inc.php file. This makes use +of the standard PHP functions error_reporting +to control what error messages types to display, and trigger_error which invokes the default +PHP error handler.

        + +

        Including the above file will cause trigger_error($errorstring,E_USER_ERROR) +to be called when
        +(a) Connect() or PConnect() fails, or
        +(b) a function that executes SQL statements such as Execute() or SelectLimit() +has an error.
        +(c) GenID() appears to go into an infinite loop.

        + +

        The $errorstring is generated by ADOdb and will contain useful debugging +information similar to the error.log data generated below. This file +adodb-errorhandler.inc.php should be included before you create any +ADOConnection objects.

        + +

        If you define error_reporting(0), no errors will be passed to the error +handler. If you set error_reporting(E_ALL), all errors will be passed to the +error handler. You still need to use ini_set("display_errors", +"0" or "1") to control the display of errors.

        + +
        <?php
        +error_reporting(E_ALL); # pass any error messages triggered to error handler
        +include('adodb-errorhandler.inc.php');
        include('adodb.inc.php');
        include('tohtml.inc.php');
        $c = NewADOConnection('mysql');
        $c->PConnect('localhost','root','','northwind');
        $rs=$c->Execute('select * from productsz'); #invalid table productsz');
        if ($rs) rs2html($rs);
        ?>
        + +

        If you want to log the error message, you can do so by defining the +following optional constants ADODB_ERROR_LOG_TYPE and ADODB_ERROR_LOG_DEST. +ADODB_ERROR_LOG_TYPE is the error log message type (see error_log in the PHP manual). In this case +we set it to 3, which means log to the file defined by the constant +ADODB_ERROR_LOG_DEST.

        + +
        <?php
        +error_reporting(E_ALL); # report all errors
        +ini_set("display_errors", "0"); # but do not echo the errors
        +define('ADODB_ERROR_LOG_TYPE',3);
        +define('ADODB_ERROR_LOG_DEST','C:/errors.log');
        +include('adodb-errorhandler.inc.php');
        include('adodb.inc.php');
        include('tohtml.inc.php');
         
        $c = NewADOConnection('mysql');
        $c->PConnect('localhost','root','','northwind');
        $rs=$c->Execute('select * from productsz'); ## invalid table productsz
        if ($rs) rs2html($rs);
        ?>
        + +

        The following message will be logged in the error.log file:

        + +
        (2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' doesn't exist] in
        + EXECUTE("select * from productsz")
        + +

        PEAR_ERROR

        + +

        The second error handler is adodb-errorpear.inc.php. +This will create a PEAR_Error derived object whenever an error occurs. The last +PEAR_Error object created can be retrieved using ADODB_Pear_Error().

        + +
        <?php
        +include('adodb-errorpear.inc.php');
        include('adodb.inc.php');
        include('tohtml.inc.php');
        $c = NewADOConnection('mysql');
        $c->PConnect('localhost','root','','northwind');
        $rs=$c->Execute('select * from productsz'); #invalid table productsz');
        if ($rs) rs2html($rs);
        else {
                 $e = ADODB_Pear_Error();
        +         echo '<p>',$e->message,'</p>';
        }
        ?>
        + +

        You can use a PEAR_Error derived class by defining the constant +ADODB_PEAR_ERROR_CLASS before the adodb-errorpear.inc.php file is included. For +easy debugging, you can set the default error handler in the beginning of the +PHP script to PEAR_ERROR_DIE, which will cause an error message to be printed, +then halt script execution:

        + +
        include('PEAR.php');
        +PEAR::setErrorHandling('PEAR_ERROR_DIE');
        + +

        Note that we do not explicitly return a PEAR_Error object to you when an +error occurs. We return false instead. You have to call ADODB_Pear_Error() to +get the last error or use the PEAR_ERROR_DIE technique.

        + +

        MetaError and MetaErrMsg

        + +

        If you need error messages that work across multiple databases, then use MetaError(), which returns a virtualized error number, +based on PEAR DB's error number system, and MetaErrMsg(). +

        + +

        Error Messages

        + +

        Error messages are outputted using the static method +ADOConnnection::outp($msg,$newline=true). By default, it sends the messages to +the client. You can override this to perform error-logging.

        + +

        Data Source Names

        + +

        We now support connecting using PEAR style DSN's. A DSN is a connection +string of the form:

        + +

        $dsn = "$driver://$username:$password@$hostname/$databasename";

        + +

        An example:

        + +
           $username = 'root';
        +   $password = '';
        +   $hostname = 'localhost';
        +   $databasename = 'xphplens';
        +   $driver = 'mysql';
        +   $dsn = "$driver://$username:$password@$hostname/$databasename"
        +   $db = NewADOConnection();
        +   # DB::Connect($dsn) also works if you include 'adodb/adodb-pear.inc.php' at the top
        +   $rs = $db->query('select firstname,lastname from adoxyz');
        +   $cnt = 0;
        +   while ($arr = $rs->fetchRow()) {
        +                 print_r($arr); print "<br>";
        +   }
        + +

        More info and connection examples on the DSN +format.

        + +

        PEAR Compatibility

        + +

        We support DSN's (see above), and the following functions:

        + +
         DB_Common
                 query - returns PEAR_Error on error
                 limitQuery - return PEAR_Error on error
                 prepare - does not return PEAR_Error on error
                 execute - does not return PEAR_Error on error
                 setFetchMode - supports ASSOC and ORDERED
                 errorNative
                 quote
                 nextID
                 disconnect
                 
                 getOne
                 getAssoc
                 getRow
                 getCol
                 
         DB_Result
                 numRows - returns -1 if not supported
                 numCols
                 fetchInto - does not support passing of fetchmode
                 fetchRows - does not support passing of fetchmode
                 free
        + +

        Caching of Recordsets

        + +

        ADOdb now supports caching of recordsets in the file system using the +CacheExecute( ), CachePageExecute( ) and CacheSelectLimit( ) functions. There +are similar to the non-cache functions, except that they take a new first +parameter, $secs2cache.

        + +

        An example:

        + +
        include('adodb.inc.php'); # load code common to ADOdb
        +$ADODB_CACHE_DIR = '/usr/ADODB_cache';
        +$conn = &ADONewConnection('mysql');  # create a connection
        +$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
        +$sql = 'select CustomerName, CustomerID from customers';
        +$rs = $conn->CacheExecute(15,$sql);
        + +

        The first parameter is the number of seconds to cache the query. Subsequent +calls to that query will used the cached version stored in $ADODB_CACHE_DIR. To +force a query to execute and flush the cache, call CacheExecute() with the +first parameter set to zero. Alternatively, use the CacheFlush($sql) call.

        + +

        For the sake of security, we recommend you set register_globals=off in +php.ini if you are using $ADODB_CACHE_DIR.

        + +

        In ADOdb 1.80 onwards, the secs2cache parameter is optional in +CacheSelectLimit() and CacheExecute(). If you leave it out, it will use the +$connection->cacheSecs parameter, which defaults to 60 minutes. The following +are equivalent:

        + +
         
          # (1)
          $rs = $db->SelectLimit(30, 'select * from table', 10);
          
          # (2)
          $db->cacheSsecs = 30;
          $rs = $db->SelectLimit('select * from table', 10);
          
                 $conn->Connect(...);
        +         $conn->cacheSecs = 3600*24; # cache 24 hours
        +         $rs = $conn->CacheExecute('select * from table');
        + +

        Please note that magic_quotes_runtime should be turned off. Do not change +$ADODB_FETCH_MODE (or SetFetchMode) as the cached recordset will use the +$ADODB_FETCH_MODE set when the query was executed.

        + +

        MemCache support

        + +

        You can also share cached recordsets on +a memcache server. The memcache API supports one or more pooled hosts. Only if +none of the pooled servers can be contacted will a connect error be generated. +Example below:

        + +
         
        $db = NewADOConnection($driver='mysql');
        $db->memCache = true;
        $db->memCacheHost = array($ip1, $ip2, $ip3); /// $db->memCacheHost = $ip1; will work too
        $db->memCachePort = 11211; /// this is default memCache port
        $db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
         
        $db->Connect(...);
        $db->CacheExecute($sql);
        + +

        More info on memcache can be found at http://www.danga.com/memcached/.

        + +

        Caching API

        + +

        There is also a caching API since +4.99/5.05. Two implementations of the API are already available providing file +and memcache support.

        + +

        The new API for creating your custom +caching class uses 2 globals:

        + +
          +
        • $ADODB_CACHE_CLASS: name of caching class
        • +
        • $ADODB_CACHE: instance of $ADODB_CACHE_CLASS
        • +
        + +
         
        include "/path/to/adodb.inc.php";
        $ADODB_CACHE_CLASS = 'MyCacheClass';
         
        class MyCacheClass extends ADODB_Cache_File
        {
                 var $createdir = false; // do not set this to true unless you use temp directories in cache path
                 function writecache($filename, $contents,$debug=false){...}
                 function &readcache($filename, &$err, $secs2cache, $rsClass){ ...}
                  :
        }
         
        $DB = NewADOConnection($driver);
        $DB->Connect(...);  ## MyCacheClass created here and stored in $ADODB_CACHE global variable.
         
        $data = $rs->CacheGetOne($sql); ## MyCacheClass is used here for caching...
        + + + +

        Pivot Tables

        + +

        Since ADOdb 2.30, we support the generation of SQL to create pivot tables, +also known as cross-tabulations. For further explanation read this DevShed Cross-Tabulation tutorial. +We assume that your database supports the SQL case-when expression.

        + +

        In this example, we will use the Northwind database from Microsoft. In the +database, we have a products table, and we want to analyze this table by suppliers +versus product categories. We will place the suppliers on each row, and +pivot on categories. So from the table on the left, we generate the pivot-table +on the right:

        + +
        + + + + + + + +
        +
        + + + + + + + + + + + + + + + + + +
        +

        Supplier

        +
        +

        Category

        +
        +

        supplier1

        +
        +

        category1

        +
        +

        supplier2

        +
        +

        category1

        +
        +

        supplier2

        +
        +

        category2

        +
        +
        +

        +
        +

        -->

        +
        +
        + + + + + + + + + + + + + + + + + + + +
        +

         

        +
        +

        category1

        +
        +

        category2

        +
        +

        total

        +
        +

        supplier1

        +
        +

        1

        +
        +

        0

        +
        +

        1

        +
        +

        supplier2

        +
        +

        1

        +
        +

        1

        +
        +

        2

        +
        +
        +

        +
        + +
        + +

        The following code will generate the SQL for a cross-tabulation:

        + +
        # Query the main "product" table
        +# Set the rows to SupplierName
        +# and the columns to the values of Categories
        +# and define the joins to link to lookup tables
        +# "categories" and "suppliers"
        +#
        + include "adodb/pivottable.inc.php";
        + $sql = PivotTableSQL(
        +         $gDB,                                      # adodb connection
        +         'products p ,categories c ,suppliers s',   # tables
        +         'SupplierName',                             # rows (multiple fields allowed)
        +         'CategoryName',                            # column to pivot on
        +         'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
        +);
        + +

        This will generate the following SQL:

        + +

        SELECT SupplierName,
        +SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS +"Beverages",
        +SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS +"Condiments",
        +SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS +"Confections",
        +SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS +"Dairy Products",
        +SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS +"Grains/Cereals",
        +SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS +"Meat/Poultry",
        +SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS +"Produce",
        +SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS +"Seafood",
        +SUM(1) as Total
        +FROM products p ,categories c ,suppliers s WHERE p.CategoryID = +c.CategoryID and s.SupplierID= p.SupplierID
        +GROUP BY SupplierName

        + +

        You can also pivot on numerical columns and generate totals by +using ranges. This code was revised in ADODB 2.41 and is not backward +compatible. The second example shows this:

        + +
         $sql = PivotTableSQL(
        +         $gDB,                                       # adodb connection
        +         'products p ,categories c ,suppliers s',    # tables
        +         'SupplierName',                              # rows (multiple fields allowed)
           array(                                       # column ranges
                 ' 0 '      => 'UnitsInStock <= 0',
                 "1 to 5"   => '0 < UnitsInStock and UnitsInStock <= 5',
                 "6 to 10"  => '5 < UnitsInStock and UnitsInStock <= 10',
                 "11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',
                 "16+"      => '15 < UnitsInStock'
                 ),
                 ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
                 'UnitsInStock',                             # sum this field
                 'Sum '                                      # sum label prefix
        );
        + +

        Which generates:

        + +

        SELECT SupplierName,
        +SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS +"Sum 0 ",
        +SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN +UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
        +SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock +ELSE 0 END) AS "Sum 6 to 10",
        +SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN +UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
        +SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS +"Sum 16+",
        +SUM(UnitsInStock) AS "Sum UnitsInStock",
        +SUM(1) as Total,
        +FROM products p ,categories c ,suppliers s WHERE p.CategoryID = +c.CategoryID and s.SupplierID= p.SupplierID
        +GROUP BY SupplierName

        + +
        + +
        + +
        + +

        Class Reference

        + +

        Function parameters with [ ] around them are optional.

        + +

        Global Variables

        + +

        $ADODB_COUNTRECS

        + +

        If the database driver API does not support counting the number of records +returned in a SELECT statement, the function RecordCount() is emulated when the +global variable $ADODB_COUNTRECS is set to true, which is the default. We +emulate this by buffering the records, which can take up large amounts of +memory for big recordsets. Set this variable to false for the best performance. +This variable is checked every time a query is executed, so you can selectively +choose which recordsets to count.

        + +

        $ADODB_CACHE_DIR

        + +

        If you are using recordset caching, this is the directory to save your +recordsets in. Define this before you call any caching functions such as +CacheExecute( ). We recommend setting register_globals=off in php.ini if +you use this feature for security reasons.

        + +

        If you are using Unix and apache, you might need to set your cache directory +permissions to something similar to the following:

        + +

        chown -R apache /path/to/adodb/cache
        +chgrp -R apache /path/to/adodb/cache

        + +

        $ADODB_ANSI_PADDING_OFF

        + +

        Determines whether to right trim CHAR fields (and also VARCHAR for +ibase/firebird). Set to true to trim. Default is false. Currently works for +oci8po, ibase and firebird drivers. Added in ADOdb 4.01.

        + +

        $ADODB_LANG

        + +

        Determines the language used in MetaErrorMsg(). The default is 'en', for +English. To find out what languages are supported, see the files in +adodb/lang/adodb-$lang.inc.php, where $lang is the supported langauge.

        + +

        $ADODB_FETCH_MODE

        + +

        This is a global variable that determines how arrays are retrieved by recordsets. +The recordset saves this value on creation (eg. in Execute( ) or SelectLimit( +)), and any subsequent changes to $ADODB_FETCH_MODE have no affect on existing +recordsets, only on recordsets created in the future.

        + +

        The following constants are defined:

        + +

        define('ADODB_FETCH_DEFAULT',0);
        +define('ADODB_FETCH_NUM',1);
        +define('ADODB_FETCH_ASSOC',2);
        +define('ADODB_FETCH_BOTH',3);

        + +

        An example:

        + +
                 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +         $rs1 = $db->Execute('select * from table');
        +         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
        +         $rs2 = $db->Execute('select * from table');
        +         print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1')
                 print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')
        + +

        As you can see in the above example, both recordsets store and use different +fetch modes based on the $ADODB_FETCH_MODE setting when the recordset was +created by Execute().

        + +

        If no fetch mode is predefined, the fetch mode defaults to +ADODB_FETCH_DEFAULT. The behaviour of this default mode varies from driver to +driver, so do not rely on ADODB_FETCH_DEFAULT. For portability, we recommend +sticking to ADODB_FETCH_NUM or ADODB_FETCH_ASSOC. Many drivers do not support +ADODB_FETCH_BOTH.

        + +

        SetFetchMode Function

        + +

        If you have multiple connection objects, and want to have different fetch +modes for each connection, then use SetFetchMode. +Once this function is called for a connection object, that connection object +will ignore the global variable $ADODB_FETCH_MODE and will use the internal +fetchMode property exclusively.

        + +
                 $db->SetFetchMode(ADODB_FETCH_NUM);
        +         $rs1 = $db->Execute('select * from table');
        +         $db->SetFetchMode(ADODB_FETCH_ASSOC);
        +         $rs2 = $db->Execute('select * from table');
        +         print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1')
                 print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')
        + +

        To retrieve the previous fetch mode, you can use check the $db->fetchMode +property, or use the return value of SetFetchMode( ).

        + +

        ADODB_ASSOC_CASE

        + +

        You can control the associative fetch case for certain drivers which behave +differently. For the sybase, oci8po, mssql, odbc and ibase drivers and all +drivers derived from them, ADODB_ASSOC_CASE will by default generate recordsets +where the field name keys are lower-cased. Use the constant ADODB_ASSOC_CASE to +change the case of the keys. There are 3 possible values:

        + +

        0 = assoc lowercase field names. $rs->fields['orderid']
        +1 = assoc uppercase field names. $rs->fields['ORDERID']
        +2 = use native-case field names. $rs->fields['OrderID'] -- this is the +default since ADOdb 2.90

        + +

        To use it, declare it before you incldue adodb.inc.php.

        + +

        define('ADODB_ASSOC_CASE', 2); # use native-case for ADODB_FETCH_ASSOC
        +include('adodb.inc.php');

        + +

        $ADODB_FORCE_TYPE

        + +

        See the GetUpdateSQL tutorial.

        + +

        $ADODB_QUOTE_FIELDNAMES

        + +

        Auto-quotes field names when using AutoExecute() when set to true.

        + +

         

        + +
        + +
        + +
        + +

        ADOConnection

        + +

        Object that performs the connection to the database, executes SQL statements +and has a set of utility functions for standardising the format of SQL +statements for issues such as concatenation and date formats.

        + +

        ADOConnection Fields

        + +

        databaseType: Name of the database system we are connecting to. Eg. odbc +or mssql or mysql.

        + +

        dataProvider: The underlying mechanism used to connect to the +database. Normally set to native, unless using odbc or ado.

        + +

        host: Name of server or data source name (DSN) to connect to.

        + +

        database: Name of the database or to connect to. If ado is used, it +will hold the ado data provider.

        + +

        user: Login id to connect to database. Password is not saved for +security reasons.

        + +

        raiseErrorFn: Allows you to define an error handling function. See +adodb-errorhandler.inc.php for an example.

        + +

        debug: Set to true to make debug statements to appear.

        + +

        concat_operator: Set to '+' or '||' normally. The operator used to +concatenate strings in SQL. Used by the Concat +function.

        + +

        fmtDate: The format used by the DBDate +function to send dates to the database. is '#Y-m-d#' for Microsoft Access, and +''Y-m-d'' for MySQL.

        + +

        fmtTimeStamp: The format used by the DBTimeStamp +function to send timestamps to the database.

        + +

        true: The value used to represent true.Eg. '.T.'. for Foxpro, '1' for +Microsoft SQL.

        + +

        false: The value used to represent false. Eg. '.F.'. for Foxpro, '0' +for Microsoft SQL.

        + +

        replaceQuote: The string used to escape quotes. Eg. double +single-quotes for Microsoft SQL, and backslash-quote for MySQL. Used by qstr.

        + +

        autoCommit: indicates whether automatic commit is enabled. Default is +true.

        + +

        charSet: set the default charset to use. Currently only +interbase/firebird supports this.

        + +

        dialect: set the default sql dialect to use. Currently only interbase/firebird +supports this.

        + +

        role: set the role. Currently only interbase/firebird supports this.

        + +

        metaTablesSQL: SQL statement to return a list of available tables. +Eg. SHOW TABLES in MySQL.

        + +

        genID: The latest id generated by GenID() if supported by the +database.

        + +

        cacheSecs: The number of seconds to cache recordsets if +CacheExecute() or CacheSelectLimit() omit the $secs2cache parameter. Defaults +to 60 minutes.

        + +

        sysDate: String that holds the name of the database function to call +to get the current date. Useful for inserts and updates.

        + +

        sysTimeStamp: String that holds the name of the database function to +call to get the current timestamp/datetime value.

        + +

        leftOuter: String that holds operator for left outer join, if known. +Otherwise set to false.

        + +

        rightOuter: String that holds operator for left outer join, if known. +Otherwise set to false.

        + +

        ansiOuter: Boolean that if true indicates that ANSI style outer joins +are permitted. Eg. select * from table1 left join table2 on p1=p2.

        + +

        connectSID: Boolean that indicates whether to treat the $database +parameter in connects as the SID for the oci8 driver. Defaults to false. Useful +for Oracle 8.0.5 and earlier.

        + +

        autoRollback: Persistent connections are auto-rollbacked in PConnect( +) if this is set to true. Default is false.

        + +
        + +
        + +
        + +

        ADOConnection Main Functions

        + +

        ADOConnection( )

        + +

        Constructor function. Do not call this directly. Use ADONewConnection( ) +instead.

        + +

        Connect($host,[$user],[$password],[$database])

        + +

        Non-persistent connect to data source or server $host, using userid $user +and password $password. If the server supports multiple databases, +connect to database $database.

        + +

        Returns true/false depending on connection success. Since 4.23, null is +returned if the extension is not loaded.

        + +

        ADO Note: If +you are using a Microsoft ADO and not OLEDB, you can set the $database +parameter to the OLEDB data provider you are using.

        + +

        PostgreSQL: An alternative way of connecting to the database is to pass the +standard PostgreSQL connection string in the first parameter $host, and the +other parameters will be ignored.

        + +

        For Oracle and Oci8, there are two ways to connect. First is to use the TNS +name defined in your local tnsnames.ora (or ONAMES or HOSTNAMES). Place the +name in the $database field, and set the $host field to false. Alternatively, +set $host to the server, and $database to the database SID, this bypassed +tnsnames.ora.

        + +

        Examples:

        + +
         # $oraname in tnsnames.ora/ONAMES/HOSTNAMES
        + $conn->Connect(false, 'scott', 'tiger', $oraname);
        + $conn->Connect('server:1521', 'scott', 'tiger', 'ServiceName'); # bypass tnsnames.ora
        + +

        There are many examples of connecting to a database. See Connection Examples for many examples.

        + +

        PConnect($host,[$user],[$password],[$database])

        + +

        Persistent connect to data source or server $host, using userid $user +and password $password. If the server supports multiple databases, +connect to database $database.

        + +

        We now perform a rollback on persistent connection for selected databases +since 2.21, as advised in the PHP manual. See change log or source code for +which databases are affected.

        + +

        Returns true/false depending on connection. Since 4.23, 0 is returned if the +extension is not loaded. See Connect( ) above for more info.

        + +

        Since ADOdb 2.21, we also support autoRollback. If you set:

        + +
         $conn = &NewADOConnection('mysql');
        + $conn->autoRollback = true; # default is false
        + $conn->PConnect(...); # rollback here
        + +

        Then when doing a persistent connection with PConnect( ), ADOdb will perform +a rollback first. This is because it is documented that PHP is not guaranteed +to rollback existing failed transactions when persistent connections are used. +This is implemented in Oracle, MySQL, PgSQL, MSSQL, ODBC currently.

        + +

        Since ADOdb 3.11, you can force non-persistent connections even if PConnect +is called by defining the constant ADODB_NEVER_PERSIST before you call +PConnect.

        + +

        Since 4.23, null is returned if the extension is not loaded.

        + +

        NConnect($host,[$user],[$password],[$database])

        + +

        Always force a new connection. In contrast, PHP sometimes reuses connections +when you use Connect() or PConnect(). Currently works only on mysql (PHP 4.3.0 +or later), postgresql and oci8-derived drivers. For other drivers, NConnect() +works like Connect().

        + +

        IsConnected( )

        + +

        Returns true if connected to database. Added in 4.53.

        + +

        Execute($sql,$inputarr=false)

        + +

        Execute SQL statement $sql and return derived class of ADORecordSet +if successful. Note that a record set is always returned on success, even if we +are executing an insert or update statement. You can also pass in $sql a +statement prepared in Prepare().

        + +

        Returns derived class of ADORecordSet. Eg. if connecting via mysql, then +ADORecordSet_mysql would be returned. False is returned if there was an error +in executing the sql.

        + +

        The $inputarr parameter can be used for binding variables to parameters. +Below is an Oracle example:

        + +
         $conn->Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=> $val));
        + 
        + +

        Another example, using ODBC,which uses the ? convention:

        + +
          $conn->Execute("SELECT * FROM TABLE WHERE COND=?", array($val));
        + +

        Binding variables

        + +

        Variable binding speeds the compilation and caching of SQL statements, +leading to higher performance. Currently Oracle, Interbase and ODBC supports +variable binding. Interbase/ODBC style ? binding is emulated in databases that +do not support binding. Note that you do not have to quote strings if you use +binding.

        + +

        Variable binding in the odbc, interbase and oci8po drivers.

        + +
        $rs = $db->Execute('select * from table where val=?', array('10'));
        + +

        Variable binding in the oci8 driver:

        + +
        $rs = $db->Execute('select name from table where val=:key', 
        +  array('key' => 10));
        + +

        Bulk binding

        + +

        Since ADOdb 3.80, we support bulk binding in Execute(), in which you pass in +a 2-dimensional array to be bound to an INSERT/UPDATE or DELETE statement.

        + +
        $arr = array(
        +         array('Ahmad',32),
        +         array('Zulkifli', 24),
        +         array('Rosnah', 21)
        +         );
        +$ok = $db->Execute('insert into table (name,age) values (?,?)',$arr);
        + +

        This provides very high performance as the SQL statement is prepared first. +The prepared statement is executed repeatedly for each array row until all rows +are completed, or until the first error. Very useful for importing data.

        + +

        CacheExecute([$secs2cache,]$sql,$inputarr=false)

        + +

        Similar to Execute, except that the recordset is cached for $secs2cache +seconds in the $ADODB_CACHE_DIR directory, and $inputarr only accepts +1-dimensional arrays. If CacheExecute() is called again with the same $sql, +$inputarr, and also the same database, same userid, and the cached recordset +has not expired, the cached recordset is returned.

        + +
          include('adodb.inc.php'); 
        +  include('tohtml.inc.php');
        +  $ADODB_CACHE_DIR = '/usr/local/ADOdbcache';
        +  $conn = &ADONewConnection('mysql');
        +  $conn->PConnect('localhost','userid','password','database');
        +  $rs = $conn->CacheExecute(15, 'select * from table'); # cache 15 secs
        +  rs2html($rs); /* recordset to html table */ 
        + +

        Alternatively, since ADOdb 1.80, the $secs2cache parameter is optional:

        + +
                 $conn->Connect(...);
        +         $conn->cacheSecs = 3600*24; // cache 24 hours
        +         $rs = $conn->CacheExecute('select * from table');
        + +

        If $secs2cache is omitted, we use the value in +$connection->cacheSecs (default is 3600 seconds, or 1 hour). Use +CacheExecute() only with SELECT statements.

        + +

        Performance note: I have done some benchmarks and found that they vary so +greatly that it's better to talk about when caching is of benefit. When your +database server is much slower than your Web server or the database is very +overloaded then ADOdb's caching is good because it reduces the load on your +database server. If your database server is lightly loaded or much faster than +your Web server, then caching could actually reduce performance.

        + +

        ExecuteCursor($sql,$cursorName='rs',$parameters=false)

        + +

        Execute an Oracle stored procedure, and returns an Oracle REF cursor +variable as a regular ADOdb recordset. Does not work with any other database +except oci8. Thanks to Robert Tuttle for the design.

        + +
            $db = ADONewConnection("oci8"); 
        +    $db->Connect("foo.com:1521", "uid", "pwd", "FOO");
        +    $rs = $db->ExecuteCursor("begin :cursorvar := getdata(:param1); end;",
        +                                            'cursorvar',
        +                                            array('param1'=>10));
        +    # $rs is now just like any other ADOdb recordset object
        +    rs2html($rs);
        + +

        ExecuteCursor() is a helper function that does the following internally:

        + +
                 $stmt = $db->Prepare("begin :cursorvar := getdata(:param1); end;", true); 
        +         $db->Parameter($stmt, $cur, 'cursorvar', false, -1, OCI_B_CURSOR);
        +         $rs = $db->Execute($stmt,$bindarr);
        + +

        ExecuteCursor only accepts 1 out parameter. So if you have 2 out parameters, +use:

        + +
                 $vv = 'A%';
        +         $stmt = $db->PrepareSP("BEGIN list_tabs(:crsr,:tt); END;");
        +         $db->OutParameter($stmt, $cur, 'crsr', -1, OCI_B_CURSOR);
        +         $db->OutParameter($stmt, $vv, 'tt', 32); # return varchar(32)
        +         $arr = $db->GetArray($stmt);
        +         print_r($arr);
        +         echo " val = $vv"; ## outputs 'TEST'
        + +

        for the following PL/SQL:

        + +
                 TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
        +
        +         PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS
        +         BEGIN
        +                 OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
        +                 tablenames := 'TEST';
        +         END list_tabs;
        + +

        SelectLimit($sql,$numrows=-1,$offset=-1,$inputarr=false)

        + +

        Returns a recordset if successful. Returns false otherwise. Performs a +select statement, simulating PostgreSQL's SELECT statement, LIMIT $numrows +OFFSET $offset clause.

        + +

        In PostgreSQL, SELECT * FROM TABLE LIMIT 3 will return the first 3 records +only. The equivalent is $connection->SelectLimit('SELECT +* FROM TABLE',3). This functionality is simulated for databases +that do not possess this feature.

        + +

        And SELECT * FROM TABLE LIMIT 3 OFFSET 2 will return records 3, 4 and 5 (eg. +after record 2, return 3 rows). The equivalent in ADOdb is $connection->SelectLimit('SELECT * FROM TABLE',3,2).

        + +

        Note that this is the opposite of MySQL's LIMIT clause. You can also +set $connection->SelectLimit('SELECT * +FROM TABLE',-1,10) to get rows 11 to the last row.

        + +

        The last parameter $inputarr is for databases that support variable binding +such as Oracle oci8. This substantially reduces SQL compilation overhead. Below +is an Oracle example:

        + +
         $conn->SelectLimit("SELECT * FROM TABLE WHERE COND=:val", 100,-1,array('val'=> $val));
        + 
        + +

        The oci8po driver (oracle portable driver) uses the more standard bind +variable of ?:

        + +
         $conn->SelectLimit("SELECT * FROM TABLE WHERE COND=?", 100,-1,array('val'=> $val));
        + +

        Ron Wilson reports that SelectLimit does not work with UNIONs.

        + +

        CacheSelectLimit([$secs2cache,] $sql, +$numrows=-1,$offset=-1,$inputarr=false)

        + +

        Similar to SelectLimit, except that the recordset returned is cached for +$secs2cache seconds in the $ADODB_CACHE_DIR directory.

        + +

        Since 1.80, $secs2cache has been optional, and you can define the caching +time in $connection->cacheSecs.

        + +
                 $conn->Connect(...);
        +   $conn->cacheSecs = 3600*24; // cache 24 hours
        +         $rs = $conn->CacheSelectLimit('select * from table',10);
        + +

        CacheFlush($sql=false,$inputarr=false)

        + +

        Flush (delete) any cached recordsets for the SQL statement $sql in +$ADODB_CACHE_DIR.

        + +

        If no parameter is passed in, then all adodb_*.cache files are deleted.

        + +

        CacheSelectLimit() rewrites the SQL query, so you won't be able to pass the +SQL to CacheFlush. In this case, to flush the cached SQL recordset returned by +CacheSelectLimit(), set $secs2cache to -1:

        + +
         
                 $db->CacheSelectLimit(-1, $sql, $nrows);
        + +

        If you want to flush all cached recordsets manually, execute the following +PHP code (works only under Unix):
        +  system("rm -f `find +".$ADODB_CACHE_DIR." -name adodb_*.cache`");

        + +

        For general cleanup of all expired files, you should use crontab on Unix, +or at.exe on Windows, and a shell script similar to the following:
        +#------------------------------------------------------
        +# This particular example deletes files in the TMPPATH
        +# directory with the string ".cache" in their name that
        +# are more than 7 days old.
        +#------------------------------------------------------
        +AGED=7
        +find ${TMPPATH} -mtime +$AGED | grep "\.cache" | xargs rm -f

        + +

        MetaError($errno=false)

        + +

        Returns a virtualized error number, based on PEAR DB's error number system. +You might need to include adodb-error.inc.php before you call this function. +The parameter $errno is the native error number you want to convert. If you do +not pass any parameter, MetaError will call ErrorNo() for you and convert it. +If the error number cannot be virtualized, MetaError will return -1 (DB_ERROR).

        + +

        MetaErrorMsg($errno)

        + +

        Pass the error number returned by MetaError() for the equivalent textual +error message.

        + +

        ErrorMsg()

        + +

        Returns the last status or error message. The error message is reset after +every call to Execute().

        + +

        This can return a string even if no error occurs. In general you do not need +to call this function unless an ADOdb function returns false on an error.

        + +

        Note: If debug is enabled, the SQL error message is always displayed +when the Execute function is called.

        + +

        ErrorNo()

        + +

        Returns the last error number. The error number is reset after every call to +Execute(). If 0 is returned, no error occurred.

        + +

        Note that old versions of PHP (pre 4.0.6) do not support error number for +ODBC. In general you do not need to call this function unless an ADOdb function +returns false on an error.

        + +

        IgnoreErrors($saveErrHandlers)

        + +

        Allows you to ignore errors so that StartTrans()/CompleteTrans() is not +affected, nor is the default error handler called if an error occurs. Useful +when you want to check if a field or table exists in a database without +invoking an error if it does not exist.

        + +

        Usage:

        + +
         
        $saveErrHandlers = $conn->IgnoreErrors();
        $rs = $conn->Execute("select field from some_table_that_might_not_exist");
        $conn->IgnoreErrors($saveErrHandlers);
        + +

        Warning: do not call StartTrans()/CompleteTrans() inside a code block that +is using IgnoreErrors().

        + +

        SetFetchMode($mode)

        + +

        Sets the current fetch mode for the connection and stores it in +$db->fetchMode. Legal modes are ADODB_FETCH_ASSOC and ADODB_FETCH_NUM. For +more info, see $ADODB_FETCH_MODE.

        + +

        Returns the previous fetch mode, which could be false if SetFetchMode( ) has +not been called before.

        + +

        CreateSequence($seqName = 'adodbseq',$startID=1)

        + +

        Create a sequence. The next time GenID( ) is called, the value returned will +be $startID. Added in 2.60.

        + +

        DropSequence($seqName = 'adodbseq')

        + +

        Delete a sequence. Added in 2.60.

        + +

        GenID($seqName = 'adodbseq',$startID=1)

        + +

        Generate a sequence number . Works for interbase, mysql, postgresql, oci8, +oci8po, mssql, ODBC based (access,vfp,db2,etc) drivers currently. Uses $seqName +as the name of the sequence. GenID() will automatically create the sequence for +you if it does not exist (provided the userid has permission to do so). +Otherwise you will have to create the sequence yourself.

        + +

        If your database driver emulates sequences, the name of the table is the +sequence name. The table has one column, "id" which should be of type +integer, or if you need something larger - numeric(16).

        + +

        For ODBC and databases that do not support sequences natively (eg mssql, +mysql), we create a table for each sequence. If the sequence has not been +defined earlier, it is created with the starting value set in $startID.

        + +

        Note that the mssql driver's GenID() before 1.90 used to generate 16 byte +GUID's.

        + +

        UpdateBlob($table,$column,$val,$where)

        + +

        Allows you to store a blob (in $val) into $table into +$column in a row at $where.

        + +

        Usage:

        + +
                 # for oracle
        +         $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())');
        +         $conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
        +        
        +         # non oracle databases
        +         $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
        +         $conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
        + +

        Returns true if succesful, false otherwise. Supported by MySQL, PostgreSQL, +Oci8, Oci8po and Interbase drivers. Other drivers might work, depending on the +state of development.

        + +

        Note that when an Interbase blob is retrieved using SELECT, it still needs +to be decoded using $connection->DecodeBlob($blob); to derive the original +value in versions of PHP before 4.1.0.

        + +

        For PostgreSQL, you can store your blob using blob oid's or as a bytea field. +You can use bytea fields but not blob oid's currently with UpdateBlob( ). +Conversely UpdateBlobFile( ) supports oid's, but not bytea data.
        +
        +If you do not pass in an oid, then UpdateBlob() assumes that you are storing in +bytea fields.

        + +

        If you do not have any blob fields, you can improve you can improve general +SQL query performance by disabling blob handling with +$connection->disableBlobs = true.

        + +

        UpdateClob($table,$column,$val,$where)

        + +

        Allows you to store a clob (in $val) into $table into +$column in a row at $where. Similar to UpdateBlob (see above), but for +Character Large OBjects.

        + +

        Usage:

        + +
                 # for oracle
        +         $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())');
        +         $conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');
        +        
        +         # non oracle databases
        +         $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');
        +         $conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');
        + +

        UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')

        + +

        Similar to UpdateBlob, except that we pass in a file path to where the blob +resides.

        + +

        For PostgreSQL, if you are using blob oid's, use this interface. This +interface does not support bytea fields.

        + +

        Returns true if successful, false otherwise.

        + +

        BlobEncode($blob)

        + +

        Some databases require blob's to be encoded manually before upload. Note if +you use UpdateBlob( ) or UpdateBlobFile( ) the conversion is done automatically +for you and you do not have to call this function. For PostgreSQL, currently, +BlobEncode() can only be used for bytea fields.

        + +

        Returns the encoded blob value.

        + +

        Note that there is a connection property called blobEncodeType +which has 3 legal values:

        + +

        false - no need to perform encoding or decoding.
        +'I' - blob encoding required, and returned encoded blob is a numeric value (no +need to quote).
        +'C' - blob encoding required, and returned encoded blob is a character value +(requires quoting).

        + +

        This is purely for documentation purposes, so that programs that accept +multiple database drivers know what is the right thing to do when processing +blobs.

        + +

        BlobDecode($blob, $maxblobsize = false) +

        + +

        Some databases require blob's to be decoded manually after doing a select +statement. If the database does not require decoding, then this function will +return the blob unchanged. Currently BlobDecode is only required for one +database, PostgreSQL, and only if you are using blob oid's (if you are using +bytea fields, we auto-decode for you). The default maxblobsize is set in +$connection->maxblobsize, which is set to 256K in adodb 4.54.

        + +

        In ADOdb 4.54 and later, the blob is the return value. In earlier versions, +the blob data is sent to stdout.

        + +
        $rs = $db->Execute("select bloboid from postgres_table where id=$key");
        +$blob = $db->BlobDecode( reset($rs->fields) );
        + +

        Replace($table, $arrFields, +$keyCols,$autoQuote=false)

        + +

        Try to update a record, and if the record is not found, an insert statement +is generated and executed. Returns 0 on failure, 1 if update statement worked, +2 if no record was found and the insert was executed successfully. This differs +from MySQL's replace which deletes the record and inserts a new record. This +also means you cannot update the primary key. The only exception to this is +Interbase and its derivitives, which uses delete and insert because of some +Interbase API limitations.

        + +

        The parameters are $table which is the table name, the $arrFields which is +an associative array where the keys are the field names, and $keyCols is the +name of the primary key, or an array of field names if it is a compound key. If +$autoQuote is set to true, then Replace() will quote all values that are +non-numeric; auto-quoting will not quote nulls. Note that auto-quoting will not +work if you use SQL functions or operators.

        + +

        Examples:

        + +
        # single field primary key
        +$ret = $db->Replace('atable',
        +         array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'),
        +         'id',$autoquote = true); 
        +# generates UPDATE atable SET firstname='Harun',lastname='Al-Rashid' WHERE id=1000
        +# or INSERT INTO atable (id,firstname,lastname) VALUES (1000,'Harun','Al-Rashid')
        +
        +# compound key
        +$ret = $db->Replace('atable2',
        +         array('firstname'=>'Harun','lastname'=>'Al-Rashid', 'age' => 33, 'birthday' => 'null'),
        +         array('lastname','firstname'),
        +         $autoquote = true);
        +
        +# no auto-quoting
        +$ret = $db->Replace('atable2',
        +         array('firstname'=>"'Harun'",'lastname'=>"'Al-Rashid'", 'age' => 'null'),
        +         array('lastname','firstname'));   
        + +

        AutoExecute($table, $arrFields, $mode, +$where=false, $forceUpdate=true,$magicq=false)

        + +

        Since ADOdb 4.56, you can automatically generate and execute INSERTs and +UPDATEs on a given table with this function, which is a wrapper for +GetInsertSQL() and GetUpdateSQL().

        + +

        AutoExecute() inserts or updates $table given an array of $arrFields, where +the keys are the field names and the array values are the field values to +store. Note that there is some overhead because the table is first queried to +extract key information before the SQL is generated. We generate an INSERT or +UPDATE based on $mode (see below).

        + +

        Legal values for $mode are

        + +
          +
        • 'INSERT' or 1 or DB_AUTOQUERY_INSERT +
        • +
        • 'UPDATE' or 2 or + DB_AUTOQUERY_UPDATE
        • +
        + +

        You have to define the constants DB_AUTOQUERY_UPDATE and DB_AUTOQUERY_INSERT +yourself or include adodb-pear.inc.php.

        + +

        The $where clause is required if $mode == 'UPDATE'. If $forceUpdate=false +then we will query the database first and check if the field value returned by +the query matches the current field value; only if they differ do we update +that field.

        + +

        Returns true on success, false on error.

        + +

        An example of its use is:

        + +
         
        $record["firstName"] = "Carol";
        $record["lasTname"] = "Smith"; 
        $conn->AutoExecute($table,$record,'INSERT');
        # executes "INSERT INTO $table (firstName,lasTname) values ('Carol',Smith')";
         
        $record["firstName"] = "Carol";
        $record["lasTname"] = "Jones"; 
        $conn->AutoExecute($table,$record,'UPDATE', "lastname like 'Sm%'");
        # executes "UPDATE $table SET firstName='Carol',lasTname='Jones' WHERE lastname like 'Sm%'";
        + +

        Note: One of the strengths of ADOdb's AutoExecute() is that only valid field +names for $table are updated. If $arrFields contains keys that are invalid +field names for $table, they are ignored. There is some overhead in doing this +as we have to query the database to get the field names, but given that you are +not directly coding the SQL yourself, you probably aren't interested in speed +at all, but convenience.

        + +

        Since 4.62, the table name to be used can be overridden by setting +$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called.

        + +

        Since 4.94, setting the global variable $ADODB_QUOTE_FIELDNAMES to true will +force field names to be auto-quoted in AutoExecute(), GetInsertSQL() and +GetUpdateSQL().

        + +

        GetUpdateSQL(&$rs, $arrFields, +$forceUpdate=false,$magicq=false, $force=null)

        + +

        Generate SQL to update a table given a recordset $rs, and the modified +fields of the array $arrFields (which must be an associative array holding the +column names and the new values) are compared with the current recordset. If +$forceUpdate is true, then we also generate the SQL even if $arrFields is +identical to $rs->fields. Requires the recordset to be associative. $magicq +is used to indicate whether magic quotes are enabled (see qstr()). The field +names in the array are case-insensitive.

        + +

        Since 4.52, we allow you to pass the $force type parameter, and this +overrides the $ADODB_FORCE_TYPE global +variable.

        + +

        Since 4.62, the table name to be used can be overridden by setting +$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called.

        + +

        GetInsertSQL(&$rs, $arrFields,$magicq=false,$force_type=false)

        + +

        Generate SQL to insert into a table given a recordset $rs. Requires the +query to be associative. $magicq is used to indicate whether magic quotes are +enabled (for qstr()). The field names in the array are case-insensitive.

        + +

        Since 2.42, you can pass a table name instead of a recordset into +GetInsertSQL (in $rs), and it will generate an insert statement for that table. +

        + +

        Since 4.52, we allow you to pass the $force_type parameter, and this +overrides the $ADODB_FORCE_TYPE global +variable.

        + +

        Since 4.62, the table name to be used can be overridden by setting +$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called.

        + +

        PageExecute($sql, $nrows, $page, $inputarr=false) +

        + +

        Used for pagination of recordset. $page is 1-based. See Example +8.

        + +

        CachePageExecute($secs2cache, $sql, $nrows, +$page, $inputarr=false)

        + +

        Used for pagination of recordset. $page is 1-based. See Example +8. Caching version of PageExecute.

        + +

        Close( )

        + +

        Close the database connection. PHP4 proudly states that we no longer have to +clean up at the end of the connection because the reference counting mechanism +of PHP4 will automatically clean up for us.

        + +

        StartTrans( )

        + +

        Start a monitored transaction. As SQL statements are executed, ADOdb will +monitor for SQL errors, and if any are detected, when CompleteTrans() is +called, we auto-rollback.

        + +

        To understand why StartTrans() is superior to BeginTrans(), let us examine a +few ways of using BeginTrans(). The following is the wrong way to use +transactions:

        + +
        $DB->BeginTrans();
        +$DB->Execute("update table1 set val=$val1 where id=$id");
        +$DB->Execute("update table2 set val=$val2 where id=$id");
        +$DB->CommitTrans();
        + +

        because you perform no error checking. It is possible to update table1 and +for the update on table2 to fail. Here is a better way:

        + +
        $DB->BeginTrans();
        +$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
        +if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");
        +if ($ok) $DB->CommitTrans();
        +else $DB->RollbackTrans();
        + +

        Another way is (since ADOdb 2.0):

        + +
        $DB->BeginTrans();
        +$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
        +if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");
        +$DB->CommitTrans($ok);
        + +

        Now it is a headache monitoring $ok all over the place. StartTrans() is an +improvement because it monitors all SQL errors for you. This is particularly +useful if you are calling black-box functions in which SQL queries might be +executed. Also all BeginTrans, CommitTrans and RollbackTrans calls inside a +StartTrans block will be disabled, so even if the black box function does a +commit, it will be ignored.

        + +
        $DB->StartTrans();
        +CallBlackBox();
        +$DB->Execute("update table1 set val=$val1 where id=$id");
        +$DB->Execute("update table2 set val=$val2 where id=$id");
        +$DB->CompleteTrans();
        + +

        Note that a StartTrans blocks are nestable, the inner blocks are ignored.

        + +

        CompleteTrans($autoComplete=true)

        + +

        Complete a transaction called with StartTrans(). This function monitors for +SQL errors, and will commit if no errors have occured, otherwise it will +rollback. Returns true on commit, false on rollback. If the parameter +$autoComplete is true monitor sql errors and commit and rollback as +appropriate. Set $autoComplete to false to force rollback even if no SQL error +detected.

        + +

        FailTrans( )

        + +

        Fail a transaction started with StartTrans(). The rollback will only occur +when CompleteTrans() is called.

        + +

        HasFailedTrans( )

        + +

        Check whether smart transaction has failed, eg. returns true if there was an +error in SQL execution or FailTrans() was called. If not within smart +transaction, returns false.

        + +

        BeginTrans( )

        + +

        Begin a transaction. Turns off autoCommit. Returns true if successful. Some +databases will always return false if transaction support is not available. Any +open transactions will be rolled back when the connection is closed. Among the +databases that support transactions are Oracle, PostgreSQL, Interbase, MSSQL, +certain versions of MySQL, DB2, Informix, Sybase, etc.

        + +

        Note that StartTrans() and CompleteTrans() is a +superior method of handling transactions, available since ADOdb 3.40. For a +explanation, see the StartTrans() documentation.

        + +

        You can also use the ADOdb error handler to die +and rollback your transactions for you transparently. Some buggy database +extensions are known to commit all outstanding tranasactions, so you might want +to explicitly do a $DB->RollbackTrans() in your error handler for safety.

        + +

        Detecting Transactions

        + +

        Since ADOdb 2.50, you are able to detect when you are inside a transaction. +Check that $connection->transCnt > 0. This variable is incremented whenever +BeginTrans() is called, and decremented whenever RollbackTrans() or +CommitTrans() is called.

        + +

        CommitTrans($ok=true)

        + +

        End a transaction successfully. Returns true if successful. If the database +does not support transactions, will return true also as data is always +committed.

        + +

        If you pass the parameter $ok=false, the data is rolled back. See example in +BeginTrans().

        + +

        RollbackTrans( )

        + +

        End a transaction, rollback all changes. Returns true if successful. If the +database does not support transactions, will return false as data is never +rollbacked.

        + +

        SetTransactionMode($mode )

        + +

        SetTransactionMode allows you to pass in the transaction mode to use for all +subsequent transactions. Note: if you have persistent connections and using +mssql or mysql, you might have to explicitly reset your transaction mode at the +beginning of each page request. This is only supported in postgresql, mssql, +mysql with InnoDB and oci8 currently. For example:

        + +
         
        $db->SetTransactionMode("SERIALIZABLE");
        $db->BeginTrans();
        $db->Execute(...); $db->Execute(...);
        $db->CommiTrans();
         
        $db->SetTransactionMode(""); // restore to default
        $db->StartTrans();
        $db->Execute(...); $db->Execute(...);
        $db->CompleteTrans();
        + +

        Supported values to pass in:

        + +
          +
        • READ UNCOMMITTED (allows + dirty reads, but fastest)
        • +
        • READ COMMITTED (default + postgres, mssql and oci8)
        • +
        • REPEATABLE READ (default + mysql)
        • +
        • SERIALIZABLE (slowest and + most restrictive)
        • +
        + +

        You can also pass in database specific values such as 'SNAPSHOT' for mssql +or 'READ ONLY' for oci8/postgres.

        + +

        See transaction levels for PostgreSQL, +Oracle, +MySQL, +and MS SQL Server. +

        + +

        GetAssoc($sql,$inputarr=false,$force_array=false,$first2cols=false)

        + +

        Returns an associative array for the given query $sql with optional bind +parameters in $inputarr. If the number of columns returned is greater to two, a +2-dimensional array is returned, with the first column of the recordset becomes +the keys to the rest of the rows. If the columns is equal to two, a 1-dimensional +array is created, where the the keys directly map to the values (unless +$force_array is set to true, when an array is created for each value).

        + +

        Examples:

        + +

        We have the following data in a recordset:

        + +

        row1: Apple, Fruit, Edible
        +row2: Cactus, Plant, Inedible
        +row3: Rose, Flower, Edible

        + +

        GetAssoc will generate the following 2-dimensional associative array:

        + +

        Apple => array[Fruit, Edible]
        +Cactus => array[Plant, Inedible]
        +Rose => array[Flower,Edible]

        + +

        If the dataset is:

        + +

        row1: Apple, Fruit
        +row2: Cactus, Plant
        +row3: Rose, Flower

        + +

        GetAssoc will generate the following 1-dimensional associative array (with +$force_array==false):

        + +

        Apple => Fruit
        +Cactus=>Plant
        +Rose=>Flower

        + +

        The function returns:

        + +

        The associative array, or false if an error occurs.

        + +

        CacheGetAssoc([$secs2cache,] $sql,$inputarr=false,$force_array=false,$first2cols=false)

        + +

        Caching version of GetAssoc function above.

        + +

        GetMedian($table, $field, $where='')

        + +

        Returns the median value of $field for $table. The $where clause is +optional. If used, make sure the WHERE is included, as in "WHERE name > +'A'". If an error occurs, false is returned. Since ADOdb 5.06 and PHP +4.991.

        + +

        GetOne($sql,$inputarr=false)

        + +

        Executes the SQL and returns the first field of the first row. The recordset +and remaining rows are discarded for you automatically. If an error occur, +false is returned; use ErrorNo() or ErrorMsg() to get the error details. Since +4.96/5.00, we return null if no records were found. And since 4.991/5.06, you +can have change the return value if no records are found using the global +variable $ADODB_GETONE_EOF: $ADODB_GETONE_EOF = false;

        + +

        GetRow($sql,$inputarr=false)

        + +

        Executes the SQL and returns the first row as an array. The recordset and +remaining rows are discarded for you automatically. If no records are returned, +an empty array is returned. If an error occurs, false is returned.

        + +

        GetAll($sql,$inputarr=false)

        + +

        Executes the SQL and returns the all the rows as a 2-dimensional array. The +recordset is discarded for you automatically. If an error occurs, false is +returned. GetArray is a synonym for GetAll.

        + +

        GetCol($sql,$inputarr=false,$trim=false)

        + +

        Executes the SQL and returns all elements of the first column as a +1-dimensional array. The recordset is discarded for you automatically. If an +error occurs, false is returned.

        + +

        CacheGetOne([$secs2cache,] $sql,$inputarr=false), +CacheGetRow([$secs2cache,] $sql,$inputarr=false), +CacheGetAll([$secs2cache,] $sql,$inputarr=false), +CacheGetCol([$secs2cache,] +$sql,$inputarr=false,$trim=false)

        + +

        Similar to above Get* functions, except that the recordset is serialized and +cached in the $ADODB_CACHE_DIR directory for $secs2cache seconds. Good for +speeding up queries on rarely changing data. Note that the $secs2cache +parameter is optional. If omitted, we use the value in +$connection->cacheSecs (default is 3600 seconds, or 1 hour).

        + +

        Prepare($sql )

        + +

        Prepares (compiles) an SQL query for repeated execution. Bind parameters are +denoted by ?, except for the oci8 driver, which uses the traditional Oracle +:varname convention.

        + +

        Returns an array containing the original sql statement in the first array +element; the remaining elements of the array are driver dependent. If there is +an error, or we are emulating Prepare( ), we return the original $sql string. +This is because all error-handling has been centralized in Execute( ).

        + +

        Prepare( ) cannot be used with functions that use SQL query rewriting +techniques, e.g. PageExecute( ) and SelectLimit( ).

        + +

        Example:

        + +
        $stmt = $DB->Prepare('insert into table (col1,col2) values (?,?)');
        +for ($i=0; $i < $max; $i++)
        +         $DB->Execute($stmt,array((string) rand(), $i));
        + +

        Also see InParameter(), OutParameter() and PrepareSP() below. Only supported +internally by interbase, oci8 and selected ODBC-based drivers, otherwise it is +emulated. There is no performance advantage to using Prepare() with emulation.

        + +

        Important: Due to limitations or bugs in PHP, if you are getting errors when +you using prepared queries, try setting $ADODB_COUNTRECS = false before +preparing. This behaviour has been observed with ODBC.

        + +

        IfNull($field, $nullReplacementValue)

        + +

        Portable IFNULL function (NVL in Oracle). Returns a string that represents +the function that checks whether a $field is null for the given database, and +if null, change the value returned to $nullReplacementValue. Eg.

        + +
        $sql = 'SELECT '.$db->IfNull('name', "'- unknown -'"). ' FROM table';
        + +

        length

        + +

        This is not a function, but a property. Some databases have +"length" and others "len" as the function to measure the +length of a string. To use this property:

        + +
          $sql = "SELECT ".$db->length."(field) from table";
        +  $rs = $db->Execute($sql);
        + +

        random

        + +

        This is not a function, but a property. This is a string that holds the sql +to generate a random number between 0.0 and 1.0 inclusive.

        + +

        substr

        + +

        This is not a function, but a property. Some databases have +"substr" and others "substring" as the function to retrieve +a sub-string. To use this property:

        + +
          $sql = "SELECT ".$db->substr."(field, $offset, $length) from table";
        +  $rs = $db->Execute($sql);
        + +

        For all databases, the 1st parameter of substr is the field, the 2nd +is the offset (1-based) to the beginning of the sub-string, and the 3rd is the +length of the sub-string.

        + +

        Param($name)

        + +

        Generates a bind placeholder portably. For most databases, the bind +placeholder is "?". However some databases use named bind parameters +such as Oracle, eg ":somevar". This allows us to portably define an +SQL statement with bind parameters:

        + +
        $sql = 'insert into table (col1,col2) values ('.$DB->Param('a').','.$DB->Param('b').')';
        +# generates 'insert into table (col1,col2) values (?,?)'
        +# or        'insert into table (col1,col2) values (:a,:b)
        '
        +$stmt = $DB->Prepare($sql);
        +$stmt = $DB->Execute($stmt,array('one','two'));
        + +

        PrepareSP($sql, $cursor=false )

        + +

        When calling stored procedures in mssql and oci8 (oracle), and you might +want to directly bind to parameters that return values, or for special LOB +handling. PrepareSP() allows you to do so.

        + +

        Returns the same array or $sql string as Prepare( ) above. If you do not +need to bind to return values, you should use Prepare( ) instead.

        + +

        The 2nd parameter, $cursor is not used except with oci8. Setting it to true +will force OCINewCursor to be called; this is to support output REF CURSORs.

        + +

        For examples of usage of PrepareSP( ), see InParameter( ) below.

        + +

        Note: in the mssql driver, preparing stored procedures requires a special +function call, mssql_init( ), which is called by this function. PrepareSP( ) is +available in all other drivers, and is emulated by calling Prepare( ).

        + +

        InParameter($stmt, $var, $name, $maxLen = 4000, +$type = false )

        + +

        Binds a PHP variable as input to a stored procedure +variable. The parameter $stmt is the value returned by PrepareSP(), $var +is the PHP variable you want to bind, $name is the name of the stored procedure +variable. Optional is $maxLen, the maximum length of the data to bind, +and $type which is database dependant. Consult mssql_bind and ocibindbyname docs at php.net for more +info on legal values for $type.

        + +

        InParameter() is a wrapper function that calls Parameter() with +$isOutput=false. The advantage of this function is that it is self-documenting, +because the $isOutput parameter is no longer needed. Only for mssql and oci8 +currently.

        + +

        Here is an example using oci8:

        + +
        # For oracle, Prepare and PrepareSP are identical
        $stmt = $db->PrepareSP(
                 "declare RETVAL integer; 
        +         begin
        +         :RETVAL := SP_RUNSOMETHING(:myid,:group);
        +         end;"
        );
        +$db->InParameter($stmt,$id,'myid');
        +$db->InParameter($stmt,$group,'group',64);
        +$db->OutParameter($stmt,$ret,'RETVAL');
        +$db->Execute($stmt);
        + +

        The same example using mssql:

        + +
        # @RETVAL = SP_RUNSOMETHING @myid,@group
        $stmt = $db->PrepareSP('SP_RUNSOMETHING'); 
        +# note that the parameter name does not have @ in front!
        $db->InParameter($stmt,$id,'myid');
        $db->InParameter($stmt,$group,'group',64);
        # return value in mssql - RETVAL is hard-coded name 
        +$db->OutParameter($stmt,$ret,'RETVAL');
        +$db->Execute($stmt);
        + +

        Note that the only difference between the oci8 and mssql implementations is +$sql.

        + +

        If $type parameter is set to false, in mssql, $type will be dynamicly +determined based on the type of the PHP variable passed (string => SQLCHAR, boolean =>SQLINT1, integer +=>SQLINT4 or float/double=>SQLFLT8).

        + +

        In oci8, $type can be set to OCI_B_FILE (Binary-File), OCI_B_CFILE +(Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and +OCI_B_ROWID (ROWID). To pass in a null, use +$db->Parameter($stmt, $null=null, 'param').

        + +

        OutParameter($stmt, $var, $name, $maxLen = 4000, +$type = false )

        + +

        Binds a PHP variable as output from a stored procedure +variable. The parameter $stmt is the value returned by PrepareSP(), $var +is the PHP variable you want to bind, $name is the name of the stored +procedure variable. Optional is $maxLen, the maximum length of the data +to bind, and $type which is database dependant.

        + +

        OutParameter() is a wrapper function that calls Parameter() with +$isOutput=true. The advantage of this function is that it is self-documenting, +because the $isOutput parameter is no longer needed. Only for mssql and oci8 +currently.

        + +

        For an example, see InParameter.

        + +

        Parameter($stmt, $var, $name, $isOutput=false, +$maxLen = 4000, $type = false )

        + +

        Note: This function is deprecated, because of the new InParameter() and +OutParameter() functions. These are superior because they are self-documenting, +unlike Parameter().

        + +

        Adds a bind parameter suitable for return values or special data handling +(eg. LOBs) after a statement has been prepared using PrepareSP(). Only for +mssql and oci8 currently. The parameters are:
        +
        +$stmt Statement returned by Prepare() or PrepareSP().
        +$var PHP variable to bind to. Make sure you pre-initialize it!
        +$name Name of stored procedure variable name to bind to.
        +[$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= +IN/OUT. This is ignored in oci8 as this driver auto-detects the direction.
        +[$maxLen] Maximum length of the parameter variable.
        +[$type] Consult mssql_bind and ocibindbyname docs at php.net for more +info on legal values for type.

        + +

        Lastly, in oci8, bind parameters can be reused without calling PrepareSP( ) or +Parameters again. This is not possible with mssql. An oci8 example:

        + +
        $id = 0; $i = 0;
        +$stmt = $db->PrepareSP( "update table set val=:i where id=:id");
        +$db->Parameter($stmt,$id,'id');
        +$db->Parameter($stmt,$i, 'i');
        +for ($cnt=0; $cnt < 1000; $cnt++) {
        +         $id = $cnt;
        +         $i = $cnt * $cnt; # works with oci8!
                 $db->Execute($stmt); 
        +}
        + +

        Bind($stmt, $var, $size=4001, $type=false, $name=false)

        + +

        This is a low-level function supported only by the oci8 driver. Avoid +using unless you only want to support Oracle. The Parameter( ) function is +the recommended way to go with bind variables.

        + +

        Bind( ) allows you to use bind variables in your sql statement. This binds a +PHP variable to a name defined in an Oracle sql statement that was previously +prepared using Prepare(). Oracle named variables begin with a colon, and ADOdb +requires the named variables be called :0, :1, :2, :3, etc. The first +invocation of Bind() will match :0, the second invocation will match :1, etc. +Binding can provide 100% speedups for insert, select and update statements.

        + +

        The other variables, $size sets the buffer size for data storage, $type is +the optional descriptor type OCI_B_FILE (Binary-File), OCI_B_CFILE +(Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and +OCI_B_ROWID (ROWID). Lastly, instead of using the default :0, :1, etc names, +you can define your own bind-name using $name.

        + +

        The following example shows 3 bind variables being used: p1, p2 and p3. +These variables are bound to :0, :1 and :2.

        + +
        $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");
        +$DB->Bind($stmt, $p1);
        +$DB->Bind($stmt, $p2);
        +$DB->Bind($stmt, $p3);
        +for ($i = 0; $i < $max; $i++) {
        +   $p1 = ?; $p2 = ?; $p3 = ?;
        +   $DB->Execute($stmt);
        +}
        + +

        You can also use named variables:

        + +
        $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:name0, :name1, :name2)");
        +$DB->Bind($stmt, $p1, "name0");
        +$DB->Bind($stmt, $p2, "name1");
        +$DB->Bind($stmt, $p3, "name2");
        +for ($i = 0; $i < $max; $i++) {
        +   $p1 = ?; $p2 = ?; $p3 = ?;
        +   $DB->Execute($stmt);
        +}
        + +

        LogSQL($enable=true)

        + +

        Call this method to install a SQL logging and timing +function (using fnExecute). Then all SQL statements are logged into an +adodb_logsql table in a database. If the adodb_logsql table does not exist, +ADOdb will create the table if you have the appropriate permissions. Returns +the previous logging value (true for enabled, false for disabled). Here are +samples of the DDL for selected databases:

        + +
                         mysql:
                         CREATE TABLE adodb_logsql (
                           created datetime NOT NULL,
                           sql0 varchar(250) NOT NULL,
                           sql1 text NOT NULL,
                           params text NOT NULL,
                           tracer text NOT NULL,
                           timer decimal(16,6) NOT NULL
                         )
                         
                         postgres:
                         CREATE TABLE adodb_logsql (
                           created timestamp NOT NULL,
                           sql0 varchar(250) NOT NULL,
                           sql1 text NOT NULL,
                           params text NOT NULL,
                           tracer text NOT NULL,
                           timer decimal(16,6) NOT NULL
                         )
                         
                         mssql:
                         CREATE TABLE adodb_logsql (
                           created datetime NOT NULL,
                           sql0 varchar(250) NOT NULL,
                           sql1 varchar(4000) NOT NULL,
                           params varchar(3000) NOT NULL,
                           tracer varchar(500) NOT NULL,
                           timer decimal(16,6) NOT NULL
                         )
                         
                         oci8:
                         CREATE TABLE adodb_logsql (
                           created date NOT NULL,
                           sql0 varchar(250) NOT NULL,
                           sql1 varchar(4000) NOT NULL,
                           params varchar(4000),
                           tracer varchar(4000),
                           timer decimal(16,6) NOT NULL
                         )
        + +

        Usage:

        + +
                 $conn->LogSQL(); // turn on logging
        +           :
        +         $conn->Execute(...);
        +           :
        +         $conn->LogSQL(false); // turn off logging
        +        
        +         # output summary of SQL logging results
        +         $perf = NewPerfMonitor($conn);
        +         echo $perf->SuspiciousSQL();
        +         echo $perf->ExpensiveSQL();
        + +

        One limitation of logging is that rollback also prevents SQL from being +logged.

        + +

        If you prefer to use another name for the table used to store the SQL, you +can override it by calling adodb_perf::table($tablename), where $tablename is +the new table name (you will still need to manually create the table yourself). +An example:

        + +
                 include('adodb.inc.php');
        +         include('adodb-perf.inc.php');
        +         adodb_perf::table('my_logsql_table');
        + +

        Also see Performance Monitor.

        + +

        fnExecute and fnCacheExecute properties

        + +

        These two properties allow you to define bottleneck functions for all sql +statements processed by ADOdb. This allows you to perform statistical analysis +and query-rewriting of your sql.

        + +

        Examples of fnExecute

        + +

        Here is an example of using fnExecute, to count all cached queries and +non-cached queries, you can do this:

        + +
        # $db is the connection object
        function &CountExecs($db, $sql, $inputarray)
        {
        global $EXECS;
         
                 if (!is_array(inputarray)) $EXECS++;
                 # handle 2-dimensional input arrays
                 else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);
                 else $EXECS++;
                 
                 # in PHP4.4 and PHP5, we need to return a value by reference
                 $null = null;
                 return $null;
        }
         
        # $db is the connection object
        function CountCachedExecs($db, $secs2cache, $sql, $inputarray)
        {
        +global $CACHED; $CACHED++;
        +}
        +
        +$db = NewADOConnection('mysql');
        +$db->Connect(...);
        +$db->fnExecute = 'CountExecs';
        +$db->fnCacheExecute = 'CountCachedExecs';
        + :
        + :
        +# After many sql statements:`
        +printf("<p>Total queries=%d; total cached=%d</p>",$EXECS+$CACHED, $CACHED);
        + +

        The fnExecute function is called before the sql is parsed and executed, so +you can perform a query rewrite. If you are passing in a prepared statement, +then $sql is an array (see Prepare). The fnCacheExecute +function is only called if the recordset returned was cached. The function +parameters match the Execute and CacheExecute functions respectively, except +that $this (the connection object) is passed as the first parameter.

        + +

        Since ADOdb 3.91, the behaviour of fnExecute varies depending on whether the +defined function returns a value. If it does not return a value, then the $sql +is executed as before. This is useful for query rewriting or counting sql +queries.

        + +

        On the other hand, you might want to replace the Execute function with one +of your own design. If this is the case, then have your function return a +value. If a value is returned, that value is returned immediately, without any +further processing. This is used internally by ADOdb to implement LogSQL() +functionality.

        + +
        + +
        + +
        + +

        ADOConnection Utility Functions

        + +

        BlankRecordSet([$queryid])

        + +

        No longer available - removed since 1.99.

        + +

        Concat($s1,$s2,....)

        + +

        Generates the sql string used to concatenate $s1, $s2, etc together. Uses +the string in the concat_operator field to generate the concatenation. Override +this function if a concatenation operator is not used, eg. MySQL.

        + +

        Returns the concatenated string.

        + +

        DBDate($date)

        + +

        Format the $date in the format the database accepts - the return +string is also quoted. This is used when you are sending dates to the database +(eg INSERT, UPDATE or where clause of SELECT statement). The $date +parameter can be a PHP DateTime object (since ADOdb 5.09), a Unix integer timestamp or an ISO format Y-m-d. Uses the +fmtDate field, which holds the format to use. If null or false or '' is passed +in, it will be converted to an SQL null.

        + +

        Returns the date as a quoted string.

        + +
         
                 $sql = "select * from atable where created > ".$db->DBDate("$year-$month-$day");
                 $db->Execute($sql);
        + +

        Note to retrieve a date column in a specific format, use SQLDate. +

        + +

        BindDate($date)

        + +

        Format the $date in the bind format the database accepts. Normally +this means that the date string is not quoted, unlike DBDate, which quotes the +string.

        + +
         
                 $sql = "select * from atable where created > ".$db->Param('0');
                 // or
                 $sql = "select * from atable where created > ?";
                 $db->Execute($sql,array($db->BindDate("$year-$month-$day"));
        + +

        DBTimeStamp($ts)

        + +

        Format the timestamp $ts in the format the database accepts; this can +be a PHP DateTime object (since ADOdb 5.09), a Unix integer timestamp or an ISO format Y-m-d H:i:s. Uses the fmtTimeStamp +field, which holds the format to use. If null or false or '' is passed in, it +will be converted to an SQL null.

        + +

        Returns the timestamp as a quoted string.

        + +
         
                 $sql = "select * from atable where created > ".$db->DBTimeStamp("$year-$month-$day $hr:$min:$secs");
                 $db->Execute($sql);
        + +

        BindTimeStamp($ts)

        + +

        Format the timestamp $ts in the bind format the database accepts. +Normally this means that the timestamp string is not quoted, unlike +DBTimeStamp, which quotes the string.

        + +
         
                 $sql = "select * from atable where created > ".$db->Param('0');
                 // or
                 $sql = "select * from atable where created > ?";
                 $db->Execute($sql,array($db->BindTimeStamp("$year-$month-$day $hr:$min:$secs"));
        + +

        qstr($s,[$magic_quotes_enabled=false])

        + +

        Quotes a string to be sent to the database. The $magic_quotes_enabled +parameter may look funny, but the idea is if you are quoting a string extracted +from a POST/GET variable, then pass get_magic_quotes_gpc() as the second +parameter. This will ensure that the variable is not quoted twice, once by qstr +and once by the magic_quotes_gpc.

        + +

        Eg. $s = $db->qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());

        + +

        Returns the quoted string.

        + +

        Quote($s)

        + +

        Quotes the string $s, escaping the database specific quote character as +appropriate. Formerly checked magic quotes setting, but this was disabled since +3.31 for compatibility with PEAR DB.

        + +

        Affected_Rows( )

        + +

        Returns the number of rows affected by a update or delete statement. Returns +false if function not supported.

        + +

        Not supported by interbase/firebird currently.

        + +

        Insert_ID( )

        + +

        Returns the last autonumbering ID inserted. Returns false if function not +supported.

        + +

        Only supported by databases that support auto-increment or object id's, such +as PostgreSQL, MySQL and MS SQL Server currently. PostgreSQL returns the OID, +which can change on a database reload.

        + +

        RowLock($table,$where)

        + +

        Lock a table row for the duration of a transaction. For example to lock +record $id in table1:

        + +
                 $DB->StartTrans();
        +         $DB->RowLock("table1","rowid=$id");
        +         $DB->Execute($sql1);
        +         $DB->Execute($sql2);
        +         $DB->CompleteTrans();
        + +

        Supported in db2, interbase, informix, mssql, oci8, postgres, sybase.

        + +

        MetaDatabases()

        + +

        Returns a list of databases available on the server as an array. You have to +connect to the server first. Only available for ODBC, MySQL and ADO.

        + +

        MetaTables($ttype = false, $showSchema = false, +$mask=false)

        + +

        Returns an array of tables and views for the current database as an array. +The array should exclude system catalog tables if possible. To only show +tables, use $db->MetaTables('TABLES'). To show only views, use +$db->MetaTables('VIEWS'). The $showSchema parameter currently works only for +DB2, and when set to true, will add the schema name to the table, eg. +"SCHEMA.TABLE".

        + +

        You can define a mask for matching. For example, setting $mask = 'TMP%' will +match all tables that begin with 'TMP'. Currently only mssql, oci8, odbc_mssql +and postgres* support $mask.

        + +

        MetaColumns($table,$notcasesensitive=true)

        + +

        Returns an array of ADOFieldObject's, one field object for every column of +$table. A field object is a class instance with (name, type, max_length) +defined. Currently Sybase does not recognise date types, and ADO cannot +identify the correct data type (so we default to varchar).

        + +

        The $notcasesensitive parameter determines whether we uppercase or lowercase +the table name to normalize it (required for some databases). Does not work +with MySQL ISAM tables.

        + +

        For schema support, pass in the $table parameter, +"$schema.$tablename". This is only supported for selected databases.

        + +

        MetaColumnNames($table,$numericIndex=false)

        + +

        Returns an array of column names for $table. Since ADOdb 4.22, this is an +associative array, with the keys in uppercase. Set $numericIndex=true if you +want the old behaviour of numeric indexes (since 4.23).

        + +

        e.g. array('FIELD1' => 'Field1', 'FIELD2'=>'Field2')

        + +

        MetaPrimaryKeys($table, $owner=false)

        + +

        Returns an array containing column names that are the primary keys of +$table. Supported by mysql, odbc (including db2, odbc_mssql, etc), mssql, +postgres, interbase/firebird, oci8 currently.

        + +

        Views (and some tables) have primary keys, but sometimes this information is +not available from the database. You can define a function +ADODB_View_PrimaryKeys($databaseType, $database, $view, $owner) that should +return an array containing the fields that make up the primary key. If that +function exists, it will be called when MetaPrimaryKeys() cannot find a primary +key for a table or view.

        + +
        // In this example: dbtype = 'oci8', $db = 'mydb', $view = 'dataView', $owner = false 
        +function ADODB_View_PrimaryKeys($dbtype,$db,$view,$owner)
        +{
        +         switch(strtoupper($view)) {
        +         case 'DATAVIEW': return array('DATAID');
        +         default: return false;
        +         }
        +}
        +
        +$db = NewADOConnection('oci8');
        +$db->Connect('localhost','root','','mydb');
        +$db->MetaPrimaryKeys('dataView');
        + +

        ServerInfo()

        + +

        Returns an array of containing two elements 'description' and 'version'. The +'description' element contains the string description of the database. The +'version' naturally holds the version number (which is also a string).

        + +

        MetaForeignKeys($table, $owner=false, +$upper=false)

        + +

        Returns an associate array of foreign keys, or false if not supported. For +example, if table employee has a foreign key where employee.deptkey points to +dept_table.deptid, and employee.posn=posn_table.postionid and +employee.poscategory=posn_table.category, then +$conn->MetaForeignKeys('employee') will return

        + +
                 array(
        +                 'dept_table' => array('deptkey=deptid'),
        +                 'posn_table' => array('posn=positionid','poscategory=category')
        +         )
        + +

        The optional schema or owner can be defined in $owner. If $upper is true, +then the table names (array keys) are upper-cased.

        + +
        + +
        + +
        + +

        ADORecordSet

        + +

        When an SQL statement successfully is executed by ADOConnection->Execute($sql),an ADORecordSet object is +returned. This object contains a virtual cursor so we can move from row to row, +functions to obtain information about the columns and column types, and helper +functions to deal with formating the results to show to the user.

        + +

        ADORecordSet Fields

        + +

        fields: Array containing the current row. This is not associative, +but is an indexed array from 0 to columns-1. See also the function Fields, which behaves like an associative array.

        + +

        dataProvider: The underlying mechanism used to connect to the +database. Normally set to native, unless using odbc or ado.

        + +

        blobSize: Maximum size of a char, string or varchar object before it +is treated as a Blob (Blob's should be shown with textarea's). See the MetaType function.

        + +

        sql: Holds the sql statement used to generate this record set.

        + +

        canSeek: Set to true if Move( ) function works.

        + +

        EOF: True if we have scrolled the cursor past the last record.

        + +

        ADORecordSet Functions

        + +

        ADORecordSet( )

        + +

        Constructer. Normally you never call this function yourself.

        + +

        GetAssoc([$force_array])

        + +

        Generates an associative array from the recordset. Note that is this +function is also available in the connection object. +More details can be found there.

        + +

        GetArray([$number_of_rows])

        + +

        Generate a 2-dimensional array of records from the current cursor position, +indexed from 0 to $number_of_rows - 1. If $number_of_rows is undefined, till +EOF.

        + +

        GetRows([$number_of_rows])

        + +

        Generate a 2-dimensional array of records from the current +cursor position. Synonym for GetArray() for compatibility with Microsoft ADO.

        + +

        GetMenu($name, [$default_str=''], +[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])

        + +

        Generate a HTML menu +(<select><option><option></select>). The first column +of the recordset (fields[0]) will hold the string to display in the option +tags. If the recordset has more than 1 column, the second column (fields[1]) is +the value to send back to the web server.. The menu will be given the name $name. +

        + +

        If $default_str is defined, then if $default_str == fields[0], +that field is selected. If $blank1stItem is true, the first option is +empty. You can also set the first option strings by setting $blank1stItem = +"$value:$text".

        + +

        $Default_str can be array for a multiple select listbox.

        + +

        To get a listbox, set the $size to a non-zero value (or pass +$default_str as an array). If $multiple_select is true then a listbox +will be generated with $size items (or if $size==0, then 5 items) +visible, and we will return an array to a server. Lastly use $moreAttr to +add additional attributes such as javascript or styles.

        + +

        Menu Example 1: GetMenu('menu1','A',true) +will generate a menu: for +the data (A,1), (B,2), (C,3). Also see example 5.

        + +

        Menu Example 2: For the same data, GetMenu('menu1',array('A','B'),false) +will generate a menu with both A and B selected:
        +

        + +

        GetMenu2($name, [$default_str=''], +[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])

        + +

        This is nearly identical to GetMenu, except that the $default_str is +matched to fields[1] (the option values).

        + +

        Menu Example 3: Given the data in menu example 2, GetMenu2('menu1',array('1','2'),false) +will generate a menu with both A and B selected in menu example 2, but this +time the selection is based on the 2nd column, which holds the values to return +to the Web server.

        + +

        UserDate($str, [$fmt])

        + +

        Converts the date string $str to another format. The date format is +Y-m-d, or Unix timestamp format. The default $fmt is Y-m-d.

        + +

        UserTimeStamp($str, [$fmt])

        + +

        Converts the timestamp string $str to another format. The timestamp +format is Y-m-d H:i:s, as in '2002-02-28 23:00:12', or Unix timestamp format. +UserTimeStamp calls UnixTimeStamp to parse $str, and $fmt +defaults to Y-m-d H:i:s if not defined.

        + +

        UnixDate($str)

        + +

        Parses the date string $str and returns it in unix mktime format (eg. +a number indicating the seconds after January 1st, 1970). Expects the date to +be in Y-m-d H:i:s format, except for Sybase and Microsoft SQL Server, where M d +Y is also accepted (the 3 letter month strings are controlled by a global +array, which might need localisation).

        + +

        This function is available in both ADORecordSet and ADOConnection since +1.91.

        + +

        UnixTimeStamp($str)

        + +

        Parses the timestamp string $str and returns it in unix mktime format +(eg. a number indicating the seconds after January 1st, 1970). Expects the date +to be in "Y-m-d, H:i:s" (1970-12-24, 00:00:00) or "Y-m-d +H:i:s" (1970-12-24 00:00:00) or "YmdHis" (19701225000000) +format, except for Sybase and Microsoft SQL Server, where "M d Y +h:i:sA" (Dec 25 1970 00:00:00AM) is also accepted (the 3 letter month +strings are controlled by a global array, which might need localisation).

        + +

        This function is available in both ADORecordSet and ADOConnection since +1.91.

        + +

        OffsetDate($dayFraction, $basedate=false)

        + +

        Returns a string with the native SQL functions to calculate future and past +dates based on $basedate in a portable fashion. If $basedate is not defined, +then the current date (at 12 midnight) is used. Returns the SQL string that +performs the calculation when passed to Execute().

        + +

        For example, in Oracle, to find the date and time that is 2.5 days from +today, you can use:

        + +
        # get date one week from now
        +$fld = $conn->OffsetDate(7); // returns "(trunc(sysdate)+7")
        # get date and time that is 60 hours from current date and time
        +$fld = $conn->OffsetDate(2.5, $conn->sysTimeStamp); // returns "(sysdate+2.5)"
        +
        +$conn->Execute("UPDATE TABLE SET dodate=$fld WHERE ID=$id");
        + +

        This function is available for mysql, mssql, oracle, oci8 and postgresql +drivers since 2.13. It might work with other drivers provided they allow +performing numeric day arithmetic on dates.

        + +

        SQLDate($dateFormat, $basedate=false)

        + +

        Returns a string which contains the native SQL functions to +format a date or date column $basedate. This is used when retrieving date +columns in SELECT statements. For sending dates to the database (eg. in UPDATE, +INSERT or the where clause of SELECT statements) use DBDate. +It uses a case-sensitive $dateFormat, which supports:

        + +
         
          Y: 4-digit Year
          Q: Quarter (1-4)
          M: Month (Jan-Dec)
          m: Month (01-12)
          d: Day (01-31)
          H: Hour (00-23)
          h: Hour (1-12)
          i: Minute (00-59)
          s: Second (00-60)
          A: AM/PM indicator
          w: day of week (0-6 or 1-7 depending on DB)
          l: day of week (as string - lowercase L)
          W: week in year (0..53 for MySQL, 1..53 for PostgreSQL and Oracle)
          
        + +

        All other characters are treated as strings. You can also use \ to escape +characters. Available on selected databases, including mysql, postgresql, +mssql, oci8 and DB2.

        + +

        This is useful in writing portable sql statements that GROUP BY on dates. +For example to display total cost of goods sold broken by quarter (dates are +stored in a field called postdate):

        + +
         $sqlfn = $db->SQLDate('Y-\QQ','postdate'); # get sql that formats postdate to output 2002-Q1
        + $sql = "SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc";
        + 
        + +

        MoveNext( )

        + +

        Move the internal cursor to the next row. The $this->fields array +is automatically updated. Returns false if unable to do so (normally because +EOF has been reached), otherwise true.

        + +

        If EOF is reached, then the $this->fields array is set to false (this was +only implemented consistently in ADOdb 3.30). For the pre-3.30 behaviour of +$this->fields (at EOF), set the global variable $ADODB_COMPAT_FETCH = true.

        + +

        Example:

        + +
        $rs = $db->Execute($sql);
        +if ($rs)
        +         while (!$rs->EOF) {
        +                 ProcessArray($rs->fields);        
        +                 $rs->MoveNext();
        +         }
        + +

        Move($to)

        + +

        Moves the internal cursor to a specific row $to. Rows are zero-based +eg. 0 is the first row. The fields array is automatically updated. For +databases that do not support scrolling internally, ADOdb will simulate forward +scrolling. Some databases do not support backward scrolling. If the $to +position is after the EOF, $to will move to the end of the RecordSet for +most databases. Some obscure databases using odbc might not behave this way.

        + +

        Note: This function uses absolute positioning, unlike Microsoft's +ADO.

        + +

        Returns true or false. If false, the internal cursor is not moved in most +implementations, so AbsolutePosition( ) will return the last cursor position +before the Move( ).

        + +

        MoveFirst()

        + +

        Internally calls Move(0). Note that some databases do not support this function.

        + +

        MoveLast()

        + +

        Internally calls Move(RecordCount()-1). Note that some databases do not +support this function.

        + +

        GetRowAssoc($toUpper=true)

        + +

        Returns an associative array containing the current row. The keys to the +array are the column names. The column names are upper-cased for easy access. +To get the next row, you will still need to call MoveNext().

        + +

        For example:
        +Array ( [ID] => 1 [FIRSTNAME] => Caroline [LASTNAME] => Miranda +[CREATED] => 2001-07-05 )

        + +

        Note: do not use GetRowAssoc() with $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC. +Because they have the same functionality, they will interfere with each other.

        + +

        AbsolutePage($page=-1)

        + +

        Returns the current page. Requires PageExecute()/CachePageExecute() to be +called. See Example 8.

        + +

        AtFirstPage($status='')

        + +

        Returns true if at first page (1-based). Requires +PageExecute()/CachePageExecute() to be called. See Example 8.

        + +

        AtLastPage($status='')

        + +

        Returns true if at last page (1-based). Requires +PageExecute()/CachePageExecute() to be called. See Example 8.

        + +

        Fields($colname)

        + +

        Returns the value of the associated column $colname for the current +row. The column name is case-insensitive.

        + +

        This is a convenience function. For higher performance, use $ADODB_FETCH_MODE.

        + +

        FetchRow()

        + +

        Returns array containing current row, or false if EOF. FetchRow( ) +internally moves to the next record after returning the current row.

        + +

        Warning: Do not mix using FetchRow() with MoveNext().

        + +

        Usage:

        + +
        $rs = $db->Execute($sql);
        +if ($rs)
        +         while ($arr = $rs->FetchRow()) {
        +              # process $arr      
        +         }
        + +

        FetchInto(&$array)

        + +

        Sets $array to the current row. Returns PEAR_Error object if EOF, 1 if ok +(DB_OK constant). If PEAR is undefined, false is returned when EOF. FetchInto( +) internally moves to the next record after returning the current row.

        + +

        FetchRow() is easier to use. See above.

        + +

        FetchField($column_number)

        + +

        Returns an object containing the name, type and max_length +of the associated field. If the max_length cannot be determined reliably, it +will be set to -1. The column numbers are zero-based. See example +2.

        + +

        FieldCount( )

        + +

        Returns the number of fields (columns) in the record set.

        + +

        RecordCount( )

        + +

        Returns the number of rows in the record set. If the number of records +returned cannot be determined from the database driver API, we will buffer all +rows and return a count of the rows after all the records have been retrieved. +This buffering can be disabled (for performance reasons) by setting the global +variable $ADODB_COUNTRECS = false. When disabled, RecordCount( ) will return -1 +for certain databases. See the supported databases list above for more details. +

        + +

        RowCount is a synonym for RecordCount.

        + +

        PO_RecordCount($table, $where)

        + +

        Returns the number of rows in the record set. If the database does not +support this, it will perform a SELECT COUNT(*) on the table $table, with the +given $where condition to return an estimate of the recordset size.

        + +

        $numrows = $rs->PO_RecordCount("articles_table", +"group=$group");

        + +

        NextRecordSet() +

        + +

        For databases that allow multiple recordsets to be returned in one query, +this function allows you to switch to the next recordset. Currently only +supported by mssql driver.

        + +
        $rs = $db->Execute('execute return_multiple_rs');
        +$arr1 = $rs->GetArray();
        +$rs->NextRecordSet();
        +$arr2 = $rs->GetArray();
        + +

        FetchObject($toupper=true)

        + +

        Returns the current row as an object. If you set $toupper to true, then the +object fields are set to upper-case. Note: The newer FetchNextObject() is the +recommended way of accessing rows as objects. See below.

        + +

        FetchNextObject($toupper=true)

        + +

        Gets the current row as an object and moves to the next row automatically. +Returns false if at end-of-file. If you set $toupper to true, then the object +fields are set to upper-case. Note that for some drivers such as mssql, you +need to SetFetchMode(ADODB_FETCH_ASSOC) or SetFetchMode(ADODB_FETCH_BOTH).

        + +
        $rs = $db->Execute('select firstname,lastname from table');
        +if ($rs) {
        +         while ($o = $rs->FetchNextObject()) {
        +                 print "$o->FIRSTNAME, $o->LASTNAME<BR>";
        +         }
        +}
        + +

        There is some trade-off in speed in using FetchNextObject(). If performance +is important, you should access rows with the fields[] array. FetchObj() +

        + +

        Returns the current record as an object. Fields are not upper-cased, unlike +FetchObject.

        + +

        FetchNextObj()

        + +

        Returns the current record as an object and moves to the next record. If +EOF, false is returned. Fields are not upper-cased, unlike FetctNextObject.

        + +

        CurrentRow( )

        + +

        Returns the current row of the record set. 0 is the first row.

        + +

        AbsolutePosition( )

        + +

        Synonym for CurrentRow for compatibility with ADO. Returns the +current row of the record set. 0 is the first row.

        + +

        MetaType($nativeDBType[,$field_max_length],[$fieldobj])

        + +

        Determine what generic meta type a database field type is given its +native type $nativeDBType as a string and the length of the field $field_max_length. +Note that field_max_length can be -1 if it is not known. The field object +returned by FetchField() can be passed in $fieldobj or as the 1st +parameter $nativeDBType. This is useful for databases such as mysql +which has additional properties in the field object such as primary_key. +

        + +

        Uses the field blobSize and compares it with $field_max_length +to determine whether the character field is actually a blob.

        + +

        For example, $db->MetaType('char') will return 'C'.

        + +

        Returns:

        + +
          +
        • C: Character fields + that should be shown in a <input type="text"> tag.
        • +
        • X: Clob (character + large objects), or large text fields that should be shown in a + <textarea>
        • +
        • D: Date field
        • +
        • T: Timestamp field
        • +
        • L: Logical field + (boolean or bit-field)
        • +
        • N: Numeric field. + Includes decimal, numeric, floating point, and real.
        • +
        • I:  Integer + field.
        • +
        • R: Counter or + Autoincrement field. Must be numeric.
        • +
        • B: Blob, or binary + large objects.
        • +
        + +

        Since ADOdb 3.0, MetaType accepts $fieldobj as the first parameter, instead +of $nativeDBType.

        + +

        Close( )

        + +

        Closes the recordset, cleaning all memory and resources associated with the +recordset.

        + +

        If memory management is not an issue, you do not need to call this function +as recordsets are closed for you by PHP at the end of the script. SQL +statements such as INSERT/UPDATE/DELETE do not really return a recordset, so you +do not have to call Close() for such SQL statements.

        + +
        + +
        + +
        + +

        function rs2html($adorecordset,[$tableheader_attributes], +[$col_titles])

        + +

        This is a standalone function (rs2html = recordset to html) that is similar +to PHP's odbc_result_all function, it prints a ADORecordSet, $adorecordset +as a HTML table. $tableheader_attributes allow you to control the table cellpadding, +cellspacing and border attributes. Lastly you can replace the +database column names with your own column titles with the array $col_titles. +This is designed more as a quick debugging mechanism, not a production table +recordset viewer.

        + +

        You will need to include the file tohtml.inc.php.

        + +

        Example of rs2html:

        + +
        <?
        +include('tohtml.inc.php')
        ; # load code common to ADOdb
        +include('adodb.inc.php'); # load code common to ADOdb
        +$conn = &ADONewConnection('mysql');   # create a connection
        +$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
        +$sql = 'select CustomerName, CustomerID from customers';
        +$rs   = $conn->Execute($sql);
        +rs2html($rs,'border=2 cellpadding=3',array('Customer Name','Customer ID'));
        +?>
        + +
        + +
        + +
        + +

        Differences between this ADOdb library and Microsoft ADO

        + +
          +
        1. ADOdb only supports + recordsets created by a connection object. Recordsets cannot be created + independently.
        2. +
        3. ADO properties are implemented + as functions in ADOdb. This makes it easier to implement any enhanced ADO + functionality in the future.
        4. +
        5. ADOdb's ADORecordSet->Move() uses + absolute positioning, not relative. Bookmarks are not supported.
        6. +
        7. ADORecordSet->AbsolutePosition() cannot be used + to move the record cursor.
        8. +
        9. ADO Parameter objects are + not supported. Instead we have the ADOConnection::Parameter( + ) function, which provides a simpler interface for calling preparing + parameters and calling stored procedures.
        10. +
        11. Recordset properties for + paging records are available, but implemented as in Example + 8.
        12. +
        + +
        + +
        + +
        + +

        Database Driver Guide

        + +

        This describes how to create a class to connect to a new database. To ensure +there is no duplication of work, kindly email me at jlim#natsoft.com if you +decide to create such a class.

        + +

        First decide on a name in lower case to call the database type. Let's say we +call it xbase.

        + +

        Then we need to create two classes ADODB_xbase and ADORecordSet_xbase in the +file adodb-xbase.inc.php.

        + +

        The simplest form of database driver is an adaptation of an existing ODBC +driver. Then we just need to create the class ADODB_xbase extends ADODB_odbc +to support the new date and timestamp formats, the concatenation +operator used, true and false. For the ADORecordSet_xbase +extends ADORecordSet_odbc we need to change the MetaType function. +See adodb-vfp.inc.php as an example.

        + +

        More complicated is a totally new database driver that connects to a new PHP +extension. Then you will need to implement several functions. Fortunately, you +do not have to modify most of the complex code. You only need to override a few +stub functions. See adodb-mysql.inc.php for example.

        + +

        The default date format of ADOdb internally is YYYY-MM-DD (Ansi-92). All +dates should be converted to that format when passing to an ADOdb date +function. See Oracle for an example how we use ALTER SESSION to change the +default date format in _pconnect _connect.

        + +

        ADOConnection Functions to Override

        + +

        Defining a constructor for your ADOConnection derived function is optional. +There is no need to call the base class constructor.

        + +

        _connect: Low level implementation of Connect. Returns true or false. +Should set the _connectionID.

        + +

        _pconnect: Low level implemention of PConnect. Returns true or false. +Should set the _connectionID.

        + +

        _query: Execute a query. Returns the queryID, or false.

        + +

        _close: Close the connection -- PHP should clean up all recordsets.

        + +

        ErrorMsg: Stores the error message in the private variable _errorMsg. +

        + +

        ADOConnection Fields to Set

        + +

        _bindInputArray: Set to true if binding of parameters for SQL inserts +and updates is allowed using ?, eg. as with ODBC.

        + +

        fmtDate

        + +

        fmtTimeStamp

        + +

        true

        + +

        false

        + +

        concat_operator

        + +

        replaceQuote

        + +

        hasLimit support SELECT * FROM TABLE LIMIT 10 of MySQL.

        + +

        hasTop support Microsoft style SELECT TOP 10 * FROM TABLE.

        + +

        ADORecordSet Functions to Override

        + +

        You will need to define a constructor for your ADORecordSet derived class +that calls the parent class constructor.

        + +

        FetchField: as documented above in ADORecordSet

        + +

        _initrs: low level initialization of the recordset: setup the _numOfRows +and _numOfFields fields -- called by the constructor.

        + +

        _seek: seek to a particular row. Do not load the data into the fields +array. This is done by _fetch. Returns true or false. Note that some +implementations such as Interbase do not support seek. Set canSeek to false.

        + +

        _fetch: fetch a row using the database extension function and then +move to the next row. Sets the fields array. If the parameter +$ignore_fields is true then there is no need to populate the fields +array, just move to the next row. then Returns true or false.

        + +

        _close: close the recordset

        + +

        Fields: If the array row returned by the PHP extension is not an +associative one, you will have to override this. See adodb-odbc.inc.php for an +example. For databases such as MySQL and MSSQL where an associative array is +returned, there is no need to override this function.

        + +

        ADOConnection Fields to Set

        + +

        canSeek: Set to true if the _seek function works.

        + +

        Optimizing PHP

        + +

        For info on tuning PHP, read this article on Optimizing +PHP.

        + +

        Change Log

        + +

        5.09 25 June 2009

        +

        Active Record: You can force column names to be quoted in INSERT and UPDATE statements, typically because you are using reserved words as column names by setting +ADODB_Active_Record::$_quoteNames = true; +

        Added memcache and cachesecs to DSN. e.g. +

        +	# we have a memcache servers mem1,mem2 on port 8888, compression=off and cachesecs=120
        +	$dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0&cachesecs=120';
        +
        +

        Fixed up MetaColumns and MetaPrimaryIndexes() for php 5.3 compat. Thx http://adodb.pastebin.com/m52082b16 +

        The postgresql driver's OffsetDate() apparently does not work with postgres 8.3. Fixed. +

        Added support for magic_quotes_sybase in qstr() and addq(). Thanks Eloy and Sam Moffat. +

        The oci8 driver did not handle LOBs properly when binding. Fixed. See http://phplens.com/lens/lensforum/msgs.php?id=17991. +

        Datadict: In order to support TIMESTAMP with subsecond accuracy, added to datadict the new TS type. Supported by mssql, postgresql and oci8 (oracle). +Also changed oci8 $conn->sysTimeStamp to use 'SYSTIMESTAMP' instead of 'SYSDATE'. Should be backwards compat. +

        Added support for PHP 5.1+ DateTime objects in DBDate and DBTimeStamp. This means that dates and timestamps will be managed by DateTime objects if you are running PHP 5.1+. +

        Added new property to postgres64 driver to support returning I if type is unique int called $db->uniqueIisR, defaulting to true. See http://phplens.com/lens/lensforum/msgs.php?id=17963 +

        Added support for bindarray in adodb_GetActiveRecordsClass with SelectLimit in adodb-active-record.inc.php. +

        Transactions now allowed in ado_access driver. Thx to petar.petrov.georgiev#gmail.com. +

        Sessions2 garbage collection is now much more robust. We perform ORDER BY to prevent deadlock in adodb-sessions2.inc.php. +

        Fixed typo in pdo_sqlite driver. +

        5.08a 17 Apr 2009

        +

        Fixes wrong version number string. +

        Incorrect + in adodb-datadict.inc.php removed. +

        Fixes missing OffsetDate() function in pdo. Thx paul#mantisforge.org. +

        5.08 17 Apr 2009

        +

        adodb-sybase.inc.php driver. Added $conn->charSet support. Thx Luis Henrique Mulinari (luis.mulinari#gmail.com) +

        adodb-ado5.inc.php. Fixed some bind param issues. Thx Jirka Novak. +

        adodb-ado5.inc.php. Now has improved error handling. +

        Fixed typo in adodb-xmlschema03.inc.php. See XMLS_EXISTING_DATA, line 1501. Thx james johnson. +

        Made $inputarr optional for _query() in all drivers. +

        Fixed spelling mistake in flushall() in adodb.inc.ophp. +

        Fixed handling of quotes in adodb_active_record::doquote. Thx Jonathan Hohle (jhohle#godaddy.com). +

        Added new index parameter to adodb_active_record::setdatabaseadaptor. Thx Jonathan Hohle +

        Fixed & readcache() reference compat problem with php 5.3 in adodb.Thx Jonathan Hohle. +

        Some minor $ADODB_CACHE_CLASS definition issues in adodb.inc.php. +

        Added Reset() function to adodb_active_record. Thx marcus. +

        Minor dsn fix for pdo_sqlite in adodb.inc.php. Thx Sergey Chvalyuk. +

        Fixed adodb-datadict _CreateSuffix() inconsistencies. Thx Chris Miller. +

        Option to delete old fields $dropOldFlds in datadict ChangeTableSQL($table, $flds, $tableOptions, $dropOldFlds=false) added. Thx Philipp Niethammer. +

        Memcache caching did not expire properly. Fixed. +

        MetaForeignKeys for postgres7 driver changed from adodb_movenext to $rs->MoveNext (also in 4.99) +

        Added support for ldap and ldaps url format in ldap driver. E.g. ldap://host:port/dn?attributes?scope?filter?extensions +

        5.07 26 Dec 2008

        + +

        BeginTrans/CommitTrans/RollbackTrans return true/false correctly on +success/failure now for mssql, odbc, oci8, mysqlt, mysqli, postgres, pdo.

        + +

        Replace() now quotes all non-null values including numeric ones.

        + +

        Postgresql qstr() now returns booleans as true and false +without quotes.

        + +

        MetaForeignKeys in mysql and mysqli drivers had this problem: A table can +have two foreign keys pointing to the same column in the same table. The +original code will incorrectly report only the last column. Fixed. +https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976 +

        + +

        Passing in full ado connection string in $argHostname with ado drivers was +failing in adodb5 due to bug. Fixed.

        + +

        Fixed memcachelib flushcache and flushall bugs. Also fixed possible +timeCreated = 0 problem in readcache. (Also in adodb 4.992). Thanks AlexB_UK +(alexbarnes#hotmail.com).

        + +

        Fixed a notice in adodb-sessions2.inc.php, in _conn(). Thx bober +m.derlukiewicz#rocktech.remove_me.pl;

        + +

        ADOdb Active Record: Fixed some issues with incompatible fetch modes +(ADODB_FETCH_ASSOC) causing problems in UpdateActiveTable().

        + +

        ADOdb Active Record: Added support for functions that support predefining +one-to-many relationships:
        ClassHasMany ClassBelongsTo TableHasMany TableBelongsTo +TableKeyHasMany TableKeyBelongsTo.
        +You can also define your child/parent class in these functions, instead of the +default ADODB_Active_Record. Thx Arialdo Martini & Chris R for idea.

        + +

        ADOdb Active Record: HasMany hardcoded primary key to "id". Fixed. +

        + +

        Many pdo and pdo-sqlite fixes from Sid Dunayer [sdunayer#interserv.com].

        + +

        CacheSelectLimit not working for mssql. Fixed. Thx AlexB.

        + +

        The rs2html function did not display hours in timestamps correctly. Now 24hr +clock used.

        + +

        Changed ereg* functions to use preg* functions as ereg* is deprecated in PHP 5.3. Modified sybase and postgresql drivers.

        + +

        5.06 16 Oct 2008

        + +

        Added driver adodb-pdo_sqlite.inc.php. Thanks Diogo Toscano +(diogo#scriptcase.net) for the code.

        + +

        Added support for one-to-many relationships +with BelongsTo() and HasMany() in adodb_active_record.

        + +

        Added BINARY type to mysql.inc.php (also in 4.991).

        + +

        Added support for SelectLimit($sql,-1,100) in oci8. (also in 4.991).

        + +

        New $conn->GetMedian($table, $field, $where='') to get median account no. +(also in 4.991)

        + +

        The rs2html() function in tohtml.inc.php did not handle dates with ':' in it +properly. Fixed. (also in 4.991)

        + +

        Added support for connecting to oci8 using $DB->Connect($ip, $user, $pwd, +"SID=$sid"); (also in 4.991)

        + +

        Added mysql type 'VAR_STRING' to MetaType(). (also in 4.991)

        + +

        The session and session2 code supports setfetchmode assoc properly now (also +in 4.991).

        + +

        Added concat support to pdo. Thx Andrea Baron.

        + +

        Changed db2 driver to use format "Y-m-d H-i-s" for datetime +instead of "Y-m-d-H-i-s" which was legacy from odbc_db2 conversion.

        + +

        Removed vestigal break on adodb_tz_offset in adodb-time.inc.php.

        + +

        MetaForeignKeys did not work for views in MySQL 5. Fixed.

        + +

        Changed error handling in GetActiveRecordsClass.

        + +

        Added better support for using existing driver when $ADODB_NEWCONNECTION +function returns false.

        + +

        In _CreateSuffix in adodb-datadict.inc.php, adding unsigned variable for +mysql.

        + +

        In adodb-xmlschema03.inc.php, changed addTableOpt to include db name.

        + +

        If bytea blob in postgresql is null, empty string was formerly returned. Now +null is returned.

        + +

        Changed db2 driver CreateSequence to support $start parameter.

        + +

        rs2html() now does not add nbsp to end if length of string > 0

        + +

        The oci8po FetchField() now only lowercases field names if ADODB_ASSOC_CASE +is set to 0.

        + +

        New mssqlnative drivers for php. TQ Garrett Serack of M'soft. Download +mssqlnative extension. Note that this is still in beta.

        + +

        Fixed bugs in memcache support.

        + +

        You can now change the return value of GetOne if no records are found using +the global variable $ADODB_GETONE_EOF. The default is null. To change it back +to the pre-4.99/5.00 behaviour of false, set $ADODB_GETONE_EOF = false;

        + +

        In Postgresql 8.2/8.3 MetaForeignkeys did not work. Fixed William Kolodny +William.Kolodny#gt-t.net

        + +

        4.990/5.05 11 Jul 2008

        + +

        Added support for multiple recordsets in mysqli "Geisel Sierote" +geisel#4up.com.br. See http://phplens.com/lens/lensforum/msgs.php?id=15917

        + +

        Malcolm Cook added new Reload() function to Active Record. See +http://phplens.com/lens/lensforum/msgs.php?id=17474

        + +

        Thanks Zoltan Monori [monzol#fotoprizma.hu] for bug fixes in iterator, +SelectLimit, GetRandRow, etc.

        + +

        Under heavy loads, the performance monitor for oci8 disables Ixora views.

        + +

        Fixed sybase driver SQLDate to use str_replace(). Also for adodb5, changed +sybase driver UnixDate and UnixTimeStamp calls to static.

        + +

        Changed oci8 lob handler to use & reference +$this->_refLOBs[$numlob]['VAR'] = &$var.

        + +

        We now strtolower the get_class() function in PEAR::isError() for php5 +compat.

        + +

        CacheExecute did not retrieve cache recordsets properly for 5.04 (worked in +4.98). Fixed.

        + +

        New ADODB_Cache_File class for file caching defined in adodb.inc.php.

        + +

        Farsi language file contribution by Peyman Hooshmandi Raad +(phooshmand#gmail.com)

        + +

        New API for creating your custom caching class which is stored in +$ADODB_CACHE:

        + +
         
        include "/path/to/adodb.inc.php";
        $ADODB_CACHE_CLASS = 'MyCacheClass';
         
        class MyCacheClass extends ADODB_Cache_File
        {
                 function writecache($filename, $contents,$debug=false){...}
                 function &readcache($filename, &$err, $secs2cache, $rsClass){ ...}
                  :
        }
         
        $DB = NewADOConnection($driver);
        $DB->Connect(...);  ## MyCacheClass created here and stored in $ADODB_CACHE global variable.
         
        $data = $rs->CacheGetOne($sql); ## MyCacheClass is used here for caching...
        + +

        Memcache supports multiple pooled hosts now. Only if none of the pooled +servers can be contacted will a connect error be generated. Usage example +below:

        + +
         
        $db = NewADOConnection($driver);
        $db->memCache = true; /// should we use memCache instead of caching in files
        $db->memCacheHost = array($ip1, $ip2, $ip3); /// $db->memCacheHost = $ip1; still works
        $db->memCachePort = 11211; /// this is default memCache port
        $db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
         
        $db->Connect(...);
        $db->CacheExecute($sql);
        + +

        4.98/5.04 13 Feb 2008

        + +

        Fixed adodb_mktime problem which causes a performance bottleneck in $hrs.

        + +

        Added mysqli support to adodb_getcount().

        + +

        Removed MYSQLI_TYPE_CHAR from MetaType().

        + +

        4.97/5.03 22 Jan 2008

        + +

        Active Record: $ADODB_ASSOC_CASE=1 did not work properly. Fixed.

        + +

        Modified Fields() in recordset class to support display null fields in +FetchNextObject().

        + +

        In ADOdb5, active record implementation, we now support column names with +spaces in them - we autoconvert the spaces to _ using __set(). Thx Daniel Cook. +http://phplens.com/lens/lensforum/msgs.php?id=17200

        + +

        Removed $arg3 from mysqli SelectLimit. See +http://phplens.com/lens/lensforum/msgs.php?id=16243. Thx Zsolt Szeberenyi.

        + +

        Changed oci8 FetchField, which returns the max_length of BLOB/CLOB/NCLOB as +4000 (incorrectly) to -1.

        + +

        CacheExecute would sometimes return an error on Windows if it was unable to +lock the cache file. This is harmless and has been changed to a warning that +can be ignored. Also adodb_write_file() code revised.

        + +

        ADOdb perf code changed to only log sql if execution time >= 0.05 +seconds. New $ADODB_PERF_MIN variable holds min sql timing. Any SQL with timing +value below this and is not causing an error is not logged.

        + +

        Also adodb_backtrace() now traces 1 level deeper as sometimes actual culprit +function is not displayed.

        + +

        Fixed a group by problem with adodb_getcount() for db's which are not +postgres/oci8 based.

        + +

        Changed mssql driver Parameter() from SQLCHAR to SQLVARCHAR: case 'string': +$type = SQLVARCHAR; break.

        + +

        Problem with mssql driver in php5 (for adodb 5.03) because some functions +are not static. Fixed.

        + +

        4.96/5.02 24 Sept 2007

        + +

        ADOdb perf for oci8 now has non-table-locking code when clearing the sql. +Slower but better transparency. Added in 4.96a and 5.02a.

        + +

        Fix adodb count optimisation. Preg_match did not work properly. Also rewrote +the ORDER BY stripping code in _adodb_getcount(), adodb-lib.inc.php.

        + +

        SelectLimit for oci8 not optimal for large recordsets when offset=0. Changed +$nrows check.

        + +

        Active record optimizations. Added support for assoc arrays in Set().

        + +

        Now GetOne returns null if EOF (no records found), and false if error +occurs. Use ErrorMsg()/ErrorNo() to get the error.

        + +

        Also CacheGetRow and CacheGetCol will return false if error occurs, or empty +array() if EOF, just like GetRow and GetCol.

        + +

        Datadict now allows changing of types which are not resizable, eg. VARCHAR +to TEXT in ChangeTableSQL. -- Mateo Tibaquirá

        + +

        Added BIT data type support to adodb-ado.inc.php and adodb-ado5.inc.php.

        + +

        Ldap driver did not return actual ldap error messages. Fixed.

        + +

        Implemented GetRandRow($sql, $inputarr). Optimized for Oci8.

        + +

        Changed adodb5 active record to use static SetDatabaseAdapter() and removed +php4 constructor. Bas van Beek bas.vanbeek#gmail.com.

        + +

        Also in adodb5, changed adodb-session2 to use static function declarations +in class. Thx Daniel Berlin. +

        + +

        Added "Clear SQL Log" to bottom of Performance screen.

        + +

        Sessions2 code echo'ed directly to the screen in debug mode. Now uses +ADOConnection::outp().

        + +

        In mysql/mysqli, qstr(null) will return the string "null" instead +of empty quoted string "''".

        + +

        postgresql optimizeTable in perf-postgres.inc.php added by Daniel Berlin +(mail#daniel-berlin.de)

        + +

        Added 5.2.1 compat code for oci8.

        + +

        Changed @@identity to SCOPE_IDENTITY() for multiple mssql drivers. Thx +Stefano Nari.

        + +

        Code sanitization introduced in 4.95 caused problems in European locales (as +float 3.2 was typecast to 3,2). Now we only sanitize if is_numeric fails.

        + +

        Added support for customizing ADORecordset_empty using +$this->rsPrefix.'empty'. By Josh Truwin.

        + +

        Added proper support for ALterColumnSQL for Postgresql in datadict code. +Thx. Josh Truwin.

        + +

        Added better support for MetaType() in mysqli when using an array recordset. +

        + +

        Changed parser for pgsql error messages in adodb-error.inc.php to +case-insensitive regex.

        + +

        4.95/5.01 17 May 2007

        + +

        CacheFlush debug outp() passed in invalid parameters. Fixed.

        + +

        Added Thai language file for adodb. Thx Trirat Petchsingh rosskouk#gmail.com +and Marcos Pont

        + +

        Added zerofill checking support to MetaColumns for mysql and mysqli.

        + +

        CacheFlush no longer deletes all files/directories. Only *.cache files +deleted.

        + +

        DB2 timestamp format changed to var $fmtTimeStamp = +"'Y-m-d-H:i:s'";

        + +

        Added some code sanitization to AutoExecute in adodb-lib.inc.php.

        + +

        Due to typo, all connections in adodb-oracle.inc.php would become +persistent, even non-persistent ones. Fixed.

        + +

        Oci8 DBTimeStamp uses 24 hour time for input now, so you can perform string +comparisons between 2 DBTimeStamp values.

        + +

        Some PHP4.4 compat issues fixed in adodb-session2.inc.php

        + +

        For ADOdb 5.01, fixed some adodb-datadict.inc.php MetaType compat issues +with PHP5.

        + +

        The $argHostname was wiped out in adodb-ado5.inc.php. Fixed.

        + +

        Adodb5 version, added iterator support for adodb_recordset_empty.

        + +

        Adodb5 version,more error checking code now will use exceptions if +available.

        + +

        4.94 23 Jan 2007

        + +

        Active Record: $ADODB_ASSOC_CASE=2 did not work properly. Fixed. Thx +gmane#auxbuss.com.

        + +

        mysqli had bugs in BeginTrans() and EndTrans(). Fixed.

        + +

        Improved error handling when no database is connected for oci8. Thx Andy +Hassall.

        + +

        Names longer than 30 chars in oci8 datadict will be changed to random name. +Thx Eugenio. http://phplens.com/lens/lensforum/msgs.php?id=16182

        + +

        Added var $upperCase = 'ucase' to access and ado_access drivers. Thx Renato +De Giovanni renato#cria.org.br

        + +

        Postgres64 driver, if preparing plan failed in _query, did not handle error +properly. Fixed. See http://phplens.com/lens/lensforum/msgs.php?id=16131.

        + +

        Fixed GetActiveRecordsClass() reference bug. See +http://phplens.com/lens/lensforum/msgs.php?id=16120

        + +

        Added handling of nulls in adodb-ado_mssql.inc.php for qstr(). Thx to Felix +Rabinovich.

        + +

        Adodb-dict contributions by Gaetano:
        ++ Support for INDEX in data-dict. Example: idx_ev1. The ability to define +indexes using the INDEX keyword was added in ADOdb 4.94. The following example +features mutiple indexes, including a compound index idx_ev1.

        + +
         
          event_id I(11) NOTNULL AUTOINCREMENT PRIMARY,
          event_type I(4) NOTNULL  INDEX idx_evt,
          event_start_date T DEFAULT NULL INDEX id_esd,
          event_end_date T DEFAULT '0000-00-00 00:00:00' INDEX id_eted,
          event_parent I(11) UNSIGNED NOTNULL DEFAULT 0 INDEX id_evp,
          event_owner I(11) DEFAULT 0 INDEX idx_ev1,
          event_project I(11) DEFAULT 0 INDEX idx_ev1,
          event_times_recuring I(11) UNSIGNED NOTNULL DEFAULT 0,
          event_icon C(20) DEFAULT 'obj/event',
          event_description X
        + +


        ++ Prevents the generated SQL from including double drop-sequence statements for +REPLACE case of tables with autoincrement columns (on those dbs that emulate it +via sequences)
        ++ makes any date defined as DEFAULT value for D and T columns work +cross-database, not just the "sysdate" value (as long as it is +specified using adodb standard format). See above example.

        + +

        Fixed pdo's GetInsertID() support. Thx Ricky Su.

        + +

        oci8 Prepare() now sets error messages if an error occurs.

        + +

        Added 'PT_BR' to SetDateLocale() -- brazilian portugese.

        + +

        charset in oci8 was not set correctly on *Connect()

        + +

        ADOConnection::Transpose() now appends as first column the field names.

        + +

        Added $ADODB_QUOTE_FIELDNAMES. If set to true, will autoquote field names in +AutoExecute(),GetInsertSQL(), GetUpdateSQL().

        + +

        Transpose now adds the field names as the first column after transposition.

        + +

        Added === check in ADODB_SetDatabaseAdapter for $db, +adodb-active-record.inc.php. Thx Christian Affolter.

        + +

        Added ErrorNo() to adodb-active-record.inc.php. Thx ante#novisplet.com.

        + +

        4.93 10 Oct 2006

        + +

        Added support for multiple database connections in performance monitoring +code (adodb-perf.inc.php). Now all sql in multiple database connections can be +saved into one database ($ADODB_LOG_CONN).

        + +

        Added MetaIndexes() to odbc_mssql.

        + +

        Added connection property $db->null2null = 'null'. In +autoexecute/getinsertsql/getupdatesql, this value will be converted to a null. +Set this to a funny invalid value if you do not want null conversion. See +http://phplens.com/lens/lensforum/msgs.php?id=15902.

        + +

        Path disclosure problem in mysqli fixed. Thx Andy.

        + +

        Fixed typo in session_schema2.xml.

        + +

        Changed INT in oci8 to return correct precision in $fld->max_length, +MetaColumns(). Thx + Eloy Lafuente + Plaza.

        + +

        Patched postgres64 _connect to handle serverinfo(). see http://phplens.com/lens/lensforum/msgs.php?id=15887. +

        + +

        Added pdo fix for null columns. See +http://phplens.com/lens/lensforum/msgs.php?id=15889

        + +

        For stored procedures, missing connection id now passed into mssql_query(). +Thx Ecsy (ecsy#freemail.hu).

        + +

        4.92a 30 Aug 2006

        + +

        Syntax error in postgres7 driver. Thx + Eloy Lafuente + Plaza.

        + +

        Minor bug fixes - adodb informix 10 types added to adodb.inc.php. Thx +Fernando Ortiz.

        + +

        4.92 29 Aug 2006

        + +

        Better odbtp date support.

        + +

        Added IgnoreErrors() to bypass default error handling.

        + +

        The _adodb_getcount() function in adodb-lib.inc.php, some ORDER BY bug +fixes.

        + +

        For ibase and firebird, set $sysTimeStamp = "CURRENT_TIMESTAMP".

        + +

        Fixed postgres connection bug: +http://phplens.com/lens/lensforum/msgs.php?id=11057.

        + +

        Changed CacheSelectLimit() to flush cache when $secs2cache==-1 due to +complaints from other users.

        + +

        Added support for using memcached with CacheExecute/CacheSelectLimit. +Requires memcache module PECL extension. Usage:

        + +
         
        $db = NewADOConnection($driver);
        $db->memCache = true; /// should we use memCache instead of caching in files
        $db->memCacheHost = "126.0.1.1"; /// memCache host
        $db->memCachePort = 11211; /// this is default memCache port
        $db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
         
        $db->Connect(...);
        $db->CacheExecute($sql);
        + +

        Implemented Transpose() for recordsets. Recordset must be retrieved using +ADODB_FETCH_NUM. First column becomes the column name.

        + +
         
        $DB = NewADOConnection('mysql');
        $DB->Connect(...);
        $DB->SetFetchMode(ADODB_FETCH_NUM);
        $rs = $DB->Execute('select productname,productid,unitprice from products limit 10');
        $rs2 = $DB->Transpose($rs);
        rs2html($rs2);
        + +

        4.91 2 Aug 2006

        + +

        Major session code rewrite .... See session docs.

        + +

        PDO bindinputarray was not set properly for MySQL (changed from true to +false).

        + +

        Changed CacheSelectLimit() to re-cache when $secs2cache==0. This is one way +to flush the cache when SelectLimit is called.

        + +

        Added to quotes to mysql and mysqli: "SHOW COLUMNS FROM `%s`";

        + +

        Removed accidental optgroup handling in GetMenu(). Fixed ibase _BlobDecode +for php5 compat, and also mem alloc issues for small blobs, thx +salvatori#interia.pl

        + +

        Mysql driver OffsetDate() speedup, useful for adodb-sessions.

        + +

        Fix for GetAssoc() PHP5 compat. See +http://phplens.com/lens/lensforum/msgs.php?id=15425

        + +

        Active Record - If inserting a record and the value of a primary key field +is null, then we do not insert that field in as we assume it is an +auto-increment field. Needed by mssql.

        + +

        Changed postgres7 MetaForeignKeys() see http://phplens.com/lens/lensforum/msgs.php?id=15531 +

        + +

        DB2 will now return db2_conn_errormsg() when it is a connection error.

        + +

        4.90 8 June 2006

        + +

        Changed adodb_countrec() in adodb-lib.inc.php to allow LIMIT to be used as a +speedup to reduce no of records counted.

        + +

        Added support for transaction modes for postgres and oci8 with +SetTransactionMode(). These transaction modes affect all subsequent +transactions of that connection.

        + +

        Thanks to Halmai Csongor for suggestion.

        + +

        Removed $off = $fieldOffset - 1 line in db2 driver, FetchField(). Tx Larry +Menard.

        + +

        Added support for PHP5 objects as Execute() bind parameters using __toString +(eg. Simple-XML). Thx Carl-Christian Salvesen.

        + +

        Rounding in tohtml.inc.php did not work properly. Fixed.

        + +

        MetaIndexes in postgres fails when fields are deleted then added in again +because the attnum has gaps in it. See +http://sourceforge.net/tracker/index.php?func=detail&aid=1451245&group_id=42718&atid=433976. +Fixed.

        + +

        MetaForeignkeys in mysql and mysqli did not work when +fetchMode==ADODB_FETCH_ASSOC used. Fixed.

        + +

        Reference error in AutoExecute() fixed.

        + +

        Added macaddr postgres type to MetaType. Maps to 'C'.

        + +

        Added to _connect() in adodb-ado5.inc.php support for $database and +$dataProvider parameters. Thx Larry Menard.

        + +

        Added support for sequences in adodb-ado_mssql.inc.php. Thx Larry Menard.

        + +

        Added ADODB_SESSION_READONLY.

        + +

        Added session expiryref support to crc32 mode, and in LOB code.

        + +

        Clear _errorMsg in postgres7 driver, so that ErrorMsg() displays properly +when no error occurs.

        + +

        Added BindDate and BindTimeStamp

        + +

        4.81 3 May 2006

        + +

        Fixed variable ref errors in adodb-ado5.inc.php in _query().

        + +

        Mysqli setcharset fix using method_exists().

        + +

        The adodb-perf.inc.php CreateLogTable() code now works for user-defined +table names.

        + +

        Error in ibase_blob_open() fixed. See +http://phplens.com/lens/lensforum/msgs.php?id=14997

        + +

        4.80 8 Mar 2006

        + +

        Added activerecord support.

        + +

        Added mysql $conn->compat323 = true if you want MySQL 3.23 compat +enabled. Fixes GetOne() Select-Limit problems.

        + +

        Added adodb-xmlschema03.inc.php to support XML Schema version 3 and updated +adodb-datadict.htm docs.

        + +

        Better memory management in Execute. Thx Mike Fedyk.

        + +

        4.72 21 Feb 2006

        + +

        Added 'new' DSN parameter for NConnect().

        + +

        Pager now sanitizes $PHP_SELF to protect against XSS. Thx to James Bercegay +and others.

        + +

        ADOConnection::MetaType changed to setup $rs->connection correctly.

        + +

        New native DB2 driver contributed by Larry Menard, Dan Scott, Andy +Staudacher, Bharat Mediratta.

        + +

        The mssql CreateSequence() did not BEGIN TRANSACTION correctly. Fixed. Thx +Sean Lee.

        + +

        The _adodb_countrecs() function in adodb-lib.inc.php has been revised to +handle more ORDER BY variations.

        + +

        4.71 24 Jan 2006

        + +

        Fixes postgresql security issue related to binary strings. Thx to Andy +Staudacher.

        + +

        Several DSN bugs found:

        + +

        1. Fix bugs in DSN connections introduced in 4.70 when underscores are found +in the DSN.

        + +

        2. DSN with _ did not work properly in PHP5 (fine in PHP4). Fixed.

        + +

        3. Added support for PDO DSN connections in NewADOConnection(), and database +parameter in PDO::Connect().

        + +

        The oci8 datetime flag not correctly implemented in ADORecordSet_array. +Fixed.

        + +

        Added BlobDelete() to postgres, as a counterpoint to UpdateBlobFile().

        + +

        Fixed GetInsertSQL() to support oci8po.

        + +

        Fixed qstr() issue with postgresql with \0 in strings.

        + +

        Fixed some datadict driver loading issues in _adodb_getdriver().

        + +

        Added register shutdown function session_write_close in +adodb-session.inc.php for PHP 5 compat. See +http://phplens.com/lens/lensforum/msgs.php?id=14200.

        + +

        4.70 6 Jan 2006

        + +

        Many fixes from Danila Ulyanov to ibase, oci8, postgres, mssql, odbc_oracle, +odbtp, etc drivers.

        + +

        Changed usage of binary hint in adodb-session.inc.php for mysql. See +http://phplens.com/lens/lensforum/msgs.php?id=14160

        + +

        Fixed invalid variable reference problem in undomq(), adodb-perf.inc.php.

        + +

        Fixed http://phplens.com/lens/lensforum/msgs.php?id=14254 in +adodb-perf.inc.php, _DBParameter() settings of fetchmode was wrong.

        + +

        Fixed security issues in server.php and tmssql.php discussed by Andreas +Sandblad in a Secunia security advisory. Added $ACCEPTIP = 127.0.0.1 and +changed suggested root password to something more secure.

        + +

        Changed pager to close recordset after RenderLayout().

        + +

        4.68 25 Nov 2005

        + +

        PHP 5 compat for mysqli. MetaForeignKeys repeated twice and +MYSQLI_BINARY_FLAG missing.

        + +

        PHP 5.1 support for postgresql bind parameters using ? did not work if >= +10 parameters. Fixed. Thx to Stanislav Shramko.

        + +

        Lots of PDO improvements.

        + +

        Spelling error fixed in mysql MetaForeignKeys, $associative parameter.

        + +

        4.67 16 Nov 2005

        + +

        Postgresql not_null flag not set to false correctly. Thx Cristian MARIN.

        + +

        We now check in Replace() if key is in fieldArray. Thx Sébastien Vanvelthem. +

        + +

        _file_get_contents() function was missing in xmlschema. fixed.

        + +

        Added week in year support to SQLDate(), using 'W' flag. Thx Spider.

        + +

        In sqlite metacolumns was repeated twice, causing PHP 5 problems. Fixed.

        + +

        Made debug output XHTML compliant.

        + +

        4.66 28 Sept 2005

        + +

        ExecuteCursor() in oci8 did not clean up properly on failure. Fixed.

        + +

        Updated xmlschema.dtd, by "Alec Smecher" asmecher#smecher.bc.ca

        + +

        Hardened SelectLimit, typecasting nrows and offset to integer.

        + +

        Fixed misc bugs in AutoExecute() and GetInsertSQL().

        + +

        Added $conn->database as the property holding the database name. The +older $conn->databaseName is retained for backward compat.

        + +

        Changed _adodb_backtrace() compat check to use function_exists().

        + +

        Bug in postgresql MetaIndexes fixed. Thx Kevin Jamieson.

        + +

        Improved OffsetDate for MySQL, reducing rounding error.

        + +

        Metacolumns added to sqlite. Thx Mark Newnham.

        + +

        PHP 4.4 compat fixes for GetAssoc().

        + +

        Added postgresql bind support for php 5.1. Thx Cristiano da Cunha Duarte

        + +

        OffsetDate() fixes for postgresql, typecasting strings to date or timestamp. +

        + +

        DBTimeStamp formats for mssql, odbc_mssql and postgresql made to conform +with other db's.

        + +

        Changed PDO constants from PDO_ to PDO:: to support latest spec.

        + +

        4.65 22 July 2005

        + +

        Reverted 'X' in mssql datadict to 'TEXT' to be compat with mssql driver. +However now you can set $datadict->typeX = 'varchar(4000)' or 'TEXT' or +'CLOB' for mssql and oci8 drivers.

        + +

        Added charset support when using DSN for Oracle.

        + +

        _adodb_getmenu did not use fieldcount() to get number of fields. Fixed.

        + +

        MetaForeignKeys() for mysql/mysqli contributed by Juan Carlos Gonzalez.

        + +

        MetaDatabases() now correctly returns an array for mysqli driver. Thx +Cristian MARIN.

        + +

        CompleteTrans(false) did not return false. Fixed. Thx to JMF.

        + +

        AutoExecute() did not work with Oracle. Fixed. Thx José Moreira.

        + +

        MetaType() added to connection object.

        + +

        More PHP 4.4 reference return fixes. Thx Ryan C Bonham and others.

        + +

        4.64 20 June 2005

        + +

        In datadict, if the default field value is set to '', then it is not applied +when the field is created. Fixed by Eugenio.

        + +

        MetaPrimaryKeys for postgres did not work because of true/false change in +4.63. Fixed.

        + +

        Tested ocifetchstatement in oci8. Rejected at the end.

        + +

        Added port to dsn handling. Supported in postgres, mysql, mysqli,ldap.

        + +

        Added 'w' and 'l' to mysqli SQLDate().

        + +

        Fixed error handling in ldap _connect() to be more consistent. Also added +ErrorMsg() handling to ldap.

        + +

        Added support for union in _adodb_getcount, adodb-lib.inc.php for postgres +and oci8.

        + +

        rs2html() did not work with null dates properly.

        + +

        PHP 4.4 reference return fixes.

        + +

        4.63 18 May 2005

        + +

        Added $nrows<0 check to mysqli's SelectLimit(). +

        Added OptimizeTable() and OptimizeTables() in adodb-perf.inc.php. By Markus Staab. +

        PostgreSQL inconsistencies fixed. true and false set to TRUE and FALSE, and boolean type in datadict-postgres.inc.php set +to 'L' => 'BOOLEAN'. Thx Kevin Jamieson. +

        New adodb_session_create_table() function in adodb-session.inc.php. By Markus Staab. +

        Added null check to UserTimeStamp(). +

        Fixed typo in mysqlt driver in adorecordset. Thx to Andy Staudacher. +

        GenID() had a bug in the raiseErrorFn handling. Fixed. Thx Marcos Pont. +

        Datadict name quoting now handles ( ) in index fields correctly - they aren't part of the index field. >

        + +

        Performance monitoring: (1) oci8 Ixora checks moved down; (2) expensive sql +changed so that only those sql with count(*)>1 are shown; (3) changed sql1 +field to a length+crc32 checksum - this breaks backward compat.

        + +

        We remap firebird15 to firebird in data dictionary.

        + +

        4.62 2 Apr 2005

        + +

        Added 'w' (dow as 0-6 or 1-7) and 'l' (dow as string) for SQLDate for oci8, +postgres and mysql.

        + +

        Rolled back MetaType() changes for mysqli done in prev version.

        + +

        Datadict change by chris, cblin#tennaxia.com data mappings from:

        + +
         
        oci8:  X->varchar(4000) XL->CLOB
        mssql: X->XL->TEXT
        mysql: X->XL->LONGTEXT
        fbird: X->XL->varchar(4000)
        + +

        to:

        + +
         
        oci8:  X->varchar(4000) XL->CLOB
        mssql: X->VARCHAR(4000) XL->TEXT
        mysql: X->TEXT          XL->LONGTEXT
        fbird: X->VARCHAR(4000) XL->VARCHAR(32000)
        + +

        Added $connection->disableBlobs to postgresql to improve performance when +no bytea is used (2-5% improvement).

        + +

        Removed all HTTP_* vars.

        + +

        Added $rs->tableName to be set before calling AutoExecute().

        + +

        Alex Rootoff rootoff#pisem.net contributed ukrainian language file.

        + +

        Added new mysql_option() support using $conn->optionFlags array.

        + +

        Added support for ldap_set_option() using the $LDAP_CONNECT_OPTIONS global +variable. Contributed by Josh Eldridge.

        + +

        Added LDAP_* constant definitions to ldap.

        + +

        Added support for boolean bind variables. We use $conn->false and +$conn->true to hold values to set false/true to.

        + +

        We now do not close the session connection in adodb-session.inc.php as other +objects could be using this connection.

        + +

        We now strip off \0 at end of Ixora SQL strings in $perf->tohtml() for +oci8.

        + +

        4.61 23 Feb 2005

        + +

        MySQLi added support for mysqli_connect_errno() and mysqli_connect_error().

        + +

        Massive improvements to alpha PDO driver.

        + +

        Quote string bind parameters logged by performance monitor for easy type +checking. Thx Jason Judge.

        + +

        Added support for $role when connecting with Interbase/firebird.

        + +

        Added support for enum recognition in MetaColumns() mysql and mysqli. Thx +Amedeo Petrella.

        + +

        The sybase_ase driver contributed by Interakt Online. Thx Cristian Marin +cristic#interaktonline.com.

        + +

        Removed not_null, has_default, and default_value from ADOFieldObject.

        + +

        Sessions code, fixed quoting of keys when handling LOBs in session write() +function.

        + +

        Sessions code, added adodb_session_regenerate_id(), to reduce risk of +session hijacking by changing session cookie dynamically. Thx Joe Li.

        + +

        Perf monitor, polling for CPU did not work for PHP 4.3.10 and 5.0.0-5.0.3 +due to PHP bugs, so we special case these versions.

        + +

        Postgresql, UpdateBlob() added code to handle type==CLOB.

        + +

        4.60 24 Jan 2005

        + +

        Implemented PEAR DB's autoExecute(). Simplified design because I don't like +using constants when strings work fine.

        + +

        _rs2serialize will now update $rs->sql and $rs->oldProvider.

        + +

        Added autoExecute().

        + +

        Added support for postgres8 driver. Currently just remapped to postgres7 +driver.

        + +

        Changed oci8 _query(), so that OCIBindByName() sets the length to -1 if +element size is > 4000. This provides better support for LONGs.

        + +

        Added SetDateLocale() support for netherlands (Nl).

        + +

        Spelling error in pivot code ($iff should be $iif).

        + +

        mysql insert_id() did not work with mysql 3.x. Fixed.

        + +

        "\r\n" not converted to spaces correctly in exporting data. Fixed. +

        + +

        _nconnect() in mysqli did not return value correctly. Fixed.

        + +

        Arne Eckmann contributed danish language file.

        + +

        Added clone() support to FetchObject() for PHP5.

        + +

        Removed SQL_CUR_USE_ODBC from odbc_mssql.

        + +

        4.55 5 Jan 2005

        + +

        Found bug in Execute() with bind params for db's that do not support binding +natively.

        + +

        DropSequence() now correctly uses default parameter.

        + +

        Now Execute() ignores locale for floats, so 1.23 is NEVER converted to 1,23. +

        + +

        SetFetchMode() not properly saved in adodb-perf, suspicious sql and +expensive sql. Fixed.

        + +

        Added INET to postgresql metatypes. Thx motzel.

        + +

        Allow oracle hints to work when counting with _adodb_getcount in +adodb-lib.inc.php. Thx Chris Wrye.

        + +

        Changed mysql insert_id() to use SELECT LAST_INSERT_ID().

        + +

        If alter col in datadict does not modify col type/size of actual col, then +it is removed from alter col code. By Mark Newham. Not perfect as MetaType() +!== ActualType().

        + +

        Added handling of view fields in metacolumns() for postgresql. Thx Renato De +Giovanni.

        + +

        Added to informix MetaPrimaryKeys and MetaColumns fixes for null bit. Thx to +Cecilio Albero.

        + +

        Removed obsolete connection_timeout() from perf code.

        + +

        Added support for arrayClass in adodb-csv.inc.php.

        + +

        RSFilter now accepts methods of the form $array($obj, 'methodname'). Thx to +blake#near-time.com.

        + +

        Changed CacheFlush to $cmd = 'rm -rf +'.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/';

        + +

        For better cursor concurrency, added code to free ref cursors in oci8 when +$rs->Close() is called. Note that CLose() is called internally by the Get* +functions too.

        + +

        Added IIF support for access when pivoting. Thx Volodia Krupach.

        + +

        Added mssql datadict support for timestamp. Thx Alexios.

        + +

        Informix pager fix. By Mario Ramirez.

        + +

        ADODB_TABLE_REGEX now includes ':'. By Mario Ramirez.

        + +

        Mark Newnham contributed MetaIndexes for oci8 and db2.

        + +

        4.54 5 Nov 2004

        + +

        Now you can set $db->charSet = ?? before doing a Connect() in oci8.

        + +

        Added adodbFetchMode to sqlite.

        + +

        Perf code, added a string typecast to substr in adodb_log_sql().

        + +

        Postgres: Changed BlobDecode() to use po_loread, added new $maxblobsize +parameter, and now it returns the blob instead of sending it to stdout - make +sure to mention that as a compat warning. Also added $db->IsOID($oid) +function; uses a heuristic, not guaranteed to work 100%.

        + +

        Contributed arabic language file by "El-Shamaa, Khaled" +k.el-shamaa#cgiar.org

        + +

        PHP5 exceptions did not handle @ protocol properly. Fixed.

        + +

        Added ifnull handling for postgresql (using coalesce).

        + +

        Added metatables() support for Postgresql 8.0 (no longer uses pg_% +dictionary tables).

        + +

        Improved Sybase ErrorMsg() function. By Gaetano Giunta.

        + +

        Improved oci8 SelectLimit() to use Prepare(). By Cristiano Duarte.

        + +

        Type-cast $row parameter in ifx_fetch_row() to int. Thx stefan bodgan.

        + +

        Ralf becker contributed improvements in postgresql, sapdb, mysql data +dictionary handling:
        +- MySql and Postgres MetaType was reporting every int column which was part of +a primary key and unique as serial
        +- Postgres was not reporting the scale of decimal types
        +- MaxDB was padding the defaults of none-string types with spaces
        +- MySql now correctly converts enum columns to varchar

        + +

        Ralf also changed Postgresql datadict:
        +- you cant add NOT NULL columns in postgres in one go, they need to be added as +NULL and then altered to NOT NULL
        +- AlterColumnSQL could not change a varchar column with numbers into an integer +column, postgres need an explicit conversation
        +- a re-created sequence was not set to the correct value, if the name was the +old name (no implicit sequence), now always the new name of the implicit +sequence is used

        + +

        Sergio Strampelli added extra $intoken check to Lens_ParseArgs() in datadict +code.

        + +

        4.53 28 Sept 2004

        + +

        FetchMode cached in recordset is sometimes mapped to native db fetchMode. +Normally this does not matter, but when using cached recordsets, we need to +switch back to using adodb fetchmode. So we cache this in +$rs->adodbFetchMode if it differs from the db's fetchMode.

        + +

        For informix we now set canSeek = false driver because stefan bodgan tells +me that seeking doesn't work.

        + +

        SetDateLocale() never worked till now ;-) Thx david#tomato.it

        + +

        Set $_bindInputArray = true in sapdb driver. Required for clob support.

        + +

        Fixed some PEAR::DB emulation issues with isError() and isWarning. Thx to +Gert-Rainer Bitterlich.

        + +

        Empty() used in getupdatesql without strlen() check. Fixed.

        + +

        Added unsigned detection to mysql and mysqli drivers. Thx to dan cech.

        + +

        Added hungarian language file. Thx to Halászvári Gábor.

        + +

        Improved fieldname-type formatting of datadict SQL generated (adding +$widespacing parameter to _GenField).

        + +

        Datadict oci8 DROP CONSTRAINTS misspelt. Fixed. Thx Mark Newnham.

        + +

        Changed odbtp to dynamically change databaseType based on connection, eg. +from 'odbtp' to 'odbtp_mssql' when connecting to mssql database.

        + +

        In datadict, MySQL I4 was wrongly mapped to MEDIUMINT, which is actually I3. +Fixed.

        + +

        Fixed mysqli MetaType() recognition. Mysqli returns numeric types unlike +mysql extension. Thx Francesco Riosa.

        + +

        VFP odbc driver curmode set wrongly, causing problems with memo fields. +Fixed.

        + +

        Odbc driver did not recognize odbc version 2 driver date types properly. +Fixed. Thx Bostjan.

        + +

        ChangeTableSQL() fixes to datadict-db2.inc.php by Mark Newnham.

        + +

        Perf monitoring with odbc improved. Now we try in perf code to manually set +the sysTimeStamp using date() if sysTimeStamp is empty.

        + +

        All ADO +errors are thrown as exceptions in PHP5. So we added exception handling to ado +in PHP5 by creating new adodb-ado5.inc.php driver.

        + +

        Added IsConnected(). Returns true if connection object connected. By +Luca.Gioppo.

        + +

        "Ralf Becker" RalfBecker#digitalROCK.de contributed new sapdb +data-dictionary driver and a large patch that implements field and table +renaming for oracle, mssql, postgresql, mysql and sapdb. See the new RenameTableSQL() +and RenameColumnSQL() functions.

        + +

        We now check ExecuteCursor to see if PrepareSP was initially called.

        + +

        Changed oci8 datadict to use MODIFY for $dd->alterCol. Thx Mark Newnham.

        + +

        4.52 10 Aug 2004

        + +

        Bug found in Replace() when performance logging enabled, introduced in ADOdb +4.50. Fixed.

        + +

        Replace() checks update stmt. If update stmt fails, we now return +immediately. Thx to alex.

        + +

        Added support for $ADODB_FORCE_TYPE in GetUpdateSQL/GetInsertSQL. Thx to +niko.

        + +

        Added ADODB_ASSOC_CASE support to postgres/postgres7 driver.

        + +

        Support for DECLARE stmt in oci8. Thx Lochbrunner.

        + +

        4.51 29 July 2004

        + +

        Added adodb-xmlschema 1.0.2. Thx dan and richard.

        + +

        Added new adorecordset_ext_* classes. If ADOdb extension installed for +mysql, mysqlt and oci8 (but not oci8po), we use the superfast ADOdb extension +code for movenext.

        + +

        Added schema support to mssql and odbc_mssql MetaPrimaryKeys().

        + +

        Patched MSSQL driver to support PHP NULL and Boolean values while binding +the input array parameters in the _query() function. By Stephen Farmer.

        + +

        Added support for clob's for mssql, UpdateBlob(). Thx to +gfran#directa.com.br

        + +

        Added normalize support for postgresql (true=lowercase table name, or +false=case-sensitive table names) to MetaColumns($table, $normalize=true).

        + +

        PHP5 variant dates in ADO +not working. Fixed in adodb-ado.inc.php.

        + +

        Constant ADODB_FORCE_NULLS was not working properly for many releases (for +GetUpdateSQL). Fixed. Also GetUpdateSQL strips off ORDER BY now - thx Elieser +Leão.

        + +

        Perf Monitor for oci8 now dynamically highlights optimizer_* params if too +high/low.

        + +

        Added dsn support to NewADOConnection/ADONewConnection.

        + +

        Fixed out of page bounds bug in _adodb_pageexecute_all_rows() Thx to +"Sergio Strampelli" sergio#rir.it

        + +

        Speedup of movenext for mysql and oci8 drivers.

        + +

        Moved debugging code _adodb_debug_execute() to adodb-lib.inc.php.

        + +

        Fixed postgresql bytea detection bug. See +http://phplens.com/lens/lensforum/msgs.php?id=9849.

        + +

        Fixed ibase datetimestamp typo in PHP5. Thx stefan.

        + +

        Removed whitespace at end of odbtp drivers.

        + +

        Added db2 metaprimarykeys fix.

        + +

        Optimizations to MoveNext() for mysql and oci8. Misc speedups to Get* +functions.

        + +

        4.50 6 July 2004

        + +

        Bumped it to 4.50 to avoid confusion with PHP 4.3.x series.

        + +

        Added db2 metatables and metacolumns extensions.

        + +

        Added alpha PDO driver. Very buggy, only works with odbc.

        + +

        Tested mysqli. Set poorAffectedRows = true. Cleaned up movenext() and +_fetch().

        + +

        PageExecute does not work properly with php5 (return val not a variable). +Reported Dmytro Sychevsky sych#php.com.ua. Fixed.

        + +

        MetaTables() for mysql, $showschema parameter was not backward compatible +with older versions of adodb. Fixed.

        + +

        Changed mysql GetOne() to work with mysql 3.23 when using with non-select +stmts (e.g. SHOW TABLES).

        + +

        Changed TRIG_ prefix to a variable in datadict-oci8.inc.php. Thx to +Luca.Gioppo#csi.it.

        + +

        New to adodb-time code. We allow you to define your own daylights savings +function, adodb_daylight_sv for pre-1970 dates. If the function is defined +(somewhere in an include), then you can correct for daylights savings. See +http://phplens.com/phpeverywhere/node/view/16#daylightsavings for more info.

        + +

        New sqlitepo driver. This is because assoc mode does not work like other +drivers in sqlite. Namely, when selecting (joining) multiple tables, in assoc +mode the table names are included in the assoc keys in the "sqlite" +driver. In "sqlitepo" driver, the table names are stripped from the +returned column names. When this results in a conflict, the first field get +preference. Contributed by Herman Kuiper herman#ozuzo.net

        + +

        Added $forcenull parameter to GetInsertSQL/GetUpdateSQL. Idea by Marco +Aurelio Silva.

        + +

        More XHTML changes for GetMenu. By Jeremy Evans.

        + +

        Fixes some ibase date issues. Thx to stefan bogdan.

        + +

        Improvements to mysqli driver to support $ADODB_COUNTRECS.

        + +

        Fixed adodb-csvlib.inc.php problem when reading stream from socket. We need +to poll stream continiously.

        + +

        4.23 16 June 2004

        + +

        New interbase/firebird fixes thx to Lester Caine. Driver fixes a problem +with getting field names in the result array, and corrects a couple of data +conversions. Also we default to dialect3 for firebird. Also ibase sysDate +property was wrong. Changed to cast as timestamp.

        + +

        The datadict driver is set up to give quoted tables and fields as this was +the only way round reserved words being used as field names in TikiWiki. +TikiPro is tidying that up, and I hope to be able to produce a build of THAT +which uses what I consider proper UPPERCASE field and table names. The +conversion of TikiWiki to ADOdb helped in that, but until the database is +completely tidied up in TikiPro ...

        + +

        Modified _gencachename() to include fetchmode in name hash. This means you +should clear your cache directory after installing this release as the cache +name algorithm has changed.

        + +

        Now Cache* functions work in safe mode, because we do not create +sub-directories in the $ADODB_CACHE_DIR in safe mode. In non-safe mode we still +create sub-directories. Done by modifying _gencachename().

        + +

        Added $gmt parameter (true/false) to UserDate and UserTimeStamp in +connection class, to force conversion of input (in local time) to be converted +to UTC/GMT.

        + +

        Mssql datadict did not support INT types properly (no size param allowed). +Added _GetSize() to datadict-mssql.inc.php.

        + +

        For borland_ibase, BeginTrans(), changed:

        + +
           $this->_transactionID = $this->_connectionID;
        + +

        to

        + +
           $this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
        + +

        Fixed typo in mysqi_field_seek(). Thx to Sh4dow (sh4dow#php.pl).

        + +

        LogSQL did not work with Firebird/Interbase. Fixed.

        + +

        Postgres: made errorno() handling more consistent. Thx to Michael Jahn, +Michael.Jahn#mailbox.tu-dresden.de.

        + +

        Added informix patch to better support metatables, metacolumns by +"Cecilio Albero" c-albero#eos-i.com

        + +

        Cyril Malevanov contributed patch to oci8 to support passing of LOB +parameters:

        + +
                 $text = 'test test test';
        +         $sql = "declare rs clob; begin :rs := lobinout(:sa0); end;";
        +         $stmt = $conn -> PrepareSP($sql);
        +         $conn -> InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB);
        +         $rs = '';
        +         $conn -> OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB);
        +         $conn -> Execute($stmt);
        +         echo "return = ".$rs."<br>";
        + +

        As he says, the LOBs limitations are:

        + +
         - use OCINewDescriptor before binding
        + - if Param is IN, uses save() before each execute. This is done automatically for you.
        + - if Param is OUT, uses load() after each execute. This is done automatically for you.
        + - when we bind $var as LOB, we create new descriptor and return it as a
        +   Bind Result, so if we want to use OUT parameters, we have to store
        +   somewhere &$var to load() data from LOB to it.
        + - IN OUT params are not working now (should not be a big problem to fix it)
        + - now mass binding not working too (I've wrote about it before)
        + +

        Simplified Connect() and PConnect() error handling.

        + +

        When extension not loaded, Connect() and PConnect() will return null. On +connect error, the fns will return false.

        + +

        CacheGetArray() added to code.

        + +

        Added Init() to adorecordset_empty().

        + +

        Changed postgres64 driver, MetaColumns() to not strip off quotes in default +value if :: detected (type-casting of default).

        + +

        Added test: if (!defined('ADODB_DIR')) die(). Useful to prevent hackers from +detecting file paths.

        + +

        Changed metaTablesSQL to ignore Postgres 7.4 information schemas (sql_*).

        + +

        New polish language file by Grzegorz Pacan

        + +

        Added support for UNION in +_adodb_getcount().

        + +

        Added security check for ADODB_DIR to limit path disclosure issues. +Requested by postnuke team.

        + +

        Added better error message support to oracle driver. Thx to Gaetano Giunta.

        + +

        Added showSchema support to mysql.

        + +

        Bind in oci8 did not handle $name=false properly. Fixed.

        + +

        If extension not loaded, Connect(), PConnect(), NConnect() will return null. +

        + +

        4.22 15 Apr 2004

        + +

        Moved docs to own adodb/docs folder.

        + +

        Fixed session bug when quoting compressed/encrypted data in Replace().

        + +

        Netezza Driver and LDAP drivers contributed by Josh Eldridge.

        + +

        GetMenu now uses rtrim() on values instead of trim().

        + +

        Changed MetaColumnNames to return an associative array, keys being the field +names in uppercase.

        + +

        Suggested fix to adodb-ado.inc.php affected_rows to support PHP5 variants. +Thx to Alexios Fakos.

        + +

        Contributed bulgarian language file by Valentin Sheiretsky +valio#valio.eu.org.

        + +

        Contributed romanian language file by stefan bogdan.

        + +

        GetInsertSQL now checks for table name (string) in $rs, and will create a +recordset for that table automatically. Contributed by Walt Boring. Also added +OCI_B_BLOB in bind on Walt's request - hope it doesn't break anything :-)

        + +

        Some minor postgres speedups in _initrs().

        + +

        ChangeTableSQL checks now if MetaColumns returns empty. Thx Jason Judge.

        + +

        Added ADOConnection::Time(), returns current database time in unix timestamp +format, or false.

        + +

        4.21 20 Mar 2004

        + +

        We no longer in SelectLimit for VFP driver add SELECT TOP X unless an ORDER +BY exists.

        + +

        Pim Koeman contributed dutch language file adodb-nl.inc.php.

        + +

        Rick Hickerson added CLOB support to db2 datadict.

        + +

        Added odbtp driver. Thx to "stefan bogdan" sbogdan#rsb.ro.

        + +

        Changed PrepareSP() 2nd parameter, $cursor, to default to true (formerly +false). Fixes oci8 backward compat problems with OUT params.

        + +

        Fixed month calculation error in adodb-time.inc.php. 2102-June-01 appeared +as 2102-May-32.

        + +

        Updated PHP5 RC1 iterator support. API changed, hasMore() renamed to +valid().

        + +

        Changed internal format of serialized cache recordsets. As we store a +version number, this should be backward compatible.

        + +

        Error handling when driver file not found was flawed in ADOLoadCode(). +Fixed.

        + +

        4.20 27 Feb 2004

        + +

        Updated to AXMLS 1.01.

        + +

        MetaForeignKeys for postgres7 modified by Edward Jaramilla, works on pg 7.4. +

        + +

        Now numbers accepts function calls or sequences for +GetInsertSQL/GetUpdateSQL numeric fields.

        + +

        Changed quotes of 'delete from $perf_table' to "". Thx Kehui +(webmaster#kehui.net)

        + +

        Added ServerInfo() for ifx, and putenv trim fix. Thx Fernando Ortiz.

        + +

        Added addq(), which is analogous to addslashes().

        + +

        Tested with php5b4. Fix some php5 compat problems with exceptions and +sybase.

        + +

        Carl-Christian Salvesen added patch to mssql _query to support binds greater +than 4000 chars.

        + +

        Mike suggested patch to PHP5 exception handler. $errno must be numeric.

        + +

        Added double quotes (") to ADODB_TABLE_REGEX.

        + +

        For oci8, Prepare(...,$cursor), $cursor's meaning was accidentally inverted +in 4.11. This causes problems with ExecuteCursor() too, which calls Prepare() +internally. Thx to William Lovaton.

        + +

        Now dateHasTime property in connection object renamed to datetime for +consistency. This could break bc.

        + +

        Csongor Halmai reports that db2 SelectLimit with input array is not working. +Fixed..

        + +

        4.11 27 Jan 2004

        + +

        Csongor Halmai reports db2 binding not working. Reverted back to emulated +binding.

        + +

        Dan Cech modifies datadict code. Adds support for DropIndex. Minor cleanups. +

        + +

        Table misspelt in perf-oci8.inc.php. Changed v$conn_cache_advice to +v$db_cache_advice. Reported by Steve W.

        + +

        UserTimeStamp and DBTimeStamp did not handle YYYYMMDDHHMMSS format properly. +Reported by Mike Muir. Fixed.

        + +

        Changed oci8 Prepare(). Does not auto-allocate OCINewCursor automatically, +unless 2nd param is set to true. This will break backward compat, if +Prepare/Execute is used instead of ExecuteCursor. Reported by Chris Jones.

        + +

        Added InParameter() and OutParameter(). Wrapper functions to Parameter(), +but nicer because they are self-documenting.

        + +

        Added 'R' handling in ActualType() to datadict-mysql.inc.php

        + +

        Added ADOConnection::SerializableRS($rs). Returns a recordset that can be +serialized in a session.

        + +

        Added "Run SQL" to performance UI().

        + +

        Misc spelling corrections in adodb-mysqli.inc.php, adodb-oci8.inc.php and +datadict-oci8.inc.php, from Heinz Hombergs.

        + +

        MetaIndexes() for ibase contributed by Heinz Hombergs.

        + +

        4.10 12 Jan 2004

        + +

        Dan Cech contributed extensive changes to data dictionary to support name +quoting (with `), and drop table/index.

        + +

        Informix added cursorType property. Default remains IFX_SCROLL, but you can +change to 0 (non-scrollable cursor) for performance.

        + +

        Added ADODB_View_PrimaryKeys() for returning view primary keys to +MetaPrimaryKeys().

        + +

        Simplified chinese file, adodb-cn.inc.php from cysoft.

        + +

        Added check for ctype_alnum in adodb-datadict.inc.php. Thx to Jason Judge.

        + +

        Added connection parameter to ibase Prepare(). Fix by Daniel Hassan.

        + +

        Added nameQuote for quoting identifiers and names to connection obj. +Requested by Jason Judge. Also the data dictionary parser now detects `field +name` and generates column names with spaces correctly.

        + +

        BOOL type not recognised correctly as L. Fixed.

        + +

        Fixed paths in ADODB_DIR for session files, and back-ported it to 4.05 (15 +Dec 2003)

        + +

        Added Schema to postgresql MetaTables. Thx to col#gear.hu

        + +

        Empty postgresql recordsets that had blob fields did not set EOF properly. +Fixed.

        + +

        CacheSelectLimit internal parameters to SelectLimit were wrong. Thx to Nio.

        + +

        Modified adodb_pr() and adodb_backtrace() to support command-line usage (eg. +no html).

        + +

        Fixed some fr and it lang errors. Thx to Gaetano G.

        + +

        Added contrib directory, with adodb rs to xmlrpc convertor by Gaetano G.

        + +

        Fixed array recordset bugs when _skiprow1 is true. Thx to Gaetano G.

        + +

        Fixed pivot table code when count is false.

        + +

        4.05 13 Dec 2003

        + +

        Added MetaIndexes to data-dict code - thx to Dan Cech.

        + +

        Rewritten session code by Ross Smith. Moved code to adodb/session directory. +

        + +

        Added function exists check on connecting to most drivers, so we don't crash +with the unknown function error.

        + +

        Smart Transactions failed with GenID() when it no seq table has been created +because the sql statement fails. Fix by Mark Newnham.

        + +

        Added $db->length, which holds name of function that returns strlen.

        + +

        Fixed error handling for bad driver in ADONewConnection - passed too few +params to error-handler.

        + +

        Datadict did not handle types like 16.0 properly in _GetSize. Fixed.

        + +

        Oci8 driver SelectLimit() bug &= instead of =& used. Thx to Swen +Thümmler.

        + +

        Jesse Mullan suggested not flushing outp when output buffering enabled. Due +to Apache 2.0 bug. Added.

        + +

        MetaTables/MetaColumns return ref bug with PHP5 fixed in +adodb-datadict.inc.php.

        + +

        New mysqli driver contributed by Arjen de Rijke. Based on adodb 3.40 driver. +Then jlim added BeginTrans, CommitTrans, RollbackTrans, IfNull, SQLDate. Also +fixed return ref bug.

        + +

        $ADODB_FLUSH added, if true then force flush in debugging outp. Default is +false. In earlier versions, outp defaulted to flush, which is not compat with +apache 2.0.

        + +

        Mysql driver's GenID() function did not work when when sql logging is on. +Fixed.

        + +

        $ADODB_SESSION_TBL not declared as global var. Not available if +adodb-session.inc.php included in function. Fixed.

        + +

        The input array not passed to Execute() in _adodb_getcount(). Fixed.

        + +

        4.04 13 Nov 2003

        + +

        Switched back to foreach - faster than list-each.

        + +

        Fixed bug in ado driver - wiping out $this->fields with date fields.

        + +

        Performance Monitor, View SQL, Explain Plan did not work if +strlen($SQL)>max($_GET length). Fixed.

        + +

        Performance monitor, oci8 driver added memory sort ratio.

        + +

        Added random property, returns SQL to generate a floating point number +between 0 and 1;

        + +

        4.03 6 Nov 2003

        + +

        The path to adodb-php4.inc.php and adodb-iterators.inc.php was not setup +properly.

        + +

        Patched SQLDate in interbase to support hours/mins/secs. Thx to ari +kuorikoski.

        + +

        Force autorollback for pgsql persistent connections - apparently pgsql did +not autorollback properly before 4.3.4. See http://bugs.php.net/bug.php?id=25404 +

        + +

        4.02 5 Nov 2003

        + +

        Some errors in adodb_error_pg() fixed. Thx to Styve.

        + +

        Spurious Insert_ID() error was generated by LogSQL(). Fixed.

        + +

        Insert_ID was interfering with Affected_Rows() and Replace() when LogSQL() +enabled. Fixed.

        + +

        More foreach loops optimized with list/each.

        + +

        Null dates not handled properly in ADO +driver (it becomes 31 Dec 1969!).

        + +

        Heinz Hombergs contributed patches for mysql MetaColumns - adding scale, +made interbase MetaColumns work with firebird/interbase, and added +lang/adodb-de.inc.php.

        + +

        Added INFORMIXSERVER environment variable.

        + +

        Added $ADODB_ANSI_PADDING_OFF for interbase/firebird.

        + +

        PHP 5 beta 2 compat check. Foreach (Iterator) support. Exceptions support.

        + +

        4.01 23 Oct 2003

        + +

        Fixed bug in rs2html(), tohtml.inc.php, that generated blank table cells.

        + +

        Fixed insert_id() incorrectly generated when logsql() enabled.

        + +

        Modified PostgreSQL _fixblobs to use list/each instead of foreach.

        + +

        Informix ErrorNo() implemented correctly.

        + +

        Modified several places to use list/each, including GetRowAssoc().

        + +

        Added UserTimeStamp() to connection class.

        + +

        Added $ADODB_ANSI_PADDING_OFF for oci8po.

        + +

        4.00 20 Oct 2003

        + +

        Upgraded adodb-xmlschema to 1 Oct 2003 snapshot.

        + +

        Fix to rs2html warning message. Thx to Filo.

        + +

        Fix for odbc_mssql/mssql SQLDate(), hours was wrong.

        + +

        Added MetaColumns and MetaPrimaryKeys for sybase. Thx to Chris Phillipson.

        + +

        Added autoquoting to datadict for MySQL and PostgreSQL. Suggestion by +Karsten Dambekalns

        + +

        3.94 11 Oct 2003

        + +

        Create trigger in datadict-oci8.inc.php did not work, because all cr/lf's +must be removed.

        + +

        ErrorMsg()/ErrorNo() did not work for many databases when logging enabled. +Fixed.

        + +

        Removed global variable $ADODB_LOGSQL as it does not work properly with +multiple connections.

        + +

        Added SQLDate support for sybase. Thx to Chris Phillipson

        + +

        Postgresql checking of pgsql resultset resource was incorrect. Fix by Bharat +Mediratta bharat#menalto.com. Same patch applied to _insertid and _affectedrows +for adodb-postgres64.inc.php.

        + +

        Added support for NConnect for postgresql.

        + +

        Added Sybase data dict support. Thx to Chris Phillipson

        + +

        Extensive improvements in $perf->UI(), eg. Explain now opens in new +window, we show scripts which call sql, etc.

        + +

        Perf Monitor UI works with magic quotes enabled.

        + +

        rsPrefix was declared twice. Removed.

        + +

        Oci8 stored procedure support, eg. "begin func(); end;" was +incorrect in _query. Fixed.

        + +

        Tiraboschi Massimiliano contributed italian language file.

        + +

        Fernando Ortiz, fortiz#lacorona.com.mx, contributed informix performance +monitor.

        + +

        Added _varchar (varchar arrays) support for postgresql. Reported by PREVOT +Stéphane.

        + +
        + +
        + +
        + +

        0.10 Sept 9 2000 First release

        + +

        Old change log history moved to old-changelog.htm. +

        + +

         

        + +
        + + + + diff --git a/fannie/adodb5/docs/docs-datadict.htm b/fannie/adodb5/docs/docs-datadict.htm new file mode 100644 index 000000000..ab2880565 --- /dev/null +++ b/fannie/adodb5/docs/docs-datadict.htm @@ -0,0 +1,330 @@ + + + + ADOdb Data Dictionary Manual + + + + +

        ADOdb Data Dictionary Library for PHP

        +

        V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com).
        +AXMLS (c) 2004 ars Cognita, Inc

        +

        This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products.

        + +

        Useful ADOdb links: DownloadOther Docs +

        +

        This documentation describes a PHP class library to automate the +creation of tables, indexes and foreign key constraints portably for +multiple databases. Richard Tango-Lowy and Dan Cech have been kind +enough to contribute AXMLS, an XML schema +system for defining databases. You can contact them at +dcech#phpwerx.net and richtl#arscognita.com.

        +

        Currently the following databases are supported:

        +

        Well-tested: PostgreSQL, MySQL, Oracle, MSSQL.
        +Beta-quality: DB2, Informix, Sybase, Interbase, Firebird.
        +Alpha-quality: MS Access (does not support DEFAULT values) and +generic ODBC. +

        +

        Example Usage

        +
          include_once('adodb.inc.php');
        # First create a normal connection
        $db = NewADOConnection('mysql');
        $db->Connect(...);

        # Then create a data dictionary object, using this connection
        $dict = NewDataDictionary($db);

        # We have a portable declarative data dictionary format in ADOdb, similar to SQL.
        # Field types use 1 character codes, and fields are separated by commas.
        # The following example creates three fields: "col1", "col2" and "col3":

        $flds = "
        col1 C(32) NOTNULL DEFAULT 'abc',
        col2 I DEFAULT 0,
        col3 N(12.2)

        ";

        # We demonstrate creating tables and indexes
        $sqlarray = $dict->CreateTableSQL($tabname, $flds, $taboptarray);
        $dict->ExecuteSQLArray($sqlarray);

        $idxflds = 'co11, col2';
        $sqlarray = $dict->CreateIndexSQL($idxname, $tabname, $idxflds);
        $dict->ExecuteSQLArray($sqlarray);
        +

        More Complex Table Sample

        +

        +The following string will create a table with a primary key event_id and multiple indexes, including one compound index idx_ev1. The ability to define indexes using the INDEX keyword was added in ADOdb 4.94 by Gaetano Giunta. +

        +$flds = "
        +  event_id I(11) NOTNULL AUTOINCREMENT PRIMARY,
        +  event_type I(4) NOTNULL  INDEX idx_evt,
        +  event_start_date T DEFAULT NULL INDEX id_esd,
        +  event_end_date T DEFAULT '0000-00-00 00:00:00' INDEX id_eted,
        +  event_parent I(11) UNSIGNED NOTNULL DEFAULT 0 INDEX id_evp,
        +  event_owner I(11) DEFAULT 0 INDEX idx_ev1,
        +  event_project I(11) DEFAULT 0 INDEX idx_ev1,
        +  event_times_recuring I(11) UNSIGNED NOTNULL DEFAULT 0,
        +  event_icon C(20) DEFAULT 'obj/event',
        +  event_description X
        +";
        +$sqlarray = $db->CreateTableSQL($tablename, $flds);
        +$dict->ExecuteSQLArray($sqlarray);
        +
        +

        Class Factory

        +

        NewDataDictionary($connection, $drivername=false)

        +

        Creates a new data dictionary object. You pass a database connection object in $connection. The $connection does not have to be actually connected to the database. Some database connection objects are generic (eg. odbtp and odbc). Since 4.53, you can tell ADOdb the actual database with $drivername. E.g.

        +
        +$db = NewADOConnection('odbtp');
        +$datadict = NewDataDictionary($db, 'mssql'); # force mssql
        +
        +

        Class Functions

        +

        function CreateDatabase($dbname, $optionsarray=false)

        +

        Create a database with the name $dbname;

        +

        function CreateTableSQL($tabname, $fldarray, $taboptarray=false)

        +
          RETURNS:      an array of strings, the sql to be executed, or false
        $tabname: name of table
        $fldarray: string (or array) containing field info
        $taboptarray: array containing table options
        +

        The new format of $fldarray uses a free text format, where each +field is comma-delimited. +The first token for each field is the field name, followed by the type +and optional +field size. Then optional keywords in $otheroptions:

        +
          "$fieldname $type $colsize $otheroptions"
        +

        The older (and still supported) format of $fldarray is a +2-dimensional array, where each row in the 1st dimension represents one +field. Each row has this format:

        +
          array($fieldname, $type, [,$colsize] [,$otheroptions]*)
        +

        The first 2 fields must be the field name and the field type. The +field type can be a portable type codes or the actual type for that +database.

        +

        Legal portable type codes include:

        +
          C:  Varchar, capped to 255 characters.
        X: Larger varchar, capped to 4000 characters (to be compatible with Oracle).
        XL: For Oracle, returns CLOB, otherwise the largest varchar size.

        C2: Multibyte varchar
        X2: Multibyte varchar (largest size)

        B: BLOB (binary large object)

        D: Date (some databases do not support this, and we return a datetime type)
        T: Datetime or Timestamp accurate to the second.
        TS: Datetime or Timestamp supporting Sub-second accuracy.
        Supported by Oracle, PostgreSQL and SQL Server currently.
        Otherwise equivalent to T.
        + L: Integer field suitable for storing booleans (0 or 1)
        I: Integer (mapped to I4)
        I1: 1-byte integer
        I2: 2-byte integer
        I4: 4-byte integer
        I8: 8-byte integer
        F: Floating point number
        N: Numeric or decimal number
        +

        The $colsize field represents the size of the field. If a decimal +number is used, then it is assumed that the number following the dot is +the precision, so 6.2 means a number of size 6 digits and 2 decimal +places. It is recommended that the default for number types be +represented as a string to avoid any rounding errors.

        +

        The $otheroptions include the following keywords (case-insensitive):

        +
          AUTO            For autoincrement number. Emulated with triggers if not available.
        Sets NOTNULL also.
        AUTOINCREMENT Same as auto.
        KEY Primary key field. Sets NOTNULL also. Compound keys are supported.
        PRIMARY Same as KEY.
        DEF Synonym for DEFAULT for lazy typists.
        DEFAULT The default value. Character strings are auto-quoted unless
        the string begins and ends with spaces, eg ' SYSDATE '.
        NOTNULL If field is not null.
        DEFDATE Set default value to call function to get today's date.
        DEFTIMESTAMP Set default to call function to get today's datetime.
        NOQUOTE Prevents autoquoting of default string values.
        CONSTRAINTS Additional constraints defined at the end of the field
        definition.
        +

        The Data Dictonary accepts two formats, the older array +specification:

        +
          $flds = array(
        array('COLNAME', 'DECIMAL', '8.4', 'DEFAULT' =gt; 0, 'NOTNULL'),
        array('id', 'I' , 'AUTO'),
        array('`MY DATE`', 'D' , 'DEFDATE'),
        array('NAME', 'C' , '32', 'CONSTRAINTS' =gt; 'FOREIGN KEY REFERENCES reftable')
        );
        +

        Or the simpler declarative format:

        +
          $flds = "
        COLNAME DECIMAL(8.4) DEFAULT 0 NOTNULL,
        id I AUTO,
        `MY DATE` D DEFDATE,
        NAME C(32) CONSTRAINTS 'FOREIGN KEY REFERENCES reftable'

        ";
        +

        Note that if you have special characters in the field name (e.g. My +Date), you should enclose it in back-quotes. Normally field names are +not case-sensitive, but if you enclose it in back-quotes, some +databases will treat the names as case-sensitive (eg. Oracle) , and +others won't. So be careful.

        +

        The $taboptarray is the 3rd parameter of the CreateTableSQL +function. This contains table specific settings. Legal keywords include:

        +
          +
        • REPLACE
          +Indicates that the previous table definition should be removed +(dropped)together with ALL data. See first example below.
        • +
        • DROP
          +Drop table. Useful for removing unused tables.
        • +
        • CONSTRAINTS
          +Define this as the key, with the constraint as the value. See the +postgresql example below. Additional constraints defined for the whole +table. You will probably need to prefix this with a comma.
        • +
        +

        Database specific table options can be defined also using the name +of the database type as the array key. In the following example, create +the table as ISAM with MySQL, and store the table in the "users" +tablespace if using Oracle. And because we specified REPLACE, drop +the table first.

        +
          $taboptarray = array('mysql' =gt; 'TYPE=ISAM', 'oci8' =gt; 'tablespace users', 'REPLACE');
        +

        You can also define foreign key constraints. The following is syntax +for postgresql: +

        +
          $taboptarray = array('constraints' =gt; ', FOREIGN KEY (col1) REFERENCES reftable (refcol)');
        +

        function DropTableSQL($tabname)

        +

        Returns the SQL to drop the specified table.

        +

        function ChangeTableSQL($tabname, $flds, $tableOptions=false, $dropOldFlds=false)

        +

        Checks to see if table exists, if table does not exist, behaves like +CreateTableSQL. If table exists, generates appropriate ALTER TABLE +MODIFY COLUMN commands if field already exists, or ALTER TABLE ADD +$column if field does not exist.

        +

        The class must be connected to the database for ChangeTableSQL to +detect the existence of the table. Idea and code contributed by Florian +Buzin.

        +

        Old fields not defined in $flds are not dropped by default. To drop old fields, set $dropOldFlds to true. +

        function RenameTableSQL($tabname,$newname)

        +

        Rename a table. Returns the an array of strings, which is the SQL required to rename a table. Since ADOdb 4.53. Contributed by Ralf Becker.

        +

        function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='')

        +

        Rename a table field. Returns the an array of strings, which is the SQL required to rename a column. The optional $flds is a complete column-defintion-string like for AddColumnSQL, only used by mysql at the moment. Since ADOdb 4.53. Contributed by Ralf Becker.

        +

        function CreateIndexSQL($idxname, $tabname, $flds, +$idxoptarray=false)

        +
          RETURNS:      an array of strings, the sql to be executed, or false
        $idxname: name of index
        $tabname: name of table
        $flds: list of fields as a comma delimited string or an array of strings
        $idxoptarray: array of index creation options
        +

        $idxoptarray is similar to $taboptarray in that index specific +information can be embedded in the array. Other options include:

        +
          CLUSTERED     Create clustered index (only mssql)
        BITMAP Create bitmap index (only oci8)
        UNIQUE Make unique index
        FULLTEXT Make fulltext index (only mysql)
        HASH Create hash index (only postgres)
        DROP Drop legacy index
        +

        function DropIndexSQL ($idxname, $tabname = NULL)

        +

        Returns the SQL to drop the specified index.

        +

        function AddColumnSQL($tabname, $flds)

        +

        Add one or more columns. Not guaranteed to work under all situations.

        +

        function AlterColumnSQL($tabname, $flds)

        +

        Warning, not all databases support this feature.

        +

        function DropColumnSQL($tabname, $flds)

        +

        Drop 1 or more columns.

        +

        function SetSchema($schema)

        +

        Set the schema.

        +

        function MetaTables()

        +

        function MetaColumns($tab, $upper=true, $schema=false)

        +

        function MetaPrimaryKeys($tab,$owner=false,$intkey=false)

        +

        function MetaIndexes($table, $primary = false, $owner = false)

        +

        These functions are wrappers for the corresponding functions in the +connection object. However, the table names will be autoquoted by the +TableName function (see below) before being passed to the connection +object.

        +

        function NameQuote($name = NULL)

        +

        If the provided name is quoted with backquotes (`) or contains +special characters, returns the name quoted with the appropriate quote +character, otherwise the name is returned unchanged.

        +

        function TableName($name)

        +

        The same as NameQuote, but will prepend the current schema if +specified

        +

        function MetaType($t,$len=-1,$fieldobj=false)

        +

        function ActualType($meta)

        +

        Convert between database-independent 'Meta' and database-specific +'Actual' type codes.

        +

        function ExecuteSQLArray($sqlarray, $contOnError = true)

        +
          RETURNS:      0 if failed, 1 if executed all but with errors, 2 if executed successfully
        $sqlarray: an array of strings with sql code (no semicolon at the end of string)
        $contOnError: if true, then continue executing even if error occurs
        +

        Executes an array of SQL strings returned by CreateTableSQL or +CreateIndexSQL.

        +
        + +

        ADOdb XML Schema (AXMLS)

        +

        This is a class contributed by Richard Tango-Lowy and Dan Cech that +allows the user to quickly +and easily build a database using the excellent ADODB database library +and a simple XML formatted file. +You can download +the latest version of AXMLS here.

        +

        Quick Start

        +

        Adodb-xmlschema, or AXMLS, is a set of classes that allow the user +to quickly and easily build or upgrade a database on almost any RDBMS +using the excellent ADOdb database library and a simple XML formatted +schema file. Our goal is to give developers a tool that's simple to +use, but that will allow them to create a single file that can build, +upgrade, and manipulate databases on most RDBMS platforms.

        + Installing axmls +

        The easiest way to install AXMLS to download and install any recent +version of the ADOdb database abstraction library. To install AXMLS +manually, simply copy the adodb-xmlschema.inc.php file and the xsl +directory into your adodb directory.

        + Using AXMLS in Your Application +

        There are two steps involved in using AXMLS in your application: +first, you must create a schema, or XML representation of your +database, and second, you must create the PHP code that will parse and +execute the schema.

        +

        Let's begin with a schema that describes a typical, if simplistic +user management table for an application.

        +
        <?xml version="1.0"?>
        <schema version="0.2">

        <table name="users">
        <desc>A typical users table for our application.</desc>
        <field name="userId" type="I">
        <descr>A unique ID assigned to each user.</descr>

        <KEY/>
        <AUTOINCREMENT/>
        </field>

        <field name="userName" type="C" size="16"><NOTNULL/></field>


        <index name="userName">
        <descr>Put a unique index on the user name</descr>
        <col>userName</col>
        <UNIQUE/>

        </index>
        </table>

        <sql>
        <descr>Insert some data into the users table.</descr>
        <query>insert into users (userName) values ( 'admin' )</query>

        <query>insert into users (userName) values ( 'Joe' )</query>
        </sql>
        </schema>
        +

        Let's take a detailed look at this schema.

        +

        The opening <?xml version="1.0"?> tag is required by XML. The +<schema> tag tells the parser that the enclosed markup defines an +XML schema. The version="0.2" attribute sets the version of the +AXMLS DTD used by the XML schema.

        +

        All versions of AXMLS prior to version 1.0 have a schema version of +"0.1". The current schema version is "0.2".

        +
        <?xml version="1.0"?>
        <schema version="0.2">
        ...
        </schema>
        +

        Next we define one or more tables. A table consists of a fields (and +other objects) enclosed by <table> tags. The name="" attribute +specifies the name of the table that will be created in the database.

        +
        <table name="users">

        <desc>A typical users table for our application.</desc>
        <field name="userId" type="I">

        <descr>A unique ID assigned to each user.</descr>
        <KEY/>
        <AUTOINCREMENT/>
        </field>

        <field name="userName" type="C" size="16"><NOTNULL/></field>


        </table>
        +

        This table is called "users" and has a description and two fields. +The description is optional, and is currently only for your own +information; it is not applied to the database.

        +

        The first <field> tag will create a field named "userId" of +type "I", or integer. (See the ADOdb Data Dictionary documentation for +a list of valid types.) This <field> tag encloses two special +field options: <KEY/>, which specifies this field as a primary +key, and <AUTOINCREMENT/>, which specifies that the database +engine should automatically fill this field with the next available +value when a new row is inserted.

        +

        The second <field> tag will create a field named "userName" of +type "C", or character, and of length 16 characters. The +<NOTNULL/> option specifies that this field does not allow NULLs.

        +

        There are two ways to add indexes to a table. The simplest is to +mark a field with the <KEY/> option as described above; a primary +key is a unique index. The second and more powerful method uses the +<index> tags.

        +
        <table name="users">
        ...

        <index name="userName">
        <descr>Put a unique index on the user name</descr>
        <col>userName</col>

        <UNIQUE/>
        </index>

        </table>
        +

        The <index> tag specifies that an index should be created on +the enclosing table. The name="" attribute provides the name of the +index that will be created in the database. The description, as above, +is for your information only. The <col> tags list each column +that will be included in the index. Finally, the <UNIQUE/> tag +specifies that this will be created as a unique index.

        +

        Finally, AXMLS allows you to include arbitrary SQL that will be +applied to the database when the schema is executed.

        +
        <sql>
        <descr>Insert some data into the users table.</descr>
        <query>insert into users (userName) values ( 'admin' )</query>

        <query>insert into users (userName) values ( 'Joe' )</query>
        </sql>
        +

        The <sql> tag encloses any number of SQL queries that you +define for your own use.

        +

        Now that we've defined an XML schema, you need to know how to apply +it to your database. Here's a simple PHP script that shows how to load +the schema.

        +
        <?PHP
        /* You must tell the script where to find the ADOdb and
        * the AXMLS libraries.
        */ +require( "path_to_adodb/adodb.inc.php"); +require( "path_to_adodb/adodb-xmlschema.inc.php" ); # or adodb-xmlschema03.inc.php + +/* Configuration information. Define the schema filename,
        * RDBMS platform (see the ADODB documentation for valid
        * platform names), and database connection information here.
        */
        $schemaFile = 'example.xml';
        $platform = 'mysql';
        $dbHost = 'localhost';
        $dbName = 'database';
        $dbUser = 'username';
        $dbPassword = 'password';

        /* Start by creating a normal ADODB connection.
        */
        $db = ADONewConnection( $platform );
        $db->Connect( $dbHost, $dbUser, $dbPassword, $dbName );

        /* Use the database connection to create a new adoSchema object.
        */
        $schema = new adoSchema( $db );

        /* Call ParseSchema() to build SQL from the XML schema file.
        * Then call ExecuteSchema() to apply the resulting SQL to
        * the database.
        */
        $sql = $schema->ParseSchema( $schemaFile );
        $result = $schema->ExecuteSchema();
        ?>
        +

        Let's look at each part of the example in turn. After you manually +create the database, there are three steps required to load (or +upgrade) your schema.

        +

        First, create a normal ADOdb connection. The variables and values +here should be those required to connect to your database.

        +
        $db = ADONewConnection( 'mysql' );
        $db->Connect( 'host', 'user', 'password', 'database' );
        +

        Second, create the adoSchema object that load and manipulate your +schema. You must pass an ADOdb database connection object in order to +create the adoSchema object.

        +
        $schema = new adoSchema( $db );
        +

        Third, call ParseSchema() to parse the schema and then +ExecuteSchema() to apply it to the database. You must pass +ParseSchema() the path and filename of your schema file.

        +
        $schema->ParseSchema( $schemaFile ); 
        $schema->ExecuteSchema();
        +

        Execute the above code and then log into your database. If you've +done all this right, you should see your tables, indexes, and SQL.

        +

        You can find the source files for this tutorial in the examples +directory as tutorial_shema.xml and tutorial.php. See the class +documentation for a more detailed description of the adoSchema methods, +including methods and schema elements that are not described in this +tutorial.

        +

        XML Schema Version 3

        +

        In March 2006, we added adodb-xmlschema03.inc.php to the release, which supports version 3 of XML Schema. +The adodb-xmlschema.inc.php remains the same as previous releases, and supports version 2 of XML Schema. +Version 3 provides some enhancements: + +

          +
        • Support for updating table data during an upgrade. +
        • Support for platform-specific table options and platform negation. +
        • Support for unsigned fields. +
        • Fixed opt and constraint support +
        • Many other fixes such as OPT tag, which allows you to set optional platform settings: +
        + +

        Example usage: +

        <?xml version="1.0"?>
        +<schema version="0.3">
        + <table name="ats_kb">
        +  <descr>ATS KnowledgeBase</descr>
        +  <opt platform="mysql">TYPE=INNODB</opt>
        +  <field name="recid" type="I"/>
        +  <field name="organization_code" type="I4"/> 
        +  <field name="sub_code" type="C" size="20"/>
        +  etc...
        +
        +

        To use it, change your code to include adodb-xmlschema03.inc.php. + +

        Upgrading

        +

        +If your schema version is older, than XSLT is used to transform the +schema to the newest version. This means that if you are using an older +XML schema format, you need to have the XSLT extension installed. +If you do not want to require your users to have the XSLT extension +installed, make sure you modify your XML schema to conform to the +latest version. +


        +
        If you have any questions or comments, please email them to +Richard at richtl#arscognita.com. +
        + + diff --git a/fannie/adodb5/docs/docs-oracle.htm b/fannie/adodb5/docs/docs-oracle.htm new file mode 100644 index 000000000..3ee27aae2 --- /dev/null +++ b/fannie/adodb5/docs/docs-oracle.htm @@ -0,0 +1,542 @@ + + + + +ADOdb with PHP and Oracle + + + + + +
        +

        Using ADOdb with PHP and Oracle: an advanced tutorial

        +
        +

        (c)2004-2005 John Lim. All rights reserved.

        +

        1. Introduction

        +

        Oracle is the most popular commercial database used with PHP. There are many ways of accessing Oracle databases in PHP. These include:

        +
          +
        • The oracle extension
        • +
        • The oci8 extension
        • +
        • PEAR DB library
        • +
        • ADOdb library
        • +
        +

        The wide range of choices is confusing to someone just starting with Oracle and PHP. I will briefly summarize the differences, and show you the advantages of using ADOdb.

        +

        First we have the C extensions which provide low-level access to Oracle functionality. These C extensions are precompiled into PHP, or linked in dynamically when the web server starts up. Just in case you need it, here's a guide to installing Oracle and PHP on Linux.

        + + + + + + + + + +
        Oracle extensionDesigned for Oracle 7 or earlier. This is obsolete.
        Oci8 extension Despite it's name, which implies it is only for Oracle 8i, this is the standard method for accessing databases running Oracle 8i, 9i or 10g (and later).
        +

        Here is an example of using the oci8 extension to query the emp table of the scott schema with bind parameters: +

        +$conn = OCILogon("scott","tiger", $tnsName); 
        +
        +$stmt = OCIParse($conn,"select * from emp where empno > :emp order by empno"); 
        +$emp = 7900;
        +OCIBindByName($stmt, ':emp', $emp);
        +$ok = OCIExecute($stmt);
        +while (OCIFetchInto($stmt,$arr)) {
        +	print_r($arr);
        +	echo "<hr>";	
        +} 
        +
        +

        This generates the following output: +

        +Array ( [0] => 7902 [1] => FORD [2] => ANALYST [3] => 7566 [4] => 03/DEC/81 [5] => 3000 [7] => 20 ) +
        + Array ( [0] => 7934 [1] => MILLER [2] => CLERK [3] => 7782 [4] => 23/JAN/82 [5] => 1300 [7] => 10 ) +
        +

        We also have many higher level PHP libraries that allow you to simplify the above code. The most popular are PEAR DB and ADOdb. Here are some of the differences between these libraries:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        FeaturePEAR DB 1.6ADOdb 4.52
        General StyleSimple, easy to use. Lacks Oracle specific functionality.Has multi-tier design. Simple high-level design for beginners, and also lower-level advanced Oracle functionality.
        Support for PrepareYes, but only on one statement, as the last prepare overwrites previous prepares.Yes (multiple simultaneous prepare's allowed)
        Support for LOBsNoYes, using update semantics
        Support for REF CursorsNoYes
        Support for IN ParametersYesYes
        Support for OUT ParametersNoYes
        Schema creation using XMLNoYes, including ability to define tablespaces and constraints
        Provides database portability featuresNoYes, has some ability to abstract features that differ between databases such as dates, bind parameters, and data types.
        Performance monitoring and tracingNoYes. SQL can be traced and linked to web page it was executed on. Explain plan support included.
        Recordset caching for frequently used queriesNoYes. Provides great speedups for SQL involving complex where, group-by and order-by clauses.
        PopularityYes, part of PEAR releaseYes, many open source projects are using this software, including PostNuke, Xaraya, Mambo, Tiki Wiki.
        SpeedMedium speed.Very high speed. Fastest database abstraction library available for PHP. Benchmarks are available.
        High Speed Extension availableNoYes. You can install the optional ADOdb extension, which reimplements the most frequently used parts of ADOdb as fast C code. Note that the source code version of ADOdb runs just fine without this extension, and only makes use of the extension if detected.
        +

        PEAR DB is good enough for simple web apps. But if you need more power, you can see ADOdb offers more sophisticated functionality. The rest of this article will concentrate on using ADOdb with Oracle. You can find out more about connecting to Oracle later in this guide.

        +

        ADOdb Example

        +

        In ADOdb, the above oci8 example querying the emp table could be written as:

        +
        +include "/path/to/adodb.inc.php";
        +$db = NewADOConnection("oci8");
        +$db->Connect($tnsName, "scott", "tiger");
        +
        +$rs = $db->Execute("select * from emp where empno>:emp order by empno", 
        +                    array('emp' => 7900));
        +while ($arr = $rs->FetchRow()) {
        +    print_r($arr);
        +	echo "<hr>";
        +}
        +
        +

        The Execute( ) function returns a recordset object, and you can retrieve the rows returned using $recordset->FetchRow( ).

        +

        If we ignore the initial connection preamble, we can see the ADOdb version is much easier and simpler:

        + + + + + + + + + +
        Oci8ADOdb
        $stmt = OCIParse($conn,
        +       "select * from emp where empno > :emp"); 
        +$emp = 7900;
        +OCIBindByName($stmt, ':emp', $emp);
        +$ok = OCIExecute($stmt);
        +
        +while (OCIFetchInto($stmt,$arr)) {
        +	print_r($arr);
        +	echo "<hr>";	
        +} 
        $recordset = $db->Execute("select * from emp where empno>:emp", 
        +                           array('emp' => 7900));
        +
        +while ($arr = $recordset->FetchRow()) {
        +	print_r($arr);
        +	echo "<hr>";
        +}
        +

         

        +

        2. ADOdb Query Semantics

        +

        You can also query the database using the standard Microsoft ADO MoveNext( ) metaphor. The data array for the current row is stored in the fields property of the recordset object, $rs. +MoveNext( ) offers the highest performance among all the techniques for iterating through a recordset: +

        +$rs = $db->Execute("select * from emp where empno>:emp", array('emp' => 7900));
        +while (!$rs->EOF) {
        +	print_r($rs->fields);
        +	$rs->MoveNext();
        +}
        +
        +

        And if you are interested in having the data returned in a 2-dimensional array, you can use: +

        +$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
        +
        +

        Now to obtain only the first row as an array: +

        +$arr = $db->GetRow("select * from emp where empno=:emp", array('emp' => 7900));
        +
        +

        Or to retrieve only the first field of the first row: +

        +$arr = $db->GetOne("select ename from emp where empno=:emp", array('emp' => 7900));
        +
        +

        For easy pagination support, we provide the SelectLimit function. The following will perform a select query, limiting it to 100 rows, starting from row 201 (row 1 being the 1st row): +

        +$offset = 200; $limitrows = 100;
        +$rs = $db->SelectLimit('select * from table', $limitrows, $offset);
        +
        +

        The $offset parameter is optional. +

        Array Fetch Mode

        +

        When data is being returned in an array, you can choose the type of array the data is returned in. +

          +
        1. Numeric indexes - use $connection->SetFetchMode(ADODB_FETCH_NUM).
        2. +
        3. Associative indexes - the keys of the array are the names of the fields (in upper-case). Use $connection->SetFetchMode(ADODB_FETCH_ASSOC).
        4. +
        5. Both numeric and associative indexes - use $connection->SetFetchMode(ADODB_FETCH_BOTH).
        6. +
        +

        The default is ADODB_FETCH_BOTH for Oracle.

        +

        Caching

        +

        You can define a database cache directory using $ADODB_CACHE_DIR, and cache the results of frequently used queries that rarely change. This is particularly useful for SQL with complex where clauses and group-by's and order-by's. It is also good for relieving heavily-loaded database servers.

        +

        This example will cache the following select statement for 3600 seconds (1 hour):

        +
        +$ADODB_CACHE_DIR = '/var/adodb/tmp';
        +$rs = $db->CacheExecute(3600, "select names from allcountries order by 1");
        +
        +There are analogous CacheGetArray( +), CacheGetRow( ), CacheGetOne( ) and CacheSelectLimit( ) functions. The first parameter is the number of seconds to cache. You can also pass a bind array as a 3rd parameter (not shown above). +

        There is an alternative syntax for the caching functions. The first parameter is omitted, and you set the cacheSecs + property of the connection object: +

        +$ADODB_CACHE_DIR = '/var/adodb/tmp';
        +$connection->cacheSecs = 3600;
        +$rs = $connection->CacheExecute($sql, array('id' => 1));
        +
        +

         

        +

        3. Using Prepare( ) For Frequently Used Statements

        +

        Prepare( ) is for compiling frequently used SQL statement for reuse. For example, suppose we have a large array which needs to be inserted into an Oracle database. The following will result in a massive speedup in query execution (at least 20-40%), as the SQL statement only needs to be compiled once:

        +
        +$stmt = $db->Prepare('insert into table (field1, field2) values (:f1, :f2)');
        +foreach ($arrayToInsert as $key => $value) {
        +	$db->Execute($stmt, array('f1' => $key, 'f2' => $val);
        +}
        +
        +

         

        +

        4. Working With LOBs

        +

        Oracle treats data which is more than 4000 bytes in length specially. These are called Large Objects, or LOBs for short. Binary LOBs are BLOBs, and character LOBs are CLOBs. In most Oracle libraries, you need to do a lot of work to process LOBs, probably because Oracle designed it to work in systems with little memory. ADOdb tries to make things easy by assuming the LOB can fit into main memory.

        +

        ADOdb will transparently handle LOBs in select statements. The LOBs are automatically converted to PHP variables without any special coding.

        +

        For updating records with LOBs, the functions UpdateBlob( ) and UpdateClob( ) are provided. Here's a BLOB example. The parameters should be self-explanatory: +

        +$ok = $db->Execute("insert into aTable (id, name, ablob) 
        +                                values (aSequence.nextVal, 'Name', null)");
        +if (!$ok) return LogError($db->ErrorMsg());
        +# params: $tableName, $blobFieldName, $blobValue, $whereClause
        +$db->UpdateBlob('aTable', 'ablob', $blobValue, 'id=aSequence.currVal');
        +
        +

        and the analogous CLOB example: +

        +$ok = $db->Execute("insert into aTable (id, name, aclob) 
        +                                values (aSequence.nextVal, 'Name', null)");
        +if (!$ok) return LogError($db->ErrorMsg());
        +$db->UpdateClob('aTable', 'aclob', $clobValue, 'id=aSequence.currVal');
        +
        +

        Note that LogError( ) is a user-defined function, and not part of ADOdb. +

        Inserting LOBs is more complicated. Since ADOdb 4.55, we allow you to do this + (assuming that the photo field is a BLOB, and we want to store $blob_data into + this field, and the primary key is the id field): +

        +	$sql = "INSERT INTO photos ( ID, photo) ".
        +			"VALUES ( :id, empty_blob() )".
        +			" RETURNING photo INTO :xx";
        +
        + 		$stmt = $db->PrepareSP($sql);
        +		$db->InParameter($stmt, $id, 'id');
        +		$blob = $db->InParameter($stmt, $blob_data, 'xx',-1, OCI_B_BLOB);
        +		$db->StartTrans();
        +		$ok = $db->Execute($stmt);
        +		$db->CompleteTrans();
        +
        +

        +

        5. REF CURSORs

        +

        Oracle recordsets can be passed around as variables called REF Cursors. For example, in PL/SQL, we could define a function open_tab that returns a REF CURSOR in the first parameter:

        +
        +TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
        +
        +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS
        +	BEGIN
        +		OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
        +	END open_tab;
        +
        +

        In ADOdb, we could access this REF Cursor using the ExecuteCursor() function. The following will find + all table names that begin with 'A' in the current schema: +

        +$rs = $db->ExecuteCursor("BEGIN open_tab(:refc,'A%'); END;",'refc');
        +while ($arr = $rs->FetchRow()) print_r($arr);
        +
        +

        The first parameter is the PL/SQL statement, and the second parameter is the name of the REF Cursor. +

        +

         

        +

        6. In and Out Parameters

        +

        The following PL/SQL +stored procedure requires an input variable, and returns a result into an output variable: +

        +PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS
        +	BEGIN
        +		output := 'I love '||input;
        +	END;
        +
        +

        The following ADOdb code allows you to call the stored procedure:

        +
        +$stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;");
        +$input = 'Sophia Loren';
        +$db->InParameter($stmt,$input,'a1');
        +$db->OutParameter($stmt,$output,'a2');
        +$ok = $db->Execute($stmt);
        +if ($ok) echo ($output == 'I love Sophia Loren') ? 'OK' : 'Failed';
        +
        +

        PrepareSP( ) is a special function that knows about bind parameters. +The main limitation currently is that IN OUT parameters do not work. +

        Bind Parameters and REF CURSORs

        +

        We could also rewrite the REF CURSOR example to use InParameter (requires ADOdb 4.53 or later): +

        +$stmt = $db->PrepareSP("BEGIN adodb.open_tab(:refc,:tabname); END;");
        +$input = 'A%';
        +$db->InParameter($stmt,$input,'tabname');
        +$rs = $db->ExecuteCursor($stmt,'refc');
        +while ($arr = $rs->FetchRow()) print_r($arr);
        +
        +

        Bind Parameters and LOBs

        +

        You can also operate on LOBs. In this example, we have IN and OUT parameters using CLOBs. +

        +	$text = 'test test test';
        +	$sql = "declare rs clob; begin :rs := lobinout(:sa0); end;";
        +	$stmt = $conn -> PrepareSP($sql);
        +	$conn -> InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB); # -1 means variable length
        +	$rs = '';
        +	$conn -> OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB);
        +	$conn -> Execute($stmt);
        +	echo "return = ".$rs."<br>";
        +
        +

        Similarly, you can use the constant OCI_B_BLOB to indicate that you are using BLOBs. +

        Reusing Bind Parameters with CURSOR_SHARING=FORCE

        +

        Many web programmers do not care to use bind parameters, and prefer to enter the SQL directly. So instead of:

        +
        +$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
        +
        +

        They prefer entering the values inside the SQL: +

        +$arr = $db->GetArray("select * from emp where empno>7900");
        +
        +

        This reduces Oracle performance because Oracle will reuse compiled SQL which is identical to previously compiled SQL. The above example with the values inside the SQL +is unlikely to be reused. As an optimization, from Oracle 8.1 onwards, you can set the following session parameter after you login: +

        +ALTER SESSION SET CURSOR_SHARING=FORCE
        +
        +

        This will force Oracle to convert all such variables (eg. the 7900 value) into constant bind parameters, improving SQL reuse.

        +

        More speedup tips.

        +

         

        +

        7. Dates and Datetime in ADOdb

        +

        There are two things you need to know about dates in ADOdb.

        +

        First, to ensure cross-database compability, ADOdb assumes that dates are returned in ISO format (YYYY-MM-DD H24:MI:SS).

        +

        Secondly, since Oracle treats dates and datetime as the same data type, we decided not to display the time in the default date format. So on login, ADOdb will set the NLS_DATE_FORMAT to 'YYYY-MM-DD'. If you prefer to show the date and time by default, do this:

        +
        +$db = NewADOConnection('oci8');
        +$db->NLS_DATE_FORMAT =  'RRRR-MM-DD HH24:MI:SS';
        +$db->Connect($tns, $user, $pwd);
        +
        +

        Or execute:

        +
        $sql = quot;ALTER SESSION SET NLS_DATE_FORMAT = 'RRRR-MM-DD HH24:MI:SS'";
        +$db->Execute($sql);
        +
        +

        If you are not concerned about date portability and do not use ADOdb's portability layer, you can use your preferred date format instead. +

        +

        8. Database Portability Layer

        +

        ADOdb provides the following functions for portably generating SQL functions + as strings to be merged into your SQL statements:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        FunctionDescription
        DBDate($date)Pass in a UNIX timestamp or ISO date and it will convert it to a date + string formatted for INSERT/UPDATE
        DBTimeStamp($date)Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp + string formatted for INSERT/UPDATE
        SQLDate($date, $fmt)Portably generate a date formatted using $fmt mask, for use in SELECT + statements.
        OffsetDate($date, $ndays)Portably generate a $date offset by $ndays.
        Concat($s1, $s2, ...)Portably concatenate strings. Alternatively, for mssql use mssqlpo driver, + which allows || operator.
        IfNull($fld, $replaceNull)Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.
        Param($name)Generates bind placeholders, using ? or named conventions as appropriate.
        $db->sysDateProperty that holds the SQL function that returns today's date
        $db->sysTimeStampProperty that holds the SQL function that returns the current +timestamp (date+time). +
        $db->concat_operatorProperty that holds the concatenation operator +
        $db->lengthProperty that holds the name of the SQL strlen function. +
        $db->upperCaseProperty that holds the name of the SQL strtoupper function. +
        $db->randomProperty that holds the SQL to generate a random number between 0.00 and 1.00. +
        $db->substrProperty that holds the name of the SQL substring function. +
        +

        ADOdb also provides multiple oracle oci8 drivers for different scenarios:

        + + + + + + + + + + + + + + + + + +
        Driver NameDescription
        oci805 Specifically for Oracle 8.0.5. This driver has a slower SelectLimit( ).
        oci8The default high performance driver. The keys of associative arrays returned in a recordset are upper-case.
        oci8po The portable Oracle driver. Slightly slower than oci8. This driver uses ? instead of :bindvar for binding variables, which is the standard for other databases. Also the keys of associative arrays are in lower-case like other databases.
        +

        Here's an example of calling the oci8po driver. Note that the bind variables use question-mark:

        +
        $db = NewADOConnection('oci8po');
        +$db->Connect($tns, $user, $pwd);
        +$db->Execute("insert into atable (f1, f2) values (?,?)", array(12, 'abc'));
        +

          +

        9. Connecting to Oracle

        +

        Before you can use ADOdb, you need to have the Oracle client installed and setup the oci8 extension. This extension comes pre-compiled for Windows (but you still need to enable it in the php.ini file). For information on compiling the oci8 extension for PHP and Apache on Unix, there is an excellent guide at oracle.com.

        +

        Should You Use Persistent Connections

        +

        One question that is frequently asked is should you use persistent connections to Oracle. Persistent connections allow PHP to recycle existing connections, reusing them after the previous web pages have completed. Non-persistent connections close automatically after the web page has completed. Persistent connections are faster because the cost of reconnecting is expensive, but there is additional resource overhead. As an alternative, Oracle allows you to pool and reuse server processes; this is called Shared Server (also known as MTS).

        +

        The author's benchmarks suggest that using non-persistent connections and the Shared Server configuration offer the best performance. If Shared Server is not an option, only then consider using persistent connections.

        +

        Connection Examples

        +

        Just in case you are having problems connecting to Oracle, here are some examples:

        +

        a. PHP and Oracle reside on the same machine, use default SID, with non-persistent connections:

        +
        	$conn = NewADOConnection('oci8');
        +	$conn->Connect(false, 'scott', 'tiger');
        +

        b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS', using persistent connections:

        +
        	$conn = NewADOConnection('oci8');
        +	$conn->PConnect(false, 'scott', 'tiger', 'myTNS');
        +

        or

        +
         	$conn->PConnect('myTNS', 'scott', 'tiger');
        +

        c. Host Address and SID

        +
        +	$conn->connectSID = true;	
        +	$conn->Connect('192.168.0.1', 'scott', 'tiger', 'SID');
        +

        d. Host Address and Service Name

        +
        	$conn->Connect('192.168.0.1', 'scott', 'tiger', 'servicename');
        +

        e. Oracle connection string: +

        	$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))
        +			(CONNECT_DATA=(SID=$sid)))";
        +	$conn->Connect($cstr, 'scott', 'tiger');
        +
        +

        f. ADOdb data source names (dsn): +

        +	$dsn = 'oci8://user:pwd@tnsname/?persist';  # persist is optional
        +	$conn = ADONewConnection($dsn);  # no need for Connect/PConnect
        +	
        +	$dsn = 'oci8://user:pwd@host/sid';
        +	$conn = ADONewConnection($dsn);
        +	
        +	$dsn = 'oci8://user:pwd@/';   # oracle on local machine
        +	$conn = ADONewConnection($dsn);
        +

        With ADOdb data source names, +you don't have to call Connect( ) or PConnect( ). +

        +

         

        +

        10. Error Checking

        +

        The examples in this article are easy to read but a bit simplistic because we ignore error-handling. Execute( ) and Connect( ) will return false on error. So a more realistic way to call Connect( ) and Execute( ) is: +

        function InvokeErrorHandler()
        +{
        global $db; ## assume global + MyLogFunction($db->ErrorNo(), $db->ErrorMsg()); +} +if (!$db->Connect($tns, $usr, $pwd)) InvokeErrorHandler(); + +$rs = $db->Execute("select * from emp where empno>:emp order by empno", + array('emp' => 7900)); +if (!$rs) return InvokeErrorHandler(); +while ($arr = $rs->FetchRow()) { + print_r($arr); + echo "<hr>"; +} +
        +

        You can retrieve the error message and error number of the last SQL statement executed from ErrorMsg( ) and ErrorNo( ). You can also define a custom error handler function. +ADOdb also supports throwing exceptions in PHP5. +

         

        +

        Handling Large Recordsets (added 27 May 2005)

        +The oci8 driver does not support counting the number of records returned in a SELECT statement, so the function RecordCount() +is emulated when the global variable $ADODB_COUNTRECS is set to true, which is the default. +We emulate this by buffering all the records. This can take up large amounts of memory for big recordsets. + Set $ADODB_COUNTRECS to false for the best performance. +

        +This variable is checked every time a query is executed, so you can selectively choose which recordsets to count. +

         

        +

        11. Other ADOdb Features

        +

        Schema generation. This allows you to define a schema using XML and import it into different RDBMS systems portably.

        +

        Performance monitoring and tracing. Highlights of performance monitoring include identification of poor and suspicious SQL, with explain plan support, and identifying which web pages the SQL ran on.

        +

         

        +

        12. Download

        +

        You can download ADOdb from sourceforge. ADOdb uses a BSD style license. That means that it is free for commercial use, and redistribution without source code is allowed.

        +

         

        +

        13. Resources

        + + + diff --git a/fannie/adodb5/docs/docs-perf.htm b/fannie/adodb5/docs/docs-perf.htm new file mode 100644 index 000000000..fad67c761 --- /dev/null +++ b/fannie/adodb5/docs/docs-perf.htm @@ -0,0 +1,965 @@ + + + + ADOdb Performance Monitoring Library + + + +

        The ADOdb Performance Monitoring Library

        +

        V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com)

        +

        This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products.

        +

        Useful ADOdb links: DownloadOther Docs +

        +

        Introduction

        +

        This module, part of the ADOdb package, provides both CLI and HTML +interfaces for viewing key performance indicators of your database. +This is very useful because web apps such as the popular phpMyAdmin +currently do not provide effective database health monitoring tools. +The module provides the following:

        +
          +
        • A quick health check of your database server using $perf->HealthCheck() +or $perf->HealthCheckCLI().
        • +
        • User interface for performance monitoring, $perf->UI(). +This UI displays: +
            +
          • the health check,
          • +
          • all SQL logged and their query plans,
          • +
          • a list of all tables in the current database
          • +
          • an interface to continiously poll the server for key +performance indicators such as CPU, Hit Ratio, Disk I/O
          • +
          • a form where you can enter and run SQL interactively.
          • +
          +
        • +
        • Gives you an API to build database monitoring tools for a server +farm, for example calling $perf->DBParameter('data cache hit +ratio') returns this very important statistic in a database +independant manner.
        • +
        +

        ADOdb also has the ability to log all SQL executed, using LogSQL. All SQL logged can be +analyzed through the performance monitor UI. In the View +SQL mode, we categorize the SQL into 3 types: +

        +
          +
        • Suspicious SQL: queries with high average execution times, +and are potential candidates for rewriting
        • +
        • Expensive SQL: queries with high total execution times +(#executions * avg execution time). Optimizing these queries will +reduce your database server load.
        • +
        • Invalid SQL: queries that generate errors.
        • +
        +

        Each query is hyperlinked to a description of the query plan, and +every PHP script that executed that query is also shown.

        +

        Please note that the information presented is a very basic database +health check, and does not provide a complete overview of database +performance. Although some attempt has been made to make it work across +multiple databases in the same way, it is impossible to do so. For the +health check, we do try to display the following key database +parameters for all drivers:

        +
          +
        • data cache size - The amount of memory allocated to the +cache.
        • +
        • data cache hit ratio - A measure of how effective the +cache is, as a percentage. The higher, the better.
        • +
        • current connections - The number of sessions currently +connected to the database.
        • +
        +

        You will need to connect to the database as an administrator to view +most of the parameters.

        +

        Code improvements as very welcome, particularly adding new database +parameters and automated tuning hints.

        + +

        Usage

        +

        Currently, the following drivers: mysql, postgres, +oci8, mssql, informix and db2 are +supported. To create a new performance monitor, call NewPerfMonitor( ) +as demonstrated below:

        +
        <?php
        include_once('adodb.inc.php');
        session_start(); # session variables required for monitoring
        $conn = ADONewConnection($driver);
        $conn->Connect($server,$user,$pwd,$db);
        $perf =& NewPerfMonitor($conn);
        $perf->UI($pollsecs=5);
        ?>
        +

        It is also possible to retrieve a single database parameter:

        +
        $size = $perf->DBParameter('data cache size');
        +

        +Thx to Fernando Ortiz for the informix module.

        +

        Methods

        + +

        function UI($pollsecs=5)

        +

        Creates a web-based user interface for performance monitoring. When +you click on Poll, server statistics will be displayed every $pollsecs +seconds. See Usage above.

        +

        Since 4.11, we allow users to enter and run SQL interactively via +the "Run SQL" link. To disable this for security reasons, set this +constant before calling $perf->UI().

        +

        +
        define('ADODB_PERF_NO_RUN_SQL',1);
        +

        Sample output follows below:

        + + + + + + + + + +
        ADOdb +Performance Monitor for localhost, db=test
        + PostgreSQL 7.3.2 on i686-pc-cygwin, compiled by +GCC gcc (GCC) 3.2 20020927 (prerelease)
        Performance Stats   View +SQL   View Tables   Poll +Stats
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        postgres7

        +
        ParameterValueDescription
        Ratios  
        statistics collectorTRUEValue must be TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level +and stats_block_level must be set to true in postgresql.conf)
        data cache hit ratio99.7967555299239 
        IO  
        data reads125 
        data writes21.78125000000000000Count of inserts/updates/deletes * coef
        Data Cache  
        data cache buffers640Number of cache buffers. Tuning
        cache blocksize8192(estimate)
        data cache size5M 
        operating system cache size80M(effective cache size)
        Memory Usage  
        sort buffer size1MSize of sort buffer (per query)
        Connections  
        current connections0 
        max connections32 
        Parameters  
        rollback buffers8WAL buffers
        random page cost4Cost of doing a seek (default=4). See random_page_cost
        +

        function HealthCheck()

        +

        Returns database health check parameters as a HTML table. You will +need to echo or print the output of this function,

        +

        function HealthCheckCLI()

        +

        Returns database health check parameters formatted for a command +line interface. You will need to echo or print the output of this +function. Sample output for mysql:

        +
        -- Ratios -- 
        MyISAM cache hit ratio =gt; 56.5635738832
        InnoDB cache hit ratio =gt; 0
        sql cache hit ratio =gt; 0
        -- IO --
        data reads =gt; 2622
        data writes =gt; 2415.5
        -- Data Cache --
        MyISAM data cache size =gt; 512K
        BDB data cache size =gt; 8388600
        InnoDB data cache size =gt; 8M
        -- Memory Pools --
        read buffer size =gt; 131072
        sort buffer size =gt; 65528
        table cache =gt; 4
        -- Connections --
        current connections =gt; 3
        max connections =gt; 100
        +

        function Poll($pollSecs=5) +

        +

        Run in infinite loop, displaying the following information every +$pollSecs. This will not work properly if output buffering is enabled. +In the example below, $pollSecs=3: +

        +
        Accumulating statistics...
        Time WS-CPU% Hit% Sess Reads/s Writes/s
        11:08:30 0.7 56.56 1 0.0000 0.0000
        11:08:33 1.8 56.56 2 0.0000 0.0000
        11:08:36 11.1 56.55 3 2.5000 0.0000
        11:08:39 9.8 56.55 2 3.1121 0.0000
        11:08:42 2.8 56.55 1 0.0000 0.0000
        11:08:45 7.4 56.55 2 0.0000 1.5000
        +

        WS-CPU% is the Web Server CPU load of the server that PHP is +running from (eg. the database client), and not the database. The Hit% +is the data cache hit ratio. Sess is the current number of +sessions connected to the database. If you are using persistent +connections, this should not change much. The Reads/s and Writes/s +are synthetic values to give the viewer a rough guide to I/O, and are +not to be taken literally.

        +

        function SuspiciousSQL($numsql=10)

        +

        Returns SQL which have high average execution times as a HTML table. +Each sql statement +is hyperlinked to a new window which details the execution plan and the +scripts that execute this SQL. +

        +

        The number of statements returned is determined by $numsql. Data is +taken from the adodb_logsql table, where the sql statements are logged +when +$connection->LogSQL(true) is enabled. The adodb_logsql table is +populated using $conn->LogSQL. +

        +

        For Oracle, Ixora Suspicious SQL returns a list of SQL statements +that are most cache intensive as a HTML table. These are data intensive +SQL statements that could benefit most from tuning.

        +

        function ExpensiveSQL($numsql=10)

        +

        Returns SQL whose total execution time (avg time * #executions) is +high as a HTML table. Each sql statement +is hyperlinked to a new window which details the execution plan and the +scripts that execute this SQL. +

        +

        The number of statements returned is determined by $numsql. Data is +taken from the adodb_logsql table, where the sql statements are logged +when +$connection->LogSQL(true) is enabled. The adodb_logsql table is +populated using $conn->LogSQL. +

        +

        For Oracle, Ixora Expensive SQL returns a list of SQL statements +that are taking the most CPU load when run. +

        +

        function InvalidSQL($numsql=10)

        +

        Returns a list of invalid SQL as an HTML table. +

        +

        Data is taken from the adodb_logsql table, where the sql statements +are logged when +$connection->LogSQL(true) is enabled. +

        +

        function Tables($orderby=1)

        +

        Returns information on all tables in a database, with the first two +fields containing the table name and table size, the remaining fields +depend on the database driver. If $orderby is set to 1, it will sort by +name. If $orderby is set to 2, then it will sort by table size. Some +database drivers (mssql and mysql) will ignore the $orderby clause. For +postgresql, the information is up-to-date since the last vacuum. +Not supported currently for db2.

        +

        Raw Functions

        +

        Raw functions return values without any formatting.

        +

        function DBParameter($paramname)

        +

        Returns the value of a database parameter, such as +$this->DBParameter("data cache size").

        +

        function CPULoad()

        +

        Returns the CPU load of the database client (NOT THE SERVER) as a +percentage. Only works for Linux and Windows. For Windows, WMI must be +available.

        +

        $ADODB_PERF_MIN

        +

        New in adodb 4.97/5.03 is this global variable, which controls whether sql timings which are too small are not saved. Currently it defaults +to 0.05 (seconds). This means that all sql's which are faster than 0.05 seconds to execute are not saved. +

        Format of $settings Property

        +

        To create new database parameters, you need to understand +$settings. The $settings data structure is an associative array. Each +element of the array defines a database parameter. The key is the name +of the database parameter. If no key is defined, then it is assumed to +be a section break, and the value is the name of the section break. If +this is too confusing, looking at the source code will help a lot!

        +

        Each database parameter is itself an array consisting of the +following elements:

        +
          +
        1. Category code, used to group related db parameters. If the +category code is 'HIDE', then +the database parameter is not shown when HTML() is called.
          +
        2. +
        3. either +
            +
          1. sql string to retrieve value, eg. "select value from +v\$parameter where name='db_block_size'",
          2. +
          3. array holding sql string and field to look for, e.g. +array('show variables','table_cache'); optional 3rd parameter is the +$rs->fields[$index] to use (otherwise $index=1), and optional 4th +parameter is a constant to multiply the result with (typically 100 for +percentage calculations),
          4. +
          5. a string prefixed by =, then a PHP method of the class is +invoked, e.g. to invoke $this->GetIndexValue(), set this array +element to '=GetIndexValue',
            +
          6. +
          +
        4. +
        5. Description of database parameter. If description begins with an +=, then it is interpreted as a method call, just as in (1c) above, +taking one parameter, the current value. E.g. '=GetIndexDescription' +will invoke $this->GetIndexDescription($val). This is useful for +generating tuning suggestions. For an example, see WarnCacheRatio().
        6. +
        +

        Example from MySQL, table_cache database parameter:

        +
        'table cache' =gt; array('CACHE',            # category code
        array("show variables", 'table_cache'), # array (type 1b)
        'Number of tables to keep open'), # description
        +

        Example Health Check Output

        +

        db2 informix mysql mssql oci8 +postgres

        +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        db2

        +
        ParameterValueDescription
        Ratios  
        data cache hit ratio0    
        Data Cache
        data cache buffers250   See tuning +reference.
        cache blocksize4096    
        data cache size1000K    
        Connections
        current connections2    
        +

         

        +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        informix

        +
        ParameterVal +ueDescription
        Ratios  
        data cache hit +ratio95.89 
        IO  
        data +reads1883884Page reads
        data writes1716724Page writes
        Connections
        current connections263.0Number of +sessions
        +

        +

         

        +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        mysql

        +
        ParameterValueDescription
        Ratios  
        MyISAM cache hit ratio56.5658301822Cache ratio should be at least 90%
        InnoDB cache hit ratio0Cache ratio should be at least 90%
        sql cache hit ratio0 
        IO  
        data reads2622Number of selects (Key_reads is not accurate)
        data writes2415.5Number of inserts/updates/deletes * coef (Key_writes is not +accurate)
        Data Cache  
        MyISAM data cache size512K 
        BDB data cache size8388600 
        InnoDB data cache size8M 
        Memory Pools  
        read buffer size131072(per session)
        sort buffer size65528Size of sort buffer (per session)
        table cache4Number of tables to keep open
        Connections  
        current connections3 
        max connections100 
        +

         

        +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        mssql

        +
        ParameterValueDescription
        Ratios  
        data cache hit ratio99.9999694824 
        prepared sql hit ratio99.7738579828 
        adhoc sql hit ratio98.4540169133 
        IO  
        data reads2858 
        data writes1438 
        Data Cache  
        data cache size4362in K
        Connections  
        current connections14 
        max connections32767 
        +

         

        +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        oci8

        +
        ParameterValueDescription
        Ratios  
        data cache hit ratio96.98 
        sql cache hit ratio99.96 
        IO  
        data reads842938 
        data writes16852 
        Data Cache  
        data cache buffers3072Number of cache buffers
        data cache blocksize8192 
        data cache size48Mshared_pool_size
        Memory Pools  
        java pool size0java_pool_size
        sort buffer size512Ksort_area_size (per query)
        user session buffer size8Mlarge_pool_size
        Connections  
        current connections1 
        max connections170 
        data cache utilization ratio88.46Percentage of data cache actually in use
        user cache utilization ratio91.76Percentage of user cache (large_pool) actually in use
        rollback segments11 
        Transactions  
        peak transactions24Taken from high-water-mark
        max transactions187max transactions / rollback segments < 3.5 (or +transactions_per_rollback_segment)
        Parameters  
        cursor sharingEXACTCursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR +(9i+). See cursor_sharing.
        index cache cost0% of indexed data blocks expected in the cache. Recommended +is 20-80. Default is 0. See optimizer_index_caching.
        random page cost100Recommended is 10-50 for TP, and 50 for data warehouses. +Default is 100. See optimizer_index_cost_adj. +
        +

        Suspicious SQL

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        LOADEXECUTESSQL_TEXT
        .73%89select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o, +sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576) +and o.obj#=t.obj# and o.owner# = u.user# select i.obj#, i.flags, +u.name, o.name from sys.obj$ o, sys.user$ u, sys.ind$ i where +(bitand(i.flags, 256) = 256 or bitand(i.flags, 512) = 512) and +(not((i.type# = 9) and bitand(i.flags,8) = 8)) and o.obj#=i.obj# and +o.owner# = u.user#
        .84%3select /*+ RULE */ distinct tabs.table_name, tabs.owner , +partitioned, iot_type , TEMPORARY, table_type, table_type_owner from +DBA_ALL_TABLES tabs where tabs.owner = :own
        3.95%6SELECT round(count(1)*avg(buf.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.buffer_pool = buf.name and buf.name = +'DEFAULT'
        4.50%6SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.tablespace_name = tsp.tablespace_name
        57.34%9267select t.schema, t.name, t.flags, q.name from +system.aq$_queue_tables t, sys.aq$_queue_table_affinities aft, +system.aq$_queues q where aft.table_objno = t.objno and +aft.owner_instance = :1 and q.table_objno = t.objno and q.usage = 0 and +bitand(t.flags, 4+16+32+64+128+256) = 0 for update of t.name, +aft.table_objno skip locked
        +

        Expensive SQL

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        LOADEXECUTESSQL_TEXT
        5.24%1select round(sum(bytes)/1048576) from dba_segments
        6.89%6SELECT round(count(1)*avg(buf.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.buffer_pool = buf.name and buf.name = +'DEFAULT'
        7.85%6SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.tablespace_name = tsp.tablespace_name
        33.69%89select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o, +sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576) +and o.obj#=t.obj# and o.owner# = u.user#
        36.44%89select i.obj#, i.flags, u.name, o.name from sys.obj$ o, +sys.user$ u, sys.ind$ i where (bitand(i.flags, 256) = 256 or +bitand(i.flags, 512) = 512) and (not((i.type# = 9) and +bitand(i.flags,8) = 8)) and o.obj#=i.obj# and o.owner# = u.user#
        +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        postgres7

        +
        ParameterValueDescription
        Ratios  
        statistics collectorFALSEMust be set to TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level +and stats_block_level must be set to true in postgresql.conf)
        data cache hit ratio99.9666031916603 
        IO  
        data reads15 
        data writes0.000000000000000000Count of inserts/updates/deletes * coef
        Data Cache  
        data cache buffers1280Number of cache buffers. Tuning
        cache blocksize8192(estimate)
        data cache size10M 
        operating system cache size80000K(effective cache size)
        Memory Pools  
        sort buffer size1MSize of sort buffer (per query)
        Connections  
        current connections13 
        max connections32 
        Parameters  
        rollback buffers8WAL buffers
        random page cost4Cost of doing a seek (default=4). See random_page_cost
        + + diff --git a/fannie/adodb5/docs/docs-session.htm b/fannie/adodb5/docs/docs-session.htm new file mode 100644 index 000000000..e6af53cfa --- /dev/null +++ b/fannie/adodb5/docs/docs-session.htm @@ -0,0 +1,336 @@ + + + + ADODB Session Management Manual + + + + +

        ADODB Session 2 Management Manual

        +

        +V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com) +

        +

        This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products. +

        Useful ADOdb links: DownloadOther Docs +

        +

        Introduction

        +

        This document discusses the newer session handler adodb-session2.php. If + you have used the older adodb-session.php, then be forewarned that you will + need to alter your session table format. Otherwise everything is backward + compatible. + Here are the older + docs for + adodb-session.php.

        +

        Why Session Variables in a Database?

        +

        We store state information specific to a user or web + client in session variables. These session variables persist throughout a +session, as the user moves from page to page.

        +

        To use session variables, call session_start() at the beginning of +your web page, before your HTTP headers are sent. Then for every +variable you want to keep alive for the duration of the session, call +session_register($variable_name). By default, the session handler will +keep track of the session by using a cookie. You can save objects or +arrays in session variables also. +

        +

        The default method of storing sessions is to store it in a file. +However if you have special needs such as you: +

        +
          +
        • Have multiple web servers that need to share session info
        • +
        • Need to do special processing of each session
        • +
        • Require notification when a session expires
        • +
        +

        The ADOdb session handler provides you with the above +additional capabilities by storing the session information as records +in a database table that can be shared across multiple servers.

        +

        These records will be garbage collected based on the php.ini [session] timeout settings. +You can register a notification function to notify you when the record has expired and +is about to be freed by the garbage collector.

        +

        An alternative to using a database backed session handler is to use memcached. + This is a distributed memory based caching system suitable for storing session + information. +

        +

        The Improved Session Handler

        +

        In ADOdb 4.91, we added a new session handler, in adodb-session2.php. +It features the following improvements: +

          +
        • Fully supports server farms using a new database table format. The + previous version used the web server time for timestamps, which can cause problems + on a system with multiple web servers with possibly inconsistent + times. The new version uses the database server time instead for all timestamps. +
        • The older database table format is obsolete. The database table must be modified + to support storage of the database server time mentioned above. Also the field + named DATA has been changed to SESSDATA. In some databases, DATA is a reserved + word. +
        • The functions dataFieldName() and syncSeconds() is obsolete. +
        + +

        Usage is + +

        +include_once("adodb/session/adodb-session2.php");
        +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
        +session_start();
        +
        +#
        # Test session vars, the following should increment on refresh
        #
        $_SESSION['AVAR'] += 1;
        print "<p>\$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
        +
        + +

        When the session is created in session_start( ), the global variable $ADODB_SESS_CONN holds +the connection object. +

        The default name of the table is sessions2. If you want to override it: + +

        +include_once("adodb/session/adodb-session2.php");
        +$options['table'] = 'mytablename';
        +ADOdb_Session::config($driver, $host, $user, $password, $database,$options);
        +session_start();
        +
        + + +

        ADOdb Session Handler Features

        +
          +
        • Ability to define a notification function that is called when a +session expires. Typically +used to detect session logout and release global resources.
        • +
        • Optimization of database writes. We crc32 the session data and +only perform an update +to the session data if there is a data change.
        • +
        • Support for large amounts of session data with CLOBs (see +adodb-session-clob2.php). Useful +for Oracle.
        • +
        • Support for encrypted session data, see +adodb-cryptsession2.php. Enabling encryption is simply a matter of +including adodb-cryptsession2.php instead of adodb-session2.php.
        • +
        +

        Session Handler Files

        +

        There are 3 session management files that you can use: +

        +
        adodb-session2.php        : The default
        adodb-cryptsession2.php : Use this if you want to store encrypted session data in the database
        adodb-session-clob2.php : Use this if you are storing DATA in clobs and you are NOT using oci8 driver
        +

        Usage Examples

        +

        To force non-persistent connections, call Persist() first before session_start(): + + +

        + 
        +include_once("adodb/session/adodb-session2.php");
        +$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb';
        +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
        ADOdb_session::Persist($connectMode=false);
        +session_start();
        +
        +

        The parameter to the Persist( ) method sets the connection mode. You can + pass the following:

        + + + + + + + + + + + + + + + + + + + + + + + + + +
        $connectModeConnection Method
        true

        PConnect( )

        falseConnect( )
        'N'NConnect( )
        'P'PConnect( )
        'C'Connect( )
        +

        To use a encrypted sessions, simply replace the file adodb-session2.php:

        +
         
        include('adodb/session/adodb-cryptsession2.php');

        $driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
        adodb_sess_open(false,false,$connectMode=false);
        +session_start();
        +

        And the same technique for adodb-session-clob2.php:

        +
          
        include('adodb/session/adodb-session2-clob2.php');
        $driver = 'oci8'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
        adodb_sess_open(false,false,$connectMode=false);
        +session_start();
        +

        Installation

        +

        1. Create this table in your database. Here is the MySQL version: +

          
        +CREATE TABLE sessions2(
        +	  sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
        +  	  expiry DATETIME NOT NULL ,
        +	  expireref VARCHAR( 250 ) DEFAULT '',
        +	  created DATETIME NOT NULL ,
        +	  modified DATETIME NOT NULL ,
        +	  sessdata LONGTEXT,
        +	  PRIMARY KEY ( sesskey ) ,
        +	  INDEX sess2_expiry( expiry ),
        +	  INDEX sess2_expireref( expireref )
        +)
        + +

        For PostgreSQL, use: +

        CREATE TABLE sessions2(
        + sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
        + expiry TIMESTAMP NOT NULL ,
        + expireref VARCHAR( 250 ) DEFAULT '',
        + created TIMESTAMP NOT NULL ,
        + modified TIMESTAMP NOT NULL ,
        + sessdata TEXT DEFAULT '',
        + PRIMARY KEY ( sesskey )
        + );
        +
        +
        create INDEX sess2_expiry on sessions2( expiry );
        +create INDEX sess2_expireref on sessions2 ( expireref );
        +

        Here is the Oracle definition, which uses a CLOB for the SESSDATA field: +

        +  CREATE TABLE SESSIONS2
        (
        SESSKEY VARCHAR2(48 BYTE) NOT NULL,
        EXPIRY DATE NOT NULL,
        EXPIREREF VARCHAR2(200 BYTE),
        CREATED DATE NOT NULL,
        MODIFIED DATE NOT NULL,
        SESSDATA CLOB,
        PRIMARY KEY(SESSKEY)
        ); +
        CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY); +CREATE INDEX SESS2_EXPIREREF ON SESSIONS2(EXPIREREF);
        +

        We need to use a CLOB here because for text greater than 4000 bytes long, + Oracle requires you to use the CLOB data type. If you are using the oci8 driver, + ADOdb will automatically enable CLOB handling. So you can use either adodb-session2.php + or adodb-session-clob2.php - in this case it doesn't matter.
        +

        Notifications

        +

        You can receive notification when your session is cleaned up by the session garbage collector or +when you call session_destroy(). +

        PHP's session extension will automatically run a special garbage collection function based on +your php.ini session.cookie_lifetime and session.gc_probability settings. This will in turn call +adodb's garbage collection function, which can be setup to do notification. +

        +

        +	PHP Session --> ADOdb Session  --> Find all recs  --> Send          --> Delete queued
        +	GC Function     GC Function        to be deleted      notification      records
        +	executed at     called by                             for all recs
        +	random time     Session Extension                     queued for deletion
        +
        +

        When a session is created, we need to store a value in the session record (in the EXPIREREF field), typically +the userid of the session. Later when the session has expired, just before the record is deleted, +we reload the EXPIREREF field and call the notification function with the value of EXPIREREF, which +is the userid of the person being logged off. +

        ADOdb uses a global variable $ADODB_SESSION_EXPIRE_NOTIFY that you must predefine before session +start to store the notification configuration. +$ADODB_SESSION_EXPIRE_NOTIFY is an array with 2 elements, the +first being the name of the session variable you would like to store in +the EXPIREREF field, and the 2nd is the notification function's name.

        +

        For example, suppose we want to be notified when a user's session has expired, +based on the userid. When the user logs in, we store the id in the global session variable +$USERID. The function name is 'NotifyFn'. +

        +So we define (before session_start() is called):

        +
         
        +	$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
        +
        +And when the NotifyFn is called (when the session expires), the +$EXPIREREF holding the user id is passed in as the first parameter, eg. NotifyFn($userid, $sesskey). The +session key (which is the primary key of the record in the sessions +table) is the 2nd parameter. +

        Here is an example of a Notification function that deletes some +records in the database and temporary files:

        +
        
        +	function NotifyFn($expireref, $sesskey)
        +	{
        +		global $ADODB_SESS_CONN; # the session connection object
        +		$user = $ADODB_SESS_CONN->qstr($expireref);
        +		
        +		$ADODB_SESS_CONN->Execute("delete from shopping_cart where user=$user");          
        +		system("rm /work/tmpfiles/$expireref/*");
        +	}  
        +			  
        +

        NOTE 1: If you have register_globals disabled in php.ini, then you +will have to manually set the EXPIREREF. E.g.

        +
         
        +$GLOBALS['USERID'] = GetUserID();
        +$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
        +
        +

        NOTE 2: If you want to change the EXPIREREF after the session +record has been created, you will need to modify any session variable +to force a database record update. +

        +

        Neat Notification Tricks

        +

        ExpireRef normally holds the user id of the current session. +

        +

        1. You can then write a session monitor, scanning expireref to see +who is currently logged on. +

        +

        2. If you delete the sessions record for a specific user, eg. +

        +
        delete from sessions where expireref = '$USER'
        +then the user is logged out. Useful for ejecting someone from a +site. +

        3. You can scan the sessions table to ensure no user +can be logged in twice. Useful for security reasons. +

        +

        Compression/Encryption Schemes

        +Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and +compression schemes are supported. Currently, supported are: +

        +

          MD5Crypt (crypt.inc.php)
        MCrypt
        Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
        GZip
        BZip2
        +

        These are stackable. E.g. +

        ADODB_Session::filter(new ADODB_Compress_Bzip2());
        ADODB_Session::filter(new ADODB_Encrypt_MD5());
        +will compress and then encrypt the record in the database. +

        Session Cookie Regeneration: adodb_session_regenerate_id()

        +

        Dynamically change the current session id with a newly generated one and update + database. Currently only works with cookies. Useful to improve security by + reducing the risk of session-hijacking. See this article on Session + Fixation for more info +on the theory behind this feature. Usage:

        +	include('path/to/adodb/session/adodb-session2.php');
        +	
        +	session_start();
        +	# Approximately every 10 page loads, reset cookie for safety.
        +	# This is extremely simplistic example, better 
        +	# to regenerate only when the user logs in or changes
        +	# user privilege levels.
        +	if ((rand()%10) == 0) adodb_session_regenerate_id(); 
        +
        +

        This function calls session_regenerate_id() internally or simulates it if the function does not exist. +

        Vacuum/Optimize Database

        +

        During session garbage collection, if postgresql is detected, + ADOdb can be set to run VACUUM. If mysql is detected, then optimize database + could be called.You can turn this on or off using:

        +
        $turnOn = true; # or false
        +ADODB_Session::optimize($turnOn);
        +
        +

        The default is optimization is disabled.

        +

        Backwards Compatability

        +

        The older method of connecting to ADOdb using global variables is still supported:

        +
         $ADODB_SESSION_DRIVER='mysql';
        + $ADODB_SESSION_CONNECT='localhost';
        + $ADODB_SESSION_USER ='root';
        + $ADODB_SESSION_PWD ='abc';
        + $ADODB_SESSION_DB ='phplens';
        + 
        + include('path/to/adodb/session/adodb-session2.php'); 
        +

        In the above example, the only things you need to change in your code to upgrade + is

        +
          +
        • your session table format to the new one.
        • +
        • the include file from adodb-session.php to adodb-session2.php.
        • +
        +

        More Info

        +

        Also see the core ADOdb documentation. And if + you are interested in the obsolete adodb-session.php, see old + session documentation.

        + + diff --git a/fannie/adodb5/docs/docs-session.old.htm b/fannie/adodb5/docs/docs-session.old.htm new file mode 100644 index 000000000..88eb6c7fb --- /dev/null +++ b/fannie/adodb5/docs/docs-session.old.htm @@ -0,0 +1,313 @@ + + + + ADODB Old Session Management Manual + + + + +

        ADODB Session Management Manual

        +

        +V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com) +

        +

        This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products. +

        Useful ADOdb links: DownloadOther Docs +

        +

        Introduction

        +

        This documentation discusses the old adodb-session.php. +Here is the new documentation on the newer adodb-session2.php. +

        We store state information specific to a user or web client in +session variables. These session variables persist throughout a +session, as the user moves from page to page.

        +

        To use session variables, call session_start() at the beginning of +your web page, before your HTTP headers are sent. Then for every +variable you want to keep alive for the duration of the session, call +session_register($variable_name). By default, the session handler will +keep track of the session by using a cookie. You can save objects or +arrays in session variables also. +

        +

        The default method of storing sessions is to store it in a file. +However if you have special needs such as you: +

        +
          +
        • Have multiple web servers that need to share session info
        • +
        • Need to do special processing of each session
        • +
        • Require notification when a session expires
        • +
        +

        The ADOdb session handler provides you with the above +additional capabilities by storing the session information as records +in a database table that can be shared across multiple servers.

        +

        These records will be garbage collected based on the php.ini [session] timeout settings. +You can register a notification function to notify you when the record has expired and +is about to be freed by the garbage collector.

        +

        Important Upgrade Notice: Since ADOdb 4.05, the session files +have been moved to its own folder, adodb/session. This is a rewrite +of the session code by Ross Smith. The old session code is in +adodb/session/old.

        +

        ADOdb Session Handler Features

        +
          +
        • Ability to define a notification function that is called when a +session expires. Typically +used to detect session logout and release global resources.
        • +
        • Optimization of database writes. We crc32 the session data and +only perform an update +to the session data if there is a data change.
        • +
        • Support for large amounts of session data with CLOBs (see +adodb-session-clob.php). Useful +for Oracle.
        • +
        • Support for encrypted session data, see +adodb-cryptsession.php. Enabling encryption is simply a matter of +including adodb-cryptsession.php instead of adodb-session.php.
        • +
        +

        Setup

        +

        There are 3 session management files that you can use: +

        +
        adodb-session.php        : The default
        adodb-session-clob.php : Use this if you are storing DATA in clobs
        adodb-cryptsession.php : Use this if you want to store encrypted session data in the database

        +
        +

        Examples +

        +     include('adodb/adodb.inc.php');

        $ADODB_SESSION_DRIVER='mysql';
        $ADODB_SESSION_CONNECT='localhost';
        $ADODB_SESSION_USER ='scott';
        $ADODB_SESSION_PWD ='tiger';
        $ADODB_SESSION_DB ='sessiondb';


        include('adodb/session/adodb-session.php');
        session_start();

        #
        # Test session vars, the following should increment on refresh
        #
        $_SESSION['AVAR'] += 1;
        print "<p>\$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
        + +

        To force non-persistent connections, call adodb_session_open() first before session_start(): +

        +

        + 
        include('adodb/adodb.inc.php');

        $ADODB_SESSION_DRIVER='mysql';
        $ADODB_SESSION_CONNECT='localhost';
        $ADODB_SESSION_USER ='scott';
        $ADODB_SESSION_PWD ='tiger';
        $ADODB_SESSION_DB ='sessiondb';


        include('adodb/session/adodb-session.php');
        adodb_sess_open(false,false,false);

        session_start();
        +
        +

        The 3rd parameter to adodb_sess_open($path, $sessname, $connectMode) sets the connection method. You can pass in the following:

        + + + + + + + + + + + + + + + + + + + + + + + + + +
        $connectModeConnection Method
        true

        PConnect( )

        falseConnect( )
        'N'NConnect( )
        'P'PConnect( )
        'C'Connect( )
        +

        To use a encrypted sessions, simply replace the file adodb-session.php:

        +
         
        include('adodb/adodb.inc.php');

        $ADODB_SESSION_DRIVER='mysql';
        $ADODB_SESSION_CONNECT='localhost';
        $ADODB_SESSION_USER ='scott';
        $ADODB_SESSION_PWD ='tiger';
        $ADODB_SESSION_DB ='sessiondb';

        include('adodb/session/adodb-cryptsession.php');

        session_start();

        +
        +

        And the same technique for adodb-session-clob.php:

        +
          
        include('adodb/adodb.inc.php');

        $ADODB_SESSION_DRIVER='mysql';
        $ADODB_SESSION_CONNECT='localhost';
        $ADODB_SESSION_USER ='scott';
        $ADODB_SESSION_PWD ='tiger';
        $ADODB_SESSION_DB ='sessiondb';

        include('adodb/session/adodb-session-clob.php');

        session_start();
        +
        +

        An alternative way to set persistant or non-persistent connections is to call the following function before session_start() is called. +

        + 	ADODB_Session::persist('P'); # 'C' for non-persistent connections
        + 
        +

        Installation

        +

        1. Create this table in your database (MySQL syntax): +

          
        +   create table sessions (
        +       SESSKEY char(32) not null,
        +       EXPIRY int(11) unsigned not null,
        +       EXPIREREF varchar(64),
        +	   DATA text not null,
        +	   primary key (sesskey)
        +	   );
        + 
        + +

        You may want to rename the 'data' field to 'session_data' as + 'data' appears to be a reserved word for one or more of the following: +

          +
        • ANSI SQL +
        • IBM DB2 +
        • MS SQL Server +
        • Postgres +
        • SAP +
        +

        + If you do, then execute: +

        +		ADODB_Session::dataFieldName('session_data');
        +
        +

        For the adodb-session-clob.php version, create this: +

        +    
        create table sessions (
        SESSKEY char(32) not null,
        EXPIRY int(11) unsigned not null,
        EXPIREREF varchar(64),
        DATA CLOB,
        primary key (sesskey)
        );
        +
        +

        2. Then define the following parameters. You can either modify this file, or define them before this file is included: +

              
        $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
        $ADODB_SESSION_CONNECT='server to connect to';
        $ADODB_SESSION_USER ='user';
        $ADODB_SESSION_PWD ='password';
        $ADODB_SESSION_DB ='database';
        $ADODB_SESSION_TBL = 'sessions'; # setting this is optional
        +

        + When the session is created, $ADODB_SESS_CONN holds the connection object.

        3. Recommended is PHP 4.0.6 or later. There are documented session bugs in earlier versions of PHP. +

        Notifications

        +

        You can receive notification when your session is cleaned up by the session garbage collector or +when you call session_destroy(). +

        PHP's session extension will automatically run a special garbage collection function based on +your php.ini session.cookie_lifetime and session.gc_probability settings. This will in turn call +adodb's garbage collection function, which can be setup to do notification. +

        +

        +	PHP Session --> ADOdb Session  --> Find all recs  --> Send          --> Delete queued
        +	GC Function     GC Function        to be deleted      notification      records
        +	executed at     called by                             for all recs
        +	random time     Session Extension                     queued for deletion
        +
        +

        When a session is created, we need to store a value in the session record (in the EXPIREREF field), typically +the userid of the session. Later when the session has expired, just before the record is deleted, +we reload the EXPIREREF field and call the notification function with the value of EXPIREREF, which +is the userid of the person being logged off. +

        ADOdb uses a global variable $ADODB_SESSION_EXPIRE_NOTIFY that you must predefine before session +start to store the notification configuration. +$ADODB_SESSION_EXPIRE_NOTIFY is an array with 2 elements, the +first being the name of the session variable you would like to store in +the EXPIREREF field, and the 2nd is the notification function's name.

        +

        For example, suppose we want to be notified when a user's session has expired, +based on the userid. When the user logs in, we store the id in the global session variable +$USERID. The function name is 'NotifyFn'. +

        +So we define (before session_start() is called):

        +
         
        +	$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
        +
        +And when the NotifyFn is called (when the session expires), the +$USERID is passed in as the first parameter, eg. NotifyFn($userid, $sesskey). The +session key (which is the primary key of the record in the sessions +table) is the 2nd parameter. +

        Here is an example of a Notification function that deletes some +records in the database and temporary files:

        +
        
        +	function NotifyFn($expireref, $sesskey)
        +	{
        +		global $ADODB_SESS_CONN; # the session connection object
        +		$user = $ADODB_SESS_CONN->qstr($expireref);
        +		
        +		$ADODB_SESS_CONN->Execute("delete from shopping_cart where user=$user");          
        +		system("rm /work/tmpfiles/$expireref/*");
        +	}  
        +			  
        +

        NOTE 1: If you have register_globals disabled in php.ini, then you +will have to manually set the EXPIREREF. E.g.

        +
         
        +$GLOBALS['USERID'] = GetUserID();
        +$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
        +
        +

        NOTE 2: If you want to change the EXPIREREF after the session +record has been created, you will need to modify any session variable +to force a database record update. +

        +

        Neat Notification Tricks

        +

        ExpireRef normally holds the user id of the current session. +

        +

        1. You can then write a session monitor, scanning expireref to see +who is currently logged on. +

        +

        2. If you delete the sessions record for a specific user, eg. +

        +
        delete from sessions where expireref = '$USER'
        +then the user is logged out. Useful for ejecting someone from a +site. +

        3. You can scan the sessions table to ensure no user +can be logged in twice. Useful for security reasons. +

        +

        Using Oracle CLOBs

        +

        Suppose you are storing the DATA field in a CLOB: +

        
        +   CREATE TABLE sessions (
        +       SESSKEY VARCHAR(32) NOT NULL,
        +       EXPIRY NUMBER(16)  NOT NULL,
        +       EXPIREREF VARCHAR(64),
        +       DATA CLOB,
        +      PRIMARY KEY (sesskey)
        +  );
        + 
        +

        Then your PHP code could look like this: +

        +	ADODB_SESSION_DRIVER='oci8';
        +	$ADODB_SESSION_CONNECT=$tnsname;
        +	$ADODB_SESSION_USER ='scott';
        +	$ADODB_SESSION_PWD = 'tiger';
        +	$ADODB_SESSION_DB ='';
        +	
        +	$ADODB_SESSION_USE_LOBS = 'clob';
        +	$ADODB_SESSION_TBL = 'sessions';
        +	
        +	$ADODB_SESS_DEBUG=0;
        +	
        +	include(ADODB_DIR.'/session/adodb-session.php');
        +	
        +	ADODB_Session::persist('P'); # use 'C' for non-persistent connects
        +	
        +	session_start();
        + 
        +

        Note that you can set persistance using ADODB_Session::persist('P'). + +

        Compression/Encryption Schemes

        +Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and +compression schemes are supported. Currently, supported are: +

        +

          MD5Crypt (crypt.inc.php)
        MCrypt
        Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
        GZip
        BZip2
        +

        These are stackable. E.g. +

        ADODB_Session::filter(new ADODB_Compress_Bzip2());
        ADODB_Session::filter(new ADODB_Encrypt_MD5());
        +will compress and then encrypt the record in the database. +

        adodb_session_regenerate_id()

        +

        Dynamically change the current session id with a newly generated one and update database. Currently only +works with cookies. Useful to improve security by reducing the risk of session-hijacking. +See this article on Session Fixation for more info +on the theory behind this feature. Usage: +

        +	$ADODB_SESSION_DRIVER='mysql';
        +	$ADODB_SESSION_CONNECT='localhost';
        +	$ADODB_SESSION_USER ='root';
        +	$ADODB_SESSION_PWD ='abc';
        +	$ADODB_SESSION_DB ='phplens';
        +	
        +	include('path/to/adodb/session/adodb-session.php');
        +	
        +	session_start();
        +	# Every 10 page loads, reset cookie for safety.
        +	# This is extremely simplistic example, better 
        +	# to regenerate only when the user logs in or changes
        +	# user privilege levels.
        +	if ((rand()%10) == 0) adodb_session_regenerate_id(); 
        +
        +

        This function calls session_regenerate_id() internally or simulates it if the function does not exist. +

        Vacuum/Optimize Database

        +

        During session garbage collection, if postgresql is detected, + ADOdb can be set to run VACUUM. If mysql is detected, then optimize database + could be called.You can turn this on or off using:

        +
        $turnOn = true; # or false
        +ADODB_Session::optimize($turnOn);
        +
        +

        The default for optimization is it is disabled.

        +

        More Info

        +

        Also see the core ADOdb documentation. +

        + + diff --git a/fannie/adodb5/docs/old-changelog.htm b/fannie/adodb5/docs/old-changelog.htm new file mode 100644 index 000000000..bf8a1af26 --- /dev/null +++ b/fannie/adodb5/docs/old-changelog.htm @@ -0,0 +1,822 @@ +Old Changelog: ADOdb +

        Old Changelog

        + +

        3.92 22 Sept 2003 +

        Added GetAssoc and CacheGetAssoc to connection object. +

        Removed TextMax and CharMax functions from adodb.inc.php. +

        HasFailedTrans() returned false when trans failed. Fixed. +

        Moved perf driver classes into adodb/perf/*.php. +

        Misc improvements to performance monitoring, including UI(). +

        RETVAL in mssql Parameter(), we do not append @ now. +

        Added Param($name) to connection class, returns '?' or ":$name", for defining + bind parameters portably. +

        LogSQL traps affected_rows() and saves its value properly now. Also fixed oci8 + _stmt and _affectedrows() bugs. +

        Session code timestamp check for oci8 works now. Formerly default NLS_DATE_FORMAT + stripped off time portion. Thx to Tony Blair (tonanbarbarian#hotmail.com). Also + added new $conn->datetime field to oci8, controls whether MetaType() returns + 'D' ($this->datetime==false) or 'T' ($this->datetime == true) for DATE type. +

        Fixed bugs in adodb-cryptsession.inc.php and adodb-session-clob.inc.php. +

        Fixed misc bugs in adodb_key_exists, GetInsertSQL() and GetUpdateSQL(). +

        Tuned include_once handling to reduce file-system checking overhead. +

        3.91 9 Sept 2003 +

        Only released to InterAkt +

        Added LogSQL() for sql logging and $ADODB_NEWCONNECTION to override factory + for driver instantiation. +

        Added IfNull($field,$ifNull) function, thx to johnwilk#juno.com +

        Added portable substr support. +

        Now rs2html() has new parameter, $echo. Set to false to return $html instead + of echoing it. +

        3.90 5 Sept 2003 +

        First beta of performance monitoring released. +

        MySQL supports MetaTable() masking. +

        Fixed key_exists() bug in adodb-lib.inc.php +

        Added sp_executesql Prepare() support to mssql. +

        Added bind support to db2. +

        Added swedish language file - Christian Tiberg" christian#commsoft.nu +

        Bug in drop index for mssql data dict fixed. Thx to Gert-Rainer Bitterlich. +

        Left join setting for oci8 was wrong. Thx to johnwilk#juno.com +

        3.80 27 Aug 2003 +

        Patch for PHP 4.3.3 cached recordset csv2rs() fread loop incompatibility. +

        Added matching mask for MetaTables. Only for oci8, mssql and postgres currently. +

        Rewrite of "oracle" driver connection code, merging with "oci8", by Gaetano. +

        Added better debugging for Smart Transactions. +

        Postgres DBTimeStamp() was wrongly using TO_DATE. Changed to TO_TIMESTAMP. +

        ADODB_FETCH_CASE check pushed to ADONewConnection to allow people to define + it after including adodb.inc.php. +

        Added portugese (brazilian) to languages. Thx to "Levi Fukumori". +

        Removed arg3 parameter from Execute/SelectLimit/Cache* functions. +

        Execute() now accepts 2-d array as $inputarray. Also changed docs of fnExecute() + to note change in sql query counting with 2-d arrays. +

        Added MONEY to MetaType in PostgreSQL. +

        Added more debugging output to CacheFlush(). +

        3.72 9 Aug 2003 +

        Added qmagic($str), which is a qstr($str) that auto-checks for magic quotes + and does the right thing... +

        Fixed CacheFlush() bug - Thx to martin#gmx.de +

        Walt Boring contributed MetaForeignKeys for postgres7. +

        _fetch() called _BlobDecode() wrongly in interbase. Fixed. +

        adodb_time bug fixed with dates after 2038 fixed by Jason Pell. http://phplens.com/lens/lensforum/msgs.php?id=6980 +

        3.71 4 Aug 2003 +

        The oci8 driver, MetaPrimaryKeys() did not check the owner correctly when $owner + == false. +

        Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru. +

        Spanish language file contributed by "Horacio Degiorgi" horaciod#codigophp.com. +

        Error handling in oci8 bugfix - if there was an error in Execute(), then when + calling ErrorNo() and/or ErrorMsg(), the 1st call would return the error, but + the 2nd call would return no error. +

        Error handling in odbc bugfix. ODBC would always return the last error, even + if it happened 5 queries ago. Now we reset the errormsg to '' and errorno to + 0 everytime before CacheExecute() and Execute(). +

        3.70 29 July 2003 +

        Added new SQLite driver. Tested on PHP 4.3 and PHP 5. +

        Added limited "sapdb" driver support - mainly date support. +

        The oci8 driver did not identify NUMBER with no defined precision correctly. +

        Added ADODB_FORCE_NULLS, if set, then PHP nulls are converted to SQL nulls + in GetInsertSQL/GetUpdateSQL. +

        DBDate() and DBTimeStamp() format for postgresql had problems. Fixed. +

        Added tableoptions to ChangeTableSQL(). Thx to Mike Benoit. +

        Added charset support to postgresql. Thx to Julian Tarkhanov. +

        Changed OS check for MS-Windows to prevent confusion with darWIN (MacOS) +

        Timestamp format for db2 was wrong. Changed to yyyy-mm-dd-hh.mm.ss.nnnnnn. +

        adodb-cryptsession.php includes wrong. Fixed. +

        Added MetaForeignKeys(). Supported by mssql, odbc_mssql and oci8. +

        Fixed some oci8 MetaColumns/MetaPrimaryKeys bugs. Thx to Walt Boring. +

        adodb_getcount() did not init qryRecs to 0. Missing "WHERE" clause checking + in GetUpdateSQL fixed. Thx to Sebastiaan van Stijn. +

        Added support for only 'VIEWS' and "TABLES" in MetaTables. From Walt Boring. +

        Upgraded to adodb-xmlschema.inc.php 0.0.2. +

        NConnect for mysql now returns value. Thx to Dennis Verspuij. +

        ADODB_FETCH_BOTH support added to interbase/firebird. +

        Czech language file contributed by Kamil Jakubovic jake#host.sk. +

        PostgreSQL BlobDecode did not use _connectionID properly. Thx to Juraj Chlebec. +

        Added some new initialization stuff for Informix. Thx to "Andrea Pinnisi" pinnisi#sysnet.it +

        ADODB_ASSOC_CASE constant wrong in sybase _fetch(). Fixed. +

        3.60 16 June 2003 +

        We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with + mssql driver. +

        The property $emptyDate missing from connection class. Also changed 1903 to + constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn. +

        ADOdb speedup optimization - we now return all arrays by reference. +

        Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter. + Suggested by vincent. +

        Added GetArray() to connection class. +

        Added not_null check in informix metacolumns(). +

        Connection parameters for postgresql did not work correctly when port was defined. +

        DB2 is now a tested driver, making adodb 100% compatible. Extensive changes + to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching + to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit() + fixes. +

        The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed. +

        Some bugs in adodb_backtrace() fixed. +

        Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql + properly. +

        MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions + to odbc MetaColumns() for vfp and db2 compat. +

        Added unsigned support to mysql datadict class. Thx to iamsure. +

        Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to + Josh R, Night_Wulfe#hotmail.com. +

        ChangeTableSQL contributed by Florian Buzin. +

        The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with + mssql driver. +

        + +

        3.50 19 May 2003

        +

        Fixed mssql compat with FreeTDS. FreeTDS does not implement mssql_fetch_assoc(). +

        Merged back connection and recordset code into adodb.inc.php. +

        ADOdb sessions using oracle clobs contributed by achim.gosse#ddd.de. See adodb-session-clob.php. +

        Added /s modifier to preg_match everywhere, which ensures that regex does not + stop at /n. Thx Pao-Hsi Huang. +

        Fixed error in metacolumns() for mssql. +

        Added time format support for SQLDate. +

        Image => B added to metatype. +

        MetaType now checks empty($this->blobSize) instead of empty($this). +

        Datadict has beta support for informix, sybase (mapped to mssql), db2 and generic + (which is a fudge). +

        BlobEncode for postgresql uses pg_escape_bytea, if available. Needed for compat + with 7.3. +

        Added $ADODB_LANG, to support multiple languages in MetaErrorMsg(). +

        Datadict can now parse table definition as declarative text. +

        For DataDict, oci8 autoincrement trigger missing semi-colon. Fixed. +

        For DataDict, when REPLACE flag enabled, drop sequence in datadict for autoincrement + field in postgres and oci8.s +

        Postgresql defaults to template1 database if no database defined in connect/pconnect. +

        We now clear _resultid in postgresql if query fails. +

        3.40 19 May 2003

        +

        Added insert_id for odbc_mssql. +

        Modified postgresql UpdateBlobFile() because it did not work in safe mode. +

        Now connection object is passed to raiseErrorFn as last parameter. Needed by + StartTrans(). +

        Added StartTrans() and CompleteTrans(). It is recommended that you do not modify + transOff, but use the above functions. +

        oci8po now obeys ADODB_ASSOC_CASE settings. +

        Added virtualized error codes, using PEAR DB equivalents. Requires you to manually + include adodb-error.inc.php yourself, with MetaError() and MetaErrorMsg($errno). +

        GetRowAssoc for mysql and pgsql were flawed. Fix by Ross Smith. +

        Added to datadict types I1, I2, I4 and I8. Changed datadict type 'T' to map + to timestamp instead of datetime for postgresql. +

        Error handling in ExecuteSQLArray(), adodb-datadict.inc.php did not work. +

        We now auto-quote postgresql connection parameters when building connection + string. +

        Added session expiry notification. +

        We now test with odbc mysql - made some changes to odbc recordset constructor. +

        MetaColumns now special cases access and other databases for odbc. +

        3.31 17 March 2003

        +

        Added row checking for _fetch in postgres. +

        Added Interval type to MetaType for postgres. +

        Remapped postgres driver to call postgres7 driver internally. +

        Adorecordset_array::getarray() did not return array when nRows >= 0. +

        Postgresql: at times, no error message returned by pg_result_error() but error + message returned in pg_last_error(). Recoded again. +

        Interbase blob's now use chunking for updateblob. +

        Move() did not set EOF correctly. Reported by Jorma T. +

        We properly support mysql timestamp fields when we are creating mysql tables + using the data-dict interface. +

        Table regex includes backticks character now. +

        3.30 3 March 2003

        +

        Added $ADODB_EXTENSION and $ADODB_COMPAT_FETCH constant. +

        Made blank1stItem configurable using syntax "value:text" in GetMenu/GetMenu2. + Thx to Gabriel Birke. +

        Previously ADOdb differed from the Microsoft standard because it did not define + what to set $this->fields when EOF was reached. Now at EOF, ADOdb sets $this->fields + to false for all databases, which is consist with Microsoft's implementation. + Postgresql and mysql have always worked this way (in 3.11 and earlier). If you + are experiencing compatibility problems (and you are not using postgresql nor + mysql) on upgrading to 3.30, try setting the global variables $ADODB_COUNTRECS + = true (which is the default) and $ADODB_FETCH_COMPAT = true (this is a new + global variable). +

        We now check both pg_result_error and pg_last_error as sometimes pg_result_error + does not display anything. Iman Mayes +

        We no longer check for magic quotes gpc in Quote(). +

        Misc fixes for table creation in adodb-datadict.inc.php. Thx to iamsure. +

        Time calculations use adodb_time library for all negative timestamps due to + problems in Red Hat 7.3 or later. Formerly, only did this for Windows. +

        In mssqlpo, we now check if $sql in _query is a string before we change || + to +. This is to support prepared stmts. +

        Move() and MoveLast() internals changed to support to support EOF and $this->fields + change. +

        Added ADODB_FETCH_BOTH support to mssql. Thx to Angel Fradejas afradejas#mediafusion.es +

        We now check if link resource exists before we run mysql_escape_string in + qstr(). +

        Before we flock in csv code, we check that it is not a http url. +

        3.20 17 Feb 2003

        +

        Added new Data Dictionary classes for creating tables and indexes. Warning + - this is very much alpha quality code. The API can still change. See adodb/tests/test-datadict.php + for more info. +

        We now ignore $ADODB_COUNTRECS for mysql, because PHP truncates incomplete + recordsets when mysql_unbuffered_query() is called a second time. +

        Now postgresql works correctly when $ADODB_COUNTRECS = false. +

        Changed _adodb_getcount to properly support SELECT DISTINCT. +

        Discovered that $ADODB_COUNTRECS=true has some problems with prepared queries + - suspect PHP bug. +

        Now GetOne and GetRow run in $ADODB_COUNTRECS=false mode for better performance. +

        Added support for mysql_real_escape_string() and pg_escape_string() in qstr(). +

        Added an intermediate variable for mysql _fetch() and MoveNext() to store fields, + to prevent overwriting field array with boolean when mysql_fetch_array() returns + false. +

        Made arrays for getinsertsql and getupdatesql case-insensitive. Suggested by + Tim Uckun" tim#diligence.com +

        3.11 11 Feb 2003

        +

        Added check for ADODB_NEVER_PERSIST constant in PConnect(). If defined, then + PConnect() will actually call non-persistent Connect(). +

        Modified interbase to properly work with Prepare(). +

        Added $this->ibase_timefmt to allow you to change the date and time format. +

        Added support for $input_array parameter in CacheFlush(). +

        Added experimental support for dbx, which was then removed when i found that + it was slower than using native calls. +

        Added MetaPrimaryKeys for mssql and ibase/firebird. +

        Added new $trim parameter to GetCol and CacheGetCol +

        Uses updated adodb-time.inc.php 0.06. +

        3.10 27 Jan 2003 +

        Added adodb_date(), adodb_getdate(), adodb_mktime() and adodb-time.inc.php. +

        For interbase, added code to handle unlimited number of bind parameters. From + Daniel Hasan daniel#hasan.cl. +

        Added BlobDecode and UpdateBlob for informix. Thx to Fernando Ortiz. +

        Added constant ADODB_WINDOWS. If defined, means that running on Windows. +

        Added constant ADODB_PHPVER which stores php version as a hex num. Removed + $ADODB_PHPVER variable. +

        Felho Bacsi reported a minor white-space regular expression problem in GetInsertSQL. +

        Modified ADO to use variant to store _affectedRows +

        Changed ibase to use base class Replace(). Modified base class Replace() to + support ibase. +

        Changed odbc to auto-detect when 0 records returned is wrong due to bad odbc + drivers. +

        Changed mssql to use datetimeconvert ini setting only when 4.30 or later (does + not work in 4.23). +

        ExecuteCursor($stmt, $cursorname, $params) now accepts a new $params array + of additional bind parameters -- William Lovaton walovaton#yahoo.com.mx. +

        Added support for sybase_unbuffered_query if ADODB_COUNTRECS == false. Thx + to chuck may. +

        Fixed FetchNextObj() bug. Thx to Jorma Tuomainen. +

        We now use SCOPE_IDENTITY() instead of @@IDENTITY for mssql - thx to marchesini#eside.it +

        Changed postgresql movenext logic to prevent illegal row number from being + passed to pg_fetch_array(). +

        Postgresql initrs bug found by "Bogdan RIPA" bripa#interakt.ro $f1 accidentally + named $f +

        3.00 6 Jan 2003 +

        Fixed adodb-pear.inc.php syntax error. +

        Improved _adodb_getcount() to use SELECT COUNT(*) FROM ($sql) for languages + that accept it. +

        Fixed _adodb_getcount() caching error. +

        Added sql to retrive table and column info for odbc_mssql. +

        2.91 3 Jan 2003 +

        Revised PHP version checking to use $ADODB_PHPVER with legal values 0x4000, + 0x4050, 0x4200, 0x4300. +

        Added support for bytea fields and oid blobs in postgres by allowing BlobDecode() + to detect and convert non-oid fields. Also added BlobEncode to postgres when + you want to encode oid blobs. +

        Added blobEncodeType property for connections to inform phpLens what encoding + method to use for blobs. +

        Added BlobDecode() and BlobEncode() to base ADOConnection class. +

        Added umask() to _gencachename() when creating directories. +

        Added charPage for ado drivers, so you can set the code page. +

        +$conn->charPage = CP_UTF8;
        +$conn->Connect($dsn);
        +
        +

        Modified _seek in mysql to check for num rows=0. +

        Added to metatypes new informix types for IDS 9.30. Thx Fernando Ortiz. +

        _maxrecordcount returned in CachePageExecute $rsreturn +

        Fixed sybase cacheselectlimit( ) problems +

        MetaColumns() max_length should use precision for types X and C for ms access. + Fixed. +

        Speedup of odbc non-SELECT sql statements. +

        Added support in MetaColumns for Wide Char types for ODBC. We halve max_length + if unicode/wide char. +

        Added 'B' to types handled by GetUpdateSQL/GetInsertSQL. +

        Fixed warning message in oci8 driver with $persist variable when using PConnect. +

        2.90 11 Dec 2002 +

        Mssql and mssqlpo and oci8po now support ADODB_ASSOC_CASE. +

        Now MetaType() can accept a field object as the first parameter. +

        New $arr = $db->ServerInfo( ) function. Returns $arr['description'] which + is the string description, and $arr['version']. +

        PostgreSQL and MSSQL speedups for insert/updates. +

        Implemented new SetFetchMode() that removes the need to use $ADODB_FETCH_MODE. + Each connection has independant fetchMode. +

        ADODB_ASSOC_CASE now defaults to 2, use native defaults. This is because we + would break backward compat for too many applications otherwise. +

        Patched encrypted sessions to use replace() +

        The qstr function supports quoting of nulls when escape character is \ +

        Rewrote bits and pieces of session code to check for time synch and improve + reliability. +

        Added property ADOConnection::hasTransactions = true/false; +

        Added CreateSequence and DropSequence functions +

        Found misplaced MoveNext() in adodb-postgres.inc.php. Fixed. +

        Sybase SelectLimit not reliable because 'set rowcount' not cached - fixed. +

        Moved ADOConnection to adodb-connection.inc.php and ADORecordSet to adodb-recordset.inc.php. + This allows us to use doxygen to generate documentation. Doxygen doesn't like + the classes in the main adodb.inc.php file for some mysterious reason. +

        2.50, 14 Nov 2002 +

        Added transOff and transCnt properties for disabling (transOff = true) and + tracking transaction status (transCnt>0). +

        Added inputarray handling into _adodb_pageexecute_all_rows - "Ross Smith" RossSmith#bnw.com. +

        Fixed postgresql inconsistencies in date handling. +

        Added support for mssql_fetch_assoc. +

        Fixed $ADODB_FETCH_MODE bug in odbc MetaTables() and MetaPrimaryKeys(). +

        Accidentally declared UnixDate() twice, making adodb incompatible with php + 4.3.0. Fixed. +

        Fixed pager problems with some databases that returned -1 for _currentRow on + MoveLast() by switching to MoveNext() in adodb-lib.inc.php. +

        Also fixed uninited $discard in adodb-lib.inc.php. +

        2.43, 25 Oct 2002

        +Added ADODB_ASSOC_CASE constant to better support ibase and odbc field names. +

        Added support for NConnect() for oracle OCINLogin. +

        Fixed NumCols() bug. +

        Changed session handler to use Replace() on write. +

        Fixed oci8 SelectLimit aggregate function bug again. +

        Rewrote pivoting code. +

        2.42, 4 Oct 2002

        +

        Fixed ibase_fetch() problem with nulls. Also interbase now does automatic blob + decoding, and is backward compatible. Suggested by Heinz Hombergs heinz#hhombergs.de. +

        Fixed postgresql MoveNext() problems when called repeatedly after EOF. Also + suggested by Heinz Hombergs. +

        PageExecute() does not rewrite queries if SELECT DISTINCT is used. Requested + by hans#velum.net +

        Added additional fixes to oci8 SelectLimit handling with aggregate functions + - thx to Christian Bugge for reporting the problem. +

        2.41, 2 Oct 2002

        +

        Fixed ADODB_COUNTRECS bug in odbc. Thx to Joshua Zoshi jzoshi#hotmail.com. +

        Increased buffers for adodb-csvlib.inc.php for extremely long sql from 8192 + to 32000. +

        Revised pivottable.inc.php code. Added better support for aggregate fields. +

        Fixed mysql text/blob types problem in MetaTypes base class - thx to horacio + degiorgi. +

        Added SQLDate($fmt,$date) function, which allows an sql date format string + to be generated - useful for group by's. +

        Fixed bug in oci8 SelectLimit when offset>100. +

        2.40 4 Sept 2002

        +

        Added new NLS_DATE_FORMAT property to oci8. Suggested by Laurent NAVARRO ln#altidev.com +

        Now use bind parameters in oci8 selectlimit for better performance. +

        Fixed interbase replaceQuote for dialect != 1. Thx to "BEGUIN Pierre-Henri + - INFOCOB" phb#infocob.com. +

        Added white-space check to QA. +

        Changed unixtimestamp to support fractional seconds (we always round down/floor + the seconds). Thanks to beezly#beezly.org.uk. +

        Now you can set the trigger_error type your own user-defined type in adodb-errorhandler.inc.php. + Suggested by Claudio Bustos clbustos#entelchile.net. +

        Added recordset filters with rsfilter.inc.php. +

        $conn->_rs2rs does not create a new recordset when it detects it is of type + array. Some trickery there as there seems to be a bug in Zend Engine +

        Added render_pagelinks to adodb-pager.inc.php. Code by "Pablo Costa" pablo#cbsp.com.br. +

        MetaType() speedup in adodb.inc.php by using hashing instead of switch. Best + performance if constant arrays are supported, as they are in PHP5. +

        adodb-session.php now updates only the expiry date if the crc32 check indicates + that the data has not been modified. +

        2.31 20 Aug 2002

        +

        Made changes to pivottable.inc.php due to daniel lucuzaeu's suggestions (we sum the pivottable column if desired). +

        Fixed ErrorNo() in postgres so it does not depend on _errorMsg property. +

        Robert Tuttle added support for oracle cursors. See ExecuteCursor(). +

        Fixed Replace() so it works with mysql when updating record where data has not changed. Reported by +Cal Evans (cal#calevans.com). +

        2.30 1 Aug 2002

        +

        Added pivottable.inc.php. Thanks to daniel.lucazeau#ajornet.com for the original + concept. +

        Added ADOConnection::outp($msg,$newline) to output error and debugging messages. Now +you can override this using the ADODB_OUTP constant and use your own output handler. +

        Changed == to === for 'null' comparison. Reported by ericquil#yahoo.com +

        Fixed mssql SelectLimit( ) bug when distinct used. +

        2.30 1 Aug 2002

        +

        New GetCol() and CacheGetCol() from ross#bnw.com that returns the first field as a 1 dim array. +

        We have an empty recordset, but RecordCount() could return -1. Fixed. Reported by "Jonathan Polansky" jonathan#polansky.com. +

        We now check for session variable changes using strlen($sessval).crc32($sessval). +Formerly we only used crc32(). +

        Informix SelectLimit() problem with $ADODB_COUNTRECS fixed. +

        Fixed informix SELECT FIRST x DISTINCT, and not SELECT DISTINCT FIRST x - reported by F Riosa +

        Now default adodb error handlers ignores error if @ used. +

        If you set $conn->autoRollback=true, we auto-rollback persistent connections for odbc, mysql, oci8, mssql. +Default for autoRollback is false. No need to do so for postgres. +As interbase requires a transaction id (what a flawed api), we don't do it for interbase. +

        Changed PageExecute() to use non-greedy preg_match when searching for "FROM" keyword. +

        2.20 9 July 2002

        +

        Added CacheGetOne($secs2cache,$sql), CacheGetRow($secs2cache,$sql), CacheGetAll($secs2cache,$sql). +

        Added $conn->OffsetDate($dayFraction,$date=false) to generate sql that calcs + date offsets. Useful for scheduling appointments. +

        Added connection properties: leftOuter, rightOuter that hold left and right + outer join operators. +

        Added connection property: ansiOuter to indicate whether ansi outer joins supported. +

        New driver mssqlpo, the portable mssql driver, which converts string + concat operator from || to +. +

        Fixed ms access bug - SelectLimit() did not support ties - fixed. +

        Karsten Kraus (Karsten.Kraus#web.de), contributed error-handling code to ADONewConnection. + Unfortunately due to backward compat problems, had to rollback most of the changes. +

        Added new parameter to GetAssoc() to allow returning an array of key-value pairs, +ignoring any additional columns in the recordset. Off by default. +

        Corrected mssql $conn->sysDate to return only date using convert(). +

        CacheExecute() improved debugging output. +

        Changed rs2html() so newlines are converted to BR tags. Also optimized rs2html() based +on feedback by "Jerry Workman" jerry#mtncad.com. +

        Added support for Replace() with Interbase, using DELETE and INSERT. +

        Some minor optimizations (mostly removing & references when passing arrays). +

        Changed GenID() to allows id's larger than the size of an integer. +

        Added force_session property to oci8 for better updateblob() support. +

        Fixed PageExecute() which did not work properly with sql containing GROUP BY. +

        2.12 12 June 2002

        +

        Added toexport.inc.php to export recordsets in CSV and tab-delimited format. +

        CachePageExecute() does not work - fixed - thx John Huong. +

        Interbase aliases not set properly in FetchField() - fixed. Thx Stefan Goethals. +

        Added cache property to adodb pager class. The number of secs to cache recordsets. +

        SQL rewriting bug in pageexecute() due to skipping of newlines due to missing /s modifier. Fixed. +

        Max size of cached recordset due to a bug was 256000 bytes. Fixed. +

        Speedup of 1st invocation of CacheExecute() by tuning code. +

        We compare $rewritesql with $sql in pageexecute code in case of rewrite failure. +

        2.11 7 June 2002

        +

        Fixed PageExecute() rewrite sql problem - COUNT(*) and ORDER BY don't go together with + mssql, access and postgres. Thx to Alexander Zhukov alex#unipack.ru +

        DB2 support for CHARACTER type added - thx John Huong huongch#bigfoot.com +

        For ado, $argProvider not properly checked. Fixed - kalimero#ngi.it +

        Added $conn->Replace() function for update with automatic insert if the record does not exist. + Supported by all databases except interbase. +

        2.10 4 June 2002

        +

        Added uniqueSort property to indicate mssql ORDER BY cols must be unique. +

        Optimized session handler by crc32 the data. We only write if session data has changed. +

        adodb_sess_read in adodb-session.php now returns ''correctly - thanks to Jorma Tuomainen, webmaster#wizactive.com +

        Mssql driver did not throw EXECUTE errors correctly because ErrorMsg() and ErrorNo() called in wrong order. +Pointed out by Alexios Fakos. Fixed. +

        Changed ado to use client cursors. This fixes BeginTran() problems with ado. +

        Added handling of timestamp type in ado. +

        Added to ado_mssql support for insert_id() and affected_rows(). +

        Added support for mssql.datetimeconvert=0, available since php 4.2.0. +

        Made UnixDate() less strict, so that the time is ignored if present. +

        Changed quote() so that it checks for magic_quotes_gpc. +

        Changed maxblobsize for odbc to default to 64000. +

        2.00 13 May 2002

        +

        Added drivers informix72 for pre-7.3 versions, and oci805 for + oracle 8.0.5, and postgres64 for postgresql 6.4 and earlier. The postgres and postgres7 drivers + are now identical. +

        Interbase now partially supports ADODB_FETCH_BOTH, by defaulting to ASSOC mode. +

        Proper support for blobs in mssql. Also revised blob support code +is base class. Now UpdateBlobFile() calls UpdateBlob() for consistency. +

        Added support for changed odbc_fetch_into api in php 4.2.0 +with $conn->_has_stupid_odbc_fetch_api_change. +

        Fixed spelling of tablock locking hint in GenID( ) for mssql. +

        Added RowLock( ) to several databases, including oci8, informix, sybase, etc. + Fixed where error in mssql RowLock(). +

        Added sysDate and sysTimeStamp properties to most database drivers. These are the sql +functions/constants for that database that return the current date and current timestamp, and +are useful for portable inserts and updates. +

        Support for RecordCount() caused date handling in sybase and mssql to break. +Fixed, thanks to Toni Tunkkari, by creating derived classes for ADORecordSet_array for +both databases. Generalized using arrayClass property. Also to support RecordCount(), +changed metatype handling for ado drivers. Now the type returned in FetchField + is no longer a number, but the 1-char data type returned by MetaType. + At the same time, fixed a lot of date handling. Now mssql support dmy and mdy date formats. +Also speedups in sybase and mssql with preg_match and ^ in date/timestamp handling. +Added support in sybase and mssql for 24 hour clock in timestamps (no AM/PM). +

        Extensive revisions to informix driver - thanks to Samuel CARRIERE samuel_carriere#hotmail.com +

        Added $ok parameter to CommitTrans($ok) for easy rollbacks. +

        Fixed odbc MetaColumns and MetaTables to save and restore $ADODB_FETCH_MODE. +

        Some odbc drivers did not call the base connection class constructor. Fixed. +

        Fixed regex for GetUpdateSQL() and GetInsertSQL() to support more legal character combinations. + +

        1.99 21 April 2002

        +

        Added emulated RecordCount() to all database drivers if $ADODB_COUNTRECS = true + (which it is by default). Inspired by Cristiano Duarte (cunha17#uol.com.br). +

        Unified stored procedure support for mssql and oci8. Parameter() and PrepareSP() + functions implemented. +

        Added support for SELECT FIRST in informix, modified hasTop property to support + this. +

        Changed csv driver to handle updates/deletes/inserts properly (when Execute() returns true). +Bind params also work now, and raiseErrorFn with csv driver. Added csv driver to QA process. +

        Better error checking in oci8 UpdateBlob() and UpdateBlobFile(). +

        Added TIME type to MySQL - patch by Manfred h9125297#zechine.wu-wien.ac.at +

        Prepare/Execute implemented for Interbase/Firebird +

        Changed some regular expressions to be anchored by /^ $/ for speed. +

        Added UnixTimeStamp() and UnixDate() to ADOConnection(). Now these functions + are in both ADOConnection and ADORecordSet classes. +

        Empty recordsets were not cached - fixed. +

        Thanks to Gaetano Giunta (g.giunta#libero.it) for the oci8 code review. We + didn't agree on everything, but i hoped we agreed to disagree! +

        1.90 6 April 2002

        +

        Now all database drivers support fetch modes ADODB_FETCH_NUM and ADODB_FETCH_ASSOC, though + still not fully tested. Eg. Frontbase, Sybase, Informix. +

        NextRecordSet() support for mssql. Contributed by "Sven Axelsson" sven.axelsson#bokochwebb.se +

        Added blob support for SQL Anywhere. Contributed by Wade Johnson wade#wadejohnson.de +

        Fixed some security loopholes in server.php. Server.php also supports fetch mode. +

        Generalized GenID() to support odbc and mssql drivers. Mssql no longer generates GUID's. +

        Experimental RowLock($table,$where) for mssql. +

        Properly implemented Prepare() in oci8 and ODBC. +

        Added Bind() support to oci8 to support Prepare(). +

        Improved error handler. Catches CacheExecute() and GenID() errors now. +

        Now if you are running php from the command line, debugging messages do not output html formating. +Not 100% complete, but getting there. +

        1.81 22 March 2002

        +

        Restored default $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT for backward compatibility. +

        SelectLimit for oci8 improved - Our FIRST_ROWS optimization now does not overwrite existing hint. +

        New Sybase SQL Anywhere driver. Contributed by Wade Johnson wade#wadejohnson.de +

        1.80 15 March 2002

        +

        Redesigned directory structure of ADOdb files. Added new driver directory where +all database drivers reside. +

        Changed caching algorithm to create subdirectories. Now we scale better. +

        Informix driver now supports insert_id(). Contribution by "Andrea Pinnisi" pinnisi#sysnet.it +

        Added experimental ISO date and FetchField support for informix. +

        Fixed a quoting bug in Execute() with bind parameters, causing problems with blobs. +

        Mssql driver speedup by 10-15%. +

        Now in CacheExecute($secs2cache,$sql,...), $secs2cache is optional. If missing, it will +take the value defined in $connection->cacheSecs (default is 3600 seconds). Note that +CacheSelectLimit(), the secs2cache is still compulsory - sigh. +

        Sybase SQL Anywhere driver (using ODBC) contributed by Wade Johnson wade#wadejohnson.de +

        1.72 8 March 2002

        +

        Added @ when returning Fields() to prevent spurious error - "Michael William Miller" mille562#pilot.msu.edu +

        MetaDatabases() for postgres contributed by Phil pamelant#nerim.net +

        Mitchell T. Young (mitch#youngfamily.org) contributed informix driver. +

        Fixed rs2html() problem. I cannot reproduce, so probably a problem with pre PHP 4.1.0 versions, + when supporting new ADODB_FETCH_MODEs. +

        Mattia Rossi (mattia#technologist.com) contributed BlobDecode() and UpdateBlobFile() for postgresql + using the postgres specific pg_lo_import()/pg_lo_open() - i don't use them but hopefully others will + find this useful. See this posting + for an example of usage. +

        Added UpdateBlobFile() for uploading files to a database. +

        Made UpdateBlob() compatible with oci8po driver. +

        Added noNullStrings support to oci8 driver. Oracle changes all ' ' strings to nulls, + so you need to set strings to ' ' to prevent the nullifying of strings. $conn->noNullStrings = true; + will do this for you automatically. This is useful when you define a char column as NOT NULL. +

        Fixed UnixTimeStamp() bug - wasn't setting minutes and seconds properly. Patch from Agusti Fita i Borrell agusti#anglatecnic.com. +

        Toni Tunkkari added patch for sybase dates. Problem with spaces in day part of date fixed. +

        1.71 18 Jan 2002

        +

        Sequence start id support. Now $conn->Gen_ID('seqname', 50) to start sequence from 50. +

        CSV driver fix for selectlimit, from Andreas - akaiser#vocote.de. +

        Gam3r spotted that a global variable was undefined in the session handler. +

        Mssql date regex had error. Fixed - reported by Minh Hoang vb_user#yahoo.com. +

        DBTimeStamp() and DBDate() now accept iso dates and unix timestamps. This means +that the PostgreSQL handling of dates in GetInsertSQL() and GetUpdateSQL() can +be removed. Also if these functions are passed '' or null or false, we return a SQL null. +

        GetInsertSQL() and GetUpdateSQL() now accept a new parameter, $magicq to +indicate whether quotes should be inserted based on magic quote settings - suggested by +dj#4ict.com. +

        Reformated docs slightly based on suggestions by Chris Small. +

        1.65 28 Dec 2001

        +

        Fixed borland_ibase class naming bug. +

        Now instead of using $rs->fields[0] internally, we use reset($rs->fields) so + that we are compatible with ADODB_FETCH_ASSOC mode. Reported by Nico S. +

        Changed recordset constructor and _initrs() for oci8 so that it returns the field definitions even + if no rows in the recordset. Reported by Rick Hickerson (rhickers#mv.mv.com). +

        Improved support for postgresql in GetInsertSQL and GetUpdateSQL by + "mike" mike#partner2partner.com and "Ryan Bailey" rebel#windriders.com +

        1.64 20 Dec 2001

        +

        Danny Milosavljevic <danny.milo#gmx.net> added some patches for MySQL error handling +and displaying default values. +

        Fixed some ADODB_FETCH_BOTH inconsistencies in odbc and interbase. +

        Added more tests to test suite to cover ADODB_FETCH_* and ADODB_ERROR_HANDLER. +

        Added firebird (ibase) driver +

        Added borland_ibase driver for interbase 6.5 +

        1.63 13 Dec 2001

        +Absolute to the adodb-lib.inc.php file not set properly. Fixed.

        + +

        1.62 11 Dec 2001

        +

        Major speedup of ADOdb for low-end web sites by reducing the php code loading and compiling +cycle. We conditionally compile not so common functions. +Moved csv code to adodb-csvlib.inc.php to reduce adodb.inc.php parsing. This file +is loaded only when the csv/proxy driver is used, or CacheExecute() is run. +Also moved PageExecute(), GetSelectSQL() and GetUpdateSQL() core code to adodb-lib.inc.php. +This reduced the 70K main adodb.inc.php file to 55K, and since at least 20K of the file +is comments, we have reduced 50K of code in adodb.inc.php to 35K. There + should be 35% reduction in memory and thus 35% speedup in compiling the php code for the +main adodb.inc.php file. +

        Highly tuned SelectLimit() for oci8 for massive speed improvements on large files. +Selecting 20 rows starting from the 20,000th row of a table is now 7 times faster. +Thx to Tomas V V Cox. +

        Allow . and # in table definitions in GetInsertSQL and GetUpdateSQL. + See ADODB_TABLE_REGEX constant. Thx to Ari Kuorikoski. +

        Added ADODB_PREFETCH_ROWS constant, defaulting to 10. This determines the number +of records to prefetch in a SELECT statement. Only used by oci8.

        +

        Added high portability Oracle class called oci8po. This uses ? for bind variables, and +lower cases column names.

        +

        Now all database drivers support $ADODB_FETCH_MODE, including interbase, ado, and odbc: +ADODB_FETCH_NUM and ADODB_FETCH_ASSOC. ADODB_FETCH_BOTH is not fully implemented for all +database drivers. +

        1.61 Nov 2001

        +

        Added PO_RecordCount() and PO_Insert_ID(). PO stands for portable. Pablo Roca + [pabloroca#mvps.org]

        +

        GenID now returns 0 if not available. Safer is that you should check $conn->hasGenID + for availability.

        +

        M'soft ADO we now correctly close recordset in _close() peterd#telephonetics.co.uk

        +

        MSSQL now supports GenID(). It generates a 16-byte GUID from mssql newid() + function.

        +

        Changed ereg_replace to preg_replace in SelectLimit. This is a fix for mssql. + Ereg doesn't support t or n! Reported by marino Carlos xaplo#postnuke-espanol.org

        +

        Added $recordset->connection. This is the ADOConnection object for the recordset. +Works with cached and normal recordsets. Surprisingly, this had no affect on performance!

        +

        1.54 15 Nov 2001

        +Fixed some more bugs in PageExecute(). I am getting sick of bug in this and will have to +reconsider my QA here. The main issue is that I don't use PageExecute() and +to check whether it is working requires a visual inspection of the html generated currently. +It is possible to write a test script but it would be quite complicated :( +

        More speedups of SelectLimit() for DB2, Oci8, access, vfp, mssql. +

        + +

        1.53 7 Nov 2001

        +Added support for ADODB_FETCH_ASSOC for ado and odbc drivers.

        +Tuned GetRowAssoc(false) in postgresql and mysql.

        +Stephen Van Dyke contributed ADOdb icon, accepted with some minor mods.

        +Enabled Affected_Rows() for postgresql

        +Speedup for Concat() using implode() - Benjamin Curtis ben_curtis#yahoo.com

        +Fixed some more bugs in PageExecute() to prevent infinite loops

        +

        1.52 5 Nov 2001

        +Spelling error in CacheExecute() caused it to fail. $ql should be $sql in line 625!

        +Added fixes for parsing [ and ] in GetUpdateSQL(). +

        1.51 5 Nov 2001

        +

        Oci8 SelectLimit() speedup by using OCIFetch(). +

        Oci8 was mistakenly reporting errors when $db->debug = true. +

        If a connection failed with ODBC, it was not correctly reported - fixed. +

        _connectionID was inited to -1, changed to false. +

        Added $rs->FetchRow(), to simplify API, ala PEAR DB +

        Added PEAR DB compat mode, which is still faster than PEAR! See adodb-pear.inc.php. +

        Removed postgres pconnect debugging statement. +

        1.50 31 Oct 2001

        +

        ADOdbConnection renamed to ADOConnection, and ADOdbFieldObject to ADOFieldObject. +

        PageExecute() now checks for empty $rs correctly, and the errors in the docs on this subject have been fixed. +

        odbc_error() does not return 6 digit error correctly at times. Implemented workaround. +

        Added ADORecordSet_empty class. This will speedup INSERTS/DELETES/UPDATES because the return +object created is much smaller. +

        Added Prepare() to odbc, and oci8 (but doesn't work properly for oci8 still). +

        Made pgsql a synonym for postgre7, and changed SELECT LIMIT to use OFFSET for compat with +postgres 7.2. +

        Revised adodb-cryptsession.php thanks to Ari. +

        Set resources to false on _close, to force freeing of resources. +

        Added adodb-errorhandler.inc.php, adodb-errorpear.inc.php and raiseErrorFn on Freek's urging. +

        GetRowAssoc($toUpper=true): $toUpper added as default. +

        Errors when connecting to a database were not captured formerly. Now we do it correctly. +

        1.40 19 September 2001

        +

        PageExecute() to implement page scrolling added. Code and idea by Iván Oliva.

        +

        Some minor postgresql fixes.

        +

        Added sequence support using GenID() for postgresql, oci8, mysql, interbase.

        +

        Added UpdateBlob support for interbase (untested).

        +

        Added encrypted sessions (see adodb-cryptsession.php). By Ari Kuorikoski <kuoriari#finebyte.com>

        +

        1.31 21 August 2001

        +

        Many bug fixes thanks to "GaM3R (Cameron)" <gamr#outworld.cx>. Some session changes due to Gam3r. +

        Fixed qstr() to quote also. +

        rs2html() now pretty printed. +

        Jonathan Younger jyounger#unilab.com contributed the great idea GetUpdateSQL() and GetInsertSQL() which +generates SQL to update and insert into a table from a recordset. Modify the recordset fields +array, then can this function to generate the SQL (the SQL is not executed). +

        "Nicola Fankhauser" <nicola.fankhauser#couniq.com> found some bugs in date handling for mssql.

        +

        Added minimal Oracle support for LOBs. Still under development.

        +Added $ADODB_FETCH_MODE so you can control whether recordsets return arrays which are +numeric, associative or both. This is a global variable you set. Currently only MySQL, Oci8, Postgres +drivers support this. +

        PostgreSQL properly closes recordsets now. Reported by several people. +

        +Added UpdateBlob() for Oracle. A hack to make it easier to save blobs. +

        +Oracle timestamps did not display properly. Fixed. +

        1.20 6 June 2001

        +

        Now Oracle can connect using tnsnames.ora or server and service name

        +

        Extensive Oci8 speed optimizations. +Oci8 code revised to support variable binding, and /*+ FIRST_ROWS */ hint.

        +

        Worked around some 4.0.6 bugs in odbc_fetch_into().

        +

        Paolo S. Asioli paolo.asioli#libero.it suggested GetRowAssoc().

        +

        Escape quotes for oracle wrongly set to '. Now '' is used.

        +

        Variable binding now works in ODBC also.

        +

        Jumped to version 1.20 because I don't like 13 :-)

        +

        1.12 6 June 2001

        +

        Changed $ADODB_DIR to ADODB_DIR constant to plug a security loophole.

        +

        Changed _close() to close persistent connections also. Prevents connection leaks.

        +

        Major revision of oracle and oci8 drivers. +Added OCI_RETURN_NULLS and OCI_RETURN_LOBS to OCIFetchInto(). BLOB, CLOB and VARCHAR2 recognition +in MetaType() improved. MetaColumns() returns columns in correct sort order.

        +

        Interbase timestamp input format was wrong. Fixed.

        +

        1.11 20 May 2001

        +

        Improved file locking for Windows.

        +

        Probabilistic flushing of cache to avoid avalanche updates when cache timeouts.

        +

        Cached recordset timestamp not saved in some scenarios. Fixed.

        +

        1.10 19 May 2001

        +

        Added caching. CacheExecute() and CacheSelectLimit(). +

        Added csv driver. See http://php.weblogs.com/ADODB_csv. +

        Fixed SelectLimit(), SELECT TOP not working under certain circumstances. +

        Added better Frontbase support of MetaTypes() by Frank M. Kromann. +

        1.01 24 April 2001

        +

        Fixed SelectLimit bug. not quoted properly. +

        SelectLimit: SELECT TOP -1 * FROM TABLE not support by Microsoft. Fixed.

        +

        GetMenu improved by glen.davies#cce.ac.nz to support multiple hilited items

        +

        FetchNextObject() did not work with only 1 record returned. Fixed bug reported by $tim#orotech.net

        +

        Fixed mysql field max_length problem. Fix suggested by Jim Nicholson (jnich#att.com)

        +

        1.00 16 April 2001

        +

        Given some brilliant suggestions on how to simplify ADOdb by akul. You no longer need to +setup $ADODB_DIR yourself, and ADOLoadCode() is automatically called by ADONewConnection(), +simplifying the startup code.

        +

        FetchNextObject() added. Suggested by Jakub Marecek. This makes FetchObject() obsolete, as +this is more flexible and powerful.

        +

        Misc fixes to SelectLimit() to support Access (top must follow distinct) and Fields() +in the array recordset. From Reinhard Balling.

        +

        0.96 27 Mar 2001

        +

        ADOConnection Close() did not return a value correctly. Thanks to akul#otamedia.com.

        +

        When the horrible magic_quotes is enabled, back-slash () is changed to double-backslash (\). +This doesn't make sense for Microsoft/Sybase databases. We fix this in qstr().

        +

        Fixed Sybase date problem in UnixDate() thanks to Toni Tunkkari. Also fixed MSSQL problem +in UnixDate() - thanks to milhouse31#hotmail.com.

        +

        MoveNext() moved to leaf classes for speed in MySQL/PostgreSQL. 10-15% speedup.

        +

        Added null handling in bindInputArray in Execute() -- Ron Baldwin suggestion.

        +

        Fixed some option tags. Thanks to john#jrmstudios.com.

        +

        0.95 13 Mar 2001

        +

        Added postgres7 database driver which supports LIMIT and other version 7 stuff in the future.

        +

        Added SelectLimit to ADOConnection to simulate PostgreSQL's "select * from table limit 10 offset 3". +Added helper function GetArrayLimit() to ADORecordSet.

        +

        Fixed mysql metacolumns bug. Thanks to Freek Dijkstra (phpeverywhere#macfreek.com).

        +

        Also many PostgreSQL changes by Freek. He almost rewrote the whole PostgreSQL driver!

        +

        Added fix to input parameters in Execute for non-strings by Ron Baldwin.

        +

        Added new metatype, X for TeXt. Formerly, metatype B for Blob also included +text fields. Now 'B' is for binary/image data. 'X' for textual data.

        +

        Fixed $this->GetArray() in GetRows().

        +

        Oracle and OCI8: 1st parameter is always blank -- now warns if it is filled.

        +

        Now hasLimit and hasTop added to indicate whether +SELECT * FROM TABLE LIMIT 10 or SELECT TOP 10 * FROM TABLE are supported.

        +

        0.94 04 Feb 2001

        +

        Added ADORecordSet::GetRows() for compatibility with Microsoft ADO. Synonym for GetArray().

        +

        Added new metatype 'R' to represent autoincrement numbers.

        +

        Added ADORecordSet.FetchObject() to return a row as an object.

        +

        Finally got a Linux box to test PostgreSql. Many fixes.

        +

        Fixed copyright misspellings in 0.93.

        +

        Fixed mssql MetaColumns type bug.

        +

        Worked around odbc bug in PHP4 for sessions.

        +

        Fixed many documentation bugs (affected_rows, metadatabases, qstr).

        +

        Fixed MySQL timestamp format (removed comma).

        +

        Interbase driver did not call ibase_pconnect(). Fixed.

        +

        0.93 18 Jan 2002

        +

        Fixed GetMenu bug.

        +

        Simplified Interbase commit and rollback.

        +

        Default behaviour on closing a connection is now to rollback all active transactions.

        +

        Added field object handling for array recordset for future XML compatibility.

        +

        Added arr2html() to convert array to html table.

        +

        0.92 2 Jan 2002

        +

        Interbase Commit and Rollback should be working again.

        +

        Changed initialisation of ADORecordSet. This is internal and should not affect users. We +are doing this to support cached recordsets in the future.

        + +

        Implemented ADORecordSet_array class. This allows you to simulate a database recordset +with an array.

        +

        Added UnixDate() and UnixTimeStamp() to ADORecordSet.

        +

        0.91 21 Dec 2000

        +

        Fixed ODBC so ErrorMsg() is working.

        +

        Worked around ADO unrecognised null (0x1) value problem in COM.

        +

        Added Sybase support for FetchField() type

        +

        Removed debugging code and unneeded html from various files

        +

        Changed to javadoc style comments to adodb.inc.php.

        +

        Added maxsql as synonym for mysqlt

        +

        Now ODBC downloads first 8K of blob by default +

        0.90 15 Nov 2000

        +

        Lots of testing of Microsoft ADO. Should be more stable now.

        +

        Added $ADODB_COUNTREC. Set to false for high speed selects.

        +

        Added Sybase support. Contributed by Toni Tunkkari (toni.tunkkari#finebyte.com). Bug in Sybase + API: GetFields is unable to determine date types.

        +

        Changed behaviour of RecordSet.GetMenu() to support size parameter (listbox) properly.

        +

        Added emptyDate and emptyTimeStamp to RecordSet class that defines how to represent + empty dates.

        +

        Added MetaColumns($table) that returns an array of ADOFieldObject's listing + the columns of a table.

        +

        Added transaction support for PostgresSQL -- thanks to "Eric G. Werk" egw#netguide.dk.

        +

        Added adodb-session.php for session support.

        +

        0.80 30 Nov 2000

        +

        Added support for charSet for interbase. Implemented MetaTables for most databases. + PostgreSQL more extensively tested.

        +

        0.71 22 Nov 2000

        +

        Switched from using require_once to include/include_once for backward compatability with PHP 4.02 and earlier.

        +

        0.70 15 Nov 2000

        +

        Calls by reference have been removed (call_time_pass_reference=Off) to ensure compatibility with future versions of PHP, +except in Oracle 7 driver due to a bug in php_oracle.dll.

        +

        PostgreSQL database driver contributed by Alberto Cerezal (acerezalp#dbnet.es). +

        +

        Oci8 driver for Oracle 8 contributed by George Fourlanos (fou#infomap.gr).

        +

        Added mysqlt database driver to support MySQL 3.23 which has transaction + support.

        +

        Oracle default date format (DD-MON-YY) did not match ADOdb default date format (which is YYYY-MM-DD). Use ALTER SESSION to force the default date.

        +

        Error message checking is now included in test suite.

        +

        MoveNext() did not check EOF properly -- fixed.

        +

        0.60 Nov 8 2000

        +

        Fixed some constructor bugs in ODBC and ADO. Added ErrorNo function to ADOConnection + class.

        +

        0.51 Oct 18 2000

        +

        Fixed some interbase bugs.

        +

        0.50 Oct 16 2000

        +

        Interbase commit/rollback changed to be compatible with PHP 4.03.

        +

        CommitTrans( ) will now return true if transactions not supported.

        +

        Conversely RollbackTrans( ) will return false if transactions not supported. +

        +

        0.46 Oct 12

        +Many Oracle compatibility issues fixed. +

        0.40 Sept 26

        +

        Many bug fixes

        +

        Now Code for BeginTrans, CommitTrans and RollbackTrans is working. So is the Affected_Rows +and Insert_ID. Added above functions to test.php.

        +

        ADO type handling was busted in 0.30. Fixed.

        +

        Generalised Move( ) so it works will all databases, including ODBC.

        +

        0.30 Sept 18

        +

        Renamed ADOLoadDB to ADOLoadCode. This is clearer.

        +

        Added BeginTrans, CommitTrans and RollbackTrans functions.

        +

        Added Affected_Rows() and Insert_ID(), _affectedrows() and _insertID(), ListTables(), + ListDatabases(), ListColumns().

        +

        Need to add New_ID() and hasInsertID and hasAffectedRows, autoCommit

        +

        0.20 Sept 12

        +

        Added support for Microsoft's ADO.

        +

        Added new field to ADORecordSet -- canSeek

        +

        Added new parameter to _fetch($ignore_fields = false). Setting to true will + not update fields array for faster performance.

        +

        Added new field to ADORecordSet/ADOConnection -- dataProvider to indicate whether + a class is derived from odbc or ado.

        +

        Changed class ODBCFieldObject to ADOFieldObject -- not documented currently.

        +

        Added benchmark.php and testdatabases.inc.php to the test suite.

        +

        Added to ADORecordSet FastForward( ) for future high speed scrolling. Not documented.

        +

        Realised that ADO's Move( ) uses relative positioning. ADOdb uses absolute. +

        +

        0.10 Sept 9 2000

        +

        First release

        + \ No newline at end of file diff --git a/fannie/adodb5/docs/readme.htm b/fannie/adodb5/docs/readme.htm new file mode 100644 index 000000000..4780cb788 --- /dev/null +++ b/fannie/adodb5/docs/readme.htm @@ -0,0 +1,68 @@ + + +ADODB Manual + + + + + +

        ADOdb Library for PHP

        +

        ADOdb is a suite of database libraries that allow you to connect to multiple + databases in a portable manner. Download from http://adodb.sourceforge.net/. +

        • The ADOdb documentation has moved to docs-adodb.htm + This allows you to query, update and insert records using a portable API. +

        • The ADOdb data dictionary docs are at docs-datadict.htm. + This allows you to create database tables and indexes in a portable manner. +

        • The ADOdb database performance monitoring docs are at docs-perf.htm. + This allows you to perform health checks, tune and monitor your database. +

        • The ADOdb database-backed session docs are at docs-session.htm. +
        +

        +

        Installation

        +Make sure you are running PHP4.0.4 or later. Unpack all the files into a directory accessible by your webserver. +

        +To test, try modifying some of the tutorial examples. Make sure you customize the connection settings correctly. You can debug using: +

        +<?php
        +include('adodb/adodb.inc.php');
        +
        +$db = ADONewConnection($driver); # eg. 'mysql' or 'oci8' 
        +$db->debug = true;
        +$db->Connect($server, $user, $password, $database);
        +$rs = $db->Execute('select * from some_small_table');
        +print "<pre>";
        +print_r($rs->GetRows());
        +print "</pre>";
        +?>
        +
        +

        How are people using ADOdb

        +Here are some examples of how people are using ADOdb: +
          +
        • PhpLens is a commercial data grid component that allows + both cool Web designers and serious unshaved programmers to develop and + maintain databases on the Web easily. Developed by the author of ADOdb. +
        • +
        • PHAkt: PHP Extension for DreamWeaver Ultradev allows + you to script PHP in the popular Web page editor. Database handling provided + by ADOdb.
        • +
        • Analysis Console for Intrusion Databases (ACID): PHP-based + analysis engine to search and process a database of security incidents + generated by security-related software such as IDSes and firewalls (e.g. + Snort, ipchains). By Roman Danyliw.
        • +
        • PostNuke is a very popular free content management system + and weblog system. It offers full CSS support, HTML 4.01 transitional + compliance throughout, an advanced blocks system, and is fully multi-lingual + enabled.
        • +
        • EasyPublish CMS is another free content management system + for managing information and integrated modules on your internet, intranet- + and extranet-sites. From Norway.
        • +
        • NOLA is a full featured accounting, inventory, and job + tracking application. It is licensed under the GPL, and developed by Noguska. +
        • +
        + + diff --git a/fannie/adodb5/docs/tips_portable_sql.htm b/fannie/adodb5/docs/tips_portable_sql.htm new file mode 100644 index 000000000..aa75069ca --- /dev/null +++ b/fannie/adodb5/docs/tips_portable_sql.htm @@ -0,0 +1,367 @@ + + + + + Tips on Writing Portable SQL for Multiple Databases for PHP + + + +

        Tips on Writing Portable SQL  

        +
        +

        Updated 6 Oct 2006. Added OffsetDate example. +

        Updated 18 Sep 2003. Added Portable Native SQL section. +

        + + If you are writing an application that is used in multiple environments and + operating systems, you need to plan to support multiple databases. This article + is based on my experiences with multiple database systems, stretching from 4th + Dimension in my Mac days, to the databases I currently use, which are: Oracle, + FoxPro, Access, MS SQL Server and MySQL. Although most of the advice here applies + to using SQL with Perl, Python and other programming languages, I will focus on PHP and how + the ADOdb database abstraction library + offers some solutions.

        +

        Most database vendors practice product lock-in. The best or fastest way to + do things is often implemented using proprietary extensions to SQL. This makes + it extremely hard to write portable SQL code that performs well under all conditions. + When the first ANSI committee got together in 1984 to standardize SQL, the database + vendors had such different implementations that they could only agree on the + core functionality of SQL. Many important application specific requirements + were not standardized, and after so many years since the ANSI effort began, + it looks as if much useful database functionality will never be standardized. + Even though ANSI-92 SQL has codified much more, we still have to implement portability + at the application level.

        +

        Selects

        +

        The SELECT statement has been standardized to a great degree. Nearly every + database supports the following:

        +

        SELECT [cols] FROM [tables]
        +   [WHERE conditions]
        +   [GROUP BY cols]
        +   [HAVING conditions]
        +   [ORDER BY cols]

        +

        But so many useful techniques can only be implemented by using proprietary + extensions. For example, when writing SQL to retrieve the first 10 rows for + paging, you could write...

        + + + + + + + + + + + + + + + + + + + + + + + + + +
        DatabaseSQL Syntax
        DB2select * from table fetch first 10 rows only
        Informixselect first 10 * from table
        Microsoft SQL Server and Accessselect top 10 * from table
        MySQL and PostgreSQLselect * from table limit 10
        Oracle 8iselect * from (select * from table) where rownum <= 10
        +

        This feature of getting a subset of data is so useful that in the PHP class + library ADOdb, we have a SelectLimit( ) function that allows you to hide the + implementation details within a function that will rewrite your SQL for you:

        +
        $connection->SelectLimit('select * from table', 10);
        +
        +

        Selects: Fetch Modes

        +

        PHP allows you to retrieve database records as arrays. You can choose to have + the arrays indexed by field name or number. However different low-level PHP + database drivers are inconsistent in their indexing efforts. ADOdb allows you + to determine your prefered mode. You set this by setting the variable $ADODB_FETCH_MODE + to either of the constants ADODB_FETCH_NUM (for numeric indexes) or ADODB_FETCH_ASSOC + (using field names as an associative index).

        +

        The default behaviour of ADOdb varies depending on the database you are using. + For consistency, set the fetch mode to either ADODB_FETCH_NUM (for speed) or + ADODB_FETCH_ASSOC (for convenience) at the beginning of your code.

        +

        Selects: Counting Records

        +

        Another problem with SELECTs is that some databases do not return the number + of rows retrieved from a select statement. This is because the highest performance + databases will return records to you even before the last record has been found. +

        +

        In ADOdb, RecordCount( ) returns the number of rows returned, or will emulate + it by buffering the rows and returning the count after all rows have been returned. + This can be disabled for performance reasons when retrieving large recordsets + by setting the global variable $ADODB_COUNTRECS = false. This variable is checked + every time a query is executed, so you can selectively choose which recordsets + to count.

        +

        If you prefer to set $ADODB_COUNTRECS = false, ADOdb still has the PO_RecordCount( + ) function. This will return the number of rows, or if it is not found, it will + return an estimate using SELECT COUNT(*):

        +
        $rs = $db->Execute("select * from table where state=$state");
        +$numrows = $rs->PO_RecordCount('table', "state=$state");
        +

        Selects: Locking

        +

        SELECT statements are commonly used to implement row-level locking of tables. + Other databases such as Oracle, Interbase, PostgreSQL and MySQL with InnoDB + do not require row-level locking because they use versioning to display data + consistent with a specific point in time.

        +

        Currently, I recommend encapsulating the row-level locking in a separate function, + such as RowLock($table, $where):

        +
        $connection->BeginTrans( );
        +$connection->RowLock($table, $where); 
        +
        # some operation
        +
        if ($ok) $connection->CommitTrans( );
        +else $connection->RollbackTrans( );
        +
        +

        Selects: Outer Joins

        +

        Not all databases support outer joins. Furthermore the syntax for outer joins + differs dramatically between database vendors. One portable (and possibly slower) + method of implementing outer joins is using UNION.

        +

        For example, an ANSI-92 left outer join between two tables t1 and t2 could + look like:

        +
        SELECT t1.col1, t1.col2, t2.cola 
        FROM t1 LEFT JOIN t2 ON t1.col = t2.col
        +

        This can be emulated using:

        +
        SELECT t1.col1, t1.col2, t2.cola FROM t1, t2 
        WHERE t1.col = t2.col + UNION ALL +SELECT col1, col2, null FROM t1
        WHERE t1.col not in (select distinct col from t2) +
        +

        Since ADOdb 2.13, we provide some hints in the connection object as to legal + join variations. This is still incomplete and sometimes depends on the database + version you are using, but is useful as a general guideline:

        +

        $conn->leftOuter: holds the + operator used for left outer joins (eg. '*='), or false if not known or not + available.
        + $conn->rightOuter: holds the + operator used for right outer joins (eg '=*'), or false if not known or not + available.
        + $conn->ansiOuter: boolean + that if true means that ANSI-92 style outer joins are supported, or false if + not known.

        +

        Inserts

        +

        When you create records, you need to generate unique id's for each record. + There are two common techniques: (1) auto-incrementing columns and (2) sequences. +

        +

        Auto-incrementing columns are supported by MySQL, Sybase and Microsoft Access + and SQL Server. However most other databases do not support this feature. So + for portability, you have little choice but to use sequences. Sequences are + special functions that return a unique incrementing number every time you call + it, suitable to be used as database keys. In ADOdb, we use the GenID( ) function. + It has takes a parameter, the sequence name. Different tables can have different + sequences.

        +
        $id = $connection->GenID('sequence_name');
        $connection->Execute("insert into table (id, firstname, lastname)
        values ($id, $firstname, $lastname)");
        +

        For databases that do not support sequences natively, ADOdb emulates sequences + by creating a table for every sequence.

        +

        Binding

        +

        Binding variables in an SQL statement is another tricky feature. Binding is + useful because it allows pre-compilation of SQL. When inserting multiple records + into a database in a loop, binding can offer a 50% (or greater) speedup. However + many databases such as Access and MySQL do not support binding natively and + there is some overhead in emulating binding. Furthermore, different databases + (specificly Oracle!) implement binding differently. My recommendation is to + use binding if your database queries are too slow, but make sure you are using + a database that supports it like Oracle.

        +

        ADOdb supports portable Prepare/Execute with:

        +
        $stmt = $db->Prepare('select * from customers where custid=? and state=?');
        +$rs = $db->Execute($stmt, array($id,'New York'));
        +

        Oracle uses named bind placeholders, not "?", so to support portable binding, we have Param() that generates +the correct placeholder (available since ADOdb 3.92): +

        $sql = 'insert into table (col1,col2) values ('.$DB->Param('a').','.$DB->Param('b').')';
        +# generates 'insert into table (col1,col2) values (?,?)'
        +# or        'insert into table (col1,col2) values (:a,:b)'
        +$stmt = $DB->Prepare($sql);
        +$stmt = $DB->Execute($stmt,array('one','two'));
        +
        + +

        Portable Native SQL

        +

        ADOdb provides the following functions for portably generating SQL functions + as strings to be merged into your SQL statements (some are only available since + ADOdb 3.92):

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        FunctionDescription
        DBDate($date)Pass in a UNIX timestamp or ISO date and it will convert it to a date + string formatted for INSERT/UPDATE
        DBTimeStamp($date)Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp + string formatted for INSERT/UPDATE
        SQLDate($date, $fmt)Portably generate a date formatted using $fmt mask, for use in SELECT + statements.
        OffsetDate($date, $ndays)Portably generate a $date offset by $ndays.
        Concat($s1, $s2, ...)Portably concatenate strings. Alternatively, for mssql use mssqlpo driver, + which allows || operator.
        IfNull($fld, $replaceNull)Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.
        Param($name)Generates bind placeholders, using ? or named conventions as appropriate.
        $db->sysDateProperty that holds the SQL function that returns today's date
        $db->sysTimeStampProperty that holds the SQL function that returns the current +timestamp (date+time). +
        $db->concat_operatorProperty that holds the concatenation operator +
        $db->lengthProperty that holds the name of the SQL strlen function. +
        $db->upperCaseProperty that holds the name of the SQL strtoupper function. +
        $db->randomProperty that holds the SQL to generate a random number between 0.00 and 1.00. +
        $db->substrProperty that holds the name of the SQL substring function. +
        +

         

        +

        DDL and Tuning

        +There are database design tools such as ERWin or Dezign that allow you to generate data definition language commands such as ALTER TABLE or CREATE INDEX from Entity-Relationship diagrams. +

        +However if you prefer to use a PHP-based table creation scheme, adodb provides you with this feature. Here is the code to generate the SQL to create a table with: +

          +
        1. Auto-increment primary key 'ID',
        2. +
        3. The person's 'NAME' VARCHAR(32) NOT NULL and defaults to '',
        4. +
        5. The date and time of record creation 'CREATED',
        6. +
        7. The person's 'AGE', defaulting to 0, type NUMERIC(16).
        8. +
        +

        +Also create a compound index consisting of 'NAME' and 'AGE': +

        +$datadict = NewDataDictionary($connection);
        +$flds = " 
        +  ID I AUTOINCREMENT PRIMARY,
        +  NAME C(32) DEFAULT '' NOTNULL,
        +  CREATED T DEFTIMESTAMP,
        +  AGE N(16) DEFAULT 0
        +";
        +$sql1 = $datadict->CreateTableSQL('tabname', $flds);
        +$sql2 = $datadict->CreateIndexSQL('idx_name_age', 'tabname', 'NAME,AGE');
        +
        + +

        Data Types

        +

        Stick to a few data types that are available in most databases. Char, varchar + and numeric/number are supported by most databases. Most other data types (including + integer, boolean and float) cannot be relied on being available. I recommend + using char(1) or number(1) to hold booleans.

        +

        Different databases have different ways of representing dates and timestamps/datetime. + ADOdb attempts to display all dates in ISO (YYYY-MM-DD) format. ADOdb also provides + DBDate( ) and DBTimeStamp( ) to convert dates to formats that are acceptable + to that database. Both functions accept Unix integer timestamps and date strings + in ISO format.

        +
        $date1 = $connection->DBDate(time( ));
        $date2 = $connection->DBTimeStamp('2002-02-23 13:03:33');
        +

        We also provide functions to convert database dates to Unix timestamps:

        +
        $unixts = $recordset->UnixDate('#2002-02-30#'); # MS Access date =gt; unix timestamp
        +

        For date calculations, we have OffsetDate which allows you to calculate dates such as yesterday and next week in a RDBMS independant fashion. For example, if we want to set a field to 6 hour from now, use: +

        +$sql = 'update table set dtimefld='.$db->OffsetDate($db->sysTimeStamp, 6/24).' where ...';
        +
        +

        The maximum length of a char/varchar field is also database specific. You can + only assume that field lengths of up to 250 characters are supported. This is + normally impractical for web based forum or content management systems. You + will need to be familiar with how databases handle large objects (LOBs). ADOdb + implements two functions, UpdateBlob( ) and UpdateClob( ) that allow you to + update fields holding Binary Large Objects (eg. pictures) and Character Large + Objects (eg. HTML articles):

        +
        # for oracle 
        +$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1,empty_blob())'); 
        +$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1'); 
        +   
        +# non-oracle databases
        +$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); 
        +$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
        +
        +

        Null handling is another area where differences can occur. This is a mine-field, + because 3-value logic is tricky. +

        In general, I avoid using nulls except for dates and default all my numeric + and character fields to 0 or the empty string. This maintains consistency with + PHP, where empty strings and zero are treated as equivalent, and avoids SQL + ambiguities when you use the ANY and EXISTS operators. However if your database + has significant amounts of missing or unknown data, using nulls might be a good + idea. +

        + ADOdb also supports a portable IfNull function, so you can define what to display + if the field contains a null. +

        Stored Procedures

        +

        Stored procedures are another problem area. Some databases allow recordsets + to be returned in a stored procedure (Microsoft SQL Server and Sybase), and + others only allow output parameters to be returned. Stored procedures sometimes + need to be wrapped in special syntax. For example, Oracle requires such code + to be wrapped in an anonymous block with BEGIN and END. Also internal sql operators + and functions such as +, ||, TRIM( ), SUBSTR( ) or INSTR( ) vary between vendors. +

        +

        An example of how to call a stored procedure with 2 parameters and 1 return + value follows:

        +
        	switch ($db->databaseType) {
        +	case 'mssql':
        +	  $sql = 'SP_RUNSOMETHING'; break;
        +	case 'oci8':
        +	  $sql = 
        +	  "declare RETVAL integer;begin :RETVAL := SP_RUNSOMETHING(:myid,:group);end;";
        +	  break;
        +	default:
        +	  die('Unsupported feature');
        +	}
        +	# @RETVAL = SP_RUNSOMETHING @myid,@group
        +	$stmt = $db->PrepareSP($sql);	
        $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group'); + # true indicates output parameter
        $db->Parameter($stmt,$ret,'RETVAL',true); + $db->Execute($stmt);
        +

        As you can see, the ADOdb API is the same for both databases. But the stored + procedure SQL syntax is quite different between databases and is not portable, + so be forewarned! However sometimes you have little choice as some systems only + allow data to be accessed via stored procedures. This is when the ultimate portability + solution might be the only solution: treating portable SQL as a localization + exercise...

        +

        SQL as a Localization Exercise

        +

        In general to provide real portability, you will have to treat SQL coding + as a localization exercise. In PHP, it has become common to define separate + language files for English, Russian, Korean, etc. Similarly, I would suggest + you have separate Sybase, Intebase, MySQL, etc files, and conditionally include + the SQL based on the database. For example, each MySQL SQL statement would be + stored in a separate variable, in a file called 'mysql-lang.inc.php'.

        +
        $sqlGetPassword = 'select password from users where userid=%s';
        +$sqlSearchKeyword = quot;SELECT * FROM articles WHERE match (title,body) against (%s)";
        +

        In our main PHP file:

        +
        # define which database to load...
        +$database = 'mysql';
        +include_once("$database-lang.inc.php");
        +
        +$db = NewADOConnection($database);
        +$db->PConnect(...) or die('Failed to connect to database');
        +
        +# search for a keyword $word
        +$rs = $db->Execute(sprintf($sqlSearchKeyWord,$db->qstr($word)));
        +

        Note that we quote the $word variable using the qstr( ) function. This is because + each database quotes strings using different conventions.

        +

        +

        Final Thoughts

        +

        The best way to ensure that you have portable SQL is to have your data tables designed using +sound principles. Learn the theory of normalization and entity-relationship diagrams and model +your data carefully. Understand how joins and indexes work and how they are used to tune performance. +

        Visit the following page for more references on database theory and vendors: + http://php.weblogs.com/sql_tutorial. + Also read this article on Optimizing PHP. +

        +(c) 2002-2003 John Lim. + + + diff --git a/fannie/adodb5/docs/tute.htm b/fannie/adodb5/docs/tute.htm new file mode 100644 index 000000000..408ba75cb --- /dev/null +++ b/fannie/adodb5/docs/tute.htm @@ -0,0 +1,290 @@ + + + + + Tutorial: Moving from MySQL to ADODB + + + +

        Tutorial: Moving from MySQL to ADODB

        + +
        		You say eether and I say eyether, 
        +		You say neether and I say nyther; 
        +		Eether, eyether, neether, nyther - 
        +		Let's call the whole thing off ! 
        +
        + You like potato and I like po-tah-to, + You like tomato and I like to-mah-to; + Potato, po-tah-to, tomato, to-mah-to - + Let's call the whole thing off ! +
        +

        I love this song, especially the version with Louis Armstrong and Ella singing + duet. It is all about how hard it is for two people in love to be compatible + with each other. It's about compromise and finding a common ground, and that's + what this article is all about. +

        PHP is all about creating dynamic web-sites with the least fuss and the most + fun. To create these websites we need to use databases to retrieve login information, + to splash dynamic news onto the web page and store forum postings. So let's + say we were using the popular MySQL database for this. Your company has done + such a fantastic job that the Web site is more popular than your wildest dreams. + You find that MySQL cannot scale to handle the workload; time to switch databases. +

        Unfortunately in PHP every database is accessed slightly differently. To connect + to MySQL, you would use mysql_connect(); when you decide to upgrade to + Oracle or Microsoft SQL Server, you would use ocilogon() or mssql_connect() + respectively. What is worse is that the parameters you use for the different + connect functions are different also.. One database says po-tato, the other + database says pota-to. Oh-oh. +

        Let's NOT call the whole thing off

        +

        A database wrapper library such as ADODB comes in handy when you need to ensure portability. It provides + you with a common API to communicate with any supported database so you don't have to call things off.

        + +

        ADODB stands for Active Data Objects DataBase (sorry computer guys are sometimes + not very original). ADODB currently supports MySQL, PostgreSQL, Oracle, Interbase, + Microsoft SQL Server, Access, FoxPro, Sybase, ODBC and ADO. You can download + ADODB from http://php.weblogs.com/adodb. +

        MySQL Example

        +

        The most common database used with PHP is MySQL, so I guess you should be familiar + with the following code. It connects to a MySQL server at localhost, + database mydb, and executes an SQL select statement. The results are + printed, one line per row. +

        $db = mysql_connect("localhost", "root", "password");
        +mysql_select_db("mydb",$db);
        +$result = mysql_query("SELECT * FROM employees",$db);
        +if ($result === false) die("failed"); 
        +while ($fields = mysql_fetch_row($result)) {
        + for ($i=0, $max=sizeof($fields); $i < $max; $i++) {
        +		print $fields[$i].' ';
        + }
        + print "<br>\n";
        +} 
        +
        +

        The above code has been color-coded by section. The first section is the connection + phase. The second is the execution of the SQL, and the last section is displaying + the fields. The while loop scans the rows of the result, while the for + loop scans the fields in one row.

        +

        Here is the equivalent code in ADODB

        +
         include("adodb.inc.php");
        + $db = NewADOConnection('mysql');
        + $db->Connect("localhost", "root", "password", "mydb");
        + $result = $db->Execute("SELECT * FROM employees");
        + if ($result === false) die("failed");  
        + while (!$result->EOF) {
        +	for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
        +		   print $result->fields[$i].' ';
        +	$result->MoveNext();
        +	print "<br>\n";
        + } 
        +

        +

        Now porting to Oracle is as simple as changing the second line to NewADOConnection('oracle'). + Let's walk through the code...

        +

        Connecting to the Database

        +

        +
        include("adodb.inc.php");
        +$db = NewADOConnection('mysql');
        +$db->Connect("localhost", "root", "password", "mydb");
        +

        The connection code is a bit more sophisticated than MySQL's because our needs + are more sophisticated. In ADODB, we use an object-oriented approach to managing + the complexity of handling multiple databases. We have different classes to + handle different databases. If you aren't familiar with object-oriented programing, + don't worry -- the complexity is all hidden away in the NewADOConnection() + function.

        +

        To conserve memory, we only load the PHP code specific to the database you + are connecting to. We do this by calling NewADOConnection(databasedriver). + Legal database drivers include mysql, mssql, oracle, oci8, postgres, sybase, + vfp, access, ibase and many others.

        +

        Then we create a new instance of the connection class by calling NewADOConnection(). + Finally we connect to the database using $db->Connect().

        +

        Executing the SQL

        +

        $result = $db->Execute("SELECT * + FROM employees");
        + if ($result === false) die("failed")
        ; +
        +

        +

        Sending the SQL statement to the server is straight forward. Execute() will + return a recordset object on successful execution. You should check $result + as we do above. +

        An issue that confuses beginners is the fact that we have two types of objects + in ADODB, the connection object and the recordset object. When do we use each? +

        The connection object ($db) is responsible for connecting to the database, + formatting your SQL and querying the database server. The recordset object ($result) + is responsible for retrieving the results and formatting the reply as text or + as an array. +

        The only thing I need to add is that ADODB provides several helper functions + for making INSERT and UPDATE statements easier, which we will cover in the Advanced + section. +

        Retrieving the Data
        +

        +
        while (!$result->EOF) {
        +   for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
        +	   print $result->fields[$i].' ';
        +   $result->MoveNext();
        +   print "<br>\n";
        +}
        +

        The paradigm for getting the data is that it's like reading a file. For every + line, we check first whether we have reached the end-of-file (EOF). While not + end-of-file, loop through each field in the row. Then move to the next line + (MoveNext) and repeat. +

        The $result->fields[] array is generated by the PHP database + extension. Some database extensions do not index the array by field name. + To force indexing by name - that is associative arrays - + use the $ADODB_FETCH_MODE global variable. +

        +	$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +	$rs1 = $db->Execute('select * from table');
        +	$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
        +	$rs2 = $db->Execute('select * from table');
        +	print_r($rs1->fields); // shows array([0]=>'v0',[1] =>'v1')
        +	print_r($rs2->fields); // shows array(['col1']=>'v0',['col2'] =>'v1')
        +
        +

        +As you can see in the above example, both recordsets store and use different fetch modes +based on the $ADODB_FETCH_MODE setting when the recordset was created by Execute().

        +

        ADOConnection

        +

        Object that performs the connection to the database, executes SQL statements + and has a set of utility functions for standardising the format of SQL statements + for issues such as concatenation and date formats.

        + +

        Other Useful Functions

        +

        $recordset->Move($pos) scrolls to that particular row. ADODB supports forward + scrolling for all databases. Some databases will not support backwards scrolling. + This is normally not a problem as you can always cache records to simulate backwards + scrolling. +

        $recordset->RecordCount() returns the number of records accessed by the + SQL statement. Some databases will return -1 because it is not supported. +

        $recordset->GetArray() returns the result as an array. +

        rs2html($recordset) is a function that is generates a HTML table based on the + $recordset passed to it. An example with the relevant lines in bold: +

           include('adodb.inc.php'); 
        +   include('tohtml.inc.php'); /* includes the rs2html function */
        +   $conn = ADONewConnection('mysql'); 
        +   $conn->PConnect('localhost','userid','password','database');
        +   $rs = $conn->Execute('select * from table');
        +   rs2html($rs); /* recordset to html table */ 
        +

        There are many other helper functions that are listed in the documentation available at http://php.weblogs.com/adodb_manual. +

        Advanced Material

        +

        Inserts and Updates

        +

        Let's say you want to insert the following data into a database. +

        ID = 3
        + TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
        + Note= sugar why don't we call it off +

        When you move to another database, your insert might no longer work.

        +

        The first problem is that each database has a different default date format. + MySQL expects YYYY-MM-DD format, while other databases have different defaults. + ADODB has a function called DBDate() that addresses this issue by converting + converting the date to the correct format.

        +

        The next problem is that the don't in the Note needs to be quoted. In + MySQL, we use don\'t but in some other databases (Sybase, Access, Microsoft + SQL Server) we use don''t. The qstr() function addresses this issue.

        +

        So how do we use the functions? Like this:

        +
        $sql = "INSERT INTO table (id, thedate,note) values (" 
        +   . $ID . ','
        +   . $db->DBDate($TheDate) .','
        +   . $db->qstr($Note).")";
        +$db->Execute($sql);
        +

        ADODB also supports $connection->Affected_Rows() (returns the + number of rows affected by last update or delete) and $recordset->Insert_ID() + (returns last autoincrement number generated by an insert statement). Be forewarned + that not all databases support the two functions.
        +

        +

        MetaTypes

        +

        You can find out more information about each of the fields (I use the words + fields and columns interchangebly) you are selecting by calling the recordset + method FetchField($fieldoffset). This will return an object with + 3 properties: name, type and max_length. +

        For example:
        +
        $recordset = $conn->Execute("select adate from table");
        $f0 = $recordset->FetchField(0); +
        +

        Then $f0->name will hold 'adata', $f0->type + will be set to 'date'. If the max_length is unknown, it will be set to + -1. +

        One problem with handling different databases is that each database often calls + the same type by a different name. For example a timestamp type is called + datetime in one database and time in another. So ADODB has a special + MetaType($type, $max_length) function that standardises the types + to the following: +

        C: character and varchar types
        + X: text or long character (eg. more than 255 bytes wide).
        + B: blob or binary image
        + D: date
        + T: timestamp
        + L: logical (boolean)
        + I: integer
        + N: numeric (float, double, money) +

        In the above date example, +

        $recordset = $conn->Execute("select adate from table");
        + $f0 = $recordset->FetchField(0);
        + $type = $recordset->MetaType($f0->type, $f0->max_length);
        + print $type; /* should print 'D'
        */ +

        +

        Select Limit and Top Support +

        ADODB has a function called $connection->SelectLimit($sql,$nrows,$offset) that allows +you to retrieve a subset of the recordset. This will take advantage of native +SELECT TOP on Microsoft products and SELECT ... LIMIT with PostgreSQL and MySQL, and +emulated if the database does not support it. +

        Caching Support +

        ADODB allows you to cache recordsets in your file system, and only requery the database +server after a certain timeout period with $connection->CacheExecute($secs2cache,$sql) and +$connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset). +

        PHP4 Session Handler Support +

        ADODB also supports PHP4 session handlers. You can store your session variables + in a database for true scalability using ADODB. For further information, visit + http://php.weblogs.com/adodb-sessions +

        Commercial Use Encouraged

        +

        If you plan to write commercial PHP applications that you want to resell, you should consider ADODB. It has been released using the lesser GPL, which means you can legally include it in commercial applications, while keeping your code proprietary. Commercial use of ADODB is strongly encouraged! We are using it internally for this reason.

        + +

        Conclusion

        +

        As a thank you for finishing this article, here are the complete lyrics for + let's call the whole thing off.
        +
        +

        +   Refrain 
        +
        + You say eether and I say eyether, + You say neether and I say nyther; + Eether, eyether, neether, nyther - + Let's call the whole thing off ! +
        + You like potato and I like po-tah-to, + You like tomato and I like to-mah-to; + Potato, po-tah-to, tomato, to-mah-to - + Let's call the whole thing off ! +
        +But oh, if we call the whole thing off, then we must part. +And oh, if we ever part, then that might break my heart. +
        + So, if you like pajamas and I like pa-jah-mas, + I'll wear pajamas and give up pa-jah-mas. + For we know we + Need each other, so we + Better call the calling off off. + Let's call the whole thing off ! +
        + Second Refrain +
        + You say laughter and I say lawfter, + You say after and I say awfter; + Laughter, lawfter, after, awfter - + Let's call the whole thing off ! +
        + You like vanilla and I like vanella, + You, sa's'parilla and I sa's'parella; + Vanilla, vanella, choc'late, strawb'ry - + Let's call the whole thing off ! +
        +But oh, if we call the whole thing off, then we must part. +And oh, if we ever part, then that might break my heart. +
        + So, if you go for oysters and I go for ersters, + I'll order oysters and cancel the ersters. + For we know we + Need each other, so we + Better call the calling off off. + Let's call the whole thing off ! +
        +

        Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers +in the film "Shall We Dance?"

        +

        +(c)2001-2002 John Lim. + + + diff --git a/fannie/adodb5/drivers/adodb-access.inc.php b/fannie/adodb5/drivers/adodb-access.inc.php new file mode 100644 index 000000000..1e8ccaf0c --- /dev/null +++ b/fannie/adodb5/drivers/adodb-access.inc.php @@ -0,0 +1,87 @@ +ADODB_odbc(); + } + + function Time() + { + return time(); + } + + function BeginTrans() { return false;} + + function IfNull( $field, $ifNull ) + { + return " IIF(IsNull($field), $ifNull, $field) "; // if Access + } +/* + function MetaTables() + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = odbc_tables($this->_connectionID); + $rs = new ADORecordSet_odbc($qid); + $ADODB_FETCH_MODE = $savem; + if (!$rs) return false; + + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + //print_pre($arr); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE') + $arr2[] = $arr[$i][2]; + } + return $arr2; + }*/ +} + + +class ADORecordSet_access extends ADORecordSet_odbc { + + var $databaseType = "access"; + + function ADORecordSet_access($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } +}// class +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ado.inc.php b/fannie/adodb5/drivers/adodb-ado.inc.php new file mode 100644 index 000000000..4f99ac52a --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ado.inc.php @@ -0,0 +1,660 @@ +_affectedRows = new VARIANT; + } + + function ServerInfo() + { + if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; + return array('description' => $desc, 'version' => ''); + } + + function _affectedrows() + { + if (PHP_VERSION >= 5) return $this->_affectedRows; + + return $this->_affectedRows->value; + } + + // you can also pass a connection string like this: + // + // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); + function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL') + { + $u = 'UID'; + $p = 'PWD'; + + if (!empty($this->charPage)) + $dbc = new COM('ADODB.Connection',null,$this->charPage); + else + $dbc = new COM('ADODB.Connection'); + + if (! $dbc) return false; + + /* special support if provider is mssql or access */ + if ($argProvider=='mssql') { + $u = 'User Id'; //User parameter name for OLEDB + $p = 'Password'; + $argProvider = "SQLOLEDB"; // SQL Server Provider + + // not yet + //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; + + //use trusted conection for SQL if username not specified + if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; + } else if ($argProvider=='access') + $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider + + if ($argProvider) $dbc->Provider = $argProvider; + + if ($argUsername) $argHostname .= ";$u=$argUsername"; + if ($argPassword)$argHostname .= ";$p=$argPassword"; + + if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
        \n version=$dbc->version"); + // @ added below for php 4.0.1 and earlier + @$dbc->Open((string) $argHostname); + + $this->_connectionID = $dbc; + + $dbc->CursorLocation = $this->_cursor_location; + return $dbc->State > 0; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') + { + return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); + } + +/* + adSchemaCatalogs = 1, + adSchemaCharacterSets = 2, + adSchemaCollations = 3, + adSchemaColumns = 4, + adSchemaCheckConstraints = 5, + adSchemaConstraintColumnUsage = 6, + adSchemaConstraintTableUsage = 7, + adSchemaKeyColumnUsage = 8, + adSchemaReferentialContraints = 9, + adSchemaTableConstraints = 10, + adSchemaColumnsDomainUsage = 11, + adSchemaIndexes = 12, + adSchemaColumnPrivileges = 13, + adSchemaTablePrivileges = 14, + adSchemaUsagePrivileges = 15, + adSchemaProcedures = 16, + adSchemaSchemata = 17, + adSchemaSQLLanguages = 18, + adSchemaStatistics = 19, + adSchemaTables = 20, + adSchemaTranslations = 21, + adSchemaProviderTypes = 22, + adSchemaViews = 23, + adSchemaViewColumnUsage = 24, + adSchemaViewTableUsage = 25, + adSchemaProcedureParameters = 26, + adSchemaForeignKeys = 27, + adSchemaPrimaryKeys = 28, + adSchemaProcedureColumns = 29, + adSchemaDBInfoKeywords = 30, + adSchemaDBInfoLiterals = 31, + adSchemaCubes = 32, + adSchemaDimensions = 33, + adSchemaHierarchies = 34, + adSchemaLevels = 35, + adSchemaMeasures = 36, + adSchemaProperties = 37, + adSchemaMembers = 38 + +*/ + + function MetaTables() + { + $arr= array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(20);//tables + if ($adors){ + $f = $adors->Fields(2);//table/view name + $t = $adors->Fields(3);//table type + while (!$adors->EOF){ + $tt=substr($t->value,0,6); + if ($tt!='SYSTEM' && $tt !='ACCESS') + $arr[]=$f->value; + //print $f->value . ' ' . $t->value.'
        '; + $adors->MoveNext(); + } + $adors->Close(); + } + + return $arr; + } + + function MetaColumns($table, $normalize=true) + { + $table = strtoupper($table); + $arr = array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(4);//tables + + if ($adors){ + $t = $adors->Fields(2);//table/view name + while (!$adors->EOF){ + + + if (strtoupper($t->Value) == $table) { + + $fld = new ADOFieldObject(); + $c = $adors->Fields(3); + $fld->name = $c->Value; + $fld->type = 'CHAR'; // cannot discover type in ADO! + $fld->max_length = -1; + $arr[strtoupper($fld->name)]=$fld; + } + + $adors->MoveNext(); + } + $adors->Close(); + } + $false = false; + return empty($arr) ? $false : $arr; + } + + + + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + + $dbc = $this->_connectionID; + $false = false; + + // return rs + if ($inputarr) { + + if (!empty($this->charPage)) + $oCmd = new COM('ADODB.Command',null,$this->charPage); + else + $oCmd = new COM('ADODB.Command'); + $oCmd->ActiveConnection = $dbc; + $oCmd->CommandText = $sql; + $oCmd->CommandType = 1; + + // Map by http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcreateparam.asp + // Check issue http://bugs.php.net/bug.php?id=40664 !!! + while(list(, $val) = each($inputarr)) { + $type = gettype($val); + $len=strlen($val); + if ($type == 'boolean') + $this->adoParameterType = 11; + else if ($type == 'integer') + $this->adoParameterType = 3; + else if ($type == 'double') + $this->adoParameterType = 5; + elseif ($type == 'string') + $this->adoParameterType = 202; + else if (($val === null) || (!defined($val))) + $len=1; + else + $this->adoParameterType = 130; + + // name, type, direction 1 = input, len, + $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); + + $oCmd->Parameters->Append($p); + } + $p = false; + $rs = $oCmd->Execute(); + $e = $dbc->Errors; + if ($dbc->Errors->Count > 0) return $false; + return $rs; + } + + $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); + + if ($dbc->Errors->Count > 0) return $false; + if (! $rs) return $false; + + if ($rs->State == 0) { + $true = true; + return $true; // 0 = adStateClosed means no records returned + } + return $rs; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + + if (isset($this->_thisTransactions)) + if (!$this->_thisTransactions) return false; + else { + $o = $this->_connectionID->Properties("Transaction DDL"); + $this->_thisTransactions = $o ? true : false; + if (!$o) return false; + } + @$this->_connectionID->BeginTrans(); + $this->transCnt += 1; + return true; + } + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + + @$this->_connectionID->CommitTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + function RollbackTrans() { + if ($this->transOff) return true; + @$this->_connectionID->RollbackTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + + /* Returns: the last error message from previous database operation */ + + function ErrorMsg() + { + if (!$this->_connectionID) return "No connection established"; + $errc = $this->_connectionID->Errors; + if (!$errc) return "No Errors object found"; + if ($errc->Count == 0) return ''; + $err = $errc->Item($errc->Count-1); + return $err->Description; + } + + function ErrorNo() + { + $errc = $this->_connectionID->Errors; + if ($errc->Count == 0) return 0; + $err = $errc->Item($errc->Count-1); + return $err->NativeError; + } + + // returns true or false + function _close() + { + if ($this->_connectionID) $this->_connectionID->Close(); + $this->_connectionID = false; + return true; + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ado extends ADORecordSet { + + var $bind = false; + var $databaseType = "ado"; + var $dataProvider = "ado"; + var $_tarr = false; // caches the types + var $_flds; // and field objects + var $canSeek = true; + var $hideErrors = true; + + function ADORecordSet_ado($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + // returns the field object + function FetchField($fieldOffset = -1) { + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $rs = $this->_queryID; + $f = $rs->Fields($fieldOffset); + $o->name = $f->Name; + $t = $f->Type; + $o->type = $this->MetaType($t); + $o->max_length = $f->DefinedSize; + $o->ado_type = $t; + + //print "off=$off name=$o->name type=$o->type len=$o->max_length
        "; + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + $rs = $this->_queryID; + $this->_numOfRows = $rs->RecordCount; + + $f = $rs->Fields; + $this->_numOfFields = $f->Count; + } + + + // should only be used to move forward as we normally use forward-only cursors + function _seek($row) + { + $rs = $this->_queryID; + // absoluteposition doesn't work -- my maths is wrong ? + // $rs->AbsolutePosition->$row-2; + // return true; + if ($this->_currentRow > $row) return false; + @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst + return true; + } + +/* + OLEDB types + + enum DBTYPEENUM + { DBTYPE_EMPTY = 0, + DBTYPE_NULL = 1, + DBTYPE_I2 = 2, + DBTYPE_I4 = 3, + DBTYPE_R4 = 4, + DBTYPE_R8 = 5, + DBTYPE_CY = 6, + DBTYPE_DATE = 7, + DBTYPE_BSTR = 8, + DBTYPE_IDISPATCH = 9, + DBTYPE_ERROR = 10, + DBTYPE_BOOL = 11, + DBTYPE_VARIANT = 12, + DBTYPE_IUNKNOWN = 13, + DBTYPE_DECIMAL = 14, + DBTYPE_UI1 = 17, + DBTYPE_ARRAY = 0x2000, + DBTYPE_BYREF = 0x4000, + DBTYPE_I1 = 16, + DBTYPE_UI2 = 18, + DBTYPE_UI4 = 19, + DBTYPE_I8 = 20, + DBTYPE_UI8 = 21, + DBTYPE_GUID = 72, + DBTYPE_VECTOR = 0x1000, + DBTYPE_RESERVED = 0x8000, + DBTYPE_BYTES = 128, + DBTYPE_STR = 129, + DBTYPE_WSTR = 130, + DBTYPE_NUMERIC = 131, + DBTYPE_UDT = 132, + DBTYPE_DBDATE = 133, + DBTYPE_DBTIME = 134, + DBTYPE_DBTIMESTAMP = 135 + + ADO Types + + adEmpty = 0, + adTinyInt = 16, + adSmallInt = 2, + adInteger = 3, + adBigInt = 20, + adUnsignedTinyInt = 17, + adUnsignedSmallInt = 18, + adUnsignedInt = 19, + adUnsignedBigInt = 21, + adSingle = 4, + adDouble = 5, + adCurrency = 6, + adDecimal = 14, + adNumeric = 131, + adBoolean = 11, + adError = 10, + adUserDefined = 132, + adVariant = 12, + adIDispatch = 9, + adIUnknown = 13, + adGUID = 72, + adDate = 7, + adDBDate = 133, + adDBTime = 134, + adDBTimeStamp = 135, + adBSTR = 8, + adChar = 129, + adVarChar = 200, + adLongVarChar = 201, + adWChar = 130, + adVarWChar = 202, + adLongVarWChar = 203, + adBinary = 128, + adVarBinary = 204, + adLongVarBinary = 205, + adChapter = 136, + adFileTime = 64, + adDBFileTime = 137, + adPropVariant = 138, + adVarNumeric = 139 +*/ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + if (!is_numeric($t)) return $t; + + switch ($t) { + case 0: + case 12: // variant + case 8: // bstr + case 129: //char + case 130: //wc + case 200: // varc + case 202:// varWC + case 128: // bin + case 204: // varBin + case 72: // guid + if ($len <= $this->blobSize) return 'C'; + + case 201: + case 203: + return 'X'; + case 128: + case 204: + case 205: + return 'B'; + case 7: + case 133: return 'D'; + + case 134: + case 135: return 'T'; + + case 11: return 'L'; + + case 16:// adTinyInt = 16, + case 2://adSmallInt = 2, + case 3://adInteger = 3, + case 4://adBigInt = 20, + case 17://adUnsignedTinyInt = 17, + case 18://adUnsignedSmallInt = 18, + case 19://adUnsignedInt = 19, + case 20://adUnsignedBigInt = 21, + return 'I'; + default: return 'N'; + } + } + + // time stamp not supported yet + function _fetch() + { + $rs = $this->_queryID; + if (!$rs or $rs->EOF) { + $this->fields = false; + return false; + } + $this->fields = array(); + + if (!$this->_tarr) { + $tarr = array(); + $flds = array(); + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + $f = $rs->Fields($i); + $flds[] = $f; + $tarr[] = $f->Type; + } + // bind types and flds only once + $this->_tarr = $tarr; + $this->_flds = $flds; + } + $t = reset($this->_tarr); + $f = reset($this->_flds); + + if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + //echo "

        ",$t,' ';var_dump($f->value); echo '

        '; + switch($t) { + case 135: // timestamp + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); + // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 + $val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600; + else + $val = $f->value; + $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 133:// A date value (yyyymmdd) + if ($val = $f->value) { + $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); + } else + $this->fields[] = false; + break; + case 7: // adDate + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); + else $val = $f->value; + + if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); + else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 1: // null + $this->fields[] = false; + break; + case 6: // currency is not supported properly; + ADOConnection::outp( ''.$f->Name.': currency type not supported by PHP'); + $this->fields[] = (float) $f->value; + break; + case 11: //BIT; + $val = ""; + if(is_bool($f->value)) { + if($f->value==true) $val = 1; + else $val = 0; + } + if(is_null($f->value)) $val = null; + + $this->fields[] = $val; + break; + default: + $this->fields[] = $f->value; + break; + } + //print " $f->value $t, "; + $f = next($this->_flds); + $t = next($this->_tarr); + } // for + if ($this->hideErrors) error_reporting($olde); + @$rs->MoveNext(); // @ needed for some versions of PHP! + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + + function NextRecordSet() + { + $rs = $this->_queryID; + $this->_queryID = $rs->NextRecordSet(); + //$this->_queryID = $this->_QueryId->NextRecordSet(); + if ($this->_queryID == null) return false; + + $this->_currentRow = -1; + $this->_currentPage = -1; + $this->bind = false; + $this->fields = false; + $this->_flds = false; + $this->_tarr = false; + + $this->_inited = false; + $this->Init(); + return true; + } + + function _close() { + $this->_flds = false; + @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) + $this->_queryID = false; + } + +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ado5.inc.php b/fannie/adodb5/drivers/adodb-ado5.inc.php new file mode 100644 index 000000000..2f61d8840 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ado5.inc.php @@ -0,0 +1,704 @@ +_affectedRows = new VARIANT; + } + + function ServerInfo() + { + if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; + return array('description' => $desc, 'version' => ''); + } + + function _affectedrows() + { + if (PHP_VERSION >= 5) return $this->_affectedRows; + + return $this->_affectedRows->value; + } + + // you can also pass a connection string like this: + // + // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); + function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '') + { + // two modes + // - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat + // - if $argProvider is not empty, then $argDBorProvider holds db + + + if ($argProvider) { + $argDatabasename = $argDBorProvider; + } else { + $argDatabasename = ''; + if ($argDBorProvider) $argProvider = $argDBorProvider; + else if (stripos($argHostname,'PROVIDER') === false) /* full conn string is not in $argHostname */ + $argProvider = 'MSDASQL'; + } + + + try { + $u = 'UID'; + $p = 'PWD'; + + if (!empty($this->charPage)) + $dbc = new COM('ADODB.Connection',null,$this->charPage); + else + $dbc = new COM('ADODB.Connection'); + + if (! $dbc) return false; + + /* special support if provider is mssql or access */ + if ($argProvider=='mssql') { + $u = 'User Id'; //User parameter name for OLEDB + $p = 'Password'; + $argProvider = "SQLOLEDB"; // SQL Server Provider + + // not yet + //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; + + //use trusted conection for SQL if username not specified + if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; + } else if ($argProvider=='access') + $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider + + if ($argProvider) $dbc->Provider = $argProvider; + + if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname"; + + + if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename"; + if ($argUsername) $argHostname .= ";$u=$argUsername"; + if ($argPassword)$argHostname .= ";$p=$argPassword"; + + if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
        \n version=$dbc->version"); + // @ added below for php 4.0.1 and earlier + @$dbc->Open((string) $argHostname); + + $this->_connectionID = $dbc; + + $dbc->CursorLocation = $this->_cursor_location; + return $dbc->State > 0; + } catch (exception $e) { + if ($this->debug);echo "
        ",$argHostname,"\n",$e,"
        \n"; + } + + return false; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') + { + return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); + } + +/* + adSchemaCatalogs = 1, + adSchemaCharacterSets = 2, + adSchemaCollations = 3, + adSchemaColumns = 4, + adSchemaCheckConstraints = 5, + adSchemaConstraintColumnUsage = 6, + adSchemaConstraintTableUsage = 7, + adSchemaKeyColumnUsage = 8, + adSchemaReferentialContraints = 9, + adSchemaTableConstraints = 10, + adSchemaColumnsDomainUsage = 11, + adSchemaIndexes = 12, + adSchemaColumnPrivileges = 13, + adSchemaTablePrivileges = 14, + adSchemaUsagePrivileges = 15, + adSchemaProcedures = 16, + adSchemaSchemata = 17, + adSchemaSQLLanguages = 18, + adSchemaStatistics = 19, + adSchemaTables = 20, + adSchemaTranslations = 21, + adSchemaProviderTypes = 22, + adSchemaViews = 23, + adSchemaViewColumnUsage = 24, + adSchemaViewTableUsage = 25, + adSchemaProcedureParameters = 26, + adSchemaForeignKeys = 27, + adSchemaPrimaryKeys = 28, + adSchemaProcedureColumns = 29, + adSchemaDBInfoKeywords = 30, + adSchemaDBInfoLiterals = 31, + adSchemaCubes = 32, + adSchemaDimensions = 33, + adSchemaHierarchies = 34, + adSchemaLevels = 35, + adSchemaMeasures = 36, + adSchemaProperties = 37, + adSchemaMembers = 38 + +*/ + + function MetaTables() + { + $arr= array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(20);//tables + if ($adors){ + $f = $adors->Fields(2);//table/view name + $t = $adors->Fields(3);//table type + while (!$adors->EOF){ + $tt=substr($t->value,0,6); + if ($tt!='SYSTEM' && $tt !='ACCESS') + $arr[]=$f->value; + //print $f->value . ' ' . $t->value.'
        '; + $adors->MoveNext(); + } + $adors->Close(); + } + + return $arr; + } + + function MetaColumns($table, $normalize=true) + { + $table = strtoupper($table); + $arr= array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(4);//tables + + if ($adors){ + $t = $adors->Fields(2);//table/view name + while (!$adors->EOF){ + + + if (strtoupper($t->Value) == $table) { + + $fld = new ADOFieldObject(); + $c = $adors->Fields(3); + $fld->name = $c->Value; + $fld->type = 'CHAR'; // cannot discover type in ADO! + $fld->max_length = -1; + $arr[strtoupper($fld->name)]=$fld; + } + + $adors->MoveNext(); + } + $adors->Close(); + } + + return $arr; + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour... + + $dbc = $this->_connectionID; + + // return rs + + $false = false; + + if ($inputarr) { + + if (!empty($this->charPage)) + $oCmd = new COM('ADODB.Command',null,$this->charPage); + else + $oCmd = new COM('ADODB.Command'); + $oCmd->ActiveConnection = $dbc; + $oCmd->CommandText = $sql; + $oCmd->CommandType = 1; + + while(list(, $val) = each($inputarr)) { + $type = gettype($val); + $len=strlen($val); + if ($type == 'boolean') + $this->adoParameterType = 11; + else if ($type == 'integer') + $this->adoParameterType = 3; + else if ($type == 'double') + $this->adoParameterType = 5; + elseif ($type == 'string') + $this->adoParameterType = 202; + else if (($val === null) || (!defined($val))) + $len=1; + else + $this->adoParameterType = 130; + + // name, type, direction 1 = input, len, + $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); + + $oCmd->Parameters->Append($p); + } + + $p = false; + $rs = $oCmd->Execute(); + $e = $dbc->Errors; + if ($dbc->Errors->Count > 0) return $false; + return $rs; + } + + $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); + + if ($dbc->Errors->Count > 0) return $false; + if (! $rs) return $false; + + if ($rs->State == 0) { + $true = true; + return $true; // 0 = adStateClosed means no records returned + } + return $rs; + + } catch (exception $e) { + + } + return $false; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + + if (isset($this->_thisTransactions)) + if (!$this->_thisTransactions) return false; + else { + $o = $this->_connectionID->Properties("Transaction DDL"); + $this->_thisTransactions = $o ? true : false; + if (!$o) return false; + } + @$this->_connectionID->BeginTrans(); + $this->transCnt += 1; + return true; + } + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + + @$this->_connectionID->CommitTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + function RollbackTrans() { + if ($this->transOff) return true; + @$this->_connectionID->RollbackTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + + /* Returns: the last error message from previous database operation */ + + function ErrorMsg() + { + if (!$this->_connectionID) return "No connection established"; + $errmsg = ''; + + try { + $errc = $this->_connectionID->Errors; + if (!$errc) return "No Errors object found"; + if ($errc->Count == 0) return ''; + $err = $errc->Item($errc->Count-1); + $errmsg = $err->Description; + }catch(exception $e) { + } + return $errmsg; + } + + function ErrorNo() + { + $errc = $this->_connectionID->Errors; + if ($errc->Count == 0) return 0; + $err = $errc->Item($errc->Count-1); + return $err->NativeError; + } + + // returns true or false + function _close() + { + if ($this->_connectionID) $this->_connectionID->Close(); + $this->_connectionID = false; + return true; + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ado extends ADORecordSet { + + var $bind = false; + var $databaseType = "ado"; + var $dataProvider = "ado"; + var $_tarr = false; // caches the types + var $_flds; // and field objects + var $canSeek = true; + var $hideErrors = true; + + function ADORecordSet_ado($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + // returns the field object + function FetchField($fieldOffset = -1) { + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $rs = $this->_queryID; + if (!$rs) return false; + + $f = $rs->Fields($fieldOffset); + $o->name = $f->Name; + $t = $f->Type; + $o->type = $this->MetaType($t); + $o->max_length = $f->DefinedSize; + $o->ado_type = $t; + + + //print "off=$off name=$o->name type=$o->type len=$o->max_length
        "; + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + $rs = $this->_queryID; + + try { + $this->_numOfRows = $rs->RecordCount; + } catch (Exception $e) { + $this->_numOfRows = -1; + } + $f = $rs->Fields; + $this->_numOfFields = $f->Count; + } + + + // should only be used to move forward as we normally use forward-only cursors + function _seek($row) + { + $rs = $this->_queryID; + // absoluteposition doesn't work -- my maths is wrong ? + // $rs->AbsolutePosition->$row-2; + // return true; + if ($this->_currentRow > $row) return false; + @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst + return true; + } + +/* + OLEDB types + + enum DBTYPEENUM + { DBTYPE_EMPTY = 0, + DBTYPE_NULL = 1, + DBTYPE_I2 = 2, + DBTYPE_I4 = 3, + DBTYPE_R4 = 4, + DBTYPE_R8 = 5, + DBTYPE_CY = 6, + DBTYPE_DATE = 7, + DBTYPE_BSTR = 8, + DBTYPE_IDISPATCH = 9, + DBTYPE_ERROR = 10, + DBTYPE_BOOL = 11, + DBTYPE_VARIANT = 12, + DBTYPE_IUNKNOWN = 13, + DBTYPE_DECIMAL = 14, + DBTYPE_UI1 = 17, + DBTYPE_ARRAY = 0x2000, + DBTYPE_BYREF = 0x4000, + DBTYPE_I1 = 16, + DBTYPE_UI2 = 18, + DBTYPE_UI4 = 19, + DBTYPE_I8 = 20, + DBTYPE_UI8 = 21, + DBTYPE_GUID = 72, + DBTYPE_VECTOR = 0x1000, + DBTYPE_RESERVED = 0x8000, + DBTYPE_BYTES = 128, + DBTYPE_STR = 129, + DBTYPE_WSTR = 130, + DBTYPE_NUMERIC = 131, + DBTYPE_UDT = 132, + DBTYPE_DBDATE = 133, + DBTYPE_DBTIME = 134, + DBTYPE_DBTIMESTAMP = 135 + + ADO Types + + adEmpty = 0, + adTinyInt = 16, + adSmallInt = 2, + adInteger = 3, + adBigInt = 20, + adUnsignedTinyInt = 17, + adUnsignedSmallInt = 18, + adUnsignedInt = 19, + adUnsignedBigInt = 21, + adSingle = 4, + adDouble = 5, + adCurrency = 6, + adDecimal = 14, + adNumeric = 131, + adBoolean = 11, + adError = 10, + adUserDefined = 132, + adVariant = 12, + adIDispatch = 9, + adIUnknown = 13, + adGUID = 72, + adDate = 7, + adDBDate = 133, + adDBTime = 134, + adDBTimeStamp = 135, + adBSTR = 8, + adChar = 129, + adVarChar = 200, + adLongVarChar = 201, + adWChar = 130, + adVarWChar = 202, + adLongVarWChar = 203, + adBinary = 128, + adVarBinary = 204, + adLongVarBinary = 205, + adChapter = 136, + adFileTime = 64, + adDBFileTime = 137, + adPropVariant = 138, + adVarNumeric = 139 +*/ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + if (!is_numeric($t)) return $t; + + switch ($t) { + case 0: + case 12: // variant + case 8: // bstr + case 129: //char + case 130: //wc + case 200: // varc + case 202:// varWC + case 128: // bin + case 204: // varBin + case 72: // guid + if ($len <= $this->blobSize) return 'C'; + + case 201: + case 203: + return 'X'; + case 128: + case 204: + case 205: + return 'B'; + case 7: + case 133: return 'D'; + + case 134: + case 135: return 'T'; + + case 11: return 'L'; + + case 16:// adTinyInt = 16, + case 2://adSmallInt = 2, + case 3://adInteger = 3, + case 4://adBigInt = 20, + case 17://adUnsignedTinyInt = 17, + case 18://adUnsignedSmallInt = 18, + case 19://adUnsignedInt = 19, + case 20://adUnsignedBigInt = 21, + return 'I'; + default: return 'N'; + } + } + + // time stamp not supported yet + function _fetch() + { + $rs = $this->_queryID; + if (!$rs or $rs->EOF) { + $this->fields = false; + return false; + } + $this->fields = array(); + + if (!$this->_tarr) { + $tarr = array(); + $flds = array(); + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + $f = $rs->Fields($i); + $flds[] = $f; + $tarr[] = $f->Type; + } + // bind types and flds only once + $this->_tarr = $tarr; + $this->_flds = $flds; + } + $t = reset($this->_tarr); + $f = reset($this->_flds); + + if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + //echo "

        ",$t,' ';var_dump($f->value); echo '

        '; + switch($t) { + case 135: // timestamp + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); + // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 + $val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600; + else + $val = $f->value; + $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 133:// A date value (yyyymmdd) + if ($val = $f->value) { + $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); + } else + $this->fields[] = false; + break; + case 7: // adDate + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); + else $val = $f->value; + + if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); + else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 1: // null + $this->fields[] = false; + break; + case 6: // currency is not supported properly; + ADOConnection::outp( ''.$f->Name.': currency type not supported by PHP'); + $this->fields[] = (float) $f->value; + break; + case 11: //BIT; + $val = ""; + if(is_bool($f->value)) { + if($f->value==true) $val = 1; + else $val = 0; + } + if(is_null($f->value)) $val = null; + + $this->fields[] = $val; + break; + default: + $this->fields[] = $f->value; + break; + } + //print " $f->value $t, "; + $f = next($this->_flds); + $t = next($this->_tarr); + } // for + if ($this->hideErrors) error_reporting($olde); + @$rs->MoveNext(); // @ needed for some versions of PHP! + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + + function NextRecordSet() + { + $rs = $this->_queryID; + $this->_queryID = $rs->NextRecordSet(); + //$this->_queryID = $this->_QueryId->NextRecordSet(); + if ($this->_queryID == null) return false; + + $this->_currentRow = -1; + $this->_currentPage = -1; + $this->bind = false; + $this->fields = false; + $this->_flds = false; + $this->_tarr = false; + + $this->_inited = false; + $this->Init(); + return true; + } + + function _close() { + $this->_flds = false; + try { + @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) + } catch (Exception $e) { + } + $this->_queryID = false; + } + +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ado_access.inc.php b/fannie/adodb5/drivers/adodb-ado_access.inc.php new file mode 100644 index 000000000..c0ac534e1 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ado_access.inc.php @@ -0,0 +1,54 @@ += 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php"); + else include(ADODB_DIR."/drivers/adodb-ado.inc.php"); +} + +class ADODB_ado_access extends ADODB_ado { + var $databaseType = 'ado_access'; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $fmtDate = "#Y-m-d#"; + var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma + var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; + var $sysTimeStamp = 'NOW'; + var $upperCase = 'ucase'; + + function ADODB_ado_access() + { + $this->ADODB_ado(); + } + + /*function BeginTrans() { return false;} + + function CommitTrans() { return false;} + + function RollbackTrans() { return false;}*/ + +} + + +class ADORecordSet_ado_access extends ADORecordSet_ado { + + var $databaseType = "ado_access"; + + function ADORecordSet_ado_access($id,$mode=false) + { + return $this->ADORecordSet_ado($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ado_mssql.inc.php b/fannie/adodb5/drivers/adodb-ado_mssql.inc.php new file mode 100644 index 000000000..b30df95b4 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ado_mssql.inc.php @@ -0,0 +1,154 @@ += 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php"); + else include(ADODB_DIR."/drivers/adodb-ado.inc.php"); +} + + +class ADODB_ado_mssql extends ADODB_ado { + var $databaseType = 'ado_mssql'; + var $hasTop = 'top'; + var $hasInsertID = true; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $ansiOuter = true; // for mssql7 or later + var $substr = "substring"; + var $length = 'len'; + var $_dropSeqSQL = "drop table %s"; + + //var $_inTransaction = 1; // always open recordsets, so no transaction problems. + + function ADODB_ado_mssql() + { + $this->ADODB_ado(); + } + + function _insertid() + { + return $this->GetOne('select SCOPE_IDENTITY()'); + } + + function _affectedrows() + { + return $this->GetOne('select @@rowcount'); + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + function qstr($s,$magic_quotes=false) + { + $s = ADOConnection::qstr($s, $magic_quotes); + return str_replace("\0", "\\\\000", $s); + } + + function MetaColumns($table, $normalize=true) + { + $table = strtoupper($table); + $arr= array(); + $dbc = $this->_connectionID; + + $osoptions = array(); + $osoptions[0] = null; + $osoptions[1] = null; + $osoptions[2] = $table; + $osoptions[3] = null; + + $adors=@$dbc->OpenSchema(4, $osoptions);//tables + + if ($adors){ + while (!$adors->EOF){ + $fld = new ADOFieldObject(); + $c = $adors->Fields(3); + $fld->name = $c->Value; + $fld->type = 'CHAR'; // cannot discover type in ADO! + $fld->max_length = -1; + $arr[strtoupper($fld->name)]=$fld; + + $adors->MoveNext(); + } + $adors->Close(); + } + $false = false; + return empty($arr) ? $false : $arr; + } + + function CreateSequence($seq='adodbseq',$start=1) + { + + $this->Execute('BEGIN TRANSACTION adodbseq'); + $start -= 1; + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return true; + } + + function GenID($seq='adodbseq',$start=1) + { + //$this->debug=1; + $this->Execute('BEGIN TRANSACTION adodbseq'); + $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); + if (!$ok) { + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $start; + } + $num = $this->GetOne("select id from $seq"); + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $num; + + // in old implementation, pre 1.90, we returned GUID... + //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'"); + } + + } // end class + + class ADORecordSet_ado_mssql extends ADORecordSet_ado { + + var $databaseType = 'ado_mssql'; + + function ADORecordSet_ado_mssql($id,$mode=false) + { + return $this->ADORecordSet_ado($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ads.inc.php b/fannie/adodb5/drivers/adodb-ads.inc.php new file mode 100644 index 000000000..0de57ca7a --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ads.inc.php @@ -0,0 +1,796 @@ +_haserrorfunctions = ADODB_PHPVER >= 0x4050; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('ads_connect')) return null; + + if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') { + ADOConnection::outp("For Advantage Connect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + if (isset($php_errormsg)) $php_errormsg = ''; + if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword,$this->curmode); + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('ads_connect')) return null; + + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->debug && $argDatabasename) { + ADOConnection::outp("For PConnect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + // print "dsn=$argDSN u=$argUsername p=$argPassword
        "; flush(); + if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = ads_pconnect($argDSN,$argUsername,$argPassword,$this->curmode); + + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->_connectionID && $this->autoRollback) @ads_rollback($this->_connectionID); + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns the Server version and Description + function ServerInfo() + { + + if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { + $stmt = $this->Prepare('EXECUTE PROCEDURE sp_mgGetInstallInfo()'); + $res = $this->Execute($stmt); + if(!$res) + print $this->ErrorMsg(); + else{ + $ret["version"]= $res->fields[3]; + $ret["description"]="Advantage Database Server"; + return $ret; + } + } + else { + return ADOConnection::ServerInfo(); + } + } + + + // returns true or false + function CreateSequence( $seqname,$start=1) + { + $res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE"); + if(!$res){ + print $this->ErrorMsg(); + return false; + } + else + return true; + + } + + // returns true or false + function DropSequence($seqname) + { + $res = $this->Execute("DROP TABLE $seqname"); + if(!$res){ + print $this->ErrorMsg(); + return false; + } + else + return true; + } + + + // returns the generated ID or false + // checks if the table already exists, else creates the table and inserts a record into the table + // and gets the ID number of the last inserted record. + function GenID($seqname,$start=1) + { + $go = $this->Execute("select * from $seqname"); + if (!$go){ + $res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE"); + if(!res){ + print $this->ErrorMsg(); + return false; + } + } + $res = $this->Execute("INSERT INTO $seqname VALUES( DEFAULT )"); + if(!$res){ + print $this->ErrorMsg(); + return false; + } + else{ + $gen = $this->Execute("SELECT LastAutoInc( STATEMENT ) FROM system.iota"); + $ret = $gen->fields[0]; + return $ret; + } + + } + + + + + function ErrorMsg() + { + if ($this->_haserrorfunctions) { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @ads_errormsg(); + return @ads_errormsg($this->_connectionID); + } else return ADOConnection::ErrorMsg(); + } + + + function ErrorNo() + { + + if ($this->_haserrorfunctions) { + if ($this->_errorCode !== false) { + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; + } + + if (empty($this->_connectionID)) $e = @ads_error(); + else $e = @ads_error($this->_connectionID); + + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + // so we check and patch + if (strlen($e)<=2) return 0; + return $e; + } else return ADOConnection::ErrorNo(); + } + + + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + return ads_autocommit($this->_connectionID,false); + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = ads_commit($this->_connectionID); + ads_autocommit($this->_connectionID,true); + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = ads_rollback($this->_connectionID); + ads_autocommit($this->_connectionID,true); + return $ret; + } + + + // Returns tables,Views or both on succesfull execution. Returns + // tables by default on succesfull execustion. + function &MetaTables($ttype) + { + $recordSet1 = $this->Execute("select * from system.tables"); + if(!$recordSet1){ + print $this->ErrorMsg(); + return false; + } + $recordSet2 = $this->Execute("select * from system.views"); + if(!$recordSet2){ + print $this->ErrorMsg(); + return false; + } + $i=0; + while (!$recordSet1->EOF){ + $arr["$i"] = $recordSet1->fields[0]; + $recordSet1->MoveNext(); + $i=$i+1; + } + if($ttype=='FALSE'){ + while (!$recordSet2->EOF){ + $arr["$i"] = $recordSet2->fields[0]; + $recordSet2->MoveNext(); + $i=$i+1; + } + return $arr; + } + elseif($ttype=='VIEWS'){ + while (!$recordSet2->EOF){ + $arrV["$i"] = $recordSet2->fields[0]; + $recordSet2->MoveNext(); + $i=$i+1; + } + return $arrV; + } + else{ + return $arr; + } + + } + + function &MetaPrimaryKeys($table) + { + $recordSet = $this->Execute("select table_primary_key from system.tables where name='$table'"); + if(!$recordSet){ + print $this->ErrorMsg(); + return false; + } + $i=0; + while (!$recordSet->EOF){ + $arr["$i"] = $recordSet->fields[0]; + $recordSet->MoveNext(); + $i=$i+1; + } + return $arr; + } + +/* +See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp +/ SQL data type codes / +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (ODBCVER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + + +/ One-parameter shortcuts for date/time data types / +#if (ODBCVER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 + +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +*/ + function ODBCTypes($t) + { + switch ((integer)$t) { + case 1: + case 12: + case 0: + case -95: + case -96: + return 'C'; + case -97: + case -1: //text + return 'X'; + case -4: //image + return 'B'; + + case 9: + case 91: + return 'D'; + + case 10: + case 11: + case 92: + case 93: + return 'T'; + + case 4: + case 5: + case -6: + return 'I'; + + case -11: // uniqidentifier + return 'R'; + case -7: //bit + return 'L'; + + default: + return 'N'; + } + } + + function &MetaColumns($table) + { + global $ADODB_FETCH_MODE; + + $false = false; + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + /*if (false) { // after testing, confirmed that the following does not work becoz of a bug + $qid2 = ads_tables($this->_connectionID); + $rs = new ADORecordSet_ads($qid2); + $ADODB_FETCH_MODE = $savem; + if (!$rs) return false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + while (!$rs->EOF) { + if ($table == strtoupper($rs->fields[2])) { + $q = $rs->fields[0]; + $o = $rs->fields[1]; + break; + } + $rs->MoveNext(); + } + $rs->Close(); + + $qid = ads_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); + } */ + + switch ($this->databaseType) { + case 'access': + case 'vfp': + $qid = ads_columns($this->_connectionID);#,'%','',strtoupper($table),'%'); + break; + + + case 'db2': + $colname = "%"; + $qid = ads_columns($this->_connectionID, "", $schema, $table, $colname); + break; + + default: + $qid = @ads_columns($this->_connectionID,'%','%',strtoupper($table),'%'); + if (empty($qid)) $qid = ads_columns($this->_connectionID); + break; + } + if (empty($qid)) return $false; + + $rs = new ADORecordSet_ads($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + $retarr = array(); + + /* + $rs->fields indices + 0 TABLE_QUALIFIER + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 DATA_TYPE + 5 TYPE_NAME + 6 PRECISION + 7 LENGTH + 8 SCALE + 9 RADIX + 10 NULLABLE + 11 REMARKS + */ + while (!$rs->EOF) { + // adodb_pr($rs->fields); + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $this->ODBCTypes($rs->fields[4]); + + // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp + // access uses precision to store length for char/varchar + if ($fld->type == 'C' or $fld->type == 'X') { + if ($this->databaseType == 'access') + $fld->max_length = $rs->fields[6]; + else if ($rs->fields[4] <= -95) // UNICODE + $fld->max_length = $rs->fields[7]/2; + else + $fld->max_length = $rs->fields[7]; + } else + $fld->max_length = $rs->fields[7]; + $fld->not_null = !empty($rs->fields[10]); + $fld->scale = $rs->fields[8]; + $retarr[strtoupper($fld->name)] = $fld; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); //-- crashes 4.03pl1 -- why? + + if (empty($retarr)) $retarr = false; + return $retarr; + } + + // Returns an array of columns names for a given table + function &MetaColumnNames($table) + { + $recordSet = $this->Execute("select name from system.columns where parent='$table'"); + if(!$recordSet){ + print $this->ErrorMsg(); + return false; + } + else{ + $i=0; + while (!$recordSet->EOF){ + $arr["FIELD$i"] = $recordSet->fields[0]; + $recordSet->MoveNext(); + $i=$i+1; + } + return $arr; + } + } + + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + $stmt = ads_prepare($this->_connectionID,$sql); + if (!$stmt) { + // we don't know whether odbc driver is parsing prepared stmts, so just return sql + return $sql; + } + return array($sql,$stmt,false); + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + GLOBAL $php_errormsg; + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_error = ''; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = ads_prepare($this->_connectionID,$sql); + + if ($stmtid == false) { + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + } + + if (! ads_execute($stmtid,$inputarr)) { + //@ads_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } + return false; + } + + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!ads_execute($stmtid)) { + //@ads_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } + return false; + } + } else + { + + $stmtid = ads_exec($this->_connectionID,$sql); + + } + + $this->_lastAffectedRows = 0; + + if ($stmtid) + { + + if (@ads_num_fields($stmtid) == 0) { + $this->_lastAffectedRows = ads_num_rows($stmtid); + $stmtid = true; + + } else { + + $this->_lastAffectedRows = 0; + ads_binmode($stmtid,$this->binmode); + ads_longreadlen($stmtid,$this->maxblobsize); + + } + + if ($this->_haserrorfunctions) + { + + $this->_errorMsg = ''; + $this->_errorCode = 0; + } + else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } + else + { + if ($this->_haserrorfunctions) { + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } + + return $stmtid; + + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + $sql = "UPDATE $table SET $column=? WHERE $where"; + $stmtid = ads_prepare($this->_connectionID,$sql); + if ($stmtid == false){ + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + if (! ads_execute($stmtid,array($val),array(SQL_BINARY) )){ + if ($this->_haserrorfunctions){ + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } + return false; + } + return TRUE; + } + + // returns true or false + function _close() + { + $ret = @ads_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } + + function _affectedrows() + { + return $this->_lastAffectedRows; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ads extends ADORecordSet { + + var $bind = false; + var $databaseType = "ads"; + var $dataProvider = "ads"; + var $useFetchArray; + var $_has_stupid_odbc_fetch_api_change; + + function ADORecordSet_ads($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + + // the following is required for mysql odbc driver in 4.3.1 -- why? + $this->EOF = false; + $this->_currentRow = -1; + //$this->ADORecordSet($id); + } + + + // returns the field object + function &FetchField($fieldOffset = -1) + { + + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $o->name = @ads_field_name($this->_queryID,$off); + $o->type = @ads_field_type($this->_queryID,$off); + $o->max_length = @ads_field_len($this->_queryID,$off); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @ads_num_rows($this->_queryID) : -1; + $this->_numOfFields = @ads_num_fields($this->_queryID); + // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 + if ($this->_numOfRows == 0) $this->_numOfRows = -1; + //$this->useFetchArray = $this->connection->useFetchArray; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + function _seek($row) + { + return false; + } + + // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated + function &GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $rs =& $this->GetArray($nrows); + return $rs; + } + $savem = $this->fetchMode; + $this->fetchMode = ADODB_FETCH_NUM; + $this->Move($offset); + $this->fetchMode = $savem; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + function MoveNext() + { + if ($this->_numOfRows != 0 && !$this->EOF) { + $this->_currentRow++; + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @ads_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @ads_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + } + $this->fields = false; + $this->EOF = true; + return false; + } + + function _fetch() + { + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @ads_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @ads_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + $this->fields = false; + return false; + } + + function _close() + { + return @ads_free_result($this->_queryID); + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-borland_ibase.inc.php b/fannie/adodb5/drivers/adodb-borland_ibase.inc.php new file mode 100644 index 000000000..349ed9af6 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-borland_ibase.inc.php @@ -0,0 +1,92 @@ +ADODB_ibase(); + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + $this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID); + return $this->_transactionID; + } + + function ServerInfo() + { + $arr['dialect'] = $this->dialect; + switch($arr['dialect']) { + case '': + case '1': $s = 'Interbase 6.5, Dialect 1'; break; + case '2': $s = 'Interbase 6.5, Dialect 2'; break; + default: + case '3': $s = 'Interbase 6.5, Dialect 3'; break; + } + $arr['version'] = '6.5'; + $arr['description'] = $s; + return $arr; + } + + // Note that Interbase 6.5 uses ROWS instead - don't you love forking wars! + // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows + // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 + // Firebird uses + // SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + if ($nrows > 0) { + if ($offset <= 0) $str = " ROWS $nrows "; + else { + $a = $offset+1; + $b = $offset+$nrows; + $str = " ROWS $a TO $b"; + } + } else { + // ok, skip + $a = $offset + 1; + $str = " ROWS $a TO 999999999"; // 999 million + } + $sql .= $str; + + return ($secs2cache) ? + $this->CacheExecute($secs2cache,$sql,$inputarr) + : + $this->Execute($sql,$inputarr); + } + +}; + + +class ADORecordSet_borland_ibase extends ADORecordSet_ibase { + + var $databaseType = "borland_ibase"; + + function ADORecordSet_borland_ibase($id,$mode=false) + { + $this->ADORecordSet_ibase($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-csv.inc.php b/fannie/adodb5/drivers/adodb-csv.inc.php new file mode 100644 index 000000000..24f086646 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-csv.inc.php @@ -0,0 +1,207 @@ +_insertid; + } + + function _affectedrows() + { + return $this->_affectedrows; + } + + function MetaDatabases() + { + return false; + } + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; + $this->_url = $argHostname; + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; + $this->_url = $argHostname; + return true; + } + + function MetaColumns($table, $normalize=true) + { + return false; + } + + + // parameters use PostgreSQL convention, not MySQL + function SelectLimit($sql,$nrows=-1,$offset=-1) + { + global $ADODB_FETCH_MODE; + + $url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=". + (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE). + "&offset=$offset"; + $err = false; + $rs = csv2rs($url,$err,false); + + if ($this->debug) print "$url
        $err
        "; + + $at = strpos($err,'::::'); + if ($at === false) { + $this->_errorMsg = $err; + $this->_errorNo = (integer)$err; + } else { + $this->_errorMsg = substr($err,$at+4,1024); + $this->_errorNo = -9999; + } + if ($this->_errorNo) + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,''); + } + + if (is_object($rs)) { + + $rs->databaseType='csv'; + $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; + $rs->connection = $this; + } + return $rs; + } + + // returns queryID or false + function _Execute($sql,$inputarr=false) + { + global $ADODB_FETCH_MODE; + + if (!$this->_bindInputArray && $inputarr) { + $sqlarr = explode('?',$sql); + $sql = ''; + $i = 0; + foreach($inputarr as $v) { + + $sql .= $sqlarr[$i]; + if (gettype($v) == 'string') + $sql .= $this->qstr($v); + else if ($v === null) + $sql .= 'NULL'; + else + $sql .= $v; + $i += 1; + + } + $sql .= $sqlarr[$i]; + if ($i+1 != sizeof($sqlarr)) + print "Input Array does not match ?: ".htmlspecialchars($sql); + $inputarr = false; + } + + $url = $this->_url.'?sql='.urlencode($sql)."&fetch=". + (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE); + $err = false; + + + $rs = csv2rs($url,$err,false); + if ($this->debug) print urldecode($url)."
        $err
        "; + $at = strpos($err,'::::'); + if ($at === false) { + $this->_errorMsg = $err; + $this->_errorNo = (integer)$err; + } else { + $this->_errorMsg = substr($err,$at+4,1024); + $this->_errorNo = -9999; + } + + if ($this->_errorNo) + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr); + } + if (is_object($rs)) { + $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; + + $this->_affectedrows = $rs->affectedrows; + $this->_insertid = $rs->insertid; + $rs->databaseType='csv'; + $rs->connection = $this; + } + return $rs; + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + return $this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + return $this->_errorNo; + } + + // returns true or false + function _close() + { + return true; + } +} // class + +class ADORecordset_csv extends ADORecordset { + function ADORecordset_csv($id,$mode=false) + { + $this->ADORecordset($id,$mode); + } + + function _close() + { + return true; + } +} + +} // define + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-db2.inc.php b/fannie/adodb5/drivers/adodb-db2.inc.php new file mode 100644 index 000000000..c4ea39608 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-db2.inc.php @@ -0,0 +1,828 @@ +_haserrorfunctions = ADODB_PHPVER >= 0x4050; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('db2_connect')) { + ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension which is not installed."); + return null; + } + // This needs to be set before the connect(). + // Replaces the odbc_binmode() call that was in Execute() + ini_set('ibm_db2.binmode', $this->binmode); + + if ($argDatabasename) { + $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword); + } else { + $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword); + } + if (isset($php_errormsg)) $php_errormsg = ''; + + // For db2_connect(), there is an optional 4th arg. If present, it must be + // an array of valid options. So far, we don't use them. + + $this->_errorMsg = @db2_conn_errormsg(); + + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('db2_connect')) return null; + + // This needs to be set before the connect(). + // Replaces the odbc_binmode() call that was in Execute() + ini_set('ibm_db2.binmode', $this->binmode); + + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + + if ($argDatabasename) { + $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword); + } else { + $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword); + } + if (isset($php_errormsg)) $php_errormsg = ''; + + $this->_errorMsg = @db2_conn_errormsg(); + if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID); + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // format and return date string in database timestamp format + function DBTimeStamp($ts) + { + if (empty($ts) && $ts !== 0) return 'null'; + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')"; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + // use right() and replace() ? + if (!$col) $col = $this->sysDate; + + /* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */ + if ($fmt== 'Y-m-d H:i:s') + return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')"; + + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= $this->concat_operator; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + if ($len==1) return "year($col)"; + $s .= "char(year($col))"; + break; + case 'M': + if ($len==1) return "monthname($col)"; + $s .= "substr(monthname($col),1,3)"; + break; + case 'm': + if ($len==1) return "month($col)"; + $s .= "right(digits(month($col)),2)"; + break; + case 'D': + case 'd': + if ($len==1) return "day($col)"; + $s .= "right(digits(day($col)),2)"; + break; + case 'H': + case 'h': + if ($len==1) return "hour($col)"; + if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; + else $s .= "''"; + break; + case 'i': + case 'I': + if ($len==1) return "minute($col)"; + if ($col != $this->sysDate) + $s .= "right(digits(minute($col)),2)"; + else $s .= "''"; + break; + case 'S': + case 's': + if ($len==1) return "second($col)"; + if ($col != $this->sysDate) + $s .= "right(digits(second($col)),2)"; + else $s .= "''"; + break; + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + } + } + return $s; + } + + + function ServerInfo() + { + + if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { + $dsn = strtoupper($this->host); + $first = true; + $found = false; + + if (!function_exists('db2_data_source')) return false; + + while(true) { + + $rez = @db2_data_source($this->_connectionID, + $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); + $first = false; + if (!is_array($rez)) break; + if (strtoupper($rez['server']) == $dsn) { + $found = true; + break; + } + } + if (!$found) return ADOConnection::ServerInfo(); + if (!isset($rez['version'])) $rez['version'] = ''; + return $rez; + } else { + return ADOConnection::ServerInfo(); + } + } + + + function CreateSequence($seqname='adodbseq',$start=1) + { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$start)); + if (!$ok) return false; + return true; + } + + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /* + This algorithm is not very efficient, but works even if table locking + is not available. + + Will return false if unable to generate an ID after $MAXLOOPS attempts. + */ + function GenID($seq='adodbseq',$start=1) + { + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $num = $this->GetOne("VALUES NEXTVAL FOR $seq"); + return $num; + } + + + function ErrorMsg() + { + if ($this->_haserrorfunctions) { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @db2_conn_errormsg(); + return @db2_conn_errormsg($this->_connectionID); + } else return ADOConnection::ErrorMsg(); + } + + function ErrorNo() + { + + if ($this->_haserrorfunctions) { + if ($this->_errorCode !== false) { + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; + } + + if (empty($this->_connectionID)) $e = @db2_conn_error(); + else $e = @db2_conn_error($this->_connectionID); + + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + // so we check and patch + if (strlen($e)<=2) return 0; + return $e; + } else return ADOConnection::ErrorNo(); + } + + + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + return db2_autocommit($this->_connectionID,false); + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = db2_commit($this->_connectionID); + db2_autocommit($this->_connectionID,true); + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = db2_rollback($this->_connectionID); + db2_autocommit($this->_connectionID,true); + return $ret; + } + + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = @db2_primarykeys($this->_connectionID,'',$schema,$table); + + if (!$qid) { + $ADODB_FETCH_MODE = $savem; + return false; + } + $rs = new ADORecordSet_db2($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return false; + + $arr = $rs->GetArray(); + $rs->Close(); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3]) $arr2[] = $arr[$i][3]; + } + return $arr2; + } + + function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE ) + { + global $ADODB_FETCH_MODE; + + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table); + if (!$qid) { + $ADODB_FETCH_MODE = $savem; + return false; + } + $rs = new ADORecordSet_db2($qid); + + $ADODB_FETCH_MODE = $savem; + /* + $rs->fields indices + 0 PKTABLE_CAT + 1 PKTABLE_SCHEM + 2 PKTABLE_NAME + 3 PKCOLUMN_NAME + 4 FKTABLE_CAT + 5 FKTABLE_SCHEM + 6 FKTABLE_NAME + 7 FKCOLUMN_NAME + */ + if (!$rs) return false; + + $foreign_keys = array(); + while (!$rs->EOF) { + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]])) + $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array(); + $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3]; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $foreign_key; + } + + + function MetaTables($ttype=false,$schema=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = db2_tables($this->_connectionID); + + $rs = new ADORecordSet_db2($qid); + + $ADODB_FETCH_MODE = $savem; + if (!$rs) { + $false = false; + return $false; + } + + $arr = $rs->GetArray(); + + $rs->Close(); + $arr2 = array(); + + if ($ttype) { + $isview = strncmp($ttype,'V',1) === 0; + } + for ($i=0; $i < sizeof($arr); $i++) { + if (!$arr[$i][2]) continue; + $type = $arr[$i][3]; + $schemaval = ($schema) ? $arr[$i][1].'.' : ''; + if ($ttype) { + if ($isview) { + if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2]; + } + return $arr2; + } + +/* +See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp +/ SQL data type codes / +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (DB2VER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + + +/ One-parameter shortcuts for date/time data types / +#if (DB2VER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 + +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +*/ + function DB2Types($t) + { + switch ((integer)$t) { + case 1: + case 12: + case 0: + case -95: + case -96: + return 'C'; + case -97: + case -1: //text + return 'X'; + case -4: //image + return 'B'; + + case 9: + case 91: + return 'D'; + + case 10: + case 11: + case 92: + case 93: + return 'T'; + + case 4: + case 5: + case -6: + return 'I'; + + case -11: // uniqidentifier + return 'R'; + case -7: //bit + return 'L'; + + default: + return 'N'; + } + } + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $colname = "%"; + $qid = db2_columns($this->_connectionID, "", $schema, $table, $colname); + if (empty($qid)) return $false; + + $rs = new ADORecordSet_db2($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $false; + $rs->_fetch(); + + $retarr = array(); + + /* + $rs->fields indices + 0 TABLE_QUALIFIER + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 DATA_TYPE + 5 TYPE_NAME + 6 PRECISION + 7 LENGTH + 8 SCALE + 9 RADIX + 10 NULLABLE + 11 REMARKS + */ + while (!$rs->EOF) { + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $this->DB2Types($rs->fields[4]); + + // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp + // access uses precision to store length for char/varchar + if ($fld->type == 'C' or $fld->type == 'X') { + if ($rs->fields[4] <= -95) // UNICODE + $fld->max_length = $rs->fields[7]/2; + else + $fld->max_length = $rs->fields[7]; + } else + $fld->max_length = $rs->fields[7]; + $fld->not_null = !empty($rs->fields[10]); + $fld->scale = $rs->fields[8]; + $fld->primary_key = false; + $retarr[strtoupper($fld->name)] = $fld; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) $retarr = false; + + $qid = db2_primary_keys($this->_connectionID, "", $schema, $table); + if (empty($qid)) return $false; + + $rs = new ADORecordSet_db2($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $retarr; + $rs->_fetch(); + + /* + $rs->fields indices + 0 TABLE_CAT + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 KEY_SEQ + 5 PK_NAME + */ + while (!$rs->EOF) { + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $retarr[strtoupper($rs->fields[3])]->primary_key = true; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); + + if (empty($retarr)) $retarr = false; + return $retarr; + } + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + $stmt = db2_prepare($this->_connectionID,$sql); + if (!$stmt) { + // we don't know whether db2 driver is parsing prepared stmts, so just return sql + return $sql; + } + return array($sql,$stmt,false); + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + GLOBAL $php_errormsg; + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_error = ''; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = db2_prepare($this->_connectionID,$sql); + + if ($stmtid == false) { + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + } + + if (! db2_execute($stmtid,$inputarr)) { + if ($this->_haserrorfunctions) { + $this->_errorMsg = db2_stmt_errormsg(); + $this->_errorCode = db2_stmt_error(); + } + return false; + } + + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!db2_execute($stmtid)) { + if ($this->_haserrorfunctions) { + $this->_errorMsg = db2_stmt_errormsg(); + $this->_errorCode = db2_stmt_error(); + } + return false; + } + } else + $stmtid = @db2_exec($this->_connectionID,$sql); + + $this->_lastAffectedRows = 0; + if ($stmtid) { + if (@db2_num_fields($stmtid) == 0) { + $this->_lastAffectedRows = db2_num_rows($stmtid); + $stmtid = true; + } else { + $this->_lastAffectedRows = 0; + } + + if ($this->_haserrorfunctions) { + $this->_errorMsg = ''; + $this->_errorCode = 0; + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } else { + if ($this->_haserrorfunctions) { + $this->_errorMsg = db2_stmt_errormsg(); + $this->_errorCode = db2_stmt_error(); + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + + } + return $stmtid; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + // returns true or false + function _close() + { + $ret = @db2_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } + + function _affectedrows() + { + return $this->_lastAffectedRows; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_db2 extends ADORecordSet { + + var $bind = false; + var $databaseType = "db2"; + var $dataProvider = "db2"; + var $useFetchArray; + + function ADORecordSet_db2($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + } + + + // returns the field object + function FetchField($offset = -1) + { + $o= new ADOFieldObject(); + $o->name = @db2_field_name($this->_queryID,$offset); + $o->type = @db2_field_type($this->_queryID,$offset); + $o->max_length = db2_field_width($this->_queryID,$offset); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1; + $this->_numOfFields = @db2_num_fields($this->_queryID); + // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 + if ($this->_numOfRows == 0) $this->_numOfRows = -1; + } + + function _seek($row) + { + return false; + } + + // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $rs = $this->GetArray($nrows); + return $rs; + } + $savem = $this->fetchMode; + $this->fetchMode = ADODB_FETCH_NUM; + $this->Move($offset); + $this->fetchMode = $savem; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + function MoveNext() + { + if ($this->_numOfRows != 0 && !$this->EOF) { + $this->_currentRow++; + + $this->fields = @db2_fetch_array($this->_queryID); + if ($this->fields) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + } + $this->fields = false; + $this->EOF = true; + return false; + } + + function _fetch() + { + + $this->fields = db2_fetch_array($this->_queryID); + if ($this->fields) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + $this->fields = false; + return false; + } + + function _close() + { + return @db2_free_result($this->_queryID); + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-fbsql.inc.php b/fannie/adodb5/drivers/adodb-fbsql.inc.php new file mode 100644 index 000000000..13bbd86c4 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-fbsql.inc.php @@ -0,0 +1,266 @@ +. + Set tabs to 8. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (! defined("_ADODB_FBSQL_LAYER")) { + define("_ADODB_FBSQL_LAYER", 1 ); + +class ADODB_fbsql extends ADOConnection { + var $databaseType = 'fbsql'; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $metaTablesSQL = "SHOW TABLES"; + var $metaColumnsSQL = "SHOW COLUMNS FROM %s"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasLimit = false; + + function ADODB_fbsql() + { + } + + function _insertid() + { + return fbsql_insert_id($this->_connectionID); + } + + function _affectedrows() + { + return fbsql_affected_rows($this->_connectionID); + } + + function MetaDatabases() + { + $qid = fbsql_list_dbs($this->_connectionID); + $arr = array(); + $i = 0; + $max = fbsql_num_rows($qid); + while ($i < $max) { + $arr[] = fbsql_tablename($qid,$i); + $i += 1; + } + return $arr; + } + + // returns concatenated string + function Concat() + { + $s = ""; + $arr = func_get_args(); + $first = true; + + $s = implode(',',$arr); + if (sizeof($arr) > 0) return "CONCAT($s)"; + else return ''; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + function MetaColumns($table, $normalize=true) + { + if ($this->metaColumnsSQL) { + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + + if ($rs === false) return false; + + $retarr = array(); + while (!$rs->EOF){ + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + + // split type into type(length): + if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = $query_array[2]; + } else { + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($fld->type,'blob') !== false); + + $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return false; + } + + // returns true or false + function SelectDB($dbName) + { + $this->database = $dbName; + if ($this->_connectionID) { + return @fbsql_select_db($dbName,$this->_connectionID); + } + else return false; + } + + + // returns queryID or false + function _query($sql,$inputarr=false) + { + return fbsql_query("$sql;",$this->_connectionID); + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + $this->_errorMsg = @fbsql_error($this->_connectionID); + return $this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + return @fbsql_errno($this->_connectionID); + } + + // returns true or false + function _close() + { + return @fbsql_close($this->_connectionID); + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_fbsql extends ADORecordSet{ + + var $databaseType = "fbsql"; + var $canSeek = true; + + function ADORecordSet_fbsql($queryID,$mode=false) + { + if (!$mode) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) { + case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break; + case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break; + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = FBSQL_BOTH; break; + } + return $this->ADORecordSet($queryID); + } + + function _initrs() + { + GLOBAL $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1; + $this->_numOfFields = @fbsql_num_fields($this->_queryID); + } + + + + function FetchField($fieldOffset = -1) { + if ($fieldOffset != -1) { + $o = @fbsql_fetch_field($this->_queryID, $fieldOffset); + //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable + $f = @fbsql_field_flags($this->_queryID,$fieldOffset); + $o->binary = (strpos($f,'binary')!== false); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable + //$o->max_length = -1; + } + + return $o; + } + + function _seek($row) + { + return @fbsql_data_seek($this->_queryID,$row); + } + + function _fetch($ignore_fields=false) + { + $this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode); + return ($this->fields == true); + } + + function _close() { + return @fbsql_free_result($this->_queryID); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + $len = -1; // fbsql max_length is not accurate + switch (strtoupper($t)) { + case 'CHARACTER': + case 'CHARACTER VARYING': + case 'BLOB': + case 'CLOB': + case 'BIT': + case 'BIT VARYING': + if ($len <= $this->blobSize) return 'C'; + + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + return !empty($fieldobj->binary) ? 'B' : 'X'; + + case 'DATE': return 'D'; + + case 'TIME': + case 'TIME WITH TIME ZONE': + case 'TIMESTAMP': + case 'TIMESTAMP WITH TIME ZONE': return 'T'; + + case 'PRIMARY_KEY': + return 'R'; + case 'INTEGER': + case 'SMALLINT': + case 'BOOLEAN': + + if (!empty($fieldobj->primary_key)) return 'R'; + else return 'I'; + + default: return 'N'; + } + } + +} //class +} // defined +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-firebird.inc.php b/fannie/adodb5/drivers/adodb-firebird.inc.php new file mode 100644 index 000000000..b551aa67a --- /dev/null +++ b/fannie/adodb5/drivers/adodb-firebird.inc.php @@ -0,0 +1,77 @@ +ADODB_ibase(); + } + + function ServerInfo() + { + $arr['dialect'] = $this->dialect; + switch($arr['dialect']) { + case '': + case '1': $s = 'Firebird Dialect 1'; break; + case '2': $s = 'Firebird Dialect 2'; break; + default: + case '3': $s = 'Firebird Dialect 3'; break; + } + $arr['version'] = ADOConnection::_findvers($s); + $arr['description'] = $s; + return $arr; + } + + // Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars! + // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows + // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0) + { + $nrows = (integer) $nrows; + $offset = (integer) $offset; + $str = 'SELECT '; + if ($nrows >= 0) $str .= "FIRST $nrows "; + $str .=($offset>=0) ? "SKIP $offset " : ''; + + $sql = preg_replace('/^[ \t]*select/i',$str,$sql); + if ($secs) + $rs = $this->CacheExecute($secs,$sql,$inputarr); + else + $rs = $this->Execute($sql,$inputarr); + + return $rs; + } + + +}; + + +class ADORecordSet_firebird extends ADORecordSet_ibase { + + var $databaseType = "firebird"; + + function ADORecordSet_firebird($id,$mode=false) + { + $this->ADORecordSet_ibase($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ibase.inc.php b/fannie/adodb5/drivers/adodb-ibase.inc.php new file mode 100644 index 000000000..0997cb438 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ibase.inc.php @@ -0,0 +1,887 @@ + + changed transaction handling and added experimental blob stuff + + Docs to interbase at the website + http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html + + To use gen_id(), see + http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen + + $rs = $conn->Execute('select gen_id(adodb,1) from rdb$database'); + $id = $rs->fields[0]; + $conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)"); +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB_ibase extends ADOConnection { + var $databaseType = "ibase"; + var $dataProvider = "ibase"; + var $replaceQuote = "''"; // string to use to replace quotes + var $ibase_datefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S'; + var $fmtDate = "'Y-m-d'"; + var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S"; + var $ibase_timefmt = "%H:%M:%S"; + var $fmtTimeStamp = "'Y-m-d, H:i:s'"; + var $concat_operator='||'; + var $_transactionID; + var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'"; + //OPN STUFF start + var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc"; + //OPN STUFF end + var $ibasetrans; + var $hasGenID = true; + var $_bindInputArray = true; + var $buffers = 0; + var $dialect = 1; + var $sysDate = "cast('TODAY' as timestamp)"; + var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)"; + var $ansiOuter = true; + var $hasAffectedRows = false; + var $poorAffectedRows = true; + var $blobEncodeType = 'C'; + var $role = false; + + function ADODB_ibase() + { + if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT; + } + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false) + { + if (!function_exists('ibase_pconnect')) return null; + if ($argDatabasename) $argHostname .= ':'.$argDatabasename; + $fn = ($persist) ? 'ibase_pconnect':'ibase_connect'; + if ($this->role) + $this->_connectionID = $fn($argHostname,$argUsername,$argPassword, + $this->charSet,$this->buffers,$this->dialect,$this->role); + else + $this->_connectionID = $fn($argHostname,$argUsername,$argPassword, + $this->charSet,$this->buffers,$this->dialect); + + if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html + $this->replaceQuote = "''"; + } + if ($this->_connectionID === false) { + $this->_handleerror(); + return false; + } + + // PHP5 change. + if (function_exists('ibase_timefmt')) { + ibase_timefmt($this->ibase_datefmt,IBASE_DATE ); + if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP ); + else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP ); + ibase_timefmt($this->ibase_timefmt,IBASE_TIME ); + + } else { + ini_set("ibase.timestampformat", $this->ibase_timestampfmt); + ini_set("ibase.dateformat", $this->ibase_datefmt); + ini_set("ibase.timeformat", $this->ibase_timefmt); + } + return true; + } + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true); + } + + + function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false) + { + if ($internalKey) return array('RDB$DB_KEY'); + + $table = strtoupper($table); + + $sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME + FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME + WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\' + ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION'; + + $a = $this->GetCol($sql,false,true); + if ($a && sizeof($a)>0) return $a; + return false; + } + + function ServerInfo() + { + $arr['dialect'] = $this->dialect; + switch($arr['dialect']) { + case '': + case '1': $s = 'Interbase 5.5 or earlier'; break; + case '2': $s = 'Interbase 5.6'; break; + default: + case '3': $s = 'Interbase 6.0'; break; + } + $arr['version'] = ADOConnection::_findvers($s); + $arr['description'] = $s; + return $arr; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + $this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID); + return $this->_transactionID; + } + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ret = false; + $this->autoCommit = true; + if ($this->_transactionID) { + //print ' commit '; + $ret = ibase_commit($this->_transactionID); + } + $this->_transactionID = false; + return $ret; + } + + // there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently. + // it appears that ibase extension cannot support multiple concurrent queryid's + function _Execute($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + if ($this->_logsql) { + $savecrecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = true; // force countrecs + $ret = ADOConnection::_Execute($sql,$inputarr); + $ADODB_COUNTRECS = $savecrecs; + } else { + $ret = ADOConnection::_Execute($sql,$inputarr); + } + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ret = false; + $this->autoCommit = true; + if ($this->_transactionID) + $ret = ibase_rollback($this->_transactionID); + $this->_transactionID = false; + + return $ret; + } + + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $table = strtoupper($table); + $sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'"; + if (!$primary) { + $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'"; + } else { + $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'"; + } + // get index details + $rs = $this->Execute($sql); + if (!is_object($rs)) { + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + return $false; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + $index = $row[0]; + if (!isset($indexes[$index])) { + if (is_null($row[3])) {$row[3] = 0;} + $indexes[$index] = array( + 'unique' => ($row[3] == 1), + 'columns' => array() + ); + } + $sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC"; + $rs1 = $this->Execute($sql); + while ($row1 = $rs1->FetchRow()) { + $indexes[$index]['columns'][$row1[2]] = $row1[1]; + } + } + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + return $indexes; + } + + + // See http://community.borland.com/article/0,1410,25844,00.html + function RowLock($tables,$where,$col) + { + if ($this->autoCommit) $this->BeginTrans(); + $this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim? + return 1; + } + + + function CreateSequence($seqname,$startID=1) + { + $ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); + if (!$ok) return false; + return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); + } + + function DropSequence($seqname) + { + $seqname = strtoupper($seqname); + $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'"); + } + + function GenID($seqname='adodbseq',$startID=1) + { + $getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE"); + $rs = @$this->Execute($getnext); + if (!$rs) { + $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); + $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); + $rs = $this->Execute($getnext); + } + if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields); + else $this->genID = 0; // false + + if ($rs) $rs->Close(); + + return $this->genID; + } + + function SelectDB($dbName) + { + return false; + } + + function _handleerror() + { + $this->_errorMsg = ibase_errmsg(); + } + + function ErrorNo() + { + if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1]; + else return 0; + } + + function ErrorMsg() + { + return $this->_errorMsg; + } + + function Prepare($sql) + { + $stmt = ibase_prepare($this->_connectionID,$sql); + if (!$stmt) return false; + return array($sql,$stmt); + } + + // returns query ID if successful, otherwise false + // there have been reports of problems with nested queries - the code is probably not re-entrant? + function _query($sql,$iarr=false) + { + + if (!$this->autoCommit && $this->_transactionID) { + $conn = $this->_transactionID; + $docommit = false; + } else { + $conn = $this->_connectionID; + $docommit = true; + } + if (is_array($sql)) { + $fn = 'ibase_execute'; + $sql = $sql[1]; + if (is_array($iarr)) { + if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 + if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack + $fnarr = array_merge( array($sql) , $iarr); + $ret = call_user_func_array($fn,$fnarr); + } else { + switch(sizeof($iarr)) { + case 1: $ret = $fn($sql,$iarr[0]); break; + case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break; + case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break; + case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; + case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; + case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; + case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; + default: ADOConnection::outp( "Too many parameters to ibase query $sql"); + case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; + } + } + } else $ret = $fn($sql); + } else { + $fn = 'ibase_query'; + + if (is_array($iarr)) { + if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 + if (sizeof($iarr) == 0) $iarr[0] = ''; // PHP5 compat hack + $fnarr = array_merge( array($conn,$sql) , $iarr); + $ret = call_user_func_array($fn,$fnarr); + } else { + switch(sizeof($iarr)) { + case 1: $ret = $fn($conn,$sql,$iarr[0]); break; + case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break; + case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break; + case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; + case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; + case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; + case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; + default: ADOConnection::outp( "Too many parameters to ibase query $sql"); + case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; + } + } + } else $ret = $fn($conn,$sql); + } + if ($docommit && $ret === true) ibase_commit($this->_connectionID); + + $this->_handleerror(); + return $ret; + } + + // returns true or false + function _close() + { + if (!$this->autoCommit) @ibase_rollback($this->_connectionID); + return @ibase_close($this->_connectionID); + } + + //OPN STUFF start + function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3) + { + $fscale = abs($fscale); + $fld->max_length = $flen; + $fld->scale = null; + switch($ftype){ + case 7: + case 8: + if ($dialect3) { + switch($fsubtype){ + case 0: + $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); + break; + case 1: + $fld->type = 'numeric'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + case 2: + $fld->type = 'decimal'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + } // switch + } else { + if ($fscale !=0) { + $fld->type = 'decimal'; + $fld->scale = $fscale; + $fld->max_length = ($ftype == 7 ? 4 : 9); + } else { + $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); + } + } + break; + case 16: + if ($dialect3) { + switch($fsubtype){ + case 0: + $fld->type = 'decimal'; + $fld->max_length = 18; + $fld->scale = 0; + break; + case 1: + $fld->type = 'numeric'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + case 2: + $fld->type = 'decimal'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + } // switch + } + break; + case 10: + $fld->type = 'float'; + break; + case 14: + $fld->type = 'char'; + break; + case 27: + if ($fscale !=0) { + $fld->type = 'decimal'; + $fld->max_length = 15; + $fld->scale = 5; + } else { + $fld->type = 'double'; + } + break; + case 35: + if ($dialect3) { + $fld->type = 'timestamp'; + } else { + $fld->type = 'date'; + } + break; + case 12: + $fld->type = 'date'; + break; + case 13: + $fld->type = 'time'; + break; + case 37: + $fld->type = 'varchar'; + break; + case 40: + $fld->type = 'cstring'; + break; + case 261: + $fld->type = 'blob'; + $fld->max_length = -1; + break; + } // switch + } + //OPN STUFF end + // returns array of ADOFieldObjects for current table + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + + $ADODB_FETCH_MODE = $save; + $false = false; + if ($rs === false) { + return $false; + } + + $retarr = array(); + //OPN STUFF start + $dialect3 = ($this->dialect==3 ? true : false); + //OPN STUFF end + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = trim($rs->fields[0]); + //OPN STUFF start + $this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3); + if (isset($rs->fields[1]) && $rs->fields[1]) { + $fld->not_null = true; + } + if (isset($rs->fields[2])) { + + $fld->has_default = true; + $d = substr($rs->fields[2],strlen('default ')); + switch ($fld->type) + { + case 'smallint': + case 'integer': $fld->default_value = (int) $d; break; + case 'char': + case 'blob': + case 'text': + case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break; + case 'double': + case 'float': $fld->default_value = (float) $d; break; + default: $fld->default_value = $d; break; + } + // case 35:$tt = 'TIMESTAMP'; break; + } + if ((isset($rs->fields[5])) && ($fld->type == 'blob')) { + $fld->sub_type = $rs->fields[5]; + } else { + $fld->sub_type = null; + } + //OPN STUFF end + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + if ( empty($retarr)) return $false; + else return $retarr; + } + + function BlobEncode( $blob ) + { + $blobid = ibase_blob_create( $this->_connectionID); + ibase_blob_add( $blobid, $blob ); + return ibase_blob_close( $blobid ); + } + + // since we auto-decode all blob's since 2.42, + // BlobDecode should not do any transforms + function BlobDecode($blob) + { + return $blob; + } + + + + + // old blobdecode function + // still used to auto-decode all blob's + function _BlobDecode_old( $blob ) + { + $blobid = ibase_blob_open($this->_connectionID, $blob ); + $realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet + while($string = ibase_blob_get($blobid, 8192)){ + $realblob .= $string; + } + ibase_blob_close( $blobid ); + + return( $realblob ); + } + + function _BlobDecode( $blob ) + { + if (ADODB_PHPVER >= 0x5000) { + $blob_data = ibase_blob_info($this->_connectionID, $blob ); + $blobid = ibase_blob_open($this->_connectionID, $blob ); + } else { + + $blob_data = ibase_blob_info( $blob ); + $blobid = ibase_blob_open( $blob ); + } + + if( $blob_data[0] > $this->maxblobsize ) { + + $realblob = ibase_blob_get($blobid, $this->maxblobsize); + + while($string = ibase_blob_get($blobid, 8192)){ + $realblob .= $string; + } + } else { + $realblob = ibase_blob_get($blobid, $blob_data[0]); + } + + ibase_blob_close( $blobid ); + return( $realblob ); + } + + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + $fd = fopen($path,'rb'); + if ($fd === false) return false; + $blob_id = ibase_blob_create($this->_connectionID); + + /* fill with data */ + + while ($val = fread($fd,32768)){ + ibase_blob_add($blob_id, $val); + } + + /* close and get $blob_id_str for inserting into table */ + $blob_id_str = ibase_blob_close($blob_id); + + fclose($fd); + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + $blob_id = ibase_blob_create($this->_connectionID); + + // ibase_blob_add($blob_id, $val); + + // replacement that solves the problem by which only the first modulus 64K / + // of $val are stored at the blob field //////////////////////////////////// + // Thx Abel Berenstein aberenstein#afip.gov.ar + $len = strlen($val); + $chunk_size = 32768; + $tail_size = $len % $chunk_size; + $n_chunks = ($len - $tail_size) / $chunk_size; + + for ($n = 0; $n < $n_chunks; $n++) { + $start = $n * $chunk_size; + $data = substr($val, $start, $chunk_size); + ibase_blob_add($blob_id, $data); + } + + if ($tail_size) { + $start = $n_chunks * $chunk_size; + $data = substr($val, $start, $tail_size); + ibase_blob_add($blob_id, $data); + } + // end replacement ///////////////////////////////////////////////////////// + + $blob_id_str = ibase_blob_close($blob_id); + + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; + + } + + + function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + $blob_id = ibase_blob_create($this->_connectionID); + ibase_blob_add($blob_id, $val); + $blob_id_str = ibase_blob_close($blob_id); + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; + } + + // Format date column in sql string given an input format that understands Y M D + // Only since Interbase 6.0 - uses EXTRACT + // problem - does not zero-fill the day and month yet + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysDate; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '||'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "extract(year from $col)"; + break; + case 'M': + case 'm': + $s .= "extract(month from $col)"; + break; + case 'Q': + case 'q': + $s .= "cast(((extract(month from $col)+2) / 3) as integer)"; + break; + case 'D': + case 'd': + $s .= "(extract(day from $col))"; + break; + case 'H': + case 'h': + $s .= "(extract(hour from $col))"; + break; + case 'I': + case 'i': + $s .= "(extract(minute from $col))"; + break; + case 'S': + case 's': + $s .= "CAST((extract(second from $col)) AS INTEGER)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_ibase extends ADORecordSet +{ + + var $databaseType = "ibase"; + var $bind=false; + var $_cacheType; + + function ADORecordset_ibase($id,$mode=false) + { + global $ADODB_FETCH_MODE; + + $this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode; + $this->ADORecordSet($id); + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $ibf = ibase_field_info($this->_queryID,$fieldOffset); + switch (ADODB_ASSOC_CASE) { + case 2: // the default + $fld->name = ($ibf['alias']); + if (empty($fld->name)) $fld->name = ($ibf['name']); + break; + case 0: + $fld->name = strtoupper($ibf['alias']); + if (empty($fld->name)) $fld->name = strtoupper($ibf['name']); + break; + case 1: + $fld->name = strtolower($ibf['alias']); + if (empty($fld->name)) $fld->name = strtolower($ibf['name']); + break; + } + + $fld->type = $ibf['type']; + $fld->max_length = $ibf['length']; + + /* This needs to be populated from the metadata */ + $fld->not_null = false; + $fld->has_default = false; + $fld->default_value = 'null'; + return $fld; + } + + function _initrs() + { + $this->_numOfRows = -1; + $this->_numOfFields = @ibase_num_fields($this->_queryID); + + // cache types for blob decode check + for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { + $f1 = $this->FetchField($i); + $this->_cacheType[] = $f1->type; + } + } + + function _seek($row) + { + return false; + } + + function _fetch() + { + $f = @ibase_fetch_row($this->_queryID); + if ($f === false) { + $this->fields = false; + return false; + } + // OPN stuff start - optimized + // fix missing nulls and decode blobs automatically + + global $ADODB_ANSI_PADDING_OFF; + //$ADODB_ANSI_PADDING_OFF=1; + $rtrim = !empty($ADODB_ANSI_PADDING_OFF); + + for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { + if ($this->_cacheType[$i]=="BLOB") { + if (isset($f[$i])) { + $f[$i] = $this->connection->_BlobDecode($f[$i]); + } else { + $f[$i] = null; + } + } else { + if (!isset($f[$i])) { + $f[$i] = null; + } else if ($rtrim && is_string($f[$i])) { + $f[$i] = rtrim($f[$i]); + } + } + } + // OPN stuff end + + $this->fields = $f; + if ($this->fetchMode == ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } else if ($this->fetchMode == ADODB_FETCH_BOTH) { + $this->fields = array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE)); + } + return true; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + + } + + + function _close() + { + return @ibase_free_result($this->_queryID); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'CHAR': + return 'C'; + + case 'TEXT': + case 'VARCHAR': + case 'VARYING': + if ($len <= $this->blobSize) return 'C'; + return 'X'; + case 'BLOB': + return 'B'; + + case 'TIMESTAMP': + case 'DATE': return 'D'; + case 'TIME': return 'T'; + //case 'T': return 'T'; + + //case 'L': return 'L'; + case 'INT': + case 'SHORT': + case 'INTEGER': return 'I'; + default: return 'N'; + } + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-informix.inc.php b/fannie/adodb5/drivers/adodb-informix.inc.php new file mode 100644 index 000000000..1b2643b2f --- /dev/null +++ b/fannie/adodb5/drivers/adodb-informix.inc.php @@ -0,0 +1,40 @@ +ADORecordset_informix72($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-informix72.inc.php b/fannie/adodb5/drivers/adodb-informix72.inc.php new file mode 100644 index 000000000..61ad344c9 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-informix72.inc.php @@ -0,0 +1,475 @@ + + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1); + +class ADODB_informix72 extends ADOConnection { + var $databaseType = "informix72"; + var $dataProvider = "informix"; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $substr = 'substr'; + var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables + + + var $metaColumnsSQL = + "select c.colname, c.coltype, c.collength, d.default,c.colno + from syscolumns c, systables t,outer sysdefaults d + where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno + and tabname='%s' order by c.colno"; + + var $metaPrimaryKeySQL = + "select part1,part2,part3,part4,part5,part6,part7,part8 from + systables t,sysconstraints s,sysindexes i where t.tabname='%s' + and s.tabid=t.tabid and s.constrtype='P' + and i.idxname=s.idxname"; + + var $concat_operator = '||'; + + var $lastQuery = false; + var $has_insertid = true; + + var $_autocommit = true; + var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters. + var $sysDate = 'TODAY'; + var $sysTimeStamp = 'CURRENT'; + var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0 + + function ADODB_informix72() + { + // alternatively, use older method: + //putenv("DBDATE=Y4MD-"); + + // force ISO date format + putenv('GL_DATE=%Y-%m-%d'); + + if (function_exists('ifx_byteasvarchar')) { + ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. + ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. + ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file. + } + } + + function ServerInfo() + { + if (isset($this->version)) return $this->version; + + $arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1"); + $arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1"); + $this->version = $arr; + return $arr; + } + + + + function _insertid() + { + $sqlca =ifx_getsqlca($this->lastQuery); + return @$sqlca["sqlerrd1"]; + } + + function _affectedrows() + { + if ($this->lastQuery) { + return @ifx_affected_rows ($this->lastQuery); + } + return 0; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->Execute('BEGIN'); + $this->_autocommit = false; + return true; + } + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('COMMIT'); + $this->_autocommit = true; + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('ROLLBACK'); + $this->_autocommit = true; + return true; + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if ($this->_autocommit) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + /* Returns: the last error message from previous database operation + Note: This function is NOT available for Microsoft SQL Server. */ + + function ErrorMsg() + { + if (!empty($this->_logsql)) return $this->_errorMsg; + $this->_errorMsg = ifx_errormsg(); + return $this->_errorMsg; + } + + function ErrorNo() + { + preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse); + if (is_array($parse) && isset($parse[1])) return (int)$parse[1]; + return 0; + } + + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + if (!empty($this->metaColumnsSQL)) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs === false) return $false; + $rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items + + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; +/* //!eos. + $rs->fields[1] is not the correct adodb type + $rs->fields[2] is not correct max_length, because can include not-null bit + + $fld->type = $rs->fields[1]; + $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag + $fld->max_length = $rs->fields[2];*/ + $pr=ifx_props($rs->fields[1],$rs->fields[2]); //!eos + $fld->type = $pr[0] ;//!eos + $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); + $fld->max_length = $pr[1]; //!eos + $fld->precision = $pr[2] ;//!eos + $fld->not_null = $pr[3]=="N"; //!eos + + if (trim($rs->fields[3]) != "AAAAAA 0") { + $fld->has_default = 1; + $fld->default_value = $rs->fields[3]; + } else { + $fld->has_default = 0; + } + + $retarr[strtolower($fld->name)] = $fld; + $rs->MoveNext(); + } + + $rs->Close(); + $rspkey->Close(); //!eos + return $retarr; + } + + return $false; + } + + function xMetaColumns($table) + { + return ADOConnection::MetaColumns($table,false); + } + + function MetaForeignKeys($table, $owner=false, $upper=false) //!Eos + { + $sql = " + select tr.tabname,updrule,delrule, + i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4, + i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8 + from systables t,sysconstraints s,sysindexes i, + sysreferences r,systables tr,sysconstraints s2,sysindexes i2 + where t.tabname='$table' + and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid + and i.idxname=s.idxname and tr.tabid=r.ptabid + and s2.constrid=r.primary and i2.idxname=s2.idxname"; + + $rs = $this->Execute($sql); + if (!$rs || $rs->EOF) return false; + $arr = $rs->GetArray(); + $a = array(); + foreach($arr as $v) { + $coldest=$this->metaColumnNames($v["tabname"]); + $colorig=$this->metaColumnNames($table); + $colnames=array(); + for($i=1;$i<=8 && $v["o$i"] ;$i++) { + $colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1]; + } + if($upper) + $a[strtoupper($v["tabname"])] = $colnames; + else + $a[$v["tabname"]] = $colnames; + } + return $a; + } + + function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB') + { + $type = ($blobtype == 'TEXT') ? 1 : 0; + $blobid = ifx_create_blob($type,0,$val); + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid)); + } + + function BlobDecode($blobid) + { + return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid); + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('ifx_connect')) return null; + + $dbs = $argDatabasename . "@" . $argHostname; + if ($argHostname) putenv("INFORMIXSERVER=$argHostname"); + putenv("INFORMIXSERVER=".trim($argHostname)); + $this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + #if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('ifx_connect')) return null; + + $dbs = $argDatabasename . "@" . $argHostname; + putenv("INFORMIXSERVER=".trim($argHostname)); + $this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + #if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } +/* + // ifx_do does not accept bind parameters - weird ??? + function Prepare($sql) + { + $stmt = ifx_prepare($sql); + if (!$stmt) return $sql; + else return array($sql,$stmt); + } +*/ + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + // String parameters have to be converted using ifx_create_char + if ($inputarr) { + foreach($inputarr as $v) { + if (gettype($v) == 'string') { + $tab[] = ifx_create_char($v); + } + else { + $tab[] = $v; + } + } + } + + // In case of select statement, we use a scroll cursor in order + // to be able to call "move", or "movefirst" statements + if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) { + if ($inputarr) { + $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab); + } + else { + $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType); + } + } + else { + if ($inputarr) { + $this->lastQuery = ifx_query($sql,$this->_connectionID, $tab); + } + else { + $this->lastQuery = ifx_query($sql,$this->_connectionID); + } + } + + // Following line have been commented because autocommit mode is + // not supported by informix SE 7.2 + + //if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID); + + return $this->lastQuery; + } + + // returns true or false + function _close() + { + $this->lastQuery = false; + return ifx_close($this->_connectionID); + } +} + + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_informix72 extends ADORecordSet { + + var $databaseType = "informix72"; + var $canSeek = true; + var $_fieldprops = false; + + function ADORecordset_informix72($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id); + } + + + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + function FetchField($fieldOffset = -1) + { + if (empty($this->_fieldprops)) { + $fp = ifx_fieldproperties($this->_queryID); + foreach($fp as $k => $v) { + $o = new ADOFieldObject; + $o->name = $k; + $arr = split(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE" + $o->type = $arr[0]; + $o->max_length = $arr[1]; + $this->_fieldprops[] = $o; + $o->not_null = $arr[4]=="N"; + } + } + $ret = $this->_fieldprops[$fieldOffset]; + return $ret; + } + + function _initrs() + { + $this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1; + $this->_numOfFields = ifx_num_fields($this->_queryID); + } + + function _seek($row) + { + return @ifx_fetch_row($this->_queryID, (int) $row); + } + + function MoveLast() + { + $this->fields = @ifx_fetch_row($this->_queryID, "LAST"); + if ($this->fields) $this->EOF = false; + $this->_currentRow = -1; + + if ($this->fetchMode == ADODB_FETCH_NUM) { + foreach($this->fields as $v) { + $arr[] = $v; + } + $this->fields = $arr; + } + + return true; + } + + function MoveFirst() + { + $this->fields = @ifx_fetch_row($this->_queryID, "FIRST"); + if ($this->fields) $this->EOF = false; + $this->_currentRow = 0; + + if ($this->fetchMode == ADODB_FETCH_NUM) { + foreach($this->fields as $v) { + $arr[] = $v; + } + $this->fields = $arr; + } + + return true; + } + + function _fetch($ignore_fields=false) + { + + $this->fields = @ifx_fetch_row($this->_queryID); + + if (!is_array($this->fields)) return false; + + if ($this->fetchMode == ADODB_FETCH_NUM) { + foreach($this->fields as $v) { + $arr[] = $v; + } + $this->fields = $arr; + } + return true; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + function _close() + { + return ifx_free_result($this->_queryID); + } + +} +/** !Eos +* Auxiliar function to Parse coltype,collength. Used by Metacolumns +* return: array ($mtype,$length,$precision,$nullable) (similar to ifx_fieldpropierties) +*/ +function ifx_props($coltype,$collength){ + $itype=fmod($coltype+1,256); + $nullable=floor(($coltype+1) /256) ?"N":"Y"; + $mtype=substr(" CIIFFNNDN TBXCC ",$itype,1); + switch ($itype){ + case 2: + $length=4; + case 6: + case 9: + case 14: + $length=floor($collength/256); + $precision=fmod($collength,256); + break; + default: + $precision=0; + $length=$collength; + } + return array($mtype,$length,$precision,$nullable); +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-ldap.inc.php b/fannie/adodb5/drivers/adodb-ldap.inc.php new file mode 100644 index 000000000..0d5c8b8cd --- /dev/null +++ b/fannie/adodb5/drivers/adodb-ldap.inc.php @@ -0,0 +1,423 @@ +_connectionID = @ldap_connect($host); + } else { + $conn_info = array( $host,$this->port); + + if ( strstr( $host, ':' ) ) { + $conn_info = split( ':', $host ); + } + + $this->_connectionID = @ldap_connect( $conn_info[0], $conn_info[1] ); + } + if (!$this->_connectionID) { + $e = 'Could not connect to ' . $conn_info[0]; + $this->_errorMsg = $e; + if ($this->debug) ADOConnection::outp($e); + return false; + } + if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) { + $this->_inject_bind_options( $LDAP_CONNECT_OPTIONS ); + } + + if ($username) { + $bind = @ldap_bind( $this->_connectionID, $username, $password ); + } else { + $username = 'anonymous'; + $bind = @ldap_bind( $this->_connectionID ); + } + + if (!$bind) { + $e = sprintf($this->_bind_errmsg,ldap_error($this->_connectionID)); + $this->_errorMsg = $e; + if ($this->debug) ADOConnection::outp($e); + return false; + } + $this->_errorMsg = ''; + $this->database = $ldapbase; + return $this->_connectionID; + } + +/* + Valid Domain Values for LDAP Options: + + LDAP_OPT_DEREF (integer) + LDAP_OPT_SIZELIMIT (integer) + LDAP_OPT_TIMELIMIT (integer) + LDAP_OPT_PROTOCOL_VERSION (integer) + LDAP_OPT_ERROR_NUMBER (integer) + LDAP_OPT_REFERRALS (boolean) + LDAP_OPT_RESTART (boolean) + LDAP_OPT_HOST_NAME (string) + LDAP_OPT_ERROR_STRING (string) + LDAP_OPT_MATCHED_DN (string) + LDAP_OPT_SERVER_CONTROLS (array) + LDAP_OPT_CLIENT_CONTROLS (array) + + Make sure to set this BEFORE calling Connect() + + Example: + + $LDAP_CONNECT_OPTIONS = Array( + Array ( + "OPTION_NAME"=>LDAP_OPT_DEREF, + "OPTION_VALUE"=>2 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_SIZELIMIT, + "OPTION_VALUE"=>100 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_TIMELIMIT, + "OPTION_VALUE"=>30 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION, + "OPTION_VALUE"=>3 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER, + "OPTION_VALUE"=>13 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_REFERRALS, + "OPTION_VALUE"=>FALSE + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_RESTART, + "OPTION_VALUE"=>FALSE + ) + ); +*/ + + function _inject_bind_options( $options ) { + foreach( $options as $option ) { + ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] ) + or die( "Unable to set server option: " . $option["OPTION_NAME"] ); + } + } + + /* returns _queryID or false */ + function _query($sql,$inputarr=false) + { + $rs = @ldap_search( $this->_connectionID, $this->database, $sql ); + $this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql.': '.ldap_error($this->_connectionID); + return $rs; + } + + function ErrorMsg() + { + return $this->_errorMsg; + } + + function ErrorNo() + { + return @ldap_errno($this->_connectionID); + } + + /* closes the LDAP connection */ + function _close() + { + @ldap_close( $this->_connectionID ); + $this->_connectionID = false; + } + + function SelectDB($db) { + $this->database = $db; + return true; + } // SelectDB + + function ServerInfo() + { + if( !empty( $this->version ) ) return $this->version; + $version = array(); + /* + Determines how aliases are handled during search. + LDAP_DEREF_NEVER (0x00) + LDAP_DEREF_SEARCHING (0x01) + LDAP_DEREF_FINDING (0x02) + LDAP_DEREF_ALWAYS (0x03) + The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but + not when locating the base object of the search. The LDAP_DEREF_FINDING value means + aliases are dereferenced when locating the base object but not during the search. + Default: LDAP_DEREF_NEVER + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ; + switch ( $version['LDAP_OPT_DEREF'] ) { + case 0: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER'; + case 1: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING'; + case 2: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING'; + case 3: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS'; + } + + /* + A limit on the number of entries to return from a search. + LDAP_NO_LIMIT (0) means no limit. + Default: LDAP_NO_LIMIT + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] ); + if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) { + $version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT'; + } + + /* + A limit on the number of seconds to spend on a search. + LDAP_NO_LIMIT (0) means no limit. + Default: LDAP_NO_LIMIT + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] ); + if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) { + $version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT'; + } + + /* + Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not. + LDAP_OPT_ON + LDAP_OPT_OFF + Default: ON + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] ); + if ( $version['LDAP_OPT_REFERRALS'] == 0 ) { + $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF'; + } else { + $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON'; + + } + /* + Determines whether LDAP I/O operations are automatically restarted if they abort prematurely. + LDAP_OPT_ON + LDAP_OPT_OFF + Default: OFF + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] ); + if ( $version['LDAP_OPT_RESTART'] == 0 ) { + $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF'; + } else { + $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON'; + + } + /* + This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server. + LDAP_VERSION2 (2) + LDAP_VERSION3 (3) + Default: LDAP_VERSION2 (2) + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] ); + if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) { + $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2'; + } else { + $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3'; + + } + /* The host name (or list of hosts) for the primary LDAP server. */ + ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] ); + ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] ); + ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] ); + ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] ); + + return $this->version = $version; + + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ldap extends ADORecordSet{ + + var $databaseType = "ldap"; + var $canSeek = false; + var $_entryID; /* keeps track of the entry resource identifier */ + + function ADORecordSet_ldap($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: + $this->fetchMode = LDAP_NUM; + break; + case ADODB_FETCH_ASSOC: + $this->fetchMode = LDAP_ASSOC; + break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = LDAP_BOTH; + break; + } + + $this->ADORecordSet($queryID); + } + + function _initrs() + { + /* + This could be teaked to respect the $COUNTRECS directive from ADODB + It's currently being used in the _fetch() function and the + GetAssoc() function + */ + $this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID ); + + } + + /* + Return whole recordset as a multi-dimensional associative array + */ + function GetAssoc($force_array = false, $first2cols = false) + { + $records = $this->_numOfRows; + $results = array(); + for ( $i=0; $i < $records; $i++ ) { + foreach ( $this->fields as $k=>$v ) { + if ( is_array( $v ) ) { + if ( $v['count'] == 1 ) { + $results[$i][$k] = $v[0]; + } else { + array_shift( $v ); + $results[$i][$k] = $v; + } + } + } + } + + return $results; + } + + function GetRowAssoc() + { + $results = array(); + foreach ( $this->fields as $k=>$v ) { + if ( is_array( $v ) ) { + if ( $v['count'] == 1 ) { + $results[$k] = $v[0]; + } else { + array_shift( $v ); + $results[$k] = $v; + } + } + } + + return $results; + } + + function GetRowNums() + { + $results = array(); + foreach ( $this->fields as $k=>$v ) { + static $i = 0; + if (is_array( $v )) { + if ( $v['count'] == 1 ) { + $results[$i] = $v[0]; + } else { + array_shift( $v ); + $results[$i] = $v; + } + $i++; + } + } + return $results; + } + + function _fetch() + { + if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 ) + return false; + + if ( $this->_currentRow == 0 ) { + $this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID ); + } else { + $this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID ); + } + + $this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID ); + $this->_numOfFields = $this->fields['count']; + switch ( $this->fetchMode ) { + + case LDAP_ASSOC: + $this->fields = $this->GetRowAssoc(); + break; + + case LDAP_NUM: + $this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc()); + break; + + case LDAP_BOTH: + default: + $this->fields = $this->GetRowNums(); + break; + } + return ( is_array( $this->fields ) ); + } + + function _close() { + @ldap_free_result( $this->_queryID ); + $this->_queryID = false; + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-mssql.inc.php b/fannie/adodb5/drivers/adodb-mssql.inc.php new file mode 100644 index 000000000..e5c912638 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-mssql.inc.php @@ -0,0 +1,1102 @@ += 0x4300) { +// docs say 4.2.0, but testing shows only since 4.3.0 does it work! + ini_set('mssql.datetimeconvert',0); +} else { +global $ADODB_mssql_mths; // array, months must be upper-case + + + $ADODB_mssql_date_order = 'mdy'; + $ADODB_mssql_mths = array( + 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, + 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); +} + +//--------------------------------------------------------------------------- +// Call this to autoset $ADODB_mssql_date_order at the beginning of your code, +// just after you connect to the database. Supports mdy and dmy only. +// Not required for PHP 4.2.0 and above. +function AutoDetect_MSSQL_Date_Order($conn) +{ +global $ADODB_mssql_date_order; + $adate = $conn->GetOne('select getdate()'); + if ($adate) { + $anum = (int) $adate; + if ($anum > 0) { + if ($anum > 31) { + //ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently"); + } else + $ADODB_mssql_date_order = 'dmy'; + } else + $ADODB_mssql_date_order = 'mdy'; + } +} + +class ADODB_mssql extends ADOConnection { + var $databaseType = "mssql"; + var $dataProvider = "mssql"; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $substr = "substring"; + var $length = 'len'; + var $hasAffectedRows = true; + var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'"; + var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; + var $metaColumnsSQL = # xtype==61 is datetime +"select c.name,t.name,c.length, + (case when c.xusertype=61 then 0 else c.xprec end), + (case when c.xusertype=61 then 0 else c.xscale end) + from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $hasGenID = true; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + var $_has_mssql_init; + var $maxParameterLen = 4000; + var $arrayClass = 'ADORecordSet_array_mssql'; + var $uniqueSort = true; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $ansiOuter = true; // for mssql7 or later + var $poorAffectedRows = true; + var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 + var $uniqueOrderBy = true; + var $_bindInputArray = true; + var $forceNewConnect = false; + + function ADODB_mssql() + { + $this->_has_mssql_init = (strnatcmp(PHP_VERSION,'4.1.0')>=0); + } + + function ServerInfo() + { + global $ADODB_FETCH_MODE; + + + if ($this->fetchMode === false) { + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + } else + $savem = $this->SetFetchMode(ADODB_FETCH_NUM); + + if (0) { + $stmt = $this->PrepareSP('sp_server_info'); + $val = 2; + $this->Parameter($stmt,$val,'attribute_id'); + $row = $this->GetRow($stmt); + } + + $row = $this->GetRow("execute sp_server_info 2"); + + + if ($this->fetchMode === false) { + $ADODB_FETCH_MODE = $savem; + } else + $this->SetFetchMode($savem); + + $arr['description'] = $row[2]; + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " ISNULL($field, $ifNull) "; // if MS SQL Server + } + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + if ($this->lastInsID !== false) { + return $this->lastInsID; // InsID from sp_executesql call + } else { + return $this->GetOne($this->identitySQL); + } + } + + + + /** + * Correctly quotes a string so that all strings are escaped. We prefix and append + * to the string single-quotes. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + if (!$magic_quotes) { + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " unless sybase is on + $sybase = ini_get('magic_quotes_sybase'); + if (!$sybase) { + $s = str_replace('\\"','"',$s); + if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything + return "'$s'"; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } + } else { + return "'".$s."'"; + } + } +// moodle change end - see readme_moodle.txt + + function _affectedrows() + { + return $this->GetOne('select @@rowcount'); + } + + var $_dropSeqSQL = "drop table %s"; + + function CreateSequence($seq='adodbseq',$start=1) + { + + $this->Execute('BEGIN TRANSACTION adodbseq'); + $start -= 1; + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return true; + } + + function GenID($seq='adodbseq',$start=1) + { + //$this->debug=1; + $this->Execute('BEGIN TRANSACTION adodbseq'); + $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); + if (!$ok) { + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $start; + } + $num = $this->GetOne("select id from $seq"); + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $num; + + // in old implementation, pre 1.90, we returned GUID... + //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'"); + } + + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($nrows > 0 && $offset <= 0) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); + + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); + else + $rs = $this->Execute($sql,$inputarr); + } else + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + + return $rs; + } + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yyyy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(quarter,$col)"; + break; + case 'D': + case 'd': + $s .= "replace(str(day($col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + case 'w': + $s .= "datepart(dw,$col)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $ok = $this->Execute('BEGIN TRAN'); + return $ok; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('COMMIT TRAN'); + return $ok; + } + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('ROLLBACK TRAN'); + return $ok; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + /* + Usage: + + $this->BeginTrans(); + $this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables + + # some operation on both tables table1 and table2 + + $this->CommitTrans(); + + See http://www.swynk.com/friends/achigrik/SQL70Locks.asp + */ + function RowLock($tables,$where,$flds='top 1 null as ignore') + { + if (!$this->transCnt) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where"); + } + + + function MetaIndexes($table,$primary=false, $owner=false) + { + $table = $this->qstr($table); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if ($primary && !$row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function MetaForeignKeys($table, $owner=false, $upper=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + + $sql = +"select object_name(constid) as constraint_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where upper(object_name(fkeyid)) = $table +order by constraint_name, referenced_table_name, keyno"; + + $constraints = $this->GetArray($sql); + + $ADODB_FETCH_MODE = $save; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; + } + if (!$arr) return false; + + $arr2 = false; + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + //From: Fernando Moreira + function MetaDatabases() + { + if(@mssql_select_db("master")) { + $qry=$this->metaDatabasesSQL; + if($rs=@mssql_query($qry,$this->_connectionID)){ + $tmpAr=$ar=array(); + while($tmpAr=@mssql_fetch_row($rs)) + $ar[]=$tmpAr[0]; + @mssql_select_db($this->database); + if(sizeof($ar)) + return($ar); + else + return(false); + } else { + @mssql_select_db($this->database); + return(false); + } + } + return(false); + } + + // "Stein-Aksel Basma" + // tested with MSSQL 2000 + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + $schema = ''; + $this->_findschema($table,$schema); + if (!$schema) $schema = $this->database; + if ($schema) $schema = "and k.table_catalog like '$schema%'"; + + $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, + information_schema.table_constraints tc + where tc.constraint_name = k.constraint_name and tc.constraint_type = + 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $a = $this->GetCol($sql); + $ADODB_FETCH_MODE = $savem; + + if ($a && sizeof($a)>0) return $a; + $false = false; + return $false; + } + + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(($mask)); + $this->metaTablesSQL .= " AND name like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + return @mssql_select_db($dbName); + } + else return false; + } + + function ErrorMsg() + { + if (empty($this->_errorMsg)){ + $this->_errorMsg = mssql_get_last_message(); + } + return $this->_errorMsg; + } + + function ErrorNo() + { + if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode; + if (empty($this->_errorMsg)) { + $this->_errorMsg = mssql_get_last_message(); + } + $id = @mssql_query("select @@ERROR",$this->_connectionID); + if (!$id) return false; + $arr = mssql_fetch_array($id); + @mssql_free_result($id); + if (is_array($arr)) return $arr[0]; + else return -1; + } + + // returns true or false, newconnect supported since php 5.1.0. + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$newconnect=false) + { + if (!function_exists('mssql_pconnect')) return null; + $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword,$newconnect); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('mssql_pconnect')) return null; + $this->_connectionID = mssql_pconnect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + + // persistent connections can forget to rollback on crash, so we do it here. + if ($this->autoRollback) { + $cnt = $this->GetOne('select @@TRANCOUNT'); + while (--$cnt >= 0) $this->Execute('ROLLBACK TRAN'); + } + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true); + } + + function Prepare($sql) + { + $sqlarr = explode('?',$sql); + if (sizeof($sqlarr) <= 1) return $sql; + $sql2 = $sqlarr[0]; + for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { + $sql2 .= '@P'.($i-1) . $sqlarr[$i]; + } + return array($sql,$this->qstr($sql2),$max,$sql2); + } + + function PrepareSP($sql) + { + if (!$this->_has_mssql_init) { + ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0"); + return $sql; + } + $stmt = mssql_init($sql,$this->_connectionID); + if (!$stmt) return $sql; + return array($sql,$stmt); + } + + // returns concatenated string + // MSSQL requires integers to be cast as strings + // automatically cast every datatype to VARCHAR(255) + // @author David Rogers (introspectshun) + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // Split single record on commas, if possible + if (sizeof($arr) == 1) { + foreach ($arr as $arg) { + $args = explode(',', $arg); + } + $arr = $args; + } + + array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";')); + $s = implode('+',$arr); + if (sizeof($arr) > 0) return "$s"; + + return ''; + } + + /* + Usage: + $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group + + # note that the parameter does not have @ in front! + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',false,64); + $db->Execute($stmt); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to. Can set to null (for isNull support). + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + See mssql_bind documentation at php.net. + */ + function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=4000, $type=false) + { + if (!$this->_has_mssql_init) { + ADOConnection::outp( "Parameter: mssql_bind only available since PHP 4.1.0"); + return false; + } + + $isNull = is_null($var); // php 4.0.4 and above... + + if ($type === false) + switch(gettype($var)) { + default: + case 'string': $type = SQLVARCHAR; break; + case 'double': $type = SQLFLT8; break; + case 'integer': $type = SQLINT4; break; + case 'boolean': $type = SQLINT1; break; # SQLBIT not supported in 4.1.0 + } + + if ($this->debug) { + $prefix = ($isOutput) ? 'Out' : 'In'; + $ztype = (empty($type)) ? 'false' : $type; + ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); + } + /* + See http://phplens.com/lens/lensforum/msgs.php?id=7231 + + RETVAL is HARD CODED into php_mssql extension: + The return value (a long integer value) is treated like a special OUTPUT parameter, + called "RETVAL" (without the @). See the example at mssql_execute to + see how it works. - type: one of this new supported PHP constants. + SQLTEXT, SQLVARCHAR,SQLCHAR, SQLINT1,SQLINT2, SQLINT4, SQLBIT,SQLFLT8 + */ + if ($name !== 'RETVAL') $name = '@'.$name; + return mssql_bind($stmt[1], $name, $var, $type, $isOutput, $isNull, $maxLen); + } + + /* + Unfortunately, it appears that mssql cannot handle varbinary > 255 chars + So all your blobs must be of type "image". + + Remember to set in php.ini the following... + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textlimit = 0 ; zero to pass through + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textsize = 0 ; zero to pass through + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + if (strtoupper($blobtype) == 'CLOB') { + $sql = "UPDATE $table SET $column='" . $val . "' WHERE $where"; + return $this->Execute($sql) != false; + } + $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; + return $this->Execute($sql) != false; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + $this->_errorMsg = false; + if (is_array($inputarr)) { + + # bind input params with sp_executesql: + # see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm + # works only with sql server 7 and newer + $getIdentity = false; + if (!is_array($sql) && preg_match('/^\\s*insert/i', $sql)) { + $getIdentity = true; + $sql .= (preg_match('/;\\s*$/i', $sql) ? ' ' : '; ') . $this->identitySQL; + } + if (!is_array($sql)) $sql = $this->Prepare($sql); + $params = ''; + $decl = ''; + $i = 0; + foreach($inputarr as $v) { + if ($decl) { + $decl .= ', '; + $params .= ', '; + } + if (is_string($v)) { + $len = strlen($v); + if ($len == 0) $len = 1; + + if ($len > 4000 ) { + // NVARCHAR is max 4000 chars. Let's use NTEXT + $decl .= "@P$i NTEXT"; + } else { + $decl .= "@P$i NVARCHAR($len)"; + } + + $params .= "@P$i=N". (strncmp($v,"'",1)==0? $v : $this->qstr($v)); + } else if (is_integer($v)) { + $decl .= "@P$i INT"; + $params .= "@P$i=".$v; + } else if (is_float($v)) { + $decl .= "@P$i FLOAT"; + $params .= "@P$i=".$v; + } else if (is_bool($v)) { + $decl .= "@P$i INT"; # Used INT just in case BIT in not supported on the user's MSSQL version. It will cast appropriately. + $params .= "@P$i=".(($v)?'1':'0'); # True == 1 in MSSQL BIT fields and acceptable for storing logical true in an int field + } else { + $decl .= "@P$i CHAR"; # Used char because a type is required even when the value is to be NULL. + $params .= "@P$i=NULL"; + } + $i += 1; + } + $decl = $this->qstr($decl); + if ($this->debug) ADOConnection::outp("sp_executesql N{$sql[1]},N$decl,$params"); + $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID); + if ($getIdentity) { + $arr = @mssql_fetch_row($rez); + $this->lastInsID = isset($arr[0]) ? $arr[0] : false; + @mssql_data_seek($rez, 0); + } + + } else if (is_array($sql)) { + # PrepareSP() + $rez = mssql_execute($sql[1]); + $this->lastInsID = false; + + } else { + $rez = mssql_query($sql,$this->_connectionID); + $this->lastInsID = false; + } + return $rez; + } + + // returns true or false + function _close() + { + if ($this->transCnt) $this->RollbackTrans(); + $rez = @mssql_close($this->_connectionID); + $this->_connectionID = false; + return $rez; + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssql::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssql::UnixTimeStamp($v); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_mssql extends ADORecordSet { + + var $databaseType = "mssql"; + var $canSeek = true; + var $hasFetchAssoc; // see http://phplens.com/lens/lensforum/msgs.php?id=6083 + // _mths works only in non-localised system + + function ADORecordset_mssql($id,$mode=false) + { + // freedts check... + $this->hasFetchAssoc = function_exists('mssql_fetch_assoc'); + + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + function _initrs() + { + GLOBAL $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS)? @mssql_num_rows($this->_queryID):-1; + $this->_numOfFields = @mssql_num_fields($this->_queryID); + } + + + //Contributed by "Sven Axelsson" + // get next resultset - requires PHP 4.0.5 or later + function NextRecordSet() + { + if (!mssql_next_result($this->_queryID)) return false; + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function FetchField($fieldOffset = -1) + { + if ($fieldOffset != -1) { + $f = @mssql_fetch_field($this->_queryID, $fieldOffset); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $f = @mssql_fetch_field($this->_queryID); + } + $false = false; + if (empty($f)) return $false; + return $f; + } + + function _seek($row) + { + return @mssql_data_seek($this->_queryID, $row); + } + + // speedup + function MoveNext() + { + if ($this->EOF) return false; + + $this->_currentRow++; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + if ($this->fetchMode & ADODB_FETCH_NUM) { + //ADODB_FETCH_BOTH mode + $this->fields = @mssql_fetch_array($this->_queryID); + } + else { + if ($this->hasFetchAssoc) {// only for PHP 4.2.0 or later + $this->fields = @mssql_fetch_assoc($this->_queryID); + } else { + $flds = @mssql_fetch_array($this->_queryID); + if (is_array($flds)) { + $fassoc = array(); + foreach($flds as $k => $v) { + if (is_numeric($k)) continue; + $fassoc[$k] = $v; + } + $this->fields = $fassoc; + } else + $this->fields = false; + } + } + + if (is_array($this->fields)) { + if (ADODB_ASSOC_CASE == 0) { + foreach($this->fields as $k=>$v) { + $this->fields[strtolower($k)] = $v; + } + } else if (ADODB_ASSOC_CASE == 1) { + foreach($this->fields as $k=>$v) { + $this->fields[strtoupper($k)] = $v; + } + } + } + } else { + $this->fields = @mssql_fetch_row($this->_queryID); + } + if ($this->fields) return true; + $this->EOF = true; + + return false; + } + + + // INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4 + // also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot! + function _fetch($ignore_fields=false) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + if ($this->fetchMode & ADODB_FETCH_NUM) { + //ADODB_FETCH_BOTH mode + $this->fields = @mssql_fetch_array($this->_queryID); + } else { + if ($this->hasFetchAssoc) // only for PHP 4.2.0 or later + $this->fields = @mssql_fetch_assoc($this->_queryID); + else { + $this->fields = @mssql_fetch_array($this->_queryID); + if (@is_array($$this->fields)) { + $fassoc = array(); + foreach($$this->fields as $k => $v) { + if (is_integer($k)) continue; + $fassoc[$k] = $v; + } + $this->fields = $fassoc; + } + } + } + + if (!$this->fields) { + } else if (ADODB_ASSOC_CASE == 0) { + foreach($this->fields as $k=>$v) { + $this->fields[strtolower($k)] = $v; + } + } else if (ADODB_ASSOC_CASE == 1) { + foreach($this->fields as $k=>$v) { + $this->fields[strtoupper($k)] = $v; + } + } + } else { + $this->fields = @mssql_fetch_row($this->_queryID); + } + return $this->fields; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + + function _close() + { + $rez = mssql_free_result($this->_queryID); + $this->_queryID = false; + return $rez; + } + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssql::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssql::UnixTimeStamp($v); + } + +} + + +class ADORecordSet_array_mssql extends ADORecordSet_array { + function ADORecordSet_array_mssql($id=-1,$mode=false) + { + $this->ADORecordSet_array($id,$mode); + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + + if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v); + + global $ADODB_mssql_mths,$ADODB_mssql_date_order; + + //Dec 30 2000 12:00AM + if ($ADODB_mssql_date_order == 'dmy') { + if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { + return parent::UnixDate($v); + } + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[1]; + $themth = substr(strtoupper($rr[2]),0,3); + } else { + if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { + return parent::UnixDate($v); + } + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[2]; + $themth = substr(strtoupper($rr[1]),0,3); + } + $themth = $ADODB_mssql_mths[$themth]; + if ($themth <= 0) return false; + // h-m-s-MM-DD-YY + return mktime(0,0,0,$themth,$theday,$rr[3]); + } + + static function UnixTimeStamp($v) + { + + if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v); + + global $ADODB_mssql_mths,$ADODB_mssql_date_order; + + //Dec 30 2000 12:00AM + if ($ADODB_mssql_date_order == 'dmy') { + if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[1]; + $themth = substr(strtoupper($rr[2]),0,3); + } else { + if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[2]; + $themth = substr(strtoupper($rr[1]),0,3); + } + + $themth = $ADODB_mssql_mths[$themth]; + if ($themth <= 0) return false; + + switch (strtoupper($rr[6])) { + case 'P': + if ($rr[4]<12) $rr[4] += 12; + break; + case 'A': + if ($rr[4]==12) $rr[4] = 0; + break; + default: + break; + } + // h-m-s-MM-DD-YY + return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]); + } +} + +/* +Code Example 1: + +select object_name(constid) as constraint_name, + object_name(fkeyid) as table_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where object_name(fkeyid) = x +order by constraint_name, table_name, referenced_table_name, keyno + +Code Example 2: +select constraint_name, + column_name, + ordinal_position +from information_schema.key_column_usage +where constraint_catalog = db_name() +and table_name = x +order by constraint_name, ordinal_position + +http://www.databasejournal.com/scripts/article.php/1440551 +*/ + +?> diff --git a/fannie/adodb5/drivers/adodb-mssql_n.inc.php b/fannie/adodb5/drivers/adodb-mssql_n.inc.php new file mode 100644 index 000000000..199b10045 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-mssql_n.inc.php @@ -0,0 +1,171 @@ +_appendN($sql); + return ADODB_mssql::_query($sql,$inputarr); + } + + /** + * This function will intercept all the literals used in the SQL, prepending the "N" char to them + * in order to allow mssql to store properly data sent in the correct UCS-2 encoding (by freeTDS + * and ODBTP) keeping SQL compatibility at ADOdb level (instead of hacking every project to add + * the "N" notation when working against MSSQL. + * + * Note that this hack only must be used if ALL the char-based columns in your DB are of type nchar, + * nvarchar and ntext + */ + function _appendN($sql) { + + $result = $sql; + + /// Check we have some single quote in the query. Exit ok. + if (strpos($sql, SINGLEQUOTE) === false) { + return $sql; + } + + /// Check we haven't an odd number of single quotes (this can cause problems below + /// and should be considered one wrong SQL). Exit with debug info. + if ((substr_count($sql, SINGLEQUOTE) & 1)) { + if ($this->debug) { + ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Wrong number of quotes (odd)"); + } + return $sql; + } + + /// Check we haven't any backslash + single quote combination. It should mean wrong + /// backslashes use (bad magic_quotes_sybase?). Exit with debug info. + $regexp = '/(\\\\' . SINGLEQUOTE . '[^' . SINGLEQUOTE . '])/'; + if (preg_match($regexp, $sql)) { + if ($this->debug) { + ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Found bad use of backslash + single quote"); + } + return $sql; + } + + /// Remove pairs of single-quotes + $pairs = array(); + $regexp = '/(' . SINGLEQUOTE . SINGLEQUOTE . ')/'; + preg_match_all($regexp, $result, $list_of_pairs); + if ($list_of_pairs) { + foreach (array_unique($list_of_pairs[0]) as $key=>$value) { + $pairs['<@#@#@PAIR-'.$key.'@#@#@>'] = $value; + } + if (!empty($pairs)) { + $result = str_replace($pairs, array_keys($pairs), $result); + } + } + + /// Remove the rest of literals present in the query + $literals = array(); + $regexp = '/(N?' . SINGLEQUOTE . '.*?' . SINGLEQUOTE . ')/is'; + preg_match_all($regexp, $result, $list_of_literals); + if ($list_of_literals) { + foreach (array_unique($list_of_literals[0]) as $key=>$value) { + $literals['<#@#@#LITERAL-'.$key.'#@#@#>'] = $value; + } + if (!empty($literals)) { + $result = str_replace($literals, array_keys($literals), $result); + } + } + + + /// Analyse literals to prepend the N char to them if their contents aren't numeric + if (!empty($literals)) { + foreach ($literals as $key=>$value) { + if (!is_numeric(trim($value, SINGLEQUOTE))) { + /// Non numeric string, prepend our dear N + $literals[$key] = 'N' . trim($value, 'N'); //Trimming potentially existing previous "N" + } + } + } + + /// Re-apply literals to the text + if (!empty($literals)) { + $result = str_replace(array_keys($literals), $literals, $result); + } + + /// Any pairs followed by N' must be switched to N' followed by those pairs + /// (or strings beginning with single quotes will fail) + $result = preg_replace("/((<@#@#@PAIR-(\d+)@#@#@>)+)N'/", "N'$1", $result); + + /// Re-apply pairs of single-quotes to the text + if (!empty($pairs)) { + $result = str_replace(array_keys($pairs), $pairs, $result); + } + + /// Print transformation if debug = on + if ($result != $sql && $this->debug) { + ADOConnection::outp("{$this->databaseType} internal transformation:
        {$sql}
        to
        {$result}"); + } + + return $result; + } +} + +class ADORecordset_mssql_n extends ADORecordset_mssql { + var $databaseType = "mssql_n"; + function ADORecordset_mssql_n($id,$mode=false) + { + $this->ADORecordset_mssql($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-mssqlnative.inc.php b/fannie/adodb5/drivers/adodb-mssqlnative.inc.php new file mode 100644 index 000000000..59f394425 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-mssqlnative.inc.php @@ -0,0 +1,922 @@ += 0x4300) { +// docs say 4.2.0, but testing shows only since 4.3.0 does it work! + ini_set('mssql.datetimeconvert',0); +} else { + global $ADODB_mssql_mths; // array, months must be upper-case + $ADODB_mssql_date_order = 'mdy'; + $ADODB_mssql_mths = array( + 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, + 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); +} + +//--------------------------------------------------------------------------- +// Call this to autoset $ADODB_mssql_date_order at the beginning of your code, +// just after you connect to the database. Supports mdy and dmy only. +// Not required for PHP 4.2.0 and above. +function AutoDetect_MSSQL_Date_Order($conn) +{ + global $ADODB_mssql_date_order; + $adate = $conn->GetOne('select getdate()'); + if ($adate) { + $anum = (int) $adate; + if ($anum > 0) { + if ($anum > 31) { + //ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently"); + } else + $ADODB_mssql_date_order = 'dmy'; + } else + $ADODB_mssql_date_order = 'mdy'; + } +} + +class ADODB_mssqlnative extends ADOConnection { + var $databaseType = "mssqlnative"; + var $dataProvider = "mssqlnative"; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $substr = "substring"; + var $length = 'len'; + var $hasAffectedRows = true; + var $poorAffectedRows = false; + var $metaDatabasesSQL = "select name from sys.sysdatabases where name <> 'master'"; + var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; + var $metaColumnsSQL = # xtype==61 is datetime + "select c.name,t.name,c.length, + (case when c.xusertype=61 then 0 else c.xprec end), + (case when c.xusertype=61 then 0 else c.xscale end) + from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $hasGenID = true; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + var $maxParameterLen = 4000; + var $arrayClass = 'ADORecordSet_array_mssqlnative'; + var $uniqueSort = true; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $ansiOuter = true; // for mssql7 or later + var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 + var $uniqueOrderBy = true; + var $_bindInputArray = true; + var $_dropSeqSQL = "drop table %s"; + + function ADODB_mssqlnative() + { + if ($this->debug) { + error_log("
        ");
        +            sqlsrv_set_error_handling( SQLSRV_ERRORS_LOG_ALL );
        +            sqlsrv_log_set_severity( SQLSRV_LOG_SEVERITY_ALL );
        +            sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
        +            sqlsrv_configure('warnings_return_as_errors', 0);
        +        } else {
        +            sqlsrv_set_error_handling(0);
        +            sqlsrv_log_set_severity(0);
        +            sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
        +            sqlsrv_configure('warnings_return_as_errors', 0);
        +        }
        +	}
        +
        +	function ServerInfo()
        +	{
        +    	global $ADODB_FETCH_MODE;
        +		if ($this->fetchMode === false) {
        +			$savem = $ADODB_FETCH_MODE;
        +			$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +		} else 
        +			$savem = $this->SetFetchMode(ADODB_FETCH_NUM);
        +		$arrServerInfo = sqlsrv_server_info($this->_connectionID);
        +		$arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];
        +		$arr['version'] = $arrServerInfo['SQLServerVersion'];//ADOConnection::_findvers($arr['description']);
        +		return $arr;
        +	}
        +	
        +	function IfNull( $field, $ifNull ) 
        +	{
        +		return " ISNULL($field, $ifNull) "; // if MS SQL Server
        +	}
        +	
        +	function _insertid()
        +	{
        +	// SCOPE_IDENTITY()
        +	// Returns the last IDENTITY value inserted into an IDENTITY column in 
        +	// the same scope. A scope is a module -- a stored procedure, trigger, 
        +	// function, or batch. Thus, two statements are in the same scope if 
        +	// they are in the same stored procedure, function, or batch.
        +		return $this->GetOne($this->identitySQL);
        +	}
        +
        +	function _affectedrows()
        +	{
        +        return sqlsrv_rows_affected($this->_queryID);
        +	}
        +	
        +	function CreateSequence($seq='adodbseq',$start=1)
        +	{
        +		if($this->debug) error_log("
        CreateSequence($seq,$start)"); + sqlsrv_begin_transaction($this->_connectionID); + $start -= 1; + $this->Execute("create table $seq (id int)");//was float(53) + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + if($this->debug) error_log("
        Error: ROLLBACK"); + sqlsrv_rollback($this->_connectionID); + return false; + } + sqlsrv_commit($this->_connectionID); + return true; + } + + function GenID($seq='adodbseq',$start=1) + { + if($this->debug) error_log("
        GenID($seq,$start)"); + sqlsrv_begin_transaction($this->_connectionID); + $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); + if (!$ok) { + $this->Execute("create table $seq (id int)"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + if($this->debug) error_log("
        Error: ROLLBACK"); + sqlsrv_rollback($this->_connectionID); + return false; + } + sqlsrv_commit($this->_connectionID); + return $start; + } + $num = $this->GetOne("select id from $seq"); + sqlsrv_commit($this->_connectionID); + if($this->debug) error_log(" Returning: $num"); + return $num; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yyyy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(quarter,$col)"; + break; + case 'D': + case 'd': + $s .= "replace(str(day($col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + if ($this->debug) error_log('
        begin transaction'); + sqlsrv_begin_transaction($this->_connectionID); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if ($this->debug) error_log('
        commit transaction'); + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + sqlsrv_commit($this->_connectionID); + return true; + } + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->debug) error_log('
        rollback transaction'); + if ($this->transCnt) $this->transCnt -= 1; + sqlsrv_rollback($this->_connectionID); + return true; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + /* + Usage: + + $this->BeginTrans(); + $this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables + + # some operation on both tables table1 and table2 + + $this->CommitTrans(); + + See http://www.swynk.com/friends/achigrik/SQL70Locks.asp + */ + function RowLock($tables,$where,$flds='top 1 null as ignore') + { + if (!$this->transCnt) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where"); + } + + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + $rs = $this->Execute('USE '.$dbName); + if($rs) { + return true; + } else return false; + } + else return false; + } + + function ErrorMsg() + { + $retErrors = sqlsrv_errors(SQLSRV_ERR_ALL); + if($retErrors != null) { + foreach($retErrors as $arrError) { + $this->_errorMsg .= "SQLState: ".$arrError[ 'SQLSTATE']."\n"; + $this->_errorMsg .= "Error Code: ".$arrError[ 'code']."\n"; + $this->_errorMsg .= "Message: ".$arrError[ 'message']."\n"; + } + } else { + $this->_errorMsg = "No errors found"; + } + return $this->_errorMsg; + } + + function ErrorNo() + { + if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode; + $err = sqlsrv_errors(SQLSRV_ERR_ALL); + if($err[0]) return $err[0]['code']; + else return -1; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sqlsrv_connect')) return null; + $connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword); + if ($this->debug) error_log("
        connecting... hostname: $argHostname params: ".var_export($connectionInfo,true)); + //if ($this->debug) error_log("
        _connectionID before: ".serialize($this->_connectionID)); + if(!($this->_connectionID = sqlsrv_connect($argHostname,$connectionInfo))) { + if ($this->debug) error_log( "
        errors: ".print_r( sqlsrv_errors(), true)); + return false; + } + //if ($this->debug) error_log(" _connectionID after: ".serialize($this->_connectionID)); + //if ($this->debug) error_log("
        defined functions:
        ".var_export(get_defined_functions(),true)."
        "); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + //return null;//not implemented. NOTE: Persistent connections have no effect if PHP is used as a CGI program. (FastCGI!) + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); + } + + function Prepare($sql) + { + $stmt = sqlsrv_prepare( $this->_connectionID, $sql); + if (!$stmt) return $sql; + return array($sql,$stmt); + } + + // returns concatenated string + // MSSQL requires integers to be cast as strings + // automatically cast every datatype to VARCHAR(255) + // @author David Rogers (introspectshun) + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // Split single record on commas, if possible + if (sizeof($arr) == 1) { + foreach ($arr as $arg) { + $args = explode(',', $arg); + } + $arr = $args; + } + + array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";')); + $s = implode('+',$arr); + if (sizeof($arr) > 0) return "$s"; + + return ''; + } + + /* + Unfortunately, it appears that mssql cannot handle varbinary > 255 chars + So all your blobs must be of type "image". + + Remember to set in php.ini the following... + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textlimit = 0 ; zero to pass through + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textsize = 0 ; zero to pass through + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + if (strtoupper($blobtype) == 'CLOB') { + $sql = "UPDATE $table SET $column='" . $val . "' WHERE $where"; + return $this->Execute($sql) != false; + } + $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; + return $this->Execute($sql) != false; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + $this->_errorMsg = false; + if (is_array($inputarr)) { + $rez = sqlsrv_query($this->_connectionID,$sql,$inputarr); + } else if (is_array($sql)) { + $rez = sqlsrv_query($this->_connectionID,$sql[1],$inputarr); + } else { + $rez = sqlsrv_query($this->_connectionID,$sql); + } + if ($this->debug) error_log("
        running query: ".var_export($sql,true)."
        input array: ".var_export($inputarr,true)."
        result: ".var_export($rez,true));//"
        connection: ".serialize($this->_connectionID) + //fix for returning true on anything besides select statements + if (is_array($sql)) $sql = $sql[1]; + $sql = ltrim($sql); + if(stripos($sql, 'SELECT') !== 0 && $rez !== false) { + if ($this->debug) error_log(" isn't a select query, returning boolean true"); + return true; + } + //end fix + if(!$rez) $rez = false; + return $rez; + } + + // returns true or false + function _close() + { + if ($this->transCnt) $this->RollbackTrans(); + $rez = @sqlsrv_close($this->_connectionID); + $this->_connectionID = false; + return $rez; + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssql::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssql::UnixTimeStamp($v); + } + + function &MetaIndexes($table,$primary=false) + { + $table = $this->qstr($table); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if (!$primary && $row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function MetaForeignKeys($table, $owner=false, $upper=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + + $sql = + "select object_name(constid) as constraint_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name + from sysforeignkeys + where upper(object_name(fkeyid)) = $table + order by constraint_name, referenced_table_name, keyno"; + + $constraints =& $this->GetArray($sql); + + $ADODB_FETCH_MODE = $save; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; + } + if (!$arr) return false; + + $arr2 = false; + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + //From: Fernando Moreira + function MetaDatabases() + { + $this->SelectDB("master"); + $rs =& $this->Execute($this->metaDatabasesSQL); + $rows = $rs->GetRows(); + $ret = array(); + for($i=0;$iSelectDB($this->database); + if($ret) + return $ret; + else + return false; + } + + // "Stein-Aksel Basma" + // tested with MSSQL 2000 + function &MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + $schema = ''; + $this->_findschema($table,$schema); + if (!$schema) $schema = $this->database; + if ($schema) $schema = "and k.table_catalog like '$schema%'"; + + $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, + information_schema.table_constraints tc + where tc.constraint_name = k.constraint_name and tc.constraint_type = + 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $a = $this->GetCol($sql); + $ADODB_FETCH_MODE = $savem; + + if ($a && sizeof($a)>0) return $a; + $false = false; + return $false; + } + + + function &MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(($mask)); + $this->metaTablesSQL .= " AND name like $mask"; + } + $ret =& ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_mssqlnative extends ADORecordSet { + + var $databaseType = "mssqlnative"; + var $canSeek = false; + var $fieldOffset = 0; + // _mths works only in non-localised system + + function ADORecordset_mssqlnative($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + if ($this->connection->debug) error_log("(before) ADODB_COUNTRECS: {$ADODB_COUNTRECS} _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}"); + /*$retRowsAff = sqlsrv_rows_affected($this->_queryID);//"If you need to determine the number of rows a query will return before retrieving the actual results, appending a SELECT COUNT ... query would let you get that information, and then a call to next_result would move you to the "real" results." + error_log("rowsaff: ".serialize($retRowsAff)); + $this->_numOfRows = ($ADODB_COUNTRECS)? $retRowsAff:-1;*/ + $this->_numOfRows = -1;//not supported + $fieldmeta = sqlsrv_field_metadata($this->_queryID); + $this->_numOfFields = ($fieldmeta)? count($fieldmeta):-1; + if ($this->connection->debug) error_log("(after) _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}"); + } + + + //Contributed by "Sven Axelsson" + // get next resultset - requires PHP 4.0.5 or later + function NextRecordSet() + { + if (!sqlsrv_next_result($this->_queryID)) return false; + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function &FetchField($fieldOffset = -1) + { + if ($this->connection->debug) error_log("
        fetchfield: $fieldOffset, fetch array:
        ".print_r($this->fields,true)."
        backtrace: ".adodb_backtrace(false)); + if ($fieldOffset != -1) $this->fieldOffset = $fieldOffset; + $arrKeys = array_keys($this->fields); + if(array_key_exists($this->fieldOffset,$arrKeys) && !array_key_exists($arrKeys[$this->fieldOffset],$this->fields)) { + $f = false; + } else { + $f = $this->fields[ $arrKeys[$this->fieldOffset] ]; + if($fieldOffset == -1) $this->fieldOffset++; + } + + if (empty($f)) { + $f = false;//PHP Notice: Only variable references should be returned by reference + } + return $f; + } + + function _seek($row) + { + return false;//There is no support for cursors in the driver at this time. All data is returned via forward-only streams. + } + + // speedup + function MoveNext() + { + if ($this->connection->debug) error_log("movenext()"); + //if ($this->connection->debug) error_log("eof (beginning): ".$this->EOF); + if ($this->EOF) return false; + + $this->_currentRow++; + if ($this->connection->debug) error_log("_currentRow: ".$this->_currentRow); + + if ($this->_fetch()) return true; + $this->EOF = true; + //if ($this->connection->debug) error_log("eof (end): ".$this->EOF); + + return false; + } + + + // INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4 + // also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot! + function _fetch($ignore_fields=false) + { + if ($this->connection->debug) error_log("_fetch()"); + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + if ($this->fetchMode & ADODB_FETCH_NUM) { + if ($this->connection->debug) error_log("fetch mode: both"); + $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_BOTH); + } else { + if ($this->connection->debug) error_log("fetch mode: assoc"); + $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_ASSOC); + } + + if (ADODB_ASSOC_CASE == 0) { + foreach($this->fields as $k=>$v) { + $this->fields[strtolower($k)] = $v; + } + } else if (ADODB_ASSOC_CASE == 1) { + foreach($this->fields as $k=>$v) { + $this->fields[strtoupper($k)] = $v; + } + } + } else { + if ($this->connection->debug) error_log("fetch mode: num"); + $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_NUMERIC); + } + if(is_array($this->fields) && array_key_exists(1,$this->fields) && !array_key_exists(0,$this->fields)) {//fix fetch numeric keys since they're not 0 based + $arrFixed = array(); + foreach($this->fields as $key=>$value) { + if(is_numeric($key)) { + $arrFixed[$key-1] = $value; + } else { + $arrFixed[$key] = $value; + } + } + //if($this->connection->debug) error_log("
        fixing non 0 based return array, old: ".print_r($this->fields,true)." new: ".print_r($arrFixed,true)); + $this->fields = $arrFixed; + } + if(is_array($this->fields)) { + foreach($this->fields as $key=>$value) { + if (is_object($value) && method_exists($value, 'format')) {//is DateTime object + $this->fields[$key] = $value->format("Y-m-d\TH:i:s\Z"); + } + } + } + if($this->fields === null) $this->fields = false; + if ($this->connection->debug) error_log("
        after _fetch, fields:
        ".print_r($this->fields,true)." backtrace: ".adodb_backtrace(false));
        +		return $this->fields;
        +	}
        +	
        +    /*	close() only needs to be called if you are worried about using too much memory while your script
        +		is running. All associated result memory for the specified result identifier will automatically be freed.	*/
        +	function _close() 
        +	{
        +		$rez = sqlsrv_free_stmt($this->_queryID);	
        +		$this->_queryID = false;
        +		return $rez;
        +	}
        +
        +	// mssql uses a default date like Dec 30 2000 12:00AM
        +	static function UnixDate($v)
        +	{
        +		return ADORecordSet_array_mssqlnative::UnixDate($v);
        +	}
        +	
        +	static function UnixTimeStamp($v)
        +	{
        +		return ADORecordSet_array_mssqlnative::UnixTimeStamp($v);
        +	}
        +}
        +
        +
        +class ADORecordSet_array_mssqlnative extends ADORecordSet_array {
        +	function ADORecordSet_array_mssqlnative($id=-1,$mode=false) 
        +	{
        +		$this->ADORecordSet_array($id,$mode);
        +	}
        +	
        +		// mssql uses a default date like Dec 30 2000 12:00AM
        +	static function UnixDate($v)
        +	{
        +	
        +		if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v);
        +		
        +    	global $ADODB_mssql_mths,$ADODB_mssql_date_order;
        +	
        +		//Dec 30 2000 12:00AM 
        +		if ($ADODB_mssql_date_order == 'dmy') {
        +			if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
        +				return parent::UnixDate($v);
        +			}
        +			if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        +			
        +			$theday = $rr[1];
        +			$themth =  substr(strtoupper($rr[2]),0,3);
        +		} else {
        +			if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
        +				return parent::UnixDate($v);
        +			}
        +			if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        +			
        +			$theday = $rr[2];
        +			$themth = substr(strtoupper($rr[1]),0,3);
        +		}
        +		$themth = $ADODB_mssql_mths[$themth];
        +		if ($themth <= 0) return false;
        +		// h-m-s-MM-DD-YY
        +		return  mktime(0,0,0,$themth,$theday,$rr[3]);
        +	}
        +	
        +	static function UnixTimeStamp($v)
        +	{
        +	
        +		if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v);
        +		
        +	    global $ADODB_mssql_mths,$ADODB_mssql_date_order;
        +	
        +		//Dec 30 2000 12:00AM
        +		 if ($ADODB_mssql_date_order == 'dmy') {
        +			 if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
        +			,$v, $rr)) return parent::UnixTimeStamp($v);
        +			if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        +		
        +			$theday = $rr[1];
        +			$themth =  substr(strtoupper($rr[2]),0,3);
        +		} else {
        +			if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
        +			,$v, $rr)) return parent::UnixTimeStamp($v);
        +			if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        +		
        +			$theday = $rr[2];
        +			$themth = substr(strtoupper($rr[1]),0,3);
        +		}
        +		
        +		$themth = $ADODB_mssql_mths[$themth];
        +		if ($themth <= 0) return false;
        +		
        +		switch (strtoupper($rr[6])) {
        +		case 'P':
        +			if ($rr[4]<12) $rr[4] += 12;
        +			break;
        +		case 'A':
        +			if ($rr[4]==12) $rr[4] = 0;
        +			break;
        +		default:
        +			break;
        +		}
        +		// h-m-s-MM-DD-YY
        +		return  mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]);
        +	}
        +}
        +
        +/*
        +Code Example 1:
        +
        +select 	object_name(constid) as constraint_name,
        +       	object_name(fkeyid) as table_name, 
        +        col_name(fkeyid, fkey) as column_name,
        +	object_name(rkeyid) as referenced_table_name,
        +   	col_name(rkeyid, rkey) as referenced_column_name
        +from sysforeignkeys
        +where object_name(fkeyid) = x
        +order by constraint_name, table_name, referenced_table_name,  keyno
        +
        +Code Example 2:
        +select 	constraint_name,
        +	column_name,
        +	ordinal_position
        +from information_schema.key_column_usage
        +where constraint_catalog = db_name()
        +and table_name = x
        +order by constraint_name, ordinal_position
        +
        +http://www.databasejournal.com/scripts/article.php/1440551
        +*/
        +
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/drivers/adodb-mssqlpo.inc.php b/fannie/adodb5/drivers/adodb-mssqlpo.inc.php
        new file mode 100644
        index 000000000..d10e1b845
        --- /dev/null
        +++ b/fannie/adodb5/drivers/adodb-mssqlpo.inc.php
        @@ -0,0 +1,62 @@
        +_has_mssql_init) {
        +			ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
        +			return $sql;
        +		}
        +		if (is_string($sql)) $sql = str_replace('||','+',$sql);
        +		$stmt = mssql_init($sql,$this->_connectionID);
        +		if (!$stmt)  return $sql;
        +		return array($sql,$stmt);
        +	}
        +	
        +	function _query($sql,$inputarr=false)
        +	{
        +		if (is_string($sql)) $sql = str_replace('||','+',$sql);
        +		return ADODB_mssql::_query($sql,$inputarr);
        +	}
        +}
        +
        +class ADORecordset_mssqlpo extends ADORecordset_mssql {
        +	var $databaseType = "mssqlpo";
        +	function ADORecordset_mssqlpo($id,$mode=false)
        +	{
        +		$this->ADORecordset_mssql($id,$mode);
        +	}
        +}
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/drivers/adodb-mysql.inc.php b/fannie/adodb5/drivers/adodb-mysql.inc.php
        new file mode 100644
        index 000000000..2a0c47ee2
        --- /dev/null
        +++ b/fannie/adodb5/drivers/adodb-mysql.inc.php
        @@ -0,0 +1,794 @@
        +rsPrefix .= 'ext_';
        +	}
        +	
        +	function ServerInfo()
        +	{
        +		$arr['description'] = ADOConnection::GetOne("select version()");
        +		$arr['version'] = ADOConnection::_findvers($arr['description']);
        +		return $arr;
        +	}
        +	
        +	function IfNull( $field, $ifNull ) 
        +	{
        +		return " IFNULL($field, $ifNull) "; // if MySQL
        +	}
        +	
        +	
        +	function MetaTables($ttype=false,$showSchema=false,$mask=false) 
        +	{	
        +		$save = $this->metaTablesSQL;
        +		if ($showSchema && is_string($showSchema)) {
        +			$this->metaTablesSQL .= " from $showSchema";
        +		}
        +		
        +		if ($mask) {
        +			$mask = $this->qstr($mask);
        +			$this->metaTablesSQL .= " like $mask";
        +		}
        +		$ret = ADOConnection::MetaTables($ttype,$showSchema);
        +		
        +		$this->metaTablesSQL = $save;
        +		return $ret;
        +	}
        +	
        +	
        +	function MetaIndexes ($table, $primary = FALSE, $owner=false)
        +	{
        +        // save old fetch mode
        +        global $ADODB_FETCH_MODE;
        +        
        +		$false = false;
        +        $save = $ADODB_FETCH_MODE;
        +        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +        if ($this->fetchMode !== FALSE) {
        +               $savem = $this->SetFetchMode(FALSE);
        +        }
        +        
        +        // get index details
        +        $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
        +        
        +        // restore fetchmode
        +        if (isset($savem)) {
        +                $this->SetFetchMode($savem);
        +        }
        +        $ADODB_FETCH_MODE = $save;
        +        
        +        if (!is_object($rs)) {
        +                return $false;
        +        }
        +        
        +        $indexes = array ();
        +        
        +        // parse index data into array
        +        while ($row = $rs->FetchRow()) {
        +                if ($primary == FALSE AND $row[2] == 'PRIMARY') {
        +                        continue;
        +                }
        +                
        +                if (!isset($indexes[$row[2]])) {
        +                        $indexes[$row[2]] = array(
        +                                'unique' => ($row[1] == 0),
        +                                'columns' => array()
        +                        );
        +                }
        +                
        +                $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
        +        }
        +        
        +        // sort columns by order in the index
        +        foreach ( array_keys ($indexes) as $index )
        +        {
        +                ksort ($indexes[$index]['columns']);
        +        }
        +        
        +        return $indexes;
        +	}
        +
        +	
        +	// if magic quotes disabled, use mysql_real_escape_string()
        +	function qstr($s,$magic_quotes=false)
        +	{
        +		if (is_null($s)) return 'NULL';
        +		if (!$magic_quotes) {
        +		
        +			if (ADODB_PHPVER >= 0x4300) {
        +				if (is_resource($this->_connectionID))
        +					return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
        +			}
        +			if ($this->replaceQuote[0] == '\\'){
        +				$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
        +			}
        +			return  "'".str_replace("'",$this->replaceQuote,$s)."'"; 
        +		}
        +		
        +		// undo magic quotes for "
        +		$s = str_replace('\\"','"',$s);
        +		return "'$s'";
        +	}
        +	
        +	function _insertid()
        +	{
        +		return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
        +		//return mysql_insert_id($this->_connectionID);
        +	}
        +	
        +	function GetOne($sql,$inputarr=false)
        +	{
        +		if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
        +			$rs = $this->SelectLimit($sql,1,-1,$inputarr);
        +			if ($rs) {
        +				$rs->Close();
        +				if ($rs->EOF) return false;
        +				return reset($rs->fields);
        +			}
        +		} else {
        +			return ADOConnection::GetOne($sql,$inputarr);
        +		}
        +		return false;
        +	}
        +	
        +	function BeginTrans()
        +	{
        +		if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
        +	}
        +	
        +	function _affectedrows()
        +	{
        +			return mysql_affected_rows($this->_connectionID);
        +	}
        +  
        + 	 // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
        +	// Reference on Last_Insert_ID on the recommended way to simulate sequences
        + 	var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
        +	var $_genSeqSQL = "create table %s (id int not null)";
        +	var $_genSeqCountSQL = "select count(*) from %s";
        +	var $_genSeq2SQL = "insert into %s values (%s)";
        +	var $_dropSeqSQL = "drop table %s";
        +	
        +	function CreateSequence($seqname='adodbseq',$startID=1)
        +	{
        +		if (empty($this->_genSeqSQL)) return false;
        +		$u = strtoupper($seqname);
        +		
        +		$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
        +		if (!$ok) return false;
        +		return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        +	}
        +	
        +
        +	function GenID($seqname='adodbseq',$startID=1)
        +	{
        +		// post-nuke sets hasGenID to false
        +		if (!$this->hasGenID) return false;
        +		
        +		$savelog = $this->_logsql;
        +		$this->_logsql = false;
        +		$getnext = sprintf($this->_genIDSQL,$seqname);
        +		$holdtransOK = $this->_transOK; // save the current status
        +		$rs = @$this->Execute($getnext);
        +		if (!$rs) {
        +			if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
        +			$u = strtoupper($seqname);
        +			$this->Execute(sprintf($this->_genSeqSQL,$seqname));
        +			$cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
        +			if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        +			$rs = $this->Execute($getnext);
        +		}
        +		
        +		if ($rs) {
        +			$this->genID = mysql_insert_id($this->_connectionID);
        +			$rs->Close();
        +		} else
        +			$this->genID = 0;
        +		
        +		$this->_logsql = $savelog;
        +		return $this->genID;
        +	}
        +	
        +  	function MetaDatabases()
        +	{
        +		$qid = mysql_list_dbs($this->_connectionID);
        +		$arr = array();
        +		$i = 0;
        +		$max = mysql_num_rows($qid);
        +		while ($i < $max) {
        +			$db = mysql_tablename($qid,$i);
        +			if ($db != 'mysql') $arr[] = $db;
        +			$i += 1;
        +		}
        +		return $arr;
        +	}
        +	
        +		
        +	// Format date column in sql string given an input format that understands Y M D
        +	function SQLDate($fmt, $col=false)
        +	{	
        +		if (!$col) $col = $this->sysTimeStamp;
        +		$s = 'DATE_FORMAT('.$col.",'";
        +		$concat = false;
        +		$len = strlen($fmt);
        +		for ($i=0; $i < $len; $i++) {
        +			$ch = $fmt[$i];
        +			switch($ch) {
        +				
        +			default:
        +				if ($ch == '\\') {
        +					$i++;
        +					$ch = substr($fmt,$i,1);
        +				}
        +				/** FALL THROUGH */
        +			case '-':
        +			case '/':
        +				$s .= $ch;
        +				break;
        +				
        +			case 'Y':
        +			case 'y':
        +				$s .= '%Y';
        +				break;
        +			case 'M':
        +				$s .= '%b';
        +				break;
        +				
        +			case 'm':
        +				$s .= '%m';
        +				break;
        +			case 'D':
        +			case 'd':
        +				$s .= '%d';
        +				break;
        +			
        +			case 'Q':
        +			case 'q':
        +				$s .= "'),Quarter($col)";
        +				
        +				if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
        +				else $s .= ",('";
        +				$concat = true;
        +				break;
        +			
        +			case 'H': 
        +				$s .= '%H';
        +				break;
        +				
        +			case 'h':
        +				$s .= '%I';
        +				break;
        +				
        +			case 'i':
        +				$s .= '%i';
        +				break;
        +				
        +			case 's':
        +				$s .= '%s';
        +				break;
        +				
        +			case 'a':
        +			case 'A':
        +				$s .= '%p';
        +				break;
        +				
        +			case 'w':
        +				$s .= '%w';
        +				break;
        +				
        +			 case 'W':
        +				$s .= '%U';
        +				break;
        +				
        +			case 'l':
        +				$s .= '%W';
        +				break;
        +			}
        +		}
        +		$s.="')";
        +		if ($concat) $s = "CONCAT($s)";
        +		return $s;
        +	}
        +	
        +
        +	// returns concatenated string
        +	// much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
        +	function Concat()
        +	{
        +		$s = "";
        +		$arr = func_get_args();
        +		
        +		// suggestion by andrew005@mnogo.ru
        +		$s = implode(',',$arr); 
        +		if (strlen($s) > 0) return "CONCAT($s)";
        +		else return '';
        +	}
        +	
        +	function OffsetDate($dayFraction,$date=false)
        +	{		
        +		if (!$date) $date = $this->sysDate;
        +		
        +		$fraction = $dayFraction * 24 * 3600;
        +		return '('. $date . ' + INTERVAL ' .	 $fraction.' SECOND)';
        +		
        +//		return "from_unixtime(unix_timestamp($date)+$fraction)";
        +	}
        +	
        +	// returns true or false
        +	function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
        +	{
        +		if (!empty($this->port)) $argHostname .= ":".$this->port;
        +		
        +		if (ADODB_PHPVER >= 0x4300)
        +			$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
        +												$this->forceNewConnect,$this->clientFlags);
        +		else if (ADODB_PHPVER >= 0x4200)
        +			$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
        +												$this->forceNewConnect);
        +		else
        +			$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
        +	
        +		if ($this->_connectionID === false) return false;
        +		if ($argDatabasename) return $this->SelectDB($argDatabasename);
        +		return true;	
        +	}
        +	
        +	// returns true or false
        +	function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        +	{
        +		if (!empty($this->port)) $argHostname .= ":".$this->port;
        +		
        +		if (ADODB_PHPVER >= 0x4300)
        +			$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
        +		else
        +			$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
        +		if ($this->_connectionID === false) return false;
        +		if ($this->autoRollback) $this->RollbackTrans();
        +		if ($argDatabasename) return $this->SelectDB($argDatabasename);
        +		return true;	
        +	}
        +	
        +	function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        +	{
        +		$this->forceNewConnect = true;
        +		return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
        +	}
        +	
        + 	function MetaColumns($table, $normalize=true) 
        +	{
        +		$this->_findschema($table,$schema);
        +		if ($schema) {
        +			$dbName = $this->database;
        +			$this->SelectDB($schema);
        +		}
        +		global $ADODB_FETCH_MODE;
        +		$save = $ADODB_FETCH_MODE;
        +		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +		
        +		if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
        +		$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
        +		
        +		if ($schema) {
        +			$this->SelectDB($dbName);
        +		}
        +		
        +		if (isset($savem)) $this->SetFetchMode($savem);
        +		$ADODB_FETCH_MODE = $save;
        +		if (!is_object($rs)) {
        +			$false = false;
        +			return $false;
        +		}
        +			
        +		$retarr = array();
        +		while (!$rs->EOF){
        +			$fld = new ADOFieldObject();
        +			$fld->name = $rs->fields[0];
        +			$type = $rs->fields[1];
        +			
        +			// split type into type(length):
        +			$fld->scale = null;
        +			if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
        +				$fld->type = $query_array[1];
        +				$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        +				$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
        +			} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
        +				$fld->type = $query_array[1];
        +				$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        +			} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
        +				$fld->type = $query_array[1];
        +				$arr = explode(",",$query_array[2]);
        +				$fld->enums = $arr;
        +				$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
        +				$fld->max_length = ($zlen > 0) ? $zlen : 1;
        +			} else {
        +				$fld->type = $type;
        +				$fld->max_length = -1;
        +			}
        +			$fld->not_null = ($rs->fields[2] != 'YES');
        +			$fld->primary_key = ($rs->fields[3] == 'PRI');
        +			$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
        +			$fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false);
        +			$fld->unsigned = (strpos($type,'unsigned') !== false);
        +			$fld->zerofill = (strpos($type,'zerofill') !== false);
        +
        +			if (!$fld->binary) {
        +				$d = $rs->fields[4];
        +				if ($d != '' && $d != 'NULL') {
        +					$fld->has_default = true;
        +					$fld->default_value = $d;
        +				} else {
        +					$fld->has_default = false;
        +				}
        +			}
        +			
        +			if ($save == ADODB_FETCH_NUM) {
        +				$retarr[] = $fld;
        +			} else {
        +				$retarr[strtoupper($fld->name)] = $fld;
        +			}
        +				$rs->MoveNext();
        +			}
        +		
        +			$rs->Close();
        +			return $retarr;	
        +	}
        +		
        +	// returns true or false
        +	function SelectDB($dbName) 
        +	{
        +		$this->database = $dbName;
        +		$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
        +		if ($this->_connectionID) {
        +			return @mysql_select_db($dbName,$this->_connectionID);		
        +		}
        +		else return false;	
        +	}
        +	
        +	// parameters use PostgreSQL convention, not MySQL
        +	function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
        +	{
        +		$offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
        +		// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
        +		if ($nrows < 0) $nrows = '18446744073709551615'; 
        +		
        +		if ($secs)
        +			$rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
        +		else
        +			$rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
        +		return $rs;
        +	}
        +	
        +	// returns queryID or false
        +	function _query($sql,$inputarr=false)
        +	{
        +	//global $ADODB_COUNTRECS;
        +		//if($ADODB_COUNTRECS) 
        +		return mysql_query($sql,$this->_connectionID);
        +		//else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
        +	}
        +
        +	/*	Returns: the last error message from previous database operation	*/	
        +	function ErrorMsg() 
        +	{
        +	
        +		if ($this->_logsql) return $this->_errorMsg;
        +		if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
        +		else $this->_errorMsg = @mysql_error($this->_connectionID);
        +		return $this->_errorMsg;
        +	}
        +	
        +	/*	Returns: the last error number from previous database operation	*/	
        +	function ErrorNo() 
        +	{
        +		if ($this->_logsql) return $this->_errorCode;
        +		if (empty($this->_connectionID))  return @mysql_errno();
        +		else return @mysql_errno($this->_connectionID);
        +	}
        +	
        +	// returns true or false
        +	function _close()
        +	{
        +		@mysql_close($this->_connectionID);
        +		$this->_connectionID = false;
        +	}
        +
        +	
        +	/*
        +	* Maximum size of C field
        +	*/
        +	function CharMax()
        +	{
        +		return 255; 
        +	}
        +	
        +	/*
        +	* Maximum size of X field
        +	*/
        +	function TextMax()
        +	{
        +		return 4294967295; 
        +	}
        +	
        +	// "Innox - Juan Carlos Gonzalez" 
        +	function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
        +     {
        +	 global $ADODB_FETCH_MODE;
        +		if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
        +
        +         if ( !empty($owner) ) {
        +            $table = "$owner.$table";
        +         }
        +         $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
        +		 if ($associative) {
        +		 	$create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
        +         } else $create_sql  = $a_create_table[1];
        +
        +         $matches = array();
        +
        +         if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
        +	     $foreign_keys = array();	 	 
        +         $num_keys = count($matches[0]);
        +         for ( $i = 0;  $i < $num_keys;  $i ++ ) {
        +             $my_field  = explode('`, `', $matches[1][$i]);
        +             $ref_table = $matches[2][$i];
        +             $ref_field = explode('`, `', $matches[3][$i]);
        +
        +             if ( $upper ) {
        +                 $ref_table = strtoupper($ref_table);
        +             }
        +
        +			// see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
        +			if (!isset($foreign_keys[$ref_table])) {
        +				$foreign_keys[$ref_table] = array();
        +			}
        +            $num_fields = count($my_field);
        +            for ( $j = 0;  $j < $num_fields;  $j ++ ) {
        +                 if ( $associative ) {
        +                     $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
        +                 } else {
        +                     $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
        +                 }
        +             }
        +         }
        +         
        +         return  $foreign_keys;
        +     }
        +	 
        +	
        +}
        +	
        +/*--------------------------------------------------------------------------------------
        +	 Class Name: Recordset
        +--------------------------------------------------------------------------------------*/
        +
        +
        +class ADORecordSet_mysql extends ADORecordSet{	
        +	
        +	var $databaseType = "mysql";
        +	var $canSeek = true;
        +	
        +	function ADORecordSet_mysql($queryID,$mode=false) 
        +	{
        +		if ($mode === false) { 
        +			global $ADODB_FETCH_MODE;
        +			$mode = $ADODB_FETCH_MODE;
        +		}
        +		switch ($mode)
        +		{
        +		case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
        +		case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
        +		case ADODB_FETCH_DEFAULT:
        +		case ADODB_FETCH_BOTH:
        +		default:
        +			$this->fetchMode = MYSQL_BOTH; break;
        +		}
        +		$this->adodbFetchMode = $mode;
        +		$this->ADORecordSet($queryID);	
        +	}
        +	
        +	function _initrs()
        +	{
        +	//GLOBAL $ADODB_COUNTRECS;
        +	//	$this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
        +		$this->_numOfRows = @mysql_num_rows($this->_queryID);
        +		$this->_numOfFields = @mysql_num_fields($this->_queryID);
        +	}
        +	
        +	function FetchField($fieldOffset = -1) 
        +	{	
        +		if ($fieldOffset != -1) {
        +			$o = @mysql_fetch_field($this->_queryID, $fieldOffset);
        +			$f = @mysql_field_flags($this->_queryID,$fieldOffset);
        +			if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com)
        +			//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
        +			if ($o) $o->binary = (strpos($f,'binary')!== false);
        +		}
        +		else if ($fieldOffset == -1) {	/*	The $fieldOffset argument is not provided thus its -1 	*/
        +			$o = @mysql_fetch_field($this->_queryID);
        +			if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com)
        +		//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
        +		}
        +			
        +		return $o;
        +	}
        +
        +	function GetRowAssoc($upper=true)
        +	{
        +		if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields;
        +		else $row = ADORecordSet::GetRowAssoc($upper);
        +		return $row;
        +	}
        +	
        +	/* Use associative array to get fields array */
        +	function Fields($colname)
        +	{	
        +		// added @ by "Michael William Miller" 
        +		if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];
        +		
        +		if (!$this->bind) {
        +			$this->bind = array();
        +			for ($i=0; $i < $this->_numOfFields; $i++) {
        +				$o = $this->FetchField($i);
        +				$this->bind[strtoupper($o->name)] = $i;
        +			}
        +		}
        +		 return $this->fields[$this->bind[strtoupper($colname)]];
        +	}
        +	
        +	function _seek($row)
        +	{
        +		if ($this->_numOfRows == 0) return false;
        +		return @mysql_data_seek($this->_queryID,$row);
        +	}
        +	
        +	function MoveNext()
        +	{
        +		//return adodb_movenext($this);
        +		//if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
        +		if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
        +			$this->_currentRow += 1;
        +			return true;
        +		}
        +		if (!$this->EOF) {
        +			$this->_currentRow += 1;
        +			$this->EOF = true;
        +		}
        +		return false;
        +	}
        +	
        +	function _fetch()
        +	{
        +		$this->fields =  @mysql_fetch_array($this->_queryID,$this->fetchMode);
        +		return is_array($this->fields);
        +	}
        +	
        +	function _close() {
        +		@mysql_free_result($this->_queryID);	
        +		$this->_queryID = false;	
        +	}
        +	
        +	function MetaType($t,$len=-1,$fieldobj=false)
        +	{
        +		if (is_object($t)) {
        +			$fieldobj = $t;
        +			$t = $fieldobj->type;
        +			$len = $fieldobj->max_length;
        +		}
        +		
        +		$len = -1; // mysql max_length is not accurate
        +		switch (strtoupper($t)) {
        +		case 'STRING': 
        +		case 'CHAR':
        +		case 'VARCHAR': 
        +		case 'TINYBLOB': 
        +		case 'TINYTEXT': 
        +		case 'ENUM': 
        +		case 'SET': 
        +			if ($len <= $this->blobSize) return 'C';
        +			
        +		case 'TEXT':
        +		case 'LONGTEXT': 
        +		case 'MEDIUMTEXT':
        +			return 'X';
        +			
        +		// php_mysql extension always returns 'blob' even if 'text'
        +		// so we have to check whether binary...
        +		case 'IMAGE':
        +		case 'LONGBLOB': 
        +		case 'BLOB':
        +		case 'MEDIUMBLOB':
        +		case 'BINARY':
        +			return !empty($fieldobj->binary) ? 'B' : 'X';
        +			
        +		case 'YEAR':
        +		case 'DATE': return 'D';
        +		
        +		case 'TIME':
        +		case 'DATETIME':
        +		case 'TIMESTAMP': return 'T';
        +		
        +		case 'INT': 
        +		case 'INTEGER':
        +		case 'BIGINT':
        +		case 'TINYINT':
        +		case 'MEDIUMINT':
        +		case 'SMALLINT': 
        +			
        +			if (!empty($fieldobj->primary_key)) return 'R';
        +			else return 'I';
        +		
        +		default: return 'N';
        +		}
        +	}
        +
        +}
        +
        +class ADORecordSet_ext_mysql extends ADORecordSet_mysql {	
        +	function ADORecordSet_ext_mysql($queryID,$mode=false) 
        +	{
        +		if ($mode === false) { 
        +			global $ADODB_FETCH_MODE;
        +			$mode = $ADODB_FETCH_MODE;
        +		}
        +		switch ($mode)
        +		{
        +		case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
        +		case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
        +		case ADODB_FETCH_DEFAULT:
        +		case ADODB_FETCH_BOTH:
        +		default:
        +		$this->fetchMode = MYSQL_BOTH; break;
        +		}
        +		$this->adodbFetchMode = $mode;
        +		$this->ADORecordSet($queryID);
        +	}
        +	
        +	function MoveNext()
        +	{
        +		return @adodb_movenext($this);
        +	}
        +}
        +
        +
        +}
        +?>
        diff --git a/fannie/adodb5/drivers/adodb-mysqli.inc.php b/fannie/adodb5/drivers/adodb-mysqli.inc.php
        new file mode 100644
        index 000000000..611d8bd63
        --- /dev/null
        +++ b/fannie/adodb5/drivers/adodb-mysqli.inc.php
        @@ -0,0 +1,1187 @@
        +_transmode  = $transaction_mode;
        +		if (empty($transaction_mode)) {
        +			$this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ');
        +			return;
        +		}
        +		if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
        +		$this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
        +	}
        +
        +	// returns true or false
        +	// To add: parameter int $port,
        +	//         parameter string $socket
        +	function _connect($argHostname = NULL, 
        +			  $argUsername = NULL, 
        +			  $argPassword = NULL, 
        +			  $argDatabasename = NULL, $persist=false)
        +	  {
        +	  	 if(!extension_loaded("mysqli")) {
        +			return null;
        +		 }
        +	    $this->_connectionID = @mysqli_init();
        +	    
        +	    if (is_null($this->_connectionID)) {
        +	      // mysqli_init only fails if insufficient memory
        +	      if ($this->debug) 
        +				ADOConnection::outp("mysqli_init() failed : "  . $this->ErrorMsg());
        +	      return false;
        +	    }
        +		/*
        +		I suggest a simple fix which would enable adodb and mysqli driver to
        +		read connection options from the standard mysql configuration file
        +		/etc/my.cnf - "Bastien Duclaux" 
        +		*/
        +		foreach($this->optionFlags as $arr) {	
        +			mysqli_options($this->_connectionID,$arr[0],$arr[1]);
        +		}
        +
        +		#if (!empty($this->port)) $argHostname .= ":".$this->port;
        +		$ok = mysqli_real_connect($this->_connectionID,
        + 				    $argHostname,
        + 				    $argUsername,
        + 				    $argPassword,
        + 				    $argDatabasename,
        +					$this->port,
        +					$this->socket,
        +					$this->clientFlags);
        + 	     
        +		if ($ok) {
        +	 		if ($argDatabasename)  return $this->SelectDB($argDatabasename);
        + 			return true;
        + 	   } else {
        +			if ($this->debug) 
        +		  		ADOConnection::outp("Could't connect : "  . $this->ErrorMsg());
        +			$this->_connectionID = null;
        +			return false;
        +	   }
        +	}
        +	
        +	// returns true or false
        +	// How to force a persistent connection
        +	function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        +	{
        +		return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true);
        +
        +	}
        +	
        +	// When is this used? Close old connection first?
        +	// In _connect(), check $this->forceNewConnect? 
        +	function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        +	  {
        +	    $this->forceNewConnect = true;
        +	    return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
        +	  }
        +	
        +	function IfNull( $field, $ifNull ) 
        +	{
        +		return " IFNULL($field, $ifNull) "; // if MySQL
        +	}
        +	
        +	// do not use $ADODB_COUNTRECS
        +	function GetOne($sql,$inputarr=false)
        +	{
        +		$ret = false;
        +		$rs = $this->Execute($sql,$inputarr);
        +		if ($rs) {	
        +			if (!$rs->EOF) $ret = reset($rs->fields);
        +			$rs->Close();
        +		}
        +		return $ret;
        +	}
        +	
        +	function ServerInfo()
        +	{
        +		$arr['description'] = $this->GetOne("select version()");
        +		$arr['version'] = ADOConnection::_findvers($arr['description']);
        +		return $arr;
        +	}
        +	
        +	
        +	function BeginTrans()
        +	{	  
        +		if ($this->transOff) return true;
        +		$this->transCnt += 1;
        +		
        +		//$this->Execute('SET AUTOCOMMIT=0');
        +		mysqli_autocommit($this->_connectionID, false);
        +		$this->Execute('BEGIN');
        +		return true;
        +	}
        +	
        +	function CommitTrans($ok=true) 
        +	{
        +		if ($this->transOff) return true; 
        +		if (!$ok) return $this->RollbackTrans();
        +		
        +		if ($this->transCnt) $this->transCnt -= 1;
        +		$this->Execute('COMMIT');
        +		
        +		//$this->Execute('SET AUTOCOMMIT=1');
        +		mysqli_autocommit($this->_connectionID, true);
        +		return true;
        +	}
        +	
        +	function RollbackTrans()
        +	{
        +		if ($this->transOff) return true;
        +		if ($this->transCnt) $this->transCnt -= 1;
        +		$this->Execute('ROLLBACK');
        +		//$this->Execute('SET AUTOCOMMIT=1');
        +		mysqli_autocommit($this->_connectionID, true);
        +		return true;
        +	}
        +	
        +	function RowLock($tables,$where='',$flds='1 as adodb_ignore') 
        +	{
        +		if ($this->transCnt==0) $this->BeginTrans();
        +		if ($where) $where = ' where '.$where;
        +		$rs = $this->Execute("select $flds from $tables $where for update");
        +		return !empty($rs); 
        +	}
        +	
        +	// if magic quotes disabled, use mysql_real_escape_string()
        +	// From readme.htm:
        +	// Quotes a string to be sent to the database. The $magic_quotes_enabled
        +	// parameter may look funny, but the idea is if you are quoting a 
        +	// string extracted from a POST/GET variable, then 
        +	// pass get_magic_quotes_gpc() as the second parameter. This will 
        +	// ensure that the variable is not quoted twice, once by qstr and once 
        +	// by the magic_quotes_gpc.
        +	//
        +	//Eg. $s = $db->qstr(_GET['name'],get_magic_quotes_gpc());
        +	function qstr($s, $magic_quotes = false)
        +	{
        +		if (is_null($s)) return 'NULL';
        +		if (!$magic_quotes) {
        +	    	if (PHP_VERSION >= 5)
        +	      		return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'";   
        +	    
        +		if ($this->replaceQuote[0] == '\\')
        +			$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
        +	    return  "'".str_replace("'",$this->replaceQuote,$s)."'"; 
        +	  }
        +	  // undo magic quotes for "
        +	  $s = str_replace('\\"','"',$s);
        +	  return "'$s'";
        +	}
        +	
        +	function _insertid()
        +	{
        +	  $result = @mysqli_insert_id($this->_connectionID);
        +	  if ($result == -1){
        +	      if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : "  . $this->ErrorMsg());
        +	  }
        +	  return $result;
        +	}
        +	
        +	// Only works for INSERT, UPDATE and DELETE query's
        +	function _affectedrows()
        +	{
        +	  $result =  @mysqli_affected_rows($this->_connectionID);
        +	  if ($result == -1) {
        +	      if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : "  . $this->ErrorMsg());
        +	  }
        +	  return $result;
        +	}
        +  
        + 	// See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
        +	// Reference on Last_Insert_ID on the recommended way to simulate sequences
        + 	var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
        +	var $_genSeqSQL = "create table %s (id int not null)";
        +	var $_genSeqCountSQL = "select count(*) from %s";
        +	var $_genSeq2SQL = "insert into %s values (%s)";
        +	var $_dropSeqSQL = "drop table %s";
        +	
        +	function CreateSequence($seqname='adodbseq',$startID=1)
        +	{
        +		if (empty($this->_genSeqSQL)) return false;
        +		$u = strtoupper($seqname);
        +		
        +		$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
        +		if (!$ok) return false;
        +		return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        +	}
        +	
        +	function GenID($seqname='adodbseq',$startID=1)
        +	{
        +		// post-nuke sets hasGenID to false
        +		if (!$this->hasGenID) return false;
        +		
        +		$getnext = sprintf($this->_genIDSQL,$seqname);
        +		$holdtransOK = $this->_transOK; // save the current status
        +		$rs = @$this->Execute($getnext);
        +		if (!$rs) {
        +			if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
        +			$u = strtoupper($seqname);
        +			$this->Execute(sprintf($this->_genSeqSQL,$seqname));
        +			$cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
        +			if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        +			$rs = $this->Execute($getnext);
        +		}
        +		
        +		if ($rs) {
        +			$this->genID = mysqli_insert_id($this->_connectionID);
        +			$rs->Close();
        +		} else
        +			$this->genID = 0;
        +			
        +		return $this->genID;
        +	}
        +	
        +  	function MetaDatabases()
        +	{
        +		$query = "SHOW DATABASES";
        +		$ret = $this->Execute($query);
        +		if ($ret && is_object($ret)){
        +		   $arr = array();
        +			while (!$ret->EOF){
        +				$db = $ret->Fields('Database');
        +				if ($db != 'mysql') $arr[] = $db;
        +				$ret->MoveNext();
        +			}
        +   		   return $arr;
        +		}
        +        return $ret;
        +	}
        +
        +	  
        +	function MetaIndexes ($table, $primary = FALSE)
        +	{
        +		// save old fetch mode
        +		global $ADODB_FETCH_MODE;
        +		
        +		$false = false;
        +		$save = $ADODB_FETCH_MODE;
        +		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +		if ($this->fetchMode !== FALSE) {
        +		       $savem = $this->SetFetchMode(FALSE);
        +		}
        +		
        +		// get index details
        +		$rs = $this->Execute(sprintf('SHOW INDEXES FROM %s',$table));
        +		
        +		// restore fetchmode
        +		if (isset($savem)) {
        +		        $this->SetFetchMode($savem);
        +		}
        +		$ADODB_FETCH_MODE = $save;
        +		
        +		if (!is_object($rs)) {
        +		        return $false;
        +		}
        +		
        +		$indexes = array ();
        +		
        +		// parse index data into array
        +		while ($row = $rs->FetchRow()) {
        +		        if ($primary == FALSE AND $row[2] == 'PRIMARY') {
        +		                continue;
        +		        }
        +		        
        +		        if (!isset($indexes[$row[2]])) {
        +		                $indexes[$row[2]] = array(
        +		                        'unique' => ($row[1] == 0),
        +		                        'columns' => array()
        +		                );
        +		        }
        +		        
        +		        $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
        +		}
        +		
        +		// sort columns by order in the index
        +		foreach ( array_keys ($indexes) as $index )
        +		{
        +		        ksort ($indexes[$index]['columns']);
        +		}
        +		
        +		return $indexes;
        +	}
        +
        +	
        +	// Format date column in sql string given an input format that understands Y M D
        +	function SQLDate($fmt, $col=false)
        +	{	
        +		if (!$col) $col = $this->sysTimeStamp;
        +		$s = 'DATE_FORMAT('.$col.",'";
        +		$concat = false;
        +		$len = strlen($fmt);
        +		for ($i=0; $i < $len; $i++) {
        +			$ch = $fmt[$i];
        +			switch($ch) {
        +			case 'Y':
        +			case 'y':
        +				$s .= '%Y';
        +				break;
        +			case 'Q':
        +			case 'q':
        +				$s .= "'),Quarter($col)";
        +				
        +				if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
        +				else $s .= ",('";
        +				$concat = true;
        +				break;
        +			case 'M':
        +				$s .= '%b';
        +				break;
        +				
        +			case 'm':
        +				$s .= '%m';
        +				break;
        +			case 'D':
        +			case 'd':
        +				$s .= '%d';
        +				break;
        +			
        +			case 'H': 
        +				$s .= '%H';
        +				break;
        +				
        +			case 'h':
        +				$s .= '%I';
        +				break;
        +				
        +			case 'i':
        +				$s .= '%i';
        +				break;
        +				
        +			case 's':
        +				$s .= '%s';
        +				break;
        +				
        +			case 'a':
        +			case 'A':
        +				$s .= '%p';
        +				break;
        +			
        +			case 'w':
        +				$s .= '%w';
        +				break;
        +				
        +			case 'l':
        +				$s .= '%W';
        +				break;
        +				
        +			default:
        +				
        +				if ($ch == '\\') {
        +					$i++;
        +					$ch = substr($fmt,$i,1);
        +				}
        +				$s .= $ch;
        +				break;
        +			}
        +		}
        +		$s.="')";
        +		if ($concat) $s = "CONCAT($s)";
        +		return $s;
        +	}
        +	
        +	// returns concatenated string
        +	// much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
        +	function Concat()
        +	{
        +		$s = "";
        +		$arr = func_get_args();
        +		
        +		// suggestion by andrew005@mnogo.ru
        +		$s = implode(',',$arr); 
        +		if (strlen($s) > 0) return "CONCAT($s)";
        +		else return '';
        +	}
        +	
        +	// dayFraction is a day in floating point
        +	function OffsetDate($dayFraction,$date=false)
        +	{		
        +		if (!$date) $date = $this->sysDate;
        +		
        +		$fraction = $dayFraction * 24 * 3600;
        +		return $date . ' + INTERVAL ' .	 $fraction.' SECOND';
        +		
        +//		return "from_unixtime(unix_timestamp($date)+$fraction)";
        +	}
        +	
        +	function MetaTables($ttype=false,$showSchema=false,$mask=false) 
        +	{	
        +		$save = $this->metaTablesSQL;
        +		if ($showSchema && is_string($showSchema)) {
        +			$this->metaTablesSQL .= " from $showSchema";
        +		}
        +		
        +		if ($mask) {
        +			$mask = $this->qstr($mask);
        +			$this->metaTablesSQL .= " like $mask";
        +		}
        +		$ret = ADOConnection::MetaTables($ttype,$showSchema);
        +		
        +		$this->metaTablesSQL = $save;
        +		return $ret;
        +	}
        +	
        +	// "Innox - Juan Carlos Gonzalez" 
        +	function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
        +	{
        +	 global $ADODB_FETCH_MODE;
        +		
        +		if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
        +		
        +	    if ( !empty($owner) ) {
        +	       $table = "$owner.$table";
        +	    }
        +	    $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
        +		if ($associative) {
        +			$create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
        +	    } else $create_sql  = $a_create_table[1];
        +	
        +	    $matches = array();
        +	
        +	    if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
        +	 	$foreign_keys = array();	 	 
        +	    $num_keys = count($matches[0]);
        +	    for ( $i = 0;  $i < $num_keys;  $i ++ ) {
        +	        $my_field  = explode('`, `', $matches[1][$i]);
        +	        $ref_table = $matches[2][$i];
        +	        $ref_field = explode('`, `', $matches[3][$i]);
        +	
        +	        if ( $upper ) {
        +	            $ref_table = strtoupper($ref_table);
        +	        }
        +	
        +	        // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
        +			if (!isset($foreign_keys[$ref_table])) {
        +				$foreign_keys[$ref_table] = array();
        +			}
        +	        $num_fields = count($my_field);
        +	        for ( $j = 0;  $j < $num_fields;  $j ++ ) {
        +	            if ( $associative ) {
        +	                $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
        +	            } else {
        +	                $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
        +	            }
        +	        }
        +	    }
        +	    
        +	    return  $foreign_keys;
        +	}
        +	
        + 	function MetaColumns($table, $normalize=true) 
        +	{
        +		$false = false;
        +		if (!$this->metaColumnsSQL)
        +			return $false;
        +		
        +		global $ADODB_FETCH_MODE;
        +		$save = $ADODB_FETCH_MODE;
        +		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        +		if ($this->fetchMode !== false)
        +			$savem = $this->SetFetchMode(false);
        +		$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
        +		if (isset($savem)) $this->SetFetchMode($savem);
        +		$ADODB_FETCH_MODE = $save;
        +		if (!is_object($rs))
        +			return $false;
        +		
        +		$retarr = array();
        +		while (!$rs->EOF) {
        +			$fld = new ADOFieldObject();
        +			$fld->name = $rs->fields[0];
        +			$type = $rs->fields[1];
        +			
        +			// split type into type(length):
        +			$fld->scale = null;
        +			if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
        +				$fld->type = $query_array[1];
        +				$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        +				$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
        +			} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
        +				$fld->type = $query_array[1];
        +				$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        +			} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
        +				$fld->type = $query_array[1];
        +				$arr = explode(",",$query_array[2]);
        +				$fld->enums = $arr;
        +				$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
        +				$fld->max_length = ($zlen > 0) ? $zlen : 1;
        +			} else {
        +				$fld->type = $type;
        +				$fld->max_length = -1;
        +			}
        +			$fld->not_null = ($rs->fields[2] != 'YES');
        +			$fld->primary_key = ($rs->fields[3] == 'PRI');
        +			$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
        +			$fld->binary = (strpos($type,'blob') !== false);
        +			$fld->unsigned = (strpos($type,'unsigned') !== false);
        +			$fld->zerofill = (strpos($type,'zerofill') !== false);
        +
        +			if (!$fld->binary) {
        +				$d = $rs->fields[4];
        +				if ($d != '' && $d != 'NULL') {
        +					$fld->has_default = true;
        +					$fld->default_value = $d;
        +				} else {
        +					$fld->has_default = false;
        +				}
        +			}
        +			
        +			if ($save == ADODB_FETCH_NUM) {
        +				$retarr[] = $fld;
        +			} else {
        +				$retarr[strtoupper($fld->name)] = $fld;
        +			}
        +			$rs->MoveNext();
        +		}
        +		
        +		$rs->Close();
        +		return $retarr;
        +	}
        +		
        +	// returns true or false
        +	function SelectDB($dbName) 
        +	{
        +//	    $this->_connectionID = $this->mysqli_resolve_link($this->_connectionID);
        +	    $this->database = $dbName;
        +		$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
        +		
        +	    if ($this->_connectionID) {
        +        	$result = @mysqli_select_db($this->_connectionID, $dbName);
        +			if (!$result) {
        +		    	ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg());
        +			}
        +			return $result;		
        +		}
        +	    return false;	
        +	}
        +	
        +	// parameters use PostgreSQL convention, not MySQL
        +	function SelectLimit($sql,
        +			      $nrows = -1,
        +			      $offset = -1,
        +			      $inputarr = false, 
        +			      $secs = 0)
        +	{
        +		$offsetStr = ($offset >= 0) ? "$offset," : '';
        +		if ($nrows < 0) $nrows = '18446744073709551615';
        +		
        +		if ($secs)
        +			$rs = $this->CacheExecute($secs, $sql . " LIMIT $offsetStr$nrows" , $inputarr );
        +		else
        +			$rs = $this->Execute($sql . " LIMIT $offsetStr$nrows" , $inputarr );
        +			
        +		return $rs;
        +	}
        +	
        +	
        +	function Prepare($sql)
        +	{
        +		return $sql;
        +		$stmt = $this->_connectionID->prepare($sql);
        +		if (!$stmt) {
        +			echo $this->ErrorMsg();
        +			return $sql;
        +		}
        +		return array($sql,$stmt);
        +	}
        +	
        +	
        +	// returns queryID or false
        +	function _query($sql, $inputarr)
        +	{
        +	global $ADODB_COUNTRECS;
        +		// Move to the next recordset, or return false if there is none. In a stored proc
        +		// call, mysqli_next_result returns true for the last "recordset", but mysqli_store_result
        +		// returns false. I think this is because the last "recordset" is actually just the
        +		// return value of the stored proc (ie the number of rows affected).
        +		// Commented out for reasons of performance. You should retrieve every recordset yourself.
        +		//	if (!mysqli_next_result($this->connection->_connectionID))	return false;
        +	
        +		if (is_array($sql)) {
        +		
        +			// Prepare() not supported because mysqli_stmt_execute does not return a recordset, but
        +			// returns as bound variables.
        +		
        +			$stmt = $sql[1];
        +			$a = '';
        +			foreach($inputarr as $k => $v) {
        +				if (is_string($v)) $a .= 's';
        +				else if (is_integer($v)) $a .= 'i'; 
        +				else $a .= 'd';
        +			}
        +			
        +			$fnarr = array_merge( array($stmt,$a) , $inputarr);
        +			$ret = call_user_func_array('mysqli_stmt_bind_param',$fnarr);
        +			$ret = mysqli_stmt_execute($stmt);
        +			return $ret;
        +		}
        +		
        +		/*
        +		if (!$mysql_res =  mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) {
        +		    if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
        +		    return false;
        +		}
        +		
        +		return $mysql_res;
        +		*/
        +		
        +		if( $rs = mysqli_multi_query($this->_connectionID, $sql.';') )//Contributed by "Geisel Sierote" 
        +		{
        +			$rs = ($ADODB_COUNTRECS) ? @mysqli_store_result( $this->_connectionID ) : @mysqli_use_result( $this->_connectionID );
        +			return $rs ? $rs : true; // mysqli_more_results( $this->_connectionID )
        +		} else {
        +			if($this->debug)
        +			ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
        +			return false;
        +		}
        +	}
        +
        +	/*	Returns: the last error message from previous database operation	*/	
        +	function ErrorMsg() 
        +	  {
        +	    if (empty($this->_connectionID)) 
        +	      $this->_errorMsg = @mysqli_connect_error();
        +	    else 
        +	      $this->_errorMsg = @mysqli_error($this->_connectionID);
        +	    return $this->_errorMsg;
        +	  }
        +	
        +	/*	Returns: the last error number from previous database operation	*/	
        +	function ErrorNo() 
        +	  {
        +	    if (empty($this->_connectionID))  
        +	      return @mysqli_connect_errno();
        +	    else 
        +	      return @mysqli_errno($this->_connectionID);
        +	  }
        +	
        +	// returns true or false
        +	function _close()
        +	  {
        +	    @mysqli_close($this->_connectionID);
        +	    $this->_connectionID = false;
        +	  }
        +
        +	/*
        +	* Maximum size of C field
        +	*/
        +	function CharMax()
        +	{
        +		return 255; 
        +	}
        +	
        +	/*
        +	* Maximum size of X field
        +	*/
        +	function TextMax()
        +	{
        +	  return 4294967295; 
        +	}
        +
        +
        +
        +	// this is a set of functions for managing client encoding - very important if the encodings
        +	// of your database and your output target (i.e. HTML) don't match
        +	// for instance, you may have UTF8 database and server it on-site as latin1 etc.
        +	// GetCharSet - get the name of the character set the client is using now
        +	// Under Windows, the functions should work with MySQL 4.1.11 and above, the set of charsets supported
        +	// depends on compile flags of mysql distribution 
        +
        +  function GetCharSet()
        +  {
        +    //we will use ADO's builtin property charSet
        +    if (!method_exists($this->_connectionID,'character_set_name'))
        +    	return false;
        +    	
        +    $this->charSet = @$this->_connectionID->character_set_name();
        +    if (!$this->charSet) {
        +      return false;
        +    } else {
        +      return $this->charSet;
        +    }
        +  }
        +
        +  // SetCharSet - switch the client encoding
        +  function SetCharSet($charset_name)
        +  {
        +    if (!method_exists($this->_connectionID,'set_charset'))
        +    	return false;
        +
        +    if ($this->charSet !== $charset_name) {
        +      $if = @$this->_connectionID->set_charset($charset_name);
        +      if ($if == "0" & $this->GetCharSet() == $charset_name) {
        +        return true;
        +      } else return false;
        +    } else return true;
        +  }
        +
        +
        +
        +
        +}
        + 
        +/*--------------------------------------------------------------------------------------
        +	 Class Name: Recordset
        +--------------------------------------------------------------------------------------*/
        +
        +class ADORecordSet_mysqli extends ADORecordSet{	
        +	
        +	var $databaseType = "mysqli";
        +	var $canSeek = true;
        +	
        +	function ADORecordSet_mysqli($queryID, $mode = false) 
        +	{
        +	  if ($mode === false) 
        +	   { 
        +	      global $ADODB_FETCH_MODE;
        +	      $mode = $ADODB_FETCH_MODE;
        +	   }
        +	   
        +	  switch ($mode)
        +	    {
        +	    case ADODB_FETCH_NUM: 
        +	      $this->fetchMode = MYSQLI_NUM; 
        +	      break;
        +	    case ADODB_FETCH_ASSOC:
        +	      $this->fetchMode = MYSQLI_ASSOC; 
        +	      break;
        +	    case ADODB_FETCH_DEFAULT:
        +	    case ADODB_FETCH_BOTH:
        +	    default:
        +	      $this->fetchMode = MYSQLI_BOTH; 
        +	      break;
        +	    }
        +	  $this->adodbFetchMode = $mode;
        +	  $this->ADORecordSet($queryID);	
        +	}
        +	
        +	function _initrs()
        +	{
        +	global $ADODB_COUNTRECS;
        +	
        +		$this->_numOfRows = $ADODB_COUNTRECS ? @mysqli_num_rows($this->_queryID) : -1;
        +		$this->_numOfFields = @mysqli_num_fields($this->_queryID);
        +	}
        +	
        +/*
        +1      = MYSQLI_NOT_NULL_FLAG
        +2      = MYSQLI_PRI_KEY_FLAG
        +4      = MYSQLI_UNIQUE_KEY_FLAG
        +8      = MYSQLI_MULTIPLE_KEY_FLAG
        +16     = MYSQLI_BLOB_FLAG
        +32     = MYSQLI_UNSIGNED_FLAG
        +64     = MYSQLI_ZEROFILL_FLAG
        +128    = MYSQLI_BINARY_FLAG
        +256    = MYSQLI_ENUM_FLAG
        +512    = MYSQLI_AUTO_INCREMENT_FLAG
        +1024   = MYSQLI_TIMESTAMP_FLAG
        +2048   = MYSQLI_SET_FLAG
        +32768  = MYSQLI_NUM_FLAG
        +16384  = MYSQLI_PART_KEY_FLAG
        +32768  = MYSQLI_GROUP_FLAG
        +65536  = MYSQLI_UNIQUE_FLAG
        +131072 = MYSQLI_BINCMP_FLAG
        +*/
        +
        +	function FetchField($fieldOffset = -1) 
        +	{	
        +		$fieldnr = $fieldOffset;
        +		if ($fieldOffset != -1) {
        +		  $fieldOffset = @mysqli_field_seek($this->_queryID, $fieldnr);
        +		}
        +		$o = @mysqli_fetch_field($this->_queryID);
        +		if (!$o) return false;
        +		/* Properties of an ADOFieldObject as set by MetaColumns */
        +		$o->primary_key = $o->flags & MYSQLI_PRI_KEY_FLAG;
        +		$o->not_null = $o->flags & MYSQLI_NOT_NULL_FLAG;
        +		$o->auto_increment = $o->flags & MYSQLI_AUTO_INCREMENT_FLAG;
        +		$o->binary = $o->flags & MYSQLI_BINARY_FLAG;
        +		// $o->blob = $o->flags & MYSQLI_BLOB_FLAG; /* not returned by MetaColumns */
        +		$o->unsigned = $o->flags & MYSQLI_UNSIGNED_FLAG;
        +
        +		return $o;
        +	}
        +
        +	function GetRowAssoc($upper = true)
        +	{
        +		if ($this->fetchMode == MYSQLI_ASSOC && !$upper) 
        +		  return $this->fields;
        +		$row = ADORecordSet::GetRowAssoc($upper);
        +		return $row;
        +	}
        +	
        +	/* Use associative array to get fields array */
        +	function Fields($colname)
        +	{	
        +	  if ($this->fetchMode != MYSQLI_NUM) 
        +	    return @$this->fields[$colname];
        +		
        +	  if (!$this->bind) {
        +	    $this->bind = array();
        +	    for ($i = 0; $i < $this->_numOfFields; $i++) {
        +	      $o = $this->FetchField($i);
        +	      $this->bind[strtoupper($o->name)] = $i;
        +	    }
        +	  }
        +	  return $this->fields[$this->bind[strtoupper($colname)]];
        +	}
        +	
        +	function _seek($row)
        +	{
        +	  if ($this->_numOfRows == 0) 
        +	    return false;
        +
        +	  if ($row < 0)
        +	    return false;
        +
        +	  mysqli_data_seek($this->_queryID, $row);
        +	  $this->EOF = false;
        +	  return true;
        +	}
        +		
        +		
        +	function NextRecordSet()
        +	{
        +	global $ADODB_COUNTRECS;
        +	
        +		mysqli_free_result($this->_queryID);
        +		$this->_queryID = -1;
        +		// Move to the next recordset, or return false if there is none. In a stored proc
        +		// call, mysqli_next_result returns true for the last "recordset", but mysqli_store_result
        +		// returns false. I think this is because the last "recordset" is actually just the
        +		// return value of the stored proc (ie the number of rows affected).
        +		if(!mysqli_next_result($this->connection->_connectionID)) {
        +		return false;
        +		}
        +		// CD: There is no $this->_connectionID variable, at least in the ADO version I'm using
        +		$this->_queryID = ($ADODB_COUNTRECS) ? @mysqli_store_result( $this->connection->_connectionID )
        +						: @mysqli_use_result( $this->connection->_connectionID );
        +		if(!$this->_queryID) {
        +			return false;
        +		}
        +		$this->_inited = false;
        +		$this->bind = false;
        +		$this->_currentRow = -1;
        +		$this->Init();
        +		return true;
        +	}
        +
        +	// 10% speedup to move MoveNext to child class
        +	// This is the only implementation that works now (23-10-2003).
        +	// Other functions return no or the wrong results.
        +	function MoveNext() 
        +	{
        +		if ($this->EOF) return false;
        +		$this->_currentRow++;
        +		$this->fields = @mysqli_fetch_array($this->_queryID,$this->fetchMode);
        +		
        +		if (is_array($this->fields)) return true;
        +		$this->EOF = true;
        +		return false;
        +	}	
        +	
        +	function _fetch()
        +	{
        +		$this->fields = mysqli_fetch_array($this->_queryID,$this->fetchMode);  
        +	  	return is_array($this->fields);
        +	}
        +	
        +	function _close() 
        +	{
        +		mysqli_free_result($this->_queryID); 
        +	  	$this->_queryID = false;	
        +	}
        +	
        +/*
        +
        +0 = MYSQLI_TYPE_DECIMAL
        +1 = MYSQLI_TYPE_CHAR
        +1 = MYSQLI_TYPE_TINY
        +2 = MYSQLI_TYPE_SHORT
        +3 = MYSQLI_TYPE_LONG
        +4 = MYSQLI_TYPE_FLOAT
        +5 = MYSQLI_TYPE_DOUBLE
        +6 = MYSQLI_TYPE_NULL
        +7 = MYSQLI_TYPE_TIMESTAMP
        +8 = MYSQLI_TYPE_LONGLONG
        +9 = MYSQLI_TYPE_INT24
        +10 = MYSQLI_TYPE_DATE
        +11 = MYSQLI_TYPE_TIME
        +12 = MYSQLI_TYPE_DATETIME
        +13 = MYSQLI_TYPE_YEAR
        +14 = MYSQLI_TYPE_NEWDATE
        +247 = MYSQLI_TYPE_ENUM
        +248 = MYSQLI_TYPE_SET
        +249 = MYSQLI_TYPE_TINY_BLOB
        +250 = MYSQLI_TYPE_MEDIUM_BLOB
        +251 = MYSQLI_TYPE_LONG_BLOB
        +252 = MYSQLI_TYPE_BLOB
        +253 = MYSQLI_TYPE_VAR_STRING
        +254 = MYSQLI_TYPE_STRING
        +255 = MYSQLI_TYPE_GEOMETRY
        +*/
        +
        +	function MetaType($t, $len = -1, $fieldobj = false)
        +	{
        +		if (is_object($t)) {
        +		    $fieldobj = $t;
        +		    $t = $fieldobj->type;
        +		    $len = $fieldobj->max_length;
        +		}
        +		
        +		
        +		 $len = -1; // mysql max_length is not accurate
        +		 switch (strtoupper($t)) {
        +		 case 'STRING': 
        +		 case 'CHAR':
        +		 case 'VARCHAR': 
        +		 case 'TINYBLOB': 
        +		 case 'TINYTEXT': 
        +		 case 'ENUM': 
        +		 case 'SET': 
        +		
        +		case MYSQLI_TYPE_TINY_BLOB :
        +		#case MYSQLI_TYPE_CHAR :
        +		case MYSQLI_TYPE_STRING :
        +		case MYSQLI_TYPE_ENUM :
        +		case MYSQLI_TYPE_SET :
        +		case 253 :
        +		   if ($len <= $this->blobSize) return 'C';
        +		   
        +		case 'TEXT':
        +		case 'LONGTEXT': 
        +		case 'MEDIUMTEXT':
        +		   return 'X';
        +		
        +		
        +		   // php_mysql extension always returns 'blob' even if 'text'
        +		   // so we have to check whether binary...
        +		case 'IMAGE':
        +		case 'LONGBLOB': 
        +		case 'BLOB':
        +		case 'MEDIUMBLOB':
        +		
        +		case MYSQLI_TYPE_BLOB :
        +		case MYSQLI_TYPE_LONG_BLOB :
        +		case MYSQLI_TYPE_MEDIUM_BLOB :
        +		
        +		   return !empty($fieldobj->binary) ? 'B' : 'X';
        +		case 'YEAR':
        +		case 'DATE': 
        +		case MYSQLI_TYPE_DATE :
        +		case MYSQLI_TYPE_YEAR :
        +		
        +		   return 'D';
        +		
        +		case 'TIME':
        +		case 'DATETIME':
        +		case 'TIMESTAMP':
        +		
        +		case MYSQLI_TYPE_DATETIME :
        +		case MYSQLI_TYPE_NEWDATE :
        +		case MYSQLI_TYPE_TIME :
        +		case MYSQLI_TYPE_TIMESTAMP :
        +		
        +			return 'T';
        +		
        +		case 'INT': 
        +		case 'INTEGER':
        +		case 'BIGINT':
        +		case 'TINYINT':
        +		case 'MEDIUMINT':
        +		case 'SMALLINT': 
        +		
        +		case MYSQLI_TYPE_INT24 :
        +		case MYSQLI_TYPE_LONG :
        +		case MYSQLI_TYPE_LONGLONG :
        +		case MYSQLI_TYPE_SHORT :
        +		case MYSQLI_TYPE_TINY :
        +		
        +		   if (!empty($fieldobj->primary_key)) return 'R';
        +		   
        +		   return 'I';
        +		
        +		
        +		   // Added floating-point types
        +		   // Maybe not necessery.
        +		 case 'FLOAT':
        +		 case 'DOUBLE':
        +		   //		case 'DOUBLE PRECISION':
        +		 case 'DECIMAL':
        +		 case 'DEC':
        +		 case 'FIXED':
        +		 default:
        +		 	//if (!is_numeric($t)) echo "

        --- Error in type matching $t -----

        "; + return 'N'; + } + } // function + + +} // rs class + +} + +class ADORecordSet_array_mysqli extends ADORecordSet_array { + + function ADORecordSet_array_mysqli($id=-1,$mode=false) + { + $this->ADORecordSet_array($id,$mode); + } + + function MetaType($t, $len = -1, $fieldobj = false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + + case MYSQLI_TYPE_TINY_BLOB : + #case MYSQLI_TYPE_CHAR : + case MYSQLI_TYPE_STRING : + case MYSQLI_TYPE_ENUM : + case MYSQLI_TYPE_SET : + case 253 : + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + + case MYSQLI_TYPE_BLOB : + case MYSQLI_TYPE_LONG_BLOB : + case MYSQLI_TYPE_MEDIUM_BLOB : + + return !empty($fieldobj->binary) ? 'B' : 'X'; + case 'YEAR': + case 'DATE': + case MYSQLI_TYPE_DATE : + case MYSQLI_TYPE_YEAR : + + return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + + case MYSQLI_TYPE_DATETIME : + case MYSQLI_TYPE_NEWDATE : + case MYSQLI_TYPE_TIME : + case MYSQLI_TYPE_TIMESTAMP : + + return 'T'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'TINYINT': + case 'MEDIUMINT': + case 'SMALLINT': + + case MYSQLI_TYPE_INT24 : + case MYSQLI_TYPE_LONG : + case MYSQLI_TYPE_LONGLONG : + case MYSQLI_TYPE_SHORT : + case MYSQLI_TYPE_TINY : + + if (!empty($fieldobj->primary_key)) return 'R'; + + return 'I'; + + + // Added floating-point types + // Maybe not necessery. + case 'FLOAT': + case 'DOUBLE': + // case 'DOUBLE PRECISION': + case 'DECIMAL': + case 'DEC': + case 'FIXED': + default: + //if (!is_numeric($t)) echo "

        --- Error in type matching $t -----

        "; + return 'N'; + } + } // function + +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-mysqlpo.inc.php b/fannie/adodb5/drivers/adodb-mysqlpo.inc.php new file mode 100644 index 000000000..811510b02 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-mysqlpo.inc.php @@ -0,0 +1,138 @@ + + + Requires mysql client. Works on Windows and Unix. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php"); + + +class ADODB_mysqlt extends ADODB_mysql { + var $databaseType = 'mysqlt'; + var $ansiOuter = true; // for Version 3.23.17 or later + var $hasTransactions = true; + var $autoRollback = true; // apparently mysql does not autorollback properly + + function ADODB_mysqlt() + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_'; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->Execute('SET AUTOCOMMIT=0'); + $this->Execute('BEGIN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('COMMIT'); + $this->Execute('SET AUTOCOMMIT=1'); + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('ROLLBACK'); + $this->Execute('SET AUTOCOMMIT=1'); + return true; + } + + function RowLock($tables,$where='',$flds='1 as adodb_ignore') + { + if ($this->transCnt==0) $this->BeginTrans(); + if ($where) $where = ' where '.$where; + $rs = $this->Execute("select $flds from $tables $where for update"); + return !empty($rs); + } + +} + +class ADORecordSet_mysqlt extends ADORecordSet_mysql{ + var $databaseType = "mysqlt"; + + function ADORecordSet_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = MYSQL_BOTH; break; + } + + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } +} + +class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt { + + function ADORecordSet_ext_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + return adodb_movenext($this); + } +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-mysqlt.inc.php b/fannie/adodb5/drivers/adodb-mysqlt.inc.php new file mode 100644 index 000000000..47b52a779 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-mysqlt.inc.php @@ -0,0 +1,155 @@ + + + Requires mysql client. Works on Windows and Unix. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php"); + + +class ADODB_mysqlt extends ADODB_mysql { + var $databaseType = 'mysqlt'; + var $ansiOuter = true; // for Version 3.23.17 or later + var $hasTransactions = true; + var $autoRollback = true; // apparently mysql does not autorollback properly + + function ADODB_mysqlt() + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_'; + } + + /* set transaction mode + + SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL +{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } + + */ + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->Execute('SET AUTOCOMMIT=0'); + $this->Execute('BEGIN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('COMMIT'); + $this->Execute('SET AUTOCOMMIT=1'); + return $ok ? true : false; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('ROLLBACK'); + $this->Execute('SET AUTOCOMMIT=1'); + return $ok ? true : false; + } + + function RowLock($tables,$where='',$flds='1 as adodb_ignore') + { + if ($this->transCnt==0) $this->BeginTrans(); + if ($where) $where = ' where '.$where; + $rs = $this->Execute("select $flds from $tables $where for update"); + return !empty($rs); + } + +} + +class ADORecordSet_mysqlt extends ADORecordSet_mysql{ + var $databaseType = "mysqlt"; + + function ADORecordSet_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = MYSQL_BOTH; break; + } + + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } +} + +class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt { + + function ADORecordSet_ext_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + return adodb_movenext($this); + } +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-netezza.inc.php b/fannie/adodb5/drivers/adodb-netezza.inc.php new file mode 100644 index 000000000..72e72f40b --- /dev/null +++ b/fannie/adodb5/drivers/adodb-netezza.inc.php @@ -0,0 +1,170 @@ + 0 ORDER BY attnum"; + var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum"; + // netezza doesn't have keys. it does have distributions, so maybe this is + // something that can be pulled from the system tables + var $metaKeySQL = ""; + var $hasAffectedRows = true; + var $hasLimit = true; + var $true = 't'; // string that represents TRUE for a database + var $false = 'f'; // string that represents FALSE for a database + var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt. + var $ansiOuter = true; + var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4 + // http://bugs.php.net/bug.php?id=25404 + + + function ADODB_netezza() + { + + } + + function MetaColumns($table,$upper=true) + { + + // Changed this function to support Netezza which has no concept of keys + // could posisbly work on other things from the system table later. + + global $ADODB_FETCH_MODE; + + $table = strtolower($table); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) return false; + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + + // since we're returning type and length as one string, + // split them out here. + + if ($first = strstr($rs->fields[1], "(")) { + $fld->max_length = trim($first, "()"); + } else { + $fld->max_length = -1; + } + + if ($first = strpos($rs->fields[1], "(")) { + $fld->type = substr($rs->fields[1], 0, $first); + } else { + $fld->type = $rs->fields[1]; + } + + switch ($fld->type) { + case "byteint": + case "boolean": + $fld->max_length = 1; + break; + case "smallint": + $fld->max_length = 2; + break; + case "integer": + case "numeric": + case "date": + $fld->max_length = 4; + break; + case "bigint": + case "time": + case "timestamp": + $fld->max_length = 8; + break; + case "timetz": + case "time with time zone": + $fld->max_length = 12; + break; + } + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_netezza extends ADORecordSet_postgres64 +{ + var $databaseType = "netezza"; + var $canSeek = true; + + function ADORecordSet_netezza($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = PGSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + // _initrs modified to disable blob handling + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($this->_queryID):-1; + $this->_numOfFields = @pg_numfields($this->_queryID); + } + +} +?> diff --git a/fannie/adodb5/drivers/adodb-oci8.inc.php b/fannie/adodb5/drivers/adodb-oci8.inc.php new file mode 100644 index 000000000..95fa799bf --- /dev/null +++ b/fannie/adodb5/drivers/adodb-oci8.inc.php @@ -0,0 +1,1616 @@ + + + 13 Nov 2000 jlim - removed all ora_* references. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* +NLS_Date_Format +Allows you to use a date format other than the Oracle Lite default. When a literal +character string appears where a date value is expected, the Oracle Lite database +tests the string to see if it matches the formats of Oracle, SQL-92, or the value +specified for this parameter in the POLITE.INI file. Setting this parameter also +defines the default format used in the TO_CHAR or TO_DATE functions when no +other format string is supplied. + +For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is +yy-mm-dd or yyyy-mm-dd. + +Using 'RR' in the format forces two-digit years less than or equal to 49 to be +interpreted as years in the 21st century (2000–2049), and years over 50 as years in +the 20th century (1950–1999). Setting the RR format as the default for all two-digit +year entries allows you to become year-2000 compliant. For example: +NLS_DATE_FORMAT='RR-MM-DD' + +You can also modify the date format using the ALTER SESSION command. +*/ + +# define the LOB descriptor type for the given type +# returns false if no LOB descriptor +function oci_lob_desc($type) { + switch ($type) { + case OCI_B_BFILE: $result = OCI_D_FILE; break; + case OCI_B_CFILEE: $result = OCI_D_FILE; break; + case OCI_B_CLOB: $result = OCI_D_LOB; break; + case OCI_B_BLOB: $result = OCI_D_LOB; break; + case OCI_B_ROWID: $result = OCI_D_ROWID; break; + default: $result = false; break; + } + return $result; +} + +class ADODB_oci8 extends ADOConnection { + var $databaseType = 'oci8'; + var $dataProvider = 'oci8'; + var $replaceQuote = "''"; // string to use to replace quotes + var $concat_operator='||'; + var $sysDate = "TRUNC(SYSDATE)"; + var $sysTimeStamp = 'SYSDATE'; // requires oracle 9 or later, otherwise use SYSDATE + var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1"; + var $_stmt; + var $_commit = OCI_COMMIT_ON_SUCCESS; + var $_initdate = true; // init date to YYYY-MM-DD + var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW') and table_name not like 'BIN\$%'"; // bin$ tables are recycle bin tables + var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net + var $_bindInputArray = true; + var $hasGenID = true; + var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL"; + var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $hasAffectedRows = true; + var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)"; + var $noNullStrings = false; + var $connectSID = false; + var $_bind = false; + var $_nestedSQL = true; + var $_hasOCIFetchStatement = false; + var $_getarray = false; // currently not working + var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER + var $session_sharing_force_blob = false; // alter session on updateblob if set to true + var $firstrows = true; // enable first rows optimization on SelectLimit() + var $selectOffsetAlg1 = 1000; // when to use 1st algorithm of selectlimit. + var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS' + var $dateformat = 'YYYY-MM-DD'; // DBDate format + var $useDBDateFormatForTextInput=false; + var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true) + var $_refLOBs = array(); + + // var $ansiOuter = true; // if oracle9 + + function ADODB_oci8() + { + $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; + if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_'; + } + + /* function MetaColumns($table, $normalize=true) added by smondino@users.sourceforge.net*/ + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!$rs) { + return $false; + } + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + $fld->scale = $rs->fields[3]; + if ($rs->fields[1] == 'NUMBER') { + if ($rs->fields[3] == 0) $fld->type = 'INT'; + $fld->max_length = $rs->fields[4]; + } + $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); + $fld->binary = (strpos($fld->type,'BLOB') !== false); + $fld->default_value = $rs->fields[6]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) + return $false; + else + return $retarr; + } + + function Time() + { + $rs = $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual"); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + +/* + + Multiple modes of connection are supported: + + a. Local Database + $conn->Connect(false,'scott','tiger'); + + b. From tnsnames.ora + $conn->Connect(false,'scott','tiger',$tnsname); + $conn->Connect($tnsname,'scott','tiger'); + + c. Server + service name + $conn->Connect($serveraddress,'scott,'tiger',$service_name); + + d. Server + SID + $conn->connectSID = true; + $conn->Connect($serveraddress,'scott,'tiger',$SID); + + +Example TNSName: +--------------- +NATSOFT.DOMAIN = + (DESCRIPTION = + (ADDRESS_LIST = + (ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523)) + ) + (CONNECT_DATA = + (SERVICE_NAME = natsoft.domain) + ) + ) + + There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection + +*/ + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0) + { + if (!function_exists('OCIPLogon')) return null; + #adodb_backtrace(); + + $this->_errorMsg = false; + $this->_errorCode = false; + + if($argHostname) { // added by Jorma Tuomainen + if (empty($argDatabasename)) $argDatabasename = $argHostname; + else { + if(strpos($argHostname,":")) { + $argHostinfo=explode(":",$argHostname); + $argHostname=$argHostinfo[0]; + $argHostport=$argHostinfo[1]; + } else { + $argHostport = empty($this->port)? "1521" : $this->port; + } + + if (strncasecmp($argDatabasename,'SID=',4) == 0) { + $argDatabasename = substr($argDatabasename,4); + $this->connectSID = true; + } + + if ($this->connectSID) { + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; + } else + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; + } + } + + //if ($argHostname) print "

        Connect: 1st argument should be left blank for $this->databaseType

        "; + if ($mode==1) { + $this->_connectionID = ($this->charSet) ? + OCIPLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) + : + OCIPLogon($argUsername,$argPassword, $argDatabasename) + ; + if ($this->_connectionID && $this->autoRollback) OCIrollback($this->_connectionID); + } else if ($mode==2) { + $this->_connectionID = ($this->charSet) ? + OCINLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) + : + OCINLogon($argUsername,$argPassword, $argDatabasename); + + } else { + $this->_connectionID = ($this->charSet) ? + OCILogon($argUsername,$argPassword, $argDatabasename,$this->charSet) + : + OCILogon($argUsername,$argPassword, $argDatabasename); + } + if (!$this->_connectionID) return false; + if ($this->_initdate) { + $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); + } + + // looks like: + // Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production + // $vers = OCIServerVersion($this->_connectionID); + // if (strpos($vers,'8i') !== false) $this->ansiOuter = true; + return true; + } + + function ServerInfo() + { + $arr['compat'] = $this->GetOne('select value from sys.database_compatible_level'); + $arr['description'] = @OCIServerVersion($this->_connectionID); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1); + } + + // returns true or false + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,2); + } + + function _affectedrows() + { + if (is_resource($this->_stmt)) return @OCIRowCount($this->_stmt); + return 0; + } + + function IfNull( $field, $ifNull ) + { + return " NVL($field, $ifNull) "; // if Oracle + } + + // format and return date string in database date format + function DBDate($d,$isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return 'TO_DATE('.$d.",'".$this->dateformat."')"; + + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + + if (is_object($d)) $ds = $d->format($this->fmtDate); + else $ds = adodb_date($this->fmtDate,$d); + + return "TO_DATE(".$ds.",'".$this->dateformat."')"; + } + + function BindDate($d) + { + $d = ADOConnection::DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($ts) + { + if (empty($ts) && $ts !== 0) return 'null'; + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + + if (is_object($ts)) $tss = $ts->format("'Y-m-d H:i:s'"); + else $tss = adodb_date("'Y-m-d H:i:s'",$ts); + + return $tss; + } + + // format and return date string in database timestamp format + function DBTimeStamp($ts,$isfld=false) + { + if (empty($ts) && $ts !== 0) return 'null'; + if ($isfld) return 'TO_DATE(substr('.$ts.",1,19),'RRRR-MM-DD, HH24:MI:SS')"; + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + + if (is_object($ts)) $tss = $ts->format("'Y-m-d H:i:s'"); + else $tss = adodb_date("'Y-m-d H:i:s'",$ts); + + return 'TO_DATE('.$tss.",'RRRR-MM-DD, HH24:MI:SS')"; + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if ($this->autoCommit) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtoupper($mask)); + $this->metaTablesSQL .= " AND upper(table_name) like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + // Mark Newnham + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + // get index details + $table = strtoupper($table); + + // get Primary index + $primary_key = ''; + + $false = false; + $rs = $this->Execute(sprintf("SELECT * FROM ALL_CONSTRAINTS WHERE UPPER(TABLE_NAME)='%s' AND CONSTRAINT_TYPE='P'",$table)); + if ($row = $rs->FetchRow()) + $primary_key = $row[1]; //constraint_name + + if ($primary==TRUE && $primary_key=='') { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; //There is no primary key + } + + $rs = $this->Execute(sprintf("SELECT ALL_INDEXES.INDEX_NAME, ALL_INDEXES.UNIQUENESS, ALL_IND_COLUMNS.COLUMN_POSITION, ALL_IND_COLUMNS.COLUMN_NAME FROM ALL_INDEXES,ALL_IND_COLUMNS WHERE UPPER(ALL_INDEXES.TABLE_NAME)='%s' AND ALL_IND_COLUMNS.INDEX_NAME=ALL_INDEXES.INDEX_NAME",$table)); + + + if (!is_object($rs)) { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; + } + + $indexes = array (); + // parse index data into array + + while ($row = $rs->FetchRow()) { + if ($primary && $row[0] != $primary_key) continue; + if (!isset($indexes[$row[0]])) { + $indexes[$row[0]] = array( + 'unique' => ($row[1] == 'UNIQUE'), + 'columns' => array() + ); + } + $indexes[$row[0]]['columns'][$row[2] - 1] = $row[3]; + } + + // sort columns by order in the index + foreach ( array_keys ($indexes) as $index ) { + ksort ($indexes[$index]['columns']); + } + + if (isset($savem)) { + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + } + return $indexes; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + $this->_commit = OCI_DEFAULT; + + if ($this->_transmode) $ok = $this->Execute("SET TRANSACTION ".$this->_transmode); + else $ok = true; + + return $ok ? true : false; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $ret = OCIcommit($this->_connectionID); + $this->_commit = OCI_COMMIT_ON_SUCCESS; + $this->autoCommit = true; + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ret = OCIrollback($this->_connectionID); + $this->_commit = OCI_COMMIT_ON_SUCCESS; + $this->autoCommit = true; + return $ret; + } + + + function SelectDB($dbName) + { + return false; + } + + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + + if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); + if (empty($arr)) { + if (is_resource($this->_connectionID)) $arr = @OCIError($this->_connectionID); + else $arr = @OCIError(); + if ($arr === false) return ''; + } + $this->_errorMsg = $arr['message']; + $this->_errorCode = $arr['code']; + return $this->_errorMsg; + } + + function ErrorNo() + { + if ($this->_errorCode !== false) return $this->_errorCode; + + if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); + if (empty($arr)) { + $arr = @OCIError($this->_connectionID); + if ($arr == false) $arr = @OCIError(); + if ($arr == false) return ''; + } + + $this->_errorMsg = $arr['message']; + $this->_errorCode = $arr['code']; + + return $arr['code']; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'TO_CHAR('.$col.",'"; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= 'YYYY'; + break; + case 'Q': + case 'q': + $s .= 'Q'; + break; + + case 'M': + $s .= 'Mon'; + break; + + case 'm': + $s .= 'MM'; + break; + case 'D': + case 'd': + $s .= 'DD'; + break; + + case 'H': + $s.= 'HH24'; + break; + + case 'h': + $s .= 'HH'; + break; + + case 'i': + $s .= 'MI'; + break; + + case 's': + $s .= 'SS'; + break; + + case 'a': + case 'A': + $s .= 'AM'; + break; + + case 'w': + $s .= 'D'; + break; + + case 'l': + $s .= 'DAY'; + break; + + case 'W': + $s .= 'WW'; + break; + + default: + // handle escape characters... + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; + else $s .= '"'.$ch.'"'; + + } + } + return $s. "')"; + } + + function GetRandRow($sql, $arr = false) + { + $sql = "SELECT * FROM ($sql ORDER BY dbms_random.value) WHERE rownum = 1"; + + return $this->GetRow($sql,$arr); + } + + /* + This algorithm makes use of + + a. FIRST_ROWS hint + The FIRST_ROWS hint explicitly chooses the approach to optimize response time, + that is, minimum resource usage to return the first row. Results will be returned + as soon as they are identified. + + b. Uses rownum tricks to obtain only the required rows from a given offset. + As this uses complicated sql statements, we only use this if the $offset >= 100. + This idea by Tomas V V Cox. + + This implementation does not appear to work with oracle 8.0.5 or earlier. Comment + out this function then, and the slower SelectLimit() in the base class will be used. + */ + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + // seems that oracle only supports 1 hint comment in 8i + if ($this->firstrows) { + if (strpos($sql,'/*+') !== false) + $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); + else + $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); + } + + if ($offset == -1 || ($offset < $this->selectOffsetAlg1 && 0 < $nrows && $nrows < 1000)) { + if ($nrows > 0) { + if ($offset > 0) $nrows += $offset; + //$inputarr['adodb_rownum'] = $nrows; + if ($this->databaseType == 'oci8po') { + $sql = "select * from (".$sql.") where rownum <= ?"; + } else { + $sql = "select * from (".$sql.") where rownum <= :adodb_offset"; + } + $inputarr['adodb_offset'] = $nrows; + $nrows = -1; + } + // note that $nrows = 0 still has to work ==> no rows returned + + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $rs; + + } else { + // Algorithm by Tomas V V Cox, from PEAR DB oci8.php + + // Let Oracle return the name of the columns + $q_fields = "SELECT * FROM (".$sql.") WHERE NULL = NULL"; + + $false = false; + if (! $stmt_arr = $this->Prepare($q_fields)) { + return $false; + } + $stmt = $stmt_arr[1]; + + if (is_array($inputarr)) { + foreach($inputarr as $k => $v) { + if (is_array($v)) { + if (sizeof($v) == 2) // suggested by g.giunta@libero. + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); + else + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); + } else { + $len = -1; + if ($v === ' ') $len = 1; + if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again + $bindarr[$k] = $v; + } else { // dynamic sql, so rebind every time + OCIBindByName($stmt,":$k",$inputarr[$k],$len); + + } + } + } + } + + if (!OCIExecute($stmt, OCI_DEFAULT)) { + OCIFreeStatement($stmt); + return $false; + } + + $ncols = OCINumCols($stmt); + for ( $i = 1; $i <= $ncols; $i++ ) { + $cols[] = '"'.OCIColumnName($stmt, $i).'"'; + } + $result = false; + + OCIFreeStatement($stmt); + $fields = implode(',', $cols); + if ($nrows <= 0) $nrows = 999999999999; + else $nrows += $offset; + $offset += 1; // in Oracle rownum starts at 1 + + if ($this->databaseType == 'oci8po') { + $sql = "SELECT /*+ FIRST_ROWS */ $fields FROM". + "(SELECT rownum as adodb_rownum, $fields FROM". + " ($sql) WHERE rownum <= ?". + ") WHERE adodb_rownum >= ?"; + } else { + $sql = "SELECT /*+ FIRST_ROWS */ $fields FROM". + "(SELECT rownum as adodb_rownum, $fields FROM". + " ($sql) WHERE rownum <= :adodb_nrows". + ") WHERE adodb_rownum >= :adodb_offset"; + } + $inputarr['adodb_nrows'] = $nrows; + $inputarr['adodb_offset'] = $offset; + + if ($secs2cache>0) $rs = $this->CacheExecute($secs2cache, $sql,$inputarr); + else $rs = $this->Execute($sql,$inputarr); + return $rs; + } + + } + + /** + * Usage: + * Store BLOBs and CLOBs + * + * Example: to store $var in a blob + * + * $conn->Execute('insert into TABLE (id,ablob) values(12,empty_blob())'); + * $conn->UpdateBlob('TABLE', 'ablob', $varHoldingBlob, 'ID=12', 'BLOB'); + * + * $blobtype supports 'BLOB' and 'CLOB', but you need to change to 'empty_clob()'. + * + * to get length of LOB: + * select DBMS_LOB.GETLENGTH(ablob) from TABLE + * + * If you are using CURSOR_SHARING = force, it appears this will case a segfault + * under oracle 8.1.7.0. Run: + * $db->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); + * before UpdateBlob() then... + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + //if (strlen($val) < 4000) return $this->Execute("UPDATE $table SET $column=:blob WHERE $where",array('blob'=>$val)) != false; + + switch(strtoupper($blobtype)) { + default: ADOConnection::outp("UpdateBlob: Unknown blobtype=$blobtype"); return false; + case 'BLOB': $type = OCI_B_BLOB; break; + case 'CLOB': $type = OCI_B_CLOB; break; + } + + if ($this->databaseType == 'oci8po') + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; + else + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; + + $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); + $arr['blob'] = array($desc,-1,$type); + if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); + $commit = $this->autoCommit; + if ($commit) $this->BeginTrans(); + $rs = $this->_Execute($sql,$arr); + if ($rez = !empty($rs)) $desc->save($val); + $desc->free(); + if ($commit) $this->CommitTrans(); + if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=FORCE'); + + if ($rez) $rs->Close(); + return $rez; + } + + /** + * Usage: store file pointed to by $val in a blob + */ + function UpdateBlobFile($table,$column,$val,$where,$blobtype='BLOB') + { + switch(strtoupper($blobtype)) { + default: ADOConnection::outp( "UpdateBlob: Unknown blobtype=$blobtype"); return false; + case 'BLOB': $type = OCI_B_BLOB; break; + case 'CLOB': $type = OCI_B_CLOB; break; + } + + if ($this->databaseType == 'oci8po') + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; + else + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; + + $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); + $arr['blob'] = array($desc,-1,$type); + + $this->BeginTrans(); + $rs = ADODB_oci8::Execute($sql,$arr); + if ($rez = !empty($rs)) $desc->savefile($val); + $desc->free(); + $this->CommitTrans(); + + if ($rez) $rs->Close(); + return $rez; + } + + /** + * Execute SQL + * + * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) + * @param [inputarr] holds the input data to bind to. Null elements will be set to null. + * @return RecordSet or false + */ + function Execute($sql,$inputarr=false) + { + if ($this->fnExecute) { + $fn = $this->fnExecute; + $ret = $fn($this,$sql,$inputarr); + if (isset($ret)) return $ret; + } + if ($inputarr) { + #if (!is_array($inputarr)) $inputarr = array($inputarr); + + $element0 = reset($inputarr); + + if (!$this->_bindInputArray) { + # is_object check because oci8 descriptors can be passed in + if (is_array($element0) && !is_object(reset($element0))) { + if (is_string($sql)) + $stmt = $this->Prepare($sql); + else + $stmt = $sql; + + foreach($inputarr as $arr) { + $ret = $this->_Execute($stmt,$arr); + if (!$ret) return $ret; + } + } else { + $sqlarr = explode(':',$sql); + $sql = ''; + $lastnomatch = -2; + #var_dump($sqlarr);echo "
        ";var_dump($inputarr);echo"
        "; + foreach($sqlarr as $k => $str) { + if ($k == 0) { $sql = $str; continue; } + // we need $lastnomatch because of the following datetime, + // eg. '10:10:01', which causes code to think that there is bind param :10 and :1 + $ok = preg_match('/^([0-9]*)/', $str, $arr); + + if (!$ok) $sql .= $str; + else { + $at = $arr[1]; + if (isset($inputarr[$at]) || is_null($inputarr[$at])) { + if ((strlen($at) == strlen($str) && $k < sizeof($arr)-1)) { + $sql .= ':'.$str; + $lastnomatch = $k; + } else if ($lastnomatch == $k-1) { + $sql .= ':'.$str; + } else { + if (is_null($inputarr[$at])) $sql .= 'null'; + else $sql .= $this->qstr($inputarr[$at]); + $sql .= substr($str, strlen($at)); + } + } else { + $sql .= ':'.$str; + } + + } + } + $inputarr = false; + } + } + $ret = $this->_Execute($sql,$inputarr); + + + } else { + $ret = $this->_Execute($sql,false); + } + + return $ret; + } + + /* + Example of usage: + + $stmt = $this->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); + */ + function Prepare($sql,$cursor=false) + { + static $BINDNUM = 0; + + $stmt = OCIParse($this->_connectionID,$sql); + + if (!$stmt) { + $this->_errorMsg = false; + $this->_errorCode = false; + $arr = @OCIError($this->_connectionID); + if ($arr === false) return false; + + $this->_errorMsg = $arr['message']; + $this->_errorCode = $arr['code']; + return false; + } + + $BINDNUM += 1; + + $sttype = @OCIStatementType($stmt); + if ($sttype == 'BEGIN' || $sttype == 'DECLARE') { + return array($sql,$stmt,0,$BINDNUM, ($cursor) ? OCINewCursor($this->_connectionID) : false); + } + return array($sql,$stmt,0,$BINDNUM); + } + + /* + Call an oracle stored procedure and returns a cursor variable as a recordset. + Concept by Robert Tuttle robert@ud.com + + Example: + Note: we return a cursor variable in :RS2 + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS2); END;",'RS2'); + + $rs = $db->ExecuteCursor( + "BEGIN :RS2 = adodb.getdata(:VAR1); END;", + 'RS2', + array('VAR1' => 'Mr Bean')); + + */ + function ExecuteCursor($sql,$cursorName='rs',$params=false) + { + if (is_array($sql)) $stmt = $sql; + else $stmt = ADODB_oci8::Prepare($sql,true); # true to allocate OCINewCursor + + if (is_array($stmt) && sizeof($stmt) >= 5) { + $hasref = true; + $ignoreCur = false; + $this->Parameter($stmt, $ignoreCur, $cursorName, false, -1, OCI_B_CURSOR); + if ($params) { + foreach($params as $k => $v) { + $this->Parameter($stmt,$params[$k], $k); + } + } + } else + $hasref = false; + + $rs = $this->Execute($stmt); + if ($rs) { + if ($rs->databaseType == 'array') OCIFreeCursor($stmt[4]); + else if ($hasref) $rs->_refcursor = $stmt[4]; + } + return $rs; + } + + /* + Bind a variable -- very, very fast for executing repeated statements in oracle. + Better than using + for ($i = 0; $i < $max; $i++) { + $p1 = ?; $p2 = ?; $p3 = ?; + $this->Execute("insert into table (col0, col1, col2) values (:0, :1, :2)", + array($p1,$p2,$p3)); + } + + Usage: + $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)"); + $DB->Bind($stmt, $p1); + $DB->Bind($stmt, $p2); + $DB->Bind($stmt, $p3); + for ($i = 0; $i < $max; $i++) { + $p1 = ?; $p2 = ?; $p3 = ?; + $DB->Execute($stmt); + } + + Some timings: + ** Test table has 3 cols, and 1 index. Test to insert 1000 records + Time 0.6081s (1644.60 inserts/sec) with direct OCIParse/OCIExecute + Time 0.6341s (1577.16 inserts/sec) with ADOdb Prepare/Bind/Execute + Time 1.5533s ( 643.77 inserts/sec) with pure SQL using Execute + + Now if PHP only had batch/bulk updating like Java or PL/SQL... + + Note that the order of parameters differs from OCIBindByName, + because we default the names to :0, :1, :2 + */ + function Bind(&$stmt,&$var,$size=4000,$type=false,$name=false,$isOutput=false) + { + + if (!is_array($stmt)) return false; + + if (($type == OCI_B_CURSOR) && sizeof($stmt) >= 5) { + return OCIBindByName($stmt[1],":".$name,$stmt[4],$size,$type); + } + + if ($name == false) { + if ($type !== false) $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size,$type); + else $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size); // +1 byte for null terminator + $stmt[2] += 1; + } else if (oci_lob_desc($type)) { + if ($this->debug) { + ADOConnection::outp("Bind: name = $name"); + } + //we have to create a new Descriptor here + $numlob = count($this->_refLOBs); + $this->_refLOBs[$numlob]['LOB'] = OCINewDescriptor($this->_connectionID, oci_lob_desc($type)); + $this->_refLOBs[$numlob]['TYPE'] = $isOutput; + + $tmp = $this->_refLOBs[$numlob]['LOB']; + $rez = OCIBindByName($stmt[1], ":".$name, $tmp, -1, $type); + if ($this->debug) { + ADOConnection::outp("Bind: descriptor has been allocated, var (".$name.") binded"); + } + + // if type is input then write data to lob now + if ($isOutput == false) { + $var = $this->BlobEncode($var); + $tmp->WriteTemporary($var); + $this->_refLOBs[$numlob]['VAR'] = &$var; + if ($this->debug) { + ADOConnection::outp("Bind: LOB has been written to temp"); + } + } else { + $this->_refLOBs[$numlob]['VAR'] = $var; + } + $rez = $tmp; + } else { + if ($this->debug) + ADOConnection::outp("Bind: name = $name"); + + if ($type !== false) $rez = OCIBindByName($stmt[1],":".$name,$var,$size,$type); + else $rez = OCIBindByName($stmt[1],":".$name,$var,$size); // +1 byte for null terminator + } + + return $rez; + } + + function Param($name,$type=false) + { + return ':'.$name; + } + + /* + Usage: + $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group'); + $db->Execute($stmt); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + See OCIBindByName documentation at php.net. + */ + function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) + { + if ($this->debug) { + $prefix = ($isOutput) ? 'Out' : 'In'; + $ztype = (empty($type)) ? 'false' : $type; + ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); + } + return $this->Bind($stmt,$var,$maxLen,$type,$name,$isOutput); + } + + /* + returns query ID if successful, otherwise false + this version supports: + + 1. $db->execute('select * from table'); + + 2. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); + $db->execute($prepared_statement, array(1,2,3)); + + 3. $db->execute('insert into table (a,b,c) values (:a,:b,:c)',array('a'=>1,'b'=>2,'c'=>3)); + + 4. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); + $db->bind($stmt,1); $db->bind($stmt,2); $db->bind($stmt,3); + $db->execute($stmt); + */ + function _query($sql,$inputarr=false) + { + if (is_array($sql)) { // is prepared sql + $stmt = $sql[1]; + + // we try to bind to permanent array, so that OCIBindByName is persistent + // and carried out once only - note that max array element size is 4000 chars + if (is_array($inputarr)) { + $bindpos = $sql[3]; + if (isset($this->_bind[$bindpos])) { + // all tied up already + $bindarr = $this->_bind[$bindpos]; + } else { + // one statement to bind them all + $bindarr = array(); + foreach($inputarr as $k => $v) { + $bindarr[$k] = $v; + OCIBindByName($stmt,":$k",$bindarr[$k],is_string($v) && strlen($v)>4000 ? -1 : 4000); + } + $this->_bind[$bindpos] = $bindarr; + } + } + } else { + $stmt=OCIParse($this->_connectionID,$sql); + } + + $this->_stmt = $stmt; + if (!$stmt) return false; + + if (defined('ADODB_PREFETCH_ROWS')) @OCISetPrefetch($stmt,ADODB_PREFETCH_ROWS); + + if (is_array($inputarr)) { + foreach($inputarr as $k => $v) { + if (is_array($v)) { + if (sizeof($v) == 2) // suggested by g.giunta@libero. + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); + else + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); + + if ($this->debug==99) { + if (is_object($v[0])) + echo "name=:$k",' len='.$v[1],' type='.$v[2],'
        '; + else + echo "name=:$k",' var='.$inputarr[$k][0],' len='.$v[1],' type='.$v[2],'
        '; + + } + } else { + $len = -1; + if ($v === ' ') $len = 1; + if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again + $bindarr[$k] = $v; + } else { // dynamic sql, so rebind every time + OCIBindByName($stmt,":$k",$inputarr[$k],$len); + } + } + } + } + + $this->_errorMsg = false; + $this->_errorCode = false; + if (OCIExecute($stmt,$this->_commit)) { +//OCIInternalDebug(1); + if (count($this -> _refLOBs) > 0) { + + foreach ($this -> _refLOBs as $key => $value) { + if ($this -> _refLOBs[$key]['TYPE'] == true) { + $tmp = $this -> _refLOBs[$key]['LOB'] -> load(); + if ($this -> debug) { + ADOConnection::outp("OUT LOB: LOB has been loaded.
        "); + } + //$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp; + $this -> _refLOBs[$key]['VAR'] = $tmp; + } else { + $this->_refLOBs[$key]['LOB']->save($this->_refLOBs[$key]['VAR']); + $this -> _refLOBs[$key]['LOB']->free(); + unset($this -> _refLOBs[$key]); + if ($this->debug) { + ADOConnection::outp("IN LOB: LOB has been saved.
        "); + } + } + } + } + + switch (@OCIStatementType($stmt)) { + case "SELECT": + return $stmt; + + case 'DECLARE': + case "BEGIN": + if (is_array($sql) && !empty($sql[4])) { + $cursor = $sql[4]; + if (is_resource($cursor)) { + $ok = OCIExecute($cursor); + return $cursor; + } + return $stmt; + } else { + if (is_resource($stmt)) { + OCIFreeStatement($stmt); + return true; + } + return $stmt; + } + break; + default : + // ociclose -- no because it could be used in a LOB? + return true; + } + } + return false; + } + + // From Oracle Whitepaper: PHP Scalability and High Availability + function IsConnectionError($err) + { + switch($err) { + case 378: /* buffer pool param incorrect */ + case 602: /* core dump */ + case 603: /* fatal error */ + case 609: /* attach failed */ + case 1012: /* not logged in */ + case 1033: /* init or shutdown in progress */ + case 1043: /* Oracle not available */ + case 1089: /* immediate shutdown in progress */ + case 1090: /* shutdown in progress */ + case 1092: /* instance terminated */ + case 3113: /* disconnect */ + case 3114: /* not connected */ + case 3122: /* closing window */ + case 3135: /* lost contact */ + case 12153: /* TNS: not connected */ + case 27146: /* fatal or instance terminated */ + case 28511: /* Lost RPC */ + return true; + } + return false; + } + + // returns true or false + function _close() + { + if (!$this->_connectionID) return; + + if (!$this->autoCommit) OCIRollback($this->_connectionID); + if (count($this->_refLOBs) > 0) { + foreach ($this ->_refLOBs as $key => $value) { + $this->_refLOBs[$key]['LOB']->free(); + unset($this->_refLOBs[$key]); + } + } + OCILogoff($this->_connectionID); + + $this->_stmt = false; + $this->_connectionID = false; + } + + function MetaPrimaryKeys($table, $owner=false,$internalKey=false) + { + if ($internalKey) return array('ROWID'); + + // tested with oracle 8.1.7 + $table = strtoupper($table); + if ($owner) { + $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))"; + $ptab = 'ALL_'; + } else { + $owner_clause = ''; + $ptab = 'USER_'; + } + $sql = " +SELECT /*+ RULE */ distinct b.column_name + FROM {$ptab}CONSTRAINTS a + , {$ptab}CONS_COLUMNS b + WHERE ( UPPER(b.table_name) = ('$table')) + AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P') + $owner_clause + AND (a.constraint_name = b.constraint_name)"; + + $rs = $this->Execute($sql); + if ($rs && !$rs->EOF) { + $arr = $rs->GetArray(); + $a = array(); + foreach($arr as $v) { + $a[] = reset($v); + } + return $a; + } + else return false; + } + + // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html + function MetaForeignKeys($table, $owner=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + if (!$owner) { + $owner = $this->user; + $tabp = 'user_'; + } else + $tabp = 'all_'; + + $owner = ' and owner='.$this->qstr(strtoupper($owner)); + + $sql = +"select constraint_name,r_owner,r_constraint_name + from {$tabp}constraints + where constraint_type = 'R' and table_name = $table $owner"; + + $constraints = $this->GetArray($sql); + $arr = false; + foreach($constraints as $constr) { + $cons = $this->qstr($constr[0]); + $rowner = $this->qstr($constr[1]); + $rcons = $this->qstr($constr[2]); + $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position"); + $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position"); + + if ($cols && $tabcol) + for ($i=0, $max=sizeof($cols); $i < $max; $i++) { + $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1]; + } + } + $ADODB_FETCH_MODE = $save; + + return $arr; + } + + + function CharMax() + { + return 4000; + } + + function TextMax() + { + return 4000; + } + + /** + * Quotes a string. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + //$nofixquotes=false; + + if ($this->noNullStrings && strlen($s)==0)$s = ' '; + if (!$magic_quotes) { + if ($this->replaceQuote[0] == '\\'){ + $s = str_replace('\\','\\\\',$s); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " unless sybase is on + if (!ini_get('magic_quotes_sybase')) { + $s = str_replace('\\"','"',$s); + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } else { + return "'".$s."'"; + } + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_oci8 extends ADORecordSet { + + var $databaseType = 'oci8'; + var $bind=false; + var $_fieldobjs; + + //var $_arr = false; + + function ADORecordset_oci8($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_NUM: + default: + $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + } + + $this->adodbFetchMode = $mode; + $this->_queryID = $queryID; + } + + + function Init() + { + if ($this->_inited) return; + + $this->_inited = true; + if ($this->_queryID) { + + $this->_currentRow = 0; + @$this->_initrs(); + $this->EOF = !$this->_fetch(); + + /* + // based on idea by Gaetano Giunta to detect unusual oracle errors + // see http://phplens.com/lens/lensforum/msgs.php?id=6771 + $err = OCIError($this->_queryID); + if ($err && $this->connection->debug) ADOConnection::outp($err); + */ + + if (!is_array($this->fields)) { + $this->_numOfRows = 0; + $this->fields = array(); + } + } else { + $this->fields = array(); + $this->_numOfRows = 0; + $this->_numOfFields = 0; + $this->EOF = true; + } + } + + function _initrs() + { + $this->_numOfRows = -1; + $this->_numOfFields = OCInumcols($this->_queryID); + if ($this->_numOfFields>0) { + $this->_fieldobjs = array(); + $max = $this->_numOfFields; + for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i); + } + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function _FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fieldOffset += 1; + $fld->name =OCIcolumnname($this->_queryID, $fieldOffset); + $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); + $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); + switch($fld->type) { + case 'NUMBER': + $p = OCIColumnPrecision($this->_queryID, $fieldOffset); + $sc = OCIColumnScale($this->_queryID, $fieldOffset); + if ($p != 0 && $sc == 0) $fld->type = 'INT'; + break; + + case 'CLOB': + case 'NCLOB': + case 'BLOB': + $fld->max_length = -1; + break; + } + return $fld; + } + + /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */ + function FetchField($fieldOffset = -1) + { + return $this->_fieldobjs[$fieldOffset]; + } + + + /* + // 10% speedup to move MoveNext to child class + function _MoveNext() + { + //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this); + + if ($this->EOF) return false; + + $this->_currentRow++; + if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) + return true; + $this->EOF = true; + + return false; + } */ + + + function MoveNext() + { + if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } + + /* + # does not work as first record is retrieved in _initrs(), so is not included in GetArray() + function GetArray($nRows = -1) + { + global $ADODB_OCI8_GETARRAY; + + if (true || !empty($ADODB_OCI8_GETARRAY)) { + # does not support $ADODB_ANSI_PADDING_OFF + + //OCI_RETURN_NULLS and OCI_RETURN_LOBS is set by OCIfetchstatement + switch($this->adodbFetchMode) { + case ADODB_FETCH_NUM: + + $ncols = @OCIfetchstatement($this->_queryID, $results, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW+OCI_NUM); + $results = array_merge(array($this->fields),$results); + return $results; + + case ADODB_FETCH_ASSOC: + if (ADODB_ASSOC_CASE != 2 || $this->databaseType != 'oci8') break; + + $ncols = @OCIfetchstatement($this->_queryID, $assoc, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW); + $results = array_merge(array($this->fields),$assoc); + return $results; + + default: + break; + } + } + + $results = ADORecordSet::GetArray($nRows); + return $results; + + } */ + + /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr = $this->GetArray($nrows); + return $arr; + } + $arr = array(); + for ($i=1; $i < $offset; $i++) + if (!@OCIFetch($this->_queryID)) return $arr; + + if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return $arr;; + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + /* Use associative array to get fields array */ + function Fields($colname) + { + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + + function _seek($row) + { + return false; + } + + function _fetch() + { + return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + + function _close() + { + if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false; + if (!empty($this->_refcursor)) { + OCIFreeCursor($this->_refcursor); + $this->_refcursor = false; + } + @OCIFreeStatement($this->_queryID); + $this->_queryID = false; + + } + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'VARCHAR': + case 'VARCHAR2': + case 'CHAR': + case 'VARBINARY': + case 'BINARY': + case 'NCHAR': + case 'NVARCHAR': + case 'NVARCHAR2': + if ($len <= $this->blobSize) return 'C'; + + case 'NCLOB': + case 'LONG': + case 'LONG VARCHAR': + case 'CLOB': + return 'X'; + + case 'LONG RAW': + case 'LONG VARBINARY': + case 'BLOB': + return 'B'; + + case 'DATE': + return ($this->connection->datetime) ? 'T' : 'D'; + + + case 'TIMESTAMP': return 'T'; + + case 'INT': + case 'SMALLINT': + case 'INTEGER': + return 'I'; + + default: return 'N'; + } + } +} + +class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 { + function ADORecordSet_ext_oci8($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_NUM: + default: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + } + $this->adodbFetchMode = $mode; + $this->_queryID = $queryID; + } + + function MoveNext() + { + return adodb_movenext($this); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-oci805.inc.php b/fannie/adodb5/drivers/adodb-oci805.inc.php new file mode 100644 index 000000000..30518721e --- /dev/null +++ b/fannie/adodb5/drivers/adodb-oci805.inc.php @@ -0,0 +1,59 @@ +ADODB_oci8(); + } + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + // seems that oracle only supports 1 hint comment in 8i + if (strpos($sql,'/*+') !== false) + $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); + else + $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); + + /* + The following is only available from 8.1.5 because order by in inline views not + available before then... + http://www.jlcomp.demon.co.uk/faq/top_sql.html + if ($nrows > 0) { + if ($offset > 0) $nrows += $offset; + $sql = "select * from ($sql) where rownum <= $nrows"; + $nrows = -1; + } + */ + + return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + } +} + +class ADORecordset_oci805 extends ADORecordset_oci8 { + var $databaseType = "oci805"; + function ADORecordset_oci805($id,$mode=false) + { + $this->ADORecordset_oci8($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-oci8po.inc.php b/fannie/adodb5/drivers/adodb-oci8po.inc.php new file mode 100644 index 000000000..30f997714 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-oci8po.inc.php @@ -0,0 +1,218 @@ + + + Should some emulation of RecordCount() be implemented? + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php'); + +class ADODB_oci8po extends ADODB_oci8 { + var $databaseType = 'oci8po'; + var $dataProvider = 'oci8'; + var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net + var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')"; + + function ADODB_oci8po() + { + $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; + # oci8po does not support adodb extension: adodb_movenext() + } + + function Param($name) + { + return '?'; + } + + function Prepare($sql,$cursor=false) + { + $sqlarr = explode('?',$sql); + $sql = $sqlarr[0]; + for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { + $sql .= ':'.($i-1) . $sqlarr[$i]; + } + return ADODB_oci8::Prepare($sql,$cursor); + } + + // emulate handling of parameters ? ?, replacing with :bind0 :bind1 + function _query($sql,$inputarr=false) + { + if (is_array($inputarr)) { + $i = 0; + if (is_array($sql)) { + foreach($inputarr as $v) { + $arr['bind'.$i++] = $v; + } + } else { + $sqlarr = explode('?',$sql); + $sql = $sqlarr[0]; + foreach($inputarr as $k => $v) { + $sql .= ":$k" . $sqlarr[++$i]; + } + } + } + return ADODB_oci8::_query($sql,$inputarr); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_oci8po extends ADORecordset_oci8 { + + var $databaseType = 'oci8po'; + + function ADORecordset_oci8po($queryID,$mode=false) + { + $this->ADORecordset_oci8($queryID,$mode); + } + + function Fields($colname) + { + if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + // lowercase field names... + function _FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fieldOffset += 1; + $fld->name = OCIcolumnname($this->_queryID, $fieldOffset); + if (ADODB_ASSOC_CASE == 0) $fld->name = strtolower($fld->name); + $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); + $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); + if ($fld->type == 'NUMBER') { + //$p = OCIColumnPrecision($this->_queryID, $fieldOffset); + $sc = OCIColumnScale($this->_queryID, $fieldOffset); + if ($sc == 0) $fld->type = 'INT'; + } + return $fld; + } + /* + function MoveNext() + { + if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + }*/ + + // 10% speedup to move MoveNext to child class + function MoveNext() + { + if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + global $ADODB_ANSI_PADDING_OFF; + $this->_currentRow++; + + if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); + if (!empty($ADODB_ANSI_PADDING_OFF)) { + foreach($this->fields as $k => $v) { + if (is_string($v)) $this->fields[$k] = rtrim($v); + } + } + return true; + } + if (!$this->EOF) { + $this->EOF = true; + $this->_currentRow++; + } + return false; + } + + /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr = $this->GetArray($nrows); + return $arr; + } + for ($i=1; $i < $offset; $i++) + if (!@OCIFetch($this->_queryID)) { + $arr = array(); + return $arr; + } + if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + $arr = array(); + return $arr; + } + if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + // Create associative array + function _updatefields() + { + if (ADODB_ASSOC_CASE == 2) return; // native + + $arr = array(); + $lowercase = (ADODB_ASSOC_CASE == 0); + + foreach($this->fields as $k => $v) { + if (is_integer($k)) $arr[$k] = $v; + else { + if ($lowercase) + $arr[strtolower($k)] = $v; + else + $arr[strtoupper($k)] = $v; + } + } + $this->fields = $arr; + } + + function _fetch() + { + $ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); + if ($ret) { + global $ADODB_ANSI_PADDING_OFF; + + if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); + if (!empty($ADODB_ANSI_PADDING_OFF)) { + foreach($this->fields as $k => $v) { + if (is_string($v)) $this->fields[$k] = rtrim($v); + } + } + } + return $ret; + } + +} + + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-odbc.inc.php b/fannie/adodb5/drivers/adodb-odbc.inc.php new file mode 100644 index 000000000..e7591cd7f --- /dev/null +++ b/fannie/adodb5/drivers/adodb-odbc.inc.php @@ -0,0 +1,738 @@ +_haserrorfunctions = ADODB_PHPVER >= 0x4050; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('odbc_connect')) return null; + + if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') { + ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + if (isset($php_errormsg)) $php_errormsg = ''; + if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode); + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('odbc_connect')) return null; + + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->debug && $argDatabasename) { + ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + // print "dsn=$argDSN u=$argUsername p=$argPassword
        "; flush(); + if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode); + + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID); + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + + function ServerInfo() + { + + if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { + $dsn = strtoupper($this->host); + $first = true; + $found = false; + + if (!function_exists('odbc_data_source')) return false; + + while(true) { + + $rez = @odbc_data_source($this->_connectionID, + $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); + $first = false; + if (!is_array($rez)) break; + if (strtoupper($rez['server']) == $dsn) { + $found = true; + break; + } + } + if (!$found) return ADOConnection::ServerInfo(); + if (!isset($rez['version'])) $rez['version'] = ''; + return $rez; + } else { + return ADOConnection::ServerInfo(); + } + } + + + function CreateSequence($seqname='adodbseq',$start=1) + { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + $start -= 1; + return $this->Execute("insert into $seqname values($start)"); + } + + var $_dropSeqSQL = 'drop table %s'; + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /* + This algorithm is not very efficient, but works even if table locking + is not available. + + Will return false if unable to generate an ID after $MAXLOOPS attempts. + */ + function GenID($seq='adodbseq',$start=1) + { + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $MAXLOOPS = 100; + //$this->debug=1; + while (--$MAXLOOPS>=0) { + $num = $this->GetOne("select id from $seq"); + if ($num === false) { + $this->Execute(sprintf($this->_genSeqSQL ,$seq)); + $start -= 1; + $num = '0'; + $ok = $this->Execute("insert into $seq values($start)"); + if (!$ok) return false; + } + $this->Execute("update $seq set id=id+1 where id=$num"); + + if ($this->affected_rows() > 0) { + $num += 1; + $this->genID = $num; + return $num; + } + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + + function ErrorMsg() + { + if ($this->_haserrorfunctions) { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @odbc_errormsg(); + return @odbc_errormsg($this->_connectionID); + } else return ADOConnection::ErrorMsg(); + } + + function ErrorNo() + { + + if ($this->_haserrorfunctions) { + if ($this->_errorCode !== false) { + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; + } + + if (empty($this->_connectionID)) $e = @odbc_error(); + else $e = @odbc_error($this->_connectionID); + + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + // so we check and patch + if (strlen($e)<=2) return 0; + return $e; + } else return ADOConnection::ErrorNo(); + } + + + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + return odbc_autocommit($this->_connectionID,false); + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = odbc_commit($this->_connectionID); + odbc_autocommit($this->_connectionID,true); + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = odbc_rollback($this->_connectionID); + odbc_autocommit($this->_connectionID,true); + return $ret; + } + + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table); + + if (!$qid) { + $ADODB_FETCH_MODE = $savem; + return false; + } + $rs = new ADORecordSet_odbc($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + $rs->Close(); + //print_r($arr); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3]) $arr2[] = $arr[$i][3]; + } + return $arr2; + } + + + + function MetaTables($ttype=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = odbc_tables($this->_connectionID); + + $rs = new ADORecordSet_odbc($qid); + + $ADODB_FETCH_MODE = $savem; + if (!$rs) { + $false = false; + return $false; + } + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + //print_r($arr); + + $rs->Close(); + $arr2 = array(); + + if ($ttype) { + $isview = strncmp($ttype,'V',1) === 0; + } + for ($i=0; $i < sizeof($arr); $i++) { + if (!$arr[$i][2]) continue; + $type = $arr[$i][3]; + if ($ttype) { + if ($isview) { + if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; + } + return $arr2; + } + +/* +See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp +/ SQL data type codes / +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (ODBCVER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + + +/ One-parameter shortcuts for date/time data types / +#if (ODBCVER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 + +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +*/ + function ODBCTypes($t) + { + switch ((integer)$t) { + case 1: + case 12: + case 0: + case -95: + case -96: + return 'C'; + case -97: + case -1: //text + return 'X'; + case -4: //image + return 'B'; + + case 9: + case 91: + return 'D'; + + case 10: + case 11: + case 92: + case 93: + return 'T'; + + case 4: + case 5: + case -6: + return 'I'; + + case -11: // uniqidentifier + return 'R'; + case -7: //bit + return 'L'; + + default: + return 'N'; + } + } + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + /*if (false) { // after testing, confirmed that the following does not work becoz of a bug + $qid2 = odbc_tables($this->_connectionID); + $rs = new ADORecordSet_odbc($qid2); + $ADODB_FETCH_MODE = $savem; + if (!$rs) return false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + while (!$rs->EOF) { + if ($table == strtoupper($rs->fields[2])) { + $q = $rs->fields[0]; + $o = $rs->fields[1]; + break; + } + $rs->MoveNext(); + } + $rs->Close(); + + $qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); + } */ + + switch ($this->databaseType) { + case 'access': + case 'vfp': + $qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%'); + break; + + + case 'db2': + $colname = "%"; + $qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname); + break; + + default: + $qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%'); + if (empty($qid)) $qid = odbc_columns($this->_connectionID); + break; + } + if (empty($qid)) return $false; + + $rs = new ADORecordSet_odbc($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + $retarr = array(); + + /* + $rs->fields indices + 0 TABLE_QUALIFIER + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 DATA_TYPE + 5 TYPE_NAME + 6 PRECISION + 7 LENGTH + 8 SCALE + 9 RADIX + 10 NULLABLE + 11 REMARKS + */ + while (!$rs->EOF) { + // adodb_pr($rs->fields); + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $this->ODBCTypes($rs->fields[4]); + + // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp + // access uses precision to store length for char/varchar + if ($fld->type == 'C' or $fld->type == 'X') { + if ($this->databaseType == 'access') + $fld->max_length = $rs->fields[6]; + else if ($rs->fields[4] <= -95) // UNICODE + $fld->max_length = $rs->fields[7]/2; + else + $fld->max_length = $rs->fields[7]; + } else + $fld->max_length = $rs->fields[7]; + $fld->not_null = !empty($rs->fields[10]); + $fld->scale = $rs->fields[8]; + $retarr[strtoupper($fld->name)] = $fld; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); //-- crashes 4.03pl1 -- why? + + if (empty($retarr)) $retarr = false; + return $retarr; + } + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + $stmt = odbc_prepare($this->_connectionID,$sql); + if (!$stmt) { + // we don't know whether odbc driver is parsing prepared stmts, so just return sql + return $sql; + } + return array($sql,$stmt,false); + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + GLOBAL $php_errormsg; + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_error = ''; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = odbc_prepare($this->_connectionID,$sql); + + if ($stmtid == false) { + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + } + + if (! odbc_execute($stmtid,$inputarr)) { + //@odbc_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = odbc_errormsg(); + $this->_errorCode = odbc_error(); + } + return false; + } + + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!odbc_execute($stmtid)) { + //@odbc_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = odbc_errormsg(); + $this->_errorCode = odbc_error(); + } + return false; + } + } else + $stmtid = odbc_exec($this->_connectionID,$sql); + + $this->_lastAffectedRows = 0; + if ($stmtid) { + if (@odbc_num_fields($stmtid) == 0) { + $this->_lastAffectedRows = odbc_num_rows($stmtid); + $stmtid = true; + } else { + $this->_lastAffectedRows = 0; + odbc_binmode($stmtid,$this->binmode); + odbc_longreadlen($stmtid,$this->maxblobsize); + } + + if ($this->_haserrorfunctions) { + $this->_errorMsg = ''; + $this->_errorCode = 0; + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } else { + if ($this->_haserrorfunctions) { + $this->_errorMsg = odbc_errormsg(); + $this->_errorCode = odbc_error(); + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } + return $stmtid; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + // returns true or false + function _close() + { + $ret = @odbc_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } + + function _affectedrows() + { + return $this->_lastAffectedRows; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_odbc extends ADORecordSet { + + var $bind = false; + var $databaseType = "odbc"; + var $dataProvider = "odbc"; + var $useFetchArray; + var $_has_stupid_odbc_fetch_api_change; + + function ADORecordSet_odbc($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + + // the following is required for mysql odbc driver in 4.3.1 -- why? + $this->EOF = false; + $this->_currentRow = -1; + //$this->ADORecordSet($id); + } + + + // returns the field object + function FetchField($fieldOffset = -1) + { + + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $o->name = @odbc_field_name($this->_queryID,$off); + $o->type = @odbc_field_type($this->_queryID,$off); + $o->max_length = @odbc_field_len($this->_queryID,$off); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1; + $this->_numOfFields = @odbc_num_fields($this->_queryID); + // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 + if ($this->_numOfRows == 0) $this->_numOfRows = -1; + //$this->useFetchArray = $this->connection->useFetchArray; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + function _seek($row) + { + return false; + } + + // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $rs = $this->GetArray($nrows); + return $rs; + } + $savem = $this->fetchMode; + $this->fetchMode = ADODB_FETCH_NUM; + $this->Move($offset); + $this->fetchMode = $savem; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + function MoveNext() + { + if ($this->_numOfRows != 0 && !$this->EOF) { + $this->_currentRow++; + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @odbc_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + } + $this->fields = false; + $this->EOF = true; + return false; + } + + function _fetch() + { + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @odbc_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + $this->fields = false; + return false; + } + + function _close() + { + return @odbc_free_result($this->_queryID); + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-odbc_db2.inc.php b/fannie/adodb5/drivers/adodb-odbc_db2.inc.php new file mode 100644 index 000000000..4baca7013 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-odbc_db2.inc.php @@ -0,0 +1,368 @@ +curMode = SQL_CUR_USE_ODBC; +$db->Connect($dsn, $userid, $pwd); + + + +USING CLI INTERFACE +=================== + +I have had reports that the $host and $database params have to be reversed in +Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu: + +> The symptom is that if I change the database engine from postgres or any other to DB2 then the following +> connection command becomes wrong despite being described this version to be correct in the docs. +> +> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME ) +> +> In case of DB2 I had to swap the first and last arguments in order to connect properly. + + +System Error 5 +============== +IF you get a System Error 5 when trying to Connect/Load, it could be a permission problem. Give the user connecting +to DB2 full rights to the DB2 SQLLIB directory, and place the user in the DBUSERS group. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} +if (!defined('ADODB_ODBC_DB2')){ +define('ADODB_ODBC_DB2',1); + +class ADODB_ODBC_DB2 extends ADODB_odbc { + var $databaseType = "db2"; + var $concat_operator = '||'; + var $sysTime = 'CURRENT TIME'; + var $sysDate = 'CURRENT DATE'; + var $sysTimeStamp = 'CURRENT TIMESTAMP'; + // The complete string representation of a timestamp has the form + // yyyy-mm-dd-hh.mm.ss.nnnnnn. + var $fmtTimeStamp = "'Y-m-d-H.i.s'"; + var $ansiOuter = true; + var $identitySQL = 'values IDENTITY_VAL_LOCAL()'; + var $_bindInputArray = true; + var $hasInsertID = true; + var $rsPrefix = 'ADORecordset_odbc_'; + + function ADODB_DB2() + { + if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC; + $this->ADODB_odbc(); + } + + function IfNull( $field, $ifNull ) + { + return " COALESCE($field, $ifNull) "; // if DB2 UDB + } + + function ServerInfo() + { + //odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/); + $vers = $this->GetOne('select versionnumber from sysibm.sysversions'); + //odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/); + return array('description'=>'DB2 ODBC driver', 'version'=>$vers); + } + + function _insertid() + { + return $this->GetOne($this->identitySQL); + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if ($this->_autocommit) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + function MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%") + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, ""); + + $rs = new ADORecordSet_odbc($qid); + + $ADODB_FETCH_MODE = $savem; + if (!$rs) { + $false = false; + return $false; + } + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + //print_r($arr); + + $rs->Close(); + $arr2 = array(); + + if ($ttype) { + $isview = strncmp($ttype,'V',1) === 0; + } + for ($i=0; $i < sizeof($arr); $i++) { + + if (!$arr[$i][2]) continue; + if (strncmp($arr[$i][1],'SYS',3) === 0) continue; + + $type = $arr[$i][3]; + + if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2]; + + if ($ttype) { + if ($isview) { + if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2]; + } + return $arr2; + } + + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $false = false; + // get index details + $table = strtoupper($table); + $SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'"; + if ($primary) + $SQL.= " AND UNIQUERULE='P'"; + $rs = $this->Execute($SQL); + if (!is_object($rs)) { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; + } + $indexes = array (); + // parse index data into array + while ($row = $rs->FetchRow()) { + $indexes[$row[0]] = array( + 'unique' => ($row[1] == 'U' || $row[1] == 'P'), + 'columns' => array() + ); + $cols = ltrim($row[2],'+'); + $indexes[$row[0]]['columns'] = explode('+', $cols); + } + if (isset($savem)) { + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + } + return $indexes; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + // use right() and replace() ? + if (!$col) $col = $this->sysDate; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '||'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "char(year($col))"; + break; + case 'M': + $s .= "substr(monthname($col),1,3)"; + break; + case 'm': + $s .= "right(digits(month($col)),2)"; + break; + case 'D': + case 'd': + $s .= "right(digits(day($col)),2)"; + break; + case 'H': + case 'h': + if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; + else $s .= "''"; + break; + case 'i': + case 'I': + if ($col != $this->sysDate) + $s .= "right(digits(minute($col)),2)"; + else $s .= "''"; + break; + case 'S': + case 's': + if ($col != $this->sysDate) + $s .= "right(digits(second($col)),2)"; + else $s .= "''"; + break; + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + } + } + return $s; + } + + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false) + { + $nrows = (integer) $nrows; + if ($offset <= 0) { + // could also use " OPTIMIZE FOR $nrows ROWS " + if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY "; + $rs = $this->Execute($sql,$inputArr); + } else { + if ($offset > 0 && $nrows < 0); + else { + $nrows += $offset; + $sql .= " FETCH FIRST $nrows ROWS ONLY "; + } + $rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr); + } + + return $rs; + } + +}; + + +class ADORecordSet_odbc_db2 extends ADORecordSet_odbc { + + var $databaseType = "db2"; + + function ADORecordSet_db2($id,$mode=false) + { + $this->ADORecordSet_odbc($id,$mode); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + switch (strtoupper($t)) { + case 'VARCHAR': + case 'CHAR': + case 'CHARACTER': + case 'C': + if ($len <= $this->blobSize) return 'C'; + + case 'LONGCHAR': + case 'TEXT': + case 'CLOB': + case 'DBCLOB': // double-byte + case 'X': + return 'X'; + + case 'BLOB': + case 'GRAPHIC': + case 'VARGRAPHIC': + return 'B'; + + case 'DATE': + case 'D': + return 'D'; + + case 'TIME': + case 'TIMESTAMP': + case 'T': + return 'T'; + + //case 'BOOLEAN': + //case 'BIT': + // return 'L'; + + //case 'COUNTER': + // return 'R'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'SMALLINT': + case 'I': + return 'I'; + + default: return 'N'; + } + } +} + +} //define +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-odbc_mssql.inc.php b/fannie/adodb5/drivers/adodb-odbc_mssql.inc.php new file mode 100644 index 000000000..a118be845 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-odbc_mssql.inc.php @@ -0,0 +1,306 @@ +ADODB_odbc(); + //$this->curmode = SQL_CUR_USE_ODBC; + } + + // crashes php... + function ServerInfo() + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $row = $this->GetRow("execute sp_server_info 2"); + $ADODB_FETCH_MODE = $save; + if (!is_array($row)) return false; + $arr['description'] = $row[2]; + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " ISNULL($field, $ifNull) "; // if MS SQL Server + } + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + return $this->GetOne($this->identitySQL); + } + + + function MetaForeignKeys($table, $owner=false, $upper=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + + $sql = +"select object_name(constid) as constraint_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where upper(object_name(fkeyid)) = $table +order by constraint_name, referenced_table_name, keyno"; + + $constraints = $this->GetArray($sql); + + $ADODB_FETCH_MODE = $save; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; + } + if (!$arr) return false; + + $arr2 = false; + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) {$this->debug=1; + $save = $this->metaTablesSQL; + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " AND name like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function MetaColumns($table, $normalize=true) + { + $arr = ADOConnection::MetaColumns($table); + return $arr; + } + + + function MetaIndexes($table,$primary=false, $owner=false) + { + $table = $this->qstr($table); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if (!$primary && $row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function _query($sql,$inputarr=false) + { + if (is_string($sql)) $sql = str_replace('||','+',$sql); + return ADODB_odbc::_query($sql,$inputarr); + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + // "Stein-Aksel Basma" + // tested with MSSQL 2000 + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + $schema = ''; + $this->_findschema($table,$schema); + //if (!$schema) $schema = $this->database; + if ($schema) $schema = "and k.table_catalog like '$schema%'"; + + $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, + information_schema.table_constraints tc + where tc.constraint_name = k.constraint_name and tc.constraint_type = + 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $a = $this->GetCol($sql); + $ADODB_FETCH_MODE = $savem; + + if ($a && sizeof($a)>0) return $a; + $false = false; + return $false; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($nrows > 0 && $offset <= 0) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); + $rs = $this->Execute($sql,$inputarr); + } else + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + + return $rs; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yyyy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(quarter,$col)"; + break; + case 'D': + case 'd': + $s .= "replace(str(day($col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + +} + +class ADORecordSet_odbc_mssql extends ADORecordSet_odbc { + + var $databaseType = 'odbc_mssql'; + + function ADORecordSet_odbc_mssql($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-odbc_oracle.inc.php b/fannie/adodb5/drivers/adodb-odbc_oracle.inc.php new file mode 100644 index 000000000..7c52c5fec --- /dev/null +++ b/fannie/adodb5/drivers/adodb-odbc_oracle.inc.php @@ -0,0 +1,115 @@ +ADODB_odbc(); + } + + function MetaTables() + { + $false = false; + $rs = $this->Execute($this->metaTablesSQL); + if ($rs === false) return $false; + $arr = $rs->GetArray(); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + $arr2[] = $arr[$i][0]; + } + $rs->Close(); + return $arr2; + } + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + if ($rs === false) { + $false = false; + return $false; + } + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + $php_errormsg = ''; + $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC ); + $this->_errorMsg = $php_errormsg; + + $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); + //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true); + return $this->_connectionID != false; + } + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + $php_errormsg = ''; + $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC ); + $this->_errorMsg = $php_errormsg; + + $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); + //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true); + return $this->_connectionID != false; + } +} + +class ADORecordSet_odbc_oracle extends ADORecordSet_odbc { + + var $databaseType = 'odbc_oracle'; + + function ADORecordSet_odbc_oracle($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-odbtp.inc.php b/fannie/adodb5/drivers/adodb-odbtp.inc.php new file mode 100644 index 000000000..100f7a0ba --- /dev/null +++ b/fannie/adodb5/drivers/adodb-odbtp.inc.php @@ -0,0 +1,836 @@ + + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +define("_ADODB_ODBTP_LAYER", 2 ); + +class ADODB_odbtp extends ADOConnection{ + var $databaseType = "odbtp"; + var $dataProvider = "odbtp"; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $odbc_driver = 0; + var $hasAffectedRows = true; + var $hasInsertID = false; + var $hasGenID = true; + var $hasMoveFirst = true; + + var $_genSeqSQL = "create table %s (seq_name char(30) not null unique , seq_value integer not null)"; + var $_dropSeqSQL = "delete from adodb_seq where seq_name = '%s'"; + var $_bindInputArray = false; + var $_useUnicodeSQL = false; + var $_canPrepareSP = false; + var $_dontPoolDBC = true; + + function ADODB_odbtp() + { + } + + function ServerInfo() + { + return array('description' => @odbtp_get_attr( ODB_ATTR_DBMSNAME, $this->_connectionID), + 'version' => @odbtp_get_attr( ODB_ATTR_DBMSVER, $this->_connectionID)); + } + + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @odbtp_last_error(); + return @odbtp_last_error($this->_connectionID); + } + + function ErrorNo() + { + if ($this->_errorCode !== false) return $this->_errorCode; + if (empty($this->_connectionID)) return @odbtp_last_error_state(); + return @odbtp_last_error_state($this->_connectionID); + } +/* + function DBDate($d,$isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return "convert(date, $d, 120)"; + + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + $d = adodb_date($this->fmtDate,$d); + return "convert(date, $d, 120)"; + } + + function DBTimeStamp($d,$isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return "convert(datetime, $d, 120)"; + + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + $d = adodb_date($this->fmtDate,$d); + return "convert(datetime, $d, 120)"; + } +*/ + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + return $this->GetOne($this->identitySQL); + } + + function _affectedrows() + { + if ($this->_queryID) { + return @odbtp_affected_rows ($this->_queryID); + } else + return 0; + } + + function CreateSequence($seqname='adodbseq',$start=1) + { + //verify existence + $num = $this->GetOne("select seq_value from adodb_seq"); + $seqtab='adodb_seq'; + if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) { + $path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID ); + //if using vfp dbc file + if( !strcasecmp(strrchr($path, '.'), '.dbc') ) + $path = substr($path,0,strrpos($path,'\/')); + $seqtab = $path . '/' . $seqtab; + } + if($num == false) { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL ,$seqtab)); + } + $num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seqname'"); + if ($num) { + return false; + } + $start -= 1; + return $this->Execute("insert into adodb_seq values('$seqname',$start)"); + } + + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + function GenID($seq='adodbseq',$start=1) + { + $seqtab='adodb_seq'; + if( $this->odbc_driver == ODB_DRIVER_FOXPRO) { + $path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID ); + //if using vfp dbc file + if( !strcasecmp(strrchr($path, '.'), '.dbc') ) + $path = substr($path,0,strrpos($path,'\/')); + $seqtab = $path . '/' . $seqtab; + } + $MAXLOOPS = 100; + while (--$MAXLOOPS>=0) { + $num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seq'"); + if ($num === false) { + //verify if abodb_seq table exist + $ok = $this->GetOne("select seq_value from adodb_seq "); + if(!$ok) { + //creating the sequence table adodb_seq + $this->Execute(sprintf($this->_genSeqSQL ,$seqtab)); + } + $start -= 1; + $num = '0'; + $ok = $this->Execute("insert into adodb_seq values('$seq',$start)"); + if (!$ok) return false; + } + $ok = $this->Execute("update adodb_seq set seq_value=seq_value+1 where seq_name='$seq'"); + if($ok) { + $num += 1; + $this->genID = $num; + return $num; + } + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + //example for $UserOrDSN + //for visual fox : DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=c:\YourDbfFileDir;EXCLUSIVE=NO; + //for visual fox dbc: DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBC;SOURCEDB=c:\YourDbcFileDir\mydb.dbc;EXCLUSIVE=NO; + //for access : DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\path_to_access_db\base_test.mdb;UID=root;PWD=; + //for mssql : DRIVER={SQL Server};SERVER=myserver;UID=myuid;PWD=mypwd;DATABASE=OdbtpTest; + //if uid & pwd can be separate + function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') + { + $this->_connectionID = odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase); + if ($this->_connectionID === false) { + $this->_errorMsg = $this->ErrorMsg() ; + return false; + } + + odbtp_convert_datetime($this->_connectionID,true); + + if ($this->_dontPoolDBC) { + if (function_exists('odbtp_dont_pool_dbc')) + @odbtp_dont_pool_dbc($this->_connectionID); + } + else { + $this->_dontPoolDBC = true; + } + $this->odbc_driver = @odbtp_get_attr(ODB_ATTR_DRIVER, $this->_connectionID); + $dbms = strtolower(@odbtp_get_attr(ODB_ATTR_DBMSNAME, $this->_connectionID)); + $this->odbc_name = $dbms; + + // Account for inconsistent DBMS names + if( $this->odbc_driver == ODB_DRIVER_ORACLE ) + $dbms = 'oracle'; + else if( $this->odbc_driver == ODB_DRIVER_SYBASE ) + $dbms = 'sybase'; + + // Set DBMS specific attributes + switch( $dbms ) { + case 'microsoft sql server': + $this->databaseType = 'odbtp_mssql'; + $this->fmtDate = "'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d h:i:sA'"; + $this->sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + $this->sysTimeStamp = 'GetDate()'; + $this->ansiOuter = true; + $this->leftOuter = '*='; + $this->rightOuter = '=*'; + $this->hasTop = 'top'; + $this->hasInsertID = true; + $this->hasTransactions = true; + $this->_bindInputArray = true; + $this->_canSelectDb = true; + $this->substr = "substring"; + $this->length = 'len'; + $this->identitySQL = 'select SCOPE_IDENTITY()'; + $this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'"; + $this->_canPrepareSP = true; + break; + case 'access': + $this->databaseType = 'odbtp_access'; + $this->fmtDate = "#Y-m-d#"; + $this->fmtTimeStamp = "#Y-m-d h:i:sA#"; + $this->sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; + $this->sysTimeStamp = 'NOW'; + $this->hasTop = 'top'; + $this->hasTransactions = false; + $this->_canPrepareSP = true; // For MS Access only. + break; + case 'visual foxpro': + $this->databaseType = 'odbtp_vfp'; + $this->fmtDate = "{^Y-m-d}"; + $this->fmtTimeStamp = "{^Y-m-d, h:i:sA}"; + $this->sysDate = 'date()'; + $this->sysTimeStamp = 'datetime()'; + $this->ansiOuter = true; + $this->hasTop = 'top'; + $this->hasTransactions = false; + $this->replaceQuote = "'+chr(39)+'"; + $this->true = '.T.'; + $this->false = '.F.'; + + break; + case 'oracle': + $this->databaseType = 'odbtp_oci8'; + $this->fmtDate = "'Y-m-d 00:00:00'"; + $this->fmtTimeStamp = "'Y-m-d h:i:sA'"; + $this->sysDate = 'TRUNC(SYSDATE)'; + $this->sysTimeStamp = 'SYSDATE'; + $this->hasTransactions = true; + $this->_bindInputArray = true; + $this->concat_operator = '||'; + break; + case 'sybase': + $this->databaseType = 'odbtp_sybase'; + $this->fmtDate = "'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + $this->sysDate = 'GetDate()'; + $this->sysTimeStamp = 'GetDate()'; + $this->leftOuter = '*='; + $this->rightOuter = '=*'; + $this->hasInsertID = true; + $this->hasTransactions = true; + $this->identitySQL = 'select SCOPE_IDENTITY()'; + break; + default: + $this->databaseType = 'odbtp'; + if( @odbtp_get_attr(ODB_ATTR_TXNCAPABLE, $this->_connectionID) ) + $this->hasTransactions = true; + else + $this->hasTransactions = false; + } + @odbtp_set_attr(ODB_ATTR_FULLCOLINFO, TRUE, $this->_connectionID ); + + if ($this->_useUnicodeSQL ) + @odbtp_set_attr(ODB_ATTR_UNICODESQL, TRUE, $this->_connectionID); + + return true; + } + + function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') + { + $this->_dontPoolDBC = false; + return $this->_connect($HostOrInterface, $UserOrDSN, $argPassword, $argDatabase); + } + + function SelectDB($dbName) + { + if (!@odbtp_select_db($dbName, $this->_connectionID)) { + return false; + } + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + return true; + } + + function MetaTables($ttype='',$showSchema=false,$mask=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false); + + $arr = $this->GetArray("||SQLTables||||$ttype"); + + if (isset($savefm)) $this->SetFetchMode($savefm); + $ADODB_FETCH_MODE = $savem; + + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3] == 'SYSTEM TABLE' ) continue; + if ($arr[$i][2]) + $arr2[] = $showSchema && $arr[$i][1]? $arr[$i][1].'.'.$arr[$i][2] : $arr[$i][2]; + } + return $arr2; + } + + function MetaColumns($table,$upper=true) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $this->_findschema($table,$schema); + if ($upper) $table = strtoupper($table); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false); + + $rs = $this->Execute( "||SQLColumns||$schema|$table" ); + + if (isset($savefm)) $this->SetFetchMode($savefm); + $ADODB_FETCH_MODE = $savem; + + if (!$rs || $rs->EOF) { + $false = false; + return $false; + } + $retarr = array(); + while (!$rs->EOF) { + //print_r($rs->fields); + if (strtoupper($rs->fields[2]) == $table) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $rs->fields[5]; + $fld->max_length = $rs->fields[6]; + $fld->not_null = !empty($rs->fields[9]); + $fld->scale = $rs->fields[7]; + if (isset($rs->fields[12])) // vfp does not have field 12 + if (!is_null($rs->fields[12])) { + $fld->has_default = true; + $fld->default_value = $rs->fields[12]; + } + $retarr[strtoupper($fld->name)] = $fld; + } else if (!empty($retarr)) + break; + $rs->MoveNext(); + } + $rs->Close(); + + return $retarr; + } + + function MetaPrimaryKeys($table, $owner='') + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $arr = $this->GetArray("||SQLPrimaryKeys||$owner|$table"); + $ADODB_FETCH_MODE = $savem; + + //print_r($arr); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3]) $arr2[] = $arr[$i][3]; + } + return $arr2; + } + + function MetaForeignKeys($table, $owner='', $upper=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $constraints = $this->GetArray("||SQLForeignKeys|||||$owner|$table"); + $ADODB_FETCH_MODE = $savem; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[11]][$constr[2]][] = $constr[7].'='.$constr[3]; + } + if (!$arr) { + $false = false; + return $false; + } + + $arr2 = array(); + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + if (defined('ODB_TXN_DEFAULT')) + $txn = ODB_TXN_DEFAULT; + else + $txn = ODB_TXN_READUNCOMMITTED; + $rs = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS,$txn,$this->_connectionID); + if(!$rs) return false; + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->autoCommit = true; + if( ($ret = @odbtp_commit($this->_connectionID)) ) + $ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->autoCommit = true; + if( ($ret = @odbtp_rollback($this->_connectionID)) ) + $ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off + return $ret; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + // TOP requires ORDER BY for Visual FoxPro + if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) { + if (!preg_match('/ORDER[ \t\r\n]+BY/is',$sql)) $sql .= ' ORDER BY 1'; + } + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + + $this->_errorMsg = false; + $this->_errorCode = false; + + $stmt = @odbtp_prepare($sql,$this->_connectionID); + if (!$stmt) { + // print "Prepare Error for ($sql) ".$this->ErrorMsg()."
        "; + return $sql; + } + return array($sql,$stmt,false); + } + + function PrepareSP($sql) + { + if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures + + $this->_errorMsg = false; + $this->_errorCode = false; + + $stmt = @odbtp_prepare_proc($sql,$this->_connectionID); + if (!$stmt) return false; + return array($sql,$stmt); + } + + /* + Usage: + $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group + + # note that the parameter does not have @ in front! + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',false,64); + $db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY); + $db->Execute($stmt); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to. Can set to null (for isNull support). + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + See odbtp_attach_param documentation at http://odbtp.sourceforge.net. + */ + function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0) + { + if ( $this->odbc_driver == ODB_DRIVER_JET ) { + $name = '['.$name.']'; + if( !$type && $this->_useUnicodeSQL + && @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR ) + { + $type = ODB_WCHAR; + } + } + else { + $name = '@'.$name; + } + return @odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen); + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='image') + { + $sql = "UPDATE $table SET $column = ? WHERE $where"; + if( !($stmt = @odbtp_prepare($sql, $this->_connectionID)) ) + return false; + if( !@odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) ) + return false; + if( !@odbtp_set( $stmt, 1, $val ) ) + return false; + return @odbtp_execute( $stmt ) != false; + } + + function MetaIndexes($table,$primary=false, $owner=false) + { + switch ( $this->odbc_driver) { + case ODB_DRIVER_MSSQL: + return $this->MetaIndexes_mssql($table, $primary); + default: + return array(); + } + } + + function MetaIndexes_mssql($table,$primary=false) + { + $table = strtolower($this->qstr($table)); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND lower(O.Name) = $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if ($primary && !$row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function IfNull( $field, $ifNull ) + { + switch( $this->odbc_driver ) { + case ODB_DRIVER_MSSQL: + return " ISNULL($field, $ifNull) "; + case ODB_DRIVER_JET: + return " IIF(IsNull($field), $ifNull, $field) "; + } + return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; + } + + function _query($sql,$inputarr=false) + { + global $php_errormsg; + + $this->_errorMsg = false; + $this->_errorCode = false; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = @odbtp_prepare($sql,$this->_connectionID); + if ($stmtid == false) { + $this->_errorMsg = $php_errormsg; + return false; + } + } + $num_params = @odbtp_num_params( $stmtid ); + /* + for( $param = 1; $param <= $num_params; $param++ ) { + @odbtp_input( $stmtid, $param ); + @odbtp_set( $stmtid, $param, $inputarr[$param-1] ); + }*/ + + $param = 1; + foreach($inputarr as $v) { + @odbtp_input( $stmtid, $param ); + @odbtp_set( $stmtid, $param, $v ); + $param += 1; + if ($param > $num_params) break; + } + + if (!@odbtp_execute($stmtid) ) { + return false; + } + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!@odbtp_execute($stmtid)) { + return false; + } + } else { + $stmtid = odbtp_query($sql,$this->_connectionID); + } + $this->_lastAffectedRows = 0; + if ($stmtid) { + $this->_lastAffectedRows = @odbtp_affected_rows($stmtid); + } + return $stmtid; + } + + function _close() + { + $ret = @odbtp_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } +} + +class ADORecordSet_odbtp extends ADORecordSet { + + var $databaseType = 'odbtp'; + var $canSeek = true; + + function ADORecordSet_odbtp($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function _initrs() + { + $this->_numOfFields = @odbtp_num_fields($this->_queryID); + if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID))) + $this->_numOfRows = -1; + + if (!$this->connection->_useUnicodeSQL) return; + + if ($this->connection->odbc_driver == ODB_DRIVER_JET) { + if (!@odbtp_get_attr(ODB_ATTR_MAPCHARTOWCHAR, + $this->connection->_connectionID)) + { + for ($f = 0; $f < $this->_numOfFields; $f++) { + if (@odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR) + @odbtp_bind_field($this->_queryID, $f, ODB_WCHAR); + } + } + } + } + + function FetchField($fieldOffset = 0) + { + $off=$fieldOffset; // offsets begin at 0 + $o= new ADOFieldObject(); + $o->name = @odbtp_field_name($this->_queryID,$off); + $o->type = @odbtp_field_type($this->_queryID,$off); + $o->max_length = @odbtp_field_length($this->_queryID,$off); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + function _seek($row) + { + return @odbtp_data_seek($this->_queryID, $row); + } + + function fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $name = @odbtp_field_name( $this->_queryID, $i ); + $this->bind[strtoupper($name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _fetch_odbtp($type=0) + { + switch ($this->fetchMode) { + case ADODB_FETCH_NUM: + $this->fields = @odbtp_fetch_row($this->_queryID, $type); + break; + case ADODB_FETCH_ASSOC: + $this->fields = @odbtp_fetch_assoc($this->_queryID, $type); + break; + default: + $this->fields = @odbtp_fetch_array($this->_queryID, $type); + } + if ($this->databaseType = 'odbtp_vfp') { + if ($this->fields) + foreach($this->fields as $k => $v) { + if (strncmp($v,'1899-12-30',10) == 0) $this->fields[$k] = ''; + } + } + return is_array($this->fields); + } + + function _fetch() + { + return $this->_fetch_odbtp(); + } + + function MoveFirst() + { + if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false; + $this->EOF = false; + $this->_currentRow = 0; + return true; + } + + function MoveLast() + { + if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false; + $this->EOF = false; + $this->_currentRow = $this->_numOfRows - 1; + return true; + } + + function NextRecordSet() + { + if (!@odbtp_next_result($this->_queryID)) return false; + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + function _close() + { + return @odbtp_free_query($this->_queryID); + } +} + +class ADORecordSet_odbtp_mssql extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_mssql'; + + function ADORecordSet_odbtp_mssql($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_access extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_access'; + + function ADORecordSet_odbtp_access($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_vfp extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_vfp'; + + function ADORecordSet_odbtp_vfp($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_oci8 extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_oci8'; + + function ADORecordSet_odbtp_oci8($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_sybase extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_sybase'; + + function ADORecordSet_odbtp_sybase($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} +?> diff --git a/fannie/adodb5/drivers/adodb-odbtp_unicode.inc.php b/fannie/adodb5/drivers/adodb-odbtp_unicode.inc.php new file mode 100644 index 000000000..4943cb5fa --- /dev/null +++ b/fannie/adodb5/drivers/adodb-odbtp_unicode.inc.php @@ -0,0 +1,39 @@ + + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* + Because the ODBTP server sends and reads UNICODE text data using UTF-8 + encoding, the following HTML meta tag must be included within the HTML + head section of every HTML form and script page: + + + + Also, all SQL query strings must be submitted as UTF-8 encoded text. +*/ + +if (!defined('_ADODB_ODBTP_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbtp.inc.php"); +} + +class ADODB_odbtp_unicode extends ADODB_odbtp { + var $databaseType = 'odbtp'; + var $_useUnicodeSQL = true; + + function ADODB_odbtp_unicode() + { + $this->ADODB_odbtp(); + } +} +?> diff --git a/fannie/adodb5/drivers/adodb-oracle.inc.php b/fannie/adodb5/drivers/adodb-oracle.inc.php new file mode 100644 index 000000000..abe3643ec --- /dev/null +++ b/fannie/adodb5/drivers/adodb-oracle.inc.php @@ -0,0 +1,342 @@ +format($this->fmtDate); + else $ds = adodb_date($this->fmtDate,$d); + return 'TO_DATE('.$ds.",'YYYY-MM-DD')"; + } + + // format and return date string in database timestamp format + function DBTimeStamp($ts) + { + + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + if (is_object($ts)) $ds = $ts->format($this->fmtDate); + else $ds = adodb_date($this->fmtTimeStamp,$ts); + return 'TO_DATE('.$ds.",'RRRR-MM-DD, HH:MI:SS AM')"; + } + + + function BindDate($d) + { + $d = ADOConnection::DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($d) + { + $d = ADOConnection::DBTimeStamp($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + + + function BeginTrans() + { + $this->autoCommit = false; + ora_commitoff($this->_connectionID); + return true; + } + + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + $ret = ora_commit($this->_connectionID); + ora_commiton($this->_connectionID); + return $ret; + } + + + function RollbackTrans() + { + $ret = ora_rollback($this->_connectionID); + ora_commiton($this->_connectionID); + return $ret; + } + + + /* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */ + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + + if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs); + if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID); + return $this->_errorMsg; + } + + + function ErrorNo() + { + if ($this->_errorCode !== false) return $this->_errorCode; + + if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs); + if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID); + return $this->_errorCode; + } + + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0) + { + if (!function_exists('ora_plogon')) return null; + + // Reset error messages before connecting + $this->_errorMsg = false; + $this->_errorCode = false; + + // G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set + // the oracle home to the host name of remote DB? +// if ($argHostname) putenv("ORACLE_HOME=$argHostname"); + + if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen + if (empty($argDatabasename)) $argDatabasename = $argHostname; + else { + if(strpos($argHostname,":")) { + $argHostinfo=explode(":",$argHostname); + $argHostname=$argHostinfo[0]; + $argHostport=$argHostinfo[1]; + } else { + $argHostport="1521"; + } + + + if ($this->connectSID) { + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; + } else + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; + } + + } + + if ($argDatabasename) $argUsername .= "@$argDatabasename"; + + //if ($argHostname) print "

        Connect: 1st argument should be left blank for $this->databaseType

        "; + if ($mode == 1) + $this->_connectionID = ora_plogon($argUsername,$argPassword); + else + $this->_connectionID = ora_logon($argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($this->autoCommit) ora_commiton($this->_connectionID); + if ($this->_initdate) { + $rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'"); + if ($rs) ora_close($rs); + } + + return true; + } + + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1); + } + + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + // Reset error messages before executing + $this->_errorMsg = false; + $this->_errorCode = false; + + $curs = ora_open($this->_connectionID); + + if ($curs === false) return false; + $this->_curs = $curs; + if (!ora_parse($curs,$sql)) return false; + if (ora_exec($curs)) return $curs; + // before we close the cursor, we have to store the error message + // that we can obtain ONLY from the cursor (and not from the connection) + $this->_errorCode = @ora_errorcode($curs); + $this->_errorMsg = @ora_error($curs); + // + @ora_close($curs); + return false; + } + + + // returns true or false + function _close() + { + return @ora_logoff($this->_connectionID); + } + + + +} + + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_oracle extends ADORecordSet { + + var $databaseType = "oracle"; + var $bind = false; + + function ADORecordset_oracle($queryID,$mode=false) + { + + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $queryID; + + $this->_inited = true; + $this->fields = array(); + if ($queryID) { + $this->_currentRow = 0; + $this->EOF = !$this->_fetch(); + @$this->_initrs(); + } else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + $this->EOF = true; + } + + return $this->_queryID; + } + + + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fld->name = ora_columnname($this->_queryID, $fieldOffset); + $fld->type = ora_columntype($this->_queryID, $fieldOffset); + $fld->max_length = ora_columnsize($this->_queryID, $fieldOffset); + return $fld; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _initrs() + { + $this->_numOfRows = -1; + $this->_numOfFields = @ora_numcols($this->_queryID); + } + + + function _seek($row) + { + return false; + } + + function _fetch($ignore_fields=false) { +// should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1 + if ($this->fetchMode & ADODB_FETCH_ASSOC) + return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC); + else + return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS); + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + + function _close() +{ + return @ora_close($this->_queryID); + } + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + switch (strtoupper($t)) { + case 'VARCHAR': + case 'VARCHAR2': + case 'CHAR': + case 'VARBINARY': + case 'BINARY': + if ($len <= $this->blobSize) return 'C'; + case 'LONG': + case 'LONG VARCHAR': + case 'CLOB': + return 'X'; + case 'LONG RAW': + case 'LONG VARBINARY': + case 'BLOB': + return 'B'; + + case 'DATE': return 'D'; + + //case 'T': return 'T'; + + case 'BIT': return 'L'; + case 'INT': + case 'SMALLINT': + case 'INTEGER': return 'I'; + default: return 'N'; + } + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-pdo.inc.php b/fannie/adodb5/drivers/adodb-pdo.inc.php new file mode 100644 index 000000000..abc763a9b --- /dev/null +++ b/fannie/adodb5/drivers/adodb-pdo.inc.php @@ -0,0 +1,626 @@ +_driver; + $this->fmtDate = $d->fmtDate; + $this->fmtTimeStamp = $d->fmtTimeStamp; + $this->replaceQuote = $d->replaceQuote; + $this->sysDate = $d->sysDate; + $this->sysTimeStamp = $d->sysTimeStamp; + $this->random = $d->random; + $this->concat_operator = $d->concat_operator; + $this->nameQuote = $d->nameQuote; + + $this->hasGenID = $d->hasGenID; + $this->_genIDSQL = $d->_genIDSQL; + $this->_genSeqSQL = $d->_genSeqSQL; + $this->_dropSeqSQL = $d->_dropSeqSQL; + + $d->_init($this); + } + + function Time() + { + if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual"; + else $sql = "select $this->sysTimeStamp"; + + $rs = $this->_Execute($sql); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false) + { + $at = strpos($argDSN,':'); + $this->dsnType = substr($argDSN,0,$at); + + if ($argDatabasename) { + $argDSN .= ';dbname='.$argDatabasename; + } + try { + $this->_connectionID = new PDO($argDSN, $argUsername, $argPassword); + } catch (Exception $e) { + $this->_connectionID = false; + $this->_errorno = -1; + //var_dump($e); + $this->_errormsg = 'Connection attempt failed: '.$e->getMessage(); + return false; + } + + if ($this->_connectionID) { + switch(ADODB_ASSOC_CASE){ + case 0: $m = PDO::CASE_LOWER; break; + case 1: $m = PDO::CASE_UPPER; break; + default: + case 2: $m = PDO::CASE_NATURAL; break; + } + + //$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT ); + $this->_connectionID->setAttribute(PDO::ATTR_CASE,$m); + + $class = 'ADODB_pdo_'.$this->dsnType; + //$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); + switch($this->dsnType) { + case 'oci': + case 'mysql': + case 'pgsql': + case 'mssql': + case 'sqlite': + include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php'); + break; + } + if (class_exists($class)) + $this->_driver = new $class(); + else + $this->_driver = new ADODB_pdo_base(); + + $this->_driver->_connectionID = $this->_connectionID; + $this->_UpdatePDO(); + return true; + } + $this->_driver = new ADODB_pdo_base(); + return false; + } + + function Concat() + { + $args = func_get_args(); + if(method_exists($this->_driver, 'Concat')) + return call_user_func_array(array($this->_driver, 'Concat'), $args); + + return call_user_func_array(array($this,'parent::Concat'), $args); + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true); + } + + /*------------------------------------------------------------------------------*/ + + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $save = $this->_driver->fetchMode; + $this->_driver->fetchMode = $this->fetchMode; + $this->_driver->debug = $this->debug; + $ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + $this->_driver->fetchMode = $save; + return $ret; + } + + + function ServerInfo() + { + return $this->_driver->ServerInfo(); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + return $this->_driver->MetaTables($ttype,$showSchema,$mask); + } + + function MetaColumns($table,$normalize=true) + { + return $this->_driver->MetaColumns($table,$normalize); + } + + function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + $obj = $stmt[1]; + if ($type) $obj->bindParam($name,$var,$type,$maxLen); + else $obj->bindParam($name, $var); + } + + function OffsetDate($dayFraction,$date=false) + { + return $this->_driver->OffsetDate($dayFraction,$date); + } + + function ErrorMsg() + { + if ($this->_errormsg !== false) return $this->_errormsg; + if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo(); + else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo(); + else return 'No Connection Established'; + + + if ($arr) { + if (sizeof($arr)<2) return ''; + if ((integer)$arr[1]) return $arr[2]; + else return ''; + } else return '-1'; + } + + + function ErrorNo() + { + if ($this->_errorno !== false) return $this->_errorno; + if (!empty($this->_stmt)) $err = $this->_stmt->errorCode(); + else if (!empty($this->_connectionID)) { + $arr = $this->_connectionID->errorInfo(); + if (isset($arr[0])) $err = $arr[0]; + else $err = -1; + } else + return 0; + + if ($err == '00000') return 0; // allows empty check + return $err; + } + + function SetTransactionMode($transaction_mode) + { + if(method_exists($this->_driver, 'SetTransactionMode')) + return $this->_driver->SetTransactionMode($transaction_mode); + + return parent::SetTransactionMode($seqname); + } + + function BeginTrans() + { + if(method_exists($this->_driver, 'BeginTrans')) + return $this->_driver->BeginTrans(); + + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false); + return $this->_connectionID->beginTransaction(); + } + + function CommitTrans($ok=true) + { + if(method_exists($this->_driver, 'CommitTrans')) + return $this->_driver->CommitTrans($ok); + + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + + $ret = $this->_connectionID->commit(); + $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); + return $ret; + } + + function RollbackTrans() + { + if(method_exists($this->_driver, 'RollbackTrans')) + return $this->_driver->RollbackTrans(); + + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + + $ret = $this->_connectionID->rollback(); + $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); + return $ret; + } + + function Prepare($sql) + { + $this->_stmt = $this->_connectionID->prepare($sql); + if ($this->_stmt) return array($sql,$this->_stmt); + + return false; + } + + function PrepareStmt($sql) + { + $stmt = $this->_connectionID->prepare($sql); + if (!$stmt) return false; + $obj = new ADOPDOStatement($stmt,$this); + return $obj; + } + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if(method_exists($this->_driver, 'CreateSequence')) + return $this->_driver->CreateSequence($seqname, $startID); + + return parent::CreateSequence($seqname, $startID); + } + + function DropSequence($seqname='adodbseq') + { + if(method_exists($this->_driver, 'DropSequence')) + return $this->_driver->DropSequence($seqname); + + return parent::DropSequence($seqname); + } + + function GenID($seqname='adodbseq',$startID=1) + { + if(method_exists($this->_driver, 'GenID')) + return $this->_driver->GenID($seqname, $startID); + + return parent::GenID($seqname, $startID); + } + + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + if (is_array($sql)) { + $stmt = $sql[1]; + } else { + $stmt = $this->_connectionID->prepare($sql); + } + #adodb_backtrace(); + #var_dump($this->_bindInputArray); + if ($stmt) { + $this->_driver->debug = $this->debug; + if ($inputarr) $ok = $stmt->execute($inputarr); + else $ok = $stmt->execute(); + } + + + $this->_errormsg = false; + $this->_errorno = false; + + if ($ok) { + $this->_stmt = $stmt; + return $stmt; + } + + if ($stmt) { + + $arr = $stmt->errorinfo(); + if ((integer)$arr[1]) { + $this->_errormsg = $arr[2]; + $this->_errorno = $arr[1]; + } + + } else { + $this->_errormsg = false; + $this->_errorno = false; + } + return false; + } + + // returns true or false + function _close() + { + $this->_stmt = false; + return true; + } + + function _affectedrows() + { + return ($this->_stmt) ? $this->_stmt->rowCount() : 0; + } + + function _insertid() + { + return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0; + } +} + +class ADODB_pdo_base extends ADODB_pdo { + + var $sysDate = "'?'"; + var $sysTimeStamp = "'?'"; + + + function _init($parentDriver) + { + $parentDriver->_bindInputArray = true; + #$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); + } + + function ServerInfo() + { + return ADOConnection::ServerInfo(); + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + return false; + } + + function MetaColumns($table,$normalize=true) + { + return false; + } +} + +class ADOPDOStatement { + + var $databaseType = "pdo"; + var $dataProvider = "pdo"; + var $_stmt; + var $_connectionID; + + function ADOPDOStatement($stmt,$connection) + { + $this->_stmt = $stmt; + $this->_connectionID = $connection; + } + + function Execute($inputArr=false) + { + $savestmt = $this->_connectionID->_stmt; + $rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr); + $this->_connectionID->_stmt = $savestmt; + return $rs; + } + + function InParameter(&$var,$name,$maxLen=4000,$type=false) + { + + if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen); + else $this->_stmt->bindParam($name, $var); + } + + function Affected_Rows() + { + return ($this->_stmt) ? $this->_stmt->rowCount() : 0; + } + + function ErrorMsg() + { + if ($this->_stmt) $arr = $this->_stmt->errorInfo(); + else $arr = $this->_connectionID->errorInfo(); + + if (is_array($arr)) { + if ((integer) $arr[0] && isset($arr[2])) return $arr[2]; + else return ''; + } else return '-1'; + } + + function NumCols() + { + return ($this->_stmt) ? $this->_stmt->columnCount() : 0; + } + + function ErrorNo() + { + if ($this->_stmt) return $this->_stmt->errorCode(); + else return $this->_connectionID->errorInfo(); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_pdo extends ADORecordSet { + + var $bind = false; + var $databaseType = "pdo"; + var $dataProvider = "pdo"; + + function ADORecordSet_pdo($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->adodbFetchMode = $mode; + switch($mode) { + case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break; + case ADODB_FETCH_ASSOC: $mode = PDO::FETCH_ASSOC; break; + + case ADODB_FETCH_BOTH: + default: $mode = PDO::FETCH_BOTH; break; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + $this->ADORecordSet($id); + } + + + function Init() + { + if ($this->_inited) return; + $this->_inited = true; + if ($this->_queryID) @$this->_initrs(); + else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + } + if ($this->_numOfRows != 0 && $this->_currentRow == -1) { + $this->_currentRow = 0; + if ($this->EOF = ($this->_fetch() === false)) { + $this->_numOfRows = 0; // _numOfRows could be -1 + } + } else { + $this->EOF = true; + } + } + + function _initrs() + { + global $ADODB_COUNTRECS; + + $this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1; + if (!$this->_numOfRows) $this->_numOfRows = -1; + $this->_numOfFields = $this->_queryID->columnCount(); + } + + // returns the field object + function FetchField($fieldOffset = -1) + { + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $arr = @$this->_queryID->getColumnMeta($fieldOffset); + if (!$arr) { + $o->name = 'bad getColumnMeta()'; + $o->max_length = -1; + $o->type = 'VARCHAR'; + $o->precision = 0; + # $false = false; + return $o; + } + //adodb_pr($arr); + $o->name = $arr['name']; + if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type']; + else $o->type = adodb_pdo_type($arr['pdo_type']); + $o->max_length = $arr['len']; + $o->precision = $arr['precision']; + + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + function _seek($row) + { + return false; + } + + function _fetch() + { + if (!$this->_queryID) return false; + + $this->fields = $this->_queryID->fetch($this->fetchMode); + return !empty($this->fields); + } + + function _close() + { + $this->_queryID = false; + } + + function Fields($colname) + { + if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + +} + +?> diff --git a/fannie/adodb5/drivers/adodb-pdo_mssql.inc.php b/fannie/adodb5/drivers/adodb-pdo_mssql.inc.php new file mode 100644 index 000000000..f57dd2956 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-pdo_mssql.inc.php @@ -0,0 +1,61 @@ +hasTransactions = false; ## <<< BUG IN PDO mssql driver + $parentDriver->_bindInputArray = false; + $parentDriver->hasInsertID = true; + } + + function ServerInfo() + { + return ADOConnection::ServerInfo(); + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + return false; + } + + function MetaColumns($table,$normalize=true) + { + return false; + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-pdo_mysql.inc.php b/fannie/adodb5/drivers/adodb-pdo_mysql.inc.php new file mode 100644 index 000000000..30c6bca35 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-pdo_mysql.inc.php @@ -0,0 +1,284 @@ +hasTransactions = false; + #$parentDriver->_bindInputArray = false; + $parentDriver->hasInsertID = true; + $parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); + } + + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false){ + if (substr($argDSN,0,6) !== "mysql:") + $argDSN = "mysql:host=".$argDSN; + return parent::_connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist); + } + + // dayFraction is a day in floating point + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + + $fraction = $dayFraction * 24 * 3600; + return $date . ' + INTERVAL ' . $fraction.' SECOND'; + +// return "from_unixtime(unix_timestamp($date)+$fraction)"; + } + + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // suggestion by andrew005#mnogo.ru + $s = implode(',',$arr); + if (strlen($s) > 0) return "CONCAT($s)"; return ''; + } + + function ServerInfo() + { + $arr['description'] = ADOConnection::GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $save = $this->metaTablesSQL; + if ($showSchema && is_string($showSchema)) { + $this->metaTablesSQL .= " from $showSchema"; + } + + if ($mask) { + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + $this->metaTablesSQL = $save; + return $ret; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); + } + + function MetaColumns($table,$normalize=true) + { + $this->_findschema($table,$schema); + if ($schema) { + $dbName = $this->database; + $this->SelectDB($schema); + } + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + + if ($schema) { + $this->SelectDB($dbName); + } + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!is_object($rs)) { + $false = false; + return $false; + } + + $retarr = array(); + while (!$rs->EOF){ + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $type = $rs->fields[1]; + + // split type into type(length): + $fld->scale = null; + if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; + } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { + $fld->type = $query_array[1]; + $arr = explode(",",$query_array[2]); + $fld->enums = $arr; + $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 + $fld->max_length = ($zlen > 0) ? $zlen : 1; + } else { + $fld->type = $type; + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($type,'blob') !== false); + $fld->unsigned = (strpos($type,'unsigned') !== false); + + if (!$fld->binary) { + $d = $rs->fields[4]; + if ($d != '' && $d != 'NULL') { + $fld->has_default = true; + $fld->default_value = $d; + } else { + $fld->has_default = false; + } + } + + if ($save == ADODB_FETCH_NUM) { + $retarr[] = $fld; + } else { + $retarr[strtoupper($fld->name)] = $fld; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $retarr; + } + + // returns true or false + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + $try = $this->Execute('use '.$dbName); + return ($try !== false) ? true : false; + } + + // parameters use PostgreSQL convention, not MySQL + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) + { + $offsetStr =($offset>=0) ? "$offset," : ''; + // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220 + if ($nrows < 0) $nrows = '18446744073709551615'; + + if ($secs) + $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr); + else + $rs = $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr); + return $rs; + } + + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'DATE_FORMAT('.$col.",'"; + $concat = false; + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + /** FALL THROUGH */ + case '-': + case '/': + $s .= $ch; + break; + + case 'Y': + case 'y': + $s .= '%Y'; + break; + case 'M': + $s .= '%b'; + break; + + case 'm': + $s .= '%m'; + break; + case 'D': + case 'd': + $s .= '%d'; + break; + + case 'Q': + case 'q': + $s .= "'),Quarter($col)"; + + if ($len > $i+1) $s .= ",DATE_FORMAT($col,'"; + else $s .= ",('"; + $concat = true; + break; + + case 'H': + $s .= '%H'; + break; + + case 'h': + $s .= '%I'; + break; + + case 'i': + $s .= '%i'; + break; + + case 's': + $s .= '%s'; + break; + + case 'a': + case 'A': + $s .= '%p'; + break; + + case 'w': + $s .= '%w'; + break; + + case 'W': + $s .= '%U'; + break; + + case 'l': + $s .= '%W'; + break; + } + } + $s.="')"; + if ($concat) $s = "CONCAT($s)"; + return $s; + } +} +?> diff --git a/fannie/adodb5/drivers/adodb-pdo_oci.inc.php b/fannie/adodb5/drivers/adodb-pdo_oci.inc.php new file mode 100644 index 000000000..4ba017a0b --- /dev/null +++ b/fannie/adodb5/drivers/adodb-pdo_oci.inc.php @@ -0,0 +1,93 @@ +_bindInputArray = true; + $parentDriver->_nestedSQL = true; + if ($this->_initdate) { + $parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); + } + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtoupper($mask)); + $this->metaTablesSQL .= " AND table_name like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!$rs) { + return $false; + } + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + $fld->scale = $rs->fields[3]; + if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) { + $fld->type ='INT'; + $fld->max_length = $rs->fields[4]; + } + $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); + $fld->binary = (strpos($fld->type,'BLOB') !== false); + $fld->default_value = $rs->fields[6]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) + return $false; + else + return $retarr; + } +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-pdo_pgsql.inc.php b/fannie/adodb5/drivers/adodb-pdo_pgsql.inc.php new file mode 100644 index 000000000..8c67a8491 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-pdo_pgsql.inc.php @@ -0,0 +1,230 @@ + 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // used when schema defined + var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum +FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n +WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) + and c.relnamespace=n.oid and n.nspname='%s' + and a.attname not like '....%%' AND a.attnum > 0 + AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // get primary key etc -- from Freek Dijkstra + var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key + FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'"; + + var $hasAffectedRows = true; + var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + // below suggested by Freek Dijkstra + var $true = 't'; // string that represents TRUE for a database + var $false = 'f'; // string that represents FALSE for a database + var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt. + var $hasMoveFirst = true; + var $hasGenID = true; + var $_genIDSQL = "SELECT NEXTVAL('%s')"; + var $_genSeqSQL = "CREATE SEQUENCE %s START %s"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum"; + var $random = 'random()'; /// random function + var $concat_operator='||'; + + function _init($parentDriver) + { + + $parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver + $parentDriver->hasInsertID = true; + $parentDriver->_nestedSQL = true; + } + + function ServerInfo() + { + $arr['description'] = ADOConnection::GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; + $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ''; + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $info = $this->ServerInfo(); + if ($info['version'] >= 7.3) { + $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and schemaname not in ( 'pg_catalog','information_schema') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') "; + } + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtolower($mask)); + if ($info['version']>=7.3) + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema') + union +select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') "; + else + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask + union +select viewname,'V' from pg_views where viewname like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $this->_findschema($table,$schema); + + if ($normalize) $table = strtolower($table); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema)); + else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) { + $false = false; + return $false; + } + if (!empty($this->metaKeySQL)) { + // If we want the primary keys, we have to issue a separate query + // Of course, a modified version of the metaColumnsSQL query using a + // LEFT JOIN would have been much more elegant, but postgres does + // not support OUTER JOINS. So here is the clumsy way. + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + $rskey = $this->Execute(sprintf($this->metaKeySQL,($table))); + // fetch all result in once for performance. + $keys = $rskey->GetArray(); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + $rskey->Close(); + unset($rskey); + } + + $rsdefa = array(); + if (!empty($this->metaDefaultsSQL)) { + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $sql = sprintf($this->metaDefaultsSQL, ($table)); + $rsdef = $this->Execute($sql); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rsdef) { + while (!$rsdef->EOF) { + $num = $rsdef->fields['num']; + $s = $rsdef->fields['def']; + if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */ + $s = substr($s, 1); + $s = substr($s, 0, strlen($s) - 1); + } + + $rsdefa[$num] = $s; + $rsdef->MoveNext(); + } + } else { + ADOConnection::outp( "==> SQL => " . $sql); + } + unset($rsdef); + } + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4; + if ($fld->max_length <= 0) $fld->max_length = -1; + if ($fld->type == 'numeric') { + $fld->scale = $fld->max_length & 0xFFFF; + $fld->max_length >>= 16; + } + // dannym + // 5 hasdefault; 6 num-of-column + $fld->has_default = ($rs->fields[5] == 't'); + if ($fld->has_default) { + $fld->default_value = $rsdefa[$rs->fields[6]]; + } + + //Freek + if ($rs->fields[4] == $this->true) { + $fld->not_null = true; + } + + // Freek + if (is_array($keys)) { + foreach($keys as $key) { + if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true) + $fld->primary_key = true; + if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true) + $fld->unique = true; // What name is more compatible? + } + } + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) { + $false = false; + return $false; + } else return $retarr; + + } + +} + +?> diff --git a/fannie/adodb5/drivers/adodb-pdo_sqlite.inc.php b/fannie/adodb5/drivers/adodb-pdo_sqlite.inc.php new file mode 100644 index 000000000..af2d64caf --- /dev/null +++ b/fannie/adodb5/drivers/adodb-pdo_sqlite.inc.php @@ -0,0 +1,190 @@ +pdoDriver = $parentDriver; + $parentDriver->_bindInputArray = true; + $parentDriver->hasTransactions = true; + $parentDriver->hasInsertID = true; + } + + function ServerInfo() + { + $parent = $this->pdoDriver; + @($ver = array_pop($parent->GetCol("SELECT sqlite_version()"))); + @($end = array_pop($parent->GetCol("PRAGMA encoding"))); + + $arr['version'] = $ver; + $arr['description'] = 'SQLite '; + $arr['encoding'] = $enc; + + return $arr; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $parent = $this->pdoDriver; + $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; + $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : ''); + if ($secs2cache) + $rs = $parent->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $parent->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + + function GenID($seq='adodbseq',$start=1) + { + $parent = $this->pdoDriver; + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $MAXLOOPS = 100; + while (--$MAXLOOPS>=0) { + @($num = array_pop($parent->GetCol("SELECT id FROM {$seq}"))); + if ($num === false || !is_numeric($num)) { + @$parent->Execute(sprintf($this->_genSeqSQL ,$seq)); + $start -= 1; + $num = '0'; + $cnt = $parent->GetOne(sprintf($this->_genSeqCountSQL,$seq)); + if (!$cnt) { + $ok = $parent->Execute(sprintf($this->_genSeq2SQL,$seq,$start)); + } + if (!$ok) return false; + } + $parent->Execute(sprintf($this->_genIDSQL,$seq,$num)); + + if ($parent->affected_rows() > 0) { + $num += 1; + $parent->genID = intval($num); + return intval($num); + } + } + if ($fn = $parent->raiseErrorFn) { + $fn($parent->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + function CreateSequence($seqname='adodbseq',$start=1) + { + $parent = $this->pdoDriver; + $ok = $parent->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + $start -= 1; + return $parent->Execute("insert into $seqname values($start)"); + } + + function SetTransactionMode($transaction_mode) + { + $parent = $this->pdoDriver; + $parent->_transmode = strtoupper($transaction_mode); + } + + function BeginTrans() + { + $parent = $this->pdoDriver; + if ($parent->transOff) return true; + $parent->transCnt += 1; + $parent->_autocommit = false; + return $parent->Execute("BEGIN {$parent->_transmode}"); + } + + function CommitTrans($ok=true) + { + $parent = $this->pdoDriver; + if ($parent->transOff) return true; + if (!$ok) return $parent->RollbackTrans(); + if ($parent->transCnt) $parent->transCnt -= 1; + $parent->_autocommit = true; + + $ret = $parent->Execute('COMMIT'); + return $ret; + } + + function RollbackTrans() + { + $parent = $this->pdoDriver; + if ($parent->transOff) return true; + if ($parent->transCnt) $parent->transCnt -= 1; + $parent->_autocommit = true; + + $ret = $parent->Execute('ROLLBACK'); + return $ret; + } + + + // mark newnham + function MetaColumns($tab,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $parent = $this->pdoDriver; + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($parent->fetchMode !== false) $savem = $parent->SetFetchMode(false); + $rs = $parent->Execute("PRAGMA table_info('$tab')"); + if (isset($savem)) $parent->SetFetchMode($savem); + if (!$rs) { + $ADODB_FETCH_MODE = $save; + return $false; + } + $arr = array(); + while ($r = $rs->FetchRow()) { + $type = explode('(',$r['type']); + $size = ''; + if (sizeof($type)==2) + $size = trim($type[1],')'); + $fn = strtoupper($r['name']); + $fld = new ADOFieldObject; + $fld->name = $r['name']; + $fld->type = $type[0]; + $fld->max_length = $size; + $fld->not_null = $r['notnull']; + $fld->primary_key = $r['pk']; + $fld->default_value = $r['dflt_value']; + $fld->scale = 0; + if ($save == ADODB_FETCH_NUM) $arr[] = $fld; + else $arr[strtoupper($fld->name)] = $fld; + } + $rs->Close(); + $ADODB_FETCH_MODE = $save; + return $arr; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $parent = $this->pdoDriver; + return $parent->GetCol($this->metaTablesSQL); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-postgres.inc.php b/fannie/adodb5/drivers/adodb-postgres.inc.php new file mode 100644 index 000000000..491e4ccdb --- /dev/null +++ b/fannie/adodb5/drivers/adodb-postgres.inc.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-postgres64.inc.php b/fannie/adodb5/drivers/adodb-postgres64.inc.php new file mode 100644 index 000000000..1444d02dc --- /dev/null +++ b/fannie/adodb5/drivers/adodb-postgres64.inc.php @@ -0,0 +1,1071 @@ + + jlim - changed concat operator to || and data types to MetaType to match documented pgsql types + see http://www.postgresql.org/devel-corner/docs/postgres/datatype.htm + 22 Nov 2000 jlim - added changes to FetchField() and MetaTables() contributed by "raser" + 27 Nov 2000 jlim - added changes to _connect/_pconnect from ideas by "Lennie" + 15 Dec 2000 jlim - added changes suggested by Additional code changes by "Eric G. Werk" egw@netguide.dk. + 31 Jan 2002 jlim - finally installed postgresql. testing + 01 Mar 2001 jlim - Freek Dijkstra changes, also support for text type + + See http://www.varlena.com/varlena/GeneralBits/47.php + + -- What indexes are on my table? + select * from pg_indexes where tablename = 'tablename'; + + -- What triggers are on my table? + select c.relname as "Table", t.tgname as "Trigger Name", + t.tgconstrname as "Constraint Name", t.tgenabled as "Enabled", + t.tgisconstraint as "Is Constraint", cc.relname as "Referenced Table", + p.proname as "Function Name" + from pg_trigger t, pg_class c, pg_class cc, pg_proc p + where t.tgfoid = p.oid and t.tgrelid = c.oid + and t.tgconstrrelid = cc.oid + and c.relname = 'tablename'; + + -- What constraints are on my table? + select r.relname as "Table", c.conname as "Constraint Name", + contype as "Constraint Type", conkey as "Key Columns", + confkey as "Foreign Columns", consrc as "Source" + from pg_class r, pg_constraint c + where r.oid = c.conrelid + and relname = 'tablename'; + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +function adodb_addslashes($s) +{ + $len = strlen($s); + if ($len == 0) return "''"; + if (strncmp($s,"'",1) === 0 && substr($s,$len-1) == "'") return $s; // already quoted + + return "'".addslashes($s)."'"; +} + +class ADODB_postgres64 extends ADOConnection{ + var $databaseType = 'postgres64'; + var $dataProvider = 'postgres'; + var $hasInsertID = true; + var $_resultid = false; + var $concat_operator='||'; + var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1"; + var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages', + 'sql_packages', 'sql_sizing', 'sql_sizing_profiles') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%'"; + //"select tablename from pg_tables where tablename not like 'pg_%' order by 1"; + var $isoDates = true; // accepts dates in ISO format + var $sysDate = "CURRENT_DATE"; + var $sysTimeStamp = "CURRENT_TIMESTAMP"; + var $blobEncodeType = 'C'; + var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum + FROM pg_class c, pg_attribute a,pg_type t + WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%' +AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // used when schema defined + var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum +FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n +WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) + and c.relnamespace=n.oid and n.nspname='%s' + and a.attname not like '....%%' AND a.attnum > 0 + AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // get primary key etc -- from Freek Dijkstra + var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key + FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'"; + + var $hasAffectedRows = true; + var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + // below suggested by Freek Dijkstra + var $true = 'TRUE'; // string that represents TRUE for a database + var $false = 'FALSE'; // string that represents FALSE for a database + var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d H:i:s'"; // used by DBTimeStamp as the default timestamp fmt. + var $hasMoveFirst = true; + var $hasGenID = true; + var $_genIDSQL = "SELECT NEXTVAL('%s')"; + var $_genSeqSQL = "CREATE SEQUENCE %s START %s"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum"; + var $random = 'random()'; /// random function + var $autoRollback = true; // apparently pgsql does not autorollback properly before php 4.3.4 + // http://bugs.php.net/bug.php?id=25404 + + var $uniqueIisR = true; + var $_bindInputArray = false; // requires postgresql 7.3+ and ability to modify database + var $disableBlobs = false; // set to true to disable blob checking, resulting in 2-5% improvement in performance. + + // The last (fmtTimeStamp is not entirely correct: + // PostgreSQL also has support for time zones, + // and writes these time in this format: "2001-03-01 18:59:26+02". + // There is no code for the "+02" time zone information, so I just left that out. + // I'm not familiar enough with both ADODB as well as Postgres + // to know what the concequences are. The other values are correct (wheren't in 0.94) + // -- Freek Dijkstra + + function ADODB_postgres64() + { + // changes the metaColumnsSQL, adds columns: attnum[6] + } + + function ServerInfo() + { + if (isset($this->version)) return $this->version; + + $arr['description'] = $this->GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + $this->version = $arr; + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " coalesce($field, $ifNull) "; + } + + // get the last id - never tested + function pg_insert_id($tablename,$fieldname) + { + $result=pg_exec($this->_connectionID, "SELECT last_value FROM ${tablename}_${fieldname}_seq"); + if ($result) { + $arr = @pg_fetch_row($result,0); + pg_freeresult($result); + if (isset($arr[0])) return $arr[0]; + } + return false; + } + +/* Warning from http://www.php.net/manual/function.pg-getlastoid.php: +Using a OID as a unique identifier is not generally wise. +Unless you are very careful, you might end up with a tuple having +a different OID if a database must be reloaded. */ + function _insertid($table,$column) + { + if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false; + $oid = pg_getlastoid($this->_resultid); + // to really return the id, we need the table and column-name, else we can only return the oid != id + return empty($table) || empty($column) ? $oid : $this->GetOne("SELECT $column FROM $table WHERE oid=".(int)$oid); + } + +// I get this error with PHP before 4.0.6 - jlim +// Warning: This compilation does not support pg_cmdtuples() in adodb-postgres.inc.php on line 44 + function _affectedrows() + { + if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false; + return pg_cmdtuples($this->_resultid); + } + + + // returns true/false + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + return @pg_Exec($this->_connectionID, "begin ".$this->_transmode); + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if (!$this->transCnt) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + // returns true/false. + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + $this->transCnt -= 1; + return @pg_Exec($this->_connectionID, "commit"); + } + + // returns true/false + function RollbackTrans() + { + if ($this->transOff) return true; + $this->transCnt -= 1; + return @pg_Exec($this->_connectionID, "rollback"); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $info = $this->ServerInfo(); + if ($info['version'] >= 7.3) { + $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and schemaname not in ( 'pg_catalog','information_schema') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') "; + } + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtolower($mask)); + if ($info['version']>=7.3) + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema') + union +select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') "; + else + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask + union +select viewname,'V' from pg_views where viewname like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + + // if magic quotes disabled, use pg_escape_string() + function qstr($s,$magic_quotes=false) + { + if (is_bool($s)) return $s ? 'true' : 'false'; + + if (!$magic_quotes) { + if (ADODB_PHPVER >= 0x5200) { + return "'".pg_escape_string($this->_connectionID,$s)."'"; + } + if (ADODB_PHPVER >= 0x4200) { + return "'".pg_escape_string($s)."'"; + } + if ($this->replaceQuote[0] == '\\'){ + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\\000"),$s); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + return "'$s'"; + } + + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'TO_CHAR('.$col.",'"; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= 'YYYY'; + break; + case 'Q': + case 'q': + $s .= 'Q'; + break; + + case 'M': + $s .= 'Mon'; + break; + + case 'm': + $s .= 'MM'; + break; + case 'D': + case 'd': + $s .= 'DD'; + break; + + case 'H': + $s.= 'HH24'; + break; + + case 'h': + $s .= 'HH'; + break; + + case 'i': + $s .= 'MI'; + break; + + case 's': + $s .= 'SS'; + break; + + case 'a': + case 'A': + $s .= 'AM'; + break; + + case 'w': + $s .= 'D'; + break; + + case 'l': + $s .= 'DAY'; + break; + + case 'W': + $s .= 'WW'; + break; + + default: + // handle escape characters... + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; + else $s .= '"'.$ch.'"'; + + } + } + return $s. "')"; + } + + + + /* + * Load a Large Object from a file + * - the procedure stores the object id in the table and imports the object using + * postgres proprietary blob handling routines + * + * contributed by Mattia Rossi mattia@technologist.com + * modified for safe mode by juraj chlebec + */ + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + pg_exec ($this->_connectionID, "begin"); + + $fd = fopen($path,'r'); + $contents = fread($fd,filesize($path)); + fclose($fd); + + $oid = pg_lo_create($this->_connectionID); + $handle = pg_lo_open($this->_connectionID, $oid, 'w'); + pg_lo_write($handle, $contents); + pg_lo_close($handle); + + // $oid = pg_lo_import ($path); + pg_exec($this->_connectionID, "commit"); + $rs = ADOConnection::UpdateBlob($table,$column,$oid,$where,$blobtype); + $rez = !empty($rs); + return $rez; + } + + /* + * Deletes/Unlinks a Blob from the database, otherwise it + * will be left behind + * + * Returns TRUE on success or FALSE on failure. + * + * contributed by Todd Rogers todd#windfox.net + */ + function BlobDelete( $blob ) + { + pg_exec ($this->_connectionID, "begin"); + $result = @pg_lo_unlink($blob); + pg_exec ($this->_connectionID, "commit"); + return( $result ); + } + + /* + Hueristic - not guaranteed to work. + */ + function GuessOID($oid) + { + if (strlen($oid)>16) return false; + return is_numeric($oid); + } + + /* + * If an OID is detected, then we use pg_lo_* to open the oid file and read the + * real blob from the db using the oid supplied as a parameter. If you are storing + * blobs using bytea, we autodetect and process it so this function is not needed. + * + * contributed by Mattia Rossi mattia@technologist.com + * + * see http://www.postgresql.org/idocs/index.php?largeobjects.html + * + * Since adodb 4.54, this returns the blob, instead of sending it to stdout. Also + * added maxsize parameter, which defaults to $db->maxblobsize if not defined. + */ + function BlobDecode($blob,$maxsize=false,$hastrans=true) + { + if (!$this->GuessOID($blob)) return $blob; + + if ($hastrans) @pg_exec($this->_connectionID,"begin"); + $fd = @pg_lo_open($this->_connectionID,$blob,"r"); + if ($fd === false) { + if ($hastrans) @pg_exec($this->_connectionID,"commit"); + return $blob; + } + if (!$maxsize) $maxsize = $this->maxblobsize; + $realblob = @pg_loread($fd,$maxsize); + @pg_loclose($fd); + if ($hastrans) @pg_exec($this->_connectionID,"commit"); + return $realblob; + } + + /* + See http://www.postgresql.org/idocs/index.php?datatype-binary.html + + NOTE: SQL string literals (input strings) must be preceded with two backslashes + due to the fact that they must pass through two parsers in the PostgreSQL + backend. + */ + function BlobEncode($blob) + { + if (ADODB_PHPVER >= 0x5200) return pg_escape_bytea($this->_connectionID, $blob); + if (ADODB_PHPVER >= 0x4200) return pg_escape_bytea($blob); + + /*92=backslash, 0=null, 39=single-quote*/ + $badch = array(chr(92),chr(0),chr(39)); # \ null ' + $fixch = array('\\\\134','\\\\000','\\\\047'); + return adodb_str_replace($badch,$fixch,$blob); + + // note that there is a pg_escape_bytea function only for php 4.2.0 or later + } + + // assumes bytea for blob, and varchar for clob + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + if ($blobtype == 'CLOB') { + return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where"); + } + // do not use bind params which uses qstr(), as blobencode() already quotes data + return $this->Execute("UPDATE $table SET $column='".$this->BlobEncode($val)."'::bytea WHERE $where"); + } + + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + else if (strncmp($date,"'",1) == 0) { + $len = strlen($date); + if (10 <= $len && $len <= 12) $date = 'date '.$date; + else $date = 'timestamp '.$date; + } + + + return "($date+interval'".($dayFraction * 1440)." minutes')"; + #return "($date+interval'$dayFraction days')"; + } + + + // for schema support, pass in the $table param "$schema.$tabname". + // converts field names to lowercase, $upper is ignored + // see http://phplens.com/lens/lensforum/msgs.php?id=14018 for more info + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $false = false; + $this->_findschema($table,$schema); + + if ($normalize) $table = strtolower($table); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema)); + else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) { + return $false; + } + if (!empty($this->metaKeySQL)) { + // If we want the primary keys, we have to issue a separate query + // Of course, a modified version of the metaColumnsSQL query using a + // LEFT JOIN would have been much more elegant, but postgres does + // not support OUTER JOINS. So here is the clumsy way. + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + $rskey = $this->Execute(sprintf($this->metaKeySQL,($table))); + // fetch all result in once for performance. + $keys = $rskey->GetArray(); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + $rskey->Close(); + unset($rskey); + } + + $rsdefa = array(); + if (!empty($this->metaDefaultsSQL)) { + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $sql = sprintf($this->metaDefaultsSQL, ($table)); + $rsdef = $this->Execute($sql); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rsdef) { + while (!$rsdef->EOF) { + $num = $rsdef->fields['num']; + $s = $rsdef->fields['def']; + if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */ + $s = substr($s, 1); + $s = substr($s, 0, strlen($s) - 1); + } + + $rsdefa[$num] = $s; + $rsdef->MoveNext(); + } + } else { + ADOConnection::outp( "==> SQL => " . $sql); + } + unset($rsdef); + } + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + $fld->attnum = $rs->fields[6]; + + if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4; + if ($fld->max_length <= 0) $fld->max_length = -1; + if ($fld->type == 'numeric') { + $fld->scale = $fld->max_length & 0xFFFF; + $fld->max_length >>= 16; + } + // dannym + // 5 hasdefault; 6 num-of-column + $fld->has_default = ($rs->fields[5] == 't'); + if ($fld->has_default) { + $fld->default_value = $rsdefa[$rs->fields[6]]; + } + + //Freek + $fld->not_null = $rs->fields[4] == 't'; + + + // Freek + if (is_array($keys)) { + foreach($keys as $key) { + if ($fld->name == $key['column_name'] AND $key['primary_key'] == 't') + $fld->primary_key = true; + if ($fld->name == $key['column_name'] AND $key['unique_key'] == 't') + $fld->unique = true; // What name is more compatible? + } + } + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) + return $false; + else + return $retarr; + + } + + function MetaIndexes ($table, $primary = FALSE) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $this->_findschema($table,$schema); + + if ($schema) { // requires pgsql 7.3+ - pg_namespace used. + $sql = ' +SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns" +FROM pg_catalog.pg_class c +JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid +JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid + ,pg_namespace n +WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\')) and c.relnamespace=c2.relnamespace and c.relnamespace=n.oid and n.nspname=\'%s\''; + } else { + $sql = ' +SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns" +FROM pg_catalog.pg_class c +JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid +JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid +WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))'; + } + + if ($primary == FALSE) { + $sql .= ' AND i.indisprimary=false;'; + } + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute(sprintf($sql,$table,$table,$schema)); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + $false = false; + return $false; + } + + $col_names = $this->MetaColumnNames($table,true,true); + //3rd param is use attnum, + // see http://sourceforge.net/tracker/index.php?func=detail&aid=1451245&group_id=42718&atid=433976 + $indexes = array(); + while ($row = $rs->FetchRow()) { + $columns = array(); + foreach (explode(' ', $row[2]) as $col) { + $columns[] = $col_names[$col]; + } + + $indexes[$row[0]] = array( + 'unique' => ($row[1] == 't'), + 'columns' => $columns + ); + } + return $indexes; + } + + // returns true or false + // + // examples: + // $db->Connect("host=host1 user=user1 password=secret port=4341"); + // $db->Connect('host1','user1','secret'); + function _connect($str,$user='',$pwd='',$db='',$ctype=0) + { + + if (!function_exists('pg_connect')) return null; + + $this->_errorMsg = false; + + if ($user || $pwd || $db) { + $user = adodb_addslashes($user); + $pwd = adodb_addslashes($pwd); + if (strlen($db) == 0) $db = 'template1'; + $db = adodb_addslashes($db); + if ($str) { + $host = split(":", $str); + if ($host[0]) $str = "host=".adodb_addslashes($host[0]); + else $str = ''; + if (isset($host[1])) $str .= " port=$host[1]"; + else if (!empty($this->port)) $str .= " port=".$this->port; + } + if ($user) $str .= " user=".$user; + if ($pwd) $str .= " password=".$pwd; + if ($db) $str .= " dbname=".$db; + } + + //if ($user) $linea = "user=$user host=$linea password=$pwd dbname=$db port=5432"; + + if ($ctype === 1) { // persistent + $this->_connectionID = pg_pconnect($str); + } else { + if ($ctype === -1) { // nconnect, we trick pgsql ext by changing the connection str + static $ncnt; + + if (empty($ncnt)) $ncnt = 1; + else $ncnt += 1; + + $str .= str_repeat(' ',$ncnt); + } + $this->_connectionID = pg_connect($str); + } + if ($this->_connectionID === false) return false; + $this->Execute("set datestyle='ISO'"); + + $info = $this->ServerInfo(); + $this->pgVersion = (float) substr($info['version'],0,3); + if ($this->pgVersion >= 7.1) { // good till version 999 + $this->_nestedSQL = true; + } + return true; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName,-1); + } + + // returns true or false + // + // examples: + // $db->PConnect("host=host1 user=user1 password=secret port=4341"); + // $db->PConnect('host1','user1','secret'); + function _pconnect($str,$user='',$pwd='',$db='') + { + return $this->_connect($str,$user,$pwd,$db,1); + } + + + // returns queryID or false + function _query($sql,$inputarr=false) + { + $this->_errorMsg = false; + if ($inputarr) { + /* + It appears that PREPARE/EXECUTE is slower for many queries. + + For query executed 1000 times: + "select id,firstname,lastname from adoxyz + where firstname not like ? and lastname not like ? and id = ?" + + with plan = 1.51861286163 secs + no plan = 1.26903700829 secs + + + + */ + $plan = 'P'.md5($sql); + + $execp = ''; + foreach($inputarr as $v) { + if ($execp) $execp .= ','; + if (is_string($v)) { + if (strncmp($v,"'",1) !== 0) $execp .= $this->qstr($v); + } else { + $execp .= $v; + } + } + + if ($execp) $exsql = "EXECUTE $plan ($execp)"; + else $exsql = "EXECUTE $plan"; + + + $rez = @pg_exec($this->_connectionID,$exsql); + if (!$rez) { + # Perhaps plan does not exist? Prepare/compile plan. + $params = ''; + foreach($inputarr as $v) { + if ($params) $params .= ','; + if (is_string($v)) { + $params .= 'VARCHAR'; + } else if (is_integer($v)) { + $params .= 'INTEGER'; + } else { + $params .= "REAL"; + } + } + $sqlarr = explode('?',$sql); + //print_r($sqlarr); + $sql = ''; + $i = 1; + foreach($sqlarr as $v) { + $sql .= $v.' $'.$i; + $i++; + } + $s = "PREPARE $plan ($params) AS ".substr($sql,0,strlen($sql)-2); + //adodb_pr($s); + $rez = pg_exec($this->_connectionID,$s); + //echo $this->ErrorMsg(); + } + if ($rez) + $rez = pg_exec($this->_connectionID,$exsql); + } else { + //adodb_backtrace(); + $rez = pg_exec($this->_connectionID,$sql); + } + // check if no data returned, then no need to create real recordset + if ($rez && pg_numfields($rez) <= 0) { + if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') { + pg_freeresult($this->_resultid); + } + $this->_resultid = $rez; + return true; + } + + return $rez; + } + + function _errconnect() + { + if (defined('DB_ERROR_CONNECT_FAILED')) return DB_ERROR_CONNECT_FAILED; + else return 'Database connection failed'; + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (ADODB_PHPVER >= 0x4300) { + if (!empty($this->_resultid)) { + $this->_errorMsg = @pg_result_error($this->_resultid); + if ($this->_errorMsg) return $this->_errorMsg; + } + + if (!empty($this->_connectionID)) { + $this->_errorMsg = @pg_last_error($this->_connectionID); + } else $this->_errorMsg = $this->_errconnect(); + } else { + if (empty($this->_connectionID)) $this->_errconnect(); + else $this->_errorMsg = @pg_errormessage($this->_connectionID); + } + return $this->_errorMsg; + } + + function ErrorNo() + { + $e = $this->ErrorMsg(); + if (strlen($e)) { + return ADOConnection::MetaError($e); + } + return 0; + } + + // returns true or false + function _close() + { + if ($this->transCnt) $this->RollbackTrans(); + if ($this->_resultid) { + @pg_freeresult($this->_resultid); + $this->_resultid = false; + } + @pg_close($this->_connectionID); + $this->_connectionID = false; + return true; + } + + + /* + * Maximum size of C field + */ + function CharMax() + { + return 1000000000; // should be 1 Gb? + } + + /* + * Maximum size of X field + */ + function TextMax() + { + return 1000000000; // should be 1 Gb? + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_postgres64 extends ADORecordSet{ + var $_blobArr; + var $databaseType = "postgres64"; + var $canSeek = true; + function ADORecordSet_postgres64($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = PGSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function GetRowAssoc($upper=true) + { + if ($this->fetchMode == PGSQL_ASSOC && !$upper) return $this->fields; + $row = ADORecordSet::GetRowAssoc($upper); + return $row; + } + + function _initrs() + { + global $ADODB_COUNTRECS; + $qid = $this->_queryID; + $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($qid):-1; + $this->_numOfFields = @pg_numfields($qid); + + // cache types for blob decode check + // apparently pg_fieldtype actually performs an sql query on the database to get the type. + if (empty($this->connection->noBlobs)) + for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { + if (pg_fieldtype($qid,$i) == 'bytea') { + $this->_blobArr[$i] = pg_fieldname($qid,$i); + } + } + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != PGSQL_NUM) return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function FetchField($off = 0) + { + // offsets begin at 0 + + $o= new ADOFieldObject(); + $o->name = @pg_fieldname($this->_queryID,$off); + $o->type = @pg_fieldtype($this->_queryID,$off); + $o->max_length = @pg_fieldsize($this->_queryID,$off); + return $o; + } + + function _seek($row) + { + return @pg_fetch_row($this->_queryID,$row); + } + + function _decode($blob) + { + if ($blob === NULL) return NULL; + eval('$realblob="'.adodb_str_replace(array('"','$'),array('\"','\$'),$blob).'";'); + return $realblob; + } + + function _fixblobs() + { + if ($this->fetchMode == PGSQL_NUM || $this->fetchMode == PGSQL_BOTH) { + foreach($this->_blobArr as $k => $v) { + $this->fields[$k] = ADORecordSet_postgres64::_decode($this->fields[$k]); + } + } + if ($this->fetchMode == PGSQL_ASSOC || $this->fetchMode == PGSQL_BOTH) { + foreach($this->_blobArr as $k => $v) { + $this->fields[$v] = ADORecordSet_postgres64::_decode($this->fields[$v]); + } + } + } + + // 10% speedup to move MoveNext to child class + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + if (is_array($this->fields) && $this->fields) { + if (isset($this->_blobArr)) $this->_fixblobs(); + return true; + } + } + $this->fields = false; + $this->EOF = true; + } + return false; + } + + function _fetch() + { + + if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) + return false; + + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); + + return (is_array($this->fields)); + } + + function _close() + { + return @pg_freeresult($this->_queryID); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'MONEY': // stupid, postgres expects money to be a string + case 'INTERVAL': + case 'CHAR': + case 'CHARACTER': + case 'VARCHAR': + case 'NAME': + case 'BPCHAR': + case '_VARCHAR': + case 'INET': + case 'MACADDR': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + return 'X'; + + case 'IMAGE': // user defined type + case 'BLOB': // user defined type + case 'BIT': // This is a bit string, not a single bit, so don't return 'L' + case 'VARBIT': + case 'BYTEA': + return 'B'; + + case 'BOOL': + case 'BOOLEAN': + return 'L'; + + case 'DATE': + return 'D'; + + + case 'TIMESTAMP WITHOUT TIME ZONE': + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + case 'TIMESTAMPTZ': + return 'T'; + + case 'SMALLINT': + case 'BIGINT': + case 'INTEGER': + case 'INT8': + case 'INT4': + case 'INT2': + if (isset($fieldobj) && + empty($fieldobj->primary_key) && (!$this->uniqueIisR || empty($fieldobj->unique))) return 'I'; + + case 'OID': + case 'SERIAL': + return 'R'; + + default: + return 'N'; + } + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-postgres7.inc.php b/fannie/adodb5/drivers/adodb-postgres7.inc.php new file mode 100644 index 000000000..191ee3608 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-postgres7.inc.php @@ -0,0 +1,313 @@ +ADODB_postgres64(); + if (ADODB_ASSOC_CASE !== 2) { + $this->rsPrefix .= 'assoc_'; + } + $this->_bindInputArray = PHP_VERSION >= 5.1; + } + + + // the following should be compat with postgresql 7.2, + // which makes obsolete the LIMIT limit,offset syntax + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : ''; + $limitStr = ($nrows >= 0) ? " LIMIT ".((integer)$nrows) : ''; + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + /* + function Prepare($sql) + { + $info = $this->ServerInfo(); + if ($info['version']>=7.3) { + return array($sql,false); + } + return $sql; + } + */ + + /* + I discovered that the MetaForeignKeys method no longer worked for Postgres 8.3. + I went ahead and modified it to work for both 8.2 and 8.3. + Please feel free to include this change in your next release of adodb. + William Kolodny [William.Kolodny#gt-t.net] + */ + function MetaForeignKeys($table, $owner=false, $upper=false) + { + $sql=" + SELECT fum.ftblname AS lookup_table, split_part(fum.rf, ')'::text, 1) AS lookup_field, + fum.ltable AS dep_table, split_part(fum.lf, ')'::text, 1) AS dep_field + FROM ( + SELECT fee.ltable, fee.ftblname, fee.consrc, split_part(fee.consrc,'('::text, 2) AS lf, + split_part(fee.consrc, '('::text, 3) AS rf + FROM ( + SELECT foo.relname AS ltable, foo.ftblname, + pg_get_constraintdef(foo.oid) AS consrc + FROM ( + SELECT c.oid, c.conname AS name, t.relname, ft.relname AS ftblname + FROM pg_constraint c + JOIN pg_class t ON (t.oid = c.conrelid) + JOIN pg_class ft ON (ft.oid = c.confrelid) + JOIN pg_namespace nft ON (nft.oid = ft.relnamespace) + LEFT JOIN pg_description ds ON (ds.objoid = c.oid) + JOIN pg_namespace n ON (n.oid = t.relnamespace) + WHERE c.contype = 'f'::\"char\" + ORDER BY t.relname, n.nspname, c.conname, c.oid + ) foo + ) fee) fum + WHERE fum.ltable='".strtolower($table)."' + ORDER BY fum.ftblname, fum.ltable, split_part(fum.lf, ')'::text, 1) + "; + $rs = $this->Execute($sql); + + if (!$rs || $rs->EOF) return false; + + $a = array(); + while (!$rs->EOF) { + if ($upper) { + $a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'))); + } else { + $a[$rs->Fields('lookup_table')][] = str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')); + } + $rs->MoveNext(); + } + + return $a; + + } + + // from Edward Jaramilla, improved version - works on pg 7.4 + function _old_MetaForeignKeys($table, $owner=false, $upper=false) + { + $sql = 'SELECT t.tgargs as args + FROM + pg_trigger t,pg_class c,pg_proc p + WHERE + t.tgenabled AND + t.tgrelid = c.oid AND + t.tgfoid = p.oid AND + p.proname = \'RI_FKey_check_ins\' AND + c.relname = \''.strtolower($table).'\' + ORDER BY + t.tgrelid'; + + $rs = $this->Execute($sql); + + if (!$rs || $rs->EOF) return false; + + $arr = $rs->GetArray(); + $a = array(); + foreach($arr as $v) { + $data = explode(chr(0), $v['args']); + $size = count($data)-1; //-1 because the last node is empty + for($i = 4; $i < $size; $i++) { + if ($upper) + $a[strtoupper($data[2])][] = strtoupper($data[$i].'='.$data[++$i]); + else + $a[$data[2]][] = $data[$i].'='.$data[++$i]; + } + } + return $a; + } + + function _query($sql,$inputarr=false) + { + if (! $this->_bindInputArray) { + // We don't have native support for parameterized queries, so let's emulate it at the parent + return ADODB_postgres64::_query($sql, $inputarr); + } + $this->_errorMsg = false; + // -- added Cristiano da Cunha Duarte + if ($inputarr) { + $sqlarr = explode('?',trim($sql)); + $sql = ''; + $i = 1; + $last = sizeof($sqlarr)-1; + foreach($sqlarr as $v) { + if ($last < $i) $sql .= $v; + else $sql .= $v.' $'.$i; + $i++; + } + + $rez = pg_query_params($this->_connectionID,$sql, $inputarr); + } else { + $rez = pg_query($this->_connectionID,$sql); + } + // check if no data returned, then no need to create real recordset + if ($rez && pg_numfields($rez) <= 0) { + if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') { + pg_freeresult($this->_resultid); + } + $this->_resultid = $rez; + return true; + } + return $rez; + } + + // this is a set of functions for managing client encoding - very important if the encodings + // of your database and your output target (i.e. HTML) don't match + //for instance, you may have UNICODE database and server it on-site as WIN1251 etc. + // GetCharSet - get the name of the character set the client is using now + // the functions should work with Postgres 7.0 and above, the set of charsets supported + // depends on compile flags of postgres distribution - if no charsets were compiled into the server + // it will return 'SQL_ANSI' always + function GetCharSet() + { + //we will use ADO's builtin property charSet + $this->charSet = @pg_client_encoding($this->_connectionID); + if (!$this->charSet) { + return false; + } else { + return $this->charSet; + } + } + + // SetCharSet - switch the client encoding + function SetCharSet($charset_name) + { + $this->GetCharSet(); + if ($this->charSet !== $charset_name) { + $if = pg_set_client_encoding($this->_connectionID, $charset_name); + if ($if == "0" & $this->GetCharSet() == $charset_name) { + return true; + } else return false; + } else return true; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_postgres7 extends ADORecordSet_postgres64{ + + var $databaseType = "postgres7"; + + + function ADORecordSet_postgres7($queryID,$mode=false) + { + $this->ADORecordSet_postgres64($queryID,$mode); + } + + // 10% speedup to move MoveNext to child class + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if (is_array($this->fields)) { + if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); + return true; + } + } + $this->fields = false; + $this->EOF = true; + } + return false; + } + +} + +class ADORecordSet_assoc_postgres7 extends ADORecordSet_postgres64{ + + var $databaseType = "postgres7"; + + + function ADORecordSet_assoc_postgres7($queryID,$mode=false) + { + $this->ADORecordSet_postgres64($queryID,$mode); + } + + function _fetch() + { + if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) + return false; + + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if ($this->fields) { + if (isset($this->_blobArr)) $this->_fixblobs(); + $this->_updatefields(); + } + + return (is_array($this->fields)); + } + + // Create associative array + function _updatefields() + { + if (ADODB_ASSOC_CASE == 2) return; // native + + $arr = array(); + $lowercase = (ADODB_ASSOC_CASE == 0); + + foreach($this->fields as $k => $v) { + if (is_integer($k)) $arr[$k] = $v; + else { + if ($lowercase) + $arr[strtolower($k)] = $v; + else + $arr[strtoupper($k)] = $v; + } + } + $this->fields = $arr; + } + + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if (is_array($this->fields)) { + if ($this->fields) { + if (isset($this->_blobArr)) $this->_fixblobs(); + + $this->_updatefields(); + } + return true; + } + } + + + $this->fields = false; + $this->EOF = true; + } + return false; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-postgres8.inc.php b/fannie/adodb5/drivers/adodb-postgres8.inc.php new file mode 100644 index 000000000..05a705eb8 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-postgres8.inc.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-proxy.inc.php b/fannie/adodb5/drivers/adodb-proxy.inc.php new file mode 100644 index 000000000..f7c5c4c78 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-proxy.inc.php @@ -0,0 +1,33 @@ +ADORecordset($id,$mode); + } + }; +} // define + +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-sapdb.inc.php b/fannie/adodb5/drivers/adodb-sapdb.inc.php new file mode 100644 index 000000000..5a9aa6a74 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-sapdb.inc.php @@ -0,0 +1,184 @@ +curmode = SQL_CUR_USE_ODBC; + $this->ADODB_odbc(); + } + + function ServerInfo() + { + $info = ADODB_odbc::ServerInfo(); + if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) { + $info['version'] = $matches[1]; + } + return $info; + } + + function MetaPrimaryKeys($table) + { + $table = $this->Quote(strtoupper($table)); + + return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"); + } + + function MetaIndexes ($table, $primary = FALSE) + { + $table = $this->Quote(strtoupper($table)); + + $sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ". + " WHERE TABLENAME=$table". + " ORDER BY INDEXNAME,COLUMNNO"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + $indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE'; + $indexes[$row[0]]['columns'][] = $row[2]; + } + if ($primary) { + $indexes['SYSPRIMARYKEYINDEX'] = array( + 'unique' => True, // by definition + 'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"), + ); + } + return $indexes; + } + + function MetaColumns ($table) + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $table = $this->Quote(strtoupper($table)); + + $retarr = array(); + foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column) + { + $fld = new ADOFieldObject(); + $fld->name = $column[0]; + $fld->type = $column[1]; + $fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2]; + $fld->scale = $column[3]; + $fld->not_null = $column[4] == 'NO'; + $fld->primary_key = $column[5] == 'KEY'; + if ($fld->has_default = $column[7]) { + if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') { + $fld->auto_increment = true; + $fld->has_default = false; + } else { + $fld->default_value = $column[6]; + switch($fld->type) { + case 'VARCHAR': + case 'CHARACTER': + case 'LONG': + $fld->default_value = $column[6]; + break; + default: + $fld->default_value = trim($column[6]); + break; + } + } + } + $retarr[$fld->name] = $fld; + } + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + return $retarr; + } + + function MetaColumnNames($table) + { + $table = $this->Quote(strtoupper($table)); + + return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos"); + } + + // unlike it seems, this depends on the db-session and works in a multiuser environment + function _insertid($table,$column) + { + return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL"); + } + + /* + SelectLimit implementation problems: + + The following will return random 10 rows as order by performed after "WHERE rowno<10" + which is not ideal... + + select * from table where rowno < 10 order by 1 + + This means that we have to use the adoconnection base class SelectLimit when + there is an "order by". + + See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html + */ + +}; + + +class ADORecordSet_sapdb extends ADORecordSet_odbc { + + var $databaseType = "sapdb"; + + function ADORecordSet_sapdb($id,$mode=false) + { + $this->ADORecordSet_odbc($id,$mode); + } +} + +} //define +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-sqlanywhere.inc.php b/fannie/adodb5/drivers/adodb-sqlanywhere.inc.php new file mode 100644 index 000000000..222932308 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-sqlanywhere.inc.php @@ -0,0 +1,169 @@ +create_blobvar($blobVarName); + + b) load blob var from file. $filename must be complete path + + $dbcon->load_blobvar_from_file($blobVarName, $filename); + + c) Use the $blobVarName in SQL insert or update statement in the values + clause: + + $recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) ' + . + 'VALUES (\'test\', ' . $blobVarName . ')'); + + instead of loading blob from a file, you can also load from + an unformatted (raw) blob variable: + $dbcon->load_blobvar_from_var($blobVarName, $varName); + + d) drop blob variable on db server to free up resources: + $dbconn->drop_blobvar($blobVarName); + + Sybase_SQLAnywhere data driver. Requires ODBC. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} + +if (!defined('ADODB_SYBASE_SQLANYWHERE')){ + + define('ADODB_SYBASE_SQLANYWHERE',1); + + class ADODB_sqlanywhere extends ADODB_odbc { + var $databaseType = "sqlanywhere"; + var $hasInsertID = true; + + function ADODB_sqlanywhere() + { + $this->ADODB_odbc(); + } + + function _insertid() { + return $this->GetOne('select @@identity'); + } + + function create_blobvar($blobVarName) { + $this->Execute("create variable $blobVarName long binary"); + return; + } + + function drop_blobvar($blobVarName) { + $this->Execute("drop variable $blobVarName"); + return; + } + + function load_blobvar_from_file($blobVarName, $filename) { + $chunk_size = 1000; + + $fd = fopen ($filename, "rb"); + + $integer_chunks = (integer)filesize($filename) / $chunk_size; + $modulus = filesize($filename) % $chunk_size; + if ($modulus != 0){ + $integer_chunks += 1; + } + + for($loop=1;$loop<=$integer_chunks;$loop++){ + $contents = fread ($fd, $chunk_size); + $contents = bin2hex($contents); + + $hexstring = ''; + + for($loop2=0;$loop2qstr($hexstring); + + $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); + } + + fclose ($fd); + return; + } + + function load_blobvar_from_var($blobVarName, &$varName) { + $chunk_size = 1000; + + $integer_chunks = (integer)strlen($varName) / $chunk_size; + $modulus = strlen($varName) % $chunk_size; + if ($modulus != 0){ + $integer_chunks += 1; + } + + for($loop=1;$loop<=$integer_chunks;$loop++){ + $contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size); + $contents = bin2hex($contents); + + $hexstring = ''; + + for($loop2=0;$loop2qstr($hexstring); + + $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); + } + + return; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB') + { + $blobVarName = 'hold_blob'; + $this->create_blobvar($blobVarName); + $this->load_blobvar_from_var($blobVarName, $val); + $this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where"); + $this->drop_blobvar($blobVarName); + return true; + } + }; //class + + class ADORecordSet_sqlanywhere extends ADORecordSet_odbc { + + var $databaseType = "sqlanywhere"; + + function ADORecordSet_sqlanywhere($id,$mode=false) + { + $this->ADORecordSet_odbc($id,$mode); + } + + + }; //class + + +} //define +?> diff --git a/fannie/adodb5/drivers/adodb-sqlite.inc.php b/fannie/adodb5/drivers/adodb-sqlite.inc.php new file mode 100644 index 000000000..94fb156bb --- /dev/null +++ b/fannie/adodb5/drivers/adodb-sqlite.inc.php @@ -0,0 +1,398 @@ +fmtDate)."'"; + case 'sysTimeStamp' : return "'".date($this->sysTimeStamp)."'"; + } + }*/ + + function ServerInfo() + { + $arr['version'] = sqlite_libversion(); + $arr['description'] = 'SQLite '; + $arr['encoding'] = sqlite_libencoding(); + return $arr; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $ret = $this->Execute("BEGIN TRANSACTION"); + $this->transCnt += 1; + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + $ret = $this->Execute("COMMIT"); + if ($this->transCnt>0)$this->transCnt -= 1; + return !empty($ret); + } + + function RollbackTrans() + { + if ($this->transOff) return true; + $ret = $this->Execute("ROLLBACK"); + if ($this->transCnt>0)$this->transCnt -= 1; + return !empty($ret); + } + + // mark newnham + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute("PRAGMA table_info('$table')"); + if (isset($savem)) $this->SetFetchMode($savem); + if (!$rs) { + $ADODB_FETCH_MODE = $save; + return $false; + } + $arr = array(); + while ($r = $rs->FetchRow()) { + $type = explode('(',$r['type']); + $size = ''; + if (sizeof($type)==2) + $size = trim($type[1],')'); + $fn = strtoupper($r['name']); + $fld = new ADOFieldObject; + $fld->name = $r['name']; + $fld->type = $type[0]; + $fld->max_length = $size; + $fld->not_null = $r['notnull']; + $fld->default_value = $r['dflt_value']; + $fld->scale = 0; + if ($save == ADODB_FETCH_NUM) $arr[] = $fld; + else $arr[strtoupper($fld->name)] = $fld; + } + $rs->Close(); + $ADODB_FETCH_MODE = $save; + return $arr; + } + + function _init($parentDriver) + { + + $parentDriver->hasTransactions = false; + $parentDriver->hasInsertID = true; + } + + function _insertid() + { + return sqlite_last_insert_rowid($this->_connectionID); + } + + function _affectedrows() + { + return sqlite_changes($this->_connectionID); + } + + function ErrorMsg() + { + if ($this->_logsql) return $this->_errorMsg; + return ($this->_errorNo) ? sqlite_error_string($this->_errorNo) : ''; + } + + function ErrorNo() + { + return $this->_errorNo; + } + + function SQLDate($fmt, $col=false) + { + $fmt = $this->qstr($fmt); + return ($col) ? "adodb_date2($fmt,$col)" : "adodb_date($fmt)"; + } + + + function _createFunctions() + { + @sqlite_create_function($this->_connectionID, 'adodb_date', 'adodb_date', 1); + @sqlite_create_function($this->_connectionID, 'adodb_date2', 'adodb_date2', 2); + } + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sqlite_open')) return null; + if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename; + + $this->_connectionID = sqlite_open($argHostname); + if ($this->_connectionID === false) return false; + $this->_createFunctions(); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sqlite_open')) return null; + if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename; + + $this->_connectionID = sqlite_popen($argHostname); + if ($this->_connectionID === false) return false; + $this->_createFunctions(); + return true; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + $rez = sqlite_query($sql,$this->_connectionID); + if (!$rez) { + $this->_errorNo = sqlite_last_error($this->_connectionID); + } + + return $rez; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; + $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : ''); + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + + /* + This algorithm is not very efficient, but works even if table locking + is not available. + + Will return false if unable to generate an ID after $MAXLOOPS attempts. + */ + var $_genSeqSQL = "create table %s (id integer)"; + + function GenID($seq='adodbseq',$start=1) + { + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $MAXLOOPS = 100; + //$this->debug=1; + while (--$MAXLOOPS>=0) { + @($num = $this->GetOne("select id from $seq")); + if ($num === false) { + $this->Execute(sprintf($this->_genSeqSQL ,$seq)); + $start -= 1; + $num = '0'; + $ok = $this->Execute("insert into $seq values($start)"); + if (!$ok) return false; + } + $this->Execute("update $seq set id=id+1 where id=$num"); + + if ($this->affected_rows() > 0) { + $num += 1; + $this->genID = $num; + return $num; + } + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + function CreateSequence($seqname='adodbseq',$start=1) + { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + $start -= 1; + return $this->Execute("insert into $seqname values($start)"); + } + + var $_dropSeqSQL = 'drop table %s'; + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + // returns true or false + function _close() + { + return @sqlite_close($this->_connectionID); + } + + function MetaIndexes($table, $primary = FALSE, $owner=false) + { + $false = false; + // save old fetch mode + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $SQL=sprintf("SELECT name,sql FROM sqlite_master WHERE type='index' AND tbl_name='%s'", strtolower($table)); + $rs = $this->Execute($SQL); + if (!is_object($rs)) { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; + } + + $indexes = array (); + while ($row = $rs->FetchRow()) { + if ($primary && preg_match("/primary/i",$row[1]) == 0) continue; + if (!isset($indexes[$row[0]])) { + + $indexes[$row[0]] = array( + 'unique' => preg_match("/unique/i",$row[1]), + 'columns' => array()); + } + /** + * There must be a more elegant way of doing this, + * the index elements appear in the SQL statement + * in cols[1] between parentheses + * e.g CREATE UNIQUE INDEX ware_0 ON warehouse (org,warehouse) + */ + $cols = explode("(",$row[1]); + $cols = explode(")",$cols[1]); + array_pop($cols); + $indexes[$row[0]]['columns'] = $cols; + } + if (isset($savem)) { + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + } + return $indexes; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_sqlite extends ADORecordSet { + + var $databaseType = "sqlite"; + var $bind = false; + + function ADORecordset_sqlite($queryID,$mode=false) + { + + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch($mode) { + case ADODB_FETCH_NUM: $this->fetchMode = SQLITE_NUM; break; + case ADODB_FETCH_ASSOC: $this->fetchMode = SQLITE_ASSOC; break; + default: $this->fetchMode = SQLITE_BOTH; break; + } + $this->adodbFetchMode = $mode; + + $this->_queryID = $queryID; + + $this->_inited = true; + $this->fields = array(); + if ($queryID) { + $this->_currentRow = 0; + $this->EOF = !$this->_fetch(); + @$this->_initrs(); + } else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + $this->EOF = true; + } + + return $this->_queryID; + } + + + function FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fld->name = sqlite_field_name($this->_queryID, $fieldOffset); + $fld->type = 'VARCHAR'; + $fld->max_length = -1; + return $fld; + } + + function _initrs() + { + $this->_numOfRows = @sqlite_num_rows($this->_queryID); + $this->_numOfFields = @sqlite_num_fields($this->_queryID); + } + + function Fields($colname) + { + if ($this->fetchMode != SQLITE_NUM) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _seek($row) + { + return sqlite_seek($this->_queryID, $row); + } + + function _fetch($ignore_fields=false) + { + $this->fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); + return !empty($this->fields); + } + + function _close() + { + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-sqlitepo.inc.php b/fannie/adodb5/drivers/adodb-sqlitepo.inc.php new file mode 100644 index 000000000..5f3fe34fd --- /dev/null +++ b/fannie/adodb5/drivers/adodb-sqlitepo.inc.php @@ -0,0 +1,62 @@ +ADODB_sqlite(); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_sqlitepo extends ADORecordset_sqlite { + + var $databaseType = 'sqlitepo'; + + function ADORecordset_sqlitepo($queryID,$mode=false) + { + $this->ADORecordset_sqlite($queryID,$mode); + } + + // Modified to strip table names from returned fields + function _fetch($ignore_fields=false) + { + $this->fields = array(); + $fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); + if(is_array($fields)) + foreach($fields as $n => $v) + { + if(($p = strpos($n, ".")) !== false) + $n = substr($n, $p+1); + $this->fields[$n] = $v; + } + + return !empty($this->fields); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-sybase.inc.php b/fannie/adodb5/drivers/adodb-sybase.inc.php new file mode 100644 index 000000000..b2a17fb5f --- /dev/null +++ b/fannie/adodb5/drivers/adodb-sybase.inc.php @@ -0,0 +1,428 @@ +GetOne('select @@identity'); + } + // might require begintrans -- committrans + function _affectedrows() + { + return $this->GetOne('select @@rowcount'); + } + + + function BeginTrans() + { + + if ($this->transOff) return true; + $this->transCnt += 1; + + $this->Execute('BEGIN TRAN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + + if (!$ok) return $this->RollbackTrans(); + + $this->transCnt -= 1; + $this->Execute('COMMIT TRAN'); + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + $this->transCnt -= 1; + $this->Execute('ROLLBACK TRAN'); + return true; + } + + // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4 + function RowLock($tables,$where,$flds='top 1 null as ignore') + { + if (!$this->_hastrans) $this->BeginTrans(); + $tables = str_replace(',',' HOLDLOCK,',$tables); + return $this->GetOne("select $flds from $tables HOLDLOCK where $where"); + + } + + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + return @sybase_select_db($dbName); + } + else return false; + } + + /* Returns: the last error message from previous database operation + Note: This function is NOT available for Microsoft SQL Server. */ + + + function ErrorMsg() + { + if ($this->_logsql) return $this->_errorMsg; + if (function_exists('sybase_get_last_message')) + $this->_errorMsg = sybase_get_last_message(); + else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform'; + return $this->_errorMsg; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sybase_connect')) return null; + + if ($this->charSet) { + $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword, $this->charSet); + } else { + $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); + } + + $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sybase_connect')) return null; + + if ($this->charSet) { + $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword, $this->charSet); + } else { + $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword); + } + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300) + return sybase_unbuffered_query($sql,$this->_connectionID); + else + return sybase_query($sql,$this->_connectionID); + } + + // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12 + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $rs; + } + + $nrows = (integer) $nrows; + $offset = (integer) $offset; + + $cnt = ($nrows >= 0) ? $nrows : 999999999; + if ($offset > 0 && $cnt) $cnt += $offset; + + $this->Execute("set rowcount $cnt"); + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0); + $this->Execute("set rowcount 0"); + + return $rs; + } + + // returns true or false + function _close() + { + return @sybase_close($this->_connectionID); + } + + static function UnixDate($v) + { + return ADORecordSet_array_sybase::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_sybase::UnixTimeStamp($v); + } + + + + # Added 2003-10-05 by Chris Phillipson + # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25 + # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "str_replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(qq,$col)"; + break; + case 'D': + case 'd': + $s .= "str_replace(str(datepart(dd,$col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "str_replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "str_replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "str_replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + + # Added 2003-10-07 by Chris Phillipson + # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 + # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version + function MetaPrimaryKeys($table) + { + $sql = "SELECT c.column_name " . + "FROM syscolumn c, systable t " . + "WHERE t.table_name='$table' AND c.table_id=t.table_id " . + "AND t.table_type='BASE' " . + "AND c.pkey = 'Y' " . + "ORDER BY c.column_id"; + + $a = $this->GetCol($sql); + if ($a && sizeof($a)>0) return $a; + return false; + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ +global $ADODB_sybase_mths; +$ADODB_sybase_mths = array( + 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, + 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); + +class ADORecordset_sybase extends ADORecordSet { + + var $databaseType = "sybase"; + var $canSeek = true; + // _mths works only in non-localised system + var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); + + function ADORecordset_sybase($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC; + else $this->fetchMode = $mode; + $this->ADORecordSet($id,$mode); + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + function FetchField($fieldOffset = -1) + { + if ($fieldOffset != -1) { + $o = @sybase_fetch_field($this->_queryID, $fieldOffset); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $o = @sybase_fetch_field($this->_queryID); + } + // older versions of PHP did not support type, only numeric + if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar'; + return $o; + } + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1; + $this->_numOfFields = @sybase_num_fields($this->_queryID); + } + + function _seek($row) + { + return @sybase_data_seek($this->_queryID, $row); + } + + function _fetch($ignore_fields=false) + { + if ($this->fetchMode == ADODB_FETCH_NUM) { + $this->fields = @sybase_fetch_row($this->_queryID); + } else if ($this->fetchMode == ADODB_FETCH_ASSOC) { + $this->fields = @sybase_fetch_row($this->_queryID); + if (is_array($this->fields)) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + return true; + } + return false; + } else { + $this->fields = @sybase_fetch_array($this->_queryID); + } + if ( is_array($this->fields)) { + return true; + } + + return false; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + function _close() { + return @sybase_free_result($this->_queryID); + } + + // sybase/mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_sybase::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_sybase::UnixTimeStamp($v); + } +} + +class ADORecordSet_array_sybase extends ADORecordSet_array { + function ADORecordSet_array_sybase($id=-1) + { + $this->ADORecordSet_array($id); + } + + // sybase/mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + global $ADODB_sybase_mths; + + //Dec 30 2000 12:00AM + if (!preg_match( "/([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})/" + ,$v, $rr)) return parent::UnixDate($v); + + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $themth = substr(strtoupper($rr[1]),0,3); + $themth = $ADODB_sybase_mths[$themth]; + if ($themth <= 0) return false; + // h-m-s-MM-DD-YY + return mktime(0,0,0,$themth,$rr[2],$rr[3]); + } + + static function UnixTimeStamp($v) + { + global $ADODB_sybase_mths; + //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com + //Changed [0-9] to [0-9 ] in day conversion + if (!preg_match( "/([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})/" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $themth = substr(strtoupper($rr[1]),0,3); + $themth = $ADODB_sybase_mths[$themth]; + if ($themth <= 0) return false; + + switch (strtoupper($rr[6])) { + case 'P': + if ($rr[4]<12) $rr[4] += 12; + break; + case 'A': + if ($rr[4]==12) $rr[4] = 0; + break; + default: + break; + } + // h-m-s-MM-DD-YY + return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]); + } +} +?> diff --git a/fannie/adodb5/drivers/adodb-sybase_ase.inc.php b/fannie/adodb5/drivers/adodb-sybase_ase.inc.php new file mode 100644 index 000000000..fbaedeaf2 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-sybase_ase.inc.php @@ -0,0 +1,119 @@ +metaTablesSQL) { + // complicated state saving by the need for backward compat + + if ($ttype == 'VIEWS'){ + $sql = str_replace('U', 'V', $this->metaTablesSQL); + }elseif (false === $ttype){ + $sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL); + }else{ // TABLES OR ANY OTHER + $sql = $this->metaTablesSQL; + } + $rs = $this->Execute($sql); + + if ($rs === false || !method_exists($rs, 'GetArray')){ + return $false; + } + $arr = $rs->GetArray(); + + $arr2 = array(); + foreach($arr as $key=>$value){ + $arr2[] = trim($value['name']); + } + return $arr2; + } + return $false; + } + + function MetaDatabases() + { + $arr = array(); + if ($this->metaDatabasesSQL!='') { + $rs = $this->Execute($this->metaDatabasesSQL); + if ($rs && !$rs->EOF){ + while (!$rs->EOF){ + $arr[] = $rs->Fields('name'); + $rs->MoveNext(); + } + return $arr; + } + } + return false; + } + + // fix a bug which prevent the metaColumns query to be executed for Sybase ASE + function MetaColumns($table,$upper=false) + { + $false = false; + if (!empty($this->metaColumnsSQL)) { + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + if ($rs === false) return $false; + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->Fields('field_name'); + $fld->type = $rs->Fields('type'); + $fld->max_length = $rs->Fields('width'); + $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return $false; + } + + function getProcedureList($schema) + { + return false; + } + + function ErrorMsg() + { + if (!function_exists('sybase_connect')){ + return 'Your PHP doesn\'t contain the Sybase connection module!'; + } + return parent::ErrorMsg(); + } +} + +class adorecordset_sybase_ase extends ADORecordset_sybase { +var $databaseType = "sybase_ase"; +function ADORecordset_sybase_ase($id,$mode=false) + { + $this->ADORecordSet_sybase($id,$mode); + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/drivers/adodb-vfp.inc.php b/fannie/adodb5/drivers/adodb-vfp.inc.php new file mode 100644 index 000000000..501928c21 --- /dev/null +++ b/fannie/adodb5/drivers/adodb-vfp.inc.php @@ -0,0 +1,107 @@ +ADODB_odbc(); + } + + function Time() + { + return time(); + } + + function BeginTrans() { return false;} + + // quote string to be sent back to database + function qstr($s,$nofixquotes=false) + { + if (!$nofixquotes) return "'".str_replace("\r\n","'+chr(13)+'",str_replace("'",$this->replaceQuote,$s))."'"; + return "'".$s."'"; + } + + + // TOP requires ORDER BY for VFP + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + $this->hasTop = preg_match('/ORDER[ \t\r\n]+BY/is',$sql) ? 'top' : false; + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + + +}; + + +class ADORecordSet_vfp extends ADORecordSet_odbc { + + var $databaseType = "vfp"; + + + function ADORecordSet_vfp($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'C': + if ($len <= $this->blobSize) return 'C'; + case 'M': + return 'X'; + + case 'D': return 'D'; + + case 'T': return 'T'; + + case 'L': return 'L'; + + case 'I': return 'I'; + + default: return 'N'; + } + } +} + +} //define +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-ar.inc.php b/fannie/adodb5/lang/adodb-ar.inc.php new file mode 100644 index 000000000..4b7509527 --- /dev/null +++ b/fannie/adodb5/lang/adodb-ar.inc.php @@ -0,0 +1,33 @@ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'ar', + DB_ERROR => 'ÎØÃ ÛíÑ ãÍÏÏ', + DB_ERROR_ALREADY_EXISTS => 'ãæÌæÏ ãÓÈÞÇ', + DB_ERROR_CANNOT_CREATE => 'áÇ íãßä ÅäÔÇÁ', + DB_ERROR_CANNOT_DELETE => 'áÇ íãßä ÍÐÝ', + DB_ERROR_CANNOT_DROP => 'áÇ íãßä ÍÐÝ', + DB_ERROR_CONSTRAINT => 'ÚãáíÉ ÅÏÎÇá ããäæÚÉ', + DB_ERROR_DIVZERO => 'ÚãáíÉ ÇáÊÞÓíã Úáì ÕÝÑ', + DB_ERROR_INVALID => 'ÛíÑ ÕÍíÍ', + DB_ERROR_INVALID_DATE => 'ÕíÛÉ æÞÊ Ãæ ÊÇÑíÎ ÛíÑ ÕÍíÍÉ', + DB_ERROR_INVALID_NUMBER => 'ÕíÛÉ ÑÞã ÛíÑ ÕÍíÍÉ', + DB_ERROR_MISMATCH => 'ÛíÑ ãÊØÇÈÞ', + DB_ERROR_NODBSELECTED => 'áã íÊã ÅÎÊíÇÑ ÞÇÚÏÉ ÇáÈíÇäÇÊ ÈÚÏ', + DB_ERROR_NOSUCHFIELD => 'áíÓ åäÇáß ÍÞá ÈåÐÇ ÇáÇÓã', + DB_ERROR_NOSUCHTABLE => 'áíÓ åäÇáß ÌÏæá ÈåÐÇ ÇáÇÓã', + DB_ERROR_NOT_CAPABLE => 'ÞÇÚÏÉ ÇáÈíÇäÇÊ ÇáãÑÊÈØ ÈåÇ ÛíÑ ÞÇÏÑÉ', + DB_ERROR_NOT_FOUND => 'áã íÊã ÅíÌÇÏå', + DB_ERROR_NOT_LOCKED => 'ÛíÑ ãÞÝæá', + DB_ERROR_SYNTAX => 'ÎØÃ Ýí ÇáÕíÛÉ', + DB_ERROR_UNSUPPORTED => 'ÛíÑ ãÏÚæã', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ÚÏÏ ÇáÞíã Ýí ÇáÓÌá', + DB_ERROR_INVALID_DSN => 'DSN ÛíÑ ÕÍíÍ', + DB_ERROR_CONNECT_FAILED => 'ÝÔá ÚãáíÉ ÇáÅÊÕÇá', + 0 => 'áíÓ åäÇáß ÃÎØÇÁ', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ÇáÈíÇäÇÊ ÇáãÒæÏÉ ÛíÑ ßÇÝíÉ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'áã íÊã ÅíÌÇÏ ÇáÅÖÇÝÉ ÇáãÊÚáÞÉ', + DB_ERROR_NOSUCHDB => 'áíÓ åäÇáß ÞÇÚÏÉ ÈíÇäÇÊ ÈåÐÇ ÇáÇÓã', + DB_ERROR_ACCESS_VIOLATION => 'ÓãÇÍíÇÊ ÛíÑ ßÇÝíÉ' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-bg.inc.php b/fannie/adodb5/lang/adodb-bg.inc.php new file mode 100644 index 000000000..ee307c13f --- /dev/null +++ b/fannie/adodb5/lang/adodb-bg.inc.php @@ -0,0 +1,37 @@ + +*/ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'bg', + DB_ERROR => 'íåèçâåñòíà ãðåøêà', + DB_ERROR_ALREADY_EXISTS => 'âå÷å ñúùåñòâóâà', + DB_ERROR_CANNOT_CREATE => 'íå ìîæå äà áúäå ñúçäàäåíà', + DB_ERROR_CANNOT_DELETE => 'íå ìîæå äà áúäå èçòðèòà', + DB_ERROR_CANNOT_DROP => 'íå ìîæå äà áúäå óíèùîæåíà', + DB_ERROR_CONSTRAINT => 'íàðóøåíî óñëîâèå', + DB_ERROR_DIVZERO => 'äåëåíèå íà íóëà', + DB_ERROR_INVALID => 'íåïðàâèëíî', + DB_ERROR_INVALID_DATE => 'íåêîðåêòíà äàòà èëè ÷àñ', + DB_ERROR_INVALID_NUMBER => 'íåâàëèäåí íîìåð', + DB_ERROR_MISMATCH => 'ïîãðåøíà óïîòðåáà', + DB_ERROR_NODBSELECTED => 'íå å èçáðàíà áàçà äàííè', + DB_ERROR_NOSUCHFIELD => 'íåñúùåñòâóâàùî ïîëå', + DB_ERROR_NOSUCHTABLE => 'íåñúùåñòâóâàùà òàáëèöà', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'íå å íàìåðåíà', + DB_ERROR_NOT_LOCKED => 'íå å çàêëþ÷åíà', + DB_ERROR_SYNTAX => 'ãðåøåí ñèíòàêñèñ', + DB_ERROR_UNSUPPORTED => 'íå ñå ïîääúðæà', + DB_ERROR_VALUE_COUNT_ON_ROW => 'íåêîðåêòåí áðîé êîëîíè â ðåäà', + DB_ERROR_INVALID_DSN => 'íåâàëèäåí DSN', + DB_ERROR_CONNECT_FAILED => 'âðúçêàòà íå ìîæå äà áúäå îñúùåñòâåíà', + 0 => 'íÿìà ãðåøêè', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ïðåäîñòàâåíèòå äàííè ñà íåäîñòàòú÷íè', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ðàçøèðåíèåòî íå å íàìåðåíî', + DB_ERROR_NOSUCHDB => 'íåñúùåñòâóâàùà áàçà äàííè', + DB_ERROR_ACCESS_VIOLATION => 'íÿìàòå äîñòàòú÷íî ïðàâà' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-bgutf8.inc.php b/fannie/adodb5/lang/adodb-bgutf8.inc.php new file mode 100644 index 000000000..5281ed53b --- /dev/null +++ b/fannie/adodb5/lang/adodb-bgutf8.inc.php @@ -0,0 +1,37 @@ + +*/ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'bgutf8', + DB_ERROR => 'неизвеÑтна грешка', + DB_ERROR_ALREADY_EXISTS => 'вече ÑъщеÑтвува', + DB_ERROR_CANNOT_CREATE => 'не може да бъде Ñъздадена', + DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита', + DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена', + DB_ERROR_CONSTRAINT => 'нарушено уÑловие', + DB_ERROR_DIVZERO => 'деление на нула', + DB_ERROR_INVALID => 'неправилно', + DB_ERROR_INVALID_DATE => 'некоректна дата или чаÑ', + DB_ERROR_INVALID_NUMBER => 'невалиден номер', + DB_ERROR_MISMATCH => 'погрешна употреба', + DB_ERROR_NODBSELECTED => 'не е избрана база данни', + DB_ERROR_NOSUCHFIELD => 'неÑъщеÑтвуващо поле', + DB_ERROR_NOSUCHTABLE => 'неÑъщеÑтвуваща таблица', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'не е намерена', + DB_ERROR_NOT_LOCKED => 'не е заключена', + DB_ERROR_SYNTAX => 'грешен ÑинтакÑиÑ', + DB_ERROR_UNSUPPORTED => 'не Ñе поддържа', + DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда', + DB_ERROR_INVALID_DSN => 'невалиден DSN', + DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде оÑъщеÑтвена', + 0 => 'нÑма грешки', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'предоÑтавените данни Ñа недоÑтатъчни', + DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено', + DB_ERROR_NOSUCHDB => 'неÑъщеÑтвуваща база данни', + DB_ERROR_ACCESS_VIOLATION => 'нÑмате доÑтатъчно права' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-ca.inc.php b/fannie/adodb5/lang/adodb-ca.inc.php new file mode 100644 index 000000000..3640ebd0b --- /dev/null +++ b/fannie/adodb5/lang/adodb-ca.inc.php @@ -0,0 +1,34 @@ + 'ca', + DB_ERROR => 'error desconegut', + DB_ERROR_ALREADY_EXISTS => 'ja existeix', + DB_ERROR_CANNOT_CREATE => 'no es pot crear', + DB_ERROR_CANNOT_DELETE => 'no es pot esborrar', + DB_ERROR_CANNOT_DROP => 'no es pot eliminar', + DB_ERROR_CONSTRAINT => 'violació de constraint', + DB_ERROR_DIVZERO => 'divisió per zero', + DB_ERROR_INVALID => 'no és vàlid', + DB_ERROR_INVALID_DATE => 'la data o l\'hora no són vàlides', + DB_ERROR_INVALID_NUMBER => 'el nombre no és vàlid', + DB_ERROR_MISMATCH => 'no hi ha coincidència', + DB_ERROR_NODBSELECTED => 'cap base de dades seleccionada', + DB_ERROR_NOSUCHFIELD => 'camp inexistent', + DB_ERROR_NOSUCHTABLE => 'taula inexistent', + DB_ERROR_NOT_CAPABLE => 'l\'execució secundària de DB no pot', + DB_ERROR_NOT_FOUND => 'no trobat', + DB_ERROR_NOT_LOCKED => 'no blocat', + DB_ERROR_SYNTAX => 'error de sintaxi', + DB_ERROR_UNSUPPORTED => 'no suportat', + DB_ERROR_VALUE_COUNT_ON_ROW => 'el nombre de columnes no coincideix amb el nombre de valors en la fila', + DB_ERROR_INVALID_DSN => 'el DSN no és vàlid', + DB_ERROR_CONNECT_FAILED => 'connexió fallida', + 0 => 'cap error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'les dades subministrades són insuficients', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensió no trobada', + DB_ERROR_NOSUCHDB => 'base de dades inexistent', + DB_ERROR_ACCESS_VIOLATION => 'permisos insuficients' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-cn.inc.php b/fannie/adodb5/lang/adodb-cn.inc.php new file mode 100644 index 000000000..eb8c7de55 --- /dev/null +++ b/fannie/adodb5/lang/adodb-cn.inc.php @@ -0,0 +1,35 @@ + 'cn', + DB_ERROR => 'δ֪´íÎó', + DB_ERROR_ALREADY_EXISTS => 'ÒѾ­´æÔÚ', + DB_ERROR_CANNOT_CREATE => '²»ÄÜ´´½¨', + DB_ERROR_CANNOT_DELETE => '²»ÄÜɾ³ý', + DB_ERROR_CANNOT_DROP => '²»ÄܶªÆú', + DB_ERROR_CONSTRAINT => 'Ô¼ÊøÏÞÖÆ', + DB_ERROR_DIVZERO => '±»0³ý', + DB_ERROR_INVALID => 'ÎÞЧ', + DB_ERROR_INVALID_DATE => 'ÎÞЧµÄÈÕÆÚ»òÕßʱ¼ä', + DB_ERROR_INVALID_NUMBER => 'ÎÞЧµÄÊý×Ö', + DB_ERROR_MISMATCH => '²»Æ¥Åä', + DB_ERROR_NODBSELECTED => 'ûÓÐÊý¾Ý¿â±»Ñ¡Ôñ', + DB_ERROR_NOSUCHFIELD => 'ûÓÐÏàÓ¦µÄ×Ö¶Î', + DB_ERROR_NOSUCHTABLE => 'ûÓÐÏàÓ¦µÄ±í', + DB_ERROR_NOT_CAPABLE => 'Êý¾Ý¿âºǫ́²»¼æÈÝ', + DB_ERROR_NOT_FOUND => 'ûÓз¢ÏÖ', + DB_ERROR_NOT_LOCKED => 'ûÓб»Ëø¶¨', + DB_ERROR_SYNTAX => 'Óï·¨´íÎó', + DB_ERROR_UNSUPPORTED => '²»Ö§³Ö', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ÔÚÐÐÉÏÀÛ¼ÆÖµ', + DB_ERROR_INVALID_DSN => 'ÎÞЧµÄÊý¾ÝÔ´ (DSN)', + DB_ERROR_CONNECT_FAILED => 'Á¬½Óʧ°Ü', + 0 => 'ûÓдíÎó', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ÌṩµÄÊý¾Ý²»ÄÜ·ûºÏÒªÇó', + DB_ERROR_EXTENSION_NOT_FOUND=> 'À©Õ¹Ã»Óб»·¢ÏÖ', + DB_ERROR_NOSUCHDB => 'ûÓÐÏàÓ¦µÄÊý¾Ý¿â', + DB_ERROR_ACCESS_VIOLATION => 'ûÓкÏÊʵÄȨÏÞ' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-cz.inc.php b/fannie/adodb5/lang/adodb-cz.inc.php new file mode 100644 index 000000000..2424c2446 --- /dev/null +++ b/fannie/adodb5/lang/adodb-cz.inc.php @@ -0,0 +1,40 @@ + + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'cz', + DB_ERROR => 'neznámá chyba', + DB_ERROR_ALREADY_EXISTS => 'ji? existuje', + DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it', + DB_ERROR_CANNOT_DELETE => 'nelze smazat', + DB_ERROR_CANNOT_DROP => 'nelze odstranit', + DB_ERROR_CONSTRAINT => 'poru?ení omezující podmínky', + DB_ERROR_DIVZERO => 'd?lení nulou', + DB_ERROR_INVALID => 'neplatné', + DB_ERROR_INVALID_DATE => 'neplatné datum nebo ?as', + DB_ERROR_INVALID_NUMBER => 'neplatné ?íslo', + DB_ERROR_MISMATCH => 'nesouhlasí', + DB_ERROR_NODBSELECTED => '?ádná databáze není vybrána', + DB_ERROR_NOSUCHFIELD => 'pole nenalezeno', + DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena', + DB_ERROR_NOT_CAPABLE => 'nepodporováno', + DB_ERROR_NOT_FOUND => 'nenalezeno', + DB_ERROR_NOT_LOCKED => 'nezam?eno', + DB_ERROR_SYNTAX => 'syntaktická chyba', + DB_ERROR_UNSUPPORTED => 'nepodporováno', + DB_ERROR_VALUE_COUNT_ON_ROW => '', + DB_ERROR_INVALID_DSN => 'neplatné DSN', + DB_ERROR_CONNECT_FAILED => 'p?ipojení selhalo', + 0 => 'bez chyb', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'málo zdrojových dat', + DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?í?ení nenalezeno', + DB_ERROR_NOSUCHDB => 'databáze neexistuje', + DB_ERROR_ACCESS_VIOLATION => 'nedostate?ná práva' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-da.inc.php b/fannie/adodb5/lang/adodb-da.inc.php new file mode 100644 index 000000000..ca0e72d61 --- /dev/null +++ b/fannie/adodb5/lang/adodb-da.inc.php @@ -0,0 +1,33 @@ + 'da', + DB_ERROR => 'ukendt fejl', + DB_ERROR_ALREADY_EXISTS => 'eksisterer allerede', + DB_ERROR_CANNOT_CREATE => 'kan ikke oprette', + DB_ERROR_CANNOT_DELETE => 'kan ikke slette', + DB_ERROR_CANNOT_DROP => 'kan ikke droppe', + DB_ERROR_CONSTRAINT => 'begrænsning krænket', + DB_ERROR_DIVZERO => 'division med nul', + DB_ERROR_INVALID => 'ugyldig', + DB_ERROR_INVALID_DATE => 'ugyldig dato eller klokkeslet', + DB_ERROR_INVALID_NUMBER => 'ugyldigt tal', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'ingen database valgt', + DB_ERROR_NOSUCHFIELD => 'felt findes ikke', + DB_ERROR_NOSUCHTABLE => 'tabel findes ikke', + DB_ERROR_NOT_CAPABLE => 'DB backend opgav', + DB_ERROR_NOT_FOUND => 'ikke fundet', + DB_ERROR_NOT_LOCKED => 'ikke låst', + DB_ERROR_SYNTAX => 'syntaksfejl', + DB_ERROR_UNSUPPORTED => 'ikke understøttet', + DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til forespørgslens antal felter', + DB_ERROR_INVALID_DSN => 'ugyldig DSN', + DB_ERROR_CONNECT_FAILED => 'tilslutning mislykkedes', + 0 => 'ingen fejl', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'utilstrækkelige data angivet', + DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet', + DB_ERROR_NOSUCHDB => 'database ikke fundet', + DB_ERROR_ACCESS_VIOLATION => 'utilstrækkelige rettigheder' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-de.inc.php b/fannie/adodb5/lang/adodb-de.inc.php new file mode 100644 index 000000000..244cb2f66 --- /dev/null +++ b/fannie/adodb5/lang/adodb-de.inc.php @@ -0,0 +1,33 @@ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'de', + DB_ERROR => 'Unbekannter Fehler', + DB_ERROR_ALREADY_EXISTS => 'existiert bereits', + DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen', + DB_ERROR_CANNOT_DELETE => 'kann nicht löschen', + DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gelöscht werden', + DB_ERROR_CONSTRAINT => 'Constraint Verletzung', + DB_ERROR_DIVZERO => 'Division durch Null', + DB_ERROR_INVALID => 'ung¨ltig', + DB_ERROR_INVALID_DATE => 'ung¨ltiges Datum oder Zeit', + DB_ERROR_INVALID_NUMBER => 'ung¨ltige Zahl', + DB_ERROR_MISMATCH => 'Unverträglichkeit', + DB_ERROR_NODBSELECTED => 'keine Dantebank ausgewählt', + DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden', + DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden', + DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert', + DB_ERROR_NOT_FOUND => 'nicht gefunden', + DB_ERROR_NOT_LOCKED => 'nicht gesperrt', + DB_ERROR_SYNTAX => 'Syntaxfehler', + DB_ERROR_UNSUPPORTED => 'nicht Unterst¨tzt', + DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur¨ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage', + DB_ERROR_INVALID_DSN => 'ung¨ltiger DSN', + DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden', + 0 => 'kein Fehler', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'Nicht gen¨gend Daten geliefert', + DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden', + DB_ERROR_NOSUCHDB => 'keine Datenbank', + DB_ERROR_ACCESS_VIOLATION => 'ungen¨gende Rechte' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-en.inc.php b/fannie/adodb5/lang/adodb-en.inc.php new file mode 100644 index 000000000..6895995ef --- /dev/null +++ b/fannie/adodb5/lang/adodb-en.inc.php @@ -0,0 +1,33 @@ + 'en', + DB_ERROR => 'unknown error', + DB_ERROR_ALREADY_EXISTS => 'already exists', + DB_ERROR_CANNOT_CREATE => 'can not create', + DB_ERROR_CANNOT_DELETE => 'can not delete', + DB_ERROR_CANNOT_DROP => 'can not drop', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_DIVZERO => 'division by zero', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'invalid date or time', + DB_ERROR_INVALID_NUMBER => 'invalid number', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'no database selected', + DB_ERROR_NOSUCHFIELD => 'no such field', + DB_ERROR_NOSUCHTABLE => 'no such table', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'not found', + DB_ERROR_NOT_LOCKED => 'not locked', + DB_ERROR_SYNTAX => 'syntax error', + DB_ERROR_UNSUPPORTED => 'not supported', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_CONNECT_FAILED => 'connect failed', + 0 => 'no error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', + DB_ERROR_NOSUCHDB => 'no such database', + DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-es.inc.php b/fannie/adodb5/lang/adodb-es.inc.php new file mode 100644 index 000000000..1e0afbb40 --- /dev/null +++ b/fannie/adodb5/lang/adodb-es.inc.php @@ -0,0 +1,33 @@ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'es', + DB_ERROR => 'error desconocido', + DB_ERROR_ALREADY_EXISTS => 'ya existe', + DB_ERROR_CANNOT_CREATE => 'imposible crear', + DB_ERROR_CANNOT_DELETE => 'imposible borrar', + DB_ERROR_CANNOT_DROP => 'imposible hacer drop', + DB_ERROR_CONSTRAINT => 'violacion de constraint', + DB_ERROR_DIVZERO => 'division por cero', + DB_ERROR_INVALID => 'invalido', + DB_ERROR_INVALID_DATE => 'fecha u hora invalida', + DB_ERROR_INVALID_NUMBER => 'numero invalido', + DB_ERROR_MISMATCH => 'error', + DB_ERROR_NODBSELECTED => 'no hay base de datos seleccionada', + DB_ERROR_NOSUCHFIELD => 'campo invalido', + DB_ERROR_NOSUCHTABLE => 'tabla no existe', + DB_ERROR_NOT_CAPABLE => 'capacidad invalida para esta DB', + DB_ERROR_NOT_FOUND => 'no encontrado', + DB_ERROR_NOT_LOCKED => 'no bloqueado', + DB_ERROR_SYNTAX => 'error de sintaxis', + DB_ERROR_UNSUPPORTED => 'no soportado', + DB_ERROR_VALUE_COUNT_ON_ROW => 'la cantidad de columnas no corresponden a la cantidad de valores', + DB_ERROR_INVALID_DSN => 'DSN invalido', + DB_ERROR_CONNECT_FAILED => 'fallo la conexion', + 0 => 'sin error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'insuficientes datos', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension no encontrada', + DB_ERROR_NOSUCHDB => 'base de datos no encontrada', + DB_ERROR_ACCESS_VIOLATION => 'permisos insuficientes' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-esperanto.inc.php b/fannie/adodb5/lang/adodb-esperanto.inc.php new file mode 100644 index 000000000..16ca00e2f --- /dev/null +++ b/fannie/adodb5/lang/adodb-esperanto.inc.php @@ -0,0 +1,35 @@ + 'eo', + DB_ERROR => 'nekonata eraro', + DB_ERROR_ALREADY_EXISTS => 'jam ekzistas', + DB_ERROR_CANNOT_CREATE => 'maleblas krei', + DB_ERROR_CANNOT_DELETE => 'maleblas elimini', + DB_ERROR_CANNOT_DROP => 'maleblas elimini (drop)', + DB_ERROR_CONSTRAINT => 'rompo de kondicxoj de provo', + DB_ERROR_DIVZERO => 'divido per 0 (nul)', + DB_ERROR_INVALID => 'malregule', + DB_ERROR_INVALID_DATE => 'malregula dato kaj tempo', + DB_ERROR_INVALID_NUMBER => 'malregula nombro', + DB_ERROR_MISMATCH => 'eraro', + DB_ERROR_NODBSELECTED => 'datumbazo ne elektita', + DB_ERROR_NOSUCHFIELD => 'ne ekzistas kampo', + DB_ERROR_NOSUCHTABLE => 'ne ekzistas tabelo', + DB_ERROR_NOT_CAPABLE => 'DBMS ne povas', + DB_ERROR_NOT_FOUND => 'ne trovita', + DB_ERROR_NOT_LOCKED => 'ne blokita', + DB_ERROR_SYNTAX => 'sintaksa eraro', + DB_ERROR_UNSUPPORTED => 'ne apogata', + DB_ERROR_VALUE_COUNT_ON_ROW => 'nombrilo de valoroj en linio', + DB_ERROR_INVALID_DSN => 'malregula DSN-o', + DB_ERROR_CONNECT_FAILED => 'konekto malsukcesa', + 0 => 'cxio bone', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ne suficxe da datumo', + DB_ERROR_EXTENSION_NOT_FOUND=> 'etendo ne trovita', + DB_ERROR_NOSUCHDB => 'datumbazo ne ekzistas', + DB_ERROR_ACCESS_VIOLATION => 'ne suficxe da rajto por atingo' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-fa.inc.php b/fannie/adodb5/lang/adodb-fa.inc.php new file mode 100644 index 000000000..559431357 --- /dev/null +++ b/fannie/adodb5/lang/adodb-fa.inc.php @@ -0,0 +1,35 @@ + */ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'fa', + DB_ERROR => 'خطای ناشناخته', + DB_ERROR_ALREADY_EXISTS => 'وجود دارد', + DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد', + DB_ERROR_CANNOT_DELETE => 'امکان حذ٠وجود ندارد', + DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد', + DB_ERROR_CONSTRAINT => 'نقض شرط', + DB_ERROR_DIVZERO => 'تقسیم بر ØµÙØ±', + DB_ERROR_INVALID => 'نامعتبر', + DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر', + DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر', + DB_ERROR_MISMATCH => 'عدم مطابقت', + DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است', + DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد', + DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد', + DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست', + DB_ERROR_NOT_FOUND => 'پیدا نشد', + DB_ERROR_NOT_LOCKED => 'Ù‚ÙÙ„ نشده', + DB_ERROR_SYNTAX => 'خطای دستوری', + DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود', + DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیÙ', + DB_ERROR_INVALID_DSN => 'DSN نامعتبر', + DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد', + 0 => 'بدون خطا', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'داده ناکاÙÛŒ است', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد', + DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد', + DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکاÙÛŒ' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-fr.inc.php b/fannie/adodb5/lang/adodb-fr.inc.php new file mode 100644 index 000000000..066a2a5e5 --- /dev/null +++ b/fannie/adodb5/lang/adodb-fr.inc.php @@ -0,0 +1,33 @@ + 'fr', + DB_ERROR => 'erreur inconnue', + DB_ERROR_ALREADY_EXISTS => 'existe déjà', + DB_ERROR_CANNOT_CREATE => 'crétion impossible', + DB_ERROR_CANNOT_DELETE => 'effacement impossible', + DB_ERROR_CANNOT_DROP => 'suppression impossible', + DB_ERROR_CONSTRAINT => 'violation de contrainte', + DB_ERROR_DIVZERO => 'division par zéro', + DB_ERROR_INVALID => 'invalide', + DB_ERROR_INVALID_DATE => 'date ou heure invalide', + DB_ERROR_INVALID_NUMBER => 'nombre invalide', + DB_ERROR_MISMATCH => 'erreur de concordance', + DB_ERROR_NODBSELECTED => 'pas de base de donnéessélectionnée', + DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide', + DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante', + DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non installée', + DB_ERROR_NOT_FOUND => 'pas trouvé', + DB_ERROR_NOT_LOCKED => 'non verrouillé', + DB_ERROR_SYNTAX => 'erreur de syntaxe', + DB_ERROR_UNSUPPORTED => 'non supporté', + DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur insérée trop grande pour colonne', + DB_ERROR_INVALID_DSN => 'DSN invalide', + DB_ERROR_CONNECT_FAILED => 'échec à la connexion', + 0 => "pas d'erreur", // DB_OK + DB_ERROR_NEED_MORE_DATA => 'données fournies insuffisantes', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouvée', + DB_ERROR_NOSUCHDB => 'base de données inconnue', + DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-hu.inc.php b/fannie/adodb5/lang/adodb-hu.inc.php new file mode 100644 index 000000000..d6f0ef82d --- /dev/null +++ b/fannie/adodb5/lang/adodb-hu.inc.php @@ -0,0 +1,34 @@ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'hu', + DB_ERROR => 'ismeretlen hiba', + DB_ERROR_ALREADY_EXISTS => 'már létezik', + DB_ERROR_CANNOT_CREATE => 'nem sikerült létrehozni', + DB_ERROR_CANNOT_DELETE => 'nem sikerült törölni', + DB_ERROR_CANNOT_DROP => 'nem sikerült eldobni', + DB_ERROR_CONSTRAINT => 'szabályok megszegése', + DB_ERROR_DIVZERO => 'osztás nullával', + DB_ERROR_INVALID => 'érvénytelen', + DB_ERROR_INVALID_DATE => 'érvénytelen dátum vagy idõ', + DB_ERROR_INVALID_NUMBER => 'érvénytelen szám', + DB_ERROR_MISMATCH => 'nem megfelelõ', + DB_ERROR_NODBSELECTED => 'nincs kiválasztott adatbázis', + DB_ERROR_NOSUCHFIELD => 'nincs ilyen mezõ', + DB_ERROR_NOSUCHTABLE => 'nincs ilyen tábla', + DB_ERROR_NOT_CAPABLE => 'DB backend nem támogatja', + DB_ERROR_NOT_FOUND => 'nem található', + DB_ERROR_NOT_LOCKED => 'nincs lezárva', + DB_ERROR_SYNTAX => 'szintaktikai hiba', + DB_ERROR_UNSUPPORTED => 'nem támogatott', + DB_ERROR_VALUE_COUNT_ON_ROW => 'soron végzett érték számlálás', + DB_ERROR_INVALID_DSN => 'hibás DSN', + DB_ERROR_CONNECT_FAILED => 'sikertelen csatlakozás', + 0 => 'nincs hiba', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'túl kevés az adat', + DB_ERROR_EXTENSION_NOT_FOUND=> 'bõvítmény nem található', + DB_ERROR_NOSUCHDB => 'nincs ilyen adatbázis', + DB_ERROR_ACCESS_VIOLATION => 'nincs jogosultság' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-it.inc.php b/fannie/adodb5/lang/adodb-it.inc.php new file mode 100644 index 000000000..20c5b93b6 --- /dev/null +++ b/fannie/adodb5/lang/adodb-it.inc.php @@ -0,0 +1,34 @@ + 'it', + DB_ERROR => 'errore sconosciuto', + DB_ERROR_ALREADY_EXISTS => 'esiste già', + DB_ERROR_CANNOT_CREATE => 'non posso creare', + DB_ERROR_CANNOT_DELETE => 'non posso cancellare', + DB_ERROR_CANNOT_DROP => 'non posso eliminare', + DB_ERROR_CONSTRAINT => 'violazione constraint', + DB_ERROR_DIVZERO => 'divisione per zero', + DB_ERROR_INVALID => 'non valido', + DB_ERROR_INVALID_DATE => 'data od ora non valida', + DB_ERROR_INVALID_NUMBER => 'numero non valido', + DB_ERROR_MISMATCH => 'diversi', + DB_ERROR_NODBSELECTED => 'nessun database selezionato', + DB_ERROR_NOSUCHFIELD => 'nessun campo trovato', + DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata', + DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato', + DB_ERROR_NOT_FOUND => 'non trovato', + DB_ERROR_NOT_LOCKED => 'non bloccato', + DB_ERROR_SYNTAX => 'errore di sintassi', + DB_ERROR_UNSUPPORTED => 'non supportato', + DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna', + DB_ERROR_INVALID_DSN => 'DSN non valido', + DB_ERROR_CONNECT_FAILED => 'connessione fallita', + 0 => 'nessun errore', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti', + DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata', + DB_ERROR_NOSUCHDB => 'database non trovato', + DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-nl.inc.php b/fannie/adodb5/lang/adodb-nl.inc.php new file mode 100644 index 000000000..abe77b528 --- /dev/null +++ b/fannie/adodb5/lang/adodb-nl.inc.php @@ -0,0 +1,33 @@ + 'nl', + DB_ERROR => 'onbekende fout', + DB_ERROR_ALREADY_EXISTS => 'bestaat al', + DB_ERROR_CANNOT_CREATE => 'kan niet aanmaken', + DB_ERROR_CANNOT_DELETE => 'kan niet wissen', + DB_ERROR_CANNOT_DROP => 'kan niet verwijderen', + DB_ERROR_CONSTRAINT => 'constraint overtreding', + DB_ERROR_DIVZERO => 'poging tot delen door nul', + DB_ERROR_INVALID => 'ongeldig', + DB_ERROR_INVALID_DATE => 'ongeldige datum of tijd', + DB_ERROR_INVALID_NUMBER => 'ongeldig nummer', + DB_ERROR_MISMATCH => 'is incorrect', + DB_ERROR_NODBSELECTED => 'geen database geselecteerd', + DB_ERROR_NOSUCHFIELD => 'onbekend veld', + DB_ERROR_NOSUCHTABLE => 'onbekende tabel', + DB_ERROR_NOT_CAPABLE => 'database systeem is niet tot uitvoer in staat', + DB_ERROR_NOT_FOUND => 'niet gevonden', + DB_ERROR_NOT_LOCKED => 'niet vergrendeld', + DB_ERROR_SYNTAX => 'syntaxis fout', + DB_ERROR_UNSUPPORTED => 'niet ondersteund', + DB_ERROR_VALUE_COUNT_ON_ROW => 'waarde telling op rij', + DB_ERROR_INVALID_DSN => 'ongeldige DSN', + DB_ERROR_CONNECT_FAILED => 'connectie mislukt', + 0 => 'geen fout', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'onvoldoende data gegeven', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie niet gevonden', + DB_ERROR_NOSUCHDB => 'onbekende database', + DB_ERROR_ACCESS_VIOLATION => 'onvoldoende rechten' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-pl.inc.php b/fannie/adodb5/lang/adodb-pl.inc.php new file mode 100644 index 000000000..9d9e39067 --- /dev/null +++ b/fannie/adodb5/lang/adodb-pl.inc.php @@ -0,0 +1,35 @@ + + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'pl', + DB_ERROR => 'niezidentyfikowany b³±d', + DB_ERROR_ALREADY_EXISTS => 'ju¿ istniej±', + DB_ERROR_CANNOT_CREATE => 'nie mo¿na stworzyæ', + DB_ERROR_CANNOT_DELETE => 'nie mo¿na usun±æ', + DB_ERROR_CANNOT_DROP => 'nie mo¿na porzuciæ', + DB_ERROR_CONSTRAINT => 'pogwa³cenie uprawnieñ', + DB_ERROR_DIVZERO => 'dzielenie przez zero', + DB_ERROR_INVALID => 'b³êdny', + DB_ERROR_INVALID_DATE => 'b³êdna godzina lub data', + DB_ERROR_INVALID_NUMBER => 'b³êdny numer', + DB_ERROR_MISMATCH => 'niedopasowanie', + DB_ERROR_NODBSELECTED => 'baza danych nie zosta³a wybrana', + DB_ERROR_NOSUCHFIELD => 'nie znaleziono pola', + DB_ERROR_NOSUCHTABLE => 'nie znaleziono tabeli', + DB_ERROR_NOT_CAPABLE => 'nie zdolny', + DB_ERROR_NOT_FOUND => 'nie znaleziono', + DB_ERROR_NOT_LOCKED => 'nie zakmniêty', + DB_ERROR_SYNTAX => 'b³±d sk³adni', + DB_ERROR_UNSUPPORTED => 'nie obs³uguje', + DB_ERROR_VALUE_COUNT_ON_ROW => 'warto¶æ liczona w szeregu', + DB_ERROR_INVALID_DSN => 'b³êdny DSN', + DB_ERROR_CONNECT_FAILED => 'po³±czenie nie zosta³o zrealizowane', + 0 => 'brak b³êdów', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'niedostateczna ilo¶æ informacji', + DB_ERROR_EXTENSION_NOT_FOUND=> 'nie znaleziono rozszerzenia', + DB_ERROR_NOSUCHDB => 'nie znaleziono bazy', + DB_ERROR_ACCESS_VIOLATION => 'niedostateczne uprawnienia' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-pt-br.inc.php b/fannie/adodb5/lang/adodb-pt-br.inc.php new file mode 100644 index 000000000..cd28f7e55 --- /dev/null +++ b/fannie/adodb5/lang/adodb-pt-br.inc.php @@ -0,0 +1,35 @@ + 'pt-br', + DB_ERROR => 'erro desconhecido', + DB_ERROR_ALREADY_EXISTS => 'já existe', + DB_ERROR_CANNOT_CREATE => 'impossível criar', + DB_ERROR_CANNOT_DELETE => 'impossível excluír', + DB_ERROR_CANNOT_DROP => 'impossível remover', + DB_ERROR_CONSTRAINT => 'violação do confinamente', + DB_ERROR_DIVZERO => 'divisão por zero', + DB_ERROR_INVALID => 'inválido', + DB_ERROR_INVALID_DATE => 'data ou hora inválida', + DB_ERROR_INVALID_NUMBER => 'número inválido', + DB_ERROR_MISMATCH => 'erro', + DB_ERROR_NODBSELECTED => 'nenhum banco de dados selecionado', + DB_ERROR_NOSUCHFIELD => 'campo inválido', + DB_ERROR_NOSUCHTABLE => 'tabela inexistente', + DB_ERROR_NOT_CAPABLE => 'capacidade inválida para este BD', + DB_ERROR_NOT_FOUND => 'não encontrado', + DB_ERROR_NOT_LOCKED => 'não bloqueado', + DB_ERROR_SYNTAX => 'erro de sintaxe', + DB_ERROR_UNSUPPORTED => +'não suportado', + DB_ERROR_VALUE_COUNT_ON_ROW => 'a quantidade de colunas não corresponde ao de valores', + DB_ERROR_INVALID_DSN => 'DSN inválido', + DB_ERROR_CONNECT_FAILED => 'falha na conexão', + 0 => 'sem erro', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'dados insuficientes', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensão não encontrada', + DB_ERROR_NOSUCHDB => 'banco de dados não encontrado', + DB_ERROR_ACCESS_VIOLATION => 'permissão insuficiente' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-ro.inc.php b/fannie/adodb5/lang/adodb-ro.inc.php new file mode 100644 index 000000000..bcd7d1322 --- /dev/null +++ b/fannie/adodb5/lang/adodb-ro.inc.php @@ -0,0 +1,35 @@ + */ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'ro', + DB_ERROR => 'eroare necunoscuta', + DB_ERROR_ALREADY_EXISTS => 'deja exista', + DB_ERROR_CANNOT_CREATE => 'nu se poate creea', + DB_ERROR_CANNOT_DELETE => 'nu se poate sterge', + DB_ERROR_CANNOT_DROP => 'nu se poate executa drop', + DB_ERROR_CONSTRAINT => 'violare de constrain', + DB_ERROR_DIVZERO => 'se divide la zero', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'data sau timp invalide', + DB_ERROR_INVALID_NUMBER => 'numar invalid', + DB_ERROR_MISMATCH => 'nepotrivire-mismatch', + DB_ERROR_NODBSELECTED => 'nu exista baza de date selectata', + DB_ERROR_NOSUCHFIELD => 'camp inexistent', + DB_ERROR_NOSUCHTABLE => 'tabela inexistenta', + DB_ERROR_NOT_CAPABLE => 'functie optionala neinstalata', + DB_ERROR_NOT_FOUND => 'negasit', + DB_ERROR_NOT_LOCKED => 'neblocat', + DB_ERROR_SYNTAX => 'eroare de sintaxa', + DB_ERROR_UNSUPPORTED => 'nu e suportat', + DB_ERROR_VALUE_COUNT_ON_ROW => 'valoare prea mare pentru coloana', + DB_ERROR_INVALID_DSN => 'DSN invalid', + DB_ERROR_CONNECT_FAILED => 'conectare esuata', + 0 => 'fara eroare', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'data introduse insuficiente', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie negasita', + DB_ERROR_NOSUCHDB => 'nu exista baza de date', + DB_ERROR_ACCESS_VIOLATION => 'permisiuni insuficiente' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-ru1251.inc.php b/fannie/adodb5/lang/adodb-ru1251.inc.php new file mode 100644 index 000000000..3a20538a0 --- /dev/null +++ b/fannie/adodb5/lang/adodb-ru1251.inc.php @@ -0,0 +1,35 @@ + 'ru1251', + DB_ERROR => 'íåèçâåñòíàÿ îøèáêà', + DB_ERROR_ALREADY_EXISTS => 'óæå ñóùåñòâóåò', + DB_ERROR_CANNOT_CREATE => 'íåâîçìîæíî ñîçäàòü', + DB_ERROR_CANNOT_DELETE => 'íåâîçìîæíî óäàëèòü', + DB_ERROR_CANNOT_DROP => 'íåâîçìîæíî óäàëèòü (drop)', + DB_ERROR_CONSTRAINT => 'íàðóøåíèå óñëîâèé ïðîâåðêè', + DB_ERROR_DIVZERO => 'äåëåíèå íà 0', + DB_ERROR_INVALID => 'íåïðàâèëüíî', + DB_ERROR_INVALID_DATE => 'íåêîððåêòíàÿ äàòà èëè âðåìÿ', + DB_ERROR_INVALID_NUMBER => 'íåêîððåêòíîå ÷èñëî', + DB_ERROR_MISMATCH => 'îøèáêà', + DB_ERROR_NODBSELECTED => 'ÁÄ íå âûáðàíà', + DB_ERROR_NOSUCHFIELD => 'íå ñóùåñòâóåò ïîëå', + DB_ERROR_NOSUCHTABLE => 'íå ñóùåñòâóåò òàáëèöà', + DB_ERROR_NOT_CAPABLE => 'ÑÓÁÄ íå â ñîñòîÿíèè', + DB_ERROR_NOT_FOUND => 'íå íàéäåíî', + DB_ERROR_NOT_LOCKED => 'íå çàáëîêèðîâàíî', + DB_ERROR_SYNTAX => 'ñèíòàêñè÷åñêàÿ îøèáêà', + DB_ERROR_UNSUPPORTED => 'íå ïîääåðæèâàåòñÿ', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ñ÷åò÷èê çíà÷åíèé â ñòðîêå', + DB_ERROR_INVALID_DSN => 'íåïðàâèëüíàÿ DSN', + DB_ERROR_CONNECT_FAILED => 'ñîåäèíåíèå íåóñïåøíî', + 0 => 'íåò îøèáêè', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ïðåäîñòàâëåíî íåäîñòàòî÷íî äàííûõ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ðàñøèðåíèå íå íàéäåíî', + DB_ERROR_NOSUCHDB => 'íå ñóùåñòâóåò ÁÄ', + DB_ERROR_ACCESS_VIOLATION => 'íåäîñòàòî÷íî ïðàâ äîñòóïà' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-sv.inc.php b/fannie/adodb5/lang/adodb-sv.inc.php new file mode 100644 index 000000000..a9fd69816 --- /dev/null +++ b/fannie/adodb5/lang/adodb-sv.inc.php @@ -0,0 +1,33 @@ + 'en', + DB_ERROR => 'Okänt fel', + DB_ERROR_ALREADY_EXISTS => 'finns redan', + DB_ERROR_CANNOT_CREATE => 'kan inte skapa', + DB_ERROR_CANNOT_DELETE => 'kan inte ta bort', + DB_ERROR_CANNOT_DROP => 'kan inte släppa', + DB_ERROR_CONSTRAINT => 'begränsning kränkt', + DB_ERROR_DIVZERO => 'division med noll', + DB_ERROR_INVALID => 'ogiltig', + DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid', + DB_ERROR_INVALID_NUMBER => 'ogiltigt tal', + DB_ERROR_MISMATCH => 'felaktig matchning', + DB_ERROR_NODBSELECTED => 'ingen databas vald', + DB_ERROR_NOSUCHFIELD => 'inget sådant fält', + DB_ERROR_NOSUCHTABLE => 'ingen sådan tabell', + DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte', + DB_ERROR_NOT_FOUND => 'finns inte', + DB_ERROR_NOT_LOCKED => 'inte låst', + DB_ERROR_SYNTAX => 'syntaxfel', + DB_ERROR_UNSUPPORTED => 'stöds ej', + DB_ERROR_VALUE_COUNT_ON_ROW => 'värde räknat på rad', + DB_ERROR_INVALID_DSN => 'ogiltig DSN', + DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades', + 0 => 'inget fel', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'otillräckligt med data angivet', + DB_ERROR_EXTENSION_NOT_FOUND=> 'utökning hittades ej', + DB_ERROR_NOSUCHDB => 'ingen sådan databas', + DB_ERROR_ACCESS_VIOLATION => 'otillräckliga rättigheter' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb-uk1251.inc.php b/fannie/adodb5/lang/adodb-uk1251.inc.php new file mode 100644 index 000000000..675016d12 --- /dev/null +++ b/fannie/adodb5/lang/adodb-uk1251.inc.php @@ -0,0 +1,35 @@ + 'uk1251', + DB_ERROR => 'íåâ³äîìà ïîìèëêà', + DB_ERROR_ALREADY_EXISTS => 'âæå ³ñíóº', + DB_ERROR_CANNOT_CREATE => 'íåìîæëèâî ñòâîðèòè', + DB_ERROR_CANNOT_DELETE => 'íåìîæëèâî âèäàëèòè', + DB_ERROR_CANNOT_DROP => 'íåìîæëèâî çíèùèòè (drop)', + DB_ERROR_CONSTRAINT => 'ïîðóøåííÿ óìîâ ïåðåâ³ðêè', + DB_ERROR_DIVZERO => 'ä³ëåííÿ íà 0', + DB_ERROR_INVALID => 'íåïðàâèëüíî', + DB_ERROR_INVALID_DATE => 'íåïðàâèëüíà äàòà ÷è ÷àñ', + DB_ERROR_INVALID_NUMBER => 'íåïðàâèëüíå ÷èñëî', + DB_ERROR_MISMATCH => 'ïîìèëêà', + DB_ERROR_NODBSELECTED => 'íå âèáðàíî ÁÄ', + DB_ERROR_NOSUCHFIELD => 'íå ³ñíóº ïîëå', + DB_ERROR_NOSUCHTABLE => 'íå ³ñíóº òàáëèöÿ', + DB_ERROR_NOT_CAPABLE => 'ÑÓÁÄ íå â ñòàí³', + DB_ERROR_NOT_FOUND => 'íå çíàéäåíî', + DB_ERROR_NOT_LOCKED => 'íå çàáëîêîâàíî', + DB_ERROR_SYNTAX => 'ñèíòàêñè÷íà ïîìèëêà', + DB_ERROR_UNSUPPORTED => 'íå ï³äòðèìóºòüñÿ', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ðàõ³âíèê çíà÷åíü â ñòð³÷ö³', + DB_ERROR_INVALID_DSN => 'íåïðàâèëüíà DSN', + DB_ERROR_CONNECT_FAILED => 'ç\'ºäíàííÿ íåóñï³øíå', + 0 => 'âñå ãàðàçä', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'íàäàíî íåäîñòàòíüî äàíèõ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ðîçøèðåííÿ íå çíàéäåíî', + DB_ERROR_NOSUCHDB => 'íå ³ñíóº ÁÄ', + DB_ERROR_ACCESS_VIOLATION => 'íåäîñòàòíüî ïðàâ äîñòóïà' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/lang/adodb_th.inc.php b/fannie/adodb5/lang/adodb_th.inc.php new file mode 100644 index 000000000..3fdd99705 --- /dev/null +++ b/fannie/adodb5/lang/adodb_th.inc.php @@ -0,0 +1,33 @@ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'th', + DB_ERROR => 'error ไม่รู้สาเหตุ', + DB_ERROR_ALREADY_EXISTS => 'มีà¹?ล้ว', + DB_ERROR_CANNOT_CREATE => 'สร้างไม่ได้', + DB_ERROR_CANNOT_DELETE => 'ลบไม่ได้', + DB_ERROR_CANNOT_DROP => 'drop ไม่ได้', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_DIVZERO => 'หาà¸?ด้วยสูà¸?', + DB_ERROR_INVALID => 'ไม่ valid', + DB_ERROR_INVALID_DATE => 'วันที่ เวลา ไม่ valid', + DB_ERROR_INVALID_NUMBER => 'เลขไม่ valid', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'ไม่ได้เลือà¸?à¸?านข้อมูล', + DB_ERROR_NOSUCHFIELD => 'ไม่มีฟีลด์นี้', + DB_ERROR_NOSUCHTABLE => 'ไม่มีตารางนี้', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'ไม่พบ', + DB_ERROR_NOT_LOCKED => 'ไม่ได้ล๊อà¸?', + DB_ERROR_SYNTAX => 'ผิด syntax', + DB_ERROR_UNSUPPORTED => 'ไม่ support', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_CONNECT_FAILED => 'ไม่สามารถ connect', + 0 => 'no error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ข้อมูลไม่เพียงพอ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ไม่พบ extension', + DB_ERROR_NOSUCHDB => 'ไม่มีข้อมูลนี้', + DB_ERROR_ACCESS_VIOLATION => 'permissions ไม่พอ' +); +?> \ No newline at end of file diff --git a/fannie/adodb5/license.txt b/fannie/adodb5/license.txt new file mode 100644 index 000000000..2353871c0 --- /dev/null +++ b/fannie/adodb5/license.txt @@ -0,0 +1,182 @@ +ADOdb is dual licensed using BSD and LGPL. + +In plain English, you do not need to distribute your application in source code form, nor do you need to distribute ADOdb source code, provided you follow the rest of terms of the BSD license. + +For more info about ADOdb, visit http://adodb.sourceforge.net/ + +BSD Style-License +================= + +Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list +of conditions and the following disclaimer in the documentation and/or other materials +provided with the distribution. + +Neither the name of the John Lim nor the names of its contributors may be used to +endorse or promote products derived from this software without specific prior written +permission. + +DISCLAIMER: +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +JOHN LIM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +========================================================== +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[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. + + +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 \ No newline at end of file diff --git a/fannie/adodb5/pear/Auth/Container/ADOdb.php b/fannie/adodb5/pear/Auth/Container/ADOdb.php new file mode 100644 index 000000000..c7b961e44 --- /dev/null +++ b/fannie/adodb5/pear/Auth/Container/ADOdb.php @@ -0,0 +1,413 @@ + +// | Richard Tango-Lowy | +// +----------------------------------------------------------------------+ +// +// $Id: ADOdb.php,v 1.3 2005/05/18 06:58:47 jlim Exp $ +// + +require_once 'Auth/Container.php'; +require_once 'adodb.inc.php'; +require_once 'adodb-pear.inc.php'; +require_once 'adodb-errorpear.inc.php'; + +/** + * Storage driver for fetching login data from a database using ADOdb-PHP. + * + * This storage driver can use all databases which are supported + * by the ADBdb DB abstraction layer to fetch login data. + * See http://php.weblogs.com/adodb for information on ADOdb. + * NOTE: The ADOdb directory MUST be in your PHP include_path! + * + * @author Richard Tango-Lowy + * @package Auth + * @version $Revision: 1.3 $ + */ +class Auth_Container_ADOdb extends Auth_Container +{ + + /** + * Additional options for the storage container + * @var array + */ + var $options = array(); + + /** + * DB object + * @var object + */ + var $db = null; + var $dsn = ''; + + /** + * User that is currently selected from the DB. + * @var string + */ + var $activeUser = ''; + + // {{{ Constructor + + /** + * Constructor of the container class + * + * Initate connection to the database via PEAR::ADOdb + * + * @param string Connection data or DB object + * @return object Returns an error object if something went wrong + */ + function Auth_Container_ADOdb($dsn) + { + $this->_setDefaults(); + + if (is_array($dsn)) { + $this->_parseOptions($dsn); + + if (empty($this->options['dsn'])) { + PEAR::raiseError('No connection parameters specified!'); + } + } else { + // Extract db_type from dsn string. + $this->options['dsn'] = $dsn; + } + } + + // }}} + // {{{ _connect() + + /** + * Connect to database by using the given DSN string + * + * @access private + * @param string DSN string + * @return mixed Object on error, otherwise bool + */ + function _connect($dsn) + { + if (is_string($dsn) || is_array($dsn)) { + if(!$this->db) { + $this->db = ADONewConnection($dsn); + if( $err = ADODB_Pear_error() ) { + return PEAR::raiseError($err); + } + } + + } else { + return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__, + 41, + PEAR_ERROR_RETURN, + null, + null + ); + } + + if(!$this->db) { + return PEAR::raiseError(ADODB_Pear_error()); + } else { + return true; + } + } + + // }}} + // {{{ _prepare() + + /** + * Prepare database connection + * + * This function checks if we have already opened a connection to + * the database. If that's not the case, a new connection is opened. + * + * @access private + * @return mixed True or a DB error object. + */ + function _prepare() + { + if(!$this->db) { + $res = $this->_connect($this->options['dsn']); + } + return true; + } + + // }}} + // {{{ query() + + /** + * Prepare query to the database + * + * This function checks if we have already opened a connection to + * the database. If that's not the case, a new connection is opened. + * After that the query is passed to the database. + * + * @access public + * @param string Query string + * @return mixed a DB_result object or DB_OK on success, a DB + * or PEAR error on failure + */ + function query($query) + { + $err = $this->_prepare(); + if ($err !== true) { + return $err; + } + return $this->db->query($query); + } + + // }}} + // {{{ _setDefaults() + + /** + * Set some default options + * + * @access private + * @return void + */ + function _setDefaults() + { + $this->options['db_type'] = 'mysql'; + $this->options['table'] = 'auth'; + $this->options['usernamecol'] = 'username'; + $this->options['passwordcol'] = 'password'; + $this->options['dsn'] = ''; + $this->options['db_fields'] = ''; + $this->options['cryptType'] = 'md5'; + } + + // }}} + // {{{ _parseOptions() + + /** + * Parse options passed to the container class + * + * @access private + * @param array + */ + function _parseOptions($array) + { + foreach ($array as $key => $value) { + if (isset($this->options[$key])) { + $this->options[$key] = $value; + } + } + + /* Include additional fields if they exist */ + if(!empty($this->options['db_fields'])){ + if(is_array($this->options['db_fields'])){ + $this->options['db_fields'] = join($this->options['db_fields'], ', '); + } + $this->options['db_fields'] = ', '.$this->options['db_fields']; + } + } + + // }}} + // {{{ fetchData() + + /** + * Get user information from database + * + * This function uses the given username to fetch + * the corresponding login data from the database + * table. If an account that matches the passed username + * and password is found, the function returns true. + * Otherwise it returns false. + * + * @param string Username + * @param string Password + * @return mixed Error object or boolean + */ + function fetchData($username, $password) + { + // Prepare for a database query + $err = $this->_prepare(); + if ($err !== true) { + return PEAR::raiseError($err->getMessage(), $err->getCode()); + } + + // Find if db_fields contains a *, i so assume all col are selected + if(strstr($this->options['db_fields'], '*')){ + $sql_from = "*"; + } + else{ + $sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields']; + } + + $query = "SELECT ".$sql_from. + " FROM ".$this->options['table']. + " WHERE ".$this->options['usernamecol']." = " . $this->db->Quote($username); + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rset = $this->db->Execute( $query ); + $res = $rset->fetchRow(); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } + if (!is_array($res)) { + $this->activeUser = ''; + return false; + } + if ($this->verifyPassword(trim($password, "\r\n"), + trim($res[$this->options['passwordcol']], "\r\n"), + $this->options['cryptType'])) { + // Store additional field values in the session + foreach ($res as $key => $value) { + if ($key == $this->options['passwordcol'] || + $key == $this->options['usernamecol']) { + continue; + } + // Use reference to the auth object if exists + // This is because the auth session variable can change so a static call to setAuthData does not make sence + if(is_object($this->_auth_obj)){ + $this->_auth_obj->setAuthData($key, $value); + } else { + Auth::setAuthData($key, $value); + } + } + + return true; + } + + $this->activeUser = $res[$this->options['usernamecol']]; + return false; + } + + // }}} + // {{{ listUsers() + + function listUsers() + { + $err = $this->_prepare(); + if ($err !== true) { + return PEAR::raiseError($err->getMessage(), $err->getCode()); + } + + $retVal = array(); + + // Find if db_fileds contains a *, i so assume all col are selected + if(strstr($this->options['db_fields'], '*')){ + $sql_from = "*"; + } + else{ + $sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields']; + } + + $query = sprintf("SELECT %s FROM %s", + $sql_from, + $this->options['table'] + ); + $res = $this->db->getAll($query, null, DB_FETCHMODE_ASSOC); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } else { + foreach ($res as $user) { + $user['username'] = $user[$this->options['usernamecol']]; + $retVal[] = $user; + } + } + return $retVal; + } + + // }}} + // {{{ addUser() + + /** + * Add user to the storage container + * + * @access public + * @param string Username + * @param string Password + * @param mixed Additional information that are stored in the DB + * + * @return mixed True on success, otherwise error object + */ + function addUser($username, $password, $additional = "") + { + if (function_exists($this->options['cryptType'])) { + $cryptFunction = $this->options['cryptType']; + } else { + $cryptFunction = 'md5'; + } + + $additional_key = ''; + $additional_value = ''; + + if (is_array($additional)) { + foreach ($additional as $key => $value) { + $additional_key .= ', ' . $key; + $additional_value .= ", '" . $value . "'"; + } + } + + $query = sprintf("INSERT INTO %s (%s, %s%s) VALUES ('%s', '%s'%s)", + $this->options['table'], + $this->options['usernamecol'], + $this->options['passwordcol'], + $additional_key, + $username, + $cryptFunction($password), + $additional_value + ); + + $res = $this->query($query); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } else { + return true; + } + } + + // }}} + // {{{ removeUser() + + /** + * Remove user from the storage container + * + * @access public + * @param string Username + * + * @return mixed True on success, otherwise error object + */ + function removeUser($username) + { + $query = sprintf("DELETE FROM %s WHERE %s = '%s'", + $this->options['table'], + $this->options['usernamecol'], + $username + ); + + $res = $this->query($query); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } else { + return true; + } + } + + // }}} +} + +function showDbg( $string ) { + print " +-- $string

        "; +} +function dump( $var, $str, $vardump = false ) { + print "

        $str

        ";
        +	( !$vardump ) ? ( print_r( $var )) : ( var_dump( $var ));
        +	print "
        "; +} +?> diff --git a/fannie/adodb5/pear/readme.Auth.txt b/fannie/adodb5/pear/readme.Auth.txt new file mode 100644 index 000000000..db2831976 --- /dev/null +++ b/fannie/adodb5/pear/readme.Auth.txt @@ -0,0 +1,20 @@ +From: Rich Tango-Lowy (richtl#arscognita.com) +Date: Sat, May 29, 2004 11:20 am + +OK, I hacked out an ADOdb container for PEAR-Auth. The error handling's +a bit of a mess, but all the methods work. + +Copy ADOdb.php to your pear/Auth/Container/ directory. + +Use the ADOdb container exactly as you would the DB +container, but specify 'ADOdb' instead of 'DB': + +$dsn = "mysql://myuser:mypass@localhost/authdb"; +$a = new Auth("ADOdb", $dsn, "loginFunction"); + + +------------------- + +John Lim adds: + +See http://pear.php.net/manual/en/package.authentication.php diff --git a/fannie/adodb5/perf/perf-db2.inc.php b/fannie/adodb5/perf/perf-db2.inc.php new file mode 100644 index 000000000..1bbb86a8d --- /dev/null +++ b/fannie/adodb5/perf/perf-db2.inc.php @@ -0,0 +1,102 @@ + array('RATIO', + "SELECT + case when sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)=0 then 0 + else 100*(1-sum(POOL_DATA_P_READS+POOL_INDEX_P_READS)/sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)) end + FROM TABLE(SNAPSHOT_APPL('',-2)) as t", + '=WarnCacheRatio'), + + 'Data Cache', + 'data cache buffers' => array('DATAC', + 'select sum(npages) from SYSCAT.BUFFERPOOLS', + 'See tuning reference.' ), + 'cache blocksize' => array('DATAC', + 'select avg(pagesize) from SYSCAT.BUFFERPOOLS', + '' ), + 'data cache size' => array('DATAC', + 'select sum(npages*pagesize) from SYSCAT.BUFFERPOOLS', + '' ), + 'Connections', + 'current connections' => array('SESS', + "SELECT count(*) FROM TABLE(SNAPSHOT_APPL_INFO('',-2)) as t", + ''), + + false + ); + + + function perf_db2(&$conn) + { + $this->conn = $conn; + } + + function Explain($sql,$partial=false) + { + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + $qno = rand(); + $ok = $this->conn->Execute("EXPLAIN PLAN SET QUERYNO=$qno FOR $sql"); + ob_start(); + if (!$ok) echo "

        Have EXPLAIN tables been created?

        "; + else { + $rs = $this->conn->Execute("select * from explain_statement where queryno=$qno"); + if ($rs) rs2html($rs); + } + $s = ob_get_contents(); + ob_end_clean(); + $this->conn->LogSQL($save); + + $s .= $this->Tracer($sql); + return $s; + } + + + function Tables() + { + $rs = $this->conn->Execute("select tabschema,tabname,card as rows, + npages pages_used,fpages pages_allocated, tbspace tablespace + from syscat.tables where tabschema not in ('SYSCAT','SYSIBM','SYSSTAT') order by 1,2"); + return rs2html($rs,false,false,false,false); + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/perf/perf-informix.inc.php b/fannie/adodb5/perf/perf-informix.inc.php new file mode 100644 index 000000000..b534e5d20 --- /dev/null +++ b/fannie/adodb5/perf/perf-informix.inc.php @@ -0,0 +1,70 @@ + array('RATIOH', + "select round((1-(wt.value / (rd.value + wr.value)))*100,2) + from sysmaster:sysprofile wr, sysmaster:sysprofile rd, sysmaster:sysprofile wt + where rd.name = 'pagreads' and + wr.name = 'pagwrites' and + wt.name = 'buffwts'", + '=WarnCacheRatio'), + 'IO', + 'data reads' => array('IO', + "select value from sysmaster:sysprofile where name='pagreads'", + 'Page reads'), + + 'data writes' => array('IO', + "select value from sysmaster:sysprofile where name='pagwrites'", + 'Page writes'), + + 'Connections', + 'current connections' => array('SESS', + 'select count(*) from sysmaster:syssessions', + 'Number of sessions'), + + false + + ); + + function perf_informix(&$conn) + { + $this->conn = $conn; + } + +} +?> diff --git a/fannie/adodb5/perf/perf-mssql.inc.php b/fannie/adodb5/perf/perf-mssql.inc.php new file mode 100644 index 000000000..0f97fa228 --- /dev/null +++ b/fannie/adodb5/perf/perf-mssql.inc.php @@ -0,0 +1,164 @@ + array('RATIO', + "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'", + '=WarnCacheRatio'), + 'prepared sql hit ratio' => array('RATIO', + array('dbcc cachestats','Prepared',1,100), + ''), + 'adhoc sql hit ratio' => array('RATIO', + array('dbcc cachestats','Adhoc',1,100), + ''), + 'IO', + 'data reads' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"), + 'data writes' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"), + + 'Data Cache', + 'data cache size' => array('DATAC', + "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'", + '' ), + 'data cache blocksize' => array('DATAC', + "select 8192",'page size'), + 'Connections', + 'current connections' => array('SESS', + '=sp_who', + ''), + 'max connections' => array('SESS', + "SELECT @@MAX_CONNECTIONS", + ''), + + false + ); + + + function perf_mssql(&$conn) + { + if ($conn->dataProvider == 'odbc') { + $this->sql1 = 'sql1'; + //$this->explain = false; + } + $this->conn = $conn; + } + + function Explain($sql,$partial=false) + { + + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + + $s = '

        Explain: '.htmlspecialchars($sql).'

        '; + $this->conn->Execute("SET SHOWPLAN_ALL ON;"); + $sql = str_replace('?',"''",$sql); + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $this->conn->Execute($sql); + //adodb_printr($rs); + $ADODB_FETCH_MODE = $save; + if ($rs) { + $rs->MoveNext(); + $s .= ''; + while (!$rs->EOF) { + $s .= '\n"; ## NOTE CORRUPT tag is intentional!!!! + $rs->MoveNext(); + } + $s .= '
        Rows IO CPU     Plan
        '.round($rs->fields[8],1).''.round($rs->fields[9],3).''.round($rs->fields[10],3).'
        '.htmlspecialchars($rs->fields[0])."
        '; + + $rs->NextRecordSet(); + } + + $this->conn->Execute("SET SHOWPLAN_ALL OFF;"); + $this->conn->LogSQL($save); + $s .= $this->Tracer($sql); + return $s; + } + + function Tables() + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + //$this->conn->debug=1; + $s = ''; + $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'"); + if ($rs1) { + while (!$rs1->EOF) { + $tab = $rs1->fields[0]; + $tabq = $this->conn->qstr($tab); + $rs2 = $this->conn->Execute("sp_spaceused $tabq"); + if ($rs2) { + $s .= ''; + $rs2->Close(); + } + $rs1->MoveNext(); + } + $rs1->Close(); + } + $ADODB_FETCH_MODE = $save; + return $s.'
        tablenamesize_in_kindex sizereserved size
        '.$tab.''.$rs2->fields[3].''.$rs2->fields[4].''.$rs2->fields[2].'
        '; + } + + function sp_who() + { + $arr = $this->conn->GetArray('sp_who'); + return sizeof($arr); + } + + function HealthCheck($cli=false) + { + + $this->conn->Execute('dbcc traceon(3604)'); + $html = adodb_perf::HealthCheck($cli); + $this->conn->Execute('dbcc traceoff(3604)'); + return $html; + } + + +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/perf/perf-mssqlnative.inc.php b/fannie/adodb5/perf/perf-mssqlnative.inc.php new file mode 100644 index 000000000..e6fb481a7 --- /dev/null +++ b/fannie/adodb5/perf/perf-mssqlnative.inc.php @@ -0,0 +1,164 @@ + array('RATIO', + "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'", + '=WarnCacheRatio'), + 'prepared sql hit ratio' => array('RATIO', + array('dbcc cachestats','Prepared',1,100), + ''), + 'adhoc sql hit ratio' => array('RATIO', + array('dbcc cachestats','Adhoc',1,100), + ''), + 'IO', + 'data reads' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"), + 'data writes' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"), + + 'Data Cache', + 'data cache size' => array('DATAC', + "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'", + '' ), + 'data cache blocksize' => array('DATAC', + "select 8192",'page size'), + 'Connections', + 'current connections' => array('SESS', + '=sp_who', + ''), + 'max connections' => array('SESS', + "SELECT @@MAX_CONNECTIONS", + ''), + + false + ); + + + function perf_mssqlnative(&$conn) + { + if ($conn->dataProvider == 'odbc') { + $this->sql1 = 'sql1'; + //$this->explain = false; + } + $this->conn =& $conn; + } + + function Explain($sql,$partial=false) + { + + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + + $s = '

        Explain: '.htmlspecialchars($sql).'

        '; + $this->conn->Execute("SET SHOWPLAN_ALL ON;"); + $sql = str_replace('?',"''",$sql); + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs =& $this->conn->Execute($sql); + //adodb_printr($rs); + $ADODB_FETCH_MODE = $save; + if ($rs) { + $rs->MoveNext(); + $s .= ''; + while (!$rs->EOF) { + $s .= '\n"; ## NOTE CORRUPT tag is intentional!!!! + $rs->MoveNext(); + } + $s .= '
        Rows IO CPU     Plan
        '.round($rs->fields[8],1).''.round($rs->fields[9],3).''.round($rs->fields[10],3).'
        '.htmlspecialchars($rs->fields[0])."
        '; + + $rs->NextRecordSet(); + } + + $this->conn->Execute("SET SHOWPLAN_ALL OFF;"); + $this->conn->LogSQL($save); + $s .= $this->Tracer($sql); + return $s; + } + + function Tables() + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + //$this->conn->debug=1; + $s = ''; + $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'"); + if ($rs1) { + while (!$rs1->EOF) { + $tab = $rs1->fields[0]; + $tabq = $this->conn->qstr($tab); + $rs2 = $this->conn->Execute("sp_spaceused $tabq"); + if ($rs2) { + $s .= ''; + $rs2->Close(); + } + $rs1->MoveNext(); + } + $rs1->Close(); + } + $ADODB_FETCH_MODE = $save; + return $s.'
        tablenamesize_in_kindex sizereserved size
        '.$tab.''.$rs2->fields[3].''.$rs2->fields[4].''.$rs2->fields[2].'
        '; + } + + function sp_who() + { + $arr = $this->conn->GetArray('sp_who'); + return sizeof($arr); + } + + function HealthCheck($cli=false) + { + + $this->conn->Execute('dbcc traceon(3604)'); + $html = adodb_perf::HealthCheck($cli); + $this->conn->Execute('dbcc traceoff(3604)'); + return $html; + } + + +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/perf/perf-mysql.inc.php b/fannie/adodb5/perf/perf-mysql.inc.php new file mode 100644 index 000000000..dc574da28 --- /dev/null +++ b/fannie/adodb5/perf/perf-mysql.inc.php @@ -0,0 +1,315 @@ + array('RATIO', + '=GetKeyHitRatio', + '=WarnCacheRatio'), + 'InnoDB cache hit ratio' => array('RATIO', + '=GetInnoDBHitRatio', + '=WarnCacheRatio'), + 'data cache hit ratio' => array('HIDE', # only if called + '=FindDBHitRatio', + '=WarnCacheRatio'), + 'sql cache hit ratio' => array('RATIO', + '=GetQHitRatio', + ''), + 'IO', + 'data reads' => array('IO', + '=GetReads', + 'Number of selects (Key_reads is not accurate)'), + 'data writes' => array('IO', + '=GetWrites', + 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'), + + 'Data Cache', + 'MyISAM data cache size' => array('DATAC', + array("show variables", 'key_buffer_size'), + '' ), + 'BDB data cache size' => array('DATAC', + array("show variables", 'bdb_cache_size'), + '' ), + 'InnoDB data cache size' => array('DATAC', + array("show variables", 'innodb_buffer_pool_size'), + '' ), + 'Memory Usage', + 'read buffer size' => array('CACHE', + array("show variables", 'read_buffer_size'), + '(per session)'), + 'sort buffer size' => array('CACHE', + array("show variables", 'sort_buffer_size'), + 'Size of sort buffer (per session)' ), + 'table cache' => array('CACHE', + array("show variables", 'table_cache'), + 'Number of tables to keep open'), + 'Connections', + 'current connections' => array('SESS', + array('show status','Threads_connected'), + ''), + 'max connections' => array( 'SESS', + array("show variables",'max_connections'), + ''), + + false + ); + + function perf_mysql(&$conn) + { + $this->conn = $conn; + } + + function Explain($sql,$partial=false) + { + + if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '

        Unable to EXPLAIN non-select statement

        '; + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + $sql = str_replace('?',"''",$sql); + + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq"); + } + + $s = '

        Explain: '.htmlspecialchars($sql).'

        '; + $rs = $this->conn->Execute('EXPLAIN '.$sql); + $s .= rs2html($rs,false,false,false,false); + $this->conn->LogSQL($save); + $s .= $this->Tracer($sql); + return $s; + } + + function Tables() + { + if (!$this->tablesSQL) return false; + + $rs = $this->conn->Execute($this->tablesSQL); + if (!$rs) return false; + + $html = rs2html($rs,false,false,false,false); + return $html; + } + + function GetReads() + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs) return 0; + $val = 0; + while (!$rs->EOF) { + switch($rs->fields[0]) { + case 'Com_select': + $val = $rs->fields[1]; + $rs->Close(); + return $val; + } + $rs->MoveNext(); + } + + $rs->Close(); + + return $val; + } + + function GetWrites() + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs) return 0; + $val = 0.0; + while (!$rs->EOF) { + switch($rs->fields[0]) { + case 'Com_insert': + $val += $rs->fields[1]; break; + case 'Com_delete': + $val += $rs->fields[1]; break; + case 'Com_update': + $val += $rs->fields[1]/2; + $rs->Close(); + return $val; + } + $rs->MoveNext(); + } + + $rs->Close(); + + return $val; + } + + function FindDBHitRatio() + { + // first find out type of table + //$this->conn->debug=1; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show table status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs) return ''; + $type = strtoupper($rs->fields[1]); + $rs->Close(); + switch($type){ + case 'MYISAM': + case 'ISAM': + return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)'; + case 'INNODB': + return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)'; + default: + return $type.' not supported'; + } + + } + + function GetQHitRatio() + { + //Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached + $hits = $this->_DBParameter(array("show status","Qcache_hits")); + $total = $this->_DBParameter(array("show status","Qcache_inserts")); + $total += $this->_DBParameter(array("show status","Qcache_not_cached")); + + $total += $hits; + if ($total) return round(($hits*100)/$total,2); + return 0; + } + + /* + Use session variable to store Hit percentage, because MySQL + does not remember last value of SHOW INNODB STATUS hit ratio + + # 1st query to SHOW INNODB STATUS + 0.00 reads/s, 0.00 creates/s, 0.00 writes/s + Buffer pool hit rate 1000 / 1000 + + # 2nd query to SHOW INNODB STATUS + 0.00 reads/s, 0.00 creates/s, 0.00 writes/s + No buffer pool activity since the last printout + */ + function GetInnoDBHitRatio() + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show innodb status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs || $rs->EOF) return 0; + $stat = $rs->fields[0]; + $rs->Close(); + $at = strpos($stat,'Buffer pool hit rate'); + $stat = substr($stat,$at,200); + if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) { + $val = 100*$arr[1]/$arr[2]; + $_SESSION['INNODB_HIT_PCT'] = $val; + return round($val,2); + } else { + if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT']; + return 0; + } + return 0; + } + + function GetKeyHitRatio() + { + $hits = $this->_DBParameter(array("show status","Key_read_requests")); + $reqs = $this->_DBParameter(array("show status","Key_reads")); + if ($reqs == 0) return 0; + + return round(($hits/($reqs+$hits))*100,2); + } + + // start hack + var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK'; + var $optimizeTableHigh = 'OPTIMIZE TABLE %s'; + + /** + * @see adodb_perf#optimizeTable + */ + function optimizeTable( $table, $mode = ADODB_OPT_LOW) + { + if ( !is_string( $table)) return false; + + $conn = $this->conn; + if ( !$conn) return false; + + $sql = ''; + switch( $mode) { + case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; + case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break; + default : + { + // May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0) + ADOConnection::outp( sprintf( "

        %s: '%s' using of undefined mode '%s'

        ", __CLASS__, __FUNCTION__, $mode)); + return false; + } + } + $sql = sprintf( $sql, $table); + + return $conn->Execute( $sql) !== false; + } + // end hack +} +?> \ No newline at end of file diff --git a/fannie/adodb5/perf/perf-oci8.inc.php b/fannie/adodb5/perf/perf-oci8.inc.php new file mode 100644 index 000000000..41a3fdd0e --- /dev/null +++ b/fannie/adodb5/perf/perf-oci8.inc.php @@ -0,0 +1,570 @@ + array('RATIOH', + "select round((1-(phy.value / (cur.value + con.value)))*100,2) + from v\$sysstat cur, v\$sysstat con, v\$sysstat phy + where cur.name = 'db block gets' and + con.name = 'consistent gets' and + phy.name = 'physical reads'", + '=WarnCacheRatio'), + + 'sql cache hit ratio' => array( 'RATIOH', + 'select round(100*(sum(pins)-sum(reloads))/sum(pins),2) from v$librarycache', + 'increase shared_pool_size if too ratio low'), + + 'datadict cache hit ratio' => array('RATIOH', + "select + round((1 - (sum(getmisses) / (sum(gets) + + sum(getmisses))))*100,2) + from v\$rowcache", + 'increase shared_pool_size if too ratio low'), + + 'memory sort ratio' => array('RATIOH', + "SELECT ROUND((100 * b.VALUE) /DECODE ((a.VALUE + b.VALUE), + 0,1,(a.VALUE + b.VALUE)),2) +FROM v\$sysstat a, + v\$sysstat b +WHERE a.name = 'sorts (disk)' +AND b.name = 'sorts (memory)'", + "% of memory sorts compared to disk sorts - should be over 95%"), + + 'IO', + 'data reads' => array('IO', + "select value from v\$sysstat where name='physical reads'"), + + 'data writes' => array('IO', + "select value from v\$sysstat where name='physical writes'"), + + 'Data Cache', + + 'data cache buffers' => array( 'DATAC', + "select a.value/b.value from v\$parameter a, v\$parameter b + where a.name = 'db_cache_size' and b.name= 'db_block_size'", + 'Number of cache buffers. Tune db_cache_size if the data cache hit ratio is too low.'), + 'data cache blocksize' => array('DATAC', + "select value from v\$parameter where name='db_block_size'", + '' ), + + 'Memory Pools', + 'SGA Max Size' => array( 'DATAC', + "select value from v\$parameter where name = 'sga_max_size'", + 'The sga_max_size is the maximum value to which sga_target can be set.' ), + 'SGA target' => array( 'DATAC', + "select value from v\$parameter where name = 'sga_target'", + 'If sga_target is defined then data cache, shared, java and large pool size can be 0. This is because all these pools are consolidated into one sga_target.' ), + 'data cache size' => array('DATAC', + "select value from v\$parameter where name = 'db_cache_size'", + 'db_cache_size' ), + 'shared pool size' => array('DATAC', + "select value from v\$parameter where name = 'shared_pool_size'", + 'shared_pool_size, which holds shared sql, stored procedures, dict cache and similar shared structs' ), + 'java pool size' => array('DATAJ', + "select value from v\$parameter where name = 'java_pool_size'", + 'java_pool_size' ), + 'large pool buffer size' => array('CACHE', + "select value from v\$parameter where name='large_pool_size'", + 'this pool is for large mem allocations (not because it is larger than shared pool), for MTS sessions, parallel queries, io buffers (large_pool_size) ' ), + + 'pga buffer size' => array('CACHE', + "select value from v\$parameter where name='pga_aggregate_target'", + 'program global area is private memory for sorting, and hash and bitmap merges - since oracle 9i (pga_aggregate_target)' ), + + + 'Connections', + 'current connections' => array('SESS', + 'select count(*) from sys.v_$session where username is not null', + ''), + 'max connections' => array( 'SESS', + "select value from v\$parameter where name='sessions'", + ''), + + 'Memory Utilization', + 'data cache utilization ratio' => array('RATIOU', + "select round((1-bytes/sgasize)*100, 2) + from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f + where name = 'free memory' and pool = 'shared pool'", + 'Percentage of data cache actually in use - should be over 85%'), + + 'shared pool utilization ratio' => array('RATIOU', + 'select round((sga.bytes/case when p.value=0 then sga.bytes else to_number(p.value) end)*100,2) + from v$sgastat sga, v$parameter p + where sga.name = \'free memory\' and sga.pool = \'shared pool\' + and p.name = \'shared_pool_size\'', + 'Percentage of shared pool actually used - too low is bad, too high is worse'), + + 'large pool utilization ratio' => array('RATIOU', + "select round((1-bytes/sgasize)*100, 2) + from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f + where name = 'free memory' and pool = 'large pool'", + 'Percentage of large_pool actually in use - too low is bad, too high is worse'), + 'sort buffer size' => array('CACHE', + "select value from v\$parameter where name='sort_area_size'", + 'max in-mem sort_area_size (per query), uses memory in pga' ), + + 'pga usage at peak' => array('RATIOU', + '=PGA','Mb utilization at peak transactions (requires Oracle 9i+)'), + 'Transactions', + 'rollback segments' => array('ROLLBACK', + "select count(*) from sys.v_\$rollstat", + ''), + + 'peak transactions' => array('ROLLBACK', + "select max_utilization tx_hwm + from sys.v_\$resource_limit + where resource_name = 'transactions'", + 'Taken from high-water-mark'), + 'max transactions' => array('ROLLBACK', + "select value from v\$parameter where name = 'transactions'", + 'max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)'), + 'Parameters', + 'cursor sharing' => array('CURSOR', + "select value from v\$parameter where name = 'cursor_sharing'", + 'Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See cursor_sharing.'), + /* + 'cursor reuse' => array('CURSOR', + "select count(*) from (select sql_text_wo_constants, count(*) + from t1 + group by sql_text_wo_constants +having count(*) > 100)",'These are sql statements that should be using bind variables'),*/ + 'index cache cost' => array('COST', + "select value from v\$parameter where name = 'optimizer_index_caching'", + '=WarnIndexCost'), + 'random page cost' => array('COST', + "select value from v\$parameter where name = 'optimizer_index_cost_adj'", + '=WarnPageCost'), + + 'Backup', + 'Achivelog Mode' => array('BACKUP', 'select log_mode from v$database', 'To turn on archivelog:
        +
        +        SQLPLUS> connect sys as sysdba;
        +        SQLPLUS> shutdown immediate;
        +
        +        SQLPLUS> startup mount exclusive;
        +        SQLPLUS> alter database archivelog;
        +        SQLPLUS> archive log start;
        +        SQLPLUS> alter database open;
        +
        '), + + 'DBID' => array('BACKUP','select dbid from v$database','Primary key of database, used for recovery with an RMAN Recovery Catalog'), + 'Archive Log Dest' => array('BACKUP', "SELECT NVL(v1.value,v2.value) +FROM v\$parameter v1, v\$parameter v2 WHERE v1.name='log_archive_dest' AND v2.name='log_archive_dest_10'", ''), + + 'Flashback Area' => array('BACKUP', "select nvl(value,'Flashback Area not used') from v\$parameter where name=lower('DB_RECOVERY_FILE_DEST')", 'Flashback area is a folder where all backup data and logs can be stored and managed by Oracle. If Error: message displayed, then it is not in use.'), + 'Control File Keep Time' => array('BACKUP', "select value from v\$parameter where name='control_file_record_keep_time'",'No of days to keep RMAN info in control file. I recommend it be set to x2 or x3 times the frequency of your full backup.'), + false + + ); + + + function perf_oci8(&$conn) + { + $savelog = $conn->LogSQL(false); + $this->version = $conn->ServerInfo(); + $conn->LogSQL($savelog); + $this->conn = $conn; + } + + function WarnPageCost($val) + { + if ($val == 100) $s = 'Too High. '; + else $s = ''; + + return $s.'Recommended is 20-50 for TP, and 50 for data warehouses. Default is 100. See optimizer_index_cost_adj. '; + } + + function WarnIndexCost($val) + { + if ($val == 0) $s = 'Too Low. '; + else $s = ''; + + return $s.'Percentage of indexed data blocks expected in the cache. + Recommended is 20 (fast disk array) to 30 (slower hard disks). Default is 0. + See optimizer_index_caching.'; + } + + function PGA() + { + if ($this->version['version'] < 9) return 'Oracle 9i or later required'; + + $rs = $this->conn->Execute("select a.mb,a.targ as pga_size_pct,a.pct from + (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb, + pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r + from v\$pga_target_advice) a left join + (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb, + pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r + from v\$pga_target_advice) b on + a.r = b.r+1 where + b.pct < 100"); + if (!$rs) return "Only in 9i or later"; + $rs->Close(); + if ($rs->EOF) return "PGA could be too big"; + + return reset($rs->fields); + } + + function Explain($sql,$partial=false) + { + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->SelectLimit("select ID FROM PLAN_TABLE"); + if (!$rs) { + echo "

        Missing PLAN_TABLE

        +
        +CREATE TABLE PLAN_TABLE (
        +  STATEMENT_ID                    VARCHAR2(30),
        +  TIMESTAMP                       DATE,
        +  REMARKS                         VARCHAR2(80),
        +  OPERATION                       VARCHAR2(30),
        +  OPTIONS                         VARCHAR2(30),
        +  OBJECT_NODE                     VARCHAR2(128),
        +  OBJECT_OWNER                    VARCHAR2(30),
        +  OBJECT_NAME                     VARCHAR2(30),
        +  OBJECT_INSTANCE                 NUMBER(38),
        +  OBJECT_TYPE                     VARCHAR2(30),
        +  OPTIMIZER                       VARCHAR2(255),
        +  SEARCH_COLUMNS                  NUMBER,
        +  ID                              NUMBER(38),
        +  PARENT_ID                       NUMBER(38),
        +  POSITION                        NUMBER(38),
        +  COST                            NUMBER(38),
        +  CARDINALITY                     NUMBER(38),
        +  BYTES                           NUMBER(38),
        +  OTHER_TAG                       VARCHAR2(255),
        +  PARTITION_START                 VARCHAR2(255),
        +  PARTITION_STOP                  VARCHAR2(255),
        +  PARTITION_ID                    NUMBER(38),
        +  OTHER                           LONG,
        +  DISTRIBUTION                    VARCHAR2(30)
        +);
        +
        "; + return false; + } + + $rs->Close(); + // $this->conn->debug=1; + + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + + $s = "

        Explain: ".htmlspecialchars($sql)."

        "; + + $this->conn->BeginTrans(); + $id = "ADODB ".microtime(); + + $rs = $this->conn->Execute("EXPLAIN PLAN SET STATEMENT_ID='$id' FOR $sql"); + $m = $this->conn->ErrorMsg(); + if ($m) { + $this->conn->RollbackTrans(); + $this->conn->LogSQL($savelog); + $s .= "

        $m

        "; + return $s; + } + $rs = $this->conn->Execute(" + select + '
        '||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'
        ' as Operation, + object_name,COST,CARDINALITY,bytes + FROM plan_table +START WITH id = 0 and STATEMENT_ID='$id' +CONNECT BY prior id=parent_id and statement_id='$id'"); + + $s .= rs2html($rs,false,false,false,false); + $this->conn->RollbackTrans(); + $this->conn->LogSQL($savelog); + $s .= $this->Tracer($sql,$partial); + return $s; + } + + + function CheckMemory() + { + if ($this->version['version'] < 9) return 'Oracle 9i or later required'; + + $rs = $this->conn->Execute(" +select a.size_for_estimate as cache_mb_estimate, + case when a.size_factor=1 then + '<<= current' + when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then + '- BETTER - ' + else ' ' end as currsize, + a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0 + from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a , + (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1"); + if (!$rs) return false; + + /* + The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size + */ + $s = "

        Data Cache Estimate

        "; + if ($rs->EOF) { + $s .= "

        Cache that is 50% of current size is still too big

        "; + } else { + $s .= "Ideal size of Data Cache is when \"best_when_0\" changes from a positive number and becomes zero."; + $s .= rs2html($rs,false,false,false,false); + } + return $s; + } + + /* + Generate html for suspicious/expensive sql + */ + function tohtml(&$rs,$type) + { + $o1 = $rs->FetchField(0); + $o2 = $rs->FetchField(1); + $o3 = $rs->FetchField(2); + if ($rs->EOF) return '

        None found

        '; + $check = ''; + $sql = ''; + $s = "\n\n'; + while (!$rs->EOF) { + if ($check != $rs->fields[0].'::'.$rs->fields[1]) { + if ($check) { + $carr = explode('::',$check); + $prefix = "'; + $suffix = ''; + if (strlen($prefix)>2000) { + $prefix = ''; + $suffix = ''; + } + + $s .= "\n'; + } + $sql = $rs->fields[2]; + $check = $rs->fields[0].'::'.$rs->fields[1]; + } else + $sql .= $rs->fields[2]; + if (substr($sql,strlen($sql)-1) == "\0") $sql = substr($sql,0,strlen($sql)-1); + $rs->MoveNext(); + } + $rs->Close(); + + $carr = explode('::',$check); + $prefix = "'; + $suffix = ''; + if (strlen($prefix)>2000) { + $prefix = ''; + $suffix = ''; + } + $s .= "\n'; + + return $s."
        ".$o1->name.''.$o2->name.''.$o3->name.'
        ".$carr[0].''.$carr[1].''.$prefix.$sql.$suffix.'
        ".$carr[0].''.$carr[1].''.$prefix.$sql.$suffix.'
        \n\n"; + } + + // code thanks to Ixora. + // http://www.ixora.com.au/scripts/query_opt.htm + // requires oracle 8.1.7 or later + function SuspiciousSQL($numsql=10) + { + $sql = " +select + substr(to_char(s.pct, '99.00'), 2) || '%' load, + s.executions executes, + p.sql_text +from + ( + select + address, + buffer_gets, + executions, + pct, + rank() over (order by buffer_gets desc) ranking + from + ( + select + address, + buffer_gets, + executions, + 100 * ratio_to_report(buffer_gets) over () pct + from + sys.v_\$sql + where + command_type != 47 and module != 'T.O.A.D.' + ) + where + buffer_gets > 50 * executions + ) s, + sys.v_\$sqltext p +where + s.ranking <= $numsql and + p.address = s.address +order by + 1 desc, s.address, p.piece"; + + global $ADODB_CACHE_MODE; + if (isset($_GET['expsixora']) && isset($_GET['sql'])) { + $partial = empty($_GET['part']); + echo "".$this->Explain($_GET['sql'],$partial)."\n"; + } + + if (isset($_GET['sql'])) return $this->_SuspiciousSQL($numsql); + + $s = ''; + $timer = time(); + $s .= $this->_SuspiciousSQL($numsql); + $timer = time() - $timer; + + if ($timer > $this->noShowIxora) return $s; + $s .= '

        '; + + $save = $ADODB_CACHE_MODE; + $ADODB_CACHE_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->SelectLimit($sql); + $this->conn->LogSQL($savelog); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_CACHE_MODE = $save; + if ($rs) { + $s .= "\n

        Ixora Suspicious SQL

        "; + $s .= $this->tohtml($rs,'expsixora'); + } + + return $s; + } + + // code thanks to Ixora. + // http://www.ixora.com.au/scripts/query_opt.htm + // requires oracle 8.1.7 or later + function ExpensiveSQL($numsql = 10) + { + $sql = " +select + substr(to_char(s.pct, '99.00'), 2) || '%' load, + s.executions executes, + p.sql_text +from + ( + select + address, + disk_reads, + executions, + pct, + rank() over (order by disk_reads desc) ranking + from + ( + select + address, + disk_reads, + executions, + 100 * ratio_to_report(disk_reads) over () pct + from + sys.v_\$sql + where + command_type != 47 and module != 'T.O.A.D.' + ) + where + disk_reads > 50 * executions + ) s, + sys.v_\$sqltext p +where + s.ranking <= $numsql and + p.address = s.address +order by + 1 desc, s.address, p.piece +"; + global $ADODB_CACHE_MODE; + if (isset($_GET['expeixora']) && isset($_GET['sql'])) { + $partial = empty($_GET['part']); + echo "".$this->Explain($_GET['sql'],$partial)."\n"; + } + if (isset($_GET['sql'])) { + $var = $this->_ExpensiveSQL($numsql); + return $var; + } + + $s = ''; + $timer = time(); + $s .= $this->_ExpensiveSQL($numsql); + $timer = time() - $timer; + if ($timer > $this->noShowIxora) return $s; + + $s .= '

        '; + $save = $ADODB_CACHE_MODE; + $ADODB_CACHE_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($sql); + $this->conn->LogSQL($savelog); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_CACHE_MODE = $save; + + if ($rs) { + $s .= "\n

        Ixora Expensive SQL

        "; + $s .= $this->tohtml($rs,'expeixora'); + } + + return $s; + } + + function clearsql() + { + $perf_table = adodb_perf::table(); + // using the naive "delete from $perf_table where created<".$this->conn->sysTimeStamp will cause the table to lock, possibly + // for a long time + $sql = +"DECLARE cnt pls_integer; +BEGIN + cnt := 0; + FOR rec IN (SELECT ROWID AS rr FROM $perf_table WHERE createdconn->Execute($sql); + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/perf/perf-postgres.inc.php b/fannie/adodb5/perf/perf-postgres.inc.php new file mode 100644 index 000000000..b0894ab3e --- /dev/null +++ b/fannie/adodb5/perf/perf-postgres.inc.php @@ -0,0 +1,153 @@ + array('RATIO', + "select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ", + 'Value must be TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level and stats_block_level must be set to true in postgresql.conf)'), + 'data cache hit ratio' => array('RATIO', + "select case when blks_hit=0 then 0 else round( ((1-blks_read::float/blks_hit)*100)::numeric, 2) end from pg_stat_database where datname='\$DATABASE'", + '=WarnCacheRatio'), + 'IO', + 'data reads' => array('IO', + 'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables', + ), + 'data writes' => array('IO', + 'select round((sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16)::numeric,2) from pg_stat_user_tables', + 'Count of inserts/updates/deletes * coef'), + + 'Data Cache', + 'data cache buffers' => array('DATAC', + "select setting from pg_settings where name='shared_buffers'", + 'Number of cache buffers. Tuning'), + 'cache blocksize' => array('DATAC', + 'select 8192', + '(estimate)' ), + 'data cache size' => array( 'DATAC', + "select setting::integer*8192 from pg_settings where name='shared_buffers'", + '' ), + 'operating system cache size' => array( 'DATA', + "select setting::integer*8192 from pg_settings where name='effective_cache_size'", + '(effective cache size)' ), + 'Memory Usage', + # Postgres 7.5 changelog: Rename server parameters SortMem and VacuumMem to work_mem and maintenance_work_mem; + 'sort/work buffer size' => array('CACHE', + "select setting::integer*1024 from pg_settings where name='sort_mem' or name = 'work_mem' order by name", + 'Size of sort buffer (per query)' ), + 'Connections', + 'current connections' => array('SESS', + 'select count(*) from pg_stat_activity', + ''), + 'max connections' => array('SESS', + "select setting from pg_settings where name='max_connections'", + ''), + 'Parameters', + 'rollback buffers' => array('COST', + "select setting from pg_settings where name='wal_buffers'", + 'WAL buffers'), + 'random page cost' => array('COST', + "select setting from pg_settings where name='random_page_cost'", + 'Cost of doing a seek (default=4). See random_page_cost'), + false + ); + + function perf_postgres(&$conn) + { + $this->conn = $conn; + } + + var $optimizeTableLow = 'VACUUM %s'; + var $optimizeTableHigh = 'VACUUM ANALYZE %s'; + +/** + * @see adodb_perf#optimizeTable + */ + + function optimizeTable($table, $mode = ADODB_OPT_LOW) + { + if(! is_string($table)) return false; + + $conn = $this->conn; + if (! $conn) return false; + + $sql = ''; + switch($mode) { + case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; + case ADODB_OPT_HIGH: $sql = $this->optimizeTableHigh; break; + default : + { + ADOConnection::outp(sprintf("

        %s: '%s' using of undefined mode '%s'

        ", __CLASS__, 'optimizeTable', $mode)); + return false; + } + } + $sql = sprintf($sql, $table); + + return $conn->Execute($sql) !== false; + } + + function Explain($sql,$partial=false) + { + $save = $this->conn->LogSQL(false); + + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + $sql = str_replace('?',"''",$sql); + $s = '

        Explain: '.htmlspecialchars($sql).'

        '; + $rs = $this->conn->Execute('EXPLAIN '.$sql); + $this->conn->LogSQL($save); + $s .= '
        ';
        +		if ($rs)
        +			while (!$rs->EOF) {
        +				$s .= reset($rs->fields)."\n";
        +				$rs->MoveNext();
        +			}
        +		$s .= '
        '; + $s .= $this->Tracer($sql,$partial); + return $s; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/pivottable.inc.php b/fannie/adodb5/pivottable.inc.php new file mode 100644 index 000000000..89789030d --- /dev/null +++ b/fannie/adodb5/pivottable.inc.php @@ -0,0 +1,187 @@ +databaseType,'access') !== false; + // note - vfp 6 still doesn' work even with IIF enabled || $db->databaseType == 'vfp'; + + //$hidecnt = false; + + if ($where) $where = "\nWHERE $where"; + if (!is_array($colfield)) $colarr = $db->GetCol("select distinct $colfield from $tables $where order by 1"); + if (!$aggfield) $hidecnt = false; + + $sel = "$rowfields, "; + if (is_array($colfield)) { + foreach ($colfield as $k => $v) { + $k = trim($k); + if (!$hidecnt) { + $sel .= $iif ? + "\n\t$aggfn(IIF($v,1,0)) AS \"$k\", " + : + "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", "; + } + if ($aggfield) { + $sel .= $iif ? + "\n\t$aggfn(IIF($v,$aggfield,0)) AS \"$sumlabel$k\", " + : + "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", "; + } + } + } else { + foreach ($colarr as $v) { + if (!is_numeric($v)) $vq = $db->qstr($v); + else $vq = $v; + $v = trim($v); + if (strlen($v) == 0 ) $v = 'null'; + if (!$hidecnt) { + $sel .= $iif ? + "\n\t$aggfn(IIF($colfield=$vq,1,0)) AS \"$v\", " + : + "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", "; + } + if ($aggfield) { + if ($hidecnt) $label = $v; + else $label = "{$v}_$aggfield"; + $sel .= $iif ? + "\n\t$aggfn(IIF($colfield=$vq,$aggfield,0)) AS \"$label\", " + : + "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", "; + } + } + } + if ($aggfield && $aggfield != '1'){ + $agg = "$aggfn($aggfield)"; + $sel .= "\n\t$agg as \"$sumlabel$aggfield\", "; + } + + if ($showcount) + $sel .= "\n\tSUM(1) as Total"; + else + $sel = substr($sel,0,strlen($sel)-2); + + + // Strip aliases + $rowfields = preg_replace('/ AS (\w+)/i', '', $rowfields); + + $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields"; + + return $sql; + } + +/* EXAMPLES USING MS NORTHWIND DATABASE */ +if (0) { + +# example1 +# +# Query the main "product" table +# Set the rows to CompanyName and QuantityPerUnit +# and the columns to the Categories +# and define the joins to link to lookup tables +# "categories" and "suppliers" +# + + $sql = PivotTableSQL( + $gDB, # adodb connection + 'products p ,categories c ,suppliers s', # tables + 'CompanyName,QuantityPerUnit', # row fields + 'CategoryName', # column fields + 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where +); + print "
        $sql";
        + $rs = $gDB->Execute($sql);
        + rs2html($rs);
        + 
        +/*
        +Generated SQL:
        +
        +SELECT CompanyName,QuantityPerUnit, 
        +	SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages", 
        +	SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments", 
        +	SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections", 
        +	SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products", 
        +	SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals", 
        +	SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry", 
        +	SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce", 
        +	SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood", 
        +	SUM(1) as Total 
        +FROM products p ,categories c ,suppliers s  WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID 
        +GROUP BY CompanyName,QuantityPerUnit
        +*/
        +//=====================================================================
        +
        +# example2
        +#
        +# Query the main "product" table
        +# Set the rows to CompanyName and QuantityPerUnit
        +# and the columns to the UnitsInStock for diiferent ranges
        +# and define the joins to link to lookup tables 
        +# "categories" and "suppliers"
        +#
        + $sql = PivotTableSQL(
        + 	$gDB,										# adodb connection
        + 	'products p ,categories c ,suppliers s',	# tables
        +	'CompanyName,QuantityPerUnit',				# row fields
        +												# column ranges
        +array(										
        +' 0 ' => 'UnitsInStock <= 0',
        +"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
        +"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
        +"11 to 15"  => '10 < UnitsInStock and UnitsInStock <= 15',
        +"16+" =>'15 < UnitsInStock'
        +),
        +	' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
        +	'UnitsInStock', 							# sum this field
        +	'Sum'										# sum label prefix
        +);
        + print "
        $sql";
        + $rs = $gDB->Execute($sql);
        + rs2html($rs);
        + /*
        + Generated SQL:
        + 
        +SELECT CompanyName,QuantityPerUnit, 
        +	SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum  0 ", 
        +	SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5", 
        +	SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10", 
        +	SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15", 
        +	SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
        +	SUM(UnitsInStock) AS "Sum UnitsInStock", 
        +	SUM(1) as Total 
        +FROM products p ,categories c ,suppliers s  WHERE  p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID 
        +GROUP BY CompanyName,QuantityPerUnit
        + */
        +}
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/readme.txt b/fannie/adodb5/readme.txt
        new file mode 100644
        index 000000000..97bdd9eab
        --- /dev/null
        +++ b/fannie/adodb5/readme.txt
        @@ -0,0 +1,62 @@
        +>> ADODB Library for PHP4
        +
        +(c) 2000-2004 John Lim (jlim@natsoft.com.my)
        +
        +Released under both BSD and GNU Lesser GPL library license. 
        +This means you can use it in proprietary products.
        + 
        + 
        +>> Introduction
        +
        +PHP's database access functions are not standardised. This creates a 
        +need for a database class library to hide the differences between the 
        +different databases (encapsulate the differences) so we can easily 
        +switch databases.
        +
        +We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle, 
        +Microsoft SQL server,  Foxpro ODBC, Access ODBC, Informix, DB2,
        +Sybase SQL Anywhere, generic ODBC and Microsoft's ADO. 
        +
        +We hope more people will contribute drivers to support other databases.
        +
        +
        +>> Documentation and Examples
        +
        +Refer to the adodb/docs directory for full documentation and examples. 
        +There is also a  tutorial tute.htm that contrasts ADODB code with 
        +mysql code.
        +
        +
        +>>> Files
        +Adodb.inc.php is the main file. You need to include only this file.
        +
        +Adodb-*.inc.php are the database specific driver code.
        +
        +Test.php contains a list of test commands to exercise the class library.
        +
        +Adodb-session.php is the PHP4 session handling code.
        +
        +Testdatabases.inc.php contains the list of databases to apply the tests on.
        +
        +Benchmark.php is a simple benchmark to test the throughput of a simple SELECT 
        +statement for databases described in testdatabases.inc.php. The benchmark
        +tables are created in test.php.
        +
        +readme.htm is the main documentation.
        +
        +tute.htm is the tutorial.
        +
        +
        +>> More Info
        +
        +For more information, including installation see readme.htm
        +or visit
        +           http://adodb.sourceforge.net/
        +
        +
        +>> Feature Requests and Bug Reports
        +
        +Email to jlim@natsoft.com.my 
        +
        +
        + 
        \ No newline at end of file
        diff --git a/fannie/adodb5/rsfilter.inc.php b/fannie/adodb5/rsfilter.inc.php
        new file mode 100644
        index 000000000..6f3d646d7
        --- /dev/null
        +++ b/fannie/adodb5/rsfilter.inc.php
        @@ -0,0 +1,61 @@
        + $v) {
        +			$arr[$k] = ucwords($v);
        +		}
        +	}
        +	$rs = RSFilter($rs,'do_ucwords');
        + */
        +function RSFilter($rs,$fn)
        +{
        +	if ($rs->databaseType != 'array') {
        +		if (!$rs->connection) return false;
        +		
        +		$rs = $rs->connection->_rs2rs($rs);
        +	}
        +	$rows = $rs->RecordCount();
        +	for ($i=0; $i < $rows; $i++) {
        +		if (is_array ($fn)) {
        +        	$obj = $fn[0];
        +        	$method = $fn[1];
        +        	$obj->$method ($rs->_array[$i],$rs);
        +      } else {
        +			$fn($rs->_array[$i],$rs);
        +      }
        +	  
        +	}
        +	if (!$rs->EOF) {
        +		$rs->_currentRow = 0;
        +		$rs->fields = $rs->_array[0];
        +	}
        +	
        +	return $rs;
        +}
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/server.php b/fannie/adodb5/server.php
        new file mode 100644
        index 000000000..c696f3997
        --- /dev/null
        +++ b/fannie/adodb5/server.php
        @@ -0,0 +1,100 @@
        +Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
        +$sql = undomq($_REQUEST['sql']);
        +
        +if (isset($_REQUEST['fetch']))
        +	$ADODB_FETCH_MODE = $_REQUEST['fetch'];
        +	
        +if (isset($_REQUEST['nrows'])) {
        +	$nrows = $_REQUEST['nrows'];
        +	$offset = isset($_REQUEST['offset']) ? $_REQUEST['offset'] : -1;
        +	$rs = $conn->SelectLimit($sql,$nrows,$offset);
        +} else 
        +	$rs = $conn->Execute($sql);
        +if ($rs){ 
        +	//$rs->timeToLive = 1;
        +	echo _rs2serialize($rs,$conn,$sql);
        +	$rs->Close();
        +} else
        +	err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
        +
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-compress-bzip2.php b/fannie/adodb5/session/adodb-compress-bzip2.php
        new file mode 100644
        index 000000000..f7de61c80
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-compress-bzip2.php
        @@ -0,0 +1,118 @@
        +_block_size;
        +	}
        +
        +	/**
        +	 */
        +	function setBlockSize($block_size) {
        +		assert('$block_size >= 1');
        +		assert('$block_size <= 9');
        +		$this->_block_size = (int) $block_size;
        +	}
        +
        +	/**
        +	 */
        +	function getWorkLevel() {
        +		return $this->_work_level;
        +	}
        +
        +	/**
        +	 */
        +	function setWorkLevel($work_level) {
        +		assert('$work_level >= 0');
        +		assert('$work_level <= 250');
        +		$this->_work_level = (int) $work_level;
        +	}
        +
        +	/**
        +	 */
        +	function getMinLength() {
        +		return $this->_min_length;
        +	}
        +
        +	/**
        +	 */
        +	function setMinLength($min_length) {
        +		assert('$min_length >= 0');
        +		$this->_min_length = (int) $min_length;
        +	}
        +
        +	/**
        +	 */
        +	function ADODB_Compress_Bzip2($block_size = null, $work_level = null, $min_length = null) {
        +		if (!is_null($block_size)) {
        +			$this->setBlockSize($block_size);
        +		}
        +
        +		if (!is_null($work_level)) {
        +			$this->setWorkLevel($work_level);
        +		}
        +
        +		if (!is_null($min_length)) {
        +			$this->setMinLength($min_length);
        +		}
        +	}
        +
        +	/**
        +	 */
        +	function write($data, $key) {
        +		if (strlen($data) < $this->_min_length) {
        +			return $data;
        +		}
        +
        +		if (!is_null($this->_block_size)) {
        +			if (!is_null($this->_work_level)) {
        +				return bzcompress($data, $this->_block_size, $this->_work_level);
        +			} else {
        +				return bzcompress($data, $this->_block_size);
        +			}
        +		}
        +
        +		return bzcompress($data);
        +	}
        +
        +	/**
        +	 */
        +	function read($data, $key) {
        +		return $data ? bzdecompress($data) : $data;
        +	}
        +
        +}
        +
        +return 1;
        +
        +?>
        diff --git a/fannie/adodb5/session/adodb-compress-gzip.php b/fannie/adodb5/session/adodb-compress-gzip.php
        new file mode 100644
        index 000000000..0eb80990b
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-compress-gzip.php
        @@ -0,0 +1,93 @@
        +_level;
        +	}
        +
        +	/**
        +	 */
        +	function setLevel($level) {
        +		assert('$level >= 0');
        +		assert('$level <= 9');
        +		$this->_level = (int) $level;
        +	}
        +
        +	/**
        +	 */
        +	function getMinLength() {
        +		return $this->_min_length;
        +	}
        +
        +	/**
        +	 */
        +	function setMinLength($min_length) {
        +		assert('$min_length >= 0');
        +		$this->_min_length = (int) $min_length;
        +	}
        +
        +	/**
        +	 */
        +	function ADODB_Compress_Gzip($level = null, $min_length = null) {
        +		if (!is_null($level)) {
        +			$this->setLevel($level);
        +		}
        +
        +		if (!is_null($min_length)) {
        +			$this->setMinLength($min_length);
        +		}
        +	}
        +
        +	/**
        +	 */
        +	function write($data, $key) {
        +		if (strlen($data) < $this->_min_length) {
        +			return $data;
        +		}
        +
        +		if (!is_null($this->_level)) {
        +			return gzcompress($data, $this->_level);
        +		} else {
        +			return gzcompress($data);
        +		}
        +	}
        +
        +	/**
        +	 */
        +	function read($data, $key) {
        +		return $data ? gzuncompress($data) : $data;
        +	}
        +
        +}
        +
        +return 1;
        +
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-cryptsession.php b/fannie/adodb5/session/adodb-cryptsession.php
        new file mode 100644
        index 000000000..13fe77bc3
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-cryptsession.php
        @@ -0,0 +1,27 @@
        +
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-cryptsession2.php b/fannie/adodb5/session/adodb-cryptsession2.php
        new file mode 100644
        index 000000000..d53f5a1a9
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-cryptsession2.php
        @@ -0,0 +1,27 @@
        +
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-encrypt-mcrypt.php b/fannie/adodb5/session/adodb-encrypt-mcrypt.php
        new file mode 100644
        index 000000000..8ffdb6249
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-encrypt-mcrypt.php
        @@ -0,0 +1,109 @@
        +_cipher;
        +	}
        +
        +	/**
        +	 */
        +	function setCipher($cipher) {
        +		$this->_cipher = $cipher;
        +	}
        +
        +	/**
        +	 */
        +	function getMode() {
        +		return $this->_mode;
        +	}
        +
        +	/**
        +	 */
        +	function setMode($mode) {
        +		$this->_mode = $mode;
        +	}
        +
        +	/**
        +	 */
        +	function getSource() {
        +		return $this->_source;
        +	}
        +
        +	/**
        +	 */
        +	function setSource($source) {
        +		$this->_source = $source;
        +	}
        +
        +	/**
        +	 */
        +	function ADODB_Encrypt_MCrypt($cipher = null, $mode = null, $source = null) {
        +		if (!$cipher) {
        +			$cipher = MCRYPT_RIJNDAEL_256;
        +		}
        +		if (!$mode) {
        +			$mode = MCRYPT_MODE_ECB;
        +		}
        +		if (!$source) {
        +			$source = MCRYPT_RAND;
        +		}
        +
        +		$this->_cipher = $cipher;
        +		$this->_mode = $mode;
        +		$this->_source = $source;
        +	}
        +
        +	/**
        +	 */
        +	function write($data, $key) {
        +		$iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
        +		$iv = mcrypt_create_iv($iv_size, $this->_source);
        +		return mcrypt_encrypt($this->_cipher, $key, $data, $this->_mode, $iv);
        +	}
        +
        +	/**
        +	 */
        +	function read($data, $key) {
        +		$iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
        +		$iv = mcrypt_create_iv($iv_size, $this->_source);
        +		$rv = mcrypt_decrypt($this->_cipher, $key, $data, $this->_mode, $iv);
        +		return rtrim($rv, "\0");
        +	}
        +
        +}
        +
        +return 1;
        +
        +?>
        diff --git a/fannie/adodb5/session/adodb-encrypt-md5.php b/fannie/adodb5/session/adodb-encrypt-md5.php
        new file mode 100644
        index 000000000..24b8e18de
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-encrypt-md5.php
        @@ -0,0 +1,39 @@
        +encrypt($data, $key);
        +	}
        +
        +	/**
        +	 */
        +	function read($data, $key) {
        +		$md5crypt = new MD5Crypt();
        +		return $md5crypt->decrypt($data, $key);
        +	}
        +
        +}
        +
        +return 1;
        +
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-encrypt-secret.php b/fannie/adodb5/session/adodb-encrypt-secret.php
        new file mode 100644
        index 000000000..ed185a8b3
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-encrypt-secret.php
        @@ -0,0 +1,48 @@
        +
        diff --git a/fannie/adodb5/session/adodb-encrypt-sha1.php b/fannie/adodb5/session/adodb-encrypt-sha1.php
        new file mode 100644
        index 000000000..16f603e33
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-encrypt-sha1.php
        @@ -0,0 +1,32 @@
        +encrypt($data, $key);
        +
        +	}
        +
        +
        +	function read($data, $key) 
        +	{
        +		$sha1crypt = new SHA1Crypt();
        +		return $sha1crypt->decrypt($data, $key);
        +
        +	}
        +}
        +
        +
        +
        +return 1;
        +?>
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-sess.txt b/fannie/adodb5/session/adodb-sess.txt
        new file mode 100644
        index 000000000..d23dac42d
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-sess.txt
        @@ -0,0 +1,131 @@
        +John,
        +
        +I have been an extremely satisfied ADODB user for several years now.
        +
        +To give you something back for all your hard work, I've spent the last 3
        +days rewriting the adodb-session.php code.
        +
        +----------
        +What's New
        +----------
        +
        +Here's a list of the new code's benefits:
        +
        +* Combines the functionality of the three files:
        +
        +adodb-session.php
        +adodb-session-clob.php
        +adodb-cryptsession.php
        +
        +each with very similar functionality, into a single file adodb-session.php.
        +This will ease maintenance and support issues.
        +
        +* Supports multiple encryption and compression schemes.
        +  Currently, we support:
        +
        +  MD5Crypt (crypt.inc.php)
        +  MCrypt
        +  Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
        +  GZip
        +  BZip2
        +
        +These can be stacked, so if you want to compress and then encrypt your
        +session data, it's easy.
        +Also, the built-in MCrypt functions will be *much* faster, and more secure,
        +than the MD5Crypt code.
        +
        +* adodb-session.php contains a single class ADODB_Session that encapsulates
        +all functionality.
        +  This eliminates the use of global vars and defines (though they are
        +supported for backwards compatibility).
        +
        +* All user defined parameters are now static functions in the ADODB_Session
        +class.
        +
        +New parameters include:
        +
        +* encryptionKey(): Define the encryption key used to encrypt the session.
        +Originally, it was a hard coded string.
        +
        +* persist(): Define if the database will be opened in persistent mode.
        +Originally, the user had to call adodb_sess_open().
        +
        +* dataFieldName(): Define the field name used to store the session data, as
        +'DATA' appears to be a reserved word in the following cases:
        +	ANSI SQL
        +	IBM DB2
        +	MS SQL Server
        +	Postgres
        +	SAP
        +
        +* filter(): Used to support multiple, simulataneous encryption/compression
        +schemes.
        +
        +* Debug support is improved thru _rsdump() function, which is called after
        +every database call.
        +
        +------------
        +What's Fixed
        +------------
        +
        +The new code includes several bug fixes and enhancements:
        +
        +* sesskey is compared in BINARY mode for MySQL, to avoid problems with
        +session keys that differ only by case.
        +  Of course, the user should define the sesskey field as BINARY, to
        +correctly fix this problem, otherwise performance will suffer.
        +
        +* In ADODB_Session::gc(), if $expire_notify is true, the multiple DELETES in
        +the original code have been optimized to a single DELETE.
        +
        +* In ADODB_Session::destroy(), since "SELECT expireref, sesskey FROM $table
        +WHERE sesskey = $qkey" will only return a single value, we don't loop on the
        +result, we simply process the row, if any.
        +
        +* We close $rs after every use.
        +
        +---------------
        +What's the Same
        +---------------
        +
        +I know backwards compatibility is *very* important to you.  Therefore, the
        +new code is 100% backwards compatible.
        +
        +If you like my code, but don't "trust" it's backwards compatible, maybe we
        +offer it as beta code, in a new directory for a release or two?
        +
        +------------
        +What's To Do
        +------------
        +
        +I've vascillated over whether to use a single function to get/set
        +parameters:
        +
        +$user = ADODB_Session::user(); 	// get
        +ADODB_Session::user($user);		// set
        +
        +or to use separate functions (which is the PEAR/Java way):
        +
        +$user = ADODB_Session::getUser();
        +ADODB_Session::setUser($user);
        +
        +I've chosen the former as it's makes for a simpler API, and reduces the
        +amount of code, but I'd be happy to change it to the latter.
        +
        +Also, do you think the class should be a singleton class, versus a static
        +class?
        +
        +Let me know if you find this code useful, and will be including it in the
        +next release of ADODB.
        +
        +If so, I will modify the current documentation to detail the new
        +functionality.  To that end, what file(s) contain the documentation?  Please
        +send them to me if they are not publically available.
        +
        +Also, if there is *anything* in the code that you like to see changed, let
        +me know.
        +
        +Thanks,
        +
        +Ross
        +
        diff --git a/fannie/adodb5/session/adodb-session-clob.php b/fannie/adodb5/session/adodb-session-clob.php
        new file mode 100644
        index 000000000..664a39afe
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-session-clob.php
        @@ -0,0 +1,24 @@
        +
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-session-clob2.php b/fannie/adodb5/session/adodb-session-clob2.php
        new file mode 100644
        index 000000000..7e8eb6cb5
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-session-clob2.php
        @@ -0,0 +1,24 @@
        +
        \ No newline at end of file
        diff --git a/fannie/adodb5/session/adodb-session.php b/fannie/adodb5/session/adodb-session.php
        new file mode 100644
        index 000000000..49e35bf73
        --- /dev/null
        +++ b/fannie/adodb5/session/adodb-session.php
        @@ -0,0 +1,934 @@
        +Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
        +	
        +	/* it is possible that the update statement fails due to a collision */
        +	if (!$ok) {
        +		session_id($old_id);
        +		if (empty($ck)) $ck = session_get_cookie_params();
        +		setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
        +		return false;
        +	}
        +	
        +	return true;
        +}
        +
        +/*
        +    Generate database table for session data
        +    @see http://phplens.com/lens/lensforum/msgs.php?id=12280
        +    @return 0 if failure, 1 if errors, 2 if successful.
        +	@author Markus Staab http://www.public-4u.de
        +*/
        +function adodb_session_create_table($schemaFile=null,$conn = null)
        +{
        +    // set default values
        +    if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema.xml';
        +    if ($conn===null) $conn = ADODB_Session::_conn();
        +
        +	if (!$conn) return 0;
        +
        +    $schema = new adoSchema($conn);
        +    $schema->ParseSchema($schemaFile);
        +    return $schema->ExecuteSchema();
        +}
        +
        +/*!
        +	\static
        +*/
        +class ADODB_Session {
        +	/////////////////////
        +	// getter/setter methods
        +	/////////////////////
        +	
        +	/*
        +	
        +	function Lock($lock=null)
        +	{
        +	static $_lock = false;
        +	
        +		if (!is_null($lock)) $_lock = $lock;
        +		return $lock;
        +	}
        +	*/
        +	/*!
        +	*/
        +	function driver($driver = null) {
        +		static $_driver = 'mysql';
        +		static $set = false;
        +
        +		if (!is_null($driver)) {
        +			$_driver = trim($driver);
        +			$set = true;
        +		} elseif (!$set) {
        +			// backwards compatibility
        +			if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
        +				return $GLOBALS['ADODB_SESSION_DRIVER'];
        +			}
        +		}
        +
        +		return $_driver;
        +	}
        +
        +	/*!
        +	*/
        +	function host($host = null) {
        +		static $_host = 'localhost';
        +		static $set = false;
        +
        +		if (!is_null($host)) {
        +			$_host = trim($host);
        +			$set = true;
        +		} elseif (!$set) {
        +			// backwards compatibility
        +			if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
        +				return $GLOBALS['ADODB_SESSION_CONNECT'];
        +			}
        +		}
        +
        +		return $_host;
        +	}
        +
        +	/*!
        +	*/
        +	function user($user = null) {
        +		static $_user = 'root';
        +		static $set = false;
        +
        +		if (!is_null($user)) {
        +			$_user = trim($user);
        +			$set = true;
        +		} elseif (!$set) {
        +			// backwards compatibility
        +			if (isset($GLOBALS['ADODB_SESSION_USER'])) {
        +				return $GLOBALS['ADODB_SESSION_USER'];
        +			}
        +		}
        +
        +		return $_user;
        +	}
        +
        +	/*!
        +	*/
        +	function password($password = null) {
        +		static $_password = '';
        +		static $set = false;
        +
        +		if (!is_null($password)) {
        +			$_password = $password;
        +			$set = true;
        +		} elseif (!$set) {
        +			// backwards compatibility
        +			if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
        +				return $GLOBALS['ADODB_SESSION_PWD'];
        +			}
        +		}
        +
        +		return $_password;
        +	}
        +
        +	/*!
        +	*/
        +	function database($database = null) {
        +		static $_database = 'xphplens_2';
        +		static $set = false;
        +
        +		if (!is_null($database)) {
        +			$_database = trim($database);
        +			$set = true;
        +		} elseif (!$set) {
        +			// backwards compatibility
        +			if (isset($GLOBALS['ADODB_SESSION_DB'])) {
        +				return $GLOBALS['ADODB_SESSION_DB'];
        +			}
        +		}
        +
        +		return $_database;
        +	}
        +
        +	/*!
        +	*/
        +	function persist($persist = null) 
        +	{
        +		static $_persist = true;
        +
        +		if (!is_null($persist)) {
        +			$_persist = trim($persist);
        +		}
        +
        +		return $_persist;
        +	}
        +
        +	/*!
        +	*/
        +	function lifetime($lifetime = null) {
        +		static $_lifetime;
        +		static $set = false;
        +
        +		if (!is_null($lifetime)) {
        +			$_lifetime = (int) $lifetime;
        +			$set = true;
        +		} elseif (!$set) {
        +			// backwards compatibility
        +			if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
        +				return $GLOBALS['ADODB_SESS_LIFE'];
        +			}
        +		}
        +		if (!$_lifetime) {
        +			$_lifetime = ini_get('session.gc_maxlifetime');
        +			if ($_lifetime <= 1) {
        +				// bug in PHP 4.0.3 pl 1  -- how about other versions?
        +				//print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $lifetime

        "; + $_lifetime = 1440; + } + } + + return $_lifetime; + } + + /*! + */ + function debug($debug = null) { + static $_debug = false; + static $set = false; + + if (!is_null($debug)) { + $_debug = (bool) $debug; + + $conn = ADODB_Session::_conn(); + if ($conn) { + $conn->debug = $_debug; + } + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_DEBUG'])) { + return $GLOBALS['ADODB_SESS_DEBUG']; + } + } + + return $_debug; + } + + /*! + */ + function expireNotify($expire_notify = null) { + static $_expire_notify; + static $set = false; + + if (!is_null($expire_notify)) { + $_expire_notify = $expire_notify; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) { + return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY']; + } + } + + return $_expire_notify; + } + + /*! + */ + function table($table = null) { + static $_table = 'sessions'; + static $set = false; + + if (!is_null($table)) { + $_table = trim($table); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_TBL'])) { + return $GLOBALS['ADODB_SESSION_TBL']; + } + } + + return $_table; + } + + /*! + */ + function optimize($optimize = null) { + static $_optimize = false; + static $set = false; + + if (!is_null($optimize)) { + $_optimize = (bool) $optimize; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (defined('ADODB_SESSION_OPTIMIZE')) { + return true; + } + } + + return $_optimize; + } + + /*! + */ + function syncSeconds($sync_seconds = null) { + static $_sync_seconds = 60; + static $set = false; + + if (!is_null($sync_seconds)) { + $_sync_seconds = (int) $sync_seconds; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (defined('ADODB_SESSION_SYNCH_SECS')) { + return ADODB_SESSION_SYNCH_SECS; + } + } + + return $_sync_seconds; + } + + /*! + */ + function clob($clob = null) { + static $_clob = false; + static $set = false; + + if (!is_null($clob)) { + $_clob = strtolower(trim($clob)); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) { + return $GLOBALS['ADODB_SESSION_USE_LOBS']; + } + } + + return $_clob; + } + + /*! + */ + function dataFieldName($data_field_name = null) { + static $_data_field_name = 'data'; + + if (!is_null($data_field_name)) { + $_data_field_name = trim($data_field_name); + } + + return $_data_field_name; + } + + /*! + */ + function filter($filter = null) { + static $_filter = array(); + + if (!is_null($filter)) { + if (!is_array($filter)) { + $filter = array($filter); + } + $_filter = $filter; + } + + return $_filter; + } + + /*! + */ + function encryptionKey($encryption_key = null) { + static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!'; + + if (!is_null($encryption_key)) { + $_encryption_key = $encryption_key; + } + + return $_encryption_key; + } + + ///////////////////// + // private methods + ///////////////////// + + /*! + */ + function _conn($conn=null) { + return $GLOBALS['ADODB_SESS_CONN']; + } + + /*! + */ + function _crc($crc = null) { + static $_crc = false; + + if (!is_null($crc)) { + $_crc = $crc; + } + + return $_crc; + } + + /*! + */ + function _init() { + session_module_name('user'); + session_set_save_handler( + array('ADODB_Session', 'open'), + array('ADODB_Session', 'close'), + array('ADODB_Session', 'read'), + array('ADODB_Session', 'write'), + array('ADODB_Session', 'destroy'), + array('ADODB_Session', 'gc') + ); + } + + + /*! + */ + function _sessionKey() { + // use this function to create the encryption key for crypted sessions + // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt + return crypt(ADODB_Session::encryptionKey(), session_id()); + } + + /*! + */ + function _dumprs($rs) { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + + if (!$conn) { + return; + } + + if (!$debug) { + return; + } + + if (!$rs) { + echo "
        \$rs is null or false
        \n"; + return; + } + + //echo "
        \nAffected_Rows=",$conn->Affected_Rows(),"
        \n"; + + if (!is_object($rs)) { + return; + } + + require_once ADODB_SESSION.'/../tohtml.inc.php'; + rs2html($rs); + } + + ///////////////////// + // public methods + ///////////////////// + + function config($driver, $host, $user, $password, $database=false,$options=false) + { + ADODB_Session::driver($driver); + ADODB_Session::host($host); + ADODB_Session::user($user); + ADODB_Session::password($password); + ADODB_Session::database($database); + + if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB'; + + if (isset($options['table'])) ADODB_Session::table($options['table']); + if (isset($options['lob'])) ADODB_Session::clob($options['lob']); + if (isset($options['debug'])) ADODB_Session::debug($options['debug']); + } + + /*! + Create the connection to the database. + + If $conn already exists, reuse that connection + */ + function open($save_path, $session_name, $persist = null) + { + $conn = ADODB_Session::_conn(); + + if ($conn) { + return true; + } + + $database = ADODB_Session::database(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $host = ADODB_Session::host(); + $password = ADODB_Session::password(); + $user = ADODB_Session::user(); + + if (!is_null($persist)) { + ADODB_Session::persist($persist); + } else { + $persist = ADODB_Session::persist(); + } + +# these can all be defaulted to in php.ini +# assert('$database'); +# assert('$driver'); +# assert('$host'); + + $conn = ADONewConnection($driver); + + if ($debug) { + $conn->debug = true; +// ADOConnection::outp( " driver=$driver user=$user pwd=$password db=$database "); + } + + if ($persist) { + switch($persist) { + default: + case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break; + case 'C': $ok = $conn->Connect($host, $user, $password, $database); break; + case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break; + } + } else { + $ok = $conn->Connect($host, $user, $password, $database); + } + + if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn; + else + ADOConnection::outp('

        Session: connection failed

        ', false); + + + return $ok; + } + + /*! + Close the connection + */ + function close() + { +/* + $conn = ADODB_Session::_conn(); + if ($conn) $conn->Close(); +*/ + return true; + } + + /* + Slurp in the session variables and return the serialized string + */ + function read($key) + { + $conn = ADODB_Session::_conn(); + $data = ADODB_Session::dataFieldName(); + $filter = ADODB_Session::filter(); + $table = ADODB_Session::table(); + + if (!$conn) { + return ''; + } + + //assert('$table'); + + $qkey = $conn->quote($key); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + $sql = "SELECT $data FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . time(); + /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if + developer has commited elsewhere... :( + */ + #if (ADODB_Session::Lock()) + # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), $data); + #else + + $rs = $conn->Execute($sql); + //ADODB_Session::_dumprs($rs); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else { + $v = reset($rs->fields); + $filter = array_reverse($filter); + foreach ($filter as $f) { + if (is_object($f)) { + $v = $f->read($v, ADODB_Session::_sessionKey()); + } + } + $v = rawurldecode($v); + } + + $rs->Close(); + + ADODB_Session::_crc(strlen($v) . crc32($v)); + return $v; + } + + return ''; + } + + /*! + Write the serialized data to a database. + + If the data has not been modified since the last read(), we do not write. + */ + function write($key, $val) + { + global $ADODB_SESSION_READONLY; + + if (!empty($ADODB_SESSION_READONLY)) return; + + $clob = ADODB_Session::clob(); + $conn = ADODB_Session::_conn(); + $crc = ADODB_Session::_crc(); + $data = ADODB_Session::dataFieldName(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $expire_notify = ADODB_Session::expireNotify(); + $filter = ADODB_Session::filter(); + $lifetime = ADODB_Session::lifetime(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + $qkey = $conn->qstr($key); + + //assert('$table'); + + $expiry = time() + $lifetime; + + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($crc !== false && $crc == (strlen($val) . crc32($val))) { + if ($debug) { + ADOConnection::outp( '

        Session: Only updating date - crc32 not changed

        '); + } + + $expirevar = ''; + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $expirevar = $$var; + } + } + + + $sql = "UPDATE $table SET expiry = ".$conn->Param('0').",expireref=".$conn->Param('1')." WHERE $binary sesskey = ".$conn->Param('2')." AND expiry >= ".$conn->Param('3'); + $rs = $conn->Execute($sql,array($expiry,$expirevar,$key,time())); + return true; + } + $val = rawurlencode($val); + foreach ($filter as $f) { + if (is_object($f)) { + $val = $f->write($val, ADODB_Session::_sessionKey()); + } + } + + $arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => ''); + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $arr['expireref'] = $$var; + } + } + + if (!$clob) { // no lobs, simply use replace() + $arr[$data] = $val; + $rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true); + + } else { + // what value shall we insert/update for lob row? + switch ($driver) { + // empty_clob or empty_lob for oracle dbs + case 'oracle': + case 'oci8': + case 'oci8po': + case 'oci805': + $lob_value = sprintf('empty_%s()', strtolower($clob)); + break; + + // null for all other + default: + $lob_value = 'null'; + break; + } + + $conn->StartTrans(); + $expiryref = $conn->qstr($arr['expireref']); + // do we insert or update? => as for sesskey + $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey"); + if ($rs && reset($rs->fields) > 0) { + $sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value, expireref=$expiryref WHERE sesskey = $qkey"; + } else { + $sql = "INSERT INTO $table (expiry, $data, sesskey,expireref) VALUES ($expiry, $lob_value, $qkey,$expiryref)"; + } + if ($rs)$rs->Close(); + + + $err = ''; + $rs1 = $conn->Execute($sql); + if (!$rs1) $err = $conn->ErrorMsg()."\n"; + + $rs2 = $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob)); + if (!$rs2) $err .= $conn->ErrorMsg()."\n"; + + $rs = ($rs && $rs2) ? true : false; + $conn->CompleteTrans(); + } + + if (!$rs) { + ADOConnection::outp('

        Session Replace: ' . $conn->ErrorMsg() . '

        ', false); + return false; + } else { + // bug in access driver (could be odbc?) means that info is not committed + // properly unless select statement executed in Win2000 + if ($conn->databaseType == 'access') { + $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + if ($rs) { + $rs->Close(); + } + } + }/* + if (ADODB_Session::Lock()) { + $conn->CommitTrans(); + }*/ + return $rs ? true : false; + } + + /*! + */ + function destroy($key) { + $conn = ADODB_Session::_conn(); + $table = ADODB_Session::table(); + $expire_notify = ADODB_Session::expireNotify(); + + if (!$conn) { + return false; + } + + //assert('$table'); + + $qkey = $conn->quote($key); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + $conn->SetFetchMode($savem); + if (!$rs) { + return false; + } + if (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + //assert('$ref'); + //assert('$key'); + $fn($ref, $key); + } + $rs->Close(); + } + + $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + + return $rs ? true : false; + } + + /*! + */ + function gc($maxlifetime) + { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + $expire_notify = ADODB_Session::expireNotify(); + $optimize = ADODB_Session::optimize(); + $sync_seconds = ADODB_Session::syncSeconds(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + + + $time = time(); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + $conn->SetFetchMode($savem); + if ($rs) { + $conn->StartTrans(); + $keys = array(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref, $key); + $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key)); + $rs->MoveNext(); + } + $rs->Close(); + + $conn->CompleteTrans(); + } + } else { + + if (1) { + $sql = "SELECT sesskey FROM $table WHERE expiry < $time"; + $arr = $conn->GetAll($sql); + foreach ($arr as $row) { + $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0'); + $conn->Execute($sql2,array(reset($row))); + } + } else { + $sql = "DELETE FROM $table WHERE expiry < $time"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + if ($rs) $rs->Close(); + } + if ($debug) { + ADOConnection::outp("

        Garbage Collection: $sql

        "); + } + } + + // suggested by Cameron, "GaM3R" + if ($optimize) { + $driver = ADODB_Session::driver(); + + if (preg_match('/mysql/i', $driver)) { + $sql = "OPTIMIZE TABLE $table"; + } + if (preg_match('/postgres/i', $driver)) { + $sql = "VACUUM $table"; + } + if (!empty($sql)) { + $conn->Execute($sql); + } + } + + if ($sync_seconds) { + $sql = 'SELECT '; + if ($conn->dataProvider === 'oci8') { + $sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')"; + } else { + $sql .= $conn->sysTimeStamp; + } + $sql .= " FROM $table"; + + $rs = $conn->SelectLimit($sql, 1); + if ($rs && !$rs->EOF) { + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $conn->UnixTimeStamp($dbts); + $t = time(); + + if (abs($dbt - $t) >= $sync_seconds) { + $msg = __FILE__ . + ": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " . + " database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 60) . ' minutes)'; + error_log($msg); + if ($debug) { + ADOConnection::outp("

        $msg

        "); + } + } + } + } + + return true; + } +} + +ADODB_Session::_init(); +if (empty($ADODB_SESSION_READONLY)) + register_shutdown_function('session_write_close'); + +// for backwards compatability only +function adodb_sess_open($save_path, $session_name, $persist = true) { + return ADODB_Session::open($save_path, $session_name, $persist); +} + +// for backwards compatability only +function adodb_sess_gc($t) +{ + return ADODB_Session::gc($t); +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/session/adodb-session2.php b/fannie/adodb5/session/adodb-session2.php new file mode 100644 index 000000000..7a8abe8d6 --- /dev/null +++ b/fannie/adodb5/session/adodb-session2.php @@ -0,0 +1,945 @@ +Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id)); + + /* it is possible that the update statement fails due to a collision */ + if (!$ok) { + session_id($old_id); + if (empty($ck)) $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + return false; + } + + return true; +} + +/* + Generate database table for session data + @see http://phplens.com/lens/lensforum/msgs.php?id=12280 + @return 0 if failure, 1 if errors, 2 if successful. + @author Markus Staab http://www.public-4u.de +*/ +function adodb_session_create_table($schemaFile=null,$conn = null) +{ + // set default values + if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml'; + if ($conn===null) $conn = ADODB_Session::_conn(); + + if (!$conn) return 0; + + $schema = new adoSchema($conn); + $schema->ParseSchema($schemaFile); + return $schema->ExecuteSchema(); +} + +/*! + \static +*/ +class ADODB_Session { + ///////////////////// + // getter/setter methods + ///////////////////// + + /* + + function Lock($lock=null) + { + static $_lock = false; + + if (!is_null($lock)) $_lock = $lock; + return $lock; + } + */ + /*! + */ + static function driver($driver = null) + { + static $_driver = 'mysql'; + static $set = false; + + if (!is_null($driver)) { + $_driver = trim($driver); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) { + return $GLOBALS['ADODB_SESSION_DRIVER']; + } + } + + return $_driver; + } + + /*! + */ + static function host($host = null) { + static $_host = 'localhost'; + static $set = false; + + if (!is_null($host)) { + $_host = trim($host); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) { + return $GLOBALS['ADODB_SESSION_CONNECT']; + } + } + + return $_host; + } + + /*! + */ + static function user($user = null) + { + static $_user = 'root'; + static $set = false; + + if (!is_null($user)) { + $_user = trim($user); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USER'])) { + return $GLOBALS['ADODB_SESSION_USER']; + } + } + + return $_user; + } + + /*! + */ + static function password($password = null) + { + static $_password = ''; + static $set = false; + + if (!is_null($password)) { + $_password = $password; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_PWD'])) { + return $GLOBALS['ADODB_SESSION_PWD']; + } + } + + return $_password; + } + + /*! + */ + static function database($database = null) + { + static $_database = ''; + static $set = false; + + if (!is_null($database)) { + $_database = trim($database); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_DB'])) { + return $GLOBALS['ADODB_SESSION_DB']; + } + } + return $_database; + } + + /*! + */ + static function persist($persist = null) + { + static $_persist = true; + + if (!is_null($persist)) { + $_persist = trim($persist); + } + + return $_persist; + } + + /*! + */ + static function lifetime($lifetime = null) + { + static $_lifetime; + static $set = false; + + if (!is_null($lifetime)) { + $_lifetime = (int) $lifetime; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_LIFE'])) { + return $GLOBALS['ADODB_SESS_LIFE']; + } + } + if (!$_lifetime) { + $_lifetime = ini_get('session.gc_maxlifetime'); + if ($_lifetime <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $lifetime

        "; + $_lifetime = 1440; + } + } + + return $_lifetime; + } + + /*! + */ + static function debug($debug = null) + { + static $_debug = false; + static $set = false; + + if (!is_null($debug)) { + $_debug = (bool) $debug; + + $conn = ADODB_Session::_conn(); + if ($conn) { + #$conn->debug = $_debug; + } + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_DEBUG'])) { + return $GLOBALS['ADODB_SESS_DEBUG']; + } + } + + return $_debug; + } + + /*! + */ + static function expireNotify($expire_notify = null) + { + static $_expire_notify; + static $set = false; + + if (!is_null($expire_notify)) { + $_expire_notify = $expire_notify; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) { + return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY']; + } + } + + return $_expire_notify; + } + + /*! + */ + static function table($table = null) + { + static $_table = 'sessions2'; + static $set = false; + + if (!is_null($table)) { + $_table = trim($table); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_TBL'])) { + return $GLOBALS['ADODB_SESSION_TBL']; + } + } + + return $_table; + } + + /*! + */ + static function optimize($optimize = null) + { + static $_optimize = false; + static $set = false; + + if (!is_null($optimize)) { + $_optimize = (bool) $optimize; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (defined('ADODB_SESSION_OPTIMIZE')) { + return true; + } + } + + return $_optimize; + } + + /*! + */ + static function syncSeconds($sync_seconds = null) { + //echo ("

        WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code

        "); + + return 0; + } + + /*! + */ + static function clob($clob = null) { + static $_clob = false; + static $set = false; + + if (!is_null($clob)) { + $_clob = strtolower(trim($clob)); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) { + return $GLOBALS['ADODB_SESSION_USE_LOBS']; + } + } + + return $_clob; + } + + /*! + */ + static function dataFieldName($data_field_name = null) { + //echo ("

        WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code

        "); + return ''; + } + + /*! + */ + static function filter($filter = null) { + static $_filter = array(); + + if (!is_null($filter)) { + if (!is_array($filter)) { + $filter = array($filter); + } + $_filter = $filter; + } + + return $_filter; + } + + /*! + */ + static function encryptionKey($encryption_key = null) { + static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!'; + + if (!is_null($encryption_key)) { + $_encryption_key = $encryption_key; + } + + return $_encryption_key; + } + + ///////////////////// + // private methods + ///////////////////// + + /*! + */ + static function _conn($conn=null) { + return isset($GLOBALS['ADODB_SESS_CONN']) ? $GLOBALS['ADODB_SESS_CONN'] : false; + } + + /*! + */ + static function _crc($crc = null) { + static $_crc = false; + + if (!is_null($crc)) { + $_crc = $crc; + } + + return $_crc; + } + + /*! + */ + static function _init() { + session_module_name('user'); + session_set_save_handler( + array('ADODB_Session', 'open'), + array('ADODB_Session', 'close'), + array('ADODB_Session', 'read'), + array('ADODB_Session', 'write'), + array('ADODB_Session', 'destroy'), + array('ADODB_Session', 'gc') + ); + } + + + /*! + */ + static function _sessionKey() { + // use this function to create the encryption key for crypted sessions + // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt + return crypt(ADODB_Session::encryptionKey(), session_id()); + } + + /*! + */ + static function _dumprs(&$rs) { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + + if (!$conn) { + return; + } + + if (!$debug) { + return; + } + + if (!$rs) { + echo "
        \$rs is null or false
        \n"; + return; + } + + //echo "
        \nAffected_Rows=",$conn->Affected_Rows(),"
        \n"; + + if (!is_object($rs)) { + return; + } + $rs = $conn->_rs2rs($rs); + + require_once ADODB_SESSION.'/../tohtml.inc.php'; + rs2html($rs); + $rs->MoveFirst(); + } + + ///////////////////// + // public methods + ///////////////////// + + static function config($driver, $host, $user, $password, $database=false,$options=false) + { + ADODB_Session::driver($driver); + ADODB_Session::host($host); + ADODB_Session::user($user); + ADODB_Session::password($password); + ADODB_Session::database($database); + + if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB'; + + if (isset($options['table'])) ADODB_Session::table($options['table']); + if (isset($options['lob'])) ADODB_Session::clob($options['lob']); + if (isset($options['debug'])) ADODB_Session::debug($options['debug']); + } + + /*! + Create the connection to the database. + + If $conn already exists, reuse that connection + */ + static function open($save_path, $session_name, $persist = null) + { + $conn = ADODB_Session::_conn(); + + if ($conn) { + return true; + } + + $database = ADODB_Session::database(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $host = ADODB_Session::host(); + $password = ADODB_Session::password(); + $user = ADODB_Session::user(); + + if (!is_null($persist)) { + ADODB_Session::persist($persist); + } else { + $persist = ADODB_Session::persist(); + } + +# these can all be defaulted to in php.ini +# assert('$database'); +# assert('$driver'); +# assert('$host'); + + $conn = ADONewConnection($driver); + + if ($debug) { + $conn->debug = true; + ADOConnection::outp( " driver=$driver user=$user db=$database "); + } + + if ($persist) { + switch($persist) { + default: + case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break; + case 'C': $ok = $conn->Connect($host, $user, $password, $database); break; + case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break; + } + } else { + $ok = $conn->Connect($host, $user, $password, $database); + } + + if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn; + else + ADOConnection::outp('

        Session: connection failed

        ', false); + + + return $ok; + } + + /*! + Close the connection + */ + static function close() + { +/* + $conn = ADODB_Session::_conn(); + if ($conn) $conn->Close(); +*/ + return true; + } + + /* + Slurp in the session variables and return the serialized string + */ + static function read($key) + { + $conn = ADODB_Session::_conn(); + $filter = ADODB_Session::filter(); + $table = ADODB_Session::table(); + + if (!$conn) { + return ''; + } + + //assert('$table'); + + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary ".$conn->Param(0)." AND expiry >= " . $conn->sysTimeStamp; + /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if + developer has commited elsewhere... :( + */ + #if (ADODB_Session::Lock()) + # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata); + #else + $rs = $conn->Execute($sql, array($key)); + //ADODB_Session::_dumprs($rs); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else { + $v = reset($rs->fields); + $filter = array_reverse($filter); + foreach ($filter as $f) { + if (is_object($f)) { + $v = $f->read($v, ADODB_Session::_sessionKey()); + } + } + $v = rawurldecode($v); + } + + $rs->Close(); + + ADODB_Session::_crc(strlen($v) . crc32($v)); + return $v; + } + + return ''; + } + + /*! + Write the serialized data to a database. + + If the data has not been modified since the last read(), we do not write. + */ + static function write($key, $oval) + { + global $ADODB_SESSION_READONLY; + + if (!empty($ADODB_SESSION_READONLY)) return; + + $clob = ADODB_Session::clob(); + $conn = ADODB_Session::_conn(); + $crc = ADODB_Session::_crc(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $expire_notify = ADODB_Session::expireNotify(); + $filter = ADODB_Session::filter(); + $lifetime = ADODB_Session::lifetime(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + if ($debug) $conn->debug = 1; + $sysTimeStamp = $conn->sysTimeStamp; + + //assert('$table'); + + $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp); + + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($crc !== false && $crc == (strlen($oval) . crc32($oval))) { + if ($debug) { + echo '

        Session: Only updating date - crc32 not changed

        '; + } + + $expirevar = ''; + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $expirevar = $$var; + } + } + + + $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp"; + $rs = $conn->Execute($sql,array($expirevar,$key)); + return true; + } + $val = rawurlencode($oval); + foreach ($filter as $f) { + if (is_object($f)) { + $val = $f->write($val, ADODB_Session::_sessionKey()); + } + } + + $expireref = ''; + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $expireref = $$var; + } + } + + if (!$clob) { // no lobs, simply use replace() + $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key)); + if ($rs) $rs->Close(); + + if ($rs && reset($rs->fields) > 0) { + $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2'); + + } else { + $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) + VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)"; + } + + + $rs = $conn->Execute($sql,array($val,$expireref,$key)); + + } else { + // what value shall we insert/update for lob row? + switch ($driver) { + // empty_clob or empty_lob for oracle dbs + case 'oracle': + case 'oci8': + case 'oci8po': + case 'oci805': + $lob_value = sprintf('empty_%s()', strtolower($clob)); + break; + + // null for all other + default: + $lob_value = 'null'; + break; + } + + $conn->StartTrans(); + + $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key)); + if ($rs) $rs->Close(); + + if ($rs && reset($rs->fields) > 0) { + $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1'); + + } else { + $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) + VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)"; + } + + $rs = $conn->Execute($sql,array($expireref,$key)); + + $qkey = $conn->qstr($key); + $rs2 = $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob)); + if ($debug) echo "
        ",htmlspecialchars($oval), "
        "; + $rs = @$conn->CompleteTrans(); + + + } + + if (!$rs) { + ADOConnection::outp('

        Session Replace: ' . $conn->ErrorMsg() . '

        ', false); + return false; + } else { + // bug in access driver (could be odbc?) means that info is not committed + // properly unless select statement executed in Win2000 + if ($conn->databaseType == 'access') { + $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + if ($rs) { + $rs->Close(); + } + } + }/* + if (ADODB_Session::Lock()) { + $conn->CommitTrans(); + }*/ + return $rs ? true : false; + } + + /*! + */ + static function destroy($key) { + $conn = ADODB_Session::_conn(); + $table = ADODB_Session::table(); + $expire_notify = ADODB_Session::expireNotify(); + + if (!$conn) { + return false; + } + $debug = ADODB_Session::debug(); + if ($debug) $conn->debug = 1; + //assert('$table'); + + $qkey = $conn->quote($key); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + $conn->SetFetchMode($savem); + if (!$rs) { + return false; + } + if (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + //assert('$ref'); + //assert('$key'); + $fn($ref, $key); + } + $rs->Close(); + } + + $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + if ($rs) { + $rs->Close(); + } + + return $rs ? true : false; + } + + /*! + */ + static function gc($maxlifetime) + { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + $expire_notify = ADODB_Session::expireNotify(); + $optimize = ADODB_Session::optimize(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + + + $debug = ADODB_Session::debug(); + if ($debug) { + $conn->debug = 1; + $COMMITNUM = 2; + } else { + $COMMITNUM = 20; + } + + //assert('$table'); + + $time = $conn->OffsetDate(-$maxlifetime/24/3600,$conn->sysTimeStamp); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + } else { + $fn = false; + } + + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time ORDER BY 2"; # add order by to prevent deadlock + $rs = $conn->SelectLimit($sql,1000); + ADODB_Session::_dumprs($rs); + if ($debug) $conn->SetFetchMode($savem); + if ($rs) { + $tr = $conn->hasTransactions; + if ($tr) $conn->BeginTrans(); + $keys = array(); + $ccnt = 0; + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + if ($fn) $fn($ref, $key); + $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key)); + $rs->MoveNext(); + $ccnt += 1; + if ($tr && $ccnt % $COMMITNUM == 0) { + if ($debug) echo "Commit
        \n"; + $conn->CommitTrans(); + $conn->BeginTrans(); + } + } + $rs->Close(); + + if ($tr) $conn->CommitTrans(); + } + + + // suggested by Cameron, "GaM3R" + if ($optimize) { + $driver = ADODB_Session::driver(); + + if (preg_match('/mysql/i', $driver)) { + $sql = "OPTIMIZE TABLE $table"; + } + if (preg_match('/postgres/i', $driver)) { + $sql = "VACUUM $table"; + } + if (!empty($sql)) { + $conn->Execute($sql); + } + } + + + return true; + } +} + +ADODB_Session::_init(); +if (empty($ADODB_SESSION_READONLY)) + register_shutdown_function('session_write_close'); + +// for backwards compatability only +function adodb_sess_open($save_path, $session_name, $persist = true) { + return ADODB_Session::open($save_path, $session_name, $persist); +} + +// for backwards compatability only +function adodb_sess_gc($t) +{ + return ADODB_Session::gc($t); +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/session/adodb-sessions.mysql.sql b/fannie/adodb5/session/adodb-sessions.mysql.sql new file mode 100644 index 000000000..f90de4493 --- /dev/null +++ b/fannie/adodb5/session/adodb-sessions.mysql.sql @@ -0,0 +1,16 @@ +-- $CVSHeader$ + +CREATE DATABASE /*! IF NOT EXISTS */ adodb_sessions; + +USE adodb_sessions; + +DROP TABLE /*! IF EXISTS */ sessions; + +CREATE TABLE /*! IF NOT EXISTS */ sessions ( + sesskey CHAR(32) /*! BINARY */ NOT NULL DEFAULT '', + expiry INT(11) /*! UNSIGNED */ NOT NULL DEFAULT 0, + expireref VARCHAR(64) DEFAULT '', + data LONGTEXT DEFAULT '', + PRIMARY KEY (sesskey), + INDEX expiry (expiry) +); diff --git a/fannie/adodb5/session/adodb-sessions.oracle.clob.sql b/fannie/adodb5/session/adodb-sessions.oracle.clob.sql new file mode 100644 index 000000000..c5c4f2d07 --- /dev/null +++ b/fannie/adodb5/session/adodb-sessions.oracle.clob.sql @@ -0,0 +1,15 @@ +-- $CVSHeader$ + +DROP TABLE adodb_sessions; + +CREATE TABLE sessions ( + sesskey CHAR(32) DEFAULT '' NOT NULL, + expiry INT DEFAULT 0 NOT NULL, + expireref VARCHAR(64) DEFAULT '', + data CLOB DEFAULT '', + PRIMARY KEY (sesskey) +); + +CREATE INDEX ix_expiry ON sessions (expiry); + +QUIT; diff --git a/fannie/adodb5/session/adodb-sessions.oracle.sql b/fannie/adodb5/session/adodb-sessions.oracle.sql new file mode 100644 index 000000000..8fd5a3423 --- /dev/null +++ b/fannie/adodb5/session/adodb-sessions.oracle.sql @@ -0,0 +1,16 @@ +-- $CVSHeader$ + +DROP TABLE adodb_sessions; + +CREATE TABLE sessions ( + sesskey CHAR(32) DEFAULT '' NOT NULL, + expiry INT DEFAULT 0 NOT NULL, + expireref VARCHAR(64) DEFAULT '', + data VARCHAR(4000) DEFAULT '', + PRIMARY KEY (sesskey), + INDEX expiry (expiry) +); + +CREATE INDEX ix_expiry ON sessions (expiry); + +QUIT; diff --git a/fannie/adodb5/session/crypt.inc.php b/fannie/adodb5/session/crypt.inc.php new file mode 100644 index 000000000..41cb06a5a --- /dev/null +++ b/fannie/adodb5/session/crypt.inc.php @@ -0,0 +1,161 @@ + +class MD5Crypt{ + function keyED($txt,$encrypt_key) + { + $encrypt_key = md5($encrypt_key); + $ctr=0; + $tmp = ""; + for ($i=0;$ikeyED($tmp,$key)); + } + + function Decrypt($txt,$key) + { + $txt = $this->keyED(base64_decode($txt),$key); + $tmp = ""; + for ($i=0;$i= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) + { + $randnumber = rand(48,120); + } + + $randomPassword .= chr($randnumber); + } + return $randomPassword; + } + +} + + +class SHA1Crypt{ + + function keyED($txt,$encrypt_key) + { + + $encrypt_key = sha1($encrypt_key); + $ctr=0; + $tmp = ""; + + for ($i=0;$ikeyED($tmp,$key)); + + } + + + + function Decrypt($txt,$key) + { + + $txt = $this->keyED(base64_decode($txt),$key); + + $tmp = ""; + + for ($i=0;$i= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) + { + $randnumber = rand(48,120); + } + + $randomPassword .= chr($randnumber); + } + + return $randomPassword; + + } + + + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/session/old/adodb-cryptsession.php b/fannie/adodb5/session/old/adodb-cryptsession.php new file mode 100644 index 000000000..ee5b627c2 --- /dev/null +++ b/fannie/adodb5/session/old/adodb-cryptsession.php @@ -0,0 +1,324 @@ + + + Set tabs to 4 for best viewing. + + Latest version of ADODB is available at http://php.weblogs.com/adodb + ====================================================================== + + This file provides PHP4 session management using the ADODB database +wrapper library. + + Example + ======= + + include('adodb.inc.php'); + #---------------------------------# + include('adodb-cryptsession.php'); + #---------------------------------# + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}

        "; + + + Installation + ============ + 1. Create a new database in MySQL or Access "sessions" like +so: + + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA CLOB, + primary key (sesskey) + ); + + 2. Then define the following parameters. You can either modify + this file, or define them before this file is included: + + $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; + $ADODB_SESSION_CONNECT='server to connect to'; + $ADODB_SESSION_USER ='user'; + $ADODB_SESSION_PWD ='password'; + $ADODB_SESSION_DB ='database'; + $ADODB_SESSION_TBL = 'sessions' + + 3. Recommended is PHP 4.0.2 or later. There are documented +session bugs in earlier versions of PHP. + +*/ + + +include_once('crypt.inc.php'); + +if (!defined('_ADODB_LAYER')) { + include (dirname(__FILE__).'/adodb.inc.php'); +} + + /* if database time and system time is difference is greater than this, then give warning */ + define('ADODB_SESSION_SYNCH_SECS',60); + +if (!defined('ADODB_SESSION')) { + + define('ADODB_SESSION',1); + +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESS_DEBUG, + $ADODB_SESS_INSERT, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_TBL; + + //$ADODB_SESS_DEBUG = true; + + /* SET THE FOLLOWING PARAMETERS */ +if (empty($ADODB_SESSION_DRIVER)) { + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD =''; + $ADODB_SESSION_DB ='xphplens_2'; +} + +if (empty($ADODB_SESSION_TBL)){ + $ADODB_SESSION_TBL = 'sessions'; +} + +if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) { + $ADODB_SESSION_EXPIRE_NOTIFY = false; +} + +function ADODB_Session_Key() +{ +$ADODB_CRYPT_KEY = 'CRYPTED ADODB SESSIONS ROCK!'; + + /* USE THIS FUNCTION TO CREATE THE ENCRYPTION KEY FOR CRYPTED SESSIONS */ + /* Crypt the used key, $ADODB_CRYPT_KEY as key and session_ID as SALT */ + return crypt($ADODB_CRYPT_KEY, session_ID()); +} + +$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); +if ($ADODB_SESS_LIFE <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $ADODB_SESS_LIFE

        "; + $ADODB_SESS_LIFE=1440; +} + +function adodb_sess_open($save_path, $session_name) +{ +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_DEBUG; + + $ADODB_SESS_INSERT = false; + + if (isset($ADODB_SESS_CONN)) return true; + + $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); + if (!empty($ADODB_SESS_DEBUG)) { + $ADODB_SESS_CONN->debug = true; + print" conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "; + } + return $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + +} + +function adodb_sess_close() +{ +global $ADODB_SESS_CONN; + + if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); + return true; +} + +function adodb_sess_read($key) +{ +$Crypt = new MD5Crypt; +global $ADODB_SESS_CONN,$ADODB_SESS_INSERT,$ADODB_SESSION_TBL; + $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); + if ($rs) { + if ($rs->EOF) { + $ADODB_SESS_INSERT = true; + $v = ''; + } else { + // Decrypt session data + $v = rawurldecode($Crypt->Decrypt(reset($rs->fields), ADODB_Session_Key())); + } + $rs->Close(); + return $v; + } + else $ADODB_SESS_INSERT = true; + + return ''; +} + +function adodb_sess_write($key, $val) +{ +$Crypt = new MD5Crypt; + global $ADODB_SESS_INSERT,$ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + $expiry = time() + $ADODB_SESS_LIFE; + + // encrypt session data.. + $val = $Crypt->Encrypt(rawurlencode($val), ADODB_Session_Key()); + + $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val); + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + $var = reset($ADODB_SESSION_EXPIRE_NOTIFY); + global $$var; + $arr['expireref'] = $$var; + } + $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL, + $arr, + 'sesskey',$autoQuote = true); + + if (!$rs) { + ADOConnection::outp( ' +-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'

        ',false); + } else { + // bug in access driver (could be odbc?) means that info is not commited + // properly unless select statement executed in Win2000 + + if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); + } + return isset($rs); +} + +function adodb_sess_destroy($key) +{ + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; + $rs = $ADODB_SESS_CONN->Execute($qry); + } + return $rs ? true : false; +} + + +function adodb_sess_gc($maxlifetime) { + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY,$ADODB_SESS_DEBUG; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $t = time(); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + //$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $rs->Close(); + + $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time(); + $ADODB_SESS_CONN->Execute($qry); + } + + // suggested by Cameron, "GaM3R" + if (defined('ADODB_SESSION_OPTIMIZE')) + { + global $ADODB_SESSION_DRIVER; + + switch( $ADODB_SESSION_DRIVER ) { + case 'mysql': + case 'mysqlt': + $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; + break; + case 'postgresql': + case 'postgresql7': + $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; + break; + } + } + + if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL; + else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL; + + $rs = $ADODB_SESS_CONN->SelectLimit($sql,1); + if ($rs && !$rs->EOF) { + + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts); + $t = time(); + if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { + $msg = + __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)"; + error_log($msg); + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- $msg

        "); + } + } + + return true; +} + +session_module_name('user'); +session_set_save_handler( + "adodb_sess_open", + "adodb_sess_close", + "adodb_sess_read", + "adodb_sess_write", + "adodb_sess_destroy", + "adodb_sess_gc"); +} + +/* TEST SCRIPT -- UNCOMMENT */ +/* +if (0) { + + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}

        "; +} +*/ +?> diff --git a/fannie/adodb5/session/old/adodb-session-clob.php b/fannie/adodb5/session/old/adodb-session-clob.php new file mode 100644 index 000000000..6b8572deb --- /dev/null +++ b/fannie/adodb5/session/old/adodb-session-clob.php @@ -0,0 +1,448 @@ +"; + +To force non-persistent connections, call adodb_session_open first before session_start(): + + include('adodb.inc.php'); + include('adodb-session.php'); + adodb_session_open(false,false,false); + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}

        "; + + + Installation + ============ + 1. Create this table in your database (syntax might vary depending on your db): + + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA CLOB, + primary key (sesskey) + ); + + + 2. Then define the following parameters in this file: + $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; + $ADODB_SESSION_CONNECT='server to connect to'; + $ADODB_SESSION_USER ='user'; + $ADODB_SESSION_PWD ='password'; + $ADODB_SESSION_DB ='database'; + $ADODB_SESSION_TBL = 'sessions' + $ADODB_SESSION_USE_LOBS = false; (or, if you wanna use CLOBS (= 'CLOB') or ( = 'BLOB') + + 3. Recommended is PHP 4.1.0 or later. There are documented + session bugs in earlier versions of PHP. + + 4. If you want to receive notifications when a session expires, then + you can tag a session with an EXPIREREF, and before the session + record is deleted, we can call a function that will pass the EXPIREREF + as the first parameter, and the session key as the second parameter. + + To do this, define a notification function, say NotifyFn: + + function NotifyFn($expireref, $sesskey) + { + } + + Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY. + This is an array with 2 elements, the first being the name of the variable + you would like to store in the EXPIREREF field, and the 2nd is the + notification function's name. + + In this example, we want to be notified when a user's session + has expired, so we store the user id in the global variable $USERID, + store this value in the EXPIREREF field: + + $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn'); + + Then when the NotifyFn is called, we are passed the $USERID as the first + parameter, eg. NotifyFn($userid, $sesskey). +*/ + +if (!defined('_ADODB_LAYER')) { + include (dirname(__FILE__).'/adodb.inc.php'); +} + +if (!defined('ADODB_SESSION')) { + + define('ADODB_SESSION',1); + + /* if database time and system time is difference is greater than this, then give warning */ + define('ADODB_SESSION_SYNCH_SECS',60); + +/****************************************************************************************\ + Global definitions +\****************************************************************************************/ +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_CRC, + $ADODB_SESSION_USE_LOBS, + $ADODB_SESSION_TBL; + + if (!isset($ADODB_SESSION_USE_LOBS)) $ADODB_SESSION_USE_LOBS = 'CLOB'; + + $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); + if ($ADODB_SESS_LIFE <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $ADODB_SESS_LIFE

        "; + $ADODB_SESS_LIFE=1440; + } + $ADODB_SESSION_CRC = false; + //$ADODB_SESS_DEBUG = true; + + ////////////////////////////////// + /* SET THE FOLLOWING PARAMETERS */ + ////////////////////////////////// + + if (empty($ADODB_SESSION_DRIVER)) { + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD =''; + $ADODB_SESSION_DB ='xphplens_2'; + } + + if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) { + $ADODB_SESSION_EXPIRE_NOTIFY = false; + } + // Made table name configurable - by David Johnson djohnson@inpro.net + if (empty($ADODB_SESSION_TBL)){ + $ADODB_SESSION_TBL = 'sessions'; + } + + + // defaulting $ADODB_SESSION_USE_LOBS + if (!isset($ADODB_SESSION_USE_LOBS) || empty($ADODB_SESSION_USE_LOBS)) { + $ADODB_SESSION_USE_LOBS = false; + } + + /* + $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER; + $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT; + $ADODB_SESS['user'] = $ADODB_SESSION_USER; + $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD; + $ADODB_SESS['db'] = $ADODB_SESSION_DB; + $ADODB_SESS['life'] = $ADODB_SESS_LIFE; + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + $ADODB_SESS['table'] = $ADODB_SESS_TBL; + */ + +/****************************************************************************************\ + Create the connection to the database. + + If $ADODB_SESS_CONN already exists, reuse that connection +\****************************************************************************************/ +function adodb_sess_open($save_path, $session_name,$persist=true) +{ +GLOBAL $ADODB_SESS_CONN; + if (isset($ADODB_SESS_CONN)) return true; + +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_DEBUG; + + // cannot use & below - do not know why... + $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); + if (!empty($ADODB_SESS_DEBUG)) { + $ADODB_SESS_CONN->debug = true; + ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "); + } + if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + + if (!$ok) ADOConnection::outp( " +-- Session: connection failed

        ",false); +} + +/****************************************************************************************\ + Close the connection +\****************************************************************************************/ +function adodb_sess_close() +{ +global $ADODB_SESS_CONN; + + if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); + return true; +} + +/****************************************************************************************\ + Slurp in the session variables and return the serialized string +\****************************************************************************************/ +function adodb_sess_read($key) +{ +global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC; + + $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else + $v = rawurldecode(reset($rs->fields)); + + $rs->Close(); + + // new optimization adodb 2.1 + $ADODB_SESSION_CRC = strlen($v).crc32($v); + + return $v; + } + + return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com +} + +/****************************************************************************************\ + Write the serialized data to a database. + + If the data has not been modified since adodb_sess_read(), we do not write. +\****************************************************************************************/ +function adodb_sess_write($key, $val) +{ + global + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESSION_TBL, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_CRC, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_DRIVER, // added + $ADODB_SESSION_USE_LOBS; // added + + $expiry = time() + $ADODB_SESS_LIFE; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) { + if ($ADODB_SESS_DEBUG) echo " +-- Session: Only updating date - crc32 not changed

        "; + $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time(); + $rs = $ADODB_SESS_CONN->Execute($qry); + return true; + } + $val = rawurlencode($val); + + $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val); + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + $var = reset($ADODB_SESSION_EXPIRE_NOTIFY); + global $$var; + $arr['expireref'] = $$var; + } + + + if ($ADODB_SESSION_USE_LOBS === false) { // no lobs, simply use replace() + $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr, 'sesskey',$autoQuote = true); + if (!$rs) { + $err = $ADODB_SESS_CONN->ErrorMsg(); + } + } else { + // what value shall we insert/update for lob row? + switch ($ADODB_SESSION_DRIVER) { + // empty_clob or empty_lob for oracle dbs + case "oracle": + case "oci8": + case "oci8po": + case "oci805": + $lob_value = sprintf("empty_%s()", strtolower($ADODB_SESSION_USE_LOBS)); + break; + + // null for all other + default: + $lob_value = "null"; + break; + } + + // do we insert or update? => as for sesskey + $res = $ADODB_SESS_CONN->Execute("select count(*) as cnt from $ADODB_SESSION_TBL where sesskey = '$key'"); + if ($res && reset($res->fields) > 0) { + $qry = sprintf("update %s set expiry = %d, data = %s where sesskey = '%s'", $ADODB_SESSION_TBL, $expiry, $lob_value, $key); + } else { + // insert + $qry = sprintf("insert into %s (sesskey, expiry, data) values ('%s', %d, %s)", $ADODB_SESSION_TBL, $key, $expiry, $lob_value); + } + + $err = ""; + $rs1 = $ADODB_SESS_CONN->Execute($qry); + if (!$rs1) { + $err .= $ADODB_SESS_CONN->ErrorMsg()."\n"; + } + $rs2 = $ADODB_SESS_CONN->UpdateBlob($ADODB_SESSION_TBL, 'data', $val, "sesskey='$key'", strtoupper($ADODB_SESSION_USE_LOBS)); + if (!$rs2) { + $err .= $ADODB_SESS_CONN->ErrorMsg()."\n"; + } + $rs = ($rs1 && $rs2) ? true : false; + } + + if (!$rs) { + ADOConnection::outp( ' +-- Session Replace: '.nl2br($err).'

        ',false); + } else { + // bug in access driver (could be odbc?) means that info is not commited + // properly unless select statement executed in Win2000 + if ($ADODB_SESS_CONN->databaseType == 'access') + $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); + } + return !empty($rs); +} + +function adodb_sess_destroy($key) +{ + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; + $rs = $ADODB_SESS_CONN->Execute($qry); + } + return $rs ? true : false; +} + +function adodb_sess_gc($maxlifetime) +{ + global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $t = time(); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $rs->Close(); + + //$ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->CommitTrans(); + + } + } else { + $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time()); + + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- Garbage Collection: $qry

        "); + } + // suggested by Cameron, "GaM3R" + if (defined('ADODB_SESSION_OPTIMIZE')) { + global $ADODB_SESSION_DRIVER; + + switch( $ADODB_SESSION_DRIVER ) { + case 'mysql': + case 'mysqlt': + $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; + break; + case 'postgresql': + case 'postgresql7': + $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; + break; + } + if (!empty($opt_qry)) { + $ADODB_SESS_CONN->Execute($opt_qry); + } + } + if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL; + else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL; + + $rs = $ADODB_SESS_CONN->SelectLimit($sql,1); + if ($rs && !$rs->EOF) { + + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts); + $t = time(); + if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { + $msg = + __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)"; + error_log($msg); + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- $msg

        "); + } + } + + return true; +} + +session_module_name('user'); +session_set_save_handler( + "adodb_sess_open", + "adodb_sess_close", + "adodb_sess_read", + "adodb_sess_write", + "adodb_sess_destroy", + "adodb_sess_gc"); +} + +/* TEST SCRIPT -- UNCOMMENT */ + +if (0) { + + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + ADOConnection::outp( " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}

        ",false); +} + +?> diff --git a/fannie/adodb5/session/old/adodb-session.php b/fannie/adodb5/session/old/adodb-session.php new file mode 100644 index 000000000..31b48e5a9 --- /dev/null +++ b/fannie/adodb5/session/old/adodb-session.php @@ -0,0 +1,439 @@ +"; + +To force non-persistent connections, call adodb_session_open first before session_start(): + + include('adodb.inc.php'); + include('adodb-session.php'); + adodb_sess_open(false,false,false); + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}

        "; + + + Installation + ============ + 1. Create this table in your database (syntax might vary depending on your db): + + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA text not null, + primary key (sesskey) + ); + + For oracle: + create table sessions ( + SESSKEY char(32) not null, + EXPIRY DECIMAL(16) not null, + EXPIREREF varchar(64), + DATA varchar(4000) not null, + primary key (sesskey) + ); + + + 2. Then define the following parameters. You can either modify + this file, or define them before this file is included: + + $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; + $ADODB_SESSION_CONNECT='server to connect to'; + $ADODB_SESSION_USER ='user'; + $ADODB_SESSION_PWD ='password'; + $ADODB_SESSION_DB ='database'; + $ADODB_SESSION_TBL = 'sessions' + + 3. Recommended is PHP 4.1.0 or later. There are documented + session bugs in earlier versions of PHP. + + 4. If you want to receive notifications when a session expires, then + you can tag a session with an EXPIREREF, and before the session + record is deleted, we can call a function that will pass the EXPIREREF + as the first parameter, and the session key as the second parameter. + + To do this, define a notification function, say NotifyFn: + + function NotifyFn($expireref, $sesskey) + { + } + + Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY. + This is an array with 2 elements, the first being the name of the variable + you would like to store in the EXPIREREF field, and the 2nd is the + notification function's name. + + In this example, we want to be notified when a user's session + has expired, so we store the user id in the global variable $USERID, + store this value in the EXPIREREF field: + + $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn'); + + Then when the NotifyFn is called, we are passed the $USERID as the first + parameter, eg. NotifyFn($userid, $sesskey). +*/ + +if (!defined('_ADODB_LAYER')) { + include (dirname(__FILE__).'/adodb.inc.php'); +} + +if (!defined('ADODB_SESSION')) { + + define('ADODB_SESSION',1); + + /* if database time and system time is difference is greater than this, then give warning */ + define('ADODB_SESSION_SYNCH_SECS',60); + + /* + Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1 +*/ +function adodb_session_regenerate_id() +{ + $conn = ADODB_Session::_conn(); + if (!$conn) return false; + + $old_id = session_id(); + if (function_exists('session_regenerate_id')) { + session_regenerate_id(); + } else { + session_id(md5(uniqid(rand(), true))); + $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + //@session_start(); + } + $new_id = session_id(); + $ok = $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id)); + + /* it is possible that the update statement fails due to a collision */ + if (!$ok) { + session_id($old_id); + if (empty($ck)) $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + return false; + } + + return true; +} + +/****************************************************************************************\ + Global definitions +\****************************************************************************************/ +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_CRC, + $ADODB_SESSION_TBL; + + + $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); + if ($ADODB_SESS_LIFE <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $ADODB_SESS_LIFE

        "; + $ADODB_SESS_LIFE=1440; + } + $ADODB_SESSION_CRC = false; + //$ADODB_SESS_DEBUG = true; + + ////////////////////////////////// + /* SET THE FOLLOWING PARAMETERS */ + ////////////////////////////////// + + if (empty($ADODB_SESSION_DRIVER)) { + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD =''; + $ADODB_SESSION_DB ='xphplens_2'; + } + + if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) { + $ADODB_SESSION_EXPIRE_NOTIFY = false; + } + // Made table name configurable - by David Johnson djohnson@inpro.net + if (empty($ADODB_SESSION_TBL)){ + $ADODB_SESSION_TBL = 'sessions'; + } + + /* + $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER; + $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT; + $ADODB_SESS['user'] = $ADODB_SESSION_USER; + $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD; + $ADODB_SESS['db'] = $ADODB_SESSION_DB; + $ADODB_SESS['life'] = $ADODB_SESS_LIFE; + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + $ADODB_SESS['table'] = $ADODB_SESS_TBL; + */ + +/****************************************************************************************\ + Create the connection to the database. + + If $ADODB_SESS_CONN already exists, reuse that connection +\****************************************************************************************/ +function adodb_sess_open($save_path, $session_name,$persist=true) +{ +GLOBAL $ADODB_SESS_CONN; + if (isset($ADODB_SESS_CONN)) return true; + +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_DEBUG; + + // cannot use & below - do not know why... + $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); + if (!empty($ADODB_SESS_DEBUG)) { + $ADODB_SESS_CONN->debug = true; + ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "); + } + if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + + if (!$ok) ADOConnection::outp( " +-- Session: connection failed

        ",false); +} + +/****************************************************************************************\ + Close the connection +\****************************************************************************************/ +function adodb_sess_close() +{ +global $ADODB_SESS_CONN; + + if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); + return true; +} + +/****************************************************************************************\ + Slurp in the session variables and return the serialized string +\****************************************************************************************/ +function adodb_sess_read($key) +{ +global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC; + + $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else + $v = rawurldecode(reset($rs->fields)); + + $rs->Close(); + + // new optimization adodb 2.1 + $ADODB_SESSION_CRC = strlen($v).crc32($v); + + return $v; + } + + return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com +} + +/****************************************************************************************\ + Write the serialized data to a database. + + If the data has not been modified since adodb_sess_read(), we do not write. +\****************************************************************************************/ +function adodb_sess_write($key, $val) +{ + global + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESSION_TBL, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_CRC, + $ADODB_SESSION_EXPIRE_NOTIFY; + + $expiry = time() + $ADODB_SESS_LIFE; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) { + if ($ADODB_SESS_DEBUG) echo " +-- Session: Only updating date - crc32 not changed

        "; + $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time(); + $rs = $ADODB_SESS_CONN->Execute($qry); + return true; + } + $val = rawurlencode($val); + + $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val); + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + $var = reset($ADODB_SESSION_EXPIRE_NOTIFY); + global $$var; + $arr['expireref'] = $$var; + } + $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr, + 'sesskey',$autoQuote = true); + + if (!$rs) { + ADOConnection::outp( ' +-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'

        ',false); + } else { + // bug in access driver (could be odbc?) means that info is not commited + // properly unless select statement executed in Win2000 + if ($ADODB_SESS_CONN->databaseType == 'access') + $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); + } + return !empty($rs); +} + +function adodb_sess_destroy($key) +{ + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; + $rs = $ADODB_SESS_CONN->Execute($qry); + } + return $rs ? true : false; +} + +function adodb_sess_gc($maxlifetime) +{ + global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $t = time(); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $rs->Close(); + + $ADODB_SESS_CONN->CommitTrans(); + + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time(); + $ADODB_SESS_CONN->Execute($qry); + + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- Garbage Collection: $qry

        "); + } + // suggested by Cameron, "GaM3R" + if (defined('ADODB_SESSION_OPTIMIZE')) { + global $ADODB_SESSION_DRIVER; + + switch( $ADODB_SESSION_DRIVER ) { + case 'mysql': + case 'mysqlt': + $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; + break; + case 'postgresql': + case 'postgresql7': + $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; + break; + } + if (!empty($opt_qry)) { + $ADODB_SESS_CONN->Execute($opt_qry); + } + } + if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL; + else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL; + + $rs = $ADODB_SESS_CONN->SelectLimit($sql,1); + if ($rs && !$rs->EOF) { + + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts); + $t = time(); + + if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { + + $msg = + __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)"; + error_log($msg); + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- $msg

        "); + } + } + + return true; +} + +session_module_name('user'); +session_set_save_handler( + "adodb_sess_open", + "adodb_sess_close", + "adodb_sess_read", + "adodb_sess_write", + "adodb_sess_destroy", + "adodb_sess_gc"); +} + +/* TEST SCRIPT -- UNCOMMENT */ + +if (0) { + + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + ADOConnection::outp( " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}

        ",false); +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/session/old/crypt.inc.php b/fannie/adodb5/session/old/crypt.inc.php new file mode 100644 index 000000000..b99bbba55 --- /dev/null +++ b/fannie/adodb5/session/old/crypt.inc.php @@ -0,0 +1,64 @@ + +class MD5Crypt{ + function keyED($txt,$encrypt_key) + { + $encrypt_key = md5($encrypt_key); + $ctr=0; + $tmp = ""; + for ($i=0;$ikeyED($tmp,$key)); + } + + function Decrypt($txt,$key) + { + $txt = $this->keyED(base64_decode($txt),$key); + $tmp = ""; + for ($i=0;$i= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) + { + $randnumber = rand(48,120); + } + + $randomPassword .= chr($randnumber); + } + return $randomPassword; + } + +} +?> \ No newline at end of file diff --git a/fannie/adodb5/session/session_schema.xml b/fannie/adodb5/session/session_schema.xml new file mode 100644 index 000000000..3c61ff645 --- /dev/null +++ b/fannie/adodb5/session/session_schema.xml @@ -0,0 +1,26 @@ + + + + table for ADOdb session-management + + + session key + + + + + + + + + + + + + + + + + +
        +
        diff --git a/fannie/adodb5/session/session_schema2.xml b/fannie/adodb5/session/session_schema2.xml new file mode 100644 index 000000000..22f8dafed --- /dev/null +++ b/fannie/adodb5/session/session_schema2.xml @@ -0,0 +1,38 @@ + + + + table for ADOdb session-management + + + session key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        diff --git a/fannie/adodb5/tests/benchmark.php b/fannie/adodb5/tests/benchmark.php new file mode 100644 index 000000000..936821ed3 --- /dev/null +++ b/fannie/adodb5/tests/benchmark.php @@ -0,0 +1,84 @@ + + + + + ADODB Benchmarks + + + +ADODB Version: $ADODB_version Host: $db->host   Database: $db->database"; + + // perform query once to cache results so we are only testing throughput + $rs = $db->Execute($sql); + if (!$rs){ + print "Error in recordset

        "; + return; + } + $arr = $rs->GetArray(); + //$db->debug = true; + global $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $start = microtime(); + for ($i=0; $i < $max; $i++) { + $rs = $db->Execute($sql); + $arr = $rs->GetArray(); + // print $arr[0][1]; + } + $end = microtime(); + $start = explode(' ',$start); + $end = explode(' ',$end); + + //print_r($start); + //print_r($end); + + // print_r($arr); + $total = $end[0]+trim($end[1]) - $start[0]-trim($start[1]); + printf ("

        seconds = %8.2f for %d iterations each with %d records

        ",$total,$max, sizeof($arr)); + flush(); + + + //$db->Close(); +} +include("testdatabases.inc.php"); + +?> + + + + diff --git a/fannie/adodb5/tests/client.php b/fannie/adodb5/tests/client.php new file mode 100644 index 000000000..7bf145e7f --- /dev/null +++ b/fannie/adodb5/tests/client.php @@ -0,0 +1,198 @@ + + +'; + var_dump(parse_url('odbc_mssql://userserver/')); + die(); + +include('../adodb.inc.php'); +include('../tohtml.inc.php'); + + function send2server($url,$sql) + { + $url .= '?sql='.urlencode($sql); + print "

        $url

        "; + $rs = csv2rs($url,$err); + if ($err) print $err; + return $rs; + } + + function print_pre($s) + { + print "
        ";print_r($s);print "
        "; + } + + +$serverURL = 'http://localhost/php/phplens/adodb/server.php'; +$testhttp = false; + +$sql1 = "insertz into products (productname) values ('testprod 1')"; +$sql2 = "insert into products (productname) values ('testprod 1')"; +$sql3 = "insert into products (productname) values ('testprod 2')"; +$sql4 = "delete from products where productid>80"; +$sql5 = 'select * from products'; + +if ($testhttp) { + print "Client Driver Tests

        "; + print "

        Test Error

        "; + $rs = send2server($serverURL,$sql1); + print_pre($rs); + print "
        "; + + print "

        Test Insert

        "; + + $rs = send2server($serverURL,$sql2); + print_pre($rs); + print "
        "; + + print "

        Test Insert2

        "; + + $rs = send2server($serverURL,$sql3); + print_pre($rs); + print "
        "; + + print "

        Test Delete

        "; + + $rs = send2server($serverURL,$sql4); + print_pre($rs); + print "
        "; + + + print "

        Test Select

        "; + $rs = send2server($serverURL,$sql5); + if ($rs) rs2html($rs); + + print "
        "; +} + + +print "

        CLIENT Driver Tests

        "; +$conn = ADONewConnection('csv'); +$conn->Connect($serverURL); +$conn->debug = true; + +print "

        Bad SQL

        "; + +$rs = $conn->Execute($sql1); + +print "

        Insert SQL 1

        "; +$rs = $conn->Execute($sql2); + +print "

        Insert SQL 2

        "; +$rs = $conn->Execute($sql3); + +print "

        Select SQL

        "; +$rs = $conn->Execute($sql5); +if ($rs) rs2html($rs); + +print "

        Delete SQL

        "; +$rs = $conn->Execute($sql4); + +print "

        Select SQL

        "; +$rs = $conn->Execute($sql5); +if ($rs) rs2html($rs); + + +/* EXPECTED RESULTS FOR HTTP TEST: + +Test Insert +http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29 + +adorecordset Object +( + [dataProvider] => native + [fields] => + [blobSize] => 64 + [canSeek] => + [EOF] => 1 + [emptyTimeStamp] => + [emptyDate] => + [debug] => + [timeToLive] => 0 + [bind] => + [_numOfRows] => -1 + [_numOfFields] => 0 + [_queryID] => 1 + [_currentRow] => -1 + [_closed] => + [_inited] => + [sql] => insert into products (productname) values ('testprod') + [affectedrows] => 1 + [insertid] => 81 +) + + +-------------------------------------------------------------------------------- + +Test Insert2 +http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29 + +adorecordset Object +( + [dataProvider] => native + [fields] => + [blobSize] => 64 + [canSeek] => + [EOF] => 1 + [emptyTimeStamp] => + [emptyDate] => + [debug] => + [timeToLive] => 0 + [bind] => + [_numOfRows] => -1 + [_numOfFields] => 0 + [_queryID] => 1 + [_currentRow] => -1 + [_closed] => + [_inited] => + [sql] => insert into products (productname) values ('testprod') + [affectedrows] => 1 + [insertid] => 82 +) + + +-------------------------------------------------------------------------------- + +Test Delete +http://localhost/php/adodb/server.php?sql=delete+from+products+where+productid%3E80 + +adorecordset Object +( + [dataProvider] => native + [fields] => + [blobSize] => 64 + [canSeek] => + [EOF] => 1 + [emptyTimeStamp] => + [emptyDate] => + [debug] => + [timeToLive] => 0 + [bind] => + [_numOfRows] => -1 + [_numOfFields] => 0 + [_queryID] => 1 + [_currentRow] => -1 + [_closed] => + [_inited] => + [sql] => delete from products where productid>80 + [affectedrows] => 2 + [insertid] => 0 +) + +[more stuff deleted] + . + . + . +*/ +?> diff --git a/fannie/adodb5/tests/pdo.php b/fannie/adodb5/tests/pdo.php new file mode 100644 index 000000000..e4c1a4630 --- /dev/null +++ b/fannie/adodb5/tests/pdo.php @@ -0,0 +1,94 @@ +"; +try { + echo "New Connection\n"; + + + $dsn = 'pdo_mysql://root:@localhost/northwind?persist'; + + if (!empty($dsn)) { + $DB = NewADOConnection($dsn) || die("CONNECT FAILED"); + $connstr = $dsn; + } else { + + $DB = NewADOConnection('pdo'); + + echo "Connect\n"; + + $u = ''; $p = ''; + /* + $connstr = 'odbc:nwind'; + + $connstr = 'oci:'; + $u = 'scott'; + $p = 'natsoft'; + + + $connstr ="sqlite:d:\inetpub\adodb\sqlite.db"; + */ + + $connstr = "mysql:dbname=northwind"; + $u = 'root'; + + $connstr = "pgsql:dbname=test"; + $u = 'tester'; + $p = 'test'; + + $DB->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + + } + + echo "connection string=$connstr\n Execute\n"; + + //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $DB->Execute("select * from ADOXYZ where id<3"); + if ($DB->ErrorNo()) echo "*** errno=".$DB->ErrorNo() . " ".($DB->ErrorMsg())."\n"; + + + //print_r(get_class_methods($DB->_stmt)); + + if (!$rs) die("NO RS"); + + echo "Meta\n"; + for ($i=0; $i < $rs->NumCols(); $i++) { + var_dump($rs->FetchField($i)); + echo "
        "; + } + + echo "FETCH\n"; + $cnt = 0; + while (!$rs->EOF) { + adodb_pr($rs->fields); + $rs->MoveNext(); + if ($cnt++ > 1000) break; + } + + echo "
        --------------------------------------------------------
        \n\n\n"; + + $stmt = $DB->PrepareStmt("select * from ADOXYZ"); + + $rs = $stmt->Execute(); + $cols = $stmt->NumCols(); // execute required + + echo "COLS = $cols"; + for($i=1;$i<=$cols;$i++) { + $v = $stmt->_stmt->getColumnMeta($i); + var_dump($v); + } + + echo "e=".$stmt->ErrorNo() . " ".($stmt->ErrorMsg())."\n"; + while ($arr = $rs->FetchRow()) { + adodb_pr($arr); + } + die("DONE\n"); + +} catch (exception $e) { + echo "
        ";
        +	echo $e;
        +	echo "
        "; +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-active-record.php b/fannie/adodb5/tests/test-active-record.php new file mode 100644 index 000000000..1811049d9 --- /dev/null +++ b/fannie/adodb5/tests/test-active-record.php @@ -0,0 +1,141 @@ += 5) { + include('../adodb-exceptions.inc.php'); + echo "

        Exceptions included

        "; + } + } + + $db = NewADOConnection('mysql://root@localhost/northwind?persist'); + $db->debug=1; + ADOdb_Active_Record::SetDatabaseAdapter($db); + + + $db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TEMPORARY TABLE `children` ( + `id` int(10) unsigned NOT NULL auto_increment, + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + class Person extends ADOdb_Active_Record{} + $person = new Person(); + ADOdb_Active_Record::$_quoteNames = '111'; + + echo "

        Output of getAttributeNames: "; + var_dump($person->getAttributeNames()); + + /** + * Outputs the following: + * array(4) { + * [0]=> + * string(2) "id" + * [1]=> + * string(9) "name_first" + * [2]=> + * string(8) "name_last" + * [3]=> + * string(13) "favorite_color" + * } + */ + + $person = new Person(); + $person->name_first = 'Andi'; + $person->name_last = 'Gutmans'; + $person->save(); // this save() will fail on INSERT as favorite_color is a must fill... + + + $person = new Person(); + $person->name_first = 'Andi'; + $person->name_last = 'Gutmans'; + $person->favorite_color = 'blue'; + $person->save(); // this save will perform an INSERT successfully + + echo "

        The Insert ID generated:"; print_r($person->id); + + $person->favorite_color = 'red'; + $person->save(); // this save() will perform an UPDATE + + $person = new Person(); + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + // load record where id=2 into a new ADOdb_Active_Record + $person2 = new Person(); + $person2->Load('id=2'); + + $activeArr = $db->GetActiveRecordsClass($class = "Person",$table = "Persons","id=".$db->Param(0),array(2)); + $person2 = $activeArr[0]; + echo "

        Name (should be John): ",$person->name_first, "
        Class (should be Person): ",get_class($person2),"
        "; + + $db->Execute("insert into children (person_id,name_first,name_last) values (2,'Jill','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (2,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (2,'JAMIE','Lim')"); + + $newperson2 = new Person(); + $person2->HasMany('children','person_id'); + $person2->Load('id=2'); + $person2->name_last='green'; + $c = $person2->children; + $person2->save(); + + if (is_array($c) && sizeof($c) == 3 && $c[0]->name_first=='Jill' && $c[1]->name_first=='Joan' + && $c[2]->name_first == 'JAMIE') echo "OK Loaded HasMany
        "; + else { + var_dump($c); + echo "error loading hasMany should have 3 array elements Jill Joan Jamie
        "; + } + + class Child extends ADOdb_Active_Record{}; + $ch = new Child('children',array('id')); + $ch->BelongsTo('person','person_id','id'); + $ch->Load('id=1'); + if ($ch->name_first !== 'Jill') echo "error in Loading Child
        "; + + $p = $ch->person; + if ($p->name_first != 'John') echo "Error loading belongsTo
        "; + else echo "OK loading BelongTo
        "; + + $p->hasMany('children','person_id'); + $p->LoadRelations('children', " Name_first like 'J%' order by id",1,2); + if (sizeof($p->children) == 2 && $p->children[1]->name_first == 'JAMIE') echo "OK LoadRelations
        "; + else echo "error LoadRelations
        "; + + $db->Execute("CREATE TEMPORARY TABLE `persons2` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $p = new adodb_active_record('persons2'); + $p->name_first = 'James'; + + $p->name_last = 'James'; + + $p->HasMany('children','person_id'); + $p->children; + var_dump($p); + $p->Save(); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-active-recs2.php b/fannie/adodb5/tests/test-active-recs2.php new file mode 100644 index 000000000..72168d80b --- /dev/null +++ b/fannie/adodb5/tests/test-active-recs2.php @@ -0,0 +1,75 @@ +Connect("localhost","tester","test","test"); +} else + $db = NewADOConnection('oci8://scott:natsoft@/'); + + +$arr = $db->ServerInfo(); +echo "

        $db->dataProvider: {$arr['description']}

        "; + +$arr = $db->GetActiveRecords('products',' productid<10'); +adodb_pr($arr); + +ADOdb_Active_Record::SetDatabaseAdapter($db); +if (!$db) die('failed'); + + + + +$rec = new ADODB_Active_Record('photos'); + +$rec = new ADODB_Active_Record('products'); + + +adodb_pr($rec->getAttributeNames()); + +echo "
        "; + + +$rec->load('productid=2'); +adodb_pr($rec); + +$db->debug=1; + + +$rec->productname = 'Changie Chan'.rand(); + +$rec->insert(); +$rec->update(); + +$rec->productname = 'Changie Chan 99'; +$rec->replace(); + + +$rec2 = new ADODB_Active_Record('products'); +$rec->load('productid=3'); +$rec->save(); + +$rec = new ADODB_Active_record('products'); +$rec->productname = 'John ActiveRec'; +$rec->notes = 22; +#$rec->productid=0; +$rec->discontinued=1; +$rec->Save(); +$rec->supplierid=33; +$rec->Save(); +$rec->discontinued=0; +$rec->Save(); +$rec->Delete(); + +echo "

        Affected Rows after delete=".$db->Affected_Rows()."

        "; +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-active-relations.php b/fannie/adodb5/tests/test-active-relations.php new file mode 100644 index 000000000..eb0f636db --- /dev/null +++ b/fannie/adodb5/tests/test-active-relations.php @@ -0,0 +1,87 @@ +debug=1; + ADOdb_Active_Record::SetDatabaseAdapter($db); + + $db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TEMPORARY TABLE `children` ( + `id` int(10) unsigned NOT NULL auto_increment, + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Jill','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')"); + + ADODB_Active_Record::TableHasMany('persons', 'children','person_id'); + class person extends ADOdb_Active_Record{} + + $person = new person(); +# $person->HasMany('children','person_id'); ## this is affects all other instances of Person + + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + $person2 = new person(); + $person2->Load('id=1'); + + $c = $person2->children; + if (is_array($c) && sizeof($c) == 3 && $c[0]->name_first=='Jill' && $c[1]->name_first=='Joan' + && $c[2]->name_first == 'JAMIE') echo "OK Loaded HasMany
        "; + else { + var_dump($c); + echo "error loading hasMany should have 3 array elements Jill Joan Jamie
        "; + } + + class child extends ADOdb_Active_Record{}; + ADODB_Active_Record::TableBelongsTo('children','person','person_id','id'); + $ch = new Child('children',array('id')); + + $ch->Load('id=1'); + if ($ch->name_first !== 'Jill') echo "error in Loading Child
        "; + + $p = $ch->person; + if (!$p || $p->name_first != 'John') echo "Error loading belongsTo
        "; + else echo "OK loading BelongTo
        "; + + if ($p) { + #$p->HasMany('children','person_id'); ## this is affects all other instances of Person + $p->LoadRelations('children', 'order by id',1,2); + if (sizeof($p->children) == 2 && $p->children[1]->name_first == 'JAMIE') echo "OK LoadRelations
        "; + else { + var_dump($p->children); + echo "error LoadRelations
        "; + } + + unset($p->children); + $p->LoadRelations('children', " name_first like 'J%' order by id",1,2); + } + if ($p) + foreach($p->children as $c) { + echo " Saving $c->name_first
        "; + $c->name_first .= ' K.'; + $c->Save(); + } + +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-active-relationsx.php b/fannie/adodb5/tests/test-active-relationsx.php new file mode 100644 index 000000000..fbfddf661 --- /dev/null +++ b/fannie/adodb5/tests/test-active-relationsx.php @@ -0,0 +1,419 @@ +\n", $txt); + echo $txt; + } + + include_once('../adodb.inc.php'); + include_once('../adodb-active-recordx.inc.php'); + + + $db = NewADOConnection('mysql://root@localhost/test'); + $db->debug=0; + ADOdb_Active_Record::SetDatabaseAdapter($db); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("Preparing database using SQL queries (creating 'people', 'children')\n"); + + $db->Execute("DROP TABLE `people`"); + $db->Execute("DROP TABLE `children`"); + $db->Execute("DROP TABLE `artists`"); + $db->Execute("DROP TABLE `songs`"); + + $db->Execute("CREATE TABLE `people` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + $db->Execute("CREATE TABLE `children` ( + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TABLE `artists` ( + `name` varchar(100) NOT NULL default '', + `artistuniqueid` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`artistuniqueid`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TABLE `songs` ( + `name` varchar(100) NOT NULL default '', + `artistid` int(10) NOT NULL, + `recordid` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`recordid`) + ) ENGINE=MyISAM; + "); + + $db->Execute("insert into children (person_id,name_first,name_last,favorite_pet) values (1,'Jill','Lim','tortoise')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')"); + + $db->Execute("insert into artists (artistuniqueid, name) values(1,'Elvis Costello')"); + $db->Execute("insert into songs (recordid, name, artistid) values(1,'No Hiding Place', 1)"); + $db->Execute("insert into songs (recordid, name, artistid) values(2,'American Gangster Time', 1)"); + + // This class _implicitely_ relies on the 'people' table (pluralized form of 'person') + class Person extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct(); + $this->hasMany('children'); + } + } + // This class _implicitely_ relies on the 'children' table + class Child extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct(); + $this->belongsTo('person'); + } + } + // This class _explicitely_ relies on the 'children' table and shares its metadata with Child + class Kid extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('children'); + $this->belongsTo('person'); + } + } + // This class _explicitely_ relies on the 'children' table but does not share its metadata + class Rugrat extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('children', false, false, array('new' => true)); + } + } + + class Artist extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('artists', array('artistuniqueid')); + $this->hasMany('songs', 'artistid'); + } + } + class Song extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('songs', array('recordid')); + $this->belongsTo('artist', 'artistid'); + } + } + + ar_echo("Inserting person in 'people' table ('John Lim, he likes lavender')\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + $person = new Person(); + $person->name_first = 'Lady'; + $person->name_last = 'Cat'; + $person->favorite_color = 'green'; + $person->save(); + + $child = new Child(); + $child->name_first = 'Fluffy'; + $child->name_last = 'Cat'; + $child->favorite_pet = 'Cat Lady'; + $child->person_id = $person->id; + $child->save(); + + $child = new Child(); + $child->name_first = 'Sun'; + $child->name_last = 'Cat'; + $child->favorite_pet = 'Cat Lady'; + $child->person_id = $person->id; + $child->save(); + + $err_count = 0; + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('id=1') [Lazy Method]\n"); + ar_echo("person is loaded but its children will be loaded on-demand later on\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $people = $person->Find('id=1'); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo("\n-- Lazily Loading Children:\n\n"); + foreach($people as $aperson) + { + foreach($aperson->children as $achild) + { + if($achild->name_first); + } + } + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("person is loaded, and so are its children\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $people = $person->Find('id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('id=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("person and its children are loaded using a single query\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + // When I specifically ask for a join, I have to specify which table id I am looking up + // otherwise the SQL parser will wonder which table's id that would be. + $people = $person->Find('people.id=1', false, false, array('loading' => ADODB_JOIN_AR)); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Load('people.id=1') [Join Method]\n"); + ar_echo("Load() always uses the join method since it returns only one row\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + // Under the hood, Load(), since it returns only one row, always perform a join + // Therefore we need to clarify which id we are talking about. + $person->Load('people.id=1'); + ar_echo((ar_assert(found($person, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($person, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($person, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($person, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("child->Load('children.id=1') [Join Method]\n"); + ar_echo("We are now loading from the 'children' table, not from 'people'\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $child = new Child(); + $child->Load('children.id=1'); + ar_echo((ar_assert(found($child, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($child, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("child->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $child = new Child(); + $children = $child->Find('id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($children, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($children, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(notfound($children, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($children, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("Where we see that kid shares relationships with child because they are stored\n"); + ar_echo("in the common table's metadata structure.\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $kid = new Kid('children'); + $kids = $kid->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($kids, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($kids, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("kid->Find('children.id=1' ... ADODB_LAZY_AR) [Lazy Method]\n"); + ar_echo("Of course, lazy loading also retrieve medata information...\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $kid = new Kid('children'); + $kids = $kid->Find('children.id=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($kids, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($kids, "'favorite_color' => 'lavender'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo("\n-- Lazily Loading People:\n\n"); + foreach($kids as $akid) + { + if($akid->person); + } + ar_echo((ar_assert(found($kids, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("In rugrat's constructor it is specified that\nit must forget any existing relation\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $rugrat = new Rugrat('children'); + $rugrats = $rugrat->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($rugrats, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($rugrats, "'favorite_color' => 'lavender'"))) ? "[OK] No relation found\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($rugrats, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($rugrats, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("Note how only rugrat forgot its relations - kid is fine.\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $kid = new Kid('children'); + $kids = $kid->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($kids, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($kids, "'favorite_color' => 'lavender'"))) ? "[OK] I did not forget relation: person\n" : "[!!] I should not have forgotten relation: person\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $rugrat = new Rugrat('children'); + $rugrats = $rugrat->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + $arugrat = $rugrats[0]; + ar_echo((ar_assert(found($arugrat, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($arugrat, "'favorite_color' => 'lavender'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n-- Loading relations:\n\n"); + $arugrat->belongsTo('person'); + $arugrat->LoadRelations('person', 'order by id', 0, 2); + ar_echo((ar_assert(found($arugrat, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(found($arugrat, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($arugrat, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($arugrat, "'name_first' => 'JAMIE'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('1=1') [Lazy Method]\n"); + ar_echo("And now for our finale...\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $people = $person->Find('1=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($people, "'name_first' => 'Fluffy'"))) ? "[OK] No Fluffy yet\n" : "[!!] Found Fluffy relation when I shouldn't\n"); + ar_echo("\n-- Lazily Loading Everybody:\n\n"); + foreach($people as $aperson) + { + foreach($aperson->children as $achild) + { + if($achild->name_first); + } + } + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Lady'"))) ? "[OK] Found Cat Lady\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Fluffy'"))) ? "[OK] Found Fluffy\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Sun'"))) ? "[OK] Found Sun\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Load('artistuniqueid=1') [Join Method]\n"); + ar_echo("Yes, we are dabbling in the musical field now..\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artist->Load('artistuniqueid=1'); + ar_echo((ar_assert(found($artist, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($artist, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Load('recordid=1') [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $song->Load('recordid=1'); + ar_echo((ar_assert(found($song, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Find('artistuniqueid=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artists = $artist->Find('artistuniqueid=1', false, false, array('loading' => ADODB_JOIN_AR)); + ar_echo((ar_assert(found($artists, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($artists, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Find('recordid=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $songs = $song->Find('recordid=1', false, false, array('loading' => ADODB_JOIN_AR)); + ar_echo((ar_assert(found($songs, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Find('artistuniqueid=1' ... ADODB_WORK_AR) [Work Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artists = $artist->Find('artistuniqueid=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($artists, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($artists, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Find('recordid=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $songs = $song->Find('recordid=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($songs, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Find('artistuniqueid=1' ... ADODB_LAZY_AR) [Lazy Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artists = $artist->Find('artistuniqueid=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($artists, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($artists, "'name' => 'No Hiding Place'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + foreach($artists as $anartist) + { + foreach($anartist->songs as $asong) + { + if($asong->name); + } + } + ar_echo((ar_assert(found($artists, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Find('recordid=1' ... ADODB_LAZY_AR) [Lazy Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $songs = $song->Find('recordid=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($songs, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($songs, "'name' => 'Elvis Costello'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + foreach($songs as $asong) + { + if($asong->artist); + } + ar_echo((ar_assert(found($songs, "'name' => 'Elvis Costello'"))) ? "[OK] Found relation: artist\n" : "[!!] Missing relation: artist\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("Test suite complete. " . (($err_count > 0) ? "$err_count errors found.\n" : "Success.\n")); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); +?> diff --git a/fannie/adodb5/tests/test-datadict.php b/fannie/adodb5/tests/test-datadict.php new file mode 100644 index 000000000..f821f8b5c --- /dev/null +++ b/fannie/adodb5/tests/test-datadict.php @@ -0,0 +1,250 @@ +$dbType

        "; + $db = NewADOConnection($dbType); + $dict = NewDataDictionary($db); + + if (!$dict) continue; + $dict->debug = 1; + + $opts = array('REPLACE','mysql' => 'ENGINE=INNODB', 'oci8' => 'TABLESPACE USERS'); + +/* $flds = array( + array('id', 'I', + 'AUTO','KEY'), + + array('name' => 'firstname', 'type' => 'varchar','size' => 30, + 'DEFAULT'=>'Joan'), + + array('lastname','varchar',28, + 'DEFAULT'=>'Chen','key'), + + array('averylonglongfieldname','X',1024, + 'NOTNULL','default' => 'test'), + + array('price','N','7.2', + 'NOTNULL','default' => '0.00'), + + array('MYDATE', 'D', + 'DEFDATE'), + array('TS','T', + 'DEFTIMESTAMP') + );*/ + + $flds = " +ID I AUTO KEY, +FIRSTNAME VARCHAR(30) DEFAULT 'Joan' INDEX idx_name, +LASTNAME VARCHAR(28) DEFAULT 'Chen' key INDEX idx_name INDEX idx_lastname, +averylonglongfieldname X(1024) DEFAULT 'test', +price N(7.2) DEFAULT '0.00', +MYDATE D DEFDATE INDEX idx_date, +BIGFELLOW X NOTNULL, +TS_SECS T DEFTIMESTAMP, +TS_SUBSEC TS DEFTIMESTAMP +"; + + + $sqla = $dict->CreateDatabase('KUTU',array('postgres'=>"LOCATION='/u01/postdata'")); + $dict->SetSchema('KUTU'); + + $sqli = ($dict->CreateTableSQL('testtable',$flds, $opts)); + $sqla = array_merge($sqla,$sqli); + + $sqli = $dict->CreateIndexSQL('idx','testtable','price,firstname,lastname',array('BITMAP','FULLTEXT','CLUSTERED','HASH')); + $sqla = array_merge($sqla,$sqli); + $sqli = $dict->CreateIndexSQL('idx2','testtable','price,lastname');//,array('BITMAP','FULLTEXT','CLUSTERED')); + $sqla = array_merge($sqla,$sqli); + + $addflds = array(array('height', 'F'),array('weight','F')); + $sqli = $dict->AddColumnSQL('testtable',$addflds); + $sqla = array_merge($sqla,$sqli); + $addflds = array(array('height', 'F','NOTNULL'),array('weight','F','NOTNULL')); + $sqli = $dict->AlterColumnSQL('testtable',$addflds); + $sqla = array_merge($sqla,$sqli); + + + printsqla($dbType,$sqla); + + if (file_exists('d:\inetpub\wwwroot\php\phplens\adodb\adodb.inc.php')) + if ($dbType == 'mysqlt') { + $db->Connect('localhost', "root", "", "test"); + $dict->SetSchema(''); + $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds); + if ($sqla2) printsqla($dbType,$sqla2); + } + if ($dbType == 'postgres') { + if (@$db->Connect('localhost', "tester", "test", "test")); + $dict->SetSchema(''); + $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds); + if ($sqla2) printsqla($dbType,$sqla2); + } + + if ($dbType == 'odbc_mssql') { + $dsn = $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=localhost;Database=northwind;"; + if (@$db->Connect($dsn, "sa", "natsoft", "test")); + $dict->SetSchema(''); + $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds); + if ($sqla2) printsqla($dbType,$sqla2); + } + + + + adodb_pr($dict->databaseType); + printsqla($dbType, $dict->DropColumnSQL('table',array('my col','`col2_with_Quotes`','A_col3','col3(10)'))); + printsqla($dbType, $dict->ChangeTableSQL('adoxyz','LASTNAME varchar(32)')); + +} + +function printsqla($dbType,$sqla) +{ + print "

        ";
        +	//print_r($dict->MetaTables());
        +	foreach($sqla as $s) {
        +		$s = htmlspecialchars($s);
        +		print "$s;\n";
        +		if ($dbType == 'oci8') print "/\n";
        +	}
        +	print "

        "; +} + +/*** + +Generated SQL: + +mysql + +CREATE DATABASE KUTU; +DROP TABLE KUTU.testtable; +CREATE TABLE KUTU.testtable ( +id INTEGER NOT NULL AUTO_INCREMENT, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) NOT NULL DEFAULT 'Chen', +averylonglongfieldname LONGTEXT NOT NULL, +price NUMERIC(7,2) NOT NULL DEFAULT 0.00, +MYDATE DATE DEFAULT CURDATE(), + PRIMARY KEY (id, lastname) +)TYPE=ISAM; +CREATE FULLTEXT INDEX idx ON KUTU.testtable (firstname,lastname); +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +ALTER TABLE KUTU.testtable ADD height DOUBLE; +ALTER TABLE KUTU.testtable ADD weight DOUBLE; +ALTER TABLE KUTU.testtable MODIFY COLUMN height DOUBLE NOT NULL; +ALTER TABLE KUTU.testtable MODIFY COLUMN weight DOUBLE NOT NULL; + + +-------------------------------------------------------------------------------- + +oci8 + +CREATE USER KUTU IDENTIFIED BY tiger; +/ +GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO KUTU; +/ +DROP TABLE KUTU.testtable CASCADE CONSTRAINTS; +/ +CREATE TABLE KUTU.testtable ( +id NUMBER(16) NOT NULL, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL, +averylonglongfieldname CLOB NOT NULL, +price NUMBER(7,2) DEFAULT 0.00 NOT NULL, +MYDATE DATE DEFAULT TRUNC(SYSDATE), + PRIMARY KEY (id, lastname) +)TABLESPACE USERS; +/ +DROP SEQUENCE KUTU.SEQ_testtable; +/ +CREATE SEQUENCE KUTU.SEQ_testtable; +/ +CREATE OR REPLACE TRIGGER KUTU.TRIG_SEQ_testtable BEFORE insert ON KUTU.testtable + FOR EACH ROW + BEGIN + select KUTU.SEQ_testtable.nextval into :new.id from dual; + END; +/ +CREATE BITMAP INDEX idx ON KUTU.testtable (firstname,lastname); +/ +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +/ +ALTER TABLE testtable ADD ( + height NUMBER, + weight NUMBER); +/ +ALTER TABLE testtable MODIFY( + height NUMBER NOT NULL, + weight NUMBER NOT NULL); +/ + + +-------------------------------------------------------------------------------- + +postgres +AlterColumnSQL not supported for PostgreSQL + + +CREATE DATABASE KUTU LOCATION='/u01/postdata'; +DROP TABLE KUTU.testtable; +CREATE TABLE KUTU.testtable ( +id SERIAL, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL, +averylonglongfieldname TEXT NOT NULL, +price NUMERIC(7,2) DEFAULT 0.00 NOT NULL, +MYDATE DATE DEFAULT CURRENT_DATE, + PRIMARY KEY (id, lastname) +); +CREATE INDEX idx ON KUTU.testtable USING HASH (firstname,lastname); +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +ALTER TABLE KUTU.testtable ADD height FLOAT8; +ALTER TABLE KUTU.testtable ADD weight FLOAT8; + + +-------------------------------------------------------------------------------- + +odbc_mssql + +CREATE DATABASE KUTU; +DROP TABLE KUTU.testtable; +CREATE TABLE KUTU.testtable ( +id INT IDENTITY(1,1) NOT NULL, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL, +averylonglongfieldname TEXT NOT NULL, +price NUMERIC(7,2) DEFAULT 0.00 NOT NULL, +MYDATE DATETIME DEFAULT GetDate(), + PRIMARY KEY (id, lastname) +); +CREATE CLUSTERED INDEX idx ON KUTU.testtable (firstname,lastname); +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +ALTER TABLE KUTU.testtable ADD + height REAL, + weight REAL; +ALTER TABLE KUTU.testtable ALTER COLUMN height REAL NOT NULL; +ALTER TABLE KUTU.testtable ALTER COLUMN weight REAL NOT NULL; + + +-------------------------------------------------------------------------------- +*/ + + +echo "

        Test XML Schema

        "; +$ff = file('xmlschema.xml'); +echo "
        ";
        +foreach($ff as $xml) echo htmlspecialchars($xml);
        +echo "
        "; +include_once('test-xmlschema.php'); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-perf.php b/fannie/adodb5/tests/test-perf.php new file mode 100644 index 000000000..37406d2dc --- /dev/null +++ b/fannie/adodb5/tests/test-perf.php @@ -0,0 +1,50 @@ + $v) { + if (strncmp($k,'test',4) == 0) $_SESSION['_db'] = $k; + } +} + +if (isset($_SESSION['_db'])) { + $_db = $_SESSION['_db']; + $_GET[$_db] = 1; + $$_db = 1; +} + +echo "

        Performance Monitoring

        "; +include_once('testdatabases.inc.php'); + + +function testdb($db) +{ + if (!$db) return; + echo "";print_r($db->ServerInfo()); echo " user=".$db->user.""; + + $perf = NewPerfMonitor($db); + + # unit tests + if (0) { + //$DB->debug=1; + echo "Data Cache Size=".$perf->DBParameter('data cache size').'

        '; + echo $perf->HealthCheck(); + echo($perf->SuspiciousSQL()); + echo($perf->ExpensiveSQL()); + echo($perf->InvalidSQL()); + echo $perf->Tables(); + + echo "

        ";
        +		echo $perf->HealthCheckCLI();
        +		$perf->Poll(3);
        +		die();
        +	}
        +	
        +	if ($perf) $perf->UI(3);
        +}
        + 
        +?>
        diff --git a/fannie/adodb5/tests/test-pgblob.php b/fannie/adodb5/tests/test-pgblob.php
        new file mode 100644
        index 000000000..c190e5b85
        --- /dev/null
        +++ b/fannie/adodb5/tests/test-pgblob.php
        @@ -0,0 +1,88 @@
        +Param(false);
        +		$x = (rand() % 10) + 1;
        +		$db->debug= ($i==1);
        +		$id = $db->GetOne($sql,
        +			array('Z%','Z%',$x));
        +		if($id != $offset+$x) {
        +			print "

        Error at $x"; + break; + } + } +} + +include_once('../adodb.inc.php'); +$db = NewADOConnection('postgres7'); +$db->PConnect('localhost','tester','test','test') || die("failed connection"); + +$enc = "GIF89a%01%00%01%00%80%FF%00%C0%C0%C0%00%00%00%21%F9%04%01%00%00%00%00%2C%00%00%00%00%01%00%01%00%00%01%012%00%3Bt_clear.gif%0D"; +$val = rawurldecode($enc); + +$MAX = 1000; + +adodb_pr($db->ServerInfo()); + +echo "

        Testing PREPARE/EXECUTE PLAN

        "; + + +$db->_bindInputArray = true; // requires postgresql 7.3+ and ability to modify database +$t = getmicrotime(); +doloop(); +echo '

        ',$MAX,' times, with plan=',getmicrotime() - $t,'

        '; + + +$db->_bindInputArray = false; +$t = getmicrotime(); +doloop(); +echo '

        ',$MAX,' times, no plan=',getmicrotime() - $t,'

        '; + + + +echo "

        Testing UPDATEBLOB

        "; +$db->debug=1; + +### TEST BEGINS + +$db->Execute("insert into photos (id,name) values(9999,'dot.gif')"); +$db->UpdateBlob('photos','photo',$val,'id=9999'); +$v = $db->GetOne('select photo from photos where id=9999'); + + +### CLEANUP + +$db->Execute("delete from photos where id=9999"); + +### VALIDATION + +if ($v !== $val) echo "*** ERROR: Inserted value does not match downloaded val"; +else echo "*** OK: Passed"; + +echo "
        ";
        +echo "INSERTED: ", $enc;
        +echo "
        "; +echo"RETURNED: ", rawurlencode($v); +echo "

        "; +echo "INSERTED: ", $val; +echo "


        "; +echo "RETURNED: ", $v; + +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-php5.php b/fannie/adodb5/tests/test-php5.php new file mode 100644 index 000000000..689aeea78 --- /dev/null +++ b/fannie/adodb5/tests/test-php5.php @@ -0,0 +1,115 @@ +PHP ".PHP_VERSION."\n"; +try { + +$dbt = 'oci8po'; + +try { +switch($dbt) { +case 'oci8po': + $db = NewADOConnection("oci8po"); + + $db->Connect('localhost','scott','natsoft','sherkhan'); + break; +default: +case 'mysql': + $db = NewADOConnection("mysql"); + $db->Connect('localhost','root','','northwind'); + break; + +case 'mysqli': + $db = NewADOConnection("mysqli://root:@localhost/northwind"); + //$db->Connect('localhost','root','','test'); + break; +} +} catch (exception $e){ + echo "Connect Failed"; + adodb_pr($e); + die(); +} + +$db->debug=1; + +$cnt = $db->GetOne("select count(*) from adoxyz where ?Prepare("select * from adoxyz where ?ErrorMsg(),"\n"; +$rs = $db->Execute($stmt,array(10,20)); + +echo "
        Foreach Iterator Test (rand=".rand().")
        "; +$i = 0; +foreach($rs as $v) { + $i += 1; + echo "rec $i: "; $s1 = adodb_pr($v,true); $s2 = adodb_pr($rs->fields,true); + if ($s1 != $s2 && !empty($v)) {adodb_pr($s1); adodb_pr($s2);} + else echo "passed
        "; + flush(); +} + +$rs = new ADORecordSet_empty(); +foreach($rs as $v) { + echo "

        empty ";var_dump($v); +} + + +if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); +else echo "Count $i is correct
        "; + +$rs = $db->Execute("select bad from badder"); + +} catch (exception $e) { + adodb_pr($e); + echo "

        adodb_backtrace:

        \n"; + $e = adodb_backtrace($e->gettrace()); +} + +$rs = $db->Execute("select distinct id, firstname,lastname from adoxyz order by id"); +echo "Result=\n",$rs,"

        "; + +echo "

        Active Record

        "; + + include_once("../adodb-active-record.inc.php"); + ADOdb_Active_Record::SetDatabaseAdapter($db); + +try { + class City extends ADOdb_Active_Record{}; + $a = new City(); + +} catch(exception $e){ + echo $e->getMessage(); +} + +try { + + $a = new City(); + + echo "

        Successfully created City()
        "; + #var_dump($a->GetPrimaryKeys()); + $a->city = 'Kuala Lumpur'; + $a->Save(); + $a->Update(); + #$a->SetPrimaryKeys(array('city')); + $a->country = "M'sia"; + $a->save(); + $a->Delete(); +} catch(exception $e){ + echo $e->getMessage(); +} + +//include_once("test-active-record.php"); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test-xmlschema.php b/fannie/adodb5/tests/test-xmlschema.php new file mode 100644 index 000000000..2d15c111b --- /dev/null +++ b/fannie/adodb5/tests/test-xmlschema.php @@ -0,0 +1,54 @@ +Connect( 'localhost', 'root', '', 'test' ) || die('fail connect1'); + +// To create a schema object and build the query array. +$schema = new adoSchema( $db ); + +// To upgrade an existing schema object, use the following +// To upgrade an existing database to the provided schema, +// uncomment the following line: +#$schema->upgradeSchema(); + +print "SQL to build xmlschema.xml:\n

        ";
        +// Build the SQL array
        +$sql = $schema->ParseSchema( "xmlschema.xml" );
        +
        +var_dump( $sql );
        +print "
        \n"; + +// Execute the SQL on the database +//$result = $schema->ExecuteSchema( $sql ); + +// Finally, clean up after the XML parser +// (PHP won't do this for you!) +//$schema->Destroy(); + + + +print "SQL to build xmlschema-mssql.xml:\n
        ";
        +
        +$db2 = ADONewConnection('mssql');
        +$db2->Connect('','adodb','natsoft','northwind') || die("Fail 2");
        +
        +$db2->Execute("drop table simple_table");
        +
        +$schema = new adoSchema( $db2 );
        +$sql = $schema->ParseSchema( "xmlschema-mssql.xml" );
        +
        +print_r( $sql );
        +print "
        \n"; + +$db2->debug=1; + +foreach ($sql as $s) +$db2->Execute($s); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test.php b/fannie/adodb5/tests/test.php new file mode 100644 index 000000000..baa73a579 --- /dev/null +++ b/fannie/adodb5/tests/test.php @@ -0,0 +1,1748 @@ +$msg

        "; + flush(); +} + +function CheckWS($conn) +{ +global $ADODB_EXTENSION; + + include_once('../session/adodb-session.php'); + if (defined('CHECKWSFAIL')){ echo " TESTING $conn ";flush();} + $saved = $ADODB_EXTENSION; + $db = ADONewConnection($conn); + $ADODB_EXTENSION = $saved; + if (headers_sent()) { + print "

        White space detected in adodb-$conn.inc.php or include file...

        "; + //die(); + } +} + +function do_strtolower(&$arr) +{ + foreach($arr as $k => $v) { + if (is_object($v)) $arr[$k] = adodb_pr($v,true); + else $arr[$k] = strtolower($v); + } +} + + +function CountExecs($db, $sql, $inputarray) +{ +global $EXECS; $EXECS++; +} + +function CountCachedExecs($db, $secs2cache, $sql, $inputarray) +{ +global $CACHED; $CACHED++; +} + +// the table creation code is specific to the database, so we allow the user +// to define their own table creation stuff + +function testdb(&$db,$createtab="create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)") +{ +GLOBAL $ADODB_vers,$ADODB_CACHE_DIR,$ADODB_FETCH_MODE,$ADODB_COUNTRECS; + + //adodb_pr($db); + +?>
        +

        +
         
        +

        +Execute('select lastname,firstname,lastname,id from ADOXYZ'); + $arr = $rs->GetAssoc(); + echo "
        ";print_r($arr);
        +	die();*/
        +	
        +	if (!$db) die("testdb: database not inited");
        +	GLOBAL $EXECS, $CACHED;
        +	
        +	$EXECS = 0;
        +	$CACHED = 0;
        +	//$db->Execute("drop table adodb_logsql");
        +	if ((rand()%3) == 0) @$db->Execute("delete from adodb_logsql");
        +	$db->debug=1;
        +	
        +	$db->fnExecute = 'CountExecs';
        +	$db->fnCacheExecute = 'CountCachedExecs';
        +	
        +	if (empty($_GET['nolog'])) {
        +		echo "

        SQL Logging enabled

        "; + $db->LogSQL();/* + $sql = +"SELECT t1.sid, t1.sid, t1.title, t1.hometext, t1.notes, t1.aid, t1.informant, +t2.url, t2.email, t1.catid, t3.title, t1.topic, t4.topicname, t4.topicimage, +t4.topictext, t1.score, t1.ratings, t1.counter, t1.comments, t1.acomm +FROM `nuke_stories` `t1`, `nuke_authors` `t2`, `nuke_stories_cat` `t3`, `nuke_topics` `t4` + WHERE ((t2.aid=t1.aid) AND (t3.catid=t1.catid) AND (t4.topicid=t1.topic) + AND ((t1.alanguage='german') OR (t1.alanguage='')) AND (t1.ihome='0')) + ORDER BY t1.time DESC"; + $db->SelectLimit($sql); + echo $db->ErrorMsg();*/ + } + $ADODB_CACHE_DIR = dirname(TempNam('/tmp','testadodb')); + $db->debug = false; + //print $db->UnixTimeStamp('2003-7-22 23:00:00'); + + $phpv = phpversion(); + if (defined('ADODB_EXTENSION')) $ext = '   Extension '.ADODB_EXTENSION.' installed'; + else $ext = ''; + print "

        ADODB Version: $ADODB_vers Host: $db->host   Database: $db->database   PHP: $phpv $ext

        "; + + flush(); + + if (function_exists('date_default_timezone_set')) date_default_timezone_set('Asia/Kuala_Lumpur'); + + $arr = $db->ServerInfo(); + print_r($arr); + echo E_ALL,' ',E_STRICT, "
        "; + $e = error_reporting(E_ALL | E_STRICT); + echo error_reporting(),'

        '; + flush(); + #$db->debug=1; + $tt = $db->Time(); + if ($tt == 0) echo '
        $db->Time failed'; + else echo "
        db->Time: ".date('d-m-Y H:i:s',$tt); + echo '
        '; + + echo "Date=",$db->UserDate('2002-04-07'),'
        '; + print "date1 (1969-02-20) = ".$db->DBDate('1969-2-20'); + print "
        date1 (1999-02-20) = ".$db->DBDate('1999-2-20'); + print "
        date1.1 1999 = ".$db->DBDate("'1999'"); + print "
        date2 (1970-1-2) = ".$db->DBDate(24*3600)."

        "; + print "ts1 (1999-02-20 13:40:50) = ".$db->DBTimeStamp('1999-2-20 1:40:50 pm'); + print "
        ts1.1 (1999-02-20 13:40:00) = ".$db->DBTimeStamp('1999-2-20 13:40'); + print "
        ts2 (1999-02-20) = ".$db->DBTimeStamp('1999-2-20'); + print "
        ts3 (1970-1-2 +/- timezone) = ".$db->DBTimeStamp(24*3600); + print "
        Fractional TS (1999-2-20 13:40:50.91): ".$db->DBTimeStamp($db->UnixTimeStamp('1999-2-20 13:40:50.91+1')); + $dd = $db->UnixDate('1999-02-20'); + print "
        unixdate 1999-02-20 = ".date('Y-m-d',$dd)."

        "; + print "
        ts4 =".($db->UnixTimeStamp("19700101000101")+8*3600); + print "
        ts5 =".$db->DBTimeStamp($db->UnixTimeStamp("20040110092123")); + print "
        ts6 =".$db->UserTimeStamp("20040110092123"); + print "
        ts7 =".$db->DBTimeStamp("20040110092123"); + flush(); + // mssql too slow in failing bad connection + if (false && $db->databaseType != 'mssql') { + print "

        Testing bad connection. Ignore following error msgs:
        "; + $db2 = ADONewConnection(); + $rez = $db2->Connect("bad connection"); + $err = $db2->ErrorMsg(); + print "Error='$err'

        "; + if ($rez) print "Cannot check if connection failed. The Connect() function returned true.

        "; + } + #error_reporting($e); + flush(); + + //$ADODB_COUNTRECS=false; + $rs=$db->Execute('select * from ADOXYZ order by id'); + if($rs === false) $create = true; + else $rs->Close(); + + //if ($db->databaseType !='vfp') $db->Execute("drop table ADOXYZ"); + + if ($create) { + if (false && $db->databaseType == 'ibase') { + print "Please create the following table for testing:

        $createtab

        "; + return; + } else { + $db->debug = 99; + # $e = error_reporting(E_ALL-E_WARNING); + $db->Execute($createtab); + # error_reporting($e); + } + } + #error_reporting(E_ALL); + echo "

        Testing Metatypes

        "; + $t = $db->MetaType('varchar'); + if ($t != 'C') Err("Bad Metatype for varchar"); + + $rs = $db->Execute("delete from ADOXYZ"); // some ODBC drivers will fail the drop so we delete + if ($rs) { + if(! $rs->EOF) print "Error: RecordSet returned by Execute('delete...') should show EOF

        "; + $rs->Close(); + } else print "err=".$db->ErrorMsg(); + + print "

        Test select on empty table, FetchField when EOF, and GetInsertSQL

        "; + $rs = $db->Execute("select id,firstname from ADOXYZ where id=9999"); + if ($rs && !$rs->EOF) print "Error: RecordSet returned by Execute(select...') on empty table should show EOF

        "; + if ($rs->EOF && (($ox = $rs->FetchField(0)) && !empty($ox->name))) { + $record['id'] = 99; + $record['firstname'] = 'John'; + $sql = $db->GetInsertSQL($rs, $record); + if (strtoupper($sql) != strtoupper("INSERT INTO ADOXYZ ( id, firstname ) VALUES ( 99, 'John' )")) Err("GetInsertSQL does not work on empty table: $sql"); + } else { + Err("FetchField does not work on empty recordset, meaning GetInsertSQL will fail..."); + } + if ($rs) $rs->Close(); + flush(); + //$db->debug=true; + print "

        Testing Commit: "; + $time = $db->DBDate(time()); + if (!$db->BeginTrans()) { + print 'Transactions not supported

        '; + if ($db->hasTransactions) Err("hasTransactions should be false"); + } else { /* COMMIT */ + if (!$db->hasTransactions) Err("hasTransactions should be true"); + if ($db->transCnt != 1) Err("Invalid transCnt = $db->transCnt (should be 1)"); + $rs = $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (99,'Should Not','Exist (Commit)',$time)"); + if ($rs && $db->CommitTrans()) { + $rs->Close(); + $rs = $db->Execute("select * from ADOXYZ where id=99"); + if ($rs === false || $rs->EOF) { + print 'Data not saved

        '; + $rs = $db->Execute("select * from ADOXYZ where id=99"); + print_r($rs); + die(); + } else print 'OK

        '; + if ($rs) $rs->Close(); + } else { + if (!$rs) { + print "Insert failed

        "; + $db->RollbackTrans(); + } else print "Commit failed

        "; + } + if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)"); + + /* ROLLBACK */ + if (!$db->BeginTrans()) print "

        Error in BeginTrans()

        "; + print "

        Testing Rollback: "; + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (100,'Should Not','Exist (Rollback)',$time)"); + if ($db->RollbackTrans()) { + $rs = $db->Execute("select * from ADOXYZ where id=100"); + if ($rs && !$rs->EOF) print 'Fail: Data should rollback

        '; + else print 'OK

        '; + if ($rs) $rs->Close(); + } else + print "Commit failed

        "; + + $rs = $db->Execute('delete from ADOXYZ where id>50'); + if ($rs) $rs->Close(); + + if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)"); + } + + if (1) { + print "

        Testing MetaDatabases()

        "; + print_r( $db->MetaDatabases()); + + print "

        Testing MetaTables() and MetaColumns()

        "; + $a = $db->MetaTables(); + if ($a===false) print "MetaTables not supported

        "; + else { + print "Array of tables and views: "; + foreach($a as $v) print " ($v) "; + print '

        '; + } + + $a = $db->MetaTables('VIEW'); + if ($a===false) print "MetaTables not supported (views)

        "; + else { + print "Array of views: "; + foreach($a as $v) print " ($v) "; + print '

        '; + } + + $a = $db->MetaTables(false,false,'aDo%'); + if ($a===false) print "MetaTables not supported (mask)

        "; + else { + print "Array of ado%: "; + foreach($a as $v) print " ($v) "; + print '

        '; + } + + $a = $db->MetaTables('TABLE'); + if ($a===false) print "MetaTables not supported

        "; + else { + print "Array of tables: "; + foreach($a as $v) print " ($v) "; + print '

        '; + } + + $db->debug=0; + $rez = $db->MetaColumns("NOSUCHTABLEHERE"); + if ($rez !== false) { + Err("MetaColumns error handling failed"); + var_dump($rez); + } + $db->debug=1; + $a = $db->MetaColumns('ADOXYZ'); + if ($a===false) print "MetaColumns not supported

        "; + else { + print "

        Columns of ADOXYZ:
        "; + foreach($a as $v) {print_r($v); echo "
        ";} + echo "
        "; + } + + print "

        Testing MetaIndexes

        "; + + $a = $db->MetaIndexes(('ADOXYZ'),true); + if ($a===false) print "MetaIndexes not supported

        "; + else { + print "

        Indexes of ADOXYZ:
        "; + adodb_pr($a); + echo "
        "; + } + print "

        Testing MetaPrimaryKeys

        "; + $a = $db->MetaPrimaryKeys('ADOXYZ'); + var_dump($a); + } + $rs = $db->Execute('delete from ADOXYZ'); + if ($rs) $rs->Close(); + + $db->debug = false; + + + switch ($db->databaseType) { + case 'vfp': + + if (0) { + // memo test + $rs = $db->Execute("select data from memo"); + rs2html($rs); + } + break; + + case 'postgres7': + case 'postgres64': + case 'postgres': + case 'ibase': + print "

        Encode=".$db->BlobEncode("abc\0d\"' +ef")."

        ";//' + + print "

        Testing Foreign Keys

        "; + $arr = $db->MetaForeignKeys('ADOXYZ',false,true); + print_r($arr); + if (!$arr) Err("No MetaForeignKeys"); + break; + + case 'odbc_mssql': + case 'mssqlpo': + print "

        Testing Foreign Keys

        "; + $arr = $db->MetaForeignKeys('Orders',false,true); + print_r($arr); + if (!$arr) Err("Bad MetaForeignKeys"); + if ($db->databaseType == 'odbc_mssql') break; + + case 'mssql': + + +/* +ASSUME Northwind available... + +CREATE PROCEDURE SalesByCategory + @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998' +AS +IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' +BEGIN + SELECT @OrdYear = '1998' +END + +SELECT ProductName, + TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0) +FROM [Order Details] OD, Orders O, Products P, Categories C +WHERE OD.OrderID = O.OrderID + AND OD.ProductID = P.ProductID + AND P.CategoryID = C.CategoryID + AND C.CategoryName = @CategoryName + AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear +GROUP BY ProductName +ORDER BY ProductName +GO + + +CREATE PROCEDURE ADODBTestSP +@a nvarchar(25) +AS +SELECT GETDATE() AS T, @a AS A +GO +*/ + print "

        Testing Stored Procedures for mssql

        "; + $saved = $db->debug; + $db->debug=true; + $assoc = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $cmd = $db->PrepareSP('ADODBTestSP'); + $ss = "You should see me in the output."; + $db->InParameter($cmd,$ss,'a'); + $rs = $db->Execute($cmd); + #var_dump($rs->fields); + echo $rs->fields['T']." --- ".$rs->fields['A']."---
        "; + + $cat = 'Dairy Products'; + $yr = '1998'; + + $stmt = $db->PrepareSP('SalesByCategory'); + $db->InParameter($stmt,$cat,'CategoryName'); + $db->InParameter($stmt,$yr,'OrdYear'); + $rs = $db->Execute($stmt); + rs2html($rs); + + $cat = 'Grains/Cereals'; + $yr = 1998; + + $stmt = $db->PrepareSP('SalesByCategory'); + $db->InParameter($stmt,$cat,'CategoryName'); + $db->InParameter($stmt,$yr,'OrdYear'); + $rs = $db->Execute($stmt); + rs2html($rs); + + $ADODB_FETCH_MODE = $assoc; + + /* + Test out params - works in PHP 4.2.3 and 4.3.3 and 4.3.8 but not 4.3.0: + + CREATE PROCEDURE at_date_interval + @days INTEGER, + @start VARCHAR(20) OUT, + @end VARCHAR(20) OUT + AS + BEGIN + set @start = CONVERT(VARCHAR(20), getdate(), 101) + set @end =CONVERT(VARCHAR(20), dateadd(day, @days, getdate()), 101 ) + END + GO + */ + $db->debug=1; + $stmt = $db->PrepareSP('at_date_interval'); + $days = 10; + $begin_date = ''; + $end_date = ''; + $db->InParameter($stmt,$days,'days', 4, SQLINT4); + $db->OutParameter($stmt,$begin_date,'start', 20, SQLVARCHAR ); + $db->OutParameter($stmt,$end_date,'end', 20, SQLVARCHAR ); + $db->Execute($stmt); + if (empty($begin_date) or empty($end_date) or $begin_date == $end_date) { + Err("MSSQL SP Test for OUT Failed"); + print "begin=$begin_date end=$end_date

        "; + } else print "(Today +10days) = (begin=$begin_date end=$end_date)

        "; + + $db->debug = $saved; + break; + case 'oci8': + case 'oci8po': + + if (0) { + $t = getmicrotime(); + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $arr = $db->GetArray('select * from abalone_tree'); + $arr = $db->GetArray('select * from abalone_tree'); + $arr = $db->GetArray('select * from abalone_tree'); + echo "

        t = ",getmicrotime() - $t,"

        "; + die(); + } + + # cleanup + $db->Execute("delete from photos where id=99 or id=1"); + $db->Execute("insert into photos (id) values(1)"); + $db->Execute("update photos set photo=null,descclob=null where id=1"); + + $saved = $db->debug; + $db->debug=true; + + + + /* + CREATE TABLE PHOTOS + ( + ID NUMBER(16) primary key, + PHOTO BLOB, + DESCRIPTION VARCHAR2(4000 BYTE), + DESCCLOB CLOB + ); + + INSERT INTO PHOTOS (ID) VALUES(1); + */ + $s = ''; + for ($i = 0; $i <= 500; $i++) { + $s .= '1234567890'; + } + + $sql = "INSERT INTO photos ( ID, photo) ". + "VALUES ( :id, empty_blob() )". + " RETURNING photo INTO :xx"; + + + $blob_data = $s; + $id = 99; + + $stmt = $db->PrepareSP($sql); + $db->InParameter($stmt, $id, 'id'); + $blob = $db->InParameter($stmt, $s, 'xx',-1, OCI_B_BLOB); + $db->StartTrans(); + $result = $db->Execute($stmt); + $db->CompleteTrans(); + + $s2= $db->GetOne("select photo from photos where id=99"); + echo "
        ---$s2"; + if ($s !== $s2) Err("insert blob does not match"); + + print "

        Testing Blob: size=".strlen($s)."

        "; + $ok = $db->Updateblob('photos','photo',$s,'id=1'); + if (!$ok) Err("Blob failed 1"); + else { + $s2= $db->GetOne("select photo from photos where id=1"); + if ($s !== $s2) Err("updateblob does not match"); + } + + print "

        Testing Clob: size=".strlen($s)."

        "; + $ok = $db->UpdateClob('photos','descclob',$s,'id=1'); + if (!$ok) Err("Clob failed 1"); + else { + $s2= $db->GetOne("select descclob from photos where id=1"); + if ($s !== $s2) Err("updateclob does not match"); + } + + + $s = ''; + $s2 = ''; + print "

        Testing Foreign Keys

        "; + $arr = $db->MetaForeignKeys('emp','scott'); + print_r($arr); + if (!$arr) Err("Bad MetaForeignKeys"); +/* +-- TEST PACKAGE +-- "Set scan off" turns off substitution variables. +Set scan off; + +CREATE OR REPLACE PACKAGE Adodb AS +TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE; +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR); +PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) ; +PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR); +PROCEDURE data_in(input IN VARCHAR); +PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER); +END Adodb; +/ + + +CREATE OR REPLACE PACKAGE BODY Adodb AS +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS + BEGIN + OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames; + END open_tab; + + PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS + BEGIN + OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames; + tablenames := 'TEST'; + END open_tab2; + +PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS + BEGIN + output := 'Cinta Hati '||input; + END; + +PROCEDURE data_in(input IN VARCHAR) IS + ignore varchar(1000); + BEGIN + ignore := input; + END; + +PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER) AS +BEGIN +p2 := p1; +END; +END Adodb; +/ + +*/ + + print "

        Testing Cursor Variables

        "; + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:zz,'A%'); END;",'zz'); + + if ($rs && !$rs->EOF) { + $v = $db->GetOne("SELECT count(*) FROM tab where tname like 'A%'"); + if ($v == $rs->RecordCount()) print "Test 1 RowCount: OK

        "; + else Err("Test 1 RowCount ".$rs->RecordCount().", actual = $v"); + } else { + print "Error in using Cursor Variables 1

        "; + } + $rs->Close(); + + print "

        Testing Stored Procedures for oci8

        "; + + $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;"); + $a1 = 'Malaysia'; + //$a2 = ''; # a2 doesn't even need to be defined! + $db->InParameter($stmt,$a1,'a1'); + $db->OutParameter($stmt,$a2,'a2'); + $rs = $db->Execute($stmt); + if ($rs) { + if ($a2 !== 'Cinta Hati Malaysia') print "Stored Procedure Error: a2 = $a2

        "; + else echo "OK: a2=$a2

        "; + } else { + print "Error in using Stored Procedure IN/Out Variables

        "; + } + + $tname = 'A%'; + + $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); + $db->Parameter($stmt,$tname,'tablename'); + $rs = $db->Execute($stmt); + rs2html($rs); + + $stmt = $db->PrepareSP("begin adodb.data_in(:a1); end;"); + $db->InParameter($stmt,$a1,'a1'); + $db->Execute($stmt); + + $db->debug = $saved; + break; + + default: + break; + } + $arr = array( + array(1,'Caroline','Miranda'), + array(2,'John','Lim'), + array(3,'Wai Hun','See') + ); + //$db->debug=1; + print "

        Testing Bulk Insert of 3 rows

        "; + + $sql = "insert into ADOXYZ (id,firstname,lastname) values (".$db->Param('0').",".$db->Param('1').",".$db->Param('2').")"; + $db->StartTrans(); + $db->Execute($sql,$arr); + $db->CompleteTrans(); + $rs = $db->Execute('select * from ADOXYZ order by id'); + if (!$rs || $rs->RecordCount() != 3) Err("Bad bulk insert"); + + rs2html($rs); + + $db->Execute('delete from ADOXYZ'); + + print "

        Inserting 50 rows

        "; + + for ($i = 0; $i < 5; $i++) { + + $time = $db->DBDate(time()); + if (empty($_GET['hide'])) $db->debug = true; + switch($db->databaseType){ + case 'mssqlpo': + case 'mssql': + $sqlt = "CREATE TABLE mytable ( + row1 INT IDENTITY(1,1) NOT NULL, + row2 varchar(16), + PRIMARY KEY (row1))"; + //$db->debug=1; + if (!$db->Execute("delete from mytable")) + $db->Execute($sqlt); + + $ok = $db->Execute("insert into mytable (row2) values ('test')"); + $ins_id=$db->Insert_ID(); + echo "Insert ID=";var_dump($ins_id); + if ($ins_id == 0) Err("Bad Insert_ID()"); + $ins_id2 = $db->GetOne("select row1 from mytable"); + if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2"); + + $arr = array(0=>'Caroline',1=>'Miranda'); + $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)"; + break; + case 'mysqli': + case 'mysqlt': + case 'mysql': + $sqlt = "CREATE TABLE `mytable` ( + `row1` int(11) NOT NULL auto_increment, + `row2` varchar(16) NOT NULL default '', + PRIMARY KEY (`row1`), + KEY `myindex` (`row1`,`row2`) +) "; + if (!$db->Execute("delete from mytable")) + $db->Execute($sqlt); + + $ok = $db->Execute("insert into mytable (row2) values ('test')"); + $ins_id=$db->Insert_ID(); + echo "Insert ID=";var_dump($ins_id); + if ($ins_id == 0) Err("Bad Insert_ID()"); + $ins_id2 = $db->GetOne("select row1 from mytable"); + if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2"); + + default: + $arr = array(0=>'Caroline',1=>'Miranda'); + $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)"; + break; + + case 'oci8': + case 'oci805': + $arr = array('first'=>'Caroline','last'=>'Miranda'); + $amt = rand() % 100; + $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,:first,:last,$time)"; + break; + } + if ($i & 1) { + $sql = $db->Prepare($sql); + } + $rs = $db->Execute($sql,$arr); + + if ($rs === false) Err( 'Error inserting with parameters'); + else $rs->Close(); + $db->debug = false; + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+1,'John','Lim',$time)"); + /*$ins_id=$db->Insert_ID(); + echo "Insert ID=";var_dump($ins_id);*/ + if ($db->databaseType == 'mysql') if ($ins_id == 0) Err('Bad Insert_ID'); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+2,'Mary','Lamb',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+3,'George','Washington',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+4,'Mr. Alan','Tam',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+5,'Alan',".$db->quote("Turing'ton").",$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created)values ($i*10+6,'Serena','Williams',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+7,'Yat Sun','Sun',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+8,'Wai Hun','See',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+9,'Steven','Oey',$time )"); + } // for + if (1) { + $db->debug=1; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $cnt = $db->GetOne("select count(*) from ADOXYZ"); + $rs = $db->Execute('update ADOXYZ set id=id+1'); + if (!is_object($rs)) { + print_r($rs); + err("Update should return object"); + } + if (!$rs) err("Update generated error"); + + $nrows = $db->Affected_Rows(); + if ($nrows === false) print "

        Affected_Rows() not supported

        "; + else if ($nrows != $cnt) print "

        Affected_Rows() Error: $nrows returned (should be 50)

        "; + else print "

        Affected_Rows() passed

        "; + } + + if ($db->dataProvider == 'oci8') $array = array('zid'=>1,'zdate'=>date('Y-m-d',time())); + else $array=array(1,date('Y-m-d',time())); + + + #$array = array(1,date('Y-m-d',time())); + $id = $db->GetOne("select id from ADOXYZ + where id=".$db->Param('zid')." and created>=".$db->Param('ZDATE')."", + $array); + if ($id != 1) Err("Bad bind; id=$id"); + else echo "
        Bind date/integer 1 passed"; + + $array =array(1,$db->BindDate(time())); + $id = $db->GetOne("select id from ADOXYZ + where id=".$db->Param('0')." and created>=".$db->Param('1')."", + $array); + if ($id != 1) Err("Bad bind; id=$id"); + else echo "
        Bind date/integer 2 passed"; + + $db->debug = false; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + ////////////////////////////////////////////////////////////////////////////////////////// + + $rs = $db->Execute("select * from ADOXYZ where firstname = 'not known'"); + if (!$rs || !$rs->EOF) print "

        Error on empty recordset

        "; + else if ($rs->RecordCount() != 0) { + print "

        Error on RecordCount. Should be 0. Was ".$rs->RecordCount()."

        "; + print_r($rs->fields); + } + if ($db->databaseType !== 'odbc') { + $rs = $db->Execute("select id,firstname,lastname,created,".$db->random." from ADOXYZ order by id"); + if ($rs) { + if ($rs->RecordCount() != 50) { + print "

        RecordCount returns ".$rs->RecordCount().", should be 50

        "; + adodb_pr($rs->GetArray()); + $poc = $rs->PO_RecordCount('ADOXYZ'); + if ($poc == 50) print "

            PO_RecordCount passed

        "; + else print "

        PO_RecordCount returns wrong value: $poc

        "; + } else print "

        RecordCount() passed

        "; + if (isset($rs->fields['firstname'])) print '

        The fields columns can be indexed by column name.

        '; + else { + Err( '

        The fields columns cannot be indexed by column name.

        '); + print_r($rs->fields); + } + if (empty($_GET['hide'])) rs2html($rs); + } + else print "

        Error in Execute of SELECT with random

        "; + } + $val = $db->GetOne("select count(*) from ADOXYZ"); + if ($val == 50) print "

        GetOne returns ok

        "; + else print "

        Fail: GetOne returns $val

        "; + + echo "GetRow Test"; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $val1 = $db->GetRow("select count(*) from ADOXYZ"); + $val2 = $db->GetRow("select count(*) from ADOXYZ"); + if ($val1[0] == 50 and sizeof($val1) == 1 and $val2[0] == 50 and sizeof($val2) == 1) print "

        GetRow returns ok

        "; + else { + print_r($val); + print "

        Fail: GetRow returns {$val2[0]}

        "; + } + + print "

        FetchObject/FetchNextObject Test

        "; + $rs = $db->Execute('select * from ADOXYZ'); + if ($rs) { + if (empty($rs->connection)) print "Connection object missing from recordset
        "; + + while ($o = $rs->FetchNextObject()) { // calls FetchObject internally + if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) { + print_r($o); + print "

        Firstname is not string

        "; + break; + } + } + } else { + print "

        Failed rs

        "; + die("

        ADOXYZ table cannot be read - die()"); + } + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + print "

        FetchObject/FetchNextObject Test 2

        "; + #$db->debug=99; + $rs = $db->Execute('select * from ADOXYZ'); + if (empty($rs->connection)) print "Connection object missing from recordset
        "; + print_r($rs->fields); + while ($o = $rs->FetchNextObject()) { // calls FetchObject internally + if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) { + print_r($o); + print "

        Firstname is not string

        "; + break; + } + } + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $savefetch = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + print "

        CacheSelectLimit Test...

        "; + $db->debug=1; + $rs = $db->CacheSelectLimit('select id, firstname from ADOXYZ order by id',2); + + if ($rs && !$rs->EOF) { + if (isset($rs->fields[0])) { + Err("ASSOC has numeric fields"); + print_r($rs->fields); + } + if ($rs->fields['id'] != 1) {Err("Error"); print_r($rs->fields);}; + if (trim($rs->fields['firstname']) != 'Caroline') {print Err("Error 2"); print_r($rs->fields);}; + + $rs->MoveNext(); + if ($rs->fields['id'] != 2) {Err("Error 3"); print_r($rs->fields);}; + $rs->MoveNext(); + if (!$rs->EOF) { + Err("Error EOF"); + print_r($rs); + } + } + + print "

        FETCH_MODE = ASSOC: Should get 1, Caroline

        "; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',2); + if ($rs && !$rs->EOF) { + if (ADODB_ASSOC_CASE == 2) { + $id = 'ID'; + $fname = 'FIRSTNAME'; + }else { + $id = 'id'; + $fname = 'firstname'; + } + if ($rs->fields[$id] != 1) {Err("Error 1"); print_r($rs->fields);}; + if (trim($rs->fields[$fname]) != 'Caroline') {Err("Error 2"); print_r($rs->fields);}; + $rs->MoveNext(); + if ($rs->fields[$id] != 2) {Err("Error 3"); print_r($rs->fields);}; + $rs->MoveNext(); + if (!$rs->EOF) Err("Error EOF"); + else if (is_array($rs->fields) || $rs->fields) { + Err("Error: ## fields should be set to false on EOF"); + print_r($rs->fields); + } + } + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + print "

        FETCH_MODE = NUM: Should get 1, Caroline

        "; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1); + if ($rs && !$rs->EOF) { + if (isset($rs->fields['id'])) Err("FETCH_NUM has ASSOC fields"); + if ($rs->fields[0] != 1) {Err("Error 1"); print_r($rs->fields);}; + if (trim($rs->fields[1]) != 'Caroline') {Err("Error 2");print_r($rs->fields);}; + $rs->MoveNext(); + if (!$rs->EOF) Err("Error EOF"); + + } + $ADODB_FETCH_MODE = $savefetch; + + $db->debug = false; + print "

        GetRowAssoc Upper: Should get 1, Caroline

        "; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1); + if ($rs && !$rs->EOF) { + $arr = $rs->GetRowAssoc(); + if ($arr['ID'] != 1) {Err("Error 1");print_r($arr);}; + if (trim($arr['FIRSTNAME']) != 'Caroline') {Err("Error 2"); print_r($arr);}; + $rs->MoveNext(); + if (!$rs->EOF) Err("Error EOF"); + + } + print "

        GetRowAssoc Lower: Should get 1, Caroline

        "; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1); + if ($rs && !$rs->EOF) { + $arr = $rs->GetRowAssoc(false); + if ($arr['id'] != 1) {Err("Error 1"); print_r($arr);}; + if (trim($arr['firstname']) != 'Caroline') {Err("Error 2"); print_r($arr);}; + + } + + print "

        GetCol Test

        "; + $col = $db->GetCol('select distinct firstname from ADOXYZ order by 1'); + if (!is_array($col)) Err("Col size is wrong"); + if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong"); + + + $col = $db->CacheGetCol('select distinct firstname from ADOXYZ order by 1'); + if (!is_array($col)) Err("Col size is wrong"); + if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong"); + + $db->debug = true; + + + echo "

        Date Update Test

        "; + $zdate = date('Y-m-d',time()+3600*24); + $zdate = $db->DBDate($zdate); + $db->Execute("update ADOXYZ set created=$zdate where id=1"); + $row = $db->GetRow("select created,firstname from ADOXYZ where id=1"); + print_r($row); echo "
        "; + + + + print "

        SelectLimit Distinct Test 1: Should see Caroline, John and Mary

        "; + $rs = $db->SelectLimit('select distinct * from ADOXYZ order by id',3); + + + if ($rs && !$rs->EOF) { + if (trim($rs->fields[1]) != 'Caroline') Err("Error 1 (exp Caroline), ".$rs->fields[1]); + $rs->MoveNext(); + + if (trim($rs->fields[1]) != 'John') Err("Error 2 (exp John), ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'Mary') Err("Error 3 (exp Mary),".$rs->fields[1]); + $rs->MoveNext(); + if (! $rs->EOF) Err("Error EOF"); + //rs2html($rs); + } else Err("Failed SelectLimit Test 1"); + + print "

        SelectLimit Test 2: Should see Mary, George and Mr. Alan

        "; + $rs = $db->SelectLimit('select * from ADOXYZ order by id',3,2); + if ($rs && !$rs->EOF) { + if (trim($rs->fields[1]) != 'Mary') Err("Error 1 - No Mary, instead: ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'George')Err("Error 2 - No George, instead: ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'Mr. Alan') Err("Error 3 - No Mr. Alan, instead: ".$rs->fields[1]); + $rs->MoveNext(); + if (! $rs->EOF) Err("Error EOF"); + // rs2html($rs); + } + else Err("Failed SelectLimit Test 2 ". ($rs ? 'EOF':'no RS')); + + print "

        SelectLimit Test 3: Should see Wai Hun and Steven

        "; + $db->debug=1; + global $A; $A=1; + $rs = $db->SelectLimit('select * from ADOXYZ order by id',-1,48); + $A=0; + if ($rs && !$rs->EOF) { + if (empty($rs->connection)) print "Connection object missing from recordset
        "; + if (trim($rs->fields[1]) != 'Wai Hun') Err("Error 1 ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'Steven') Err("Error 2 ".$rs->fields[1]); + $rs->MoveNext(); + if (! $rs->EOF) { + Err("Error EOF"); + } + //rs2html($rs); + } + else Err("Failed SelectLimit Test 3"); + $db->debug = false; + + + $rs = $db->Execute("select * from ADOXYZ order by id"); + print "

        Testing Move()

        "; + if (!$rs)Err( "Failed Move SELECT"); + else { + if (!$rs->Move(2)) { + if (!$rs->canSeek) print "

        $db->databaseType: Move(), MoveFirst() nor MoveLast() not supported.

        "; + else print '

        RecordSet->canSeek property should be set to false

        '; + } else { + $rs->MoveFirst(); + if (trim($rs->Fields("firstname")) != 'Caroline') { + print "

        $db->databaseType: MoveFirst failed -- probably cannot scroll backwards

        "; + } + else print "MoveFirst() OK
        "; + + // Move(3) tests error handling -- MoveFirst should not move cursor + $rs->Move(3); + if (trim($rs->Fields("firstname")) != 'George') { + print '

        '.$rs->Fields("id")."$db->databaseType: Move(3) failed

        "; + } else print "Move(3) OK
        "; + + $rs->Move(7); + if (trim($rs->Fields("firstname")) != 'Yat Sun') { + print '

        '.$rs->Fields("id")."$db->databaseType: Move(7) failed

        "; + print_r($rs); + } else print "Move(7) OK
        "; + if ($rs->EOF) Err("Move(7) is EOF already"); + $rs->MoveLast(); + if (trim($rs->Fields("firstname")) != 'Steven'){ + print '

        '.$rs->Fields("id")."$db->databaseType: MoveLast() failed

        "; + print_r($rs); + }else print "MoveLast() OK
        "; + $rs->MoveNext(); + if (!$rs->EOF) err("Bad MoveNext"); + if ($rs->canSeek) { + $rs->Move(3); + if (trim($rs->Fields("firstname")) != 'George') { + print '

        '.$rs->Fields("id")."$db->databaseType: Move(3) after MoveLast failed

        "; + + } else print "Move(3) after MoveLast() OK
        "; + } + + print "

        Empty Move Test"; + $rs = $db->Execute("select * from ADOXYZ where id > 0 and id < 0"); + $rs->MoveFirst(); + if (!$rs->EOF || $rs->fields) Err("Error in empty move first"); + } + } + + $rs = $db->Execute('select * from ADOXYZ where id = 2'); + if ($rs->EOF || !is_array($rs->fields)) Err("Error in select"); + $rs->MoveNext(); + if (!$rs->EOF) Err("Error in EOF (xx) "); + // $db->debug=true; + print "

        Testing ADODB_FETCH_ASSOC and concat: concat firstname and lastname

        "; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($db->dataProvider == 'postgres') { + $sql = "select ".$db->Concat('cast(firstname as varchar)',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ"; + $rs = $db->Execute($sql); + } else { + $sql = "select distinct ".$db->Concat('firstname',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ"; + $rs = $db->Execute($sql); + } + if ($rs) { + if (empty($_GET['hide'])) rs2html($rs); + } else { + Err( "Failed Concat:".$sql); + } + $ADODB_FETCH_MODE = $save; + print "
        Testing GetArray() "; + //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + $rs = $db->Execute("select * from ADOXYZ order by id"); + if ($rs) { + $arr = $rs->GetArray(10); + if (sizeof($arr) != 10 || trim($arr[1][1]) != 'John' || trim($arr[1][2]) != 'Lim') print $arr[1][1].' '.$arr[1][2]."   ERROR
        "; + else print " OK
        "; + } + + $arr = $db->GetArray("select x from ADOXYZ"); + $e = $db->ErrorMsg(); $e2 = $db->ErrorNo(); + echo "Testing error handling, should see illegal column 'x' error=$e ($e2)
        "; + if (!$e || !$e2) Err("Error handling did not work"); + print "Testing FetchNextObject for 1 object "; + $rs = $db->Execute("select distinct lastname,firstname from ADOXYZ where firstname='Caroline'"); + $fcnt = 0; + if ($rs) + while ($o = $rs->FetchNextObject()) { + $fcnt += 1; + } + if ($fcnt == 1) print " OK
        "; + else print "FAILED
        "; + + $stmt = $db->Prepare("select * from ADOXYZ where id < 3"); + $rs = $db->Execute($stmt); + if (!$rs) Err("Prepare failed"); + else { + $arr = $rs->GetArray(); + if (!$arr) Err("Prepare failed 2"); + if (sizeof($arr) != 2) Err("Prepare failed 3"); + } + print "Testing GetAssoc() "; + $savecrecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + //$arr = $db->GetArray("select lastname,firstname from ADOXYZ"); + //print_r($arr); + print "
        "; + $rs = $db->Execute("select distinct lastname,firstname,created from ADOXYZ"); + + if ($rs) { + $arr = $rs->GetAssoc(); + //print_r($arr); + if (empty($arr['See']) || trim(reset($arr['See'])) != 'Wai Hun') print $arr['See']."   ERROR
        "; + else print " OK 1"; + } + + $arr = $db->GetAssoc("select distinct lastname,firstname from ADOXYZ"); + if ($arr) { + //print_r($arr); + if (empty($arr['See']) || trim($arr['See']) != 'Wai Hun') print $arr['See']."   ERROR
        "; + else print " OK 2
        "; + } + // Comment this out to test countrecs = false + $ADODB_COUNTRECS = $savecrecs; + $db->debug=1; + $query = $db->Prepare("select count(*) from ADOXYZ"); + $rs = $db->CacheExecute(10,$query); + if (reset($rs->fields) != 50) echo Err("$cnt wrong for Prepare/CacheGetOne"); + + for ($loop=0; $loop < 1; $loop++) { + print "Testing GetMenu() and CacheExecute
        "; + $db->debug = true; + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + + + + + if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu('menu','Steven').'
        '; + else print " Fail
        "; + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + + if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu('menu','Steven',false).'
        '; + else print " Fail
        "; + + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + + if ($rs) print ' 1st line set to **** , Steven selected: '. $rs->GetMenu('menu','Steven','1st:****').'
        '; + else print " Fail
        "; + + + + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) print ' Multiple, Alan selected: '. $rs->GetMenu('menu','Alan',false,true).'
        '; + else print " Fail
        "; + print '


        '; + + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) { + print ' Multiple, Alan and George selected: '. $rs->GetMenu('menu',array('Alan','George'),false,true); + if (empty($rs->connection)) print "Connection object missing from recordset
        "; + } else print " Fail
        "; + print '


        '; + + print "Testing GetMenu3()
        "; + $rs = $db->Execute("select ".$db->Concat('firstname',"'-'",'id').",id, lastname from ADOXYZ order by lastname,id"); + if ($rs) print "Grouped Menu: ".$rs->GetMenu3('name'); + else Err('Grouped Menu GetMenu3()'); + print "
        "; + + print "Testing GetMenu2()
        "; + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu2('menu',('Oey')).'
        '; + else print " Fail
        "; + $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu2('menu',('Oey'),false).'
        '; + else print " Fail
        "; + } + echo "

        CacheExecute

        "; + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ"); + print_r($rs->fields); echo $rs->fetchMode;echo "
        "; + echo $rs->Fields('firstname'); + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ"); + print_r($rs->fields);echo "
        "; + echo $rs->Fields('firstname'); + $db->debug = false; + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + // phplens + + $sql = 'select * from ADOXYZ where 0=1'; + echo "

        **Testing '$sql' (phplens compat 1)

        "; + $rs = $db->Execute($sql); + if (!$rs) err( "No recordset returned for '$sql'"); + if (!$rs->FieldCount()) err( "No fields returned for $sql"); + if (!$rs->FetchField(1)) err( "FetchField failed for $sql"); + + $sql = 'select * from ADOXYZ order by 1'; + echo "

        **Testing '$sql' (phplens compat 2)

        "; + $rs = $db->Execute($sql); + if (!$rs) err( "No recordset returned for '$sql'
        ".$db->ErrorMsg()."
        "); + + + $sql = 'select * from ADOXYZ order by 1,1'; + echo "

        **Testing '$sql' (phplens compat 3)

        "; + $rs = $db->Execute($sql); + if (!$rs) err( "No recordset returned for '$sql'
        ".$db->ErrorMsg()."
        "); + + + // Move + $rs1 = $db->Execute("select id from ADOXYZ where id <= 2 order by 1"); + $rs2 = $db->Execute("select id from ADOXYZ where id = 3 or id = 4 order by 1"); + + if ($rs1) $rs1->MoveLast(); + if ($rs2) $rs2->MoveLast(); + + if (empty($rs1) || empty($rs2) || $rs1->fields[0] != 2 || $rs2->fields[0] != 4) { + $a = $rs1->fields[0]; + $b = $rs2->fields[0]; + print "

        Error in multiple recordset test rs1=$a rs2=$b (should be rs1=2 rs2=4)

        "; + } else + print "

        Testing multiple recordsets OK

        "; + + + echo "

        GenID test: "; + for ($i=1; $i <= 10; $i++) + echo "($i: ",$val = $db->GenID($db->databaseType.'abcseq7' ,5), ") "; + if ($val == 0) Err("GenID not supported"); + + if ($val) { + $db->DropSequence('abc_seq2'); + $db->CreateSequence('abc_seq2'); + $val = $db->GenID('abc_seq2'); + $db->DropSequence('abc_seq2'); + $db->CreateSequence('abc_seq2'); + $val = $db->GenID('abc_seq2'); + if ($val != 1) Err("Drop and Create Sequence not supported ($val)"); + } + echo "

        "; + + if (substr($db->dataProvider,0,3) != 'notused') { // used to crash ado + $sql = "select firstnames from ADOXYZ"; + print "

        Testing execution of illegal statement: $sql

        "; + if ($db->Execute($sql) === false) { + print "

        This returns the following ErrorMsg(): ".$db->ErrorMsg()." and ErrorNo(): ".$db->ErrorNo().'

        '; + } else + print "

        Error in error handling -- Execute() should return false

        "; + } else + print "

        ADO skipped error handling of bad select statement

        "; + + print "

        ASSOC TEST 2
        "; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->query('select * from ADOXYZ order by id'); + if ($ee = $db->ErrorMsg()) { + Err("Error message=$ee"); + } + if ($ee = $db->ErrorNo()) { + Err("Error No = $ee"); + } + print_r($rs->fields); + for($i=0;$i<$rs->FieldCount();$i++) + { + $fld=$rs->FetchField($i); + print "
        Field name is ".$fld->name; + print " ".$rs->Fields($fld->name); + } + + + print "

        BOTH TEST 2
        "; + if ($db->dataProvider == 'ado') { + print "ADODB_FETCH_BOTH not supported for dataProvider=".$db->dataProvider."
        "; + } else { + $ADODB_FETCH_MODE = ADODB_FETCH_BOTH; + $rs = $db->query('select * from ADOXYZ order by id'); + for($i=0;$i<$rs->FieldCount();$i++) + { + $fld=$rs->FetchField($i); + print "
        Field name is ".$fld->name; + print " ".$rs->Fields($fld->name); + } + } + + print "

        NUM TEST 2
        "; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $db->query('select * from ADOXYZ order by id'); + for($i=0;$i<$rs->FieldCount();$i++) + { + $fld=$rs->FetchField($i); + print "
        Field name is ".$fld->name; + print " ".$rs->Fields($fld->name); + } + + print "

        ASSOC Test of SelectLimit
        "; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->selectlimit('select * from ADOXYZ order by id',3,4); + $cnt = 0; + while ($rs && !$rs->EOF) { + $cnt += 1; + if (!isset($rs->fields['firstname'])) { + print "
        ASSOC returned numeric field

        "; + break; + } + $rs->MoveNext(); + } + if ($cnt != 3) print "
        Count should be 3, instead it was $cnt

        "; + + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($db->sysDate) { + $saved = $db->debug; + $db->debug = 1; + $rs = $db->Execute("select {$db->sysDate} from ADOXYZ where id=1"); + if (ADORecordSet::UnixDate(date('Y-m-d')) != $rs->UnixDate($rs->fields[0])) { + print "

        Invalid date {$rs->fields[0]}

        "; + } else + print "

        Passed \$sysDate test ({$rs->fields[0]})

        "; + + print_r($rs->FetchField(0)); + print time(); + $db->debug=$saved; + } else { + print "

        \$db->sysDate not defined

        "; + } + + print "

        Test CSV

        "; + include_once('../toexport.inc.php'); + //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->SelectLimit('select id,firstname,lastname,created,\'He, he\' he,\'"\' q from ADOXYZ',10); + + print "
        ";
        +	print rs2csv($rs);
        +	print "
        "; + + $rs = $db->SelectLimit('select id,firstname,lastname,created,\'The "young man", he said\' from ADOXYZ',10); + + if (PHP_VERSION < 5) { + print "
        ";
        +		rs2tabout($rs);
        +		print "
        "; + } + #print " CacheFlush "; + #$db->CacheFlush(); + + $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A'); + $sql = "SELECT $date from ADOXYZ"; + print "

        Test SQLDate: ".htmlspecialchars($sql)."

        "; + $rs = $db->SelectLimit($sql,1); + $d = date('d-m-M-Y-').'Q'.(ceil(date('m')/3.0)).date(' h:i:s A'); + if (!$rs) Err("SQLDate query returned no recordset"); + else if ($d != $rs->fields[0]) Err("SQLDate 1 failed expected:
        act:$d
        sql:".$rs->fields[0]); + + $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A',$db->DBDate("1974-02-25")); + $sql = "SELECT $date from ADOXYZ"; + print "

        Test SQLDate: ".htmlspecialchars($sql)."

        "; + $db->debug=1; + $rs = $db->SelectLimit($sql,1); + $ts = ADOConnection::UnixDate('1974-02-25'); + $d = date('d-m-M-Y-',$ts).'Q'.(ceil(date('m',$ts)/3.0)).date(' h:i:s A',$ts); + if (!$rs) { + Err("SQLDate query returned no recordset"); + echo $db->ErrorMsg(),'
        '; + } else if ($d != reset($rs->fields)) { + Err("SQLDate 2 failed expected:
        act:$d
        sql:".$rs->fields[0].'
        '.$db->ErrorMsg()); + } + + + print "

        Test Filter

        "; + $db->debug = 1; + + $rs = $db->SelectLimit('select * from ADOXYZ where id < 3 order by id'); + + $rs = RSFilter($rs,'do_strtolower'); + if (trim($rs->fields[1]) != 'caroline' && trim($rs->fields[2]) != 'miranda') { + err('**** RSFilter failed'); + print_r($rs->fields); + } + + rs2html($rs); + + $db->debug=1; + + + print "

        Test Replace

        "; + + $ret = $db->Replace('ADOXYZ', + array('id'=>1,'firstname'=>'Caroline','lastname'=>'Miranda'), + array('id'), + $autoq = true); + if (!$ret) echo "

        Error in replacing existing record

        "; + else { + $saved = $db->debug; + $db->debug = 0; + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = true; + $rs = $db->Execute('select * FROM ADOXYZ where id=1'); + $db->debug = $saved; + if ($rs->RecordCount() != 1) { + $cnt = $rs->RecordCount(); + rs2html($rs); + print "Error - Replace failed, count=$cnt

        "; + } + $ADODB_COUNTRECS = $savec; + } + $ret = $db->Replace('ADOXYZ', + array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'), + array('id','firstname'), + $autoq = true); + if ($ret != 2) print "Replace failed: "; + print "test A return value=$ret (2 expected)

        "; + + $ret = $db->Replace('ADOXYZ', + array('id'=>1000,'firstname'=>'Sherazade','lastname'=>'Al-Rashid'), + 'id', + $autoq = true); + if ($ret != 1) + if ($db->dataProvider == 'ibase' && $ret == 2); + else print "Replace failed: "; + print "test B return value=$ret (1 or if ibase then 2 expected)

        "; + + print "

        rs2rs Test

        "; + + $rs = $db->Execute('select * from ADOXYZ where id>= 1 order by id'); + $rs = $db->_rs2rs($rs); + $rs->valueX = 'X'; + $rs->MoveNext(); + $rs = $db->_rs2rs($rs); + if (!isset($rs->valueX)) err("rs2rs does not preserve array recordsets"); + if (reset($rs->fields) != 1) err("rs2rs does not move to first row: id=".reset($rs->fields)); + + ///////////////////////////////////////////////////////////// + include_once('../pivottable.inc.php'); + print "

        Pivot Test

        "; + $db->debug=true; + $sql = PivotTableSQL( + $db, # adodb connection + 'ADOXYZ', # tables + 'firstname', # row fields + 'lastname', # column fields + false, # join + 'ID', # sum + 'Sum ', # label for sum + 'sum', # aggregate function + true + ); + $rs = $db->Execute($sql); + if ($rs) rs2html($rs); + else Err("Pivot sql error"); + + $pear = false; //true; + $db->debug=false; + + if ($pear) { + // PEAR TESTS BELOW + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + include_once "PEAR.php"; + $rs = $db->query('select * from ADOXYZ where id>0 and id<10 order by id'); + + $i = 0; + if ($rs && !$rs->EOF) { + while ($arr = $rs->fetchRow()) { + $i++; + //print "$i "; + if ($arr[0] != $i) { + print_r($arr); + print "

        PEAR DB emulation error 1.

        "; + $pear = false; + break; + } + } + $rs->Close(); + } + + + if ($i != $db->GetOne('select count(*) from ADOXYZ where id>0 and id<10')) { + print "

        PEAR DB emulation error 1.1 EOF ($i)

        "; + $pear = false; + } + + $rs = $db->limitQuery('select * from ADOXYZ where id>0 order by id',$i=3,$top=3); + $i2 = $i; + if ($rs && !$rs->EOF) { + + while (!is_object($rs->fetchInto($arr))) { + $i2++; + + // print_r($arr); + // print "$i ";print_r($arr); + if ($arr[0] != $i2) { + print "

        PEAR DB emulation error 2.

        "; + $pear = false; + break; + } + } + $rs->Close(); + } + if ($i2 != $i+$top) { + print "

        PEAR DB emulation error 2.1 EOF (correct=$i+$top, actual=$i2)

        "; + $pear = false; + } + } + if ($pear) print "

        PEAR DB emulation passed.

        "; + flush(); + + + $rs = $db->SelectLimit("select ".$db->sysDate." from ADOXYZ",1); + $date = $rs->fields[0]; + if (!$date) Err("Bad sysDate"); + else { + $ds = $db->UserDate($date,"d m Y"); + if ($ds != date("d m Y")) Err("Bad UserDate: ".$ds.' expected='.date("d m Y")); + else echo "Passed UserDate: $ds

        "; + } + $db->debug=1; + if ($db->dataProvider == 'oci8') + $rs = $db->SelectLimit("select to_char(".$db->sysTimeStamp.",'YYYY-MM-DD HH24:MI:SS') from ADOXYZ",1); + else + $rs = $db->SelectLimit("select ".$db->sysTimeStamp." from ADOXYZ",1); + $date = $rs->fields[0]; + if (!$date) Err("Bad sysTimeStamp"); + else { + $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y"); + if ($ds != date("H \\h\\r\\s-d m Y")) Err("Bad UserTimeStamp: ".$ds.", correct is ".date("H \\h\\r\\s-d m Y")); + else echo "Passed UserTimeStamp: $ds

        "; + + $date = 100; + $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y"); + $ds2 = date("H \\h\\r\\s-d m Y",$date); + if ($ds != $ds2) Err("Bad UserTimeStamp 2: $ds: $ds2"); + else echo "Passed UserTimeStamp 2: $ds

        "; + } + flush(); + + if ($db->hasTransactions) { + $db->debug=1; + echo "

        Testing StartTrans CompleteTrans

        "; + $db->raiseErrorFn = false; + + $db->SetTransactionMode('SERIALIZABLE'); + $db->StartTrans(); + $rs = $db->Execute('select * from notable'); + $db->StartTrans(); + $db->BeginTrans(); + $db->Execute("update ADOXYZ set firstname='Carolx' where id=1"); + $db->CommitTrans(); + $db->CompleteTrans(); + $rez = $db->CompleteTrans(); + $db->SetTransactionMode(''); + $db->debug=0; + if ($rez !== false) { + if (is_null($rez)) Err("Error: _transOK not modified"); + else Err("Error: CompleteTrans (1) should have failed"); + } else { + $name = $db->GetOne("Select firstname from ADOXYZ where id=1"); + if ($name == "Carolx") Err("Error: CompleteTrans (2) should have failed"); + else echo "

        -- Passed StartTrans test1 - rolling back

        "; + } + + $db->StartTrans(); + $db->BeginTrans(); + $db->Execute("update ADOXYZ set firstname='Carolx' where id=1"); + $db->RollbackTrans(); + $rez = $db->CompleteTrans(); + if ($rez !== true) Err("Error: CompleteTrans (1) should have succeeded"); + else { + $name = $db->GetOne("Select firstname from ADOXYZ where id=1"); + if (trim($name) != "Carolx") Err("Error: CompleteTrans (2) should have succeeded, returned name=$name"); + else echo "

        -- Passed StartTrans test2 - commiting

        "; + } + } + flush(); + $saved = $db->debug; + $db->debug=1; + $cnt = _adodb_getcount($db, 'select * from ADOXYZ where firstname in (select firstname from ADOXYZ)'); + echo "Count= $cnt"; + $db->debug=$saved; + + global $TESTERRS; + $debugerr = true; + + global $ADODB_LANG;$ADODB_LANG = 'fr'; + $db->debug = false; + $TESTERRS = 0; + $db->raiseErrorFn = 'adodb_test_err'; + global $ERRNO; // from adodb_test_err + $db->Execute('select * from nowhere'); + $metae = $db->MetaError($ERRNO); + if ($metae !== DB_ERROR_NOSUCHTABLE) print "

        MetaError=".$metae." wrong, should be ".DB_ERROR_NOSUCHTABLE."

        "; + else print "

        MetaError ok (".DB_ERROR_NOSUCHTABLE."): ".$db->MetaErrorMsg($metae)."

        "; + if ($TESTERRS != 1) print "raiseErrorFn select nowhere failed
        "; + $rs = $db->Execute('select * from ADOXYZ'); + if ($debugerr) print " Move"; + $rs->Move(100); + $rs->_queryID = false; + if ($debugerr) print " MoveNext"; + $rs->MoveNext(); + if ($debugerr) print " $rs=false"; + $rs = false; + + flush(); + + print "

        SetFetchMode() tests

        "; + $db->SetFetchMode(ADODB_FETCH_ASSOC); + $rs = $db->SelectLimit('select firstname from ADOXYZ',1); + if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC"); + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $db->SelectLimit('select firstname from ADOXYZ',1); + //var_dump($rs->fields); + if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC"); + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $db->SetFetchMode(ADODB_FETCH_NUM); + $rs = $db->SelectLimit('select firstname from ADOXYZ',1); + if (!isset($rs->fields[0])) Err("BAD FETCH NUM"); + + flush(); + + print "

        Test MetaTables again with SetFetchMode()

        "; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $db->SetFetchMode(ADODB_FETCH_ASSOC); + print_r($db->MetaTables()); + print "

        "; + + //////////////////////////////////////////////////////////////////// + + print "

        Testing Bad Connection

        "; + flush(); + + if (true || PHP_VERSION < 5) { + if ($db->dataProvider == 'odbtp') $db->databaseType = 'odbtp'; + $conn = NewADOConnection($db->databaseType); + $conn->raiseErrorFn = 'adodb_test_err'; + if (1) $conn->PConnect('abc','baduser','badpassword'); + if ($TESTERRS == 2) print "raiseErrorFn tests passed
        "; + else print "raiseErrorFn tests failed ($TESTERRS)
        "; + + flush(); + } + //////////////////////////////////////////////////////////////////// + + global $nocountrecs; + + if (isset($nocountrecs) && $ADODB_COUNTRECS) err("Error: \$ADODB_COUNTRECS is set"); + if (empty($nocountrecs) && $ADODB_COUNTRECS==false) err("Error: \$ADODB_COUNTRECS is not set"); + + flush(); +?> +

        +
         
        +

        +Close(); + if ($rs2) $rs2->Close(); + if ($rs) $rs->Close(); + $db->Close(); + + if ($db->transCnt != 0) Err("Error in transCnt=$db->transCnt (should be 0)"); + + + printf("

        Total queries=%d; total cached=%d

        ",$EXECS+$CACHED, $CACHED); + flush(); +} + +function adodb_test_err($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false) +{ +global $TESTERRS,$ERRNO; + + $ERRNO = $errno; + $TESTERRS += 1; + print "** $dbms ($fn): errno=$errno   errmsg=$errmsg ($p1,$p2)
        "; +} + +//-------------------------------------------------------------------------------------- + + +@set_time_limit(240); // increase timeout + +include("../tohtml.inc.php"); +include("../adodb.inc.php"); +include("../rsfilter.inc.php"); + +/* White Space Check */ + +if (isset($_SERVER['argv'][1])) { + //print_r($_SERVER['argv']); + $_GET[$_SERVER['argv'][1]] = 1; +} + +if (@$_SERVER['COMPUTERNAME'] == 'TIGRESS') { + CheckWS('mysqlt'); + CheckWS('postgres'); + CheckWS('oci8po'); + + CheckWS('firebird'); + CheckWS('sybase'); + if (!ini_get('safe_mode')) CheckWS('informix'); + + CheckWS('ado_mssql'); + CheckWS('ado_access'); + CheckWS('mssql'); + + CheckWS('vfp'); + CheckWS('sqlanywhere'); + CheckWS('db2'); + CheckWS('access'); + CheckWS('odbc_mssql'); + CheckWS('firebird15'); + // + CheckWS('oracle'); + CheckWS('proxy'); + CheckWS('fbsql'); + print "White Space Check complete

        "; +} +if (sizeof($_GET) == 0) $testmysql = true; + + +foreach($_GET as $k=>$v) { + //global $$k; + $$k = $v; +} + +?> + +ADODB Testing + +

        ADODB Test

        + +This script tests the following databases: Interbase, Oracle, Visual FoxPro, Microsoft Access (ODBC and ADO), MySQL, MSSQL (ODBC, native, ADO). +There is also support for Sybase, PostgreSQL.

        +For the latest version of ADODB, visit
        adodb.sourceforge.net.

        + +Test GetInsertSQL/GetUpdateSQL   + Sessions   + Paging   + Perf Monitor

        +vers=",ADOConnection::Version(); + + + +?> +

        ADODB Database Library (c) 2000-2009 John Lim. All rights reserved. Released under BSD and LGPL, PHP .

        + + diff --git a/fannie/adodb5/tests/test2.php b/fannie/adodb5/tests/test2.php new file mode 100644 index 000000000..ff9e969b3 --- /dev/null +++ b/fannie/adodb5/tests/test2.php @@ -0,0 +1,26 @@ +debug=1; + $access = 'd:\inetpub\wwwroot\php\NWIND.MDB'; + $myDSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;' + . 'DATA SOURCE=' . $access . ';'; + + echo "

        PHP ",PHP_VERSION,"

        "; + + $db->Connect($myDSN) || die('fail'); + + print_r($db->ServerInfo()); + + try { + $rs = $db->Execute("select $db->sysTimeStamp,* from adoxyz where id>02xx"); + print_r($rs->fields); + } catch(exception $e) { + print_r($e); + echo "

        Date m/d/Y =",$db->UserDate($rs->fields[4],'m/d/Y'); + } +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test3.php b/fannie/adodb5/tests/test3.php new file mode 100644 index 000000000..3269c17f8 --- /dev/null +++ b/fannie/adodb5/tests/test3.php @@ -0,0 +1,44 @@ +Connect('','scott','natsoft'); +$db->debug=1; + +$cnt = $db->GetOne("select count(*) from adoxyz"); +$rs = $db->Execute("select * from adoxyz order by id"); + +$i = 0; +foreach($rs as $k => $v) { + $i += 1; + echo $k; adodb_pr($v); + flush(); +} + +if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); + + + +$rs = $db->Execute("select bad from badder"); + +} catch (exception $e) { + adodb_pr($e); + $e = adodb_backtrace($e->trace); +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test4.php b/fannie/adodb5/tests/test4.php new file mode 100644 index 000000000..d377f84a7 --- /dev/null +++ b/fannie/adodb5/tests/test4.php @@ -0,0 +1,143 @@ +PConnect("", "sa", "natsoft", "northwind"); // connect to MySQL, testdb + +$conn = ADONewConnection("mysql"); // create a connection +$conn->PConnect("localhost", "root", "", "test"); // connect to MySQL, testdb + + +#$conn = ADONewConnection('oci8po'); +#$conn->Connect('','scott','natsoft'); + +if (PHP_VERSION >= 5) { + $connstr = "mysql:dbname=northwind"; + $u = 'root';$p=''; + $conn = ADONewConnection('pdo'); + $conn->Connect($connstr, $u, $p); +} +//$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + +$conn->debug=1; +$conn->Execute("delete from adoxyz where lastname like 'Smi%'"); + +$rs = $conn->Execute($sql); // Execute the query and get the empty recordset +$record = array(); // Initialize an array to hold the record data to insert + +if (strpos($conn->databaseType,'mysql')===false) $record['id'] = 751; +$record["firstname"] = 'Jann'; +$record["lastname"] = "Smitts"; +$record["created"] = time(); + +$insertSQL = $conn->GetInsertSQL($rs, $record); +$conn->Execute($insertSQL); // Insert the record into the database + +if (strpos($conn->databaseType,'mysql')===false) $record['id'] = 752; +// Set the values for the fields in the record +$record["firstname"] = 'anull'; +$record["lastname"] = "Smith\$@//"; +$record["created"] = time(); + +if (isset($_GET['f'])) $ADODB_FORCE_TYPE = $_GET['f']; + +//$record["id"] = -1; + +// Pass the empty recordset and the array containing the data to insert +// into the GetInsertSQL function. The function will process the data and return +// a fully formatted insert sql statement. +$insertSQL = $conn->GetInsertSQL($rs, $record); +$conn->Execute($insertSQL); // Insert the record into the database + + + +$insertSQL2 = $conn->GetInsertSQL($table='ADOXYZ', $record); +if ($insertSQL != $insertSQL2) echo "

        Walt's new stuff failed: $insertSQL2

        "; +//========================== +// This code tests an update + +$sql = " +SELECT * +FROM ADOXYZ WHERE lastname=".$conn->Param('var'). " ORDER BY 1"; +// Select a record to update + +$varr = array('var'=>$record['lastname'].''); +$rs = $conn->Execute($sql,$varr); // Execute the query and get the existing record to update +if (!$rs || $rs->EOF) print "

        No record found!

        "; + +$record = array(); // Initialize an array to hold the record data to update + + +// Set the values for the fields in the record +$record["firstName"] = "Caroline".rand(); +//$record["lasTname"] = ""; // Update Caroline's lastname from Miranda to Smith +$record["creAted"] = '2002-12-'.(rand()%30+1); +$record['num'] = ''; +// Pass the single record recordset and the array containing the data to update +// into the GetUpdateSQL function. The function will process the data and return +// a fully formatted update sql statement. +// If the data has not changed, no recordset is returned + +$updateSQL = $conn->GetUpdateSQL($rs, $record); +$conn->Execute($updateSQL,$varr); // Update the record in the database +if ($conn->Affected_Rows() != 1)print "

        Error1 : Rows Affected=".$conn->Affected_Rows().", should be 1

        "; + +$record["firstName"] = "Caroline".rand(); +$record["lasTname"] = "Smithy Jones"; // Update Caroline's lastname from Miranda to Smith +$record["creAted"] = '2002-12-'.(rand()%30+1); +$record['num'] = 331; +$updateSQL = $conn->GetUpdateSQL($rs, $record); +$conn->Execute($updateSQL,$varr); // Update the record in the database +if ($conn->Affected_Rows() != 1)print "

        Error 2: Rows Affected=".$conn->Affected_Rows().", should be 1

        "; + +$rs = $conn->Execute("select * from ADOXYZ where lastname like 'Sm%'"); +//adodb_pr($rs); +rs2html($rs); + +$record["firstName"] = "Carol-new-".rand(); +$record["lasTname"] = "Smithy"; // Update Caroline's lastname from Miranda to Smith +$record["creAted"] = '2002-12-'.(rand()%30+1); +$record['num'] = 331; + +$conn->AutoExecute('ADOXYZ',$record,'UPDATE', "lastname like 'Sm%'"); +$rs = $conn->Execute("select * from ADOXYZ where lastname like 'Sm%'"); +//adodb_pr($rs); +rs2html($rs); +} + + +testsql(); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/test5.php b/fannie/adodb5/tests/test5.php new file mode 100644 index 000000000..cc9b7a6a6 --- /dev/null +++ b/fannie/adodb5/tests/test5.php @@ -0,0 +1,47 @@ +debug=1; + $conn->PConnect("localhost","root","","xphplens"); + print $conn->databaseType.':'.$conn->GenID().'
        '; +} + +if (0) { + $conn = ADONewConnection("oci8"); // create a connection + $conn->debug=1; + $conn->PConnect("falcon", "scott", "tiger", "juris8.ecosystem.natsoft.com.my"); // connect to MySQL, testdb + print $conn->databaseType.':'.$conn->GenID(); +} + +if (0) { + $conn = ADONewConnection("ibase"); // create a connection + $conn->debug=1; + $conn->Connect("localhost:c:\\Interbase\\Examples\\Database\\employee.gdb", "sysdba", "masterkey", ""); // connect to MySQL, testdb + print $conn->databaseType.':'.$conn->GenID().'
        '; +} + +if (0) { + $conn = ADONewConnection('postgres'); + $conn->debug=1; + @$conn->PConnect("susetikus","tester","test","test"); + print $conn->databaseType.':'.$conn->GenID().'
        '; +} +?> diff --git a/fannie/adodb5/tests/test_rs_array.php b/fannie/adodb5/tests/test_rs_array.php new file mode 100644 index 000000000..1de37b223 --- /dev/null +++ b/fannie/adodb5/tests/test_rs_array.php @@ -0,0 +1,47 @@ +InitArray($array,$typearr); + +while (!$rs->EOF) { + print_r($rs->fields);echo "
        "; + $rs->MoveNext(); +} + +echo "
        1 Seek
        "; +$rs->Move(1); +while (!$rs->EOF) { + print_r($rs->fields);echo "
        "; + $rs->MoveNext(); +} + +echo "
        2 Seek
        "; +$rs->Move(2); +while (!$rs->EOF) { + print_r($rs->fields);echo "
        "; + $rs->MoveNext(); +} + +echo "
        3 Seek
        "; +$rs->Move(3); +while (!$rs->EOF) { + print_r($rs->fields);echo "
        "; + $rs->MoveNext(); +} + + + +die(); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testcache.php b/fannie/adodb5/tests/testcache.php new file mode 100644 index 000000000..6a8ac4a26 --- /dev/null +++ b/fannie/adodb5/tests/testcache.php @@ -0,0 +1,29 @@ + + +PConnect('nwind'); +} else { + $db = ADONewConnection('mysql'); + $db->PConnect('mangrove','root','','xphplens'); +} +if (isset($cache)) $rs = $db->CacheExecute(120,'select * from products'); +else $rs = $db->Execute('select * from products'); + +$arr = $rs->GetArray(); +print sizeof($arr); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testdatabases.inc.php b/fannie/adodb5/tests/testdatabases.inc.php new file mode 100644 index 000000000..473a06f3c --- /dev/null +++ b/fannie/adodb5/tests/testdatabases.inc.php @@ -0,0 +1,452 @@ + + +
        +
        +> Access
        +> Interbase
        +> MSSQL
        + > MySQL
        +> MySQL ODBC
        +> MySQLi +
        +
        > SQLite
        +> MySQL Proxy
        +> Oracle (oci8)
        +> PostgreSQL
        +> PostgreSQL ODBC
        +
        +> PgSQL PDO
        +> MySQL PDO
        +> SQLite PDO
        +> Access PDO
        +> MSSQL PDO
        + +> OCI PDO
        + +
        > DB2
        +> VFP+ODBTP
        +> ADO (for mssql and access)
        +> $ADODB_COUNTRECS=false
        +> No SQL Logging
        +> ADOdb time test +
        + + + +FETCH MODE IS NOT ADODB_FETCH_DEFAULT"; + +if (isset($nocountrecs)) $ADODB_COUNTRECS = false; + +// cannot test databases below, but we include them anyway to check +// if they parse ok... + +if (sizeof($_GET) || !isset($_SERVER['HTTP_HOST'])) { + echo "
        "; + ADOLoadCode2("sybase"); + ADOLoadCode2("postgres"); + ADOLoadCode2("postgres7"); + ADOLoadCode2("firebird"); + ADOLoadCode2("borland_ibase"); + ADOLoadCode2("informix"); + ADOLoadCode2("sqlanywhere"); + ADOLoadCode2('mysqli'); + ADOLoadCode2("access"); + ADOLoadCode2("mysql"); + ADOLoadCode2("oci8"); +} + +function ADOLoadCode2($d) +{ + ADOLoadCode($d); + $c = ADONewConnection($d); + echo "Loaded $d ",($c ? 'ok' : 'extension not installed'),"
        "; +} + +flush(); +if (!empty($testpostgres)) { + //ADOLoadCode("postgres"); + + $db = ADONewConnection('postgres'); + print "

        Connecting $db->databaseType...

        "; + if ($db->Connect("localhost","tester","test","test")) { + testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname varchar,created date)"); + }else + print "ERROR: PostgreSQL requires a database called test on server, user tester, password test.
        ".$db->ErrorMsg(); +} + +if (!empty($testpgodbc)) { + + $db = ADONewConnection('odbc'); + $db->hasTransactions = false; + print "

        Connecting $db->databaseType...

        "; + + if ($db->PConnect('Postgresql')) { + $db->hasTransactions = true; + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) type=innodb"); + } else print "ERROR: PostgreSQL requires a database called test on server, user tester, password test.
        ".$db->ErrorMsg(); +} + +if (!empty($testibase)) { + //$_GET['nolog'] = true; + $db = ADONewConnection('firebird'); + print "

        Connecting $db->databaseType...

        "; + if ($db->PConnect("localhost:d:\\firebird\\151\\examples\\EMPLOYEE.fdb", "sysdba", "masterkey", "")) + testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname char(24),price numeric(12,2),created date)"); + else print "ERROR: Interbase test requires a database called employee.gdb".'
        '.$db->ErrorMsg(); + +} + + +if (!empty($testsqlite)) { + $path =urlencode('d:\inetpub\adodb\sqlite.db'); + $dsn = "sqlite://$path/"; + $db = ADONewConnection($dsn); + //echo $dsn; + + //$db = ADONewConnection('sqlite'); + + + if ($db && $db->PConnect("d:\\inetpub\\adodb\\sqlite.db", "", "", "")) { + print "

        Connecting $db->databaseType...

        "; + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + } else + print "ERROR: SQLite"; + +} + +if (!empty($testpdopgsql)) { + $connstr = "pgsql:dbname=test"; + $u = 'tester';$p='test'; + $db = ADONewConnection('pdo'); + print "

        Connecting $db->databaseType...

        "; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdomysql)) { + $connstr = "mysql:dbname=northwind"; + $u = 'root';$p=''; + $db = ADONewConnection('pdo'); + print "

        Connecting $db->databaseType...

        "; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdomssql)) { + $connstr = "mssql:dbname=northwind"; + $u = 'sa';$p='natsoft'; + $db = ADONewConnection('pdo'); + print "

        Connecting $db->databaseType...

        "; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdosqlite)) { + $connstr = "sqlite:d:/inetpub/adodb/sqlite-pdo.db3"; + $u = '';$p=''; + $db = ADONewConnection('pdo'); + $db->hasTransactions = false; + print "

        Connecting $db->databaseType...

        "; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdoaccess)) { + $connstr = 'odbc:nwind'; + $u = '';$p=''; + $db = ADONewConnection('pdo'); + $db->hasTransactions = false; + print "

        Connecting $db->databaseType...

        "; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdoora)) { + $connstr = 'oci:'; + $u = 'scott';$p='natsoft'; + $db = ADONewConnection('pdo'); + #$db->hasTransactions = false; + print "

        Connecting $db->databaseType...

        "; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +// REQUIRES ODBC DSN CALLED nwind +if (!empty($testaccess)) { + $db = ADONewConnection('access'); + print "

        Connecting $db->databaseType...

        "; + $access = 'd:\inetpub\wwwroot\php\NWIND.MDB'; + $dsn = "nwind"; + $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=$access;Uid=Admin;Pwd=;"; + + //$dsn = 'Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=' . $access . ';'; + if ($db->PConnect($dsn, "", "", "")) + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + else print "ERROR: Access test requires a Windows ODBC DSN=nwind, Access driver"; + +} + +if (!empty($testaccess) && !empty($testado)) { // ADO ACCESS + + $db = ADONewConnection("ado_access"); + print "

        Connecting $db->databaseType...

        "; + + $access = 'd:\inetpub\wwwroot\php\NWIND.MDB'; + $myDSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;' + . 'DATA SOURCE=' . $access . ';'; + //. 'USER ID=;PASSWORD=;'; + $_GET['nolog'] = 1; + if ($db->PConnect($myDSN, "", "", "")) { + print "ADO version=".$db->_connectionID->version."
        "; + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + } else print "ERROR: Access test requires a Access database $access".'
        '.$db->ErrorMsg(); + +} + +if (!empty($testvfp)) { // ODBC + $db = ADONewConnection('vfp'); + print "

        Connecting $db->databaseType...

        ";flush(); + + if ( $db->PConnect("vfp-adoxyz")) { + testdb($db,"create table d:\\inetpub\\adodb\\ADOXYZ (id int, firstname char(24), lastname char(24),created date)"); + } else print "ERROR: Visual FoxPro test requires a Windows ODBC DSN=vfp-adoxyz, VFP driver"; + + echo "
        "; + $db = ADONewConnection('odbtp'); + + if ( $db->PConnect('localhost','DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=d:\inetpub\adodb;EXCLUSIVE=NO;')) { + print "

        Connecting $db->databaseType...

        ";flush(); + testdb($db,"create table d:\\inetpub\\adodb\\ADOXYZ (id int, firstname char(24), lastname char(24),created date)"); + } else print "ERROR: Visual FoxPro odbtp requires a Windows ODBC DSN=vfp-adoxyz, VFP driver"; + +} + + +// REQUIRES MySQL server at localhost with database 'test' +if (!empty($testmysql)) { // MYSQL + + + if (PHP_VERSION >= 5 || $_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + else $server = "mangrove"; + $user = 'root'; $password = ''; $database = 'northwind'; + $db = ADONewConnection("mysqlt://$user:$password@$server/$database?persist"); + print "

        Connecting $db->databaseType...

        "; + + if (true || $db->PConnect($server, "root", "", "northwind")) { + //$db->Execute("DROP TABLE ADOXYZ") || die('fail drop'); + //$db->debug=1;$db->Execute('drop table ADOXYZ'); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) Type=InnoDB"); + } else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'
        '.$db->ErrorMsg(); +} + +// REQUIRES MySQL server at localhost with database 'test' +if (!empty($testmysqli)) { // MYSQL + + $db = ADONewConnection('mysqli'); + print "

        Connecting $db->databaseType...

        "; + if (PHP_VERSION >= 5 || $_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + else $server = "mangrove"; + if ($db->PConnect($server, "root", "", "northwind")) { + //$db->debug=1;$db->Execute('drop table ADOXYZ'); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); + } else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'
        '.$db->ErrorMsg(); +} + + +// REQUIRES MySQL server at localhost with database 'test' +if (!empty($testmysqlodbc)) { // MYSQL + + $db = ADONewConnection('odbc'); + $db->hasTransactions = false; + print "

        Connecting $db->databaseType...

        "; + if ($_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + else $server = "mangrove"; + if ($db->PConnect('mysql', "root", "")) + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) type=innodb"); + else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'
        '.$db->ErrorMsg(); +} + +if (!empty($testproxy)){ + $db = ADONewConnection('proxy'); + print "

        Connecting $db->databaseType...

        "; + if ($_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + + if ($db->PConnect('http://localhost/php/phplens/adodb/server.php')) + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) type=innodb"); + else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'
        '.$db->ErrorMsg(); + +} + +ADOLoadCode('oci805'); +ADOLoadCode("oci8po"); + +if (!empty($testoracle)) { + $dsn = "oci8po";//://scott:natsoft@kk2?persist"; + $db = ADONewConnection($dsn );//'oci8'); + + //$db->debug=1; + print "

        Connecting $db->databaseType...

        "; + if ($db->Connect('', "scott", "natsoft",'condor')) + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + else + print "ERROR: Oracle test requires an Oracle server setup with scott/natsoft".'
        '.$db->ErrorMsg(); + +} +ADOLoadCode("oracle"); // no longer supported +if (false && !empty($testoracle)) { + + $db = ADONewConnection(); + print "

        Connecting $db->databaseType...

        "; + if ($db->PConnect("", "scott", "tiger", "natsoft.domain")) + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + else print "ERROR: Oracle test requires an Oracle server setup with scott/tiger".'
        '.$db->ErrorMsg(); + +} + +ADOLoadCode("odbc_db2"); // no longer supported +if (!empty($testdb2)) { + if (PHP_VERSION>=5.1) { + $db = ADONewConnection("db2"); + print "

        Connecting $db->databaseType...

        "; + + #$db->curMode = SQL_CUR_USE_ODBC; + #$dsn = "driver={IBM db2 odbc DRIVER};Database=test;hostname=localhost;port=50000;protocol=TCPIP; uid=natsoft; pwd=guest"; + if ($db->Connect('localhost','natsoft','guest','test')) { + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + } else print "ERROR: DB2 test requires an server setup with odbc data source db2_sample".'
        '.$db->ErrorMsg(); + } else { + $db = ADONewConnection("odbc_db2"); + print "

        Connecting $db->databaseType...

        "; + + $dsn = "db2test"; + #$db->curMode = SQL_CUR_USE_ODBC; + #$dsn = "driver={IBM db2 odbc DRIVER};Database=test;hostname=localhost;port=50000;protocol=TCPIP; uid=natsoft; pwd=guest"; + if ($db->Connect($dsn)) { + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + } else print "ERROR: DB2 test requires an server setup with odbc data source db2_sample".'
        '.$db->ErrorMsg(); + } +echo "
        "; +flush(); + $dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP; uid=root; pwd=natsoft"; + + $db = ADONewConnection('odbtp'); + if ($db->Connect('127.0.0.1',$dsn)) { + + $db->debug=1; + $arr = $db->GetArray( "||SQLProcedures" ); adodb_pr($arr); + $arr = $db->GetArray( "||SQLProcedureColumns|||GET_ROUTINE_SAR" );adodb_pr($arr); + + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + } else echo ("ERROR Connection"); + echo $db->ErrorMsg(); +} + + +$server = 'localhost'; + + + +ADOLoadCode("mssqlpo"); +if (false && !empty($testmssql)) { // MS SQL Server -- the extension is buggy -- probably better to use ODBC + $db = ADONewConnection("mssqlpo"); + //$db->debug=1; + print "

        Connecting $db->databaseType...

        "; + + $ok = $db->Connect('','sa','natsoft','northwind'); + echo $db->ErrorMsg(); + if ($ok /*or $db->PConnect("mangrove", "sa", "natsoft", "ai")*/) { + AutoDetect_MSSQL_Date_Order($db); + // $db->Execute('drop table adoxyz'); + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + } else print "ERROR: MSSQL test 2 requires a MS SQL 7 on a server='$server', userid='adodb', password='natsoft', database='ai'".'
        '.$db->ErrorMsg(); + +} + + +ADOLoadCode('odbc_mssql'); +if (!empty($testmssql)) { // MS SQL Server via ODBC + $db = ADONewConnection(); + + print "

        Connecting $db->databaseType...

        "; + + $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=$server;Database=northwind;"; + $dsn = 'condor'; + if ($db->PConnect($dsn, "sa", "natsoft", "")) { + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + } + else print "ERROR: MSSQL test 1 requires a MS SQL 7 server setup with DSN setup"; + +} + +ADOLoadCode("ado_mssql"); +if (!empty($testmssql) && !empty($testado) ) { // ADO ACCESS MSSQL -- thru ODBC -- DSN-less + + $db = ADONewConnection("ado_mssql"); + //$db->debug=1; + print "

        Connecting DSN-less $db->databaseType...

        "; + + $myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};" + . "SERVER=$server;DATABASE=NorthWind;UID=adodb;PWD=natsoft;Trusted_Connection=No"; + + + if ($db->PConnect($myDSN, "", "", "")) + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + else print "ERROR: MSSQL test 2 requires MS SQL 7"; + +} + +if (!empty($testmssql) && !empty($testado)) { // ADO ACCESS MSSQL with OLEDB provider + + $db = ADONewConnection("ado_mssql"); + print "

        Connecting DSN-less OLEDB Provider $db->databaseType...

        "; + //$db->debug=1; + $myDSN="SERVER=localhost;DATABASE=northwind;Trusted_Connection=yes"; + if ($db->PConnect($myDSN, "adodb", "natsoft", 'SQLOLEDB')) { + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + } else print "ERROR: MSSQL test 2 requires a MS SQL 7 on a server='mangrove', userid='sa', password='', database='ai'"; + +} + + +if (extension_loaded('odbtp') && !empty($testmssql)) { // MS SQL Server via ODBC + $db = ADONewConnection('odbtp'); + + $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=$server;Database=northwind;uid=adodb;pwd=natsoft"; + + if ($db->PConnect('localhost',$dsn, "", "")) { + print "

        Connecting $db->databaseType...

        "; + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + } + else print "ERROR: MSSQL test 1 requires a MS SQL 7 server setup with DSN setup"; + +} + + +print "

        Tests Completed

        "; + +?> diff --git a/fannie/adodb5/tests/testgenid.php b/fannie/adodb5/tests/testgenid.php new file mode 100644 index 000000000..14b48ce3c --- /dev/null +++ b/fannie/adodb5/tests/testgenid.php @@ -0,0 +1,36 @@ +Execute("drop table $table"); + //$db->debug=true; + + $ctr = 5000; + $lastnum = 0; + + while (--$ctr >= 0) { + $num = $db->GenID($table); + if ($num === false) { + print "GenID returned false"; + break; + } + if ($lastnum + 1 == $num) print " $num "; + else { + print " $num "; + flush(); + } + $lastnum = $num; + } +} +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testmssql.php b/fannie/adodb5/tests/testmssql.php new file mode 100644 index 000000000..b858481c4 --- /dev/null +++ b/fannie/adodb5/tests/testmssql.php @@ -0,0 +1,76 @@ +Connect('127.0.0.1','adodb','natsoft','northwind') or die('Fail'); + +$conn->debug =1; +$query = 'select * from products'; +$conn->SetFetchMode(ADODB_FETCH_ASSOC); +$rs = $conn->Execute($query); +echo "
        ";
        +while( !$rs->EOF ) {
        +	$output[] = $rs->fields;
        +	var_dump($rs->fields);
        +	$rs->MoveNext();
        +	print "

        "; +} +die(); + + +$p = $conn->Prepare('insert into products (productname,unitprice,dcreated) values (?,?,?)'); +echo "

        ";
        +print_r($p);
        +
        +$conn->debug=1;
        +$conn->Execute($p,array('John'.rand(),33.3,$conn->DBDate(time())));
        +
        +$p = $conn->Prepare('select * from products where productname like ?');
        +$arr = $conn->getarray($p,array('V%'));
        +print_r($arr);
        +die();
        +
        +//$conn = ADONewConnection("mssql");
        +//$conn->Connect('mangrove','sa','natsoft','ai');
        +
        +//$conn->Connect('mangrove','sa','natsoft','ai');
        +$conn->debug=1;
        +$conn->Execute('delete from blobtest');
        +
        +$conn->Execute('insert into blobtest (id) values(1)');
        +$conn->UpdateBlobFile('blobtest','b1','../cute_icons_for_site/adodb.gif','id=1');
        +$rs = $conn->Execute('select b1 from blobtest where id=1');
        +
        +$output = "c:\\temp\\test_out-".date('H-i-s').".gif"; 
        +print "Saving file $output, size=".strlen($rs->fields[0])."

        "; +$fd = fopen($output, "wb"); +fwrite($fd, $rs->fields[0]); +fclose($fd); + +print " View Image"; +//$rs = $conn->Execute('SELECT id,SUBSTRING(b1, 1, 10) FROM blobtest'); +//rs2html($rs); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testoci8.php b/fannie/adodb5/tests/testoci8.php new file mode 100644 index 000000000..2886ccf22 --- /dev/null +++ b/fannie/adodb5/tests/testoci8.php @@ -0,0 +1,83 @@ + + +PConnect('','scott','natsoft'); + if (!empty($testblob)) { + $varHoldingBlob = 'ABC DEF GEF John TEST'; + $num = time()%10240; + // create table atable (id integer, ablob blob); + $db->Execute('insert into ATABLE (id,ablob) values('.$num.',empty_blob())'); + $db->UpdateBlob('ATABLE', 'ablob', $varHoldingBlob, 'id='.$num, 'BLOB'); + + $rs = $db->Execute('select * from atable'); + + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); + } + $stmt = $db->Prepare('select * from adoxyz where id=?'); + for ($i = 1; $i <= 10; $i++) { + $rs = $db->Execute( + $stmt, + array($i)); + + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); + } +} +if (1) { + $db = ADONewConnection('oci8'); + $db->PConnect('','scott','natsoft'); + $db->debug = true; + $db->Execute("delete from emp where ename='John'"); + print $db->Affected_Rows().'
        '; + $stmt = $db->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); + $rs = $db->Execute($stmt,array('empno'=>4321,'ename'=>'John')); + // prepare not quite ready for prime time + //$rs = $db->Execute($stmt,array('empno'=>3775,'ename'=>'John')); + if (!$rs) die("Empty RS"); + + $db->setfetchmode(ADODB_FETCH_NUM); + + $vv = 'A%'; + $stmt = $db->PrepareSP("BEGIN adodb.open_tab2(:rs,:tt); END;",true); + $db->OutParameter($stmt, $cur, 'rs', -1, OCI_B_CURSOR); + $db->OutParameter($stmt, $vv, 'tt'); + $rs = $db->Execute($stmt); + while (!$rs->EOF) { + adodb_pr($rs->fields); + $rs->MoveNext(); + } + echo " val = $vv"; + +} + +if (0) { + $db = ADONewConnection('odbc_oracle'); + if (!$db->PConnect('local_oracle','scott','tiger')) die('fail connect'); + $db->debug = true; + $rs = $db->Execute( + 'select * from adoxyz where firstname=? and trim(lastname)=?', + array('first'=>'Caroline','last'=>'Miranda')); + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); +} +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testoci8cursor.php b/fannie/adodb5/tests/testoci8cursor.php new file mode 100644 index 000000000..a75f27dbe --- /dev/null +++ b/fannie/adodb5/tests/testoci8cursor.php @@ -0,0 +1,111 @@ +PConnect('','scott','natsoft'); + $db->debug = 99; + + +/* +*/ + + define('MYNUM',5); + + + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS,'A%'); END;"); + + if ($rs && !$rs->EOF) { + print "Test 1 RowCount: ".$rs->RecordCount()."

        "; + } else { + print "Error in using Cursor Variables 1

        "; + } + + print "

        Testing Stored Procedures for oci8

        "; + + $stid = $db->PrepareSP('BEGIN adodb.myproc('.MYNUM.', :myov); END;'); + $db->OutParameter($stid, $myov, 'myov'); + $db->Execute($stid); + if ($myov != MYNUM) print "

        Error with myproc

        "; + + + $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;",true); + $a1 = 'Malaysia'; + //$a2 = ''; # a2 doesn't even need to be defined! + $db->InParameter($stmt,$a1,'a1'); + $db->OutParameter($stmt,$a2,'a2'); + $rs = $db->Execute($stmt); + if ($rs) { + if ($a2 !== 'Cinta Hati Malaysia') print "Stored Procedure Error: a2 = $a2

        "; + else echo "OK: a2=$a2

        "; + } else { + print "Error in using Stored Procedure IN/Out Variables

        "; + } + + + $tname = 'A%'; + + $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); + $db->Parameter($stmt,$tname,'tablename'); + $rs = $db->Execute($stmt); + rs2html($rs); + + +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testpaging.php b/fannie/adodb5/tests/testpaging.php new file mode 100644 index 000000000..85ab5e286 --- /dev/null +++ b/fannie/adodb5/tests/testpaging.php @@ -0,0 +1,86 @@ +PConnect('localhost','tester','test','test'); +} + +if ($driver == 'access') { + $db = NewADOConnection('access'); + $db->PConnect("nwind", "", "", ""); +} + +if ($driver == 'ibase') { + $db = NewADOConnection('ibase'); + $db->PConnect("localhost:e:\\firebird\\examples\\employee.gdb", "sysdba", "masterkey", ""); + $sql = 'select distinct firstname, lastname from adoxyz order by firstname'; + +} +if ($driver == 'mssql') { + $db = NewADOConnection('mssql'); + $db->Connect('JAGUAR\vsdotnet','adodb','natsoft','northwind'); +} +if ($driver == 'oci8') { + $db = NewADOConnection('oci8'); + $db->Connect('','scott','natsoft'); + +$sql = "select * from (select ID, firstname as \"First Name\", lastname as \"Last Name\" from adoxyz + order by 1)"; +} + +if ($driver == 'access') { + $db = NewADOConnection('access'); + $db->Connect('nwind'); +} + +if (empty($driver) or $driver == 'mysql') { + $db = NewADOConnection('mysql'); + $db->Connect('localhost','root','','test'); +} + +//$db->pageExecuteCountRows = false; + +$db->debug = true; + +if (0) { +$rs = $db->Execute($sql); +include_once('../toexport.inc.php'); +print "

        ";
        +print rs2csv($rs); # return a string
        +
        +print '
        '; +$rs->MoveFirst(); # note, some databases do not support MoveFirst +print rs2tab($rs); # return a string + +print '
        '; +$rs->MoveFirst(); +rs2tabout($rs); # send to stdout directly +print "
        "; +} + +$pager = new ADODB_Pager($db,$sql); +$pager->showPageLinks = true; +$pager->linksPerPage = 10; +$pager->cache = 60; +$pager->Render($rows=7); +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testpear.php b/fannie/adodb5/tests/testpear.php new file mode 100644 index 000000000..d1a4ef91d --- /dev/null +++ b/fannie/adodb5/tests/testpear.php @@ -0,0 +1,34 @@ +setFetchMode(ADODB_FETCH_ASSOC); +$rs = $db->Query('select firstname,lastname from adoxyz'); +$cnt = 0; +while ($arr = $rs->FetchRow()) { + print_r($arr); + print "
        "; + $cnt += 1; +} + +if ($cnt != 50) print "Error in \$cnt = $cnt"; +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/testsessions.php b/fannie/adodb5/tests/testsessions.php new file mode 100644 index 000000000..e8b59f22e --- /dev/null +++ b/fannie/adodb5/tests/testsessions.php @@ -0,0 +1,98 @@ +Notify Expiring=$ref, sessionkey=$key

        "; +} + +//------------------------------------------------------------------- + +error_reporting(E_ALL); + + +ob_start(); +include('../session/adodb-cryptsession2.php'); + +$options['debug'] = 1; +$db = 'oci8'; + +#### CONNECTION +switch($db) { +case 'oci8': + $options['table'] = 'adodb_sessions2'; + ADOdb_Session::config('oci8', '', 'jcollect_bkrm', 'natsoft', '',$options); + break; + +case 'postgres': + $options['table'] = 'sessions2'; + ADOdb_Session::config('postgres', 'localhost', 'tester', 'test', 'test',$options); + break; + +case 'mysql': +default: + $options['table'] = 'sessions2'; + ADOdb_Session::config('mysql', 'localhost', 'root', '', 'xphplens_2',$options); + break; + + +} + + + +#### SETUP NOTIFICATION + $USER = 'JLIM'.rand(); + $ADODB_SESSION_EXPIRE_NOTIFY = array('USER','NotifyExpire'); + + adodb_session_create_table(); + session_start(); + + adodb_session_regenerate_id(); + +### SETUP SESSION VARIABLES + if (empty($_SESSION['MONKEY'])) $_SESSION['MONKEY'] = array(1,'abc',44.41); + else $_SESSION['MONKEY'][0] += 1; + if (!isset($_GET['nochange'])) @$_SESSION['AVAR'] += 1; + + +### START DISPLAY + print "

        PHP ".PHP_VERSION."

        "; + print "

        \$_SESSION['AVAR']={$_SESSION['AVAR']}

        "; + + print "
        Cookies: "; + print_r($_COOKIE); + + var_dump($_SESSION['MONKEY']); + +### RANDOMLY PERFORM Garbage Collection +### In real-production environment, this is done for you +### by php's session extension, which calls adodb_sess_gc() +### automatically for you. See php.ini's +### session.cookie_lifetime and session.gc_probability + + if (rand() % 5 == 0) { + + print "

        Garbage Collection

        "; + adodb_sess_gc(10); + + if (rand() % 2 == 0) { + print "

        Random own session destroy

        "; + session_destroy(); + } + } else { + $DB = ADODB_Session::_conn(); + $sessk = $DB->qstr('%AZ'.rand().time()); + $olddate = $DB->DBTimeStamp(time()-30*24*3600); + $rr = $DB->qstr(rand()); + $DB->Execute("insert into {$options['table']} (sesskey,expiry,expireref,sessdata,created,modified) values ($sessk,$olddate, $rr,'',$olddate,$olddate)"); + } +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/time.php b/fannie/adodb5/tests/time.php new file mode 100644 index 000000000..65e9e08ff --- /dev/null +++ b/fannie/adodb5/tests/time.php @@ -0,0 +1,18 @@ + +" ); +echo( "Converted: $convertedDate" ); //why is string returned as one day (3 not 4) less for this example?? + +?> \ No newline at end of file diff --git a/fannie/adodb5/tests/tmssql.php b/fannie/adodb5/tests/tmssql.php new file mode 100644 index 000000000..4975787da --- /dev/null +++ b/fannie/adodb5/tests/tmssql.php @@ -0,0 +1,80 @@ +mssql"; + $db = mssql_connect('JAGUAR\vsdotnet','adodb','natsoft') or die('No Connection'); + mssql_select_db('northwind',$db); + + $rs = mssql_query('select getdate() as date',$db); + $o = mssql_fetch_row($rs); + print_r($o); + mssql_free_result($rs); + + print "

        Delete

        "; flush(); + $rs2 = mssql_query('delete from adoxyz',$db); + $p = mssql_num_rows($rs2); + mssql_free_result($rs2); + +} + +function tpear() +{ +include_once('DB.php'); + + print "

        PEAR

        "; + $username = 'adodb'; + $password = 'natsoft'; + $hostname = 'JAGUAR\vsdotnet'; + $databasename = 'northwind'; + + $dsn = "mssql://$username:$password@$hostname/$databasename"; + $conn = DB::connect($dsn); + print "date=".$conn->GetOne('select getdate()')."
        "; + @$conn->query('create table tester (id integer)'); + print "

        Delete

        "; flush(); + $rs = $conn->query('delete from tester'); + print "date=".$conn->GetOne('select getdate()')."
        "; +} + +function tadodb() +{ +include_once('../adodb.inc.php'); + + print "

        ADOdb

        "; + $conn = NewADOConnection('mssql'); + $conn->Connect('JAGUAR\vsdotnet','adodb','natsoft','northwind'); +// $conn->debug=1; + print "date=".$conn->GetOne('select getdate()')."
        "; + $conn->Execute('create table tester (id integer)'); + print "

        Delete

        "; flush(); + $rs = $conn->Execute('delete from tester'); + print "date=".$conn->GetOne('select getdate()')."
        "; +} + + +$ACCEPTIP = '127.0.0.1'; + +$remote = $_SERVER["REMOTE_ADDR"]; + +if (!empty($ACCEPTIP)) + if ($remote != '127.0.0.1' && $remote != $ACCEPTIP) + die("Unauthorised client: '$remote'"); + +?> +mssql +pear +adodb + \ No newline at end of file diff --git a/fannie/adodb5/tests/xmlschema-mssql.xml b/fannie/adodb5/tests/xmlschema-mssql.xml new file mode 100644 index 000000000..db2c34328 --- /dev/null +++ b/fannie/adodb5/tests/xmlschema-mssql.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + +id + + +id + + + +
        + + SQL to be executed only on specific platforms + + insert into mytable ( row1, row2 ) values ( 12, 'postgres stuff' ) + + + insert into mytable ( row1, row2 ) values ( 12, 'mysql stuff' ) + + + INSERT into simple_table ( name, description ) values ( '12', 'Microsoft stuff' ) + + +
        \ No newline at end of file diff --git a/fannie/adodb5/tests/xmlschema.xml b/fannie/adodb5/tests/xmlschema.xml new file mode 100644 index 000000000..ea48ae2bb --- /dev/null +++ b/fannie/adodb5/tests/xmlschema.xml @@ -0,0 +1,33 @@ + + + + + An integer row that's a primary key and autoincrements + + + + + A 16 character varchar row that can't be null + + + + row1 + row2 + +
        + + SQL to be executed only on specific platforms + + insert into mytable ( row1, row2 ) values ( 12, 'postgres stuff' ) + + + insert into mytable ( row1, row2 ) values ( 12, 'mysql stuff' ) + + + insert into mytable ( row1, row2 ) values ( 12, 'Microsoft stuff' ) + + + + +
        +
        \ No newline at end of file diff --git a/fannie/adodb5/toexport.inc.php b/fannie/adodb5/toexport.inc.php new file mode 100644 index 000000000..57b8bd1eb --- /dev/null +++ b/fannie/adodb5/toexport.inc.php @@ -0,0 +1,134 @@ +FieldTypesArray(); + reset($fieldTypes); + $i = 0; + while(list(,$o) = each($fieldTypes)) { + + $v = ($o) ? $o->name : 'Field'.($i++); + if ($escquote) $v = str_replace($quote,$escquotequote,$v); + $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); + $elements[] = $v; + + } + $s .= implode($sep, $elements).$NEWLINE; + } + $hasNumIndex = isset($rs->fields[0]); + + $line = 0; + $max = $rs->FieldCount(); + + while (!$rs->EOF) { + $elements = array(); + $i = 0; + + if ($hasNumIndex) { + for ($j=0; $j < $max; $j++) { + $v = $rs->fields[$j]; + if (!is_object($v)) $v = trim($v); + else $v = 'Object'; + if ($escquote) $v = str_replace($quote,$escquotequote,$v); + $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); + + if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; + else $elements[] = $v; + } + } else { // ASSOCIATIVE ARRAY + foreach($rs->fields as $v) { + if ($escquote) $v = str_replace($quote,$escquotequote,trim($v)); + $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); + + if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; + else $elements[] = $v; + } + } + $s .= implode($sep, $elements).$NEWLINE; + $rs->MoveNext(); + $line += 1; + if ($fp && ($line % $BUFLINES) == 0) { + if ($fp === true) echo $s; + else fwrite($fp,$s); + $s = ''; + } + } + + if ($fp) { + if ($fp === true) echo $s; + else fwrite($fp,$s); + $s = ''; + } + + return $s; +} +?> \ No newline at end of file diff --git a/fannie/adodb5/tohtml.inc.php b/fannie/adodb5/tohtml.inc.php new file mode 100644 index 000000000..6a4e3ba47 --- /dev/null +++ b/fannie/adodb5/tohtml.inc.php @@ -0,0 +1,201 @@ + +*/ + +// specific code for tohtml +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; + +$ADODB_ROUND=4; // rounding +$gSQLMaxRows = 1000; // max no of rows to download +$gSQLBlockRows=20; // max no of rows per table block + +// RecordSet to HTML Table +//------------------------------------------------------------ +// Convert a recordset to a html table. Multiple tables are generated +// if the number of rows is > $gSQLBlockRows. This is because +// web browsers normally require the whole table to be downloaded +// before it can be rendered, so we break the output into several +// smaller faster rendering tables. +// +// $rs: the recordset +// $ztabhtml: the table tag attributes (optional) +// $zheaderarray: contains the replacement strings for the headers (optional) +// +// USAGE: +// include('adodb.inc.php'); +// $db = ADONewConnection('mysql'); +// $db->Connect('mysql','userid','password','database'); +// $rs = $db->Execute('select col1,col2,col3 from table'); +// rs2html($rs, 'BORDER=2', array('Title1', 'Title2', 'Title3')); +// $rs->Close(); +// +// RETURNS: number of rows displayed + + +function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true) +{ +$s ='';$rows=0;$docnt = false; +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; + + if (!$rs) { + printf(ADODB_BAD_RS,'rs2html'); + return false; + } + + if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'"; + //else $docnt = true; + $typearr = array(); + $ncols = $rs->FieldCount(); + $hdr = "\n\n"; + for ($i=0; $i < $ncols; $i++) { + $field = $rs->FetchField($i); + if ($field) { + if ($zheaderarray) $fname = $zheaderarray[$i]; + else $fname = htmlspecialchars($field->name); + $typearr[$i] = $rs->MetaType($field->type,$field->max_length); + //print " $field->name $field->type $typearr[$i] "; + } else { + $fname = 'Field '.($i+1); + $typearr[$i] = 'C'; + } + if (strlen($fname)==0) $fname = ' '; + $hdr .= ""; + } + $hdr .= "\n"; + if ($echo) print $hdr."\n\n"; + else $html = $hdr; + + // smart algorithm - handles ADODB_FETCH_MODE's correctly by probing... + $numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]); + while (!$rs->EOF) { + + $s .= "\n"; + + for ($i=0; $i < $ncols; $i++) { + if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields); + else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields); + + $type = $typearr[$i]; + switch($type) { + case 'D': + if (strpos($v,':') !== false); + else { + if (empty($v)) { + $s .= "\n"; + } else { + $s .= " \n"; + } + break; + } + case 'T': + if (empty($v)) $s .= "\n"; + else $s .= " \n"; + break; + + case 'N': + if (abs(abs($v) - round($v,0)) < 0.00000001) + $v = round($v); + else + $v = round($v,$ADODB_ROUND); + case 'I': + $vv = stripslashes((trim($v))); + if (strlen($vv) == 0) $vv .= ' '; + $s .= " \n"; + + break; + /* + case 'B': + if (substr($v,8,2)=="BM" ) $v = substr($v,8); + $mtime = substr(str_replace(' ','_',microtime()),2); + $tmpname = "tmp/".uniqid($mtime).getmypid(); + $fd = @fopen($tmpname,'a'); + @ftruncate($fd,0); + @fwrite($fd,$v); + @fclose($fd); + if (!function_exists ("mime_content_type")) { + function mime_content_type ($file) { + return exec("file -bi ".escapeshellarg($file)); + } + } + $t = mime_content_type($tmpname); + $s .= (substr($t,0,5)=="image") ? " \\n" : " \\n"; + break; + */ + + default: + if ($htmlspecialchars) $v = htmlspecialchars(trim($v)); + $v = trim($v); + if (strlen($v) == 0) $v = ' '; + $s .= " \n"; + + } + } // for + $s .= "\n\n"; + + $rows += 1; + if ($rows >= $gSQLMaxRows) { + $rows = "

        Truncated at $gSQLMaxRows

        "; + break; + } // switch + + $rs->MoveNext(); + + // additional EOF check to prevent a widow header + if (!$rs->EOF && $rows % $gSQLBlockRows == 0) { + + //if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP + if ($echo) print $s . "
        $fname
          ".$rs->UserDate($v,"D d, M Y") ."   ".$rs->UserTimeStamp($v,"D d, M Y, H:i:s") ."".$vv ."$t$t". str_replace("\n",'
        ',stripslashes($v)) ."
        \n\n"; + else $html .= $s ."\n\n"; + $s = $hdr; + } + } // while + + if ($echo) print $s."\n\n"; + else $html .= $s."\n\n"; + + if ($docnt) if ($echo) print "

        ".$rows." Rows

        "; + + return ($echo) ? $rows : $html; + } + +// pass in 2 dimensional array +function arr2html(&$arr,$ztabhtml='',$zheaderarray='') +{ + if (!$ztabhtml) $ztabhtml = 'BORDER=1'; + + $s = "";//';print_r($arr); + + if ($zheaderarray) { + $s .= ''; + for ($i=0; $i\n"; + } else $s .= " \n"; + $s .= "\n\n"; + } + $s .= '
         
        '; + print $s; +} + +?> \ No newline at end of file diff --git a/fannie/adodb5/xmlschema.dtd b/fannie/adodb5/xmlschema.dtd new file mode 100644 index 000000000..4a055da4e --- /dev/null +++ b/fannie/adodb5/xmlschema.dtd @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +] > \ No newline at end of file diff --git a/fannie/adodb5/xmlschema03.dtd b/fannie/adodb5/xmlschema03.dtd new file mode 100644 index 000000000..a7c8864ff --- /dev/null +++ b/fannie/adodb5/xmlschema03.dtd @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> \ No newline at end of file diff --git a/fannie/adodb5/xsl/convert-0.1-0.2.xsl b/fannie/adodb5/xsl/convert-0.1-0.2.xsl new file mode 100644 index 000000000..6cd9e5bf1 --- /dev/null +++ b/fannie/adodb5/xsl/convert-0.1-0.2.xsl @@ -0,0 +1,205 @@ + + + + + + + +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net + + + + 0.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fannie/adodb5/xsl/convert-0.1-0.3.xsl b/fannie/adodb5/xsl/convert-0.1-0.3.xsl new file mode 100644 index 000000000..381aa4fe7 --- /dev/null +++ b/fannie/adodb5/xsl/convert-0.1-0.3.xsl @@ -0,0 +1,221 @@ + + + + + + + +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net + + + + 0.3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fannie/adodb5/xsl/convert-0.2-0.1.xsl b/fannie/adodb5/xsl/convert-0.2-0.1.xsl new file mode 100644 index 000000000..61841b483 --- /dev/null +++ b/fannie/adodb5/xsl/convert-0.2-0.1.xsl @@ -0,0 +1,207 @@ + + + + + + + +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net + + + + 0.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fannie/adodb5/xsl/convert-0.2-0.3.xsl b/fannie/adodb5/xsl/convert-0.2-0.3.xsl new file mode 100644 index 000000000..26bd9e9aa --- /dev/null +++ b/fannie/adodb5/xsl/convert-0.2-0.3.xsl @@ -0,0 +1,281 @@ + + + + + + + +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net + + + + 0.3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fannie/adodb5/xsl/remove-0.2.xsl b/fannie/adodb5/xsl/remove-0.2.xsl new file mode 100644 index 000000000..9b10a528c --- /dev/null +++ b/fannie/adodb5/xsl/remove-0.2.xsl @@ -0,0 +1,54 @@ + + + + + + + +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net + + + +Uninstallation Schema + + + + 0.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fannie/adodb5/xsl/remove-0.3.xsl b/fannie/adodb5/xsl/remove-0.3.xsl new file mode 100644 index 000000000..768e092bf --- /dev/null +++ b/fannie/adodb5/xsl/remove-0.3.xsl @@ -0,0 +1,54 @@ + + + + + + + +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net + + + +Uninstallation Schema + + + + 0.3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fannie/auth/README b/fannie/auth/README new file mode 100644 index 000000000..c82d945b3 --- /dev/null +++ b/fannie/auth/README @@ -0,0 +1,56 @@ +========================================= + Andy's Fannie Authentication Module +========================================= + +This collection of functions authenticates +users and assigns them privileges either +individually or in groups. Authentication can +be done via SQL, *nix shadow passwords, or +LDAP. Privileges are always stored in SQL so +the database tables are required. See +$FANNIE/auth/doc/ for table structure & API. + +========================================= + Disabling Authentication +========================================= + +Not everyone wants or needs authentication. +To bypass all authentication checking, +create this file: +$FANNIE/auth/init.php + +Content of the file is irrelevant. +Removing read permission from +$FANNIE/auth/ui/ is probably a good idea +from a security standpoint. + +========================================= + Installation / Setup +========================================= +See $IS4C/documentation/Fannie/developer/auth.html + for a possibly different procedure. +1. Create a file $FANNIE/auth/init.php + This gives you all options without logging in. +2. Go to $FANNIE/auth/ui/menu.php and create + a new [SQL] user. Because you're in the + init mode, the necessary tables are created + automatically. +3. Give your user the authorization "Admin" + (with subs "all" and "all"). Admin users + can create other users, groups, and alter + authorizations. +4. Delete $FANNIE/auth/init.php. Authentication + is now enforced; create other users with + your admin user as needed. + +OPTIONAL: Add *nix shadow authentication +5. cd $FANNIE/auth/shadowread + make + sudo make install + +OPTIONAL: Add LDAP authentication +6. Edit the setup variables in ldap_login() + in login.php. You have to declare where + your LDAP host is and how the data is + layed out, essentially. The defaults + will probably work with openldap's defaults. diff --git a/fannie/auth/README.php b/fannie/auth/README.php new file mode 100644 index 000000000..27edce09b --- /dev/null +++ b/fannie/auth/README.php @@ -0,0 +1,19 @@ + + +Authorization Module README + + +
        +
        +
        + + diff --git a/fannie/auth/doc/index.html b/fannie/auth/doc/index.html new file mode 100644 index 000000000..15a4b49a9 --- /dev/null +++ b/fannie/auth/doc/index.html @@ -0,0 +1,187 @@ + +Auth Module API Documentation + + +

        Auth Module API Documentation

        +This document is to detail the API and functionality of the Auth module. +The requirements and workings will be explained, followed by function documentation. +

        +

        Requirements

        +
      • PHP and a webserver
      • +
      • A SQL database (currently uses Sybase; code would need tweaking to use something else)
      • +
        +Database Layout +There are 4 database tables used by Auth. There is no install script, so these would need to be +created manually. +
          +
        1. users - contains basic information about users. Columns as follows: +
            +
          • name [varchar 50, primary key] - the user's name
          • +
          • password [varchar 50] - the password, stored crypt-ed
          • +
          • salt [varchar 10] - a timestamp used as a salt value for crypt-ing the password
          • +
          • uid [varchar 4] - a numeric user id, randomly generated and non-sequential
          • +
          • session_id [varchar 50] - a random key generated when a user logs in and stored in a cookie on the client side
          • +
          • real_name [varchar 75] - the user's real name
          • +
          +
        2. +
        3. userPrivs - a list of permissions for users. Each record essentiallys says user X may do Y. +The subclass start and end allow finer tuned control; i.e., user X may do Y provided Z falls within the +acceptable range. Thus anything can be used for these values so long as it is comparable on the SQL +server being used. The keyword 'all' is reserved for indicating that there is no subclass. +
            +
          • uid [varchar 4] - identifies the user
          • +
          • auth_class [varchar 50] - names the allowed task
          • +
          • sub_start [varchar 50] - defines the beginning of a subclass
          • +
          • sub_end [varchar 50] - defines the end of a subclass
          • +
          +
        4. +
        5. userGroups - defines groups of users. Each record indicates one member of one group. +
            +
          • gid [int 4] - a group id number. Sequential.
          • +
          • name [varchar 50] - the name of the group
          • +
          • username [varchar 50] - the name of the user
          • +
          +
        6. +
        7. userGroupPrivs - similar to userPrivs, but for groups. See that table for details. +
            +
          • gid [int 4]
          • +
          • auth [varchar 50]
          • +
          • sub_start [varchar 50]
          • +
          • sub_end [varchar 50]
          • +
          +
        8. +
        +

        API

        +auth/login.php - this is the main file. Include this to use the auth module.

        +bool changePassword ( string username, string oldpassword, string newpassword )
        +Updates the users password. Returns true on success, false on failure. +

        +mixed checkLogin ( )
        +Examines cookies to determine if any user is logged in. Returns the name of the logged in user +if there is one, otherwise returns false. +

        +bool createLogin ( string name, string password )
        +Enters a new username / password combination into the database. Returns true on success, false + on failure. Requires 'admin' authorization. +

        +bool deleteLogin ( string name )
        +Deletes the given user. Returns true on success, false on failure. Requires 'admin' authorization. +

        +bool login ( string name, string password )
        +Checks the username and password, then logs in the user if credentials are correct. Returns + true on success, false on failure. Note this function sets a cookie, so no output can be +sent to the browser prior to calling it. +

        +bool logout ( )
        +Logs out the currently logged in user and returns true. Note this function sets a cookie, so no +output can be sent to the browser prior to calling it. +

        +void showUsers ( )
        +Prints out a table of information about current users. Requires 'admin' authorization. +

        +mixed validateUser ( string authorization [, string subclass ] )
        +Determines who, if anyone, is logged in, and checks to see whether that user has the given +authorization. Returns the logged in user's name on success, or prints error messages AND +returns false on failure. +

        +mixed validateUserQuiet ( string authorization [, string subclass ] )
        +Identical to above except no error messages are printed. +

        +


        +auth/privileges.php +

        +bool addAuth ( string username, string authorization [, string subclass_start, string subclass_end ] )
        +Adds the given authorization for the given user. Returns true on success, false on failure. +Requires 'admin' authorization. +

        +bool checkAuth ( string username, string authorization [, string subclass ] )
        +Checks if the given user has the specified authorization. Returns true or false accordingly. +

        +bool deleteAuth ( string username, string authorization )
        +Deletes ALL matching authorizations for the user. There is currently no way to delete just a single +subclass span within an authorization. Returns true on success, false on failure. Requires +'admin' authorization. +

        +bool showAuths ( string username )
        +Prints a table of authorization information for the given user. Returns true on success, false on failure. +Requires 'admin' authorization. +

        +


        +auth/groups.php +

        +bool addAuthToGroup ( string groupname, string authorization [, string subclass_start, string subclass_end ] )
        +Adds the authorization to the given group. Returns true on success, false on failure. +

        +bool addGroup ( string groupname, string username )
        +Creates a group AND adds the user to it. Because of the database structure, a group without users isn't +feasible, but such a group isn't particularly useful. Returns true on success, false on failure. +

        +bool addUserToGroup ( string groupname, string username )
        +Adds the given user to the given group. Returns true on success false on failure. +

        +bool checkGroupAuth ( string groupname, string authrization [, string subclass ] )
        +Checks if the group has the given authorization and returns true or false accordingly. +

        +bool deleteAuthFromGroup ( string groupname, string authorization )
        +Deletes ALL instances of the given authorization from the given group. Returns true on success, +false on failure. +

        +bool deleteGroup ( string groupname )
        +Deletes the given group. Returns true on success, false on failure. +

        +bool deleteUserFromGroup ( string groupname, string username )
        +Deletes the given user from the given group. Returns true on success, false on failure. +

        +void detailGroup ( string groupname )
        +Prints tabled information about the given group including users and authorizations. +

        +bool showGroups ( )
        +Prints a table of group information. Returns true. +

        +


        +auth/utilities.php - useful functions that don't belong anywhere else +

        +resource dbconnect ( )
        +Connects to the database and returns a MS SQL link identifier. Doesn't do any error checking. This is +really only useful for moving the database, since the location and database are specified in the one +spot. Actual code doesn't abstract other calls, so the mssql_* functions would have to all be +replaced to switch DB providers. +

        +mixed getGID ( string groupname )
        +Returns the group id number of the given group if it exists, otherwise returns false. +

        +mixed getUID ( string username )
        +Returns the user id number of the given user if it exists, otherwise returns false. +

        +bool isAlphanumeric ( string input )
        +Verifies that the string doesn't contain anything other than letters, numbers, and underscores. All user +input should really be checked with this before being sent to the database to prevent SQL injection. Returns +true or false accordingly. +

        +


        +auth/doc This. You're reading it. +

        +


        +auth/ui - A user interface for logging in and out and administering the system. Mostly straightforward. +Notably, the auth module is self enforcing. A user must have the authorization 'admin' to perform many of the +administrative tasks, enforced on the base level or the user interface level (or both). I think that adding +a user with an empty password field to the table users and giving that user an 'admin' 'all' 'all' authorization +in the table userPrivs would give you an intial admin to login with, but I haven't actually tried it. It depends +how crypt deals with an empty string. +

        +auth/ui/loginform.php - the big kahuna for the GUI. This logs in users, but does a couple other tricks +via GET. Giving a get parameter of logout=yes will logout the user. A get parameter of redirect=[url] will +automatically send the user to the specified url after a successful login. Note the redirect url itself can only +contain one get parameter because the ampersand would end 'redirect'; this is a known limitation. +

        +auth/ui/index.php - auto-redirects users to either the login page or the menu based on whether or not +they're logged in. Handy in that just 'auth/ui' can be given to users as a single, all purpose bookmark. +

        +

        Usage

        +Or, how do I plug this thing into my code? Well, just use validateUser or validateUserQuiet to +check your user's permissions. Use auth/ui/loginform.php with the 'redirect' get parameter to provide users +with a login link that will take them back to the current page - or where ever you want them to go. You could also +zap them there automagically with <?php header("Location: /path/to/auth/ui/loginform.php?redirect=...") ?> +And that's about that. + + diff --git a/fannie/auth/groups.php b/fannie/auth/groups.php new file mode 100644 index 000000000..0eb7e745d --- /dev/null +++ b/fannie/auth/groups.php @@ -0,0 +1,277 @@ + 0){ + echo "Group $group already exists

        "; + return false; + } + + $gidQ = $sql->prepare_statement("select max(gid) from userGroups"); + $gidR = $sql->exec_statement($gidQ); + $row = $sql->fetch_array($gidR); + $gid = $row[0] + 1; + + $addQ = $sql->prepare_statement("insert into userGroups values (?,?,?)"); + $addR = $sql->exec_statement($addQ,array($gid,$group,$user)); + return true; +} + +/* delteGroup(groupname) + deletes the given group, removing all + users and all authorizations +*/ +function deleteGroup($group){ + $sql = dbconnect(); + if (!isAlphaNumeric($group)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist

        "; + return false; + } + + $delQ = $sql->prepare_statement("delete from userGroupPrivs where gid=?"); + $delR = $sql->exec_statement($delQ,array($gid)); + + $delQ = $sql->prepare_statement("delete from userGroups where gid=?"); + $delR = $sql->exec_statement($delQ,array($gid)); + return true; +} + +/* addUSerToGroup(groupname, username) + adds the given user to the given group +*/ +function addUserToGroup($group,$user){ + $sql = dbconnect(); + + if (!isAlphaNumeric($group) || !isAlphaNumeric($user)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist

        "; + return false; + } + + $checkQ = $sql->prepare_statement("select gid from userGroups where gid=? and username=?"); + $checkR = $sql->exec_statement($checkQ,array($gid,$user)); + if ($sql->num_rows($checkR) > 0){ + echo "User $user is already a member of group $group

        "; + return false; + } + + $addQ = $sql->prepare_statement("insert into userGroups values (?,?,?)"); + $addR = $sql->exec_statement($addQ,array($gid,$group,$user)); + return true; +} + +/* deleteUserFromGroup(groupname, username) + removes the given user from the given group +*/ +function deleteUserFromGroup($group,$user){ + $sql = dbconnect(); + if (!isAlphaNumeric($group) || !isAlphaNumeric($user)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist

        "; + return false; + } + + $delQ = $sql->prepare_statement("delete from userGroups where gid = ? and username=?"); + $delR = $sql->exec_statement($delQ,array($gid,$user)); + return true; + +} + +/* addAuthToGroup(groupname, authname, subclass boundaries) + adds the authorization to the given group +*/ +function addAuthToGroup($group,$auth,$start='admin',$end='admin'){ + $sql = dbconnect(); + + if (!isAlphaNumeric($group) || !isAlphaNumeric($auth) || + !isAlphaNumeric($start) || !isAlphaNumeric($end)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist

        "; + return false; + } + + $addQ = $sql->prepare_statement("insert into userGroupPrivs values (?,?,?,?)"); + $addR = $sql->exec_statement($addQ,array($gid,$auth,$start,$end)); + return true; +} + +/* checkGroupAuth(username, authorization class, subclass) + checks to see if the user is in a group that has + authorization in the given class +*/ +function checkGroupAuth($user,$auth,$sub='all'){ + $sql = dbconnect(); + if (!isAlphaNumeric($user) || !isAlphaNumeric($auth) || + !isAlphaNumeric($sub)){ + return false; + } + + $checkQ = $sql->prepare_statement("select g.gid from userGroups as g, userGroupPrivs as p where + g.gid = p.gid and g.username=? + and p.auth=? and + ((? between p.sub_start and p.sub_end) or + (p.sub_start='all' and p.sub_end='all'))"); + $checkR = $sql->exec_statement($checkQ,array($user,$auth,$sub)); + + if ($sql->num_rows($checkR) == 0){ + return false; + } + return true; +} + +/* deleteAuthFromGroup(groupname, authname) + deletes the given authorization class from the given + group. Note that it doesn't take into account + subclasses, so ALL authorizations in the base + class will be deleted. +*/ +function deleteAuthFromGroup($group,$auth){ + $sql = dbconnect(); + if (!isAlphaNumeric($group,$auth)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist

        "; + return false; + } + + $delQ = $sql->prepare_statement("delete from userGroupPrivs where gid=? and auth=?"); + $delR = $sql->exec_statement($delQ,array($gid,$auth)); + return true; +} + +/* showGroups() + prints a table of all the groups +*/ +function showGroups(){ + $sql = dbconnect(); + + $fetchQ = $sql->prepare_statement("select distinct gid, name from userGroups order by name"); + $fetchR = $sql->exec_statement($fetchQ); + + echo ""; + echo ""; + while ($row=$sql->fetch_array($fetchR)){ + echo ""; + } + echo "
        Group IDGroup Name
        $row[0]$row[1]
        "; + + return true; +} + +function getGroupList(){ + $sql = dbconnect(); + $ret = array(); + $prep = $sql->prepare_statement("SELECT name,gid FROM userGroups + GROUP BY name,gid ORDER BY name"); + $result = $sql->exec_statement($prep); + while($row = $sql->fetch_row($result)) + $ret[$row['gid']] = $row['name']; + return $ret; +} + +/* detailGroup(groupname) + prints out all the users and authorizations in + the given group +*/ +function detailGroup($group){ + if (!isAlphaNumeric($group)){ + return false; + } + + $sql = dbconnect(); + + $usersQ = $sql->prepare_statement("select gid,username from userGroups where name=? order by username"); + $usersR = $sql->exec_statement($usersQ,array($group)); + + $gid = 0; + echo ""; + echo ""; + while ($row = $sql->fetch_array($usersR)){ + $gid = $row[0]; + echo ""; + } + echo "
        Users
        $row[1]
        "; + + $authsQ = $sql->prepare_statement("select auth,sub_start,sub_end from userGroupPrivs where gid=? order by auth"); + $authsR = $sql->exec_statement($authsQ,array($gid)); + echo ""; + echo ""; + while ($row = $sql->fetch_array($authsR)){ + echo ""; + } + echo "
        Authorization ClassSubclass startSubclass End
        $row[0]$row[1]$row[2]
        "; +} + + +?> diff --git a/fannie/auth/login.php b/fannie/auth/login.php new file mode 100644 index 000000000..0c34cc663 --- /dev/null +++ b/fannie/auth/login.php @@ -0,0 +1,458 @@ +prepare_statement("select password,salt from Users where name=?"); + $gatherR = $sql->exec_statement($gatherQ,array($name)); + if ($sql->num_rows($gatherR) == 0){ + return false; + } + + $gatherRow = $sql->fetch_array($gatherR); + $crypt_pass = $gatherRow[0]; + $salt = $gatherRow[1]; + if (crypt($password,$salt) != $crypt_pass){ + return false; + } + + doLogin($name); + + return true; +} + +/* + Revised login for use with UNIX system + + shadowread searches the shadow password file + and returns the user's password hash +*/ + +function shadow_login($name,$passwd){ + if (!isAlphanumeric($name)) + return false; + if ($passwd == "") return false; + + $output = array(); + $return_value = -1; + exec("../shadowread/shadowread \"$name\"",$output,$return_value); + if ($return_value != 0) + return false; + + $pwhash = $output[0]; + if (crypt($passwd,$pwhash) == $pwhash){ + syncUserShadow($name); + doLogin($name); + return true; + } + return false; +} + +/* login using an ldap server + * + * Tested against openldap 2.3.27 + */ +function ldap_login($name,$passwd){ + global $FANNIE_LDAP_SERVER, $FANNIE_LDAP_PORT, $FANNIE_LDAP_DN, $FANNIE_LDAP_SEARCH_FIELD, $FANNIE_LDAP_UID_FIELD, $FANNIE_LDAP_RN_FIELD; + if (!isAlphanumeric($name)) + return false; + if ($passwd == "") return false; + + $conn = ldap_connect($FANNIE_LDAP_SERVER,$FANNIE_LDAP_PORT); + if (!$conn) return false; + + $search_result = ldap_search($conn,$FANNIE_LDAP_DN, + $FANNIE_LDAP_SEARCH_FIELD."=".$name); + if (!$search_result) return false; + + $ldap_info = ldap_get_entries($conn,$search_result); + if (!$ldap_info) return false; + + $user_dn = $ldap_info[0]["dn"]; + $uid = $ldap_info[0][$FANNIE_LDAP_UID_FIELD][0]; + $fullname = $ldap_info[0][$FANNIE_LDAP_RN_FIELD][0]; + + if (ldap_bind($conn,$user_dn,$passwd)){ + syncUserLDAP($name,$uid,$fullname); + doLogin($name); + return true; + } + return false; +} + +/* +sets a cookie. nothing before this function call can have output +*/ +function logout(){ + $name = checkLogin(); + if (!$name){ + return true; + } + + /** + Remove session data from the database + */ + if (isset($_COOKIE['session_data'])){ + $cookie_data = base64_decode($_COOKIE['session_data']); + $session_data = unserialize($cookie_data); + + $name = $session_data['name']; + $session_id = $session_data['session_id']; + $uid = getUID($name); + + $sql = dbconnect(); + $delP = $sql->prepare_statement('DELETE FROM userSessions + WHERE uid=? AND session_id=?'); + $delR = $sql->exec_statement($delP, array($uid,$session_id)); + + $upP = $sql->prepare_statement("UPDATE Users SET session_id='' WHERE name=?"); + $upR = $sql->exec_statement($upP,array($name)); + } + + setcookie('session_data','',time()+(60*600),'/'); + return true; +} + +/* +logins are stored in a table called Users +information in the table includes an alphanumeric +user name, an alphanumeric password (stored in crypted form), +the salt used to crypt the password (time of user creation), +and a unique user-id number between 0001 and 9999 +a session id is also stored in this table, but that is created +when the user actually logs in +*/ +function createLogin($name,$password){ + // 10Nov12 EL Add FANNIE_AUTH_ENABLED + global $FANNIE_AUTH_ENABLED; + if (!isAlphanumeric($name) ){ + //echo 'failed alphanumeric'; + return false; + } + + if (init_check()) + table_check(); + + // 10Nov12 EL Add FANNIE_AUTH_ENABLED test per intent in first-user call from auth.php. + if ( $FANNIE_AUTH_ENABLED ) { + if (!validateUser('admin')){ + return false; + } + } + + $sql = dbconnect(); + $checkQ = $sql->prepare_statement("select * from Users where name=?"); + $checkR = $sql->exec_statement($checkQ,array($name)); + if ($sql->num_rows($checkR) != 0){ + return false; + } + + $salt = time(); + $crypt_pass = crypt($password,$salt); + + // generate unique user-id between 0001 and 9999 + // implicit assumption: there are less than 10,000 + // Users currently in the database + $uid = ''; + srand($salt); + $verifyQ = $sql->prepare_statement("select * from Users where uid=?"); + while ($uid == ''){ + $newid = (rand() % 9998) + 1; + $newid = str_pad($newid,4,'0',STR_PAD_LEFT); + $verifyR = $sql->exec_statement($verifyQ,array($newid)); + if ($sql->num_rows($verifyR) == 0){ + $uid = $newid; + } + } + + $addQ = $sql->prepare_statement("insert into Users (name,uid,password,salt) values (?,?,?,?)"); + $addR = $sql->exec_statement($addQ,array($name,$uid,$crypt_pass,$salt)); + + return true; +} + +function deleteLogin($name){ + if (!isAlphanumeric($name)){ + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $sql=dbconnect(); + $uid = getUID($name); + $delQ = $sql->prepare_statement("delete from userPrivs where uid=?"); + $delR = $sql->exec_statement($delQ,array($uid)); + + $deleteQ = $sql->prepare_statement("delete from Users where name=?"); + $deleteR = $sql->exec_statement($deleteQ,array($name)); + + $groupQ = $sql->prepare_statement("DELETE FROM userGroups WHERE name=?"); + $groupR = $sql->exec_statement($groupQ,array($name)); + + return true; +} + +/* +this function returns the name of the logged in +user on success, false on failure +*/ +function checkLogin(){ + if (!auth_enabled()) return 'null'; + + if (init_check()) + return 'init'; + + if (!isset($_COOKIE['session_data'])){ + return false; + } + + $cookie_data = base64_decode($_COOKIE['session_data']); + $session_data = unserialize($cookie_data); + + $name = $session_data['name']; + $session_id = $session_data['session_id']; + + if (!isAlphanumeric($name) or !isAlphanumeric($session_id)){ + return false; + } + + /** + New behavior: use dedicated userSessions table. + Could enforce expired, optionally + */ + $sql = dbconnect(); + $checkQ = $sql->prepare_statement("select * from Users AS u LEFT JOIN + userSessions AS s ON u.uid=s.uid where u.name=? + and s.session_id=?"); + $checkR = $sql->exec_statement($checkQ,array($name,$session_id)); + + if ($sql->num_rows($checkR) == 0){ + return false; + } + + return $name; +} + +function showUsers(){ + if (!validateUser('admin')){ + return false; + } + echo "Displaying current users"; + echo ""; + echo ""; + $sql = dbconnect(); + $usersQ = $sql->prepare_statement("select name,uid from Users order by name"); + $usersR = $sql->exec_statement($usersQ); + while ($row = $sql->fetch_array($usersR)){ + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        NameUser ID
        $row[0]$row[1]
        "; +} + +function getUserList(){ + $sql = dbconnect(); + $ret = array(); + $prep = $sql->prepare_statement("SELECT name,uid FROM Users ORDER BY name"); + $result = $sql->exec_statement($prep); + while($row = $sql->fetch_row($result)) + $ret[$row['uid']] = $row['name']; + return $ret; +} + +/* +this function uses login to verify the user's presented +name and password (thus creating a new session) rather +than using checkLogin to verify the correct user is +logged in. This is nonstandard usage. Normally checkLogin +should be used to determine who (if anyone) is logged in +(this way Users don't have to constantly provide passwords) +However, since the current password is provided, checking +it is slightly more secure than checking a cookie +*/ +function changePassword($name,$oldpassword,$newpassword){ + $sql = dbconnect(); + if (!login($name,$oldpassword)){ + return false; + } + + // the login functions checks its parameters for being + // alphanumeric, so only the newpassword needs to be checked + if (!isAlphanumeric($newpassword)){ + return false; + } + + $salt = time(); + $crypt_pass = crypt($newpassword,$salt); + + $updateQ = $sql->prepare_statement("update Users set password=?,salt=? where name=?"); + $updateR = $sql->exec_statement($updateQ,array($crypt_pass,$salt,$name)); + + return true; +} + +function changeAnyPassword($name,$newpassword){ + $sql = dbconnect(); + if (!validateUser('admin')){ + return false; + } + + if (!isAlphanumeric($newpassword) || !isAlphaNumeric($name)){ + return false; + } + + $salt = time(); + $crypt_pass = crypt($newpassword,$salt); + + $updateQ = $sql->prepare_statement("update Users set password=?,salt=? where name=?"); + $updateR = $sql->exec_statement($updateQ,array($crypt_pass,$salt,$name)); + + return true; +} + +/* +this function is here to reduce user validation checks to +a single function call. since this task happens ALL the time, +it just makes code cleaner. It returns the current user on +success just because that information might be useful +*/ +function validateUser($auth,$sub='all'){ + if (!auth_enabled()) return 'null'; + + if (init_check()) + return 'init'; + + $current_user = checkLogin(); + if (!$current_user){ + echo "You must be logged in to use this function"; + return false; + } + + $groupPriv = checkGroupAuth($current_user,$auth,$sub); + if ($groupPriv){ + return $current_user; + } + + $priv = checkAuth($current_user,$auth,$sub); + if (!$priv){ + echo "Your account doesn't have permission to use this function"; + return false; + } + return $current_user; +} + +function validateUserQuiet($auth,$sub='all'){ + if (!auth_enabled()) return 'null'; + + if (init_check()) + return 'init'; + + $current_user = checkLogin(); + if (!$current_user){ + return false; + } + + $groupPriv = checkGroupAuth($current_user,$auth,$sub); + if ($groupPriv){ + return $current_user; + } + + $priv = checkAuth($current_user,$auth,$sub); + if (!$priv){ + return false; + } + return $current_user; +} + +// re-sets expires timer on the cookie if the +// user is currently logged in +// must be called prior to any output +function refreshSession(){ + return true; + if (!isset($_COOKIE['session_data'])) + return false; + setcookie('session_data',$_COOKIE['session_data'],time()+(60*600),'/'); + return true; +} + +function pose($username){ + if (!isset($_COOKIE['session_data'])) + return false; + if (!isAlphanumeric($username)) + return false; + + $cookie_data = base64_decode($_COOKIE['session_data']); + $session_data = unserialize($cookie_data); + + $session_id = $session_data['session_id']; + + $sql = dbconnect(); + $sessionQ = $sql->prepare_statement("update Users set session_id = ? where name=?"); + $sessionR = $sql->exec_statement($sessionQ,array($session_id,$name)); + + $session_data = array("name"=>$username,"session_id"=>$session_id); + $cookie_data = serialize($session_data); + + setcookie('session_data',base64_encode($cookie_data),time()+(60*600),'/'); + + return true; +} + +?> diff --git a/fannie/auth/privileges.php b/fannie/auth/privileges.php new file mode 100644 index 000000000..b2d7f22ab --- /dev/null +++ b/fannie/auth/privileges.php @@ -0,0 +1,255 @@ +prepare_statement("insert into userPrivs values (?,?,?,?)"); + $addR = $sql->exec_statement($addQ,array($uid,$auth_class,$sub_start,$sub_end)); + return true; +} + +function createClass($name, $notes){ + if (!isAlphanumeric($name) ){ + return false; + } + + $sql = dbconnect(); + $checkQ = $sql->prepare_statement("select * from userKnownPrivs where auth_class='$name'"); + $checkR = $sql->exec_statement($checkQ); + if ($sql->num_rows($checkR) != 0){ + return true; + } + + if (!validateUser('admin')){ + return false; + } + + $notes = str_replace("\n","
        ",$notes); + $insQ = $sql->prepare_statement("INSERT INTO userKnownPrivs (auth_class, notes) + VALUES (?, ?)"); + $insR = $sql->exec_statement($insQ,array($name,$notes)); + return ($insR) ? true : false; +} + +function deleteClass($name){ + if (!isAlphanumeric($name) ){ + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $sql = dbconnect(); + + $q1 = $sql->prepare_statement("DELETE FROM userKnownPrivs WHERE auth_class=?"); + $r1 = $sql->exec_statement($q1,array($name)); + + $q2 = $sql->prepare_statement("DELETE FROM userPrivs WHERE auth_class=?"); + $r2 = $sql->exec_statement($q2,array($name)); + + $q3 = $sql->prepare_statement("DELETE FROM userGroupPrivs WHERE auth=?"); + $r3 = $sql->exec_statement($q3,array($name)); + return true; +} + +function deleteAuth($name,$auth_class){ + if (!isAlphanumeric($name) or !isAlphanumeric($auth_class)){ + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $uid = getUID($name); + if (!$uid){ + return false; + } + $sql = dbconnect(); + $delQ = $sql->prepare_statement("delete from userPrivs where uid=? and auth_class=?"); + $delR = $sql->exec_statement($delQ,array($uid,$auth_class)); + return true; +} + +function showAuths($name){ + if (!isAlphanumeric($name)){ + echo "Invalid name

        "; + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $uid = getUID($name); + if (!$uid){ + echo "No such user '$name'

        "; + return false; + } + echo "Showing authorizations for $name"; + echo ""; + echo ""; + echo ""; + $sql = dbconnect(); + $fetchQ = $sql->prepare_statement("select auth_class,sub_start,sub_end from userPrivs where uid=?"); + $fetchR = $sql->exec_statement($fetchQ,array($uid)); + while ($row = $sql->fetch_array($fetchR)){ + echo ""; + echo ""; + echo ""; + } + echo "
        Authorization classSubclass startSubclass end
        $row[0]$row[1]$row[2]
        "; + return true; +} + +function showClasses(){ + if (!validateUser('admin')){ + return false; + } + + echo "Showing authorization classes"; + echo ""; + echo ""; + echo ""; + $sql = dbconnect(); + $fetchQ = $sql->prepare_statement("select auth_class,notes from userKnownPrivs order by auth_class"); + $fetchR = $sql->exec_statement($fetchQ); + while ($row = $sql->fetch_array($fetchR)){ + echo ""; + echo ""; + echo ""; + } + echo "
        Authorization classNotes
        $row[0]".(empty($row[1])?' ':$row[1])."
        "; + return true; +} + +function getAuthNotes($name){ + $sql = dbconnect(); + $q = $sql->prepare_statement("SELECT notes FROM userKnownPrivs WHERE auth_class=?"); + $r = $sql->exec_statement($q,array($name)); + if ($sql->num_rows($r) == 0) return ""; + $w = $sql->fetch_row($r); + return str_replace("
        ","\n",$w['notes']); +} + +function updateAuthNotes($name,$notes){ + if (!validateUser('admin')){ + return false; + } + $sql = dbconnect(); + $notes = str_replace("\n","
        ",$notes); + $q = $sql->prepare_statement("UPDATE userKnownPrivs SET notes=? WHERE auth_class=?"); + $r = $sql->exec_statement($q,array($notes,$name)); + return true; +} + +function getAuthList(){ + $sql = dbconnect(); + $ret = array(); + $prep = $sql->prepare_statement("SELECT auth_class FROM userKnownPrivs ORDER BY auth_class"); + $result = $sql->exec_statement($prep); + while($row = $sql->fetch_Row($result)) + $ret[] = $row['auth_class']; + + if (!in_array('admin',$ret)){ + $ret[] = 'admin'; + sort($ret); + } + return $ret; +} + +/* +with how authorization checking currently works, sub classes +must be countable (i.e., a sub class must be able to be +tested as to whether or not it's 'between' start and end +*/ +function checkAuth($name,$auth_class,$sub='all'){ + if (init_check()) + return 'init'; + if (!isAlphanumeric($name) or !isAlphanumeric($auth_class) or !isAlphanumeric($sub)){ + return false; + } + $uid = getUID($name); + if (!$uid){ + return false; + } + $sql = dbconnect(); + $checkQ = $sql->prepare_statement("select * from userPrivs where uid=? and auth_class=? and + ((? between sub_start and sub_end) or (sub_start='all' and sub_end='all'))"); + $checkR = $sql->exec_statement($checkQ,array($uid,$auth_class,$sub)); + if ($sql->num_rows($checkR) == 0){ + return false; + } + return true; +} + +?> diff --git a/fannie/auth/shadowread/Makefile b/fannie/auth/shadowread/Makefile new file mode 100644 index 000000000..991cda546 --- /dev/null +++ b/fannie/auth/shadowread/Makefile @@ -0,0 +1,10 @@ +CC=gcc +FLAGS= + +shadowread: shadowread.c + $(CC) $(FLAGS) -o shadowread shadowread.c + +install: + chown root:root shadowread + chmod 755 shadowread + chmod u+s shadowread diff --git a/fannie/auth/shadowread/README b/fannie/auth/shadowread/README new file mode 100644 index 000000000..b687da942 --- /dev/null +++ b/fannie/auth/shadowread/README @@ -0,0 +1,22 @@ +This is a simple program to read password hashes from +a shadowed password file. I originally wanted to use PAM, +but the "offical" PHP PAM suggestion was "make the shadow +password file group readable", which frankly doesn't seem +any more secure than this. I'm using the setuid bit instead +to grant this program restricted access to the shadow file. + +USAGE: +shadowread requires one argument: a username + +RETURNS: + 0 if a hash is found for the user; + 1 in all other cases + +NOTES: +* shadowread will not honor requests for user 'root' +* If the password hash field has a length less than 5, + shadowread assumes the user has no password + +INSTALL: +$ make +# make install diff --git a/fannie/auth/shadowread/shadowread.c b/fannie/auth/shadowread/shadowread.c new file mode 100644 index 000000000..dc1d60ef0 --- /dev/null +++ b/fannie/auth/shadowread/shadowread.c @@ -0,0 +1,78 @@ +/******************************************************************************* + * + * Copyright 2009 Whole Foods Co-op + * + * This file is part of Fannie. + * + * Fannie is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Fannie is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * in the file license.txt along with IS4C; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * *********************************************************************************/ + +#include +#include +#include +#include + +const char* SHADOW_FILE = "/etc/shadow"; + +int main(int argc, char** argv){ + FILE* fp; + char buffer[1024]; + char* name; + char* tmp_name; + char* tmp_passwd; + + if (argc != 2){ + printf("Usage: shadowread \n"); + return 1; + } + + name = argv[1]; + + if (strcmp(name,"root") == 0){ + printf("Error: invalid user\n"); + return 1; + } + + fp = fopen(SHADOW_FILE,"r"); + if (fp == NULL){ + printf("Couldn't open %s\n",SHADOW_FILE); + return 1; + } + + while( fgets(buffer,1024,fp) != NULL){ + tmp_name = strtok(buffer,":"); + if (tmp_name == NULL) continue; + if (strcmp(name,tmp_name) == 0){ + tmp_passwd = strtok(NULL,":"); + if (tmp_passwd == NULL){ + printf("No password found\n"); + return 1; + } + else if (strlen(tmp_passwd)<5){ + printf("Doesn't appear to be a password\n"); + return 1; + } + else { + printf("%s\n",tmp_passwd); + return 0; + } + } + } + + fclose(fp); + + return 1; +} diff --git a/fannie/auth/ui/addAuth.php b/fannie/auth/ui/addAuth.php new file mode 100644 index 000000000..1f296ca45 --- /dev/null +++ b/fannie/auth/ui/addAuth.php @@ -0,0 +1,70 @@ +"; + echo "Main menu | Try again?"; + return; + } + echo "Authorization added

        "; + echo "Main menu"; +} +else { + echo "

        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Username:
        Authorization class:
        Subclass start:
        Subclass end:
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/addGroup.php b/fannie/auth/ui/addGroup.php new file mode 100644 index 000000000..4df6eb067 --- /dev/null +++ b/fannie/auth/ui/addGroup.php @@ -0,0 +1,60 @@ +"; + } +} +else { + echo "

        "; + echo ''; + echo ""; +echo ""; + echo '
        Group name
        Username
        '; + echo "
        "; +} +?> +

        +Main menu + + diff --git a/fannie/auth/ui/addGroupAuth.php b/fannie/auth/ui/addGroupAuth.php new file mode 100644 index 000000000..9b38a44df --- /dev/null +++ b/fannie/auth/ui/addGroupAuth.php @@ -0,0 +1,69 @@ +Main menu | Try again?"; + return; + } + echo "Authorization added

        "; + echo "Main menu"; +} +else { + echo "

        "; + echo ""; +echo ""; +echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Group name
        Authorization
        Subclass start:
        Subclass end:
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/addGroupUser.php b/fannie/auth/ui/addGroupUser.php new file mode 100644 index 000000000..551490ad4 --- /dev/null +++ b/fannie/auth/ui/addGroupUser.php @@ -0,0 +1,62 @@ +"; + } +} +else { + echo "

        "; + echo ''; +echo ""; +echo ""; + echo '
        Group name
        Username
        '; + echo "
        "; +} +?> +

        +Main menu + diff --git a/fannie/auth/ui/changepass.php b/fannie/auth/ui/changepass.php new file mode 100644 index 000000000..1eb4c8d3f --- /dev/null +++ b/fannie/auth/ui/changepass.php @@ -0,0 +1,72 @@ +Login?"; +} +else { + if (isset($_POST['name'])){ + $name = $_POST['name']; + $oldpass = $_POST['oldpass']; + $newpass1 = $_POST['newpass1']; + $newpass2 = $_POST['newpass2']; + if ($newpass1 != $newpass2){ + echo "Passwords don't match

        "; + echo "Try again | Main menu"; + } + else { + $success = changePassword($name,$oldpass,$newpass1); + if (!$success){ + echo "Password change failed. Ensure the old password is correct and that the new password is alphanumeric

        "; + echo "Try again | Main menu"; + } + else { + echo "Password changed successfully

        "; + echo "Continue"; + } + } + } + else { + echo "

        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Username:$name
        Old password:
        New password:
        New password, again:
        "; + } +} + +include($path."src/footer.html"); + +?> diff --git a/fannie/auth/ui/createClass.php b/fannie/auth/ui/createClass.php new file mode 100644 index 000000000..65369deab --- /dev/null +++ b/fannie/auth/ui/createClass.php @@ -0,0 +1,63 @@ +"; + echo "Main menu | Try again?"; + return; + } + $success = createClass($name,$notes); + if (!$success){ + echo "Unable to create class. Perhaps '$name' is already in use

        "; + echo "Main menu | Try again?"; + return; + } + echo "Class '$name' created succesfully

        "; + echo "Main menu"; +} +else { + echo "

        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/createUser.php b/fannie/auth/ui/createUser.php new file mode 100644 index 000000000..3cb6f87a6 --- /dev/null +++ b/fannie/auth/ui/createUser.php @@ -0,0 +1,65 @@ +"; + echo "Main menu | Try again?"; + return; + } + $success = createLogin($name,$pass1); + if (!$success){ + echo "Unable to create user. Another user probably already has username '$name'

        "; + echo "Main menu | Try again?"; + return; + } + echo "User '$name' created succesfully

        "; + echo "Main menu"; +} +else { + echo ""; + echo "

        Class Name:
        Notes:
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/deleteAuth.php b/fannie/auth/ui/deleteAuth.php new file mode 100644 index 000000000..d5194f103 --- /dev/null +++ b/fannie/auth/ui/deleteAuth.php @@ -0,0 +1,91 @@ +"; + echo "Main menu | Try again?"; + return; + } + echo "Authorizations deleted

        "; + echo "Main menu"; + +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + $class = $_POST['class']; + echo "Are you sure you want to delete ALL authorizations for $name in class $class?

        "; + if ($class == 'admin'){ + echo "

        IF YOU DELETE ADMIN AUTHORIZATIONS FROM A USER, THEY WILL NO LONGER BE ABLE "; + echo "TO EDIT USERS OR AUTHORIZATIONS. BE SURE YOU'RE NOT DELETING YOUR OWN "; + echo "ADMIN AUTHORIZATIONS (UNLESS YOU REALLY MEAN TO)

        "; + } + echo "
        Username:
        Password:
        Password, again:
        "; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        "; +} +else { + echo "WARNING: this will delete ALL authorizations for a user in a given authorization class. "; + echo "If you need finer-grained control over a user with multiple authorizations in the "; + echo "same class (e.g., multiple sub-class ranges) you should edit in SQL

        "; + echo "

        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Username:
        Authorization class:
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/deleteClass.php b/fannie/auth/ui/deleteClass.php new file mode 100644 index 000000000..453a7cd7c --- /dev/null +++ b/fannie/auth/ui/deleteClass.php @@ -0,0 +1,67 @@ +"; + echo "Main menu"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + echo "Are you sure you want to delete class '$name'?

        "; + echo ""; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo "
        "; + echo ""; + echo "
        "; +} +else { + echo "

        "; +echo "Class:"; +echo '   '; + echo ""; + echo "
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/deleteGroup.php b/fannie/auth/ui/deleteGroup.php new file mode 100644 index 000000000..933f625d4 --- /dev/null +++ b/fannie/auth/ui/deleteGroup.php @@ -0,0 +1,72 @@ +Main menu | Try again?"; + return; + } + echo "Group $name deleted

        "; + echo "Main menu"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + echo "Are you sure you want to delete group '$name'?

        "; + echo ""; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo "
        "; + echo ""; + echo "
        "; +} +else { + echo "

        "; +echo "Group name:"; + echo ""; +echo '   '; + echo "
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> + diff --git a/fannie/auth/ui/deleteGroupAuth.php b/fannie/auth/ui/deleteGroupAuth.php new file mode 100644 index 000000000..7f34cf4cf --- /dev/null +++ b/fannie/auth/ui/deleteGroupAuth.php @@ -0,0 +1,85 @@ +Main menu | Try again?"; + return; + } + echo "Authorizations deleted

        "; + echo "Main menu"; + +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + $class = $_POST['class']; + echo "Are you sure you want to delete ALL authorizations for $name in class $class?

        "; + echo ""; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        "; + echo ""; + echo "
        "; +} +else { + echo "WARNING: this will delete ALL authorizations for a group in a given authorization class. "; + echo "If you need finer-grained control over a group with multiple authorizations in the "; + echo "same class (e.g., multiple sub-class ranges) you should edit in SQL

        "; + echo "

        "; + echo ""; +echo ""; +echo ""; + echo ""; + echo ""; + echo "
        Group name
        Group name
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/deleteGroupUser.php b/fannie/auth/ui/deleteGroupUser.php new file mode 100644 index 000000000..e07462d42 --- /dev/null +++ b/fannie/auth/ui/deleteGroupUser.php @@ -0,0 +1,81 @@ +Main menu | Try again?"; + return; + } + echo "User $user deleted from $name

        "; + echo "Main menu"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + $user = $_POST['user']; + echo "Are you sure you want to delete user $user from group '$name'?

        "; + echo ""; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        "; + echo ""; + echo "
        "; +} +else { + echo "

        "; + echo ''; +echo ""; +echo ""; + echo '
        Group name
        Username
        '; + echo ""; + echo ""; + echo "
        "; + echo "

        Main menu"; + +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/deleteUser.php b/fannie/auth/ui/deleteUser.php new file mode 100644 index 000000000..393098b14 --- /dev/null +++ b/fannie/auth/ui/deleteUser.php @@ -0,0 +1,72 @@ +"; + echo "Main menu | Try again?"; + return; + } + echo "User $name deleted

        "; + echo "Main menu"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + echo "Are you sure you want to delete user '$name'?

        "; + echo ""; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo "
        "; + echo ""; + echo "
        "; +} +else { + echo "

        "; +echo "Username:"; +echo '   '; + echo ""; + echo "
        "; + echo "

        Main menu"; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/editClassNotes.php b/fannie/auth/ui/editClassNotes.php new file mode 100644 index 000000000..84fd204c8 --- /dev/null +++ b/fannie/auth/ui/editClassNotes.php @@ -0,0 +1,72 @@ +"; + echo "Main menu | Try again?"; + return; + } + $success = updateAuthNotes($name,$notes); + echo "Class '$name' updated succesfully

        "; + echo "Main menu"; +} +else if (isset($_POST['button1'])){ + $name = $_POST['name']; + echo "

        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +else { + echo ""; + echo "
        Authorization class:
        Notes
        "; + echo ""; + echo ""; + echo ""; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/groupDetail.php b/fannie/auth/ui/groupDetail.php new file mode 100644 index 000000000..ed6408ce7 --- /dev/null +++ b/fannie/auth/ui/groupDetail.php @@ -0,0 +1,59 @@ +"; +echo "Group name to view: "; +echo '   '; +echo ''; + +?> +

        +Main menu + diff --git a/fannie/auth/ui/index.php b/fannie/auth/ui/index.php new file mode 100644 index 000000000..6f4a785d6 --- /dev/null +++ b/fannie/auth/ui/index.php @@ -0,0 +1,36 @@ + + diff --git a/fannie/auth/ui/loginform.php b/fannie/auth/ui/loginform.php new file mode 100644 index 000000000..b9bef8e7f --- /dev/null +++ b/fannie/auth/ui/loginform.php @@ -0,0 +1,104 @@ +"; + if (isset($_GET['redirect'])){ + echo "It looks like you don't have permission to access this page

        "; + } + echo "Main menu | Logout?"; + include($auth_path."src/footer.html"); +} +else { + if (isset($_POST['name'])){ + $name = $_POST['name']; + $password = $_POST['password']; + $login = login($name,$password); + $redirect = $_POST['redirect']; + + if (!$login && $FANNIE_AUTH_LDAP) + $login = ldap_login($name,$password); + + if (!$login && $FANNIE_AUTH_SHADOW) + $login = shadow_login($name,$password); + + if ($login){ + header("Location: $redirect"); + } + else { + include($auth_path."src/header.html"); + echo ""; + echo "Login failed. Try again?"; + include($auth_path."src/footer.html"); + } + } + else { + $redirect = 'menu.php'; + if (isset($_GET['redirect'])){ + $redirect = $_GET['redirect']; + } + include($auth_path."src/header.html"); + if (isset($_GET['logout'])) + echo "

        You've logged out
        "; + echo ""; + echo "
        Authorization class:
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Name:
        Password:
        "; + echo ""; + echo ""; + echo ""; + include($auth_path."src/footer.html"); + } +} + + +?> + diff --git a/fannie/auth/ui/logout.php b/fannie/auth/ui/logout.php new file mode 100644 index 000000000..0a2cb3a3a --- /dev/null +++ b/fannie/auth/ui/logout.php @@ -0,0 +1,35 @@ +"; +echo "You have logged out successfully"; +echo ""; + +?> diff --git a/fannie/auth/ui/menu.php b/fannie/auth/ui/menu.php new file mode 100644 index 000000000..c2d7845c7 --- /dev/null +++ b/fannie/auth/ui/menu.php @@ -0,0 +1,79 @@ +logged in to use this"; +} +else { + $priv = checkAuth($name,'admin'); + $options = 'all'; + if (!$priv){ + $options = 'limited'; + } + + /* password change only allowed if not using + UNIX or LDAP passwords */ + echo "Welcome $name

        "; + echo "

        "; +} + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/pose.php b/fannie/auth/ui/pose.php new file mode 100644 index 000000000..d6a68e08d --- /dev/null +++ b/fannie/auth/ui/pose.php @@ -0,0 +1,58 @@ + +
        +"; +foreach(getUserList() as $uid => $name) + echo ""; +echo ""; +echo '   '; +?> +
        + diff --git a/fannie/auth/ui/resetUserPassword.php b/fannie/auth/ui/resetUserPassword.php new file mode 100644 index 000000000..1c23d93e6 --- /dev/null +++ b/fannie/auth/ui/resetUserPassword.php @@ -0,0 +1,69 @@ +"; + echo 'New password is: '.$newpass.'

        '; + } +} +else { + echo "

        "; + echo "User name: '; + echo "
        "; +} +echo '

        '; +echo 'Main menu'; +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/viewAuths.php b/fannie/auth/ui/viewAuths.php new file mode 100644 index 000000000..5f03c7320 --- /dev/null +++ b/fannie/auth/ui/viewAuths.php @@ -0,0 +1,51 @@ +"; +echo "

        "; +echo "Username:"; +echo '   '; +echo "
        "; +echo "Main menu"; + +include($path."src/footer.html"); +?> diff --git a/fannie/auth/ui/viewClasses.php b/fannie/auth/ui/viewClasses.php new file mode 100644 index 000000000..3ff06e467 --- /dev/null +++ b/fannie/auth/ui/viewClasses.php @@ -0,0 +1,43 @@ + +

        +Main menu + diff --git a/fannie/auth/ui/viewGroups.php b/fannie/auth/ui/viewGroups.php new file mode 100644 index 000000000..1b770118e --- /dev/null +++ b/fannie/auth/ui/viewGroups.php @@ -0,0 +1,43 @@ + +

        +Main menu + diff --git a/fannie/auth/ui/viewUsers.php b/fannie/auth/ui/viewUsers.php new file mode 100644 index 000000000..9a6013cb9 --- /dev/null +++ b/fannie/auth/ui/viewUsers.php @@ -0,0 +1,43 @@ + +

        +Main menu + diff --git a/fannie/auth/utilities.php b/fannie/auth/utilities.php new file mode 100644 index 000000000..00c0358ea --- /dev/null +++ b/fannie/auth/utilities.php @@ -0,0 +1,306 @@ + 1) $uri = $tmp[0]; + foreach(explode("/",$uri) as $x){ + if (strpos($x,".php") === False + && strlen($x) != 0){ + $path .= "../"; + } + if (!$found && stripos($x,"fannie") !== False){ + $found = True; + $path = ""; + } + + } + return $path; +} + +function init_check(){ + $path = guesspath(); + return file_exists($path."auth/init.php"); +} + +/* +checking whether a string is alphanumeric is +a good idea to prevent sql injection +*/ +function isAlphanumeric($str){ + if (preg_match("/^\\w*$/",$str) == 0){ + return false; + } + return true; +} + +function getUID($name){ + if (!auth_enabled()) return '0000'; + + $sql = dbconnect(); + $fetchQ = $sql->prepare_statement("select uid from Users where name=?"); + $fetchR = $sql->exec_statement($fetchQ,array($name)); + if ($sql->num_rows($fetchR) == 0){ + return false; + } + $uid = $sql->fetch_array($fetchR); + $uid = $uid[0]; + return $uid; +} + +function getNumUsers(){ + if (!auth_enabled()) return 9999; + + $sql = dbconnect(); + $fetchQ = $sql->prepare_statement("select uid from Users"); + $fetchR = $sql->exec_statement($fetchQ); + + return $sql->num_rows($fetchR); +} + +function getNumAdmins(){ + $sql = dbconnect(); + $num = 0; + if ($sql->table_exists('userPrivs')){ + $q = $sql->prepare_statement("SELECT uid FROM userPrivs WHERE auth_class='admin'"); + $r = $sql->exec_statement($q); + $num += $sql->num_rows($r); + } + if ($sql->table_exists('userGroups') && $sql->table_exists('userGroupPrivs')){ + $q = $sql->prepare_statement("SELECT username FROM userGroups AS g LEFT JOIN + userGroupPrivs AS p ON g.gid=p.gid + WHERE p.auth='admin'"); + $r = $sql->exec_statement($q); + $num += $sql->num_rows($r); + + } + return $num; +} + +function getGID($group){ + // 11Nov12 EL Bring in config for SERVER_DBMS test. + $path = guesspath(); + include($path."config.php"); + + if (!isAlphaNumeric($group)) + return false; + $sql = dbconnect(); + + $gidQ = "select gid from userGroups where name=?"; + $gidQ = $sql->add_select_limit($gidQ,1); + $gidP = $sql->prepare_statement($gidQ); + $gidR = $sql->exec_statement($gidP,array($group)); + + if ($sql->num_rows($gidR) == 0) + return false; + + $row = $sql->fetch_array($gidR); + return $row[0]; +} + +function genSessID(){ + $session_id = ''; + srand(time()); + for ($i = 0; $i < 50; $i++){ + $digit = (rand() % 35) + 48; + if ($digit > 57){ + $digit+=7; + } + $session_id .= chr($digit); + } + return $session_id; +} + +function doLogin($name){ + $session_id = genSessID(); + + $sql = dbconnect(); + $sessionQ = $sql->prepare_statement("update Users set session_id = ? where name=?"); + $sessionR = $sql->exec_statement($sessionQ,array($session_id,$name)); + + /** + Periodically purge expired records + 9May13 EL Not periodic. + */ + $delP = $sql->prepare_statement('DELETE FROM userSessions + WHERE expires < '.$sql->now()); + $delR = $sql->exec_statement($delP); + + /** + New behavior - Store session id in dedicated table. + This allows more than one session record per user + record - i.e., someone can be logged in on multiple + computers simultaneously. + */ + $uid = getUID($name); + $ip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : 'unknown'; + $expires = date('Y-m-d',strtotime('tomorrow')); + $sessionP = $sql->prepare_statement('INSERT INTO userSessions + (uid,session_id,ip,expires) + VALUES (?,?,?,?)'); + $sessionR = $sql->exec_statement($sessionP,array($uid,$session_id,$ip,$expires)); + + $session_data = array("name"=>$name,"session_id"=>$session_id); + $cookie_data = serialize($session_data); + + setcookie('session_data',base64_encode($cookie_data),time()+(60*600),'/'); +} + +function syncUserShadow($name){ + $localdata = posix_getpwnam($name); + + $currentUID = getUID($name); + $posixUID = str_pad($localdata['uid'],4,"0",STR_PAD_LEFT); + $realname = str_replace("'","''",$localdata['gecos']); + $sql = dbconnect(); + + if (!$currentUID){ + $addQ = $sql->prepare_statement("INSERT INTO Users + (name,password,salt,uid,session_id,real_name) + VALUES (?,'','',?,'',?)"); + $sql->exec_statement($addQ,array($name,$posixUID,$realname)); + } + else { + $upQ1 = $sql->prepare_statement("UPDATE Users SET real_name=? + WHERE name=?"); + $sql->exec_statement($upQ1,array($realname,$name)); + } +} + +function syncUserLDAP($name,$uid,$fullname){ + $currentUID = getUID($name); + $sql = dbconnect(); + + if (!$currentUID){ + $addQ = $sql->prepare_statement("INSERT INTO Users + (name,password,salt,uid,session_id,real_name) + VALUES (?,'','',?,'',?)"); + $sql->exec_statement($addQ,array($name,$uid,$fullname)); + } + else { + $upQ1 = $sql->prepare_statement("UPDATE Users SET real_name=? + WHERE name=?"); + $sql->exec_statement($upQ1,array($fullname,$name)); + } +} + +function auth_enabled(){ + global $FANNIE_AUTH_ENABLED; + if (!isset($FANNIE_AUTH_ENABLED)){ + $path = guesspath(); + include($path."config.php"); + return $FANNIE_AUTH_ENABLED; + } + else + return $FANNIE_AUTH_ENABLED; +} + +function table_check(){ + $sql = dbconnect(); + if (!$sql->table_exists('Users')){ + $p = $sql->prepare_statement("CREATE TABLE Users ( + name varchar(50), + password varchar(50), + salt varchar(10), + uid varchar(4), + session_id varchar(50), + real_name varchar(75), + PRIMARY KEY (name) + )"); + $sql->exec_statement($p); + } + if (!$sql->table_exists('userPrivs')){ + $p = $sql->prepare_statement("CREATE TABLE userPrivs ( + uid varchar(4), + auth_class varchar(50), + sub_start varchar(50), + sub_end varchar(50) + )"); + $sql->exec_statement($p); + } + if (!$sql->table_exists('userKnownPrivs')){ + $p = $sql->prepare_statement("CREATE TABLE userKnownPrivs ( + auth_class varchar(50), + notes text, + PRIMARY KEY (auth_class) + )"); + $sql->exec_statement($p); + } + if (!$sql->table_exists('userGroups')){ + $sql->prepare_statement("CREATE TABLE userGroups ( + gid int, + name varchar(50), + username varchar(50) + )"); + $sql->exec_statement($p); + } + if (!$sql->table_exists('userGroupPrivs')){ + $sql->prepare_statement("CREATE TABLE userGroupPrivs ( + gid int, + auth varchar(50), + sub_start varchar(50), + sub_end varchar(50) + )"); + $sql->exec_statement($p); + } + if (!$sql->table_exists('userSessions')){ + $p = $sql->prepare_statement("CREATE TABLE userSessions ( + uid varchar(4), + session_id varchar(50), + ip varchar(45), + expires datetime, + PRIMARY KEY (uid,session_id) + )"); + $sql->exec_statement($p); + } +} + +?> diff --git a/fannie/batches/AdDates/index.php b/fannie/batches/AdDates/index.php new file mode 100644 index 000000000..db716c05f --- /dev/null +++ b/fannie/batches/AdDates/index.php @@ -0,0 +1,69 @@ +prepare_statement("INSERT INTO AdSaleDates (sale_name,start_date,end_date) + VALUES (?,?,?)"); + $r = $dbc->exec_statement($q,array($_REQUEST['sn'],$_REQUEST['sd'],$_REQUEST['ed'])); + } +} + +printf('', + $FANNIE_URL.'src/CalendarControl.js'); + +echo '

        '; +echo ''; +echo '   '; +echo ''; +echo '   '; +echo ''; +echo '   '; +echo ''; +echo '
        '; + +echo '
        '; +$q = $dbc->prepare_statement("SELECT sale_name,start_date,end_date FROM AdSaleDates + ORDER BY start_date,sale_name"); +$r = $dbc->exec_statement($q); +echo ''; +while($w = $dbc->fetch_row($r)){ + printf('', + $w['sale_name'], + (array_shift(explode(' ',$w['start_date']))), + (array_shift(explode(' ',$w['end_date']))) + ); +} +echo '
        %s%s%s
        '; + +/* html footer */ +include($FANNIE_ROOT.'src/footer.html'); diff --git a/fannie/batches/BatchIndexPage.php b/fannie/batches/BatchIndexPage.php new file mode 100644 index 000000000..976aaf118 --- /dev/null +++ b/fannie/batches/BatchIndexPage.php @@ -0,0 +1,57 @@ + +
          +
        • Sales Batches is a tool to create + batches manually one item at a time.
        • +
        • Upload Batch is a tool to create + a batch from a spreadsheet.
        • +
        • Manage Batch Types adds, removes, or + adjusts batch types
        • +
        • Co+op Deals imports the Co+op Deals pricing + spreadsheet, determines where sale items exist in POS, + and creates appropriate sales batches.
        • +
        • Vendor Pricing imports cost information + from vendor spreadsheets, calculates SRPs based on desired + margins, and creates price change batches to apply new + SRPs.
        • +
        + draw_page(); +} +?> diff --git a/fannie/batches/BatchTypeEditor.php b/fannie/batches/BatchTypeEditor.php new file mode 100644 index 000000000..67562d827 --- /dev/null +++ b/fannie/batches/BatchTypeEditor.php @@ -0,0 +1,148 @@ + "None (Change regular price)", + 1 => "Sale for Everyone", + 2 => "Sale for Members" + ); + + protected $title = 'Fannie - Batch Module'; + protected $header = 'Sales Batches'; + + function preprocess(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + if (FormLib::get_form_value('saveDesc') !== ''){ + $q = $dbc->prepare_statement("UPDATE batchType + SET typeDesc=? WHERE batchTypeID=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveDesc'), + FormLib::get_form_value('bid') + )); + echo "Desc saved"; + return False; // ajax call + } + if (FormLib::get_form_value('saveType') !== ''){ + $q = $dbc->prepare_statement("UPDATE batchType + SET discType=? WHERE batchTypeID=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveType'), + FormLib::get_form_value('bid') + )); + echo "Desc saved"; + return False; // ajax call + } + if (FormLib::get_form_value('addtype') !== ''){ + $p = $dbc->prepare_statement("SELECT MAX(batchTypeID) FROM batchType"); + $r = $dbc->exec_statement($p); + $id = array_pop($dbc->fetch_row($r)); + $id = (empty($id)) ? 1 : $id + 1; + + $ins = $dbc->prepare_statement("INSERT INTO batchType (batchTypeID,typeDesc,discType) + VALUES (?,'New Type',1)"); + $dbc->exec_statement($ins,array($id)); + } + else if (FormLib::get_form_value('deltype') !== ''){ + $q = $dbc->prepare_statement("DELETE FROM batchType WHERE batchTypeID=?"); + $dbc->exec_statement($q,array(FormLib::get_form_value('bid'))); + } + + return True; + } + + function javascript_content(){ + ob_start(); + ?> +function saveDesc(val,bid){ + $.ajax({ + url: 'BatchTypeEditor.php', + cache: false, + type: 'post', + data: 'saveDesc='+val+'&bid='+bid, + success: function(data){ + } + }); +} +function saveType(val,bid){ + $.ajax({ + url: 'BatchTypeEditor.php', + cache: false, + type: 'post', + data: 'saveType='+val+'&bid='+bid, + success: function(data){ + } + }); +} + prepare_statement("SELECT batchTypeID,typeDesc,discType FROM batchType ORDER BY batchTypeID"); + $r = $dbc->exec_statement($q); + + $ret = ''; + $ret .= ''; + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf(' + + '; + $ret .= sprintf('',$w['batchTypeID']); + } + $ret .= '
        ID#DescriptionDiscount Type 
        %dDelete +
        '; + + $ret .= '
        Create New Type'; + + return $ret; + } +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new BatchTypeEditor(); + $obj->draw_page(); +} + +?> diff --git a/fannie/batches/CAP/CapSalesIndexPage.php b/fannie/batches/CAP/CapSalesIndexPage.php new file mode 100644 index 000000000..b42a7c2ce --- /dev/null +++ b/fannie/batches/CAP/CapSalesIndexPage.php @@ -0,0 +1,47 @@ + + + draw_page(); +} +?> diff --git a/fannie/batches/CAP/CoopDealsReviewPage.php b/fannie/batches/CAP/CoopDealsReviewPage.php new file mode 100644 index 000000000..699459670 --- /dev/null +++ b/fannie/batches/CAP/CoopDealsReviewPage.php @@ -0,0 +1,150 @@ +mode = 'results'; + return True; + } + + function body_content(){ + if ($this->mode == 'form') + return $this->form_content(); + elseif($this->mode == 'results') + return $this->results_content(); + } + + function results_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $start = FormLib::get_form_value('start',date('Y-m-d')); + $end = FormLib::get_form_value('end',date('Y-m-d')); + $b_start = FormLib::get_form_value('bstart',date('Y-m-d')); + $b_end = FormLib::get_form_value('bend',date('Y-m-d')); + $nameing = FormLib::get_form_value('naming',''); + $upcs = FormLib::get_form_value('upc',array()); + $prices = FormLib::get_form_value('price',array()); + $names = FormLib::get_form_value('batch',array()); + $batchIDs = array(); + + $batchP = $dbc->prepare_statement('INSERT INTO batches (batchName, batchType, + discountType, priority, startDate, endDate) VALUES + (?, ?, ?, 0, ?, ?)'); + $listP = $dbc->prepare_statement('INSERT INTO batchList (upc, batchID, salePrice, active) + VALUES (?, ?, ?, 0)'); + for($i=0;$iexec_statement($batchP,$args); + $bID = $dbc->insert_id(); + $batchIDs[$names[$i]] = $bID; + } + $id = $batchIDs[$names[$i]]; + $args = array( + $upcs[$i], + $id, + sprintf("%.2f",$prices[$i]) + ); + $dbc->exec_statement($listP,$args); + } + + $ret = "New sales batches have been created!

        "; + $ret .= "View batches"; + return $ret; + } + + + function form_content(){ + global $FANNIE_OP_DB, $FANNIE_URL; + $dbc = FannieDB::get($FANNIE_OP_DB); + $query = $dbc->prepare_statement("SELECT t.upc,p.description,t.price, + CASE WHEN s.super_name IS NULL THEN 'sale' ELSE s.super_name END as batch, + t.abtpr as subbatch + FROM tempCapPrices as t + INNER JOIN products AS p + on t.upc = p.upc LEFT JOIN + MasterSuperDepts AS s + ON p.department=s.dept_ID + ORDER BY s.super_name,t.upc"); + $result = $dbc->exec_statement($query); + + $ret = "

        + + "; + while($row = $dbc->fetch_row($result)){ + $ret .= sprintf("", + $row[0],$row[1],$row[2],$row[3],$row[4]); + $ret .= sprintf(" + + ", + $row[0],$row[2],$row[3],$row[4]); + } + $ret .= "
        UPCDescSale PriceBatch
        %s%s%.2f%s Co-op Deals %s

        + + + + + + + + + + +
        A Start
        A End
        B Start
        B End
        Month
        + +

        "; + + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new CoopDealsReviewPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/batches/CAP/CoopDealsUploadPage.php b/fannie/batches/CAP/CoopDealsUploadPage.php new file mode 100644 index 000000000..9366fc356 --- /dev/null +++ b/fannie/batches/CAP/CoopDealsUploadPage.php @@ -0,0 +1,143 @@ + array( + 'name' => 'upc', + 'display_name' => 'UPC', + 'default' => 7, + 'required' => True + ), + 'price' => array( + 'name' => 'price', + 'display_name' => 'Sale Price', + 'default' => 24, + 'required' => True + ), + 'abt' => array( + 'name' => 'abt', + 'display_name' => 'A/B/TPR', + 'default' => 5, + 'required' => True + ), + 'sku' => array( + 'name' => 'sku', + 'display_name' => 'SKU', + 'default' => 8, + 'required' => False + ), + 'sub' => array( + 'name' => 'sub', + 'display_name' => 'Sub', + 'default' => 6, + 'required' => False + ) + ); + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + if ($dbc->table_exists('tempCapPrices')){ + $drop = $dbc->prepare_statement("DROP TABLE tempCapPrices"); + $dbc->exec_statement($drop); + } + $create = $dbc->prepare_statement("CREATE TABLE tempCapPrices (upc varchar(13), price decimal(10,2), abtpr varchar(3))"); + $dbc->exec_statement($create); + + $SUB = $this->get_column_index('sub'); + $UPC = $this->get_column_index('upc'); + $SKU = $this->get_column_index('sku'); + $PRICE = $this->get_column_index('price'); + $ABT = $this->get_column_index('abt'); + + $rm_checks = (FormLib::get_form_value('rm_cds') != '') ? True : False; + $do_skus = $dbc->table_exists("UnfiToPlu"); + $upcP = $dbc->prepare_statement('SELECT upc FROM products WHERE upc=?'); + $skuP = $dbc->prepare_statement('SELECT wfc_plu FROM UnfiToPlu WHERE upc=?'); + $insP = $dbc->prepare_statement('INSERT INTO tempCapPrices VALUES (?,?,?)'); + foreach($linedata as $data){ + if (!is_array($data)) continue; + if (count($data) < 14) continue; + + $upc = str_replace("-","",$data[$UPC]); + $upc = str_replace(" ","",$upc); + if ($rm_checks) + $upc = substr($upc,0,strlen($upc)-1); + $upc = str_pad($upc,13,"0",STR_PAD_LEFT); + + $lookup = $dbc->exec_statement($upcP, array($upc)); + if ($dbc->num_rows($lookup) == 0){ + if ($SUB === False) continue; + if ($SKU === False) continue; + if ($data[$SUB] != "BULK") continue; + if ($data[$SKU] == "direct") continue; + if (!$do_skus) continue; + $sku = $data[$SKU]; + $look2 = $dbc->exec_statement($skuP, array($sku)); + if ($dbc->num_rows($look2) == 0) continue; + $upc = array_pop($dbc->fetch_row($look2)); + } + + $price = trim($data[$PRICE],"\$"); + $abt = array(); + if (strstr($data[$ABT],"A")) + $abt[] = "A"; + if (strstr($data[$ABT],"B")) + $abt[] = "B"; + if (strstr($data[$ABT],"TPR")) + $abt[] = "TPR"; + foreach($abt as $type){ + $dbc->exec_statement($insP,array($upc,$price,$type)); + } + } + + return True; + } + + function form_content(){ + return '

        Upload a CSV or Excel (XLS, not XLSX) file containing Co+op Deals + Sale information. The file needs to contain UPCs, sale prices, + and a column indicating A, B, or TPR (or some combination of the + three).

        '; + } + + function preview_content(){ + return ' Remove check digits'; + } + + function results_content(){ + $ret = "Sales data import complete

        "; + $ret .= "Review data & set up sales"; + return $ret; + } +} + +$obj = new CoopDealsUploadPage(); +$obj->draw_page(); diff --git a/fannie/batches/CAP/index.php b/fannie/batches/CAP/index.php new file mode 100644 index 000000000..e8edbd66c --- /dev/null +++ b/fannie/batches/CAP/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/batches/UNFI/HowToVendorPricing.php b/fannie/batches/UNFI/HowToVendorPricing.php new file mode 100644 index 000000000..24ec1ddc4 --- /dev/null +++ b/fannie/batches/UNFI/HowToVendorPricing.php @@ -0,0 +1,55 @@ + +Step 1: Obtain a UNFI price file. The zip file I got had three files in it, only +one has pricing info and that's the one we need. Open it up in Excel +and save it as filename unfi.csv, format CSV (Windows).
        + +
        +


        +
        +Step 2: That file is probably too big. Right click on it and select +Create archive to make a zip file.
        + +
        +
        +
        +Step 3: Go to the upload page, click Browse, and select +the zip file you just made (if done as above, it should be named +unfi.csv.zip). Click Upload File and wait. It can take a while +for a big price file.
        +
        +
        +
        +Step 4: If everything goes correctly, you'll get output something like this +(it doesn't matter if there are more or less UNFISPLIT files). If you get +anything drastically different, tell Andy.
        + +
        +
        +
        +Step 5 (optional): track down a dedicated professional to help
        + + draw_page(); +} +?> diff --git a/fannie/batches/UNFI/RecalculateVendorSRPs.php b/fannie/batches/UNFI/RecalculateVendorSRPs.php new file mode 100644 index 000000000..2af4aec70 --- /dev/null +++ b/fannie/batches/UNFI/RecalculateVendorSRPs.php @@ -0,0 +1,114 @@ +mode = 'results'; + return True; + } + + function body_content(){ + if ($this->mode == 'form') + return $this->form_content(); + else if ($this->mode == 'results') + return $this->results_content(); + } + + function results_content(){ + $id = FormLib::get_form_value('vendorID',0); + + $delQ = $dbc->prepare_statement("DELETE FROM vendorSRPs WHERE vendorID=?"); + $delR = $dbc->exec_statement($delQ,array($id)); + + $fetchQ = $dbc->prepare_statement("select v.upc,v.cost, + case when d.margin is not null then d.margin + when m.margin is not null then m.margin + else 0 end as margin + from + vendorItems as v left join + vendorDepartments as d + on v.vendorID=d.vendorID + and v.vendorDept=d.deptID + left join products as p + on v.upc=p.upc + left join deptMargin as m + on p.department=m.dept_ID + where v.vendorID=? + and (d.margin is not null or m.margin is not null)"); + $fetchR = $dbc->exec_statement($fetchQ,array($id)); + $insP = $dbc->prepare_statement('INSERT INTO vendorSRPs VALUES (?,?,?)'); + while ($fetchW = $dbc->fetch_array($fetchR)){ + // calculate a SRP from unit cost and desired margin + $srp = round($fetchW['cost'] / (1 - $fetchW['margin']),2); + + // prices should end in 5 or 9, so add a cent until that's true + while (substr($srp,strlen($srp)-1,strlen($srp)) != "5" and + substr($srp,strlen($srp)-1,strlen($srp)) != "9") + $srp+=.01; + + $insR = $dbc->exec_statement($insP,array($id,$fetchW['upc'],$srp)); + } + + $ret = "SRPs have been updated
        "; + $ret .= "Main Menu"; + return $ret; + } + + function form_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("SELECT vendorID,vendorName FROM vendors"); + $r = $dbc->exec_statement($q); + $opts = ""; + while($w = $dbc->fetch_row($r)) + $opts .= ""; + ob_start(); + ?> +
        + Recalculate SRPs from margins for which vendor?
        + + +
        + draw_page(); +} +?> diff --git a/fannie/batches/UNFI/UploadVendorPriceFile.php b/fannie/batches/UNFI/UploadVendorPriceFile.php new file mode 100644 index 000000000..d96097c71 --- /dev/null +++ b/fannie/batches/UNFI/UploadVendorPriceFile.php @@ -0,0 +1,62 @@ +prepare_statement('SELECT vendorID,vendorName FROM vendors ORDER BY vendorName'); + $r = $dbc->exec_statement($p); + $ret = 'Use the Default import tool:
          '; + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf('
        • Upload %s Price File', + $FANNIE_URL,$w['vendorID'],$w['vendorName']); + } + $ret .= '
        '; + $ret .= '
        '; + $ret .= 'Use a Custom import tool:
          '; + $files = scandir('load-classes'); + foreach($files as $f){ + if($f[0] == '.') continue; + if (substr($f,-4) != '.php') continue; + $ret .= sprintf('
        • %s
        • ', + $f,substr($f,0,strlen($f)-4)); + } + $ret .= '
        '; + return $ret; + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new UploadVendorPriceFile(); + $obj->draw_page(); +} diff --git a/fannie/batches/UNFI/VendorPricingBatchPage.php b/fannie/batches/UNFI/VendorPricingBatchPage.php new file mode 100644 index 000000000..0d05960e6 --- /dev/null +++ b/fannie/batches/UNFI/VendorPricingBatchPage.php @@ -0,0 +1,352 @@ +mode = 'edit'; + $this->window_dressing = False; + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + } + + return True; + } + + function body_content(){ + if ($this->mode == 'start') + return $this->start_content(); + elseif ($this->mode == 'edit') + return $this->edit_content(); + } + + function css_content(){ + return ' + tr.green td.sub { + background:#ccffcc; + } + tr.red td.sub { + background:#ff6677; + } + tr.white td.sub { + background:#ffffff; + } + td.srp { + text-decoration: underline; + }'; + } + + function javascript_content(){ + ob_start(); + ?> +var vid = null; +var bid = null; +var sid = null; +$(document).ready(function(){ + vid = $('#vendorID').val(); + bid = $('#batchID').val(); + sid = $('#superID').val(); +}); + +function toggleB(upc){ + var elem = $('#row'+upc).find('.addrem'); + + var dstr = "upc="+upc+"&vendorID="+vid+"&superID="+sid+"&batchID="+bid; + if (elem.html() == "Add"){ + elem.html('Del'); + var price = $('#row'+upc).find('.srp').html(); + $.ajax({ + url: 'batchAjax.php', + data: dstr + '&action=batchAdd&price='+price, + success: function(data){ + + } + }); + } + else { + elem.html('Add'); + $.ajax({ + url: 'batchAjax.php', + data: dstr + '&action=batchDel', + success: function(data){ + + } + }); + } +} +function toggleV(upc){ + var val = $('#row'+upc).find('.varp').attr('checked'); + if (val){ + $('#row'+upc).attr('class','white'); + $.ajax({ + url: 'batchAjax.php', + data: 'action=addVarPricing&upc='+upc, + success: function(data){ + + } + }); + } + else { + var m1 = $('#row'+upc).find('.cmargin').html(); + var m2 = $('#row'+upc).find('.dmargin').html(); + if (m1 >= m2) + $('#row'+upc).attr('class','green'); + else + $('#row'+upc).attr('class','red'); + $.ajax({ + url: 'batchAjax.php', + data: 'action=delVarPricing&upc='+upc, + success: function(data){ + + } + }); + } +} + +function reprice(upc){ + if ($('#newprice'+upc).length > 0) return; + + var elem = $('#row'+upc).find('.srp'); + var srp = elem.html(); + + var content = ""; + var content2 = ""; + elem.html(content); + $('#row'+upc).find('.dmargin').html(content2); + $('#newprice'+upc).focus(); +} + +function saveprice(upc){ + var srp = parseFloat($('#newprice'+upc).val()); + var cost = parseFloat($('#row'+upc).find('.cost').html()); + var newmargin = ((srp - cost) / srp) * 100; + newmargin = Math.round(newmargin*100)/100; + + $('#row'+upc).find('.srp').html(srp); + $('#row'+upc).find('.dmargin').html(newmargin+'%'); + + var dstr = "upc="+upc+"&vendorID="+vid+"&superID="+sid+"&batchID="+bid; + $.ajax({ + url: 'batchAjax.php', + data: dstr+'&action=newPrice&price='+srp, + cache: false, + success: function(data){} + }); +} + prepare_statement("SELECT super_name FROM superDeptNames WHERE superID=?"); + $r = $dbc->exec_statement($p,array($superID)); + $sn = array_pop($dbc->fetch_row($r)); + } + $p = $dbc->prepare_statement("SELECT vendorName FROM vendors WHERE vendorID=?"); + $r = $dbc->exec_statement($p,array($vendorID)); + $vn = array_pop($dbc->fetch_row($r)); + + $batchName = $sn." ".$vn." PC ".date('m/d/y'); + $ret = "Batch: ".$batchName; + + /* find a price change batch type */ + $typeP = $dbc->prepare_statement('SELECT MIN(batchTypeID) FROM batchType WHERE discType=0'); + $typeR = $dbc->exec_statement($typeP); + $bType = 0; + if ($dbc->num_rows($typeR) > 0) + $bType = array_pop($dbc->fetch_row($typeR)); + + /* get the ID of the current batch. Create it if needed. */ + $bidQ = $dbc->prepare_statement("SELECT batchID FROM batches WHERE batchName=? AND batchType=? AND discounttype=0 + ORDER BY batchID DESC"); + $bidR = $dbc->exec_statement($bidQ,array($batchName,$bType)); + $batchID = 0; + if ($dbc->num_rows($bidR) == 0){ + $insQ = $dbc->prepare_statement("INSERT INTO batches (batchName,startDate,endDate,batchType,discounttype,priority) VALUES + (?,'1900-01-01','1900-01-01',?,0,0)"); + $insR = $dbc->exec_statement($insQ,array($batchName,$bType)); + $batchID = $dbc->insert_id(); + } + else + $batchID = array_pop($dbc->fetch_row($bidR)); + + $ret .= sprintf(" + + ", + $vendorID,$batchID,$superID); + + $batchUPCs = array(); + $bq = $dbc->prepare_statement("SELECT upc FROM batchList WHERE batchID=?"); + $br = $dbc->exec_statement($bq,array($batchID)); + while($bw = $dbc->fetch_row($br)) $batchUPCs[$bw[0]] = True; + + $query = "SELECT p.upc,p.description,v.cost,p.normal_price, + (p.normal_price - v.cost)/p.normal_price AS current_margin, + s.srp, + (s.srp - v.cost)/s.srp AS desired_margin, + v.vendorDept,x.variable_pricing + FROM products AS p INNER JOIN vendorItems AS v + ON p.upc=v.upc AND v.vendorID=? + INNER JOIN vendorSRPs AS s ON + v.upc=s.upc AND v.vendorID=s.vendorID + INNER JOIN vendors as b ON v.vendorID=b.vendorID + LEFT JOIN prodExtra AS x on p.upc=x.upc "; + $args = array($vendorID); + if ($superID != 99){ + $query .= " LEFT JOIN MasterSuperDepts AS m + ON p.department=m.dept_ID "; + } + $query .= "WHERE v.cost > 0 "; + if ($superID != 99){ + $query .= " AND m.superID=? "; + $args[] = $superID; + } + if ($filter === False) + $query .= " AND p.normal_price <> s.srp "; + + // use distributor field from price change page + // as "preferred vendor". default is UNFI + if ($vn != "UNFI"){ + $query .= " AND x.distributor = ? "; + $args[] = $vn; + } + else + $query .= " AND (x.distributor='UNFI' or x.distributor <> b.vendorName) "; + + $query .= " ORDER BY p.upc"; + + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + + $ret .= ""; + $ret .= " + "; + $ret .= " + + + "; + while($row = $dbc->fetch_row($result)){ + $bg = "white"; + if ($row['variable_pricing'] != 1) + $bg = ($row['normal_price']<$row['srp'])?'red':'green'; + $ret .= sprintf(" + + + + + + + + + + + ", + $row['upc'], + $bg, + $row['upc'], + $row['description'], + $row['cost'], + $row['normal_price'], + 100*$row['current_margin'], + $row['upc'], + $row['srp'], + 100*$row['desired_margin'], + $row['vendorDept'], + $row['upc'], + ($row['variable_pricing']==1?'checked':''), + $row['upc'], + (isset($batchUPCs[$row['upc']])?'Del':'Add') + ); + } + $ret .= "
         CurrentVendor
        UPCOur DescriptionCostPriceMarginSRPMarginCatVarBatch
        %s%s%.3f%.2f%.2f%%%.2f%.2f%%%d%s
        "; + + return $ret; + } + + function start_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $p = $dbc->prepare_statement("select superID,super_name from MasterSuperDepts + WHERE superID > 0 + group by superID,super_name"); + $res = $dbc->exec_statement($p); + $opts = ""; + while($row = $dbc->fetch_row($res)) + $opts .= ""; + + $p = $dbc->prepare_statement("SELECT vendorID,vendorName FROM vendors"); + $res = $dbc->exec_statement($p); + $vopts = ""; + while($w = $dbc->fetch_row($res)) + $vopts .= ""; + + ob_start(); + ?> + Select a vendor & a department: +
        + +
        + +
        + Show all items +
        + +
        + draw_page(); +} +?> diff --git a/fannie/batches/UNFI/VendorPricingIndex.php b/fannie/batches/UNFI/VendorPricingIndex.php new file mode 100644 index 000000000..57c093c5e --- /dev/null +++ b/fannie/batches/UNFI/VendorPricingIndex.php @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + +
        Recalculate SRPsRe-compute SRPs for the vendor price change page based on + desired margins
        Upload Price SheetLoad a new vendor price sheet (this is still a bit complicated. Howto.)
        Create Price Change BatchCompare current & desired margins, create batch for updates
        + draw_page(); +} diff --git a/fannie/batches/UNFI/batchAjax.php b/fannie/batches/UNFI/batchAjax.php new file mode 100644 index 000000000..fa0f4be13 --- /dev/null +++ b/fannie/batches/UNFI/batchAjax.php @@ -0,0 +1,98 @@ +prepare_statement("UPDATE prodExtra SET variable_pricing=1 WHERE upc=?"); + $dbc->exec_statement($prep,array($upc)); + break; +case 'delVarPricing': + $prep = $dbc->prepare_statement("UPDATE prodExtra SET variable_pricing=0 WHERE upc=?"); + $dbc->exec_statement($prep,array($upc)); + break; +case 'newPrice': + $vid = FormLib::get_form_value('vendorID'); + $bid = FormLib::get_form_value('batchID'); + $sid = FormLib::get_form_value('superID',0); + if ($sid == 99) $sid = 0; + $sid = FormLib::get_form_value('price',0); + $sP = $dbc->prepare_statement("UPDATE vendorSRPs SET srp=? WHERE upc=? AND vendorID=?"); + $dbc->exec_statement($sP,array($price,$upc,$vid)); + $bP = $dbc->prepare_statement("UPDATE batchList SET salePrice=? WHERE upc=? AND batchID=?"); + $dbc->exec_statement($bP,array($price,$upc,$bid)); + $bP = $dbc->prepare_statement("UPDATE shelftags SET normal_price=? WHERE upc=? AND id=?"); + $dbc->exec_statement($bP,array($price,$upc,$sid)); + echo "New Price Applied"; + break; +case 'batchAdd': + $vid = FormLib::get_form_value('vendorID'); + $bid = FormLib::get_form_value('batchID'); + $sid = FormLib::get_form_value('superID',0); + if ($sid == 99) $sid = 0; + $sid = FormLib::get_form_value('price',0); + + /* add to batch */ + $batchQ = $dbc->prepare_statement("INSERT INTO batchList (upc,batchID,salePrice,active) + VALUES (?,?,?,0)"); + $batchR = $dbc->exec_statement($batchQ,array($upc,$bid,$price)); + + /* get shelftag info */ + $infoQ = $dbc->prepare_statement("SELECT p.description,v.brand,v.sku,v.size,v.units,b.vendorName + FROM products AS p LEFT JOIN vendorItems AS v ON p.upc=v.upc AND + v.vendorID=? LEFT JOIN vendors AS b ON v.vendorID=b.vendorID + WHERE p.upc=?"); + $info = $dbc->fetch_row($dbc->exec_statement($infoQ,array($vid,$upc))); + $ppo = PriceLib:;pricePerUnit($price,$info['size']); + + /* create a shelftag */ + $stQ = $dbc->prepare_statement("DELETE FROM shelftags WHERE upc=? AND id=?"); + $stR = $dbc->exec_statement($stQ,array($upc,$sid)); + $addQ = $dbc->prepare_statement("INSERT INTO shelftags VALUES (?,?,?,?,?,?,?,?,?,?)"); + $args = array($sid,$upc,$info['description'],$price, + $info['brand'],$info['sku'], + $info['size'],$info['units'],$info['vendorName'], + $ppo); + $addR = $dbc->exec_statement($addQ,$args); + + break; +case 'batchDel': + $vid = FormLib::get_form_value('vendorID'); + $bid = FormLib::get_form_value('batchID'); + $sid = FormLib::get_form_value('superID',0); + if ($sid == 99) $sid = 0; + + $batchQ = $dbc->prepare_statement("DELETE FROM batchList WHERE batchID=? AND upc=?"); + $batchR = $dbc->exec_statement($batchQ,array($bid,$upc)); + + $stQ = $dbc->prepare_statement("DELETE FROM shelftags WHERE upc=? AND id=?"); + $stR = $dbc->exec_statement($stQ,array($upc,$sid)); + + break; +} + +?> diff --git a/fannie/batches/UNFI/images/archive.png b/fannie/batches/UNFI/images/archive.png new file mode 100644 index 000000000..d86d5ba6f Binary files /dev/null and b/fannie/batches/UNFI/images/archive.png differ diff --git a/fannie/batches/UNFI/images/results.png b/fannie/batches/UNFI/images/results.png new file mode 100644 index 000000000..cf01387e8 Binary files /dev/null and b/fannie/batches/UNFI/images/results.png differ diff --git a/fannie/batches/UNFI/images/saveas.png b/fannie/batches/UNFI/images/saveas.png new file mode 100644 index 000000000..06aa3bfce Binary files /dev/null and b/fannie/batches/UNFI/images/saveas.png differ diff --git a/fannie/batches/UNFI/images/techsupport.jpg b/fannie/batches/UNFI/images/techsupport.jpg new file mode 100644 index 000000000..9473e17c3 Binary files /dev/null and b/fannie/batches/UNFI/images/techsupport.jpg differ diff --git a/fannie/batches/UNFI/index.php b/fannie/batches/UNFI/index.php new file mode 100644 index 000000000..64f9b8758 --- /dev/null +++ b/fannie/batches/UNFI/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/batches/UNFI/lib.php b/fannie/batches/UNFI/lib.php new file mode 100644 index 000000000..6c77ebd84 --- /dev/null +++ b/fannie/batches/UNFI/lib.php @@ -0,0 +1,37 @@ +prepare_statement("SELECT vendorID FROM vendorLoadScripts + WHERE loadScript=?"); + $result = $dbc->exec_statement($query,array($scriptName)); + + if (!$result || $dbc->num_rows($result) == 0) + return False; + else + return array_pop($dbc->fetch_row($result)); +} + +?> diff --git a/fannie/batches/UNFI/load-classes/UnfiUploadPage.php b/fannie/batches/UNFI/load-classes/UnfiUploadPage.php new file mode 100644 index 000000000..4bfcdfbe6 --- /dev/null +++ b/fannie/batches/UNFI/load-classes/UnfiUploadPage.php @@ -0,0 +1,286 @@ + array( + 'name' => 'upc', + 'display_name' => 'UPC', + 'default' => 14, + 'required' => True + ), + 'srp' => array( + 'name' => 'srp', + 'display_name' => 'SRP', + 'default' => 16, + 'required' => True + ), + 'brand' => array( + 'name' => 'brand', + 'display_name' => 'Brand', + 'default' => 2, + 'required' => True + ), + 'desc' => array( + 'name' => 'desc', + 'display_name' => 'Description', + 'default' => 6, + 'required' => True + ), + 'sku' => array( + 'name' => 'sku', + 'display_name' => 'SKU', + 'default' => 1, + 'required' => False + ), + 'qty' => array( + 'name' => 'qty', + 'display_name' => 'Case Qty', + 'default' => 3, + 'required' => True + ), + 'size' => array( + 'name' => 'size', + 'display_name' => 'Unit Size', + 'default' => 4, + 'required' => False + ), + 'cost' => array( + 'name' => 'cost', + 'display_name' => 'Case Cost', + 'default' => 8, + 'required' => True + ), + 'cat' => array( + 'name' => 'cat', + 'display_name' => 'UNFI Category #', + 'default' => 5, + 'required' => True + ) + ); + + protected $use_splits = True; + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $idP = $dbc->prepare_statement("SELECT vendorID FROM vendors WHERE vendorName='UNFI' ORDER BY vendorID"); + $idR = $dbc->exec_statement($idP); + if ($dbc->num_rows($idR) == 0){ + $this->error_details = 'Cannot find vendor'; + return False; + } + $VENDOR_ID = array_pop($dbc->fetch_row($idR)); + + $SKU = $this->get_column_index('sku'); + $BRAND = $this->get_column_index('brand'); + $DESCRIPTION = $this->get_column_index('desc'); + $QTY = $this->get_column_index('qty'); + $SIZE1 = $this->get_column_index('size'); + $UPC = $this->get_column_index('upc'); + $CATEGORY = $this->get_column_index('cat'); + $REG_COST = $this->get_column_index('cost'); + $NET_COST = $this->get_column_index('cost'); + $SRP = $this->get_column_index('srp'); + + $extraP = $dbc->prepare_statement("update prodExtra set cost=? where upc=?"); + $itemP = $dbc->prepare_statement("INSERT INTO vendorItems + (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (?,?,?,?,?,?,?,?,?)"); + $uuP = $dbc->prepare_statement("INSERT INTO unfi_order + (unfi_sku,brand,item_desc,pack,pack_size,upcc,cat,wholesale,vd_cost,wfc_srp) + VALUES (?,?,?,?,?,?,?,?,?,?)"); + $srpP = $dbc->prepare_statement("INSERT INTO vendorSRPs (vendorID, upc, srp) VALUES (?,?,?)"); + + $dupeP = $dbc->prepare_statement("SELECT upcc FROM unfi_order WHERE upcc=?"); + + foreach($linedata as $data){ + if (!is_array($data)) continue; + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $sku = $data[$SKU]; + $brand = $data[$BRAND]; + $description = $data[$DESCRIPTION]; + $qty = $data[$QTY]; + $size = $data[$SIZE1]; + $upc = substr($data[$UPC],0,13); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000") + continue; + $category = $data[$CATEGORY]; + $reg = trim($data[$REG_COST]); + $net = trim($data[$NET_COST]); + $srp = trim($data[$SRP]); + // can't process items w/o price (usually promos/samples anyway) + if (empty($reg) or empty($net) or empty($srp)) + continue; + + // don't repeat items + $dupeR = $dbc->exec_statement($dupeP,array($upc)); + if ($dbc->num_rows($dupeR) > 0) continue; + + // syntax fixes. kill apostrophes in text fields, + // trim $ off amounts as well as commas for the + // occasional > $1,000 item + $brand = str_replace("'","",$brand); + $description = str_replace("'","",$description); + $reg = str_replace('$',"",$reg); + $reg = str_replace(",","",$reg); + $net = $reg; + $srp = str_replace('$',"",$srp); + $srp = str_replace(",","",$srp); + + // skip the item if prices aren't numeric + // this will catch the 'label' line in the first CSV split + // since the splits get returned in file system order, + // we can't be certain *when* that chunk will come up + if (!is_numeric($reg) or !is_numeric($net) or !is_numeric($srp)) + continue; + + // need unit cost, not case cost + $reg_unit = $reg / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $dbc->exec_statement($extraP, array($reg_unit,$upc)); + ProductsModel::update($upc, array('cost'=>$reg_unit), True); + // end $PRICEFILE_COST_TABLE cost tracking + + $args = array($brand,($sku===False?'':$sku),($size===False?'':$size), + $upc,$qty,$reg_unit,$description,$category,$VENDOR_ID); + $dbc->exec_statement($itemP,$args); + + // unfi_order is what the UNFI price change page builds on, + // that's why it's being populated here + // it's just a table containing all items in the current order + $args = array(($sku===False?'':$sku),$brand,$description,$qty, + ($size===False?'':$size),$upc,$category,$reg, + $net,$srp); + $dbc->exec_statement($uuP,$args); + + $dbc->exec_statement($srpP,array($VENDOR_ID,$upc,$srp)); + } + + return True; + } + + /* clear tables before processing */ + function split_start(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $idP = $dbc->prepare_statement("SELECT vendorID FROM vendors WHERE vendorName='UNFI' ORDER BY vendorID"); + $idR = $dbc->exec_statement($idP); + if ($dbc->num_rows($idR) == 0){ + $this->error_details = 'Cannot find vendor'; + return False; + } + $VENDOR_ID = array_pop($dbc->fetch_row($idR)); + + $viP = $dbc->prepare_statement("DELETE FROM vendorItems WHERE vendorID=?"); + $vsP = $dbc->prepare_statement("DELETE FROM vendorSRPs WHERE vendorID=?"); + $uoP = $dbc->prepare_statement("TRUNCATE TABLE unfi_order"); + $dbc->exec_statement($viP,array($VENDOR_ID)); + $dbc->exec_statement($vsP,array($VENDOR_ID)); + $dbc->exec_statement($uoP); + } + + function preview_content(){ + return ''; + return ' Remove check digits'; + } + + function results_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $ret = "Price data import complete

        "; + $ret .= 'Upload Another'; + + // this stored procedure compensates for items ordered from + // UNFI under one UPC but sold in-store under a different UPC + // (mostly bulk items sold by PLU). All it does is update the + // upcc field in unfi_order for the affected items + if ($dbc->table_exists("vendorSKUtoPLU")){ + + $idP = $dbc->prepare_statement("SELECT vendorID FROM vendors WHERE vendorName='UNFI' ORDER BY vendorID"); + $idR = $dbc->exec_statement($idP); + $VENDOR_ID=0; + if ($dbc->num_rows($idR) > 0) + $VENDOR_ID = array_pop($dbc->fetch_row($idR)); + + $pluQ1 = $dbc->prepare_statement("UPDATE unfi_order AS u + INNER JOIN vendorSKUtoPLU AS p + ON u.unfi_sku = p.sku + SET u.upcc = p.upc + WHERE p.vendorID=?"); + $pluQ2 = $dbc->prepare_statement("UPDATE vendorItems AS u + INNER JOIN vendorSKUtoPLU AS p + ON u.sku = p.sku + SET u.upc = p.upc + WHERE u.vendorID=?"); + $pluQ3 = $dbc->prepare_statement("UPDATE prodExtra AS x + INNER JOIN vendorSKUtoPLU AS p + ON x.upc=p.upc + INNER JOIN unfi_order AS u + ON u.unfi_sku=p.sku + SET x.cost = u.vd_cost / u.pack + WHERE p.vendorID=?"); + $args = array($VENDOR_ID); + $args2 = array($VENDOR_ID); // kludge + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $pluQ1 = $dbc->prepare_statement("UPDATE unfi_order SET upcc = p.wfc_plu + FROM unfi_order AS u RIGHT JOIN + UnfiToPLU AS p ON u.unfi_sku = p.unfi_sku + WHERE u.unfi_sku IS NOT NULL"); + $pluQ2 = $dbc->prepare_statement("UPDATE vendorItems SET upc = p.wfc_plu + FROM vendorItems AS u RIGHT JOIN + UnfiToPLU AS p ON u.sku = p.unfi_sku + WHERE u.sku IS NOT NULL + AND u.vendorID=?"); + $pluQ3 = $dbc->prepare_statement("UPDATE prodExtra + SET cost = u.vd_cost / u.pack + FROM UnfiToPLU AS p LEFT JOIN + unfi_order AS u ON p.unfi_sku = u.unfi_sku + LEFT JOIN prodExtra AS x + ON p.wfc_plu = x.upc"); + $args = array(); + } + $dbc->exec_statement($pluQ1,$args); + $dbc->exec_statement($pluQ2,$args2); + $dbc->exec_statement($pluQ3,$args); + } + + return $ret; + } +} + +$obj = new UnfiUploadPage(); +$obj->draw_page(); diff --git a/fannie/batches/UNFI/load-scripts/README b/fannie/batches/UNFI/load-scripts/README new file mode 100644 index 000000000..75459978c --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/README @@ -0,0 +1,3 @@ +This is no longer the preferred way of handling vendor imports. +There files are here for reference but should not be served as +PHP scripts. They are not SQL safe. diff --git a/fannie/batches/UNFI/load-scripts/loadECLECTICprices.php.ref b/fannie/batches/UNFI/load-scripts/loadECLECTICprices.php.ref new file mode 100644 index 000000000..96b567ef1 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadECLECTICprices.php.ref @@ -0,0 +1,194 @@ +query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $cleanQ = "delete from vendorItems where upc = '$upc' AND vendorID=$VENDOR_ID"; + $dbc->query($cleanQ); + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing ECLECTIC price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadECLECTICprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadHPprices.php.ref b/fannie/batches/UNFI/load-scripts/loadHPprices.php.ref new file mode 100644 index 000000000..e59c29536 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadHPprices.php.ref @@ -0,0 +1,204 @@ +query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $filestoprocess[] = "unfi.csv"; +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_replace(" ","",$data[$UPC]); + $upc = rtrim($upc,"\r\n"); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); + $sku = str_replace("-","",$data[$SKU]); + $brand = 'HERB PHARM'; + $description = substr($data[$DESCRIPTION],0,50); + $size = $data[$QTY]; + $qty = 1; + $wholesale = trim($data[$WHOLESALE]," \$"); + // can't process items w/o price (usually promos/samples anyway) + if (empty($wholesale)) + continue; + + // need unit cost, not case cost + $net_cost = $wholesale / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + + $srp = (!empty($data[6]))?ltrim($data[6],'$'):ltrim($data[7],'$'); + $dbc->query(sprintf("INSERT INTO vendorSRPs VALUES (%d,%s,%f)", + $VENDOR_ID,$dbc->escape($upc),$srp)); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $page_title = "Fannie : Loaded Herb Pharm Prices"; + $header = "Loaded Herb Pharm Prices"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing Herb Pharm price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + if (isset($_GET['processed'])){ + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + } + echo $current."
        "; + unlink($tpath.$p); + } + else echo "unfi.csv
        "; + unlink($tpath.'unfi.csv'); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadHPprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadNFACTORprices.php.ref b/fannie/batches/UNFI/load-scripts/loadNFACTORprices.php.ref new file mode 100644 index 000000000..eee5e5ee2 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadNFACTORprices.php.ref @@ -0,0 +1,212 @@ +query($cleanQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $filestoprocess[] = "unfi.csv"; + $cleanQ = "delete from vendorItems WHERE vendorID=$VENDOR_ID"; + $dbc->query($cleanQ); +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_replace(" ","",$data[$UPC]); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); + $sku = str_replace("-","",$data[$SKU]); + $brand = 'NATRUAL FACTORS'; + $descs = explode(" ",trim($data[$DESCRIPTION])); + $qty = 1; + $size = ""; + $description = ""; + if(is_numeric($descs[count($descs)-1])){ + for($i=0;$iquery($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $header = "Done loading catalog"; + $page_title = "Fannie :: Load Catalog"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing NFACTOR price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + if (isset($_GET['processed'])){ + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadNFACTORprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadNPATHprices.php.ref b/fannie/batches/UNFI/load-scripts/loadNPATHprices.php.ref new file mode 100644 index 000000000..a2d7aa9c8 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadNPATHprices.php.ref @@ -0,0 +1,196 @@ +query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $filestoprocess[] = "unfi.csv"; + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + // grab data from appropriate columns + $upc = str_pad($data[$UPC],13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); + $sku = str_replace("-","",$data[$SKU]); + $brand = 'NATURES PLUS'; + $description = $data[$DESCRIPTION]; + $size = $data[$QTY]; + $qty = 1; + $wholesale = trim($data[$WHOLESALE]," \$"); + // can't process items w/o price (usually promos/samples anyway) + if (empty($wholesale)) + continue; + + // need unit cost, not case cost + $net_cost = $wholesale / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + + $srp = (!empty($data[6]))?ltrim($data[6],' $'):ltrim($data[7],' $'); + $dbc->query(sprintf("INSERT INTO vendorSRPs VALUES (%d,%s,%f)", + $VENDOR_ID,$dbc->escape($upc),$srp)); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing NPATH price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadNPATHprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadOWHprices.php.ref b/fannie/batches/UNFI/load-scripts/loadOWHprices.php.ref new file mode 100644 index 000000000..6f22ad2d7 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadOWHprices.php.ref @@ -0,0 +1,204 @@ +query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $filestoprocess[] = "unfi.csv"; +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_replace(" ","",$data[$UPC]); + $upc = rtrim($upc,"\r\n"); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); + $sku = str_replace("-","",$data[$SKU]); + $brand = 'OWH'; + $description = $data[$DESCRIPTION]; + $size = $data[$QTY]; + $qty = 1; + $wholesale = trim($data[$WHOLESALE]," \$"); + // can't process items w/o price (usually promos/samples anyway) + if (empty($wholesale)) + continue; + + // need unit cost, not case cost + $net_cost = $wholesale / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + + $srp = (!empty($data[4]))?ltrim($data[4],'$'):ltrim($data[5],'$'); + $dbc->query(sprintf("INSERT INTO vendorSRPs VALUES (%d,%s,%f)", + $VENDOR_ID,$dbc->escape($upc),$srp)); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $page_title = "Fannie : Loaded OWH Prices"; + $header = "Loaded OWH Prices"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing OWH price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + if (isset($_GET['processed'])){ + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadOWHprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadSELECTprices.php.ref b/fannie/batches/UNFI/load-scripts/loadSELECTprices.php.ref new file mode 100644 index 000000000..68f21585c --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadSELECTprices.php.ref @@ -0,0 +1,210 @@ +query($cleanQ); + $cleanQ = "delete from vendorSRPs WHERE vendorID=$VENDOR_ID"; + $dbc->query($cleanQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $filestoprocess[] = "unfi.csv"; + $cleanQ = "delete from vendorItems where vendorID=$VENDOR_ID"; + $dbc->query($cleanQ); + $cleanQ = "delete from vendorSRPs WHERE vendorID=$VENDOR_ID"; + $dbc->query($cleanQ); +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_replace('-','',$data[$UPC]); + $upc = str_replace(' ','',$upc); + $upc = ltrim($upc,'0'); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); // kill check digit + $sku = str_replace("-","",$data[$SKU]); + $brand = $data[$BRAND]; + $description = $data[$DESCRIPTION]; + $size = strtoupper($data[$SIZE]); + $qty = $data[$QTY]; + $net_cost = trim($data[$WHOLESALE]); + $dept = $data[$DEPT]; + // can't process items w/o price (usually promos/samples anyway) + if (empty($net_cost)) + continue; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,%d,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $dept,$VENDOR_ID); + $insR = $dbc->query($insQ); + + $srp = $data[$SRP]; + $insQ = "INSERT INTO vendorSRPs (vendorID, upc, srp) VALUES + ($VENDOR_ID,'$upc',$srp)"; + $insR = $dbc->query($insQ); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $header = "Done"; + $page_title = "Fannie :: Done"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing SELECT price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadSELECTprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadSIMPprices.php.ref b/fannie/batches/UNFI/load-scripts/loadSIMPprices.php.ref new file mode 100644 index 000000000..fca26432f --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadSIMPprices.php.ref @@ -0,0 +1,202 @@ +query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $filestoprocess[] = "unfi.csv"; +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_replace(" ","",$data[$UPC]); + $upc = rtrim($upc,"\r\n"); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $sku = ''; + $brand = 'SIMPLERS'; + $description = substr($data[$DESCRIPTION],0,50); + $size = $data[$QTY].' '.$data[$QTY+1]; + $qty = 1; + $wholesale = trim($data[$WHOLESALE]," \$"); + // can't process items w/o price (usually promos/samples anyway) + if (empty($wholesale)) + continue; + + // need unit cost, not case cost + $net_cost = $wholesale / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + + $srp = (!empty($data[5]))?ltrim($data[5],'$'):ltrim($data[6],'$'); + $dbc->query(sprintf("INSERT INTO vendorSRPs VALUES (%d,%s,%f)", + $VENDOR_ID,$dbc->escape($upc),$srp)); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $page_title = "Fannie : Loaded Simplers Prices"; + $header = "Loaded Simplers Prices"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing Simplers price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + if (isset($_GET['processed'])){ + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + } + echo $current."
        "; + unlink($tpath.$current; + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadSIMPprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadSUKIprices.php.ref b/fannie/batches/UNFI/load-scripts/loadSUKIprices.php.ref new file mode 100644 index 000000000..f0e6f3152 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadSUKIprices.php.ref @@ -0,0 +1,204 @@ +query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $filestoprocess[] = "unfi.csv"; +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_replace(" ","",$data[$UPC]); + $upc = rtrim($upc,"\r\n"); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); + $sku = str_replace("-","",$data[$SKU]); + $brand = 'SUKI'; + $description = substr($data[$DESCRIPTION],0,50); + $size = $data[$QTY]; + $qty = 1; + $wholesale = trim($data[$WHOLESALE]," \$"); + // can't process items w/o price (usually promos/samples anyway) + if (empty($wholesale)) + continue; + + // need unit cost, not case cost + $net_cost = $wholesale / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + + $srp = (!empty($data[7]))?ltrim($data[7],'$'):ltrim($data[8],'$'); + $dbc->query(sprintf("INSERT INTO vendorSRPs VALUES (%d,%s,%f)", + $VENDOR_ID,$dbc->escape($upc),$srp)); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $page_title = "Fannie : Loaded Suki Prices"; + $header = "Loaded Suki Prices"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing Suki price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + if (isset($_GET['processed'])){ + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadSUKIprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadUNFIprices.php.ref b/fannie/batches/UNFI/load-scripts/loadUNFIprices.php.ref new file mode 100644 index 000000000..80196a8e1 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadUNFIprices.php.ref @@ -0,0 +1,310 @@ +query($truncateQ); + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $delQ = "DELETE FROM vendorSRPs WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $truncateQ = "truncate table unfi_order"; + $truncateR = $dbc->query($truncateQ); + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $filestoprocess[] = "unfi.csv"; +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + if (!is_array($data)) continue; + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $sku = $data[$SKU]; + $brand = $data[$BRAND]; + $description = $data[$DESCRIPTION]; + $qty = $data[$QTY]; + $size = $data[$SIZE1]; + $upc = substr($data[$UPC],0,13); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000") + continue; + $category = $data[$CATEGORY]; + $reg = trim($data[$REG_COST]); + $net = trim($data[$NET_COST]); + $srp = trim($data[$SRP]); + // can't process items w/o price (usually promos/samples anyway) + if (empty($reg) or empty($net) or empty($srp)) + continue; + + // don't repeat items + $checkQ = "SELECT upcc FROM unfi_order WHERE upcc='$upc'"; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) > 0) continue; + + // syntax fixes. kill apostrophes in text fields, + // trim $ off amounts as well as commas for the + // occasional > $1,000 item + $brand = preg_replace("/\'/","",$brand); + $description = preg_replace("/\'/","",$description); + $reg = preg_replace("/\\\$/","",$reg); + $reg = preg_replace("/,/","",$reg); + $net = preg_replace("/\\\$/","",$net); + $net = preg_replace("/,/","",$net); + $srp = preg_replace("/\\\$/","",$srp); + $srp = preg_replace("/,/","",$srp); + + // skip the item if prices aren't numeric + // this will catch the 'label' line in the first CSV split + // since the splits get returned in file system order, + // we can't be certain *when* that chunk will come up + if (!is_numeric($reg) or !is_numeric($net) or !is_numeric($srp)) + continue; + + // need unit cost, not case cost + $reg_unit = $reg / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$reg_unit where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$reg_unit where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + $insQ = "INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES ('$brand',$sku,'$size','$upc',$qty,$reg_unit, + '$description',$category,$VENDOR_ID)"; + $insR = $dbc->query($insQ); + // end general UNFI catalog queries + + // requested margin + // I'm calculating margins based on an in-house table of UNFI catagory ID #s + // and desired margins. Alternatively, SRP could be lifted right out + // of the CSV file + /* + $marginQ = "select margin from unfiCategories where categoryID = $category"; + $marginR = $dbc->query($marginQ); + $margin = 0.45; + if ($dbc->num_rows($marginR) > 0) + $margin = array_pop($dbc->fetch_array($marginR)); + + // calculate a SRP from unit cost and desired margin + $srp = round($reg_unit / (1 - $margin),2); + + // prices should end in 5 or 9, so add a cent until that's true + while (substr($srp,strlen($srp)-1,strlen($srp)) != "5" and + substr($srp,strlen($srp)-1,strlen($srp)) != "9") + $srp += 0.01; + // end margin calculations + */ + + // unfi_order is what the UNFI price change page builds on, + // that's why it's being populated here + // it's just a table containing all items in the current order + $insQ = "INSERT INTO unfi_order (unfi_sku,brand,item_desc,pack,pack_size,upcc,cat,wholesale, + vd_cost,wfc_srp) VALUES ($sku,'$brand','$description',$qty,'$size','$upc', + $category,$reg,$net,$srp)"; + $insR = $dbc->query($insQ); + + $insQ = "INSERT INTO vendorSRPs (vendorID, upc, srp) VALUES + ($VENDOR_ID,'$upc',$srp)"; + $insR = $dbc->query($insQ); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $page_title = "Done loading items"; + $header = "Done loading items"; + include($FANNIE_ROOT."src/header.html"); + + // this stored procedure compensates for items ordered from + // UNFI under one UPC but sold in-store under a different UPC + // (mostly bulk items sold by PLU). All it does is update the + // upcc field in unfi_order for the affected items + if ($dbc->table_exists("vendorSKUtoPLU")){ + $pluQ1 = "UPDATE unfi_order AS u + INNER JOIN vendorSKUtoPLU AS p + ON u.unfi_sku = p.sku + SET u.upcc = p.upc + WHERE p.vendorID=".$VENDOR_ID; + $pluQ2 = "UPDATE vendorItems AS u + INNER JOIN vendorSKUtoPLU AS p + ON u.sku = p.sku + SET u.upc = p.upc + WHERE u.vendorID=".$VENDOR_ID; + $pluQ3 = "UPDATE prodExtra AS x + INNER JOIN vendorSKUtoPLU AS p + ON x.upc=p.upc + INNER JOIN unfi_order AS u + ON u.unfi_sku=p.sku + SET x.cost = u.vd_cost / u.pack + WHERE p.vendorID=".$VENDOR_ID; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $pluQ1 = "UPDATE unfi_order SET upcc = p.wfc_plu + FROM unfi_order AS u RIGHT JOIN + UnfiToPLU AS p ON u.unfi_sku = p.unfi_sku + WHERE u.unfi_sku IS NOT NULL"; + $pluQ2 = "UPDATE vendorItems SET upc = p.wfc_plu + FROM vendorItems AS u RIGHT JOIN + UnfiToPLU AS p ON u.sku = p.unfi_sku + WHERE u.sku IS NOT NULL + AND u.vendorID=".$VENDOR_ID; + $pluQ3 = "UPDATE prodExtra + SET cost = u.vd_cost / u.pack + FROM UnfiToPLU AS p LEFT JOIN + unfi_order AS u ON p.unfi_sku = u.unfi_sku + LEFT JOIN prodExtra AS x + ON p.wfc_plu = x.upc"; + } + $dbc->query($pluQ1); + $dbc->query($pluQ2); + $dbc->query($pluQ3); + } + + echo "Finished processing UNFI price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "UNFI Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadUNFIprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadUNFIsrps.php.ref b/fannie/batches/UNFI/load-scripts/loadUNFIsrps.php.ref new file mode 100644 index 000000000..7e98ee446 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadUNFIsrps.php.ref @@ -0,0 +1,281 @@ +query($delQ); + + $delQ = "DELETE FROM vendorSRPs WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + + $delQ = "DELETE FROM vendorSRPs WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + + $filestoprocess[] = "unfi.csv"; +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + if (!is_array($data)) continue; + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $sku = $data[$SKU]; + $brand = $data[$BRAND]; + $description = $data[$DESCRIPTION]; + $qty = $data[$QTY]; + $size = $data[$SIZE1]; + $upc = substr($data[$UPC],0,13); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000") + continue; + $category = $data[$CATEGORY]; + $reg = trim($data[$REG_COST]); + $net = trim($data[$NET_COST]); + // can't process items w/o price (usually promos/samples anyway) + if (empty($reg) or empty($net)) + continue; + + // don't repeat items + $checkQ = "SELECT upc FROM vendorItems WHERE upc='$upc' AND vendorID=".$VENDOR_ID; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) > 0) continue; + + // syntax fixes. kill apostrophes in text fields, + // trim $ off amounts as well as commas for the + // occasional > $1,000 item + $brand = preg_replace("/\'/","",$brand); + $description = preg_replace("/\'/","",$description); + $reg = preg_replace("/\\\$/","",$reg); + $reg = preg_replace("/,/","",$reg); + $net = preg_replace("/\\\$/","",$net); + $net = preg_replace("/,/","",$net); + + // skip the item if prices aren't numeric + // this will catch the 'label' line in the first CSV split + // since the splits get returned in file system order, + // we can't be certain *when* that chunk will come up + if (!is_numeric($reg) or !is_numeric($net)) + continue; + + // need unit cost, not case cost + $reg_unit = $reg / $qty; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update products set cost=$reg_unit where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + $insQ = "INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES ('$brand',$sku,'$size','$upc',$qty,$reg_unit, + '$description',$category,$VENDOR_ID)"; + $insR = $dbc->query($insQ); + // end general UNFI catalog queries + + // take given SRP + $srp = $data[$SRP]; + $srp = preg_replace("/\\\$/","",$srp); + $srp = preg_replace("/,/","",$srp); + + $insQ = "INSERT INTO vendorSRPs (vendorID, upc, srp) VALUES + ($VENDOR_ID,'$upc',$srp)"; + $insR = $dbc->query($insQ); +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $page_title = "Done loading items"; + $header = "Done loading items"; + include($FANNIE_ROOT."src/header.html"); + + // this stored procedure compensates for items ordered from + // UNFI under one UPC but sold in-store under a different UPC + // (mostly bulk items sold by PLU). All it does is update the + // upcc field in unfi_order for the affected items + if ($dbc->table_exists("UnfiToPLU")){ + $pluQ1 = "UPDATE unfi_order AS u + INNER JOIN UnfiToPLU AS p + ON u.unfi_sku = p.unfi_sku + SET u.upcc = p.wfc_plu"; + $pluQ2 = "UPDATE vendorItems AS u + INNER JOIN UnfiToPLU AS p + ON u.sku = p.unfi_sku + SET u.upc = p.wfc_plu + WHERE u.vendorID=".$VENDOR_ID; + $pluQ3 = "UPDATE prodExtra AS x + INNER JOIN UnfiToPLU AS p + ON x.upc=p.wfc_plu + INNER JOIN unfi_order AS u + ON u.unfi_sku=p.unfi_sku + SET x.cost = u.vd_cost / u.pack"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $pluQ1 = "UPDATE unfi_order SET upcc = p.wfc_plu + FROM unfi_order AS u RIGHT JOIN + UnfiToPLU AS p ON u.unfi_sku = p.unfi_sku + WHERE u.unfi_sku IS NOT NULL"; + $pluQ2 = "UPDATE vendorItems SET upc = p.wfc_plu + FROM vendorItems AS u RIGHT JOIN + UnfiToPLU AS p ON u.sku = p.unfi_sku + WHERE u.sku IS NOT NULL + AND u.vendorID=".$VENDOR_ID; + $pluQ3 = "UPDATE prodExtra + SET cost = u.vd_cost / u.pack + FROM UnfiToPLU AS p LEFT JOIN + unfi_order AS u ON p.unfi_sku = u.unfi_sku + LEFT JOIN prodExtra AS x + ON p.wfc_plu = x.upc"; + } + $dbc->query($pluQ1); + $dbc->query($pluQ2); + $dbc->query($pluQ3); + } + + echo "Finished processing UNFI price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "UNFI Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadUNFIsrps.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/load-scripts/loadVITAMERprices.php.ref b/fannie/batches/UNFI/load-scripts/loadVITAMERprices.php.ref new file mode 100644 index 000000000..d97d33572 --- /dev/null +++ b/fannie/batches/UNFI/load-scripts/loadVITAMERprices.php.ref @@ -0,0 +1,199 @@ +query($cleanQ); + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } +} +else { + $filestoprocess[] = "unfi.csv"; + $cleanQ = "delete from vendorItems WHERE vendorID=$VENDOR_ID"; + $dbc->query($cleanQ); +} + +// remove one split from the list and process that +$current = array_pop($filestoprocess); + +$fp = fopen($tpath.$current,'r'); +while(!feof($fp)){ + $line = fgets($fp); + /* csv parser takes a comma-separated line and returns its elements + as an array */ + $data = csv_parser($line); + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $upc = str_pad($data[$UPC],13,'0',STR_PAD_LEFT); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000" || !is_numeric($upc)) + continue; + $upc = '0'.substr($upc,0,12); + $sku = str_replace("-","",$data[$SKU]); + $brand = 'VITAMER'; + $description = $data[$DESCRIPTION]; + $size = trim($data[$SIZE])." CT"; + $qty = $data[$QTY]; + $wholesale = trim($data[$WHOLESALE]," \$"); + // can't process items w/o price (usually promos/samples anyway) + if (empty($wholesale)) + continue; + + $net_cost = $wholesale; + + // set cost in $PRICEFILE_COST_TABLE + $upQ = "update prodExtra set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + $upQ = "update products set cost=$net_cost where upc='$upc'"; + $upR = $dbc->query($upQ); + // end $PRICEFILE_COST_TABLE cost tracking + + // if the item doesn't exist in the general vendor catalog table, + // add it. + $insQ = sprintf("INSERT INTO vendorItems (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (%s,%s,%s,%s,%d,%f,%s,NULL,%d)",$dbc->escape($brand),$dbc->escape($sku), + $dbc->escape($size),$dbc->escape($upc),$qty,$net_cost,$dbc->escape($description), + $VENDOR_ID); + $insR = $dbc->query($insQ); + +} +fclose($fp); + +/* + if filestoprocess is empty, stop and print some + summary info including what files were processed + (for sanity's sake) and clean up by deleting all + the splits (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise, add the current file to the list of + splits that have already been processed and redirect + back to this page, passing both lists (files to be done + and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe +*/ +if (count($filestoprocess) == 0){ + /* html header, including navbar */ + $header = "Done loading catalog"; + $page_title = "Fannie :: Load Catalog"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing Vitamer price file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + if (isset($_GET['processed'])){ + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + } + echo $current."
        "; + unlink($tpath.$current); + } + else echo "unfi.csv
        "; + unlink($tpath."unfi.csv"); + + echo "
        "; + echo "Vendor Pricing Home"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); +} +else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadNPATHprices.php?filestoprocess=$sendable_data&processed=$encoded2"); + +} + +?> diff --git a/fannie/batches/UNFI/plu_mapping.php b/fannie/batches/UNFI/plu_mapping.php new file mode 100644 index 000000000..13bded593 --- /dev/null +++ b/fannie/batches/UNFI/plu_mapping.php @@ -0,0 +1,82 @@ +prepare_statement("DELETE FROM UnfiToPLU WHERE wfc_plu=?"); + $sql->exec_statement($delQ,array($plu)); + break; + case 'add': + $plu = str_pad($_GET['plu'],13,'0',STR_PAD_LEFT); + $sku = $_GET['sku']; + $insQ = $sql->prepare_statement("INSERT INTO UnfiToPLU (unfi_sku,wfc_plu) + VALUES (?,?)"); + $insR = $sql->exec_statement($insQ,array($sku,$plu)); + break; + } +} + +$order = "description"; +if (isset($_GET['order'])) $order = $_GET['order']; + +$dataQ = $sql->prepare_statement("SELECT unfi_sku,wfc_plu, + CASE WHEN p.description IS NULL THEN '! None found' ELSE p.description + END as description FROM UnfiToPLU + AS u LEFT JOIN products AS p ON u.wfc_plu=p.upc + ORDER BY description"); +$dataR = $sql->exec_statement($dataQ); + +if (!isset($_GET['excel'])){ + /* html header, including navbar */ + include(FANNIE_ABS_PATH."/display/html/header.php"); + + echo "

        + SKU: + PLU: + + +
        + Save to Excel"; +} +else { + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="PLU_mapping.xls"'); +} + +echo ""; +echo ""; +if (!isset($_GET['excel'])){ + echo ""; + echo ""; + echo ""; + echo ""; +} +else + echo ""; +echo ""; +while($dataW = $sql->fetch_row($dataR)){ + echo ""; + echo ""; + echo ""; + echo ""; + if (!isset($_GET['excel'])){ + echo ""; + } + echo ""; +} +echo "
        SKUPLUDescription SKUPLUDescription
        ".$dataW["unfi_sku"]."".$dataW["wfc_plu"]."".$dataW["description"]."X
        "; + +if (!isset($_GET['excel'])){ + /* html footer */ + include(FANNIE_ABS_PATH."/display/html/footer.php"); +} + +?> diff --git a/fannie/batches/index.php b/fannie/batches/index.php new file mode 100644 index 000000000..ace4716b0 --- /dev/null +++ b/fannie/batches/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/batches/newbatch.oo/BatchManagementTool.php b/fannie/batches/newbatch.oo/BatchManagementTool.php new file mode 100644 index 000000000..e6d6c712c --- /dev/null +++ b/fannie/batches/newbatch.oo/BatchManagementTool.php @@ -0,0 +1,1290 @@ +audited = 0; + + $this->con = FannieDB::get($FANNIE_OP_DB); + + $typesQ = $this->con->prepare_statement("select batchTypeID,typeDesc from batchType order by batchTypeID"); + $typesR = $this->con->exec_statement($typesQ); + while ($typesW = $this->con->fetch_array($typesR)) + $this->batchtypes[$typesW[0]] = $typesW[1]; + + $ownersQ = $this->con->prepare_statement("SELECT super_name FROM MasterSuperDepts GROUP BY super_name ORDER BY super_name"); + $ownersR = $this->con->exec_statement($ownersQ); + $this->owners = array(''); + while($ownersW = $this->con->fetch_row($ownersR)) + $this->owners[] = $ownersW[0]; + $this->owners[] = 'IT'; + + if (FormLib::get_form_value('action') !== ''){ + $this->ajax_response(FormLib::get_form_value('action')); + return False; + } + + return True; + } + + + + /** ajax responses + * $out is the output sent back + * by convention, the request name ($_GET['action']) + * is prepended to all output so the javascript receiver + * can handle responses differently as needed. + * a backtick separates request name from data + */ + function ajax_response($action){ + $out = ''; + $dbc = $this->con; + // prepend request name & backtick + $out = $action."`"; + // switch on request name + switch ($action){ + case 'newBatch': + $type = FormLib::get_form_value('type',0); + $name = FormLib::get_form_value('name',''); + $startdate = FormLib::get_form_value('startdate',date('Y-m-d'))." 00:00:00"; + $enddate = FormLib::get_form_value('enddate',date('Y-m-d'))." 23:59:59"; + $owner = FormLib::get_form_value('owner',''); + $priority = FormLib::get_form_value('priority',0); + + $infoQ = $dbc->prepare_statement("select discType from batchType where batchTypeID=?"); + $infoR = $dbc->exec_statement($infoQ,array($type)); + $discounttype = array_pop($dbc->fetch_array($infoR)); + + $insQ = $dbc->prepare_statement("INSERT INTO batches (startDate,endDate,batchName,batchType, + discounttype,priority) VALUES (?,?,?,?,?,?)"); + $insR = $dbc->exec_statement($insQ,array($startdate,$enddate,$name,$type, + $discounttype,$priority)); + $id = $dbc->insert_id(); + + $insQ = $dbc->prepare_statement("insert batchowner values (?,?)"); + $insR = $dbc->exec_statement($insQ,array($id,$owner)); + + $out .= $this->batchListDisplay(); + break; + case 'deleteBatch': + $id = FormLib::get_form_value('id',0); + + $unsaleQ = "UPDATE products AS p LEFT JOIN batchList as b + ON p.upc=b.upc + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + WHERE b.upc NOT LIKE '%LC%' + AND b.batchID=?"; + if ($FANNIE_SERVER_DBMS=="MSSQL"){ + $unsaleQ = "UPDATE products SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + FROM products AS p, batchList as b + WHERE p.upc=b.upc AND b.upc NOT LIKE '%LC%' + AND b.batchID=?"; + } + $prep = $dbc->prepare_statement($unsaleQ); + $unsaleR = $dbc->exec_statement($prep,array($id)); + + $unsaleLCQ = "UPDATE products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,p.discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + WHERE l.upc LIKE '%LC%' + AND l.batchID=?"; + if ($FANNIE_SERVER_DBMS=="MSSQL"){ + $unsaleLCQ = "UPDATE products + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + WHERE l.upc LIKE '%LC%' + AND l.batchID=?"; + } + $prep = $dbc->prepare_statement($unsaleLCQ); + $unsaleLCR = $dbc->exec_statement($prep,array($id)); + + $delQ = $dbc->prepare_statement("delete from batches where batchID=?"); + $delR = $dbc->exec_statement($delQ,array($id)); + + $delQ = $dbc->prepare_statement("delete from batchList where batchID=?"); + $delR = $dbc->exec_statement($delQ,array($id)); + + $out .= $this->batchListDisplay(); + break; + case 'saveBatch': + $id = FormLib::get_form_value('id',0); + $name = FormLib::get_form_value('name',''); + $type = FormLib::get_form_value('type',0); + $startdate = FormLib::get_form_value('startdate',date('Y-m-d')).' 00:00:00'; + $enddate = FormLib::get_form_value('enddate',date('Y-m-d')).' 23:59:59'; + $owner = FormLib::get_form_value('owner',''); + + $infoQ = $dbc->prepare_statement("select discType from batchType where batchTypeID=?"); + $infoR = $dbc->exec_statement($infoQ,array($type)); + $discounttype = array_pop($dbc->fetch_array($infoR)); + + $upQ = $dbc->prepare_statement("update batches set batchName=?, + batchType=?,discounttype=?,startDate=?,endDate=? where batchID=?"); + $upR = $dbc->exec_statement($upQ,array($name,$type,$discounttype,$startdate, + $enddate,$id)); + + $checkQ = $dbc->prepare_statement("select batchID from batchowner where batchID=?"); + $checkR = $dbc->exec_statement($checkQ,array($id)); + if($dbc->num_rows($checkR) == 0){ + $insQ = $dbc->prepare_statement("insert batchowner values (?,?)"); + $insR = $dbc->exec_statement($insQ,array($id,$owner)); + } + else{ + $upQ = $dbc->prepare_statement("update batchowner set owner=? where batchID=?"); + $upR = $dbc->exec_statement($upQ,array($owner,$id)); + } + + break; + case 'showBatch': + $id = FormLib::get_form_value('id',0); + $tag = FormLib::get_form_value('tag')=='true' ? True : False; + + $out .= $this->addItemUPCInput($tag); + $out .= "`"; + $out .= $this->showBatchDisplay($id); + + break; + case 'backToList': + $out .= $this->newBatchInput(); + $out .= "`"; + $out .= $this->batchListDisplay(); + + break; + case 'addItemUPC': + $id = FormLib::get_form_value('id',0); + $upc = FormLib::get_form_value('upc',''); + $upc = str_pad(trim($upc),13,'0',STR_PAD_LEFT); + $tag = FormLib::get_form_value('tag')=='true' ? True : False; + + $out .= $this->addItemPriceInput($upc,$tag); + break; + case 'addItemLC': + $id = FormLib::get_form_value('id',0); + $lc = FormLib::get_form_value('lc',0); + $out .= $this->addItemPriceLCInput($lc); + break; + case 'addItemPrice': + $id = FormLib::get_form_value('id',0); + $upc = FormLib::get_form_value('upc',''); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + $price = FormLib::get_form_value('price',''); + $qty = FormLib::get_form_value('limit',0); + + if ($price != ""){ + $checkQ = $dbc->prepare_statement("select upc from batchList where upc=? and batchID=?"); + $checkR = $dbc->exec_statement($checkQ,array($upc,$id)); + if ($dbc->num_rows($checkR) == 0){ + $insQ = $dbc->prepare_statement("INSERT INTO batchList (upc,batchID,salePrice,active,pricemethod,quantity) + VALUES (?,?,?,1,0,?)"); + $insR = $dbc->exec_statement($insQ,array($upc,$id,$price,$qty)); + } + else { + $upQ = $dbc->prepare_statement("update batchList set salePrice=?,quantity=? + where upc=? and batchID=?"); + $upR = $dbc->exec_statement($upQ,array($price,$qty,$upc,$id)); + } + if (FormLib::get_form_value('audited') == '1') + auditPriceChange($dbc,$this->current_user,$upc,$price,$id); + } + + $out .= $this->addItemUPCInput(); + $out .= '`'; + $out .= $this->showBatchDisplay($id); + break; + case 'addItemLCPrice': + $id = FormLib::get_form_value('id',0); + $lc = FormLib::get_form_value('lc',0); + $price = FormLib::get_form_value('price',''); + $qty = FormLib::get_form_value('limit',0); + + if ($price != ""){ + $checkQ = $dbc->prepare_statement("select upc from batchList where upc=? and batchID=?"); + $checkR = $dbc->exec_statement($checkQ,array('LC'.$lc,$id)); + if ($dbc->num_rows($checkR) == 0){ + $insQ = $dbc->prepare_statement("INSERT INTO batchList (upc,batchID,salePrice,active,pricemethod,quantity) + VALUES (?,?,?,1,0,?)"); + $insR = $dbc->exec_statement($insQ,array('LC'.$lc,$id,$price,$qty)); + } + else { + $upQ = $dbc->prepare_statement("update batchList set salePrice=?,quantity=? + where upc=? and batchID=?"); + $upR = $dbc->exec_statement($upQ,array($price,$qty,'LC'.$lc,$id)); + } + if (FormLib::get_form_value('audited') == '1') + auditPriceChangeLC($dbc,$this->current_user,$upc,$price,$id); + } + + $out .= $this->addItemLCInput(); + $out .= '`'; + $out .= $this->showBatchDisplay($id); + break; + case 'deleteItem': + $id = FormLib::get_form_value('id',0); + $upc = FormLib::get_form_value('upc',''); + + $delQ = $dbc->prepare_statement("delete from batchList where batchID=? and upc=?"); + $delR = $dbc->exec_statement($delQ,array($id,$upc)); + + $delQ = $dbc->prepare_statement("delete from batchBarcodes where upc=? and batchID=?"); + $delR = $dbc->exec_statement($delQ,array($upc,$id)); + + if (substr($upc,0,2) != 'LC'){ + // take the item off sale if this batch is currently on sale + $unsaleQ = "UPDATE products AS p LEFT JOIN batchList as b on p.upc=b.upc + set p.discounttype=0,special_price=0,start_date=0,end_date=0 + WHERE p.upc=? and b.batchID=?"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $unsaleQ = "update products set discounttype=0,special_price=0,start_date=0,end_date=0 + from products as p, batches as b where + p.upc=? and b.batchID=? and b.startDate=p.start_date and b.endDate=p.end_date"; + } + $unsaleP = $dbc->prepare_statement($unsaleQ); + $unsaleR = $dbc->exec_statement($unsaleP,array($upc,$id)); + + updateProductAllLanes($upc); + } + else { + $lc = substr($upc,2); + $unsaleQ = "UPDATE products AS p LEFT JOIN upcLike as u on p.upc=u.upc + LEFT JOIN batchList as b ON b.upc=concat('LC',convert(u.likeCode,char)) + set p.discounttype=0,special_price=0,start_date=0,end_date=0 + WHERE u.likeCode=? and b.batchID=?"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $unsaleQ = "update products set discounttype=0,special_price=0,start_date=0,end_date=0 + from products as p, batches as b, upcLike as u + where u.likecode=? and u.upc=p.upc and b.startDate=p.start_date and b.endDate=p.end_date + and b.batchID=?"; + } + $unsaleP = $dbc->prepare_statement($unsaleQ); + $unsaleR = $dbc->exec_statement($unsaleP,array($lc,$id)); + + //syncProductsAllLanes(); + } + if (FormLib::get_form_value('audited') == '1') + auditDelete($dbc,$this->current_user,$upc,$id); + + $out .= $this->showBatchDisplay($id); + break; + case 'refilter': + $owner = FormLib::get_form_value('owner',''); + + $out .= $this->batchListDisplay($owner); + break; + case 'savePrice': + $id = FormLib::get_form_value('id',0); + $upc = FormLib::get_form_value('upc',''); + $saleprice = FormLib::get_form_value('saleprice',0); + $saleqty = FormLib::get_form_value('saleqty',1); + $pm = ($saleqty >= 2)?2:0; + + $upQ = $dbc->prepare_statement("update batchList set salePrice=?,quantity=?, + pricemethod=? where batchID=? and upc=?"); + $upR = $dbc->exec_statement($upQ,array($saleprice,$saleqty,$pm,$id,$upc)); + + $upQ = $dbc->prepare_statement("update batchBarcodes set normal_price=? where upc=? and batchID=?"); + $upR = $dbc->exec_statement($upQ,array($saleprice,$upc,$id)); + + if (FormLib::get_form_value('audited') == '1') + auditSavePrice($dbc,$this->current_user,$upc,$saleprice,$id); + + break; + case 'newTag': + $id = FormLib::get_form_value('id',0); + $upc = FormLib::get_form_value('upc',''); + $price = FormLib::get_form_value('price',0); + + $out .= $this->newTagInput($upc,$price,$id); + + break; + case 'addTag': + $id = FormLib::get_form_value('id',0); + $upc = FormLib::get_form_value('upc',''); + $price = FormLib::get_form_value('price',0); + $desc = FormLib::get_form_value('desc',''); + $brand = FormLib::get_form_value('brand',''); + $units = FormLib::get_form_value('units',1); + $size = FormLib::get_form_value('size',''); + $sku = FormLib::get_form_value('sku',''); + $vendor = FormLib::get_form_value('vendor',''); + + $checkQ = $dbc->prepare_statement("select upc from batchBarcodes where upc=? and batchID = ?"); + $checkR = $dbc->exec_statement($checkQ,array($upc,$id)); + if ($dbc->num_rows($checkR) == 0){ + $insQ = $dbc->prepare_statement("insert into batchBarcodes + (upc,description,normal_price,brand,sku,size,units,vendor,batchID) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); + $args = array($upc,$desc,$price,$brand,$sku,$size,$units,$vendor,$id); + $insR = $dbc->exec_statement($insQ,$args); + } + else { + $upQ = $dbc->prepare_statement("update batchBarcodes set normal_price=? where upc=? AND batchID=?"); + $upR = $dbc->exec_statement($upQ,array($price,$upc,$id)); + } + + $insQ = $dbc->prepare_statement("insert into batchList + (upc,batchID,salePrice,active,pricemethod,quantity) + VALUES (?, ?, ?, 1, 0, 0)"); + $insR = $dbc->exec_statement($insQ,array($upc,$id,$price)); + + $out .= $this->addItemUPCInput(True); + $out .= '`'; + $out .= $this->showBatchDisplay($id); + break; + case 'redisplay': + $mode = FormLib::get_form_value('mode'); + $out .= $this->batchListDisplay('',$mode); + break; + case 'batchListPage': + $filter = FormLib::get_form_value('filter'); + $mode = FormLib::get_form_value('mode'); + $max = FormLib::get_form_value('maxBatchID'); + $out .= $this->batchListDisplay($filter,$mode,$max); + break; + case 'forceBatch': + $id = FormLib::get_form_value('id',0); + forceBatch($id); + break; + case 'switchToLC': + $out .= $this->addItemLCInput(); + break; + case 'switchFromLC': + $out .= $this->addItemUPCInput(); + break; + case 'redisplayWithOrder': + $id = $_GET['id']; + $id = FormLib::get_form_value('id',0); + $order = FormLib::get_form_value('order'); + $out .= $this->showBatchDisplay($id,$order); + break; + case 'expand': + $likecode = FormLib::get_form_value('likecode'); + $saleprice = FormLib::get_form_value('saleprice'); + $out .= $likecode."`"; + $out .= $saleprice."`"; + for ($i = 0; $i < 6; $i++) $out .= " "; + $out .= "`"; + + $likeQ = $dbc->prepare_statement("select p.upc,p.description,p.normal_price + from products as p left join upcLike as u on p.upc=u.upc + where u.likecode = ? order by p.upc desc"); + $likeR = $dbc->exec_statement($likeQ,array($likecode)); + while ($likeW = $dbc->fetch_row($likeR)){ + $out .= "$likeW[0]"; + $out .= "$likeW[1]"; + $out .= "$likeW[2]"; + $out .= "$saleprice"; + $out .= " "; + $out .= " "; + $out .= "`"; + } + $out = substr($out,0,strlen($out)-1); + break; + + case 'doCut': + $upc = FormLib::get_form_value('upc',''); + $bid = FormLib::get_form_value('batchID',''); + $uid = FormLib::get_form_value('uid',''); + $q = $dbc->prepare_statement("INSERT INTO batchCutPaste VALUES (%d,%s,%d)"); + $dbc->exec_statement($q,array($bid,$upc,$uid)); + break; + + case 'unCut': + $upc = FormLib::get_form_value('upc',''); + $bid = FormLib::get_form_value('batchID',''); + $uid = FormLib::get_form_value('uid',''); + $q = $dbc->prepare_statement("DELETE FROM batchCutPaste WHERE upc=%s + AND batchID=%d AND uid=%d"); + $dbc->exec_statement($q,array($upc,$bid,$uid)); + break; + + case 'doPaste': + $bid = FormLib::get_form_value('batchID',''); + $uid = FormLib::get_form_value('uid',''); + $q = $dbc->prepare_statement("SELECT listID FROM batchList as l INNER JOIN + batchCutPaste as b ON b.upc=l.upc AND b.batchID=l.batchID + WHERE b.uid=?"); + $r = $dbc->exec_statement($q,array($uid)); + $upP = $dbc->prepare_statement('UPDATE batchList SET batchID=? WHERE listID=?'); + while($w = $dbc->fetch_row($r)){ + $dbc->exec_statement($upP,array($bid,$w['listID'])); + } + $delP = $dbc->prepare_statement("DELETE FROM batchCutPaste WHERE uid=?"); + $dbc->exec_statement($delP,$uid); + $out .= $this->showBatchDisplay($bid); + break; + case 'moveQual': + case 'moveDisc': + $batchID = FormLib::get_form_value('batchID',''); + $upc = FormLib::get_form_value('upc',''); + $q = $dbc->prepare_statement("UPDATE batchList SET salePrice = -1*salePrice + WHERE batchID=? AND upc=?"); + $r = $dbc->exec_statement($q,array($batchID,$upc)); + $out .= $this->showBatchDisplay($batchID); + break; + case 'PS_toggleDiscSplit': + $bid = FormLib::get_form_value('batchID',''); + $q = $dbc->prepare_statement("SELECT pricemethod FROM batchList WHERE + batchID=?"); + $r = $dbc->exec_statement($q,array($bid)); + $currMethod = 4; + if ($dbc->num_rows($r) > 0){ + $currMethod = array_pop($dbc->fetch_row($r)); + if (empty($currMethod)) $currMethod = 4; + } + $newMethod = ($currMethod==4) ? 3 : 4; + + $q = $dbc->prepare_statement("UPDATE batchList SET pricemethod=? + WHERE batchID=?"); + $r = $dbc->exec_statement($q,array($newMethod,$bid)); + break; + case 'PS_toggleMemberOnly': + $bid = FormLib::get_form_value('batchID',''); + $q = $dbc->prepare_statement("SELECT discounttype FROM batches + WHERE batchID=?"); + $r = $dbc->exec_statement($q,array($bid)); + $cur = array_pop($dbc->fetch_row($r)); + $new = ($cur==1) ? 2 : 1; + $q = $dbc->prepare_statement("UPDATE batches SET discounttype=? + WHERE batchID=?"); + $r = $dbc->exec_statement($q,array($new,$bid)); + break; + case 'PS_pricing': + $qty = $_REQUEST['quantity']; + $qty = FormLib::get_form_value('quantity'); + $disc = FormLib::get_form_value('discount'); + if ($disc < 0) $disc = abs($disc); + $dtype = FormLib::get_form_value('discounttype'); + $pmethod = FormLib::get_form_value('pricemethod'); + $bid = FormLib::get_form_value('batchID',0); + + $upQ1 = $dbc->prepare_statement("UPDATE batches SET discounttype=? + WHERE batchID=?"); + $upQ2 = $dbc->prepare_statement("UPDATE batchList SET + quantity=?,pricemethod=?, + salePrice=? WHERE batchID=? + AND salePrice >= 0"); + $upQ3 = $dbc->prepare_statement("UPDATE batchList SET + quantity=?,pricemethod=?, + salePrice=? WHERE batchID=? + AND salePrice < 0"); + $dbc->exec_statement($upQ1,array($dtype,$bid)); + $dbc->exec_statement($upQ2,array($qty+1,$pmethod,$disc,$bid)); + $dbc->exec_statement($upQ3,array($qty+1,$pmethod,-1*$disc,$bid)); + break; + case 'saveLimit': + $limit = FormLib::get_form_value('limit'); + $bid = FormLib::get_form_value('batchID',0); + $limitQ = $dbc->prepare_statement("UPDATE batchList SET quantity=? WHERE batchID=?"); + $dbc->exec_statement($limitQ,array($limit,$bid)); + break; + case 'autoTag': + $bid = FormLib::get_form_value('batchID',0); + $delQ = $dbc->prepare_statement("DELETE FROM batchBarcodes where batchID=?"); + $dbc->exec_statement($delQ,array($bid)); + + $selQ = $dbc->prepare_statement(" + select l.upc,p.description,l.salePrice, + case when x.manufacturer is null then v.brand + else x.manufacturer end as brand, + case when v.sku is null then '' else v.sku end as sku, + case when v.size is null then '' else v.size end as size, + case when v.units is null then 1 else v.units end as units, + case when x.distributor is null then z.vendorName + else x.distributor end as vendor, + l.batchID + from batchList as l + inner join products as p on + l.upc=p.upc + left join prodExtra as x on + l.upc=x.upc + left join vendorItems as v on + l.upc=v.upc + left join vendors as z on + v.vendorID=z.vendorID + where batchID=? ORDER BY l.upc"); + $selR = $dbc->exec_statement($selQ,array($bid)); + $upc = ""; + $insP = $dbc->prepare_statement("INSERT INTO batchBarcodes + (upc,description,normal_price,brand,sku,size,units,vendor,batchID) + VALUES (?,?,?,?,?,?,?,?,?)"); + while($selW = $dbc->fetch_row($selR)){ + if ($upc != $selW['upc']){ + $dbc->exec_statement($insP,array( + $selW['upc'], $selW['description'], + $selW['salePrice'], $selW['brand'], + $selW['sku'], $selW['size'], + $selW['units'], $selW['vendor'], + $selW['batchID'] + )); + } + $upc = $selW['upc']; + } + break; + default: + $out .= 'bad request'; + break; + } + + print $out; + return; + } + + /* input functions + * functions for generating content that goes in the + * inputarea div + */ + function newBatchInput(){ + global $FANNIE_URL, $FANNIE_STORE_ID; + + $ret = "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        Batch TypeNameStart dateEnd dateOwnerPriority

        "; + + $ret .= ""; + $ret .= "Filter: show batches owned by: "; + $ret .= ""; + $ret .= ""; + + $ret .= " Print shelf tags"; + + return $ret; + } + + function addItemUPCInput($newtags=False){ + $ret = "
        "; + $ret .= "UPC: "; + $ret .= ""; + $ret .= "New shelf tag"; + $ret .= " + Likecode"; + $ret .= "
        "; + + return $ret; + } + + function addItemLCInput($newtags=False){ + $dbc = $this->con; + $ret = "
        "; + $ret .= ""; + $ret .= "Like code: "; + $ret .= ""; + $ret .= ""; + $ret .= " Likecode"; + $ret .= ""; + $ret .= "
        "; + + return $ret; + } + + function addItemPriceInput($upc,$newtags=False){ + $dbc = $this->con; + + $fetchQ = $dbc->prepare_statement("select description,normal_price from products where upc=?"); + $fetchR = $dbc->exec_statement($fetchQ,array($upc)); + $fetchW = $dbc->fetch_array($fetchR); + + $ret = "
        "; + $ret .= ""; + $ret .= "UPC: $upc Description: $fetchW[0] Normal price: $fetchW[1] "; + $ret .= "Sale price: "; + $ret .= ""; + $ret .= "con; + + $fetchQ = $dbc->prepare_statement("select likecodedesc from likeCodes where likecode=?"); + $fetchR = $dbc->exec_statement($fetchQ,array($lc)); + $desc = array_pop($dbc->fetch_array($fetchR)); + + /* get the most common price for items in a given + * like code + */ + $fetchQ = $dbc->prepare_statement("select p.normal_price from products as p + left join upcLike as u on p.upc=u.upc and u.likecode=? + where u.upc is not null + group by p.normal_price + order by count(*) desc"); + $fetchR = $dbc->exec_statement($fetchQ,array($lc)); + $normal_price = array_pop($dbc->fetch_array($fetchR)); + + $ret = ""; + $ret .= ""; + $ret .= "Like code: $lc Description: $desc Normal price: $normal_price "; + $ret .= "Sale price: "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + return $ret; + } + + function newTagInput($upc,$price,$id){ + $dbc = $this->con; + + $unfiQ = $dbc->prepare_statement("select brand,sku,size,upc,units, + cost,description,depart from unfi where upc = ?"); + $unfiR = $dbc->exec_statement($unfiQ,array($upc)); + $unfiN = $dbc->num_rows($unfiR); + + $size = ''; + $brand = ''; + $units = ''; + $sku = ''; + $desc = ''; + $vendor = ''; + // grab info from the UNFI table if possible. + if ($unfiN == 1){ + $unfiW = $dbc->fetch_array($unfiR); + $size = $unfiW['size']; + $brand = strtoupper($unfiW['brand']); + $brand = preg_replace("/\'/","",$brand); + $units = $unfiW['units']; + $sku = $unfiW['sku']; + $desc = strtoupper($unfiW['description']); + $desc = preg_replace("/\'/","",$desc); + $vendor = 'UNFI'; + } + // otherwise, snag at least the description from products + else { + $descQ = $dbc->prepare_statement("select description from products where upc=?"); + $descR = $dbc->exec_statement($descQ,array($upc)); + $desc = strtoupper(array_pop($dbc->fetch_array($descR))); + } + + $ret = "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        UPC$upc
        Description
        Brand
        Units
        Size
        Vendor
        SKU
        Price$price"; + $ret .= "
        Cancel
        "; + + return $ret; + } + + /* display functions + * functions for generating content that goes in the + * displayarea div + */ + function batchListDisplay($filter='',$mode='all',$maxBatchID=''){ + global $FANNIE_URL; + $dbc = $this->con; + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $ret = ""; + $ret .= "Display: "; + if ($mode != 'pending') + $ret .= "Pending | "; + else + $ret .= "Pending | "; + if ($mode != 'current') + $ret .= "Current | "; + else + $ret .= "Current | "; + if ($mode != 'historical') + $ret .= "Historical | "; + else + $ret .= "Historical | "; + if ($mode != 'all') + $ret .= "All"; + else + $ret .= "All
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + // the 'all' query + // where clause is for str_ireplace below + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID WHERE 1=1 + order by b.batchID desc"; + $args = array(); + switch($mode){ + case 'pending': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + WHERE ".$dbc->datediff("b.startDate",$dbc->now())." > 0 + order by b.batchID desc"; + break; + case 'current': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + WHERE ".$dbc->datediff("b.startDate",$dbc->now())." <= 0 + and ".$dbc->datediff("b.endDate",$dbc->now())." >= 0 + order by b.batchID desc"; + break; + case 'historical': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + WHERE ".$dbc->datediff("b.endDate",$dbc->now())." <= 0 + order by b.batchID desc"; + break; + } + // use a filter - only works in 'all' mode + if ($filter != ''){ + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID WHERE o.owner=? order by b.batchID desc"; + $args[] = $filter; + } + $fetchQ = $dbc->add_select_limit($fetchQ,50); + if (is_numeric($maxBatchID)){ + $fetchQ = str_replace("WHERE ","WHERE b.batchID < ? AND ",$fetchQ); + array_unshift($args,$maxBatchID); + } + $fetchR = $dbc->exec_statement($fetchQ,$args); + + $count = 0; + $lastBatchID = 0; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $fetchW[2] = array_shift(explode(" ",$fetchW[2])); + $ret .= ""; + $fetchW[3] = array_shift(explode(" ",$fetchW[3])); + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $count++; + $lastBatchID = $fetchW[4]; + } + + $ret .= "
        Batch NameTypeStart dateEnd dateOwner 
        $fetchW[0]".$this->batchtypes[$fetchW[1]]."$fetchW[2]$fetchW[3]$fetchW[5]\"Edit\"\"Delete\"Report
        "; + + if (is_numeric($maxBatchID)){ + $ret .= sprintf("First Page + | ", + $filter,$mode); + } + if ($count >= 50){ + $ret .= sprintf("Next page", + $filter,$mode,$lastBatchID); + } + else { + $ret .= "Next page"; + } + + return $ret; + } + + function showBatchDisplay($id,$order='natural'){ + global $FANNIE_SERVER_DBMS,$FANNIE_URL; + $dbc = $this->con; + $uid = getUID($this->current_user); + $uid = ltrim($uid,'0'); + + $orderby = ''; + switch($orderby){ + case 'natural': + default: + $orderby = 'ORDER BY b.listID DESC'; + break; + case 'upc_a': + $orderby = 'ORDER BY b.upc ASC'; + break; + case 'upc_d': + $orderby = 'ORDER BY b.upc DESC'; + break; + case 'desc_a': + $orderby = 'ORDER BY description ASC'; + break; + case 'desc_b': + $orderby = 'ORDER BY description DESC'; + break; + case 'price_a': + $orderby = 'ORDER BY p.normal_price ASC'; + break; + case 'price_d': + $orderby = 'ORDER BY p.normal_price DESC'; + break; + case 'sale_a': + $orderby = 'ORDER BY p.sale_price ASC'; + break; + case 'sale_d': + $orderby = 'ORDER BY p.sale_price DESC'; + break; + } + + $nameQ = $dbc->prepare_statement("select batchName,batchType,discountType from batches where batchID=?"); + $nameR = $dbc->exec_statement($nameQ,array($id)); + $nameW = $dbc->fetch_row($nameR); + $name = $nameW[0]; + $type = $nameW[1]; + $dtype = $nameW[2]; + + if ($type == 10){ + return $this->showPairedBatchDisplay($id,$name); + } + + $limitQ = $dbc->prepare_statement("select max(quantity),max(pricemethod) from batchList WHERE batchID=?"); + $limitR = $dbc->exec_statement($limitQ,array($id)); + $hasLimit = False; + $canHaveLimit = False; + $limit = 0; + if ($dbc->num_rows($limitR) > 0){ + $limitW = $dbc->fetch_row($limitR); + $limit = $limitW[0]; + $pm = $limitW[1]; + if ($pm > 0){ + // no limits with grouped sales + $canHaveLimit = False; + $p = $dbc->prepare_statement("UPDATE batchList SET quantity=0 WHERE pricemethod=0 + AND batchID=?"); + $dbc->exec_statement($p,array($id)); + } + else { + $canHaveLimit = True; + if ($limit > 0){ + $hasLimit = True; + } + } + } + + $saleHeader = "Sale Price"; + if ($dtype == 3){ + $saleHeader = "$ Discount"; + } + elseif ($dtype == 4){ + $saleHeader = "% Discount"; + } + elseif ($dtype == 0){ + $saleHeader = "New price"; + } + + $fetchQ = "select b.upc, + case when l.likeCode is null then p.description + else l.likeCodeDesc end as description, + p.normal_price,b.salePrice, + CASE WHEN c.upc IS NULL then 0 ELSE 1 END as isCut, + b.quantity,b.pricemethod + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = concat('LC',convert(l.likeCode,char)) + left join batchCutPaste as c ON + b.upc=c.upc AND b.batchID=c.batchID + where b.batchID = ? $orderby"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $fetchQ = "select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice, + CASE WHEN c.upc IS NULL then 0 ELSE 1 END as isCut, + b.quantity,b.pricemethod + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = 'LC'+convert(varchar,l.likecode) + left join batchCutPaste as c ON + b.upc=c.upc AND b.batchID=c.batchID + where b.batchID = ? $orderby"; + } + $fetchP = $dbc->prepare_statement($fetchQ); + $fetchR = $dbc->exec_statement($fetchP,array($id)); + + $cpCount = $dbc->prepare_statement("SELECT count(*) FROM batchCutPaste WHERE uid=?"); + $res = $dbc->exec_statement($cpCount,array($uid)); + $cp = array_pop($dbc->fetch_row($res)); + + $ret = "Batch name: $name
        "; + $ret .= "Back to batch list | "; + $ret .= "Print shelf tags | "; + $ret .= "Auto-tag | "; + if ($cp > 0) + $ret .= "Paste Items ($cp) | "; + $ret .= "Force batch | "; + if (!$canHaveLimit){ + $ret .= "No limit"; + $ret .= " "; + } + else if (!$hasLimit){ + $ret .= "Add Limit"; + $ret .= " "; + } + else if ($hasLimit){ + $ret .= "Limit:"; + $ret .= " $limit"; + } + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + if ($orderby != "ORDER BY b.upc ASC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY description ASC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY p.normal_price DESC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY b.salePrice DESC") + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $qtystr = ($fetchW['pricemethod']>0 && is_numeric($fetchW['quantity']) && $fetchW['quantity'] > 0)?$fetchW['quantity']." for ":""; + $ret .= "",$fetchW[3]); + $ret .= ""; + $ret .= ""; + if ($fetchW[4] == 1) + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        UPCUPCDescriptionDescriptionNormal priceNormal price$saleHeader$saleHeader 
        $fetchW[0]"; + $ret .= ""; + $ret .= " [+]"; + $ret .= "$fetchW[0]$fetchW[1]$fetchW[2]$qtystr"; + $ret .= sprintf("%.2f\"Edit\"\"Delete\"UndoCut
        "; + $ret .= ""; + + return $ret; + } + + function showPairedBatchDisplay($id,$name){ + global $FANNIE_SERVER_DBMS,$FANNIE_URL; + $dbc = $this->con; + $uid = getUID($this->current_user); + $uid = ltrim($uid,'0'); + + $ret = ""; + $ret .= sprintf('',$id); + $ret .= "Batch name: $name
        "; + $ret .= "Back to batch list | "; + $ret .= "Force batch"; + $ret .= "No limit"; + $ret .= " "; + + $q = $dbc->prepare_statement("SELECT b.discounttype,salePrice, + CASE WHEN l.pricemethod IS NULL THEN 4 ELSE l.pricemethod END as pricemethod, + CASE WHEN l.quantity IS NULL THEN 1 ELSE l.quantity END as quantity + FROM batches AS b LEFT JOIN batchList AS l + ON b.batchID=l.batchID WHERE b.batchID=? ORDER BY l.pricemethod"); + $r = $dbc->exec_statement($q,array($id)); + $w = $dbc->fetch_row($r); + + if (!empty($w['salePrice'])){ + $ret .= "Add all items before fiddling with these settings + or they'll tend to go haywire"; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= sprintf('', + $w['quantity']-1); + $ret .= ''; + $ret .= sprintf('', + (empty($w['salePrice'])?'':abs($w['salePrice']))); + $ret .= sprintf('',$id); + $ret .= '
        Member only saleSplit discount
        Qualifiers RequiredDiscount
        '; + } + else { + $ret .= "Add items first"; + } + + $fetchQ = $dbc->prepare_statement("select b.upc, + case when l.likeCode is null then p.description + else l.likeCodeDesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = concat('LC'+convert(l.likeCode,char)) + where b.batchID = ? AND b.salePrice >= 0"); + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $fetchQ = $dbc->prepare_statement("select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = 'LC'+convert(varchar,l.likecode) + where b.batchID = ? AND b.salePrice >= 0"); + } + $fetchR = $dbc->exec_statement($fetchQ,array($id)); + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + $ret .= '

        '; + $ret .= ''; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        Qualifying Item(s)
        $fetchW[0]"; + $ret .= "$fetchW[0]$fetchW[1]\"Make\"Delete\"
        "; + + $fetchQ = $dbc->prepare_statement("select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = concat('LC',convert(l.likecode,char)) + where b.batchID = ? AND b.salePrice < 0"); + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $fetchQ = $dbc->prepare_statement("select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = 'LC'+convert(varchar,l.likecode) + where b.batchID = ? AND b.salePrice < 0"); + } + $fetchR = $dbc->exec_statement($fetchQ,array($id)); + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + $ret .= '

        '; + $ret .= ''; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        Discount Item(s)
        $fetchW[0]"; + $ret .= "$fetchW[0]$fetchW[1]\"Make\"Delete\"
        "; + + return $ret; + } + + function body_content(){ + global $FANNIE_URL; + $this->add_script('index.js'); + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + $this->add_css_file('index.css'); + $this->add_css_file($FANNIE_URL.'src/style.css'); + ob_start(); + ?> + + Batch Management + + + +

        + newBatchInput(); ?> +
        +
        + batchListDisplay(); ?> +
        + + + batchtypes as $b) + $typestr .= $b."`"; + $typestr = substr($typestr,0,strlen($typestr)-1); + + $tidstr = ""; + foreach($this->batchtypes as $tid=>$b) + $tidstr .= $tid."`"; + $tidstr = substr($tidstr,0,strlen($tidstr)-1); + + $ownerstr = ""; + foreach($this->owners as $o) + $ownerstr .= $o."`"; + $ownerstr = substr($ownerstr,0,strlen($ownerstr)-1); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ''; + + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new BatchManagementTool(); + $obj->draw_page(); +} + diff --git a/fannie/batches/newbatch.oo/audit.php b/fannie/batches/newbatch.oo/audit.php new file mode 100644 index 000000000..9fb184a76 --- /dev/null +++ b/fannie/batches/newbatch.oo/audit.php @@ -0,0 +1,174 @@ +"andy@wholefoods.coop", + 1=>"jim@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 2=>"jesse@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 3=>"debbie@wholefoods.coop, aelliott@wholefoods.coop, justin@wholefoods.coop, rianna@wholefoods.coop", + 4=>"joeu@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 5=>"jillhall@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 6=>"michael@wholefoods.coop, alex@wholefoods.coop", + 7=>"shannon@wholefoods.coop", + 8=>"jesse@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 9=>"lisa@wholefoods.coop","meales@wholefoods.coop" +); +$hostname = 'key.wfco-op.store'; + +function auditPriceChange($sql,$uid,$upc,$price,$batchID){ + global $tos, $hostname, $FANNIE_URL; + + $query = $sql->prepare_statement("select p.description,b.batchName,s.superID from products as p, batches as b, + MasterSuperDepts AS s + where p.upc = ? and b.batchID=? AND p.department=s.dept_ID"); + $result = $sql->exec_statement($query,array($upc,$batchID)); + $row = $sql->fetch_row($result); + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been added to the batch\n"; + $message .= "Sale Price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditPriceChangeLC($sql,$uid,$upc,$price,$batchID){ + global $tos,$hostname,$FANNIE_URL; + + $query = $sql->prepare_statement("select l.likeCodeDesc,b.batchName from likeCodes as l, batches as b + where b.batchID=? and l.likecode=?"); + $result = $sql->exec_statement($query,array($batchID,substr($upc,2))); + $row = $sql->fetch_row($result); + $deptQ = $sql->prepare_statement("select s.superID from products as p left join + upcLike as u on p.upc=u.upc left join + MasterSuperDepts AS s ON p.department=s.dept_ID + where u.likecode=? + group by s.superID order by count(*) desc"); + $deptR = $sql->exec_statement($deptQ,array(substr($upc,2))); + $dept_sub = array_pop($sql->fetch_row($deptR)); + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Likecode $upc ($row[0]) has been added to the batch\n"; + $message .= "Sale price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditSavePrice($sql,$uid,$upc,$price,$batchID){ + global $tos,$hostname,$FANNIE_URL; + + $query = $sql->prepare_statement("select p.description,b.batchName,s.superID from products as p, batches as b, + MasterSuperDepts AS s + where p.upc = ? and b.batchID=? AND s.dept_ID=p.department"); + $args = array($upc, $batchID); + if (substr($upc,0,2) == "LC"){ + $query = $sql->prepare_statement("select l.likeCodeDesc,b.batchName from likeCodes as l, batches as b + where b.batchID=? and l.likecode=?"); + $args = array($batchID, substr($upc,2)); + } + $result = $sql->exec_statement($query,$args); + $row = $sql->fetch_row($result); + $dept_sub = 0; + if (substr($upc,0,2) == "LC"){ + $deptQ = $sql->prepare_statement("select s.superID,count(*) from products as p left join + upcLike as u on p.upc=u.upc left join + MasterSuperDepts AS s ON p.department=s.dept_ID + where u.likecode=? + group by s.superID order by count(*) desc"); + $deptR = $sql->exec_statement($deptQ,array(substr($upc,2))); + $dept_sub = array_pop($sql->fetch_row($deptR)); + } + else + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been re-priced\n"; + $message .= "Sale Price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditDelete($sql,$uid,$upc,$batchID){ + global $tos,$hostname,$FANNIE_URL; + + $query = $sql->prepare_statement("select p.description,b.batchName,s.superID from products as p, batches as b, + MasterSuperDepts AS s + where p.upc = ? and b.batchID=? AND s.dept_ID=p.department"); + $args = array($upc, $batchID); + if (substr($upc,0,2) == "LC"){ + $query = $sql->prepare_statement("select l.likeCodeDesc,b.batchName from likeCodes as l, batches as b + where b.batchID=? and l.likecode=?"); + $args = array($batchID, substr($upc,2)); + } + $result = $sql->exec_statement($query,$args); + $row = $sql->fetch_row($result); + $dept_sub = 0; + if (substr($upc,0,2) == "LC"){ + $deptQ = $sql->prepare_statement("select s.superID from products as p left join + upcLike as u on p.upc=u.upc left join + MasterSuperDepts AS s ON p.department=s.dept_ID + where u.likecode=? + group by s.superID order by count(*) desc"); + $deptR = $sql->exec_statement($deptQ,array(substr($upc,2))); + $dept_sub = array_pop($sql->fetch_row($deptR)); + } + else + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been deleted from the batch\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} +?> diff --git a/fannie/batches/newbatch.oo/batchReport.php b/fannie/batches/newbatch.oo/batchReport.php new file mode 100644 index 000000000..788d690f9 --- /dev/null +++ b/fannie/batches/newbatch.oo/batchReport.php @@ -0,0 +1,34 @@ + diff --git a/fannie/batches/newbatch.oo/forceBatch.php b/fannie/batches/newbatch.oo/forceBatch.php new file mode 100644 index 000000000..7e446ccac --- /dev/null +++ b/fannie/batches/newbatch.oo/forceBatch.php @@ -0,0 +1,196 @@ +prepare_statement("SELECT batchType,discountType FROM batches WHERE batchID = ?"); + $batchInfoR = $dbc->exec_statement($batchInfoQ,array($batchID)); + $batchInfoW = $dbc->fetch_array($batchInfoR); + + $forceQ = ""; + $forceLCQ = ""; + $forceMMQ = ""; + if ($batchInfoW['discountType'] != 0){ + + $forceQ="UPDATE products AS p + INNER JOIN batchList AS l + ON p.upc=l.upc + INNER JOIN batches AS b + ON l.batchID=b.batchID + SET p.start_date = b.startDate, + p.end_date=b.endDate, + p.special_price=l.salePrice, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialpricemethod=l.pricemethod, + p.specialquantity=l.quantity, + p.discounttype=b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN concat('b',convert(l.batchID,char)) + ELSE p.mixmatchcode + END + WHERE l.upc not like 'LC%' + and l.batchID = ?"; + + $forceLCQ = "UPDATE products AS p + INNER JOIN likeCodeView AS v + ON v.upc=p.upc + INNER JOIN batchList as l + ON l.upc=concat('LC',convert(v.likecode,char)) + INNER JOIN batches AS b + ON b.batchID=l.batchID + set p.special_price = l.salePrice, + p.end_date = b.endDate,p.start_date=b.startDate, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialpricemethod=l.pricemethod, + p.specialquantity=l.quantity, + p.discounttype = b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN concat('b',convert(l.batchID,char)) + ELSE p.mixmatchcode + END + where l.batchID=?"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $forceQ="UPDATE products + SET start_date = b.startDate, + end_date=b.endDate, + special_price=l.salePrice, + specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + specialpricemethod=l.pricemethod, + specialquantity=l.quantity, + discounttype=b.discounttype, + mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(varchar,l.batchID) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(varchar,-1*l.batchID) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN 'b'+convert(varchar,l.batchID) + ELSE p.mixmatchcode + END + FROM products as p, + batches as b, + batchList as l + WHERE l.upc = p.upc + and l.upc not like 'LC%' + and b.batchID = l.batchID + and b.batchID = ?"; + + $forceLCQ = "update products set special_price = l.salePrice, + end_date = b.endDate,start_date=b.startDate, + discounttype = b.discounttype, + specialpricemethod=l.pricemethod, + specialquantity=l.quantity, + specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(varchar,l.batchID) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(varchar,-1*l.batchID) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN 'b'+convert(varchar,l.batchID) + ELSE p.mixmatchcode + END + from products as p left join + likeCodeView as v on v.upc=p.upc left join + batchList as l on l.upc='LC'+convert(varchar,v.likecode) + left join batches as b on b.batchID = l.batchID + where b.batchID=?"; + } + } + else{ + $forceQ = "UPDATE products AS p + INNER JOIN batchList AS l + ON l.upc=p.upc + SET p.normal_price = l.salePrice, + p.modified = curdate() + WHERE l.upc not like 'LC%' + AND l.batchID = ?"; + + $forceLCQ = "UPDATE products AS p + INNER JOIN upcLike AS v + ON v.upc=p.upc INNER JOIN + batchList as b on b.upc=concat('LC',convert(v.likecode,char)) + set p.normal_price = b.salePrice, + p.modified=curdate() + where b.batchID=?"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $forceQ = "UPDATE products + SET normal_price = l.salePrice, + modified = getdate() + FROM products as p, + batches as b, + batchList as l + WHERE l.upc = p.upc + AND l.upc not like 'LC%' + AND b.batchID = l.batchID + AND b.batchID = ?"; + + $forceLCQ = "update products set normal_price = b.salePrice, + modified=getdate() + from products as p left join + upcLike as v on v.upc=p.upc left join + batchList as b on b.upc='LC'+convert(varchar,v.likecode) + where b.batchID=?"; + } + } + + $forceP = $dbc->prepare_statement($forceQ); + $forceR = $dbc->exec_statement($forceP,array($batchID)); + $forceLCP = $dbc->prepare_statement($forceLCQ); + $forceR = $dbc->exec_statement($forceLCP,array($batchID)); + + $q = $dbc->prepare_statement("SELECT upc FROM batchList WHERE batchID=?"); + $r = $dbc->exec_statement($q,array($batchID)); + $likeP = $dbc->prepare_statement('SELECT upc FROM upcLike WHERE likeCode=?'); + while($w = $dbc->fetch_row($r)){ + $upcs = array($w['upc']); + if (substr($w['upc'],0,2)=='LC'){ + $upcs = array(); + $lc = substr($w['upc'],2); + $r2 = $dbc->exec_statement($likeP,array($lc)); + while($w2 = $dbc->fetch_row($r2)) + $upcs[] = $w2['upc']; + } + foreach($upcs as $u){ + updateProductAllLanes($u); + } + } +} + +?> diff --git a/fannie/batches/newbatch.oo/index.css b/fannie/batches/newbatch.oo/index.css new file mode 100644 index 000000000..7a7354e98 --- /dev/null +++ b/fannie/batches/newbatch.oo/index.css @@ -0,0 +1,26 @@ +form { + display: inline; +} + +#inputarea { + text-align: left; + width: 80%; + padding-bottom: 8px; + border-bottom: 1px solid #000000; +} + +#inputarea th { + text-align: left; +} + +#displayarea { + padding-top: 8px; +} + +img { + border:0; +} + +.newBatchBlack { + color: #000000; +} diff --git a/fannie/batches/newbatch.oo/index.js b/fannie/batches/newbatch.oo/index.js new file mode 100644 index 000000000..3498ce006 --- /dev/null +++ b/fannie/batches/newbatch.oo/index.js @@ -0,0 +1,520 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'BatchManagementTool.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText.replace(/^\s*/,''); + var array = response.split('`'); + switch(array[0]){ + case 'newBatch': + case 'deleteBatch': + case 'deleteItem': + case 'refilter': + case 'redisplay': + case 'batchListPage': + case 'redisplayWithOrder': + case 'doPaste': + case 'moveQual': + case 'moveDisc': + document.getElementById('displayarea').innerHTML = array[1]; + break; + case 'newTag': + document.getElementById('inputarea').innerHTML = array[1]; + break; + case 'saveBatch': + case 'savePrice': + case 'forceBatch': + case 'doCut': + case 'unCut': + case 'PS_toggleDiscSplit': + case 'PS_toggleMemberOnly': + case 'saveLimit': + break; + case 'PS_pricing': + alert('Pricing Updated!'); + break; + case 'autoTag': + alert('New tags generated'); + break; + case 'showBatch': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('addItemUPC').focus(); + break; + case 'backToList': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('newBatchName').focus(); + break; + case 'addItemUPC': + case 'addItemLC': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('addItemPrice').focus(); + break; + case 'switchToLC': + case 'switchFromLC': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('addItemUPC').focus(); + document.getElementById('addItemUPC').select(); + break; + case 'addItemPrice': + case 'addItemLCPrice': + case 'addTag': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('addItemUPC').focus(); + document.getElementById('addItemUPC').select(); + break; + case 'expand': + doExpand(array[1],array[2],array); + break; + default: + alert('&'+array[0]+'&'); + } + } +} + +/********************* END AJAX BASICS ******************/ + +function getTypes(){ + return document.getElementById('passtojstypes').value.split("`"); +} +function getTypeIDs(){ + return document.getElementById('passtojstypeids').value.split("`"); +} +function getOwners(){ + return document.getElementById('passtojsowners').value.split("`"); +} + +function newBatch(){ + var type = document.getElementById('newBatchType').value; + var name = document.getElementById('newBatchName').value; + var startdate = document.getElementById('newBatchStartDate').value; + var enddate = document.getElementById('newBatchEndDate').value; + var owner = document.getElementById('newBatchOwner').value; + var priority = document.getElementById('newBatchPriority').value; + + phpSend('newBatch&type='+type+'&name='+name+'&startdate='+startdate+'&enddate='+enddate+'&owner='+owner+'&priority='+priority); + + document.getElementById('newBatchType').value = 0; + document.getElementById('newBatchName').value = ''; + document.getElementById('newBatchStartDate').value = ''; + document.getElementById('newBatchEndDate').value = ''; + + document.getElementById('newBatchName').focus(); +} + +function deleteBatch(id,name){ + var audited = document.getElementById('isAudited').value; + if (audited == "1"){ + alert("You're not allowed to delete batches"); + return; + } + + if (confirm('Delete this batch ('+name+')?')) + phpSend('deleteBatch&id='+id); +} + +function editBatch(id){ + var name = document.getElementById('namelink'+id).innerHTML; + var type = document.getElementById('type'+id).innerHTML; + var startdate = document.getElementById('startdate'+id).innerHTML; + var enddate = document.getElementById('enddate'+id).innerHTML; + var owner = document.getElementById('owner'+id).innerHTML; + + var batchtypes = getTypes(); + var batchtypeids = getTypeIDs(); + var owners = getOwners(); + + var typeselect = ""; + + var ownerselect = ""; + + document.getElementById('name'+id).innerHTML = ""; + document.getElementById('type'+id).innerHTML = typeselect; + document.getElementById('startdate'+id).innerHTML = ""; + document.getElementById('enddate'+id).innerHTML = ""; + document.getElementById('owner'+id).innerHTML = ownerselect; + + var path = document.getElementById('buttonimgpath').value; + var svb = "\"Save\""; + document.getElementById('edit'+id).innerHTML = svb; + + document.getElementById('name'+id+'i').focus(); +} + +function saveBatch(id){ + var name = document.getElementById('name'+id+'i').value; + var type = document.getElementById('type'+id+'i').value; + var startdate = document.getElementById('startdate'+id+'i').value; + var enddate = document.getElementById('enddate'+id+'i').value; + var owner = document.getElementById('owner'+id+'i').value; + + var batchtypes = getTypes(); + var batchtypeids = getTypeIDs(); + var found_index = 0; + for (var i = 0; i < batchtypeids.length; i++){ + if (type == batchtypeids[i]) + found_index = i; + } + + document.getElementById('name'+id).innerHTML = ""+name+""; + document.getElementById('type'+id).innerHTML = batchtypes[found_index]; + document.getElementById('startdate'+id).innerHTML = startdate; + document.getElementById('enddate'+id).innerHTML = enddate; + document.getElementById('owner'+id).innerHTML = owner; + + var path = document.getElementById('buttonimgpath').value; + var eb = "\"Edit\""; + document.getElementById('edit'+id).innerHTML = eb; + + phpSend('saveBatch&id='+id+'&name='+name+'&type='+type+'&startdate='+startdate+'&enddate='+enddate+'&owner='+owner); +} + +function showBatch(id,tag){ + if (document.getElementById('isAudited').value == "1"){ + if (document.getElementById('type'+id).innerHTML == "Price Change"){ + alert("You can't edit price change batches"); + return; + } + } + phpSend('showBatch&id='+id+'&tag='+tag); +} + +function backToList(){ + phpSend('backToList'); +} + +function addItem(){ + var id = document.getElementById('currentBatchID').value; + var upc = document.getElementById('addItemUPC').value; + var tag = document.getElementById('addItemTag').checked; + var lc = document.getElementById('addItemLikeCode').checked; + + if (!lc) + phpSend('addItemUPC&id='+id+'&upc='+upc+'&tag='+tag); + else + phpSend('addItemLC&id='+id+'&lc='+upc); +} + +function addItemFinish(upc){ + var id = document.getElementById('currentBatchID').value; + var price = document.getElementById('addItemPrice').value; + var tag = document.getElementById('addItemTag').checked; + + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + var limit = document.getElementById('currentLimit').innerHTML; + if (limit == '') limit = 0; + + if (!tag || audited=="1") + phpSend('addItemPrice&id='+id+'&upc='+upc+'&price='+price+'&uid='+uid+'&audited='+audited+'&limit='+limit); + else + phpSend('newTag&id='+id+'&upc='+upc+'&price='+price); +} + +function addItemLCFinish(lc){ + var id = document.getElementById('currentBatchID').value; + var price = document.getElementById('addItemPrice').value; + + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + var limit = document.getElementById('currentLimit').innerHTML; + if (limit == '') limit = 0; + + phpSend('addItemLCPrice&id='+id+'&lc='+lc+'&price='+price+'&uid='+uid+'&audited='+audited+'&limit='+limit); +} + +function deleteItem(upc){ + var id = document.getElementById('currentBatchID').value; + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('deleteItem&id='+id+'&upc='+upc+'&uid='+uid+'&audited='+audited); +} + +function refilter(){ + var owner = document.getElementById('filterOwner').value; + + phpSend('refilter&owner='+owner); +} + +function redisplay(mode){ + document.getElementById('filterOwner').selectedIndex = 0; + phpSend('redisplay&mode='+mode); +} + +function batchListPage(filter,mode,batchID){ + phpSend('batchListPage&filter='+filter+'&mode='+mode+'&maxBatchID='+batchID); +} + +function editPrice(upc){ + var saleprice = document.getElementById('salePrice'+upc).innerHTML; + var saleqty = document.getElementById('saleQty'+upc).innerHTML; + var numeric_qty = 1; + if (saleqty != ''){ + numeric_qty = saleqty.split(' ')[0]; + } + + document.getElementById('salePrice'+upc).innerHTML = ""; + document.getElementById('saleQty'+upc).innerHTML = "@"; + + var path = document.getElementById('buttonimgpath').value; + var sv = "\"Save\""; + document.getElementById('editLink'+upc).innerHTML = sv; +} + +function savePrice(upc){ + var saleprice = document.getElementById('salePrice'+upc+'i').value; + var saleqty = document.getElementById('saleQty'+upc+'i').value; + + saleqty = parseInt(saleqty,10); + if (isNaN(saleqty)) + saleqty = 0; + else if (saleqty <= 1) + saleqty = 0; + + document.getElementById('salePrice'+upc).innerHTML = saleprice; + if (saleqty == 0) + document.getElementById('saleQty'+upc).innerHTML = ''; + else + document.getElementById('saleQty'+upc).innerHTML = saleqty+' for '; + + var path = document.getElementById('buttonimgpath').value; + var eb = "\"Edit\""; + document.getElementById('editLink'+upc).innerHTML = eb; + + var id = document.getElementById('currentBatchID').value; + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('savePrice&id='+id+'&upc='+upc+'&saleprice='+saleprice+'&uid='+uid+'&audited='+audited+'&saleqty='+saleqty); +} + +function newTag(){ + var id = document.getElementById('newTagID').value; + var upc = document.getElementById('newTagUPC').value; + var price = document.getElementById('newTagPrice').value; + var desc = document.getElementById('newTagDesc').value; + var brand = document.getElementById('newTagBrand').value; + var units = document.getElementById('newTagUnits').value; + var size = document.getElementById('newTagSize').value; + var sku = document.getElementById('newTagSKU').value; + var vendor = document.getElementById('newTagVendor').value; + + phpSend('addTag&id='+id+'&upc='+upc+'&price='+price+'&desc='+desc+'&brand='+brand+'&units='+units+'&size='+size+'&sku='+sku+'&vendor='+vendor); +} + +function forceBatch(id){ + phpSend('forceBatch&id='+id); + alert('Batch '+id+' has been forced'); +} + +function lcselect_util(){ + var lc = document.getElementById('lcselect').value; + document.getElementById('addItemUPC').value = lc; +} + +function switchToLC(){ + phpSend('switchToLC'); +} + +function switchFromLC(){ + phpSend('switchFromLC'); +} + +function redisplayWithOrder(id,neworder){ + phpSend('redisplayWithOrder&id='+id+'&order='+neworder); +} + +function expand(likecode,saleprice){ + phpSend('expand&likecode='+likecode+'&saleprice='+saleprice); +} + +function doExpand(likecode,saleprice,data){ + var table = document.getElementById('yeoldetable'); + var num = 0; + var row = document.getElementById('expandId'+likecode).value; + for (var i = 3; i < data.length; i++){ + var newrow = table.insertRow(Number(row)+1); + newrow.innerHTML = data[i]; + num++; + } + + var inputs = document.getElementsByName('expandId'); + for (var i = 0; i < inputs.length; i++){ + var theInput = inputs.item(i); + if (Number(theInput.value) > Number(row)) + theInput.value = Number(theInput.value)+num; + } + + var newSpan = " [-]"; + document.getElementById("LCToggle"+likecode).innerHTML = newSpan; +} + +function doCollapse(likecode,saleprice,num){ + var table = document.getElementById('yeoldetable'); + var row = document.getElementById('expandId'+likecode).value; + for (var i = 0; i < num; i++) + table.deleteRow(Number(row)+1); + + var inputs = document.getElementsByName('expandId'); + for (var i = 0; i < inputs.length; i++){ + var theInput = inputs.item(i); + if (Number(theInput.value) > Number(row)) + theInput.value = Number(theInput.value)-num; + } + + var newSpan = " [+]"; + document.getElementById("LCToggle"+likecode).innerHTML = newSpan; +} + +function doCut(upc,batchID,uid){ + phpSend('doCut&upc='+upc+'&batchID='+batchID+'&uid='+uid); + var repl = "Undo"; + document.getElementById('cpLink'+upc).innerHTML = repl; +} + +function unCut(upc,batchID,uid){ + phpSend('unCut&upc='+upc+'&batchID='+batchID+'&uid='+uid); + var repl = "Cut"; + document.getElementById('cpLink'+upc).innerHTML = repl; +} + +function doPaste(uid,batchID){ + phpSend('doPaste&uid='+uid+'&batchID='+batchID); +} + +function moveDisc(upc){ + var id = document.getElementById('currentBatchID').value; + phpSend('moveDisc&batchID='+id+'&upc='+upc); +} + +function moveQual(upc){ + var id = document.getElementById('currentBatchID').value; + phpSend('moveQual&batchID='+id+'&upc='+upc); +} + +function PS_toggleDiscSplit(batchID){ + phpSend('PS_toggleDiscSplit&batchID='+batchID); +} + +function PS_toggleMemberOnly(batchID){ + phpSend('PS_toggleMemberOnly&batchID='+batchID); +} + +function PS_pricing(batchID){ + var qual = document.getElementById('PS_qualCount').value; + var disc = document.getElementById('PS_discount').value; + + var saleType = 1; + if (document.getElementById('PS_memCBX').checked) + saleType = 2; + + var pricemethod = 4; + if (document.getElementById('PS_splitCBX').checked) + pricemethod = 3; + + var str = "quantity="+qual+"&discount="+disc+"&discounttype="+saleType+"&pricemethod="+pricemethod; + phpSend('PS_pricing&batchID='+batchID+'&'+str); +} + +function editLimit(batchID,limit){ + var saveLink = "Save Limit"; + var limitIn = " 0) limitIn += limit; + limitIn += "\" id=\"limitInputBox\" />"; + + document.getElementById('limitLink').innerHTML = saveLink; + document.getElementById('currentLimit').innerHTML = limitIn; + document.getElementById('limitInputBox').focus(); +} + +function saveLimit(batchID){ + var newlimit = document.getElementById('limitInputBox').value; + newlimit = parseInt(newlimit,10); + if (isNaN(newlimit)) + newlimit = 0; + else if (newlimit <= 0) + newlimit = 0; + + var editLink = ""; + if (newlimit==0) editLink += "Add Limit"; + else editLink += "Limit:"; + + document.getElementById('limitLink').innerHTML = editLink; + if (newlimit == 0) + document.getElementById('currentLimit').innerHTML = ''; + else + document.getElementById('currentLimit').innerHTML = newlimit; + + phpSend('saveLimit&batchID='+batchID+'&limit='+newlimit); +} + +function autoTag(bID){ + phpSend('autoTag&batchID='+bID); +} diff --git a/fannie/batches/newbatch.oo/index.php b/fannie/batches/newbatch.oo/index.php new file mode 100644 index 000000000..ba277d122 --- /dev/null +++ b/fannie/batches/newbatch.oo/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/batches/newbatch/audit.php b/fannie/batches/newbatch/audit.php new file mode 100644 index 000000000..9fb184a76 --- /dev/null +++ b/fannie/batches/newbatch/audit.php @@ -0,0 +1,174 @@ +"andy@wholefoods.coop", + 1=>"jim@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 2=>"jesse@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 3=>"debbie@wholefoods.coop, aelliott@wholefoods.coop, justin@wholefoods.coop, rianna@wholefoods.coop", + 4=>"joeu@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 5=>"jillhall@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 6=>"michael@wholefoods.coop, alex@wholefoods.coop", + 7=>"shannon@wholefoods.coop", + 8=>"jesse@wholefoods.coop, lisa@wholefoods.coop","meales@wholefoods.coop", + 9=>"lisa@wholefoods.coop","meales@wholefoods.coop" +); +$hostname = 'key.wfco-op.store'; + +function auditPriceChange($sql,$uid,$upc,$price,$batchID){ + global $tos, $hostname, $FANNIE_URL; + + $query = $sql->prepare_statement("select p.description,b.batchName,s.superID from products as p, batches as b, + MasterSuperDepts AS s + where p.upc = ? and b.batchID=? AND p.department=s.dept_ID"); + $result = $sql->exec_statement($query,array($upc,$batchID)); + $row = $sql->fetch_row($result); + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been added to the batch\n"; + $message .= "Sale Price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditPriceChangeLC($sql,$uid,$upc,$price,$batchID){ + global $tos,$hostname,$FANNIE_URL; + + $query = $sql->prepare_statement("select l.likeCodeDesc,b.batchName from likeCodes as l, batches as b + where b.batchID=? and l.likecode=?"); + $result = $sql->exec_statement($query,array($batchID,substr($upc,2))); + $row = $sql->fetch_row($result); + $deptQ = $sql->prepare_statement("select s.superID from products as p left join + upcLike as u on p.upc=u.upc left join + MasterSuperDepts AS s ON p.department=s.dept_ID + where u.likecode=? + group by s.superID order by count(*) desc"); + $deptR = $sql->exec_statement($deptQ,array(substr($upc,2))); + $dept_sub = array_pop($sql->fetch_row($deptR)); + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Likecode $upc ($row[0]) has been added to the batch\n"; + $message .= "Sale price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditSavePrice($sql,$uid,$upc,$price,$batchID){ + global $tos,$hostname,$FANNIE_URL; + + $query = $sql->prepare_statement("select p.description,b.batchName,s.superID from products as p, batches as b, + MasterSuperDepts AS s + where p.upc = ? and b.batchID=? AND s.dept_ID=p.department"); + $args = array($upc, $batchID); + if (substr($upc,0,2) == "LC"){ + $query = $sql->prepare_statement("select l.likeCodeDesc,b.batchName from likeCodes as l, batches as b + where b.batchID=? and l.likecode=?"); + $args = array($batchID, substr($upc,2)); + } + $result = $sql->exec_statement($query,$args); + $row = $sql->fetch_row($result); + $dept_sub = 0; + if (substr($upc,0,2) == "LC"){ + $deptQ = $sql->prepare_statement("select s.superID,count(*) from products as p left join + upcLike as u on p.upc=u.upc left join + MasterSuperDepts AS s ON p.department=s.dept_ID + where u.likecode=? + group by s.superID order by count(*) desc"); + $deptR = $sql->exec_statement($deptQ,array(substr($upc,2))); + $dept_sub = array_pop($sql->fetch_row($deptR)); + } + else + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been re-priced\n"; + $message .= "Sale Price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditDelete($sql,$uid,$upc,$batchID){ + global $tos,$hostname,$FANNIE_URL; + + $query = $sql->prepare_statement("select p.description,b.batchName,s.superID from products as p, batches as b, + MasterSuperDepts AS s + where p.upc = ? and b.batchID=? AND s.dept_ID=p.department"); + $args = array($upc, $batchID); + if (substr($upc,0,2) == "LC"){ + $query = $sql->prepare_statement("select l.likeCodeDesc,b.batchName from likeCodes as l, batches as b + where b.batchID=? and l.likecode=?"); + $args = array($batchID, substr($upc,2)); + } + $result = $sql->exec_statement($query,$args); + $row = $sql->fetch_row($result); + $dept_sub = 0; + if (substr($upc,0,2) == "LC"){ + $deptQ = $sql->prepare_statement("select s.superID from products as p left join + upcLike as u on p.upc=u.upc left join + MasterSuperDepts AS s ON p.department=s.dept_ID + where u.likecode=? + group by s.superID order by count(*) desc"); + $deptR = $sql->exec_statement($deptQ,array(substr($upc,2))); + $dept_sub = array_pop($sql->fetch_row($deptR)); + } + else + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been deleted from the batch\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://{$hostname}{$FANNIE_URL}batches/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} +?> diff --git a/fannie/batches/newbatch/batchReport.php b/fannie/batches/newbatch/batchReport.php new file mode 100644 index 000000000..bfbbeecd1 --- /dev/null +++ b/fannie/batches/newbatch/batchReport.php @@ -0,0 +1,117 @@ +query($batchInfoQ); + + +if(isset($_GET['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="batchSales.xls"'); + +}else{ + +$page_title = "Batch Report"; +$header = "Fannie :: Batch Report"; +include("../../src/header.html"); + +} +$bStart = ""; +$bEnd = ""; +while($batchInfoW = $dbc->fetch_array($batchInfoR)){ + $bName = $batchInfoW['batchName']; + if(isset($_GET['startDate'])){ + $bStart = $_GET['startDate']." 00:00:00"; + }else{ + $bStart = $batchInfoW['startDate']; + } + if(isset($_GET['endDate'])){ + $bEnd = $_GET['endDate']." 23:59:59"; + }else{ + $bEnd = $batchInfoW['endDate']; + } + + echo "

        $bName

        "; + echo "

        From: $bStart to: $bEnd

        "; +} + +$bnStart = strtotime($bStart); +$bnStart = date('Y-m-d',$bnStart); + +$bnEnd = strtotime($bEnd); +$bnEnd = date('Y-m-d',$bnEnd); + +$dlog = select_dlog($bnStart,$bnEnd); +$sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep().'sumUpcSalesByDay'; + +if(!isset($_GET['excel'])){ + echo "

        Click here for Excel version

        "; +} + +$salesBatchQ ="select d.upc, b.description, sum(d.total) as sales, sum(quantity) as quantity + FROM $sumTable as d left join batchMergeTable as b + ON d.upc = b.upc + WHERE d.tdate BETWEEN '$bStart' and '$bEnd' + AND b.batchID = $batchID + GROUP BY d.upc, b.description"; + +$salesBatchR= $dbc->query($salesBatchQ); + +$i = 0; + +echo ""; + $i++; +} +echo "
        UPCDescription$ SalesQuantity"; +while($salesBatchW = $dbc->fetch_array($salesBatchR)){ + $upc = $salesBatchW['upc']; + $desc = $salesBatchW['description']; + $sales = $salesBatchW['sales']; + $qty = $salesBatchW['quantity']; + $imod = $i%2; + + if($imod==1){ + $rColor= '#ffffff'; + }else{ + $rColor= '#ffffcc'; + } + + echo "
        $upc$desc$sales$qty{$salesBatchW['total']}
        "; + +if (!isset($_GET['excel'])){ + include("../../src/footer.html"); +} + +?> diff --git a/fannie/batches/newbatch/forceBatch.php b/fannie/batches/newbatch/forceBatch.php new file mode 100644 index 000000000..9e29ff4e2 --- /dev/null +++ b/fannie/batches/newbatch/forceBatch.php @@ -0,0 +1,187 @@ +query($batchInfoQ); + $batchInfoW = $dbc->fetch_array($batchInfoR); + + $forceQ = ""; + $forceLCQ = ""; + $forceMMQ = ""; + if ($batchInfoW['discountType'] != 0){ + + $forceQ="UPDATE products AS p + INNER JOIN batchList AS l + ON p.upc=l.upc + INNER JOIN batches AS b + ON l.batchID=b.batchID + SET p.start_date = b.startDate, + p.end_date=b.endDate, + p.special_price=l.salePrice, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialpricemethod=l.pricemethod, + p.specialquantity=l.quantity, + p.discounttype=b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN concat('b',convert(l.batchID,char)) + ELSE p.mixmatchcode + END + WHERE l.upc not like 'LC%' + and l.batchID = $batchID"; + + $forceLCQ = "UPDATE products AS p + INNER JOIN likeCodeView AS v + ON v.upc=p.upc + INNER JOIN batchList as l + ON l.upc=concat('LC',convert(v.likecode,char)) + INNER JOIN batches AS b + ON b.batchID=l.batchID + set p.special_price = l.salePrice, + p.end_date = b.endDate,p.start_date=b.startDate, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialpricemethod=l.pricemethod, + p.specialquantity=l.quantity, + p.discounttype = b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN concat('b',convert(l.batchID,char)) + ELSE p.mixmatchcode + END + where l.batchID=$batchID"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $forceQ="UPDATE products + SET start_date = b.startDate, + end_date=b.endDate, + special_price=l.salePrice, + specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + specialpricemethod=l.pricemethod, + specialquantity=l.quantity, + discounttype=b.discounttype, + mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(varchar,l.batchID) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(varchar,-1*l.batchID) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN 'b'+convert(varchar,l.batchID) + ELSE p.mixmatchcode + END + FROM products as p, + batches as b, + batchList as l + WHERE l.upc = p.upc + and l.upc not like 'LC%' + and b.batchID = l.batchID + and b.batchID = $batchID"; + + $forceLCQ = "update products set special_price = l.salePrice, + end_date = b.endDate,start_date=b.startDate, + discounttype = b.discounttype, + specialpricemethod=l.pricemethod, + specialquantity=l.quantity, + specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(varchar,l.batchID) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(varchar,-1*l.batchID) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN 'b'+convert(varchar,l.batchID) + ELSE p.mixmatchcode + END + from products as p left join + likeCodeView as v on v.upc=p.upc left join + batchList as l on l.upc='LC'+convert(varchar,v.likecode) + left join batches as b on b.batchID = l.batchID + where b.batchID=$batchID"; + } + } + else{ + $forceQ = "UPDATE products AS p + INNER JOIN batchList AS l + ON l.upc=p.upc + SET p.normal_price = l.salePrice, + p.modified = curdate() + WHERE l.upc not like 'LC%' + AND l.batchID = $batchID"; + + $forceLCQ = "UPDATE products AS p + INNER JOIN upcLike AS v + ON v.upc=p.upc INNER JOIN + batchList as b on b.upc=concat('LC',convert(v.likecode,char)) + set p.normal_price = b.salePrice, + p.modified=curdate() + where b.batchID=$batchID"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $forceQ = "UPDATE products + SET normal_price = l.salePrice, + modified = getdate() + FROM products as p, + batches as b, + batchList as l + WHERE l.upc = p.upc + AND l.upc not like 'LC%' + AND b.batchID = l.batchID + AND b.batchID = $batchID"; + + $forceLCQ = "update products set normal_price = b.salePrice, + modified=getdate() + from products as p left join + upcLike as v on v.upc=p.upc left join + batchList as b on b.upc='LC'+convert(varchar,v.likecode) + where b.batchID=$batchID"; + } + } + + $forceR = $dbc->query($forceQ); + $forceLCR = $dbc->query($forceLCQ); + + $q = "SELECT upc FROM batchList WHERE batchID=".$batchID; + $r = $dbc->query($q); + while($w = $dbc->fetch_row($r)){ + $upcs = array($w['upc']); + if (substr($w['upc'],0,2)=='LC'){ + $upcs = array(); + $lc = substr($w['upc'],2); + $q2 = "SELECT upc FROM upcLike WHERE likeCode=".$lc; + $r2 = $dbc->query($q2); + while($w2 = $dbc->fetch_row($r2)) + $upcs[] = $w2['upc']; + } + foreach($upcs as $u){ + updateProductAllLanes($u); + } + } +} + +?> diff --git a/fannie/batches/newbatch/index.css b/fannie/batches/newbatch/index.css new file mode 100644 index 000000000..7a7354e98 --- /dev/null +++ b/fannie/batches/newbatch/index.css @@ -0,0 +1,26 @@ +form { + display: inline; +} + +#inputarea { + text-align: left; + width: 80%; + padding-bottom: 8px; + border-bottom: 1px solid #000000; +} + +#inputarea th { + text-align: left; +} + +#displayarea { + padding-top: 8px; +} + +img { + border:0; +} + +.newBatchBlack { + color: #000000; +} diff --git a/fannie/batches/newbatch/index.js b/fannie/batches/newbatch/index.js new file mode 100644 index 000000000..79b80175f --- /dev/null +++ b/fannie/batches/newbatch/index.js @@ -0,0 +1,521 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText.replace(/^\s*/,''); + //alert(response); + var array = response.split('`'); + switch(array[0]){ + case 'newBatch': + case 'deleteBatch': + case 'deleteItem': + case 'refilter': + case 'redisplay': + case 'batchListPage': + case 'redisplayWithOrder': + case 'doPaste': + case 'moveQual': + case 'moveDisc': + document.getElementById('displayarea').innerHTML = array[1]; + break; + case 'newTag': + document.getElementById('inputarea').innerHTML = array[1]; + break; + case 'saveBatch': + case 'savePrice': + case 'forceBatch': + case 'doCut': + case 'unCut': + case 'PS_toggleDiscSplit': + case 'PS_toggleMemberOnly': + case 'saveLimit': + break; + case 'PS_pricing': + alert('Pricing Updated!'); + break; + case 'autoTag': + alert('New tags generated'); + break; + case 'showBatch': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('addItemUPC').focus(); + break; + case 'backToList': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('newBatchName').focus(); + break; + case 'addItemUPC': + case 'addItemLC': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('addItemPrice').focus(); + break; + case 'switchToLC': + case 'switchFromLC': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('addItemUPC').focus(); + document.getElementById('addItemUPC').select(); + break; + case 'addItemPrice': + case 'addItemLCPrice': + case 'addTag': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('addItemUPC').focus(); + document.getElementById('addItemUPC').select(); + break; + case 'expand': + doExpand(array[1],array[2],array); + break; + default: + alert('&'+array[0]+'&'); + } + } +} + +/********************* END AJAX BASICS ******************/ + +function getTypes(){ + return document.getElementById('passtojstypes').value.split("`"); +} +function getTypeIDs(){ + return document.getElementById('passtojstypeids').value.split("`"); +} +function getOwners(){ + return document.getElementById('passtojsowners').value.split("`"); +} + +function newBatch(){ + var type = document.getElementById('newBatchType').value; + var name = document.getElementById('newBatchName').value; + var startdate = document.getElementById('newBatchStartDate').value; + var enddate = document.getElementById('newBatchEndDate').value; + var owner = document.getElementById('newBatchOwner').value; + var priority = document.getElementById('newBatchPriority').value; + + phpSend('newBatch&type='+type+'&name='+name+'&startdate='+startdate+'&enddate='+enddate+'&owner='+owner+'&priority='+priority); + + document.getElementById('newBatchType').value = 0; + document.getElementById('newBatchName').value = ''; + document.getElementById('newBatchStartDate').value = ''; + document.getElementById('newBatchEndDate').value = ''; + + document.getElementById('newBatchName').focus(); +} + +function deleteBatch(id,name){ + var audited = document.getElementById('isAudited').value; + if (audited == "1"){ + alert("You're not allowed to delete batches"); + return; + } + + if (confirm('Delete this batch ('+name+')?')) + phpSend('deleteBatch&id='+id); +} + +function editBatch(id){ + var name = document.getElementById('namelink'+id).innerHTML; + var type = document.getElementById('type'+id).innerHTML; + var startdate = document.getElementById('startdate'+id).innerHTML; + var enddate = document.getElementById('enddate'+id).innerHTML; + var owner = document.getElementById('owner'+id).innerHTML; + + var batchtypes = getTypes(); + var batchtypeids = getTypeIDs(); + var owners = getOwners(); + + var typeselect = ""; + + var ownerselect = ""; + + document.getElementById('name'+id).innerHTML = ""; + document.getElementById('type'+id).innerHTML = typeselect; + document.getElementById('startdate'+id).innerHTML = ""; + document.getElementById('enddate'+id).innerHTML = ""; + document.getElementById('owner'+id).innerHTML = ownerselect; + + var path = document.getElementById('buttonimgpath').value; + var svb = "\"Save\""; + document.getElementById('edit'+id).innerHTML = svb; + + document.getElementById('name'+id+'i').focus(); +} + +function saveBatch(id){ + var name = document.getElementById('name'+id+'i').value; + var type = document.getElementById('type'+id+'i').value; + var startdate = document.getElementById('startdate'+id+'i').value; + var enddate = document.getElementById('enddate'+id+'i').value; + var owner = document.getElementById('owner'+id+'i').value; + + var batchtypes = getTypes(); + var batchtypeids = getTypeIDs(); + var found_index = 0; + for (var i = 0; i < batchtypeids.length; i++){ + if (type == batchtypeids[i]) + found_index = i; + } + + document.getElementById('name'+id).innerHTML = ""+name+""; + document.getElementById('type'+id).innerHTML = batchtypes[found_index]; + document.getElementById('startdate'+id).innerHTML = startdate; + document.getElementById('enddate'+id).innerHTML = enddate; + document.getElementById('owner'+id).innerHTML = owner; + + var path = document.getElementById('buttonimgpath').value; + var eb = "\"Edit\""; + document.getElementById('edit'+id).innerHTML = eb; + + phpSend('saveBatch&id='+id+'&name='+name+'&type='+type+'&startdate='+startdate+'&enddate='+enddate+'&owner='+owner); +} + +function showBatch(id,tag){ + if (document.getElementById('isAudited').value == "1"){ + if (document.getElementById('type'+id).innerHTML == "Price Change"){ + alert("You can't edit price change batches"); + return; + } + } + phpSend('showBatch&id='+id+'&tag='+tag); +} + +function backToList(){ + phpSend('backToList'); +} + +function addItem(){ + var id = document.getElementById('currentBatchID').value; + var upc = document.getElementById('addItemUPC').value; + var tag = document.getElementById('addItemTag').checked; + var lc = document.getElementById('addItemLikeCode').checked; + + if (!lc) + phpSend('addItemUPC&id='+id+'&upc='+upc+'&tag='+tag); + else + phpSend('addItemLC&id='+id+'&lc='+upc); +} + +function addItemFinish(upc){ + var id = document.getElementById('currentBatchID').value; + var price = document.getElementById('addItemPrice').value; + var tag = document.getElementById('addItemTag').checked; + + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + var limit = document.getElementById('currentLimit').innerHTML; + if (limit == '') limit = 0; + + if (!tag || audited=="1") + phpSend('addItemPrice&id='+id+'&upc='+upc+'&price='+price+'&uid='+uid+'&audited='+audited+'&limit='+limit); + else + phpSend('newTag&id='+id+'&upc='+upc+'&price='+price); +} + +function addItemLCFinish(lc){ + var id = document.getElementById('currentBatchID').value; + var price = document.getElementById('addItemPrice').value; + + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + var limit = document.getElementById('currentLimit').innerHTML; + if (limit == '') limit = 0; + + phpSend('addItemLCPrice&id='+id+'&lc='+lc+'&price='+price+'&uid='+uid+'&audited='+audited+'&limit='+limit); +} + +function deleteItem(upc){ + var id = document.getElementById('currentBatchID').value; + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('deleteItem&id='+id+'&upc='+upc+'&uid='+uid+'&audited='+audited); +} + +function refilter(){ + var owner = document.getElementById('filterOwner').value; + + phpSend('refilter&owner='+owner); +} + +function redisplay(mode){ + document.getElementById('filterOwner').selectedIndex = 0; + phpSend('redisplay&mode='+mode); +} + +function batchListPage(filter,mode,batchID){ + phpSend('batchListPage&filter='+filter+'&mode='+mode+'&maxBatchID='+batchID); +} + +function editPrice(upc){ + var saleprice = document.getElementById('salePrice'+upc).innerHTML; + var saleqty = document.getElementById('saleQty'+upc).innerHTML; + var numeric_qty = 1; + if (saleqty != ''){ + numeric_qty = saleqty.split(' ')[0]; + } + + document.getElementById('salePrice'+upc).innerHTML = ""; + document.getElementById('saleQty'+upc).innerHTML = "@"; + + var path = document.getElementById('buttonimgpath').value; + var sv = "\"Save\""; + document.getElementById('editLink'+upc).innerHTML = sv; +} + +function savePrice(upc){ + var saleprice = document.getElementById('salePrice'+upc+'i').value; + var saleqty = document.getElementById('saleQty'+upc+'i').value; + + saleqty = parseInt(saleqty,10); + if (isNaN(saleqty)) + saleqty = 0; + else if (saleqty <= 1) + saleqty = 0; + + document.getElementById('salePrice'+upc).innerHTML = saleprice; + if (saleqty == 0) + document.getElementById('saleQty'+upc).innerHTML = ''; + else + document.getElementById('saleQty'+upc).innerHTML = saleqty+' for '; + + var path = document.getElementById('buttonimgpath').value; + var eb = "\"Edit\""; + document.getElementById('editLink'+upc).innerHTML = eb; + + var id = document.getElementById('currentBatchID').value; + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('savePrice&id='+id+'&upc='+upc+'&saleprice='+saleprice+'&uid='+uid+'&audited='+audited+'&saleqty='+saleqty); +} + +function newTag(){ + var id = document.getElementById('newTagID').value; + var upc = document.getElementById('newTagUPC').value; + var price = document.getElementById('newTagPrice').value; + var desc = document.getElementById('newTagDesc').value; + var brand = document.getElementById('newTagBrand').value; + var units = document.getElementById('newTagUnits').value; + var size = document.getElementById('newTagSize').value; + var sku = document.getElementById('newTagSKU').value; + var vendor = document.getElementById('newTagVendor').value; + + phpSend('addTag&id='+id+'&upc='+upc+'&price='+price+'&desc='+desc+'&brand='+brand+'&units='+units+'&size='+size+'&sku='+sku+'&vendor='+vendor); +} + +function forceBatch(id){ + phpSend('forceBatch&id='+id); + alert('Batch '+id+' has been forced'); +} + +function lcselect_util(){ + var lc = document.getElementById('lcselect').value; + document.getElementById('addItemUPC').value = lc; +} + +function switchToLC(){ + phpSend('switchToLC'); +} + +function switchFromLC(){ + phpSend('switchFromLC'); +} + +function redisplayWithOrder(id,neworder){ + phpSend('redisplayWithOrder&id='+id+'&order='+neworder); +} + +function expand(likecode,saleprice){ + phpSend('expand&likecode='+likecode+'&saleprice='+saleprice); +} + +function doExpand(likecode,saleprice,data){ + var table = document.getElementById('yeoldetable'); + var num = 0; + var row = document.getElementById('expandId'+likecode).value; + for (var i = 3; i < data.length; i++){ + var newrow = table.insertRow(Number(row)+1); + newrow.innerHTML = data[i]; + num++; + } + + var inputs = document.getElementsByName('expandId'); + for (var i = 0; i < inputs.length; i++){ + var theInput = inputs.item(i); + if (Number(theInput.value) > Number(row)) + theInput.value = Number(theInput.value)+num; + } + + var newSpan = " [-]"; + document.getElementById("LCToggle"+likecode).innerHTML = newSpan; +} + +function doCollapse(likecode,saleprice,num){ + var table = document.getElementById('yeoldetable'); + var row = document.getElementById('expandId'+likecode).value; + for (var i = 0; i < num; i++) + table.deleteRow(Number(row)+1); + + var inputs = document.getElementsByName('expandId'); + for (var i = 0; i < inputs.length; i++){ + var theInput = inputs.item(i); + if (Number(theInput.value) > Number(row)) + theInput.value = Number(theInput.value)-num; + } + + var newSpan = " [+]"; + document.getElementById("LCToggle"+likecode).innerHTML = newSpan; +} + +function doCut(upc,batchID,uid){ + phpSend('doCut&upc='+upc+'&batchID='+batchID+'&uid='+uid); + var repl = "Undo"; + document.getElementById('cpLink'+upc).innerHTML = repl; +} + +function unCut(upc,batchID,uid){ + phpSend('unCut&upc='+upc+'&batchID='+batchID+'&uid='+uid); + var repl = "Cut"; + document.getElementById('cpLink'+upc).innerHTML = repl; +} + +function doPaste(uid,batchID){ + phpSend('doPaste&uid='+uid+'&batchID='+batchID); +} + +function moveDisc(upc){ + var id = document.getElementById('currentBatchID').value; + phpSend('moveDisc&batchID='+id+'&upc='+upc); +} + +function moveQual(upc){ + var id = document.getElementById('currentBatchID').value; + phpSend('moveQual&batchID='+id+'&upc='+upc); +} + +function PS_toggleDiscSplit(batchID){ + phpSend('PS_toggleDiscSplit&batchID='+batchID); +} + +function PS_toggleMemberOnly(batchID){ + phpSend('PS_toggleMemberOnly&batchID='+batchID); +} + +function PS_pricing(batchID){ + var qual = document.getElementById('PS_qualCount').value; + var disc = document.getElementById('PS_discount').value; + + var saleType = 1; + if (document.getElementById('PS_memCBX').checked) + saleType = 2; + + var pricemethod = 4; + if (document.getElementById('PS_splitCBX').checked) + pricemethod = 3; + + var str = "quantity="+qual+"&discount="+disc+"&discounttype="+saleType+"&pricemethod="+pricemethod; + phpSend('PS_pricing&batchID='+batchID+'&'+str); +} + +function editLimit(batchID,limit){ + var saveLink = "Save Limit"; + var limitIn = " 0) limitIn += limit; + limitIn += "\" id=\"limitInputBox\" />"; + + document.getElementById('limitLink').innerHTML = saveLink; + document.getElementById('currentLimit').innerHTML = limitIn; + document.getElementById('limitInputBox').focus(); +} + +function saveLimit(batchID){ + var newlimit = document.getElementById('limitInputBox').value; + newlimit = parseInt(newlimit,10); + if (isNaN(newlimit)) + newlimit = 0; + else if (newlimit <= 0) + newlimit = 0; + + var editLink = ""; + if (newlimit==0) editLink += "Add Limit"; + else editLink += "Limit:"; + + document.getElementById('limitLink').innerHTML = editLink; + if (newlimit == 0) + document.getElementById('currentLimit').innerHTML = ''; + else + document.getElementById('currentLimit').innerHTML = newlimit; + + phpSend('saveLimit&batchID='+batchID+'&limit='+newlimit); +} + +function autoTag(bID){ + phpSend('autoTag&batchID='+bID); +} diff --git a/fannie/batches/newbatch/index.php b/fannie/batches/newbatch/index.php new file mode 100644 index 000000000..db785b731 --- /dev/null +++ b/fannie/batches/newbatch/index.php @@ -0,0 +1,1243 @@ +query($typesQ); +while ($typesW = $dbc->fetch_array($typesR)) + $batchtypes[$typesW[0]] = $typesW[1]; + +$ownersQ = "SELECT super_name FROM MasterSuperDepts GROUP BY super_name ORDER BY super_name"; +$ownersR = $dbc->query($ownersQ); +$owners = array(''); +while($ownersW = $dbc->fetch_row($ownersR)) + array_push($owners,$ownersW[0]); +array_push($owners,'IT'); + +/* ajax responses + * $out is the output sent back + * by convention, the request name ($_GET['action']) + * is prepended to all output so the javascript receiver + * can handle responses differently as needed. + * a backtick separates request name from data + */ +$out = ''; +if (isset($_GET['action'])){ + // prepend request name & backtick + $out = $_GET['action']."`"; + // switch on request name + switch ($_GET['action']){ + case 'newBatch': + $type = $_GET['type']; + $name = $_GET['name']; + $startdate = $_GET['startdate']." 00:00:00.00"; + $enddate = $_GET['enddate']." 00:00:00.00"; + $owner = $_GET['owner']; + $priority = isset($_REQUEST['priority']) ? $_REQUEST['priority'] : 0; + + $infoQ = "select discType from batchType where batchTypeID=$type"; + $infoR = $dbc->query($infoQ); + $discounttype = array_pop($dbc->fetch_array($infoR)); + + $insQ = sprintf("INSERT INTO batches (startDate,endDate,batchName,batchType, + discounttype,priority) VALUES (%s,%s,%s,%d,%d,%d)", + $dbc->escape($startdate),$dbc->escape($enddate), + $dbc->escape($name),$type,$discounttype,$priority); + $insR = $dbc->query($insQ); + $id = $dbc->insert_id(); + + $insQ = "insert batchowner values ($id,'$owner')"; + $insR = $dbc->query($insQ); + + $out .= batchListDisplay(); + break; + case 'deleteBatch': + $id = $_GET['id']; + + $unsaleQ = "UPDATE products AS p LEFT JOIN batchList as b + ON p.upc=b.upc + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + WHERE b.upc NOT LIKE '%LC%' + AND b.batchID=$id"; + if ($FANNIE_SERVER_DBMS=="MSSQL"){ + $unsaleQ = "UPDATE products SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + FROM products AS p, batchList as b + WHERE p.upc=b.upc AND b.upc NOT LIKE '%LC%' + AND b.batchID=$id"; + } + $unsaleR = $dbc->query($unsaleQ); + + $unsaleLCQ = "UPDATE products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,p.discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + WHERE l.upc LIKE '%LC%' + AND l.batchID=$id"; + if ($FANNIE_SERVER_DBMS=="MSSQL"){ + $unsaleLCQ = "UPDATE products + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + WHERE l.upc LIKE '%LC%' + AND l.batchID=$id"; + } + $unsaleLCR = $dbc->query($unsaleLCQ); + + $delQ = "delete from batches where batchID=$id"; + $delR = $dbc->query($delQ); + + $delQ = "delete from batchList where batchID=$id"; + $delR = $dbc->query($delQ); + + $out .= batchListDisplay(); + break; + case 'saveBatch': + $id = $_GET['id']; + $name = $_GET['name']; + $type = $_GET['type']; + $startdate = $_GET['startdate']; + $enddate = $_GET['enddate']; + $owner = $_GET['owner']; + + $infoQ = "select discType from batchType where batchTypeID=$type"; + $infoR = $dbc->query($infoQ); + $discounttype = array_pop($dbc->fetch_array($infoR)); + + $upQ = "update batches set batchName='$name',batchType=$type,discounttype=$discounttype,startDate='$startdate',endDate='$enddate' where batchID=$id"; + $upR = $dbc->query($upQ); + + $checkQ = "select batchID from batchowner where batchID=$id"; + $checkR = $dbc->query($checkQ); + if($dbc->num_rows($checkR) == 0){ + $insQ = "insert batchowner values ($id,'$owner')"; + $insR = $dbc->query($insQ); + } + else{ + $upQ = "update batchowner set owner='$owner' where batchID=$id"; + $upR = $dbc->query($upQ); + } + + break; + case 'showBatch': + $id = $_GET['id']; + $tag = false; + if ($_GET['tag'] == 'true') + $tag = true; + + $out .= addItemUPCInput($tag); + $out .= "`"; + $out .= showBatchDisplay($id); + + break; + case 'backToList': + $out .= newBatchInput(); + $out .= "`"; + $out .= batchListDisplay(); + + break; + case 'addItemUPC': + $id = $_GET['id']; + $upc = str_pad(trim($_GET['upc']),13,'0',STR_PAD_LEFT); + $tag = false; + if ($_GET['tag'] == 'true') + $tag = true; + + $out .= addItemPriceInput($upc,$tag); + break; + case 'addItemLC': + $id = $_GET['id']; + $lc = $_GET['lc']; + $out .= addItemPriceLCInput($lc); + break; + case 'addItemPrice': + $id = $_GET['id']; + $upc = $_GET['upc']; + $price = $_GET['price']; + $qty = isset($_REQUEST['limit'])?$_REQUEST['limit']:0; + + if ($price != ""){ + $checkQ = "select upc from batchList where upc='$upc' and batchID=$id"; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) == 0){ + $insQ = "INSERT INTO batchList (upc,batchID,salePrice,active,pricemethod,quantity) + VALUES ('$upc',$id,$price,1,0,$qty)"; + $insR = $dbc->query($insQ); + } + else { + $upQ = "update batchList set salePrice=$price,quantity=$qty + where upc='$upc' and batchID=$id"; + $upR = $dbc->query($upQ); + } + $audited = $_GET['audited']; + if ($audited == 1) + auditPriceChange($dbc,$_GET['uid'],$upc,$price,$id); + } + + $out .= addItemUPCInput(); + $out .= '`'; + $out .= showBatchDisplay($id); + break; + case 'addItemLCPrice': + $id = $_GET['id']; + $lc = $_GET['lc']; + $price = $_GET['price']; + $qty = isset($_REQUEST['limit'])?$_REQUEST['limit']:0; + + if ($price != ""){ + $checkQ = "select upc from batchList where upc='LC$lc' and batchID='$id'"; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) == 0){ + $insQ = "insert into batchList (upc,batchID,salePrice,active,pricemethod,quantity) + values ('LC$lc',$id,$price,1,0,$qty)"; + $insR = $dbc->query($insQ); + } + else { + $upQ = "update batchList set salePrice=$price,quantity=$qty + where upc='LC$lc' and batchID=$id"; + $upR = $dbc->query($upQ); + } + $audited = $_GET['audited']; + if ($audited == 1) + auditPriceChangeLC($dbc,$_GET['uid'],$upc,$price,$id); + } + + $out .= addItemLCInput(); + $out .= '`'; + $out .= showBatchDisplay($id); + break; + case 'deleteItem': + $id = $_GET['id']; + $upc = $_GET['upc']; + + $delQ = "delete from batchList where batchID=$id and upc='$upc'"; + $delR = $dbc->query($delQ); + + $delQ = "delete from batchBarcodes where upc='$upc' and batchID='$batchID'"; + $delR = $dbc->query($delQ); + + if (substr($upc,0,2) != 'LC'){ + // take the item off sale if this batch is currently on sale + $unsaleQ = "UPDATE products AS p LEFT JOIN batchList as b on p.upc=b.upc + set p.discounttype=0,special_price=0,start_date=0,end_date=0 + WHERE p.upc='$upc' and b.batchID=$id"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $unsaleQ = "update products set discounttype=0,special_price=0,start_date=0,end_date=0 + from products as p, batches as b where + p.upc='$upc' and b.batchID=$id and b.startDate=p.start_date and b.endDate=p.end_date"; + } + $unsaleR = $dbc->query($unsaleQ); + + updateProductAllLanes($upc); + } + else { + $lc = substr($upc,2); + $unsaleQ = "UPDATE products AS p LEFT JOIN upcLike as u on p.upc=u.upc + LEFT JOIN batchList as b ON b.upc=concat('LC',convert(u.likeCode,char)) + set p.discounttype=0,special_price=0,start_date=0,end_date=0 + WHERE u.likeCode='$lc' and b.batchID=$id"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $unsaleQ = "update products set discounttype=0,special_price=0,start_date=0,end_date=0 + from products as p, batches as b, upcLike as u + where u.likecode=$lc and u.upc=p.upc and b.startDate=p.start_date and b.endDate=p.end_date + and b.batchID=$id"; + } + $unsaleR = $dbc->query($unsaleQ); + + //syncProductsAllLanes(); + } + $audited = $_GET['audited']; + if ($audited == "1") + auditDelete($dbc,$_GET['uid'],$upc,$id); + + $out .= showBatchDisplay($id); + break; + case 'refilter': + $owner = $_GET['owner']; + + $out .= batchListDisplay($owner); + break; + case 'savePrice': + $id = $_GET['id']; + $upc = $_GET['upc']; + $saleprice = $_GET['saleprice']; + $saleqty = $_REQUEST['saleqty']; + $pm = ($saleqty >= 2)?2:0; + + $upQ = "update batchList set salePrice=$saleprice,quantity=$saleqty, + pricemethod=$pm where batchID=$id and upc='$upc'"; + $upR = $dbc->query($upQ); + + $upQ = "update batchBarcodes set normal_price=$saleprice where upc='$upc' and batchID=$id"; + $upR = $dbc->query($upQ); + + $audited = $_GET["audited"]; + if ($audited == "1") + auditSavePrice($dbc,$_GET['uid'],$upc,$saleprice,$id); + + break; + case 'newTag': + $id = $_GET['id']; + $upc = $_GET['upc']; + $price = $_GET['price']; + + $out .= newTagInput($upc,$price,$id); + + break; + case 'addTag': + $id = $_GET['id']; + $upc = $_GET['upc']; + $price = $_GET['price']; + $desc = $_GET['desc']; + $brand = $_GET['brand']; + $units = $_GET['units']; + $size = $_GET['size']; + $sku = $_GET['sku']; + $vendor = $_GET['vendor']; + + $checkQ = "select upc from batchBarcodes where upc='$upc' and batchID = $id"; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) == 0){ + $insQ = "insert into batchBarcodes (upc,description,normal_price,brand,sku,size,units,vendor,batchID) + values ('$upc','$desc',$price,'$brand','$sku','$size','$units','$vendor',$id)"; + $insR = $dbc->query($insQ); + } + else { + $upQ = "update batchBarcodes set normal_price=$price where upc='$upc'"; + $upR = $dbc->query($upQ); + } + + $insQ = "insert into batchList (upc,batchID,salePrice,active,pricemethod,quantity) + values ('$upc',$id,$price,1,0,0)"; + $insR = $dbc->query($insQ); + + $out .= addItemUPCInput('true'); + $out .= '`'; + $out .= showBatchDisplay($id); + break; + case 'redisplay': + $mode = $_GET['mode']; + $out .= batchListDisplay('',$mode); + break; + case 'batchListPage': + $filter = $_REQUEST['filter']; + $mode = $_REQUEST['mode']; + $max = $_REQUEST['maxBatchID']; + $out .= batchListDisplay($filter,$mode,$max); + break; + case 'forceBatch': + $id = $_GET['id']; + require('forceBatch.php'); + forceBatch($id); + break; + case 'switchToLC': + $out .= addItemLCInput(); + break; + case 'switchFromLC': + $out .= addItemUPCInput(); + break; + case 'redisplayWithOrder': + $id = $_GET['id']; + $order = $_GET['order']; + $out .= showBatchDisplay($id,$order); + break; + case 'expand': + $likecode = $_GET['likecode']; + $saleprice = $_GET['saleprice']; + $out .= $likecode."`"; + $out .= $saleprice."`"; + for ($i = 0; $i < 6; $i++) $out .= " "; + $out .= "`"; + + $likeQ = "select p.upc,p.description,p.normal_price,$saleprice + from products as p left join upcLike as u on p.upc=u.upc + where u.likecode = $likecode order by p.upc desc"; + $likeR = $dbc->query($likeQ); + while ($likeW = $dbc->fetch_row($likeR)){ + $out .= "$likeW[0]"; + $out .= "$likeW[1]"; + $out .= "$likeW[2]"; + $out .= "$likeW[3]"; + $out .= " "; + $out .= " "; + $out .= "`"; + } + $out = substr($out,0,strlen($out)-1); + break; + + case 'doCut': + $upc = $_REQUEST['upc']; + $bid = $_REQUEST['batchID']; + $uid = $_REQUEST['uid']; + $q = sprintf("INSERT INTO batchCutPaste VALUES (%d,%s,%d)", + $bid,$dbc->escape($upc),$uid); + $dbc->query($q); + break; + + case 'unCut': + $upc = $_REQUEST['upc']; + $bid = $_REQUEST['batchID']; + $uid = $_REQUEST['uid']; + $q = sprintf("DELETE FROM batchCutPaste WHERE upc=%s + AND batchID=%d AND uid=%d", + $dbc->escape($upc),$bid,$uid); + $dbc->query($q); + break; + + case 'doPaste': + $uid = $_REQUEST['uid']; + $bid = $_REQUEST['batchID']; + $q = sprintf("SELECT listID FROM batchList as l INNER JOIN + batchCutPaste as b ON b.upc=l.upc AND b.batchID=l.batchID + WHERE b.uid=%d",$uid); + $r = $dbc->query($q); + while($w = $dbc->fetch_row($r)){ + $upQ = sprintf("UPDATE batchList SET batchID=%d WHERE listID=%d", + $bid,$w['listID']); + $dbc->query($upQ); + } + $dbc->query(sprintf("DELETE FROM batchCutPaste WHERE uid=%d",$uid)); + $out .= showBatchDisplay($bid); + break; + case 'moveQual': + case 'moveDisc': + $batchID = $_REQUEST['batchID']; + $upc = $_REQUEST['upc']; + $q = sprintf("UPDATE batchList SET salePrice = -1*salePrice + WHERE batchID=%d AND upc=%s",$batchID, + $dbc->escape($upc)); + $r = $dbc->query($q); + $out .= showBatchDisplay($batchID); + break; + case 'PS_toggleDiscSplit': + $bid = $_REQUEST['batchID']; + $q = sprintf("SELECT pricemethod FROM batchList WHERE + batchID=%d ORDER BY pricemethod",$bid); + $r = $dbc->query($q); + $currMethod = 4; + if ($dbc->num_rows($r) > 0){ + $currMethod = array_pop($dbc->fetch_row($r)); + if (empty($currMethod)) $currMethod = 4; + } + $newMethod = ($currMethod==4) ? 3 : 4; + + $q = sprintf("UPDATE batchList SET pricemethod=%d + WHERE batchID=%d",$newMethod,$bid); + $r = $dbc->query($q); + break; + case 'PS_toggleMemberOnly': + $bid = $_REQUEST['batchID']; + $q = sprintf("SELECT discounttype FROM batches + WHERE batchID=%d",$bid); + $r = $dbc->query($q); + $cur = array_pop($dbc->fetch_row($r)); + $new = ($cur==1) ? 2 : 1; + $q = sprintf("UPDATE batches SET discounttype=%d + WHERE batchID=%d",$new,$bid); + $r = $dbc->query($q); + break; + case 'PS_pricing': + $qty = $_REQUEST['quantity']; + $disc = $_REQUEST['discount']; + if ($disc < 0) $disc = abs($disc); + $dtype = $_REQUEST['discounttype']; + $pmethod = $_REQUEST['pricemethod']; + $bid = $_REQUEST['batchID']; + + $upQ1 = sprintf("UPDATE batches SET discounttype=%d + WHERE batchID=%d",$dtype,$bid); + $upQ2 = sprintf("UPDATE batchList SET + quantity=%d,pricemethod=%d, + salePrice=%f WHERE batchID=%d + AND salePrice >= 0", + $qty+1,$pmethod,$disc,$bid); + $upQ3 = sprintf("UPDATE batchList SET + quantity=%d,pricemethod=%d, + salePrice=%f WHERE batchID=%d + AND salePrice < 0", + $qty+1,$pmethod,-1*$disc,$bid); + $dbc->query($upQ1); + $dbc->query($upQ2); + $dbc->query($upQ3); + break; + case 'saveLimit': + $limitQ = sprintf("UPDATE batchList SET quantity=%d WHERE batchID=%d", + $_REQUEST['limit'],$_REQUEST['batchID']); + $dbc->query($limitQ); + break; + case 'autoTag': + $delQ = sprintf("DELETE FROM batchBarcodes where batchID=%d",$_REQUEST['batchID']); + $dbc->query($delQ); + + $selQ = sprintf(" + select l.upc,p.description,l.salePrice, + case when x.manufacturer is null then v.brand + else x.manufacturer end as brand, + case when v.sku is null then '' else v.sku end as sku, + case when v.size is null then '' else v.size end as size, + case when v.units is null then 1 else v.units end as units, + case when x.distributor is null then z.vendorName + else x.distributor end as vendor, + l.batchID + from batchList as l + inner join products as p on + l.upc=p.upc + left join prodExtra as x on + l.upc=x.upc + left join vendorItems as v on + l.upc=v.upc + left join vendors as z on + v.vendorID=z.vendorID + where batchID=%d ORDER BY l.upc",$_REQUEST['batchID']); + $selR = $dbc->query($selQ); + $upc = ""; + while($selW = $dbc->fetch_row($selR)){ + if ($upc != $selW['upc']){ + $insQ = sprintf("INSERT INTO batchBarcodes + (upc,description,normal_price,brand,sku,size,units,vendor,batchID) + VALUES (%s,%s,%.2f,%s,%s,%s,%d,%s,%d)", + $dbc->escape($selW['upc']), + $dbc->escape($selW['description']), + $selW['salePrice'], + $dbc->escape($selW['brand']), + $dbc->escape($selW['sku']), + $dbc->escape($selW['size']), + $selW['units'], + $dbc->escape($selW['vendor']), + $selW['batchID'] + ); + $dbc->query($insQ); + } + $upc = $selW['upc']; + } + break; + } + + print $out; + return; +} + +/* input functions + * functions for generating content that goes in the + * inputarea div + */ +function newBatchInput(){ + global $batchtypes, $FANNIE_URL, $FANNIE_STORE_ID; + + $ret = "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        Batch TypeNameStart dateEnd dateOwnerPriority

        "; + + $ret .= ""; + $ret .= "Filter: show batches owned by: "; + $ret .= ""; + $ret .= ""; + + $ret .= " Print shelf tags"; + + return $ret; +} + +function addItemUPCInput($newtags=false){ + $ret = "
        "; + $ret .= "UPC: "; + $ret .= ""; + $ret .= "New shelf tag"; + $ret .= " + Likecode"; + $ret .= "
        "; + + return $ret; +} + +function addItemLCInput($newtags=false){ + global $dbc; + $ret = "
        "; + $ret .= ""; + $ret .= "Like code: "; + $ret .= ""; + $ret .= ""; + $ret .= " Likecode"; + $ret .= ""; + $ret .= "
        "; + + return $ret; +} + +function addItemPriceInput($upc,$newtags=false){ + global $dbc; + $fetchQ = "select description,normal_price from products where upc='$upc'"; + $fetchR = $dbc->query($fetchQ); + $fetchW = $dbc->fetch_array($fetchR); + + $ret = "
        "; + $ret .= ""; + $ret .= "UPC: $upc Description: $fetchW[0] Normal price: $fetchW[1] "; + $ret .= "Sale price: "; + $ret .= ""; + $ret .= "query($fetchQ); + $desc = array_pop($dbc->fetch_array($fetchR)); + + /* get the most common price for items in a given + * like code + */ + $fetchQ = "select p.normal_price from products as p + left join upcLike as u on p.upc=u.upc and u.likecode=$lc + where u.upc is not null + group by p.normal_price + order by count(*) desc"; + $fetchQ = $dbc->add_select_limit($fetchQ,1); + $fetchR = $dbc->query($fetchQ); + $normal_price = array_pop($dbc->fetch_array($fetchR)); + + $ret = ""; + $ret .= ""; + $ret .= "Like code: $lc Description: $desc Normal price: $normal_price "; + $ret .= "Sale price: "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + return $ret; +} + +function newTagInput($upc,$price,$id){ + global $dbc; + $unfiQ = "select brand,sku,size,upc,units,cost,description,depart from unfi where upc = '$upc'"; + $unfiR = $dbc->query($unfiQ); + $unfiN = $dbc->num_rows($unfiR); + + $size = ''; + $brand = ''; + $units = ''; + $sku = ''; + $desc = ''; + $vendor = ''; + // grab info from the UNFI table if possible. + if ($unfiN == 1){ + $unfiW = $dbc->fetch_array($unfiR); + $size = $unfiW['size']; + $brand = strtoupper($unfiW['brand']); + $brand = preg_replace("/\'/","",$brand); + $units = $unfiW['units']; + $sku = $unfiW['sku']; + $desc = strtoupper($unfiW['description']); + $desc = preg_replace("/\'/","",$desc); + $vendor = 'UNFI'; + } + // otherwise, snag at least the description from products + else { + $descQ = "select description from products where upc='$upc'"; + $descR = $dbc->query($descQ); + $desc = strtoupper(array_pop($dbc->fetch_array($descR))); + } + + $ret = "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        UPC$upc
        Description
        Brand
        Units
        Size
        Vendor
        SKU
        Price$price"; + $ret .= "
        Cancel
        "; + + return $ret; +} + +/* display functions + * functions for generating content that goes in the + * displayarea div + */ +function batchListDisplay($filter='',$mode='all',$maxBatchID=''){ + global $batchtypes, $dbc, $FANNIE_URL; + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $ret = ""; + $ret .= "Display: "; + if ($mode != 'pending') + $ret .= "Pending | "; + else + $ret .= "Pending | "; + if ($mode != 'current') + $ret .= "Current | "; + else + $ret .= "Current | "; + if ($mode != 'historical') + $ret .= "Historical | "; + else + $ret .= "Historical | "; + if ($mode != 'all') + $ret .= "All"; + else + $ret .= "All
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + // the 'all' query + // where clause is for str_ireplace below + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID where 1=1 + order by b.batchID desc"; + switch($mode){ + case 'pending': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + where ".$dbc->datediff("b.startDate",$dbc->now())." > 0 + order by b.batchID desc"; + break; + case 'current': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + where ".$dbc->datediff("b.startDate",$dbc->now())." <= 0 + and ".$dbc->datediff("b.endDate",$dbc->now())." >= 0 + order by b.batchID desc"; + break; + case 'historical': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + where ".$dbc->datediff("b.endDate",$dbc->now())." <= 0 + order by b.batchID desc"; + break; + } + // use a filter - only works in 'all' mode + if ($filter != ''){ + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID where o.owner='$filter' order by b.batchID desc"; + } + $fetchQ = $dbc->add_select_limit($fetchQ,50); + if (is_numeric($maxBatchID)) + $fetchQ = str_ireplace("where ","WHERE b.batchID < $maxBatchID AND ",$fetchQ); + $fetchR = $dbc->query($fetchQ); + + $count = 0; + $lastBatchID = 0; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $fetchW[2] = array_shift(explode(" ",$fetchW[2])); + $ret .= ""; + $fetchW[3] = array_shift(explode(" ",$fetchW[3])); + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $count++; + $lastBatchID = $fetchW[4]; + } + + $ret .= "
        Batch NameTypeStart dateEnd dateOwner 
        $fetchW[0]".$batchtypes[$fetchW[1]]."$fetchW[2]$fetchW[3]$fetchW[5]\"Edit\"\"Delete\"Report
        "; + + if (is_numeric($maxBatchID)){ + $ret .= sprintf("First Page + | ", + $filter,$mode); + } + if ($count >= 50){ + $ret .= sprintf("Next page", + $filter,$mode,$lastBatchID); + } + else { + $ret .= "Next page"; + } + + return $ret; +} + +function showBatchDisplay($id,$orderby=' ORDER BY b.listID DESC'){ + global $dbc,$FANNIE_SERVER_DBMS,$FANNIE_URL,$uid; + $uid = ltrim($uid,'0'); + $nameQ = "select batchName,batchType from batches where batchID=$id"; + $nameR = $dbc->query($nameQ); + $nameW = $dbc->fetch_row($nameR); + $name = $nameW[0]; + $type = $nameW[1]; + + if ($type == 10){ + return showPairedBatchDisplay($id,$name); + } + + $limitQ = "select max(quantity),max(pricemethod) from batchList WHERE batchID=$id"; + $limitR = $dbc->query($limitQ); + $hasLimit = False; + $canHaveLimit = False; + $limit = 0; + if ($dbc->num_rows($limitR) > 0){ + $limitW = $dbc->fetch_row($limitR); + $limit = $limitW[0]; + $pm = $limitW[1]; + if ($pm > 0){ + // no limits with grouped sales + $canHaveLimit = False; + $dbc->query("UPDATE batchList SET quantity=0 WHERE pricemethod=0 + AND batchID=$id"); + } + else { + $canHaveLimit = True; + if ($limit > 0){ + $hasLimit = True; + } + } + } + + $saleHeader = "Sale Price"; + if ($type == 8){ + $saleHeader = "$ Discount"; + } + elseif ($type == 9){ + $saleHeader = "% Discount"; + } + elseif ($type == 4){ + $saleHeader = "New price"; + } + + $fetchQ = "select b.upc, + case when l.likeCode is null then p.description + else l.likeCodeDesc end as description, + p.normal_price,b.salePrice, + CASE WHEN c.upc IS NULL then 0 ELSE 1 END as isCut, + b.quantity,b.pricemethod + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = concat('LC',convert(l.likeCode,char)) + left join batchCutPaste as c ON + b.upc=c.upc AND b.batchID=c.batchID + where b.batchID = $id $orderby"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $fetchQ = "select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice, + CASE WHEN c.upc IS NULL then 0 ELSE 1 END as isCut, + b.quantity,b.pricemethod + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = 'LC'+convert(varchar,l.likecode) + left join batchCutPaste as c ON + b.upc=c.upc AND b.batchID=c.batchID + where b.batchID = $id $orderby"; + } + $fetchR = $dbc->query($fetchQ); + + $cpCount = sprintf("SELECT count(*) FROM batchCutPaste WHERE uid=%d",$uid); + $res = $dbc->query($cpCount); + $cp = array_pop($dbc->fetch_row($res)); + + $ret = "Batch name: $name
        "; + $ret .= "Back to batch list | "; + $ret .= "Print shelf tags | "; + $ret .= "Auto-tag | "; + if ($cp > 0) + $ret .= "Paste Items ($cp) | "; + $ret .= "Force batch | "; + if (!$canHaveLimit){ + $ret .= "No limit"; + $ret .= " "; + } + else if (!$hasLimit){ + $ret .= "Add Limit"; + $ret .= " "; + } + else if ($hasLimit){ + $ret .= "Limit:"; + $ret .= " $limit"; + } + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + if ($orderby != "ORDER BY b.upc ASC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY description ASC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY p.normal_price DESC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY b.salePrice DESC") + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $qtystr = ($fetchW['pricemethod']>0 && is_numeric($fetchW['quantity']) && $fetchW['quantity'] > 0)?$fetchW['quantity']." for ":""; + $ret .= "",$fetchW[3]); + $ret .= ""; + $ret .= ""; + if ($fetchW[4] == 1) + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        UPCUPCDescriptionDescriptionNormal priceNormal price$saleHeader$saleHeader 
        $fetchW[0]"; + $ret .= ""; + $ret .= " [+]"; + $ret .= "$fetchW[0]$fetchW[1]$fetchW[2]$qtystr"; + $ret .= sprintf("%.2f\"Edit\"\"Delete\"UndoCut
        "; + $ret .= ""; + + return $ret; +} + +function showPairedBatchDisplay($id,$name){ + global $dbc,$FANNIE_SERVER_DBMS,$FANNIE_URL,$uid; + $ret = ""; + $ret .= sprintf('',$id); + $ret .= "Batch name: $name
        "; + $ret .= "Back to batch list | "; + $ret .= "Force batch"; + $ret .= "No limit"; + $ret .= " "; + + $q = "SELECT b.discounttype,salePrice, + CASE WHEN l.pricemethod IS NULL THEN 4 ELSE l.pricemethod END as pricemethod, + CASE WHEN l.quantity IS NULL THEN 1 ELSE l.quantity END as quantity + FROM batches AS b LEFT JOIN batchList AS l + ON b.batchID=l.batchID WHERE b.batchID=$id ORDER BY l.pricemethod"; + $r = $dbc->query($q); + $w = $dbc->fetch_row($r); + + if (!empty($w['salePrice'])){ + $ret .= "Add all items before fiddling with these settings + or they'll tend to go haywire"; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= sprintf('', + $w['quantity']-1); + $ret .= ''; + $ret .= sprintf('', + (empty($w['salePrice'])?'':abs($w['salePrice']))); + $ret .= sprintf('',$id); + $ret .= '
        Member only saleSplit discount
        Qualifiers RequiredDiscount
        '; + } + else { + $ret .= "Add items first"; + } + + $fetchQ = "select b.upc, + case when l.likeCode is null then p.description + else l.likeCodeDesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = concat('LC'+convert(l.likeCode,char)) + where b.batchID = $id AND b.salePrice >= 0"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $fetchQ = "select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = 'LC'+convert(varchar,l.likecode) + where b.batchID = $id AND b.salePrice >= 0"; + } + $fetchR = $dbc->query($fetchQ); + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + $ret .= '

        '; + $ret .= ''; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        Qualifying Item(s)
        $fetchW[0]"; + /* + $ret .= ""; + $ret .= " [+]"; + $ret .= ""; + */ + $ret .= "$fetchW[0]$fetchW[1]\"Make\"Delete\"
        "; + + $fetchQ = "select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = concat('LC',convert(l.likecode,char)) + where b.batchID = $id AND b.salePrice < 0"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $fetchQ = "select b.upc, + case when l.likecode is null then p.description + else l.likecodedesc end as description, + p.normal_price,b.salePrice + from batchList as b left join products as p on + b.upc = p.upc left join likeCodes as l on + b.upc = 'LC'+convert(varchar,l.likecode) + where b.batchID = $id AND b.salePrice < 0"; + } + $fetchR = $dbc->query($fetchQ); + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + $ret .= '

        '; + $ret .= ''; + while($fetchW = $dbc->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        Discount Item(s)
        $fetchW[0]"; + /* + $ret .= ""; + $ret .= " [+]"; + $ret .= ""; + */ + $ret .= "$fetchW[0]$fetchW[1]\"Make\"Delete\"
        "; + + return $ret; +} + +$user = validateUserQuiet('batches'); +$audited=0; +if (!$user){ + $audited=1; + $user = validateUserQuiet('batches_audited'); +} +if (!$user){ + $url = $FANNIE_URL."auth/ui/loginform.php"; + $redirect = $FANNIE_URL."batches/newbatch/"; + header("Location:".$url."?redirect=".$redirect); + return; +} + +/* +$page_title = 'Fannie - New Batch Module'; +$header = 'Item Batcher'; +include('../../src/header.html'); +*/ + +?> + + +Batch Management + + + + + + + +

        + +
        +
        + +
        + + +$b) + $tidstr .= $tid."`"; + $tidstr = substr($tidstr,0,strlen($tidstr)-1); + + $ownerstr = ""; + foreach($owners as $o) + $ownerstr .= $o."`"; + $ownerstr = substr($ownerstr,0,strlen($ownerstr)-1); + + echo ""; + echo ""; + echo ""; + echo ""; +?> + + + + diff --git a/fannie/batches/xlsbatch/XlsBatchPage.php b/fannie/batches/xlsbatch/XlsBatchPage.php new file mode 100644 index 000000000..11e98bc0e --- /dev/null +++ b/fannie/batches/xlsbatch/XlsBatchPage.php @@ -0,0 +1,196 @@ + array( + 'name' => 'upc_lc', + 'display_name' => 'UPC/LC', + 'default' => 0, + 'required' => True + ), + 'price' => array( + 'name' => 'price', + 'display_name' => 'Price', + 'default' => 1, + 'required' => True + ) + ); + + private $results = ''; + + private function get_batch_types(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $batchtypes = array(); + $typesQ = $dbc->prepare_statement("select batchTypeID,typeDesc from batchType order by batchTypeID"); + $typesR = $dbc->exec_statement($typesQ); + while ($typesW = $dbc->fetch_array($typesR)) + $batchtypes[$typesW[0]] = $typesW[1]; + return $batchtypes; + } + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $upcCol = $this->get_column_index('upc_lc'); + $priceCol = $this->get_column_index('price'); + + for($i=0;$iprepare_statement("SELECT discType FROM batchType WHERE batchTypeID=?"); + $dt = array_pop($dbc->fetch_row($dbc->exec_statement($dtQ,array($btype)))); + + $insQ = $dbc->prepare_statement("INSERT INTO batches (startDate,endDate,batchName,batchType,discounttype,priority) + VALUES (?,?,?,?,?,0)"); + $args = array($date1,$date2,$bname,$btype,$dt); + $insR = $dbc->exec_statement($insQ,$args); + $id = $dbc->insert_id(); + + $upcChk = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); + $listP = $dbc->prepare_statement("INSERT INTO batchList (upc,batchID,salePrice,active,pricemethod,quantity) + VALUES(?,?,?,0,0,0)"); + $ret = ''; + foreach($linedata as $line){ + if (!isset($line[$upcCol])) continue; + if (!isset($line[$priceCol])) continue; + $upc = $line[$upcCol]; + $price = $line[$priceCol]; + $upc = str_replace(" ","",$upc); + $upc = str_replace("-","",$upc); + $price = trim($price,' '); + $price = trim($price,'$'); + if(!is_numeric($upc)){ + $ret .= "Omitting item. Identifier {$upc} isn't a number
        "; + continue; + } + elseif(!is_numeric($price)){ + $ret .= "Omitting item. Price {$price} isn't a number
        "; + continue; + } + + $upc = ($ftype=='UPCs')?str_pad($upc,13,'0',STR_PAD_LEFT):'LC'.$upc; + if ($has_checks && $ftype=='UPCs') + $upc = '0'.substr($upc,0,12); + + if ($ftype == 'UPCs'){ + $chkR = $dbc->exec_statement($upcChk, array($upc)); + if ($dbc->num_rows($chkR) == 0) continue; + } + + $dbc->exec_statement($listP,array($upc,$id,$price)); + } + + $ret .= "Batch created"; + $this->results = $ret; + return True; + } + + function results_content(){ + return $this->results; + } + + function preview_content(){ + $batchtypes = $this->get_batch_types(); + $ret = sprintf("Batch Type: %s
        ", + $batchtypes[FormLib::get_form_value('btype')],FormLib::get_form_value('btype')); + $ret .= sprintf("Batch Name: %s
        ", + FormLib::get_form_value('bname'),FormLib::get_form_value('bname')); + $ret .= sprintf("Start Date: %s
        ", + FormLib::get_form_value('date1'),FormLib::get_form_value('date1')); + $ret .= sprintf("End Date: %s
        ", + FormLib::get_form_value('date2'),FormLib::get_form_value('date2')); + $ret .= sprintf("Product Identifier: %s
        ", + FormLib::get_form_value('ftype'),FormLib::get_form_value('ftype')); + $ret .= sprintf("Includes check digits:
        "); + $ret .= "    UPCs have check digits
        "; + $ret .= "
        "; + return $ret; + } + + function form_content(){ + ob_start(); + ?> +
        + Use this tool to create a sales batch from an Excel file (XLS or CSV). Uploaded + files should have a column identifying the product, either by UPC + or likecode, and a column with prices. +
        + get_batch_types(); + ob_start(); + ?> +
        + + + + + + + + + + +
        TypeStart
        NameEnd
        + + Filename: +
        Identifier + +
        +
        + add_script($FANNIE_URL.'src/CalendarControl.js'); + return ob_get_clean(); + } +} +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new XlsBatchPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/batches/xlsbatch/index.php b/fannie/batches/xlsbatch/index.php new file mode 100644 index 000000000..a33dc9157 --- /dev/null +++ b/fannie/batches/xlsbatch/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/cache/README b/fannie/cache/README new file mode 100644 index 000000000..06b2568ce --- /dev/null +++ b/fannie/cache/README @@ -0,0 +1,4 @@ +You need writeable cache directories, like so: + +# mkdir -p cachefiles/{daily,monthly} +# chmod -R 777 cachefiles diff --git a/fannie/cache/cache.php b/fannie/cache/cache.php new file mode 100644 index 000000000..4594cf625 --- /dev/null +++ b/fannie/cache/cache.php @@ -0,0 +1,46 @@ + diff --git a/fannie/case-search.sh b/fannie/case-search.sh new file mode 100755 index 000000000..3d7c35ab9 --- /dev/null +++ b/fannie/case-search.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +if [ $# != 1 ]; then + echo "Usage: case-search.sh " + echo "Matches files containing the string but in a different case" + exit +fi + +find . -name '*.php' | xargs grep -i $1 | grep -v $1 diff --git a/fannie/classlib2.0/FannieAPI.php b/fannie/classlib2.0/FannieAPI.php new file mode 100644 index 000000000..bc21a9042 --- /dev/null +++ b/fannie/classlib2.0/FannieAPI.php @@ -0,0 +1,121 @@ + file_name + if (!is_array($map)){ + $map = array(); + $_SESSION['FannieClassMap'] = array(); + } + + // if class is known in the map, include its file + // otherwise search for an appropriate file + if (isset($map[$name]) && !class_exists($name,False) + && file_exists($map[$name])){ + + include_once($map[$name]); + } + else { + // search class lib for definition + $file = self::FindClass($name, dirname(__FILE__)); + if ($file !== False) + include_once($file); + // search plugins for definition + $file = self::FindClass($name, dirname(__FILE__).'/../modules/plugins2.0'); + if ($file !== False){ + // only use if enabled + $owner = FanniePlugin::MemberOf($file); + if (FanniePlugin::IsEnabled($owner)) + include_once($file); + } + } + } + + /** + Search for class in given path + @param $name the class name + @param $path path to search + @return A filename or False + */ + static private function FindClass($name, $path){ + if (!is_dir($path)){ + return False; + } + + $dh = opendir($path); + while($dh && ($file=readdir($dh)) !== False){ + if ($file[0] == ".") continue; + $fullname = realpath($path.'/'.$file); + if (is_dir($fullname)){ + // recurse looking for file + $file = self::FindClass($name, $fullname); + if ($file !== False) return $file; + } + elseif (substr($file,-4) == '.php'){ + // map all PHP files as long as we're searching + // but only return if the correct file is found + $class = substr($file,0,strlen($file)-4); + $_SESSION['FannieClassMap'][$class] = $fullname; + if ($class == $name) return $fullname; + } + } + + return False; + } +} + +FannieAPI::init(); +if (function_exists('spl_autoload_register')){ + spl_autoload_register(array('FannieAPI','LoadClass')); +} +else { + function __autoload($name){ + FannieAPI::LoadClass($name); + } +} + +?> diff --git a/fannie/classlib2.0/FannieDispatch.php b/fannie/classlib2.0/FannieDispatch.php new file mode 100644 index 000000000..06277e737 --- /dev/null +++ b/fannie/classlib2.0/FannieDispatch.php @@ -0,0 +1,90 @@ +"; + } + + static private function tab(){ + if (php_sapi_name() == 'cli') return "\t"; + else return "
      • "; + } + + static public function error_handler($errno, $errstr, $errfile='', $errline=0, $errcontext=array()){ + echo $errstr.' Line '.$errline.', '.$errfile.self::nl(); + self::print_stack(debug_backtrace()); + return True; + } + + static public function exception_handler($exception){ + echo $exception->getMessage()." Line ".$exception->getLine().", ".$exception->getFile().self::nl(); + self::print_stack($exception->getTrace()); + } + + static public function print_stack($stack){ + echo "STACK:".self::nl(); + $i = 1; + foreach($stack as $frame){ + if (!isset($frame['line'])) $frame['line']=0; + if (!isset($frame['file'])) $frame['file']='File not given'; + if (!isset($frame['args'])) $frame['args'] =array(); + if (isset($frame['class'])) $frame['function'] = $frame['class'].'::'.$frame['function']; + echo "Frame $i".self::nl(); + echo self::tab().$frame['function'].'('; + $args = ''; + foreach($frame['args'] as $arg) + $args .= $arg.', '; + $args = rtrim($args); + $args = rtrim($args,','); + echo $args.')'.self::nl(); + echo self::tab().'Line '.$frame['line'].', '.$frame['file'].self::nl(); + $i++; + } + + } + + static public function catch_fatal(){ + $error = error_get_last(); + if ( $error["type"] == E_ERROR ) + self::error_handler( $error["type"], $error["message"], $error["file"], $error["line"] ); + } + + static public function go(){ + set_error_handler(array('FannieDispatch','error_handler')); + set_exception_handler(array('FannieDispatch','exception_handler')); + register_shutdown_function(array('FannieDispatch','catch_fatal')); + + $page = basename($_SERVER['PHP_SELF']); + $class = substr($page,0,strlen($page)-4); + if (class_exists($class)){ + $obj = new $class(); + $obj->draw_page(); + } + else { + trigger_error('Missing class '.$class, E_USER_NOTICE); + } + } +} diff --git a/fannie/classlib2.0/FanniePage.php b/fannie/classlib2.0/FanniePage.php new file mode 100644 index 000000000..df1411254 --- /dev/null +++ b/fannie/classlib2.0/FanniePage.php @@ -0,0 +1,241 @@ +must_authenticate ) + $this->must_authenticate = $FANNIE_AUTH_DEFAULT; + } + + /** + Toggle using menus + @param $menus boolean + */ + function has_menus($menus){ + $this->window_dressing = ($menus) ? True : False; + } + + /** + Get the standard header + @return An HTML string + */ + function get_header(){ + global $FANNIE_ROOT; + ob_start(); + $page_title = $this->title; + $header = $this->header; + include($FANNIE_ROOT.'src/header.html'); + return ob_get_clean(); + + } + + /** + Get the standard footer + @return An HTML string + */ + function get_footer(){ + global $FANNIE_ROOT, $FANNIE_AUTH_ENABLED, $FANNIE_URL; + ob_start(); + include($FANNIE_ROOT.'src/footer.html'); + return ob_get_clean(); + } + + /** + Handle pre-display tasks such as input processing + @return + - True if the page should be displayed + - False to stop here + + Common uses include redirecting to a different module + and altering body content based on input + */ + function preprocess(){ + return True; + } + + /** + Define the main displayed content + @return An HTML string + */ + function body_content(){ + + } + + /** + Define any javascript needed + @return A javascript string + */ + function javascript_content(){ + + } + + /** + Add a script to the page using ', + $s_type, $s_url); + echo "\n"; + } + + $js_content = $this->javascript_content(); + if (!empty($js_content) || !empty($this->onload_commands)){ + echo ''; + } + + foreach($this->css_files as $css_url){ + printf('', + $css_url); + echo "\n"; + } + + // 22May13 Eric Lee Moved after css_files so these take precedence. + $page_css = $this->css_content(); + if (!empty($page_css)){ + echo ''; + } + + if ($this->window_dressing) echo ''; + } + } +} + +?> diff --git a/fannie/classlib2.0/FanniePlugin.php b/fannie/classlib2.0/FanniePlugin.php new file mode 100644 index 000000000..423457a49 --- /dev/null +++ b/fannie/classlib2.0/FanniePlugin.php @@ -0,0 +1,160 @@ + array('default'=>'','label'=>'Setting #1', + 'description'=>'Text goes here'), + 'example2' => array('default'=>1, + 'options'=>array('Yes'=>1,'No'=>0) + ) + ); + + public $plugin_description = 'This author didn\'t provide anything. Shame!'; + + /** + Callback. Triggered when plugin is enabled + */ + public function plugin_enable(){ + + } + + /** + Callback. Triggered when plugin is disabled + */ + public function plugin_disable(){ + + } + + /** + Callback. Triggered when a setting is modified + */ + public function setting_change(){ + + } + + /** + Get a URL for the plugin's directory + */ + public function plugin_url(){ + global $FANNIE_URL; + $info = new ReflectionClass($this); + return $FANNIE_URL.'modules/plugins2.0/'.basename(dirname($info->getFileName())); + } + + /** + Get filesystem path for the plugin's directory + */ + public function plugin_dir(){ + $info = new ReflectionClass($this); + return dirname($info->getFileName()); + } + + public function plugin_db_struct($db, $struct_name, $db_name=""){ + if ($db->table_exists($struct_name)) return True; + + $dir = $this->plugin_dir(); + if (!file_exists($dir.'/sql/'.$struct_name.'.php')) + return 'No create file for: '.$struct_name; + include($dir.'/sql/'.$struct_name.'.php'); + if (!isset($PLUGIN_CREATE) || !isset($PLUGIN_CREATE[$struct_name])) + return 'No definition for: '.$struct_name; + + $result = $db->query($PLUGIN_CREATE[$struct_name], $db_name); + if ($result) + return True; + else + return $db->error($db_name); + } + + /** + Find the plugin containing a given file + @param $file string filename + @return plugin name or boolean False + */ + public static function MemberOf($file){ + $file = realpath($file); + $sep = '/'; + if (strstr($file,'/')) + $sep = '/'; + elseif (strstr($file,'\\')) + $sep = '\\'; + else + return False; + + $dirs = explode($sep, $file); + for($i=0;$i full file name + */ + public static function PluginMap($path="",$in=array()){ + if($path=="") $path = realpath(dirname(__FILE__).'/../modules/plugins2.0'); + $dh = opendir($path); + while( ($file = readdir($dh)) !== False){ + if ($file[0] == ".") continue; + if (is_dir($path."/".$file)) + $in = self::PluginMap(realpath($path.'/'.$file),$in); + if (substr($file,-4)==".php" && $file != "Plugin.php") + $in[substr($file,0,strlen($file)-4)] = realpath($path.'/'.$file); + } + closedir($dh); + return $in; + } +} + +?> diff --git a/fannie/classlib2.0/FannieRESTfulPage.php b/fannie/classlib2.0/FannieRESTfulPage.php new file mode 100644 index 000000000..f706b7c56 --- /dev/null +++ b/fannie/classlib2.0/FannieRESTfulPage.php @@ -0,0 +1,233 @@ + should provide a controller + function named method_one_two_handler(). It + may optionally provide a view function + named method_one_two_view(). + + controller functions behave like FanniePage::preprocess + and should return True or False. + + view functions behave like FanniePage::body_content + and should return an HTML string + */ + protected $__routes = array( + 'get', + 'get', + 'post', + 'post', + 'put', + 'put', + 'delete', + 'delete' + ); + + protected $__route_stem = 'unknown_request'; + + /** + Extract paramaters from route definition + @param $route string route definition + @return array of parameter names + */ + private function route_params($route){ + $matches = array(); + $try = preg_match_all('/<(.+?)>/',$route,$matches); + if ($try > 0) return $matches[1]; + else return False; + } + + /** + Parse request info and determine which route to use + */ + public function read_routes(){ + // routes begin with method + $this->__method = FormLib::get_form_value('_method'); + if ($this->__method === ''){ + $this->__method = $_SERVER['REQUEST_METHOD']; + } + $this->__method = strtolower($this->__method); + + // find all matching routes + $try_routes = array(); + foreach($this->__routes as $route){ + // correct request type + if(substr($route,0,strlen($this->__method)) == $this->__method){ + $params = $this->route_params($route); + if ($params === False || count($params) === 0){ + // route with no params + if (!isset($try_routes[0])) $try_routes[0] = array(); + $try_routes[0][] = $route; + } + else { + // make sure all params provided + $all = True; + foreach($params as $p){ + if (FormLib::get_form_value($p,False) === False){ + $all = False; + break; + } + } + if ($all){ + if (!isset($try_routes[count($params)])) + $try_routes[count($params)] = array(); + $try_routes[count($params)][] = $route; + } + } + } + } + + // use the route with the most parameters + // set class variables to parameters + $num_params = array_keys($try_routes); + rsort($num_params); + $this->__route_stem = 'unknown_request'; + if (count($num_params) > 0){ + $longest = $num_params[0]; + $best_route = array_pop($try_routes[$longest]); + $this->__route_stem = $this->__method; + if ($longest > 0){ + foreach($this->route_params($best_route) as $param){ + $this->$param = FormLib::get_form_value($param); + $this->__route_stem .= '_'.$param; + } + } + } + } + + public function preprocess(){ + $this->read_routes(); + $handler = $this->__route_stem.'_handler'; + $view = $this->__route_stem.'_view'; + if (method_exists($this, $handler)) + return $this->$handler(); + elseif (method_exists($this, $view)) + return True; + else + return $this->unknown_request_handler(); + } + + /** + Process unknown HTTP method request + @return boolean + Returning True draws the page + Returning False does not + */ + protected function unknown_request_handler(){ + echo 'HTTP 400 - Bad Request +

        HTTP 400 - Bad Request'; + return False; + } + + public function body_content(){ + $func = $this->__route_stem.'_view'; + if (!method_exists($this, $func)) + return $this->unknown_request_view(); + else + return $this->$func(); + } + + /** + Draw default page for unknown HTTP method + @return HTML string + */ + protected function unknown_request_view(){ + return 'HTTP 400 - Bad Request'; + } + + /** + Load model(s) + @param $database_connection SQLManager object + @param $class string name of model class + @param $params array of column names and values + @param $find [optional] string sort column or False + @return model object or array or model objects + + If called without $find or $find=False returns a + single model object. Provided $params must be sufficient + to uniquely identify a single record + + If called with $find then returns an array of model + objects for all records that match $params and + sorted by $find. + */ + protected function get_model($database_connection, $class, $params, $find=False){ + $obj = new $class($database_connection); + foreach($params as $name => $value){ + if (method_exists($obj, $name)) + $obj->$name($value); + } + if ($find) + return $obj->find($find); + else{ + $obj->load(); + return $obj; + } + } + +} diff --git a/fannie/classlib2.0/FannieReportPage.php b/fannie/classlib2.0/FannieReportPage.php new file mode 100644 index 000000000..4c174fb34 --- /dev/null +++ b/fannie/classlib2.0/FannieReportPage.php @@ -0,0 +1,503 @@ +check_data_cache(); + if ($cached !== False){ + $data = unserialize(gzuncompress($cached)); + if ($data === False) + $data = $this->fetch_report_data(); + } + else { + $data = $this->fetch_report_data(); + $this->freshen_cache($data); + } + $output = ''; + if ($this->multi_report_mode && $this->report_format != 'xls'){ + foreach($data as $report_data){ + $footers = $this->calculate_footers($report_data); + $output .= $this->render_data($report_data,$this->report_headers, + $footers,$this->report_format); + $output .= '
        '; + } + } + elseif ($this->multi_report_mode && $this->report_format == 'xls'){ + /** + For XLS ouput, re-assemble multiple reports into a single + long dataset. + */ + $xlsdata = array(); + foreach($data as $report_data){ + if (!empty($this->report_headers)) $xlsdata[] = $this->report_headers(); + foreach($report_data as $line) $xlsdata[] = $line; + $footers = $this->calculate_footers($report_data); + if (!empty($footers)) $xlsdata[] = $footers; + $xlsdata[] = array(''); + } + $output = $this->render_data($xlsdata,array(),array(),'xls'); + } + else { + $footers = $this->calculate_footers($data); + $output = $this->render_data($data,$this->report_headers, + $footers,$this->report_format); + } + echo $output; + } + + /** + Calculate a footer row + @param $data an two-dimensional array of data + @return array of footer values + + Principally, footers are separate from data + so they can be marked in such in HTML rendering + and stay at the bottom when data sorting changes. + + This function may also be used to set values + for headers or default sorting. On more elaborate reports, + the number of columns may vary depending on what options + are selected. This function is always called so those values + will be set reliably even if caching is enabled. + */ + function calculate_footers($data){ + return array(); + } + + /** + Look for cached SQL data + + Data is stored in the archive database, reportDataCache table. + + The key column is an MD5 hash of the current URL (minus the excel + parameter, if present). This means your forms should use type GET + if caching is enabled. + + The data is stored as a serialized, gzcompressed string. + */ + function check_data_cache(){ + global $dbc,$FANNIE_ARCHIVE_DB; + if ($this->report_cache != 'day' && $this->report_cache != 'month') + return False; + $table = $FANNIE_ARCHIVE_DB.$dbc->sep()."reportDataCache"; + $hash = $_SERVER['REQUEST_URI']; + $hash = str_replace("&excel=xls","",$hash); + $hash = str_replace("&excel=csv","",$hash); + $hash = md5($hash); + $query = $dbc->prepare_statement("SELECT report_data FROM $table WHERE + hash_key=? AND expires >= ".$dbc->now()); + $result = $dbc->exec_statement($query,array($hash)); + if ($dbc->num_rows($result) > 0) + return array_pop($dbc->fetch_row($result)); + else + return False; + } + + /** + Store SQL data in the cache + @param $data the data + @return True or False based on success + + See check_data_cache for details + */ + function freshen_cache($data){ + global $dbc,$FANNIE_ARCHIVE_DB; + if ($this->report_cache != 'day' && $this->report_cache != 'month') + return False; + $table = $FANNIE_ARCHIVE_DB.$dbc->sep()."reportDataCache"; + $hash = $_SERVER['REQUEST_URI']; + $hash = str_replace("&excel=xls","",$hash); + $hash = str_replace("&excel=csv","",$hash); + $hash = md5($hash); + $expires = ''; + if ($this->report_cache == 'day') + $expires = date('Y-m-d',mktime(0,0,0,date('n'),date('j')+1,date('Y'))); + elseif ($this->report_cache == 'month') + $expires = date('Y-m-d',mktime(0,0,0,date('n')+1,date('j'),date('Y'))); + + $delQ = $dbc->prepare_statement("DELETE FROM $table WHERE hash_key=?"); + $dbc->exec_statement($delQ,array($hash)); + $upQ = $dbc->prepare_statement("INSERT INTO $table (hash_key, report_data, expires) + VALUES (?,?,?)"); + $dbc->exec_statement($upQ, array($hash, gzcompress(serialize($data)), $expires)); + return True; + } + + /** + Extra, non-tabular information prepended to + reports + @return array of strings + */ + function report_description_content(){ + return array(); + } + + /** + Get the report data + @return a two dimensional array + + Actual SQL queries go here! + + If using multi_report_mode, this should + return an array of two dimensional arrays + where each two dimensional arrays contains + a report's data. + */ + function fetch_report_data(){ + + } + + /** + Format data for display + @param $data a two dimensional array of data + @param $headers a header row (optional) + @param $format output format (html | xls | csv) + @return formatted string + */ + function render_data($data,$headers=array(),$footers=array(),$format='html'){ + global $FANNIE_URL,$FANNIE_ROOT; + $ret = ""; + switch(strtolower($format)){ + case 'html': + if ($this->multi_counter == 1){ + $this->add_css_file($FANNIE_URL.'src/jquery/themes/blue/style.css'); + $ret .= sprintf(' + Download Excel +      + Download CSV', + $_SERVER['REQUEST_URI'], + (strstr($_SERVER['REQUEST_URI'],'?') ===False ? '?' : '&'), + $_SERVER['REQUEST_URI'], + (strstr($_SERVER['REQUEST_URI'],'?') ===False ? '?' : '&') + ); + foreach($this->report_description_content() as $line) + $ret .= '
        '.$line; + } + $class = 'mySortableTable'; + if ($this->sortable) $class .= ' tablesorter'; + $ret .= ''; + break; + case 'csv': + foreach($this->report_description_content() as $line) + $ret .= $this->csv_line(array($line)); + case 'xls': + break; + } + + if (!empty($headers)){ + switch(strtolower($format)){ + case 'html': + $ret .= ''; + $ret .= $this->html_line($headers, True); + $ret .= ''; + break; + case 'csv': + $ret .= $this->csv_line($headers); + break; + case 'xls': + break; + } + } + + for ($i=0;$ihtml_line($data[$i]); + if ($i==count($data)-1) $ret .= ''; + break; + case 'csv': + $ret .= $this->csv_line($data[$i]); + break; + case 'xls': + break; + } + } + + if (!empty($footers)){ + switch(strtolower($format)){ + case 'html': + $ret .= ''; + $ret .= $this->html_line($footers, True); + $ret .= ''; + break; + case 'csv': + $ret .= $this->csv_line($data[$i]); + break; + case 'xls': + break; + } + } + + switch(strtolower($format)){ + case 'html': + $ret .= '
        '; + $this->add_script($FANNIE_URL.'src/jquery/js/jquery.js'); + $this->add_script($FANNIE_URL.'src/jquery/jquery.tablesorter.js'); + $sort = sprintf('[[%d,%d]]',$this->sort_column,$this->sort_direction); + if ($this->sortable) + $this->add_onload_command("\$('.mySortableTable').tablesorter({sortList: $sort, widgets: ['zebra']});"); + break; + case 'csv': + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="'.$this->header.'.csv"'); + break; + case 'xls': + $xlsdata = $data; + if (!empty($headers)) array_unshift($xlsdata,$headers); + if (!empty($footers)) array_push($xlsdata,$footers); + foreach($this->report_description_content() as $line) + array_unshift($xlsdata,array($line)); + if (!function_exists('ArrayToXls')) + include_once($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $ret = ArrayToXls($xlsdata); + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="'.$this->header.'.xls"'); + break; + } + + $this->multi_counter++; + return $ret; + } + + /** + Convert keyed array to numerical + indexes and maintain order + */ + function dekey_array($arr){ + $ret = array(); + foreach($arr as $outer_key => $row){ + $record = array(); + foreach($row as $key => $val) + $record[] = $val; + $ret[] = $record; + } + return $ret; + } + + /** + Turn array into HTML table row + @param $row an array of data + @param $header True means tags, False means tags + @return HTML string + + Javascript sorting utility requires header rows to be tags + */ + function html_line($row, $header=False){ + global $FANNIE_URL; + $ret = ""; + $tag = $header ? 'th' : 'td'; + for($i=0;$i%s', + $FANNIE_URL,$row[$i],$row[$i]); + } + $ret .= '<'.$tag.' colspan="'.$span.'">'.$row[$i].''; + $i += $span; + } + return $ret.'';; + } + + /** + Turn array into CSV line + @param $row an array of data + @return CSV string + */ + function csv_line($row){ + $ret = ""; + foreach($row as $item){ + $item = str_replace('"','',$item); + $ret .= '"'.$item.'",'; + } + $ret = substr($ret,0,strlen($ret)-1)."\r\n"; + return $ret; + } + + /** + Check for input and display the page + */ + function draw_page(){ + if (!$this->check_auth() && $this->must_authenticate){ + $this->login_redirect(); + } + elseif ($this->preprocess()){ + + if ($this->window_dressing) + echo $this->get_header(); + + $fn = $this->content_function; + echo $this->$fn(); + + if ($this->window_dressing) + echo $this->get_footer(); + + foreach($this->scripts as $s_url => $s_type){ + printf('', + $s_type, $s_url); + echo "\n"; + } + + $js_content = $this->javascript_content(); + if (!empty($js_content) || !empty($this->onload_commands)){ + echo ''; + } + + $page_css = $this->css_content(); + if (!empty($page_css)){ + echo ''; + } + + foreach($this->css_files as $css_url){ + printf('', + $css_url); + echo "\n"; + } + + if ($this->window_dressing) + echo ''; + } + + // draw_page() + } +} + +?> diff --git a/fannie/classlib2.0/FannieReportPage2.php b/fannie/classlib2.0/FannieReportPage2.php new file mode 100644 index 000000000..30a621884 --- /dev/null +++ b/fannie/classlib2.0/FannieReportPage2.php @@ -0,0 +1,628 @@ +check_data_cache(); + if ($cached !== False){ + $data = unserialize(gzuncompress($cached)); + if ($data === False) + $data = $this->fetch_report_data(); + } + else { + $data = $this->fetch_report_data(); + $this->freshen_cache($data); + } + $output = ''; + if ($this->multi_report_mode && $this->report_format != 'xls'){ + $this->number_of_reports = count($data); + $this->number_of_summaries = count($this->summary_data); + foreach($data as $report_data){ + $footers = $this->calculate_footers($report_data); + $output .= $this->render_data($report_data, + $this->report_headers, + $footers, + $this->report_format); + if ($this->sortable) + $output .= '
        '; + } + // A summary or grand total of the report + // First row (of each) tested to see if seems like headers. + if ( !empty($this->summary_data) ) { + foreach($this->summary_data as $report_data){ + $this->summary_counter++; + $headers = array(); + // Move $report_data[0] to headers if all non-numbers. + for($i=0;$i= count($report_data[0]) ) + $headers = array_shift($report_data); + $footers = array(); + $output .= $this->render_data($report_data, + $headers, + $footers, + $this->report_format); + /* Better with CSS + if (False && $this->sortable) + $output .= '
        '; + */ + } + } + } + elseif ($this->multi_report_mode && $this->report_format == 'xls'){ + /** + For XLS ouput, re-assemble multiple reports into a single + long dataset. + */ + $xlsdata = array(); + foreach($data as $report_data){ + if (!empty($this->report_headers)) $xlsdata[] = $this->report_headers(); + foreach($report_data as $line) $xlsdata[] = $line; + $footers = $this->calculate_footers($report_data); + if (!empty($footers)) $xlsdata[] = $footers; + $xlsdata[] = array(''); + } + $output = $this->render_data($xlsdata,array(),array(),'xls'); + } + else { + $footers = $this->calculate_footers($data); + $output = $this->render_data($data,$this->report_headers, + $footers,$this->report_format); + } + echo $output; + + // report_content() + } + + /** + Calculate a footer row + @param $data an two-dimensional array of data + @return array of footer values + + Principally, footers are separate from data + so they can be marked in such in HTML rendering + and stay at the bottom when data sorting changes. + + This function may also be used to set values + for headers or default sorting. On more elaborate reports, + the number of columns may vary depending on what options + are selected. This function is always called so those values + will be set reliably even if caching is enabled. + function calculate_footers($data){ + return array(); + } + No change. + */ + + /** + Look for cached SQL data + + Data is stored in the archive database, reportDataCache table. + + The key column is an MD5 hash of the current URL (minus the excel + parameter, if present). This means your forms should use type GET + if caching is enabled. + + The data is stored as a serialized, gzcompressed string. + function check_data_cache(){ + global $dbc,$FANNIE_ARCHIVE_DB; + if ($this->report_cache != 'day' && $this->report_cache != 'month') + return False; + $table = $FANNIE_ARCHIVE_DB.$dbc->sep()."reportDataCache"; + $hash = $_SERVER['REQUEST_URI']; + $hash = str_replace("&excel=xls","",$hash); + $hash = str_replace("&excel=csv","",$hash); + $hash = md5($hash); + $query = $dbc->prepare_statement("SELECT report_data FROM $table WHERE + hash_key=? AND expires >= ".$dbc->now()); + $result = $dbc->exec_statement($query,array($hash)); + if ($dbc->num_rows($result) > 0) + return array_pop($dbc->fetch_row($result)); + else + return False; + } + No change. + */ + + /** + Store SQL data in the cache + @param $data the data + @return True or False based on success + + See check_data_cache for details + function freshen_cache($data){ + global $dbc,$FANNIE_ARCHIVE_DB; + if ($this->report_cache != 'day' && $this->report_cache != 'month') + return False; + $table = $FANNIE_ARCHIVE_DB.$dbc->sep()."reportDataCache"; + $hash = $_SERVER['REQUEST_URI']; + $hash = str_replace("&excel=xls","",$hash); + $hash = str_replace("&excel=csv","",$hash); + $hash = md5($hash); + $expires = ''; + if ($this->report_cache == 'day') + $expires = date('Y-m-d',mktime(0,0,0,date('n'),date('j')+1,date('Y'))); + elseif ($this->report_cache == 'month') + $expires = date('Y-m-d',mktime(0,0,0,date('n')+1,date('j'),date('Y'))); + + $delQ = $dbc->prepare_statement("DELETE FROM $table WHERE hash_key=?"); + $dbc->exec_statement($delQ,array($hash)); + $upQ = $dbc->prepare_statement("INSERT INTO $table (hash_key, report_data, expires) + VALUES (?,?,?)"); + $dbc->exec_statement($upQ, array($hash, gzcompress(serialize($data)), $expires)); + return True; + } + No change. + */ + + /** + Extra, non-tabular information prepended to + reports + @return array of strings + + function report_description_content(){ + return array(); + } + No change. + */ + + /** + Get the report data + @return a two dimensional array + + Actual SQL queries go here! + + If using multi_report_mode, this should + return an array of two dimensional arrays + where each two dimensional arrays contains + a report's data. + + function fetch_report_data(){ + + } + No change. + */ + + /** + Format data for one report for display + @param $data a two dimensional array of data + @param $headers a header row (optional) + @param $footers a column-totals row (optional) + @param $format output format (html | xls | csv) + @return formatted string + Changed. + */ + function render_data($data,$headers=array(),$footers=array(),$format='html'){ + global $FANNIE_URL,$FANNIE_ROOT; + $ret = ""; + switch(strtolower($format)){ + case 'html': + if ($this->multi_counter == 1){ + $this->add_css_file($FANNIE_URL.'src/jquery/themes/blue/style.css'); + $this->add_css_file($FANNIE_URL.'src/css/reports.css'); + if ( !$this->window_dressing ) + $ret .= ''; + $ret .= sprintf( + 'Download Excel', + $_SERVER['REQUEST_URI'], + (strstr($_SERVER['REQUEST_URI'],'?') === False ? '?' : '&')); + $ret .= '      '; + $ret .= sprintf('Download CSV', + $_SERVER['REQUEST_URI'], + (strstr($_SERVER['REQUEST_URI'],'?') === False ? '?' : '&')); + $ret .= '      '; + $ret .= 'Back'; + foreach($this->report_description_content() as $line) + $ret .= (substr($line,0,1) == '<')?$line:'
        '.$line; + } + $class = 'mySortableTable'; + if ($this->sortable) + $class .= ' tablesorter fancytable'; + if ($this->sortable || $this->multi_counter == 1) + $ret .= ''; + break; + case 'csv': + foreach($this->report_description_content() as $line) + $ret .= $this->csv_line(array($line)); + case 'xls': + break; + } + + if (!empty($headers)){ + switch(strtolower($format)){ + case 'html': + $ret .= ''; + $ret .= $this->html_line($headers, True); + $ret .= ''; + break; + case 'csv': + $ret .= $this->csv_line($headers); + break; + case 'xls': + break; + } + } + + for ($i=0;$isortable || $this->multi_counter == 1) { + $ret .= ''; + } + } + $ret .= $this->html_line($data[$i]); + if ($i==count($data)-1) { + if ( $this->sortable || + !$this->multi_report_mode || + ($this->multi_counter >= $this->number_of_reports && + $this->summary_counter == $this->number_of_summaries) + ) { + $ret .= ''; + } + } + break; + case 'csv': + $ret .= $this->csv_line($data[$i]); + break; + case 'xls': + break; + } + } + + // For html these are supposed to be before + if (!empty($footers)){ + switch(strtolower($format)){ + case 'html': + if ($this->sortable) { + $ret .= ''; + $ret .= $this->html_line($footers, False, True); + $ret .= ''; + } + else { + $ret .= $this->html_line($footers, False, True); + if ( $this->multi_counter < ($this->number_of_reports + count($this->summary_data)) ) { + $ret .= ""; + } + } + break; + case 'csv': + $ret .= $this->csv_line($data[$i]); + break; + case 'xls': + break; + } + } + + switch(strtolower($format)){ + case 'html': + if ( $this->sortable || + ($this->multi_counter == $this->number_of_reports && empty($this->summary_data)) || + ($this->multi_counter >= $this->number_of_reports && $this->summary_counter == $this->number_of_summaries) + ) { + $ret .= '
         
        '; + } + + $this->add_script($FANNIE_URL.'src/jquery/js/jquery.js'); + $this->add_script($FANNIE_URL.'src/jquery/jquery.tablesorter.js'); + $sort = sprintf('[[%d,%d]]',$this->sort_column,$this->sort_direction); + if ($this->sortable) + $this->add_onload_command("\$('.mySortableTable').tablesorter({sortList: $sort, widgets: ['zebra']});"); + break; + case 'csv': + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="'.$this->header.'.csv"'); + break; + case 'xls': + $xlsdata = $data; + if (!empty($headers)) array_unshift($xlsdata,$headers); + if (!empty($footers)) array_push($xlsdata,$footers); + foreach($this->report_description_content() as $line) + array_unshift($xlsdata,array($line)); + if (!function_exists('ArrayToXls')) + include_once($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $ret = ArrayToXls($xlsdata); + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="'.$this->header.'.xls"'); + break; + } + + $this->multi_counter++; + return $ret; + + // render_data() + } + + /** + Convert keyed array to numerical + indexes and maintain order + + function dekey_array($arr){ + $ret = array(); + foreach($arr as $outer_key => $row){ + $record = array(); + foreach($row as $key => $val) + $record[] = $val; + $ret[] = $record; + } + return $ret; + } + No change. + */ + + /** + Turn array into HTML table row + @param $row an array of data + @param $header True means tags, False means tags + @return HTML string + + Javascript sorting utility requires header rows to be tags + Changed. + */ + function html_line($row, $header=False, $footer=False){ + global $FANNIE_URL; + $ret = ""; + $tag = $header ? 'th' : 'td'; + for($i=0;$icellTextAlign; + if ($row[$i] === "" || $row[$i] === null) $row[$i] = ' '; + elseif (is_numeric($row[$i]) && strlen($row[$i]) == 13){ + // auto-link UPCs to edit tool + $textAlign = 'right'; + $row[$i] = sprintf('%s', + $FANNIE_URL,$row[$i],$row[$i]); + } + if ( $textAlign == '' && preg_match("/^[0-9., $%]+$/",$row[$i]) ) + $textAlign = 'right'; + $class = ''; + $class .= ($textAlign == 'right') ? " number" : ''; + $class .= ($footer) ? " footer" : ''; + $class = ($class) ? " class='$class'" : ''; + $ret .= '<'.$tag.$class.' colspan="'.$span.'">'.$row[$i].''; + $i += $span; + } + return $ret.''; + // html_line() + } + + /** + Turn array into CSV line + @param $row an array of data + @return CSV string + + function csv_line($row){ + $ret = ""; + foreach($row as $item){ + $item = str_replace('"','',$item); + $ret .= '"'.$item.'",'; + } + $ret = substr($ret,0,strlen($ret)-1)."\r\n"; + return $ret; + } + No change. + */ + + /** + Check for input and display the page + + function draw_page(){ + if ($this->preprocess()){ + + if ($this->window_dressing) + echo $this->get_header(); + + $fn = $this->content_function; + echo $this->$fn(); + + if ($this->window_dressing) + echo $this->get_footer(); + + foreach($this->scripts as $s_url => $s_type){ + printf('', + $s_type, $s_url); + echo "\n"; + } + + $js_content = $this->javascript_content(); + if (!empty($js_content) || !empty($this->onload_commands)){ + echo ''; + } + + $page_css = $this->css_content(); + if (!empty($page_css)){ + echo ''; + } + foreach($this->css_files as $css_url){ + printf('', + $css_url); + echo "\n"; + } + } + } + No change. + */ + +} + +?> diff --git a/fannie/classlib2.0/FannieUploadPage.php b/fannie/classlib2.0/FannieUploadPage.php new file mode 100644 index 000000000..5f1def83b --- /dev/null +++ b/fannie/classlib2.0/FannieUploadPage.php @@ -0,0 +1,598 @@ + array( + 'name' => 'upc', + 'display_name' => 'UPC', + 'default' => 7, + 'required' => True + ) + ); + + protected $preview_selections = array(); + + protected $upload_field_name = 'FannieUploadFile'; + protected $upload_file_name = ''; + protected $allowed_extensions = array('csv','xls','xlsx'); + + protected $error_details = 'n/a'; + + protected $use_splits = False; + + /** + Handle pre-display tasks such as input processing + @return + - True if the page should be displayed + - False to stop here + */ + function preprocess(){ + global $FANNIE_URL; + + $col_select = FormLib::get_form_value('cs',''); + + if (isset($_FILES[$this->upload_field_name])){ + /* file upload submitted */ + $try = $this->process_upload(); + if ($try){ + $this->content_function = 'basic_preview'; + $this->window_dressing = False; + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + } + else + $this->content_function = 'upload_error'; + } + else if (is_array($col_select)){ + $this->upload_file_name = FormLib::get_form_value('upload_file_name',''); + + /* column selections submitted */ + for($i=0;$ipreview_selections[$col_select[$i]] = $i; + } + $chk_required = True; + $this->error_details = ''; + foreach($this->preview_opts as $opt){ + if ($opt['required'] == True && !isset($this->preview_selections[$opt['name']])){ + $this->error_details .= '
      • '.$opt['display_name'].' is required
      • '; + $chk_required = False; + } + } + + if ($chk_required == True){ + + $try = False; + if ($this->use_splits){ + /* break file into pieces */ + $files = FormLib::get_form_value('f'); + if ($files === ''){ + $tempdir = dirname($this->upload_file_name); + if (!is_dir($tempdir.'/splits')) + mkdir($tempdir.'/splits'); + $orig = escapeshellarg($this->upload_file_name); + $new = escapeshellarg($tempdir.'/splits/csvUNFISPLIT'); + system("split -l 2500 $orig $new"); + $dir = opendir($tempdir.'/splits'); + while ($current = readdir($dir)){ + if (!strstr($current,"UNFISPLIT")) + continue; + $files[$i++] = $current; + } + closedir($dir); + unlink($this->upload_file_name); + $this->split_start(); + } + + if (!is_array($files)){ + $this->error_detail = 'Split problem'; + $this->content_function = 'results_content'; + } + else { + /* process one file */ + $this->upload_file_name = sys_get_temp_dir().'/fannie/splits/'.array_pop($files); + $try = $this->process_file($this->file_to_array()); + unlink($this->upload_file_name); + if ($try && count($files) > 0){ + /* if more remain, redirect back to self */ + $url = $_SERVER['PHP_SELF'].'?'; + foreach($files as $f) + $url .= 'f[]='.$f.'&'; + foreach($col_select as $c) + $url .= 'cs[]='.$c.'&'; + $url = rtrim($url,'&'); + header('Location: '.$url); + return False; + } + else if ($try && count($files) == 0){ + /* finished; call cleanup function */ + $this->split_end(); + } + } + } + else { + $try = $this->process_file($this->file_to_array()); + } + + if ($try){ + $this->content_function = 'results_content'; + } + else + $this->content_function = 'processing_error'; + + if (file_exists($this->upload_file_name)) + unlink($this->upload_file_name); + } + else { + $this->content_function = 'basic_preview'; + $this->window_dressing = False; + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + } + } + + return True; + } + + /** + Store uploaded file + @return True on success, False on error + */ + function process_upload(){ + /* use a dedicated temp directory */ + $tpath = sys_get_temp_dir().'/fannie/'; + if (!is_dir($tpath)){ + if (!mkdir($tpath)){ + $this->error_details = 'Directory error'; + return False; + } + } + + $tmpfile = $_FILES[$this->upload_field_name]['tmp_name']; + $path_parts = pathinfo($_FILES[$this->upload_field_name]['name']); + $extension = strtolower($path_parts['extension']); + $zip = False; + if ($_FILES[$this->upload_field_name]['error'] != UPLOAD_ERR_OK){ + $msg = ''; + switch($_FILES[$this->upload_field_name]['error']){ + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + $msg = 'File is too big. Try zipping it.'; + break; + case UPLOAD_ERR_PARTIAL: + $msg = 'Upload did not complete.'; + break; + case UPLOAD_ERR_NO_FILE: + $msg = 'No file was uploaded.'; + break; + case UPLOAD_ERR_NO_TMP_DIR: + $msg = 'No place to put the file.'; + break; + case UPLOAD_ERR_CANT_WRITE: + $msg = 'Permission problem saving file.'; + break; + default: + $msg = 'Unknown problem uploading the file.'; + break; + } + if (file_exists($tmpfile)) unlink($tmpfile); + $this->error_details = $msg; + return False; + } + + /* validate file by extension */ + if ($extension == 'zip'){ + $zip = True; + /* if it's a zip file, try to unzip it */ + if(!class_exists('ZipArchive')){ + unlink($tmpfile); + $this->error_details = 'No ZIP support'; + return False; + } + $za = new ZipArchive(); + if ($za->open($tmpfile) !== True){ + unlink($tmpfile); + $this->error_details = 'Bad ZIP file'; + return False; + } + $found = False; + /* + Go through all the files in the zip archive + If one has a valid extension, extract it to + the temp directory, remove the zip file, + and update $tmpfile so it points as the extracted + file + */ + for($i=0;$i<$za->numFiles;$i++){ + $entry = $za->getNameIndex($i); + $ext = strtolower(substr($entry,-4)); + if ($ext[0] == '.' && in_array(substr($ext,1),$this->allowed_extensions)){ + $found = True; + $za->extractTo($tpath, $entry); + $za->close(); + unlink($tmpfile); + $tmpfile = realpath($tpath.'/'.$entry); + $extension = substr($ext,1); + break; + } + } + if (!$found){ + $za->close(); + unlink($tmpfile); + $this->error_details = 'Bad ZIP contents'; + return False; + } + } + else if (!in_array($extension,$this->allowed_extensions)){ + $this->error_details = 'Bad file'; + unlink($tmpfile); + return False; + } + + /* get a unique temp file name */ + $this->upload_file_name = tempnam($tpath,substr($extension,-3)); + if ($this->upload_file_name === False){ + $this->upload_file_name = ''; + unlink($tmpfile); + $this->error_details = 'No name found'; + return False; + } + + $func = 'move_uploaded_file'; + /* PHP doesn't recognize the extracted file as "uploaded" */ + if ($zip) $func = 'rename'; + + /* rename the uploaded file */ + if ($func($tmpfile, $this->upload_file_name) === False){ + $this->upload_file_name = ''; + unlink($tmpfile); + unlink($this->upload_file_name); + $this->error_details = 'Could not rename'; + return False; + } + + /* if we got here, nothing went wrong */ + return True; + } + + /** + Do something with the uploaded data + @param $linedata an array of arrays + (each inner area is one line of data) + @return True on success, False on error + */ + function process_file($linedata){ + return True; + } + + /** + Called before processing split files + process_file() will be called multiple times + so anything that should only happen once + goes here instead. + */ + function split_start(){ + + } + + /** + Called after processing all split files + process_file() will be called multiple times + so anything that should only happen once + goes here instead. + */ + function split_end(){ + + } + + /** + Display if there is an upload error + @return An HTML string + */ + function upload_error(){ + return sprintf('Something went wrong uploading the file. + Details: %s. + Try again?', + $this->error_details, + $_SERVER['PHP_SELF']); + } + + /** + Display if there is an processing error + @return An HTML string + */ + function processing_error(){ + return sprintf('Something went wrong processing the file. + Details: %s. + Try again?', + $this->error_details, + $_SERVER['PHP_SELF']); + } + + /** + Use the function $this->content_function to generate + the page contents. + @return An HTML string + */ + function body_content(){ + if (!isset($this->content_function)) + $this->content_function = 'form_content'; + if (!method_exists($this,$this->content_function)) + $this->content_function = 'form_content'; + $func = $this->content_function; + $ret = $this->$func(); + switch($this->content_function){ + case 'form_content': + $ret .= $this->basic_form(); + break; + } + return $ret; + } + + /** + Any extra content before the form itself. + @return An HTML string + */ + function form_content(){ + return ""; + } + + /** + Default form automatically included with form_content() + @return An HTML string + */ + protected function basic_form(){ + return sprintf(' +
        + + Filename: + +
        ', $_SERVER['PHP_SELF'], + $this->upload_field_name, + $this->upload_field_name); + } + + /** + Any extra content to show with the preview + @return An HTML string + */ + function preview_content(){ + return ""; + } + + /** + Default preview of uploaded data + @return An HTML string + */ + protected function basic_preview(){ + $ret = '

        Select columns

        '; + /* show any errors */ + if ($this->error_details != 'n/a' && $this->error_details != ''){ + $ret .= '
          '; + $ret .= $this->error_details; + $ret .= '
        '; + } + $ret .= sprintf('
        ',$_SERVER['PHP_SELF']); + $ret .= $this->preview_content(); + $ret .= ''; + + /* Read the first five rows from the file + for a preview. Determine row width at + the same time */ + $fp = fopen($this->upload_file_name,'r'); + $width = 0; + $table = ""; + $linedata = $this->file_to_array(5); + foreach ($linedata as $data){ + $j=0; + foreach($data as $d){ + $table .=''; + $j++; + } + if ($j > $width) $width = $j; + $table .= ''; + } + fclose($fp); + + /* draw select boxes for each column */ + $ret .= ''; + for ($i=0;$i<$width;$i++){ + $ret .= ''; + } + $ret .= ''; + $ret .= $table . '
        '.$d.'
        '; + $ret .= sprintf('', + $this->upload_file_name); + $ret .= ''; + $ret .= '
        '; + return $ret; + } + + /** + This function ensures column selections are unique. + */ + function javascript_content(){ + ob_start(); + ?> + $(document).ready(function(){ + $('.columnSelector').change(function(){ + var myElem = this; + $('.columnSelector').each(function(i){ + if (this != myElem && $(this).val() == $('*:focus').val()) + $(this).val(''); + }); + }); + }); + preview_opts) + @return Integer index if available otherwise False + */ + protected function get_column_index($name){ + if (isset($this->preview_selections[$name])) + return $this->preview_selections[$name]; + else + return False; + } + + /** + Get two-dimensional array of file data + @param $limit if specified only return $limit records + @return An array of arrays. Each inner array + represents one line of data + */ + protected function file_to_array($limit=0){ + if (substr(basename($this->upload_file_name),0,3) == 'csv') + return $this->csv_to_array($limit); + elseif (substr(basename($this->upload_file_name),0,3) == 'xls'){ + return $this->xls_to_array($limit); + } + elseif (substr(basename($this->upload_file_name),0,3) == 'lsx'){ + // php tempfile nameing only allows a three character prefix + return $this->xlsx_to_array($limit); + } + else + return array(); + } + + /** + Helper for csv files. See file_to_array() + */ + protected function csv_to_array($limit=0){ + $fp = fopen($this->upload_file_name,'r'); + if (!$fp) return array(); + $ret = array(); + while(!feof($fp)){ + $line = fgets($fp); + $ret[] = csv_parser($line); + if ($limit != 0 && count($ret) >= $limit) break; + } + fclose($fp); + return $ret; + } + + /** + Helper for xls files. See file_to_array() + */ + protected function xls_to_array($limit){ + if (!class_exists('Spreadsheet_Excel_Reader')){ + return array(); + } + + $data = new Spreadsheet_Excel_Reader(); + $data->read($this->upload_file_name); + + $sheet = $data->sheets[0]; + $rows = $sheet['numRows']; + $cols = $sheet['numCols']; + $ret = array(); + for($i=1; $i<=$rows; $i++){ + $line = array(); + for ($j=1; $j<=$cols; $j++){ + if (isset($sheet['cells'][$i]) && isset($sheet['cells'][$i][$j])) + $line[] = $sheet['cells'][$i][$j]; + else + $line[] = ''; + } + $ret[] = $line; + if ($limit != 0 && count($ret) >= $limit) break; + } + return $ret; + } + + protected function xlsx_to_array($limit){ + if (!class_exists('PHPExcel_IOFactory')) + return array(); + + $objPHPExcel = PHPExcel_IOFactory::load($this->upload_file_name); + $sheet = $objPHPExcel->getActiveSheet(); + $rows = $sheet->getHighestRow(); + $cols = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()); + $ret = array(); + for ($i=1; $i<=$rows; $i++){ + $new = array(); + for($j=0; $j<=$cols; $j++){ + $new[] = $sheet->getCellByColumnAndRow($j,$i)->getValue(); + } + $ret[] = $new; + if ($limit != 0 && count($ret) >= $limit) break; + } + return $ret; + } +} + +?> diff --git a/fannie/classlib2.0/FannieWebService.php b/fannie/classlib2.0/FannieWebService.php new file mode 100644 index 000000000..78a6ebb75 --- /dev/null +++ b/fannie/classlib2.0/FannieWebService.php @@ -0,0 +1,75 @@ +getFileName())){ + $output = $this->run(); + $render_func = 'render_'.strtolower($this->type); + if (method_exists($this, $render_func)) + echo $this->$render_func($output); + else + echo $this->render_plain($output); + } + } + + /** + Do whatever the service is supposed to do. + Should override this. + @return an array of data + */ + protected function run(){ + return array(); + } + + /** + Create JSON representation of array + @param $arr an array + @return JSON string + */ + protected function render_json($arr){ + return JsonLib::array_to_json($arr); + } + + /** + Simple render concatenate array to string + @param $arr an array + @return string + */ + protected function render_plain($arr){ + $ret = ''; + foreach($arr as $a) $ret .= $a; + return $ret; + } +} + +?> diff --git a/fannie/classlib2.0/InstallPage.php b/fannie/classlib2.0/InstallPage.php new file mode 100644 index 000000000..e6023385c --- /dev/null +++ b/fannie/classlib2.0/InstallPage.php @@ -0,0 +1,71 @@ +title; + $header = $this->header; + include($FANNIE_ROOT.'src/header_install.html'); + return ob_get_clean(); + + } + + /** + Get the standard install-page footer + @return An HTML string + */ + function get_footer(){ + global $FANNIE_ROOT, $FANNIE_AUTH_ENABLED, $FANNIE_URL; + ob_start(); + include($FANNIE_ROOT.'src/footer_install.html'); + return ob_get_clean(); + } + +} + +?> diff --git a/fannie/classlib2.0/auth/FannieAuth.php b/fannie/classlib2.0/auth/FannieAuth.php new file mode 100644 index 000000000..fb9d98e15 --- /dev/null +++ b/fannie/classlib2.0/auth/FannieAuth.php @@ -0,0 +1,217 @@ +prepare_statement("select * from Users AS u LEFT JOIN + userSessions AS s ON u.uid=s.uid where u.name=? + and s.session_id=?"); + $checkR = $sql->exec_statement($checkQ,array($name,$session_id)); + + if ($sql->num_rows($checkR) == 0){ + return False; + } + + return $name; + } + + /** + Check if the current user has the given + permission + @param $auth authorization class name + @param $sub optional subclass + @return current username or False + + If authentication is not enabled, this + function returns the string 'null'. If + an init.php file is in place it returns + the string 'init'. + */ + static public function validateUserQuiet($auth, $sub='all'){ + if (!self::enabled()) return 'null'; + if (self::initCheck()) return 'init'; + + $current_user = self::checkLogin(); + if (!$current_user){ + return False; + } + + $groupPriv = self::checkGroupAuth($current_user,$auth,$sub); + if ($groupPriv){ + return $current_user; + } + + $priv = self::checkAuth($current_user,$auth,$sub); + if (!$priv){ + return False; + } + return $current_user; + } + + /** + Check if the given user has the given permission + @param $name the username + @param $auth_class the authorization class + @param $sub optional subclass + @return boolean + */ + static private function checkAuth($name, $auth_class, $sub='all'){ + global $FANNIE_OP_DB; + if (self::initCheck()) return 'init'; + + if (!self::isAlphanumeric($name) || !self::isAlphanumeric($auth_class) || !self::isAlphanumeric($sub)){ + return False; + } + + $uid = self::getUID($name); + if (!$uid){ + return False; + } + $sql = FannieDB::get($FANNIE_OP_DB); + $checkQ = $sql->prepare_statement("select * from userPrivs where uid=? and auth_class=? and + ((? between sub_start and sub_end) or (sub_start='all' and sub_end='all'))"); + $checkR = $sql->exec_statement($checkQ,array($uid,$auth_class,$sub)); + if ($sql->num_rows($checkR) == 0){ + return False; + } + return True; + } + + /** + Check if the given user is part of a group that + has the given permission + @param $user the username + @param $auth the authorization class + @param $sub optional subclass + @return boolean + */ + static private function checkGroupAuth($user, $auth, $sub='all'){ + global $FANNIE_OP_DB; + $sql = FannieDB::get($FANNIE_OP_DB); + if (!self::isAlphaNumeric($user) || !self::isAlphaNumeric($auth) || + !self::isAlphaNumeric($sub)){ + return False; + } + $checkQ = $sql->prepare_statement("select g.gid from userGroups as g, userGroupPrivs as p where + g.gid = p.gid and g.username=? + and p.auth=? and + ((? between p.sub_start and p.sub_end) or + (p.sub_start='all' and p.sub_end='all'))"); + $checkR = $sql->exec_statement($checkQ,array($user,$auth,$sub)); + + if ($sql->num_rows($checkR) == 0){ + return False; + } + return True; + } + + /** + Get UID for given username + @param $name the username + @return string UID or False + + If authentication is not enabled, + returns string '0000'. + */ + public static function getUID($name){ + global $FANNIE_OP_DB; + if (!self::enabled()) return '0000'; + + $sql = FannieDB::get($FANNIE_OP_DB); + $fetchQ = $sql->prepare_statement("select uid from Users where name=?"); + $fetchR = $sql->exec_statement($fetchQ,array($name)); + if ($sql->num_rows($fetchR) == 0){ + return False; + } + $uid = $sql->fetch_array($fetchR); + $uid = $uid[0]; + return $uid; + } + + /** + Check if authentication is enabled in + Fannie's configuration + @return boolean + */ + static private function enabled(){ + global $FANNIE_AUTH_ENABLED; + if (!isset($FANNIE_AUTH_ENABLED)){ + include(dirname(__FILE__).'/../../config.php'); + return $FANNIE_AUTH_ENABLED; + } + else + return $FANNIE_AUTH_ENABLED; + } + + /** + Check if an init.php file exists + @return boolean + */ + static private function initCheck(){ + return file_exists(dirname(__FILE__).'/../../auth/init.php'); + } + + /** + Check if a string is alphanumeric + @return boolean + */ + static private function isAlphanumeric($str){ + if (preg_match("/^\\w*$/",$str) == 0){ + return False; + } + return True; + } +} +?> diff --git a/fannie/classlib2.0/data/DTrans.php b/fannie/classlib2.0/data/DTrans.php new file mode 100644 index 000000000..567742717 --- /dev/null +++ b/fannie/classlib2.0/data/DTrans.php @@ -0,0 +1,94 @@ +0, + 'emp_no'=>0, + 'trans_no'=>0, + 'upc'=>'0', + 'description'=>'', + 'trans_type'=>'', + 'trans_subtype'=>'', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>0, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>0, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>0, + 'trans_id'=>0 + ); + + public static function parameterize($arr, $datecol='', $datefunc=''){ + $columns = !empty($datecol) && !empty($datefunc) ? $datecol.',' : ''; + $values = !empty($datecol) && !empty($datefunc) ? $datefunc.',' : ''; + $args = array(); + foreach($arr as $key => $val){ + // validate column names + if (!isset(self::$DEFAULTS[$key])) continue; + $columns .= $key.','; + $values .= '?,'; + $args[] = $val; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + return array( + 'columnString' => $columns, + 'valueString' => $values, + 'arguments' => $args + ); + } + +} +?> diff --git a/fannie/classlib2.0/data/FannieDB.php b/fannie/classlib2.0/data/FannieDB.php new file mode 100644 index 000000000..03c4166eb --- /dev/null +++ b/fannie/classlib2.0/data/FannieDB.php @@ -0,0 +1,74 @@ +connections[$db_name])) + self::add_db($db_name); + + self::$db->default_db = $db_name; + self::$db->query('use '.$db_name); + return self::$db; + } + + private static function new_db($db_name){ + global $FANNIE_ROOT, $FANNIE_SERVER, $FANNIE_SERVER_DBMS, + $FANNIE_SERVER_USER, $FANNIE_SERVER_PW; + if (!class_exists('SQLManager')) + include($FANNIE_ROOT.'src/SQLManager.php'); + self::$db = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $db_name, $FANNIE_SERVER_USER, $FANNIE_SERVER_PW); + } + + private static function add_db($db_name){ + global $FANNIE_ROOT, $FANNIE_SERVER, $FANNIE_SERVER_DBMS, + $FANNIE_SERVER_USER, $FANNIE_SERVER_PW; + if (!class_exists('SQLManager')) + include($FANNIE_ROOT.'src/SQLManager.php'); + self::$db->add_connection($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $db_name, $FANNIE_SERVER_USER, $FANNIE_SERVER_PW); + } +} + +?> diff --git a/fannie/classlib2.0/data/SyncLanes.php b/fannie/classlib2.0/data/SyncLanes.php new file mode 100644 index 000000000..cc214bbee --- /dev/null +++ b/fannie/classlib2.0/data/SyncLanes.php @@ -0,0 +1,198 @@ + boolean attempted to copy table + - messages => string result information + */ + static public function push_table($table,$db='op',$truncate=self::TRUNCATE_DESTINATION){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB, $FANNIE_LANES; + + $ret = array('sending'=>True,'messages'=>''); + + $db = strtolower($db); + if ($db != 'op' && $db != 'trans'){ + $ret['sending'] = False; + $ret['messages'] = 'Invalid database: '.$db; + return $ret; + } + elseif(empty($table)){ + $ret['sending'] = False; + $ret['messages'] = 'No table given'; + return $ret; + } + elseif (ereg("[^A-Za-z0-9_]",$table)){ + $ret['sending'] = False; + $ret['messages'] = 'Illegal table name: '.$table; + return $ret; + } + + $special = dirname(__FILE__).'/../../sync/special/'.$table.'.php'; + if (file_exists($special)){ + /* Use special script to send table. + * Usually with mysqldump. + * Much faster if both sides are mysql. + */ + ob_start(); + $outputFormat = 'plain'; + include($special); + $tmp = ob_get_clean(); + $ret = array('sending'=>True,'messages'=>''); + $ret['messages'] = $tmp; + return $ret; + } + else { + /* use the transfer option in SQLManager + * to copy records onto each lane + */ + $server_db = $db=='op' ? $FANNIE_OP_DB : $FANNIE_TRANS_DB; + $dbc = FannieDB::get( $server_db ); + $laneNumber=1; + foreach($FANNIE_LANES as $lane){ + $dbc->add_connection($lane['host'],$lane['type'], + $lane[$db],$lane['user'],$lane['pw']); + if ($dbc->connections[$lane[$db]]){ + if ($truncate & self::TRUNCATE_DESTINATION){ + $dbc->query("TRUNCATE TABLE $table",$lane[$db]); + } + $success = $dbc->transfer($server_db, + "SELECT * FROM $table", + $lane[$db], + "INSERT INTO $table"); + $dbc->close($lane[$db]); + if ($success){ + $ret['messages'] .= "Lane $laneNumber ({$lane['host']}) $table completed successfully"; + } + else { + $ret['messages'] .= "Lane $laneNumber ({$lane['host']}) $table completed but with some errors"; + } + } + else { + $ret['messages'] .= "Couldn't connect to lane $laneNumber ({$lane['host']})"; + } + $laneNumber++; + } + if ($truncate & self::TRUNCATE_SOURCE){ + $dbc->query("TRUNCATE TABLE $table",$server_db); + } + return $ret; + } + } + + /** + Copy a table from the lanes to the server + @param $table string table name + @param $db string 'op' or 'trans' + (default is 'trans') + @param $truncate integer + (default is TRUNCATE_SOURCE) + @return array + - sending => boolean attempted to copy table + - messages => string result information + */ + static public function pull_table($table,$db='trans',$truncate=self::TRUNCATE_SOURCE){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB, $FANNIE_LANES; + + $ret = array('sending'=>True,'messages'=>''); + + $db = strtolower($db); + if ($db != 'op' && $db != 'trans'){ + $ret['sending'] = False; + $ret['messages'] = 'Invalid database: '.$db; + return $ret; + } + elseif(empty($table)){ + $ret['sending'] = False; + $ret['messages'] = 'No table given'; + return $ret; + } + elseif (ereg("[^A-Za-z0-9_]",$table)){ + $ret['sending'] = False; + $ret['messages'] = 'Illegal table name: '.$table; + return $ret; + } + + // use the transfer option in SQLManager to copy + // records from each lane + $server_db = $db=='op' ? $FANNIE_OP_DB : $FANNIE_TRANS_DB; + $dbc = FannieDB::get( $server_db ); + if ($truncate & self::TRUNCATE_DESTINATION){ + $dbc->query("TRUNCATE TABLE $table",$server_db); + } + $laneNumber=1; + foreach($FANNIE_LANES as $lane){ + $dbc->add_connection($lane['host'],$lane['type'], + $lane[$db],$lane['user'],$lane['pw']); + if ($dbc->connections[$lane[$db]]){ + $success = $dbc->transfer($lane[$db], + "SELECT * FROM $table", + $server_db, + "INSERT INTO $table"); + if ($truncate & self::TRUNCATE_SOURCE){ + $dbc->query("TRUNCATE TABLE $table",$lane[$db]); + } + $dbc->close($lane[$db]); + if ($success){ + $ret['messages'] .= "Lane $laneNumber ({$lane['host']}) $table completed successfully"; + } + else { + $ret['messages'] .= "Lane $laneNumber ({$lane['host']}) $table completed but with some errors"; + } + } + else { + $ret['messages'] .= "Couldn't connect to lane $laneNumber ({$lane['host']})"; + } + $laneNumber++; + } + return $ret; + } +} diff --git a/fannie/classlib2.0/data/models/ArHistoryModel.php b/fannie/classlib2.0/data/models/ArHistoryModel.php new file mode 100644 index 000000000..5cf21f03b --- /dev/null +++ b/fannie/classlib2.0/data/models/ArHistoryModel.php @@ -0,0 +1,109 @@ + array('type'=>'INT','index'=>True), + 'Charges' => array('type'=>'MONEY'), + 'Payments' => array('type'=>'MONEY'), + 'tdate' => array('type'=>'DATETIME'), + 'trans_num' => array('type'=>'VARCHAR(50)') + ); + + protected $preferred_db = 'trans'; + + /* START ACCESSOR FUNCTIONS */ + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function Charges(){ + if(func_num_args() == 0){ + if(isset($this->instance["Charges"])) + return $this->instance["Charges"]; + elseif(isset($this->columns["Charges"]["default"])) + return $this->columns["Charges"]["default"]; + else return null; + } + else{ + $this->instance["Charges"] = func_get_arg(0); + } + } + + public function Payments(){ + if(func_num_args() == 0){ + if(isset($this->instance["Payments"])) + return $this->instance["Payments"]; + elseif(isset($this->columns["Payments"]["default"])) + return $this->columns["Payments"]["default"]; + else return null; + } + else{ + $this->instance["Payments"] = func_get_arg(0); + } + } + + public function tdate(){ + if(func_num_args() == 0){ + if(isset($this->instance["tdate"])) + return $this->instance["tdate"]; + elseif(isset($this->columns["tdate"]["default"])) + return $this->columns["tdate"]["default"]; + else return null; + } + else{ + $this->instance["tdate"] = func_get_arg(0); + } + } + + public function trans_num(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_num"])) + return $this->instance["trans_num"]; + elseif(isset($this->columns["trans_num"]["default"])) + return $this->columns["trans_num"]["default"]; + else return null; + } + else{ + $this->instance["trans_num"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/BasicModel.php b/fannie/classlib2.0/data/models/BasicModel.php new file mode 100644 index 000000000..12ba1fff9 --- /dev/null +++ b/fannie/classlib2.0/data/models/BasicModel.php @@ -0,0 +1,807 @@ + array('default'=>'DECIMAL(10,2)','mssql'=>'MONEY') + ); + + /** + Database connection + */ + protected $connection = False; + public function db(){ return $this->connection; } + + /** + List of column names => values + */ + protected $instance = array(); + + /** + Name of preferred database + */ + protected $preferred_db = ''; + public function preferred_db(){ return $this->preferred_db; } + + /** + Constructor + @param $con a SQLManager object + */ + public function __construct($con){ + $this->connection = $con; + if (empty($this->unique)){ + foreach($this->columns as $name=>$definition){ + if (isset($definition['primary_key']) && $definition['primary_key']) + $this->unique[] = $name; + } + } + } + + /** + Create the table + @return boolean + */ + public function create(){ + if ($this->connection->table_exists($this->name)) + return True; + + $dbms = $this->connection->dbms_name(); + $pkey = array(); + $indexes = array(); + $inc = False; + $sql = 'CREATE TABLE '.$this->name.' ('; + foreach($this->columns as $cname => $definition){ + if (!isset($definition['type'])) return False; + + $sql .= $this->connection->identifier_escape($cname); + $sql .= ' '; + + $type = $definition['type']; + if (isset($this->meta_types[strtoupper($type)])) + $type = $this->get_meta($type, $dbms); + $sql .= $type; + + if (isset($definition['increment']) && $definition['increment']){ + if ($dbms == 'mssql') + $sql .= ' IDENTITY (1, 1) NOT NULL'; + else + $sql .= ' NOT NULL AUTO_INCREMENT'; + $inc = True; + } + elseif (isset($definition['default']) && $definition['default']){ + if ($dbms == 'mssql') + $sql .= ' '.$definition['default']; + else + $sql .= ' DEFAULT '.$definition['default']; + } + + $sql .= ','; + + if (isset($definition['primary_key']) && $definition['primary_key']) + $pkey[] = $cname; + elseif (isset($definition['index']) && $definition['index']) + $indexes[] = $cname; + } + + if (!empty($pkey)){ + $sql .= ' PRIMARY KEY ('; + foreach($pkey as $col){ + $sql .= $this->connection->identifier_escape($col).','; + } + $sql = substr($sql,0,strlen($sql)-1).'),'; + } + if (!empty($indexes)){ + foreach($indexes as $index){ + $sql .= ' INDEX ('; + $sql .= $this->connection->identifier_escape($index); + $sql .= '),'; + } + } + + $sql = rtrim($sql,','); + $sql .= ')'; + if ($inc && $dbms == 'mssql') + $sql .= ' ON [PRIMARY]'; + + $result = $this->connection->exec_statement($sql); + return ($result === False) ? False : True; + + // create() + } + + /** + Populate instance with database values + Requires a uniqueness constraint. Assign + those columns before calling load(). + @return boolean + */ + public function load(){ + if (empty($this->unique)) return False; + foreach($this->unique as $column){ + if (!isset($this->instance[$column])) + return False; + } + + $sql = 'SELECT '; + foreach($this->columns as $name => $definition){ + $sql .= $this->connection->identifier_escape($name).','; + } + $sql = substr($sql,0,strlen($sql)-1); + + $sql .= ' FROM '.$this->name.' WHERE 1=1'; + $args = array(); + foreach($this->unique as $name){ + $sql .= ' AND '.$this->connection->identifier_escape($name).' = ?'; + $args[] = $this->instance[$name]; + } + + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, $args); + + if ($this->connection->num_rows($result) > 0){ + $row = $this->connection->fetch_row($result); + foreach($this->columns as $name => $definition){ + if (!isset($row[$name])) continue; + $this->instance[$name] = $row[$name]; + } + return True; + } + else + return False; + } + + /** + Clear object values. + */ + public function reset(){ + $this->instance = array(); + } + + public function get_columns(){ + return $this->columns; + } + + public function get_name(){ + return $this->name; + } + + /** + Find records that match this instance + @param $sort array of columns to sort by + @return an array of controller objects + */ + public function find($sort=''){ + if (!is_array($sort)) $sort = array($sort); + + $sql = 'SELECT '; + foreach($this->columns as $name => $definition){ + $sql .= $this->connection->identifier_escape($name).','; + } + $sql = substr($sql,0,strlen($sql)-1); + + $sql .= ' FROM '.$this->name.' WHERE 1=1'; + + $args = array(); + foreach($this->instance as $name => $value){ + $sql .= ' AND '.$this->connection->identifier_escape($name).' = ?'; + $args[] = $value; + } + + $order_by = ''; + foreach($sort as $name){ + if (!isset($this->columns[$name])) continue; + $order_by .= $this->connection->identifier_escape($name).','; + } + if ($order_by !== ''){ + $order_by = substr($order_by,0,strlen($order_by)-1); + $sql .= ' ORDER BY '.$order_by; + } + + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, $args); + + $ret = array(); + $my_type = get_class($this); + while($row = $this->connection->fetch_row($result)){ + $obj = new $my_type($this->connection); + foreach($this->columns as $name => $definition){ + if (!isset($row[$name])) continue; + $obj->$name($row[$name]); + } + $ret[] = $obj; + } + return $ret; + } + + /** + Delete record from the database. + Requires a uniqueness constraint. Assign + those columns before calling delete(). + @return boolean + */ + public function delete(){ + if (empty($this->unique)) return False; + foreach($this->unique as $column){ + if (!isset($this->instance[$column])) + return False; + } + + $sql = 'DELETE FROM '.$this->name.' WHERE 1=1'; + $args = array(); + foreach($this->unique as $name){ + $sql .= ' AND '.$this->connection->identifier_escape($name).' = ?'; + $args[] = $this->instance[$name]; + } + + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, $args); + return ($result === False) ? False : True; + } + + /** + Get database-specific type + @param $type a "meta-type" with different underlying type + depending on the DB + @param $dbms string DB name + @return string + */ + protected function get_meta($type, $dbms){ + if (!isset($this->meta_types[strtoupper($type)])) return $type; + $meta = $this->meta_types[strtoupper($type)]; + return isset($meta[$dbms]) ? $meta[$dbms] : $meta['default']; + } + + /** + Save current record. If a uniqueness constraint + is defined it will INSERT or UPDATE appropriately. + @return SQL result object or boolean false + */ + public function save(){ + $new_record = False; + // do we have values to look up? + foreach($this->unique as $column){ + if (!isset($this->instance[$column])) + $new_record = True; + } + if (count($this->unique) == 0) + $new_record = True; + + if (!$new_record){ + // see if matching record exists + $check = 'SELECT * FROM '.$this->connection->identifier_escape($this->name) + .' WHERE 1=1'; + $args = array(); + foreach($this->unique as $column){ + $check .= ' AND '.$this->connection->identifier_escape($column).' = ?'; + $args[] = $this->instance[$column]; + } + $prep = $this->connection->prepare_statement($check); + $result = $this->connection->exec_statement($prep, $args); + if ($this->connection->num_rows($result)==0) + $new_record = True; + } + + if ($new_record) + return $this->insert_record(); + else + return $this->update_record(); + } + + /** + Helper. Build & execute insert query + @return SQL result object or boolean false + */ + protected function insert_record(){ + $sql = 'INSERT INTO '.$this->connection->identifier_escape($this->name); + $cols = '('; + $vals = '('; + $args = array(); + foreach($this->instance as $column => $value){ + if (isset($this->columns[$column]['increment']) && $this->columns[$column]['increment']) + continue; + $cols .= $this->connection->identifier_escape($column).','; + $vals .= '?,'; + $args[] = $value; + } + $cols = substr($cols,0,strlen($cols)-1).')'; + $vals = substr($vals,0,strlen($vals)-1).')'; + $sql .= ' '.$cols.' VALUES '.$vals; + + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, $args); + return $result; + } + + /** + Helper. Build & execute update query + @return SQL result object or boolean false + */ + protected function update_record(){ + $sql = 'UPDATE '.$this->connection->identifier_escape($this->name); + $sets = ''; + $where = '1=1'; + $set_args = array(); + $where_args = array(); + foreach($this->instance as $column => $value){ + if (in_array($column, $this->unique)){ + $where .= ' AND '.$this->connection->identifier_escape($column).' = ?'; + $where_args[] = $value; + } + else { + if (isset($this->columns[$column]['increment']) && $this->columns[$column]['increment']) + continue; + $sets .= ' '.$this->connection->identifier_escape($column).' = ?,'; + $set_args[] = $value; + } + } + $sets = substr($sets,0,strlen($sets)-1); + + $sql .= ' SET '.$sets.' WHERE '.$where; + $all_args = $set_args; + foreach($where_args as $arg) $all_args[] = $arg; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, $all_args); + return $result; + } + + public function push_to_lanes(){ + global $FANNIE_LANES; + // load complete record + if (!$this->load()) return False; + + $current = $this->connection; + // save to each lane + foreach($FANNIE_LANES as $lane){ + $sql = new SQLManager($lane['host'],$lane['type'],$lane['op'], + $lane['user'],$lane['pw']); + if (!is_object($sql) || $sql->connections[$lane['op']] === False) + continue; + $this->connection = $sql; + $this->save(); + } + $this->connection = $current; + return True; + } + + public function delete_from_lanes(){ + global $FANNIE_LANES; + // load complete record + if (!$this->load()) return False; + + $current = $this->connection; + // save to each lane + foreach($FANNIE_LANES as $lane){ + $sql = new SQLManager($lane['host'],$lane['type'],$lane['op'], + $lane['user'],$lane['pw']); + if (!is_object($sql) || $sql->connections[$lane['op']] === False) + continue; + $this->connection = $sql; + $this->delete(); + } + $this->connection = $current; + return True; + } + + /** check for potential changes **/ + const NORMALIZE_MODE_CHECK = 1; + /** apply changes **/ + const NORMALIZE_MODE_APPLY = 2; + + /** + Compare existing table to definition + Add any columns that are missing from the table structure + Extra columns that are present in the table but not in the + controlelr class are left as-is. + @param $db_name name of the database containing the table + @param $mode the normalization mode. See above. + @return number of columns added or False on failure + */ + public function normalize($db_name, $mode=BasicModel::NORMALIZE_MODE_CHECK, $doCreate=False){ + if ($mode != BasicModel::NORMALIZE_MODE_CHECK && $mode != BasicModel::NORMALIZE_MODE_APPLY){ + echo "Error: Unknown mode ($mode)\n"; + return False; + } + echo "==========================================\n"; + printf("%s table %s\n", + ($mode==BasicModel::NORMALIZE_MODE_CHECK)?"Checking":"Updating", + "{$db_name}.{$this->name}" + ); + echo "==========================================\n"; + $this->connection = FannieDB::get($db_name); + if (!$this->connection->table_exists($this->name)){ + if ($mode == BasicModel::NORMALIZE_MODE_CHECK) { + echo "Table {$this->name} not found!\n"; + echo "==========================================\n"; + printf("%s table %s\n","Check complete. Need to create", $this->name); + echo "==========================================\n\n"; + return 999; + //return False; + } + else if ($mode == BasicModel::NORMALIZE_MODE_APPLY){ + echo "==========================================\n"; + if ($doCreate) { + $cResult = $this->create(); + printf("Update complete. Creation of table %s %s\n",$this->name, ($cResult)?"OK":"failed"); + } + else { + printf("Update complete. Creation of table %s %s\n",$this->name, ($doCreate)?"OK":"not supported"); + } + echo "==========================================\n\n"; + return True; + } + } + $current = $this->connection->table_definition($this->name); + + $new_columns = array(); + $new_indexes = array(); + $unknown = array(); + foreach ($this->columns as $col_name => $defintion){ + if (!in_array($col_name,array_keys($current))){ + $new_columns[] = $col_name; + } + } + foreach($current as $col_name => $type){ + if (!in_array($col_name,array_keys($this->columns))){ + $unknown[] = $col_name; + echo "Ignoring unknown column: $col_name in current definition (delete manually if desired)\n"; + } + } + $our_columns = array_keys($this->columns); + $their_columns = array_keys($current); + for($i=0;$iname.' ADD COLUMN ' + .$this->connection->identifier_escape($our_columns[$i]).' ' + .$this->get_meta($this->columns[$our_columns[$i]]['type'], + $this->connection->dbms_name()) + .' AFTER '.$this->connection->identifier_escape($their_col); + break; + } + elseif (isset($our_columns[$i+1]) && $our_columns[$i+1] == $their_col){ + $sql = 'ALTER TABLE '.$this->name.' ADD COLUMN ' + .$this->connection->identifier_escape($our_columns[$i]).' ' + .$this->get_meta($this->columns[$our_columns[$i]]['type'], + $this->connection->dbms_name()) + .' BEFORE '.$this->connection->identifier_escape($their_col); + break; + } + if (isset($our_columns[$i-1]) && in_array($our_columns[$i-1],$new_columns)){ + $sql = 'ALTER TABLE '.$this->name.' ADD COLUMN ' + .$this->connection->identifier_escape($our_columns[$i]).' ' + .$this->get_meta($this->columns[$our_columns[$i]]['type'], + $this->connection->dbms_name()) + .' AFTER '.$this->connection->identifier_escape($our_columns[$i-1]); + break; + } + } + if ($sql !== '') { + if ($mode == BasicModel::NORMALIZE_MODE_CHECK){ + echo "\tSQL Details: $sql\n"; + } + else if ($mode == BasicModel::NORMALIZE_MODE_APPLY){ + $this->connection->query($sql); + } + } + + if ($sql === ''){ + echo "\tError: could not find context for {$our_columns[$i]}\n"; + } + + // If the new column is indexed create the index. + if ($sql !== '' && isset($this->columns[$our_columns[$i]]['index']) + && $this->columns[$our_columns[$i]]['index']){ + $new_indexes[]=$our_columns[$i]; + $index_sql = 'ALTER TABLE '.$this->name.' ADD INDEX ' + .$this->connection->identifier_escape($our_columns[$i]) + .' ('.$this->connection->identifier_escape($our_columns[$i]).')'; + if ($mode == BasicModel::NORMALIZE_MODE_CHECK){ + echo "Need to add index to column: {$our_columns[$i]}\n"; + echo "\tSQL Details: $index_sql\n"; + } + else if ($mode == BasicModel::NORMALIZE_MODE_APPLY){ + echo "Adding index to column: {$our_columns[$i]}\n"; + $this->connection->query($index_sql); + } + } + } + echo "==========================================\n"; + printf("%s %d column%s %d index%s.\n", + ($mode==BasicModel::NORMALIZE_MODE_CHECK)?"Check complete. Need to add":"Update complete. Added", + count($new_columns), (count($new_columns)!=1)?"s":"", + count($new_indexes), (count($new_indexes)!=1)?"es":"" + ); + echo "==========================================\n\n"; + + // EL: Why also count($unknown)? + // Calling routines assume it means something has changed. + if (count($new_columns) > 0) + return count($new_columns); + else if (count($unknown) > 0) + return -1*count($unknown); + return 0; + + // normalize() + } + + /** + Rewrite the given file to create accessor + functions for all of its columns + */ + public function generate($filename){ + $start_marker = '/* START ACCESSOR FUNCTIONS */'; + $end_marker = '/* END ACCESSOR FUNCTIONS */'; + $before = ''; + $after = ''; + $foundStart = False; + $foundEnd = False; + $fp = fopen($filename,'r'); + while(!feof($fp)){ + $line = fgets($fp); + if (!$foundStart){ + $before .= $line; + if (strstr($line,$start_marker)) + $foundStart = True; + } + elseif($foundStart && !$foundEnd){ + if (strstr($line, $end_marker)){ + $foundEnd = True; + $after .= $line; + } + } + elseif($foundStart && $foundEnd) + $after .= $line; + } + fclose($fp); + + if (!$foundStart || !$foundEnd){ + echo "Error: could not locate code block\n"; + if (!$foundStart) echo "Missing start\n"; + if (!$foundEnd) echo "Missing end\n"; + return False; + } + + $fp = fopen($filename,'w'); + fwrite($fp,$before); + foreach($this->columns as $name => $definition){ + fwrite($fp,"\n"); + fwrite($fp,"\tpublic function ".$name."(){\n"); + fwrite($fp,"\t\tif(func_num_args() == 0){\n"); + fwrite($fp,"\t\t\t".'if(isset($this->instance["'.$name.'"]))'."\n"); + fwrite($fp,"\t\t\t\t".'return $this->instance["'.$name.'"];'."\n"); + fwrite($fp,"\t\t\t".'elseif(isset($this->columns["'.$name.'"]["default"]))'."\n"); + fwrite($fp,"\t\t\t\t".'return $this->columns["'.$name.'"]["default"];'."\n"); + fwrite($fp,"\t\t\telse return null;\n"); + fwrite($fp,"\t\t}\n"); + fwrite($fp,"\t\telse{\n"); + fwrite($fp,"\t\t\t".'$this->instance["'.$name.'"] = func_get_arg(0);'."\n"); + fwrite($fp,"\t\t}\n"); + fwrite($fp,"\t}\n"); + } + fwrite($fp,$after); + fclose($fp); + + return True; + // generate() + } + + function new_model($name){ + $fp = fopen($name.'.php','w'); + fwrite($fp, chr(60)."?php +/******************************************************************************* + + Copyright ".date("Y")." Whole Foods Co-op + + This file is part of Fannie. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class $name +*/ +class $name extends BasicModel ".chr(123)."\n"); + fwrite($fp,"\n"); + fwrite($fp,"\tprotected \$name = \"".substr($name,0,strlen($name)-5)."\";\n"); + fwrite($fp,"\n"); + fwrite($fp,"\tprotected \$columns = array(\n\t);\n"); + fwrite($fp,"\n"); + fwrite($fp,"\t/* START ACCESSOR FUNCTIONS */\n"); + fwrite($fp,"\t/* END ACCESSOR FUNCTIONS */\n"); + fwrite($fp,chr(125)."\n?".chr(62)."\n"); + fclose($fp); + + // new_model() + } + + function get_models(){ + /** + Experiment using lambdas. I was curious + if I could do recursion without having + a named function. + */ + $search = function($path) use (&$search){ + if (is_file($path) && substr($path,'-4')=='.php'){ + include_once($path); + $class = basename(substr($path,0,strlen($path)-4)); + if (class_exists($class) && is_subclass_of($class, 'BasicModel')) + return array($class); + } + elseif(is_dir($path)){ + $dh = opendir($path); + $ret = array(); + while( ($file=readdir($dh)) !== False){ + if ($file == '.' || $file == '..') + continue; + $ret = array_merge($ret, $search($path.'/'.$file)); + } + return $ret; + } + return array(); + }; + $models = $search(dirname(__FILE__)); + return $models; + } +} + +if (php_sapi_name() === 'cli' && basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + + $obj = new BasicModel(null); + + /* Argument signatures, to php, where BasicModel.php is the first: + * 2 args: Generate Accessor Functions: php BasicModel.php \n"; + * 3 args: Create new Model: php BasicModel.php --new \n"; + * 4 args: Update Table Structure: php BasicModel.php --update \n"; + */ + if (($argc < 2 || $argc > 4) || ($argc == 3 && $argv[1] != "--new") || ($argc == 4 && $argv[1] != '--update')){ + echo "Generate Accessor Functions: php BasicModel.php \n"; + echo "Create new Model: php BasicModel.php --new \n"; + echo "Update Table Structure: php BasicModel.php --update \n"; + exit; + } + + include(dirname(__FILE__).'/../../../config.php'); + include(dirname(__FILE__).'/../../FannieAPI.php'); + + // Create new Model + if ($argc == 3){ + $modelname = $argv[2]; + if (substr($modelname,-4) == '.php') + $modelname = substr($modelname,0,strlen($modelname)-4); + if (substr($modelname,-5) != 'Model') + $modelname .= 'Model'; + echo "Generating Model '$modelname'\n"; + $obj = new BasicModel(null); + $obj->new_model($modelname); + exit; + } + + $classfile = $argv[1]; + if ($argc == 4) + $classfile = $argv[3]; + if (substr($classfile,-4) != '.php') + $classfile .= '.php'; + if (!file_exists($classfile)){ + echo "Error: file '$classfile' does not exist\n"; + exit; + } + + $class = pathinfo($classfile, PATHINFO_FILENAME); + include($classfile); + if (!class_exists($class)){ + echo "Error: class '$class' does not exist\n"; + exit; + } + + // A new object of the type named on the command line. + $obj = new $class(null); + if (!is_a($obj, 'BasicModel')){ + echo "Error: invalid class. Must be BasicModel\n"; + exit; + } + + // Generate accessor functions + if ($argc == 2){ + $try = $obj->generate($classfile); + if ($try) echo "Generated accessor functions\n"; + else echo "Failed to generate functions\n"; + } + // Update Table Structure + else if ($argc == 4){ + // Show what changes are needed but don't make them yet. + $try = $obj->normalize($argv[2],BasicModel::NORMALIZE_MODE_CHECK); + // If there was no error and there is anything to change, + // including creating the table. + // Was: If the table exists and there is anything to change + // get OK to change. + if ($try !== False && $try > 0){ + while(True){ + echo 'Apply Changes [Y/n]: '; + $in = rtrim(fgets(STDIN)); + if ($in === 'n' || $in === False || $in === '') { + echo "Goodbye.\n"; + break; + } + elseif($in ==='Y'){ + // THIS WILL APPLY PROPOSED CHANGES! + //EL Need to restore $this->name. See DTransactionsModel::normalize() + $obj->normalize($argv[2],BasicModel::NORMALIZE_MODE_APPLY, True); + break; + } + } + } + } + exit; +} diff --git a/fannie/classlib2.0/data/models/CustdataModel.php b/fannie/classlib2.0/data/models/CustdataModel.php new file mode 100644 index 000000000..7dbc0d5f6 --- /dev/null +++ b/fannie/classlib2.0/data/models/CustdataModel.php @@ -0,0 +1,468 @@ + array('type'=>'INT','index'=>True), + 'personNum' => array('type'=>'TINYINT'), + 'LastName' => array('type'=>'VARCHAR(30)','index'=>True), + 'FirstName' => array('type'=>'VARCHAR(30)'), + 'CashBack' => array('type'=>'MONEY'), + 'Balance' => array('type'=>'MONEY'), + 'Discount' => array('type'=>'SMALLINT'), + 'MemDiscountLimit' => array('type'=>'MONEY','default'=>0), + 'ChargeOk' => array('type'=>'TINYINT','default'=>1), + 'WriteChecks' => array('type'=>'TINYINT','default'=>1), + 'StoreCoupons' => array('type'=>'TINYINT','default'=>1), + 'Type' => array('type'=>'VARCHAR(10)','default'=>"'PC'"), + 'memType' => array('type'=>'TINYINT'), + 'staff' => array('type'=>'TINYINT','default'=>0), + 'SSI' => array('type'=>'TINYINT','default'=>0), + 'Purchases' => array('type'=>'MONEY','default'=>0), + 'NumberOfChecks' => array('type'=>'SMALLINT','default'=>0), + 'memCoupons' => array('type'=>'INT','default'=>1), + 'blueLine' => array('type'=>'VARCHAR(50)'), + 'Shown' => array('type'=>'TINYINT','default'=>1), + 'LastChange' => array('type'=>'TIMESTAMP'), + 'id' => array('type'=>'INT','primary_key'=>True,'default'=>0,'increment'=>True) + ); + + /** + Use this instead of primary key for identifying + records + */ + protected $unique = array('CardNo','personNum'); + + /* START ACCESSOR FUNCTIONS */ + + public function CardNo(){ + if(func_num_args() == 0){ + if(isset($this->instance["CardNo"])) + return $this->instance["CardNo"]; + elseif(isset($this->columns["CardNo"]["default"])) + return $this->columns["CardNo"]["default"]; + else return null; + } + else{ + $this->instance["CardNo"] = func_get_arg(0); + } + } + + public function personNum(){ + if(func_num_args() == 0){ + if(isset($this->instance["personNum"])) + return $this->instance["personNum"]; + elseif(isset($this->columns["personNum"]["default"])) + return $this->columns["personNum"]["default"]; + else return null; + } + else{ + $this->instance["personNum"] = func_get_arg(0); + } + } + + public function LastName(){ + if(func_num_args() == 0){ + if(isset($this->instance["LastName"])) + return $this->instance["LastName"]; + elseif(isset($this->columns["LastName"]["default"])) + return $this->columns["LastName"]["default"]; + else return null; + } + else{ + $this->instance["LastName"] = func_get_arg(0); + } + } + + public function FirstName(){ + if(func_num_args() == 0){ + if(isset($this->instance["FirstName"])) + return $this->instance["FirstName"]; + elseif(isset($this->columns["FirstName"]["default"])) + return $this->columns["FirstName"]["default"]; + else return null; + } + else{ + $this->instance["FirstName"] = func_get_arg(0); + } + } + + public function CashBack(){ + if(func_num_args() == 0){ + if(isset($this->instance["CashBack"])) + return $this->instance["CashBack"]; + elseif(isset($this->columns["CashBack"]["default"])) + return $this->columns["CashBack"]["default"]; + else return null; + } + else{ + $this->instance["CashBack"] = func_get_arg(0); + } + } + + public function Balance(){ + if(func_num_args() == 0){ + if(isset($this->instance["Balance"])) + return $this->instance["Balance"]; + elseif(isset($this->columns["Balance"]["default"])) + return $this->columns["Balance"]["default"]; + else return null; + } + else{ + $this->instance["Balance"] = func_get_arg(0); + } + } + + public function Discount(){ + if(func_num_args() == 0){ + if(isset($this->instance["Discount"])) + return $this->instance["Discount"]; + elseif(isset($this->columns["Discount"]["default"])) + return $this->columns["Discount"]["default"]; + else return null; + } + else{ + $this->instance["Discount"] = func_get_arg(0); + } + } + + public function MemDiscountLimit(){ + if(func_num_args() == 0){ + if(isset($this->instance["MemDiscountLimit"])) + return $this->instance["MemDiscountLimit"]; + elseif(isset($this->columns["MemDiscountLimit"]["default"])) + return $this->columns["MemDiscountLimit"]["default"]; + else return null; + } + else{ + $this->instance["MemDiscountLimit"] = func_get_arg(0); + } + } + + public function ChargeOk(){ + if(func_num_args() == 0){ + if(isset($this->instance["ChargeOk"])) + return $this->instance["ChargeOk"]; + elseif(isset($this->columns["ChargeOk"]["default"])) + return $this->columns["ChargeOk"]["default"]; + else return null; + } + else{ + $this->instance["ChargeOk"] = func_get_arg(0); + } + } + + public function WriteChecks(){ + if(func_num_args() == 0){ + if(isset($this->instance["WriteChecks"])) + return $this->instance["WriteChecks"]; + elseif(isset($this->columns["WriteChecks"]["default"])) + return $this->columns["WriteChecks"]["default"]; + else return null; + } + else{ + $this->instance["WriteChecks"] = func_get_arg(0); + } + } + + public function StoreCoupons(){ + if(func_num_args() == 0){ + if(isset($this->instance["StoreCoupons"])) + return $this->instance["StoreCoupons"]; + elseif(isset($this->columns["StoreCoupons"]["default"])) + return $this->columns["StoreCoupons"]["default"]; + else return null; + } + else{ + $this->instance["StoreCoupons"] = func_get_arg(0); + } + } + + public function Type(){ + if(func_num_args() == 0){ + if(isset($this->instance["Type"])) + return $this->instance["Type"]; + elseif(isset($this->columns["Type"]["default"])) + return $this->columns["Type"]["default"]; + else return null; + } + else{ + $this->instance["Type"] = func_get_arg(0); + } + } + + public function memType(){ + if(func_num_args() == 0){ + if(isset($this->instance["memType"])) + return $this->instance["memType"]; + elseif(isset($this->columns["memType"]["default"])) + return $this->columns["memType"]["default"]; + else return null; + } + else{ + $this->instance["memType"] = func_get_arg(0); + } + } + + public function staff(){ + if(func_num_args() == 0){ + if(isset($this->instance["staff"])) + return $this->instance["staff"]; + elseif(isset($this->columns["staff"]["default"])) + return $this->columns["staff"]["default"]; + else return null; + } + else{ + $this->instance["staff"] = func_get_arg(0); + } + } + + public function SSI(){ + if(func_num_args() == 0){ + if(isset($this->instance["SSI"])) + return $this->instance["SSI"]; + elseif(isset($this->columns["SSI"]["default"])) + return $this->columns["SSI"]["default"]; + else return null; + } + else{ + $this->instance["SSI"] = func_get_arg(0); + } + } + + public function Purchases(){ + if(func_num_args() == 0){ + if(isset($this->instance["Purchases"])) + return $this->instance["Purchases"]; + elseif(isset($this->columns["Purchases"]["default"])) + return $this->columns["Purchases"]["default"]; + else return null; + } + else{ + $this->instance["Purchases"] = func_get_arg(0); + } + } + + public function NumberOfChecks(){ + if(func_num_args() == 0){ + if(isset($this->instance["NumberOfChecks"])) + return $this->instance["NumberOfChecks"]; + elseif(isset($this->columns["NumberOfChecks"]["default"])) + return $this->columns["NumberOfChecks"]["default"]; + else return null; + } + else{ + $this->instance["NumberOfChecks"] = func_get_arg(0); + } + } + + public function memCoupons(){ + if(func_num_args() == 0){ + if(isset($this->instance["memCoupons"])) + return $this->instance["memCoupons"]; + elseif(isset($this->columns["memCoupons"]["default"])) + return $this->columns["memCoupons"]["default"]; + else return null; + } + else{ + $this->instance["memCoupons"] = func_get_arg(0); + } + } + + public function blueLine(){ + if(func_num_args() == 0){ + if(isset($this->instance["blueLine"])) + return $this->instance["blueLine"]; + elseif(isset($this->columns["blueLine"]["default"])) + return $this->columns["blueLine"]["default"]; + else return null; + } + else{ + $this->instance["blueLine"] = func_get_arg(0); + } + } + + public function Shown(){ + if(func_num_args() == 0){ + if(isset($this->instance["Shown"])) + return $this->instance["Shown"]; + elseif(isset($this->columns["Shown"]["default"])) + return $this->columns["Shown"]["default"]; + else return null; + } + else{ + $this->instance["Shown"] = func_get_arg(0); + } + } + + public function LastChange(){ + if(func_num_args() == 0){ + if(isset($this->instance["LastChange"])) + return $this->instance["LastChange"]; + elseif(isset($this->columns["LastChange"]["default"])) + return $this->columns["LastChange"]["default"]; + else return null; + } + else{ + $this->instance["LastChange"] = func_get_arg(0); + } + } + + public function id(){ + if(func_num_args() == 0){ + if(isset($this->instance["id"])) + return $this->instance["id"]; + elseif(isset($this->columns["id"]["default"])) + return $this->columns["id"]["default"]; + else return null; + } + else{ + $this->instance["id"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ + + /** + 5Jul13 static stuff is legacy functionality + that predates the BasicModel class. + Can be removed when no calls to these functions + remain in Fannie. + */ + + /** + Update custdata record(s) for an account + @param $card_no the member number + @param $fields array of column names and values + + The values for personNum, LastName, and FirstName + should be arrays. + */ + public static function update($card_no,$fields){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $ret = True; + + /** deal with number of names first */ + if (isset($fields['personNum']) && is_array($fields['personNum'])){ + + /** delete secondary members */ + $delQ = "DELETE FROM custdata WHERE personNum > 1 AND CardNo=?"; + $delP = $dbc->prepare_statement($delQ); + $delR = $dbc->exec_statement($delP,array($card_no)); + + /** create records for secondary members + based on the primary member */ + $insQ = "INSERT INTO custdata (CardNo,personNum,LastName,FirstName, + CashBack,Balance,Discount,MemDiscountLimit,ChargeOk, + WriteChecks,StoreCoupons,Type,memType,staff,SSI,Purchases, + NumberOfChecks,memCoupons,blueLine,Shown) + SELECT CardNo,?,?,?, + CashBack,Balance,Discount,MemDiscountLimit,ChargeOk, + WriteChecks,StoreCoupons,Type,memType,staff,SSI,Purchases, + NumberOfChecks,memCoupons,?,Shown + FROM custdata WHERE personNum=1 AND CardNo=?"; + $insP = $dbc->prepare_statement($insQ); + for($i=0;$iprepare_statement($upQ); + $args = array($ln,$fn,$card_no." ".$ln,$card_no); + $upR = $dbc->exec_statement($upP,$args); + if ($upR === False) $ret = False; + } + else { + /** create/re-create secondary member */ + $insR = $dbc->exec_statement($insP, + array($pn,$ln,$fn,$card_no." ".$ln,$card_no)); + if ($insR === False) $ret = False; + } + } + } + + /** update all other fields for the account + The switch statement is to filter out + bad input */ + $updateQ = "UPDATE custdata SET "; + $updateArgs = array(); + foreach($fields as $name => $value){ + switch($name){ + case 'CashBack': + case 'Balance': + case 'Discount': + case 'MemDiscountLimit': + case 'ChargeOk': + case 'WriteChecks': + case 'StoreCoupons': + case 'Type': + case 'memType': + case 'staff': + case 'SSI': + case 'Purchases': + case 'NumberOfChecks': + case 'memCoupons': + case 'Shown': + if ($name === 0 || $name === True) + break; // switch does loose comparison... + $updateQ .= $name." = ?,"; + $updateArgs[] = $value; + break; + default: + break; + } + } + + /** if only name fields were provided, there's + nothing to do here */ + if ($updateQ != "UPDATE custdata SET "){ + $updateQ = rtrim($updateQ,","); + $updateQ .= " WHERE CardNo=?"; + $updateArgs[] = $card_no; + + $updateP = $dbc->prepare_statement($updateQ); + $updateR = $dbc->exec_statement($updateP,$updateArgs); + if ($updateR === False) $ret = False; + } + + return $ret; + } +} + +?> diff --git a/fannie/classlib2.0/data/models/DTransactionsModel.php b/fannie/classlib2.0/data/models/DTransactionsModel.php new file mode 100644 index 000000000..58b8c6c83 --- /dev/null +++ b/fannie/classlib2.0/data/models/DTransactionsModel.php @@ -0,0 +1,800 @@ + array('type'=>'DATETIME','index'=>True), + 'register_no' => array('type'=>'SMALLINT'), + 'emp_no' => array('type'=>'SMALLINT'), + 'trans_no' => array('type'=>'INT'), + 'upc' => array('type'=>'VARCHAR(13)','index'=>True), + 'description' => array('type'=>'VARCHAR(30)'), + 'trans_type' => array('type'=>'VARCHAR(1)','index'=>True), + 'trans_subtype' => array('type'=>'VARCHAR(2)'), + 'trans_status' => array('type'=>'VARCHAR(1)'), + 'department' => array('type'=>'SMALLINT','index'=>True), + 'quantity' => array('type'=>'DOUBLE'), + 'scale' => array('type'=>'TINYINT','default'=>0.00), + 'cost' => array('type'=>'MONEY'), + 'unitPrice' => array('type'=>'MONEY'), + 'total' => array('type'=>'MONEY'), + 'regPrice' => array('type'=>'MONEY'), + 'tax' => array('type'=>'SMALLINT'), + 'foodstamp' => array('type'=>'TINYINT'), + 'discount' => array('type'=>'MONEY'), + 'memDiscount' => array('type'=>'MONEY'), + 'discountable' => array('type'=>'TINYINT'), + 'discounttype' => array('type'=>'TINYINT'), + 'voided' => array('type'=>'TINYINT'), + 'percentDiscount'=> array('type'=>'TINYINT'), + 'ItemQtty' => array('type'=>'DOUBLE'), + 'volDiscType' => array('type'=>'TINYINT'), + 'volume' => array('type'=>'TINYINT'), + 'VolSpecial' => array('type'=>'MONEY'), + 'mixMatch' => array('type'=>'VARCHAR(13)'), + 'matched' => array('type'=>'SMALLINT'), + 'memType' => array('type'=>'TINYINT'), + 'staff' => array('type'=>'TINYINT'), + 'numflag' => array('type'=>'INT','default'=>0), + 'charflag' => array('type'=>'INT','default'=>''), + 'card_no' => array('type'=>'INT','index'=>True), + 'trans_id' => array('type'=>'TINYINT') + ); + + /** + Overrides (extends) the base function to check multiple tables that should + all have identical or similar structure + after doing a normal run of the base. + */ + public function normalize($db_name, $mode=BasicModel::NORMALIZE_MODE_CHECK, $doCreate=False){ + global $FANNIE_ARCHIVE_DB, $FANNIE_ARCHIVE_METHOD, $FANNIE_TRANS_DB; + $trans_adds = 0; + $log_adds = 0; + + //EL If this isn't initialized it is "dlog_15" on the 2nd, preview_only=False run + $this->name = 'dtransactions'; + // check self first + $chk = parent::normalize($db_name, $mode, $doCreate); + if ($chk !== False) $trans_adds += $chk; + + $this->name = 'transarchive'; + $chk = parent::normalize($db_name, $mode, $doCreate); + if ($chk !== False) $trans_adds += $chk; + + $this->name = 'suspended'; + $chk = parent::normalize($db_name, $mode, $doCreate); + if ($chk !== False) $trans_adds += $chk; + + $this->connection = FannieDB::get($FANNIE_ARCHIVE_DB); + if ($FANNIE_ARCHIVE_METHOD == 'partitions'){ + $this->name = 'bigArchive'; + $chk = parent::normalize($FANNIE_ARCHIVE_DB, $mode, $doCreate); + if ($chk !== False) $trans_adds += $chk; + } + else { + $pattern = '/^transArchive\d\d\d\d\d\d$/'; + $tables = $this->connection->get_tables($FANNIE_ARCHIVE_DB); + foreach($tables as $t){ + if (preg_match($pattern,$t)){ + $this->name = $t; + $chk = parent::normalize($FANNIE_ARCHIVE_DB, $mode, $doCreate); + if ($chk !== False) $trans_adds += $chk; + } + } + } + + // move on to dlog views. + // dlog_15 is used for detection since it's the only + // actual table. + // In the model the datestamp field datetime is swapped out for tdate + // and trans_num is tacked on the end + $this->connection = FannieDB::get($FANNIE_TRANS_DB); + $this->name = 'dlog_15'; + unset($this->columns['datetime']); + $tdate = array('tdate'=>array('type'=>'datetime','index'=>True)); + $trans_num = array('trans_num'=>array('type'=>'VARCHAR(25)')); + $this->columns = $tdate + $this->columns + $trans_num; + $chk = parent::normalize($db_name, $mode, $doCreate); + if ($chk !== False) $log_adds += $chk; + + // rebuild views + // use BasicModel::normalize in check mode to detect missing columns + // the ALTER queries it suggests won't work but the return value is + // still correct. If it returns > 0, the view needs to be rebuilt + $this->name = 'dlog'; + ob_start(); + $chk = parent::normalize($db_name, BasicModel::NORMALIZE_MODE_CHECK); + ob_end_clean(); + if ($chk !== False && $chk > 0){ + $log_adds += $chk; + $this->normalize_log('dlog','dtransactions',$mode); + } + $this->name = 'dlog_90_view'; + ob_start(); + $chk = parent::normalize($db_name, BasicModel::NORMALIZE_MODE_CHECK); + ob_end_clean(); + if ($chk !== False && $chk > 0){ + $log_adds += $chk; + $this->normalize_log('dlog_90_view','transarchive',$mode); + } + + $this->connection = FannieDB::get($FANNIE_ARCHIVE_DB); + if ($FANNIE_ARCHIVE_METHOD == 'partitions'){ + $this->name = 'dlogBig'; + ob_start(); + $chk = parent::normalize($FANNIE_ARCHIVE_DB, BasicModel::NORMALIZE_MODE_CHECK); + ob_end_clean(); + if ($chk !== False && $chk > 0){ + $log_adds += $chk; + $this->normalize_log('dlogBig','bigArchive',$mode); + } + } + else { + $pattern = '/^dlog\d\d\d\d\d\d$/'; + $tables = $this->connection->get_tables($FANNIE_ARCHIVE_DB); + foreach($tables as $t){ + if (preg_match($pattern,$t)){ + $this->name = $t; + ob_start(); + $chk = parent::normalize($FANNIE_ARCHIVE_DB, BasicModel::NORMALIZE_MODE_CHECK); + ob_end_clean(); + if ($chk !== False && $chk > 0){ + $log_adds += $chk; + $this->normalize_log($t, 'transArchive'.substr($t,4),$mode); + } + } + } + } + + // EL: Need to restore $this-columns to original values. + $this->connection = FannieDB::get($FANNIE_TRANS_DB); + unset($this->columns['tdate']); + unset($this->columns['trans_num']); + $datetime = array('datetime'=>array('type'=>'datetime','index'=>True)); + $this->columns = $datetime + $this->columns; + + return $log_adds + $trans_adds; + + // normalize() + } + + /** + Rebuild dlog style views + @param $view_name name of the view + @param $table_name underlying table + @param $mode the normalization mode. See BasicModel. + + The view changes the column "datetime" to "tdate" and + adds a "trans_num" column. Otherwise it includes all + the columns from dtransactions. Columns "trans_type" + and "trans_subtype" still have translations to fix + older records but everyting else passes through as-is. + */ + private function normalize_log($view_name, $table_name, $mode=BasicModel::NORMALIZE_MODE_CHECK){ + printf("%s view: %s", + ($mode==BasicModel::NORMALIZE_MODE_CHECK)?"Would recreate":"Recreating", + "$view_name (of table $table_name)\n" + ); + if ($this->connection->table_exists($view_name)){ + $sql = 'DROP VIEW '.$this->connection->identifier_escape($view_name); + if ($mode == BasicModel::NORMALIZE_MODE_APPLY) + $this->connection->query($sql); + } + + $sql = 'CREATE VIEW '.$this->connection->identifier_escape($view_name).' AS ' + .'SELECT ' + .$this->connection->identifier_escape('datetime').' AS ' + .$this->connection->identifier_escape('tdate').','; + $c = $this->connection; // for more concise code below + foreach($this->columns as $name => $definition){ + if ($name == 'datetime') continue; + elseif ($name == 'tdate') continue; + elseif ($name == 'trans_num'){ + // create trans_num field + $sql .= $c->concat( + $c->convert($c->identifier_escape('emp_no'),'char'), + "'-'", + $c->convert($c->identifier_escape('register_no'),'char'), + "'-'", + $c->convert($c->identifier_escape('trans_no'),'char'), + '' + ).' as trans_num'; + } + elseif($name == 'trans_type'){ + // type conversion for old records. Newer coupon & discount + // records should have correct trans_type when initially created + $sql .= "CASE WHEN (trans_subtype IN ('CP','IC') OR upc like('%000000052')) then 'T' + WHEN upc = 'DISCOUNT' then 'S' else trans_type end as trans_type,\n"; + } + elseif($name == 'trans_subtype'){ + // type conversion for old records. Probably WFC quirk that can + // eventually go away entirely + $sql .= "CASE WHEN upc = 'MAD Coupon' THEN 'MA' + WHEN upc like('%00000000052') THEN 'RR' ELSE trans_subtype END as trans_subtype,\n"; + } + else { + $sql .= $c->identifier_escape($name).",\n"; + } + } + $sql .= ' FROM '.$c->identifier_escape($table_name) + .' WHERE '.$c->identifier_escape('trans_status') + ." NOT IN ('D','X','Z') AND emp_no <> 9999 + AND register_no <> 99"; + if ($mode == BasicModel::NORMALIZE_MODE_APPLY) + $this->connection->query($sql); + + // normalize_log() + } + + static public function select_dlog($start, $end=False){ + return self::select_struct(True, $start, $end); + } + + static public function select_dtrans($start, $end=False){ + return self::select_struct(False, $start, $end); + } + + /* Return the SQL FROM parameter for a given date range + * i.e. the table, view or union of tables or views + * in which the transaction records can be found + * most efficiently. + */ + static private function select_struct($dlog, $start, $end=False){ + global $FANNIE_TRANS_DB, $FANNIE_ARCHIVE_DB, $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_METHOD; + $sep = ($FANNIE_SERVER_DBMS=='MSSQL')?'.dbo.':'.'; + + if ($end === False) $end = $start; + $start_ts = strtotime($start); + $end_ts = strtotime($end); + + // today. return dlog/dtrans + if (date('Y-m-d',$start_ts) == date('Y-m-d')) + return ($dlog) ? $FANNIE_TRANS_DB.$sep.'dlog' : $FANNIE_TRANS_DB.$sep.'dtransactions'; + + $days_ago_15 = mktime(0,0,0,date('n'),date('j')-15); + $days_ago_90 = mktime(0,0,0,date('n'),date('j')-90); + + // both in past 15 days => dlog_15. No dtrans equivalent + if ($start_ts > $days_ago_15 && $end_ts > $days_ago_15 && $dlog){ + return $FANNIE_TRANS_DB.$sep.'dlog_15'; + } + + // same month + if (date('Y',$start_ts) == date('Y',$end_ts) && date('n',$start_ts) == date('n',$end_ts)){ + if ($FANNIE_ARCHIVE_METHOD == 'partitions') + return ($dlog) ? $FANNIE_ARCHIVE_DB.$sep.'dlogBig' : $FANNIE_ARCHIVE_DB.$sep.'bigArchive'; + else { + $yyyymm = date('Ym',$start_ts); + return ($dlog) ? $FANNIE_ARCHIVE_DB.$sep.'dlog'.$yyyymm : $FANNIE_ARCHIVE_DB.$sep.'transArchive'.$yyyymm; + } + } + + // both in past 90 days => dlog_90_view/transarchive + if ($start_ts > $days_ago_90 && $end_ts > $days_ago_90){ + return ($dlog) ? $FANNIE_TRANS_DB.$sep.'dlog_90_view' : $FANNIE_TRANS_DB.$sep.'transarchive'; + } + + // + // All further options are in the archive tables + // + + // partitions are simple + if ($FANNIE_ARCHIVE_METHOD == 'partitions') + return ($dlog) ? $FANNIE_ARCHIVE_DB.$sep.'dlogBig' : $FANNIE_ARCHIVE_DB.$sep.'bigArchive'; + + // monthly archives. build a union containing both dates. + $endstamp = mktime(0,0,0,date('n',$end_ts),1,date('Y',$end_ts)); + $startstamp = mktime(0,0,0,date('n',$start_ts),1,date('Y',$start_ts)); + $union = '(select * from '; + while($startstamp <= $endstamp){ + $union .= $FANNIE_ARCHIVE_DB.$sep; + $union .= ($dlog) ? 'dlog' : 'transArchive'; + $union .= date('Ym',$startstamp); + $union .= ' union all select * from '; + $startstamp = mktime(0,0,0,date('n',$startstamp)+1,1,date('Y',$startstamp)); + } + $union = preg_replace('/ union all select \* from $/','',$union); + $union .= ')'; + return $union; + + // select_struct() + } + + /* START ACCESSOR FUNCTIONS */ + + public function datetime(){ + if(func_num_args() == 0){ + if(isset($this->instance["datetime"])) + return $this->instance["datetime"]; + elseif(isset($this->columns["datetime"]["default"])) + return $this->columns["datetime"]["default"]; + else return null; + } + else{ + $this->instance["datetime"] = func_get_arg(0); + } + } + + public function register_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["register_no"])) + return $this->instance["register_no"]; + elseif(isset($this->columns["register_no"]["default"])) + return $this->columns["register_no"]["default"]; + else return null; + } + else{ + $this->instance["register_no"] = func_get_arg(0); + } + } + + public function emp_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["emp_no"])) + return $this->instance["emp_no"]; + elseif(isset($this->columns["emp_no"]["default"])) + return $this->columns["emp_no"]["default"]; + else return null; + } + else{ + $this->instance["emp_no"] = func_get_arg(0); + } + } + + public function trans_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_no"])) + return $this->instance["trans_no"]; + elseif(isset($this->columns["trans_no"]["default"])) + return $this->columns["trans_no"]["default"]; + else return null; + } + else{ + $this->instance["trans_no"] = func_get_arg(0); + } + } + + public function upc(){ + if(func_num_args() == 0){ + if(isset($this->instance["upc"])) + return $this->instance["upc"]; + elseif(isset($this->columns["upc"]["default"])) + return $this->columns["upc"]["default"]; + else return null; + } + else{ + $this->instance["upc"] = func_get_arg(0); + } + } + + public function description(){ + if(func_num_args() == 0){ + if(isset($this->instance["description"])) + return $this->instance["description"]; + elseif(isset($this->columns["description"]["default"])) + return $this->columns["description"]["default"]; + else return null; + } + else{ + $this->instance["description"] = func_get_arg(0); + } + } + + public function trans_type(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_type"])) + return $this->instance["trans_type"]; + elseif(isset($this->columns["trans_type"]["default"])) + return $this->columns["trans_type"]["default"]; + else return null; + } + else{ + $this->instance["trans_type"] = func_get_arg(0); + } + } + + public function trans_subtype(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_subtype"])) + return $this->instance["trans_subtype"]; + elseif(isset($this->columns["trans_subtype"]["default"])) + return $this->columns["trans_subtype"]["default"]; + else return null; + } + else{ + $this->instance["trans_subtype"] = func_get_arg(0); + } + } + + public function trans_status(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_status"])) + return $this->instance["trans_status"]; + elseif(isset($this->columns["trans_status"]["default"])) + return $this->columns["trans_status"]["default"]; + else return null; + } + else{ + $this->instance["trans_status"] = func_get_arg(0); + } + } + + public function department(){ + if(func_num_args() == 0){ + if(isset($this->instance["department"])) + return $this->instance["department"]; + elseif(isset($this->columns["department"]["default"])) + return $this->columns["department"]["default"]; + else return null; + } + else{ + $this->instance["department"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + + public function scale(){ + if(func_num_args() == 0){ + if(isset($this->instance["scale"])) + return $this->instance["scale"]; + elseif(isset($this->columns["scale"]["default"])) + return $this->columns["scale"]["default"]; + else return null; + } + else{ + $this->instance["scale"] = func_get_arg(0); + } + } + + public function cost(){ + if(func_num_args() == 0){ + if(isset($this->instance["cost"])) + return $this->instance["cost"]; + elseif(isset($this->columns["cost"]["default"])) + return $this->columns["cost"]["default"]; + else return null; + } + else{ + $this->instance["cost"] = func_get_arg(0); + } + } + + public function unitPrice(){ + if(func_num_args() == 0){ + if(isset($this->instance["unitPrice"])) + return $this->instance["unitPrice"]; + elseif(isset($this->columns["unitPrice"]["default"])) + return $this->columns["unitPrice"]["default"]; + else return null; + } + else{ + $this->instance["unitPrice"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function regPrice(){ + if(func_num_args() == 0){ + if(isset($this->instance["regPrice"])) + return $this->instance["regPrice"]; + elseif(isset($this->columns["regPrice"]["default"])) + return $this->columns["regPrice"]["default"]; + else return null; + } + else{ + $this->instance["regPrice"] = func_get_arg(0); + } + } + + public function tax(){ + if(func_num_args() == 0){ + if(isset($this->instance["tax"])) + return $this->instance["tax"]; + elseif(isset($this->columns["tax"]["default"])) + return $this->columns["tax"]["default"]; + else return null; + } + else{ + $this->instance["tax"] = func_get_arg(0); + } + } + + public function foodstamp(){ + if(func_num_args() == 0){ + if(isset($this->instance["foodstamp"])) + return $this->instance["foodstamp"]; + elseif(isset($this->columns["foodstamp"]["default"])) + return $this->columns["foodstamp"]["default"]; + else return null; + } + else{ + $this->instance["foodstamp"] = func_get_arg(0); + } + } + + public function discount(){ + if(func_num_args() == 0){ + if(isset($this->instance["discount"])) + return $this->instance["discount"]; + elseif(isset($this->columns["discount"]["default"])) + return $this->columns["discount"]["default"]; + else return null; + } + else{ + $this->instance["discount"] = func_get_arg(0); + } + } + + public function memDiscount(){ + if(func_num_args() == 0){ + if(isset($this->instance["memDiscount"])) + return $this->instance["memDiscount"]; + elseif(isset($this->columns["memDiscount"]["default"])) + return $this->columns["memDiscount"]["default"]; + else return null; + } + else{ + $this->instance["memDiscount"] = func_get_arg(0); + } + } + + public function discountable(){ + if(func_num_args() == 0){ + if(isset($this->instance["discountable"])) + return $this->instance["discountable"]; + elseif(isset($this->columns["discountable"]["default"])) + return $this->columns["discountable"]["default"]; + else return null; + } + else{ + $this->instance["discountable"] = func_get_arg(0); + } + } + + public function discounttype(){ + if(func_num_args() == 0){ + if(isset($this->instance["discounttype"])) + return $this->instance["discounttype"]; + elseif(isset($this->columns["discounttype"]["default"])) + return $this->columns["discounttype"]["default"]; + else return null; + } + else{ + $this->instance["discounttype"] = func_get_arg(0); + } + } + + public function voided(){ + if(func_num_args() == 0){ + if(isset($this->instance["voided"])) + return $this->instance["voided"]; + elseif(isset($this->columns["voided"]["default"])) + return $this->columns["voided"]["default"]; + else return null; + } + else{ + $this->instance["voided"] = func_get_arg(0); + } + } + + public function percentDiscount(){ + if(func_num_args() == 0){ + if(isset($this->instance["percentDiscount"])) + return $this->instance["percentDiscount"]; + elseif(isset($this->columns["percentDiscount"]["default"])) + return $this->columns["percentDiscount"]["default"]; + else return null; + } + else{ + $this->instance["percentDiscount"] = func_get_arg(0); + } + } + + public function ItemQtty(){ + if(func_num_args() == 0){ + if(isset($this->instance["ItemQtty"])) + return $this->instance["ItemQtty"]; + elseif(isset($this->columns["ItemQtty"]["default"])) + return $this->columns["ItemQtty"]["default"]; + else return null; + } + else{ + $this->instance["ItemQtty"] = func_get_arg(0); + } + } + + public function volDiscType(){ + if(func_num_args() == 0){ + if(isset($this->instance["volDiscType"])) + return $this->instance["volDiscType"]; + elseif(isset($this->columns["volDiscType"]["default"])) + return $this->columns["volDiscType"]["default"]; + else return null; + } + else{ + $this->instance["volDiscType"] = func_get_arg(0); + } + } + + public function volume(){ + if(func_num_args() == 0){ + if(isset($this->instance["volume"])) + return $this->instance["volume"]; + elseif(isset($this->columns["volume"]["default"])) + return $this->columns["volume"]["default"]; + else return null; + } + else{ + $this->instance["volume"] = func_get_arg(0); + } + } + + public function VolSpecial(){ + if(func_num_args() == 0){ + if(isset($this->instance["VolSpecial"])) + return $this->instance["VolSpecial"]; + elseif(isset($this->columns["VolSpecial"]["default"])) + return $this->columns["VolSpecial"]["default"]; + else return null; + } + else{ + $this->instance["VolSpecial"] = func_get_arg(0); + } + } + + public function mixMatch(){ + if(func_num_args() == 0){ + if(isset($this->instance["mixMatch"])) + return $this->instance["mixMatch"]; + elseif(isset($this->columns["mixMatch"]["default"])) + return $this->columns["mixMatch"]["default"]; + else return null; + } + else{ + $this->instance["mixMatch"] = func_get_arg(0); + } + } + + public function matched(){ + if(func_num_args() == 0){ + if(isset($this->instance["matched"])) + return $this->instance["matched"]; + elseif(isset($this->columns["matched"]["default"])) + return $this->columns["matched"]["default"]; + else return null; + } + else{ + $this->instance["matched"] = func_get_arg(0); + } + } + + public function memType(){ + if(func_num_args() == 0){ + if(isset($this->instance["memType"])) + return $this->instance["memType"]; + elseif(isset($this->columns["memType"]["default"])) + return $this->columns["memType"]["default"]; + else return null; + } + else{ + $this->instance["memType"] = func_get_arg(0); + } + } + + public function staff(){ + if(func_num_args() == 0){ + if(isset($this->instance["staff"])) + return $this->instance["staff"]; + elseif(isset($this->columns["staff"]["default"])) + return $this->columns["staff"]["default"]; + else return null; + } + else{ + $this->instance["staff"] = func_get_arg(0); + } + } + + public function numflag(){ + if(func_num_args() == 0){ + if(isset($this->instance["numflag"])) + return $this->instance["numflag"]; + elseif(isset($this->columns["numflag"]["default"])) + return $this->columns["numflag"]["default"]; + else return null; + } + else{ + $this->instance["numflag"] = func_get_arg(0); + } + } + + public function charflag(){ + if(func_num_args() == 0){ + if(isset($this->instance["charflag"])) + return $this->instance["charflag"]; + elseif(isset($this->columns["charflag"]["default"])) + return $this->columns["charflag"]["default"]; + else return null; + } + else{ + $this->instance["charflag"] = func_get_arg(0); + } + } + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function trans_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_id"])) + return $this->instance["trans_id"]; + elseif(isset($this->columns["trans_id"]["default"])) + return $this->columns["trans_id"]["default"]; + else return null; + } + else{ + $this->instance["trans_id"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} + +?> diff --git a/fannie/classlib2.0/data/models/EmployeesModel.php b/fannie/classlib2.0/data/models/EmployeesModel.php new file mode 100644 index 000000000..2b5de17bc --- /dev/null +++ b/fannie/classlib2.0/data/models/EmployeesModel.php @@ -0,0 +1,177 @@ + array('type'=>'SMALLINT','primary_key'=>True), + 'CashierPassword'=>array('type'=>'INT'), + 'AdminPassword'=>array('type'=>'INT'), + 'FirstName'=>array('type'=>'VARCHAR(50)'), + 'LastName'=>array('type'=>'VARCHAR(50)'), + 'JobTitle'=>array('type'=>'VARCHAR(50)'), + 'EmpActive'=>array('type'=>'TINYINT'), + 'frontendsecurity'=>array('type'=>'SMALLINT'), + 'backendsecurity'=>array('type'=>'SMALLINT'), + 'birthdate'=>array('type'=>'DATETIME') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function emp_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["emp_no"])) + return $this->instance["emp_no"]; + elseif(isset($this->columns["emp_no"]["default"])) + return $this->columns["emp_no"]["default"]; + else return null; + } + else{ + $this->instance["emp_no"] = func_get_arg(0); + } + } + + public function CashierPassword(){ + if(func_num_args() == 0){ + if(isset($this->instance["CashierPassword"])) + return $this->instance["CashierPassword"]; + elseif(isset($this->columns["CashierPassword"]["default"])) + return $this->columns["CashierPassword"]["default"]; + else return null; + } + else{ + $this->instance["CashierPassword"] = func_get_arg(0); + } + } + + public function AdminPassword(){ + if(func_num_args() == 0){ + if(isset($this->instance["AdminPassword"])) + return $this->instance["AdminPassword"]; + elseif(isset($this->columns["AdminPassword"]["default"])) + return $this->columns["AdminPassword"]["default"]; + else return null; + } + else{ + $this->instance["AdminPassword"] = func_get_arg(0); + } + } + + public function FirstName(){ + if(func_num_args() == 0){ + if(isset($this->instance["FirstName"])) + return $this->instance["FirstName"]; + elseif(isset($this->columns["FirstName"]["default"])) + return $this->columns["FirstName"]["default"]; + else return null; + } + else{ + $this->instance["FirstName"] = func_get_arg(0); + } + } + + public function LastName(){ + if(func_num_args() == 0){ + if(isset($this->instance["LastName"])) + return $this->instance["LastName"]; + elseif(isset($this->columns["LastName"]["default"])) + return $this->columns["LastName"]["default"]; + else return null; + } + else{ + $this->instance["LastName"] = func_get_arg(0); + } + } + + public function JobTitle(){ + if(func_num_args() == 0){ + if(isset($this->instance["JobTitle"])) + return $this->instance["JobTitle"]; + elseif(isset($this->columns["JobTitle"]["default"])) + return $this->columns["JobTitle"]["default"]; + else return null; + } + else{ + $this->instance["JobTitle"] = func_get_arg(0); + } + } + + public function EmpActive(){ + if(func_num_args() == 0){ + if(isset($this->instance["EmpActive"])) + return $this->instance["EmpActive"]; + elseif(isset($this->columns["EmpActive"]["default"])) + return $this->columns["EmpActive"]["default"]; + else return null; + } + else{ + $this->instance["EmpActive"] = func_get_arg(0); + } + } + + public function frontendsecurity(){ + if(func_num_args() == 0){ + if(isset($this->instance["frontendsecurity"])) + return $this->instance["frontendsecurity"]; + elseif(isset($this->columns["frontendsecurity"]["default"])) + return $this->columns["frontendsecurity"]["default"]; + else return null; + } + else{ + $this->instance["frontendsecurity"] = func_get_arg(0); + } + } + + public function backendsecurity(){ + if(func_num_args() == 0){ + if(isset($this->instance["backendsecurity"])) + return $this->instance["backendsecurity"]; + elseif(isset($this->columns["backendsecurity"]["default"])) + return $this->columns["backendsecurity"]["default"]; + else return null; + } + else{ + $this->instance["backendsecurity"] = func_get_arg(0); + } + } + + public function birthdate(){ + if(func_num_args() == 0){ + if(isset($this->instance["birthdate"])) + return $this->instance["birthdate"]; + elseif(isset($this->columns["birthdate"]["default"])) + return $this->columns["birthdate"]["default"]; + else return null; + } + else{ + $this->instance["birthdate"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} + +?> diff --git a/fannie/classlib2.0/data/models/MemDatesModel.php b/fannie/classlib2.0/data/models/MemDatesModel.php new file mode 100644 index 000000000..82f2dd597 --- /dev/null +++ b/fannie/classlib2.0/data/models/MemDatesModel.php @@ -0,0 +1,124 @@ + array('type'=>'INT','primary_key'=>True), + 'start_date'=>array('type'=>'DATETIME'), + 'end_date'=>array('type'=>'DATETIME') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function start_date(){ + if(func_num_args() == 0){ + if(isset($this->instance["start_date"])) + return $this->instance["start_date"]; + elseif(isset($this->columns["start_date"]["default"])) + return $this->columns["start_date"]["default"]; + else return null; + } + else{ + $this->instance["start_date"] = func_get_arg(0); + } + } + + public function end_date(){ + if(func_num_args() == 0){ + if(isset($this->instance["end_date"])) + return $this->instance["end_date"]; + elseif(isset($this->columns["end_date"]["default"])) + return $this->columns["end_date"]["default"]; + else return null; + } + else{ + $this->instance["end_date"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ + + /** + 5Jul13 static stuff is legacy functionality + that predates the BasicModel class. + Can be removed when no calls to these functions + remain in Fannie. + */ + + /** + Update memDates record for an account + @param $card_no the member number + @param $start the starting date + @param $end the ending date + */ + public static function update($card_no,$start,$end){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + self::init_record($dbc,$card_no); + + $upP = $dbc->prepare_statement("UPDATE memDates SET start_date=?, + end_date=? WHERE card_no=?"); + $upR = $dbc->exec_statement($upP, array($start,$end,$card_no)); + + return $upR; + } + + private static function init_record($dbc,$card_no){ + $q = $dbc->prepare_statement("SELECT card_no FROM memDates WHERE card_no=?"); + $r = $dbc->exec_statement($q,array($card_no)); + + if ($dbc->num_rows($r) == 0){ + $ins = $dbc->prepare_statement("INSERT INTO memDates (card_no, + start_date,end_date) VALUES (?, NULL, NULL)"); + $dbc->exec_statement($ins,array($card_no)); + } + } + +} + +?> diff --git a/fannie/classlib2.0/data/models/MemberCardsModel.php b/fannie/classlib2.0/data/models/MemberCardsModel.php new file mode 100644 index 000000000..42f9d1da2 --- /dev/null +++ b/fannie/classlib2.0/data/models/MemberCardsModel.php @@ -0,0 +1,105 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'upc' => array('type'=>'VARCHAR(13)','primary_key'=>True,'default'=>'') + ); + + protected $unique = array('card_no'); + + /* START ACCESSOR FUNCTIONS */ + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function upc(){ + if(func_num_args() == 0){ + if(isset($this->instance["upc"])) + return $this->instance["upc"]; + elseif(isset($this->columns["upc"]["default"])) + return $this->columns["upc"]["default"]; + else return null; + } + else{ + $this->instance["upc"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ + + /** + 5Jul13 static stuff is legacy functionality + that predates the BasicModel class. + Can be removed when no calls to these functions + remain in Fannie. + + /** + Update memberCards record for an account + @param $card_no the member number + @param $upc the barcode + */ + public static function update($card_no,$upc){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $delP = $dbc->prepare_statement("DELETE FROM memberCards WHERE card_no=?"); + $delR = $dbc->exec_statement($delP,array($card_no)); + + /** don't create entry w/o UPC */ + if ($upc != ''){ + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + $insP = $dbc->prepare_statement("INSERT INTO memberCards (card_no, upc) + VALUES (?, ?)"); + $insR = $dbc->exec_statement($insP,array($card_no,$upc)); + return $insR; + } + else return $delR; + } + +} + +?> diff --git a/fannie/classlib2.0/data/models/MemberNotesModel.php b/fannie/classlib2.0/data/models/MemberNotesModel.php new file mode 100644 index 000000000..565604606 --- /dev/null +++ b/fannie/classlib2.0/data/models/MemberNotesModel.php @@ -0,0 +1,95 @@ + array('type'=>'INT'), + 'note' => array('type','TEXT'), + 'stamp' => array('type','DATETIME'), + 'username' => array('type','VARCHAR(50)') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function cardno(){ + if(func_num_args() == 0){ + if(isset($this->instance["cardno"])) + return $this->instance["cardno"]; + elseif(isset($this->columns["cardno"]["default"])) + return $this->columns["cardno"]["default"]; + else return null; + } + else{ + $this->instance["cardno"] = func_get_arg(0); + } + } + + public function note(){ + if(func_num_args() == 0){ + if(isset($this->instance["note"])) + return $this->instance["note"]; + elseif(isset($this->columns["note"]["default"])) + return $this->columns["note"]["default"]; + else return null; + } + else{ + $this->instance["note"] = func_get_arg(0); + } + } + + public function stamp(){ + if(func_num_args() == 0){ + if(isset($this->instance["stamp"])) + return $this->instance["stamp"]; + elseif(isset($this->columns["stamp"]["default"])) + return $this->columns["stamp"]["default"]; + else return null; + } + else{ + $this->instance["stamp"] = func_get_arg(0); + } + } + + public function username(){ + if(func_num_args() == 0){ + if(isset($this->instance["username"])) + return $this->instance["username"]; + elseif(isset($this->columns["username"]["default"])) + return $this->columns["username"]["default"]; + else return null; + } + else{ + $this->instance["username"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/MemdefaultsModel.php b/fannie/classlib2.0/data/models/MemdefaultsModel.php new file mode 100644 index 000000000..c434a5c0a --- /dev/null +++ b/fannie/classlib2.0/data/models/MemdefaultsModel.php @@ -0,0 +1,109 @@ + array('type'=>'TINYINT','primary_key'=>True,'default'=>0), + 'cd_type' => array('type'=>'VARCHAR(10)'), + 'discount' => array('type'=>'SMALLINT','default'=>0), + 'staff' => array('type'=>'TINYINT','default'=>0), + 'SSI' => array('type'=>'TINYINT','default'=>0) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function memtype(){ + if(func_num_args() == 0){ + if(isset($this->instance["memtype"])) + return $this->instance["memtype"]; + elseif(isset($this->columns["memtype"]["default"])) + return $this->columns["memtype"]["default"]; + else return null; + } + else{ + $this->instance["memtype"] = func_get_arg(0); + } + } + + public function cd_type(){ + if(func_num_args() == 0){ + if(isset($this->instance["cd_type"])) + return $this->instance["cd_type"]; + elseif(isset($this->columns["cd_type"]["default"])) + return $this->columns["cd_type"]["default"]; + else return null; + } + else{ + $this->instance["cd_type"] = func_get_arg(0); + } + } + + public function discount(){ + if(func_num_args() == 0){ + if(isset($this->instance["discount"])) + return $this->instance["discount"]; + elseif(isset($this->columns["discount"]["default"])) + return $this->columns["discount"]["default"]; + else return null; + } + else{ + $this->instance["discount"] = func_get_arg(0); + } + } + + public function staff(){ + if(func_num_args() == 0){ + if(isset($this->instance["staff"])) + return $this->instance["staff"]; + elseif(isset($this->columns["staff"]["default"])) + return $this->columns["staff"]["default"]; + else return null; + } + else{ + $this->instance["staff"] = func_get_arg(0); + } + } + + public function SSI(){ + if(func_num_args() == 0){ + if(isset($this->instance["SSI"])) + return $this->instance["SSI"]; + elseif(isset($this->columns["SSI"]["default"])) + return $this->columns["SSI"]["default"]; + else return null; + } + else{ + $this->instance["SSI"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/MeminfoModel.php b/fannie/classlib2.0/data/models/MeminfoModel.php new file mode 100644 index 000000000..abde6af57 --- /dev/null +++ b/fannie/classlib2.0/data/models/MeminfoModel.php @@ -0,0 +1,290 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'last_name' => array('type'=>'VARCHAR(30)'), + 'first_name' => array('type'=>'VARCHAR(30)'), + 'othlast_name' => array('type'=>'VARCHAR(30)'), + 'othfirst_name' => array('type'=>'VARCHAR(30)'), + 'street' => array('type'=>'VARCHAR(255)'), + 'city' => array('type'=>'VARCHAR(20)'), + 'state' => array('type'=>'VARCHAR(2)'), + 'zip' => array('type'=>'VARCHAR(10)'), + 'phone' => array('type'=>'VARCHAR(30)'), + 'email_1' => array('type'=>'VARCHAR(50)'), + 'email_2' => array('type'=>'VARCHAR(50)'), + 'ads_OK' => array('type'=>'TINYINT','default'=>1), + ); + + /* START ACCESSOR FUNCTIONS */ + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function last_name(){ + if(func_num_args() == 0){ + if(isset($this->instance["last_name"])) + return $this->instance["last_name"]; + elseif(isset($this->columns["last_name"]["default"])) + return $this->columns["last_name"]["default"]; + else return null; + } + else{ + $this->instance["last_name"] = func_get_arg(0); + } + } + + public function first_name(){ + if(func_num_args() == 0){ + if(isset($this->instance["first_name"])) + return $this->instance["first_name"]; + elseif(isset($this->columns["first_name"]["default"])) + return $this->columns["first_name"]["default"]; + else return null; + } + else{ + $this->instance["first_name"] = func_get_arg(0); + } + } + + public function othlast_name(){ + if(func_num_args() == 0){ + if(isset($this->instance["othlast_name"])) + return $this->instance["othlast_name"]; + elseif(isset($this->columns["othlast_name"]["default"])) + return $this->columns["othlast_name"]["default"]; + else return null; + } + else{ + $this->instance["othlast_name"] = func_get_arg(0); + } + } + + public function othfirst_name(){ + if(func_num_args() == 0){ + if(isset($this->instance["othfirst_name"])) + return $this->instance["othfirst_name"]; + elseif(isset($this->columns["othfirst_name"]["default"])) + return $this->columns["othfirst_name"]["default"]; + else return null; + } + else{ + $this->instance["othfirst_name"] = func_get_arg(0); + } + } + + public function street(){ + if(func_num_args() == 0){ + if(isset($this->instance["street"])) + return $this->instance["street"]; + elseif(isset($this->columns["street"]["default"])) + return $this->columns["street"]["default"]; + else return null; + } + else{ + $this->instance["street"] = func_get_arg(0); + } + } + + public function city(){ + if(func_num_args() == 0){ + if(isset($this->instance["city"])) + return $this->instance["city"]; + elseif(isset($this->columns["city"]["default"])) + return $this->columns["city"]["default"]; + else return null; + } + else{ + $this->instance["city"] = func_get_arg(0); + } + } + + public function state(){ + if(func_num_args() == 0){ + if(isset($this->instance["state"])) + return $this->instance["state"]; + elseif(isset($this->columns["state"]["default"])) + return $this->columns["state"]["default"]; + else return null; + } + else{ + $this->instance["state"] = func_get_arg(0); + } + } + + public function zip(){ + if(func_num_args() == 0){ + if(isset($this->instance["zip"])) + return $this->instance["zip"]; + elseif(isset($this->columns["zip"]["default"])) + return $this->columns["zip"]["default"]; + else return null; + } + else{ + $this->instance["zip"] = func_get_arg(0); + } + } + + public function phone(){ + if(func_num_args() == 0){ + if(isset($this->instance["phone"])) + return $this->instance["phone"]; + elseif(isset($this->columns["phone"]["default"])) + return $this->columns["phone"]["default"]; + else return null; + } + else{ + $this->instance["phone"] = func_get_arg(0); + } + } + + public function email_1(){ + if(func_num_args() == 0){ + if(isset($this->instance["email_1"])) + return $this->instance["email_1"]; + elseif(isset($this->columns["email_1"]["default"])) + return $this->columns["email_1"]["default"]; + else return null; + } + else{ + $this->instance["email_1"] = func_get_arg(0); + } + } + + public function email_2(){ + if(func_num_args() == 0){ + if(isset($this->instance["email_2"])) + return $this->instance["email_2"]; + elseif(isset($this->columns["email_2"]["default"])) + return $this->columns["email_2"]["default"]; + else return null; + } + else{ + $this->instance["email_2"] = func_get_arg(0); + } + } + + public function ads_OK(){ + if(func_num_args() == 0){ + if(isset($this->instance["ads_OK"])) + return $this->instance["ads_OK"]; + elseif(isset($this->columns["ads_OK"]["default"])) + return $this->columns["ads_OK"]["default"]; + else return null; + } + else{ + $this->instance["ads_OK"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ + + /** + 5Jul13 static stuff is legacy functionality + that predates the BasicModel class. + Can be removed when no calls to these functions + remain in Fannie. + */ + + /** + Update meminfo record for an account + @param $card_no the member number + @param $fields array of column names and values + */ + public static function update($card_no,$fields){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + self::init_record($dbc,$card_no); + + $upQ = "UPDATE meminfo SET "; + $args = array(); + foreach($fields as $name=>$value){ + switch($name){ + case 'street': + case 'city': + case 'state': + case 'zip': + case 'phone': + case 'email_1': + case 'email_2': + case 'ads_OK': + if ($name === 0 || $name === True) + break; // switch does loose comparison... + $upQ .= $name." = ?,"; + $args[] = $value; + break; + default: + break; + } + } + if ($upQ == "UPDATE meminfo SET ") return True; // nothing to update + + $upQ = rtrim($upQ,","); + $upQ .= ' WHERE card_no=?'; + $args[] = $card_no; + $upP = $dbc->prepare_statement($upQ); + $upR = $dbc->exec_statement($upP, $args); + + return $upR; + } + + private static function init_record($dbc,$card_no){ + $q = $dbc->prepare_statement("SELECT card_no FROM meminfo WHERE card_no=?"); + $r = $dbc->exec_statement($q,array($card_no)); + + if ($dbc->num_rows($r) == 0){ + $ins = $dbc->prepare_statement("INSERT INTO meminfo (card_no, + last_name,first_name,othlast_name,othfirst_name,street, + city,state,zip,phone,email_1,email_2,ads_OK) VALUES + (?,'','','','','','','','','','','',1)"); + $dbc->exec_statement($ins,array($card_no)); + } + } + +} + +?> diff --git a/fannie/classlib2.0/data/models/MemtypeModel.php b/fannie/classlib2.0/data/models/MemtypeModel.php new file mode 100644 index 000000000..9732f02ef --- /dev/null +++ b/fannie/classlib2.0/data/models/MemtypeModel.php @@ -0,0 +1,67 @@ + array('type'=>'TINYINT','primary_key'=>True,'default'=>0), + 'memDesc' => array('type'=>'VARCHAR(20)') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function memtype(){ + if(func_num_args() == 0){ + if(isset($this->instance["memtype"])) + return $this->instance["memtype"]; + elseif(isset($this->columns["memtype"]["default"])) + return $this->columns["memtype"]["default"]; + else return null; + } + else{ + $this->instance["memtype"] = func_get_arg(0); + } + } + + public function memDesc(){ + if(func_num_args() == 0){ + if(isset($this->instance["memDesc"])) + return $this->instance["memDesc"]; + elseif(isset($this->columns["memDesc"]["default"])) + return $this->columns["memDesc"]["default"]; + else return null; + } + else{ + $this->instance["memDesc"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/PatronageModel.php b/fannie/classlib2.0/data/models/PatronageModel.php new file mode 100644 index 000000000..0c08d7ad4 --- /dev/null +++ b/fannie/classlib2.0/data/models/PatronageModel.php @@ -0,0 +1,165 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'purchase' => array('type'=>'MONEY'), + 'discounts' => array('type'=>'MONEY'), + 'rewards' => array('type'=>'MONEY'), + 'net_purch' => array('type'=>'MONEY'), + 'tot_pat' => array('type'=>'MONEY'), + 'cash_pat' => array('type'=>'MONEY'), + 'equit_pat' => array('type'=>'MONEY'), + 'FY' => array('type'=>'SMALLINT','primary_key'=>True,'default'=>0) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function cardno(){ + if(func_num_args() == 0){ + if(isset($this->instance["cardno"])) + return $this->instance["cardno"]; + elseif(isset($this->columns["cardno"]["default"])) + return $this->columns["cardno"]["default"]; + else return null; + } + else{ + $this->instance["cardno"] = func_get_arg(0); + } + } + + public function purchase(){ + if(func_num_args() == 0){ + if(isset($this->instance["purchase"])) + return $this->instance["purchase"]; + elseif(isset($this->columns["purchase"]["default"])) + return $this->columns["purchase"]["default"]; + else return null; + } + else{ + $this->instance["purchase"] = func_get_arg(0); + } + } + + public function discounts(){ + if(func_num_args() == 0){ + if(isset($this->instance["discounts"])) + return $this->instance["discounts"]; + elseif(isset($this->columns["discounts"]["default"])) + return $this->columns["discounts"]["default"]; + else return null; + } + else{ + $this->instance["discounts"] = func_get_arg(0); + } + } + + public function rewards(){ + if(func_num_args() == 0){ + if(isset($this->instance["rewards"])) + return $this->instance["rewards"]; + elseif(isset($this->columns["rewards"]["default"])) + return $this->columns["rewards"]["default"]; + else return null; + } + else{ + $this->instance["rewards"] = func_get_arg(0); + } + } + + public function net_purch(){ + if(func_num_args() == 0){ + if(isset($this->instance["net_purch"])) + return $this->instance["net_purch"]; + elseif(isset($this->columns["net_purch"]["default"])) + return $this->columns["net_purch"]["default"]; + else return null; + } + else{ + $this->instance["net_purch"] = func_get_arg(0); + } + } + + public function tot_pat(){ + if(func_num_args() == 0){ + if(isset($this->instance["tot_pat"])) + return $this->instance["tot_pat"]; + elseif(isset($this->columns["tot_pat"]["default"])) + return $this->columns["tot_pat"]["default"]; + else return null; + } + else{ + $this->instance["tot_pat"] = func_get_arg(0); + } + } + + public function cash_pat(){ + if(func_num_args() == 0){ + if(isset($this->instance["cash_pat"])) + return $this->instance["cash_pat"]; + elseif(isset($this->columns["cash_pat"]["default"])) + return $this->columns["cash_pat"]["default"]; + else return null; + } + else{ + $this->instance["cash_pat"] = func_get_arg(0); + } + } + + public function equit_pat(){ + if(func_num_args() == 0){ + if(isset($this->instance["equit_pat"])) + return $this->instance["equit_pat"]; + elseif(isset($this->columns["equit_pat"]["default"])) + return $this->columns["equit_pat"]["default"]; + else return null; + } + else{ + $this->instance["equit_pat"] = func_get_arg(0); + } + } + + public function FY(){ + if(func_num_args() == 0){ + if(isset($this->instance["FY"])) + return $this->instance["FY"]; + elseif(isset($this->columns["FY"]["default"])) + return $this->columns["FY"]["default"]; + else return null; + } + else{ + $this->instance["FY"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/ProdUpdateModel.php b/fannie/classlib2.0/data/models/ProdUpdateModel.php new file mode 100644 index 000000000..598a7461b --- /dev/null +++ b/fannie/classlib2.0/data/models/ProdUpdateModel.php @@ -0,0 +1,111 @@ + prodUpdate + foreach($fields as $name => $value){ + if ($name === 0 || $name === True) continue; + switch($name){ + case 'description': + case 'tax': + case 'scale': + case 'inUse': + if ($name === 0 || $name === True) + break; // switch does loose comparison... + $q .= $name.','; + $args[] = $value; + break; + case 'price': + case 'normal_price': + $q .= 'price,'; + $args[] = $value; + break; + case 'dept': + case 'department': + $q .= 'dept,'; + $args[] = $value; + break; + case 'fs': + case 'foodstamp': + $q .= 'fs,'; + $args[] = $value; + break; + case 'forceQty': + case 'qttyEnforced': + $q .= 'forceQty,'; + $args[] = $value; + break; + case 'noDisc': + case 'discount': + $q .= 'noDisc,'; + $args[] = $value; + break; + default: + break; + } + } + + if ($q != 'INSERT INTO prodUpdate ('){ + $q .= 'upc,'; + $args[] = $upc; + + $q .= 'user,'; + $current_user = checkLogin(); + $uid = getUID($current_user); + if ($current_user === False || $uid === False) + $args[] = 0; + else + $args[] = $uid; + + $q .= 'modified) VALUES ('; + foreach($args as $a) $q .= '?,'; + $q .= $dbc->now().')'; + + $insP = $dbc->prepare_statement($q); + $insR = $dbc->exec_statement($insP, $args); + if ($insR === False) return False; + } + return True; + } + +} + +?> diff --git a/fannie/classlib2.0/data/models/ProductsModel.php b/fannie/classlib2.0/data/models/ProductsModel.php new file mode 100644 index 000000000..39ac410bb --- /dev/null +++ b/fannie/classlib2.0/data/models/ProductsModel.php @@ -0,0 +1,769 @@ + array('type'=>'VARCHAR(13)','index'=>True), + 'description'=>array('type'=>'VARCHAR(30)','index'=>True), + 'normal_price'=>array('type'=>'MONEY'), + 'pricemethod'=>array('type'=>'SMALLINT'), + 'groupprice'=>array('type'=>'MONEY'), + 'quantity'=>array('type'=>'SMALLINT'), + 'special_price'=>array('type'=>'MONEY'), + 'specialpricemethod'=>array('type'=>'SMALLINT'), + 'specialgroupprice'=>array('type'=>'MONEY'), + 'specialquantity'=>array('type'=>'SMALLINT'), + 'start_date'=>array('type'=>'DATETIME'), + 'end_date'=>array('type'=>'DATETIME'), + 'department'=>array('type'=>'SMALLINT','index'=>True), + 'size'=>array('type'=>'VARCHAR(9)'), + 'tax'=>array('type'=>'SMALLINT'), + 'foodstamp'=>array('type'=>'TINYINT'), + 'scale'=>array('type'=>'TINYINT'), + 'scaleprice'=>array('type'=>'MONEY'), + 'mixmatchcode'=>array('type'=>'VARCHAR(13)'), + 'modified'=>array('type'=>'DATETIME'), + 'advertised'=>array('type'=>'TINYINT'), + 'tareweight'=>array('type'=>'DOUBLE'), + 'discount'=>array('type'=>'SMALLINT'), + 'discounttype'=>array('type'=>'TINYINT'), + 'unitofmeasure'=>array('type'=>'VARCHAR(15)'), + 'wicable'=>array('type'=>'SMALLINT'), + 'qttyEnforced'=>array('type'=>'TINYINT'), + 'idEnforced'=>array('type'=>'TINYINT'), + 'cost'=>array('type'=>'MONEY'), + 'inUse'=>array('type'=>'TINYINT'), + 'numflag'=>array('type'=>'INT','default'=>0), + 'subdept'=>array('type'=>'SMALLINT'), + 'deposit'=>array('type'=>'DOUBLE'), + 'local'=>array('type'=>'INT','default'=>0), + 'store_id'=>array('type'=>'SMALLINT','default'=>0), + 'id'=>array('type'=>'INT','default'=>0,'primary_key'=>True,'increment'=>True) + ); + + protected $unique = array('upc'); + + /** + Update product record for a upc + New records are created automatically as needed + @param $upc the upc + @param $fields array of column names and values + @param $update_only don't add if the product doesn't exist + */ + public static function update($upc,$fields, $update_only=False){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + if (!is_numeric($upc)) + return False; + if (!is_int($upc) && !ctype_digit($upc)) + return False; + $upc = substr($upc,0,13); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $chkP = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); + $chkR = $dbc->exec_statement($chkP, array($upc)); + if ($dbc->num_rows($chkR) == 0) + return ($update_only===False ? self::add($upc,$fields) : True); + + $valid_columns = $dbc->table_definition('products'); + + $updateQ = "UPDATE products SET "; + $updateArgs = array(); + foreach($fields as $name => $value){ + switch($name){ + case 'description': + case 'normal_price': + case 'pricemethod': + case 'groupprice': + case 'quantity': + case 'special_price': + case 'specialpricemethod': + case 'specialgroupprice': + case 'specialquantity': + case 'start_date': + case 'end_date': + case 'department': + case 'size': + case 'tax': + case 'foodstamp': + case 'scale': + case 'scaleprice': + case 'mixmatchcode': + case 'advertised': + case 'tareweight': + case 'discount': + case 'discounttype': + case 'unitofmeasure': + case 'wicable': + case 'qttyEnforced': + case 'idEnforced': + case 'cost': + case 'inUse': + case 'numflag': + case 'subdept': + case 'deposit': + case 'local': + case 'store_id': + if ($name === 0 || $name === True) + break; // switch does loose comparison... + if (!isset($valid_columns[$name])) + break; // table does not have that column + $updateQ .= $name." = ?,"; + $updateArgs[] = $value; + break; + default: + break; + } + } + + /** if only name fields were provided, there's + nothing to do here */ + if ($updateQ != "UPDATE products SET "){ + $updateQ .= 'modified='.$dbc->now(); + $updateQ .= " WHERE upc=?"; + $updateArgs[] = $upc; + + $updateP = $dbc->prepare_statement($updateQ); + $updateR = $dbc->exec_statement($updateP,$updateArgs); + if ($updateR === False) return False; + ProdUpdateModel::add($upc, $fields); + } + + return True; + } + + /** + Delete an item + @param $upc the upc + */ + public static function static_delete($upc){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + if (!is_numeric($upc)) + return False; + if (!is_int($upc) && !ctype_digit($upc)) + return False; + $upc = substr($upc,0,13); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $delP = $dbc->prepare_statement('DELETE FROM products WHERE upc=?'); + $delR = $dbc->exec_statement($delP,array($upc)); + if ($delR === False) return False; + ProdUpdateModel::add($upc,array('description'=>'_DELETED')); + return True; + } + + /** + Create product record for a upc + @param $upc the upc + @param $fields array of column names and values + */ + private static function add($upc,$fields){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + if (!is_numeric($upc)) + return False; + if (!is_int($upc) && !ctype_digit($upc)) + return False; + $upc = substr($upc,0,13); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $args = array(); + $q = 'INSERT INTO products '; + + $q .= '(upc,'; + $args[] = $upc; + + $q .= 'description,'; + $args[] = isset($fields['description'])?$fields['description']:''; + + $q .= 'normal_price,'; + $args[] = isset($fields['normal_price'])?$fields['normal_price']:0.00; + + $q .= 'pricemethod,'; + $args[] = isset($fields['pricemethod'])?$fields['pricemethod']:0; + + $q .= 'groupprice,'; + $args[] = isset($fields['groupprice'])?$fields['groupprice']:0.00; + + $q .= 'quantity,'; + $args[] = isset($fields['quantity'])?$fields['quantity']:0; + + $q .= 'special_price,'; + $args[] = isset($fields['special_price'])?$fields['special_price']:0.00; + + $q .= 'specialpricemethod,'; + $args[] = isset($fields['specialpricemethod'])?$fields['specialpricemethod']:0; + + $q .= 'specialgroupprice,'; + $args[] = isset($fields['specialgroupprice'])?$fields['specialgroupprice']:0.00; + + $q .= 'specialquantity,'; + $args[] = isset($fields['specialquantity'])?$fields['specialquantity']:0; + + $q .= 'department,'; + $args[] = isset($fields['department'])?$fields['department']:0; + + $q .= 'size,'; + $args[] = isset($fields['size'])?$fields['size']:''; + + $q .= 'tax,'; + $args[] = isset($fields['tax'])?$fields['tax']:0; + + $q .= 'foodstamp,'; + $args[] = isset($fields['foodstamp'])?$fields['foodstamp']:0; + + $q .= 'scale,'; + $args[] = isset($fields['scale'])?$fields['scale']:0; + + $q .= 'scaleprice,'; + $args[] = isset($fields['scaleprice'])?$fields['scaleprice']:0.00; + + $q .= 'mixmatchcode,'; + $args[] = isset($fields['mixmatchcode'])?$fields['mixmatchcode']:''; + + $q .= 'advertised,'; + $args[] = isset($fields['advertised'])?$fields['advertised']:1; + + $q .= 'tareweight,'; + $args[] = isset($fields['tareweight'])?$fields['tareweight']:0.00; + + $q .= 'discount,'; + $args[] = isset($fields['discount'])?$fields['discount']:0; + + $q .= 'discounttype,'; + $args[] = isset($fields['discounttype'])?$fields['discounttype']:0; + + $q .= 'unitofmeasure,'; + $args[] = isset($fields['unitofmeasure'])?$fields['unitofmeasure']:''; + + $q .= 'wicable,'; + $args[] = isset($fields['wicable'])?$fields['wicable']:0; + + $q .= 'qttyEnforced,'; + $args[] = isset($fields['qttyEnforced'])?$fields['qttyEnforced']:0; + + $q .= 'idEnforced,'; + $args[] = isset($fields['idEnforced'])?$fields['idEnforced']:0; + + $q .= 'cost,'; + $args[] = isset($fields['cost'])?$fields['cost']:0.00; + + $q .= 'inUse,'; + $args[] = isset($fields['inUse'])?$fields['inUse']:1; + + $q .= 'numflag,'; + $args[] = isset($fields['numflag'])?$fields['numflag']:0; + + $q .= 'subdept,'; + $args[] = isset($fields['subdept'])?$fields['subdept']:0; + + $q .= 'deposit,'; + $args[] = isset($fields['deposit'])?$fields['deposit']:0; + + $q .= 'local,'; + $args[] = isset($fields['local'])?$fields['local']:0; + + $q .= 'store_id,'; + $args[] = isset($fields['store_id'])?$fields['store_id']:0; + + $q .= 'modified) VALUES ('; + foreach($args as $a) $q .= '?,'; + $q .= $dbc->now().')'; + + $insP = $dbc->prepare_statement($q); + $insR = $dbc->exec_statement($insP, $args); + if ($insR === False) return False; + + ProdUpdateModel::add($upc, $fields); + return True; + } + + /* START ACCESSOR FUNCTIONS */ + + public function upc(){ + if(func_num_args() == 0){ + if(isset($this->instance["upc"])) + return $this->instance["upc"]; + elseif(isset($this->columns["upc"]["default"])) + return $this->columns["upc"]["default"]; + else return null; + } + else{ + $this->instance["upc"] = func_get_arg(0); + } + } + + public function description(){ + if(func_num_args() == 0){ + if(isset($this->instance["description"])) + return $this->instance["description"]; + elseif(isset($this->columns["description"]["default"])) + return $this->columns["description"]["default"]; + else return null; + } + else{ + $this->instance["description"] = func_get_arg(0); + } + } + + public function normal_price(){ + if(func_num_args() == 0){ + if(isset($this->instance["normal_price"])) + return $this->instance["normal_price"]; + elseif(isset($this->columns["normal_price"]["default"])) + return $this->columns["normal_price"]["default"]; + else return null; + } + else{ + $this->instance["normal_price"] = func_get_arg(0); + } + } + + public function pricemethod(){ + if(func_num_args() == 0){ + if(isset($this->instance["pricemethod"])) + return $this->instance["pricemethod"]; + elseif(isset($this->columns["pricemethod"]["default"])) + return $this->columns["pricemethod"]["default"]; + else return null; + } + else{ + $this->instance["pricemethod"] = func_get_arg(0); + } + } + + public function groupprice(){ + if(func_num_args() == 0){ + if(isset($this->instance["groupprice"])) + return $this->instance["groupprice"]; + elseif(isset($this->columns["groupprice"]["default"])) + return $this->columns["groupprice"]["default"]; + else return null; + } + else{ + $this->instance["groupprice"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + + public function special_price(){ + if(func_num_args() == 0){ + if(isset($this->instance["special_price"])) + return $this->instance["special_price"]; + elseif(isset($this->columns["special_price"]["default"])) + return $this->columns["special_price"]["default"]; + else return null; + } + else{ + $this->instance["special_price"] = func_get_arg(0); + } + } + + public function specialpricemethod(){ + if(func_num_args() == 0){ + if(isset($this->instance["specialpricemethod"])) + return $this->instance["specialpricemethod"]; + elseif(isset($this->columns["specialpricemethod"]["default"])) + return $this->columns["specialpricemethod"]["default"]; + else return null; + } + else{ + $this->instance["specialpricemethod"] = func_get_arg(0); + } + } + + public function sepcialgroupprice(){ + if(func_num_args() == 0){ + if(isset($this->instance["sepcialgroupprice"])) + return $this->instance["sepcialgroupprice"]; + elseif(isset($this->columns["sepcialgroupprice"]["default"])) + return $this->columns["sepcialgroupprice"]["default"]; + else return null; + } + else{ + $this->instance["sepcialgroupprice"] = func_get_arg(0); + } + } + + public function specialquantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["specialquantity"])) + return $this->instance["specialquantity"]; + elseif(isset($this->columns["specialquantity"]["default"])) + return $this->columns["specialquantity"]["default"]; + else return null; + } + else{ + $this->instance["specialquantity"] = func_get_arg(0); + } + } + + public function start_date(){ + if(func_num_args() == 0){ + if(isset($this->instance["start_date"])) + return $this->instance["start_date"]; + elseif(isset($this->columns["start_date"]["default"])) + return $this->columns["start_date"]["default"]; + else return null; + } + else{ + $this->instance["start_date"] = func_get_arg(0); + } + } + + public function end_date(){ + if(func_num_args() == 0){ + if(isset($this->instance["end_date"])) + return $this->instance["end_date"]; + elseif(isset($this->columns["end_date"]["default"])) + return $this->columns["end_date"]["default"]; + else return null; + } + else{ + $this->instance["end_date"] = func_get_arg(0); + } + } + + public function size(){ + if(func_num_args() == 0){ + if(isset($this->instance["size"])) + return $this->instance["size"]; + elseif(isset($this->columns["size"]["default"])) + return $this->columns["size"]["default"]; + else return null; + } + else{ + $this->instance["size"] = func_get_arg(0); + } + } + + public function tax(){ + if(func_num_args() == 0){ + if(isset($this->instance["tax"])) + return $this->instance["tax"]; + elseif(isset($this->columns["tax"]["default"])) + return $this->columns["tax"]["default"]; + else return null; + } + else{ + $this->instance["tax"] = func_get_arg(0); + } + } + + public function foodstamp(){ + if(func_num_args() == 0){ + if(isset($this->instance["foodstamp"])) + return $this->instance["foodstamp"]; + elseif(isset($this->columns["foodstamp"]["default"])) + return $this->columns["foodstamp"]["default"]; + else return null; + } + else{ + $this->instance["foodstamp"] = func_get_arg(0); + } + } + + public function scale(){ + if(func_num_args() == 0){ + if(isset($this->instance["scale"])) + return $this->instance["scale"]; + elseif(isset($this->columns["scale"]["default"])) + return $this->columns["scale"]["default"]; + else return null; + } + else{ + $this->instance["scale"] = func_get_arg(0); + } + } + + public function scaleprice(){ + if(func_num_args() == 0){ + if(isset($this->instance["scaleprice"])) + return $this->instance["scaleprice"]; + elseif(isset($this->columns["scaleprice"]["default"])) + return $this->columns["scaleprice"]["default"]; + else return null; + } + else{ + $this->instance["scaleprice"] = func_get_arg(0); + } + } + + public function mixmatchcode(){ + if(func_num_args() == 0){ + if(isset($this->instance["mixmatchcode"])) + return $this->instance["mixmatchcode"]; + elseif(isset($this->columns["mixmatchcode"]["default"])) + return $this->columns["mixmatchcode"]["default"]; + else return null; + } + else{ + $this->instance["mixmatchcode"] = func_get_arg(0); + } + } + + public function modified(){ + if(func_num_args() == 0){ + if(isset($this->instance["modified"])) + return $this->instance["modified"]; + elseif(isset($this->columns["modified"]["default"])) + return $this->columns["modified"]["default"]; + else return null; + } + else{ + $this->instance["modified"] = func_get_arg(0); + } + } + + public function advertised(){ + if(func_num_args() == 0){ + if(isset($this->instance["advertised"])) + return $this->instance["advertised"]; + elseif(isset($this->columns["advertised"]["default"])) + return $this->columns["advertised"]["default"]; + else return null; + } + else{ + $this->instance["advertised"] = func_get_arg(0); + } + } + + public function tareweight(){ + if(func_num_args() == 0){ + if(isset($this->instance["tareweight"])) + return $this->instance["tareweight"]; + elseif(isset($this->columns["tareweight"]["default"])) + return $this->columns["tareweight"]["default"]; + else return null; + } + else{ + $this->instance["tareweight"] = func_get_arg(0); + } + } + + public function discount(){ + if(func_num_args() == 0){ + if(isset($this->instance["discount"])) + return $this->instance["discount"]; + elseif(isset($this->columns["discount"]["default"])) + return $this->columns["discount"]["default"]; + else return null; + } + else{ + $this->instance["discount"] = func_get_arg(0); + } + } + + public function discounttype(){ + if(func_num_args() == 0){ + if(isset($this->instance["discounttype"])) + return $this->instance["discounttype"]; + elseif(isset($this->columns["discounttype"]["default"])) + return $this->columns["discounttype"]["default"]; + else return null; + } + else{ + $this->instance["discounttype"] = func_get_arg(0); + } + } + + public function unitofmeasure(){ + if(func_num_args() == 0){ + if(isset($this->instance["unitofmeasure"])) + return $this->instance["unitofmeasure"]; + elseif(isset($this->columns["unitofmeasure"]["default"])) + return $this->columns["unitofmeasure"]["default"]; + else return null; + } + else{ + $this->instance["unitofmeasure"] = func_get_arg(0); + } + } + + public function wicable(){ + if(func_num_args() == 0){ + if(isset($this->instance["wicable"])) + return $this->instance["wicable"]; + elseif(isset($this->columns["wicable"]["default"])) + return $this->columns["wicable"]["default"]; + else return null; + } + else{ + $this->instance["wicable"] = func_get_arg(0); + } + } + + public function qttyEnforced(){ + if(func_num_args() == 0){ + if(isset($this->instance["qttyEnforced"])) + return $this->instance["qttyEnforced"]; + elseif(isset($this->columns["qttyEnforced"]["default"])) + return $this->columns["qttyEnforced"]["default"]; + else return null; + } + else{ + $this->instance["qttyEnforced"] = func_get_arg(0); + } + } + + public function idEnforced(){ + if(func_num_args() == 0){ + if(isset($this->instance["idEnforced"])) + return $this->instance["idEnforced"]; + elseif(isset($this->columns["idEnforced"]["default"])) + return $this->columns["idEnforced"]["default"]; + else return null; + } + else{ + $this->instance["idEnforced"] = func_get_arg(0); + } + } + + public function cost(){ + if(func_num_args() == 0){ + if(isset($this->instance["cost"])) + return $this->instance["cost"]; + elseif(isset($this->columns["cost"]["default"])) + return $this->columns["cost"]["default"]; + else return null; + } + else{ + $this->instance["cost"] = func_get_arg(0); + } + } + + public function inUse(){ + if(func_num_args() == 0){ + if(isset($this->instance["inUse"])) + return $this->instance["inUse"]; + elseif(isset($this->columns["inUse"]["default"])) + return $this->columns["inUse"]["default"]; + else return null; + } + else{ + $this->instance["inUse"] = func_get_arg(0); + } + } + + public function numflag(){ + if(func_num_args() == 0){ + if(isset($this->instance["numflag"])) + return $this->instance["numflag"]; + elseif(isset($this->columns["numflag"]["default"])) + return $this->columns["numflag"]["default"]; + else return null; + } + else{ + $this->instance["numflag"] = func_get_arg(0); + } + } + + public function subdept(){ + if(func_num_args() == 0){ + if(isset($this->instance["subdept"])) + return $this->instance["subdept"]; + elseif(isset($this->columns["subdept"]["default"])) + return $this->columns["subdept"]["default"]; + else return null; + } + else{ + $this->instance["subdept"] = func_get_arg(0); + } + } + + public function deposit(){ + if(func_num_args() == 0){ + if(isset($this->instance["deposit"])) + return $this->instance["deposit"]; + elseif(isset($this->columns["deposit"]["default"])) + return $this->columns["deposit"]["default"]; + else return null; + } + else{ + $this->instance["deposit"] = func_get_arg(0); + } + } + + public function local(){ + if(func_num_args() == 0){ + if(isset($this->instance["local"])) + return $this->instance["local"]; + elseif(isset($this->columns["local"]["default"])) + return $this->columns["local"]["default"]; + else return null; + } + else{ + $this->instance["local"] = func_get_arg(0); + } + } + + public function store_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["store_id"])) + return $this->instance["store_id"]; + elseif(isset($this->columns["store_id"]["default"])) + return $this->columns["store_id"]["default"]; + else return null; + } + else{ + $this->instance["store_id"] = func_get_arg(0); + } + } + + public function id(){ + if(func_num_args() == 0){ + if(isset($this->instance["id"])) + return $this->instance["id"]; + elseif(isset($this->columns["id"]["default"])) + return $this->columns["id"]["default"]; + else return null; + } + else{ + $this->instance["id"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/classlib2.0/data/models/PurchaseOrderItemsModel.php b/fannie/classlib2.0/data/models/PurchaseOrderItemsModel.php new file mode 100644 index 000000000..40f3f4dbf --- /dev/null +++ b/fannie/classlib2.0/data/models/PurchaseOrderItemsModel.php @@ -0,0 +1,239 @@ + array('type'=>'INT','primary_key'=>True), + 'sku' => array('type'=>'VARCHAR(13)','primary_key'=>True), + 'quantity' => array('type'=>'INT'), + 'unitCost' => array('type'=>'MONEY'), + 'caseSize' => array('type'=>'INT'), + 'receivedDate' => array('type'=>'DATETIME'), + 'receivedQty' => array('type'=>'INT'), + 'receivedTotalCost' => array('type'=>'MONEY'), + 'unitSize' => array('type'=>'VARCHAR(25)'), + 'brand' => array('type'=>'VARCHAR(50)'), + 'description' => array('type'=>'VARCHAR(50)'), + 'internalUPC' => array('type'=>'VARCHAR(13)') + ); + + protected $preferred_db = 'op'; + + /** + A really, REALLY old version of this table might exist. + If so, just delete it and start over with the new schema. + */ + public function normalize($db_name, $mode=BasicModel::NORMALIZE_MODE_CHECK, $doCreate=False){ + $dbc = FannieDB::get($db_name); + $this->connection = $dbc; + if (!$dbc->table_exists($this->name)) + return parent::normalize($db_name, $mode, $doCreate); + $def = $dbc->table_definition($this->name); + if (count($def)==4 && isset($def['upc']) && isset($def['vendor_id']) && isset($def['order_id']) && isset($def['quantity'])){ + echo "==========================================\n"; + if ($mode == BasicModel::NORMALIZE_MODE_APPLY){ + $dbc->query('DROP TABLE '.$dbc->identifier_escape($this->name)); + $success = $this->create(); + echo "Recreating table ".$this->name.": "; + echo ($success) ? 'Succeeded' : 'Failed'; + echo "\n"; + echo "==========================================\n"; + return $success; + } + else { + echo $this->name." is very old. It needs to be re-created\n"; + echo "Any data in the current table will be lost\n"; + echo "==========================================\n"; + return count($this->columns); + } + } + else + return parent::normalize($db_name, $mode, $doCreate); + } + + /* START ACCESSOR FUNCTIONS */ + + public function orderID(){ + if(func_num_args() == 0){ + if(isset($this->instance["orderID"])) + return $this->instance["orderID"]; + elseif(isset($this->columns["orderID"]["default"])) + return $this->columns["orderID"]["default"]; + else return null; + } + else{ + $this->instance["orderID"] = func_get_arg(0); + } + } + + public function sku(){ + if(func_num_args() == 0){ + if(isset($this->instance["sku"])) + return $this->instance["sku"]; + elseif(isset($this->columns["sku"]["default"])) + return $this->columns["sku"]["default"]; + else return null; + } + else{ + $this->instance["sku"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + + public function unitCost(){ + if(func_num_args() == 0){ + if(isset($this->instance["unitCost"])) + return $this->instance["unitCost"]; + elseif(isset($this->columns["unitCost"]["default"])) + return $this->columns["unitCost"]["default"]; + else return null; + } + else{ + $this->instance["unitCost"] = func_get_arg(0); + } + } + + public function caseSize(){ + if(func_num_args() == 0){ + if(isset($this->instance["caseSize"])) + return $this->instance["caseSize"]; + elseif(isset($this->columns["caseSize"]["default"])) + return $this->columns["caseSize"]["default"]; + else return null; + } + else{ + $this->instance["caseSize"] = func_get_arg(0); + } + } + + public function receivedDate(){ + if(func_num_args() == 0){ + if(isset($this->instance["receivedDate"])) + return $this->instance["receivedDate"]; + elseif(isset($this->columns["receivedDate"]["default"])) + return $this->columns["receivedDate"]["default"]; + else return null; + } + else{ + $this->instance["receivedDate"] = func_get_arg(0); + } + } + + public function receivedQty(){ + if(func_num_args() == 0){ + if(isset($this->instance["receivedQty"])) + return $this->instance["receivedQty"]; + elseif(isset($this->columns["receivedQty"]["default"])) + return $this->columns["receivedQty"]["default"]; + else return null; + } + else{ + $this->instance["receivedQty"] = func_get_arg(0); + } + } + + public function receivedTotalCost(){ + if(func_num_args() == 0){ + if(isset($this->instance["receivedTotalCost"])) + return $this->instance["receivedTotalCost"]; + elseif(isset($this->columns["receivedTotalCost"]["default"])) + return $this->columns["receivedTotalCost"]["default"]; + else return null; + } + else{ + $this->instance["receivedTotalCost"] = func_get_arg(0); + } + } + + public function unitSize(){ + if(func_num_args() == 0){ + if(isset($this->instance["unitSize"])) + return $this->instance["unitSize"]; + elseif(isset($this->columns["unitSize"]["default"])) + return $this->columns["unitSize"]["default"]; + else return null; + } + else{ + $this->instance["unitSize"] = func_get_arg(0); + } + } + + public function brand(){ + if(func_num_args() == 0){ + if(isset($this->instance["brand"])) + return $this->instance["brand"]; + elseif(isset($this->columns["brand"]["default"])) + return $this->columns["brand"]["default"]; + else return null; + } + else{ + $this->instance["brand"] = func_get_arg(0); + } + } + + public function description(){ + if(func_num_args() == 0){ + if(isset($this->instance["description"])) + return $this->instance["description"]; + elseif(isset($this->columns["description"]["default"])) + return $this->columns["description"]["default"]; + else return null; + } + else{ + $this->instance["description"] = func_get_arg(0); + } + } + + public function internalUPC(){ + if(func_num_args() == 0){ + if(isset($this->instance["internalUPC"])) + return $this->instance["internalUPC"]; + elseif(isset($this->columns["internalUPC"]["default"])) + return $this->columns["internalUPC"]["default"]; + else return null; + } + else{ + $this->instance["internalUPC"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/PurchaseOrderModel.php b/fannie/classlib2.0/data/models/PurchaseOrderModel.php new file mode 100644 index 000000000..8d5c53d4a --- /dev/null +++ b/fannie/classlib2.0/data/models/PurchaseOrderModel.php @@ -0,0 +1,155 @@ + array('type'=>'INT','default'=>0,'increment'=>True,'primary_key'=>True), + 'vendorID' => array('type'=>'INT'), + 'creationDate' => array('type'=>'DATETIME'), + 'placed' => array('type'=>'TINYINT','default'=>0,'index'=>True), + 'placedDate' => array('type'=>'DATETIME'), + 'userID' => array('type'=>'INT') + ); + + protected $preferred_db = 'op'; + + /** + A really, REALLY old version of this table might exist. + If so, just delete it and start over with the new schema. + */ + public function normalize($db_name, $mode=BasicModel::NORMALIZE_MODE_CHECK, $doCreate=False){ + $dbc = FannieDB::get($db_name); + $this->connection = $dbc; + if (!$dbc->table_exists($this->name)) + return parent::normalize($db_name, $mode, $doCreate); + $def = $dbc->table_definition($this->name); + if (count($def)==3 && isset($def['stamp']) && isset($def['id']) && isset($def['name'])){ + echo "==========================================\n"; + if ($mode == BasicModel::NORMALIZE_MODE_APPLY){ + $dbc->query('DROP TABLE '.$dbc->identifier_escape($this->name)); + $success = $this->create(); + echo "Recreating table ".$this->name.": "; + echo ($success) ? 'Succeeded' : 'Failed'; + echo "\n"; + echo "==========================================\n"; + return $success; + } + else { + echo $this->name." is very old. It needs to be re-created\n"; + echo "Any data in the current table will be lost\n"; + echo "==========================================\n"; + return count($this->columns); + } + } + else + return parent::normalize($db_name, $mode, $doCreate); + } + + /* START ACCESSOR FUNCTIONS */ + + public function orderID(){ + if(func_num_args() == 0){ + if(isset($this->instance["orderID"])) + return $this->instance["orderID"]; + elseif(isset($this->columns["orderID"]["default"])) + return $this->columns["orderID"]["default"]; + else return null; + } + else{ + $this->instance["orderID"] = func_get_arg(0); + } + } + + public function vendorID(){ + if(func_num_args() == 0){ + if(isset($this->instance["vendorID"])) + return $this->instance["vendorID"]; + elseif(isset($this->columns["vendorID"]["default"])) + return $this->columns["vendorID"]["default"]; + else return null; + } + else{ + $this->instance["vendorID"] = func_get_arg(0); + } + } + + public function creationDate(){ + if(func_num_args() == 0){ + if(isset($this->instance["creationDate"])) + return $this->instance["creationDate"]; + elseif(isset($this->columns["creationDate"]["default"])) + return $this->columns["creationDate"]["default"]; + else return null; + } + else{ + $this->instance["creationDate"] = func_get_arg(0); + } + } + + public function placed(){ + if(func_num_args() == 0){ + if(isset($this->instance["placed"])) + return $this->instance["placed"]; + elseif(isset($this->columns["placed"]["default"])) + return $this->columns["placed"]["default"]; + else return null; + } + else{ + $this->instance["placed"] = func_get_arg(0); + } + } + + public function placedDate(){ + if(func_num_args() == 0){ + if(isset($this->instance["placedDate"])) + return $this->instance["placedDate"]; + elseif(isset($this->columns["placedDate"]["default"])) + return $this->columns["placedDate"]["default"]; + else return null; + } + else{ + $this->instance["placedDate"] = func_get_arg(0); + } + } + + public function userID(){ + if(func_num_args() == 0){ + if(isset($this->instance["userID"])) + return $this->instance["userID"]; + elseif(isset($this->columns["userID"]["default"])) + return $this->columns["userID"]["default"]; + else return null; + } + else{ + $this->instance["userID"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/ReasoncodesModel.php b/fannie/classlib2.0/data/models/ReasoncodesModel.php new file mode 100644 index 000000000..c22ae2e23 --- /dev/null +++ b/fannie/classlib2.0/data/models/ReasoncodesModel.php @@ -0,0 +1,67 @@ + array('type'=>'VARCHAR(100)'), + 'mask' => array('type'=>'INT','primary_key'=>True,'default'=>0) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function textStr(){ + if(func_num_args() == 0){ + if(isset($this->instance["textStr"])) + return $this->instance["textStr"]; + elseif(isset($this->columns["textStr"]["default"])) + return $this->columns["textStr"]["default"]; + else return null; + } + else{ + $this->instance["textStr"] = func_get_arg(0); + } + } + + public function mask(){ + if(func_num_args() == 0){ + if(isset($this->instance["mask"])) + return (int)$this->instance["mask"]; + elseif(isset($this->columns["mask"]["default"])) + return (int)$this->columns["mask"]["default"]; + else return null; + } + else{ + $this->instance["mask"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/StockpurchasesModel.php b/fannie/classlib2.0/data/models/StockpurchasesModel.php new file mode 100644 index 000000000..3744e3dc0 --- /dev/null +++ b/fannie/classlib2.0/data/models/StockpurchasesModel.php @@ -0,0 +1,109 @@ + array('type'=>'INT','index'=>True), + 'stockPurchase' => array('type','MONEY'), + 'tdate' => array('type','DATETIME'), + 'trans_num' => array('type','VARCHAR(50)'), + 'dept' => array('type','INT') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function stockPurchase(){ + if(func_num_args() == 0){ + if(isset($this->instance["stockPurchase"])) + return $this->instance["stockPurchase"]; + elseif(isset($this->columns["stockPurchase"]["default"])) + return $this->columns["stockPurchase"]["default"]; + else return null; + } + else{ + $this->instance["stockPurchase"] = func_get_arg(0); + } + } + + public function tdate(){ + if(func_num_args() == 0){ + if(isset($this->instance["tdate"])) + return $this->instance["tdate"]; + elseif(isset($this->columns["tdate"]["default"])) + return $this->columns["tdate"]["default"]; + else return null; + } + else{ + $this->instance["tdate"] = func_get_arg(0); + } + } + + public function trans_num(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_num"])) + return $this->instance["trans_num"]; + elseif(isset($this->columns["trans_num"]["default"])) + return $this->columns["trans_num"]["default"]; + else return null; + } + else{ + $this->instance["trans_num"] = func_get_arg(0); + } + } + + public function dept(){ + if(func_num_args() == 0){ + if(isset($this->instance["dept"])) + return $this->instance["dept"]; + elseif(isset($this->columns["dept"]["default"])) + return $this->columns["dept"]["default"]; + else return null; + } + else{ + $this->instance["dept"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/SuspensionHistoryModel.php b/fannie/classlib2.0/data/models/SuspensionHistoryModel.php new file mode 100644 index 000000000..f7293792a --- /dev/null +++ b/fannie/classlib2.0/data/models/SuspensionHistoryModel.php @@ -0,0 +1,109 @@ + array('type'=>'VARCHAR(50)'), + 'postdate' => array('type'=>'DATETIME'), + 'post' => array('type'=>'TEXT'), + 'cardno' => array('type'=>'INT'), + 'reasoncode' => array('type'=>'INT') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function username(){ + if(func_num_args() == 0){ + if(isset($this->instance["username"])) + return $this->instance["username"]; + elseif(isset($this->columns["username"]["default"])) + return $this->columns["username"]["default"]; + else return null; + } + else{ + $this->instance["username"] = func_get_arg(0); + } + } + + public function postdate(){ + if(func_num_args() == 0){ + if(isset($this->instance["postdate"])) + return $this->instance["postdate"]; + elseif(isset($this->columns["postdate"]["default"])) + return $this->columns["postdate"]["default"]; + else return null; + } + else{ + $this->instance["postdate"] = func_get_arg(0); + } + } + + public function post(){ + if(func_num_args() == 0){ + if(isset($this->instance["post"])) + return $this->instance["post"]; + elseif(isset($this->columns["post"]["default"])) + return $this->columns["post"]["default"]; + else return null; + } + else{ + $this->instance["post"] = func_get_arg(0); + } + } + + public function cardno(){ + if(func_num_args() == 0){ + if(isset($this->instance["cardno"])) + return $this->instance["cardno"]; + elseif(isset($this->columns["cardno"]["default"])) + return $this->columns["cardno"]["default"]; + else return null; + } + else{ + $this->instance["cardno"] = func_get_arg(0); + } + } + + public function reasoncode(){ + if(func_num_args() == 0){ + if(isset($this->instance["reasoncode"])) + return $this->instance["reasoncode"]; + elseif(isset($this->columns["reasoncode"]["default"])) + return $this->columns["reasoncode"]["default"]; + else return null; + } + else{ + $this->instance["reasoncode"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/SuspensionsModel.php b/fannie/classlib2.0/data/models/SuspensionsModel.php new file mode 100644 index 000000000..ea41658d2 --- /dev/null +++ b/fannie/classlib2.0/data/models/SuspensionsModel.php @@ -0,0 +1,179 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'type' => array('type'=>'CHAR(1)'), + 'memtype1' => array('type'=>'INT'), + 'memtype2' => array('type'=>'VARCHAR(6)'), + 'suspDate' => array('type'=>'DATETIME'), + 'reason' => array('type'=>'TEXT'), + 'mailflag' => array('type'=>'INT'), + 'discount' => array('type'=>'INT'), + 'chargelimit' => array('type'=>'MONEY'), + 'reasoncode' => array('type'=>'INT') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function cardno(){ + if(func_num_args() == 0){ + if(isset($this->instance["cardno"])) + return $this->instance["cardno"]; + elseif(isset($this->columns["cardno"]["default"])) + return $this->columns["cardno"]["default"]; + else return null; + } + else{ + $this->instance["cardno"] = func_get_arg(0); + } + } + + public function type(){ + if(func_num_args() == 0){ + if(isset($this->instance["type"])) + return $this->instance["type"]; + elseif(isset($this->columns["type"]["default"])) + return $this->columns["type"]["default"]; + else return null; + } + else{ + $this->instance["type"] = func_get_arg(0); + } + } + + public function memtype1(){ + if(func_num_args() == 0){ + if(isset($this->instance["memtype1"])) + return $this->instance["memtype1"]; + elseif(isset($this->columns["memtype1"]["default"])) + return $this->columns["memtype1"]["default"]; + else return null; + } + else{ + $this->instance["memtype1"] = func_get_arg(0); + } + } + + public function memtype2(){ + if(func_num_args() == 0){ + if(isset($this->instance["memtype2"])) + return $this->instance["memtype2"]; + elseif(isset($this->columns["memtype2"]["default"])) + return $this->columns["memtype2"]["default"]; + else return null; + } + else{ + $this->instance["memtype2"] = func_get_arg(0); + } + } + + public function suspDate(){ + if(func_num_args() == 0){ + if(isset($this->instance["suspDate"])) + return $this->instance["suspDate"]; + elseif(isset($this->columns["suspDate"]["default"])) + return $this->columns["suspDate"]["default"]; + else return null; + } + else{ + $this->instance["suspDate"] = func_get_arg(0); + } + } + + public function reason(){ + if(func_num_args() == 0){ + if(isset($this->instance["reason"])) + return $this->instance["reason"]; + elseif(isset($this->columns["reason"]["default"])) + return $this->columns["reason"]["default"]; + else return null; + } + else{ + $this->instance["reason"] = func_get_arg(0); + } + } + + public function mailflag(){ + if(func_num_args() == 0){ + if(isset($this->instance["mailflag"])) + return $this->instance["mailflag"]; + elseif(isset($this->columns["mailflag"]["default"])) + return $this->columns["mailflag"]["default"]; + else return null; + } + else{ + $this->instance["mailflag"] = func_get_arg(0); + } + } + + public function discount(){ + if(func_num_args() == 0){ + if(isset($this->instance["discount"])) + return $this->instance["discount"]; + elseif(isset($this->columns["discount"]["default"])) + return $this->columns["discount"]["default"]; + else return null; + } + else{ + $this->instance["discount"] = func_get_arg(0); + } + } + + public function chargelimit(){ + if(func_num_args() == 0){ + if(isset($this->instance["chargelimit"])) + return $this->instance["chargelimit"]; + elseif(isset($this->columns["chargelimit"]["default"])) + return $this->columns["chargelimit"]["default"]; + else return null; + } + else{ + $this->instance["chargelimit"] = func_get_arg(0); + } + } + + public function reasoncode(){ + if(func_num_args() == 0){ + if(isset($this->instance["reasoncode"])) + return $this->instance["reasoncode"]; + elseif(isset($this->columns["reasoncode"]["default"])) + return $this->columns["reasoncode"]["default"]; + else return null; + } + else{ + $this->instance["reasoncode"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/TendersModel.php b/fannie/classlib2.0/data/models/TendersModel.php new file mode 100644 index 000000000..c2055cb1a --- /dev/null +++ b/fannie/classlib2.0/data/models/TendersModel.php @@ -0,0 +1,149 @@ + array('type'=>'SMALLINT','primary_key'=>True), + 'TenderCode' => array('type'=>'VARCHAR(2)','index'=>True), + 'TenderName' => array('type'=>'VARCHAR(25)'), + 'TenderType' => array('type'=>'VARCHAR(2)'), + 'ChangeMessage' => array('type'=>'VARCHAR(25)'), + 'MinAmount' => array('type'=>'MONEY','default'=>0.01), + 'MaxAmount' => array('type'=>'MONEY','default'=>1000.00), + 'MaxRefund' => array('type'=>'MONEY','default'=>1000.00) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function TenderID(){ + if(func_num_args() == 0){ + if(isset($this->instance["TenderID"])) + return $this->instance["TenderID"]; + elseif(isset($this->columns["TenderID"]["default"])) + return $this->columns["TenderID"]["default"]; + else return null; + } + else{ + $this->instance["TenderID"] = func_get_arg(0); + } + } + + public function TenderCode(){ + if(func_num_args() == 0){ + if(isset($this->instance["TenderCode"])) + return $this->instance["TenderCode"]; + elseif(isset($this->columns["TenderCode"]["default"])) + return $this->columns["TenderCode"]["default"]; + else return null; + } + else{ + $this->instance["TenderCode"] = func_get_arg(0); + } + } + + public function TenderName(){ + if(func_num_args() == 0){ + if(isset($this->instance["TenderName"])) + return $this->instance["TenderName"]; + elseif(isset($this->columns["TenderName"]["default"])) + return $this->columns["TenderName"]["default"]; + else return null; + } + else{ + $this->instance["TenderName"] = func_get_arg(0); + } + } + + public function TenderType(){ + if(func_num_args() == 0){ + if(isset($this->instance["TenderType"])) + return $this->instance["TenderType"]; + elseif(isset($this->columns["TenderType"]["default"])) + return $this->columns["TenderType"]["default"]; + else return null; + } + else{ + $this->instance["TenderType"] = func_get_arg(0); + } + } + + public function ChangeMessage(){ + if(func_num_args() == 0){ + if(isset($this->instance["ChangeMessage"])) + return $this->instance["ChangeMessage"]; + elseif(isset($this->columns["ChangeMessage"]["default"])) + return $this->columns["ChangeMessage"]["default"]; + else return null; + } + else{ + $this->instance["ChangeMessage"] = func_get_arg(0); + } + } + + public function MinAmount(){ + if(func_num_args() == 0){ + if(isset($this->instance["MinAmount"])) + return $this->instance["MinAmount"]; + elseif(isset($this->columns["MinAmount"]["default"])) + return $this->columns["MinAmount"]["default"]; + else return null; + } + else{ + $this->instance["MinAmount"] = func_get_arg(0); + } + } + + public function MaxAmount(){ + if(func_num_args() == 0){ + if(isset($this->instance["MaxAmount"])) + return $this->instance["MaxAmount"]; + elseif(isset($this->columns["MaxAmount"]["default"])) + return $this->columns["MaxAmount"]["default"]; + else return null; + } + else{ + $this->instance["MaxAmount"] = func_get_arg(0); + } + } + + public function MaxRefund(){ + if(func_num_args() == 0){ + if(isset($this->instance["MaxRefund"])) + return $this->instance["MaxRefund"]; + elseif(isset($this->columns["MaxRefund"]["default"])) + return $this->columns["MaxRefund"]["default"]; + else return null; + } + else{ + $this->instance["MaxRefund"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} + +?> diff --git a/fannie/classlib2.0/data/models/orm/OrmConstraint.php b/fannie/classlib2.0/data/models/orm/OrmConstraint.php new file mode 100644 index 000000000..129985e7b --- /dev/null +++ b/fannie/classlib2.0/data/models/orm/OrmConstraint.php @@ -0,0 +1,206 @@ +pieces as $p){ + $sql .= $p['sql'].' AND '; + $args += $args; + } + if (substr($sql,-4) == 'AND '){ + $sql = substr($sql,0,strlen($sql)-4).')'; + } + return array('sql'=>$sql,'args'=>$args); + } + + public function _or($c1, $c2){ + $left = $c1->export(); + $right = $c2->export(); + $sql = $left['sql'].' OR '.$right['sql']; + $args = $left['args'] + $right['args']; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + public function ne($model, $op1, $op2){ + $sql = ' '; + $args = array(); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' <> '; + if (method_exists($model, $op2)) + $sql .= $model->db()->identifier_escape($op2); + else { + $sql .= '?'; + $args[] = $op2; + } + $sql .= ' '; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + public function gt($model, $op1, $op2){ + $sql = ' '; + $args = array(); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' > '; + if (method_exists($model, $op2)) + $sql .= $model->db()->identifier_escape($op2); + else { + $sql .= '?'; + $args[] = $op2; + } + $sql .= ' '; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + public function gte($model, $op1, $op2){ + $sql = ' '; + $args = array(); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' >= '; + if (method_exists($model, $op2)) + $sql .= $model->db()->identifier_escape($op2); + else { + $sql .= '?'; + $args[] = $op2; + } + $sql .= ' '; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + public function lt($model, $op1, $op2){ + $sql = ' '; + $args = array(); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' < '; + if (method_exists($model, $op2)) + $sql .= $model->db()->identifier_escape($op2); + else { + $sql .= '?'; + $args[] = $op2; + } + $sql .= ' '; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + public function lte($model, $op1, $op2){ + $sql = ' '; + $args = array(); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' <= '; + if (method_exists($model, $op2)) + $sql .= $model->db()->identifier_escape($op2); + else { + $sql .= '?'; + $args[] = $op2; + } + $sql .= ' '; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + public function between($model, $op1, $op2, $op3){ + $sql = ' '; + $args = array(); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' BETWEEN '; + if (method_exists($model, $op2)) + $sql .= $model->db()->identifier_escape($op2); + else { + $sql .= '?'; + $args[] = $op2; + } + $sql .= ' AND '; + if (method_exists($model, $op3)) + $sql .= $model->db()->identifier_escape($op3); + else { + $sql .= '?'; + $args[] = $op3; + } + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + + function in(){ + if(func_num_args() < 3) return; + $model = func_get_arg(0); + if(!is_object($model)) return; + $sql = ' '; + $args = array(); + $op1 = func_get_arg(1); + if (method_exists($model, $op1)) + $sql .= $model->db()->identifier_escape($op1); + else { + $sql .= '?'; + $args[] = $op1; + } + $sql .= ' IN ('; + for($i=2;$idb()->identifier_escape($op); + else { + $sql .= '?'; + $args[] = $op; + } + $sql .= ','; + } + $sql = substr($sql,0,strlen($sql)-1).')'; + $this->pieces[] = array('sql'=>$sql,'args'=>$args); + } + +} diff --git a/fannie/classlib2.0/data/models/orm/ReportModel.php b/fannie/classlib2.0/data/models/orm/ReportModel.php new file mode 100644 index 000000000..64f6fe0e3 --- /dev/null +++ b/fannie/classlib2.0/data/models/orm/ReportModel.php @@ -0,0 +1,68 @@ +columns as $name => $definition){ + $sql .= $definition.' as '.$this->connection->identifier_escape($name).','; + } + $sql = substr($sql,0,strlen($sql)-1); + + $sql .= ' FROM '; + foreach($this->tables as $name => $join){ + if (!empty($join)) + $sql .= ' '.$join['type'].' '; + $sql .= $name; + if (!empty($join)) + $sql .= ' '.$join['on'].' '; + } + if (!empty($this->where)) + $sql .= ' WHERE '.$this->where; + if (!empty($this->group_by)) + $sql .= ' GROUP BY '.$this->group_by; + if (!empty($this->having)) + $sql .= ' HAVING '.$this->having; + if (!empty($this->order_by)) + $sql .= ' ORDER BY '.$this->order_by; + } +} + +?> diff --git a/fannie/classlib2.0/data/models/vmodels/ArLiveBalanceModel.php b/fannie/classlib2.0/data/models/vmodels/ArLiveBalanceModel.php new file mode 100644 index 000000000..3f5f88579 --- /dev/null +++ b/fannie/classlib2.0/data/models/vmodels/ArLiveBalanceModel.php @@ -0,0 +1,112 @@ + array('type'=>'INT','primary_key'=>True), + 'totcharges' => array('type'=>'MONEY'), + 'totpayments' => array('type'=>'MONEY'), + 'balance' => array('type'=>'MONEY'), + 'mark' => array('type'=>'TINYINT') + ); + + public function create(){ return False; } + public function delete(){ return False; } + public function save(){ return False; } + public function normalize(){ return 0; } + + /* START ACCESSOR FUNCTIONS */ + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function totcharges(){ + if(func_num_args() == 0){ + if(isset($this->instance["totcharges"])) + return $this->instance["totcharges"]; + elseif(isset($this->columns["totcharges"]["default"])) + return $this->columns["totcharges"]["default"]; + else return null; + } + else{ + $this->instance["totcharges"] = func_get_arg(0); + } + } + + public function totpayments(){ + if(func_num_args() == 0){ + if(isset($this->instance["totpayments"])) + return $this->instance["totpayments"]; + elseif(isset($this->columns["totpayments"]["default"])) + return $this->columns["totpayments"]["default"]; + else return null; + } + else{ + $this->instance["totpayments"] = func_get_arg(0); + } + } + + public function balance(){ + if(func_num_args() == 0){ + if(isset($this->instance["balance"])) + return $this->instance["balance"]; + elseif(isset($this->columns["balance"]["default"])) + return $this->columns["balance"]["default"]; + else return null; + } + else{ + $this->instance["balance"] = func_get_arg(0); + } + } + + public function mark(){ + if(func_num_args() == 0){ + if(isset($this->instance["mark"])) + return $this->instance["mark"]; + elseif(isset($this->columns["mark"]["default"])) + return $this->columns["mark"]["default"]; + else return null; + } + else{ + $this->instance["mark"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/data/models/vmodels/EquityLiveBalanceModel.php b/fannie/classlib2.0/data/models/vmodels/EquityLiveBalanceModel.php new file mode 100644 index 000000000..1f000e9f6 --- /dev/null +++ b/fannie/classlib2.0/data/models/vmodels/EquityLiveBalanceModel.php @@ -0,0 +1,84 @@ + array('type'=>'INT','primary_key'=>True), + 'payments' => array('type','MONEY'), + 'startdate' => array('type','DATETIME') + ); + + public function create(){ return False; } + public function delete(){ return False; } + public function save(){ return False; } + public function normalize(){ return 0; } + + /* START ACCESSOR FUNCTIONS */ + + public function memnum(){ + if(func_num_args() == 0){ + if(isset($this->instance["memnum"])) + return $this->instance["memnum"]; + elseif(isset($this->columns["memnum"]["default"])) + return $this->columns["memnum"]["default"]; + else return null; + } + else{ + $this->instance["memnum"] = func_get_arg(0); + } + } + + public function payments(){ + if(func_num_args() == 0){ + if(isset($this->instance["payments"])) + return $this->instance["payments"]; + elseif(isset($this->columns["payments"]["default"])) + return $this->columns["payments"]["default"]; + else return null; + } + else{ + $this->instance["payments"] = func_get_arg(0); + } + } + + public function startdate(){ + if(func_num_args() == 0){ + if(isset($this->instance["startdate"])) + return $this->instance["startdate"]; + elseif(isset($this->columns["startdate"]["default"])) + return $this->columns["startdate"]["default"]; + else return null; + } + else{ + $this->instance["startdate"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} +?> diff --git a/fannie/classlib2.0/item/ItemModule.php b/fannie/classlib2.0/item/ItemModule.php new file mode 100644 index 000000000..78159e73f --- /dev/null +++ b/fannie/classlib2.0/item/ItemModule.php @@ -0,0 +1,57 @@ + diff --git a/fannie/classlib2.0/lib/FormLib.php b/fannie/classlib2.0/lib/FormLib.php new file mode 100644 index 000000000..50e2a100a --- /dev/null +++ b/fannie/classlib2.0/lib/FormLib.php @@ -0,0 +1,124 @@ + + Other dates + + + + + +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + ", + $one,$today[0],$two,$today[1], + $one,$this_week[0],$two,$this_week[1], + $one,$this_month[0],$two,$this_month[1], + $one,$yesterday[0],$two,$yesterday[1], + $one,$last_week[0],$two,$last_week[1], + $one,$last_month[0],$two,$last_month[1] + ); + + return $extra_opts; + } + +} + +?> diff --git a/fannie/classlib2.0/lib/PriceLib.php b/fannie/classlib2.0/lib/PriceLib.php new file mode 100644 index 000000000..935079a48 --- /dev/null +++ b/fannie/classlib2.0/lib/PriceLib.php @@ -0,0 +1,119 @@ + diff --git a/fannie/config.php.dist b/fannie/config.php.dist new file mode 100644 index 000000000..d5ad52163 --- /dev/null +++ b/fannie/config.php.dist @@ -0,0 +1,5 @@ + diff --git a/fannie/cron/CC/GoECorrections.php b/fannie/cron/CC/GoECorrections.php new file mode 100644 index 000000000..33b84d7c0 --- /dev/null +++ b/fannie/cron/CC/GoECorrections.php @@ -0,0 +1,60 @@ + 0){ + dovoid($void_ids); +} + + +?> diff --git a/fannie/cron/CompressProdUpdate/archive.php b/fannie/cron/CompressProdUpdate/archive.php new file mode 100644 index 000000000..a26c39d84 --- /dev/null +++ b/fannie/cron/CompressProdUpdate/archive.php @@ -0,0 +1,58 @@ +query("INSERT INTO prodUpdateArchive SELECT * FROM prodUpdate"); +if ($worked){ + $sql->query("TRUNCATE TABLE prodUpdate"); +} +else { + echo "There was an archiving error on prodUpdate\n"; + flush(); +} + +?> diff --git a/fannie/cron/CompressProdUpdate/compress_dept.php b/fannie/cron/CompressProdUpdate/compress_dept.php new file mode 100644 index 000000000..57d120ee3 --- /dev/null +++ b/fannie/cron/CompressProdUpdate/compress_dept.php @@ -0,0 +1,90 @@ +query($q); +while($w = $sql->fetch_row($r)){ + if ($upc === null || $upc != $w['upc']){ + // next item, get previous + // date and price from compressed + // history if available + $upc = $w['upc']; + $prevDept = null; + $prevDate = null; + $chkR = $sql->query("SELECT modified,dept_ID FROM + prodDepartmentHistory WHERE upc='$upc' + ORDER BY modified DESC"); + if ($sql->num_rows($chkR) > 0){ + $chk = $sql->fetch_row($chkR); + $prevDate = $chk['modified']; + $prevDept = $chk['dept_ID']; + } + } + + if ($prevDept != $w['dept']){ // price changed + $ins = sprintf("INSERT INTO prodDepartmentHistory + (upc,modified,dept_ID,uid) + VALUES (%s,%s,%d,%d)", + $sql->escape($upc), + $sql->escape($w['modified']), + $w['dept'],$w['user']); + $sql->query($ins); + } + + $prevDept = $w['dept']; + $prevDate = $w['modified']; +} + + +?> diff --git a/fannie/cron/CompressProdUpdate/compress_price.php b/fannie/cron/CompressProdUpdate/compress_price.php new file mode 100644 index 000000000..0d27e3293 --- /dev/null +++ b/fannie/cron/CompressProdUpdate/compress_price.php @@ -0,0 +1,90 @@ +query($q); +while($w = $sql->fetch_row($r)){ + if ($upc === null || $upc != $w['upc']){ + // next item, get previous + // date and price from compressed + // history if available + $upc = $w['upc']; + $prevPrice = null; + $prevDate = null; + $chkR = $sql->query("SELECT modified,price FROM + prodPriceHistory WHERE upc='$upc' + ORDER BY modified DESC"); + if ($sql->num_rows($chkR) > 0){ + $chk = $sql->fetch_row($chkR); + $prevDate = $chk['modified']; + $prevPrice = $chk['price']; + } + } + + if ($prevPrice != $w['price']){ // price changed + $ins = sprintf("INSERT INTO prodPriceHistory + (upc,modified,price,uid) + VALUES (%s,%s,%.2f,%d)", + $sql->escape($upc), + $sql->escape($w['modified']), + $w['price'],$w['user']); + $sql->query($ins); + } + + $prevPrice = $w['price']; + $prevDate = $w['modified']; +} + + +?> diff --git a/fannie/cron/LanePush/UpdateCustBalance.php b/fannie/cron/LanePush/UpdateCustBalance.php new file mode 100644 index 000000000..84e2cdb11 --- /dev/null +++ b/fannie/cron/LanePush/UpdateCustBalance.php @@ -0,0 +1,74 @@ +query($fetchQ); +while($fetchW = $sql->fetch_row($fetchR)) + $data[$fetchW['CardNo']] = $fetchW['balance']; + +$errors = False; +// connect to each lane and update balances +foreach($FANNIE_LANES as $lane){ + $db = new SQLManager($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw']); + + if ($db === False){ + echo "Can't connect to lane: ".$lane['host']."\n"; + $errors = True; + continue; + } + + foreach($data as $cn => $bal){ + $upQ = sprintf("UPDATE custdata SET Balance=%.2f WHERE CardNo=%d", + $bal,$cn); + $db->query($upQ); + } +} + +if ($errors) { + echo "There was an error pushing balances to the lanes\n"; + flush(); +} + +?> diff --git a/fannie/cron/LanePush/UpdateUnpaidAR.php b/fannie/cron/LanePush/UpdateUnpaidAR.php new file mode 100644 index 000000000..41615e494 --- /dev/null +++ b/fannie/cron/LanePush/UpdateUnpaidAR.php @@ -0,0 +1,85 @@ +query($fetchQ); +while($fetchW = $sql->fetch_row($fetchR)) + $data[$fetchW['card_no']] = $fetchW['recent_payments']; + +$errors = False; +// connect to each lane and update payments +foreach($FANNIE_LANES as $lane){ + $db = new SQLManager($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw']); + + if ($db === False){ + echo "Can't connect to lane: ".$lane['host']."\n"; + $errors = True; + continue; + } + + foreach($data as $cn => $payment){ + $upQ = sprintf("UPDATE unpaid_ar_today SET recent_payments=%.2f WHERE card_no=%d", + $payment,$cn); + $db->query($upQ); + } +} + +if ($errors) { + echo "There was an error pushing unpaid AR info to the lanes\n"; + flush(); +} + +?> diff --git a/fannie/cron/Suspensions/deactivate.ar.php b/fannie/cron/Suspensions/deactivate.ar.php new file mode 100644 index 000000000..bed8463db --- /dev/null +++ b/fannie/cron/Suspensions/deactivate.ar.php @@ -0,0 +1,101 @@ +now().",m.ads_OK,c.Discount, + c.memDiscountLimit,1 + from meminfo as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join {$TRANS}ar_live_balance as n on m.card_no=n.card_no + left join {$TRANS}AR_EOM_Summary AS a ON a.cardno=m.card_no + where a.twoMonthBalance <= n.balance + AND a.lastMonthPayments < a.twoMonthBalance + and c.type='PC' and n.balance > 0 + and c.memtype in (1,3) + and NOT EXISTS(SELECT NULL FROM suspensions as s + WHERE s.cardno=m.card_no)"; +$sql->query($susQ); + +$histQ = "INSERT INTO suspension_history + select 'automatic',".$sql->now().",'', + m.card_no,1 + from meminfo as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join {$TRANS}ar_live_balance as n on m.card_no=n.card_no + left join {$TRANS}AR_EOM_Summary AS a ON a.cardno=m.card_no + where a.twoMonthBalance <= n.balance + AND a.lastMonthPayments < a.twoMonthBalance + and c.type='PC' and n.balance > 0 + and c.memtype in (1,3) + and NOT EXISTS(SELECT NULL FROM suspensions as s + WHERE s.cardno=m.card_no)"; +$sql->query($histQ); + +$custQ = "UPDATE custdata AS c + LEFT JOIN suspensions AS s ON c.CardNo=s.cardno + SET c.type='INACT',memType=0,c.Discount=0,memDiscountLimit=0 + WHERE c.type='PC' AND s.cardno is not null"; +$sql->query($custQ); + +$memQ = "UPDATE meminfo AS m + LEFT JOIN suspensions AS s ON m.card_no=s.cardno + SET ads_OK=0 + WHERE s.cardno is not null"; +$sql->query($memQ); + +?> diff --git a/fannie/cron/Suspensions/deactivate.equity.php b/fannie/cron/Suspensions/deactivate.equity.php new file mode 100644 index 000000000..be9f481ef --- /dev/null +++ b/fannie/cron/Suspensions/deactivate.equity.php @@ -0,0 +1,91 @@ +now().",m.ads_OK,c.Discount, + c.memDiscountLimit,4 + from meminfo as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join {$TRANS}newBalanceStockToday_test as n on m.card_no=n.memnum + left join memDates AS d ON m.card_no=d.card_no + WHERE + DATE_ADD(d.start_date, INTERVAL 2 YEAR) < '$dStr' + and c.Type='PC' and n.payments < 100 + and c.memType in (1,3) + and NOT EXISTS(SELECT NULL FROM suspensions as s + WHERE s.cardno=m.card_no)"; +$sql->query($susQ); + +$histQ = "INSERT INTO suspension_history + select 'automatic',".$sql->now().",'', + m.card_no,4 + from meminfo as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join {$TRANS}newBalanceStockToday_test as n on m.card_no=n.memnum + left join memDates AS d ON m.card_no=d.card_no + WHERE + DATE_ADD(d.start_date, INTERVAL 2 YEAR) < '$dStr' + and c.Type='PC' and n.payments < 100 + and c.memType in (1,3) + and NOT EXISTS(SELECT NULL FROM suspensions as s + WHERE s.cardno=m.card_no)"; +$sql->query($histQ); + +$custQ = "UPDATE custdata as c LEFT JOIN + suspensions as s on c.CardNo=s.cardno + SET c.type='INACT',memType=0,c.Discount=0, + memDiscountLimit=0 + where c.type='PC' and s.cardno is not null"; +$sql->query($custQ); + +$memQ = "UPDATE meminfo as m LEFT JOIN + suspensions as s ON m.card_no=s.cardno + SET ads_OK=0 + where s.cardno is not null"; +$sql->query($memQ); + +?> diff --git a/fannie/cron/Suspensions/reactivate.ar.php b/fannie/cron/Suspensions/reactivate.ar.php new file mode 100644 index 000000000..54eb9afb5 --- /dev/null +++ b/fannie/cron/Suspensions/reactivate.ar.php @@ -0,0 +1,106 @@ +query($meminfoQ); + +$custQ = "UPDATE custdata AS c LEFT JOIN {$TRANS}ar_live_balance AS s + ON c.CardNo=s.card_no LEFT JOIN suspensions AS p + ON c.CardNo=p.cardno LEFT JOIN {$TRANS}AR_EOM_Summary AS a + ON c.CardNo=a.cardno + SET c.Discount=p.discount,c.memDiscountLimit=p.chargelimit, + c.memType=p.memtype1,c.Type=p.memtype2,chargeOk=1 + WHERE c.Type = 'INACT' and p.reasoncode IN (1) + AND c.personNum=1 + AND s.balance < a.twoMonthBalance"; +$sql->query($custQ); + +$histQ = "insert into suspension_history + select 'AR paid',".$sql->now().", + 'Account reactivated',c.CardNo,0 from + suspensions as s left join + custdata as c on s.cardno=c.CardNo + and c.personNum=1 + where c.Type not in ('INACT','INACT2') and s.type='I'"; +$sql->query($histQ); + +$clearQ = "select c.CardNo from + suspensions as s left join + custdata as c on s.cardno=c.CardNo + where c.Type not in ('INACT','INACT2') and s.type='I' + AND c.personNum=1"; +$clearR = $sql->query($clearQ); +$cns = "("; +while($clearW = $sql->fetch_row($clearR)){ + $cns .= $clearW[0].","; +} +$cns = rtrim($cns,",").")"; + +if (strlen($cns) > 2){ + $delQ = "DELETE FROM suspensions WHERE cardno IN $cns"; + $delR = $sql->query($delQ); +} + +?> diff --git a/fannie/cron/Suspensions/reactivate.equity.php b/fannie/cron/Suspensions/reactivate.equity.php new file mode 100644 index 000000000..3e1a2962f --- /dev/null +++ b/fannie/cron/Suspensions/reactivate.equity.php @@ -0,0 +1,91 @@ += 100"; +$sql->query($meminfoQ); + +$custQ = "UPDATE custdata AS c LEFT JOIN {$TRANS}newBalanceStockToday_test AS s + ON c.CardNo=s.memnum LEFT JOIN suspensions AS p + ON c.CardNo=p.cardno + SET c.Discount=p.discount,c.memDiscountLimit=p.chargelimit, + c.memType=p.memtype1,c.Type=p.memtype2,chargeOk=1 + WHERE c.Type = 'INACT' and p.reasoncode IN (2,4,6) + AND s.payments >= 100"; +$sql->query($custQ); + +$histQ = "insert into suspension_history + select 'equity paid',".$sql->now().", + 'Account reactivated',c.CardNo,0 from + suspensions as s left join + custdata as c on s.cardno=c.CardNo + and c.personNum=1 + where c.Type not in ('INACT','INACT2') and s.type='I'"; +$sql->query($histQ); + +$clearQ = "select c.CardNo from + suspensions as s left join + custdata as c on s.cardno=c.CardNo + where c.Type not in ('INACT','INACT2') and s.type='I' + AND c.personNum=1"; +$clearR = $sql->query($clearQ); +$cns = "("; +while($clearW = $sql->fetch_row($clearR)){ + $cns .= $clearW[0].","; +} +$cns = rtrim($cns,",").")"; + +if ($cns != "()"){ + $delQ = "DELETE FROM suspensions WHERE cardno IN $cns"; + $delR = $sql->query($delQ); +} + + +?> diff --git a/fannie/cron/arbalance.sanitycheck.php b/fannie/cron/arbalance.sanitycheck.php new file mode 100644 index 000000000..934767756 --- /dev/null +++ b/fannie/cron/arbalance.sanitycheck.php @@ -0,0 +1,52 @@ +query($query); + +?> diff --git a/fannie/cron/chargelimit.fix.php b/fannie/cron/chargelimit.fix.php new file mode 100644 index 000000000..69b44a5a5 --- /dev/null +++ b/fannie/cron/chargelimit.fix.php @@ -0,0 +1,63 @@ +prepare_statement("select distinct card_no from {$TRANS}stockpurchases where tdate >= ?"); +$cardsR = $sql->exec_statement($cardsP, array($cutoff)); + +$chkP = $sql->prepare_statement("SELECT c.memDiscountLimit FROM custdata AS c INNER JOIN + {$TRANS}newBalanceStockToday_test AS s ON + c.CardNo=s.memnum AND c.personNum=1 + WHERE c.Type='PC' AND s.payments >= 100 + AND c.memDiscountLimit=0 AND c.CardNo=?"); +$upP = $sql->prepare_statement('UPDATE custdata SET memDiscountLimit=20 WHERE CardNo=?'); +while($cardsW = $sql->fetch_row($cardsR)){ + $chkR = $sql->exec_statement($chkP, array($cardsW[0])); + if ($sql->num_rows($chkR) == 0){ + continue; + } + else { + $sql->exec_statement($upP, array($cardsW[0])); + } +} + +?> diff --git a/fannie/cron/demographics.monthly.php b/fannie/cron/demographics.monthly.php new file mode 100644 index 000000000..aea234fc6 --- /dev/null +++ b/fannie/cron/demographics.monthly.php @@ -0,0 +1,67 @@ +query("TRUNCATE TABLE YTD_Patronage_MiddleStep"); +$ts = mktime(0,0,0,date("n"),1,date("Y")-1); +for($i=0;$i<12;$i++){ + $start = date("Y-m-d",$ts); + $end = date("Y-m-t",$ts); + $dlog = select_dtrans($start,$end); + $ts = mktime(0,0,0,date("n",$ts)+1,1,date("Y",$ts)); + $query = "INSERT INTO YTD_Patronage_MiddleStep + select d.card_no,MONTH(d.datetime) as month_no, + total, + YEAR(d.datetime) AS year_no, + DAY(d.datetime) AS day_no, + ".$dbc->concat( + $dbc->convert('emp_no','char'),"'-'", + $dbc->convert('register_no','char'),"'-'", + $dbc->convert('trans_no','char'),'') + ." as trans_num + from ".$dlog." as d + WHERE datetime BETWEEN '$start 00:00:00' AND '$end 23:59:59' + AND d.trans_type = 'T' AND total <> 0 + AND emp_no <> 9999 and register_no <> 99 AND trans_status NOT IN ('Z','X')"; + $dbc->query($query); +} + +$dbc->query("TRUNCATE TABLE YTD_Patronage_Speedup"); +$query = "INSERT INTO YTD_Patronage_Speedup + SELECT card_no,month_no,SUM(total) as total,year_no + FROM YTD_Patronage_MiddleStep AS d + LEFT JOIN custdata as c on c.CardNo=d.card_no and c.personNum=1 + LEFT JOIN suspensions as s on s.cardno = d.card_no + WHERE c.memType=1 or s.memtype1=1 + GROUP BY d.card_no, + year_no, month_no, day_no, trans_num"; +$dbc->query($query); + +?> diff --git a/fannie/cron/homeless.specialorder.php b/fannie/cron/homeless.specialorder.php new file mode 100644 index 000000000..5c1f2b277 --- /dev/null +++ b/fannie/cron/homeless.specialorder.php @@ -0,0 +1,79 @@ + 0 +) +and trans_id > 0 +order by datetime +"; + +$r = $sql->query($q); +if ($sql->num_rows($r) > 0){ + $msg_body = "Homeless orders detected!\n\n"; + while($w = $sql->fetch_row($r)){ + $msg_body .= $w['datetime'].' - '.(empty($w['name'])?'(no name)':$w['name']).' - '.$w['description']."\n"; + $msg_body .= "http://key".$FANNIE_URL."ordering/view.php?orderID=".$w['order_id']."\n\n"; + } + $msg_body .= "These messages will be sent daily until orders get departments\n"; + $msg_body .= "or orders are closed\n"; + + $to = "buyers, michael"; + $subject = "Incomplete SO(s)"; + mail($to,$subject,$msg_body); +} + +?> diff --git a/fannie/cron/lanes.clean.php b/fannie/cron/lanes.clean.php new file mode 100644 index 000000000..c0797a346 --- /dev/null +++ b/fannie/cron/lanes.clean.php @@ -0,0 +1,55 @@ +datediff($sql->now(),'datetime')." <> 0"; + $cleanR = $sql->query($cleanQ,$ln['trans']); + $cleanQ = "DELETE FROM localtrans WHERE ".$sql->datediff($sql->now(),'datetime')." > 30"; + $cleanR = $sql->query($cleanQ,$ln['trans']); + + $cleanQ = 'DELETE FROM efsnetTokens WHERE '.$sql->datediff($sql->now(),'expireDay').' <> 0 '; + $cleanR = $sql->query($cleanQ,$ln['trans']); +} + + +?> diff --git a/fannie/cron/lanesync.api.php b/fannie/cron/lanesync.api.php new file mode 100644 index 000000000..60864874e --- /dev/null +++ b/fannie/cron/lanesync.api.php @@ -0,0 +1,74 @@ + diff --git a/fannie/cron/manage.cache.php b/fannie/cron/manage.cache.php new file mode 100644 index 000000000..ccaebdea1 --- /dev/null +++ b/fannie/cron/manage.cache.php @@ -0,0 +1,59 @@ + diff --git a/fannie/cron/management/CronManagementPage.php b/fannie/cron/management/CronManagementPage.php new file mode 100644 index 000000000..f119ff058 --- /dev/null +++ b/fannie/cron/management/CronManagementPage.php @@ -0,0 +1,379 @@ + 0){ + $tmpfn = tempnam(sys_get_temp_dir(),""); + $fp = fopen($tmpfn,"w"); + if (!empty($email)) + fwrite($fp,"MAILTO=".$email."\n"); + foreach($indexes as $i){ + fprintf($fp,"%s %s %s %s %s %s\n", + $min[$i], + $hour[$i], + $day[$i], + $month[$i], + $wkdy[$i], + $cmd[$i] + ); + } + fclose($fp); + + $output = system("crontab $tmpfn 2>&1"); + + /* backup crontab just in case */ + $dbc = FannieDB::get($FANNIE_OP_DB); + $trun = $dbc->prepare_statement("TRUNCATE TABLE cronBackup"); + $dbc->exec_statement($trun); + $prep = $dbc->prepare_statement('INSERT INTO cronBackup VALUES ('.$dbc->now().', ?)'); + $dbc->exec_statement($prep,array(file_get_contents($tmpfn))); + + unlink($tmpfn); + } + } + return True; + } + + function body_content(){ + global $FANNIE_ROOT; + $ret = ''; + + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + $ret .= "PHP is running as: ".$chk['name']."
        "; + $ret .= "Fannie will attempt to use their crontab

        "; + } + else { + $ret .= "PHP is (probably) running as: ".get_current_user()."
        "; + $ret .= "This is probably Windows; this tool won't work

        "; + } + + if (!is_writable($FANNIE_ROOT.'logs/dayend.log')){ + $ret .= "Warning: dayend.log ({$FANNIE_ROOT}logs/dayend.log) + is not writable. Logging task results may + not work"; + } + else + $ret .= "Default logging will be to {$FANNIE_ROOT}logs/dayend.log"; + + $ret .= "
        Click the 'Command' link for popup Help."; + $ret .= "

        "; + + $jobs = $this->scan_scripts($FANNIE_ROOT.'cron',array()); + $tab = $this->read_crontab(); + + $mode = FormLib::get_form_value('mode','simple'); + + $ret .= "
        "; + $ret .= sprintf ('',$mode); + if ($mode == 'simple'){ + $ret .= 'Switch to Advanced View
        '; + } + else { + $ret .= 'Switch to Simple View
        '; + } + $ret .= "E-mail address:
        "; + + $ret .= ""; + $ret .= ""; + $i = 0; + foreach($jobs as $job){ + $shortname = substr($job,strlen($FANNIE_ROOT."cron/")); + $nicename = rtrim($shortname,'php'); + $nicename = rtrim($nicename,'.'); + $nicename = str_replace('.',' ',$nicename); + + $cmd = "cd {$FANNIE_ROOT}cron && php ./{$shortname} >> {$FANNIE_ROOT}logs/dayend.log"; + + $simple = $this->simple_row($shortname,$nicename,$cmd,$tab,$i); + if ($simple !== False && $mode == 'simple') + $ret .= $simple; + else + $ret .= $this->advanced_row($shortname,$nicename,$cmd,$tab,$i); + // defaults are set as once a year so someone doesn't accidentallly + // start firing a job off every minute + if (isset($tab['jobs'][$shortname])) + unset($tab['jobs'][$shortname]); + $i++; + } + + /* list out any jobs that WERE NOT covered + in the above loop. Those jobs weren't + set up by this tool and should not be edited + */ + foreach ($tab['jobs'] as $job){ + $ret .= sprintf(' + + + + + + + + ', + 'checked',$i, + $job['min'], + $job['hour'], + $job['day'], + $job['month'], + $job['year'], + $job['cmd'], + $job['cmd'] + ); + $i++; + } + + $ret .= "
        EnabledMinHourDayMonthWkdyCommand/Help
        %s

        "; + $ret .= ''; + $ret .= '
        '; + + return $ret; + } + + function simple_row($shortname,$nicename,$cmd,$tab,$i){ + $ret = ''; + $ret .= sprintf('', + (isset($tab['jobs'][$shortname])?'checked':''),$i); + + $ret .= sprintf('', + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['min']:'0')); + + $vals = array('*'=>'*',0=>'12AM'); + for($i=1;$i<24;$i++){ + $vals[$i] = (($i>12)?($i-12):$i) . (($i>11)?'PM':'AM'); + } + $ret .= ''; + if (!$matched) return False; + + $vals = array('*'=>'*'); + for($i=1;$i<32;$i++){ + $vals[$i] = $i; + } + $ret .= ''; + if (!$matched) return False; + + $vals = array('*'=>'*'); + for($i=1;$i<13;$i++){ + $vals[$i] = date('M',mktime(0,0,0,$i,1,2000)); + } + $ret .= ''; + if (!$matched) return False; + + $vals = array('*'=>'*'); + $ts = time(); + while(date('w',$ts) != 0) + $ts = mktime(0,0,0,date('n',$ts),date('j',$ts)+1,date('Y')); + for($i=0;$i<7;$i++){ + $vals[$i] = date('D',$ts); + $ts = mktime(0,0,0,date('n',$ts),date('j',$ts)+1,date('Y')); + } + $ret .= ''; + if (!$matched) return False; + + $ret .= sprintf(' + + %s + ', + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['cmd']:$cmd), + base64_encode($shortname),$nicename + ); + + return $ret; + } + + function advanced_row($shortname,$nicename,$cmd,$tab,$i){ + // defaults are set as once a year so someone doesn't accidentallly + // start firing a job off every minute + return sprintf(' + + + + + + + + %s + ', + (isset($tab['jobs'][$shortname])?'checked':''),$i, + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['min']:'0'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['hour']:'0'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['day']:'1'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['month']:'1'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['wkdy']:'*'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['cmd']:$cmd), + base64_encode($shortname),$nicename + ); + + } + + function scan_scripts($dir,$arr){ + if (!is_dir($dir)){ + if (substr($dir,-4) == ".php") + $arr[] = $dir; + return $arr; + } + else if (substr($dir,-11) == "/management"){ + return $arr; + } + else { + $dh = opendir($dir); + while(($file = readdir($dh)) !== false){ + if ($file == "." || $file == "..") + continue; + $arr = $this->scan_scripts($dir."/".$file,$arr); + } + return $arr; + } + } + + function read_crontab(){ + global $FANNIE_ROOT; + $pp = popen('crontab -l 2>&1','r'); + $lines = array(); + while(!feof($pp)) + $lines[] = fgets($pp); + pclose($pp); + $ret = array( + 'jobs' => array(), + 'email' => '' + ); + foreach($lines as $line){ + if($line === false) continue; + $line = trim($line); + if ($line[0] == "#") continue; + if (substr($line,0,6) == "MAILTO") + $ret['email'] = substr($line,7); + $tmp = preg_split("/\s+/",$line,6); + if (count($tmp) == 6){ + $sn = str_replace("cd {$FANNIE_ROOT}cron && php ./","",$tmp[5]); + $sn = str_replace(" >> {$FANNIE_ROOT}logs/dayend.log","",$sn); + $ret['jobs'][$sn] = array( + 'min' => $tmp[0], + 'hour' => $tmp[1], + 'day' => $tmp[2], + 'month' => $tmp[3], + 'wkdy' => $tmp[4], + 'cmd' => $tmp[5] + ); + } + } + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new CronManagementPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/cron/management/help.php b/fannie/cron/management/help.php new file mode 100644 index 000000000..4461adf73 --- /dev/null +++ b/fannie/cron/management/help.php @@ -0,0 +1,119 @@ + '9') + && ($c < 'a' || $c > 'z') + && ($c < 'A' || $c > 'Z') + && ($c != '+') + && ($c != '/') + && ($c != '=') + ) { + // Bad character found. + return false; + } + } + // Only good characters found. + return true; +} + +include('../../config.php'); + +$fn = isset($_REQUEST['fn'])?$_REQUEST['fn']:''; +if ($fn == ''){ + echo "No file specified"; + exit; +} + +if ( checkBase64Encoded($fn) ) { + $fn = $FANNIE_ROOT.'cron/'.base64_decode($fn); +} else { + $fn = $FANNIE_ROOT.'cron/'.urldecode($fn); +} +if ( ! file_exists($fn) ){ + echo "File: >${fn}< does not exist."; + exit; +} + +// Read the file into a string. +$data = file_get_contents($fn); +/* Parse into an array ($tokens) of arrays($t), one for each token where: + * $t[0] the kind of token, e.g. T_COMMENT + * $t[1] the content of the token, e.g. the entire comment. + * $t[2] the line number in the file +*/ +$tokens = token_get_all($data); +$doc = ""; +foreach($tokens as $t){ + if ($t[0] == T_COMMENT){ + if (strstr($t[1],"HELP")) + $doc .= $t[1]."\n"; + } +} + +echo ""; +echo basename($fn); +echo ""; +echo "
        ";
        +if (!empty($doc))
        +	echo $doc;
        +else
        +	echo "Sorry, no documentation for this script: >{$fn}<";
        +echo "
        "; +echo "

        "; +echo ""; + +?> diff --git a/fannie/cron/management/index.php b/fannie/cron/management/index.php new file mode 100644 index 000000000..207c7851c --- /dev/null +++ b/fannie/cron/management/index.php @@ -0,0 +1,246 @@ + 0){ + $tmpfn = tempnam(sys_get_temp_dir(),""); + $fp = fopen($tmpfn,"w"); + if (isset($_REQUEST['email']) && !empty($_REQUEST['email'])) + fwrite($fp,"MAILTO=".$_REQUEST['email']."\n"); + foreach($indexes as $i){ + fprintf($fp,"%s %s %s %s %s %s\n", + $_REQUEST['min'][$i], + $_REQUEST['hour'][$i], + $_REQUEST['day'][$i], + $_REQUEST['month'][$i], + $_REQUEST['wkdy'][$i], + $_REQUEST['cmd'][$i] + ); + } + fclose($fp); + + $output = system("crontab $tmpfn 2>&1"); + + /* backup crontab just in case */ + $dbc->query("TRUNCATE TABLE cronBackup"); + $dbc->query(sprintf("INSERT INTO cronBackup + VALUES (%s,%s)", + $dbc->now(), + $dbc->escape(file_get_contents($tmpfn)) + ) + ); + + unlink($tmpfn); + } +} + +if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + echo "PHP is running as: ".$chk['name']."
        "; + echo "Fannie will attempt to use their crontab

        "; +} +else { + echo "PHP is (probably) running as: ".get_current_user()."
        "; + echo "This is probably Windows; this tool won't work

        "; +} + +if (!is_writable($FANNIE_ROOT.'logs/dayend.log')){ + echo "Warning: dayend.log ({$FANNIE_ROOT}logs/dayend.log) + is not writable. Logging task results may + not work"; +} +else + echo "Default logging will be to {$FANNIE_ROOT}logs/dayend.log"; + +echo "
        Click the 'Command' link for popup Help."; +echo "

        "; + +$jobs = scan_scripts($FANNIE_ROOT.'cron',array()); +$tab = read_crontab(); + +echo "
        "; +echo "E-mail address:
        "; +echo ""; +echo ""; +$i = 0; +foreach($jobs as $job){ + $shortname = substr($job,strlen($FANNIE_ROOT."cron/")); + + $cmd = "cd {$FANNIE_ROOT}cron && php ./{$shortname} >> {$FANNIE_ROOT}logs/dayend.log"; + + // defaults are set as once a year so someone doesn't accidentallly + // start firing a job off every minute + printf(' + + + + + + + + ', + (isset($tab['jobs'][$shortname])?'checked':''),$i, + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['min']:'0'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['hour']:'0'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['day']:'1'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['month']:'1'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['wkdy']:'*'), + (isset($tab['jobs'][$shortname])?$tab['jobs'][$shortname]['cmd']:$cmd), + base64_encode($shortname),$shortname + ); + if (isset($tab['jobs'][$shortname])) + unset($tab['jobs'][$shortname]); + $i++; +} + +/* list out any jobs that WERE NOT covered + in the above loop. Those jobs weren't + set up by this tool and should not be edited +*/ +foreach ($tab['jobs'] as $job){ + printf(' + + + + + + + + ', + 'checked',$i, + $job['min'], + $job['hour'], + $job['day'], + $job['month'], + $job['year'], + $job['cmd'], + $job['cmd'] + ); + $i++; +} +echo "
        EnabledMinHourDayMonthWkdyCommand/Help
        + %s
        %s

        "; +echo ''; +echo '
        '; + +include($FANNIE_ROOT.'src/footer.html'); + +function scan_scripts($dir,$arr){ + if (!is_dir($dir)){ + if (substr($dir,-4) == ".php") + $arr[] = $dir; + return $arr; + } + else if (substr($dir,-11) == "/management"){ + return $arr; + } + else { + $dh = opendir($dir); + while(($file = readdir($dh)) !== false){ + if ($file == "." || $file == "..") + continue; + $arr = scan_scripts($dir."/".$file,$arr); + } + return $arr; + } +} + +function read_crontab(){ + global $FANNIE_ROOT; + $pp = popen('crontab -l 2>&1','r'); + $lines = array(); + while(!feof($pp)) + $lines[] = fgets($pp); + pclose($pp); + $ret = array( + 'jobs' => array(), + 'email' => '' + ); + foreach($lines as $line){ + if($line === false) continue; + $line = trim($line); + if ($line[0] == "#") continue; + if (substr($line,0,6) == "MAILTO") + $ret['email'] = substr($line,7); + $tmp = preg_split("/\s+/",$line,6); + if (count($tmp) == 6){ + $sn = str_replace("cd {$FANNIE_ROOT}cron && php ./","",$tmp[5]); + $sn = str_replace(" >> {$FANNIE_ROOT}logs/dayend.log","",$sn); + $ret['jobs'][$sn] = array( + 'min' => $tmp[0], + 'hour' => $tmp[1], + 'day' => $tmp[2], + 'month' => $tmp[3], + 'wkdy' => $tmp[4], + 'cmd' => $tmp[5] + ); + } + } + return $ret; +} +?> diff --git a/fannie/cron/members.sync.with.CiviCRM.php b/fannie/cron/members.sync.with.CiviCRM.php new file mode 100644 index 000000000..d27495ac5 --- /dev/null +++ b/fannie/cron/members.sync.with.CiviCRM.php @@ -0,0 +1,3228 @@ +query("$selectMember"); + //$member = $dbConn->query("$selectMember", MYSQLI_STORE_RESULT); + if ( $dbConn2->errno ) { + $message = sprintf("IS4C select failed: %s\n", $dbConn2->error); + dieHere("$message", $dieMail); + } + if ( ! $member ) { + $msg = sprintf("selectIS4C failed on: %s", $selectMember); + dieHere("$msg", $dieMail); + } + + // Should this test for >1 row? >1 not expected. + $row = $dbConn2->fetch_row($member); + + return($row); + +// selectIS4C +} + +/* Return civicrm_email.id of the first non-is_primary for the contact + * or 0 if there is none. +*/ +function getCiviSecondEmail($contactId) { + + $retVal = 0; + + global $dbConn; + global $dieMail; + + $sel = "SELECT id FROM civicrm_email + WHERE contact_id = $contactId AND is_primary = 0 + ORDER BY id + LIMIT 1"; + + $rslt = $dbConn->query("$sel"); + if ( $dbConn->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere("$message", $dieMail); + } + + if ( $rslt ) { + if ( $dbConn->num_rows($rslt) > 0 ) { + $row = $dbConn->fetch_row($rslt); + $retVal = $row[id]; + } + } else { + $msg = sprintf("getCiviSecondEmail failed on: %s", $sel); + dieHere("$msg", $dieMail); + } + + return($retVal); + +// getCiviSecondEmail() +} + +/* Return civicrm_phone.id of the first non-is_primary for the contact + * or 0 if there is none. +*/ +function getCiviSecondPhone($contactId) { + + $retVal = 0; + + global $dbConn; + global $dieMail; + + $sel = "SELECT id FROM civicrm_phone + WHERE contact_id = $contactId AND is_primary = 0 + ORDER BY id + LIMIT 1"; + + $rslt = $dbConn->query("$sel"); + if ( $dbConn->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere("$message", $dieMail); + } + + if ( $rslt ) { + if ( $dbConn->num_rows($rslt) > 0 ) { + $row = $dbConn->fetch_row($rslt); + $retVal = $row[id]; + } + } else { + $msg = sprintf("getCiviSecondPhone failed on: %s", $sel); + dieHere("$msg", $dieMail); + } + + return($retVal); + +// getCiviSecondPhone() +} + +/* Return an array of all the is_primary CiviCRM data for a single member. + * Use is_primary=1 to get only the first/primary email,address,phone +*/ +function selectCivi ($member_id) { + + global $dbConn; + global $dieMail; + global $memberCardTable; + global $memberCardField; + + $selWhere = "1"; + + // Syntax: "LIMIT 10" + $selLimit = ""; + //$selLimit = "LIMIT 1"; + + /* Re the big select: + Re the join: + There must be: _membership, _contact + There will always be: _email + There might be one or more: _address and/or _phone and/or _contribution + There will always be: _log + */ + + $selectMember = "SELECT +c.id as contact_id + ,c.contact_type, c.is_opt_out + , c.do_not_email, c.do_not_phone, c.do_not_mail + , c.nick_name , c.first_name, c.middle_name, c.last_name + , c.household_name, c.primary_contact_id, c.organization_name ,c.employer_id +,a.street_address ,a.supplemental_address_1 as address1, a.supplemental_address_2 as address2 + ,a.city ,a.postal_code , a.state_province_id, a.country_id +,p.phone +,e.email ,e.on_hold, e.is_bulkmail +,m.id as member_id, m.membership_type_id as mti, m.is_pay_later as mipl + ,m.join_date, m.start_date, m.end_date +,v.{$memberCardField} as mcard +,s.abbreviation as province +FROM +civicrm_membership m INNER JOIN civicrm_contact c ON c.id = m.contact_id +LEFT JOIN civicrm_email e ON m.contact_id = e.contact_id AND e.is_primary = 1 +LEFT JOIN civicrm_address a ON m.contact_id = a.contact_id AND a.is_primary = 1 +LEFT JOIN civicrm_phone p ON m.contact_id = p.contact_id AND p.is_primary = 1 +LEFT JOIN {$memberCardTable} v ON m.contact_id = v.entity_id +LEFT JOIN civicrm_state_province s ON s.id = a.state_province_id +WHERE m.id = $member_id +ORDER BY c.id +$selLimit;"; + +//LEFT JOIN civicrm_log u ON m.contact_id = u.entity_id AND u.entity_table = 'civicrm_contact' + + $member = $dbConn->query("$selectMember"); + //$member = $dbConn->query("$selectMember", MYSQLI_STORE_RESULT); + if ( $dbConn->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere("$message", $dieMail); + } + if ( ! $member ) { + $msg = sprintf("selectCivi failed on: %s", $selectMember); + dieHere("$msg", $dieMail); + } + + $row = $dbConn->fetch_row($member); + + return($row); + +// selectCivi +} + +/* Assign Civi data to the local IS4C arrays. + * Create and store the $insert* and $update* statement arrays. +*/ +function assignLocalI ($row, $is4cOps, $updated) { + + global $dbConn2; + // table-arrays. + // in core_op + // Card#, Person#, Name + global $custdata; + // Contact points for Card# + global $meminfo; + // Whether/how to contact. + global $memContact; + // Membership start, i.e. join date + global $memDates; + // Member Card barcode lookup. + global $memberCards; + // in core_trans + global $stockpurchases; + + // DML arrays. + global $insertCustdata; + global $insertMeminfo; + global $insertMemContact; + global $insertMemDates; + global $insertMemberCards; + global $insertStockpurchases; + + global $updateCustdata; + global $updateMeminfo; + global $updateMemContact; + global $updateMemDates; + global $updateMemberCards; + global $updateStockpurchases; + + /* custdata + */ + $custdata[CardNo] = $row[member_id]; + + // This lets autoincrement of custdata.id do its thing. + $custdata[id] = ""; + // Fields that are the same for all. + $custdata[CashBack] = 999.99; // double + $custdata[Type] = "PC"; + $custdata[memType] = $row[mti]; // int + + $firstNames = array(); + $lastNames = array(); + $insertCustdata = array(); + + // Organization + if ( $row[organization_name] != "" ) { + $lastNames[] = $row[organization_name]; + $firstNames[] = $row[first_name]; + //echo "Names 0 >",$lastNames[0],"< >$row[first_name]<\n"; + } + + // Regular, i.e. single-name, Individual + else { + if ( $row[middle_name] != "" ) { + $firstNames[] = "{$row[first_name]}|{$row[middle_name]}"; + } else { + $firstNames[] = $row[first_name]; + } + $lastNames[] = $row[last_name]; + 1; + } + + // Make a custdata record for each person. + for ($personNum = 1 ; $personNum <= count($firstNames); $personNum++ ) { + $custdata[personNum] = $personNum; + // Index to names arrays. + $i = $personNum - 1; + $custdata[FirstName] = fixName($firstNames[$i]); + $custdata[LastName] = fixName($lastNames[$i]); + $custdata[blueLine] = "\"$custdata[CardNo] $custdata[LastName]"; + $custdata[LastChange] = $updated; + + if ( $is4cOps[custdata] == "insert" ) { + // $insertCustdata is an array of statements to execute later. + $insertCustdata[$i] = "INSERT INTO custdata ( +CardNo, +personNum, +LastName, +FirstName, +CashBack, +Type, +memType, +blueLine, +LastChange, +id) +VALUES ( +$custdata[CardNo], +$custdata[personNum], +{$dbConn2->escape($custdata[LastName])}, +{$dbConn2->escape($custdata[FirstName])}, +$custdata[CashBack], +{$dbConn2->escape($custdata[Type])}, +$custdata[memType], +{$dbConn2->escape($custdata[blueLine])}, +{$dbConn2->escape($custdata[LastChange])}, +{$dbConn2->escape($custdata[id])} +);"; + } + elseif ( $is4cOps[custdata] == "update" ) { + // $updateCustdata is an array of statements to execute later. + $updateCustdata[$i] = "UPDATE custdata SET +LastName = {$dbConn2->escape($custdata[LastName])} +, FirstName = {$dbConn2->escape($custdata[FirstName])} +, LastChange = {$dbConn2->escape($custdata[LastChange])} +, blueLine = {$dbConn2->escape($custdata[blueLine])} +WHERE CardNo = $custdata[CardNo] +AND +personNum = $custdata[personNum] +;"; + } + else { + echo "Bad is4cOps, personNum: $personNum >{$is4cOps[custdata]}<\n"; + 1; + } + + // each person on the card + } + + /* meminfo + */ + $meminfo[card_no] = $custdata[CardNo]; + // Need fixAddress to capitalize first letter of each word. + $meminfo[street] = fixAddress($row[street_address]); + if ( $row[supplemental_address_1] != "" ) { + $meminfo[street] .= ", $row[supplemental_address_1]"; + } + if ( $row[supplemental_address_2] != "" ) { + $meminfo[street] .= ", $row[supplemental_address_2]"; + } + $meminfo[city] = fixCity($row[city]); + $meminfo[zip] = fixPostalCode($row[postal_code]); + $meminfo[state] = fixProvince($row[state_province_id], $row[province], $meminfo[city], $meminfo[zip]); + $meminfo[phone] = fixPhone($row[phone]); + $meminfo[email_1] = $row[email]; + // Use for 2nd phone if there is one. None I know of. + $meminfo[email_2] = ""; + // What should the source for this be? contact.is_opt_out == 1 -> ads_OK = 0. + //$meminfo[ads_OK] = "1"; + $meminfo[ads_OK] = ($row[is_opt_out] == "1") ? "0" : "1"; + + if ( $is4cOps[meminfo] == "insert" ) { + // Compose the insert statement. + $insertMeminfo = "INSERT INTO meminfo ( +card_no +,street +,city +,state +,zip +,phone +,email_1 +,email_2 +,ads_OK +) +VALUES ( +$meminfo[card_no] +, {$dbConn2->escape($meminfo[street])} +, {$dbConn2->escape($meminfo[city])} +, {$dbConn2->escape($meminfo[state])} +, {$dbConn2->escape($meminfo[zip])} +, {$dbConn2->escape($meminfo[phone])} +, {$dbConn2->escape($meminfo[email_1])} +, {$dbConn2->escape($meminfo[email_2])} +, $meminfo[ads_OK] +);"; + + // update + } else { + $updateMeminfo = "UPDATE meminfo SET +street = {$dbConn2->escape($meminfo[street])} +,city = {$dbConn2->escape($meminfo[city])} +,state = {$dbConn2->escape($meminfo[state])} +,zip = {$dbConn2->escape($meminfo[zip])} +,phone = {$dbConn2->escape($meminfo[phone])} +,email_1 = {$dbConn2->escape($meminfo[email_1])} +,email_2 = {$dbConn2->escape($meminfo[email_2])} +,ads_OK = $meminfo[ads_OK] +WHERE card_no = $meminfo[card_no] +;"; + } + + /* memDates + Date the person became a member. + May change if expiry implemented, so code. + */ + if ( $row[start_date] != "" ) { + + $memDates[card_no] = $custdata[CardNo]; + // Civi is date, IS4C is datetime + // The time part is set to 00:00:00 + // Is conversion needed? Seems OK without. + $memDates[start_date] = $row[start_date]; + if ( $row[end_date] != "" ) { + $memDates[end_date] = $row[end_date]; + } + + if ( $is4cOps[memDates] == "insert" ) { + // Compose the insert statement. + $insertMemDates = "INSERT INTO memDates ( +card_no +,start_date +,end_date +) +VALUES ( +$memDates[card_no] +, '$memDates[start_date]' +, '$memDates[end_date]' +);"; + } else { + // Compose the update statement. + $updateMemDates = "UPDATE memDates SET +start_date = '$memDates[start_date]' +, end_date = '$memDates[end_date]' +WHERE card_no = $memDates[card_no] +;"; + } + + // memDates, if anything to record. + } + + /* memContact + Preference about being contacted. + 0 => no contact + 1 => postal mail only # WEFC doesn't do, so not used. + 2 => email only # Default. + 3 => both # Not used. + May want to do only if "no". + */ + + $memContact[card_no] = $custdata[CardNo]; + + // 29Nov12 WEFC_Toronto really only does email at this point, so ingore the other do_not* + if ( $row[do_not_email] == 1 ) { + // no contact + $memContact[pref] = 0; + } else { + // email + $memContact[pref] = 2; + } + + if ( $is4cOps[memContact] == "insert" ) { + // Compose the insert statement. + $insertMemContact = "INSERT INTO memContact ( +card_no +,pref +) +VALUES ( +$memContact[card_no] +, $memContact[pref] +);"; + } else { + // Compose the update statement. + $updateMemContact = "UPDATE memContact SET +pref = '$memContact[pref]' +WHERE card_no = $memContact[card_no] +;"; + } + + /* #'m memberCards + */ + if ( $row[mcard] != "" && $row[mcard] != "0" ) { + + $memberCards[card_no] = $custdata[CardNo]; + $memberCards[upc] = sprintf("00401229%05d", $row[mcard]); + + if ( $is4cOps[memberCards] == "insert" ) { + // Compose the insert statement. + $insertMemberCards = "INSERT INTO memberCards ( +card_no +,upc +) +VALUES ( +$memberCards[card_no] +, '$memberCards[upc]' +);"; + } else { + // Compose the update statement. + $updateMemberCards = "UPDATE memberCards SET +upc = '$memberCards[upc]' +WHERE card_no = $memberCards[card_no] +;"; + } + + // memberCards, if anything to record. + } + + /* stockpurchases + */ + +// assignLocalI +} + + +/* Assign IS4C data to the local Civi arrays. + * Create and store the $insert* and $update* statement arrays. +*/ +function assignLocalC ($row, $civiOps, $updated, $civiContactId) { + + global $dbConn; + // Base + global $civicrm_contact; + // Membership# + global $civicrm_membership; + // email + global $civicrm_email; + // addres + global $civicrm_address; + // phone + global $civicrm_phone; + // Membership card# + global $civicrm_value_identification_and_cred; + // Datestamp + global $civicrm_log; + + /* SQL DML statements + */ + global $insertContact; + global $insertMembership; + global $insertEmail; + global $insertAddress; + global $insertPhone; + global $insertMemberCard; + global $insertLog; + + global $updateContact; + global $updateMembership; + global $updateEmail; + global $updateAddress; + global $updatePhone; + global $updateMemberCard; + global $updateLog; + + global $memberCardTable; + global $memberCardField; + + // #'u + /* In general: + * - Use the civicrm_* array elements for prepared versions of the data for that table. + * - Assign prepared versions of the data for that table to the civicrm_* array elements. + * - Test civiOps[table_name] for whether to prepare an insert or update. + * - Compose the statement and assign/append it to the statement list for that table. + * - Create a civicrm_log record (datestamp) to match the IS4C datestamp. + */ + + // 1/0. 1 prevents any communication. + $civicrm_contact[is_opt_out] = ($row[ads_OK] == 0) ? 1 : 0; + + if ( $row[pref] == 0 ) { + $civicrm_contact[do_not_email] = 1; + //$civicrm_contact[do_not_phone] = 1; + $civicrm_contact[do_not_mail] = 1; + } elseif ( $row[pref] == 1 ) { + $civicrm_contact[do_not_email] = 1; + $civicrm_contact[do_not_mail] = 0; + // 2 is usual and at WEFC probably means nothing either way about postalmail + } elseif ( $row[pref] == 2 ) { + $civicrm_contact[do_not_email] = 0; + $civicrm_contact[do_not_mail] = 0; + } elseif ( $row[pref] == 3 ) { + $civicrm_contact[do_not_email] = 0; + $civicrm_contact[do_not_mail] = 0; + } else { + 1; + } + + // Community Partner or Producer: organizations. + // IS4C convention s/b: LastName = Organization, FirsName = "" or "Joe Bloggs" + if ( $row[memType] == 3 || $row[memType] == 5 ) { + $civicrm_contact[contact_type] = "Organization"; + $civicrm_contact[organization_name] = $row[LastName]; + // Better to split FirstName on " " and assign to both first_name and last_name? + $civicrm_contact[first_name] = $row[FirstName]; + if ( $row[LastName] != "" ) { + $civicrm_contact[sort_name] = $row[LastName]; + $civicrm_contact[display_name] = $row[LastName]; + } + elseif ( $row[email_1] != "" ) { + $civicrm_contact[sort_name] = $row[email_1]; + $civicrm_contact[display_name] = $row[email_1]; + } + else { + 1; + } + } + // Eater or Worker + elseif ( $row[memType] == 4 || $row[memType] == 6 || $row[FirstName] != "" ) { + $civicrm_contact[contact_type] = "Individual"; + list($first,$middle) = explode("|", $row[FirstName]); + $civicrm_contact[first_name] = $first; + $civicrm_contact[middle_name] = $middle; + $civicrm_contact[last_name] = $row[LastName]; + $row[FirstName] = str_replace("|", " ", $row[FirstName]); + if ( $row[LastName] != "" ) { + $civicrm_contact[sort_name] = "{$row[LastName]}, {$row[FirstName]}"; + $civicrm_contact[display_name] = "{$row[FirstName]} {$row[LastName]}"; + } + elseif ( $row[email_1] != "" ) { + $civicrm_contact[sort_name] = $row[email_1]; + $civicrm_contact[display_name] = $row[email_1]; + } + else { + 1; + } + } else { + // Unknown memType, or 1. Does 1 ever happen? Is not offered in Civi but is in IS4C. + // c.memType :: _membership.membership_type_id + 1; + } + + // id is auto_increment. + if ( $civiOps[civicrm_contact] == "insert" ) { + $insertContact = "INSERT INTO civicrm_contact + (id + , source + , first_name, middle_name, last_name + , organization_name, sort_name, display_name + , is_opt_out + , do_not_email , do_not_mail + ) + VALUES + ('' + , {$dbConn->escape($civicrm_contact[contact_type])} + , {$dbConn->escape($civicrm_contact[source])} + , {$dbConn->escape($civicrm_contact[first_name])} + , {$dbConn->escape($civicrm_contact[middle_name])} + , {$dbConn->escape($civicrm_contact[last_name])} + , {$dbConn->escape($civicrm_contact[organization_name])} + , {$dbConn->escape($civicrm_contact[sort_name])} + , {$dbConn->escape($civicrm_contact[display_name])} + , $civicrm_contact[is_opt_out] + , $civicrm_contact[do_not_email] + , $civicrm_contact[do_not_mail] + )"; + } + else { + $updateContact = "UPDATE civicrm_contact + SET + contact_type = {$dbConn->escape($civicrm_contact[contact_type])} + , first_name = {$dbConn->escape($civicrm_contact[first_name])} + , middle_name = {$dbConn->escape($civicrm_contact[middle_name])} + , last_name = {$dbConn->escape($civicrm_contact[last_name])} + , organization_name = {$dbConn->escape($civicrm_contact[organization_name])} + , sort_name = {$dbConn->escape($civicrm_contact[sort_name])} + , display_name = {$dbConn->escape($civicrm_contact[display_name])} + , is_opt_out = $civicrm_contact[is_opt_out] + , do_not_email = $civicrm_contact[do_not_email] + , do_not_mail = $civicrm_contact[do_not_mail] + WHERE id = $civiContactId"; + } + + /* Membership + */ + $civicrm_membership[membership_type_id] = $row[memType]; + // These civi dates are date only, no time. + $civicrm_membership[join_date] = substr($row[start_date], 0, 10); + $civicrm_membership[start_date] = substr($row[start_date], 0, 10); + + if ( $civiOps[civicrm_membership] == "insert" ) { + $insertMembership = "INSERT INTO civicrm_membership + (id, contact_id + , membership_type_id + , join_date + , start_date + ) + VALUES + ('', $civiContactId + , $civicrm_membership[membership_type_id]) + , '$civicrm_membership[join_date]' + , '$civicrm_membership[start_date]' + )"; + } + else { + $updateMembership = "UPDATE civicrm_membership + SET + membership_type_id = $civicrm_membership[membership_type_id] + , join_date = '$civicrm_membership[join_date]' + , start_date = '$civicrm_membership[start_date]' + WHERE contact_id = $civiContactId"; + } + + /* Email(s) + * For insert is_primary=1 + * For update: + * There is always one where is_primary=1 + * + First change the one where is_primary=1 + * + If there is another + * + See if there is one with is_primary=0 + * + If yes, update that one. + * + If not, insert one with is_primary=0 + */ + + $civicrm_email[email] = $row[email_1]; + + if ( $civiOps[civicrm_email] == "insert" ) { + $civicrm_email[location_type_id] = 1; + $civicrm_email[is_primary] = 1; + $civicrm_email[is_bulkmail] = 1; + $insertEmail[] = "INSERT INTO civicrm_email + (id, contact_id + , email + , location_type_id + , is_primary + , is_bulkmail + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_email[email])} + , $civicrm_email[location_type_id] + , $civicrm_email[is_primary] + , $civicrm_email[is_bulkmail] + )"; + + // If there is another one insert it, is_primary=0. + if ( isEmail($row[email_2]) ) { + $civicrm_email[email] = $row[email_2]; + $civicrm_email[location_type_id] = 2; // We don't actually know. + // In fact 0 is default. + $civicrm_email[is_primary] = 0; + $insertEmail[] = "INSERT INTO civicrm_email + (id, contact_id + , email + , location_type_id + , is_primary + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_email[email])} + , $civicrm_email[location_type_id] + , $civicrm_email[is_primary] + )"; + } + } + else { + $updateEmail[] = "UPDATE civicrm_email + SET + email = {$dbConn->escape($civicrm_email[email])} + WHERE contact_id = $civiContactId AND is_primary = 1"; + + /* If there is another one + * Look for the id of one non-primary at Civi + * If there is one + * update it on id# + * If not, + * insert it, is_primary=0. + */ + if ( isEmail($row[email_2]) ) { + $civicrm_email[email] = $row[email_2]; + $civicrm_email[is_primary] = 0; + $email_id = getCiviSecondEmail($civiContactId); + if ( $email_id != 0 ) { + $updateEmail[] = "UPDATE civicrm_email + SET + email = {$dbConn->escape($civicrm_email[email])} + , is_primary = $civicrm_email[is_primary] + WHERE id = $email_id"; + } + else { + $insertEmail[] = "INSERT INTO civicrm_email + (id, contact_id + , email + , is_primary + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_email[email])} + , $civicrm_email[is_primary] + )"; + } + } + + // update Email + } + + /* Address - IS4C only supports one. + */ + $row[street] = str_replace("\n"," ",$row[street]); + $civicrm_address[street_address] = fixAddress($row[street]); + $civicrm_address[city] = fixCity($row[city]); + $civicrm_address[postal_code] = fixPostalCode($row[zip]); + $civicrm_address[state_province_id] = getProvinceId($row[state]); + + if ( $civiOps[civicrm_address] == "insert" ) { + if ( $civicrm_address[street_address] != "" ) { + $civicrm_address[location_type_id] = 1; + $civicrm_address[is_primary] = 1; + $insertAddress[] = "INSERT INTO civicrm_address + (id, contact_id + , street_address + , city + , postal_code + , state_province_id + , location_type_id + , is_primary + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_address[street_address])} + , {$dbConn->escape($civicrm_address[city])} + , {$dbConn->escape($civicrm_address[postal_code])} + , $civicrm_address[state_province_id] + , $civicrm_address[location_type_id] + , $civicrm_address[is_primary] + )"; + + } + } + else { + // This will set-empty but not delete if foo=="". + $updateAddress[] = "UPDATE civicrm_address + SET + street_address = {$dbConn->escape($civicrm_address[street_address])} + , city = {$dbConn->escape($civicrm_address[city])} + , postal_code = {$dbConn->escape($civicrm_address[postal_code])} + , state_province_id = $civicrm_address[state_province_id] + WHERE contact_id = $civiContactId AND is_primary = 1"; + + // update Address + } + + + /* Phone(s) + * For insert, first: is_primary=1, 2nd: is_primary=0 + * For update: + * There is always one where is_primary=1 + * + First change the one where is_primary=1 + * + If there is another + * + See if there is one with is_primary=0 + * + If yes, update that one. + * + If not, insert one with is_primary=0 + */ + + // Does it need some validation? + $civicrm_phone[phone] = $row[phone]; + + if ( $civiOps[civicrm_phone] == "insert" ) { + if ( $civicrm_phone[phone] != "" ) { + $civicrm_phone[location_type_id] = 1; + $civicrm_phone[is_primary] = 1; + $insertPhone[] = "INSERT INTO civicrm_phone + (id, contact_id + , phone + , location_type_id + , is_primary + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_phone[phone])} + , $civicrm_phone[location_type_id] + , $civicrm_phone[is_primary] + )"; + + // If there is another one insert it, is_primary=0. + if ( isPhone($row[email_2]) ) { + $civicrm_phone[phone] = $row[email_2]; + $civicrm_phone[location_type_id] = 2; // We don't actually know. + // In fact 0 is default. + $civicrm_phone[is_primary] = 0; + $insertPhone[] = "INSERT INTO civicrm_phone + (id, contact_id + , phone + , location_type_id + , is_primary + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_phone[phone])} + , $civicrm_email[location_type_id] + , $civicrm_phone[is_primary] + )"; + } + } + } + else { + // This will set-empty but not delete if phone=="". + $updatePhone[] = "UPDATE civicrm_phone + SET + phone = {$dbConn->escape($civicrm_phone[phone])} + WHERE contact_id = $civiContactId AND is_primary = 1"; + + /* If there is another one + * Look for the id of one non-primary at Civi + * If there is one + * update it on id# + * If not, + * insert it, is_primary=0. + */ + if ( isPhone($row[email_2]) ) { + $civicrm_phone[phone] = $row[email_2]; + $civicrm_phone[is_primary] = 0; + $phone_id = getCiviSecondPhone($civiContactId); + if ( $phone_id != 0 ) { + $updatePhone[] = "UPDATE civicrm_phone + SET + phone = {$dbConn->escape($civicrm_phone[phone])} + , is_primary = $civicrm_phone[is_primary] + WHERE id = $phone_id"; + } + else { + $insertPhone[] = "INSERT INTO civicrm_phone + (id, contact_id + , phone + , is_primary + ) + VALUES + ('', $civiContactId + , {$dbConn->escape($civicrm_phone[phone])} + , $civicrm_phone[is_primary] + )"; + } + } + + // update Phone + } + + // Membership card#. + if ( $row[member_card_upc] != "" ) { + $civicrm_value_identification_and_cred["$memberCardField"] = + ltrim(substr($row[member_card_upc],8,5), "0"); + } + else { + $civicrm_value_identification_and_cred["$memberCardField"] = 'NULL'; + } + if ( $civiOps["$memberCardTable"] == "insert" ) { + $insertMemberCard = "INSERT INTO $memberCardTable + (id, entity_id, $memberCardField) + VALUES + ('', $civiContactId, $civicrm_value_identification_and_cred[$memberCardField])"; + } + else { + $updateMemberCard = "UPDATE $memberCardTable + SET $memberCardField = $civicrm_value_identification_and_cred[$memberCardField] + WHERE entity_id = $civiContactId"; + } + + // Datestamp + // Create a civicrm_log record (datestamp) to match the IS4C datestamp. + $civicrm_log['entity_table'] = "civicrm_contact"; + $civicrm_log['entity_id'] = $civiContactId; + $civicrm_log['data'] = "{$civicrm_log['entity_table']},{$civicrm_log['entity_id']}"; + // This is civicrm_contact.id of an "IS4C" record in Civi. + $civicrm_log['modified_id'] = "4982"; + $civicrm_log['modified_date'] = "$updated"; + + $insertLog = "INSERT INTO civicrm_log + (id, entity_table, entity_id, data, modified_id, modified_date) + VALUES + ('', + '$civicrm_log[entity_table]', + $civicrm_log[entity_id], + '$civicrm_log[data]', + $civicrm_log[modified_id], + '$civicrm_log[modified_date]' + )"; + +// assignLocalC +} + + +/* Insert or Update CiviCRM from IS4C. +*/ +function toCivi($mode, $member, $updated) { + + global $civiOps; + global $debug; + global $dryRun; + global $civiTableNames; + global $civiContactId; + global $dieMail; + global $tempMemberRange; + + // In production do not override here. + // 1=notify, no-write, 2=notify but write. + //$debug = 2; + + $funcName = "toCivi"; + if ( $debug ) + goOrDie("In $funcName debug: $debug > "); + + if ($dryRun) + return True; + + $newMember = 0; + $upshot = ""; + + if ( $mode == "insert" ) { + + if ( $member > $tempMemberRange ) { + + //#'h Get a contact number from Civi. + $civiContactId = getNewContactId($member); + if ( $debug > 0 ) + goOrDie("Got new Civi contact# $civiContactId"); + if ( $civiContactId == 0 ) { + dieHere("$funcName unable to get new Civi contact#.", $dieMail); + } + + //#'i Get a member number from Civi. + $newMember = getNewMemberId($civiContactId); + if ( $debug > 0 ) + goOrDie("Got new Civi member# $newMember"); + if ( $newMember == 0 ) { + dieHere("$funcName unable to get new Civi member#.", $dieMail); + } + + //#'j Change the tempMember to newMember in all IS4C tables. + $upshot = adjustIS4C($member, $newMember, $updated); + if ( $debug > 0 ) + goOrDie("Upshot of changing IS4C $member to $newMember : >{$upshot}<"); + if ( $upshot != "OK" ) { + dieHere("$funcName unable to adjust IS4C for new member.", $dieMail); + } + + // Rejoin the mainstream to finish the Civi side as though it were an update: + $mode = "update"; + $member = $newMember; + + } + // This should never happen. + // Means that a member was entered in IS4C with id below the new-record range. + else { + $msg = "$funcName insert to Civi from regular IS4C range : member: $member <= $tempMemberRange. Not done."; + if ( $debug > 0 ) { + goOrDie("$msg"); + } + problemHere($msg); + return; + } + } + + /* Get all the data from IS4C for this member. + */ + $row = selectIS4C($member); + + if ($debug) { + $msg = "IS4C member: $member first: {$row[FirstName]} last: {$row[LastName]} + street: {$row[street]} + start_date: {$row[start_date]} + pref: {$row[pref]} + upc: {$row[member_card_upc]} + "; + goOrDie($msg); + } + + /* Find out and note whether the operation to each Civi table will be insert or update. + * In other words, whether a record for this member exists in each Civi table. + * Assign civiContactId + */ + $civiOps = searchCivi2($member); // see 't + if ( preg_match("/^Error/", $civiOps[0][0]) ) { + dieHere("{$civiOps[0][0]}", $dieMail); + } + + if ($debug) + goOrDie("After searchCivi2: civiContactId: $civiContactId"); + + // Populate the local arrays + // and create the DML statements. + assignLocalC($row, $civiOps, $updated, $civiContactId); + + if ($debug) { + goOrDie("Before toCivi DML for member: $member debug: $debug"); + 1; + } + + // Make the changes to Civi tables. + // The datestamp is an insert to civicrm_log + $resultString = insertToCivi(); + if ( $resultString != "OK" ) { + dieHere("$resultString", $dieMail ); + } + $resultString = updateCivi($mode); + if ( $resultString != "OK" ) { + dieHere("$resultString", $dieMail); + } + + if ($debug) { + goOrDie("After toCivi DML for member: $member "); + } + + // Clear for next operation. + clearCiviWorkVars(); + $civiOps = array(); + + return True; + +// toCivi() +} + + +/* Return the number of a newly-created CiviCRM contact or 0 on failure. + * +*/ +function getNewContactId($tempMember) { + + global $dbConn; + global $debug; + global $dieMail; + + $retVal = 0; + + if ( $debug > 0 ) + $ans = readline("In getNewContactId > "); + + $sql = "INSERT INTO civicrm_contact (last_name) VALUES ('NEW_$tempMember')"; + $rslt = $dbConn->query("$sql"); + if ( $dbConn->errno ) { + $msg = sprintf("Failed: %s", $dbConn->error); + dieHere($msg, $dieMail); + } + if ( ! $rslt ) { + $msg = "getNewContactId failed: $sql"; + dieHere($msg, $dieMail); + } + + // Get the _contact.id, which was created by auto-increment + $sql = "SELECT id FROM civicrm_contact WHERE last_name = 'NEW_$tempMember'"; + $rslt = $dbConn->query("$sql"); + if ( $dbConn->errno ) { + $msg = sprintf("Failed: %s", $dbConn->error); + dieHere($msg, $dieMail); + } + if ( ! $rslt ) { + $msg = "getNewContactId failed: $sql"; + dieHere($msg, $dieMail); + } + $rows = $dbConn->num_rows($rslt); + if ( $rows > 0 ) { + $row = $dbConn->fetch_row($rslt); + $retVal = $row[id]; + } else { + $retVal = 0; + } + + return($retVal); + +//getNewContactId +} + +/* Return the id# of a newly-created CiviCRM membership or 0 on failure. + * +*/ +function getNewMemberId($contactId) { + + global $dbConn; + global $debug; + global $dieMail; + + if ( $debug > 0 ) + $ans = readline("In getNewMemberId > "); + + $retVal = 0; + + $sql = "INSERT INTO civicrm_membership (contact_id) VALUES ($contactId)"; + $rslt = $dbConn->query("$sql"); + if ( $dbConn->errno ) { + $msg = sprintf("Failed: %s", $dbConn->error); + dieHere($msg, $dieMail); + } + if ( ! $rslt ) { + $msg = "getNewMemberId failed: $sql"; + dieHere($msg, $dieMail); + } + + // Get the _membership.id, which was created by auto-increment + $sql = "SELECT id FROM civicrm_membership WHERE contact_id = $contactId"; + $rslt = $dbConn->query("$sql"); + if ( $dbConn->errno ) { + $msg = sprintf("Failed: %s", $dbConn->error); + dieHere($msg, $dieMail); + } + if ( ! $rslt ) { + $msg = "getNewMemberId failed: $sql"; + dieHere($msg, $dieMail); + } + $rows = $dbConn->num_rows($rslt); + if ( $rows > 0 ) { + $row = $dbConn->fetch_row($rslt); + $retVal = $row[id]; + } else { + $retVal = 0; + } + + return($retVal); + +//getNewMemberId +} + +/* Change the tempMember to newMember in all IS4C tables. + * Return "OK" on success, message on failure. Or die from here on failure? + * In fact it dies on any error. Should it? +*/ +function adjustIS4C($tempMember, $newMember, $updated) { + + global $dbConn2; + global $debug; + global $is4cTableNames; + global $is4cOps; + global $dieMail; + + $funcName = "adjustIS4C"; + if ( $debug > 0 ) + $ans = readline("In $funcName to change $tempMember to $newMember> "); + + $retVal = ""; + + // Check first that it doesn't already exist. Bad if it does. + $sql = "SELECT CardNo FROM custdata WHERE CardNo = $newMember"; + $rslt = $dbConn2->query("$sql"); + if ( $dbConn2->errno ) { + $msg = sprintf("Failed: %s", $dbConn2->error); + dieHere($msg, $dieMail); + } + if ( ! $rslt ) { + $msg = "getNewMemberId failed: $sql"; + dieHere($msg, $dieMail); + } + $rows = $dbConn2->num_rows($rslt); + if ( $rows > 0 ) { + $msg = "Trouble in $funcName: custdata.CardNo $newMember already exists."; + dieHere($msg, $dieMail); + } + + $is4cOps = searchIS4C2($tempMember); + if ( preg_match("/^Error/", $is4cOps[0][0]) ) { + dieHere("{$is4cOps[0][0]}", $dieMail); + } + + // The IS4C NEW MEMBER apparatus creates rows in custdata, meminfo, memContact, memDates, + // and in memberCards if there is one. + // Do custdata first so triggers on other tables will be able to find it. + + $statements = array(); + $statements[] = "UPDATE custdata set CardNo = $newMember, blueLine = CONCAT('\"$newMember ', LastName) WHERE CardNo = $tempMember"; + $statements[] = "UPDATE meminfo set card_no = $newMember WHERE card_no = $tempMember"; + $statements[] = "UPDATE memContact set card_no = $newMember, pref = 2 WHERE card_no = $tempMember"; + $statements[] = "UPDATE memDates set card_no = $newMember WHERE card_no = $tempMember"; + if ( $is4cOps[memberCards] == "update" ) { + $statements[] = "UPDATE memberCards set card_no = $newMember WHERE card_no = $tempMember"; + } + $statements[] = "UPDATE memberNotes set cardno = $newMember WHERE cardno = $tempMember"; + // Set the datestamp to what it was originally, to agree with what Civi is now. + $statements[] = "UPDATE custdata SET LastChange = '$updated' WHERE CardNo = $newMember"; + $statement = ""; + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1) + continue; + } + $rslt = $dbConn2->query("$statement"); + if ( $dbConn2->errno ) { + dieHere(sprintf("$funcName failed: %s\n", $dbConn2->error), $dieMail); + } + if ( ! $rslt ) { + dieHere("$funcName failed: $statement", $dieMail); + } + } + } + + $retVal = "OK"; + + return($retVal); + +//adjustIS4C() +} + +/* Insert or Update IS4C from CiviCRM. +*/ +function toIS4C($mode, $member, $updated) { + + global $is4cOps; + global $debug; + global $dryRun; + global $is4cTableNames; + global $dieMail; + + if ($debug) + $ans = readline("In toIS4C mode: $mode $member > "); + + // debug=2 allows inserts and updates while displaying messages. + //$debug = 2; + + if ($dryRun) + return True; + + // Get all the data from Civi for this member. + // You don't know contact_id at this point. + $row = selectCivi($member); + + if ( $mode == "insert" ) { + foreach ($is4cTableNames as $table) { + $is4cOps["$table"] = "insert"; + } + } else { + // Note which IS4C operations will be inserts, which updates. + // Find out whether the operation to each table will be insert or update. + $is4cOps = searchIS4C2($member); + if ( preg_match("/^Error/", $is4cOps[0][0]) ) { + dieHere("{$is4cOps[0][0]}", $dieMail); + } + } + + // Populate the local arrays + // and create the DML statements. + assignLocalI($row, $is4cOps, $updated); + + if ($debug) { + goOrDie("Before DML for member: $member debug: $debug"); + 1; + } + + // Make the changes to IS4C tables. + $resultString = insertToIS4C($mode); + if ( $resultString != "OK" ) { + dieHere("$resultString", $dieMail); + } + // Important to update after insert so custdata.LastChange is last thing assigned. + // Important to update custdata if any related table is inserted or updated. + $resultString = updateIS4C($mode); + if ( $resultString != "OK" ) { + dieHere("$resultString", $dieMail); + } + + if ($debug) { + goOrDie("After DML for member: $member "); + } + + // Clear for next operation. + // Better to do at start. + // Each IS4C table is represented by an assoc array. + clearIs4cWorkVars(); + $is4cOps = array(); // Is the clearing needed? + + return True; + +// toIS4C() +} + +// Return the datestamp of the start of the last run if that run finished ok, +// otherwise return epoch. +function getLatestRun($file) { + global $dieMail; + $reporter = fopen("$file", "r"); + if ( ! $reporter ) { + dieHere("Could not open $file\n", $dieMail); + } + + $finished = False; + while (($line = fgets($reporter)) !== false) { + if ( strpos($line, "STARTED") === 0 ) { + list($junk, $lastStart) = explode(" ", $line, 2); + } + if ( strpos($line, "FINISHED_OK") === 0 ) { + $finished = True; + } + } + fclose($reporter); + if ( !$finished ) { + $lastStart = "0000-00-00 00:00:00"; + } + return($lastStart); + +} + +// Clear the test records from the IS4C tables. +// CardNo or card_no range between 4000 and 6000 +function clearIS4C($low = 417, $high = 1500) { + + global $dbConn2; + global $is4cTables; + global $dieMail; + + // Argument to where. + $clearWhere = ""; + + foreach ($is4cTables as $table_desc) { + list($db, $table, $cn) = explode("|", $table_desc); + //$clearWhere = "$cn = 4471"; + $clearWhere = "$cn BETWEEN $low AND $high;"; + $query = "DELETE FROM $table WHERE ${clearWhere};"; + if ( TRUE && $db == "core_op" ) { + $rslt = $dbConn2->query("$query"); + if ( $dbConn2->errno ) { + $msg = sprintf("DML failed: %s\n", $dbConn2->error); + dieHere("$msg", $dieMail); + } + } elseif ( $db == "core_trans" ) { + // Need another connection for this db. + 1; + } else { + // In fact a problem, but not likely. + 1; + } + } + + return("OK"); + +// clearIS4C +} + + +/* Return an array of custdata for the memberId. + Calling script to test for #-of-items in array: 0=none, >=1 if some. + Return error-string if the lookup failed. +*/ +function searchIS4C($member) { + + global $dbConn2; + global $dieMail; + + $is4cMembers = array(); + $sel = "SELECT CardNo, personNum, FirstName, LastName FROM custdata where CardNo = ${member};"; + $rslt = $dbConn2->query("$sel"); + if ( $dbConn2->errno ) { + $msg = sprintf("Error: DQL failed: %s\n", $dbConn2->error); + $is4cMembers[] = array($msg); + return($is4cMembers); + } + if ( ! $rslt ) { + $msg = sprintf("searchIS4C failed on: %s", $sel); + dieHere("$msg", $dieMail); + } + // What is $rslt if 0 rows? Does it exist? + //$n = 0; + while ( $row = $dbConn2->fetch_row($rslt) ) { + //$n++; + $is4cMembers[] = array($row[CardNo], $row[personNum], $row[FirstName], $row[LastName]); + } + return($is4cMembers); + +// searchIS4C +} + +/* Find which IS4C tables the member (card_no) is known in. + * Return array of member-related table names and whether the operation will be + * to insert (add) or update. + * $is4cOps[table-name][insert|update] +*/ +function searchIS4C2($member) { + + global $dbConn2; + global $dieMail; + + $is4cOps = array(); + + $sel = "SELECT c.CardNo as cCard, + i.card_no as iCard, + t.card_no as tCard, + d.card_no as dCard, + r.card_no as rCard + FROM custdata c +LEFT JOIN meminfo i ON c.CardNo = i.card_no +LEFT JOIN memContact t ON c.CardNo = t.card_no +LEFT JOIN memDates d ON c.CardNo = d.card_no +LEFT JOIN memberCards r ON c.CardNo = r.card_no + WHERE c.CardNo = ${member};"; + + $rslt = $dbConn2->query("$sel"); + if ( $dbConn2->errno ) { + $msg = sprintf("Error: DQL failed: %s\n", $dbConn2->error); + $is4cOps[] = array($msg); + return($is4cOps); + } + if ( ! $rslt ) { + $msg = sprintf("Failed on: %s", $sel); + dieHere("$msg", $dieMail); + } + + while ( $row = $dbConn2->fetch_row($rslt) ) { + $is4cOps['custdata'] = "update"; + $is4cOps['meminfo'] = ( $row[iCard] != "" ) ? "update" : "insert"; + $is4cOps['memContact'] = ( $row[tCard] != "" ) ? "update" : "insert"; + $is4cOps['memDates'] = ( $row[dCard] != "" ) ? "update" : "insert"; + $is4cOps['memberCards'] = ( $row[rCard] != "" ) ? "update" : "insert"; + break; + } + + return($is4cOps); + +// searchIS4C2 +} + +/* Find which Civi tables the member (contact_id, via member_id) is known in. + * Return array of member-related table names and whether the operation will be + * to insert (add) or update. + * $civiOps[table-name][insert|update] +*/ +function searchCivi2($member) { + + global $dbConn; + global $dieMail; + global $memberCardTable; + global $memberCardField; + global $debug; + + // Because we can only return one thing, assign this global to avoid another lookup. + global $civiContactId; + + $civiOps = array(); + + $selLimit = "LIMIT 1"; + + //#'t + $sel = "SELECT DISTINCT +c.id as c_id +,a.contact_id as a_id +,p.contact_id as p_id +,e.contact_id as e_id +,m.contact_id as m_id +,v.entity_id as v_id +FROM +civicrm_membership m +INNER JOIN civicrm_contact c ON c.id = m.contact_id +LEFT JOIN civicrm_email e ON m.contact_id = e.contact_id +LEFT JOIN civicrm_address a ON m.contact_id = a.contact_id +LEFT JOIN civicrm_phone p ON m.contact_id = p.contact_id +LEFT JOIN $memberCardTable v ON m.contact_id = v.entity_id +WHERE m.id = $member +ORDER BY c.id +$selLimit;"; + + $rslt = $dbConn->query("$sel"); + // Not all errors, e.g. missing table alias, produce dbConn->errno + if ( ! $rslt ) { + $msg = "Returned False: $sel\n"; + $civiOps[] = array($msg); + return($civiOps); + } + if ( $dbConn->errno ) { + $msg = sprintf("Error: DQL failed: %s\n", $dbConn->error); + $civiOps[] = array($msg); + return($civiOps); + } + + $rows = $dbConn->num_rows($rslt); + + while ( $row = $dbConn->fetch_row($rslt) ) { + $civiContactId = $row[c_id]; + $civiOps['civicrm_contact'] = "update"; + $civiOps['civicrm_membership'] = ( $row[m_id] != "" ) ? "update" : "insert"; + $civiOps['civicrm_email'] = ( $row[e_id] != "" ) ? "update" : "insert"; + $civiOps['civicrm_address'] = ( $row[a_id] != "" ) ? "update" : "insert"; + $civiOps['civicrm_phone'] = ( $row[p_id] != "" ) ? "update" : "insert"; + $civiOps["$memberCardTable"] = ( $row[v_id] != "" ) ? "update" : "insert"; + $civiOps['civicrm_log'] = "insert"; + break; + } + + if ( $debug ) + goOrDie("In searchCivi2: rows: $rows civiContactId: $civiContactId"); + + return($civiOps); + +// searchCivi2 +} + +// Insert any new records for this Individual or Organization. +// Return "OK" if all OK or abort returning message on any error. +function insertToIS4C($mode) { + + global $dbConn2; + global $dieMail; + + global $insertCustdata; + global $insertMeminfo; + global $insertMemContact; + global $insertMemDates; + global $insertMemberCards; + global $insertStockpurchases; + + global $debug; + + $statements = array($insertMeminfo, + $insertMemContact, + $insertMemDates, + $insertMemberCards); + $statement = ""; + + if ( $debug > 0 ) + echo "In insertToIS4C debug: $debug\n"; + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1 ) + continue; + } + $rslt = $dbConn2->query("$statement"); + if ( $dbConn2->errno ) { + return(sprintf("Error: Insert failed: %s\n", $dbConn2->error)); + } + if ( ! $rslt ) { + return("Failed: $statement"); + } + } + } + + // Must do custdata last to assign LastChange rather than have its value + // come as a result of triggers on related tables. + // Will those triggers barf if custdata doesn't exist? + // If so must update custdata after other inserts. + if ( count($insertCustdata) > 0 ) { + foreach ($insertCustdata as $statement) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1) { + echo "NOT executed.\n"; + continue; + } + } + $rslt = $dbConn2->query("$statement"); + if ( $dbConn2->errno ) { + return(sprintf("Error: Insert failed: %s\n", $dbConn2->error)); + } + if ( ! $rslt ) { + return("Failed: $statement"); + } + } + } + else { + if ( $debug > 0 ) + echo "No custdata to insert. Mode: $mode\n"; + 1; + } + + // stockpurchases is in a different db. + + return("OK"); + +// insertToIS4C +} + +// Run any updates to the records for this Individual, Household or Organization. +// Return "OK" if all OK or abort returning message on any error. +function updateIS4C($mode) { + + global $dbConn2; + global $dieMail; + + global $updateCustdata; + global $updateMeminfo; + global $updateMemContact; + global $updateMemDates; + global $updateMemberCards; + global $updateStockpurchases; + + global $debug; + + $statements = array($updateMeminfo, + $updateMemContact, + $updateMemDates, + $updateMemberCards); + $statement = ""; + + if ( $debug > 0 ) + echo "In updateIS4C debug: $debug\n"; + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1) { + echo "NOT executed.\n"; + continue; + } + } + $rslt = $dbConn2->query("$statement"); + if ( $dbConn2->errno ) { + return(sprintf("Error: Update failed: %s\n", $dbConn2->error)); + } + if ( ! $rslt ) { + return("Failed: $statement"); + } + } + } + + // Must do custdata last to assign LastChange rather than have its value + // come as a result of triggers on related tables. + if ( count($updateCustdata) > 0 ) { + foreach ($updateCustdata as $statement) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1 ) + continue; + } + $rslt = $dbConn2->query("$statement"); + if ( $dbConn2->errno ) { + return(sprintf("Error: Update failed: %s\n", $dbConn2->error)); + } + if ( ! $rslt ) { + return("Failed: $statement"); + } + } + } + else { + if ( $debug > 0 ) + echo "No custdata to update. Mode: $mode\n"; + 1; + } + + // stockpurchases is in a different db. + + return("OK"); + +// updateIS4C +} + +// Insert any new records for this Individual or Organization. +// Return "OK" if all OK or abort returning message on any error. +function insertToCivi() { + + global $dbConn; + global $dieMail; + + global $insertContact; + global $insertMembership; + global $insertEmail; + global $insertAddress; + global $insertPhone; + global $insertMemberCard; + global $insertLog; + + global $debug; + + $statements = array(); + $statements[] = $insertContact; + $statements[] = $insertMembership; + $statements = array_merge($statements,$insertEmail); + $statements = array_merge($statements,$insertAddress); + $statements = array_merge($statements,$insertPhone); + $statements[] = $insertMemberCard; + $statements[] = $insertLog; + + $statement = ""; + + if ( $debug > 0 ) + echo "In insertToCivi debug: $debug\n"; + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1 ) + continue; + } + $rslt = $dbConn->query("$statement"); + if ( $dbConn->errno ) { + return(sprintf("Error: Insert failed: %s\n", $dbConn->error)); + } + if ( ! $rslt ) { + return("Failed: $statement"); + } + } + } + + return("OK"); + +// insertToCivi +} + +// Run any Updates to the records for this Individual, Household or Organization. +// Return "OK" if all OK or abort returning message on any error. +function updateCivi() { + + global $dbConn; + global $dieMail; + + global $updateContact; + global $updateMembership; + global $updateEmail; + global $updateAddress; + global $updatePhone; + global $updateMemberCard; + // civicrm_log is never updated, only inserted-to. + //global $updateLog; + + global $debug; + + $statements = array(); + $statements[] = $updateContact; + $statements[] = $updateMembership; + $statements = array_merge($statements,$updateEmail); + $statements = array_merge($statements,$updateAddress); + $statements = array_merge($statements,$updatePhone); + $statements[] = $updateMemberCard; + + $statement = ""; + + if ( $debug > 0 ) + echo "In updateCivi debug: $debug\n"; + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug > 0 ) { + echo $statement, "\n"; + if ( $debug == 1) + continue; + } + $rslt = $dbConn->query("$statement"); + if ( $dbConn->errno ) { + return(sprintf("Error: Update failed: %s\n", $dbConn->error)); + } + if ( ! $rslt ) { + return("Failed: $statement"); + } + } + } + + return("OK"); + +// updateCivi +} + +// Each IS4C table is represented by an assoc array. +function clearIs4cWorkVars() { + + // in core_op + // Card#, Person#, Name + global $custdata; + // Contact points for Card# + global $meminfo; + // Whether/how to contact. + global $memContact; + // Membership start, i.e. join date + global $memDates; + // Member Card barcode lookup. + global $memberCards; + // in core_trans + global $stockpurchases; + + // in core_op + // Card#, Person#, Name +// $custdata[CardNo] = 0; +// $custdata[personNum] = 0; + $flds = array_keys($custdata); + foreach ($flds as $field) { + $custdata[$field] = ""; + } + + $flds = array_keys($meminfo); + foreach ($flds as $field) { + $meminfo[$field] = ""; + } + + $flds = array_keys($memDates); + foreach ($flds as $field) { + $memDates[$field] = ""; + } + + $flds = array_keys($memContact); + foreach ($flds as $field) { + $memContact[$field] = ""; + } + + $flds = array_keys($memberCards); + foreach ($flds as $field) { + $memberCards[$field] = ""; + } + + $flds = array_keys($stockpurchases); + foreach ($flds as $field) { + $stockpurchases[$field] = ""; + } + + global $insertCustdata; + global $insertMeminfo; + global $insertMemContact; + global $insertMemDates; + global $insertMemberCards; + global $insertStockpurchases; + + global $updateCustdata; + global $updateMeminfo; + global $updateMemContact; + global $updateMemDates; + global $updateMemberCards; + global $updateStockpurchases; + + $insertCustdata = array(); + $insertMeminfo = ""; + $insertMemContact = ""; + $insertMemDates = ""; + $insertMemberCards = ""; + $insertStockpurchases = ""; + + $updateCustdata = array(); + $updateMeminfo = ""; + $updateMemContact = ""; + $updateMemDates = ""; + $updateMemberCards = ""; + $updateStockpurchases = ""; + +// clearIs4cWorkVars +} + +/* Each CiviCRM table is represented by an assoc array. + * Lists of insert and update statements. +*/ +function clearCiviWorkVars() { + + /* The table arrays. + */ + // Base + global $civicrm_contact; + // Membership# + global $civicrm_membership; + // email + global $civicrm_email; + // addres + global $civicrm_address; + // phone + global $civicrm_phone; + // Membership card# + global $civicrm_value_identification_and_cred; + // Datestamp + global $civicrm_log; + + $flds = array_keys($civicrm_contact); + foreach ($flds as $field) { + $civicrm_contact[$field] = ""; + } + + $flds = array_keys($civicrm_membership); + foreach ($flds as $field) { + $civicrm_membership[$field] = ""; + } + + $flds = array_keys($civicrm_email); + foreach ($flds as $field) { + $civicrm_email[$field] = ""; + } + + $flds = array_keys($civicrm_address); + foreach ($flds as $field) { + $civicrm_address[$field] = ""; + } + + $flds = array_keys($civicrm_phone); + foreach ($flds as $field) { + $civicrm_phone[$field] = ""; + } + + $flds = array_keys($civicrm_value_identification_and_cred); + foreach ($flds as $field) { + $civicrm_value_identification_and_cred[$field] = ""; + } + + $flds = array_keys($civicrm_log); + foreach ($flds as $field) { + $civicrm_log[$field] = ""; + } + + /* SQL DML statements + */ + global $insertContact; + global $insertMembership; + global $insertEmail; + global $insertAddress; + global $insertPhone; + global $insertMemberCard; + global $insertLog; + + global $updateContact; + global $updateMembership; + global $updateEmail; + global $updateAddress; + global $updatePhone; + global $updateMemberCard; + global $updateLog; + + /* SQL insert statements + * Are arrays if multiple is possible, e.g. email or phone + */ + $insertContact = ""; + $insertMembership = ""; + $insertEmail = array(); + $insertAddress = array(); + $insertPhone = array(); + $insertMemberCard = ""; + $insertLog = ""; + + /* SQL update statements + * Are arrays if multiple is possible, e.g. email or phone + */ + $updateContact = ""; + $updateMembership = ""; + $updateAddress = array(); + $updateEmail = array(); + $updatePhone = array(); + $updateMemberCard = ""; + $updateLog = ""; + +// clearCiviWorkVars +} + + +// Return civicrm_state_province.id for the argument or NULL if not known. +function getProvinceId($str) { + + global $dbConn; + global $dieMail; + + $retVal = ""; + + $str = strtoupper($str); + // if ( $str == "ON" ) { $retVal = 1108; } + + $sel = "SELECT id, country_id + FROM civicrm_state_province + WHERE abbreviation = '$str' AND country_id in (1228,1039) LIMIT 1"; + $rslt = $dbConn->query("$sel"); + if ( $dbConn->errno ) { + $msg = sprintf("Failed: %s", $dbConn->error); + dieHere("$msg", $dieMail); + } + if ( $rslt ) { + $row = $dbConn->fetch_row($rslt); + $retVal = $row[id]; + if ( $retVal == "" ) { + $retVal = "NULL"; + } + } else { + $msg = sprintf("getProvinceId failed on: %s", $sel); + dieHere("$msg", $dieMail); + } + + return($retVal); + +//getProvinceId +} + +/* Return the province/state abbreviation. + * If none supplied try to deduce from city or postal code +*/ +function fixProvince($id = 0, $prov, $city, $postcode) { + + $retVal = ""; + + if ( $prov != "" ) { + $retVal = $prov; + } + elseif ( stripos("|Toronto|Etobicoke|Mississauga|North York|Scarborough|", "|${city}|") !== FALSE ) { + $retVal = "ON"; + } + elseif ( strpos("MLPKN", substr($postcode,0,1) ) !== FALSE ) { + $retVal = "ON"; + } + else { + $retVal = "XX"; + } + + return($retVal); + +//fixProvince +} + +// Return in format "A9A 9A9". Leaves zip codes alone. +function fixPostalCode($str = "") { + $str = strtoupper($str); + // Remove anything but uppercase letters and numbers. + $str = preg_replace("/[^A-Z\d]/", "", $str); + // Format: A9A 9A9 + // Leaves non-postal-code content alone. + $str = preg_replace("/([A-Z]\d[A-Z])(\d[A-Z]\d)/", "$1 $2", $str); + return($str); +//fixPostalCode +} + +/* Return in format 999-999-9999 + unless the original wasn't even close. + Does not try to handle extensions. +*/ +function fixPhone($str = "") { + $str_orig = $str; + $str = preg_replace("/[^\d]/", "", $str); + $str = preg_replace("/^(\d{3})(\d{3})(\d{4})$/", "$1-$2-$3", $str); + if ( preg_match("/^(\d{3})-(\d{3})-(\d{4})$/", $str) ) { + return($str); + } else { + // Let dbc->escape() do this. + //$str_orig = str_replace("'", "''", $str_orig); + return($str_orig); + } +//fixPhone +} + +/* City: + + tolower if ALL CAPS + + Capitalize first letter of each word + + Double apostrophes +*/ +function fixCity($str = "") { + if ( preg_match("/[A-Z]{3}/", $str) ) { + $str = strtolower($str); + } + $str = ucwords($str); + // Let dbc->escape() do this. + //$str = str_replace("'", "''", $str); + return($str); +//fixCity +} + +/* Name: + + tolower if ALL CAPS + + Capitalize first letter of each word + + Double apostrophes +*/ +function fixName($str = "") { + if ( preg_match("/[A-Z]{3}/", $str) ) { + $str = strtolower($str); + // First letter after hyphen + $str = preg_replace("/(-[A-Z])/", "$1", $str); + if ( "$1" != "" ) { + $upper1 = strtoupper("$1"); + $str = str_replace("$1", "$upper1", $str); + } + //$str = preg_replace("/(-[A-Z])/", strtoupper($1), $str); // T_LNUMBER error + $str = ucwords($str); + } + // Is all-lowercase + hyphen space apostrophe + elseif ( preg_match("/^[- 'a-z]+$/", $str) ) { + // Need exceptions: "di", "de la", ... ? + $str = ucwords($str); + } + // Already mixed-case + else { + 1; + } + // Let dbc->escape() do this. + //$str = str_replace("'", "''", $str); + return($str); +//fixName +} + +/* Address: + + tolower if ALL CAPS + + Capitalize first letter of each word + + Double apostrophes +*/ +function fixAddress($str = "") { + if ( preg_match("/[A-Z]{3}/", $str) ) { + $str = strtolower($str); + } + $str = ucwords($str); + // Let dbc->escape() do this. + //$str = str_replace("'", "''", $str); + return($str); +//fixAddress +} + +/* Return TRUE if the string looks like an email address, FALSE otherwise. +*/ +function isEmail($str) { + + $retVal = preg_match("/^[^@]+@.+\.[a-z]{3,4}$/i", $str); + + return($retVal); + +//isEmail() +} + +/* Return TRUE if the string looks like a phone number, FALSE otherwise. + * Not a precise match, just plausible. +*/ +function isPhone($str) { + + $retVal = preg_match("/\d{3}.\d{3}.\d{4}/", $str); + + return($retVal); + +//isPhone() +} + +/* Abort, with message to email or terminal. + * Better to depend on $dieMail than $mail? +*/ +function dieHere($msg="", $mail="1") { + + global $dbConn; + global $dbConn2; + global $admins; + global $dieMail; + + if ( $mail ) { + $subject = "PoS: Error: Update members"; + $message = "$msg"; + $adminString = implode(" ", $admins); + + $lastLine = exec("echo \"$message\" | mail -s \"$subject\" $adminString"); + // Ordinary success returns nothing, or "". + if ( $lastLine != "" ) { + echo "from mailing: {$lastLine}\n"; + } + echo cron_msg("$msg\n"); + } + else { + echo "dieHere: $msg"; + } + + if ( $dbConn ) { + // Warning: mysqli::close(): Couldn't fetch mysqli in /home/parkdale/is4c/updateMembers.php on line next + @$dbConn->close(); + } else { + 1; + } + + if ( $dbConn2 ) { + @$dbConn2->close(); + } else { + 1; + } + + exit(); + +//dieHere +} + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +*/ +function problemHere($msg="") { + + global $problemPrefix; + global $problems; + + $problemPrefix = "*** PROBLEM "; + $problems[] = $msg; + +//problemHere +} + +/* Return an array of the name keys: 1, 3, etc. +*/ +function getNameKeys($row) { + + $names = array(); + $key = ""; + $n = 0; + foreach (array_keys($row) as $key) { + // Test for odd number. + // http://ca.php.net/manual/en/function.array-filter.php + // Also works: + //if ( ($n % 2) != 0 ) {} + if ($n & 1) { + $names[] = $key; + //echo "$n odd: $key\n"; + } else { + 1; + //echo "$n not-odd: $key\n"; + } + $n++; + } + + return($names); + +//getNameKeys +} + +// Return an array of the values from the odd-numbered elements i.e. hash-name keys: 1, 3, etc. +// I.e. reduce the duplication of a BOTH array. +// Getting the evens would have the same result. +function getNameValues($row) { + + $values = array(); + $val = ""; + $n = 0; + foreach ($row as $val) { + // Test for odd number. + // http://ca.php.net/manual/en/function.array-filter.php + // Also works: + //if ( ($n % 2) != 0 ) {} + if ($n & 1) { + $values[] = $val; + //echo "$n odd: $key\n"; + } else { + 1; + //echo "$n not-odd: $key\n"; + } + $n++; + } + + return($values); + +//getNameValues +} + +/* Little tests of civicrm connection. Then die. +*/ +function civiTestAndDie($dbConn) { + + global $dieMail; + + $selectCivi = "SELECT id, contact_id from civicrm_membership LIMIT 5;"; + $civim = $dbConn->query("$selectCivi"); + // Does not complain about error in MySQL statement. + // $civim is FALSE in that case. + // See $LOGS/queries.log for them. + if ( $dbConn->errno ) { + $message = printf("Select failed: %s\n", $dbConn->error); + dieHere("$message", 0); + } + if ( ! $civim ) { + $msg = sprintf("Failed on: %s", $selectCivi); + dieHere("$msg", 0); + } + + // Quick test. + echo "Civi Members Numbered\n"; + //mysqli: while ( $row = $civim->fetch_row() ) {} + while ( $row = $dbConn->fetch_array($civim) ) { + // The numeric keys come first. 0,2,4. Name keys 1, 3, 5. + $flds = getNameKeys($row); + //$flds = array_keys($row); + $lineOut = implode("\t", $flds) . "\n"; + echo $lineOut; + $lineOut = implode("\t", array($row[id], $row[contact_id])) . "\n"; + echo $lineOut; + // This gives duplicate values, for each of: first number, then name reference. + //$lineOut = implode("\t", $row) . "\n"; + // Reduce to one set. + /* + $vals = getNameValues($row); + $lineOut = implode("\t", $vals) . "\n"; + echo $lineOut; + */ + } + + dieHere("Civi test OK, bailing ...", 0); + +// civiTest() +} + +// Little tests of is4c connection. +function is4cTestAndDie($dbConn2) { + + global $dieMail; + + $selectIs4c = "SELECT CardNo, LastName from custdata LIMIT 5;"; + $customers = $dbConn2->query("$selectIs4c"); + if ( $dbConn2->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere($message, $dieMail); + } + if ( ! $customers ) { + $msg = sprintf("Failed on: %s", $selectIs4c); + dieHere("$msg", 0); + } + + echo "IS4C Numbered\n"; + while ( $row = $dbConn2->fetch_row($customers) ) { + $flds = getNameKeys($row); + $lineOut = implode("\t", $flds) . "\n"; + echo $lineOut; + $vals = getNameValues($row); + $lineOut = implode("\t", $vals) . "\n"; + echo $lineOut; + $lineOut = implode("\t", array($row[CardNo], $row[LastName])) . "\n"; + echo $lineOut; + } + dieHere("IS4C OK, bailing ...", 0); + +// is4cTestAndDie(); +} + +/* Pause with information with abort option. + * ^C also terminates, without ceremony. +*/ +function goOrDie($prompt) { + $ans = readline("$prompt [q] > "); + if ( strpos($ans, "q") === 0 ) { + dieHere("Quitting", 0); + } elseif ( $ans === FALSE ) { + dieHere("on ^D", 0); + } else { + //echo "Go.\n"; + 1; + } +} + +// --functions } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// --PREP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/* Report simple running errors + These kind of errors go to STDOUT or STDERR before they are tested for or trapped. + But see note about suppression with @, above. +*/ +error_reporting(E_ERROR | E_WARNING); +//error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); + +//#'C --CONSTANTS { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +include('../config.php'); +// Connection id's, etc. +include('../config_wefc.php'); +include('../src/SQLManager.php'); +include($FANNIE_ROOT.'src/cron_msg.php'); + +// No limit on PHP execution time. +set_time_limit(0); + +// Only used during development, for a local source for remote data. +$outFile = "../logs/updateMembers.tab"; + +/* Log. Cumulative. + * Contains the one-line summary emailed to ops. +*/ +$logFile = "../logs/updateMembers.log"; + +/* Run report. Cumulative. + * An item for each change in a run. +*/ +$reportFile = "../logs/updateMembersReport.log"; + +// test: 4000 production: 0 +$memberIdOffset = 0; +// IS4C member#s above this are temporaries. See toCivi(). +$tempMemberRange = 65000; + +/* Development-related vars. +*/ +// Controls some monitoring and info. +// 1=notify, no-write to db, 2=notify but write to db. +$debug = 0; +// +// Whether dieHere() =1 sends email or =0 Displays the message. +// Optional arg to dieHere(); defaults to 1. +$dieMail = 1; +// +// Used in composing vars for Civi db access. +// Use _DEV for new-conact tests. +$dev = ""; +//$dev = "_DEV"; +// +// 0=normal, 1=return from to[ISC4C|Civi]() without changing anything. +$dryRun = 0; + +$memberCardTable = "civicrm_value_identification_and_cred_5"; +$memberCardField = "member_card_number2_21"; +if ( $dev != "" ) { + $memberCardTable = "civicrm_value_identification_and_cred_4"; + $memberCardField = "member_card_number_16"; +} + +// People to whom news is mailed. +$admins = array("el66gr@gmail.com"); + +$is4cTableNames = array('custdata', 'meminfo', 'memContact', 'memDates', 'memberCards', + 'stockpurchases'); +$civiTableNames = array('civicrm_contact', 'civicrm_membership', + 'civicrm_email', 'civicrm_address', 'civicrm_phone', + "$memberCardTable", + 'civicrm_log'); + +// --constants } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +//#'V --VARIABLES { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// Counter of tab-delim lines. +$outCount = 0; +// Counter of rows from raw select. +$inCount = 0; + +$noChange = 0; +$insertI = 0; +$updateI = 0; +$insertC = 0; +$updateC = 0; + +/* If > 0 flag in email to op. + * See problemHere() +*/ +$problemPrefix = ""; +$problems = array(); + +/* Arrays for IS4C tables + Initialized by clearIs4cWorkVars() +*/ +// in core_op +// Card#, Person#, Name +$custdata = array( + "CardNo" => "", + "personNum" => "", + "LastName" => "", + "FirstName" => "", + "Type" => "", + "memType" => "", + "blueLine" => "", + "LastChange" => "", + "id" => "" +); +// Contact points for Card# +$meminfo = array( + "card_no" => "", + "last_name" => "", + "first_name" => "", + "street" => "", + "city" => "", + "state" => "", + "zip" => "", + "phone" => "", + "email_1" => "", + "email_2" => "", + "ads_OK" => "" +); +// Whether/how to contact. +$memContact = array( + "card_no" => "", + "x" => "" +); +// Membership start, i.e. join date +$memDates = array( + "card_no" => "", + "x" => "" +); +// Member Card barcode lookup. +$memberCards = array( + "card_no" => "", + "upc" => "" + ); +// in core_trans +$stockpurchases = array( + "card_no" => "", + "x" => "" +); + +$is4cTables = array("core_op|custdata|CardNo", + "core_op|meminfo|card_no", + "core_op|memContact|card_no", + "core_op|memDates|card_no", + "core_op|memberCards|card_no", + "core_trans|stockpurchases|card_no"); + +$insertCustdata = array(); +$insertMeminfo = ""; +$insertMemContact = ""; +$insertMemDates = ""; +$insertMemberCards = ""; +$insertStockpurchases = ""; + +$updateCustdata = array(); +$updateMeminfo = ""; +$updateMemContact = ""; +$updateMemDates = ""; +$updateMemberCards = ""; +$updateStockpurchases = ""; + +// Operation: insert or update +$is4cOps = array(); + +/* Vars for CiviCRM { +*/ + +// civicrm_contact.id +$civiContactId = 0; + +// Base contact record. +$civicrm_contact = array( + "id" => "", +// 'Individual' 'Organization' + "contact_type" => "", +// Not email. [0]/1 + "do_not_email" => "", +// Not phone. [0]/1 - 29Nov12 Leave alone for now. + "do_not_phone" => "", +// Not mail. [0]/1 - 29Nov12 Leave alone for now. + "do_not_mail" => "", +// No contact at all: [0]/1 +// Can be set by the contact in response to an email. +// Map to meminfo.ads_OK, inverted. + "is_opt_out" => "", +// Last, First or email + "sort_name" => "", +// First Last or email + "display_name" => "", +// Leave alone. Rarely used. Is a string of numbers: +// 1=phone 2=email 3=postal-mail +// Might partially-map to memContact.pref if used more. + "preferred_commuication_method" => "", +// Is text. For inserts, 'IS4C', otherwise leave alone. + "source" => "", + "first_name" => "", + "middle_name" => "", + "last_name" => "", +// Use? 1=Dr. Where are real codes? Table civicrm_prefix doesn't exist. +// "prefix_id" => "", + "organization_name" => "", +// [0]/1 Leave alone. Rarely if ever used in Civi and not supported in IS4C. + "is_deleted" => "", + "x" => "" +); + +// Membership +$civicrm_membership = array( + "id" => "", + "contact_id" => "", + "membership_type_id" => "", + "join_date" => "", + "start_date" => "", + "x" => "" +); + +/* location_type_id: + * 1=Home + * 2=Work + * 3=Main + * 4=Other + * 5=Billing +*/ + +// Email +$civicrm_email = array( + "id" => "", + "contact_id" => "", + "location_type_id" => "", +// Primary: [0]/1 On first insert=1, on second allow default. On update, leave alone. + "is_primary" => "", + "email" => "", +// OK to mail: [0]/1 On insert=1, On update, leave alone. + "is_bulkmail" => "", + "x" => "" +); + +// Address +$civicrm_address = array( + "id" => "", + "contact_id" => "", + "location_type_id" => "", +// Primary: [0]/1 On first insert=1, on second allow default. On update, leave alone. + "is_primary" => "", + "street_address" => "", + "city" => "", + "state_province_id" => "", + "postal_code" => "", + "country_id" => "", + "x" => "" +); + +// Phone +$civicrm_phone = array( + "id" => "", + "contact_id" => "", + "location_type_id" => "", + "is_primary" => "", + "phone" => "", + "phone_ext" => "", +// Primary: [0]/1 On first insert=1, on second allow default. On update, leave alone. + "x" => "" +); + +// Membership card#. +$civicrm_value_identification_and_cred = array( + "id" => "", + "entity_id" => "", + "$memberCardField" => "", + "x" => "" +); + +// Update log. Always insert. +$civicrm_log = array( + "id" => "", +// 'civicrm_contact' + "entity_table" => "", +// contact_id + "entity_id" => "", +// "'$entity_table,$contact_id'" + "data" => "", +// Need a contact_id for IS4C. + "modified_id" => "", +// datetime + "modified_date" => "", + "x" => "" +); + +$civiTables = array("parkdale_wefc_c|civicrm_contact|id", + "parkdale_wefc_c|civicrm_membership|contact_id", + "parkdale_wefc_c|civicrm_email|contact_id", + "parkdale_wefc_c|civicrm_address|contact_id", + "parkdale_wefc_c|civicrm_phone|contact_id", + "parkdale_wefc_c|{$memberCardTable}|contact_id", + "parkdale_wefc_c|civicrm_log|entity_id"); + +/* SQL insert statements + * Are arrays if multiple is possible, e.g. email or phone +*/ +$insertContact = ""; +$insertMembership = ""; +$insertEmail = array(); +$insertAddress = array(); +$insertPhone = array(); +$insertMemberCard = ""; +$insertLog = ""; + +/* SQL update statements + * Are arrays if multiple is possible, e.g. email or phone +*/ +$updateContact = ""; +$updateMembership = ""; +$updateAddress = array(); +$updateEmail = array(); +$updatePhone = array(); +$updateMemberCard = ""; +$updateLog = ""; + +// Operation: insert or update +$civiOps = array(); + +// civi vars } + +// --variables } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +//#'M --MAIN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +clearIs4cWorkVars(); +clearCiviWorkVars(); + +// The "@" prevents the error from being reported immediately, +// but the test further on will still see it. +if ( ! $dev ) { +$dbConn = new SQLManager($CIVICRM_SERVER,$CIVICRM_SERVER_DBMS,$CIVICRM_DB, + $CIVICRM_SERVER_USER,$CIVICRM_SERVER_PW); +} else { + $dbConn = new SQLManager($CIVICRM_SERVER,$CIVICRM_SERVER_DBMS,$CIVICRM_DB_DEV, + $CIVICRM_SERVER_USER_DEV,$CIVICRM_SERVER_PW_DEV); +} + +$message = $dbConn->error(); +if ( $message != "" ) { + dieHere("$message", $dieMail); +} + +/* Little tests of civiCRM connection. +civiTestAndDie($dbConn); +*/ + +$dbConn2 = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); +if ( $dbConn2->connect_errno ) { + $message = sprintf("Connect2 failed: %s\n", $dbConn2->connect_error); + dieHere("$message", $dieMail); +} + +/*Get the timestamp of the last run of this program + * Not sure that is safe. Always use epoch. + * The pairs with same datestamps are ignored. + * If parts of pairs lost, then trouble. How would that happen? +*/ +$epoch = "0000-00-00 00:00:00"; +$latestRunDate = $epoch; +//$latestRunDate = getLatestRun($reportFile); + +/* Open the log files */ + +/* 5Jan13 At this point only really used for debugging. + * Stop using it in production. +*/ +$outer = fopen("$outFile", "w"); +if ( ! $outer ) { + dieHere("Could not open $outFile\n", $dieMail); +} + +// Contains the one-line summary emailed to ops. +$logger = fopen("$logFile", "a"); +if ( ! $logger ) { + dieHere("Could not open $logFile\n", $dieMail); +} + +/* Contains START and FINISH datestamps and + * a list of what was done to each record: + * No-change + * Update, and which is source and target. + * Insert, and which is source and target. +*/ +$reporter = fopen("$reportFile", "a"); +if ( ! $reporter ) { + dieHere("Could not open $reportFile\n", $dieMail); +} +$dbNow = date("Y-m-d H:i:s"); // " e" +fwrite($reporter, "STARTED: $dbNow\n"); + +/* End of open the log files */ + + +// #'N True in production. +// False in development, False to disable getting actual data and use local source instead. +if ( TRUE ) { + +// CiviCRM members with date modified. +$c_selectMembers = "SELECT DISTINCT +c.id as contact_id +,c.first_name +,c.last_name +,m.id as member_id + ,m.join_date +,v.{$memberCardField} as mcard +,u.modified_date +FROM +civicrm_membership m INNER JOIN civicrm_contact c ON c.id = m.contact_id +LEFT JOIN {$memberCardTable} v ON m.contact_id = v.entity_id +LEFT JOIN civicrm_log u ON m.contact_id = u.entity_id AND u.entity_table = 'civicrm_contact' +WHERE u.modified_date > '$latestRunDate' + AND NOT (m.is_override = 1 AND m.status_id = 6) +ORDER BY c.id, m.id, u.modified_date DESC;"; + +$c_members = $dbConn->query("$c_selectMembers"); +//$c_members = $dbConn->query("$c_selectMembers", MYSQLI_STORE_RESULT); +if ( $dbConn->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere("$message", $dieMail); +} +if ( ! $c_members ) { + $msg = sprintf("Failed on: %s", $c_selectMembers); + dieHere("$msg", $dieMail); +} + +// Populate the big list with Civi members. +$allMembers = array(); +$ami = -1; +$lastCid = -1; +$lastMid = -1; +$memberForContact = -1; +while ( $c_row = $dbConn->fetch_row($c_members) ) { + + if ( $c_row['contact_id'] == $lastCid ) { + if ( $c_row['member_id'] == $lastMid ) { + $dupCid++; + $isDupCid = 1; + } else { + $uniqueCid++; + $isDupCid = 0; + $problems[] = "{$c_row[first_name]} {$c_row[last_name]} contact $lastCid has membership $lastMid and membership {$c_row[member_id]}"; + $lastMid = "$c_row[member_id]"; + } + } else { + $uniqueCid++; + $isDupCid = 0; + $lastCid = "$c_row[contact_id]"; + $lastMid = "$c_row[member_id]"; + $memberForContact = "$c_row[member_id]"; + } + + // For the first record for each member (same contact_id and member_id): + if ( $isDupCid == 0 ) { + + $ami++; + $allMembers[$ami] = sprintf("%05d|%s|C", $c_row[member_id], $c_row[modified_date]); + //$allMembers[$ami] = sprintf("%05d|%s|C %05d", $c_row[member_id], $c_row[modified_date], $c_row[contact_id]); + + } +} + +// Get all the the members from IS4C, except placeholder "NEW MEMBER"s. +$is4cMin = 470; +$is4cMax = 99997; // 99997 +$i_selectMembers ="SELECT CardNo, LastChange +FROM custdata +WHERE CardNo between $is4cMin AND $is4cMax AND LastName != 'NEW MEMBER' + AND NumberOfChecks != 9"; +$i_members = $dbConn2->query("$i_selectMembers"); +if ( $dbConn2->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere($message, $dieMail); +} +if ( ! $i_members ) { + $msg = sprintf("Failed on: %s", $i_selectMembers); + dieHere("$msg", $dieMail); +} +$lastCardNo = ""; +while ( $i_row = $dbConn2->fetch_row($i_members) ) { + if ( $i_row[CardNo] == $lastCardNo ) + continue; + $allMembers[] = sprintf("%05d|%s|I", $i_row[CardNo], $i_row[LastChange]); + $lastCardNo = $i_row[CardNo]; +} + +sort($allMembers); + +/* This file isn't used except during development. +*/ +foreach ( $allMembers as $item ) { + fwrite($outer, "$item\n"); +} +if ( count($problems) > 0 ) { + fwrite($outer, implode("\n", $problems)); + echo implode("\n", $problems), "\n";; +} + +//dieHere("Got real list in $outFile", 0); + +// Enable/Defeat normal member-getting from dbs. +} +else { + // During dev't use this instead of getting from dbs + $allMembers = file("../logs/updateMembers_real.txt", FILE_IGNORE_NEW_LINES); +} + +// #'L --LOOP + +$ami = -1; +$lastAmi = (count($allMembers) - 1); + +// Get the next pair. +list($m1,$d1,$s1) = explode("|", $allMembers[++$ami]); + $m1 = ltrim($m1, "0"); +list($m2,$d2,$s2) = explode("|", $allMembers[++$ami]); + $m2 = ltrim($m2, "0"); +$prevAmi = ($ami - 1); +$nextAmi = ($ami + 1); + +// This is a card_no, not civicrm_contact.id +$maxM = 575; +// Does not work if there is only one item in $allMembers. +while ( $ami <= $lastAmi ) { + + /* Used in development + if ( $m1 > $maxM || $m2 > $maxM ) + break; + if ( $noChange > 9999 ) + break; + if ( $updateI > 9999 ) + break; + if ( $updateC > 1 ) + break; + if ( $insertI > 9999 ) + break; + if ( $insertC > 9 ) + break; + // Only in development. + //fwrite($outer, "#${prevAmi}/$m1 : #${ami}/$m2\n"); + */ + + if ( $debug ) { + echo "ami#${prevAmi} of $lastAmi/$m1 : ami#${ami}/$m2\n"; + } + if ( $m1 == $m2 ) { + if ( $d1 == $d2 ) { + $noChange++; + $msg = " $m1:$d1 = $m2:$d2 -> do nothing\n"; + fwrite($reporter, $msg); + if ( $debug > 0 ) + echo $msg; + } + elseif ( "$d1" < "$d2" ) { + $msg = " $m1:$d1 < $m2:$d2 -> update $s1\n"; + $problems[] = $msg; + fwrite($reporter, $msg); + if ( $debug > 0 ) + echo $msg; + if ( $s1 == "I" ) { + $updateI++; + toIS4C("update",$m1, $d2); + } elseif ( $s1 == "C" ) { + $updateC++; + toCivi("update", $m1, $d2); + } else { + $msg = "Unknown s1 >${s1}< for update."; + fwrite($reporter, " $msg\n"); + dieHere("$msg", $dieMail); + } + } + else { + $msg = "How can ami# $prevAmi >$d1< be > >$d2< ?"; + fwrite($reporter, " $msg\n"); + dieHere("$msg", $dieMail); + } + + if ( $nextAmi > $lastAmi ) { + // Do nothing and force exit. + $ami++; + } + else { + // Get the first of the next pair. + list($m1,$d1,$s1) = explode("|", $allMembers[++$ami]); + $m1 = ltrim($m1, "0"); + // Is it the last in the list? + if ( ($ami + 0) == $lastAmi ) { + // What do do? Must be add? + // Do it, then ++ami to let/force loop to end. + echo "A at lastAmi: $m1, $d1, $s1\n"; + $otherSource = ( $s1 == "I" ) ? "C" : "I"; + $msg = " $m1/$s1 != $m2/$s2 -> 1add $m1 to $otherSource\n"; + $problems[] = $msg; + fwrite($reporter, $msg); + if ( $debug > 0 ) + echo $msg; + if ( $otherSource == "I" ) { + $insertI++; + toIS4C("insert", $m1, $d1); + } elseif ( $otherSource == "C" ) { + $insertC++; + toCivi("insert", $m1, $d1); + } else { + $msg = "Unknown s1 >${s1}< for add."; + fwrite($reporter, " $msg\n"); + dieHere("$msg", $dieMail); + } + // Force exit + $ami++; + } + // Get the second of the next pair. + else { + list($m2,$d2,$s2) = explode("|", $allMembers[++$ami]); + $m2 = ltrim($m2, "0"); + $prevAmi = ($ami - 1); + $nextAmi = ($ami + 1); + } + } + + } + // Don't match. + // Assume m1 needs to be added to other-source. + elseif ( $m1 < $m2 ) { + $otherSource = ( $s1 == "I" ) ? "C" : "I"; + $msg = " $m1/$s1 != $m2/$s2 -> 2add $m1 to $otherSource\n"; + $problems[] = $msg; + fwrite($reporter, $msg); + if ( $debug > 0 ) + echo $msg; + /* The apparatus for adding */ + if ( $otherSource == "I" ) { + $insertI++; + toIS4C("insert", $m1, $d1); + } elseif ( $otherSource == "C" ) { + $insertC++; + toCivi("insert", $m1, $d1); + } else { + $msg = "Unknown s1 >${s1}< for add."; + fwrite($reporter, " $msg\n"); + dieHere("$msg", $dieMail); + } + + // Get the next pair. + // Shift the current #*2 to #*1. + list($m1,$d1,$s1) = explode("|", $allMembers[$ami]); + $m1 = ltrim($m1, "0"); + // Check for the last one. + if ( ($ami + 0) == $lastAmi ) { + // What do do? Must be add? + // Do it, then ++ami to let/force loop to end. + echo "B at lastAmi: $m1, $d1, $s1\n"; + $otherSource = ( $s1 == "I" ) ? "C" : "I"; + $msg = " $m1/$s1 != $m2/$s2 -> 3add $m1 to $otherSource\n"; + $problems[] = $msg; + fwrite($reporter, $msg); + if ( $debug > 0 ) + echo $msg; + if ( $otherSource == "I" ) { + $insertI++; + toIS4C("insert", $m1, $d1); + } elseif ( $otherSource == "C" ) { + $insertC++; + toCivi("insert", $m1, $d1); + } else { + $msg = "Unknown s1 >${s1}< for add."; + fwrite($reporter, " $msg\n"); + dieHere("$msg", $dieMail); + } + // Force exit + $ami++; + } + else { + // Get the next #2. + list($m2,$d2,$s2) = explode("|", $allMembers[++$ami]); + $m2 = ltrim($m2, "0"); + $prevAmi = ($ami - 1); + $nextAmi = ($ami + 1); + } + + } + else { + $msg = "How can ami# $prevAmi >$m1< be > >$m2< ?"; + dieHere("$msg", $dieMail); + } + +// Each member --loop +} + + +/* #'R Logging and reporting +*/ + +$dbNow = date("Y-m-d H:i:s"); // " e" +$subject = "{$problemPrefix}PoS: $dbNow Update members: added $insertC to CiviCRM, $insertI to IS4C"; +$shortMessage = ($dryRun == 1)?"Dry Run: ":""; +$shortMessage .= "No change needed: $noChange \nAdded to CiviCRM: $insertC \nUpdated CiviCRM: $updateC \nAdded to IS4C: $insertI \nUpdated IS4C: $updateI \n"; +$cronMessage = str_replace(" \n", " : ", $shortMessage); +if ( count($problems) > 0 ) { + $shortMessage .= implode("\n", $problems); + $shortMessage .= "\n"; +} +$adminString = implode(" ", $admins); + +$lastLine = exec("/bin/echo -en \"$shortMessage\" | mail -s \"$subject\" $adminString"); +// Ordinary success returns nothing, or "". +if ( $lastLine != "" ) { + echo "from mailing: {$lastLine}\n"; +} + +$now = date("Ymd_M H:i:s e"); +fwrite($logger, "$now $shortMessage"); + +$dbNow = date("Y-m-d H:i:s"); // " e" +fwrite($reporter, "FINISHED_OK: $dbNow\n"); + +// For dayend.log +echo cron_msg("{$problemPrefix}Success syncing members between CiviCRM and IS4C: $cronMessage\n"); + +/* Tie up and shut down. +*/ + +if ( $dbConn ) { + $dbConn->close(); +} else { + //echo "No dbConn to close.\n"; + 1; +} +//echo "After ->close \n"; +if ( $dbConn2 ) { + $dbConn2->close(); +} else { + //echo "No dbConn2 to close.\n"; + 1; +} + +// Close various-development-use file +//fclose($outer); + +// Close logfile +fclose($logger); + +// Close reportfile +fclose($reporter); + +exit(); + + +/*#'W --WOODSHED { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + --woodshed } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +*/ + + +?> diff --git a/fannie/cron/members.update.from.CiviCRM.php b/fannie/cron/members.update.from.CiviCRM.php new file mode 100644 index 000000000..b088bbce5 --- /dev/null +++ b/fannie/cron/members.update.from.CiviCRM.php @@ -0,0 +1,1733 @@ + Try doing dbConn2 as add_connection. It may be necessary. + It is important that the databases for each conn have different names. + See nightly.dtrans.php for example, but it isn't clear how you distinguish the two. + See the (foo,$database) arg, which defaults to the first one. + There they are both on the same server. + Perhaps the usage is limited to transfers. + -> Try SetFetchMode + 12Jul12 EL For IS4C environment. + +Differences between mysqli and SQLManager syntax: +Both work here. + +// Connect: +$dbConn = @new mysqli("$CIVICRM_SERVER", "$CIVICRM_SERVER_USER", "$CIVICRM_SERVER_PW", "$CIVICRM_DB"); +$dbConn = new SQLManager($CIVICRM_SERVER,$CIVICRM_SERVER_DBMS,$CIVICRM_DB, + $CIVICRM_SERVER_USER,$CIVICRM_SERVER_PW); + +// Same: +$selectCivi = "SELECT id, contact_id from civicrm_membership LIMIT 10;"; +$civim = $dbConn->query("$selectCivi"); + +// Fetch: +while ( $row = $civim->fetch_row() ) {} +while ( $row = $dbConn->fetch_row($civim) ) {} + +$dbConn->connect_errno and $dbConn->connect_error don't exist in SQLManager, use $dbConn->error + + --upadateMembers at point of port from webfaction:- - - - - - - - - - - - - - - - - - + 11Jul EL + log final email message + o Better to log results to file + - and email that? + + Run this on the whole set. + - Clear and then run with real member id#s. Maybe not for a while yet. + -> Handle multiple first name. Should this be a Household? +There is also a Household for them, #2115, linking to #823 and #824. Is #1187 obsolete? +1187 Individual 0 Peter/Debbie Fleming/Adams 80 Ritchie Ave. Toronto M6R 2J9 1108 1039 661 4 0 2010-07-06 2010-07-06 +823 Individual 0 Peter Fleming 80 Ritchie Ave. Toronto M6R 2J9 1108 1039 416 537 6576 peterfleming@sympatico.ca 0 0 565 4 0 2010-01-02 2010-01-02 100.00 7 1 2010-03-12 00:00:00 1 +824 Individual 0 Debbie Adams 80 Ritchie Ave. Toronto M6R 2J9 1108 1039 debbieadams@sympatico.ca 0 0 835 4 0 2010-03-12 2010-03-12 100.00 7 1 2010-03-12 00:00:00 0 +824 Individual 0 Debbie Adams 80 Ritchie Ave. Toronto M6R 2J9 1108 1039 debbieadams@sympatico.ca 0 0 835 4 0 2010-03-12 2010-03-12 100.00 7 1 2010-03-12 00:00:00 0 + -> Re multiple records for a person: + - Add is_primary to address, phone and email field sets + - Capture 2nd phone for meminfo.email_2 + There's no current place in IS4C for other 2nd+ contact points. + + LEFT JOIN on email. Doesn't help dups but gets 18 records w/o email. + + Try DISTINCT. Gets rid of dups. + 10Jul EL + To run by cron: + + email results to admin(s). + + func to handle, email errors instead of die. + + .sh to run this. Mainly to cd to ~/is4c. Can PHP do that? + + cronjob to run the .sh or this. + + Defeat clearing IS4C tables: clearIS4C + - Undo Janna jigger in clearIS4C. + 9Jul EL Branch from getMembers.php to: + + update the name and contact-point data + but not re-initialize IS4C fields that are populated for new records. + + create new records as in getMembers.php (as in getMembers.php) + + --getMembers at point of branch:- - - - - - - - - - - - - - - - - - - - - - - - - + 7Jul EL + Do complete run. Doesn't crash, not perfect. + o Fixing funcs. + o Household, other multiples working. Data style not settled. + + Handle Organization Name as last name + -> Is there a cashier-side lookup? + -> Code this to lookup-and-update for existing members. + 5Jul EL + memDates and memContact done. + -> How to identify new records for a later run? + xDatestamp? None exists. + -Last member# + -> Code stockpurchases. Worth the trouble? + - Is there a change-db method in the conn? + - How to identify the membership purchase: + - Explicit + - Bond + $5 + - Any cannery, if not one of the others. + 4Jul EL + Test after at least part of meminfo assignment is coded. OK! + 2Jul EL + Code part of each of + + custdata and (lint ok, not tested) Values complete? Check is4c table. + + meminfo + 1Jul EL With better join: 1584 items. + With distinct c.id: 1170. Why 695 in Civi members list? Still many c.id dups + Distinct means the whole row is unique. + With manual c.id de-dup then 700, so I will assume that's same as the Civi list. + 30Jun EL Start to build select from Civi. 1164 rows to handle. 449 if 1/contact.id + Re: Version 1, why cannot use "select into outfile": + INTO OUTFILE '${outFile}' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' + Access error ... + See: + http://community.webfaction.com/questions/7465/export-database-to-csv + Says to use phpMyAdmin export. + Can connect to posdev! + + --'p PHP study +. {} needed around multi-dimension array references in quoted strings. +. Parser does not complain about: if ( foo == "x" ), i.e. s/b $foo. + + --'m MYSQL study + http://ca.php.net/manual/en/book.mysqli.php + http://ca.php.net/manual/en/class.mysqli.php + + mysqli::close realized as [$bool=] $dbConn->close() + mysqli::$connect_errno realized as [$str=] $dbConn->connect_errno() + + new mysqli(x,y,x) returns a connection object, $conn + $q="SELECT ..." + $conn->query("$q") returns a result-set object, $members + $s="INSERT/UPDATE/DELETE/SELECT ..." + $conn->prepare("$s") returns a statement object, $stmt + $members->fetch_row() returns a plain array, $rw + + --'q SQLManager study +Is this, directly from ADODB, available here? What does the include in SQLManager imply? + function ErrorMsg() + { + if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg; + else return ''; + } + --commentz } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +*/ + +//'F --FUNCTIONS { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// Clear the test records from the IS4C tables. +// CardNo or card_no range between 4000 and 6000 +function clearIS4C($low = 417, $high = 1500) { + + global $dbConn2; + global $is4cTables; + + // Argument to where. + $clearWhere = ""; + + foreach ($is4cTables as $table_desc) { + list($db, $table, $cn) = explode("|", $table_desc); + //$clearWhere = "$cn = 4471"; + $clearWhere = "$cn BETWEEN $low AND $high;"; + $query = "DELETE FROM $table WHERE ${clearWhere};"; +//echo "$query\n"; + if ( TRUE && $db == "core_op" ) { + $rslt = $dbConn2->query("$query"); + if ( $dbConn2->errno ) { + return(sprintf("DML failed: %s\n", $dbConn2->error)); + //$dbConn2->close(); + //die("dying ..."); + //exit(); + } + } elseif ( $db == "core_trans" ) { + // Need another connection for this db. + 1; + } else { + // In fact a problem, but not likely. + 1; + } + } + + return("OK"); + +// clearIS4C +} + + +/* v2: Return an array of custdata for the memberId. + Calling script to test for #-of-items in array: 0=none, >=1 if some. + Return error-string if the lookup failed. +*/ +/* v1: Return TRUE if the Civi membership number is known in ISC4C custdata. + Return FALSE if not. + Return error-string if the lookup failed. + Is there something to gain by getting some data, such a number-of persons + from custdata at this point? + Names for household members? +*/ +function searchIS4C($member) { + + global $dbConn2; + + $is4cMembers = array(); + $sel = "SELECT CardNo, personNum, FirstName, LastName FROM custdata where CardNo = ${member};"; + $rslt = $dbConn2->query("$sel"); + if ( $dbConn2->errno ) { + $msg = sprintf("Error: DQL failed: %s\n", $dbConn2->error); + $is4cMembers[] = array($msg); + return($is4cMembers); + } + // What is $rslt if 0 rows? Does it exist? + //$n = 0; + while ( $row = $dbConn2->fetch_row($rslt) ) { + //$n++; + $is4cMembers[] = array($row[CardNo], $row[personNum], $row[FirstName], $row[LastName]); + } + return($is4cMembers); + +// searchIS4C +} + +// #'t +function searchIS4C2($member) { + + global $dbConn2; + + $is4cOp = array(); + $sel = "SELECT c.CardNo as cCard, + i.card_no as iCard, + t.card_no as tCard, + d.card_no as dCard, + r.card_no as rCard + FROM custdata c +LEFT JOIN meminfo i ON c.CardNo = i.card_no +LEFT JOIN memContact t ON c.CardNo = t.card_no +LEFT JOIN memDates d ON c.CardNo = d.card_no +LEFT JOIN memberCards r ON c.CardNo = r.card_no + WHERE c.CardNo = ${member};"; + $rslt = $dbConn2->query("$sel"); + if ( $dbConn2->errno ) { + $msg = sprintf("Error: DQL failed: %s\n", $dbConn2->error); + $is4cOp[] = array($msg); + return($is4cOp); + } + + while ( $row = $dbConn2->fetch_row($rslt) ) { + $is4cOp['custdata'] = "update"; + $is4cOp['meminfo'] = ( $row[iCard] != "" ) ? "update" : "insert"; + $is4cOp['memContact'] = ( $row[tCard] != "" ) ? "update" : "insert"; + $is4cOp['memDates'] = ( $row[dCard] != "" ) ? "update" : "insert"; + $is4cOp['memberCards'] = ( $row[rCard] != "" ) ? "update" : "insert"; + break; + } + + return($is4cOp); + +// searchIS4C2 +} + +// Insert the records for this Individual, Household or Organization. +// Return "OK" if all OK or abort returning message on any error. +function insertToIS4C() { + + global $dbConn2; + + global $insertCustdata; + global $insertMeminfo; + global $insertMemContact; + global $insertMemDates; + global $insertMemberCards; + global $insertStockpurchases; + + global $debug; + +//echo "In insertToIS4C\n"; + + $statements = array($insertMeminfo, + $insertMemContact, + $insertMemDates, + $insertMemberCards); + $statement = ""; + + if ( count($insertCustdata) > 0 ) { + foreach ($insertCustdata as $statement) { + if ( $debug == 1) + echo $statement, "\n"; +//continue; + $rslt = $dbConn2->query("$statement"); + if ( 1 && $dbConn2->errno ) { + return(sprintf("Error: Insert failed: %s\n", $dbConn2->error)); + } + } + } + else { + //echo "No custdata to insert.\n"; + 1; + } + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug == 1) + echo $statement, "\n"; +//continue; + $rslt = $dbConn2->query("$statement"); + if ( 1 && $dbConn2->errno ) { + return(sprintf("Error: Insert failed: %s\n", $dbConn2->error)); + } + } + } + + // stockpurchases is in a different db. + + return("OK"); + +// insertToIS4C +} + +// Update the records for this Individual, Household or Organization. +// Return "OK" if all OK or abort returning message on any error. +function updateIS4C() { + + global $dbConn2; + +//echo "In updateIS4C\n"; + + global $updateCustdata; + global $updateMeminfo; + global $updateMemContact; + global $updateMemDates; + global $updateMemberCards; + global $updateStockpurchases; + + global $debug; + + $statements = array($updateMeminfo, + $updateMemContact, + $updateMemDates, + $updateMemberCards); + $statement = ""; + + if ( count($updateCustdata) > 0 ) { + foreach ($updateCustdata as $statement) { + if ( $debug == 1) + echo $statement, "\n"; +//continue; + $rslt = $dbConn2->query("$statement"); + if ( 1 && $dbConn2->errno ) { + return(sprintf("Error: Update failed: %s\n", $dbConn2->error)); + } + } + } + else { + //echo "No custdata to update.\n"; + 1; + } + + foreach ($statements as $statement) { + if ( $statement != "" ) { + if ( $debug == 1) + echo $statement, "\n"; +//continue; + $rslt = $dbConn2->query("$statement"); + if ( 1 && $dbConn2->errno ) { + return(sprintf("Error: Update failed: %s\n", $dbConn2->error)); + } + } + } + + // stockpurchases is in a different db. + + return("OK"); + +// updateIS4C +} + + +// Each IS4C table is represented by an assoc array. +function clearWorkVars() { + + // in core_op + // Card#, Person#, Name + global $custdata; + // Contact points for Card# + global $meminfo; + // Whether/how to contact. + global $memContact; + // Membership start, i.e. join date + global $memDates; + // Member Card barcode lookup. + global $memberCards; + // in core_trans + global $stockpurchases; + + // in core_op + // Card#, Person#, Name +// $custdata[CardNo] = 0; +// $custdata[personNum] = 0; + $flds = array_keys($custdata); + foreach ($flds as $field) { + $custdata[$field] = ""; + } + + $flds = array_keys($meminfo); + foreach ($flds as $field) { + $meminfo[$field] = ""; + } + + $flds = array_keys($memDates); + foreach ($flds as $field) { + $memDates[$field] = ""; + } + + $flds = array_keys($memContact); + foreach ($flds as $field) { + $memContact[$field] = ""; + } + + $flds = array_keys($memberCards); + foreach ($flds as $field) { + $memberCards[$field] = ""; + } + + $flds = array_keys($stockpurchases); + foreach ($flds as $field) { + $stockpurchases[$field] = ""; + } + + global $insertCustdata; + global $insertMeminfo; + global $insertMemContact; + global $insertMemDates; + global $insertMemberCards; + global $insertStockpurchases; + + global $updateCustdata; + global $updateMeminfo; + global $updateMemContact; + global $updateMemDates; + global $updateMemberCards; + global $updateStockpurchases; + + $insertCustdata = array(); + $insertMeminfo = ""; + $insertMemContact = ""; + $insertMemDates = ""; + $insertMemberCards = ""; + $insertStockpurchases = ""; + + $updateCustdata = array(); + $updateMeminfo = ""; + $updateMemContact = ""; + $updateMemDates = ""; + $updateMemberCards = ""; + $updateStockpurchases = ""; + +// clearWorkVars +} + +// Return province or state name from code format 1=abbreviation or 2=full-name +function getProvince($num = 0, $format = 1) { + + $province = ""; + + if ( $format == 1 ) { + switch ($num) { + case 1108: + $province = "ON"; + break; + default: + $province = "XX"; + break; + } + } + + return($province); + +//getProvince +} + +// o Return in format "A9A 9A9" +function fixPostalCode($str = "") { + $str = strtoupper($str); + // Remove anything but uppercase letters and numbers. + $str = preg_replace("/[^A-Z\d]/", "", $str); + // Format: A9A 9A9 + // Leaves non-postal-code content alone. + $str = preg_replace("/([A-Z]\d[A-Z])(\d[A-Z]\d)/", "$1 $2", $str); + return($str); +//fixPostalCode +} + +/* o Return in format 999-999-9999 + unless the original wasn't even close. +*/ +function fixPhone($str = "") { + $str_orig = $str; + $str = preg_replace("/[^\d]/", "", $str); + $str = preg_replace("/^(\d{3})(\d{3})(\d{4})$/", "$1-$2-$3", $str); + if ( preg_match("/^(\d{3})-(\d{3})-(\d{4})$/", $str) ) { + return($str); + } else { + $str_orig = str_replace("'", "''", $str_orig); + return($str_orig); + } +//fixPhone +} + +/* City: + + tolower if ALL CAPS + + Capitalize first letter of each word + + Double apostrophes +*/ +function fixCity($str = "") { + if ( preg_match("/[A-Z]{3}/", $str) ) { + $str = strtolower($str); + } + $str = ucwords($str); + $str = str_replace("'", "''", $str); + return($str); +//fixCity +} + +/* Name: + + tolower if ALL CAPS + + Capitalize first letter of each word + + Double apostrophes +*/ +function fixName($str = "") { + if ( preg_match("/[A-Z]{3}/", $str) ) { + $str = strtolower($str); + // First letter after hyphen + $str = preg_replace("/(-[A-Z])/", "$1", $str); + if ( "$1" != "" ) { + $upper1 = strtoupper("$1"); + $str = str_replace("$1", "$upper1", $str); + } + //$str = preg_replace("/(-[A-Z])/", strtoupper($1), $str); // T_LNUMBER error + $str = ucwords($str); + } + // Is all-lowercase + hyphen space apostrophe + elseif ( preg_match("/^[- 'a-z]+$/", $str) ) { + // Need exceptions: "di", "de la", ... ? + $str = ucwords($str); + } + // Already mixed-case + else { + 1; + } + $str = str_replace("'", "''", $str); + return($str); +//fixName +} + +/* Address: + + tolower if ALL CAPS + + Capitalize first letter of each word + + Double apostrophes +*/ +function fixAddress($str = "") { + if ( preg_match("/[A-Z]{3}/", $str) ) { + $str = strtolower($str); + } + $str = ucwords($str); + $str = str_replace("'", "''", $str); + return($str); +//fixAddress +} + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +*/ +function dieHere($msg="") { + + global $dbConn; + global $dbConn2; + global $insertCount; + global $updateCount; + global $admins; + + $subject = "PoS: Error: Update IS4C members"; + $message = "$msg"; + //$message = "Added: $insertCount Updated: $updateCount\n"; + $adminString = implode(" ", $admins); + + $lastLine = exec("echo \"$message\" | mail -s \"$subject\" $adminString"); + // echo "Not ready to email: $msg\n"; + // Ordinary success returns nothing, or "". + echo "from mailing: {$lastLine}\n"; + + if ( $dbConn ) { + // Warning: mysqli::close(): Couldn't fetch mysqli in /home/parkdale/is4c/updateMembers.php on line next + @$dbConn->close(); + } else { + //echo "No dbConn to close.\n"; + 1; + } + + if ( $dbConn2 ) { + @$dbConn2->close(); + } else { + //echo "No dbConn2 to close.\n"; + 1; + } + + //echo "End of dieHere\n"; + exit(); + +//dieHere +} + +// Return an array of the name keys: 1, 3, etc. +function getNameKeys($row) { + + $names = array(); + $key = ""; + $n = 0; + foreach (array_keys($row) as $key) { + // Test for odd number. + // http://ca.php.net/manual/en/function.array-filter.php + // Also works: + //if ( ($n % 2) != 0 ) {} + if ($n & 1) { + $names[] = $key; + //echo "$n odd: $key\n"; + } else { + 1; + //echo "$n not-odd: $key\n"; + } + $n++; + } + + return($names); + +//getNameKeys +} + +// Return an array of the values from the odd-numbered elements i.e. hash-name keys: 1, 3, etc. +// I.e. reduce the duplication of a BOTH array. +// Getting the evens would have the same result. +function getNameValues($row) { + + $values = array(); + $val = ""; + $n = 0; + foreach ($row as $val) { + // Test for odd number. + // http://ca.php.net/manual/en/function.array-filter.php + // Also works: + //if ( ($n % 2) != 0 ) {} + if ($n & 1) { + $values[] = $val; + //echo "$n odd: $key\n"; + } else { + 1; + //echo "$n not-odd: $key\n"; + } + $n++; + } + + return($values); + +//getNameValues +} + +// --functions } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// --PREP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/* Turn off all error reporting + Re error suppression with @: + http://ca.php.net/manual/en/language.operators.errorcontrol.php + See that re: set_error_handler() and error_reporting() +*/ +//error_reporting(0); + +/* Report simple running errors + These kind of errors go to STDOUT or STDERR before they are tested for or trapped. + But see note about suppression with @, above. +*/ +error_reporting(E_ERROR | E_WARNING); +//error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); + +//'C --CONSTANTS { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +include('../config.php'); +// Connection id's, etc. +include('../config_wefc.php'); +include('../src/SQLManager.php'); +include($FANNIE_ROOT.'src/cron_msg.php'); + +// What does this do? +set_time_limit(0); + +// Tab-delimited. +$outFile = "../logs/members_up.tab"; + +// Log. Cumulative. Still a bit vague on what s/b written here. +$logFile = "../logs/updateMembers.log"; + +// version of this program +// 1 = write to file +// 2 = direct to posdev +// -> This isn't being observed. +$version = 1; + +// test: 4000 production: 0 +$memberIdOffset = 0; + +// Whether to clear or write anything to IS4C +$writeIS4C = 1; + +// Controls some monitoring and info. +$debug = 0; + +// People to whom news is mailed. +$admins = array("el66gr@gmail.com"); + +$is4cTableNames = array('custdata', 'meminfo', 'memContact', 'memDates', 'memberCards', 'stockpurchases'); + +// --constants } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +//'V --VARIABLES { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// Counter of tab-delim lines. +$outCount = 0; +// Counter of rows from raw select. +$inCount = 0; + +$lastCid = ""; +$dupCid = 0; +$uniqueCid = 0; +$isDupCid = 0; +$insertCount = 0; +$updateCount = 0; + +/* Arrays for IS4C tables + Initialized by clearWorkVars() +*/ +// in core_op +// Card#, Person#, Name +$custdata = array( + "CardNo" => "", + "personNum" => "", + "LastName" => "", + "FirstName" => "", + "Type" => "", + "memType" => "", + "blueLine" => "", + "id" => "" +); +// Contact points for Card# +$meminfo = array( + "card_no" => "", + "last_name" => "", + "first_name" => "", + "street" => "", + "city" => "", + "state" => "", + "zip" => "", + "phone" => "", + "email_1" => "", + "email_2" => "", + "ads_OK" => "" +); +// Whether/how to contact. +$memContact = array( + "card_no" => "", + "x" => "" +); +// Membership start, i.e. join date +$memDates = array( + "card_no" => "", + "x" => "" +); +// Member Card barcode lookup. +$memberCards = array( + "card_no" => "", + "upc" => "" + ); +// in core_trans +$stockpurchases = array( + "card_no" => "", + "x" => "" +); + +$is4cTables = array("core_op|custdata|CardNo", + "core_op|meminfo|card_no", + "core_op|memContact|card_no", + "core_op|memDates|card_no", + "core_op|memberCards|card_no", + "core_trans|stockpurchases|card_no"); + +$insertCustdata = array(); +$insertMeminfo = ""; +$insertMemContact = ""; +$insertMemDates = ""; +$insertMemberCards = ""; +$insertStockpurchases = ""; + +$updateCustdata = array(); +$updateMeminfo = ""; +$updateMemContact = ""; +$updateMemDates = ""; +$updateMemberCards = ""; +$updateStockpurchases = ""; + +// insert or update +$is4cOp = array(); +//$is4cOp = ""; + +// --variables } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +//'M --MAIN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +clearWorkVars(); +/* +echo "CardNo:", $custdata[CardNo], "\n"; +exit(); +*/ + +// The "@" prevents the error from being reported immediately, +// but the test further on will still see it. +//$dbConn = @new mysqli("$CIVICRM_SERVER", "$CIVICRM_SERVER_USER", "$CIVICRM_SERVER_PW", "$CIVICRM_DB"); +$dbConn = new SQLManager($CIVICRM_SERVER,$CIVICRM_SERVER_DBMS,$CIVICRM_DB, + $CIVICRM_SERVER_USER,$CIVICRM_SERVER_PW); +// $CIVICRM_SERVER_USER,"xx"); +//Orig: +//$dbConn = @new mysqli("$CIVI_IP", "$CIVI_USER", "$CIVI_PASSWORD", "$CIVI_DB"); +// Cannot do this - func doesn't exist, or object doesn't. +//$conn->SetFetchMode(ADODB_FETCH_ASSOC); +//$dbConn->SetFetchMode(ADODB_FETCH_ASSOC); + +/* mysqli How to trap errors? + * The die trap does not work. + * $dbConn = new mysqli("$CIVI_IP", "$CIVI_USER", "$CIVI_PASSWORD", "$CIVI_DB") + or die($dbConn->connect_error); + * This works: + * $dbConn exists even if the connection failed. + * connect_errno returns 0 if no error. +*/ +/* SQLManager - this doesn't trap a real error + If there is a forced error there is a Fatal further down at a place that doesn't make sense. +*/ +$message = $dbConn->error(); +if ( $message != "" ) { + dieHere("$message"); +} +else { + $message = "1CiviCRM connection did not fail"; + if ( $debug == 1) + echo "$message\n"; +} +if ( FALSE && $dbConn->error() ) { + $message = sprintf("Connect1 failed: %s\n", $dbConn->error()); + dieHere("$message"); + //die("dying ..."); + //exit(); +} +//echo "Hello?\n"; +$message = "2CiviCRM connection did not fail"; +//dieHere("$message"); +if ( $debug == 1) + echo "$message\n"; + +/* Assignment doesn't fail. + But it doesn't affect the behaviour of fetch_array + If not assigned, is DEFAULT +//$dbConn->fetchMode = ADODB_FETCH_NUM; +$fm = $dbConn->fetchMode; +// If no assignment this shows "" but matches FETCH_DEFAULT. +echo "fm: >{$fm}<\n"; +switch ($fm) { + // 3 + case ADODB_FETCH_BOTH: + echo "Is both\n"; + break; + // 2 + case ADODB_FETCH_ASSOC: + echo "Is assoc\n"; + break; + // 1 + case ADODB_FETCH_NUM: + echo "Is num\n"; + break; + // 0 + case ADODB_FETCH_DEFAULT: + echo "Is default\n"; + break; + case "": + echo "Is ''\n"; + break; + case FALSE: + echo "Is FALSE\n"; + break; + default: + echo "Ain't nothin\n"; +} +dieHere("After fm"); +*/ + +// Little tests of civicrm connection. +if (0) { + + $selectCivi = "SELECT id, contact_id from civicrm_membership LIMIT 5;"; + $civim = $dbConn->query("$selectCivi"); + // Does not complain about error in MySQL statement. + // See $LOGS/queries.log for them. + if ( $dbConn->errno ) { + $message = printf("Select failed: %s\n", $dbConn->error); + dieHere("$message"); + } + + // Quick test. + echo "Civi Members Numbered\n"; + // PHP Fatal error: Call to undefined method ADORecordSet_mysql::fetch_row() in /var/www/IS4C/fannie/cron/nightly.update.members.php on line 694 + // PHP Fatal error: Call to undefined method ADORecordSet_mysql::fetch_array() in /var/www/IS4C/fannie/cron/nightly.update.members.php on line 694 +//$res = $sql->query("SELECT month(datetime),year(datetime) FROM dtransactions"); +//$row = $sql->fetch_row($res); + //mysqli: while ( $row = $civim->fetch_row() ) {} + while ( $row = $dbConn->fetch_array($civim) ) { + // The numeric keys come first. 0,2,4. Name keys 1, 3, 5. + $flds = getNameKeys($row); + //$flds = array_keys($row); + $lineOut = implode("\t", $flds) . "\n"; + echo $lineOut; + $lineOut = implode("\t", array($row[id], $row[contact_id])) . "\n"; + echo $lineOut; + // This gives duplicate values, for each of: first number, then name reference. + //$lineOut = implode("\t", $row) . "\n"; + // Reduce to one set. + /* + $vals = getNameValues($row); + $lineOut = implode("\t", $vals) . "\n"; + echo $lineOut; + */ + } + + dieHere("Little test c OK, bailing ..."); + +// Enable/defeat little tests of civicrm connection +} + +// Enable/defeat is4c connection +if ( 1 ) { + +//echo "Start connection to is4c.\n"; +//$dbConn2 = @new mysqli("$IS4C_IP", "$IS4C_USER", "$IS4C_PASSWORD", "$IS4C_DB"); + +$dbConn2 = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); +if ( $dbConn2->connect_errno ) { + $message = sprintf("Connect2 failed: %s\n", $dbConn2->connect_error); + dieHere("$message"); + // if ( $dbConn ) { + // $dbConn->close(); + // } + // die("dying ..."); + //exit(); +} + + + /** +Can we use this? No +$dbConn2->SetFetchMode(ADODB_FETCH_ASSOC); + * PEAR DB Compat - do not use internally. + * + * The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical + * for easy porting :-) + * + * @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM + * @returns The previous fetch mode + function SetFetchMode($mode) + { + $old = $this->fetchMode; + $this->fetchMode = $mode; + + if ($old === false) { + global $ADODB_FETCH_MODE; + return $ADODB_FETCH_MODE; + } + return $old; + } + */ + /** + Get a column name by index + @param $result_object A result set + @param $index Integer index + @param $which_connection see method close() + @return The column name + function fetch_field($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $result_object->FetchField($index); + } + */ + + + +// Little tests of is4c connection. +if (0) { + + $selectIs4c = "SELECT CardNo, LastName from custdata LIMIT 5;"; + $customers = $dbConn2->query("$selectIs4c"); + // ->errno probably doesn't exist in SQLManager + if ( $dbConn2->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere($message); + } + + // Quick test. + echo "IS4C Numbered\n"; + while ( $row = $dbConn2->fetch_row($customers) ) { + // Why does $row contain each field twice? + // Because $row is a BOTH list and hash; use hash syntax. + // array_keys gets both names and numbers. + //$flds = array_keys($row); + $flds = getNameKeys($row); + $lineOut = implode("\t", $flds) . "\n"; + echo $lineOut; +// echo "count:", count($row), "\n"; + $vals = getNameValues($row); + $lineOut = implode("\t", $vals) . "\n"; + echo $lineOut; + $lineOut = implode("\t", array($row[CardNo], $row[LastName])) . "\n"; + echo $lineOut; + } + die("IS4C OK, bailing ..."); + +// Enable/defeat little tests of is4c connection +} + +// Enable/defeat clearing testrecords +// For update generally don't want to do this. +if (FALSE) { + $resultString = clearIS4C(); + if ( $resultString != "OK" ) { + dieHere("$resultString"); + } + //dieHere("Done clearing"); +// Enable/defeat clearing testrecords +} + +// Enable/defeat is4c connection +} + +//$selWhere = "r.contribution_type_id is not null"; +//$selWhere = "m.id is not null"; +//$selWhere = "r.total_amount is null or r.total_amount = 0.00"; +//$selWhere = "m.id = 901"; +//$selWhere = "c.id = 1840"; +$selWhere = "1"; + +// Syntax: "LIMIT 10" +$selLimit = ""; +//$selLimit = "LIMIT 10"; + +/* Re the big select: + Try using DISTINCT c.id or DISTINCT m.id. No, that only filters whole identical rows. + Re the join: + There must be: _membership, _contact + There will always be: _email + There might be one or more: _address and/or _phone and/or _contribution + The field sequence is similar to the Civi export. + +There seem to be two or more records for almost all people. +Happens if there are two+ phones or emails. +But why are there two of. What is the difference: +61 Individual 0 Bina Mittal 288 Indian Road Toronto 1108 1039 416 766 7800 bina.mittal@mitcer.com 0 0 478 4 0 2010-08-11 2010-08-11 5.00 2 1 2010-04-17 00:00:00 3 0 +61 Individual 0 Bina Mittal 288 Indian Road Toronto 1108 1039 416 766 7800 bina.mittal@mitcer.com 0 0 478 4 0 2010-08-11 2010-08-11 5.00 2 1 2010-04-17 00:00:00 3 0 +There is only one: +42 Individual 0 Graeme Hussey graemehussey@yahoo.com 0 0 850 4 0 2009-11-02 2009-11-02 1200.00 7 1 2009-11-02 14:04:00 0 +*/ +// 'S +$selectMembers = "SELECT DISTINCT +c.id as contact_id + ,c.contact_type, c.is_opt_out, c.nick_name + , c.first_name, c.middle_name, c.last_name + , c.household_name, c.primary_contact_id, c.organization_name ,c.employer_id +,a.street_address ,a.supplemental_address_1 as address1, a.supplemental_address_2 as address2 + ,a.city ,a.postal_code , a.state_province_id, a.country_id +,p.phone +,e.email ,e.on_hold, e.is_bulkmail +,m.id as member_id, m.membership_type_id as mti, m.is_pay_later as mipl + ,m.join_date, m.start_date, m.end_date +,r.total_amount +,r.contribution_type_id as cti +,r.contribution_status_id as csi +,r.receive_date +,r.payment_instrument_id as cpi +,r.is_pay_later as cipl +,v.member_card_number2_21 as mcard +FROM +civicrm_membership m INNER JOIN civicrm_contact c ON c.id = m.contact_id +LEFT JOIN civicrm_email e ON m.contact_id = e.contact_id +LEFT JOIN civicrm_address a ON m.contact_id = a.contact_id +LEFT JOIN civicrm_phone p ON m.contact_id = p.contact_id +LEFT JOIN civicrm_contribution r ON m.contact_id = r.contact_id +LEFT JOIN civicrm_value_identification_and_cred_5 v ON m.contact_id = v.entity_id +WHERE $selWhere +ORDER BY c.id, r.contribution_type_id +$selLimit;"; + +$members = $dbConn->query("$selectMembers"); +//$members = $dbConn->query("$selectMembers", MYSQLI_STORE_RESULT); +// How to trap error? +if ( $dbConn->errno ) { + $message = sprintf("Select failed: %s\n", $dbConn->error); + dieHere("$message"); + //$dbConn->close(); + //die("dying ..."); + //exit(); +} + +if ( $version = 1 ) { + $outer = fopen("$outFile", "w"); + if ( ! $outer ) { + //$dbConn->close(); + dieHere("Could not open $outFile\n"); + } +} + +$logger = fopen("$logFile", "a"); +if ( ! $logger ) { + dieHere("Could not open $logFile\n"); +} + +//echo "After ->query \n"; +// Would it help to have both name and number keys? Don't think so. +// was fetch_assoc +while ( $row = $dbConn->fetch_row($members) ) { + + $inCount++; + if ( $inCount == 1 ) { + // Write the names of the fields as column heads to the export file. + //$flds = array_keys($row); + $flds = getNameKeys($row); + //echo "Fields: ", implode(" ", $flds), "\n"; + $lineOut = implode("\t", $flds) . "\n"; + $writeOK = fwrite($outer, $lineOut); + //if ( $inCount > 0 ) { break; } + } + + if ( TRUE && $row['contact_id'] == $lastCid ) { + $dupCid++; + $isDupCid = 1; + // continue; + } else { + $uniqueCid++; + $isDupCid = 0; + $lastCid = "$row[contact_id]"; + } + + /* For the first record for each member (same contact_id): + o If there is data for the previous member, update or insert it and clear the working vars. + Assume that the name and contact-point data is equally good in all rows. + + Compose the member-number for custdata.CardNo from m.id = member_id + memberIdOffset + + For Household or if first_name contains " and " + o Try to parse/compose separate first and last names + */ + if ( $isDupCid == 0 ) { + // If this isn't the first pass. + if ( $writeIS4C && $custdata[CardNo] != "" ) { + +//echo "To DML is4cOp >${is4cOp}< CardNo >$custdata[CardNo]<\n"; + // Is the op for the just-finished member to be insert or update? + if ( True || $is4cOp1 == "insert" ) { + // Insert the records for this Individual, Household or Organization. + $resultString = insertToIS4C(); + if ( $resultString != "OK" ) { + //$dbConn->close(); + //$dbConn2->close(); + dieHere("$resultString"); + } + //$insertCount++; + } + // update existing members. + if ( True || $is4cOp1 == "update" ) { + $resultString = updateIS4C(); + if ( $resultString != "OK" ) { + //$dbConn->close(); + //$dbConn2->close(); + dieHere("$resultString"); + } + //$updateCount++; + } + /* + else { + //$dbConn->close(); + //$dbConn2->close(); + dieHere("Unknown is4cOp >${is4cOp}< CardNo >$custdata[CardNo]<\n"); + } + */ + + // Each IS4C table is represented by an assoc array. + clearWorkVars(); + $is4cOp = array(); + $is4cOp1 = ""; + $customers = array(); + + } + + /* Populate the IS4C-data arrays. + $row element names do not include the table prefix "c." etc. + */ + /* custdata + */ + $custdata[CardNo] = $row[member_id] + $memberIdOffset; + + // #'sIs this member already in IS4C? + $customers = searchIS4C($custdata[CardNo]); + // Error is in [0][0] + // Is waiting to process the error here worth it? + if ( preg_match("/^Error/", $customers[0][0]) ) { + //$dbConn->close(); + //$dbConn2->close(); + // Q: Why do these print "Array[0]"? The test of $customers[0][0] works. + // A: braces are needed. + dieHere("{$customers[0][0]}"); + } + // Decide where the operation to each IS4C table will be update or insert. + // There is another test of whether there is anything to add/change. + $is4cOp = array(); + if ( count($customers) == 0 ) { + $is4cOp1 = "insert"; + foreach ($is4cTableNames as $table) { + $is4cOp["$table"] = "insert"; + } + $insertCount++; + } else { + $is4cOp1 = "update"; + // Find out wether the operation to each table will be insert or update. + $is4cOp = searchIS4C2($custdata[CardNo]); + if ( preg_match("/^Error/", $is4cOp[0][0]) ) { + dieHere("{$is4cOp[0][0]}"); + } + $updateCount++; + } + + // This lets autoincrement do its thing. + $custdata[id] = ""; + // Fields that are the same for all. + $custdata[CashBack] = 999.99; // double + $custdata[Type] = "PC"; + $custdata[memType] = $row[mti]; // int + + // See if the record is for more than one person. + $isMultiple = 0; $isMultipleFirst = 0; $isMultipleLast = 0; + $firstNames = array(); + $lastNames = array(); + $insertCustdata = array(); + // If so, flag and prepare the first person data. + // Organization + if ( $row[household_name] != "" ) { + // E.g. "Inge and John Crowther", "Klucha / Northrup", "Annandale/Stevenson" + // The "Crowther" example probably shouldn't be done that way. They are also Org, Clover Roads. + $lastNames = preg_split("/ ?\/ ?/", $row[household_name]); + if ( count($lastNames) > 1 ) { + $isMultipleLast = 1; + } + $i = -1; + foreach ($lastNames as $lastName) { + $i++; + // Why does assignment to fN[] not work here? I think it does. Some other problem. + $firstNames[$i] = $row[$first_name]; + //echo "lastNames $i >",$lastNames[$i],"< $row[last_name]\n"; + //echo "Names $i >",$lastNames[$i],"< >$row[first_name]<\n"; + } + } + // Organization + elseif ( $row[organization_name] != "" ) { + $lastNames[] = $row[organization_name]; + $firstNames[] = $row[first_name]; + //echo "Names 0 >",$lastNames[0],"< >$row[first_name]<\n"; + } + // Individual coded for multiple + elseif ( preg_match("/ and /", $row[first_name]) ) { + // E.g. Irina and Ionel + $firstNames = explode(" and ", $row[first_name]); + // $isMultipleFirst = 1; // not used + foreach ($firstNames as $firstName) { + $lastNames[] = $row[last_name]; + } + } + // Regular, i.e. single-name, Individual + else { + $firstNames[] = $row[first_name]; + $lastNames[] = $row[last_name]; + 1; + } + + // Make a custdata record for each person. + for ($personNum = 1 ; $personNum <= count($firstNames); $personNum++ ) { + $custdata[personNum] = $personNum; + // Index to names arrays. + $i = $personNum - 1; + $custdata[FirstName] = fixName($firstNames[$i]); + $custdata[LastName] = fixName($lastNames[$i]); + // blueLine should start with a '"', but in case of quoting chaos, + // wait until otherwise working. + $custdata[blueLine] = "\"$custdata[CardNo] $custdata[LastName]"; + + // Is this premature? Contribution recordds not examined. + if ( $is4cOp[custdata] == "insert" ) { + // $insertCustdata is an array of statements to execute later. + $insertCustdata[$i] = "INSERT INTO custdata ( +CardNo, +personNum, +LastName, +FirstName, +CashBack, +Type, +memType, +blueLine, +id) +VALUES ( +$custdata[CardNo], +$custdata[personNum], +'$custdata[LastName]', +'$custdata[FirstName]', +$custdata[CashBack], +'$custdata[Type]', +$custdata[memType], +'$custdata[blueLine]', +'$custdata[id]' +);"; + } + elseif ( $is4cOp[custdata] == "update" ) { + // $updateCustdata is an array of statements to execute later. + $updateCustdata[$i] = "UPDATE custdata SET +LastName = '$custdata[LastName]' +, FirstName = '$custdata[FirstName]' +, blueLine = '$custdata[blueLine]' +WHERE CardNo = $custdata[CardNo] +AND +personNum = $custdata[personNum] +;"; + } + else { + echo "Bad is4cOp >{$is4cOp[custdata]}<\n"; + 1; + } + + // each person on the card + } + + /* meminfo + */ + $meminfo[card_no] = $custdata[CardNo]; + // Need fixAddress to capitalize first letter of each word. + $meminfo[street] = fixAddress($row[street_address]); + if ( $row[supplemental_address_1] != "" ) { + $meminfo[street] .= ", $row[supplemental_address_1]"; + } + if ( $row[supplemental_address_2] != "" ) { + $meminfo[street] .= ", $row[supplemental_address_2]"; + } + // Need fixCity to capitalize first letter. + $meminfo[city] = fixCity($row[city]); + $meminfo[state] = getProvince($row[state_province_id], 1); + $meminfo[zip] = fixPostalCode($row[postal_code]); + $meminfo[phone] = fixPhone($row[phone]); + $meminfo[email_1] = $row[email]; + // Use for 2nd phone is there is one. None I know of. + $meminfo[email_2] = ""; + // What should the source for this be? + $meminfo[ads_OK] = "1"; + + if ( $is4cOp[meminfo] == "insert" ) { + // Compose the insert statement. + $insertMeminfo = "INSERT INTO meminfo ( +card_no +,street +,city +,state +,zip +,phone +,email_1 +,email_2 +,ads_OK +) +VALUES ( +$meminfo[card_no] +, '$meminfo[street]' +, '$meminfo[city]' +, '$meminfo[state]' +, '$meminfo[zip]' +, '$meminfo[phone]' +, '$meminfo[email_1]' +, '$meminfo[email_2]' +, $meminfo[ads_OK] +);"; + + // update + } else { + $updateMeminfo = "UPDATE meminfo SET +street = '$meminfo[street]' +,city = '$meminfo[city]' +,state = '$meminfo[state]' +,zip = '$meminfo[zip]' +,phone = '$meminfo[phone]' +,email_1 = '$meminfo[email_1]' +,email_2 = '$meminfo[email_2]' +,ads_OK = $meminfo[ads_OK] +WHERE card_no = $meminfo[card_no] +;"; + } + + /* memDates + Date the person became a member. + May change if expiry implemented, so code. + */ + if ( $row[start_date] != "" ) { + + $memDates[card_no] = $custdata[CardNo]; + // Civi is date, IS4C is datetime + // The time part is set to 00:00:00 + // Is conversion needed? Seems OK without. + $memDates[start_date] = $row[start_date]; + if ( $row[end_date] != "" ) { + $memDates[end_date] = $row[end_date]; + } + + if ( $is4cOp[memDates] == "insert" ) { + // Compose the insert statement. + $insertMemDates = "INSERT INTO memDates ( +card_no +,start_date +,end_date +) +VALUES ( +$memDates[card_no] +, '$memDates[start_date]' +, '$memDates[end_date]' +);"; + } else { + // Compose the update statement. + $updateMemDates = "UPDATE memDates SET +start_date = '$memDates[start_date]' +, end_date = '$memDates[end_date]' +WHERE card_no = $memDates[card_no] +;"; + } + + // memDates, if anything to record. + } + + /* memContact + Preference about being contacted. + 0 => no contact + 1 => snail mail # WEFC doesn't do, so not used. + 2 => email # Default. + 3 => both # Not used. + May want to do only if "no". + */ + // Assign, regardless of value. + if ( TRUE || $row[is_opt_out] = 1 ) { + $memContact[card_no] = $custdata[CardNo]; + // Civi is date, IS4C is datetime + if ( $row[is_opt_out] == 1 ) { + // no contact + $memContact[pref] = 0; + } else { + // email + $memContact[pref] = 2; + } + + if ( $is4cOp[memContact] == "insert" ) { + // Compose the insert statement. + $insertMemContact = "INSERT INTO memContact ( +card_no +,pref +) +VALUES ( +$memContact[card_no] +, '$memContact[pref]' +);"; + + } else { + // Compose the update statement. + $updateMemContact = "UPDATE memContact SET +pref = '$memContact[pref]' +WHERE card_no = $memContact[card_no] +;"; + } + + // memContact, do or not. + } + + /* #'m memberCards + */ + if ( $row[mcard] != "" && $row[mcard] != "0" ) { + + $memberCards[card_no] = $custdata[CardNo]; + $memberCards[upc] = sprintf("00401229%05d", $row[mcard]); + + if ( $is4cOp[memberCards] == "insert" ) { + // Compose the insert statement. + $insertMemberCards = "INSERT INTO memberCards ( +card_no +,upc +) +VALUES ( +$memberCards[card_no] +, '$memberCards[upc]' +);"; + } else { + // Compose the update statement. + $updateMemberCards = "UPDATE memberCards SET +upc = '$memberCards[upc]' +WHERE card_no = $memberCards[card_no] +;"; + } + + // memberCards, if anything to record. + } + + /* stockpurchases + */ + + // Local monitor + if ( ($uniqueCid % 10) == 0 ) { + //echo "Done: $uniqueCid members.\n"; + 1; + } + + // Each unique Cid (member) + } + + $vals = getNameValues($row); + $lineOut = implode("\t", $vals) . "\n"; + $writeOK = fwrite($outer, $lineOut); + if ( ! $writeOK ) { + //$dbConn->close(); + dieHere("Could not write to $outFile\n"); + } + $outCount++; + +// each Civi $row +} + +// Do the last Civi row. +if ( $writeIS4C ) { + +//echo "To DML is4cOp >${is4cOp}< CardNo >$custdata[CardNo]<\n"; + // Is the op for the just-finished member to be insert or update? + if ( True || $is4cOp1 == "insert" ) { + // Insert the records for this Individual, Household or Organization. + $resultString = insertToIS4C(); + if ( $resultString != "OK" ) { + //$dbConn->close(); + //$dbConn2->close(); + dieHere("$resultString"); + } + //$insertCount++; + } + // update existing members. + if ( True || $is4cOp1 == "update" ) { + $resultString = updateIS4C(); + if ( $resultString != "OK" ) { + //$dbConn->close(); + //$dbConn2->close(); + dieHere("$resultString"); + } + //$updateCount++; + } + + /* + else { + //$dbConn->close(); + //$dbConn2->close(); + dieHere("Unknown is4cOp1 >${is4cOp1}< CardNo >$custdata[CardNo]<\n"); + } + */ + +// The last Civi row. +} + +if ( $debug == 1) + echo "Reported on $inCount rows.\n"; + +if ( $debug == 1) + echo "Bye.\n"; + +/* Logging and reporting +*/ +if ( $version = 1 ) { + if ( $debug == 1) + echo "Wrote $outCount lines to ${outFile} dupCid: $dupCid\n"; + 1; +} + +$subject = "PoS: Update IS4C members: added $insertCount"; +$message = "Added: $insertCount Updated: $updateCount\n"; +$adminString = implode(" ", $admins); + +if ( $debug == 1) { + echo "Not ready to email. subject: $subject message: $message\n"; +} else { + $lastLine = exec("echo \"$message\" | mail -s \"$subject\" $adminString"); + // Ordinary success returns nothing, or "". + echo "from mailing: {$lastLine}\n"; +} + +$now = date("Ymd_M H:i:s e"); +$writeOK = fwrite($logger, "$now $message"); + +//echo cron_msg("Error reloading dlog_15"); +echo cron_msg("Success updating members from CiviCRM: $message"); + +/* Tie up and shut down. +*/ + +// Close the result set. +// May not be able to do something else on the connection until this is done. +$members->close(); +// If MYSQL_USE_RESULT mode is used, the you must: +//$members->mysqli_free_result(); +// But maybe $members->close() does the same thing. + +if ( $dbConn ) { + $dbConn->close(); +} else { + //echo "No dbConn to close.\n"; + 1; +} +//echo "After ->close \n"; +if ( $dbConn2 ) { + $dbConn2->close(); +} else { + //echo "No dbConn2 to close.\n"; + 1; +} + +if ( $version = 1 ) { + fclose($outer); +} + +// Close logfile +fclose($logger); + +exit(); + +/*'W --WOODSHED { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + //$a = count($row); echo "row has $a elements.\n"; + //echo implode("\t", $row), "\n"; + +FROM civicrm_contact c +INNER JOIN civicrm_membership m ON c.id = m.contact_id +INNER JOIN civicrm_address a on c.id = a.contact_id +INNER JOIN civicrm_phone p on c.id = p.contact_id +INNER JOIN civicrm_email e on c.id = e.contact_id +INNER JOIN civicrm_contribution r on c.id = r.contact_id + +//printf ("%s %s %s\n", $row['id'], $row['name'], $row['label']); + +// Little tests of posdev connection. +if (0) { + + $selectIs4c = "SELECT CardNo, LastName from custdata;"; + $customers = $dbConn2->query("$selectIs4c"); + if ( $dbConn2->errno ) { + printf("Select failed: %s\n", $dbConn->error); + $dbConn2->close(); + $dbConn->close(); + die("dying ..."); + //exit(); + } + + // Quick test. + echo "IS4C Numbered\n"; + while ( $row = $customers->fetch_row() ) { + $lineOut = implode("\t", $row) . "\n"; + echo $lineOut; + } + $dbConn2->close(); + $dbConn->close(); + die("bailing ..."); + +// Enable/defeat little tests of posdev connection +} + + --woodshed } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +*/ +//for "c +/* +*/ + + +?> diff --git a/fannie/cron/memdates.fix.php b/fannie/cron/memdates.fix.php new file mode 100644 index 000000000..95878d927 --- /dev/null +++ b/fannie/cron/memdates.fix.php @@ -0,0 +1,137 @@ +table_exists('mbrmaster')){ + $mmQ = "update mbrmastr set mailflag=1, + startdate = + right('00'+convert(varchar,datepart(mm,s.startdate)),2) + +'/'+ + right('00'+convert(varchar,datepart(dd,s.startdate)),2) + +'/'+ + convert(varchar,datepart(yy,s.startdate)), + enddate = + case when s.payments >= 100 then '' else + right('00'+convert(varchar,datepart(mm,s.startdate)),2) + +'/'+ + right('00'+convert(varchar,datepart(dd,s.startdate)),2) + +'/'+ + convert(varchar,datepart(yy,s.startdate)+2) end + from newbalancestocktoday_test s + left join mbrmastr as m on m.memnum=s.memnum + left join custdata as c on c.cardno=s.memnum + and c.personnum=1 + where m.startdate='' and s.payments > 0 + and c.type='PC'"; + $sql->query($mmQ); +} + +$miQ = "UPDATE meminfo AS m + INNER JOIN {$TRANS}newBalanceStockToday_test s + ON m.card_no=s.memnum + INNER JOIN custdata AS c ON c.CardNo=s.memnum + LEFT JOIN memDates AS d ON d.card_no=s.memnum + SET m.ads_OK=1 + WHERE (d.start_date IS null OR d.start_date = '0000-00-00 00:00:00') + AND s.payments > 0 + AND c.Type='PC'"; +if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $miQ = "UPDATE meminfo SET ads_OK=1 + FROM {$TRANS}newbalancestocktoday_test s + left join meminfo m ON m.card_no=s.memnum + left join custdata as c on c.cardno=s.memnum + left join memDates as d on d.card_no=s.memnum + where d.start_date is null and s.payments > 0 + and c.type='PC'"; +} +$sql->query($miQ); + +$mdQ = "UPDATE memDates AS d + INNER JOIN {$TRANS}newBalanceStockToday_test AS s + ON d.card_no=s.memnum + INNER JOIN custdata AS c ON c.CardNo=s.memnum + SET d.start_date=s.startdate, + d.end_date=CASE WHEN s.payments >= 100 + THEN '0000-00-00 00:00:00' + ELSE + CASE WHEN s.startdate < '2012-12-31 23:59:59' + THEN DATE_ADD(s.startdate,INTERVAL 2 YEAR) + ELSE DATE_ADD(s.startdate,INTERVAL 1 YEAR) END + END + WHERE (d.start_date IS null OR d.start_date = '0000-00-00 00:00:00' + OR d.end_date > '1900-01-01 00:00:00') + AND s.payments > 0 + AND c.Type='PC'"; +if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $mdQ = "UPDATE memDates SET start_date=s.startdate, + end_date=CASE WHEN s.payments >=100 + THEN '1900-01-01 00:00:00' + ELSE dateadd(yy,1,s.startdate) END + FROM {$TRANS}newbalancestocktoday_test s + left join custdata as c on c.cardno=s.memnum + left join memDates as d on d.card_no=s.memnum + where d.start_date is null and s.payments > 0 + and c.type='PC'"; +} +$sql->query($mdQ); + +$sql->query("DELETE FROM custReceiptMessage WHERE msg_text LIKE 'EQUITY OWED% == %'"); + +$msgQ = "INSERT custReceiptMessage + SELECT s.memnum,CONCAT('EQUITY OWED \$',100-s.payments,' == ' + ,'DUE DATE ',MONTH(d.end_date),'/',DAY(d.end_date),'/',YEAR(d.end_date)), + 'WfcEquityMessage' + FROM {$TRANS}newBalanceStockToday_test AS s + INNER JOIN memDates as d ON s.memnum=d.card_no + WHERE s.payments < 100 + AND d.end_date >= CURDATE()"; +$msgR = $sql->query($msgQ); + diff --git a/fannie/cron/monthly.inventory.php b/fannie/cron/monthly.inventory.php new file mode 100644 index 000000000..474e8cace --- /dev/null +++ b/fannie/cron/monthly.inventory.php @@ -0,0 +1,95 @@ +query($deliveryQ); +if ($chk === false) + echo cron_msg("Error archiving last month's inventory data"); + +$chk1 = $sql->query("TRUNCATE TABLE InvDeliveryLM"); +$lmQ = "INSERT INTO InvDeliveryLM SELECT * FROM InvDelivery WHERE " + .$sql->monthdiff($sql->now(),'inv_date')." = 1"; +$chk2 = $sql->query($lmQ); +if ($chk1 === false || $chk2 === false) + echo cron_msg("Error setting up last month's inventory data"); + +$clearQ = "DELETE FROM InvDelivery WHERE ".$sql->monthdiff($sql->now(),'inv_date')." = 1"; +$chk = $sql->query($clearQ); +if ($chk === false) + echo cron_msg("Error clearing inventory data"); + +$salesQ = "INSERT INTO InvSalesArchive + select max(datetime),upc,sum(quantity),sum(total) + FROM transarchive WHERE ".$sql->monthdiff($sql->now(),'datetime')." = 1 + AND scale=0 AND trans_status NOT IN ('X','R') + AND trans_type = 'I' AND trans_subtype <> '0' + AND register_no <> 99 AND emp_no <> 9999 + GROUP BY upc"; +$chk = $sql->query($salesQ); +if ($chk === false) + echo cron_msg("Error archiving sales data for inventory"); + +?> diff --git a/fannie/cron/monthly.nabs.php b/fannie/cron/monthly.nabs.php new file mode 100644 index 000000000..b24e3f797 --- /dev/null +++ b/fannie/cron/monthly.nabs.php @@ -0,0 +1,59 @@ +query($insQ); + +// fix trans_no values +$tn = 1; +$fixQ = "SELECT card_no FROM dtransactions WHERE register_no=20 + AND emp_no=1001"; +$fixR = $sql->query($fixQ); +while($fixW = $sql->fetch_row($fixR)){ + $transQ = "UPDATE dtransactions SET trans_no=$tn + WHERE register_no=20 and emp_no=1001 + AND card_no=".$fixW['card_no']; + $transR = $sql->query($transQ); + $tn++; +} + + +?> diff --git a/fannie/cron/nightly.ar.php b/fannie/cron/nightly.ar.php new file mode 100644 index 000000000..3faf75fb1 --- /dev/null +++ b/fannie/cron/nightly.ar.php @@ -0,0 +1,138 @@ +datediff($sql->now(),'tdate')." = 1 + AND (department IN $dlist OR trans_subtype='MI')"; +$sql->query($query); + +$sql->query("TRUNCATE TABLE ar_history_sum"); +$query = "INSERT INTO ar_history_sum + SELECT card_no,SUM(charges),SUM(payments),SUM(charges)-SUM(payments) + FROM ar_history GROUP BY card_no"; +$sql->query($query); + +/* turnover view/cache base tables for WFC end-of-month reports */ +if (date("j")==1 && $sql->table_exists("ar_history_backup")){ + $sql->query("TRUNCATE TABLE ar_history_backup"); + $sql->query("INSERT INTO ar_history_backup SELECT * FROM ar_history"); + + $AR_EOM_Summary_Q = " + INSERT INTO AR_EOM_Summary + SELECT c.CardNo," + .$sql->concat("c.FirstName","' '","c.LastName",'')." AS memName, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -4 + THEN charges ELSE 0 END) + - SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -4 + THEN payments ELSE 0 END) AS priorBalance, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." = -3 + THEN a.charges ELSE 0 END) AS threeMonthCharges, + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." = -3 + THEN a.payments ELSE 0 END) AS threeMonthPayments, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -3 + THEN charges ELSE 0 END) + - SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -3 + THEN payments ELSE 0 END) AS threeMonthBalance, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." = -2 + THEN a.charges ELSE 0 END) AS twoMonthCharges, + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." = -2 + THEN a.payments ELSE 0 END) AS twoMonthPayments, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -2 + THEN charges ELSE 0 END) + - SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -2 + THEN payments ELSE 0 END) AS twoMonthBalance, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." = -1 + THEN a.charges ELSE 0 END) AS lastMonthCharges, + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." = -1 + THEN a.payments ELSE 0 END) AS lastMonthPayments, + + SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -1 + THEN charges ELSE 0 END) + - SUM(CASE WHEN ".$sql->monthdiff('a.tdate',$sql->now())." <= -1 + THEN payments ELSE 0 END) AS lastMonthBalance + + FROM ar_history_backup AS a LEFT JOIN " + .$FANNIE_OP_DB.$sql->sep()."custdata AS c + ON a.card_no=c.CardNo AND c.personNum=1 + GROUP BY c.CardNo,c.LastName,c.FirstName"; + + if ($sql->table_exists("AR_EOM_Summary")){ + $sql->query("TRUNCATE TABLE AR_EOM_Summary"); + $sql->query($AR_EOM_Summary_Q); + } +} + +?> diff --git a/fannie/cron/nightly.batch.php b/fannie/cron/nightly.batch.php new file mode 100644 index 000000000..b88b43ae3 --- /dev/null +++ b/fannie/cron/nightly.batch.php @@ -0,0 +1,177 @@ +query("UPDATE products SET + special_price=0, + specialpricemethod=0, + specialquantity=0, + specialgroupprice=0, + discounttype=0, + start_date='1900-01-01', + end_date='1900-01-01'"); + +/* + products.numflag is being used for actual flags; + priority needs to be re-done some other way + + priorities: + 15 => HQ High Priority + (applies to all product records) + 10 => Store High Priority + (applies to store records w/o HQ high priority) + 5 => HQ Normal Priority + (applies to all records except store high priority) + 0 => Store Normal Priority + (applies to store records not already on sale) +*/ +$priority_clause = ""; +if ($FANNIE_STORE_ID==0){ + $priority_clause = "(b.priority=15 + OR (b.priority >= ((p.numflag>>5)&0x1f) < 10))"; +} +else { + $priority_clause = "(p.store_id=$FANNIE_STORE_ID + AND (b.priority >= ((p.numflag>>5)&0x1f) < 10))"; +} + +// resale things that should be on sale +if (strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("UPDATE products AS p + INNER JOIN upcLike AS u ON p.upc=u.upc + SET p.mixmatchcode=convert(u.likeCode+500,char)"); + + $sql->query("UPDATE products AS p + LEFT JOIN batchList AS l ON p.upc=l.upc + LEFT JOIN batches AS b ON l.batchID=b.batchID + SET + p.special_price = l.salePrice, + p.specialpricemethod = l.pricemethod, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialquantity = l.quantity, + p.start_date = b.startDate, + p.end_date = b.endDate, + p.discounttype = b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + ELSE p.mixmatchcode + END + WHERE l.upc NOT LIKE 'LC%' + AND CURDATE() >= b.startDate AND CURDATE() <= b.endDate + AND b.discounttype <> 0"); + + $sql->query("UPDATE products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + LEFT JOIN batches AS b ON l.batchID=b.batchID + SET p.special_price = l.salePrice, + p.end_date = b.endDate,p.start_date=b.startDate, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialquantity=l.quantity, + p.specialpricemethod=l.pricemethod, + p.discounttype = b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + ELSE p.mixmatchcode + END + WHERE l.upc LIKE 'LC%' + AND CURDATE() >= b.startDate AND CURDATE() <= b.endDate + AND b.discounttype <> 0"); +} +else { + $sql->query("UPDATE products + SET mixmatchcode=convert(varchar,u.likecode+500) + FROM + products AS p + INNER JOIN upcLike AS u + ON p.upc=u.upc"); + $sql->query("UPDATE products + SET + special_price = b.salePrice, + specialpricemethod = b.pricemethod, + specialgroupprice=CASE WHEN b.salePrice < 0 THEN -1*b.salePrice ELSE b.salePrice END, + specialquantity = b.quantity, + start_date = b.startDate, + end_date = b.endDate, + discounttype = b.discountType, + mixmatchcode = CASE + WHEN b.pricemethod IN (3,4) AND b.salePrice >= 0 THEN convert(varchar,b.batchID) + WHEN b.pricemethod IN (3,4) AND b.salePrice < 0 THEN convert(varchar,-1*b.batchID) + ELSE p.mixmatchcode + END + FROM products AS p + LEFT JOIN batchPriority AS b ON p.upc=b.upc + WHERE b.upc NOT LIKE 'LC%' + AND b.discountType <> 0"); + + $sql->query("UPDATE products SET special_price = b.salePrice, + end_date = b.enddate,start_date=b.startdate, + specialgroupprice=CASE WHEN b.salePrice < 0 THEN -1*b.salePrice ELSE b.salePrice END, + specialquantity=b.quantity, + specialpricemethod=b.pricemethod, + discounttype = b.discounttype, + mixmatchcode = CASE + WHEN b.pricemethod IN (3,4) AND b.salePrice >= 0 THEN convert(varchar,b.batchID) + WHEN b.pricemethod IN (3,4) AND b.salePrice < 0 THEN convert(varchar,-1*b.batchID) + ELSE p.mixmatchcode + END + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchPriority AS b ON b.upc='LC'+convert(varchar,v.likecode) + WHERE b.upc LIKE 'LC%' + AND b.discountType <> 0"); +} + +?> diff --git a/fannie/cron/nightly.clipboard.php b/fannie/cron/nightly.clipboard.php new file mode 100644 index 000000000..75cf866db --- /dev/null +++ b/fannie/cron/nightly.clipboard.php @@ -0,0 +1,59 @@ +query("TRUNCATE TABLE batchCutPaste"); +if ($chk === false) + echo cron_msg("Error clearing batch clipboard"); +else + echo cron_msg("Cleared batch clipboard"); + +$chk2 = $sql->query("DELETE FROM shelftags WHERE id < 0"); +if ($chk2 === false) + echo cron_msg("Error clearing deleted sheltags"); +else + echo cron_msg("Cleared deleted shelftags"); + +?> diff --git a/fannie/cron/nightly.db.backup.php b/fannie/cron/nightly.db.backup.php new file mode 100644 index 000000000..707791cc2 --- /dev/null +++ b/fannie/cron/nightly.db.backup.php @@ -0,0 +1,72 @@ += $FANNIE_BACKUP_NUM){ + if (is_file(realpath($dir."/".$files[$num-1]))){ + unlink($dir."/".$files[$num-1]); + } + $num--; + } + + $cmd = realpath($FANNIE_BACKUP_BIN."/mysqldump"); + $cmd .= " -q --databases -h \"$FANNIE_SERVER\" -u \"$FANNIE_SERVER_USER\" -p\"$FANNIE_SERVER_PW\" \"$db\""; + $cmd = escapeshellcmd($cmd); + if ($FANNIE_BACKUP_GZIP) + $cmd .= " | ".escapeshellcmd(realpath($FANNIE_BACKUP_BIN."/gzip")); + + $outfile = $dir."/".$db.date("Ymd").".sql"; + if ($FANNIE_BACKUP_GZIP) $outfile .= ".gz"; + + $cmd .= " > ".escapeshellcmd("\"$outfile\""); + + system($cmd); +} + +?> diff --git a/fannie/cron/nightly.dtrans.php b/fannie/cron/nightly.dtrans.php new file mode 100644 index 000000000..d870b9384 --- /dev/null +++ b/fannie/cron/nightly.dtrans.php @@ -0,0 +1,594 @@ +table_definition('dtransactions'); +if (isset($cols['date_id'])){ + $sql->query("UPDATE dtransactions SET date_id=DATE_FORMAT(datetime,'%Y%m%d')"); +} + +/* Load dtransactions into the archive, trim to 90 days */ +$chk1 = $sql->query("INSERT INTO transarchive SELECT * FROM dtransactions"); +$chk2 = $sql->query("DELETE FROM transarchive WHERE ".$sql->datediff($sql->now(),'datetime')." > 92"); +if ($chk1 === false) + echo cron_msg("Error loading data into transarchive"); +elseif ($chk2 === false) + echo cron_msg("Error trimming transarchive"); +else + echo cron_msg("Data rotated into transarchive"); + +/* reload all the small snapshot */ +$chk1 = $sql->query("TRUNCATE TABLE dlog_15"); +$chk2 = $sql->query("INSERT INTO dlog_15 SELECT * FROM dlog_90_view WHERE ".$sql->datediff($sql->now(),'tdate')." <= 15"); +if ($chk1 === false || $chk2 === false) + echo cron_msg("Error reloading dlog_15"); +else + echo cron_msg("Success reloading dlog_15"); + +/* figure out which monthly archive dtransactions data belongs in */ +$res = $sql->query("SELECT month(datetime),year(datetime) FROM dtransactions"); +$row = $sql->fetch_row($res); +$dstr = $row[1].(str_pad($row[0],2,'0',STR_PAD_LEFT)); +$table = 'transArchive'.$dstr; + +/* store monthly archive locally or remotely as needed + remote archiving is very beta +*/ +if ($FANNIE_ARCHIVE_REMOTE){ + $sql = new SQLManager($FANNIE_ARCHIVE_SERVER,$FANNIE_ARCHIVE_DBMS, + $FANNIE_ARCHIVE_DB,$FANNIE_ARCHIVE_USER,$FANNIE_ARCHIVE_PW); + if (!$sql->table_exists($table)){ + createArchive($table,$sql); + createViews($dstr,$sql); + } + $sql->add_connection($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + $sql->transfer($FANNIE_TRANS_DB,"select * from dtransactions", + $FANNIE_ARCHIVE_DB,"insert into $table"); +} +else { + $sql = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + if ($FANNIE_ARCHIVE_METHOD == "partitions" && strstr($FANNIE_SERVER_DBMS, "MYSQL")){ + // we're just partitioning + // make a new partition if it's a new month + if (date('j') == 1){ + $p = "p".date("Ym"); + $boundary = date("Y-m-d",mktime(0,0,0,date("n")+1,1,date("Y"))); + // new partition named pYYYYMM + // ends on first day of next month + $newQ = sprintf("ALTER TABLE bigArchive ADD PARTITION + (PARTITION %s + VALUES LESS THAN (TO_DAYS('%s')) + )",$p,$boundary); + $newR = $sql->query($newQ); + if ($newR === false) + echo cron_msg("Error creating new partition $p"); + } + + // now just copy rows into the partitioned table + $loadQ = "INSERT INTO bigArchive SELECT * FROM {$FANNIE_TRANS_DB}.dtransactions"; + + // data warehousing option; tag records with an ID + // referencing dedicated date table + /* + $columns = $sql->table_definition("bigArchive"); + if (isset($columns['date_id']) && $sql->table_exists("warehouse_date")){ + $loadQ = "INSERT INTO bigArchive + SELECT t.*,d.date_id FROM + {$FANNIE_TRANS_DB}.dtransactions AS t + LEFT JOIN warehouse_date AS d ON + YEAR(t.datetime)=d.year AND + MONTH(t.datetime)=d.month AND + DAY(t.datetime)=d.day"; + } + */ + $loadR = $sql->query($loadQ); + } + else if (!$sql->table_exists($table)){ + // 20Nov12 EL Add "TABLE". + $query = "CREATE TABLE $table LIKE $FANNIE_TRANS_DB.dtransactions"; + if ($FANNIE_SERVER_DBMS == 'MSSQL') + $query = "SELECT * INTO $table FROM $FANNIE_TRANS_DB.dbo.dtransactions"; + $chk1 = $sql->query($query,$FANNIE_ARCHIVE_DB); + $chk2 = true; + if (strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + // mysql doesn't create & populate in one step + $chk2 = $sql->query("INSERT INTO $table SELECT * FROM $FANNIE_TRANS_DB.dtransactions"); + } + if ($chk1 === false || $chk2 === false) + echo cron_msg("Error creating new archive $table"); + else + echo cron_msg("Created new table $table and archived dtransactions"); + createViews($dstr,$sql); + } + else { + $query = "INSERT INTO $table SELECT * FROM $FANNIE_TRANS_DB.dtransactions"; + if ($FANNIE_SERVER_DBMS == 'MSSQL') + $query = "INSERT INTO $table SELECT * FROM $FANNIE_TRANS_DB.dbo.dtransactions"; + $chk = $sql->query($query,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error archiving dtransactions"); + else + echo cron_msg("Success archiving dtransactions"); + } + + /* summary table stuff */ + + if ($sql->table_exists("sumUpcSalesByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumUpcSalesByDay + SELECT DATE(MAX(tdate)) AS tdate, upc, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as qty + FROM $FANNIE_TRANS_DB.dlog WHERE + trans_type IN ('I') AND upc <> '0' + GROUP BY upc"); + } + if ($sql->table_exists("sumRingSalesByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumRingSalesByDay + SELECT DATE(MAX(tdate)) AS tdate, upc, department, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as qty + FROM $FANNIE_TRANS_DB.dlog WHERE + trans_type IN ('I','D') AND upc <> '0' + GROUP BY upc, department"); + } + if ($sql->table_exists("sumDeptSalesByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumDeptSalesByDay + SELECT DATE(MAX(tdate)) AS tdate, department, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as qty + FROM $FANNIE_TRANS_DB.dlog WHERE + trans_type IN ('I','D') + GROUP BY department"); + } + if ($sql->table_exists("sumMemSalesByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumMemSalesByDay + SELECT DATE(MAX(tdate)) AS tdate, card_no, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as qty, + COUNT(DISTINCT trans_num) AS transCount + FROM $FANNIE_TRANS_DB.dlog WHERE + trans_type IN ('I','D') + GROUP BY card_no"); + } + if ($sql->table_exists("sumMemTypeSalesByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumMemTypeSalesByDay + SELECT DATE(MAX(tdate)) AS tdate, c.memType, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as qty, + COUNT(DISTINCT trans_num) AS transCount + FROM $FANNIE_TRANS_DB.dlog AS d LEFT JOIN + $FANNIE_OP_DB.custdata AS c ON d.card_no=c.CardNo + AND c.personNum=1 WHERE + trans_type IN ('I','D') + AND upc <> 'RRR' AND card_no <> 0 + GROUP BY c.memType"); + } + if ($sql->table_exists("sumTendersByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumTendersByDay + SELECT DATE(MAX(tdate)) AS tdate, trans_subtype, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + COUNT(*) AS quantity + FROM $FANNIE_TRANS_DB.dlog WHERE + trans_type IN ('T') + AND total <> 0 + GROUP BY trans_subtype"); + } + if ($sql->table_exists("sumDiscountsByDay") && strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $sql->query("INSERT INTO sumDiscountsByDay + SELECT DATE(MAX(tdate)) AS tdate, c.memType, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + COUNT(DISTINCT trans_num) AS transCount + FROM $FANNIE_TRANS_DB.dlog AS d LEFT JOIN + $FANNIE_OP_DB.custdata AS c ON d.card_no=c.CardNo + AND c.personNum=1 WHERE + trans_type IN ('S') AND total <> 0 + AND upc = 'DISCOUNT' AND card_no <> 0 + GROUP BY c.memType"); + } +} + +/* drop dtransactions data */ +$sql = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); +$chk = $sql->query("TRUNCATE TABLE dtransactions"); +if ($chk === false) + echo cron_msg("Error truncating dtransactions"); +else + echo cron_msg("Success truncating dtransactions"); + +function createArchive($name,$db){ + global $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_REMOTE, + $FANNIE_ARCHIVE_DBMS, $FANNIE_ARCHIVE_DB;; + + $dbms = $FANNIE_ARCHIVE_REMOTE?$FANNIE_ARCHIVE_DBMS:$FANNIE_SERVER_DBMS; + + $trans_columns = "( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(255) default NULL, + `description` varchar(255) default NULL, + `trans_type` varchar(255) default NULL, + `trans_subtype` varchar(255) default NULL, + `trans_status` varchar(255) default NULL, + `department` smallint(6) default NULL, + `quantity` double default NULL, + `scale` tinyint(4) default NULL, + `cost` double default 0.00 NULL, + `unitPrice` double default NULL, + `total` double default NULL, + `regPrice` double default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` double default NULL, + `memDiscount` double default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` double default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` double default NULL, + `mixMatch` smallint(6) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` smallint(6) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` varchar(255) default NULL, + `trans_id` int(11) default NULL + )"; + + if ($dbms == 'MSSQL'){ + $trans_columns = "([datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [cost] [money] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [smallint] NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [isStaff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL )"; + } + + $db->query("CREATE TABLE $table $trans_columns",$FANNIE_ARCHIVE_DB); +} + +function createViews($dstr,$db){ + global $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_REMOTE, + $FANNIE_ARCHIVE_DBMS, $FANNIE_ARCHIVE_DB, + $FANNIE_SERVER,$FANNIE_SERVER_PW,$FANNIE_SERVER_USER, + $FANNIE_ARCHIVE_SERVER,$FANNIE_ARCHIVE_USER, + $FANNIE_ARCHIVE_PW; + + if ($FANNIE_ARCHIVE_REMOTE){ + $db->add_connection($FANNIE_ARCHIVE_SERVER,$FANNIE_ARCHIVE_DBMS, + $FANNIE_ARCHIVE_DB,$FANNIE_ARCHIVE_USER, + $FANNIE_ARCHIVE_PW); + } + else { + $db->add_connection($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_ARCHIVE_DB,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + } + + $dbms = $FANNIE_ARCHIVE_REMOTE?$FANNIE_ARCHIVE_DBMS:$FANNIE_SERVER_DBMS; + + $dlogQ = "CREATE view dlog$dstr as + select + d.datetime as tdate, + d.register_no, + d.emp_no, + d.trans_no, + d.upc, + CASE WHEN (d.trans_subtype IN ('CP','IC') OR d.upc like('%000000052')) then 'T' + WHEN d.upc = 'DISCOUNT' then 'S' else d.trans_type end as trans_type, + CASE WHEN d.upc = 'MAD Coupon' THEN 'MA' ELSe + case when d.upc like('%00000000052') then 'RR' else d.trans_subtype end end as trans_subtype, + d.trans_status, + d.department, + d.quantity, + d.unitPrice, + d.total, + d.tax, + d.foodstamp, + d.itemQtty, + d.memType, + d.staff, + d.numflag, + d.charflag, + d.card_no, + d.trans_id, + concat(convert(d.emp_no,char), '-', convert(d.register_no,char), '-', + convert(d.trans_no,char)) as trans_num + + from transArchive$dstr as d + where d.trans_status not in ('D','X','Z') and d.emp_no not in (9999,56) and d.register_no <> 99"; + + if ($dbms == "MSSQL"){ + $dlogQ = "CREATE view dlog$dstr as + select + d.datetime as tdate, + d.register_no, + d.emp_no, + d.trans_no, + d.upc, + CASE WHEN (d.trans_subtype IN ('CP','IC') OR d.upc like('%000000052')) then 'T' + WHEN d.upc = 'DISCOUNT' then 'S' else d.trans_type end as trans_type, + CASE WHEN d.upc = 'MAD Coupon' THEN 'MA' ELSe + case when d.upc like('%00000000052') then 'RR' else d.trans_subtype end end as trans_subtype, + d.trans_status, + d.department, + d.quantity, + d.unitPrice, + d.total, + d.tax, + d.foodstamp, + d.itemQtty, + d.memType, + d.isStaff, + d.numflag, + d.charflag, + d.card_no, + d.trans_id, + (convert(varchar,d.emp_no) + '-' + convert(varchar,d.register_no) + '-' + + convert(varchar,d.trans_no)) as trans_num + + from transArchive$dstr as d + where d.trans_status not in ('D','X','Z') and d.emp_no not in (9999,56) and d.register_no <> 99"; + } + $chk = $db->query($dlogQ,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error creating dlog view for new archive table"); + + $rp1Q = "CREATE view rp_dt_receipt_$dstr as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char), ' @ ', convert(Volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char), ' /', convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num + + from transArchive$dstr + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + if ($dbms == 'MSSQL'){ + $rp1Q = "CREATE view rp_dt_receipt_$dstr as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num + + from transArchive$dstr + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + } + $chk = $db->query($rp1Q,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error creating receipt view for new archive table"); + + $rp2Q = "create view rp_receipt_header_$dstr as + select + datetime as dateTimeStamp, + card_no as memberID, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num, + register_no, + emp_no, + trans_no, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discounttype = 2 then memDiscount else 0 end),decimal(10,2)) as memSpecial, + convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, + convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from transArchive$dstr + group by register_no, emp_no, trans_no, card_no, datetime"; + if ($dbms == 'MSSQL'){ + $rp2Q = "create view rp_receipt_header_$dstr as + select + datetime as dateTimeStamp, + card_no as memberID, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num, + register_no, + emp_no, + trans_no, + convert(numeric(10,2), sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2), sum(case when discounttype = 2 then memDiscount else 0 end)) as memSpecial, + convert(numeric(10,2), sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, + convert(numeric(10,2), sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from transArchive$dstr + group by register_no, emp_no, trans_no, card_no, datetime"; + } + $chk = $db->query($rp2Q,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error creating receipt header view for new archive table"); +} + +?> diff --git a/fannie/cron/nightly.dtrans.wfc_temp.php b/fannie/cron/nightly.dtrans.wfc_temp.php new file mode 100644 index 000000000..0825b9acd --- /dev/null +++ b/fannie/cron/nightly.dtrans.wfc_temp.php @@ -0,0 +1,491 @@ +query("SELECT * FROM dtransactions + INTO OUTFILE '/pos/csvs/mydtrans.csv' + FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' + LINES TERMINATED BY '\\r\\n'"); +$dbc->close(); + +$dbc = new SQLManager('129.103.2.10','MSSQL','WedgePOS', + 'sa',$FANNIE_SERVER_PW); +$dbc->query("exec master..xp_cmdshell 'dtsrun /S IS4CSERV\IS4CSERV /U sa /P $FANNIE_SERVER_PW /N dt-import-my',no_output",'WedgePOS'); +$dbc->close(); + +/* end pull */ + +exit; + +/* push from MSSQL to MySQL follows */ +/* +$dbc = new SQLManager('129.103.2.10','MSSQL','WedgePOS', + 'sa',$FANNIE_SERVER_PW); +$dbc->query("exec master..xp_cmdshell 'dtsrun /S IS4CSERV\IS4CSERV /U sa /P $FANNIE_SERVER_PW /N export_dt',no_output",'WedgePOS'); +$dbc->close(); + +$sql = new SQLManager('129.103.2.2','MYSQL','is4c_trans', + 'root',$FANNIE_SERVER_PW); + +$sql->query("LOAD DATA LOCAL INFILE '/pos/csvs/dtransactions.csv' + INTO TABLE dtransactions + FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' + LINES TERMINATED BY '\\r\\n'"); +*/ + +/* +$sql = new SQLManager('129.103.2.2','MYSQL','is4c_trans', + 'root',$FANNIE_SERVER_PW); +*/ +/* Load dtransactions into the archive, trim to 90 days */ +/* +$chk1 = $sql->query("INSERT INTO transarchive SELECT * FROM dtransactions"); +$chk2 = $sql->query("DELETE FROM transarchive WHERE ".$sql->datediff($sql->now(),'datetime')." > 92"); +if ($chk1 === false) + echo cron_msg("Error loading data into transarchive"); +elseif ($chk2 === false) + echo cron_msg("Error trimming transarchive"); +else + echo cron_msg("Data rotated into transarchive"); +*/ + +/* reload all the small snapshot */ +/* +$chk1 = $sql->query("TRUNCATE TABLE dlog_15"); +$chk2 = $sql->query("INSERT INTO dlog_15 SELECT * FROM dlog_90_view WHERE ".$sql->datediff($sql->now(),'tdate')." <= 15"); +if ($chk1 === false || $chk2 === false) + echo cron_msg("Error reloading dlog_15"); +else + echo cron_msg("Success reloading dlog_15"); +*/ + +// use partitioned archive table; needs better solution by 3/31/2012 +//$sql->query("INSERT INTO trans_archive.bigArchive SELECT * FROM dtransactions"); +/* figure out which monthly archive dtransactions data belongs in */ +/* +$res = $sql->query("SELECT month(datetime),year(datetime) FROM dtransactions"); +$row = $sql->fetch_row($res); +$dstr = $row[1].(str_pad($row[0],2,'0',STR_PAD_LEFT)); +$table = 'transArchive'.$dstr; + +// archive dtransactions locally +if(!$FANNIE_ARCHIVE_REMOTE || True){ + $sql = new SQLManager('129.103.2.2','MYSQL',$FANNIE_ARCHIVE_DB, + 'root',$FANNIE_SERVER_PW); + if (!$sql->table_exists($table)){ + $query = "CREATE TABLE $table LIKE is4c_trans.dtransactions"; + $chk1 = $sql->query($query,$FANNIE_ARCHIVE_DB); + // mysql doesn't create & populate in one step + $chk2 = $sql->query("INSERT INTO $table SELECT * FROM is4c_trans.dtransactions"); + if ($chk1 === false || $chk2 === false) + echo cron_msg("Error creating new archive $table"); + else + echo cron_msg("Created new table $table and archived dtransactions"); + createViews($dstr,$sql); + } + else { + $query = "INSERT INTO $table SELECT * FROM is4c_trans.dtransactions"; + $chk = $sql->query($query,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error archiving dtransactions"); + else + echo cron_msg("Success archiving dtransactions"); + } +} +*/ + +/* drop dtransactions data */ +/* +$sql = new SQLManager('129.103.2.2','MYSQL','is4c_trans', + 'root',$FANNIE_SERVER_PW); +$chk = $sql->query("TRUNCATE TABLE dtransactions"); +if ($chk === false) + echo cron_msg("Error truncating dtransactions"); +else + echo cron_msg("Success truncating dtransactions"); +*/ + +function createArchive($name,$db,$override_dbms=''){ + global $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_REMOTE, + $FANNIE_ARCHIVE_DBMS, $FANNIE_ARCHIVE_DB; + + $dbms = $FANNIE_ARCHIVE_REMOTE?$FANNIE_ARCHIVE_DBMS:$FANNIE_SERVER_DBMS; + if ($override_dbms != '') $dbms = $override_dbms; + + $trans_columns = "( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(255) default NULL, + `description` varchar(255) default NULL, + `trans_type` varchar(255) default NULL, + `trans_subtype` varchar(255) default NULL, + `trans_status` varchar(255) default NULL, + `department` smallint(6) default NULL, + `quantity` double default NULL, + `scale` tinyint(4) default NULL, + `cost` double default 0.00 NULL, + `unitPrice` double default NULL, + `total` double default NULL, + `regPrice` double default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` double default NULL, + `memDiscount` double default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` double default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` double default NULL, + `mixMatch` smallint(6) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` smallint(6) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` varchar(255) default NULL, + `trans_id` int(11) default NULL + )"; + + if ($dbms == 'MSSQL'){ + $trans_columns = "([datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [cost] [money] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [smallint] NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [isStaff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL )"; + } + + $db->query("CREATE TABLE $table $trans_columns",$FANNIE_ARCHIVE_DB); +} + +function createViews($dstr,$db){ + global $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_REMOTE, + $FANNIE_ARCHIVE_DBMS, $FANNIE_ARCHIVE_DB, + $FANNIE_SERVER,$FANNIE_SERVER_PW,$FANNIE_SERVER_USER, + $FANNIE_ARCHIVE_SERVER,$FANNIE_ARCHIVE_USER, + $FANNIE_ARCHIVE_PW; + + $dbms = 'MYSQL'; + + $dlogQ = "CREATE view dlog$dstr as + select + d.datetime as tdate, + d.register_no, + d.emp_no, + d.trans_no, + d.upc, + CASE WHEN (d.trans_subtype IN ('CP','IC') OR d.upc like('%000000052')) then 'T' + WHEN d.upc = 'DISCOUNT' then 'S' else d.trans_type end as trans_type, + CASE WHEN d.upc = 'MAD Coupon' THEN 'MA' ELSe + case when d.upc like('%00000000052') then 'RR' else d.trans_subtype end end as trans_subtype, + d.trans_status, + d.department, + d.quantity, + d.unitPrice, + d.total, + d.tax, + d.foodstamp, + d.itemQtty, + d.memType, + d.staff, + d.numflag, + d.charflag, + d.card_no, + d.trans_id, + concat(convert(d.emp_no,char), '-', convert(d.register_no,char), '-', + convert(d.trans_no,char)) as trans_num + + from transArchive$dstr as d + where d.trans_status not in ('D','X','Z') and d.emp_no not in (9999,56) and d.register_no <> 99"; + + if ($dbms == "MSSQL"){ + $dlogQ = "CREATE view dlog$dstr as + select + d.datetime as tdate, + d.register_no, + d.emp_no, + d.trans_no, + d.upc, + CASE WHEN (d.trans_subtype IN ('CP','IC') OR d.upc like('%000000052')) then 'T' + WHEN d.upc = 'DISCOUNT' then 'S' else d.trans_type end as trans_type, + CASE WHEN d.upc = 'MAD Coupon' THEN 'MA' ELSe + case when d.upc like('%00000000052') then 'RR' else d.trans_subtype end end as trans_subtype, + d.trans_status, + d.department, + d.quantity, + d.unitPrice, + d.total, + d.tax, + d.foodstamp, + d.itemQtty, + d.memType, + d.isStaff, + d.numflag, + d.charflag, + d.card_no, + d.trans_id, + (convert(varchar,d.emp_no) + '-' + convert(varchar,d.register_no) + '-' + + convert(varchar,d.trans_no)) as trans_num + + from transArchive$dstr as d + where d.trans_status not in ('D','X','Z') and d.emp_no not in (9999,56) and d.register_no <> 99"; + } + $chk = $db->query($dlogQ,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error creating dlog view for new archive table"); + + $rp1Q = "CREATE view rp_dt_receipt_$dstr as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char), ' @ ', convert(Volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char), ' /', convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num + + from transArchive$dstr + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + if ($dbms == 'MSSQL'){ + $rp1Q = "CREATE view rp_dt_receipt_$dstr as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num + + from transArchive$dstr + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + } + $chk = $db->query($rp1Q,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error creating receipt view for new archive table"); + + $rp2Q = "create view rp_receipt_header_$dstr as + select + datetime as dateTimeStamp, + card_no as memberID, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num, + register_no, + emp_no, + trans_no, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discounttype = 2 then memDiscount else 0 end),decimal(10,2)) as memSpecial, + convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, + convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from transArchive$dstr + group by register_no, emp_no, trans_no, card_no, datetime"; + if ($dbms == 'MSSQL'){ + $rp2Q = "create view rp_receipt_header_$dstr as + select + datetime as dateTimeStamp, + card_no as memberID, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num, + register_no, + emp_no, + trans_no, + convert(numeric(10,2), sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2), sum(case when discounttype = 2 then memDiscount else 0 end)) as memSpecial, + convert(numeric(10,2), sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, + convert(numeric(10,2), sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from transArchive$dstr + group by register_no, emp_no, trans_no, card_no, datetime"; + } + $chk = $db->query($rp2Q,$FANNIE_ARCHIVE_DB); + if ($chk === false) + echo cron_msg("Error creating receipt header view for new archive table"); +} + +?> diff --git a/fannie/cron/nightly.equity.php b/fannie/cron/nightly.equity.php new file mode 100644 index 000000000..f01fa17ec --- /dev/null +++ b/fannie/cron/nightly.equity.php @@ -0,0 +1,63 @@ +datediff($sql->now(),'tdate')." = 1 + AND department IN $dlist"; +$sql->query($query); + +?> diff --git a/fannie/cron/nightly.hq.dtrans.php b/fannie/cron/nightly.hq.dtrans.php new file mode 100644 index 000000000..dda7b3c7d --- /dev/null +++ b/fannie/cron/nightly.hq.dtrans.php @@ -0,0 +1,106 @@ +add_connection($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + +// determine what month table dtransactions data goes in +$res = $sql->query("SELECT month(datetime),year(datetime) FROM dtransactions",$FANNIE_TRANS_DB); +$row = $sql->fetch_row($res); +$dstr = $row[1].(str_pad($row[0],2,'0',STR_PAD_LEFT)); +$monthTable = "transArchive".$dstr; + +if (!$sql->table_exists($monthTable,$FANNIE_MASTER_ARCH_DB)){ + if (strstr($minfo['type'], "MYSQL")){ + $createQ = "CREATE TABLE $monthTable LIKE ".$minfo['trans'].".dtransactions"; + $sql->query($createQ,$FANNIE_MASTER_ARCH_DB); + } + else { + $createQ = "SELECT * INTO $monthTable FROM ".$minfo['trans'].".dbo.dtransactions WHERE 1=0"; + $sql->query($createQ,$FANNIE_MASTER_ARCH_DB); + } +} + +// create a temporary table on master so data only +// ships across the network once +$tempTable = "transTemp".str_replace(".","_",$FANNIE_SERVER); +if (strstr($minfo['type'], "MYSQL")){ + $tempQ = "CREATE TABLE $tempTable LIKE $monthTable"; + $sql->query($tempQ,$FANNIE_MASTER_ARCH_DB); +} +else { + $tempQ = "SELECT * INTO $tempTable FROM $monthTable WHERE 1=0"; + $sql->query($tempQ,$FANNIE_MASTER_ARCH_DB); +} + +/* actual transfer */ +$sql->transfer($FANNIE_TRANS_DB,"SELECT * FROM dtransactions", + $FANNIE_MASTER_ARCH_DB,"INSERT INTO $tempTable"); + +// copy data from temp table to transarchive and month snapshot +$insQ1 = "INSERT INTO $monthTable SELECT * FROM $tempTable"; +$insQ2 = "INSERT INTO ".$minfo['trans'].".dbo.transarchive SELECT * FROM $tempTable"; +if (strstr($minfo['type'], "MYSQL")){ + $insQ2 = str_replace("dbo.","",$insQ2); +} +$sql->query($insQ1,$FANNIE_MASTER_ARCH_DB); +$sql->query($insQ2,$FANNIE_MASTER_ARCH_DB); + +// get rid of the temp table +$cleanQ = "DROP TABLE $tempTable"; +$sql->query($cleanQ,$FANNIE_MASTER_ARCH_DB); + +?> diff --git a/fannie/cron/nightly.lanesync.php b/fannie/cron/nightly.lanesync.php new file mode 100644 index 000000000..7d6cf9e22 --- /dev/null +++ b/fannie/cron/nightly.lanesync.php @@ -0,0 +1,136 @@ +> /var/www/IS4C/fannie/logs/dayend.log + +*/ + +/* HELP + + nightly.lanesync.php + + Send the following tables to all lanes: + products, custdata, memberCards, employees, departments, custReceiptMessage + Optionally also send: + productUser + + Uses curl to call Fannie's web-based sync routines + +*/ + +include('../config.php'); +include($FANNIE_ROOT.'src/cron_msg.php'); +include($FANNIE_ROOT.'classlib2.0/data/FannieDB.php'); + + +set_time_limit(0); + +$dbc = FannieDB::get($FANNIE_TRANS_DB); +foreach($FANNIE_LANES as $f){ + $dbc->add_connection($f['host'],$f['type'],$f['trans'],$f['user'],$f['pw']); + if ($dbc->connections[$f['trans']] === False){ + echo cron_msg('Cannot connect to '.$f['host']); + continue; + } + + $try = $dbc->transfer($f['trans'],'SELECT * FROM valutecRequest', + $FANNIE_TRANS_DB,'INSERT INTO valutecRequest'); + if ($try !== False){ + $dbc->query('TRUNCATE TABLE valutecRequest',$f['trans']); + } + + $try = $dbc->transfer($f['trans'],'SELECT * FROM valutecRequestMod', + $FANNIE_TRANS_DB,'INSERT INTO valutecRequestMod'); + if ($try !== False){ + $dbc->query('TRUNCATE TABLE valutecRequestMod',$f['trans']); + } + + $try = $dbc->transfer($f['trans'],'SELECT * FROM valutecResponse', + $FANNIE_TRANS_DB,'INSERT INTO valutecResponse'); + if ($try !== False){ + $dbc->query('TRUNCATE TABLE valutecResponse',$f['trans']); + } +} + +$url = "http://".php_uname('n').$FANNIE_URL."sync/TableSyncPage.php"; + +/* curl_init(): + * Initializes a new session and returns a cURL handle for use with + * the curl_setopt(), curl_exec(), and curl_close() functions. +*/ +$products = curl_init($url."?tablename=products&othertable="); +/* CURLOPT_RETURNTRANSFER: + * TRUE to return the transfer as a string of the return value of + * curl_exec() instead of outputting it out directly. +*/ +curl_setopt($products, CURLOPT_RETURNTRANSFER, True); +// r1 is apparently never used. +$r1 = curl_exec($products); +// r1 contains a copy of the web page. logging makes a bit of a mess +//echo "Result of tablesync of products: >{$r1}<"; +curl_close($products); + +// Other tables are done the same way, except as noted. + +$custdata = curl_init($url."?tablename=custdata&othertable="); +curl_setopt($custdata, CURLOPT_RETURNTRANSFER, True); +$r1 = curl_exec($custdata); +curl_close($custdata); + +// Note use of othertable. +$memcards = curl_init($url."?tablename=&othertable=memberCards"); +curl_setopt($memcards, CURLOPT_RETURNTRANSFER, True); +$r1 = curl_exec($memcards); +curl_close($memcards); + +// 15May13 EL This table doesn't seem to exist on lanes. +$crm = curl_init($url."?tablename=&othertable=custReceiptMessage"); +curl_setopt($crm, CURLOPT_RETURNTRANSFER, True); +$r1 = curl_exec($crm); +curl_close($crm); + +$employees = curl_init($url."?tablename=employees&othertable="); +curl_setopt($employees, CURLOPT_RETURNTRANSFER, True); +$r1 = curl_exec($employees); +curl_close($employees); + +$departments = curl_init($url."?tablename=departments&othertable="); +curl_setopt($departments, CURLOPT_RETURNTRANSFER, True); +$r1 = curl_exec($departments); +curl_close($departments); + +if ( isset($FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION == True ) { + $productUser = curl_init($url."?tablename=productUser&othertable="); + curl_setopt($productUser, CURLOPT_RETURNTRANSFER, True); + $r1 = curl_exec($productUser); + curl_close($productUser); +} + +?> diff --git a/fannie/cron/nightly.memcoupon.php b/fannie/cron/nightly.memcoupon.php new file mode 100644 index 000000000..e6499b5ca --- /dev/null +++ b/fannie/cron/nightly.memcoupon.php @@ -0,0 +1,79 @@ +query("TRUNCATE TABLE memcoupon"); + +$insQ = "INSERT INTO memcoupon + select card_no, tdate, total,trans_num + from {$TRANS}dlog_90_view + where (trans_subtype = 'MA' or upc like '%MAD Coupon%') + and ceiling(month(tdate)/3.0) = ceiling(month(".$sql->now().")/3.0) + and year(tdate) = year(".$sql->now().") + and total > -2.52 and total < 2.52 + order by card_no"; +$insR = $sql->query($insQ); + +$resetQ = "update custdata set memCoupons=1 where Type='PC'"; +$resetR = $sql->query($resetQ); + +$bl = "CONCAT( CONVERT(CardNo,char), ' ', LastName )"; +if ($FANNIE_SERVER_DBMS == "MSSQL") + $bl = "RTRIM(CardNo) + ' ' + RTRIM(LastName)"; +$resetQ = "update custdata set memCoupons=0,blueLine=$bl where Type<>'PC'"; +$resetR = $sql->query($resetQ); + +$usedQ = "SELECT cardno FROM memcoupon GROUP BY cardno HAVING SUM(total) <> 0"; +$usedR = $sql->query($usedQ); +while($usedW = $sql->fetch_row($usedR)){ + $upR = $sql->query("UPDATE custdata SET memCoupons=0 WHERE CardNo=".$usedW['cardno']); +} + +$bl = "CONCAT( CONVERT(CardNo,char), ' ', LastName, ' Coup(', CONVERT(memCoupons,char), ')' )"; +if ($FANNIE_SERVER_DBMS == "MSSQL") + $bl = "RTRIM(CardNo) + ' ' + RTRIM(LastName) + ' Coup(' + CONVERT(varchar,memCoupons) + ')'"; +$blQ = "update custdata + SET blueLine = $bl + WHERE Type = 'PC'"; +$blR = $sql->query($blQ); + +?> diff --git a/fannie/cron/nightly.pcbatch.php b/fannie/cron/nightly.pcbatch.php new file mode 100644 index 000000000..e78e887e0 --- /dev/null +++ b/fannie/cron/nightly.pcbatch.php @@ -0,0 +1,163 @@ +query("UPDATE products AS p LEFT JOIN + batchList AS l ON l.upc=p.upc LEFT JOIN + batches AS b ON b.batchID=l.batchID + SET p.normal_price = l.salePrice + WHERE l.batchID=b.batchID AND l.upc=p.upc + AND l.upc NOT LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"); +} +else { + $chk_vital[] = $sql->query("UPDATE products SET + normal_price = l.salePrice + FROM products AS p, batches AS b, batchList AS l + WHERE l.batchID=b.batchID AND l.upc=p.upc + AND l.upc NOT LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"); +} + +/* log changes in prodUpdate */ +if ($sql->table_exists("prodUpdate")){ + $upQ = "INSERT INTO prodUpdate + SELECT p.upc,description,p.normal_price, + department,tax,foodstamp,scale,0, + modified,0,qttyEnforced,discount,inUse + FROM products AS p, batches AS b, batchList AS l + WHERE l.batchID=b.batchID AND l.upc=p.upc + AND l.upc NOT LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"; + $chk_opt[] = $sql->query($upQ); +} + +/* likecoded items differentiated + for char concatenation +*/ +if (strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $chk_vital[] = $sql->query("UPDATE products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + LEFT JOIN batches AS b ON b.batchID = l.batchID + SET p.normal_price = l.salePrice + WHERE l.upc LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"); + + if ($sql->table_exists("prodUpdate")){ + $upQ = "INSERT INTO prodUpdate + SELECT p.upc,description,p.normal_price, + department,tax,foodstamp,scale,0, + modified,0,qttyEnforced,discount,inUse + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + LEFT JOIN batches AS b ON b.batchID = l.batchID + WHERE l.upc LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"; + $chk_opt[] = $sql->query($upQ); + } +} +else { + $chk_vital[] = $sql->query("UPDATE products SET normal_price = l.salePrice + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc='LC'+convert(varchar,v.likecode) + LEFT JOIN batches AS b ON b.batchID = l.batchID + WHERE l.upc LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"); + + if ($sql->table_exists("prodUpdate")){ + $upQ = "INSERT INTO prodUpdate + SELECT p.upc,description,p.normal_price, + department,tax,foodstamp,scale,0, + modified,0,qttyEnforced,discount,inUse + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc='LC'+convert(varchar,v.likecode) + LEFT JOIN batches AS b ON b.batchID = l.batchID + WHERE l.upc LIKE 'LC%' + AND b.discounttype = 0 + AND ".$sql->datediff($sql->now(),'b.startDate')." = 0"; + $chk_opt[] = $sql->query($upQ); + } +} + +$success = true; +foreach($chk_vital as $chk){ + if ($chk === false) + $success = false; +} +if ($success) + echo cron_msg("Price change batches run successfully"); +else + echo cron_msg("Error running price change batches"); + +$success = true; +foreach($chk_opt as $chk){ + if ($chk === false) + $success = false; +} +if ($success) + echo cron_msg("Changes logged in prodUpdate"); +else + echo cron_msg("Error logging changes"); +?> diff --git a/fannie/cron/nightly.specialorder.php b/fannie/cron/nightly.specialorder.php new file mode 100644 index 000000000..6b028b62a --- /dev/null +++ b/fannie/cron/nightly.specialorder.php @@ -0,0 +1,210 @@ +datediff($sql->now(),'datetime')." > 30"; +$cwIDs = "("; +$r = $sql->query($subquery); +while($w = $sql->fetch_row($r)){ + $cwIDs .= $w['order_id'].","; +} +$cwIDs = rtrim($cwIDs,",").")"; +if (strlen($cwIDs) > 2){ + $copyQ = "INSERT INTO CompleteSpecialOrder + SELECT p.* FROM PendingSpecialOrder AS p + WHERE p.order_id IN $cwIDs"; + $sql->query($copyQ); + $delQ = "DELETE FROM PendingSpecialOrder + WHERE order_id IN $cwIDs"; + $sql->query($delQ); +} +// end auto-close + +// auto-close all after 60 days +$subquery = "select p.order_id from PendingSpecialOrder as p + left join SpecialOrderStatus as s + on p.order_id=s.order_id + where p.trans_id=0 + and ".$sql->datediff($sql->now(),'datetime')." > 60"; +$allIDs = "("; +$r = $sql->query($subquery); +while($w = $sql->fetch_row($r)){ + $allIDs .= $w['order_id'].","; +} +$allIDs = rtrim($allIDs,",").")"; +if (strlen($allIDs) > 2){ + $copyQ = "INSERT INTO CompleteSpecialOrder + SELECT p.* FROM PendingSpecialOrder AS p + WHERE p.order_id IN $allIDs"; + $sql->query($copyQ); + $delQ = "DELETE FROM PendingSpecialOrder + WHERE order_id IN $allIDs"; + $sql->query($delQ); +} +// end auto-close + +$query = "SELECT mixMatch,matched FROM transarchive + WHERE charflag='SO' AND emp_no <> 9999 AND + register_no <> 99 AND trans_status NOT IN ('X','Z') + GROUP BY mixMatch,matched + HAVING sum(total) <> 0"; + //AND ".$sql->datediff($sql->now(),"datetime")."=1 +$result = $sql->query($query); + +$order_ids = array(); +$trans_ids = array(); +while($row = $sql->fetch_row($result)){ + $order_ids[] = (int)$row['mixMatch']; + $trans_ids[] = (int)$row['matched']; +} + +$where = "( "; +for($i=0;$iquery($copyQ); +$delQ = "DELETE FROM PendingSpecialOrder WHERE $where"; +$delR = $sql->query($delQ); + +$chkQ = "SELECT * FROM PendingSpecialOrder WHERE $where"; +$chkR = $sql->query($chkQ); +echo cron_msg("Missed on ".$sql->num_rows($chkR)." items"); + +// the trans_id=0 line contains additional, non-item order info +// this determines where applicable trans_id=0 lines have already +// been copied to CompletedSpecialOrder +// this could occur if the order contained multiple items picked up +// over multiple days +$oids = "("; +foreach($order_ids as $o) + $oids .= $o.","; +$oids = rtrim($oids,",").")"; +$checkQ = "SELECT order_id FROM CompleteSpecialOrder WHERE trans_id=0 AND order_id IN $oids"; +$checkR = $sql->query($checkQ); +$done_oids = array(); +while($row = $sql->fetch_row($checkR)) + $done_oids[] = (int)$row['order_id']; +$todo = array_diff($order_ids,$done_oids); + +echo cron_msg("Found ".count($todo)." new order headers"); + +if (count($todo) > 0){ + $copy_oids = "("; + foreach($todo as $o) + $copy_oids .= $o.","; + $copy_oids = rtrim($copy_oids,",").")"; + //echo "Headers: ".$copy_oids."\n"; + $copyQ = "INSERT INTO CompleteSpecialOrder SELECT * FROM PendingSpecialOrder + WHERE trans_id=0 AND order_id IN $copy_oids"; + $copyR = $sql->query($copyQ); +} + +// remove "empty" orders from pending +$cleanupQ = sprintf("SELECT p.order_id FROM PendingSpecialOrder + AS p LEFT JOIN SpecialOrderNotes AS n + ON p.order_id=n.order_id + LEFT JOIN SpecialOrderStatus AS s + ON p.order_id=s.order_id + WHERE (n.order_id IS NULL + OR %s(n.notes)=0) + OR p.order_id IN ( + SELECT order_id FROM CompleteSpecialOrder + WHERE trans_id=0 + GROUP BY order_id + ) + GROUP BY p.order_id + HAVING MAX(trans_id)=0", + ($FANNIE_SERVER_DBMS=="MSSQL" ? 'datalength' : 'length')); +$cleanupR = $sql->query($cleanupQ); +$empty = "("; +$clean=0; +while($row = $sql->fetch_row($cleanupR)){ + $empty .= $row['order_id'].","; + $clean++; +} +$empty = rtrim($empty,",").")"; + +echo cron_msg("Finishing $clean orders"); + +if (strlen($empty) > 2){ + //echo "Empties: ".$empty."\n"; + $delQ = "DELETE FROM PendingSpecialOrder WHERE order_id IN $empty AND trans_id=0"; + $delR = $sql->query($delQ); +} + +/* blueLine flagging disabled +$q = "SELECT card_no,count(*) FROM PendingSpecialOrder as p LEFT JOIN + SpecialOrderStatus AS s ON p.order_id=s.order_id + WHERE s.status_flag=5 AND trans_id > 0 + GROUP BY card_no"; +$r = $sql->query($q); +while($w = $sql->fetch_row($r)){ + $upQ = "UPDATE {$FANNIE_OP_DB}.custdata SET blueLine=CONCAT(blueLine, ' SO({$w[1]})') + WHERE CardNo={$w[0]}"; + $upR = $sql->query($upQ); +} +*/ + +?> diff --git a/fannie/cron/nightly.storepull.php b/fannie/cron/nightly.storepull.php new file mode 100644 index 000000000..51943255d --- /dev/null +++ b/fannie/cron/nightly.storepull.php @@ -0,0 +1,58 @@ + diff --git a/fannie/cron/nightly.table.snapshot.php b/fannie/cron/nightly.table.snapshot.php new file mode 100644 index 000000000..1b59b70e7 --- /dev/null +++ b/fannie/cron/nightly.table.snapshot.php @@ -0,0 +1,62 @@ +query("DROP TABLE productBackup"); +if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $sql->query("SELECT * INTO productBackup FROM products"); +} +else { + $sql->query("CREATE TABLE productBackup LIKE products"); + $sql->query("INSERT INTO productBackup SELECT * FROM products"); +} + +$sql->query("DROP TABLE custdataBackup"); +if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $sql->query("SELECT * INTO custdataBackup FROM custdata"); +} +else { + $sql->query("CREATE TABLE custdataBackup LIKE custdata"); + $sql->query("INSERT INTO custdataBackup SELECT * FROM custdata"); +} + +?> diff --git a/fannie/cron/nightly.tablecache.php b/fannie/cron/nightly.tablecache.php new file mode 100644 index 000000000..1997791e5 --- /dev/null +++ b/fannie/cron/nightly.tablecache.php @@ -0,0 +1,70 @@ +query("TRUNCATE TABLE batchMergeTable"); +if ($chk === False) + echo cron_msg("Could not truncate batchMergeTable"); +$chk = $sql->query("INSERT INTO batchMergeTable SELECT * FROM batchMergeProd"); +if ($chk === False) + echo cron_msg("Could not load data from batchMergeProd"); +$chk = $sql->query("INSERT INTO batchMergeTable SELECT * FROM batchMergeLC"); +if ($chk === False) + echo cron_msg("Could not load data from batchMergeLC"); + +$sql->query("use $FANNIE_TRANS_DB"); +$chk = $sql->query("TRUNCATE TABLE CashPerformDay_cache"); +if ($chk === False) + echo cron_msg("Could not truncate CashPerformDay_cache"); +$chk = $sql->query("INSERT INTO CashPerformDay_cache SELECT * FROM CashPerformDay"); +if ($chk === False) + echo cron_msg("Could not load data for CashPerformDay_cache"); + +$sql->query("USE ".$FANNIE_ARCHIVE_DB); +if ($sql->table_exists("reportDataCache")){ + $sql->query("DELETE FROM reportDataCache WHERE expires < ".$sql->now()); +} + +echo cron_msg("Success"); +?> diff --git a/fannie/cron/nightly.virtualcoupon.php b/fannie/cron/nightly.virtualcoupon.php new file mode 100644 index 000000000..bd3c78edf --- /dev/null +++ b/fannie/cron/nightly.virtualcoupon.php @@ -0,0 +1,103 @@ +table_exists("TempVirtCoupon")){ + $sql->query("CREATE TABLE TempVirtCoupon (card_no int, coupID int, quantity double,PRIMARY KEY(card_no,coupID))"); +} +else + $sql->query("TRUNCATE TABLE TempVirtCoupon"); + +// select number of coupons used by each member in +// the applicable period +$insQ = "INSERT INTO TempVirtCoupon + select d.card_no, h.coupID, sum(quantity) as quantity + from {$TRANS}dlog_90_view as d + INNER JOIN houseVirtualCoupons as h + ON d.upc=".$sql->concat("'00499999'",'RIGHT('.$sql->concat("'00000'",$sql->convert('h.coupID','CHAR'),'').',5)','')." + AND d.card_no=h.card_no + where d.tdate >= h.start_date and d.tdate <= h.end_date"; +$insR = $sql->query($insQ); + +// remove expired or already-used coupons +$sqlQ = "DELETE h FROM houseVirtualCoupons AS h + LEFT JOIN TempVirtCoupon AS t ON + h.card_no=t.card_no AND h.coupID=t.coupID + WHERE ".$sql->now()." > h.end_date + OR (t.card_no IS NOT NULL AND t.coupID IS NOT NULL)"; +if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $sqlQ = "DELETE FROM houseVirtualCoupons + FROM houseVirtualCoupons AS h + LEFT JOIN TempVirtCoupon AS t ON + h.card_no=t.card_no AND h.coupID=t.coupID + WHERE ".$sql->now()." > h.end_date + OR (t.card_no IS NOT NULL AND t.coupID IS NOT NULL)"; +} + +// set custdata.memcoupons equal to the number +// of available coupons (in theory) +$upQ = "UPDATE custdata AS c LEFT JOIN + houseVirtualCoupons AS h ON c.CardNo=h.card_no + c.memCoupons=SUM(CASE WHEN c.personNum=1 THEN 1 ELSE 0) + WHERE ".$sql->now()." >= h.start_date + AND ".$sql->now()."<= h.end_date + GROUP BY c.CardNo"; +if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $upQ = "UPDATE custdata SET + c.memCoupons=SUM(CASE WHEN c.personNum=1 THEN 1 ELSE 0) + FROM custdata AS c LEFT JOIN + houseVirtualCoupons AS h ON c.CardNo=h.card_no + WHERE ".$sql->now()." >= h.start_date + AND ".$sql->now()."<= h.end_date + GROUP BY c.CardNo"; +} +$sql->query($upQ); + +// update blueline to match memcoupons +$blueLineQ = "UPDATE custdata SET memCoupons=" + .$sql->concat($sql->convert('CardNo','CHAR'),"' '",'LastName',"' Coup('", + $sql->convert('memCoupons','CHAR'),"')'",''); +$sql->query($blueLineQ); + +$sql->query("DROP TABLE TempVirtCoupon"); + +?> diff --git a/fannie/cron/nightly.voidhistory.php b/fannie/cron/nightly.voidhistory.php new file mode 100644 index 000000000..8446d3ce1 --- /dev/null +++ b/fannie/cron/nightly.voidhistory.php @@ -0,0 +1,62 @@ +concat( + $sql->convert('emp_no','char'),"'-'", + $sql->convert('register_no','char'),"'-'", + $sql->convert('trans_no','char'),'') + .", + 0 + FROM transarchive WHERE trans_subtype='CM' + AND ".$sql->datediff('datetime',$sql->now())." = -1 + AND description LIKE 'VOIDING TRANSACTION %-%-%' + AND register_no <> 99 AND emp_no <> 9999 AND trans_status <> 'X'"; +$success = $sql->query($query); + +if ($success) + echo cron_msg("Voids logged"); +else + echo cron_msg("Error logging voids"); diff --git a/fannie/cron/notices.sales.php b/fannie/cron/notices.sales.php new file mode 100644 index 000000000..2a6b6138c --- /dev/null +++ b/fannie/cron/notices.sales.php @@ -0,0 +1,66 @@ +datediff($dbc->now(),"start_date") + ." = 0"; +$r = $dbc->query($q); + +if ($dbc->num_rows($r) == 0) + exit; // no new sales + +$SUBJECT = "New Sale Today"; +$msg = "New sale today!\n"; +while($w = $dbc->fetch_row($r)){ + $msg .= $w['sale_name']."\n"; + $msg .= "Starts: ".$w['start_date']."\n"; + $msg .= "Ends: ".$w['end_date']."\n"; + $msg .= "\n"; +} +mail($TO,$SUBJECT,$msg,$FROM."\r\n"); + +?> diff --git a/fannie/cron/weekly.spins.php b/fannie/cron/weekly.spins.php new file mode 100644 index 000000000..2ea88249a --- /dev/null +++ b/fannie/cron/weekly.spins.php @@ -0,0 +1,134 @@ + d.ItemQtty AND d.ItemQtty <> 0 THEN d.quantity*d.ItemQtty ELSE d.quantity END) as quantity, + sum(d.total) as dollars, + '$lastDay' as lastDay + FROM dlog_90_view as d inner join + {$FANNIE_OP_DB}.dbo.products as p + on d.upc=p.upc + WHERE p.scale = 0 + AND d.upc > '0000000999999' + AND datepart(ww,tdate) = $week + group by d.upc, p.description"; +// mysql handles week # differently by default +if (strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $dataQ = "SELECT d.upc as upc, p.description as description, + sum(CASE WHEN d.quantity <> d.ItemQtty AND d.ItemQtty <> 0 THEN d.quantity*d.ItemQtty ELSE d.quantity END) as quantity, + sum(d.total) as dollars, + '$lastDay' as lastDay + FROM dlog_90_view as d inner join + {$FANNIE_OP_DB}.products as p + on d.upc=p.upc + WHERE p.scale = 0 + AND d.upc > '0000000999999' + AND week(tdate) = ".($week-1)." + group by d.upc, p.description"; +} + +/* SPINS numbering is non-standard in 2012 + so week is offset by one in the filename + this may change back next year +*/ +$filename = "spins_wfc_wk".str_pad($week+1,2,"0",STR_PAD_LEFT).".csv"; +$outfile = sys_get_temp_dir()."/".$filename; +$fp = fopen($outfile,"w"); + +$dataR = $sql->query($dataQ); +while($row = $sql->fetch_row($dataR)){ + for($i=0;$i<4; $i++){ + fwrite($fp,"\"".$row[$i]."\","); + } + fwrite($fp,"\"".$row[4]."\"\n"); +} +fclose($fp); + +$conn_id = ftp_connect($SPINS_SERVER); +$login_id = ftp_login($conn_id, $SPINS_USER, $SPINS_PW); + +if (!$conn_id or !$login_id){ + echo "FTP connect failed!"; +} + +ftp_chdir($conn_id,"data"); +ftp_pasv($conn_id,True); + +$upload = ftp_put($conn_id, $filename, $outfile, FTP_ASCII); + +if (!$upload){ + echo "FTP upload failed"; +} + +echo date('r').': Uploaded file to SPINS'; +unlink($outfile); + +ftp_close($conn_id); + +?> diff --git a/fannie/favicon.ico b/fannie/favicon.ico new file mode 100644 index 000000000..2be8a32b5 Binary files /dev/null and b/fannie/favicon.ico differ diff --git a/fannie/index.php b/fannie/index.php new file mode 100644 index 000000000..11c376d3b --- /dev/null +++ b/fannie/index.php @@ -0,0 +1,7 @@ + diff --git a/fannie/install.php b/fannie/install.php new file mode 100644 index 000000000..a08d25320 --- /dev/null +++ b/fannie/install.php @@ -0,0 +1,3 @@ + diff --git a/fannie/install/InstallAuthenticationPage.php b/fannie/install/InstallAuthenticationPage.php new file mode 100644 index 000000000..0bf67bee7 --- /dev/null +++ b/fannie/install/InstallAuthenticationPage.php @@ -0,0 +1,348 @@ +title = "Fannie: Membership Settings"; + //$this->header = "Fannie: Membership Settings"; + + // Link to a file of CSS by using a function. + $this->add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + + } + */ + + function body_content(){ + include('../config.php'); + + ob_start(); + + echo showInstallTabs('Authentication'); +?> + +
        +

        header; ?>

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +

        +Authentication enabled +"; +echo "

        "; + +// Default to Authenticate ("Authenticate Everything") or not. +if ($FANNIE_AUTH_ENABLED){ + echo "

        "; + echo "Authenticate by default "; + echo "
        "; + echo "If 'Yes' all Admin utilities will require Login
        "; + echo "If 'No' only those utilities coded for it will require Login"; + echo "

        "; +} + +if ($FANNIE_AUTH_ENABLED){ + if (!function_exists("login")) + include($FANNIE_ROOT.'auth/login.php'); + // create user authentication support tables if they don't exist. + table_check(); + + // if no users exist, offer to create one + if (getNumUsers() == 0){ + $success = False; + if (isset($_REQUEST['newuser']) && isset($_REQUEST['newpass'])){ + $FANNIE_AUTH_ENABLED = False; // toggle to bypass user checking + $newUser=$_REQUEST['newuser']; + $success = createLogin($_REQUEST['newuser'],$_REQUEST['newpass']); + if ($success){ + echo "User ".$_REQUEST['newuser']." created
        "; + $FANNIE_AUTH_ENABLED = True; // toggle enforce error checking + $success = addAuth($_REQUEST['newuser'],'admin'); + if ($success) { + echo "User ".$_REQUEST['newuser']." is an admin
        "; + echo "You can use these credentials at the Authentication Interface
        "; + echo " Other protected pages may require different credentials.
        "; + $success = addAuth($_REQUEST['newuser'],'sysadmin'); + if ($success) { + echo "User ".$_REQUEST['newuser']." is a sysadmin
        "; + echo "You can use these credentials at the Installation and Configuration Interface (these pages)
        "; + + // populate known privileges table automatically + $db = FannieDB::get($FANNIE_OP_DB); + ob_start(); // don't care about primary key errors + loaddata($db, 'userKnownPrivs'); + ob_end_clean(); + // loaddata() has no return value; success assumed. + echo "Table {$FANNIE_OP_DB}.userKnownPrivs has been populated with the standard privilege set.
        "; + + } else { + echo "Error making user $newUser a sysadmin
        "; + } + + } else { + echo "Error making user $newUser an admin
        "; + } + } + else + echo "Error creating initial user
        "; + $FANNIE_AUTH_ENABLED = True; // toggle enforce error checking + } + if (!$success){ + echo "
        No users defined. To create an initial admin user, + enter a username and password below
        "; + echo 'Username:
        '; + echo 'Password:
        '; + } + } + else { + echo "

        You can manage Login users and groups via the Authentication Interface"; + echo "

        "; + } + echo "

        How Authentication Works"; + echo "

        "; +} +?> +
        +Allow shadow logins +
        "; +if (!file_exists("../auth/shadowread/shadowread")){ + echo "Error: shadowread utility does not exist"; + echo "
        "; + echo "shadowread lets Fannie authenticate users agaist /etc/shadow. To create it:"; + echo "
        +cd ".realpath('../auth/shadowread')."
        +make
        +	
        "; + echo "
        "; +} +else { + $perms = fileperms("../auth/shadowread/shadowread"); + if ($perms == 0104755) + echo "shadowread utility has proper permissions"; + else{ + echo "Warning: shadowread utility has incorrect permissions"; + echo "
        "; + echo "shadowread needs setuid permission. To fix it: "; + echo "
        +cd ".realpath('../auth/shadowread')."
        +sudo make install
        +		
        "; + echo "
        "; + } +} +?> +
        +Allow LDAP logins +
        +Warning: PHP install does not have LDAP support enabled"; +else + echo "PHP has LDAP support enabled"; +?> +
        +LDAP Server Host +"; +?> +
        +LDAP Port +"; +?> +
        +LDAP Domain (DN) +"; +?> +
        +LDAP Username Field +"; +?> +
        +LDAP User ID# Field +"; +?> +
        +LDAP Real Name Field +"; +?> +
        + +
        + +draw_page(); +} +?> diff --git a/fannie/install/InstallIndexPage.php b/fannie/install/InstallIndexPage.php new file mode 100644 index 000000000..de1283607 --- /dev/null +++ b/fannie/install/InstallIndexPage.php @@ -0,0 +1,1652 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js=""; + return $js; + } + */ + + function body_content(){ + + include('../config.php'); + ob_start(); + + echo showInstallTabs('Necessities'); + $self = basename($_SERVER['PHP_SELF']); + + echo "
        "; + echo "

        {$this->header}

        "; + + // Path detection: Establish ../../ + $FILEPATH = rtrim(__FILE__,"$self"); + $URL = rtrim($_SERVER['SCRIPT_NAME'],"$self"); + $FILEPATH = rtrim($FILEPATH,'/'); + $URL = rtrim($URL,'/'); + $FILEPATH = rtrim($FILEPATH,'install'); + $URL = rtrim($URL,'install'); + $FANNIE_ROOT = $FILEPATH; + $FANNIE_URL = $URL; + + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + echo "PHP is running as: ".$chk['name']."
        "; + } + else + echo "PHP is (probably) running as: ".get_current_user()."
        "; + + if (is_writable($FILEPATH.'config.php')){ + confset('FANNIE_ROOT',"'$FILEPATH'"); + confset('FANNIE_URL',"'$URL'"); + echo "config.php is writeable"; + echo "
        "; + } + else { + echo "Error: config.php is not writeable"; + echo "
        "; + echo "config.php ({$FILEPATH}config.php) is Fannie's main configuration file."; + echo "
          "; + echo "
        • If this file exists, ensure it is writable by the user running PHP (see above)"; + echo "
        • If the file does not exist, copy config.dist.php ({$FILEPATH}config.dist.php) to config.php"; + echo "
        • If neither file exists, create a new config.php ({$FILEPATH}config.php) containing:"; + echo "
        "; + echo "
        +<?php
        +?>
        +
        "; + echo "
        "; + echo ''; + echo "
        "; + return ob_get_clean(); + } + + /** + Detect databases that are supported + */ + $supportedTypes = array(); + if (extension_loaded('pdo') && extension_loaded('pdo_mysql')) + $supportedTypes['PDO_MYSQL'] = 'PDO MySQL'; + if (extension_loaded('mysqli')) + $supportedTypes['MYSQLI'] = 'MySQLi'; + if (extension_loaded('mysql')) + $supportedTypes['MYSQL'] = 'MySQL'; + if (extension_loaded('mssql')) + $supportedTypes['MSSQL'] = 'MSSQL'; + + if (count($supportedTypes) == 0){ + echo "Error: no database driver available"; + echo "
        "; + echo 'Install at least one of the following PHP extensions: pdo_mysql, mysqli, mysql, + or mssql. If you installed one or more of these and are still seeing this + error, make sure they are enabled in your PHP configuration and try + restarting your web server.'; + echo "
        "; + exit; + } + $defaultDbType = array_shift(array_keys($supportedTypes)); + + ?> +

        Main Server

        + Server Database Host + "; + ?> +
        Server Database Type + +
        Server Database Username + "; + ?> +
        Server Database Password + "; + ?> +
        Server Operational DB name + "; + ?> +
        Server Transaction DB name + "; + ?> +
        Testing Operational DB connection: + Failed"; + else { + echo "Succeeded"; + $msgs = $this->create_op_dbs($sql); + $createdOps = True; + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + + // create auth tables later than the original + // setting in case db settings were wrong + if (isset($FANNIE_AUTH_ENABLED) && $FANNIE_AUTH_ENABLED === True){ + if (!function_exists('table_check')) + include($FILEPATH.'auth/utilities.php'); + table_check(); + } + } + ?> +
        Testing Transaction DB connection: + Failed"; + else { + echo "Succeeded"; + $msgs = $this->create_trans_dbs($sql); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + $msgs = $this->create_dlogs($sql); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + $createdTrans = True; + } + if ($createdOps && $createdTrans){ + $msgs = $this->create_delayed_dbs(); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + } + ?> +
        +

        Transaction archiving

        + Archive DB name: + "; + ?> +
        Archive Method: +
        "; + ?> +
        Use a different DB server for archives +
        "; + if ($FANNIE_ARCHIVE_REMOTE === True || $FANNIE_ARCHIVE_REMOTE == 'Yes'){ + if ($FANNIE_ARCHIVE_DB == $FANNIE_TRANS_DB){ + echo "
        Warning: using the same name for the archive database + and the main transaction database will probably cause problems
        "; + } + ?> +
        Archive DB Server + "; + ?> +
        Archive DB type + +
        Archive DB username + "; + ?> +
        Archive DB password + "; + } + else { + //local archiving - set up now + echo "
        Testing Transaction DB connection:"; + $sql = db_test_connect($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_ARCHIVE_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + if ($sql === False) + echo "Failed"; + else { + echo "Succeeded"; + $msgs = $this->create_archive_dbs($sql); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + } + } + ?> +
        +

        Database Backups

        + Backup Directory +
        "; + if (is_writable($FANNIE_BACKUP_PATH)){ + echo "Backup directory is writeable"; + } + else { + echo "Error: backup directory is not writeable"; + } + ?> +
        + Path to mysqldump +
        "; + if (is_executable(realpath($FANNIE_BACKUP_BIN."/mysqldump"))){ + echo "Found mysqldump program"; + } + else { + echo "Error: mysqldump not found"; + } + ?> +
        + Number of backups +
        "; + ?> +
        + Compress backups + +
        +

        Lanes

        + Number of lanes + "; + ?> +
        + + + "; + for($i=0; $i<$FANNIE_NUM_LANES;$i++){ + echo ""; + } + echo "
        "; + + $conf = 'array('; + for($i=0; $i<$FANNIE_NUM_LANES; $i++){ + $style = ($i == 0)?'block':'none'; + echo "
        "; + if (!isset($FANNIE_LANES[$i])) $FANNIE_LANES[$i] = array(); + $conf .= 'array('; + + if (!isset($FANNIE_LANES[$i]['host'])) $FANNIE_LANES[$i]['host'] = '127.0.0.1'; + if (isset($_REQUEST["LANE_HOST_$i"])){ $FANNIE_LANES[$i]['host'] = $_REQUEST["LANE_HOST_$i"]; } + $conf .= "'host'=>'{$FANNIE_LANES[$i]['host']}',"; + echo "Lane ".($i+1)." Database Host:
        "; + + if (!isset($FANNIE_LANES[$i]['type'])) $FANNIE_LANES[$i]['type'] = $defaultDbType; + if (isset($_REQUEST["LANE_TYPE_$i"])) $FANNIE_LANES[$i]['type'] = $_REQUEST["LANE_TYPE_$i"]; + $conf .= "'type'=>'{$FANNIE_LANES[$i]['type']}',"; + echo "Lane ".($i+1)." Database Type:
        "; + + if (!isset($FANNIE_LANES[$i]['user'])) $FANNIE_LANES[$i]['user'] = 'root'; + if (isset($_REQUEST["LANE_USER_$i"])) $FANNIE_LANES[$i]['user'] = $_REQUEST["LANE_USER_$i"]; + $conf .= "'user'=>'{$FANNIE_LANES[$i]['user']}',"; + echo "Lane ".($i+1)." Database Username:
        "; + + if (!isset($FANNIE_LANES[$i]['pw'])) $FANNIE_LANES[$i]['pw'] = ''; + if (isset($_REQUEST["LANE_PW_$i"])) $FANNIE_LANES[$i]['pw'] = $_REQUEST["LANE_PW_$i"]; + $conf .= "'pw'=>'{$FANNIE_LANES[$i]['pw']}',"; + echo "Lane ".($i+1)." Database Password:
        "; + + if (!isset($FANNIE_LANES[$i]['op'])) $FANNIE_LANES[$i]['op'] = 'opdata'; + if (isset($_REQUEST["LANE_OP_$i"])) $FANNIE_LANES[$i]['op'] = $_REQUEST["LANE_OP_$i"]; + $conf .= "'op'=>'{$FANNIE_LANES[$i]['op']}',"; + echo "Lane ".($i+1)." Operational DB:
        "; + + if (!isset($FANNIE_LANES[$i]['trans'])) $FANNIE_LANES[$i]['trans'] = 'translog'; + if (isset($_REQUEST["LANE_TRANS_$i"])) $FANNIE_LANES[$i]['trans'] = $_REQUEST["LANE_TRANS_$i"]; + $conf .= "'trans'=>'{$FANNIE_LANES[$i]['trans']}'"; + echo "Lane ".($i+1)." Transaction DB:
        "; + + $conf .= ")"; + echo "
        "; + + if ($i == $FANNIE_NUM_LANES - 1) + $conf .= ")"; + else + $conf .= ","; + } + confset('FANNIE_LANES',$conf); + + } + ?> + Edit Global Lane Configuration Page +
        +

        Logs

        + Fannie writes to the following log files: +
          +
        • +
          • Contains failed database queries
          +
        • +
          • Contains output from scheduled tasks
          +
        + Color-Highlighted Logs + '; + if ($FANNIE_PRETTY_LOGS == 0){ + echo ''; + echo ''; + } + else { + echo ''; + echo ''; + } + echo ''; + ?> +
        + Log Rotation Count + "; + echo "
        "; + ?> +
        +

        Scales

        + Number of scales + "; + echo "
        "; + if (is_writable($FANNIE_ROOT.'item/hobartcsv/csvfiles')) + echo "item/hobartcsv/csvfiles is writeable"; + else + echo "item/hobartcsv/csvfiles is not writeable"; + echo "
        "; + if (is_writable($FANNIE_ROOT.'item/hobartcsv/csv_output')) + echo "item/hobartcsv/csv_output is writeable"; + else + echo "item/hobartcsv/csv_output is not writeable"; + ?> +
        + + + "; + for($i=0; $i<$FANNIE_NUM_SCALES;$i++) + echo ""; + echo "
        "; + + $conf = 'array('; + for($i=0; $i<$FANNIE_NUM_SCALES; $i++){ + $style = ($i == 0)?'block':'none'; + echo "
        "; + if (!isset($FANNIE_SCALES[$i])) $FANNIE_SCALES[$i] = array(); + $conf .= 'array('; + + if (!isset($FANNIE_SCALES[$i]['host'])) $FANNIE_SCALES[$i]['host'] = ''; + if (isset($_REQUEST["SCALE_HOST_$i"])){ $FANNIE_SCALES[$i]['host'] = $_REQUEST["SCALE_HOST_$i"]; } + $conf .= "'host'=>'{$FANNIE_SCALES[$i]['host']}',"; + echo "Scale ".($i+1)." IP:
        "; + + if (!isset($FANNIE_SCALES[$i]['type'])) $FANNIE_SCALES[$i]['type'] = 'QUANTUMTCP'; + if (isset($_REQUEST["SCALE_TYPE_$i"])){ $FANNIE_SCALES[$i]['type'] = $_REQUEST["SCALE_TYPE_$i"]; } + $conf .= "'type'=>'{$FANNIE_SCALES[$i]['type']}',"; + echo "Scale ".($i+1)." Type:
        "; + + if (!isset($FANNIE_SCALES[$i]['dept'])) $FANNIE_SCALES[$i]['dept'] = ''; + if (isset($_REQUEST["SCALE_DEPT_$i"])){ $FANNIE_SCALES[$i]['dept'] = $_REQUEST["SCALE_DEPT_$i"]; } + $conf .= "'dept'=>'{$FANNIE_SCALES[$i]['dept']}'"; + echo "Scale ".($i+1)." Department:
        "; + + $conf .= ")"; + echo "
        "; + + if ($i == $FANNIE_NUM_SCALES - 1) + $conf .= ")"; + else + $conf .= ","; + } + confset('FANNIE_SCALES',$conf); + } + ?> + +
        +

        Co-op

        + Use this to identify code that is specific to your co-op. +
        Particularly important if you plan to contribute to the CORE IT code base. +
        Try to use a code that will not be confused with any other, e.g. "WEFC_Toronto" instead of "WEFC". +
        Co-op ID: + ",$FANNIE_COOP_ID); + ?> + +
        +

        Locale

        + Set the Country and Language where Fannie will run. +
        If these are not set in Fannie configuration but are set in the Linux environment the environment values will be used as + defaults that can be overridden by settings here. + +
        Country + + + +
        Language + +
        + +
        + + + + + table_exists('InvDelivery',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invCur,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invCur = "CREATE TABLE InvDeliveryLM ( + inv_date datetime, + upc varchar(13), + vendor_id int, + quantity double, + price float)"; + if (!$con->table_exists('InvDeliveryLM',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invCur,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invArc = "CREATE TABLE InvDeliveryArchive ( + inv_date datetime, + upc varchar(13), + vendor_id int, + quantity double, + price float, + INDEX(upc))"; + if (!$con->table_exists('InvDeliveryArchive',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invArc,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invRecent = "CREATE VIEW InvRecentOrders AS + SELECT inv_date,upc,sum(quantity) as quantity, + sum(price) as price + FROM InvDelivery GROUP BY inv_date,upc + UNION ALL + SELECT inv_date,upc,sum(quantity) as quantity, + sum(price) as price + FROM InvDeliveryLM GROUP BY inv_date,upc"; + if (!$con->table_exists('InvRecentOrders',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invRecent,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $union = "CREATE VIEW InvDeliveryUnion AS + select upc,vendor_id,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDelivery + GROUP BY upc,vendor_id + UNION ALL + select upc,vendor_id,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDeliveryLM + GROUP BY upc,vendor_id + UNION ALL + select upc,vendor_id,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDeliveryArchive + GROUP BY upc,vendor_id"; + if (!$con->table_exists("InvDeliveryUnion",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($union,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $total = "CREATE VIEW InvDeliveryTotals AS + select upc,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDeliveryUnion + GROUP BY upc"; + if (!$con->table_exists("InvDeliveryTotals",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($total,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_backup','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'AR_EOM_Summary','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'lane_config','trans'); + + return $ret; + + // create_trans_dbs() + } + + function create_dlogs($con){ + global $FANNIE_TRANS_DB, $FANNIE_SERVER_DBMS, $FANNIE_AR_DEPARTMENTS, $FANNIE_EQUITY_DEPARTMENTS, $FANNIE_OP_DB; + + $ret = array(); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dtransactions','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'transarchive','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'suspended','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderID','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderDeptMap','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderContact','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderNotes','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderHistory','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderStatus','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'PendingSpecialOrder','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'CompleteSpecialOrder','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dlog','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dlog_90_view','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dlog_15','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'suspendedtoday','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'TenderTapeGeneric','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'rp_dt_receipt_90','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'rp_receipt_header_90','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_live_balance','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_sum','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockpurchases','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSum_purch','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSumToday','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'newBalanceStockToday_test','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'memChargeBalance','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'unpaid_ar_balances','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'unpaid_ar_today','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dheader','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dddItems','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'CashPerformDay','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'CashPerformDay_cache','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'houseCouponThisMonth','trans'); + + return $ret; + + // create_dlogs() + } + + function create_delayed_dbs(){ + global $FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW,$FANNIE_OP_DB,$FANNIE_TRANS_DB; + + $ret = array(); + + $con = db_test_connect($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_OP_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + 'expingMems','op'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + 'expingMems_thisMonth','op'); + + $con = db_test_connect($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_TRANS_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today_sum','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'AR_statementHistory','trans'); + + $invSalesView = "CREATE VIEW InvSales AS + select datetime as inv_date,upc,quantity,total as price + FROM transarchive WHERE ".$con->monthdiff($con->now(),'datetime')." <= 1 + AND scale=0 AND trans_status NOT IN ('X','R') + AND trans_type = 'I' AND trans_subtype <> '0' + AND register_no <> 99 AND emp_no <> 9999"; + if (!$con->table_exists("InvSales",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invSalesView,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invRecentSales = "CREATE VIEW InvRecentSales AS + select t.upc, + max(t.inv_date) as mostRecentOrder, + sum(CASE WHEN s.quantity IS NULL THEN 0 ELSE s.quantity END) as quantity, + sum(CASE WHEN s.price IS NULL THEN 0 ELSE s.price END) as price + from InvDeliveryTotals as t + left join InvSales as s + on t.upc=s.upc and + ".$con->datediff('s.inv_date','t.inv_date')." >= 0 + group by t.upc"; + if (!$con->table_exists("InvRecentSales",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invRecentSales,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invSales = "CREATE TABLE InvSalesArchive ( + inv_date datetime, + upc varchar(13), + quantity double, + price float, + INDEX(upc))"; + if (!$con->table_exists('InvSalesArchive',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invSales,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $union = "CREATE VIEW InvSalesUnion AS + select upc,sum(quantity) as quantity, + sum(price) as price + FROM InvSales + WHERE ".$con->monthdiff($con->now(),'inv_date')." = 0 + GROUP BY upc + UNION ALL + select upc,sum(quantity) as quantity, + sum(price) as price + FROM InvSalesArchive + GROUP BY upc"; + if (!$con->table_exists("InvSalesUnion",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($union,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $total = "CREATE VIEW InvSalesTotals AS + select upc,sum(quantity) as quantity, + sum(price) as price + FROM InvSalesUnion + GROUP BY upc"; + if (!$con->table_exists("InvSalesTotals",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($total,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $adj = "CREATE TABLE InvAdjustments ( + inv_date datetime, + upc varchar(13), + diff double, + INDEX(upc))"; + if (!$con->table_exists("InvAdjustments",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($adj,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $adjTotal = "CREATE VIEW InvAdjustTotals AS + SELECT upc,sum(diff) as diff,max(inv_date) as inv_date + FROM InvAdjustments + GROUP BY upc"; + if (!$con->table_exists("InvAdjustTotals",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($adjTotal,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $opstr = $FANNIE_OP_DB; + if ($FANNIE_SERVER_DBMS=="mssql") $opstr .= ".dbo"; + $inv = "CREATE VIEW Inventory AS + SELECT d.upc, + d.quantity AS OrderedQty, + CASE WHEN s.quantity IS NULL THEN 0 + ELSE s.quantity END AS SoldQty, + CASE WHEN a.diff IS NULL THEN 0 + ELSE a.diff END AS Adjustments, + CASE WHEN a.inv_date IS NULL THEN '1900-01-01' + ELSE a.inv_date END AS LastAdjustDate, + d.quantity - CASE WHEN s.quantity IS NULL + THEN 0 ELSE s.quantity END + CASE WHEN + a.diff IS NULL THEN 0 ELSE a.diff END + AS CurrentStock + FROM InvDeliveryTotals AS d + INNER JOIN $opstr.vendorItems AS v + ON d.upc = v.upc + LEFT JOIN InvSalesTotals AS s + ON d.upc = s.upc LEFT JOIN + InvAdjustTotals AS a ON d.upc=a.upc"; + if (!$con->table_exists("Inventory",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($inv,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $cache = "CREATE TABLE InvCache ( + upc varchar(13), + OrderedQty int, + SoldQty int, + Adjustments int, + LastAdjustDate datetime, + CurrentStock int)"; + if (!$con->table_exists("InvCache",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($cache,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + return $ret; + + // create_delayed_dbs() + } + + function create_archive_dbs($con) { + global $FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB,$FANNIE_ARCHIVE_DB,$FANNIE_ARCHIVE_METHOD; + + $ret = array(); + + $dstr = date("Ym"); + $archive = "transArchive".$dstr; + $dbconn = "."; + if ($FANNIE_SERVER_DBMS == "MSSQL") + $dbconn = ".dbo."; + + if ($FANNIE_ARCHIVE_METHOD == "partitions") + $archive = "bigArchive"; + + $query = "CREATE TABLE $archive LIKE + {$FANNIE_TRANS_DB}{$dbconn}dtransactions"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $query = "SELECT TOP 1 * INTO $archive FROM + {$FANNIE_TRANS_DB}{$dbconn}dtransactions"; + } + if (!$con->table_exists($archive,$FANNIE_ARCHIVE_DB)){ + $create = $con->prepare_statement($query,$FANNIE_ARCHIVE_DB); + $con->exec_statement($create,array(),$FANNIE_ARCHIVE_DB); + // create the first partition if needed + if ($FANNIE_ARCHIVE_METHOD == "partitions"){ + $p = "p".date("Ym"); + $limit = date("Y-m-d",mktime(0,0,0,date("n")+1,1,date("Y"))); + $partQ = sprintf("ALTER TABLE `bigArchive` + PARTITION BY RANGE(TO_DAYS(`datetime`)) + (PARTITION %s + VALUES LESS THAN (TO_DAYS('%s')) + )",$p,$limit); + $prep = $dbc->prepare_statement($partQ); + $con->exec_statement($prep); + } + } + + $dlogView = "select + `$archive`.`datetime` AS `tdate`, + `$archive`.`register_no` AS `register_no`, + `$archive`.`emp_no` AS `emp_no`, + `$archive`.`trans_no` AS `trans_no`, + `$archive`.`upc` AS `upc`, + `$archive`.`trans_type` AS `trans_type`, + `$archive`.`trans_subtype` AS `trans_subtype`, + `$archive`.`trans_status` AS `trans_status`, + `$archive`.`department` AS `department`, + `$archive`.`quantity` AS `quantity`, + `$archive`.`unitPrice` AS `unitPrice`, + `$archive`.`total` AS `total`, + `$archive`.`tax` AS `tax`, + `$archive`.`foodstamp` AS `foodstamp`, + `$archive`.`ItemQtty` AS `itemQtty`, + `$archive`.`card_no` AS `card_no`, + `$archive`.`trans_id` AS `trans_id` + from `$archive` + where + ((`$archive`.`trans_status` <> 'D') + and + (`$archive`.`trans_status` <> 'X'))"; + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $dlogView = "SELECT + datetime AS tdate, + register_no, + emp_no, + trans_no, + upc, + trans_type, + trans_subtype, + trans_status, + department, + quantity, + unitPrice, + total, + tax, + foodstamp, + ItemQtty, + card_no, + trans_id + FROM $archive + WHERE trans_status NOT IN ('D','X')"; + } + + $dlog_view = ($FANNIE_ARCHIVE_METHOD != "partitions") ? "dlog".$dstr : "dlogBig"; + if (!$con->table_exists($dlog_view,$FANNIE_ARCHIVE_DB)){ + $prep = $con->prepare_statement("CREATE VIEW $dlog_view AS $dlogView", + $FANNIE_ARCHIVE_DB); + $con->exec_statement($prep,array(),$FANNIE_ARCHIVE_DB); + } + + $rp_dt_view = ($FANNIE_ARCHIVE_METHOD != "partitions") ? "rp_dt_receipt_".$dstr : "rp_dt_receipt_big"; + $rp1Q = "CREATE view $rp_dt_view as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char), ' @ ', convert(Volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char), ' /', convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num + + from $archive + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $rp1Q = "CREATE view $rp_dt_view as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num + + from $archive + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + } + if (!$con->table_exists($rp_dt_view,$FANNIE_ARCHIVE_DB)){ + $prep = $con->prepare_statement($rp1Q,$FANNIE_ARCHIVE_DB); + $con->exec_statement($prep,array(),$FANNIE_ARCHIVE_DB); + } + + $rp_view = ($FANNIE_ARCHIVE_METHOD != "partitions") ? "rp_receipt_header_".$dstr : "rp_receipt_header_big"; + $rp2Q = "create view $rp_view as + select + datetime as dateTimeStamp, + card_no as memberID, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num, + register_no, + emp_no, + trans_no, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discounttype = 2 then memDiscount else 0 end),decimal(10,2)) as memSpecial, + convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, + convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from $archive + group by register_no, emp_no, trans_no, card_no, datetime"; + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $rp2Q = "create view $rp_view as + select + datetime as dateTimeStamp, + card_no as memberID, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num, + register_no, + emp_no, + trans_no, + convert(numeric(10,2), sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2), sum(case when discounttype = 2 then memDiscount else 0 end)) as memSpecial, + convert(numeric(10,2), sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, + convert(numeric(10,2), sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from $archive + group by register_no, emp_no, trans_no, card_no, datetime"; + } + if (!$con->table_exists($rp_view,$FANNIE_ARCHIVE_DB)){ + $prep = $con->prepare_statement($rp2Q,$FANNIE_ARCHIVE_DB); + $con->exec_statement($prep,array(),$FANNIE_ARCHIVE_DB); + } + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumUpcSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumRingSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'vRingSalesToday','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumDeptSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'vDeptSalesToday','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumFlaggedSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumMemSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumMemTypeSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumTendersByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumDiscountsByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'reportDataCache','arch'); + return $ret; + + // create_archive_dbs() + } + +// InstallIndexPage +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new InstallIndexPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/install/InstallMemModDisplayPage.php b/fannie/install/InstallMemModDisplayPage.php new file mode 100644 index 000000000..094c05535 --- /dev/null +++ b/fannie/install/InstallMemModDisplayPage.php @@ -0,0 +1,151 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $FANNIE_MEMBER_MODULES; + ob_start(); + + $parent = 'InstallMembershipPage.php'; + echo showLinkUp('Back to Membership',"$parent",''); + + echo "

        {$this->header}

        "; + + // Re-order the modules and report. + if (isset($_REQUEST['ordering'])){ + $FANNIE_MEMBER_MODULES = array(); + foreach($_REQUEST['ordering'] as $o){ + if (!in_array($o,$FANNIE_MEMBER_MODULES)) + $FANNIE_MEMBER_MODULES[] = $o; + } + $saveStr = 'array('; + foreach($FANNIE_MEMBER_MODULES as $t) + $saveStr .= '"'.$t.'",'; + $saveStr = rtrim($saveStr,',').")"; + echo "
        Order Updated
        "; + confset('FANNIE_MEMBER_MODULES',$saveStr); + } + + $self = basename($_SERVER['PHP_SELF']); + + echo "
        "; + + if (is_writable('../config.php')){ + echo "config.php is writeable"; + } + else { + echo "Error: config.php is not writeable"; + } + echo "
        "; + + $num = count($FANNIE_MEMBER_MODULES); + if ($num == 0){ + echo "Error: no modules enabled
        "; + echo 'Back to Member Settings'; + return ob_get_clean(); + } + echo "

        The enabled modules are listed below in the order in which they will appear in the editor. +
        In each dropdown, choose the module you would like to appear in that position. +

        "; + for ($i=1;$i<=$num;$i++){ + echo "#$i:

        "; + } + ?> + +

        + + draw_page(); +} +?> diff --git a/fannie/install/InstallMembershipPage.php b/fannie/install/InstallMembershipPage.php new file mode 100644 index 000000000..77279e9a3 --- /dev/null +++ b/fannie/install/InstallMembershipPage.php @@ -0,0 +1,246 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $FANNIE_URL, + $FANNIE_EQUITY_DEPARTMENTS, + $FANNIE_AR_DEPARTMENTS, + $FANNIE_NAMES_PER_MEM, + $FANNIE_MEMBER_MODULES, + $FANNIE_MEMBER_UPC_PREFIX, + $FANNIE_SERVER,$FANNIE_SERVER_DBMS, $FANNIE_TRANS_DB,$FANNIE_SERVER_USER, $FANNIE_SERVER_PW; + + ob_start(); + + echo showInstallTabs("Members"); +?> + +
        +

        header; ?>

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        + +

        Names per membership: +"; +?> +

        + +
        +

        Equity/Store Charge

        +

        Equity Department(s): +",$FANNIE_EQUITY_DEPARTMENTS); +?> +

        + +

        Store Charge Department(s): +",$FANNIE_AR_DEPARTMENTS); +?> +

        + +
        +

        Membership Information Modules

        +The Member editing interface displayed after you select a member at: +
        mem/MemberSearchPage.php +
        consists of fields grouped in several sections, called modules, listed below. +
        The enabled (active) ones are selected/highlighted. May initially be none. +
        +
        Available Modules
        + +
        +Click or ctrl-Click or shift-Click to select/deselect modules for enablement. +

        +Adjust Module Display Order + +
        +

        Member Cards

        +Member Card UPC Prefix: +",$FANNIE_MEMBER_UPC_PREFIX); +?> + +
        + +
        +Cannot connect to database to refresh views."; +} +else { + echo "Refreshing database views ... "; + $this->recreate_views($sql); + echo "done."; +} + + return ob_get_clean(); + + // body_content + } + + // rebuild views that depend on ar & equity + // department definitions + function recreate_views($con){ + global $FANNIE_TRANS_DB,$FANNIE_OP_DB,$FANNIE_SERVER_DBMS; + + $con->query("DROP VIEW ar_history_today_sum",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today_sum','trans'); + + $con->query("DROP VIEW ar_live_balance",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_live_balance','trans'); + + $con->query("DROP VIEW stockSumToday",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSumToday','trans'); + + $con->query("DROP VIEW newBalanceStockToday_test",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'newBalanceStockToday_test','trans'); + + $con->query("DROP VIEW dheader",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dheader','trans'); + + $con->query("DROP VIEW ar_history_today",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today','trans'); + } + +// InstallMembershipPage +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new InstallMembershipPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/install/InstallMembershipPage_woodshed.php b/fannie/install/InstallMembershipPage_woodshed.php new file mode 100644 index 000000000..a86200099 --- /dev/null +++ b/fannie/install/InstallMembershipPage_woodshed.php @@ -0,0 +1,253 @@ +title = "Fannie: Membership Settings"; + //$this->header = "Fannie: Membership Settings"; + + // Link to a file of CSS by using a function. + $this->add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + */ + function css_content(){ + $css =""; + + return $css; + + //css_content() + } + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + + } + */ + + function body_content(){ + //Should this really be done with global? + //global $FANNIE_URL, $FANNIE_EQUITY_DEPARTMENTS; + include('../config.php'); + ob_start(); +?> + + +
        + +

        header; ?>

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +Names per membership +"; +?> +
        +

        Equity/Store Charge

        +Equity Department(s): +",$FANNIE_EQUITY_DEPARTMENTS); +?> +
        Store Charge Department(s): +",$FANNIE_AR_DEPARTMENTS); +?> +
        +

        Membership Information Modules

        +The Member editing interface displayed after you select a member at: +
        mem/MemberSearchPage.php +
        consists of fields grouped in several sections, called modules, listed below. +
        The enabled (active) ones are selected/highlighted. +
        +
        Available Modules
        + +
        +Click or ctrl-Click or shift-Click to select/deselect modules for enablement. +

        +Adjust Module Display Order + +
        +

        Member Cards

        +Member Card UPC Prefix: +",$FANNIE_MEMBER_UPC_PREFIX); +?> + +
        + +
        +Cannot connect to database to refresh views."; +} +else { + echo "Refreshing database views ... "; + $this->recreate_views($sql); + echo "done."; +} + + return ob_get_clean(); + + // body_content + } + + // rebuild views that depend on ar & equity + // department definitions + function recreate_views($con){ + global $FANNIE_TRANS_DB,$FANNIE_OP_DB,$FANNIE_SERVER_DBMS; + + $con->query("DROP VIEW ar_history_today_sum",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today_sum','trans'); + + $con->query("DROP VIEW ar_live_balance",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_live_balance','trans'); + + $con->query("DROP VIEW stockSumToday",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSumToday','trans'); + + $con->query("DROP VIEW newBalanceStockToday_test",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'newBalanceStockToday_test','trans'); + + $con->query("DROP VIEW dheader",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dheader','trans'); + + $con->query("DROP VIEW ar_history_today",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today','trans'); + } + +// InstallMembershipPage +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new InstallMembershipPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/install/InstallMenuPage.php b/fannie/install/InstallMenuPage.php new file mode 100644 index 000000000..4b0dd6ce1 --- /dev/null +++ b/fannie/install/InstallMenuPage.php @@ -0,0 +1,265 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + */ + function css_content(){ + $css =""; + + return $css; + + //css_content() + } + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + + } + */ + + function body_content(){ + include('../config.php'); + ob_start(); + ?> + + +
        +

        header; ?>

        + config.php is writeable"; + } + else { + echo "Error: config.php is not writeable"; + echo "
        Full path is: ".'../config.php'."
        "; + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + echo "PHP is running as: ".$chk['name']."
        "; + } + else + echo "PHP is (probably) running as: ".get_current_user()."
        "; + } + ?> +
        +

        + Use this tool to customize Fannie's left hand menu. Usage: +

          +
        • To add a new menu entry, type it in the appropriate 'New' box. +
        • To delete an entry, clear its 'Text' box. Bear in mind sub-entries + will also be deleted. +
        • URLs are relative to Fannie unless they begin with / or + a protocol (http://, https://, etc). +
        + Configurable Menu Enabled + "; + ?> +

        + +

        Fannie Menu Builder

        + fm_read($READ_BACK,'1'); + $FANNIE_MENU = $READ_BACK; + } + if (empty($FANNIE_MENU)){ + include('../src/defaultmenu.php'); + } + + $this->fm_draw($FANNIE_MENU); + $saveStr = $this->fm_to_string($FANNIE_MENU); + confset('FANNIE_MENU',$saveStr); + ?> +
        + +
        + + + + fm_read($new_entry,$parent.'_'.($i+1)); + if ($parent == '1'){ + $arr[] = $new_entry; + } + else { + $arr['submenu'][] = $new_entry; + } + } + return $arr; + } + + /** + Convert menu array to a string that can be + written to config.php. + */ + function fm_to_string($arr){ + $ret = 'array('; + for($i=0;$ifm_to_string($arr[$i]['submenu']); + $ret = rtrim($ret,','); + $ret .= '),'; + } + $ret = rtrim($ret,','); + $ret .= ')'; + return $ret; + } + + /** + Draw menu recursively + */ + function fm_draw($arr,$parent='1'){ + echo '
          '; + $i=1; + foreach($arr as $item){ + printf('
        • Text: ', + $parent,$item['label']); + if ($parent == '1'){ + printf('Sub: ', + $parent,(isset($item['subheading'])?$item['subheading']:'')); + } + printf('URL: ', + $parent,$item['url']); + echo "\n"; + if (!isset($item['submenu']) || !is_array($item['submenu'])){ + $item['submenu'] = array(); + } + if(empty($item['submenu'])){ + printf('Add submenu',$parent,$i); + + } + echo '
        • '; + echo "\n"; + $i++; + } + printf('
        • New: ',$parent); + printf('URL:
        • ',$parent); + echo '
          '; + echo '
        '."\n"; + } + +// InstallMenuPage +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new InstallMenuPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/install/InstallPluginsPage.php b/fannie/install/InstallPluginsPage.php new file mode 100644 index 000000000..ff5c4ccd4 --- /dev/null +++ b/fannie/install/InstallPluginsPage.php @@ -0,0 +1,248 @@ +add_css_file("$SRC/style.css"); + $this->add_css_file("$SRC/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("$SRC/css/install.css"); + $this->add_css_file("$SRC/css/toggle-switch.css"); + + // Link to a file of JS by using a function. + $this->add_script("$SRC/jquery/js/jquery.js"); + $this->add_script("$SRC/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return a CSS string + */ + function css_content(){ + // These reduce the size of the slider to keep it from overlapping the text. + $css =".toggle label:after { width:70px; } + .toggle span { width:30px; }"; + return $css; + //css_content() + } + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return a javascript string + function javascript_content(){ + $js =""; + return $js; + //js_content() + } + */ + + function body_content(){ + //Should this really be done with global? + global $FANNIE_PLUGIN_LIST, $FANNIE_PLUGIN_SETTINGS; + ob_start(); + + echo showInstallTabs('Plugins'); + ?> + +
        +

        header; ?>

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> + +

        Available plugins

        +plugin_enable(); + } + } + foreach($oldset as $plugin_class){ + if (!class_exists($plugin_class)) continue; + if (!in_array($plugin_class,$newset)){ + $obj = new $plugin_class(); + $obj->plugin_disable(); + } + } + $FANNIE_PLUGIN_LIST = $_REQUEST['PLUGINLIST']; +} + +echo ''; +foreach($mods as $m){ + $enabled = False; + $instance = new $m(); + foreach($FANNIE_PLUGIN_LIST as $r){ + if ($r == $m){ + $enabled = True; + break; + } + } + /* 17Jun13 Under Fannie Admin CSS the spacing is cramped. + The slider overlaps the text. Want it higher and to the right. + Not obvious why or how to fix. + Jiggered the CSS a little here and above but isn't really a fix. + */ + echo ''."\n"; + echo ' + '."\n"; + + if ($enabled && empty($instance->plugin_settings)){ + echo ''; + } + else if ($enabled){ + if (isset($_REQUEST['psubmit'])) + $instance->setting_change(); + echo ''; + } + +} +echo '

         '."\n"; + echo '
        '."\n"; + printf('', + $m, ($enabled?'checked':''),$m, $m, $m); + echo "\n".'
        '."\n"; + // 17Jun13 EL Added
        for overlap problem. + printf('
        %s',$instance->plugin_description); + echo '
        No settings required
        '; + foreach($instance->plugin_settings as $field => $info){ + $form_id = $m.'_'.$field; + if (isset($_REQUEST[$form_id])) + $FANNIE_PLUGIN_SETTINGS[$field] = $_REQUEST[$form_id]; + if (!isset($FANNIE_PLUGIN_SETTINGS[$field])) + $FANNIE_PLUGIN_SETTINGS[$field] = isset($info['default'])?$info['default']:''; + echo ''.(isset($info['label'])?$info['label']:$field).': '; + printf('', + $form_id,$FANNIE_PLUGIN_SETTINGS[$field]); + // 17Jun13 EL Added
        for crampedness problem. + if (isset($info['description'])) + echo '
        '.$info['description'].''; + //confset($field,"'".$CORE_LOCAL->get($field)."'"); + } + echo '
        '; + +$saveStr = "array("; +foreach($FANNIE_PLUGIN_LIST as $r){ + $saveStr .= "'".$r."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confset('FANNIE_PLUGIN_LIST',$saveStr); + +$saveStr = "array("; +foreach($FANNIE_PLUGIN_SETTINGS as $key => $val){ + $saveStr .= "'".$key."'=>'".$val."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confset('FANNIE_PLUGIN_SETTINGS',$saveStr); + +?> +
        + +
        + +draw_page(); +} +?> diff --git a/fannie/install/InstallProductsPage.php b/fannie/install/InstallProductsPage.php new file mode 100644 index 000000000..1d531d2aa --- /dev/null +++ b/fannie/install/InstallProductsPage.php @@ -0,0 +1,209 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $FANNIE_URL, + $FANNIE_ROOT, + $FANNIE_PRODUCT_MODULES, + $FANNIE_DEFAULT_PDF, + $FANNIE_COMPOSE_PRODUCT_DESCRIPTION, + $FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION; + + ob_start(); + + echo showInstallTabs('Products'); +?> + +
        +

        header; ?>

        + config.php is writeable"; + } + else { + echo "Error: config.php is not writeable"; + } + ?> +
        +

        Product Information Modules

        + The product editing interface displayed after you select a product at: +
        item/ +
        consists of fields grouped in several sections, called modules, listed below. +
        The enabled (active) ones are selected/highlighted. +
        +
        Available Modules
        + +
        + Click or ctrl-Click or shift-Click to select/deselect modules for enablement. +
        +
        + Default Shelf Tag Layout + + +
        +

        Product Editing

        +

        Compose Product Description: + "; + ?> +
        If 0 products.description, which appears on the receipt, will be used as-is. +
        If 1 it will be shortened enough hold a "package" description made by + concatenating products.size and products.unitofmeasure so that the whole + string is still 30 or less characters: +
        "Eden Seville Orange Marma 500g" +

        + +

        Compose Long Product Description: + "; + ?> +
        If 0 productUser.description, which may be used in Product Verification, will be used as-is. +
        If 1 productUser.brand will be prepended and a "package" description made by + concatenating products.size and products.unitofmeasure will be appended: +
        "EDEN | Marmalade, Orange, Seville, Rough-Cut | 500g"
        +

        + +
        + +
        + + draw_page(); +} +?> diff --git a/fannie/install/InstallStoresPage.php b/fannie/install/InstallStoresPage.php new file mode 100644 index 000000000..e3463dba9 --- /dev/null +++ b/fannie/install/InstallStoresPage.php @@ -0,0 +1,257 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return a CSS string + function css_content(){ + $css =""; + + return $css; + + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return a javascript string + */ + function javascript_content(){ + $js = " + function showhide(i,num){ + for (var j=0; j + +
        +

        header; ?>

        +

        As of 11Apr2013 these settings are not widely or well supported.

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +

        Stores

        +

        Store ID: +"; +?> +   By convention store id #0 is HQ. +

        + + +

        Other Stores: +"; +?> +

        +"; + for($i=0; $i<$FANNIE_NUM_STORES;$i++){ + echo ""; + } + echo "
        "; + + $conf = 'array('; + for($i=0; $i<$FANNIE_NUM_STORES; $i++){ + $style = ($i == 0)?'block':'none'; + echo "
        "; + if (!isset($FANNIE_STORES[$i])) $FANNIE_STORES[$i] = array(); + $conf .= 'array('; + + if (!isset($FANNIE_STORES[$i]['host'])) + $FANNIE_STORES[$i]['host'] = '127.0.0.1'; + if (isset($_REQUEST["STORE_HOST_$i"])){ + $FANNIE_STORES[$i]['host'] = $_REQUEST["STORE_HOST_$i"]; + } + $conf .= "'host'=>'{$FANNIE_STORES[$i]['host']}',"; + echo "

        "; + echo "Store ".($i+1)." Database Host:

        "; + + if (!isset($FANNIE_STORES[$i]['type'])) + $FANNIE_STORES[$i]['type'] = 'MYSQL'; + if (isset($_REQUEST["STORE_TYPE_$i"])) + $FANNIE_STORES[$i]['type'] = $_REQUEST["STORE_TYPE_$i"]; + $conf .= "'type'=>'{$FANNIE_STORES[$i]['type']}',"; + echo "

        "; + echo "Store ".($i+1)." Database Type:

        "; + + if (!isset($FANNIE_STORES[$i]['user'])) + $FANNIE_STORES[$i]['user'] = 'root'; + if (isset($_REQUEST["STORE_USER_$i"])) + $FANNIE_STORES[$i]['user'] = $_REQUEST["STORE_USER_$i"]; + $conf .= "'user'=>'{$FANNIE_STORES[$i]['user']}',"; + + echo "

        "; + echo "Store ".($i+1)." Database Username:

        "; + + if (!isset($FANNIE_STORES[$i]['pw'])) + $FANNIE_STORES[$i]['pw'] = ''; + if (isset($_REQUEST["STORE_PW_$i"])) + $FANNIE_STORES[$i]['pw'] = $_REQUEST["STORE_PW_$i"]; + $conf .= "'pw'=>'{$FANNIE_STORES[$i]['pw']}',"; + echo "

        "; + echo "Store ".($i+1)." Database Password:

        "; + + if (!isset($FANNIE_STORES[$i]['op'])) + $FANNIE_STORES[$i]['op'] = 'core_op'; + if (isset($_REQUEST["STORE_OP_$i"])) + $FANNIE_STORES[$i]['op'] = $_REQUEST["STORE_OP_$i"]; + $conf .= "'op'=>'{$FANNIE_STORES[$i]['op']}',"; + echo "

        "; + echo "Store ".($i+1)." Operational DB:

        "; + + if (!isset($FANNIE_STORES[$i]['trans'])) + $FANNIE_STORES[$i]['trans'] = 'core_trans'; + if (isset($_REQUEST["STORE_TRANS_$i"])) + $FANNIE_STORES[$i]['trans'] = $_REQUEST["STORE_TRANS_$i"]; + $conf .= "'trans'=>'{$FANNIE_STORES[$i]['trans']}'"; + echo "

        "; + echo "Store ".($i+1)." Transaction DB:

        "; + + $conf .= ")"; + echo "
        "; + + if ($i == $FANNIE_NUM_STORES - 1) + $conf .= ")"; + else + $conf .= ","; + } + confset('FANNIE_STORES',$conf); +} + +?> + + + +
        + +
        + +draw_page(); +} +?> diff --git a/fannie/install/InstallUpdatesPage.php b/fannie/install/InstallUpdatesPage.php new file mode 100644 index 000000000..207eda59a --- /dev/null +++ b/fannie/install/InstallUpdatesPage.php @@ -0,0 +1,329 @@ +add_css_file("../src/style.css"); + $this->add_css_file("../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../src/jquery/js/jquery.js"); + $this->add_script("../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + + } + */ + + private function normalize_db_name($name){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB, $FANNIE_ARCHIVE_DB; + if ($name == 'op') return $FANNIE_OP_DB; + elseif($name == 'trans') return $FANNIE_TRANS_DB; + elseif($name == 'archive') return $FANNIE_ARCHIVE_DB; + else return False; + } + + function body_content(){ + ob_start(); + echo showInstallTabs('Updates'); +?> + +

        header; ?>

        +

        Model-based Updates.

        +'; + echo 'Attempting to update model: "'.$updateClass.'"
        '; + if (!class_exists($updateClass)) + echo 'Error: class not found
        '; + elseif(!is_subclass_of($updateClass, 'BasicModel')) + echo 'Error: not a valid model
        '; + else { + $updateModel = new $updateClass(null); + $db_name = $this->normalize_db_name($updateModel->preferred_db()); + if ($db_name === False) + echo 'Error: requested database unknown'; + else { + ob_start(); + $changes = $updateModel->normalize($db_name, BasicModel::NORMALIZE_MODE_APPLY); + $details = ob_get_clean(); + if ($changes === False) + echo 'An error occurred.'; + else + echo 'Update complete.'; + printf(' Details', + $details); + } + } + echo '

      • '; + } + + $obj = new BasicModel(null); + $models = $obj->get_models(); + $cmd = new ReflectionClass('BasicModel'); + $cmd = $cmd->getFileName(); + echo '
          '; + foreach($models as $class){ + $model = new $class(null); + $db_name = $this->normalize_db_name($model->preferred_db()); + if ($db_name === False) continue; + + ob_start(); + $changes = $model->normalize($db_name, BasicModel::NORMALIZE_MODE_CHECK); + $details = ob_get_clean(); + + if ($changes === False){ + printf('
        • %s had errors.', $class); + } + elseif($changes > 0){ + printf('
        • %s has updates available.', $class); + } + elseif($changes < 0){ + printf('
        • %s does not match the schema but cannot be updated.', $class); + } + + if ($changes > 0){ + printf(' Details

          + To apply changes Click Here + or run the following command:
          +
          php %s --update %s %s
          +
        • ', + $class, $class, $details, $class, + $cmd, $db_name, $class + ); + } + else if ($changes < 0 || $changes === False){ + printf(' Details
          ', + $class, $class, $details + ); + } + } + echo '
        '; +?> +
        +

        Click a link for details on the simple Update.

        +config.php is writeable"; + } + else { + echo "Error: config.php is not writeable"; + } + + echo "
        "; + + $action = isset($_REQUEST['action']) ? $_REQUEST['action']: 'list'; + $updateID = isset($_REQUEST['u']) ? $_REQUEST['u'] : ''; + switch($action){ + case 'view': + case 'mark': + case 'unmark': + if (empty($updateID)){ + echo 'No update specified!'; + echo 'Back'; + exit; + } + $file_name = "updates/$updateID.php"; + $class_name = "update_$updateID"; + if (!file_exists($file_name)){ + echo 'Update not found!'; + echo 'Back'; + exit; + } + include($file_name); + if (!class_exists($class_name)){ + echo 'Update is malformed!'; + echo 'Back'; + exit; + } + $obj = new $class_name(); + echo $obj->HtmlInfo(); + if ($action=='mark') + $obj->SetStatus(True); + if ($action=='unmark') + $obj->SetStatus(False); + if (!$obj->CheckStatus()){ + printf('Apply Update
        ',$updateID); + printf('Mark Update Complete
        ',$updateID); + } else { + printf('Un-mark Update (so it can be run again)
        ',$updateID); + } + echo 'Back to List of Updates'; + echo "
        "; + echo "Query details:
        "; + echo $obj->HtmlQueries(); + + break; + case 'apply': + if (empty($updateID)){ + echo 'No update specified!'; + echo 'Back'; + exit; + } + $file_name = "updates/$updateID.php"; + $class_name = "update_$updateID"; + if (!file_exists($file_name)){ + echo 'Update not found!'; + echo 'Back'; + exit; + } + include($file_name); + if (!class_exists($class_name)){ + echo 'Update is malformed!'; + echo 'Back'; + exit; + } + $obj = new $class_name(); + echo $obj->ApplyUpdates(); + echo '
        '; + echo "If the queries all succeeded, this update is automatically marked complete. + If not, you can make corrections in your database and refresh this page to try again or just make + alterations directly"; + echo '

        '; + if ( !$obj->CheckStatus() ) { + printf('Manually Mark Update $updateID Complete
        ',$updateID); + } else { + echo "Update $updateID has been Marked Complete.
        "; + printf('Un-mark Update (so it can be run again)
        ',$updateID); + } + echo 'Back to List of Updates'; + break; + case 'list': + // find update files + $dh = opendir('updates'); + $updates = array(); + while ( ($file=readdir($dh)) !== False ){ + if ($file[0] == ".") continue; + if ($file == "Update.php") continue; + if (!is_file('updates/'.$file)) continue; + if (substr($file,-4) != ".php") continue; + $updates[] = $file; + } + sort($updates); + + // check for new vs. finished and put in separate arrays. + $new = array(); + $done = array(); + foreach($updates as $u){ + $key = substr($u,0,strlen($u)-4); + include('updates/'.$u); + if (!class_exists('update_'.$key)) continue; + $class = "update_$key"; + $obj = new $class(); + if ($obj->CheckStatus()) + $done[] = $key; + else + $new[] = $key; + } + + // display + echo '

        Available Updates

        '; + echo '
          '; + foreach($new as $key){ + printf('
        • %s
        • ', + $key,$key); + } + echo '
        '; + echo '

        Applied Updates

        '; + echo '
          '; + foreach($done as $key){ + printf('
        • %s
        • ', + $key,$key); + } + echo '
        '; + break; + default: + echo 'Action unknown!'; + echo 'Back'; + break; + } + + + echo "
        "; + + return ob_get_clean(); + + // body_content + } + +// InstallUpdatesPage +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new InstallUpdatesPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/install/LaneConfigPages/LaneAdditionalConfigPage.php b/fannie/install/LaneConfigPages/LaneAdditionalConfigPage.php new file mode 100644 index 000000000..e83dc7fe5 --- /dev/null +++ b/fannie/install/LaneConfigPages/LaneAdditionalConfigPage.php @@ -0,0 +1,586 @@ +add_css_file("$SRC/style.css"); + $this->add_css_file("$SRC/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("$SRC/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("$SRC/jquery/js/jquery.js"); + $this->add_script("$SRC/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + + return $css; + + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $CORE_LOCAL, $CORE_PATH; + global $FANNIE_COUNTRY; + + ob_start(); + + echo showLinkToFannie(); + echo showInstallTabsLane("Additional Configuration", ''); + +?> + +
        +

        header; ?>

        + +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        + +

        PoS Display

        + +

        Browser only: "; +confsave('browserOnly',$CORE_LOCAL->get('browserOnly')); +?> +
        +If Yes, the "exit" button on the login screen attempts to close the window. +

        + +

        Lock screen on idle: "; +echo "

        "; +confsave('lockScreen',$CORE_LOCAL->get('lockScreen')); +?> + +

        Alert Bar: +get('alertBar')==="") + $CORE_LOCAL->set('alertBar','Warning!'); +if (isset($_REQUEST['ALERT'])) + $CORE_LOCAL->set('alertBar',$_REQUEST['ALERT']); +printf("",$CORE_LOCAL->get('alertBar')); +echo "
        Heading on the Alert popup."; +echo "

        "; +confsave('alertBar',"'".$CORE_LOCAL->get('alertBar')."'"); +?> + +

        Footer Modules (left to right): +
        These display in a row below the lines of items in the transaction. +get("FooterModules"); +// replace w/ form post if needed +// fill in defaults if missing +if (isset($_REQUEST['FOOTER_MODS'])) + $current_mods = $_REQUEST['FOOTER_MODS']; +elseif(!is_array($current_mods) || count($current_mods) != 5){ + $current_mods = array( + 'SavedOrCouldHave', + 'TransPercentDiscount', + 'MemSales', + 'EveryoneSales', + 'MultiTotal' + ); +} +$dh = opendir($CORE_PATH.'lib/FooterBoxes/'); +while(False !== ($f = readdir($dh))){ + if ($f == "." || $f == "..") + continue; + if (substr($f,-4) == ".php"){ + $footer_mods[] = rtrim($f,".php"); + } +} +for($i=0;$i<5;$i++){ + echo '
        '; +} +$saveStr = "array("; +foreach($current_mods as $m) + $saveStr .= "'".$m."',"; +$saveStr = rtrim($saveStr,",").")"; +echo "

        "; +confsave('FooterModules',$saveStr); +?> + +
        + +

        Store

        +

        Store: +get('store')==="") + $CORE_LOCAL->set('store','utopia'); +if (isset($_REQUEST['STORE'])) + $CORE_LOCAL->set('store',$_REQUEST['STORE']); +printf("",$CORE_LOCAL->get('store')); +echo "
        In theory, any hard-coded, store specific sequences should be blocked off based on the store setting. +Actual adherence to this principle in the code is less than perfect."; +echo "

        "; +confsave('store',"'".$CORE_LOCAL->get('store')."'"); +?> + +
        + +

        Discounts

        +

        Discounts enabled: "; +echo "
        If Yes, members get a percentage discount as specified in custdata."; +echo "

        "; +confsave('discountEnforced',$CORE_LOCAL->get('discountEnforced')); +?> + +

        Line Item Discount (member): +get('LineItemDiscountMem')==="") $CORE_LOCAL->set('LineItemDiscountMem','0'); +if(isset($_REQUEST['LD_MEM'])) $CORE_LOCAL->set('LineItemDiscountMem',$_REQUEST['LD_MEM']); +printf("",$CORE_LOCAL->get('LineItemDiscountMem')); +echo " (percentage; 0.05 => 5%)"; +echo "

        "; +confsave('LineItemDiscountMem',"'".$CORE_LOCAL->get('LineItemDiscountMem')."'"); +?> + +

        Line Item Discount (non-member): +get('LineItemDiscountNonMem')==="") $CORE_LOCAL->set('LineItemDiscountNonMem','0'); +if(isset($_REQUEST['LD_NONMEM'])) $CORE_LOCAL->set('LineItemDiscountNonMem',$_REQUEST['LD_NONMEM']); +printf("",$CORE_LOCAL->get('LineItemDiscountNonMem')); +echo " (percentage; 0.05 => 5%)"; +echo "

        "; +confsave('LineItemDiscountNonMem',"'".$CORE_LOCAL->get('LineItemDiscountNonMem')."'"); +?> +
        + +

        Members

        +

        Default Non-member #: +get('defaultNonMem')==="") + $CORE_LOCAL->set('defaultNonMem','11'); +if(isset($_REQUEST['NONMEM'])) + $CORE_LOCAL->set('defaultNonMem',$_REQUEST['NONMEM']); +printf("",$CORE_LOCAL->get('defaultNonMem')); +echo "
        Normally a single account number is used for most if not all non-member +transactions. Specify that account number here."; +echo "

        "; +confsave('defaultNonMem',"'".$CORE_LOCAL->get('defaultNonMem')."'"); +?> + +

        Visiting Member #: +get('visitingMem')==="") + $CORE_LOCAL->set('visitingMem','9'); +if(isset($_REQUEST['VISMEM'])) + $CORE_LOCAL->set('visitingMem',$_REQUEST['VISMEM']); +printf("",$CORE_LOCAL->get('visitingMem')); +echo "
        This account provides members of other co-ops with member pricing +but no other benefits. Leave blank to disable."; +echo "

        "; +confsave('visitingMem',"'".$CORE_LOCAL->get('visitingMem')."'"); +?> + +

        Show non-member account in searches: "; +} +else { + echo ""; + echo ""; + echo ""; +} +echo "

        "; +confsave('memlistNonMember',$CORE_LOCAL->get('memlistNonMember')); +?> +
        + +$Checks"; +echo "

        Allow members to write $checks over purchase amount: "; +echo "

        "; +confsave('cashOverLimit',$CORE_LOCAL->get('cashOverLimit')); +?> + +$Check over limit: "; +if ($CORE_LOCAL->get('dollarOver')==="") + $CORE_LOCAL->set('dollarOver','0'); +if(isset($_REQUEST['OVER_LIMIT'])) + $CORE_LOCAL->set('dollarOver',$_REQUEST['OVER_LIMIT']); +printf("",$CORE_LOCAL->Get('dollarOver')); +echo "
        Maximum amount over purchase. 0 means no limit."; +echo "

        "; +confsave('dollarOver',$CORE_LOCAL->get('dollarOver')); +?> +
        + +

        Receipts

        +

        Enable receipts: "; +echo "

        "; +confsave('print',$CORE_LOCAL->get("print")); +?> + +

        Use new receipt: "; +echo "
        The new receipt groups items by category; the old one just lists them in order."; +echo "

        "; +confsave('newReceipt',$CORE_LOCAL->get("newReceipt")); +?> +
        + +

        Receipt printer

        +

        Printer port: +get('printerPort')==="") + $CORE_LOCAL->set('printerPort','fake.txt'); +if(isset($_REQUEST['PPORT'])) + $CORE_LOCAL->set('printerPort',$_REQUEST['PPORT']); +printf("",$CORE_LOCAL->get('printerPort')); +echo "
        Path to the printer. Common ports are LPT1: (windows) and /dev/lp0 (linux). +Can also print to a text file if it's just a regular file name."; +echo "

        "; +confsave('printerPort',"'".$CORE_LOCAL->get('printerPort')."'"); +?> +
        + +

        Scanner/scale

        +

        Scanner/scale port: +get('scalePort')==="") $CORE_LOCAL->set('scalePort',''); +if(isset($_REQUEST['SPORT'])) $CORE_LOCAL->set('scalePort',$_REQUEST['SPORT']); +printf("",$CORE_LOCAL->get('scalePort')); +echo "
        Path to the scanner scale. Common values are COM1 (windows) and /dev/ttyS0 (linux)."; +echo "

        "; +confsave('scalePort',"'".$CORE_LOCAL->get('scalePort')."'"); +?> + +Scanner/scale driver: +get('scaleDriver')==="") $CORE_LOCAL->set('scaleDriver','NewMagellan'); +if(isset($_REQUEST['SDRIVER'])) $CORE_LOCAL->set('scaleDriver',$_REQUEST['SDRIVER']); +printf("",$CORE_LOCAL->get('scaleDriver')); +echo '
        The name of your scale driver. Known good values include "ssd" and "NewMagellan".'; +echo "

        "; +confsave('scaleDriver',"'".$CORE_LOCAL->get('scaleDriver')."'"); +?> +
        + +

        Customer-facing display

        +

        +Touchscreen keys and menus really don't need to appear on +the customer-facing display. +
        Experimental feature where one +window always shows the item listing. Very alpha. +

        +

        Enable onscreen keys: "; + confsave('touchscreen',True); +} +else { + echo ""; + echo ""; + echo ""; + confsave('touchscreen',False); +} +echo "

        "; +?> + +

        Separate customer display: "; +echo "

        "; +confsave('CustomerDisplay',$CORE_LOCAL->get('CustomerDisplay')); +?> +
        + +

        Paycards

        +

        +Integrated card processing configuration is included for the sake +of completeness. +
        The modules themselves require individual configuration, too. +

        +

        Integrated Credit Cards: "; +echo "

        "; +confsave('CCintegrate',$CORE_LOCAL->get('CCintegrate')); +?> + +

        Integrated Gift Cards: "; +echo "

        "; +confsave('gcIntegrate',$CORE_LOCAL->get('gcIntegrate')); +?> + +

        Enabled paycard modules: +
        The enabled ones are highlighted in the multi-select below (initially none). +
        Click and Ctrl-Click to select/de-select. +
        The modules themselves require individual configuration. +
        +"; +echo "

        "; +?> + +

        Signature Required Limit: +set('CCSigLimit',$_REQUEST['CCSigLimit']); +if ($CORE_LOCAL->get('CCSigLimit')=="") $CORE_LOCAL->set('CCSigLimit',0.00); +printf(" \$",$CORE_LOCAL->get('CCSigLimit')); +echo "
        Require customer signature if transaction total is more than this amount."; +echo "
        0 means signature never required."; +echo "

        "; +confsave('CCSigLimit',$CORE_LOCAL->get('CCSigLimit')); +?> + +

        Signature Capture Device: +get('SigCapture')=="") + $CORE_LOCAL->set('SigCapture',''); +if (isset($_REQUEST['SigCapture'])) + $CORE_LOCAL->set('SigCapture',$_REQUEST['SigCapture']); +printf("",$CORE_LOCAL->get('SigCapture')); +echo " (blank for none)"; +echo "

        "; +confsave('SigCapture',"'".$CORE_LOCAL->get('SigCapture')."'"); +?> +
        + + +
        + +draw_page(); +} +?> diff --git a/fannie/install/LaneConfigPages/LaneNecessitiesPage.php b/fannie/install/LaneConfigPages/LaneNecessitiesPage.php new file mode 100644 index 000000000..0e2cf27d1 --- /dev/null +++ b/fannie/install/LaneConfigPages/LaneNecessitiesPage.php @@ -0,0 +1,295 @@ +add_css_file("$SRC/style.css"); + $this->add_css_file("$SRC/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("$SRC/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("$SRC/jquery/js/jquery.js"); + $this->add_script("$SRC/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $CORE_LOCAL; + + ob_start(); + + echo showLinkToFannie(); + echo showInstallTabsLane("Lane Necessities", ''); + +?> + +
        +

        header; ?>

        + +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> + +

        +Use these forms for values that will be used on all lanes. +
        It saves having to set the same values on a number of lanes. +
        Some values can be overridden for a lane from the lane's config forms. +
        To install, on each lane: $LANE/install/   >   "Upgrade ini.php via server" +
        That only installs changes made here (Fannie) since the last time it was run on the lane. +
        The first time it is run it will probably overwrite everything in the lane ini.php, +
        including config done locally with $LANE/install/*.php +

        22Sep12 Eric Lee In my first try at this nothing in $LANE/ini.php was changed, no reason given. +
        I will see about making lane.util.php::confsave() return more informative failure messages. +

        +
        + +

        Basics

        +

        +Lane Operating System: "; +confsave('OS',"'".$CORE_LOCAL->get('OS')."'"); +?> +

        +
        + +

        Lane Database characteristics

        +

        This describes how lanes are set up. It does not establish or change any value. +
        It assumes the values are the same for all lanes, that all lanes are set up the same way. +
        Values can be overridden in configuration at the lane. +

        +

        Lane database host: +set('localhost',$_REQUEST['LANE_HOST']); +if ($CORE_LOCAL->get('localhost')=="") $CORE_LOCAL->set('localhost','127.0.0.1'); +printf("", + $CORE_LOCAL->get('localhost')); +echo "

        "; +confsave('localhost',"'".$CORE_LOCAL->get('localhost')."'"); +?> +

        Lane database type: + +

        Lane database user name: +set('localUser',$_REQUEST['LANE_USER']); +if ($CORE_LOCAL->get('localUser')=="") $CORE_LOCAL->set('localUser','root'); +printf("", + $CORE_LOCAL->get('localUser')); +echo "

        "; +confsave('localUser',"'".$CORE_LOCAL->get('localUser')."'"); +?> +

        Lane database password: +set('localPass',$_REQUEST['LANE_PASS']); +printf("", + $CORE_LOCAL->get('localPass')); +echo "

        "; +confsave('localPass',"'".$CORE_LOCAL->get('localPass')."'"); +?> +

        Lane operational database name: +set('pDatabase',$_REQUEST['LANE_OP_DB']); +if ($CORE_LOCAL->get('pDatabase')=="") $CORE_LOCAL->set('pDatabase','opdata'); +printf("", + $CORE_LOCAL->get('pDatabase')); +echo "

        "; +confsave('pDatabase',"'".$CORE_LOCAL->get('pDatabase')."'"); +?> +

        Lane transaction database name: +set('tDatabase',$_REQUEST['LANE_TRANS_DB']); +if ($CORE_LOCAL->get('pDatabase')=="") $CORE_LOCAL->set('pDatabase','translog'); +printf("", + $CORE_LOCAL->get('tDatabase')); +echo "

        "; +confsave('tDatabase',"'".$CORE_LOCAL->get('tDatabase')."'"); +?> +
        + +

        Server Database characteristics

        +

        This section describes to the lane how the server is set up. +
        It does not establish or change any value. +

        +

        Server database host: +set('mServer',$_REQUEST['SERVER_HOST']); +if ($CORE_LOCAL->get('mServer')=="") $CORE_LOCAL->set('mServer','127.0.0.1'); +printf("", + $CORE_LOCAL->get('mServer')); +echo "

        "; +confsave('mServer',"'".$CORE_LOCAL->get('mServer')."'"); +?> +

        Server database type: +"; +echo "

        "; +confsave('mDBMS',"'".$CORE_LOCAL->get('mDBMS')."'"); +?> +

        Server database user name: +set('mUser',$_REQUEST['SERVER_USER']); +if ($CORE_LOCAL->get('mUser')=="") $CORE_LOCAL->set('mUser','root'); +printf("", + $CORE_LOCAL->get('mUser')); +echo "

        "; +confsave('mUser',"'".$CORE_LOCAL->get('mUser')."'"); +?> +

        Server database password: +set('mPass',$_REQUEST['SERVER_PASS']); +printf("", + $CORE_LOCAL->get('mPass')); +echo "

        "; +confsave('mPass',"'".$CORE_LOCAL->get('mPass')."'"); +?> +

        Server transaction database name: +set('mDatabase',$_REQUEST['SERVER_DB']); +if ($CORE_LOCAL->get('mDatabase')=="") $CORE_LOCAL->set('mDatabase','core_trans'); +printf("", + $CORE_LOCAL->get('mDatabase')); +echo "

        "; +confsave('mDatabase',"'".$CORE_LOCAL->get('mDatabase')."'"); +?> +
        + +
        + +draw_page(); +} +?> diff --git a/fannie/install/LaneConfigPages/LaneScanningPage.php b/fannie/install/LaneConfigPages/LaneScanningPage.php new file mode 100644 index 000000000..ff21751eb --- /dev/null +++ b/fannie/install/LaneConfigPages/LaneScanningPage.php @@ -0,0 +1,299 @@ +add_css_file("$SRC/style.css"); + $this->add_css_file("$SRC/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("$SRC/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("$SRC/jquery/js/jquery.js"); + $this->add_script("$SRC/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $CORE_LOCAL, $CORE_PATH; + + ob_start(); + + echo showLinkToFannie(); + echo showInstallTabsLane("Scanning Options", ''); + +?> + +
        +

        header; ?>

        + +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> + +
        + +

        Special UPCs

        +

        +Special handling modules for UPCs that aren't products (e.g., coupons) +

        +Special UPCs: +

        +The enabled ones are highlighted in the multi-select below (initially none). +
        Click and Ctrl-Click to select/de-select. +

        +
        +
        + +

        Discount Types

        +

        +Discount type modules control how sale prices are calculated. +
        The numeric code is in the item record; this controls what the code means. +
        Check the dropdowns for all known Discount Types. Not all may currently be in use. +
        Decide how many of them you want to use. +
        Assign a number to (map) each one. +

        +Number of Discounts in Use: +set('DiscountTypeCount',$_REQUEST['DT_COUNT']); +if ($CORE_LOCAL->get("DiscountTypeCount") == "") $CORE_LOCAL->set("DiscountTypeCount",5); +if ($CORE_LOCAL->get("DiscountTypeCount") <= 0) $CORE_LOCAL->set("DiscountTypeCount",1); +printf("", + $CORE_LOCAL->get('DiscountTypeCount')); +confsave('DiscountTypeCount',$CORE_LOCAL->get('DiscountTypeCount')); +?> +
        Discount Module Mapping:
        +set('DiscountTypeClasses',$_REQUEST['DT_MODS']); +if (!is_array($CORE_LOCAL->get('DiscountTypeClasses'))){ + $CORE_LOCAL->set('DiscountTypeClasses', + array( + 'NormalPricing', + 'EveryoneSale', + 'MemberSale', + 'CaseDiscount', + 'StaffSale' + )); +} +$discounts = array(); +$dh = opendir($CORE_PATH.'lib/Scanning/DiscountTypes'); +while($dh && False !== ($f = readdir($dh))){ + if ($f == "." || $f == "..") + continue; + if (substr($f,-4) == ".php"){ + $discounts[] = rtrim($f,".php"); + } +} +$dt_conf = $CORE_LOCAL->get("DiscountTypeClasses"); +for($i=0;$i<$CORE_LOCAL->get('DiscountTypeCount');$i++){ + echo "[$i] => "; + echo "
        "; +} +$saveStr = "array("; +$tmp_count = 0; +foreach($CORE_LOCAL->get("DiscountTypeClasses") as $r){ + $saveStr .= "'".$r."',"; + if ($tmp_count == $CORE_LOCAL->get("DiscountTypeCount")-1) + break; + $tmp_count++; +} +$saveStr = rtrim($saveStr,",").")"; +// this is different than lane save; uses array type +confsave('DiscountTypeClasses',$CORE_LOCAL->get('DiscountTypeClasses')); +?> +
        + +

        Price Methods

        +

        +Price Methods dictate how item prices are calculated. +
        There's some overlap with Discount Types, but generally +price methods deal with grouped ("three for a dollar") items. +
        The numeric code is in the item record; this controls what the code means. +
        Check the dropdowns for all known Price Methods. Not all may currently be in use. +
        Decide how many of them you want to use. +
        Assign a number to (map) each one. +

        +Number of Price Methods in Use: +set('PriceMethodCount',$_REQUEST['PM_COUNT']); +if ($CORE_LOCAL->get("PriceMethodCount") == "") $CORE_LOCAL->set("PriceMethodCount",3); +if ($CORE_LOCAL->get("PriceMethodCount") <= 0) $CORE_LOCAL->set("PriceMethodCount",1); +printf("", + $CORE_LOCAL->get('PriceMethodCount')); +confsave('PriceMethodCount',$CORE_LOCAL->get('PriceMethodCount')); +?> +
        Price Method Mapping:
        +set('PriceMethodClasses',$_REQUEST['PM_MODS']); +if (!is_array($CORE_LOCAL->get('PriceMethodClasses'))){ + $CORE_LOCAL->set('PriceMethodClasses', + array( + 'BasicPM', + 'GroupPM', + 'QttyEnforcedGroupPM' + )); +} +$pms = array(); +$dh = opendir($CORE_PATH.'lib/Scanning/PriceMethods'); +while($dh && False !== ($f = readdir($dh))){ + if ($f == "." || $f == "..") + continue; + if (substr($f,-4) == ".php"){ + $pms[] = rtrim($f,".php"); + } +} +$pm_conf = $CORE_LOCAL->get("PriceMethodClasses"); +for($i=0;$i<$CORE_LOCAL->get('PriceMethodCount');$i++){ + echo "[$i] => "; + echo "
        "; +} +$saveStr = "array("; +$tmp_count = 0; +foreach($CORE_LOCAL->get("PriceMethodClasses") as $r){ + $saveStr .= "'".$r."',"; + if ($tmp_count == $CORE_LOCAL->get("PriceMethodCount")-1) + break; + $tmp_count++; +} +$saveStr = rtrim($saveStr,",").")"; +// this is different than lane save; uses array type +confsave('PriceMethodClasses',$CORE_LOCAL->get('PriceMethodClasses')); +?> +
        + +
        + +draw_page(); +} +?> diff --git a/fannie/install/LaneConfigPages/LaneSecurityPage.php b/fannie/install/LaneConfigPages/LaneSecurityPage.php new file mode 100644 index 000000000..e28c50b93 --- /dev/null +++ b/fannie/install/LaneConfigPages/LaneSecurityPage.php @@ -0,0 +1,201 @@ +add_css_file("$SRC/style.css"); + $this->add_css_file("$SRC/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("$SRC/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("$SRC/jquery/js/jquery.js"); + $this->add_script("$SRC/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $CORE_LOCAL; + + ob_start(); + + echo showLinkToFannie(); + echo showInstallTabsLane("Security", ''); + +?> + +
        +

        header; ?>

        + +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> + +
        + +

        Privileges

        +

        +Configure the level of privileges required to perform certain operations. +
        "All" means any cashier can perform the operation. +
        "Admin only" means "Manager" privileges needed. +
        See: Fannie Admin > Cashier Management +

        + +

        Cancel Transaction: "; +echo "

        "; +confsave('SecurityCancel',$CORE_LOCAL->get("SecurityCancel")); +?> + +

        +Suspend/Resume: "; +echo "

        "; +confsave('SecuritySR',$CORE_LOCAL->get("SecuritySR")); +?> + +

        Refund Item: "; +echo "

        "; +confsave('SecurityRefund',$CORE_LOCAL->get("SecurityRefund")); +?> +
        + +

        Limits

        +

        Void Limit:  +set('VoidLimit',$_REQUEST['VOIDLIMIT']); +if ($CORE_LOCAL->get("VoidLimit")=="") $CORE_LOCAL->set("VoidLimit",0); +printf("",$CORE_LOCAL->get('VoidLimit')); +echo " (in dollars, per transaction. Zero for unlimited)."; +echo "

        "; +confsave('VoidLimit',"'".$CORE_LOCAL->get('VoidLimit')."'"); +?> + +
        + +
        + + + +draw_page(); +} +?> diff --git a/fannie/install/LaneConfigPages/LaneTextStringPage.php b/fannie/install/LaneConfigPages/LaneTextStringPage.php new file mode 100644 index 000000000..894d55fba --- /dev/null +++ b/fannie/install/LaneConfigPages/LaneTextStringPage.php @@ -0,0 +1,225 @@ +add_css_file("$SRC/style.css"); + $this->add_css_file("$SRC/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("$SRC/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("$SRC/jquery/js/jquery.js"); + $this->add_script("$SRC/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + function css_content(){ + $css =""; + return $css; + //css_content() + } + */ + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + $js =""; + return $js; + } + */ + + function body_content(){ + global $dbc; //, $TRANSLATE; + + // keys are customReceipt.type values. + $TRANSLATE = array( + 'receiptHeader'=>'Receipt Header', + 'receiptFooter'=>'Receipt Footer', + 'ckEndorse'=>'Check Endorsement', + 'welcomeMsg'=>'Welcome On-screen Message', + 'farewellMsg'=>'Goodbye On-screen Message', + 'trainingMsg'=>'Training On-screen Message', + 'chargeSlip'=>'Store Charge Slip' + ); + + if (isset($_REQUEST['new_submit'])){ + $chkQ = $dbc->prepare_statement("SELECT MAX(seq) FROM customReceipt WHERE type=?"); + $chkR = $dbc->exec_statement($chkQ, array($_REQUEST['new_type'])); + $seq = 0; + if ($dbc->num_rows($chkR) > 0){ + $max = array_pop($dbc->fetch_row($chkR)); + if ($max != null) $seq=$max+1; + } + if (!empty($_REQUEST['new_content'])){ + $insQ = $dbc->prepare_statement("INSERT INTO customReceipt (type,text,seq) VALUES (?,?,?)"); + $dbc->exec_statement($insQ,array($_REQUEST['new_type'],$_REQUEST['new_content'],$seq)); + } + } + else if (isset($_REQUEST['old_submit'])){ + $cont = $_REQUEST['old_content']; + $type = $_REQUEST['old_type']; + $seq=0; + $prev_type=''; + $trun = $dbc->prepare_statement("TRUNCATE TABLE customReceipt"); + $dbc->exec_statement($trun); + $insP = $dbc->prepare_statement("INSERT INTO customReceipt (type,text,seq) VALUES (?,?,?)"); + for($i=0;$iexec_statement($insP, array($type[$i],$cont[$i],$seq)); + $prev_type=$type[$i]; + $seq++; + } + } + + ob_start(); + + echo showLinkToFannie(); + echo showInstallTabsLane("Text Strings", ''); + +?> + +
        +

        header; ?>

        + +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +

        Use this utility to enter and edit the lines of text that appear on +receipts, the lane Welcome screen, and elsewhere. +
        If your receipts have no headers or footers or they are wrong this is the place to fix that. +
        The upper form is for adding lines. +
        The lower form is for editing existing lines. +
        Make changes in only one of the forms for each submit, i.e. Add and Edit separately. +

        +
        + +

        Add lines

        +

        Select a type of text string, enter the line of text for it, and click "Add". +
        Existing lines of the type are displayed in the "Edit existing text string lines" form, below. +
        All types of text strings may initially have no lines, i.e. be empty. +
        The maximum length of a line is 20 characters. +

        + + + +
        +
        + +

        Edit existing text string lines

        +

        Existing lines of text of different types are displayed below and can be edited there. +
        All types may initially have no lines in which case the heading will not appear and no line boxes will appear. +
        To delete a line erase all the text from it. +
        The maximum length of a line is 20 characters. +

        +
        +prepare_statement("SELECT type,text FROM customReceipt ORDER BY type,seq"); +$r = $dbc->exec_statement($q); +$header=""; +$i=1; +while($w = $dbc->fetch_row($r)){ + if ($header != $w['type']){ + echo '

        '.$TRANSLATE[$w['type']].'

        '; + $header = $w['type']; + $i=1; + } + printf('

        %d: +

        ', + $i++,$w['text'],$w['type']); +} +?> + +
        + +draw_page(); +} +?> diff --git a/fannie/install/LaneConfigPages/ini.php b/fannie/install/LaneConfigPages/ini.php new file mode 100644 index 000000000..f4c9fca63 --- /dev/null +++ b/fannie/install/LaneConfigPages/ini.php @@ -0,0 +1,84 @@ +CL = array(); + } + function get($k){ + return (isset($this->CL["$k"])) ? $this->CL["$k"] : ""; + } + function set($k,$v){ + $this->CL["$k"] = $v; + } +} + +/* Save new key+value pairs and changed values to the database. + * Look for the key+value in the database. + * If key does not exist, add key+value to the database. + * If key exists and the value from the form is different + * change the value in the database. +*/ +function confsave($k,$v){ + global $dbc; + global $FANNIE_TRANS_DB; + if (is_string($v)) + $v = trim($v,"'"); + $p = $dbc->prepare_statement("SELECT value FROM ${FANNIE_TRANS_DB}.lane_config WHERE keycode=?"); + $r = $dbc->exec_statement($p,array($k)); + if ($dbc->num_rows($r)==0){ + $insP = $dbc->prepare_statement('INSERT INTO ${FANNIE_TRANS_DB}.lane_config (keycode, value, + modified) VALUES (?, ?, '.$dbc->now().')'); + $dbc->exec_statement($insP,array($k,serialize($v))); + } + else { + $current = array_pop($dbc->fetch_row($r)); + if ($v !== unserialize($current)){ + $upP = $dbc->prepare_statement('UPDATE '.$FANNIE_TRANS_DB.'.lane_config SET value=?, + modified='.$dbc->now().' WHERE keycode=?'); + $dbc->exec_statement($upP, array(serialize($v),$k)); + } + } +} + +$CORE_LOCAL = new cl_wrapper(); + +$q = $dbc->prepare_statement("SELECT keycode,value FROM lane_config"); +$r = $dbc->exec_statement($q); +while($w = $dbc->fetch_row($r)){ + $k = $w['keycode']; + $v = unserialize($w['value']); + $CORE_LOCAL->set($k,$v); +} + +?> diff --git a/fannie/install/auth.php b/fannie/install/auth.php new file mode 100644 index 000000000..a0b5b3991 --- /dev/null +++ b/fannie/install/auth.php @@ -0,0 +1,272 @@ + + + +Fannie: Authentication Settings + + + + + + +
        +

        Fannie: Authentication Settings

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +

        +Authentication enabled +"; +echo "

        "; + +// Default to Authenticate ("Authenticate Everything") or not. +if ($FANNIE_AUTH_ENABLED){ + echo "

        "; + echo "Authenticate by default "; + echo "
        "; + echo "If 'Yes' all Admin utilities will require Login
        "; + echo "If 'No' only those utilities coded for it will require Login"; + echo "

        "; +} + +if ($FANNIE_AUTH_ENABLED){ + include("../auth/utilities.php"); + include("../auth/login.php"); + table_check(); // create user tables + + // if no users exist, offer to create one + if (getNumUsers() == 0){ + $success = False; + if (isset($_REQUEST['newuser']) && isset($_REQUEST['newpass'])){ + $FANNIE_AUTH_ENABLED = False; // toggle to bypass user checking + $success = createLogin($_REQUEST['newuser'],$_REQUEST['newpass']); + if ($success){ + echo "User ".$_REQUEST['newuser']." created
        "; + $FANNIE_AUTH_ENABLED = True; // toggle enforce error checking + $success = addAuth($_REQUEST['newuser'],'admin'); + if ($success) { + echo "User ".$_REQUEST['newuser']." is an admin
        "; + // 10Nov12 EL Added these notes to the person installing. + echo "You can use these credentials at the Authentication Interface
        "; + echo " Other protected pages may require different credentials.
        "; + + // populate known privileges table automatically + if (!class_exists('FannieDB')) + include($FANNIE_ROOT.'classlib2.0/data/FannieDB.php'); + $db = FannieDB::get($FANNIE_OP_DB); + ob_start(); // don't care about primary key errors + loaddata($db, 'userKnownPrivs'); + ob_end_clean(); + + + } else { + echo "Error making user an admin
        "; + } + } + else + echo "Error creating initial user
        "; + $FANNIE_AUTH_ENABLED = True; // toggle enforce error checking + } + if (!$success){ + echo "
        No users defined. To create an initial admin user, + enter a username and password below
        "; + echo 'Username:
        '; + echo 'Password:
        '; + } + } + else { + echo "

        You can manage Login users and groups via the Authentication Interface"; + echo "

        "; + } + echo "

        How Authentication Works"; + echo "

        "; +} +?> +
        +Allow shadow logins +
        "; +if (!file_exists("../auth/shadowread/shadowread")){ + echo "Error: shadowread utility does not exist"; + echo "
        "; + echo "shadowread lets Fannie authenticate users agaist /etc/shadow. To create it:"; + echo "
        +cd ".realpath('../auth/shadowread')."
        +make
        +	
        "; + echo "
        "; +} +else { + $perms = fileperms("../auth/shadowread/shadowread"); + if ($perms == 0104755) + echo "shadowread utility has proper permissions"; + else{ + echo "Warning: shadowread utility has incorrect permissions"; + echo "
        "; + echo "shadowread needs setuid permission. To fix it: "; + echo "
        +cd ".realpath('../auth/shadowread')."
        +sudo make install
        +		
        "; + echo "
        "; + } +} +?> +
        +Allow LDAP logins +
        +Warning: PHP install does not have LDAP support enabled"; +else + echo "PHP has LDAP support enabled"; +?> +
        +LDAP Server Host +"; +?> +
        +LDAP Port +"; +?> +
        +LDAP Domain (DN) +"; +?> +
        +LDAP Username Field +"; +?> +
        +LDAP User ID# Field +"; +?> +
        +LDAP Real Name Field +"; +?> +
        + +
        diff --git a/fannie/install/db.php b/fannie/install/db.php new file mode 100644 index 000000000..c34011660 --- /dev/null +++ b/fannie/install/db.php @@ -0,0 +1,138 @@ + SQLManager object + dbms => type: mysql or mssql probably + db_name => user-defined database name + table_name => table/view to create + stddb => standardized database name for + the sake of file paths + 'op', 'trans', or 'arch' +*/ +function create_if_needed($con,$dbms,$db_name,$table_name,$stddb){ + $ret = array('db'=>$db_name,'struct'=>$table_name,'error'=>0,'error_msg'=>''); + if ($con->table_exists($table_name,$db_name)) return $ret; + + $fn = dirname(__FILE__)."/sql/$stddb/$table_name.php"; + if (!file_exists($fn)){ + $ret['error_msg'] = "Error: no create file for $stddb.$table_name. + File should be: $fn
        "; + $ret['error'] = 1; + return $ret; + } + + include($fn); + if (!isset($CREATE["$stddb.$table_name"])){ + $ret['error_msg'] = "Error: file $fn doesn't have a valid \$CREATE
        "; + $ret['error'] = 2; + return $ret; + } + + $prep = $con->prepare_statement($CREATE["$stddb.$table_name"],$db_name); + $result = $con->exec_statement($prep,array(),$db_name); + if ($result === False){ + $ret['error_msg'] = $con->error($db_name); + $ret['error'] = 3; + } + return $ret; +} + +/* query to create another table with the same + columns +*/ +function duplicate_structure($dbms,$table1,$table2){ + if (strstr($dbms,"MYSQL")){ + return "CREATE TABLE `$table2` LIKE `$table1`"; + } + elseif ($dbms == "MSSQL"){ + return "SELECT * INTO [$table2] FROM [$table1] WHERE 1=0"; + } +} + +function ar_departments(){ + global $FANNIE_AR_DEPARTMENTS; + $ret = preg_match_all("/[0-9]+/",$FANNIE_AR_DEPARTMENTS,$depts); + if ($ret != 0){ + /* AR departments exist */ + $depts = array_pop($depts); + $dlist = "("; + foreach ($depts as $d){ + $dlist .= $d.","; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + return $dlist; + } + return ""; +} + +function equity_departments(){ + global $FANNIE_EQUITY_DEPARTMENTS; + $ret = preg_match_all("/[0-9]+/",$FANNIE_EQUITY_DEPARTMENTS,$depts); + if ($ret != 0){ + /* equity departments exist */ + $depts = array_pop($depts); + $dlist = "("; + foreach ($depts as $d){ + $dlist .= $d.","; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + return $dlist; + } + return ""; +} + +function qualified_names(){ + global $FANNIE_SERVER_DBMS,$FANNIE_OP_DB,$FANNIE_TRANS_DB; + + $ret = array("op"=>$FANNIE_OP_DB,"trans"=>$FANNIE_TRANS_DB); + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $ret["op"] .= ".dbo"; + $ret["trans"] .= ".dbo"; + } + return $ret; +} + +function loaddata($sql, $table){ + global $FANNIE_ROOT; + if (file_exists("{$FANNIE_ROOT}install/sample_data/$table.sql")){ + $fp = fopen("{$FANNIE_ROOT}install/sample_data/$table.sql","r"); + while($line = fgets($fp)){ + $prep = $sql->prepare_statement("INSERT INTO $table VALUES $line"); + $sql->exec_statement($prep); + } + fclose($fp); + } + else if (file_exists("{$FANNIE_ROOT}install/sample_data/$table.csv")){ + $prep = $sql->prepare_statement("LOAD DATA LOCAL INFILE + '{$FANNIE_ROOT}install/sample_data/$table.csv' + INTO TABLE $table + FIELDS TERMINATED BY ',' + ESCAPED BY '\\\\' + OPTIONALLY ENCLOSED BY '\"' + LINES TERMINATED BY '\\r\\n'"); + $sql->exec_statement($prep); + } +} + +?> diff --git a/fannie/install/debug.php b/fannie/install/debug.php new file mode 100644 index 000000000..3e5985801 --- /dev/null +++ b/fannie/install/debug.php @@ -0,0 +1,138 @@ + + + +Fannie Sanity Checks + + +Necessities +      +Authentication +      +Members +      +Stores +      +Sample Data +
        +

        Fannie sanity checks

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; + echo "
        Full path is: ".$FILEPATH.'config.php'."
        "; + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + echo "PHP is running as: ".$chk['name']."
        "; + } + else + echo "PHP is (probably) running as: ".get_current_user()."
        "; +} +?> +
        +PHP Modules Checks
        +MySQL support enabled"; +else + echo "MySQL support missing"; +echo "
        "; +echo '
        MySQL support is only necessary is you have MySQL + servers or lanes
        '; +echo "
        "; +if (function_exists("mssql_connect")) + echo "MSSQL support enabled"; +else + echo "MSSQL support missing"; +echo "
        "; +echo '
        MSSQL support is only necessary is you have MSSQL + servers or lanes
        '; +echo "
        "; +if (function_exists("curl_init")) + echo "cURL support enabled"; +else + echo "cURL support missing"; +echo "
        "; +echo '
        cURL support is used for scheduled, custom lane-server + database syncs. +
        '; +echo "
        "; +if (class_exists("DOMDocument")) + echo "DOM/XML Classes enabled"; +else + echo "DOM/XML Classes missing"; +echo "
        "; +echo '
        DOM Objects are used in some reports to transform output + to proper .xls documents. The Excel option for these reports will not + work without it. +
        '; +echo "
        "; +if (function_exists("ldap_connect")) + echo "LDAP support enabled"; +else + echo "LDAP support missing"; +echo "
        "; +echo '
        Only necessary is authentication is enabled with the + LDAP option. +
        '; +?> +
        +Resolving PHP problems: normally your package manager will install what +you need, but naming conventions aren't strictly identical. Look at PHP +related packages and it's usually pretty straightforward. A package with +both PHP and MySQL in the name probably provides MySQL support. Typically +you'll need to restart Apache after installing new PHP packages. If that doesn't +work, you may need to enable extensions manually in php.ini (typically /etc/php.ini) +and restart Apache again.
        +Show full PHP Installation Info + +
        +Writable directories
        +Upload directories are scattered all over the place for compatibility's sake (sys_get_temp_dir requires +rather new PHP versions). Errors here are only relevant if you use a given feature
        +Logging directory is writable"; +else { + echo "Logging directory is not writeable"; + echo "
        Full path is ".$FILEPATH.'logs/'; +} +echo "
        "; +?> +
        + +
        + + diff --git a/fannie/install/food_net.php b/fannie/install/food_net.php new file mode 100644 index 000000000..28fe66dd9 --- /dev/null +++ b/fannie/install/food_net.php @@ -0,0 +1,141 @@ + + +Necessities +      +Authentication +      +Members +      +Stores +      +Sample Data +
        +

        Fannie install checks

        +"; +} +else + echo "PHP is (probably) running as: ".get_current_user()."
        "; + +if (is_writable($FILEPATH.'config.php')){ + confset('FANNIE_ROOT',"'$FILEPATH'"); + confset('FANNIE_URL',"'$URL'"); + echo "config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +Foodnet DB Server
        +Server Database Host +"; +?> +
        Server Database Type + +
        Server Database Username +"; +?> +
        Server Database Password +"; +?> +
        Server DB name +"; +?> +
        Testing DB connection: +Failed"; +else { + echo "Succeeded"; +} +?> +
        + +
        diff --git a/fannie/install/index.php b/fannie/install/index.php new file mode 100644 index 000000000..5e92d6143 --- /dev/null +++ b/fannie/install/index.php @@ -0,0 +1,1569 @@ + + + +Fannie install checks: Necesseties + + + + + +
        +

        Fannie install checks: Necessities

        +"; +} +else + echo "PHP is (probably) running as: ".get_current_user()."
        "; + +if (is_writable($FILEPATH.'config.php')){ + confset('FANNIE_ROOT',"'$FILEPATH'"); + confset('FANNIE_URL',"'$URL'"); + echo "config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; + echo "
        "; + echo "config.php ({$FILEPATH}config.php) is Fannie's main configuration file."; + echo "
          "; + echo "
        • If this file exists, ensure it is writable by the user running PHP (see above)"; + echo "
        • If the file does not exist, copy config.dist.php ({$FILEPATH}config.dist.php) to config.php"; + echo "
        • If neither file exists, create a new config.php ({$FILEPATH}config.php) containing:"; + echo "
        "; + echo "
        +<?php
        +?>
        +	
        "; + echo "
        "; + echo ''; + echo "
        "; + exit; +} + +/** + Detect databases that are supported +*/ +$supportedTypes = array(); +if (extension_loaded('pdo') && extension_loaded('pdo_mysql')) + $supportedTypes['PDO_MYSQL'] = 'PDO MySQL'; +if (extension_loaded('mysqli')) + $supportedTypes['MYSQLI'] = 'MySQLi'; +if (extension_loaded('mysql')) + $supportedTypes['MYSQL'] = 'MySQL'; +if (extension_loaded('mssql')) + $supportedTypes['MSSQL'] = 'MSSQL'; + +if (count($supportedTypes) == 0){ + echo "Error: no database driver available"; + echo "
        "; + echo 'Install at least one of the following PHP extensions: pdo_mysql, mysqli, mysql, + or mssql. If you installed one or more of these and are still seeing this + error, make sure they are enabled in your PHP configuration and try + restarting your web server.'; + echo "
        "; + exit; +} +$defaultDbType = array_shift(array_keys($supportedTypes)); + +?> +
        +Main Server
        +Server Database Host +"; +?> +
        Server Database Type + +
        Server Database Username +"; +?> +
        Server Database Password +"; +?> +
        Server Operational DB name +"; +?> +
        Server Transaction DB name +"; +?> +
        Testing Operational DB connection: +Failed"; +else { + echo "Succeeded"; + $msgs = create_op_dbs($sql); + $createdOps = True; + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + + // create auth tables later than the original + // setting in case db settings were wrong + if (isset($FANNIE_AUTH_ENABLED) && $FANNIE_AUTH_ENABLED === True){ + include($FILEPATH.'auth/utilities.php'); + table_check(); + } +} +?> +
        Testing Transaction DB connection: +Failed"; +else { + echo "Succeeded"; + $msgs = create_trans_dbs($sql); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + $msgs = create_dlogs($sql); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + $createdTrans = True; +} +if ($createdOps && $createdTrans){ + $msgs = create_delayed_dbs(); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } +} +?> +
        +Transaction archiving
        +Archive DB name: +"; +?> +
        Archive Method: +
        "; +?> +
        Use a different DB server for archives +
        "; +if ($FANNIE_ARCHIVE_REMOTE === True || $FANNIE_ARCHIVE_REMOTE == 'Yes'){ +if ($FANNIE_ARCHIVE_DB == $FANNIE_TRANS_DB){ + echo "
        Warning: using the same name for the archive database + and the main transaction database will probably cause problems
        "; +} +?> +
        Archive DB Server +"; +?> +
        Archive DB type + +
        Archive DB username +"; +?> +
        Archive DB password +"; +} +else { + //local archiving - set up now + echo "
        Testing Transaction DB connection:"; + $sql = db_test_connect($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_ARCHIVE_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + if ($sql === False) + echo "Failed"; + else { + echo "Succeeded"; + $msgs = create_archive_dbs($sql); + foreach($msgs as $msg){ + if ($msg['error'] == 0) continue; + echo $msg['error_msg'].'
        '; + } + } +} +?> +
        +Database Backups
        +Backup Directory +
        "; +if (is_writable($FANNIE_BACKUP_PATH)){ + echo "Backup directory is writeable"; +} +else { + echo "Error: backup directory is not writeable"; +} +?> +
        +Path to mysqldump +
        "; +if (is_executable(realpath($FANNIE_BACKUP_BIN."/mysqldump"))){ + echo "Found mysqldump program"; +} +else { + echo "Error: mysqldump not found"; +} +?> +
        +Number of backups +
        "; +?> +
        +Compress backups + +
        +Lanes: +"; +?> +
        + + +"; +for($i=0; $i<$FANNIE_NUM_LANES;$i++){ + echo ""; +} +echo "
        "; + +$conf = 'array('; +for($i=0; $i<$FANNIE_NUM_LANES; $i++){ + $style = ($i == 0)?'block':'none'; + echo "
        "; + if (!isset($FANNIE_LANES[$i])) $FANNIE_LANES[$i] = array(); + $conf .= 'array('; + + if (!isset($FANNIE_LANES[$i]['host'])) $FANNIE_LANES[$i]['host'] = '127.0.0.1'; + if (isset($_REQUEST["LANE_HOST_$i"])){ $FANNIE_LANES[$i]['host'] = $_REQUEST["LANE_HOST_$i"]; } + $conf .= "'host'=>'{$FANNIE_LANES[$i]['host']}',"; + echo "Lane ".($i+1)." Database Host:
        "; + + if (!isset($FANNIE_LANES[$i]['type'])) $FANNIE_LANES[$i]['type'] = $defaultDbType; + if (isset($_REQUEST["LANE_TYPE_$i"])) $FANNIE_LANES[$i]['type'] = $_REQUEST["LANE_TYPE_$i"]; + $conf .= "'type'=>'{$FANNIE_LANES[$i]['type']}',"; + echo "Lane ".($i+1)." Database Type:
        "; + + if (!isset($FANNIE_LANES[$i]['user'])) $FANNIE_LANES[$i]['user'] = 'root'; + if (isset($_REQUEST["LANE_USER_$i"])) $FANNIE_LANES[$i]['user'] = $_REQUEST["LANE_USER_$i"]; + $conf .= "'user'=>'{$FANNIE_LANES[$i]['user']}',"; + echo "Lane ".($i+1)." Database Username:
        "; + + if (!isset($FANNIE_LANES[$i]['pw'])) $FANNIE_LANES[$i]['pw'] = ''; + if (isset($_REQUEST["LANE_PW_$i"])) $FANNIE_LANES[$i]['pw'] = $_REQUEST["LANE_PW_$i"]; + $conf .= "'pw'=>'{$FANNIE_LANES[$i]['pw']}',"; + echo "Lane ".($i+1)." Database Password:
        "; + + if (!isset($FANNIE_LANES[$i]['op'])) $FANNIE_LANES[$i]['op'] = 'opdata'; + if (isset($_REQUEST["LANE_OP_$i"])) $FANNIE_LANES[$i]['op'] = $_REQUEST["LANE_OP_$i"]; + $conf .= "'op'=>'{$FANNIE_LANES[$i]['op']}',"; + echo "Lane ".($i+1)." Operational DB:
        "; + + if (!isset($FANNIE_LANES[$i]['trans'])) $FANNIE_LANES[$i]['trans'] = 'translog'; + if (isset($_REQUEST["LANE_TRANS_$i"])) $FANNIE_LANES[$i]['trans'] = $_REQUEST["LANE_TRANS_$i"]; + $conf .= "'trans'=>'{$FANNIE_LANES[$i]['trans']}'"; + echo "Lane ".($i+1)." Transaction DB:
        "; + + $conf .= ")"; + echo "
        "; + + if ($i == $FANNIE_NUM_LANES - 1) + $conf .= ")"; + else + $conf .= ","; +} +confset('FANNIE_LANES',$conf); + +} +?> +Edit Global Lane Configuration +
        +Color-Highlighted Logs: +'; +if ($FANNIE_PRETTY_LOGS == 0){ + echo ''; + echo ''; +} +else { + echo ''; + echo ''; +} +echo ''; +?> +
        +Log Rotation Count: +"; +echo "
        "; +?> +
        +Scales: +"; +echo "
        "; +if (is_writable($FANNIE_ROOT.'item/hobartcsv/csvfiles')) + echo "item/hobartcsv/csvfiles is writeable"; +else + echo "item/hobartcsv/csvfiles is not writeable"; +echo "
        "; +if (is_writable($FANNIE_ROOT.'item/hobartcsv/csv_output')) + echo "item/hobartcsv/csv_output is writeable"; +else + echo "item/hobartcsv/csv_output is not writeable"; +?> +
        + + +"; +for($i=0; $i<$FANNIE_NUM_SCALES;$i++) + echo ""; +echo "
        "; + +$conf = 'array('; +for($i=0; $i<$FANNIE_NUM_SCALES; $i++){ + $style = ($i == 0)?'block':'none'; + echo "
        "; + if (!isset($FANNIE_SCALES[$i])) $FANNIE_SCALES[$i] = array(); + $conf .= 'array('; + + if (!isset($FANNIE_SCALES[$i]['host'])) $FANNIE_SCALES[$i]['host'] = ''; + if (isset($_REQUEST["SCALE_HOST_$i"])){ $FANNIE_SCALES[$i]['host'] = $_REQUEST["SCALE_HOST_$i"]; } + $conf .= "'host'=>'{$FANNIE_SCALES[$i]['host']}',"; + echo "Scale ".($i+1)." IP:
        "; + + if (!isset($FANNIE_SCALES[$i]['type'])) $FANNIE_SCALES[$i]['type'] = 'QUANTUMTCP'; + if (isset($_REQUEST["SCALE_TYPE_$i"])){ $FANNIE_SCALES[$i]['type'] = $_REQUEST["SCALE_TYPE_$i"]; } + $conf .= "'type'=>'{$FANNIE_SCALES[$i]['type']}',"; + echo "Scale ".($i+1)." Type:
        "; + + if (!isset($FANNIE_SCALES[$i]['dept'])) $FANNIE_SCALES[$i]['dept'] = ''; + if (isset($_REQUEST["SCALE_DEPT_$i"])){ $FANNIE_SCALES[$i]['dept'] = $_REQUEST["SCALE_DEPT_$i"]; } + $conf .= "'dept'=>'{$FANNIE_SCALES[$i]['dept']}'"; + echo "Scale ".($i+1)." Department:
        "; + + $conf .= ")"; + echo "
        "; + + if ($i == $FANNIE_NUM_SCALES - 1) + $conf .= ")"; + else + $conf .= ","; +} +confset('FANNIE_SCALES',$conf); +} +?> + +
        +Co-op +
        Use this to identify code that is specific to your co-op. +
        Particularly important if you plan to contribute to the CORE IT code base. +
        Try to use a code that will not be confused with any other, e.g. "WEFC_Toronto" instead of "WEFC". +
        Co-op ID: +",$FANNIE_COOP_ID); +?> + +
        +Locale
        +Set the Country and Language where Fannie will run. +
        If these are not set in Fannie configuration but are set in the Linux environment the environment values will be used as +defaults that can be overridden by settings here. + +
        Country
        + + + +
        Language
        + +
        + +
        + + + +table_exists('InvDelivery',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invCur,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invCur = "CREATE TABLE InvDeliveryLM ( + inv_date datetime, + upc varchar(13), + vendor_id int, + quantity double, + price float)"; + if (!$con->table_exists('InvDeliveryLM',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invCur,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invArc = "CREATE TABLE InvDeliveryArchive ( + inv_date datetime, + upc varchar(13), + vendor_id int, + quantity double, + price float, + INDEX(upc))"; + if (!$con->table_exists('InvDeliveryArchive',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invArc,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invRecent = "CREATE VIEW InvRecentOrders AS + SELECT inv_date,upc,sum(quantity) as quantity, + sum(price) as price + FROM InvDelivery GROUP BY inv_date,upc + UNION ALL + SELECT inv_date,upc,sum(quantity) as quantity, + sum(price) as price + FROM InvDeliveryLM GROUP BY inv_date,upc"; + if (!$con->table_exists('InvRecentOrders',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invRecent,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $union = "CREATE VIEW InvDeliveryUnion AS + select upc,vendor_id,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDelivery + GROUP BY upc,vendor_id + UNION ALL + select upc,vendor_id,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDeliveryLM + GROUP BY upc,vendor_id + UNION ALL + select upc,vendor_id,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDeliveryArchive + GROUP BY upc,vendor_id"; + if (!$con->table_exists("InvDeliveryUnion",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($union,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $total = "CREATE VIEW InvDeliveryTotals AS + select upc,sum(quantity) as quantity, + sum(price) as price,max(inv_date) as inv_date + FROM InvDeliveryUnion + GROUP BY upc"; + if (!$con->table_exists("InvDeliveryTotals",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($total,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_backup','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'AR_EOM_Summary','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'lane_config','trans'); + + return $ret; +} + +function create_dlogs($con){ + global $FANNIE_TRANS_DB, $FANNIE_SERVER_DBMS, $FANNIE_AR_DEPARTMENTS, $FANNIE_EQUITY_DEPARTMENTS, $FANNIE_OP_DB; + + $ret = array(); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dtransactions','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'transarchive','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'suspended','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderID','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderDeptMap','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderContact','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderNotes','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderHistory','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'SpecialOrderStatus','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'PendingSpecialOrder','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'CompleteSpecialOrder','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dlog','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dlog_90_view','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dlog_15','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'suspendedtoday','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'TenderTapeGeneric','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'rp_dt_receipt_90','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'rp_receipt_header_90','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_live_balance','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_sum','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockpurchases','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSum_purch','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSumToday','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'newBalanceStockToday_test','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'memChargeBalance','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'unpaid_ar_balances','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'unpaid_ar_today','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dheader','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dddItems','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'CashPerformDay','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'CashPerformDay_cache','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'houseCouponThisMonth','trans'); + + return $ret; +} + +function create_delayed_dbs(){ + global $FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW,$FANNIE_OP_DB,$FANNIE_TRANS_DB; + + $ret = array(); + + $con = db_test_connect($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_OP_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + 'expingMems','op'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + 'expingMems_thisMonth','op'); + + $con = db_test_connect($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_TRANS_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today_sum','trans'); + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'AR_statementHistory','trans'); + + $invSalesView = "CREATE VIEW InvSales AS + select datetime as inv_date,upc,quantity,total as price + FROM transarchive WHERE ".$con->monthdiff($con->now(),'datetime')." <= 1 + AND scale=0 AND trans_status NOT IN ('X','R') + AND trans_type = 'I' AND trans_subtype <> '0' + AND register_no <> 99 AND emp_no <> 9999"; + if (!$con->table_exists("InvSales",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invSalesView,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invRecentSales = "CREATE VIEW InvRecentSales AS + select t.upc, + max(t.inv_date) as mostRecentOrder, + sum(CASE WHEN s.quantity IS NULL THEN 0 ELSE s.quantity END) as quantity, + sum(CASE WHEN s.price IS NULL THEN 0 ELSE s.price END) as price + from InvDeliveryTotals as t + left join InvSales as s + on t.upc=s.upc and + ".$con->datediff('s.inv_date','t.inv_date')." >= 0 + group by t.upc"; + if (!$con->table_exists("InvRecentSales",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invRecentSales,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $invSales = "CREATE TABLE InvSalesArchive ( + inv_date datetime, + upc varchar(13), + quantity double, + price float, + INDEX(upc))"; + if (!$con->table_exists('InvSalesArchive',$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($invSales,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $union = "CREATE VIEW InvSalesUnion AS + select upc,sum(quantity) as quantity, + sum(price) as price + FROM InvSales + WHERE ".$con->monthdiff($con->now(),'inv_date')." = 0 + GROUP BY upc + UNION ALL + select upc,sum(quantity) as quantity, + sum(price) as price + FROM InvSalesArchive + GROUP BY upc"; + if (!$con->table_exists("InvSalesUnion",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($union,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $total = "CREATE VIEW InvSalesTotals AS + select upc,sum(quantity) as quantity, + sum(price) as price + FROM InvSalesUnion + GROUP BY upc"; + if (!$con->table_exists("InvSalesTotals",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($total,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $adj = "CREATE TABLE InvAdjustments ( + inv_date datetime, + upc varchar(13), + diff double, + INDEX(upc))"; + if (!$con->table_exists("InvAdjustments",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($adj,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $adjTotal = "CREATE VIEW InvAdjustTotals AS + SELECT upc,sum(diff) as diff,max(inv_date) as inv_date + FROM InvAdjustments + GROUP BY upc"; + if (!$con->table_exists("InvAdjustTotals",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($adjTotal,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $opstr = $FANNIE_OP_DB; + if ($FANNIE_SERVER_DBMS=="mssql") $opstr .= ".dbo"; + $inv = "CREATE VIEW Inventory AS + SELECT d.upc, + d.quantity AS OrderedQty, + CASE WHEN s.quantity IS NULL THEN 0 + ELSE s.quantity END AS SoldQty, + CASE WHEN a.diff IS NULL THEN 0 + ELSE a.diff END AS Adjustments, + CASE WHEN a.inv_date IS NULL THEN '1900-01-01' + ELSE a.inv_date END AS LastAdjustDate, + d.quantity - CASE WHEN s.quantity IS NULL + THEN 0 ELSE s.quantity END + CASE WHEN + a.diff IS NULL THEN 0 ELSE a.diff END + AS CurrentStock + FROM InvDeliveryTotals AS d + INNER JOIN $opstr.vendorItems AS v + ON d.upc = v.upc + LEFT JOIN InvSalesTotals AS s + ON d.upc = s.upc LEFT JOIN + InvAdjustTotals AS a ON d.upc=a.upc"; + if (!$con->table_exists("Inventory",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($inv,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + $cache = "CREATE TABLE InvCache ( + upc varchar(13), + OrderedQty int, + SoldQty int, + Adjustments int, + LastAdjustDate datetime, + CurrentStock int)"; + if (!$con->table_exists("InvCache",$FANNIE_TRANS_DB)){ + $prep = $con->prepare_statement($cache,$FANNIE_TRANS_DB); + $con->exec_statement($prep,array(),$FANNIE_TRANS_DB); + } + + return $ret; +} + +function create_archive_dbs($con) { + global $FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB,$FANNIE_ARCHIVE_DB,$FANNIE_ARCHIVE_METHOD; + + $ret = array(); + + $dstr = date("Ym"); + $archive = "transArchive".$dstr; + $dbconn = "."; + if ($FANNIE_SERVER_DBMS == "MSSQL") + $dbconn = ".dbo."; + + if ($FANNIE_ARCHIVE_METHOD == "partitions") + $archive = "bigArchive"; + + $query = "CREATE TABLE $archive LIKE + {$FANNIE_TRANS_DB}{$dbconn}dtransactions"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $query = "SELECT TOP 1 * INTO $archive FROM + {$FANNIE_TRANS_DB}{$dbconn}dtransactions"; + } + if (!$con->table_exists($archive,$FANNIE_ARCHIVE_DB)){ + $create = $con->prepare_statement($query,$FANNIE_ARCHIVE_DB); + $con->exec_statement($create,array(),$FANNIE_ARCHIVE_DB); + // create the first partition if needed + if ($FANNIE_ARCHIVE_METHOD == "partitions"){ + $p = "p".date("Ym"); + $limit = date("Y-m-d",mktime(0,0,0,date("n")+1,1,date("Y"))); + $partQ = sprintf("ALTER TABLE `bigArchive` + PARTITION BY RANGE(TO_DAYS(`datetime`)) + (PARTITION %s + VALUES LESS THAN (TO_DAYS('%s')) + )",$p,$limit); + $prep = $dbc->prepare_statement($partQ); + $con->exec_statement($prep); + } + } + + $dlogView = "select + `$archive`.`datetime` AS `tdate`, + `$archive`.`register_no` AS `register_no`, + `$archive`.`emp_no` AS `emp_no`, + `$archive`.`trans_no` AS `trans_no`, + `$archive`.`upc` AS `upc`, + `$archive`.`trans_type` AS `trans_type`, + `$archive`.`trans_subtype` AS `trans_subtype`, + `$archive`.`trans_status` AS `trans_status`, + `$archive`.`department` AS `department`, + `$archive`.`quantity` AS `quantity`, + `$archive`.`unitPrice` AS `unitPrice`, + `$archive`.`total` AS `total`, + `$archive`.`tax` AS `tax`, + `$archive`.`foodstamp` AS `foodstamp`, + `$archive`.`ItemQtty` AS `itemQtty`, + `$archive`.`card_no` AS `card_no`, + `$archive`.`trans_id` AS `trans_id` + from `$archive` + where + ((`$archive`.`trans_status` <> 'D') + and + (`$archive`.`trans_status` <> 'X'))"; + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $dlogView = "SELECT + datetime AS tdate, + register_no, + emp_no, + trans_no, + upc, + trans_type, + trans_subtype, + trans_status, + department, + quantity, + unitPrice, + total, + tax, + foodstamp, + ItemQtty, + card_no, + trans_id + FROM $archive + WHERE trans_status NOT IN ('D','X')"; + } + + $dlog_view = ($FANNIE_ARCHIVE_METHOD != "partitions") ? "dlog".$dstr : "dlogBig"; + if (!$con->table_exists($dlog_view,$FANNIE_ARCHIVE_DB)){ + $prep = $con->prepare_statement("CREATE VIEW $dlog_view AS $dlogView", + $FANNIE_ARCHIVE_DB); + $con->exec_statement($prep,array(),$FANNIE_ARCHIVE_DB); + } + + $rp_dt_view = ($FANNIE_ARCHIVE_METHOD != "partitions") ? "rp_dt_receipt_".$dstr : "rp_dt_receipt_big"; + $rp1Q = "CREATE view $rp_dt_view as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char), ' @ ', convert(Volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char), ' /', convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num + + from $archive + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $rp1Q = "CREATE view $rp_dt_view as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + + end + as comment, + total, + + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num + + from $archive + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + } + if (!$con->table_exists($rp_dt_view,$FANNIE_ARCHIVE_DB)){ + $prep = $con->prepare_statement($rp1Q,$FANNIE_ARCHIVE_DB); + $con->exec_statement($prep,array(),$FANNIE_ARCHIVE_DB); + } + + $rp_view = ($FANNIE_ARCHIVE_METHOD != "partitions") ? "rp_receipt_header_".$dstr : "rp_receipt_header_big"; + $rp2Q = "create view $rp_view as + select + datetime as dateTimeStamp, + card_no as memberID, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num, + register_no, + emp_no, + trans_no, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discounttype = 2 then memDiscount else 0 end),decimal(10,2)) as memSpecial, + convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, + convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from $archive + group by register_no, emp_no, trans_no, card_no, datetime"; + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $rp2Q = "create view $rp_view as + select + datetime as dateTimeStamp, + card_no as memberID, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num, + register_no, + emp_no, + trans_no, + convert(numeric(10,2), sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2), sum(case when discounttype = 2 then memDiscount else 0 end)) as memSpecial, + convert(numeric(10,2), sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, + convert(numeric(10,2), sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + + from $archive + group by register_no, emp_no, trans_no, card_no, datetime"; + } + if (!$con->table_exists($rp_view,$FANNIE_ARCHIVE_DB)){ + $prep = $con->prepare_statement($rp2Q,$FANNIE_ARCHIVE_DB); + $con->exec_statement($prep,array(),$FANNIE_ARCHIVE_DB); + } + + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumUpcSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumRingSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'vRingSalesToday','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumDeptSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'vDeptSalesToday','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumFlaggedSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumMemSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumMemTypeSalesByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumTendersByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'sumDiscountsByDay','arch'); + $ret[] = create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + 'reportDataCache','arch'); + return $ret; +} + +?> diff --git a/fannie/install/lane_config/extra_config.php b/fannie/install/lane_config/extra_config.php new file mode 100644 index 000000000..cb1c22db1 --- /dev/null +++ b/fannie/install/lane_config/extra_config.php @@ -0,0 +1,389 @@ + + + +Lane Global: Extra configuration options + + + + + + +
        +

        IT CORE Lane Global Configuration: Additional Configuration

        +Browser only:
        +If Yes, the "exit" button on the login screen attempts to close the window. +
        +Store: +get('store')==="") $CORE_LOCAL->set('store','utopia'); +if (isset($_REQUEST['STORE'])) $CORE_LOCAL->set('store',$_REQUEST['STORE']); +printf("",$CORE_LOCAL->get('store')); +confsave('store',"'".$CORE_LOCAL->get('store')."'"); +?> +
        +In theory, any hard-coded, store specific sequences should be blocked +off based on the store setting. Adherence to this principle is less than +ideal. +
        +Discounts enabled:
        +If yes, members get a percentage discount as specified in custdata. +
        +Line Item Discount (member): +get('LineItemDiscountMem')==="") $CORE_LOCAL->set('LineItemDiscountMem','0'); +if(isset($_REQUEST['LD_MEM'])) $CORE_LOCAL->set('LineItemDiscountMem',$_REQUEST['LD_MEM']); +printf("",$CORE_LOCAL->get('LineItemDiscountMem')); +confsave('LineItemDiscountMem',"'".$CORE_LOCAL->get('LineItemDiscountMem')."'"); +?> +(percentage; 0.05 => 5%) +
        +Line Item Discount (non-member): +get('LineItemDiscountNonMem')==="") $CORE_LOCAL->set('LineItemDiscountNonMem','0'); +if(isset($_REQUEST['LD_NONMEM'])) $CORE_LOCAL->set('LineItemDiscountNonMem',$_REQUEST['LD_NONMEM']); +printf("",$CORE_LOCAL->get('LineItemDiscountNonMem')); +confsave('LineItemDiscountNonMem',"'".$CORE_LOCAL->get('LineItemDiscountNonMem')."'"); +?> +(percentage; 0.05 => 5%) +
        +Lock screen on idle: +
        +Default Non-member #: +get('defaultNonMem')==="") $CORE_LOCAL->set('defaultNonMem','11'); +if(isset($_REQUEST['NONMEM'])) $CORE_LOCAL->set('defaultNonMem',$_REQUEST['NONMEM']); +printf("",$CORE_LOCAL->get('defaultNonMem')); +confsave('defaultNonMem',"'".$CORE_LOCAL->get('defaultNonMem')."'"); +?> +
        +Normally a single account number is used for most if not all non-member +transactions. Specify that account number here. +
        +Visiting Member #: +get('visitingMem')==="") $CORE_LOCAL->set('visitingMem','9'); +if(isset($_REQUEST['VISMEM'])) $CORE_LOCAL->set('visitingMem',$_REQUEST['VISMEM']); +printf("",$CORE_LOCAL->get('visitingMem')); +confsave('visitingMem',"'".$CORE_LOCAL->get('visitingMem')."'"); +?> +
        +This account provides members of other co-ops with member pricing +but no other benefits. Leave blank to disable. +
        +Show non-member account in searches: +
        +Allow members to write checks over purchase amount:
        +Check over limit: $ +get('dollarOver')==="") $CORE_LOCAL->set('dollarOver','0'); +if(isset($_REQUEST['OVER_LIMIT'])) $CORE_LOCAL->set('dollarOver',$_REQUEST['OVER_LIMIT']); +printf("",$CORE_LOCAL->Get('dollarOver')); +confsave('dollarOver',$CORE_LOCAL->get('dollarOver')); +?> +
        +Enable receipts:
        +Use new receipt:
        +The new receipt groups items by category; the old one just lists +them in order.
        +Printer port: +get('printerPort')==="") $CORE_LOCAL->set('printerPort','fake.txt'); +if(isset($_REQUEST['PPORT'])) $CORE_LOCAL->set('printerPort',$_REQUEST['PPORT']); +printf("",$CORE_LOCAL->get('printerPort')); +confsave('printerPort',"'".$CORE_LOCAL->get('printerPort')."'"); +?> +
        +Path to the printer. Common ports are LPT1: (windows) and /dev/lp0 (linux). +Can also print to a text file if it's just a regular file name. +
        +Scanner/scale port: +get('scalePort')==="") $CORE_LOCAL->set('scalePort',''); +if(isset($_REQUEST['SPORT'])) $CORE_LOCAL->set('scalePort',$_REQUEST['SPORT']); +printf("",$CORE_LOCAL->get('scalePort')); +confsave('scalePort',"'".$CORE_LOCAL->get('scalePort')."'"); +?> +
        +Path to the scanner scale. Common values are COM1 (windows) and /dev/ttyS0 (linux). +
        +Scanner/scale driver: +get('scaleDriver')==="") $CORE_LOCAL->set('scaleDriver','NewMagellan'); +if(isset($_REQUEST['SDRIVER'])) $CORE_LOCAL->set('scaleDriver',$_REQUEST['SDRIVER']); +printf("",$CORE_LOCAL->get('scaleDriver')); +confsave('scaleDriver',"'".$CORE_LOCAL->get('scaleDriver')."'"); +?> +
        +The name of your scale driver. Known good values include "ssd" and "NewMagellan". +
        +Alert Bar:
        +get('alertBar')==="") $CORE_LOCAL->set('alertBar','Warning!'); +if (isset($_REQUEST['ALERT'])) $CORE_LOCAL->set('alertBar',$_REQUEST['ALERT']); +printf("",$CORE_LOCAL->get('alertBar')); +confsave('alertBar',"'".$CORE_LOCAL->get('alertBar')."'"); +?> +
        +Footer Modules (left to right):
        +get("FooterModules"); +// replace w/ form post if needed +// fill in defaults if missing +if (isset($_REQUEST['FOOTER_MODS'])) $current_mods = $_REQUEST['FOOTER_MODS']; +elseif(!is_array($current_mods) || count($current_mods) != 5){ + $current_mods = array( + 'SavedOrCouldHave', + 'TransPercentDiscount', + 'MemSales', + 'EveryoneSales', + 'MultiTotal' + ); +} +$dh = opendir($CORE_PATH.'lib/FooterBoxes/'); +while(False !== ($f = readdir($dh))){ + if ($f == "." || $f == "..") + continue; + if (substr($f,-4) == ".php"){ + $footer_mods[] = rtrim($f,".php"); + } +} +for($i=0;$i<5;$i++){ + echo '
        '; +} +$saveStr = "array("; +foreach($current_mods as $m) + $saveStr .= "'".$m."',"; +$saveStr = rtrim($saveStr,",").")"; +confsave('FooterModules',$saveStr); +?> +
        +Enable onscreen keys:
        +Separate customer display:
        +Touchscreen keys and menus really don't need to appear on +the customer-facing display. Experimental feature where one +window always shows the item listing. Very alpha. +
        +Integrated card processing configuration is included for the sake +of completeness. The modules themselves require individual configuration, +too
        +Integrated Credit Cards:
        +Integrated Gift Cards:
        +Enabled paycard modules:
        +
        +Signature Required Limit: +set('CCSigLimit',$_REQUEST['CCSigLimit']); +if ($CORE_LOCAL->get('CCSigLimit')=="") $CORE_LOCAL->set('CCSigLimit',0.00); +printf(" \$",$CORE_LOCAL->get('CCSigLimit')); +confsave('CCSigLimit',$CORE_LOCAL->get('CCSigLimit')); +?> +
        Signature Capture Device: +get('SigCapture')=="") $CORE_LOCAL->set('SigCapture',''); +if (isset($_REQUEST['SigCapture'])) $CORE_LOCAL->set('SigCapture',$_REQUEST['SigCapture']); +printf("
        ",$CORE_LOCAL->get('SigCapture')); +confsave('SigCapture',"'".$CORE_LOCAL->get('SigCapture')."'"); +?> +(blank for none) +
        + +
        + + diff --git a/fannie/install/lane_config/index.php b/fannie/install/lane_config/index.php new file mode 100644 index 000000000..17061788e --- /dev/null +++ b/fannie/install/lane_config/index.php @@ -0,0 +1,182 @@ + + + +IT CORE Lane Global Configuration + + + + + + +
        +

        IT CORE Lane Global Configuration: Necessities

        + +

        +Use these forms for values that will be used on all lanes. +
        To install, on each lane: $LANE/install/   >   "Upgrade ini.php via server" +
        That only installs changes made here (Fannie) since the last time it was run on the lane. +
        The first time it is run it will probably overwrite everything in ini.php, +
        including config done locally with $LANE/install/*.php +
        22Sep12 Eric Lee In my first try at this nothing in $LANE/ini.php was changed, no reason given. +
        I will see about making util.confsave() return more informative failure messages. +

        + +

        Basics

        +OS:
        +
        +

        Database set up

        +Lane database host: +set('localhost',$_REQUEST['LANE_HOST']); +if ($CORE_LOCAL->get('localhost')=="") $CORE_LOCAL->set('localhost','127.0.0.1'); +printf("", + $CORE_LOCAL->get('localhost')); +confsave('localhost',"'".$CORE_LOCAL->get('localhost')."'"); +?> +
        +Lane database type: +
        +Lane user name: +set('localUser',$_REQUEST['LANE_USER']); +if ($CORE_LOCAL->get('localUser')=="") $CORE_LOCAL->set('localUser','root'); +printf("", + $CORE_LOCAL->get('localUser')); +confsave('localUser',"'".$CORE_LOCAL->get('localUser')."'"); +?> +
        +Lane password: +set('localPass',$_REQUEST['LANE_PASS']); +printf("", + $CORE_LOCAL->get('localPass')); +confsave('localPass',"'".$CORE_LOCAL->get('localPass')."'"); +?> +
        +Lane operational DB: +set('pDatabase',$_REQUEST['LANE_OP_DB']); +if ($CORE_LOCAL->get('pDatabase')=="") $CORE_LOCAL->set('pDatabase','opdata'); +printf("", + $CORE_LOCAL->get('pDatabase')); +confsave('pDatabase',"'".$CORE_LOCAL->get('pDatabase')."'"); +?> +
        +Lane transaction DB: +set('tDatabase',$_REQUEST['LANE_TRANS_DB']); +if ($CORE_LOCAL->get('pDatabase')=="") $CORE_LOCAL->set('pDatabase','translog'); +printf("", + $CORE_LOCAL->get('tDatabase')); +confsave('tDatabase',"'".$CORE_LOCAL->get('tDatabase')."'"); +?> +
        +Server database host: +set('mServer',$_REQUEST['SERVER_HOST']); +if ($CORE_LOCAL->get('mServer')=="") $CORE_LOCAL->set('mServer','127.0.0.1'); +printf("", + $CORE_LOCAL->get('mServer')); +confsave('mServer',"'".$CORE_LOCAL->get('mServer')."'"); +?> +
        +Server database type: +
        +Server user name: +set('mUser',$_REQUEST['SERVER_USER']); +if ($CORE_LOCAL->get('mUser')=="") $CORE_LOCAL->set('mUser','root'); +printf("", + $CORE_LOCAL->get('mUser')); +confsave('mUser',"'".$CORE_LOCAL->get('mUser')."'"); +?> +
        +Server password: +set('mPass',$_REQUEST['SERVER_PASS']); +printf("", + $CORE_LOCAL->get('mPass')); +confsave('mPass',"'".$CORE_LOCAL->get('mPass')."'"); +?> +
        +Server database name: +set('mDatabase',$_REQUEST['SERVER_DB']); +if ($CORE_LOCAL->get('mDatabase')=="") $CORE_LOCAL->set('mDatabase','core_trans'); +printf("", + $CORE_LOCAL->get('mDatabase')); +confsave('mDatabase',"'".$CORE_LOCAL->get('mDatabase')."'"); +?> +
        + +
        + diff --git a/fannie/install/lane_config/ini.php b/fannie/install/lane_config/ini.php new file mode 100644 index 000000000..7278771cc --- /dev/null +++ b/fannie/install/lane_config/ini.php @@ -0,0 +1,59 @@ +CL = array(); + } + function get($k){ + return (isset($this->CL["$k"])) ? $this->CL["$k"] : ""; + } + function set($k,$v){ + $this->CL["$k"] = $v; + } +} + +function confsave($k,$v){ + global $dbc; + if (is_string($v)) + $v = trim($v,"'"); + $p = $dbc->prepare_statement("SELECT value FROM lane_config WHERE keycode=?"); + $r = $dbc->exec_statement($p,array($k)); + if ($dbc->num_rows($r)==0){ + $insP = $dbc->prepare_statement('INSERT INTO lane_config (keycode, value, + modified) VALUES (?, ?, '.$dbc->now().')'); + $dbc->exec_statement($insP,array($k,serialize($v))); + } + else { + $current = array_pop($dbc->fetch_row($r)); + if ($v !== unserialize($current)){ + $upP = $dbc->prepare_statement('UPDATE lane_config SET value=?, + modified='.$dbc->now().' WHERE keycode=?'); + $dbc->exec_statement($upP, array(serialize($v),$k)); + } + } +} + +$CORE_LOCAL = new cl_wrapper(); + +$q = $dbc->prepare_statement("SELECT keycode,value FROM lane_config"); +$r = $dbc->exec_statement($q); +while($w = $dbc->fetch_row($r)){ + $k = $w['keycode']; + $v = unserialize($w['value']); + $CORE_LOCAL->set($k,$v); +} + +?> diff --git a/fannie/install/lane_config/scanning.php b/fannie/install/lane_config/scanning.php new file mode 100644 index 000000000..56ed3fdac --- /dev/null +++ b/fannie/install/lane_config/scanning.php @@ -0,0 +1,175 @@ + + + +Lane Global: Scanning options + + + + + + +
        +

        IT CORE Lane Global Configuration: Scanning Options

        +Special handling modules for UPCs that aren't +products (e.g., coupons)
        +Special UPCs:
        +
        +
        +Discount type modules control how sale prices +are calculated.
        +Number of Discounts: +set('DiscountTypeCount',$_REQUEST['DT_COUNT']); +if ($CORE_LOCAL->get("DiscountTypeCount") == "") $CORE_LOCAL->set("DiscountTypeCount",5); +if ($CORE_LOCAL->get("DiscountTypeCount") <= 0) $CORE_LOCAL->set("DiscountTypeCount",1); +printf("", + $CORE_LOCAL->get('DiscountTypeCount')); +confsave('DiscountTypeCount',$CORE_LOCAL->get('DiscountTypeCount')); +?> +
        Discount Module Mapping:
        +set('DiscountTypeClasses',$_REQUEST['DT_MODS']); +if (!is_array($CORE_LOCAL->get('DiscountTypeClasses'))){ + $CORE_LOCAL->set('DiscountTypeClasses', + array( + 'NormalPricing', + 'EveryoneSale', + 'MemberSale', + 'CaseDiscount', + 'StaffSale' + )); +} +$discounts = array(); +$dh = opendir($CORE_PATH.'lib/Scanning/DiscountTypes'); +while($dh && False !== ($f = readdir($dh))){ + if ($f == "." || $f == "..") + continue; + if (substr($f,-4) == ".php"){ + $discounts[] = rtrim($f,".php"); + } +} +$dt_conf = $CORE_LOCAL->get("DiscountTypeClasses"); +for($i=0;$i<$CORE_LOCAL->get('DiscountTypeCount');$i++){ + echo "[$i] => "; + echo "
        "; +} +$saveStr = "array("; +$tmp_count = 0; +foreach($CORE_LOCAL->get("DiscountTypeClasses") as $r){ + $saveStr .= "'".$r."',"; + if ($tmp_count == $CORE_LOCAL->get("DiscountTypeCount")-1) + break; + $tmp_count++; +} +$saveStr = rtrim($saveStr,",").")"; +// this is different than lane save; uses array type +confsave('DiscountTypeClasses',$CORE_LOCAL->get('DiscountTypeClasses')); +?> +
        +Price Methods dictate how item prices are calculated. +There's some overlap with Discount Types, but generally +price methods deal with grouped items.
        +Number of Price Methods: +set('PriceMethodCount',$_REQUEST['PM_COUNT']); +if ($CORE_LOCAL->get("PriceMethodCount") == "") $CORE_LOCAL->set("PriceMethodCount",3); +if ($CORE_LOCAL->get("PriceMethodCount") <= 0) $CORE_LOCAL->set("PriceMethodCount",1); +printf("", + $CORE_LOCAL->get('PriceMethodCount')); +confsave('PriceMethodCount',$CORE_LOCAL->get('PriceMethodCount')); +?> +
        Price Method Mapping:
        +set('PriceMethodClasses',$_REQUEST['PM_MODS']); +if (!is_array($CORE_LOCAL->get('PriceMethodClasses'))){ + $CORE_LOCAL->set('PriceMethodClasses', + array( + 'BasicPM', + 'GroupPM', + 'QttyEnforcedGroupPM' + )); +} +$pms = array(); +$dh = opendir($CORE_PATH.'lib/Scanning/PriceMethods'); +while($dh && False !== ($f = readdir($dh))){ + if ($f == "." || $f == "..") + continue; + if (substr($f,-4) == ".php"){ + $pms[] = rtrim($f,".php"); + } +} +$pm_conf = $CORE_LOCAL->get("PriceMethodClasses"); +for($i=0;$i<$CORE_LOCAL->get('PriceMethodCount');$i++){ + echo "[$i] => "; + echo "
        "; +} +$saveStr = "array("; +$tmp_count = 0; +foreach($CORE_LOCAL->get("PriceMethodClasses") as $r){ + $saveStr .= "'".$r."',"; + if ($tmp_count == $CORE_LOCAL->get("PriceMethodCount")-1) + break; + $tmp_count++; +} +$saveStr = rtrim($saveStr,",").")"; +// this is different than lane save; uses array type +confsave('PriceMethodClasses',$CORE_LOCAL->get('PriceMethodClasses')); +?> +
        + +
        + + diff --git a/fannie/install/lane_config/security.php b/fannie/install/lane_config/security.php new file mode 100644 index 000000000..2c7ac1437 --- /dev/null +++ b/fannie/install/lane_config/security.php @@ -0,0 +1,76 @@ + + + +Lane Global: Security configuration options + + + + + + +
        +

        IT CORE Lane Global Configuration: Security

        +Cancel Transaction:
        +Suspend/Resume:
        +Refund Item:
        +Void Limit: +set('VoidLimit',$_REQUEST['VOIDLIMIT']); +if ($CORE_LOCAL->get("VoidLimit")=="") $CORE_LOCAL->set("VoidLimit",0); +printf("",$CORE_LOCAL->get('VoidLimit')); +confsave('VoidLimit',"'".$CORE_LOCAL->get('VoidLimit')."'"); +?> (in dollars, per transaction. Zero for unlimited). +
        +
        + +
        + + diff --git a/fannie/install/lane_config/text.php b/fannie/install/lane_config/text.php new file mode 100644 index 000000000..66b9e6a3c --- /dev/null +++ b/fannie/install/lane_config/text.php @@ -0,0 +1,120 @@ +'Receipt Header', + 'receiptFooter'=>'Receipt Footer', + 'ckEndorse'=>'Check Endorsement', + 'welcomeMsg'=>'Welcome On-screen Message', + 'farewellMsg'=>'Goodbye On-screen Message', + 'trainingMsg'=>'Training On-screen Message', + 'chargeSlip'=>'Store Charge Slip' +); + +if (isset($_REQUEST['new_submit'])){ + $chkQ = $dbc->prepare_statement("SELECT MAX(seq) FROM customReceipt WHERE type=?"); + $chkR = $dbc->exec_statement($chkQ, array($_REQUEST['new_type'])); + $seq = 0; + if ($dbc->num_rows($chkR) > 0){ + $max = array_pop($dbc->fetch_row($chkR)); + if ($max != null) $seq=$max+1; + } + if (!empty($_REQUEST['new_content'])){ + $insQ = $dbc->prepare_statement("INSERT INTO customReceipt (type,text,seq) VALUES (?,?,?)"); + $dbc->exec_statement($insQ,array($_REQUEST['new_type'],$_REQUEST['new_content'],$seq)); + } +} +else if (isset($_REQUEST['old_submit'])){ + $cont = $_REQUEST['old_content']; + $type = $_REQUEST['old_type']; + $seq=0; + $prev_type=''; + $trun = $dbc->prepare_statement("TRUNCATE TABLE customReceipt"); + $dbc->exec_statement($trun); + $insP = $dbc->prepare_statement("INSERT INTO customReceipt (type,text,seq) VALUES (?,?,?)"); + for($i=0;$iexec_statement($insP, array($type[$i],$cont[$i],$seq)); + + $prev_type=$type[$i]; + $seq++; + } +} + +?> + + +Lane Global: Text Strings + + + + + + +
        +

        IT CORE Lane Global Configuration: Text Strings

        +

        Use this utility to enter and edit the lines of text that appear on +receipts, the lane Welcome screen, and elsewhere. +
        If your receipts have no headers or footers or they are wrong this is the place to fix that. +
        The upper form is for adding lines. +
        The lower form is for editing existing lines. +

        +
        +

        Add lines

        +

        Select a type of text string, enter a line, for it, and click "Add". +
        All types may initially have no lines, i.e. be empty. +

        + + + +
        +
        +

        Edit existing lines

        +

        Existing lines of text of different types are displayed below and can be edited there. +
        All types may initially have no lines in which case the heading will not appear and no line boxes will appear. +
        To delete a line erase all the text from it. +

        +
        +prepare_statement("SELECT type,text FROM customReceipt ORDER BY type,seq"); +$r = $dbc->exec_statement($q); +$header=""; +$i=1; +while($w = $dbc->fetch_row($r)){ + if ($header != $w['type']){ + echo '

        '.$TRANSLATE[$w['type']].'

        '; + $header = $w['type']; + $i=1; + } + printf('

        %d: +

        ', + $i++,$w['text'],$w['type']); +} +?> + +
        diff --git a/fannie/install/mem.php b/fannie/install/mem.php new file mode 100644 index 000000000..839ca603a --- /dev/null +++ b/fannie/install/mem.php @@ -0,0 +1,167 @@ + + + +Fannie: Membership Settings + + + + + + + +
        +

        Fannie: Membership Settings

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +Names per membership +"; +?> +
        +Equity/Store Charge +
        Equity Department(s): +",$FANNIE_EQUITY_DEPARTMENTS); +?> +
        Store Charge Department(s): +",$FANNIE_AR_DEPARTMENTS); +?> +
        +Membership Information Modules
        +The Member editing interface displayed after you select a member at: +
        mem/MemberSearchPage.php +
        consists of fields grouped in several sections, called modules, listed below. +
        The enabled (active) ones are selected/highlighted. +
        +
        Available Modules
        + +
        +Click or ctrl-Click or shift-Click to select/deselect modules for enablement. +

        +Adjust Module Display Order + +
        +Member Cards +
        Member Card UPC Prefix: +",$FANNIE_MEMBER_UPC_PREFIX); +?> + +
        + +
        +query("DROP VIEW ar_history_today_sum",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today_sum','trans'); + + $con->query("DROP VIEW ar_live_balance",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_live_balance','trans'); + + $con->query("DROP VIEW stockSumToday",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'stockSumToday','trans'); + + $con->query("DROP VIEW newBalanceStockToday_test",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'newBalanceStockToday_test','trans'); + + $con->query("DROP VIEW dheader",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'dheader','trans'); + + $con->query("DROP VIEW ar_history_today",$FANNIE_TRANS_DB); + create_if_needed($con,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + 'ar_history_today','trans'); +} +?> diff --git a/fannie/install/memModDisplay.php b/fannie/install/memModDisplay.php new file mode 100644 index 000000000..a43532b16 --- /dev/null +++ b/fannie/install/memModDisplay.php @@ -0,0 +1,65 @@ +Order Updated"; + confset('FANNIE_MEMBER_MODULES',$saveStr); +} +?> +
        +

        Member Module Display Order

        +Error: no modules enabled

        "; + echo 'Back to Member Settings'; + exit; +} +for ($i=1;$i<=$num;$i++){ + echo "#$i:

        "; +} +?> + +        + +

        diff --git a/fannie/install/menu.php b/fannie/install/menu.php new file mode 100644 index 000000000..71e8fb577 --- /dev/null +++ b/fannie/install/menu.php @@ -0,0 +1,197 @@ + + + +Fannie Menu Builder + + + + + +
        +

        Fannie: Menu Builder

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; + echo "
        Full path is: ".$FILEPATH.'config.php'."
        "; + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + echo "PHP is running as: ".$chk['name']."
        "; + } + else + echo "PHP is (probably) running as: ".get_current_user()."
        "; +} +?> +
        +Use this tool to customize Fannie's left hand menu. Usage: +
          +
        • To add a new menu entry, type it in the appropriate 'New' box. +
        • To delete an entry, clear its 'Text' box. Bear in mind sub-entries +will also be deleted. +
        • URLs are relative to Fannie unless they begin with / or +a protocol (http://, https://, etc). +
        +Configurable Menu Enabled +
        "; +?> +
        +Fannie Menu Builder + +
        + +
        + + +'".str_replace("'","",$arr[$i]['label'])."',"; + $ret .= "'url'=>'".(isset($arr[$i]['url'])?$arr[$i]['url']:'')."',"; + if (isset($arr[$i]['subheading'])) + $ret .= "'subheading'=>'".str_replace("'","",$arr[$i]['subheading'])."',"; + if (isset($arr[$i]['submenu']) && is_array($arr[$i]['submenu'])) + $ret .= "'submenu'=>".fm_to_string($arr[$i]['submenu']); + $ret = rtrim($ret,','); + $ret .= '),'; + } + $ret = rtrim($ret,','); + $ret .= ')'; + return $ret; +} + +/** + Draw menu recursively +*/ +function fm_draw($arr,$parent='1'){ + echo '
          '; + $i=1; + foreach($arr as $item){ + printf('
        • Text: ', + $parent,$item['label']); + if ($parent == '1'){ + printf('Sub: ', + $parent,(isset($item['subheading'])?$item['subheading']:'')); + } + printf('URL: ', + $parent,$item['url']); + echo "\n"; + if (!isset($item['submenu']) || !is_array($item['submenu'])){ + $item['submenu'] = array(); + } + if(empty($item['submenu'])){ + printf('Add submenu',$parent,$i); + + } + echo '
        • '; + echo "\n"; + $i++; + } + printf('
        • New: ',$parent); + printf('URL:
        • ',$parent); + echo '
          '; + echo '
        '."\n"; +} +?> diff --git a/fannie/install/module_system/index.php b/fannie/install/module_system/index.php new file mode 100644 index 000000000..c7ad5e083 --- /dev/null +++ b/fannie/install/module_system/index.php @@ -0,0 +1,158 @@ + +Necessities +      +Authentication +      +Members +      +Stores +      +Updates +      +Modules +      +Sample Data +
        +

        Fannie Module System

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +echo '
        '; + +if (!isset($FANNIE_SYMBOLS)) $FANNIE_SYMBOLS = array(); +unpack_symbols(); + +function __autoload($class_name){ + global $FANNIE_ROOT; + bootstrap_load($FANNIE_ROOT.'class-lib',$class_name); +} + +// sanity checks +if (!isset($FANNIE_SYMBOLS['functions'])) + $FANNIE_SYMBOLS['functions'] = array(); +elseif (!is_array($FANNIE_SYMBOLS['functions'])) + $FANNIE_SYMBOLS['functions'] = array(); + +if (!isset($FANNIE_SYMBOLS['classes'])) + $FANNIE_SYMBOLS['classes'] = array(); +elseif (!is_array($FANNIE_SYMBOLS['classes'])) + $FANNIE_SYMBOLS['classes'] = array(); + +get_available_modules($FANNIE_ROOT.'class-lib',$sysmods); +ksort($sysmods); + +echo '

        System modules

        '; +echo ''; +echo ''; +foreach($sysmods as $class=>$file){ + include_once($file); + $obj = new $class(); + if (!is_object($obj)){ + printf('', + $class); + } + else { + if ($obj->required && !isset($FANNIE_SYMBOLS['classes'][$class])){ + $obj->enable(); + } + else if (!$obj->required && isset($_REQUEST['submitted'])){ + if (isset($_REQUEST['SYS_MODS_'.$class]) && !isset($FANNIE_SYMBOLS['classes'][$class])){ + // box is checked, object not yet enabled + $obj->enable(); + } + elseif (!isset($_REQUEST['SYS_MODS_'.$class]) && isset($FANNIE_SYMBOLS['classes'][$class])){ + // box is not checked, object is currently enabled + $obj->disable(); + } + } + + printf('', + $class,$obj->description,$class, + (isset($FANNIE_SYMBOLS['classes'][$class]) ? 'checked' : ''), + ($obj->required ? 'disabled="disabled"' : '') + ); + } +} +echo '
        ModuleDescriptionEnabled
        Something is wrong with the %s module
        %s%s
        '; + +?> +
        +User modules'; +echo ''; +echo ''; +foreach($usermods as $class=>$file){ + include_once($file); + $obj = new $class(); + if (!is_object($obj)){ + printf('', + $class); + } + else { + if (isset($_REQUEST['submitted'])){ + if (isset($_REQUEST['USER_MODS_'.$class]) && !isset($FANNIE_SYMBOLS['classes'][$class])){ + // box is checked, object not yet enabled + $obj->enable(); + } + elseif (!isset($_REQUEST['USER_MODS_'.$class]) && isset($FANNIE_SYMBOLS['classes'][$class])){ + // box is not checked, object is currently enabled + $obj->disable(); + } + } + + printf('', + $class,$obj->description,$class, + (isset($FANNIE_SYMBOLS['classes'][$class]) ? 'checked' : '') + ); + } +} +echo '
        ModuleDescriptionEnabled
        Something is wrong with the %s module
        %s%s
        '; + +save_symbols(); +?> +
        + +
        diff --git a/fannie/install/plugins.php b/fannie/install/plugins.php new file mode 100644 index 000000000..78c527271 --- /dev/null +++ b/fannie/install/plugins.php @@ -0,0 +1,143 @@ + + + +Fannie: Plugins + + + + + + + + +
        +

        Fannie: Plugins

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        + +
        +Available plugins:
        +plugin_enable(); + } + } + foreach($oldset as $plugin_class){ + if (!in_array($plugin_class,$newset)){ + $obj = new $plugin_class(); + $obj->plugin_disable(); + } + } + $FANNIE_PLUGIN_LIST = $_REQUEST['PLUGINLIST']; +} + +echo ''; +foreach($mods as $m){ + $enabled = False; + $instance = new $m(); + foreach($FANNIE_PLUGIN_LIST as $r){ + if ($r == $m){ + $enabled = True; + break; + } + } + echo ''; + echo ' + '."\n"; + + if ($enabled && empty($instance->plugin_settings)){ + echo ''; + } + else if ($enabled){ + if (isset($_REQUEST['psubmit'])) + $instance->setting_change(); + echo ''; + } + +} +echo '

         '."\n"; + echo '
        '."\n"; + printf('', + $m, ($enabled?'checked':''),$m, $m, $m); + echo "\n".'
        '."\n"; + printf('%s',$instance->plugin_description); + echo '
        No settings required
        '; + foreach($instance->plugin_settings as $field => $info){ + $form_id = $m.'_'.$field; + if (isset($_REQUEST[$form_id])) + $FANNIE_PLUGIN_SETTINGS[$field] = $_REQUEST[$form_id]; + if (!isset($FANNIE_PLUGIN_SETTINGS[$field])) + $FANNIE_PLUGIN_SETTINGS[$field] = isset($info['default'])?$info['default']:''; + echo ''.(isset($info['label'])?$info['label']:$field).': '; + printf('', + $form_id,$FANNIE_PLUGIN_SETTINGS[$field]); + if (isset($info['description'])) + echo ''.$info['description'].''; + //confset($field,"'".$CORE_LOCAL->get($field)."'"); + } + echo '
        '; + +$saveStr = "array("; +foreach($FANNIE_PLUGIN_LIST as $r){ + $saveStr .= "'".$r."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confset('FANNIE_PLUGIN_LIST',$saveStr); + +$saveStr = "array("; +foreach($FANNIE_PLUGIN_SETTINGS as $key => $val){ + $saveStr .= "'".$key."'=>'".$val."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confset('FANNIE_PLUGIN_SETTINGS',$saveStr); + +?> +
        + +
        +
        + + diff --git a/fannie/install/prod.php b/fannie/install/prod.php new file mode 100644 index 000000000..96ce05ada --- /dev/null +++ b/fannie/install/prod.php @@ -0,0 +1,140 @@ + + + +Fannie: Product Settings + + + + + +
        +

        Fannie: Product Settings

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +Product Information Modules
        +The product editing interface displayed after you select a product at: +
        item/ +
        consists of fields grouped in several sections, called modules, listed below. +
        The enabled (active) ones are selected/highlighted. +
        +
        Available Modules
        + +
        +Click or ctrl-Click or shift-Click to select/deselect modules for enablement. +
        +
        +Default Shelf Tag Layout + + +
        +Product Editing +

        Compose Product Description: +"; +?> +
        If 0 products.description, which appears on the receipt, will be used as-is. +
        If 1 it will be shortened enough hold a "package" description made by +concatenating products.size and products.unitofmeasure so that the whole +string is still 30 or less characters: +
        "Eden Seville Orange Marma 500g" +

        + +

        Compose Long Product Description: +"; +?> +
        If 0 productUser.description, which may be used in Product Verification, will be used as-is. +
        If 1 productUser.brand will be prepended and a "package" description made by +concatenating products.size and products.unitofmeasure will be appended: +
        "EDEN | Marmalade, Orange, Seville, Rough-Cut | 500g"
        +

        + +
        + +
        diff --git a/fannie/install/sample_data/InstallSampleDataPage.php b/fannie/install/sample_data/InstallSampleDataPage.php new file mode 100644 index 000000000..58beb69a5 --- /dev/null +++ b/fannie/install/sample_data/InstallSampleDataPage.php @@ -0,0 +1,268 @@ +add_css_file("../../src/style.css"); + $this->add_css_file("../../src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + $this->add_css_file("../../src/css/install.css"); + + // Link to a file of JS by using a function. + $this->add_script("../../src/jquery/js/jquery.js"); + $this->add_script("../../src/jquery/js/jquery-ui-1.8.1.custom.min.js"); + + // __construct() + } + + // If chunks of CSS are going to be added the function has to be + // redefined to return them. + // If this is to override x.css draw_page() needs to load it after the add_css_file + /** + Define any CSS needed + @return A CSS string + */ + function css_content(){ + $css =" + h4.install { + margin-bottom: 0.4em; + }"; + + return $css; + + //css_content() + } + + // If chunks of JS are going to be added the function has to be + // redefined to return them. + /** + Define any javascript needed + @return A javascript string + function javascript_content(){ + + } + */ + + function body_content(){ + //Should this really be done with global? + //global $FANNIE_URL, $FANNIE_EQUITY_DEPARTMENTS; + include('../../config.php'); + ob_start(); +?> + + +
        +

        header; ?>

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> +
        +
        +query("TRUNCATE TABLE employees"); + loaddata($db,'employees'); +} +elseif(isset($_REQUEST['custdata'])){ + echo "Loading custdata"; + $db->query("TRUNCATE TABLE custdata"); + loaddata($db,'custdata'); +} +elseif(isset($_REQUEST['memtype'])){ + echo "Loading memtype"; + $db->query("TRUNCATE TABLE memtype"); + loaddata($db,'memtype'); + echo "Loading memdefaults"; + $db->query("TRUNCATE TABLE memdefaults"); + loaddata($db,'memdefaults'); +} +elseif(isset($_REQUEST['products'])){ + echo "Loading products"; + $db->query("TRUNCATE TABLE products"); + loaddata($db,'products'); +} +elseif(isset($_REQUEST['depts'])){ + echo "Loading departments"; + $db->query("TRUNCATE TABLE departments"); + loaddata($db,'departments'); + /* subdepts sample data is of questionable use + echo "
        Loading subdepts"; + $db->query("TRUNCATE TABLE subdepts"); + loaddata($db,'subdepts'); + */ +} +elseif(isset($_REQUEST['memtype'])){ + echo "Loading memtype"; + $db->query("TRUNCATE TABLE memtype"); + loaddata($db,'memtype'); + echo "Loading memdefaults"; + $db->query("TRUNCATE TABLE memdefaults"); + loaddata($db,'memdefaults'); +} +elseif (isset($_REQUEST['superdepts'])){ + echo "Loadintg super departments"; + $db->query("TRUNCATE TABLE superdepts"); + loaddata($db,'superdepts'); + $db->query("TRUNCATE TABLE superDeptNames"); + loaddata($db,'superDeptNames'); +} +elseif (isset($_REQUEST['tenders'])){ + echo "Loadintg tenders"; + $db->query("TRUNCATE TABLE tenders"); + loaddata($db,'tenders'); +} +elseif (isset($_REQUEST['authentication'])){ + echo "Loading authentication info"; + $db->query("TRUNCATE TABLE userKnownPrivs"); + loaddata($db,'userKnownPrivs'); +} +elseif (isset($_REQUEST['origin'])){ + echo "Loading country info"; + $db->query("TRUNCATE TABLE originCountry"); + loaddata($db,'originCountry'); + echo "
        Loading state/province info"; + $db->query("TRUNCATE TABLE originStateProv"); + loaddata($db,'originStateProv'); +} +?> +
        + + +

        +Some sample data is available to get a test lane +up and running quickly and to try Fannie functions. +
        Keep in mind this data overwrites whatever is currently in the table. +
        These utilities populate the server tables. +Then use the Synchronize +utilities to populate the lane tables. +

        +
        +

        Employees

        +This table contains login information for cashiers. The two +included logins are '56' and '7000'.
        + +
        +

        Custdata

        +Customer data is the membership information. Sample data includes +a bunch of members and default non-member 11.
        + +
        + +
        +

        Products

        +Stuff to sell. There's a lot of sample data. I think this might +be the Wedge's or at least a snapshot of it.
        + +
        +

        Departments

        +Products get categorized into departments . +You can also ring amounts directly to a department. Not needed, +strictly speaking, for a basic lane (Ring up items, total, +accept tender, provide change).
        + +
        +

        Super-Department Names and Super-Department Links

        +Super Departments are tags for grouping Departments. +A Department can have more than one, that is, belong to more than one Super-Department. +
        This rudimentary set agrees with the Products sample data. +
        Super-Departments can also be used to group the domains of Buyers. +
        Use them with e.g. the Product List report/tool +
        They are also used for grouping shelftags for printing and for grouping data in reports. +
        + +
        +

        Tenders

        +Load all the default tenders into the tenders table.
        + +
        +

        Authentication

        +Load information about currently defined authorization classes
        + +
        +

        Countries, States, and Provinces

        +Load default place-of-origin information
        + +
        + +
        + +draw_page(); +} +?> diff --git a/fannie/install/sample_data/couponcode.sql b/fannie/install/sample_data/couponcode.sql new file mode 100644 index 000000000..05b06bdfb --- /dev/null +++ b/fannie/install/sample_data/couponcode.sql @@ -0,0 +1,95 @@ +('01',1,0) +('14',2,0) +('16',3,0) +('19',4,0) +('02',5,0) +('10',1,-0.1) +('13',4,-1) +('09',3,-2) +('07',3,-1.5) +('42',3,-1) +('52',3,-0.55) +('41',3,-0.5) +('38',3,-0.3) +('37',3,-0.25) +('08',2,-3) +('51',2,-2) +('48',2,-1.85) +('47',2,-1.75) +('46',2,-1.6) +('36',2,-1.5) +('44',2,-1.35) +('34',2,-1.25) +('43',2,-1.1) +('32',2,-0.75) +('98',2,-0.65) +('31',2,-0.6) +('23',2,-0.45) +('22',2,-0.4) +('21',2,-0.35) +('56',2,-0.2) +('54',2,-0.15) +('53',2,-0.1) +('33',2,-1) +('28',2,-0.55) +('24',2,-0.5) +('58',2,-0.3) +('57',2,-0.25) +('61',1,-10) +('62',1,-9.5) +('63',1,-9) +('64',1,-8.5) +('66',1,-8) +('67',1,-7.5) +('68',1,-7) +('71',1,-6.5) +('72',1,-6) +('73',1,-5.5) +('74',1,-5) +('96',1,-4.5) +('93',1,-4) +('92',1,-3.75) +('91',1,-3.5) +('88',1,-3.25) +('87',1,-3) +('26',1,-2.85) +('86',1,-2.75) +('18',1,-2.6) +('84',1,-2.5) +('83',1,-2.25) +('82',1,-2) +('11',1,-1.85) +('81',1,-1.75) +('06',1,-1.6) +('78',1,-1.5) +('05',1,-1.4) +('04',1,-1.35) +('77',1,-1.25) +('03',1,-1.1) +('76',1,-1) +('99',1,-0.99) +('95',1,-0.95) +('90',1,-0.9) +('85',1,-0.85) +('89',1,-0.89) +('80',1,-0.8) +('79',1,-0.79) +('75',1,-0.75) +('70',1,-0.7) +('69',1,-0.69) +('65',1,-0.65) +('60',1,-0.6) +('59',1,-0.59) +('55',1,-0.55) +('50',1,-0.5) +('49',1,-0.49) +('45',1,-0.45) +('40',1,-0.4) +('39',1,-0.39) +('35',1,-0.35) +('30',1,-0.3) +('29',1,-0.29) +('20',1,-0.2) +('25',1,-0.25) +('15',1,-0.15) +('12',1,-0.12) diff --git a/fannie/install/sample_data/custdata.csv b/fannie/install/sample_data/custdata.csv new file mode 100644 index 000000000..872bbce8b --- /dev/null +++ b/fannie/install/sample_data/custdata.csv @@ -0,0 +1,4146 @@ +"654","1","Strother","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","4186.88","999","0","654 Strother","1","0000-00-00 00:00:00","184" +"6143","1","Noblitt","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","3896.45","999","0","6143 Noblitt","1","0000-00-00 00:00:00","5594" +"4049","3","Cutchin","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","343.18","999","1","4049 Cutchin","1","0000-00-00 00:00:00","23545" +"4049","1","Nall","Winona","999.99","0","0","20","1","1","1","PC","1","0","0","343.18","999","1","4049 Nall","1","0000-00-00 00:00:00","4533" +"5077","1","Sachs","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5077 Sachs","1","0000-00-00 00:00:00","8820" +"580","1","Eutsler","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","580 Eutsler","1","0000-00-00 00:00:00","8824" +"4360","2","Garbarino","Danae","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4360 Garbarino","1","0000-00-00 00:00:00","8939" +"9111","1","Brabant","Verdell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9111 Brabant","1","0000-00-00 00:00:00","8873" +"9111","2","Brawley","Shirl","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9111 Brawley","1","0000-00-00 00:00:00","23245" +"5378","1","Harsh","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5378 Harsh","1","0000-00-00 00:00:00","8874" +"233","1","Zweifel","Arlene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","233 Zweifel","1","0000-00-00 00:00:00","8875" +"3802","2","Holleman","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3802 Holleman","1","0000-00-00 00:00:00","24349" +"3802","1","Gains","Summer","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3802 Gains","1","0000-00-00 00:00:00","8876" +"7179","2","Castilleja","Davis","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7179 Castilleja","1","0000-00-00 00:00:00","6573" +"4304","1","Ehrman","Hattie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4304 Ehrman","1","0000-00-00 00:00:00","8879" +"6130","1","Heller","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6130 Heller","1","0000-00-00 00:00:00","8880" +"6130","3","Singletary","Sheena","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6130 Singletary","1","0000-00-00 00:00:00","811" +"9497","2","Deshaies","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9497 Deshaies","1","0000-00-00 00:00:00","26278" +"6067","2","Strange","Dorine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6067 Strange","1","0000-00-00 00:00:00","4555" +"8522","3","Collis","Elvis","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8522 Collis","1","0000-00-00 00:00:00","20047" +"8522","1","Burkhalter","Rossana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8522 Burkhalter","1","0000-00-00 00:00:00","8883" +"5641","1","Winchell","Kam","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5641 Winchell","1","0000-00-00 00:00:00","8884" +"2572","1","Shoe","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2572 Shoe","1","0000-00-00 00:00:00","8886" +"1737","2","Delvalle","Lise","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1737 Delvalle","1","0000-00-00 00:00:00","20035" +"4634","1","Claussen","Alline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4634 Claussen","1","0000-00-00 00:00:00","8889" +"1240","2","Albritton","Taryn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1240 Albritton","1","0000-00-00 00:00:00","25266" +"1240","1","Faber","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1240 Faber","1","0000-00-00 00:00:00","8891" +"2317","2","Silas","Arron","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2317 Silas","1","0000-00-00 00:00:00","8741" +"1430","2","Rozzell","Margo","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1430 Rozzell","1","0000-00-00 00:00:00","25542" +"1430","1","Hornung","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1430 Hornung","1","0000-00-00 00:00:00","8895" +"5832","1","Anderson","Rutha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5832 Anderson","1","0000-00-00 00:00:00","8896" +"2599","4","Trousdale","Sage","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2599 Trousdale","1","0000-00-00 00:00:00","17365" +"2599","2","Larkin","Marylou","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2599 Larkin","1","0000-00-00 00:00:00","17363" +"5721","3","Epling","Keturah","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5721 Epling","1","0000-00-00 00:00:00","16521" +"5721","2","Mckillip","Iona","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5721 Mckillip","1","0000-00-00 00:00:00","16520" +"5224","2","Janecek","Britt","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5224 Janecek","1","0000-00-00 00:00:00","31749" +"3035","3","Bilbo","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3035 Bilbo","1","0000-00-00 00:00:00","23819" +"4048","1","Lamp","Latoya","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4048 Lamp","1","0000-00-00 00:00:00","8909" +"2172","2","Mumper","Ray","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2172 Mumper","1","0000-00-00 00:00:00","20454" +"3546","1","Janecek","Svetlana","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3546 Janecek","1","0000-00-00 00:00:00","8958" +"9187","1","Noblitt","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","1201.06","999","0","9187 Noblitt","1","0000-00-00 00:00:00","4774" +"3268","1","Newby","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3268 Newby","1","0000-00-00 00:00:00","8960" +"3268","2","Narcisse","Samual","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3268 Narcisse","1","0000-00-00 00:00:00","6580" +"2961","2","Bakley","Summer","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2961 Bakley","1","0000-00-00 00:00:00","31372" +"2961","1","Nails","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2961 Nails","1","0000-00-00 00:00:00","8961" +"2943","2","Harsh","Bambi","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2943 Harsh","1","0000-00-00 00:00:00","5714" +"1811","3","Escalante","Chong","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1811 Escalante","1","0000-00-00 00:00:00","11316" +"7576","2","Saldivar","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7576 Saldivar","1","0000-00-00 00:00:00","20457" +"7576","1","Dupuis","Troy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7576 Dupuis","1","0000-00-00 00:00:00","8964" +"3051","1","Hertzler","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3051 Hertzler","1","0000-00-00 00:00:00","8966" +"2222","1","Metro","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2222 Metro","1","0000-00-00 00:00:00","8967" +"8649","2","Darner","Hermila","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8649 Darner","1","0000-00-00 00:00:00","11006" +"3652","2","Vroman","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3652 Vroman","1","0000-00-00 00:00:00","24344" +"7804","2","Flesher","Cathey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7804 Flesher","1","0000-00-00 00:00:00","8768" +"2788","2","Vaughns","Kerstin","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2788 Vaughns","1","0000-00-00 00:00:00","20905" +"7081","1","Stump","Yasuko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7081 Stump","1","0000-00-00 00:00:00","8975" +"4605","2","Raske","Trinh","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4605 Raske","1","0000-00-00 00:00:00","29631" +"9195","4","Riffel","Zoila","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","9195 Riffel","1","0000-00-00 00:00:00","11017" +"9195","1","Hord","Dorine","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9195 Hord","1","0000-00-00 00:00:00","8977" +"3985","1","Fuell","Temeka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3985 Fuell","1","0000-00-00 00:00:00","8979" +"1768","2","Perro","Criselda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1768 Perro","1","0000-00-00 00:00:00","16912" +"9887","2","Jepsen","Delena","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","9887 Jepsen","1","0000-00-00 00:00:00","11022" +"5726","1","Osman","Shavon","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","5726 Osman","1","0000-00-00 00:00:00","8986" +"1123","1","Steele","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1123 Steele","1","0000-00-00 00:00:00","8987" +"3156","3","Lamp","Gene","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3156 Lamp","1","0000-00-00 00:00:00","14935" +"6098","2","Toscano","Tomiko","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6098 Toscano","1","0000-00-00 00:00:00","14936" +"9194","2","Capshaw","Joslyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9194 Capshaw","1","0000-00-00 00:00:00","16730" +"9194","1","Maines","Eulah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9194 Maines","1","0000-00-00 00:00:00","8991" +"3676","3","Sledge","Jule","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","3676 Sledge","1","0000-00-00 00:00:00","22840" +"3550","2","Sedillo","Johnny","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3550 Sedillo","1","0000-00-00 00:00:00","12338" +"1418","3","Lane","Sarita","0","0","12","20","1","0","0","PC","3","1","0","0","999","0","1418 Lane","1","0000-00-00 00:00:00","29211" +"1418","2","Remsen","Ray","0","0","12","20","1","0","0","PC","3","1","0","0","999","0","1418 Remsen","1","0000-00-00 00:00:00","29210" +"3677","1","Dietrick","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3677 Dietrick","1","0000-00-00 00:00:00","6587" +"5069","3","Ensey","Loreta","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5069 Ensey","1","0000-00-00 00:00:00","11031" +"5069","1","Toribio","Nelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5069 Toribio","1","0000-00-00 00:00:00","6588" +"1483","1","Delee","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1483 Delee","1","0000-00-00 00:00:00","6590" +"6683","1","Vizcarra","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6683 Vizcarra","1","0000-00-00 00:00:00","6591" +"3766","1","Monsivais","Eldora","999.99","0","0","0","1","1","1","TERM","0","0","0","0","999","0","3766 Monsivais","1","0000-00-00 00:00:00","6593" +"3467","1","Drinkwater","Nellie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3467 Drinkwater","1","0000-00-00 00:00:00","6594" +"7751","1","Tippit","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7751 Tippit","1","0000-00-00 00:00:00","6595" +"4772","1","Haverly","Lorriane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4772 Haverly","1","0000-00-00 00:00:00","6597" +"496","2","Heller","Maurita","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","496 Heller","1","0000-00-00 00:00:00","26226" +"2950","2","Band","Shelley","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2950 Band","1","0000-00-00 00:00:00","11045" +"3965","1","Leto","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3965 Leto","1","0000-00-00 00:00:00","6603" +"4717","1","Rozzi","Bambi","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4717 Rozzi","1","0000-00-00 00:00:00","6604" +"3853","3","Heise","Shavon","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3853 Heise","1","0000-00-00 00:00:00","8827" +"2761","2","Bellantoni","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2761 Bellantoni","1","0000-00-00 00:00:00","21312" +"5839","1","Daquila","Linnea","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5839 Daquila","1","0000-00-00 00:00:00","6608" +"7008","1","Vanderhorst","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7008 Vanderhorst","1","0000-00-00 00:00:00","6609" +"1449","2","Spohn","Delinda","999.99","9.99","12","20","1","1","1","PC","3","1","0","0","999","0","1449 Spohn","1","0000-00-00 00:00:00","27925" +"5130","1","Pillai","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5130 Pillai","1","0000-00-00 00:00:00","6611" +"1949","1","Kort","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1949 Kort","1","0000-00-00 00:00:00","6614" +"4326","1","Spore","Delinda","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4326 Spore","1","0000-00-00 00:00:00","6615" +"6783","1","Titsworth","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6783 Titsworth","1","0000-00-00 00:00:00","6617" +"5498","2","Kouba","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5498 Kouba","1","0000-00-00 00:00:00","27587" +"5744","1","Howze","Svetlana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5744 Howze","1","0000-00-00 00:00:00","6623" +"462","3","Mcpeek","Germaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","462 Mcpeek","1","0000-00-00 00:00:00","29802" +"462","2","Aguinaga","Virgina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","462 Aguinaga","1","0000-00-00 00:00:00","29801" +"815","1","Drinkwater","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","815 Drinkwater","1","0000-00-00 00:00:00","6625" +"4383","1","Heise","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4383 Heise","1","0000-00-00 00:00:00","11051" +"6214","1","Esterly","Dominick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6214 Esterly","1","0000-00-00 00:00:00","11054" +"8148","2","Tidmore","Dortha","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8148 Tidmore","1","0000-00-00 00:00:00","20906" +"3327","1","Pitre","Shonda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3327 Pitre","1","0000-00-00 00:00:00","11056" +"5901","1","Coache","Glinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5901 Coache","1","0000-00-00 00:00:00","11058" +"831","1","Schempp","Amada","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","831 Schempp","1","0000-00-00 00:00:00","11059" +"7570","2","Barefield","Hortensia","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7570 Barefield","1","0000-00-00 00:00:00","25540" +"674","2","Sester","Augusta","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","674 Sester","1","0000-00-00 00:00:00","25167" +"1326","2","Steele","Bong","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1326 Steele","1","0000-00-00 00:00:00","20901" +"521","2","Testerman","Isabelle","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","521 Testerman","1","0000-00-00 00:00:00","11125" +"4638","2","Liebsch","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4638 Liebsch","1","0000-00-00 00:00:00","10940" +"4638","3","Shoe","Letisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4638 Shoe","1","0000-00-00 00:00:00","4825" +"5237","2","Eoff","Joette","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","5237 Eoff","1","0000-00-00 00:00:00","8478" +"1078","1","Milian","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1078 Milian","1","0000-00-00 00:00:00","11074" +"5501","1","Ayotte","Retha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5501 Ayotte","1","0000-00-00 00:00:00","11075" +"6208","2","Funderburke","Margo","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","6208 Funderburke","1","0000-00-00 00:00:00","428" +"536","1","Graybeal","Odell","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","536 Graybeal","1","0000-00-00 00:00:00","11078" +"5393","1","Probst","Boyd","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5393 Probst","1","0000-00-00 00:00:00","11079" +"18","1","Fortin","Wanetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","18 Fortin","1","0000-00-00 00:00:00","11080" +"5855","2","Dantin","Lazaro","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5855 Dantin","1","0000-00-00 00:00:00","10570" +"7715","2","Janecek","Julene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7715 Janecek","1","0000-00-00 00:00:00","10572" +"1863","1","Hix","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1863 Hix","1","0000-00-00 00:00:00","11083" +"4013","1","Vasko","Mae","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4013 Vasko","1","0000-00-00 00:00:00","11084" +"250","2","Frith","Slyvia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","250 Frith","1","0000-00-00 00:00:00","23635" +"5190","2","Spitz","Marcus","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5190 Spitz","1","0000-00-00 00:00:00","18941" +"3695","1","Sachs","Jacklyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3695 Sachs","1","0000-00-00 00:00:00","10531" +"3695","3","Mcglothlen","Harrison","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3695 Mcglothlen","1","0000-00-00 00:00:00","28344" +"6150","1","Mcglothlen","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6150 Mcglothlen","1","0000-00-00 00:00:00","10534" +"1266","2","Durand","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1266 Durand","1","0000-00-00 00:00:00","29818" +"1266","4","Villafane","Rozella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1266 Villafane","1","0000-00-00 00:00:00","29820" +"6824","1","Tyra","Sherice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6824 Tyra","1","0000-00-00 00:00:00","10541" +"7346","1","Stacy","Rivka","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7346 Stacy","1","0000-00-00 00:00:00","10542" +"1464","1","Pattison","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1464 Pattison","1","0000-00-00 00:00:00","10544" +"5707","1","Vizcarra","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5707 Vizcarra","1","0000-00-00 00:00:00","10545" +"7023","1","Calo","Mei","999.99","1.17","0","20","1","1","1","PC","1","0","0","0","999","0","7023 Calo","1","0000-00-00 00:00:00","10546" +"6827","1","Epling","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6827 Epling","1","0000-00-00 00:00:00","10547" +"8101","3","Castille","Lonna","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","8101 Castille","1","0000-00-00 00:00:00","10641" +"8101","4","Voges","Theo","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","8101 Voges","1","0000-00-00 00:00:00","10642" +"5457","1","Capshaw","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5457 Capshaw","1","0000-00-00 00:00:00","10549" +"3916","2","Owen","Josefine","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3916 Owen","1","0000-00-00 00:00:00","21194" +"3916","1","Wilmes","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3916 Wilmes","1","0000-00-00 00:00:00","10550" +"3933","3","Headrick","Mariette","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3933 Headrick","1","0000-00-00 00:00:00","21279" +"3933","2","Vasques","So","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3933 Vasques","1","0000-00-00 00:00:00","21278" +"1127","1","Pemberton","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1127 Pemberton","1","0000-00-00 00:00:00","10552" +"5316","3","Hertzler","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5316 Hertzler","1","0000-00-00 00:00:00","20642" +"3115","3","Lujan","Joelle","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3115 Lujan","1","0000-00-00 00:00:00","19768" +"3115","2","Ensey","Alina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3115 Ensey","1","0000-00-00 00:00:00","19767" +"3750","2","Getz","Eulah","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3750 Getz","1","0000-00-00 00:00:00","10660" +"85","1","Silas","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","85 Silas","1","0000-00-00 00:00:00","10557" +"7128","2","Simons","Madie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","7128 Simons","1","0000-00-00 00:00:00","10665" +"3999","2","Manganaro","Wanita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3999 Manganaro","1","0000-00-00 00:00:00","30135" +"824","2","Spore","Ericka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","824 Spore","1","0000-00-00 00:00:00","23740" +"1296","1","Castilleja","Marc","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1296 Castilleja","1","0000-00-00 00:00:00","10563" +"2090","1","Propes","Noelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2090 Propes","1","0000-00-00 00:00:00","10564" +"6975","1","Wendland","Rocco","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6975 Wendland","1","0000-00-00 00:00:00","10565" +"3876","2","Penland","Theda","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","3876 Penland","1","0000-00-00 00:00:00","10675" +"8438","1","Hankerson","Anja","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8438 Hankerson","1","0000-00-00 00:00:00","10569" +"901","2","Giraldo","Rosalva","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","901 Giraldo","1","0000-00-00 00:00:00","10307" +"1179","1","Eisenhower","Barbera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1179 Eisenhower","1","0000-00-00 00:00:00","10603" +"9001","1","Trafton","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","378.35","999","1","9001 Trafton","1","0000-00-00 00:00:00","2267" +"578","2","Raver","Nelle","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","578 Raver","1","0000-00-00 00:00:00","10679" +"4493","4","Saldivar","Elinore","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","4493 Saldivar","1","0000-00-00 00:00:00","10682" +"4493","2","Minnix","Marchelle","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","4493 Minnix","1","0000-00-00 00:00:00","10680" +"8159","3","Villagran","Latisha","999.99","0","0","0","0","1","1","REG","0","0","0","0","999","0","8159 Villagran","1","0000-00-00 00:00:00","31059" +"9286","2","Jun","Judy","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9286 Jun","1","0000-00-00 00:00:00","21981" +"2697","1","Feliciano","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2697 Feliciano","1","0000-00-00 00:00:00","10611" +"78","4","Pemberton","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","78 Pemberton","1","0000-00-00 00:00:00","31711" +"78","2","Boyett","Dagmar","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","78 Boyett","1","0000-00-00 00:00:00","31709" +"7508","2","Schmucker","Tim","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","7508 Schmucker","1","0000-00-00 00:00:00","214" +"5812","1","Kirst","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5812 Kirst","1","0000-00-00 00:00:00","10615" +"3827","1","Biery","Page","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3827 Biery","1","0000-00-00 00:00:00","10616" +"2941","2","Daquila","Myrtis","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2941 Daquila","1","0000-00-00 00:00:00","21186" +"7826","2","Heintzelman","Marketta","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","7826 Heintzelman","1","0000-00-00 00:00:00","10808" +"2869","3","Lanier","Monte","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2869 Lanier","1","0000-00-00 00:00:00","21681" +"3765","1","Chaves","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3765 Chaves","1","0000-00-00 00:00:00","10621" +"7977","2","Newby","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7977 Newby","1","0000-00-00 00:00:00","31589" +"2808","2","Mcglothlen","Nikole","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2808 Mcglothlen","1","0000-00-00 00:00:00","18873" +"633","1","Sitzman","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","633 Sitzman","1","0000-00-00 00:00:00","10630" +"1788","1","Lueck","Selma","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","1788 Lueck","1","0000-00-00 00:00:00","10631" +"8337","2","Vroman","Maynard","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","0","8337 Vroman","1","0000-00-00 00:00:00","10734" +"8337","1","Woodfin","Ines","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","0","8337 Woodfin","1","0000-00-00 00:00:00","10632" +"5640","1","Silas","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5640 Silas","1","0000-00-00 00:00:00","10633" +"8914","2","Roten","Ingeborg","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","8914 Roten","1","0000-00-00 00:00:00","20462" +"2948","1","Salvo","Monte","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2948 Salvo","1","0000-00-00 00:00:00","10635" +"3561","1","Labree","Jacquelin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3561 Labree","1","0000-00-00 00:00:00","10637" +"3409","3","Esterly","Elliott","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3409 Esterly","1","0000-00-00 00:00:00","17869" +"3409","1","Callejas","Julius","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3409 Callejas","1","0000-00-00 00:00:00","10693" +"1109","2","Mcneel","Jacquelin","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","1109 Mcneel","1","0000-00-00 00:00:00","18953" +"942","1","Chain","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","942 Chain","1","0000-00-00 00:00:00","10698" +"1837","2","Brawley","Jodie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1837 Brawley","1","0000-00-00 00:00:00","4897" +"396","3","Tramble","Josefine","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","396 Tramble","1","0000-00-00 00:00:00","12722" +"3639","2","Doetsch","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3639 Doetsch","1","0000-00-00 00:00:00","15855" +"1915","1","Lueck","Marilee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1915 Lueck","1","0000-00-00 00:00:00","10703" +"7903","2","Grothe","Melvina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7903 Grothe","1","0000-00-00 00:00:00","31605" +"9450","2","Mckillip","Danelle","999.99","0","0","0","0","1","1","REG","0","0","0","0","999","0","9450 Mckillip","1","0000-00-00 00:00:00","31580" +"5742","3","Perillo","Alysia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5742 Perillo","1","0000-00-00 00:00:00","19373" +"5742","2","Saddler","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5742 Saddler","1","0000-00-00 00:00:00","19372" +"5497","2","Vanwagenen","Chet","999.99","19.76","0","20","1","1","1","PC","1","0","0","0","999","0","5497 Vanwagenen","1","0000-00-00 00:00:00","20484" +"2393","2","Synder","Mei","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","2393 Synder","1","0000-00-00 00:00:00","13194" +"3569","2","Ellis","Leopoldo","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","3569 Ellis","1","0000-00-00 00:00:00","10833" +"6158","2","Mitcham","Bridget","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6158 Mitcham","1","0000-00-00 00:00:00","10882" +"6158","1","Arias","Danelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6158 Arias","1","0000-00-00 00:00:00","10720" +"6500","1","Manganaro","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6500 Manganaro","1","0000-00-00 00:00:00","10721" +"5339","3","Deshaies","Josefina","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5339 Deshaies","1","0000-00-00 00:00:00","10878" +"5339","2","Frith","Joelle","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5339 Frith","1","0000-00-00 00:00:00","4289" +"1745","1","Mumper","Shirlee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1745 Mumper","1","0000-00-00 00:00:00","10723" +"2499","2","Bakley","Thanh","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","2499 Bakley","1","0000-00-00 00:00:00","10891" +"1681","2","Sester","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1681 Sester","1","0000-00-00 00:00:00","22951" +"2012","3","Caraballo","Lilia","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","2012 Caraballo","1","0000-00-00 00:00:00","10894" +"2012","2","Baumgart","Loreta","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","2012 Baumgart","1","0000-00-00 00:00:00","11247" +"6068","2","Finlayson","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6068 Finlayson","1","0000-00-00 00:00:00","10911" +"1824","1","Heintzelman","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1824 Heintzelman","1","0000-00-00 00:00:00","10840" +"4998","1","Mccann","Tyree","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4998 Mccann","1","0000-00-00 00:00:00","10842" +"4998","3","Fitting","Craig","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4998 Fitting","1","0000-00-00 00:00:00","10925" +"6463","1","Flinchum","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6463 Flinchum","1","0000-00-00 00:00:00","10844" +"5463","1","Derosa","Bong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5463 Derosa","1","0000-00-00 00:00:00","10845" +"6912","1","Strange","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6912 Strange","1","0000-00-00 00:00:00","10847" +"4368","2","Lone","Rosia","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4368 Lone","1","0000-00-00 00:00:00","18972" +"4914","1","Baumgart","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4914 Baumgart","1","0000-00-00 00:00:00","10849" +"7307","2","Lane","Brendan","999.99","0","0","20","1","1","1","PC","1","0","0","4074.53","999","0","7307 Lane","1","0000-00-00 00:00:00","27238" +"6224","2","Furlong","Hoa","999.99","0","0","20","1","0","1","PC","1","0","0","1967.59","999","1","6224 Furlong","1","0000-00-00 00:00:00","59" +"8232","1","Doetsch","Kenny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8232 Doetsch","1","0000-00-00 00:00:00","10850" +"3466","1","Paiva","Ramiro","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3466 Paiva","1","0000-00-00 00:00:00","10852" +"765","1","Trousdale","Ulrike","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","765 Trousdale","1","0000-00-00 00:00:00","10854" +"5479","1","Mumper","Steve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5479 Mumper","1","0000-00-00 00:00:00","10857" +"5845","1","Pennell","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5845 Pennell","1","0000-00-00 00:00:00","10862" +"1614","3","Milian","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1614 Milian","1","0000-00-00 00:00:00","10687" +"3167","1","Bilbo","Celia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3167 Bilbo","1","0000-00-00 00:00:00","10864" +"2356","1","Beaulieu","Temeka","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","2356 Beaulieu","1","0000-00-00 00:00:00","10867" +"2643","1","Schoepp","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2643 Schoepp","1","0000-00-00 00:00:00","10868" +"5873","1","Metro","Korey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5873 Metro","1","0000-00-00 00:00:00","10870" +"7354","2","Stedman","Janelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7354 Stedman","1","0000-00-00 00:00:00","21732" +"1337","1","Marston","Rosia","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","1337 Marston","1","0000-00-00 00:00:00","10876" +"3475","1","Frith","Geraldo","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3475 Frith","1","0000-00-00 00:00:00","10963" +"6251","1","Rashid","Owen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6251 Rashid","1","0000-00-00 00:00:00","10964" +"6251","3","Voges","Jodie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","6251 Voges","1","0000-00-00 00:00:00","9660" +"3149","2","Maloof","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3149 Maloof","1","0000-00-00 00:00:00","23664" +"1575","1","Funderburke","Valorie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1575 Funderburke","1","0000-00-00 00:00:00","10967" +"921","1","Birch","Davis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","921 Birch","1","0000-00-00 00:00:00","10969" +"2340","2","Michaels","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2340 Michaels","1","0000-00-00 00:00:00","9670" +"2505","1","Simkins","Earleen","999.99","20","12","20","1","1","1","PC","3","1","0","0","999","0","2505 Simkins","1","0000-00-00 00:00:00","10971" +"5193","2","Simkins","Desire","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5193 Simkins","1","0000-00-00 00:00:00","29506" +"8443","1","Fortin","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8443 Fortin","1","0000-00-00 00:00:00","10975" +"9357","2","Schmucker","Adah","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","9357 Schmucker","1","0000-00-00 00:00:00","28711" +"7048","2","Voltz","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7048 Voltz","1","0000-00-00 00:00:00","11431" +"5204","1","Rowell","Clint","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","5204 Rowell","1","0000-00-00 00:00:00","10978" +"5204","3","Snively","Myrtle","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","5204 Snively","1","0000-00-00 00:00:00","20607" +"946","2","Layman","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","946 Layman","1","0000-00-00 00:00:00","9681" +"5683","2","Schempp","Janelle","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5683 Schempp","1","0000-00-00 00:00:00","25277" +"5683","1","Kilpatrick","Luther","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5683 Kilpatrick","1","0000-00-00 00:00:00","10984" +"7519","3","Tippit","Shavon","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","7519 Tippit","1","0000-00-00 00:00:00","25769" +"2422","1","Kulesza","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2422 Kulesza","1","0000-00-00 00:00:00","10986" +"8294","2","Broderson","Samual","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","8294 Broderson","1","0000-00-00 00:00:00","23456" +"9269","1","Lowe","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9269 Lowe","1","0000-00-00 00:00:00","10988" +"9631","1","Fitting","Katrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9631 Fitting","1","0000-00-00 00:00:00","10989" +"9631","4","Pelaez","Wendie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9631 Pelaez","1","0000-00-00 00:00:00","28369" +"2746","1","Rowell","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2746 Rowell","1","0000-00-00 00:00:00","10990" +"5883","4","Newby","Alysia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5883 Newby","1","0000-00-00 00:00:00","9721" +"5883","3","Nowland","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5883 Nowland","1","0000-00-00 00:00:00","9720" +"6087","1","Oyola","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6087 Oyola","1","0000-00-00 00:00:00","10993" +"9442","2","Bakley","Haley","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9442 Bakley","1","0000-00-00 00:00:00","9692" +"9442","4","Eutsler","Luanne","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9442 Eutsler","1","0000-00-00 00:00:00","9724" +"6467","3","Anding","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","1488.69","999","0","6467 Anding","1","0000-00-00 00:00:00","23810" +"6467","1","Pae","Summer","999.99","0","0","20","1","1","1","PC","1","0","0","1488.69","999","0","6467 Pae","1","0000-00-00 00:00:00","3476" +"656","3","Nevin","Reva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","656 Nevin","1","0000-00-00 00:00:00","9695" +"3","1","Aviles","Ericka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3 Aviles","1","0000-00-00 00:00:00","10997" +"5849","1","Mraz","Dortha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5849 Mraz","1","0000-00-00 00:00:00","10999" +"5208","1","Piccard","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5208 Piccard","1","0000-00-00 00:00:00","14422" +"5495","2","Blais","Serafina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5495 Blais","1","0000-00-00 00:00:00","20052" +"8032","2","Feehan","Carisa","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8032 Feehan","1","0000-00-00 00:00:00","436" +"1985","2","Thach","Elvera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1985 Thach","1","0000-00-00 00:00:00","11834" +"1985","1","Poche","Ula","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1985 Poche","1","0000-00-00 00:00:00","9705" +"8978","3","Bayes","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8978 Bayes","1","0000-00-00 00:00:00","18867" +"8978","2","Mcleroy","Britt","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8978 Mcleroy","1","0000-00-00 00:00:00","18866" +"5708","2","Saddler","Neil","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5708 Saddler","1","0000-00-00 00:00:00","9862" +"6662","1","Flesher","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6662 Flesher","1","0000-00-00 00:00:00","9727" +"9501","1","Meekins","Teisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9501 Meekins","1","0000-00-00 00:00:00","9728" +"1103","1","Ehrman","Lang","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1103 Ehrman","1","0000-00-00 00:00:00","9729" +"5933","1","Mcglothlen","Jodie","999.99","0","0","20","1","1","1","PC","1","1","0","0","999","1","5933 Mcglothlen","1","0000-00-00 00:00:00","9730" +"766","2","Shoe","Ines","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","766 Shoe","1","0000-00-00 00:00:00","21191" +"766","1","Stacy","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","766 Stacy","1","0000-00-00 00:00:00","9738" +"8678","3","Flinchum","Myrtis","999.99","19.55","0","20","1","1","1","PC","1","0","0","0","999","1","8678 Flinchum","1","0000-00-00 00:00:00","29459" +"8678","2","Gutman","Anja","999.99","19.55","0","20","1","1","1","PC","1","0","0","0","999","1","8678 Gutman","1","0000-00-00 00:00:00","29458" +"5017","2","Faber","Argentina","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5017 Faber","1","0000-00-00 00:00:00","25861" +"4766","3","Giguere","Iona","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","4766 Giguere","1","0000-00-00 00:00:00","9771" +"4766","1","Heise","Celia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4766 Heise","1","0000-00-00 00:00:00","9742" +"4460","4","Melby","Judy","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4460 Melby","1","0000-00-00 00:00:00","17730" +"4460","1","Singletary","Augusta","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4460 Singletary","1","0000-00-00 00:00:00","9743" +"2429","1","Dietrick","Robbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2429 Dietrick","1","0000-00-00 00:00:00","9745" +"7742","1","Arata","Magan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7742 Arata","1","0000-00-00 00:00:00","9748" +"2431","2","Goldsborough","Jamaal","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","2431 Goldsborough","1","0000-00-00 00:00:00","22361" +"3592","1","Mcfall","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3592 Mcfall","1","0000-00-00 00:00:00","9753" +"878","1","Caraballo","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","878 Caraballo","1","0000-00-00 00:00:00","9754" +"8799","1","Deppen","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8799 Deppen","1","0000-00-00 00:00:00","9812" +"6636","1","Dietrick","Anette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6636 Dietrick","1","0000-00-00 00:00:00","12223" +"5616","2","Severe","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5616 Severe","1","0000-00-00 00:00:00","9865" +"5616","3","Broderson","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5616 Broderson","1","0000-00-00 00:00:00","9866" +"7997","1","Haverly","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7997 Haverly","1","0000-00-00 00:00:00","9816" +"6025","2","Burkhalter","Marylou","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6025 Burkhalter","1","0000-00-00 00:00:00","31118" +"9204","3","Aguirre","Shante","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9204 Aguirre","1","0000-00-00 00:00:00","9909" +"9204","2","Goldsborough","Romelia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9204 Goldsborough","1","0000-00-00 00:00:00","9908" +"8778","3","Larkin","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","439.47","999","0","8778 Larkin","1","0000-00-00 00:00:00","16518" +"8778","1","Snodgrass","Shalanda","999.99","0","0","20","1","1","1","PC","1","0","0","439.47","999","0","8778 Snodgrass","1","0000-00-00 00:00:00","6288" +"8706","1","Heintzelman","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8706 Heintzelman","1","0000-00-00 00:00:00","9827" +"4712","2","Schweitzer","Davina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4712 Schweitzer","1","0000-00-00 00:00:00","29598" +"7840","1","Tunney","Cruz","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","7840 Tunney","1","0000-00-00 00:00:00","9829" +"3603","1","Landwehr","Davida","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3603 Landwehr","1","0000-00-00 00:00:00","9830" +"3603","3","Derosa","Ezekiel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3603 Derosa","1","0000-00-00 00:00:00","9896" +"3391","1","Ater","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3391 Ater","1","0000-00-00 00:00:00","9833" +"2859","1","Snively","Liana","999.99","0","0","0","1","1","1","TERM","0","0","0","0","999","0","2859 Snively","1","0000-00-00 00:00:00","9834" +"955","2","Hassinger","Keeley","0","32.17","12","100","1","0","0","PC","3","1","0","0","999","0","955 Hassinger","1","0000-00-00 00:00:00","30504" +"587","1","Leight","Nelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","587 Leight","1","0000-00-00 00:00:00","9836" +"8247","3","Acklin","Tobias","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8247 Acklin","1","0000-00-00 00:00:00","18840" +"8247","1","Aviles","Dorris","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8247 Aviles","1","0000-00-00 00:00:00","9837" +"5785","2","Zahn","Gaylord","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5785 Zahn","1","0000-00-00 00:00:00","23229" +"3017","1","Mccann","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3017 Mccann","1","0000-00-00 00:00:00","9840" +"3895","1","Raver","Owen","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3895 Raver","1","0000-00-00 00:00:00","9841" +"6752","2","Boyett","Boyce","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","6752 Boyett","1","0000-00-00 00:00:00","30115" +"8177","2","Nally","Troy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8177 Nally","1","0000-00-00 00:00:00","30194" +"268","3","Leight","Carisa","999.99","0","12","100","1","1","1","PC","3","1","0","0","999","0","268 Leight","1","0000-00-00 00:00:00","22527" +"268","1","Noecker","Alonzo","999.99","0","12","100","1","1","1","PC","3","1","0","0","999","0","268 Noecker","1","0000-00-00 00:00:00","9848" +"5390","1","Prichett","Indira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5390 Prichett","1","0000-00-00 00:00:00","9968" +"1122","1","Sugarman","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1122 Sugarman","1","0000-00-00 00:00:00","9970" +"1122","4","Rodrigez","Robbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1122 Rodrigez","1","0000-00-00 00:00:00","7779" +"9221","2","Janco","Garland","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","9221 Janco","1","0000-00-00 00:00:00","23465" +"4613","2","Ro","Rutha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4613 Ro","1","0000-00-00 00:00:00","28913" +"4613","1","Peltier","Rozella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4613 Peltier","1","0000-00-00 00:00:00","9972" +"1143","2","Youssef","Sharie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1143 Youssef","1","0000-00-00 00:00:00","29798" +"2825","2","Rowell","Dorris","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2825 Rowell","1","0000-00-00 00:00:00","29412" +"4001","2","Faber","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4001 Faber","1","0000-00-00 00:00:00","7784" +"3780","1","Faber","Rozella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3780 Faber","1","0000-00-00 00:00:00","9976" +"1321","1","Tippit","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1321 Tippit","1","0000-00-00 00:00:00","9977" +"1823","1","Janco","Lemuel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1823 Janco","1","0000-00-00 00:00:00","9982" +"1823","4","Chain","Peggy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1823 Chain","1","0000-00-00 00:00:00","7798" +"6749","2","Castilleja","Nicole","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6749 Castilleja","1","0000-00-00 00:00:00","23518" +"7607","2","Winchell","Haley","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7607 Winchell","1","0000-00-00 00:00:00","17529" +"7718","2","Weiler","Marline","0","7.75","0","20","1","0","0","PC","1","0","0","0","999","0","7718 Weiler","1","0000-00-00 00:00:00","23434" +"7718","1","Babcock","Ricky","999.99","7.75","0","20","1","1","1","PC","1","0","0","0","999","0","7718 Babcock","1","0000-00-00 00:00:00","9987" +"6985","2","Barhorst","Alfonso","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","6985 Barhorst","1","0000-00-00 00:00:00","21111" +"6985","3","Hord","Isabelle","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","6985 Hord","1","0000-00-00 00:00:00","21112" +"3662","2","Creason","Haydee","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3662 Creason","1","0000-00-00 00:00:00","23763" +"4472","2","Eisenhower","Shalanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4472 Eisenhower","1","0000-00-00 00:00:00","23796" +"5163","2","Schweitzer","Verdell","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5163 Schweitzer","1","0000-00-00 00:00:00","24604" +"3930","2","Pae","Ramiro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3930 Pae","1","0000-00-00 00:00:00","7815" +"7861","2","Braley","Jamie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7861 Braley","1","0000-00-00 00:00:00","30130" +"7944","1","Beltrami","Jeanmarie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7944 Beltrami","1","0000-00-00 00:00:00","9997" +"7205","2","Steitz","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7205 Steitz","1","0000-00-00 00:00:00","22205" +"2541","1","Raske","Joey","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2541 Raske","1","0000-00-00 00:00:00","9999" +"3591","2","Bellantoni","Augusta","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3591 Bellantoni","1","0000-00-00 00:00:00","22352" +"7890","2","Sherron","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7890 Sherron","1","0000-00-00 00:00:00","7865" +"5842","2","Muck","Serafina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5842 Muck","1","0000-00-00 00:00:00","8654" +"2814","1","Sprau","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2814 Sprau","1","0000-00-00 00:00:00","7772" +"2504","1","Ming","Bertha","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2504 Ming","1","0000-00-00 00:00:00","7774" +"5639","1","Piccard","Ezekiel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5639 Piccard","1","0000-00-00 00:00:00","7817" +"988","2","Zahn","Magan","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","988 Zahn","1","0000-00-00 00:00:00","30316" +"1242","2","Barhorst","Ezekiel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1242 Barhorst","1","0000-00-00 00:00:00","28000" +"1242","3","Marion","Retha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1242 Marion","1","0000-00-00 00:00:00","28001" +"1878","1","Strange","Renna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1878 Strange","1","0000-00-00 00:00:00","7821" +"3190","3","Wessner","Archie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3190 Wessner","1","0000-00-00 00:00:00","7884" +"3190","2","Defreitas","Josephina","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3190 Defreitas","1","0000-00-00 00:00:00","7883" +"5835","2","Godines","Maxine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5835 Godines","1","0000-00-00 00:00:00","30663" +"5835","4","Liu","Dorine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5835 Liu","1","0000-00-00 00:00:00","30665" +"6851","2","Labree","Daniele","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6851 Labree","1","0000-00-00 00:00:00","7889" +"999","2","Baily","Rutha","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","999 Baily","1","0000-00-00 00:00:00","22493" +"782","2","Prichett","Keturah","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","782 Prichett","1","0000-00-00 00:00:00","25201" +"782","3","Nally","Danae","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","782 Nally","1","0000-00-00 00:00:00","25202" +"3554","2","Alessi","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3554 Alessi","1","0000-00-00 00:00:00","31604" +"3336","2","Lane","Karlyn","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3336 Lane","1","0000-00-00 00:00:00","23828" +"8797","2","Mitcham","Carisa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8797 Mitcham","1","0000-00-00 00:00:00","7899" +"1500","3","Fitting","Janel","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1500 Fitting","1","0000-00-00 00:00:00","24702" +"4040","1","Fitting","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4040 Fitting","1","0000-00-00 00:00:00","7837" +"9882","1","Monsivais","Clementine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9882 Monsivais","1","0000-00-00 00:00:00","7839" +"6868","2","Probst","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6868 Probst","1","0000-00-00 00:00:00","3926" +"2006","2","Nall","Boyd","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2006 Nall","1","0000-00-00 00:00:00","20903" +"4365","1","Bayes","Katrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4365 Bayes","1","0000-00-00 00:00:00","7847" +"3248","1","Caraballo","Amelia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3248 Caraballo","1","0000-00-00 00:00:00","7849" +"2043","3","Flinchum","Fritz","0","12.34","0","20","1","0","0","PC","1","0","0","0","999","1","2043 Flinchum","1","0000-00-00 00:00:00","29854" +"2043","2","Keppler","Criselda","0","12.34","0","20","1","0","0","PC","1","0","0","0","999","1","2043 Keppler","1","0000-00-00 00:00:00","29853" +"2098","2","Pillai","Kirstin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2098 Pillai","1","0000-00-00 00:00:00","15255" +"978","2","Conger","Lorinda","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","978 Conger","1","0000-00-00 00:00:00","15260" +"1641","1","Scurry","Violette","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1641 Scurry","1","0000-00-00 00:00:00","7855" +"5709","1","Blais","Caroll","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5709 Blais","1","0000-00-00 00:00:00","7913" +"8931","2","Cutchin","Refugio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8931 Cutchin","1","0000-00-00 00:00:00","15279" +"8610","2","Poplar","Collene","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","1","8610 Poplar","1","0000-00-00 00:00:00","28407" +"2487","1","Ridings","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2487 Ridings","1","0000-00-00 00:00:00","7922" +"1948","1","Silas","Sarita","999.99","2.51","0","20","1","1","1","PC","1","0","0","0","999","1","1948 Silas","1","0000-00-00 00:00:00","7923" +"3987","2","Leight","Philomena","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3987 Leight","1","0000-00-00 00:00:00","24038" +"3987","4","Settles","Alline","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3987 Settles","1","0000-00-00 00:00:00","24040" +"2491","1","Labree","Jefferson","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2491 Labree","1","0000-00-00 00:00:00","7930" +"2491","3","Ensey","Harrison","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2491 Ensey","1","0000-00-00 00:00:00","30906" +"3228","2","Kort","Kerstin","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3228 Kort","1","0000-00-00 00:00:00","24309" +"8027","1","Sunderland","Kam","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","8027 Sunderland","1","0000-00-00 00:00:00","7933" +"6623","2","Dobson","Juliane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6623 Dobson","1","0000-00-00 00:00:00","22043" +"6623","1","Madson","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6623 Madson","1","0000-00-00 00:00:00","7935" +"7910","1","Rafael","Elyse","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7910 Rafael","1","0000-00-00 00:00:00","7937" +"3571","1","Faul","Shonda","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","3571 Faul","1","0000-00-00 00:00:00","7938" +"5089","1","Lowe","Madie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5089 Lowe","1","0000-00-00 00:00:00","7940" +"4779","2","Rozzi","Katherina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4779 Rozzi","1","0000-00-00 00:00:00","18168" +"6157","1","Manganaro","Tobie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6157 Manganaro","1","0000-00-00 00:00:00","7942" +"8163","2","Spier","Shelley","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","8163 Spier","1","0000-00-00 00:00:00","22473" +"2801","1","Marnell","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2801 Marnell","1","0000-00-00 00:00:00","7948" +"1413","4","Spore","Lise","999.99","34.03","12","80","1","1","1","PC","3","1","0","0","999","0","1413 Spore","1","0000-00-00 00:00:00","31363" +"1413","2","Muck","Svetlana","999.99","34.03","12","80","1","1","1","PC","3","1","0","0","999","0","1413 Muck","1","0000-00-00 00:00:00","31361" +"4935","1","Komar","Neil","999.99","8.17","0","20","1","1","1","PC","1","0","0","0","999","0","4935 Komar","1","0000-00-00 00:00:00","7950" +"5913","2","Litman","Lazaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5913 Litman","1","0000-00-00 00:00:00","29224" +"5913","3","Hunsaker","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5913 Hunsaker","1","0000-00-00 00:00:00","29225" +"6485","2","Czaja","Brianne","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6485 Czaja","1","0000-00-00 00:00:00","24455" +"6485","1","Chaves","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6485 Chaves","1","0000-00-00 00:00:00","15354" +"1445","2","Dantin","Marilee","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","1445 Dantin","1","0000-00-00 00:00:00","20617" +"2196","3","Mitcham","Brendan","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2196 Mitcham","1","0000-00-00 00:00:00","24813" +"2196","1","Weiler","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2196 Weiler","1","0000-00-00 00:00:00","15357" +"378","3","Hornung","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","378 Hornung","1","0000-00-00 00:00:00","19443" +"378","1","Alexandra","Lonnie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","378 Alexandra","1","0000-00-00 00:00:00","15358" +"2354","2","Steitz","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2354 Steitz","1","0000-00-00 00:00:00","15433" +"6275","2","Darner","Sarai","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6275 Darner","1","0000-00-00 00:00:00","24460" +"6792","1","Walborn","Carmelita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6792 Walborn","1","0000-00-00 00:00:00","15362" +"9503","1","Monsivais","Ray","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9503 Monsivais","1","0000-00-00 00:00:00","15364" +"4879","1","Davisson","Junita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4879 Davisson","1","0000-00-00 00:00:00","15367" +"3417","1","Wild","Susana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3417 Wild","1","0000-00-00 00:00:00","15368" +"7410","1","Knudsen","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7410 Knudsen","1","0000-00-00 00:00:00","15369" +"2790","1","Zander","Catina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2790 Zander","1","0000-00-00 00:00:00","15370" +"2501","2","Lane","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2501 Lane","1","0000-00-00 00:00:00","15451" +"7569","1","Pitre","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7569 Pitre","1","0000-00-00 00:00:00","15373" +"5283","3","Brabant","Valorie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5283 Brabant","1","0000-00-00 00:00:00","24898" +"207","2","Bouknight","Tanya","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","207 Bouknight","1","0000-00-00 00:00:00","22040" +"1311","2","Peltier","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1311 Peltier","1","0000-00-00 00:00:00","21788" +"1311","1","Maines","Florrie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1311 Maines","1","0000-00-00 00:00:00","15376" +"2724","2","Snodgrass","Malia","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2724 Snodgrass","1","0000-00-00 00:00:00","29360" +"7679","1","Lheureux","Tommye","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7679 Lheureux","1","0000-00-00 00:00:00","15380" +"6533","1","Nitti","Marylou","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6533 Nitti","1","0000-00-00 00:00:00","15381" +"8056","1","Shoe","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8056 Shoe","1","0000-00-00 00:00:00","15382" +"922","2","Carlino","Jacob","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","922 Carlino","1","0000-00-00 00:00:00","15474" +"922","1","Dietrick","Miquel","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","922 Dietrick","1","0000-00-00 00:00:00","15383" +"3679","1","Riffel","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3679 Riffel","1","0000-00-00 00:00:00","15384" +"7772","1","Eutsler","Rupert","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7772 Eutsler","1","0000-00-00 00:00:00","15386" +"2151","3","Dillenbeck","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2151 Dillenbeck","1","0000-00-00 00:00:00","22984" +"2151","1","Leight","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2151 Leight","1","0000-00-00 00:00:00","15388" +"3889","3","Flesher","Lina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3889 Flesher","1","0000-00-00 00:00:00","24639" +"5442","2","Andresen","Tanesha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5442 Andresen","1","0000-00-00 00:00:00","27283" +"5442","4","Drinkwater","Shalanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5442 Drinkwater","1","0000-00-00 00:00:00","27285" +"3013","1","Choiniere","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3013 Choiniere","1","0000-00-00 00:00:00","15391" +"3219","1","Dillenbeck","Ula","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3219 Dillenbeck","1","0000-00-00 00:00:00","15478" +"5336","2","Heinen","Stephany","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","5336 Heinen","1","0000-00-00 00:00:00","15535" +"5336","4","Novoa","Charla","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","5336 Novoa","1","0000-00-00 00:00:00","15537" +"8417","1","Singletary","Myrtis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8417 Singletary","1","0000-00-00 00:00:00","15481" +"1975","1","Pemberton","Felicitas","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1975 Pemberton","1","0000-00-00 00:00:00","15482" +"1323","3","Tramble","Cameron","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1323 Tramble","1","0000-00-00 00:00:00","24810" +"1323","2","Howze","Myrtle","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1323 Howze","1","0000-00-00 00:00:00","24809" +"953","1","Heller","Salena","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","953 Heller","1","0000-00-00 00:00:00","15484" +"504","3","Ayotte","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","504 Ayotte","1","0000-00-00 00:00:00","27470" +"504","1","Drinkwater","Carisa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","504 Drinkwater","1","0000-00-00 00:00:00","15485" +"3969","2","Flinchum","Mae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3969 Flinchum","1","0000-00-00 00:00:00","24182" +"976","2","Goggans","Shonda","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","976 Goggans","1","0000-00-00 00:00:00","20039" +"976","4","Noecker","Boyd","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","976 Noecker","1","0000-00-00 00:00:00","20041" +"1379","1","Debonis","Karlyn","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","1379 Debonis","1","0000-00-00 00:00:00","15490" +"4865","2","Eidt","Loreta","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","4865 Eidt","1","0000-00-00 00:00:00","15571" +"5681","2","Abrahams","Betsey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5681 Abrahams","1","0000-00-00 00:00:00","30835" +"7743","1","Davisson","Shondra","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7743 Davisson","1","0000-00-00 00:00:00","15495" +"7743","3","Keppel","Tommye","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","7743 Keppel","1","0000-00-00 00:00:00","20159" +"9767","2","Mueller","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9767 Mueller","1","0000-00-00 00:00:00","19907" +"3053","1","Hakala","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3053 Hakala","1","0000-00-00 00:00:00","15499" +"5104","1","Fortin","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5104 Fortin","1","0000-00-00 00:00:00","15500" +"9279","1","Lowe","Dannette","999.99","35.31","12","80","1","1","1","PC","3","1","0","0","999","0","9279 Lowe","1","0000-00-00 00:00:00","15501" +"9279","2","Palmatier","Caryl","999.99","35.31","12","80","1","1","1","PC","3","1","0","0","999","0","9279 Palmatier","1","0000-00-00 00:00:00","31760" +"3165","1","Czaja","Rutha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3165 Czaja","1","0000-00-00 00:00:00","15502" +"3361","1","Bickle","Caryl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3361 Bickle","1","0000-00-00 00:00:00","15505" +"1779","2","Tousignant","Macy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1779 Tousignant","1","0000-00-00 00:00:00","25173" +"9464","1","Blais","Gino","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","9464 Blais","1","0000-00-00 00:00:00","15508" +"6701","2","Maravilla","Veronica","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6701 Maravilla","1","0000-00-00 00:00:00","25234" +"8053","2","Rafael","Lakesha","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8053 Rafael","1","0000-00-00 00:00:00","26689" +"9143","2","Owsley","Calvin","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9143 Owsley","1","0000-00-00 00:00:00","27240" +"523","2","Pattison","Lonnie","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","523 Pattison","1","0000-00-00 00:00:00","26426" +"3047","2","Bickle","Catina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3047 Bickle","1","0000-00-00 00:00:00","24485" +"3825","2","Maheux","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3825 Maheux","1","0000-00-00 00:00:00","15702" +"8790","1","Woodfin","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8790 Woodfin","1","0000-00-00 00:00:00","15606" +"1569","2","Daquila","Jazmine","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1569 Daquila","1","0000-00-00 00:00:00","25106" +"6658","3","Scheidegger","Brittani","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6658 Scheidegger","1","0000-00-00 00:00:00","25428" +"6658","2","Harsh","Marceline","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6658 Harsh","1","0000-00-00 00:00:00","25427" +"3664","1","Glassman","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3664 Glassman","1","0000-00-00 00:00:00","15612" +"1524","2","Mcmorris","Love","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","1524 Mcmorris","1","0000-00-00 00:00:00","17066" +"9510","3","Hodson","Karlyn","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9510 Hodson","1","0000-00-00 00:00:00","29633" +"3532","2","Mollett","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3532 Mollett","1","0000-00-00 00:00:00","25058" +"3532","4","Drinkwater","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3532 Drinkwater","1","0000-00-00 00:00:00","25060" +"2873","1","Mccann","Argentina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2873 Mccann","1","0000-00-00 00:00:00","15617" +"4288","3","Furlong","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4288 Furlong","1","0000-00-00 00:00:00","15761" +"4288","1","Ellis","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4288 Ellis","1","0000-00-00 00:00:00","15618" +"5964","3","Mickey","Trinh","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5964 Mickey","1","0000-00-00 00:00:00","25489" +"3722","2","Penland","Bambi","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3722 Penland","1","0000-00-00 00:00:00","26777" +"1384","1","Finke","Myrtis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1384 Finke","1","0000-00-00 00:00:00","15622" +"2545","1","Janecek","Ericka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2545 Janecek","1","0000-00-00 00:00:00","15623" +"9437","2","Pung","Sharie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9437 Pung","1","0000-00-00 00:00:00","15862" +"3606","1","Daquila","Felicidad","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3606 Daquila","1","0000-00-00 00:00:00","15625" +"1462","1","Lach","Archie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1462 Lach","1","0000-00-00 00:00:00","15629" +"2751","1","Gerst","Clint","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","2751 Gerst","1","0000-00-00 00:00:00","15633" +"7932","1","Giguere","Deidra","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7932 Giguere","1","0000-00-00 00:00:00","15634" +"3273","1","Labree","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3273 Labree","1","0000-00-00 00:00:00","15635" +"980","2","Barhorst","Melonie","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","980 Barhorst","1","0000-00-00 00:00:00","26538" +"3431","2","Dealba","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3431 Dealba","1","0000-00-00 00:00:00","15818" +"618","3","Sachs","Kip","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","618 Sachs","1","0000-00-00 00:00:00","22466" +"618","1","James","Corrinne","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","618 James","1","0000-00-00 00:00:00","15639" +"9770","2","Janecek","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9770 Janecek","1","0000-00-00 00:00:00","15830" +"5000","1","Brehmer","Juliane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5000 Brehmer","1","0000-00-00 00:00:00","15641" +"7794","2","Headrick","Criselda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7794 Headrick","1","0000-00-00 00:00:00","15835" +"1659","1","Hornung","Jacklyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1659 Hornung","1","0000-00-00 00:00:00","15775" +"1659","3","Mraz","Jacquline","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","1659 Mraz","1","0000-00-00 00:00:00","15842" +"8026","1","Harsh","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8026 Harsh","1","0000-00-00 00:00:00","15778" +"1995","4","Mickey","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1995 Mickey","1","0000-00-00 00:00:00","20910" +"1995","1","Mccann","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1995 Mccann","1","0000-00-00 00:00:00","15780" +"3182","1","Coppola","Lashawn","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","3182 Coppola","1","0000-00-00 00:00:00","15783" +"6714","2","Srour","Trinh","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","6714 Srour","1","0000-00-00 00:00:00","15894" +"3113","1","Trigg","Bong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3113 Trigg","1","0000-00-00 00:00:00","15785" +"2679","1","Lapham","Jack","999.99","24.97","12","50","1","1","1","PC","3","1","0","0","999","0","2679 Lapham","1","0000-00-00 00:00:00","15787" +"2679","4","Plouffe","Jacob","999.99","24.97","12","50","1","1","1","PC","3","1","0","0","999","0","2679 Plouffe","1","0000-00-00 00:00:00","29157" +"8521","2","Larkin","Rebecca","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8521 Larkin","1","0000-00-00 00:00:00","15974" +"6446","1","Riffel","Julene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6446 Riffel","1","0000-00-00 00:00:00","15791" +"24","1","Riffel","Germaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","24 Riffel","1","0000-00-00 00:00:00","15792" +"1068","1","Hord","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1068 Hord","1","0000-00-00 00:00:00","15793" +"5884","1","Heller","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5884 Heller","1","0000-00-00 00:00:00","15796" +"3629","1","Feehan","Caryl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3629 Feehan","1","0000-00-00 00:00:00","15797" +"819","2","Melby","Philomena","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","819 Melby","1","0000-00-00 00:00:00","15920" +"6951","3","Bratten","Anamaria","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","6951 Bratten","1","0000-00-00 00:00:00","15962" +"6951","2","Glassman","Elyse","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","6951 Glassman","1","0000-00-00 00:00:00","15961" +"272","1","Mowen","Eve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","272 Mowen","1","0000-00-00 00:00:00","15801" +"5383","1","Milian","Barbar","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5383 Milian","1","0000-00-00 00:00:00","15802" +"7041","4","Hipps","Harriette","0","0","12","20","1","0","0","PC","3","1","0","0","999","0","7041 Hipps","1","0000-00-00 00:00:00","30742" +"7041","2","Paull","Bertha","0","0","12","20","1","0","0","PC","3","1","0","0","999","0","7041 Paull","1","0000-00-00 00:00:00","30740" +"6093","1","Ming","Aide","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","6093 Ming","1","0000-00-00 00:00:00","15805" +"9827","2","Lone","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9827 Lone","1","0000-00-00 00:00:00","30581" +"3632","3","Garbarino","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3632 Garbarino","1","0000-00-00 00:00:00","26997" +"3632","2","Snodgrass","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3632 Snodgrass","1","0000-00-00 00:00:00","26996" +"8652","2","Manzo","Royce","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8652 Manzo","1","0000-00-00 00:00:00","25666" +"6939","2","Weishaar","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6939 Weishaar","1","0000-00-00 00:00:00","15984" +"4043","2","Palmatier","Pei","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4043 Palmatier","1","0000-00-00 00:00:00","25618" +"1766","2","Prichett","Dixie","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","1766 Prichett","1","0000-00-00 00:00:00","22998" +"9617","1","Mcglothlen","Debera","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","9617 Mcglothlen","1","0000-00-00 00:00:00","15813" +"8140","3","Tawil","Owen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8140 Tawil","1","0000-00-00 00:00:00","16056" +"8140","1","Rothman","Lai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8140 Rothman","1","0000-00-00 00:00:00","15921" +"5553","1","Mattia","Huey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5553 Mattia","1","0000-00-00 00:00:00","15923" +"5553","2","Alexandra","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5553 Alexandra","1","0000-00-00 00:00:00","16001" +"1439","1","Montalbo","Annabel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1439 Montalbo","1","0000-00-00 00:00:00","15925" +"1439","2","Mueller","Danae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1439 Mueller","1","0000-00-00 00:00:00","16006" +"2253","1","Pillai","Violette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2253 Pillai","1","0000-00-00 00:00:00","15926" +"2253","3","Gargiulo","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2253 Gargiulo","1","0000-00-00 00:00:00","29125" +"28","1","Leto","Jefferson","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","28 Leto","1","0000-00-00 00:00:00","15927" +"8632","2","Mraz","Tawna","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","8632 Mraz","1","0000-00-00 00:00:00","25766" +"8632","3","Choiniere","Janelle","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","8632 Choiniere","1","0000-00-00 00:00:00","25767" +"5736","3","Novoa","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5736 Novoa","1","0000-00-00 00:00:00","31182" +"5736","1","Boggan","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5736 Boggan","1","0000-00-00 00:00:00","15931" +"8509","1","Stockard","Margo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8509 Stockard","1","0000-00-00 00:00:00","15932" +"8557","2","Knudsen","Nellie","0","20","0","20","1","0","0","PC","1","0","0","0","999","0","8557 Knudsen","1","0000-00-00 00:00:00","30592" +"6624","2","Ater","Leanora","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","6624 Ater","1","0000-00-00 00:00:00","16085" +"2719","1","Narcisse","Brianne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2719 Narcisse","1","0000-00-00 00:00:00","15938" +"5674","2","Ayotte","Lise","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5674 Ayotte","1","0000-00-00 00:00:00","18360" +"6350","1","Alsobrook","Marcelene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6350 Alsobrook","1","0000-00-00 00:00:00","15941" +"395","2","Harsh","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","395 Harsh","1","0000-00-00 00:00:00","16053" +"6092","2","Ro","Brendan","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","6092 Ro","1","0000-00-00 00:00:00","22160" +"5327","2","Deppen","Anamaria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5327 Deppen","1","0000-00-00 00:00:00","16059" +"9500","1","Petrarca","Britt","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9500 Petrarca","1","0000-00-00 00:00:00","15948" +"4693","2","Hakala","Serafina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4693 Hakala","1","0000-00-00 00:00:00","16065" +"4693","1","Pickell","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4693 Pickell","1","0000-00-00 00:00:00","15950" +"3468","1","Remsen","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3468 Remsen","1","0000-00-00 00:00:00","15951" +"5054","2","Kort","Katrice","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5054 Kort","1","0000-00-00 00:00:00","22426" +"3317","1","Bilbo","Indira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3317 Bilbo","1","0000-00-00 00:00:00","15953" +"5569","1","Eichler","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5569 Eichler","1","0000-00-00 00:00:00","15958" +"2704","1","Lueck","Billy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2704 Lueck","1","0000-00-00 00:00:00","15959" +"5278","1","Moses","Winona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5278 Moses","1","0000-00-00 00:00:00","16088" +"4203","1","Clatterbuck","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4203 Clatterbuck","1","0000-00-00 00:00:00","16090" +"1015","2","Caraballo","Shawnna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1015 Caraballo","1","0000-00-00 00:00:00","16156" +"7134","1","Steele","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7134 Steele","1","0000-00-00 00:00:00","16093" +"8636","2","Hafley","Rhona","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8636 Hafley","1","0000-00-00 00:00:00","26191" +"3851","1","Coppola","Myrl","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","3851 Coppola","1","0000-00-00 00:00:00","16098" +"393","2","Daquila","Milford","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","393 Daquila","1","0000-00-00 00:00:00","24629" +"5951","2","Hellmann","Mae","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","5951 Hellmann","1","0000-00-00 00:00:00","26355" +"1661","1","Defreitas","Barb","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1661 Defreitas","1","0000-00-00 00:00:00","16101" +"9944","1","Toscano","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9944 Toscano","1","0000-00-00 00:00:00","16103" +"1694","2","Grothe","Gina","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","1694 Grothe","1","0000-00-00 00:00:00","16187" +"7955","1","Stockard","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7955 Stockard","1","0000-00-00 00:00:00","16105" +"3134","1","Beer","Hattie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3134 Beer","1","0000-00-00 00:00:00","16108" +"8186","2","Guidi","Violette","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8186 Guidi","1","0000-00-00 00:00:00","16198" +"3526","2","Vasques","Lashon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3526 Vasques","1","0000-00-00 00:00:00","16202" +"5837","2","Spohn","Monte","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5837 Spohn","1","0000-00-00 00:00:00","28097" +"3465","1","Ammann","Zachery","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3465 Ammann","1","0000-00-00 00:00:00","16114" +"7728","1","Tardiff","Jamie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7728 Tardiff","1","0000-00-00 00:00:00","16115" +"4479","2","Villafane","Debera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4479 Villafane","1","0000-00-00 00:00:00","16256" +"220","1","Cimini","Tanesha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","220 Cimini","1","0000-00-00 00:00:00","16117" +"7312","1","Diamond","Dominick","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","7312 Diamond","1","0000-00-00 00:00:00","16118" +"1268","1","Baumgart","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1268 Baumgart","1","0000-00-00 00:00:00","16119" +"5317","3","Tardiff","Rhona","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5317 Tardiff","1","0000-00-00 00:00:00","25856" +"9168","2","Bickle","Joelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9168 Bickle","1","0000-00-00 00:00:00","16268" +"9332","1","Vasques","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9332 Vasques","1","0000-00-00 00:00:00","16124" +"3386","3","Suen","Boyce","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3386 Suen","1","0000-00-00 00:00:00","16270" +"6076","1","Pelchat","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6076 Pelchat","1","0000-00-00 00:00:00","16126" +"2548","2","Arata","Augusta","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","2548 Arata","1","0000-00-00 00:00:00","16274" +"5046","1","Chain","Dianna","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5046 Chain","1","0000-00-00 00:00:00","16215" +"3214","2","Heinen","Larae","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3214 Heinen","1","0000-00-00 00:00:00","16275" +"2035","1","Dealba","Collene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2035 Dealba","1","0000-00-00 00:00:00","16218" +"9851","1","Michel","Tawna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9851 Michel","1","0000-00-00 00:00:00","16219" +"7132","2","Heller","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7132 Heller","1","0000-00-00 00:00:00","27636" +"1546","1","Band","Madie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1546 Band","1","0000-00-00 00:00:00","16221" +"5088","1","Pemberton","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5088 Pemberton","1","0000-00-00 00:00:00","16222" +"5625","2","Goldsborough","Marc","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5625 Goldsborough","1","0000-00-00 00:00:00","26537" +"9731","2","Walborn","Marc","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9731 Walborn","1","0000-00-00 00:00:00","26556" +"8614","1","Maravilla","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8614 Maravilla","1","0000-00-00 00:00:00","16225" +"3198","1","Gerst","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3198 Gerst","1","0000-00-00 00:00:00","16226" +"6562","1","Lone","Kortney","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","6562 Lone","1","0000-00-00 00:00:00","16228" +"6562","3","Nevin","Nell","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","6562 Nevin","1","0000-00-00 00:00:00","23936" +"6096","2","Darwin","Mae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6096 Darwin","1","0000-00-00 00:00:00","29602" +"1415","2","Sweigart","Wanita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1415 Sweigart","1","0000-00-00 00:00:00","31051" +"9542","2","Hafley","Dagmar","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9542 Hafley","1","0000-00-00 00:00:00","28793" +"584","1","Claussen","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","584 Claussen","1","0000-00-00 00:00:00","16232" +"6977","2","Peer","Teisha","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6977 Peer","1","0000-00-00 00:00:00","24459" +"364","1","Pelchat","Queen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","364 Pelchat","1","0000-00-00 00:00:00","16235" +"2182","3","Havlik","Rutha","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2182 Havlik","1","0000-00-00 00:00:00","26549" +"2182","1","Hodson","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2182 Hodson","1","0000-00-00 00:00:00","16236" +"1826","3","Ayotte","Marry","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1826 Ayotte","1","0000-00-00 00:00:00","25859" +"1826","1","Sitzman","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1826 Sitzman","1","0000-00-00 00:00:00","16237" +"5410","2","Feliciano","Cruz","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5410 Feliciano","1","0000-00-00 00:00:00","16323" +"5395","2","Cruzado","Josie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","5395 Cruzado","1","0000-00-00 00:00:00","16324" +"5395","1","Kouba","Shanta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5395 Kouba","1","0000-00-00 00:00:00","16239" +"5248","2","Rozzi","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5248 Rozzi","1","0000-00-00 00:00:00","21300" +"1452","1","Zahn","Vesta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1452 Zahn","1","0000-00-00 00:00:00","16242" +"6794","1","Lamson","Serafina","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","6794 Lamson","1","0000-00-00 00:00:00","16244" +"5562","2","Guidi","Lonnie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","5562 Guidi","1","0000-00-00 00:00:00","16333" +"5155","1","Kriger","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5155 Kriger","1","0000-00-00 00:00:00","16247" +"5810","1","Sherron","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5810 Sherron","1","0000-00-00 00:00:00","16248" +"8061","2","Swarey","Rupert","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8061 Swarey","1","0000-00-00 00:00:00","23490" +"1907","1","Rafael","Isa","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1907 Rafael","1","0000-00-00 00:00:00","16250" +"5893","1","Somma","Alvaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5893 Somma","1","0000-00-00 00:00:00","16251" +"3321","2","Garbarino","Gwyneth","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3321 Garbarino","1","0000-00-00 00:00:00","29415" +"6237","2","Bertucci","Chong","0","17.31","0","20","1","0","0","PC","1","0","0","0","999","0","6237 Bertucci","1","0000-00-00 00:00:00","23706" +"2665","1","Lowe","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2665 Lowe","1","0000-00-00 00:00:00","16334" +"3904","2","Dealba","Shalanda","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3904 Dealba","1","0000-00-00 00:00:00","25525" +"3216","1","Snively","Theron","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3216 Snively","1","0000-00-00 00:00:00","16336" +"8769","2","Marston","Marcus","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8769 Marston","1","0000-00-00 00:00:00","31607" +"5008","2","Peltier","Mi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5008 Peltier","1","0000-00-00 00:00:00","30580" +"8989","2","Manganaro","Stefanie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8989 Manganaro","1","0000-00-00 00:00:00","16390" +"9326","4","Bohn","Hattie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9326 Bohn","1","0000-00-00 00:00:00","26762" +"9326","2","Limon","Letisha","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9326 Limon","1","0000-00-00 00:00:00","26760" +"6435","1","Labree","Celia","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","6435 Labree","1","0000-00-00 00:00:00","16341" +"6435","2","Broderson","Aide","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","6435 Broderson","1","0000-00-00 00:00:00","16396" +"1597","2","Steffey","Shirlee","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1597 Steffey","1","0000-00-00 00:00:00","22717" +"780","3","Voges","Jazmine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","780 Voges","1","0000-00-00 00:00:00","30628" +"780","4","Shoe","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","780 Shoe","1","0000-00-00 00:00:00","30629" +"8390","3","Bouknight","Calista","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8390 Bouknight","1","0000-00-00 00:00:00","22050" +"8390","1","Szewczyk","Shella","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8390 Szewczyk","1","0000-00-00 00:00:00","16346" +"1935","2","Riche","Beverlee","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","1935 Riche","1","0000-00-00 00:00:00","3717" +"4918","3","Marnell","Shaneka","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4918 Marnell","1","0000-00-00 00:00:00","16410" +"2475","1","Paiva","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2475 Paiva","1","0000-00-00 00:00:00","16348" +"4644","1","Pelchat","Marcus","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4644 Pelchat","1","0000-00-00 00:00:00","16351" +"4644","2","Montalbo","Delaine","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4644 Montalbo","1","0000-00-00 00:00:00","23031" +"4771","1","Beltrami","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4771 Beltrami","1","0000-00-00 00:00:00","16353" +"2047","1","Sester","Ulrike","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2047 Sester","1","0000-00-00 00:00:00","16354" +"2047","2","Tawil","Luther","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2047 Tawil","1","0000-00-00 00:00:00","25240" +"2037","1","Gains","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2037 Gains","1","0000-00-00 00:00:00","16355" +"1","1","Saddler","Keneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1 Saddler","1","0000-00-00 00:00:00","16357" +"596","2","Aviles","Hortensia","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","596 Aviles","1","0000-00-00 00:00:00","23458" +"3905","2","Srour","Gino","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","3905 Srour","1","0000-00-00 00:00:00","16426" +"8194","1","Fortin","Roderick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8194 Fortin","1","0000-00-00 00:00:00","16360" +"8194","2","Caraballo","Royce","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8194 Caraballo","1","0000-00-00 00:00:00","28827" +"7087","2","Hinshaw","Ira","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","7087 Hinshaw","1","0000-00-00 00:00:00","26770" +"1774","3","Simms","Tamica","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","1774 Simms","1","0000-00-00 00:00:00","16436" +"319","2","Hardage","Stefanie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","319 Hardage","1","0000-00-00 00:00:00","21189" +"319","3","Rodrigez","Eddie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","319 Rodrigez","1","0000-00-00 00:00:00","21190" +"7199","2","Anding","Eldridge","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","7199 Anding","1","0000-00-00 00:00:00","16480" +"7199","1","Scurry","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7199 Scurry","1","0000-00-00 00:00:00","16365" +"8263","3","Keppler","Slyvia","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8263 Keppler","1","0000-00-00 00:00:00","21809" +"2202","1","Glassman","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2202 Glassman","1","0000-00-00 00:00:00","16367" +"2202","2","Mckillip","Gregorio","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2202 Mckillip","1","0000-00-00 00:00:00","27968" +"3572","1","Parisien","Maria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3572 Parisien","1","0000-00-00 00:00:00","16368" +"6654","1","Conger","Sharie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6654 Conger","1","0000-00-00 00:00:00","16369" +"5507","2","Riche","Annalee","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5507 Riche","1","0000-00-00 00:00:00","21106" +"1574","2","Calo","Joslyn","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","1574 Calo","1","0000-00-00 00:00:00","16495" +"1998","3","Marston","Yael","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1998 Marston","1","0000-00-00 00:00:00","24804" +"1998","2","Tramble","Selma","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1998 Tramble","1","0000-00-00 00:00:00","24803" +"4469","1","Leto","Rupert","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4469 Leto","1","0000-00-00 00:00:00","16373" +"5971","2","Biery","Lemuel","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5971 Biery","1","0000-00-00 00:00:00","17872" +"9240","2","Finlayson","Page","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9240 Finlayson","1","0000-00-00 00:00:00","20782" +"8008","2","Spitz","Lang","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8008 Spitz","1","0000-00-00 00:00:00","16510" +"8008","1","Ellis","Kenneth","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8008 Ellis","1","0000-00-00 00:00:00","16442" +"5919","3","Ro","Adrien","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5919 Ro","1","0000-00-00 00:00:00","16513" +"5939","1","Weathersby","Milford","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5939 Weathersby","1","0000-00-00 00:00:00","16444" +"1986","2","Toribio","Calista","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","1986 Toribio","1","0000-00-00 00:00:00","25524" +"6535","1","Maestas","Gene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6535 Maestas","1","0000-00-00 00:00:00","16446" +"181","1","Vanwagenen","Tanesha","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","181 Vanwagenen","1","0000-00-00 00:00:00","16447" +"1955","3","Goodell","Lazaro","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1955 Goodell","1","0000-00-00 00:00:00","16530" +"1955","2","Coache","Indira","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1955 Coache","1","0000-00-00 00:00:00","16529" +"9006","1","Nall","Cleta","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9006 Nall","1","0000-00-00 00:00:00","16449" +"2888","3","Funches","Glinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2888 Funches","1","0000-00-00 00:00:00","23531" +"431","2","Caraballo","Brendan","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","431 Caraballo","1","0000-00-00 00:00:00","26698" +"431","1","Strother","Sarai","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","431 Strother","1","0000-00-00 00:00:00","16451" +"1152","1","Barefield","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1152 Barefield","1","0000-00-00 00:00:00","16452" +"3490","3","Baily","Larae","999.99","0","0","20","1","1","1","PC","1","0","0","2819.31","999","0","3490 Baily","1","0000-00-00 00:00:00","2372" +"2156","1","Nance","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2156 Nance","1","0000-00-00 00:00:00","16453" +"9380","2","Pendergrass","Earleen","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","9380 Pendergrass","1","0000-00-00 00:00:00","16548" +"9380","4","Durand","Barb","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","9380 Durand","1","0000-00-00 00:00:00","16550" +"126","1","Braley","Rochell","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","126 Braley","1","0000-00-00 00:00:00","16455" +"3864","1","Hunsaker","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3864 Hunsaker","1","0000-00-00 00:00:00","16457" +"8626","2","Minnix","Wanita","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","8626 Minnix","1","0000-00-00 00:00:00","16557" +"871","2","Roten","Jarvis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","871 Roten","1","0000-00-00 00:00:00","18578" +"2856","2","Titsworth","Jacquline","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","2856 Titsworth","1","0000-00-00 00:00:00","16559" +"610","2","Donald","Cornelius","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","610 Donald","1","0000-00-00 00:00:00","17891" +"4371","1","Clatterbuck","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4371 Clatterbuck","1","0000-00-00 00:00:00","16462" +"3036","2","Aviles","Demetrice","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3036 Aviles","1","0000-00-00 00:00:00","27223" +"1284","1","Wilmes","Gaylord","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1284 Wilmes","1","0000-00-00 00:00:00","16463" +"2732","1","Spier","Zane","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2732 Spier","1","0000-00-00 00:00:00","16464" +"291","1","Pung","Maurice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","291 Pung","1","0000-00-00 00:00:00","16465" +"291","2","Carolan","Ines","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","291 Carolan","1","0000-00-00 00:00:00","29634" +"5620","2","Darner","Carmine","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","5620 Darner","1","0000-00-00 00:00:00","16568" +"722","1","Strother","Davis","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","722 Strother","1","0000-00-00 00:00:00","16467" +"3355","1","Srour","Lesia","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3355 Srour","1","0000-00-00 00:00:00","16468" +"3355","2","Rozzell","Lady","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3355 Rozzell","1","0000-00-00 00:00:00","16574" +"1119","2","Hennings","Ezekiel","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1119 Hennings","1","0000-00-00 00:00:00","22165" +"5510","2","Arata","Ramiro","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5510 Arata","1","0000-00-00 00:00:00","28431" +"117","2","Settles","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","117 Settles","1","0000-00-00 00:00:00","27936" +"3960","2","Caraballo","Mariette","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3960 Caraballo","1","0000-00-00 00:00:00","29012" +"9662","2","Lanier","Sherice","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","9662 Lanier","1","0000-00-00 00:00:00","16590" +"9558","1","Goodell","Eulah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9558 Goodell","1","0000-00-00 00:00:00","16475" +"6291","1","Gunderman","Robbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6291 Gunderman","1","0000-00-00 00:00:00","16476" +"6291","2","Goodell","Isabelle","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","6291 Goodell","1","0000-00-00 00:00:00","16591" +"7922","2","Diamond","Teodoro","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","7922 Diamond","1","0000-00-00 00:00:00","16593" +"4294","3","Headrick","Macy","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4294 Headrick","1","0000-00-00 00:00:00","26782" +"1997","1","Fitting","Lino","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","1997 Fitting","1","0000-00-00 00:00:00","16479" +"7149","2","Owsley","Stefanie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","7149 Owsley","1","0000-00-00 00:00:00","16638" +"2607","1","Stedman","Maria","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2607 Stedman","1","0000-00-00 00:00:00","16598" +"3838","2","Mcelvain","Bridget","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","3838 Mcelvain","1","0000-00-00 00:00:00","16639" +"5121","4","Spier","Ramiro","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5121 Spier","1","0000-00-00 00:00:00","27967" +"5121","2","Esterly","Theo","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5121 Esterly","1","0000-00-00 00:00:00","27965" +"1851","2","Aviles","Jacob","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","1851 Aviles","1","0000-00-00 00:00:00","16646" +"514","2","Pelchat","Davina","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","514 Pelchat","1","0000-00-00 00:00:00","16645" +"9488","2","Nowland","Romelia","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","9488 Nowland","1","0000-00-00 00:00:00","16647" +"1633","2","Flinchum","Augusta","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1633 Flinchum","1","0000-00-00 00:00:00","27802" +"8822","1","Dantin","So","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8822 Dantin","1","0000-00-00 00:00:00","16606" +"4999","1","Lheureux","Nell","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4999 Lheureux","1","0000-00-00 00:00:00","16607" +"1749","2","Stahl","Lovetta","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","1749 Stahl","1","0000-00-00 00:00:00","16655" +"2784","2","Sitzman","Lazaro","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","2784 Sitzman","1","0000-00-00 00:00:00","16657" +"4663","1","Tidmore","Shonda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4663 Tidmore","1","0000-00-00 00:00:00","16610" +"2344","4","Graybeal","Lillian","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2344 Graybeal","1","0000-00-00 00:00:00","17708" +"2344","3","Able","Ruthie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2344 Able","1","0000-00-00 00:00:00","17707" +"4452","2","Toscano","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4452 Toscano","1","0000-00-00 00:00:00","21301" +"1625","1","Flinchum","Jamaal","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1625 Flinchum","1","0000-00-00 00:00:00","16613" +"5767","2","Eisenhower","Latisha","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5767 Eisenhower","1","0000-00-00 00:00:00","18928" +"7396","1","Rothman","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7396 Rothman","1","0000-00-00 00:00:00","16615" +"4969","1","Eidt","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4969 Eidt","1","0000-00-00 00:00:00","16616" +"2573","1","Strange","Joaquina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2573 Strange","1","0000-00-00 00:00:00","16617" +"382","1","Saldivar","Venetta","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","382 Saldivar","1","0000-00-00 00:00:00","16618" +"382","3","Creel","Madie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","382 Creel","1","0000-00-00 00:00:00","24960" +"5458","2","Giguere","Myrl","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5458 Giguere","1","0000-00-00 00:00:00","16682" +"5420","1","Botkin","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5420 Botkin","1","0000-00-00 00:00:00","16620" +"6515","1","Fierro","Shante","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6515 Fierro","1","0000-00-00 00:00:00","16621" +"5972","1","Riffel","Carol","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5972 Riffel","1","0000-00-00 00:00:00","16622" +"6005","2","Strange","Tanya","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6005 Strange","1","0000-00-00 00:00:00","29140" +"8487","2","Hults","Jared","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8487 Hults","1","0000-00-00 00:00:00","22504" +"1005","1","Coello","Lazaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1005 Coello","1","0000-00-00 00:00:00","16625" +"1272","1","Mueller","Shirlee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1272 Mueller","1","0000-00-00 00:00:00","16626" +"11","1","","","999.99","0","0","-999999","0","1","1","REG","0","0","0","1914526.04","999","0","11 ","1","0000-00-00 00:00:00","6696" +"5668","1","Swicegood","Harriette","999.99","0","0","20","1","1","1","PC","1","0","0","4608.56","999","0","5668 Swicegood","1","0000-00-00 00:00:00","1304" +"4687","2","Steven","Delinda","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4687 Steven","1","0000-00-00 00:00:00","28125" +"3615","1","Heinen","Roderick","999.99","0","0","20","1","1","1","PC","1","0","0","6087.82","999","0","3615 Heinen","1","0000-00-00 00:00:00","1146" +"2496","1","Titsworth","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","385.42","999","0","2496 Titsworth","1","0000-00-00 00:00:00","4928" +"2857","1","Wessner","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","1416.14","999","1","2857 Wessner","1","0000-00-00 00:00:00","2972" +"3847","3","Dealba","Love","999.99","0","0","20","1","1","1","PC","1","0","0","8796.44","999","0","3847 Dealba","1","0000-00-00 00:00:00","25952" +"3847","2","Means","Rozella","999.99","0","0","20","1","1","1","PC","1","0","0","8796.44","999","0","3847 Means","1","0000-00-00 00:00:00","25951" +"4051","3","Strother","Betsey","999.99","0","0","20","1","1","1","PC","1","0","0","1567.78","999","0","4051 Strother","1","0000-00-00 00:00:00","6441" +"3685","3","Havlik","Taryn","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3685 Havlik","1","0000-00-00 00:00:00","14098" +"3685","2","Manganaro","Clint","999.99","0","0","20","1","0","1","PC","1","0","0","2812.23","999","0","3685 Manganaro","1","0000-00-00 00:00:00","2481" +"8055","1","Spohn","Harriette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8055 Spohn","1","0000-00-00 00:00:00","2983" +"2979","2","Simons","Deidra","999.99","0","0","20","1","1","1","PC","1","0","0","1954.39","999","0","2979 Simons","1","0000-00-00 00:00:00","6235" +"5661","4","Snively","Lemuel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5661 Snively","1","0000-00-00 00:00:00","14400" +"5661","2","Hellmann","Rochell","999.99","0","0","20","1","0","1","PC","1","0","0","1003.47","999","0","5661 Hellmann","1","0000-00-00 00:00:00","3218" +"1468","2","Metro","Roseann","999.99","0","0","20","1","0","1","PC","1","0","0","1058.17","999","0","1468 Metro","1","0000-00-00 00:00:00","4698" +"5016","2","Kari","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","1003.51","999","0","5016 Kari","1","0000-00-00 00:00:00","256" +"2739","3","Moses","Josephina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2739 Moses","1","0000-00-00 00:00:00","24556" +"2739","1","Steitz","Dannette","999.99","0","0","20","1","1","1","PC","1","0","0","3824.19","999","0","2739 Steitz","1","0000-00-00 00:00:00","1688" +"3262","2","Guebert","Lady","999.99","0","0","20","1","1","1","PC","1","0","0","143.54","999","1","3262 Guebert","1","0000-00-00 00:00:00","6037" +"3383","1","Broderson","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","498.37","999","0","3383 Broderson","1","0000-00-00 00:00:00","458" +"6016","1","Frith","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","186.67","999","1","6016 Frith","1","0000-00-00 00:00:00","4215" +"5737","1","Sherron","Jefferson","999.99","0","0","20","1","1","1","PC","1","0","0","1734.85","999","0","5737 Sherron","1","0000-00-00 00:00:00","1836" +"8872","1","Scurry","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","1589.93","999","0","8872 Scurry","1","0000-00-00 00:00:00","5331" +"5181","1","Sunderland","Shanta","999.99","0","0","20","1","1","1","PC","1","0","0","1592.57","999","1","5181 Sunderland","1","0000-00-00 00:00:00","429" +"1836","2","Kirst","Summer","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1836 Kirst","1","0000-00-00 00:00:00","30932" +"6456","2","Lane","Earleen","999.99","0","0","20","1","1","1","PC","1","0","0","2752.96","999","0","6456 Lane","1","0000-00-00 00:00:00","16255" +"5886","1","Somma","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","2074.79","999","0","5886 Somma","1","0000-00-00 00:00:00","1492" +"6537","1","Liu","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","53.45","999","0","6537 Liu","1","0000-00-00 00:00:00","751" +"143","2","Steffey","Mi","999.99","0","0","20","1","1","1","PC","1","0","0","1234.78","999","0","143 Steffey","1","0000-00-00 00:00:00","5663" +"2511","1","Gory","Latoya","999.99","0","0","20","1","1","1","PC","1","0","0","1092.41","999","0","2511 Gory","1","0000-00-00 00:00:00","2379" +"4432","1","Dobson","Yasuko","999.99","0","0","20","1","1","1","PC","1","0","0","2667.86","999","1","4432 Dobson","1","0000-00-00 00:00:00","6105" +"4594","2","Czaja","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","143.06","999","0","4594 Czaja","1","0000-00-00 00:00:00","1443" +"7746","2","Remsen","Korey","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7746 Remsen","1","0000-00-00 00:00:00","29561" +"4793","2","Weiler","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","168.64","999","0","4793 Weiler","1","0000-00-00 00:00:00","22968" +"2650","3","Probst","Ines","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2650 Probst","1","0000-00-00 00:00:00","11383" +"2650","1","Sitzman","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","164.33","999","1","2650 Sitzman","1","0000-00-00 00:00:00","6478" +"727","1","Lary","Bertha","999.99","0","0","20","1","1","1","PC","1","0","0","1979.64","999","0","727 Lary","1","0000-00-00 00:00:00","1620" +"2194","3","Vanwagenen","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","7747.11","999","0","2194 Vanwagenen","1","0000-00-00 00:00:00","6063" +"2194","2","Mcneel","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","7747.11","999","0","2194 Mcneel","1","0000-00-00 00:00:00","2390" +"3328","2","Feehan","Vern","999.99","0","0","20","1","0","1","PC","1","0","0","2229.22","999","0","3328 Feehan","1","0000-00-00 00:00:00","802" +"4933","3","Carolan","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","4601.11","999","0","4933 Carolan","1","0000-00-00 00:00:00","23805" +"4933","1","Brundige","Jazmine","999.99","0","0","20","1","1","1","PC","1","0","0","4601.11","999","0","4933 Brundige","1","0000-00-00 00:00:00","4507" +"2239","1","Godines","Geraldo","999.99","0","0","0","1","1","1","TERM","0","0","0","844.09","999","0","2239 Godines","1","0000-00-00 00:00:00","1787" +"3033","1","Wynkoop","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","7556.4","999","0","3033 Wynkoop","1","0000-00-00 00:00:00","6528" +"3033","4","Swicegood","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","7556.4","999","0","3033 Swicegood","1","0000-00-00 00:00:00","26885" +"5621","3","Stump","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","7137.3","999","0","5621 Stump","1","0000-00-00 00:00:00","23136" +"5621","1","Lajeunesse","Maynard","999.99","0","0","20","1","1","1","PC","1","0","0","7137.3","999","0","5621 Lajeunesse","1","0000-00-00 00:00:00","5812" +"9048","1","Spitz","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","85.83","999","1","9048 Spitz","1","0000-00-00 00:00:00","573" +"2206","2","Michaels","Earle","999.99","0","0","20","1","0","1","PC","1","0","0","1786.39","999","0","2206 Michaels","1","0000-00-00 00:00:00","5631" +"5664","1","Ratti","Carol","999.99","0","0","20","1","1","1","PC","1","0","0","307.3","999","1","5664 Ratti","1","0000-00-00 00:00:00","1418" +"4042","1","Defreitas","Myrtis","999.99","0","0","20","1","1","1","PC","1","0","0","1379.87","999","0","4042 Defreitas","1","0000-00-00 00:00:00","4294" +"839","2","Mcleroy","Roderick","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","839 Mcleroy","1","0000-00-00 00:00:00","28688" +"2264","2","Lary","Susana","999.99","0","0","20","1","1","1","PC","1","0","0","1652.84","999","0","2264 Lary","1","0000-00-00 00:00:00","27920" +"2264","4","Sunderland","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","1652.84","999","0","2264 Sunderland","1","0000-00-00 00:00:00","27922" +"1810","2","Wynkoop","Lillian","999.99","0","0","20","1","1","1","PC","1","0","0","309.2","999","1","1810 Wynkoop","1","0000-00-00 00:00:00","5297" +"9555","1","Lujan","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","1539.8","999","0","9555 Lujan","1","0000-00-00 00:00:00","358" +"2477","1","Ducan","Glinda","999.99","0","0","20","1","1","1","PC","1","0","0","3235.21","999","0","2477 Ducan","1","0000-00-00 00:00:00","2761" +"1627","2","Eichler","Jamie","999.99","0","0","20","1","1","1","PC","1","0","0","2522.94","999","0","1627 Eichler","1","0000-00-00 00:00:00","2357" +"3865","2","Silas","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","9998.89","999","1","3865 Silas","1","0000-00-00 00:00:00","15753" +"4357","1","Andresen","Garland","999.99","17.04","0","20","1","1","1","PC","1","0","0","2826.39","999","0","4357 Andresen","1","0000-00-00 00:00:00","6302" +"4357","3","Vasko","Ula","999.99","17.04","0","20","1","0","1","PC","1","0","0","2826.39","999","0","4357 Vasko","1","0000-00-00 00:00:00","2941" +"8696","4","Coppola","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","1622.13","999","0","8696 Coppola","1","0000-00-00 00:00:00","5755" +"8696","1","Howze","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","1622.13","999","0","8696 Howze","1","0000-00-00 00:00:00","1128" +"9486","1","Mcmorris","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","3487.9","999","0","9486 Mcmorris","1","0000-00-00 00:00:00","4455" +"3407","3","Strange","Shizuko","999.99","0","0","20","1","1","1","PC","1","0","0","1220.07","999","0","3407 Strange","1","0000-00-00 00:00:00","16753" +"5722","1","Probst","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","2122.6","999","0","5722 Probst","1","0000-00-00 00:00:00","6365" +"987","1","Faber","Beverlee","999.99","0","0","20","1","1","1","PC","1","0","0","1851.89","999","0","987 Faber","1","0000-00-00 00:00:00","5064" +"1331","2","Capshaw","Lina","999.99","0","0","20","1","0","1","PC","1","0","0","2459.4","999","0","1331 Capshaw","1","0000-00-00 00:00:00","4207" +"1971","1","Fuell","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","1225.53","999","0","1971 Fuell","1","0000-00-00 00:00:00","175" +"1971","3","Monsivais","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","1225.53","999","0","1971 Monsivais","1","0000-00-00 00:00:00","5575" +"6071","2","Wedderburn","Billy","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6071 Wedderburn","1","0000-00-00 00:00:00","19648" +"9115","2","Hornung","Quincy","999.99","0","0","20","1","0","1","PC","1","0","0","3392.54","999","0","9115 Hornung","1","0000-00-00 00:00:00","3934" +"1900","1","Owen","Junita","999.99","0","0","20","1","1","1","PC","1","0","0","2500.06","999","0","1900 Owen","1","0000-00-00 00:00:00","3682" +"3449","2","Medley","Joslyn","999.99","0","0","20","1","0","1","PC","1","0","0","800.35","999","0","3449 Medley","1","0000-00-00 00:00:00","16775" +"1380","2","Swicegood","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","5485.55","999","0","1380 Swicegood","1","0000-00-00 00:00:00","31765" +"4339","2","Hagaman","Joelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4339 Hagaman","1","0000-00-00 00:00:00","9949" +"4339","4","Deppen","Roseann","999.99","0","0","20","1","0","1","PC","1","0","0","1561.98","999","1","4339 Deppen","1","0000-00-00 00:00:00","6491" +"7853","1","Nally","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","313.68","999","1","7853 Nally","1","0000-00-00 00:00:00","7229" +"1374","2","Deppen","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","5981.85","999","0","1374 Deppen","1","0000-00-00 00:00:00","5204" +"4815","2","Ayotte","Jed","999.99","0","0","20","1","0","1","PC","1","0","0","1327.2","999","0","4815 Ayotte","1","0000-00-00 00:00:00","2610" +"1058","1","Tramble","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","2107.15","999","0","1058 Tramble","1","0000-00-00 00:00:00","1118" +"5097","2","Mckillip","Lino","999.99","0","0","20","1","1","1","PC","1","0","0","6466.87","999","1","5097 Mckillip","1","0000-00-00 00:00:00","27097" +"1772","2","Tardiff","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","657.06","999","0","1772 Tardiff","1","0000-00-00 00:00:00","31770" +"9053","1","Guebert","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","800.18","999","0","9053 Guebert","1","0000-00-00 00:00:00","4179" +"3399","2","Petrarca","Arron","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3399 Petrarca","1","0000-00-00 00:00:00","17805" +"7264","3","Kilpatrick","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","1771.57","999","0","7264 Kilpatrick","1","0000-00-00 00:00:00","30456" +"7264","2","Arata","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","1771.57","999","0","7264 Arata","1","0000-00-00 00:00:00","30455" +"3682","1","Prichett","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","1082.5","999","1","3682 Prichett","1","0000-00-00 00:00:00","792" +"6751","1","Capshaw","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","1266.83","999","1","6751 Capshaw","1","0000-00-00 00:00:00","5815" +"7737","1","Fuell","Owen","999.99","0","0","20","1","1","1","PC","1","0","0","237.8","999","0","7737 Fuell","1","0000-00-00 00:00:00","2760" +"9473","2","Heller","Marcelene","999.99","0","0","20","1","1","1","PC","1","0","0","2624.64","999","0","9473 Heller","1","0000-00-00 00:00:00","23947" +"7333","2","Bouknight","Rutha","999.99","0","0","20","1","1","1","PC","1","0","0","391.15","999","1","7333 Bouknight","1","0000-00-00 00:00:00","25131" +"2971","2","Poplar","Kenneth","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","2971 Poplar","1","0000-00-00 00:00:00","17697" +"9304","1","Stockard","Theron","999.99","0","0","20","1","1","1","PC","1","0","0","3809.65","999","0","9304 Stockard","1","0000-00-00 00:00:00","4682" +"9041","2","Dietrick","Pricilla","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9041 Dietrick","1","0000-00-00 00:00:00","29432" +"5585","1","Pelchat","Apolonia","999.99","0","0","20","1","1","1","PC","1","0","0","53.84","999","0","5585 Pelchat","1","0000-00-00 00:00:00","4826" +"1205","2","Schweitzer","Madaline","999.99","0","0","20","1","0","1","PC","1","0","0","2495.69","999","0","1205 Schweitzer","1","0000-00-00 00:00:00","1518" +"5544","2","Dobson","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5544 Dobson","1","0000-00-00 00:00:00","6642" +"7749","1","Hertzler","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","1225.25","999","0","7749 Hertzler","1","0000-00-00 00:00:00","168" +"6917","1","Harrod","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","155.4","999","1","6917 Harrod","1","0000-00-00 00:00:00","2779" +"3942","2","Propes","Craig","999.99","0","0","20","1","0","1","PC","1","0","0","5152.12","999","0","3942 Propes","1","0000-00-00 00:00:00","156" +"5714","1","Valente","Kandice","999.99","0","0","20","1","1","1","PC","1","0","0","1273.01","999","0","5714 Valente","1","0000-00-00 00:00:00","1514" +"7030","2","Layman","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","985.93","999","0","7030 Layman","1","0000-00-00 00:00:00","19185" +"7030","1","Friedt","Brendan","999.99","0","0","20","1","1","1","PC","1","0","0","985.93","999","0","7030 Friedt","1","0000-00-00 00:00:00","1213" +"2147","1","Stecklein","Myrl","999.99","0","0","20","1","1","1","PC","1","0","0","1700.58","999","1","2147 Stecklein","1","0000-00-00 00:00:00","4777" +"3129","1","Cutchin","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","1247.58","999","0","3129 Cutchin","1","0000-00-00 00:00:00","48" +"3310","1","Michel","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","35.52","999","0","3310 Michel","1","0000-00-00 00:00:00","5859" +"868","2","Giffen","Marcelene","999.99","0","0","20","1","1","1","PC","1","0","0","35.85","999","1","868 Giffen","1","0000-00-00 00:00:00","27046" +"644","1","Propes","Samual","999.99","0","0","20","1","1","1","PC","1","0","0","705.25","999","1","644 Propes","1","0000-00-00 00:00:00","1977" +"9947","3","Voges","Lorriane","999.99","0","0","20","1","1","1","PC","1","0","0","983.06","999","0","9947 Voges","1","0000-00-00 00:00:00","25644" +"2881","1","Bowens","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","45.9","999","1","2881 Bowens","1","0000-00-00 00:00:00","4062" +"1821","1","Cimini","Marketta","999.99","0","0","20","1","1","1","PC","1","0","0","209.25","999","0","1821 Cimini","1","0000-00-00 00:00:00","3470" +"5372","1","Villafane","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","686.35","999","0","5372 Villafane","1","0000-00-00 00:00:00","3014" +"6697","1","Czaja","Williemae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6697 Czaja","1","0000-00-00 00:00:00","5891" +"3616","3","Tyra","Josie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3616 Tyra","1","0000-00-00 00:00:00","25275" +"3616","2","Winchell","Linnea","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3616 Winchell","1","0000-00-00 00:00:00","25274" +"5687","1","Szewczyk","Corrinne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5687 Szewczyk","1","0000-00-00 00:00:00","3729" +"1592","1","Garbarino","Delila","999.99","0","0","20","1","1","1","PC","1","0","0","5915.57","999","0","1592 Garbarino","1","0000-00-00 00:00:00","1775" +"3263","1","Valente","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","143.17","999","1","3263 Valente","1","0000-00-00 00:00:00","100" +"6032","2","Faul","Rocco","999.99","0","0","20","1","1","1","PC","1","0","0","3504.02","999","0","6032 Faul","1","0000-00-00 00:00:00","22772" +"8178","2","Creel","Georgia","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","8178 Creel","1","0000-00-00 00:00:00","20762" +"2716","1","Brehmer","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","381.58","999","0","2716 Brehmer","1","0000-00-00 00:00:00","5523" +"1884","2","Headrick","Phylicia","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1884 Headrick","1","0000-00-00 00:00:00","19223" +"1884","3","Osman","Deidra","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1884 Osman","1","0000-00-00 00:00:00","19224" +"8469","1","Strange","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","1285.15","999","0","8469 Strange","1","0000-00-00 00:00:00","5412" +"8235","3","Petrarca","Jarvis","999.99","0","0","20","1","1","1","PC","1","0","0","1585.46","999","0","8235 Petrarca","1","0000-00-00 00:00:00","28175" +"4471","2","Leto","Nell","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4471 Leto","1","0000-00-00 00:00:00","12779" +"4842","1","Jun","Lemuel","999.99","0","0","20","1","1","1","PC","1","0","0","89.98","999","0","4842 Jun","1","0000-00-00 00:00:00","4673" +"5078","2","Cruzado","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","4785.14","999","0","5078 Cruzado","1","0000-00-00 00:00:00","3454" +"4470","2","Grubaugh","Margo","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4470 Grubaugh","1","0000-00-00 00:00:00","8922" +"3653","2","Pendergrass","Queen","999.99","0","0","20","1","1","1","PC","1","0","0","167.49","999","1","3653 Pendergrass","1","0000-00-00 00:00:00","891" +"9678","1","James","Melonie","999.99","0","0","20","1","1","1","PC","1","0","0","681.46","999","0","9678 James","1","0000-00-00 00:00:00","1831" +"7004","1","Pendergrass","Agnus","999.99","0","0","20","1","1","1","PC","1","0","0","5191.89","999","0","7004 Pendergrass","1","0000-00-00 00:00:00","4845" +"7004","4","Calo","Arlene","999.99","0","0","20","1","0","1","PC","1","0","0","5191.89","999","0","7004 Calo","1","0000-00-00 00:00:00","3643" +"8301","1","Able","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","20.3","999","0","8301 Able","1","0000-00-00 00:00:00","5627" +"5594","1","Roten","Kam","999.99","0","0","20","1","1","1","PC","1","0","0","434.26","999","0","5594 Roten","1","0000-00-00 00:00:00","1689" +"1874","1","Choiniere","Noe","999.99","19.06","0","20","1","1","1","PC","1","0","0","2993.6","999","0","1874 Choiniere","1","0000-00-00 00:00:00","5472" +"4334","1","Creel","Annabel","999.99","15.48","0","20","1","1","1","PC","1","0","0","1369.41","999","0","4334 Creel","1","0000-00-00 00:00:00","477" +"4334","2","Carlino","Selma","999.99","15.48","0","20","1","1","1","PC","1","0","0","1369.41","999","0","4334 Carlino","1","0000-00-00 00:00:00","26056" +"4405","1","Muck","Alysia","999.99","0","0","20","1","1","1","PC","1","0","0","898.75","999","0","4405 Muck","1","0000-00-00 00:00:00","3144" +"2514","2","Goggans","Tobias","999.99","0","0","20","1","1","1","PC","1","0","0","355.78","999","1","2514 Goggans","1","0000-00-00 00:00:00","3786" +"985","1","Liu","Marcus","999.99","0","0","20","1","1","1","PC","1","0","0","247.03","999","1","985 Liu","1","0000-00-00 00:00:00","2627" +"3148","1","Steele","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","54.78","999","0","3148 Steele","1","0000-00-00 00:00:00","1406" +"5263","2","Glidewell","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","2950.04","999","0","5263 Glidewell","1","0000-00-00 00:00:00","538" +"9220","2","Harsh","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","1830.28","999","0","9220 Harsh","1","0000-00-00 00:00:00","2586" +"1853","3","Strother","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","4389.96","999","0","1853 Strother","1","0000-00-00 00:00:00","24514" +"3692","2","Spitz","Luanne","999.99","0","0","0","1","1","1","PC","1","0","0","1084.89","999","0","3692 Spitz","1","0000-00-00 00:00:00","10885" +"3692","1","Settles","Tobie","999.99","0","0","0","1","1","1","PC","1","0","0","1084.89","999","0","3692 Settles","1","0000-00-00 00:00:00","5190" +"6436","1","Vroman","Kirstin","999.99","0","0","20","1","1","1","PC","1","0","0","1356.6","999","0","6436 Vroman","1","0000-00-00 00:00:00","5160" +"1324","2","Villafane","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1324 Villafane","1","0000-00-00 00:00:00","26964" +"4209","2","Nowlen","Lucila","999.99","0","0","0","1","1","1","PC","1","0","0","2792.31","999","1","4209 Nowlen","1","0000-00-00 00:00:00","26954" +"5062","3","Tidmore","Jacquelin","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5062 Tidmore","1","0000-00-00 00:00:00","16875" +"3747","1","Hennings","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","965.7","999","0","3747 Hennings","1","0000-00-00 00:00:00","6326" +"7785","1","Faber","Eldora","999.99","0","0","20","1","1","1","PC","1","0","0","18.5","999","1","7785 Faber","1","0000-00-00 00:00:00","722" +"4790","3","Lanier","Cristina","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4790 Lanier","1","0000-00-00 00:00:00","13891" +"4790","2","Madson","Juli","999.99","0","0","20","1","0","1","PC","1","0","0","1804.51","999","0","4790 Madson","1","0000-00-00 00:00:00","2033" +"4748","1","Worthey","Iona","999.99","0","0","20","1","1","1","PC","1","0","0","695.16","999","1","4748 Worthey","1","0000-00-00 00:00:00","753" +"385","4","Bakley","Serafina","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","385 Bakley","1","0000-00-00 00:00:00","7750" +"385","1","Storms","Leanora","999.99","0","0","20","1","1","1","PC","1","0","0","3421.89","999","0","385 Storms","1","0000-00-00 00:00:00","1374" +"1353","1","Pennypacker","Katherina","999.99","0","0","20","1","1","1","PC","1","0","0","789.28","999","0","1353 Pennypacker","1","0000-00-00 00:00:00","4419" +"9082","1","Parisien","Harriette","999.99","4.23","0","20","1","1","1","PC","1","0","0","295.47","999","1","9082 Parisien","1","0000-00-00 00:00:00","1161" +"1981","2","Leight","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","2260.03","999","0","1981 Leight","1","0000-00-00 00:00:00","6426" +"1598","1","Doetsch","Shante","999.99","0","0","20","1","1","1","PC","1","0","0","2827.05","999","0","1598 Doetsch","1","0000-00-00 00:00:00","4070" +"1913","1","Marnell","Felicitas","999.99","0","0","20","1","1","1","PC","1","0","0","382.94","999","1","1913 Marnell","1","0000-00-00 00:00:00","4730" +"5061","2","Starr","Calista","999.99","19.92","0","20","1","1","1","PC","1","0","0","0","999","1","5061 Starr","1","0000-00-00 00:00:00","21819" +"1803","3","Milian","Melvina","999.99","0","0","20","1","1","1","PC","1","0","0","1431.22","999","0","1803 Milian","1","0000-00-00 00:00:00","17439" +"1803","1","Chaves","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","1431.22","999","0","1803 Chaves","1","0000-00-00 00:00:00","1030" +"5494","1","Lapham","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","3601.8","999","0","5494 Lapham","1","0000-00-00 00:00:00","1281" +"1317","2","Mcleroy","Josefine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1317 Mcleroy","1","0000-00-00 00:00:00","3223" +"5478","2","Davisson","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","3874.75","999","0","5478 Davisson","1","0000-00-00 00:00:00","28865" +"5525","1","Silas","Fairy","999.99","0","0","20","1","1","1","PC","1","0","0","22.13","999","1","5525 Silas","1","0000-00-00 00:00:00","1834" +"542","2","Snodgrass","Ray","999.99","0","0","20","1","0","1","PC","1","0","0","1908.41","999","0","542 Snodgrass","1","0000-00-00 00:00:00","4143" +"4206","1","Salvo","Roderick","999.99","0","0","20","1","1","1","PC","1","0","0","400.76","999","1","4206 Salvo","1","0000-00-00 00:00:00","4206" +"3233","2","Hord","Jeanmarie","999.99","0","0","20","1","1","1","PC","1","0","0","2628.19","999","0","3233 Hord","1","0000-00-00 00:00:00","6226" +"4289","2","Srour","Slyvia","999.99","0","0","20","1","1","1","PC","1","0","0","1066.94","999","0","4289 Srour","1","0000-00-00 00:00:00","5885" +"974","2","Hennings","Rhona","999.99","0","0","20","1","1","1","PC","1","0","0","5333","999","0","974 Hennings","1","0000-00-00 00:00:00","6322" +"1019","2","Ecton","Ira","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1019 Ecton","1","0000-00-00 00:00:00","15215" +"7419","1","Schmucker","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","5473.39","999","0","7419 Schmucker","1","0000-00-00 00:00:00","5360" +"5809","1","Mumper","Candelaria","999.99","8.22","12","20","1","1","1","PC","3","1","0","3006.78","999","0","5809 Mumper","1","0000-00-00 00:00:00","243" +"5809","2","Keppler","Odell","999.99","8.22","12","20","1","1","1","PC","3","1","0","3006.78","999","0","5809 Keppler","1","0000-00-00 00:00:00","31317" +"3749","2","Grothe","Nicole","999.99","0","0","20","1","1","1","PC","1","0","0","3423.74","999","0","3749 Grothe","1","0000-00-00 00:00:00","16068" +"2169","1","Wynkoop","Britt","999.99","0","0","20","1","1","1","PC","1","0","0","9072.75","999","0","2169 Wynkoop","1","0000-00-00 00:00:00","6757" +"5102","1","Parada","Frederick","999.99","0","0","20","1","1","1","PC","1","0","0","3671.17","999","0","5102 Parada","1","0000-00-00 00:00:00","3324" +"1252","2","Kari","Octavia","999.99","0","0","0","1","0","1","PC","1","0","0","5757.95","999","0","1252 Kari","1","0000-00-00 00:00:00","4012" +"986","3","Manzo","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","986 Manzo","1","0000-00-00 00:00:00","3418" +"7083","2","Brundige","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","184.9","999","0","7083 Brundige","1","0000-00-00 00:00:00","2471" +"2850","1","Bellantoni","Miquel","999.99","0","0","20","1","1","1","PC","1","0","0","607.19","999","0","2850 Bellantoni","1","0000-00-00 00:00:00","2668" +"2899","2","Trafton","Zoila","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2899 Trafton","1","0000-00-00 00:00:00","16079" +"2899","1","Harrod","Frederick","999.99","0","0","20","1","1","1","PC","1","0","0","3209.59","999","0","2899 Harrod","1","0000-00-00 00:00:00","1529" +"1335","2","Housley","Aide","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1335 Housley","1","0000-00-00 00:00:00","28126" +"2839","1","Dantin","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2839 Dantin","1","0000-00-00 00:00:00","4347" +"2945","3","Labree","Ethan","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2945 Labree","1","0000-00-00 00:00:00","10587" +"2945","2","Aguirre","Lane","999.99","0","0","20","1","0","1","PC","1","0","0","3626.12","999","0","2945 Aguirre","1","0000-00-00 00:00:00","1649" +"4156","1","Mueller","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","66.39","999","1","4156 Mueller","1","0000-00-00 00:00:00","3607" +"8207","2","Lapham","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","2094.95","999","0","8207 Lapham","1","0000-00-00 00:00:00","2207" +"3888","2","Faber","Pricilla","999.99","0","0","20","1","1","1","PC","1","0","0","993.51","999","0","3888 Faber","1","0000-00-00 00:00:00","3073" +"8212","1","Bourbeau","Angelina","999.99","0","0","20","1","1","1","PC","1","0","0","2730.72","999","0","8212 Bourbeau","1","0000-00-00 00:00:00","2638" +"3039","1","Snively","Desire","999.99","0","0","20","1","1","1","PC","1","0","0","1276.15","999","0","3039 Snively","1","0000-00-00 00:00:00","3906" +"4862","1","Bellantoni","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","1132.32","999","0","4862 Bellantoni","1","0000-00-00 00:00:00","3193" +"9230","1","Janecek","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","824.9","999","0","9230 Janecek","1","0000-00-00 00:00:00","2961" +"7309","3","Kriger","Carmelita","0","-1.53","0","20","1","0","0","PC","1","0","0","0","0","0","7309 Kriger","1","0000-00-00 00:00:00","12613" +"2283","1","Mowen","Marry","999.99","10.16","0","20","1","1","1","PC","1","0","0","1023.28","999","0","2283 Mowen","1","0000-00-00 00:00:00","5127" +"5041","2","Trafton","Madie","999.99","0","0","20","1","1","1","PC","1","0","0","7321.86","999","0","5041 Trafton","1","0000-00-00 00:00:00","91" +"1060","2","Nance","Suzie","999.99","5.51","0","20","1","1","1","PC","1","0","0","3376.61","999","0","1060 Nance","1","0000-00-00 00:00:00","2411" +"1237","2","Nance","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","1838.06","999","0","1237 Nance","1","0000-00-00 00:00:00","19165" +"5703","1","Cutchin","Ingeborg","999.99","0","0","0","0","1","1","TERM","0","0","0","2979.04","999","0","5703 Cutchin","1","0000-00-00 00:00:00","4918" +"8552","1","Hinshaw","Grady","999.99","0","0","20","1","1","1","PC","1","0","0","226.43","999","0","8552 Hinshaw","1","0000-00-00 00:00:00","4048" +"5120","2","Spohn","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","2145.66","999","1","5120 Spohn","1","0000-00-00 00:00:00","201" +"1220","1","Nevin","Argentina","999.99","0","0","20","1","1","1","PC","1","0","0","1328.45","999","0","1220 Nevin","1","0000-00-00 00:00:00","1729" +"4981","2","Hults","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4981 Hults","1","0000-00-00 00:00:00","26125" +"2158","1","Schreiner","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","343.27","999","0","2158 Schreiner","1","0000-00-00 00:00:00","6640" +"9757","3","Weishaar","Charla","999.99","0","0","20","1","1","1","PC","1","0","0","2534.27","999","0","9757 Weishaar","1","0000-00-00 00:00:00","26619" +"9757","1","Capshaw","Lonnie","999.99","0","0","20","1","1","1","PC","1","0","0","2534.27","999","0","9757 Capshaw","1","0000-00-00 00:00:00","3579" +"908","2","Lach","Carol","999.99","0","0","20","1","1","1","PC","1","0","0","127.09","999","1","908 Lach","1","0000-00-00 00:00:00","2453" +"3646","2","Garbarino","Peggy","999.99","0","0","20","1","1","1","PC","1","0","0","1956.97","999","0","3646 Garbarino","1","0000-00-00 00:00:00","4587" +"8172","1","Zander","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","1878.99","999","0","8172 Zander","1","0000-00-00 00:00:00","3455" +"3947","2","Lach","Marc","999.99","0","0","20","1","1","1","PC","1","0","0","1828.63","999","0","3947 Lach","1","0000-00-00 00:00:00","22656" +"8508","1","Hakala","Taryn","999.99","0","0","20","1","1","1","PC","1","0","0","794.5","999","0","8508 Hakala","1","0000-00-00 00:00:00","5253" +"7404","1","Lamson","Susana","999.99","0","0","20","1","1","1","PC","1","0","0","1287.46","999","0","7404 Lamson","1","0000-00-00 00:00:00","6120" +"1257","1","Knudsen","Caryl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1257 Knudsen","1","0000-00-00 00:00:00","5440" +"2447","2","Stecklein","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","3213.55","999","0","2447 Stecklein","1","0000-00-00 00:00:00","24413" +"5243","1","Snively","Mikel","999.99","0","0","20","1","1","1","PC","1","0","0","792.34","999","0","5243 Snively","1","0000-00-00 00:00:00","2617" +"5243","2","Spitz","Teressa","999.99","0","0","20","1","1","1","PC","1","0","0","792.34","999","0","5243 Spitz","1","0000-00-00 00:00:00","31476" +"3683","3","Vaughns","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","5499.94","999","0","3683 Vaughns","1","0000-00-00 00:00:00","22860" +"3683","1","Tardiff","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","5499.94","999","0","3683 Tardiff","1","0000-00-00 00:00:00","4467" +"948","1","Grubaugh","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","1584.6","999","0","948 Grubaugh","1","0000-00-00 00:00:00","3451" +"5905","1","Worthey","Thanh","999.99","0","0","20","1","1","1","PC","1","0","0","542.57","999","0","5905 Worthey","1","0000-00-00 00:00:00","5079" +"1725","4","Defreitas","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","1474.99","999","0","1725 Defreitas","1","0000-00-00 00:00:00","28117" +"1725","1","Toribio","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","1474.99","999","0","1725 Toribio","1","0000-00-00 00:00:00","3649" +"1026","1","Barhorst","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","1270.13","999","0","1026 Barhorst","1","0000-00-00 00:00:00","1642" +"3486","1","Litman","Theron","999.99","0","0","20","1","1","1","PC","1","0","0","905.1","999","1","3486 Litman","1","0000-00-00 00:00:00","5365" +"4706","1","Steele","Darius","999.99","0","0","20","1","1","1","PC","1","0","0","7249.9","999","0","4706 Steele","1","0000-00-00 00:00:00","2134" +"1807","1","Vandenbosch","Clementine","999.99","0","0","0","0","1","1","TERM","0","0","0","83.86","999","0","1807 Vandenbosch","1","0000-00-00 00:00:00","1369" +"8654","2","Leib","Chet","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8654 Leib","1","0000-00-00 00:00:00","29575" +"814","1","Dantin","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","2524.91","999","0","814 Dantin","1","0000-00-00 00:00:00","5095" +"6748","2","Riche","Ray","999.99","4.13","0","20","1","0","1","PC","1","0","0","113.16","999","0","6748 Riche","1","0000-00-00 00:00:00","15712" +"6748","1","Giraldo","Jestine","999.99","4.13","0","20","1","1","1","PC","1","0","0","113.16","999","0","6748 Giraldo","1","0000-00-00 00:00:00","1100" +"1721","1","Ensey","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","1716.07","999","1","1721 Ensey","1","0000-00-00 00:00:00","936" +"3507","1","Mollett","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","1902.51","999","0","3507 Mollett","1","0000-00-00 00:00:00","2172" +"4922","1","Rozzell","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4922 Rozzell","1","0000-00-00 00:00:00","6252" +"2328","2","Neuner","Darius","999.99","0","0","20","1","0","1","PC","1","0","0","368.81","999","1","2328 Neuner","1","0000-00-00 00:00:00","3267" +"4363","3","Perro","Corrinne","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4363 Perro","1","0000-00-00 00:00:00","11601" +"4363","1","Darwin","Diana","999.99","0","0","20","1","1","1","PC","1","0","0","4346.02","999","0","4363 Darwin","1","0000-00-00 00:00:00","3038" +"8499","1","Mcpeek","Latoya","999.99","20","0","20","1","1","1","PC","1","0","0","888.76","999","0","8499 Mcpeek","1","0000-00-00 00:00:00","603" +"5389","2","Giguere","Josefine","999.99","0","0","20","1","1","1","PC","1","0","0","686.04","999","0","5389 Giguere","1","0000-00-00 00:00:00","4832" +"8697","2","Titsworth","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","853.16","999","1","8697 Titsworth","1","0000-00-00 00:00:00","5589" +"5347","1","Defreitas","Barb","999.99","0","0","20","1","1","1","PC","1","0","0","177.03","999","1","5347 Defreitas","1","0000-00-00 00:00:00","2931" +"6160","1","Perron","Shella","999.99","0","0","20","1","1","1","PC","1","0","0","1803.03","999","0","6160 Perron","1","0000-00-00 00:00:00","2593" +"6160","3","Glidewell","Leanora","999.99","0","0","20","1","1","1","PC","1","0","0","1803.03","999","0","6160 Glidewell","1","0000-00-00 00:00:00","18525" +"2993","2","Spier","Tobias","999.99","0","0","20","1","1","1","PC","1","0","0","202.28","999","0","2993 Spier","1","0000-00-00 00:00:00","881" +"5009","1","Peveto","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","3953.34","999","0","5009 Peveto","1","0000-00-00 00:00:00","2136" +"1294","1","Finke","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","719.46","999","1","1294 Finke","1","0000-00-00 00:00:00","5842" +"476","1","Stecklein","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","4797.82","999","0","476 Stecklein","1","0000-00-00 00:00:00","2384" +"5868","1","Schier","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","1189.87","999","0","5868 Schier","1","0000-00-00 00:00:00","1905" +"4867","1","Sedillo","Hortensia","999.99","0","0","20","1","1","1","PC","1","0","0","473","999","1","4867 Sedillo","1","0000-00-00 00:00:00","575" +"4278","3","Ming","Ines","999.99","0","0","20","1","1","1","PC","1","0","0","3752.29","999","0","4278 Ming","1","0000-00-00 00:00:00","7911" +"4278","1","Nitti","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","3752.29","999","0","4278 Nitti","1","0000-00-00 00:00:00","2913" +"2878","1","Trousdale","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","542.9","999","1","2878 Trousdale","1","0000-00-00 00:00:00","5366" +"5353","1","Arata","Felicitas","999.99","0","0","20","1","1","1","PC","1","0","0","185.64","999","1","5353 Arata","1","0000-00-00 00:00:00","2305" +"3775","2","Brawley","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","300.51","999","0","3775 Brawley","1","0000-00-00 00:00:00","1184" +"3297","1","Derosa","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","1322.02","999","0","3297 Derosa","1","0000-00-00 00:00:00","4377" +"2082","1","Mitcham","Jefferson","999.99","0","0","20","1","1","1","PC","1","0","0","141.08","999","1","2082 Mitcham","1","0000-00-00 00:00:00","2839" +"3553","1","Allbright","Barbar","999.99","0","0","20","1","1","1","PC","1","0","0","150.11","999","1","3553 Allbright","1","0000-00-00 00:00:00","6160" +"2409","2","Larsen","Darrin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2409 Larsen","1","0000-00-00 00:00:00","6388" +"3419","1","Gutman","Latoya","999.99","0","0","20","1","1","1","PC","1","0","0","1540.87","999","0","3419 Gutman","1","0000-00-00 00:00:00","3027" +"1435","2","Derosa","Ida","999.99","0","0","20","1","1","1","PC","1","0","0","112.95","999","1","1435 Derosa","1","0000-00-00 00:00:00","2578" +"5402","1","Narcisse","Brendan","999.99","0","0","0","0","1","1","TERM","0","0","0","977.07","999","0","5402 Narcisse","1","0000-00-00 00:00:00","4983" +"3678","3","Hamaker","Bobbi","999.99","20","0","20","1","1","1","PC","1","0","0","451.99","999","1","3678 Hamaker","1","0000-00-00 00:00:00","31726" +"3678","1","Baumgart","Elane","999.99","20","0","20","1","1","1","PC","1","0","0","451.99","999","1","3678 Baumgart","1","0000-00-00 00:00:00","3588" +"5460","1","Ater","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","1380.8","999","0","5460 Ater","1","0000-00-00 00:00:00","310" +"8228","1","Ayotte","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","5144.51","999","0","8228 Ayotte","1","0000-00-00 00:00:00","1371" +"5178","1","Colonna","Renato","999.99","0","0","20","1","1","1","PC","1","0","0","71.29","999","1","5178 Colonna","1","0000-00-00 00:00:00","6246" +"2618","2","Darner","Mandy","999.99","0","0","20","1","1","1","PC","1","0","0","655.01","999","1","2618 Darner","1","0000-00-00 00:00:00","27857" +"7440","1","Koziel","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","677.69","999","0","7440 Koziel","1","0000-00-00 00:00:00","5894" +"2380","2","Dupuis","Robbyn","999.99","0","0","20","1","1","1","PC","1","0","0","1812.79","999","0","2380 Dupuis","1","0000-00-00 00:00:00","18" +"7685","1","Toribio","Bambi","999.99","0","0","20","1","1","1","PC","1","0","0","229.97","999","0","7685 Toribio","1","0000-00-00 00:00:00","28" +"7685","3","Tunney","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","229.97","999","0","7685 Tunney","1","0000-00-00 00:00:00","24205" +"3957","2","Harrod","Chet","999.99","0","0","20","1","1","1","PC","1","0","0","1036.08","999","1","3957 Harrod","1","0000-00-00 00:00:00","84" +"7123","2","Giraldo","Jule","999.99","0","0","20","1","1","1","PC","1","0","0","1760.81","999","1","7123 Giraldo","1","0000-00-00 00:00:00","18189" +"7123","3","Brabant","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","1760.81","999","1","7123 Brabant","1","0000-00-00 00:00:00","18190" +"7435","1","Friesen","Steve","999.99","0","0","20","1","1","1","PC","1","0","0","977.15","999","1","7435 Friesen","1","0000-00-00 00:00:00","2241" +"677","2","Mickey","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","1679.84","999","1","677 Mickey","1","0000-00-00 00:00:00","5007" +"9844","1","Funches","Art","999.99","0","0","20","1","1","1","PC","1","0","0","4685.11","999","0","9844 Funches","1","0000-00-00 00:00:00","3444" +"2112","2","Ater","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","3356.14","999","0","2112 Ater","1","0000-00-00 00:00:00","6421" +"5247","1","Singletary","Ulrike","999.99","0","0","20","1","1","1","PC","1","0","0","477.31","999","0","5247 Singletary","1","0000-00-00 00:00:00","1065" +"1221","2","Lone","Collene","999.99","0","0","20","1","1","1","PC","1","0","0","116.75","999","1","1221 Lone","1","0000-00-00 00:00:00","2283" +"5659","2","Pickell","Haley","999.99","0","0","20","1","0","1","PC","1","0","0","1342.71","999","0","5659 Pickell","1","0000-00-00 00:00:00","5912" +"4899","2","Settles","Karlyn","999.99","0","0","20","1","1","1","PC","1","0","0","4666.44","999","0","4899 Settles","1","0000-00-00 00:00:00","17533" +"2558","2","Osman","Lawrence","999.99","0","0","20","1","1","1","PC","1","0","0","1324.64","999","0","2558 Osman","1","0000-00-00 00:00:00","27437" +"4646","2","Spohn","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","8.41","999","1","4646 Spohn","1","0000-00-00 00:00:00","6440" +"355","4","Hord","Harrison","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","355 Hord","1","0000-00-00 00:00:00","9631" +"355","2","Mollett","Samual","999.99","0","0","20","1","1","1","PC","1","0","0","403.72","999","0","355 Mollett","1","0000-00-00 00:00:00","3179" +"2081","1","Darwin","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","110.16","999","0","2081 Darwin","1","0000-00-00 00:00:00","1303" +"9856","2","Holleman","Harrison","999.99","0","0","20","1","0","1","PC","1","0","0","952.12","999","0","9856 Holleman","1","0000-00-00 00:00:00","1848" +"9284","2","Sweigart","Josefina","999.99","0","0","20","1","1","1","PC","1","0","0","1285.34","999","0","9284 Sweigart","1","0000-00-00 00:00:00","31292" +"2238","1","Mcpeek","Anette","999.99","0","0","20","1","1","1","PC","1","0","0","432.67","999","1","2238 Mcpeek","1","0000-00-00 00:00:00","2661" +"739","1","Alexandra","Lane","999.99","0","0","20","1","1","1","PC","1","0","0","2590.94","999","0","739 Alexandra","1","0000-00-00 00:00:00","5925" +"5252","2","Giffen","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","419.31","999","1","5252 Giffen","1","0000-00-00 00:00:00","4504" +"2234","1","Bakley","Joette","999.99","61.66","12","100","1","1","1","PC","3","1","0","3933.75","999","0","2234 Bakley","1","0000-00-00 00:00:00","1852" +"2688","1","Ecton","Rochell","999.99","0","0","20","1","1","1","PC","1","0","0","5924.8","999","0","2688 Ecton","1","0000-00-00 00:00:00","4522" +"7649","1","Timlin","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","740.92","999","0","7649 Timlin","1","0000-00-00 00:00:00","5" +"4502","1","Leto","Dorris","999.99","0","0","20","1","1","1","PC","1","0","0","5089.26","999","0","4502 Leto","1","0000-00-00 00:00:00","192" +"2533","1","Michel","Korey","999.99","0","0","20","1","1","1","PC","1","0","0","1489.04","999","1","2533 Michel","1","0000-00-00 00:00:00","5058" +"6613","2","Chain","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","9105.69","999","0","6613 Chain","1","0000-00-00 00:00:00","5670" +"7705","1","Ammann","Page","999.99","0","0","20","1","1","1","PC","1","0","0","4071.61","999","0","7705 Ammann","1","0000-00-00 00:00:00","4518" +"3711","2","Cutchin","Chrystal","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3711 Cutchin","1","0000-00-00 00:00:00","22655" +"3440","1","Defreitas","Season","999.99","0","0","20","1","1","1","PC","1","0","0","191.28","999","0","3440 Defreitas","1","0000-00-00 00:00:00","5163" +"6269","3","Nowlen","Charla","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6269 Nowlen","1","0000-00-00 00:00:00","7534" +"6269","2","Youssef","Lane","999.99","0","0","20","1","0","1","PC","1","0","0","196.69","999","1","6269 Youssef","1","0000-00-00 00:00:00","6019" +"7250","1","Parrales","Korey","999.99","0","0","20","1","1","1","PC","1","0","0","124.09","999","1","7250 Parrales","1","0000-00-00 00:00:00","1309" +"4007","2","Goodell","Phylicia","999.99","0","0","20","1","1","1","PC","1","0","0","1465.95","999","0","4007 Goodell","1","0000-00-00 00:00:00","2058" +"6169","3","Quintero","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","731.62","999","0","6169 Quintero","1","0000-00-00 00:00:00","24189" +"6169","1","Valdez","Jed","999.99","0","0","20","1","1","1","PC","1","0","0","731.62","999","0","6169 Valdez","1","0000-00-00 00:00:00","3280" +"4361","1","Deppen","Annabel","999.99","0","0","20","1","1","1","PC","1","0","0","1924.47","999","1","4361 Deppen","1","0000-00-00 00:00:00","4349" +"2269","1","Raver","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","1833.32","999","0","2269 Raver","1","0000-00-00 00:00:00","1364" +"1555","1","Probst","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","4780.56","999","0","1555 Probst","1","0000-00-00 00:00:00","3177" +"8524","2","Thach","Glinda","999.99","0","0","20","1","0","1","PC","1","0","0","93.42","999","1","8524 Thach","1","0000-00-00 00:00:00","952" +"8511","2","Glidewell","Karlyn","999.99","0","0","20","1","0","1","PC","1","0","0","2057.59","999","0","8511 Glidewell","1","0000-00-00 00:00:00","2262" +"5227","1","Novoa","Marry","999.99","0","0","20","1","1","1","PC","1","0","0","29.29","999","1","5227 Novoa","1","0000-00-00 00:00:00","3247" +"3764","1","Salvo","Gwyneth","999.99","0","0","20","1","1","1","PC","1","0","0","188.95","999","0","3764 Salvo","1","0000-00-00 00:00:00","6358" +"9052","2","Mickey","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","962.03","999","0","9052 Mickey","1","0000-00-00 00:00:00","4538" +"2535","2","Aguinaga","Gwenda","999.99","0","0","20","1","1","1","PC","1","0","0","175.5","999","1","2535 Aguinaga","1","0000-00-00 00:00:00","5458" +"3555","1","Fortin","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","688.5","999","1","3555 Fortin","1","0000-00-00 00:00:00","714" +"8985","1","Nally","Lakeesha","999.99","0","0","20","1","1","1","PC","1","0","0","283.31","999","0","8985 Nally","1","0000-00-00 00:00:00","3308" +"170","1","Bayes","Gene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","170 Bayes","1","0000-00-00 00:00:00","5999" +"3881","1","Callejas","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","1698.59","999","0","3881 Callejas","1","0000-00-00 00:00:00","6018" +"208","1","Piccard","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","980.27","999","0","208 Piccard","1","0000-00-00 00:00:00","3406" +"7536","2","Chain","Zachery","0","12.5","0","20","1","0","0","PC","1","0","0","0","0","0","7536 Chain","1","0000-00-00 00:00:00","13309" +"6581","1","Barhorst","Rutha","999.99","0","0","20","1","1","1","PC","1","0","0","858.19","999","0","6581 Barhorst","1","0000-00-00 00:00:00","6472" +"4157","2","Feliciano","Bridget","999.99","0","0","20","1","1","1","PC","1","0","0","3063.02","999","0","4157 Feliciano","1","0000-00-00 00:00:00","23047" +"8518","2","Lapham","Robbi","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8518 Lapham","1","0000-00-00 00:00:00","26751" +"5122","3","Getz","Ray","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5122 Getz","1","0000-00-00 00:00:00","9206" +"5122","2","Wessner","Marc","999.99","0","0","20","1","0","1","PC","1","0","0","100.53","999","1","5122 Wessner","1","0000-00-00 00:00:00","6279" +"1002","1","Mumper","Noreen","999.99","0","0","20","1","1","1","PC","1","0","0","530.04","999","0","1002 Mumper","1","0000-00-00 00:00:00","5660" +"2738","3","Beltrami","Jack","999.99","0","0","20","1","1","1","PC","1","0","0","575.27","999","1","2738 Beltrami","1","0000-00-00 00:00:00","31402" +"8774","1","Heintzelman","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","232.61","999","0","8774 Heintzelman","1","0000-00-00 00:00:00","5723" +"5202","2","Dantin","Kenny","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5202 Dantin","1","0000-00-00 00:00:00","28113" +"1847","2","Chaves","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","388.08","999","0","1847 Chaves","1","0000-00-00 00:00:00","24619" +"1052","2","Layman","Peggy","999.99","0","0","20","1","1","1","PC","1","0","0","154.8","999","0","1052 Layman","1","0000-00-00 00:00:00","24838" +"6732","1","Labree","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","2657.93","999","0","6732 Labree","1","0000-00-00 00:00:00","5572" +"7503","1","Landwehr","Marketta","999.99","0","0","20","1","1","1","PC","1","0","0","1004.25","999","1","7503 Landwehr","1","0000-00-00 00:00:00","1523" +"3209","1","Janco","Augusta","999.99","0","0","20","1","1","1","PC","1","0","0","523.67","999","0","3209 Janco","1","0000-00-00 00:00:00","4363" +"3257","1","Hakala","Eve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3257 Hakala","1","0000-00-00 00:00:00","3178" +"5014","3","Gains","Macy","0","-3.45","0","20","1","0","0","PC","1","0","0","0","999","0","5014 Gains","1","0000-00-00 00:00:00","22487" +"7089","1","Drinkwater","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","1323.8","999","1","7089 Drinkwater","1","0000-00-00 00:00:00","3095" +"3464","3","Oquendo","Carola","999.99","0","0","20","1","1","1","PC","1","0","0","2926.92","999","0","3464 Oquendo","1","0000-00-00 00:00:00","5634" +"4345","2","Hickman","Shawnna","999.99","0","0","20","1","1","1","PC","1","0","0","244.07","999","0","4345 Hickman","1","0000-00-00 00:00:00","23663" +"1001","1","Nance","Teressa","999.99","0","0","20","1","1","1","PC","1","0","0","5289.37","999","0","1001 Nance","1","0000-00-00 00:00:00","3022" +"927","3","Aviles","Aide","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","927 Aviles","1","0000-00-00 00:00:00","8387" +"927","2","Pendergrass","Danae","999.99","0","0","20","1","0","1","PC","1","0","0","2239","999","0","927 Pendergrass","1","0000-00-00 00:00:00","2940" +"3854","2","Chaves","Ezekiel","999.99","0","0","20","1","1","1","PC","1","0","0","2114.22","999","0","3854 Chaves","1","0000-00-00 00:00:00","2914" +"5653","2","Zaccaria","Joelle","999.99","0","0","20","1","1","1","PC","1","0","0","78.69","999","0","5653 Zaccaria","1","0000-00-00 00:00:00","30137" +"3455","2","Milian","Love","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","3455 Milian","1","0000-00-00 00:00:00","25318" +"857","2","Kari","Anamaria","999.99","0","0","20","1","1","1","PC","1","0","0","539.34","999","1","857 Kari","1","0000-00-00 00:00:00","5203" +"743","2","Probst","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","621.78","999","0","743 Probst","1","0000-00-00 00:00:00","21826" +"3697","2","Jepsen","Luther","999.99","0","0","20","1","0","1","PC","1","0","0","323.42","999","0","3697 Jepsen","1","0000-00-00 00:00:00","15544" +"1795","2","Nitti","Page","999.99","20","0","20","1","1","1","PC","1","0","0","791.17","999","0","1795 Nitti","1","0000-00-00 00:00:00","15833" +"1795","1","Kirst","Leanora","999.99","20","0","20","1","1","1","PC","1","0","0","791.17","999","0","1795 Kirst","1","0000-00-00 00:00:00","3987" +"430","1","Ducan","Pei","999.99","0","0","20","1","1","1","PC","1","0","0","4716.44","999","0","430 Ducan","1","0000-00-00 00:00:00","6414" +"9696","1","Minnix","Josie","999.99","0","0","20","1","1","1","PC","1","0","0","33.17","999","1","9696 Minnix","1","0000-00-00 00:00:00","1412" +"3810","2","Owsley","Kandice","999.99","0","0","20","1","1","1","PC","1","0","0","1138.38","999","1","3810 Owsley","1","0000-00-00 00:00:00","5112" +"5788","1","Pillai","Season","999.99","0","0","20","1","1","1","PC","1","0","0","2604.88","999","0","5788 Pillai","1","0000-00-00 00:00:00","3315" +"7018","2","Weathersby","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","445.14","999","1","7018 Weathersby","1","0000-00-00 00:00:00","31354" +"9044","3","Voltz","Amelia","999.99","0","0","20","1","1","1","PC","1","0","0","131.73","999","1","9044 Voltz","1","0000-00-00 00:00:00","24358" +"3000","1","Bickle","Maren","999.99","0","0","20","1","1","1","PC","1","0","0","4240.9","999","0","3000 Bickle","1","0000-00-00 00:00:00","6001" +"4109","2","Eutsler","Andria","999.99","0","0","20","1","1","1","PC","1","0","0","1676.59","999","0","4109 Eutsler","1","0000-00-00 00:00:00","19995" +"2509","2","Prichett","Bong","999.99","0","0","20","1","0","1","PC","1","0","0","4670.15","999","0","2509 Prichett","1","0000-00-00 00:00:00","254" +"1350","2","Pelaez","Archie","999.99","0","0","20","1","0","1","PC","1","0","0","1071.83","999","0","1350 Pelaez","1","0000-00-00 00:00:00","4422" +"1350","3","Rozzell","Teressa","999.99","0","0","20","1","0","1","PC","1","0","0","1071.83","999","0","1350 Rozzell","1","0000-00-00 00:00:00","1092" +"3509","2","Lapham","Betsey","999.99","0","0","20","1","1","1","PC","1","0","0","1478.83","999","1","3509 Lapham","1","0000-00-00 00:00:00","3656" +"8271","1","Manganaro","Enid","999.99","0","0","20","1","1","1","PC","1","0","0","2607.47","999","0","8271 Manganaro","1","0000-00-00 00:00:00","4401" +"2747","2","Mcleod","Tamica","999.99","0","0","20","1","0","1","PC","1","0","0","5593.46","999","0","2747 Mcleod","1","0000-00-00 00:00:00","5733" +"7363","1","Harrod","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","2853.54","999","0","7363 Harrod","1","0000-00-00 00:00:00","6011" +"1951","1","Heller","Lashon","999.99","0","0","20","1","1","1","PC","1","0","0","5445.21","999","0","1951 Heller","1","0000-00-00 00:00:00","4818" +"2664","1","Czaja","Josie","999.99","0","0","20","1","1","1","PC","1","0","0","3549.64","999","0","2664 Czaja","1","0000-00-00 00:00:00","5564" +"6340","1","Allbright","Chanell","999.99","0","0","20","1","1","1","PC","1","0","0","226.51","999","0","6340 Allbright","1","0000-00-00 00:00:00","5228" +"2852","1","Sweat","Corrinne","999.99","0","0","20","1","1","1","PC","1","0","0","1226.28","999","1","2852 Sweat","1","0000-00-00 00:00:00","6378" +"829","1","Worthey","Debera","999.99","0","0","20","1","1","1","PC","1","0","0","2567.94","999","0","829 Worthey","1","0000-00-00 00:00:00","5502" +"2623","2","Lujan","Stefanie","999.99","0","0","20","1","0","1","PC","1","0","0","1057.93","999","1","2623 Lujan","1","0000-00-00 00:00:00","647" +"4910","1","Capshaw","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","3348.21","999","0","4910 Capshaw","1","0000-00-00 00:00:00","1318" +"1921","1","Monsivais","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","1830.34","999","1","1921 Monsivais","1","0000-00-00 00:00:00","1904" +"8719","2","World","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","473.13","999","0","8719 World","1","0000-00-00 00:00:00","24841" +"7708","3","Ayotte","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","3488.18","999","0","7708 Ayotte","1","0000-00-00 00:00:00","24827" +"5739","2","Mickey","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","160.36","999","0","5739 Mickey","1","0000-00-00 00:00:00","19991" +"6754","2","Aviles","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","2733.95","999","0","6754 Aviles","1","0000-00-00 00:00:00","2336" +"1983","1","Mcleroy","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","411.54","999","0","1983 Mcleroy","1","0000-00-00 00:00:00","5790" +"9262","2","Mcmorris","Moira","999.99","9.7","0","20","1","0","1","PC","1","0","0","3922.62","999","0","9262 Mcmorris","1","0000-00-00 00:00:00","3868" +"1198","2","Timlin","Teodoro","999.99","0","0","20","1","0","1","PC","1","0","0","1745.71","999","0","1198 Timlin","1","0000-00-00 00:00:00","3312" +"2773","1","Sweigart","Gaylord","999.99","3.41","0","20","1","1","1","PC","1","0","0","6258.71","999","0","2773 Sweigart","1","0000-00-00 00:00:00","5460" +"2773","4","Kriger","Davis","999.99","3.41","0","20","1","1","1","PC","1","0","0","6258.71","999","0","2773 Kriger","1","0000-00-00 00:00:00","6305" +"7600","3","Dealba","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","452.44","999","0","7600 Dealba","1","0000-00-00 00:00:00","14377" +"7600","1","Pae","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","452.44","999","0","7600 Pae","1","0000-00-00 00:00:00","1205" +"3945","2","Youssef","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","505.35","999","0","3945 Youssef","1","0000-00-00 00:00:00","2019" +"6609","2","Poplar","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","778.65","999","0","6609 Poplar","1","0000-00-00 00:00:00","27047" +"6477","1","Choiniere","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","1379.93","999","0","6477 Choiniere","1","0000-00-00 00:00:00","2296" +"1929","1","Testerman","Tim","999.99","0","0","20","1","1","1","PC","1","0","0","4126.34","999","0","1929 Testerman","1","0000-00-00 00:00:00","740" +"8471","2","Keppler","Williemae","999.99","0","0","20","1","1","1","PC","1","0","0","501.54","999","0","8471 Keppler","1","0000-00-00 00:00:00","24064" +"9098","2","Zander","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","4927.54","999","0","9098 Zander","1","0000-00-00 00:00:00","3200" +"5462","1","Leto","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","6.43","999","1","5462 Leto","1","0000-00-00 00:00:00","3742" +"373","1","Castilleja","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","439.54","999","0","373 Castilleja","1","0000-00-00 00:00:00","3559" +"2262","1","Simons","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","1059.46","999","0","2262 Simons","1","0000-00-00 00:00:00","5125" +"9092","2","Lueck","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9092 Lueck","1","0000-00-00 00:00:00","9220" +"1244","2","Vanwagenen","Dortha","999.99","0","0","20","1","1","1","PC","1","0","0","5269.99","999","0","1244 Vanwagenen","1","0000-00-00 00:00:00","31321" +"1244","4","Deshaies","Dorris","999.99","0","0","20","1","1","1","PC","1","0","0","5269.99","999","0","1244 Deshaies","1","0000-00-00 00:00:00","31322" +"3227","1","Quintero","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","618.5","999","1","3227 Quintero","1","0000-00-00 00:00:00","5497" +"5367","1","Dorsett","Teressa","999.99","0","0","0","0","1","1","TERM","0","0","0","454.01","999","0","5367 Dorsett","1","0000-00-00 00:00:00","4867" +"6433","1","Sitzman","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","1005.61","999","1","6433 Sitzman","1","0000-00-00 00:00:00","4041" +"3226","1","Clatterbuck","Huey","999.99","0","0","0","1","1","1","PC","1","0","0","190.49","999","1","3226 Clatterbuck","1","0000-00-00 00:00:00","4670" +"4550","1","Bourbeau","Keneth","999.99","0","0","20","1","1","1","PC","1","0","0","3177.55","999","0","4550 Bourbeau","1","0000-00-00 00:00:00","6641" +"9252","1","Alexandra","Jarvis","999.99","59.63","12","125","1","1","1","PC","3","1","0","3366.76","999","1","9252 Alexandra","1","0000-00-00 00:00:00","6334" +"8972","3","Simkins","Sabina","999.99","0","0","20","1","1","1","PC","1","0","0","4459.61","999","0","8972 Simkins","1","0000-00-00 00:00:00","31650" +"8972","2","Maestas","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","4459.61","999","0","8972 Maestas","1","0000-00-00 00:00:00","31649" +"614","2","Kriger","Lashon","999.99","0","0","20","1","0","1","PC","1","0","0","2249.59","999","0","614 Kriger","1","0000-00-00 00:00:00","4606" +"958","1","Janecek","Lilia","999.99","0","0","20","1","1","1","PC","1","0","0","6440.66","999","0","958 Janecek","1","0000-00-00 00:00:00","6634" +"9478","4","Donald","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","3480.4","999","0","9478 Donald","1","0000-00-00 00:00:00","28519" +"9478","3","Heller","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","3480.4","999","0","9478 Heller","1","0000-00-00 00:00:00","28518" +"5428","1","Parisien","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","4013.51","999","0","5428 Parisien","1","0000-00-00 00:00:00","854" +"5428","2","Pennell","Rhona","999.99","0","0","20","1","1","1","PC","1","0","0","4013.51","999","0","5428 Pennell","1","0000-00-00 00:00:00","30870" +"8992","1","Meekins","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","8761.06","999","1","8992 Meekins","1","0000-00-00 00:00:00","2322" +"1436","1","Chaves","Hai","999.99","0","0","20","1","1","1","PC","1","0","0","209.13","999","1","1436 Chaves","1","0000-00-00 00:00:00","1732" +"9575","1","Simms","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","129.92","999","1","9575 Simms","1","0000-00-00 00:00:00","3409" +"4696","2","Villafane","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","1498.43","999","0","4696 Villafane","1","0000-00-00 00:00:00","2823" +"1130","2","Cajigas","Jacqui","999.99","0","0","20","1","1","1","PC","1","0","0","51.48","999","1","1130 Cajigas","1","0000-00-00 00:00:00","4932" +"2608","2","Pattison","Inez","999.99","0","0","20","1","1","1","PC","1","0","0","316.54","999","0","2608 Pattison","1","0000-00-00 00:00:00","4627" +"3737","1","Testerman","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","180.34","999","0","3737 Testerman","1","0000-00-00 00:00:00","2474" +"5834","1","Sledge","Huey","999.99","0","0","20","1","1","1","PC","1","0","0","1298.09","999","0","5834 Sledge","1","0000-00-00 00:00:00","1844" +"5895","2","Finke","Shonda","999.99","0","0","20","1","1","1","PC","1","0","0","1391.85","999","0","5895 Finke","1","0000-00-00 00:00:00","5549" +"6954","1","Dietrick","Loan","999.99","0","0","50","1","1","1","PC","1","0","0","28.18","999","1","6954 Dietrick","1","0000-00-00 00:00:00","2587" +"5148","1","Metro","Eve","999.99","0","0","20","1","1","1","PC","1","0","0","629.98","999","0","5148 Metro","1","0000-00-00 00:00:00","3190" +"398","5","Durand","Liana","999.99","0","0","20","1","1","1","PC","1","0","0","368.07","999","0","398 Durand","1","0000-00-00 00:00:00","5576" +"398","2","Grubaugh","Joette","999.99","0","0","20","1","1","1","PC","1","0","0","368.07","999","0","398 Grubaugh","1","0000-00-00 00:00:00","25056" +"4121","2","Bryce","Delena","999.99","0","0","20","1","1","1","PC","1","0","0","2242.08","999","1","4121 Bryce","1","0000-00-00 00:00:00","27441" +"784","2","Ro","Nellie","999.99","0","0","20","1","1","1","PC","1","0","0","2335.12","999","1","784 Ro","1","0000-00-00 00:00:00","1454" +"4735","2","Pickell","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","353.72","999","1","4735 Pickell","1","0000-00-00 00:00:00","3617" +"263","2","Simons","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","2948.72","999","1","263 Simons","1","0000-00-00 00:00:00","27233" +"4573","1","Remsen","Jacquelin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4573 Remsen","1","0000-00-00 00:00:00","6422" +"767","1","Marston","Jefferson","999.99","0","0","20","1","1","1","PC","1","0","0","1302.33","999","0","767 Marston","1","0000-00-00 00:00:00","221" +"1669","1","Kaster","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","2371.18","999","1","1669 Kaster","1","0000-00-00 00:00:00","2176" +"1778","2","Betton","Danelle","999.99","0","0","20","1","0","1","PC","1","0","0","467.81","999","0","1778 Betton","1","0000-00-00 00:00:00","2571" +"7792","1","Gunderman","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","1853.74","999","1","7792 Gunderman","1","0000-00-00 00:00:00","4379" +"9630","2","Milian","Tanesha","999.99","0","0","20","1","1","1","PC","1","0","0","789.83","999","0","9630 Milian","1","0000-00-00 00:00:00","21772" +"2240","1","Allbright","Lilia","999.99","0","0","20","1","1","1","PC","1","0","0","2796.68","999","0","2240 Allbright","1","0000-00-00 00:00:00","1634" +"3758","1","Kari","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","2757.07","999","0","3758 Kari","1","0000-00-00 00:00:00","6353" +"8073","2","Starr","Janel","999.99","0","0","20","1","1","1","PC","1","0","0","1310.9","999","0","8073 Starr","1","0000-00-00 00:00:00","2048" +"423","4","Wilmes","Candelaria","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","423 Wilmes","1","0000-00-00 00:00:00","9782" +"423","1","Stacy","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","707.68","999","0","423 Stacy","1","0000-00-00 00:00:00","5484" +"4544","3","Hellmann","Myrtle","999.99","0","12","20","1","1","1","PC","3","1","0","146.27","999","0","4544 Hellmann","1","0000-00-00 00:00:00","29371" +"4544","1","Spier","Melvina","999.99","0","12","20","1","1","1","PC","3","1","0","146.27","999","0","4544 Spier","1","0000-00-00 00:00:00","5464" +"2217","2","Shryock","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","5108.11","999","0","2217 Shryock","1","0000-00-00 00:00:00","3488" +"3978","2","Tyra","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","793.96","999","0","3978 Tyra","1","0000-00-00 00:00:00","25586" +"4475","1","Holleman","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","1000.14","999","0","4475 Holleman","1","0000-00-00 00:00:00","597" +"4744","1","Mcmullin","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","687.17","999","0","4744 Mcmullin","1","0000-00-00 00:00:00","5661" +"8042","1","Collis","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8042 Collis","1","0000-00-00 00:00:00","5421" +"6481","2","Flesher","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","6005.76","999","0","6481 Flesher","1","0000-00-00 00:00:00","4631" +"8355","1","Creason","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","2842.21","999","0","8355 Creason","1","0000-00-00 00:00:00","3074" +"3883","2","Acklin","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","313.02","999","1","3883 Acklin","1","0000-00-00 00:00:00","5636" +"2591","1","Mumper","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","1390.34","999","0","2591 Mumper","1","0000-00-00 00:00:00","3336" +"2591","3","Barefield","Archie","999.99","0","0","20","1","1","1","PC","1","0","0","1390.34","999","0","2591 Barefield","1","0000-00-00 00:00:00","31703" +"7863","1","Simkins","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","2226.71","999","0","7863 Simkins","1","0000-00-00 00:00:00","2832" +"8353","2","Funderburke","Stefanie","999.99","0","0","0","1","1","1","INACT","0","0","0","3887.03","999","0","8353 Funderburke","1","0000-00-00 00:00:00","19102" +"3452","1","Flinchum","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","231.75","999","1","3452 Flinchum","1","0000-00-00 00:00:00","934" +"5985","1","Pelham","Nellie","999.99","6.27","0","20","1","1","1","PC","1","0","0","3639.5","999","0","5985 Pelham","1","0000-00-00 00:00:00","4542" +"2831","1","Mcmorris","Luanne","999.99","0","0","20","1","1","1","PC","1","0","0","1244.36","999","0","2831 Mcmorris","1","0000-00-00 00:00:00","6085" +"2111","2","Howze","Linnea","999.99","0","0","20","1","0","1","PC","1","0","0","311.72","999","0","2111 Howze","1","0000-00-00 00:00:00","4232" +"3848","2","Oquendo","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","757.91","999","1","3848 Oquendo","1","0000-00-00 00:00:00","1647" +"5526","2","Somma","Gregorio","999.99","0","0","20","1","0","1","PC","1","0","0","1693.31","999","1","5526 Somma","1","0000-00-00 00:00:00","1696" +"6089","2","Anderson","Jayme","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","6089 Anderson","1","0000-00-00 00:00:00","5823" +"2306","3","Acklin","Melvina","999.99","0","0","20","1","1","1","PC","1","0","0","1234.83","999","0","2306 Acklin","1","0000-00-00 00:00:00","21961" +"834","2","Spore","Lise","999.99","0","0","20","1","0","1","PC","1","0","0","4240.97","999","0","834 Spore","1","0000-00-00 00:00:00","3328" +"2211","2","Vandenbosch","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","1305.13","999","0","2211 Vandenbosch","1","0000-00-00 00:00:00","22871" +"4527","1","Brantley","Amelia","999.99","0","0","20","1","1","1","PC","1","0","0","3902.48","999","0","4527 Brantley","1","0000-00-00 00:00:00","4707" +"2995","1","Villafane","Taryn","999.99","0","0","20","1","1","1","PC","1","0","0","472.18","999","1","2995 Villafane","1","0000-00-00 00:00:00","3980" +"4127","3","Getz","Huey","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4127 Getz","1","0000-00-00 00:00:00","12078" +"4127","2","Manzo","Latoya","999.99","0","0","20","1","0","1","PC","1","0","0","1528.51","999","0","4127 Manzo","1","0000-00-00 00:00:00","2680" +"3450","3","Toribio","Leah","999.99","31.77","12","50","1","1","1","PC","3","1","0","662.26","999","0","3450 Toribio","1","0000-00-00 00:00:00","28082" +"3450","1","Hough","Lonnie","999.99","31.77","12","50","1","1","1","PC","3","1","0","662.26","999","0","3450 Hough","1","0000-00-00 00:00:00","2920" +"1256","2","Hafford","Harrison","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1256 Hafford","1","0000-00-00 00:00:00","6662" +"7476","1","Glassman","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","63.53","999","1","7476 Glassman","1","0000-00-00 00:00:00","3785" +"7241","1","Sherron","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","1342.44","999","0","7241 Sherron","1","0000-00-00 00:00:00","4936" +"9107","2","Thach","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","1001","999","0","9107 Thach","1","0000-00-00 00:00:00","2795" +"2867","4","Mollett","Williemae","999.99","0","0","20","1","1","1","PC","1","0","0","2743.67","999","0","2867 Mollett","1","0000-00-00 00:00:00","6356" +"2867","1","Hakala","Sherice","999.99","0","0","20","1","1","1","PC","1","0","0","2743.67","999","0","2867 Hakala","1","0000-00-00 00:00:00","4816" +"2957","2","Peltier","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","974.27","999","0","2957 Peltier","1","0000-00-00 00:00:00","2307" +"2768","2","Vanwagenen","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","3111.05","999","1","2768 Vanwagenen","1","0000-00-00 00:00:00","463" +"5262","2","Davisson","Germaine","999.99","0","0","20","1","0","1","PC","1","0","0","2382.09","999","0","5262 Davisson","1","0000-00-00 00:00:00","7526" +"8396","1","Trousdale","Mei","999.99","0","0","20","1","1","1","PC","1","0","0","336.92","999","0","8396 Trousdale","1","0000-00-00 00:00:00","1433" +"3602","1","Esterly","Ula","999.99","0","0","20","1","1","1","PC","1","0","0","393.21","999","0","3602 Esterly","1","0000-00-00 00:00:00","925" +"970","1","Steven","Joey","999.99","0","0","0","0","1","1","INACT","0","0","0","58.1","999","0","970 Steven","1","0000-00-00 00:00:00","6119" +"7887","2","Cimini","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","361.26","999","0","7887 Cimini","1","0000-00-00 00:00:00","4100" +"5114","2","Abrahams","Macy","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5114 Abrahams","1","0000-00-00 00:00:00","25221" +"2750","3","Poplar","Art","999.99","0","0","20","1","1","1","PC","1","0","0","476.91","999","0","2750 Poplar","1","0000-00-00 00:00:00","24213" +"2750","2","Sedillo","Loreta","999.99","0","0","20","1","1","1","PC","1","0","0","476.91","999","0","2750 Sedillo","1","0000-00-00 00:00:00","24212" +"2682","1","Mcburney","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","4603.57","999","0","2682 Mcburney","1","0000-00-00 00:00:00","3331" +"3143","1","Stockard","Jodie","999.99","0","0","20","1","1","1","PC","1","0","0","3806.94","999","0","3143 Stockard","1","0000-00-00 00:00:00","4080" +"8267","2","Hults","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","1364.43","999","0","8267 Hults","1","0000-00-00 00:00:00","5873" +"2335","1","Toribio","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","1281.11","999","1","2335 Toribio","1","0000-00-00 00:00:00","5262" +"1718","4","Sweat","Shirlee","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1718 Sweat","1","0000-00-00 00:00:00","20751" +"1718","3","Manzo","Karlene","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1718 Manzo","1","0000-00-00 00:00:00","20750" +"2838","2","Medley","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","5062.35","999","0","2838 Medley","1","0000-00-00 00:00:00","5268" +"3454","1","Schempp","Svetlana","999.99","0","0","20","1","1","1","PC","1","0","0","1049.77","999","0","3454 Schempp","1","0000-00-00 00:00:00","3015" +"833","2","Lary","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","4049.17","999","0","833 Lary","1","0000-00-00 00:00:00","2796" +"8022","2","Montalbo","Geraldo","999.99","0","0","20","1","1","1","PC","1","0","0","880.72","999","0","8022 Montalbo","1","0000-00-00 00:00:00","2071" +"4701","2","Weimar","Troy","999.99","0","0","20","1","1","1","PC","1","0","0","1337.5","999","1","4701 Weimar","1","0000-00-00 00:00:00","21581" +"491","1","Defreitas","Selina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","491 Defreitas","1","0000-00-00 00:00:00","2662" +"1073","4","Reamer","Towanda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1073 Reamer","1","0000-00-00 00:00:00","9124" +"1073","2","Manzo","Jared","999.99","0","0","20","1","0","1","PC","1","0","0","2195.36","999","1","1073 Manzo","1","0000-00-00 00:00:00","5741" +"5337","1","Goodell","Virgina","999.99","0","0","20","1","1","1","PC","1","0","0","4193.19","999","0","5337 Goodell","1","0000-00-00 00:00:00","500" +"6932","1","Grubaugh","Nelle","999.99","0","0","20","1","1","1","PC","1","0","0","585.6","999","1","6932 Grubaugh","1","0000-00-00 00:00:00","4393" +"2456","1","Albritton","Kent","999.99","0","12","125","1","1","1","PC","3","1","0","2103.69","999","1","2456 Albritton","1","0000-00-00 00:00:00","4481" +"2456","3","Colonna","Ira","999.99","0","12","125","1","0","1","PC","3","1","0","2103.69","999","1","2456 Colonna","1","0000-00-00 00:00:00","4273" +"4930","2","Sester","Lawrence","999.99","0","0","20","1","1","1","PC","1","0","0","479.95","999","1","4930 Sester","1","0000-00-00 00:00:00","5328" +"7612","2","Perro","Earle","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7612 Perro","1","0000-00-00 00:00:00","28324" +"7612","3","Hamaker","Joaquina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7612 Hamaker","1","0000-00-00 00:00:00","28325" +"1301","2","Osman","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","5807.5","999","0","1301 Osman","1","0000-00-00 00:00:00","1939" +"5880","1","Durand","Chanell","999.99","0","0","20","1","1","1","PC","1","0","0","197.32","999","1","5880 Durand","1","0000-00-00 00:00:00","3023" +"3636","2","Kari","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","1327.63","999","1","3636 Kari","1","0000-00-00 00:00:00","4979" +"7811","2","Mcelvain","Lakesha","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7811 Mcelvain","1","0000-00-00 00:00:00","24475" +"1053","2","Tippit","Elyse","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1053 Tippit","1","0000-00-00 00:00:00","8694" +"8058","2","Osman","Josie","999.99","0","0","20","1","1","1","PC","1","0","0","1591.88","999","0","8058 Osman","1","0000-00-00 00:00:00","6429" +"9074","1","Walborn","Brianne","999.99","0","0","20","1","1","1","PC","1","0","0","719.68","999","0","9074 Walborn","1","0000-00-00 00:00:00","2047" +"1759","3","Holleman","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","3384.71","999","0","1759 Holleman","1","0000-00-00 00:00:00","5400" +"1759","1","Somma","Thanh","999.99","0","0","20","1","1","1","PC","1","0","0","3384.71","999","0","1759 Somma","1","0000-00-00 00:00:00","5134" +"3777","1","Eisenhower","Jacqui","999.99","0","0","20","1","1","1","PC","1","0","0","898.29","999","0","3777 Eisenhower","1","0000-00-00 00:00:00","1251" +"3852","1","Sester","Grady","999.99","0","0","20","1","1","1","PC","1","0","0","628.55","999","1","3852 Sester","1","0000-00-00 00:00:00","5180" +"1248","2","Wild","Tammi","999.99","0","0","20","1","0","1","PC","1","0","0","6007.43","999","0","1248 Wild","1","0000-00-00 00:00:00","1526" +"4342","2","Villafane","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","3026.38","999","0","4342 Villafane","1","0000-00-00 00:00:00","2896" +"2912","1","Mcleod","Chrystal","999.99","0","0","20","1","1","1","PC","1","0","0","3418.6","999","0","2912 Mcleod","1","0000-00-00 00:00:00","3820" +"1275","2","Balzer","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1275 Balzer","1","0000-00-00 00:00:00","22348" +"1275","1","Epling","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","3726.04","999","1","1275 Epling","1","0000-00-00 00:00:00","3560" +"4775","2","Strother","Sage","999.99","0","0","20","1","1","1","PC","1","0","0","1800.4","999","0","4775 Strother","1","0000-00-00 00:00:00","3325" +"8154","1","Mickey","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","8027.1","999","1","8154 Mickey","1","0000-00-00 00:00:00","5609" +"5119","2","Medley","Gwyneth","999.99","0","0","20","1","1","1","PC","1","0","0","30.52","999","0","5119 Medley","1","0000-00-00 00:00:00","3403" +"698","2","Getz","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","2100.06","999","0","698 Getz","1","0000-00-00 00:00:00","21595" +"698","1","Mollett","Rivka","999.99","0","0","20","1","1","1","PC","1","0","0","2100.06","999","0","698 Mollett","1","0000-00-00 00:00:00","4452" +"6578","2","Milian","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6578 Milian","1","0000-00-00 00:00:00","27481" +"3151","1","Michaels","Kenny","999.99","0","0","20","1","1","1","PC","1","0","0","4269.18","999","0","3151 Michaels","1","0000-00-00 00:00:00","4006" +"4176","2","Cutchin","Bertha","999.99","0","0","20","1","1","1","PC","1","0","0","119.56","999","0","4176 Cutchin","1","0000-00-00 00:00:00","2388" +"1141","2","Garbarino","Shirl","999.99","0","0","20","1","1","1","PC","1","0","0","1200.35","999","0","1141 Garbarino","1","0000-00-00 00:00:00","4230" +"1141","1","Mcgibbon","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","1200.35","999","0","1141 Mcgibbon","1","0000-00-00 00:00:00","2665" +"5229","2","Davisson","Kenneth","999.99","0","0","20","1","1","1","PC","1","0","0","1706.4","999","0","5229 Davisson","1","0000-00-00 00:00:00","2256" +"9267","1","Pemberton","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","265.22","999","0","9267 Pemberton","1","0000-00-00 00:00:00","3771" +"8436","2","Hodson","Hulda","999.99","0","0","20","1","1","1","PC","1","0","0","268.19","999","0","8436 Hodson","1","0000-00-00 00:00:00","6079" +"8080","2","Vandenbosch","Hui","999.99","0","0","20","1","1","1","PC","1","0","0","2723.03","999","0","8080 Vandenbosch","1","0000-00-00 00:00:00","24208" +"1649","2","Raske","Retha","999.99","0","0","20","1","1","1","PC","1","0","0","2811.05","999","0","1649 Raske","1","0000-00-00 00:00:00","5781" +"6424","1","Drinkwater","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","537.24","999","0","6424 Drinkwater","1","0000-00-00 00:00:00","1795" +"8842","1","Bouknight","Caroll","999.99","0","0","20","1","1","1","PC","1","0","0","635.71","999","0","8842 Bouknight","1","0000-00-00 00:00:00","2482" +"1544","2","Hennings","Samual","999.99","0","0","20","1","1","1","PC","1","0","0","3176.14","999","0","1544 Hennings","1","0000-00-00 00:00:00","2576" +"1544","4","Prichett","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","3176.14","999","0","1544 Prichett","1","0000-00-00 00:00:00","971" +"1038","4","Laura","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","716.24","999","1","1038 Laura","1","0000-00-00 00:00:00","6362" +"1038","2","Starr","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","716.24","999","1","1038 Starr","1","0000-00-00 00:00:00","2017" +"5753","1","Nowland","Marcelene","999.99","0","0","20","1","1","1","PC","1","0","0","3165.01","999","0","5753 Nowland","1","0000-00-00 00:00:00","4308" +"2721","1","Eutsler","Dortha","999.99","0","0","20","1","1","1","PC","1","0","0","1042.72","999","0","2721 Eutsler","1","0000-00-00 00:00:00","4635" +"2423","2","Mueller","Marcus","999.99","0","0","20","1","1","1","PC","1","0","0","203.45","999","1","2423 Mueller","1","0000-00-00 00:00:00","4024" +"3861","1","Peltier","Clint","999.99","0","0","20","1","1","1","PC","1","0","0","685.15","999","0","3861 Peltier","1","0000-00-00 00:00:00","5697" +"5159","1","Hinshaw","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","302.37","999","1","5159 Hinshaw","1","0000-00-00 00:00:00","943" +"1238","1","Mcfall","Ulrike","999.99","0","0","20","1","1","1","PC","1","0","0","2247.55","999","0","1238 Mcfall","1","0000-00-00 00:00:00","1166" +"9463","2","Vasques","Lillian","999.99","0","0","20","1","1","1","PC","1","0","0","2379.57","999","0","9463 Vasques","1","0000-00-00 00:00:00","19944" +"9948","1","Ehrman","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","226.98","999","0","9948 Ehrman","1","0000-00-00 00:00:00","6220" +"6700","1","Vandenbosch","Calista","999.99","0","0","20","1","1","1","PC","1","0","0","1073.81","999","0","6700 Vandenbosch","1","0000-00-00 00:00:00","2447" +"5481","1","Riffel","Lakesha","999.99","0","0","20","1","1","1","PC","1","0","0","411.66","999","1","5481 Riffel","1","0000-00-00 00:00:00","2918" +"6873","2","Heise","Myrtle","999.99","0","0","20","1","0","1","PC","1","0","0","3241.05","999","0","6873 Heise","1","0000-00-00 00:00:00","228" +"1027","3","Hough","Eldridge","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1027 Hough","1","0000-00-00 00:00:00","10335" +"1027","1","Mcburney","Criselda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1027 Mcburney","1","0000-00-00 00:00:00","4458" +"3872","2","Coello","Jamie","999.99","0","0","20","1","1","1","PC","1","0","0","557.5","999","0","3872 Coello","1","0000-00-00 00:00:00","1125" +"3538","2","Olaughlin","Violette","999.99","0","0","20","1","0","1","PC","1","0","0","84.29","999","1","3538 Olaughlin","1","0000-00-00 00:00:00","5901" +"4947","1","Anding","Josefine","999.99","0","0","20","1","1","1","PC","1","0","0","299.42","999","0","4947 Anding","1","0000-00-00 00:00:00","3857" +"3657","2","Suen","Taryn","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","3657 Suen","1","0000-00-00 00:00:00","22703" +"3657","4","Osman","Jule","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","3657 Osman","1","0000-00-00 00:00:00","22705" +"2381","2","Calo","Liana","0","0","0","0","0","0","0","INACT","0","0","0","0","999","0","2381 Calo","1","0000-00-00 00:00:00","29305" +"2136","1","Derose","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","179.71","999","0","2136 Derose","1","0000-00-00 00:00:00","6060" +"6248","2","Steffey","Anette","999.99","0","0","20","1","1","1","PC","1","0","0","1243.4","999","0","6248 Steffey","1","0000-00-00 00:00:00","3139" +"2811","4","Housley","Luther","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2811 Housley","1","0000-00-00 00:00:00","13307" +"2811","1","Michel","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","3956.4","999","0","2811 Michel","1","0000-00-00 00:00:00","5229" +"5521","1","Tawil","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","3583.43","999","0","5521 Tawil","1","0000-00-00 00:00:00","4706" +"7064","2","World","Lady","999.99","0","0","20","1","1","1","PC","1","0","0","3065.96","999","0","7064 World","1","0000-00-00 00:00:00","1921" +"5531","2","Tardiff","Jayme","999.99","0","0","20","1","0","1","PC","1","0","0","3594.87","999","0","5531 Tardiff","1","0000-00-00 00:00:00","789" +"6995","1","Mcmullin","Lazaro","999.99","0","0","20","1","1","1","PC","1","0","0","1832.76","999","0","6995 Mcmullin","1","0000-00-00 00:00:00","935" +"746","1","Timlin","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","625.92","999","1","746 Timlin","1","0000-00-00 00:00:00","475" +"2523","1","Pae","Rossana","999.99","0","0","20","1","1","1","PC","1","0","0","2657.9","999","1","2523 Pae","1","0000-00-00 00:00:00","2454" +"1620","4","Raver","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","482.93","999","0","1620 Raver","1","0000-00-00 00:00:00","5073" +"1620","1","Boggan","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","482.93","999","0","1620 Boggan","1","0000-00-00 00:00:00","2769" +"3416","3","Singletary","Jed","999.99","0","0","20","1","1","1","PC","1","0","0","321.52","999","0","3416 Singletary","1","0000-00-00 00:00:00","5652" +"3416","2","Fortin","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","321.52","999","0","3416 Fortin","1","0000-00-00 00:00:00","888" +"9171","2","Anding","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","530.78","999","1","9171 Anding","1","0000-00-00 00:00:00","19827" +"9171","1","Litman","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","530.78","999","1","9171 Litman","1","0000-00-00 00:00:00","4120" +"4561","3","Reamer","Rutha","999.99","0","0","20","1","1","1","PC","1","0","0","194.9","999","1","4561 Reamer","1","0000-00-00 00:00:00","22251" +"4561","1","Doetsch","Myrl","999.99","0","0","20","1","1","1","PC","1","0","0","194.9","999","1","4561 Doetsch","1","0000-00-00 00:00:00","1564" +"6306","2","Suen","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","426.95","999","1","6306 Suen","1","0000-00-00 00:00:00","11002" +"9507","2","Getz","Latoya","999.99","0","0","20","1","1","1","PC","1","0","0","6630.46","999","0","9507 Getz","1","0000-00-00 00:00:00","27487" +"2122","2","Marnell","Amelia","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2122 Marnell","1","0000-00-00 00:00:00","30519" +"5999","1","Pennypacker","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","24.4","999","1","5999 Pennypacker","1","0000-00-00 00:00:00","5391" +"5999","3","Janecek","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","24.4","999","1","5999 Janecek","1","0000-00-00 00:00:00","4633" +"2107","2","Funches","Octavia","999.99","0","0","20","1","1","1","PC","1","0","0","557.66","999","0","2107 Funches","1","0000-00-00 00:00:00","1658" +"5568","2","Defreitas","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","1030.84","999","0","5568 Defreitas","1","0000-00-00 00:00:00","25443" +"2634","1","Funches","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","793.48","999","0","2634 Funches","1","0000-00-00 00:00:00","3396" +"450","1","Delee","Anette","999.99","0","0","20","1","1","1","PC","1","0","0","625.03","999","1","450 Delee","1","0000-00-00 00:00:00","5529" +"450","3","Villafane","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","625.03","999","1","450 Villafane","1","0000-00-00 00:00:00","595" +"9628","1","Fuell","Melonie","999.99","0","0","20","1","1","1","PC","1","0","0","5668.59","999","0","9628 Fuell","1","0000-00-00 00:00:00","5796" +"1785","3","Keppel","Dortha","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1785 Keppel","1","0000-00-00 00:00:00","6209" +"1785","4","Janecek","Rivka","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1785 Janecek","1","0000-00-00 00:00:00","2399" +"2365","2","Larkin","Shella","999.99","0","0","20","1","1","1","PC","1","0","0","217.28","999","0","2365 Larkin","1","0000-00-00 00:00:00","4407" +"3404","1","Faul","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","1802.09","999","1","3404 Faul","1","0000-00-00 00:00:00","1494" +"1858","1","Fitting","Cathey","999.99","0","0","20","1","1","1","PC","1","0","0","489.39","999","0","1858 Fitting","1","0000-00-00 00:00:00","3186" +"2569","1","Braley","Carisa","999.99","0","0","20","1","1","1","PC","1","0","0","1054.32","999","0","2569 Braley","1","0000-00-00 00:00:00","4307" +"4010","1","Walborn","Annalee","999.99","0","0","20","1","1","1","PC","1","0","0","1095.16","999","0","4010 Walborn","1","0000-00-00 00:00:00","223" +"756","1","Probst","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","2786.7","999","0","756 Probst","1","0000-00-00 00:00:00","329" +"8607","2","Spore","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","1878.28","999","0","8607 Spore","1","0000-00-00 00:00:00","2667" +"3524","3","Ensey","Keneth","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3524 Ensey","1","0000-00-00 00:00:00","7538" +"3524","2","Somma","Jared","999.99","0","0","20","1","0","1","PC","1","0","0","6060.64","999","0","3524 Somma","1","0000-00-00 00:00:00","3020" +"3169","2","Spore","Alonzo","0","16.45","0","20","1","0","0","PC","1","0","0","0","999","0","3169 Spore","1","0000-00-00 00:00:00","19146" +"3169","3","Murton","Jared","0","16.45","0","20","1","0","0","PC","1","0","0","0","999","0","3169 Murton","1","0000-00-00 00:00:00","19147" +"2673","2","Harpole","Ericka","999.99","0","0","20","1","1","1","PC","1","0","0","260.19","999","1","2673 Harpole","1","0000-00-00 00:00:00","1566" +"9830","2","Braley","Nathaniel","999.99","0","0","20","1","1","1","PC","1","0","0","4920.65","999","0","9830 Braley","1","0000-00-00 00:00:00","1495" +"2678","1","Pennell","Kortney","999.99","0","0","20","1","1","1","PC","1","0","0","107.16","999","1","2678 Pennell","1","0000-00-00 00:00:00","4361" +"8677","1","Snodgrass","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","260.42","999","1","8677 Snodgrass","1","0000-00-00 00:00:00","747" +"9051","1","Steele","Huey","999.99","0","0","20","1","1","1","PC","1","0","0","152.12","999","1","9051 Steele","1","0000-00-00 00:00:00","2203" +"928","1","Raver","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","1927.21","999","1","928 Raver","1","0000-00-00 00:00:00","6693" +"7253","1","Madson","Raven","999.99","0","0","20","1","1","1","PC","1","0","0","12448.27","999","0","7253 Madson","1","0000-00-00 00:00:00","3997" +"5994","3","Brantley","Leonel","999.99","0","0","20","1","0","1","PC","1","0","0","15458.96","999","0","5994 Brantley","1","0000-00-00 00:00:00","5410" +"5994","2","Holleman","Winona","999.99","0","0","20","1","0","1","PC","1","0","0","15458.96","999","0","5994 Holleman","1","0000-00-00 00:00:00","3445" +"6882","2","Thach","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","1381.97","999","0","6882 Thach","1","0000-00-00 00:00:00","1222" +"8667","3","Hagaman","Renna","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8667 Hagaman","1","0000-00-00 00:00:00","29554" +"8667","4","Noblitt","Tia","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8667 Noblitt","1","0000-00-00 00:00:00","29555" +"8202","1","Hakala","Elane","999.99","0","0","20","1","1","1","PC","1","0","0","32.13","999","1","8202 Hakala","1","0000-00-00 00:00:00","1423" +"2072","1","Hafford","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","1081.59","999","0","2072 Hafford","1","0000-00-00 00:00:00","3907" +"3040","1","Noblitt","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","943.19","999","0","3040 Noblitt","1","0000-00-00 00:00:00","3565" +"1930","1","Vanderhorst","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","61.35","999","1","1930 Vanderhorst","1","0000-00-00 00:00:00","5692" +"3249","2","Heller","Patrick","0","-17.27","12","100","1","0","0","PC","3","1","0","0","999","0","3249 Heller","1","0000-00-00 00:00:00","24916" +"3249","1","Finke","Isa","999.99","-17.27","12","100","1","1","1","PC","3","1","0","2663.63","999","0","3249 Finke","1","0000-00-00 00:00:00","4539" +"5453","1","Funderburke","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","6536.51","999","0","5453 Funderburke","1","0000-00-00 00:00:00","3840" +"6418","2","Narcisse","Boyce","999.99","0","0","20","1","1","1","PC","1","0","0","517.1","999","1","6418 Narcisse","1","0000-00-00 00:00:00","3060" +"3932","2","Nowlen","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","1607.95","999","0","3932 Nowlen","1","0000-00-00 00:00:00","4977" +"5285","2","Gutman","Refugio","999.99","0","0","20","1","1","1","PC","1","0","0","2615.06","999","0","5285 Gutman","1","0000-00-00 00:00:00","5673" +"8726","1","Grubaugh","Tierra","999.99","0","0","20","1","1","1","PC","1","0","0","3588.07","999","0","8726 Grubaugh","1","0000-00-00 00:00:00","4188" +"3805","2","Keppler","Zachery","999.99","0","0","20","1","0","1","PC","1","0","0","1408.28","999","1","3805 Keppler","1","0000-00-00 00:00:00","2712" +"7775","1","Parada","Janelle","999.99","0","0","20","1","1","1","PC","1","0","0","4012.19","999","0","7775 Parada","1","0000-00-00 00:00:00","2146" +"7775","3","Landwehr","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","4012.19","999","0","7775 Landwehr","1","0000-00-00 00:00:00","1762" +"7778","1","Allbright","Elvera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7778 Allbright","1","0000-00-00 00:00:00","4433" +"4431","2","Nitti","Marketta","999.99","0","0","20","1","1","1","PC","1","0","0","4119.94","999","0","4431 Nitti","1","0000-00-00 00:00:00","9656" +"8702","1","Brawley","Verda","999.99","0","0","20","1","1","1","PC","1","0","0","2053.44","999","0","8702 Brawley","1","0000-00-00 00:00:00","4579" +"2399","1","Darwin","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","384.26","999","1","2399 Darwin","1","0000-00-00 00:00:00","2049" +"2399","3","Cutchin","Ingeborg","999.99","0","0","20","1","1","1","PC","1","0","0","384.26","999","1","2399 Cutchin","1","0000-00-00 00:00:00","15428" +"7401","1","Furlong","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","146.85","999","0","7401 Furlong","1","0000-00-00 00:00:00","4637" +"5970","1","Steele","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","51.16","999","1","5970 Steele","1","0000-00-00 00:00:00","814" +"1815","2","Komar","Wanetta","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1815 Komar","1","0000-00-00 00:00:00","26075" +"1808","2","Kort","Thanh","999.99","0","0","20","1","1","1","PC","1","0","0","275.79","999","1","1808 Kort","1","0000-00-00 00:00:00","26229" +"2004","2","Schempp","Milford","999.99","0","0","20","1","1","1","PC","1","0","0","1686.84","999","0","2004 Schempp","1","0000-00-00 00:00:00","4391" +"3178","1","Hinshaw","Billy","999.99","0","0","20","1","1","1","PC","1","0","0","3075.18","999","0","3178 Hinshaw","1","0000-00-00 00:00:00","490" +"1917","2","Haar","Sage","999.99","0","0","20","1","0","1","PC","1","0","0","977.83","999","0","1917 Haar","1","0000-00-00 00:00:00","98" +"102","1","Labree","Alline","999.99","0","0","20","1","1","1","PC","1","0","0","3118.67","999","1","102 Labree","1","0000-00-00 00:00:00","3870" +"5107","2","Maheux","Celia","999.99","0","0","20","1","1","1","PC","1","0","0","2293.98","999","0","5107 Maheux","1","0000-00-00 00:00:00","27803" +"5166","2","Mcleroy","Dortha","999.99","0","0","20","1","1","1","PC","1","0","0","2833.11","999","0","5166 Mcleroy","1","0000-00-00 00:00:00","4541" +"1361","1","Simms","Joslyn","999.99","0","0","20","1","1","1","PC","1","0","0","3015.95","999","0","1361 Simms","1","0000-00-00 00:00:00","461" +"561","3","Vasques","Yael","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","561 Vasques","1","0000-00-00 00:00:00","20941" +"561","1","Tousignant","Hui","999.99","0","0","20","1","1","1","PC","1","0","0","405.23","999","1","561 Tousignant","1","0000-00-00 00:00:00","2673" +"1585","1","Schempp","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1585 Schempp","1","0000-00-00 00:00:00","4725" +"5293","2","Sitzman","Enid","999.99","0","0","20","1","0","1","PC","1","0","0","1333.5","999","0","5293 Sitzman","1","0000-00-00 00:00:00","875" +"682","1","Maravilla","Samual","999.99","0","0","0","1","1","1","PC","1","0","0","10328.36","999","0","682 Maravilla","1","0000-00-00 00:00:00","5338" +"9649","1","Metro","Carola","999.99","0","0","20","1","1","1","PC","1","0","0","1843.23","999","0","9649 Metro","1","0000-00-00 00:00:00","3367" +"1800","1","Piccard","Annalee","999.99","0","0","20","1","1","1","PC","1","0","0","1909.21","999","0","1800 Piccard","1","0000-00-00 00:00:00","790" +"4082","2","Weishaar","Theda","999.99","0","0","20","1","1","1","PC","1","0","0","1062.86","999","0","4082 Weishaar","1","0000-00-00 00:00:00","3780" +"388","2","Janecek","Summer","999.99","0","0","20","1","0","1","PC","1","0","0","9192.32","999","0","388 Janecek","1","0000-00-00 00:00:00","3893" +"1838","1","Bickle","Earleen","999.99","0","0","20","1","1","1","PC","1","0","0","1531.33","999","0","1838 Bickle","1","0000-00-00 00:00:00","2805" +"9064","3","Swarey","Caroll","999.99","0","0","20","1","1","1","PC","1","0","0","75.95","999","1","9064 Swarey","1","0000-00-00 00:00:00","2029" +"5591","1","Bourbeau","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","1022.39","999","0","5591 Bourbeau","1","0000-00-00 00:00:00","4435" +"1849","2","Monsivais","Claudette","999.99","0","12","100","1","0","1","PC","3","1","0","2109.83","999","0","1849 Monsivais","1","0000-00-00 00:00:00","2721" +"1069","2","Dupuis","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","93.14","999","1","1069 Dupuis","1","0000-00-00 00:00:00","809" +"5001","1","Medley","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","2901.2","999","0","5001 Medley","1","0000-00-00 00:00:00","4127" +"9949","2","Heintzelman","Larae","999.99","0","0","20","1","1","1","PC","1","0","0","256.98","999","0","9949 Heintzelman","1","0000-00-00 00:00:00","5194" +"1536","2","Jepsen","Venetta","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1536 Jepsen","1","0000-00-00 00:00:00","17907" +"1656","1","Mcleroy","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","132.21","999","1","1656 Mcleroy","1","0000-00-00 00:00:00","5544" +"5760","2","Stedman","Shonda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5760 Stedman","1","0000-00-00 00:00:00","8655" +"5675","2","Scurry","Adrien","999.99","0","0","20","1","0","1","PC","1","0","0","1625.55","999","0","5675 Scurry","1","0000-00-00 00:00:00","5643" +"676","2","Diamond","Florrie","999.99","0","0","20","1","0","1","PC","1","0","0","64.6","999","0","676 Diamond","1","0000-00-00 00:00:00","5308" +"7475","2","Perron","Letisha","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7475 Perron","1","0000-00-00 00:00:00","20180" +"9493","1","Wilmes","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","117.16","999","1","9493 Wilmes","1","0000-00-00 00:00:00","3962" +"1674","2","Melby","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","2155.8","999","0","1674 Melby","1","0000-00-00 00:00:00","21731" +"1505","1","Creason","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","2459.51","999","0","1505 Creason","1","0000-00-00 00:00:00","502" +"2171","2","Cruzado","Elyse","999.99","0","0","20","1","1","1","PC","1","0","0","2085.42","999","0","2171 Cruzado","1","0000-00-00 00:00:00","5060" +"3157","1","Worthey","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","42.29","999","0","3157 Worthey","1","0000-00-00 00:00:00","6542" +"3157","3","Sledge","Jefferson","999.99","0","0","20","1","1","1","PC","1","0","0","42.29","999","0","3157 Sledge","1","0000-00-00 00:00:00","4565" +"3535","2","Birch","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","7.53","999","1","3535 Birch","1","0000-00-00 00:00:00","3374" +"867","1","Noblitt","Teisha","999.99","0","0","20","1","1","1","PC","1","0","0","2163.23","999","0","867 Noblitt","1","0000-00-00 00:00:00","5057" +"3597","1","Manganaro","Marceline","999.99","0","0","20","1","1","1","PC","1","0","0","1261.35","999","0","3597 Manganaro","1","0000-00-00 00:00:00","4949" +"8341","1","Scheidegger","Luna","999.99","0","0","20","1","1","1","PC","1","0","0","4392.03","999","0","8341 Scheidegger","1","0000-00-00 00:00:00","1559" +"3092","1","Leib","Carmelita","999.99","0","0","20","1","1","1","PC","1","0","0","8122.49","999","0","3092 Leib","1","0000-00-00 00:00:00","664" +"6644","2","Kort","Dorine","999.99","0","0","20","1","1","1","PC","1","0","0","1297.49","999","0","6644 Kort","1","0000-00-00 00:00:00","5752" +"3771","2","Pelham","Chanell","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3771 Pelham","1","0000-00-00 00:00:00","29068" +"5541","2","Aviles","Tegan","999.99","3.29","0","20","1","1","1","PC","1","0","0","3385.63","999","0","5541 Aviles","1","0000-00-00 00:00:00","3301" +"1456","1","Bourbeau","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1456 Bourbeau","1","0000-00-00 00:00:00","2424" +"5648","1","Faber","Noe","999.99","0","0","0","1","1","1","PC","1","0","0","1590.4","999","0","5648 Faber","1","0000-00-00 00:00:00","4828" +"2960","2","Newby","Sharie","999.99","0","0","20","1","1","1","PC","1","0","0","410.35","999","1","2960 Newby","1","0000-00-00 00:00:00","1410" +"2919","1","Spier","Alline","999.99","0","0","20","1","1","1","PC","1","0","0","5236.55","999","0","2919 Spier","1","0000-00-00 00:00:00","4380" +"2919","3","Frith","Enid","999.99","0","0","20","1","0","1","PC","1","0","0","5236.55","999","0","2919 Frith","1","0000-00-00 00:00:00","2245" +"9299","3","Reamer","Shaneka","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9299 Reamer","1","0000-00-00 00:00:00","21035" +"7331","2","Poche","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","2232.25","999","0","7331 Poche","1","0000-00-00 00:00:00","5062" +"2458","2","Tardiff","Hermine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2458 Tardiff","1","0000-00-00 00:00:00","10655" +"4968","1","Heise","Lemuel","999.99","0","0","20","1","1","1","PC","1","0","0","843.09","999","0","4968 Heise","1","0000-00-00 00:00:00","3" +"5595","2","Pelchat","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","32.51","999","1","5595 Pelchat","1","0000-00-00 00:00:00","6397" +"5796","2","Acklin","Marry","999.99","0","0","20","1","1","1","PC","1","0","0","476.42","999","0","5796 Acklin","1","0000-00-00 00:00:00","17733" +"5579","2","Carolan","Summer","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5579 Carolan","1","0000-00-00 00:00:00","14810" +"1854","1","Bryce","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","1453.75","999","0","1854 Bryce","1","0000-00-00 00:00:00","514" +"197","2","Matherne","Tanya","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","197 Matherne","1","0000-00-00 00:00:00","21063" +"4004","2","Giffen","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","44.53","999","1","4004 Giffen","1","0000-00-00 00:00:00","24136" +"213","1","Leto","Julius","999.99","0","0","20","1","1","1","PC","1","0","0","967.89","999","0","213 Leto","1","0000-00-00 00:00:00","2624" +"5754","2","Rowell","Alina","999.99","0","0","20","1","0","1","PC","1","0","0","1842.53","999","1","5754 Rowell","1","0000-00-00 00:00:00","123" +"5754","3","Peltier","Latricia","999.99","0","0","20","1","0","1","PC","1","0","0","1842.53","999","1","5754 Peltier","1","0000-00-00 00:00:00","4903" +"9140","1","Mumper","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","5894.72","999","0","9140 Mumper","1","0000-00-00 00:00:00","6197" +"323","1","Escalante","Carola","999.99","0","0","20","1","1","1","PC","1","0","0","4655.74","999","0","323 Escalante","1","0000-00-00 00:00:00","4172" +"7209","2","Marnell","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","651.27","999","0","7209 Marnell","1","0000-00-00 00:00:00","24366" +"4789","1","Eidt","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","53.02","999","1","4789 Eidt","1","0000-00-00 00:00:00","5699" +"171","1","Vanwagenen","Delena","999.99","0","0","20","1","1","1","PC","1","0","0","476.52","999","0","171 Vanwagenen","1","0000-00-00 00:00:00","170" +"7707","3","Aviles","Maria","999.99","0","0","20","1","1","1","PC","1","0","0","2249.53","999","0","7707 Aviles","1","0000-00-00 00:00:00","28539" +"7501","2","Vandenbosch","Delaine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7501 Vandenbosch","1","0000-00-00 00:00:00","9711" +"2797","2","Keppler","Leola","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2797 Keppler","1","0000-00-00 00:00:00","21214" +"2797","4","Beer","Gina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2797 Beer","1","0000-00-00 00:00:00","21216" +"2471","1","Noblitt","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","528.84","999","1","2471 Noblitt","1","0000-00-00 00:00:00","2816" +"3990","1","Mcglothlen","Lane","999.99","0","0","20","1","1","1","PC","1","0","0","2746.7","999","0","3990 Mcglothlen","1","0000-00-00 00:00:00","5905" +"5059","1","Sugarman","Jamaal","999.99","0","0","20","1","1","1","PC","1","0","0","517.48","999","0","5059 Sugarman","1","0000-00-00 00:00:00","4575" +"856","1","Laura","Winona","999.99","0","0","20","1","1","1","PC","1","0","0","2863.61","999","0","856 Laura","1","0000-00-00 00:00:00","224" +"5823","1","Noecker","Hoa","999.99","0","0","20","1","1","1","PC","1","0","0","4821.37","999","1","5823 Noecker","1","0000-00-00 00:00:00","6313" +"1844","2","Lanier","Boyd","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","1844 Lanier","1","0000-00-00 00:00:00","26353" +"3698","2","Perro","Verdell","999","0","0","20","1","0","1","PC","1","0","0","4145.42","999","0","3698 Perro","1","0000-00-00 00:00:00","7384" +"9589","1","Bertucci","Wanita","999.99","0","0","20","1","1","1","PC","1","0","0","388.1","999","0","9589 Bertucci","1","0000-00-00 00:00:00","5686" +"7553","1","Metro","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","1788.52","999","1","7553 Metro","1","0000-00-00 00:00:00","5001" +"3894","2","Kirst","Breann","999.99","0","0","20","1","1","1","PC","1","0","0","2316.83","999","0","3894 Kirst","1","0000-00-00 00:00:00","24378" +"1860","2","Weathersby","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","1207.8","999","0","1860 Weathersby","1","0000-00-00 00:00:00","23177" +"1558","1","Vanwagenen","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","150.26","999","1","1558 Vanwagenen","1","0000-00-00 00:00:00","5028" +"774","1","Hornung","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","37.98","999","1","774 Hornung","1","0000-00-00 00:00:00","2567" +"9861","1","Simkins","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","942.85","999","0","9861 Simkins","1","0000-00-00 00:00:00","2137" +"4704","1","Swarey","Season","999.99","0","0","20","1","1","1","PC","1","0","0","1436.71","999","1","4704 Swarey","1","0000-00-00 00:00:00","1973" +"370","2","Finlayson","Lucila","999.99","17.72","0","20","1","1","1","PC","1","0","0","691.66","999","1","370 Finlayson","1","0000-00-00 00:00:00","27754" +"7242","2","Ratti","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","2068.09","999","0","7242 Ratti","1","0000-00-00 00:00:00","16290" +"2413","1","World","Marline","999.99","0","0","0","0","1","1","TERM","0","0","0","864.47","999","0","2413 World","1","0000-00-00 00:00:00","5914" +"5210","2","Suen","Christi","999.99","0","0","20","1","0","1","PC","1","0","0","4741.76","999","0","5210 Suen","1","0000-00-00 00:00:00","6658" +"5210","1","Laura","Archie","999.99","0","0","20","1","1","1","PC","1","0","0","4741.76","999","0","5210 Laura","1","0000-00-00 00:00:00","3587" +"8734","1","Ducan","Dixie","999.99","0","0","20","1","1","1","PC","1","0","0","349.71","999","0","8734 Ducan","1","0000-00-00 00:00:00","1796" +"292","1","Olaughlin","Liana","999.99","0","0","20","1","1","1","PC","1","0","0","286.03","999","1","292 Olaughlin","1","0000-00-00 00:00:00","3984" +"1126","1","Bourbeau","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","2910.84","999","0","1126 Bourbeau","1","0000-00-00 00:00:00","2191" +"5124","3","Ammann","Selina","999.99","0","0","20","1","1","1","PC","1","0","0","979","999","0","5124 Ammann","1","0000-00-00 00:00:00","20552" +"4144","2","Murton","Anette","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4144 Murton","1","0000-00-00 00:00:00","23361" +"5536","1","Tunney","Agnus","999.99","0","0","20","1","1","1","PC","1","0","0","2151.61","999","1","5536 Tunney","1","0000-00-00 00:00:00","11979" +"5536","3","Tyra","Marketta","999.99","0","0","20","1","0","1","PC","1","0","0","2151.61","999","1","5536 Tyra","1","0000-00-00 00:00:00","7803" +"5126","4","Baily","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","5372.18","999","0","5126 Baily","1","0000-00-00 00:00:00","27440" +"5126","3","Komar","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","5372.18","999","0","5126 Komar","1","0000-00-00 00:00:00","27439" +"8176","3","Haverly","Brittani","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8176 Haverly","1","0000-00-00 00:00:00","12837" +"8176","2","Salvo","Roderick","999.99","0","0","20","1","0","1","PC","1","0","0","2274.87","999","0","8176 Salvo","1","0000-00-00 00:00:00","2780" +"7759","1","Callejas","Selina","999.99","0","0","20","1","1","1","PC","1","0","0","2075.38","999","0","7759 Callejas","1","0000-00-00 00:00:00","2425" +"4530","1","Carlino","Robbyn","999.99","0","0","20","1","1","1","PC","1","0","0","653.64","999","1","4530 Carlino","1","0000-00-00 00:00:00","2329" +"7166","2","Alsobrook","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","1406.98","999","1","7166 Alsobrook","1","0000-00-00 00:00:00","594" +"1603","3","Michaels","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","394.49","999","0","1603 Michaels","1","0000-00-00 00:00:00","8405" +"2379","1","Voltz","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","3039.84","999","0","2379 Voltz","1","0000-00-00 00:00:00","88" +"7535","1","Hickman","Alvaro","999.99","0","0","20","1","1","1","PC","1","0","0","1160.55","999","0","7535 Hickman","1","0000-00-00 00:00:00","526" +"8844","1","Paiva","Georgia","999.99","0","0","20","1","1","1","PC","1","0","0","7408.9","999","0","8844 Paiva","1","0000-00-00 00:00:00","3128" +"7918","4","Kilpatrick","Marcus","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7918 Kilpatrick","1","0000-00-00 00:00:00","30301" +"7918","2","Capshaw","Lizeth","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7918 Capshaw","1","0000-00-00 00:00:00","30299" +"3590","1","Hix","Francoise","999.99","0","0","20","1","1","1","PC","1","0","0","1487.44","999","1","3590 Hix","1","0000-00-00 00:00:00","1548" +"772","1","Kari","Nellie","999.99","0","0","20","1","1","1","PC","1","0","0","3589.97","999","0","772 Kari","1","0000-00-00 00:00:00","1088" +"2325","1","Hafley","Tanya","999.99","0","0","20","1","1","1","PC","1","0","0","2085.45","999","0","2325 Hafley","1","0000-00-00 00:00:00","709" +"1063","2","Snodgrass","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","2804.03","999","0","1063 Snodgrass","1","0000-00-00 00:00:00","335" +"646","1","Beltrami","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","4887.53","999","0","646 Beltrami","1","0000-00-00 00:00:00","5409" +"1397","1","Aviles","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","345.48","999","0","1397 Aviles","1","0000-00-00 00:00:00","374" +"6187","2","Irwin","Lesia","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","6187 Irwin","1","0000-00-00 00:00:00","19998" +"1724","2","Grahn","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","256.63","999","1","1724 Grahn","1","0000-00-00 00:00:00","25446" +"1033","2","Durand","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","2646.51","999","0","1033 Durand","1","0000-00-00 00:00:00","2234" +"3837","2","Perro","Shelley","999.99","0","0","20","1","0","1","PC","1","0","0","134.72","999","1","3837 Perro","1","0000-00-00 00:00:00","3618" +"6261","3","Weimar","Claudine","999.99","0","0","20","1","1","1","PC","1","0","0","5889.82","999","0","6261 Weimar","1","0000-00-00 00:00:00","17352" +"6261","1","Bohn","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","5889.82","999","0","6261 Bohn","1","0000-00-00 00:00:00","4727" +"9270","1","Lujan","Arlene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9270 Lujan","1","0000-00-00 00:00:00","4561" +"2395","3","Trousdale","Dixie","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2395 Trousdale","1","0000-00-00 00:00:00","23267" +"864","1","Rodrigez","Letisha","999.99","0","0","20","1","1","1","PC","1","0","0","2562.89","999","0","864 Rodrigez","1","0000-00-00 00:00:00","6216" +"1241","2","Vizcarra","Katrice","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1241 Vizcarra","1","0000-00-00 00:00:00","26888" +"6440","2","Housley","Robbi","999.99","0","0","20","1","1","1","PC","1","0","0","1028.73","999","0","6440 Housley","1","0000-00-00 00:00:00","17722" +"8781","1","Allbright","Grady","999.99","0","12","100","1","1","1","PC","3","1","0","184.27","999","1","8781 Allbright","1","0000-00-00 00:00:00","1398" +"9552","2","Defreitas","Marylou","999.99","0","0","20","1","1","1","PC","1","0","0","2595.08","999","0","9552 Defreitas","1","0000-00-00 00:00:00","752" +"6712","2","Tyra","Zoila","999.99","0","0","20","1","0","1","PC","1","0","0","120.13","999","1","6712 Tyra","1","0000-00-00 00:00:00","4982" +"7800","1","Hornung","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","2151.67","999","0","7800 Hornung","1","0000-00-00 00:00:00","2222" +"2590","1","Marston","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","2086.97","999","1","2590 Marston","1","0000-00-00 00:00:00","4814" +"8527","1","Hafley","Jacklyn","999.99","20","0","20","1","1","1","PC","1","0","0","6222.1","999","0","8527 Hafley","1","0000-00-00 00:00:00","5392" +"5379","1","Mcelvain","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","282.84","999","0","5379 Mcelvain","1","0000-00-00 00:00:00","1319" +"6916","1","Ayotte","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","18.79","999","1","6916 Ayotte","1","0000-00-00 00:00:00","1284" +"5100","1","Dillenbeck","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","144.24","999","0","5100 Dillenbeck","1","0000-00-00 00:00:00","3201" +"5566","2","Novoa","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","1254.33","999","0","5566 Novoa","1","0000-00-00 00:00:00","3369" +"813","1","Goodell","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","217.84","999","1","813 Goodell","1","0000-00-00 00:00:00","4694" +"1727","2","Hodson","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","1329.94","999","0","1727 Hodson","1","0000-00-00 00:00:00","9801" +"2154","3","Starr","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","173.44","999","0","2154 Starr","1","0000-00-00 00:00:00","15882" +"2154","1","Szewczyk","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","173.44","999","0","2154 Szewczyk","1","0000-00-00 00:00:00","1357" +"84","2","Sedillo","Suzie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","84 Sedillo","1","0000-00-00 00:00:00","2122" +"4549","2","Pung","Barb","999.99","0","0","20","1","1","1","PC","1","0","0","193.17","999","1","4549 Pung","1","0000-00-00 00:00:00","1999" +"5917","1","Milian","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5917 Milian","1","0000-00-00 00:00:00","2233" +"5789","2","Guebert","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","477.94","999","1","5789 Guebert","1","0000-00-00 00:00:00","858" +"8173","1","Arata","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","1560.27","999","1","8173 Arata","1","0000-00-00 00:00:00","5237" +"620","2","Hinshaw","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","2963.16","999","0","620 Hinshaw","1","0000-00-00 00:00:00","166" +"4254","1","Maestas","Teisha","999.99","0","0","20","1","1","1","PC","1","0","0","793.64","999","0","4254 Maestas","1","0000-00-00 00:00:00","4015" +"1329","2","Madson","Davida","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1329 Madson","1","0000-00-00 00:00:00","30526" +"5575","2","Mckillip","Virgina","999.99","0","0","0","1","0","1","PC","1","0","0","815.41","999","1","5575 Mckillip","1","0000-00-00 00:00:00","87" +"1675","1","Quintero","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","1535.04","999","1","1675 Quintero","1","0000-00-00 00:00:00","5626" +"8164","1","Paiva","Danae","999.99","0","0","20","1","1","1","PC","1","0","0","60.13","999","1","8164 Paiva","1","0000-00-00 00:00:00","6375" +"1912","1","Derose","Julius","999.99","0","0","20","1","1","1","PC","1","0","0","1215.76","999","1","1912 Derose","1","0000-00-00 00:00:00","4471" +"4609","1","Parada","Chanell","999.99","0","0","20","1","1","1","PC","1","0","0","981.52","999","1","4609 Parada","1","0000-00-00 00:00:00","1373" +"1526","2","Snively","Gwenda","999.99","0","0","20","1","1","1","PC","1","0","0","638.3","999","0","1526 Snively","1","0000-00-00 00:00:00","6754" +"4798","1","Mitcham","Summer","999.99","0","0","20","1","1","1","PC","1","0","0","197.29","999","0","4798 Mitcham","1","0000-00-00 00:00:00","4378" +"1882","1","Minnix","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","2168.32","999","0","1882 Minnix","1","0000-00-00 00:00:00","2455" +"5611","1","Irwin","Maren","999.99","0","0","0","0","1","1","INACT","0","0","0","836.11","999","0","5611 Irwin","1","0000-00-00 00:00:00","1869" +"8819","2","Callejas","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","2.52","999","1","8819 Callejas","1","0000-00-00 00:00:00","22417" +"4035","3","Kouba","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","157.13","999","1","4035 Kouba","1","0000-00-00 00:00:00","26289" +"4035","1","Lapham","Elyse","999.99","0","0","20","1","1","1","PC","1","0","0","157.13","999","1","4035 Lapham","1","0000-00-00 00:00:00","6166" +"5695","1","Spier","Tanya","999.99","0","0","20","1","1","1","PC","1","0","0","1289.16","999","0","5695 Spier","1","0000-00-00 00:00:00","2402" +"3874","1","Castille","Violette","999.99","0","0","20","1","1","1","PC","1","0","0","234.8","999","0","3874 Castille","1","0000-00-00 00:00:00","3317" +"4374","3","Dobson","Vern","999.99","0","0","20","1","1","1","PC","1","0","0","664.36","999","1","4374 Dobson","1","0000-00-00 00:00:00","25195" +"4374","2","Gunderman","Barbera","999.99","0","0","20","1","1","1","PC","1","0","0","664.36","999","1","4374 Gunderman","1","0000-00-00 00:00:00","25194" +"4492","2","Nance","Shalanda","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4492 Nance","1","0000-00-00 00:00:00","21297" +"4993","3","Ming","Eilene","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","4993 Ming","1","0000-00-00 00:00:00","8142" +"4993","1","Riffel","Cathey","999.99","0","0","20","1","1","1","PC","1","0","0","5699.4","999","0","4993 Riffel","1","0000-00-00 00:00:00","2834" +"219","2","Bertucci","Myrl","999.99","0","0","20","1","0","1","PC","1","0","0","397.54","999","0","219 Bertucci","1","0000-00-00 00:00:00","2306" +"8746","2","Trafton","Shelley","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8746 Trafton","1","0000-00-00 00:00:00","29571" +"3618","2","Fierro","Lonnie","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","3618 Fierro","1","0000-00-00 00:00:00","29905" +"2896","1","Brehmer","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","762.4","999","0","2896 Brehmer","1","0000-00-00 00:00:00","5177" +"2896","3","Desanti","Verdell","999.99","0","0","20","1","1","1","PC","1","0","0","762.4","999","0","2896 Desanti","1","0000-00-00 00:00:00","28466" +"8314","1","Roten","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","2005.39","999","1","8314 Roten","1","0000-00-00 00:00:00","1010" +"1080","2","Bohn","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","2169.83","999","0","1080 Bohn","1","0000-00-00 00:00:00","2889" +"2645","2","Flesher","Robbyn","999.99","0","0","20","1","1","1","PC","1","0","0","120.56","999","1","2645 Flesher","1","0000-00-00 00:00:00","4834" +"9737","1","Kriger","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","2286.45","999","0","9737 Kriger","1","0000-00-00 00:00:00","1822" +"717","2","Nance","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","5227.1","999","0","717 Nance","1","0000-00-00 00:00:00","24335" +"4752","1","Michel","Verdell","999.99","0","0","20","1","1","1","PC","1","0","0","55.78","999","1","4752 Michel","1","0000-00-00 00:00:00","1926" +"2433","1","Sunderland","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","1893.27","999","0","2433 Sunderland","1","0000-00-00 00:00:00","2446" +"3337","1","Lajeunesse","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","250.22","999","1","3337 Lajeunesse","1","0000-00-00 00:00:00","4912" +"2225","3","Grothe","Noreen","999.99","0","0","20","1","1","1","PC","1","0","0","2120.3","999","1","2225 Grothe","1","0000-00-00 00:00:00","2039" +"2225","4","James","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","2120.3","999","1","2225 James","1","0000-00-00 00:00:00","1210" +"7710","2","Dillenbeck","Thanh","999.99","0","0","20","1","0","1","PC","1","0","0","43.9","999","1","7710 Dillenbeck","1","0000-00-00 00:00:00","1735" +"6717","2","Sester","Josie","0","20","0","20","1","0","0","PC","1","0","0","0","999","0","6717 Sester","1","0000-00-00 00:00:00","24903" +"5464","2","Metro","Elyse","999.99","0","0","20","1","1","1","PC","1","0","0","2624.8","999","0","5464 Metro","1","0000-00-00 00:00:00","5045" +"5464","3","Eutsler","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","2624.8","999","0","5464 Eutsler","1","0000-00-00 00:00:00","3391" +"5474","1","Oyola","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","699.18","999","0","5474 Oyola","1","0000-00-00 00:00:00","1348" +"1984","2","Sunderland","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","7666.38","999","0","1984 Sunderland","1","0000-00-00 00:00:00","4398" +"1984","3","Vaughns","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","7666.38","999","0","1984 Vaughns","1","0000-00-00 00:00:00","3950" +"3818","2","Newby","Clint","999.99","0","0","20","1","1","1","PC","1","0","0","7174.26","999","0","3818 Newby","1","0000-00-00 00:00:00","3843" +"2968","2","Starr","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","1444.63","999","0","2968 Starr","1","0000-00-00 00:00:00","19177" +"329","1","Boyett","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","69.47","999","1","329 Boyett","1","0000-00-00 00:00:00","4493" +"5864","1","Wedderburn","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","1760.75","999","0","5864 Wedderburn","1","0000-00-00 00:00:00","1439" +"1447","2","Ducan","Magan","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1447 Ducan","1","0000-00-00 00:00:00","24617" +"4180","2","Castilleja","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","688.85","999","0","4180 Castilleja","1","0000-00-00 00:00:00","2903" +"4092","1","Pemberton","Pricilla","999.99","0","0","20","1","1","1","PC","1","0","0","2431.23","999","1","4092 Pemberton","1","0000-00-00 00:00:00","1434" +"3015","4","Parada","Josefine","999.99","0","0","20","1","1","1","PC","1","0","0","787.41","999","0","3015 Parada","1","0000-00-00 00:00:00","30915" +"3015","2","Tawil","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","787.41","999","0","3015 Tawil","1","0000-00-00 00:00:00","30913" +"3830","1","Keppler","Retha","999.99","11.34","0","20","1","1","1","PC","1","0","0","3167.26","999","0","3830 Keppler","1","0000-00-00 00:00:00","4115" +"3731","2","Mcgibbon","Jaime","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3731 Mcgibbon","1","0000-00-00 00:00:00","21221" +"8320","3","Weathersby","Jack","999.99","0","0","20","1","0","1","PC","1","0","0","3394.86","999","1","8320 Weathersby","1","0000-00-00 00:00:00","10578" +"8320","4","Baumgart","Patrick","999.99","0","0","20","1","0","1","PC","1","0","0","3394.86","999","1","8320 Baumgart","1","0000-00-00 00:00:00","8535" +"4821","1","Carolan","Maurita","999.99","0","0","20","1","1","1","PC","1","0","0","786.23","999","0","4821 Carolan","1","0000-00-00 00:00:00","6368" +"123","2","Blais","Jayme","999.99","0","0","20","1","0","1","PC","1","0","0","1035.29","999","0","123 Blais","1","0000-00-00 00:00:00","1349" +"7045","2","Epling","Tia","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7045 Epling","1","0000-00-00 00:00:00","25394" +"7045","1","Mickey","Hui","999.99","0","0","20","1","1","1","PC","1","0","0","3533.55","999","0","7045 Mickey","1","0000-00-00 00:00:00","3453" +"778","2","Albritton","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","397.07","999","1","778 Albritton","1","0000-00-00 00:00:00","1340" +"7711","1","Schier","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","2740.33","999","0","7711 Schier","1","0000-00-00 00:00:00","2016" +"1531","1","Rozzi","Nicole","999.99","0","0","20","1","1","1","PC","1","0","0","2399.38","999","0","1531 Rozzi","1","0000-00-00 00:00:00","1332" +"5729","2","Neuner","Serafina","999.99","0","0","20","1","1","1","PC","1","0","0","281.62","999","0","5729 Neuner","1","0000-00-00 00:00:00","1183" +"1859","1","Darwin","Lilia","999.99","0","0","20","1","1","1","PC","1","0","0","2640.34","999","1","1859 Darwin","1","0000-00-00 00:00:00","5444" +"3305","1","Valdez","Bobbi","999.99","0","0","20","1","1","1","PC","1","0","0","985.4","999","0","3305 Valdez","1","0000-00-00 00:00:00","991" +"5774","1","Hix","Florrie","999.99","0","0","20","1","1","1","PC","1","0","0","2199.38","999","1","5774 Hix","1","0000-00-00 00:00:00","5877" +"3514","1","Furlong","Tobias","999.99","0","0","20","1","1","1","PC","1","0","0","938.43","999","0","3514 Furlong","1","0000-00-00 00:00:00","6543" +"346","1","Salvo","Shalanda","999.99","0","0","20","1","1","1","PC","1","0","0","3369.92","999","0","346 Salvo","1","0000-00-00 00:00:00","3494" +"1229","2","Koziel","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","344.92","999","0","1229 Koziel","1","0000-00-00 00:00:00","30585" +"1229","4","Beltrami","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","344.92","999","0","1229 Beltrami","1","0000-00-00 00:00:00","30587" +"2521","1","Janecek","Enid","999.99","0","0","20","1","1","1","PC","1","0","0","1008.88","999","0","2521 Janecek","1","0000-00-00 00:00:00","2807" +"3617","2","Mcfall","Carol","999.99","0","0","20","1","1","1","PC","1","0","0","612.05","999","0","3617 Mcfall","1","0000-00-00 00:00:00","23142" +"4174","1","Callejas","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","206.93","999","0","4174 Callejas","1","0000-00-00 00:00:00","5756" +"4297","2","Coppola","Maurita","999.99","0","0","20","1","0","1","PC","1","0","0","2240.56","999","0","4297 Coppola","1","0000-00-00 00:00:00","4980" +"5484","2","Pae","Marc","999.99","0","0","20","1","1","1","PC","1","0","0","630.68","999","0","5484 Pae","1","0000-00-00 00:00:00","5251" +"2358","1","Bilbo","Fritz","999.99","0","0","0","0","1","1","TERM","0","0","0","345.64","999","0","2358 Bilbo","1","0000-00-00 00:00:00","2371" +"9248","1","Chain","Lise","999.99","0","0","0","0","1","1","TERM","0","0","0","180.83","999","0","9248 Chain","1","0000-00-00 00:00:00","2174" +"2308","2","Hough","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","630.56","999","1","2308 Hough","1","0000-00-00 00:00:00","23027" +"6789","1","Mueller","Liana","999.99","0","0","20","1","1","1","PC","1","0","0","2330.62","999","0","6789 Mueller","1","0000-00-00 00:00:00","4941" +"3906","1","Mckillip","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","304.43","999","1","3906 Mckillip","1","0000-00-00 00:00:00","286" +"5696","2","Atwell","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","1043.62","999","0","5696 Atwell","1","0000-00-00 00:00:00","5599" +"2040","2","Steffey","Joaquina","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2040 Steffey","1","0000-00-00 00:00:00","20557" +"6399","2","Debonis","Mi","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6399 Debonis","1","0000-00-00 00:00:00","19118" +"65","2","Wessner","Dominick","999.99","0","0","20","1","1","1","PC","1","0","0","3618.61","999","0","65 Wessner","1","0000-00-00 00:00:00","3447" +"5898","2","Wild","Collene","999.99","0","0","20","1","1","1","PC","1","0","0","220.64","999","0","5898 Wild","1","0000-00-00 00:00:00","30374" +"2585","1","Liu","Tyree","999.99","0","0","20","1","1","1","PC","1","0","0","1326.39","999","0","2585 Liu","1","0000-00-00 00:00:00","6379" +"1247","1","Sprau","Jaime","999.99","0","0","0","0","1","1","TERM","0","0","0","22.19","999","0","1247 Sprau","1","0000-00-00 00:00:00","6196" +"8739","2","Bryce","Dixie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8739 Bryce","1","0000-00-00 00:00:00","23457" +"6415","2","Sester","Barbera","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6415 Sester","1","0000-00-00 00:00:00","30313" +"3037","2","Shoe","Nathaniel","999.99","0","0","0","0","1","1","REG","0","0","0","2269.98","999","0","3037 Shoe","1","0000-00-00 00:00:00","31128" +"5170","2","Raske","Retha","999.99","0","0","20","1","1","1","PC","1","0","0","585.11","999","0","5170 Raske","1","0000-00-00 00:00:00","28685" +"5170","3","Vanderhorst","Letisha","999.99","0","0","20","1","1","1","PC","1","0","0","585.11","999","0","5170 Vanderhorst","1","0000-00-00 00:00:00","28686" +"8772","1","Pillai","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","1514.97","999","0","8772 Pillai","1","0000-00-00 00:00:00","2988" +"7674","1","Defreitas","Geraldo","999.99","0","0","20","1","1","1","PC","1","0","0","5359.41","999","0","7674 Defreitas","1","0000-00-00 00:00:00","2340" +"3369","3","Carlino","Jared","999.99","0","0","20","1","1","1","PC","1","0","0","1728.15","999","0","3369 Carlino","1","0000-00-00 00:00:00","25596" +"3369","1","Cajigas","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","1728.15","999","0","3369 Cajigas","1","0000-00-00 00:00:00","3572" +"2897","1","Nowland","Janel","999.99","0","0","20","1","1","1","PC","1","0","0","2743.97","999","1","2897 Nowland","1","0000-00-00 00:00:00","2101" +"5676","2","Marston","Fairy","999.99","0","0","20","1","1","1","PC","1","0","0","605.56","999","0","5676 Marston","1","0000-00-00 00:00:00","2682" +"5173","2","Piccard","Jacquline","999.99","0","0","20","1","1","1","PC","1","0","0","452","999","0","5173 Piccard","1","0000-00-00 00:00:00","1786" +"9164","1","Milian","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","934.5","999","0","9164 Milian","1","0000-00-00 00:00:00","2539" +"613","2","Fuell","Kam","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","613 Fuell","1","0000-00-00 00:00:00","26764" +"2013","2","Liebsch","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","1119.47","999","0","2013 Liebsch","1","0000-00-00 00:00:00","6544" +"8241","2","Soderberg","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","344.7","999","0","8241 Soderberg","1","0000-00-00 00:00:00","14798" +"7223","1","Able","Noelle","999.99","0","0","20","1","1","1","PC","1","0","0","817.17","999","1","7223 Able","1","0000-00-00 00:00:00","451" +"8187","1","Godines","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8187 Godines","1","0000-00-00 00:00:00","6029" +"3377","1","Eury","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","134.74","999","0","3377 Eury","1","0000-00-00 00:00:00","5398" +"8762","2","Giguere","Shelley","999.99","0","0","20","1","0","1","PC","1","0","0","110.87","999","1","8762 Giguere","1","0000-00-00 00:00:00","4189" +"6746","1","Marion","Boyce","999.99","0","0","20","1","1","1","PC","1","0","0","224.91","999","0","6746 Marion","1","0000-00-00 00:00:00","412" +"1035","3","Baumgart","Love","999.99","0","0","20","1","1","1","PC","1","0","0","1019.54","999","0","1035 Baumgart","1","0000-00-00 00:00:00","28438" +"1348","3","Boyett","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","1244.83","999","0","1348 Boyett","1","0000-00-00 00:00:00","31568" +"1348","1","Kaster","Amada","999.99","0","0","20","1","1","1","PC","1","0","0","1244.83","999","0","1348 Kaster","1","0000-00-00 00:00:00","3357" +"1939","1","Swicegood","Iona","999.99","0","0","20","1","1","1","PC","1","0","0","1248.76","999","0","1939 Swicegood","1","0000-00-00 00:00:00","2406" +"7148","2","Defreitas","Shirlee","999.99","0","0","20","1","1","1","PC","1","0","0","1767.63","999","0","7148 Defreitas","1","0000-00-00 00:00:00","30596" +"1719","2","Leto","Lina","999.99","0","0","0","0","1","1","TERM","0","0","0","7519.87","999","0","1719 Leto","1","0000-00-00 00:00:00","30471" +"845","2","Doetsch","Kyle","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","845 Doetsch","1","0000-00-00 00:00:00","25754" +"1137","3","Mcburney","Marylou","999","0","0","20","1","0","1","PC","1","0","0","3042.56","999","0","1137 Mcburney","1","0000-00-00 00:00:00","7359" +"1137","2","Bratten","Temeka","999.99","0","0","20","1","0","1","PC","1","0","0","3042.56","999","0","1137 Bratten","1","0000-00-00 00:00:00","6360" +"218","1","Rozzell","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","2169.47","999","0","218 Rozzell","1","0000-00-00 00:00:00","1367" +"3630","1","Martines","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","2523.5","999","0","3630 Martines","1","0000-00-00 00:00:00","3650" +"4325","1","Worthey","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","365.33","999","0","4325 Worthey","1","0000-00-00 00:00:00","4758" +"8877","1","Hults","Vern","999.99","22.66","12","100","1","1","1","PC","3","1","0","4164.27","999","0","8877 Hults","1","0000-00-00 00:00:00","5615" +"8877","3","Kulesza","Mi","999.99","22.66","12","100","1","1","1","PC","3","1","0","4164.27","999","0","8877 Kulesza","1","0000-00-00 00:00:00","27051" +"3222","1","Lheureux","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","3933.48","999","0","3222 Lheureux","1","0000-00-00 00:00:00","5094" +"1612","1","Kulesza","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","176.21","999","1","1612 Kulesza","1","0000-00-00 00:00:00","779" +"5","2","Wilmes","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","6411.43","999","0","5 Wilmes","1","0000-00-00 00:00:00","1756" +"9771","3","Godines","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","313.33","999","0","9771 Godines","1","0000-00-00 00:00:00","29455" +"9771","2","Mcburney","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","313.33","999","0","9771 Mcburney","1","0000-00-00 00:00:00","29454" +"783","2","Choiniere","Art","999.99","0","0","20","1","0","1","PC","1","0","0","1017.22","999","0","783 Choiniere","1","0000-00-00 00:00:00","1987" +"4994","1","Wendland","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","4462.6","999","1","4994 Wendland","1","0000-00-00 00:00:00","244" +"9869","2","Broderson","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","3201.91","999","0","9869 Broderson","1","0000-00-00 00:00:00","24258" +"3898","1","Sunderland","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","996.58","999","0","3898 Sunderland","1","0000-00-00 00:00:00","6310" +"1233","1","Abrahams","Lakeesha","999.99","0","0","20","1","1","1","PC","1","0","0","3156.9","999","0","1233 Abrahams","1","0000-00-00 00:00:00","2313" +"5705","1","Chain","Lai","999.99","0","0","20","1","1","1","PC","1","0","0","960.16","999","0","5705 Chain","1","0000-00-00 00:00:00","4338" +"5705","3","Chaves","Dorris","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5705 Chaves","1","0000-00-00 00:00:00","1845" +"3208","1","Bear","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","1124.45","999","0","3208 Bear","1","0000-00-00 00:00:00","3936" +"3574","2","Graybeal","Van","999.99","0","0","20","1","1","1","PC","1","0","0","1280.78","999","0","3574 Graybeal","1","0000-00-00 00:00:00","29718" +"3425","1","Ensey","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","182.71","999","1","3425 Ensey","1","0000-00-00 00:00:00","4559" +"9015","1","Kirst","Shonda","999.99","0","0","20","1","1","1","PC","1","0","0","4018.95","999","0","9015 Kirst","1","0000-00-00 00:00:00","5186" +"882","1","Maestas","Clint","999.99","0","0","20","1","1","1","PC","1","0","0","1705.81","999","1","882 Maestas","1","0000-00-00 00:00:00","5335" +"882","4","Meekins","Jeanmarie","999.99","0","0","20","1","0","1","PC","1","0","0","1705.81","999","1","882 Meekins","1","0000-00-00 00:00:00","4474" +"5231","1","Tramble","Celia","999.99","0","0","20","1","1","1","PC","1","0","0","793.95","999","1","5231 Tramble","1","0000-00-00 00:00:00","4436" +"2493","1","Michel","Linnea","999.99","0","0","20","1","1","1","PC","1","0","0","1579.16","999","0","2493 Michel","1","0000-00-00 00:00:00","853" +"2861","1","Owsley","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","2096.1","999","0","2861 Owsley","1","0000-00-00 00:00:00","5092" +"852","1","Eutsler","Eldora","999.99","0","0","20","1","1","1","PC","1","0","0","798.83","999","0","852 Eutsler","1","0000-00-00 00:00:00","5039" +"863","1","Grahn","Josie","999.99","0","0","20","1","1","1","PC","1","0","0","283.36","999","1","863 Grahn","1","0000-00-00 00:00:00","2608" +"1634","1","Lueck","Grady","999.99","0","0","20","1","1","1","PC","1","0","0","95.9","999","0","1634 Lueck","1","0000-00-00 00:00:00","1663" +"5856","1","Claussen","Miquel","999.99","0","0","20","1","1","1","PC","1","0","0","5466.21","999","0","5856 Claussen","1","0000-00-00 00:00:00","600" +"4355","1","Callejas","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","121.32","999","0","4355 Callejas","1","0000-00-00 00:00:00","3467" +"8591","3","Nance","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","304.83","999","1","8591 Nance","1","0000-00-00 00:00:00","16013" +"658","2","Mcglothlen","Cathey","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","658 Mcglothlen","1","0000-00-00 00:00:00","18020" +"658","1","Pendergrass","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","8962.38","999","0","658 Pendergrass","1","0000-00-00 00:00:00","1147" +"1140","4","Hickman","Jack","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1140 Hickman","1","0000-00-00 00:00:00","14068" +"1140","1","Osman","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","907.35","999","1","1140 Osman","1","0000-00-00 00:00:00","4356" +"2091","1","Castilleja","Venetta","999.99","0","0","20","1","1","1","PC","1","0","0","1247.04","999","0","2091 Castilleja","1","0000-00-00 00:00:00","5729" +"5220","1","Atwell","Felicitas","999.99","19","0","20","1","1","1","PC","1","0","0","7144.89","999","0","5220 Atwell","1","0000-00-00 00:00:00","5909" +"5871","1","Vasko","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","2430.82","999","1","5871 Vasko","1","0000-00-00 00:00:00","1797" +"3202","3","Rodrigez","Brendan","999.99","0","0","20","1","1","1","PC","1","0","0","3015.95","999","0","3202 Rodrigez","1","0000-00-00 00:00:00","16585" +"3202","4","Ellis","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","3015.95","999","0","3202 Ellis","1","0000-00-00 00:00:00","16586" +"8727","2","Kouba","Barb","999.99","0","0","20","1","0","1","PC","1","0","0","1417.26","999","1","8727 Kouba","1","0000-00-00 00:00:00","1106" +"2461","2","Ecton","Latoya","999.99","0","0","20","1","0","1","PC","1","0","0","1679.73","999","0","2461 Ecton","1","0000-00-00 00:00:00","5600" +"1589","2","Eoff","Agnus","999.99","0","0","20","1","0","1","PC","1","0","0","6452.86","999","0","1589 Eoff","1","0000-00-00 00:00:00","1031" +"9676","1","Trigg","Temeka","999.99","0","0","20","1","1","1","PC","1","0","0","499.81","999","1","9676 Trigg","1","0000-00-00 00:00:00","4751" +"6546","1","Carlino","Romelia","999.99","0","0","20","1","1","1","PC","1","0","0","381.44","999","0","6546 Carlino","1","0000-00-00 00:00:00","2025" +"4222","2","Vasques","Carmelita","999.99","0","0","20","1","1","1","PC","1","0","0","513.74","999","1","4222 Vasques","1","0000-00-00 00:00:00","806" +"2536","1","Glassman","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","1212.42","999","0","2536 Glassman","1","0000-00-00 00:00:00","624" +"8118","1","Claussen","Sharie","999.99","0","0","20","1","1","1","PC","1","0","0","2711.61","999","0","8118 Claussen","1","0000-00-00 00:00:00","2982" +"7761","2","Nowland","Latoya","999.99","0","0","20","1","0","1","PC","1","0","0","166.71","999","0","7761 Nowland","1","0000-00-00 00:00:00","3661" +"2473","1","Mcleroy","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","679.07","999","0","2473 Mcleroy","1","0000-00-00 00:00:00","4018" +"2220","4","Defreitas","Carmelita","999","0","0","20","1","0","1","PC","1","0","0","6985.77","999","0","2220 Defreitas","1","0000-00-00 00:00:00","7292" +"2220","1","Hinshaw","Frederick","999.99","0","0","20","1","1","1","PC","1","0","0","6985.77","999","0","2220 Hinshaw","1","0000-00-00 00:00:00","2866" +"9556","3","Castille","Twana","999.99","0","0","20","1","1","1","PC","1","0","0","360.97","999","1","9556 Castille","1","0000-00-00 00:00:00","16497" +"2976","1","Nowland","Junita","999.99","0","0","20","1","1","1","PC","1","0","0","652.24","999","0","2976 Nowland","1","0000-00-00 00:00:00","5113" +"8132","1","Severe","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","383.41","999","1","8132 Severe","1","0000-00-00 00:00:00","4847" +"8196","2","Remsen","Lakesha","999.99","0","0","0","1","0","1","PC","1","0","0","1294.87","999","1","8196 Remsen","1","0000-00-00 00:00:00","3382" +"5426","2","Elridge","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","3120.36","999","0","5426 Elridge","1","0000-00-00 00:00:00","232" +"5413","2","Dietrick","Milford","999.99","0","0","20","1","1","1","PC","1","0","0","1466.1","999","0","5413 Dietrick","1","0000-00-00 00:00:00","2242" +"2733","2","Faul","Kyle","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2733 Faul","1","0000-00-00 00:00:00","30297" +"2733","3","Rozzi","Gwenda","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2733 Rozzi","1","0000-00-00 00:00:00","30298" +"7565","1","Darner","Jacob","999.99","3.27","0","20","1","1","1","PC","1","0","0","789.43","999","1","7565 Darner","1","0000-00-00 00:00:00","1783" +"7655","1","Anding","Larae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7655 Anding","1","0000-00-00 00:00:00","1902" +"8105","1","Atwell","Zane","999.99","0","0","20","1","1","1","PC","1","0","0","82.08","999","0","8105 Atwell","1","0000-00-00 00:00:00","5684" +"4503","3","Aguirre","Shavon","999.99","0","0","20","1","1","1","PC","1","0","0","4956.17","999","0","4503 Aguirre","1","0000-00-00 00:00:00","16043" +"8373","2","Narcisse","Shella","999.99","0","0","20","1","0","1","PC","1","0","0","2563.65","999","0","8373 Narcisse","1","0000-00-00 00:00:00","6258" +"2266","2","Sunderland","Geraldo","0","0","12","100","1","0","0","REG","9","1","0","0","999","0","2266 Sunderland","1","0000-00-00 00:00:00","26122" +"5136","1","Meekins","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","38.61","999","0","5136 Meekins","1","0000-00-00 00:00:00","5123" +"8619","1","Winchell","Linnea","999.99","0","0","20","1","1","1","PC","1","0","0","65.43","999","1","8619 Winchell","1","0000-00-00 00:00:00","5902" +"6356","2","Anderson","Octavia","999.99","0","0","20","1","1","1","PC","1","0","0","2471.34","999","0","6356 Anderson","1","0000-00-00 00:00:00","2275" +"8240","1","Mcburney","Kortney","999.99","0","0","20","1","1","1","PC","1","0","0","1072.23","999","0","8240 Mcburney","1","0000-00-00 00:00:00","4111" +"6462","2","Finlayson","Kirstin","999.99","12.07","0","20","1","1","1","PC","1","0","0","4652.69","999","0","6462 Finlayson","1","0000-00-00 00:00:00","21263" +"6462","4","Weishaar","Theo","999.99","12.07","0","20","1","1","1","PC","1","0","0","4652.69","999","0","6462 Weishaar","1","0000-00-00 00:00:00","21265" +"3200","3","Reamer","Theda","999.99","0","0","20","1","1","1","PC","1","0","0","1105.23","999","0","3200 Reamer","1","0000-00-00 00:00:00","16492" +"3200","1","Osman","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","1105.23","999","0","3200 Osman","1","0000-00-00 00:00:00","4122" +"4087","2","Dyke","Love","999.99","0","0","20","1","0","1","PC","1","0","0","4536.06","999","0","4087 Dyke","1","0000-00-00 00:00:00","3005" +"5196","1","Koziel","Nathaniel","999","0","12","0","1","1","1","REG","9","1","0","0","999","0","5196 Koziel","1","0000-00-00 00:00:00","1034" +"256","3","Braley","Latoya","0","0","12","100","1","0","0","REG","9","1","0","0","0","0","256 Braley","1","0000-00-00 00:00:00","13423" +"256","1","Davisson","Rosalva","999.99","0","12","100","1","1","1","REG","9","1","0","0","999","0","256 Davisson","1","0000-00-00 00:00:00","3972" +"294","2","Reamer","Jeanmarie","999.99","0","0","20","1","1","1","PC","1","0","0","428.94","999","1","294 Reamer","1","0000-00-00 00:00:00","608" +"8690","2","Barhorst","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","111.6","999","1","8690 Barhorst","1","0000-00-00 00:00:00","31758" +"2903","1","Bilbo","Johnsie","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","2903 Bilbo","1","0000-00-00 00:00:00","7057" +"7065","1","Keppel","Collene","999.99","0","0","20","1","1","1","PC","1","0","0","202.66","999","1","7065 Keppel","1","0000-00-00 00:00:00","3881" +"5169","1","Leto","Iona","999.99","0","12","10","1","1","1","REG","9","1","0","0","999","0","5169 Leto","1","0000-00-00 00:00:00","7574" +"3790","1","Michaels","Leola","999.99","0","0","0","0","1","1","TERM","0","1","0","0","999","0","3790 Michaels","1","0000-00-00 00:00:00","7589" +"3062","1","Sitzman","Elinore","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","3062 Sitzman","1","0000-00-00 00:00:00","11858" +"9013","1","Suen","Boyce","999.99","0","0","0","0","1","1","TERM","0","1","0","0","999","0","9013 Suen","1","0000-00-00 00:00:00","12175" +"3320","2","Clatterbuck","Breann","999.99","0","0","20","1","1","1","PC","1","0","0","2922.98","999","1","3320 Clatterbuck","1","0000-00-00 00:00:00","312" +"3320","3","Manzo","Robbyn","999.99","0","0","20","1","1","1","PC","1","0","0","2922.98","999","1","3320 Manzo","1","0000-00-00 00:00:00","9116" +"8427","1","Jun","Marketta","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","8427 Jun","1","0000-00-00 00:00:00","13988" +"6520","1","Ro","Mariette","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","6520 Ro","1","0000-00-00 00:00:00","13990" +"2454","1","Paiva","Haley","999.99","0","0","20","1","1","1","PC","1","0","0","3113.71","999","0","2454 Paiva","1","0000-00-00 00:00:00","3901" +"2454","2","Synder","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","3113.71","999","0","2454 Synder","1","0000-00-00 00:00:00","31641" +"3482","1","Friedt","Josie","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","3482 Friedt","1","0000-00-00 00:00:00","14024" +"6289","1","Quintero","Malia","999.99","0","0","0","0","1","1","TERM","0","1","0","0","999","0","6289 Quintero","1","0000-00-00 00:00:00","14035" +"6289","4","Ecton","Lino","0","0","0","0","0","0","0","TERM","0","1","0","0","999","0","6289 Ecton","1","0000-00-00 00:00:00","25774" +"4688","1","Harpole","Christi","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","4688 Harpole","1","0000-00-00 00:00:00","11523" +"5026","2","Bourbeau","Chrystal","0","0","0","0","0","0","0","INACT","0","1","0","0","0","0","5026 Bourbeau","1","0000-00-00 00:00:00","8752" +"5026","4","Matherne","Svetlana","0","0","0","0","0","0","0","INACT","0","1","0","0","0","0","5026 Matherne","1","0000-00-00 00:00:00","8754" +"2092","2","Szabo","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","4545.56","999","0","2092 Szabo","1","0000-00-00 00:00:00","2078" +"2762","1","Weishaar","Agnus","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","2762 Weishaar","1","0000-00-00 00:00:00","11533" +"1977","3","Dillenbeck","Jadwiga","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1977 Dillenbeck","1","0000-00-00 00:00:00","20063" +"1977","2","Bryce","Katrina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1977 Bryce","1","0000-00-00 00:00:00","20062" +"6551","2","Lheureux","Kortney","999.99","0","0","20","1","1","1","PC","1","0","0","1453.04","999","0","6551 Lheureux","1","0000-00-00 00:00:00","15244" +"6551","4","Albritton","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","1453.04","999","0","6551 Albritton","1","0000-00-00 00:00:00","15246" +"9613","1","Harrod","Cruz","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","9613 Harrod","1","0000-00-00 00:00:00","9918" +"3738","1","Peltier","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","352.59","999","1","3738 Peltier","1","0000-00-00 00:00:00","6121" +"9047","1","Owen","Annabel","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","9047 Owen","1","0000-00-00 00:00:00","9923" +"3580","1","Manzo","Leanora","999.99","0","0","0","0","1","1","INACT","0","1","0","0","999","0","3580 Manzo","1","0000-00-00 00:00:00","9926" +"6033","1","Grubaugh","Kirstin","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","6033 Grubaugh","1","0000-00-00 00:00:00","9928" +"4645","1","Shryock","Winona","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","4645 Shryock","1","0000-00-00 00:00:00","9930" +"1347","1","Riffel","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","222.84","999","1","1347 Riffel","1","0000-00-00 00:00:00","5441" +"6765","1","Rudd","Maynard","999.99","0","0","20","1","1","1","PC","1","0","0","1068.25","999","1","6765 Rudd","1","0000-00-00 00:00:00","5966" +"8464","1","Grubaugh","Janel","999.99","0","0","20","1","1","1","PC","1","0","0","6484.89","999","0","8464 Grubaugh","1","0000-00-00 00:00:00","1512" +"2612","1","Gunderman","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","1351.42","999","0","2612 Gunderman","1","0000-00-00 00:00:00","5900" +"2758","1","Koziel","Gwyneth","999.99","124.27","0","500","1","0","1","REG","4","0","0","0","0","0","2758 Koziel","1","0000-00-00 00:00:00","13171" +"6239","1","Zweifel","Hermila","999.99","1328.48","0","3200","1","0","0","REG","4","0","0","0","0","0","6239 Zweifel","1","0000-00-00 00:00:00","12959" +"8256","1","Lanier","Venus","999.99","0","0","100","1","0","0","REG","4","0","0","0","0","0","8256 Lanier","1","0000-00-00 00:00:00","12961" +"9592","1","Bourbeau","Tamica","999.99","180","0","500","1","0","0","REG","4","0","0","0","0","0","9592 Bourbeau","1","0000-00-00 00:00:00","12962" +"1628","4","Mcpeek","Elliott","0","1.3","0","20","1","0","0","PC","1","0","0","0","999","1","1628 Mcpeek","1","0000-00-00 00:00:00","27068" +"1628","1","Lach","Hai","999.99","1.3","0","20","1","1","1","PC","1","0","0","0","999","1","1628 Lach","1","0000-00-00 00:00:00","3100" +"6651","1","Rashid","Pei","999.99","0","0","20","1","1","1","PC","1","0","0","1440.1","999","0","6651 Rashid","1","0000-00-00 00:00:00","6438" +"6651","4","Mcleroy","Deidra","999.99","0","0","20","1","1","1","PC","1","0","0","1440.1","999","0","6651 Mcleroy","1","0000-00-00 00:00:00","5582" +"6403","1","Hodson","Lakeesha","999.99","0","0","20","1","1","1","PC","1","0","0","588.05","999","1","6403 Hodson","1","0000-00-00 00:00:00","3862" +"6265","1","Jules","Shanta","999.99","206.23","0","1200","1","1","1","REG","4","0","0","2502.05","999","0","6265 Jules","1","0000-00-00 00:00:00","115" +"1416","2","Lone","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","1409.77","999","1","1416 Lone","1","0000-00-00 00:00:00","28873" +"3372","2","Harrod","Vesta","999.99","0","0","20","1","1","1","PC","1","0","0","47.82","999","1","3372 Harrod","1","0000-00-00 00:00:00","3569" +"2763","1","Durand","Shella","999.99","0","0","20","1","1","1","PC","1","0","0","1679.73","999","0","2763 Durand","1","0000-00-00 00:00:00","754" +"5260","2","Chain","Judy","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","5260 Chain","1","0000-00-00 00:00:00","27598" +"2026","1","Zahn","Anamaria","999.99","0","0","20","1","1","1","PC","1","0","0","2970.9","999","0","2026 Zahn","1","0000-00-00 00:00:00","3126" +"361","2","Barefield","Carmelita","999.99","12.72","0","200","1","0","1","REG","2","0","0","546.54","999","0","361 Barefield","1","0000-00-00 00:00:00","27" +"361","4","Villafane","Dennise","999.99","12.72","0","200","1","0","1","REG","2","0","0","546.54","999","0","361 Villafane","1","0000-00-00 00:00:00","2428" +"5561","2","Mollett","Amada","999.99","79.72","0","200","1","1","1","REG","2","0","0","882.21","999","0","5561 Mollett","1","0000-00-00 00:00:00","31469" +"5561","3","Bourbeau","Boyce","999.99","79.72","0","200","1","1","1","REG","2","0","0","882.21","999","0","5561 Bourbeau","1","0000-00-00 00:00:00","31470" +"6968","2","Meekins","Lise","0","113.94","0","0","0","0","0","INACT","0","0","0","0","0","0","6968 Meekins","1","0000-00-00 00:00:00","12607" +"6968","1","Rowell","Teressa","999.99","113.94","0","200","1","1","1","REG","2","0","0","774.8","999","0","6968 Rowell","1","0000-00-00 00:00:00","6351" +"5225","1","Bilbo","Jamaal","999.99","0","0","500","1","1","1","REG","2","0","0","0","999","0","5225 Bilbo","1","0000-00-00 00:00:00","7027" +"5225","3","Soderberg","Carol","999.99","0","0","500","1","1","1","REG","2","0","0","0","999","0","5225 Soderberg","1","0000-00-00 00:00:00","31700" +"1009","2","Bayes","Maria","999.99","64.1","0","200","1","1","1","REG","2","0","0","0","999","0","1009 Bayes","1","0000-00-00 00:00:00","31490" +"1009","3","Stump","Loan","999.99","64.1","0","200","1","1","1","REG","2","0","0","0","999","0","1009 Stump","1","0000-00-00 00:00:00","31491" +"4146","2","Wendland","Rutha","0","0","0","200","1","0","0","REG","2","0","0","0","0","0","4146 Wendland","1","0000-00-00 00:00:00","13604" +"4146","1","Storms","Cameron","999.99","0","0","200","1","1","1","REG","2","0","0","0","999","0","4146 Storms","1","0000-00-00 00:00:00","7034" +"7660","4","Biery","Art","0","0","0","150","1","0","0","REG","2","0","0","0","0","0","7660 Biery","1","0000-00-00 00:00:00","10815" +"7660","3","Birch","Shelley","0","0","0","150","1","0","0","REG","2","0","0","0","0","0","7660 Birch","1","0000-00-00 00:00:00","10814" +"2529","1","Colonna","Georgia","999.99","0","0","20","1","1","1","REG","2","0","0","0","999","0","2529 Colonna","1","0000-00-00 00:00:00","10762" +"3768","1","Goldsborough","Theo","999.99","0","0","20","1","1","1","PC","1","0","0","985.98","999","1","3768 Goldsborough","1","0000-00-00 00:00:00","3384" +"5184","1","Dealba","Josefina","999.99","0","0","20","1","1","1","REG","2","0","0","0","999","0","5184 Dealba","1","0000-00-00 00:00:00","6210" +"9166","1","Synder","Peggy","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","9166 Synder","1","0000-00-00 00:00:00","9873" +"9166","4","Brawley","Noelle","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","9166 Brawley","1","0000-00-00 00:00:00","31329" +"7946","2","Pelaez","Marcelene","999.99","0","0","20","1","1","1","PC","1","0","0","437.16","999","0","7946 Pelaez","1","0000-00-00 00:00:00","6545" +"4428","2","Hertzler","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","2587.96","999","0","4428 Hertzler","1","0000-00-00 00:00:00","23820" +"4428","4","Beltrami","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","2587.96","999","0","4428 Beltrami","1","0000-00-00 00:00:00","23822" +"4686","1","Laberge","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","1578.03","999","0","4686 Laberge","1","0000-00-00 00:00:00","5281" +"1093","1","Sitzman","Carmine","999.99","0","0","20","1","1","1","PC","1","0","0","1414.31","999","0","1093 Sitzman","1","0000-00-00 00:00:00","4819" +"6287","2","Somma","Joaquina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6287 Somma","1","0000-00-00 00:00:00","19525" +"321","1","Paiva","Carisa","999.99","0","0","20","1","1","1","PC","1","0","0","592.56","999","1","321 Paiva","1","0000-00-00 00:00:00","939" +"3264","1","Schoepp","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","1286.49","999","0","3264 Schoepp","1","0000-00-00 00:00:00","1533" +"7240","2","Manganaro","Indira","999.99","0","0","20","1","1","1","PC","1","0","0","3605.7","999","0","7240 Manganaro","1","0000-00-00 00:00:00","1578" +"1388","1","Spitz","Davis","999.99","0","0","20","1","1","1","PC","1","0","0","532.48","999","0","1388 Spitz","1","0000-00-00 00:00:00","4322" +"1934","2","Monsivais","Leola","999.99","0","0","0","1","0","1","PC","1","0","0","371.88","999","1","1934 Monsivais","1","0000-00-00 00:00:00","4701" +"9318","2","Atwell","Pei","999.99","0","0","20","1","1","1","PC","1","0","0","1764.7","999","0","9318 Atwell","1","0000-00-00 00:00:00","6710" +"6073","1","Haggerty","Anette","999.99","0","0","20","1","1","1","PC","1","0","0","1049.26","999","0","6073 Haggerty","1","0000-00-00 00:00:00","1788" +"3152","2","Schmucker","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","2194.54","999","0","3152 Schmucker","1","0000-00-00 00:00:00","1612" +"1957","1","Mcneel","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","1312.28","999","0","1957 Mcneel","1","0000-00-00 00:00:00","3390" +"6218","1","Vaughns","Roderick","999.99","0","0","20","1","1","1","PC","1","0","0","1192.04","999","0","6218 Vaughns","1","0000-00-00 00:00:00","946" +"7579","1","Aguinaga","Kenneth","999.99","0","0","20","1","1","1","PC","1","0","0","1164.22","999","0","7579 Aguinaga","1","0000-00-00 00:00:00","1353" +"4034","2","Vaughns","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","355.54","999","1","4034 Vaughns","1","0000-00-00 00:00:00","22159" +"5127","3","Rippey","Danelle","999.99","20","0","20","1","1","1","PC","1","0","0","7262.37","999","0","5127 Rippey","1","0000-00-00 00:00:00","20432" +"5127","2","Burkhalter","Eulah","999.99","20","0","20","1","1","1","PC","1","0","0","7262.37","999","0","5127 Burkhalter","1","0000-00-00 00:00:00","20431" +"2546","1","Kilpatrick","Deidra","999.99","0","0","20","1","1","1","PC","1","0","0","300.05","999","0","2546 Kilpatrick","1","0000-00-00 00:00:00","3586" +"5447","1","Rippey","Renato","999.99","0","0","20","1","1","1","PC","1","0","0","347.65","999","1","5447 Rippey","1","0000-00-00 00:00:00","611" +"2293","2","Mcleroy","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","153.48","999","1","2293 Mcleroy","1","0000-00-00 00:00:00","17544" +"3516","2","Monsivais","Cherilyn","999.99","0","0","20","1","1","1","PC","1","0","0","1488.19","999","0","3516 Monsivais","1","0000-00-00 00:00:00","24859" +"1933","1","Novoa","Peggy","999.99","0","0","20","1","1","1","PC","1","0","0","1762.8","999","0","1933 Novoa","1","0000-00-00 00:00:00","2932" +"3680","1","Pung","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","2327.85","999","0","3680 Pung","1","0000-00-00 00:00:00","2739" +"5471","2","Fortin","Vesta","999.99","0","0","20","1","1","1","PC","1","0","0","4612.19","999","0","5471 Fortin","1","0000-00-00 00:00:00","30886" +"3867","1","Janecek","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","3041.29","999","1","3867 Janecek","1","0000-00-00 00:00:00","2984" +"3693","2","Trousdale","Theda","999.99","0","0","20","1","1","1","PC","1","0","0","318.47","999","1","3693 Trousdale","1","0000-00-00 00:00:00","6231" +"3299","2","Lajeunesse","Marcus","999.99","0","0","20","1","1","1","PC","1","0","0","9285.23","999","0","3299 Lajeunesse","1","0000-00-00 00:00:00","2011" +"628","1","Snodgrass","Tomiko","999.99","0","0","20","1","1","1","PC","1","0","0","2439.53","999","0","628 Snodgrass","1","0000-00-00 00:00:00","4397" +"6148","2","Friesen","Amelia","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","6148 Friesen","1","0000-00-00 00:00:00","26157" +"2368","1","Ducan","Anne","999.99","17.91","0","20","1","1","1","PC","1","0","0","5545.22","999","0","2368 Ducan","1","0000-00-00 00:00:00","2041" +"8409","2","Mcmullin","Eddie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8409 Mcmullin","1","0000-00-00 00:00:00","10032" +"8409","1","Szabo","Brianne","999.99","0","0","20","1","1","1","PC","1","0","0","82.35","999","1","8409 Szabo","1","0000-00-00 00:00:00","6430" +"1876","2","Palmatier","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","263.37","999","1","1876 Palmatier","1","0000-00-00 00:00:00","4491" +"5671","1","Lehrer","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","1593.02","999","1","5671 Lehrer","1","0000-00-00 00:00:00","5326" +"2445","2","Minnix","Joelle","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2445 Minnix","1","0000-00-00 00:00:00","22478" +"8134","2","Birch","Sabina","999.99","0","0","20","1","1","1","PC","1","0","0","790.4","999","1","8134 Birch","1","0000-00-00 00:00:00","25611" +"3661","1","Beltrami","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","4632.34","999","0","3661 Beltrami","1","0000-00-00 00:00:00","326" +"681","2","Starr","Haley","999.99","0","0","20","1","1","1","PC","1","0","0","87.16","999","1","681 Starr","1","0000-00-00 00:00:00","2464" +"3020","1","Hennings","Carola","999.99","0","0","20","1","1","1","PC","1","0","0","2062.16","999","0","3020 Hennings","1","0000-00-00 00:00:00","2884" +"5076","2","Rippey","Rochell","999.99","0","0","20","1","1","1","PC","1","0","0","273.61","999","1","5076 Rippey","1","0000-00-00 00:00:00","6466" +"1750","2","Pennypacker","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","527.88","999","0","1750 Pennypacker","1","0000-00-00 00:00:00","30041" +"7070","1","Somma","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","5227.25","999","0","7070 Somma","1","0000-00-00 00:00:00","4103" +"2737","3","Irwin","Phylicia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2737 Irwin","1","0000-00-00 00:00:00","12018" +"2737","1","Gutman","Jayme","999.99","0","0","20","1","1","1","PC","1","0","0","2669.05","999","0","2737 Gutman","1","0000-00-00 00:00:00","654" +"6057","1","Mcburney","Larissa","999.99","0","0","20","1","1","1","PC","1","0","0","20.24","999","0","6057 Mcburney","1","0000-00-00 00:00:00","565" +"849","2","Havlik","Wanita","999.99","0","0","20","1","0","1","PC","1","0","0","651.71","999","1","849 Havlik","1","0000-00-00 00:00:00","2639" +"9906","2","Simons","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","1499.47","999","0","9906 Simons","1","0000-00-00 00:00:00","6186" +"738","2","Quintero","Lemuel","999.99","0","0","20","1","1","1","PC","1","0","0","3530.17","999","0","738 Quintero","1","0000-00-00 00:00:00","15521" +"1461","2","Blais","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","2791.99","999","0","1461 Blais","1","0000-00-00 00:00:00","4105" +"2914","1","Peer","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","1018.13","999","1","2914 Peer","1","0000-00-00 00:00:00","3143" +"1593","1","Lueck","Monte","999.99","0","0","20","1","1","1","PC","1","0","0","2265.68","999","0","1593 Lueck","1","0000-00-00 00:00:00","126" +"1472","1","Wendland","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","2159.14","999","0","1472 Wendland","1","0000-00-00 00:00:00","434" +"6575","2","Dupuis","Lino","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6575 Dupuis","1","0000-00-00 00:00:00","19017" +"6575","1","Bagg","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","743.4","999","0","6575 Bagg","1","0000-00-00 00:00:00","5754" +"2185","3","Pickell","Harrison","999.99","0","0","20","1","1","1","PC","1","0","0","1025.02","999","0","2185 Pickell","1","0000-00-00 00:00:00","4683" +"2185","2","Rafael","Sharie","999.99","0","0","20","1","1","1","PC","1","0","0","1025.02","999","0","2185 Rafael","1","0000-00-00 00:00:00","2490" +"7228","2","Mcleod","So","999.99","0","0","20","1","0","1","PC","1","0","0","1691.56","999","0","7228 Mcleod","1","0000-00-00 00:00:00","3034" +"5022","3","Tunney","Maurice","999.99","0","0","20","1","1","1","PC","1","0","0","541.04","999","0","5022 Tunney","1","0000-00-00 00:00:00","6541" +"4635","3","Able","Mellie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4635 Able","1","0000-00-00 00:00:00","11789" +"4635","1","Mcpeek","Renna","999.99","0","0","20","1","1","1","PC","1","0","0","2605.88","999","0","4635 Mcpeek","1","0000-00-00 00:00:00","5452" +"5899","2","Parada","Rupert","999.99","0","0","20","1","1","1","PC","1","0","0","1205.07","999","1","5899 Parada","1","0000-00-00 00:00:00","2709" +"3172","1","Tawil","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","3663.16","999","0","3172 Tawil","1","0000-00-00 00:00:00","5568" +"1739","1","Sester","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","2421.68","999","1","1739 Sester","1","0000-00-00 00:00:00","1005" +"6747","2","Montalbo","Josephina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6747 Montalbo","1","0000-00-00 00:00:00","24720" +"9985","2","Aguirre","Verda","999.99","0","0","20","1","1","1","PC","1","0","0","102.68","999","1","9985 Aguirre","1","0000-00-00 00:00:00","6114" +"5473","1","Braley","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","563.8","999","0","5473 Braley","1","0000-00-00 00:00:00","2279" +"5309","1","Matherne","Julene","999.99","0","0","20","1","1","1","PC","1","0","0","187.33","999","1","5309 Matherne","1","0000-00-00 00:00:00","5991" +"8861","1","Silas","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","628.96","999","0","8861 Silas","1","0000-00-00 00:00:00","3228" +"349","2","Tippit","Keturah","999.99","0","0","20","1","1","1","PC","1","0","0","652.69","999","0","349 Tippit","1","0000-00-00 00:00:00","4709" +"6046","2","Gains","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","1575.58","999","0","6046 Gains","1","0000-00-00 00:00:00","19375" +"6046","1","Lane","Hattie","999.99","0","0","20","1","1","1","PC","1","0","0","1575.58","999","0","6046 Lane","1","0000-00-00 00:00:00","4749" +"5194","1","Nowlen","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","1941.39","999","0","5194 Nowlen","1","0000-00-00 00:00:00","5623" +"3660","1","Heinen","Dominick","999.99","0","0","20","1","1","1","PC","1","0","0","1119.74","999","1","3660 Heinen","1","0000-00-00 00:00:00","6020" +"5131","1","Bratten","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","157.63","999","1","5131 Bratten","1","0000-00-00 00:00:00","5970" +"5952","2","Maloof","Carmine","999.99","0","0","20","1","1","1","PC","1","0","0","51.74","999","1","5952 Maloof","1","0000-00-00 00:00:00","3681" +"354","2","Pelaez","Refugio","999.99","0","0","20","1","1","1","PC","1","0","0","140.07","999","1","354 Pelaez","1","0000-00-00 00:00:00","1614" +"5376","1","Pelaez","Wanetta","999.99","0","0","20","1","1","1","PC","1","0","0","1748.47","999","0","5376 Pelaez","1","0000-00-00 00:00:00","2238" +"9114","1","Spohn","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","1086.72","999","0","9114 Spohn","1","0000-00-00 00:00:00","339" +"1232","3","Desanti","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","1876.45","999","0","1232 Desanti","1","0000-00-00 00:00:00","6445" +"1232","2","Godines","Clementine","999.99","0","0","20","1","1","1","PC","1","0","0","1876.45","999","0","1232 Godines","1","0000-00-00 00:00:00","5965" +"3133","1","Poche","Tawna","999.99","0","0","20","1","1","1","PC","1","0","0","300.39","999","1","3133 Poche","1","0000-00-00 00:00:00","2236" +"2287","1","Hodson","Alonzo","999.99","0","0","20","1","1","1","PC","1","0","0","745.21","999","0","2287 Hodson","1","0000-00-00 00:00:00","323" +"2956","2","Metro","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","1798.12","999","0","2956 Metro","1","0000-00-00 00:00:00","21616" +"5354","3","Nichol","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","733.95","999","1","5354 Nichol","1","0000-00-00 00:00:00","4090" +"5354","2","Eury","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","733.95","999","1","5354 Eury","1","0000-00-00 00:00:00","2320" +"2998","3","Marion","Maren","999.99","0","0","20","1","1","1","PC","1","0","0","1264.41","999","0","2998 Marion","1","0000-00-00 00:00:00","31208" +"5702","2","Hornung","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","846.84","999","1","5702 Hornung","1","0000-00-00 00:00:00","5539" +"9043","2","Funderburke","Lemuel","999.99","0","0","20","1","0","1","PC","1","0","0","1437.39","999","0","9043 Funderburke","1","0000-00-00 00:00:00","3789" +"2142","1","Timlin","Augusta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2142 Timlin","1","0000-00-00 00:00:00","204" +"3294","2","Ming","Venus","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3294 Ming","1","0000-00-00 00:00:00","25417" +"4239","2","Tidmore","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","2197.14","999","0","4239 Tidmore","1","0000-00-00 00:00:00","25598" +"5801","2","Defreitas","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","571.07","999","0","5801 Defreitas","1","0000-00-00 00:00:00","24856" +"3800","2","Michaels","Delinda","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3800 Michaels","1","0000-00-00 00:00:00","29519" +"934","2","Maloof","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","245.36","999","1","934 Maloof","1","0000-00-00 00:00:00","25293" +"881","1","Marnell","Marceline","999.99","0","0","20","1","1","1","PC","1","0","0","66.21","999","1","881 Marnell","1","0000-00-00 00:00:00","694" +"1235","2","Parrales","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","399.24","999","0","1235 Parrales","1","0000-00-00 00:00:00","4653" +"5117","2","Penland","Lashon","999.99","0","0","20","1","1","1","PC","1","0","0","1929.66","999","1","5117 Penland","1","0000-00-00 00:00:00","21573" +"2510","2","Ratti","Shanta","999.99","9.91","0","20","1","0","1","PC","1","0","0","405.34","999","0","2510 Ratti","1","0000-00-00 00:00:00","5707" +"1054","1","Eichler","Ezekiel","999.99","0","0","20","1","1","1","PC","1","0","0","2139.99","999","1","1054 Eichler","1","0000-00-00 00:00:00","6159" +"2285","1","Koziel","Eldora","999.99","0","0","20","1","1","1","PC","1","0","0","271.86","999","1","2285 Koziel","1","0000-00-00 00:00:00","3743" +"2877","1","Sherron","Julius","999.99","0","0","20","1","1","1","PC","1","0","0","1508.64","999","0","2877 Sherron","1","0000-00-00 00:00:00","2127" +"5255","1","Ammann","Nathaniel","999.99","0","0","0","0","1","1","INACT","0","0","0","1809.9","999","0","5255 Ammann","1","0000-00-00 00:00:00","2012" +"6303","1","Monsivais","Hoa","999.99","0","0","20","1","1","1","PC","1","0","0","524.26","999","0","6303 Monsivais","1","0000-00-00 00:00:00","585" +"8112","2","Chain","Joaquina","999.99","0","0","20","1","1","1","PC","1","0","0","963.05","999","0","8112 Chain","1","0000-00-00 00:00:00","18557" +"3815","1","Broderson","Luna","999.99","0","0","20","1","1","1","PC","1","0","0","596.3","999","1","3815 Broderson","1","0000-00-00 00:00:00","5208" +"7973","1","Pelchat","Estella","999.99","0","0","20","1","1","1","PC","1","0","0","74.07","999","0","7973 Pelchat","1","0000-00-00 00:00:00","3110" +"3613","2","Delee","Jaime","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3613 Delee","1","0000-00-00 00:00:00","22454" +"594","1","Steffey","Twana","999.99","0","0","20","1","1","1","PC","1","0","0","2744.08","999","0","594 Steffey","1","0000-00-00 00:00:00","3252" +"7126","1","Mcpeek","Dagmar","999.99","0","0","0","0","1","1","TERM","0","0","0","383.67","999","0","7126 Mcpeek","1","0000-00-00 00:00:00","5133" +"5711","2","Stockard","Julene","999.99","0","0","20","1","1","1","PC","1","0","0","2475.4","999","0","5711 Stockard","1","0000-00-00 00:00:00","19736" +"9636","2","Lamp","Jacqui","999.99","0","0","20","1","1","1","PC","1","0","0","1235.78","999","0","9636 Lamp","1","0000-00-00 00:00:00","18513" +"7071","2","Mcmullin","Maurita","999.99","0","0","20","1","1","1","PC","1","0","0","6863.77","999","0","7071 Mcmullin","1","0000-00-00 00:00:00","1437" +"692","2","Bourbeau","Lai","999.99","0","0","20","1","1","1","PC","1","0","0","2154.99","999","0","692 Bourbeau","1","0000-00-00 00:00:00","25249" +"2977","1","Janco","Marry","999.99","0","0","20","1","1","1","PC","1","0","0","639.05","999","1","2977 Janco","1","0000-00-00 00:00:00","5408" +"3601","1","Acklin","Jacquline","999.99","0","0","20","1","1","1","PC","1","0","0","352.26","999","0","3601 Acklin","1","0000-00-00 00:00:00","4228" +"8315","1","Rowell","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","3469.19","999","1","8315 Rowell","1","0000-00-00 00:00:00","4208" +"1714","4","Hickman","Gwenda","999.99","0","0","20","1","1","1","PC","1","0","0","438.11","999","0","1714 Hickman","1","0000-00-00 00:00:00","20165" +"1714","2","Petrarca","Love","999.99","0","0","20","1","1","1","PC","1","0","0","438.11","999","0","1714 Petrarca","1","0000-00-00 00:00:00","20163" +"5529","1","Grothe","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","9019.21","999","0","5529 Grothe","1","0000-00-00 00:00:00","108" +"5963","1","Mitcham","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","819.4","999","0","5963 Mitcham","1","0000-00-00 00:00:00","5110" +"2640","2","Bertucci","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","6135.33","999","0","2640 Bertucci","1","0000-00-00 00:00:00","23054" +"8549","1","Hertzler","Roderick","999.99","0","0","20","1","1","1","PC","1","0","0","458.81","999","0","8549 Hertzler","1","0000-00-00 00:00:00","5422" +"3549","1","Shoe","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","2367.5","999","0","3549 Shoe","1","0000-00-00 00:00:00","6482" +"5340","2","Bohn","Jacqui","999.99","0","0","20","1","1","1","PC","1","0","0","436.25","999","1","5340 Bohn","1","0000-00-00 00:00:00","4615" +"2757","3","Feehan","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","4480.02","999","0","2757 Feehan","1","0000-00-00 00:00:00","28921" +"8365","2","Brantley","Shalanda","999.99","0","0","20","1","0","1","PC","1","0","0","1985","999","1","8365 Brantley","1","0000-00-00 00:00:00","251" +"8365","1","Weimar","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","1985","999","1","8365 Weimar","1","0000-00-00 00:00:00","1738" +"2516","1","Pelham","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","3146.04","999","0","2516 Pelham","1","0000-00-00 00:00:00","1887" +"2986","1","Metro","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","846.68","999","0","2986 Metro","1","0000-00-00 00:00:00","3330" +"1673","2","Getz","Craig","999.99","0","0","20","1","1","1","PC","1","0","0","490.22","999","0","1673 Getz","1","0000-00-00 00:00:00","5828" +"3316","1","Beer","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","1756.92","999","0","3316 Beer","1","0000-00-00 00:00:00","3590" +"6349","1","Snively","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","352.04","999","1","6349 Snively","1","0000-00-00 00:00:00","4258" +"2824","2","Michaels","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","285.64","999","1","2824 Michaels","1","0000-00-00 00:00:00","18201" +"1471","1","Sester","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","1367.63","999","0","1471 Sester","1","0000-00-00 00:00:00","4336" +"8091","2","Mowen","Josefina","999.99","0","0","20","1","1","1","PC","1","0","0","1528.18","999","0","8091 Mowen","1","0000-00-00 00:00:00","24865" +"3622","2","Derose","Rachel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3622 Derose","1","0000-00-00 00:00:00","6586" +"369","2","Poche","Ula","999.99","0","0","20","1","1","1","PC","1","0","0","2340.11","999","0","369 Poche","1","0000-00-00 00:00:00","24622" +"6278","2","Riche","Tobias","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6278 Riche","1","0000-00-00 00:00:00","24840" +"8835","2","Propes","Ramiro","999.99","0","0","20","1","1","1","PC","1","0","0","1323.01","999","0","8835 Propes","1","0000-00-00 00:00:00","31278" +"8835","1","Heintzelman","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","1323.01","999","0","8835 Heintzelman","1","0000-00-00 00:00:00","1428" +"2939","1","Parada","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","529.53","999","0","2939 Parada","1","0000-00-00 00:00:00","2370" +"1367","1","Marnell","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","129.23","999","1","1367 Marnell","1","0000-00-00 00:00:00","1306" +"5680","2","Deshaies","Kenneth","999.99","0","0","20","1","0","1","PC","1","0","0","5021.22","999","0","5680 Deshaies","1","0000-00-00 00:00:00","5081" +"4780","1","Hertzler","Betty","999.99","0","0","20","1","1","1","PC","1","0","0","1314.6","999","0","4780 Hertzler","1","0000-00-00 00:00:00","4037" +"616","2","Minnix","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","1129.61","999","0","616 Minnix","1","0000-00-00 00:00:00","3229" +"3690","1","Rafael","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","2196.42","999","1","3690 Rafael","1","0000-00-00 00:00:00","1244" +"5161","2","Bowens","Venetta","999.99","0","0","20","1","0","1","PC","1","0","0","8092.9","999","0","5161 Bowens","1","0000-00-00 00:00:00","1134" +"923","1","Schweitzer","Larissa","999.99","0","0","0","0","1","1","TERM","0","0","0","3034.77","999","0","923 Schweitzer","1","0000-00-00 00:00:00","3561" +"3253","1","Wynkoop","Phylicia","999.99","0","0","20","1","1","1","PC","1","0","0","3599.91","999","0","3253 Wynkoop","1","0000-00-00 00:00:00","1381" +"572","2","Sachs","Noreen","999.99","0","0","20","1","1","1","PC","1","0","0","700.26","999","0","572 Sachs","1","0000-00-00 00:00:00","5791" +"6875","1","Maravilla","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","353.62","999","0","6875 Maravilla","1","0000-00-00 00:00:00","2594" +"1330","1","Able","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","1167.14","999","0","1330 Able","1","0000-00-00 00:00:00","6125" +"3154","3","Remsen","Page","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3154 Remsen","1","0000-00-00 00:00:00","15448" +"3154","2","Jules","Jamie","999.99","0","0","20","1","0","1","PC","1","0","0","893.54","999","0","3154 Jules","1","0000-00-00 00:00:00","5314" +"1813","2","Creel","Bambi","999.99","0","0","20","1","1","1","PC","1","0","0","264.11","999","1","1813 Creel","1","0000-00-00 00:00:00","3709" +"1696","2","Steven","Chet","999.99","0","0","20","1","1","1","PC","1","0","0","1326.17","999","0","1696 Steven","1","0000-00-00 00:00:00","29117" +"3880","1","Nally","Pricilla","999.99","8.4","0","20","1","1","1","PC","1","0","0","566.19","999","1","3880 Nally","1","0000-00-00 00:00:00","1984" +"5946","1","Vasko","Delaine","999.99","0","0","20","1","1","1","PC","1","0","0","1302.94","999","0","5946 Vasko","1","0000-00-00 00:00:00","5913" +"1541","2","Rudd","Mi","999.99","0","0","20","1","0","1","PC","1","0","0","2296.83","999","0","1541 Rudd","1","0000-00-00 00:00:00","74" +"8435","1","Tardiff","Jarvis","999.99","0","0","20","1","1","1","PC","1","0","0","278.63","999","1","8435 Tardiff","1","0000-00-00 00:00:00","385" +"3480","2","Band","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","120.27","999","0","3480 Band","1","0000-00-00 00:00:00","18808" +"3480","1","Leib","Kenneth","999.99","0","0","20","1","1","1","PC","1","0","0","120.27","999","0","3480 Leib","1","0000-00-00 00:00:00","2772" +"8832","2","Mueller","Reyna","999.99","0","0","20","1","0","1","PC","1","0","0","711.74","999","0","8832 Mueller","1","0000-00-00 00:00:00","4101" +"7858","2","Propes","Sheilah","999.99","0","0","20","1","0","1","PC","1","0","0","564.84","999","1","7858 Propes","1","0000-00-00 00:00:00","6714" +"3727","1","Defreitas","Chet","999.99","0","0","20","1","1","1","PC","1","0","0","2064.03","999","0","3727 Defreitas","1","0000-00-00 00:00:00","3812" +"345","2","Marston","Jayme","999.99","3.06","0","20","1","1","1","PC","1","0","0","1093.46","999","0","345 Marston","1","0000-00-00 00:00:00","5215" +"6880","1","Pattison","Gino","999.99","0","0","20","1","1","1","PC","1","0","0","1778.34","999","0","6880 Pattison","1","0000-00-00 00:00:00","1314" +"122","4","Mcgibbon","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","490.65","999","0","122 Mcgibbon","1","0000-00-00 00:00:00","31474" +"122","2","Parada","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","490.65","999","0","122 Parada","1","0000-00-00 00:00:00","31472" +"8569","1","Maloof","Alvaro","999.99","0","0","20","1","1","1","PC","1","0","0","2015.21","999","0","8569 Maloof","1","0000-00-00 00:00:00","2499" +"5424","1","Baumgart","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","800.23","999","0","5424 Baumgart","1","0000-00-00 00:00:00","5022" +"9156","1","Hamaker","Tim","999.99","0","0","20","1","1","1","PC","1","0","0","466.03","999","0","9156 Hamaker","1","0000-00-00 00:00:00","1302" +"3322","2","Zahn","Alina","999.99","0","0","20","1","0","1","PC","1","0","0","198.84","999","0","3322 Zahn","1","0000-00-00 00:00:00","2590" +"853","1","Murton","Tobie","999.99","0","0","20","1","1","1","PC","1","0","0","91.69","999","1","853 Murton","1","0000-00-00 00:00:00","3003" +"2685","1","Stacy","Quincy","999.99","0","0","20","1","1","1","PC","1","0","0","2367.15","999","0","2685 Stacy","1","0000-00-00 00:00:00","4078" +"8020","2","Dobson","Wanetta","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8020 Dobson","1","0000-00-00 00:00:00","24746" +"3043","3","Feehan","Arlene","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","3043 Feehan","1","0000-00-00 00:00:00","8218" +"889","2","Youssef","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","1273.06","999","1","889 Youssef","1","0000-00-00 00:00:00","25204" +"889","1","Mattia","Lillian","999.99","0","0","20","1","1","1","PC","1","0","0","1273.06","999","1","889 Mattia","1","0000-00-00 00:00:00","1685" +"9720","2","Vroman","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","157.83","999","1","9720 Vroman","1","0000-00-00 00:00:00","5678" +"5304","1","Caraballo","Joslyn","999.99","0","0","20","1","1","1","PC","1","0","0","736.58","999","1","5304 Caraballo","1","0000-00-00 00:00:00","574" +"9125","1","Flinchum","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","2606.79","999","0","9125 Flinchum","1","0000-00-00 00:00:00","3490" +"3925","1","Steven","Ramiro","999.99","0","0","20","1","1","1","PC","1","0","0","403.06","999","0","3925 Steven","1","0000-00-00 00:00:00","1239" +"806","2","Hassinger","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","488.01","999","0","806 Hassinger","1","0000-00-00 00:00:00","1493" +"1250","1","Debonis","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","405.07","999","1","1250 Debonis","1","0000-00-00 00:00:00","3462" +"9591","2","Gerst","Tawna","999.99","0","0","20","1","1","1","PC","1","0","0","1499.81","999","0","9591 Gerst","1","0000-00-00 00:00:00","715" +"3142","1","Pickell","Queen","999.99","0","0","20","1","1","1","PC","1","0","0","995.72","999","1","3142 Pickell","1","0000-00-00 00:00:00","6670" +"5926","1","Eidt","Mariann","999.99","0","0","20","1","1","1","PC","1","0","0","2097.3","999","0","5926 Eidt","1","0000-00-00 00:00:00","4990" +"5826","2","Mcmullin","Maren","999.99","0","0","20","1","0","1","PC","1","0","0","1137.21","999","0","5826 Mcmullin","1","0000-00-00 00:00:00","519" +"8001","1","Trafton","Archie","999.99","0","0","20","1","1","1","PC","1","0","0","4585.1","999","1","8001 Trafton","1","0000-00-00 00:00:00","196" +"5217","3","Anding","Felicidad","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5217 Anding","1","0000-00-00 00:00:00","14069" +"5217","1","Sherron","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","901.86","999","0","5217 Sherron","1","0000-00-00 00:00:00","612" +"3705","2","Bryce","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","817.75","999","1","3705 Bryce","1","0000-00-00 00:00:00","3054" +"234","1","Starr","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","586.24","999","1","234 Starr","1","0000-00-00 00:00:00","6262" +"234","2","Wynkoop","Germaine","999.99","0","0","20","1","0","1","PC","1","0","0","586.24","999","1","234 Wynkoop","1","0000-00-00 00:00:00","4187" +"3453","1","Salvo","Georgia","999.99","0","0","20","1","1","1","PC","1","0","0","792.18","999","1","3453 Salvo","1","0000-00-00 00:00:00","4299" +"924","1","Penland","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","615.31","999","0","924 Penland","1","0000-00-00 00:00:00","1173" +"1729","2","Weimar","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","1362.64","999","0","1729 Weimar","1","0000-00-00 00:00:00","3263" +"9033","2","Brabant","Marc","999.99","0","0","20","1","0","1","PC","1","0","0","70.35","999","0","9033 Brabant","1","0000-00-00 00:00:00","5467" +"1364","2","Novoa","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","518.88","999","1","1364 Novoa","1","0000-00-00 00:00:00","6270" +"5911","2","Zweifel","Lakeesha","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5911 Zweifel","1","0000-00-00 00:00:00","21086" +"7979","3","Heise","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","1724.38","999","0","7979 Heise","1","0000-00-00 00:00:00","387" +"7979","2","Dealba","Theron","999.99","0","0","20","1","1","1","PC","1","0","0","1724.38","999","0","7979 Dealba","1","0000-00-00 00:00:00","1307" +"4003","3","Aviles","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","3591.07","999","0","4003 Aviles","1","0000-00-00 00:00:00","24533" +"3576","2","Carolan","Lovetta","999.99","0","0","20","1","0","1","PC","1","0","0","1056.12","999","0","3576 Carolan","1","0000-00-00 00:00:00","6364" +"5776","1","Starr","Julius","999.99","0","0","20","1","1","1","PC","1","0","0","4335.99","999","0","5776 Starr","1","0000-00-00 00:00:00","5786" +"9259","2","Giraldo","Glinda","999.99","0","0","20","1","0","1","PC","1","0","0","488.89","999","0","9259 Giraldo","1","0000-00-00 00:00:00","5585" +"5747","2","Zaccaria","Lane","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5747 Zaccaria","1","0000-00-00 00:00:00","8372" +"185","1","Propes","Brianne","999.99","0","0","20","1","1","1","PC","1","0","0","1479.31","999","1","185 Propes","1","0000-00-00 00:00:00","5777" +"5189","1","Olaughlin","Argentina","999.99","0","0","20","1","1","1","PC","1","0","0","168.69","999","1","5189 Olaughlin","1","0000-00-00 00:00:00","433" +"1914","2","Owen","Shizuko","999.99","0","0","20","1","1","1","PC","1","0","0","696.46","999","1","1914 Owen","1","0000-00-00 00:00:00","4813" +"8665","1","Mcburney","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","123.9","999","1","8665 Mcburney","1","0000-00-00 00:00:00","6336" +"3277","2","Esterly","Apolonia","999.99","0","0","20","1","1","1","PC","1","0","0","1129.76","999","0","3277 Esterly","1","0000-00-00 00:00:00","457" +"8274","4","Abrahams","Royce","999.99","0","0","20","1","0","1","PC","1","1","0","937.11","999","0","8274 Abrahams","1","0000-00-00 00:00:00","3730" +"8274","3","Zweifel","Anamaria","999.99","0","0","20","1","0","1","PC","1","1","0","937.11","999","0","8274 Zweifel","1","0000-00-00 00:00:00","1486" +"3433","2","Godines","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","802.89","999","0","3433 Godines","1","0000-00-00 00:00:00","30784" +"3433","3","Hardage","Francoise","999.99","0","0","20","1","1","1","PC","1","0","0","802.89","999","0","3433 Hardage","1","0000-00-00 00:00:00","30785" +"5692","2","Irwin","Dennise","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5692 Irwin","1","0000-00-00 00:00:00","30248" +"1604","3","Oquendo","Noelle","999.99","0","0","20","1","1","1","PC","1","0","0","1566.92","999","0","1604 Oquendo","1","0000-00-00 00:00:00","19192" +"1604","2","Faber","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","1566.92","999","0","1604 Faber","1","0000-00-00 00:00:00","19191" +"238","1","Keppler","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","726.02","999","0","238 Keppler","1","0000-00-00 00:00:00","3012" +"5168","1","Roten","Deidra","999.99","0","0","20","1","1","1","PC","1","0","0","450.68","999","1","5168 Roten","1","0000-00-00 00:00:00","5883" +"1916","1","Coache","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","251.65","999","0","1916 Coache","1","0000-00-00 00:00:00","5463" +"3912","1","Stecklein","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","2308.22","999","0","3912 Stecklein","1","0000-00-00 00:00:00","1131" +"9639","2","Vizcarra","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","250.45","999","1","9639 Vizcarra","1","0000-00-00 00:00:00","4192" +"2337","1","Lanier","Marketta","999.99","0","0","20","1","1","1","PC","1","0","0","269.06","999","1","2337 Lanier","1","0000-00-00 00:00:00","3297" +"2337","4","Brundige","Gino","999.99","0","0","20","1","1","1","PC","1","0","0","269.06","999","1","2337 Brundige","1","0000-00-00 00:00:00","1200" +"8900","1","Stecklein","Mica","999.99","0","0","20","1","1","1","PC","1","0","0","986.18","999","0","8900 Stecklein","1","0000-00-00 00:00:00","3474" +"9084","2","Winchell","Felicitas","999.99","0","0","20","1","1","1","PC","1","0","0","469.79","999","0","9084 Winchell","1","0000-00-00 00:00:00","17459" +"9551","2","Parisien","Roderick","999.99","0","0","20","1","1","1","PC","1","0","0","264.78","999","0","9551 Parisien","1","0000-00-00 00:00:00","5189" +"4276","2","Schmucker","Iona","999.99","0","0","20","1","0","1","PC","1","0","0","525.87","999","1","4276 Schmucker","1","0000-00-00 00:00:00","1483" +"3826","1","Hankerson","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","987.13","999","0","3826 Hankerson","1","0000-00-00 00:00:00","5436" +"3126","1","Pung","Veronica","999.99","0","0","20","1","1","1","PC","1","0","0","161.89","999","0","3126 Pung","1","0000-00-00 00:00:00","818" +"2534","2","Alexandra","Jamaal","999.99","0","0","20","1","1","1","PC","1","0","0","1420.23","999","0","2534 Alexandra","1","0000-00-00 00:00:00","19180" +"1029","2","Hafley","Chrystal","999.99","0","0","20","1","0","1","PC","1","0","0","2559.02","999","0","1029 Hafley","1","0000-00-00 00:00:00","1452" +"7850","1","Timlin","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","1042.55","999","0","7850 Timlin","1","0000-00-00 00:00:00","5475" +"7702","2","Worthey","Argentina","999.99","0","0","20","1","0","1","PC","1","0","0","739.91","999","0","7702 Worthey","1","0000-00-00 00:00:00","2363" +"5723","2","Gory","Gwyneth","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5723 Gory","1","0000-00-00 00:00:00","26747" +"595","1","Tippit","Melvina","999.99","0","0","20","1","1","1","PC","1","0","0","338.96","999","1","595 Tippit","1","0000-00-00 00:00:00","1330" +"284","2","Maheux","Tegan","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","284 Maheux","1","0000-00-00 00:00:00","21471" +"6069","2","Prichett","Gino","999.99","0","0","20","1","1","1","PC","1","0","0","1022.16","999","0","6069 Prichett","1","0000-00-00 00:00:00","5785" +"5719","2","Bicknell","Fritz","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5719 Bicknell","1","0000-00-00 00:00:00","25515" +"7949","1","Hassinger","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","432.68","999","0","7949 Hassinger","1","0000-00-00 00:00:00","5512" +"6346","3","Titsworth","Juliane","999.99","0","0","20","1","1","1","PC","1","0","0","1029.08","999","0","6346 Titsworth","1","0000-00-00 00:00:00","24383" +"3840","2","Laura","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","1004.48","999","0","3840 Laura","1","0000-00-00 00:00:00","15872" +"1197","1","Vanwagenen","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","728.55","999","0","1197 Vanwagenen","1","0000-00-00 00:00:00","4510" +"3225","2","Lane","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","566.82","999","1","3225 Lane","1","0000-00-00 00:00:00","1413" +"4322","2","Hellmann","Shizuko","999.99","0","0","20","1","1","1","PC","1","0","0","562.17","999","1","4322 Hellmann","1","0000-00-00 00:00:00","23025" +"8305","1","Mcmullin","Svetlana","999.99","0","0","20","1","1","1","PC","1","0","0","322.93","999","1","8305 Mcmullin","1","0000-00-00 00:00:00","2956" +"4409","1","Maloof","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","710.42","999","0","4409 Maloof","1","0000-00-00 00:00:00","3423" +"1168","2","Heintzelman","Josefina","999.99","0","0","20","1","1","1","PC","1","0","0","1087.08","999","0","1168 Heintzelman","1","0000-00-00 00:00:00","22770" +"2113","3","Daquila","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","495.56","999","1","2113 Daquila","1","0000-00-00 00:00:00","15850" +"2113","1","Paull","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","495.56","999","1","2113 Paull","1","0000-00-00 00:00:00","4231" +"2281","1","Deshaies","Cherilyn","999.99","0","0","20","1","1","1","PC","1","0","0","114.72","999","0","2281 Deshaies","1","0000-00-00 00:00:00","3595" +"8845","1","Labree","Darius","999.99","0","0","20","1","1","1","PC","1","0","0","288.35","999","0","8845 Labree","1","0000-00-00 00:00:00","3265" +"2604","1","Mueller","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","787.99","999","0","2604 Mueller","1","0000-00-00 00:00:00","716" +"2568","2","Hafford","Gaylord","999.99","0","0","20","1","0","1","PC","1","0","0","336.3","999","0","2568 Hafford","1","0000-00-00 00:00:00","3168" +"2630","2","Olaughlin","Lang","999.99","0","0","20","1","0","1","PC","1","0","0","420.08","999","1","2630 Olaughlin","1","0000-00-00 00:00:00","2974" +"2630","3","Chaves","Archie","999.99","0","0","20","1","0","1","PC","1","0","0","420.08","999","1","2630 Chaves","1","0000-00-00 00:00:00","1378" +"9671","3","Sledge","Johnsie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9671 Sledge","1","0000-00-00 00:00:00","15228" +"8698","1","Conger","Williemae","999.99","0","0","20","1","1","1","PC","1","0","0","145.76","999","1","8698 Conger","1","0000-00-00 00:00:00","78" +"9382","1","Mattia","Hattie","999.99","0","0","20","1","1","1","PC","1","0","0","551.33","999","0","9382 Mattia","1","0000-00-00 00:00:00","4149" +"4320","1","Atwell","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","1704.77","999","0","4320 Atwell","1","0000-00-00 00:00:00","3045" +"2935","1","Nowland","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","1066.04","999","0","2935 Nowland","1","0000-00-00 00:00:00","5162" +"1557","1","Bakley","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","199.83","999","0","1557 Bakley","1","0000-00-00 00:00:00","5068" +"7257","1","Mcpeek","Love","999.99","0","0","20","1","1","1","PC","1","0","0","4016.3","999","0","7257 Mcpeek","1","0000-00-00 00:00:00","1793" +"3011","1","Hertzler","Freddy","999.99","0","0","20","1","1","1","PC","1","0","0","69.86","999","1","3011 Hertzler","1","0000-00-00 00:00:00","4088" +"1318","1","Gory","Linnea","999.99","0","0","20","1","1","1","PC","1","0","0","240.8","999","1","1318 Gory","1","0000-00-00 00:00:00","1877" +"8775","1","Swarey","Gwenda","999.99","0","0","20","1","1","1","PC","1","0","0","331.23","999","0","8775 Swarey","1","0000-00-00 00:00:00","4297" +"7443","1","Szabo","Mi","999.99","0","0","20","1","1","1","PC","1","0","0","170.54","999","1","7443 Szabo","1","0000-00-00 00:00:00","2867" +"9682","2","Friesen","Summer","999.99","0","0","20","1","0","1","PC","1","0","0","289.35","999","1","9682 Friesen","1","0000-00-00 00:00:00","2937" +"5537","1","James","Tim","999.99","0","0","20","1","1","1","PC","1","0","0","300.34","999","1","5537 James","1","0000-00-00 00:00:00","4339" +"859","1","Eidt","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","542.6","999","0","859 Eidt","1","0000-00-00 00:00:00","2621" +"9071","2","Leib","Ulrike","999.99","0","0","20","1","1","1","PC","1","0","0","120.18","999","1","9071 Leib","1","0000-00-00 00:00:00","22771" +"3488","3","Hults","Chrystal","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3488 Hults","1","0000-00-00 00:00:00","27292" +"3488","1","Perro","Verda","999.99","0","0","20","1","1","1","PC","1","0","0","690.11","999","0","3488 Perro","1","0000-00-00 00:00:00","3846" +"8920","2","Zweifel","Bambi","999.99","0","0","20","1","1","1","PC","1","0","0","975.53","999","0","8920 Zweifel","1","0000-00-00 00:00:00","5726" +"8920","3","Barefield","Apolonia","999.99","0","0","20","1","1","1","PC","1","0","0","975.53","999","0","8920 Barefield","1","0000-00-00 00:00:00","5934" +"6507","1","Beer","Nell","999.99","0","0","0","0","1","1","TERM","0","0","0","1042.63","999","0","6507 Beer","1","0000-00-00 00:00:00","6743" +"5875","1","Reamer","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","823.98","999","0","5875 Reamer","1","0000-00-00 00:00:00","4256" +"7252","1","Marion","Vesta","999.99","0","0","20","1","1","1","PC","1","0","0","385.16","999","0","7252 Marion","1","0000-00-00 00:00:00","5621" +"8809","1","Paradiso","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","112.78","999","1","8809 Paradiso","1","0000-00-00 00:00:00","1832" +"1302","1","Eoff","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","166.88","999","0","1302 Eoff","1","0000-00-00 00:00:00","6516" +"3506","2","Lehrer","Deon","999.99","0","0","20","1","0","1","PC","1","0","0","472.73","999","0","3506 Lehrer","1","0000-00-00 00:00:00","440" +"3506","3","Sunderland","Marry","999.99","0","0","20","1","0","1","PC","1","0","0","472.73","999","0","3506 Sunderland","1","0000-00-00 00:00:00","1234" +"9026","2","Rothman","Ines","999.99","0","0","20","1","1","1","PC","1","0","0","394.43","999","0","9026 Rothman","1","0000-00-00 00:00:00","29674" +"9026","3","Clatterbuck","Renato","999.99","0","0","20","1","1","1","PC","1","0","0","394.43","999","0","9026 Clatterbuck","1","0000-00-00 00:00:00","29675" +"5667","2","Settles","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","571.2","999","0","5667 Settles","1","0000-00-00 00:00:00","31602" +"5477","2","Mickey","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","457.36","999","0","5477 Mickey","1","0000-00-00 00:00:00","5158" +"9035","3","Arias","Kam","999.99","0","0","20","1","1","1","PC","1","0","0","1991.89","999","0","9035 Arias","1","0000-00-00 00:00:00","5200" +"9035","4","Lane","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","1991.89","999","0","9035 Lane","1","0000-00-00 00:00:00","2461" +"4088","2","Haggerty","Marcus","999.99","0","0","20","1","0","1","PC","1","0","0","1028.49","999","1","4088 Haggerty","1","0000-00-00 00:00:00","3188" +"2054","2","Harsh","Lashon","999.99","0","0","20","1","0","1","PC","1","0","0","51.21","999","0","2054 Harsh","1","0000-00-00 00:00:00","5320" +"5570","1","Calo","Mica","999.99","0","0","20","1","1","1","PC","1","0","0","220.02","999","1","5570 Calo","1","0000-00-00 00:00:00","183" +"6969","2","Carolan","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","610.23","999","1","6969 Carolan","1","0000-00-00 00:00:00","22758" +"513","1","Bilbo","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","445.02","999","1","513 Bilbo","1","0000-00-00 00:00:00","5565" +"2079","1","Lajeunesse","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","224.47","999","1","2079 Lajeunesse","1","0000-00-00 00:00:00","4362" +"2845","1","Sester","Claudette","999.99","0","0","20","1","1","1","PC","1","0","0","114.5","999","1","2845 Sester","1","0000-00-00 00:00:00","2382" +"6576","2","Brantley","Marc","999.99","0","0","20","1","1","1","PC","1","0","0","322.24","999","1","6576 Brantley","1","0000-00-00 00:00:00","3838" +"748","2","Plouffe","Ethan","999.99","0","0","20","1","0","1","PC","1","0","0","730.29","999","0","748 Plouffe","1","0000-00-00 00:00:00","3006" +"748","1","Stacy","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","730.29","999","0","748 Stacy","1","0000-00-00 00:00:00","1151" +"1050","2","Kirst","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","433.16","999","1","1050 Kirst","1","0000-00-00 00:00:00","20930" +"3839","2","Baumgart","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","222.09","999","1","3839 Baumgart","1","0000-00-00 00:00:00","19200" +"3839","1","Alsobrook","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","222.09","999","1","3839 Alsobrook","1","0000-00-00 00:00:00","534" +"2427","2","Glassman","Leopoldo","999.99","0","0","20","1","0","1","PC","1","0","0","98.47","999","0","2427 Glassman","1","0000-00-00 00:00:00","90" +"7056","2","Ellis","Sherice","999.99","0","0","20","1","1","1","PC","1","0","0","205.59","999","0","7056 Ellis","1","0000-00-00 00:00:00","20090" +"2689","2","Liu","Claudette","999.99","0","0","20","1","1","1","PC","1","0","0","56.57","999","0","2689 Liu","1","0000-00-00 00:00:00","24026" +"4767","1","Goldsborough","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","217.76","999","1","4767 Goldsborough","1","0000-00-00 00:00:00","2450" +"5075","1","Trousdale","Rossana","999.99","0","0","20","1","1","1","PC","1","0","0","276.36","999","0","5075 Trousdale","1","0000-00-00 00:00:00","4740" +"1514","4","Swarey","Maria","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1514 Swarey","1","0000-00-00 00:00:00","14129" +"1514","2","Balzer","Pricilla","999.99","0","0","20","1","0","1","PC","1","0","0","884.17","999","1","1514 Balzer","1","0000-00-00 00:00:00","1617" +"6730","2","Hagaman","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","211.61","999","0","6730 Hagaman","1","0000-00-00 00:00:00","28607" +"8754","2","Simkins","Carola","999.99","0","0","20","1","0","1","PC","1","0","0","106.27","999","1","8754 Simkins","1","0000-00-00 00:00:00","6323" +"9502","2","Kouba","Jared","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","9502 Kouba","1","0000-00-00 00:00:00","17994" +"3335","2","Darner","Celia","999.99","0","0","20","1","0","1","PC","1","0","0","176.54","999","0","3335 Darner","1","0000-00-00 00:00:00","5569" +"8063","2","Shoe","Van","999.99","0","0","20","1","0","1","PC","1","0","0","56.53","999","0","8063 Shoe","1","0000-00-00 00:00:00","507" +"4647","3","Severe","Liana","999.99","0","0","20","1","1","1","PC","1","0","0","297.16","999","0","4647 Severe","1","0000-00-00 00:00:00","30583" +"4647","1","Giffen","Octavia","999.99","0","0","20","1","1","1","PC","1","0","0","297.16","999","0","4647 Giffen","1","0000-00-00 00:00:00","5809" +"5586","1","Howze","Felicidad","999.99","0","0","20","1","1","1","PC","1","0","0","83.86","999","1","5586 Howze","1","0000-00-00 00:00:00","4605" +"1903","1","Darwin","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","361.73","999","0","1903 Darwin","1","0000-00-00 00:00:00","5373" +"8995","1","Hornung","Dianna","999.99","0","0","0","0","1","1","TERM","0","0","0","1054.53","999","0","8995 Hornung","1","0000-00-00 00:00:00","5334" +"5636","1","Vasko","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","776.04","999","1","5636 Vasko","1","0000-00-00 00:00:00","2809" +"4461","1","Tyra","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","180.68","999","1","4461 Tyra","1","0000-00-00 00:00:00","2873" +"2755","3","Frith","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","146.42","999","1","2755 Frith","1","0000-00-00 00:00:00","22359" +"1518","2","Michel","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","224.73","999","0","1518 Michel","1","0000-00-00 00:00:00","18811" +"5443","2","Bouknight","Jacquelin","999.99","0","0","20","1","1","1","PC","1","0","0","157.62","999","0","5443 Bouknight","1","0000-00-00 00:00:00","21341" +"2904","1","Layman","Letisha","999.99","0","0","0","1","1","1","INACT","0","0","0","591.96","999","0","2904 Layman","1","0000-00-00 00:00:00","2185" +"211","1","Villagran","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","413.39","999","1","211 Villagran","1","0000-00-00 00:00:00","148" +"211","4","Tramble","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","413.39","999","1","211 Tramble","1","0000-00-00 00:00:00","775" +"4710","3","Woodfin","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","614.51","999","0","4710 Woodfin","1","0000-00-00 00:00:00","21730" +"4710","2","Band","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","614.51","999","0","4710 Band","1","0000-00-00 00:00:00","21729" +"6335","1","Beaulieu","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","50.51","999","0","6335 Beaulieu","1","0000-00-00 00:00:00","2847" +"480","1","Parisien","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","100.01","999","1","480 Parisien","1","0000-00-00 00:00:00","5844" +"6125","1","Stump","Joette","999.99","0","0","20","1","1","1","PC","1","0","0","29.99","999","1","6125 Stump","1","0000-00-00 00:00:00","2759" +"5058","3","Czaja","Kirstin","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5058 Czaja","1","0000-00-00 00:00:00","29354" +"3633","1","Liebsch","Renato","999.99","0","0","20","1","1","1","PC","1","0","0","264.04","999","0","3633 Liebsch","1","0000-00-00 00:00:00","4770" +"3633","2","Braley","Lise","999.99","0","0","20","1","0","1","PC","1","0","0","264.04","999","0","3633 Braley","1","0000-00-00 00:00:00","2800" +"787","1","Sitzman","Estella","999.99","0","0","20","1","1","1","PC","1","0","0","252.15","999","0","787 Sitzman","1","0000-00-00 00:00:00","1326" +"3599","1","Derose","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","475.4","999","0","3599 Derose","1","0000-00-00 00:00:00","1505" +"8419","1","Pillai","Iona","999.99","0","0","20","1","1","1","PC","1","0","0","49.98","999","1","8419 Pillai","1","0000-00-00 00:00:00","2429" +"5766","1","Manzo","Sherice","999.99","0","0","20","1","1","1","PC","1","0","0","89.28","999","0","5766 Manzo","1","0000-00-00 00:00:00","357" +"3834","1","Glassman","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","160.56","999","1","3834 Glassman","1","0000-00-00 00:00:00","3977" +"1991","1","Pennypacker","Tanya","999.99","0","0","20","1","1","1","PC","1","0","0","99.05","999","1","1991 Pennypacker","1","0000-00-00 00:00:00","1203" +"7434","2","Peltier","Nicole","999.99","0","0","20","1","0","1","PC","1","0","0","234.14","999","0","7434 Peltier","1","0000-00-00 00:00:00","5893" +"5257","2","Beltrami","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","211.8","999","0","5257 Beltrami","1","0000-00-00 00:00:00","24786" +"9368","1","Heise","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","251.83","999","0","9368 Heise","1","0000-00-00 00:00:00","1064" +"101","2","Ammann","Jodie","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","101 Ammann","1","0000-00-00 00:00:00","24615" +"4890","1","Nevin","Maurice","999.99","0","0","20","1","1","1","PC","1","0","0","49.92","999","0","4890 Nevin","1","0000-00-00 00:00:00","3435" +"3271","1","Moses","Mandy","999.99","20.72","12","100","1","1","1","PC","3","1","0","54.22","999","0","3271 Moses","1","0000-00-00 00:00:00","3105" +"3400","2","Wild","Dominick","999.99","0","0","20","1","0","1","PC","1","0","0","352.95","999","0","3400 Wild","1","0000-00-00 00:00:00","5687" +"5654","2","Darwin","Celia","999.99","0","0","20","1","0","1","PC","1","0","0","75.56","999","0","5654 Darwin","1","0000-00-00 00:00:00","4055" +"7573","2","Eisenhower","Theda","999.99","0","0","20","1","1","1","PC","1","0","0","283.17","999","0","7573 Eisenhower","1","0000-00-00 00:00:00","16271" +"1420","4","Stockard","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","127.95","999","0","1420 Stockard","1","0000-00-00 00:00:00","26269" +"1420","3","Schreiner","Bambi","999.99","0","0","20","1","1","1","PC","1","0","0","127.95","999","0","1420 Schreiner","1","0000-00-00 00:00:00","26268" +"2965","2","Hakala","Carmine","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2965 Hakala","1","0000-00-00 00:00:00","26889" +"3066","1","Wachowiak","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","54.31","999","1","3066 Wachowiak","1","0000-00-00 00:00:00","5006" +"8269","3","Goldsborough","Ula","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8269 Goldsborough","1","0000-00-00 00:00:00","12778" +"8269","2","Soderberg","Barbera","999.99","0","0","20","1","0","1","PC","1","0","0","163.13","999","0","8269 Soderberg","1","0000-00-00 00:00:00","2010" +"2332","2","Rudd","Rupert","999.99","0","0","20","1","0","1","PC","1","0","0","225.77","999","1","2332 Rudd","1","0000-00-00 00:00:00","6171" +"5988","2","Reamer","Tomiko","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5988 Reamer","1","0000-00-00 00:00:00","19527" +"5988","1","Spohn","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","54.86","999","0","5988 Spohn","1","0000-00-00 00:00:00","1942" +"3168","1","Caraballo","Desire","999.99","0","0","20","1","1","1","PC","1","0","0","167.82","999","1","3168 Caraballo","1","0000-00-00 00:00:00","3198" +"5240","1","Trafton","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","173.19","999","0","5240 Trafton","1","0000-00-00 00:00:00","4074" +"1135","1","Sledge","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","32.31","999","1","1135 Sledge","1","0000-00-00 00:00:00","99" +"1135","3","Feehan","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","32.31","999","1","1135 Feehan","1","0000-00-00 00:00:00","24492" +"4891","1","Glassman","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","24.32","999","1","4891 Glassman","1","0000-00-00 00:00:00","6471" +"209","2","Giffen","Lillian","999.99","0","0","20","1","1","1","PC","1","0","0","144.69","999","0","209 Giffen","1","0000-00-00 00:00:00","1110" +"4535","1","Heinen","Marylou","999.99","0","0","20","1","1","1","PC","1","0","0","19.08","999","1","4535 Heinen","1","0000-00-00 00:00:00","5608" +"6347","3","Caraballo","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","70.38","999","1","6347 Caraballo","1","0000-00-00 00:00:00","5556" +"6347","1","Baumgart","Mi","999.99","0","0","20","1","1","1","PC","1","0","0","70.38","999","1","6347 Baumgart","1","0000-00-00 00:00:00","3688" +"6579","2","Delvalle","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","39.16","999","0","6579 Delvalle","1","0000-00-00 00:00:00","1766" +"2011","2","Daquila","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","28.33","999","0","2011 Daquila","1","0000-00-00 00:00:00","30882" +"5187","2","Manganaro","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","70.78","999","0","5187 Manganaro","1","0000-00-00 00:00:00","2451" +"5773","1","Janecek","Aide","999.99","0","0","20","1","1","1","PC","1","0","0","46.84","999","0","5773 Janecek","1","0000-00-00 00:00:00","4275" +"7192","2","Eidt","Winona","999.99","0","0","20","1","0","1","PC","1","0","0","24.62","999","0","7192 Eidt","1","0000-00-00 00:00:00","10922" +"7192","3","Manzo","Rosalva","999.99","0","0","20","1","0","1","PC","1","0","0","24.62","999","0","7192 Manzo","1","0000-00-00 00:00:00","8353" +"2713","1","Guidi","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","9.37","999","0","2713 Guidi","1","0000-00-00 00:00:00","6212" +"3869","1","Knudsen","Claudette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3869 Knudsen","1","0000-00-00 00:00:00","4313" +"5778","2","Grahn","Rachel","999.99","18.53","0","20","1","1","1","PC","1","0","0","3755.61","999","0","5778 Grahn","1","0000-00-00 00:00:00","3456" +"2140","1","Sugarman","Angelita","999.99","4.56","0","20","1","1","1","PC","1","0","0","0","999","1","2140 Sugarman","1","0000-00-00 00:00:00","1020" +"6815","1","Strother","Humberto","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6815 Strother","1","0000-00-00 00:00:00","945" +"8109","1","Nevin","Joelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8109 Nevin","1","0000-00-00 00:00:00","396" +"742","1","Callejas","Kortney","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","742 Callejas","1","0000-00-00 00:00:00","552" +"1297","1","Mowen","Selina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1297 Mowen","1","0000-00-00 00:00:00","523" +"5321","2","Snively","So","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5321 Snively","1","0000-00-00 00:00:00","887" +"3324","2","Szewczyk","Letisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3324 Szewczyk","1","0000-00-00 00:00:00","28635" +"5334","2","Biery","Jodie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5334 Biery","1","0000-00-00 00:00:00","22872" +"3721","2","Youssef","Gwenda","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3721 Youssef","1","0000-00-00 00:00:00","840" +"2064","1","Bickle","Elvera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2064 Bickle","1","0000-00-00 00:00:00","442" +"5748","1","Tyra","Corrinne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5748 Tyra","1","0000-00-00 00:00:00","493" +"2696","1","Hamaker","Keturah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2696 Hamaker","1","0000-00-00 00:00:00","1229" +"3858","1","Shryock","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3858 Shryock","1","0000-00-00 00:00:00","95" +"9619","3","Aguirre","Jule","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9619 Aguirre","1","0000-00-00 00:00:00","12686" +"9619","4","Milian","Lilia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9619 Milian","1","0000-00-00 00:00:00","12687" +"3939","2","Acklin","Amada","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3939 Acklin","1","0000-00-00 00:00:00","12946" +"4552","1","Clatterbuck","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4552 Clatterbuck","1","0000-00-00 00:00:00","4803" +"4552","3","Remsen","Noelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4552 Remsen","1","0000-00-00 00:00:00","29099" +"1520","1","Szabo","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1520 Szabo","1","0000-00-00 00:00:00","5427" +"9095","1","Narcisse","Dagmar","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9095 Narcisse","1","0000-00-00 00:00:00","6340" +"7687","2","Bilbo","Shalanda","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7687 Bilbo","1","0000-00-00 00:00:00","25215" +"7687","3","Sweigart","Dominick","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7687 Sweigart","1","0000-00-00 00:00:00","25216" +"7447","2","Raske","Leola","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","7447 Raske","1","0000-00-00 00:00:00","623" +"4804","1","Hults","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4804 Hults","1","0000-00-00 00:00:00","2430" +"7500","1","Finke","Letisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7500 Finke","1","0000-00-00 00:00:00","738" +"8323","1","Szewczyk","Melonie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8323 Szewczyk","1","0000-00-00 00:00:00","107" +"6517","2","Harrod","Joslyn","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","6517 Harrod","1","0000-00-00 00:00:00","44" +"6631","1","Means","Owen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6631 Means","1","0000-00-00 00:00:00","435" +"1606","2","Heise","Ray","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1606 Heise","1","0000-00-00 00:00:00","19001" +"1606","3","Coache","Verdell","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1606 Coache","1","0000-00-00 00:00:00","19002" +"979","2","Weishaar","Phylicia","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","979 Weishaar","1","0000-00-00 00:00:00","675" +"1588","1","Bertucci","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1588 Bertucci","1","0000-00-00 00:00:00","6062" +"8829","1","Heller","Love","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8829 Heller","1","0000-00-00 00:00:00","68" +"4172","2","Eury","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4172 Eury","1","0000-00-00 00:00:00","18287" +"3160","1","Balzer","Earleen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3160 Balzer","1","0000-00-00 00:00:00","407" +"300","1","Tardiff","Lakeesha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","300 Tardiff","1","0000-00-00 00:00:00","6127" +"7489","2","Propes","Rozella","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","7489 Propes","1","0000-00-00 00:00:00","4381" +"453","1","Haar","Jule","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","453 Haar","1","0000-00-00 00:00:00","5286" +"2962","3","Cutchin","Hermine","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","2962 Cutchin","1","0000-00-00 00:00:00","5221" +"3447","3","Nall","Octavia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3447 Nall","1","0000-00-00 00:00:00","20483" +"3447","1","Medley","Rachel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3447 Medley","1","0000-00-00 00:00:00","4874" +"4941","2","Goggans","Davida","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4941 Goggans","1","0000-00-00 00:00:00","19174" +"4965","3","Manganaro","Selina","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4965 Manganaro","1","0000-00-00 00:00:00","12586" +"4965","1","Pennypacker","Tim","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4965 Pennypacker","1","0000-00-00 00:00:00","544" +"1573","2","Bowens","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1573 Bowens","1","0000-00-00 00:00:00","24269" +"1573","1","Srour","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1573 Srour","1","0000-00-00 00:00:00","1596" +"1922","1","Ecton","Angelina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1922 Ecton","1","0000-00-00 00:00:00","4873" +"2428","1","Harpole","Joelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2428 Harpole","1","0000-00-00 00:00:00","5287" +"8586","2","Maestas","Larissa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8586 Maestas","1","0000-00-00 00:00:00","25723" +"1249","1","Lamson","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1249 Lamson","1","0000-00-00 00:00:00","6128" +"2734","1","Minnix","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2734 Minnix","1","0000-00-00 00:00:00","5293" +"2786","2","Vanderhorst","Refugio","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","2786 Vanderhorst","1","0000-00-00 00:00:00","4733" +"5590","3","Goggans","Neil","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5590 Goggans","1","0000-00-00 00:00:00","4806" +"5590","1","Lane","Marry","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5590 Lane","1","0000-00-00 00:00:00","4731" +"277","1","Stecklein","Kandice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","277 Stecklein","1","0000-00-00 00:00:00","1035" +"8585","2","Calo","Elvis","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8585 Calo","1","0000-00-00 00:00:00","19298" +"9004","1","Kari","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9004 Kari","1","0000-00-00 00:00:00","5295" +"5040","2","Schweitzer","Tanesha","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","5040 Schweitzer","1","0000-00-00 00:00:00","4315" +"3527","1","Martines","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3527 Martines","1","0000-00-00 00:00:00","5708" +"9446","2","Bagg","Annalee","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9446 Bagg","1","0000-00-00 00:00:00","8693" +"1775","1","Paull","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1775 Paull","1","0000-00-00 00:00:00","4662" +"8947","3","Stump","Serafina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8947 Stump","1","0000-00-00 00:00:00","24433" +"5631","3","Raver","Celia","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","5631 Raver","1","0000-00-00 00:00:00","12573" +"5631","1","Stedman","Shizuko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5631 Stedman","1","0000-00-00 00:00:00","1597" +"7279","2","Dorsett","Renato","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7279 Dorsett","1","0000-00-00 00:00:00","26733" +"1783","1","Barefield","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1783 Barefield","1","0000-00-00 00:00:00","4526" +"6019","1","Raske","Refugio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6019 Raske","1","0000-00-00 00:00:00","410" +"1632","2","Schmucker","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1632 Schmucker","1","0000-00-00 00:00:00","21803" +"5750","2","Marion","Christi","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5750 Marion","1","0000-00-00 00:00:00","22042" +"4667","3","Brawley","Lai","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4667 Brawley","1","0000-00-00 00:00:00","28319" +"4667","2","Debonis","Maurita","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4667 Debonis","1","0000-00-00 00:00:00","28318" +"9603","1","Vanderhorst","Lilia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9603 Vanderhorst","1","0000-00-00 00:00:00","1036" +"1129","1","Graybeal","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1129 Graybeal","1","0000-00-00 00:00:00","5220" +"9065","2","Leib","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9065 Leib","1","0000-00-00 00:00:00","9703" +"9065","1","Mcglothlen","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9065 Mcglothlen","1","0000-00-00 00:00:00","4598" +"52","1","Nowland","Keturah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","52 Nowland","1","0000-00-00 00:00:00","4667" +"5567","1","Petrarca","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5567 Petrarca","1","0000-00-00 00:00:00","3835" +"3196","2","Eury","Moira","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","3196 Eury","1","0000-00-00 00:00:00","4736" +"2244","1","Marion","Tim","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2244 Marion","1","0000-00-00 00:00:00","135" +"3801","1","Bohn","Carmine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3801 Bohn","1","0000-00-00 00:00:00","3547" +"9640","1","Dealba","Alline","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","9640 Dealba","1","0000-00-00 00:00:00","3337" +"8949","2","Grahn","Tanya","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","8949 Grahn","1","0000-00-00 00:00:00","3481" +"3082","2","Worthey","Dennise","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","3082 Worthey","1","0000-00-00 00:00:00","2923" +"5691","2","Jun","Sharie","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5691 Jun","1","0000-00-00 00:00:00","3129" +"5527","1","Ayotte","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","2649.48","999","0","5527 Ayotte","1","0000-00-00 00:00:00","2987" +"7474","3","Friesen","Gwyneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7474 Friesen","1","0000-00-00 00:00:00","20581" +"1548","2","Maestas","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1548 Maestas","1","0000-00-00 00:00:00","16060" +"1548","3","Housley","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1548 Housley","1","0000-00-00 00:00:00","16061" +"7297","1","Szewczyk","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7297 Szewczyk","1","0000-00-00 00:00:00","3478" +"4234","1","Nance","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4234 Nance","1","0000-00-00 00:00:00","5016" +"7551","1","Boyett","Jacqui","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7551 Boyett","1","0000-00-00 00:00:00","4669" +"6947","2","Furlong","Enid","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6947 Furlong","1","0000-00-00 00:00:00","29594" +"1841","1","Sweat","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1841 Sweat","1","0000-00-00 00:00:00","4735" +"4193","2","Hodson","Teressa","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","4193 Hodson","1","0000-00-00 00:00:00","2783" +"4564","1","Tramble","Inez","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4564 Tramble","1","0000-00-00 00:00:00","3480" +"3352","1","Boggan","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3352 Boggan","1","0000-00-00 00:00:00","3273" +"92","4","Mccann","Sharie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","92 Mccann","1","0000-00-00 00:00:00","12701" +"92","1","Marston","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","92 Marston","1","0000-00-00 00:00:00","2994" +"3470","1","Colonna","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3470 Colonna","1","0000-00-00 00:00:00","3482" +"7378","2","Tramble","Selina","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","7378 Tramble","1","0000-00-00 00:00:00","2786" +"1639","2","Funderburke","Eldora","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","1639 Funderburke","1","0000-00-00 00:00:00","2227" +"2576","3","Zander","Maxine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2576 Zander","1","0000-00-00 00:00:00","30659" +"2576","1","Remsen","Charla","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2576 Remsen","1","0000-00-00 00:00:00","2924" +"1660","2","Irwin","Marcela","999","0","0","0","1","0","1","PC","1","0","0","0","999","1","1660 Irwin","1","0000-00-00 00:00:00","2435" +"608","2","Bellantoni","Jed","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","608 Bellantoni","1","0000-00-00 00:00:00","3135" +"6052","2","Plunk","Wilhemina","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","6052 Plunk","1","0000-00-00 00:00:00","3765" +"8874","1","Sugarman","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8874 Sugarman","1","0000-00-00 00:00:00","3763" +"2478","2","Haggerty","Robbyn","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2478 Haggerty","1","0000-00-00 00:00:00","21974" +"1568","2","Nitti","Luanne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1568 Nitti","1","0000-00-00 00:00:00","24777" +"4318","1","Aviles","Junita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4318 Aviles","1","0000-00-00 00:00:00","2619" +"2319","1","Braley","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2319 Braley","1","0000-00-00 00:00:00","4739" +"5892","1","Quintero","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5892 Quintero","1","0000-00-00 00:00:00","2998" +"365","1","Finke","Earle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","365 Finke","1","0000-00-00 00:00:00","3694" +"9244","2","Manganaro","Gregorio","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9244 Manganaro","1","0000-00-00 00:00:00","8217" +"1784","2","Delvalle","Alva","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1784 Delvalle","1","0000-00-00 00:00:00","7203" +"8282","1","Hornung","Marc","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8282 Hornung","1","0000-00-00 00:00:00","139" +"8890","2","Stockard","Maren","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","8890 Stockard","1","0000-00-00 00:00:00","1953" +"9924","2","Finlayson","Kyle","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","9924 Finlayson","1","0000-00-00 00:00:00","1671" +"9310","2","Singletary","Alva","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","9310 Singletary","1","0000-00-00 00:00:00","1748" +"3648","2","Penland","Amada","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","3648 Penland","1","0000-00-00 00:00:00","2232" +"6529","2","Litman","Nell","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","6529 Litman","1","0000-00-00 00:00:00","1954" +"1748","2","Maines","Shaneka","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","1748 Maines","1","0000-00-00 00:00:00","2858" +"3763","1","Monsivais","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3763 Monsivais","1","0000-00-00 00:00:00","205" +"7756","1","Mraz","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7756 Mraz","1","0000-00-00 00:00:00","2788" +"9124","1","Giguere","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9124 Giguere","1","0000-00-00 00:00:00","2228" +"6081","2","Starr","Malia","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","6081 Starr","1","0000-00-00 00:00:00","2720" +"3650","2","Leto","Britt","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","3650 Leto","1","0000-00-00 00:00:00","3067" +"4396","1","Perro","Oliva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4396 Perro","1","0000-00-00 00:00:00","2300" +"2895","4","Lueck","Svetlana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2895 Lueck","1","0000-00-00 00:00:00","27658" +"2895","1","Maines","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2895 Maines","1","0000-00-00 00:00:00","2642" +"3075","1","Czaja","Grady","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3075 Czaja","1","0000-00-00 00:00:00","3626" +"6692","1","Singletary","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6692 Singletary","1","0000-00-00 00:00:00","2440" +"6692","3","Wilmes","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6692 Wilmes","1","0000-00-00 00:00:00","18348" +"811","1","Medley","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","811 Medley","1","0000-00-00 00:00:00","2022" +"5792","2","Kulesza","Ricky","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5792 Kulesza","1","0000-00-00 00:00:00","29529" +"5931","1","Lueck","Boyd","999.99","0","12","0","1","1","1","PC","3","1","0","0","999","0","5931 Lueck","1","0000-00-00 00:00:00","2023" +"5931","2","Spitz","Argentina","0","0","12","0","1","0","0","PC","3","1","0","0","999","0","5931 Spitz","1","0000-00-00 00:00:00","29711" +"3522","1","Tawil","Catina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3522 Tawil","1","0000-00-00 00:00:00","2302" +"8357","2","Remsen","Page","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8357 Remsen","1","0000-00-00 00:00:00","23529" +"5973","1","Cutchin","Grady","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5973 Cutchin","1","0000-00-00 00:00:00","2229" +"2662","1","Voges","Adah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2662 Voges","1","0000-00-00 00:00:00","2644" +"7451","3","Medley","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7451 Medley","1","0000-00-00 00:00:00","18027" +"7451","1","Brundige","Lillian","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7451 Brundige","1","0000-00-00 00:00:00","2790" +"7562","2","Diamond","Noe","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","7562 Diamond","1","0000-00-00 00:00:00","1262" +"528","2","Hunsaker","Josephina","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","528 Hunsaker","1","0000-00-00 00:00:00","1263" +"1338","2","Swicegood","Freddy","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","1338 Swicegood","1","0000-00-00 00:00:00","2093" +"2469","2","Headrick","Salena","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2469 Headrick","1","0000-00-00 00:00:00","30122" +"8814","2","Faber","Venus","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","8814 Faber","1","0000-00-00 00:00:00","1607" +"1092","2","Mcelvain","Lesia","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","1092 Mcelvain","1","0000-00-00 00:00:00","27888" +"3753","2","Scurry","Keturah","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3753 Scurry","1","0000-00-00 00:00:00","30259" +"2338","1","Mcsherry","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2338 Mcsherry","1","0000-00-00 00:00:00","1604" +"9184","1","Hunsaker","Rozella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9184 Hunsaker","1","0000-00-00 00:00:00","695" +"5158","1","Dorsett","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5158 Dorsett","1","0000-00-00 00:00:00","1463" +"4505","1","Lamson","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4505 Lamson","1","0000-00-00 00:00:00","1464" +"7993","1","Martines","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7993 Martines","1","0000-00-00 00:00:00","2090" +"623","2","Havlik","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","623 Havlik","1","0000-00-00 00:00:00","25073" +"657","1","Nowland","Leonel","999.99","45.17","12","80","1","1","1","PC","3","1","0","0","999","0","657 Nowland","1","0000-00-00 00:00:00","2091" +"6031","2","Heise","Shante","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6031 Heise","1","0000-00-00 00:00:00","25645" +"6031","1","Sunderland","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6031 Sunderland","1","0000-00-00 00:00:00","3345" +"2371","1","Aguinaga","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","146.5","999","0","2371 Aguinaga","1","0000-00-00 00:00:00","5101" +"3484","1","Heise","Sheilah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3484 Heise","1","0000-00-00 00:00:00","3346" +"9932","1","Brundige","Nathaniel","999.99","20","0","20","1","1","1","PC","1","0","0","0","999","0","9932 Brundige","1","0000-00-00 00:00:00","2092" +"2821","4","Giffen","Shirl","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2821 Giffen","1","0000-00-00 00:00:00","14917" +"2821","1","Stedman","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2821 Stedman","1","0000-00-00 00:00:00","2156" +"4011","2","Mcburney","Delaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4011 Mcburney","1","0000-00-00 00:00:00","25065" +"4011","3","Wild","Shirlee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4011 Wild","1","0000-00-00 00:00:00","25066" +"1908","2","Villafane","Clementine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1908 Villafane","1","0000-00-00 00:00:00","24148" +"5349","2","Haverly","Korey","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5349 Haverly","1","0000-00-00 00:00:00","20184" +"6809","3","Conger","Rutha","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","6809 Conger","1","0000-00-00 00:00:00","277" +"6809","1","Sugarman","Raven","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6809 Sugarman","1","0000-00-00 00:00:00","2509" +"1336","4","Vasques","Keturah","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1336 Vasques","1","0000-00-00 00:00:00","15029" +"1336","1","Pendergrass","Julene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1336 Pendergrass","1","0000-00-00 00:00:00","1815" +"3673","2","Eury","Mandy","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","3673 Eury","1","0000-00-00 00:00:00","913" +"6989","1","Simms","Susana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6989 Simms","1","0000-00-00 00:00:00","2094" +"66","3","Gutman","Lane","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","66 Gutman","1","0000-00-00 00:00:00","29060" +"66","1","Worthey","Keeley","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","66 Worthey","1","0000-00-00 00:00:00","630" +"5047","1","Drinkwater","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5047 Drinkwater","1","0000-00-00 00:00:00","909" +"8292","2","Finlayson","Slyvia","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","8292 Finlayson","1","0000-00-00 00:00:00","488" +"8016","2","Dillenbeck","Rossana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8016 Dillenbeck","1","0000-00-00 00:00:00","19889" +"8016","1","Ducan","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8016 Ducan","1","0000-00-00 00:00:00","631" +"6943","1","Creel","Bridget","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6943 Creel","1","0000-00-00 00:00:00","557" +"8155","1","Roten","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8155 Roten","1","0000-00-00 00:00:00","558" +"7203","3","Starr","Rutha","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","7203 Starr","1","0000-00-00 00:00:00","7290" +"2603","2","Mcpeek","Jack","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2603 Mcpeek","1","0000-00-00 00:00:00","30584" +"2168","1","Donald","Josie","999.99","10.34","0","20","1","1","1","PC","1","0","0","0","999","0","2168 Donald","1","0000-00-00 00:00:00","561" +"2101","2","Vasques","Susana","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","2101 Vasques","1","0000-00-00 00:00:00","2417" +"2273","1","Cutchin","Germaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2273 Cutchin","1","0000-00-00 00:00:00","911" +"1190","2","Darner","Stefanie","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","1190 Darner","1","0000-00-00 00:00:00","6806" +"1570","2","Ridings","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1570 Ridings","1","0000-00-00 00:00:00","27299" +"1570","3","Neuner","Madie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1570 Neuner","1","0000-00-00 00:00:00","27300" +"6482","1","Voltz","Katherina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6482 Voltz","1","0000-00-00 00:00:00","976" +"7721","2","Hafford","Johnny","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","7721 Hafford","1","0000-00-00 00:00:00","6817" +"4841","2","Ro","Dominick","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","4841 Ro","1","0000-00-00 00:00:00","6773" +"3159","2","Goldsborough","Leola","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3159 Goldsborough","1","0000-00-00 00:00:00","29793" +"9050","2","Owsley","Rocco","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9050 Owsley","1","0000-00-00 00:00:00","31294" +"7207","3","Pung","Octavia","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","7207 Pung","1","0000-00-00 00:00:00","6778" +"7207","2","Stedman","Tierra","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","7207 Stedman","1","0000-00-00 00:00:00","6775" +"2560","2","Pelham","Humberto","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2560 Pelham","1","0000-00-00 00:00:00","19451" +"6628","1","Spier","Shalanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6628 Spier","1","0000-00-00 00:00:00","492" +"8901","1","Dillenbeck","Melvina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8901 Dillenbeck","1","0000-00-00 00:00:00","344" +"26","4","Bickle","Humberto","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","26 Bickle","1","0000-00-00 00:00:00","6883" +"26","2","Srour","Stacey","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","26 Srour","1","0000-00-00 00:00:00","6879" +"472","1","Reger","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","472 Reger","1","0000-00-00 00:00:00","279" +"472","3","Pelaez","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","472 Pelaez","1","0000-00-00 00:00:00","23652" +"9029","2","Valdez","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9029 Valdez","1","0000-00-00 00:00:00","25771" +"2781","3","Aguirre","Kenneth","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2781 Aguirre","1","0000-00-00 00:00:00","8286" +"2781","2","Lary","Selina","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","2781 Lary","1","0000-00-00 00:00:00","6780" +"2611","2","Labree","Cruz","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","2611 Labree","1","0000-00-00 00:00:00","6782" +"7622","1","Derose","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7622 Derose","1","0000-00-00 00:00:00","981" +"5795","4","Eury","Mechelle","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5795 Eury","1","0000-00-00 00:00:00","6837" +"5795","2","Delee","Melonie","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5795 Delee","1","0000-00-00 00:00:00","6832" +"3855","1","Drinkwater","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3855 Drinkwater","1","0000-00-00 00:00:00","6767" +"6825","1","Alessi","Hae","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","6825 Alessi","1","0000-00-00 00:00:00","6768" +"1782","3","Eisenhower","Ines","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1782 Eisenhower","1","0000-00-00 00:00:00","6891" +"1782","4","Spore","Robbi","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1782 Spore","1","0000-00-00 00:00:00","6799" +"5141","2","Bratten","Bong","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","5141 Bratten","1","0000-00-00 00:00:00","16726" +"3368","1","Knudsen","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3368 Knudsen","1","0000-00-00 00:00:00","6814" +"7700","1","Rodrigez","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7700 Rodrigez","1","0000-00-00 00:00:00","349" +"7700","2","Stacy","Marilee","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","7700 Stacy","1","0000-00-00 00:00:00","6788" +"2350","4","Matherne","Dennise","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","2350 Matherne","1","0000-00-00 00:00:00","8290" +"2350","2","Maloof","Deandra","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","2350 Maloof","1","0000-00-00 00:00:00","6850" +"4330","2","Fitting","Leah","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","4330 Fitting","1","0000-00-00 00:00:00","6802" +"6478","1","Larsen","Brianne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6478 Larsen","1","0000-00-00 00:00:00","6876" +"3232","1","Eisenhower","Shavon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3232 Eisenhower","1","0000-00-00 00:00:00","6789" +"1212","2","Paiva","Patrick","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","1212 Paiva","1","0000-00-00 00:00:00","6855" +"3703","2","Simkins","Brianne","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","3703 Simkins","1","0000-00-00 00:00:00","6858" +"6100","4","Goldsborough","Luanne","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","6100 Goldsborough","1","0000-00-00 00:00:00","7277" +"6100","2","Cruzado","Shalanda","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","6100 Cruzado","1","0000-00-00 00:00:00","6859" +"5241","2","Godines","Grady","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5241 Godines","1","0000-00-00 00:00:00","6860" +"5371","1","Leib","Carol","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5371 Leib","1","0000-00-00 00:00:00","6894" +"5371","3","Marston","Anette","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5371 Marston","1","0000-00-00 00:00:00","7286" +"1617","2","Reamer","Ezekiel","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","1617 Reamer","1","0000-00-00 00:00:00","6862" +"5023","1","Hankerson","Cathey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5023 Hankerson","1","0000-00-00 00:00:00","6896" +"8442","1","Sester","Betsey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8442 Sester","1","0000-00-00 00:00:00","6792" +"1576","1","Blais","Tobie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1576 Blais","1","0000-00-00 00:00:00","6897" +"3125","2","Hinshaw","Vern","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","3125 Hinshaw","1","0000-00-00 00:00:00","7280" +"565","2","Weimar","Maurice","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","565 Weimar","1","0000-00-00 00:00:00","29340" +"5929","1","Sugarman","Myrl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5929 Sugarman","1","0000-00-00 00:00:00","6844" +"8265","4","Shryock","Rossana","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","8265 Shryock","1","0000-00-00 00:00:00","7295" +"8265","2","Weiler","Theo","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","8265 Weiler","1","0000-00-00 00:00:00","7283" +"5967","1","Burkhalter","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5967 Burkhalter","1","0000-00-00 00:00:00","6845" +"4187","2","Eoff","Davis","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","4187 Eoff","1","0000-00-00 00:00:00","7299" +"667","4","Beer","Lonnie","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","667 Beer","1","0000-00-00 00:00:00","7356" +"667","1","Glidewell","Ezekiel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","667 Glidewell","1","0000-00-00 00:00:00","6794" +"2834","2","Worthey","Keeley","999.99","13.64","0","20","1","1","1","PC","1","0","0","0","999","1","2834 Worthey","1","0000-00-00 00:00:00","19547" +"3530","3","Friedt","Elyse","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3530 Friedt","1","0000-00-00 00:00:00","29567" +"3530","1","Tyra","Corrinne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3530 Tyra","1","0000-00-00 00:00:00","6846" +"147","4","Dobson","Jarvis","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","147 Dobson","1","0000-00-00 00:00:00","8295" +"147","1","Mcgibbon","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","147 Mcgibbon","1","0000-00-00 00:00:00","6847" +"8857","3","Martines","Delena","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8857 Martines","1","0000-00-00 00:00:00","8296" +"8857","2","Penland","Vesta","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","8857 Penland","1","0000-00-00 00:00:00","7308" +"5338","1","Suen","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5338 Suen","1","0000-00-00 00:00:00","6848" +"5921","1","Mcmorris","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5921 Mcmorris","1","0000-00-00 00:00:00","6910" +"9077","3","Birch","Lazaro","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9077 Birch","1","0000-00-00 00:00:00","8297" +"9077","1","Housley","Mariann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9077 Housley","1","0000-00-00 00:00:00","6797" +"5715","1","Sweigart","Monte","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5715 Sweigart","1","0000-00-00 00:00:00","6798" +"1529","2","Eichler","Samual","999.99","79.99","12","125","1","1","1","PC","3","1","0","0","999","0","1529 Eichler","1","0000-00-00 00:00:00","25243" +"7290","1","Riche","Tanya","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7290 Riche","1","0000-00-00 00:00:00","7315" +"5738","1","Mcgibbon","Daniele","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","1","5738 Mcgibbon","1","0000-00-00 00:00:00","7316" +"5738","3","Leib","Felicidad","999","0","0","0","1","0","1","PC","1","0","0","0","999","1","5738 Leib","1","0000-00-00 00:00:00","7376" +"967","3","Rashid","Sage","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","967 Rashid","1","0000-00-00 00:00:00","18633" +"967","1","Lujan","Freddy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","967 Lujan","1","0000-00-00 00:00:00","7318" +"2615","3","Guebert","Wanita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2615 Guebert","1","0000-00-00 00:00:00","17817" +"2615","2","Eutsler","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2615 Eutsler","1","0000-00-00 00:00:00","17816" +"5177","1","Newby","Towanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5177 Newby","1","0000-00-00 00:00:00","7324" +"5449","2","Janecek","Bobbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5449 Janecek","1","0000-00-00 00:00:00","19354" +"5449","4","Darner","Steve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5449 Darner","1","0000-00-00 00:00:00","19356" +"8533","3","Rodrigez","Valorie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8533 Rodrigez","1","0000-00-00 00:00:00","22520" +"5940","3","Nichol","Garland","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","5940 Nichol","1","0000-00-00 00:00:00","8340" +"5940","2","Mcmullin","Jayme","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5940 Mcmullin","1","0000-00-00 00:00:00","7387" +"7889","2","Valdez","Lawrence","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7889 Valdez","1","0000-00-00 00:00:00","21099" +"5907","2","Reamer","Carol","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5907 Reamer","1","0000-00-00 00:00:00","6935" +"9027","4","Ellis","Zoila","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9027 Ellis","1","0000-00-00 00:00:00","8342" +"9027","2","Sweat","Kandice","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","9027 Sweat","1","0000-00-00 00:00:00","6936" +"5020","3","Hertzler","Jazmine","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5020 Hertzler","1","0000-00-00 00:00:00","29698" +"6107","1","Goodell","Chantal","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6107 Goodell","1","0000-00-00 00:00:00","7344" +"2069","2","Kriger","Catina","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","2069 Kriger","1","0000-00-00 00:00:00","6941" +"3041","1","Hagaman","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3041 Hagaman","1","0000-00-00 00:00:00","7346" +"4680","1","Kriger","Hermine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4680 Kriger","1","0000-00-00 00:00:00","7348" +"5720","3","Perillo","Indira","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5720 Perillo","1","0000-00-00 00:00:00","8348" +"5720","1","Alessi","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5720 Alessi","1","0000-00-00 00:00:00","7349" +"5215","1","Beltrami","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5215 Beltrami","1","0000-00-00 00:00:00","7390" +"1105","2","Vasques","Sarita","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1105 Vasques","1","0000-00-00 00:00:00","6952" +"6720","1","Mueller","Kandice","999.99","14.46","0","20","1","1","1","PC","1","0","0","0","999","0","6720 Mueller","1","0000-00-00 00:00:00","7395" +"3593","2","Diamond","Ines","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3593 Diamond","1","0000-00-00 00:00:00","29847" +"3356","3","Laura","Teressa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3356 Laura","1","0000-00-00 00:00:00","24858" +"3543","1","Mowen","Temeka","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","3543 Mowen","1","0000-00-00 00:00:00","7399" +"7776","1","Storms","Rochell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7776 Storms","1","0000-00-00 00:00:00","7400" +"2571","2","Cutchin","Breann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2571 Cutchin","1","0000-00-00 00:00:00","28653" +"7913","2","Koziel","Katrina","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","7913 Koziel","1","0000-00-00 00:00:00","6961" +"7913","1","Alexandra","Billy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7913 Alexandra","1","0000-00-00 00:00:00","7403" +"5003","2","Sprau","Macy","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","5003 Sprau","1","0000-00-00 00:00:00","6963" +"9120","3","Lane","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9120 Lane","1","0000-00-00 00:00:00","29931" +"9120","2","Reamer","Jarvis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9120 Reamer","1","0000-00-00 00:00:00","29930" +"5341","1","Manzo","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5341 Manzo","1","0000-00-00 00:00:00","6915" +"626","3","Mcleroy","Reyna","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","626 Mcleroy","1","0000-00-00 00:00:00","7519" +"626","2","Sunderland","Philomena","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","626 Sunderland","1","0000-00-00 00:00:00","6965" +"3412","1","Mickey","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3412 Mickey","1","0000-00-00 00:00:00","6920" +"5735","2","Conger","Charla","999.99","0","0","20","1","0","1","PC","1","0","0","1966.11","999","0","5735 Conger","1","0000-00-00 00:00:00","1083" +"4640","1","Plouffe","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4640 Plouffe","1","0000-00-00 00:00:00","6921" +"416","1","Baumgart","Geraldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","416 Baumgart","1","0000-00-00 00:00:00","6923" +"433","1","Ducan","Arlene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","433 Ducan","1","0000-00-00 00:00:00","6926" +"3788","1","Means","Valorie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3788 Means","1","0000-00-00 00:00:00","6927" +"1871","1","Nall","Veronica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1871 Nall","1","0000-00-00 00:00:00","6966" +"5672","1","Alexandra","Barb","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5672 Alexandra","1","0000-00-00 00:00:00","6969" +"3563","1","Esterly","Danae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3563 Esterly","1","0000-00-00 00:00:00","6971" +"700","1","Spier","Renna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","700 Spier","1","0000-00-00 00:00:00","6972" +"5446","4","Somma","Marilee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5446 Somma","1","0000-00-00 00:00:00","24530" +"5446","1","Valente","Owen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5446 Valente","1","0000-00-00 00:00:00","6973" +"2305","2","Synder","Anika","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","2305 Synder","1","0000-00-00 00:00:00","7039" +"1781","3","Boyett","Haydee","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","1781 Boyett","1","0000-00-00 00:00:00","7533" +"5716","1","Irwin","Vern","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5716 Irwin","1","0000-00-00 00:00:00","6979" +"3877","2","Prichett","Eve","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3877 Prichett","1","0000-00-00 00:00:00","17485" +"2359","2","Ducan","Veronica","0","1.58","12","20","1","0","0","PC","3","1","0","0","999","0","2359 Ducan","1","0000-00-00 00:00:00","28941" +"2659","1","Furlong","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2659 Furlong","1","0000-00-00 00:00:00","6983" +"2791","2","Mcfall","Hattie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2791 Mcfall","1","0000-00-00 00:00:00","16659" +"2858","2","Ratti","Susana","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2858 Ratti","1","0000-00-00 00:00:00","29392" +"8144","1","Medley","Rochell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8144 Medley","1","0000-00-00 00:00:00","6990" +"8144","2","Mcfall","Reva","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8144 Mcfall","1","0000-00-00 00:00:00","28457" +"7624","1","Pillai","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7624 Pillai","1","0000-00-00 00:00:00","6992" +"865","1","Coello","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","865 Coello","1","0000-00-00 00:00:00","6996" +"3991","1","Pung","Tyree","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3991 Pung","1","0000-00-00 00:00:00","6997" +"1404","1","Castille","Lakeesha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1404 Castille","1","0000-00-00 00:00:00","7000" +"3049","1","Steffey","Josefine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3049 Steffey","1","0000-00-00 00:00:00","7001" +"3185","1","Getz","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3185 Getz","1","0000-00-00 00:00:00","7003" +"3185","3","Colonna","Theo","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3185 Colonna","1","0000-00-00 00:00:00","7496" +"8764","2","Olaughlin","Loreta","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","8764 Olaughlin","1","0000-00-00 00:00:00","7196" +"8745","2","Esterly","Anamaria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8745 Esterly","1","0000-00-00 00:00:00","22220" +"1538","1","Finke","Mae","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","1","1538 Finke","1","0000-00-00 00:00:00","7098" +"5798","1","Olaughlin","Maynard","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5798 Olaughlin","1","0000-00-00 00:00:00","7100" +"5772","1","Meekins","Marketta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5772 Meekins","1","0000-00-00 00:00:00","7102" +"8117","2","Delvalle","Annalee","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","8117 Delvalle","1","0000-00-00 00:00:00","7425" +"2741","1","Laberge","Jed","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2741 Laberge","1","0000-00-00 00:00:00","7110" +"5355","1","Fitting","Jayme","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","5355 Fitting","1","0000-00-00 00:00:00","7111" +"6333","2","Lane","Serafina","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","6333 Lane","1","0000-00-00 00:00:00","7232" +"2639","1","Poplar","Larae","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","2639 Poplar","1","0000-00-00 00:00:00","7113" +"4226","2","Beaulieu","Monte","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","4226 Beaulieu","1","0000-00-00 00:00:00","7207" +"591","2","Haverly","Lashon","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","591 Haverly","1","0000-00-00 00:00:00","7208" +"7227","3","Heinen","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7227 Heinen","1","0000-00-00 00:00:00","7503" +"7227","2","Castille","Geraldo","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","7227 Castille","1","0000-00-00 00:00:00","7210" +"172","2","Rowell","Melonie","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","172 Rowell","1","0000-00-00 00:00:00","7211" +"7217","1","Salvo","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7217 Salvo","1","0000-00-00 00:00:00","7119" +"1968","1","Perro","Dannette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1968 Perro","1","0000-00-00 00:00:00","7121" +"6026","1","Pickell","Shirlee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6026 Pickell","1","0000-00-00 00:00:00","7122" +"1287","3","Silas","Germaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1287 Silas","1","0000-00-00 00:00:00","7506" +"1287","1","Swarey","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1287 Swarey","1","0000-00-00 00:00:00","7123" +"1825","3","Mcneel","Archie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","1825 Mcneel","1","0000-00-00 00:00:00","7507" +"1825","1","Winchell","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1825 Winchell","1","0000-00-00 00:00:00","7124" +"5689","1","Braley","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5689 Braley","1","0000-00-00 00:00:00","7129" +"7886","1","Fitting","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7886 Fitting","1","0000-00-00 00:00:00","7130" +"1622","1","Albritton","Tommye","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1622 Albritton","1","0000-00-00 00:00:00","7140" +"1209","1","Vizcarra","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1209 Vizcarra","1","0000-00-00 00:00:00","7144" +"5958","1","Viera","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5958 Viera","1","0000-00-00 00:00:00","7145" +"2336","4","Gerst","Towanda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2336 Gerst","1","0000-00-00 00:00:00","7958" +"2336","2","Keppler","Octavia","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","2336 Keppler","1","0000-00-00 00:00:00","7455" +"2597","2","Lapham","Teressa","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2597 Lapham","1","0000-00-00 00:00:00","25014" +"2479","1","Deppen","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2479 Deppen","1","0000-00-00 00:00:00","7156" +"5904","2","Novoa","Inez","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","5904 Novoa","1","0000-00-00 00:00:00","7463" +"9312","2","Propes","Sonia","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","9312 Propes","1","0000-00-00 00:00:00","7464" +"9319","3","Rashid","Stephania","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9319 Rashid","1","0000-00-00 00:00:00","8222" +"9319","1","Grothe","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9319 Grothe","1","0000-00-00 00:00:00","7162" +"3644","1","Weishaar","Hoa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3644 Weishaar","1","0000-00-00 00:00:00","7163" +"2564","2","Brehmer","Jarvis","999.99","0","0","0","1","0","1","TERM","0","0","0","0","999","0","2564 Brehmer","1","0000-00-00 00:00:00","10947" +"2564","1","Steffey","Elvis","999.99","0","0","0","1","1","1","TERM","0","0","0","0","999","0","2564 Steffey","1","0000-00-00 00:00:00","7164" +"4389","2","Larsen","Oliva","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","4389 Larsen","1","0000-00-00 00:00:00","7469" +"4389","1","Maestas","Jamie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4389 Maestas","1","0000-00-00 00:00:00","7165" +"9632","2","Kort","Marc","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","9632 Kort","1","0000-00-00 00:00:00","7471" +"9632","1","Simkins","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9632 Simkins","1","0000-00-00 00:00:00","7167" +"8954","1","Spohn","Theron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8954 Spohn","1","0000-00-00 00:00:00","7170" +"8876","2","Beer","Luna","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","8876 Beer","1","0000-00-00 00:00:00","7474" +"7446","2","Pemberton","Lillian","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","7446 Pemberton","1","0000-00-00 00:00:00","7475" +"7405","2","James","Ethan","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","7405 James","1","0000-00-00 00:00:00","7476" +"2339","3","Feliciano","Christi","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2339 Feliciano","1","0000-00-00 00:00:00","13278" +"2339","2","Bourbeau","Phylicia","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","2339 Bourbeau","1","0000-00-00 00:00:00","7477" +"6132","1","Guebert","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6132 Guebert","1","0000-00-00 00:00:00","7175" +"5106","1","Haverly","Tia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5106 Haverly","1","0000-00-00 00:00:00","7176" +"5699","1","Petrarca","Nellie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5699 Petrarca","1","0000-00-00 00:00:00","7177" +"5452","1","Callejas","Thanh","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","5452 Callejas","1","0000-00-00 00:00:00","7242" +"7898","3","Howze","Melvina","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","7898 Howze","1","0000-00-00 00:00:00","8401" +"7898","2","Steffey","Iona","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","7898 Steffey","1","0000-00-00 00:00:00","7551" +"6776","2","Brehmer","Quincy","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","6776 Brehmer","1","0000-00-00 00:00:00","7549" +"4223","1","Desanti","Johnny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4223 Desanti","1","0000-00-00 00:00:00","7251" +"1196","3","Derose","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1196 Derose","1","0000-00-00 00:00:00","11105" +"1196","1","Toscano","Maren","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1196 Toscano","1","0000-00-00 00:00:00","7253" +"6685","2","Nichol","Kam","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","6685 Nichol","1","0000-00-00 00:00:00","7555" +"3171","3","Spitz","Latricia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3171 Spitz","1","0000-00-00 00:00:00","9410" +"3171","1","Voges","Ethan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3171 Voges","1","0000-00-00 00:00:00","7258" +"1792","4","Plouffe","Jamaal","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1792 Plouffe","1","0000-00-00 00:00:00","9413" +"1792","1","Reamer","Vern","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1792 Reamer","1","0000-00-00 00:00:00","7262" +"8869","1","Heller","Delena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8869 Heller","1","0000-00-00 00:00:00","7264" +"4041","1","Harsh","Mikel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4041 Harsh","1","0000-00-00 00:00:00","7266" +"592","2","Pendergrass","Angelita","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","592 Pendergrass","1","0000-00-00 00:00:00","24472" +"592","4","Pelaez","Noreen","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","592 Pelaez","1","0000-00-00 00:00:00","24474" +"8497","1","Dietrick","Robbyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8497 Dietrick","1","0000-00-00 00:00:00","7409" +"3573","3","Strother","Reva","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3573 Strother","1","0000-00-00 00:00:00","23898" +"8873","2","Harrod","Indira","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","8873 Harrod","1","0000-00-00 00:00:00","8123" +"3174","3","Drinkwater","Archie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3174 Drinkwater","1","0000-00-00 00:00:00","9417" +"3174","2","Hix","Stefanie","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","3174 Hix","1","0000-00-00 00:00:00","8124" +"678","4","Birch","Vern","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","678 Birch","1","0000-00-00 00:00:00","30653" +"678","2","Tawil","Lemuel","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","678 Tawil","1","0000-00-00 00:00:00","30651" +"276","3","Laberge","Cruz","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","276 Laberge","1","0000-00-00 00:00:00","9421" +"276","1","Sherron","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","276 Sherron","1","0000-00-00 00:00:00","7415" +"2578","1","Boggan","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2578 Boggan","1","0000-00-00 00:00:00","7417" +"5024","3","Bertucci","Marc","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5024 Bertucci","1","0000-00-00 00:00:00","30038" +"5024","1","Ayotte","Venus","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5024 Ayotte","1","0000-00-00 00:00:00","7418" +"1710","2","Steven","Keeley","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1710 Steven","1","0000-00-00 00:00:00","8137" +"3502","1","Villafane","Jared","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3502 Villafane","1","0000-00-00 00:00:00","7601" +"7543","2","Mickey","Winona","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","7543 Mickey","1","0000-00-00 00:00:00","8145" +"6207","2","Testerman","Jadwiga","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","6207 Testerman","1","0000-00-00 00:00:00","8147" +"9562","1","Bourbeau","Selina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9562 Bourbeau","1","0000-00-00 00:00:00","7606" +"6051","2","Titsworth","Kenny","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","6051 Titsworth","1","0000-00-00 00:00:00","20359" +"9116","2","Gains","Selma","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","9116 Gains","1","0000-00-00 00:00:00","8150" +"6642","2","Mcleod","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6642 Mcleod","1","0000-00-00 00:00:00","22710" +"7614","3","Cimini","Gaylord","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7614 Cimini","1","0000-00-00 00:00:00","9430" +"7614","2","Irwin","Delena","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","7614 Irwin","1","0000-00-00 00:00:00","8152" +"7615","3","Oquendo","Enid","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7615 Oquendo","1","0000-00-00 00:00:00","21927" +"7615","2","Noblitt","Chet","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7615 Noblitt","1","0000-00-00 00:00:00","21926" +"4012","2","Steitz","Jacqui","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","4012 Steitz","1","0000-00-00 00:00:00","8154" +"5877","4","Bayes","Selina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5877 Bayes","1","0000-00-00 00:00:00","9435" +"5877","2","Propes","Calista","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","5877 Propes","1","0000-00-00 00:00:00","8156" +"7186","2","Suen","Jack","999.99","0","0","20","1","1","1","PC","1","0","0","8901.37","999","0","7186 Suen","1","0000-00-00 00:00:00","6666" +"7186","3","Tunney","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","8901.37","999","0","7186 Tunney","1","0000-00-00 00:00:00","637" +"4583","4","Sugarman","Angelita","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4583 Sugarman","1","0000-00-00 00:00:00","9518" +"4583","3","Brehmer","Winona","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4583 Brehmer","1","0000-00-00 00:00:00","9517" +"3241","3","Mcgibbon","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3241 Mcgibbon","1","0000-00-00 00:00:00","22271" +"3241","1","Kari","Keneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3241 Kari","1","0000-00-00 00:00:00","8097" +"1920","2","Goldsborough","Karlyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1920 Goldsborough","1","0000-00-00 00:00:00","18637" +"1920","1","Funderburke","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1920 Funderburke","1","0000-00-00 00:00:00","8098" +"7703","2","Able","Teisha","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","7703 Able","1","0000-00-00 00:00:00","9406" +"2152","4","Baily","Amada","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2152 Baily","1","0000-00-00 00:00:00","29988" +"2152","2","Dietrick","Roseann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2152 Dietrick","1","0000-00-00 00:00:00","29986" +"9260","2","Plunk","Geraldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9260 Plunk","1","0000-00-00 00:00:00","27037" +"3478","1","Knudsen","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3478 Knudsen","1","0000-00-00 00:00:00","8104" +"1022","2","Landwehr","Hoa","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","1022 Landwehr","1","0000-00-00 00:00:00","9393" +"3515","4","Babcock","Charla","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3515 Babcock","1","0000-00-00 00:00:00","9527" +"3515","2","Paiva","Virgina","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","3515 Paiva","1","0000-00-00 00:00:00","9394" +"2507","2","Neuner","Ezekiel","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","2507 Neuner","1","0000-00-00 00:00:00","9395" +"2507","4","Stahl","Calvin","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2507 Stahl","1","0000-00-00 00:00:00","9529" +"8545","4","Liebsch","Carlos","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8545 Liebsch","1","0000-00-00 00:00:00","9532" +"8545","3","Swarey","Carmelita","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8545 Swarey","1","0000-00-00 00:00:00","9531" +"7773","1","Carolan","Candelaria","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","7773 Carolan","1","0000-00-00 00:00:00","8172" +"4134","1","Timlin","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4134 Timlin","1","0000-00-00 00:00:00","8173" +"4264","1","Winchell","Hui","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4264 Winchell","1","0000-00-00 00:00:00","8174" +"4167","1","Rowell","Tia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4167 Rowell","1","0000-00-00 00:00:00","8175" +"5292","1","Quintero","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5292 Quintero","1","0000-00-00 00:00:00","8177" +"69","2","Pennypacker","Lonna","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","69 Pennypacker","1","0000-00-00 00:00:00","7970" +"764","3","Snively","Svetlana","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","764 Snively","1","0000-00-00 00:00:00","9490" +"764","2","Arata","Julius","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","764 Arata","1","0000-00-00 00:00:00","7981" +"8334","1","Trafton","Loan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8334 Trafton","1","0000-00-00 00:00:00","8189" +"2684","3","Villagran","Charla","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2684 Villagran","1","0000-00-00 00:00:00","9492" +"2684","2","Snodgrass","Candelaria","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","2684 Snodgrass","1","0000-00-00 00:00:00","7988" +"6699","2","Gerst","Diana","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","6699 Gerst","1","0000-00-00 00:00:00","7987" +"4836","4","Glassman","Ines","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4836 Glassman","1","0000-00-00 00:00:00","9495" +"4836","2","Manganaro","Wanita","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","4836 Manganaro","1","0000-00-00 00:00:00","8407" +"5960","1","Sedillo","Maurice","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","5960 Sedillo","1","0000-00-00 00:00:00","8199" +"1790","1","Marston","Virgina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1790 Marston","1","0000-00-00 00:00:00","8200" +"9786","3","Ming","Andria","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9786 Ming","1","0000-00-00 00:00:00","9501" +"9786","1","Larsen","Hui","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9786 Larsen","1","0000-00-00 00:00:00","8201" +"2812","4","Eidt","Lovetta","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2812 Eidt","1","0000-00-00 00:00:00","9507" +"2812","2","Brawley","Sonia","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","2812 Brawley","1","0000-00-00 00:00:00","8415" +"3177","2","Jun","Jazmine","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","3177 Jun","1","0000-00-00 00:00:00","8416" +"7069","1","Suen","Dixie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7069 Suen","1","0000-00-00 00:00:00","8234" +"5805","3","Dietrick","Caryl","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5805 Dietrick","1","0000-00-00 00:00:00","18976" +"5805","2","Larkin","Angelita","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5805 Larkin","1","0000-00-00 00:00:00","18975" +"5002","1","Mcleod","Gene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5002 Mcleod","1","0000-00-00 00:00:00","8239" +"9939","3","Mollett","Kent","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9939 Mollett","1","0000-00-00 00:00:00","9512" +"9939","1","Lary","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9939 Lary","1","0000-00-00 00:00:00","8240" +"1262","2","Boyett","Chrystal","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1262 Boyett","1","0000-00-00 00:00:00","21381" +"5185","3","Muck","Rupert","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5185 Muck","1","0000-00-00 00:00:00","9515" +"5185","1","Pennypacker","Clementine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5185 Pennypacker","1","0000-00-00 00:00:00","8247" +"479","2","Stump","Lizeth","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","479 Stump","1","0000-00-00 00:00:00","8376" +"479","1","Hakala","Latricia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","479 Hakala","1","0000-00-00 00:00:00","8251" +"6173","2","Valdez","Cruz","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","6173 Valdez","1","0000-00-00 00:00:00","8379" +"5450","1","Kouba","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5450 Kouba","1","0000-00-00 00:00:00","8256" +"2135","1","Rowell","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2135 Rowell","1","0000-00-00 00:00:00","8257" +"5098","1","Vizcarra","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5098 Vizcarra","1","0000-00-00 00:00:00","8259" +"5099","1","Fuell","Alonzo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5099 Fuell","1","0000-00-00 00:00:00","8261" +"8720","1","Wachowiak","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8720 Wachowiak","1","0000-00-00 00:00:00","8264" +"4398","1","Titsworth","Larae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4398 Titsworth","1","0000-00-00 00:00:00","8269" +"3665","2","Weathersby","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3665 Weathersby","1","0000-00-00 00:00:00","27075" +"7790","1","Larsen","Delila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7790 Larsen","1","0000-00-00 00:00:00","8299" +"9569","1","Hardage","Jule","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9569 Hardage","1","0000-00-00 00:00:00","8301" +"5920","3","Soderberg","Davis","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5920 Soderberg","1","0000-00-00 00:00:00","9544" +"5920","1","Dillenbeck","Season","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5920 Dillenbeck","1","0000-00-00 00:00:00","8303" +"2887","2","Stump","Gwyneth","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","2887 Stump","1","0000-00-00 00:00:00","7959" +"9752","2","Wachowiak","Sarita","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","9752 Wachowiak","1","0000-00-00 00:00:00","7976" +"5593","1","Sledge","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5593 Sledge","1","0000-00-00 00:00:00","8312" +"5593","3","Riffel","Dominick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5593 Riffel","1","0000-00-00 00:00:00","29168" +"4852","1","Brundige","Theda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4852 Brundige","1","0000-00-00 00:00:00","8315" +"3954","1","Wachowiak","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3954 Wachowiak","1","0000-00-00 00:00:00","8316" +"5635","2","Cruzado","Brianne","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","5635 Cruzado","1","0000-00-00 00:00:00","9342" +"724","3","Pelaez","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","724 Pelaez","1","0000-00-00 00:00:00","25178" +"724","1","Nance","Retha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","724 Nance","1","0000-00-00 00:00:00","8325" +"5222","1","Liebsch","Debera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5222 Liebsch","1","0000-00-00 00:00:00","8327" +"1504","2","Hamaker","Britt","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1504 Hamaker","1","0000-00-00 00:00:00","9355" +"1319","2","Cruzado","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1319 Cruzado","1","0000-00-00 00:00:00","20152" +"3309","1","Larsen","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3309 Larsen","1","0000-00-00 00:00:00","8334" +"2367","1","Ducan","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2367 Ducan","1","0000-00-00 00:00:00","8336" +"7340","2","Leto","Sage","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7340 Leto","1","0000-00-00 00:00:00","22757" +"7599","2","Grubaugh","Dortha","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","7599 Grubaugh","1","0000-00-00 00:00:00","9363" +"5745","3","Funches","Cherilyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5745 Funches","1","0000-00-00 00:00:00","27825" +"5745","2","Penland","Garland","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5745 Penland","1","0000-00-00 00:00:00","27824" +"1554","1","Trigg","Towanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1554 Trigg","1","0000-00-00 00:00:00","7995" +"697","3","Pillai","Beau","0","15.95","0","20","1","0","0","PC","1","0","0","0","999","1","697 Pillai","1","0000-00-00 00:00:00","30642" +"697","1","Bellantoni","Jared","999.99","15.95","0","20","1","1","1","PC","1","0","0","0","999","1","697 Bellantoni","1","0000-00-00 00:00:00","7997" +"1381","1","Botkin","Destiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1381 Botkin","1","0000-00-00 00:00:00","8001" +"2278","2","Simons","Season","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","2278 Simons","1","0000-00-00 00:00:00","9366" +"7854","2","Kriger","Alline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7854 Kriger","1","0000-00-00 00:00:00","21255" +"6366","1","Mcleroy","Refugio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6366 Mcleroy","1","0000-00-00 00:00:00","8004" +"2361","2","Singletary","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2361 Singletary","1","0000-00-00 00:00:00","21574" +"2361","4","Heise","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2361 Heise","1","0000-00-00 00:00:00","21576" +"2883","3","Simons","Jacob","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2883 Simons","1","0000-00-00 00:00:00","9389" +"2883","1","Schoepp","Venetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2883 Schoepp","1","0000-00-00 00:00:00","8007" +"9614","1","Propes","Shonda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9614 Propes","1","0000-00-00 00:00:00","8008" +"411","1","Hipps","Luna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","411 Hipps","1","0000-00-00 00:00:00","8011" +"4801","2","Trigg","Peggy","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4801 Trigg","1","0000-00-00 00:00:00","10071" +"4801","3","Graybeal","Deandra","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4801 Graybeal","1","0000-00-00 00:00:00","7481" +"1835","1","Worthey","Myrtis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1835 Worthey","1","0000-00-00 00:00:00","8021" +"2693","3","Heintzelman","Frederick","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2693 Heintzelman","1","0000-00-00 00:00:00","9574" +"2693","2","Rippey","Sarita","999","0","0","20","1","1","1","PC","1","0","0","0","999","1","2693 Rippey","1","0000-00-00 00:00:00","9555" +"1896","1","Brundige","Enid","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1896 Brundige","1","0000-00-00 00:00:00","8023" +"6878","3","Zander","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6878 Zander","1","0000-00-00 00:00:00","16265" +"3928","1","Wild","Destiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3928 Wild","1","0000-00-00 00:00:00","8025" +"7900","3","Bakley","Monte","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7900 Bakley","1","0000-00-00 00:00:00","18512" +"7900","2","World","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7900 World","1","0000-00-00 00:00:00","18511" +"1055","1","Stecklein","Barb","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1055 Stecklein","1","0000-00-00 00:00:00","8028" +"1386","3","Irwin","Renna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1386 Irwin","1","0000-00-00 00:00:00","30831" +"2411","4","Rozzell","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2411 Rozzell","1","0000-00-00 00:00:00","24363" +"2411","3","Lone","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2411 Lone","1","0000-00-00 00:00:00","24362" +"4269","4","Szabo","Harriette","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4269 Szabo","1","0000-00-00 00:00:00","16871" +"4269","1","Hinshaw","Tobias","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4269 Hinshaw","1","0000-00-00 00:00:00","8433" +"2542","1","Carolan","Tia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2542 Carolan","1","0000-00-00 00:00:00","8435" +"4377","2","Piccard","Quincy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4377 Piccard","1","0000-00-00 00:00:00","19205" +"4377","4","Wendland","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4377 Wendland","1","0000-00-00 00:00:00","19207" +"2691","1","Bratten","Joslyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2691 Bratten","1","0000-00-00 00:00:00","8437" +"5848","1","Hodson","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5848 Hodson","1","0000-00-00 00:00:00","9280" +"574","2","Schmucker","Hermine","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","574 Schmucker","1","0000-00-00 00:00:00","9262" +"574","3","Penland","Dorine","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","574 Penland","1","0000-00-00 00:00:00","10016" +"474","1","Vandenbosch","Chrystal","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","474 Vandenbosch","1","0000-00-00 00:00:00","9285" +"1032","1","Sunderland","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1032 Sunderland","1","0000-00-00 00:00:00","9289" +"7370","1","Tippit","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7370 Tippit","1","0000-00-00 00:00:00","9290" +"1373","2","Brehmer","Korey","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1373 Brehmer","1","0000-00-00 00:00:00","9592" +"1373","3","Maines","Amada","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","1373 Maines","1","0000-00-00 00:00:00","9593" +"3694","1","Rodrigez","Octavia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3694 Rodrigez","1","0000-00-00 00:00:00","9295" +"8070","2","Hix","Shirlee","999.99","0","0","20","1","1","1","PC","1","0","0","4379.98","999","0","8070 Hix","1","0000-00-00 00:00:00","15722" +"2347","2","Bakley","Hai","999.99","0","0","20","1","0","1","PC","1","0","0","529.59","999","0","2347 Bakley","1","0000-00-00 00:00:00","529" +"2347","3","Harpole","Lemuel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2347 Harpole","1","0000-00-00 00:00:00","14792" +"930","2","Sugarman","Leonel","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","930 Sugarman","1","0000-00-00 00:00:00","9628" +"9691","2","Guebert","Leopoldo","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","9691 Guebert","1","0000-00-00 00:00:00","9627" +"2383","2","Ater","Tiffiny","999","0","0","20","1","0","1","PC","1","0","0","0","999","0","2383 Ater","1","0000-00-00 00:00:00","10008" +"4177","2","Giraldo","Roseann","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4177 Giraldo","1","0000-00-00 00:00:00","18207" +"4177","1","Arias","Latricia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4177 Arias","1","0000-00-00 00:00:00","9448" +"6035","3","Somma","Elvera","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6035 Somma","1","0000-00-00 00:00:00","25142" +"6035","1","Faber","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6035 Faber","1","0000-00-00 00:00:00","9450" +"1855","2","Wessner","Stefanie","999","0","0","20","1","1","1","PC","1","0","0","0","999","0","1855 Wessner","1","0000-00-00 00:00:00","10022" +"5547","3","Szewczyk","Shante","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","5547 Szewczyk","1","0000-00-00 00:00:00","10014" +"5547","1","Graybeal","Brittani","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5547 Graybeal","1","0000-00-00 00:00:00","9453" +"6246","3","Nance","Felicitas","999","0","0","20","1","0","1","PC","1","0","0","0","999","1","6246 Nance","1","0000-00-00 00:00:00","10025" +"2329","2","Lheureux","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2329 Lheureux","1","0000-00-00 00:00:00","15869" +"1349","1","Vroman","Kirstin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1349 Vroman","1","0000-00-00 00:00:00","9457" +"4189","2","Hix","Myrtle","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","4189 Hix","1","0000-00-00 00:00:00","10077" +"1387","1","Limon","Darius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1387 Limon","1","0000-00-00 00:00:00","9464" +"4303","2","Owen","Adah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4303 Owen","1","0000-00-00 00:00:00","24692" +"4303","1","Trafton","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4303 Trafton","1","0000-00-00 00:00:00","9465" +"612","1","Plouffe","Pricilla","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","612 Plouffe","1","0000-00-00 00:00:00","9466" +"7515","1","Collis","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7515 Collis","1","0000-00-00 00:00:00","9469" +"2302","1","Funches","Noreen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2302 Funches","1","0000-00-00 00:00:00","9470" +"2302","3","Shoe","Marylou","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2302 Shoe","1","0000-00-00 00:00:00","16877" +"9897","4","Nichol","Branden","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9897 Nichol","1","0000-00-00 00:00:00","9764" +"9897","3","Funches","Tommye","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9897 Funches","1","0000-00-00 00:00:00","9763" +"3564","2","Giguere","Taryn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3564 Giguere","1","0000-00-00 00:00:00","16532" +"3564","1","Pelchat","Tomiko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3564 Pelchat","1","0000-00-00 00:00:00","9483" +"2756","1","Tippit","Maynard","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2756 Tippit","1","0000-00-00 00:00:00","10037" +"410","1","Milian","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","410 Milian","1","0000-00-00 00:00:00","10039" +"1937","2","Babcock","Juli","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1937 Babcock","1","0000-00-00 00:00:00","26047" +"1937","4","Weishaar","Elane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1937 Weishaar","1","0000-00-00 00:00:00","26049" +"4143","1","Madson","Nelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4143 Madson","1","0000-00-00 00:00:00","10042" +"4143","3","Michel","Felicitas","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4143 Michel","1","0000-00-00 00:00:00","7673" +"3946","3","Wessner","Cruz","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3946 Wessner","1","0000-00-00 00:00:00","19124" +"3946","1","Leto","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3946 Leto","1","0000-00-00 00:00:00","10045" +"807","3","Ducan","Gregorio","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","807 Ducan","1","0000-00-00 00:00:00","30327" +"841","1","Limon","Nellie","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","1","841 Limon","1","0000-00-00 00:00:00","10047" +"7748","1","Steitz","Cherilyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7748 Steitz","1","0000-00-00 00:00:00","10048" +"6078","2","Peer","Mei","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6078 Peer","1","0000-00-00 00:00:00","9597" +"8388","1","Biery","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8388 Biery","1","0000-00-00 00:00:00","10056" +"725","1","Cimini","Gaylord","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","725 Cimini","1","0000-00-00 00:00:00","10057" +"725","2","Chain","Chong","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","725 Chain","1","0000-00-00 00:00:00","7691" +"1010","1","Olaughlin","Josie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1010 Olaughlin","1","0000-00-00 00:00:00","10059" +"3831","3","Shoe","Korey","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","3831 Shoe","1","0000-00-00 00:00:00","7696" +"3831","4","Schmucker","Gene","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","3831 Schmucker","1","0000-00-00 00:00:00","7697" +"2598","2","Trousdale","Lashawn","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2598 Trousdale","1","0000-00-00 00:00:00","30601" +"6112","2","Hafley","Towanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6112 Hafley","1","0000-00-00 00:00:00","22140" +"5797","1","Ensey","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5797 Ensey","1","0000-00-00 00:00:00","7629" +"8339","3","Simms","Harrison","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","8339 Simms","1","0000-00-00 00:00:00","7708" +"8339","4","Clatterbuck","Kirstin","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8339 Clatterbuck","1","0000-00-00 00:00:00","7709" +"2314","3","Lowe","Rosalva","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2314 Lowe","1","0000-00-00 00:00:00","23528" +"327","2","Starr","Gene","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","327 Starr","1","0000-00-00 00:00:00","12360" +"9145","2","Lach","Love","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9145 Lach","1","0000-00-00 00:00:00","12168" +"9700","2","Soderberg","Tyree","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","9700 Soderberg","1","0000-00-00 00:00:00","12240" +"4077","2","Tawil","Jacqui","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","4077 Tawil","1","0000-00-00 00:00:00","12247" +"4077","1","Storms","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4077 Storms","1","0000-00-00 00:00:00","7638" +"6753","1","Sunderland","Barbera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6753 Sunderland","1","0000-00-00 00:00:00","7639" +"91","2","Voltz","Mariann","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","91 Voltz","1","0000-00-00 00:00:00","12376" +"91","1","Mumper","Arron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","91 Mumper","1","0000-00-00 00:00:00","7641" +"4585","4","Pelchat","Delinda","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4585 Pelchat","1","0000-00-00 00:00:00","19924" +"4585","2","Stacy","Tierra","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4585 Stacy","1","0000-00-00 00:00:00","19922" +"3922","1","Strother","Macy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3922 Strother","1","0000-00-00 00:00:00","7646" +"939","3","Perro","Summer","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","939 Perro","1","0000-00-00 00:00:00","12271" +"939","1","Rozzell","Wanetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","939 Rozzell","1","0000-00-00 00:00:00","7647" +"8760","3","Hunsaker","Troy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8760 Hunsaker","1","0000-00-00 00:00:00","24394" +"3242","2","Derosa","Iona","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3242 Derosa","1","0000-00-00 00:00:00","12408" +"3242","1","Anderson","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3242 Anderson","1","0000-00-00 00:00:00","7650" +"5556","2","Barefield","Shante","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5556 Barefield","1","0000-00-00 00:00:00","12309" +"5556","1","Frith","Rachel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5556 Frith","1","0000-00-00 00:00:00","7655" +"7230","2","Dietrick","Macy","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7230 Dietrick","1","0000-00-00 00:00:00","12311" +"530","3","Marnell","Stacey","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","530 Marnell","1","0000-00-00 00:00:00","11555" +"530","1","Fortin","Cleta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","530 Fortin","1","0000-00-00 00:00:00","7657" +"4120","1","Botkin","Lino","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4120 Botkin","1","0000-00-00 00:00:00","7658" +"4473","1","Palmatier","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4473 Palmatier","1","0000-00-00 00:00:00","7660" +"2606","3","Severe","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2606 Severe","1","0000-00-00 00:00:00","26473" +"2606","1","Daquila","Keneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2606 Daquila","1","0000-00-00 00:00:00","7662" +"1227","1","Ehrman","Enid","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1227 Ehrman","1","0000-00-00 00:00:00","7663" +"5239","1","Hornung","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5239 Hornung","1","0000-00-00 00:00:00","7665" +"5749","1","Furlong","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5749 Furlong","1","0000-00-00 00:00:00","7713" +"636","2","Hults","Jamaal","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","636 Hults","1","0000-00-00 00:00:00","12429" +"381","2","Means","Ingeborg","999.99","9.18","0","20","1","1","1","PC","1","0","0","0","999","0","381 Means","1","0000-00-00 00:00:00","26666" +"381","1","Headrick","Deon","999.99","9.18","0","20","1","1","1","PC","1","0","0","0","999","0","381 Headrick","1","0000-00-00 00:00:00","7718" +"888","1","Harpole","Venetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","888 Harpole","1","0000-00-00 00:00:00","7723" +"5646","3","Ducan","Elyse","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5646 Ducan","1","0000-00-00 00:00:00","11716" +"6444","1","Grothe","Delaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6444 Grothe","1","0000-00-00 00:00:00","7726" +"3491","1","Doetsch","Catina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3491 Doetsch","1","0000-00-00 00:00:00","7732" +"5685","2","Gargiulo","Melonie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5685 Gargiulo","1","0000-00-00 00:00:00","11725" +"5574","3","Tardiff","Chantal","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","5574 Tardiff","1","0000-00-00 00:00:00","11727" +"5574","2","Braley","Shizuko","0","0","0","20","1","1","0","PC","1","0","0","0","0","0","5574 Braley","1","0000-00-00 00:00:00","11726" +"9598","1","Jepsen","Noelle","999.99","26.96","12","50","1","1","1","PC","3","1","0","0","999","0","9598 Jepsen","1","0000-00-00 00:00:00","7741" +"4072","1","Doetsch","Joette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4072 Doetsch","1","0000-00-00 00:00:00","7745" +"962","1","World","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","962 World","1","0000-00-00 00:00:00","7749" +"4227","1","Frith","Janel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4227 Frith","1","0000-00-00 00:00:00","7758" +"1856","2","Feehan","Gregorio","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","1856 Feehan","1","0000-00-00 00:00:00","12220" +"1856","1","Zander","Janel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1856 Zander","1","0000-00-00 00:00:00","7760" +"6664","2","Silas","Maynard","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6664 Silas","1","0000-00-00 00:00:00","29395" +"5698","1","Calo","Keneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5698 Calo","1","0000-00-00 00:00:00","12123" +"6144","2","Mckillip","Myrtle","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6144 Mckillip","1","0000-00-00 00:00:00","24397" +"6144","3","Tunney","Wilhemina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6144 Tunney","1","0000-00-00 00:00:00","24398" +"2143","1","Hakala","Katherina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2143 Hakala","1","0000-00-00 00:00:00","12127" +"2258","3","Marnell","Royce","0","0","0","0","1","0","0","PC","1","0","0","0","0","1","2258 Marnell","1","0000-00-00 00:00:00","11774" +"2258","2","Doetsch","Lakeesha","0","0","0","0","1","0","0","PC","1","0","0","0","0","1","2258 Doetsch","1","0000-00-00 00:00:00","11773" +"7038","1","Ridings","Loan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7038 Ridings","1","0000-00-00 00:00:00","12136" +"2777","2","Gory","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2777 Gory","1","0000-00-00 00:00:00","24825" +"4886","2","Boggan","Indira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4886 Boggan","1","0000-00-00 00:00:00","25055" +"4205","2","Leib","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4205 Leib","1","0000-00-00 00:00:00","15891" +"4205","1","Bouknight","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4205 Bouknight","1","0000-00-00 00:00:00","12140" +"384","2","Valdez","Carmine","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","384 Valdez","1","0000-00-00 00:00:00","21050" +"2186","2","Deshaies","Britt","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2186 Deshaies","1","0000-00-00 00:00:00","24671" +"2186","1","Lone","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2186 Lone","1","0000-00-00 00:00:00","12144" +"4714","3","Cutchin","Julene","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4714 Cutchin","1","0000-00-00 00:00:00","12302" +"4714","4","Tousignant","Katherina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4714 Tousignant","1","0000-00-00 00:00:00","11785" +"6857","1","Labree","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6857 Labree","1","0000-00-00 00:00:00","7486" +"99","3","Aguinaga","Carmelita","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","99 Aguinaga","1","0000-00-00 00:00:00","11795" +"99","1","Tramble","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","99 Tramble","1","0000-00-00 00:00:00","7501" +"7140","4","Mcleroy","Anamaria","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7140 Mcleroy","1","0000-00-00 00:00:00","11838" +"7140","2","Spore","Robbi","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7140 Spore","1","0000-00-00 00:00:00","11836" +"7727","4","Mcfall","Neil","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","7727 Mcfall","1","0000-00-00 00:00:00","25939" +"7727","3","Kirst","Tia","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","7727 Kirst","1","0000-00-00 00:00:00","25938" +"9023","2","Mcmullin","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9023 Mcmullin","1","0000-00-00 00:00:00","17042" +"8354","1","Ro","Jodie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8354 Ro","1","0000-00-00 00:00:00","11711" +"1283","3","Monsivais","Luther","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1283 Monsivais","1","0000-00-00 00:00:00","11862" +"1426","1","Hord","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1426 Hord","1","0000-00-00 00:00:00","12432" +"1426","3","Trigg","Carol","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1426 Trigg","1","0000-00-00 00:00:00","11865" +"3927","2","Eury","Marline","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3927 Eury","1","0000-00-00 00:00:00","29206" +"5171","2","Blais","Wanita","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5171 Blais","1","0000-00-00 00:00:00","11873" +"489","1","Baumgart","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","489 Baumgart","1","0000-00-00 00:00:00","12467" +"5813","1","Melby","Chantal","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5813 Melby","1","0000-00-00 00:00:00","12343" +"5623","2","Calo","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5623 Calo","1","0000-00-00 00:00:00","25174" +"5623","3","Meekins","Archie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5623 Meekins","1","0000-00-00 00:00:00","25175" +"1940","1","Hellmann","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1940 Hellmann","1","0000-00-00 00:00:00","12385" +"1396","2","Pung","Stacey","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1396 Pung","1","0000-00-00 00:00:00","11989" +"1396","3","Sedillo","Dianna","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1396 Sedillo","1","0000-00-00 00:00:00","12181" +"8692","1","Plunk","Twana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8692 Plunk","1","0000-00-00 00:00:00","12237" +"4047","2","Drinkwater","Linnea","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4047 Drinkwater","1","0000-00-00 00:00:00","9264" +"3903","2","Fierro","Glinda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3903 Fierro","1","0000-00-00 00:00:00","12009" +"7820","2","Friedt","Lai","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7820 Friedt","1","0000-00-00 00:00:00","12010" +"1171","2","Nitti","Josefine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1171 Nitti","1","0000-00-00 00:00:00","12011" +"4870","1","Schreiner","Latricia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4870 Schreiner","1","0000-00-00 00:00:00","11801" +"4656","2","Collis","Shirlee","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4656 Collis","1","0000-00-00 00:00:00","12014" +"7924","2","Labree","Theron","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7924 Labree","1","0000-00-00 00:00:00","12016" +"8808","2","Tawil","Shalanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8808 Tawil","1","0000-00-00 00:00:00","12403" +"2410","2","Mcneel","Garland","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2410 Mcneel","1","0000-00-00 00:00:00","12160" +"2410","1","Nance","Yasuko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2410 Nance","1","0000-00-00 00:00:00","11808" +"6733","2","Heise","Eldridge","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6733 Heise","1","0000-00-00 00:00:00","12021" +"6733","1","Oquendo","Lawrence","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6733 Oquendo","1","0000-00-00 00:00:00","11809" +"5866","1","Keppler","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5866 Keppler","1","0000-00-00 00:00:00","11813" +"3659","1","Ater","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3659 Ater","1","0000-00-00 00:00:00","11814" +"7262","1","Boyett","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7262 Boyett","1","0000-00-00 00:00:00","11817" +"7012","1","Pillai","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7012 Pillai","1","0000-00-00 00:00:00","11819" +"8183","2","Trafton","Rhona","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8183 Trafton","1","0000-00-00 00:00:00","12469" +"3792","1","Wedderburn","Love","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3792 Wedderburn","1","0000-00-00 00:00:00","11822" +"1342","1","Atwell","Joette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1342 Atwell","1","0000-00-00 00:00:00","11824" +"5997","1","Giraldo","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5997 Giraldo","1","0000-00-00 00:00:00","11825" +"5815","2","Petrarca","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5815 Petrarca","1","0000-00-00 00:00:00","21485" +"2942","1","Gunderman","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2942 Gunderman","1","0000-00-00 00:00:00","11828" +"9675","1","Hertzler","Tobias","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9675 Hertzler","1","0000-00-00 00:00:00","11890" +"7753","3","Baumgart","Moira","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7753 Baumgart","1","0000-00-00 00:00:00","29367" +"7753","2","Brabant","Shizuko","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7753 Brabant","1","0000-00-00 00:00:00","29366" +"1043","3","Bakley","Sarita","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1043 Bakley","1","0000-00-00 00:00:00","12340" +"1043","1","Arata","Arlene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1043 Arata","1","0000-00-00 00:00:00","11895" +"2476","3","Wilmes","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2476 Wilmes","1","0000-00-00 00:00:00","28172" +"2476","2","Parrales","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2476 Parrales","1","0000-00-00 00:00:00","28171" +"8129","1","Aviles","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","530.01","999","0","8129 Aviles","1","0000-00-00 00:00:00","6432" +"8076","1","Haverly","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8076 Haverly","1","0000-00-00 00:00:00","11904" +"8076","3","Derosa","Shavon","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8076 Derosa","1","0000-00-00 00:00:00","29319" +"2915","2","Steitz","Catina","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2915 Steitz","1","0000-00-00 00:00:00","11960" +"6926","1","Petrarca","Desire","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6926 Petrarca","1","0000-00-00 00:00:00","11906" +"8912","1","Parisien","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8912 Parisien","1","0000-00-00 00:00:00","11909" +"5381","3","Olaughlin","Charla","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5381 Olaughlin","1","0000-00-00 00:00:00","28128" +"5381","1","Finke","Lino","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5381 Finke","1","0000-00-00 00:00:00","11912" +"6610","2","Hamaker","Shizuko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6610 Hamaker","1","0000-00-00 00:00:00","28391" +"7857","3","Muck","Ruthie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7857 Muck","1","0000-00-00 00:00:00","12443" +"7857","1","Jun","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7857 Jun","1","0000-00-00 00:00:00","11914" +"5216","1","Brehmer","Selina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5216 Brehmer","1","0000-00-00 00:00:00","11915" +"5216","2","Bouknight","Mandy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5216 Bouknight","1","0000-00-00 00:00:00","22910" +"6945","4","Vanwagenen","Lazaro","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6945 Vanwagenen","1","0000-00-00 00:00:00","11968" +"6945","1","Zaccaria","Samual","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6945 Zaccaria","1","0000-00-00 00:00:00","11917" +"990","1","Guidi","Catina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","990 Guidi","1","0000-00-00 00:00:00","11920" +"990","4","Lehrer","Anika","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","990 Lehrer","1","0000-00-00 00:00:00","11972" +"379","3","Weishaar","Rocco","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","379 Weishaar","1","0000-00-00 00:00:00","11998" +"440","1","Arata","Troy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","440 Arata","1","0000-00-00 00:00:00","11925" +"9407","2","Oyola","Lesia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9407 Oyola","1","0000-00-00 00:00:00","12188" +"1187","2","Owsley","Jacklyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1187 Owsley","1","0000-00-00 00:00:00","12212" +"1187","4","Collis","Hulda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1187 Collis","1","0000-00-00 00:00:00","12005" +"5512","4","Nichol","Stefanie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5512 Nichol","1","0000-00-00 00:00:00","12054" +"5512","1","Eisenhower","Betsey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5512 Eisenhower","1","0000-00-00 00:00:00","11932" +"9410","2","Ming","Van","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9410 Ming","1","0000-00-00 00:00:00","12059" +"4101","1","Nitti","Gwyneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4101 Nitti","1","0000-00-00 00:00:00","9270" +"4488","2","Godines","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4488 Godines","1","0000-00-00 00:00:00","12072" +"4488","1","Flesher","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4488 Flesher","1","0000-00-00 00:00:00","9271" +"6338","4","Darner","Barb","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6338 Darner","1","0000-00-00 00:00:00","29570" +"6338","2","Wedderburn","Marline","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6338 Wedderburn","1","0000-00-00 00:00:00","29568" +"3014","1","Manganaro","Oliva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3014 Manganaro","1","0000-00-00 00:00:00","12026" +"9079","3","Lowe","Alline","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","9079 Lowe","1","0000-00-00 00:00:00","16524" +"2027","1","Callejas","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2027 Callejas","1","0000-00-00 00:00:00","12028" +"7871","3","Swarey","Liana","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7871 Swarey","1","0000-00-00 00:00:00","13956" +"7871","1","Maines","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7871 Maines","1","0000-00-00 00:00:00","11891" +"1974","4","Headrick","Vesta","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1974 Headrick","1","0000-00-00 00:00:00","12087" +"1974","3","Carlino","Shella","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1974 Carlino","1","0000-00-00 00:00:00","12086" +"4817","1","Propes","Breann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4817 Propes","1","0000-00-00 00:00:00","12031" +"2964","1","Schempp","Steve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2964 Schempp","1","0000-00-00 00:00:00","12032" +"295","3","Schreiner","Nathaniel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","295 Schreiner","1","0000-00-00 00:00:00","12873" +"4238","1","Somma","Alonzo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4238 Somma","1","0000-00-00 00:00:00","9585" +"788","3","Olaughlin","So","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","788 Olaughlin","1","0000-00-00 00:00:00","13177" +"788","1","Oquendo","Joelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","788 Oquendo","1","0000-00-00 00:00:00","11893" +"8617","4","Szabo","Jamaal","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8617 Szabo","1","0000-00-00 00:00:00","22484" +"8617","2","Spohn","Alonzo","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8617 Spohn","1","0000-00-00 00:00:00","22482" +"9416","2","Saddler","Keeley","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9416 Saddler","1","0000-00-00 00:00:00","12378" +"2806","2","Chain","Tomiko","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2806 Chain","1","0000-00-00 00:00:00","13192" +"2806","1","Hornung","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2806 Hornung","1","0000-00-00 00:00:00","12095" +"3519","1","Bicknell","Jacquelin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3519 Bicknell","1","0000-00-00 00:00:00","12366" +"4928","1","Donald","Elvera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4928 Donald","1","0000-00-00 00:00:00","12097" +"3127","1","Muck","Aide","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3127 Muck","1","0000-00-00 00:00:00","12098" +"5154","2","Darner","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5154 Darner","1","0000-00-00 00:00:00","23643" +"5154","1","Chain","Janel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5154 Chain","1","0000-00-00 00:00:00","12102" +"5454","2","Wachowiak","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5454 Wachowiak","1","0000-00-00 00:00:00","30624" +"93","2","Rowell","Madie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","93 Rowell","1","0000-00-00 00:00:00","13206" +"5298","1","Callejas","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5298 Callejas","1","0000-00-00 00:00:00","12108" +"7966","2","Dorsett","Mei","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7966 Dorsett","1","0000-00-00 00:00:00","13209" +"4538","2","Hornung","Gwyneth","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4538 Hornung","1","0000-00-00 00:00:00","13205" +"1936","2","Bertucci","Ethan","0","0","0","20","1","1","0","PC","1","0","0","0","0","1","1936 Bertucci","1","0000-00-00 00:00:00","13216" +"5482","3","Trousdale","Mechelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5482 Trousdale","1","0000-00-00 00:00:00","13221" +"5482","2","Flinchum","Craig","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5482 Flinchum","1","0000-00-00 00:00:00","7018" +"4626","1","Guidi","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","2084.28","999","0","4626 Guidi","1","0000-00-00 00:00:00","4571" +"4590","1","Deppen","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4590 Deppen","1","0000-00-00 00:00:00","12121" +"2851","2","Larkin","Larissa","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2851 Larkin","1","0000-00-00 00:00:00","13229" +"7100","2","Winchell","Lillian","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7100 Winchell","1","0000-00-00 00:00:00","16534" +"2556","1","Sachs","Bobbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2556 Sachs","1","0000-00-00 00:00:00","13163" +"2556","4","Goldsborough","Liana","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2556 Goldsborough","1","0000-00-00 00:00:00","8040" +"5391","1","Janco","Maren","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5391 Janco","1","0000-00-00 00:00:00","13239" +"2828","1","Rothman","Jaime","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2828 Rothman","1","0000-00-00 00:00:00","13242" +"4378","1","Silas","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4378 Silas","1","0000-00-00 00:00:00","13246" +"4577","3","Marston","Fairy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4577 Marston","1","0000-00-00 00:00:00","20428" +"4577","2","Tawil","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4577 Tawil","1","0000-00-00 00:00:00","20427" +"2649","2","Braley","Pricilla","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2649 Braley","1","0000-00-00 00:00:00","29869" +"2649","4","Larsen","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2649 Larsen","1","0000-00-00 00:00:00","29871" +"535","2","Burkhalter","Johnny","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","535 Burkhalter","1","0000-00-00 00:00:00","29466" +"7729","2","Manganaro","Jared","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7729 Manganaro","1","0000-00-00 00:00:00","8079" +"4596","1","Faber","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4596 Faber","1","0000-00-00 00:00:00","13260" +"4596","2","Villafane","Latoya","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4596 Villafane","1","0000-00-00 00:00:00","19312" +"7254","3","Grothe","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7254 Grothe","1","0000-00-00 00:00:00","23887" +"7254","1","Noecker","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7254 Noecker","1","0000-00-00 00:00:00","13262" +"832","2","Delee","Korey","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","832 Delee","1","0000-00-00 00:00:00","21508" +"832","4","Walborn","Season","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","832 Walborn","1","0000-00-00 00:00:00","21510" +"7556","3","Mcleroy","Rocco","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7556 Mcleroy","1","0000-00-00 00:00:00","11901" +"7556","4","Janecek","Lazaro","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7556 Janecek","1","0000-00-00 00:00:00","8087" +"1712","2","Paradiso","Calvin","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1712 Paradiso","1","0000-00-00 00:00:00","12479" +"5080","3","Callejas","Julius","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5080 Callejas","1","0000-00-00 00:00:00","30609" +"5080","1","Tyra","Rosalva","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","5080 Tyra","1","0000-00-00 00:00:00","13272" +"1579","2","Sunderland","Neil","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1579 Sunderland","1","0000-00-00 00:00:00","12215" +"3155","1","Riche","Latricia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3155 Riche","1","0000-00-00 00:00:00","8056" +"7532","2","Bratten","Lonnie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7532 Bratten","1","0000-00-00 00:00:00","18334" +"3822","1","Darner","Hermila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3822 Darner","1","0000-00-00 00:00:00","8058" +"4650","2","Noecker","Junita","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4650 Noecker","1","0000-00-00 00:00:00","12494" +"3575","1","Lary","Agnus","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3575 Lary","1","0000-00-00 00:00:00","12258" +"830","1","Petrarca","Davida","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","830 Petrarca","1","0000-00-00 00:00:00","8062" +"2503","2","Medley","Cherilyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2503 Medley","1","0000-00-00 00:00:00","12531" +"9340","2","Tidmore","Lawrence","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9340 Tidmore","1","0000-00-00 00:00:00","27917" +"3523","2","Matherne","Dannette","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3523 Matherne","1","0000-00-00 00:00:00","13288" +"3523","3","Ehrman","Octavia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3523 Ehrman","1","0000-00-00 00:00:00","13289" +"8556","2","Trigg","Madie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8556 Trigg","1","0000-00-00 00:00:00","12537" +"8556","1","Plunk","Glinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8556 Plunk","1","0000-00-00 00:00:00","8076" +"1976","2","Nall","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1976 Nall","1","0000-00-00 00:00:00","7809" +"8121","1","Kari","Veronica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8121 Kari","1","0000-00-00 00:00:00","12474" +"8461","1","Murton","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8461 Murton","1","0000-00-00 00:00:00","12510" +"1709","1","Raabe","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1709 Raabe","1","0000-00-00 00:00:00","8092" +"8879","4","Hafley","Noelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8879 Hafley","1","0000-00-00 00:00:00","12595" +"8879","1","Stahl","Hortensia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8879 Stahl","1","0000-00-00 00:00:00","8093" +"4005","1","Durand","Letisha","999.99","14.36","0","20","1","1","1","PC","1","0","0","0","999","1","4005 Durand","1","0000-00-00 00:00:00","12542" +"5213","1","Keppel","Noelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5213 Keppel","1","0000-00-00 00:00:00","12514" +"6518","2","Coppola","Eddie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6518 Coppola","1","0000-00-00 00:00:00","12599" +"6518","1","Michaels","Carola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6518 Michaels","1","0000-00-00 00:00:00","12515" +"817","4","Manganaro","Lane","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","817 Manganaro","1","0000-00-00 00:00:00","12603" +"817","2","Manganaro","Mariann","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","817 Manganaro","1","0000-00-00 00:00:00","12601" +"4450","1","Muck","Mica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4450 Muck","1","0000-00-00 00:00:00","12544" +"1754","2","Clatterbuck","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1754 Clatterbuck","1","0000-00-00 00:00:00","27088" +"1754","4","Reamer","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1754 Reamer","1","0000-00-00 00:00:00","27090" +"3984","1","Lary","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3984 Lary","1","0000-00-00 00:00:00","12548" +"5276","2","Balzer","Latricia","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5276 Balzer","1","0000-00-00 00:00:00","8998" +"306","1","Grahn","Bertha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","306 Grahn","1","0000-00-00 00:00:00","12518" +"105","2","Steffey","Johnsie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","105 Steffey","1","0000-00-00 00:00:00","9050" +"3585","2","Ellis","Jacquelin","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3585 Ellis","1","0000-00-00 00:00:00","9046" +"1952","2","Koziel","Candelaria","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1952 Koziel","1","0000-00-00 00:00:00","9051" +"1952","4","Abrahams","Juliane","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1952 Abrahams","1","0000-00-00 00:00:00","9053" +"6567","1","Zweifel","Amada","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6567 Zweifel","1","0000-00-00 00:00:00","12523" +"1708","2","Monsivais","Ericka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1708 Monsivais","1","0000-00-00 00:00:00","10944" +"1793","2","Lujan","Julene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1793 Lujan","1","0000-00-00 00:00:00","31616" +"9049","1","Hamaker","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9049 Hamaker","1","0000-00-00 00:00:00","12557" +"562","2","Ayotte","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","562 Ayotte","1","0000-00-00 00:00:00","29477" +"3056","1","Cajigas","Amelia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3056 Cajigas","1","0000-00-00 00:00:00","12529" +"3056","4","Funches","Malia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3056 Funches","1","0000-00-00 00:00:00","9122" +"4195","3","Dorsett","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4195 Dorsett","1","0000-00-00 00:00:00","20588" +"4195","2","Gains","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4195 Gains","1","0000-00-00 00:00:00","20587" +"550","3","Synder","Anne","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","550 Synder","1","0000-00-00 00:00:00","9111" +"550","1","Barhorst","Rachel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","550 Barhorst","1","0000-00-00 00:00:00","9005" +"8473","2","Hults","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8473 Hults","1","0000-00-00 00:00:00","24285" +"6056","1","Pennypacker","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6056 Pennypacker","1","0000-00-00 00:00:00","9011" +"4543","1","Arata","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4543 Arata","1","0000-00-00 00:00:00","9012" +"4543","4","Simkins","Lawrence","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4543 Simkins","1","0000-00-00 00:00:00","9130" +"5143","3","Worthey","Myrtle","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5143 Worthey","1","0000-00-00 00:00:00","29383" +"5143","1","Hornung","Lazaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5143 Hornung","1","0000-00-00 00:00:00","9014" +"8372","2","Weiler","Marketta","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8372 Weiler","1","0000-00-00 00:00:00","9136" +"4194","2","Dupuis","Amada","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4194 Dupuis","1","0000-00-00 00:00:00","15600" +"4194","1","Carlino","Danelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4194 Carlino","1","0000-00-00 00:00:00","9018" +"2414","3","Grahn","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2414 Grahn","1","0000-00-00 00:00:00","12761" +"1044","3","Marnell","Bobbi","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1044 Marnell","1","0000-00-00 00:00:00","12207" +"1044","1","Hardage","Jed","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1044 Hardage","1","0000-00-00 00:00:00","9021" +"312","1","Rothman","Billy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","312 Rothman","1","0000-00-00 00:00:00","9022" +"1191","4","Pickell","Hermine","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1191 Pickell","1","0000-00-00 00:00:00","12767" +"1191","1","Creel","Elvera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1191 Creel","1","0000-00-00 00:00:00","9024" +"2193","1","Feehan","Mica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2193 Feehan","1","0000-00-00 00:00:00","9027" +"5894","2","Weathersby","Alonzo","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5894 Weathersby","1","0000-00-00 00:00:00","12759" +"728","2","Gains","Ezekiel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","728 Gains","1","0000-00-00 00:00:00","12791" +"3326","2","Silas","Robbyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3326 Silas","1","0000-00-00 00:00:00","12774" +"5271","1","Narcisse","Marilee","999.99","47.09","12","100","1","1","1","PC","3","1","0","0","999","1","5271 Narcisse","1","0000-00-00 00:00:00","9061" +"1889","2","Aguirre","Nicole","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1889 Aguirre","1","0000-00-00 00:00:00","12797" +"3814","1","Lanier","Jadwiga","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3814 Lanier","1","0000-00-00 00:00:00","9069" +"8957","1","Vroman","Loan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8957 Vroman","1","0000-00-00 00:00:00","9071" +"6718","1","Biery","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6718 Biery","1","0000-00-00 00:00:00","9072" +"404","2","Heller","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","404 Heller","1","0000-00-00 00:00:00","29614" +"1672","1","Bilbo","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1672 Bilbo","1","0000-00-00 00:00:00","9078" +"8589","2","Sprau","Brianne","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8589 Sprau","1","0000-00-00 00:00:00","12833" +"5051","2","Finlayson","Lise","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5051 Finlayson","1","0000-00-00 00:00:00","12845" +"5038","2","Barhorst","Hermila","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5038 Barhorst","1","0000-00-00 00:00:00","12844" +"5429","2","Headrick","Ericka","999.99","0","0","20","1","0","1","PC","1","0","0","916.84","999","0","5429 Headrick","1","0000-00-00 00:00:00","4757" +"2038","2","Able","Celia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2038 Able","1","0000-00-00 00:00:00","11995" +"9577","4","Bouknight","Zachery","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9577 Bouknight","1","0000-00-00 00:00:00","12841" +"9577","1","Perro","Theron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9577 Perro","1","0000-00-00 00:00:00","9088" +"5851","3","Raske","Delaine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5851 Raske","1","0000-00-00 00:00:00","12850" +"5851","4","Bayes","Leanora","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5851 Bayes","1","0000-00-00 00:00:00","12851" +"5542","4","Vasques","Nelle","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5542 Vasques","1","0000-00-00 00:00:00","25507" +"5542","3","Leib","Latricia","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5542 Leib","1","0000-00-00 00:00:00","25506" +"4809","2","Czaja","Shante","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4809 Czaja","1","0000-00-00 00:00:00","12848" +"2261","2","Fierro","Philomena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2261 Fierro","1","0000-00-00 00:00:00","18246" +"2261","3","Oyola","Breann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2261 Oyola","1","0000-00-00 00:00:00","18247" +"1684","2","Castilleja","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1684 Castilleja","1","0000-00-00 00:00:00","22863" +"1684","4","Bilbo","Joslyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1684 Bilbo","1","0000-00-00 00:00:00","22865" +"7088","4","Bertucci","Rutha","999.99","20","0","20","1","1","1","PC","1","0","0","0","999","0","7088 Bertucci","1","0000-00-00 00:00:00","22524" +"7088","2","Conger","Leonel","999.99","20","0","20","1","1","1","PC","1","0","0","0","999","0","7088 Conger","1","0000-00-00 00:00:00","22522" +"5764","4","Defreitas","Lady","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5764 Defreitas","1","0000-00-00 00:00:00","12871" +"5764","2","Neuner","Clementine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5764 Neuner","1","0000-00-00 00:00:00","12869" +"6070","1","Kirst","Ines","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6070 Kirst","1","0000-00-00 00:00:00","12802" +"2124","1","Derose","Maxine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2124 Derose","1","0000-00-00 00:00:00","12804" +"2109","4","Able","Zane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2109 Able","1","0000-00-00 00:00:00","16403" +"2109","1","Probst","Apolonia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2109 Probst","1","0000-00-00 00:00:00","12295" +"7162","2","Band","Corrinne","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7162 Band","1","0000-00-00 00:00:00","12885" +"2795","2","Toribio","Charla","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2795 Toribio","1","0000-00-00 00:00:00","21824" +"820","1","Zander","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","820 Zander","1","0000-00-00 00:00:00","12817" +"2403","2","Botkin","Page","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2403 Botkin","1","0000-00-00 00:00:00","13367" +"5628","1","Mcglothlen","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5628 Mcglothlen","1","0000-00-00 00:00:00","12821" +"58","4","Steffey","Marchelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","58 Steffey","1","0000-00-00 00:00:00","13370" +"58","1","Reger","Craig","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","58 Reger","1","0000-00-00 00:00:00","12823" +"6128","2","Minnix","Calvin","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6128 Minnix","1","0000-00-00 00:00:00","13416" +"8389","2","Boggan","Elvera","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8389 Boggan","1","0000-00-00 00:00:00","13425" +"8389","1","Hafley","Adrien","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8389 Hafley","1","0000-00-00 00:00:00","12328" +"2077","2","Remsen","Suzie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2077 Remsen","1","0000-00-00 00:00:00","13424" +"6508","1","Kaster","Page","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6508 Kaster","1","0000-00-00 00:00:00","12827" +"3389","2","Zweifel","Gwyneth","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3389 Zweifel","1","0000-00-00 00:00:00","13429" +"8616","1","Toribio","Alvaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8616 Toribio","1","0000-00-00 00:00:00","12829" +"2407","1","Creel","Enid","999.99","20","0","20","1","1","1","PC","1","0","0","0","999","1","2407 Creel","1","0000-00-00 00:00:00","13373" +"6891","2","Ehrman","Rozella","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6891 Ehrman","1","0000-00-00 00:00:00","13442" +"6891","3","Marion","Carola","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6891 Marion","1","0000-00-00 00:00:00","13443" +"1280","1","Able","Marry","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1280 Able","1","0000-00-00 00:00:00","13376" +"7066","1","Arias","Kyle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7066 Arias","1","0000-00-00 00:00:00","13377" +"2396","1","Newby","Macy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2396 Newby","1","0000-00-00 00:00:00","13378" +"5305","1","Lheureux","Dixie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5305 Lheureux","1","0000-00-00 00:00:00","13380" +"7413","1","Baumgart","Argentina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7413 Baumgart","1","0000-00-00 00:00:00","13381" +"2118","1","Arata","Alina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2118 Arata","1","0000-00-00 00:00:00","13383" +"4115","3","Zweifel","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4115 Zweifel","1","0000-00-00 00:00:00","9637" +"4173","2","Mcpeek","Delaine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4173 Mcpeek","1","0000-00-00 00:00:00","13457" +"302","1","Pemberton","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","302 Pemberton","1","0000-00-00 00:00:00","13392" +"302","4","Mcgibbon","Noe","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","302 Mcgibbon","1","0000-00-00 00:00:00","13465" +"2243","2","Schweitzer","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2243 Schweitzer","1","0000-00-00 00:00:00","29892" +"2243","4","Snodgrass","Myrl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2243 Snodgrass","1","0000-00-00 00:00:00","29894" +"5427","2","Clatterbuck","Noreen","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5427 Clatterbuck","1","0000-00-00 00:00:00","30311" +"1513","2","Hafford","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1513 Hafford","1","0000-00-00 00:00:00","28436" +"1513","3","Hodson","Ira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1513 Hodson","1","0000-00-00 00:00:00","28437" +"3607","3","Tramble","Dortha","0","20","0","20","1","0","0","PC","1","0","0","0","0","0","3607 Tramble","1","0000-00-00 00:00:00","12969" +"3919","1","Gutman","Eldora","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3919 Gutman","1","0000-00-00 00:00:00","13401" +"499","1","Paradiso","Germaine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","499 Paradiso","1","0000-00-00 00:00:00","13403" +"499","3","Nails","Larissa","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","499 Nails","1","0000-00-00 00:00:00","12975" +"5057","1","Gutman","Jacquline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5057 Gutman","1","0000-00-00 00:00:00","13409" +"5057","4","Moses","Tim","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5057 Moses","1","0000-00-00 00:00:00","12980" +"1305","1","Caraballo","Bambi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1305 Caraballo","1","0000-00-00 00:00:00","13410" +"5983","1","Matherne","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5983 Matherne","1","0000-00-00 00:00:00","13469" +"8378","2","Giguere","Aide","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8378 Giguere","1","0000-00-00 00:00:00","12228" +"5793","4","Monsivais","Jared","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5793 Monsivais","1","0000-00-00 00:00:00","11704" +"5793","2","Biery","Carlos","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5793 Biery","1","0000-00-00 00:00:00","8469" +"4404","3","Layman","Kip","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4404 Layman","1","0000-00-00 00:00:00","13069" +"5597","1","Vasko","Dagmar","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5597 Vasko","1","0000-00-00 00:00:00","13480" +"6319","1","Babcock","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6319 Babcock","1","0000-00-00 00:00:00","13481" +"1563","2","Neuner","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1563 Neuner","1","0000-00-00 00:00:00","23505" +"1563","3","Finke","Tia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1563 Finke","1","0000-00-00 00:00:00","23506" +"1193","2","Sitzman","Stephany","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1193 Sitzman","1","0000-00-00 00:00:00","13073" +"1848","3","Derose","Marchelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1848 Derose","1","0000-00-00 00:00:00","13065" +"1848","2","Maines","Royce","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1848 Maines","1","0000-00-00 00:00:00","13064" +"1831","2","Hunsaker","Adah","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1831 Hunsaker","1","0000-00-00 00:00:00","11626" +"6759","1","Stump","Kam","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6759 Stump","1","0000-00-00 00:00:00","13487" +"6759","2","Synder","So","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6759 Synder","1","0000-00-00 00:00:00","5795" +"6198","1","Adcock","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6198 Adcock","1","0000-00-00 00:00:00","13489" +"2250","1","Sunderland","Davis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2250 Sunderland","1","0000-00-00 00:00:00","13490" +"9816","1","Capshaw","Veronica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9816 Capshaw","1","0000-00-00 00:00:00","13493" +"2159","1","Rowell","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2159 Rowell","1","0000-00-00 00:00:00","13496" +"714","1","Sedillo","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","714 Sedillo","1","0000-00-00 00:00:00","13497" +"624","3","Lamson","Mae","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","624 Lamson","1","0000-00-00 00:00:00","13091" +"624","2","Wessner","Marshall","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","624 Wessner","1","0000-00-00 00:00:00","13090" +"318","2","Synder","Earle","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","318 Synder","1","0000-00-00 00:00:00","31772" +"1817","1","Stecklein","Cruz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1817 Stecklein","1","0000-00-00 00:00:00","13501" +"2166","4","Tawil","Ruthie","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","2166 Tawil","1","0000-00-00 00:00:00","10674" +"2166","2","Heinen","Gwenda","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","2166 Heinen","1","0000-00-00 00:00:00","8369" +"5066","2","Beltrami","Larae","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5066 Beltrami","1","0000-00-00 00:00:00","13105" +"7159","1","Manzo","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7159 Manzo","1","0000-00-00 00:00:00","12963" +"7159","3","Anding","Candelaria","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7159 Anding","1","0000-00-00 00:00:00","23271" +"6180","1","Housley","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6180 Housley","1","0000-00-00 00:00:00","12989" +"9083","1","Maines","Elliott","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9083 Maines","1","0000-00-00 00:00:00","12400" +"9083","2","Lach","Shizuko","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9083 Lach","1","0000-00-00 00:00:00","29421" +"3944","1","Bellantoni","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3944 Bellantoni","1","0000-00-00 00:00:00","12992" +"5932","1","Darner","Patrick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5932 Darner","1","0000-00-00 00:00:00","12994" +"3666","1","Vasko","Elyse","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3666 Vasko","1","0000-00-00 00:00:00","13000" +"2967","3","Frith","Lane","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2967 Frith","1","0000-00-00 00:00:00","12616" +"2967","2","Mcfall","Lane","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2967 Mcfall","1","0000-00-00 00:00:00","12615" +"8279","1","Gains","Mica","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","8279 Gains","1","0000-00-00 00:00:00","13003" +"2058","3","James","Daniele","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2058 James","1","0000-00-00 00:00:00","12667" +"2700","1","Deppen","Owen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2700 Deppen","1","0000-00-00 00:00:00","13005" +"6791","2","Calo","Leah","0","0","12","0","1","0","0","PC","3","1","0","0","999","0","6791 Calo","1","0000-00-00 00:00:00","20503" +"736","2","Murton","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","736 Murton","1","0000-00-00 00:00:00","29435" +"736","4","Marnell","Theron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","736 Marnell","1","0000-00-00 00:00:00","29437" +"7791","2","Godines","Archie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7791 Godines","1","0000-00-00 00:00:00","12674" +"7791","1","Testerman","Tommye","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7791 Testerman","1","0000-00-00 00:00:00","13010" +"1892","3","Chain","Archie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1892 Chain","1","0000-00-00 00:00:00","12678" +"1892","1","Vanwagenen","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1892 Vanwagenen","1","0000-00-00 00:00:00","13012" +"917","2","Aguinaga","Isa","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","917 Aguinaga","1","0000-00-00 00:00:00","29073" +"4582","2","Howze","Romelia","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4582 Howze","1","0000-00-00 00:00:00","26690" +"2150","3","Aviles","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2150 Aviles","1","0000-00-00 00:00:00","30589" +"3733","1","Hipps","Demetrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3733 Hipps","1","0000-00-00 00:00:00","13019" +"2215","1","Tunney","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2215 Tunney","1","0000-00-00 00:00:00","13022" +"2215","2","Murton","Josefine","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2215 Murton","1","0000-00-00 00:00:00","12688" +"9024","1","Rowell","Lazaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9024 Rowell","1","0000-00-00 00:00:00","13023" +"9538","2","Pelchat","Carisa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9538 Pelchat","1","0000-00-00 00:00:00","24765" +"5817","1","Leib","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5817 Leib","1","0000-00-00 00:00:00","13025" +"5817","3","Graybeal","Summer","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5817 Graybeal","1","0000-00-00 00:00:00","9368" +"8633","1","Parisien","Leah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8633 Parisien","1","0000-00-00 00:00:00","13027" +"7390","1","Fitting","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7390 Fitting","1","0000-00-00 00:00:00","13029" +"7390","2","Daquila","Joey","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7390 Daquila","1","0000-00-00 00:00:00","12702" +"9549","1","Betton","Isabelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9549 Betton","1","0000-00-00 00:00:00","13030" +"2574","1","Szewczyk","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2574 Szewczyk","1","0000-00-00 00:00:00","13032" +"7139","3","Piccard","Elfrieda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7139 Piccard","1","0000-00-00 00:00:00","12710" +"7139","1","Kouba","Kenny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7139 Kouba","1","0000-00-00 00:00:00","13035" +"9547","1","Means","Lashawn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9547 Means","1","0000-00-00 00:00:00","13037" +"3281","2","Rozzell","Rozella","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3281 Rozzell","1","0000-00-00 00:00:00","20070" +"3281","4","Kirst","Gregorio","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3281 Kirst","1","0000-00-00 00:00:00","20072" +"1816","1","Ammann","Season","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1816 Ammann","1","0000-00-00 00:00:00","13045" +"1816","3","Paiva","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1816 Paiva","1","0000-00-00 00:00:00","12731" +"6266","2","Grubaugh","Myrtle","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","6266 Grubaugh","1","0000-00-00 00:00:00","25096" +"2593","2","Baily","Fritz","0","32.92","12","100","1","0","0","PC","3","1","0","0","999","0","2593 Baily","1","0000-00-00 00:00:00","23943" +"956","2","Elridge","Tamica","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","956 Elridge","1","0000-00-00 00:00:00","12740" +"2908","1","Sester","Maxine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2908 Sester","1","0000-00-00 00:00:00","9261" +"8093","3","Vasques","Clementine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8093 Vasques","1","0000-00-00 00:00:00","24822" +"3751","1","Headrick","Darius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3751 Headrick","1","0000-00-00 00:00:00","12747" +"3751","2","Trigg","Larissa","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3751 Trigg","1","0000-00-00 00:00:00","17835" +"983","1","Hardage","Rosalva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","983 Hardage","1","0000-00-00 00:00:00","12628" +"7431","3","Deppen","Veronica","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7431 Deppen","1","0000-00-00 00:00:00","12627" +"7431","1","Brehmer","Billy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7431 Brehmer","1","0000-00-00 00:00:00","12631" +"6","1","Stecklein","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6 Stecklein","1","0000-00-00 00:00:00","12633" +"6388","2","Gunderman","Deon","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6388 Gunderman","1","0000-00-00 00:00:00","14051" +"6388","3","Liebsch","Sheri","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6388 Liebsch","1","0000-00-00 00:00:00","14052" +"1715","3","Tippit","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1715 Tippit","1","0000-00-00 00:00:00","14064" +"1715","2","Bourbeau","Deidra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1715 Bourbeau","1","0000-00-00 00:00:00","10825" +"3547","3","Hertzler","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3547 Hertzler","1","0000-00-00 00:00:00","20929" +"6790","3","Silas","Arlene","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6790 Silas","1","0000-00-00 00:00:00","12939" +"6790","2","Bickle","Lilia","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6790 Bickle","1","0000-00-00 00:00:00","12938" +"4907","1","Boyett","Desire","999.99","0","0","20","1","1","1","PC","1","0","0","34.16","999","1","4907 Boyett","1","0000-00-00 00:00:00","1094" +"1477","1","Penland","Lashon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1477 Penland","1","0000-00-00 00:00:00","12654" +"4063","2","Headrick","Ulrike","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4063 Headrick","1","0000-00-00 00:00:00","17288" +"4063","4","Schoepp","Marc","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4063 Schoepp","1","0000-00-00 00:00:00","17290" +"5534","3","Rowell","Jule","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","5534 Rowell","1","0000-00-00 00:00:00","18259" +"1402","2","Kriger","Chet","999.99","15.57","0","20","1","1","1","PC","1","0","0","0","999","0","1402 Kriger","1","0000-00-00 00:00:00","23051" +"5540","2","Kirst","Diana","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5540 Kirst","1","0000-00-00 00:00:00","13515" +"5540","1","Quintero","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5540 Quintero","1","0000-00-00 00:00:00","12900" +"4796","2","Finke","Jamaal","0","0","0","0","1","0","0","PC","1","0","0","0","999","0","4796 Finke","1","0000-00-00 00:00:00","25431" +"3891","4","Kulesza","Madie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3891 Kulesza","1","0000-00-00 00:00:00","13522" +"3891","3","Saddler","Chantal","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3891 Saddler","1","0000-00-00 00:00:00","13521" +"414","4","Murton","Vesta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","414 Murton","1","0000-00-00 00:00:00","17219" +"414","2","Paull","Loan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","414 Paull","1","0000-00-00 00:00:00","17217" +"4864","1","Oyola","Cathey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4864 Oyola","1","0000-00-00 00:00:00","12907" +"5123","1","Brehmer","Sheena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5123 Brehmer","1","0000-00-00 00:00:00","12908" +"8895","3","Flesher","Luther","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8895 Flesher","1","0000-00-00 00:00:00","13538" +"6643","2","Leib","Violette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6643 Leib","1","0000-00-00 00:00:00","25250" +"6643","4","Ellis","Hai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6643 Ellis","1","0000-00-00 00:00:00","25252" +"5311","2","Hickman","Johnny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5311 Hickman","1","0000-00-00 00:00:00","23576" +"5311","3","Trafton","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5311 Trafton","1","0000-00-00 00:00:00","23577" +"672","1","Trafton","Maurice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","672 Trafton","1","0000-00-00 00:00:00","12913" +"1705","1","Pemberton","Estella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1705 Pemberton","1","0000-00-00 00:00:00","12915" +"1857","3","Saddler","Theo","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1857 Saddler","1","0000-00-00 00:00:00","13588" +"1857","4","Scurry","Harrison","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1857 Scurry","1","0000-00-00 00:00:00","13589" +"2019","1","Pelham","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2019 Pelham","1","0000-00-00 00:00:00","12917" +"3203","1","Anding","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3203 Anding","1","0000-00-00 00:00:00","12920" +"3203","4","Nichol","Dixie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3203 Nichol","1","0000-00-00 00:00:00","18556" +"5612","1","Pickell","Korey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5612 Pickell","1","0000-00-00 00:00:00","12921" +"1645","1","Dobson","Gwyneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1645 Dobson","1","0000-00-00 00:00:00","12925" +"741","1","Bagg","Bobbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","741 Bagg","1","0000-00-00 00:00:00","12928" +"9760","3","Maines","Dianna","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9760 Maines","1","0000-00-00 00:00:00","30269" +"9760","4","Godines","Rozella","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9760 Godines","1","0000-00-00 00:00:00","30270" +"6386","3","Giffen","Darius","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6386 Giffen","1","0000-00-00 00:00:00","13619" +"6386","2","Rozzell","Larae","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6386 Rozzell","1","0000-00-00 00:00:00","13618" +"5816","3","Capshaw","Robbi","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5816 Capshaw","1","0000-00-00 00:00:00","13622" +"5816","1","Pelaez","Cristina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5816 Pelaez","1","0000-00-00 00:00:00","12933" +"4883","3","Hord","Aide","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4883 Hord","1","0000-00-00 00:00:00","13187" +"2540","1","Ehrman","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2540 Ehrman","1","0000-00-00 00:00:00","13546" +"98","2","Coache","Earle","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","98 Coache","1","0000-00-00 00:00:00","13640" +"668","1","Mcpeek","Veronica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","668 Mcpeek","1","0000-00-00 00:00:00","13550" +"6876","1","Perron","Sage","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6876 Perron","1","0000-00-00 00:00:00","13551" +"405","1","Sachs","Chet","999.99","14.56","0","20","1","1","1","PC","1","0","0","0","999","0","405 Sachs","1","0000-00-00 00:00:00","13554" +"2910","3","Spitz","Davida","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2910 Spitz","1","0000-00-00 00:00:00","14082" +"2910","1","Derosa","So","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2910 Derosa","1","0000-00-00 00:00:00","13555" +"2248","1","Baily","Lise","999.99","0","0","20","1","1","1","PC","1","0","0","2735.64","999","0","2248 Baily","1","0000-00-00 00:00:00","3349" +"3924","2","Piccard","Loreta","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3924 Piccard","1","0000-00-00 00:00:00","14079" +"1442","1","Snodgrass","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1442 Snodgrass","1","0000-00-00 00:00:00","13564" +"1630","1","Leight","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1630 Leight","1","0000-00-00 00:00:00","13566" +"1756","1","Settles","Daniele","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1756 Settles","1","0000-00-00 00:00:00","13569" +"5718","1","Labree","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5718 Labree","1","0000-00-00 00:00:00","13571" +"773","1","Mattia","Romelia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","773 Mattia","1","0000-00-00 00:00:00","13573" +"773","2","Plunk","Myrl","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","773 Plunk","1","0000-00-00 00:00:00","28624" +"1830","3","Marion","Refugio","999.99","0","0","20","1","1","1","PC","1","0","0","343.5","999","0","1830 Marion","1","0000-00-00 00:00:00","21794" +"1440","2","Peveto","Fritz","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1440 Peveto","1","0000-00-00 00:00:00","14108" +"4496","1","Deshaies","Jestine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4496 Deshaies","1","0000-00-00 00:00:00","13581" +"5368","2","Bouknight","Kirstin","0","20","0","20","1","0","0","PC","1","0","0","0","999","0","5368 Bouknight","1","0000-00-00 00:00:00","25039" +"3058","2","Getz","Brittani","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3058 Getz","1","0000-00-00 00:00:00","14118" +"3950","1","Testerman","Mikel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3950 Testerman","1","0000-00-00 00:00:00","13649" +"1581","2","Wilmes","Breann","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1581 Wilmes","1","0000-00-00 00:00:00","13303" +"275","3","Fortin","Mandy","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","275 Fortin","1","0000-00-00 00:00:00","13312" +"275","2","Lone","Tammi","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","275 Lone","1","0000-00-00 00:00:00","13311" +"8705","1","Atwell","Mei","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8705 Atwell","1","0000-00-00 00:00:00","13660" +"3971","1","Flinchum","Liana","999.99","10.8","12","50","1","1","1","PC","3","1","0","0","999","0","3971 Flinchum","1","0000-00-00 00:00:00","13663" +"1263","2","Tyra","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1263 Tyra","1","0000-00-00 00:00:00","25475" +"7795","1","Kort","Boyd","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7795 Kort","1","0000-00-00 00:00:00","13665" +"7795","2","Oquendo","Lashon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7795 Oquendo","1","0000-00-00 00:00:00","30754" +"8029","2","Simons","Carmelita","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8029 Simons","1","0000-00-00 00:00:00","18264" +"8124","1","Heller","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8124 Heller","1","0000-00-00 00:00:00","13719" +"2123","1","Howze","Collene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2123 Howze","1","0000-00-00 00:00:00","13670" +"2123","4","Funderburke","Marry","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2123 Funderburke","1","0000-00-00 00:00:00","3721" +"9768","1","Mcleod","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9768 Mcleod","1","0000-00-00 00:00:00","13671" +"6460","3","Ater","Earleen","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6460 Ater","1","0000-00-00 00:00:00","22456" +"6460","4","Dantin","Josefine","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6460 Dantin","1","0000-00-00 00:00:00","22457" +"600","2","Hennings","Eldora","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","600 Hennings","1","0000-00-00 00:00:00","13361" +"551","1","Zahn","Carmine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","551 Zahn","1","0000-00-00 00:00:00","13723" +"551","2","Heise","Clint","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","551 Heise","1","0000-00-00 00:00:00","13686" +"3118","1","Ro","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3118 Ro","1","0000-00-00 00:00:00","13675" +"2131","2","Bakley","Nelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2131 Bakley","1","0000-00-00 00:00:00","16678" +"2131","1","Parada","Rivka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2131 Parada","1","0000-00-00 00:00:00","13324" +"3393","2","Arias","Maria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3393 Arias","1","0000-00-00 00:00:00","26404" +"3393","3","Perro","Barb","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3393 Perro","1","0000-00-00 00:00:00","26405" +"5468","3","Rothman","Zachery","999.99","13.8","0","0","1","1","1","INACT","0","0","0","0","999","0","5468 Rothman","1","0000-00-00 00:00:00","20161" +"5468","1","Parrales","Joette","999.99","13.8","0","20","1","1","1","PC","1","0","0","0","999","0","5468 Parrales","1","0000-00-00 00:00:00","13327" +"5799","2","Vandenbosch","Huey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5799 Vandenbosch","1","0000-00-00 00:00:00","25444" +"538","2","Sunderland","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","538 Sunderland","1","0000-00-00 00:00:00","17870" +"545","1","Faber","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","545 Faber","1","0000-00-00 00:00:00","13724" +"7437","1","Rafael","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7437 Rafael","1","0000-00-00 00:00:00","13330" +"7437","2","Suen","Season","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7437 Suen","1","0000-00-00 00:00:00","18801" +"3739","1","Cutchin","Chet","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3739 Cutchin","1","0000-00-00 00:00:00","13333" +"6728","1","Babcock","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6728 Babcock","1","0000-00-00 00:00:00","13682" +"3046","3","Perro","Cherilyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3046 Perro","1","0000-00-00 00:00:00","13760" +"5882","1","Timlin","Aide","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5882 Timlin","1","0000-00-00 00:00:00","13725" +"754","1","Derose","Mariann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","754 Derose","1","0000-00-00 00:00:00","13335" +"6086","3","Owsley","Danae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6086 Owsley","1","0000-00-00 00:00:00","21395" +"8304","2","Castille","Hai","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8304 Castille","1","0000-00-00 00:00:00","13765" +"5032","4","Marion","Haley","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5032 Marion","1","0000-00-00 00:00:00","13768" +"5032","2","Palmatier","Roseann","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5032 Palmatier","1","0000-00-00 00:00:00","13766" +"1880","1","Jepsen","Junita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1880 Jepsen","1","0000-00-00 00:00:00","13341" +"3708","1","Kriger","Catina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3708 Kriger","1","0000-00-00 00:00:00","13342" +"525","1","Saddler","Verdell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","525 Saddler","1","0000-00-00 00:00:00","13731" +"3886","2","Band","Elinore","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","3886 Band","1","0000-00-00 00:00:00","19111" +"53","1","Tardiff","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","53 Tardiff","1","0000-00-00 00:00:00","7430" +"3941","3","Raver","Enid","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3941 Raver","1","0000-00-00 00:00:00","17213" +"9160","2","Snodgrass","Venetta","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9160 Snodgrass","1","0000-00-00 00:00:00","13789" +"2870","1","Hough","Valorie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2870 Hough","1","0000-00-00 00:00:00","13741" +"2870","2","Mcglothlen","Nicole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2870 Mcglothlen","1","0000-00-00 00:00:00","19642" +"8420","1","Lujan","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8420 Lujan","1","0000-00-00 00:00:00","13743" +"8420","2","Creel","Venetta","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8420 Creel","1","0000-00-00 00:00:00","13798" +"6085","1","Fuell","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6085 Fuell","1","0000-00-00 00:00:00","13745" +"6493","2","Gargiulo","Hortensia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6493 Gargiulo","1","0000-00-00 00:00:00","22707" +"6493","4","Feehan","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6493 Feehan","1","0000-00-00 00:00:00","22709" +"2972","3","Simms","Tommye","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2972 Simms","1","0000-00-00 00:00:00","13851" +"2972","1","Holleman","Estella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2972 Holleman","1","0000-00-00 00:00:00","13749" +"4200","3","Hickman","Beverlee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4200 Hickman","1","0000-00-00 00:00:00","27297" +"4200","1","Hennings","Joaquina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4200 Hennings","1","0000-00-00 00:00:00","13750" +"3469","1","Godines","Gino","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","3469 Godines","1","0000-00-00 00:00:00","13751" +"2626","1","Ridings","Agnus","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2626 Ridings","1","0000-00-00 00:00:00","13710" +"5937","1","Lapham","Lai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5937 Lapham","1","0000-00-00 00:00:00","13753" +"1643","2","Chain","Joey","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1643 Chain","1","0000-00-00 00:00:00","13866" +"6866","1","Cruzado","Josefine","999.99","0","0","20","1","1","1","PC","1","0","0","1040.16","999","1","6866 Cruzado","1","0000-00-00 00:00:00","2782" +"9735","2","Raske","Haley","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9735 Raske","1","0000-00-00 00:00:00","13874" +"8383","2","Shoe","Eldora","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8383 Shoe","1","0000-00-00 00:00:00","13875" +"8383","1","Fortin","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8383 Fortin","1","0000-00-00 00:00:00","13715" +"5822","1","Marston","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5822 Marston","1","0000-00-00 00:00:00","13811" +"3621","1","Weishaar","Lovetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3621 Weishaar","1","0000-00-00 00:00:00","13812" +"63","1","Graybeal","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","63 Graybeal","1","0000-00-00 00:00:00","13815" +"1623","1","Balzer","Beverlee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1623 Balzer","1","0000-00-00 00:00:00","13817" +"5435","1","Hassinger","Larae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5435 Hassinger","1","0000-00-00 00:00:00","13821" +"6328","3","Andresen","Adah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6328 Andresen","1","0000-00-00 00:00:00","26721" +"6328","2","Salvo","Lorriane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6328 Salvo","1","0000-00-00 00:00:00","26720" +"3266","4","Ratti","Kam","0","0","0","0","1","0","0","PC","1","0","0","0","0","0","3266 Ratti","1","0000-00-00 00:00:00","13914" +"3266","1","Braley","Shavon","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","0","3266 Braley","1","0000-00-00 00:00:00","13827" +"993","4","Severe","Zane","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","993 Severe","1","0000-00-00 00:00:00","13959" +"993","2","Lowe","Charla","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","993 Lowe","1","0000-00-00 00:00:00","13957" +"1689","2","Maines","Samual","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1689 Maines","1","0000-00-00 00:00:00","29995" +"1653","1","Simkins","Mikel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1653 Simkins","1","0000-00-00 00:00:00","13835" +"37","2","Osman","Steve","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","37 Osman","1","0000-00-00 00:00:00","21114" +"5717","1","Cutchin","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5717 Cutchin","1","0000-00-00 00:00:00","13841" +"5902","2","Deshaies","Amada","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5902 Deshaies","1","0000-00-00 00:00:00","9144" +"3244","1","Derosa","Kandice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3244 Derosa","1","0000-00-00 00:00:00","13847" +"8165","1","Hornung","Latricia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8165 Hornung","1","0000-00-00 00:00:00","13916" +"9226","3","Perron","Barbera","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9226 Perron","1","0000-00-00 00:00:00","9150" +"9226","2","Chaves","Lemuel","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9226 Chaves","1","0000-00-00 00:00:00","9149" +"1409","3","Ming","Jack","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1409 Ming","1","0000-00-00 00:00:00","21587" +"1409","2","Hipps","Rhona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1409 Hipps","1","0000-00-00 00:00:00","21586" +"3474","2","Hafley","Inez","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3474 Hafley","1","0000-00-00 00:00:00","22292" +"1508","2","Parisien","Luna","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1508 Parisien","1","0000-00-00 00:00:00","9158" +"1067","1","Sweat","Florrie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1067 Sweat","1","0000-00-00 00:00:00","13925" +"3701","2","Furlong","Lizeth","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3701 Furlong","1","0000-00-00 00:00:00","9163" +"9328","1","Darwin","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","3488.44","999","0","9328 Darwin","1","0000-00-00 00:00:00","5787" +"7547","3","Derose","Arron","999.99","0","0","0","0","1","1","REG","0","0","0","0","999","0","7547 Derose","1","0000-00-00 00:00:00","31124" +"7547","1","Davisson","Slyvia","999.99","0","0","0","0","1","1","REG","0","0","0","0","999","0","7547 Davisson","1","0000-00-00 00:00:00","13930" +"9417","2","Fitting","Hulda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9417 Fitting","1","0000-00-00 00:00:00","9171" +"4711","1","Hix","Sarai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4711 Hix","1","0000-00-00 00:00:00","13934" +"4711","3","Claussen","Delila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4711 Claussen","1","0000-00-00 00:00:00","16185" +"570","1","Furlong","Celia","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","570 Furlong","1","0000-00-00 00:00:00","13936" +"570","3","Singletary","Maxine","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","570 Singletary","1","0000-00-00 00:00:00","23849" +"1164","2","Plouffe","Augusta","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1164 Plouffe","1","0000-00-00 00:00:00","11749" +"5538","2","Shoe","Annalee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5538 Shoe","1","0000-00-00 00:00:00","22952" +"5538","3","Komar","Augusta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5538 Komar","1","0000-00-00 00:00:00","22953" +"9011","2","Broderson","Keneth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9011 Broderson","1","0000-00-00 00:00:00","25610" +"9950","2","Chaves","Dianna","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9950 Chaves","1","0000-00-00 00:00:00","26" +"7204","1","Wynkoop","Joette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7204 Wynkoop","1","0000-00-00 00:00:00","13950" +"579","1","Bagg","Anika","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","579 Bagg","1","0000-00-00 00:00:00","13953" +"579","2","Castilleja","Sonia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","579 Castilleja","1","0000-00-00 00:00:00","2947" +"1678","3","Mowen","Dianna","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","1678 Mowen","1","0000-00-00 00:00:00","27595" +"666","2","Flesher","Elfrieda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","666 Flesher","1","0000-00-00 00:00:00","24662" +"9225","2","Hardage","Mellie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9225 Hardage","1","0000-00-00 00:00:00","21719" +"9225","4","Stockard","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9225 Stockard","1","0000-00-00 00:00:00","21721" +"1562","2","Pennell","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","64.51","999","1","1562 Pennell","1","0000-00-00 00:00:00","4717" +"2132","2","Marnell","Owen","0","6","0","20","1","0","0","PC","1","0","0","0","0","1","2132 Marnell","1","0000-00-00 00:00:00","11947" +"3983","3","Vroman","Eldora","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3983 Vroman","1","0000-00-00 00:00:00","10385" +"3983","2","Sledge","Jarvis","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3983 Sledge","1","0000-00-00 00:00:00","7234" +"2105","3","Flinchum","Alline","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2105 Flinchum","1","0000-00-00 00:00:00","14577" +"116","1","Osman","Darrin","999.99","6.62","0","20","1","1","1","PC","1","0","0","0","999","0","116 Osman","1","0000-00-00 00:00:00","9188" +"116","3","Woodfin","Julene","999.99","6.62","0","20","1","1","1","PC","1","0","0","0","999","0","116 Woodfin","1","0000-00-00 00:00:00","27517" +"4525","1","Chaves","Jodie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4525 Chaves","1","0000-00-00 00:00:00","9190" +"1277","1","Vaughns","Tobias","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1277 Vaughns","1","0000-00-00 00:00:00","9199" +"5539","1","Poplar","Josie","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","5539 Poplar","1","0000-00-00 00:00:00","9201" +"1501","3","Dillenbeck","Nathaniel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1501 Dillenbeck","1","0000-00-00 00:00:00","26215" +"3786","2","Baily","Gwyneth","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3786 Baily","1","0000-00-00 00:00:00","12159" +"7671","2","Riche","So","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7671 Riche","1","0000-00-00 00:00:00","24271" +"6536","2","Osman","Venetta","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6536 Osman","1","0000-00-00 00:00:00","14229" +"9056","4","Hassinger","Teodoro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9056 Hassinger","1","0000-00-00 00:00:00","19843" +"9056","1","Timlin","Lorriane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9056 Timlin","1","0000-00-00 00:00:00","14195" +"701","2","Pendergrass","Carlos","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","701 Pendergrass","1","0000-00-00 00:00:00","14231" +"701","4","Schempp","Alonzo","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","701 Schempp","1","0000-00-00 00:00:00","12164" +"483","2","Alsobrook","Gina","0","18.15","0","20","1","0","0","PC","1","0","0","0","999","1","483 Alsobrook","1","0000-00-00 00:00:00","25531" +"483","3","Salvo","Lady","0","18.15","0","20","1","0","0","PC","1","0","0","0","999","1","483 Salvo","1","0000-00-00 00:00:00","25532" +"5049","1","Larkin","Desire","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5049 Larkin","1","0000-00-00 00:00:00","14200" +"8884","2","Darwin","Cathey","999.99","0","0","20","1","1","1","PC","1","0","0","1832.06","999","0","8884 Darwin","1","0000-00-00 00:00:00","3931" +"7842","2","Hord","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7842 Hord","1","0000-00-00 00:00:00","24624" +"2036","3","Bagg","Eldora","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2036 Bagg","1","0000-00-00 00:00:00","14279" +"2036","2","Gutman","Angelina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2036 Gutman","1","0000-00-00 00:00:00","14278" +"9274","2","Gunderman","Kortney","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9274 Gunderman","1","0000-00-00 00:00:00","21584" +"9274","1","Mcelvain","Noreen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9274 Mcelvain","1","0000-00-00 00:00:00","12166" +"8403","2","Hankerson","Hulda","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8403 Hankerson","1","0000-00-00 00:00:00","26887" +"7311","2","Singletary","Art","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7311 Singletary","1","0000-00-00 00:00:00","24175" +"4722","3","Darner","Darius","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4722 Darner","1","0000-00-00 00:00:00","28875" +"4722","2","Mueller","Gaylord","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4722 Mueller","1","0000-00-00 00:00:00","28874" +"6302","2","Reger","Leah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6302 Reger","1","0000-00-00 00:00:00","27010" +"6222","3","Band","Jacklyn","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6222 Band","1","0000-00-00 00:00:00","23893" +"6222","1","Zaccaria","Svetlana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6222 Zaccaria","1","0000-00-00 00:00:00","14242" +"2727","1","Irwin","Kortney","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2727 Irwin","1","0000-00-00 00:00:00","14245" +"6625","3","Milian","Renato","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6625 Milian","1","0000-00-00 00:00:00","16980" +"6625","1","Kirst","Chantal","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6625 Kirst","1","0000-00-00 00:00:00","14246" +"7145","1","Riffel","Destiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7145 Riffel","1","0000-00-00 00:00:00","14247" +"3614","3","Martines","Trinh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3614 Martines","1","0000-00-00 00:00:00","21367" +"2405","2","Matherne","Fritz","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2405 Matherne","1","0000-00-00 00:00:00","19237" +"2405","3","Dietrick","Carmine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2405 Dietrick","1","0000-00-00 00:00:00","19238" +"4797","2","Plunk","Charla","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4797 Plunk","1","0000-00-00 00:00:00","24034" +"7650","2","Creason","Shonda","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7650 Creason","1","0000-00-00 00:00:00","26790" +"7650","3","Simkins","Art","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7650 Simkins","1","0000-00-00 00:00:00","26791" +"673","3","Jun","Romelia","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","673 Jun","1","0000-00-00 00:00:00","14385" +"673","1","Trigg","Lisbeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","673 Trigg","1","0000-00-00 00:00:00","14264" +"1499","3","Acklin","Samual","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1499 Acklin","1","0000-00-00 00:00:00","23012" +"1499","1","Marion","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1499 Marion","1","0000-00-00 00:00:00","14315" +"1741","2","Barefield","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1741 Barefield","1","0000-00-00 00:00:00","20153" +"1741","1","Harpole","Carisa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1741 Harpole","1","0000-00-00 00:00:00","14317" +"8621","2","Saldivar","Arlene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8621 Saldivar","1","0000-00-00 00:00:00","28248" +"1551","3","Schreiner","Korey","999.99","0","0","20","1","1","1","PC","1","0","0","1336.45","999","0","1551 Schreiner","1","0000-00-00 00:00:00","25957" +"1551","1","Osman","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","1336.45","999","0","1551 Osman","1","0000-00-00 00:00:00","2701" +"1453","1","Minnix","Latoya","999.99","5.16","0","20","1","1","1","PC","1","0","0","0","999","0","1453 Minnix","1","0000-00-00 00:00:00","14319" +"2188","1","Graybeal","Madie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2188 Graybeal","1","0000-00-00 00:00:00","14320" +"7220","1","Starr","Maxine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7220 Starr","1","0000-00-00 00:00:00","14324" +"5752","1","Hord","Art","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5752 Hord","1","0000-00-00 00:00:00","14325" +"5752","2","Derose","Chong","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5752 Derose","1","0000-00-00 00:00:00","9933" +"1686","1","Bertucci","Nellie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1686 Bertucci","1","0000-00-00 00:00:00","14327" +"1686","2","Faul","Charla","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1686 Faul","1","0000-00-00 00:00:00","9935" +"1703","1","Bakley","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1703 Bakley","1","0000-00-00 00:00:00","14330" +"1703","2","Steven","Magan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1703 Steven","1","0000-00-00 00:00:00","24833" +"2376","1","Maestas","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2376 Maestas","1","0000-00-00 00:00:00","14331" +"2376","3","Rudd","Tierra","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2376 Rudd","1","0000-00-00 00:00:00","10100" +"8893","1","Rippey","Katrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8893 Rippey","1","0000-00-00 00:00:00","14333" +"8893","4","Harpole","Eldridge","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8893 Harpole","1","0000-00-00 00:00:00","29591" +"9003","2","Nowland","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9003 Nowland","1","0000-00-00 00:00:00","22986" +"9003","4","Trousdale","Marchelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9003 Trousdale","1","0000-00-00 00:00:00","22988" +"635","2","Sweat","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","635 Sweat","1","0000-00-00 00:00:00","24505" +"635","1","Suen","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","635 Suen","1","0000-00-00 00:00:00","14335" +"5989","2","Beaulieu","Danae","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5989 Beaulieu","1","0000-00-00 00:00:00","12334" +"5989","4","Lehrer","Florrie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5989 Lehrer","1","0000-00-00 00:00:00","10112" +"5440","2","Murton","Teressa","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5440 Murton","1","0000-00-00 00:00:00","10119" +"3996","2","Capshaw","Diana","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3996 Capshaw","1","0000-00-00 00:00:00","7499" +"8934","1","Friedt","Van","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8934 Friedt","1","0000-00-00 00:00:00","14347" +"5758","1","Derose","Elane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5758 Derose","1","0000-00-00 00:00:00","14349" +"5344","1","Faul","Lonna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5344 Faul","1","0000-00-00 00:00:00","14350" +"5344","4","Tardiff","Rosalva","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5344 Tardiff","1","0000-00-00 00:00:00","14402" +"3339","2","Szewczyk","Christi","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3339 Szewczyk","1","0000-00-00 00:00:00","25578" +"4065","3","Zaccaria","Katrina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4065 Zaccaria","1","0000-00-00 00:00:00","31172" +"4065","2","Mitcham","Robbi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4065 Mitcham","1","0000-00-00 00:00:00","31171" +"5151","3","Delee","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5151 Delee","1","0000-00-00 00:00:00","14405" +"5151","1","Birch","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5151 Birch","1","0000-00-00 00:00:00","7500" +"8147","1","Weathersby","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8147 Weathersby","1","0000-00-00 00:00:00","12336" +"2614","1","Paiva","Buddy","999.99","0","0","20","1","1","1","PC","1","0","0","856.87","999","0","2614 Paiva","1","0000-00-00 00:00:00","4583" +"3492","2","Kari","Shondra","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3492 Kari","1","0000-00-00 00:00:00","14414" +"2452","1","Blais","Latisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2452 Blais","1","0000-00-00 00:00:00","12351" +"7896","1","Valdez","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7896 Valdez","1","0000-00-00 00:00:00","12354" +"9565","1","Jules","Nicole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9565 Jules","1","0000-00-00 00:00:00","12358" +"2275","2","Voges","Boyd","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2275 Voges","1","0000-00-00 00:00:00","14427" +"2275","1","Kouba","Sherice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2275 Kouba","1","0000-00-00 00:00:00","12365" +"2902","1","Liu","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2902 Liu","1","0000-00-00 00:00:00","12375" +"9126","1","Ensey","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9126 Ensey","1","0000-00-00 00:00:00","12381" +"5981","3","Marion","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5981 Marion","1","0000-00-00 00:00:00","23737" +"5981","2","Propes","Breann","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5981 Propes","1","0000-00-00 00:00:00","23736" +"9746","3","Sweigart","Noreen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9746 Sweigart","1","0000-00-00 00:00:00","25833" +"9746","1","Haggerty","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9746 Haggerty","1","0000-00-00 00:00:00","10126" +"3239","2","Ellis","Gene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3239 Ellis","1","0000-00-00 00:00:00","28167" +"6053","1","Hellmann","Moira","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6053 Hellmann","1","0000-00-00 00:00:00","12387" +"5545","2","Pennell","Lillian","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5545 Pennell","1","0000-00-00 00:00:00","14486" +"7291","3","Reamer","Mariann","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","7291 Reamer","1","0000-00-00 00:00:00","23248" +"7291","2","Stahl","Lino","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","7291 Stahl","1","0000-00-00 00:00:00","23247" +"5619","2","Milian","Ingeborg","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5619 Milian","1","0000-00-00 00:00:00","14496" +"5619","1","Spier","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5619 Spier","1","0000-00-00 00:00:00","12399" +"4636","3","Mumper","Anne","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4636 Mumper","1","0000-00-00 00:00:00","14499" +"4636","1","Grahn","Geraldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4636 Grahn","1","0000-00-00 00:00:00","10132" +"3002","1","Marston","Karlene","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","3002 Marston","1","0000-00-00 00:00:00","10133" +"9559","1","Ridings","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9559 Ridings","1","0000-00-00 00:00:00","14433" +"5485","2","Kulesza","Violette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5485 Kulesza","1","0000-00-00 00:00:00","23265" +"2175","1","Clatterbuck","Alonzo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2175 Clatterbuck","1","0000-00-00 00:00:00","14435" +"4912","1","Penland","Ulrike","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4912 Penland","1","0000-00-00 00:00:00","14437" +"4912","4","Ming","Ida","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4912 Ming","1","0000-00-00 00:00:00","19134" +"6531","2","Burkhalter","Anne","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6531 Burkhalter","1","0000-00-00 00:00:00","14510" +"7497","1","Betton","Dennise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7497 Betton","1","0000-00-00 00:00:00","14441" +"7497","3","Paradiso","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7497 Paradiso","1","0000-00-00 00:00:00","30595" +"1870","1","Baily","Melonie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1870 Baily","1","0000-00-00 00:00:00","14443" +"777","2","Brehmer","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","777 Brehmer","1","0000-00-00 00:00:00","15464" +"6506","1","Trigg","Peggy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6506 Trigg","1","0000-00-00 00:00:00","14445" +"3778","1","Kaster","Pei","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3778 Kaster","1","0000-00-00 00:00:00","14446" +"3418","1","Kirst","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3418 Kirst","1","0000-00-00 00:00:00","14447" +"2484","4","Nowlen","Raven","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2484 Nowlen","1","0000-00-00 00:00:00","14525" +"2484","2","Haverly","Hortensia","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2484 Haverly","1","0000-00-00 00:00:00","1155" +"585","1","Schweitzer","Towanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","585 Schweitzer","1","0000-00-00 00:00:00","14449" +"4399","3","Sunderland","Eldridge","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4399 Sunderland","1","0000-00-00 00:00:00","14527" +"4399","1","Barhorst","Amelia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4399 Barhorst","1","0000-00-00 00:00:00","14450" +"1797","1","Sachs","Jodie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1797 Sachs","1","0000-00-00 00:00:00","14451" +"2204","1","Muck","Felicitas","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2204 Muck","1","0000-00-00 00:00:00","14452" +"6812","4","Plouffe","Myrl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6812 Plouffe","1","0000-00-00 00:00:00","22964" +"6812","3","Osman","Serafina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6812 Osman","1","0000-00-00 00:00:00","22963" +"2195","1","Noecker","Dixie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2195 Noecker","1","0000-00-00 00:00:00","14455" +"2195","4","Medley","Maxine","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2195 Medley","1","0000-00-00 00:00:00","14575" +"1753","1","Dyke","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1753 Dyke","1","0000-00-00 00:00:00","14458" +"7260","2","Alessi","Pei","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7260 Alessi","1","0000-00-00 00:00:00","14581" +"3767","1","Bratten","Juliane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3767 Bratten","1","0000-00-00 00:00:00","14463" +"8150","2","Aguirre","Boyd","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8150 Aguirre","1","0000-00-00 00:00:00","14586" +"4915","1","Neuner","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4915 Neuner","1","0000-00-00 00:00:00","14467" +"4915","3","Coache","Breann","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","4915 Coache","1","0000-00-00 00:00:00","27818" +"3821","2","Zweifel","Alina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3821 Zweifel","1","0000-00-00 00:00:00","23487" +"3821","1","Gains","Celia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3821 Gains","1","0000-00-00 00:00:00","14468" +"2057","1","Wilmes","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2057 Wilmes","1","0000-00-00 00:00:00","14469" +"2057","2","Peltier","Gwenda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2057 Peltier","1","0000-00-00 00:00:00","27883" +"1104","2","Lamson","Valorie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1104 Lamson","1","0000-00-00 00:00:00","14650" +"3298","3","Titsworth","Elfrieda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3298 Titsworth","1","0000-00-00 00:00:00","14652" +"3298","2","Palmatier","Reva","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3298 Palmatier","1","0000-00-00 00:00:00","14651" +"3059","2","Stecklein","Lina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3059 Stecklein","1","0000-00-00 00:00:00","14654" +"5642","2","Haar","Kenny","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5642 Haar","1","0000-00-00 00:00:00","14657" +"2334","2","Capshaw","Roseann","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2334 Capshaw","1","0000-00-00 00:00:00","14664" +"2334","4","Weimar","Jacquelin","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2334 Weimar","1","0000-00-00 00:00:00","14666" +"3647","1","Funderburke","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3647 Funderburke","1","0000-00-00 00:00:00","14543" +"3856","4","Perro","Cristina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3856 Perro","1","0000-00-00 00:00:00","31040" +"3856","3","Tardiff","Zachery","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3856 Tardiff","1","0000-00-00 00:00:00","31039" +"2439","2","Manganaro","Carola","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","0","2439 Manganaro","1","0000-00-00 00:00:00","30936" +"2439","4","Swarey","Royce","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","0","2439 Swarey","1","0000-00-00 00:00:00","30938" +"5295","1","Escalante","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5295 Escalante","1","0000-00-00 00:00:00","14548" +"108","2","Mollett","Caryl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","108 Mollett","1","0000-00-00 00:00:00","22648" +"2176","1","Janecek","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2176 Janecek","1","0000-00-00 00:00:00","14552" +"6448","2","Mcburney","Carol","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6448 Mcburney","1","0000-00-00 00:00:00","14687" +"2245","2","Bourbeau","Zoila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2245 Bourbeau","1","0000-00-00 00:00:00","23654" +"2687","1","Hassinger","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2687 Hassinger","1","0000-00-00 00:00:00","14556" +"2687","3","Palmatier","Magan","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2687 Palmatier","1","0000-00-00 00:00:00","14690" +"5543","2","Eichler","Shonda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5543 Eichler","1","0000-00-00 00:00:00","14692" +"1025","2","Salvo","Retha","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1025 Salvo","1","0000-00-00 00:00:00","14693" +"2179","1","Frith","Slyvia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2179 Frith","1","0000-00-00 00:00:00","14560" +"5082","2","Mcgibbon","Corrinne","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5082 Mcgibbon","1","0000-00-00 00:00:00","14696" +"2690","1","Aguinaga","Odell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2690 Aguinaga","1","0000-00-00 00:00:00","14563" +"4970","3","Ammann","Marchelle","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4970 Ammann","1","0000-00-00 00:00:00","20100" +"4970","2","Propes","Magan","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4970 Propes","1","0000-00-00 00:00:00","20099" +"5609","3","James","Ray","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5609 James","1","0000-00-00 00:00:00","14710" +"5609","4","Bohn","Darrin","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5609 Bohn","1","0000-00-00 00:00:00","2171" +"905","1","Titsworth","Renato","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","905 Titsworth","1","0000-00-00 00:00:00","14605" +"4364","3","Raske","Sabina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4364 Raske","1","0000-00-00 00:00:00","24020" +"4364","1","Bouknight","Joey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4364 Bouknight","1","0000-00-00 00:00:00","14607" +"8224","1","Nails","Ramiro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8224 Nails","1","0000-00-00 00:00:00","14609" +"1061","1","Scheidegger","So","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1061 Scheidegger","1","0000-00-00 00:00:00","14612" +"6167","3","Schier","Shella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6167 Schier","1","0000-00-00 00:00:00","28409" +"6167","4","Calo","Jule","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6167 Calo","1","0000-00-00 00:00:00","28410" +"8318","2","Burkhalter","Verda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8318 Burkhalter","1","0000-00-00 00:00:00","14724" +"5021","2","Leto","Danae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5021 Leto","1","0000-00-00 00:00:00","21779" +"3797","2","Alessi","Hortensia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3797 Alessi","1","0000-00-00 00:00:00","14726" +"2681","3","Kaster","Ida","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2681 Kaster","1","0000-00-00 00:00:00","14769" +"2681","4","Fortin","Maurita","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2681 Fortin","1","0000-00-00 00:00:00","14770" +"9180","1","Vizcarra","Rocco","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9180 Vizcarra","1","0000-00-00 00:00:00","14623" +"3741","2","Wild","Pricilla","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3741 Wild","1","0000-00-00 00:00:00","14775" +"8546","1","Roten","Lang","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8546 Roten","1","0000-00-00 00:00:00","14625" +"1251","1","Rowell","Hoa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1251 Rowell","1","0000-00-00 00:00:00","14626" +"8043","2","Raver","Myrtle","999.99","0.25","0","20","1","1","1","PC","1","0","0","0","999","0","8043 Raver","1","0000-00-00 00:00:00","30647" +"8043","4","Peer","Tiffiny","999.99","0.25","0","20","1","1","1","PC","1","0","0","0","999","0","8043 Peer","1","0000-00-00 00:00:00","30649" +"3473","2","Guidi","Lino","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3473 Guidi","1","0000-00-00 00:00:00","14781" +"2916","2","Biery","Amelia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2916 Biery","1","0000-00-00 00:00:00","27923" +"2292","2","Leight","Nell","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2292 Leight","1","0000-00-00 00:00:00","14787" +"2508","3","Newby","Lorinda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2508 Newby","1","0000-00-00 00:00:00","14790" +"2508","2","Beltrami","Carisa","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2508 Beltrami","1","0000-00-00 00:00:00","14789" +"3923","2","Vanderhorst","Svetlana","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","3923 Vanderhorst","1","0000-00-00 00:00:00","9884" +"4972","1","Birch","Loan","999.99","50","12","50","1","1","1","PC","3","1","0","0","999","1","4972 Birch","1","0000-00-00 00:00:00","14637" +"8713","2","Laura","Carisa","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8713 Laura","1","0000-00-00 00:00:00","14799" +"8713","1","Eutsler","Season","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8713 Eutsler","1","0000-00-00 00:00:00","14640" +"2745","2","Michel","Lesia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2745 Michel","1","0000-00-00 00:00:00","14802" +"3823","2","Mcgibbon","Rivka","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3823 Mcgibbon","1","0000-00-00 00:00:00","14805" +"790","1","Giraldo","Sheilah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","790 Giraldo","1","0000-00-00 00:00:00","14733" +"790","3","Hellmann","Angelina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","790 Hellmann","1","0000-00-00 00:00:00","8751" +"6573","2","Headrick","Retha","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6573 Headrick","1","0000-00-00 00:00:00","10146" +"8939","2","Mueller","Beverlee","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8939 Mueller","1","0000-00-00 00:00:00","10147" +"1580","1","Raske","Marshall","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1580 Raske","1","0000-00-00 00:00:00","14738" +"1580","3","Zaccaria","So","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1580 Zaccaria","1","0000-00-00 00:00:00","10153" +"2525","1","Daquila","Isa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2525 Daquila","1","0000-00-00 00:00:00","14748" +"2525","2","Maines","Daniele","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2525 Maines","1","0000-00-00 00:00:00","10206" +"9012","1","Maestas","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9012 Maestas","1","0000-00-00 00:00:00","14749" +"4491","1","Lamp","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4491 Lamp","1","0000-00-00 00:00:00","14750" +"6782","3","Stockard","Milford","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6782 Stockard","1","0000-00-00 00:00:00","19179" +"6782","2","Hennings","Yael","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6782 Hennings","1","0000-00-00 00:00:00","19178" +"436","2","Maheux","Iona","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","436 Maheux","1","0000-00-00 00:00:00","10211" +"3441","1","Propes","Nicole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3441 Propes","1","0000-00-00 00:00:00","14756" +"5139","1","Alsobrook","Caroll","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5139 Alsobrook","1","0000-00-00 00:00:00","14758" +"5139","2","Vasques","Daniele","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5139 Vasques","1","0000-00-00 00:00:00","29580" +"4847","1","Boyett","Ethan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4847 Boyett","1","0000-00-00 00:00:00","14760" +"4755","1","Rozzi","Myrtle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4755 Rozzi","1","0000-00-00 00:00:00","14762" +"1683","1","Mckillip","Temeka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1683 Mckillip","1","0000-00-00 00:00:00","14763" +"2712","1","Komar","Harrison","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2712 Komar","1","0000-00-00 00:00:00","14764" +"8348","2","Oyola","Zoila","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8348 Oyola","1","0000-00-00 00:00:00","10226" +"6288","2","Vanwagenen","Pei","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6288 Vanwagenen","1","0000-00-00 00:00:00","11418" +"5441","2","Lajeunesse","Eve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5441 Lajeunesse","1","0000-00-00 00:00:00","24676" +"5441","1","Jepsen","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5441 Jepsen","1","0000-00-00 00:00:00","10164" +"1676","1","Harrod","Marry","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1676 Harrod","1","0000-00-00 00:00:00","10167" +"6185","3","Heise","Theron","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6185 Heise","1","0000-00-00 00:00:00","18799" +"3878","1","Prichett","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3878 Prichett","1","0000-00-00 00:00:00","10169" +"730","2","Rafael","Karlene","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","730 Rafael","1","0000-00-00 00:00:00","10234" +"730","3","Mcelvain","Joelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","730 Mcelvain","1","0000-00-00 00:00:00","10235" +"7103","1","Bowens","Towanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7103 Bowens","1","0000-00-00 00:00:00","10171" +"553","3","Bohn","Marylou","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","553 Bohn","1","0000-00-00 00:00:00","22018" +"553","2","Lajeunesse","Zane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","553 Lajeunesse","1","0000-00-00 00:00:00","22017" +"7414","1","Andresen","Davina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7414 Andresen","1","0000-00-00 00:00:00","10177" +"1096","1","Szabo","Alline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1096 Szabo","1","0000-00-00 00:00:00","10178" +"46","1","Gutman","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","46 Gutman","1","0000-00-00 00:00:00","10179" +"9690","1","Sedillo","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9690 Sedillo","1","0000-00-00 00:00:00","10180" +"8260","3","Sester","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8260 Sester","1","0000-00-00 00:00:00","22516" +"8260","2","Paradiso","Alvaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8260 Paradiso","1","0000-00-00 00:00:00","22515" +"2601","3","Beltrami","Sheena","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2601 Beltrami","1","0000-00-00 00:00:00","10296" +"2620","2","Beaulieu","Argentina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2620 Beaulieu","1","0000-00-00 00:00:00","22555" +"9722","3","Manzo","Veronica","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9722 Manzo","1","0000-00-00 00:00:00","10299" +"9722","1","Choiniere","Royce","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9722 Choiniere","1","0000-00-00 00:00:00","10189" +"4446","2","Clatterbuck","Arron","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4446 Clatterbuck","1","0000-00-00 00:00:00","10302" +"1840","2","Maloof","Svetlana","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1840 Maloof","1","0000-00-00 00:00:00","10303" +"7763","2","Chaves","Marketta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7763 Chaves","1","0000-00-00 00:00:00","20266" +"3600","2","Allbright","Felicitas","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3600 Allbright","1","0000-00-00 00:00:00","10314" +"3600","3","Tidmore","Marchelle","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3600 Tidmore","1","0000-00-00 00:00:00","10315" +"1401","1","Limon","Dario","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1401 Limon","1","0000-00-00 00:00:00","10197" +"9045","1","Ammann","Melonie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9045 Ammann","1","0000-00-00 00:00:00","10199" +"8618","1","Friesen","Lakesha","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","8618 Friesen","1","0000-00-00 00:00:00","10243" +"1245","4","Nance","Caryl","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1245 Nance","1","0000-00-00 00:00:00","10327" +"1245","2","Stump","Kenny","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1245 Stump","1","0000-00-00 00:00:00","10325" +"6152","2","Metro","Linnea","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6152 Metro","1","0000-00-00 00:00:00","17843" +"240","3","Raabe","Angelita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","240 Raabe","1","0000-00-00 00:00:00","30215" +"240","1","Youssef","Augusta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","240 Youssef","1","0000-00-00 00:00:00","10251" +"3308","2","Storms","Pei","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3308 Storms","1","0000-00-00 00:00:00","10333" +"8479","1","World","Ira","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","8479 World","1","0000-00-00 00:00:00","10253" +"3517","1","Simms","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3517 Simms","1","0000-00-00 00:00:00","10256" +"2093","1","Mcmorris","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2093 Mcmorris","1","0000-00-00 00:00:00","10257" +"2093","2","Fortin","Gina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2093 Fortin","1","0000-00-00 00:00:00","10381" +"1584","1","Faber","Verda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1584 Faber","1","0000-00-00 00:00:00","10259" +"82","1","Rashid","Nelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","82 Rashid","1","0000-00-00 00:00:00","10263" +"8612","2","Albritton","Madaline","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","8612 Albritton","1","0000-00-00 00:00:00","10400" +"8612","1","Petrarca","Hoa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8612 Petrarca","1","0000-00-00 00:00:00","10267" +"5615","2","Perillo","Octavia","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5615 Perillo","1","0000-00-00 00:00:00","21103" +"5651","2","Friesen","Cruz","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5651 Friesen","1","0000-00-00 00:00:00","18984" +"7963","1","Kari","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7963 Kari","1","0000-00-00 00:00:00","10278" +"4359","2","Zahn","Craig","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4359 Zahn","1","0000-00-00 00:00:00","10418" +"1732","1","Ducan","Jadwiga","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1732 Ducan","1","0000-00-00 00:00:00","10281" +"757","2","Lach","Rosalva","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","757 Lach","1","0000-00-00 00:00:00","10422" +"5935","1","Steffey","Earleen","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5935 Steffey","1","0000-00-00 00:00:00","10338" +"5029","2","Kari","Cameron","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5029 Kari","1","0000-00-00 00:00:00","22347" +"1390","1","Swicegood","Debera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1390 Swicegood","1","0000-00-00 00:00:00","10341" +"1390","4","Pennell","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1390 Pennell","1","0000-00-00 00:00:00","25119" +"1475","1","Dorsett","Iona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1475 Dorsett","1","0000-00-00 00:00:00","10342" +"1475","3","Heinen","Shella","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1475 Heinen","1","0000-00-00 00:00:00","10437" +"6768","1","Swarey","Earle","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","6768 Swarey","1","0000-00-00 00:00:00","10344" +"851","2","Raver","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","851 Raver","1","0000-00-00 00:00:00","12424" +"851","1","Kouba","Elyse","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","851 Kouba","1","0000-00-00 00:00:00","10346" +"7014","1","Simons","Maxine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7014 Simons","1","0000-00-00 00:00:00","10349" +"5195","1","Blais","Myrtle","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","5195 Blais","1","0000-00-00 00:00:00","10352" +"5195","2","Bicknell","Sarita","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","5195 Bicknell","1","0000-00-00 00:00:00","30762" +"723","3","Andresen","Letisha","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","723 Andresen","1","0000-00-00 00:00:00","10446" +"8923","1","Haverly","Mariette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8923 Haverly","1","0000-00-00 00:00:00","10355" +"529","2","Janco","Rosalva","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","529 Janco","1","0000-00-00 00:00:00","10448" +"2246","1","Ammann","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2246 Ammann","1","0000-00-00 00:00:00","10357" +"1919","2","Beer","Candelaria","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1919 Beer","1","0000-00-00 00:00:00","24616" +"3667","1","Sester","Craig","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3667 Sester","1","0000-00-00 00:00:00","10359" +"5677","4","Ensey","Katrina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5677 Ensey","1","0000-00-00 00:00:00","10499" +"5677","2","Mcpeek","Gregorio","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5677 Mcpeek","1","0000-00-00 00:00:00","10497" +"2233","1","Dorsett","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2233 Dorsett","1","0000-00-00 00:00:00","10366" +"7287","2","Rashid","Chanell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7287 Rashid","1","0000-00-00 00:00:00","24084" +"4056","2","Caraballo","Claudine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4056 Caraballo","1","0000-00-00 00:00:00","19045" +"5768","1","Hickman","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5768 Hickman","1","0000-00-00 00:00:00","10370" +"1805","1","Voges","Calvin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1805 Voges","1","0000-00-00 00:00:00","10373" +"3009","2","Rippey","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3009 Rippey","1","0000-00-00 00:00:00","24347" +"3732","2","Peer","Stefanie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3732 Peer","1","0000-00-00 00:00:00","25959" +"307","1","Flesher","Bambi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","307 Flesher","1","0000-00-00 00:00:00","10451" +"4260","4","Wessner","Thanh","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4260 Wessner","1","0000-00-00 00:00:00","14893" +"4260","1","Bowens","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4260 Bowens","1","0000-00-00 00:00:00","10452" +"4279","1","Narcisse","Jacquline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4279 Narcisse","1","0000-00-00 00:00:00","10454" +"981","2","Toribio","Adela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","981 Toribio","1","0000-00-00 00:00:00","23798" +"8100","2","Muck","Maren","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8100 Muck","1","0000-00-00 00:00:00","10521" +"1865","1","Eisenhower","Noe","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","1865 Eisenhower","1","0000-00-00 00:00:00","10457" +"1865","4","Allbright","Miquel","0","0","0","0","0","0","0","INACT","0","0","0","0","999","0","1865 Allbright","1","0000-00-00 00:00:00","17780" +"6962","3","Vanderhorst","Refugio","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6962 Vanderhorst","1","0000-00-00 00:00:00","10526" +"5644","2","Lary","Calvin","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5644 Lary","1","0000-00-00 00:00:00","25049" +"5644","3","Housley","Anne","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5644 Housley","1","0000-00-00 00:00:00","25050" +"7013","1","Wendland","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7013 Wendland","1","0000-00-00 00:00:00","10463" +"3381","1","Donald","Hoa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3381 Donald","1","0000-00-00 00:00:00","10466" +"6530","3","Heller","Wendie","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","6530 Heller","1","0000-00-00 00:00:00","19171" +"6849","2","Rudd","Jefferson","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6849 Rudd","1","0000-00-00 00:00:00","14137" +"563","2","Brabant","Korey","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","563 Brabant","1","0000-00-00 00:00:00","14822" +"563","1","Hults","Delena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","563 Hults","1","0000-00-00 00:00:00","10471" +"4884","2","Esterly","Anamaria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4884 Esterly","1","0000-00-00 00:00:00","15403" +"2817","3","Caraballo","Maurita","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2817 Caraballo","1","0000-00-00 00:00:00","25166" +"4705","3","Sherron","Violette","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","4705 Sherron","1","0000-00-00 00:00:00","16140" +"4705","2","Pennell","Boyd","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","4705 Pennell","1","0000-00-00 00:00:00","16139" +"1519","1","Mcleod","Tomiko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1519 Mcleod","1","0000-00-00 00:00:00","10477" +"3717","2","Abrahams","Luanne","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3717 Abrahams","1","0000-00-00 00:00:00","14189" +"3717","3","Coello","Barbera","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3717 Coello","1","0000-00-00 00:00:00","14190" +"2256","2","Able","Nelle","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","2256 Able","1","0000-00-00 00:00:00","19441" +"8014","2","Tardiff","Dorris","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8014 Tardiff","1","0000-00-00 00:00:00","30332" +"4086","1","Komar","Kirstin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4086 Komar","1","0000-00-00 00:00:00","10482" +"2848","1","Czaja","Ray","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2848 Czaja","1","0000-00-00 00:00:00","10483" +"5128","3","Grothe","Katrice","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5128 Grothe","1","0000-00-00 00:00:00","25581" +"7731","2","Keppler","Andria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7731 Keppler","1","0000-00-00 00:00:00","27655" +"7945","4","Paiva","Danae","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7945 Paiva","1","0000-00-00 00:00:00","29579" +"7945","2","Feehan","Annabel","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7945 Feehan","1","0000-00-00 00:00:00","29577" +"7724","1","Maines","Brendan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7724 Maines","1","0000-00-00 00:00:00","10488" +"3638","1","Haggerty","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3638 Haggerty","1","0000-00-00 00:00:00","14139" +"5156","2","Darwin","Frederick","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5156 Darwin","1","0000-00-00 00:00:00","14833" +"6879","4","Capshaw","Jacquline","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6879 Capshaw","1","0000-00-00 00:00:00","14839" +"6879","1","Koziel","Leanora","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6879 Koziel","1","0000-00-00 00:00:00","14141" +"5081","1","Pitre","Larissa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5081 Pitre","1","0000-00-00 00:00:00","14814" +"850","1","Knudsen","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","850 Knudsen","1","0000-00-00 00:00:00","14144" +"7009","3","Housley","Venus","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","7009 Housley","1","0000-00-00 00:00:00","14884" +"3649","2","Mickey","Steve","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3649 Mickey","1","0000-00-00 00:00:00","14885" +"1243","2","Jepsen","Selina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1243 Jepsen","1","0000-00-00 00:00:00","18438" +"1243","3","Schier","Sarita","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1243 Schier","1","0000-00-00 00:00:00","18439" +"3955","2","Alessi","Davida","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3955 Alessi","1","0000-00-00 00:00:00","14890" +"5419","2","Swicegood","Theo","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5419 Swicegood","1","0000-00-00 00:00:00","14891" +"2796","1","Goodell","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2796 Goodell","1","0000-00-00 00:00:00","14153" +"1098","4","Liebsch","Daniele","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1098 Liebsch","1","0000-00-00 00:00:00","14902" +"1098","2","Pennypacker","Noe","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1098 Pennypacker","1","0000-00-00 00:00:00","14900" +"2736","1","Lehrer","Rhona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2736 Lehrer","1","0000-00-00 00:00:00","14815" +"2638","3","Viera","Eldridge","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2638 Viera","1","0000-00-00 00:00:00","16571" +"2638","1","Starr","Felicidad","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2638 Starr","1","0000-00-00 00:00:00","14157" +"4100","4","Housley","Kerstin","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","4100 Housley","1","0000-00-00 00:00:00","14908" +"4100","2","Dyke","Maurita","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","1","4100 Dyke","1","0000-00-00 00:00:00","14906" +"2277","1","Ridings","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2277 Ridings","1","0000-00-00 00:00:00","14816" +"989","1","Sweat","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","989 Sweat","1","0000-00-00 00:00:00","14162" +"3278","1","Quintero","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3278 Quintero","1","0000-00-00 00:00:00","14164" +"2793","2","Propes","Elyse","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2793 Propes","1","0000-00-00 00:00:00","14913" +"2793","1","Perillo","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2793 Perillo","1","0000-00-00 00:00:00","14166" +"3333","2","Madson","Thanh","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3333 Madson","1","0000-00-00 00:00:00","30517" +"4313","2","Nowland","Mi","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4313 Nowland","1","0000-00-00 00:00:00","14916" +"5362","1","Davisson","Valorie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5362 Davisson","1","0000-00-00 00:00:00","14845" +"1487","2","Parrales","Art","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1487 Parrales","1","0000-00-00 00:00:00","14986" +"1487","3","Mueller","Cruz","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1487 Mueller","1","0000-00-00 00:00:00","14987" +"733","1","Schempp","Hui","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","733 Schempp","1","0000-00-00 00:00:00","14851" +"733","2","Mraz","Theo","0","0","0","0","0","0","0","TERM","0","0","0","0","0","0","733 Mraz","1","0000-00-00 00:00:00","15229" +"5105","2","Mcelvain","Eldora","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5105 Mcelvain","1","0000-00-00 00:00:00","14929" +"5068","1","Lehrer","Tobie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5068 Lehrer","1","0000-00-00 00:00:00","14856" +"4463","2","Voges","Maurice","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4463 Voges","1","0000-00-00 00:00:00","14938" +"5557","1","Jepsen","Tobie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5557 Jepsen","1","0000-00-00 00:00:00","14858" +"6557","2","Synder","Pei","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6557 Synder","1","0000-00-00 00:00:00","14995" +"803","1","Hord","Jule","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","803 Hord","1","0000-00-00 00:00:00","14862" +"803","2","Saldivar","Taryn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","803 Saldivar","1","0000-00-00 00:00:00","14997" +"2752","3","Leib","Huey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2752 Leib","1","0000-00-00 00:00:00","22203" +"2073","3","Ecton","Juli","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2073 Ecton","1","0000-00-00 00:00:00","15001" +"2073","1","Rafael","Jacquelin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2073 Rafael","1","0000-00-00 00:00:00","14865" +"5779","1","Storms","Marline","999.99","0","0","20","1","1","1","PC","1","0","0","1723.51","999","0","5779 Storms","1","0000-00-00 00:00:00","83" +"3670","2","Bear","Hulda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3670 Bear","1","0000-00-00 00:00:00","23042" +"5342","2","Haverly","Lilia","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5342 Haverly","1","0000-00-00 00:00:00","29424" +"1118","3","Nichol","Delinda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1118 Nichol","1","0000-00-00 00:00:00","15008" +"1118","1","Vroman","Ruthie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1118 Vroman","1","0000-00-00 00:00:00","14871" +"9711","3","Perron","Sheena","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9711 Perron","1","0000-00-00 00:00:00","18963" +"9711","4","Penland","Shirl","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9711 Penland","1","0000-00-00 00:00:00","18964" +"6556","1","Creason","Deon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6556 Creason","1","0000-00-00 00:00:00","14873" +"6556","4","Matherne","Valorie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6556 Matherne","1","0000-00-00 00:00:00","15018" +"1662","1","Janco","Gina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1662 Janco","1","0000-00-00 00:00:00","14875" +"2589","3","Schempp","Lady","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2589 Schempp","1","0000-00-00 00:00:00","15024" +"2351","1","Vizcarra","Archie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2351 Vizcarra","1","0000-00-00 00:00:00","14877" +"8145","1","Bear","Tamica","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8145 Bear","1","0000-00-00 00:00:00","14878" +"2683","2","Wendland","Brendan","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2683 Wendland","1","0000-00-00 00:00:00","14807" +"583","2","Broderson","Teisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","583 Broderson","1","0000-00-00 00:00:00","31579" +"2415","2","Boggan","Tanesha","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2415 Boggan","1","0000-00-00 00:00:00","14983" +"1530","2","Botkin","Letisha","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1530 Botkin","1","0000-00-00 00:00:00","19453" +"5027","2","Chain","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5027 Chain","1","0000-00-00 00:00:00","29824" +"5027","1","Tunney","Linnea","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5027 Tunney","1","0000-00-00 00:00:00","14943" +"3551","2","Hults","Christi","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","3551 Hults","1","0000-00-00 00:00:00","20760" +"6671","2","Gory","Ulrike","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","6671 Gory","1","0000-00-00 00:00:00","15039" +"4192","1","Hertzler","Williemae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4192 Hertzler","1","0000-00-00 00:00:00","14948" +"7807","1","Schempp","Mikel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7807 Schempp","1","0000-00-00 00:00:00","14956" +"160","1","Hipps","Magan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","160 Hipps","1","0000-00-00 00:00:00","14957" +"160","3","Novoa","Eldridge","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","160 Novoa","1","0000-00-00 00:00:00","15089" +"290","2","Wynkoop","Collene","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","290 Wynkoop","1","0000-00-00 00:00:00","24734" +"5724","3","Tousignant","Betty","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5724 Tousignant","1","0000-00-00 00:00:00","15093" +"5724","4","Nitti","Julius","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5724 Nitti","1","0000-00-00 00:00:00","15094" +"3654","2","Tousignant","Chanell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3654 Tousignant","1","0000-00-00 00:00:00","18871" +"7","2","Raske","Twana","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","7 Raske","1","0000-00-00 00:00:00","15096" +"7","3","Broderson","Earle","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","7 Broderson","1","0000-00-00 00:00:00","15097" +"1097","1","Narcisse","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1097 Narcisse","1","0000-00-00 00:00:00","14965" +"1097","4","Rudd","Jacob","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1097 Rudd","1","0000-00-00 00:00:00","16429" +"6172","1","Nichol","Mei","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6172 Nichol","1","0000-00-00 00:00:00","14967" +"6172","3","Doetsch","Myrl","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6172 Doetsch","1","0000-00-00 00:00:00","15103" +"9723","2","Marston","Ezekiel","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9723 Marston","1","0000-00-00 00:00:00","13365" +"2988","2","Sweat","Karlene","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2988 Sweat","1","0000-00-00 00:00:00","25503" +"2988","1","Snively","Mechelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2988 Snively","1","0000-00-00 00:00:00","14969" +"604","2","Villafane","Marketta","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","604 Villafane","1","0000-00-00 00:00:00","15111" +"604","4","Rashid","Jazmine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","604 Rashid","1","0000-00-00 00:00:00","15113" +"1153","1","Eoff","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1153 Eoff","1","0000-00-00 00:00:00","14972" +"1153","2","Grahn","Agnus","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1153 Grahn","1","0000-00-00 00:00:00","15115" +"1897","3","Delvalle","Barb","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1897 Delvalle","1","0000-00-00 00:00:00","24390" +"3060","1","Dillenbeck","Elinore","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3060 Dillenbeck","1","0000-00-00 00:00:00","14974" +"9232","1","Trafton","Ricky","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9232 Trafton","1","0000-00-00 00:00:00","14976" +"9128","3","Frith","Claudette","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9128 Frith","1","0000-00-00 00:00:00","25163" +"9128","2","Pillai","Wanetta","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","9128 Pillai","1","0000-00-00 00:00:00","25162" +"226","3","Finke","Jule","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","226 Finke","1","0000-00-00 00:00:00","19041" +"226","1","Boggan","Marcelene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","226 Boggan","1","0000-00-00 00:00:00","1821" +"6398","1","Pitre","Ethan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6398 Pitre","1","0000-00-00 00:00:00","15043" +"7865","1","Quintero","Jaime","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7865 Quintero","1","0000-00-00 00:00:00","15044" +"6122","1","Saddler","Wilhemina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6122 Saddler","1","0000-00-00 00:00:00","15045" +"7680","3","Wessner","Leonel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7680 Wessner","1","0000-00-00 00:00:00","15134" +"7680","2","Callejas","Malia","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","7680 Callejas","1","0000-00-00 00:00:00","15133" +"8201","1","Soderberg","Nikole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8201 Soderberg","1","0000-00-00 00:00:00","15049" +"904","1","Dietrick","Judy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","904 Dietrick","1","0000-00-00 00:00:00","15050" +"7050","1","Steele","Anne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7050 Steele","1","0000-00-00 00:00:00","15051" +"5398","1","Sprau","Claudette","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","5398 Sprau","1","0000-00-00 00:00:00","15052" +"6290","1","Sweat","Madaline","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6290 Sweat","1","0000-00-00 00:00:00","15054" +"6290","2","Nails","Garland","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6290 Nails","1","0000-00-00 00:00:00","29410" +"1223","1","Brabant","Larissa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1223 Brabant","1","0000-00-00 00:00:00","15055" +"259","4","Villafane","Carmelita","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","259 Villafane","1","0000-00-00 00:00:00","15155" +"259","2","Plouffe","Elvera","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","259 Plouffe","1","0000-00-00 00:00:00","15153" +"5535","2","Baumgart","Lakesha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5535 Baumgart","1","0000-00-00 00:00:00","29612" +"3495","1","Shoe","Tobie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3495 Shoe","1","0000-00-00 00:00:00","15059" +"4703","2","Simons","Ira","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4703 Simons","1","0000-00-00 00:00:00","25573" +"4703","4","Saddler","Selina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4703 Saddler","1","0000-00-00 00:00:00","25575" +"1780","1","Finlayson","Geraldo","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","1780 Finlayson","1","0000-00-00 00:00:00","15069" +"8189","2","Simons","Shanta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8189 Simons","1","0000-00-00 00:00:00","30007" +"286","2","Quintero","Maurice","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","286 Quintero","1","0000-00-00 00:00:00","15216" +"286","3","Goggans","Nikole","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","286 Goggans","1","0000-00-00 00:00:00","15217" +"5164","1","Anderson","Lakesha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5164 Anderson","1","0000-00-00 00:00:00","15079" +"9855","1","Lapham","Claudine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9855 Lapham","1","0000-00-00 00:00:00","15081" +"3176","1","Bertucci","Kip","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3176 Bertucci","1","0000-00-00 00:00:00","15162" +"3176","2","Diamond","Leonel","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3176 Diamond","1","0000-00-00 00:00:00","11153" +"2994","1","Eisenhower","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","16.9","999","1","2994 Eisenhower","1","0000-00-00 00:00:00","1584" +"3857","1","Nevin","Rosia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3857 Nevin","1","0000-00-00 00:00:00","15164" +"2829","1","Durand","Slyvia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2829 Durand","1","0000-00-00 00:00:00","15165" +"2829","3","Jepsen","Robbyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2829 Jepsen","1","0000-00-00 00:00:00","11276" +"2600","2","Dobson","Renato","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2600 Dobson","1","0000-00-00 00:00:00","11218" +"5249","4","Keppel","Luna","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5249 Keppel","1","0000-00-00 00:00:00","11159" +"5249","3","Hodson","Jamaal","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5249 Hodson","1","0000-00-00 00:00:00","11158" +"5150","2","Biery","Humberto","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5150 Biery","1","0000-00-00 00:00:00","11163" +"5150","3","Delvalle","Milford","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5150 Delvalle","1","0000-00-00 00:00:00","11164" +"911","1","Lheureux","Stacey","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","911 Lheureux","1","0000-00-00 00:00:00","15173" +"911","4","Suen","Alva","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","911 Suen","1","0000-00-00 00:00:00","11168" +"2161","1","Weimar","Ingeborg","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2161 Weimar","1","0000-00-00 00:00:00","15174" +"2161","2","Snodgrass","Lavona","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2161 Snodgrass","1","0000-00-00 00:00:00","20363" +"6590","1","Schmucker","Williemae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6590 Schmucker","1","0000-00-00 00:00:00","15175" +"3304","1","Lowe","Delila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3304 Lowe","1","0000-00-00 00:00:00","15176" +"1911","1","Arias","Leopoldo","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1911 Arias","1","0000-00-00 00:00:00","15177" +"1911","3","Mickey","Patrick","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1911 Mickey","1","0000-00-00 00:00:00","11222" +"5182","4","Heller","Svetlana","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5182 Heller","1","0000-00-00 00:00:00","11225" +"5182","2","Ammann","Hermila","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5182 Ammann","1","0000-00-00 00:00:00","11223" +"2000","2","Gunderman","Bridget","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","2000 Gunderman","1","0000-00-00 00:00:00","18275" +"248","2","Alessi","Maren","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","248 Alessi","1","0000-00-00 00:00:00","11227" +"5015","1","Riffel","Destiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5015 Riffel","1","0000-00-00 00:00:00","15181" +"7885","2","Koziel","Nicole","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7885 Koziel","1","0000-00-00 00:00:00","25254" +"5627","1","Mccann","Dianna","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5627 Mccann","1","0000-00-00 00:00:00","15184" +"4154","1","Michel","Selma","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4154 Michel","1","0000-00-00 00:00:00","15187" +"8741","2","Castilleja","Joslyn","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8741 Castilleja","1","0000-00-00 00:00:00","22195" +"5300","1","Lowe","Kent","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5300 Lowe","1","0000-00-00 00:00:00","15190" +"5465","2","Dantin","Ida","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5465 Dantin","1","0000-00-00 00:00:00","21501" +"5465","4","Lueck","Anja","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5465 Lueck","1","0000-00-00 00:00:00","21503" +"8902","1","Lanier","Elvera","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8902 Lanier","1","0000-00-00 00:00:00","15194" +"5281","2","Capshaw","Apolonia","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5281 Capshaw","1","0000-00-00 00:00:00","11253" +"8528","2","Colonna","Jacklyn","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8528 Colonna","1","0000-00-00 00:00:00","24711" +"8528","4","Hinshaw","Karlene","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8528 Hinshaw","1","0000-00-00 00:00:00","24713" +"4627","1","Metro","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4627 Metro","1","0000-00-00 00:00:00","15199" +"4627","3","Laura","Art","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4627 Laura","1","0000-00-00 00:00:00","11258" +"8780","2","Murton","Elinore","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8780 Murton","1","0000-00-00 00:00:00","17018" +"7091","1","Villafane","Neil","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7091 Villafane","1","0000-00-00 00:00:00","11172" +"8979","2","Pillai","Elane","0","17.7","0","20","1","0","0","PC","1","0","0","0","0","0","8979 Pillai","1","0000-00-00 00:00:00","11269" +"4445","1","Bratten","Brittani","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4445 Bratten","1","0000-00-00 00:00:00","11185" +"3319","1","Stahl","Wanetta","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3319 Stahl","1","0000-00-00 00:00:00","11186" +"2621","4","Leto","Delaine","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2621 Leto","1","0000-00-00 00:00:00","11337" +"2621","1","Fitting","Eilene","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2621 Fitting","1","0000-00-00 00:00:00","11189" +"3349","2","Nall","Barbar","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3349 Nall","1","0000-00-00 00:00:00","17278" +"3349","1","Frith","Leola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3349 Frith","1","0000-00-00 00:00:00","11191" +"4523","2","Hellmann","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4523 Hellmann","1","0000-00-00 00:00:00","29897" +"611","2","Mcmorris","Corrinne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","611 Mcmorris","1","0000-00-00 00:00:00","30846" +"9961","2","Sester","So","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","9961 Sester","1","0000-00-00 00:00:00","17280" +"1938","1","Anding","Zane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1938 Anding","1","0000-00-00 00:00:00","11200" +"3371","2","Friedt","Marcelene","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3371 Friedt","1","0000-00-00 00:00:00","29416" +"2898","1","Storms","Stephany","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2898 Storms","1","0000-00-00 00:00:00","11207" +"3429","1","Flesher","Leanora","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3429 Flesher","1","0000-00-00 00:00:00","11208" +"3520","1","Paradiso","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3520 Paradiso","1","0000-00-00 00:00:00","11209" +"533","1","Heller","Mei","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","533 Heller","1","0000-00-00 00:00:00","11279" +"2500","1","Nails","Elvis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2500 Nails","1","0000-00-00 00:00:00","14939" +"5013","2","Burkhalter","Wilhemina","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5013 Burkhalter","1","0000-00-00 00:00:00","11346" +"2907","1","Prichett","Joaquina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2907 Prichett","1","0000-00-00 00:00:00","14178" +"708","1","Cimini","Eve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","708 Cimini","1","0000-00-00 00:00:00","14179" +"708","3","Coello","Kandice","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","708 Coello","1","0000-00-00 00:00:00","11349" +"459","1","Alessi","Towanda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","459 Alessi","1","0000-00-00 00:00:00","11282" +"3754","2","Derose","Robbyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3754 Derose","1","0000-00-00 00:00:00","11356" +"7745","1","Lheureux","Lai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7745 Lheureux","1","0000-00-00 00:00:00","11286" +"7745","3","Kort","Bridget","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","7745 Kort","1","0000-00-00 00:00:00","17512" +"1448","2","Landwehr","Elvis","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1448 Landwehr","1","0000-00-00 00:00:00","11393" +"4142","2","Alessi","Eddie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4142 Alessi","1","0000-00-00 00:00:00","23441" +"4142","3","Shryock","Lane","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4142 Shryock","1","0000-00-00 00:00:00","23442" +"106","2","Hord","Phylicia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","106 Hord","1","0000-00-00 00:00:00","8473" +"9154","2","Giffen","Calvin","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9154 Giffen","1","0000-00-00 00:00:00","11404" +"9154","3","Rippey","Kenneth","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9154 Rippey","1","0000-00-00 00:00:00","11405" +"1182","1","Ro","Eldora","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1182 Ro","1","0000-00-00 00:00:00","11296" +"1182","2","Vanderhorst","Reyna","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1182 Vanderhorst","1","0000-00-00 00:00:00","29532" +"5254","2","Mitcham","Carlos","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","5254 Mitcham","1","0000-00-00 00:00:00","11411" +"2463","3","Strother","Verda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2463 Strother","1","0000-00-00 00:00:00","11413" +"2463","1","Giraldo","Christi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2463 Giraldo","1","0000-00-00 00:00:00","11299" +"3911","3","Mcmullin","Pricilla","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3911 Mcmullin","1","0000-00-00 00:00:00","24607" +"1834","1","Lapham","Miquel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1834 Lapham","1","0000-00-00 00:00:00","11302" +"9037","1","Heise","Florrie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","9037 Heise","1","0000-00-00 00:00:00","11308" +"4558","2","Nichol","Carmelita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4558 Nichol","1","0000-00-00 00:00:00","26071" +"796","1","Petrarca","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","796 Petrarca","1","0000-00-00 00:00:00","11310" +"3018","1","Wild","Sarita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3018 Wild","1","0000-00-00 00:00:00","11312" +"5614","3","Storms","Vern","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5614 Storms","1","0000-00-00 00:00:00","22254" +"5614","1","Voges","Lucila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5614 Voges","1","0000-00-00 00:00:00","11313" +"4950","1","Able","Shavon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4950 Able","1","0000-00-00 00:00:00","11315" +"4348","3","Czaja","Temeka","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","4348 Czaja","1","0000-00-00 00:00:00","11429" +"4348","2","Tunney","Elinore","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","4348 Tunney","1","0000-00-00 00:00:00","8536" +"5444","1","Nitti","Tammi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5444 Nitti","1","0000-00-00 00:00:00","11358" +"2871","3","Marnell","Karlene","999.99","0","0","20","1","0","1","PC","1","0","0","6248.79","999","0","2871 Marnell","1","0000-00-00 00:00:00","3071" +"699","1","Limon","Lazaro","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","699 Limon","1","0000-00-00 00:00:00","6831" +"5506","1","Mcgibbon","Luther","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5506 Mcgibbon","1","0000-00-00 00:00:00","6834" +"2349","2","Parisien","Malia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2349 Parisien","1","0000-00-00 00:00:00","24876" +"2349","3","Dyke","Leah","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2349 Dyke","1","0000-00-00 00:00:00","24877" +"8120","1","Maheux","Tomiko","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8120 Maheux","1","0000-00-00 00:00:00","11362" +"5844","1","Haggerty","Lisbeth","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5844 Haggerty","1","0000-00-00 00:00:00","11363" +"9660","2","Mraz","Hae","999.99","0","0","0","0","0","1","TERM","0","0","0","0","999","0","9660 Mraz","1","0000-00-00 00:00:00","15460" +"9660","1","Litman","Rhona","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","9660 Litman","1","0000-00-00 00:00:00","11364" +"1157","1","Mueller","Hae","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1157 Mueller","1","0000-00-00 00:00:00","11365" +"5504","1","Parada","Rutha","999.99","0","0","0","1","1","1","PC","1","0","0","0","999","0","5504 Parada","1","0000-00-00 00:00:00","11369" +"7389","1","Fortin","Deidra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7389 Fortin","1","0000-00-00 00:00:00","11371" +"4490","2","Giffen","Nola","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4490 Giffen","1","0000-00-00 00:00:00","11495" +"481","3","Trousdale","Shavon","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","481 Trousdale","1","0000-00-00 00:00:00","24467" +"481","2","Derose","Maurice","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","481 Derose","1","0000-00-00 00:00:00","24466" +"1582","1","Giffen","Bridget","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1582 Giffen","1","0000-00-00 00:00:00","11373" +"9694","1","Holleman","Thanh","999.99","0","0","20","1","1","1","PC","1","0","0","561.71","999","1","9694 Holleman","1","0000-00-00 00:00:00","2005" +"5836","1","Cajigas","Nell","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5836 Cajigas","1","0000-00-00 00:00:00","11376" +"5888","2","Mcleod","Myrl","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5888 Mcleod","1","0000-00-00 00:00:00","21393" +"1431","2","Steven","Raven","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1431 Steven","1","0000-00-00 00:00:00","11507" +"1431","3","Raske","Rebecca","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1431 Raske","1","0000-00-00 00:00:00","11508" +"8092","2","Mattia","Eddie","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","8092 Mattia","1","0000-00-00 00:00:00","11510" +"6992","2","Harrod","Davis","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","6992 Harrod","1","0000-00-00 00:00:00","11511" +"3457","1","Spohn","Samual","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","3457 Spohn","1","0000-00-00 00:00:00","11442" +"7542","3","Litman","Gina","0","0","0","0","1","0","0","TERM","0","1","0","0","999","0","7542 Litman","1","0000-00-00 00:00:00","17799" +"5475","1","Jules","Larissa","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5475 Jules","1","0000-00-00 00:00:00","11446" +"5153","1","Nichol","Jodie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5153 Nichol","1","0000-00-00 00:00:00","11447" +"1071","4","Nally","Alina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1071 Nally","1","0000-00-00 00:00:00","17758" +"1071","2","Garbarino","Eulah","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1071 Garbarino","1","0000-00-00 00:00:00","17756" +"5555","3","Bertucci","Eldridge","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5555 Bertucci","1","0000-00-00 00:00:00","18003" +"2173","1","Carlino","Jaime","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2173 Carlino","1","0000-00-00 00:00:00","11453" +"7218","1","Stahl","Nelle","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7218 Stahl","1","0000-00-00 00:00:00","11454" +"1392","2","Goodell","Lang","0","5.98","0","20","1","0","0","PC","1","0","0","0","999","0","1392 Goodell","1","0000-00-00 00:00:00","24486" +"5036","2","Steitz","Noreen","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","5036 Steitz","1","0000-00-00 00:00:00","11550" +"5036","3","Pae","Nell","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","5036 Pae","1","0000-00-00 00:00:00","11551" +"55","2","Mcglothlen","Alvaro","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","55 Mcglothlen","1","0000-00-00 00:00:00","31082" +"8369","4","Soderberg","Geraldo","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","8369 Soderberg","1","0000-00-00 00:00:00","11005" +"8369","2","Manganaro","Junita","999.99","0","0","0","1","0","1","INACT","0","0","0","0","999","0","8369 Manganaro","1","0000-00-00 00:00:00","7901" +"926","3","Kriger","Craig","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","926 Kriger","1","0000-00-00 00:00:00","22793" +"375","1","Bohn","Hoa","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","375 Bohn","1","0000-00-00 00:00:00","11461" +"375","2","Bayes","Eilene","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","375 Bayes","1","0000-00-00 00:00:00","28016" +"8238","1","Rashid","Lizeth","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8238 Rashid","1","0000-00-00 00:00:00","11462" +"6036","2","Furlong","Shelley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6036 Furlong","1","0000-00-00 00:00:00","20486" +"4555","1","Lowe","Janelle","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4555 Lowe","1","0000-00-00 00:00:00","11466" +"4895","1","Atwell","Madaline","999.99","0","0","0","1","1","1","TERM","0","0","0","0","999","0","4895 Atwell","1","0000-00-00 00:00:00","11469" +"7962","3","Janecek","Shaneka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7962 Janecek","1","0000-00-00 00:00:00","19162" +"7962","4","Saddler","Korey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7962 Saddler","1","0000-00-00 00:00:00","19163" +"1549","1","Zander","Maynard","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1549 Zander","1","0000-00-00 00:00:00","11477" +"1549","2","Mcneel","Ericka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1549 Mcneel","1","0000-00-00 00:00:00","31380" +"1246","2","Bilbo","Bertha","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1246 Bilbo","1","0000-00-00 00:00:00","11637" +"8216","1","Brawley","Beau","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8216 Brawley","1","0000-00-00 00:00:00","11479" +"4097","3","Bagg","Jule","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","4097 Bagg","1","0000-00-00 00:00:00","25551" +"5587","4","Beer","Mandy","999.99","0","0","20","1","1","1","PC","1","0","0","8764.34","999","0","5587 Beer","1","0000-00-00 00:00:00","24524" +"5587","1","Pelchat","Shirl","999.99","0","0","20","1","1","1","PC","1","0","0","8764.34","999","0","5587 Pelchat","1","0000-00-00 00:00:00","6412" +"6352","1","Doetsch","Mi","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","6352 Doetsch","1","0000-00-00 00:00:00","11563" +"5219","1","Mueller","Sheri","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5219 Mueller","1","0000-00-00 00:00:00","11564" +"4332","1","Balzer","Season","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4332 Balzer","1","0000-00-00 00:00:00","11565" +"4578","3","Salvo","Chantal","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4578 Salvo","1","0000-00-00 00:00:00","11651" +"4578","4","Howze","Tyree","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4578 Howze","1","0000-00-00 00:00:00","11652" +"4057","2","Nowland","Jaime","0","7.34","12","125","1","0","0","PC","3","1","0","0","999","1","4057 Nowland","1","0000-00-00 00:00:00","29889" +"5879","1","Limon","Salena","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5879 Limon","1","0000-00-00 00:00:00","11568" +"7006","1","Oquendo","Felicitas","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7006 Oquendo","1","0000-00-00 00:00:00","11569" +"477","3","Bryce","Refugio","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","477 Bryce","1","0000-00-00 00:00:00","11657" +"477","1","Strange","Wanita","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","477 Strange","1","0000-00-00 00:00:00","11571" +"4736","1","Arata","Kam","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4736 Arata","1","0000-00-00 00:00:00","11572" +"415","1","Weiler","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","415 Weiler","1","0000-00-00 00:00:00","11573" +"415","3","Keppel","Gina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","415 Keppel","1","0000-00-00 00:00:00","18164" +"6693","3","Thach","Lina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6693 Thach","1","0000-00-00 00:00:00","30308" +"6693","4","Mueller","Jarvis","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","6693 Mueller","1","0000-00-00 00:00:00","30309" +"8481","2","Wilmes","Marcela","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8481 Wilmes","1","0000-00-00 00:00:00","16675" +"752","2","Czaja","Keeley","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","752 Czaja","1","0000-00-00 00:00:00","8447" +"9805","2","Holleman","Valorie","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9805 Holleman","1","0000-00-00 00:00:00","8448" +"3114","2","Castille","Karlyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","3114 Castille","1","0000-00-00 00:00:00","8449" +"2138","4","Snodgrass","Lazaro","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2138 Snodgrass","1","0000-00-00 00:00:00","8453" +"2138","2","Vizcarra","Leah","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","2138 Vizcarra","1","0000-00-00 00:00:00","8451" +"4370","2","Vasko","Geraldo","0","0","0","0","1","0","0","INACT","0","0","0","0","999","0","4370 Vasko","1","0000-00-00 00:00:00","20096" +"885","2","Nichol","Stephania","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","885 Nichol","1","0000-00-00 00:00:00","27430" +"2879","4","Worthey","Grady","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2879 Worthey","1","0000-00-00 00:00:00","28639" +"2879","2","Esterly","Letisha","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2879 Esterly","1","0000-00-00 00:00:00","28637" +"4117","2","Sedillo","Theda","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","4117 Sedillo","1","0000-00-00 00:00:00","8459" +"1117","1","Plouffe","Vern","999.99","20","0","20","1","1","1","PC","1","0","0","0","999","0","1117 Plouffe","1","0000-00-00 00:00:00","11589" +"1359","1","Bertucci","Francoise","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1359 Bertucci","1","0000-00-00 00:00:00","11590" +"3619","1","Bertucci","Alva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3619 Bertucci","1","0000-00-00 00:00:00","11591" +"3921","1","Stecklein","Ida","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3921 Stecklein","1","0000-00-00 00:00:00","11592" +"2946","2","Murton","Latricia","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2946 Murton","1","0000-00-00 00:00:00","18344" +"6800","1","Castille","Indira","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","6800 Castille","1","0000-00-00 00:00:00","11594" +"1497","1","Ensey","Gina","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","1497 Ensey","1","0000-00-00 00:00:00","11595" +"3353","1","Kort","Claudine","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3353 Kort","1","0000-00-00 00:00:00","11597" +"8796","1","Medley","Lovetta","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","8796 Medley","1","0000-00-00 00:00:00","7132" +"5152","1","Faul","Noe","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5152 Faul","1","0000-00-00 00:00:00","12436" +"3979","2","Wachowiak","Boyce","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","3979 Wachowiak","1","0000-00-00 00:00:00","8450" +"5289","1","Zander","Deandra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5289 Zander","1","0000-00-00 00:00:00","11665" +"5289","2","Weimar","Kirstin","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5289 Weimar","1","0000-00-00 00:00:00","11134" +"409","1","Mollett","Junita","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","409 Mollett","1","0000-00-00 00:00:00","11667" +"4826","3","Prichett","Leanora","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4826 Prichett","1","0000-00-00 00:00:00","8483" +"1818","2","Simkins","Lesia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1818 Simkins","1","0000-00-00 00:00:00","28706" +"601","1","Maines","Annalee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","601 Maines","1","0000-00-00 00:00:00","11673" +"4324","1","Gains","Joette","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4324 Gains","1","0000-00-00 00:00:00","11674" +"4324","3","Limon","Oliva","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4324 Limon","1","0000-00-00 00:00:00","27229" +"5820","1","Mcleod","Summer","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5820 Mcleod","1","0000-00-00 00:00:00","11675" +"5820","4","Testerman","Frederick","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5820 Testerman","1","0000-00-00 00:00:00","8528" +"755","1","Paiva","Arron","999.99","0","0","0","1","1","1","TERM","0","0","0","0","999","0","755 Paiva","1","0000-00-00 00:00:00","11676" +"257","1","Maheux","Lashon","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","257 Maheux","1","0000-00-00 00:00:00","11677" +"2467","4","Heinen","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2467 Heinen","1","0000-00-00 00:00:00","29736" +"2467","2","Szewczyk","Jaime","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2467 Szewczyk","1","0000-00-00 00:00:00","29734" +"301","3","Trafton","Beau","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","301 Trafton","1","0000-00-00 00:00:00","8538" +"301","2","Novoa","Milford","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","301 Novoa","1","0000-00-00 00:00:00","8537" +"2940","2","Bayes","Theron","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2940 Bayes","1","0000-00-00 00:00:00","18220" +"3686","2","Paradiso","Felicidad","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3686 Paradiso","1","0000-00-00 00:00:00","26735" +"3686","1","Birch","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3686 Birch","1","0000-00-00 00:00:00","11684" +"1138","2","Severe","Retha","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1138 Severe","1","0000-00-00 00:00:00","18441" +"1138","4","Haar","Argentina","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1138 Haar","1","0000-00-00 00:00:00","18443" +"5630","2","Strange","Robbyn","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","5630 Strange","1","0000-00-00 00:00:00","8552" +"4709","1","Osman","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4709 Osman","1","0000-00-00 00:00:00","11687" +"5775","2","Spier","Ula","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5775 Spier","1","0000-00-00 00:00:00","25792" +"5172","2","Lapham","Katrina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5172 Lapham","1","0000-00-00 00:00:00","24476" +"5172","3","Liu","Tommye","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5172 Liu","1","0000-00-00 00:00:00","24477" +"1820","2","Zahn","Archie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","1820 Zahn","1","0000-00-00 00:00:00","8567" +"2419","2","Harrod","Clementine","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","2419 Harrod","1","0000-00-00 00:00:00","18489" +"4831","2","Mccann","Harrison","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","4831 Mccann","1","0000-00-00 00:00:00","8572" +"1079","2","Nance","Jarvis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1079 Nance","1","0000-00-00 00:00:00","16147" +"2562","1","Tidmore","Rupert","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2562 Tidmore","1","0000-00-00 00:00:00","11695" +"2562","3","Botkin","Keeley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","2562 Botkin","1","0000-00-00 00:00:00","29862" +"603","2","Fierro","Boyd","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","603 Fierro","1","0000-00-00 00:00:00","8563" +"694","3","Carolan","Marc","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","694 Carolan","1","0000-00-00 00:00:00","20987" +"338","2","Koziel","Keturah","0","0","0","0","1","0","0","TERM","0","0","0","0","999","0","338 Koziel","1","0000-00-00 00:00:00","28676" +"2442","2","Spitz","Criselda","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2442 Spitz","1","0000-00-00 00:00:00","8580" +"9654","2","Graybeal","Hermine","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","9654 Graybeal","1","0000-00-00 00:00:00","8638" +"9654","1","Kilpatrick","Chong","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9654 Kilpatrick","1","0000-00-00 00:00:00","8490" +"9608","3","Getz","Aide","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9608 Getz","1","0000-00-00 00:00:00","24440" +"9608","2","Hix","Verda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9608 Hix","1","0000-00-00 00:00:00","24439" +"621","1","Able","Queen","999.99","0","0","20","1","1","1","PC","1","1","0","0","999","1","621 Able","1","0000-00-00 00:00:00","7225" +"2130","1","Peer","Art","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","2130 Peer","1","0000-00-00 00:00:00","8496" +"7691","2","Madson","Suzie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7691 Madson","1","0000-00-00 00:00:00","23023" +"5205","1","Toscano","Calista","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5205 Toscano","1","0000-00-00 00:00:00","8499" +"3076","4","Rodrigez","Maria","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","3076 Rodrigez","1","0000-00-00 00:00:00","8658" +"3076","1","Sunderland","Haley","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3076 Sunderland","1","0000-00-00 00:00:00","8501" +"5807","2","Mumper","Winona","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5807 Mumper","1","0000-00-00 00:00:00","18444" +"3769","2","Knudsen","Jared","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","3769 Knudsen","1","0000-00-00 00:00:00","8662" +"2115","1","Fitting","Tawna","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2115 Fitting","1","0000-00-00 00:00:00","8506" +"5044","1","Lamp","Romelia","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","5044 Lamp","1","0000-00-00 00:00:00","8507" +"5794","2","Boyett","Hulda","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","5794 Boyett","1","0000-00-00 00:00:00","19046" +"5404","1","Flinchum","Amelia","999.99","0","0","0","0","1","1","INACT","0","0","0","0","999","0","5404 Flinchum","1","0000-00-00 00:00:00","8510" +"3902","1","Janco","Delinda","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3902 Janco","1","0000-00-00 00:00:00","8511" +"791","3","Boggan","Wanita","0","1.08","0","0","1","0","0","INACT","0","0","0","0","999","0","791 Boggan","1","0000-00-00 00:00:00","19160" +"5969","1","Steitz","Frederick","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5969 Steitz","1","0000-00-00 00:00:00","8513" +"2209","2","Leight","Mikel","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2209 Leight","1","0000-00-00 00:00:00","15010" +"2209","1","Gains","Marilee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2209 Gains","1","0000-00-00 00:00:00","8514" +"581","2","Larkin","Nola","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","581 Larkin","1","0000-00-00 00:00:00","29387" +"3605","1","Simkins","Rozella","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3605 Simkins","1","0000-00-00 00:00:00","8516" +"3773","2","Madson","Karlyn","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","3773 Madson","1","0000-00-00 00:00:00","17309" +"3773","3","Oquendo","Clementine","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","3773 Oquendo","1","0000-00-00 00:00:00","17310" +"4765","3","Weiler","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4765 Weiler","1","0000-00-00 00:00:00","9768" +"485","2","Conger","Myrtis","0","0","0","0","0","0","0","INACT","0","0","0","0","999","0","485 Conger","1","0000-00-00 00:00:00","29294" +"4776","1","Derosa","Kenny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","4776 Derosa","1","0000-00-00 00:00:00","8586" +"3016","1","Burkhalter","Tiffiny","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3016 Burkhalter","1","0000-00-00 00:00:00","8587" +"7653","1","Quintero","Maren","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","7653 Quintero","1","0000-00-00 00:00:00","8588" +"2200","1","Bryce","Shella","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","2200 Bryce","1","0000-00-00 00:00:00","8589" +"5010","1","Perron","Nichol","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5010 Perron","1","0000-00-00 00:00:00","8590" +"7588","2","Komar","Jacklyn","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","7588 Komar","1","0000-00-00 00:00:00","8684" +"2288","2","Synder","Troy","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","2288 Synder","1","0000-00-00 00:00:00","21615" +"5048","1","Gerst","Eve","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5048 Gerst","1","0000-00-00 00:00:00","8596" +"6942","2","Pae","Carol","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6942 Pae","1","0000-00-00 00:00:00","24534" +"6942","3","Labree","Davis","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6942 Labree","1","0000-00-00 00:00:00","24535" +"7271","2","Creel","Ethan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","7271 Creel","1","0000-00-00 00:00:00","8691" +"1609","3","Bryce","Wendie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1609 Bryce","1","0000-00-00 00:00:00","25374" +"1609","1","Hafley","Twana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1609 Hafley","1","0000-00-00 00:00:00","8599" +"1421","1","Sledge","Temeka","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1421 Sledge","1","0000-00-00 00:00:00","8600" +"425","2","Winchell","Shondra","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","425 Winchell","1","0000-00-00 00:00:00","20195" +"3472","1","Zaccaria","Cornelius","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3472 Zaccaria","1","0000-00-00 00:00:00","8603" +"5028","3","Ater","Rozella","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5028 Ater","1","0000-00-00 00:00:00","18837" +"5028","1","Ratti","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5028 Ratti","1","0000-00-00 00:00:00","8605" +"8640","2","Giffen","Venetta","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","8640 Giffen","1","0000-00-00 00:00:00","17127" +"8640","1","Spitz","Van","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","8640 Spitz","1","0000-00-00 00:00:00","8608" +"4819","1","Acklin","Lina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","4819 Acklin","1","0000-00-00 00:00:00","8612" +"1763","2","Koziel","Larae","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","1763 Koziel","1","0000-00-00 00:00:00","8769" +"2059","1","Lajeunesse","Eldridge","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","2059 Lajeunesse","1","0000-00-00 00:00:00","8615" +"3668","1","Dillenbeck","Luanne","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3668 Dillenbeck","1","0000-00-00 00:00:00","8616" +"5592","1","World","Maynard","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5592 World","1","0000-00-00 00:00:00","8618" +"3374","2","Trigg","Juli","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","3374 Trigg","1","0000-00-00 00:00:00","19594" +"3374","1","Epling","Stacey","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","3374 Epling","1","0000-00-00 00:00:00","8621" +"8401","2","Dobson","Myrl","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8401 Dobson","1","0000-00-00 00:00:00","18841" +"8401","4","Gargiulo","Marline","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","8401 Gargiulo","1","0000-00-00 00:00:00","18843" +"2978","2","Oyola","Valorie","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","2978 Oyola","1","0000-00-00 00:00:00","8772" +"1020","2","Hankerson","Gregorio","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1020 Hankerson","1","0000-00-00 00:00:00","24557" +"1020","1","Pickell","Hai","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1020 Pickell","1","0000-00-00 00:00:00","8702" +"4427","2","Davisson","Stephania","0","-5","0","20","1","0","0","PC","1","0","0","0","999","0","4427 Davisson","1","0000-00-00 00:00:00","30260" +"9061","2","Janco","Amada","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","9061 Janco","1","0000-00-00 00:00:00","8777" +"3882","1","Mcburney","Sonia","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3882 Mcburney","1","0000-00-00 00:00:00","8705" +"8466","1","Vaughns","Selma","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8466 Vaughns","1","0000-00-00 00:00:00","8707" +"8466","3","Ming","Julene","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8466 Ming","1","0000-00-00 00:00:00","8780" +"5861","1","Simkins","Delila","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","5861 Simkins","1","0000-00-00 00:00:00","8708" +"8174","2","Lanier","Johnsie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8174 Lanier","1","0000-00-00 00:00:00","8773" +"1175","4","Cutchin","Alfonso","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1175 Cutchin","1","0000-00-00 00:00:00","22764" +"1175","2","Capshaw","Nellie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1175 Capshaw","1","0000-00-00 00:00:00","22762" +"8516","3","Choiniere","Freddy","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8516 Choiniere","1","0000-00-00 00:00:00","8831" +"8516","4","Arata","Maurice","0","0","0","20","1","0","0","PC","1","0","0","0","0","1","8516 Arata","1","0000-00-00 00:00:00","8832" +"7670","2","Lheureux","Carisa","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","7670 Lheureux","1","0000-00-00 00:00:00","19776" +"526","1","Sherron","Jacquelin","999.99","23.22","12","75","1","1","1","PC","3","1","0","0","999","0","526 Sherron","1","0000-00-00 00:00:00","8719" +"526","3","Wachowiak","Chantal","0","23.22","12","75","1","0","0","PC","3","1","0","0","999","0","526 Wachowiak","1","0000-00-00 00:00:00","30496" +"4391","1","Aguirre","Earleen","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4391 Aguirre","1","0000-00-00 00:00:00","8720" +"7465","1","Maestas","Mi","999.99","0","0","0","0","1","1","TERM","0","0","0","0","999","0","7465 Maestas","1","0000-00-00 00:00:00","8725" +"6196","2","Means","Andria","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","6196 Means","1","0000-00-00 00:00:00","24836" +"1039","2","Gory","Kyle","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","1039 Gory","1","0000-00-00 00:00:00","20287" +"1668","1","Trafton","Jamie","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","1668 Trafton","1","0000-00-00 00:00:00","8728" +"3875","1","Headrick","Joaquina","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","3875 Headrick","1","0000-00-00 00:00:00","8729" +"5043","4","Desanti","Arlene","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","5043 Desanti","1","0000-00-00 00:00:00","11400" +"5043","2","Owen","Dagmar","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","5043 Owen","1","0000-00-00 00:00:00","8477" +"5313","1","Adcock","Khalilah","999.99","0","0","20","1","1","1","PC","1","0","0","1298.19","999","1","5313 Adcock","1","0000-00-00 00:00:00","4940" +"5179","1","Oyola","Nola","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5179 Oyola","1","0000-00-00 00:00:00","8734" +"5432","2","Mcsherry","Svetlana","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5432 Mcsherry","1","0000-00-00 00:00:00","31347" +"5558","2","Bohn","Macy","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5558 Bohn","1","0000-00-00 00:00:00","8855" +"5403","3","Sester","Demetrice","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","5403 Sester","1","0000-00-00 00:00:00","8857" +"5403","1","Weimar","Destiny","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5403 Weimar","1","0000-00-00 00:00:00","8739" +"5118","2","Headrick","Johnny","0","0","0","20","1","0","0","PC","1","0","0","0","0","0","5118 Headrick","1","0000-00-00 00:00:00","8858" +"1333","2","Czaja","Tia","0","0","0","20","1","0","0","PC","1","0","0","0","999","1","1333 Czaja","1","0000-00-00 00:00:00","30263" +"5091","3","Arata","Lashon","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","5091 Arata","1","0000-00-00 00:00:00","19440" +"9066","1","Aguinaga","Sage","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","9066 Aguinaga","1","0000-00-00 00:00:00","8788" +"2322","1","Limon","Owen","999.99","3.19","0","20","1","1","1","PC","1","0","0","0","999","0","2322 Limon","1","0000-00-00 00:00:00","8791" +"5936","1","Stahl","Tegan","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","5936 Stahl","1","0000-00-00 00:00:00","8793" +"7365","1","Godines","Carlos","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7365 Godines","1","0000-00-00 00:00:00","8794" +"7467","1","Raske","Ramiro","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","7467 Raske","1","0000-00-00 00:00:00","8796" +"8637","2","Kulesza","Latricia","999.99","0","0","20","1","0","1","PC","1","0","0","0","999","0","8637 Kulesza","1","0000-00-00 00:00:00","9809" +"3671","2","Nevin","Lina","0","0","0","20","1","0","0","PC","1","0","0","0","999","0","3671 Nevin","1","0000-00-00 00:00:00","19661" +"4925","3","Dealba","Roseann","0","0","0","0","1","0","0","INACT","0","0","0","0","0","0","4925 Dealba","1","0000-00-00 00:00:00","8920" +"4925","1","Burkhalter","Melonie","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","4925 Burkhalter","1","0000-00-00 00:00:00","8806" +"1211","1","Lone","Haydee","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","0","1211 Lone","1","0000-00-00 00:00:00","8810" +"8575","1","Milian","Leonel","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8575 Milian","1","0000-00-00 00:00:00","8811" +"5577","1","Thach","Caroll","999.99","0","0","0","1","1","1","INACT","0","0","0","0","999","0","5577 Thach","1","0000-00-00 00:00:00","8812" +"7838","3","Schmucker","Brendan","999.99","16.2","12","25","1","1","1","PC","3","1","0","0","999","1","7838 Schmucker","1","0000-00-00 00:00:00","31779" +"7838","2","Roten","Anika","999.99","16.2","12","25","1","1","1","PC","3","1","0","0","999","1","7838 Roten","1","0000-00-00 00:00:00","31778" +"8198","2","Storms","Svetlana","0","0","0","0","0","0","0","TERM","0","0","0","0","999","0","8198 Storms","1","0000-00-00 00:00:00","29337" +"8151","2","Coppola","Ava","999.99","0","0","20","1","1","1","PC","1","0","0","0","999","1","8151 Coppola","1","0000-00-00 00:00:00","15763" + diff --git a/fannie/install/sample_data/departments.sql b/fannie/install/sample_data/departments.sql new file mode 100644 index 000000000..9a7c5cd85 --- /dev/null +++ b/fannie/install/sample_data/departments.sql @@ -0,0 +1,247 @@ +('92','HBHBA','1','0',50.00,0.01,'0','2005-13-12','1') +('104','HHOMEOPATHIC','1','0',50.00,0.01,'0','2005-13-12','1') +('14','BWATER','0','1',50.00,0.01,'0','2005-13-12','1') +('191','GSOBEVNOTAX','0','1',50.00,0.01,'0','2005-13-12','1') +('246','GMSOGENMERCH','1','0',50.00,0.01,'0','2005-13-12','1') +('249','GMSEEDSFLWR','1','0',50.00,0.01,'0','2005-13-12','1') +('247','PTRANSFLWR','1','0',50.00,0.01,'0','2005-13-12','1') +('248','PTRANSEDIBLE','0','1',50.00,0.01,'0','2005-13-12','1') +('250','GMSEEDSEDIBLE','0','1',50.00,0.01,'0','2005-13-12','1') +('1','BBAKING','0','1',50.00,0.01,'0','1900-01-01','1') +('2','BBEAN','0','1',50.00,0.01,'0','1900-01-01','1') +('3','BCEREAL','0','1',50.00,0.01,'0','1900-01-01','1') +('4','BDRIEDFRU','0','1',50.00,0.01,'0','1900-01-01','1') +('5','BFLOUR','0','1',50.00,0.01,'0','1900-01-01','1') +('6','BGRAIN','0','1',50.00,0.01,'0','1900-01-01','1') +('7','BMIXES','0','1',50.00,0.01,'0','1900-01-01','1') +('8','BNUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('10','BPASTA','0','1',50.00,0.01,'0','1900-01-01','1') +('11','BRICE','0','1',50.00,0.01,'0','1900-01-01','1') +('12','BSNACK','0','1',50.00,0.01,'0','1900-01-01','1') +('13','BOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('15','BOIL','0','1',50.00,0.01,'0','1900-01-01','1') +('16','BCANDY','1','1',50.00,0.01,'0','1900-01-01','1') +('17','BCHOC','1','1',50.00,0.01,'0','1900-01-01','1') +('18','BNONFOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('19','BTAXFOOD','1','1',50.00,0.01,'0','1900-01-01','1') +('21','BAGREFUN','0','1',50.00,0.01,'0','1900-01-01','1') +('22','BSOBULK B','0','1',50.00,0.01,'0','1900-01-01','1') +('23','PREPACK','0','1',50.00,0.01,'0','1900-01-01','1') +('24','BSOBULK A','0','1',50.00,0.01,'0','1900-01-01','1') +('25','BSO NONFOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('26','CBUTTER','0','1',50.00,0.01,'0','1900-01-01','1') +('27','CDAIRY','0','1',50.00,0.01,'0','1900-01-01','1') +('28','CEGGS','0','1',50.00,0.01,'0','1900-01-01','1') +('29','CJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('30','CMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('31','CSOY','0','1',50.00,0.01,'0','1900-01-01','1') +('32','CSOYMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('188','GBEVNOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('34','COTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('38','FZBAK','0','1',50.00,0.01,'0','1900-01-01','1') +('39','FZDEZ','0','1',50.00,0.01,'0','1900-01-01','1') +('40','FZENTREE','0','1',50.00,0.01,'0','1900-01-01','1') +('41','FZFRUITVE','0','1',50.00,0.01,'0','1900-01-01','1') +('42','FZJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('261','MEAT FZ','0','1',50.00,0.01,'0','1900-01-01','1') +('44','FZPIZZA','0','1',50.00,0.01,'0','1900-01-01','1') +('45','FZSOY','0','1',50.00,0.01,'0','1900-01-01','1') +('46','FZOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('189','GBEVTAX','1','1',50.00,0.01,'0','1900-01-01','1') +('54','CJUGRETUR','0','1',50.00,0.01,'0','1900-01-01','1') +('55','CSO','0','1',50.00,0.01,'0','1900-01-01','1') +('56','CSOMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('57','FZSO','0','1',50.00,0.01,'0','1900-01-01','1') +('190','GSOBEVTAX','1','1',50.00,0.01,'0','1900-01-01','1') +('59','CCOUPON','0','1',50.00,0.01,'0','1900-01-01','1') +('60','DBAKED','2','0',50.00,0.01,'0','1900-01-01','1') +('63','DCASE','2','0',50.00,0.01,'0','1900-01-01','1') +('64','DPREPACK','2','0',50.00,0.01,'0','1900-01-01','1') +('65','DSANDWICH','2','0',50.00,0.01,'0','1900-01-01','1') +('66','DSOUP','0','0',50.00,0.01,'0','1900-01-01','1') +('67','DSTEAMTAB','2','0',50.00,0.01,'0','1900-01-01','1') +('68','DOTHER','2','0',50.00,0.01,'0','1900-01-01','1') +('69','DBEVERAGE','2','0',50.00,0.01,'0','1900-01-01','1') +('70','DPREPCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('71','DPORTCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('72','DSOCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('73','DSO','2','0',50.00,0.01,'0','1900-01-01','1') +('74','DCOUPON','1','0',50.00,0.01,'0','1900-01-01','1') +('150','DOutsideBakery','0','1',50.00,0.01,'0','1900-01-01','1') +('151','GTEA','0','1',50.00,0.01,'0','1900-01-01','1') +('152','GBABY','0','1',50.00,0.01,'0','1900-01-01','1') +('153','GBAK/MIX','0','1',50.00,0.01,'0','1900-01-01','1') +('154','GBARS','0','1',50.00,0.01,'0','1900-01-01','1') +('155','GCOOK/BKD','0','1',50.00,0.01,'0','1900-01-01','1') +('156','GCANBNVEG','0','1',50.00,0.01,'0','1900-01-01','1') +('157','GCEREAL','0','1',50.00,0.01,'0','1900-01-01','1') +('158','GCHIP','0','1',50.00,0.01,'0','1900-01-01','1') +('159','GCRACK/SN','0','1',50.00,0.01,'0','1900-01-01','1') +('160','GCOND/VIN','0','1',50.00,0.01,'0','1900-01-01','1') +('161','GETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('162','GCANDYNOT','0','1',50.00,0.01,'0','1900-01-01','1') +('163','GGRAIN/RI','0','1',50.00,0.01,'0','1900-01-01','1') +('164','GJAM','0','1',50.00,0.01,'0','1900-01-01','1') +('165','GJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('166','GMILK/POW','0','1',50.00,0.01,'0','1900-01-01','1') +('167','GMIX/PREP','0','1',50.00,0.01,'0','1900-01-01','1') +('168','GNUTBUTTE','0','1',50.00,0.01,'0','1900-01-01','1') +('169','GOIL','0','1',50.00,0.01,'0','1900-01-01','1') +('170','GPASTA','0','1',50.00,0.01,'0','1900-01-01','1') +('171','GPICK/OLI','0','1',50.00,0.01,'0','1900-01-01','1') +('172','GSEAFOOD','0','1',50.00,0.01,'0','1900-01-01','1') +('173','GSALAD/DR','0','1',50.00,0.01,'0','1900-01-01','1') +('174','GSOUPCAN','0','1',50.00,0.01,'0','1900-01-01','1') +('175','GSOUP/PKG','0','1',50.00,0.01,'0','1900-01-01','1') +('176','GSWEETENE','0','1',50.00,0.01,'0','1900-01-01','1') +('177','GTOMATO','0','1',50.00,0.01,'0','1900-01-01','1') +('178','GSO NOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('179','GCANDY','1','1',50.00,0.01,'0','1900-01-01','1') +('180','GCANDYSO','1','1',50.00,0.01,'0','1900-01-01','1') +('181','GHHCLEANR','1','0',50.00,0.01,'0','1900-01-01','1') +('182','GNFPET','1','0',50.00,0.01,'0','1900-01-01','1') +('183','GHHPAPER','1','0',50.00,0.01,'0','1900-01-01','1') +('185','GNFOODSO','1','0',50.00,0.01,'0','1900-01-01','1') +('186','GOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('251','BCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('252','BDRVEGGIE','0','1',50.00,0.01,'0','1900-01-01','1') +('253','BHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('254','BORGHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('255','BTEA','0','1',50.00,0.01,'0','1900-01-01','1') +('256','BVIT','1','0',50.00,0.01,'0','1900-01-01','1') +('257','BFOOD','0','1',50.00,0.01,'0','1900-01-01','1') +('245','BPKGCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('239','BPACKNOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('93','HBODYCARE','1','0',50.00,0.01,'0','1900-01-01','1') +('94','HFACIAL','1','0',50.00,0.01,'0','1900-01-01','1') +('95','HBATH','1','0',50.00,0.01,'0','1900-01-01','1') +('96','HHAIR','1','0',50.00,0.01,'0','1900-01-01','1') +('97','HLOTION','1','0',50.00,0.01,'0','1900-01-01','1') +('98','HSOAP','1','0',50.00,0.01,'0','1900-01-01','1') +('99','HTEETH','1','0',50.00,0.01,'0','1900-01-01','1') +('100','HNONTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('101','HVITSUPPL','1','0',50.00,0.01,'0','1900-01-01','1') +('102','HHERB','1','0',50.00,0.01,'0','1900-01-01','1') +('103','HOTHER','1','0',50.00,0.01,'0','1900-01-01','1') +('244','GMBooks','1','0',50.00,0.01,'0','1900-01-01','1') +('258','BSOHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('259','BSOCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('123','HSOBODYCA','1','0',50.00,0.01,'0','1900-01-01','1') +('124','HSOVITHERB','1','0',50.00,0.01,'0','1900-01-01','1') +('125','HSOBHBA','1','0',50.00,0.01,'0','1900-01-01','1') +('243','GMSOBooks','1','0',50.00,0.01,'0','1900-01-01','1') +('127','HSONOTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('128','HCOUPON','1','0',50.00,0.01,'0','1900-01-01','1') +('600','SUPPLIES','0','0',50.00,0.01,'0','1900-01-01','1') +('187','GNONFDNOTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('500','FLOWERS','1','0',50.00,0.01,'0','1900-01-01','1') +('502','PRODUCE KEY','0','1',50.00,0.01,'0','1900-01-01','1') +('604','MISC PO','0','0',50.00,0.01,'0','1900-01-01','1') +('503','BASKETS','0','1',50.00,0.01,'0','1900-01-01','1') +('505','TRANSEDIBLE','1','1',50.00,0.01,'0','1900-01-01','1') +('507','SO TAX','1','0',50.00,0.01,'0','1900-01-01','1') +('200','PFLOWERS','1','1',50.00,0.01,'0','1900-01-01','1') +('201','PFRUIT','0','1',50.00,0.01,'0','1900-01-01','1') +('202','PJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('203','PNONFOOD','1','1',50.00,0.01,'0','1900-01-01','1') +('204','POTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('205','PREVRACK','1','1',50.00,0.01,'0','1900-01-01','1') +('206','PSO','0','1',50.00,0.01,'0','1900-01-01','1') +('208','PVEGGIE','0','1',50.00,0.01,'0','1900-01-01','1') +('209','PSEEDS','0','1',50.00,0.01,'0','1900-01-01','1') +('210','PRODREVN','0','1',50.00,0.01,'0','1900-01-01','1') +('220','PCOUPON','0','1',50.00,0.01,'0','1900-01-01','1') +('900','GIFTCERT','0','0',50.00,0.01,'0','1900-01-01','1') +('990','ARPAYMEN','0','0',50.00,0.01,'0','1900-01-01','1') +('991','CLASS B Equity','0','0',80.00,0.01,'0','1900-01-01','1') +('700','TOTES','0','0',50.00,0.01,'0','1900-01-01','1') +('508','ASIAN','0','1',50.00,0.01,'0','1900-01-01','1') +('510','BRASSICA','0','1',50.00,0.01,'0','1900-01-01','1') +('703','MISCRECEIPT','0','0',50.00,0.01,'0','1900-01-01','1') +('512','ETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('513','GREENS','0','1',50.00,0.01,'0','1900-01-01','1') +('992','CLASS A Equity','0','0',20.00,0.01,'0','1900-01-01','1') +('61','DOUTDESSERTS','2','0',50.00,0.01,'0','1900-01-01','1') +('62','DCO-OPSHARE','2','0',50.00,0.01,'0','1900-01-01','1') +('225','DGGSALADS','2','0',50.00,0.01,'0','1900-01-01','1') +('226','DGGSANDWICH','2','0',50.00,0.01,'0','1900-01-01','1') +('227','DOLIVES','0','0',50.00,0.01,'0','1900-01-01','1') +('228','DDGGENTREE','2','0',50.00,0.01,'0','1900-01-01','1') +('229','DDESSERT','0','0',50.00,0.01,'0','1900-01-01','1') +('230','DPREPCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('231','DPORCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('232','DFAKECHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('233','DSOCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('37','CBEVERAGE','0','1',50.00,0.01,'0','1900-01-01','1') +('35','CYOGURT','0','1',50.00,0.01,'0','1900-01-01','1') +('260','MEAT FRESH','0','1',50.00,0.01,'0','1900-01-01','1') +('242','GMGENERAL','1','0',50.00,0.01,'0','1900-01-01','1') +('902','GIFTCARD','0','0',300.00,0.01,'0','1990-01-01','1') +('234','DVENDORS','0','1',50.00,0.01,'0','1900-01-01','1') +('235','MARKETING SALES','1','0',50.00,0.01,'0','1900-01-01','1') +('501','NON-FOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('240','GMMag','1','0',50.00,0.01,'0','2005-13-11','1') +('241','GMCards','1','0',50.00,0.01,'0','2005-13-11','1') +('262','MeatSOFrsh','0','1',50.00,0.01,'0','2005-13-12','1') +('263','MeatSOFrzn','0','1',50.00,0.01,'0','2005-13-12','1') +('53','CSOButter','0','1',50.00,0.01,'0','2005-13-12','1') +('800','IT Corrections','0','1',9999.00,'-9999.00','0','2006-08-01','1001') +('238','POLDFLOWERS','1','0',50.00,0.01,NULL,'2005-28-03','1') +('708','CLASSES','0','0',50.00,0.01,NULL,'2006-06-04','1001') +('75','DSOBAKED','0','0',50.00,0.01,'0','2006-11-05','1') +('207','PSOTAX','1','1',50.00,0.01,'0','2006-16-06','1') +('610','RRR','0','0',50.00,0.01,'0','2006-24-10','1001') +('76','DDELI MEATS','0','0',50.00,0.01,'0','1900-01-01','1') +('504','TRAYS','1','0',50.00,0.01,'0','1900-01-01','1') +('86','HSEASONAL','1','0',50.00,0.01,'0','2008-10-04','1') +('506','TRANSNONEDIBLE','1','0',50.00,0.01,'0','1900-01-01','1') +('509','BEAN','0','1',50.00,0.01,'0','1900-01-01','1') +('511','CARROTS','0','1',50.00,0.01,'0','1900-01-01','1') +('514','HERBS','0','1',50.00,0.01,'0','1900-01-01','1') +('515','LETTUCE','0','1',50.00,0.01,'0','1900-01-01','1') +('516','MUSHROOMS','0','1',50.00,0.01,'0','1900-01-01','1') +('517','ONIONS','0','1',50.00,0.01,'0','1900-01-01','1') +('518','PEPPERS','0','1',50.00,0.01,'0','1900-01-01','1') +('519','POTATOES','0','1',50.00,0.01,'0','1900-01-01','1') +('520','ROOTS','0','1',50.00,0.01,'0','1900-01-01','1') +('521','SALADS','0','1',50.00,0.01,'0','1900-01-01','1') +('522','SPROUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('523','SQUASH','0','1',50.00,0.01,'0','1900-01-01','1') +('524','TOMATOES','0','1',50.00,0.01,'0','1900-01-01','1') +('525','WSQUASH','0','1',50.00,0.01,'0','1900-01-01','1') +('526','YAMS','0','1',50.00,0.01,'0','1900-01-01','1') +('527','VEGGMISC','0','1',50.00,0.01,'0','1900-01-01','1') +('528','VEGGJAR','0','1',50.00,0.01,'0','1900-01-01','1') +('529','VEGGCUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('540','APPLEBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('541','APPLES','0','1',50.00,0.01,'0','1900-01-01','1') +('542','BERRIES','0','1',50.00,0.01,'0','1900-01-01','1') +('543','CITRUSBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('544','CITRUS','0','1',50.00,0.01,'0','1900-01-01','1') +('545','PEARBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('546','PEARS','0','1',50.00,0.01,'0','1900-01-01','1') +('547','TROPICAL','0','1',50.00,0.01,'0','1900-01-01','1') +('548','NUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('549','ETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('550','FIGS','0','1',50.00,0.01,'0','1900-01-01','1') +('551','GRAPES','0','1',50.00,0.01,'0','1900-01-01','1') +('552','FRUITJAR','0','1',50.00,0.01,'0','1900-01-01','1') +('553','FRUITMISC','0','1',50.00,0.01,'0','1900-01-01','1') +('554','FRUITCUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('555','MELONS','0','1',50.00,0.01,'0','1900-01-01','1') +('556','STONEFRUIT','0','1',50.00,0.01,'0','1900-01-01','1') +('557','AVOCADOS','0','1',50.00,0.01,'0','1900-01-01','1') +('535','PRODUCE CORRECTION','0','1',50.00,0.01,'0','2008-02-04','1') +('87','HLIP','1','0',50.00,0.01,'0','2008-10-04','1') +('88','HDEOD','1','0',50.00,0.01,'0','2008-10-04','1') +('89','HAROMATHERPY','1','0',50.00,0.01,'0','2008-10-04','1') +('90','HFIRSTAID','1','0',50.00,0.01,'0','2008-10-04','1') +('91','HKIDSBODY','1','0',50.00,0.01,'0','2008-10-04','1') +('105','HPROTEIN','1','0',50.00,0.01,'0','2008-10-04','1') +('106','HJUICE','1','0',50.00,0.01,'0','2008-10-04','1') +('107','HGREENS','1','0',50.00,0.01,'0','2008-10-04','1') +('108','HKIDSSUPP','1','0',50.00,0.01,'0','2008-10-04','1') +('881','MISC #1','0','0',50.00,0.01,'0','2008-12-08','1') +('882','MISC #2','0','0',50.00,0.01,'0','2008-12-08','1') +('236','MARKETING PROMO','0','0',50.00,0.01,'0','2009-26-01','1') +('77','DSPECIALEVENT','2','0',50.00,0.01,'0','2009-10-09','1') diff --git a/fannie/install/sample_data/employees.csv b/fannie/install/sample_data/employees.csv new file mode 100644 index 000000000..9f442675a --- /dev/null +++ b/fannie/install/sample_data/employees.csv @@ -0,0 +1,23 @@ +"35","8636","8636","Darius","B","CASHIER","1","20","20",\N +"839","3215","3215","Thanh","D","","1","30","20",\N +"498","165","165","Felicidad","D","","1","20","20",\N +"520","1183","1183","Elvis","C","","0","20","20",\N +"563","5417","5417","Quincy","J","","0","20","20",\N +"90","3541","3541","Chanell","F","","1","25","20",\N +"944","1456","1456","Marline","H","","1","20","20",\N +"828","6654","6654","Boyd","M","","0","30","30",\N +"496","8904","8904","Myrtle","M","AUTO","0","0","0",\N +"766","4563","4563","Reyna","F","","0","20","20",\N +"466","6102","6102","Anne","E","","1","20","20",\N +"485","6824","6824","Diana","K","","0","20","20",\N +"606","5813","5813","Shonda","N","","1","20","20",\N +"480","8594","8594","Ethan","M","","0","20","20",\N +"71","5533","5533","Monte","H","","0","20","20",\N +"37","1883","1883","Anamaria","C","","0","20","20",\N +"573","2815","2815","Noe","B","","0","20","20",\N +"329","8428","8428","Cathey","K","","1","30","30",\N +"187","3696","3696","Jamaal","W","","0","20","20",\N +"717","3197","3197","Amada","S","","1","30","30",\N +"366","4896","4896","Latricia","B","","1","30","30",\N +"689","4890","4890","Jacquelin","N","","0","20","20",\N +"153","9765","9765","Barbera","B","","0","20","20",\N diff --git a/fannie/install/sample_data/employees.sql.old b/fannie/install/sample_data/employees.sql.old new file mode 100644 index 000000000..6de98f697 --- /dev/null +++ b/fannie/install/sample_data/employees.sql.old @@ -0,0 +1,2 @@ +(56,56,56,'Kate','Kipling','STAFF',1,20,20) +(7000,7000,7000,'John','Norton','SUB',1,15,15) diff --git a/fannie/install/sample_data/extra_data.php b/fannie/install/sample_data/extra_data.php new file mode 100644 index 000000000..627c97488 --- /dev/null +++ b/fannie/install/sample_data/extra_data.php @@ -0,0 +1,155 @@ + + + +Fannie: Sample Data + + + + + + +
        +

        Fannie: Sample Data

        +
        +query("TRUNCATE TABLE employees"); + loaddata($db,'employees'); +} +elseif(isset($_REQUEST['custdata'])){ + echo "Loading custdata"; + $db->query("TRUNCATE TABLE custdata"); + loaddata($db,'custdata'); +} +elseif(isset($_REQUEST['memtype'])){ + echo "Loading memtype"; + $db->query("TRUNCATE TABLE memtype"); + loaddata($db,'memtype'); + echo "Loading memdefaults"; + $db->query("TRUNCATE TABLE memdefaults"); + loaddata($db,'memdefaults'); +} +elseif(isset($_REQUEST['products'])){ + echo "Loading products"; + $db->query("TRUNCATE TABLE products"); + loaddata($db,'products'); +} +elseif(isset($_REQUEST['depts'])){ + echo "Loading departments"; + $db->query("TRUNCATE TABLE departments"); + loaddata($db,'departments'); + /* subdepts sample data is of questionable use + echo "
        Loading subdepts"; + $db->query("TRUNCATE TABLE subdepts"); + loaddata($db,'subdepts'); + */ +} +elseif(isset($_REQUEST['memtype'])){ + echo "Loading memtype"; + $db->query("TRUNCATE TABLE memtype"); + loaddata($db,'memtype'); + echo "Loading memdefaults"; + $db->query("TRUNCATE TABLE memdefaults"); + loaddata($db,'memdefaults'); +} +elseif (isset($_REQUEST['superdepts'])){ + echo "Loadintg super departments"; + $db->query("TRUNCATE TABLE superdepts"); + loaddata($db,'superdepts'); + $db->query("TRUNCATE TABLE superDeptNames"); + loaddata($db,'superDeptNames'); +} +elseif (isset($_REQUEST['tenders'])){ + echo "Loadintg tenders"; + $db->query("TRUNCATE TABLE tenders"); + loaddata($db,'tenders'); +} +elseif (isset($_REQUEST['authentication'])){ + echo "Loading authentication info"; + $db->query("TRUNCATE TABLE userKnownPrivs"); + loaddata($db,'userKnownPrivs'); +} +elseif (isset($_REQUEST['origin'])){ + echo "Loading country info"; + $db->query("TRUNCATE TABLE originCountry"); + loaddata($db,'originCountry'); + echo "
        Loading state/province info"; + $db->query("TRUNCATE TABLE originStateProv"); + loaddata($db,'originStateProv'); +} +?> +
        +Some sample data is available to get a test lane +up & running quickly. Keep in mind this data +overwrites whatever is currently in the table. +
        These utilities populate the server tables. +Then use the Synchronize +utilities to populate the lane tables. +
        +Employees
        +This table contains login information for cashiers. The two +included logins are '56' and '7000'.
        + +
        +Custdata
        +Customer data is the membership information. Sample data includes +a bunch of members and default non-member 11.
        + +
        + +
        +Products
        +Stuff to sell. There's a lot of sample data. I think this might +be the Wedge's or at least a snapshot of it.
        + +
        +Departments
        +Products get categorized into departments . +You can also ring amounts directly to a department. Not needed, +strictly speaking, for a basic lane (Ring up items, total, +accept tender, provide change).
        + +
        +Super Department Names and Super Department Links
        +Super Departments are tags for grouping Departments. +A Department can have more than one. +Here is rudimentary set that agrees with the Products sample data. +Can also used to group the domains of Buyers. +
        Use them with e.g. the Product List report/tool +
        + +
        +Tenders: +Load all the default tenders into the tenders table.
        + +
        +Authentication: +Load information about currently defined authorization classes
        + +
        +Countries, States, and Provinces +Load default origin information
        + +
        +
        + + diff --git a/fannie/install/sample_data/globalvalues.sql b/fannie/install/sample_data/globalvalues.sql new file mode 100644 index 000000000..cc72187b0 --- /dev/null +++ b/fannie/install/sample_data/globalvalues.sql @@ -0,0 +1 @@ +(6000,'ADMIN ',1,11,0,0,0) diff --git a/fannie/install/sample_data/memContactPrefs.sql b/fannie/install/sample_data/memContactPrefs.sql new file mode 100644 index 000000000..aff190525 --- /dev/null +++ b/fannie/install/sample_data/memContactPrefs.sql @@ -0,0 +1,51 @@ +-- MySQL dump 10.13 Distrib 5.1.61, for debian-linux-gnu (i486) +-- +-- Host: localhost Database: core_op +-- ------------------------------------------------------ +-- Server version 5.1.61-0ubuntu0.10.04.1-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `memContactPrefs` +-- + +DROP TABLE IF EXISTS `memContactPrefs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `memContactPrefs` ( + `pref_id` int(11) NOT NULL DEFAULT '0', + `pref_description` varchar(50) DEFAULT NULL, + PRIMARY KEY (`pref_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `memContactPrefs` +-- + +LOCK TABLES `memContactPrefs` WRITE; +/*!40000 ALTER TABLE `memContactPrefs` DISABLE KEYS */; +INSERT INTO `memContactPrefs` VALUES (0,'No contact of any kind'),(1,'Postal mail only'),(2,'Email only'),(3,'Either postal mail or email'); +/*!40000 ALTER TABLE `memContactPrefs` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2012-12-07 0:57:37 diff --git a/fannie/install/sample_data/memdefaults.sql b/fannie/install/sample_data/memdefaults.sql new file mode 100644 index 000000000..04a08a609 --- /dev/null +++ b/fannie/install/sample_data/memdefaults.sql @@ -0,0 +1,2 @@ +(0,'REG',0,0,0) +(1,'PC',0,0,0) diff --git a/fannie/install/sample_data/memtype.sql b/fannie/install/sample_data/memtype.sql new file mode 100644 index 000000000..5a0989e33 --- /dev/null +++ b/fannie/install/sample_data/memtype.sql @@ -0,0 +1,2 @@ +(0, 'Non-member') +(1, 'Member') diff --git a/fannie/install/sample_data/originCountry.csv b/fannie/install/sample_data/originCountry.csv new file mode 100644 index 000000000..286f895a7 --- /dev/null +++ b/fannie/install/sample_data/originCountry.csv @@ -0,0 +1,244 @@ +1,Afghanistan +2,Ã…land Islands +3,Albania +4,Algeria +5,American Samoa +6,Andorra +7,Angola +8,Anguilla +9,Antarctica +10,Antigua and Barbuda +11,Argentina +12,Armenia +13,Aruba +14,Australia +15,Austria +16,Azerbaijan +17,Bahamas +18,Bahrain +19,Bangladesh +20,Barbados +21,Belarus +22,Belgium +23,Belize +24,Benin +25,Bermuda +26,Bhutan +27,Bolivia +28,Bosnia and Herzegovina +29,Botswana +30,Bouvet Island +31,Brazil +32,British Indian Ocean Territory +33,Brunei Darussalam +34,Bulgaria +35,Burkina Faso +36,Burundi +37,Cambodia +38,Cameroon +39,Canada +40,Cape Verde +41,Cayman Islands +42,Central African Republic +43,Chad +44,Chile +45,China +46,Christmas Island +47,Cocos (Keeling) Islands +48,Colombia +49,Comoros +50,Congo +51,Congo, The Democratic Republic of The +52,Cook Islands +53,Costa Rica +54,Cote D'ivoire +55,Croatia +56,Cuba +57,Cyprus +58,Czech Republic +59,Denmark +60,Djibouti +61,Dominica +62,Dominican Republic +63,Ecuador +64,Egypt +65,El Salvador +66,Equatorial Guinea +67,Eritrea +68,Estonia +69,Ethiopia +70,Falkland Islands (Malvinas) +71,Faroe Islands +72,Fiji +73,Finland +74,France +75,French Guiana +76,French Polynesia +77,French Southern Territories +78,Gabon +79,Gambia +80,Georgia +81,Germany +82,Ghana +83,Gibraltar +84,Greece +85,Greenland +86,Grenada +87,Guadeloupe +88,Guam +89,Guatemala +90,Guernsey +91,Guinea +92,Guinea-bissau +93,Guyana +94,Haiti +95,Heard Island and Mcdonald Islands +96,Holy See (Vatican City State) +97,Honduras +98,Hong Kong +99,Hungary +100,Iceland +101,India +102,Indonesia +103,Iran, Islamic Republic of +104,Iraq +105,Ireland +106,Isle of Man +107,Israel +108,Italy +109,Jamaica +110,Japan +111,Jersey +112,Jordan +113,Kazakhstan +114,Kenya +115,Kiribati +116,Korea, Democratic People's Republic of +117,Korea, Republic of +118,Kuwait +119,Kyrgyzstan +120,Lao People's Democratic Republic +121,Latvia +122,Lebanon +123,Lesotho +124,Liberia +125,Libyan Arab Jamahiriya +126,Liechtenstein +127,Lithuania +128,Luxembourg +129,Macao +130,Macedonia, The Former Yugoslav Republic of +131,Madagascar +132,Malawi +133,Malaysia +134,Maldives +135,Mali +136,Malta +137,Marshall Islands +138,Martinique +139,Mauritania +140,Mauritius +141,Mayotte +142,Mexico +143,Micronesia, Federated States of +144,Moldova, Republic of +145,Monaco +146,Mongolia +147,Montenegro +148,Montserrat +149,Morocco +150,Mozambique +151,Myanmar +152,Namibia +153,Nauru +154,Nepal +155,Netherlands +156,Netherlands Antilles +157,New Caledonia +158,New Zealand +159,Nicaragua +160,Niger +161,Nigeria +162,Niue +163,Norfolk Island +164,Northern Mariana Islands +165,Norway +166,Oman +167,Pakistan +168,Palau +169,Palestinian Territory, Occupied +170,Panama +171,Papua New Guinea +172,Paraguay +173,Peru +174,Philippines +175,Pitcairn +176,Poland +177,Portugal +178,Puerto Rico +179,Qatar +180,Reunion +181,Romania +182,Russian Federation +183,Rwanda +184,Saint Helena +185,Saint Kitts and Nevis +186,Saint Lucia +187,Saint Pierre and Miquelon +188,Saint Vincent and The Grenadines +189,Samoa +190,San Marino +191,Sao Tome and Principe +192,Saudi Arabia +193,Senegal +194,Serbia +195,Seychelles +196,Sierra Leone +197,Singapore +198,Slovakia +199,Slovenia +200,Solomon Islands +201,Somalia +202,South Africa +203,South Georgia and The South Sandwich Islands +204,Spain +205,Sri Lanka +206,Sudan +207,Suriname +208,Svalbard and Jan Mayen +209,Swaziland +210,Sweden +211,Switzerland +212,Syrian Arab Republic +213,Taiwan, Province of China +214,Tajikistan +215,Tanzania, United Republic of +216,Thailand +217,Timor-leste +218,Togo +219,Tokelau +220,Tonga +221,Trinidad and Tobago +222,Tunisia +223,Turkey +224,Turkmenistan +225,Turks and Caicos Islands +226,Tuvalu +227,Uganda +228,Ukraine +229,United Arab Emirates +230,United Kingdom +231,United States +232,United States Minor Outlying Islands +233,Uruguay +234,Uzbekistan +235,Vanuatu +236,Venezuela +237,Viet Nam +238,Virgin Islands, British +239,Virgin Islands, U.S. +240,Wallis and Futuna +241,Western Sahara +242,Yemen +243,Zambia +244,Zimbabwe diff --git a/fannie/install/sample_data/originStateProv.csv b/fannie/install/sample_data/originStateProv.csv new file mode 100644 index 000000000..514beecdc --- /dev/null +++ b/fannie/install/sample_data/originStateProv.csv @@ -0,0 +1,66 @@ +1,Alabama +2,Alaska +3,Alberta +4,Arizona +5,Arkansas +6,British Columbia +7,California +8,Colorado +9,Connecticut +10,Delaware +11,District Of Columbia +12,Florida +13,Georgia +14,Hawaii +15,Idaho +16,Illinois +17,Indiana +18,Iowa +19,Kansas +20,Kentucky +21,Louisiana +22,Maine +23,Manitoba +24,Maryland +25,Massachusetts +26,Michigan +27,Minnesota +28,Mississippi +29,Missouri +30,Montana +31,Nebraska +32,Nevada +33,New Brunswick +34,New Hampshire +35,New Jersey +36,New Mexico +37,New York +38,Newfoundland +39,North Carolina +40,North Dakota +41,Northwest Territories +42,Nova Scotia +43,Nunavut +44,Ohio +45,Oklahoma +46,Ontario +47,Oregon +48,Palau +49,Pennsylvania +50,Prince Edward Island +51,Puerto Rico +52,Quebec +53,Rhode Island +54,Saskatchewan +55,South Carolina +56,South Dakota +57,Tennessee +58,Texas +59,Utah +60,Vermont +61,Virginia +62,Washington +63,West Virginia +64,Wisconsin +65,Wyoming +66,Yukon diff --git a/fannie/install/sample_data/products.csv b/fannie/install/sample_data/products.csv new file mode 100644 index 000000000..9605b525d --- /dev/null +++ b/fannie/install/sample_data/products.csv @@ -0,0 +1,6661 @@ +"0000000000016","This is a test item","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","59","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","2" +"0000000000052","RRR","-1","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","610","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","3" +"0000000000111","WYNDMERE 5-8 DRAM BOTTLE","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4" +"0000000000123","BCOFFEE MYSTERY FOR DDD ","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","13007" +"0000000000200","10% OFF COUPON","2","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","604","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","9" +"0000000000211","BCEREAL MULTIGRAIN FLAKES ORG","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","0","0","0","0","13078" +"0000000000215","BGRANOLA STRAWBERRY VAN HEMP","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","0","0","0","0","13080" +"0000000000219","BRICE BLACK FORBIDDEN","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","11","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15661" +"0000000000225","BSALT BLACK","14.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14594" +"0000000000230","BBROTH CHICKEN FLAVOR NON-O","14.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15325" +"0000000000234","SHARPENERS, LIP ","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","14" +"0000000000245","2 OZ BROWN SPICE JAR","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","15" +"0000000000247","4 OZ BROWN SPICE JAR","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","17" +"0000000000250","SPICE JAR, CLEAR SIFTR 4OZ","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","19" +"0000000000253","BTEA RENES ESSIAC","53.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","22" +"0000000000255","BCOFFEE PEACE GUATEMALAN DARK","12.15","0","0","0","8.99","0","8.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","1","0","1","0","24" +"0000000000298","BPASTA WHITE ELBOWS","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","26" +"0000000000302","BALMONDS CALIF RAW ORGANIC","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","2","1","0","0","0","12984" +"0000000000304","BALMONDS SMOKIES NON-O","11.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","14787" +"0000000000306","BCOFFEE ALAKEF BONFIRE BLEND O","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","1","0","15409" +"0000000000308","BCINNAMON POWDER OG KORINTJE","8.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","2","0","0","0","0","14780" +"0000000000310","BGRANOLA CRAPOLA","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15519" +"0000000000315","BTARRAGON ","39.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","16223" +"0000000000318","BTEA MRS KELLY ORGANICO MELOGR","38.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","27" +"0000000000320","BTEA MRS KELLYS GINGER PEACH","26.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","29" +"0000000000322","BPICKLING SPICE NON-ORGANIC","14.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14874" +"0000000000333","BSPIRULINA POWDER ORG","34.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","256","0","0","0","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","33" +"0000000000336","BCHUNKS OF ENERGY RAW CACAO GO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","12","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","35" +"0000000000338","BPEANUT BUTTER ORG","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","1","0","0","0","37" +"0000000000340","BLENTILS FRENCH ORG","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","39" +"0000000000342","BALMOND BUTTER ","8.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","41" +"0000000000344","BGRANOLA HONEY GONE NUTS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","43" +"0000000000346","BALMONDS CALIF RSTD-SLTD NON-O","7.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","45" +"0000000000349","BRICE JASMINE BROWN ORG","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","11","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","47" +"0000000000352","BCHILI MIX VEGETARIAN CAMPING ","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","49" +"0000000000354","BGARLIC POWDER ORG","20.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","51" +"0000000000356","BTACO MIX","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","53" +"0000000000359","BAPPLES DRIED ORGANI","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","56" +"0000000000361","BAPRICOTS TURKISH ORG","6.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","58" +"0000000000363","BCRANBERRIES DRIED ORGANIC FJS","10.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","60" +"0000000000366","BDATES ORGANIC MEDJOOL","7.25","0","0","0","5.79","0","5.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","1","1","0","0","0","62" +"0000000000368","BFIGS BLACK ORG","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","64" +"0000000000371","BPAPAYA SPEARS","20.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","66" +"0000000000373","BMANGO DRIED ORGANIC","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","68" +"0000000000376","BPRUNES ORGANIC","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","70" +"0000000000379","BALFALFA SEEDS ORG","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","72" +"0000000000381","BPOPPY SEEDS ORG","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","74" +"0000000000385","BWHEAT GERM","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","76" +"0000000000387","BKELP GRANULES OG","14.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","256","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","78" +"0000000000389","BGRANOLA VANILLA MACAROON","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","80" +"0000000000391","BPOLENTA ORGANIC","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","82" +"0000000000393","BPASTA ELBOWS WW ORGANIC","2.35","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","2","0","0","0","0","0","1","6","1","0","0","0","84" +"0000000000395","BSPAGHETTI","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","86" +"0000000000397","BHEMPSEEDS SHELLED","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","1","0","0","0","88" +"0000000000401","BPECANS ORGANIC","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","91" +"0000000000403","BFLOUR QUINOA ORG","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","93" +"0000000000405","BSPAGHETTI WW SPINACH ORG","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","95" +"0000000000407","BFLOUR RICE BROWN ORG","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","97" +"0000000000409","BCORN MEAL ORGANIC","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","99" +"0000000000411","BFLOUR GOLD N WHITE ORG","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","101" +"0000000000413","BOIL OLIVE ORG SPECTRUM BRAND","9.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","15","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","103" +"0000000000415","BALMONDS CALIF RSTD/NO-SALT NO","7.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","105" +"0000000000417","BFLOUR SEMOLINA ORG","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","107" +"0000000000419","BFLOUR TAPIOCA","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","109" +"0000000000421","BBEANS LIMA ORG","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","111" +"0000000000423","BFLOUR RICE SWEET WHITE","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","113" +"0000000000425","BFLOUR WW PASTRY ORG","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","1","0","115" +"0000000000427","BCHOCOLATE CHIPS SEMI SWEET","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","1","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","117" +"0000000000430","BMAPLE SYRUP NON-OG LOCAL","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","119" +"0000000000432","BPRETZELS PEANUT BUTTER","7.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","16","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","1","0","0","0","121" +"0000000000434","BSUGAR BROWN","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","123" +"0000000000437","BSUGAR WHITE","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","124" +"0000000000439","BBARLEY FLAKES","1.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","126" +"0000000000441","BTAMARI ORGANIC","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","128" +"0000000000443","BOATMEAL THICK ORG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","130" +"0000000000445","BSESAME STICKS PLAIN","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","12","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","132" +"0000000000447","BBARLEY HULLED ORGAN","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","134" +"0000000000450","BRAISINS MILK CHOCOLATE ORG","11.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","16","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","137" +"0000000000452","BFLAXSEED MEAL GOLDEN","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","1","0","0","0","139" +"0000000000454","BOATS STEELCUT ORG","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","141" +"0000000000456","BRYE BERRIES ORGANIC","0.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","143" +"0000000000458","BWHEAT BERRIES ORG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","145" +"0000000000460","BRICE BASMATI BROWN ORG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","11","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","147" +"0000000000462","BRICE SWEET BROWN ORG","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","11","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","149" +"0000000000464","BRICE SHORT BROWN ORG","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","11","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","151" +"0000000000466","BRICE LONG WHITE ORG","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","11","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","153" +"0000000000468","BGRANOLA RASPBERRY AND CREAM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","155" +"0000000000470","BTRAIL MIX GO TAKE A HIKE ORG","9.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","12","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","157" +"0000000000472","BTSP ORGANIC","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","159" +"0000000000474","BORZO VEGGIE ORGANIC","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","161" +"0000000000476","BMALTBALLS","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","16","0","1","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","163" +"0000000000478","BPEANUTS BLANCHED R/S NON-O","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","165" +"0000000000480","BRAISINS YOGURT","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","16","0","1","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","167" +"0000000000482","BCINNAMON POWDER OG CEYLON","28.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","169" +"0000000000484","BALMONDS RAW ITALIAN ORG","11.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","171" +"0000000000486","BPEANUTS SPANISH R/S NON-O","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","173" +"0000000000489","BBRAZIL NUTS ORG","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","176" +"0000000000491","BCASHEW WHOLE RAW ORG","13.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","178" +"0000000000493","BFILBERTS RAW OG aka hazelnuts","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","180" +"0000000000496","BBANANAS DRIED RED ORG","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","182" +"0000000000500","BTRAIL MIX RSTD-SLTD NON-O","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","12","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","185" +"0000000000502","BSUNDROPS PLAIN","8.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","16","0","1","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","187" +"0000000000504","BPARSLEY ORGANIC","28.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","189" +"0000000000507","BSUNFLOWER SEEDS RS","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","191" +"0000000000509","BYEAST FLAKES, NUTRITIONAL","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","19","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","193" +"0000000000511","BBAKING POWDER, ALUMINUM FREE","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","195" +"0000000000513","BSUNFLOWER SEEDS RAW ORG","3.25","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","1","1","0","0","0","197" +"0000000000515","BBAKING SODA","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","199" +"0000000000519","BBAY LEAVES ORGANIC","24.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","201" +"0000000000522","BCASHEW PIECES RSTD-UNSLTD","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","203" +"0000000000524","BCACAO NIBS ORG FAIR TRADE","11.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","205" +"0000000000526","BOATSTRAW C/S ORGANIC","18.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","1","0","0","0","207" +"0000000000529","BCEREAL 7 GRAIN ORG","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","209" +"0000000000533","BGRANOLA MAPLE ALMOND","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","211" +"0000000000536","BGARLIC GRANULES ORG","21.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","213" +"0000000000538","BALFALFA LEAF ORG","17.05","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","215" +"0000000000540","BALLSPICE GROUND ORG","33.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","217" +"0000000000542","BCOFFEE PEACE SUMATRAN ITALIAN","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","1","0","1","0","219" +"0000000000547","BBASIL ORG","26.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","221" +"0000000000551","BDATE FINES","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","223" +"0000000000553","BCARAWAY SEED ORG","11.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","225" +"0000000000555","BCARDAMOM SEEDS ORG ","59.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","227" +"0000000000557","BCAYENNE 90000 HU","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","229" +"0000000000559","BCELERY SEED ","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","231" +"0000000000561","BCHAMOMILE ORG","30.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","233" +"0000000000563","BCHIVES ORG","21.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","235" +"0000000000566","BCHILI POWDER ORG","24.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","237" +"0000000000569","BCHILI POWDER EXTRA HOT NON-O","13.29","0","0","0","11.29","0","11.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","2","0","0","0","0","0","1","6","1","0","0","0","239" +"0000000000571","BCINNAMON STICKS 3inch ORG","44.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","241" +"0000000000575","BCASHEW PIECES RAW ORG","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","243" +"0000000000578","BTEA JASMINE GREEN ORG","40.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","245" +"0000000000580","BCHEESE POWDER ORG","20.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","247" +"0000000000583","BCORIANDER SEED WHOLE ORG","15.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","249" +"0000000000586","BSOYNUTS OG","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","12","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","251" +"0000000000588","BDILL WEED ORG","35.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","253" +"0000000000591","BEUCALYPTUS LEAF ORG","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","255" +"0000000000593","BFENNEL GR ORG","19.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","257" +"0000000000596","BHERBS DE PROVINCE","25.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","259" +"0000000000599","BGARLIC SALT ORG","10.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","261" +"0000000000601","BTEA BANCHA GREEN ORG","24.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","263" +"0000000000603","BEGG POWDER, ORG","28.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","265" +"0000000000605","BEGG NOODLES","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","267" +"0000000000607","BBROTH BEEF-FLAVORED NON-O","10.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","269" +"0000000000612","BITALIAN SEASONING,ORG","23.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","271" +"0000000000614","BLAVENDER ","35.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","273" +"0000000000617","BLEMON PEEL GRANULES ORG","15.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","252","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","275" +"0000000000620","BMACE POWDER ORG FAIR TRADE","37.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","278" +"0000000000622","BLICORICE ROOT NON-ORG","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15178" +"0000000000624","BNUTMEG GROUND ORG FAIR TRADE","43.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","281" +"0000000000627","BMUSTARD YEL GRND ORG","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","282" +"0000000000629","BMUSTARD BROWN WHOLE ORG","7.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","284" +"0000000000631","BORANGE PEEL GRANULES ORG","11.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","252","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","286" +"0000000000634","BFLOUR GLUTEN FREE BAKING","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15211" +"0000000000636","BONION FLAKES ORG minced onion","17.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","289" +"0000000000639","BPICKLING SPICE ORG","16.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","291" +"0000000000641","BPAU DARCO C/S","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","293" +"0000000000643","BPAPRIKA HUNGARIAN","18.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","295" +"0000000000645","BCHILI PEPPERS CHIPOLTLE WHOLE","27.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","297" +"0000000000647","BPEPPER WHITE GROUND ORG FT","32.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","299" +"0000000000650","BPEPPERCORNS WHITE WHOLE ORG","29.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","301" +"0000000000654","BBURDOCK ROOT ORG","21.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","303" +"0000000000656","BMULLING SPICE CITRUS NON-ORG","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","1","0","0","0","305" +"0000000000658","BROSEMARY LEAF WHOLE ORG","15.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","307" +"0000000000660","BSAGE RUBBED ORG","24.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","309" +"0000000000662","BALMOND TAMARI-RSTD CALIF ORG","8.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","311" +"0000000000664","BFLOUR SPELT WHITE ORG","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","313" +"0000000000666","EXTRA BAG","0.05","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","13","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","1","0","0","0","315" +"0000000000668","BTACO SEASONING ORG","26.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","317" +"0000000000673","BVALERIAN ROOT ORG","29.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","321" +"0000000000676","BNATURES BURGER MIX","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","323" +"0000000000678","BTEA MRS KELLYS MARKET MINT","26.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","325" +"0000000000682","BTEA INDIAN SPICE","24.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","327" +"0000000000684","BLEMONADE MIX","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","329" +"0000000000686","BBACUN BITS ORG","16.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","331" +"0000000000690","BCHERRIES ORG","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","333" +"0000000000694","BBROTH VEGGIE ORG LOW-SODIUM","15.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","335" +"0000000000699","BSOUP MIX CURRY LENTIL","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","337" +"0000000000701","BSOUP MIX VEGETABLE ORG","18.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","252","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","339" +"0000000000706","BCORN SWEET WHOLE","19.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","252","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","341" +"0000000000708","BGRANOLA TOASTED ALL-GRAIN","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","343" +"0000000000711","BFLAX SEED BROWN ORG","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","345" +"0000000000714","BARROWROOT POWDER","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","347" +"0000000000716","BFLAX SEED GOLDEN ORGANIC","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","349" +"0000000000722","BRAISINS THOMPSON ORG","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","351" +"0000000000724","BBEANS GARBANZO ORG","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","353" +"0000000000726","BBEANS KIDNEY ORG","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","355" +"0000000000728","BFLOUR SIR GALAHAD ARTISAN","0.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","357" +"0000000000730","BBEANS NAVY ORG","1.75","0","0","0","1.49","0","1.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","2","1","0","0","0","359" +"0000000000732","BBEANS RED ORG","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","361" +"0000000000734","BPEAS YELLOW SPLIT ORG","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","363" +"0000000000736","BPEAS BLACKEYE ORG","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","1","0","0","0","365" +"0000000000738","BLENTILS GREEN ORG","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","367" +"0000000000744","BSARSAPARILLA","14.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","369" +"0000000000746","BYELLOWDOCK ROOT","22.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","371" +"0000000000749","BBEANS MUNG ORG","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","2","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","373" +"0000000000753","BWASABI PEAS","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","12","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","375" +"0000000000757","BTEA ASSAM OG FT","30.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","1","0","0","0","377" +"0000000000760","BPEPPERCORNS BLACK OG FAIR TRA","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","380" +"0000000000764","BCOFFEE PEACE DECAF FULL CITY","14.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","382" +"0000000000771","BCOFFEE ALAKEF PERU","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","385" +"0000000000773","BCOFFEE ALAKEF BREAKFAST BLEND","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","1","0","387" +"0000000000775","BCOFFEE ALAKEF ITALIAN","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","1","0","389" +"0000000000777","BCOFFEE PEACE MEXICAN DARK","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","1","0","391" +"0000000000780","BCOFFEE ALAKEF SCANDINAVIAN","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","1","0","1","0","393" +"0000000000782","BCOFFEE ALAKEF SUMATRA","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","1","0","395" +"0000000000784","BCOFFEE EQUAL FRENCH","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","397" +"0000000000786","BCOFFEE PEACE YETI COLD PRESS","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","1","0","1","0","398" +"0000000000788","BCOFFEE EQUAL LOVE BUZZ","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","1","0","0","0","400" +"0000000000790","BCOFFEE EQUAL COLOMBIAN","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","1","0","0","0","402" +"0000000000792","BCOFFEE EQUAL MIND BODY SOUL","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","1","0","0","0","404" +"0000000000794","BDULSE FLAKES OG","21.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","256","0","1","0","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","406" +"0000000000796","BWHEAT GRASS POWDER ORG","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","256","0","1","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","408" +"0000000000800","BWATER JUG GALLON BLUE PLASTIC","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","14","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","412" +"0000000000804","BSALSA MIX PICANTE","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","415" +"0000000000807","BAPRICOTS CALIFORNIA ORG","10.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","417" +"0000000000809","BTEA GUNPOWDER PEARL MINT","20.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","419" +"0000000000811","BPSYLLIUM HUSK ORG","21.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","420" +"0000000000813","BCHOC MILK CHIPS","4.99","0","0","0","4.19","0","4.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","1","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","2","0","0","0","0","0","1","6","1","0","0","0","422" +"0000000000816","BCHOCOLATE CHIPS DARK OG FT","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","1","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","2","1","0","0","0","425" +"0000000000818","BCASHEW CURRY ORG","10.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","427" +"0000000000820","BCOFFEE PEACE COLOMBIAN DRK OG","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15170" +"0000000000822","BCOFFEE ALAKEF ESPRESSO ROYALE","14.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15173" +"0000000000825","BLEMONGRASS","17.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","1","0","0","0","430" +"0000000000828","BFLOUR WHITE WHOLE WHEAT","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","433" +"0000000000830","BSOUP MIX CREAM OF MUSHROOM","11.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","435" +"0000000000832","BCOUSCOUS WHOLE WHEAT ORG.","2.79","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","1","0","0","0","437" +"0000000000834","BPILAF OLDE WORLD","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","439" +"0000000000839","BBLACK BEAN MIX","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","441" +"0000000000843","BLEMON BALM OG","34.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","443" +"0000000000845","BHUMMUS","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","7","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","445" +"0000000000847","BRYE MEAL OG","1.99","0","0","0","1.69","0","1.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","2","0","0","0","0","0","1","6","1","0","0","0","447" +"0000000000849","BFLOUR RICE WHITE","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","5","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","449" +"0000000000857","BFIVE SPICE POWDER ORG","18.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","451" +"0000000000863","BGRANOLA RAISIN CASHEW","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","3","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","457" +"0000000000865","BBROCCOLI SEEDS SPROUTING ORG","24.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","459" +"0000000000868","SILVER TIN, 2OZ","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","461" +"0000000000871","BTEA RASPBERRY GREEN","41.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","463" +"0000000000875","BPEANUT ORG SPLIT DRY RSTD NS","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","1","0","0","0","465" +"0000000000877","BTOMATO DRIED OG","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","4","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","467" +"0000000000879","BANISE SEED OG","17.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","469" +"0000000000881","BSAVORY SUMMER","19.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","471" +"0000000000884","BCUMIN SEED WHOLE","20.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","473" +"0000000000886","BBULGUR OG","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","6","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","475" +"0000000000888","BSUGAR CANE OG","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","2","1","0","0","0","477" +"0000000000891","BSPROUT SPREE HEARTY MX OG","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","257","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16544" +"0000000000894","BPEPPER COARSE GROUND BLACK OG","22.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","480" +"0000000000896","BYEAST POWDER, NUTRITIONAL","13.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","19","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","482" +"0000000000899","BPASTA QUINOA PAGODAS","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","10","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","1","0","0","0","484" +"0000000000905","BTHYME ORGANIC","27.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","486" +"0000000000915","BTEA MRS KELLYS HERBAL HIGH-C","26.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","488" +"0000000000926","BTEA DARJEELING OG","47.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","490" +"0000000000944","BRAISINS 5lb BOX ORG","18.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","492" +"0000000000947","BCHILI POWDER CHIPOTLE ORGANIC","29.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","253","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","495" +"0000000000952","BTEA EARL GREY OG","34.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","497" +"0000000000954","BTEA IRISH BREAKFAST ORG","29.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","499" +"0000000000956","BTEA SENCHA GREEN ORG","42.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","501" +"0000000000958","SILVER TIN, 4OZ","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","503" +"0000000000961","BTEA GREEN MANGO DECAF","50.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","504" +"0000000000964","BTEA MRS KELLYS GREY DECAF","33.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","506" +"0000000000966","BTEA MRS KELLYS BLACK CURRANT","26.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","255","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","1","0","1","0","508" +"0000000000987","BWALNUT HALVES AND PIECES","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15251" +"0000000000998","BCLOVES WHOLE ORG FAIR TRADE","25.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","254","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","1","0","0","0","511" +"0000000001000","PRODUCE CORRECTION","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","535","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","513" +"0000000001002","MAPLE SYRUP PINTS SIMP GIFTS","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","515" +"0000000001004","DELI SANDWICH COUPON","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","517" +"0000000001007","SORGHUM SYRUP, LOCAL 1PT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15147" +"0000000001009","EGGS LOCAL MEDIUM","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","0","0","1","0","521" +"0000000001011","EGGS LOCAL EXTRA LAR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","0","0","1","0","523" +"0000000001013","HONEY CREAMD BAR BELL","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15935" +"0000000001015","BREAKFAST TO GO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","527" +"0000000001018","HONEYCOMB MARQ","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","530" +"0000000001020","MILK SPOUT","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","2","0","0","0","532" +"0000000001022","WFC 40TH PINT GLASS","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","15208" +"0000000001024","WFC BASEBALL SHIRT","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","7","0","0","0","534" +"0000000001026","POSTER","10","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","536" +"0000000001028","SLOW FOOD PICNIC ADULT","12","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","881","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","538" +"0000000001030","TAMARIND CONCENTRATE","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","540" +"0000000001032","MILK 1% DAHLS DAIRY","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","9999905","1","0","542" +"0000000001034","MILK WHOLE DAHLS DAIRY","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","9999905","1","0","544" +"0000000001038","THOUSAND HILLS GRND BEEF 85/15","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16418" +"0000000001041","GIFT CARD PURCHASE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","902","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","547" +"0000000001044","WFC BALL CAP","12.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","548" +"0000000001049","$30 TICKET","30","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","550" +"0000000001051","CELERYCOUPN","0.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","552" +"0000000001053","VEGGIE DIPPER COUPON","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","554" +"0000000001055","WFC LOCAL SS SHIRT","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","7","0","0","0","556" +"0000000001060","WFC TRAVEL MUG ","12.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","559" +"0000000001062","WFC Water Bottles","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","7","0","0","0","561" +"0000000001065","POSTAGE STAMPS - BOOK","8.8","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","563" +"0000000001090","ROOT BEER HIGH BRIDGE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","1","1","0","0","1837","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","1091","1","0","565" +"0000000001092","ROOT BEER GROWLER RETURN","-4","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","54","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","2","0","0","0","567" +"0000000001094","CDR SMMT CRM BTL RETURN","-2","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","54","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14015" +"0000000001111","WILD FERN LOCAL SOAP","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","574" +"0000000001113","$25 class","25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","708","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","576" +"0000000001115","$35 class","35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","578" +"0000000001117","$45 class","45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","580" +"0000000001119","$55 class","55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","582" +"0000000001121","$65 class","65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","584" +"0000000001123","$75 class","75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","586" +"0000000001125","$10 Class","10","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","7","0","0","0","588" +"0000000001127","LAND TRUST - STUDENT","20","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","881","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","590" +"0000000001144","TALMADGE FARMS JAM","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14281" +"0000000001225","MAPLE SYRUP GIFT BOTTLES","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","13427" +"0000000001234","OG BEER SPEC","1.98","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","800","0","1","1","0","0","10499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","595" +"0000000001999","Do not use me pleas use MA","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","604","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","599" +"0000000002113","EARTH SCIENCE BULK SHAMPOO","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","92","0","1","0","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","602" +"0000000002115","ALBA UNSCENTED EMOL LOTION","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","92","0","1","0","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","604" +"0000000002222","GIOVANNI SINGLE TOWLETTES","0.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13366" +"0000000002501","STACEYS COMFREY BALM LAV","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","1","0","606" +"0000000002503","STACEYS LIP BALM","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","1","0","608" +"0000000002505","STACEYS FANTASTIC FOUR ","9.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13166" +"0000000003000","PRODUCE TAXABLE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","501","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","611" +"0000000003003","PAPPLE BAG GRANNY SMITH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","613" +"0000000003005","PREV STIR FRY SAUCE","0.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","615" +"0000000003008","PRODUCE FLOWERS","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","501","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","617" +"0000000003010","PAPPLE BAG LOCAL CORTLAND","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","548","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","619" +"0000000003012","PPEAR ABATE FETEL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","799","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","621" +"0000000003014","PPEAR ALEX LUCAS","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","800","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","623" +"0000000003021","PBANANA SALE","0.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","718","0000-00-00 00:00:00","1","0.01","0","0","0","0","0","0","0","1","0","6","0","0","0","625" +"0000000003033","PMELON CHARENTAIS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","627" +"0000000003035","PNECTARINE WHITE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","684","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","629" +"0000000003040","PDRAGON FRUIT NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","1432","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14847" +"0000000003050","PTOMATO PKG LOCAL SPECIALTY","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","1045","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","632" +"0000000003056","PPEPPER BELL YELLOW","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","539","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","634" +"0000000003061","PTOMATO SLICER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","525","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","636" +"0000000003065","PAPPLE CAMEO","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","201","0","0","1","1","0","1214","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16168" +"0000000003088","PCURRANT RED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","734","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","639" +"0000000003096","PKOHLRABI / BUNCH","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","678","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","641" +"0000000003100","PMELON HONEYGOLD","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","643" +"0000000003107","PORANGE NAVEL","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","789","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","645" +"0000000003109","PORANGE SEVILLE MARMALADE TYPE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","792","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","647" +"0000000003111","PPAPAYA LG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","674","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","649" +"0000000003118","PPEAR STARKRIMSON","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","798","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","651" +"0000000003126","PPINEAPPLE NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","557","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","653" +"0000000003129","PPOMMELO NON-O","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","725","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13452" +"0000000003132","PPLANTS SMALL POT","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","656" +"0000000003134","PPLANTS VEG 6PK ALT","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","658" +"0000000003136","PPLANTS FLOWERS 6-PK ALT","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","660" +"0000000003138","TAMARACK","23.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","662" +"0000000003140","#1 SHRUBS","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","664" +"0000000003142","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.63","1","3","6","0","0","0","666" +"0000000003145","PTANGERINE PIXIE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","827","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16617" +"0000000003157","PGRAPEFRUIT WHITE NON-O","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","658","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13881" +"0000000003170","PFLOWER 6* POINSETTI","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","669" +"0000000003172","PFLOWER 6* XMAS CACT","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","671" +"0000000003174","P4*PAPERWHITES","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","673" +"0000000003176","PFLOWER GERB BUNCH","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","675" +"0000000003178","PFLOWER RUNUNCULUS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","677" +"0000000003180","PFL DAFFODIL BUNCH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","679" +"0000000003182","PFL CALLA STEM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","681" +"0000000003184","PFL DAHLIAS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","683" +"0000000003186","PFL 6* HIBISCUS","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","685" +"0000000003188","PFL 8* BULB GARDEN","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","687" +"0000000003190","PFL 4* HYACINTH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","689" +"0000000003192","PFL 12 ROSE BOUQUET","21.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","691" +"0000000003194","PFL CUPIDS ARROW","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","693" +"0000000003196","PFL LILY EXQUISITE","11","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","695" +"0000000003198","PFL LILY HYBRID","7","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","697" +"0000000003200","PFL CALLA BUNCH","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","699" +"0000000003202","PFL 4* GERB","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","701" +"0000000003204","PFL SNAPDRAGON","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","703" +"0000000003206","PFLOWERS ALSTROEMERI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","705" +"0000000003233","PPLANTS HANGING BASKET","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1326","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","707" +"0000000003235","SPECIALTY PLANT","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","709" +"0000000003237","TREE LARGE","28.67","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","711" +"0000000003240","#1 SHRUBS","7.16","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","714" +"0000000003242","P SHRUBS, BLUEBERRY","18.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","716" +"0000000003260","PCARROT BABY 1#","1.69","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","865","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","718" +"0000000003266","PCARROT BAG 5#-LOCAL","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","513","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","720" +"0000000003278","PPLUOT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","685","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","721" +"0000000003283","PAPPLE HONEYCRISP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","690","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","723" +"0000000003294","PAPPLE JAZZ","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","504","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","725" +"0000000003305","PCURRANT BLACK","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","734","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","727" +"0000000003310","PFLOWER so","161","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","729" +"0000000003314","PPEACH WHITE LG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","680","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","731" +"0000000003327","PFL FRESH BOUQUET","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","733" +"0000000003329","PSTEVIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","735" +"0000000003331","PFLOWER MAX DAFFODILS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4500","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","737" +"0000000003333","PFLOWER GLADIOLA","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","1362","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","739" +"0000000003335","PFLOWERS LOCAL SINGLE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","1207","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","741" +"0000000003337","PFLOWERS DAHLIAS MAX","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4503","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","743" +"0000000003339","PFLOWERS SUNFLOWER MAX","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4504","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","745" +"0000000003341","PFLOWERS DRIED B","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","747" +"0000000003343","PPLANTS POTTED LG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1322","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","749" +"0000000003345","PPLANTS BEGONIA_IMPATIENS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","751" +"0000000003347","PPLANTS FLOWERS FUSCHSIA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1324","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","753" +"0000000003350","PCELOSIA","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","755" +"0000000003352","PFL GLADIOLA","1.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","757" +"0000000003373","PFLOWER GLAD MAX","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4507","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14289" +"0000000003383","PAPPLE HONEYCRISP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","690","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","758" +"0000000003411","PAPPLE BAG LOCAL ZESTAR","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1348","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","760" +"0000000003413","PAPPLE BAG REDFREE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1351","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","762" +"0000000003422","PAPRIUM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","","0","1","1","0","","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14362" +"0000000003424","PCARROT GREENTOP RED ","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","867","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","765" +"0000000003434","PPEAR TOSCA","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","1402","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12853" +"0000000003439","PNECTARINE DONUT","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","1395","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","766" +"0000000003459","PPOTATO BAG RED LOCAL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","768" +"0000000003623","PCARROT LOCAL JUICER 2#","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","1370","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","770" +"0000000003852","PPEAR PACKHAM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","773","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","772" +"0000000003889","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","774" +"0000000003928","PPOTATO BAG LOCAL blue","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","776" +"0000000003949","PORANGE BAG VALLEY COVE NON-O","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","790","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","778" +"0000000003988","PTOMATO SLICER BAY PRODUCE","3.29","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","1358","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","1","0","780" +"0000000003992","PORANGE BAG SEVILLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","696","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","782" +"0000000003994","PSOUP MIX","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","694","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","784" +"0000000003997","PBASKET GIFT SMALL","30.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","503","0","1","1","0","0","1152","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","786" +"0000000003999","PBASKET GIFT LARGE","50.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","503","0","1","1","0","0","1150","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","788" +"0000000004001","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","790" +"0000000004003","PNECTARINE CASE SPEC","24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","781","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","791" +"0000000004005","PBEAN SPROUT BAG NO","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","655","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","6","0","1","0","793" +"0000000004007","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","3.22","1","3","6","0","0","0","795" +"0000000004009","PLIME KAFFIR","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","759","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","797" +"0000000004011","PBANANA ","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","716","0000-00-00 00:00:00","1","0.01","0","0","0","0","0","0","0","1","3","6","0","0","0","799" +"0000000004013","PORANGE BULK","0.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","791","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","801" +"0000000004015","PAPPLE RED DELICIOUS","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","607","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","803" +"0000000004017","PAPPLE GRANNY SMTH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","605","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","805" +"0000000004019","PAPPLE MCINTOSH LG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","606","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","807" +"0000000004021","PAPPLE GOLD DELICIOUS","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","603","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","809" +"0000000004023","PGRAPE RED SEEDLESS","3.49","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","577","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","811" +"0000000004025","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","813" +"0000000004027","PCRANBERRIES","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","815" +"0000000004029","PPINEAPPLE NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","557","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","817" +"0000000004031","PMELON WATERMELON RED SEEDED","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","1346","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","819" +"0000000004033","PLEMON SM","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","578","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","821" +"0000000004035","PNECTARINE SM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","573","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","823" +"0000000004037","PPEACH YELLOW SM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","517","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","825" +"0000000004039","PPLUM BLACK SM","2.99","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","809","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","827" +"0000000004041","PPLUM RED","3.99","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","811","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","829" +"0000000004043","PPEACH TREE RIPE SM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","517","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","831" +"0000000004045","PCHERRIES RANIER","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","729","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","833" +"0000000004047","PGRAPEFRUIT RED/PINK","1.69","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","571","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","835" +"0000000004049","PMELON CANTELOUPE","1.29","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","554","0000-00-00 00:00:00","1","0.01","1","5","0","0","0","0","0","1","8","6","0","0","0","837" +"0000000004051","PMANGO KENT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","764","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","839" +"0000000004053","PLEMON LG","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","1050","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","841" +"0000000004055","PMANDARIN GOLDEN NUGGET","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","828","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","843" +"0000000004057","PCHERRY EARLY SWEET PT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","686","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","845" +"0000000004059","PTOMATO CANNING","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","1033","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","847" +"0000000004061","PLETTUCE ICEBURG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","947","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","849" +"0000000004063","PTOMATO BULK SM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","525","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","851" +"0000000004065","PPEPPER BELL GREEN","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","537","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.7","1","8","6","0","0","0","853" +"0000000004067","PSQUASH ZUCCHINI","2.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","523","0","0","1","1","0","1027","0000-00-00 00:00:00","1","0.01","1","5","0","0","0","0","1.18","1","8","6","0","0","0","855" +"0000000004069","PCABBAGE GREEN","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","860","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.8","1","3","6","0","0","0","857" +"0000000004071","PCELERY BUNCH LOCAL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","551","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.23","1","3","6","0","0","0","859" +"0000000004073","PPOTATO RED","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","1","0","990","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.72","1","8","6","0","1","0","861" +"0000000004075","PLETTUCE RED LEAF","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","950","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","863" +"0000000004077","PCORN SWEET WHITE","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","689","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0.44","1","3","6","0","0","0","865" +"0000000004079","PCAULIFLOWER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","838","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.22","1","8","6","0","0","0","867" +"0000000004081","PEGGPLANT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","887","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","869" +"0000000004083","PPOTATO WHITE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","1","0","994","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","871" +"0000000004085","PMUSHROOM WHITE BULK","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","1","0","502","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","2.28","1","8","6","0","1","0","873" +"0000000004087","PTOMATO ROMA ORGANIC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","1037","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.32","1","3","6","0","0","0","875" +"0000000004089","PRADISH BUNCHED RED","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","656","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","877" +"0000000004091","PYAM SWEET POTATO","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","526","0","0","1","1","0","570","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.25","1","3","6","0","0","0","879" +"0000000004093","PONION","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","640","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.75","1","8","6","0","0","0","881" +"0000000004095","PTURNIP YELLOW","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","1041","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","883" +"0000000004097","PAPPLE GINGERGOLD","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","604","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","885" +"0000000004099","PLEMON MEYER","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","754","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","887" +"0000000004101","PAPPLE BRAEBURN SM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","600","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1","1","3","6","0","0","0","889" +"0000000004103","PAPPLE BRAEBURN LG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","600","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1","1","3","6","0","0","0","891" +"0000000004105","PAPPLE MUTSU","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","609","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","893" +"0000000004107","PAPPLE SWEET TANGO NON-O","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","547","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","895" +"0000000004109","PAPPLE AMBROSIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","501","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","897" +"0000000004111","PAPPLE MUTSU","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","609","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","899" +"0000000004114","PAPPLE CASE GALA BAG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","651","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","901" +"0000000004116","PAPPLE EARLY SM","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1103","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","903" +"0000000004118","PAPPLE EARLY LG","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1103","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","904" +"0000000004122","PAPPLE ROSE","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","704","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","906" +"0000000004124","PAPPLE EMPIRE SM","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1105","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","908" +"0000000004128","PAPPLE PINK LADY","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","608","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","910" +"0000000004130","PAPPLE PINK LADY","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","608","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","912" +"0000000004132","PAPPLE GALA SM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","602","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","914" +"0000000004134","PAPPLE GALA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","602","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","916" +"0000000004136","PAPPLE GOLD DEL SM","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","603","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","918" +"0000000004139","PAPPLE GRANNY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","605","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","920" +"0000000004142","PAPPLE IDARED LG","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1107","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","922" +"0000000004145","PAPPLE JONAGOLD","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","701","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","924" +"0000000004147","PAPPLE JONAGOLD","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","701","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","926" +"0000000004152","PAPPLE MCINTOSH SM","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","606","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","928" +"0000000004155","PAPPLE PAULARED SM","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1108","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","930" +"0000000004157","PAPPLE PAULARED LG","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1108","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","932" +"0000000004159","PONION SWEET VIDALIA ","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","641","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","934" +"0000000004161","PAPPLE BAG JONATHAN","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1212","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","936" +"0000000004163","PONION SWEET WALLA WALLA ","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","641","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","938" +"0000000004165","PONION bag yellow","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0.01","1","0","0","0","1","0","0","1","8","6","0","0","0","940" +"0000000004167","PAPPLE RED DEL SM","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","607","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","942" +"0000000004169","PAPPLE ROME SM","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1110","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","944" +"0000000004173","PAPPLE ROYAL GALA SM","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","946" +"0000000004177","PAPPLE SPARTAN SM","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1111","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","948" +"0000000004181","PAPPLE STAYMAN SM","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1112","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","950" +"0000000004184","PAPPLE LOCAL PREMIUM","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1413","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13101" +"0000000004186","PAPPLE SUNRISE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","705","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","953" +"0000000004188","PNECTARINE WHITE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","684","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","955" +"0000000004191","PAPPLE WINESAP LG","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1113","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","957" +"0000000004200","papple NZ Queen","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","609","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","959" +"0000000004208","PAPPLE DIVINE NON-ORGANIC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1058","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16597" +"0000000004211","PAPPLE SANSA","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1047","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","962" +"0000000004213","PAPPLE TSUGARU","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","1048","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","964" +"0000000004217","PPEAR ASIAN BROWN non-o","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","676","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","8","6","0","0","0","966" +"0000000004219","PAVOCADO BERNECKER","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","557","0","0","1","0","0","1053","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","968" +"0000000004221","PAVOCADO HASS LG 48 CT","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","557","0","0","1","0","0","712","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","970" +"0000000004225","PAVOCADO HASS","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","557","0","0","1","0","0","579","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","8","6","0","0","0","972" +"0000000004228","PAVOCADO FUERTE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","557","0","0","1","0","0","675","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","974" +"0000000004230","PBERRY RASPBERRY LOCAL NON-O","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1049","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","976" +"0000000004232","PBANANA LEAVES","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","1116","0000-00-00 00:00:00","1","0.01","1","0","0","0","1","0","0","1","0","6","0","0","0","978" +"0000000004234","PBANANA NINO","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","1118","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","980" +"0000000004236","PBANANA RED","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","717","0000-00-00 00:00:00","1","0.01","0","0","0","0","0","0","0","1","0","6","0","0","0","982" +"0000000004239","PBERRY BLACKBERRY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","984" +"0000000004241","PBERRY BOYSENBERRY","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1119","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","986" +"0000000004243","PBERRY GOOSEBERRY","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","722","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","988" +"0000000004245","PBERRY RASPBERRY LOCAL GOLDEN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","719","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","990" +"0000000004247","PBERRY STRAWBERRY LOCAL ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","820","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","992" +"0000000004252","PCHERRIES EXTREME CASE","25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","1394","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","994" +"0000000004254","Papple cameo","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","201","0","0","1","1","0","1214","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","996" +"0000000004256","PSTAR FRUIT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","819","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","998" +"0000000004258","PCHERRY RAINIER","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","729","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1000" +"0000000004260","PCOCONUT","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","732","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1002" +"0000000004262","PCHERRY EARLY SWEET PT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","686","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1004" +"0000000004264","PFIG BROWN TURKEY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","550","0","0","1","0","0","805","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1006" +"0000000004266","PFIG BLACK MISSION","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","550","0","0","1","0","0","552","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1008" +"0000000004268","PFIG BLACK MISSION","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","550","0","0","1","0","0","552","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1010" +"0000000004271","PGRAPE CHAMPAGNE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","0","0","737","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1012" +"0000000004274","PGRAPE GLOBE GREEN","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","1013","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","1014" +"0000000004279","PGRAPEFRUIT PUMMELO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1016" +"0000000004282","PGRAPEFRUIT RED","1.69","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","571","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1018" +"0000000004285","PGRAPEFRUIT RED","1.69","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","571","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1020" +"0000000004288","PGRAPEFRUIT RED","1.69","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","571","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","1022" +"0000000004290","PGRAPEFRUIT WHITE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","658","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1024" +"0000000004293","PGRAPEFRUIT WHITE NON- O","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","658","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1026" +"0000000004298","PGRAPEFRUIT RIO STAR","1.69","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","571","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1028" +"0000000004300","PEDIBLE FLOWERS","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","1177","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1030" +"0000000004302","PKIWANO","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","1217","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1032" +"0000000004304","PLEMON MEYER","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","","0","1","1","0","754","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14211" +"0000000004306","PLIME SWEET","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","576","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1035" +"0000000004308","PLOQUAT","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","1127","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1037" +"0000000004310","PMAMEY","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","1","0","1219","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","1","0","1039" +"0000000004312","PMANGO ATAULFO","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","765","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1041" +"0000000004315","PMELON GALIA","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","772","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1043" +"0000000004317","PMELON CANARY/HAY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1045" +"0000000004319","PMELON CANTALOUPE LG","1.29","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","554","0000-00-00 00:00:00","1","0.01","1","5","0","0","0","0","0","1","8","6","0","0","0","1047" +"0000000004321","PMELON Magritte","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1049" +"0000000004323","PBERRY STRAWBERRY PT","2.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","5","0","0","1","0","0","1","8","6","0","0","0","1051" +"0000000004325","PMELON FRENCH BREAKF","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1053" +"0000000004327","PMELON ORANGE HONEYDEW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1055" +"0000000004329","PMELON HONEYDEW SM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","586","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1057" +"0000000004331","PMELON WATERMELON NON-O","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","0","0","713","0000-00-00 00:00:00","1","0.01","1","0","0","0","1","0","0","1","3","6","0","0","0","1059" +"0000000004333","PMELON PEPINO","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1061" +"0000000004335","PMELON PRINCE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1063" +"0000000004337","PMELON KOREAN","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1065" +"0000000004339","PMELON sherbet orange","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1067" +"0000000004341","PMELON WATERMELON LOCAL NON-O","0.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","1349","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1069" +"0000000004343","PMELON LOCAL","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","585","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","1071" +"0000000004345","PMELON WATERMELON LOCAL RED","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","832","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","1073" +"0000000004347","PMELON WATERMELON YELLOW","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","823","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1075" +"0000000004354","PMELON JAPANESE","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","1331","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1077" +"0000000004377","PNECTARINE TREE RIPE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","573","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","1079" +"0000000004379","PNECTARINE WHITE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","684","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1081" +"0000000004381","PORANGE BLOOD","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","786","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1083" +"0000000004383","PMINNEOLA ORG","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","821","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1085" +"0000000004385","PORANGE NAVEL","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","789","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1087" +"0000000004387","PORANGE TEMPLE/HAMLIN","0.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","788","0000-00-00 00:00:00","1","0.01","1","0","0","0","1","0","0","1","0","6","0","0","0","1089" +"0000000004389","pminneola bagged","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1312","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14037" +"0000000004391","PORANGE MANGO","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","748","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1092" +"0000000004394","PPAPAYA LG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","674","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1094" +"0000000004396","PPEACH COLORADO CASE","73.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","777","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1096" +"0000000004399","PMANDARIN ROYAL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","784","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1098" +"0000000004401","PPEACH WHITE LG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","680","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1100" +"0000000004405","PGARLIC SCAPES","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","892","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1102" +"0000000004407","PPEAR ASIAN BROWN","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","676","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","8","6","0","0","0","1104" +"0000000004409","PPEAR BARTLETT SM","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","620","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1106" +"0000000004412","PPEAR BOSC LARGE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","622","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1108" +"0000000004414","PPEAR COMICE","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","775","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1110" +"0000000004416","PPEAR DANJOU","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","623","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1112" +"0000000004418","PPEAR FORELLE","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","774","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1114" +"0000000004420","PPEAR SECKEL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","797","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1116" +"0000000004422","PPEAR SECKEL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","797","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1118" +"0000000004425","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1120" +"0000000004427","PPERSIMMON","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","804","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1122" +"0000000004429","PPLUM LOCAL","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","813","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1124" +"0000000004431","PPINEAPPLE NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","557","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1126" +"0000000004433","PPINEAPPLE NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","557","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1128" +"0000000004435","PPLUM GREEN LG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","810","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1130" +"0000000004437","PPLUM PURPLE SM","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","812","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1132" +"0000000004439","PPLUM RED","3.99","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","811","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1134" +"0000000004441","PPLUM BLACK","2.99","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","809","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1136" +"0000000004443","PNECTA-PLUM","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","1131","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1138" +"0000000004445","PPOMEGRANATE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","652","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1140" +"0000000004447","PQUINCE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","816","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1142" +"0000000004449","PTANGERINE SUNBURST","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","830","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1144" +"0000000004451","PSWEET ORANGE BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1132","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1146" +"0000000004453","PTANGERINE HONEY MURCOT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","827","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1148" +"0000000004455","PMANDARIN SATSUMA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","818","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1150" +"0000000004457","PCLEMENTINE NON-O","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","731","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1152" +"0000000004459","PUGLI FRUIT","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","1291","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1154" +"0000000004471","PRHUBARB","1.99","4","0.2","2","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","553","0","0","1","1","0","1005","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","1","0","1156" +"0000000004491","PPEPPER BELL YELLOW NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","1086","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","1158" +"0000000004493","PPEPPER BELL RED NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","952","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","1160" +"0000000004495","PPEPPER ORANGE BELL NON-O","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","985","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1162" +"0000000004497","PGRAPE GREEN SEEDLESS","3.49","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","673","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1164" +"0000000004499","PGRAPE CRIMSON SEEDLESS","3.49","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","577","0000-00-00 00:00:00","1","0.01","1","1","0","0","0","0","0","1","3","6","0","0","0","1166" +"0000000004511","PSPROUT MOMS LENTIL","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1060","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1168" +"0000000004513","PSPROUT MOMS SPICY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1058","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1170" +"0000000004515","PANISE","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","913","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1172" +"0000000004517","PARTICHOKE PURPLE SM","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","636","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1174" +"0000000004519","PARTICHOKE BABY","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","836","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1176" +"0000000004521","PASPARAGUS LG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","637","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","1","6","0","0","0","1178" +"0000000004523","PASPARAGUS WHITE LG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","839","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1180" +"0000000004525","PASPARAGUS NON-O 1LB","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","1386","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1182" +"0000000004527","PBEAN LIMA","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","843","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1184" +"0000000004529","PBEAN HARICOT VERT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","842","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1186" +"0000000004531","PBEAN PURPLE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","563","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1188" +"0000000004533","PBEAN WAX/YELLOW","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","1","1","1","0","848","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","1190" +"0000000004536","PBEAN SPROUTS","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","655","0000-00-00 00:00:00","1","0","0","0","0","0","1","0","0","1","0","6","0","1","0","1193" +"0000000004538","PBEET BABY RED","2.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","851","0000-00-00 00:00:00","1","0.01","1","5","0","0","0","0","1","1","8","6","0","0","0","1195" +"0000000004540","PBEET LOOSE","2.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","851","0000-00-00 00:00:00","1","0.01","1","5","0","0","0","0","1","1","8","6","0","0","0","1197" +"0000000004542","PBEET GREENS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","849","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1199" +"0000000004544","PBOK CHOY BABY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","1","0","854","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1201" +"0000000004546","PBONIATO","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1295","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1203" +"0000000004548","PBROCCOLI FLORETTES","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","0","0","1161","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1205" +"0000000004550","Pgreen","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","0","0","693","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1207" +"0000000004553","pPEAR TAYLOR GOLD NON-O","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","774","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14650" +"0000000004555","PCABBAGE SAVOY","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","863","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1210" +"0000000004560","PCARROT BABY 1#","1.69","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","865","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","1212" +"0000000004562","PCARROT LOOSE /LB","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","1","0","864","0000-00-00 00:00:00","1","0.01","1","0","0","1","0","0","0","1","0","6","0","0","0","1214" +"0000000004564","PCARROT LOOSE COLORED","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","725","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1216" +"0000000004566","PCARROT GREENTOP YELLOW","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","868","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1218" +"0000000004568","PCAULIFLOWER PURPLE/ORANGE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","1011","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1220" +"0000000004570","PROMANESCO CAULIFLOWER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","1012","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1222" +"0000000004576","PCELERY STICKS","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","1","0","1166","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1224" +"0000000004585","PCELERIAC-CELERYROOT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","871","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1226" +"0000000004587","PCHARD RED","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","572","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","1228" +"0000000004589","PCORN BABY","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","1","0","1167","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1230" +"0000000004591","PCORN SWEET BAGGED","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1168","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1232" +"0000000004593","PCUCUMBER EUROPEAN","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","638","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1234" +"0000000004595","PCUCUMBER LEMON","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","1","0","880","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1236" +"0000000004597","PDAIKON GREENTOP","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","1175","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1238" +"0000000004599","PPEAR WARREN","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","1","0","782","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1240" +"0000000004601","PEGGPLANT JAPANESE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","888","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1242" +"0000000004603","PGARLIC BRAID","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1244" +"0000000004605","PESCAROLE","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","889","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1246" +"0000000004607","PAVOCADO HASS","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","557","0","0","1","0","0","579","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","8","6","0","0","0","1248" +"0000000004609","PGARLIC GREEN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","897","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1250" +"0000000004611","PGARLIC PEELED","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","898","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.12","1","0","6","0","0","0","1252" +"0000000004613","PTURMERIC ROOT","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","1","0","1040","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1254" +"0000000004615","PDANDELION GREEN","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","654","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1256" +"0000000004617","PGREENS ASIAN","0.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1183","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1258" +"0000000004619","PGREENS TURNIP","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","512","0","0","1","1","0","1184","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1260" +"0000000004621","PSALAD SPRING MIX FAMILY SZ","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1020","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1262" +"0000000004623","PGREENS MIXED JUNIOR","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","512","0","0","1","1","0","1301","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1264" +"0000000004625","PHORSERADISH ROOT non-o","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","940","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1266" +"0000000004627","PKALE","2.29","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","943","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.3","1","3","6","0","0","0","1268" +"0000000004629","PLEEK","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","644","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0.9","1","0","6","0","0","0","1270" +"0000000004631","PLETTUCE BIBB","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","948","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1272" +"0000000004634","PLETTUCE ICEBERG NON-O","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","1387","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1274" +"0000000004636","PGRAPE GLOBE RED","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","739","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1276" +"0000000004640","PLETTUCE ROMAINE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","954","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","1278" +"0000000004643","PMIZUNA","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","966","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1280" +"0000000004647","PMUSHROOM MOREL BULK","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","964","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1282" +"0000000004649","PMUSHROOM OYSTER BULK","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","905","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1284" +"0000000004651","PMUSHROOM SHIITAKE BULK","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","1","0","962","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","8","6","0","0","0","1286" +"0000000004653","PMUSHROOM ENOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","514","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1288" +"0000000004655","POKRA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","967","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1290" +"0000000004657","PONION CIPPOLINI RED BAGGED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","969","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1292" +"0000000004659","PONION SWEET GREENTOP","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","973","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1294" +"0000000004661","PSHALLIONS","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1306","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1296" +"0000000004663","PONION WHITE","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","974","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1298" +"0000000004665","PONION YELLOW","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","640","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.6","1","8","6","0","0","0","1300" +"0000000004668","PONION BAG RED","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","633","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1302" +"0000000004670","PBURDOCK ROOT","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","859","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","1","0","1304" +"0000000004672","PPARSNIPS","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","642","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1306" +"0000000004674","PPEAS TENDRILS","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","980","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1308" +"0000000004676","PPARSNIPS","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","642","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1310" +"0000000004678","PPEPPER BANANA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1312" +"0000000004680","PPEPPER BELL YELLOW","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","539","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1314" +"0000000004682","PPEPPER BELL ORANGE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","539","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1316" +"0000000004684","PPEPPER BELL WHITE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","982","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1318" +"0000000004686","PPEPPER CHILI GREEN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1320" +"0000000004688","PPEPPER RED","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","538","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3","1","8","6","0","0","0","1322" +"0000000004690","PPEPPER HOT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1324" +"0000000004692","PPEPPER HUNGARIAN WX","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1326" +"0000000004694","PPEPPER MINI NON-O BAY PRODUCE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","0","0","697","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1328" +"0000000004696","PPEPPER LONG GREEN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1330" +"0000000004698","PPEPPER MORITA CHILI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1332" +"0000000004700","PPEPPER NEW MEXICO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1334" +"0000000004702","PPEPPER PASILLA RED","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1336" +"0000000004704","PPEPPER PINOLE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1338" +"0000000004706","PPEPPER RED CHEESE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1340" +"0000000004708","PPEPPER RED PIMIENTO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1342" +"0000000004710","PFLOWER ORN PEPPER","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1344" +"0000000004717","PAPPLE CRAB APPLE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","1","0","501","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1346" +"0000000004722","PPOTATO SPECIALTY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","1","0","646","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","2","1","8","6","0","0","0","1348" +"0000000004725","PPOTATO RUSSET","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","1","0","993","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.72","1","3","6","0","0","0","1350" +"0000000004728","PPOTATOES YELLOW LOCAL ORG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","516","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16156" +"0000000004730","PPOTATO SPECIALTY PURPLE/BLUE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","1","0","646","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","2","1","8","6","0","0","0","1353" +"0000000004732","PGOURD LARGE DECOR","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","583","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1355" +"0000000004734","PPUMPKIN MINI","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","997","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1357" +"0000000004736","PPUMPKIN CARVING","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","1412","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13067" +"0000000004738","PRADICCHIO","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","999","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1360" +"0000000004740","PRADISH BUNCHED WH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","656","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","1","0","1362" +"0000000004743","PRADISH WINTER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","1001","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","1","0","1364" +"0000000004745","PRHUBARB","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16368" +"0000000004747","PRUTABAGAS","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","1006","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","3","6","0","0","0","1367" +"0000000004750","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1369" +"0000000004752","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1371" +"0000000004754","PSQUASH BABY SCALLOP","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","523","0","0","1","1","0","645","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.49","1","0","6","0","0","0","1373" +"0000000004757","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1375" +"0000000004759","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1377" +"0000000004761","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1379" +"0000000004764","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1381" +"0000000004766","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1383" +"0000000004768","PWSQUASH HUBBARD","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","1025","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1385" +"0000000004770","PLETTUCE BAG LOCAL TENDER","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","1042","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1387" +"0000000004772","PPEPPER CHILI YELLOW","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","1","0","536","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","3.5","1","0","6","0","0","0","1389" +"0000000004774","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1391" +"0000000004776","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1393" +"0000000004778","PTOMATO YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","1038","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1395" +"0000000004780","PWSQUASH BUTTERNUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","506","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0.63","1","3","6","0","0","0","1397" +"0000000004782","PSQUASH YELLOW STRAI","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","523","0","0","1","1","0","645","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.49","1","0","6","0","0","0","1399" +"0000000004784","PSQUASH YELLOW CROOK","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","523","0","0","1","1","0","645","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.49","1","0","6","0","0","0","1400" +"0000000004786","PSQUASH SUMMER","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","523","0","0","1","1","0","645","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.49","1","0","6","0","0","0","1402" +"0000000004789","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1404" +"0000000004791","PSUNCHOKES","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","1028","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","1","0","1406" +"0000000004793","PTAMARILLO RED","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","1308","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1408" +"0000000004795","PTARO ROOT LG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","1083","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1410" +"0000000004797","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","1412" +"0000000004799","PTOMATO SLICER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","525","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","1414" +"0000000004801","PTOMATILLOS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","1029","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1416" +"0000000004803","PWHEATGRASS CUPS OG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1024","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","1418" +"0000000004807","PTOMATO CHERRY LOCAL","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","582","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1420" +"0000000004809","PTURNIP BABY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","507","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1422" +"0000000004811","PTURNIP PURPLE TOP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","507","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1424" +"0000000004813","PMOREL MUSHROOMS","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","964","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1426" +"0000000004815","PWATERCRESS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","679","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","1428" +"0000000004817","PYAM RED LG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","526","0","0","1","1","0","570","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","1.25","1","3","6","0","0","0","1430" +"0000000004819","PYUCCA ROOT","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","1","0","1082","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1432" +"0000000004821","PCUCUMBER ASIAN NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1169","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1434" +"0000000004823","PSALAD SPICY MIX LOCAL","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1380","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","1","0","1436" +"0000000004825","PSALAD CRESS LOCAL","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1380","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","1","0","1438" +"0000000004827","PSALAD MIX BAG LOCAL","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1380","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","1","0","16554" +"0000000004848","PTURNIP SCARLETT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","1","0","507","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1440" +"0000000004877","PSPINACH SAVOY BAGGED","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1295","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16158" +"0000000004884","PARUGULA","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","837","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1442" +"0000000004886","PHERB BASIL ","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","904","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1444" +"0000000004888","PHERB Spearmint","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","922","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1446" +"0000000004890","PPEACH MICHIGAN NON-O","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","1","0","657","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15152" +"0000000004892","PHERB BABY DILL LOCAL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","911","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1449" +"0000000004894","PHERB LEMONGRASS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","918","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1451" +"0000000004897","porange sky valley bag","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1425","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13689" +"0000000004899","PHERB PARSLEY ORGANIC","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","546","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.85","1","8","6","0","0","0","1453" +"0000000004901","PPOTATO BAG RED 3#","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","1391","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1455" +"0000000004904","PBERRY BLUEBERRIES BAYFIELD","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14746" +"0000000004910","PFENNEL","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","913","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1458" +"0000000004913","PHERB THYME","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","938","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","3","6","0","0","0","1460" +"0000000004915","PHERB TARRAGON LOCAL","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","906","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1462" +"0000000004917","PHERB LOCAL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","1302","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1464" +"0000000004921","PAPPLE EXTREME LOCAL","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1356","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1466" +"0000000004923","PBERRY HUCKLBERRY NON-O","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1355","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1467" +"0000000004925","PPINEAPPLE SPEARS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1335","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1469" +"0000000004931","PBASIL BOUQUETS","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12945" +"0000000004933","PCUCUMBER GREEN NON-O","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","877","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1472" +"0000000004935","PAPPLE VOLUNTEER SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1474" +"0000000004938","PLEMON NON-O","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","1050","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1476" +"0000000004940","PSPROUTS ITALIAN","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1057","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1478" +"0000000004942","PSPROUTS MOMS B8","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1090","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1480" +"0000000004944","PCARDOON","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","1059","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1481" +"0000000004948","PCACTUS PADDLE NOPALES","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","1","0","723","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1483" +"0000000004950","PCUCUMBER SNACK SIZE","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","1","0","1170","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1485" +"0000000004955","PCHERRIES RAINIER NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","869","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14527" +"0000000004957","PGRAPES BLACK","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1487" +"0000000004959","PMANGO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","764","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1489" +"0000000004962","PGALANGAL ROOT","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","1","0","1081","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13281" +"0000000004965","PTOMATO BAY SALAD SPECIAL","2.99","0","0","0","2.69","0","2.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","1","0","1359","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","1","0","1492" +"0000000004967","pcarrot bunch colored mini","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","869","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1493" +"0000000004970","PGRAPEFRUIT SHAMBAR","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","560","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14839" +"0000000004976","PCAULIFLOWER NON-ORGANIC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","1418","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13519" +"0000000004979","pstrawberry quart","3.99","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","0","1","8","6","0","0","0","1496" +"0000000004983","PBALL HEDGE","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","549","0","1","1","0","0","747","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15073" +"0000000004986","PEXTREME RASPBERRY CASES","16","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","522","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14642" +"0000000004988","PPOMEGRANATE LG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","652","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1499" +"0000000004990","PLETTUCE LOCAL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","1327","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","1501" +"0000000004992","PCIDER BAC CHERRY QT","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","766","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","1503" +"0000000004994","PBAG STUBS","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","501","0","1","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1505" +"0000000004996","PFLOWER FALL DECOR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","561","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15036" +"0000000004998","PPEAR RED BARTLETT BAGGED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","770","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15207" +"0000000005000","BULK FOOD B S.O.","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","22","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","1509" +"0000000005004","BULKNFOOD S.O.","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","25","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","1511" +"0000000005006","BAGS COFFEE","0.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","251","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","1513" +"0000000005015","HBA/BULK SO","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","125","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1515" +"0000000005020","HBA/BODYCARE SO","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","123","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1517" +"0000000005026","PPRODUCE S.O. TAX","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","206","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1519" +"0000000005039","PMUSHROOM MAITAKE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","1089","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","1521" +"0000000005055","DELI SPECIAL ORDER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","73","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1523" +"0000000005065","DELI CHEESE S.O.","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","233","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1525" +"0000000005071","COOL NO DISC SO","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","56","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","2","0","0","0","1527" +"0000000005098","PFLOWERS ROSE SINGLE STEM","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","1381","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","2","6","0","0","0","1529" +"0000000005100","Tomato Standard Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16048" +"0000000005102","Tomato Cherry Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16050" +"0000000005104","Pepper Green Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16052" +"0000000005106","Broccoli Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16054" +"0000000005108","Cabbage Green Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16056" +"0000000005110","Cauliflower Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16058" +"0000000005112","Eggplant Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16060" +"0000000005114","Greens Kale Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16062" +"0000000005116","Corn Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16064" +"0000000005118","Greens Spinach Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1321","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16066" +"0000000005120","Tomato Yellow Large","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1322","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16068" +"0000000005122","Tomato Paste Large","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1322","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16070" +"0000000005124","Pepper Hot Large","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1322","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16072" +"0000000005126","Cucumber Slicing Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16074" +"0000000005128","Squash Winter Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16076" +"0000000005130","Melon Water Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16078" +"0000000005132","Herb Misc Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16080" +"0000000005134","Herb Bergamot Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16082" +"0000000005136","Herb Calendula Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16084" +"0000000005138","Herb Chammomile Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16086" +"0000000005140","Herb Cilantro Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16088" +"0000000005142","Herb Echinacea Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16090" +"0000000005144","Herb Feverfew Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16092" +"0000000005146","Herb Lemon Balm Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16094" +"0000000005148","Herb Lovage Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16096" +"0000000005150","Herb Mint Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16098" +"0000000005152","Herb Oregano Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16100" +"0000000005154","Herb Rosemary Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16102" +"0000000005156","Herb Savory Small","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1323","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16104" +"0000000005160","Flower Ageratum Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16112" +"0000000005162","Flower Coleus Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16114" +"0000000005164","Flower Dianthus Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16116" +"0000000005166","Flower Impatiens Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16118" +"0000000005168","Flower Marigold Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16120" +"0000000005170","Flower Nicotiana Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16122" +"0000000005172","Flower Petunia Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16124" +"0000000005174","Flower Viola Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16126" +"0000000005176","Flower Geranium Large","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1324","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","1","0","16128" +"0000000005178","Flower Fuschias Large","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1324","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","1","0","16130" +"0000000005180","Flower Snapdragons Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16125" +"0000000005182","PCLEMATIS YELLOW LARGE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1324","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","1","0","16445" +"0000000005294","Generic Flower Hanging","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1326","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16111" +"0000000005296","Generic Flower Six","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","506","0","1","0","0","0","1325","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16109" +"0000000005298","Generic Vegg Large","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1322","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","6","0","0","0","16107" +"0000000005500","SUNBEAM BW PILLAR 3X6","18.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","1533" +"0000000005502","SUNBEAM BW TAPERS","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","1535" +"0000000005508","SUNBEAM LOVE PILLAR 3x4","14.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","9","0","0","0","1537" +"0000000005510","SMALL BW RED HEART","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","9","0","0","0","1539" +"0000000005512","SUNBEAM LG. HEART","13.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","9","0","0","0","1540" +"0000000005514","SUNBEAM LOVE PILLAR 3X6","18.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","1542" +"0000000005517","SUNBEAM BW PINECONE LG","14.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","9","0","0","0","1545" +"0000000005520","RED VOTIVE CANDLE","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14818" +"0000000005522","BW BUDDA CANDLE","10.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15244" +"0000000005524","ORGANIC COMPOST ACTIVATOR","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","1551" +"0000000005526","LARGE BW HEART","13.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13610" +"0000000005530","THREE BLIND MICE","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15155" +"0000000005532","BEESWAX 1 oz. ","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15267" +"0000000005534","BEESWAX 3 oz.","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15269" +"0000000005678","APOLONIA B SKIN CREAM","45.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1553" +"0000000005776","EO BULK LAVENDER SH GEL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","92","0","1","0","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14392" +"0000000006000","COOKIE","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","1554" +"0000000006002","COOKIES,SMALL 6-PAK","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","1556" +"0000000006005","12 OZ COFFEE","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15042" +"0000000006007","COFFEE REFILL","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15044" +"0000000006025","Wyndmere Patchouli 2ml Trial","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14319" +"0000000006119","GF Banana Cream Pie","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1559" +"0000000006232","BR BRON PEP LIQ SOAP BULK","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","92","0","1","0","1","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","5","0","0","0","1563" +"0000000006234","ALMOND OIL PURE SWEE","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","92","0","1","0","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","5","0","0","0","1564" +"0000000006392","DISH BRUSHL, REPLACEMENT HEAD","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","1567" +"0000000006678","rds test item","0.02","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","1571" +"0000000007000","Deli Hot/Cold Bar","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15467" +"0000000007012","6 pack of Cookies","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","1575" +"0000000007235","CILANTRO","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1577" +"0000000007240","BEANS BLUE LAKE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1579" +"0000000007245","PEAS SUGAR POD 2","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1581" +"0000000007251","ECHINACEA PRPL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1583" +"0000000007257","PCHAMOMILE GERMAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1585" +"0000000007259","TOBACCO SCHERAZI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1587" +"0000000007262","CUCUMBERS MIDEST","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1589" +"0000000007271","LETTUCE LONG ST","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1591" +"0000000007277","ZUCCHINI COCOZEL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1593" +"0000000007283","CALENDULA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1595" +"0000000007428","BULK HERBAL CONDITIONER","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","92","","1","0","1","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","1597" +"0000000007574","$20 STORED VALUE BUS PASS","20","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","0","0","13362" +"0000000007926","WILD FERN SOAP TRAY","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15793" +"0000000007999","GALLON PUMP TOP","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1599" +"0000000008086","CLARO TRANQUILITY","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15483" +"0000000008088","CLARO BODY CALM","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15479" +"0000000008090","CLARO BREATHE FREE","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15481" +"0000000008410","PSEEDS, PUMP SM SUGA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1602" +"0000000008417","SQUASH DELICATA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1604" +"0000000008424","CABBAGE CHINESE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1606" +"0000000008432","TOMATO ROMA PST","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1608" +"0000000008642","MAC UN-CHEESE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1610" +"0000000008765","CUTTING BOARD 11X7 PROMO","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","-1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","0","0","0","15135" +"0000000008887","SAVANAH BISQUE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1613" +"0000000009014","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1614" +"0000000009086","SQUASH BUTTERNUT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1616" +"0000000009088","SUNFLOWER MEXICN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1618" +"0000000009387","COFFEE 3# ORGANIC","33.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","1621" +"0000000009401","PFLOWER TULIP MAX","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4501","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14423" +"0000000009403","PFLOWER DAHLIAS MAX","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4503","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14425" +"0000000009405","PFLOWER LILY SINGLE STEM","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4505","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14427" +"0000000009407","PFLOWER GLAD MAX","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","4507","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14429" +"0000000009410","PGARLIC FRESH BUNDLE MAX","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","4509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14812" +"0000000009415","PGARLIC SEED MAX","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","4510","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15074" +"0000000009876","test tax","1","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","76","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1623" +"0000000009898","COREOPSIS MAROON","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1625" +"0000000009900","SUNFLOWER EVENG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1627" +"0000000009902","CARROT SCARLET","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1629" +"0000000009904","PSEEDS CHERRY RADISH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1631" +"0000000009907","SUNFLOWER DSCVRY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1633" +"0000000009909","CARROT ROYAL CHN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1635" +"0000000009912","SQUASH BUTTERCUP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1637" +"0000000009916","KALE TRUE SIBERN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1639" +"0000000009931","SPRITZER SINGLE CAN","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","4","0","0","0","1641" +"0000000009998","TESTING2","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","208","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1643" +"0000000010709","JALAPENO CHILE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1645" +"0000000010711","DAISY GLORIOSA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1647" +"0000000010713","CATNIP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1649" +"0000000010715","LAMBS EARS SEED","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1651" +"0000000010717","DILL MAMMOTH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1653" +"0000000010719","ECHIUM SEEDS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1655" +"0000000010721","CONEFLOWER PRAIR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1657" +"0000000010723","FOXGLOVE SEEDS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1659" +"0000000010725","MINT DOTTED SEED","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1661" +"0000000010727","CABBAGE EARLIANA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1663" +"0000000011333","ALMOND BUTTER","9.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","1","0","0","0","1665" +"0000000011389","NARDELLO PEPPER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1667" +"0000000011391","SPINACH VIROFLAY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1669" +"0000000011393","WATERMELON MOON","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1671" +"0000000011395","TATSOI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1673" +"0000000011397","BEAN SCAR EMPER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1675" +"0000000011400","CUCUMBER BUSH CH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1677" +"0000000011402","LETTUCE BUTTER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1679" +"0000000011404","MUSKMELON","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1681" +"0000000011406","PSEED PARSLEY FOREST","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1683" +"0000000011408","PSEED PARSLEY ITALIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1685" +"0000000011410","RUE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1687" +"0000000011412","PSEED SUNFLOWER MAX ORGANICS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","16566" +"0000000011417","CAMPANULA PEACH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1690" +"0000000011419","ROCKROSE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1692" +"0000000011421","BALLOON FLOWER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1694" +"0000000011423","COREOPSIS MIX","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1696" +"0000000011425","NIGELLA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1698" +"0000000011427","YARROW","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1700" +"0000000011429","BELLS OF IRELAND","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1702" +"0000000011431","MORNING GLORY SS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1704" +"0000000011433","POPPY SCARLET","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1706" +"0000000011435","POPPY BLUE BREAD","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1708" +"0000000011437","MARIGOLD FRENCH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1710" +"0000000011440","LAVATER0A SILVER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1712" +"0000000011445","CORN,SW PLATINUM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1714" +"0000000011447","PSEEDS, PURSLANE LG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1716" +"0000000011610","PSEED,TURNIP PUR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1718" +"0000000024304","Spread Cheese Feta","6.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1720" +"0000000030021","PFLOWER PARROT TULIP","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","1723" +"0000000046114","PGARLIC BAG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1179","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","1725" +"0000000089534","CREAM OF POTATO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","1727" +"0000000089992","RESERVED","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","800","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0.58","1","0","0","0","0","0","1729" +"0000000094014","PORANGE BAG SWEET","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1132","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1731" +"0000000112211","test item","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","13096" +"0000000999369","porange purple","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","1220","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1734" +"0000000999991","EQUITY PAYMENT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","991","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1736" +"0000009999901","VENDOR COUPON","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","604","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1740" +"0000009999903","DAHLS MILK JUG RETURN","-2.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","54","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","1","0","0","1","0","2","0","0","0","1742" +"0000009999905","DAHLS MILK JUG DEPOSIT","2.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","54","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","2","0","0","0","1744" +"0000009999907","SUPPLIES PAID OUT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1746" +"0000009999909","SAMS CLUB PAID OUT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","604","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1748" +"0000009999911","MISC PAID OUT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","604","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1750" +"0000009999919","HEALTH INSURANCE PAY","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","703","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1752" +"0000009999924","NSF CHECK REIMBURSEM","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","703","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1754" +"0000009999927","EVENT FEES","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","703","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","1756" +"0000033800418","CAT LITTER SCOOP PREC CAT 18#","6.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13606" +"0000036000006","ECODENT TOOTHPOWDER 2 OZ","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.19","1","1","5","0","0","0","1758" +"0000051890009","SHAMPOO,UNSCENTED","7.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.98","1","0","5","0","0","0","1761" +"0000138390001","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1766" +"0000167831380","PFLOWER BOUQUET","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","1361","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1768" +"0000222922201","PBLUEBERRIES NON-O PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1770" +"0000245800092","pppeppers","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","208","","0","1","0","0","698","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","13967" +"0000253690055","PPEAR BAG RED BARTLETT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","770","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1773" +"0000254840006","PWONTON WRAPS","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1143","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1775" +"0000333319001","PKUMQUAT PKG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","569","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15456" +"0000333830988","PAPPLE BAG GRANNY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1779" +"0000338311006","PORANGE BAG VALLEY COVE NON-O","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","790","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1781" +"0000385001151","PKIWIFRUIT BAG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","549","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1782" +"0000521643722","RICE TAPIOCA SHEET","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1784" +"0000719400023","COCKTAIL SOURDOUGH","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","6","0","0","0","0","14231" +"0000747005874","WORLD PULSE MAG","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16643" +"0000827400005","GINGER BREW, RASPBERRY SINGLE","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1787" +"0000827400007","GINGER BREW, EXTRA SINGLE","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1789" +"0000827412121","Cherry Ginger Brew","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16160" +"0000827423415","CHEWY GINGER CANDY ROLLS","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.88","1","0","4","0","0","0","1795" +"0000827455555","GINGER BREW,RASPBERRY","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.59","1","0","4","0","0","0","1799" +"0000890915076","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","1801" +"0000894701110","PMUSHROOM DRY OYSTER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","671","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1803" +"0000894702110","PMUSHROOM DRY SHITTAKE","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","959","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1805" +"0000894703280","PMUSHROOM CRIMINI PKG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","957","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1807" +"0000894704110","PMUSHROOM MOREL NON-O","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","566","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15270" +"0000894706035","PMUSHROOM ENOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","514","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1809" +"0000894706125","PMUSHROOM DRY PORCINI","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","958","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1811" +"0000894708035","PMUSHROOM BLACK TRUMPET","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","627","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16307" +"0000894710080","PMUSHROOM WHITE PINT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","510","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","1813" +"0000894712260","PMUSHROOM PORTABELLA PKG","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","649","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","1815" +"0000894790110","PMUSHROOM DRY STIR FRY","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","661","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1817" +"0000902000001","MHEMP LEMON LIME VEGAN BALM","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1819" +"0000903000003","MHEMP ORG LEMLIM LIP BALM","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1821" +"0000903000006","MERRY HEMPSTERS VANILLA LIP","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1823" +"0000903000008","MHEMP PEPPMNT VEGAN LIP BALM","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","1825" +"0000928101089","WOMENS HEALTH","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12975" +"0000928101399","SKIN-CARE GUIDE MAG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16644" +"0000928102745","COOKS COUNTRY RECIPES","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13121" +"0000955197002","WELLINHAND WART WONDER","23.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","21","1","0","5","0","0","0","1828" +"0001000200007","PCOCONUT YOUNG NON-ORG","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","699","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","1830" +"0001032803162","PPOTATO BAG RED 3#","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","1391","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1832" +"0001032805505","PPOTATO BAG RED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1834" +"0001032805525","PPOTATO BAG RUSSET","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","1836" +"0001046210054","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","1838" +"0001087801014","POTSTICKERS,CHICKEN","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.01","1","1","2","0","0","0","1840" +"0001087834111","SPRING ROLL,CHICKEN","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.97","1","3","2","0","0","0","1842" +"0001101310020","CITRA-SOLV NATURAL SOLVNT","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.2","1","1","4","0","0","0","1844" +"0001101312028","CITRA-DISH LIQUID","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.83","1","1","4","0","0","0","1846" +"0001115099531","PCARROT BABY 1#","1.69","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","865","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","15426" +"0001120600035","FAT FREE SNAPS,TAMARI/SWD","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.96","1","1","4","0","0","0","1849" +"0001120600093","MISO-CUP GOLDEN LIGHT 2.5 OZ","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3","1","6","4","0","0","0","1851" +"0001121000001","SAUCE TABASCO ORIG","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1853" +"0001138100175",".25 LT. GIFT JAR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15520" +"0001138101422","5 OZ GIFT JAR","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16486" +"0001138102565","17.5 oz. GIFT JAR","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15444" +"0001145300080","PMUSHROOM WHITE PINT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","510","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","1857" +"0001145308000","PMUSHROOM CRIMINI PKG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","957","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1859" +"0001204900951","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","1863" +"0001234406020","DOG FOOD,LAMADERM 20LB","27.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","19.89","1","0","4","0","0","0","1865" +"0001234406132","DOG FOOD,CAN,LAMADERM","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.3","1","6","0","0","0","0","13225" +"0001241328001","JUST BLUEBERRIES, OG","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15293" +"0001241330000","JUST STRAWBERRIES, OG","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","0","0","1876" +"0001241334000","JUST VEGGIES, ORGANIC","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","0","0","1881" +"0001241337000","JUST MANGO, OG","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","0","0","1883" +"0001241339000","JUST APPLES, OG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","0","0","1886" +"0001241341000","JUST FRUIT MUNCHIES, OG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","0","0","1888" +"0001241346002","JUST STRAW/BANANAS, OG","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15670" +"0001251121122","BLUE AGAVE,OG,RAW","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.06","1","1","4","0","0","0","1892" +"0001251132004","SUGAR,OG,FT, POWDERED","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.97","1","1","4","0","0","0","1894" +"0001251140500","SUGAR,OG,MILLED,UNREFINED","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.46","1","1","4","0","0","0","1896" +"0001251144641","SUGAR,OG,FT, LIGHT BROWN","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.03","1","1","4","0","0","0","1898" +"0001251160000","MOLASSES,OG,BLSTP,UNSULP","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.73","1","1","4","0","0","0","1899" +"0001307354206","DISTILLED WATER, KANDIYOHI","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14353" +"0001356200005","WW PASTA & ALFREDO","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","451","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.28","1","1","4","0","0","0","1903" +"0001356200015","BUNNY GRAHAMS,OG,HONEY","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.19","1","3","4","0","0","0","1906" +"0001356200019","BUNNY COOKIES,VAN COCO,G","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.77","1","1","0","0","0","0","14128" +"0001356211105","BUNNY FRT SNK,OG,BERRY","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.94","1","1","4","0","0","0","1910" +"0001356230011","MAC & CHEESE,LOW SODIUM","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","451","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.28","1","1","4","0","0","0","1911" +"0001356230057","SNACK MIX,OG,BUNNIES CHE","5.19","0","0","0","3.79","0","3.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.94","1","3","4","0","0","0","12973" +"0001356230063","OG PASTA & OG WHT CHEDDAR","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.63","1","1","4","0","0","0","1915" +"0001356230069","PEACE,OG,PASTA & PARMESAN","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.63","1","3","4","0","0","0","1917" +"0001356230088","MICROWAVABLE MAC&CHESE,OG","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.36","1","1","4","0","0","0","1919" +"0001356230097","ALFREDO SHELLS & CHED,OG","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.63","1","1","4","0","0","0","1920" +"0001356230210","DLX SHELLS&AGED WISC CHED","4.39","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.48","1","1","4","0","0","0","1922" +"0001356230221","CRACKER,SR CRM&ONION,BUNN","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.19","1","1","4","0","0","0","1924" +"0001356231301","PASTA LOOPS W/ SOY MEATBALLS","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.62","1","1","4","0","0","0","1926" +"0001356261001","PASTA, RICE, CHEDDAR","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.96","1","0","4","0","0","0","1928" +"0001400514177","MAG READY MADE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","1929" +"0001440010730","BALL ENAMEL 21QT CANNER","59.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14745" +"0001440010790","BALL CANNING DISCOVERY KIT","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14743" +"0001440024100","FRUIT FRESH PRODUCE PROTECTOR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1931" +"0001440031000","REGULAR MOUTH LIDS","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.42","1","0","4","0","0","0","1933" +"0001440037000","WIDE MOUTH PLASTIC LIDS","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1935" +"0001440042000","WIDE MOUTH LIDS","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.09","1","0","4","0","0","0","1937" +"0001440061000","PINT SIZE REGULAR MOUTH","9.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.69","1","0","4","0","0","0","1940" +"0001440061171","ELITE WIDE MTH LIDS BANDS","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","","1","0","0","0","","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","4.01","1","0","0","0","0","0","14735" +"0001440061180","PLATINUM WIDE MOUTH PINT JARS","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.08","1","3","4","0","0","0","1943" +"0001440062500","BALL QUART JAR, SINGLE","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14742" +"0001440067000","WIDE MOUTH QUART JARS","11.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10.24","1","0","4","0","0","0","1946" +"0001440070016","BALL 1 GALLON JAR","12.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14728" +"0001440080400","CRYSTAL JELLY JARS 4OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.88","1","0","4","0","0","0","1954" +"0001440081200","JELLY JAR 8OZ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.83","1","0","4","0","0","0","1955" +"0001440082000","PLASTIC FREEZER JAR 80Z","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1957" +"0001440084000","32OZ FREEZER JAR","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","","1","0","0","0","","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14736" +"0001440085050","BALL 2QT FREEZER CONTAINER","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","1959" +"0001523790001","PCelery Hearts","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","544","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1960" +"0001583900006","CHIPS,OG,BLUE CORN,SESAME","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","0","4","0","0","0","1964" +"0001583900130","TORTS,OG,WHOLE WHEAT","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.46","1","0","2","0","0","0","1966" +"0001583900503","CHIPS,OG,BLACK BEAN CHILI","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","0","4","0","0","0","1968" +"0001583900797","CHIP OG MULTIGRN EVERYTHING","3.45","0","0","0","2.5","0","2.5","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","b2204","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.06","1","1","4","0","0","0","1970" +"0001583900823","CHIPS,OG,BLUE CORN,REDHOT 16 O","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.03","1","1","4","0","0","0","1972" +"0001583900882","CHIPS,OG,PICO DE GALLO","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","b2204","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.06","1","1","4","0","0","0","1975" +"0001606900480","SOFT PLANT TIE","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16252" +"0001607351172","Betty Lou GF AlmondButter Ball","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","13859" +"0001630016567","FL NAT JUICE, ORNG W/CAL","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.17","1","6","0","0","0","0","15919" +"0001677310933","PSUMMER SPLASH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1984" +"0001678310353","PFLOWER TULIPS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","1364","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1986" +"0001678310408","PWILDFLOWER BOUQUET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1988" +"0001678310434","PFLOWER SILENT NIGHT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1990" +"0001678310436","PFLOWER ST NICK","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1992" +"0001678310471","PFL BOUQUET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1994" +"0001678310606","PFLOWERS SKY BLUE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1996" +"0001678310682","PFLOWER HAND TIED","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","1998" +"0001678310902","PFLOWER ALSTROMERIA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2000" +"0001678310920","PFLOWERS GARDEN BOUQ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2002" +"0001678310932","PFLOWER LEMON CHIFFO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2004" +"0001678310934","PFL BOUQUET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2006" +"0001678310936","PFLOWER PURPLE CRUSH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2008" +"0001678313001","PFL MOMS LITTLE ANGE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2010" +"0001678313005","PPICTURE PERFECT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2012" +"0001678313803","PFLOWERS JELLYBEAN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2014" +"0001678313805","PFLOWER BOUQUET","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2016" +"0001678313902","PFL BOUQUET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2018" +"0001680022871","CHARCOAL, 100% HARDWOOD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16390" +"0001707710332","KEFIR,LOWFAT,STRAWBERRY","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.57","1","1","0","0","0","0","2024" +"0001707710532","LIFEWAY LF CHERRY KEFIR","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.57","1","1","0","0","0","0","2026" +"0001707712132","LIFEWAY POM KEFIR","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.57","1","1","0","0","0","0","2029" +"0001750004030","CLEANING POWDER","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.96","1","0","4","0","0","0","2032" +"0001753839911","GOURMET PARLOR PIZZA CRUST","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14951" +"0001823300111","PSPROUT DAIKON","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1022","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2042" +"0001862702345","KASHI,PUFFED,SEVEN GRAIN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.44","1","1","4","0","0","0","2043" +"0001862703010","TLC CRNCH BAR,HNY TST 7G","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.24","1","0","0","0","0","0","13976" +"0001862744679","KASHI HEART GARLIC","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.58","1","3","0","0","0","0","15018" +"0001862761001","TLC CRACKERS,ORIG 7 GRAIN","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1609","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.58","1","1","4","0","0","0","2053" +"0001862761005","TLC CRACKERS ROASTED VEG","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1609","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.58","1","1","4","0","0","0","2055" +"0001862783100","OG PROMISE,STRWBRY FIELDS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.45","1","3","4","0","0","0","2057" +"0001862783500","CEREAL CIN HARVEST KASHI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.45","1","3","4","0","0","0","2059" +"0001878776465","DR BRONNERS LAV GALLON","52.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16629" +"0001878776565","CASTILE SOAP, OG PEPMINT GAL","52.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","27.05","1","0","5","0","0","0","12792" +"0001878776916","CASTILE SOAP,TEA TREE 16Z","9.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.92","1","1","5","0","0","0","2067" +"0001878777132","CASTILLE SOAP,OG,ALMOND 32Z","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.75","1","1","5","0","0","0","2069" +"0001878777232","CASTILE LIQ SP OG BABY 32Z","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.75","1","1","0","0","0","0","14935" +"0001878777408","CASTILE SOAP,OG,LAVEND 8Z","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.15","1","1","5","0","0","0","2072" +"0001878777532","CASTILE SOAP,OG,PEPP 32Z","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.75","1","1","5","0","0","0","2073" +"0001878778105","BAR SOAP,OG,ALMOND","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.21","1","1","5","0","0","0","2075" +"0001878778305","BAR SOAP,OG,EUCALYPTUS","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.21","1","1","5","0","0","0","2077" +"0001878778505","BAR SOAP,OG,PEPPERMINT","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.21","1","1","5","0","0","0","2079" +"0001878778705","DR. BRONNERS LEMON SOAP BAR","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.21","1","1","5","0","0","0","2081" +"0001878792001","LIP BALM,OG ORANGE GINGER","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.48","1","1","5","0","0","0","2084" +"0001878792003","LIP BALM,OG LEMON LIME","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.48","1","1","5","0","0","0","2086" +"0001878794002","DR BRONNER SPPEP SHAVE GEL","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.93","1","1","5","0","0","0","2088" +"0001878795002","DR BRONNER PUMP SOAP SPPEP","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.42","1","1","5","0","0","0","2090" +"0001878795005","DR BRONNER PUMP SOAP LEMGRS","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.42","1","3","5","0","0","0","2092" +"0001878796005","DR BRONNERS LL SHIKAKAI 24OZ","14.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","7.38","1","1","0","0","0","0","16143" +"0001878820320","REDMOND FIRST AID CLAY","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","5","1","0","0","0","0","0","15910" +"0001933640010","GHEE,OG,CLARIFIED BUTTER","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.55","1","0","4","0","0","0","2095" +"0001937371121","DR TUNGS SMART FLOSS","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16196" +"0001943300001","GOAT MILK","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","2","0","0","0","2099" +"0002006510002","SWEDISH BITTERS","12.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.65","1","0","5","0","0","0","2101" +"0002018801442","TOTALLY FUDGE POPS","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.18","1","6","2","0","0","0","2103" +"0002018806013","SOUR CRM,SUPRME,NON-HYDRN","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.62","1","6","2","0","0","0","2105" +"0002037993108","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2107" +"0002037994133","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2109" +"0002052510530","ACIDOPHILUS CAPS,MILKFREE","11.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.16","1","0","5","0","0","0","2111" +"0002052511406","CHILDRENS CHEW MULTI 90CT","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.55","1","0","5","0","0","0","2114" +"0002064580889","WARM SKIN CREAM","15.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","5","0","0","0","2116" +"0002083802002","PBERRY CRANBERRY BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2117" +"0002089944447","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2119" +"0002107119586","PSPROUTS ALFALFA NON-O","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1021","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","2121" +"0002107800022","SN WELLNESS FORMULA 90 CT","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2122" +"0002107800127","SN L-GLUTAMINE ","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2125" +"0002107800190","SN L-TYROSINE 500 MG ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2126" +"0002107800235","SN ULTRA POTASSIUM","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2128" +"0002107800499","SN ACETYL L-CARNITINE","23.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2130" +"0002107800550","SN MELATONIN 3 MG ","7.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2132" +"0002107800774","SN CHROMIUM PICOLINATE 120 CT","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2133" +"0002107800914","SN HOT FLASH 90CT","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2136" +"0002107801217","SN FIBRO RESPONSE 90 CT","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2140" +"0002107801279","SN L-ARGININE ","12.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2142" +"0002107801377","SN KETO DHEA","21.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","2145" +"0002107801455","SN FERROCHEL IRON","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2149" +"0002107801639","SN GLUTATHIONE 30CT","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15814" +"0002107801695","SN 5HTP 100mg 60CT","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13107" +"0002107801707","SN GABA 750MG 90CT","16.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2155" +"0002107801772","SN THEANINE SERINE W/RELORA","18.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2157" +"0002107801792","SN VITD 1000 I.U. 200CT","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2159" +"0002107801932","SN MANGOSTEEN 32 OZ","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","106","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2161" +"0002107801979","SN L-TRYPTOPHAN","22.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2163" +"0002107802145","SN VIT D 2000 IU 200 CT","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2167" +"0002107802261","SN WELLNESS FIZZ TANGERINE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13131" +"0002107802288","XYLITOL, XYLISMART","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13460" +"0002107810097","OLD INDIAN WILD CHERRY SYRUP","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2169" +"0002107810537","PLANETARY CINNAMON 120CT","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2171" +"0002120482003","ABRA GORILLA BATH","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14776" +"0002120482008","ABRA DRAGONBERRY BATH","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14774" +"0002145120060","JUICE,PURE CRANBERRY","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.15","1","0","4","0","0","0","2178" +"0002170650002","PMUSHROOM PORTABELLA SLICED","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","649","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","2181" +"0002171841278","HERBAMARE,OG,ORIGINAL","6.19","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","3.78","1","1","4","0","0","0","12781" +"0002188810013","COMPLETE NUT SYS 180CT RL","46.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","20.5","1","1","5","0","0","0","2185" +"0002188810112","RL CANDIDA 120CT","40.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","21.99","1","1","5","0","0","0","2187" +"0002188810311","RL SUPER C 1000 60CT","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.72","1","1","0","0","0","0","13852" +"0002188810542","VIT NUTRISTARS 60CT RNBW LT","13.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.15","1","3","5","0","0","0","2192" +"0002188810881","RL WOMENS ONE MULTI 30CT","12.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.53","1","1","5","0","0","0","2195" +"0002188810892","MENS ONE MULTIVITAMIN","29.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","12.91","1","1","5","0","0","0","2197" +"0002188810951","FOOD BASED CALCIUM","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.33","1","1","5","0","0","0","2201" +"0002188810972","PRENATAL ONE MULTIVITAMIN","31.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","13.94","1","1","5","0","0","0","2203" +"0002188810992","ACTIVE SENIOR MULTI 90CT RL","31.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","13.94","1","1","5","0","0","0","2206" +"0002188811201","TEEN MULTI","14.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.35","1","1","5","0","0","0","2208" +"0002188811381","RL DAILY FRUIT & FIBER","24.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10.82","1","1","5","0","0","0","2211" +"0002188811397","RL AM CITRUS CLEANSE SINGLE","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","2213" +"0002188812081","RL GUMMY GET WELL 30CT ","12.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.41","1","1","0","0","0","0","13853" +"0002188835083","RL LACTO-ZYME","22.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.82","1","3","5","0","0","0","2216" +"0002188835132","RAINBOW LIGHT OPTIMA ENZYME","26.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.87","1","1","5","0","0","0","2218" +"0002188841005","RL VANILLA RICE PROTEIN SNGL","2.49","0","0","0","1.69","0","1.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","1.11","1","1","0","0","0","0","16145" +"0002188860015","RL CLEANSE AWAY 7 DAY RENEWAL","27.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","12.3","1","0","0","0","0","0","16321" +"0002188880011","RL ORG MENS VIT 120CT","32.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","14.34","1","1","0","0","0","0","13843" +"0002190813333","CEREAL,OG,MULTI-GRAIN SQ","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1507","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.16","1","1","4","0","0","0","2221" +"0002190813473","GRANOLA BARS,OG,HVST BRY 7.4 O","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1511","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.07","1","1","4","0","0","0","2224" +"0002190819648","CEREAL,OG,FRUITFUL OS","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.16","1","1","0","0","0","0","13586" +"0002190827475","CEREAL HONEYNUT O","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1507","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.16","1","1","4","0","0","0","2227" +"0002190832501","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2229" +"0002190840677","BLUEBERRIES,OG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","b1855","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.48","1","1","0","0","0","0","2231" +"0002190850124","CORN,OG 16OZ","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.87","1","1","2","0","0","0","2234" +"0002190850140","PEAS,OG 16OZ","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.87","1","1","2","0","0","0","2236" +"0002190850187","POTATO,OG,SPUD PUPPIES","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.08","1","1","2","0","0","0","2239" +"0002190850324","CORN,OG,SUPER,SWEET,CUT 10Z","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","2","0","0","0","2241" +"0002190850340","PEAS,OG,SWEET GREEN 10OZ","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","2","0","0","0","2243" +"0002190850401","GARDENERS BLEND,OG","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","2","0","0","0","2245" +"0002190850419","STIR FRY,OG,CHINESE","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","2","0","0","0","2248" +"0002190850508","BOX,OG,WINTR SQUASH PUREE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.87","1","1","2","0","0","0","2250" +"0002190850912","BAR,OG,CHOCOLATE","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.05","1","1","4","0","0","0","2252" +"0002190850916","NUTRITIONAL BAR,PBTR COO","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.94","1","1","0","0","0","0","13381" +"0002190850923","LARABAR CHOC COCONUT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.94","1","1","4","0","0","0","2256" +"0002190850925","NUTRITIONAL BAR,CASHEW C","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.94","1","1","0","0","0","0","14493" +"0002190850936","BAR,CHOC CHIP BROWNIE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.94","1","1","0","0","0","0","15261" +"0002190851495","HARVEST BERRIES,OG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","b1855","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","1","0","0","0","0","2258" +"0002190853001","RASPBERRIES,OG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","b1855","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","1","0","0","0","0","2260" +"0002190855011","BLACKBERRIES,OG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","b1855","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","1","0","0","0","0","2262" +"0002190863203","FRT SPREAD,OG,BLACKBERRY","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.12","1","1","4","0","0","0","2265" +"0002190863206","FRT SPRD OG GRAPE","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.12","1","1","4","0","0","0","2267" +"0002190863209","FRT SPREAD,OG,STRAWBERRY","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.12","1","1","4","0","0","0","2269" +"0002190896512","FROZEN GRAPE JUICE","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","42","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.63","1","1","2","0","0","0","2271" +"0002190896516","FRZN JCE,OG,ORANGE","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","42","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.63","1","1","2","0","0","0","2273" +"0002217910124","SLUGGO","10.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14108" +"0002218150001","WATER DRINKING 1 GAL LOCAL","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","2276" +"0002220922201","PBLUEBERRY PINT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2279" +"0002250600201","FLAX OIL,OG,ENRCH W/LIGN 16OZ","23.75","0","0","0","14.99","0","14.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","10.56","1","1","5","0","0","0","2281" +"0002250600206","VINEGAR,OG,RED WINE","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.38","1","1","4","0","0","0","2283" +"0002250600233","OLIVE OIL,OG,MEDTRN,X VRG","20.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","11.86","1","1","4","0","0","0","2285" +"0002250600240","SOY MAYONNAISE, OG 32OZ","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.12","1","1","4","0","0","0","2287" +"0002250600325","SPECTRUM FISH OIL 100 CT","14.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.59","1","1","5","0","0","0","2290" +"0002250610410","PEANUT OIL,UNREFINED","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.14","1","0","4","0","0","0","2292" +"0002250611201","COCONUT OIL,OG,BODY CARE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.18","1","0","5","0","0","0","2294" +"0002250612016","FLAX OIL,OG,(REFRIG) 16 OZ","23.75","0","0","0","14.99","0","14.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","10.56","1","1","5","0","0","0","2297" +"0002250612701","SPECTRUM BORAGE OIL1000MG 60ct","32.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","14.37","1","0","5","0","0","0","2299" +"0002250613005","ALMOND OIL,SWEET,REFINED","7.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.34","1","0","4","0","0","0","2301" +"0002250613420","CANOLA OIL,REFINED 32 OZ","8.65","0","0","0","5.29","0","5.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","5.11","1","1","4","0","0","0","2303" +"0002250613710","CANOLA OIL,OG,REFINED","7.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.4","1","0","4","0","0","0","2305" +"0002250613806","SKILLET SPRY,CNLA,HI HEAT 6 OZ","6.29","0","0","0","4.39","0","4.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","3.6","1","1","4","0","0","0","2307" +"0002250618010","SAFFLOWER OIL OG REFINED","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.63","1","0","4","0","0","0","2308" +"0002250620132","CANOLA MAYONNAISE 32OZ","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.99","1","1","4","0","0","0","2311" +"0002250626612","VINEGAR,OG,BROWN RICE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.06","1","0","4","0","0","0","2313" +"0002250632403","SPRY,CANOLA OIL W/BTR FLV","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.96","1","1","4","0","0","0","2316" +"0002250642137","OLIVE OIL,OG,UNREF,X VRGN","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.38","1","0","4","0","0","0","2318" +"0002250642337","OLIVE OIL,UNREF,EX VIRGIN","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.46","1","0","4","0","0","0","2320" +"0002250651625","SPECTRUM FISH OIL 250 CT","32.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","14.43","1","1","5","0","0","0","2322" +"0002250693451","COCONUT OIL,OG,UNREFINED","11.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.6","1","1","4","0","0","0","2325" +"0002325463391","MIX,FAT FREE,BROWN GRAVY","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.91","1","0","4","0","0","0","2328" +"0002325466751","SEA SALT PLAIN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.15","1","0","4","0","0","0","2331" +"0002336320095","RED CLOVER BURDOCK 1OZ","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16153" +"0002336330095","RED CLOVER BURDOCK 2OZ","20.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16152" +"0002336330249","Milk Thistle Seed 600 mg","18.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10","1","3","5","0","0","0","2334" +"0002336330353","Kava \"Nakamal\" Juice 425 m","18.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.9","1","3","5","0","0","0","2336" +"0002336330511","Ech angustifolia ROOT 325 m","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.6","1","3","5","0","0","0","2338" +"0002336330516","Ginkgo 500 mg FDFU V50","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.5","1","3","5","0","0","0","2340" +"0002336330534","Dandelion LEAF FD V50","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.5","1","3","5","0","0","0","2342" +"0002336330538","Cranberry 300mg COG FDF","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.5","1","3","5","0","0","0","2344" +"0002336330551","Valerian officinalis 425 mg","13.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.4","1","3","5","0","0","0","2346" +"0002336330596","ECLECTIC OLIVE LEAF","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.5","1","3","5","0","0","0","2348" +"0002336330645","ECLECTIC GOLDENSEAL HERB","7.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.2","1","3","5","0","0","0","2350" +"0002336330938","Cranberry 300mg COG FDF","17.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.4","1","3","5","0","0","0","2353" +"0002336332410","INTESTINAL SUPPORT","21.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.5","1","3","5","0","0","0","2356" +"0002336332412","LUNG SUPPORT","21.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.5","1","3","5","0","0","0","2358" +"0002336336502","Nettles Quercetin FD","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.2","1","3","5","0","0","0","2360" +"0002336362214","Babies TumEase KIDS","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.5","1","3","5","0","0","0","2363" +"0002340000201","BORAX, 20 MULE TEAM","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16208" +"0002354210042","#100 KYOLIC GARLIC 200ct","26.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.59","1","3","5","0","0","0","2366" +"0002354210441","KYOLIC CHOLESTROL","14.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.61","1","0","5","0","0","0","2368" +"0002354210741","KYOLIC PHYTOSTEROLS","19.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","8.63","1","0","0","0","0","0","15521" +"0002354722206","WASABI HORSERADISH,POWDER","8.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.93","1","1","4","0","0","0","2371" +"0002354740011","MISO,OG,TRAD RED/DOM","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.76","1","1","2","0","0","0","2372" +"0002354788101","PASTA,OG,SOBA NOODLES","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.57","1","1","4","0","0","0","2374" +"0002392310046","INFANT FORMULA WITH IRON","38.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15820" +"0002392320010","APPLES OG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2379" +"0002392320014","APPLE PLUM OG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2381" +"0002392320016","PEARS OG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2383" +"0002392320019","PEARS RASPBERRIES OG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2384" +"0002392320056","FIRST FOODS, OG, STARTER PACK","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.56","1","0","4","0","0","0","2386" +"0002392320209","SS COOKIES,OG,VERY VANILA 5.3","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","1554","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.08","1","1","4","0","0","0","2388" +"0002392320353","SS SNACKN HEARTS,OG,BLBR","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.04","1","1","4","0","0","0","2390" +"0002392320420","SS ELMO SOUP,OG,NOODLEMA","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.72","1","1","4","0","0","0","2392" +"0002392330031","SWEET POTATOES OG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2398" +"0002392330034","WINTER SQUASH","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2400" +"0002392330037","SPINACH POTATOES OG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2402" +"0002392350045","DINNER,OG,BRWN RICE&LENT","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.8","1","1","0","0","0","0","15094" +"0002392350060","DINNER OG SWT POTATO CHIKN","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.8","1","1","4","0","0","0","2406" +"0002392390015","TEETHING BISCUIT,OG,ORIG","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.83","1","0","4","0","0","0","2408" +"0002405524144","MUSHROOM BRUSH","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2410" +"0002418200025","SESAME OIL,OG","10.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.07","1","0","4","0","0","0","2412" +"0002418200059","RED WINE VINGR-RAW UNFILT","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.63","1","6","4","0","0","0","2414" +"0002418200062","VINEGAR,OG,APPLE CIDER 16Z","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.94","1","6","4","0","0","0","2416" +"0002418200066","APPLESAUCE,OG","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.11","1","0","4","0","0","0","2418" +"0002418200200","SEA SALT","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.98","1","0","4","0","0","0","2421" +"0002418200216","BONITO FLAKES","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.19","1","2","4","0","0","0","2423" +"0002418200237","CHILI,BLACK BNS & QUINOA","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.14","1","6","0","0","0","0","13197" +"0002418200253","BEANS,OG,BLACK,CAN","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1533","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.33","1","1","4","0","0","0","2425" +"0002418200256","BEANS,OG,CANNELLINI,CAN","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1533","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.39","1","1","4","0","0","0","2427" +"0002418201100","SAUERKRAUT,OG,GLASS","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.79","1","3","4","0","0","0","2431" +"0002418202535","EDENSOY EXTRA,OG,ORIGINAL","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.85","1","6","4","0","0","0","2433" +"0002418202905","EDENBLEND,OG","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.89","1","6","4","0","0","0","2435" +"0002418215475","SEA VEGETABLE,ARAME","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.54","1","6","4","0","0","0","2437" +"0002418215931","AGAR FLAKES","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.38","1","6","4","0","0","0","2439" +"0002418218137","TEA OG SENCHA GREEN","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.57","1","0","4","0","0","0","2441" +"0002418218156","TEA,OG,GENMAICHA GREEN 16 BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.31","1","0","4","0","0","0","2443" +"0002418242129","SESAME OIL,TOASTED","10.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.21","1","0","4","0","0","0","2445" +"0002418249115","BARLEY MALT,OG","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.92","1","6","4","0","0","0","2447" +"0002428438111","SNO PAC CRANBERRIES","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.92","1","6","2","0","1","0","2450" +"0002428478221","BEANS,OG,GREEN","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.69","1","3","2","0","1","0","2452" +"0002433501410","CHIPS,OG,BL CORN,TORT","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.18","1","1","4","0","0","0","2454" +"0002433501420","CRUNCHITOS LITTLE BEAR","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.78","1","1","4","0","0","0","2456" +"0002433511216","TACO SHELLS,OG,YELLOW CRN","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2","1","0","4","0","0","0","2458" +"0002433516006","REFRIED BEANS,OG,PINTO,LF","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.49","1","1","4","0","0","0","2460" +"0002433516206","REFRIED BEANS,OG,REG,FF","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.59","1","1","4","0","0","0","2462" +"0002433521116","CHIPS,OG,YELLOW TORT,SALT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","b1833","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.59","1","1","4","0","0","0","2464" +"0002446306105","SAUCE, CHILI GARLIC, ROOSTER","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","2466" +"0002446306109","SAUCE, HOT, SRIRACHA CHILI","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","0","4","0","0","0","2468" +"0002529300092","SILK SOYMILK, OG, PLN","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.82","1","6","0","0","0","0","15418" +"0002529300098","SILK ALMOND MILK ORIGINAL","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.74","1","0","0","0","0","0","14713" +"0002529300139","SILK SINGLE, VERY VANILLA","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15559" +"0002529360003","SILK SOY YGRT,BLUEBERRY","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.65","1","3","2","0","0","0","2473" +"0002529360005","SILK SOY YGRT,RASPBERRY","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.65","1","0","2","0","0","0","2475" +"0002529360011","SILK SOY YGRT,KEY LIME","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.65","1","0","2","0","0","0","2477" +"0002529360018","SILK SOY YGRT,BLCK CHERRY","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.65","1","0","2","0","0","0","2479" +"0002529360025","SILK SOY MLK, VANILLA 32OZ","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.61","1","6","2","0","0","0","2482" +"0002529360031","SILK SOY MLK, CHOCLATE 64OZ","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.74","1","1","2","0","0","0","2486" +"0002529360042","SILK SOY CREAMER,OG 32OZ","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.31","1","0","0","0","0","0","2492" +"0002529360044","SILK SOY CREAMER,OG,HZLNT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.26","1","0","0","0","0","0","2494" +"0002529360056","SILK SOY MLK, VERY VAN 64OZ","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.74","1","1","2","0","0","0","2496" +"0002529360090","SILK SOY MK,ASPTC,PLN","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.77","1","6","4","0","0","0","2500" +"0002531700510","APLGT GRT ORG HOT DOG","6.99","0","0","0","5.79","0","5.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","","0","0","0","4.19","1","1","0","0","0","0","14442" +"0002531700556","APPLEGATE GF CHKN NUGGETS","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.68","1","1","2","0","0","0","2507" +"0002531700596","APPLEGATE CHKN MAPLE SAUSAGE","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.61","1","6","0","0","0","0","2510" +"0002531700887","APPLEGATE HAM","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.65","1","2","8","0","0","0","2512" +"0002531710500","CANADIAN BACON","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","2513" +"0002531710595","CHKN&APLE SAUS,ANTIBTC FR","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.61","1","6","0","0","0","0","2515" +"0002531712000","BACON,TURKEY SLICED","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.64","1","0","0","0","0","0","2517" +"0002531732100","APLGT SPIN FETA SAUSAGE","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","14444" +"0002531752000","APLGT TURKEY HOT DOG","4.95","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","","0","0","0","2.93","1","1","0","0","0","0","14443" +"0002531756500","BURGER,OG,TURKEY","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","","0","0","0","5.33","1","0","0","0","0","0","2526" +"0002531757900","APPLEGATE SMKD TURKEY NATRL","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.93","1","0","8","0","0","0","2529" +"0002531767400","APPLEGATE OG ROAST BEEF","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15292" +"0002531785600","GENOA SALAMI","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","2538" +"0002531787200","PROSCIUTTO","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","2540" +"0002536000082","PAPPLE BAG GOLD DEL","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","533","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2542" +"0002536003540","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2544" +"0002540000017","CUC DILL HUMMUS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","2546" +"0002548400005","EGGROLL WRAPS","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.65","1","6","2","0","0","0","2551" +"0002548400040","NAYONAISE","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","1","4","0","0","0","2553" +"0002558300463","TOFURKY,VEGETARIAN FEAST","28.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","16.75","1","1","2","0","0","0","2554" +"0002558300602","TOFURKY SWEET ITAL SAUSGE","4.75","0","0","0","3.79","0","3.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.82","1","6","2","0","0","0","2556" +"0002558300952","TOFURKY SAUS VEGAN PIZZA","7.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.91","1","6","0","0","0","0","15029" +"0002558366873","OVEN ROASTED DELI SLICES","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.86","1","6","2","0","0","0","2560" +"0002563861004","VANILLA XTRT,MDGSR,OG","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.29","1","0","4","0","0","0","2562" +"0002572000000","PPEANUT BAGGED","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","548","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2564" +"0002639500004","Aloe Vera Gelly","4.19","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.17","1","1","0","0","0","0","14578" +"0002639510032","ALOE VERA GEL,OG","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","106","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.56","1","0","5","0","0","0","2570" +"0002660334712","TEA BAG, COTTON","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.31","1","0","0","0","0","0","2572" +"0002683230010","MEATBALL,MTLS,CLASSIC,VEG","4.95","0","0","0","3.79","0","3.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.91","1","1","2","0","0","0","2575" +"0002685112040","ADULT CAT FORMULA,DRY","9.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.4","1","6","4","0","0","0","2578" +"0002701830178","TEA,GREEN BLEND","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.65","1","6","4","0","0","0","2583" +"0002701830400","TEA,ORIGINAL","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.65","1","6","0","0","0","0","14178" +"0002706459600","SPELT PRETZELS","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.67","1","1","4","0","0","0","2586" +"0002715800102","PFIGS CROWN GREEK","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","553","0","0","1","0","0","567","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15213" +"0002727520003","MINT-FR HOMEOPATHIC TPSTE","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.07","1","6","5","0","0","0","2588" +"0002743401023","MAGNESIUM,400 MG 200CT","17.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.72","1","0","5","0","0","0","2589" +"0002743401224","COD LIVER OIL,PLAIN","14.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.42","1","0","5","0","0","0","2591" +"0002743401506","BETAINE HCI","18.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.11","1","0","5","0","0","0","2593" +"0002791700113","PB8 ACIDOPHILUS,VEGETARN","13.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.16","1","1","5","0","0","0","2595" +"0002791700256","RHINO CALCIUM,CHERRY","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.45","1","1","5","0","0","0","2602" +"0002818941322","CHILE,DICED,GREEN,MILD","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.38","1","0","0","0","0","0","15622" +"0002836773149","BAR SOAP,OLIVE & ALOE","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.97","1","1","5","0","0","0","2610" +"0002836782756","OLIVE & ALOE MOISTURIZER","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.88","1","1","5","0","0","0","2611" +"0002836782785","A & E MOISTURIZER","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.88","1","1","5","0","0","0","2612" +"0002836782823","KMF OLIVE HONEY BAR SOAP 4OZ","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","3","0","0","0","0","14400" +"0002836782834","BATH/SHOWER GEL,ANTISTRSS","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.39","1","6","5","0","0","0","2615" +"0002836782874","DEOD,LIQUID ROCK FRAG FRE","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","1","5","0","0","0","2617" +"0002836782925","KMF OLIVE ALOE MOIST GALLON","56.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","2619" +"0002836783062","MOIST BATH,EARLY TO BED","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.39","1","6","5","0","0","0","2622" +"0002836783100","MOIST SOAP,PEAR","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.19","1","1","5","0","0","0","2624" +"0002836783102","MOIST SOAP,ORNG BLOSSOM","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.19","1","1","5","0","0","0","2626" +"0002836783121","MOISTURE SHAVE,PATCHOULI","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.43","1","1","5","0","0","0","2628" +"0002836783131","ROLL-ON,LIQUID ROCK,PTCHL","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","1","5","0","0","0","2630" +"0002836783155","TPASTE,ALOEDYNE,TRPLE ACT","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.93","1","1","5","0","0","0","2634" +"0002836783165","SHAMP,MISS TRTD,PARABN FR","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","2637" +"0002836783168","SHAMP,BIG BODY,PARABN FRE","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","2639" +"0002836783211","LIP BALM,SPF15,PEACH","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","6","5","0","0","0","2641" +"0002836783213","LIP BALM,GINGER MANGO","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","6","5","0","0","0","2643" +"0002836783291","KMF TRAVEL DEODORANT","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.63","1","0","5","0","0","0","2645" +"0002836783296","KMF TRAVEL LIQUID SOAP","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.77","1","0","5","0","0","0","2648" +"0002836783299","KMF TRAVEL LOTION","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.77","1","0","5","0","0","0","2650" +"0002836783308","FOAM SOAP,OG,LVND&CHAM","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","2652" +"0002836783350","BAR SOAP,OLIVE & LAVENDER","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.97","1","1","5","0","0","0","2654" +"0002836783422","LIP BALM,TREAT MINT","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","6","5","0","0","0","2655" +"0002836783424","LIP BALM,VANL HONEY","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","6","5","0","0","0","2657" +"0002836783455","MOIST SHAVE,COOL MINT","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","2659" +"0002836783459","DEOD,ACT ENZYM,STK,FRG FR","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","1","5","0","0","0","2661" +"0002836783468","COND,BIG BODY,PARABEN FRE","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","2666" +"0002836783478","FOAM SOAP REF,LVNDR&CHAM","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.39","1","1","5","0","0","0","2668" +"0002836783483","KMF TRAVEL COND","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.63","1","0","5","0","0","0","2670" +"0002836783624","KMF SENSITIVE ALOE GEL TP","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.93","1","1","5","0","0","0","2673" +"0002836783639","KMF WHALE SOAP 2PK BERRY","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.91","1","1","0","0","0","0","14195" +"0002840000948","PITA CHIPS,GRDN VEG MEDL","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.72","1","1","0","0","0","0","14593" +"0002840009221","PITA CHIPS,PARM GRLC HER","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","1","4","0","0","0","2676" +"0002840009449","PITA CHIPS,PARM GRLC HER","0.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.53","1","0","0","0","0","0","15050" +"0002855812123","POTATO CHIPS,RF,RIPPLED","3.69","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1552","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.18","1","6","4","0","0","0","2679" +"0002855872002","CHEESE PUFFS,CHEDDAR","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","1","4","0","0","0","2682" +"0002883307010","TORTILLAS,OG,BURRITO SIZE","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.78","1","0","2","0","0","0","2684" +"0002890100093","NORPRO CERAMIC COMPOST KEEPER","25.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2686" +"0002890100113","ZESTER","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2689" +"0002890100125","CHEESE SLICER","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15324" +"0002890100198","CITRUS PEELER","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15124" +"0002890100339","CHEESE GRATER","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2694" +"0002890100598","NORPRO JAR WRENCH","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2696" +"0002890100602","CANNING LABELS","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2698" +"0002890100605","NORPRO CANNING LID RACK","9.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2700" +"0002890100614","JELLY STRAINER AND BAGS","6.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2702" +"0002890100866","APPLE PEELER/CORER","25.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13108" +"0002890105119","NORPRO CHERRY/OLIVE PITTER","9.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2710" +"0002890110093","NORPRO CERAMIC COMPOST FILTER","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2713" +"0002890150093","RED CERAMIC COMPOST KEEPER","25.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","2715" +"0002898943405","MRNGSTR BBQ RIBLETS","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.07","1","0","0","0","0","0","2721" +"0003004200088","FRESH MOZZARELLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","2724" +"0003006500009","BRAD MATTHEWS WHITE","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.45","1","0","3","0","0","0","2726" +"0003006511111","ENGLISH MUFFIN,WW,PLAIN","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.76","1","0","2","0","0","0","2728" +"0003006544444","BREAD MATTHEWS","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.47","1","0","3","0","0","0","2730" +"0003009927026","CHOP CHOP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15031" +"0003022304202","PSALAD BABY SPINACH 5 OZ CLAM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1357","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2733" +"0003022304206","parugala clam","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15081" +"0003022304221","PSALAD ITALIAN","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","668","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2735" +"0003022304223","PSALAD SPRING MIX BAG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","669","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2737" +"0003022304226","PARUGULA BAGGED","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","665","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2739" +"0003022304336","PSALAD SPRING MIX 1# CLAM","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","695","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2741" +"0003022304780","PSALAD BABY SPINACH 1# CLAM","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1018","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2743" +"0003026400210","AMAZAKE ALMOND SHAKE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.04","1","0","2","0","0","0","2745" +"0003049488122","MINERAL WATER","3.15","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","2.06","1","6","0","0","0","0","16415" +"0003068403503","LEMON SNAPS","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.24","1","1","4","0","0","0","2748" +"0003073405591","VEGGIE STEAMER","8.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14073" +"0003087100001","WLDWD TOFU, FIRM VPCK 10","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.38","1","0","0","0","0","0","15713" +"0003087102000","WLDWD TEMPEH SOY RICE","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15720" +"0003087140100","WLDWD TOFU, X FIRM WTRPCK","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.65","1","0","0","0","0","0","15719" +"0003096302050","MLO PROTEIN BR. RICE","21.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.44","1","0","5","0","0","0","2755" +"0003098503800","DERMA E CLEAR SKIN 2","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.67","1","3","5","0","0","0","2757" +"0003114200088","FRESH MOZZARELLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","2762" +"0003120090004","PBERRY CRANBERRY NON-O","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","733","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2764" +"0003149302160","RUDIS 100% WHOLE WHEAT","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.68","1","1","3","0","0","0","2766" +"0003149302340","RUDIS 14 GRAIN","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.68","1","1","3","0","0","0","2769" +"0003149306065","RUDIS WW ENGLISH MUFFIN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","1","3","0","0","0","2774" +"0003149306105","Rudis Spelt English Muffins","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","1","3","0","0","0","2776" +"0003149324242","RUDI HONEY SWEET WH WHEAT","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.68","1","1","3","0","0","0","2778" +"0003149354373","RUDI COLORADO CRKD WHEAT","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.68","1","1","3","0","0","0","2784" +"0003149377639","RUDI HOT DOG BUN","3.69","0","0","0","2.5","0","2.5","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.14","1","1","3","0","0","0","2789" +"0003149381132","TORTS,OG,WHITE SPELT","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","1","2","0","0","0","2791" +"0003149392183","Rudis Cinnamon Raisin Bread","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.8","1","0","3","0","0","0","2795" +"0003260100300","PSALAD BABY ROMAINE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","667","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2797" +"0003260100550","PARUGULA BABY BAG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","665","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2799" +"0003260102020","PYAM BAGGED GARNET 3#","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","526","0","0","1","1","0","1421","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14192" +"0003260103112","PONIONS GREEN PKG","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","","0","1","0","0","639","0000-00-00 00:00:00","1","0","1","0","LB","0","1","0","0","1","8","0","0","0","0","14607" +"0003260103118","PLETTUCE ICEBURG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","947","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2802" +"0003260103170","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","2804" +"0003260103196","PGARLIC 8OZ PKG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","1180","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2806" +"0003260103215","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2808" +"0003260104110","PCARROT BAG 1#","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","511","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2810" +"0003260104400","PCARROT BAG 5#","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","513","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2812" +"0003260104700","PPOTATO BAG RED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2814" +"0003260104730","PPOTATOES YELLOW BAGGED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","516","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16283" +"0003260104781","PGINGER JARRED","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1314","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13479" +"0003260108300","PSALAD ITALIAN BAG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","668","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2818" +"0003260108800","PSALAD SPRING MIX CLAM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1357","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2820" +"0003260108900","PCAESAR SALAD CLAM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1162","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2822" +"0003260150120","porange bag navel","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","","0","1","0","0","790","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14284" +"0003260150135","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","2824" +"0003260150250","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2826" +"0003260150511","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2827" +"0003260150595","PAPPLE BAG SLICES","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1054","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2829" +"0003260160105","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2831" +"0003260170525","PSALAD FANCY ROMAINE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","667","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2833" +"0003260170825","PSALAD ITALIAN","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","668","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2835" +"0003260190010","PSALAD SPRING MIX CLAM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1357","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2837" +"0003260190030","PSALAD BABY ROMAINE CLAMSHELL","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1078","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2839" +"0003260190066","PSALAD MACHE","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1009","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2841" +"0003260190150","PSALAD BABY SPINACH 1# CLAM","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1018","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2843" +"0003284333616","COFFEE OG FT CLASSIC RSTALTURA","11.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.7","1","0","1","0","0","0","2845" +"0003291700012","HERB TEA,PREGNANCY","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","2847" +"0003291700014","HERB TEA,OG,MOTHER","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","2849" +"0003291700016","HERB TEA,GYPSY COLD CARE","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","2851" +"0003291700051","TEA,OG,ECHINACEA PLS","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","3","4","0","0","0","2853" +"0003291700067","TEA,OG,RASPBERRY LEAF","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","2855" +"0003291700089","HERB TEA,EVERYDAY DETOX","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","2857" +"0003291700154","TEA,OG,ECHINACEA ELDER","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","2859" +"0003291700159","HERB TEA,LEMON ECH THROAT","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1586","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.01","1","3","4","0","0","0","2861" +"0003291700164","TEA OG GINGER TRAD MED","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.01","1","0","0","0","0","0","15431" +"0003291700172","TRAD MED THROAT COAT PASTILLE","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.87","1","0","5","0","0","0","2864" +"0003291700196","TEA,OG,HEARTBURN SOOTHER","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.01","1","1","0","0","0","0","13561" +"0003301700184","SOUP CUP SPLIT PEA","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.94","1","0","4","0","0","0","2868" +"0003333731101","VALLEY VIEW WHL MILK GAL.","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","2871" +"0003333731103","VALLEY VIEW 1% MILK GAL.","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","2873" +"0003333731201","VALLEY VIEW WHL MILK HALF GAL.","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","2875" +"0003333731203","VALLEY VIEW 1% HALF GALLON","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","2877" +"0003333733305","BUTTERMILK QU.","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","2879" +"0003333733507","HALF N HALF VV 16Z","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","0","0","1","0","2881" +"0003333741101","IVY FARMS WM GALLON","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","14415" +"0003333741103","IVY FARMS 1% GALLON","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","14411" +"0003333743201","IVY FARMS WHL 64OZ","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","16165" +"0003333743203","IVY FARMS 1% HALF GALLON","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","1","0","14417" +"0003338290001","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2882" +"0003338300033","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14544" +"0003338300036","BAG GRANNY SMITH APPLES","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13059" +"0003338300038","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2884" +"0003338300081","PAPPLE BAG G DELICIO","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","533","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2885" +"0003338300145","PPEAR BAG TOSCA ","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","817","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2887" +"0003338300386","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2888" +"0003338300471","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14722" +"0003338300505","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2891" +"0003338300507","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2893" +"0003338300565","PAPPLE BAG JONAGOLD","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","534","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2895" +"0003338300658","PAPPLE BAG GDELICIOU","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","533","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2897" +"0003338300698","PAPPLE BAG HONEYCRISP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","535","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2899" +"0003338300704","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2901" +"0003338300739","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2903" +"0003338300900","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2905" +"0003338300912","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2907" +"0003338300924","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2909" +"0003338300932","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2911" +"0003338300956","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2913" +"0003338300963","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2915" +"0003338300975","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2917" +"0003338300984","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2919" +"0003338300988","PAPPLE BAG GRANNY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2920" +"0003338300991","PAPPLE BAG GR.SMITH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2922" +"0003338301012","PAPPLE BAG CAMEO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16155" +"0003338301067","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2924" +"0003338301230","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2926" +"0003338301235","PAPPLE BAG JONAGOLD","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","534","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2927" +"0003338301242","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2929" +"0003338301247","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2930" +"0003338301251","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2932" +"0003338302191","PAPPLE BAG GRANNY SMITH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2934" +"0003338302751","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","2936" +"0003338308520","PAPPLE BAG CORTLAND","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","548","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15297" +"0003338308809","PAPPLE BAG HONEYCRIS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","535","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2939" +"0003338309599","PAPPLE BAG GINGERGOL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","555","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2941" +"0003338309900","PAPPLE BAG MACINTOSH","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","692","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2943" +"0003338310316","PTANGERINES SUNBURST BAGGED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","824","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15555" +"0003338310805","Org Gingergold Apple, bag","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15023" +"0003338311006","PORANGE BAG NAVEL NON-O","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1425","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2947" +"0003338311040","PORANGE BAG NAVEL 4# RDW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","790","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14846" +"0003338311050","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2948" +"0003338311056","PORANGE BAG NAVEL NON-O","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","790","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2950" +"0003338311502","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","2952" +"0003338311804","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2954" +"0003338311855","PGRAPEFRUIT BAGGED NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1427","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16405" +"0003338311906","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","2955" +"0003338311960","pclementine 5-pound cs","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","1121","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13527" +"0003338311983","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","2958" +"0003338311985","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2960" +"0003338311988","porange sky valley bag","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1425","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13814" +"0003338313120","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2962" +"0003338314600","PTANGERINES BAGGED","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15234" +"0003338314605","pCLEMENTINE BAG 3# Non-o","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1334","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13685" +"0003338314616","pMANDARIN BAGGED NON-O","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1431","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13871" +"0003338314681","PLIME BAG KEY","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","760","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2966" +"0003338320027","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2967" +"0003338320038","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","2969" +"0003338320058","PBERRY STRAWBERRIES QUARTS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","8","0","0","0","0","15619" +"0003338321029","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2971" +"0003338322000","PBERRY BLUEBERRY NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12921" +"0003338322029","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2973" +"0003338322101","BLUEBERRIES PINT NON-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2975" +"0003338322201","PBERRY BLUEBERRY NON-O PINT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2976" +"0003338322228","PBERRY BLUEBERRY 1/2PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12860" +"0003338322231","PBERRY BLUBERRY PT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2978" +"0003338322233","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2980" +"0003338324001","PBERRIES BLACK BERRIES","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15329" +"0003338324028","PBERRY BLACKBERRY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2983" +"0003338330011","PPEAR BAG BOSC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","796","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2984" +"0003338330019","PPEAR BAG BARTLETT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2986" +"0003338330029","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2988" +"0003338330035","PPEAR BAG BARTLETT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2990" +"0003338330040","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","803","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2992" +"0003338330047","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2994" +"0003338330050","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","2996" +"0003338330052","PPEAR BAG BARTLETT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","2998" +"0003338330073","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3000" +"0003338330082","PEAR BAG BARTLETT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3002" +"0003338330348","PPEAR BAG DANJOU RED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","803","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3004" +"0003338330960","PAPPLE BAG SANSA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","691","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3006" +"0003338340108","PKIWIFRUIT BAG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","549","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3008" +"0003338340239","PFIG BROWN TURKEY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","550","0","0","1","0","0","805","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3010" +"0003338340253","PFIG CALIMYRNA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","550","0","0","1","0","0","806","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3012" +"0003338346331","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","3014" +"0003338353610","PPOTATO BAG YUKON","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","516","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","3016" +"0003338353811","PPOTATO BAG RUSS 5#","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3018" +"0003338360036","PONION VIDALIA BAGGED 2#","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","968","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16557" +"0003338360101","PONION RED BAG NON-O","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","1396","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14530" +"0003338360301","PONION PEARL","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","629","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3021" +"0003338365020","PLETTUCE NON-O HEAD","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","","0","1","0","0","1387","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14114" +"0003338365325","PCELERY HEARTS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","544","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3023" +"0003338365592","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","3025" +"0003338365594","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","3027" +"0003338367002","PRADISH BAGGED NON-ORG","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","682","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3029" +"0003338367540","PMUSHROOM ENOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","514","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3031" +"0003338367561","PMUSHROOM CRIMINI PKG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","957","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3033" +"0003338367606","PMUSHROOM PORTABELLA SLICED","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","649","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","3035" +"0003338370220","PASPARAGUS NON-O 1LB","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","1386","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3036" +"0003338390002","Bag Red Onion","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3038" +"0003338390101","PPOTATO BAG RED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3040" +"0003338390103","PPOTATO BAG YUKON 5#","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","516","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","3042" +"0003338390201","PCARROT BAG 1#","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","511","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3044" +"0003338390203","PCARROT BAG 5#","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","513","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3046" +"0003338390206","PCARROT BABY 2#","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","670","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3048" +"0003338390404","PCELERY BUNCH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","551","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.23","1","3","6","0","0","0","3050" +"0003338390421","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","3052" +"0003338390423","PHERB PARSLEY FLAT BNCH","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","546","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.85","1","8","6","0","0","0","3054" +"0003338390432","PSPINACH BUNCH","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","672","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3056" +"0003338390434","PKIWIFRUIT BAG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","549","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3058" +"0003338390472","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3060" +"0003338391024","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","3062" +"0003338396618","PROSE PARADE","999.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3064" +"0003338397738","PFLOWER GLADIOLA","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3066" +"0003361700008","FLATBREAD,ROSEMARY","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.83","1","1","0","0","0","0","15126" +"0003367400700","CAYENNE,EXTRA HOT,10000HU","9.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.31","1","0","5","0","0","0","3069" +"0003367402070","ACTIVATED CHARCOAL,260MG","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.52","1","0","5","0","0","0","3071" +"0003367406881","NWAY PRIMADOPHILUS 5OZ.","16.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.38","1","6","5","0","0","0","3073" +"0003367411500","CAYENNE","8.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.69","1","0","5","0","0","0","3075" +"0003367412300","DANDELION ROOT","8.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.89","1","0","5","0","0","0","3077" +"0003367413100","GINGER","8.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.69","1","0","5","0","0","0","3080" +"0003367414537","NW PEPOGEST 60CT","12.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.74","1","0","5","0","0","0","3083" +"0003367415170","ECHINACEA VCAP","10.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6","1","0","5","0","0","0","3085" +"0003367415174","FENUGREEK SD VCAP","8.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.89","1","0","5","0","0","0","3087" +"0003367415180","ASTRAGALUS","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.52","1","0","5","0","0","0","3089" +"0003367415273","NWAY UMCKA COLDCARE","17.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.62","1","0","5","0","0","0","3091" +"0003367417300","NWAY ST. JOHNS WORT","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.52","1","0","5","0","0","0","3094" +"0003367463100","TUMERIC","17.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10.25","1","0","5","0","0","0","3096" +"0003374597024","DIOTOMACEOUS EARTH","9.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","3098" +"0003377601171","BUTTERY SPREAD,OG,WHIPPED","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.09","1","1","2","0","0","0","3100" +"0003377601178","BUTTERY SPREAD, SOY GRDN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.98","1","1","0","0","0","0","15518" +"0003452912362","SEA VEG,OG,DULSE 2 OZ","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.55","1","0","4","0","0","0","3103" +"0003452912365","DULSE FLAKES,OG","6.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.72","1","0","4","0","0","0","3105" +"0003530510102","MARIA AND RICARDO CORN TORT","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.15","1","1","0","0","0","0","14529" +"0003574201067","PSEED GOLDEN ZUKE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3110" +"0003574214022","CRACKER,OG,BRSCHTA,VEG,LF","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1555","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","6","4","0","0","0","3112" +"0003574214047","CRACKER,OG,STND WHEAT,LF","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1555","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","6","4","0","0","0","3115" +"0003574222111","BROTH,CHICKEN,NO SALT","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.56","1","0","0","0","0","0","15239" +"0003574222911","SOUP,OG,CREAM MUSHROOM","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.88","1","6","4","0","0","0","3118" +"0003574222913","SOUP,OG,CREAM CELERY","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.88","1","6","4","0","0","0","3120" +"0003588300103","PB DOG BISC,MR. PUGSLEY 26 OZ","6.69","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.23","1","1","4","0","0","0","3123" +"0003588300501","CAT,FISH/CHICKEN/LIVER 5.5 OZ","1.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.91","1","1","4","0","0","0","3126" +"0003588300504","CAT,CHICKEN & WHEAT GERM 14 OZ","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.5","1","1","4","0","0","0","3129" +"0003588300508","CAT,SAVORY SEAFOOD DINNER 14 O","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.5","1","1","4","0","0","0","3131" +"0003588301607","HERBAL COLLAR FOR DOGS","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.96","1","0","0","0","0","0","16498" +"0003588305007","CAT,SAVORY SEAFOOD DINNER 3.OZ","1.25","0","0","0","0.89","0","0.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.72","1","1","4","0","0","0","3136" +"0003588305015","CAT,CHIX STEW DINNER,LITE 3 OZ","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.72","1","0","4","0","0","0","3138" +"0003619212210","APPLESAUCE,OG CUPS","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.79","1","1","4","0","0","0","3140" +"0003619212215","100% LEMON JUICE,OG","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.86","1","0","4","0","0","0","3142" +"0003619212218","SAUCE,OG,APPLE PEACH CUPS","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.79","1","1","0","0","0","0","14394" +"0003619212221","JUICE,OG,CONCORD GRAPE","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.86","1","1","4","0","0","0","3145" +"0003619212225","LEMONADE,OG,MANGO","3.15","0","0","0","1.59","0","1.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.81","1","1","4","0","0","0","3147" +"0003619212241","JUICE,OG,APPLE,QUART","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.84","1","0","4","0","0","0","3149" +"0003619212246","LEMONADE,OG,STRAWBERRY","3.15","0","0","0","1.59","0","1.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.81","1","1","4","0","0","0","3151" +"0003619212259","NECTAR,OG,PEAR","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.72","1","1","4","0","0","0","3153" +"0003619212289","JUICE,OG,WHITE GRAPE","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.72","1","1","4","0","0","0","3154" +"0003619212294","APPLESAUCE,OG,APRICOT","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1546","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.62","1","1","4","0","0","0","3158" +"0003637402005","CHIPOTLE MEXICAN HOT SAUCE","6.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","3162" +"0003651514600","PCLEMENTINE BAG","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1311","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15247" +"0003680014522","PCARROT 2# BAG","2.29","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","","0","1","0","0","512","0000-00-00 00:00:00","1","0","1","1","LB","0","0","0","0","1","3","0","0","0","0","16217" +"0003692303420","ECCO BELLA SCALP THERAPY","13.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.63","1","0","0","0","0","0","14186" +"0003701424221","CHOC BAR,MLK/CHERRY,DOLPH","3.19","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1512","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.82","1","1","4","0","0","0","3165" +"0003701424225","CHOC BAR,DRK/HZLNT,RHINO","3.19","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1512","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.82","1","1","4","0","0","0","3167" +"0003701424228","CHOC BR,DRK/RSP,GRZLY","3.19","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1512","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","1.82","1","1","0","0","0","0","16178" +"0003701424231","CHOC BAR,MLK/SMOTH,OTTER","3.19","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1512","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.82","1","1","4","0","0","0","3170" +"0003701424238","CHOC BAR,DRK/BLUEBY,TURTL","3.19","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1512","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.82","1","1","4","0","0","0","3172" +"0003701425002","BUG BITES,OG,MILK CHOC","0.65","0","0","0","0.49","0","0.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.36","1","1","4","0","0","0","3174" +"0003701425007","CHIMP MINTS BITES","0.65","0","0","0","0.49","0","0.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0.36","1","1","4","0","0","0","3176" +"0003701426302","HOLIDAY TREATS, DARK","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","3180" +"0003701426502","EASTER BITES DARK CHOC","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","3182" +"0003727938697","GRAPE LEAVES","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.67","1","0","4","0","0","0","3187" +"0003784207650","PEGGROLL SKINS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1141","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3188" +"0003798300016","VEGAN RELLA MOZZARELLA","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.09","1","0","3","0","0","0","3190" +"0003823213936","PBRUSSELS SPROUTS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","0","0","693","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3192" +"0003823244460","pjuice orange 8oz","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1419","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13593" +"0003823283556","PPINEAPPLE CHUNKS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1335","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3194" +"0003823283600","M","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","3196" +"0003823283654","pPOMEGRANATE SEEDS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","814","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13272" +"0003826185766","HORSERADISH,PREPARED","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.61","1","1","2","0","0","0","3199" +"0003855001104","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3201" +"0003879434777","BURRITO,OG LF BN,RICE&CH","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.67","1","0","2","0","0","0","3203" +"0003903900095","PTNGERINE BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","569","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3209" +"0003905900088","SOFT CANOLEO MARGARINE","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.28","1","0","2","0","0","0","3211" +"0003915301007","OLIVE OIL,EX VIRGIN 8.5OZ COLV","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.35","1","6","4","0","0","0","3213" +"0003915341355","GLACE, BALSAMIC","8.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.77","1","6","4","0","0","0","3214" +"0003927822010","EXTRA STRENGTH","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.9","1","1","5","0","0","0","3216" +"0003927832200","TIGER BALM PATCHES","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.36","1","1","5","0","0","0","3218" +"0003949600108","PURPLE HAZE CYPRESS GROVE","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","3220" +"0003997800108","CEREAL,8 GRAIN,WHEATLESS","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.47","1","0","4","0","0","0","3223" +"0003997800116","HOT CEREAL,GLUTEN FREE 24 OZ","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.43","1","1","4","0","0","0","3225" +"0003997800332","FLOUR,GARBANZO BEAN","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","0","4","0","0","0","3228" +"0003997800373","STEEL CUT OATS, GLUTEN FREE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","163","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.54","1","1","4","0","0","0","3230" +"0003997800376","OATS,GF,QUICK COOKING","7.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","163","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.25","1","1","0","0","0","0","14631" +"0003997800452","FLOUR,BAKING,GLUTEN FREE","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.66","1","6","4","0","0","0","3233" +"0003997800461","CORNBREAD MIX,GF","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.09","1","6","0","0","0","0","13380" +"0003997800525","POTATO STARCH","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.72","1","0","4","0","0","0","3237" +"0003997800642","FLOUR,SORGHUM,G/F","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.38","1","0","4","0","0","0","3239" +"0003997800882","PANCAKE/WAFFLE,OG,7 GRAI","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.77","1","1","4","0","0","0","3241" +"0003997800937","FLAXSEED MEAL,OG","4.75","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","163","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.72","1","1","4","0","0","0","3243" +"0003997801121","SCOTTISH OATMEAL","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","163","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.98","1","1","4","0","0","0","3245" +"0003997802993","WHOLE WHEAT PASTRY FLOUR","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.4","1","1","0","0","0","0","16294" +"0003997850103","MUESLI 18 OZ","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.75","1","1","4","0","0","0","3251" +"0003997853301","FLOUR UN-BLEACHED WHITE 5#","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.25","1","1","4","0","0","0","3253" +"0004044743475","FERNDALE GROUND TURKEY","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14343" +"0004115250006","CRANBERRY SAUCE,OG, WHOLE","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","1","4","0","0","0","3256" +"0004122424520","SMOKED OYSTERS","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14084" +"0004124400009","APPLE JUICE 10OZ","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.94","1","1","4","0","0","0","3262" +"0004124441282","JUICE, APPLE GALLON MART","13.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.5","1","6","4","0","0","0","3264" +"0004140900005","PJUICE LEMON SHOT NON-O","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","755","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13980" +"0004150706580","SLIPPERY ELM REG LOZ 24","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.56","1","0","5","0","0","0","3267" +"0004150706600","SLIP ELM ROSEHIPS/C TANG","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.56","1","0","5","0","0","0","3269" +"0004150707005","WITCH HAZEL,TONER,ALCH FR","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.9","1","1","5","0","0","0","3271" +"0004150880060","SPARKLING,ARANCIATA, SINGLE ","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","4","0","0","0","3273" +"0004150880070","SPARKLING,ARANCIATA","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.6","1","6","4","0","0","0","3275" +"0004157004426","THIN CRACKERS,ALMOND NUT","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1565","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.77","1","3","4","0","0","0","3277" +"0004157004428","THIN CRACKERS,PECAN NUT","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1565","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.77","1","3","4","0","0","0","3279" +"0004157005244","ALMOND BREEZE,ORIGINAL","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.01","1","1","0","0","0","0","13806" +"0004157005404","THIN CRACKERS, CNTRY RANCH","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1565","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.77","1","3","4","0","0","0","3282" +"0004157005416","ALMOND BREEZE VAN UNSWTD","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","b1852","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.59","1","1","4","0","0","0","3284" +"0004157005618","ALMOND BREEZE UNSWTD","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.57","1","6","0","0","0","0","14454" +"0004157005625","ALMOND BREEZE CHOC 64OZ","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.57","1","6","2","0","0","0","3287" +"0004157006836","ALMOND BREEZE,VANILLA","2.79","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","1559","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.59","1","3","4","0","0","0","3289" +"0004160422302","FERN ECYCLE TUMBLER 16OZ.","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15686" +"0004160422308","ECYCLE TUMBLER 16OZ","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15127" +"0004161700225","BAKING PWDR (NO ALUMINUM)","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.84","1","0","4","0","0","0","3291" +"0004164807800","BTM,SOY ORIGINAL","14.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.05","1","0","4","0","0","0","3293" +"0004165301207","CEREAL,OG,COCO CRSP BRN","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.8","1","6","4","0","0","0","3296" +"0004175700108","BABY BEL MINI","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","3304" +"0004195400005","ZAND ORG CRAN RASP LOZ","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.27","1","0","5","0","0","0","3307" +"0004195400007","HERBALOZENG,OG,LEMN HONEY","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.27","1","0","5","0","0","0","3309" +"0004195400009","HERBALOZENGE,ELDBRY ZINC","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.18","1","0","5","0","0","0","3311" +"0004195400011","HERBALOZENGE,MENTHOL","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.18","1","0","5","0","0","0","3313" +"0004195400013","HRBLOZ LEM-ZINC S#978262","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.18","1","0","5","0","0","0","3315" +"0004195400021","HERBALOZENGE,MENTHOL,DSP","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","5","0","0","0","3317" +"0004195400023","HERBALOZENGE,LMN ZINC,DSP","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","5","0","0","0","3319" +"0004195400025","HERBALOZENGE,ELD ZINC,DSP","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","5","0","0","0","3321" +"0004195401067","THROAT SPRAY","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.74","1","0","5","0","0","0","3324" +"0004195402083","CLEANSING LAXATIVE","10.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.71","1","0","5","0","0","0","3326" +"0004195498848","ZAND QUICK DIGEST 15CT","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.23","1","0","0","0","0","0","15540" +"0004217519850","SODA,CHERRY VANILLA CREME","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","2503","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.56","1","3","4","0","0","0","3329" +"0004217519865","SODA,NATURAL COLA","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","2503","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","3","4","0","0","0","3331" +"0004217519875","SODA,RASPBERRY","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","2503","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","3","4","0","0","0","3333" +"0004217519885","SODA, NATURAL GRAPE","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","2503","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.56","1","1","4","0","0","0","3335" +"0004217519895","SODA,BLACK CHERRY","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","2503","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","1","4","0","0","0","3337" +"0004227200014","BURGER,OG,TEXAS VEG,LF","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.48","1","1","0","0","0","0","3345" +"0004227200020","POT PIE,OG,VEGETABLE","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.14","1","1","0","0","0","0","3347" +"0004227200023","POT PIE,OG,SHEPARDS","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.14","1","1","0","0","0","0","3350" +"0004227200030","MACARONI & CHEESE,OG","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.93","1","1","2","0","0","0","3352" +"0004227200041","LASAGNA,GARDEN VEG, OG,G","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.96","1","1","2","0","0","0","3356" +"0004227200045","MACARONI & CHEESE,OG,RICE","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.28","1","1","2","0","0","0","3357" +"0004227200054","BREAKFAST,TOFU SCRAMBLE","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.96","1","1","2","0","0","0","3360" +"0004227200070","BURRITO,OG,BEANS&RICE","2.65","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.64","1","1","0","0","0","0","3365" +"0004227200072","BURRITO,OG,BREAKFAST","2.65","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.64","1","1","0","0","0","0","3367" +"0004227200074","BURRITO,OG,ESPECIAL","2.65","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.64","1","1","0","0","0","0","3369" +"0004227200076","BURRITO,SOUTHWESTERN","2.65","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.64","1","1","0","0","0","0","3371" +"0004227200081","ENCHILADA,OG,BLACK BN VEG","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.59","1","1","2","0","0","0","3373" +"0004227200095","PCKT SAND,OG,VEG POT PIE","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.64","1","1","0","0","0","0","3375" +"0004227200101","PIZZA,OG,CHEESE","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.25","1","1","0","0","0","0","3377" +"0004227200103","PIZZA,OG,RSTD VEG,W/O CHS","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.03","1","1","0","0","0","0","3379" +"0004227200105","PIZZA,OG,SOY CHEESE","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.03","1","1","0","0","0","0","3381" +"0004227200121","SNACKS,OG,CHEESE PIZZA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.5","1","1","0","0","0","0","3384" +"0004227200129","AMYS PIZZA WHITE SC BROC","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.25","1","1","0","0","0","0","14173" +"0004227200163","BOWL,OG,MEXICAN CASSEROL","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.96","1","3","2","0","0","0","3390" +"0004227200165","RAVIOLI,OG,CHESE W/SC BW","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.96","1","3","2","0","0","0","3392" +"0004227200176","BOWL,OG,PESTO TORTELLINI","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","3","2","0","0","0","3394" +"0004227200191","AMYS THREE CHEESE PIZZA","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.03","1","1","0","0","0","0","3397" +"0004227200199","AMYS MARGHERITA PIZZA","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.03","1","3","0","0","0","0","3404" +"0004227200260","SAMOSA WRAP,OG","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.76","1","1","2","0","0","0","3408" +"0004227200278","TAMALE VERDE,OG,CHEESE","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.18","1","1","2","0","0","0","3410" +"0004227200352","AMYS GF ND BEAN RICE BRRTO","2.99","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","1.87","1","1","0","0","0","0","15258" +"0004227200373","VEGGIE BURGER, SONOMA, GF/DF","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.01","1","3","0","0","0","0","15815" +"0004227200401","SALSA,OG,MILD","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1506","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.51","1","1","4","0","0","0","3412" +"0004227200502","SOUP,OG,LENTIL","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","4","0","0","0","3414" +"0004227200504","SOUP,OG,BLACK BEAN,LF","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.04","1","1","4","0","0","0","3416" +"0004227200507","SOUP,OG,MINESTRONE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","3","4","0","0","0","3418" +"0004227200511","CHILI,OG,MEDIUM,W/VEGGIES","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1502","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.05","1","1","4","0","0","0","3420" +"0004227200513","SOUP THAI COCONUT","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.23","1","1","4","0","0","0","3422" +"0004227200530","CHILI,OG,MEDIUM,BLK BEAN 14.7","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1502","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.05","1","1","4","0","0","0","3425" +"0004227200536","SOUP,OG,CHUNKY TOMATO BSQ","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.04","1","1","4","0","0","0","3427" +"0004227200550","BEANS,OG,REFRIED","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1501","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","3","4","0","0","0","3429" +"0004227200552","BEANS,OG,REFRIED,W/GR CHL","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1501","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","1","4","0","0","0","3431" +"0004227200561","SOUP,OG,CURRIED LENTIL","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.04","1","3","4","0","0","0","3433" +"0004227200564","SOUP,OG,SPNSH RCE&RD BEA","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.05","1","3","0","0","0","0","13701" +"0004227200581","SOUP,OG,L/S,CRM OF TOMATO 14.5","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","4","0","0","0","3436" +"0004227200586","SOUP, L/S TOMATO BISQUE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","1515","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.04","1","1","4","0","0","0","3438" +"0004240004913","CEREAL HNY&NUT TOASTY O","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b1824","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.19","1","1","4","0","0","0","3440" +"0004240006431","CEREAL, OATS HONEY BLEND","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b1824","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","1","4","0","0","0","3441" +"0004256300220","FISH FILLET,WW BREADING","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.93","1","1","0","0","0","0","3444" +"0004256300300","PREM ALSKN PNK SALMON,SLT","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.15","1","1","4","0","0","0","3446" +"0004256300605","TUNA,YELLOWFIN,CHNK LT,NS","2.65","0","0","0","1.5","0","1.5","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.5","1","1","4","0","0","0","3448" +"0004256300712","CHOPPED CLAMS","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.88","1","1","4","0","0","0","3449" +"0004256300763","FRZ,OG,MANGOS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","1","2","0","0","0","3451" +"0004256300775","TUNA, WHITE ALBACORE,SALTD","3.35","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.88","1","1","4","0","0","0","3452" +"0004256300781","TUNA,CHK LGT TONGOL,N/S","2.85","0","0","0","1.79","0","1.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.61","1","1","4","0","0","0","3454" +"0004256300788","WOODSTOCK TROPICAL BLEND","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.36","1","1","2","0","0","0","3456" +"0004256301363","RELISH,OG,SWEET","5.75","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","3.23","1","1","0","0","0","0","14132" +"0004256301366","PICKLES,OG,WHL,KOSHR DIL","5.69","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","3.23","1","1","0","0","0","0","14510" +"0004256360000","BEANS,OG,BLACK","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.02","1","0","0","0","0","0","14909" +"0004256360002","BEANS,OG,KIDNEY","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.02","1","0","0","0","0","0","14911" +"0004256360006","PASTA,OG,FARFALLE BOW","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.61","1","0","0","0","0","0","14922" +"0004256360010","PASTA,OG,TRAD FUSILLI","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.4","1","3","0","0","0","0","14924" +"0004256360021","CRACKERS,OG,WATER","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.78","1","0","0","0","0","0","14916" +"0004256360033","SAUCE,OG,ITALIAN HERB","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.15","1","0","0","0","0","0","14926" +"0004256360035","SAUCE,OG,MARINARA","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.15","1","0","0","0","0","0","14927" +"0004256360046","BATH TISSUE 12PK FIELDY","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","5.93","1","0","0","0","0","0","14930" +"0004256360086","SALSA,OG,MEDIUM","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.1","1","0","0","0","0","0","14919" +"0004256360089","CORN,OG,WHOLE KERNEL","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.02","1","0","0","0","0","0","14915" +"0004256360109","VINEGAR,OG,APPLE CIDE","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.42","1","0","0","0","0","0","14918" +"0004256360111","BEANS,OG,VEG BLACK RE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.97","1","0","0","0","0","0","14913" +"0004256360174","BEANS,OG,GREEN,CUT","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.02","1","0","0","0","0","0","15932" +"0004260812521","JUICE.OG,POMEGRNT W/BLBRY","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.51","1","0","4","0","0","0","3460" +"0004260845905","JUICE,OG,PURE PINEAPPLE 32 OZ","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.35","1","1","4","0","0","0","3463" +"0004260845975","JUICE,OG,PURE PINK GRPFRT 32 O","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.69","1","0","4","0","0","0","3465" +"0004260845978","JUICE OG BLUEBERRY LKWD","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.02","1","1","0","0","0","0","15429" +"0004260846002","LEMONADE OG CRANBERRY","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.15","1","1","4","0","0","0","3468" +"0004260847006","JUICE,OG2,COCONUT","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.02","1","0","0","0","0","0","16555" +"0004260847021","JUICE, OG, POMEGRNT W/ BLB 32Z","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.69","1","1","4","0","0","0","3471" +"0004265800510","PEGGROLL SKINS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1141","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3475" +"0004312607200","PPINEAPPLE NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","","0","1","0","0","557","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","13961" +"0004318200091","MISO CUP,OG, RDCD SODIUM","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.18","1","6","4","0","0","0","3479" +"0004318200208","COCONUT MILK,OG","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.47","1","1","4","0","0","0","3481" +"0004318200352","ICE CREAM CONES,GF","3.85","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","186","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.18","1","1","4","0","0","0","3483" +"0004318200357","ICE CREAM SUGAR CONES, OG","4.15","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","186","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.34","1","1","4","0","0","0","3485" +"0004318200833","BAMBOO SHOOTS,OG2,SLICED","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.47","1","0","0","0","0","0","16297" +"0004318200852","PINEAPPLE,OG,SLICES","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.18","1","1","4","0","0","0","3488" +"0004318200857","TROPICAL FRT SALAD OG","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.18","1","1","4","0","0","0","3490" +"0004318200859","PEACHES,OG,SLICED","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.18","1","1","4","0","0","0","12804" +"0004318200871","MUSHROOMS,OG,PIECES&STEM","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.09","1","1","0","0","0","0","14210" +"0004318200890","HEARTS OF PALM ORGANIC","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.73","1","0","0","0","0","0","15328" +"0004318200894","ARTICHOKE HEARTS,MARINATE","3.19","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.8","1","1","4","0","0","0","3495" +"0004319220104","KEFIR OG LF PEACH NANCY","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.7","1","6","0","0","0","0","15009" +"0004319220106","KEFIR OG LF STRW NANCY","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.7","1","6","0","0","0","0","15012" +"0004319231550","NANCYS COTTAGE CHEESE","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.81","1","1","2","0","0","0","3496" +"0004322210020","PHERB BABY DILL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","909","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","3","6","0","0","0","3498" +"0004322210050","PHERB OREGANO","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","924","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3500" +"0004322210070","PHERB TARRAGON","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","937","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3502" +"0004322210100","PHERB SAGE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","931","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3504" +"0004322210150","PHERB POULTRY MIX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","929","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3506" +"0004345410030","FF SMART DELI SLC,BOLOGNA","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.84","1","1","2","0","0","0","3512" +"0004345410065","LIGHTLIFE CHORIZO SAUSAGE","4.99","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","3.01","1","6","2","0","0","0","3514" +"0004345410080","SMART DOG,FAT FREE","4.25","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.51","1","1","2","0","0","0","3516" +"0004345440010","GIMME LEAN,SAUSAGE STYLE","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.63","1","1","2","0","0","0","3518" +"0004378615730","WASP AND HORNET KILLER","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16447" +"0004379212345","PONION SETS YELLOW","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1399","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16161" +"0004408253031","SUNFLOWER BUTTER,OG,SMOOTH","6.99","0","0","0","5.29","0","5.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","4","1","1","4","0","0","0","3520" +"0004432530200","PMUSHROOM PORTABELLA PKG","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","649","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","3522" +"0004525511449","EGG ROLL WRAPS","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","1","0","1141","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","3524" +"0004525511977","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","3526" +"0004525512164","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3527" +"0004529608131","LISANATTI SHREDDED SOY CHEDDAR","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","1","3","0","0","0","3529" +"0004529619101","LISANATTI ALMOND CHEDDAR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","0","3","0","0","0","3531" +"0004529619104","ALMOND CHEESE P JACK","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","0","3","0","0","0","3533" +"0004529619992","LISANATTI RICE CHS MOZZARELLA","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","3535" +"0004529619994","RICE CHEESE CHEDDAR LISANATTI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","0","3","0","0","0","3537" +"0004529619996","LISANATTI RICE P JACK","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","3539" +"0004635200100","YERBA PRIMA WOMENS CLEANSE","33.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","14.74","1","1","5","0","0","0","3543" +"0004635200199","YP DAILY FIBER CAPS 180CT","14.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.37","1","1","5","0","0","0","3545" +"0004695801640","QUANTUM ELDERBERRY SYRUP","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15062" +"0004698500110","QH SUPERLYSINE 90CT","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.91","1","1","5","0","0","0","3549" +"0004698501619","QUANTUM COLD & FLU 30CT","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.4","1","0","0","0","0","0","15068" +"0004698501625","QH ELDERBERRY 2OZ","16.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.37","1","0","5","0","0","0","3553" +"0004698501640","QUANTUM ELDERBERRY SYRUP 4OZ","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.88","1","0","0","0","0","0","15080" +"0004698501705","QUANTUM THERAZINC SPRAY","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.4","1","0","0","0","0","0","15063" +"0004698501810","QUANTUM EXTREME 4OZ SPRAY","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.91","1","3","0","0","0","0","14278" +"0004728523456","PONION PEARL","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","629","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3561" +"0004728523469","PONION PEARL","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","629","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3563" +"0004744591911","TEA,OG,OOLONG 16 CT","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3565" +"0004744591921","TEA,OG,GRN JAPANESE PREM 16 CT","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3567" +"0004744591923","TEA,OG,GRN JASMINE","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3569" +"0004744591943","TEA,OG,ROOIBOS RED BUSH","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3571" +"0004744591961","TEA,OG,PEPPERMINT HERB","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1584","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3572" +"0004744591971","TEA,OG,EARL GREY","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1584","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3574" +"0004744591992","TEA,OG,BREAKFAST,IRISH 16 CT","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1584","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","6","4","0","0","0","3576" +"0004744598203","TEA,OG,LIQUORICE PEPPRMNT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.15","1","6","4","0","0","0","3578" +"0004840401895","PSEEDS THAI LETTUCE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3581" +"0004848100970","TURKEY JERKY,ORIGINAL","1.69","0","0","0","1.19","0","1.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","0.95","1","1","0","0","0","0","15279" +"0004848100983","TURKEY ITALIAN SAUSAGE","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.36","1","1","8","0","0","0","3586" +"0004848100991","TURKEY FRANKS","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.24","1","6","8","0","0","0","3588" +"0004848101111","CHILI,CHICKEN,MILD,W/BEAN","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.21","1","1","4","0","0","0","3591" +"0004848135401","CHICKEN BREAST,CANNED","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2","1","1","0","0","0","0","13813" +"0004868720206","PNUT PEANUT RS SHELL 1#","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1080","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3600" +"0004875390125","PBAPPLE BAG GRANNY SMITH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3602" +"0004934708008","SMILE BUNNIES CHILDS 1ST BRUSH","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.23","1","0","5","0","0","0","3606" +"0004934708010","THBRSH,V-WAVE REPLC,NYL","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.22","1","0","5","0","0","0","3608" +"0004950220000","PHILS EX LARGE EGGS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.5","1","0","0","0","0","0","3614" +"0004950800505","PRETZL CRSP,SUPREME","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.89","1","1","0","0","0","0","15785" +"0004956802016","VEGENAISE, GRAPESEED 16OZ","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16618" +"0004956850010","VEGAN GOURMET MONTEREY JACK","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.69","1","1","3","0","0","0","3618" +"0004956853010","VEGAN GOURMET CHEDDAR","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.69","1","1","3","0","0","0","3620" +"0004973309101","CHOLULA HOT SAUCE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.89","1","6","0","0","0","0","13471" +"0005138188257","AURA CACIA KIDS BODY WASH","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.39","1","3","0","0","0","0","15067" +"0005138188259","AURA CACIA KIDS BUBBLE BATH","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.39","1","3","0","0","0","0","15065" +"0005138188261","AURA CACIA BBATH TRANQUILITY","8.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.41","1","1","5","0","0","0","3626" +"0005138188263","AURA CACIA BBATH HEART SONG","8.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.41","1","1","5","0","0","0","3628" +"0005138188515","MINERAL BATH,SOOTHNG HEA","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.62","1","1","5","0","0","0","3630" +"0005138188519","MINERAL BATH,TRANQUILITY","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.62","1","1","5","0","0","0","3632" +"0005138188596","AURA CACIA KIDS FOAM BATH CALM","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.62","1","1","5","0","0","0","3634" +"0005138188616","MINERAL BATH,LVND HARVES","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.62","1","1","5","0","0","0","3636" +"0005138188723","AURA CACIA ELECTRIC LAV FRESHN","14.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.37","1","2","5","0","0","0","12925" +"0005138188743","AURA CACIA LAV REFILL","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.43","1","2","5","0","0","0","12927" +"0005138190311","AURA CACIA MILKOAT BATH CHAM","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.62","1","0","0","0","0","0","16322" +"0005138190608","OIL,OG,JOJOBA","15.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.12","1","1","5","0","0","0","3638" +"0005138190804","AURA CACIA ORG TEA TREE","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.92","1","6","0","0","0","0","14715" +"0005138191108","ESSENTIAL OIL,CEDARWOOD","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.95","1","6","5","0","0","0","3642" +"0005138191111","ESSENTIAL OIL,CINN LEAF","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.23","1","6","5","0","0","0","3644" +"0005138191113","ESSENTIAL OIL,CLARY SAGE","12.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.58","1","6","5","0","0","0","3646" +"0005138191115","ESSENTIAL OIL,CYPRESS","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.41","1","6","5","0","0","0","3648" +"0005138191119","ESSENTIAL OIL,FRANKINCNSE","26.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","13.96","1","6","5","0","0","0","3650" +"0005138191121","ESSENTIAL OIL,GINGER","13.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.95","1","6","5","0","0","0","3652" +"0005138191123","ESSENTIAL OIL,LAVENDER","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.6","1","6","5","0","0","0","3654" +"0005138191125","ESSENTIAL OIL,LEMONGRASS","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.14","1","6","0","0","0","0","3656" +"0005138191128","ESSENTIAL OIL,MYRRH","21.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","11.07","1","6","5","0","0","0","3658" +"0005138191130","ESSENTIAL OIL,PATCHOULI","18.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.7","1","6","5","0","0","0","3660" +"0005138191133","ESSENTIAL OIL,ROSEMARY","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3","1","6","5","0","0","0","3662" +"0005138191135","ESSENTIAL OIL,SAGE","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.91","1","6","5","0","0","0","3664" +"0005138191137","ESSENTIAL OIL,SPEARMINT","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.03","1","6","5","0","0","0","3666" +"0005138191139","ESSENTIAL OIL,TEA TREE","7.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","4.08","1","6","0","0","0","0","3668" +"0005138191142","ESSENTIAL OIL,WINTERGREEN","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.26","1","6","5","0","0","0","3670" +"0005138191159","ESSENTIAL OIL,GRAPEFRUIT","9.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.84","1","6","5","0","0","0","3672" +"0005138191171","OIL,GRAPESEED","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.46","1","1","5","0","0","0","3674" +"0005138191183","AURA CACIA EUC 2 OZ.","17.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.85","1","6","5","0","0","0","3676" +"0005138191189","AURA CACIA PEPPERMINT 2 OZ","23.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.31","1","6","5","0","0","0","12951" +"0005138191198","VEG MASSAGE OIL,SESAME","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.46","1","1","5","0","0","0","3677" +"0005138191278","Aura Cacia Bergamot","14.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.69","1","0","0","0","0","0","13176" +"0005138191304","AURA CACIA ROOM DIFFUSER","14.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.37","1","1","5","0","0","0","12933" +"0005138191314","AURA CACIA CAR DIFFUSER","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.4","1","1","5","0","0","0","12937" +"0005138191332","AURA CACIA TEAL CANDLE LAMP","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.38","1","1","5","0","0","0","12936" +"0005152800104","DAnjou Pear Vinegar","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14364" +"0005165109221","PEANUT BTR, CREAMY, NO STIR","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","4","0","0","0","3682" +"0005165109232","PEANUT BTR,OG,CREAMY,SLT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.06","1","1","4","0","0","0","3684" +"0005165109235","PEANUT BUTTER OG CRMYNOSTIR","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.66","1","1","4","0","0","0","3686" +"0005165109250","ALMOND BTR,RAW,NS","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.23","1","0","0","0","0","0","15352" +"0005165109362","SPREAD,DK CHOC PEANUT","7.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.29","1","6","0","0","0","0","13036" +"0005197204100","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","3689" +"0005214601001","LINGON BERRIES","8.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.91","1","0","0","0","0","0","13434" +"0005215900002","YOGURT,OG,WM,FR VAN 32Z","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.74","1","1","2","0","0","0","3692" +"0005215900007","YOGURT,FF, FR VAN 32Z","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.74","1","1","2","0","0","0","3694" +"0005215900013","YOGURT,OG,STRWBRY,LF,KIDS","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.74","1","1","2","0","0","0","3696" +"0005215900202","FRZN YGRT,OG,NF,DK CHOCO","3.99","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.25","1","6","2","0","0","0","3705" +"0005215900215","STNYFLD JAVALANCHE FRZN YGRT","3.99","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","2.25","1","6","2","0","0","0","3708" +"0005215900466","YOGURT,OG,WM,CHC TRUFFLE","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0.7","1","3","0","0","0","0","3711" +"0005215900520","YOGURT,OG,LF,VANILLA 32Z","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.74","1","1","2","0","0","0","3713" +"0005215901301","SMOOTHIE,OG,RASPBERRY","2.19","0","0","0","1.59","0","1.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","","0","0","0","1.27","1","1","0","0","0","0","3714" +"0005215901303","SMOOTHIE,OG, STRW BANANA","2.19","0","0","0","1.59","0","1.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","","0","0","0","1.27","1","1","0","0","0","0","3716" +"0005215902100","I CREAM,OG,VANILLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.25","1","6","2","0","0","0","3719" +"0005215902102","I CREAM,OG,JAVALANCHE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.25","1","6","2","0","0","0","3721" +"0005215904000","YOGURT,OG,LF,PLAIN 6OZ","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.7","1","3","2","0","0","0","3724" +"0005215904005","YOGURT,OG,LF,RASPBERRY","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.7","1","3","2","0","0","0","3727" +"0005215904011","STONY SEASONAL YOGURT 6OZ","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.7","1","3","0","0","0","0","13992" +"0005215909004","YGRT,OG,STWBY-VAN&RSP,SGR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.42","1","1","2","0","0","0","3731" +"0005215954032","STONY LF YGRT STRW POM 6OZ","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.7","1","3","2","0","0","0","3736" +"0005260304100","BROTH,OG,MUSHROOM","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1595","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.29","1","1","4","0","0","0","3742" +"0005260304180","SOUP, OG, CRMY BTRNUT SQSH","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1563","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.55","1","1","4","0","0","0","3744" +"0005260304255","SOUP,CREAMY CSHW CRT GNG","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1563","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.42","1","1","4","0","0","0","3746" +"0005260305410","BROTH,OG,VEGETABLE 32Z","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1595","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.29","1","1","4","0","0","0","3752" +"0005260305429","BROTH,OG,CHICKEN 4PK","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.48","1","0","4","0","0","0","3755" +"0005260305445","BROTH,OG, CHICKEN, L SODIUM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1595","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","3","4","0","0","0","3756" +"0005260305461","SOUP,PBLANO PPR&CRN CHWD","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.9","1","1","0","0","0","0","15101" +"0005260305464","SOUP,VEG LNTL&RSTD RD PP","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.9","1","1","0","0","0","0","15500" +"0005260305466","SOUP,RSTD GRLC MSHRM LNT","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.9","1","1","0","0","0","0","15102" +"0005260305468","CNDSND SOUP,OG,CRM MSHRM","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.65","1","1","0","0","0","0","14860" +"0005260306503","ALMOND BEV,OG,UNSWT ORIG","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.84","1","1","4","0","0","0","3758" +"0005265100005","WITCH HAZEL LIQUID","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.13","1","0","5","0","0","0","3760" +"0005270000000","PHORSERADISH ROOT non-o","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","940","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3762" +"0005322866477","PPOTATO BAG YELL FIN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","516","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","3765" +"0005342300006","BREAD,OG,YF,DF,SUMMER RND","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.53","1","1","2","0","1","0","3775" +"0005342305718","FRNCH MDW HLTHSD SPLT","7.59","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","16628" +"0005342311631","FRENCH MEADOW CHICKEN GINGER","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.73","1","6","0","0","0","0","13691" +"0005342311635","FRENCH MEADOW DAL MAKHANI","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.73","1","6","0","0","0","0","13692" +"0005357121312","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3781" +"0005379610296","S.S COMPOST PAIL","42.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13468" +"0005385200200","SALSA,HOT","4.69","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1535","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.66","1","1","4","0","0","0","3783" +"0005385200400","SALSA,MEDIUM","4.69","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1535","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.66","1","1","4","0","0","0","3785" +"0005385204742","PRADISH BAG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","1000","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","3787" +"0005410722101","pmandarin bagged non-o","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1431","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14261" +"0005431900001","YOGURT,OG,PLAIN","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.57","1","0","2","0","0","0","3790" +"0005431900003","YOGURT,OG,MAPLE","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.5","1","0","2","0","0","0","3792" +"0005485210008","BARBELL HONEY 8OZ","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15098" +"0005485210700","RAW HONEY 1# BAR BELL","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15096" +"0005498600251","EARTH SCIENCE HERBAL DEOD","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.42","1","6","5","0","0","0","3795" +"0005498600290","ESCI HAND CREAM 2OZ","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.4","1","6","0","0","0","0","16333" +"0005498617430","CITRESS SHAMPOO","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","6","5","0","0","0","3799" +"0005498627400","EARTH SCI GALLON SHAMPOO","38.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3802" +"0005589116255","PPOTATO BAG YELLOW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","516","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","3805" +"0005669864536","MOTHERING MAG","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","3807" +"0005669887105","SUN MAGAZINE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16240" +"0005833617502","CAKE MIX,OG,CHOCOLATE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","1558","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","6","4","0","0","0","3811" +"0005833617510","BROWNIE MIX,OG,CHOCOLATE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","1558","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","6","4","0","0","0","3813" +"0005833617551","ICING MIX,OG,CHOCOLATE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","1558","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","6","4","0","0","0","3815" +"0005833617603","PUDDING MIX VANILLA DR OETKER","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.91","1","6","4","0","0","0","3817" +"0005844941001","TSTR PASTRY,OG,FR, BLUE","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.22","1","1","4","0","0","0","3819" +"0005844941008","TSTR PASTRY OG UN-FR STBY","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.22","1","1","4","0","0","0","3821" +"0005844941015","TOASTER PASTRY CHERRY POM","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.22","1","1","4","0","0","0","3823" +"0005844943001","CRISPY BAR,OG,PANDA P BTR","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","1","4","0","0","0","3825" +"0005844959056","FLAX PLUSWAFFLES","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.12","1","1","0","0","0","0","3827" +"0005844960057","CEREAL,OG,CORN FLAKES,FJS","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.82","1","1","4","0","0","0","3830" +"0005844962003","CEREAL,OG,PUFFED CORN","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.29","1","0","4","0","0","0","3832" +"0005844977008","CRL,OG,MILLET RICE FLAKE","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1519","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.78","1","1","4","0","0","0","3834" +"0005844977050","CEREAL,OG,FLAX PLUS","4.65","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.82","1","1","4","0","0","0","3836" +"0005844977103","CEREAL OG SMARTBRAN","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.93","1","6","4","0","0","0","3838" +"0005844977162","CEREAL,OG,MESA SUN W/RSN","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","5.78","1","3","0","0","0","0","16207" +"0005844977700","CEREAL,OG,OPTIMUM POWER","4.79","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.93","1","3","4","0","0","0","3840" +"0005844986003","KOALA CRISP,OG","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1592","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.82","1","1","4","0","0","0","3843" +"0005844986007","CEREAL,OG,LEAPIN LEMURS","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1592","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.82","1","1","4","0","0","0","3845" +"0005844989000","GRANOLA,OG,HEMP PLUS,WF","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.82","1","1","4","0","0","0","3847" +"0005916550200","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3850" +"0006014621026","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","3852" +"0006038370958","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","3853" +"0006048423101","pberry strawberry pint","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","3855" +"0006082200007","DOG,TOFU","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.6","1","1","2","0","0","0","3856" +"0006082200306","VEGGIE DELI SLICES,TURKEY","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.77","1","1","2","0","0","0","3859" +"0006100140903","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3861" +"0006163000000","One cup coffee filter","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","3864" +"0006199861434","FLORA VEGETAL SILICA 90 CT","20.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3866" +"0006199861958","FLORA SUPER 8 HI-POT PROBIO","23.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","12999" +"0006199861966","FLORA INFANTS PROBIOTIC","19.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","12998" +"0006199867980","FLORA UDOS OIL 369BLEND 8.5 OZ","18.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3870" +"0006366835102","BATH TISSUE, WHITE 4pk","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.44","1","1","4","0","0","0","3875" +"0006366838204","FACIAL TISSUE,WHITE","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.44","1","6","4","0","0","0","3878" +"0006385500118","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3880" +"0006405389998","STICKY TOFFEE PUDDING","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13214" +"0006535705111","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3882" +"0006535711511","PAPPLE BAG GINGERGOL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","555","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3884" +"0006535715111","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3886" +"0006568465432","MEDIT YOG PCH & PASS","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.84","1","6","2","0","0","0","3889" +"0006568465638","MEDIT YOGURT COCONUT","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.84","1","6","0","0","0","0","14171" +"0006621662008","pcranberries","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3892" +"0006642767000","PARISSA WAX STRIPS ASST SENS","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.2","1","1","5","0","0","0","3894" +"0006667662753","WAFFLE COOKIE,OG,MAPLE","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.27","1","0","4","0","0","0","3898" +"0006727500094","CONSERVES,OG,MORELLO CHERRY","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.13","1","1","4","0","0","0","3902" +"0006727500099","PREMIUM SPRD,OG,CNCRD GR","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.13","1","1","0","0","0","0","14385" +"0006727500650","CONSERVES, RASPBERRY 16OZ","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.28","1","1","4","0","0","0","3906" +"0006727500654","PREMIUM SPRD,OG,CNCRD GR","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.62","1","1","0","0","0","0","14386" +"0006777601104","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3910" +"0006783110932","PFILLER UP BOUQUET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3912" +"0006882010210","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","3914" +"0006882606011","TORT CHIPS,OG,YELLOW 21 OZ","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.16","1","6","4","0","0","0","3916" +"0006895801242","NF B12 SUBLINGUAL 90CT","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3918" +"0006895801272","NF FOLIC ACID 400MCG 90CT","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3920" +"0006895801326","NF C 500 CHEW BLUERASPBOY 90CT","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3922" +"0006895801342","VIT C 1000MG.","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","3924" +"0006895801735","NF BROMELAIN 500MG 90CT","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3927" +"0006895801805","DBLE STR ACIDOPHILUS 90 CT","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","3928" +"0006895801847","12 12 PROBIOTIC","23.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","14.5","1","6","5","0","0","0","3930" +"0006895802070","NF COQ10 100MG.","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","3933" +"0006895802098","NF ALPHA-LIPOIC ACID 200MG ","15.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.5","1","0","5","0","0","0","3935" +"0006895802262","NF SALMON OIL ENTERIC COATED","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.5","1","6","5","0","0","0","3937" +"0006895802400","NF REVITALX","28.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","3940" +"0006895802696","NF MSM JOINT FORMULA","31.95","0","0","0","26.99","0","26.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","3942" +"0006895802831","NF TRANQUIL SLEEP","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","13140" +"0006895802927","WHEY FACTORS CHOCOLATE","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","13.5","1","6","5","0","0","0","3945" +"0006895802929","WHEY FACTORS WHEY PROTEIN","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","13.5","1","6","0","0","0","0","13177" +"0006895803100","NF BEE POLLEN 90 CT","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","3947" +"0006895803184","NF ROYAL JELLY 60 CT","16.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3949" +"0006895803510","NF THYROID FORM","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","3951" +"0006895803549","NF OMEGA 3 120CT","24.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","3953" +"0006895804571","NF OREGANO OIL IN OLIVE OIL ","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","12770" +"0006895804640","NF REGULARITY","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.75","1","3","5","0","0","0","3957" +"0006895808002","NATURAL FACTORS SALMON TPACK","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15734" +"0006895809119","NATURAL FACTORS RXOMEGA TPACK","26.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15736" +"0006895809304","VIT C/ECHINAMIDE COMBO PACK","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15357" +"0006895835493","NF Rx Omega ULTRA 150ct","45.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15226" +"0006905459155","PPOTATO FINGERLING BAG BUTTERC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","3962" +"0007003410021","MAYONNAISE","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","4","0","0","0","3964" +"0007027729098","FETA CHEESE, LF, CRUMBLED","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16569" +"0007061700062","CHEESE PUFFS,NATURAL","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1549","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","4","0","0","0","3973" +"0007061700079","CHEESE PUFF BAKES","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1549","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.69","1","1","4","0","0","0","3975" +"0007061700162","SNACKIMALS,VANILLA 7.5 OZ","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.58","1","1","4","0","0","0","3978" +"0007061700164","SNACKIMALS,W/F OATMEAL 7.5 OZ","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.58","1","3","4","0","0","0","3980" +"0007061700605","SHREDDED OATS, CINN CRUNCH","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1583","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.98","1","3","4","0","0","0","3982" +"0007061700623","PUFFINS PEANUT BUTTER CRL","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b2212","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.99","1","1","4","0","0","0","3989" +"0007061700639","CEREAL,PUFFINS,PB & CHOC","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.99","1","1","0","0","0","0","15762" +"0007061710155","FIG BARS,LF,TRADL BLUBRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.9","1","1","4","0","0","0","3995" +"0007061720609","PUFFINS ORIGINAL","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b2212","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.99","1","3","0","0","0","0","14682" +"0007061720612","SHREDDED OATS ORIG","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.99","1","1","0","0","0","0","14621" +"0007061720625","PUFFIN PUFFS FRUIT MEDLEY","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b2212","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.98","1","1","0","0","0","0","14685" +"0007061741252","MULTIGRN CEREAL BAR,BLBRY","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1525","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.38","1","6","4","0","0","0","3998" +"0007061741254","MULTIGRN CEREAL BAR,RSPBY","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1525","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.38","1","6","4","0","0","0","4000" +"0007061741260","CEREAL BARS TRIPLE BERRY ","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1525","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.38","1","6","4","0","0","0","4002" +"0007073400403","HERB TEA,PEPPERMINT","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.09","1","1","4","0","0","0","4004" +"0007073405315","HERB TEA,CRAN APPLE ZINGR","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1531","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.03","1","1","4","0","0","0","4006" +"0007073405319","HERB TEA,BLACK CHERRY","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1531","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.03","1","1","4","0","0","0","4008" +"0007073405323","HERB TEA,CAFFEINE-FREE","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.09","1","1","4","0","0","0","4010" +"0007073405334","HERB TEA,TENSION TAMER","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1531","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.03","1","1","4","0","0","0","4012" +"0007073405368","HERB TEA,GINGERBREAD SPC","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.97","1","3","0","0","0","0","13127" +"0007073405466","CHAI,ORIG,INDIA SPICE","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1531","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.03","1","6","4","0","0","0","4014" +"0007073407015","HERB TEA,MORNING THUNDER","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1531","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.03","1","1","4","0","0","0","4016" +"0007073407036","GREEN TEA,ANTIOXIDANT","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1531","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.03","1","1","4","0","0","0","4017" +"0007073410072","GREEN TEA,CANDY CANE,DCF","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.97","1","1","0","0","0","0","13126" +"0007079503561","SOUP,GF,CHICKEN NOODLE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16637" +"0007079503564","SOUP,GF,CREAM OF MUSHROO","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16638" +"0007084400512","SAUCE,OYSTER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.77","1","6","0","0","0","0","14292" +"0007084400854","CHOPSTICKS","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.9","1","0","0","0","0","0","14295" +"0007085932384","JUICE JR,OG,BERRY MEDLEY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.19","1","0","0","0","0","0","15866" +"0007098935854","Mother Earth Garden series","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14352" +"0007098936050","MAG HERBS FOR HEALTH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4024" +"0007098939201","YOGA JOURNAL SPECIAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16482" +"0007098939205","VEG TIMES SPECIAL MAG","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16242" +"0007099235847","MOTHER EARTH NEWS SPECIAL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12907" +"0007101200004","FLOUR,UNBLEACHED,CAKE","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.08","1","6","0","0","0","0","13412" +"0007105300200","COLGIN APPLE LIQUID SMOKE ","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0.99","1","0","0","0","0","0","16348" +"0007105300777","COLGIN MESQUITE LIQUID SMOKE","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0.99","1","0","0","0","0","0","16350" +"0007107203050","ALESSI THIN BREADSTIX","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.09","1","0","0","0","0","0","15561" +"0007107203055","ROSEMARY BREADSTICKS","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.09","1","0","0","0","0","0","13583" +"0007113810236","WASABI MUSTARD","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4027" +"0007128740450","COFFEE FILTERS,#2 CONE","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.02","1","0","4","0","0","0","4030" +"0007144830016","SAVORY VEGETABLE SPREAD","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13480" +"0007145400393","STAINLESS STEEL SCOUR PAD","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4034" +"0007146424060","GREEN GOODNESS","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4035" +"0007146430251","BOLTHOUSE C BOOST QT","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4040" +"0007147501089","DRESSING,PARMESAN RANCH","3.85","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1590","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.19","1","6","4","0","0","0","4043" +"0007148601936","MAG YOGA JOURNAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4046" +"0007148602566","MAG ORGANIC GARDENING","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4047" +"0007148602880","MAG YOGA PLUS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4049" +"0007149400020","PUMPERNICKEL BREAD","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","1.53","1","6","0","0","0","0","14086" +"0007149400210","MINI CHIPS - PLAIN","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14125" +"0007151850004","BAKING,YEAST,FAST RISE","0.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.21","1","6","0","0","0","0","15795" +"0007187912491","MACAROON,COCONUT CANISTER","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.11","1","6","4","0","0","0","4051" +"0007192800022","SWISS CHOCOLATE FONDUE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13657" +"0007215500005","PICKAPEPPA SAUCE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.09","1","6","3","0","0","0","4052" +"0007216912265","PJ BEEF BURRITO","2.95","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","","0","0","0","1.83","1","1","0","0","0","0","4054" +"0007224013437","porange navel bag","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14235" +"0007224645864","HERB QUARTERLY MAG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4059" +"0007224821323","TOMATO PASTE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.75","1","0","0","0","0","0","13476" +"0007224825064","PESTO PASTE","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.4","1","0","0","0","0","0","13488" +"0007237500014","PCIDER BAC HALF GALLONS","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","660","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14783" +"0007244010158","DR.WEIL SEASONAL","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13034" +"0007244014403","DIABETES MAGAZINE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16241" +"0007246300021","IRISH OATMEAL,QUICK COOK","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.61","1","6","4","0","0","0","4064" +"0007260973602","ICE CREAM,OG,CHOCOLATE","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.58","1","6","2","0","0","0","4067" +"0007260973651","ICE CREAM,OG,CHOCOLATE","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.73","1","0","0","0","0","0","4072" +"0007260974101","ICE CRM BAR,OG,CHOCOLATE","4.55","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.63","1","1","2","0","0","0","4074" +"0007260974103","ICE CRM BAR,OG,BLACKBERR","4.55","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.63","1","1","2","0","0","0","4076" +"0007260974105","SORBET BARS,OG,MANDARIN","4.55","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.63","1","1","2","0","0","0","4078" +"0007260974118","SORBET BARS,OG,LEMON","4.55","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.63","1","1","2","0","0","0","4080" +"0007260974120","JULIES GF VAN ICE CRM SNDWCH","6.35","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","","0","0","0","3.68","1","1","0","0","0","0","4082" +"0007260974123","JULIES FUDGE BARS","4.55","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.63","1","1","2","0","0","0","4084" +"0007260974125","ICE CREAM SANDWCH,OC,CHO","5.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","3.19","1","1","2","0","0","0","4086" +"0007260974180","ALDENS BLACKBERRY ICE CREAM","6.85","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.97","1","1","2","0","0","0","4088" +"0007260974182","ALDENS COOKIES&CRM ICE CREAM ","6.85","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","3.97","1","1","2","0","0","0","4090" +"0007260974184","ALDENS STRAWBERRY ICE CREAM","6.85","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.97","1","1","2","0","0","0","4092" +"0007260974191","ALDENS OG PB CHIP ICE CREAM","6.85","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.97","1","1","2","0","0","0","4094" +"0007270000003","MATZO, 1#","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.48","1","0","0","0","0","0","15889" +"0007270000014","MATZO,WHOLE WHEAT","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15887" +"0007270005601","THIN UNSALTED MATZO ","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15888" +"0007274590820","PERDUE GAME HENS","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15585" +"0007289100820","WATER, DRINKING LITER","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14354" +"0007293469241","PILAF,SPANISH","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.73","1","0","4","0","0","0","4101" +"0007293497113","COUSCOUS,OG,WILD MUSHROOM","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.86","1","0","4","0","0","0","4103" +"0007315050103","PCLEMENTINE BAG","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1311","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","4105" +"0007323000809","BRSLNG SARDINE IN OLV OI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.25","1","1","4","0","0","0","4107" +"0007323000827","TONGOL TUNA N/S IN WATER","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.56","1","1","0","0","0","0","13230" +"0007323000831","FLAT ANCHOVIES IN OIL","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.42","1","1","4","0","0","0","4109" +"0007323000838","SARDINES,SKINLESS BNLS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.69","1","1","4","0","0","0","4111" +"0007331643114","PASTA SAUCE,NO SALT","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.62","1","6","4","0","0","0","4113" +"0007331643130","SALSA,OG,MILD","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.22","1","6","4","0","0","0","4115" +"0007336032341","SPRKLNG WTR,CAN,CRAN RSB","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.17","1","0","4","0","0","0","4117" +"0007336061341","SPRKLNG WTR,CAN,ORANGE","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.17","1","0","4","0","0","0","4119" +"0007336108370","MAG ADBUSTERS SPEC","8.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4121" +"0007337706944","BACK BRUSH","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.44","1","0","0","0","0","0","4123" +"0007337706970","PUREST PALM BODY BRUSH","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.93","1","0","0","0","0","0","4125" +"0007337707107","ET FILING BLOCK","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","0","5","0","0","0","4127" +"0007337707120","NATURAL SIERRA PUMICE","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.48","1","0","5","0","0","0","4129" +"0007337707310","EARTH THER ANTIBACT SPONGE","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.46","1","0","5","0","0","0","4130" +"0007337709875","WOODEN PIN BRUSH","13.05","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","6","1","0","0","0","0","0","4132" +"0007341600015","RICE CK,OG,BROWN,NS","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1604","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.18","1","1","4","0","0","0","4135" +"0007341600020","RICE CK,OG,SESAME TAMARI","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1604","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.18","1","1","4","0","0","0","4137" +"0007341600160","RICE SYRUP,OG,BROWN","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.93","1","1","4","0","0","0","4139" +"0007341600451","RICE BLEND,BLACK JAPONIC","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","163","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.22","1","1","4","0","0","0","4141" +"0007341602034","RISOTTO,OG,SPCH/MUSH FLNT 5.75","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.99","1","1","4","0","0","0","4143" +"0007341603531","RICE CHIPS,PICO DE GALLO","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.86","1","1","4","0","0","0","4145" +"0007341603534","RICE CHIPS,FIESTA LIME 6 OZ","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.86","1","1","4","0","0","0","4147" +"0007346920123","PMUSHROOM ENOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","514","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4149" +"0007347200116","ENGLISH MUFFINS,OG,7GRAIN","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.63","1","1","2","0","0","0","4151" +"0007347200120","BREAD,OG,EZEKIEL 4:9 SPRT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3","1","6","2","0","0","0","4153" +"0007347200131","BREAD,OG,EZEKL4:9CINN RSN","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.43","1","6","2","0","0","0","4155" +"0007347200166","BREAD,MILLET,WHEAT FREE","5.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.39","1","1","2","0","0","0","4158" +"0007347200169","BREAD,BROWN RICE,WF & GF","5.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.39","1","1","2","0","0","0","4160" +"0007347200200","TORT,OG,EZK4:9,SPRT,LARGE","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.9","1","6","2","0","0","0","4162" +"0007347200213","BURGR BUN,OG,EZEKL,SPRTD","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.67","1","6","2","0","0","0","4164" +"0007347200256","CRL,OG,EZEKIEL 4:9,GL FLX","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","1561","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.51","1","1","4","0","0","0","4167" +"0007347200369","TORTILLAS,BROWN RICE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.9","1","1","2","0","0","0","4169" +"0007349130300","KOZY SHACK PUDDING,CHOCOLATE","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.06","1","1","2","0","0","0","4170" +"0007349152000","KOZY SHK CHOC PUDDING 22OZ","4.25","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","1","0","0","0","0","16621" +"0007357480001","PCELERY HEARTS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","544","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4173" +"0007357480003","PLETTUCE ROMAINE HEART","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","541","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","4174" +"0007382512270","TOFU SCRAMBLER","3.15","0","0","0","1.89","0","1.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.88","1","1","4","0","0","0","4176" +"0007409206709","PURE N BASIC SOAP HONEY SHEA","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.02","1","3","5","0","0","0","4181" +"0007430500016","LIQUID AMINOS 16oz","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.8","1","1","4","0","0","0","4184" +"0007430500132","APL CIDR VINGR,OG,RAW,UNF 32 O","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.46","1","6","4","0","0","0","4186" +"0007430503012","HEALTHY VINAIGRETTE, OG","5.69","0","0","0","4.59","0","4.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","3.32","1","6","4","0","0","0","4187" +"0007430505016","RTD,OG,APL CIDR VIN/HONE","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.55","1","6","0","0","0","0","14159" +"0007433336112","GRAHAM CRACKER PIE CRUST","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.09","1","3","4","0","0","0","4189" +"0007433337492","CEREAL,OG,AMARANTH FLAKE","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.99","1","1","4","0","0","0","4192" +"0007433337790","CEREAL,RICE FLAKES SWTND","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.99","1","1","4","0","0","0","4194" +"0007433338245","COOKIE MIX OG SUGAR","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.19","1","0","4","0","0","0","4196" +"0007433347491","ORGANIC HERB STUFFING","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.26","1","1","4","0","0","0","4202" +"0007433368330","PANCAKE MIX,OG,BUCKWHEAT","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.72","1","1","0","0","0","0","14611" +"0007433368510","PANCAKE WAFFLE MIX, BUTTERMILK","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.72","1","1","0","0","0","0","14604" +"0007447002396","MAG VEGETARIAN TIMES","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4204" +"0007447002981","MAG PILATES STYLE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4206" +"0007447005333","YOGA JOURNAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14835" +"0007447005350","VEG TIMES FARMERS MKT CKBK","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14483" +"0007447010214","MAYO CLINIC GUIDE TO ","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15079" +"0007447023470","GET FRESH MAG","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4208" +"0007447024038","THE ART OF EATING","12.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13406" +"0007447024492","YOGA JOURNAL","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13165" +"0007447024605","GLUTEN FREE LIVING","8.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4210" +"0007447025426","HEALIG FOODS COOKBOOK","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13457" +"0007447025625","WHERE WOMEN COOK","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16532" +"0007447027028","MAG SUSTAINABLE INDUSTRIES","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4211" +"0007447051081","NATURAL HEALTH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4213" +"0007447079635","MAG ANIMAL WELLNESS","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4216" +"0007447085829","MAG TEA A MAGAZINE","5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4218" +"0007447099548","MAG REIKI NEWS","6","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4220" +"0007447099894","INTEGRATIVE MEDICINE MAG","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4222" +"0007447275830","FLATBREAD,FIVE-GRAIN 5.29 OZ","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.3","1","1","4","0","0","0","4224" +"0007457410908","PONION PEARL WHITE OG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","629","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13315" +"0007457410910","PONION PEARL RED OG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","629","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13314" +"0007457483651","PGARKIC JAR MINCED, WATER","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","643","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4227" +"0007457483691","PGARLIC MINCED JAR 4.5 OZ H20","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","643","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4229" +"0007457483696","PSHALLOT CHOPPED JAR","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1315","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4230" +"0007467708110","8PIE,APPLE,UNBKD,RTL PK","7.55","0","0","0","5.99","0","5.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.5","1","1","2","0","0","0","4232" +"0007467708113","8PIE,CHERRY,UNBKD,RTL PK","8.69","0","0","0","6.99","0","6.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","5.16","1","1","2","0","0","0","4234" +"0007467784211","9 PIE SHELL,TRADITIONAL","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.62","1","1","2","0","0","0","4237" +"0007468210301","JUICE OG APPLE QT KNUD","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.84","1","1","0","0","0","0","13388" +"0007468210309","JUICE,JUST BLACK CHERRY","4.89","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.87","1","1","4","0","0","0","4241" +"0007468210327","JUICE,CRANBERRY NECTAR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","1","4","0","0","0","4243" +"0007468210350","JUICE,JUST CRANBERRY","8.69","0","0","0","5.99","0","5.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","5.09","1","1","4","0","0","0","4245" +"0007468210404","CONCENTRATE,BLACK CHERRY","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.55","1","0","4","0","0","0","4247" +"0007468210427","CRANBERRY NECTAR, 8OZ","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.65","1","0","4","0","0","0","4249" +"0007468210533","RECHARGE TROPICAL PET 320Z","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.75","1","1","4","0","0","0","4251" +"0007468210671","RECHARGE ORANGE, 16OZ","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.21","1","1","4","0","0","0","4254" +"0007468210712","JUICE,OG,PRUNE","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.88","1","1","4","0","0","0","4256" +"0007468210722","JUICE,MORNING BLEND 32Z","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","3","4","0","0","0","4258" +"0007468210730","JUICE, OG, VERY VEGGIE, L/S","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.51","1","1","4","0","0","0","4260" +"0007468210749","JUICE,MEGA C","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","3","4","0","0","0","4262" +"0007468210755","JUICE,MEGA ANTIOXIDANT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","b2130","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","3","4","0","0","0","4264" +"0007468210781","JUICE CRAN POMEGRAN KNUDSEN","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.78","1","1","4","0","0","0","4266" +"0007468211101","ASEPT/3 PAK,APPLE,OG","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1601","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.85","1","1","4","0","0","0","4268" +"0007468211129","ASEPT/3 PAK,LEMONADE","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1601","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.85","1","1","4","0","0","0","4270" +"0007468211166","ASEPT/3 PAK,TROP PUNCH","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1601","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.85","1","1","4","0","0","0","4272" +"0007468211363","JAMAICAN LEM SPRITZ SINGLE","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","0","0","0","0","14064" +"0007468211365","BOYSENBERRY SPRITZ SINGLE","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","0","0","0","0","14063" +"0007468211372","SPRITZER SINGLE ORNG PASS","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16221" +"0007468211461","SPRITZER,TANGERINE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.82","1","3","0","0","0","0","14006" +"0007468211463","SPRITZER,JAM LEMONADE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.82","1","1","0","0","0","0","13999" +"0007468211465","SPRITZER,BOYSENBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.82","1","1","0","0","0","0","13998" +"0007468211472","SPRITZER,ORANGE PASSIONF","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.82","1","3","0","0","0","0","14002" +"0007468211831","JUICE,SPRK,OG,APPLE CIDE","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.5","1","1","0","0","0","0","13106" +"0007468211837","JUICE,SPRK,OG,PEAR","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.5","1","1","4","0","0","0","4288" +"0007468211867","JUICE, SPRK, CRANBERRY","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.5","1","1","4","0","0","0","4290" +"0007468215125","JUICE,OG,VERY VEGGIE 8OZ","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.76","1","0","4","0","0","0","4292" +"0007480802566","ORGANIC GARDENING","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16181" +"0007480802881","MAG FIT YOGA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4295" +"0007482008408","MAG NATURAL HOME& GARDEN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4299" +"0007482008684","MAG SAVEUR","5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4301" +"0007482008975","LA CUCINA ITALIANA","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4302" +"0007482008980","ODE MAGAZINE","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4304" +"0007485108263","BICYCLES TIMES","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14507" +"0007485108408","NATURAL HOME","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14351" +"0007485108715","GLUTEN FREE HOLIDAY ISSUE","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15249" +"0007485108991","LIVING WITHOUT MAG","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4307" +"0007487300004","WESTSOY FIRM TOFU","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.86","1","1","2","0","0","0","4310" +"0007487300013","FIVE GRAIN TEMPEH","2.35","0","0","0","1.59","0","1.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.48","1","1","2","0","0","0","4312" +"0007487310012","TIDAL WAVE TOFU","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.86","1","1","2","0","0","0","4315" +"0007487316321","BEANS,OG,BLACK,FF 15Z","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1514","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.31","1","3","4","0","0","0","4317" +"0007487316323","BEANS,OG,KIDNEY,FF 15Z","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1514","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.31","1","1","4","0","0","0","4319" +"0007487316325","BEANS,OG,RED,FF","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1514","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.31","1","1","4","0","0","0","4321" +"0007487316331","BEANS,OG,SALAD,LF","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","1514","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.31","1","1","4","0","0","0","4323" +"0007487325321","BEANS,OG,BLACK,FF 25Z","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.73","1","3","4","0","0","0","4328" +"0007487325324","BEANS,OG,PINTO 25 OZ","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.73","1","3","4","0","0","0","4330" +"0007487330014","BAKED ITALIAN TOFU","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.63","1","1","2","0","0","0","4332" +"0007487330020","CHICKEN STYLE SEITAN","5.35","0","0","0","3.59","0","3.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.39","1","1","2","0","0","0","4334" +"0007487396810","WESTSOY DRINK,OG,PLAIN,LF","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.18","1","1","4","0","0","0","4337" +"0007487397083","WESTSOY,OG,VANILLA,UNSWT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","1582","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.74","1","1","4","0","0","0","4341" +"0007489000195","SUGAR CUBES- DEMERARRA","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.95","1","0","3","0","0","0","4343" +"0007507010441","Golden Honey Granola","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.7","1","1","0","0","0","0","15931" +"0007507010444","CEREAL,WLDBRY CRSP LF","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.66","1","1","0","0","0","0","15909" +"0007511904015","ENER-G LOAF,TAPIOCA","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","0","3","0","0","0","4351" +"0007511912365","FLOUR POTATO STARCH","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.03","1","0","4","0","0","0","4353" +"0007511912448","EGG REPLACER,VEGAN","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.65","1","0","4","0","0","0","4355" +"0007511914024","ENERG LT WHT RICE LOAF","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.19","1","0","0","0","0","0","13882" +"0007511914571","ENER-G BROWN RICE LOAF","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.01","1","0","3","0","0","0","4357" +"0007511914580","ENER-G, YF BROWN RICE","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.24","1","0","3","0","0","0","4359" +"0007511914591","TAPIOCA HOT DOG BUNS","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","3.23","1","0","0","0","0","0","14327" +"0007511960221","ROLLS GF ENER G","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.23","1","0","3","0","0","0","4362" +"0007511980420","XANTHAN GUM","11.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.71","1","0","4","0","0","0","4364" +"0007517207915","NATURAL LICORICE BAR","0.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.43","1","6","4","0","0","0","4366" +"0007517207936","RASPBERRY CHEW BOX","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.95","1","1","4","0","0","0","4368" +"0007517207969","NATRL,LICR CHW HRBS,BOX","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.95","1","1","4","0","0","0","4370" +"0007518120100","DINNER,BEEF STROGANOFF 7.41 OZ","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.64","1","6","4","0","0","0","4372" +"0007527000160","MTN HIGH YOGURT,PLAIN","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.29","1","6","2","0","0","0","4374" +"0007527000193","MOUNTAIN HIGH RASP YOGURT","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","6","2","0","0","0","4376" +"0007547008311","GOOD MAGAZINE","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13694" +"0007547008396","KIWI MAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4379" +"0007547008896","MENTAL FLOSS MAGAZINE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4381" +"0007550200001","MINERAL WATER,1 LTR GEROLS","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.33","1","2","4","0","0","0","4383" +"0007557300011","SOAP,VITAMIN-E","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.91","1","1","5","0","0","0","4385" +"0007557300015","SOAP,UNSCENTED","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.91","1","1","5","0","0","0","4387" +"0007559798189","WILCO (THE ALBUM) - LP","15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","882","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13626" +"0007570701100","COCOCARE COCOA BUTTER STICK","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.07","1","0","5","0","0","0","4389" +"0007572000040","SPRKLNG WATER,LEMON,LITER","1.35","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","0.75","1","6","4","0","0","0","4391" +"0007577227751","SKIN TRIP COCONUT","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.54","1","0","5","0","0","0","4393" +"0007581000125","TAMARI,OG,W/F,GOLD LABEL 10 OZ","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.43","1","6","4","0","0","0","4395" +"0007581002125","TAMARI,BLACK LABEL 10 OZ","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.6","1","1","4","0","0","0","4397" +"0007581004125","SHOYU,OG,BRONZE LABEL 10 OZ","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.99","1","1","4","0","0","0","4399" +"0007581011225","COOKING SAUCE,TERIYAKI","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1545","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.22","1","1","4","0","0","0","4401" +"0007581014025","COOKING SAUCE,THAI PEANUT","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1545","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.22","1","1","4","0","0","0","4403" +"0007582000003","SPIKE TENDERIZER MAGIC","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.69","1","0","4","0","0","0","4405" +"0007582016212","SWISS KRISS LAXITIVE","9.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.1","1","0","5","0","0","0","4407" +"0007594039000","GRAHAMS,OG,WW,CINNAMON","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.86","1","1","4","0","0","0","4409" +"0007627710392","MOCK DUCK CANNED","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","4410" +"0007631430055","EMERGENC TANGE SINGL","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4420" +"0007631430087","EMERGEN-C PACKET LL","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4424" +"0007631430190","ALACER EMERGENC CHERRYPOM 30CT","18.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.35","1","1","5","0","0","0","4433" +"0007631430199","ALACER EMERGENC BLUE 30CT BOX","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.81","1","1","5","0","0","0","4435" +"0007631430202","ALACER EMERGENC TANGERINE 30CT","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.81","1","1","5","0","0","0","4437" +"0007631430205","ALACER EMERGENC LEMLIME 30CT","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.81","1","1","5","0","0","0","4439" +"0007631430207","ALACER EMERGENC TROPICAL 30CT","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.81","1","1","5","0","0","0","4441" +"0007631430210","ALACER EMERGENC MSM 30CT","18.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.35","1","1","5","0","0","0","4444" +"0007631430217","ALACER EMERGENC IMMUNE 30CT","18.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.35","1","1","5","0","0","0","4446" +"0007631430232","ALACER EMERGENC ELECTRO 30CT","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.9","1","0","5","0","0","0","4448" +"0007631430640","EMERGEN-C RASP SNG","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4450" +"0007631436108","ELECTRO MIX SNGL","0.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4453" +"0007631436115","EMRGNC BONE SNG","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4455" +"0007631436131","ALACER IMM DEF SINGLE","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4457" +"0007631436180","ALACER KIDS PINE ORANGE SNGL","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13870" +"0007631436193","ALACER EMERGENC CRANPOM SNGL","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","4461" +"0007631436200","ALERT EMERGENC PACKET","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13897" +"0007633050150","AM HEALTH PAPAYA ENZ1 12CT","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14449" +"0007663002941","AM HEALTH APPLE CID VIN 200CT","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.92","1","0","5","0","0","0","4465" +"0007663003617","ACIDOPHILUS,CHEWBL,BLUBRY","9.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.31","1","1","5","0","0","0","4467" +"0007663016971","AM HEALTH ESTER C 500","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.4","1","1","5","0","0","0","4469" +"0007663050104","ORIG PAPAYA ENZYME 250CT","9.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.31","1","1","5","0","0","0","4470" +"0007663050204","AH PAPAYA ENZYME PLUS 180CT","11.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.12","1","1","5","0","0","0","4471" +"0007675720009","POH DENTAL FLOSS","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.39","1","0","5","0","0","0","4473" +"0007677600926","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","4475" +"0007677601104","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","4477" +"0007677611028","PAPPLE BAG PINK LDY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","4479" +"0007684009166","B&J MUD PIE ICE CREAM","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.52","1","3","0","0","0","0","14161" +"0007684010015","ICE CRM,CHERRY GARCIA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.52","1","0","2","0","0","0","4482" +"0007684010047","ICE CRM,CHOC FUDGE BRWNI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.52","1","0","2","0","0","0","4484" +"0007684010058","ICE CRM,CH CHP,COOKI DOUG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.52","1","0","2","0","0","0","4486" +"0007684010132","ICE CRM,HALF BAKED","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.52","1","0","2","0","0","0","4488" +"0007684010182","ICE CRM,WN PEACH COBBLER","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.52","1","0","2","0","0","0","4489" +"0007684010207","B & J AMERICONE DREAM","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.52","1","0","2","0","0","0","4491" +"0007684015418","ICE CRM, LATE NIGHT SNACK","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.52","1","0","0","0","0","0","15946" +"0007686900015","PHERB THYME","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","938","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","3","6","0","0","0","4493" +"0007695020328","TEA,VAN SPICE,PRFCT ENRG","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.73","1","3","0","0","0","0","15779" +"0007695041525","TEA,OG,VANILLA HAZELNUT 16 BAG","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","0","4","0","0","0","4495" +"0007695045001","TEA, OG, BEDTIME","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.73","1","1","4","0","0","0","4497" +"0007695045005","TEA,OG,AHF,WMN","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","1","4","0","0","0","4499" +"0007695045008","TEA,OG,AHF,DE-TOX","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","3","4","0","0","0","4500" +"0007695045010","TEA,OG,AHF,ECH IMMUNE SUP","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","1","4","0","0","0","4502" +"0007695045014","TEA,OG,AHF,FASTING","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","1","4","0","0","0","4504" +"0007695045018","TEA,OG,AHF,THROAT COMFORT","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","1","4","0","0","0","4506" +"0007695045025","TEA,OG,GINKGO CLARITY","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.73","1","0","0","0","0","0","13183" +"0007695045030","TEA,OG,AHF,KAVA STRES RLF","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","1","4","0","0","0","4509" +"0007695045036","TEA,OG,GRN,SPR ANTIOXIDNT 16 B","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.73","1","1","4","0","0","0","4511" +"0007695045041","TEA,OG,SIMPLY GREEN DECA","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.73","1","1","4","0","0","0","12894" +"0007695045067","TEA,OG, BERRY DETOX","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","1548","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.73","1","3","4","0","0","0","4514" +"0007697011031","AURA GLOW LOTION,ALMOND","8.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.33","1","3","5","0","0","0","4516" +"0007697011034","AURA GLOW LOTION,COCONUT","7.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.33","1","3","5","0","0","0","4518" +"0007697011316","HERITAGE A GLOW UNSCENT 16OZ","9.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.1","1","3","5","0","0","0","4521" +"0007697044346","HERITAGE LIQUID LANOLIN","9.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.92","1","0","5","0","0","0","4523" +"0007697044609","FLWR WATER,ROSE,ATMZR","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","0","5","0","0","0","4525" +"0007697044678","FLWR WATER,JASMINE,ATMZR","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.6","1","0","5","0","0","0","4527" +"0007701410004","HENNA,AUBURN","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.44","1","6","5","0","0","0","4531" +"0007701410007","HENNA,CHESTNUT","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.44","1","6","5","0","0","0","4533" +"0007717248000","W.V. ORGANIC AMERICAN SLICES","4.59","0","0","0","3.29","0","3.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.73","1","1","3","0","0","0","4534" +"0007717248004","CHEDDAR SLICES WHOLESOME VALLE","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4536" +"0007717264140","RICE MOZZARELLA SLICES","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4538" +"0007717264156","rice Cheddar slices","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4540" +"0007724101236","BAR,DARK CHOC,PURE","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.82","1","6","0","0","0","0","13136" +"0007724150030","BAKING CHIPS, WHITE CHOC","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.13","1","1","0","0","0","0","15272" +"0007724150091","CHOC CHIP,DF,GF,SEMI SWT","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","1","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.09","1","1","0","0","0","0","15092" +"0007732000005","LIP BALM,SPF 18,VANILLA","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.36","1","3","5","0","0","0","4545" +"0007732000008","LIP BALM,SPF 18,TANGERINE","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.36","1","3","5","0","0","0","4547" +"0007732077500","UN-PETROL LIP BALM,BLAZE","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.97","1","0","5","0","0","0","4549" +"0007732610006","TOM WHL CARE ANTICAV CLOVE FL","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.31","1","1","5","0","0","0","4551" +"0007732611106","FLUOR TP,WINTERMT CAV PROT","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.31","1","1","5","0","0","0","4554" +"0007732612106","TOM PROP MYR PEPP FL FREE","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.31","1","1","5","0","0","0","4557" +"0007732612704","TOMS ORG MANGO KIDS TP","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.71","1","1","5","0","0","0","4558" +"0007732615306","TOMS WH CARE SPRMT TP GEL FLR","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.31","1","1","0","0","0","0","14884" +"0007732616206","TP,TARTAR/WHTNG FENNEL FL FR","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.31","1","1","5","0","0","0","4561" +"0007732641216","TOMS MWASH SPEARMINT ANTICAV","8.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.58","1","1","0","0","0","0","13181" +"0007732661225","DEOD,STICK,LAVNDR,L/L","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.61","1","1","5","0","0","0","4568" +"0007732662403","DEOD,ROLL-ON,UNSCT,L/L","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.61","1","1","5","0","0","0","4571" +"0007732665525","DEODORANT STICK-CALENDULA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.61","1","1","5","0","0","0","4572" +"0007732666625","TOMS OF MAINE MTN SPRING DEOD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.61","1","1","0","0","0","0","16142" +"0007732683036","TOMS OF MAINE EXFOL SOAP","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.02","1","1","0","0","0","0","16139" +"0007732683038","TOMS OF MAINE ENERGIZING SOAP","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.02","1","1","0","0","0","0","16140" +"0007732683073","TOMS OF MAINE WC CINN CLOVE TP","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.31","1","1","0","0","0","0","16171" +"0007732683077","TOMS TP FL PEPP BSODA","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.31","1","1","0","0","0","0","16530" +"0007732683080","TOMS PEPPERMINT GEL W FL","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.31","1","1","0","0","0","0","16289" +"0007732683087","NEW TOMS SPEARMINT GEL 4.7OZ","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.31","1","1","0","0","0","0","16192" +"0007732683092","TOMS STRAW KIDS FL TP 4.2OZ","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.71","1","1","0","0","0","0","16360" +"0007732683094","TOMS TP KIDS ORG MNG AC FL","5.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.71","1","1","0","0","0","0","16529" +"0007732698240","FLOSS,ANTI PLQ,ROUND","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.38","1","1","5","0","0","0","4575" +"0007750201610","DELHI SAAG/SPINACH & GRNS","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1569","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.95","1","1","4","0","0","0","4579" +"0007750203610","MATAR-PANEER-PEAS/CHEESE","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1569","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.95","1","1","4","0","0","0","4581" +"0007765220123","PMUSHROOM ENOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","514","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4584" +"0007790120004","BRIE FLEURS de FRANCE ","7.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","4588" +"0007797508731","PRETZEL,STICKS,GF","3.49","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","2.11","1","6","0","0","0","0","15560" +"0007801612346","SOYA KAAS CHED STYLE","6.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.68","1","0","3","0","0","0","4592" +"0007831421175","AGAVE NECTAR,AMBER","3.99","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.26","1","3","4","0","0","0","4594" +"0007831431235","AGAVE NECTAR,OG2,RAW","7.35","0","0","0","5.89","0","5.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","0","1","3","0","0","0","0","16650" +"0007834700154","NG CREME DE PEPPERMINT TP","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.7","1","1","5","0","0","0","4600" +"0007834701181","HERBAL SHAMPOO N.G","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.59","1","6","5","0","0","0","4602" +"0007834702301","SHAMPOO,RAINWTR TEA TREE","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.57","1","6","5","0","0","0","4605" +"0007834702303","CONDITIONER,RAINWTR AWAPH","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.58","1","6","5","0","0","0","4607" +"0007834702319","SHAMPOO,RAINWATER HEMP","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.58","1","6","5","0","0","0","4609" +"0007834703018","HERBAL CONDITIONER","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.59","1","6","5","0","0","0","4611" +"0007834703282","SHAMPOO,RAINWATER BABY","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.58","1","6","5","0","0","0","4614" +"0007834704172","MOIST LOTION,FRAG FREE","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.42","1","1","5","0","0","0","4616" +"0007834704176","SKIN THER OATMEAL LOTION","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","1","5","0","0","0","4618" +"0007834755550","STICK DEOD,SPRING FRESH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.6","1","0","5","0","0","0","4621" +"0007834755565","STICK DEOD,AUTUMN BREEZE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.6","1","0","5","0","0","0","4624" +"0007834775118","NGATE POM SUNFLOWER COND","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.58","1","6","0","0","0","0","16377" +"0007834777440","VITAMIN E OIL 40000 IU","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","0","5","0","0","0","4633" +"0007834787002","NGATE ALOE VERA COND","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.58","1","6","0","0","0","0","16375" +"0007834787004","NGATE JOJOBA COND","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.58","1","6","0","0","0","0","16376" +"0007834787010","SHAMPOO,CHAMOMILE","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.58","1","1","5","0","0","0","4635" +"0007835553000","GREEK YGRT,TRAD,HNY FLV","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1","1","1","2","0","0","0","4638" +"0007835557000","GREEK YGRT 24 OZ. HONEY ","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.82","1","1","2","0","0","0","4640" +"0007839102211","CAFIX INSTANT BEVERAGE","9.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.49","1","0","1","0","0","0","4641" +"0007841112106","CAESARS MANICOTTI, WF, GF","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.23","1","6","2","0","0","0","4643" +"0007852200044","HAIR THICKENING CONDTIONR","10.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.9","1","1","5","0","0","0","4645" +"0007852200078","TEA TREE OIL THPY SHAMPOO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.16","1","1","5","0","0","0","4647" +"0007852200150","JASON TRIAL SZ POWERSMILE","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14997" +"0007852201510","TPSTE,SEA FRESH","6.45","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","3.43","1","1","5","0","0","0","4650" +"0007852201520","THPSTE, NUTRISMILE","6.45","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","3.43","1","1","5","0","0","0","4652" +"0007852201551","JASON ENZYME BRIGHT TOOTHPASTE","6.45","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.43","1","1","5","0","0","0","4654" +"0007852202005","SATIN SOAP,ALOE VERA","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.68","1","1","5","0","0","0","4656" +"0007852202113","BODY WASH,LAVENDER","14.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.63","1","1","5","0","0","0","4660" +"0007852203032","NAIL SAVER NO FUNGUS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.42","1","0","5","0","0","0","4662" +"0007852205012","JASON 5000 IU VIT E CREAM 4 OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.92","1","1","5","0","0","0","4666" +"0007852207009","NATURAL BIOTIN CONDITIONR","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.17","1","1","5","0","0","0","4668" +"0007852209045","DEODRNT,TEA TREE OIL STIK","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.69","1","0","5","0","0","0","4670" +"0007852272001","JASON FF DEODERANT","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.69","1","0","5","0","0","0","4673" +"0007878352451","PCARROT SHREDDED PACKAGE","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","727","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4675" +"0007878370107","PPOTATO BAG RED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","4677" +"0007878370112","PPOTATO BAG RED 3#","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","1391","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12824" +"0007878390204","PCARROT BABY SNACK PACK","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","866","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4680" +"0007878390800","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","0","1","8","0","0","0","0","13383" +"0007891500004","MEASURING CUPS","9.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15311" +"0007891522380","MEASURING SPOONS","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15310" +"0007893500511","CRISPBREAD, TASTY DARK RYE","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1578","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.63","1","1","4","0","0","0","4684" +"0007893500544","CRISPBREAD, FRUIT & CRUNCH","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","1578","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.1","1","1","4","0","0","0","4686" +"0007896225302","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","4688" +"0007900410002","GOAT MILD CHEDDAR,RAW","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.43","1","6","3","0","0","0","4690" +"0007900410004","GOAT MOZZ MT. STERLING","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.68","1","6","3","0","0","0","4692" +"0007900410010","MT STERLING AGED CHEDDAR","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.98","1","0","3","0","0","0","4694" +"0007912600810","FRT LEATHER,APRICOT","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1614","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.35","1","1","4","0","0","0","4696" +"0007912600830","FRT LEATHER,WILD APPLE","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1614","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.35","1","1","4","0","0","0","4698" +"0007912600860","FRT LEATHER,RASPBERRY","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1614","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.35","1","1","4","0","0","0","4700" +"0007912600890","FRT LEATHER,SWT STRAWBERY","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1614","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.35","1","1","4","0","0","0","4702" +"0007947310164","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","4712" +"0007956500098","CHANDRIKA SANDALWOOD SOAP","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.93","1","0","5","0","0","0","4714" +"0007956500513","ANCIENT SECRETS NETI POT","16.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.34","1","6","5","0","0","0","4720" +"0007956500912","REPLACE HEAD SOFT REFILLS","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.83","1","1","5","0","0","0","4722" +"0007962507111","ECO TOOLS SUST BODY BUFF","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15385" +"0007962507400","ECO TOOLS BAMBOO BATH BRUSH","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15383" +"0007962507407","ECO TOOLS FACIAL BUFFS","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15393" +"0007962507409","ECO TOOLS FACIAL SPONGES","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15391" +"0007962507412","ECO TOOLS SLEEP MASK","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15389" +"0007962507419","ECO TOOLS FOOT BRUSH & FILE","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15390" +"0007962512003","ECO TOOLS LOVE HEELS CREAM","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15386" +"0007962512006","ECO TOOLS BODY SCRUB","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15381" +"0007962512050","ECO TOOLS GREEN CLEAN GO","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15377" +"0007962512052","ECOTOOLS FOUR THE CAUSE KIT","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13402" +"0007962564021","ECO TOOLS ANIMAL SPONGE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15395" +"0007965114762","FLORADIX IRON PLUS HERBS","28.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","4724" +"0007968604414","BAMBOO SKEWERS 10","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","4727" +"0007985851427","BPEANUT BUTTER NON-O SMOOTH 5#","14.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.76","1","0","1","0","0","0","4729" +"0007985853226","CASHEW BUTTER,RST NS","10.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.16","1","6","4","0","0","0","4731" +"0007985861264","PEANUT BUTTER,OG,SM,NS","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.12","1","6","4","0","0","0","4733" +"0007985861464","BPEANUT BUTTER ORG SMOOTH 5#","21.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.77","1","0","1","0","0","0","4735" +"0007985862224","TAHINI,OG,RST,NS","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.3","1","0","4","0","0","0","4737" +"0007990000105","CANNED,WILD BLUEBERRIES","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.37","1","6","4","0","0","0","4739" +"0007991102663","NATURADE WEIGHT GAIN 2LB","28.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","17.98","1","0","0","0","0","0","14773" +"0007991103488","EXPEC CHILD","8.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.83","1","0","5","0","0","0","4743" +"0007998570060","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","4750" +"0008100600025","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14031" +"0008114600220","CASC FRESH FF CHERRY VAN ","1.15","0","0","0","0.69","0","0.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","b1821","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0.6","1","1","0","0","0","0","13426" +"0008114600240","YGRT,FF,SAN JUAN STRWBRRY","1.15","0","0","0","0.69","0","0.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","b1821","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.6","1","1","2","0","0","0","4754" +"0008114600310","CASC FRESH BLUE YOGURT 32OZ","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.23","1","6","2","0","0","0","4756" +"0008126470100","Blue Chico Bag","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","12833" +"0008131220061","PLAIN GOAT YOGURT","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","1","2","0","0","0","4769" +"0008173830301","SHIKAI EVERYDAY SHAMPOO","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.93","1","2","0","0","0","0","15476" +"0008173830303","SHIKAI MOISTURIZING SHAMPOO","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.93","1","2","0","0","0","0","15477" +"0008173830305","SHIKAI EVERYDAY CONDITIONER","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.93","1","2","0","0","0","0","15478" +"0008173831352","REFLECT SHAMPOO,GOLD CLR","8.55","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.42","1","1","5","0","0","0","4774" +"0008173831354","REFLECT SHAMPOO,WARM CLR","8.55","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.42","1","1","5","0","0","0","4776" +"0008173831361","REFLECT COND,MIST&GO SPRY","8.55","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.42","1","1","5","0","0","0","4778" +"0008173834304","HND & BDY LOTION,VANILLA","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.93","1","1","5","0","0","0","4782" +"0008173834309","SHIKAI POMEGRANATE LOTION","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.93","1","1","5","0","0","0","4785" +"0008173834362","SHIKAI TRAVEL LOT CUC MELON","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.2","1","3","0","0","0","0","15340" +"0008173834366","SHIKAI TRAVEL LOT GARDENIA","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.2","1","3","0","0","0","0","15399" +"0008173836302","SHIKAI CUC MELON SHOWER GEL","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.42","1","6","0","0","0","0","13379" +"0008173836307","SHOWER GEL,SNDLWOOD AMBER","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.42","1","6","5","0","0","0","4788" +"0008173836312","SHIKAI TRAVEL SHOWGEL CUC MEL","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.2","1","3","0","0","0","0","15397" +"0008173836316","SHIKAI GARDENIA SHOWER GEL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.2","1","0","0","0","0","0","15556" +"0008173840201","SHIKAI CHILD DRY SKIN THERAPY","12.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.65","1","1","5","0","0","0","4790" +"0008173840222","BORAGE THERPY ADULT FORM","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.19","1","1","5","0","0","0","4792" +"0008259261715","NAKED POMEGRANATE ACAI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4794" +"0008259263228","NAKED JCE MANGO PROTEIN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16342" +"0008259272015","NAKED GREEN MACHINE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4798" +"0008259272615","NAKED RED MACHINE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4800" +"0008259291715","NAKED JUICE POWER C","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4804" +"0008259298815","NAKED BERRY BLAST","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","4808" +"0008266670020","POTATO CHIP,BBQ","2.79","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","1.65","1","1","4","0","0","0","4810" +"0008266670080","POTATO CHIP,CHEDDAR","2.79","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","1.65","1","1","4","0","0","0","4812" +"0008266678800","POTATO CHIP,CHEDDAR","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.6","1","0","0","0","0","0","15747" +"0008292712343","Picante Pesto","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4814" +"0008292712349","Sweet Red Pepper Pesto","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4817" +"0008300016468","CORAL CALCIUM SUPREME","26.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","14.5","1","0","5","0","0","0","4821" +"0008300026132","NATURES ANSWER LIQUID D","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","7.36","1","0","0","0","0","0","15904" +"0008385120407","GREEN MAGMA USA,OG","19.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.67","1","0","5","0","0","0","4825" +"0008405900034","GARDENBURGER,BLACK BEAN","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","1","0","0","0","0","4828" +"0008405900043","GARD BURGER SUND DRIED TOM","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","1","0","0","0","0","4829" +"0008411400996","POTATO CHIPS,SALT&VINEGAR","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","4","0","0","0","4831" +"0008411400998","CHIPS KETTLE LIGHT SALT","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.72","1","1","4","0","0","0","4832" +"0008411403070","POTATO CHIPS,HONEY DIJON","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.72","1","1","4","0","0","0","4833" +"0008411403240","KRINKLE CUTS,SALT&PEPPER","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1541","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.07","1","1","4","0","0","0","4835" +"0008411403300","POTATO CHIPS,LIGHTLY SALT","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.75","1","0","4","0","0","0","4837" +"0008411410923","POTATO CHIPS, SPICY THAI","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.72","1","1","4","0","0","0","4839" +"0008411411338","KRINKLE CUTS,BUFFALO BLEU 20Z","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.75","1","0","4","0","0","0","4843" +"0008411411551","POTATO CHIPS,SWEET ONION","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.75","1","0","4","0","0","0","4845" +"0008411411585","BAKES,SALT & FRESH PEPPE","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.89","1","1","0","0","0","0","13803" +"0008411411877","TIA,TORT CHP,ZESTY RANCH","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.15","1","1","0","0","0","0","15308" +"0008411411880","TIA,TORT CHP,SWT BAJA BB","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.15","1","1","0","0","0","0","15306" +"0008425312884","RICE DREAM,OG,STRAWBERRY","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.43","1","0","2","0","0","0","4847" +"0008425322214","RICE BEV,VANILLA NONDAIRY","3.65","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","1538","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.12","1","1","4","0","0","0","4850" +"0008425322216","RICE ENRICH VAN,NONDAIRY","3.65","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","1539","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.12","1","1","4","0","0","0","4852" +"0008425322240","RICE ENRICH BEV,OG,ORIG 3pk","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.23","1","0","4","0","0","0","4854" +"0008425324045","SOUP,OG,NO CHICKEN BROTH","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1574","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.5","1","1","4","0","0","0","4856" +"0008425324049","SOUP,OG,FR RNGE CHCKN BRT","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","1574","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.5","1","3","4","0","0","0","4858" +"0008425324068","SOUP,OG,VEGETABLE BROTH","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","0","4","0","0","0","4860" +"0008425324601","GRAVY,OG,SAVORY BEEF","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.54","1","3","0","0","0","0","13156" +"0008425326020","SOY ENRICH BEV,OG,ORIG","3.75","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","1539","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.12","1","1","4","0","0","0","4862" +"0008425326022","SOY ENRICH CHOC,NONDAIRY","3.75","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","1539","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.12","1","1","4","0","0","0","4864" +"0008425326061","SOY ENR BEV OG VAN 3PK","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.23","1","0","0","0","0","0","15417" +"0008425327117","FRESH RICEDRM,OG,ORIGINAL","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.65","1","6","2","0","0","0","4866" +"0008425328003","SOY DREAM,OG,BUTTER PECAN","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.43","1","0","2","0","0","0","4868" +"0008425328046","LIL DREAM,OG,MULTIPK,VAN","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.9","1","0","0","0","0","0","4870" +"0008425328423","ALMND DRM CHOCOLATE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.48","1","6","0","0","0","0","14163" +"0008425333000","BAR,CAROB COATED,VANILLA","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.92","1","0","2","0","0","0","4871" +"0008425344400","DREAM PIE,CAROB COAT,VAN","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.85","1","0","2","0","0","0","4873" +"0008425344430","DREAM PIE,MINT","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.85","1","0","2","0","0","0","4875" +"0008425344460","BAR,NUT CHOC COATED,VAN","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.92","1","0","2","0","0","0","4877" +"0008425382855","RICE DREAM,OG,VANILLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.43","1","0","2","0","0","0","4881" +"0008489202747","Le ROULE CRAN","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4883" +"0008491108100","PANCAKE MIX, CINNAMON ROLL","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13303" +"0008491108300","PANCAKE MIX, GINGER SNAP","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13808" +"0008491185159","FISH BATTER","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13394" +"0008491185182","PANCAKE MIX, PERFECT POTATO","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14709" +"0008491187002","PANCAKE MIX, PUMPKIN PIE","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14724" +"0008517800009","RADIUS ORIGINAL TBRUSH LEFT","9.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.91","1","3","0","0","0","0","14287" +"0008517800039","CASE,TOOTHBRUSH","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.61","1","1","5","0","0","0","4884" +"0008517800065","RADIUS SOURCE TOOTHBRUSH","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.92","1","2","0","0","0","0","14251" +"0008517800184","RADIUS CRANBERRY FLOSS","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.95","1","2","0","0","0","0","14252" +"0008527600080","AEROPRESS COFFEE MAKER","47.95","0","0","0","23.99","0","23.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","15643" +"0008569310100","SESAME THINS,ORIGINAL","2.85","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.65","1","1","4","0","0","0","4887" +"0008569310107","SESAME THINS,CHEDDAR","2.85","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","1.65","1","1","0","0","0","0","14479" +"0008569310702","RICE THINS,BROWN RICE","2.95","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","1.69","1","1","4","0","0","0","4890" +"0008569660803","TOFU,SILKEN,SOFT,TETRA","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.14","1","1","2","0","0","0","4894" +"0008569660805","SILKEN TOFU EX FIRM","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.14","1","1","2","0","0","0","4896" +"0008583505001","CAT FOOD,VITALITY 4 #","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.42","1","0","4","0","0","0","4898" +"0008644911991","CRYSTAL DEOD POM SPRAY","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.34","1","6","0","0","0","0","14144" +"0008644930003","CRYSTAL DEOD TWIST UP","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.44","1","6","5","0","0","0","4899" +"0008644930009","CRYSTAL DEOD SPRAY","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","6","5","0","0","0","4901" +"0008644931991","CRYSTAL DEOD CHAM SPRAY","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.34","1","6","0","0","0","0","14145" +"0008727400060","BLACK SEEDED SIMPSON LETTUCE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","0","1","0","0","0","0","0","1","3","0","0","0","0","14184" +"0008733663330","ARTICHOKE FETTUCINE OG DEB","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.65","1","1","4","0","0","0","4904" +"0008761435026","DSP,CHEWING GUM,CITRUS","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.91","1","6","0","0","0","0","15351" +"0008761435119","CHEWING GUM,PEPPERMINT","10.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","5.89","1","6","0","0","0","0","14962" +"0008761480031","BODY RESCUE PH DROP","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.94","1","0","5","0","0","0","4907" +"0008773000000","HOT SALSA FOG CITY","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","4910" +"0008790600002","PSROUT BEAN","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","655","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","4912" +"0008790600012","PSHALLOT NON-O 3OZ","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1329","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14660" +"0008799211117","VITAMIN E STICK","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.97","1","0","5","0","0","0","4914" +"0008803310128","PCIDER PEPIN HEIGHTS GALLON","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","708","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","4916" +"0008803312064","PCIDER PH RASPBERRY 1/2GAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","1415","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13367" +"0008803320012","PCIDER PEPIN HEIGHTS SINGLE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","706","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","4919" +"0008803320750","pCider Pepin Heights 750 ml","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1093","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4921" +"0008819434001","WHL MILK YGRT, MAPLE 6OZ","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.65","1","1","0","0","0","0","14347" +"0008819434004","WHL MLK YGRT,STRAWBERRY","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","","0","1","0","0","3500","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0.65","1","1","0","0","0","0","4931" +"0008819434008","WHL MLK YGRT,APRCT MANGO","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","","0","1","0","0","3500","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0.65","1","1","0","0","0","0","4934" +"0008819434060","WHL MLK YGRT,PLAIN","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","b2214","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.46","1","1","2","0","0","0","4936" +"0008819434062","BR COW WHL MILK YGRT, MPL 32","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.46","1","1","0","0","0","0","16279" +"0008882690150","PORANGE BAG HAMLIN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1132","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4938" +"0008882690800","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","4940" +"0008909150765","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","4942" +"0008909150767","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","4944" +"0008912522000","WHT FREE ELBOWS","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","3","4","0","0","0","4946" +"0008912529000","WHT FREE VEGETABLE CURLS","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","1","4","0","0","0","4948" +"0008915680111","OLIVES,JALAPENO,STUFFED","4.99","0","0","0","4.29","0","4.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.89","1","6","4","0","0","0","4950" +"0008915684013","OLIVES,CAL GREEN,PITTED 6 OZ","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.42","1","6","4","0","0","0","4952" +"0008947911106","PMUSHROOM DRY WOODLAND","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","662","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","4954" +"0008962290433","PLETTUCE ROMAINE HEA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","541","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","4956" +"0008983602340","VANILLA BEANS ORG","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","239","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.44","1","0","1","0","0","0","4957" +"0008983618268","PEPPERCORNS,OG,WHITE","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","15948" +"0008983618401","SAFFRON","14.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","239","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.44","1","1","1","0","0","0","4958" +"0008983618744","SEASONING MIX, OG, ENCHILADA","1.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.86","1","1","0","0","0","0","14225" +"0008983618807","CHEESY LASAGNE","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.33","1","0","4","0","0","0","4960" +"0008983618814","CREAMY TUNA SPIRALS","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.33","1","0","4","0","0","0","4962" +"0008983618841","DIP,OG,FRENCH ONION","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.92","1","1","4","0","0","0","4964" +"0008983618843","DIP,OG,CREAMY DILL","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.92","1","1","4","0","0","0","4966" +"0008983618934","MIX,OG,CARROT CAKE","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.95","1","1","0","0","0","0","14331" +"0008983618954","MESQUITE BARBECUE MARINADE MIX","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.88","1","1","0","0","0","0","14106" +"0008983618968","GARLIC AND HERB MARINADE MIX","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0.88","1","1","0","0","0","0","14105" +"0008983623176","VANILLA EXTRACT,100% OG","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.31","1","1","4","0","0","0","4969" +"0008983631005","ALMOND EXTRACT 2OZ ORG","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.01","1","1","1","0","0","0","4971" +"0008990330000","EPICUREAN CUTTING BOARD, 18X13","30.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13236" +"0008994730206","WAFFLES,WHEAT FREE","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.99","1","1","2","0","0","0","4973" +"0008994730217","WAFFLES,OG,BLUEBERRY","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.99","1","1","2","0","0","0","4975" +"0008994730220","WAFFLES,WHEAT FR,BLUEBERY","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.99","1","1","2","0","0","0","4977" +"0009030000066","HEMP BALM, VANILLA","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","12886" +"0009034112121","ROOT BEER VIRGILS SINGLE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","4981" +"0009034154321","CREAM SODA VIRGILS","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.79","1","0","4","0","0","0","4983" +"0009070000006","OLIVE LEAF","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.43","1","0","5","0","0","0","4985" +"0009070000013","BLACK WALNUT","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","0","5","0","0","0","4987" +"0009070000039","CINNAMON","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.05","1","3","5","0","0","0","4989" +"0009070000046","DANDELION","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","1","5","0","0","0","4991" +"0009070000055","FEVERFEW EXTRACT","10.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.18","1","0","5","0","0","0","4994" +"0009070000061","GINKGO EXTRACT","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.18","1","0","5","0","0","0","4996" +"0009070000067","GOLDENSEAL EXTRACT","13.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.72","1","0","5","0","0","0","4998" +"0009070000074","HPHARM HORSETAIL","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6","1","3","5","0","0","0","5000" +"0009070000080","PHARMA KAVA 1 OZ","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.72","1","3","5","0","0","0","5001" +"0009070000085","LICORICE EXTRACT","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","0","5","0","0","0","5003" +"0009070000088","LOMATIUM","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","0","5","0","0","0","5005" +"0009070000097","MOTHERWORT","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","0","5","0","0","0","5007" +"0009070000297","HERB PHARM TEA TREE OIL 4 OZ","44.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","27.55","1","3","0","0","0","0","13465" +"0009070000306","Therapeutic Herbal Manual","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.43","1","0","9","0","0","0","5010" +"0009070000348","HPHARM OREGANO SPIRITS","11.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.58","1","0","5","0","0","0","5011" +"0009070000355","RHODIOLA 1 OZ HERB PHARM","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.43","1","0","5","0","0","0","5013" +"0009070000400","BLACK ELDERBERRY","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6","1","0","5","0","0","0","5015" +"0009070000407","HPHARM IMMUNATTACK 1 OZ","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6","1","3","5","0","0","0","5018" +"0009070000425","HPHARM NETTLE GLYCERITE","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16426" +"0009080000004","PASSIONFLOWER","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.43","1","0","5","0","0","0","5021" +"0009080000015","RED CLOVER","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","0","5","0","0","0","5025" +"0009080000025","ST. JOHNS WORT EXTRACT","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.43","1","0","5","0","0","0","5027" +"0009080000038","UVA-URSI HERB PHARM","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.43","1","0","5","0","0","0","5030" +"0009080000042","GINSENG CHINESE","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.72","1","0","5","0","0","0","5032" +"0009080000071","PEPPERMINT SPIRITS","10.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.43","1","0","5","0","0","0","5035" +"0009080000081","SUPER ECHIN 4OZ","45.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","25.39","1","0","5","0","0","0","5037" +"0009090000002","NERVOUS SYSTEM","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6","1","3","5","0","0","0","5039" +"0009090000005","TRAUMA OIL","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.58","1","3","5","0","0","0","5041" +"0009090000011","HEALTHY LIVER TONIC","11.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.58","1","1","5","0","0","0","5043" +"0009090000014","ECHINACEA-GOLDENSEAL COMP","11.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.58","1","1","5","0","0","0","5045" +"0009090000017","EYEBRIGHT-NETTLE COMPOUND","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.68","1","1","5","0","0","0","5047" +"0009090000020","MALE VITALITY","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.71","1","0","5","0","0","0","5049" +"0009090000030","HPHARM STONE BREAKER","11.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16576" +"0009090000037","SPILANTHES/USNEA TINCTURE","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.18","1","3","5","0","0","0","5053" +"0009090000041","RELAXING SLEEP TONIC","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.43","1","0","5","0","0","0","5055" +"0009090000049","PROP ECHINACEA THROAT SPRAY","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.18","1","1","5","0","0","0","5057" +"0009090000060","AF-GOLDEN ECHENACEA","10.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.43","1","0","5","0","0","0","5059" +"0009090000064","GLYCERITE(AF) GOLDENSEAL","13.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.72","1","0","5","0","0","0","5061" +"0009090000070","GLYCERITE(AF) ECHIN-CHILD","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.18","1","1","5","0","0","0","5063" +"0009090000083","TEA TREE OIL","11.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.44","1","3","5","0","0","0","5065" +"0009112416299","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","0","0","0","0","14080" +"0009132100001","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","5067" +"0009132100003","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","5069" +"0009132100005","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","5071" +"0009232500001","BBQ SAUCE,ORIGINAL","3.99","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.32","1","1","4","0","0","0","5073" +"0009232511111","DRESSING,GODDESS 16OZ","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.55","1","1","4","0","0","0","5075" +"0009232511118","DRESSING,COW GIRL RANCH 16OZ","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.55","1","1","4","0","0","0","12820" +"0009232522221","MUSTARD,OG,HORSERADISH","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.37","1","1","4","0","0","0","5078" +"0009232533301","DRESSING,GODDESS,LITE 8Z","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1588","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16615" +"0009232533312","DRESSING,OG,V/F,GRN GARLC","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1510","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.49","1","1","4","0","0","0","5082" +"0009232533317","DRESSING, OG CAESAR","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1510","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.49","1","1","4","0","0","0","5084" +"0009232533320","VINGRT,TUSCANY ITALIAN","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1588","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.08","1","1","4","0","0","0","5086" +"0009232533324","DRESSING,OG, FRENCH","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1510","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.49","1","1","4","0","0","0","5088" +"0009232533331","VINGRT,RASPBERRY,LF","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1588","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.08","1","1","4","0","0","0","5090" +"0009232533335","VINGRT SHIITAKE SESAME NON-O","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1588","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.08","1","1","4","0","0","0","5092" +"0009232533338","DRESSING COWG RANCH NON-O AN","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1588","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.08","1","1","4","0","0","0","5094" +"0009232533348","DRESSING,ARTICHOKE PARMS","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1588","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.08","1","1","4","0","0","0","5096" +"0009232533352","DRESSING,OG, GODDESS","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1510","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.49","1","1","4","0","0","0","5098" +"0009232533357","DRESSING, OG, CREAMY ASIAGO","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1510","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.49","1","1","4","0","0","0","5100" +"0009232533362","VINGRT,RASP BALSAMIC,FF","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.08","1","1","0","0","0","0","14151" +"0009256710162","DR.WEIL SELF HESLING","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13464" +"0009265701697","TEA, BETTER PARENT CHAM","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15465" +"0009265701699","TEA, LIVE FOREVER GRN JASMINE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15463" +"0009370910030","COOKIES GINGER ALM WF","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.34","1","1","4","0","0","0","5105" +"0009370910070","COOKIES,CHNKY CHOC CHP,WF","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.34","1","1","4","0","0","0","5107" +"0009370910130","SHORTBREAD,SWIRL(VN&CH)WF","3.99","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.34","1","1","4","0","0","0","5109" +"0009370930010","PANCAKE&BAKING MIX,WF/GF 24Z","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.41","1","1","4","0","0","0","5112" +"0009370930040","CAKE MIX,LUSCIOUS CHOCLTE","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.59","1","1","4","0","0","0","5114" +"0009370931001","PANCAKE&BKNG MIX,WF/GF,S","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.15","1","6","0","0","0","0","15868" +"0009370950010","SIMPLE BITES CHOC CHIP","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.15","1","6","4","0","0","0","5118" +"0009370950030","SIMPLE BITES,EXTREME CHOC","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.15","1","6","4","0","0","0","5120" +"0009376674053","CINNA BONE 2.5# BAG","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16537" +"0009376674072","HUNDCHEN PUPPY FOOD 4#","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13534" +"0009376674098","SG DOG FOOD, CHICKEN CAN","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13543" +"0009376674153","HUND-N-FLOCKEN 15#","28.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13536" +"0009376674170","HUND-N-FLOCKEN 33#","49.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13541" +"0009376674241","WEE BIT DOG FOOD 4#","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13607" +"0009376674301","DOG FOOD MILLENIUM 33#","46.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15275" +"0009376674403","DOG TREATS, LAMB APPEAL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14990" +"0009376674463","CAT FOOD INDIGO MOON 15#","35.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15274" +"0009376674707","DOG TREATS, TINY TOTS 10OZ","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15148" +"0009376675000","WOLF CUB LG BREED PUPPY 4#","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13535" +"0009376675007","WOLF KING LARGE BREED 33#","49.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13542" +"0009376675021","DOG FOOD, SUNDANCER 15#","31.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15792" +"0009393673223","FETA IN OIL ","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5121" +"0009396600013","EGGNOG OG 32Z ORG VAL","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","2.94","1","1","2","0","1","0","5124" +"0009396600015","MILK,OG,HTST FRESH,1%,LF 128Z","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","5.23","1","0","0","0","1","0","5126" +"0009396600017","MILK,OG,HTST FRESH,NONFAT 128Z","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","5.23","1","3","0","0","1","0","5128" +"0009396600022","MILK,OG,UHT,NONFAT 32Z","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","1.78","1","1","2","0","1","0","5130" +"0009396600029","MILK,OG,UHT,CHOC,RDCD FAT 32Z","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","1.96","1","1","2","0","1","0","5132" +"0009396600032","MILK,OG,1%,HTST,FRESH 64Z","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","3.11","1","1","2","0","1","0","5134" +"0009396600034","OV WHIPPING CREAM HALF PINTS","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.3","1","3","0","0","1","0","5136" +"0009396600036","MILK,OG,UHT,LACTOSE FR,LF 32Z","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","1.85","1","1","2","0","1","0","5138" +"0009396600078","JCE,OG,ORANGE,PULP-FR,CAL","7.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.38","1","1","2","0","0","0","5140" +"0009396600080","JCE,OG,ORANGE,PULP FREE","7.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.38","1","3","2","0","0","0","5142" +"0009396600090","MILK,OG,UHT,1%,LF 32Z","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","1.78","1","1","2","0","1","0","5145" +"0009396600141","BEEF JERKY,OG,HICKRY SPC","5.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16659" +"0009396600201","SOY BEVERAGE,OG,VANILLA","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.83","1","1","0","0","0","0","5151" +"0009396600203","COTTAGE CHEESE,OG,4%","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.11","1","1","2","0","1","0","5153" +"0009396600205","SOUR CREAM,OG,4%","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.24","1","1","2","0","1","0","5155" +"0009396600211","ORGANIC VALLEY BLUE CRUMBLES","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.65","1","1","3","0","0","0","5157" +"0009396600216","STRINGLES COLBY JACK","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.13","1","1","3","0","0","0","5159" +"0009396600220","LACT FREE SKIM MILK 64Z","4.59","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","1","0","0","0","0","3.41","1","1","2","0","1","0","5161" +"0009396600223","ASEPTIC MILK,OG,SNGL,CHOC","1.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","4","0","0","0","5163" +"0009396600227","ORGANIC VALLEY MEXICAN BLEND","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.94","1","1","3","0","0","0","5165" +"0009396600232","ASEPTIC MILK, OG,LF 4/8 0Z","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.45","1","6","4","0","0","0","5167" +"0009396600385","ORGANIC VALLEY PASTURE BUTTER","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","26","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","2.5","1","1","0","0","1","0","5170" +"0009396600450","HALF & HALF, OV, FR VAN 16","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.96","1","3","0","0","0","0","16186" +"0009396611310","CHED RAW MILD ORGANIC VALLEY","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","3","0","0","0","5171" +"0009396611330","ORGANIC VALLEY RAW JACK WI ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","3","0","0","0","5173" +"0009396615205","O.V. PARMESAN,OG,SHRED(CUP)","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","3","0","0","0","5175" +"0009396621301","ORGANIC VALLEY FETA","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","3","0","0","0","5177" +"0009396621350","ORGANIC VALLEY MUENSTER","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","3","0","0","0","5179" +"0009396621390","ORGANIC VALLEY PROVOLONE","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","3","0","0","0","5181" +"0009396622330","M JACK RED FAT ORGANIC VALLEY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.07","1","1","3","0","0","0","5183" +"0009396625370","ORGANIC VALLEY MOZZARELLA","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.18","1","1","3","0","0","0","5185" +"0009396633000","BUTTER,OG,SLTD,STICKS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","26","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","4.22","1","0","0","0","1","0","5187" +"0009396645270","OV SHREDDED MOZZARELLA","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.94","1","1","3","0","0","0","5189" +"0009396651015","MILK,OG,WHOLE,HTST,FRESH 64Z","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","3.11","1","1","2","0","1","0","5191" +"0009396651225","MILK,OG,2%,HTST,FRESH 64Z","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","12","0","0","0","3.11","1","1","2","0","1","0","5193" +"0009396661410","DRY MILK,OG,NON-FAT","7.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.35","1","0","4","0","0","0","5197" +"0009396681120","EGGS,OG,GR A,LRG,BROWN","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.33","1","3","2","0","1","0","5200" +"0009396681130","ORG VALLEY X LRG EGGS","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.45","1","3","0","0","1","0","16559" +"0009396690014","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","5204" +"0009396690020","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","5205" +"0009471700350","THE MASTER CLEANSER","6.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","9","0","0","0","5212" +"0009471719834","HEALING WITH WHOLE FOODS ","35","0","0","0","22.79","0","22.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","9","0","0","0","12903" +"0009471729293","BOOK-WHAT DOC WONT TELL M","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.65","1","0","9","0","0","0","5231" +"0009471733628","SPROUTMAN SPROUT CHART","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","5237" +"0009471734504","WHAT YOUR DR...PREME","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","5238" +"0009471735639","DETOX FIVE DZ WAYS","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","5246" +"0009471740261","THE EXPECTANT MOTHERS","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","5253" +"0009471741829","pH Paper Refill","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","9","0","0","0","5262" +"0009471747122","BABY SIGN LANG BASICS","8.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","5271" +"0009471753088","WOMENS BODIES WOMENS WISDOM","20","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","5284" +"0009471754184","COMPOST ","18","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14087" +"0009471754789","COMPLETE COLON CLEANSE","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13525" +"0009471756458","PH HOME TEST KIT","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","9","0","0","0","5297" +"0009471757469","NOURISHING TRADITIONS","27","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","9","0","0","0","5301" +"0009471758119","HEALING WISE","17.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16459" +"0009471759166","PRESCR FOR NUTRL HEALING","29.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12867" +"0009471759747","NUTRITION ALMANAC","21.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14646" +"0009471760530","2 OZ. BLUE GO TOOB","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15604" +"0009471760532","2 OZ. GO TOOB","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15603" +"0009471760534","1.25 oz. BLUE GO TOOB","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15601" +"0009471760536","1.25 oz. GO TOOB","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15599" +"0009471761181","RODALES ORG. GARDENING","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15607" +"0009471761842","PRESCRIPTION FOR NUTRITIONAL H","30","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15232" +"0009471762030","9 DAY LIVER DETOX","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15811" +"0009484125414","NASAL SPRY,SIMILASAN,15ML","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.33","1","1","5","0","0","0","5314" +"0009484125611","SIMILASAN COLD MUCUS RELIEF","10.65","0","0","0","6.99","0","6.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","4.72","1","1","0","0","0","0","15915" +"0009484130024","EYE DROPS #2,ALLERGY EYES","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","6.33","1","6","5","0","0","0","5316" +"0009492200001","JAM BLUEBRY GUNFLT ","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","13832" +"0009492200003","JAM RASP JALAPENO GUNFLT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","13833" +"0009492200007","JAM BLACKBRY GUNFLT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","13834" +"0009492200009","JAM RHUBARB GUNFLT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","14216" +"0009492219949","RELAXITY SINGLE WILD BERRY","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","12911" +"0009492221484","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13226" +"0009492236471","4 lb Org Grapfruit","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","201","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14878" +"0009492247906","BEV,HIBISCUS","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.36","1","6","0","0","0","0","14091" +"0009492247926","OOBA HIBISCUS ","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15959" +"0009492248594","Org Navel Orange bag","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15572" +"0009492255614","IONIC COLLOIDAL SILVER 32 OZ","22.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","5321" +"0009492265298","IONWORKS COL SILV NAS SPRY","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","5323" +"0009492279996","PBLUEBERRIES NON-O PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","5325" +"0009523980080","TEECCINO MOCHA","9.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","5328" +"0009548810003","TRINIDAD EXTRA HOT SAUCE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5330" +"0009568430010","EVAPORATED MILK","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.05","1","1","4","0","0","0","5333" +"0009649910012","PBERRY STRAWBERRY PT","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","5337" +"0009649933353","SORBET,OG,LEMON","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.98","1","1","0","0","0","0","5341" +"0009649933449","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","5343" +"0009693101005","PPOTATO BAG RUSSET","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","5345" +"0009746703057","SOURCE OF LIFE 90T","25.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1","1","3","5","0","0","0","5347" +"0009746703341","NPLUS BONE POWER 90CT","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3","1","0","0","0","0","0","15535" +"0009746704573","SPIRUTEIN STRAWBERRY","24.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5350" +"0009746704841","NPLUS ULTRA HAIR","20.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5352" +"0009746706620","THURS PLANTATION SUPPOSITORIES","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5355" +"0009746706694","THURS PLANT ANTI FUNGAL","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","0","0","0","0","14711" +"0009746706702","NPLUS CINNAMON TOOTHPICKS","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","5359" +"0009746707116","NPLUS BILBERRY","19.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5362" +"0009746707200","ENLISH HAWTHORN","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","3","5","0","0","0","5365" +"0009746707228","MILK THISTLE","23.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1","1","0","5","0","0","0","5367" +"0009746707272","ELEUTHERO SIBERIAN GINSENG","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5370" +"0009746707284","TUMERIC CAP NP","22.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5372" +"0009746707360","NPLUS RED YEAST RICE EXT REL","19.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5374" +"0009746707370","NPLUS REVERATROL 125MG EXTREL","25.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1","1","0","5","0","0","0","5376" +"0009746729948","NPLUS AN PARADE TOOTH FAIRY","19.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","12913" +"0009746729950","NPLUS AN PARADE D3 CHEW 90CT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","0","0","0","0","13170" +"0009746729978","NPLUS AN PARADE IMMUNE BOOSTER","10.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5381" +"0009746729982","NPLUS AN PARADE MULTI 180 CT","21.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1","1","0","5","0","0","0","5383" +"0009746729998","ANIMAL PARADE VIT C","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5385" +"0009746730592","SOURCE OF LIFE CAP","16.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","0","5","0","0","0","5387" +"0009746730597","NPLUS SOURCE O LIFE SHAKE SNG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","5389" +"0009746730735","NPLUS GARDEN D3 VEGAN 5000IU","12.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16574" +"0009746745831","CHOC SPIRUTEEN PKT","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","5392" +"0009746745860","NPLUS ACAI PROTEINPOWDER 1.2LB","32.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1","1","3","5","0","0","0","5394" +"0009746795882","SIMPLY NATUR SPIRUTE","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","5396" +"0009746799639","NPLUS NUTRA SEC CHEW TABS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13171" +"0009792332345","PDATES MEDJOOL 12OZ","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16324" +"0009812901052","ETH NUT THYRO VITAL 6OCT","15.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14969" +"0009830410010","CROUTONS,GARLIC & BUTTER","2.25","0","0","0","1.69","0","1.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","1.28","1","6","4","0","0","0","5400" +"0009830800280","CHICKEN BASE,OG","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.52","1","1","4","0","0","0","5404" +"0009830822581","NO CHICKEN BASE, VEGAN","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.72","1","1","4","0","0","0","5406" +"0010328020000","PPOTATO BAG RED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","5408" +"0011210009202","GREEN PEPPER SAUCE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","13466" +"0013338300900","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","5412" +"0013338301028","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","5414" +"0013499904131","CHEVRE GOAT 4 PEPPR","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5415" +"0016783138045","PFL FRESH BOUQUET","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","5418" +"0018012700050","WATER,COCONUT,NATURAL","2.99","0","0","0","2.39","0","2.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","1.69","1","6","0","0","0","0","14751" +"0018012700052","WATER,COCONUT,BERRY","2.99","0","0","0","2.39","0","2.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","1.69","1","6","0","0","0","0","14749" +"0018085700019","SAJJI BBQ GOUDA","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15906" +"0018233001114","PDAIKON SPROUTS NON-O","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1176","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","5420" +"0018274100059","LADY FINGERS,COCOA","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.87","1","6","0","0","0","0","14439" +"0018274100074","COOKIES,CHOCDRM,MLK CHOC","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.23","1","6","0","0","0","0","14437" +"0018289300006","pMANDARIN SATSUMA BAG","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","779","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13453" +"0018340500007","PET GILL CALM ORANGE 8 0Z","19.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.8","1","0","5","0","0","0","5422" +"0018677000051","ICED FT VANILLA LATTE","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.35","1","6","4","0","0","0","5423" +"0018685200024","TALENTI SEA SALT CRML GLTO","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.2","1","6","0","0","0","0","16441" +"0018685200034","TALENTI DBL DARK CHOC GLTO","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.2","1","6","0","0","0","0","16440" +"0018713200002","ALAFFIA COCONUT OIL CREAM","12.45","0","0","0","9.89","0","9.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","5425" +"0018713200009","ALAFFIA UNSC SHEA BUTTER","10.55","0","0","0","8.39","0","8.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","5427" +"0018713200065","ALAFFIA COCOA BUTTER CREAM","12.45","0","0","0","9.89","0","9.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","5429" +"0018713200151","ALAFFIA NEEM OIL","6.65","0","0","0","5.99","0","5.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","1","0","0","0","0","15636" +"0018713200182","ALAFFIA SHEA FACE TONER","13.95","0","0","0","11.99","0","11.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","5434" +"0018713200501","EDS LOTION LAVENDER 32 OZ","13.99","0","0","0","9.99","0","9.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","5435" +"0018713200506","EDS LAVENDER BODY WASH","13.99","0","0","0","9.99","0","9.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","15025" +"0018713200520","EDS LAVENDER SHAMPOO","13.99","0","0","0","9.99","0","9.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","13883" +"0018713200522","EDS VANILLA MINT SHAMPOO","13.99","0","0","0","9.99","0","9.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","13885" +"0018713200580","EVDAY SHEA BABY SHAMP BWASH","7.99","0","0","0","7.49","0","7.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","1","0","0","0","0","16421" +"0018713200582","EVDAY SHEA BABY BBATH LEMLAV","11.29","0","0","0","9.99","0","9.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","1","0","0","0","0","16424" +"0018713200584","EVDAY SHEA BABY LOTION LAVLEM","7.99","0","0","0","7.49","0","7.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","1","0","0","0","0","16422" +"0018713200621","BCURLS ENHANCING SHAMPOO","11.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15630" +"0018713200631","BCURLS LEAVE IN ENHANCING COND","11.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15627" +"0018713200641","BCURLS DEFINING GEL 8OZ","13.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15634" +"0018713200644","BCURLS DEEP COND TREAT 8OZ","15.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15635" +"0018713200647","BCURLS REVIVING TONIC 10OZ","10.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15629" +"0020000500000","BTAHINI OG RSTD NO SALT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","5440" +"0020003000000","ROASTED CORN & BL BEAN QUESAS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15644" +"0020005000000","BAKERY SPECIAL ORDER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","75","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5442" +"0020007000000","SMOKED TURKEY & BALSAMIC ONION","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15671" +"0020009000000","CRUNCHY RANCH BITES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15689" +"0020011000000","SALSBURY STEAK DINNER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15750" +"0020013000000","BBQ PORTOBELLA QUESADILLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15760" +"0020015000000","SPICY SAUSAGE CALZONE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15767" +"0020017000000","FIRE ROASTED TOMATO CHIC CALZO","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15772" +"0020019000000","SMOKEY BLACKBERRY WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15803" +"0020021000000","EGG SALAD SANDWICH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14148" +"0020023000000","TEA HOT","1.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5446" +"0020025000000","TURKEY & VEGGIECALZONE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15821" +"0020030000000","CHEESE SPECIAL ORDER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","233","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5447" +"0020032000000","RUSTIC INN FRENCH APPLE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15775" +"0020034000000","RUSTIC INN BLUEBERRY PIE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15777" +"0020040000000","MUFFULETTA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15883" +"0020043000000","VEGGIE EGG ROLLS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15890" +"0020045000000","CHICKEN & PEPPER QUESADILLA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15896" +"0020047000000","BROC CHEDDAR BAKED POTATO","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15936" +"0020050000000","JAMAICAN ME CRAZY CHILI QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5448" +"0020052000000","GARLIC PARMESAN PUFFS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16159" +"0020054000000","HONEY CURRY CHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16169" +"0020058000000","garlic & herb wings","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16213" +"0020060000000","COFFEE CARD","-1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5449" +"0020062000000","cola bbq wings","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16253" +"0020064000000","RUSTIC INN PEACH PIE SLICE-HFM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16308" +"0020066000000","TARRAGON BEAN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16413" +"0020068000000","BBQ CHICKEN QUESADILLA GG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16416" +"0020070000000","blackberry pie slice","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16429" +"0020072000000","beef barley soup","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16449" +"0020074000000","cream of spinach mushroom pt","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16460" +"0020076000000","baked chicken breast","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16484" +"0020080000000","BASIL VINEGARETTE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5451" +"0020082000000","italian chicken salad","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16586" +"0020084000000","JERK ROASTED CHICKEN BREAST","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16594" +"0020091000000","MEDITERRANEAN CALZONE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15116" +"0020099000000","CAFE SPECIAL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14499" +"0020117000000","16 OZ COFFEE","2","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15082" +"0020121000000","1/2 EGG SALAD SANDWICH","2.49","3","0.5","2","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","-2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14149" +"0020140000000","SOUP 16 OZ","3.99","3","0.5","2","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","0","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5456" +"0020170000000","SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","0","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5457" +"0020190000000","BRATS W/PEPPERS & ONIONS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15546" +"0020200000000","BARLEY AND CORN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5461" +"0020220000000","BLACK OLIVE DIP","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5462" +"0020230000000","TEA HOT","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5463" +"0020260000000","4 grain salad","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5465" +"0020270000000","CHINESE CHIX CABBAGE SALAD ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5466" +"0020300000000","TEX-MEX CALZONE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15547" +"0020303000000","BCASHEWS ORG RST SLT BAGGED","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","8","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13262" +"0020320000000","DILLY SHRIMP SALAD","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5471" +"0020380000000","RSMRY RSTD POTATOES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5475" +"0020410000000","ROASTED LEEK W/ BACON FRITTATA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5479" +"0020430000000","3 MUSHROOM CALZONE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15544" +"0020450000000","CAULIFLOWER PAPRIKAS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5483" +"0020470000000","CHICKEN PAPRIKASH DINNER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15543" +"0020490000000","RICE NOODLES & TOFU","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5487" +"0020530000000","REINDEER FEED","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15539" +"0020550000000","SANDWICH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5491" +"0020590000000","MISC DELI PRODUCT","0.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5493" +"0020610000000","CRUNCHY FAJITA BITES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","15666" +"0020630000000","PESTO VEGAN","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5497" +"0020650000000","DILLY POTATO SALAD","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5499" +"0020670000000","GREEK POTATO","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5501" +"0020700000000","HOT POTATO CURRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5504" +"0020710000000","HUMMUS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5511" +"0020720000000","JADE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5515" +"0020728000000","PASTURES BABY BACK RIBS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","15743" +"0020731000000","PASTURES PORK TENDERLOIN","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","5518" +"0020737000000","KADEJAN CHICKEN LEGS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","5521" +"0020745000000","COHO SALMON PORTIONS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","5528" +"0020751000000","WHOLE FARM GROUND LAMB","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","5532" +"0020757000000","WHOLE FARM LAMB CHOPS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","5536" +"0020762000000","WHOLE FARM GROUND PORK","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","5540" +"0020767000000","GERBER WHOLE FRYER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","5543" +"0020780000000","CALICO ORZO","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5551" +"0020800000000","ITALIAN SAUSAGE RAVIOLI","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5561" +"0020820000000","QUINOA PASTA","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5563" +"0020830000000","QUINOA SHAZAM","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5565" +"0020850000000","KICHARDI","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5567" +"0020870000000","THREE BEAN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5569" +"0020890000000","WILD RICE PILAF","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5571" +"0020910000000","BREAD STICKS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5573" +"0020930000000","CASHEW CURRY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5575" +"0020970000000","CHOCOLATE COVERED ST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5577" +"0021000000000","HOT SALSA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5578" +"0021001000000","CREOLE TOFU","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5579" +"0021003000000","BEAN & RICE BURRITO W CHEESE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5581" +"0021005000000","HUNAN CHOW MEIN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5583" +"0021007000000","TAPENADE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5585" +"0021009000000","MEDITERRANEAN MEAL - DOLMAS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5587" +"0021011000000","CAJUN PEPPER PASTA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5589" +"0021013000000","CRUNCHY BUFFALO BITES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15669" +"0021015000000","RAMEN CABBAGE CRUNCH","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5593" +"0021017000000","GARLIC SAGE TORT","10.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5595" +"0021019000000","RAVIOLI","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5597" +"0021023000000","TOFU IN PEPPER SC","9.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5599" +"0021025000000","TANDOORI TOFU & VEG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5601" +"0021027000000","ZUCCHINI CASSEROLE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5603" +"0021029000000","OLIVES KALAMATA","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5605" +"0021032000000","GREEK QUINOA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5608" +"0021034000000","CILANTRO TOFU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5610" +"0021036000000","SPINACH MUSHROOM QUESADILLA GG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5612" +"0021038000000","MUSTARD LENTIL SALAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5614" +"0021041000000","CREAMY ZUCCHINI SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5616" +"0021043000000","SOUTH OF THE BORDER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5618" +"0021046000000","YOGURT DILL HUMMUS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5620" +"0021048000000","SPICY THAI NOODLES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","5622" +"0021051000000","TRUFFLES","0.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5624" +"0021053000000","PUMPKIN PENNE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5626" +"0021055000000","SPANISH RICE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5628" +"0021057000000","WALDORF SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5630" +"0021059000000","VEGETABLE PASTA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5632" +"0021061000000","NACHO UNCHEESE DIP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5634" +"0021063000000","CHICKEN AND WILD RICE SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5636" +"0021065000000","COUSCOUS CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5638" +"0021067000000","SESAME NOODLES W/SWEET PEPPERS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5640" +"0021069000000","SOBA SALAD","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5642" +"0021071000000","FESTIVE SWEET POTATO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5644" +"0021073000000","CRANBERRY BEET RELIS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5646" +"0021075000000","GRAVY VEG MUSH CHIX","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5648" +"0021077000000","GREEN BEANS ALMONDIN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5650" +"0021079000000","MAPLE GLAZED CARROTS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5652" +"0021081000000","OLIVES BLACK CERIGNOLA","11.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","5654" +"0021085000000","BLEU CHEESE SLAW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5657" +"0021087000000","RANCH DIP","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5659" +"0021089000000","TEMPEH GOULASH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5661" +"0021091000000","SESAME NOODLES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5663" +"0021095000000","Olives Green Cerignola","9.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5665" +"0021097000000","Olives Med. Mix","8.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5667" +"0021100000000","ARKANSLAW G&G","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5669" +"0021102000000","KALAMATA OLIVE OREGANO HUMMUS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5671" +"0021104000000","HERBED VEG QUICHE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5673" +"0021106000000","FLAV HUMMUS-FOURPEPP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5675" +"0021108000000","FLAV HUMMUS-FRTOMATO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5677" +"0021111000000","TERIYAKI CHICKEN SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","1","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5679" +"0021113000000","6 LAYER DIP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5681" +"0021116000000","GERMAN VEG CHOC CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5683" +"0021118000000","FLAV HUMMUS-GAR/HERB","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5685" +"0021122000000","OLIVES KALAMATA PITTED","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","5687" +"0021124000000","OLIVE AND PEPPADEW MEDLEY TRA","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5689" +"0021130000000","COUSCOUS SHRIMP SALAD","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5691" +"0021132000000","MEMBRILLO","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5693" +"0021136000000","OLIVES LOU PISTOU","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","227","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5696" +"0021140000000","CRANAPPLE HENS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5698" +"0021160000000","12 OZ COFFEE","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","5700" +"0021190000000","COFFEE REFILL","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5702" +"0021201000000","COOKIES","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5705" +"0021203000000","MEDITERRANEAN PINWHEELS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15533" +"0021205000000","CLASSIC MACARONI AND CHEESE","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5709" +"0021240000000","ROASTED SWEET POTATOES & RED O","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5711" +"0021260000000","CHOCOLATE MOUSSE","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","5713" +"0021299000000","TACO SALAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5716" +"0021301000000","THE SAVORY","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5718" +"0021303000000","GOURMET GRILLED CHEESE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5720" +"0021305000000","HILLSIDE GERMAN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5722" +"0021307000000","GRILLED CHEESE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5724" +"0021309000000","GRILLED CALIFORNIA ON 7 GRAIN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5726" +"0021311000000","BSTA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5728" +"0021314000000","DULUTH DIVER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5730" +"0021316000000","FRESH SUPERIOR","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5732" +"0021318000000","TUNA MELT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5734" +"0021320000000","QUICHE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5736" +"0021322000000","RUSTIC INN BLUEBERRY CRUMB","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5738" +"0021324000000","BEANS & RICE BURRITO MIX","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5740" +"0021327000000","TOFU BURRITO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5742" +"0021329000000","TOFU BURRITO W/ CHEESE & SALSA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5744" +"0021350000000","POTATO CAULI CURRY","7.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5746" +"0021370000000","RICE AND DAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5748" +"0021390000000","TOFU STROGANOFF","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5750" +"0021410000000","PENNE PASTA","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5752" +"0021430000000","SAVORY SWISS GRN ONION SCONE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5754" +"0021439000000","GJETOST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5756" +"0021460000000","SPAGHETTI W/GAR TST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5758" +"0021480000000","BAKED TOFU W/PNUT SC","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5760" +"0021500000000","TOFU SPINACH PIE","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5762" +"0021520000000","VEGAN CHOCOLATE CAKE","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5764" +"0021580000000","TUSCAN WHITE BEAN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5767" +"0021610000000","TACO SALAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5769" +"0021630000000","VEGGIE DOG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5772" +"0021650000000","LINGUINI W/RSTD VEGS","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5774" +"0021670000000","HERBED POTATO BN SLD","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5776" +"0021690000000","DILLED GREEN BEANS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5778" +"0021710000000","SUNNY LENTIL SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5780" +"0021730000000","BLACK BEAN FANDANGO","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5782" +"0021750000000","SWEET & SOUR TEMPEH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5784" +"0021770000000","SAMOSAS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5786" +"0021810000000","AIOLI","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5788" +"0021840000000","POTATO POPPERS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5790" +"0021860000000","CURRIED CABBAGE & PEA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5792" +"0021908325019","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","5804" +"0021940000000","EGGPLANT PARMESAN ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5823" +"0021970000000","CREAMY CUCUMBER SALA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5825" +"0021990000000","CAPONATA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5829" +"0022001000000","FRUIT DIP","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5840" +"0022010000000","SPECTACULAR SPINACH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5842" +"0022030000000","DAL MAKHANI","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5844" +"0022070000000","LEMONY BULGUR","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5847" +"0022090000000","PENNE W/TOM & BAS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5849" +"0022130000000","BABAGANOUJ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5851" +"0022150000000","GINGER COCONUT RICE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5853" +"0022180000000","SAVORY VEGGIES AND T","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5856" +"0022210000000","SZECHWAN TOFU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5858" +"0022230000000","DILLED ZUCCHINI","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5860" +"0022250000000","VEGETABLE CURRY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5862" +"0022270000000","VEGGIE COUSCOUS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5864" +"0022290000000","CARIBBEAN STYLE BEAN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5866" +"0022310000000","GARLIC LENTILS & RIC","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5868" +"0022340000000","SQUASH PILAF","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5870" +"0022370000000","TOFU CURRY","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5872" +"0022390000000","THAI BROCCOLI SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5874" +"0022392000000","CUBAN BLACK BEAN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5876" +"0022410000000","NUTTY MILLET & RICE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5878" +"0022430000000","SPICY CHICKPEA & RIC","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5880" +"0022450000000","KUNG PAO TEMPEH","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5882" +"0022470000000","ROASTED POTATOES & PORTOBELLOS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5884" +"0022490000000","ROSEMARY ROASTED SWE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5886" +"0022510000000","BAYOU RED BEANS & RI","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5888" +"0022540000000","INDONESIAN FRIED RICE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5891" +"0022560000000","TROPICAL FRIED RICE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5893" +"0022580000000","BLACK BEAN SUCCOTASH","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5895" +"0022600000000","JAMAICAN JERK","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5897" +"0022620000000","SWEET & SOUR CABBAGE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5899" +"0022640000000","BEEF \"FAJITA\" BURRITO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5901" +"0022660000000","TEMPEH CARROT SAUTE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5903" +"0022680000000","LEBANESE BEAN SALAD","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5905" +"0022700000000","MARINATED MUSHROOMS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5907" +"0022720000000","ITALIAN SAUSAGE & VEG QUICHE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5909" +"0022740000000","RASPBERRY TRIFLE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5911" +"0022770000000","DATE & WALNUT CAKE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5913" +"0022790000000","ROASTED PEPPER PLEASURE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","5915" +"0022810000000","SIZZLING BROC W/TOFU","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5917" +"0022830000000","ROSEMARY OLIVE OIL BREADSTICK","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","1","0","5919" +"0022860000000","ROASTED PEPPER & MUS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5922" +"0022900000000","CHOCOLATE PUDDING CA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5925" +"0022920000000","TUSCAN C.C. SPREAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5927" +"0022970000000","PEACH STREUSEL COFFE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5929" +"0022990000000","APPLE STREUSEL COFFE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5931" +"0023004000000","CITRUS CHICKEN WILD RICE WRAP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15566" +"0023009000000","SWEET POTATO QUINOA FRITTERS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","15684" +"0023023000000","DOUBLE GLOUCESTER","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5944" +"0023031000000","CHEDDAR APPLEWOOD SMKD CARR VA","14.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","1","0","5946" +"0023033000000","MOBAY Carr Valley","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","1","0","5948" +"0023035000000","CARR VALLEY CREMA KASA CHEESE ","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5950" +"0023037000000","CRANBERRY CHIPOTLE CHEDDAR","13.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","5952" +"0023039000000","MOROCCAN ORANGE WALNUT SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","15878" +"0023050000000","SQUASH JULIENNE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5957" +"0023070000000","CURRIED EGGLESS SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5960" +"0023110000000","PEPPERY CHEESE BALLS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5962" +"0023123000000","QUINOA VEG SALAD W/ASPARAGUS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","16517" +"0023140000000","SPUDS & TURNIPS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","5966" +"0023201000000","GORGONZOLA BLACK RIVER","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","0","0","2137","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","3","0","0","0","5971" +"0023210000000","HONEY GRADE A RAW","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","5973" +"0023213000000","CHEDDAR CRANBERRY","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5975" +"0023215000000","YOGURT CHEESE JALAPENO","7.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5977" +"0023217000000","BLACK BEAN AND CORN SALSA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16588" +"0023300000000","TAHINI (PREPACKED)","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","5982" +"0023326000000","FETA IN WATER","7.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5984" +"0023360000000","MILK INSTANT ORGANIC","2.76","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","5986" +"0023403000000","PRIMA DONNA","11.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","5988" +"0023420000000","CASHW BTTR RAW NONO","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","23","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","5990" +"0023432000000","FINI CHEDDAR","8.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14991" +"0023434000000","CRAISY CHICKEN SALAD","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16587" +"0023504000000","MOREL LEEK JACK","13.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","5998" +"0023506000000","BEEMSTER VLASKAAS","13.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6000" +"0023512000000","GOUDA LOW FAT EICHTENS","15.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","1","0","6003" +"0023515000000","GOUDA MUSTARD ","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6006" +"0023517000000","HUNTSMAN","15.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6008" +"0023519000000","MUSTARD MELANGE GOUDA","15.4","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6010" +"0023608000000","PART-SKIM RICOTTA CHEESE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15016" +"0023612000000","BURNING MELANGE GOUDA","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","15017" +"0023715000000","HAVARTI","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","3","0","0","0","6019" +"0023801000000","PARMIGIANO REGGIANO","15.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6021" +"0023803000000","BELLAVITANO","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6023" +"0023805000000","CHEDDAR CAHILL IRISH WHISKEY","19.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6025" +"0023807000000","LACY SWISS","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6027" +"0023815000000","SHREDDED PARMESAN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6030" +"0023890000000","HON DIJON POT SALAD","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","6034" +"0023910000000","DELI SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","74","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6036" +"0023930000000","DELI SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","74","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6038" +"0023950000000","DELI SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","74","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6040" +"0023955000000","BLUEBERRY BANANA MUFFIN JENNY ","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6045" +"0023958000000","BLUE CHEESE AMABLU AMISH","12.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","1","0","6048" +"0023960000000","DELI SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","74","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6050" +"0023970000000","DELI SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","74","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6053" +"0023990000000","DELI SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","74","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6055" +"0023997000000","PBASKET GIFT SMALL","30.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","503","0","1","1","0","0","1152","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6057" +"0024003000000","MOZZARELLA POLLY-O","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6061" +"0024005000000","WFC FRESH MOZZ.","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6063" +"0024007000000","MOZZ SMOKED POLLY-O","8.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6065" +"0024009000000","CILIEGENE FRESH MOZZARELLA","8.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6067" +"0024012000000","CHICKEN BEAN HAM SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15489" +"0024051000000","CAPPUCCINO LATTE 120Z","3","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6069" +"0024053000000","CAFE BREVE 12 OZ","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6071" +"0024055000000","DEPTH CHARGE 12oz","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6073" +"0024057000000","STEAMER 12 OZ","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6075" +"0024059000000","3 RD STREET CHAI 12 oz","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6077" +"0024061000000","CAPPUCCINO LATTE 16 OZ","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6078" +"0024063000000","CAFE BREVE 16 OZ","4","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6080" +"0024065000000","DEPTH CHARGE 16oz","3","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6082" +"0024067000000","FOGGY SPICED MOCHA 16 oz","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6084" +"0024069000000","3 RD STREET CHAI 16 oz","4","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6086" +"0024071000000","ESPRESSO DOUBLE SHOT","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6087" +"0024073000000","HOT CHOCOLATE 12oz","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6088" +"0024075000000","DRINK OF THE MONTH 12 OZ","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6090" +"0024077000000","STEAMER 16 OZ","3","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14702" +"0024079000000","GERMAN CHOCOLATE MOCHA 16 OZ","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14706" +"0024081000000","16 OZ SMOOTHIE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14576" +"0024083000000","HOT CHOCOLATE 16 oz","3","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6093" +"0024085000000","DRINK OF THE MONTH 16 oz","4","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","69","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6095" +"0024152000000","VEG CAPS -OO-","200","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","256","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","6097" +"0024202000000","TURKEY MEATLOAF","9.24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","1","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","15118" +"0024204000000","CHICKEN WILD RICE WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15153" +"0024206000000","TRUFFLE TREMOR","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15166" +"0024208000000","ROASTED SQUASH RED ONION SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15220" +"0024211000000","PROVALONE DOLCE","17.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15201" +"0024213000000","CHOCOLATE TURTLE BREAD","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15215" +"0024215000000","GREEN PASTURES","16.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","6111" +"0024303000000","Garlic Herb Spread","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6117" +"0024311000000","Le ROULE","15.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6119" +"0024401000000","BRIE ST. ANDRE","16.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6121" +"0024404000000","STRING CHEESE EICHTENS BULK","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","6124" +"0024408000000","GRUYERE GRAN CRU","17.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6128" +"0024500000000","PCABBAGE GREEN LOCAL NON-O","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","1","0","1172","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14590" +"0024681000000","TUSCAN CREAM CHEESE SPREAD","9.24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15332" +"0024683000000","CHEVRE CHEESE MONT CHEVER","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6132" +"0024830000000","PSKIRRET ROOT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","1307","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6134" +"0024850000000","PREV ASIAN SALAD","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6136" +"0024870000000","PAPPLE NON-O SALE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1069","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6138" +"0024890000000","PGARLIC PEELED NON-ORGANIC","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","898","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.12","1","0","6","0","0","0","6140" +"0024910000000","PCUT CAULIFLOWER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1171","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6142" +"0024940000000","PCARROTS JUICE 25#","26.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","870","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6144" +"0024970000000","PWSQUASH CUT HUBBARD","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1070","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6146" +"0024990000000","pWATERMELON NON-ORG","0.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","683","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","6148" +"0025001000000","LINGUINE ALFREDO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6150" +"0025003000000","Fantastic Veggie Stir Fry","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6152" +"0025006000000","RED PEPPER ANTIPASTO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6155" +"0025008000000","STUFFED SWEET POTATOES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6157" +"0025010000000","PCUT RED WATERMELON SEEDLESS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1071","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6159" +"0025012000000","EGGPLANT MANICOTTI","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6161" +"0025014000000","WRONG NUMBER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6163" +"0025016000000","SPINACH ENCHILADAS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6165" +"0025018000000","AUTUMN DELIGHT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6167" +"0025020000000","PCUT CANTALOUPE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1073","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6169" +"0025023000000","FOG CITY CHICKEN SALAD","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6172" +"0025025000000","GREEN COCONUT CURRIED TOFU","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6174" +"0025027000000","TOFU STUFFED MUSHROOMS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6176" +"0025029000000","CELEBRATION SLICED STUF ROAST","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6178" +"0025031000000","GRILLED CHICKEN BREAST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6180" +"0025040000000","PCUT ORANGE HONEYDEW MELONS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","0","0","1441","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6182" +"0025060000000","PCUT MELON ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1075","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6184" +"0025080000000","PCUT RED CABBAGE","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","0","0","861","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6186" +"0025100000000","PCUT NAPA CABBAGE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1173","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6188" +"0025108000000","BRUNKOW PEPPER JACK","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6196" +"0025110000000","PBAGGED CELERY STALKS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1062","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6198" +"0025113000000","BRUNKOW RAW MONTEREY JACK","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6201" +"0025118000000","CADY CREEK MARBLE COLBY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6204" +"0025120000000","PSALE APPLES","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1069","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6206" +"0025130000000","PCUT MELON NON-ORGANIC","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6208" +"0025135000000","DANISH BLUE CHEESE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6210" +"0025137000000","PESTO CREAM CHEESE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6212" +"0025139000000","WFC FRESH MOZZARELLA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","72","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6214" +"0025141000000","CREAM CHEESE WITH HONEY AND WA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6216" +"0025143000000","SPICED APPLE CHEESE SPREAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6218" +"0025150000000","PMELON CUT SEEDLESS YELLOW WAT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1074","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6220" +"0025170000000","PCUT RED CABBAGE LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6222" +"0025190000000","PCUT CAULIFLOWER LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6224" +"0025210000000","PSALE CITRUS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1440","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6226" +"0025230000000","PGREEN BEANS LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","845","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","6228" +"0025250000000","PPURPLE BEANS LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","563","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6230" +"0025280000000","PCUT MELON LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6232" +"0025300000000","PREV COLESLAW MIX","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6234" +"0025320000000","PBEAN HARICOT VERT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","842","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6239" +"0025340000000","PPICKLING CUCUMBER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","525","0","0","1","0","0","879","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6241" +"0025360000000","P18 FRUIT TRAY","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","504","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6243" +"0025380000000","PCUT HEIRLOOM WATERMELON LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6245" +"0025400000000","PBASKET TAXABLE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","871","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","6247" +"0025410000000","PRHUBARB","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6248" +"0025430000000","PSALE APPLES LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6250" +"0025450000000","PSHELL PEAS LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6252" +"0025470000000","PSALE PREMIUM APPLES","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1352","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6254" +"0025490000000","PCUT PINEAPPLES NON-ORGANIC","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1290","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6256" +"0025510000000","PSPECIALTY BEANS ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","1339","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6260" +"0025540000000","PROMANO BEANS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","847","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6263" +"0025560000000","PYELLOW BEANS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","848","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","6265" +"0025600000000","PPICKLING CUCUMBER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6268" +"0025610060100","PJU DJINNIS ELIXIR 8","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6270" +"0025640000000","PBASKET GNG","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","503","0","0","1","0","0","1149","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6272" +"0025660000000","PBAGGED CARROTS ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6274" +"0025680000000","PSTIR FRY SPICY","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1199","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6276" +"0025700000000","PBAGGED BABY TURNIPS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","1064","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6278" +"0025730000000","PCUT JICAMA","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","1443","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6281" +"0025750000000","PCUT WINTER SQUASH ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1068","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6283" +"0025770000000","PCUT PAPAYA NON-ORGANIC","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","1133","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6285" +"0025790000000","PCUT WINTER SQUASH LOCAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6287" +"0025810000000","PCUT PAPAYA","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6288" +"0025830000000","PBAGGED CARROTS ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6290" +"0025850000000","PSHELL BEANS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","1156","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6292" +"0025870000000","PCORN BAGGED SCALE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","1305","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6294" +"0025887000000","TORTELLINI & BLUSH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14606" +"0025900000000","PREV ATHENIAN 1/2SAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6297" +"0025920000000","PSALE APPLES NON-ORGANIC","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6299" +"0025940000000","PCOLESLAW MIX","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1354","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","6301" +"0025960000000","PSWEET POTATO FRIES","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","1","0","1071","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6303" +"0025980000000","PHORSERADISH ROOT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","6305" +"0026001000000","LUSCIOUS LEMON","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6307" +"0026012000000","PUMKIN PIE","13.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6317" +"0026014000000","DATE BALLS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6319" +"0026016000000","DELICIOUS MINI TARTS","2.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6321" +"0026018000000","ROOT BEER BAKED BEANS","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","3","0","0","0","6323" +"0026020000000","GRUYERE EMMI","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","6325" +"0026022000000","APPLE PIE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6327" +"0026024000000","TOMATO BASIL FETA SCONE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6329" +"0026026000000","FOG CITY BLACK OLIVE FOCACCIA","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6331" +"0026028000000","VEGAN GINGERBREAD","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6333" +"0026030000000","BUCHERON FRENCH CHEESE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","6335" +"0026032000000","RASP. CHOCO CHEESECAKE BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6337" +"0026034000000","BAKED PUMPKIN DOUGHNUTS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6339" +"0026036000000","GINGER COOKIE TRIFLE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6341" +"0026038000000","HAM & SWISS PINWHEELS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6343" +"0026040000000","TOASTER POCKET","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6345" +"0026042000000","CINNAMON BUTTERMILK CAKE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6347" +"0026045000000","VEGAN CAKE","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6350" +"0026047000000","RASPBERRY LIME CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6352" +"0026049000000","LEMON STRAWBERRY CHEESECAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6354" +"0026052000000","","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6356" +"0026054000000","THICK MINT BROWNIE","7.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6358" +"0026056000000","MALTED MILK BALL CUPCAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6360" +"0026058000000","STRAW.VANILLA CAKE (VEGAN)","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6362" +"0026061000000","GF CITRUS COCONUT CAKE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6364" +"0026063000000","GF PEANUT BUTTER CAKE","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6366" +"0026065000000","VEGAN RASPBERRY CHOCOLATE CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6368" +"0026068000000","BANANA PUDDING","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6370" +"0026071000000","CHOCOLATE ALMOND BROWNIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6372" +"0026075000000","PINEAPPLE COCONUT CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6376" +"0026077000000","BLACK AND BLUE CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6378" +"0026079000000","PEACH STRAWBERRY PIE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6380" +"0026082000000","STRAWBERRY CHOCO CAKE(VEGAN)","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6382" +"0026084000000","SAVORY RED PEPPER BLUE SCONE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6384" +"0026086000000","CHEDDAR GARLIC SCONE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6386" +"0026089000000","MILK CHOCOLATE CUPCAKE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6389" +"0026093000000","CHERRY ALMOND CHEESECAKE BAR","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6392" +"0026095000000","VEGAN BLUEBERRY CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6394" +"0026097000000","HAZELNUT BROWNIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6396" +"0026099000000","STRAWBERRY MANGO CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6398" +"0026102000000","HARVEST BERRY SHORTCAKE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6401" +"0026104000000","HONEY ALMOND CUPCAKES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6403" +"0026106000000","MOCHA HAZELNUT TRIFLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6405" +"0026108000000","GREEK QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6407" +"0026110000000","QUESO MANCHEGO","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","6409" +"0026112000000","SINFUL SEVEN LAYER BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6411" +"0026114000000","CHOCOLATE LAYER CAKE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6413" +"0026116000000","RASPBERRY CHOC CHZCAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14585" +"0026118000000","BAKLAVA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6417" +"0026121000000","ZUCCHINI CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6419" +"0026123000000","RASPBERRY CHOCOLATE TRIFLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6421" +"0026125000000","GF CHOCOLATE HAZELNUT CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6423" +"0026127000000","MILK CHOCO. WALNUT BROWNIE","7.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6425" +"0026131000000","VEGAN STRAW-HAZELNUT CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6428" +"0026133000000","JALAPENO CHEDDAR CORNBREAD","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6430" +"0026136000000","GERMAN CHOCOLATE CAKE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6433" +"0026138000000","MALTED MILK BALL CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6435" +"0026140000000","GOURMANDISE","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","6437" +"0026142000000","NO BAKE OATMEAL BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6439" +"0026144000000","CHOCOLATE NUT TOFFEE BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6441" +"0026147000000","GF CHOCOLATE CHIP PECAN TRIFLE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6444" +"0026148000000","BUTTERSCOTCH PUDDING","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6446" +"0026151000000","CHOCOLATE TRIFLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6448" +"0026153000000","GF CAKE W/MILK CHOC","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6450" +"0026155000000","WALNUT FUDGE ","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6452" +"0026157000000","ESPRESSO CHOC TRIFLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6454" +"0026159000000","SUNSHINE CAKE (SUGAR-FREE)","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6456" +"0026162000000","STRAW ALMOND CHZ CAKE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6458" +"0026164000000","PUMPKIN CHZ CAKE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6460" +"0026166000000","VEGAN HINT O MINT CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6462" +"0026168000000","VEGAN GERMAN CHOC CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6464" +"0026171000000","ALTERNATIVE ENERGY BARS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6466" +"0026173000000","SUMMER BERRY COBBLER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6468" +"0026176000000","STRAW/BLACKBERRY CHZ CAKE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6471" +"0026178000000","ITALIAN ARTICHOKE QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6473" +"0026182000000","DOUBLE BERRY ALMOND CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6476" +"0026184000000","GF CHOCOLATE HAZELNUT TORTE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6478" +"0026186000000","FONTINA/WALNUT QUICHE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6480" +"0026188000000","STRAW/CREAM TART","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6482" +"0026191000000","GF CHOCOLATE ALMOND CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6484" +"0026194000000","GF LEMON ALMOND CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6487" +"0026198000000","GF CHOCOLATE CHIP WAL COOKIE","7.4","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6491" +"0026200000000","PARMESAN REGGIANITO","9.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","6493" +"0026202000000","CRANBERRY PECAN BARS","8.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6495" +"0026205000000","STRAW/LEMON CHZCAKE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6497" +"0026208000000","SMOKED CHED POTATO QUICHE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6500" +"0026210000000","PARMESAN WEDGE BELGIOIOSO","10.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","6502" +"0026212000000","TRES LECHES CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6504" +"0026214000000","CHOCOLATE ALMOND CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6506" +"0026217000000","CHEWY CHOCOLATE COOKIES","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6509" +"0026219000000","PEACH BERRY PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6511" +"0026221000000","PEANUT BUTTER CREAM CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6513" +"0026223000000","CHOCOLATE DECADENCE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6515" +"0026225000000","10 DOLLAR TRUFFLE COMPANY","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","6517" +"0026228000000","PB CHOC/CREAM CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6519" +"0026232000000","COTSWOLD","16.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6523" +"0026234000000","BLUEBERRY ALMOND CHZCAKE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6525" +"0026245000000","BLONDIES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6528" +"0026250000000","SWISS EMMENTALER EMMI","9.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6530" +"0026257000000","MINI GREEK PIZZA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6533" +"0026262000000","COCONUT LIME CHZCAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6536" +"0026264000000","HAZELNUT GANACHE CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6538" +"0026266000000","SCOTCHEE BARS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6540" +"0026268000000","RUSTIC INN CRAN-APPLE CRUMBLE","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6542" +"0026270000000","HAVARTI HRSRDSH CHV","8.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","1","3","0","0","0","6544" +"0026272000000","SPIN/MUSHROOM QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6546" +"0026274000000","COCONUT CREAM CHZ CAKE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6548" +"0026276000000","GF STRAWBERRY CREAM CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6550" +"0026281000000","VEGAN PEANUT BUTTER CHOC CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6555" +"0026284000000","ALMOND MOCHA COOKIE PARFAIT","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6557" +"0026286000000","COCONUT LEMON CAKE (VEGAN)","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6559" +"0026288000000","VEGAN COFFEE MINT BROWNIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6561" +"0026291000000","PUMPKIN BARS","10.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6563" +"0026294000000","CRAN/WILD RICE GINGERBREAD","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6566" +"0026297000000","TRIPLE CHOCOLATE TRUFFLES","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6569" +"0026301000000","ESPRESSO PARFAIT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6572" +"0026304000000","ORANGE RAZZ PARFAIT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6575" +"0026306000000","LEMON RASPBERRY CHEESECAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6577" +"0026308000000","ALMOND TOFFEE BAR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6579" +"0026312000000","PUMPKIN COOKIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6582" +"0026316000000","COCONUT TAPIOCA PARFAIT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6586" +"0026318000000","RAISIN BREAD PUDDING","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6588" +"0026326000000","ECLAIR STRAWBERRY SHORTCAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6595" +"0026328000000","CRANBERRY GINGER CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6597" +"0026332000000","BROKEN BONE COOKIE ","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6600" +"0026335000000","BACON WILD RICE QUICHE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6603" +"0026343000000","CRANBERRY","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6610" +"0026345000000","GF REALLY GOOD BARS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6612" +"0026347000000","SAUSAGE AND ARTICHOKE QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6614" +"0026351000000","GINGERBERRY CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6617" +"0026355000000","PEACH CUSTARD PIE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6621" +"0026358000000","MILLION DOLLAR TRUFFLE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","6624" +"0026362000000","CHIPOTLE CHEDDAR CORNBREAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6627" +"0026364000000","BLUEBERRY PEACH PIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6629" +"0026368000000","MEGA BERRY PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6633" +"0026371000000","GF CHEDDAR GARLIC CORNBREAD","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6635" +"0026373000000","HARVEST BERRY CHEESECAKE","8.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6637" +"0026375000000","SAVORY SPINACH FETA SCONE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6639" +"0026377000000","ANGEL FOOD W/ RHUBARB SAUCE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6641" +"0026380000000","MINI MUFFINS","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6644" +"0026382000000","BAG OF MINI-MUFFINS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6646" +"0026385000000","BROWNIE TRIFLE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6649" +"0026389000000","NEOPOLITAN CHEESECAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6653" +"0026391000000","LEMON DREAM PARFAIT","8.99","0","0","0","7.99","0","7.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","3","0","0","0","6655" +"0026393000000","GF DOUBLE CHOCOLATE COOKIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6657" +"0026395000000","GF PEANUT BUTTER CHOC CHIP ","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6659" +"0026397000000","GREEK HERB SAVORY SCONE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6661" +"0026399000000","VEGAN ORANGE CREAM CUPCAKES","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6663" +"0026402000000","CHOCOLATE PEANUT BUTTER PIE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6665" +"0026404000000","PEANUT BUTTER COOKIE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6667" +"0026406000000","CHEESY HERB SCONE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6669" +"0026411000000","CHOC/STRAW CHZ CAKE TART","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6671" +"0026413000000","GF VEGAN CHOCOLATE CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6673" +"0026415000000","GF LEMON ALMOND CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6675" +"0026417000000","CARAMEL SHORTBREAD W/SALT","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6677" +"0026421000000","CHOCOLATE ECLAIR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6679" +"0026423000000","BANANA ALMOND CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6681" +"0026425000000","FOG CITY BASIL FOCACCIA","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6683" +"0026427000000","PARMESAN RED PEPPER CORNBREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6685" +"0026429000000","CHOCOLATE GINGER BROWNIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6687" +"0026434000000","BUTTERNUT SQUASH PIE","3.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6691" +"0026437000000","HAZELNUT CHEESECAKE TART","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6694" +"0026442000000","TURTLE BROWNIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6698" +"0026444000000","CHOCOLATE CHERRY BROWNIE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6700" +"0026446000000","LEMON CHEESECAKE BAR","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6702" +"0026448000000","RUSTIC INN CHERRY PIE PIECE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6704" +"0026451000000","LIL STRAW/ALMOND CAKE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6706" +"0026453000000","DOUBLE BERRY CAKE (VEGAN)","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6708" +"0026455000000","ALMOND CUPCAKES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6710" +"0026459000000","COCONUT ALMOND CUPCAKE VEGAN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6713" +"0026461000000","STRAWBERRY RHUBARB CRISP","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6715" +"0026463000000","MANGO COCONUT CHEESECAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6717" +"0026465000000","BLUEBERRY PEACH COBBLER","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6719" +"0026471000000","SWEET POTATO PIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6722" +"0026481000000"," LEMON PIE","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6724" +"0026483000000","CRANBERRY APPLE PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6726" +"0026485000000","PUMPKIN MARBLE CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6728" +"0026487000000","GINGERBREAD w/LEMON CURD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6730" +"0026489000000","VEGAN BROWNIES","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6732" +"0026494000000","SPICED PEAR CAKE (VEGAN)","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6735" +"0026501000000","BANANA WHITE CHOC. GANACHE PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6741" +"0026511000000","BRIE DELICE BOURGOGNE","15.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6743" +"0026520000000","BABY SWISS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","6749" +"0026523000000","GRAFTON 2 YEAR CHEDDAR","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6752" +"0026526000000","GRAFTON 4 YEAR CHEDDAR","18.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15510" +"0026580000000","HALLOUMI CHEESE","22.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6757" +"0026621000000","PROVOLONE- UNSMOKED","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6759" +"0026650000000","SWISS DOMESTIC","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","6760" +"0026666000000","BANANA WALNUT CAKE","7.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6763" +"0026669000000","SWEET RASPBERRY CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6766" +"0026671000000","VEGAN STRAWBERRY HAZELNUT CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6768" +"0026673000000","RASPBERRY APPLE CRISP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6770" +"0026675000000","PARMESAN SWISS CORN BREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6772" +"0026678000000","RASP MILK CHOCO CHEESECAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6775" +"0026681000000","STRAWBERRY VANILLA CREAM PIE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6777" +"0026684000000","PEACHES-N-CREAM CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6779" +"0026686000000","CHOCOLATE HEAVEN CREAM PIE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6781" +"0026688000000","LEMON-COCONUT BAR","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6783" +"0026691000000","CINNAMON PEACH CAKE (VEGAN)","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6785" +"0026693000000","RASPBERRY RHUBARB CRISP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6787" +"0026695000000","CINNAMON CAKE WITH APPLE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6789" +"0026697000000","ROASTED BANANA. CHZ CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6791" +"0026699000000"," BLUEBERRY COFFEE CAKE (GF)","8.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6793" +"0026701000000","JALAPENO CORN BREAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6795" +"0026703000000","BANANA PINEAPPLE NUT BREAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6797" +"0026705000000","QUINOI","2.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6799" +"0026708000000","PINK VELVET CUPCAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6802" +"0026711000000","FRESH PEACH CHEESECAKE","10.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6805" +"0026720000000","CEDAR GROVE ORGANIC CHEDDAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6807" +"0026722000000","LIME TART W/BLACKBERRIES","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6809" +"0026725000000","CHOCOLATE CREAM CUPCAKES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6812" +"0026727000000","BLUE RASPBERRY OATMEAL BARS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6814" +"0026729000000","FLOURLESS CHOCO.WALNUT(GF)","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6816" +"0026732000000","LEMON CURD SHORTBREAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6819" +"0026735000000","APPLE CHEDDAR WALNUT TART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6822" +"0026737000000","CHEWY GRANOLA BARS","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6824" +"0026739000000","TOMATO BASIL PINENUT QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6826" +"0026741000000","MEGA BERRY CRISP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6828" +"0026743000000","GF CHIPOLTE CORNBREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6830" +"0026745000000","VEGAN CHOCOLATE BLUEBERRY CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6832" +"0026748000000","ZUCCHINI PARMESAN QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6835" +"0026752000000","CHICKEN FAJITA SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6839" +"0026754000000","CHERRY PIE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6841" +"0026756000000","COCONUT CREAM CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6842" +"0026758000000","PEPPERMINT BARK","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6844" +"0026761000000","STRAWBERRY TART","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6847" +"0026763000000","GF RASPBERRY CHOCOLATE CAKE","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6849" +"0026765000000","CHOCO PEPPERMINT CUPCAKES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6851" +"0026767000000","POUND CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6853" +"0026769000000","SWEET SAMPLER HOLIDAY TRAY","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6855" +"0026771000000","CHOCOLATE PEANUT CLUSTERS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6857" +"0026773000000","DOUBLE BERRY ALMOND CUPCAKES","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6859" +"0026775000000","SPICED APPLE WALNUT VEGAN CAKE","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6861" +"0026777000000","VANILLA CUPCAKE W/ RASPBERRY","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6863" +"0026779000000","SPINACH FETA SCONE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6865" +"0026782000000","RASPBERRY SWIRL CHEESECAKE BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6867" +"0026785000000","PUMPKIN GINGER CHEESECAKE BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6870" +"0026788000000","HERBED CHARD & PARMESAN QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6872" +"0026791000000","BLUE BACON ONION QUICHE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6874" +"0026793000000","CARAMEL APPLE PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6876" +"0026795000000","GF GINGERBREAD COOKIES","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6878" +"0026797000000","NEW YORK CHEESECAKE","10.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6880" +"0026799000000","PB DARK CHOC. CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6882" +"0026801000000","LEMON MERINGUE PIE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6884" +"0026803000000","BLUEBERRY ALMOND CAKE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6886" +"0026805000000","VEGAN ORANGE ALMOND CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6888" +"0026808000000","ROASTED GARLIC ROSEMARY QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6891" +"0026815000000","SUN-DRIED TOMATO SPINACH FETA","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6898" +"0026817000000","DONNAY ORGANIC CHEVRE","12.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","1","0","6900" +"0026820000000","CHOCOLATE ORANGE CUPCAKE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6903" +"0026823000000","VEGAN CHOCO. ALMOND COOKIES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6906" +"0026826000000","BLUEBERRY LEMON PIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6909" +"0026829000000","MAPLE PECAN CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6912" +"0026831000000","GINGER PEAR CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6914" +"0026834000000","PUMPKIN SPICE CHEESECAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6917" +"0026836000000","CRANBERRY PECAN SPICE CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6919" +"0026838000000","CHOCO. VANILLA FILLED CUPCAKES","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6921" +"0026842000000","APPLE PIE","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6925" +"0026845000000","WALNUT GOAT CHEESE SPINACH","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6927" +"0026847000000","CRANBERRY RICE PUDDING","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6929" +"0026849000000","SPICE CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6931" +"0026852000000","PUMPKIN CREAM CHEESECAKE","23.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6933" +"0026855000000","CRANBERRY GINGER CHOC. CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6935" +"0026858000000","PUMPKIN ROLL","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6938" +"0026862000000","LEMON PUDDING","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6941" +"0026864000000","LEMON CHEESECAKE W/BLUEBERRIES","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6943" +"0026867000000","RASPBERRY CHOCOLATE CHEESECAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6946" +"0026872000000","HAZELNUT CHOCO GANACHE TART","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6950" +"0026874000000","CHOCOLATE SHORTBREAD COOKIES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6952" +"0026876000000","WHITE CHOC. PUMPKIN CHEESECAKE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6954" +"0026878000000","CHOC CHIP OATMEAL WALNUT COOKI","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6956" +"0026882000000","HOLIDAY SAMPLER TRAY","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6959" +"0026884000000","STRAWBERRY SWIRL CHEESECAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","6961" +"0026886000000","DARK CHOCOLATE TRUFFLES","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6963" +"0026888000000","FLOURLESS CHOC CAKE W/ GANACHE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6965" +"0026892000000","SUGAR COOKIES ","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6968" +"0026894000000","APPLE CINNAMON CAKE ( VEGAN)","8.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6970" +"0026896000000","SPINACH SAUSAGE QUICHE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6972" +"0026898000000","PINEAPPLE UPSIDE DOWN CAKE","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6974" +"0026901000000","SAUSAGE AND VEGETABLE QUICHE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6976" +"0026903000000","BUTTERMILK CARDAMOM PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6978" +"0026906000000","FLOURLESS CHOCOLATE-PEAR TART","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6981" +"0026908000000","CRANBERRY UPSIDE DOWN CAKE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6983" +"0026912000000","CHEESY WILD RICE CORNBREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6986" +"0026914000000","VEGAN CHOCO STRAWBERRY CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6988" +"0026916000000","CHOCO ORANGE CUPCAKE (VEGAN)","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6990" +"0026920000000","FLOURLESS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","6993" +"0026925000000","CORN","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6996" +"0026928000000","FRENCH SILK CHOCOLATE PIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","6999" +"0026930000000","GF TRIPLE CHOC. COOKIES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7001" +"0026932000000","GF PECAN CHOCOLATE CHUNK","8.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7003" +"0026934000000","CHOCOLATE PEANUT-BUTTER BALLS","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7005" +"0026936000000","SPINACH FETA TOMATO QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7007" +"0026938000000","Italian Sausage and Polenta","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7009" +"0026941000000","VEGAN CHOCOLATE SPICE CAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7011" +"0026944000000","MAPLE CREAM CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7014" +"0026947000000","MEXICAN WEDDING CAKES","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7017" +"0026950000000","CEDAR GROVE ORG. PEPPERJACK","9.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","1","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7020" +"0026952000000","APPLE CRANBERRY CRISP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7022" +"0026955000000","HARVEST COOKIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7025" +"0026957000000","PEPPERONI & SALAMI STROMBOLI","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7027" +"0026964000000","ITALIAN CALZONE ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7030" +"0026969000000","COCONUT CREAM PIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7033" +"0026972000000","MUSHROOM AND SWISS QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7036" +"0026974000000","GF MILK CHOCO PB COOKIE TRIFLE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7038" +"0026977000000","ROAST BANANA CHOC. CHZECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7041" +"0026979000000","OATMEAL COOKIE BAR","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7043" +"0026982000000","LAVENDER BISCUITS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7045" +"0026985000000","LEMON CURD CHEESECAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7048" +"0026987000000","WHITE CHOCO LEMON CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7050" +"0026990000000","VANILLA CHOCOLATE CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7053" +"0026992000000","TROPICAL CARROT CAKE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7055" +"0026994000000","PEACE LOVE CHOCOLATE 15 PACK","24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7057" +"0026996000000","59% DARK CHOCOLATE CORDILLERA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7059" +"0027000000000","FRESH GROUND BISON","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7061" +"0027002000000","HALF ROAST BEEF AND CHEDDAR","3.49","3","0.5","2","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","-2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7063" +"0027004000000","TURKEY & SPINACH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7065" +"0027006000000","SOUTHWEST SMOKED TURKEY SAND","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7067" +"0027008000000","HALF TURKEY AND SPINACH SANDWI","2.99","3","0.5","2","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","-2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7069" +"0027011000000","ROAST BEEF & CHEDDAR","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7072" +"0027013000000","VEGGIE HUMMUS WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7074" +"0027015000000","SANDWICH OF THE MONTH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7076" +"0027017000000","CLUB SANDWICH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7078" +"0027019000000","RACHEL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7080" +"0027021000000","TUSCAN TUNA WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7082" +"0027023000000","CURRIED CHICKEN WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7084" +"0027025000000","Apricot Almond Chicken Wrap","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7086" +"0027027000000","BLACKENED CHICKEN WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7088" +"0027029000000","FOG CITY CHICKEN WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7090" +"0027031000000","DELI TUNA WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7092" +"0027033000000","TEMPEH CHICKLESS WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7094" +"0027035000000","JERK CHICKEN WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7096" +"0027037000000","AWESOME CHICKEN WRAPS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7098" +"0027039000000","GF TUSCAN TUNA WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7100" +"0027041000000","GF CRANBERRY TUNA WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7101" +"0027050000000","NORTHSTAR BISON KABOB MEAT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7103" +"0027062000000","BISON LIVER, NORTHSTAR","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7106" +"0027090000000","BISON SIRLOIN ROAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7112" +"0027110000000","THOUSAND HILLS PRIME RIB ROAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13405" +"0027122000000","ALMOND CHICKEN SANDWICH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7117" +"0027124000000","CRANBERRY TUNA SANDWICH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7119" +"0027126000000","TARRAGON CHICKEN SANDWICH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7121" +"0027128000000","FIESTA LIME SANDWICH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7123" +"0027130000000","BEELER SPIRAL CUT HAM","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16316" +"0027132000000","Deli Chicken Sandwich","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7127" +"0027136000000","BEELER BACK RIBS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16300" +"0027151000000","VLY NTL FRESH GRND BEEF 85","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16209" +"0027161000000","VLY NTL FRESH BEEF FLNK STK","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16211" +"0027171000000","VLY NTL FRESH BEEF STEW MEAT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16210" +"0027181000000","THOUSAND HILLS MARROW BONES","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7140" +"0027208000000","GRILLLED ITALIAN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7144" +"0027222000000","VLY NTL FRESH GROUND LAMB","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","7148" +"0027225000000","VLY NTL FRESH GRND BISON","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16214" +"0027227000000","VLY NTL FRSH BEEF SRLOIN RST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16341" +"0027231000000","PASTURES FRESH SMOKED HAM","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7151" +"0027240000000","PASTURES FRESH BNLS HAM RST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7154" +"0027249000000","PASTURES SHOULDER ROAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14609" +"0027251000000","PASTURES FRESH PORK STEAK","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7157" +"0027257000000","PASTURES PORK CHOPS SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7160" +"0027261000000","PASTURES GROUND PORK SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7162" +"0027271000000","PASTURES SMOKED BRATS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7164" +"0027273000000","PASTURES POLISH SAUSAGE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7166" +"0027276000000","PASTURES SMKD BRKFST LINKS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","15206" +"0027282000000","PASTURES SPARERIBS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7170" +"0027310000000","PASTURES FRESH PORK TENDERLOIN","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7174" +"0027340000000","PASTURES FRESH UNCURED BACON","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7177" +"0027351000000","PASTURES HOT DOGS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7179" +"0027390000000","BEEF GROUND ALL NATURAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7184" +"0027410000000","SALMON FILLET","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","7186" +"0027412000000","BODIN LK SUPERIOR TROUT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7188" +"0027414000000","BODIN LK SUPERIOR WHITEFISH","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7190" +"0027420000000","KADEJAN FRESH S/B BREAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","7192" +"0027431000000","KADEJAN B/I TURKEY BREAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15072" +"0027450000000","ROGOTSKE SALMON PORTIONS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","7196" +"0027455000000","","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","0","0","0","0","0","0000-00-00 00:00:00","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","15462" +"0027470000000","BEELER QTR HAM","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","7198" +"0027480000000","PASTURES MILD ITALIAN SAUSAGE","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7202" +"0027490000000","PASTURES MILD ITALIAN LINKS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7204" +"0027499000000","PASTURES BULK ITALIAN SPECIAL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7206" +"0027510000000","GR. LAMB WHOLE FARMS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","7208" +"0027550000000","PORCHETTA ROAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13838" +"0027570000000","WHOLE FARM LAMB CHOPS ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7213" +"0027601000000","LIME COCONUT TART","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7218" +"0027603000000","DARK CHOCOLATE PUDDING","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7220" +"0027606000000","LEMON LAYER CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7222" +"0027608000000","GINGER BROWNIES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7224" +"0027611000000","RASPBERRY ALMOND","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7227" +"0027613000000","CHOCOLATE PECAN BARS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7229" +"0027616000000","PEACH CRUMBLE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7231" +"0027618000000","CHEESE BURGER-TO-GO","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15580" +"0027620000000","GROUND PORK","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7235" +"0027622000000","CHERRY LEMON PIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7237" +"0027624000000","CRAN- APPLE CRISP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7239" +"0027626000000","COCONUT CREAM CUPCAKES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7241" +"0027628000000","LEMON ALMOND CAKE ( VEGAN)","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7243" +"0027631000000","SAUSAGE JALAPENO QUICHE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7246" +"0027633000000","MACAROONS GF VEGAN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7248" +"0027635000000","RHUBARB CUSTARD PIE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7250" +"0027637000000","VEGGIE POT PIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7252" +"0027639000000","CHOCOLATE DE CREME PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7254" +"0027642000000","ROASTED VEGGIE QUICHE","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7257" +"0027644000000","CHOCOLATE CARMEL SLICE","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7259" +"0027646000000","FIRECRACKER CHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15617" +"0027649000000","TRIPLE BERRY CUPCAKES","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7264" +"0027651000000","VEGAN LEMON POPPY SEED CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7266" +"0027653000000","BACON FRESH HERB QUICHE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7268" +"0027655000000","POMEGRANATE MASCARPONE PUFFS","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7270" +"0027657000000","VEGAN PUMPKIN PIE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7272" +"0027659000000","THE BEST CHOCOLATE CHIP COOKIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7274" +"0027662000000","WALNUT CREAM CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7277" +"0027664000000","BANANA BREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7279" +"0027666000000","INSIDE OUT CARROT CAKE COOKIES","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7281" +"0027668000000","COCONUT CHOC. MOUSSE (VEGAN)","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7283" +"0027670000000","GERBER WHOLE FRYER","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","0","0","7285" +"0027673000000","CINNAMON ROLL BREAD PUDDING","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7288" +"0027675000000","CORN MUFFINS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7290" +"0027677000000","RUSTIC ALMOND BREAKFAST CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7292" +"0027679000000","POTS DE CREME (GF)","10.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7294" +"0027683000000","DOUBLE CHOCOLATE ALMOND CAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7297" +"0027685000000","GF MILK CHOC COOKIE TRIFLE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","600","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","7299" +"0027687000000","VEGAN ALMOND CHOC CHIP COOKIES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7301" +"0027689000000","HARVEST COOKIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7303" +"0027691000000","GF CHOCO PB COOKIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7305" +"0027693000000","RASPBERRY PEACH OATMEAL BAR","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7307" +"0027695000000","APPLE SPICE CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7309" +"0027698000000","VEGAN STRAWBERRY CHOCO CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7312" +"0027701000000","TWO POTATO BISQUE QT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7315" +"0027703000000","GF WHOOPIE PIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7317" +"0027705000000","BANANA OAT BARS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7319" +"0027708000000","Ks PUMPKIN PIE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7322" +"0027710000000","CHOCOLATE ORANGE CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7324" +"0027712000000","BRIOCHE CUSTARD TART","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7326" +"0027715000000","GF HARVEST BERRY PIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7329" +"0027717000000","RASP. LEMON CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7331" +"0027721000000","BLUE-ORANGE CHEESECAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7335" +"0027723000000","ORANGE ALMOND CREAM CAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7337" +"0027725000000","FLOURLESS CHOCO RASPBERRY","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7339" +"0027727000000","WHOLE KEY LIME PIE","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7341" +"0027729000000","CHOCOLATE WALNUT BISCOTTI","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7343" +"0027731000000","RUSTIC INN PEACH PIE SLICE","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7345" +"0027733000000","RUSTIC INN PUMPKIN PIE","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7347" +"0027735000000","RUSTIC INN RASPBERRY CREAM PIE","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7349" +"0027737000000","CHOCOLATE PB PIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7351" +"0027739000000","PEPPERMINT PATTY CHEESECAKE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7353" +"0027741000000","BLACKBERRY PEACH CRISP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7355" +"0027743000000","RUSTIC INN STRAWBERRY RHUBARB","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7357" +"0027745000000","LEMON POPPY SEED BUNDT CAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7359" +"0027747000000","RUSTIC INN 5-LAYER CHOCOLATE ","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7361" +"0027749000000","RUSTIC INN BLACKBERRY PIE","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7363" +"0027751000000","SPICED PUMPKIN CHEESECAKE ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7365" +"0027753000000","CLASSIC PUMPKIN PIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7367" +"0027755000000","ASSORTED COOKIE TRAY","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7369" +"0027757000000","ALMOND GANACHE CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7371" +"0027759000000","RUSTIC INN PECAN PIE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7373" +"0027762000000","RUSTIC INN BLUEBERRY CREAM","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7376" +"0027764000000","MARBLE CHEESECAKE BAR (GF)","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7378" +"0027766000000","DARK CHOCOLATE TRUFFLE CAKE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7380" +"0027768000000","CHOCOLATE COVERED STRAWBERRIES","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7382" +"0027771000000","GARLIC CHIVE BISCUIT (VEGAN)","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7385" +"0027774000000","RUSTIC INN 5-LAYER CHOC. SLICE","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7387" +"0027779000000","MANGO VANILLA CHEESECAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7392" +"0027781000000","CHERRY CASHEW FUDGE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7394" +"0027783000000","VEGAN RHUBARB RASP. CUPCAKE ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7396" +"0027785000000","FROSTED SHORTBREAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7398" +"0027787000000","WHOOPIE PIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7400" +"0027789000000","RUSTIC INN RHUBARB","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","7402" +"0027791000000","VEGAN CARROT COCONUT CAKE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7404" +"0027793000000","RUSTIC INN NORTH SHORE BERRY","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14335" +"0027801000000","APPLEGATE NATURAL MEATS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","76","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7407" +"0027820000000","FERNDALE TURKEY TENDERLOIN","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14356" +"0027822000000","FERNDALE TURKEY BREAST","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15285" +"0027880000000","KADEJAN FRESH WHOLE CHICKEN","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7419" +"0027910000000","KADEJAN FRESH GRND CHICKEN","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7424" +"0027930000000","KADEJAN FRESH CHICKEN THIGHS ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7426" +"0027951000000","KADEJAN MNGO HBNRO BRAT","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","16487" +"0027970000000","KADEJAN FRESH GRND TURKEY","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","7432" +"0028001000000","","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7438" +"0028003000000","DOTTIES POTATO SALAD","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7440" +"0028005000000","DILLY POTATO SALAD GG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7442" +"0028007000000","ORANGE SALMON CAESAR SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7444" +"0028009000000","TOMATO BISQUE W/FENNEL SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7446" +"0028011000000","BLUE PEAR SALAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7448" +"0028013000000","ITALIAN CHICKEN AND SAUSAGE QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7450" +"0028015000000","CHICKEN NOODLE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7452" +"0028017000000","ENCHILADA PIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7454" +"0028019000000","CURRIED EGGPLANT W/CASHEWS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7456" +"0028021000000","WHOLE PIZZA MEAT AND 2 VEG","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7458" +"0028023000000","PERFECT PROTEIN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7460" +"0028025000000","SMOTHERED BEANS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7462" +"0028028000000","MOROCCAN CARROT SPREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7465" +"0028030000000","COUSCOUS W/FAVA","8.24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7467" +"0028033000000","CREAM OF BOK CHOY QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7469" +"0028035000000","GLAZED CARROTS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7471" +"0028037000000","BAKED PECAN YAMS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7473" +"0028039000000","AVAILABLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7475" +"0028041000000","AUTUMN DELIGHT SOUP QUART","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7477" +"0028043000000","PORTABELLO GRAVY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7479" +"0028045000000","SPICY GREEN BEANS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7481" +"0028047000000","KUNG PAO CHICKEN","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7483" +"0028049000000","GARLIC MASHED POTATOES ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7485" +"0028054000000","QUICHE LORRAINE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7488" +"0028057000000","MUSHROOM BARLEY SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7490" +"0028059000000","SMOKEY BLACK BEAN SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7492" +"0028061000000","SMOKEY BLACK BEAN SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7494" +"0028066000000","FOG CITY TUNA SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7496" +"0028068000000","CELERY SOUP PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7498" +"0028070000000","BOW THAI PASTA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7500" +"0028073000000","ROASTED TOMATILLO SALSA","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7502" +"0028075000000","SWEET POTATO SOUFLE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7504" +"0028077000000","VEGETABLE QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7506" +"0028081000000","SAUTEED MUSHROOM TEMPEH W/RICE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7508" +"0028083000000","MEDITERRANEAN QUICHE","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7510" +"0028085000000","ASIAN GREENS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7512" +"0028087000000","RASPBERRY BEETS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7514" +"0028089000000","RASPBERRY BASIL CHICKEN BREAST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7516" +"0028091000000","MINESTRONE W/KALE SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7518" +"0028093000000","RED CURRY CHICKEN WILD RICE PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7520" +"0028095000000","CREAM OF VEGETABLE SOUP PT.","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7522" +"0028097000000","ORZO W/SPINACH & FETA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7524" +"0028099000000","BLUEBERRY WILD RICE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7526" +"0028101000000","ARTICHOKE TRIANGLES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7528" +"0028103000000","HONEY SOY FLANK STEAK RIBBONS","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7530" +"0028105000000","YAM MILLET CAKES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7532" +"0028107000000","TURKEY MEATLOAF","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7534" +"0028109000000","SPLIT PEA W/ HAM ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7536" +"0028112000000","SPLIT PEA WITH HAM SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7538" +"0028114000000","HEARTY VEGGIE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7540" +"0028116000000","MEATLOAF, RICE & CUR. CAULF.","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7542" +"0028118000000","ROSEMARY CHICKEN W/RICE & CAUL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7544" +"0028120000000","JAMAICAN JERK TEMPEH","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7546" +"0028122000000","CURRIED LENTIL SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7548" +"0028124000000","CREAM OF MUSHROOM SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7550" +"0028126000000","HEARTY CHICKEN VEGGIE SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7552" +"0028128000000","CLAM CHOWDER SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7554" +"0028130000000","EDAMAME RICE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","0","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7556" +"0028132000000","VEGETABLE BARLEY SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7558" +"0028134000000","BLACK BEAN CHILI PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7560" +"0028136000000","BAKED BEANS ","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7562" +"0028138000000","1-2-3-POTATO ","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7564" +"0028140000000","SPICY CHINESE NOODLE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","0","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7566" +"0028143000000","BBQ CHICKEN BREAST","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7568" +"0028145000000","POACHED SALMON W/CAPERS","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7570" +"0028147000000","VEGAN CHILI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7572" +"0028149000000","FIESTA LIME CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","7574" +"0028151000000","VEGETABLE LASAGNA-OLD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7576" +"0028153000000","CARNITAS ENCHILADAS W/CHILI","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7578" +"0028155000000","KUNG PAO SEITAN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7580" +"0028157000000","MAPLE GLAZED SALMON","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7582" +"0028159000000","HERB RSTED POTATO &GOAT CHEESE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","3","0","0","0","7584" +"0028161000000","GARDEN PATCH GOULASH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7586" +"0028163000000","SOUTHWESTERN TURKEY SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7588" +"0028165000000","BACON BAKED POTATO SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7590" +"0028167000000","SWEET POTATO WALDORF SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7592" +"0028169000000","QUINOA VEGETABLE RISOTTO","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7594" +"0028172000000","ARTICHOKE SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7597" +"0028174000000","VEGAN ROASTED VEGGIE LASAGNA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7599" +"0028176000000","VEGAN BLACK BEAN & CORN ENCHIL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7601" +"0028179000000","BOHEMIAN TEMPEH GHOULASH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7603" +"0028181000000","HARVEST MOOD SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7605" +"0028183000000","CREAMY GARLIC SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7607" +"0028185000000","MEXICAN SKILLET SCRAMBLE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7609" +"0028187000000","CHICKEN BACON POT PIE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7611" +"0028189000000","LEEK & POTATO PUREE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7613" +"0028191000000","CHICKEN PASTA MEAL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7615" +"0028193000000","OREINTAL BOK CHOY SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7617" +"0028195000000","MANDARIN ORANGE & JICAMA SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7619" +"0028197000000","THAI BROCCOLI SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7621" +"0028199000000","LEMON APRICOT QUINOA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7623" +"0028201000000","MEATLOAF, POTATO PUREE MEAL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7625" +"0028203000000","HEARTY VEGETABLE BEEF SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7627" +"0028205000000","ORIENTAL BOK CHOY SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7629" +"0028207000000","VEGAN VEGETABLE CHILI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7631" +"0028209000000","CHEESY WILD RICE SOUP PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7633" +"0028211000000","CHEESY WILD RICE SOUP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7635" +"0028213000000","HEARTY VEGETABLE BEEF SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7637" +"0028215000000","LEMON DILL RICE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7639" +"0028217000000","TARRAGON CHICKEN MEAL TO-GO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7641" +"0028219000000","TORTILLA SOUP - 16 OZ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7643" +"0028221000000","GREEK LENTIL SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7645" +"0028223000000","CURRIED CHICEN VEG. SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7647" +"0028225000000","TOMATO LEEK SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7649" +"0028227000000","VEGGIE LO MEIN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7651" +"0028230000000","FRUIT & NUT COOKIE","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7653" +"0028232000000","CHICKEN & SD TOMATO QUESA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7655" +"0028235000000","WHITE BEAN CHICKEN HAM SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7657" +"0028237000000","POTATO CHEDDAR SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7659" +"0028239000000","APPLE MINT BEETS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7661" +"0028241000000","SUSHI TRAY","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7663" +"0028243000000","LAYERED BEAN DIP","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7665" +"0028246000000","BRAT CHILI QUART","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7667" +"0028248000000","MISO TOFU SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7669" +"0028250000000","GING TEMP PASTA SAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7671" +"0028252000000","BBQ CHICKEN WHOLE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7673" +"0028254000000","ASPARAGUS QUICHE","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7675" +"0028256000000","VEGAN SPLIT PEA SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7677" +"0028258000000","MUSHROOM STROGANOFF","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7679" +"0028262000000","TAMALE PIE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7681" +"0028264000000","MIXED GREENS W/RANCH DRESSING","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7683" +"0028266000000","CRANBERRY TUNA SALAD","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7685" +"0028269000000","CHICKEN SPAETZLE SOUP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7687" +"0028271000000","HAM ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7689" +"0028273000000","TURKEY MEATLOAF MEAL TO-GO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7691" +"0028275000000","DELI TUNA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7693" +"0028277000000","VEGAN SLOPPY JOES","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7695" +"0028279000000","VIETNAMESE NOODLE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7697" +"0028281000000","","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7699" +"0028284000000","VEGETABLE CHILI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7701" +"0028286000000","TURKEY VEGETABLE SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7703" +"0028288000000","TURKEY MEATLOAF MEAL TO-GO","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7705" +"0028290000000","HONEY MUST SWT POTS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7707" +"0028292000000","LEMON PEPPERCHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7709" +"0028294000000","TERIYAKI CHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7711" +"0028296000000","HARVEST RICE SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7713" +"0028298000000","ASPARAGUS W/LEMON VINAIGRETTE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7715" +"0028300000000","CRANBERRY CHUTNEY","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","6","3","0","0","0","7717" +"0028302000000","BLUE CHEESE ROARING 40S","16.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","231","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7719" +"0028304000000","FOG CITY MACARONI SALAD","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7721" +"0028306000000","MEXICAN CHICKEN MEAL-TO-GO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7723" +"0028308000000","VEGAN PASTA MEAL-TO -G0","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7725" +"0028310000000","BUTTERNUT SQUASH CAK","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7727" +"0028312000000","LENTIL SPINACH & FETA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7729" +"0028314000000","CREAMY TOMATO SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7731" +"0028316000000","CREAMY TOMATO SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7733" +"0028318000000","ASIAN SALMON W/ SESAME RICE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7735" +"0028320000000","LEEK ROASTED CARROTS","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7737" +"0028322000000","CHICKEN TORTILLA SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7739" +"0028324000000","TUSCAN TUNA SALAD","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7741" +"0028326000000","CURRIED TOFU SPREAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7743" +"0028328000000","VEGGIE LINGUINI","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7745" +"0028331000000","VIETNAMESE HOT ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7748" +"0028333000000","RANCH TORTELLINI &BROC. SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7750" +"0028335000000","CHICKEN CHOWDER W/DILL SOUP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7752" +"0028337000000","CREAMY TOMATO PARMESAN PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7754" +"0028339000000","SMOKED TURKEY SALAD W/PARMESAN","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7756" +"0028341000000","CHICKEN STIR-FRY MEAL-TO-GO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7758" +"0028343000000","ORANGE WALNUT TORTELLINI SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7760" +"0028345000000","ALMOND CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7762" +"0028347000000","SPINACH CHICKPEA SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7764" +"0028349000000","CORN CHOWDER PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7766" +"0028351000000","CHICKEN TOMATILLA SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7767" +"0028353000000","FRESH HERB MARINARA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7769" +"0028355000000","VEGAN VEG. PASTA MEAL-TO-GO","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7771" +"0028358000000","SOUTHWEST CHICKEN SALAD","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7774" +"0028360000000","ASPARAGUS SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7776" +"0028362000000","MEATLOAF & PILAF MEAL TO-GO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7778" +"0028364000000","CHICKEN CAESAR PASTA SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7780" +"0028366000000","RST R PEPPER SUN-DRI TOM DIP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7782" +"0028368000000","TEMPEH CHICKEN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7784" +"0028371000000","THYME ROASTED CHICKEN","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7786" +"0028373000000","CHICKEN STIR FRY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7788" +"0028375000000","CORN CHOWDER QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7790" +"0028377000000","SEITAN GYROS WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7792" +"0028379000000","GRILLED HUMMUS WRAP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7794" +"0028382000000","MEATLOAF & COUS COUS MEAL TOGO","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7796" +"0028384000000","BRAZILIAN BLACK BEAN SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7798" +"0028386000000","MISO TOFU SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7800" +"0028388000000","CREAM OF BOK CHOY PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7802" +"0028391000000","HUNAN STYLE SEITAN W/RICE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7804" +"0028393000000","GRILLED CHICKEN WITH COUS COUS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7806" +"0028395000000","ASIAN SALMON W/ RICE AND SAUTE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7808" +"0028397000000","GREEK SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7810" +"0028399000000","HUNAN TOFU WITH BROCCOLI","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7812" +"0028402000000","BROCCOLI WITH ORANGE BLACK BEA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7814" +"0028404000000","SMOKED TURKEY PASTA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7816" +"0028406000000","HONEY MUSTARD POTATO SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7818" +"0028408000000","ARTICHOKE PENNE SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7820" +"0028410000000","EGGLESS TOFU SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7822" +"0028412000000","RASPBERRY LEMON SPICED GAME HE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14586" +"0028414000000","BLUEBERRY ISRAELI COUSCOUS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7826" +"0028416000000","ASIAN SESAME NOODLES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7828" +"0028418000000","CHEESE TORTELLINI WITH PESTO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7830" +"0028421000000","MARINATED VEGETABLES WITH TOFU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7832" +"0028423000000","MANGO AND BLACK BEAN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7834" +"0028425000000","SPLIT PEA W/SAUSAGE SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7836" +"0028427000000","ASIAN SALMON W/ SESAME RICE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7838" +"0028429000000","MINESTRONE SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7840" +"0028431000000","TRADITIONAL SPINACH DIP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7842" +"0028433000000","BBQ CHICKEN MEAL TO-GO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7844" +"0028435000000","summer","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7846" +"0028438000000","CHICKEN WILD RICE SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7849" +"0028440000000","BLACK-EYED PEA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7851" +"0028442000000","BUFFALO WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7853" +"0028444000000","VEGGIE STIR-FRY","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7855" +"0028446000000","VEGAN PIZZA MUSH/SPINACH & TOM","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7857" +"0028448000000","ASIAN EDAMAME & CORN SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7859" +"0028451000000","GREEK MINI-QUICHE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7862" +"0028453000000","LENTIL SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7864" +"0028455000000","SPICY HONEY CHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7866" +"0028457000000","TOMATO JALEPENO ,CHEDDAR PIZZA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7868" +"0028459000000","RED LENTIL CURRY SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7870" +"0028461000000","NORI MAKI SUSHI TRAY","54.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7872" +"0028464000000","CHICKEN GARCIA","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7874" +"0028466000000","GUACAMOLE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7876" +"0028468000000","VEGETABLE NOODLE SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7878" +"0028470000000","CURRY CAULIF W/CARROT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","1","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7880" +"0028472000000","GRILLED VEGGIE & ITALIAN SAUSA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7882" +"0028474000000","PEPPERONI & CONFETTI VEGGIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7884" +"0028476000000","CHEESE PIZZA W/SOUR DOUGH CRU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7886" +"0028478000000","POLENTA TRIANGLES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7888" +"0028480000000","ROASTED POTATOES NICOISE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","7890" +"0028482000000","FOG CITY CLASSIC COLESLAW","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7892" +"0028484000000","GRILLED VEGGIE ","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7894" +"0028486000000","GARLICY SPINACH DIP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7896" +"0028488000000","CHESSE ENCHILADAS ","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7898" +"0028490000000","CHARMOULA TOFU","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7900" +"0028492000000","COOP SHARE SUMI SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7902" +"0028494000000","ROASTED RED PEPPER BISQUE SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7904" +"0028496000000","ROASTED GARLIC ","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7906" +"0028498000000","COPPER PENNY SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7908" +"0028500000000","MORNING GLORY MUFFINS","2.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7910" +"0028502000000","AVAILABLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7912" +"0028504000000","MEXICAN BLACK BEAN SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7914" +"0028506000000","vegan cheesy pasta","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7916" +"0028508000000","SPICED CHICK-PEA STEW","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","0","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7918" +"0028510000000","PASTA PRIMAVERA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7920" +"0028512000000","CHINESE CHICKEN SOUP-PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7922" +"0028514000000","GREEN BEANS POMODORO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7924" +"0028516000000","BUTTERNUT GINGER SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7926" +"0028518000000","WALDORF SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7928" +"0028520000000","Southern Fried Tofu","3","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7930" +"0028522000000","POTATO PEROGIES","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7932" +"0028524000000","ROASTED APPLE COMPOTE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7934" +"0028526000000","TARRAGON CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7936" +"0028529000000","PORTABELLA ASIAGO SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7939" +"0028531000000","LEMON PEPPER LINGUINE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7941" +"0028533000000","POTATO PANCAKES","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7943" +"0028535000000","GOLDEN CREAM OF MUSHROOM PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7945" +"0028537000000","ITALIAN BEAN &HAM SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7947" +"0028539000000","SWEET POTATO SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7949" +"0028541000000","SPICY BLACK BEAN CHILI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","0","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7951" +"0028544000000","SPICY TOMATO SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7953" +"0028546000000","BURNED DOWN THE KITCHEN","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7955" +"0028548000000","GOLDEN CREAM OF MUSHROOM QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7957" +"0028550000000","Tofu Oat Burger","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7959" +"0028552000000","SWEET POTATO CORN CHOWDER","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","1","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7961" +"0028554000000","SWEET POTATO ENCHILADA","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7963" +"0028556000000","QUINOA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7965" +"0028558000000","EGGPLANT PARMESAN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7967" +"0028560000000","BUCKYS BAKED BEANS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7969" +"0028562000000","WILD RICE AND POTATO SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7971" +"0028564000000","Boursin Cheese Spread","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7973" +"0028567000000","EAST INDIAN SQUASH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7975" +"0028569000000","BLACK EYED PEAS W/ SQUASH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7977" +"0028571000000","HERBED SUMMER SUCCOTASH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7979" +"0028573000000","APPLE MAPLE GLAZED SQUASH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7981" +"0028575000000","BURNED DOWN THE KITCHEN CHILI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7983" +"0028577000000","Three Bean Vegetarian Chili","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7985" +"0028579000000","BUTTERNUT SQUASH & BEET HASH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7987" +"0028581000000","HERRING PICKLED SWEET 16","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7989" +"0028584000000","DELI CHICKEN SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7991" +"0028586000000","VEGAN CARROT SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7993" +"0028588000000","CRANBERRY BEET RELISH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7995" +"0028590000000","GARLIC CHIVE TWICE BAKE POTATO","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","7997" +"0028592000000","RAISIN CRANBERRY CHUTNEY","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","7999" +"0028594000000","CRANBERRY WILD RICE PILAF","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8001" +"0028597000000","CELEBRATION STUFFED ROAST ","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8003" +"0028599000000","ROASTED ROOTS SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8005" +"0028610000000","SPICY COLLARD GREENS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8007" +"0028612000000","SPICY PEANUT SAUCE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8009" +"0028614000000","PIMENTO CHEESE BALL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8011" +"0028616000000","BASIL ARTICHOKE DIP","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8013" +"0028618000000","SWEET & SPICY AUTUMN BLACK BEA","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8015" +"0028620000000","WHITE BEAN DIP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8017" +"0028622000000","CREAM OF BROCCOLI SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8019" +"0028624000000","RUSTIC POTATO WITH HAM","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8021" +"0028626000000","BASIL TOMATO SLAW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8023" +"0028628000000","GREEK TRAY","19.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8025" +"0028631000000","PEPPERONI CALZONE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8027" +"0028633000000","RASPBERRY BASIL CHICKEN AND SW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8029" +"0028636000000","FRENCH ONION DIP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8031" +"0028638000000","BBQ CHICKEN DINNER","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8033" +"0028641000000","GREEK CHICKEN RICE SOUP","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8035" +"0028643000000","VEGETARIAN CHILI PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8037" +"0028645000000","SPAGHETTI AND MEATBALLS DINNER","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8039" +"0028647000000","LIL CHED MEATLOAF AND MASHED P","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8041" +"0028649000000","TOMATO PESTO PASTA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8043" +"0028652000000","GLAZED HAM DINNER","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8045" +"0028654000000","INDONESIAN SPINACH SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8047" +"0028656000000","BOHEMIAN PORK GOULASH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8049" +"0028658000000","APRICOT GLAZED TURKEY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8051" +"0028661000000","SPANISH RICE STUFFED PEPPERS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8053" +"0028663000000","VEGGIE STIR FRY WITH RICE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8055" +"0028666000000","CURRIED CHICKEN VEGETABLE PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8057" +"0028669000000","CHICKEN AND BROCCOLI ALFREDO","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8059" +"0028672000000","GERBER NATURAL ROASTED CHICKEN","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8061" +"0028674000000","SESAME TOFU","6.24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8063" +"0028676000000","ROASTED VEG. CALZONE W/ MARINA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8065" +"0028678000000","HAND-ROLLED BUTTER","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8067" +"0028681000000","SPANISH CHICKEN RICE SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8069" +"0028683000000","CARROT GINGER SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8071" +"0028685000000","WHOLE PIZZA MEAT AND 1 VEG","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8073" +"0028687000000","PESTO SPAGETTI W/ BROCOLI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8075" +"0028689000000","ITALIAN ORZO SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8077" +"0028692000000","CITRUS BBQ TOFU","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8079" +"0028694000000","BROCCOLI & CHEDDAR STUFFED CHI","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8081" +"0028696000000","TARRAGON CHICKEN MEAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8083" +"0028698000000","CORN CHOWDER W/ SWEET POTATOE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8085" +"0028700000000","THREE BEAN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8087" +"0028702000000","BROCCOLI & TOFU W/ SPICY PEANU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8089" +"0028704000000","TURKEY CHEDDAR STUFFED PEPPERS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8091" +"0028706000000","CORDON BLEU CHICKEN BREAST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8093" +"0028708000000","HEAT & SERVE ITALIAN SANDWICH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8095" +"0028711000000","","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8097" +"0028713000000","VEGETARIAN EGG ROLLS DUCK SAUC","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8099" +"0028715000000","MANGO GUACAMOLE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8101" +"0028717000000","SAVANNAH BISQUE QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8103" +"0028719000000","ASIAN TURKEY KABOBS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8105" +"0028722000000","SPINACH FETA TURKEY BURGERS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8107" +"0028724000000","TURKEY BURRITO W/ PICO AND SO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8109" +"0028726000000","JERK CHICKEN CALZONE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8111" +"0028728000000","LEMON HERB ROASTED TOFU W/ ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8113" +"0028731000000","1/2 CHUTNEY HAM & CHEESE","3.49","3","0.5","2","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","-2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8115" +"0028733000000","VEGGIE & RYE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8117" +"0028735000000","VEGAN SWEET POTATO SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8119" +"0028737000000","CHICKEN AND VEG QUESADILLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8121" +"0028739000000","GINGER CHICKEN SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8123" +"0028742000000","ALASKAN POLLOCK W/ LEMON RICE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8125" +"0028744000000","FREE RANGE DEVILED EGGS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8127" +"0028746000000","GLAZED HAM/POTATOES DINNER","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8129" +"0028751000000","TURKY MEAT LOAF","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8131" +"0028753000000","CORN AND BLACK BEAN SALSA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8133" +"0028755000000","WILD RICE PILAF","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8135" +"0028758000000","LEMONPEPPER CHICKEN ENTREE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8137" +"0028761000000","CHIPOTLE POTATO SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8139" +"0028763000000","FISH CHOWDER SOUP 32OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","0","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8141" +"0028765000000","SPICY PINEAPPLE SALSA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8143" +"0028767000000","HONEY MUSTARD CHICKEN","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8145" +"0028769000000","MEATLOAF W/MASHED POTATOES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8147" +"0028772000000","ITALIAN VEGETABLE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8149" +"0028774000000","SPAGHETTI & MEATBALLS MEAL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8151" +"0028776000000","COLD CILANTRO SOUP","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8153" +"0028778000000","TURKEY PESTO PITA","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8155" +"0028781000000","WEST AFRICAN PEANUT SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","1","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8157" +"0028783000000","PASTA ALFREDO W/CHICKEN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8159" +"0028785000000","BLUE CHEESE DRESSING","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8161" +"0028787000000","CAESAR DRESSING","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8163" +"0028789000000","PORK TENDERLOIN WITH FRUIT","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8165" +"0028793000000","RHUBARB RASP,CREAM CAKE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8167" +"0028795000000","CHINESE SHRIMP SALAD","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8169" +"0028797000000","CHICKEN TORTELLINI SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8171" +"0028799000000","ROASTED TURKEY BREAST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8173" +"0028802000000","TERIYAKI BEEF KABOBS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8175" +"0028804000000","TOTALLY TUBER SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8177" +"0028806000000","ZESTY THAI NOODLE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8179" +"0028808000000","SPICY POTATO CHICKPEA SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8181" +"0028811000000","SPICY THAI RICE SALAD W/CASHEW","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8183" +"0028813000000","THAI GRILLED CHICKEN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8185" +"0028815000000","MEDITERRANEAN MEAL - FALAFEL","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8187" +"0028817000000","MEXICAN CHICKEN SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8189" +"0028819000000","STRAWBERRY PARFAIT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8191" +"0028822000000","KIDS CHIOCCIOLE & CHEESE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8193" +"0028824000000"," CHUTNEY HAM & CHEESE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8195" +"0028826000000","STEAK & TORTILLA SOUP - 32 OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8197" +"0028828000000","LEMON BASIL CHICKEN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8199" +"0028830000000"," COLESLAW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8201" +"0028832000000","MEXICAN BLACK BEAN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8203" +"0028834000000","PASTA SALADE TIEDE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8205" +"0028836000000","DELI TUNA & PASTA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8207" +"0028839000000","SPICY POTATO CHICKPEA SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8209" +"0028842000000","TURKISH LENTIL SOUP 32 OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8211" +"0028844000000","CHICKEN TETRAZINI","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8213" +"0028846000000","APRICOT GLAZED PORK TENDERLOIN","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8215" +"0028848000000","ROAST BEEF CHUTNEY W/ RICE ","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8217" +"0028850000000","SOBA MANGO CUCUMBER SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8219" +"0028852000000","CHICKEN W/ SEAME RICE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8221" +"0028854000000","QUINOA SALAD WITH TOASTED ALMO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8223" +"0028856000000","FOUR BEAN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8225" +"0028858000000","ASIAN TURKEY LOAF","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8227" +"0028862000000","SALMON CROQUETTES","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8229" +"0028865000000","GARDENERA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8231" +"0028867000000","SWEET & SOUR TEMPEH ALM RAISIN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8233" +"0028871000000","ASPARAGUS AND CHEVRE FRITTATA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8235" +"0028873000000","TERIYAKI CHICKEN BREAST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8237" +"0028875000000","JERK PORK RIBS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8239" +"0028877000000","SHRIMP WITH NAPA CABBAGE AND G","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8241" +"0028879000000","MAPLE GLAZED YAMS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8243" +"0028882000000","PERUVIAN QUINOA STEW","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8245" +"0028885000000","KOREAN CHILI WITH SEOUL 32 OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8247" +"0028887000000","SAVANAH BISQUE PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8249" +"0028889000000","PORK DINNERS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8251" +"0028898000000","CREAMY ARTICHOKE CHIX QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8253" +"0028902000000","BLACK BEAN & SHRIMP SOUP PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8255" +"0028904984864","PCELERY BUNCH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","551","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.23","1","3","6","0","0","0","8257" +"0028915000000","ROASTED VEGETABLE LASAGNA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8259" +"0028917000000","CHICKEN CACCIATORE MEALS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8261" +"0028919000000","VEGGIE ROLL-UPS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8263" +"0028922000000","MAPLE BUTTER YAMS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8265" +"0028924000000","PUMPKIN CIDER SOUP LG","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8267" +"0028926000000","COWBOY CAVIAR","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8269" +"0028928000000","ALMOND RAISIN RICE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8271" +"0028930000000","CLASSIC TOMATO SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8273" +"0028932000000","EDAMAME SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8275" +"0028934000000","COCONUT RICE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8277" +"0028936000000","TERIYAKI CHICKEN W/ FRY RICE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8279" +"0028938000000","MANGO SALSA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8281" +"0028941000000","RATATOUILLE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8283" +"0028943000000","EAST INDIAN SQUASH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8285" +"0028945000000","THAI GREEN CHILI CHICKEN MEAL","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8287" +"0028947000000","BUTTERNUT SQUASH CAKES GG","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8289" +"0028949000000","TORTELLINI ROMANO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8291" +"0028952000000","BLOOD ORANGE SQUASH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8293" +"0028954000000","CITRUS YAMS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8295" +"0028956000000","ORANG GLAZ STUF CORN GAME HEN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8297" +"0028958000000","SEITAN PAPRIKASH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8299" +"0028960000000","CREAM OF POTATO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8301" +"0028962000000","MUSHROOM WALNUT LOAF","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8303" +"0028964000000","ROASTED GLAZED HAM","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8305" +"0028966000000","APPLE COMP STUF ROASTED SQUASH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8307" +"0028968000000","PORK LOIN W/ WILD R CRAN STUFF","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8309" +"0028970000000","LEMON SALMON CAESAR SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8311" +"0028972000000","TURKEY DINNER W/ POTATOES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8313" +"0028975000000"," TORTELLINI ROMANO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8315" +"0028982000000","CAROLINA PULLED PORK","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8317" +"0028984000000","LEMON RICE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8319" +"0028986000000","PASTA WTOMATOES FETA & BASIL","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8321" +"0028988000000","SALMON SPREAD","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8323" +"0028991000000","CPW POTATO CHOWDER ","9.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8325" +"0028993000000","SPICED WINTER SQUASH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8327" +"0028995000000","BEELERS HAM WITH HORSERADISH","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8329" +"0029002000000","RADICCHIO CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","1","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14533" +"0029005000000","SPANISH OLIVE BUTTER","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8334" +"0029007000000","BLACK OLIVE SPREAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8336" +"0029010000000","NEW ITEM","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","8338" +"0029012000000","SPICY CAJUN SHRIMP AND RICE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8340" +"0029014000000","CREAMY PORTABELLO SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8342" +"0029017000000","ASSORTED SEAFOOD DIPS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8344" +"0029021000000","STEAK FRIES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8346" +"0029023000000","CURRIED BLACK-EYED PEA SOUP LG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8348" +"0029025000000","SMOKED SOCKEYE SALMON","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8350" +"0029027000000","BASIL VINEGARETTE CHICKEN","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8352" +"0029029000000","CHIN CHICKEN NOODLE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8354" +"0029031000000","SAVANAH BISQUE QUART","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8356" +"0029033000000","SPINACH FETA TURKEY MEATLOAF","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8358" +"0029035000000","TUSCAN GREEN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8360" +"0029037000000","COSMIC LENTIL SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8362" +"0029039000000","RASPBERRY BASIL CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8364" +"0029041000000","THAI PUMPKIN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8366" +"0029043000000","SWEET MAMAS TURKEY CHILI","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8368" +"0029045000000","CALIFORNIA BLEND SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8370" +"0029047000000","CREAMY PARSNIP SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8372" +"0029049000000","BACON CORN CHOWDER QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8374" +"0029051000000","TUSCAN BEANS & KALE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8376" +"0029053000000","SW CHICKEN FIESTA SALAD 48OZ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8378" +"0029055000000","CPW- BOUNTIFUL VEGETABLE SOUP","9.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8380" +"0029058000000","DELI VEGGIE RANCH PLATTER","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8383" +"0029060000000","FRANKLIN STREET CINNAMON BREAD","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","1","0","8385" +"0029062000000","FRANKLIN ST. HONEY OAT BREAD","4.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8387" +"0029064000000","FRANKLIN ST. 2.5oz CROISSANT","1.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8389" +"0029066000000","NEW FRENCH BAKERY POTATO BREAD","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8391" +"0029069000000","FRANKLIN ST. MARBLE RYE BREAD","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8394" +"0029071000000","NEW FRENCH BAKERY FOCACCIA","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8396" +"0029074000000","ORGANIC BAGUETTE CHUNKS","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8398" +"0029079000000","ICELANDIC ALMOND ROLL JENNY LI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8403" +"0029081000000","VEGGIES & BLUE CHEESE DRESSING","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8405" +"0029083000000","SEITAN POT PASTY","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8407" +"0029085000000","CALICO BEEF CHILI QT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8409" +"0029087000000","VALENTINE APRICOT GLAZ HENS","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8411" +"0029089000000","ORANGE SALAD W RSTD BEET & GC","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8413" +"0029091000000","MUSHROOM STROGANOFF 2","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8415" +"0029093000000","ORANG SPICE GLAZ COR HEN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8417" +"0029095000000","BLACK-EYED PEA SAUSAGE SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8419" +"0029097000000","AZTEC QUINOA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8421" +"0029099000000","SPLIT PEA W/ HAM ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8423" +"0029103000000","GOLDEN MUSTARD BBQ TOFU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8425" +"0029105000000","CUBAN BLACK BEANS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8427" +"0029111000000","LO MEIN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8430" +"0029114000000","SPINACH STUFFED MUSHROOMS","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8432" +"0029116000000","ORANG SPICE GLAZED PORK LOIN","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8434" +"0029118000000","ZUCCHINI CHEESE TRIANGLES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8436" +"0029121000000","GRASS-FED BEEF CHILI PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8439" +"0029123000000","SPINACH FETTUCCINE W WALNUT SC","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8441" +"0029125000000","BLACK EYED PEA CABBAGE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8443" +"0029127000000","CURRIED CHICK COCO RICE SP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8445" +"0029129000000","SPINACH AND CHICKPEA SALAD GG","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","3","0","0","0","8447" +"0029132000000","SWEET ONION PIE","7.24","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8450" +"0029134000000","LENTIL HAM SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8452" +"0029136000000","MEDITERRANEAN GREEN SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8454" +"0029138000000","CREAMY POTATO TARRAGON HAM PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8456" +"0029141000000","FENNEL, SUNCHOKE, APPLE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8459" +"0029143000000","VEGETABLE TIKKA MASALA N RICE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8461" +"0029145000000","BOWTIES W SALMON MINT PEAS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8463" +"0029149000000","CREAM OF BROCCOLI SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8465" +"0029152000000","CHEDDAR BEEF MEATLOAF","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8468" +"0029154000000","ASIAN VEGETABLE SLAW","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8470" +"0029156000000","SPRING GRAINS SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8472" +"0029158000000","CORN SPINACH TOMATO SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8474" +"0029161000000","SPINACH FETTUCINI W/ RICOTTA ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8477" +"0029164000000","CHEDDAR BROCCOLI SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8479" +"0029166000000","ITALIAN PASTA W/ CHICKEN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8481" +"0029168000000","FRESH DILL & TOMATO SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8483" +"0029171000000","SPLIT PEA W/ RICE WINE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8486" +"0029173000000","MEDITERRANEAN SALSA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8488" +"0029175000000","SPICY CHINESE NOODLES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8490" +"0029177000000","OPEN PLU NUMBER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8492" +"0029179000000","SPRING VEGETABLE RISOTTO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8494" +"0029182000000","SWEET PEA GUACAMOLE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8497" +"0029184000000","SPICY YELLOW LENTIL SOUP-PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8499" +"0029186000000","GREEN NOODLE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8501" +"0029188000000","SUNDRIED TOM PASTA BASIL CHEV","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8503" +"0029191000000","VEGAN CALICO BEANS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8506" +"0029193000000","CHANA MASALA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8508" +"0029195000000","LINGUINE W/ CHICKEN HERBS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8510" +"0029197000000","THAI SESAME NOODLES","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8512" +"0029199000000","BLACK BEAN ENCHILADAS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8514" +"0029202000000"," SZECHUAN STIR FRY VEGETABLES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8517" +"0029204000000","CAULIFLOWER CIDER SOUP QUART","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8519" +"0029206000000","BLACK EYE PEA & EDAMAME SUCCOT","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8521" +"0029208000000","SUMMER FRUIT SALAD","9.99","0","0","0","8.99","0","8.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","3","0","0","0","8523" +"0029211000000","TOMATO ARTICHOKE TOSS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8526" +"0029213000000","ORANGE BALSAMIC GLAZED SALMON","18.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8528" +"0029215000000","MEAT & CHEESE MUFFULETTA","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8530" +"0029217000000","GOLDEN BEET AND KALE SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8532" +"0029219000000","RICE ON THE WILD SIDE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8534" +"0029222000000"," TOMATO BRAISED TOFU","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8537" +"0029224000000","CURRIED CHICKEN VEGETABLE QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8539" +"0029226000000","GREEN BEANS POMODORO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8541" +"0029228000000","DAIRY FREE LASAGNA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8543" +"0029231000000","ORZO PIE","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8546" +"0029233000000","WHOLE PIZZA CHEESE","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8548" +"0029235000000","WHOLE PIZZA 1 MEAT OR 2 VEG","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8550" +"0029237000000","WATERMELON SALAD","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8552" +"0029239000000","SPINACH MUSHROOM QUes wrong","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8554" +"0029242000000","WHITE BEAN TOMATO SOUP PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8557" +"0029244000000","HONEY WALNUT CREAM CHEESE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8559" +"0029246000000","ITALIAN ANTIPASTO TRAY","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8561" +"0029248000000","CHINESE CHICKEN SOUP-QT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8563" +"0029251000000","SAVORY TEMPEH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8566" +"0029253000000","ORANGE SPICED FIRE STICKS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8568" +"0029255000000","BROCCOLI SALAD W/SUN DRIED CR","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8570" +"0029257000000","THAI WILD RICE (GG)","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8572" +"0029259000000","ROASTED BONE-IN TURKEY THIGHS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8574" +"0029262000000","VEGAN CALICO PASTA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8577" +"0029264000000","CHOCOLATE COVERED GINGER","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","1","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8579" +"0029275000000","VEGETABLE QUESADILLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8590" +"0029277000000","CHINESE NAPA CABBAGE SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8592" +"0029279000000","STRAWBERRY BANANA CREAM CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8594" +"0029282000000","PASTA W/ HERB RICOTTA PINE NUT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8597" +"0029284000000","CHEF SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8599" +"0029286000000","CAJUN RED BEANS RICE SAUSAGE ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8601" +"0029288000000","MULLIGATAWNY-PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8603" +"0029291000000","PORK LOIN WITH COLLARD GREENS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8606" +"0029293000000","THAI CHICKEN SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8608" +"0029295000000","ITALAIN BEAN & HAM SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8610" +"0029297000000","BLUEBERRY WILD RICE G&G","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8612" +"0029299000000","CHOCOLATE COVERED CHERRIES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8614" +"0029301000000","STUFFED SWEET POTAOTES W/CARME","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8616" +"0029303000000","SMOKED MOZZ AND PESTO PASTA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8618" +"0029305000000","ITALIAN FOCACCIA SANDWICH","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8620" +"0029307000000","CORDON BLEU TURKEY MEATLOAF","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8622" +"0029309000000","TOFU RED PEPPER SPREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8624" +"0029312000000","NOODLES WITH PEANUT SAUCE CHIX","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8627" +"0029314000000","RISOTTO W/ PEAS AND CHICKEN","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8629" +"0029316000000","WILD RICE TOFU SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8631" +"0029318000000","SWEET PUMPKIN SPREAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8633" +"0029321000000","SOY RICOTTA MANICOTTI","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8636" +"0029323000000","TURKEY SPINACH SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8638" +"0029325000000","SUSHI RICE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8640" +"0029327000000","CILANTRO DIP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8642" +"0029329000000","ZUCCHINI COUSCOUS SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8644" +"0029332000000","PUMPKIN CHICKEN SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8647" +"0029334000000","MINESTRONE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8649" +"0029337000000","CRAISY AND WILD SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8651" +"0029341000000","CAJUN FIRESTIX","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8654" +"0029343000000","HONEY MUSTARD SWEET POTATOES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8656" +"0029375000000","HARVEST RICE SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8662" +"0029396000000","BLUSH SAUCE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8666" +"0029398000000","DELI PIZZA SAUCE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8668" +"0029400000000","SPECIAL OF THE MONTH","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","0","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","8670" +"0029420000000","SPECIAL OF THE MONTH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","8672" +"0029440000000","SPECIAL OF THE MONTH","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","8674" +"0029445000000","FESTIVE SWEET POTATOES","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8676" +"0029447000000","CREOLE ROASTED YAMS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8678" +"0029449000000","WALNUT PECAN PATE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8680" +"0029451000000","VEGETARIAN CHILI QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8682" +"0029453000000","GINGER CHICKEN SOUP QT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8684" +"0029455000000"," SMOKED FISH SPREAD W/CARAMELI","10.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8686" +"0029457000000","ROASTED BUTTERNUT SQUASH QT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8688" +"0029459000000","SENEGALESE CHICKEN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8690" +"0029461000000","THAI TURKEY MEATBALLS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8692" +"0029463000000","CHICKEN RANCH PASTA SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8694" +"0029465000000","WILD ORZO SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8696" +"0029467000000","SWEET POTATO SALAD W/CAPERS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8698" +"0029469000000","TUSCAN EGGPLANT SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8700" +"0029471000000","CURRY MANGO TOFU","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8702" +"0029473000000","GOLD RUSH CURRY COLESLAW W/APP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8704" +"0029475000000","ITALIAN PASTA WITH PEPPERONI","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8706" +"0029477000000","CREAM OF POTATO SOUP-Q","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8708" +"0029480000000","SPECIAL OF THE MONTH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","8710" +"0029482000000","MEDITERRANEAN WHITE BEAN SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8712" +"0029484000000","CHICKEN MUSHROOM SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8714" +"0029486000000","PICKLED HERRING","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8716" +"0029488000000","HERB ROASTED TURKEY THIGH","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8718" +"0029490000000","SPECIAL OF THE MONTH","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","3","0","0","0","8720" +"0029501000000","TURKEY DINNER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8722" +"0029503000000","HERBED TURKEY BREAST","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8724" +"0029505000000","WHITE CHICKEN CHILI","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8726" +"0029507000000","TURKEY DUMPLING SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8728" +"0029509000000","CREAMY BROCCOLI POTATO CHED PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8730" +"0029511000000","CREAMY BROCCOLI POTATO CHED QT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8732" +"0029513000000","MEAT AND CHEESE TRAY-9 INCH","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8734" +"0029515000000","MEAT AND CHEESE TRAY W/ GARLIC","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8736" +"0029518000000","VEGETABLE LASAGNA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8739" +"0029520000000","SPECIAL OF THE MONTH","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8741" +"0029522000000","PARTY TRAY","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8743" +"0029524000000","CRANBERRY KASHI","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8745" +"0029526000000","THAI MEATBALLS AND DIP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8747" +"0029528000000","CALICO TURKEY CHILI PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","1","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8749" +"0029530000000","SPECIALOF THE MONTH","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8751" +"0029532000000","SPINACH FETA CALZONE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8753" +"0029534000000","HAM DINNER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8755" +"0029536000000","TEMPEH SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8757" +"0029538000000","PASTA WITH BEANS AND GREENS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8759" +"0029540000000","SPECIAL OF THE MONTH","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8761" +"0029542000000","SWEET LEMON BASIL TURKEY BREAS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8763" +"0029544000000","MARINATED ROOT VEGETABLE ANTIP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8765" +"0029546000000","PENNE W/ SUN-DRIED TOMATO ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8767" +"0029549000000","SWEET AND SAVORY APRICOT DIP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8769" +"0029552000000","ITALIAN SAUSAGE LASAGNA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8772" +"0029554000000","IRISH SEITAN STEW PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8774" +"0029556000000","MINI PIZZA BIANCA","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8776" +"0029558000000","SZECHUAN SHRIMP STIR FRY","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8778" +"0029560000000","SPECIAL OF THE MONTH","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8780" +"0029562000000","DEVILED EGGS-6","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8782" +"0029564000000","CHICKEN CACCIATORE SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8784" +"0029566000000","LEMON PARMESAN TORTELLINI ","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8786" +"0029568000000","CURRIED EGG SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8788" +"0029570000000","SPECIAL OF THE MONTH","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8790" +"0029572000000","ASIAN CABBAGE CRUNCH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8792" +"0029574000000","RASPBERRY LEMON SPICED TURKEY","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8794" +"0029576000000","TUSCAN PENNE & BEAN SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8796" +"0029578000000","GARBANZO W/ GARLIC LEMON QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8798" +"0029580000000","WHITE CHOCOLATE DISCS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8800" +"0029582000000","LOCAL CASHEW BRITTLE","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","8802" +"0029584000000","SHRIMP & RICE JAMBALAYA","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","8804" +"0029586000000","GLORIFIED ORANGE RICE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8806" +"0029588000000","SPINACH SALAD W/ MAPLE VINAIGR","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8808" +"0029590000000","SPECIAL OF THE MONTH","0.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","68","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8810" +"0029592000000","ITALIAN","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","226","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8812" +"0029594000000","TURKEY AND PESTO FOCACCIA ","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8814" +"0029597000000","SHRIMP AND GINGER SNOW PEA SA","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8816" +"0029601000000","VEGETABLE FOCACCIA SANDWICH","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8818" +"0029603000000","GREEK ARTICHOKE HEARTS & BULGA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8820" +"0029605000000","CHEESE LASAGNA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8822" +"0029607000000","TROPICAL SUNSHINE CHICKEN SALA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8824" +"0029609000000","DELI VEGAN MACARONI SALAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8826" +"0029611000000","TURKEY AND CHEESE MEAL","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8828" +"0029613000000","RED CABBAGE WITH APPLES","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8830" +"0029615000000","BLACK BEAN W/SUN DRIED TOM PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8832" +"0029617000000","OLIVE CREAM CHEESE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8834" +"0029621000000","OLIVE CAPER TAPENADE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8836" +"0029623000000","BALSAMIC BBQ CHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8838" +"0029625000000","BOW THAI PASTA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8840" +"0029627000000","CHICKEN AND BROCCOLI CALZONE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8842" +"0029631000000","SESAME ORANGE CHICKEN","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8844" +"0029633000000","ASIAN CHICKEN WINGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8846" +"0029635000000","BRAZILIAN BLACK BEAN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8848" +"0029637000000","ONION AND HERB DIP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8850" +"0029639000000","VEGAN SPINACH DIP","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8852" +"0029642000000","GREEK TURKEY BURGER","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8854" +"0029644000000","TARRAGON MINT CABBAGE SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","1","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8856" +"0029646000000","CHICKEN ENCHILADA MEAL","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8858" +"0029648000000","CREAMY POTATO CHICKEN SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8860" +"0029651000000","GREEK ROASTED POTATO SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8862" +"0029653000000","CURRY MANGO CHICKEN SALAD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8864" +"0029655000000","CREAM OF CAULIFLOWER SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8866" +"0029658000000","GREEN GODDESS POTATO SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","8868" +"0029661000000","ROSEMARY MARINADE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8870" +"0029663000000","FRESH MOZZARELLA PROSCIUTTO","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8872" +"0029665000000","FRENCH HERBED POTATO SALAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8874" +"0029667000000","CHICKEN WITH COUSCOUS SPINACH","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8876" +"0029669000000","CHICKEN AND RICE SALAD W/PESTO","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8878" +"0029671000000","RED CURRY CHICKEN WRAP","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","65","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8880" +"0029673000000","BREAKFAST TO GO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8882" +"0029675000000","PORTUGUESE SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","1","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12757" +"0029677000000","CASHEW BARLEY SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12766" +"0029679000000","WHITE BEAN & HAM SOUP","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","67","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13196" +"0029681000000","SWEET LEMON BASIL CHICKEN BREA","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13280" +"0029749000000","POTATO AND KALE WITH SAUSAGE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","2","1","1","0","2","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8884" +"0029771000000","BLUEBERRY PIE","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12802" +"0029773000000","EDAMAME W/GARLIC AND OLIVES","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12807" +"0029776000000","GARLIC HERB CORNBREAD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12924" +"0029778000000","FRANKLIN ST. CROISSANT 6PK","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12994" +"0029822000000","JERK SEITAN","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8885" +"0029882000000","BEELERS ST. LOUIS ASIAN RIBS","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13033" +"0029884000000","OATMEAL CRANBERRY COOKIE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13109" +"0029886000000","SWEET AND SOUR TEMPEH AND VEGE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13118" +"0029888000000","THAI COCONUT RICE SOUP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13167" +"0029891000000","CARROT CRANBERRY SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","6","0","0","0","0","13195" +"0029893000000","PEA AND RADISH SALAD","8.74","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13387" +"0029895000000","GREEK SPINACH AND RICE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13391" +"0029898000000","SPICED WILD RICE PILAF","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13448" +"0029901000000","TOMATO ORANGE SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13461" +"0029903000000","GREEN CHILE HUMMUS","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13463" +"0029905000000","CREAMY BROCCOLI CAULI SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13490" +"0029907000000","THREE BEAN VEGETARIAN CHILI PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13492" +"0029909000000","MEDITERRANEAN MEAL FALAFEL VEG","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13498" +"0029912000000","ITALIAN PASTA SOUP PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13500" +"0029914000000","TOMATO DILL PASTA SALAD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","1","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13512" +"0029916000000","SESAME GINGER DIP","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","6","0","0","0","0","13552" +"0029918000000","KIJKJ","1","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","8886" +"0029920000000","BLACK BEAN & MUSHROOM BURGER","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13612" +"0029922000000","KICHARDI STUFFED PEPPER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13688" +"0029924000000","CHICKPEA, TOMATO AND BULGAR S","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13840" +"0029926000000","SPLIT PEA W/ HAM PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13873" +"0029928000000","SPICED SWEET POTATO SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13875" +"0029932000000","MOROCCAN SQUASH STEW QUINOA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13911" +"0029934000000","CHOLOLATE GANACHE CAKE","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","229","0","0","1","1","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13913" +"0029937000000","PORK TENDERLOIN W/MUSTARD SAUC","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13923" +"0029939000000","ASPARAGUS TOMATO SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13974" +"0029942000000","CREAMY RED PEPPER PENNE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13991" +"0029944000000","CREAMY ROASTED GARLIC SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14019" +"0029946000000","RED LENTIL CURRY SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14043" +"0029948000000","CHICKPEA, FETA, & TOMATO PASTA","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14117" +"0029952000000","PUGET SOUND ARTICHOKE SALAD","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","1","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14052" +"0029955000000","MINI CHEESEBURGER BBQ MEATLOAV","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14130" +"0029957000000","TUNA MAC SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","2","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14160" +"0029959000000","CHICKEN AND SAUSAGE GUMBO","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14179" +"0029961000000","EGYPTIAN KOSHARY","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14193" +"0029963000000","GARBANZO W/ GARLIC LEMON PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14267" +"0029965000000","CHICK WILD RICE POTATO SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14324" +"0029967000000","VIETNAMESE HOT & SOUR SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","2","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14326" +"0029969000000","APRICOT GLAZED ROASTED CHICKEN","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14345" +"0029971000000","LEMON PEPPER ROASTED CHICKEN","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","78","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14346" +"0029973000000","BEETS LEMON MINT CILANTRO","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","63","0","1","1","1","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14366" +"0029975000000","CHICKEN TORTILLA SOUP PINT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14370" +"0029977000000","ASPARAGUS ANTIPASTA SALAD","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","62","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14254" +"0029980000000","SOUP KIT PRODUCE","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","0","0000-00-00 00:00:00","1","0.01","1","0","0","0","0","0","0","1","0","6","0","0","0","8888" +"0029990000000","DELI PRODUCE NAB","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","8890" +"0029995000000","HOT & SOUR CHICKEN SOUP QT","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","66","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14398" +"0030696001108","BOIRON Aconit Nap 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8891" +"0030696007508","BOIRON Arnica Mont 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","8893" +"0030696007608","BOIRON ARSENICA ALB 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8894" +"0030696013808","BOIRON BRYONIA ALBA 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8896" +"0030696019308","BOIRON CHAMOMILA 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8898" +"0030696033308","BOIRON GELSEM SEMPERV 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8900" +"0030696037608","BOIRON HYPERICUM PERF 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8902" +"0030696040108","BOIRON KALI BICHROM","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8904" +"0030696044908","BOIRON LYCO CLAV 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8906" +"0030696052708","BOIRON NUX VOMICA 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8908" +"0030696060608","BOIRON PULSATILLA 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8910" +"0030696067708","BOIRON SEPIA 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8912" +"0030696071208","BOIRON SULPHUR 6C","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8914" +"0030696073508","BOIRON THUJA OCCID","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8916" +"0030696203356","BOIRON ARNICA CREAM 2.5OZ","10.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.62","1","1","5","0","0","0","8918" +"0030696204356","BOIRON CALENDULA CREAM","10.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.62","1","1","5","0","0","0","8920" +"0030696260760","COLDCALM-COLD","12.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.5","1","1","5","0","0","0","8922" +"0030696261360","SINUSALIA-SINUS CONGESTN","12.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.4","1","1","5","0","0","0","8925" +"0030696262635","BOIRON QUIT SNORING CARE KIT","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","8927" +"0030696263335","FIRST AID KIT","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","8929" +"0030696274724","ARNICA VALUE PACK","13.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.13","1","1","5","0","0","0","8930" +"0030696999851","OSCILLOCOCCINUM, 6 DOSES","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.4","1","1","5","0","0","0","8931" +"0030807825090","ARNIFLORA ARNICA GEL","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.43","1","0","5","0","0","0","8933" +"0030807825190","CALIFLORA CALENDULA GEL","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.43","1","0","5","0","0","0","8935" +"0030807825297","TRIFLORA ANALGESIC GEL","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.38","1","0","5","0","0","0","8937" +"0030807825492","SPORTS GEL","13.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.12","1","0","5","0","0","0","8939" +"0030807850990","PSORIAFLORA CREAM","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.4","1","0","5","0","0","0","8941" +"0030807900393","BOIRON KIDS COUGH SYRUP","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.92","1","3","5","0","0","0","8943" +"0031053902930","WOBENZYME N 100 CT","33.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","8945" +"0031678313902","PFL FOR ALL YOU DO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","8946" +"0031885810924","HOME HEALTH LAVEND SKIN LOTION","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.41","1","0","0","0","0","0","16408" +"0031885812224","SHAMP,EVERCLEAN UNSCENTD","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.91","1","0","5","0","0","0","8949" +"0031885850124","CASTOR OIL","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.94","1","0","5","0","0","0","8953" +"0031885851324","HOME HEALTH ALMOND SKIN LOTION","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.41","1","0","0","0","0","0","16406" +"0031885854024","HOME HEALTH COCON SKIN LOTION","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.41","1","0","0","0","0","0","16409" +"0032003110041","CARIBBEAN SOL JADE OIL","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.37","1","3","0","0","0","0","14504" +"0032003112041","CARIBBEAN SOL ONYX OIL","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.3","1","3","0","0","0","0","14502" +"0032601506162","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8960" +"0033383000343","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14339" +"0033383009469","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8963" +"0033383012476","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","8965" +"0033383101507","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8967" +"0033383110666","PORANGE BAG VALLEY COVE NON-O","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","790","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8969" +"0033383119854","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8970" +"0033383146058","PCLEMENTINE BAG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","4950","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14875" +"0033383220314","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","8973" +"0033383300029","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","8974" +"0033383300399","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8976" +"0033383300942","PAPPLE BAG GDELICIOU","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","533","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8978" +"0033383330011","PAPPLE BAG CAMEO","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1211","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8980" +"0033383510507","PPOTATO BAG IRISH COBBLER","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","987","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","8982" +"0033383675411","PMUSHROOM ENOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","514","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","8984" +"0033383901022","PPOTATO BAG RUSSET","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","8986" +"0033383904306","PCELERY HEART","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","544","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14876" +"0033383904337","PLETTUCE ROMAINE HRT","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","541","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","8989" +"0033582400001","NA OREGANOL","33.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","14.75","1","0","5","0","0","0","8990" +"0035497311212","CALMS FORTE","11.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.23","1","1","5","0","0","0","8993" +"0035497329194","HYLANDS MAG PHOS 30X","8.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.02","1","0","5","0","0","0","8995" +"0035497330101","COLD TABLETS WITH ZINC","10.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.69","1","1","5","0","0","0","8996" +"0035497331081","HYLANDS MAG PHOS 30X 500CT","12.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.59","1","0","5","0","0","0","8998" +"0035497375021","COLIC TABLETS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.59","1","1","5","0","0","0","9000" +"0035497375041","TEETHING TABLETS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.83","1","1","5","0","0","0","9002" +"0035497375071","HYLANDS EARACHE TABLETS 40CT","14.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.5","1","1","5","0","0","0","9005" +"0035497375211","Teething Gel","7.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.15","1","1","5","0","0","0","13002" +"0035616330090","EMERITA VALUE SIZE PRO GEST","41.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","21.64","1","1","5","0","0","0","9008" +"0035616330110","PHYTOESTROGEN CREAM","20.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.82","1","1","5","0","0","0","9010" +"0035616330225","OH LUBRICANT,WARMING","9.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.92","1","1","5","0","0","0","9012" +"0036855901315","PRIMA VU HERBAL EYE DROPS","9.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.86","1","0","5","0","0","0","9015" +"0036855906020","PRIMA LENS CONTACT SOLUTION","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.69","1","0","5","0","0","0","9018" +"0037140070960","PET ALLERGY","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.19","1","3","5","0","0","0","9025" +"0037613512102","MERA SHAMPOO ","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14506" +"0037613532007","MERA HAIRSPRAY","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","9027" +"0041306001933","DISTILLED WATER","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16466" +"0042563015473","ORGANIC SLICED HAVARTI","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","70","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13507" +"0048740404448","PSEED RED BASIL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9031" +"0052536000237","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9032" +"0060146210072","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9034" +"0060244400240","WYNDMERE CITRONELLA 10ML","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16505" +"0060244400570","WYNDMERE LEMONGRASS 10ML","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16507" +"0060244401621","WYNDMERE 2oz Plastic Sprayer","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16609" +"0060244401681","WYNDMERE 1-2 OZ W SPRAYER","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9061" +"0060244401740","WYNDMERE 4 OZ W SPRAYER","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9062" +"0060244401990","Wyndmere Head Lice B Gone","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14329" +"0060244402370","Wyndmere Blue Glass Roller","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15780" +"0060244402560","WYNDMERE 4 OZ PLASTIC","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12956" +"0060244404640","SAND ELECTRIC DIFFUSER","21.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9070" +"0060244405700","Trial Size Lav Oil","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15637" +"0060244405790","Wyndmere Patchouli 2ml Trial","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15516" +"0060244409880","WYNDMERE ANX REL ROLL ON","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13827" +"0060244409900","WYNDMERE HEAD AIDE ROLL ON","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13829" +"0060264878893","STONE SOUP","6.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","9071" +"0060265214002","SPREAD,GRN OLIVE TAPENAD","4.75","0","0","0","3.39","0","3.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.73","1","1","0","0","0","0","15264" +"0060265214004","SPREAD,SUNDRIED TOMATO","4.75","0","0","0","3.39","0","3.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.73","1","1","0","0","0","0","15266" +"0060265217002","BAR,MACADAMIA APRICOT","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","1612","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.06","1","1","4","0","0","0","9073" +"0060265217005","BAR,ALMOND APRICOT","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","1612","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.06","1","1","4","0","0","0","9075" +"0060265217008","BAR,ALMOND & COCONUT","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","1612","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.06","1","1","4","0","0","0","12871" +"0060265217013","PLUS BAR,ALMD,WLNT & MAC","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.06","1","1","4","0","0","0","9080" +"0060265217050","BAR,DRK CHO CHR CSHW+ANT","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.06","1","1","0","0","0","0","15652" +"0060321401400","TURTLE ISLAND SKIN DRESSING","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14767" +"0060322540056","FOUR ELM CAL NEROLI CREAM","14.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","1","0","9087" +"0060322540079","FOUR ELEMENTS JEWELWEED SOAP","4.75","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","1","0","14865" +"0060357200041","PSPROUTS ALFALFA","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1021","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","9093" +"0060418311010","SALSA,CHIPOTLE,HOT","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","1","4","0","0","0","9095" +"0060418311050","SALSA,TOMATILLO,MEDIUM","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","1","4","0","0","0","9097" +"0060418311130","SALSA,MED MANGO KEY LIME","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.54","1","1","4","0","0","0","9098" +"0060418312141","SAUCE,ENCHILADA,CHPTL GR","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.46","1","1","4","0","0","0","9100" +"0060418312171","SKILLET SCE,TACO,NEW MEX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.51","1","0","0","0","0","0","15717" +"0060418314030","BBQ SAUCE SWT SMOKY 12 OZ","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.41","1","0","4","0","0","0","9101" +"0060418331010","SALPICA SALSA,TOM/JAL,ME","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.55","1","1","4","0","0","0","9104" +"0060418331110","SALPICA MANGO PEACH","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.55","1","3","4","0","0","0","9107" +"0060451200103","PPOTATO BAG RED 3#","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","1391","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9109" +"0060451200205","PPOTATO BAG RUSS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","523","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","3","6","0","0","0","9111" +"0060451200405","PPOTATO BAG YELLOW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","516","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","9113" +"0060504936670","PCLEMENTINE BAGGED","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1334","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15257" +"0060580600025","PSPROUTS BROC NON-O","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1369","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","9116" +"0060587998811","Blue Lavender Clean Milk 4 oz","26.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9117" +"0060587998815","TeaTree Gel Cleanser 4 oz","26.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9119" +"0060587998824","Rose Geranium Facial Tonic Hyd","21.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","9121" +"0060587998836","Blue Chamomile Moisturizer 1.5","36.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9124" +"0060587998841","Sea Algae Serum 1/2 oz","34.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9126" +"0060587998849","EVAN HEALY IMMORTELLE TONIC","21.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15260" +"0060587998853","Rosehip Treat - Blue 1/2 oz","23.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9129" +"0060587998891","Face Care Kit - Rose","28.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9132" +"0060587998895","Face Care Kit - Blemish","32.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9134" +"0060595610016","MAPLE SYRUP, OG 16OZ","11.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","9136" +"0060702285555","URBAN HIKER SOCK-WOOL","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13224" +"0060702290054","URBAN HIKER SOCK-9-11","11.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13218" +"0060702290351","URBAN HIKER SOCK-TALL","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13222" +"0060796641804","BAKING SODA BOOK","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15656" +"0060827410250","CHILD LIFE EFA BLEND 8OZ.","13.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.24","1","1","0","0","0","0","14954" +"0060827410700","CHILD LIFE LIQ CAL MAG 16OZ","22.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.98","1","1","0","0","0","0","14955" +"0060850301003","HERBAL ARMOR SPRAY","7.99","0","0","0","5.29","0","5.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.18","1","1","5","0","0","0","9142" +"0060850301006","ALLTER PHIN FERB HERB ARM 4OZ","8.55","0","0","0","5.29","0","5.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","4.41","1","1","0","0","0","0","16496" +"0060850302315","AQUASPORT LOTION SPF 15","9.99","0","0","0","6.49","0","6.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","6.3","1","1","0","0","0","0","14274" +"0060850302330","AQUASPORT LOTION SPF 30","10.45","0","0","0","6.99","0","6.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","6.6","1","1","0","0","0","0","14272" +"0060850303051","ALL TERRAIN KIDSPORT LOT SPF30","10.45","0","0","0","6.99","0","6.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","5.4","1","1","0","0","0","0","14489" +"0060850303061","ALLTER PHIN FERB HERB SPF 30","10.95","0","0","0","6.99","0","6.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","5.65","1","1","0","0","0","0","16497" +"0060850303317","TERRASPORT SPRAY SPF 15","11.39","0","0","0","7.49","0","7.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.19","1","1","0","0","0","0","14270" +"0060850303333","TERRASPORT SPRAY SPF 30","12.35","0","0","0","7.99","0","7.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","6.38","1","1","0","0","0","0","14268" +"0060850305004","ALL TERRAIN SHEER BANDAGES","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.96","1","6","0","0","0","0","14372" +"0060850305022","ALL TERRAIN POISON IVY OAK CR","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.79","1","2","5","0","0","0","9147" +"0060928010500","EAR OIL","10.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.47","1","0","5","0","0","0","9148" +"0060928020004","WALLYS SOY HERBAL 4PK","11.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.34","1","0","0","0","0","0","14778" +"0060928050002","WALLYS LAV BEESWAX 2PK","7.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.8","1","0","0","0","0","0","14500" +"0060972298856","PEPPER SAUCE, MILD","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","0","0","0","0","0000-00-00 00:00:00","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","15408" +"0061001403020","PKEY LIME NON-ORGANI","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","1125","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9154" +"0061001408616","PCOCONUT YOUNG NON-O","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","699","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9156" +"0061001409004","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9158" +"0061001409107","PPEAR BAG BARLETT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9160" +"0061001409161","PTANGELO BAG","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","591","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9162" +"0061001409637","PGARLIC 3OZ","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1179","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9164" +"0061001409764","PPOTATO ROASTERS","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","893","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9166" +"0061046210027","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9169" +"0061046210050","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","9171" +"0061046210060","PAPPLE BAG GRANNY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9173" +"0061046210072","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9175" +"0061046210082","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9177" +"0061046210101","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9179" +"0061046210120","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9181" +"0061046210125","PLIMES BAGGED","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","758","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9183" +"0061046210170","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9185" +"0061046265563","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","9187" +"0061112313000","PWATERCRESS ","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","679","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","9188" +"0061162401981","OE COTTON BALLS 80CT","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.41","1","0","5","0","0","0","9191" +"0061162401988","COTTON SWABS,OG 180CT","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","0","5","0","0","0","9193" +"0061302926011","OBC BUBBLE BATH ROSES","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","2","0","0","0","0","15700" +"0061461325020","CADY CREEK GOLD JACK SLICE","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9199" +"0061461325060","CADY CREEK PEPPERJACK SLICE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9201" +"0061461325310","CADY CREEK BABY SWISS SLICE","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9203" +"0061523701102","PBROC CARROT MIX BAG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","1","1","0","0","855","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9205" +"0061523710001","PSALAD BABY SPINACH","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","666","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9207" +"0061523720001","PSALAD BABY ROMAINE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","667","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9209" +"0061523720028","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9211" +"0061523720201","PROMAINE CLAM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1189","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9213" +"0061523723001","PSALAD ROMAINE CHOPPED","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","667","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9215" +"0061523740001","PSALAD SPRING MIX BAG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","669","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9217" +"0061523740201","PSPRING MIX CLAM","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","695","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9219" +"0061523760001","PSALAD ARUGULA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","665","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9221" +"0061582888937","HSWAY GREEN TEA PEACH","22.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.99","1","6","5","0","0","0","9230" +"0061712092690","FALAFEL REP TRADITIONAL","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","0","0","0","0","16596" +"0061727933459","TROP. MULTI VIT/MINERAL L","27.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","15","1","0","5","0","0","0","9234" +"0061727934001","TROP. CALCIUM/MAGNESIUM L","18.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.8","1","0","5","0","0","0","9236" +"0061754500100","TONGUE CLEANER","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.46","1","0","5","0","0","0","9238" +"0061936000546","WASABI MUSTARD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14176" +"0061936000557","SMOKEY ONION MUSTARD","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","14083" +"0062013300050","Tapioca Eng Muffins","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.21","1","0","3","0","0","0","9240" +"0062013300053","KINNIKINNICK GF HAMB BUNS","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.21","1","0","3","0","0","0","9242" +"0062013300309","CRACKER,SMOREABLE GRAHA","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.68","1","6","4","0","0","0","9244" +"0062168302115","PASTA,OG,PENNE,BRN RICE","4.19","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.42","1","6","4","0","0","0","9246" +"0062168372125","PASTA,SPIRAL,VEG,BRN RC","4.19","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","2.42","1","6","4","0","0","0","9248" +"0062168392065","PASTA FUSILLI TINKYADA","3.75","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","2.18","1","6","4","0","0","0","9250" +"0062168392135","PASTA, OG, LASAGNA, BRN RICE","3.99","0","0","0","3.19","0","3.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","2.35","1","6","4","0","0","0","9252" +"0063107814102","APPLE KRINGLES","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9254" +"0063120370003","PBERRY BLACKBERRY ","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9255" +"0063172320620","STUFFED RED PEPPERS","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9256" +"0063174001013","TBRUSH,SOFT","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.97","1","1","5","0","0","0","9258" +"0063174002010","TBRUSH,JR,SFT,ENDANGERED","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.77","1","1","5","0","0","0","9260" +"0063174005090","PRESERVE TRIP BLADE RPLACEMNTS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.14","1","1","5","0","0","0","9265" +"0063174012002","PRESERVE TOOTHPICKS CINNAMON","1.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.96","1","1","5","0","0","0","9270" +"0063243291100","YERBA MATE, TRADITIONAL ","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.53","1","6","4","0","0","0","9275" +"0063243296201","TEA,OG,YERBA MATE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.01","1","6","4","0","0","0","9277" +"0063243296882","TEA,OG,FT,PURE HEART","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.98","1","6","4","0","0","0","9279" +"0063263411020","FLEA FLICKER!TICK KICKER","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16620" +"0063390430104","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9281" +"0063390444123","PTANGERINE BAG MINNEOLA","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","634","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9283" +"0063395171100","ANDREJS POTICA","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9285" +"0063408402312","BADGER SORE MUSCLE .75OZ","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9287" +"0063408402612","BADGER SLEEP BALM .75 OZ","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9289" +"0063408404201","BADGER AFTER SUN BALM 2OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","16463" +"0063408412702","BADGER LIP SHIMMER COPPER","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16468" +"0063408412704","BADGER LIP SHIMMER ROSE","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16469" +"0063408416201","BADGER NIGHT NIGHT BALM .75OZ","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13174" +"0063408422509","BADGER VANILLA LIP BALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9294" +"0063408424201","BADGER WINT WONDER BALM .75 OZ","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","9296" +"0063408433033","BADGER UNSC HEAL BALM 2 OZ.","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","9297" +"0063408433160","BADGER MINT LIP BALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9299" +"0063408433162","BADGER GING LEMON LIP BALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9301" +"0063408433170","BADGER CUTICLE CARE .75OZ","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","0","0","0","0","13173" +"0063408433220","BADGER ANTI BUG BALM STICK","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","9303" +"0063408435025","BADGER UNSCENTED SOAP","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16475" +"0063408435028","BADGER BABY SOAP","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16473" +"0063408446031","SUNSCREEN 15 SPF BADGER","12.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","9304" +"0063408447031","SUNSCREEN SPF 30 BADGER","12.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","9305" +"0063408447300","BADGER ANTI BUG SUNSCREEN","13.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","16462" +"0063408447500","BADGER BABY SUNSCREEN 30","12.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","16363" +"0063408448022","BADGER CLEAR MIND BALM","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14869" +"0063408448024","BADGER STRESS SOOTHER","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14873" +"0063474421001","ALOTTI BISCOTTI, ALMOND","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13048" +"0063474421004","ALOTTI BISCOTTI, CHOC RASP","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","9308" +"0063474421006","ALOTTI BISCOTTI, SAMPLER","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","9309" +"0063538100288","NEW FRENCH MULTIGRAIN FILONE","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","16539" +"0063538100582","NEW FRENCH GARLIC RSTED BATARD","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","16514" +"0063547518234","HEN HOUSE LARGE EGGS","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.31","1","1","2","0","1","0","9315" +"0063599204330","SOY CRISP,DEEP SEA SALTD","2.95","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1550","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","1.75","1","6","4","0","0","0","9317" +"0063664713006","PREV PECAN DATE ROLL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9319" +"0063687403052","EO BUBBLE BATH SOOTHE MIND","11.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","5.9","1","3","0","0","0","0","15405" +"0063687403054","EO BATH SALTS COC VANILLA TANG","11.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.9","1","3","0","0","0","0","13353" +"0063687403058","EO BATH SALTS BL CHAM LAVENDER","11.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.9","1","3","0","0","0","0","13355" +"0063687409032","EO GALLON LAVENDER SH GEL","56.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14389" +"0063687412023","EO HAND SANITIZER SNG","0.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9322" +"0063687412087","EO HAND SANITIZER 2 OZ SPRAY","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","1","5","0","0","0","9325" +"0063779280050","TEA TREE THERAPY EUC CHESTRUB","9.49","0","0","0","6.79","0","6.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","4.9","1","1","5","0","0","0","9328" +"0063803161216","FIELD ROAST CHIPOTLE SAUSAGE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.51","1","1","0","0","0","0","9331" +"0063803161521","FIELD RST MEATLOAF, CLASSIC","7.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.48","1","0","0","0","0","0","16432" +"0063855001101","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9334" +"0063855001112","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9336" +"0063855001116","PAPPLE BAG GRANNY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9338" +"0063855001118","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9340" +"0063888200007","BLUEBERRIES,WHOLE","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.68","1","3","2","0","0","0","9341" +"0063888200054","PEAS,GREEN","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.59","1","1","2","0","0","0","9343" +"0063888200057","RASPBERRIES,RED","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.68","1","3","2","0","0","0","9345" +"0063888200061","SPINACH,CUT","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.59","1","1","2","0","0","0","9348" +"0063888200203","SWEET POTATO PUREE OG CANNED","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.76","1","1","4","0","0","0","9351" +"0063888200210","BUTTERNUT SQUASH,OG,PURE","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","156","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.76","1","3","0","0","0","0","13103" +"0063900143234","PMANDARIN SATSUMA CASE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1079","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9354" +"0063933400001","AM MEXICANNA QUESADILLA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9356" +"0063933400003","AM SPINACH & GOAT CHEESE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9358" +"0063933400047","AM FOUR CHEESE QUESADILLA ","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9360" +"0063933400466","AM BEEF QUESADILLA","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9362" +"0063984410010","KIRKS CASTILLE CONDITIONER","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.21","1","0","0","0","0","0","15529" +"0063984414900","KIRKS FF CASTILE SOAP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.87","1","0","0","0","0","0","13909" +"0064051820223","KOZI EYE MASK","11.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15459" +"0064109610230","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","9363" +"0064109610448","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9364" +"0064210222736","PMUSHROOM SHIITAKE PKG","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","963","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","9366" +"0064210252231","PMUSHROOM PORTABELLA SLICED","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","649","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","9368" +"0064210272761","PMUSHROOM WHITE PINT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","516","0","0","1","0","0","510","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","9370" +"0064601100102","SINU CLEANSE PLASTIC NETI","14.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9373" +"0064850501500","OLIVE OIL,EXTRA VIRGIN","17.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.06","1","3","4","0","0","0","9375" +"0064850550720","PASTA SCE, RUSTIC TOMATO BASIL","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.28","1","6","4","0","0","0","9380" +"0064850555721","PASTA SCE, OLIVE & WILD CAPER","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.28","1","6","4","0","0","0","9382" +"0064943190115","PPOTATO BAG YUKON 5#","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","516","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","6","0","0","0","9384" +"0064981500001","CHEWING GUM,TANGERINE","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.55","1","6","4","0","0","0","9386" +"0064981500010","CHEWING GUM,BUBBLE GUM","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.55","1","6","4","0","0","0","9388" +"0065063737400","FRZ POPS GRP CHER","3.79","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.2","1","1","4","0","0","0","9390" +"0065117006501","FRENCH VANILLA, FLAVORGANICS","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","239","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.59","1","0","1","0","0","0","9393" +"0065117006506","CARAMEL, FLAVORGANICS","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","239","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.59","1","0","1","0","0","0","9395" +"0065153806011","TEA, MINT HONEY CAN","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14523" +"0065153806013","TEA, RASPBERRY CAN","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14522" +"0065153806708","TEA BTL OG LEMONADE 50/50","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1611","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.03","1","1","4","0","0","0","9400" +"0065286542111","HIM INST ECO NETI POT","13.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.87","1","0","5","0","0","0","9401" +"0065286560007","HIM INST NETI SALT 12OZ","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.93","1","0","0","0","0","0","15240" +"0065286560030","HIM INST NETI STICK","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15241" +"0065286560042","HIM INST NETI WASH FLU 1OZ","15.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.6","1","3","0","0","0","0","14738" +"0065322812321","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9406" +"0065322867576","PPOTATO BAG RED","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9408" +"0065357102233","PCHERRY RAINIER 1-pound","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9410" +"0065357111112","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","9412" +"0065357111212","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9414" +"0065357111811","PAPPLE BAG JONAGOLD","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","534","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9416" +"0065357111912","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9418" +"0065357112911","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9420" +"0065357121112","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9422" +"0065357121311","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","801","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9424" +"0065357131111","PAPPLE BAGGED JONAGO","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","534","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9426" +"0065357132211","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","9428" +"0065357132312","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9430" +"0065357132411","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9432" +"0065357132511","PTANGERINE BAG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","634","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9433" +"0065357142110","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9435" +"0065357142211","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9437" +"0065423400010","PCIDER APPLE ORG GALLON","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","565","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15199" +"0065474933113","CREAM SHAVE,ALOE UNSCENTD","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.18","1","1","5","0","0","0","9440" +"0065474935105","SHAMPOO, LEMON","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.17","1","1","5","0","0","0","9443" +"0065474935117","SHAMP,TEA TREE TREATMNT","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.17","1","1","5","0","0","0","9446" +"0065474935155","CONDITIONER,LEMON","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.17","1","1","5","0","0","0","9450" +"0065474935167","COND,TEA TREE TREATMNT","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.17","1","1","5","0","0","0","9453" +"0065474935208","LOTION,PEPPERMINT","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.9","1","1","5","0","0","0","9457" +"0065474935217","LTN,UNSCENTED","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.9","1","1","5","0","0","0","9459" +"0065474935290","AVALON GRAPE GERN SPRAY DEOD","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.4","1","0","0","0","0","0","13041" +"0065474935315","ULT MOIST CREAM,LAVENDER","16.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.1","1","2","5","0","0","0","9462" +"0065474935435","LIQ SOAP,LEMON VERBENA","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.93","1","0","5","0","0","0","9464" +"0065474935805","CO-Q-10,WRINKLE CREAM","23.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","12.79","1","1","5","0","0","0","9467" +"0065474935812","CO-Q-10,FACE CLNSE CREAM","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.39","1","3","5","0","0","0","9469" +"0065474945383","VIT C,RENEWAL CREAM","20.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.82","1","1","5","0","0","0","9471" +"0065474945388","VIT C,FACE CLEANER","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.16","1","3","5","0","0","0","9473" +"0065527200001","PBERRY BLACKBERRY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9480" +"0065722700033","WATER, ELECTROLYTE ENHANCED 1L","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.5","1","6","4","0","0","0","9482" +"0065762211851","TEA,BTL,OG,MANGO WHITE","1.59","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1516","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.9","1","1","4","0","0","0","9483" +"0065762230175","TEA OG SUBLIME MATE","1.85","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0.9","1","1","4","0","0","0","9486" +"0065762250204","KIDS DRINK OG BERRY LEMONADE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1606","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.95","1","6","4","0","0","0","9489" +"0065762251597","KIDS DRINK OG GOODNESS GRAPE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1606","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.95","1","6","4","0","0","0","9491" +"0065762263057","TEA,PET,OG,JUST GRN,UNSWT","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.13","1","6","4","0","0","0","9493" +"0065762281692","TEA,BTL,OG,BLK FRST BERRY","1.59","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1516","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.9","1","1","4","0","0","0","9497" +"0065833474355","SHELL & CHREESE,OG,DF","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.47","1","1","4","0","0","0","9499" +"0065856423052","WATER,GOODBERRY MINT","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.07","1","1","0","0","0","0","15763" +"0065856423056","MINTWATER SPEARMINT","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.07","1","1","4","0","0","0","9502" +"0065900040000","LA PANZ ROSEMARY","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9505" +"0065900040002","LA PANZ SESAME","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9507" +"0065900040004","LA PANZ ORIGINAL","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9509" +"0065900040008","LA PANZ WHOLE WHEAT","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9511" +"0065900040603","CROCCANTINI BLACK PEPPER MINI","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14447" +"0065916550400","PBERRY BLACKBERRY PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9512" +"0065967000901","PURE ESSENCE CANDEX 40CT","23.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16579" +"0065967001102","PURE ESSENCE ONE ","36.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13822" +"0065967003003","PE IONIC FIZZ CALCIUM SNG","0.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9517" +"0065967003006","PE CALCIUM PLUS ORG VANILLA","21.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15838" +"0065967003103","PE IONIC FIZZ MAG SNG","0.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9520" +"0065967003106","PE MAGNESIUM FIZZ ORANGE VAN","20.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15839" +"0065967004101","IONIC CAL D-K 420GM","39.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15105" +"0066048423106","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9525" +"0066117601002","HAIR COLOR,3N,DK CHESTNUT","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.84","1","1","5","0","0","0","9526" +"0066117601004","HAIR COLOR,6N,DARK BLONDE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.84","1","1","5","0","0","0","9528" +"0066117601007","NATURTINT 9N HNY BLNDE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.84","1","1","5","0","0","0","9530" +"0066117601011","NATURTINT 7G GLDN BLNDE","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.84","1","1","5","0","0","0","9532" +"0066117601090","HAIR COLOR,4N,NATL CHSTNT","16.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.84","1","1","5","0","0","0","9538" +"0066216620085","PCRANBERRIES","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9540" +"0066320421436","INDIGO WILD SOAP FIR PEPP ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15337" +"0066320421448","INDIGO WILD TOV BAR SOAP","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15423" +"0066320421585","INDIGO WILD F & M ZUM BAG","13.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15339" +"0066320421708","INDIGO WILD ZUMBO KISS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15336" +"0066320421974","INDIGO WILD PATCH YLYL SALTS","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","2","0","0","0","0","15724" +"0066320421979","INDIGO WILD PATCH YL YL OIL","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15725" +"0066320435020","ZUM FACE GENTLE TONER ","7.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16663" +"0066320435075","ZUM FACIAL CLEANSER 4OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16661" +"0066320435510","ZUM FACE WALNUT SUGAR SCRUB","9.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16664" +"0066437260006","YOGURT STYLE,LEMON","1.25","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0.75","1","6","2","0","0","0","9541" +"0066437260021","WHLSOY YGRT, SOY, APRCT MNGO","1.25","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","2","0","0","0","0","0","1","6","0","0","0","0","16603" +"0066466390000","PEACE POUND GUATEMALAN DARK","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","9544" +"0066529000312","PBERRY BLACKBERRY 12OZ","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15428" +"0066529005040","PBERRY BLUEBERRY NON-O PINT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9546" +"0066529100925","SWEET OLIVE SPREAD","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.54","1","0","3","0","0","0","9550" +"0066529100955","Mt VIKOS ROASTED FIGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.53","1","0","3","0","0","0","9552" +"0066601644400","SESAME BAR,OG,DATE SYRUP","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.75","1","0","4","0","0","0","9558" +"0066601644440","SESAME BAR,OG,DATE FENNEL","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.64","1","0","4","0","0","0","9560" +"0066684003980","PCARAMEL APPLE NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","1","1","0","0","1051","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","6","0","0","0","9566" +"0066738300220","NOURISH DEOD WILD GREENS","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.2","1","0","5","0","0","0","9573" +"0066779620008","CRANBERRIES","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13312" +"0066779640115","pberrieskiwi","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1410","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13029" +"0066779690102","PPOTATO BAG RUSSET","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9577" +"0066797860747","KTLE CUISINE THAI CURRY","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.13","1","1","0","0","0","0","15873" +"0067048020140","Candidase","25.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","9580" +"0067048024110","ENZYMEDICA MUCOSTOP 48CT","30.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","9583" +"0067048024140","ENZYMEDICA ALLERASE 60 CT","22.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9585" +"0067048029050","ENZYMEDICA DIGEST BASIC 30CT","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","0","0","0","0","15138" +"0067048029170","ENZYMEDICA DIGEST SPECTRUM","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","1","0","0","0","0","15513" +"0067048098120","ENZYMEDICA ACID SOOTHE 90CT","22.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16575" +"0067048098141","ENZYMEDICA VIRASTOP 60 CT","26.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","9591" +"0067170423779","PBERRY STRAWBERRY PT","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9594" +"0067195900004","CORN THINS, SESAME","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.66","1","6","4","0","0","0","9596" +"0067474910006","DEEP STEEP FOOT POLISH","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.79","1","0","0","0","0","0","13431" +"0067474910020","DEEP STEEP SOAP HONDEW SPEAR","5.99","0","0","0","4.79","0","4.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","4.19","1","6","5","0","0","0","9602" +"0067474910050","DEEP STEEP MINT FOOT STICK","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.99","1","0","0","0","0","0","13360" +"0067474910102","DEEP STEEP TANG MELON REFILL","9.59","0","0","0","7.59","0","7.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","0","0","0","0","13819" +"0067497111206","COOKIES,MPL PECAN SHRTBR","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.3","1","6","0","0","0","0","14291" +"0067497116767","COOKIE,HOLIDAY STAR,BAG","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.75","1","1","0","0","0","0","15182" +"0067616400001","PGRAPE CHAMPAGNE 1#","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","0","0","737","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9606" +"0067852301040","WAFERS, CHOC COATED CHOC","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.68","1","1","4","0","0","0","9608" +"0067852301062","PIZZA,DUO CHEESE","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.21","1","1","0","0","0","0","9610" +"0067852301075","GLUTINO PENNE ALFREDO","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.05","1","6","2","0","0","0","9612" +"0067852301095","GLUTINO CHICKEN PAD THAI","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.27","1","6","0","0","0","0","9614" +"0067852303059","BAGELS POPPYSEED GLUTINO","6.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.82","1","1","2","0","0","0","9617" +"0067852303200","BREAD,FIBER,PREMIUM","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.53","1","6","0","0","0","0","9619" +"0067852303844","CRACKERS, CHEDDAR","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.72","1","1","4","0","0","0","9621" +"0067852303852","CRACKERS,TABLE","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.14","1","1","0","0","0","0","15350" +"0067852337548","MUFFINS ENGLISH GLUTINO","6.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.82","1","6","2","0","0","0","9624" +"0067880900010","10# BLOCK ICE","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","46","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","9626" +"0067990900001","LUMINA CELL FOOD","33.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9631" +"0067990900003","CELLFOOD SILICA","34.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9633" +"0068031488096","MV YUBA POCKET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9635" +"0068031488802","MV BENTON BOX","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9637" +"0068031488804","MV BROWN RICE W/MIXED VEG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9639" +"0068031488808","MV ARTICHOKE SPINACH NOODLE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9641" +"0068031488816","MV PEKING DUCK","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9643" +"0068031488860","MV BUCKWHEAT NOODLE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9645" +"0068031488883","MV VEGGIE LOMEIN","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9647" +"0068031488888","MV MACRO SUSHI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9649" +"0068031488890","MV SPELT SHUSI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9651" +"0068031488897","MV MALAYSIAN ARTICHOKE NOODLE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","64","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9653" +"0068069210108","GREEN TEA,MONKEY KING","6.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.75","1","1","4","0","0","0","9655" +"0068069210110","ASST TEA,NUMI COLLECTION 18 BA","6.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.75","1","1","4","0","0","0","9657" +"0068247600020","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9659" +"0068294112349","DEVITA SOLAR PROTECT SPF30","25.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16494" +"0068395314616","MANDARINS","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16277" +"0068582533305","FRUIT BARS,OG,COCONUT","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.48","1","6","0","0","0","0","9662" +"0068582533308","FRUIT BARS,OG,STRAWBERRY","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.48","1","6","0","0","0","0","9664" +"0068690444065","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9666" +"0068693619032","TAHITI TRADERS ORG ACAI 32OZ","42.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","18.92","1","3","5","0","0","0","9668" +"0068844925872","ALMASED SYNERGY DIET","38.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","19.43","1","1","0","0","0","0","14770" +"0068891400057","PONION PEARL YELLOW NON-O","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","629","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9671" +"0068907602699","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9673" +"0068907608548","CARRIER BAG 2 TIER FOREST","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","16200" +"0068907618284","MARSHMALLOWS SWEET & SARA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","9675" +"0068907682652","TIFFIN 2 TIER TO GO WARE","22.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","16199" +"0068954408000","FAGE YOGURT 0% 5.3Z","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.15","1","3","2","0","0","0","9679" +"0069054520774","PPOTATO FINGERLING BAG BUTTERC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9683" +"0069054591544","PPOTATO FINGERLING BAG BUTTERC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9685" +"0069054591566","PPOTATO FINGERLING BAG BUTTERC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9687" +"0069054592033","PPOTATO FINGERLING BAG BUTTERC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9688" +"0069054592077","PPOTATO FINGERLING BAG BUTTERC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","9690" +"0069112431001","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","9692" +"0069112488199","PBERRY STRAWBERRY PT","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","9694" +"0069275200002","BAR,HEMPSEED,OG,ORIGINAL","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.27","1","0","0","0","0","0","13700" +"0069275210006","NUTIVA HEMPSHAKE CHOC","24.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11.07","1","3","5","0","0","0","9698" +"0069275220002","COCONUT OIL,OG","21.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.24","1","0","4","0","0","0","9701" +"0069323999001","LEMONAISE 12 OZ","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","6","4","0","0","0","9703" +"0069706859011","JUICE, OG, PULP-FR, ORNG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.37","1","6","0","0","0","0","15214" +"0069706859013","JUICE, OG, CAL&VITD, ORNG","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","4.37","1","6","0","0","0","0","15159" +"0069765820203","MAN HARVEST CHOC HEMP PRO","23.59","0","0","0","12.99","0","12.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","10.49","1","1","0","0","0","0","15860" +"0069899780617","GRANOLA,ORIGINAL,GF","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.77","1","6","0","0","0","0","14641" +"0069899780910","UDIS GF WHITE BREAD","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.16","1","6","3","0","0","0","12980" +"0069899780917","UDIS PIZZA CRUSTS","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.16","1","1","0","0","0","0","14659" +"0069899780924","UDIS GF SNICKERDOODLE COOKIES","5.45","0","0","0","4.39","0","4.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","2","0","0","0","0","0","1","6","0","0","0","0","16572" +"0069899780931","UDIS BLUEBERRY MUFFINS","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.73","1","1","0","0","0","0","13986" +"0069899780954","UDIS GF BAGELS","5.95","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.44","1","1","0","0","0","0","15090" +"0069932311231","STICKNEY HILLS CHEVRE","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9706" +"0070036000714","PPEPPERS DRIED CHIPOTLE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","0","0","883","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16590" +"0070036000716","PPEPPERS DRIED NEW MEXICO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","0","0","1320","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16591" +"0070052210132","TABLET SPLITTER CRUSHER","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.28","1","0","9","0","0","0","9709" +"0070122821500","ORGANIC FRENCH BAGUETTE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","1","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9711" +"0070161910010","CHAMOMILE CALM","11.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.2","1","0","5","0","0","0","9713" +"0070161910070","GUM-OMILE","11.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.35","1","0","5","0","0","0","9715" +"0070161910095","TEMP ASSURE","11.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.35","1","0","5","0","0","0","9717" +"0070161910135","VI PROTECTION BLEND","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.35","1","0","5","0","0","0","9719" +"0070161910720","HERBS4KIDS ELDERBERRY SYRUP","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.74","1","0","5","0","0","0","9721" +"0070277290985","FETA ATHENOS REDUCED FAT","3.65","0","0","0","3.28","0","3.28","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","3","0","0","0","9724" +"0070510559743","CARRIER BAG 3 TIER PLUM","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","16202" +"0070510599954","APOLONIA B","45.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16599" +"0070576600701","THERA CANE","42.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","9733" +"0070587500005","BARLEANS FLAX OIL HI LIG 12 OZ","17.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9735" +"0070587500016","FLAX OIL BARLEANS 16","22.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9737" +"0070587500027","BARLEANS ORANGE SWIRL 16OZ","33.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14508" +"0070587510007","FLAX OIL CAP BARLEANS 100 CT","12.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9740" +"0070587510016","FORTIFLAX BARLEANS GROUND16 0Z","8.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9742" +"0070587560005","BARLEANS KIDS FISH SWIRL 8OZ","15.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15163" +"0070587561008","BARLEANS FISH OIL 250CT","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15583" +"0070617300501","MUSTARD,OG,STONEGRND GLS","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.04","1","0","4","0","0","0","9746" +"0070617300504","MUSTARD,OG,YELLOW SQZ","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1","1","0","4","0","0","0","9748" +"0070617301222","OLIVES,BLACK,XLG,PITTED","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.26","1","0","4","0","0","0","9750" +"0070617302013","SANDWICH BAGS,RECLOSABLE","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.19","1","0","4","0","0","0","9754" +"0070617302015","STORAGE BAGS, QT, RCLSABLE","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.32","1","0","4","0","0","0","9756" +"0070617310002","SPONGES, COMPRESSED","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","9758" +"0070617310005","WAXED PAPER","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.46","1","0","4","0","0","0","9760" +"0070617310007","SCRUBBER SPONGE","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.6","1","0","4","0","0","0","9762" +"0070619500019","OWH MILK THISTLE","18.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","11","1","6","5","0","0","0","9765" +"0070619500032","OWH GARLIC","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6","1","1","5","0","0","0","9767" +"0070619500048","OWH VALERIAN","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.5","1","6","5","0","0","0","9770" +"0070619500053","OWH SAW PALMETTO","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.5","1","2","5","0","0","0","9772" +"0070619500057","OWH ECHINACEA w c and Zinc","13.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.5","1","0","5","0","0","0","9774" +"0070619500087","OWH FENUGREEK","9.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.25","1","2","5","0","0","0","9776" +"0070619500091","OWH OLIVE LEAF","14.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8","1","2","5","0","0","0","9778" +"0070619500404","OWH MAITAKE 60CT","18.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10","1","0","0","0","0","0","14188" +"0070619500408","OWH MUSCLE RELAX","16.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9","1","3","5","0","0","0","9781" +"0070619500415","OWH RHODIOLA","16.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.75","1","0","5","0","0","0","9783" +"0070619500418","OWH ASTRAGALUS","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.5","1","0","5","0","0","0","9785" +"0070619500428","OWH KAVA","18.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10","1","6","5","0","0","0","9789" +"0070619500443","OWH GREEN TEA 90CT","18.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10","1","6","5","0","0","0","12752" +"0070620088018","MHEMP SPEARMNT VEGAN LIP BALM","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9792" +"0070620088901","MERRY HEMPSTERS COOL HEMP RUB","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","9794" +"0070679203051","pppeppers","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","208","0","0","1","0","0","698","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","9809" +"0070706006102","Lipstick Siesta","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9811" +"0070706006104","Lipstick Allure","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9813" +"0070706006106","Lipstick Siren","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9815" +"0070706006108","Lipstick Galaxy","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9817" +"0070706006110","Lipstick Chocolate Cherry","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9819" +"0070706006112","Lipstick Lux","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9821" +"0070706006114","Lipstick Ultra Suede","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9823" +"0070706006116","Lipstick Beso Beso ","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9825" +"0070706006118","Lipstick Truth or Dare","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9827" +"0070706006120","Lipstick Golden Bronze","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9829" +"0070706006122","Lipstick Femme Fatale","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9831" +"0070706006124","Lipstick Dollhouse Pink","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9833" +"0070706006202","Oil-Free Liquid Foundation L","23.95","0","0","0","18.99","0","18.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9835" +"0070706006204","Oil-Free Liquid Foundation L-","23.95","0","0","0","18.99","0","18.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9837" +"0070706006206","Oil-Free Liquid Foundation L-","23.95","0","0","0","18.99","0","18.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9839" +"0070706006208","Oil-Free Liquid Foundation L-","23.95","0","0","0","18.99","0","18.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9841" +"0070706006301","Dual Powder Foundation D-4","22.95","0","0","0","18.29","0","18.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9843" +"0070706006303","Dual Powder Foundation D-28","22.95","0","0","0","18.29","0","18.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9845" +"0070706006305","Dual Powder Foundation D-10","22.95","0","0","0","18.29","0","18.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9847" +"0070706006307","Dual Powder Foundation D-20","22.95","0","0","0","18.29","0","18.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9849" +"0070706006309","Dual Powder Foundation D-32","22.95","0","0","0","18.29","0","18.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9851" +"0070706006402","Blush Haze ","17.45","0","0","0","13.89","0","13.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9853" +"0070706006404","Blush Fascination","17.45","0","0","0","13.89","0","13.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9855" +"0070706006406","Blush Bella Donna","17.45","0","0","0","13.89","0","13.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9857" +"0070706006502","Eyeshadow Platinum","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9859" +"0070706006504","Eyeshadow Angel","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9861" +"0070706006506","Eyeshadow Sahara","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9863" +"0070706006508","Eyeshadow Absinthe","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9865" +"0070706006510","Eyeshadow Eternity","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9867" +"0070706006512","Eyeshadow Chameleon","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9869" +"0070706006514","Eyeshadow Ice Princess","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9871" +"0070706006516","Eyeshadow Egyptian Gold","12.25","0","0","0","9.79","0","9.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9873" +"0070706006602","Lip Gloss Tempest","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9875" +"0070706006604","Lip Gloss Liquid Bliss","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9877" +"0070706006606","Lip Gloss Divinity","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9879" +"0070706006608","Lip Gloss Dolce Vita","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9881" +"0070706006610","Lip Gloss Cosmopolitan","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9883" +"0070706006612","Lip Gloss Tango","14.75","0","0","0","11.79","0","11.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9885" +"0070706006702","Concealer C-14","13.45","0","0","0","10.69","0","10.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9887" +"0070706006704","Concealer C-7","13.45","0","0","0","10.69","0","10.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9889" +"0070706006802","Mascara Espresso ","13.35","0","0","0","10.59","0","10.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9891" +"0070706006804","CLEAR MASCARA ZUZU","13.45","0","0","0","10.69","0","10.69","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","0","0","0","0","14187" +"0070706006902","Eyeliner Leaf","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9894" +"0070706006904","Eyeliner Tobacco","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9896" +"0070706006906","Eyeliner South Pacific","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9898" +"0070706006908","Eyeliner Ocean","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9900" +"0070706006913","Lipliner Fraise","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9902" +"0070706006915","Lipliner Cappuccino","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9904" +"0070706006917","Lipliner Terra Cotta","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9906" +"0070706006919","Lipliner Cherry","10.99","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9908" +"0070706075703","Mascara Black/Brown","12.75","0","0","0","10.19","0","10.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","9910" +"0070706095102","GABRIEL SEA MINERAL TONIC","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14555" +"0070706095201","GABRIEL RED SEAWEED CLEANSER","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14557" +"0070706095205","GABRIEL RED SEAWEED MOISTURIZE","21.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14559" +"0070706095302","GABRIEL SEA FENNEL TONIC","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14562" +"0070706095410","GABRIEL SEA MINERAL MIST","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14563" +"0070706095430","GABRIEL SEAWEED HYDRATING MASK","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14565" +"0070706095470","GABRIEL SEA FENNEL MAKEUP REM","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14566" +"0070706096702","CKN BANANA DETANGLER","7.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","9912" +"0070708213032","CHAI CONC,SLIGHT SWT","4.39","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1585","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.49","1","6","4","0","0","0","9916" +"0070708250032","CHAI CONC,KASHMIR GREEN","4.39","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1585","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","2.49","1","6","4","0","0","0","9918" +"0070708270060","CHAI TEA LATTE MIX,ORGNL CAN","4.39","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","2.49","1","6","0","0","0","0","14959" +"0070746810314","CHEWING GUM,PEPPERMINT","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.21","1","6","0","0","0","0","13970" +"0070816311001","KETTLE CHIP SPNCHARTICHOKE","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1566","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.55","1","1","4","0","0","0","9927" +"0070816321105","POTATO CHIPS,HICKORY BBQ","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1566","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.55","1","1","4","0","0","0","9928" +"0070816395005","POTATO CHIP,LF,ORIGINAL","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1566","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.55","1","1","4","0","0","0","9930" +"0070840631311","JUICE,APPLE CARROT BL 3PK","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1587","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.92","1","3","4","0","0","0","9933" +"0070840631314","JUICE,BERRY VEGGIE 3PK","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1587","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.92","1","6","4","0","0","0","9935" +"0070840631711","JUICE,APPLE CARROT BL 32OZ","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1587","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.96","1","6","4","0","0","0","9937" +"0070840631714","JUICE,BERRY VEGGIE BL 32OZ","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","1587","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.96","1","6","4","0","0","0","9939" +"0070865610000","CHOCOLATE,OG,DARK 70%","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1573","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.3","1","1","4","0","0","0","9941" +"0070865610002","CHOCOLATE,OG,MAYA GOLD","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1573","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.3","1","1","4","0","0","0","9943" +"0070865610004","CHOCOLATE,OG,HZLNUT CURNT","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1573","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.3","1","1","4","0","0","0","9945" +"0070865610025","HOT CHOCOLATE,OG","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.38","1","0","4","0","0","0","9951" +"0070865610035","IMPULSE BAR OG MILK CH","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.08","1","1","4","0","0","0","9953" +"0070865610042","CHOCOLATE OG CHERRY DARK","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1573","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.3","1","1","4","0","0","0","9959" +"0070882106102","BATHRM LIME SCALE REMOVR 22 OZ","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.29","1","0","4","0","1","0","9961" +"0070882106109","ALL SURFACE CLEANER SPRAY 22 Z","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.53","1","0","4","0","1","0","9963" +"0070882106204","DISH DETERGENT 32 OZ","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","4","0","1","0","9965" +"0070882106208","LAUNDRY LIQ 32OZ RESTORE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","9967" +"0070882106216","AUTO DISHWSHR GEL 32 OZ","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.73","1","0","4","0","1","0","9969" +"0070882106307","GENTLE SOAP,HAND & BODY 64Z","12.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.68","1","0","4","0","1","0","9972" +"0070882106316","RESTORE AUTO DISH GEL 64Z ","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","9975" +"0070882106707","Restore 64oz Gentle Soap","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","9977" +"0070927517364","PUMPERNICKEL RYE","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9979" +"0070927540237","BAGUETTE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9980" +"0070927540885","ORG RST GARLIC BREAD","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","9982" +"0071048328151","LAUGHING WOLF","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","241","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13288" +"0071048328164","POLAR CROSSING","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","241","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13290" +"0071048328177","SHOOTING STAR","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","241","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13287" +"0071072030547","BREADSTICKS GARLIC","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13580" +"0071179020120","PMELON WATERMELON NON-O","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","0","0","713","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","0","0","0","0","13994" +"0071413200073","NAT DENTIST ANTI GINGIV RINSE","9.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.92","1","2","5","0","0","0","10026" +"0071436001547","VEGETABLE BRUSH, 6in","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10030" +"0071436001727","BIRTHDAY CANDLES","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10031" +"0071436003787","PLASTIC BAG DRYER","21.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10033" +"0071436004550","EARTH PLUGS W/TRAY","21.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10035" +"0071436012101","TAUPE BAMBOO 6\" POT","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16273" +"0071436012105","BLUE BAMBOO 6\" POT","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16272" +"0071436013601","TAUPE BAMBOO 5\" POT","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16270" +"0071436013605","BLUE BAMBOO 5\" POT","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16271" +"0071436019203","GREEN BAMBOO 6.5\" POT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16268" +"0071436023202","COCOA BAMBOO 9\" POT","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16263" +"0071436023205","BLUE BAMBOO 9\" POT","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16265" +"0071436026002","COCOA BAMBOO 10","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16262" +"0071436047224","GARDEN FROG TIE","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16250" +"0071525620002","EPSOM SALT","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.24","1","0","5","0","0","0","10041" +"0071525630002","AARON HYDROGEN PEROXIDE 16 OZ","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.06","1","0","5","0","0","0","10043" +"0071548650011","OLBAS OIL (10 CC)","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.4","1","6","5","0","0","0","10044" +"0071548650420","OLBAS COUGH SYRUP","9.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.4","1","6","5","0","0","0","10046" +"0071548650610","OLBAS PASTILLES(LOZENGES)","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.2","1","6","5","0","0","0","10048" +"0071575610004","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","10049" +"0071575610022","PBERRY BLACKBERRY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","10050" +"0071575620011","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","10052" +"0071575630002","PBERRY BLUEBERRY NON-O 6 OZ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10054" +"0071575630007","PBERRY BLUEBERRY NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10055" +"0071575630009","PBERRY BLUEBERRY","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","720","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10057" +"0071575650001","PBERRY BLUEBERRY NO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10059" +"0071575650004","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10061" +"0071612312461","SWEETLEAF SWEETENER, 35CT","4.35","0","0","0","3.29","0","3.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.46","1","1","0","0","0","0","15013" +"0071612312561","STEVIA EXTRACT CLEAR","16.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.38","1","1","4","0","0","0","10062" +"0071612312571","STEVIA EXT POWDER SHAKER","17.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.86","1","1","4","0","0","0","10064" +"0071623702008","CNDTR,SMOOTH AS SILK","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10069" +"0071623704008","REMOIST,50/50 BALANCED","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10071" +"0071623707008","DIRECT LEAVE-IN CONDITNER","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10073" +"0071623711008","HAIR SPRAY,L.A. HOLD","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10075" +"0071623713008","SHMP,TEA TREE","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10077" +"0071623715008","CNDTR,TEA TREE","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10079" +"0071623718033","ROOT 66,OG","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.91","1","1","5","0","0","0","10081" +"0071623718086","GIO BAR SOAP CUCUMBER","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.45","1","3","0","0","0","0","15227" +"0071623718089","GIO RASP WINTER BAR SOAP","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.45","1","3","5","0","0","0","10083" +"0071623718091","GIO BAMB BIRCH BAR SOAP","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.45","1","3","5","0","0","0","10085" +"0071623718142","GIO PROTEIN HAIR INFUSION 1 OZ","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.46","1","1","5","0","0","0","10086" +"0071623718169","GIO WICKED WAX","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.91","1","1","5","0","0","0","10087" +"0071623718172","GIO ROOT 66 CONDITIONER","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.91","1","1","5","0","0","0","10089" +"0071627000134","CHOCOLATE TOFFE ALMOND","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1571","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.65","1","1","4","0","0","0","10091" +"0071627000152","BAR,DK CHOC W/CHER&ALMD","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1571","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","1","4","0","0","0","10092" +"0071627000154","BAR,DARK CHOC/RASPBERRIES","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1571","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","1","4","0","0","0","10094" +"0071627000165","BAR,RICH DARK CHOCOLATE","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1571","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.65","1","1","4","0","0","0","10095" +"0071627005134","MINI BAR,TOF&ALM,MLK CHO","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.76","1","1","0","0","0","0","13074" +"0071627005153","MINI BAR,ORNGE PL,DK CHO","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.76","1","1","0","0","0","0","13072" +"0071631052184","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","10097" +"0071651422900","TODDLER FORM,OG,KOSHER","11.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.29","1","6","4","0","0","0","10099" +"0071651901303","PCAULI N BROC MEDLEY","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","0","0","1178","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16256" +"0071651901306","PSTIR FRY MIX","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1057","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16366" +"0071706723200","LaPERRUCHE RAW SUGAR CUBES","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.71","1","0","3","0","0","0","10101" +"0071725600038","BAC-OUT,FAB SPRY,LEM THY","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.63","1","1","0","0","0","0","15453" +"0071725600041","LAUNDRY PWDR 5LB BIOKL","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","6.51","1","1","0","0","0","0","16526" +"0071725600049","OXYGEN BLEACH PLUS 2LB","6.45","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.81","1","1","4","0","0","0","10104" +"0071725600061","LIQ LAUNDRY,CITRUS 64OZ ","12.75","0","0","0","8.99","0","8.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.55","1","1","4","0","0","0","10106" +"0071755408092","SUPPOSITORY, TEA TREE","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16525" +"0071794000008","SIMPLERS BERGAMOT 5 ML","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10108" +"0071794000015","SIMPLERS CHAMOMILE BLUE 2 ML","18.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10110" +"0071794000020","SIMPLERS CLARY SAGE 5 ML","10.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10112" +"0071794000023","SIMPLERS CYPRESS 5 ML","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10114" +"0071794000028","SIMPLERS EUCALYP RADIATA 15 ML","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10116" +"0071794000041","SIMPLERS HELICHRYSUM 2 ML","25.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10117" +"0071794000048","SIMPLERS LAVENDER 5 ML","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10119" +"0071794000050","SIMPLERS LEMON 5 ML","8.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10121" +"0071794000056","SIMPLERS SWEET MARJORAM 5 ML","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.85","1","6","5","0","0","0","10123" +"0071794000066","SIMPLERS SWEET ORANGE 15 ML","10.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.05","1","6","5","0","0","0","10125" +"0071794000070","SIMPLERS PATCHOULI 5 ML","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.3","1","6","5","0","0","0","10127" +"0071794000075","SIMPLERS PINE WILD SCOTCH 5 ML","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.05","1","6","5","0","0","0","10129" +"0071794000080","SIMPLERS ROSEMARY CINEOL 5 ML","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.15","1","6","5","0","0","0","10131" +"0071794000094","SIMPLERS RED THYME 5 ML","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.4","1","6","5","0","0","0","10133" +"0071794000098","SIMPLERS WINTERGREEN 5 ML","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.25","1","6","5","0","0","0","10135" +"0071794000102","JASMINE PERFUME OIL, 5ML","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16640" +"0071794000104","SIMPLERS ROSE PERFUME","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","16387" +"0071794000112","SIMPLERS SINUS OIL 5 ML","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10137" +"0071794000116","SIMPLERS INJURY OIL 15 ML","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10139" +"0071794000247","SIMPLERS CALENDULA OIL 1OZ","8.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14864" +"0071794000272","SIMPLERS LAVENDER 15 ML","24.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10141" +"0071794000281","SIMPLERS HERP AID 5 ML","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10143" +"0071794000284","SIMPLERS YEAST AID 5 ML","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10145" +"0071794000290","SIMPLERS ECZEMA AID 5 ML","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10147" +"0071794000300","SIMPLERS SCAR & BURN OIL 15 ML","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","10149" +"0071794000463","SIMPLERS MYRRH CO2 2 ML","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.85","1","6","5","0","0","0","10151" +"0071794000918","SIMPLERS ARGAN OIL 1OZ","12.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16668" +"0071812250686","SIBU SEA BUCKTHORN SG","27.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16633" +"0071833422016","THOROUGHLY CLEAN FACE","8.85","0","0","0","5.79","0","5.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.57","1","1","5","0","0","0","10153" +"0071833422040","CLEANSING PADS, TEA TREE","7.65","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","3.93","1","1","5","0","0","0","10155" +"0071833422093","MOISTURIZER, DAILY ESSNTL","6.65","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","3.44","1","1","5","0","0","0","10156" +"0071868710010","PALAK PANEER","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.77","1","1","2","0","0","0","10164" +"0071868710056","CHICKEN TANDOORI W/SPINCH","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.77","1","1","2","0","0","0","10167" +"0071868730011","CALCUTTA MASALA SAUCE","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.51","1","0","4","0","0","0","10169" +"0071868730014","SAUCE,DELHI KORMA SIMMER 16 0Z","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.51","1","0","4","0","0","0","10171" +"0071868770054","CHICKEN PAD THAI","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.77","1","1","2","0","0","0","10174" +"0071921210102","SALSA,PEACH MANGO","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.91","1","1","4","0","0","0","10176" +"0071921279973","DIP BLACK BEAN","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.91","1","1","4","0","0","0","10178" +"0071998508040","No Flush Niacin 500 mg Veg","19.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.49","1","0","5","0","0","0","10180" +"0071998510731","WFC VITAMIN D 5000I.U. 60 CT","11.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.99","1","0","5","0","0","0","12877" +"0071998512331","Vitamin E 400 IU Mixed Toco","10.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.93","1","3","5","0","0","0","10184" +"0071998513234","Evening Primrose Oil 500 mg","10.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.65","1","1","5","0","0","0","10186" +"0071998514040","Lecithin 1200 mg Softgel","8.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.6","1","0","5","0","0","0","10188" +"0071998515216","WFC SOY LECITHIN GRANULES","16.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.1","1","1","5","0","0","0","12878" +"0071998516525","WFC COQ10 200MG 30 CT","30.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","16.56","1","1","5","0","0","0","10190" +"0071998518031","Lutein 20 mg Softgel","24.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","13.58","1","0","5","0","0","0","10194" +"0071998518643","WFC VEG GLUCOSAMINE 750MG","29.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","16.49","1","0","5","0","0","0","10196" +"0071998519334","Glucosamine Chondroitin 90ct","30.15","0","0","0","25.59","0","25.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","12","0","0","0","16.6","1","6","5","0","0","0","10198" +"0071998519531","Glucosamine Sulfate 500 mg","10.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.97","1","0","5","0","0","0","10200" +"0071998519725","CoQ10 30 mg Caps","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.54","1","0","5","0","0","0","10202" +"0071998520240","Folic Acid 800 mcg Tabs","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.8","1","0","5","0","0","0","10204" +"0071998520731","Biotin 500 mcg Caps","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.18","1","0","5","0","0","0","10206" +"0071998522240","Niacin 100 mg Tabs","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3","1","0","5","0","0","0","10208" +"0071998523725","Bal B-100 Tabs","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.98","1","0","5","0","0","0","10210" +"0071998531040","Vitamin C 1000 mg RH PR Tab","15.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","8.35","1","3","5","0","0","0","10213" +"0071998531861","Vitamin C 500 mg RH Tabs","19.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","10.77","1","0","5","0","0","0","10215" +"0071998533104","WFC VITAMIN C CRYSTALS 4 OZ","11.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.06","1","1","5","0","0","0","10217" +"0071998544043","WFC LIVER DETOX CMPLX 120 CT","24.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","13.16","1","0","5","0","0","0","10219" +"0071998544731","WFC MELATONIN 1 MG LOZENGE","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.81","1","0","5","0","0","0","12874" +"0071998550331","ULTIMATE SENIOR 60CT","12.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.78","1","0","5","0","0","0","10222" +"0071998550831","Ultimate One PR Tabs","23.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","13.02","1","0","5","0","0","0","10224" +"0071998551431","Basic Mult Tabs 60 ct","10.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.71","1","1","5","0","0","0","10226" +"0071998551543","Prenatal Multi Tabs","17.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.88","1","0","5","0","0","0","10228" +"0071998552531","WFC ORG TOTAL FOOD MULTI 60CT","26.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","15.04","1","1","5","0","0","0","12876" +"0071998554331","WFC IRON FREE ULT ONE 60 CT","22.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.28","1","0","5","0","0","0","10231" +"0071998560031","Cool Lemon Zinc Lozenges","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","1","5","0","0","0","10233" +"0071998560231","Chewable Calcium Tabs","8.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.94","1","1","5","0","0","0","10235" +"0071998560740","Cal-Mag-Zinc Tabs","10.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.02","1","3","5","0","0","0","10238" +"0071998563131","ChromeMate Chromium 200 m","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.16","1","0","5","0","0","0","10241" +"0071998569140","WFC CHELATED ZINC 30MG 100CT","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15534" +"0071998571528","Acidophilus Caps","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.32","1","0","5","0","0","0","10245" +"0071998573640","WFC L LYSINE 500MG 100CT","12.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.87","1","0","5","0","0","0","10247" +"0071998583240","Vitamin D 400 IU Softgel","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.7","1","3","5","0","0","0","10249" +"0071998596716","Show Me The Whey Protein","28.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","16.44","1","3","5","0","0","0","10251" +"0071998597331","Saw Palmetto 160 mg Softgel","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.34","1","1","5","0","0","0","10255" +"0071998598031","Ginkgo Biloba 60 mg Veg Cap","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","1","5","0","0","0","10257" +"0071998599128","WFC WELLNESS BOOSTER","13.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","7.44","1","0","5","0","0","0","10259" +"0071998599531","Ultimate Eye Formula Veg","35.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","19.75","1","3","5","0","0","0","10261" +"0072037994047","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","10265" +"0072225210061","LUNA BAR,PNUT BTR COOKIE ","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1513","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.89","1","1","4","0","0","0","10267" +"0072225210064","LUNA BAR CARAMEL NUT BROWNIE","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.89","1","1","4","0","0","0","10269" +"0072225210120","CLIF BAR,OG,CRNCH PNT BTR","1.49","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1513","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.89","1","1","4","0","0","0","10273" +"0072225210140","CLIF BAR,OG,CARROT CAKE","1.49","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1513","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.89","1","1","4","0","0","0","10275" +"0072225210180","CLIF BAR,OG,CHOC BROWNIE","1.49","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","0.89","1","1","4","0","0","0","12844" +"0072225210250","CLIF BAR,OG,BLK CHY ALMON","1.49","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1513","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","0.89","1","1","4","0","0","0","10277" +"0072225210310","LUNA BAR,NUTZ OVER CHOCLT","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1513","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.89","1","1","4","0","0","0","10279" +"0072225210340","LUNA BAR,OG,SMORES","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.89","1","1","0","0","0","0","16173" +"0072225210501","MOJO BAR HONEY PEANUT","1.49","0","0","0","1.19","0","1.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1621","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0.89","1","1","4","0","0","0","10284" +"0072225210561","MOJO BAR, MOUNTAIN MIX","1.49","0","0","0","1.19","0","1.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1621","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0.89","1","1","4","0","0","0","10286" +"0072225218001","KID TWISTED FRT,OG,STRWB","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.54","1","0","4","0","0","0","10288" +"0072225218003","KID TWISTED FRT,OG,SR AP","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.54","1","0","4","0","0","0","10290" +"0072225218005","KID TWISTED FRT,OG,GRAPE","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","162","0","0","1","0","0","1523","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.54","1","0","4","0","0","0","10292" +"0072225218064","CLIF SHOT BLOK,OG,BLK CH","2.59","0","0","0","1.49","0","1.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","1.15","1","1","0","0","0","0","14676" +"0072225219101","CRUNCH BAR,OG,CHOC CHIP","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.41","1","0","0","0","0","0","15045" +"0072225219412","ZBAR, PEANUT BUTTER","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1623","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.54","1","0","4","0","0","0","10294" +"0072225219414","ZBAR, CHOCOLATE CHIP","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1623","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.54","1","0","4","0","0","0","10296" +"0072225260141","BUILDER BAR, PEANUT BUTTER","2.15","0","0","0","1.39","0","1.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1620","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.2","1","1","4","0","0","0","10301" +"0072225260145","BUILDER BAR, VANILLA ALMOND","2.15","0","0","0","1.39","0","1.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1620","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.2","1","1","4","0","0","0","10303" +"0072243011016","SYNERGY TRILOGY","3.59","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.16","1","1","2","0","0","0","10307" +"0072243017016","KOMBUCHA, BOTANIC #7","3.59","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.16","1","1","2","0","0","0","10310" +"0072243030016","GT SYNERGY CRANBERRY","3.59","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.16","1","1","2","0","0","0","10313" +"0072243050016","MANGO KOMBUCHA","3.59","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.16","1","1","2","0","0","0","10315" +"0072243080016","GRAPE KOMBUCHA","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.16","1","1","2","0","0","0","10317" +"0072347500013","PCIDER BAC GALLON","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","650","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15099" +"0072347500015","PCIDER CHERRY BAC","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15449" +"0072347500021","PCIDER BAC QUARTS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","541","0","0","1","0","0","650","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14784" +"0072347510001","BAYFIELD RASPBERRY PINT","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14697" +"0072347520016","APPLE BUTTER, NO SUGAR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15829" +"0072347530010","APPLE JELLY, BAYFIELD","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15828" +"0072474200365","BODY LTN,VERY EMOL,DRY","10.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.9","1","1","5","0","0","0","10329" +"0072474200387","SUNBLK,FACE,MNRL,SPF 20","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.41","1","1","5","0","0","0","10331" +"0072474200389","SUNBLOCK,MNRL,F/F,SPF 30","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.41","1","1","5","0","0","0","10333" +"0072474200391","SUNBLOCK,FRAG FREE,SPF30","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","1","5","0","0","0","10335" +"0072474200393","SUNBLOCK,LAVENDER,SPF 45","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","1","5","0","0","0","10337" +"0072474200395","SUNBLOCK,FACE,SPF 30","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","1","5","0","0","0","10339" +"0072474200399","SUNBLOCK,KIDS,SPF 45","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.41","1","1","5","0","0","0","10341" +"0072474200802","FACIAL CLEANSER,PNAPL ENZ","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.37","1","1","5","0","0","0","10343" +"0072474200806","ALBA HIBISCUS FACIAL TONER","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.37","1","3","0","0","0","0","14459" +"0072474200810","ALBA PAP ENZY FACIAL MASK","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.89","1","1","0","0","0","0","14457" +"0072474200814","MOISTURE CRM,JASMN&VIT E","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.6","1","1","5","0","0","0","10348" +"0072474200817","ALBA PAP MANGO EXF WASH","9.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.17","1","1","0","0","0","0","14462" +"0072474200820","ALBA SUGAR CANE BODY POLISH","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.16","1","1","0","0","0","0","14460" +"0072474200824","ALBA KUKUI NUT BODY CREAM","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.89","1","1","0","0","0","0","13132" +"0072474200826","ALBA AFTER SUN LOTION","11.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.88","1","1","5","0","0","0","10352" +"0072474200828","ALBA COCOA BUTTER LOTION","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.17","1","1","0","0","0","0","14464" +"0072474200831","ALBA TAN OIL SPF 15","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.41","1","1","5","0","0","0","10354" +"0072474200835","LIP BALM,PINEAPPLE QUENCH","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.46","1","1","5","0","0","0","10356" +"0072474200837","LIP BALM,COCONUT CREAM","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.46","1","1","5","0","0","0","10357" +"0072474200853","ALBA GARDENIA SHAMPOO","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.17","1","1","5","0","0","0","10359" +"0072474200856","ALBA GARDENIA CONDITIONER","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.17","1","1","5","0","0","0","10360" +"0072474200861","ALBA EXTRA RICH COC COND","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.17","1","1","0","0","0","0","14466" +"0072474200863","ALBA PLUMERIA CONDITIONER","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.17","1","1","5","0","0","0","10361" +"0072474200874","ALBA PASSIONFRUIT LIP GLOSS","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.46","1","1","0","0","0","0","14474" +"0072474200876","ALBA COCONUT CLEAR LIP GLOSS","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.46","1","1","0","0","0","0","14473" +"0072474200892","ALBA COCONUT SHAVE","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.96","1","1","0","0","0","0","14470" +"0072474202368","ALBA VERY EMOL UNSC LOT GAL","49.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","26.81","1","1","5","0","0","0","10362" +"0072477310902","TEA BALL 2 1/2*","2.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10365" +"0072477320551","MORTAR PESTLE, WHT MRBL","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10367" +"0072477391102","TEA INFUSER SPOON","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10369" +"0072527425135","GF DELIGHT MAGAZINE","4.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14157" +"0072527481379","MAG HERBAL GRAM","6.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10370" +"0072527487100","YES MAGAZINE","6.5","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10372" +"0072527494728","WELL BEING JOURNAL","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","240","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10374" +"0072533400320","DDS-ACIDOPHILUS","20.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.24","1","1","5","0","0","0","10376" +"0072533400350","DDS PLUS ACIDPHLS BIFDUS","24.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","11.04","1","1","5","0","0","0","10377" +"0072534226013","TOMATOES,OG,WHOLE PEELED","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1543","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","10379" +"0072534226073","DICED TOMATOES,OG","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1543","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","10381" +"0072534228071","TOMATO SAUCE,OG,REGULAR","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.21","1","1","4","0","0","0","10383" +"0072534228193","TOMATO SAUCE,OG,CHUNKY","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1543","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","10385" +"0072534228356","PASTA SCE,OG,TOMATO BASIL 25.5","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1505","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","1","4","0","0","0","10387" +"0072534228381","DICED TOM,OG,ITALIAN","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1575","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.21","1","1","4","0","0","0","10389" +"0072534228476","SOUP,OG,RS,CHICKEN NOODL","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.97","1","3","0","0","0","0","13428" +"0072534228561","DICED TOMATOES,OG,NS","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1575","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.21","1","3","4","0","0","0","10393" +"0072534228676","PASTA SCE,OG,FF,RST GARLC","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1505","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","3","4","0","0","0","10395" +"0072534228976","PASTA SCE,OG,PRTBELLO MSH","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1505","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","3","4","0","0","0","10398" +"0072534229053","DICED TOMATOES,OG,FIRE-RS","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1543","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.07","1","1","4","0","0","0","10400" +"0072534229326","PASTA SCE,OG,FOUR CHEESE","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.47","1","1","4","0","0","0","10402" +"0072534241251","SOUP,OG,SWEST,BLACK BEAN","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.77","1","1","4","0","0","0","12852" +"0072534241253","SOUP,OG,CRMY TOMATO BSQU","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.77","1","1","4","0","0","0","12850" +"0072534241257","SOUP,OG,SAVORY LENTIL","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.77","1","1","4","0","0","0","12755" +"0072534241262","SOUP, OG CHICK WILD RICE","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","174","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","1","4","0","0","0","12803" +"0072534248470","SALSA,OG,MEDIUM","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1517","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","1","4","0","0","0","10415" +"0072534248540","TOMATO KETCHUP,OG","3.79","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.14","1","3","4","0","0","0","10417" +"0072534248810","SALSA,OG,BLK BN & CRN,MED","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1517","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.56","1","1","4","0","0","0","10419" +"0072689955274","WORG LIQUI KELP IODINE","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.3","1","0","0","0","0","0","15216" +"0072710140040","BALM,BEAUTIFUL BELLY BALM","14.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","5","0","0","0","10424" +"0072734840606","JUMBO BULL STIX 2-PACK","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14194" +"0072761617116","AZTEC HEALING CLAY 1 LB","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.12","1","0","5","0","0","0","10426" +"0072764451071","EARTH JUICE-32OZ.","15.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14110" +"0072778300121","NEWCHAP SENSITIVE COLON 90CT","28.65","0","0","0","19.99","0","19.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10429" +"0072778300230","NEW CHAP LIFESHIELD IMMUNITY","36.95","0","0","0","25.99","0","25.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","14675" +"0072778300306","NEW CHAP EWONEDAILY 24CT ","23.15","0","0","0","15.99","0","15.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","14256" +"0072778300310","NEW CHAP EVERY WOMAN II","41.59","0","0","0","29.99","0","29.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","14265" +"0072778300326","NEW CHAP EMONEDAILY 24CT","23.15","0","0","0","15.99","0","15.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","14258" +"0072778300330","NEW CHAP EVERY MAN II","41.59","0","0","0","29.99","0","29.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","14264" +"0072778300401","NEWCHAP BLOOD PRESSURE","38.85","0","0","0","27.99","0","27.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10432" +"0072778300565","BERRY GREEN CLOSE OUT PRICE","23.99","0","0","0","23.99","0","23.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10433" +"0072778300623","STRESS SUPPORT MULTI 90","38.85","0","0","0","27.99","0","27.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10438" +"0072778300644","GTF CHROMIUM COMPLEX 30","15.69","0","0","0","10.99","0","10.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10442" +"0072778300682","SELENIUM FOOD COMPLEX 30","15.69","0","0","0","10.99","0","10.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10448" +"0072778304044","NEW CHAP TUMERIC FORCE","27.75","0","0","0","19.99","0","19.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","15032" +"0072778304049","NEWCHAP PROSTATE 5LX 60 CT","29.59","0","0","0","20.99","0","20.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10453" +"0072778304053","NEWCHAP ZYFLAMEND 60 CT","27.75","0","0","0","23.99","0","23.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10455" +"0072778304071","NEWCHAP HEADACHE RELIEF 30CT","25.89","0","0","0","18.49","0","18.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10457" +"0072778304085","NEW CHAPTER HOLY BASIL 60CT","29.59","0","0","0","20.99","0","20.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","5","0","0","0","10459" +"0072780601122","DOMINEX EGGPLANT CUTLETS","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.64","1","6","2","0","0","0","10462" +"0072802800851","BUFFALO RAWHIDE SMALL","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15237" +"0072802800853","BUFFALO RAWHIDE LARGE","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15235" +"0072802800866","RAWHIDE, MINI BUFF TWIST","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16236" +"0072806010720","CELTIC SEA SALT FINE","8.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","10466" +"0072822912375","TERRA CHIPS","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.05","1","1","4","0","0","0","10471" +"0072894223001","THICK N THIN CHEESE SLICER","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15442" +"0072899719200","DELICATE WASH","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.03","1","1","4","0","0","0","12971" +"0072899722000","AUTO DISHWASHING,TABLETS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.21","1","1","4","0","0","0","10475" +"0072958211620","CHOC BAR PEPPERMINT PATTIE","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.29","1","0","4","0","0","0","10479" +"0072960901965","GRIPE WATER","11.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.19","1","0","5","0","0","0","10481" +"0072990611950","INSTNT OATMEAL MPL SYRUP CC","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.08","1","1","4","0","0","0","10483" +"0072990611969","INSTNT OATMEAL OG FIT KID","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.04","1","0","4","0","0","0","10485" +"0072990612015","SFT BKD CKIE,OG,OATML CH","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.36","1","3","4","0","0","0","10490" +"0072990617001","SNDWCHCRM,OG,CHOC,VAN CR","4.15","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","1532","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.4","1","1","4","0","0","0","10492" +"0072990617003","SNDWCHCRM,OG,DUPLEX","4.15","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","1532","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.4","1","1","4","0","0","0","10494" +"0072990618001","VANILLA WAFERS,OG,BOX","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.36","1","1","4","0","0","0","10496" +"0072990618003","COOKIE,OG, OATML, ICED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.35","1","3","4","0","0","0","10498" +"0073133000002","PFIG BLACK MISSION","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","550","0","0","1","0","0","552","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10501" +"0073291313703","BATH TISSUE,2-PLY SINGLES","1.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.9","1","0","4","0","0","0","10503" +"0073291313720","PAPER TOWELS,NATURAL","2.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.75","1","1","4","0","0","0","10507" +"0073291313732","BATH TISSUE 4PK 7TH GEN","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.67","1","1","0","0","0","0","15879" +"0073291322150","AUTO DISH POWDER,FR&CLR 45Z","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.37","1","1","4","0","0","0","10510" +"0073291322704","CLEANER,TOILET BOWL","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","1","4","0","0","0","10512" +"0073291322719","CLEANER,ALL PURPOSE","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.68","1","1","4","0","0","0","10516" +"0073291322734","DISH LIQUID,LAVENDER SCN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.38","1","1","4","0","0","0","10518" +"0073291322766","FABRIC SOFTENER, FREE & CLEAR","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.83","1","1","4","0","0","0","10521" +"0073291322780","2X ULTRA LIQ LNDRY,FR&CLR","18.95","0","0","0","14.99","0","14.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","11.23","1","3","0","0","0","0","10523" +"0073291322787","FAB SFTNER SHT,FR & CLR","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.83","1","1","4","0","0","0","10525" +"0073291322812","WIPES,MULTI-SURF,DISINFC","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.68","1","1","0","0","0","0","13563" +"0073291322820","HAND WASH,FRESH CITRUS","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.68","1","1","0","0","0","0","15871" +"0073291322827","4X LIQ LNDRY,FREE & CLEA","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","11.23","1","1","0","0","0","0","16521" +"0073291334207","BABY WIPES,TUB 80 CT","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.66","1","1","4","0","0","0","10526" +"0073291344022","DIAPERS STAGE 1","15.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","187","0","0","0","0","0","1547","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.78","1","1","4","0","0","0","10528" +"0073291344024","DIAPERS STAGE 3","15.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","187","0","0","0","0","0","1547","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.78","1","1","4","0","0","0","10530" +"0073291344026","DIAPERS STAGE 5","15.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","187","0","0","0","0","0","1547","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.78","1","1","4","0","0","0","10532" +"0073291345002","7TH GEN REG ULTRA THIN","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","100","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.17","1","1","5","0","0","0","10534" +"0073291355501","KITCHEN BAG,TALL,13 GAL","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.72","1","0","4","0","0","0","10539" +"0073338390001","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10542" +"0073371015010","PFLOWER TULIPS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10544" +"0073402790125","GINGER WASABI DIP","4.99","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.99","1","1","0","0","0","0","13473" +"0073402790130","THAI GREEN CURRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.99","1","1","0","0","0","0","14283" +"0073402790203","GINGINS BOOST","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.65","1","0","4","0","0","0","10547" +"0073402790401","GINGER,MINCED 6.7 OZ","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.46","1","1","4","0","0","0","10550" +"0073402790505","GIN-GINS,HARD CANDY,BAG","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.21","1","6","4","0","0","0","10553" +"0073402792001","GINGER,OG, CRYSTALLIZED","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.05","1","1","4","0","0","0","10557" +"0073402799502","GINGER GIZER 120Z","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.13","1","1","4","0","0","0","10559" +"0073415894016","CONTE GNOCCHI G/F","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.92","1","0","0","0","0","0","10561" +"0073449231828","BREADSTICKS TRADITIONAL","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","10562" +"0073449270145","GRAPESEED OIL","12.79","0","0","0","8.79","0","8.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","7.36","1","1","4","0","0","0","10565" +"0073503702006","SUGAR,OG,RAPADURA WH CANE","6.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.94","1","6","4","0","0","0","10567" +"0073503707100","BOUILLON,OG,VEG W/SEA SLT","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.84","1","6","4","0","0","0","10569" +"0073503707300","BOUILLON,OG,VEG NO SALT","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.84","1","6","4","0","0","0","10571" +"0073503750377","YEAST,OG,ACTIVE,DRY,RIZE","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.97","1","6","4","0","0","0","10572" +"0073550061694","HONEY,ORANGE BLOSSOM","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","10575" +"0073550061696","HONEY, ORANGE BLOSSOM","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15801" +"0073591829869","PRESC FOR HERBAL HEALING","23.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","10577" +"0073613354363","TOTE BAG WFC CLOTH","10.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","7","0","0","0","10578" +"0073621000012","PSEEDS FLOWERS $1.89","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10580" +"0073621000015","PSEEDS FLOWERS $1.59","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10582" +"0073621000017","PSEEDS MORNING GLORY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10584" +"0073621000022","PSEEDS VEGGIE $1.89","1.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10586" +"0073621000024","PSEEDS VEGGIES $1.59","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10588" +"0073621000031","PSEEDS HERBS $1.39","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10590" +"0073621000034","PSEEDS HERBS $1.59","1.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10592" +"0073654702450","ALPINE FONDUE BLEND","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16410" +"0073753919049","SUNBUTTER,OG","8.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.69","1","6","0","0","0","0","14480" +"0073762800100","SAUCE,FISH","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.25","1","1","4","0","0","0","10597" +"0073762800400","PASTE,CURRY,GREEN","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1580","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.09","1","1","4","0","0","0","10599" +"0073762800510","SAUCE,PAD THAI","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.9","1","1","4","0","0","0","10601" +"0073762802530","THIN RICE NOODLES","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.71","1","1","4","0","0","0","10603" +"0073762802560","NOODLES,PAD THAI","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1579","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.87","1","2","4","0","0","0","10605" +"0073762806050","COCONUT MILK","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.74","1","1","4","0","0","0","10611" +"0073762807950","COCONUT MILK, OG","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.52","1","1","4","0","0","0","10613" +"0073762822007","NOODLE,INST,RST GRLC&VEG","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.56","1","2","0","0","0","0","14434" +"0073762822009","NOODLE,INST,LEMONGRS&CHI","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.56","1","2","0","0","0","0","14433" +"0073762822011","NOODLE,INST,GREEN ONION","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.56","1","2","0","0","0","0","14432" +"0073788002140","W/F CAKE & COOKIE MIX","4.95","0","0","0","3.39","0","3.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.79","1","1","4","0","0","0","10618" +"0073788096055","W/F PERFECT PIE CRUST","4.95","0","0","0","3.39","0","3.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.79","1","1","4","0","0","0","10622" +"0073842910006","PAPPLE BAG JONAGOLD","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","534","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10624" +"0073942344048","FLORAJEN 3 30 CAP","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","10626" +"0074069590001","PLETTUCE ROMAINE HEA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","541","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","10630" +"0074110201332","PLETTUCE ROMAINE HEA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","515","0","0","1","0","0","541","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","10632" +"0074124300201","PONION BAG RED","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","633","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10634" +"0074124300290","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","10636" +"0074124300374","pppeppers","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","208","0","0","1","0","0","698","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","10637" +"0074127300059","BACH RESCUE CREAM 30GM","10.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.39","1","1","0","0","0","0","14840" +"0074127300200","BACH EMOTIONAL EATING KIT","27.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.27","1","1","5","0","0","0","10640" +"0074127300392","RESCUE REMEDY","21.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","9.81","1","1","5","0","0","0","10642" +"0074127301397","RESCUE REMEDY SPRAY 7ML","13.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.02","1","1","5","0","0","0","10645" +"0074127301451","BACH RESCREMEDY PASTILLES","8.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.81","1","3","5","0","0","0","10647" +"0074127301500","BACH RESCUE REM FOR PETS 10ML","14.35","0","0","0","11.39","0","11.39","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","7.66","1","6","5","0","0","0","10649" +"0074127301518","BACH RESCUE GUM","6.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.93","1","1","0","0","0","0","14771" +"0074286300501","VALLEY VF SMOKED CHEDDAR 8OZ","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16434" +"0074286300521","VVF SMOKED CHEDDAR CHEESE","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","1","0","13188" +"0074286300523","VVF JALAPENO JACK CHEESE","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13054" +"0074286300525","VVF CHIPOTLE COLBY CHEESE","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","1","0","13189" +"0074286300903","DILL GOUDA","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15300" +"0074286900520","CHEDDAR CHEESE VAL VIEW FARM","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13053" +"0074290000025","BWATER FIVE GALLON REFILL","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","14","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","10685" +"0074447344034","NEAPOLITAN SAND","4.65","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.68","1","1","2","0","0","0","10688" +"0074447347033","PURELY DECADENT COCONUT","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.21","1","3","2","0","0","0","10691" +"0074447347055","PURELY DEC MINT CHIP","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.21","1","3","2","0","0","0","10693" +"0074447348001","N/D,OG,TURTLE TRAILS","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.69","1","1","2","0","0","0","10694" +"0074447370012","ND,BAR,OG CREAMY FUDGE","3.95","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.3","1","1","2","0","0","0","10696" +"0074447372021","N/D DSRT,OG,CHOCOLATE","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.48","1","1","2","0","0","0","10699" +"0074447391102","SO DEL RASP COC MILK YOGURT","2.25","0","0","0","1.5","0","1.5","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.35","1","1","2","0","0","0","10702" +"0074447391204","SO DEL COCONUT MILK VAN","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","32","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.55","1","1","0","0","0","0","14764" +"0074447391231","CNUT MILK,OG,ORGNL,ASPTC","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.69","1","1","0","0","0","0","14759" +"0074447391235","CNUT MILK,OG,UNSWTND,ASP","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.69","1","1","0","0","0","0","14760" +"0074447394110","SDELCS COCONUT CRMR PLN","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.59","1","1","0","0","0","0","15650" +"0074515830051","SPOTS STEW CAT,SALMON","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.67","1","0","0","0","0","0","14964" +"0074515834020","SPOTS STEW CAT,INDR,CHCK","11.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","6.94","1","0","4","0","0","0","10706" +"0074515838020","SPOT STEW DOG, CHICKEN 18#","40.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","25.11","1","0","4","0","0","0","10708" +"0074515890120","LIV-A-LITTLE,VEG PEANUT","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.73","1","1","4","0","0","0","12785" +"0074599841102","COFFEE EQUALEXCHANGE COLOMBAN","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.01","1","0","0","0","0","0","15114" +"0074599890301","CHOC BAR,OG,MILK","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1534","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.51","1","1","4","0","0","0","10715" +"0074599890303","CHOC BAR,OG,DARK W/ALMNDS","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1534","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.51","1","1","4","0","0","0","10717" +"0074599890309","CHOCOLATE BAR, CHOC CARAMEL","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.51","1","1","0","0","0","0","16216" +"0074759960106","BAKING BAR,CHOC UNSWTENED","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.9","1","1","4","0","0","0","10722" +"0074759964011","CHIPS,DOUBLE CHOC CHIP 11.5 OZ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","1","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.85","1","1","4","0","0","0","10724" +"0074840400002","DRESSING,OG,ITAL HERB VG","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.49","1","1","4","0","0","0","10730" +"0074840400006","DRESSING,OG,FRENCH TOMAT","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.49","1","1","4","0","0","0","10733" +"0074840401006","PSEEDS LETTUCE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10735" +"0074840401016","PSEED BLACK SW CORN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","0","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","10737" +"0074840401021","PSEED CUCUMBER CHAMP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10739" +"0074840401024","PSEEDS CUKE MARKETM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10741" +"0074840401029","PSEED BORAGE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10743" +"0074840401034","PSEED KALE SIBERIAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10745" +"0074840401036","PSEEDS LETTUCE PIRAT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10747" +"0074840401039","PSEED RED OAK LEAF","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10749" +"0074840401041","PSEED LETTUCE SIMPSO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10751" +"0074840401043","PSEED LETTUCE WINTER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10753" +"0074840401046","PSEED WATERMELON CRI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10755" +"0074840401050","PSEED MUSTARD GREEN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10757" +"0074840401052","PSEED ONION WALLA WA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10759" +"0074840401054","PSEED ANAHEIM CHILE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10761" +"0074840401060","PSEED CHILE RIO GRAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10763" +"0074840401065","PSEED ZUKE COCOZELLE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10765" +"0074840401067","PSEED ZUKE GOLDEN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10767" +"0074840401069","SEEDS, SQUASH BUTTNT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10769" +"0074840401071","SEEDS, SQUASH DELICA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10771" +"0074840401075","PSEED SUNFLOWER TARA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10773" +"0074840401077","PSEED TOMATO CARO RI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10775" +"0074840401080","PSEED TOMATO BUSH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10777" +"0074840401084","SEEDS TOM STUPICE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10779" +"0074840401086","PSEED TOMATO CHERRY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10781" +"0074840401088","PSEED BASIL GENOVES","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10783" +"0074840401090","PSEED LEMON BERGAMOT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10785" +"0074840401094","PSEED CHAMOMILE GERM","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10787" +"0074840401098","PSEED DILL MAMMOTH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10789" +"0074840401100","PSEED PARSLEY MOSS C","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10791" +"0074840401103","PSEEDS SAVORY SUMMER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10793" +"0074840401108","PSEED GIANT DAHLIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10795" +"0074840401110","PSEED MIXED SEASHELL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10797" +"0074840401113","SEEDS, MARIGOLD BROC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10799" +"0074840401116","SEEDS, POPPY CORNFIE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10801" +"0074840401121","PSEED NICOTIANA AZTE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10803" +"0074840401130","SEEDS, POPCORN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10805" +"0074840401132","PSEED LETTUCE COSMO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10807" +"0074840401136","PSEED LETTUCE 4 SEA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10809" +"0074840401139","PSEED LETTUCE TOM TH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10811" +"0074840401143","SEEDS, LETTUCE ROUGE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10813" +"0074840401152","SEEDS, CRESS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10815" +"0074840401157","PSEED SPINACH AMERIC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10817" +"0074840401159","PSEEDS RUBY ORACH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10819" +"0074840401167","PSEEDS FINGER CARROT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10821" +"0074840401174","PSEED KALE RED URSA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10823" +"0074840401182","SEEDS, CUCUMBER PICK","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10825" +"0074840401184","PSEED SUYO CUKE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10827" +"0074840401197","SEEDS,TOMATO PASTE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10829" +"0074840401204","SEEDS TOM YELLOW","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10831" +"0074840401212","PFLOWER MARIGOLD BUT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10833" +"0074840401223","SEEDS CHILE RELLENO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10835" +"0074840401227","PSEED MORNING GLORY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10837" +"0074840401232","SEEDS, PIMIENTO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10839" +"0074840401236","PSEED PUMPKIN JACK-O","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10841" +"0074840401253","PSEED SW WILL INTENS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10843" +"0074840401270","PSEED BEAN PROVIDER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10845" +"0074840401272","PSEED LIMA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10847" +"0074840401274","PSEED WAX BEAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10849" +"0074840401302","SEEDS, POPPY HUNGARI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10851" +"0074840401310","SEEDS, QUINOA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10853" +"0074840401326","PSEEDS CORN HOPI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10855" +"0074840401335","PSEED BASIL HOLY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10857" +"0074840401337","SEEDS, BASIL CINNAMO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10859" +"0074840401340","PSEED CATNIP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10861" +"0074840401344","PSEED DILL BOUQUET","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10863" +"0074840401349","PSEED LEEK PONCHO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10865" +"0074840401356","SEEDS, MOTHERWORT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10867" +"0074840401359","SEEDS COLLARDS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10869" +"0074840401365","PSEEDS ST JOHNS WORT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10871" +"0074840401367","PSEED SAGE GARDEN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10873" +"0074840401375","SEEDS, SORREL GARDEN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10875" +"0074840401382","PSEED CABBAGE EARLY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10877" +"0074840401389","SEEDS, ASTER GIANT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10879" +"0074840401391","SEEDS, POPPY APRICOT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10881" +"0074840401394","PSEED EBONY SHOO FLY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10883" +"0074840401397","PSEED COSMOS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10885" +"0074840401399","SEEDS, BEETBERRY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10887" +"0074840401404","DAISY GLORIOSA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10889" +"0074840401411","PSEED POPPY CALIFORN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10891" +"0074840401416","PSEED SUNFLOWER MEXI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10893" +"0074840401422","SEEDS, BALSAM GARDEN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10895" +"0074840401428","SEEDS, BROOMCORN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10897" +"0074840401432","SEEDS ZUKES CASERTA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10899" +"0074840401441","SEEDS, VALERIAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10901" +"0074840401446","PSEED SQUASH BLUE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10903" +"0074840401451","PSEED BASIL FINO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10905" +"0074840401457","PSEED CARROT RED COR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10907" +"0074840401461","PSEED CARROT ST VALE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","10909" +"0074840401465","SEEDS, BEET DARK DET","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10911" +"0074840401477","PSEED TURNIP PURPLE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10913" +"0074840401485","PSEED FENNEL BRONZE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10915" +"0074840401487","PSEED CHINESE PINK","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10917" +"0074840401492","PSEED LEEK SHERWOOD","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10919" +"0074840401505","PSEED CABBAGE CHINES","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","208","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10921" +"0074840401508","SEED, JALEPENO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10923" +"0074840401518","PSEED SQUASH SPAGHET","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10925" +"0074840401531","PSEED MOON AND STAR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10927" +"0074840401539","SEEDS, BEAN JACOB BU","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10929" +"0074840401541","PSEED BEAN ITALIAN P","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10931" +"0074840401549","PSEED BROWN SWEDISH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10933" +"0074840401552","BUSH BEAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10935" +"0074840401555","PSEED MUSKEMELON HAL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10937" +"0074840401561","PSEED LETTUCE LONG S","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10939" +"0074840401565","PSEED LETTUCE BRUNE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10941" +"0074840401569","PSEEDS ONION NEWBURG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10943" +"0074840401571","PSEED CHARD RHUBARB","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10945" +"0074840401576","PSEED CARROT ST VALE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","10947" +"0074840401582","PSEED LETTUCE BATAVI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10949" +"0074840401585","PSEED ONION ROSSA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10951" +"0074840401588","PSEED SQUASH R KURI","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10953" +"0074840401592","SEEDS, SAFFLOWER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10955" +"0074840401614","PSEED TOMATO THESS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10957" +"0074840401616","PSEED BLUESPIRE LARK","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10959" +"0074840401625","PSEED COREOPSIS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10961" +"0074840401627","SEEDS, DAISY ZULU","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10963" +"0074840401630","SEEDS, SNAPDRAGON","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10965" +"0074840401635","SEEDS, SUNFLOWER EVE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10967" +"0074840401640","PSEED PEPPER RELLENO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10969" +"0074840401656","SEEDS, AGROSTEMA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10971" +"0074840401676","PSEED TOMATILLO VERD","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10973" +"0074840401702","SEEDS, BASIL ANISE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10975" +"0074840401704","PSEEDS DOTTED MINT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10977" +"0074840401710","PSEED DILL DUKAT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10979" +"0074840401719","PSEED MUGWORT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10981" +"0074840401727","PSEED TARRAGON MEX","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10983" +"0074840401729","SEEDS, CHERVIL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10985" +"0074840401734","PSEED BACHELOR BUTTO","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10987" +"0074840401746","SEEDS, NICOTIANA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10989" +"0074840401753","PSEED CARDINAL FLOWE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10991" +"0074840401760","PSEED SUNFLOWER ISR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10993" +"0074840401763","PSEED CALENDULA RED","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10995" +"0074840401767","SEEDS, PUSLANE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10997" +"0074840401776","SEEDS SAGE VICTORIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","10999" +"0074840401780","PSEEDS LETTUCE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11001" +"0074840401789","SEEDS CAULIFLOWER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11003" +"0074840401791","SEEDS, PEA SHELL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11005" +"0074840401793","SEEDS PEAS SNAP","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11007" +"0074840401798","PSEEDS LETTUCE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11009" +"0074840401811","SEEDS, AMARANTH BLEE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11011" +"0074840401841","PSEED ZUKE WHITE EGY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11013" +"0074840401875","SEEDS SUNFLOWER MIX","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11015" +"0074840401901","PSEED MESCLUN SALAD","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11017" +"0074840401911","SEEDS, CABBAGE CHINE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11019" +"0074840401921","PSEED ZINNIA PINK","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11021" +"0074840401946","PSEEDS LAVATERA MONT","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11023" +"0074840404400","PSEED BRIGHT COSMOS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11025" +"0074840404429","PSEED PORTULACA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11027" +"0074840404437","PSEEDS BEAN CHEROKEE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11029" +"0074840404443","PSEED ZINNIA PURPLE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11031" +"0074840404446","PSEED SUPER CELOSIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11033" +"0074840404452","PSEED YELLOW COSMOS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11035" +"0074840404455","PSEED TOMATO MATINA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11037" +"0074840404466","PSEED BROCOLLI RAAB","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11039" +"0074840404497","PSEED ZINNIA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11041" +"0074840404514","PSEED RUTABAGA JOAN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11043" +"0074840404538","PSEEDS HABANERO CHIL","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11045" +"0074840404995","PSEED BULLS BLOOD BE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11047" +"0074840405005","PSEED FLOWER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11049" +"0074840425889","SIMMER SAUCE OG TIKA MAS","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1605","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.66","1","3","4","0","0","0","11051" +"0074840425891","SIMMER SAUCE OG MADRAS","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1605","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.66","1","1","4","0","0","0","11053" +"0074875311771","BLUEBRY B MEGA JC COL GOR","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16398" +"0074875314441","PJU CG RASP PEACH SMOOTHIE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","554","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11055" +"0074875317271","PJUICE CG RASP CRAN","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","1","0","748","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11057" +"0074875317571","PROTEIN COGO JC COL GOR","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16401" +"0074875317771","VITASEA JC COL GOR","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16400" +"0074875366663","STRW BAN SMOOTHIE COL GOR","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16399" +"0074875381318","ORANGE CRT BAN COGO","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16558" +"0074875390003","PAPPLE BAG LIBERTY","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1213","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11064" +"0074875390110","PPEAR BAG BARTLET","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11066" +"0074875390528","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11068" +"0074875391219","PJUICE CG GRAPEFRUIT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","556","0","0","1","0","0","1138","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11070" +"0074875391619","PJUICE CG TANGERINE","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","749","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11071" +"0074917409120","DRAIN OPENER","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.19","1","0","4","0","0","0","11074" +"0074917409412","NON-ABRASIVE CRM CLEANSER 16 O","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.33","1","6","4","0","0","0","11075" +"0074917409720","DISHMATE PEAR","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","b2209","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.39","1","1","4","0","0","0","11077" +"0074917409727","DISHMATE,LAVENDER 25 OZ","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","b2209","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.39","1","1","4","0","0","0","11079" +"0074917409735","FRUIT & VEG WASH,SPRAY","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.37","1","1","0","0","0","0","15680" +"0074917409754","AUTO-DISHWASHING,GEL,F&C","5.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16660" +"0074917409909","ICE MELT","11.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","181","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.28","1","3","4","0","0","0","11085" +"0074951222350","IANS GF CHICK NUGS","6.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.61","1","1","2","0","0","0","11093" +"0074951277220","PANKO BREAD CRUMBS ITALIAN","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.23","1","1","4","0","0","0","11096" +"0074960101201","BERLIN BREAD SPELT","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.86","1","0","3","0","0","0","11098" +"0074960101203","BERLIN WHITE SPELT BREAD","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.8","1","0","3","0","0","0","11100" +"0074960108201","BERLIN ZUCCHINI HOLIDAY BREAD","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11102" +"0074998500064","AUBREY NUSTYLE ORG HSPRAY","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14988" +"0074998501001","AUBREY GPB SHAMPOO 11 OZ","9.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11104" +"0074998504081","AUBREY ALOE VERA","7.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11111" +"0074998504254","AUBREY SUN SPF 8","7.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11114" +"0074998508060","AUBREY SUPER HOLD HAIRSPRAY","9.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11119" +"0075005450001","PSPROUTS ALFALFA NON-O","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1021","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","11122" +"0075005450017","PSPROUTS ALFALFA NON-O","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1021","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","11124" +"0075038800215","WESTBY 2% COTTAGE CHS 16 OZ","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.03","1","0","0","0","1","0","12965" +"0075038800420","WESTBY 4% COTTAGE CHS 32 OZ","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","13003" +"0075038810115","WESTBY SOUR CREAM 16 OZ","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","12966" +"0075038820101","BUTTER,rBGH FREE","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","26","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","3.08","1","0","0","0","1","0","11126" +"0075098000532","DRINK EASE","13.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","104","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14768" +"0075167512122","STACYS WL WHT TORTILLA 8\",\"3.8","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","0","0","1","0","0","0","May 06 2011 1","0000-00-00 00:00:00","0","1","0","0","0","0","0","0","1","0","0","0","0","16347","0","16669" +"0075167512124","STACYS WHITE TORTILLA 10\",\"4.","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","0","0","1","0","0","0","Apr 28 2011 1","0000-00-00 00:00:00","0","1","0","0","0","0","0","0","1","0","0","0","0","16370","0","16670" +"0075194488006","PHERB BABY DILL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","909","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","3","6","0","0","0","11128" +"0075194488010","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","11130" +"0075194488021","PHERB LEMONGRASS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","918","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11132" +"0075194498004","PHERB CHIVES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","908","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11134" +"0075194498008","PHERB SPEARMINT","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","935","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11136" +"0075194498010","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","11138" +"0075194498012","PHERB TARRAGON","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","937","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11140" +"0075197202101","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11142" +"0075197203100","PGRAPEFRUIT BAGGED","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11144" +"0075197203200","PLIMES BAG 1#","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","758","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11146" +"0075253600023","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11148" +"0075258701530","FRUIT FLY LURE","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16251" +"0075379200101","PBERRY CRANBERRY NON-O","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","733","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11153" +"0075413012350","PTANGERINE BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","824","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","3","6","0","0","0","11155" +"0075413012352","PTANGERINE BAG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","634","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11157" +"0075535500100","PNUT BTTR FILLED PRETZEL","2.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.68","1","6","4","0","0","0","12870" +"0075535500531","VEGGIE STIX, PIZZA","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.77","1","3","0","0","0","0","16454" +"0075535510009","SFRANCE LAVENDER SOAP","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","b2208","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.87","1","1","0","0","0","0","14103" +"0075535510025","SFRANCE SHEA BUTT SOAP","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","b2208","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.87","1","1","0","0","0","0","14102" +"0075535510038","SFRANCE GARDENIA SOAP","5.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","b2208","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.87","1","1","0","0","0","0","14838" +"0075535510081","SFRANCE LAVENDER LIQ SOAP","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.46","1","1","0","0","0","0","15003" +"0075535510083","SFRANCE ORANGE LIQ SOAP","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.46","1","1","0","0","0","0","15002" +"0075536101201","LIQUID FISH","10.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11161" +"0075589100603","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11162" +"0075589118056","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11164" +"0075764500020","POPS CORN,OG,MICRO,BUTTER","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.03","1","1","4","0","0","0","11166" +"0075764500022","POPS CORN,OG,MICRO,FF,N/S","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","1","4","0","0","0","11168" +"0075764500800","THIN PRETZELS,OG,SALTED","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.92","1","1","4","0","0","0","11171" +"0075764501044","CUPS,OG,DARK CHOC,PNT BTR","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1593","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.93","1","1","4","0","0","0","11173" +"0075764501600","MINTS OG CINNAMON","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.37","1","1","4","0","0","0","11175" +"0075764501630","MINTS OG WINTERGREEN","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.37","1","1","4","0","0","0","11178" +"0075764501670","MINTS,OG,ROLL,WINTERGREE","0.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.42","1","1","4","0","0","0","11180" +"0075764501810","LICORICE,OG,TWST STRWBRY","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.57","1","1","0","0","0","0","15766" +"0075764502140","NEWMAN OS ORIGINAL","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16657" +"0075764502144","NEWMAN OS MINT","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16610" +"0075764502150","COOKIE,OG3,OS,PNUT BUTT","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16613" +"0075764502207","FIG NEWMANS,OG,LF","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.7","1","1","4","0","0","0","11182" +"0075764502239","COOKIE,OG,PNTBTR OS,SWC","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.76","1","3","0","0","0","0","15764" +"0075764502242","COOKIE,OG,CHOCOLATE CREME","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","1562","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.76","1","3","4","0","0","0","11185" +"0075764502247","NEWMANS GINGER 0s","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","1562","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.76","1","1","4","0","0","0","11187" +"0075764502250","COOKIES,OG,ALPHABET,CHOC","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.02","1","6","4","0","0","0","11188" +"0075764561200","DOG FOOD,OG,CHKN&RCE,CAN 12.7","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.59","1","1","4","0","0","0","11191" +"0075764561305","DOG TREATS,OG,SMALL,CHCKN 10 O","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.3","1","1","4","0","0","0","11193" +"0075764561400","PET TRAIN TRTS OG CHCKN RICE","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","4","0","0","0","11195" +"0075764562210","CAT FOOD,OG,TURKEY,CAN","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.02","1","1","4","0","0","0","11197" +"0075764566010","DOG FOOD OG ADLT CHKN RCE 7LB","20.39","0","0","0","16.29","0","16.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","12.07","1","6","4","0","0","0","11199" +"0075764567010","CAT FOOD ADLT CHK RICE 4LB","22.75","0","0","0","16.99","0","16.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","13.48","1","1","4","0","0","0","11202" +"0075792204379","WAFERS,OG,CHOCOLATE FILLD","2.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.55","1","6","4","0","0","0","11205" +"0075792211615","COFFEE,OG,FREEZE DRD,DECF","10.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","6.07","1","1","1","0","0","0","11207" +"0075859101103","TODDY FILTERS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","9","0","1","0","11209" +"0075928300012","COOKIES,FUDGE SHORTBR","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3","1","1","4","0","0","0","11212" +"0075928300127","STROGANOFF PASTA & SAUCE","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","167","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.02","1","1","0","0","0","0","16315" +"0075928310045","CRACKERS,OG, STONEGROUND WHEAT","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","b2205","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.11","1","1","4","0","0","0","11215" +"0075928310050","CRACKERS,CRISPY CHEDDARS","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","b2205","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.11","1","1","0","0","0","0","13922" +"0075928360011","BOCA CHIKN PATTIES","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","3","2","0","0","0","11217" +"0075928360015","BURGER,OG,VEGAN,VEG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.96","1","3","2","0","0","0","11219" +"0075928360106","BOCA GROUND CRUMBLES","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.96","1","3","2","0","0","0","11221" +"0076059010071","ENERGY BAR,OG,ORIGINAL","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1568","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.08","1","6","4","0","0","0","11223" +"0076059010074","ENERGY BAR,OG,LUSHUS LMN","2.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1568","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.08","1","6","4","0","0","0","11225" +"0076070228555","SOCK HIKER MTN OLV 9-11","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.81","1","3","0","0","0","0","13271" +"0076070228995","SOCK HIKR MTN BLK 9-11","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.81","1","3","0","0","0","0","13270" +"0076070229005","SOCK URB HKR SHRT BLK 9-11","11.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.01","1","3","0","0","0","0","13266" +"0076070229015","SOCK URB HIKR SHRT SAND 9-11","11.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.01","1","3","0","0","0","0","13267" +"0076070229035","SOCK URB HIKR TALL BLK 9-11","13.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.89","1","3","0","0","0","0","13268" +"0076070229045","U.H OLIVE TALL 9-11-WOOL","13.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.89","1","0","0","0","0","0","13269" +"0076070245255","MAGGIES TIE DYE SOCK-9-11","11.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.03","1","3","0","0","0","0","14118" +"0076070245555","COTN CREW SOCK, OLIVE 9+","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.66","1","3","0","0","0","0","14025" +"0076070255521","COTN CREW SOCK,NATURAL 9+","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.66","1","3","0","0","0","0","14023" +"0076070255725","COTN CREW SOCK,EGGPLANT 9+","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.66","1","1","0","0","0","0","14021" +"0076070255986","COTN CREW SOCK,BLK 10+","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.66","1","3","0","0","0","0","14026" +"0076070256066","CREW SOCKS 3 PAK SZ 10-13","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.35","1","0","0","0","0","0","13088" +"0076070256076","CREW SOCKS 3 PAK SZ 10-13","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.35","1","0","0","0","0","0","13090" +"0076070286996","BLK HERRINGBONE SOCK 10+","7.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.68","1","3","0","0","0","0","14029" +"0076086007133","CHRISTMAS TREE CANDLE","12.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11233" +"0076086028201","2.5oz FENG SHUI METAL CANDLE","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.46","1","0","0","0","0","0","15709" +"0076086028203","2.5oz FENG SHUI WATER CANDLE","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","15710" +"0076086028205","2.5oz FENG SHUI EARTH CANDLE","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.46","1","0","0","0","0","0","15714" +"0076086028802","FENG SHUI WOOD CANDLE","17.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","15704" +"0076086028804","FENG SHUI FIRE CANDLE","17.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","15708" +"0076086072150","PALM TAPERS RED","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.98","1","0","0","0","0","0","11234" +"0076086072190","PALM TAPER GREEN","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.98","1","0","0","0","0","0","11236" +"0076086072320","PALM TAPERS ORANGE ALOHA","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","11238" +"0076086084290","CANDLE TEA LIGHTS 12PK","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11240" +"0076163520360","PBLUEBERRIES NON-O PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13842" +"0076165790331","CROTTIN, PLAIN","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","11243" +"0076165790336","CROTTIN GARLIC & HRB","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","3","0","0","0","11245" +"0076165790416","MONT CH HERB GARLIC","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11248" +"0076165792417","MONTCHEVRE HONEY GOAT CHEESE","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","0","0","0","0","0","13981" +"0076194488010","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","11251" +"0076245335001","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11253" +"0076302600056","ORANGE & CRANBERRY SPREAD","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13475" +"0076324719891","PSPROUTS ALFALFA","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1021","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","11254" +"0076324719933","PSPROUT DAIKON","1.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","","0","1","0","0","1022","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14285" +"0076443067707","EARTH SOL BREATHE EASY","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.03","1","0","5","0","0","0","11257" +"0076443067709","EARTH SOL STUDY BUDDY","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.03","1","0","5","0","0","0","11259" +"0076443067725","EARTH SOL APP CONTROL","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.03","1","0","5","0","0","0","11261" +"0076443067928","EARTH SOL INHALER SMOKE LESS","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11263" +"0076443068245","EARTH SOL INSOMNIA REL","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11268" +"0076566711010","SNACKS,SESAME SEAWEED","1.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.87","1","0","0","0","0","0","16180" +"0076566730010","SAUCE, CHINESE STIR FRY","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.07","1","1","4","0","0","0","11269" +"0076566790020","ANNIES CHUNS GRLC CHKN WONTON","3.19","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","1.99","1","6","0","0","0","0","13528" +"0076566790060","WONTONS, MINI, SPICY VEG","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.99","1","1","0","0","0","0","16204" +"0076570413361","Smoke Free Spray","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11273" +"0076570450303","HERBS ETC DEEP SLEEP 30 CT","14.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11275" +"0076570450966","SMOKE FREE","23.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11277" +"0076596500258","TOM BASIL GOUDA","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11278" +"0076668400900","PCARAMEL DIP 18OZ","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","1066","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11290" +"0076733507776","RTS SOUP,CHKY TOMATO,BPA","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.77","1","6","0","0","0","0","14662" +"0076733507778","RTS SOUP,LENTIL,LS,BPA F","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.77","1","6","0","0","0","0","14663" +"0076738700009","PASTA, SPAGHETTI THIN","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","11291" +"0076738700017","PASTA, LINGUINE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","11293" +"0076738700080","PASTA, LASAGNA","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16622" +"0076770700118","CHEDDAR IRISH DUBLIN","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11295" +"0076777600921","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11297" +"0076777600928","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11299" +"0076777601041","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11301" +"0076777601121","PAPPLE BAG CAMEO","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","1211","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11303" +"0076777601185","PAPPLE BAG GRANNY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11305" +"0076777601721","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11306" +"0076777602135","PAPPLE BAG G DELICIO","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","533","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11308" +"0076777603776","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11310" +"0076777608221","PAPPLE BAG JONAGOLD","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","534","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11312" +"0076777610119","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11314" +"0076777610121","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11315" +"0076777610806","PAPPLE BAG SOMMERFELD","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","505","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11316" +"0076777611008","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11318" +"0076777611214","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11320" +"0076777630033","PPEAR BAG BARTLETT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","0","0","1","0","0","630","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11322" +"0076777650412","PAPPLE BAG GRANNY SMITH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11324" +"0076777650513","PPEAR DANJOU BAG","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","545","","0","1","0","0","635","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14584" +"0076777670825","PPEAR BAG red d'anjou","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","546","0","0","1","0","0","803","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13161" +"0076777690001","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11327" +"0076777690125","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11329" +"0076777690613","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11331" +"0076777690807","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11333" +"0076796303716","STARWEST VEG GLYCERINE 4OZ","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16329" +"0076865900014","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","11336" +"0076865900019","PHERB THYME","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","938","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","3","6","0","0","0","11338" +"0076865900021","PHERB MARJORAM","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","919","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11340" +"0076865900031","PHERB POULTRY MIX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","929","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11342" +"0076899001720","NN CHILDRENS DHA 180 CT","26.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","11345" +"0076899001770","NN COMPLETE FORMULA LEMON 60CT","22.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","11347" +"0076899001790","NN ULTIMATE OMEGA 60 CT","30.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","11348" +"0076899002764","OMEGA FISH OIL 16Z NN","49.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15584" +"0076899041760","OMEGA 3 FISH GEL LEMON 60 CAPS","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","5","0","0","0","11353" +"0076899054783","NN ARCTIC D 8OZ ORANGE","28.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16353" +"0076899057785","NN ARCTIC COD LEMON 90 CAPS","24.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","1","5","0","0","0","11355" +"0076956210181","TOTS WIPES,FLUSHABLE","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.41","1","0","0","0","0","0","14298" +"0077000900112","COFF FILTER #2 CONE BRWN IYC","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","1","4","0","0","0","11358" +"0077000901048","BAKING CUPS,BROWN-2.5","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.05","1","1","4","0","0","0","11360" +"0077000905004","CHEESE CLOTH,UNBLEACHED","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.71","1","0","0","0","0","0","13817" +"0077000925033","FIRESTARTER,100% BIOMASS","5.95","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","186","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","3.6","1","1","0","0","0","0","14409" +"0077387634469","SUGAR SAVER FAIRY","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11365" +"0077387634504","SUGAR SAVER SUNFLWR","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11367" +"0078005308200","PROBIO CAPRICIN","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11369" +"0078035378421","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11371" +"0078087207035","BONE,RAWHIDE,MINI KNOTTE","2.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.37","1","1","0","0","0","0","15084" +"0078099900091","SODA,GINGER-ALE","7.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.49","1","1","0","0","0","0","14209" +"0078099900351","MIXER,MOJITO COCKTAIL","7.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.34","1","1","4","0","0","0","11377" +"0078099900381","MIXER,COSMOPOLITAN COCKT","7.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.34","1","1","4","0","0","0","11380" +"0078172380423","HONEY DIPPER","2.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14971" +"0078172800003","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11381" +"0078202932601","SALSA LISA CHIPOTLE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15420" +"0078202962303","SALSA LISA HOT 16Z","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","1","0","11383" +"0078212600200","TAMPONS,OG,SUPER","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","100","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.41","1","1","5","0","0","0","11385" +"0078212600300","PANTY SHIELDS","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","100","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.79","1","1","5","0","0","0","11386" +"0078212600302","PADS, REGULAR","4.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","100","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.32","1","1","5","0","0","0","11388" +"0078212600305","NTCARE ULTRA PADS w WINGS","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","100","0","0","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.98","1","1","0","0","0","0","15504" +"0078212600800","TAMPONS,OG,REG W/APPLICTR","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","100","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","4.05","1","1","5","0","0","0","11393" +"0078243613311","PCIDER APPLE GALLON SUNRISE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","708","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15565" +"0078275812001","EDAMAME IN SHELL","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.78","1","0","2","0","0","0","11397" +"0078292712342","Spinach Parmesan Pesto","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","14877" +"0078292712347","SUNDRIED TOMATO PESTO","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","0","0","13258" +"0078292712349","SWEET RED PEPPER PESTO","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13259" +"0078397920001","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11401" +"0078503000002","PASTA SCE,OG,GRLC&MERLOT 14 OZ","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1610","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.42","1","6","4","0","0","0","11403" +"0078503000010","RAVIOLI,OG,GARLIC & MOZZ","3.85","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.36","1","1","2","0","0","0","11405" +"0078503002041","RAVIOLI, OG, FOUR CHS 16OZ","6.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.19","1","3","0","0","0","0","15578" +"0078503002044","RAVIOLI, OG, SPIN RCTTA 16OZ","6.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.19","1","3","0","0","0","0","15579" +"0078503011692","RAVIOLI,OG,CHANTRL MUSHRM","3.85","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.36","1","1","0","0","0","0","11412" +"0078503022770","RAVIOLI,OG,VGN,SPNCH FLO","3.85","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.36","1","1","0","0","0","0","11414" +"0078503044444","PASTA SCE,OG,GRLC&CHANTRL 14 O","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","1610","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.42","1","6","4","0","0","0","11416" +"0078503055556","RAVIOLI,OG,VG,CRMY ARTICH","3.85","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.36","1","1","0","0","0","0","11418" +"0078503055559","TORTELLONI,OG,4 CHEESE","3.85","0","0","0","2.59","0","2.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.36","1","1","0","0","0","0","11420" +"0078506300217","CAPERS","3.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11422" +"0078621688200","BUG BAND SNG","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11424" +"0078621688202","BUGBAND PINK","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11426" +"0078621688204","BUG BAND SNG","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11428" +"0078621688206","BUG BAND FAMILY PACK","14.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11430" +"0078664808002","NEEM AURA CITRONELLA INCENSE","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11433" +"0078679100202","BEELER MPL BRKFST SAUS","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","0","0","15460" +"0078679100507","BEELER LIL BITES","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","0","0","1","0","11435" +"0078679101000","BEELER BRATWURST","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.66","1","0","0","0","1","0","11440" +"0078679109101","BEELER BACON","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","4.45","1","3","0","0","1","0","11442" +"0078696901005","OIL,OLIVE,OG,EX VIRGIN 25.4Z","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","b2210","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","8.51","1","1","4","0","0","0","11446" +"0078696903010","COOKING WINE,SHERRY","4.29","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.42","1","1","0","0","0","0","14296" +"0078764710177","HEEL TRAUMEEL CREAM 1.76 OZ","19.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10.87","1","6","5","0","0","0","11450" +"0078928710032","GEORGES ALOE 32 OZ","10.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","106","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.75","1","6","5","0","0","0","11453" +"0078928711017","GEORGES ALOE SPRAY MISTER","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.48","1","6","5","0","0","0","11455" +"0078962252544","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11457" +"0078962252555","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11459" +"0078962252558","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11461" +"0078962252560","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11463" +"0078962252570","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11465" +"0078962252577","PLEMON BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","11467" +"0078962252628","PCELERY HEARTS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","544","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11469" +"0078962253008","PKIWIFRUIT BAG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","547","0","0","1","0","0","549","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11471" +"0078962253031","PCARROT BABY 1#","1.69","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","865","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11473" +"0078962253070","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","0","1","8","0","0","0","0","14681" +"0078962270227","PSALAD BABY SPIN GH","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","666","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11476" +"0078962270229","PBABY SPINACH FAMILY SIZE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1148","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11478" +"0078962290202","PCARROT BAG 2#","2.29","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","512","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","11480" +"0078962290447","PSALAD SPRING MIX CLAM 5 OZ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1357","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11482" +"0078962290514","PDRESSING BLUE CHEESE","0.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","881","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11484" +"0078962290516","PDRESSING GODDESS","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","883","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11486" +"0078962290518","PDRESSING CHIPOTLE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","882","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11488" +"0078962290590","PPOTATO RED BAG 3-LB","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11490" +"0078962290612","PSALAD SPRING MIX CLAM 5 OZ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1357","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11492" +"0078962290682","PJUICE LEMON SHOT","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","755","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11495" +"0078962290711","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11497" +"0078962290825","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11499" +"0078962290948","PDRESSING GH BALSAMIC","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","883","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13045" +"0078962290951","PDRESSING GH RANCH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","884","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13047" +"0078962290954","papple gala bagged","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","529","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11502" +"0078962290956","PAPPLE BRAEBURN BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","527","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12808" +"0078973810010","PROSEED GSE 90 CT","16.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9","1","0","5","0","0","0","12788" +"0078973810030","PROSEED EARDROPS","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.51","1","0","5","0","0","0","11503" +"0078973810070","PROSEED FEM RINSE","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.51","1","0","0","0","0","0","14097" +"0078995940553","PMANDARIN BAG NON-O","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1431","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16404" +"0079087400101","SALSA OG MILD DREWS","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.19","1","1","4","0","0","0","11506" +"0079087400105","SALSA OG CHIPOTLE LIME","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.19","1","3","4","0","0","0","11508" +"0079087437394","DRESSING,GARLIC&PEPPRCRN","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1522","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","11510" +"0079087437414","DRESSING,ROMANO CAESAR","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1522","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","11512" +"0079087437416","DRESSING, BUTTERMILK RANCH","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","173","0","0","1","0","0","1522","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.91","1","1","4","0","0","0","11514" +"0079112020050","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11516" +"0079155915000","BROWN RICE PIZZA CRUST","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.71","1","0","2","0","0","0","11518" +"0079156728736","PBURDOCK ROOT PACKAGED","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","859","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","11520" +"0079156752523","PSALAD SPRING MIX BAG LOCAL","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","669","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11522" +"0079156768213","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11524" +"0079156777462","BSALAD SAVOY SPINACH BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1144","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11526" +"0079157260060","COLD SNAP","14.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.53","1","0","5","0","0","0","11528" +"0079183310011","HOLYLAND HUMMUS 8OZ","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","13995" +"0079183310020","HOLYLAND BASIL TOM HUMMUS","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","1","0","11535" +"0079183310029","HOLY LAND HUMMUS RSTD RED PEP ","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","2","0","1","0","11537" +"0079183310041","HOLY LAND HUMMUS GRLC ARTCHK ","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","1","0","11543" +"0079183310069","HOLY LAND HUMMUS 14oz","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","16519" +"0079183320021","HOLY LAND GREEK NAN PITA","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","2","0","1","0","12942" +"0079183320048","HOLY LAND WW GREEK PITA","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14667" +"0079245325900","PTANGERINE BAG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","634","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11558" +"0079265601000","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11560" +"0079285000112","BBEES PEPP ROSE BODY WASH 12OZ","7.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11564" +"0079285000174","BBEES AFTER SUN SOOTHER 8OZ","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14496" +"0079285000181","BBEES ACNE SOL GEL CLEANSER","9.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11567" +"0079285000235","BBEES MULTICARE TP FL FREE","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13604" +"0079285000261","BBEES ORANGE WOW TP KIDS","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14680" +"0079285000275","BBEES LIP BALM PACK CLASSIC","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14017" +"0079285000353","BBEES MAMA BEE BELLY BALM","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14986" +"0079285000385","BBEES BABY SHAM BWASH 8OZ","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14238" +"0079285000493","BBEES MULTICARE TRIAL","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","99","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15319" +"0079285000660","BBEES MILK HONEY LOTION 2.5OZ","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16578" +"0079285000740","BBEES MANGO LIP BALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15110" +"0079285000743","BBEES BIT OF BURTS ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15320" +"0079285000760","BBEES ACAI LIP BALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15111" +"0079285000920","BBEES MILK HONEY LOTION 1OZ","1.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15696" +"0079285005099","BURTS BEES CARROT NIGHT CREME","13.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11570" +"0079285005399","BURTS BEES MILK HONEY LOTION","8.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11572" +"0079285006399","BBEES GARDCARROT COMPLEX SOAP","6.75","0","0","0","4.65","0","4.65","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","13112" +"0079285006999","BURTS BEES COC FOOT CREAM","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11575" +"0079285008499","AVOCADO HAIR TREATME","8.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11577" +"0079285010599","BURTS BEES HAND SALVE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11579" +"0079285011099","BURTS BEES LIP BALM TUBE","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11581" +"0079285013111","BBEES HERBAL DEOD 4 FL OZ","6.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11583" +"0079285013699","BBEES HONEY LIP BALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11586" +"0079285015299","BURTS BEES INSECT REPELLANT","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","86","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11588" +"0079285015799","BURTS BEES POMEGRANATE LIPBALM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11590" +"0079285018699","BBEES RADIANCE NIGHT CREAM","15.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16358" +"0079285019599","BURTS BEES LIP BALM LIFEGUARDS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11593" +"0079285028999","BURTS BEES ROSE GLYC TONER","9.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11597" +"0079285032099","BBEES NAT AGELESS DAY LOTION","22.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11599" +"0079285032599","BBEES RADIANCE SPF MOIST","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14077" +"0079285033599","BBEES EXFOLIATING BODY WASH","7.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","95","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11604" +"0079285056899","BURTS BEES MENS BAR SOAP","3.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11606" +"0079285057500","BBEES MENS DEODORANT","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","88","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11608" +"0079285064499","BBEES HONEY SHEA BODY BUTTER","11.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11612" +"0079285071699","BURTS BEES BUTTERMLK LOTION","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","5","0","0","0","11616" +"0079285074399","BBEES BABY SHAM BWASH 12OZ","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15854" +"0079285074999","BBEES DUSTING POWDER 7.5oz","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16535" +"0079285078299","BBEES MUSCLE MEND","6.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","90","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15917" +"0079285081199","BBEES POM SOY SHAMPOO","12.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15318" +"0079285088999","BBEES SOAP BARK CHAM CLEANSER","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","11620" +"0079357344053","POTTERS CRACKERS","6.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11623" +"0079357348484","CRAPOLA NUMBER 2","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16652" +"0079421300013","BURGER SUNSHINE SOUTHWEST","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.6","1","1","2","0","0","0","11626" +"0079437610003","DOROT CRUSHED GARLIC","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.42","1","3","0","0","0","0","15835" +"0079437610011","DOROT CHOPPED BASIL","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.42","1","3","0","0","0","0","15831" +"0079437610014","DOROT CRUSHED GINGER","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.42","1","3","0","0","0","0","15836" +"0079452220012","TEA,HERBAL,REFRESH 20 BAG","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.59","1","1","4","0","0","0","11627" +"0079452220045","TEA,HERBAL,PASSION 20 BAG","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.59","1","1","4","0","0","0","11629" +"0079452220098","TEA,OG,GREEN,OM","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.86","1","1","4","0","0","0","11630" +"0079471691101","PIZZA SAUCE OLD WORLD","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","177","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.38","1","1","4","0","0","0","11632" +"0079471691117","PIZZA CRUST, TUSCAN 6GRN","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.51","1","1","4","0","0","0","11634" +"0079471691424","PIZZA CRUST, CHEESY HERB","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.51","1","1","4","0","0","0","11636" +"0079523920060","TEECCINO HERBAL COFFEE HAZLNUT","7.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0","1","0","1","0","0","0","11638" +"0079523920110","MAYA CAFFEE ORGANIC","9.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","11640" +"0079523940130","TEE-BAGS,OG,MAYA CHOC HR","4.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.69","1","6","0","0","0","0","15870" +"0079523980080","HRBL COFFEE,OG,MOCHA","9.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.47","1","1","1","0","0","0","11642" +"0079563133324","2# RED ONION BAG","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14651" +"0079563133460","PONION BAG YELLOW NON-O","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","","0","1","0","0","1397","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","1","0","0","0","0","14716" +"0079563180260","PPOMEGRANATE SEEDS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","814","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15852" +"0079563180630","Tropical Mix","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16480" +"0079563180690","PFRUIT CUT TROPICAL TRIO","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","743","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15577" +"0079563182540","PSTIR FRY MIX","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1057","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16382" +"0079570901007","WALLABY,OG,LF,CHERRY","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.68","1","1","2","0","0","0","11646" +"0079570903004","WALLABY,NF,BLACKBERRY","1.15","0","0","0","0.89","0","0.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0.68","1","6","2","0","0","0","11651" +"0079570903009","WALLABY,OG,NF,STWBRY GUAVA","1.15","0","0","0","0.89","0","0.89","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0.68","1","6","2","0","0","0","11654" +"0079592236368","FIBERMATE POWDER 2.5 OZ","20.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","11656" +"0079592236383","ALOE LIFE STOMACH FORMULA","19.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","11658" +"0079921011250","VINEGAR,OG,BALSAMIC","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.95","1","1","4","0","0","0","11668" +"0079921022224","FRUIT SPREAD,OG,PLUM","3.99","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.57","1","1","4","0","0","0","11670" +"0079921022228","FRUIT SPREAD,OG,BILBERRY","3.99","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","164","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","2.84","1","1","4","0","0","0","11672" +"0079921037501","FRUIT NECTAR,OG,APRICOT","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.62","1","1","4","0","0","0","11674" +"0079921037506","FRUIT NECTAR,OG,BILBERRY","4.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.62","1","1","4","0","0","0","11676" +"0079921043401","PASTA,OG,SPAGHETTI,G/F","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.01","1","1","4","0","0","0","11679" +"0079921055551","PASTA,OG,SPAGHETTI","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","1564","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","11682" +"0079921055554","PASTA,OG,FUSILLI","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","1564","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","11685" +"0079921064549","PASTA,OG,GOBBETTI,WW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","1564","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.91","1","1","4","0","0","0","11687" +"0079921066664","PASTA,OG,FUSILLI,WW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","1564","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.91","1","1","4","0","0","0","11689" +"0079921082502","PASTA,OG,PAPPARDELLE,EGG","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.35","1","1","4","0","0","0","11691" +"0079942488200","PMANDARIN SATSUMA BAG","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","779","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11693" +"0079951201205","SORBET,RASPBERRY","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.2","1","1","2","0","0","0","11702" +"0079951201210","SORBET,BLOOD ORANGE","5.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.2","1","1","2","0","0","0","11703" +"0079985700201","PHERB TARRAGON","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","937","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11706" +"0079985700311","PHERB HOLIDAY MIX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","914","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11708" +"0079985700341","PHERB SEAFOOD MIX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","934","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11710" +"0079985700401","PHERB MARJORAM","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","919","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11712" +"0079985700502","PHERB OREGANO","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","924","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11714" +"0079985700602","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","11716" +"0079985700802","PHERB SAGE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","931","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11718" +"0079985700901","PHERB SAVORY","0.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","1","0","933","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11720" +"0079985701101","PHERB THYME","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","938","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","3","6","0","0","0","11722" +"0079985701201","PHERB ROSEMARY","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","930","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.73","1","8","6","0","0","0","11724" +"0079985701302","CHIVE BOX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","908","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11726" +"0079985702101","PHERB SPEARMINT","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","935","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11728" +"0079985702301","PHERB LAVENDER","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","916","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11730" +"0079985703001","PHERB BABY DILL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","909","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.48","1","3","6","0","0","0","11732" +"0079985703401","PHERB BASIL 4OZ PESTO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","903","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11734" +"0079985703502","PHERB BASIL 3/4 OZ CLAMSHELL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","902","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11736" +"0079985703702","PHERB BAY LEAVES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","659","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11738" +"0079985703802","PLEMONGRASS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","1","0","917","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13830" +"0079985710010","PPEAS SNAP","3.49","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","979","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","0","1","8","6","0","0","0","11741" +"0079985765520","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11743" +"0079985765524","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11745" +"0079985765526","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11747" +"0079985765531","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11749" +"0079985765560","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11751" +"0079985765590","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11753" +"0079985766590","PTOMATO CHERRY VINE-ON","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","1035","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11755" +"0079986703401","PHERB BASIL 4OZ PESTO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","903","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11756" +"0080154150000","TULSI TEA OG ORIGINAL","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1615","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.75","1","6","4","0","0","0","11758" +"0080154150003","TULSI TEA OG POM GREEN","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1615","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.75","1","6","4","0","0","0","11760" +"0080154150012","TULSI TEA,OG,PEPPERMINT","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1615","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.75","1","6","0","0","0","0","13966" +"0080154150016","TULSI TEA OG SWEET ROSE","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","1615","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.75","1","6","4","0","0","0","11763" +"0080245800014","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11765" +"0080245800092","pppeppers","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","208","0","0","1","0","0","698","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11766" +"0080487906863","ALOTTI CHOCOLATE 6 PACK BAG","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","11768" +"0080487906867","Alotti P Butter 6 pack","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","11770" +"0080500200005","ORG GROOMING SHAVE BRUSH","4.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","103","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.4","1","1","5","0","0","0","11771" +"0080735610215","LORENTZ WR ASIAGO BRATWURST","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","11774" +"0080735610715","LORENTZ CHEDDAR BRATWURST","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","11776" +"0080735640140","LORENTZ HOT DOGS","7.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","11778" +"0080790600022","PSPROUTS ALFALFA ","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","522","0","0","1","0","0","1021","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","1","0","11779" +"0081020400112","PBERRY BLUBERRY NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11781" +"0081024924500","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11783" +"0081047400110","CHOC BAR,OG,LAVND,DRK 59%","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","1572","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.48","1","1","4","0","0","0","11785" +"0081047400113","CHOC BAR,OG,ECLPS,DRK 87","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.48","1","1","0","0","0","0","16174" +"0081053300704","VOLCANO LIMEADE","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","663","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14625" +"0081053300775","PJUICE TANGERINE VOLCANO","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","750","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11789" +"0081053300825","PJUICE VOLCANO BLOOD 250ML","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1092","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11790" +"0081053300996","PLEMON BURST","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","755","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11792" +"0081053300998","PLIME JUICE","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","761","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11794" +"0081076600001","SCHULTZ ORGANIC LRG EGGS","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","28","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","14708" +"0081076600114","SCHULTZ ORG CHICKEN BFAST LNKS","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","11796" +"0081076600121","SCHULTZ CHICKEN SAGE SAUSAGE","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","11798" +"0081076600216","SCHULTZ ORGANIC GROUND CHICKEN","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","11800" +"0081127100151","TRUWHIP WHIPPED TOPPING","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","46","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.46","1","6","2","0","0","0","11802" +"0081163800610","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11804" +"0081204900640","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11806" +"0081204900730","PBERRY BLACKBERRY 6oz","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16369" +"0081204900905","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11808" +"0081204900910","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11810" +"0081204900917","PBERRY BLUBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11811" +"0081204900940","PBERRY CRANBERRY PT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11813" +"0081204900950","PBERRY STRAWBERRY PT","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11814" +"0081204921500","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11816" +"0081204924500","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11818" +"0081241000014","FILLET,SALMON,W/MARINADE","8.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","5.09","1","6","8","0","0","0","11820" +"0081241000026","FISH NUGGETS","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.82","1","1","0","0","0","0","11823" +"0081241000038","FISH NUGGETS, GF","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.65","1","1","0","0","0","0","11825" +"0081264701000","Black Chico Bag","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12836" +"0081264701002","BLACK VITA CHICO BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11826" +"0081264701005","OLIVE CHICO BAG ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12827" +"0081264701007","Green Chico Bag","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12830" +"0081264701009","PURPLE CHICO BAG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12837" +"0081264701011","PUMPKIN VITA CHICO BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11827" +"0081264701013","BRICK VITA CHICO BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11829" +"0081264701015","LIME VITA CHICO BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11831" +"0081264701017","GRAY VITA CHICO BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","11833" +"0081264701072","EARTH CHICO BAG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14453" +"0081264701083","BLOSSOM VITA BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15150" +"0081264701142","BUTTERCUP CHICO BAG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16227" +"0081264701145","MAZARINE BLUE CHICO BAG","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16228" +"0081264701147","CHOCOLATE VITA BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16232" +"0081264701150","LARKSPUR VITA BAG","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16233" +"0081264701165","RECYCLED HEART CHICO BAG","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15759" +"0081266101001","TRAIL BAR, HONEY ALMOND","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","b1826","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","14852" +"0081266101003","TRAIL BAR, CHOC PEANUT","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","b1826","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","14849" +"0081266101005","COFFEE HOUSE BAR, MOCH MINT","2.89","0","0","0","1.99","0","1.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","16511" +"0081266101007","COFFE BAR, TURTLE MOCHA","2.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","b1826","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","14857" +"0081270701002","WAFER BR,CRSP RCE MLK CH","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.79","1","1","0","0","0","0","13400" +"0081270701014","WAFER BR,DBL DRK 70% CHO","1.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.79","1","1","0","0","0","0","14300" +"0081270701023","WAFER ROLLS, PB MILK CHOC","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.25","1","1","0","0","0","0","15892" +"0081349101000","HOT CRL,OG,ORIGINAL GF","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.09","1","6","4","0","0","0","12970" +"0081355100205","DRY RAMEN,MUSHROOM 2 OZ","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1603","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.69","1","1","4","0","0","0","11839" +"0081355100212","DRY RAMEN LEMONGRASS GNGR","1.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1603","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.69","1","3","4","0","0","0","11841" +"0081357400016","pstrawberry quart","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","509","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11844" +"0081363501000","PBERRY BLUEBERRY NON-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15273" +"0081363501096","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14206" +"0081484700100","HONEY BEAR, LOCAL","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","honeyapple_q0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","1","0","11846" +"0081484700102","LOCAL HONEY, 2# JAR","8.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","honeyapple_q0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","1","0","11848" +"0081484700104","SPUN HONEY, LOCAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","4","0","1","0","11849" +"0081492201030","JUNIOR BULLYS 6\",\"2.99","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","0","1","0","0","0","0","Jun 07 2011 1","0000-00-00 00:00:00","0","1","0","0","0","0","0","0","1","0","0","0","0","16541","0","16671" +"0081498500003","PEPPERS,OG,RED/YEL,RSTD 13 OZ","6.65","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","3.77","1","1","4","0","0","0","11851" +"0081498500007","TOMATOES,OG,SN-DRD/OLV OL","7.59","0","0","0","4.49","0","4.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","12","0","0","0","4.31","1","1","4","0","0","0","11854" +"0081498500018","OLIVES,OG,KALAMATA PITTE","5.25","0","0","0","3.29","0","3.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","171","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.96","1","1","0","0","0","0","13511" +"0081661100001","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11861" +"0081675400003","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11863" +"0081675400017","PLEMON BAG SUNDANCE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","518","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.22","1","3","6","0","0","0","11865" +"0081675400033","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11867" +"0081675400045","PMINNEOLAS Bag","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1312","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11869" +"0081841100022","SAMBAZON ACAI POWDER ","27.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.3","1","1","5","0","0","0","11871" +"0081841100037","SAMBAZON ACAI JUICE 10.5 OZ","3.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.97","1","1","0","0","0","0","11873" +"0081857000695","JR WATKINS HAND SOAP","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.94","1","0","0","0","0","0","16331" +"0081904600043","INKA CORN,ORIGINAL","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1","1","6","0","0","0","0","15941" +"0081916200300","TEA,OG,ROOIBOS ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.85","1","1","4","0","0","0","11879" +"0081916200455","TEA OG YERBA MATE ECOTEA","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.85","1","1","4","0","0","0","11881" +"0082083800002","PBERRY CRANBERRY","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11883" +"0082083802002","PBERRY CRANBERRY BAG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","631","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11885" +"0082202300005","CEDAR SUMMIT 1% 64 OZ.","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","11887" +"0082202300007","CEDAR SUMMIT WHOLE 64 OZ","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","30","","0","1","0","0","0","0000-00-00 00:00:00","1","0","0","0","","0","0","0","0","1","0","0","0","1","0","11889" +"0082202300200","CEDAR SUMMIT HEAVY CREAM","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","27","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","14013" +"0082466020010","PCUCUMBER EUROPEAN","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","638","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","11891" +"0082486200805","PTRAY VEGETABLE 7 OZ","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","505","0","0","1","0","0","1368","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","1","0","11893" +"0082486207703","PFOXY VEG MEDLEY","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","1","1","0","0","1298","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11895" +"0082486209901","pbagged precut veg medley","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","510","0","0","1","0","0","1416","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13422" +"0082486209904","pbagged precut broc w/ carrots","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","855","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13421" +"0082528210003","PARUGULA BABY BAG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","665","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11897" +"0082528220001","PONION BAG YELLOW","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","543","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11899" +"0082528230001","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","11901" +"0082532500017","MITICA MEMBRILLO","7.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","0","1","6","0","0","0","0","14765" +"0082532500035","MITICA FIG JAM","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","11904" +"0082532515644","LAVENDER HONEY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14965" +"0082559201010","BUTTER UNSALTED PASTURELAND 1#","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","26","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","0","0","11912" +"0082642990115","PPOTATO PURPLE BAGGED","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","835","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16157" +"0082746800013","PGINGER PUREE JAR","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","508","0","0","1","0","0","1314","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11914" +"0082746800105","PGARLIC BAGGED","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","0","0","1179","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11916" +"0082804920509","PBERRY GOOSEBERRY","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","722","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11917" +"0082804922334","PBERRY STRAWBERRY PI","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","508","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","11919" +"0082890400061","PGRAPEFRUIT BAGGED","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16303" +"0082890465789","pberry blueberry","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11921" +"0082890498486","PCELERY BUNCH","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","527","0","0","1","0","0","551","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.23","1","3","6","0","0","0","11923" +"0082946200113","RICEMILK,OG,UNSWEETENED","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.8","1","6","0","0","0","0","15326" +"0082946270102","GOOD KARMA MUDD PIE","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.64","1","3","2","0","0","0","11927" +"0082946270111","RICE DIVINE,OG,VERY CHRY","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.64","1","3","2","0","0","0","11930" +"0082969600083","SARDINES,SPRING WATER","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.71","1","6","0","0","0","0","13704" +"0082983500002","AGRASS BERRY SUPERFOOD SINGLE","1.65","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","12839" +"0082983501200","AMAZING GRASS WHEATGR TABS","27.75","0","0","0","22.19","0","22.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","2","0","0","0","0","0","1","6","0","0","0","0","16336" +"0082983591035","AMAZING GRASS WHEATGR 15CT","23.99","0","0","0","19.19","0","19.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","11934" +"0082983593035","AMAZING GRASS SUPERFOOD 15CT","23.99","0","0","0","19.19","0","19.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","11936" +"0082983593200","AMAZING GRASS SFOOD CAPS","30.99","0","0","0","24.79","0","24.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","2","0","0","0","0","0","1","6","0","0","0","0","16335" +"0082983593500","AGRASS CHOC SFOOD 15 CT BOX","23.99","0","0","0","109.19","0","109.19","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","12978" +"0082983593700","AGRASS BERRY SUPERFOOD 8.50Z","30.99","0","0","0","24.79","0","24.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","107","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","0","1","6","5","0","0","0","12838" +"0083003300668","YERBA MATE, 2# LOOSE","13.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","151","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14401" +"0083041000101","DAKOTA GRND LAMB 16OZ","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16523" +"0083101200001","ORANGE TANG SWITCH SINGLE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","4","0","0","0","11942" +"0083101200123","JUICE,APRICOT PEACH, 4PK","6.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","1553","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","3.7","1","6","4","0","0","0","11946" +"0083112800085","BAGS, GARDEN AND LEAF, BIOBAG","6.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","11949" +"0083112800244","BIOBAG TALL KITCHEN 13 GALLON","5.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.47","1","1","4","0","0","0","11951" +"0083268200001","PORANGE BAG SWEET","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","1132","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","11953" +"0083373500008","QUORN CHKN PATTIES","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.5","1","1","2","0","0","0","11961" +"0083373500014","GROUNDS,BEEF,MEAT FR","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.48","1","1","2","0","0","0","11963" +"0083373500020","CUTLETS,CHKN,MEAT FR,NAK","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.46","1","1","2","0","0","0","11965" +"0083373500052","QUORN TURKY BURGER","5.89","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","45","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","3.46","1","1","2","0","0","0","11968" +"0083378600200","HELENS YELLOW CURRY","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.72","1","0","0","0","0","0","11971" +"0083418300111","FRIES,JULIENE,SWT POT,SL","3.69","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.13","1","1","2","0","0","0","11977" +"0083418300303","ALEXIA HASHED BROWNS ","3.35","0","0","0","2.49","0","2.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","1.95","1","1","0","0","0","0","14571" +"0083418300703","FRIES,WAFFLE,W/SEASON SL","4.55","0","0","0","3.49","0","3.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","41","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.63","1","1","2","0","0","0","11982" +"0083418300900","ROLLS,CLASSIC FRENCH","4.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.63","1","1","2","0","0","0","11983" +"0083418300950","BAGUETTE,GARLIC FRENCH","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.32","1","0","0","0","0","0","11986" +"0083514300002","TEA,BOTTLE,GREEN JASMINE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.21","1","6","4","0","0","0","11988" +"0083522800601","GRANOLA,GF,NUTTY CRANBRY","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.83","1","6","4","0","0","0","11992" +"0083522801100","GRANOLA BAR,GF,PNT BTR C","5.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.01","1","6","4","0","0","0","11994" +"0083522801150","GRANOLA BAR,GF,PT BTR CC","1.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.82","1","6","0","0","0","0","15401" +"0083554500001","PMACHE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","513","0","0","1","0","0","955","0000-00-00 00:00:00","1","0","1","0","0","0","1","0","0","1","0","6","0","0","0","11998" +"0083609300104","IZZE GRAPEFRT SINGLE","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16383" +"0083609300205","BTL,SPARKLING,CLEMENTINE","6.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","188","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.49","1","1","4","0","0","0","12002" +"0083647001006","MMIRACLE TART CHERRY CONC 16OZ","23.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","106","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10.78","1","0","5","0","0","0","12004" +"0083845100013","MACA MAGIC HRT","23.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","102","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","12.59","1","0","5","0","0","0","12005" +"0083845500002","MEATLESS JERKY,HCKY SMOKE","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","0.75","1","0","4","0","0","0","12007" +"0083845500021","PRIMAL STRIP, TEXAS BBQ","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.75","1","0","4","0","0","0","12009" +"0084190501031","PALEK PANEER SPNCH W/COTT","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1551","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.85","1","1","4","0","0","0","12011" +"0084190501061","NAVRATAN KORMA,VEG&CURRY","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.85","1","1","0","0","0","0","13896" +"0084190501081","PINDI CHANA CHICK PEAS","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","1551","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.85","1","1","4","0","0","0","12014" +"0084223400048","GARDEIN CHKN SCALOPINI","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.83","1","1","0","0","0","0","13509" +"0084223400052","GARDEIN CHKN TENDERS","4.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.83","1","1","0","0","0","0","13510" +"0084237100552","CHERRY SOY CANDLE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","0","0","0","0","0","15434" +"0084237100558","LAVENDAR SAGE SOY CANDLE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","0","0","0","0","0","15290" +"0084237100560","LILAC SOY CANDLE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","0","0","0","0","0","15287" +"0084237100563","PEPPERMINT SOY CANDLE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","0","0","0","0","0","15286" +"0084237100568","EVERGREEN SOY CANDLE","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.73","1","0","0","0","0","0","15433" +"0084288002002","ORGANIC CANDY CANES","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.07","1","0","4","0","0","0","12016" +"0084357100032","POPCORN,MOVIE THEATER","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.48","1","1","4","0","0","0","12018" +"0084357100221","CHIPINS,SEA SALT","4.15","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","0","1","3","0","0","0","0","16648" +"0084357100223","CHIPINS,BUFFALO WING","4.15","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","0","1","3","0","0","0","0","16647" +"0084480900017","8X6 CUTTING BOARD","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","1","0","12020" +"0084480900022","CAMP SERIES 9X7 ","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","0","1","0","13239" +"0084480900024","CAMP SERIES 14X11","20.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","0","1","0","13241" +"0084480900026","CAMP SERIES FILLET 23X8","24.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13242" +"0084480900040","LARGE BLACK TURNER","8.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16286" +"0084480900112","GOURMET SAUTE TOOL","7.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14517" +"0084480900116","LARGE GOURMET TURNER","8.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14516" +"0084480900230","MED TURNER","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13250" +"0084480900244","SAUTE TOOL","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13249" +"0084480900254","ANGLED TURNER","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13254" +"0084480900263","KITCHEN UTENSILS-SMALL SPOON","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13252" +"0084480900288","CUTTING BOARD COMBO","24.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16549" +"0084568100001","WAYFARE NON DAIRY HICKORY CHED","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.45","1","0","0","0","0","0","15902" +"0084747300240","PAPPLE BAGGED SANSA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","691","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15139" +"0085040300005","WAFFLE/PANCAKE MIX,SF","6.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.61","1","6","4","0","0","0","12022" +"0085050300208","ppotatoredbag","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","1","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14658" +"0085050300211","PPOTATO BAG RED 3#","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","","0","1","0","0","1391","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14286" +"0085055200207","PARTY SMALL PAD","10.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","1","0","12890" +"0085055200209","PARTY LUXE LINER","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","1","0","12889" +"0085055200211","PARTY LARGE PAD","10.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","1","0","12892" +"0085062800219","TERAS WHEY VANILLA 12OZ","23.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","10.32","1","6","0","0","0","0","15791" +"0085062800223","TERAS WHEY YUMBERRY SNGL","2.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.18","1","6","0","0","0","0","15786" +"0085062800232","TERAS WHEY ACAI BERRY 12OZ","23.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","10.32","1","6","0","0","0","0","15789" +"0085066500204","papplebagreddelicious","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14701" +"0085092500202","PBERRIES BLUE","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16364" +"0085149200203","VINEGAR,OG,RAW COCONUT","6.29","0","0","0","4.99","0","4.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","3.63","1","6","0","0","0","0","14297" +"0085220400080","BBQ SAUCE,OG,ORIGINAL","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","4.59","1","0","0","0","0","0","15940" +"0085269700118","APPLE PUFFS,OG","3.19","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.03","1","1","4","0","0","0","12029" +"0085269700120","GREENS PUFFS,OG2","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16687" +"0085269700130","BABY FD,OG,APL&BTRNT SQS","1.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0.84","1","6","0","0","0","0","15937" +"0085269700133","STG 1,PEARS,POUCH","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16689" +"0085269700137","STG 2,OG2,BAN,BEETS&BLBR","0.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16690" +"0085269700147","YOGURT MELTS,STRAWBERRY","3.45","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","152","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","2.19","1","1","0","0","0","0","13449" +"0085277200106","TORTILLA CHIPS OLIVE FSTG","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1617","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.76","1","1","4","0","0","0","12033" +"0085277200156","TORTILLA CHIPS,LIME","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","1617","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.76","1","1","0","0","0","0","14328" +"0085315210002","BAR,OG,WHOLE BERRY BLAST","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.76","1","1","0","0","0","0","15346" +"0085315210007","BAR,OG,SUPERFOOD SLAM","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.76","1","1","0","0","0","0","15345" +"0085315210014","HALO BAR,SMORES","1.59","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","0.9","1","6","0","0","0","0","16553" +"0085315210017","HALO BAR,HONEY GRAHAM","1.59","0","0","0","1.29","0","1.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","0.9","1","6","0","0","0","0","16393" +"0085315210098","FRUITION BAR,OG,STRAWBRY","1.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1","1","1","0","0","0","0","15348" +"0085352200019","COOKIE,CHOCOLATE CHIP","3.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","1602","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.24","1","1","4","0","0","0","12040" +"0085352200042","SNACK BAR,VERY BERRY","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.41","1","1","4","0","0","0","12042" +"0085352200090","CEREAL,CRUNCHY RICE","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.16","1","6","0","0","0","0","13084" +"0085358400205","CNYN BKHSE BUNS, GF HMBRGR","5.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.44","1","0","0","0","0","0","15864" +"0085364700022","POWER JUICE BLUEBRY ACAI","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.79","1","6","4","0","0","0","12045" +"0085372900301","CHOC CHIP COOKIES, SIX PACK","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","155","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16258" +"0085391400207","pBLUEBERRIES, non-0, pint","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","201","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16524" +"0085413800218","5LB GRAPEFRUIT","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14089" +"0085428500086","NOODLE BOWL,SESAME TERIYK 8.5","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.01","1","6","4","0","0","0","12047" +"0085428500200","RCE NDLE BOWL,GRLC SESAME 2.5","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","175","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.12","1","6","4","0","0","0","12051" +"0085428550012","STIR FRY SCE,GENERAL TSA","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.15","1","6","4","0","0","0","12054" +"0085465200141","CASTLE ROCK ORGANIC COLBY","5.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14756" +"0085465200143","CHEDDAR MED OG CASTLE ROCK","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12058" +"0085465200146","CHEDDAR SHARP OG CASTLE ROCK","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12060" +"0085465200181","CHED RAW SHARP CASTLE ROCK","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12062" +"0085465200187","BLUE SMOKED OG CASTLE ROCK","6.71","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12064" +"0085465200189","JALA PEPPER CHED CASTLE ROCK ","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12066" +"0085465200191","CHED ORANGE CRAN OG CASTLE ROC","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12068" +"0085465200193","CHEDDAR BLACK BEAN SALSA RAW","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12070" +"0085465200195","CAST ROCK JALA CRAN CHED","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12072" +"0085465200197","CHEDDAR VENETIAN RAW CASTLE RO","6.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","1","0","12074" +"0085485844401","FIG SPREAD DALMATIA","6.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12076" +"0085490600009","BOSSA NOVA BLUE JUICE","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","29","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.88","1","0","0","0","0","0","12080" +"0085501700216","BLUEBERRY PINT","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14525" +"0085509700200","COCOKEFIR","10.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15282" +"0085517200068","SUNCOAT NATURAL HAIRSPRAY","11.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12118" +"0085544600200","SPIRIT CREEK KIM CHI","8.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","14698" +"0085544600202","SPIRIT CRK PRPL SAUERKRAUT","7.09","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14691" +"0085544600212","SPIRIT CREEK CURTIDO","7.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","34","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15507" +"0085561100112","NATUROPATCH ARNICA SNGL","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12120" +"0085561100114","NATUROPATCH EUC SNGL","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12122" +"0085561100116","NATUROPATCH ROSE GER SNGL","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12124" +"0085561100119","NATUROPATCH CITRUS SNGL","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12126" +"0085561100175","NAT PATCH 8PC VARIETY PK","14.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15106" +"0085573500123","PP OG MILD CHEDDAR","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12129" +"0085573500129","PP OG MUENSTER","6.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12131" +"0085573500209","JUUSTO JALAPENO PAST PRIDE","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12133" +"0085573500308","NAT VALLEY GOAT CHED","7.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12135" +"0085573500313","COLBY-JACK GOAT NATURAL VALLEY","7.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12137" +"0085597100222","JULIANS BLGN WAFFLE CHOC","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.97","1","3","0","0","0","0","15366" +"0085635000001","JUNIPER RIDGE SAGE SOAP","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15375" +"0085635000027","JUNIPER RIDGE CASCADE KIT","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15376" +"0085635000031","DOUGLAS FIR SACHET","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13326" +"0085635000034","CHRISTMAS FIR SACHET","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13327" +"0085635000062","CEDAR INCENSE","7.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15373" +"0085635000070","WHITE SAGE SMUDGE STICK LG.","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13329" +"0085635000073","SIERRA CEDAR SMUDGE STICK MINI","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13332" +"0085635000078","SWEETGRASS BRAID","8.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15371" +"0085643500164","LENTIL CRACKERS, SEA SALT","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16655" +"0085643500166","LENTIL CRACKERS, RSMRY HERB","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16656" +"0085675000201","RUDIS MULTI GF SAND BREAD","5.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.28","1","1","0","0","0","0","15027" +"0085682000050","ENERGY DRINK STEAZ SINGLE","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","4","0","0","0","12141" +"0085682000070","STEAZ ORANGE SINGLE","2.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","1","4","0","0","0","12143" +"0085682000470","ENERGY DRINK STEAZ ORANGE 4PK","8.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1622","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.79","1","1","4","0","0","0","12146" +"0085742300200","HAND ROLLED BUTTER","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15125" +"0085742300213","HAND ROLLED BUTTER","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16254" +"0085753800002","DIVA CUP #2","37.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","0","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","23.75","1","6","5","0","0","0","12150" +"0085759900200","FERNDALE ITALIAN TRKY SAUS","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15058" +"0085764600101","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12151" +"0085764700101","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12153" +"0085824600126","OATMEAL,VARIETY PK G/F","5.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.15","1","6","0","0","0","0","13703" +"0085830200104","FISH AND CHIP BITES","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.2","1","1","0","0","0","0","14995" +"0085846700102","PHERB CHIVES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","908","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12161" +"0085846700104","PHERB MARJORAM","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","919","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12163" +"0085846700107","PHERB PEPPERMINT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","","0","1","0","0","","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","0","0","0","0","0","14537" +"0085846700109","PHERB SAGE","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","931","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12166" +"0085846700112","PHERB TARRAGON","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","937","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12168" +"0085846700116","PHERB POULTRY MIX","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","929","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12170" +"0085846700120","PHERB KAFFIR LIME LEAVES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","915","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12172" +"0085846700122","PHERB BASIL 4OZ RS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","903","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12173" +"0085897100006","SUKI TONER SHITAKE","26.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","15.02","1","3","5","0","0","0","12179" +"0085897100008","SUKI CLEANSING LOTION","26.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","15.02","1","3","5","0","0","0","12181" +"0085897100010","SUKI DAY LOTION","31.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","17.33","1","6","5","0","0","0","12183" +"0085897100012","SUKI FACE MOIST CARROT NOURISH","29.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","16.67","1","6","5","0","0","0","12185" +"0085897100022","SUKI TO GO VELVET CREAM .5 OZ","7.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","4.83","1","6","5","0","0","0","12188" +"0085897100074","SUKI CREAMY FOAMING CLEANSER","29.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","16.47","1","6","0","0","0","0","15683" +"0085900400027","RED LAKE CHOKECHERRY SYRUP","9.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12193" +"0085900400031","RED LAKE PLUM SYRUP","8.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12195" +"0085922000031","EARTH MAMA ANGELBABY BBALM 2OZ","11.95","0","0","0","8.99","0","8.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.48","1","1","0","0","0","0","13594" +"0085922000080","EARTH MAMA ANGEL BABY LOTION","10.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","5.49","1","1","0","0","0","0","13205" +"0085962300041","ECO LIPS VEGAN BEE FREE","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12197" +"0085962300124","ECO LIPS ROSE QUARTZ","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12199" +"0085962300126","ECO LIPS MOCHA VELVET","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","5","0","0","0","12201" +"0085962300224","DAGOBA ROSEBERRY LIP BALM","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15677" +"0085962300303","ECO LIPS CORALYTE LIP TINT","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16457" +"0085962300305","ECO LIPS SUGAR PLUM LIP TINT","3.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16455" +"0085964400201","SCONE MIX GING SHRTCAKE ","4.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15440" +"0085964400244","PRAIRIE KITCHEN SCONES LNGN","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15552" +"0085964400246","PRAIRIEKITCH CINN SCN","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","1","0","14981" +"0085964400248","PRAIRIE KITCHEN SCONES CRAN","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15071" +"0085981800202","HIGH COUNTRY GINGER KOMBUCHA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.95","1","6","0","0","0","0","15855" +"0085981800204","KOMBUCHA,OG,GOJI BERRY","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.95","1","6","0","0","0","0","15573" +"0085997500222","CLNSR,CREAMY,MEYER LEMON","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16673" +"0085997500224","TONING REFRSHR,BLSM&LEAF","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16685" +"0085997500228","FACIAL SCRUB,LEMON SUGAR","14.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16679" +"0085997500230","RENEWAL CRM,PROBIOTIC+C","23.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16682" +"0085997500232","FACIAL LOTN,DLY DEF,SPF1","14.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16678" +"0085997500234","FACIAL CONCNTRT,OMEGA GL","23.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16677" +"0085997500236","EYE SERUM,LUMINOUS","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","0","1","0","0","0","0","0","16676" +"0086054700002","MEAL RPLCMNT,OG.VAN BEAN","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.92","1","6","0","0","0","0","15354" +"0087145900001","DAIYA MOZZ STYLE SHRED","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","0","0","0","0","0","0","2.95","1","0","0","0","0","0","14154" +"0087161100100","CHEESE STUFFED OLIVES","5.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13698" +"0087161100120","CHEESE STUFFED HOT PEPPERS","6.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13697" +"0087272400038","STRAWBERRY BLOND CALENDULA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14121" +"0087272400040","PROVIDER BUSH BEAN","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","9","0","0","0","12258" +"0087272400049","DETROIT RED BEET","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13717" +"0087272400051","DE CICCO BROCCOLI","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13719" +"0087272400053","SCARLET NANTES CARROT","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13724" +"0087272400055","RUBY RED CHARD","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13720" +"0087272400057","MARKETMORE CUCUMBER","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13894" +"0087272400059","RED RUSSIAN KALE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13736" +"0087272400061","RARRIS ISLAND ROMAINE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13741" +"0087272400063","GOURMET LETTUCE MIX","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13744" +"0087272400065","GREEN ARROW PEA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13737" +"0087272400067","CASCADIA SNAP PEA SEED","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14034" +"0087272400069","CA WONDER SWEET PEPPER","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13752" +"0087272400071","CHERRYBELLE RADISH","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13758" +"0087272400073","DARK GREEN ZUCCHINI","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13762" +"0087272400075","ACORN WINTER SQUASH","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13765" +"0087272400077","PEACEVINE CHERRY TOMATO","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13771" +"0087272400079","SUGAR BABY WATERMELON","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13778" +"0087272400082","BOUQUET DILL","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13783" +"0087272400084","FLAT LEAF PARSLEY","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13784" +"0087272400087","MAMMOTH SUNFLOWER","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13799" +"0087272400090","PASTEL DREAMS MIX ZINNIA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13796" +"0087272400092","DWARF JEWEL NASTURIUM","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14218" +"0087272400094","ROYAL BURGUNDY BUSH BEAN","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13713" +"0087272400097","CHIOGGIA BEET","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13716" +"0087272400099","GOLDEN CHARD","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13722" +"0087272400101","BLACK BEAUTY EGGPLANT","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13729" +"0087272400103","FLORENCE FENNEL","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13731" +"0087272400105","MIZUNA ASIAN GREENS","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13733" +"0087272400107","LACINATO KALE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13735" +"0087272400109","JERICHO ROMAINE LETTUCE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13739" +"0087272400111","SALAD BOWL LETTUCE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13743" +"0087272400115","SUGAR ANN SNAP PEA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14040" +"0087272400117","FRENCH BREAKFAST RADISH","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13759" +"0087272400119","YELLOW CROOKNECK SQUASH","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13764" +"0087272400121","RED KURI WINTER SQUASH","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13770" +"0087272400123","COSMONAUT VOLKOV TOMATO","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13775" +"0087272400126","YELLOW PERFECTION TOMATO","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13895" +"0087272400128","GENOVESE BASIL","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13779" +"0087272400132","GREEK OREGANO","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14219" +"0087272400134","SAGE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14122" +"0087272400137","LEMON BALM","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13787" +"0087272400139","JASMINE SCENTED NICOTIANA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13789" +"0087272400157","CHAMPION COLLARD GREENS","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","14228" +"0087272400163","OREGON SUGAR SNOW PEA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13893" +"0087272400170","BUTTERNUT WINTER SQUASH","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13767" +"0087272400182","ECHINACEA PURPUREA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13793" +"0087272400186","OLD SPICE MIX SWEET PEA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13797" +"0087272400188","TEDDY BEAR SUNFLOWER","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13794" +"0087272400201","LUSCIOUS SWEET CORN","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13725" +"0087272400218","CINDERELLA PUMPKIN","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13757" +"0087272400228","YELLOW BRANDYWINE TOMATO","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13774" +"0087272400235","GERMAN CHAMOMILE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13788" +"0087272400239","RED SCARLET ZINNIA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","249","0","1","0","0","0","2000","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","0","0","0","0","13800" +"0087272400243","SUGAR SNAP PEA","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","16556" +"0087272400322","H-19 LITTLE LEAF CUCUMBER","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","15593" +"0087272400369","GEORGIA COLLARDS","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","15586" +"0087272400399","SIBERIAN KALE","2.75","0","0","0","0.99","0","0.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","250","0","1","1","0","0","2000","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","15594" +"0087401300002","DR WEIL DAILY MULTI","18.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.17","1","0","5","0","0","0","12267" +"0087449200070","BAR,OG,DK CHOC,CHRY&ALMN","3.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.02","1","1","0","0","0","0","14614" +"0087449200097","BAR,OG,DRK,PPRMNT STICK","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.02","1","1","0","0","0","0","15469" +"0087489600033","PTOMATO GRAPE PINT","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15640" +"0087489600520","PPEPPER MINI MILD","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","518","0","0","1","0","0","698","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15512" +"0087504512111","THOUSAND HILLS RIB EYE STK","12.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","14538" +"0087504513311","THOUSAND HILLS SIRLOIN STK","9.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","14647" +"0087504514211","THOUSAND HILLS RUMP ROAST","11.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15021" +"0087504515211","THOUSAND HILLS BEEF BRISKET","12.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","14599" +"0087504518120","THOUSAND HILLS STIR FRY BEEF","8.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","0","0","0","1","0","12273" +"0087504518237","THOUSAND HILLS GRND BEEF 85/15","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","b1818","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","3","0","0","0","0","14042" +"0087504518311","THOUSAND HILLS MEAT BALLS","8.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","12277" +"0087504518352","THOUSAND HILLS HOT DOGS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","","0","1","0","0","b1857","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0","1","6","0","0","1","0","12279" +"0087504518356","THSND HILLS COCKTAIL WIENERS","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15797" +"0087504518381","THOUSAND HILLS BEEF JERKY","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","8","0","1","0","12985" +"0087509500069","CHOC CVRD,OG,CACAO NIBS","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.41","1","0","0","0","0","0","15942" +"0087538600001","LIVING HARVEST HEMP ORIGINAL","19.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","8.85","1","1","5","0","0","0","12281" +"0087538600012","LIVING HARVEST HEMP VAN SPICE","22.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","105","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","9.93","1","3","5","0","0","0","12284" +"0087538600031","HEMPMILK CHOCOLATE","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.54","1","6","4","0","0","0","12286" +"0087538600040","HEMPMILK UNSWEETND ORIG","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.54","1","6","4","0","0","0","12288" +"0087538604017","TEMPT COFFEE BISCOTTI ICE CRM","4.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.71","1","3","2","0","0","0","12290" +"0087553300607","9IN SUPREME BULL STIX","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16356" +"0087631400135","BELLA RUSTICO ROSEMARY","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12295" +"0087631400137","BELLA RUSTICO TRADITIONAL","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12297" +"0087631400139","BELLA RUSTICO PARM PEC","4.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","2","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12299" +"0087683000018","STARFIELD 12OZ. ","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14067" +"0087683000108","GREEN POWER 12OZ.","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14069" +"0087683000190","APPLE BLOSSOMS","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12309" +"0087683000192","CHERRY BLOSSOMS 20 oz.","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12841" +"0087683000195","BLACK 20 OZ. BOTTLE","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12992" +"0087683000320","BLUE OCEAN 12OZ.","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14627" +"0087683000372","MIDNIGHT BLOOM 25OZ. BOTTLE","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13920" +"0087683000374","METALLIC SMOKE BOTTLE","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12313" +"0087683000396","OCEAN FLOOR","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14628" +"0087683000399","GREEN FORWARD 20 OZ.","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14626" +"0087683000401","PEACE IN BLOOM 20 OZ. BOTTLE","12.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13919" +"0087683000409","PURPLE BLOSSOMS 25OZ. BOTTLE","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12316" +"0087683000413","BIRDS 25OZ. BOTTLE","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12317" +"0087683000681","RAINFOREST EARTH DAY","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14053" +"0087683000685","PINK DAHILA 25OZ. BOTTLE","13.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13484" +"0087839700300","SOY WHIP TOPPING","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","31","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.62","1","1","2","0","0","0","12325" +"0088010533072","PJUICE VOLCANO BLOOD 250ml","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1092","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12326" +"0088061213003","PTANGERINE BAG","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","544","0","0","1","0","0","634","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12328" +"0088100600024","PBERRY BLUEBERRY PINT Non-O","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","","0","1","0","0","721","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14379" +"0088100600105","PBERRIES BLUE PINTS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16428" +"0088100600111","PBERRIES BLUEBERRIES NON-O PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","14652" +"0088102430032","KALAMATA OLIVE DIP","5.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13292" +"0088143201117","PAPPLE BAG HONEYCRIS","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","535","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12334" +"0088177510019","GRAN F CINNAMON ROLLS","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","1","0","12338" +"0088177510026","EGG BREAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12340" +"0088177510029","HAMBURGER BUNS","4.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","150","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12342" +"0088177510032","GRAN F LEMON BARS","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","1","0","12344" +"0088177510039","SMALL PUMPKIN BAR","2.55","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","2","0","1","0","12347" +"0088177512034","GUAR GUM, GRANDMA FERDONS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","12349" +"0088177580000","CHOW MEIN NOODLES, GLUTEN FREE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","12354" +"0088177580004","PASTA, SPAGHETTI, GMA FERDONS","5.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","170","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","1","0","12357" +"0088255300010","SALMON, WILD ALASKA PINK","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","172","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","4","0","0","0","12360" +"0088268303010","PAPPLE BAG GRANNY SMITH","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","531","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12361" +"0088268303012","PAPPLEBAG O FUJI","4.49","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","532","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","3","6","0","0","0","12363" +"0088268303014","PAPPLE BAG PINK LADY","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","530","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","12365" +"0088397807975","CEREAL, SWEETENED WHEATFULS","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b1824","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.24","1","1","4","0","0","0","12366" +"0088397807979","CEREAL, TOASTED CINN SQUARES","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","157","0","0","1","0","0","b1824","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.29","1","1","4","0","0","0","12368" +"0088424411241","DOG TREAT, BREATHIES","6.65","0","0","0","5.29","0","5.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","182","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","3.92","1","6","0","0","0","0","14992" +"0088576100001","PSALAD SPRING MIX BAG","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","669","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","12371" +"0088576100005","PSALAD ARUGULA","3.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","665","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","12373" +"0088576100008","PSALAD SPRING MIX CLAM 5 OZ","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1357","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12375" +"0088576100016","PCARROT BAG 5# ","5.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","511","0","0","1","0","0","513","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12377" +"0088576100019","PSALAD SPRING MIX CLAM 1#","6.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","695","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","12379" +"0088576100023","POTATO BAG RED P.N.","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","519","0","0","1","0","0","524","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12381" +"0089014600101","ORGANIC LOLLIPOPS","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.39","1","1","4","0","0","0","12384" +"0089015600111","1 DRINK,MIXED BERRIES","2.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.42","1","6","4","0","0","0","12388" +"0089044400010","CRACKERS,OG,ROUND SALTINE","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.79","1","6","4","0","0","0","12390" +"0089044400020","CRACKERS,OG,CLASSIC RICH","3.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","1.79","1","6","4","0","0","0","12391" +"0089044400056","SNACK CHIP,OG,SSALT,GF W","2.95","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","1.73","1","6","0","0","0","0","15783" +"0089044400058","SNACK CHIP,OG,RANCH,GF W","2.95","0","0","0","2.29","0","2.29","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","1.73","1","6","0","0","0","0","15782" +"0089052900150","PJAR CUT PINEAPPLE","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","744","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12394" +"0089052900153","PJAR FRUIT COCKTAIL","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","745","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12396" +"0089104800103","COUNTRY SQUARE CHOCO PBR","1.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","1616","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.94","1","6","4","0","0","0","12398" +"0089141200203","PCRANBERRY SAUCE NE","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","1076","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12400" +"0089147500105","JELLY BEANS OG","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.13","1","1","4","0","0","0","12402" +"0089147500130","CANDY CANES OG ","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15452" +"0089162700215","EVOL PINTO RICE CHS","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","1","0","0","0","0","14830" +"0089162700218","EVOL CHORIZO BURRITO","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","1","0","0","0","0","12405" +"0089162700240","EVOL CHICKEN CHILE BURRITO","3.19","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.97","1","1","0","0","0","0","12407" +"0089162700704","EVOL VEG CURRY WRAP","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","40","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.24","1","0","0","0","0","0","15026" +"0089168400201","PDRESSING SG CURRY-FIG","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1319","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12413" +"0089168400203","PDRESSING SG POMEGRANATE-PEAR","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","521","0","0","1","0","0","1320","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12415" +"0089175600002","VINDALOO","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.75","1","0","3","0","0","0","12417" +"0089175600004","TAMARIND CURRY","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.69","1","0","3","0","0","0","12419" +"0089177000205","GOODBELLY,MANGO,PROBIOTI","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.77","1","6","0","0","0","0","12422" +"0089177000216","GOODBELLY BLKBERRY POM PROBIO ","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.77","1","6","0","0","0","0","13818" +"0089210300111","LOKI KETA LOX","5.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","260","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16438" +"0089223400201","MIX,CRACKER","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.53","1","1","4","0","0","0","12427" +"0089223400205","PEANUTS,SEASONED","4.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.53","1","1","0","0","0","0","14511" +"0089251900200","PONION RED BAG NON-O","2.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","517","0","0","1","1","0","1396","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12431" +"0089345500000","ONE W NATURE LAVENDER BAR SOAP","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","5","0","0","0","12435" +"0089345500003","ONE W NATURE VAN OATMEAL SOAP","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","0","0","0","0","13418" +"0089345500005","ONE W NATURE HEMP SOAP","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","5","0","0","0","12436" +"0089345500008","ONE W NATURE DEAD SEA BAR SOAP","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","5","0","0","0","12438" +"0089345500012","ONE W NATURE LEM VERBANA SOAP","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","0","0","0","0","13316" +"0089345500014","ONE W NATURE COC MILK SOAP","4.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.2","1","1","0","0","0","0","13417" +"0089345500051","ONE W NATURE TRAVEL LAV SOAP","0.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.61","1","0","0","0","0","0","13346" +"0089345500053","ONE W NATURE TRAVEL ROSE SOAP","0.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","98","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.61","1","0","0","0","0","0","13344" +"0089348100141","CLEAN WELL 10 PACK","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.77","1","1","0","0","0","0","14999" +"0089361500200","CRACKERS,SAVORY FLACKERS","5.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.28","1","6","0","0","1","0","14441" +"0089366900102","HOT COLD THERMAL BAG","3.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16602" +"0089432100072","NASALINE RINSING SYSTEM, BOX","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","10.05","1","3","5","0","0","0","12455" +"0089435300111","BAXYL HYALURONAN 6OZ","36.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","101","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14712" +"0089441000109","PLATE,9 IN,FIBER","3.99","0","0","0","2.79","0","2.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","183","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","2.35","1","1","0","0","0","0","14294" +"0089445500009","PNT BTR,OG,SQZ,HONEY","0.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.37","1","6","4","0","0","0","12458" +"0089445500019","ALMOND BUTTER, NAT, HONEY","1.15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","168","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.61","1","6","0","0","0","0","13521" +"0089445500025","PNUT BTR CUP,OG,DRK CHO","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.08","1","6","0","0","0","0","16176" +"0089470001004","CHOBANI GRK YGRT STRWBRRY 6OZ","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0.96","1","6","0","0","0","0","13414" +"0089470001010","CHOBANI LF PNAPL 6OZ YGRT","1.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","35","","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","0.96","1","0","0","0","0","0","16501" +"0089477300101","SODA,NATURAL COLA,STEVIA","6.59","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","4.06","1","1","4","0","0","0","12461" +"0089477300103","SODA,NAT ORANGE, DIET","6.59","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","4.06","1","1","0","0","0","0","15639" +"0089477300110","SODA,NAT BLK CHERRY, DIE","6.59","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","4.06","1","1","4","0","0","0","12464" +"0089477300115","SODA,NAT DIET,DR ZEVIA","6.59","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","4.06","1","1","0","0","0","0","14098" +"0089477300122","SODA,CREAM ZEVIA","6.59","0","0","0","3.99","0","3.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","1","lb","0","0","0","4.04","1","1","0","0","0","0","16550" +"0089517200102","PURE LIFE CHAMOMILE SHAMPOO","11.65","0","0","0","8.49","0","8.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.28","1","1","5","0","0","0","12465" +"0089517200106","PURE LIFE WILD INDIGO SHAMPOO","11.65","0","0","0","8.49","0","8.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.28","1","1","5","0","0","0","12467" +"0089517200108","PURE LIFE GREEN TEA SHAMPOO","11.65","0","0","0","8.49","0","8.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.28","1","1","5","0","0","0","12469" +"0089517200110","PURE LIFE ALOE 2 IN 1 SH COND","11.65","0","0","0","8.49","0","8.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.28","1","1","5","0","0","0","12471" +"0089517200122","PURE LIFE OATMEAL FACIAL WASH","11.45","0","0","0","8.49","0","8.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","94","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.15","1","1","5","0","0","0","12473" +"0089517200146","PURE LIFE PAPAYA SHAMPOO","11.65","0","0","0","8.49","0","8.49","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","7.28","1","1","5","0","0","0","12482" +"0089543100002","COFFEE PEACE COL HVY PEDAL 1LB","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","12486" +"0089543100006","COFFEE ESPRESSO PEACE 1LB","11.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","12488" +"0089543100008","COFFEE PEACE GUAT DARK 1LB","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","12490" +"0089543100013","COFFEE PEACE SUMATRAN 1#","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","1","0","15497" +"0089543100022","COFFEE PEACE BLUE OX BLEND 1LB","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","12493" +"0089543100024","COFFEE PEACE COLOMBIAN DRK 1LB","12.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","245","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","1","0","12495" +"0089553800001","FLATBREAD,OG,KLASSIC","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.48","1","1","4","0","0","0","12497" +"0089553800011","FLATBREAD,OG,SEEDLD SPELT 7 OZ","4.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","12","0","0","0","2.48","1","1","4","0","0","0","12499" +"0089554300101","SNOMAW WRAPS,OG2, WHEAT","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","2.8","1","0","0","0","0","0","16479" +"0089554300107","SONOMA IVORY TEFF WRAPS","4.45","0","0","0","3.59","0","3.59","0","0000-00-00 00:00:00","0000-00-00 00:00:00","38","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","0","0","0","0","2.59","1","6","0","0","0","0","14358" +"0089559100101","FLYING INSECT KILLER","7.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","3.63","1","0","0","0","0","0","14215" +"0089559100125","GARDEN INSECT KILLER","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","4.57","1","0","0","0","0","0","14213" +"0089559100133","MOSQUITTO FOGGER","10.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","4.92","1","0","0","0","0","0","14781" +"0089575700206","CREAM SUBSTITUTE","3.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","166","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.95","1","6","0","0","0","0","13972" +"0089602000204","UNPEELED KOMBUCHA GINGER","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.83","1","0","0","0","0","0","14825" +"0089602000207","UNPEELED KOMBUCHA LIMEADE","3.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","37","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.83","1","0","0","0","0","0","14826" +"0089676700101","COCONUT BLISS DK CHOC","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.77","1","1","0","0","0","0","15916" +"0089676700104","COCONUT BLISS CHRY AMRTTO","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.77","1","1","0","0","0","0","16259" +"0089676700122","COCONUT BLISS ALM FUDGE","6.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","39","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","3.77","1","0","0","0","0","0","16395" +"0089685900037","BBQ SAUCE,OG,HOT & SPICY","5.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","160","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.1","1","1","4","0","0","0","12513" +"0089746300101","FALAFEL CHIPS,ORIGINAL","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","158","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3","1","3","0","0","0","0","14513" +"0089758000013","CRACKRS OG HERB WF GF","4.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","159","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.9","1","3","4","0","0","0","12517" +"0089758000109","SUNBEAM 3 X 6 PILLLER","16.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12916" +"0089758000186","RED 3X4 PILLAR CANDLE","14.39","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16287" +"0089761800022","SINUPRET KIDS SYRUP","17.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","9.34","1","1","0","0","0","0","15912" +"0089761800028","BRONCHIPRET KIDS SYRUP","18.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","108","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","9.88","1","1","0","0","0","0","15913" +"0089765900126","HERB SAVOR POD","18.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16504" +"0089773700101","BAR,NAT BUFFALO CRNBRY","2.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.59","1","1","0","0","0","0","13666" +"0089773700120","WILD SNACK STICK,SPICY","2.25","0","0","0","1.79","0","1.79","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","2","lb","0","0","0","1.27","1","6","0","0","0","0","15876" +"0089807500201","PIZZA, SPECIAL, CONNIES","6.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15501" +"0089807500203","PIZZA PEPPERONI CONNIES","6.85","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","44","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15295" +"0089839200005","COCONUT OIL, RAW","15.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","169","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15927" +"0089839200019","COCONUT MILK POWDER","8.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15928" +"0089839200174","CHOCOLATE SYRUP, RAW","10.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","176","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15925" +"0089859600103","BAR CHOC DARK MINT DIVINE","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.04","1","1","4","0","0","0","13009" +"0089859600105","BAR CHOC MILK HZLNT DIVINE","3.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","2.04","1","1","4","0","0","0","13013" +"0089859600114","MILK CHOC COINS DIVINE","2.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","1.43","1","0","0","0","0","0","15447" +"0089859600124","CHOC HEARTS,70% DARK,FT","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","3.01","1","0","0","0","0","0","15702" +"0089859600126","DARK CHOC EGGS","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","3.01","1","3","4","0","0","0","12521" +"0089859600152","BAR,MLK CHO W/SPCD COOKI","3.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","2.17","1","0","0","0","0","0","15186" +"0089859600154","MILK CHO,STKNG STUFFERS","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","","0","0","0","1.82","1","0","0","0","0","0","15189" +"0089859600163","MILK CHOC BUNNIES","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","179","0","1","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","16189" +"0089878500112","ENERGY DRINK,ACAI BLU PO","2.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.5","1","6","0","0","0","0","14232" +"0089888600104","DRINK ALT ENERGY FUNCTION","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","1625","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.26","1","6","4","0","0","0","12525" +"0089888600131","URBAN DETOX,GOJI BERRY","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","189","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.26","1","6","0","0","0","0","13564" +"0089899900002","COCONUT WATER, ORIGINAL","1.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","165","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.18","1","6","4","0","0","0","12529" +"0089903300001","CUTTING BOARD, 8X6","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","9","0","0","0","12532" +"0089903300003","EPICUREAN CUTTING BOARD, 15X11","21.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","9","0","1","0","12534" +"0089903300005","17x 10 CUTTING BOARD","21.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15151" +"0089903300018","KITCHEN SERIES 8X6 SLATE","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","0","1","0","13245" +"0089903300021","18X13 SLATE CUTTING BOARD","32.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15487" +"0089903300097","HANDY SERIES 9X7 NATURAL","13.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","1832","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","0","1","0","13293" +"0089906200226","PBLUEBERRIES","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","521","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","10","0","0","0","0","13616" +"0089906200231","BLACKBERRIES","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15880" +"0089907200201","PMELON JUAN CANARY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","555","0","0","1","1","0","581","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13879" +"0089954100210","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","LB","0","0","0","0","1","3","0","0","0","0","14608" +"0089958700026","BAR RAW FOOD CASHEW AGAVE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","1","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","1.14","1","1","4","0","0","0","12540" +"0089958700052","BAR,OG,APPLE CINNAMON","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","154","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","1.13","1","1","0","0","0","0","15047" +"0089978300200","PMANDARIN ORANGE STEMnLEAF","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","783","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15924" +"0089983400240","OBC CLEANSE ALL FOR MEN","7.65","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","4.79","1","2","0","0","0","0","15699" +"0089996600107","OTTER CREEK CHEDDAR WINTER","7.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","230","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12543" +"0093338344021","PAPPLE BAG RED DELICIOUS","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","540","0","0","1","0","0","528","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12545" +"0094717611819","RODALES ORG. GARDENING","24.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15595" +"0094717618429","PRESCRIPTION FOR NUTRITIONAL H","30","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","6","0","0","0","0","15219" +"0094717620309","9 DAY LIVER DETOX","17.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15809" +"0097809167735","VINEGAR BOOK","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15615" +"0098491108415","PANCAKE MIX, BLUEBERRY","4.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13395" +"0099857034015","pherb bASIL 4OZ PESTO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","514","0","0","1","0","0","903","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12551" +"0203998000000","","34.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","503","0","1","1","0","0","1151","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13477" +"0216230000000","VEGIE DOG","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12555" +"0252200701854","PGREEN BEANS","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","1","0","845","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12558" +"0256100902691","PJU EMERALD ELIXIR","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","202","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12560" +"0258500202398","PPEAS ENGLISH SHELL","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","509","0","0","1","0","0","977","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12562" +"0271500000000","THOUSAND HILLS OXTAIL","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","261","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15069" +"0280010000000","DBLEUPEARSALAD","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","228","0","2","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12569" +"0320400003204","PFL DAHLIA","10.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","500","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12572" +"0400163808813","WELEDA BABY DIAPER CARE","12.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","0","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","6.39","1","1","5","0","0","0","12573" +"0400163809840","WELEDA ROSEMARY HAIR OIL","14.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","7.38","1","0","5","0","0","0","12585" +"0400163809939","WELEDA WILD ROSE BODY OIL","15.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","91","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","12.3","1","0","0","0","0","0","15799" +"0401764500318","LOGONA COLOR APP BRUSH","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15756" +"0401764500963","LOGONA CHESTNUT BROWN","12.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15848" +"0401764502120","HERBAL HAIR COLOR TEAK","21.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15859" +"0401764502156","COLOR PLUS LOGONA","13.45","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15857" +"0471009919112","SOY SAUCE, BLACK SOYBEAN","11.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","161","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16150" +"0501154407003","SALT,REDUCED SODIUM","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","153","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","lb","0","0","0","2.21","1","0","0","0","0","0","13973" +"0502396322775","FENTIMANS ORANGE JIGGER","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12590" +"0502939622234","FENTIMANS VICTORIAN LEMONADE","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","1","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","12594" +"0502939634173","TONIC WATER FENTIMANS","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","3","0","0","0","13020" +"0542501039182","BIOSIL CAPSULES","17.55","0","0","0","12.99","0","12.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","93","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","1","0","0","0","0","0","1","1","0","0","0","0","14674" +"0641096100448","PBERRY RASPBERRIES","2.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","520","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12597" +"0653571422117","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12599" +"0692112985359","SUSHI MAT W/SPOON","3.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12601" +"0717940000038","SIMPLERS GERANIUM ROSE 5 ML","13.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","89","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","5","0","0","0","12603" +"0740107920101","PBERRY BLACKBERRY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","519","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12606" +"0742900000013","BWATER THREE GALLON REFILL","1.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","14","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","1","0","0","0","12607" +"0748404011175","PSEEDS NY HEAD","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","209","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12608" +"0751972031003","pgrapefruit bagged","6.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","526","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","8","6","0","0","0","12609" +"0773097581001","PBERRY BLUEBERRY NON-O","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12612" +"0775403000001","PGRAPES GREEN NON-O","3.49","0","0","0","2.99","0","2.99","0","0000-00-00 00:00:00","0000-00-00 00:00:00","551","0","0","1","1","0","673","0000-00-00 00:00:00","0","0","1","1","0","0","0","0","0","1","3","0","0","0","0","15659" +"0779814619125","Non-O Blueberries","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13273" +"0780463220000","PBLUEBERRIES NON-O PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13880" +"0789622525749","PORANGE BAG VALENCIA","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","558","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","6","0","0","0","12614" +"0789622905176","PDRESSING ROMANO","3.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","528","0","0","1","0","0","885","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12616" +"0792850007413","BBEES MANGO LIP BLISTER BOX","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","87","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15181" +"0795631333244","","0","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","520","0","0","1","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14947" +"0795631806908","TROPICAL TRIO MIX","6.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","552","0","0","1","0","0","743","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15569" +"0795631825404","PSTIR FRY MIX","5.29","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","529","0","0","1","0","0","1057","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16355" +"0845681000013","WAYFARE HICKORY CHEDDAR","3.89","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","232","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15899" +"0858073000997","PTOMATO CHERRY","3.69","0","0","0","0.2","0","0.2","0","0000-00-00 00:00:00","0000-00-00 00:00:00","524","0","0","1","0","0","542","0000-00-00 00:00:00","1","0","1","5","0","0","0","0","2.51","1","8","6","0","0","0","12620" +"0875764600101","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12621" +"0941895700007","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12625" +"0942190012502","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12627" +"0978047015757","LIFE FORCE DIET","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13648" +"0978047083928","THE BRAIN WASH","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","9","0","0","0","12634" +"0978055338115","INA MAYS CHILDBIRTH","18","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12636" +"0978061523013","FROM ASPARAGUS TO ZUCCHINI","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16304" +"0978074326965","INFLAMMATION NATION","15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13678" +"0978076033626","THE MINNESOTA TABLE","25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14946" +"0978076791450","YOGA FOR DEPRESSION","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12899" +"0978083619512","SAVING THE SEASONS","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14794" +"0978087790100","APPLE CIDER BOOK","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","6.63","1","0","0","0","0","0","15842" +"0978087857752","THE NEW SEED STARTER HNDBK","18.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12649" +"0978089529869","PERSCRIPTION FOR HERBAL HEALIN","23.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13908" +"0978089793485","THE ANTI-INFLAMATION DIET","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14882" +"0978096146200","CHILDBEARING YEAR","11.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12657" +"0978097086963","HEALING LYME","19.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16606" +"0978097168855","DO IT GREEN MN","8","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15956" +"0978097447064","YAMAS AND NIYAMAS BOOK","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","13082" +"0978097646766","WINTER HOMECOMING","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","241","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13277" +"0978097658900","CO-OP LABEL","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12664" +"0978097946751","CAMPING THE NORTH SHORE","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","1","0","12667" +"0978141654455","GREEN HOUSEKEEPING","17","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","13682" +"0978141657182","GREEN BARBARIANS","14.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","6","0","0","1","0","13683" +"0978157675570","MAKING THE GOOD LIFE LAST","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14800" +"0978158017464","HOME CHEESE MAKING ","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13647" +"0978158333236","PRESCRIPTION FOR HEALING","24.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12680" +"0978160342078","HERBAL RECIPES","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15954" +"0978188433492","HEALTHY HEALING","32.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12687" +"0978189112957","AROMATHERAPY CHART","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16325" +"0978189112971","CHAKRA CHART","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16337" +"0978193365008","Blue Sky Guide 2008","20","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","235","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","7","0","0","0","12694" +"0978193431307","LA CHASSE","16.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","241","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13276" +"4001638099950","WELEDA SEA BUCK OIL ","23.79","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","97","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16580" +"4017645003187","LOGONA COLOR APP BRUSH","3.35","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15697" +"4017645021228","LOGONA CREAM COLOR NOUG BROWN","21.59","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","96","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15694" +"5011428300028","MALDON SMKD SEA SALT","7.69","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15960" +"5029396341738","FENTIMANS TONIC","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14734" +"7412430100000","PORANGE BAG NAVEL","5.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","543","0","0","1","0","0","785","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12709" +"7798132720011","PBERRY BLUEBERRY","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","721","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","3","0","0","0","0","15298" +"7804632200004","PBLUEBERRIES NON-O PT","2.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1341","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","3","0","0","0","0","13878" +"8004360020656",".25 L. CANNING JAR","1.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15446" +"8410069230010","SPINACH AND CARROT ZITI","4.25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","234","0","0","1","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14966" +"9421900125029","PBERRY BLUEBERRY","4.99","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","542","0","0","1","0","0","1343","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","6","0","0","0","12714" +"9780470286319","HEALING DEPRESSION MIND BODY","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13444" +"9780471792130","4-WEEK ULTIMATE BODY DETOX PLN","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","499","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12721" +"9780743269650","INFLAMMATION NATION","15","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13673" +"9780760336267","THE MINNESOTA TABLE","25","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14942" +"9780836195125","SAVING THE SEASONS","16.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","14793" +"9780877901006","APPLE CIDER BOOK","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15841" +"9780895298690","PERSCRIPTION FOR HERBAL HEALIN","23.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13907" +"9780916773533","VINEGAR BOOK","9.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15611" +"9780961462024","HEALING WISE","17.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13675" +"9780971688551","DO IT GREEN MN","8","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15955" +"9780976467656","SKATING ANGEL","12.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","241","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","15524" +"9780976589006","THE COOP LABEL BOOK","15.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","9","0","0","0","12737" +"9781558323049","NURSING MOTHERS COMPANION","7.49","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","0","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","0","0","13407" +"9781576755709","MAKING THE GOOD LIFE LAST","16.95","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","244","0","1","0","0","0","mixmatchcode","0000-00-00 00:00:00","1","0","1","0","0","0","0","0","0","1","0","0","0","1","0","14798" +"9781891129568","REFLEXOLOGY CHART","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16320" +"9781891129711","CHAKRA CHART","5.75","0","0","0","0","0","0","0","0000-00-00 00:00:00","0000-00-00 00:00:00","242","0","1","0","0","0","0","0000-00-00 00:00:00","0","0","1","0","0","0","0","0","0","1","0","0","0","0","0","16319" diff --git a/fannie/install/sample_data/sampletrans.csv.zip b/fannie/install/sample_data/sampletrans.csv.zip new file mode 100644 index 000000000..cd937e284 Binary files /dev/null and b/fannie/install/sample_data/sampletrans.csv.zip differ diff --git a/fannie/install/sample_data/subdepts.sql b/fannie/install/sample_data/subdepts.sql new file mode 100644 index 000000000..040f6cab8 --- /dev/null +++ b/fannie/install/sample_data/subdepts.sql @@ -0,0 +1,246 @@ +('5','HBC','92') +('5','HBC','104') +('1','BULK','14') +('4','GROCERY','191') +('9','Gen Merch','246') +('9','Gen Merch','249') +('6','Produce','247') +('6','Produce','248') +('9','Gen Merch','250') +('1','BULK','1') +('1','BULK','2') +('1','BULK','3') +('1','BULK','4') +('1','BULK','5') +('1','BULK','6') +('1','BULK','7') +('1','BULK','8') +('1','BULK','10') +('1','BULK','11') +('1','BULK','12') +('1','BULK','13') +('1','BULK','15') +('1','BULK','16') +('1','BULK','17') +('1','BULK','18') +('1','BULK','19') +('1','BULK','21') +('1','BULK','22') +('1','BULK','23') +('1','BULK','24') +('1','BULK','25') +('2','COOL/FROZEN','26') +('2','COOL/FROZEN','27') +('2','COOL/FROZEN','28') +('2','COOL/FROZEN','29') +('2','COOL/FROZEN','30') +('2','COOL/FROZEN','31') +('2','COOL/FROZEN','32') +('4','GROCERY','188') +('2','COOL/FROZEN','34') +('2','COOL/FROZEN','38') +('2','COOL/FROZEN','39') +('2','COOL/FROZEN','40') +('2','COOL/FROZEN','41') +('2','COOL/FROZEN','42') +('8','Meat','261') +('2','COOL/FROZEN','44') +('2','COOL/FROZEN','45') +('2','COOL/FROZEN','46') +('4','GROCERY','189') +('2','COOL/FROZEN','54') +('2','COOL/FROZEN','55') +('2','COOL/FROZEN','56') +('2','COOL/FROZEN','57') +('4','GROCERY','190') +('2','COOL/FROZEN','59') +('3','DELI','60') +('3','DELI','63') +('3','DELI','64') +('3','DELI','65') +('3','DELI','66') +('3','DELI','67') +('3','DELI','68') +('3','DELI','69') +('3','DELI','70') +('3','DELI','71') +('3','DELI','72') +('3','DELI','73') +('3','DELI','74') +('3','DELI','150') +('4','GROCERY','151') +('4','GROCERY','152') +('4','GROCERY','153') +('4','GROCERY','154') +('4','GROCERY','155') +('4','GROCERY','156') +('4','GROCERY','157') +('4','GROCERY','158') +('4','GROCERY','159') +('4','GROCERY','160') +('4','GROCERY','161') +('4','GROCERY','162') +('4','GROCERY','163') +('4','GROCERY','164') +('4','GROCERY','165') +('4','GROCERY','166') +('4','GROCERY','167') +('4','GROCERY','168') +('4','GROCERY','169') +('4','GROCERY','170') +('4','GROCERY','171') +('4','GROCERY','172') +('4','GROCERY','173') +('4','GROCERY','174') +('4','GROCERY','175') +('4','GROCERY','176') +('4','GROCERY','177') +('4','GROCERY','178') +('4','GROCERY','179') +('4','GROCERY','180') +('4','GROCERY','181') +('4','GROCERY','182') +('4','GROCERY','183') +('4','GROCERY','185') +('4','GROCERY','186') +('1','BULK','251') +('1','BULK','252') +('1','BULK','253') +('1','BULK','254') +('1','BULK','255') +('1','BULK','256') +('1','BULK','257') +('1','BULK','245') +('1','BULK','239') +('5','HBC','93') +('5','HBC','94') +('5','HBC','95') +('5','HBC','96') +('5','HBC','97') +('5','HBC','98') +('5','HBC','99') +('5','HBC','100') +('5','HBC','101') +('5','HBC','102') +('5','HBC','103') +('9','Gen Merch','244') +('1','BULK','258') +('1','BULK','259') +('5','HBC','123') +('5','HBC','124') +('5','HBC','125') +('9','Gen Merch','243') +('5','HBC','127') +('5','HBC','128') +('0','Misc','600') +('4','GROCERY','187') +('6','Produce','500') +('6','Produce','502') +('0','Misc','604') +('6','Produce','503') +('6','Produce','505') +('6','Produce','507') +('6','Produce','200') +('6','Produce','201') +('6','Produce','202') +('6','Produce','203') +('6','Produce','204') +('6','Produce','205') +('6','Produce','206') +('6','Produce','208') +('6','Produce','209') +('6','Produce','210') +('6','Produce','220') +('0','Misc','900') +('0','Misc','990') +('0','Misc','991') +('0','Misc','700') +('6','Produce','508') +('6','Produce','510') +('0','Misc','703') +('6','Produce','512') +('6','Produce','513') +('0','Misc','992') +('3','DELI','61') +('3','DELI','62') +('3','DELI','225') +('3','DELI','226') +('3','DELI','227') +('3','DELI','228') +('3','DELI','229') +('3','DELI','230') +('3','DELI','231') +('3','DELI','232') +('3','DELI','233') +('2','COOL/FROZEN','37') +('2','COOL/FROZEN','35') +('8','Meat','260') +('9','Gen Merch','242') +('0','Misc','902') +('3','DELI','234') +('7','Marketing','235') +('6','Produce','501') +('9','Gen Merch','240') +('9','Gen Merch','241') +('8','Meat','262') +('8','Meat','263') +('2','COOL/FROZEN','53') +('0','Misc','800') +('6','Produce','238') +('0','Misc','708') +('3','DELI','75') +('6','Produce','207') +('0','Misc','610') +('3','DELI','76') +('6','Produce','504') +('5','HBC','86') +('6','Produce','506') +('6','Produce','509') +('6','Produce','511') +('6','Produce','514') +('6','Produce','515') +('6','Produce','516') +('6','Produce','517') +('6','Produce','518') +('6','Produce','519') +('6','Produce','520') +('6','Produce','521') +('6','Produce','522') +('6','Produce','523') +('6','Produce','524') +('6','Produce','525') +('6','Produce','526') +('6','Produce','527') +('6','Produce','528') +('6','Produce','529') +('6','Produce','540') +('6','Produce','541') +('6','Produce','542') +('6','Produce','543') +('6','Produce','544') +('6','Produce','545') +('6','Produce','546') +('6','Produce','547') +('6','Produce','548') +('6','Produce','549') +('6','Produce','550') +('6','Produce','551') +('6','Produce','552') +('6','Produce','553') +('6','Produce','554') +('6','Produce','555') +('6','Produce','556') +('6','Produce','557') +('6','Produce','535') +('5','HBC','87') +('5','HBC','88') +('5','HBC','89') +('5','HBC','90') +('5','HBC','91') +('5','HBC','105') +('5','HBC','106') +('5','HBC','107') +('5','HBC','108') +('0','Misc','881') +('0','Misc','882') +('7','Marketing','236') diff --git a/fannie/install/sample_data/superDeptNames.sql b/fannie/install/sample_data/superDeptNames.sql new file mode 100644 index 000000000..7744fb8e8 --- /dev/null +++ b/fannie/install/sample_data/superDeptNames.sql @@ -0,0 +1,10 @@ +(0,'Misc') +(1,'Bulk') +(2,'Cool/Frozen') +(3,'Deli') +(4,'Grocery') +(5,'HealthBeauty') +(6,'Produce') +(7,'Marketing') +(8,'Meat') +(9,'GenMerch') diff --git a/fannie/install/sample_data/superdepts.sql b/fannie/install/sample_data/superdepts.sql new file mode 100644 index 000000000..2092067f2 --- /dev/null +++ b/fannie/install/sample_data/superdepts.sql @@ -0,0 +1,246 @@ +(0,600) +(0,604) +(0,610) +(0,700) +(0,703) +(0,708) +(0,800) +(0,881) +(0,882) +(0,900) +(0,902) +(0,990) +(0,991) +(0,992) +(1,1) +(1,2) +(1,3) +(1,4) +(1,5) +(1,6) +(1,7) +(1,8) +(1,10) +(1,11) +(1,12) +(1,13) +(1,14) +(1,15) +(1,16) +(1,17) +(1,18) +(1,19) +(1,21) +(1,22) +(1,23) +(1,24) +(1,25) +(1,239) +(1,245) +(1,251) +(1,252) +(1,253) +(1,254) +(1,255) +(1,256) +(1,257) +(1,258) +(1,259) +(2,26) +(2,27) +(2,28) +(2,29) +(2,30) +(2,31) +(2,32) +(2,34) +(2,35) +(2,37) +(2,38) +(2,39) +(2,40) +(2,41) +(2,42) +(2,44) +(2,45) +(2,46) +(2,53) +(2,54) +(2,55) +(2,56) +(2,57) +(2,59) +(3,60) +(3,61) +(3,62) +(3,63) +(3,64) +(3,65) +(3,66) +(3,67) +(3,68) +(3,69) +(3,70) +(3,71) +(3,72) +(3,73) +(3,74) +(3,75) +(3,76) +(3,150) +(3,225) +(3,226) +(3,227) +(3,228) +(3,229) +(3,230) +(3,231) +(3,232) +(3,233) +(3,234) +(4,151) +(4,152) +(4,153) +(4,154) +(4,155) +(4,156) +(4,157) +(4,158) +(4,159) +(4,160) +(4,161) +(4,162) +(4,163) +(4,164) +(4,165) +(4,166) +(4,167) +(4,168) +(4,169) +(4,170) +(4,171) +(4,172) +(4,173) +(4,174) +(4,175) +(4,176) +(4,177) +(4,178) +(4,179) +(4,180) +(4,181) +(4,182) +(4,183) +(4,185) +(4,186) +(4,187) +(4,188) +(4,189) +(4,190) +(4,191) +(5,86) +(5,87) +(5,88) +(5,89) +(5,90) +(5,91) +(5,92) +(5,93) +(5,94) +(5,95) +(5,96) +(5,97) +(5,98) +(5,99) +(5,100) +(5,101) +(5,102) +(5,103) +(5,104) +(5,105) +(5,106) +(5,107) +(5,108) +(5,123) +(5,124) +(5,125) +(5,127) +(5,128) +(6,200) +(6,201) +(6,202) +(6,203) +(6,204) +(6,205) +(6,206) +(6,207) +(6,208) +(6,209) +(6,210) +(6,220) +(6,238) +(6,247) +(6,248) +(6,500) +(6,501) +(6,502) +(6,503) +(6,504) +(6,505) +(6,506) +(6,507) +(6,508) +(6,509) +(6,510) +(6,511) +(6,512) +(6,513) +(6,514) +(6,515) +(6,516) +(6,517) +(6,518) +(6,519) +(6,520) +(6,521) +(6,522) +(6,523) +(6,524) +(6,525) +(6,526) +(6,527) +(6,528) +(6,529) +(6,535) +(6,540) +(6,541) +(6,542) +(6,543) +(6,544) +(6,545) +(6,546) +(6,547) +(6,548) +(6,549) +(6,550) +(6,551) +(6,552) +(6,553) +(6,554) +(6,555) +(6,556) +(6,557) +(7,235) +(7,236) +(8,260) +(8,261) +(8,262) +(8,263) +(9,240) +(9,241) +(9,242) +(9,243) +(9,244) +(9,246) +(9,249) +(9,250) diff --git a/fannie/install/sample_data/tenders.sql b/fannie/install/sample_data/tenders.sql new file mode 100644 index 000000000..4c3722310 --- /dev/null +++ b/fannie/install/sample_data/tenders.sql @@ -0,0 +1,19 @@ +(1,'CA','Cash','CA','Change',0,500,500) +(2,'CK','Check','CKCB','Cash Back',0,500,0) +(3,'CC','Credit Card','','',0,500,99999) +(4,'DC','Debit Card','DCCB','Cash Back',0,100,0) +(5,'FS','EBT','','',0,100,10) +(6,'MC','Coupons','','',0,20,0.01) +(7,'MI','Instore Charges','','',0,1000,5) +(8,'TC','Gift Certificate','TCCB','Change',0.01,0,10) +(9,'EC','EBT Cash','ECCB','ECT Cash Back',0,500,0) +(10,'WT','WIC','CK','',0.01,900,0) +(11,'IC','Instore Coupon','','',0.01,5,0) +(12,'CX','Corp. Charge','','',0.01,9999,0) +(13,'LN','Tender','','',0.01,9999,0) +(14,'CP','Coupons','','',0,20,0.01) +(15,'EF','EBT FS','','',0,100,10) +(16,'GD','Gift Card','CA','Credit Acct',0,500,10) +(17,'TV','Travelers Check','CK','Change',0,500,500) +(18,'MA','MAD Coupon','CA','',0.01,2.5,0) +(19,'RR','RRR Coupon','CA','',0.01,1,0) diff --git a/fannie/install/sample_data/userKnownPrivs.sql b/fannie/install/sample_data/userKnownPrivs.sql new file mode 100644 index 000000000..c8447306e --- /dev/null +++ b/fannie/install/sample_data/userKnownPrivs.sql @@ -0,0 +1,29 @@ +('salesbyhour','Permission to view certain sales by hour reports.') +('batches','Create, edit, and delete Sales Batches.') +('pricechange','Permission to edit products via Item Maintenance.') +('delete_items','Delete products') +('view_all_hours','Related to WFC-specific tools to track employee hours worked and PTO.') +('ordering_edit','Permission to edit special orders.') +('cashierPerformance','View the cashier performance report.') +('hours','Related to WFC-specific tools for tracking employee hours worked and PTO.') +('overshorts','Permission to view cashier tender totals and enter actual counts. Not formally supported outside legacy yet.') +('admin','Gives the user permission to edit users, groups, and authorizations via the web interface.') +('memgen','Permission to create new member accounts') +('projects','Relates to WFC-specific ticketing-system.') +('barcodes','View, edit, print, and delete shelftags.') +('produce','Relates to a very old WFC produce sales report.') +('staffar','Relates to WFC-specific tools for payroll deductions and A/R accounts.') +('mas90_journal','Relates to WFC-specific reports that export data for Sage MAS90.') +('editmembers_csc','A special authorization to edit just a subset of member information. Only applicable in WFC\'s legacy member management tool.') +('editmembers','Edit members\' information') +('editcashiers','Edit cashiers via Admin => Cashier Management.') +('evals','Relates to WFC-specific tool for tracking employee evaluations.') +('tenders','Create, edit, and delete tenders.') +('emailreporting','Related to a WFC-specific report of how often employees are checking their email.') +('manage_likecodes','Edit like codes.') +('backvoids','Void entire transactions via Fannie. Legacy feature not yet supported outside WFC.') +('batches_audited','Create, edit, and view Sales Batches. See \"audited_pricechange\" for more info on the distinction that \"audited\" makes.') +('audited_pricechange','Gives access to edit products through Item Maintenance. Audited refers to the fact that the system emails buyers or department managers when users with this authorization actually edit products.') +('edit_employees','Related to employee hours worked and PTO tracking. WFC specific.') +('upload_hours_data','Related to WFC-specific tools to track employee hours worked and PTO.') +('apptracking','Related to a legacy WFC job application tracking system.') diff --git a/fannie/install/secure.sh b/fannie/install/secure.sh new file mode 100755 index 000000000..28aec574d --- /dev/null +++ b/fannie/install/secure.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +if [ -z $1 ]; then + echo "Usage: secure.sh [username]"; + exit 0 +fi + +echo "Create a password for $1" +if [ -f .htpasswd ]; then + htpasswd .htpasswd $1 +else + htpasswd -c .htpasswd $1 +fi + +PWD=`pwd` +if [ ! -f .htaccess ]; then + echo "Creating .htaccess file" + echo "AuthType Basic" > .htaccess + echo "AuthName \"Fanie Config\"" >> .htaccess + echo "AuthUserFile $PWD/.htpasswd" >> .htaccess + echo "Require valid-user" >> .htaccess +fi diff --git a/fannie/install/sql/arch/reportDataCache.php b/fannie/install/sql/arch/reportDataCache.php new file mode 100644 index 000000000..567b18b37 --- /dev/null +++ b/fannie/install/sql/arch/reportDataCache.php @@ -0,0 +1,24 @@ + diff --git a/fannie/install/sql/arch/sumDeptSalesByDay.php b/fannie/install/sql/arch/sumDeptSalesByDay.php new file mode 100644 index 000000000..21cb22970 --- /dev/null +++ b/fannie/install/sql/arch/sumDeptSalesByDay.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/arch/sumDiscountsByDay.php b/fannie/install/sql/arch/sumDiscountsByDay.php new file mode 100644 index 000000000..f5eba2e47 --- /dev/null +++ b/fannie/install/sql/arch/sumDiscountsByDay.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/arch/sumFlaggedSalesByDay.php b/fannie/install/sql/arch/sumFlaggedSalesByDay.php new file mode 100644 index 000000000..59f26ef5b --- /dev/null +++ b/fannie/install/sql/arch/sumFlaggedSalesByDay.php @@ -0,0 +1,36 @@ + diff --git a/fannie/install/sql/arch/sumMemSalesByDay.php b/fannie/install/sql/arch/sumMemSalesByDay.php new file mode 100644 index 000000000..d46e2f8a2 --- /dev/null +++ b/fannie/install/sql/arch/sumMemSalesByDay.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/arch/sumMemTypeSalesByDay.php b/fannie/install/sql/arch/sumMemTypeSalesByDay.php new file mode 100644 index 000000000..f137ac3aa --- /dev/null +++ b/fannie/install/sql/arch/sumMemTypeSalesByDay.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/arch/sumRingSalesByDay.php b/fannie/install/sql/arch/sumRingSalesByDay.php new file mode 100644 index 000000000..6872ae5c6 --- /dev/null +++ b/fannie/install/sql/arch/sumRingSalesByDay.php @@ -0,0 +1,36 @@ + diff --git a/fannie/install/sql/arch/sumTendersByDay.php b/fannie/install/sql/arch/sumTendersByDay.php new file mode 100644 index 000000000..a30afb9a2 --- /dev/null +++ b/fannie/install/sql/arch/sumTendersByDay.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/arch/sumUpcSalesByDay.php b/fannie/install/sql/arch/sumUpcSalesByDay.php new file mode 100644 index 000000000..996f12968 --- /dev/null +++ b/fannie/install/sql/arch/sumUpcSalesByDay.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/arch/vDeptSalesToday.php b/fannie/install/sql/arch/vDeptSalesToday.php new file mode 100644 index 000000000..79398a7f3 --- /dev/null +++ b/fannie/install/sql/arch/vDeptSalesToday.php @@ -0,0 +1,33 @@ + diff --git a/fannie/install/sql/arch/vRingSalesToday.php b/fannie/install/sql/arch/vRingSalesToday.php new file mode 100644 index 000000000..9c1d183b2 --- /dev/null +++ b/fannie/install/sql/arch/vRingSalesToday.php @@ -0,0 +1,35 @@ + '0' + GROUP BY DATE(tdate), upc, department +"; +if ($dbms == 'MSSQL'){ + $CREATE['arch.vRingSalesToday'] = str_replace(" date"," datetime",$CREATE['arch.vRingSalesToday']); +} +?> diff --git a/fannie/install/sql/magic-doc.php b/fannie/install/sql/magic-doc.php new file mode 100644 index 000000000..749f45fb5 --- /dev/null +++ b/fannie/install/sql/magic-doc.php @@ -0,0 +1,124 @@ +Links to per-table Help +

        Each link displays the current contents of the comment block +
        in the PHP script at docroot/IS4C/fannie/install/sql/op|trans/tablename.php +
        that creates the table. +

        +"; + + /* Option to display each page in a new tab (target=). 1=do, 0=don't */ + $new_tab = 1; + + echo "

        core_op

        "; + echo "This database contains relatively static information + related to operations, such as products and employees"; + echo "
          "; + $dh = opendir("op"); + $op_files = array(); + while (($file = readdir($dh)) !== false) { + if (is_file("op/".$file)) + $op_files[] = $file; + } + sort($op_files); + foreach($op_files as $f){ + if ( $new_tab == 1 ) { + printf('
        • %s
        • ', + urlencode("op/".$f), + $f, + substr($f,0,-4) + ); + } + else { + printf('
        • %s
        • ', + urlencode("op/".$f), + substr($f,0,-4) + ); + } + } + echo "
        "; + + echo "

        core_trans

        "; + echo "This database contains changing information, + primarily transaction related"; + echo "
          "; + $dh = opendir("trans"); + $trans_files = array(); + while (($file = readdir($dh)) !== false) { + if (is_file("trans/".$file)) + $trans_files[] = $file; + } + sort($trans_files); + foreach($trans_files as $f){ +/* printf('
        • %s
        • ', + urlencode("trans/".$f), + $f, + substr($f,0,-4) + ); + */ + if ( $new_tab == 1 ) { + printf('
        • %s
        • ', + urlencode("trans/".$f), + $f, + substr($f,0,-4) + ); + } + else { + printf('
        • %s
        • ', + urlencode("trans/".$f), + substr($f,0,-4) + ); + } + } + echo "
        "; +} +/* Display the help for the named table-creation-script. */ +else { + $fn = urldecode($_REQUEST['fn']); + if (!file_exists($fn)){ + echo "Error: bad file name: $fn"; + echo "
        "; + echo "Back"; + exit; + } + + $data = file_get_contents($fn); + $tokens = token_get_all($data); + $documentation = ""; + foreach($tokens as $t){ + if ($t[0] == T_COMMENT) + $documentation .= (empty($documentation)?"\n":"").$t[1]; + } + + echo 'Back
        '; + if (empty($documentation)) + echo "Someone forgot to comment their table...
        "; + else + printf("
        %s
        ",$documentation); + echo 'Back
        '; +} +?> diff --git a/fannie/install/sql/op/AdSaleDates.php b/fannie/install/sql/op/AdSaleDates.php new file mode 100644 index 000000000..2c416d6e0 --- /dev/null +++ b/fannie/install/sql/op/AdSaleDates.php @@ -0,0 +1,25 @@ + diff --git a/fannie/install/sql/op/MasterSuperDepts.php b/fannie/install/sql/op/MasterSuperDepts.php new file mode 100644 index 000000000..e86dd71c6 --- /dev/null +++ b/fannie/install/sql/op/MasterSuperDepts.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/PurchaseOrder.php b/fannie/install/sql/op/PurchaseOrder.php new file mode 100644 index 000000000..732625a2a --- /dev/null +++ b/fannie/install/sql/op/PurchaseOrder.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/op/PurchaseOrderItems.php b/fannie/install/sql/op/PurchaseOrderItems.php new file mode 100644 index 000000000..4f13d941a --- /dev/null +++ b/fannie/install/sql/op/PurchaseOrderItems.php @@ -0,0 +1,61 @@ + diff --git a/fannie/install/sql/op/UpdateLog.php b/fannie/install/sql/op/UpdateLog.php new file mode 100644 index 000000000..36ccf0be5 --- /dev/null +++ b/fannie/install/sql/op/UpdateLog.php @@ -0,0 +1,22 @@ + diff --git a/fannie/install/sql/op/batchBarcodes.php b/fannie/install/sql/op/batchBarcodes.php new file mode 100644 index 000000000..68da9849f --- /dev/null +++ b/fannie/install/sql/op/batchBarcodes.php @@ -0,0 +1,60 @@ + diff --git a/fannie/install/sql/op/batchCutPaste.php b/fannie/install/sql/op/batchCutPaste.php new file mode 100644 index 000000000..4710220ba --- /dev/null +++ b/fannie/install/sql/op/batchCutPaste.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/sql/op/batchList.php b/fannie/install/sql/op/batchList.php new file mode 100644 index 000000000..b793bec4a --- /dev/null +++ b/fannie/install/sql/op/batchList.php @@ -0,0 +1,54 @@ + diff --git a/fannie/install/sql/op/batchMergeLC.php b/fannie/install/sql/op/batchMergeLC.php new file mode 100644 index 000000000..d2a28e52f --- /dev/null +++ b/fannie/install/sql/op/batchMergeLC.php @@ -0,0 +1,43 @@ + diff --git a/fannie/install/sql/op/batchMergeProd.php b/fannie/install/sql/op/batchMergeProd.php new file mode 100644 index 000000000..475b6e6c5 --- /dev/null +++ b/fannie/install/sql/op/batchMergeProd.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/batchMergeTable.php b/fannie/install/sql/op/batchMergeTable.php new file mode 100644 index 000000000..1ffa786a8 --- /dev/null +++ b/fannie/install/sql/op/batchMergeTable.php @@ -0,0 +1,38 @@ + diff --git a/fannie/install/sql/op/batchPriority.php b/fannie/install/sql/op/batchPriority.php new file mode 100644 index 000000000..193e2a072 --- /dev/null +++ b/fannie/install/sql/op/batchPriority.php @@ -0,0 +1,40 @@ + diff --git a/fannie/install/sql/op/batchPriority0.php b/fannie/install/sql/op/batchPriority0.php new file mode 100644 index 000000000..56dfcabe0 --- /dev/null +++ b/fannie/install/sql/op/batchPriority0.php @@ -0,0 +1,43 @@ +datediff($con->now(),'b.startDate')." >= 0 AND ". +$con->datediff($con->now(),'b.endDate')." <= 0 +AND b.priority >= 0 +AND l.upc NOT IN (SELECT upc FROM batchPriority30) +AND l.upc NOT IN (SELECT upc FROM batchPriority20) +AND l.upc NOT IN (SELECT upc FROM batchPriority10) +"; + +?> diff --git a/fannie/install/sql/op/batchPriority10.php b/fannie/install/sql/op/batchPriority10.php new file mode 100644 index 000000000..6aa54dc13 --- /dev/null +++ b/fannie/install/sql/op/batchPriority10.php @@ -0,0 +1,41 @@ +datediff($con->now(),'b.startDate')." >= 0 AND ". +$con->datediff($con->now(),'b.endDate')." <= 0 +AND b.priority >= 10 +AND l.upc NOT IN (SELECT upc FROM batchPriority30) +AND l.upc NOT IN (SELECT upc FROM batchPriority20) +"; + +?> diff --git a/fannie/install/sql/op/batchPriority20.php b/fannie/install/sql/op/batchPriority20.php new file mode 100644 index 000000000..b1408ffb5 --- /dev/null +++ b/fannie/install/sql/op/batchPriority20.php @@ -0,0 +1,39 @@ +datediff($con->now(),'b.startDate')." >= 0 AND ". +$con->datediff($con->now(),'b.endDate')." <= 0 +AND b.priority >= 20 +AND l.upc NOT IN (SELECT upc FROM batchPriority30) +"; + +?> diff --git a/fannie/install/sql/op/batchPriority30.php b/fannie/install/sql/op/batchPriority30.php new file mode 100644 index 000000000..b898872e0 --- /dev/null +++ b/fannie/install/sql/op/batchPriority30.php @@ -0,0 +1,36 @@ +datediff($con->now(),'b.startDate')." >= 0 AND ". +$con->datediff($con->now(),'b.endDate')." <= 0 +AND b.priority >= 30 +"; + +?> diff --git a/fannie/install/sql/op/batchType.php b/fannie/install/sql/op/batchType.php new file mode 100644 index 000000000..1e3907e2c --- /dev/null +++ b/fannie/install/sql/op/batchType.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/batches.php b/fannie/install/sql/op/batches.php new file mode 100644 index 000000000..36addf359 --- /dev/null +++ b/fannie/install/sql/op/batches.php @@ -0,0 +1,52 @@ + diff --git a/fannie/install/sql/op/batchowner.php b/fannie/install/sql/op/batchowner.php new file mode 100644 index 000000000..45694d063 --- /dev/null +++ b/fannie/install/sql/op/batchowner.php @@ -0,0 +1,25 @@ + diff --git a/fannie/install/sql/op/cronBackup.php b/fannie/install/sql/op/cronBackup.php new file mode 100644 index 000000000..b4f54e45d --- /dev/null +++ b/fannie/install/sql/op/cronBackup.php @@ -0,0 +1,20 @@ + diff --git a/fannie/install/sql/op/custAvailablePrefs.php b/fannie/install/sql/op/custAvailablePrefs.php new file mode 100644 index 000000000..d14949c8c --- /dev/null +++ b/fannie/install/sql/op/custAvailablePrefs.php @@ -0,0 +1,24 @@ + diff --git a/fannie/install/sql/op/custPreferences.php b/fannie/install/sql/op/custPreferences.php new file mode 100644 index 000000000..529880d0f --- /dev/null +++ b/fannie/install/sql/op/custPreferences.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/custReceiptMessage.php b/fannie/install/sql/op/custReceiptMessage.php new file mode 100644 index 000000000..c08f0c96b --- /dev/null +++ b/fannie/install/sql/op/custReceiptMessage.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/op/custdata.php b/fannie/install/sql/op/custdata.php new file mode 100644 index 000000000..967887c7d --- /dev/null +++ b/fannie/install/sql/op/custdata.php @@ -0,0 +1,161 @@ + diff --git a/fannie/install/sql/op/custdataBackup.php b/fannie/install/sql/op/custdataBackup.php new file mode 100644 index 000000000..a227d9409 --- /dev/null +++ b/fannie/install/sql/op/custdataBackup.php @@ -0,0 +1,18 @@ + diff --git a/fannie/install/sql/op/customReceipt.php b/fannie/install/sql/op/customReceipt.php new file mode 100644 index 000000000..3df873126 --- /dev/null +++ b/fannie/install/sql/op/customReceipt.php @@ -0,0 +1,39 @@ + diff --git a/fannie/install/sql/op/customReports.php b/fannie/install/sql/op/customReports.php new file mode 100644 index 000000000..680fd83af --- /dev/null +++ b/fannie/install/sql/op/customReports.php @@ -0,0 +1,25 @@ + diff --git a/fannie/install/sql/op/dateRestrict.php b/fannie/install/sql/op/dateRestrict.php new file mode 100644 index 000000000..140347d74 --- /dev/null +++ b/fannie/install/sql/op/dateRestrict.php @@ -0,0 +1,36 @@ + diff --git a/fannie/install/sql/op/departments.php b/fannie/install/sql/op/departments.php new file mode 100644 index 000000000..5a7f04f9b --- /dev/null +++ b/fannie/install/sql/op/departments.php @@ -0,0 +1,69 @@ + diff --git a/fannie/install/sql/op/deptMargin.php b/fannie/install/sql/op/deptMargin.php new file mode 100644 index 000000000..45e0ccf5a --- /dev/null +++ b/fannie/install/sql/op/deptMargin.php @@ -0,0 +1,23 @@ + diff --git a/fannie/install/sql/op/deptSalesCodes.php b/fannie/install/sql/op/deptSalesCodes.php new file mode 100644 index 000000000..dedc06725 --- /dev/null +++ b/fannie/install/sql/op/deptSalesCodes.php @@ -0,0 +1,26 @@ + diff --git a/fannie/install/sql/op/disableCoupon.php b/fannie/install/sql/op/disableCoupon.php new file mode 100644 index 000000000..8992afb6a --- /dev/null +++ b/fannie/install/sql/op/disableCoupon.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/op/emailLog.php b/fannie/install/sql/op/emailLog.php new file mode 100644 index 000000000..5a4525bfa --- /dev/null +++ b/fannie/install/sql/op/emailLog.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/employees.php b/fannie/install/sql/op/employees.php new file mode 100644 index 000000000..0c34bc09b --- /dev/null +++ b/fannie/install/sql/op/employees.php @@ -0,0 +1,45 @@ + diff --git a/fannie/install/sql/op/expingMems.php b/fannie/install/sql/op/expingMems.php new file mode 100644 index 000000000..41e94a47c --- /dev/null +++ b/fannie/install/sql/op/expingMems.php @@ -0,0 +1,41 @@ +convert('d.end_date','char')." as enddate, + c.type, + c.memType + from meminfo as m,{$names['trans']}.newBalanceStockToday_test as n,custdata as c, memDates as d + where d.end_date is not null + AND d.end_date <> '' + AND m.card_no = n.memnum + AND c.CardNo = m.card_no + AND m.card_no = d.card_no + AND n.payments < 100 + AND c.type <> 'REG' + AND ".$con->monthdiff('d.end_date',$con->now())." = 3 + AND c.personNum = 1 +"; +?> diff --git a/fannie/install/sql/op/expingMems_thisMonth.php b/fannie/install/sql/op/expingMems_thisMonth.php new file mode 100644 index 000000000..f1697c303 --- /dev/null +++ b/fannie/install/sql/op/expingMems_thisMonth.php @@ -0,0 +1,41 @@ +convert('d.end_date','char')." as enddate, + c.type, + c.memType + from meminfo as m,{$names['trans']}.newBalanceStockToday_test as n,custdata as c, memDates as d + where d.end_date is not null + AND d.end_date <> '' + AND m.card_no = n.memnum + AND c.CardNo = m.card_no + AND m.card_no = d.card_no + AND n.payments < 100 + AND c.type <> 'REG' + AND ".$con->monthdiff('d.end_date',$con->now())." = 0 + AND c.personNum = 1 +"; +?> diff --git a/fannie/install/sql/op/houseCouponItems.php b/fannie/install/sql/op/houseCouponItems.php new file mode 100644 index 000000000..a5c62c200 --- /dev/null +++ b/fannie/install/sql/op/houseCouponItems.php @@ -0,0 +1,29 @@ + diff --git a/fannie/install/sql/op/houseCoupons.php b/fannie/install/sql/op/houseCoupons.php new file mode 100644 index 000000000..e22d4fbf7 --- /dev/null +++ b/fannie/install/sql/op/houseCoupons.php @@ -0,0 +1,118 @@ + diff --git a/fannie/install/sql/op/houseVirtualCoupons.php b/fannie/install/sql/op/houseVirtualCoupons.php new file mode 100644 index 000000000..5caf02a43 --- /dev/null +++ b/fannie/install/sql/op/houseVirtualCoupons.php @@ -0,0 +1,31 @@ + diff --git a/fannie/install/sql/op/likeCodeView.php b/fannie/install/sql/op/likeCodeView.php new file mode 100644 index 000000000..eaaef937c --- /dev/null +++ b/fannie/install/sql/op/likeCodeView.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/op/likeCodes.php b/fannie/install/sql/op/likeCodes.php new file mode 100644 index 000000000..97776c803 --- /dev/null +++ b/fannie/install/sql/op/likeCodes.php @@ -0,0 +1,27 @@ + upc mapping is in upcLike +*/ +$CREATE['op.likeCodes'] = " + CREATE TABLE likeCodes ( + likeCode int, + likeCodeDesc varchar(50), + PRIMARY KEY(likeCode) + ) +"; +?> diff --git a/fannie/install/sql/op/memContact.php b/fannie/install/sql/op/memContact.php new file mode 100644 index 000000000..fac223e21 --- /dev/null +++ b/fannie/install/sql/op/memContact.php @@ -0,0 +1,26 @@ + no contact + 1 => snail mail + 2 => email + 3 => both +*/ +$CREATE['op.memContact'] = " + CREATE TABLE memContact ( + card_no int, + pref int, + PRIMARY KEY (card_no) + ) +"; +?> diff --git a/fannie/install/sql/op/memContactPrefs.php b/fannie/install/sql/op/memContactPrefs.php new file mode 100644 index 000000000..cac146334 --- /dev/null +++ b/fannie/install/sql/op/memContactPrefs.php @@ -0,0 +1,24 @@ + + diff --git a/fannie/install/sql/op/memDates.php b/fannie/install/sql/op/memDates.php new file mode 100644 index 000000000..43c0e78e4 --- /dev/null +++ b/fannie/install/sql/op/memDates.php @@ -0,0 +1,25 @@ + diff --git a/fannie/install/sql/op/memberCards.php b/fannie/install/sql/op/memberCards.php new file mode 100644 index 000000000..789434d96 --- /dev/null +++ b/fannie/install/sql/op/memberCards.php @@ -0,0 +1,24 @@ + diff --git a/fannie/install/sql/op/memberNotes.php b/fannie/install/sql/op/memberNotes.php new file mode 100644 index 000000000..4500d7d1e --- /dev/null +++ b/fannie/install/sql/op/memberNotes.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/sql/op/memdefaults.php b/fannie/install/sql/op/memdefaults.php new file mode 100644 index 000000000..3909860c7 --- /dev/null +++ b/fannie/install/sql/op/memdefaults.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/op/meminfo.php b/fannie/install/sql/op/meminfo.php new file mode 100644 index 000000000..783a0a006 --- /dev/null +++ b/fannie/install/sql/op/meminfo.php @@ -0,0 +1,102 @@ + diff --git a/fannie/install/sql/op/memtype.php b/fannie/install/sql/op/memtype.php new file mode 100644 index 000000000..1679ed905 --- /dev/null +++ b/fannie/install/sql/op/memtype.php @@ -0,0 +1,24 @@ + diff --git a/fannie/install/sql/op/originCountry.php b/fannie/install/sql/op/originCountry.php new file mode 100644 index 000000000..b174b8854 --- /dev/null +++ b/fannie/install/sql/op/originCountry.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/op/originCustomRegion.php b/fannie/install/sql/op/originCustomRegion.php new file mode 100644 index 000000000..5ccd68f1a --- /dev/null +++ b/fannie/install/sql/op/originCustomRegion.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/op/originName.php b/fannie/install/sql/op/originName.php new file mode 100644 index 000000000..f6281b4a9 --- /dev/null +++ b/fannie/install/sql/op/originName.php @@ -0,0 +1,46 @@ +concat( + "CASE WHEN r.name IS NULL THEN '' ELSE ".$con->concat('r.name',"', '",'')." END", + "CASE WHEN s.name IS NULL THEN '' ELSE ".$con->concat('s.name',"', '",'')." END", + "CASE WHEN c.name IS NULL THEN '' ELSE c.name END",'' + )." as fullName, + CASE + WHEN r.customID IS NOT NULL THEN r.name + WHEN s.stateProvID IS NOT NULL THEN s.name + WHEN c.countryID IS NOT NULL THEN c.name + ELSE '' + END AS shortName, + o.local + FROM origins AS o + LEFT JOIN originCountry AS c ON o.countryID=c.countryID + LEFT JOIN originStateProv AS s ON o.stateProvID=s.stateProvID + LEFT JOIN originCustomRegion AS r ON o.customID=r.customID + WHERE + r.customID IS NOT NULL OR + s.stateProvID IS NOT NULL OR + c.countryID IS NOT NULL +"; + +?> diff --git a/fannie/install/sql/op/originStateProv.php b/fannie/install/sql/op/originStateProv.php new file mode 100644 index 000000000..6d079d454 --- /dev/null +++ b/fannie/install/sql/op/originStateProv.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/op/origins.php b/fannie/install/sql/op/origins.php new file mode 100644 index 000000000..971c29de0 --- /dev/null +++ b/fannie/install/sql/op/origins.php @@ -0,0 +1,47 @@ + diff --git a/fannie/install/sql/op/prodDepartmentHistory.php b/fannie/install/sql/op/prodDepartmentHistory.php new file mode 100644 index 000000000..ec8638f49 --- /dev/null +++ b/fannie/install/sql/op/prodDepartmentHistory.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/prodExtra.php b/fannie/install/sql/op/prodExtra.php new file mode 100644 index 000000000..2c91ca7cc --- /dev/null +++ b/fannie/install/sql/op/prodExtra.php @@ -0,0 +1,65 @@ + diff --git a/fannie/install/sql/op/prodFlags.php b/fannie/install/sql/op/prodFlags.php new file mode 100644 index 000000000..73b9b7b5d --- /dev/null +++ b/fannie/install/sql/op/prodFlags.php @@ -0,0 +1,22 @@ + diff --git a/fannie/install/sql/op/prodPriceHistory.php b/fannie/install/sql/op/prodPriceHistory.php new file mode 100644 index 000000000..59c8d1129 --- /dev/null +++ b/fannie/install/sql/op/prodPriceHistory.php @@ -0,0 +1,27 @@ + diff --git a/fannie/install/sql/op/prodUpdate.php b/fannie/install/sql/op/prodUpdate.php new file mode 100644 index 000000000..4a2526cb4 --- /dev/null +++ b/fannie/install/sql/op/prodUpdate.php @@ -0,0 +1,65 @@ + diff --git a/fannie/install/sql/op/productBackup.php b/fannie/install/sql/op/productBackup.php new file mode 100644 index 000000000..816273efd --- /dev/null +++ b/fannie/install/sql/op/productBackup.php @@ -0,0 +1,18 @@ + diff --git a/fannie/install/sql/op/productMargin.php b/fannie/install/sql/op/productMargin.php new file mode 100644 index 000000000..23c14d80e --- /dev/null +++ b/fannie/install/sql/op/productMargin.php @@ -0,0 +1,49 @@ + 0 + and d.margin <> 1 +"; + +if ($dbms == 'mssql'){ + $CREATE['op.productMargin'] = " + create view productMargin as + select upc, + cost,normal_price, + (normal_price-cost) / normal_price as actualMargin, + d.margin as desiredMargin, + convert(numeric(10,2),cost/(1-d.margin)) as srp + from products as p left join deptMargin as d + on p.department=d.dept_ID + where normal_price > 0 + and d.margin <> 1 + "; +} + +?> diff --git a/fannie/install/sql/op/productUser.php b/fannie/install/sql/op/productUser.php new file mode 100644 index 000000000..38d49cb0a --- /dev/null +++ b/fannie/install/sql/op/productUser.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/sql/op/products.php b/fannie/install/sql/op/products.php new file mode 100644 index 000000000..a71ebb7ab --- /dev/null +++ b/fannie/install/sql/op/products.php @@ -0,0 +1,227 @@ + 1.00 + pricemethod => 1 (or maybe 2) + groupprice => 1.50 + quantity => 2 +If discounttype is greater than zero, the special* +columns get used instead but otherwise behavior +should be similar. + +start_date and end_date indicate the start and end +of a sale. The current register code does not check +these to validate sales. + +department and subdept are an item's department +and subdepartment settings. + +tax indicates if an item is taxable and at what rate + +foodstamp indicates whether an item can be purchased +using foodstamps + +scale indicates whether an item should be sold by weight + +mixmatchcode relates to pricing when pricemethod is +greater than zero. Items with the same mixmatchcode +are considred equivalent when determining whether the +customer has reached the required quantity. + +modified [ideally] lists the last time a product was +changed. Not all back end tools remember to update this +and of course direct updates via SQL may forget too. + +tareweight is a default tare for by weight items + +discount indicates whether an item is eligible for +percentage discounts on a whole transactions. Value 0 +means exclude from discounts. + +discounttype indicates if an item is on sale + 0 => not on sale + 1 => on sale for everyone + 2 => on sale for members +Values greater than 2 may be used, but results will +vary based on whose code you're running + +unitofmeasure might be used for screen display and +receipt listings of quantity. + +qttyEnforced forces the cashier to enter an explicit +quantity when ringing up the item + +cost is the item's cost + +isUse indicates whether the item is currently +available for sale. Whether cashiers can bypass this +setting probably varies by front end implementation. + +local indicates whether the item is locally sourced. + +Other columns: +size, scaleprice, advertised, wicable, idEnforced, +numflag, and deposit have no current meaning on the +front or back end. Or no current implementation. +The meaning of idEnforced is pretty clear, but setting +it won't *do* anything. +*/ + +$CREATE['op.products'] = " + CREATE TABLE `products` ( + `upc` varchar(13) default NULL, + `description` varchar(30) default NULL, + `normal_price` double default NULL, + `pricemethod` smallint(6) default NULL, + `groupprice` double default NULL, + `quantity` smallint(6) default NULL, + `special_price` double default NULL, + `specialpricemethod` smallint(6) default NULL, + `specialgroupprice` double default NULL, + `specialquantity` smallint(6) default NULL, + `start_date` datetime default NULL, + `end_date` datetime default NULL, + `department` smallint(6) default NULL, + `size` varchar(9) default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `scale` tinyint(4) default NULL, + `scaleprice` tinyint(4) default 0 NULL, + `mixmatchcode` varchar(13) default NULL, + `modified` datetime default NULL, + `advertised` tinyint(4) default NULL, + `tareweight` double default NULL, + `discount` smallint(6) default NULL, + `discounttype` tinyint(4) default NULL, + `unitofmeasure` varchar(15) default NULL, + `wicable` smallint(6) default NULL, + `qttyEnforced` tinyint(4) default NULL, + `idEnforced` tinyint(4) default NULL, + `cost` double default 0 NULL, + `inUse` tinyint(4) default NULL, + `numflag` int(11) default '0', + `subdept` smallint(4) default NULL, + `deposit` double default NULL, + `local` int(11) default '0', + `store_id` smallint default '0', + `id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `upc` (`upc`), + KEY `description` (`description`), + KEY `normal_price` (`normal_price`), + KEY `subdept` (`subdept`), + KEY `department` (`department`), + KEY `store_id` (`store_id`) + ) +"; +if ($dbms == "MSSQL"){ + $CREATE['op.products'] = " + CREATE TABLE [products] ( + [upc] [varchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , + [description] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [normal_price] [money] NULL , + [pricemethod] [smallint] NULL , + [groupprice] [money] NULL , + [quantity] [smallint] NULL , + [special_price] [money] NULL , + [specialpricemethod] [smallint] NULL , + [specialgroupprice] [money] NULL , + [specialquantity] [smallint] NULL , + [start_date] [datetime] NULL , + [end_date] [datetime] NULL , + [department] [smallint] NOT NULL , + [size] [varchar] (9) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [tax] [smallint] NOT NULL , + [foodstamp] [bit] NOT NULL , + [Scale] [bit] NOT NULL , + [scaleprice] [tinyint] NULL , + [mixmatchcode] [varchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [modified] [datetime] NULL , + [advertised] [bit] NOT NULL , + [tareweight] [float] NULL , + [discount] [smallint] NULL , + [discounttype] [tinyint] NULL , + [unitofmeasure] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [wicable] [smallint] NULL , + [qttyEnforced] [tinyint] NULL , + [idEnforced] [tinyint] NULL , + [cost] [money] NULL , + [inUse] [tinyint] NOT NULL , + [numflag] [int] NULL , + [subdept] [smallint] NULL , + [deposit] [money] NULL , + [local] [int] NULL , + [store_id] [smallint] 0, + [id] [int] IDENTITY (1, 1) NOT NULL , + PRIMARY KEY ([id]) ) + "; +} + +?> diff --git a/fannie/install/sql/op/reasoncodes.php b/fannie/install/sql/op/reasoncodes.php new file mode 100644 index 000000000..884d33c56 --- /dev/null +++ b/fannie/install/sql/op/reasoncodes.php @@ -0,0 +1,26 @@ + diff --git a/fannie/install/sql/op/scaleItems.php b/fannie/install/sql/op/scaleItems.php new file mode 100644 index 000000000..03b3740b8 --- /dev/null +++ b/fannie/install/sql/op/scaleItems.php @@ -0,0 +1,44 @@ + diff --git a/fannie/install/sql/op/shelftags.php b/fannie/install/sql/op/shelftags.php new file mode 100644 index 000000000..44a5bfc8c --- /dev/null +++ b/fannie/install/sql/op/shelftags.php @@ -0,0 +1,63 @@ + diff --git a/fannie/install/sql/op/subdepts.php b/fannie/install/sql/op/subdepts.php new file mode 100644 index 000000000..6fe23d660 --- /dev/null +++ b/fannie/install/sql/op/subdepts.php @@ -0,0 +1,39 @@ + diff --git a/fannie/install/sql/op/superDeptNames.php b/fannie/install/sql/op/superDeptNames.php new file mode 100644 index 000000000..0ca94552b --- /dev/null +++ b/fannie/install/sql/op/superDeptNames.php @@ -0,0 +1,23 @@ + diff --git a/fannie/install/sql/op/superMinIdView.php b/fannie/install/sql/op/superMinIdView.php new file mode 100644 index 000000000..6eaa09a65 --- /dev/null +++ b/fannie/install/sql/op/superMinIdView.php @@ -0,0 +1,22 @@ + diff --git a/fannie/install/sql/op/superdepts.php b/fannie/install/sql/op/superdepts.php new file mode 100644 index 000000000..005f3a710 --- /dev/null +++ b/fannie/install/sql/op/superdepts.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/op/suspension_history.php b/fannie/install/sql/op/suspension_history.php new file mode 100644 index 000000000..6935e5956 --- /dev/null +++ b/fannie/install/sql/op/suspension_history.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/sql/op/suspensions.php b/fannie/install/sql/op/suspensions.php new file mode 100644 index 000000000..ed5ebd2f4 --- /dev/null +++ b/fannie/install/sql/op/suspensions.php @@ -0,0 +1,55 @@ +currency().", + reasoncode int, + PRIMARY KEY (cardno) + ) +"; +?> diff --git a/fannie/install/sql/op/taxrates.php b/fannie/install/sql/op/taxrates.php new file mode 100644 index 000000000..42e643adb --- /dev/null +++ b/fannie/install/sql/op/taxrates.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/sql/op/tenders.php b/fannie/install/sql/op/tenders.php new file mode 100644 index 000000000..89178abe4 --- /dev/null +++ b/fannie/install/sql/op/tenders.php @@ -0,0 +1,46 @@ + diff --git a/fannie/install/sql/op/unfi.php b/fannie/install/sql/op/unfi.php new file mode 100644 index 000000000..e5e8cca94 --- /dev/null +++ b/fannie/install/sql/op/unfi.php @@ -0,0 +1,59 @@ + diff --git a/fannie/install/sql/op/unfiCategories.php b/fannie/install/sql/op/unfiCategories.php new file mode 100644 index 000000000..64d07c032 --- /dev/null +++ b/fannie/install/sql/op/unfiCategories.php @@ -0,0 +1,31 @@ + diff --git a/fannie/install/sql/op/unfi_all.php b/fannie/install/sql/op/unfi_all.php new file mode 100644 index 000000000..d889aaf2c --- /dev/null +++ b/fannie/install/sql/op/unfi_all.php @@ -0,0 +1,84 @@ + p.normal_price then 1 else 0 END as diff + from products as p + right join unfi_order as u + on left(u.upcc,13)=p.upc + where + p.upc is not NULL +"; + +if ($dbms == 'MSSQL'){ + $CREATE['op.unfi_all'] = " + CREATE view unfi_all as + select p.upc,u.upcc, + p.description, + u.item_desc, + u.wholesale, + u.vd_cost, + p.normal_price, + u.unfi_sku, + u.wfc_srp, + u.cat, + p.department, + CASE WHEN p.normal_price = 0 THEN 0 ELSE + CONVERT(decimal(10,5),(p.normal_price - (u.vd_cost/u.pack))/p.normal_price) + END as our_margin, + CONVERT(decimal(10,5),(u.wfc_srp - (u.vd_cost/u.pack))/ u.wfc_srp) + as UNFI_margin, + case when u.wfc_srp > p.normal_price then 1 else 0 END as diff + from products as p + right join unfi_order as u + on left(u.upcc,13)=p.upc + where + p.upc is not NULL + "; +} + +?> diff --git a/fannie/install/sql/op/unfi_diff.php b/fannie/install/sql/op/unfi_diff.php new file mode 100644 index 000000000..d4f65b759 --- /dev/null +++ b/fannie/install/sql/op/unfi_diff.php @@ -0,0 +1,85 @@ + p.normal_price then 1 else 0 END as diff + from products as p + right join unfi_order as u + on u.upcc=p.upc + where + p.normal_price <> u.wfc_srp and + p.upc is not NULL +"; + +if ($dbms == 'MSSQL'){ + $CREATE['op.unfi_diff'] = " + CREATE view unfi_diff as + select p.upc,u.upcc, + p.description, + u.item_desc, + u.wholesale, + u.vd_cost, + p.normal_price, + u.unfi_sku, + u.wfc_srp, + u.cat, + p.department, + CASE WHEN p.normal_price = 0 THEN 0 ELSE + CONVERT(decimal(10,5),(p.normal_price - (u.vd_cost/u.pack))/p.normal_price) + END as our_margin, + CONVERT(decimal(10,5),(u.wfc_srp - (u.vd_cost/u.pack))/ u.wfc_srp) + as UNFI_margin, + case when u.wfc_srp > p.normal_price then 1 else 0 END as diff + from products as p + right join unfi_order as u + on left(u.upcc,13)=p.upc + where + p.normal_price <> u.wfc_srp and + p.upc is not NULL + "; +} +?> diff --git a/fannie/install/sql/op/unfi_order.php b/fannie/install/sql/op/unfi_order.php new file mode 100644 index 000000000..338b7145a --- /dev/null +++ b/fannie/install/sql/op/unfi_order.php @@ -0,0 +1,44 @@ + diff --git a/fannie/install/sql/op/upcLike.php b/fannie/install/sql/op/upcLike.php new file mode 100644 index 000000000..bc2c85de2 --- /dev/null +++ b/fannie/install/sql/op/upcLike.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/op/vendorContact.php b/fannie/install/sql/op/vendorContact.php new file mode 100644 index 000000000..7c64cefd7 --- /dev/null +++ b/fannie/install/sql/op/vendorContact.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/op/vendorDepartments.php b/fannie/install/sql/op/vendorDepartments.php new file mode 100644 index 000000000..60cfbc9e9 --- /dev/null +++ b/fannie/install/sql/op/vendorDepartments.php @@ -0,0 +1,39 @@ + diff --git a/fannie/install/sql/op/vendorItems.php b/fannie/install/sql/op/vendorItems.php new file mode 100644 index 000000000..4e51c159e --- /dev/null +++ b/fannie/install/sql/op/vendorItems.php @@ -0,0 +1,78 @@ + diff --git a/fannie/install/sql/op/vendorLoadScripts.php b/fannie/install/sql/op/vendorLoadScripts.php new file mode 100644 index 000000000..084b0dab3 --- /dev/null +++ b/fannie/install/sql/op/vendorLoadScripts.php @@ -0,0 +1,25 @@ + diff --git a/fannie/install/sql/op/vendorSKUtoPLU.php b/fannie/install/sql/op/vendorSKUtoPLU.php new file mode 100644 index 000000000..a332c9438 --- /dev/null +++ b/fannie/install/sql/op/vendorSKUtoPLU.php @@ -0,0 +1,30 @@ + diff --git a/fannie/install/sql/op/vendorSRPs.php b/fannie/install/sql/op/vendorSRPs.php new file mode 100644 index 000000000..cdd22c957 --- /dev/null +++ b/fannie/install/sql/op/vendorSRPs.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/op/vendors.php b/fannie/install/sql/op/vendors.php new file mode 100644 index 000000000..70bab67cf --- /dev/null +++ b/fannie/install/sql/op/vendors.php @@ -0,0 +1,21 @@ + diff --git a/fannie/install/sql/trans/AR_EOM_Summary.php b/fannie/install/sql/trans/AR_EOM_Summary.php new file mode 100644 index 000000000..fd520f15b --- /dev/null +++ b/fannie/install/sql/trans/AR_EOM_Summary.php @@ -0,0 +1,54 @@ +datediff('a.tdate',$con->now())." > -91 + and ".$con->monthdiff('a.tdate',$con->now())." <= 0 + AND a.payments > 0 + + UNION ALL + + SELECT + a.card_no, a.charges, a.payments, + ".$con->convert('a.tdate','char')." as date, + a.trans_num, + d.upc, + case when (d.trans_type='T' AND register_no=20) THEN 'Gazette Advertisement' + ELSE d.description + END as description, + d.description as dept_name + FROM ar_history as a LEFT JOIN + transarchive as d ON ".$con->datediff('a.tdate','d.datetime')."=0 and + a.trans_num=". + $con->concat($con->convert('d.emp_no','char'),"'-'", + $con->convert('d.register_no','char'),"'-'", + $con->convert('d.trans_no','char'),'') + ." + where ".$con->datediff('a.tdate',$con->now())."> -91 + and ".$con->monthdiff('a.tdate',$con->now())." <= 0 + and d.trans_status <> 'X' + AND a.payments <= 0 + and ( + (d.trans_type in ('I','D') and d.trans_subtype not in ('0','CP')) + or + (d.trans_type in ('T') and register_no=20 and ".$con->monthdiff('tdate','2009-05-01')."=0) + ) + + union all + + SELECT d.card_no, + case when d.trans_subtype='MI' then -d.total else 0 end as charges, + case when d.department IN $dlist then d.total else 0 end as payments, + ".$con->convert('d.datetime','char')." as date,". + $con->concat($con->convert('d.emp_no','char'),"'-'", + $con->convert('d.register_no','char'),"'-'", + $con->convert('d.trans_no','char'),'') + ." as trans_num, + d.upc, + case + when (d.department IN $dlist) then 'Payment - Thank You' + ELSE a.description + END as description, + d.description as dept_name + FROM dtransactions as d left join dtransactions as a + on d.register_no=a.register_no and d.emp_no=a.emp_no + and d.trans_no=a.trans_no + where (d.department IN $dlist or d.trans_subtype='MI') AND + d.trans_status <> 'X' AND + (a.trans_type in ('I','D') and a.trans_subtype not in ('0','CP')) +"; +?> diff --git a/fannie/install/sql/trans/CashPerformDay.php b/fannie/install/sql/trans/CashPerformDay.php new file mode 100644 index 000000000..8e82168ad --- /dev/null +++ b/fannie/install/sql/trans/CashPerformDay.php @@ -0,0 +1,44 @@ +seconddiff('min(tdate)', 'max(tdate)')." =0 + then 1 else + ".$con->seconddiff('min(tdate)', 'max(tdate)') ." + END as transInterval, + sum(CASE WHEN abs(quantity) > 30 THEN 1 else abs(quantity) END) as items, + Count(upc) as rings, + SUM(case when trans_status = 'V' then 1 ELSE 0 END) AS Cancels, + max(card_no) as card_no + from dlog_90_view + where trans_type IN ('I','D','0','C') + group by year(tdate),month(tdate),day(tdate),trans_num +"; +?> diff --git a/fannie/install/sql/trans/CashPerformDay_cache.php b/fannie/install/sql/trans/CashPerformDay_cache.php new file mode 100644 index 000000000..b330af43c --- /dev/null +++ b/fannie/install/sql/trans/CashPerformDay_cache.php @@ -0,0 +1,38 @@ + diff --git a/fannie/install/sql/trans/CompleteSpecialOrder.php b/fannie/install/sql/trans/CompleteSpecialOrder.php new file mode 100644 index 000000000..5779d7183 --- /dev/null +++ b/fannie/install/sql/trans/CompleteSpecialOrder.php @@ -0,0 +1,107 @@ + diff --git a/fannie/install/sql/trans/PendingSpecialOrder.php b/fannie/install/sql/trans/PendingSpecialOrder.php new file mode 100644 index 000000000..d6d6a2290 --- /dev/null +++ b/fannie/install/sql/trans/PendingSpecialOrder.php @@ -0,0 +1,108 @@ + diff --git a/fannie/install/sql/trans/SpecialOrderContact.php b/fannie/install/sql/trans/SpecialOrderContact.php new file mode 100644 index 000000000..8b5e11490 --- /dev/null +++ b/fannie/install/sql/trans/SpecialOrderContact.php @@ -0,0 +1,63 @@ + diff --git a/fannie/install/sql/trans/SpecialOrderDeptMap.php b/fannie/install/sql/trans/SpecialOrderDeptMap.php new file mode 100644 index 000000000..05cd94ba3 --- /dev/null +++ b/fannie/install/sql/trans/SpecialOrderDeptMap.php @@ -0,0 +1,23 @@ + diff --git a/fannie/install/sql/trans/SpecialOrderHistory.php b/fannie/install/sql/trans/SpecialOrderHistory.php new file mode 100644 index 000000000..22261b0ce --- /dev/null +++ b/fannie/install/sql/trans/SpecialOrderHistory.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/trans/SpecialOrderID.php b/fannie/install/sql/trans/SpecialOrderID.php new file mode 100644 index 000000000..a417f1a09 --- /dev/null +++ b/fannie/install/sql/trans/SpecialOrderID.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/sql/trans/SpecialOrderNotes.php b/fannie/install/sql/trans/SpecialOrderNotes.php new file mode 100644 index 000000000..4eda13282 --- /dev/null +++ b/fannie/install/sql/trans/SpecialOrderNotes.php @@ -0,0 +1,31 @@ + diff --git a/fannie/install/sql/trans/SpecialOrderStatus.php b/fannie/install/sql/trans/SpecialOrderStatus.php new file mode 100644 index 000000000..4d20ec278 --- /dev/null +++ b/fannie/install/sql/trans/SpecialOrderStatus.php @@ -0,0 +1,31 @@ + diff --git a/fannie/install/sql/trans/TenderTapeGeneric.php b/fannie/install/sql/trans/TenderTapeGeneric.php new file mode 100644 index 000000000..ab4c4beb1 --- /dev/null +++ b/fannie/install/sql/trans/TenderTapeGeneric.php @@ -0,0 +1,48 @@ +datediff($con->now(),'tdate')."= 0 + and trans_subtype not in ('0','') + GROUP BY emp_no, register_no, trans_no, + tender_code +"; +?> diff --git a/fannie/install/sql/trans/alog.php b/fannie/install/sql/trans/alog.php new file mode 100644 index 000000000..25973e397 --- /dev/null +++ b/fannie/install/sql/trans/alog.php @@ -0,0 +1,37 @@ + diff --git a/fannie/install/sql/trans/ar_history.php b/fannie/install/sql/trans/ar_history.php new file mode 100644 index 000000000..e0ed74a2c --- /dev/null +++ b/fannie/install/sql/trans/ar_history.php @@ -0,0 +1,54 @@ + diff --git a/fannie/install/sql/trans/ar_history_backup.php b/fannie/install/sql/trans/ar_history_backup.php new file mode 100644 index 000000000..59c5978d1 --- /dev/null +++ b/fannie/install/sql/trans/ar_history_backup.php @@ -0,0 +1,46 @@ + diff --git a/fannie/install/sql/trans/ar_history_sum.php b/fannie/install/sql/trans/ar_history_sum.php new file mode 100644 index 000000000..b8dd88b34 --- /dev/null +++ b/fannie/install/sql/trans/ar_history_sum.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/trans/ar_history_today.php b/fannie/install/sql/trans/ar_history_today.php new file mode 100644 index 000000000..376048d35 --- /dev/null +++ b/fannie/install/sql/trans/ar_history_today.php @@ -0,0 +1,47 @@ +datediff($con->now(),'tdate')."=0 + GROUP BY card_no,trans_num +"; + +?> diff --git a/fannie/install/sql/trans/ar_history_today_sum.php b/fannie/install/sql/trans/ar_history_today_sum.php new file mode 100644 index 000000000..21d97cf4a --- /dev/null +++ b/fannie/install/sql/trans/ar_history_today_sum.php @@ -0,0 +1,35 @@ +datediff($con->now(),'tdate')."=0 + GROUP BY card_no +"; + +?> diff --git a/fannie/install/sql/trans/ar_live_balance.php b/fannie/install/sql/trans/ar_live_balance.php new file mode 100644 index 000000000..4120255a1 --- /dev/null +++ b/fannie/install/sql/trans/ar_live_balance.php @@ -0,0 +1,47 @@ +table_exists("ar_history_today_sum")) + $CREATE['trans.ar_live_balance'] = "SELECT 1"; +?> diff --git a/fannie/install/sql/trans/ccReceiptView.php b/fannie/install/sql/trans/ccReceiptView.php new file mode 100644 index 000000000..f26be7aa3 --- /dev/null +++ b/fannie/install/sql/trans/ccReceiptView.php @@ -0,0 +1,84 @@ + diff --git a/fannie/install/sql/trans/checkOver.php b/fannie/install/sql/trans/checkOver.php new file mode 100644 index 000000000..b3b04fa88 --- /dev/null +++ b/fannie/install/sql/trans/checkOver.php @@ -0,0 +1,20 @@ + 0 +"; +?> diff --git a/fannie/install/sql/trans/dddItems.php b/fannie/install/sql/trans/dddItems.php new file mode 100644 index 000000000..7f17f8b30 --- /dev/null +++ b/fannie/install/sql/trans/dddItems.php @@ -0,0 +1,78 @@ + 9999 + AND register_no <> 99 + and ".$con->datediff($con->now(),'datetime')."=0 + GROUP BY + year(datetime), + month(datetime), + day(datetime), + d.upc,d.description, + e.dept_no,e.dept_name + + union all + + SELECT + year(datetime) as year, + month(datetime) as month, + day(datetime) as day, + d.upc,d.description, + e.dept_no,e.dept_name, + sum(d.quantity) as quantity, + sum(d.total) as total + FROM + transarchive as d + LEFT JOIN {$names['op']}.departments as e + ON d.department=e.dept_no + WHERE trans_status='Z' + AND trans_type in ('D','I') + AND trans_subtype = '' + AND emp_no <> 9999 + AND register_no <> 99 + GROUP BY + year(datetime), + month(datetime), + day(datetime), + d.upc,d.description, + e.dept_no,e.dept_name +"; +?> diff --git a/fannie/install/sql/trans/dheader.php b/fannie/install/sql/trans/dheader.php new file mode 100644 index 000000000..f98e91309 --- /dev/null +++ b/fannie/install/sql/trans/dheader.php @@ -0,0 +1,60 @@ +seconddiff('min(tdate)','max(tdate)')." as time, + 0 as rings_per_min, + 0 as rings_per_total, + 0 as timeon, + 0 as points_earned, + 1 as uploaded, + 0 as points_used, + trans_num + from dlog_90_view + group by trans_num,emp_no, register_no, trans_no, card_no +"; +?> diff --git a/fannie/install/sql/trans/dlog.php b/fannie/install/sql/trans/dlog.php new file mode 100644 index 000000000..5cbf0b636 --- /dev/null +++ b/fannie/install/sql/trans/dlog.php @@ -0,0 +1,70 @@ +concat( + $con->convert('emp_no','char'),"'-'", + $con->convert('register_no','char'),"'-'", + $con->convert('trans_no','char'),'') + ." as trans_num + FROM dtransactions + WHERE trans_status NOT IN ('D','X','Z') + AND emp_no <> 9999 and register_no <> 99 +"; +?> diff --git a/fannie/install/sql/trans/dlog_15.php b/fannie/install/sql/trans/dlog_15.php new file mode 100644 index 000000000..9a2902105 --- /dev/null +++ b/fannie/install/sql/trans/dlog_15.php @@ -0,0 +1,96 @@ + diff --git a/fannie/install/sql/trans/dlog_90_view.php b/fannie/install/sql/trans/dlog_90_view.php new file mode 100644 index 000000000..71a1e8b30 --- /dev/null +++ b/fannie/install/sql/trans/dlog_90_view.php @@ -0,0 +1,71 @@ +concat( + $con->convert('emp_no','char'),"'-'", + $con->convert('register_no','char'),"'-'", + $con->convert('trans_no','char'),'') + ." as trans_num + FROM transarchive + WHERE trans_status NOT IN ('D','X','Z') + AND emp_no <> 9999 and register_no <> 99 +"; +?> diff --git a/fannie/install/sql/trans/dtransactions.php b/fannie/install/sql/trans/dtransactions.php new file mode 100644 index 000000000..007d4cfcf --- /dev/null +++ b/fannie/install/sql/trans/dtransactions.php @@ -0,0 +1,284 @@ + normally a product identified by upc, but + can also be a discount line (upc='DISCOUNT') + or a YOU SAVED line (upc='0'). + A => tax total line + C => a commentary line. These generally exist + only for generating the on-screen display + at the register (subtotal lines, etc). + D => open ring to a department. In this case, + upc will be the amount, 'DP', and the + department number + T => tender record. UPC is generally, but not + always, '0' (e.g., manufacturer coupons + have their own UPCs) + 0 => another commentary line + +trans_subtype refines the record's type. Values include +(but may not be limited to at all co-ops): + CM => record is a cashier-written comment. + Used to make notes on a transaction + (tender code) => goes with trans_type 'T', + exact values depends what's + in core_op.tenders + 0 => no refinement available for this trans_type + blank => no refinement available for this trans_type + +trans_status is a fairly all-purpose indicator. Values include +(but may not be limited to at all co-ops): + X => the transaction is canceled + D => this can be omitted with back-end reporting + R => this line is a refund + V => this line is a void + M => this line is a member special discount + C => this line is a coupon + Z => this item was damaged, not sold (WFC) + 0 => no particular meaning + blank => no particular meaning + +department is set for a UPC item, an open-department ring, +a member special discount, or a manufacturer coupon. All +other lines have zero here. + +quantity and ItemQtty are the number of items sold on +that line. These can be fractional for by-weight items. +These values are normally the same, except for: + 1. member special lines, where ItemQtty is always zero. + This is useful for tracking actual movement by UPC + 2. refund lines, where quantity is negative and ItemQtty + is not. No idea what the reasoning was here. + +scale indicates an item sold by-weight. Meaningless on +non-item records. + +cost indicates an item's cost. Meaningless on non-item +records. + +unitPrice is the price a customer will be charged per item. +total is quantity times unitPrice. This is what the +customer actually pays. If an item is on sale, regPrice +indicates the regular price per item. On non-item records, +total is usually the only relevant column. Sales are +positive, voids/refunds/tenders are negative. + +tax indicates whether to tax an item and at what rate + +foodstamp indicates whether an item can be paid for +using foodstamps + +discount is any per-item discount that was applied. +In the simplest case, this is the regularPrice +minus the unitPrice (times quantity). Discounts are +listed as positive values. + +memDiscount is the same as discount, but these +discounts are only applied if the customer is a +member (custdata.Type = 'PC') + +discountable indicates whether an item is eligible +for transaction-wide percent discounts. + +discounttype indicates what type of sale an item +is on. + 0 => not on sale + 1 => on sale for everyone + 2 => on sale for members +Values over 2 may be used, but aren't used +consistently across co-ops at this time. + +voided indicates whether a line has been voided + 0 => no + 1 => yes +voided is also used as a status flag in some cases +You'd have to dig into IT CORE code a bit to get a +handle on that. + +percentDiscount is a percentage discount applied to +the whole transaction. This is an integer, so +5 = 5% = 0.05 + +volDiscType is a volume discount type. Usage varies +a lot here, but in general: + volDiscType => core_op.products.pricemethod + volume => core_op.products.quantity + VolSpecial => core_op.products.groupprice +If an item is on sale, those become specialpricemethod, +specialquantity, and specialgroupprice (respectively). +Exact calculations depend a lot of volDiscType. 0 means +there is no volume discount, and either 1 or 2 (depending +on IT CORE version) will probably do a simple 3 for $2 style +sale (quantity=3, groupprice=2.00). Higher type values +vary. + +mixMatch relates to volume pricing. In general, items +with the same mixMatch setting are interchangeable. This +is so you can do sales across a set of products (e.g., Clif +Bars) and the customer can buy various flavors but still +get the discount. + +matched notes item quantites that have already been used +for a volume pricing group. This is so the same item doesn't +get counted more than once. + +memType and staff match values in core_op.custdata. Including +them here helps determine membership status at the time of +purchase as opposed to current status. + +numflag and charflag are generic status indicators. As far +as I know, there's no uniform usage across implementations. + +card_no is the customer number from core_op.custdata. +*/ +$CREATE['trans.dtransactions'] = " + CREATE TABLE dtransactions ( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(13) default NULL, + `description` varchar(30) default NULL, + `trans_type` varchar(1) default NULL, + `trans_subtype` varchar(2) default NULL, + `trans_status` varchar(1) default NULL, + `department` smallint(6) default NULL, + `quantity` double default NULL, + `scale` tinyint(4) default NULL, + `cost` decimal(10,2) default 0.00 NULL, + `unitPrice` decimal(10,2) default NULL, + `total` decimal(10,2) default NULL, + `regPrice` decimal(10,2) default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` decimal(10,2) default NULL, + `memDiscount` decimal(10,2) default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` double default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` decimal(10,2) default NULL, + `mixMatch` varchar(13) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` int(11) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` int(11) default NULL, + `trans_id` int(11) default NULL, + INDEX(`datetime`), + INDEX(`upc`), + INDEX(`department`), + INDEX(`card_no`), + INDEX(`trans_type`) + ) +"; + +if ($dbms == "MSSQL"){ + $CREATE['trans.dtransactions'] = " + CREATE TABLE dtransactions ([datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [cost] [money] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [isStaff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL + ) + "; +} +?> diff --git a/fannie/install/sql/trans/efsnetRequest.php b/fannie/install/sql/trans/efsnetRequest.php new file mode 100644 index 000000000..e60802d1a --- /dev/null +++ b/fannie/install/sql/trans/efsnetRequest.php @@ -0,0 +1,80 @@ + diff --git a/fannie/install/sql/trans/efsnetRequestMod.php b/fannie/install/sql/trans/efsnetRequestMod.php new file mode 100644 index 000000000..65d52f0d3 --- /dev/null +++ b/fannie/install/sql/trans/efsnetRequestMod.php @@ -0,0 +1,79 @@ + diff --git a/fannie/install/sql/trans/efsnetResponse.php b/fannie/install/sql/trans/efsnetResponse.php new file mode 100644 index 000000000..dc1ac603e --- /dev/null +++ b/fannie/install/sql/trans/efsnetResponse.php @@ -0,0 +1,69 @@ + diff --git a/fannie/install/sql/trans/efsnetTokens.php b/fannie/install/sql/trans/efsnetTokens.php new file mode 100644 index 000000000..038c0240c --- /dev/null +++ b/fannie/install/sql/trans/efsnetTokens.php @@ -0,0 +1,41 @@ + diff --git a/fannie/install/sql/trans/houseCouponThisMonth.php b/fannie/install/sql/trans/houseCouponThisMonth.php new file mode 100644 index 000000000..bb79489ba --- /dev/null +++ b/fannie/install/sql/trans/houseCouponThisMonth.php @@ -0,0 +1,24 @@ +monthdiff($con->now(),'tdate')."=0 + GROUP BY card_no,upc +"; +?> diff --git a/fannie/install/sql/trans/lane_config.php b/fannie/install/sql/trans/lane_config.php new file mode 100644 index 000000000..8b30e31ea --- /dev/null +++ b/fannie/install/sql/trans/lane_config.php @@ -0,0 +1,25 @@ + diff --git a/fannie/install/sql/trans/memChargeBalance.php b/fannie/install/sql/trans/memChargeBalance.php new file mode 100644 index 000000000..ee4bddeba --- /dev/null +++ b/fannie/install/sql/trans/memChargeBalance.php @@ -0,0 +1,51 @@ + .v.dlog) + +Depended on by: + newBalanceToday_cust + +Use: +This view lists real-time store charge + balances by membership. +This view gets pushed to the lanes as a table + to speed things up +The "mark" column indicates an account + whose balance has changed today + +*/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 24Oct12 EL Fix ... + * 24Oct2012 Eric Lee Comments, add Depended on by: + * Code style. + +*/ + +$names = qualified_names(); + +$CREATE['trans.memChargeBalance'] = " + CREATE VIEW memChargeBalance as + SELECT c.CardNo, + (CASE when a.balance is NULL then c.memDiscountLimit + ELSE c.memDiscountLimit - a.balance END) as availBal, + (CASE when a.balance is NULL then 0 ELSE a.balance END) as balance, + CASE WHEN a.mark IS NULL THEN 0 ELSE a.mark END AS mark + FROM {$names['op']}.custdata as c left join ar_live_balance as a ON c.CardNo = a.card_no + where c.personNum = 1 +"; + +if (!$con->table_exists("ar_live_balance")) + $CREATE['trans.memChargeBalance'] = "SELECT 1"; +?> diff --git a/fannie/install/sql/trans/memIouToday.php b/fannie/install/sql/trans/memIouToday.php new file mode 100644 index 000000000..9c4e9ff27 --- /dev/null +++ b/fannie/install/sql/trans/memIouToday.php @@ -0,0 +1,38 @@ +datediff($con->now(),'tdate')." = 0 + AND (trans_subtype='MI' OR department IN $dlist) + GROUP BY card_no +"; + +if (empty($dlist)){ + $CREATE['trans.memIouToday'] = "CREATE VIEW memIouToday AS + SELECT 1 as card_no,0 as charges, 0 as payments"; +} + +?> diff --git a/fannie/install/sql/trans/newBalanceStockToday_test.php b/fannie/install/sql/trans/newBalanceStockToday_test.php new file mode 100644 index 000000000..70bb16213 --- /dev/null +++ b/fannie/install/sql/trans/newBalanceStockToday_test.php @@ -0,0 +1,44 @@ +table_exists("stockSumToday")) + $CREATE['trans.newBalanceStockToday_test'] = "SELECT 1"; diff --git a/fannie/install/sql/trans/newBalanceToday_cust.php b/fannie/install/sql/trans/newBalanceToday_cust.php new file mode 100644 index 000000000..c007a4b35 --- /dev/null +++ b/fannie/install/sql/trans/newBalanceToday_cust.php @@ -0,0 +1,53 @@ + v.dlog) + +Use: +This view lists real-time store charge +balances by membership. There are some +extraneous columns here for historical +reasons; "balance" is the column of +interest. + +*/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 24Oct2012 Eric Lee Comments, add to Depends on:, format code. + +*/ + +$names = qualified_names(); + +$CREATE['trans.newBalanceToday_cust'] = " + CREATE VIEW newBalanceToday_cust AS + SELECT + b.CardNo AS memnum, + 0 AS discounttype, + c.Balance AS ARCurrBalance, + (CASE WHEN a.charges IS NULL THEN 0 ELSE a.charges END) AS totcharges, + (CASE WHEN a.payments IS NULL THEN 0 ELSE a.payments END) AS totpayments, + (CASE when a.card_no IS NULL THEN c.Balance ELSE (c.Balance - a.charges - a.payments)END) AS balance, + (CASE WHEN a.card_no IS NULL THEN 0 ELSE 1 END) AS mark + FROM + {$names['op']}.custdata as b left join + ar_history_sum as c on b.CardNo=c.card_no and b.personNum=1 + left outer join memIouToday as a ON c.card_no = a.card_no and b.personNum=1 + where b.personNum=1 +"; + +if (!$con->table_exists("memIouToday")) + $CREATE['trans.newBalanceStockToday_cust'] = "SELECT 1"; +?> diff --git a/fannie/install/sql/trans/rp_dt_receipt_90.php b/fannie/install/sql/trans/rp_dt_receipt_90.php new file mode 100644 index 000000000..ab31ab015 --- /dev/null +++ b/fannie/install/sql/trans/rp_dt_receipt_90.php @@ -0,0 +1,139 @@ + 0 and quantity <> 0 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char), ' @ ', convert(Volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char), ' /', convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num + from transarchive + where voided <> 5 and upc <> 'TAX' and upc <> 'DISCOUNT' + "; + +if ($dbms == "MSSQL"){ + $CREATE['trans.rp_dt_receipt_90'] = " + CREATE view rp_dt_receipt_90 as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num + from transarchive + where voided <> 5 and upc <> 'TAX' and upc <> 'DISCOUNT' + "; +} +?> + +} diff --git a/fannie/install/sql/trans/rp_receipt_header_90.php b/fannie/install/sql/trans/rp_receipt_header_90.php new file mode 100644 index 000000000..26836e6e9 --- /dev/null +++ b/fannie/install/sql/trans/rp_receipt_header_90.php @@ -0,0 +1,69 @@ + diff --git a/fannie/install/sql/trans/stockSumToday.php b/fannie/install/sql/trans/stockSumToday.php new file mode 100644 index 000000000..6f2f7c787 --- /dev/null +++ b/fannie/install/sql/trans/stockSumToday.php @@ -0,0 +1,33 @@ +datediff($con->now(),'tdate')." = 0 + AND department IN $dlist + GROUP BY card_no +"; diff --git a/fannie/install/sql/trans/stockSum_purch.php b/fannie/install/sql/trans/stockSum_purch.php new file mode 100644 index 000000000..fbaff4648 --- /dev/null +++ b/fannie/install/sql/trans/stockSum_purch.php @@ -0,0 +1,26 @@ + diff --git a/fannie/install/sql/trans/stockpurchases.php b/fannie/install/sql/trans/stockpurchases.php new file mode 100644 index 000000000..4a478d972 --- /dev/null +++ b/fannie/install/sql/trans/stockpurchases.php @@ -0,0 +1,34 @@ + diff --git a/fannie/install/sql/trans/suspended.php b/fannie/install/sql/trans/suspended.php new file mode 100644 index 000000000..df14e89f9 --- /dev/null +++ b/fannie/install/sql/trans/suspended.php @@ -0,0 +1,23 @@ + diff --git a/fannie/install/sql/trans/suspendedtoday.php b/fannie/install/sql/trans/suspendedtoday.php new file mode 100644 index 000000000..468d49e80 --- /dev/null +++ b/fannie/install/sql/trans/suspendedtoday.php @@ -0,0 +1,25 @@ +datediff($con->now(),'datetime')." = 0 +"; +?> diff --git a/fannie/install/sql/trans/transarchive.php b/fannie/install/sql/trans/transarchive.php new file mode 100644 index 000000000..7e7ab189b --- /dev/null +++ b/fannie/install/sql/trans/transarchive.php @@ -0,0 +1,32 @@ + diff --git a/fannie/install/sql/trans/unpaid_ar_balances.php b/fannie/install/sql/trans/unpaid_ar_balances.php new file mode 100644 index 000000000..55b6323d8 --- /dev/null +++ b/fannie/install/sql/trans/unpaid_ar_balances.php @@ -0,0 +1,46 @@ +datediff('tdate',$con->now())." < -20 + AND card_no NOT BETWEEN 5000 AND 6099 + THEN (charges - payments) + ELSE 0 END) AS old_balance, + SUM(CASE WHEN ".$con->datediff('tdate',$con->now())." >= -20 + THEN payments ELSE 0 END) AS recent_payments + FROM ar_history + WHERE card_no <> 11 + GROUP by card_no +"; +?> diff --git a/fannie/install/sql/trans/unpaid_ar_today.php b/fannie/install/sql/trans/unpaid_ar_today.php new file mode 100644 index 000000000..ebd239af3 --- /dev/null +++ b/fannie/install/sql/trans/unpaid_ar_today.php @@ -0,0 +1,51 @@ +table_exists("ar_history_today_sum")) + $CREATE['trans.unpaid_ar_today'] = "SELECT 1"; +?> diff --git a/fannie/install/sql/trans/valutecRequest.php b/fannie/install/sql/trans/valutecRequest.php new file mode 100644 index 000000000..05c953bec --- /dev/null +++ b/fannie/install/sql/trans/valutecRequest.php @@ -0,0 +1,69 @@ + diff --git a/fannie/install/sql/trans/valutecRequestMod.php b/fannie/install/sql/trans/valutecRequestMod.php new file mode 100644 index 000000000..7b4b6e0f9 --- /dev/null +++ b/fannie/install/sql/trans/valutecRequestMod.php @@ -0,0 +1,73 @@ + diff --git a/fannie/install/sql/trans/valutecResponse.php b/fannie/install/sql/trans/valutecResponse.php new file mode 100644 index 000000000..dbac731f0 --- /dev/null +++ b/fannie/install/sql/trans/valutecResponse.php @@ -0,0 +1,67 @@ + diff --git a/fannie/install/sql/trans/voidTransHistory.php b/fannie/install/sql/trans/voidTransHistory.php new file mode 100644 index 000000000..170bfebc9 --- /dev/null +++ b/fannie/install/sql/trans/voidTransHistory.php @@ -0,0 +1,28 @@ + diff --git a/fannie/install/stores.php b/fannie/install/stores.php new file mode 100644 index 000000000..320dbfc32 --- /dev/null +++ b/fannie/install/stores.php @@ -0,0 +1,169 @@ + + + +Fannie: Store Settings + + + + + +
        +

        Fannie: Store Settings

        +

        As of 11Apr2013 these settings are not widely or well supported.

        +config.php is writeable"; +} +else { + echo "Error: config.php is not writeable"; +} +?> + +
        +Stores +

        Store ID: +"; +?> +   By convention store id #0 is HQ. +

        + + +Other Stores: +"; +?> +
        + + + +"; +for($i=0; $i<$FANNIE_NUM_STORES;$i++){ + echo ""; +} +echo "
        "; + +$conf = 'array('; +for($i=0; $i<$FANNIE_NUM_STORES; $i++){ + $style = ($i == 0)?'block':'none'; + echo "
        "; + if (!isset($FANNIE_STORES[$i])) $FANNIE_STORES[$i] = array(); + $conf .= 'array('; + + if (!isset($FANNIE_STORES[$i]['host'])) $FANNIE_STORES[$i]['host'] = '127.0.0.1'; + if (isset($_REQUEST["STORE_HOST_$i"])){ $FANNIE_STORES[$i]['host'] = $_REQUEST["STORE_HOST_$i"]; } + $conf .= "'host'=>'{$FANNIE_STORES[$i]['host']}',"; + echo "Store ".($i+1)." Database Host:
        "; + + if (!isset($FANNIE_STORES[$i]['type'])) $FANNIE_STORES[$i]['type'] = 'MYSQL'; + if (isset($_REQUEST["STORE_TYPE_$i"])) $FANNIE_STORES[$i]['type'] = $_REQUEST["STORE_TYPE_$i"]; + $conf .= "'type'=>'{$FANNIE_STORES[$i]['type']}',"; + echo "Store ".($i+1)." Database Type:
        "; + + if (!isset($FANNIE_STORES[$i]['user'])) $FANNIE_STORES[$i]['user'] = 'root'; + if (isset($_REQUEST["STORE_USER_$i"])) $FANNIE_STORES[$i]['user'] = $_REQUEST["STORE_USER_$i"]; + $conf .= "'user'=>'{$FANNIE_STORES[$i]['user']}',"; + echo "Store ".($i+1)." Database Username:
        "; + + if (!isset($FANNIE_STORES[$i]['pw'])) $FANNIE_STORES[$i]['pw'] = ''; + if (isset($_REQUEST["STORE_PW_$i"])) $FANNIE_STORES[$i]['pw'] = $_REQUEST["STORE_PW_$i"]; + $conf .= "'pw'=>'{$FANNIE_STORES[$i]['pw']}',"; + echo "Store ".($i+1)." Database Password:
        "; + + if (!isset($FANNIE_STORES[$i]['op'])) $FANNIE_STORES[$i]['op'] = 'core_op'; + if (isset($_REQUEST["STORE_OP_$i"])) $FANNIE_STORES[$i]['op'] = $_REQUEST["STORE_OP_$i"]; + $conf .= "'op'=>'{$FANNIE_STORES[$i]['op']}',"; + echo "Store ".($i+1)." Operational DB:
        "; + + if (!isset($FANNIE_STORES[$i]['trans'])) $FANNIE_STORES[$i]['trans'] = 'core_trans'; + if (isset($_REQUEST["STORE_TRANS_$i"])) $FANNIE_STORES[$i]['trans'] = $_REQUEST["STORE_TRANS_$i"]; + $conf .= "'trans'=>'{$FANNIE_STORES[$i]['trans']}'"; + echo "Store ".($i+1)." Transaction DB:
        "; + + $conf .= ")"; + echo "
        "; + + if ($i == $FANNIE_NUM_STORES - 1) + $conf .= ")"; + else + $conf .= ","; +} +confset('FANNIE_STORES',$conf); +} + +?> + + + +
        + +
        diff --git a/fannie/install/update.php b/fannie/install/update.php new file mode 100644 index 000000000..a5c03cffb --- /dev/null +++ b/fannie/install/update.php @@ -0,0 +1,168 @@ + + + +Fannie: Database Updates + + + + + +

        Fannie Database Updates

        +

        Click a link for details on the Update.

        +Back'; + exit; + } + $file_name = "updates/$updateID.php"; + $class_name = "update_$updateID"; + if (!file_exists($file_name)){ + echo 'Update not found!'; + echo 'Back'; + exit; + } + include($file_name); + if (!class_exists($class_name)){ + echo 'Update is malformed!'; + echo 'Back'; + exit; + } + $obj = new $class_name(); + echo $obj->HtmlInfo(); + if ($action=='mark') + $obj->SetStatus(True); + if ($action=='unmark') + $obj->SetStatus(False); + if (!$obj->CheckStatus()){ + printf('Apply Update
        ',$updateID); + printf('Mark Update Complete
        ',$updateID); + } else { + printf('Un-mark Update (so it can be run again)
        ',$updateID); + } + echo 'Back to List of Updates'; + echo "
        "; + echo "Query details:
        "; + echo $obj->HtmlQueries(); + + break; + case 'apply': + if (empty($updateID)){ + echo 'No update specified!'; + echo 'Back'; + exit; + } + $file_name = "updates/$updateID.php"; + $class_name = "update_$updateID"; + if (!file_exists($file_name)){ + echo 'Update not found!'; + echo 'Back'; + exit; + } + include($file_name); + if (!class_exists($class_name)){ + echo 'Update is malformed!'; + echo 'Back'; + exit; + } + $obj = new $class_name(); + echo $obj->ApplyUpdates(); + echo '
        '; + echo "If the queries all succeeded, this update is automatically marked complete. +If not, you can make corrections in your database and refresh this page to try again or just make +alterations directly"; + echo '

        '; + if ( !$obj->CheckStatus() ) { + printf('Manually Mark Update $updateID Complete
        ',$updateID); + } else { + echo "Update $updateID has been Marked Complete.
        "; + printf('Un-mark Update (so it can be run again)
        ',$updateID); + } + echo 'Back to List of Updates'; + break; + case 'list': + // find update files + $dh = opendir('updates'); + $updates = array(); + while ( ($file=readdir($dh)) !== False ){ + if ($file[0] == ".") continue; + if ($file == "Update.php") continue; + if (!is_file('updates/'.$file)) continue; + if (substr($file,-4) != ".php") continue; + $updates[] = $file; + } + sort($updates); + + // check for new vs. finished and put in separate arrays. + $new = array(); + $done = array(); + foreach($updates as $u){ + $key = substr($u,0,strlen($u)-4); + include('updates/'.$u); + if (!class_exists('update_'.$key)) continue; + $class = "update_$key"; + $obj = new $class(); + if ($obj->CheckStatus()) + $done[] = $key; + else + $new[] = $key; + } + + // display + echo '

        Available Updates

        '; + echo '
          '; + foreach($new as $key){ + printf('
        • %s
        • ', + $key,$key); + } + echo '
        '; + echo '

        Applied Updates

        '; + echo '
          '; + foreach($done as $key){ + printf('
        • %s
        • ', + $key,$key); + } + echo '
        '; + break; + default: + echo 'Action unknown!'; + echo 'Back'; + break; +} + +?> diff --git a/fannie/install/updates/20120412114913.php b/fannie/install/updates/20120412114913.php new file mode 100644 index 000000000..549a48be8 --- /dev/null +++ b/fannie/install/updates/20120412114913.php @@ -0,0 +1,76 @@ + array( + 'ALTER TABLE batchBarcodes ADD PRIMARY KEY (batchID,upc)', + 'ALTER TABLE batchCutPaste ADD PRIMARY KEY (batchID,upc,uid)', + 'ALTER TABLE batchMergeTable ADD PRIMARY KEY (batchID,upc)', + 'ALTER TABLE batchMergeTable ADD INDEX (upc)', + 'ALTER TABLE batchMergeTable ADD INDEX (batchID)', + 'ALTER TABLE batchType ADD PRIMARY KEY (batchTypeID)', + 'ALTER TABLE batchowner ADD PRIMARY KEY (batchID)', + 'ALTER TABLE customReceipt ADD PRIMARY KEY (seq, type)', + 'ALTER TABLE departments ADD PRIMARY KEY (dept_no)', + 'ALTER TABLE deptMargin ADD PRIMARY KEY (dept_ID)', + 'ALTER TABLE houseCouponItems ADD PRIMARY KEY (coupID, upc)', + 'ALTER TABLE houseCouponItems ADD INDEX (coupID)', + 'ALTER TABLE houseCouponItems ADD INDEX (upc)', + 'ALTER TABLE memberCards ADD PRIMARY KEY (card_no)', + 'ALTER TABLE memberCards ADD INDEX (upc)', + 'ALTER TABLE meminfo ADD PRIMARY KEY (card_no)', + 'ALTER TABLE reasoncodes ADD PRIMARY KEY (mask)', + 'ALTER TABLE scaleItems ADD PRIMARY KEY (plu)', + 'ALTER TABLE shelftags ADD PRIMARY KEY (id,upc)', + 'ALTER TABLE shelftags ADD INDEX (upc)', + 'ALTER TABLE shelftags ADD INDEX (id)', + 'ALTER TABLE subdepts ADD PRIMARY KEY (subdept_no)', + 'ALTER TABLE superdepts ADD PRIMARY KEY (superID, dept_ID)', + 'ALTER TABLE superdepts ADD INDEX (superID)', + 'ALTER TABLE superdepts ADD INDEX (dept_ID)', + 'ALTER TABLE suspensions ADD PRIMARY KEY (cardno)', + 'ALTER TABLE tenders ADD PRIMARY KEY (TenderID)', + 'ALTER TABLE tenders ADD INDEX (TenderCode)', + 'ALTER TABLE unfiCategories ADD PRIMARY KEY (categoryID)', + 'ALTER TABLE unfi_order ADD PRIMARY KEY (upcc)', + 'ALTER TABLE upcLike ADD PRIMARY KEY (upc)', + 'ALTER TABLE vendorDepartments ADD PRIMARY KEY (vendorID, deptID)', + 'ALTER TABLE vendorDepartments ADD INDEX (vendorID)', + 'ALTER TABLE vendorDepartments ADD INDEX (deptID)' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20120706093700.php b/fannie/install/updates/20120706093700.php new file mode 100644 index 000000000..e650a7b53 --- /dev/null +++ b/fannie/install/updates/20120706093700.php @@ -0,0 +1,44 @@ + array( + 'ALTER TABLE employees ADD COLUMN birthdate DATETIME' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20120706115700.php b/fannie/install/updates/20120706115700.php new file mode 100644 index 000000000..78113ad87 --- /dev/null +++ b/fannie/install/updates/20120706115700.php @@ -0,0 +1,59 @@ + array(), + 'trans' => array( + "ALTER VIEW TenderTapeGeneric AS + select + max(tdate) as tdate, + emp_no, + register_no, + trans_no, + CASE WHEN trans_subtype = 'CP' AND upc LIKE '%MAD%' THEN '' + WHEN trans_subtype IN ('EF','EC','TA') THEN 'EF' + ELSE trans_subtype + END AS tender_code, + -1 * sum(total) as tender + from dlog + WHERE datediff(curdate(),tdate)=0 + and trans_subtype not in ('0','') + GROUP BY emp_no, register_no, trans_no, + tender_code", + ), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20120713113300.php b/fannie/install/updates/20120713113300.php new file mode 100644 index 000000000..e231fdb1a --- /dev/null +++ b/fannie/install/updates/20120713113300.php @@ -0,0 +1,62 @@ + array(), + 'trans' => array( + 'ALTER TABLE dtransactions CHANGE COLUMN cost cost DECIMAL(10,2)', + 'ALTER TABLE dtransactions CHANGE COLUMN unitPrice unitPrice DECIMAL(10,2)', + 'ALTER TABLE dtransactions CHANGE COLUMN total total DECIMAL(10,2)', + 'ALTER TABLE dtransactions CHANGE COLUMN regPrice regPrice DECIMAL(10,2)', + 'ALTER TABLE dtransactions CHANGE COLUMN discount discount DECIMAL(10,2)', + 'ALTER TABLE dtransactions CHANGE COLUMN memDiscount memDiscount DECIMAL(10,2)', + 'ALTER TABLE dtransactions CHANGE COLUMN VolSpecial VolSpecial DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN cost cost DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN unitPrice unitPrice DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN total total DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN regPrice regPrice DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN discount discount DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN memDiscount memDiscount DECIMAL(10,2)', + 'ALTER TABLE transarchive CHANGE COLUMN VolSpecial VolSpecial DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN cost cost DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN unitPrice unitPrice DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN total total DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN regPrice regPrice DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN discount discount DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN memDiscount memDiscount DECIMAL(10,2)', + 'ALTER TABLE suspended CHANGE COLUMN VolSpecial VolSpecial DECIMAL(10,2)' + ), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20121025095000.php b/fannie/install/updates/20121025095000.php new file mode 100644 index 000000000..e85629f68 --- /dev/null +++ b/fannie/install/updates/20121025095000.php @@ -0,0 +1,50 @@ + array(), + 'trans' => array( + 'DROP VIEW ar_history_sum', + 'DROP TABLE ar_sum_cache', + 'CREATE TABLE ar_history_sum ( + card_no INT, + charges DECIMAL(10,2), + payments DECIMAL(10,2), + balance DECIMAL(10,2), + PRIMARY KEY (card_no) + )' + ), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20121116094200.php b/fannie/install/updates/20121116094200.php new file mode 100644 index 000000000..5f0e003b6 --- /dev/null +++ b/fannie/install/updates/20121116094200.php @@ -0,0 +1,59 @@ + array(), + 'trans' => array( + 'DROP VIEW AR_EOM_Summary', + 'CREATE TABLE AR_EOM_Summary ( + cardno int, + memName varchar(100), + priorBalance decimal(10,2), + threeMonthCharges decimal(10,2), + threeMonthPayments decimal(10,2), + threeMonthBalance decimal(10,2), + twoMonthCharges decimal(10,2), + twoMonthPayments decimal(10,2), + twoMonthBalance decimal(10,2), + lastMonthCharges decimal(10,2), + lastMonthPayments decimal(10,2), + lastMonthBalance decimal(10,2), + PRIMARY KEY (cardno) + )', + 'INSERT INTO AR_EOM_Summary SELECT * FROM AR_EOM_Summary_cache', + 'DROP TABLE AR_EOM_Summary_cache', + ), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20121213000001.php b/fannie/install/updates/20121213000001.php new file mode 100644 index 000000000..4db6e817e --- /dev/null +++ b/fannie/install/updates/20121213000001.php @@ -0,0 +1,48 @@ + array( + 'ALTER TABLE custdata add column + LastChange timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP after Shown, + add index (LastChange)' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20121213000002.php b/fannie/install/updates/20121213000002.php new file mode 100644 index 000000000..008ee2318 --- /dev/null +++ b/fannie/install/updates/20121213000002.php @@ -0,0 +1,108 @@ + array( + 'DROP TRIGGER if exists meminfo_update', + 'CREATE TRIGGER meminfo_update AFTER UPDATE ON meminfo + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists meminfo_insert', + 'CREATE TRIGGER meminfo_insert AFTER INSERT ON meminfo + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists meminfo_delete', + 'CREATE TRIGGER meminfo_delete BEFORE DELETE ON meminfo + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = OLD.card_no', + + 'DROP TRIGGER if exists memberCards_update', + 'CREATE TRIGGER memberCards_update AFTER UPDATE ON memberCards + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists memberCards_insert', + 'CREATE TRIGGER memberCards_insert AFTER INSERT ON memberCards + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists memberCards_delete', + 'CREATE TRIGGER memberCards_delete BEFORE DELETE ON memberCards + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = OLD.card_no', + + 'DROP TRIGGER if exists memContact_update', + 'CREATE TRIGGER memContact_update AFTER UPDATE ON memContact + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists memContact_insert', + 'CREATE TRIGGER memContact_insert AFTER INSERT ON memContact + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists memContact_delete', + 'CREATE TRIGGER memContact_delete BEFORE DELETE ON memContact + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = OLD.card_no', + + 'DROP TRIGGER if exists memDates_update', + 'CREATE TRIGGER memDates_update AFTER UPDATE ON memDates + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists memDates_insert', + 'CREATE TRIGGER memDates_insert AFTER INSERT ON memDates + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = NEW.card_no', + 'DROP TRIGGER if exists memDates_delete', + 'CREATE TRIGGER memDates_delete BEFORE DELETE ON memDates + FOR EACH ROW + UPDATE custdata AS c SET c.LastChange = now() + WHERE c.CardNo = OLD.card_no' + + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130106233554.php b/fannie/install/updates/20130106233554.php new file mode 100644 index 000000000..4ef0a0f08 --- /dev/null +++ b/fannie/install/updates/20130106233554.php @@ -0,0 +1,47 @@ + array( + 'DROP TABLE IF EXISTS memContactPrefs', + 'CREATE TABLE memContactPrefs ( + pref_id int, + pref_description varchar(50), + PRIMARY KEY (pref_id))' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130106233555.php b/fannie/install/updates/20130106233555.php new file mode 100644 index 000000000..27a0d9825 --- /dev/null +++ b/fannie/install/updates/20130106233555.php @@ -0,0 +1,46 @@ + array( + 'TRUNCATE TABLE memContactPrefs', + "INSERT INTO memContactPrefs (pref_id, pref_description) VALUES (0, 'No contact of any kind')", + "INSERT INTO memContactPrefs (pref_id, pref_description) VALUES (1, 'Postal mail only')", + "INSERT INTO memContactPrefs (pref_id, pref_description) VALUES (2, 'Email only')", + "INSERT INTO memContactPrefs (pref_id, pref_description) VALUES (3, 'Either postal mail or email')" + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130107181335.php b/fannie/install/updates/20130107181335.php new file mode 100644 index 000000000..0867cc6c4 --- /dev/null +++ b/fannie/install/updates/20130107181335.php @@ -0,0 +1,43 @@ + array( + 'ALTER TABLE custdata CHANGE COLUMN CardNo CardNo INT(11) NOT NULL' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130107181336.php b/fannie/install/updates/20130107181336.php new file mode 100644 index 000000000..c191cc3ce --- /dev/null +++ b/fannie/install/updates/20130107181336.php @@ -0,0 +1,42 @@ + array( + 'ALTER TABLE meminfo CHANGE COLUMN card_no card_no INT(11)' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130118214805.php b/fannie/install/updates/20130118214805.php new file mode 100644 index 000000000..024a3a2e2 --- /dev/null +++ b/fannie/install/updates/20130118214805.php @@ -0,0 +1,52 @@ +products, productBackup and prodExtra +
        prior to changing the data type of upc in each. +
        If this succeeds run update 20130118214806 to make the data type changes. +
        If that succeeds but you need to restore the leading zeros on upc, run update 20130118214807. +
        When all is well run update 20130118214808 to drop these special backups. +
        These changes were tested under MySQL 5.1'; + + protected $author = 'Eric Lee (WEFC_Toronto)'; + + protected $queries = array( + 'op' => array( + 'CREATE TABLE productBackup_upc LIKE productBackup', + 'INSERT INTO productBackup_upc (SELECT * from productBackup)', + 'CREATE TABLE prodExtra_upc LIKE prodExtra', + 'INSERT INTO prodExtra_upc (SELECT * from prodExtra)', + 'CREATE TABLE products_upc LIKE products', + 'INSERT INTO products_upc (SELECT * from products)' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130118214806.php b/fannie/install/updates/20130118214806.php new file mode 100644 index 000000000..604dcb526 --- /dev/null +++ b/fannie/install/updates/20130118214806.php @@ -0,0 +1,48 @@ +products, productBackup and prodExtra +
        Before you do this back up these tables using update 20130118214805. +
        If the data type change succeeds but you need to restore the leading zeros on upc, run update 20130118214807. +
        When all is well run update 20130118214808 to drop these special backups. +
        These changes were tested under MySQL 5.1'; + + protected $author = 'Eric Lee (WEFC_Toronto)'; + + protected $queries = array( + 'op' => array( + 'ALTER TABLE productBackup CHANGE COLUMN upc upc VARCHAR(13)', + 'ALTER TABLE prodExtra CHANGE COLUMN upc upc VARCHAR(13)', + 'ALTER TABLE products CHANGE COLUMN upc upc VARCHAR(13)' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130118214807.php b/fannie/install/updates/20130118214807.php new file mode 100644 index 000000000..3f03f8f5d --- /dev/null +++ b/fannie/install/updates/20130118214807.php @@ -0,0 +1,48 @@ +products, productBackup and prodExtra +
        and it succeeded but removed the leading zeroes from upc run this update to restore them. +
        When all is well run update 20130118214808 to drop the special backups of +
        products, productBackup and prodExtra that were made by update 20130118214805. +
        These changes were tested under MySQL 5.1'; + + protected $author = 'Eric Lee (WEFC_Toronto)'; + + protected $queries = array( + 'op' => array( + "UPDATE productBackup SET upc = LPAD(upc,13,'0') WHERE CHAR_LENGTH(upc) <> 13", + "UPDATE prodExtra SET upc = LPAD(upc,13,'0') WHERE CHAR_LENGTH(upc) < 13", + "UPDATE products SET upc = LPAD(upc,13,'0') WHERE CHAR_LENGTH(upc) < 13" + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130118214808.php b/fannie/install/updates/20130118214808.php new file mode 100644 index 000000000..3f1fc2abb --- /dev/null +++ b/fannie/install/updates/20130118214808.php @@ -0,0 +1,46 @@ +products, productBackup and prodExtra created by update 20130118214805 +
        to prepare for changing the data type of upc in each. +
        These changes were tested under MySQL 5.1'; + + protected $author = 'Eric Lee (WEFC_Toronto)'; + + protected $queries = array( + 'op' => array( + 'DROP TABLE IF EXISTS productBackup_upc', + 'DROP TABLE IF EXISTS prodExtra_upc', + 'DROP TABLE IF EXISTS products_upc' + ), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130502000001.php b/fannie/install/updates/20130502000001.php new file mode 100644 index 000000000..488eaa296 --- /dev/null +++ b/fannie/install/updates/20130502000001.php @@ -0,0 +1,49 @@ + array(), + 'trans' => array( + 'ALTER TABLE dlog_15 ADD COLUMN memType TINYINT AFTER ItemQtty', + 'ALTER TABLE dlog_15 ADD COLUMN staff TINYINT AFTER memType', + 'ALTER TABLE dlog_15 ADD COLUMN numflag INT AFTER staff', + 'ALTER TABLE dlog_15 ADD COLUMN charflag VARCHAR(2) AFTER numflag', + 'DROP VIEW dlog_90_view' + ), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/20130515144915.php b/fannie/install/updates/20130515144915.php new file mode 100644 index 000000000..2b042fd17 --- /dev/null +++ b/fannie/install/updates/20130515144915.php @@ -0,0 +1,43 @@ + array( + 'ALTER TABLE userSessions DROP PRIMARY KEY', + 'ALTER TABLE userSessions ADD PRIMARY KEY (uid, session_id) USING BTREE'), + 'trans' => array(), + 'archive' => array() + ); +} + +?> diff --git a/fannie/install/updates/Update.php b/fannie/install/updates/Update.php new file mode 100644 index 000000000..acb490dfc --- /dev/null +++ b/fannie/install/updates/Update.php @@ -0,0 +1,158 @@ + array(), + 'trans' => array(), + 'archive' => array() + ); + + public function HtmlInfo(){ + $ret = "

        "; + $ret .= "Update: ".$this->timestamp."
        "; + $ret .= "Author: ".$this->author."
        "; + $ret .= "

        ".$this->description."
        "; + $ret .= "

        "; + return $ret; + } + + public function HtmlQueries(){ + $ret = "
        ";
        +		$ret .= "Op changes\n";
        +		foreach($this->queries['op'] as $q){
        +			$ret .= "\t$q\n\n";
        +		}
        +		$ret .= "Trans changes\n";
        +		foreach($this->queries['trans'] as $q){
        +			$ret .= "\t$q\n\n";
        +		}
        +		$ret .= "Archive changes\n";
        +		foreach($this->queries['archive'] as $q){
        +			$ret .= "\t$q\n\n";
        +		}
        +		$ret .= "
        "; + return $ret; + } + + public function ApplyUpdates(){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB, $FANNIE_ARCHIVE_DB; + $passed = True; + $i = 0; + $ret = "
          "; + ob_start(); + + $db = $this->db(); + foreach ($this->queries['op'] as $q){ + $try = $db->query($q); + if ($try){ + $ret .= sprintf('
        • Query succeeded + +
        • ',$i,$i,$q); + } + else { + $ret .= sprintf('
        • Query failed +
          • %s
          • %s
          +
        • ',$i,$i,$q,$db->error()); + $passed = False; + } + $i++; + } + + $db->query("USE $FANNIE_TRANS_DB"); + foreach ($this->queries['trans'] as $q){ + $try = $db->query($q); + if ($try){ + $ret .= sprintf('
        • Query succeeded + +
        • ',$i,$i,$q); + } + else { + $ret .= sprintf('
        • Query failed +
          • %s
          • %s
          +
        • ',$i,$i,$q,$db->error()); + $passed = False; + } + $i++; + } + + $db->query("USE $FANNIE_ARCHIVE_DB"); + foreach ($this->queries['archive'] as $q){ + $try = $db->query($q); + if ($try){ + $ret .= sprintf('
        • Query succeeded + +
        • ',$i,$i,$q); + } + else { + $ret .= sprintf('
        • Query failed +
          • %s
          • %s
          +
        • ',$i,$i,$q,$db->error()); + $passed = False; + } + $i++; + } + + $ret .= "
        "; + + $suppressedOutput = ob_end_clean(); + + $db->close(); + $this->SetStatus($passed); + return $ret; + } + + public function CheckStatus(){ + $db = $this->db(); + $p = $db->prepare_statement("SELECT status FROM UpdateLog WHERE id=?"); + $r = $db->exec_statement($p,array($this->timestamp)); + $ret = False; + if ($db->num_rows($r) > 0){ + $st = array_pop($db->fetch_row($r)); + $ret = ($st == 1) ? True : False; + } + $db->close(); + return $ret; + } + + public function SetStatus($st){ + $st = ($st==True) ? 1 : 0; + $db = $this->db(); + $p = $db->prepare_statement("DELETE FROM UpdateLog WHERE id=?"); + $r = $db->exec_statement($p,array($this->timestamp)); + $p = $db->prepare_statement("INSERT INTO UpdateLog (id,status,tdate) VALUES (?,?,".$db->now().")"); + $r = $db->exec_statement($p,array($this->timestamp,$st)); + $db->close(); + } + + private function db(){ + global $FANNIE_ROOT; + include($FANNIE_ROOT.'src/mysql_connect.php'); + return $dbc; + } +} + +?> diff --git a/fannie/install/util.php b/fannie/install/util.php new file mode 100644 index 000000000..bc16ce1ec --- /dev/null +++ b/fannie/install/util.php @@ -0,0 +1,234 @@ +") === 0 && $found == False){ + $lines[] = "\$$key = $value;\n"; + $lines[] = "?>\n"; + } + else + $lines[] = $line; + } + fclose($fp); + + $fp = fopen($FILEPATH.'/config.php','w'); + foreach($lines as $line) + fwrite($fp,$line); + fclose($fp); +} + +function db_test_connect($host,$type,$db,$user,$pw){ + global $FANNIE_ROOT; + if (!function_exists("check_db_host")) + include($FANNIE_ROOT.'src/host_up.php'); + if (!check_db_host($host,$type)) + return False; + + if (!class_exists('SQLManager')) + include($FANNIE_ROOT.'src/SQLManager.php'); + $sql = False; + try { + $sql = new SQLManager($host,$type,$db,$user,$pw); + } + catch(Exception $ex) {} + + if ($sql === False || $sql->connections[$db] === False) + return False; + else + return $sql; +} + +function showInstallTabs($current,$path='') { + $ret = ""; + + $ret .= "
          "; + + $installTabs = array( + 'Necessities'=>'InstallIndexPage.php', + 'Authentication' => 'InstallAuthenticationPage.php', + 'Members' => 'InstallMembershipPage.php', + 'Products' => 'InstallProductsPage.php', + 'Stores' => 'InstallStoresPage.php', + 'Updates' => 'InstallUpdatesPage.php', + 'Plugins' => 'InstallPluginsPage.php', + 'Menu' => 'InstallMenuPage.php', + 'Lane Config' => 'LaneConfigPages/LaneNecessitiesPage.php', + 'Sample Data' => 'sample_data/InstallSampleDataPage.php' + ); + + foreach($installTabs as $key => $loc) { + if ( $key == $current ) { + $ret .= "
        • $key
        • "; + } else { + $ret .= "
        • $key
        • "; + } + } + + $ret .= "
        "; + $ret .= "
        "; + + return $ret; + +// showInstallTabs() +} + +function showInstallTabsLane($current,$path='') { + $ret = ""; + + $ret .= "
          "; + + $installTabs = array( + 'Lane Necessities'=>'LaneNecessitiesPage.php', + 'Additional Configuration' => 'LaneAdditionalConfigPage.php', + 'Scanning Options' => 'LaneScanningPage.php', + 'Security' => 'LaneSecurityPage.php', + 'Text Strings' => 'LaneTextStringPage.php' + ); + + /* Original + $installTabs = array( +>>>>>>> flathat/master + 'Lane Necessities'=>'index.php', + 'Additional Configuration' => 'extra_config.php', + 'Scanning Options' => 'scanning.php', + 'Security' => 'security.php', + 'Text Strings' => 'text.php' + ); +<<<<<<< HEAD +======= + */ + + foreach($installTabs as $key => $loc) { + if ( $key == $current ) { + $ret .= "
        • $key
        • "; + } else { + $ret .= "
        • $key
        • "; + } + } + + $ret .= "
        "; + $ret .= "
        "; + + return $ret; + +// showInstallTabsLane() +} + +/* + * Link "up" to home of next higher level of pages. + * See also: showLinkUp(), which takes arguments. +*/ +function showLinkToFannie() { + $key = 'Up to Fannie Config'; + $loc = 'index.php'; + $path = '../'; + $ret = "
          "; + $ret .= "
        • $key
        • "; + $ret .= "
        "; + $ret .= "
        "; + return $ret; +} + +/* Link "up" to higher level of install pages. + * Possibly up the file tree. +*/ +function showLinkUp($label='None',$loc='',$path='') { + if ( substr($path,-2,2) == '..' ) + $path = "{$path}/"; + $ret = "
          "; + $ret .= "
        • $label
        • "; + $ret .= "
        "; + $ret .= "
        "; + return $ret; +} + +/** + Get username for PHP process + @return string username +*/ +function whoami(){ + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + return $chk['name']; + } + else + return get_current_user(); +} + +/** + Check if file exists and is writable by PHP + @param $filename the file + @param $optional boolean file is not required + @param $template string template for creating file + + Known $template values: PHP + + Prints output +*/ +function check_writeable($filename, $optional=False, $template=False){ + $basename = basename($filename); + $failure = ($optional) ? 'blue' : 'red'; + $status = ($optional) ? 'Optional' : 'Warning'; + + if (!file_exists($filename) && !$optional && is_writable($filename)){ + $fp = fopen($filename,'w'); + if ($template !== False){ + switch($template){ + case 'PHP': + fwrite($fp,"\n"); + break; + } + } + fclose($fp); + } + + if (!file_exists($filename)){ + echo "$status: $basename does not exist
        "; + if (!$optional){ + echo "Advice:
        + touch \"".realpath(dirname($filename))."/".basename($filename)."\"
        + chown ".whoami()." \"".realpath(dirname($filename))."/".basename($filename)."\"
        "; + } + } + elseif (is_writable($filename)) + echo "$basename is writeable
        "; + else { + echo "Warning: $basename is not writeable
        "; + echo "Advice:
        + chown ".whoami()." \"".realpath(dirname($filename))."/".basename($filename)."\"
        + chmod 600 \"".realpath(dirname($filename))."/".basename($filename)."\"
        "; + } +} + +?> diff --git a/fannie/item/ItemEditorPage.php b/fannie/item/ItemEditorPage.php new file mode 100644 index 000000000..ad80e3c92 --- /dev/null +++ b/fannie/item/ItemEditorPage.php @@ -0,0 +1,338 @@ +title = 'Fannie - Item Maintanence'; + $this->header = 'Item Maintanence'; + + if (FormLib::get_form_value('searchupc') !== ''){ + $this->mode = 'search_results'; + } + + if (FormLib::get_form_value('createBtn') !== ''){ + $this->msgs = $this->save_item(True); + } + elseif (FormLib::get_form_value('updateBtn') !== ''){ + $this->msgs = $this->save_item(False); + } + + return True; + } + + function body_content(){ + switch($this->mode){ + case 'search_results': + return $this->search_results(); + case 'search': + default: + return $this->search_form(); + } + } + + function search_form(){ + $ret = ''; + if (!empty($this->msgs)){ + $ret .= '
        '; + $ret .= $this->msgs; + $ret .= '
        '; + } + $ret .= '
        '; + $ret .= ' Enter + or product name here
        '; + + $ret .= ' '; + $ret .= '
        '; + + $this->add_onload_command('$(\'#upc\').focus();'); + + return $ret; + } + + function search_results(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $upc = FormLib::get_form_value('searchupc'); + $numType = FormLib::get_form_value('ntype','UPC'); + + $query = ""; + $args = array(); + if (is_numeric($upc)){ + switch($numType){ + case 'SKU': + $query = "SELECT p.*,x.distributor,x.manufacturer + FROM products as p inner join + vendorItems as v ON p.upc=v.upc + left join prodExtra as x on p.upc=x.upc + WHERE v.sku LIKE ?"; + $args[] = '%'.$upc; + break; + case 'Brand Prefix': + $query = "SELECT p.*,x.distributor,x.manufacturer + FROM products as p left join + prodExtra as x on p.upc=x.upc + WHERE p.upc like ? + ORDER BY p.upc"; + $args[] = '%'.$upc.'%'; + break; + case 'UPC': + default: + $upc = str_pad($upc,13,0,STR_PAD_LEFT); + $query = "SELECT p.*,x.distributor,x.manufacturer + FROM products as p left join + prodExtra as x on p.upc=x.upc + WHERE p.upc = ? + ORDER BY p.description"; + $args[] = $upc; + break; + } + } + else { + $query = "SELECT p.*,x.distributor,x.manufacturer + FROM products AS p LEFT JOIN + prodExtra AS x ON p.upc=x.upc + WHERE description LIKE ? + ORDER BY description"; + $args[] = '%'.$upc.'%'; + } + + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($query,$args); + + /** + Query somehow failed. Unlikely. Show error and search box again. + */ + if ($result === False){ + $this->msgs = 'Error searching for: '.$upc; + return $this->search_form(); + } + + $num = $dbc->num_rows($result); + + /** + No match for text input. Can't create a new item w/o numeric UPC, + so show error and search box again. + */ + if ($num == 0 && !is_numeric($upc)){ + $this->msgs = 'Error searching for: '.$upc; + return $this->search_form(); + } + + /** + List multiple results + */ + if ($num > 1){ + $items = array(); + while($row = $dbc->fetch_row($result)){ + $items[$row['upc']] = $row['description']; + } + return $this->multiple_results($items); + } + + /** + Only remaining possibility is a new item or + editing an existing item + */ + $actualUPC = ''; + $new = False; + if ($num == 0){ + $actualUPC = str_pad($upc,13,'0',STR_PAD_LEFT); + $new = True; + } + else { + $row = $dbc->fetch_row($result); + $actualUPC = $row['upc']; + } + return $this->edit_form($actualUPC,$new); + } + + function multiple_results($results){ + $ret = ''; + foreach($results as $upc => $description){ + $ret .= sprintf('%s - %s
        ', + $upc, $upc, $description); + } + return $ret; + } + + function edit_form($upc,$isNew){ + global $FANNIE_PRODUCT_MODULES; + $shown = array(); + $ret = '
        '; + + if (in_array('BaseItemModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new BaseItemModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['BaseItemModule'] = True; + } + + if ($isNew){ + $ret .= ''; + } + else { + $ret .= ''; + } + $ret .= '        + Back'; + + if (in_array('ScaleItemModule',$FANNIE_PRODUCT_MODULES)){ + if (substr($upc,0,3) == "002"){ + $mod = new ScaleItemModule(); + $ret .= $mod->ShowEditForm($upc); + } + $shown['ScaleItemModule'] = True; + } + + if (in_array('ExtraInfoModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new ExtraInfoModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['ExtraInfoModule'] = True; + } + + if (in_array('ItemLinksModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new ItemLinksModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['ItemLinksModule'] = True; + } + + if (in_array('LikeCodeModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new LikeCodeModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['LikeCodeModule'] = True; + } + + if (in_array('ItemMarginModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new ItemMarginModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['ItemMarginModule'] = True; + } + + if (in_array('ItemFlagsModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new ItemFlagsModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['ItemFlagsModule'] = True; + } + + if (!$isNew){ + if (in_array('VendorItemModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new VendorItemModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['VendorItemModule'] = True; + } + + if (in_array('AllLanesItemModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new AllLanesItemModule(); + $ret .= $mod->ShowEditForm($upc); + $shown['AllLanesItemModule'] = True; + } + } + + // show any remaining, valid modules + foreach($FANNIE_PRODUCT_MODULES as $mod){ + if ($mod == '') continue; + if (isset($shown[$mod])) continue; + $obj = new $mod(); + $ret .= $mod->ShowEditForm($upc); + } + + $ret .= '
        '; + + $this->add_onload_command('$(\'#price\').focus();'); + + return $ret; + } + + function save_item($isNew){ + global $FANNIE_OP_DB, $FANNIE_PRODUCT_MODULES; + + $upc = FormLib::get_form_value('upc',''); + if ($upc === '' || !is_numeric($upc)){ + return 'Error: bad UPC: '.$upc; + } + + // save base module data first + if (in_array('BaseItemModule',$FANNIE_PRODUCT_MODULES)){ + $mod = new BaseItemModule(); + $mod->SaveFormData($upc); + } + + // save everything else + foreach($FANNIE_PRODUCT_MODULES as $mod){ + if ($mod == '') continue; + if ($mod == 'BaseItemModule') continue; + $obj = new $mod(); + $sfd = $obj->SaveFormData($upc); + } + + /* push updates to the lanes */ + $dbc = FannieDB::get($FANNIE_OP_DB); + updateProductAllLanes($upc); + + $verify = $dbc->prepare_statement('SELECT upc,description,normal_price,department,subdept, + foodstamp,scale,qttyEnforced,discount,inUse,deposit + FROM products WHERE upc = ?'); + $result = $dbc->exec_statement($verify,array($upc)); + $row = $dbc->fetch_array($result); + $ret = ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        UPC".$row['upc']."
        Description{$row['description']}Price\${$row['normal_price']}
        "; + return $ret; + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new ItemEditorPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/item/ItemFlags.php b/fannie/item/ItemFlags.php new file mode 100644 index 000000000..65a93cf83 --- /dev/null +++ b/fannie/item/ItemFlags.php @@ -0,0 +1,138 @@ +title = 'Fannie - Product Flag Maintenance'; + $this->header = 'Product Flag Maintenance'; + $this->msgs = array(); + $db = FannieDB::get($FANNIE_OP_DB); + + if (FormLib::get_form_value('addBtn') !== ''){ + $desc = FormLib::get_form_value('new'); + if (empty($desc)) $this->msgs[] = 'Error: no new description given'; + else { + $bit=1; + $bit_number=1; + $chkP = $db->prepare_statement("SELECT bit_number FROM prodFlags WHERE bit_number=?"); + for($i=0; $i<30; $i++){ + $chkR = $db->exec_statement($chkP,array($bit_number)); + if ($db->num_rows($chkR) == 0) break; + $bit *= 2; + $bit_number++; + } + if ($bit > (1<<30)) $this->msgs[] = 'Error: can\'t add more flags'; + else { + $insP = $db->prepare_statement("INSERT INTO prodFlags + (bit_number, description) VALUES (?,?)"); + $db->exec_statement($insP,array($bit_number,$desc)); + } + } + } + elseif (FormLib::get_form_value('updateBtn') !== ''){ + $ids = FormLib::get_form_value('mask',array()); + $descs = FormLib::get_form_value('desc',array()); + $upP = $db->prepare_statement("UPDATE prodFlags SET description=? WHERE bit_number=?"); + for($i=0;$iexec_statement($upP,array($descs[$i],$ids[$i])); + } + } + } + elseif (FormLib::get_form_value('delBtn') !== ''){ + $ids = FormLib::get_form_value('del',array()); + $delP = $db->prepare_statement("DELETE FROM prodFlags WHERE bit_number=?"); + foreach($ids as $id) + $db->exec_statement($delP,array($id)); + } + + for($i=1; $i<=count($this->msgs); $i++) { + $db->logger($this->msgs[($i-1)]); + } + + return True; + } + + function body_content(){ + global $FANNIE_OP_DB; + global $FANNIE_COOP_ID; + // If there were errors in preprocess(). + if (count($this->msgs) > 0){ + echo '
          '; + foreach($this->msgs as $m) echo '
        • '.$m.'
        • '; + echo '
        '; + } + echo '
        '; + $db = FannieDB::get($FANNIE_OP_DB); + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID = 'WEFC_Toronto' ) { + $q = $db->prepare_statement("SELECT bit_number,description FROM prodFlags ORDER BY bit_number"); + $excelCols = array('','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'); + } else { + $q = $db->prepare_statement("SELECT bit_number,description FROM prodFlags ORDER BY description"); + } + $r = $db->exec_statement($q); + echo 'Current Flags:
        '; + echo ''; + while($w = $db->fetch_row($r)){ + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID = 'WEFC_Toronto' ) { + printf(' + + ', + $w['bit_number'],($w['bit_number'] <= count($excelCols))?$excelCols[$w['bit_number']]:'',$w['description'],$w['bit_number'],$w['bit_number'] + ); + } else { + printf(' + + ', + $w['description'],$w['bit_number'],$w['bit_number'] + ); + } + } + echo '
        %d. %s +
        +
        '; + echo ' | '; + echo ' '; + echo '
        '; + echo '
        '; + echo '
        '; + echo 'New: '; + echo ''; + echo '
        '; + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new ItemFlags(); + $obj->draw_page(); +} + +?> diff --git a/fannie/item/ProductListPage.php b/fannie/item/ProductListPage.php new file mode 100644 index 000000000..a2acaa61d --- /dev/null +++ b/fannie/item/ProductListPage.php @@ -0,0 +1,587 @@ +canDeleteItems = validateUserQuiet('delete_items'); + $this->canEditItems = validateUserQuiet('pricechange'); + + $this->excel = FormLib::get_form_value('excel',False); + + if (FormLib::get_form_value('ajax') !== ''){ + $this->ajax_response(); + return False; + } + + if (FormLib::get_form_value('supertype') !== ''){ + $this->mode = 'list'; + $this->window_dressing = False; + if (!$this->excel) + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + } + + return True; + } + + function javascript_content(){ + global $FANNIE_URL, $FANNIE_OP_DB; + + if ($this->excel) return ''; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $depts = array(); + $p = $dbc->prepare_statement('SELECT dept_no,dept_name FROM departments ORDER BY dept_no'); + $result = $dbc->exec_statement($p); + while($w = $dbc->fetch_row($result)) + $depts[$w[0]] = $w[1]; + $taxes = array('-'=>array(0,'NoTax')); + $p = $dbc->prepare_statement('SELECT id, description FROM taxrates ORDER BY id'); + $result = $dbc->exec_statement($p); + while($w = $dbc->fetch_row($result)){ + if ($w['id'] == 1) + $taxes['X'] = array(1,'Regular'); + else + $taxes[strtoupper(substr($w[1],0,1))] = array($w[0], $w[1]); + } + $local_opts = array('-'=>array(0,'No')); + $p = $dbc->prepare_statement('SELECT originID,shortName FROM originName WHERE local=1 ORDER BY originID'); + $r = $dbc->exec_statement($p); + while($w = $dbc->fetch_row($r)){ + $local_opts[substr($w['shortName'],0,1)] = array($w['originID'],$w['shortName']); + } + if (count($local_opts) == 1) $local_opts['X'] = array(1,'Yes'); // generic local if no origins defined + ob_start(); + ?> + var deptObj = ; + var taxObj = ; + var localObj = ; + function edit(upc){ + var desc = $('tr#'+upc+' .td_desc').html(); + var content = ""; + $('tr#'+upc+' .td_desc').html(content); + + var dept = $('tr#'+upc+' .td_dept').html(); + var content = ''; + $('tr#'+upc+' .td_dept').html(content); + + var supplier = $('tr#'+upc+' .td_supplier').html(); + var content = ""; + $('tr#'+upc+' .td_supplier').html(content); + + var price = $('tr#'+upc+' .td_price').html(); + var content = ""; + $('tr#'+upc+' .td_price').html(content); + + var tax = $('tr#'+upc+' .td_tax').html(); + var content = '"; + $('tr#'+upc+' .td_fs').html(content); + + var disc = $('tr#'+upc+' .td_disc').html(); + var content = ""; + $('tr#'+upc+' .td_disc').html(content); + + var wgt = $('tr#'+upc+' .td_wgt').html(); + var content = ""; + $('tr#'+upc+' .td_wgt').html(content); + + var local = $('tr#'+upc+' .td_local').html(); + //var content = ""; + var content = ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Buyer

        + Selecting a Buyer/Dept overrides Department Start/Department End. + To run reports for a specific department(s) leave Buyer/Dept or set it to 'blank'

        Department Start

        +

        End

        + + +

        +

        + + +

        Sort report by? + Excel  
          
          
        + + + mode == 'form') + return $this->form_content(); + else if ($this->mode == 'list') + return $this->list_content(); + else + return 'Unknown error occurred'; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new ProductListPage(); + $obj->draw_page(); +} + diff --git a/fannie/item/addShelfTag.php b/fannie/item/addShelfTag.php new file mode 100644 index 000000000..bad9921bd --- /dev/null +++ b/fannie/item/addShelfTag.php @@ -0,0 +1,161 @@ +prepare_statement("SELECT DISTINCT i.*,v.vendorName FROM vendorItems AS i + LEFT JOIN vendors AS v ON i.vendorID=v.vendorID + where upc = ? ORDER BY i.vendorID"); + +$vendiR = $dbc->exec_statement($vendiQ,array($upc)); +$vendiN = $dbc->num_rows($vendiR); + +$prodQ = $dbc->prepare_statement("SELECT p.*,s.superID FROM products AS p + LEFT JOIN MasterSuperDepts AS s ON p.department=s.dept_ID + where upc=?"); +//echo $prodQ; +$prodR = $dbc->exec_statement($prodQ,array($upc)); + +$prodW = $dbc->fetch_array($prodR); +$price = $prodW['normal_price']; +$desc = $prodW['description']; +$brand = ''; +$size = ''; +$units = ''; +$sku = ''; +$vendor = ''; +$ppo = ''; +$superID = $prodW['superID']; + +if($vendiN > 0){ + // Use only the first hit. + $vendiW = $dbc->fetch_array($vendiR); + // Composed: "200 g" + $size = $vendiW['size']; + $brand = $vendiW['brand']; + $units = $vendiW['units']; + $sku = $vendiW['sku']; + if ( $vendiW['vendorName'] != "" ) { + $vendor = $vendiW['vendorName']; + } else if ($dbc->table_exists('prodExtra')) { + $prodExtraQ = $dbc->prepare_statement("select distributor from prodExtra where upc=?"); + $prodExtraR = $dbc->exec_statement($prodExtraQ, array($upc)); + $prodExtraN = $dbc->num_rows($prodExtraR); + if ($prodExtraN > 0){ + $prodExtraW = $dbc->fetch_array($prodExtraR); + $vendor = $prodExtraW['distributor']; + } + } + $ppo = PriceLib::pricePerUnit($price,$size); +} +else if ($dbc->table_exists('prodExtra')) { +$prodExtraQ = $dbc->prepare_statement("select manufacturer,distributor from prodExtra where upc=?"); +$prodExtraR = $dbc->exec_statement($prodExtraQ,array($upc)); +$prodExtraN = $dbc->num_rows($prodExtraR); + if ($prodExtraN == 1){ + $prodExtraW = $dbc->fetch_array($prodExtraR); + $brand = $prodExtraW['manufacturer']; + $vendor = $prodExtraW['distributor']; + } +} + +echo ""; +echo "New Shelf Tag: " . $upc; +?> +
        + +Description + +>
        +Brand: +>
        +Units: +> +Size: +>
        +PricePer: />
        +Vendor: +>
        +SKU: +> +Price: > +"; + +?> +
        Barcode page:
        +
        + + diff --git a/fannie/item/addShelfTag1.php b/fannie/item/addShelfTag1.php new file mode 100644 index 000000000..d1b0ca7ee --- /dev/null +++ b/fannie/item/addShelfTag1.php @@ -0,0 +1,94 @@ +prepare_statement("SELECT * FROM shelftags where upc = ? and id=?"); +$checkUPCR = $dbc->exec_statement($checkUPCQ,array($upc,$id)); +$checkUPCN = $dbc->num_rows($checkUPCR); + +$insQ = ""; +$args = array(); +if($checkUPCN == 0){ + $insQ = $dbc->prepare_statement("INSERT INTO shelftags VALUES(?,?,?,?,?,?,?,?,?,?)"); + $args = array($id,$upc,$description,$price,$brand,$sku,$size,$units,$vendor,$ppo); +}else{ + $insQ = $dbc->prepare_statement("UPDATE shelftags SET normal_price=?, pricePerUnit=?, + description=?,brand=?,sku=?,size=?,units=?,vendor=? WHERE upc = ? and id=?"); + $args = array($price,$ppo,$description,$brand,$sku,$size,$units,$vendor,$upc,$id); +} + +$insR = $dbc->exec_statement($insQ,$args); +if ( $insR == False ) { +echo " + + + +

        Failed:
        +$insQ +

        + +"; +} +else { +echo " + + + + +"; +} +?> + diff --git a/fannie/item/ajax.js b/fannie/item/ajax.js new file mode 100644 index 000000000..04f58e7ae --- /dev/null +++ b/fannie/item/ajax.js @@ -0,0 +1,50 @@ +var first = true; +function cscallback(){ + if (first){ + first = false; + return false; + } + + var c = $('#cost').val(); + var d = $('#department').val(); + var u = $('#upc').val(); + var d = 'action=margin&upc='+u+'&dept='+d+'&cost='+c; + + $.ajax({ + url: 'ajax.php', + type: 'POST', + dataType: 'text/html', + timeout: 1000, + data: d, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + resp = 'Margin'+resp; + $('#marginfs').html(resp); + } + }); +} + +function updateLC(the_likecode){ + if (the_likecode == "-1"){ + $('#lchidden').hide(); + return false; + } + + var d = 'action=likecode&lc='+the_likecode; + $.ajax({ + url: 'ajax.php', + type: 'POST', + dataType: 'text/html', + timeout: 1000, + data: d, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#lctable').html(resp); + $('#lchidden').show(); + } + }); +} diff --git a/fannie/item/ajax.php b/fannie/item/ajax.php new file mode 100644 index 000000000..6bd21d79e --- /dev/null +++ b/fannie/item/ajax.php @@ -0,0 +1,89 @@ +"; + if (is_numeric($lc)){ + $prep = $dbc->prepare_statement("SELECT p.upc,p.description FROM + products AS p INNER JOIN upcLike AS u ON + p.upc=u.upc WHERE u.likeCode=? + ORDER BY p.upc"); + $res = $dbc->exec_statement($prep, array($lc)); + while($row = $dbc->fetch_row($res)){ + $ret .= sprintf("%s + %s",$row[0],$row[0],$row[1]); + } + } + $ret .= ""; + + echo $ret; +} + +function MarginFS($upc,$cost,$dept){ + global $dbc; + $prep = $dbc->prepare_statement("SELECT normal_price FROM products WHERE upc=?"); + $price = $dbc->exec_statement($prep,array($upc)); + if ($dbc->num_rows($price) > 0) + $price = array_pop($dbc->fetch_row($price)); + else + $price = "None"; + + $prep = $dbc->prepare_statement("SELECT margin FROM deptMargin WHERE dept_ID=?"); + $dm = $dbc->exec_statement($prep,array($dept)); + if ($dbc->num_rows($dm) > 0){ + $dm = array_pop($dbc->fetch_row($dm)); + } + else { + $dm = "Unknown"; + } + + $ret = "Desired margin on this department is "; + if ($dm == "Unknown") $ret .= $dm; + else $ret .= sprintf("%.2f%%",$dm*100); + $ret .= "
        "; + + $actual = 0; + if ($price != 0) + $actual = ($price-$cost)/$price; + if (($actual > $dm && is_numeric($dm)) || !is_numeric($dm) ){ + $ret .= sprintf("Current margin on this item is %.2f%%
        ", + $actual*100); + } + elseif (!is_numeric($price)){ + $ret .= "No price has been saved for this item
        "; + } + else { + $ret .= sprintf("Current margin on this item is %.2f%%
        ", + $actual*100); + $srp = getSRP($cost,$dm); + $ret .= sprintf("Suggested price: \$%.2f ",$srp); + $ret .= sprintf("(Use this price)",$srp); + } + + echo $ret; +} + +function getSRP($cost,$margin){ + $srp = sprintf("%.2f",$cost/(1-$margin)); + while (substr($srp,strlen($srp)-1,strlen($srp)) != "5" && + substr($srp,strlen($srp)-1,strlen($srp)) != "9") + $srp += 0.01; + return $srp; +} + + +?> diff --git a/fannie/item/audit.php b/fannie/item/audit.php new file mode 100644 index 000000000..8f1765801 --- /dev/null +++ b/fannie/item/audit.php @@ -0,0 +1,73 @@ +"andy", + 1=>"jim, lisa, meales", + 2=>"jesse, lisa, meales", + 3=>"debbie, aelliott, justin", + 4=>"joeu, lisa, meales", + 5=>"jillhall, lisa, meales", + 6=>"michael", + 7=>"shannon", + 8=>"jesse, lisa, meales", + 9=>"meales, lisa" + ); + $taxes = array("NoTax","Reg","Deli"); + + $subject = "Item Update notification: ".$upc; + $message = "Item $upc ($desc) has been changed\n"; + $message .= "Price: $price\n"; + $message .= "Tax: ".$taxes[$tax]."\n"; + $message .= "Foodstampable: ".($fs==1?"Yes":"No")."\n"; + $message .= "Scale: ".($scale==1?"Yes":"No")."\n"; + $message .= "Discountable: ".($discount==1?"Yes":"No")."\n"; + if ($likecode != False){ + if ($likecode == -1) + $message .= "This item is not in a like code\n"; + else + $message .= "All items in this likecode ($likecode) were changed\n"; + } + $message .= "\n"; + $message .= "Adjust this item?\n"; + $message .= "http://{$hostname}/{$FANNIE_URL}item/itemMaint.php?upc=$upc\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +?> diff --git a/fannie/item/deleteItem.php b/fannie/item/deleteItem.php new file mode 100644 index 000000000..07442c65b --- /dev/null +++ b/fannie/item/deleteItem.php @@ -0,0 +1,106 @@ + + + +Delete Product Tool"; + +if (isset($_REQUEST['upc']) && !isset($_REQUEST['deny'])){ + $upc = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + + if (isset($_REQUEST['submit'])){ + $p = $dbc->prepare_statement("SELECT * FROM products WHERE upc=?"); + $rp = $dbc->exec_statement($p,array($upc)); + if ($dbc->num_rows($rp) == 0){ + printf("No item found for %s

        ",$upc); + echo "Go back"; + } + else { + $rw = $dbc->fetch_row($rp); + echo "

        "; + echo "Delete this item?
        "; + echo ""; + echo ""; + printf("",$rw['upc'], + $rw['upc'],$rw['upc'],$rw['description'],$rw['normal_price']); + echo "
        UPCDescriptionPrice
        + %s%s%.2f

        "; + printf("",$upc); + echo ""; + echo "      "; + echo ""; + } + } + else if (isset($_REQUEST['confirm'])){ + $plu = substr($upc,3,4); + ProductsModel::static_delete($upc); + $delxQ = $dbc->prepare_statement("DELETE FROM prodExtra WHERE upc=?"); + $dbc->exec_statement($delxQ,array($upc)); + if ($dbc->table_exists("scaleItems")){ + $scaleQ = $dbc->prepare_statement("DELETE FROM scaleItems WHERE plu=?"); + $dbc->exec_statement($scaleQ,array($upc)); + include('hobartcsv/parse.php'); + deleteitem($plu); + } + + include('laneUpdates.php'); + deleteProductAllLanes(str_replace("'","",$upc)); + + printf("Item %s has been deleted

        ",$upc); + echo "Delete another item"; + } +}else{ + echo ""; + echo " Enter UPC/PLU here

        "; + + echo ""; + echo "
        "; + echo ""; +} + +include ('../src/footer.html'); + +?> diff --git a/fannie/item/deleteItem_WEFC_Toronto.php b/fannie/item/deleteItem_WEFC_Toronto.php new file mode 100644 index 000000000..5c05a803a --- /dev/null +++ b/fannie/item/deleteItem_WEFC_Toronto.php @@ -0,0 +1,152 @@ + + + +Delete Product Tool"; + +if (isset($_REQUEST['upc']) && !isset($_REQUEST['deny'])){ + $upc = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + + if (isset($_REQUEST['submit'])){ + $rp = $dbc->query(sprintf("SELECT * FROM products WHERE upc=%s",$dbc->escape($upc))); + if ($dbc->num_rows($rp) == 0){ + printf("No item found for %s

        ",$upc); + echo "Go back"; + } + else { + $rw = $dbc->fetch_row($rp); + echo "

        "; + echo "Delete this item?
        "; + echo ""; + echo ""; + printf("",$rw['upc'], + $rw['upc'],$rw['upc'],$rw['description'],$rw['normal_price']); + echo "
        UPCDescriptionPrice
        + %s%s%.2f

        "; + printf("",$upc); + echo ""; + echo "      "; + echo ""; + } + } + else if (isset($_REQUEST['confirm'])){ + $plu = substr($upc,3,4); + $upc = $dbc->escape($upc); + $delQ = sprintf("DELETE FROM products WHERE upc=%s",$upc); + $dbc->query($delQ); + $delxQ = sprintf("DELETE FROM prodExtra WHERE upc=%s",$upc); + $dbc->query($delxQ); + if ($dbc->table_exists("scaleItems")){ + $scaleQ = sprintf("DELETE FROM scaleItems WHERE plu=%s",$upc); + $dbc->query($scaleQ); + include('hobartcsv/parse.php'); + deleteitem($plu); + } + $lane_tables = array("products"); + if ($dbc->table_exists("productUser")){ + $deluQ = sprintf("DELETE FROM productUser WHERE upc=%s",$upc); + $dbc->query($deluQ); + $lane_tables[] = "productUser"; + } + + /* For WEFC_Toronto only + */ + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == "WEFC_Toronto" ) { + $table_name = "products_{$FANNIE_COOP_ID}"; + if ($dbc->table_exists("$table_name")){ + $deluQ = sprintf("DELETE FROM $table_name WHERE upc=%s",$upc); + $dbc->query($deluQ); + } + } + + include('laneUpdates_WEFC_Toronto.php'); + deleteAllLanes(str_replace("'","",$upc), $lane_tables); + //For table products only. + //deleteProductAllLanes(str_replace("'","",$upc)); + + printf("Item %s has been deleted
        ",$upc); + echo "Delete another item"; + // General maintenance form. + echo "
        "; + echo ""; + echo promptForUPC(); + echo "
        "; + } +}else{ + echo "
        "; + echo " Enter UPC/PLU to delete here

        "; + echo ""; + echo "
        "; + echo "
        "; + echo "
        "; + + echo promptForUPC(); + + echo "
        "; + + echo ""; +} + +include ('../src/footer.html'); + +?> diff --git a/fannie/item/departments/DepartmentEditor.php b/fannie/item/departments/DepartmentEditor.php new file mode 100644 index 000000000..3c77d197a --- /dev/null +++ b/fannie/item/departments/DepartmentEditor.php @@ -0,0 +1,247 @@ +ajax_response(FormLib::get_form_value('action')); + return False; + } + + return True; + } + + function ajax_response($action){ + switch($action){ + case 'deptDisplay': + $this->ajax_display_dept(FormLib::get_form_value('did',0)); + break; + case 'deptSave': + $this->ajax_save_dept(); + break; + default: + echo 'Bad request'; + break; + } + } + + private function ajax_display_dept($id){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $name=""; + $tax=""; + $fs=0; + $disc=1; + $max=50; + $min=0.01; + $margin=0.00; + $pcode=""; + + if ($id != -1){ // -1 means create new department + $prep = $dbc->prepare_statement("SELECT dept_name,dept_tax,dept_fs,dept_limit, + dept_minimum,dept_discount,margin,salesCode + FROM departments AS d LEFT JOIN + deptMargin AS m ON d.dept_no=m.dept_ID + LEFT JOIN deptSalesCodes as c + ON d.dept_no=c.dept_ID + WHERE dept_no=?"); + $resp = $dbc->exec_statement($prep,array($id)); + $row = $dbc->fetch_row($resp); + $name = $row[0]; + $tax = $row[1]; + $fs = $row[2]; + $max = $row[3]; + $min=$row[4]; + $disc = $row[5]; + $margin = $row[6]; + $pcode = $row[7]; + } + $taxes = array(); + $taxes[0] = "NoTax"; + $p = $dbc->prepare_statement("SELECT id,description FROM taxrates ORDER BY id"); + $resp = $dbc->exec_statement($p); + while($row = $dbc->fetch_row($resp)){ + $taxes[$row[0]] = $row[1]; + } + + $ret = ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= sprintf("",$min,0); + $ret .= sprintf("",$max,0); + $ret .= sprintf("",$margin*100); + $ret .= ""; + $ret .= "
        Dept #NameTaxFS
        "; + if ($id == -1){ + $ret .= ""; + } + else { + $ret .= $id; + } + $ret .= "
        DiscountMinMaxMarginSales Code
        0?'checked':'')." />\$\$%%
        "; + if ($id != -1){ + $ret .= ""; + $ret .= ""; + } + else + $ret .= ""; + $ret .= "

        "; + + echo $ret; + } + + private function ajax_save_dept(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $id = FormLib::get_form_value('did',0); + $name = FormLib::get_form_value('name',''); + $tax = FormLib::get_form_value('tax',0); + $fs = FormLib::get_form_value('fs',0); + $disc = FormLib::get_form_value('disc',1); + $min = FormLib::get_form_value('min',0.01); + $max = FormLib::get_form_value('max',50.00); + $margin = FormLib::get_form_value('margin',0); + $margin = ((float)$margin) / 100.0; + $pcode = FormLib::get_form_value('pcode',$id); + if (!is_numeric($pcode)) $pcode = (int)$id; + $new = FormLib::get_form_value('new',0); + + if ($new == 1){ + $chk = $dbc->prepare_statement('SELECT * FROM departments WHERE dept_no=?'); + $r = $dbc->exec_statement($chk,array($id)); + if ($dbc->num_rows($r) > 0){ + echo "Error: Dept # $id is already in use"; + return; + } + + $insP = $dbc->prepare_statement('INSERT INTO departments (dept_no, dept_name, + dept_tax,dept_fs,dept_discount,dept_limit,dept_minimum,modified, + modifiedby) VALUES (?,?,?,?,?,?,?,'.$dbc->now().',1)'); + $insR = $dbc->exec_statement($insP, array($id,$name,$fax,$fs,$disc,$max,$min)); + if ($insR === False){ + echo 'Error: could not create department'; + return; + } + + $superP = $dbc->prepare_statement('INSERT INTO superdepts (superID,dept_ID) VALUES (0,?)'); + $superR = $dbc->exec_statement($superP,array($id)); + } + else { + $upP = $dbc->prepare_statement('UPDATE departments SET dept_name=?, dept_tax=?, + dept_fs=?, dept_discount=?, dept_limit=?, dept_minimum=?, + modified='.$dbc->now().' WHERE dept_no=?'); + $upR = $dbc->exec_statement($upP, array($name, $tax, $fs, $disc, $max, $min, $id) ); + if ($upR === False){ + echo 'Error: could not save changes'; + return; + } + } + + $chkM = $dbc->prepare_statement('SELECT dept_ID FROM deptMargin WHERE dept_ID=?'); + $mR = $dbc->exec_statement($chkM, array($id)); + if ($dbc->num_rows($mR) > 0){ + $up = $dbc->prepare_statement('UPDATE deptMargin SET margin=? WHERE dept_ID=?'); + $dbc->exec_statement($up, array($margin, $id)); + } + else { + $ins = $dbc->prepare_statement('INSERT INTO deptMargin (dept_ID,margin) VALUES (?,?)'); + $dbc->exec_statement($ins, array($id, $margin)); + } + + $chkS = $dbc->prepare_statement('SELECT dept_ID FROM deptSalesCodes WHERE dept_ID=?'); + $rS = $dbc->exec_statement($chkS, array($id)); + if ($dbc->num_rows($rS) > 0){ + $up = $dbc->prepare_statement('UPDATE deptSalesCodes SET salesCode=? WHERE dept_ID=?'); + $dbc->exec_statement($up, array($pcode, $id)); + } + else { + $ins = $dbc->prepare_statement('INSERT INTO deptSalesCodes (dept_ID,salesCode) VALUES (?,?)'); + $dbc->exec_statement($ins, array($id, $pcode)); + } + + echo 'Department '.$id.' - '.$name.' Saved'; + } + + + function body_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $depts = ""; + $depts .= ""; + $p = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments + ORDER BY dept_no"); + $resp = $dbc->exec_statement($p); + $selectedDID = FormLib::get_form_value('did'); + while($row = $dbc->fetch_row($resp)){ + if ($selectedDID !== '' && $selectedDID == $row[0]) + $depts .= ""; + else + $depts .= ""; + } + ob_start(); + ?> +

        + Department +
        +
        +
        + add_script('dept.js'); + if ($selectedDID !== '') + $this->add_onload_command('deptchange();'); + + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new DepartmentEditor(); + $obj->draw_page(); +} + +?> diff --git a/fannie/item/departments/DepartmentIndexPage.php b/fannie/item/departments/DepartmentIndexPage.php new file mode 100644 index 000000000..7b3d2d6ea --- /dev/null +++ b/fannie/item/departments/DepartmentIndexPage.php @@ -0,0 +1,48 @@ + + + draw_page(); +} +?> diff --git a/fannie/item/departments/SubDeptEditor.php b/fannie/item/departments/SubDeptEditor.php new file mode 100644 index 000000000..77d60902b --- /dev/null +++ b/fannie/item/departments/SubDeptEditor.php @@ -0,0 +1,151 @@ +ajax_response(FormLib::get_form_value('action')); + return False; + } + + return True; + } + + function ajax_response($action){ + switch($action){ + case 'addSub': + $this->add_sub_dept(FormLib::get_form_value('name'),FormLib::get_form_value('did')); + echo $this->get_subs_as_options(FormLib::get_form_value('did')); + break; + case 'deleteSub': + $this->delete_sub_depts(FormLib::get_form_value('sid',array())); + echo $this->get_subs_as_options(FormLib::get_form_value('did')); + break; + case 'showSubsForDept': + echo $this->get_subs_as_options(FormLib::get_form_value('did')); + break; + default: + echo 'Bad request'; + break; + } + } + + private function add_sub_dept($name, $deptID){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $p = $dbc->prepare_statement("SELECT max(subdept_no) FROM subdepts"); + $res = $dbc->exec_statement($p); + $sid = 1; + if ($dbc->num_rows($res) > 0){ + $tmp = array_pop($dbc->fetch_row($res)); + if (is_numeric($tmp)) $sid = $tmp+1; + } + + $ins = $dbc->prepare_statement('INSERT INTO subdepts VALUES (?,?,?)'); + $dbc->exec_statement($ins,array($sid, $name, $deptID)); + } + + private function delete_sub_depts($ids){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + if (!is_array($ids)) $ids = array(); + $delP = $dbc->prepare_statement('DELETE FROM subdepts WHERE subdept_no=?'); + foreach($ids as $id) + $dbc->exec_statement($delP, array($id)); + } + + private function get_subs_as_options($deptID){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $p = $dbc->prepare_statement("SELECT subdept_no,subdept_name FROM subdepts + WHERE dept_ID=? ORDER BY subdept_name"); + $r = $dbc->exec_statement($p,array($deptID)); + + $ret = ''; + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf('', + $w['subdept_no'],$w['subdept_name']); + } + return $ret; + } + + function body_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $superQ = $dbc->prepare_statement("SELECT d.dept_no,dept_name FROM departments as d + ORDER BY d.dept_no"); + $superR = $dbc->exec_statement($superQ); + $opts = ""; + $firstID = False; + $firstName = ""; + while($superW = $dbc->fetch_row($superR)){ + $opts .= ""; + if ($firstID === False){ + $firstID = $superW[0]; + $firstName = $superW[1]; + } + } + + ob_start(); + ?> + Choose a department: +
        +
        + + +
        + add_script('sub.js'); + $this->add_onload_command('showSubsForDept('.$firstID.');'); + + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new SubDeptEditor(); + $obj->draw_page(); +} +?> diff --git a/fannie/item/departments/SuperDeptEditor.php b/fannie/item/departments/SuperDeptEditor.php new file mode 100644 index 000000000..768cdbdd1 --- /dev/null +++ b/fannie/item/departments/SuperDeptEditor.php @@ -0,0 +1,200 @@ +ajax_response(FormLib::get_form_value('action')); + return False; + } + + return True; + } + + function ajax_response($action){ + switch($action){ + case 'deptsInSuper': + $depts = $this->depts_in_super(FormLib::get_form_value('sid',0)); + foreach($depts as $id=>$v) + printf('',$id,$id,$v); + break; + case 'deptsNotInSuper': + $depts = $this->depts_not_in_super(FormLib::get_form_value('sid',0)); + foreach($depts as $id=>$v) + printf('',$id,$id,$v); + break; + case 'save': + $id = FormLib::get_form_value('sid',0); + $name = FormLib::get_form_value('name',''); + $depts = FormLib::get_form_value('depts',array()); + $this->save_super_dept($id,$name,$depts); + break; + default: + echo 'Bad request'; + break; + } + } + + private function depts_in_super($id){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $prep = $dbc->prepare_statement("SELECT + superID,dept_ID,dept_name FROM + superdepts AS s LEFT JOIN + departments AS d ON s.dept_ID = d.dept_no + WHERE superID=? + GROUP BY superID,dept_ID,dept_name + ORDER BY superID,dept_ID"); + $result = $dbc->exec_statement($prep,array($id)); + $ret = array(); + while($row = $dbc->fetch_row($result)){ + $ret[$row['dept_ID']] = $row['dept_name']; + } + return $ret; + } + + private function depts_not_in_super($id){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $prep = $dbc->prepare_statement('SELECT dept_no,dept_name + FROM departments WHERE dept_no NOT IN + (SELECT dept_ID FROM superdepts WHERE + superID=?) + GROUP BY dept_no,dept_name + ORDER BY dept_no'); + $result = $dbc->exec_statement($prep,array($id)); + $ret = array(); + while($row = $dbc->fetch_row($result)){ + $ret[$row['dept_no']] = $row['dept_name']; + } + return $ret; + } + + private function save_super_dept($id,$name,$depts){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + if ($id == -1){ + $p = $dbc->prepare_statement("SELECT max(superID)+1 FROM superdepts"); + $resp = $dbc->exec_statement($p); + $id = array_pop($dbc->fetch_row($resp)); + if (empty($id)) $id = 1; + } + else { + $prep = $dbc->prepare_statement("DELETE FROM superdepts WHERE superID=?"); + $dbc->exec_statement($prep,array($id)); + } + + $deptP = $dbc->prepare_statement('INSERT INTO superdepts VALUES (?,?)'); + if (!is_array($depts)) $depts = array(); + foreach($depts as $d){ + $dbc->exec_statement($deptP,array($id,$d)); + } + + $delP = $dbc->prepare_statement("DELETE FROM superDeptNames WHERE superID=?"); + $dbc->exec_statement($delP,array($id)); + $insP = $dbc->prepare_statement("INSERT INTO superDeptNames VALUES (?,?)"); + $dbc->exec_statement($insP,array($id,$name)); + + echo "Saved Settings for $name"; + } + + function body_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $superQ = $dbc->prepare_statement("SELECT s.superID,super_name FROM superdepts as s + LEFT JOIN superDeptNames AS n ON s.superID=n.superID + GROUP BY s.superID,super_name + ORDER BY super_name"); + $superR = $dbc->exec_statement($superQ); + $opts = ""; + $firstID = False; + $firstName = ""; + while($superW = $dbc->fetch_row($superR)){ + $opts .= ""; + if ($firstID === False){ + $firstID = $superW[0]; + $firstName = $superW[1]; + } + } + if (empty($opts)) $opts .= ""; + + ob_start(); + ?> +
        + Select super department:

        + +

        +
        +
        +
        + Members
        + +
        +
        + +

        + +

        +
        + Non-members
        + +
        +
        +
        + +
        + add_script('super.js'); + + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new SuperDeptEditor(); + $obj->draw_page(); +} +?> diff --git a/fannie/item/departments/dept.js b/fannie/item/departments/dept.js new file mode 100644 index 000000000..cc8732b3e --- /dev/null +++ b/fannie/item/departments/dept.js @@ -0,0 +1,75 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function deptchange(){ + var dID = $('#deptselect').val(); + if (dID == 0){ + $('#infodiv').html(""); + return; + } + + $.ajax({ + url: 'DepartmentEditor.php', + type: 'POST', + timeout: 1000, + data: 'did='+dID+'&action=deptDisplay', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#infodiv').html(resp); + } + }); +} + +function deptSave(){ + var qs = "action=deptSave"; + qs += "&new="+$('#isNew').val(); + qs += "&did="+$('#deptno').val(); + qs += "&name="+$('#deptname').val(); + qs += "&tax="+$('#depttax').val(); + if ($('#deptfs').is(':checked')) + qs += "&fs=1"; + else + qs += "&fs=0"; + if ($('#deptdisc').is(':checked')) + qs += "&disc=1"; + else + qs += "&disc=0"; + qs += "&min="+$('#deptmin').val(); + qs += "&max="+$('#deptmax').val(); + qs += "&margin="+$('#deptmargin').val(); + qs += "&pcode="+$('#deptsalescode').val(); + + $.ajax({ + url: 'DepartmentEditor.php', + type: 'POST', + timeout: 1000, + data: qs, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + alert(resp); + } + }); +} diff --git a/fannie/item/departments/index.php b/fannie/item/departments/index.php new file mode 100644 index 000000000..4a29c88e5 --- /dev/null +++ b/fannie/item/departments/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/item/departments/loadWEFCTorontoDepts.php b/fannie/item/departments/loadWEFCTorontoDepts.php new file mode 100644 index 000000000..c4bc8b6e4 --- /dev/null +++ b/fannie/item/departments/loadWEFCTorontoDepts.php @@ -0,0 +1,511 @@ +query($truncateQ); + if ( ! $truncateR ) { + $messages[++$mct] = "** Error: Failed: $truncateQ"; + } else { + $messages[++$mct] = "Table $table truncated (emptied)"; + } + } + $messages[++$mct] = ""; + + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } + } + else { + foreach ($departmentTables as $table) { + $truncateQ = "truncate table $table"; + $truncateR = $dbc->query($truncateQ); + if ( ! $truncateR ) { + $messages[++$mct] = "** Error: Failed: $truncateQ"; + } else { + $messages[++$mct] = "Table $table truncated (emptied)"; + } + } + $messages[++$mct] = ""; + + $filestoprocess[] = "$dept_csv"; + } + + // Remove one split from the list and process that + $current = array_pop($filestoprocess); + + $dept_fs = 0; + $dept_limit = 999.00; + $dept_minimum = 0.01; + $dept_discount = 0; + $modified = $dbc->now(); + $modifiedby = 1; + + $superDeptCounter = 0; + /* Try to put superdepts.superID's in some meaningful sequence and ranges. + new: TOP 1-9, TAX 10-19, BUYER 2xx, CATEGORIES 1xx, BULK 20-29 + obs: ACCTG 2xx, TOP 1-9, PURCH 3xx, CATEGORIES 1xx, SUBCATEGORIES 4xx + obs: ACCTG 2xx, TAX 1-9, PURCH 3xx, CATEGORIES 1xx + */ + // 14Jan13 Change for no-real-superdepts + $superDeptCounters = array (0,0,0,0,0, 1, 30, 200, 100, 50); + //$superDeptCounters = array (0,0,0,0,0, 1, 10, 200, 100, 20); + + // Lines read from CSV, including column headings. + $lineCount = 0; + // Department records written. + $departmentCount = 0; + // Records flagged as incomplete. + //$incompletes = 0; + + $fp = fopen($tpath.$current,'r'); + while( !feof($fp) ) { + + $line = fgets($fp); + $lineCount++; + //EL The data is tab-delimited, but no embedded commas. + // Why not just use explode()? + // $line = preg_replace("\t",",",$line); + /* csv parser takes a comma-, or other-, separated line and returns its elements + as an array */ + $data = csv_parser($line, "", "\t"); + if (!is_array($data)) continue; + + // Row cannot be valid without this. + // Skipping the row of column labels is done later. + // In early versions some don't have numbers yet, useless. + if ( !isset($data[$DEPT_NO]) || $data[$DEPT_NO] == "" ) { + $messages[++$mct] = "Skipping line $lineCount Name >{$data[$DEPT_NAME]}< because it has no number."; + continue; + } + + // Could also use VALUES ($dbc->escape($foo) ...) + $dept_name = fix_text_for_db($data[$DEPT_NAME]); + $dept_no = $data[$DEPT_NO]; + $dept_tax = $data[$DEPT_TAX]; + if ( $data[$MARGIN] == "" ) { + $margin = 0; + $messages[++$mct] = "Line $lineCount Name >{$data[$DEPT_NAME]}< has empty markup; set to 0."; + } + elseif ( $data[$MARGIN] == 0 ) { + $messages[++$mct] = "Line $lineCount Name >{$data[$DEPT_NAME]}< has markup 0."; + } + elseif ( !is_numeric($data[$MARGIN]) ) { + $messages[++$mct] = "Line $lineCount Name >{$data[$DEPT_NAME]}< has no-numeric markup >{$data[$MARGIN]}<; set to 0."; + $margin = 0; + } + else { + // Convert markup to margin + $margin = sprintf("%.5f",(($data[$MARGIN]-1)/$data[$MARGIN])); + //$messages[++$mct] = "Line $lineCount Name >{$data[$DEPT_NAME]}< converted markup >{$data[$MARGIN]}< to $margin ."; + } + + // Don't include duplicate departments by either number or name. + $checkQ = "SELECT dept_no FROM departments WHERE dept_no='$dept_no'"; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) > 0) { + $messages[++$mct] = "
        Skipping dept_no duplicate: $dept_no $dept_name"; + continue; + } + $checkQ = "SELECT dept_name FROM departments WHERE dept_name='$dept_name'"; + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) > 0) { + $messages[++$mct] = "
        Skipping dept_name duplicate: $dept_no $dept_name"; + continue; + } + + /* Skip the item if tax isn't numeric + this will catch the 'label' line in the first CSV split + since the splits get returned in file system order, + we can't be certain *when* that chunk will come up + */ + if ( !is_numeric($dept_tax) ) { + $colHeads = $data; + continue; + } + + // Add the record to departments + $insQ = "INSERT INTO departments + (dept_no, dept_name, dept_tax, dept_fs, dept_limit, dept_minimum, dept_discount, modified, modifiedby) + VALUES + ($dept_no, '$dept_name', $dept_tax, $dept_fs, $dept_limit, $dept_minimum, $dept_discount, $modified, $modifiedby)"; + $insR = $dbc->query($insQ); + + // Add the record to deptMargin + $insQ = "INSERT INTO deptMargin + (dept_ID, margin) + VALUES + ($dept_no, '$margin')"; + $insR = $dbc->query($insQ); + + $departmentCount++; + + /* Begin superdepartments + */ + // 14Jan13 - No proper SuperDepts. List of SuperDepts has only one item. + if ( ! $data[$TOP_SD] ) { + $data[$TOP_SD] = $data[$SUPERDEPTS]; + } + $data[$TOP_SD] = fix_text_for_db($data[$TOP_SD]); + $data[$TAX_SD] = fix_text_for_db($data[$TAX_SD]); + $data[$BUYER_SD] = fix_text_for_db($data[$BUYER_SD]); + $data[$CATEGORY_SD] = fix_text_for_db($data[$CATEGORY_SD]); + $data[$BULK_SD] = fix_text_for_db($data[$BULK_SD]); + // 14Jan13 - No proper SuperDepts + // $data[$SUPERDEPTS] = fix_text_for_db($data[$SUPERDEPTS]); + + // foreach of the four superdepartment fields + // Build the table of superdepartment names and id#s. + for ( $sdk=5; $sdk<=9; $sdk++) { + // Check by super_name whether superDeptNames record exists + $selQ = "SELECT superId, super_name from superDeptNames where super_name = '{$data[$sdk]}'"; + $selR = $dbc->query($selQ); + // if it doesn't, add it + if ($dbc->num_rows($selR) == 0) { + // increment counter, by group, for superID + $superDeptCounter = $superDeptCounters[$sdk]++; + // All one sequence. + // $superDeptCounter++; + // Add to superDeptNames + $insQ = "INSERT INTO superDeptNames (superID, super_name ) values ($superDeptCounter, '{$data[$sdk]}')"; + $insR = $dbc->query($insQ); + /* Add link via superdepts - Done later now. + $insQ = "INSERT INTO superdepts (superID, dept_ID ) values ($superDeptCounter, $dept_no)"; + $insR = $dbc->query($insQ); + */ + } + /* if it does, add an item. - Done later now. + else { + $row = $dbc->fetch_row($selR); + // Check for duplicate. + $selQ1 = "SELECT superId, dept_ID from superdepts where superId = {$row[0]} and dept_ID = $dept_no"; + $selR1 = $dbc->query($selQ1); + // if unique, add it + if ($dbc->num_rows($selR1) == 0) { + // Add link via superdepts + $insQ = "INSERT INTO superdepts (superID, dept_ID ) values ({$row[0]}, $dept_no)"; + $insR = $dbc->query($insQ); + } + else { + $messages[++$mct] = "
        For Department $dept_no $dept_name column $colHeads[$sdk] >$data[$sdk]< skipping superdepts duplicate: {$row[0]} $dept_no"; + } + } + */ + // Each superdept field + } + + // Foreach superdept named in the list, link the dept to it. + foreach ( preg_split("/ +/", $data[$SUPERDEPTS]) as $sdName ) { + $sdName = fix_text_for_db($sdName); + // Check that it exists and get its ID# + $selQ = "SELECT superId, super_name from superDeptNames where super_name = '{$sdName}'"; + $selR = $dbc->query($selQ); + // if it doesn't, complain. + if ($dbc->num_rows($selR) == 0) { + $messages[++$mct] = "
        For Department $dept_no $dept_name column listed superdept >{$sdName}< is not known"; + // if it does, add a link for it. + } + else { + $row = $dbc->fetch_row($selR); + // Check for duplicate. + $selQ1 = "SELECT superId, dept_ID from superdepts where superId = {$row[0]} and dept_ID = $dept_no"; + $selR1 = $dbc->query($selQ1); + // if unique, add it + if ($dbc->num_rows($selR1) == 0) { + // Add link via superdepts + $insQ = "INSERT INTO superdepts (superID, dept_ID ) values ({$row[0]}, $dept_no)"; + $insR = $dbc->query($insQ); + } + else { + $messages[++$mct] = "
        For Department $dept_no $dept_name column listed superdept >{$sdName}< is a duplicate of: {$row[0]} $dept_no and is being skipped."; + } + } + } + + // Each CSV line + } + + fclose($fp); + + /* + if filestoprocess is empty, it means all the splits + have been processed (the load is complete): + + update tables vendorSKUtoPLU, vendorItems, prodExtra. + + stop and print some summary info + including what files were processed + (for sanity's sake) and + + clean up by deleting all the splits + (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise: + + add the current file to the list of + splits that have already been processed and + + redirect back to this page, passing both lists + (files to be done and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe + */ + if (count($filestoprocess) == 0){ + + /* html header, including navbar */ + $page_title = "Done loading items"; + $header = "Done loading items"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing Departments file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + unlink($tpath.$current); + } + else { + echo "$dept_csv
        "; + } + + echo "Read $lineCount CSV lines. Wrote $departmentCount records to the departments table."; + echo "
        "; + //echo "$incompletes records flagged as known-to-be incomplete."; + // Display messages accumulated during the run. + for ( $n=0; $n$messages[$n]"; + } + } + echo "
        "; + + // Not unlink + // unlink($tpath."$dept_csv"); + echo "
        You might want to delete: {$tpath}{$dept_csv}
        "; + + echo "\n"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); + } + else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadWEFCTorontoDepts.php?filestoprocess=$sendable_data&processed=$encoded2"); + + } + +// /We know the file to process. +} +else { + + /* Form to get the name of csv file to load and launch load. */ + /* html header, including navbar */ + $page_title = "Fannie - Load WEFC-Toronto Departments"; + $header = "Load WEFC-Toronto Departments"; + include($FANNIE_ROOT.'src/header.html'); + + // Get a list of files + $dh = opendir($tpath); + $opts = "\n"; + $selectSize = 1; + while (($file = readdir($dh)) !== false) { + if ( substr($file, 0, 1) != "." ) { + $opts .= "\n"; + $selectSize++; + } + // With full path. But we don't need that. + //$opts .= "\n"; + } + closedir($dh); + + if ($selectSize > 5) + $selectSize = 5; + +?> + +
        + + +
        +
        + + diff --git a/fannie/item/departments/sub.js b/fannie/item/departments/sub.js new file mode 100644 index 000000000..2548c8797 --- /dev/null +++ b/fannie/item/departments/sub.js @@ -0,0 +1,81 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function showSubsForDept(did){ + var d= 'did='+did+'&action=showSubsForDept'; + var name = $('#deptselect option:selected').text(); + $.ajax({ + url: 'SubDeptEditor.php', + type: 'POST', + timeout: 1000, + data: d, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#subselect').html(resp); + $('#subdiv').show(); + $('#formdiv').show(); + $('#subname').html('Subdepts in '+name); + } + }); + +} + +function addSub(){ + var name = $('#newname').val(); + var did = $('#deptselect').val(); + var d = 'action=addSub&name='+name+'&did='+did; + $.ajax({ + url: 'SubDeptEditor.php', + type: 'POST', + timeout: 1000, + data: d, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#subselect').html(resp); + $('#newname').val(''); + } + }); +} + +function deleteSub(){ + var did = $('#deptselect').val(); + var d = 'action=deleteSub&did='+did; + $('#subselect option:selected').each(function(){ + d += '&sid[]='+$(this).val(); + }); + $.ajax({ + url: 'SubDeptEditor.php', + type: 'POST', + timeout: 1000, + data: d, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#subselect').html(resp); + } + }); +} diff --git a/fannie/item/departments/super.js b/fannie/item/departments/super.js new file mode 100644 index 000000000..f8e0d8ac6 --- /dev/null +++ b/fannie/item/departments/super.js @@ -0,0 +1,102 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function superSelected(){ + var superID = $('#superselect').val(); + if (superID == -1){ + $('#namespan').show(); + } + else { + $('#namespan').hide(); + } + + var name = $('#superselect :selected').text(); + $('#newname').val(name); + + $.ajax({ + url: 'SuperDeptEditor.php', + type: 'POST', + timeout: 1000, + data: 'sid='+superID+'&action=deptsInSuper', + error: function(e1,e2){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#deptselect').html(resp); + } + }); + + $.ajax({ + url: 'SuperDeptEditor.php', + type: 'POST', + timeout: 1000, + data: 'sid='+superID+'&action=deptsNotInSuper', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#deptselect2').html(resp); + } + }); + +} + +function addDepts(){ + $("#deptselect2 option:selected").each(function(){ + $("#deptselect").append($(this).clone()); + $(this).remove(); + }); +} + +function remDepts(){ + $("#deptselect option:selected").each(function(){ + $("#deptselect2").append($(this).clone()); + $(this).remove(); + }); +} + +function saveData(){ + var name = $('#newname').val(); + var sID = $('#superselect').val(); + var depts = ""; + $("#deptselect option").each(function(){ + depts += "&depts[]="+$(this).val(); + }); + + var qs = "action=save&sid="+sID+"&name="+name+depts; + + $.ajax({ + url: 'SuperDeptEditor.php', + type: 'POST', + timeout: 1000, + data: qs, + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + alert(resp); + top.location = 'SuperDeptEditor.php'; + // reload the page so the form resets + // when a new super department is created + } + }); +} diff --git a/fannie/item/handheld/handheld.linea.php b/fannie/item/handheld/handheld.linea.php new file mode 100644 index 000000000..38d3fac58 --- /dev/null +++ b/fannie/item/handheld/handheld.linea.php @@ -0,0 +1,323 @@ + +Item Maintenance + + + + + + + + +prepare_statement($query); + $result = $dbc->exec_statement($query,$args); + $num = $dbc->num_rows($result); + if ($num > 1){ + echo "Multiple items found
        "; + while($row=$dbc->fetch_row($result)){ + printf("%s
        ", + $row['upc'],$row['description']); + } + echo ""; + return; + } + else if (is_numeric($_REQUEST['upc']) && ($num == 1 || $num == 0)){ + $row = array(); + if ($num == 1) + $row = $dbc->fetch_row($result); + else { + $row['upc'] = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + $row['description'] = "New Item"; + $row['normal_price'] = 0; + $row['discounttype'] = 0; + $row['special_price'] = 0; + $row['department'] = 1; + $row['tax'] = 0; + $row['foodstamp'] = 0; + $row['discount'] = 1; + $row['scale'] = 0; + $row['qttyEnforced'] = 0; + $row['likeCode'] = ""; + $row['manufacturer'] = ""; + $row['distributor'] = ""; + $row['modified'] = ""; + } + echo ""; + echo "
        "; + echo "", + $row['description']); + + printf("",$row['normal_price'],$row['upc'], + (($row['discounttype']>0 && $row['special_price'] != 0)? + sprintf("On Sale @ \$%.2f",$row['special_price']):"")); + + $departments = array(); + $deptQ = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); + $deptR = $dbc->exec_statement($deptQ); + while($deptW = $dbc->fetch_row($deptR)) + $departments[$deptW[0]] = $deptW[1]; + echo ""; + + $taxrates = array(); + $taxrates[0] = "NoTax"; + $taxQ = $dbc->prepare_statement("SELECT id,description FROM taxrates ORDER BY id"); + $taxR = $dbc->exec_statement($taxQ); + while($taxW = $dbc->fetch_row($taxR)) + $taxrates[$taxW[0]] = $taxW[1]; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + printf("", + $row['upc'],(empty($row['likeCode'])?'None': + $row['likeCode'].' '.$row['likeCodeDesc'])); + + echo ""; + + echo ""; + + echo ""; + + printf("",$row['likeCode']); + printf("",$row['upc']); + printf("",$num); + + echo ""; + return; + } + else { + echo "Error: No item found for: ".$_REQUEST['upc']."
        "; + } + } + elseif(isset($_REQUEST['submit2'])){ + $upcs = array(); + $upcs[] = $_REQUEST['upc']; + $dept = $_REQUEST['dept']; + $tax = $_REQUEST['tax']; + $price = $_REQUEST['price']; + $scale = isset($_REQUEST['scale'])?1:0; + $fs = isset($_REQUEST['fs'])?1:0; + $qttyForce = isset($_REQUEST['qttyForce'])?1:0; + $disc = isset($_REQUEST['nodisc'])?0:1; + $desc = $_REQUEST['desc']; + + if (!empty($_REQUEST['lc'])){ + // drop from like code, re-add if appropriate + $delQ = $dbc->prepare_statement("DELETE FROM upcLike WHERE upc=?"); + $delR = $dbc->exec_statement($delQ, array($upcs[0])); + if (is_numeric($_REQUEST['lc']) && $_REQUEST['lc'] != 0 && $_REQUEST['lc'] != -1){ + $insQ = $dbc->prepare_statement("INSERT INTO upcLike (likeCode,upc) + VALUES (?,?)"); + $insR = $dbc->exec_statement($insQ,array($_REQUEST['lc'],$upcs[0])); + + $fetchQ = $dbc->prepare_statement("SELECT upc FROM upcLike WHERE likeCode=?"); + $fetchR = $dbc->exec_statement($fetchQ,array($_REQUEST['lc'])); + $upcs = array(); + while($w = $dbc->fetch_row($fetchR)) + $upcs[] = $w[0]; + } + } + + include('laneUpdates.php'); + include($FANNIE_ROOT.'classlib2.0/data/models/ProductsModel.php'); + $xQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc) VALUES (?"); + foreach($upcs as $upc){ + $up = array( + 'normal_price'=>$price, + 'tax'=>$tax, + 'foodstamp'=>$fs, + 'department'=>$dept, + 'scale'=>$scale, + 'discount'=>$disc, + 'qttyEnforced'=>$qttyForce, + 'description'=>$desc + ); + ProductsModel::update($upc, $up); + if ($upc == $_REQUEST['upc'] && $_REQUEST['olditem'] == 0){ + $dbc->exec_statement($xQ,array($upc)); + } + updateProductAllLanes($upc); + } + if(count($upcs)==1) + echo "Item $upcs[0] updated
        "; + else + echo "Multiple items updated
        "; + printf("[ View Last Item ]
        ", + $_REQUEST['upc']); + + } +} + +echo ""; +echo "Item Maintenance"; +echo ""; +echo "
        "; + echo "".$row['upc'].""; + printf("
        Price + \$ + %s +
        Dept Tax
        FS Scale
        QtyFrc NoDisc
        Likecode: + %s
        Manufacturer: "; + echo (!empty($row['manufacturer'])?$row['manufacturer']:'n/a'); + echo "
        Distributor: "; + echo (!empty($row['distributor'])?$row['distributor']:'n/a'); + echo "
        Last modified: "; + echo (!empty($row['modified'])?$row['modified']:'Unknown'); + echo "
        +"; +echo "
        "; +echo " + +
        or description
        "; +echo " "; +echo "
        "; +echo 'Refresh Page'; +echo ""; + +?> + diff --git a/fannie/item/handheld/handheld.php b/fannie/item/handheld/handheld.php new file mode 100644 index 000000000..d7a488d31 --- /dev/null +++ b/fannie/item/handheld/handheld.php @@ -0,0 +1,316 @@ + +Item Maintenance + + + + + + + + + + + +prepare_statement($query); + $result = $dbc->exec_statement($query,$args); + $num = $dbc->num_rows($result); + if ($num > 1){ + echo "Multiple items found
        "; + while($row=$dbc->fetch_row($result)){ + printf("%s
        ", + $row['upc'],$row['description']); + } + echo ""; + return; + } + else if (is_numeric($_REQUEST['upc']) && ($num == 1 || $num == 0)){ + $row = array(); + if ($num == 1) + $row = $dbc->fetch_row($result); + else { + $row['upc'] = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + $row['description'] = "New Item"; + $row['normal_price'] = 0; + $row['discounttype'] = 0; + $row['special_price'] = 0; + $row['department'] = 1; + $row['tax'] = 0; + $row['foodstamp'] = 0; + $row['discount'] = 1; + $row['scale'] = 0; + $row['qttyEnforced'] = 0; + $row['likeCode'] = ""; + $row['manufacturer'] = ""; + $row['distributor'] = ""; + $row['modified'] = ""; + } + echo ""; + echo "
        "; + echo "", + $row['description']); + + printf("",$row['normal_price'],$row['upc'], + (($row['discounttype']>0 && $row['special_price'] != 0)? + sprintf("On Sale @ \$%.2f",$row['special_price']):"")); + + $departments = array(); + $deptQ = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); + $deptR = $dbc->exec_statement($deptQ); + while($deptW = $dbc->fetch_row($deptR)) + $departments[$deptW[0]] = $deptW[1]; + echo ""; + + $taxrates = array(); + $taxrates[0] = "NoTax"; + $taxQ = $dbc->prepare_statement("SELECT id,description FROM taxrates ORDER BY id"); + $taxR = $dbc->exec_statement($taxQ); + while($taxW = $dbc->fetch_row($taxR)) + $taxrates[$taxW[0]] = $taxW[1]; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + printf("", + $row['upc'],(empty($row['likeCode'])?'None': + $row['likeCode'].' '.$row['likeCodeDesc'])); + + echo ""; + + echo ""; + + echo ""; + + printf("",$row['likeCode']); + printf("",$row['upc']); + printf("",$num); + + echo ""; + return; + } + else { + echo "Error: No item found for: ".$_REQUEST['upc']."
        "; + } + } + elseif(isset($_REQUEST['submit2'])){ + $upcs = array(); + $upcs[] = $_REQUEST['upc']; + $dept = $_REQUEST['dept']; + $tax = $_REQUEST['tax']; + $price = $_REQUEST['price']; + $scale = isset($_REQUEST['scale'])?1:0; + $fs = isset($_REQUEST['fs'])?1:0; + $qttyForce = isset($_REQUEST['qttyForce'])?1:0; + $disc = isset($_REQUEST['nodisc'])?0:1; + $desc = $_REQUEST['desc']; + + if (!empty($_REQUEST['lc'])){ + // drop from like code, re-add if appropriate + $delQ = $dbc->prepare_statement("DELETE FROM upcLike WHERE upc=?"); + $delR = $dbc->exec_statement($delQ, array($upcs[0])); + if (is_numeric($_REQUEST['lc']) && $_REQUEST['lc'] != 0 && $_REQUEST['lc'] != -1){ + $insQ = $dbc->prepare_statement("INSERT INTO upcLike (likeCode,upc) + VALUES (?,?)"); + $insR = $dbc->exec_statement($insQ,array($_REQUEST['lc'],$upcs[0])); + + $fetchQ = $dbc->prepare_statement("SELECT upc FROM upcLike WHERE likeCode=?"); + $fetchR = $dbc->exec_statement($fetchQ,array($_REQUEST['lc'])); + $upcs = array(); + while($w = $dbc->fetch_row($fetchR)) + $upcs[] = $w[0]; + } + } + + include('laneUpdates.php'); + include($FANNIE_ROOT.'classlib2.0/data/models/ProductsModel.php'); + $xQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc) VALUES (?"); + foreach($upcs as $upc){ + $up = array( + 'normal_price'=>$price, + 'tax'=>$tax, + 'foodstamp'=>$fs, + 'department'=>$dept, + 'scale'=>$scale, + 'discount'=>$disc, + 'qttyEnforced'=>$qttyForce, + 'description'=>$desc + ); + ProductsModel::update($upc, $up); + if ($upc == $_REQUEST['upc'] && $_REQUEST['olditem'] == 0){ + $dbc->exec_statement($xQ,array($upc)); + } + updateProductAllLanes($upc); + } + if(count($upcs)==1) + echo "Item $upcs[0] updated
        "; + else + echo "Multiple items updated
        "; + printf("[ View Last Item ]
        ", + $_REQUEST['upc']); + + } +} + +echo ""; +echo "Item Maintenance"; +echo ""; +echo "
        "; + echo "".$row['upc'].""; + printf("
        Price + \$ + %s +
        Dept Tax
        FS Scale
        QtyFrc NoDisc
        Likecode: + %s
        Manufacturer: "; + echo (!empty($row['manufacturer'])?$row['manufacturer']:'n/a'); + echo "
        Distributor: "; + echo (!empty($row['distributor'])?$row['distributor']:'n/a'); + echo "
        Last modified: "; + echo (!empty($row['modified'])?$row['modified']:'Unknown'); + echo "
        +"; +echo "
        "; +echo " + +
        or description
        "; +echo ''; +echo " "; +echo "
        "; +echo ""; + + +?> + diff --git a/fannie/item/handheld/hhLike.php b/fannie/item/handheld/hhLike.php new file mode 100644 index 000000000..9385504a9 --- /dev/null +++ b/fannie/item/handheld/hhLike.php @@ -0,0 +1,115 @@ +prepare_statement("DELETE FROM upcLike WHERE upc=?"); + $dbc->exec_statement($delQ,array($upc)); + + if (isset($_REQUEST['currentLC']) && $_REQUEST['currentLC'] != 0){ + $insQ = $dbc->prepare_statement("INSERT INTO upcLike (likeCode,upc) VALUES (?,?)"); + $dbc->exec_statement($insQ,array($_REQUEST['currentLC'],$upc)); + } + + header("Location: handheld.php?submit=Submit&upc=".$upc); + return; +} + +?> + +Change Likecode + + + +Error: No item
        "; + return; +} + +$upc = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + +$descQ = $dbc->prepare_statement("SELECT description FROM products WHERE upc=?"); +$descR = $dbc->exec_statement($descQ,array($upc)); +$desc = array_pop($dbc->fetch_row($descR)); + +$lcQ = $dbc->prepare_statement("SELECT likeCode FROM upcLike WHERE upc=?"); +$lcR = $dbc->exec_statement($lcQ,array($upc)); +$lc = $dbc->num_rows($lcR)>0?array_pop($dbc->fetch_row($lcR)):0; + +$lclistQ = "SELECT likeCode,likeCodeDesc FROM likeCodes ORDER BY likeCode"; +$lclistR = $dbc->exec_statement($lclistQ); +$lcs = array(); +$lcs[0] = 'None'; +while($lclistW = $dbc->fetch_row($lclistR)){ + $lcs[$lclistW[0]] = $lclistW[1]; +} + +printf("Likecode settings for: %s + %s",$upc,$desc); +echo "
        "; +echo "
        "; +printf("",$upc); +echo "

        "; + +echo ""; + +echo "
        "; + +echo ""; + +echo "
        "; +echo "Items in the likecode $lc
        "; +$query = $dbc->prepare_statement("SELECT u.upc,p.description FROM upcLike AS u + INNER JOIN products AS p ON p.upc=u.upc + WHERE u.likeCode=? + ORDER BY u.upc"); +$result = $dbc->exec_statement($query,array($lc)); +while($row = $dbc->fetch_row($result)){ + printf("%s %s
        ", + $row[0],$row[0],$row[1]); +} + + +?> + + + diff --git a/fannie/item/handheld/hhSale.php b/fannie/item/handheld/hhSale.php new file mode 100644 index 000000000..da240441d --- /dev/null +++ b/fannie/item/handheld/hhSale.php @@ -0,0 +1,147 @@ +prepare_statement("UPDATE products SET special_price=? + WHERE upc=?"); + $dbc->exec_statement($prodQ, array($price,$upc)); + + $batchQ = $dbc->prepare_statement("UPDATE batchList SET salePrice=? + WHERE upc=? AND batchID=?"); + $dbc->exec_statement($batchQ,array($price,$upc,$batchID)); + + updateProductAllLanes($upc); + header("Location: handheld.php?submit=Submit&upc=".$upc); + return; +} +elseif (isset($_REQUEST['submitUnsale'])){ + $upc = $_REQUEST['upc']; + $batchID = $_REQUEST['batchID']; + + $prodQ = $dbc->prepare_statement("UPDATE products SET special_price=0, + discounttype=0,start_date='1900-01-01', + end_date='1900-01-01' WHERE upc=?"); + $dbc->exec_statement($prodQ, array($upc)); + + $batchQ = $dbc->prepare_statement("DELETE FROM batchList WHERE + upc=? AND batchID=?"); + $dbc->exec_statement($batchQ, array($upc,$batchID)); + + updateProductAllLanes($upc); + header("Location: handheld.php?submit=Submit&upc=".$upc); + return; +} + +?> + +Edit Sale Price + + + +Error: No item"; + return; +} + +$upc = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + +$descQ = $dbc->prepare_statement("SELECT description,discounttype,special_price,start_date,end_date + FROM products WHERE upc=?"); +$descR = $dbc->exec_statement($descQ, array($upc)); +$row = $dbc->fetch_row($descR); + +if ($row['discounttype'] == 0){ + echo "Error: Item $upc doesn't appear to be one sale"; +} + +$batchQ = $dbc->prepare_statement("SELECT l.batchID,b.batchName FROM batchList as l + INNER JOIN batches AS b ON b.batchID=l.batchID + WHERE l.upc=? AND " + .$dbc->datediff($dbc->now(),'b.startdate')." >= 0 AND " + .$dbc->datediff($dbc->now(),'b.enddate')." <= 0 "); +$batchR = $dbc->exec_statement($batchQ, array($upc)); +if ($dbc->num_rows($batchR) == 0){ + $lcQ = $dbc->prepare_statement("SELECT likeCode FROM upcLike WHERE upc=?"); + $lcR = $dbc->exec_statement($lcQ, array($upc)); + $lc = $dbc->num_rows($lcR)>0?array_pop($dbc->fetch_row($lcR)):0; + + $batchQ = $dbc->prepare_statement("SELECT l.batchID,b.batchName FROM batchList as l + INNER JOIN batches AS b ON b.batchID=l.batchID + WHERE l.upc=? AND " + .$dbc->datediff($dbc->now(),'b.startdate')." >= 0 AND " + .$dbc->datediff($dbc->now(),'b.enddate')." <= 0 "); + $batchR = $dbc->exec_statement($batchQ, array('LC'.$lc)); +} + +if ($dbc->num_rows($batchR) == 0){ + echo "Error: can't find a batch containing item $upc"; + return; +} + +$batchW = $dbc->fetch_row($batchR); + +echo ""; +printf("%s %s
        ",$upc,$row['description']); +printf("Sale Price: \$ +
        ",$row['special_price']); +printf("Starts: %s
        Ends: %s
        ",$row['start_date'],$row['end_date']); +printf("Batch: %s",$batchW['batchName']); +printf("",$upc); +printf("
        ",$batchW['batchID']); + +echo ""; + +echo "
        "; + +echo ""; + +echo "
        "; + +echo ""; + +echo "
        "; + + + +?> + + diff --git a/fannie/item/handheld/hhStatus.php b/fannie/item/handheld/hhStatus.php new file mode 100644 index 000000000..c1d38949a --- /dev/null +++ b/fannie/item/handheld/hhStatus.php @@ -0,0 +1,224 @@ + +Item Status + + + + + + + + + + + +"; +echo 'Home'; +echo '

        '; +echo "Item Status"; +echo "

        "; +echo " +"; +echo "
        "; +echo " + +
        or description
        "; +echo ''; +echo " "; +echo "
        "; + +if(isset($_REQUEST['upc']) && !empty($_REQUEST['upc'])){ + if (isset($_REQUEST['submit1'])){ + $query = "SELECT p.upc,p.description,p.normal_price,p.special_price, + p.department,p.tax,p.foodstamp,p.scale,p.qttyEnforced,p.discount, + p.discounttype,x.manufacturer,x.distributor,u.likeCode,l.likeCodeDesc, + p.modified + FROM products AS p LEFT JOIN prodExtra AS x ON p.upc=x.upc + LEFT JOIN upcLike AS u ON p.upc=u.upc LEFT JOIN likeCodes AS l + ON l.likeCode=u.likeCode "; + $args = array(); + if (!is_numeric($_REQUEST['upc'])){ + $query .= "WHERE p.description like ?"; + $args[] = '%'.$_REQUEST['upc'].'%'; + } + else { + switch($_REQUEST['ntype']){ + case 'Brand Prefix': + $query .= "WHERE p.upc LIKE ?"; + $args[] = '%'.$_REQUEST['upc'].'%'; + break; + case 'SKU': + $query .= "INNER JOIN vendorItems AS v ON p.upc=v.upc + WHERE v.sku=?"; + $args[] = $_REQUEST['upc']; + break; + case 'UPC': + default: + $query .= "WHERE p.upc=?"; + $args[] = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + break; + } + } + $query .= " ORDER BY p.description"; + + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($query,$args); + $num = $dbc->num_rows($result); + if ($num > 1){ + while($row=$dbc->fetch_row($result)){ + printf("%s
        ", + $row['upc'],$row['description']); + } + } + else if ($num == 0){ + echo 'No item found'; + } + else if (is_numeric($_REQUEST['upc']) && $num == 1){ + $row = $dbc->fetch_row($result); + echo "", + $row['description']); + + printf("",$row['normal_price'], + (($row['discounttype']>0 && $row['special_price'] != 0)? + sprintf("On Sale @ \$%.2f",$row['special_price']):"")); + + $departments = array(); + $deptQ = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); + $deptR = $dbc->exec_statement($deptQ); + while($deptW = $dbc->fetch_row($deptR)) + $departments[$deptW[0]] = $deptW[1]; + echo ""; + + $taxrates = array(); + $taxrates[0] = "NoTax"; + $taxQ = $dbc->prepare_statement("SELECT id,description FROM taxrates ORDER BY id"); + $taxR = $dbc->exec_statement($taxQ); + while($taxW = $dbc->fetch_row($taxR)) + $taxrates[$taxW[0]] = $taxW[1]; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + printf("", + (empty($row['likeCode'])?'None': + $row['likeCode'].' '.$row['likeCodeDesc'])); + + echo ""; + + echo ""; + + echo ""; + } + else { + echo "Error: No item found for: ".$_REQUEST['upc']."
        "; + } + } +} + +?> + + diff --git a/fannie/item/handheld/index.php b/fannie/item/handheld/index.php new file mode 100644 index 000000000..8577fe969 --- /dev/null +++ b/fannie/item/handheld/index.php @@ -0,0 +1,35 @@ + + + + Handheld tools + + + + + + diff --git a/fannie/item/hobartcsv/csv_output/README b/fannie/item/hobartcsv/csv_output/README new file mode 100755 index 000000000..8b6e1b090 --- /dev/null +++ b/fannie/item/hobartcsv/csv_output/README @@ -0,0 +1,6 @@ +This is data gate weigh's input +directory. If that's a separate +machine, share the directory +(windows file sharing) & mount it +here via samba. Again, writable +by apache. diff --git a/fannie/item/hobartcsv/csvfiles/README b/fannie/item/hobartcsv/csvfiles/README new file mode 100644 index 000000000..e64a18040 --- /dev/null +++ b/fannie/item/hobartcsv/csvfiles/README @@ -0,0 +1,4 @@ +This is a temp directory for +accumulating CSV files before handing +them off to data gate weigh. It should +be writable by apache. diff --git a/fannie/item/hobartcsv/delete.php b/fannie/item/hobartcsv/delete.php new file mode 100755 index 000000000..99f1cc6bc --- /dev/null +++ b/fannie/item/hobartcsv/delete.php @@ -0,0 +1,42 @@ +prepare_statement("DELETE FROM scaleItems WHERE plu=?"); + $result = $dbc->exec_statement($query,array('002'.$plu.'000000')); + + deleteitem($plu); + echo "Item delete requested
        "; + echo "Delete another"; + +} +else { + echo "

        Delete item from scale but retain in POS

        "; + echo ""; + echo "PLU/UPC: "; + echo ""; + echo ""; + echo ""; +} + +include($FANNIE_ROOT."src/footer.html"); + +?> diff --git a/fannie/item/hobartcsv/parse.php b/fannie/item/hobartcsv/parse.php new file mode 100755 index 000000000..1edcbb6f2 --- /dev/null +++ b/fannie/item/hobartcsv/parse.php @@ -0,0 +1,66 @@ + diff --git a/fannie/item/hobartcsv/read.php b/fannie/item/hobartcsv/read.php new file mode 100755 index 000000000..0e2df4f4e --- /dev/null +++ b/fannie/item/hobartcsv/read.php @@ -0,0 +1,100 @@ + 0, + 'Price' => 0, + 'Item Description' => 0, + 'Item Type' => 0, + 'By Count' => 0, + 'Tare 01' => 0, + 'Shelf Life' => 0); + +$line = fgets($fp); // first line - definitions + +// regexing here is to handle quoted fields containing +// commas (i.e., ingrdient lists). The preg_split +// mechanism produces some weirdness due to the fact that +// I'm capturing the whole entry and [nearly] doubles +// the results, but it should still be accurate +$expr = "/([^,\\\"]*?|\\\".*?\\\"),/"; +//echo $expr."
        "; +$data = preg_split($expr,$line,-1,PREG_SPLIT_DELIM_CAPTURE); + +for($i = 0; $i < count($data); $i++){ + if (array_key_exists($data[$i],$targets)) + $targets[$data[$i]] = $i; +} + +// parse additional lines +echo "
        "; + echo "".$row['upc'].""; + printf("
        Price + \$ + %s +
        Dept Tax
        FS Scale
        QtyFrc NoDisc
        Likecode: + %s
        Manufacturer: "; + echo (!empty($row['manufacturer'])?$row['manufacturer']:'n/a'); + echo "
        Distributor: "; + echo (!empty($row['distributor'])?$row['distributor']:'n/a'); + echo "
        Last modified: "; + echo (!empty($row['modified'])?$row['modified']:'Unknown'); + echo "
        "; +while($line = fgets($fp)){ + $data = preg_split($expr,$line,-1,PREG_SPLIT_DELIM_CAPTURE); + echo ""; + $current_plu = ''; + foreach ($targets as $i){ + if ($i == $targets['PLU Number']){ + // make the plu 4 digit + $temp = str_pad($data[$i],3,"0",STR_PAD_LEFT); + $temp = str_pad($temp,4,"0",STR_PAD_RIGHT); + // make the plu into a upc + $temp = str_pad("002".$temp,13,"0",STR_PAD_RIGHT); + $current_plu = $temp; + echo ""; + $checkQ = $sql->prepare_statement("select upc from products where upc=?"); + $checkR = $sql->exec_statement($checkQ,array($temp)); + if ($sql->num_rows($checkR) == 0){ + fputs($err,"UPC $temp not present in Products\n\n"); + break; + } + $checkQ = $sql->prepare_statement("select plu from scaleItems where plu=?"); + $checkR = $sql->exec_statement($checkQ,array($temp)); + if ($sql->num_rows($checkR) == 0){ + $addQ = $sql->prepare_statement("insert into scaleItems (plu,exceptionprice,class) values (?,0,NULL)"); + $addR = $sql->exec_statement($addQ,array($temp)); + } + } + else { + if ($i == $targets['Price']){ + $upQ = $sql->prepare_statement("update scaleItems set price=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($data[$i],$current_plu)); + } + else if ($i == $targets['Item Description']){ + $temp = preg_replace("/<.*?>/","",$data[$i]); // trim out html + $temp = preg_replace("/\'/","",$temp); // trim out apostrophes + $upQ = $sql->prepare_statement("update scaleItems set itemdesc=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($temp,$current_plu)); + } + else if ($i == $targets['Item Type']){ + $temp = 1; + if ($data[$i] == 'Random Weight') + $temp = 0; + $upQ = $sql->prepare_statement("update scaleItems set weight=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($temp,$current_plu)); + } + else if ($i == $targets['By Count']){ + $upQ = $sql->prepare_statement("update scaleItems set bycount=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($data[$i],$current_plu)); + } + else if ($i == $targets['Tare 01']){ + $upQ = $sql->prepare_statement("update scaleItems set tare=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($data[$i],$current_plu)); + } + else if ($i == $targets['Shelf Life']){ + $upQ = $sql->prepare_statement("update scaleItems set shelflife=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($data[$i],$current_plu)); + } + echo ""; + } + } + echo ""; +} + + +?> diff --git a/fannie/item/hobartcsv/read_et.php b/fannie/item/hobartcsv/read_et.php new file mode 100755 index 000000000..6825d97ca --- /dev/null +++ b/fannie/item/hobartcsv/read_et.php @@ -0,0 +1,57 @@ + 0, + 'Expanded Text' => 0); + +$line = fgets($fp); // first line - definitions + +// regexing here is to handle quoted fields containing +// commas (i.e., ingrdient lists). The preg_split +// mechanism produces some weirdness due to the fact that +// I'm capturing the whole entry and [nearly] doubles +// the results, but it should still be accurate +$expr = "/([^,\\\"]*?|\\\".*?\\\"),/"; +//echo $expr."
        "; +$data = preg_split($expr,$line,-1,PREG_SPLIT_DELIM_CAPTURE); + +for($i = 0; $i < count($data); $i++){ + if (array_key_exists($data[$i],$targets)) + $targets[$data[$i]] = $i; +} + +// parse additional lines +echo "
        $temp$data[$i]
        "; +while($line = fgets($fp)){ + $data = preg_split($expr,$line,-1,PREG_SPLIT_DELIM_CAPTURE); + echo ""; + $current_plu = ''; + foreach ($targets as $i){ + if ($i == $targets['Expanded Text Number']){ + // make the plu 4 digit + $temp = str_pad($data[$i],3,"0",STR_PAD_LEFT); + $temp = str_pad($temp,4,"0",STR_PAD_RIGHT); + // make the plu into a upc + $temp = str_pad("002".$temp,13,"0",STR_PAD_RIGHT); + $current_plu = $temp; + echo ""; + } + else { + $temp = ltrim($data[$i],"\""); // lose quote + $temp = rtrim($temp,"\""); // lose quote + $temp = preg_replace("/\\r?/","\n",$temp); // breaks to newlines + $temp = preg_replace("/\'/","",$temp); // lose apostrophes + $temp = preg_replace("/<.*?>/","",$temp); // lose html tags + $upQ = $sql->prepare_statement("update scaleItems set text=? where plu=?"); + $upR = $sql->exec_statement($upQ,array($temp,$current_plu)); + echo ""; + } + } + echo ""; +} + + +?> diff --git a/fannie/item/hobartcsv/writecsv.php b/fannie/item/hobartcsv/writecsv.php new file mode 100755 index 000000000..0c41e6c1f --- /dev/null +++ b/fannie/item/hobartcsv/writecsv.php @@ -0,0 +1,131 @@ +",$fixed_text); + fputs($fp,"WriteOneExpandedText,{$plu[$i]},\"{$text[$i]}\"\r\n"); + } + } + else { + // do word wrapping: + // blow the string apart on newlines + $text_lines = explode('\n',$text); + $fixed_text = ""; + // wordwrap each section and glue 'em back together + // (this maintains manual newlines by the person entering + // data) + foreach ($text_lines as $str){ + //echo $str; + $fixed_text .= wordwrap($str,50,"\n") . "\n"; + } + // change newlines to break tags so the scale + // won't choke on them + $text = preg_replace("/\\n/","
        ",$fixed_text); + //echo $text."
        "; + fputs($fp,"WriteOneExpandedText,{$plu},\"{$text}\"\r\n"); + } + + fclose($fp); +} + +function delete_item($filename,$scaletype,$scaleip,$department,$plu){ + $fp = fopen($filename,"w+"); + fputs($fp,"Record Type,Task Department,Task Destination,Task Destination Device,Task Destination Type\r\n"); + fputs($fp,"ExecuteOneTask,{$department},{$scaleip},{$scaletype},SCALE\r\n"); + fputs($fp,"Record Type,PLU Number\r\n"); + if (is_array($plu)){ + foreach ($plu as $p){ + fputs($fp,"DeleteOneItem,$p\r\n"); + } + } + else + fputs($fp,"DeleteOneItem,$plu\r\n"); + + fclose($fp); + +} + +function delete_text($filename,$scaletype,$scaleip,$department,$plu){ + $fp = fopen($filename,"w+"); + fputs($fp,"Record Type,Task Department,Task Destination,Task Destination Device,Task Destination Type\r\n"); + fputs($fp,"ExecuteOneTask,{$department},{$scaleip},{$scaletype},SCALE\r\n"); + fputs($fp,"Record Type,Expanded Text Number\r\n"); + if (is_array($plu)){ + foreach ($plu as $p){ + fputs($fp,"DeleteOneExpandedText,$p\r\n"); + } + } + else + fputs($fp,"DeleteOneExpandedText,$plu\r\n"); + + fclose($fp); + +} +?> + diff --git a/fannie/item/images/badUPC.php b/fannie/item/images/badUPC.php new file mode 100644 index 000000000..5744d67f7 --- /dev/null +++ b/fannie/item/images/badUPC.php @@ -0,0 +1,32 @@ +prepare_statement("SELECT upc FROM productUser where upc=?"); +$p2 = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); +$dh = opendir('new'); +while( ($file = readdir($dh)) !== False){ + + $exts = explode('.',$file); + $e = strtolower(array_pop($exts)); + if ($e != "png" && $e != "gif" && $e != "jpg" && $e != "jpeg") + continue; + + $u = array_pop($exts); + if (!is_numeric($u)) continue; + + $upc = str_pad($u,13,'0',STR_PAD_LEFT); + + $r1 = $dbc->exec_statement($p1,array($upc)); + if ($dbc->num_rows($r1) > 0) + continue; + + $r2 = $dbc->exec_statement($p2,array($upc)); + if ($dbc->num_rows($r2) > 0) + continue; + + echo "UPC: $u
        "; + echo ""; + echo "
        "; +} +?> diff --git a/fannie/item/images/import.php b/fannie/item/images/import.php new file mode 100644 index 000000000..1b14dd59c --- /dev/null +++ b/fannie/item/images/import.php @@ -0,0 +1,43 @@ +prepare_statement("SELECT upc FROM productUser where upc=?"); +$p2 = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); +$upP = $dbc->prepare_statement("UPDATE productUser SET photo=? WHERE upc=?"); +$dh = opendir('new'); +while( ($file = readdir($dh)) !== False){ + $exts = explode(".",$file); + + $e = strtolower(array_pop($exts)); + if ($e != "png" && $e != "gif" && $e != "jpg" && $e != "jpeg") + continue; + + $u = array_pop($exts); + if (!is_numeric($u)) continue; + + $upc = str_pad($u,13,'0',STR_PAD_LEFT); + + $r1 = $dbc->exec_statement($p1,array($upc)); + if ($dbc->num_rows($r1) > 0){ + echo "UPC $upc found in productUser\n"; + $upR = $dbc->exec_statement($upP,array($file,$upc)); + rename('new/'.$file,'done/'.$file); + rename('new/'.$u.'.thumb.'.$e, + 'done/'.$u.'.thumb.'.$e); + } + else { + $r2 = $dbc->exec_statement($p2,array($upc)); + if ($dbc->num_rows($r2) > 0){ + echo "UPC $upc found in products\n"; + } + else { + echo "UPC $upc not found\n"; + } + } +} + +?> diff --git a/fannie/item/import/DepartmentImportPage.php b/fannie/item/import/DepartmentImportPage.php new file mode 100644 index 000000000..b3ec90c65 --- /dev/null +++ b/fannie/item/import/DepartmentImportPage.php @@ -0,0 +1,128 @@ + array( + 'name' => 'dept_no', + 'display_name' => 'Dept #', + 'default' => 0, + 'required' => True + ), + 'desc' => array( + 'name' => 'desc', + 'display_name' => 'Name', + 'default' => 1, + 'required' => True + ), + 'margin' => array( + 'name' => 'margin', + 'display_name' => 'Margin', + 'default' => 2, + 'required' => False + ), + 'tax' => array( + 'name' => 'tax', + 'display_name' => 'Tax', + 'default' => 3, + 'required' => False + ), + 'fs' => array( + 'name' => 'fs', + 'display_name' => 'FS', + 'default' => 4, + 'required' => False + ) + ); + + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $dn_index = $this->get_column_index('dept_no'); + $desc_index = $this->get_column_index('desc'); + $margin_index = $this->get_column_index('margin'); + $tax_index = $this->get_column_index('tax'); + $fs_index = $this->get_column_index('fs'); + + // prepare statements + $insP = $dbc->prepare_statement("INSERT INTO departments (dept_no,dept_name,dept_tax,dept_fs, + dept_limit,dept_minimum,dept_discount,modified,modifiedby) + VALUES (?,?,?,?,50.00,0.01,1,".$dbc->now().",1)"); + + $marP = $dbc->prepare_statement("INSERT INTO deptMargin (dept_ID,margin) VALUES (?,?)"); + + $scP = $dbc->prepare_statement("INSERT INTO deptSalesCodes (dept_ID,salesCode) VALUES (?,?)"); + + foreach($linedata as $line){ + // get info from file and member-type default settings + // if applicable + $dept_no = $line[$dn_index]; + $desc = $line[$desc_index]; + $margin = ($margin_index !== False) ? $line[$margin_index] : 0; + if ($margin > 1) $margin /= 100.00; + $tax = ($tax_index !== False) ? $line[$tax_index] : 0; + $fs = ($fs_index !== False) ? $line[$fs_index] : 0; + + if (!is_numeric($dept_no)) continue; // skip header/blank rows + + if (strlen($desc) > 30) $desc = substr($desc,0,30); + + $insR = $dbc->exec_statement($insP,array($dept_no,$desc,$tax,$fs)); + + $insR = $dbc->exec_statement($marP,array($dept_no, $margin)); + + $insR = $dbc->exec_statement($scP,array($dept_no, $dept_no)); + } + return True; + } + + function form_content(){ + return '
        Instructions + Upload a CSV or XLS file containing departments numbers, descriptions, margins, + and optional tax/foodstamp settings. Unless you know better, use zero and + one for tax and foodstamp columns. +
        A preview helps you to choose and map spreadsheet fields to the database. +
        The uploaded file will be deleted after the load. +

        '; + } + + function results_content(){ + return 'Import completed successfully'; + } +} +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new DepartmentImportPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/item/import/ItemImportIndex.php b/fannie/item/import/ItemImportIndex.php new file mode 100644 index 000000000..475ff9ec4 --- /dev/null +++ b/fannie/item/import/ItemImportIndex.php @@ -0,0 +1,48 @@ + + + draw_page(); +} +?> diff --git a/fannie/item/import/ProductImportPage.php b/fannie/item/import/ProductImportPage.php new file mode 100644 index 000000000..ae2a68909 --- /dev/null +++ b/fannie/item/import/ProductImportPage.php @@ -0,0 +1,152 @@ + array( + 'name' => 'upc', + 'display_name' => 'UPC', + 'default' => 0, + 'required' => True + ), + 'desc' => array( + 'name' => 'desc', + 'display_name' => 'Description', + 'default' => 1, + 'required' => True + ), + 'price' => array( + 'name' => 'price', + 'display_name' => 'Price', + 'default' => 2, + 'required' => True + ), + 'dept' => array( + 'name' => 'dept', + 'display_name' => 'Department #', + 'default' => 3, + 'required' => False + ) + ); + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $defaults_table = array(); + $defQ = $dbc->prepare_statement("SELECT dept_no,dept_tax,dept_fs,dept_discount FROM departments"); + $defR = $dbc->exec_statement($defQ); + while($defW = $dbc->fetch_row($defR)){ + $defaults_table[$defW['dept_no']] = array( + 'tax' => $defW['dept_tax'], + 'fs' => $defW['dept_fs'], + 'discount' => $defW['dept_discount'] + ); + } + + $upc_index = $this->get_column_index('upc'); + $desc_index = $this->get_column_index('desc'); + $price_index = $this->get_column_index('price'); + $dept_index = $this->get_column_index('dept'); + + $ret = True; + $checks = (FormLib::get_form_value('checks')=='yes') ? True : False; + foreach($linedata as $line){ + // get info from file and member-type default settings + // if applicable + $upc = $line[$upc_index]; + $desc = $line[$desc_index]; + $price = $line[$price_index]; + $dept = ($dept_index !== False) ? $line[$dept_index] : 0; + $tax = 0; + $fs = 0; + $discount = 1; + if ($dept_index !== False){ + if (isset($defaults_table[$dept]['tax'])) + $tax = $defaults_table[$dept]['tax']; + if (isset($defaults_table[$dept]['discount'])) + $discount = $defaults_table[$dept]['discount']; + if (isset($defaults_table[$dept]['fs'])) + $fs = $defaults_table[$dept]['fs']; + } + + // upc cleanup + $upc = str_replace(" ","",$upc); + $upc = str_replace("-","",$upc); + if (!is_numeric($upc)) continue; // skip header(s) or blank rows + + if ($checks) + $upc = substr($upc,0,strlen($upc)-1); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + if (strlen($desc) > 35) $desc = substr($desc,0,35); + + $try = ProductsModel::update($upc,array( + 'description' => $desc, + 'normal_price' => $price, + 'department' => $dept, + 'tax' => $tax, + 'foodstamp' => $fs, + 'discount' => $discount + )); + if ($try === False){ + $ret = False; + $this->error_details = 'There was an error importing UPC '.$upc; + } + } + return $ret; + } + + function form_content(){ + return '
        Instructions + Upload a CSV or XLS file containing product UPCs, descriptions, prices, + and optional department numbers +
        A preview helps you to choose and map columns to the database. +
        The uploaded file will be deleted after the load. +

        '; + } + + function preview_content(){ + return ' + Remove check digits from UPCs'; + } + + function results_content(){ + return 'Import completed successfully'; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new ProductImportPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/item/import/SubdeptImportPage.php b/fannie/item/import/SubdeptImportPage.php new file mode 100644 index 000000000..9a88fc989 --- /dev/null +++ b/fannie/item/import/SubdeptImportPage.php @@ -0,0 +1,102 @@ + array( + 'name' => 'sn', + 'display_name' => 'SubDept #', + 'default' => 0, + 'required' => True + ), + 'desc' => array( + 'name' => 'desc', + 'display_name' => 'Name', + 'default' => 1, + 'required' => True + ), + 'dn' => array( + 'name' => 'dn', + 'display_name' => 'Dept #', + 'default' => 2, + 'required' => True + ) + ); + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $sn_index = $this->get_column_index('sn'); + $desc_index = $this->get_column_index('desc'); + $dn_index = $this->get_column_index('dn'); + + $insP = $dbc->prepare_statement("INSERT INTO subdepts (subdept_no,subdept_name,dept_ID) + VALUES (?,?,?)"); + + foreach($linedata as $line){ + // get info from file and member-type default settings + // if applicable + $dept_no = $line[$dn_index]; + $desc = $line[$desc_index]; + $subdept_no = $line[$sn_index]; + + if (!is_numeric($subdept_no)) continue; // skip header/blank rows + + if (strlen($desc) > 30) $desc = substr($desc,0,30); + + $insR = $dbc->exec_statement($insP,array($subdept_no,$desc,$dept_no)); + } + return True; + } + + function form_content(){ + return '
        Instructions + Upload a CSV or XLS file containing subdept numbers, names, and what department + number they belong to. +
        A preview helps you to choose and map spreadsheet fields to the database. +
        The uploaded file will be deleted after the load. +

        '; + } + + function results_content(){ + return 'Import completed successfully'; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new SubdeptImportPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/item/import/UploadAnyFile.php b/fannie/item/import/UploadAnyFile.php new file mode 100644 index 000000000..448dbf6b4 --- /dev/null +++ b/fannie/item/import/UploadAnyFile.php @@ -0,0 +1,136 @@ +tpath = sys_get_temp_dir()."/misc/"; + $this->mode = 'form'; + /* Is this a request-to-upload or an initial display of the form? */ + if (FormLib::get_form_value('MAX_FILE_SIZE') != '' && FormLib::get_form_value('doUpload') != ''){ + $this->mode = 'process'; + } + return True; + } + + /** + Process an upload + @return HTML string explaining results + */ + function process_file(){ + if (!is_dir($this->tpath)) mkdir($this->tpath); + /* rm any files in $tpath - probably not a good idea + $dh = opendir($tpath); + while (($file = readdir($dh)) !== false) { + if (!is_dir($tpath.$file)) unlink($tpath.$file); + } + closedir($dh); + */ + + if ($_FILES['upload']['error'] != UPLOAD_ERR_OK){ + $msg = "Error uploading file
        "; + $msg .= "Error code is: ".$_FILES['upload']['error'].'
        '; + $msg .= 'Details'; + } + + + $tmpfile = $_FILES['upload']['tmp_name']; + $path_parts = pathinfo($_FILES['upload']['name']); + /* Could base a routine for upzipping an uploaded .zip on this, + which as it stands is specialized for a UNFI price update. + if ($path_parts['extension'] == "zip"){ + move_uploaded_file($tmpfile,$tpath."unfi.zip"); + $output = system("unzip {$tpath}unfi.zip -d $tpath &> /dev/null"); + unlink($tpath."unfi.zip"); + $dh = opendir($tpath); + while (($file = readdir($dh)) !== false) { + if (!is_dir($tpath.$file)) rename($tpath.$file,$tpath."unfi.csv"); + } + closedir($dh); + } + else { Not a .zip } + */ + + $out = move_uploaded_file($tmpfile, $this->tpath."{$path_parts['basename']}"); + + return "Done. File is in ".$this->tpath.$path_parts['basename']."
        + This directory may be deleted on reboot.
        "; + } + + /** + Call appropriate method depending on whether the + form has been submitted. + */ + function body_content(){ + if ($this->mode == 'form') + return $this->upload_form(); + elseif ($this->mode == 'process') + return $this->process_file(); + else + return 'An unknown error occurred.'; + } + + /** + Draw upload form + @return HTML string containing form + */ + function upload_form(){ + ob_start(); + ?> + + + + Filename: + +
        Best if the file is <2MB. +
        The file will be placed in tpath; ?> + + draw_page(); +} +?> diff --git a/fannie/item/import/index.php b/fannie/item/import/index.php new file mode 100644 index 000000000..76da0b0be --- /dev/null +++ b/fannie/item/import/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/item/import/loadWEFCTorontoProducts.php b/fannie/item/import/loadWEFCTorontoProducts.php new file mode 100644 index 000000000..38a6e9a88 --- /dev/null +++ b/fannie/item/import/loadWEFCTorontoProducts.php @@ -0,0 +1,1407 @@ + interpret a "blank" or -1 price as follows: + - if it's for an existing product, maintain the current price as in IS4C at the time of the upload + EL> UPDATE, assigning all fields except price and cost. + - if it's for a new product (as for a new UPC / scan code), then default to the department margin price. + EL> INSERT, using dept margin, but no price. inUse = 0. + EL> ?"department margin price" - meaningless + - for [new?]products that have no price, there is also no case cost + (I don't have one! The cost of broccoli changes constantly...). + How would you recommend I handle this situation? + Change name and meaning of former UNIT_PRICE to SET_PRICE and former SET_PRICE to CALC_PRICE + The newly-named SET_PRICE is still the preferred one. + Populate productUser.description with $brand . $description + 15Jan13 EL Fix products.scale missing in INSERT. + 14Jan13 EL New layout of source data, for NEW_Products.txt of this day. + Several additions for table products. + Data now has real tax codes. + products.pricemethod (q_strict) values not settled at Mike's end. + 24Oct12 EL New layout of source data, for 2012.10.23_-_Products_Fork.txt onwards. + 20Oct12 EL Populate prodExtra, which is used in fannie/item/productList reports. + Support deleteing data files from form choice. + 10Oct12 EL Source col Z for scale/each. Change test to use SCALE instead of DEPT_NAME. + Support truncating or not truncating tables from form choice. + 6Oct12 EL Changes for new Department scheme. + 3Oct12 EL Fix error in margin/Markup assignment. + Prefer price from col O "Price" to calculating price. + 25Sep12 EL Changes to columns and data formats. + 18Sep12 EL Treat CaseCost = -1 as a flag for data known to be incomplete and + ignore the record silently. + + 6Sep12 Eric Lee loadWEFCTorontoProducts.php , based on + loadWEFCTorontoDepts.php , based on + fannie/batches/UNFI/load-scripts/loadUNFIprices.php +--commentz } +*/ + +/* #'F--FUNCTIONALITY - - - - - - - - - - - - - - - - - - - - - - + -=proposed o=in-progress +=in-production x=removed + + + Add records to products + - Option to truncate table + o Interface + - Operation + + Option to overwrite on UPC match + + Interface + + Operation + + Lookup to departments on dept_name to get dept_no + + Lookup to deptMargin on dept_ID to get margin + + Populate vendorItems. May be useful for labels. + - Option to delete file + + + Preserve, the file-splitting apparatus, altho the file here is not big enough + to need it. + + Defeat the file-splitting. + + - May want an option to upload the CSV. In the model, upload is a separate script. + +*/ + + +/* + This page merits a little explanation. Here's the basic rundown: + We take a provided csv file, parse out the info we need, + calculate margins, and stick it into the database. + + This gets complicated because the csv files can easily be large + enough to run headlong into PHP's memory limit. To address that, + I take this approach: + + * split the csv file into 2500 line chunks + * make a list of these chunks + * process one of these files + * redirect back to this page (resetting the memory limit) + and process the next file +*/ + +/* configuration for your module - Important */ +include("../../config.php"); +require($FANNIE_ROOT.'src/csv_parser.php'); +require($FANNIE_ROOT.'src/mysql_connect.php'); +require($FANNIE_ROOT.'src/tmp_dir.php'); + +$tpath = sys_get_temp_dir()."/misc/"; + +// Are we dev-side? +$isposdev = preg_match("/0A-38/", php_uname('n'))?True:False; + +/* Based on whether we have the name of a file to load, + is this a request-to-upload or delete, or an initial display of the get-file-to-process form? +*/ +if ( isset($_REQUEST['product_csv']) && $_REQUEST['product_csv'] != "" ) { + + $product_csv = $_REQUEST['product_csv']; + + /* EL Not pertinent to departments or WEFC products + require($FANNIE_ROOT.'batches/UNFI/lib.php'); + $VENDOR_ID = getVendorID(basename($_SERVER['SCRIPT_FILENAME'])); + if ($VENDOR_ID === False){ + echo "Error: no vendor has this load script"; + exit; + } + */ + + $PRICEFILE_USE_SPLITS = False; + //$PRICEFILE_USE_SPLITS = True; + + // Messages to display when the run finished. + $messages = array(); + $mct = -1; + $messages[++$mct] = "Issues and Information:"; + + if ( isset($_REQUEST['deleteFile']) ) { + if ( unlink("{$tpath}{$product_csv}") ) { + $messages[++$mct] = "$product_csv deleted."; + } else { + $messages[++$mct] = "$product_csv could not be deleted."; + } + $filestoprocess = array(); + } + // Process the file + else { + + // The tables affected by this script. + $productTables = array("products", "productUser", "products_WEFC_Toronto", "vendorItems", "prodExtra"); + + /* + filestoprocess is the array of split files. + If it hasn't been created yet, it implies this is the first pass. + So the csv is split and a list of splits is built. + On 2nd+ pass take the existing list of splits from GET. + */ + $filestoprocess = array(); + $i = 0; + $fp = 0; + // We've already done this. + //$tpath = sys_get_temp_dir()."/misc/"; + if ($PRICEFILE_USE_SPLITS){ + if (!isset($_GET["filestoprocess"])){ + system("split -l 2500 {$tpath}{$product_csv} {$tpath}DEPTSPLIT"); + $dir = opendir($tpath); + while ($current = readdir($dir)){ + if (!strstr($current,"DEPTSPLIT")) + continue; + $filestoprocess[$i++] = $current; + } + + if ( isset($_REQUEST['clear_products']) && ! isset($_REQUEST['dry_run'])) { + foreach ($productTables as $table) { + $truncateQ = "truncate table $table"; + $truncateR = $dbc->query($truncateQ); + if ( ! $truncateR ) { + $messages[++$mct] = "** Error: Failed: $truncateQ"; + } else { + $messages[++$mct] = "Table $table truncated (emptied)"; + } + } + $messages[++$mct] = ""; + } + /* EL Maybe, if doing vendorItems + $delQ = "DELETE FROM vendorItems WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + $delQ = "DELETE FROM vendorSRPs WHERE vendorID=$VENDOR_ID"; + $delR = $dbc->query($delQ); + */ + } + else { + $filestoprocess = unserialize(base64_decode($_GET["filestoprocess"])); + } + } + else { + if ( isset($_REQUEST['clear_products']) && ! isset($_REQUEST['dry_run'])) { + foreach ($productTables as $table) { + $truncateQ = "truncate table $table"; + $truncateR = $dbc->query($truncateQ); + if ( ! $truncateR ) { + $messages[++$mct] = "** Error: Failed: $truncateQ"; + } else { + $messages[++$mct] = "Table $table truncated (emptied)"; + } + } + $messages[++$mct] = ""; + } + $filestoprocess[] = "$product_csv"; + } + + // Remove one (there may only be one) split from the list and process it. + $current = array_pop($filestoprocess); + + // #'C --CONSTANTS- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + /* Indexes to the array returned by csv_parser, the column number in the .csv file. + "first" = 0. + { + */ + $UPC = 0; // G:A:0 "Supplier UPC". UPC or PLU. + $SEARCH = 1; // B:B:1 search_description, for productUser.description +// $STD = 1; // B:B:1 STD y/n "in use". Values? + $VENDOR_NAME = 2; // E:C:2 Distributor + $ORDER_CODE = 3; // -:D:3 ORDER_CODE, from Buying system + $DEPT_NAME = 4; // F:E:4 Department + $BRAND_NAME = 5; // C:F:5 Brand deptMargin.dept_ID +// 14Jan13 PRODUCER_MEMBER apparently dropped. +// $PRODUCER_MEMBER = 8; // S:I:8 Producer Member +// 15Jan13 New. +// G - "in use" (this is new, as per email this evening) + $IN_USE = 6; // -:G:6 products:inUse +// H - qtyfrc (1 for true, 0 or blank for false, new as per email this evening) + $QTYFRC = 7; // -:H:7 products:qttyEnforced +// I - like code (has to be manually created in IS4C) + $MIXMATCH = 8; // -:I:8 products:mixmatchcode +// J - qcount (count of items of a quantity price, like "3" for "3 lemons for a dollar", blank means no q price) + $QUANTITY = 9; // -:J:9 products:quantity qcount +// K - qprice (the quantity price, new this evening, blank for none) + $GROUP_PRICE = 10; // -:K:10 products:groupprice qprice +// L - qstrict (whether or not the quantity price requires that many at least, +// or just over-rides the per-unit price, new this evening, +// 1 for true -> 2, 0 or blank for false -> 1 ) +// Error if 2 and normal_price = "" + $PRICE_METHOD = 11; // -:L:11 products:pricemethod qstrict +// 15Jan13 End New. +// +// 15Feb13 New. + $DISCOUNTABLE = 12; // -:M:12 Item discountable 0=no 1=yes + $DISCOUNT_TYPE = 13; // -:N:13 Whether to use "special" i.e. sale prices and for which kind of customer: +/* +discounttype indicates if an item is on sale + 0 => not on sale + 1 => on sale for everyone + 2 => on sale for members +Values greater than 2 may be used, but results will +vary based on whose code you're running +*/ + $DESCRIPTION = 14; // D:O:14 Item + $CASE_COST = 15; // H:P:15 "Case Cost" 9999.99 + $CASE_SIZE = 16; // J:Q:16 "Case Size" 99, but 99.9999 pounds per container for bulk + $UNIT_SIZE = 17; // K:R:17 "Unit Size" 99 + $UNIT_NAME = 18; // L:S:18 "Units "g"/"ml"/"bags" + $UNIT_COST = 19; // M:T:19 Cost per Unit 999.99 "Cost" +// + $CALC_PRICE = 20; // N:U:20 "Set Price" but in fact CASE_COST/CASE_SIZE + $SET_PRICE = 21; // O:V:21 "Price" Jiggered price +// + $TAX_TYPE = 22; // R:W:22 Tax 0/1/2 "Taxes" + $MARKUP = 23; // S:X:23 Markup "150%" -> 1.42 "Markup" + $SKU = 24; // D:Y:24 Vendor SKU +// + $SALE_PRICE = 25; // Z:25 "Sale Price" + $SALE_COST = 26; // AA:26 "Sale Cost" + $TEMP_COST = 27; // AB:27 "Temp Cost" ? Case sale price. +// + $CATEGORY_SD = 28; // W:AC:28 Category SuperDept. +// + $SCALE = 30; // Z:AE:30 BULK. "BULK" means scale=1 + $VENDOR_ID = 34; // AE:AI:34 Vendor ID. +// +// 30Apr13 Columns AJ/35 - BN/64 are for Qualification flags. +// "" means not-assigned, probably implies No. 0=No 1=Yes +//-- :End } + + + // Defaults for: + // products table + $dept_fs = 0; + $dept_limit = 999.00; + $dept_minimum = 0.01; + $dept_discount = 0; + // $modified = "now()"; // Use literal $dbc->(now()) + $modifiedby = 1; + + $inUse = 0; + $qttyEnforced = 0; + // For group pricing. + $quantity = 0; + $groupprice = 0; + $pricemethod = 0; + $quantity = 0; + + /* Default values for products table fields that are not assigned from data derived from the spreadsheet. + * Maybe they s/b prefixed p_ for uniqueness. + */ + //2 + $special_price=0; // %.2f + $specialpricemethod=0; // %d + //3 + $specialgroupprice=0; // %.2f + $specialquantity=0;// %d + $start_date="'1900-01-01'"; // %s + $end_date="'1900-01-01'"; // %s + //4 + $scaleprice=0; // %.2f + $advertised=0; // %d + //5 + $discounttype=0;// %d + $tareweight=0; // %.2f + $wicable=0;// %d + //6 + $idEnforced=0;// %d + $numflag=0;// %d + $subdept=0;// %d + $deposit=0; // %.2f + // End of products defaults. + + // Counters for items sold by each method. Report at end. + $weightCount = 0; + $eachCount = 0; + + /* Cache departments and deptMargin data in an array on dept_name */ + $defaults_table = array(); + $defQ = "SELECT dept_no, dept_name, dept_tax, dept_fs, dept_discount, margin + FROM departments, deptMargin + WHERE dept_no = dept_ID"; + $defR = $dbc->query($defQ); + while($defW = $dbc->fetch_row($defR)){ + $departments[$defW['dept_name']] = array( + 'id' => $defW['dept_no'], + 'tax' => $defW['dept_tax'], + 'fs' => $defW['dept_fs'], + 'discount' => $defW['dept_discount'], + 'margin' => $defW['margin'] + ); + } + + // First line/record is column heads. + $skip_one = isset($_REQUEST['skip_one'])?True:False; + + // Lines read from CSV, including column headings. + $lineCount = 0; + // Product records written. + $productCount = 0; + // Breakdown of writes: + $insertCount = 0; + $updateCount = 0; + // Records flagged as incomplete. + $incompletes = 0; + + // SET_PRICE in source data exists or no. + $hasPrice = 0; + + // Known in products. Only matters if !$hasPrice + $inProducts = 0; + + // Order code + $order_code = 'NULL'; + + // #'L --LOOP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + $fp = fopen($tpath.$current,'r'); + while( !feof($fp) ) { + + $line = fgets($fp); + $line = preg_replace("/[\r\n|\n]$/", "", $line); + if ( preg_match("/^\t*$/", $line) ) { + continue; + } + $lineCount++; + /* skip header row + Maybe better to let the tax-check-trick handle this. + */ + if ($skip_one){ + $skip_one = False; + continue; + } + + //EL The data is tab-delimited, but no embedded commas. + // But fields with embedded commas are quoted. + // Why not just use explode()? + /* csv parser takes a comma-, or other-, separated line and returns its elements + as an array */ + $data = csv_parser($line, '"', "\t"); + if ( !is_array($data) ) { + echo "Line $lineCount is not a valid CSV line."; + $messages[++$mct] = "Line $lineCount is not a valid CSV line."; + continue; + } + + if ( $data[$TAX_TYPE] == "#NAME?" ) { + $data[$TAX_TYPE] = ""; + } + + // 17Jan13 Case-cost tests formerly here. + + /* Compose values for the db in vars with same names as table rows. + Assume table products unless qualified. + */ + + // Row cannot be valid without this. + // Skipping the row of column labels is done later. + // In early versions some don't have numbers yet, useless. + if ( $data[$UPC] == "" ) { + $messages[++$mct] = "
        Skipping line $lineCount {$data[$DESCRIPTION]} because it has no UPC/PLU."; + continue; + } + + $upc = $data[$UPC]; + // Incoming data is expected to be %012d and UPC's have checkdigit at the end which must be removed. + // Check for the expected base format. + if ( ! preg_match("/^\d{12}/", $upc) ) { + $messages[++$mct] = "
        Skipping line $lineCount {$data[$DESCRIPTION]} because its UPC >{$upc}< is not 12 digits."; + continue; + } else { + // If it's a PLU (up to 7 digits with left-0 padding), leave as-is. + if ( ! preg_match("/^0{5}/", $upc) ) { + // Remove checkdigit. + $upc = substr($upc, 0, 11); + } + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + } + + // Don't include duplicate UPC. + if ( !isset($_REQUEST['overwrite_products']) ) { + $checkQ = "SELECT upc FROM products WHERE upc = " . $dbc->escape($upc); + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) > 0) { + $messages[++$mct] = "
        Skipping line $lineCount upc duplicate: $upc for all tables."; + continue; + } + } + + if ( $data[$ORDER_CODE] == '' ) { + $order_code = 'NULL'; + } elseif ( is_numeric($data[$ORDER_CODE]) ) { + if ( $data[$ORDER_CODE] <= 9999999 ) { + $order_code = $data[$ORDER_CODE]; + } else { + $messages[++$mct] = "
        Order number >{$data[$ORDER_CODE]}< for upc: $upc is too long; set to NULL."; + $order_code = 'NULL'; + } + } else { + $messages[++$mct] = "
        Order number >{$data[$ORDER_CODE]}< for upc: $upc is not numeric; set to NULL."; + $order_code = 'NULL'; + } + + // PV description defaults to receipt description + $data[$DESCRIPTION] = trim($data[$DESCRIPTION]); + if ( $data[$SEARCH] == "" ) { + $data[$SEARCH] = $data[$DESCRIPTION]; + } + $data[$SEARCH] = trim($data[$SEARCH]); + + // Compose description: "Juice - Orange 946ml" + // Used in products and 17Jan13 productUser. + $package = ""; + // For productUser.sizing, #NvendorItems.size + $sizing = ""; + // For products.size, XvendorItems.units + $unitsize = trim($data[$UNIT_SIZE]); + if ( $data[$UNIT_SIZE] != "" && $data[$UNIT_NAME] != "" ) { + $package = " " . $data[$UNIT_SIZE] . "" . $data[$UNIT_NAME]; + $sizing = $data[$UNIT_SIZE] . " " . $data[$UNIT_NAME]; + } + $plen = strlen($package); + $description = $data[$DESCRIPTION]; + $dlen = strlen($description); + $MAX_DESC_LEN = 30; + $wlen = ($dlen + $plen); + + if ( $wlen <= $MAX_DESC_LEN ) { + $description .= $package; + } else { + $description = substr($description,0,($dlen - ($wlen - $MAX_DESC_LEN))) . $package; + } + //echo "
        $lineCount ", strlen($description), " $description\n"; + + if ( array_key_exists($data["$DEPT_NAME"], $departments) ) { + $department = $departments[$data["$DEPT_NAME"]]['id']; + $departmentTax = $departments[$data["$DEPT_NAME"]]['tax']; + $departmentFS = $departments[$data["$DEPT_NAME"]]['fs']; + $departmentDiscount = $departments[$data["$DEPT_NAME"]]['discount']; + $departmentMargin = $departments[$data["$DEPT_NAME"]]['margin']; + if ( $data[$SCALE] == "BULK" ) { + $scale = 1; + $weightCount++; + } + else { + $scale = 0; + $eachCount++; + } + } + else { + $messages[++$mct] = "Line $lineCount Department >{$data[$DEPT_NAME]}< is not known."; + echo "$messages[$mct]"; + continue; + } + + // If these are not set in the product record use the department defaults. + if ( $data[$TAX_TYPE] != "" ) { + $tax = $data[$TAX_TYPE]; + } + else { + $tax = $departmentTax; + } + + if ( $data[$MARKUP] == "#NAME?" ) { + $data[$MARKUP] = ""; + } + //if ( is_numeric($data[$MARKUP]) != "" ) {} + if ( is_numeric($data[$MARKUP]) ) { + $margin = sprintf("%.5f",(($data[$MARKUP]-1)/$data[$MARKUP])); + //$messages[++$mct] = "Line $lineCount created margin $margin"; + /* From when we were markup-based. + $margin = $data[$MARKUP]; + if ( $margin == "0.00" ) { + $margin = "1.00"; + $messages[++$mct] = "Line $lineCount changed markup 0.00 to 1.00"; + } + */ + } + else { + $margin = $departmentMargin; + //$messages[++$mct] = "Line $lineCount department margin $margin"; + } + // 6Sep2012 These never come from the spreadsheet. + $fs = $departmentFS; + + /* 15Feb13 Support getting discountable from spreadsheet. + if ( strpos($data[$DEPT_NAME],"B") === 0 ) + $data[$DISCOUNTABLE] = "1"; + */ + if ( $data[$DISCOUNTABLE] == "" ) { + $discount = $departmentDiscount; + } + elseif ( $data[$DISCOUNTABLE] != "0" && $data[$DISCOUNTABLE] != "1" ) { + $messages[++$mct] = "Line $lineCount invalid discountable >{$data[$DISCOUNTABLE]}< : set to $departmentDiscount"; + $discount = $departmentDiscount; + } + else { + $discount = $data[$DISCOUNTABLE]; + } + + /* 15Feb13 Support getting discounttype from spreadsheet. + if ( $data[$DISCOUNT_TYPE] == "" ) { + $discounttype = 0; + } + elseif ( !is_numeric($data[$DISCOUNT_TYPE]) || ($data[$DISCOUNT_TYPE] != "0" && $data[$DISCOUNT_TYPE] != "1" && $data[$DISCOUNT_TYPE] != "2") ) { + $messages[++$mct] = "Line $lineCount invalid discounttype >{$data[$DISCOUNT_TYPE]}< : set to 0"; + $discounttype = 0; + } + else { + $discounttype = $data[$DISCOUNT_TYPE]; + } + */ + + // Margin sanity check. + if ( !preg_match("/^\d\.\d+$/", $margin) || ($margin * 1.00) < 0.00 || ($margin * 1.00) > 0.50 ) { + $messages[++$mct] = "Line $lineCount $description has suspect margin >{$margin} : markup >{$data[$MARKUP]}<"; + } + /* Markup sanity check. + if ( !preg_match("/^\d\.\d+$/", $margin) || ($margin * 1.00) < 1.00 || ($margin * 1.00) > 3.00 ) { + $messages[++$mct] = "Line $lineCount $description has suspect markup >{$margin}<"; + } + */ + + /* 's 17Jan13 The special cases of no price. + * May also need to check CALC_PRICE + * If the item already exists: + * - UPDATE except for prices + * If the item does no exist: + * - INSERT ?without prices + */ + if ( $data[$SET_PRICE] == "" || $data[$SET_PRICE] == "-1" ) { + $hasPrice = 0; + $checkQ = "SELECT upc FROM products WHERE upc = " . $dbc->escape($upc); + $checkR = $dbc->query($checkQ); + if ($dbc->num_rows($checkR) > 0) { + $inProducts = 1; + } else { + $inProducts = 0; + } +//$messages[++$mct] = "No price upc: $upc inProducts: $inProducts"; +//echo "
        $messages[$mct]"; + } else { + $hasPrice = 1; + } + + // 20Jun13 Bulk does have CASE_COST, the cost of the bulk container, + // but keep testing SET_PRICE. + // 24Jan13 Change test to SET_PRICE because for bulk there is no CASE_COST. + // 17Jan13 CASE_COST tests moved here. + /* Skip the item if case-cost isn't numeric + this will catch the 'label' line in the first CSV split + since the splits get returned in file system order, + we can't be certain *when* that chunk will come up + */ + if ( $hasPrice && !is_numeric($data[$SET_PRICE]) ) { + $messages[++$mct] = "
        Skipping line $lineCount UPC: {$data[$UPC]} {$data[$DESCRIPTION]} because of invalid price (col V): >{$data[$SET_PRICE]}<"; + continue; + } + + if ( $hasPrice && empty($data[$CASE_COST]) ) { + $messages[++$mct] = "
        Skipping line $lineCount UPC: {$data[$UPC]} {$data[$DESCRIPTION]} because of no case cost (col P): >{$data[$CASE_COST]}<"; + continue; + } + + // Treat CASE_COST == -1 as flag for data known to be incomplete and skip and note. + if ( $data[$CASE_COST] == -1 ) { + $messages[++$mct] = "
        Skipping line $lineCount UPC: {$data[$UPC]} {$data[$DESCRIPTION]} because flagged-as-incomplete item >{$data[$CASE_COST]}<"; + $incompletes++; + continue; + } + + /* Also calculate or compose: + price: (cost/units)*margin + cost: (cost/units) + size: should it default to 1? + */ + $cost = ""; + $normal_price = ""; + $size = ""; + // Or better NULL + if ( !$hasPrice ) + $size = 0; + $unitofmeasure = ""; + if ( $data[$CASE_COST] != "" ) { + $data[$CASE_COST] = sprintf("%.2f", $data[$CASE_COST]); + } + if ( $data[$SET_PRICE] != "" ) { + $data[$SET_PRICE] = sprintf("%.2f", $data[$SET_PRICE]); + } + if ( $data[$UNIT_COST] != "" ) { + $data[$UNIT_COST] = sprintf("%.2f", $data[$UNIT_COST]); + } + + // If price not supplied skip the assignments that involve it + // but still assign $size. + // Prefer the pre-calculated or pre-set price + // 24Jan13 Require CASE_COST + if ( $hasPrice && $data[$CASE_COST] != "" ) { + if ( preg_match("/^\d+\.\d\d$/",$data[$SET_PRICE]) && preg_match("/^\d+\.\d\d$/",$data[$UNIT_COST]) ) { + $normal_price = $data[$SET_PRICE]; + $cost = $data[$UNIT_COST]; + if ( preg_match("/^\d+$/",$data[$CASE_SIZE]) ) { + $size = $data[$CASE_SIZE]; + } else { + $size = ""; + } + //echo "
        1. $lineCount upc >{$upc}< dept_no {$department} *SET_PRICE: {$data[$SET_PRICE]} normal_price >{$normal_price}<"; + // Compare set and calculated prices. For checking margin-based function. Seldom == but ususally ~=. + if ( FALSE && preg_match("/^\d+\.\d\d$/",$data[$CASE_COST]) && preg_match("/^\d+$/",$data[$CASE_SIZE]) && preg_match("/^\d\.\d+$/",$margin) ) { + // Markup-based price + $normal_price2 = sprintf("%.2f", ((($data[$CASE_COST] * 100) / ($data[$CASE_SIZE] * 100)) / (1 - $margin))); + echo "
        "; + if ( $normal_price != $normal_price2 ) { + echo "*****"; + } + echo "1. $lineCount upc >{$upc}< dept_no {$department} SET_PRICE: {$data[$SET_PRICE]} normal_price >{$normal_price}< normal_price2 >{$normal_price2}<"; + } + } + // If no pre-set, or no unit_cost then calculate as needed. + elseif ( preg_match("/^\d+\.\d\d$/",$data[$CASE_COST]) && + (preg_match("/^\d+$/",$data[$CASE_SIZE]) || preg_match("/^\d+\.\d+$/",$data[$CASE_SIZE])) && + preg_match("/^\d\.\d+$/",$margin) ) { + if ( preg_match("/^\d+\.\d\d$/",$data[$SET_PRICE]) ) { + $normal_price = $data[$SET_PRICE]; + } else { + // Markup-based price + $normal_price = sprintf("%.2f", ((($data[$CASE_COST] * 100) / ($data[$CASE_SIZE] * 100)) / (1 - $margin))); + /* Markup-based price + $normal_price = sprintf("%.2f", ((($data[$CASE_COST] * 100) / ($data[$CASE_SIZE] * 100)) * $margin)); + */ + } + $cost = sprintf("%.2f", (($data[$CASE_COST] * 100) / ($data[$CASE_SIZE] * 100))); + $size = $data[$CASE_SIZE]; + //echo "
        2. $lineCount upc >{$upc}< dept_no {$department} SET_PRICE: {$data[$SET_PRICE]} *normal_price >{$normal_price}<"; + } else { + $messages[++$mct] = sprintf("Line $lineCount $description Cannot derive a per-unit price from CASE_COST >%s< CASE_SIZE >%s< margin >%s<.", $data[$CASE_COST], $data[$CASE_SIZE], $margin); + continue; + } + } else { + if ( preg_match("/^\d+$/",$data[$CASE_SIZE]) || preg_match("/^\d+\.\d+$/",$data[$CASE_SIZE]) ) + $size = $data[$CASE_SIZE]; + } + + // May need some massaging/regularization: mL -> ml, gm -> g, ... + $unitofmeasure = $data[$UNIT_NAME]; + + $inUse = ( $data[$IN_USE] != "" ) ? $data[$IN_USE] : 0; + + $qttyEnforced = ( $data[$QTYFRC] != "" ) ? $data[$QTYFRC] : 0; + /* + $qttyEnforced = 0; + if ( $data[$QUANTITY] != "" ) { + $qttyEnforced = $data[$QTYFRC]; + } + */ + + $quantity = ( $data[$QUANTITY] != "" ) ? $data[$QUANTITY] : 0; + + $mixmatchcode = ( $data[$MIXMATCH] != "" ) ? $data[$MIXMATCH] : ""; + + $groupprice = ""; + if ( $data[$GROUP_PRICE] != "" ) { + $groupprice = sprintf("%.2f", $data[$GROUP_PRICE]); + } + + // 0 or 1 or 2. Must default to 0. + $pricemethod = ( $data[$PRICE_METHOD] != "" ) ? $data[$PRICE_METHOD] : 0; + if ( $pricemethod == 2 && $normal_price == "" ) { + $messages[++$mct] = "
        Line $lineCount missing normal_price when pricemethod = 2"; + } + + if ( !$hasPrice && $inProducts ) { + $dbMode = "update"; + $updateCount++; +//$messages[++$mct] = "No price upc: $upc inProducts: $inProducts dmMode: $dbmode\n"; +//echo "
        $messages[$mct]"; + } + else { + $dbMode = "add/replace"; + $insertCount++; + } + + if ( True && !$hasPrice ) { + //echo "
        No price. $dbMode $upc $description"; + $messages[++$mct] = "
        No price. Col V >{$data[$SET_PRICE]}< To $dbMode products. $upc $description"; + } + + /* Check for unknown vendors. + * Report-only on live-side. + * On dev-side, Report if dry-run, add if live. + */ + $vendorID = $data[$VENDOR_ID]; + $vendorName = $data[$VENDOR_NAME]; + if ( is_numeric($vendorID) && $vendorID < 1000 && $vendorName != "" ) { + $venQ = "SELECT * from vendors WHERE vendorID = $vendorID"; + $venR = $dbc->query("$venQ"); + if ( $dbc->num_rows($venR) == 0 ) { + if ( $isposdev ) { + if ( ! isset($_REQUEST['dry_run']) ) { + $venQ = "INSERT INTO vendors (vendorID, vendorName) VALUES ($vendorID, " . $dbc->escape($vendorName) . ")"; + $dbc->query($venQ); + $messages[++$mct] = "Added vendor $vendorID $vendorName"; + } else { + $messages[++$mct] = "Will add vendor $vendorID $vendorName"; + } + } else { + $messages[++$mct] = "Need to add vendor $vendorID $vendorName"; + } + } + } + + + /* Qualifications flags + */ + // Offset of first qualifications flag in $data + $first_flag = 35; + $numflag = 0; + //echo "Start: $numflag\n"; + for ($i=0 ; $i<30 ; $i++) { + if ( + array_key_exists(($first_flag+$i), $data) && + preg_match("/^(1|yes|y|t|true|x)$/", strtolower($data[$first_flag+$i])) + ) + $numflag = $numflag | (1 << $i); + } + + /* All problems should be in $messages[] at this point. + */ + if ( isset($_REQUEST['dry_run']) ) { + continue; + } + + /* --products - - - - */ + /* #'P--PRODUCTS - - - - */ + + $table = "products"; + + if ( $dbMode == "add/replace" ) { + + // Should this depend on inProducts? + if ( isset($_REQUEST['overwrite_products']) ) { + $dbc->query("DELETE FROM products WHERE upc=".$dbc->escape($upc)); + } + + /* + 1 $insQ = sprintf("INSERT INTO products (upc, description, normal_price, + 2 pricemethod, groupprice, quantity, special_price, specialpricemethod, + 3 specialgroupprice, specialquantity, start_date, end_date, department, + 4 size, tax, foodstamp, scale, scaleprice, mixmatchcode, modified, advertised, + 5 tareweight, discount, discounttype, unitofmeasure, wicable, qttyEnforced, + 6 idEnforced, cost, inUse, numflag, subdept, deposit) + 1 VALUES (%s, %s, %.2f, + 2 %d, %.2f, %d, .0, 0, + 3 .0, 0, '1900-01-01', '1900-01-01', %d, + 4 %s, %d, %d, %d, .0, %s, %s, 0, + 5 .0, %d, 0, %s, 0, %d, + 6 0, %.2f, %d, 0, 0, .0, %d)", + 1 $dbc->escape($upc), $dbc->escape($desc), $normal_price, + 2 $pricemethod, $groupprice, $quantity, + 3 $department, + 4 $dbc->escape($unitsize), $tax, $fs, $scale, $dbc->escape($mixmatchcode), $dbc->now(), + 5 $discount, $unitofmeasure, $qttyEnforced, + 6 $cost, $inUse + + 1 upc, description, normal_price, + 2 pricemethod, groupprice, quantity, $special_price=0; $specialpricemethod=0; + 3 $specialgroupprice=0; $specialquantity=0; $start_date="'1900-01-01'"; $end_date="'1900-01-01'"; department, + 4 size, tax, foodstamp, scale, $scaleprice=0; mixmatchcode, modified, $advertised=0; + 5 $tareweight=0; discount, $discounttype=0; unitofmeasure, $wicable=0; qttyEnforced, + 6 $idEnforced=0; cost, inUse, $numflag=0; $subdept=0; $deposit=0) + ); + */ + + /* Default values for products fields that are not assigned from data derived from the spreadsheet. + //2 + $special_price=0; // %.2f + $specialpricemethod=0; // %d + //3 + $specialgroupprice=0; // %.2f + $specialquantity=0;// %d + $start_date="'1900-01-01'"; // %s + $end_date="'1900-01-01'"; // %s + //4 + $scaleprice=0; // %.2f + $advertised=0; // %d + //5 + $tareweight=0; // %.2f + $discounttype=0;// %d + $wicable=0;// %d + //6 + $idEnforced=0;// %d + $numflag=0;// %d + $subdept=0;// %d + $deposit=0; // %.2f + */ + + $insQ = sprintf("INSERT INTO products (upc, description, normal_price, + pricemethod, groupprice, quantity, special_price, specialpricemethod, + specialgroupprice, specialquantity, start_date, end_date, department, + size, tax, foodstamp, scale, scaleprice, mixmatchcode, modified, advertised, + tareweight, discount, discounttype, unitofmeasure, wicable, qttyEnforced, + idEnforced, cost, inUse, numflag, subdept, deposit) + VALUES (%s, %s, %.2f, + %d, %.2f, %d, %.2f, %d, + %.2f, %d, %s, %s, %d, + %s, %d, %d, %d, %.2f, %s, %s, %d, + %.2f, %d, %d, %s, %d, %d, + %d, %.2f, %d, %d, %d, %.2f)", + $dbc->escape($upc), $dbc->escape($description), $normal_price, + $pricemethod, $groupprice, $quantity, $special_price, $specialpricemethod, + $specialgroupprice, $specialquantity, $start_date, $end_date, $department, + $dbc->escape($unitsize), $tax, $fs, $scale, $scaleprice, $dbc->escape($mixmatchcode), $dbc->now(), $advertised, + $tareweight, $discount, $discounttype, $dbc->escape($unitofmeasure), $wicable, $qttyEnforced, + $idEnforced, $cost, $inUse, $numflag, $subdept, $deposit); + + /* Woodshed + $insQ = sprintf("INSERT INTO products (upc, description, normal_price, + pricemethod, groupprice, quantity, special_price, specialpricemethod, + specialgroupprice, specialquantity, start_date, end_date, department, + size, tax, foodstamp, scale, scaleprice, mixmatchcode, modified, advertised, + tareweight, discount, discounttype, unitofmeasure, wicable, qttyEnforced, + idEnforced, cost, inUse, numflag, subdept, deposit) + VALUES (%s, %s, %.2f, + %d, %.2f, %d, %.2f, %d, + 3 %.2f, %d, %s, %s, %d, + 4 %d, %d, %d, %d, %.2f, %s, %s, %d, + 5 %.2f, %d, %d, %s, %d, %d, + 6 0, %.2f, %d, 0, 0, .0, %d)", + $dbc->escape($upc), $dbc->escape($description), $normal_price, + 2 + $pricemethod, $groupprice, $quantity, + $special_price=0; // %.2f + $specialpricemethod=0; // %d + 3 + $specialgroupprice=0; // %.2f + $specialquantity=0;// %d + $start_date="'1900-01-01'"; // %s + $end_date="'1900-01-01'"; // %s + $department, + 4 + $size, $tax, $fs, $scale, + $scaleprice=0; // %.2f + $dbc->escape($mixmatchcode), + $dbc->now(), + $advertised=0; // %d + 5 + $tareweight=0; // %.2f + $discount, + $discounttype=0;// %d + $dbc->escape($unitofmeasure), + $wicable=0;// %d + $qttyEnforced, + 6 + $idEnforced=0;// %d + $cost, $inUse, + $numflag=0;// %d + $subdept=0;// %d + $deposit=0); // %.2f + //woodshed + */ + + if ( $insQ == "" ) { + echo "
        $table $dbMode query empty\n"; + } else { + $dbc->query($insQ); + } + + // End of products insert + } + else { + // UPDATE. Only the non-price and non-cost fields that come from the spreadsheet. + $updQ = "UPDATE products SET + description = " . $dbc->escape($description) .", + department = $department, + size = " . $dbc->escape($unitsize) .", + tax = $tax, + scale = $scale, + mixmatchcode = " . $dbc->escape($mixmatchcode) . ", + modified = " . $dbc->now() . ", + discount = $discount, + unitofmeasure = " . $dbc->escape($unitofmeasure) . ", + qttyEnforced = $qttyEnforced, + inUse = $inUse + WHERE upc=".$dbc->escape($upc); + + if ( $updQ == "" ) { + echo "
        $table $dbMode query empty\n"; + } else { + $dbc->query($updQ); + } + } + + /* #'U --productUser - - - - */ + + $table = "productUser"; + + $brand = $data[$BRAND_NAME]; + + $sep = " | "; + + // Description for use by PV Product Verification at lane. + if ( $brand ) { + $search_description = trim(strtoupper($brand)); + } else { + $search_description = trim($data[$DEPT_NAME]); + } + $search_description .= ($sep . $data[$SEARCH]); + if ( trim($package) != "" ) { + $search_description .= ($sep . trim($package)); + } + + if ( $dbMode == "add/replace" ) { + + if ( isset($_REQUEST['overwrite_products']) ) { + $dbc->query("DELETE FROM productUser WHERE upc=".$dbc->escape($upc)); + } + + $insQ = sprintf("INSERT INTO productUser + (upc, description, brand, + sizing, photo, long_text, enableOnline) + VALUES (%s, %s, %s, + %s, '', '', 0)", + $dbc->escape($upc), + $dbc->escape($search_description), + $dbc->escape($brand), + $dbc->escape($sizing)); + + $dbc->query($insQ); + + // insert + } + else { + $updQ = "UPDATE productUser SET + description = ". $dbc->escape($search_description) . ", + brand = ". $dbc->escape($brand) . ", + sizing = ". $dbc->escape($sizing) . + " WHERE upc=".$dbc->escape($upc); + + if ( $updQ == "" ) { + echo "
        $table $dbMode query empty\n"; + } else { + $dbc->query($updQ); + } + } + + /* #'T --products_WEFC_Toronto - - - - */ + $table = "products_WEFC_Toronto"; + + if ( $dbMode == "add/replace" ) { + + if ( isset($_REQUEST['overwrite_products']) ) { + $dbc->query("DELETE FROM products_WEFC_Toronto WHERE upc=".$dbc->escape($upc)); + } + + $insQ = sprintf("INSERT INTO products_WEFC_Toronto (upc, order_code, + description, search_description) + VALUES (%s, %s, + %s, %s)", + $dbc->escape($upc), $order_code, + $dbc->escape($data[$DESCRIPTION]), $dbc->escape($data[$SEARCH]) + ); + + $dbc->query($insQ); + + // insert + } + else { + $updQ = sprintf("UPDATE products_WEFC_Toronto SET + order_code = %s, + description = %s, search_description = %s + WHERE upc=%s", + $order_code, + $dbc->escape($data[$DESCRIPTION]), $dbc->escape($data[$SEARCH]), + $dbc->escape($upc)); + + if ( $updQ == "" ) { + echo "
        $table $dbMode query empty\n"; + } else { + $dbc->query($updQ); + } + } + + /* #'V--vendorItems - - - - */ + $table = "vendorItems"; + + //Done earlier + //$brand = $data[$BRAND_NAME]; + $sku = $data[$SKU]; + // Revert to using unit_cost, i.e. cost. + //$case_cost = $data[$CASE_COST]; + // Can be longer than the earlier one. + $description = substr($data[$DESCRIPTION], 0, 50); + // Use productUser.sizing for size: "300 ml" + // Use unitsize for units: 500, e.g. grams. Not the case size. + $vendorID = $data[$VENDOR_ID]; + $vendorDept = 'NULL'; + // If $size is not an integer, e.g. for BULK, vendorItems.units winds up NULL. + // This may need to be addressed one day. + $vi_size = ($size == 0 || $size == "")?'NULL':$size; + + if ( $dbMode == "add/replace" ) { + + if ( isset($_REQUEST['overwrite_products']) ) { + $dbc->query("DELETE FROM vendorItems WHERE upc=".$dbc->escape($upc)); + } + + $insQ = sprintf("INSERT INTO vendorItems (upc, sku, brand, + description, size, units, cost, vendorDept, vendorID) + VALUES (%s, %s, %s, + %s, %s, %s, %.2f, %s, %d)", + $dbc->escape($upc), $dbc->escape($sku), $dbc->escape($brand), +//old $dbc->escape($description), $dbc->escape($unitofmeasure), $unitsize, $cost, $vendorDept, $vendorID); + $dbc->escape($description), $dbc->escape($sizing), $vi_size, $cost, $vendorDept, $vendorID); + + $dbc->query($insQ); + + // insert + } + else { + // All but cost and vendorDept + $updQ = sprintf("UPDATE vendorItems SET + sku = %s, brand = %s, + description = %s, size = %s, units = %s, vendorID = %d + WHERE upc = %s", + $dbc->escape($sku), $dbc->escape($brand), + $dbc->escape($description), $dbc->escape($sizing), $vi_size, $vendorID, + $dbc->escape($upc)); + + if ( $updQ == "" ) { + echo "
        $table $dbMode query empty\n"; + } else { + $dbc->query($updQ); + } + } + + /* #'E--prodExtra - - - - + * Use of this table is deprecated but the item/productList reports use + * the distributor field. + * It seems to be the only place in prod* it's available. + * Unassigned fields variable_pricing, location, case_info I don't know + * what they should contain. + */ + $table = "prodExtra"; + $vendorName = $data[$VENDOR_NAME]; + $case_cost = $data[$CASE_COST]; + + // prodExtra defaults + $pe_variable_pricing = 0; + $pe_location = ""; + $pe_case_info = ""; + + if ( $dbMode == "add/replace" ) { + + if ( isset($_REQUEST['overwrite_products']) ) { + $dbc->query("DELETE FROM prodExtra WHERE upc=".$dbc->escape($upc)); + } + + + $insQ = sprintf("INSERT INTO prodExtra + (upc, distributor, manufacturer, + cost, margin, variable_pricing, + location, case_quantity, case_cost, case_info) + VALUES (%s, %s, %s, + %.2f, %.5f, %d, + %s, %s, %.2f, %s)", + $dbc->escape($upc), $dbc->escape($vendorName), $dbc->escape($brand), + $cost, $margin, $pe_variable_pricing, + $dbc->escape($pe_location), $dbc->escape($size), $case_cost, $dbc->escape($pe_case_info)); + + $dbc->query($insQ); + + // insert + } + else { + //All but: cost, case_cost + $updQ = sprintf("UPDATE prodExtra SET + distributor = %s, manufacturer = %s, + margin = %.5f, variable_pricing = %d, + location = %s, case_quantity = %s, case_info = %s + WHERE upc = %s", + $dbc->escape($vendorName), $dbc->escape($brand), + $margin, $pe_variable_pricing, + $dbc->escape($pe_location), $dbc->escape($size), $dbc->escape($pe_case_info), + $dbc->escape($upc)); + + if ( $updQ == "" ) { + echo "
        $table $dbMode query empty\n"; + } else { + $dbc->query($updQ); + } + } + + // Add unknown vendors. Only dev-side. + if ( False ) { + $venQ = "SELECT * from vendors WHERE vendorID = $vendorID"; + $venR = $dbc->query("$venQ"); + if ( $dbc->num_rows("$venQ") == 0 ) { + $venQ = "INSERT INTO vendors (vendorID, vendorName) VALUES ($vendorID, '" . $dbc->escape($vendorName) . "')"; + $dbc->query($venQ); + $messages[++$mct] = "Added vendor $vendorID $vendorName"; + } + } + + // End of table work. + + $productCount++; + + // Each CSV line + } + + fclose($fp); + + // Process (not delete) + } + + if ( isset($_REQUEST['deleteFile']) ) { + + /* html header, including navbar */ + $page_title = "Done deleteing file"; + $header = "Done deleteing file"; + include($FANNIE_ROOT."src/header.html"); + + // Display messages accumulated during the run. + for ( $n=0; $n$messages[$n]"; + } + } + echo "
        "; + + echo "
        "; + echo "Home: Load WEFC-Toronto Products"; + echo "
        \n"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); + + } else { + + /* + if the filestoprocess list is empty, it means all the splits + have been processed (the load is complete): + - update tables vendorSKUtoPLU, vendorItems, prodExtra. + + stop and print some summary info + including what files were processed + (for sanity's sake) and + + clean up by deleting all the splits + (this is actually important since the + next price file might not split into the same + number of pieces and we process all the splits in + tmp. So it isn't concurrency-safe, either) + + otherwise: + + add the current file to the list of + splits that have already been processed and + + redirect back to this page, passing both lists + (files to be done and file that are already processed) + + serialize & base64 encoding are used to make the + arrays URL-safe + */ + if (count($filestoprocess) == 0){ + + /* html header, including navbar */ + $page_title = "Done loading items"; + $header = "Done loading items"; + include($FANNIE_ROOT."src/header.html"); + + echo "Finished processing Products file
        "; + if ($PRICEFILE_USE_SPLITS){ + echo "Files processed:
        "; + foreach (unserialize(base64_decode($_GET["processed"])) as $p){ + echo $p."
        "; + unlink($tpath.$p); + } + echo $current."
        "; + //unlink($tpath.$current); + } + else { + echo "$product_csv
        "; + } + + if ( isset($_REQUEST['dry_run']) ) + echo "
        Dry run. "; + echo "
        Read $lineCount CSV lines. Wrote $productCount records to the database."; + echo "
          $insertCount add/replace."; + echo "
          $updateCount updates."; + echo "
        $incompletes records flagged as known-to-be incomplete."; + if ( $weightCount == 0 ) { + echo "
        **TROUBLE? 0 items marked to be sold by weight."; + } else { + echo "
        $weightCount items to be sold by weight."; + } + echo "
        $eachCount items to be sold by each."; + echo "
        "; + // Display messages accumulated during the run. + for ( $n=0; $n$messages[$n]"; + } + } + echo "
        "; + + // Not unlink + // unlink($tpath."$product_csv"); + echo "
        You might want to delete: {$tpath}{$product_csv}
        "; + + echo "
        "; + echo "Home: Load WEFC-Toronto Products"; + echo "
        \n"; + + /* html footer */ + include($FANNIE_ROOT."src/footer.html"); + + } + else { + $processed = array(); + if (isset($_GET["processed"])) + $processed = unserialize(base64_decode($_GET["processed"])); + array_push($processed,$current); + + $sendable_data = base64_encode(serialize($filestoprocess)); + $encoded2 = base64_encode(serialize($processed)); + header("Location: loadWEFCTorontoProducts.php?filestoprocess=$sendable_data&processed=$encoded2"); + + } + + // Process (not delete) finish + } + +// /We know the file to process or delete. +} +// Get the file to process and other params. +else { + + /* Form to get the name of csv file to load and launch load. */ + /* html header, including navbar */ + $page_title = "Fannie - Load WEFC-Toronto Products"; + $header = "Load WEFC-Toronto Products"; + include($FANNIE_ROOT.'src/header.html'); + + // Get a list of files + $dh = opendir($tpath); + $opts = "\n"; + $selectSize = 1; + while (($file = readdir($dh)) !== false) { + if ( substr($file, 0, 1) != "." ) { + $opts .= "\n"; + $selectSize++; + } + // With full path. But we don't need that. + //$opts .= "\n"; + } + closedir($dh); + + if ($selectSize > 5) + $selectSize = 5; + +?> + +
        Choose a source CSV file:
        +
        + + + + +
        $temp$temp
        + + + + + + + + + + + + + + + + + + + + +
        First line contains column headings
        Clear 'products' and related tables before load. +
        It is very unlikely from 18Jan2013 onwards that you want to do this unless starting the products table over.
        Overwrite existing 'products' and related records on UPC/PLU match. +
        Items with price -1 will update the existing record rather than overwriting it and be added if there is no existing record.
        Dry run - report problems but don't change the database.
        +
        +   + +
        + + + diff --git a/fannie/item/index.php b/fannie/item/index.php new file mode 100644 index 000000000..f6a94a35b --- /dev/null +++ b/fannie/item/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/item/insertItem_WEFC_Toronto.php b/fannie/item/insertItem_WEFC_Toronto.php new file mode 100644 index 000000000..061cbf5f9 --- /dev/null +++ b/fannie/item/insertItem_WEFC_Toronto.php @@ -0,0 +1,485 @@ +escape($upc); +//$ins_array['upc'] = $dbc->escape($_REQUEST['upc']); +$ins_array['tax'] = isset($_REQUEST['tax'])?$_REQUEST['tax']:0; +$ins_array['foodstamp'] = isset($_REQUEST['FS'])?1:0; +$ins_array['scale'] = isset($_REQUEST['Scale'])?1:0; +$ins_array['deposit'] = isset($_REQUEST['deposit'])?$_REQUEST['deposit']:0; +$ins_array['qttyEnforced'] = isset($_REQUEST['QtyFrc'])?1:0; +$ins_array['discount'] = isset($_REQUEST['NoDisc'])?0:1; +$ins_array['normal_price'] = saveAsMoney($_REQUEST,'price'); +$ins_array['description'] = $dbc->escape($_REQUEST['descript']); +// Package +$string_size = substr(trim($_REQUEST['size']),0,9); +$numeric_size = (is_numeric($string_size))?$string_size:0; +$ins_array['size'] = $dbc->escape($string_size); +$unitofmeasure = substr(trim($_REQUEST['unitofmeasure']),0,15); +$ins_array['unitofmeasure'] = $dbc->escape($unitofmeasure); + +/* set tax and FS to department defaults */ +/* But these fields can be edited on the form. Good to override? */ +$deptSub = 0; +$taxfsQ = "select dept_tax,dept_fs, + dept_discount, + superID FROM + departments as d left join MasterSuperDepts as s on d.dept_no=s.dept_ID"; +$taxfsR = $dbc->query($taxfsQ); +if ($dbc->num_rows($taxfsR) > 0){ + $taxfsW = $dbc->fetch_array($taxfsR); + $ins_array['tax'] = $taxfsW['dept_tax']; + $ins_array['foodstamp'] = $taxfsW['dept_fs']; + $ins_array['discount'] = $taxfsW['dept_discount']; + $deptSub = $taxfsW['superID']; +} + +// Authenticate now that deptSub can be reported. +/* AUTHENTICATION CLASS: pricechange OR audited_pricechange + * Check which uid is trying to add an item. Users w/ pricechange + * permission may have access to all items or only a range of + * subdepartments. + * Audited users can edit all items, but notifications are + * generated immediately + */ +if (!$validatedUser && !$auditedUser && $logged_in){ + $validatedUser = validateUserQuiet('pricechange',$deptSub); +} +$uid = 0; +if ($validatedUser){ + $validatedUID = getUID($validatedUser); + $uid = $validatedUID; +} +elseif ($auditedUser){ + $auditedUID = getUID($auditedUser); + $uid = $auditedUID; + require('audit.php'); + if (!empty($likeCode)) + audit($deptSub,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc,$likeCode); + else + audit($deptSub,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc); +} +if (!$validatedUser && !$auditedUser){ + echo "Please "; + echo ""; + echo "login to add new items"; + return; +} + +/* 1. Insert or update coop-specific product data */ +/* For WEFC_Toronto only + * Store the raw versions of products.description and productUser.description in products_WEFC_Toronto. +*/ +if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == "WEFC_Toronto" ) { + $table_name = "products_{$FANNIE_COOP_ID}"; + if ($dbc->table_exists("$table_name")){ + $del99Q = "DELETE FROM $table_name WHERE upc = '$upc'"; + $delISR = $dbc->query($del99Q); + $coop_array = array("description" => $dbc->escape(substr($_REQUEST['descript'],0,255)), + "search_description" => isset($_REQUEST['puser_description'])?$dbc->escape(substr($_REQUEST['puser_description'],0,255)):''); + $coop_array['upc'] = $dbc->escape($upc); + $dbc->smart_insert("$table_name",$coop_array); + } +} + +$package = ""; +$sizing = ""; +if ( $string_size != "" && $unitofmeasure != "" ) { + $package = " $string_size$unitofmeasure"; + $sizing = "$string_size $unitofmeasure"; +} + +// Compose products.description and productUser.description if wanted. +if ( isset($FANNIE_COMPOSE_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_PRODUCT_DESCRIPTION == "1" ) { + $plen = strlen($package); + $descp = $_REQUEST['descript']; + $dlen = strlen($descp); + $MAX_DESC_LEN = 30; + $wlen = ($dlen + $plen); + + if ( $wlen <= $MAX_DESC_LEN ) { + $ins_array['description'] = $dbc->escape($descp . $package); + } else { + $ins_array['description'] = $dbc->escape(substr($descp,0,($dlen - ($wlen - $MAX_DESC_LEN))) . $package); + } +} +if ( isset($FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION == "1" ) { + $puser_description = strtoupper($_REQUEST['manufacturer']) . ' | ' . $_REQUEST['puser_description'] . ' | ' . $package; + $puser_description = substr($puser_description, 0, 255); +} else { + $puser_description = substr($_REQUEST['puser_description'],0,255); +} + +// Having passed authentication OK to delete both HQ and other-store records. +$del99Q = "DELETE FROM products WHERE upc = '$upc'"; +$delISR = $dbc->query($del99Q); + +$ins_array['department'] = $_REQUEST['department']; +$ins_array['subdept'] = $_REQUEST['subdepartment']; + +$ins_array['cost'] = saveAsMoney($_REQUEST,'cost'); + +// ThreeForDollar fields +// 3 for $1 from fieldset +if ( array_search('ThreeForDollar',$Fannie_Item_Modules) !== False ) { + $ins_array['pricemethod'] = is_numeric($_REQUEST['pricemethod'])?$_REQUEST['pricemethod']:0; + $ins_array['groupprice'] = saveAsMoney($_REQUEST,'groupprice'); + //$ins_array['groupprice'] = is_numeric($_REQUEST['groupprice'])?$_REQUEST['groupprice']:0.00; + $ins_array['quantity'] = is_numeric($_REQUEST['quantity'])?$_REQUEST['quantity']:0; + // 22Feb13 Default to '0' seems odd. + $ins_array['mixmatchcode'] = !empty($_REQUEST['mixmatchcode'])?$dbc->escape($_REQUEST['mixmatchcode']):"'0'"; +} else { + $ins_array['pricemethod'] = 0; + $ins_array['groupprice'] = 0.00; + $ins_array['quantity'] = 0; + $ins_array['mixmatchcode'] = "'0'"; +} + +// Sale fields +if ( array_search('Sale',$Fannie_Item_Modules) !== False ) { + $ins_array['special_price'] = saveAsMoney($_REQUEST,'special_price'); + // 0=not on sale; 1=on sale to all; 2=on sale to members + $ins_array['discounttype'] = is_numeric($_REQUEST['discounttype'])?$_REQUEST['discounttype']:0; + $ins_array['start_date'] = isset($_REQUEST['start_date'])?$dbc->escape($_REQUEST['start_date']):"'1900-01-01'"; + $ins_array['end_date'] = isset($_REQUEST['end_date'])?$dbc->escape($_REQUEST['end_date']):"'1900-01-01'"; + // Sale 3for$1 + $ins_array['specialpricemethod'] = is_numeric($_REQUEST['specialpricemethod'])?$_REQUEST['specialpricemethod']:0; + $ins_array['specialgroupprice'] = saveAsMoney($_REQUEST,'specialgroupprice'); + //$ins_array['specialgroupprice'] = is_numeric($_REQUEST['specialgroupprice'])?$_REQUEST['specialgroupprice']:0.00; + $ins_array['specialquantity'] = is_numeric($_REQUEST['specialquantity'])?$_REQUEST['specialquantity']:0; +} else { + $ins_array['special_price'] = 0.00; + $ins_array['discounttype'] = 0; + $ins_array['start_date'] = "'1900-01-01'"; + $ins_array['end_date'] = "'1900-01-01'"; + $ins_array['specialpricemethod'] = 0; + $ins_array['specialgroupprice'] = 0.00; + $ins_array['specialquantity'] = 0; +} + +// Odds & ends +$ins_array['local'] = isset($_REQUEST['local'])?1:0; +$ins_array['inUse'] = isset($_REQUEST['inUse'])?1:0; +$ins_array['modified'] = $dbc->now(); +// 2Mar13 Not enterable in the form but used in the system. +// hidden on form? Done this way on update. +$ins_array['store_id'] = isset($_REQUEST['store_id'])?$_REQUEST['store_id']:0; +// 2Mar13 Not enterable in the form and not used in the system. +$ins_array['scaleprice'] = 0.00; +$ins_array['advertised'] = 1; +$ins_array['tareweight'] = 0; +$ins_array['wicable'] = 0; +$ins_array['idEnforced'] = 0; +$ins_array['numflag'] = 0; + +/* since the item doesn't exist at all, just insert a master record */ +$resultI = $dbc->smart_insert('products',$ins_array); +/* if we do persistent per-store records +if ($FANNIE_STORE_ID != 0){ + $ins_array['store_id'] = $FANNIE_STORE_ID; + $resultI = $dbc->smart_insert('products',$ins_array); +} +*/ + +/* 2. Replace likecode. */ +// 2Mar13 moved after products insert. +if (isset($_REQUEST['likeCode']) && $_REQUEST['likeCode'] != -1){ + $dbc->query("DELETE FROM upcLike WHERE upc='$upc'"); + $lcQ = "INSERT INTO upcLike (upc,likeCode) VALUES ('$upc',{$_REQUEST['likeCode']})"; + $dbc->query($lcQ); +} + +/* 3. Insert or update productUser */ +if ($dbc->table_exists('productUser')){ + $puser_array = array(); + $puser_array['brand'] = $dbc->escape($_REQUEST['manufacturer']); + $puser_array['description'] = $dbc->escape($puser_description); + $puser_array['sizing'] = $dbc->escape($sizing); + $puser_array['upc'] = $dbc->escape($upc); + // Some productUser fields are not edited in itemMaint.php + $puser_array['enableOnline'] = 0; + $dbc->query("DELETE FROM productUser WHERE upc='$upc'"); + $dbc->smart_insert('productUser',$puser_array); +} + +/* 4. Insert or update vendorItems */ +if ($dbc->table_exists('vendorItems')){ + $vi_array = array(); + $vi_array['sku'] = $dbc->escape(substr($_REQUEST['sku'], 0, 10)); + $vi_array['brand'] = $dbc->escape(substr($_REQUEST['manufacturer'], 0, 50)); + $vi_array['description'] = $dbc->escape(substr($_REQUEST['descript'], 0, 50)); + + $vi_array['cost'] = saveAsMoney($_REQUEST,'case_cost'); + $vi_array['size'] = $dbc->escape($sizing); + if ( is_numeric($_REQUEST['case_quantity']) && $_REQUEST['case_quantity'] > 0 ) + $vi_array['units'] = $_REQUEST['case_quantity']; + else + $vi_array['units'] = 'NULL'; + // Several vendorItems fields are not edited in itemMaint.php + // vendorItems is the only table where a record for the upc may legitimately already exist, + // i.e. do not delete an existing record. + $checkR = $dbc->query("SELECT upc FROM vendorItems WHERE upc='$upc'"); + if ($dbc->num_rows($checkR) == 0){ + $vi_array['upc'] = $dbc->escape($upc); + // vendorID + $checkR = $dbc->query("SELECT vendorID FROM vendorItems WHERE brand={$vi_array['brand']}"); + if ( $dbc->num_rows($checkR) > 0 ) { + $vi_row = $dbc->fetch_row($checkR); + $vi_array['vendorID'] = $vi_row['vendorID']; + } + else { + $vi_array['vendorID'] = 0; + } + $dbc->smart_insert('vendorItems',$vi_array); + } + else { + $dbc->smart_update('vendorItems',$vi_array,"upc='$upc'"); + } +// vendorItems +} + +/* 5. Insert to prodExtra */ +if ($dbc->table_exists('prodExtra')){ + $px_array = array( + 'upc' => $dbc->escape($upc), + 'distributor' => $dbc->escape($_REQUEST['distributor']), + 'manufacturer' => $dbc->escape($_REQUEST['manufacturer']), + 'variable_pricing' => 0, + 'location' => $dbc->escape($_REQUEST['location']), + 'case_info' => "''" + ); + if ( array_search('Cost',$Fannie_Item_Modules) !== False ) { + $px_array['cost'] = saveAsMoney($_REQUEST,'cost'); + //$px_array['cost'] = is_numeric($_REQUEST['cost'])?sprintf("%.2f",$_REQUEST['cost']):0.00; + $px_array['case_cost'] = saveAsMoney($_REQUEST,'case_cost'); + //$px_array['case_cost'] = is_numeric($_REQUEST['case_cost'])?sprintf("%.2f",$_REQUEST['case_cost']):0; + $px_array['case_quantity'] = is_numeric($_REQUEST['case_quantity'])?$dbc->escape($_REQUEST['case_quantity']):"''"; + if ( $ins_array['cost'] != 0 && $ins_array['normal_price'] != 0 ) { + $px_array['margin'] = sprintf("%.2f", 1 -($ins_array['cost'] / $ins_array['normal_price'])); + } else { + $px_array['margin'] = 0.00; + } + } else { + $px_array['cost'] = 0.00; + $px_array['case_quantity'] = "''"; + $px_array['case_cost'] = 0.00; + $px_array['margin'] = 0.00; + } + $dbc->query("DELETE FROM prodExtra WHERE upc='$upc'"); + $dbc->smart_insert('prodExtra',$px_array); +} + +/* 6. Insert to prodUpdate, an audit table. */ +if ($dbc->table_exists("prodUpdate")){ + $pu_array = array( + 'upc' => $dbc->escape($upc), + 'description' => $ins_array['description'], + 'price' => $ins_array['normal_price'], + 'dept' => $ins_array['department'], + 'tax' => $ins_array['tax'], + 'fs' => $ins_array['foodstamp'], + 'scale' => $ins_array['scale'], + 'likeCode' => isset($_REQUEST['likeCode'])?$_REQUEST['likeCode']:0, + 'modified' => $dbc->now(), + 'user' => $uid, + 'forceQty' => $ins_array['qttyEnforced'], + 'noDisc' => $ins_array['discount'], + 'inUse' => $ins_array['inUse'] + ); + $dbc->smart_insert('prodUpdate',$pu_array); +} + +/* 7. Insert to scaleItem */ +if (isset($_REQUEST['s_plu'])){ + $s_plu = substr($upc,3,4); + $scale_array = array(); + $scale_array['plu'] = $upc; + $scale_array['itemdesc'] = $ins_array['description']; + $scale_array['price'] = $ins_array['normal_price']; + if (isset($_REQUEST['s_longdesc']) && !empty($_REQUEST['s_longdesc'])) + $scale_array['itemdesc'] = $dbc->escape($_REQUEST['s_longdesc']); + $scale_array['tare'] = isset($_REQUEST['s_tare'])?$_REQUEST['s_tare']:0; + $scale_array['shelflife'] = isset($_REQUEST['s_shelflife'])?$_REQUEST['s_shelflife']:0; + $scale_array['bycount'] = isset($_REQUEST['s_bycount'])?1:0; + $scale_array['graphics'] = isset($_REQUEST['s_graphics'])?1:0; + $s_type = isset($_REQUEST['s_type'])?$_REQUEST['s_type']:'Random Weight'; + $scale_array['weight'] = ($s_type=="Random Weight")?0:1; + $scale_array['text'] = isset($_REQUEST['s_text'])?$dbc->escape($_REQUEST['s_text']):"''"; + + $s_label = isset($_REQUEST['s_label'])?$_REQUEST['s_label']:'horizontal'; + if ($s_label == "horizontal" && $s_type == "Random Weight") + $s_label = 133; + elseif ($s_label == "horizontal" && $s_type == "Fixed Weight") + $s_label = 63; + elseif ($s_label == "vertical" && $s_type == "Random Weight") + $s_label = 103; + elseif ($s_label == "vertical" && $s_type == "Fixed Weight") + $s_label = 23; + + $scale_array['label'] = $s_label; + $scale_array['excpetionprice'] = 0.00; + $scale_array['class'] = "''"; + + $dbc->query("DELETE FROM scaleItems WHERE plu='$upc'"); + $dbc->smart_insert("scaleItems",$scale_array); + + $action = "WriteOneItem"; + include('hobartcsv/parse.php'); + parseitem($action,$s_plu,trim($scale_array["itemdesc"],"'"), + $scale_array['tare'],$scale_array['shelflife'],$scale_array['price'], + $scale_array['bycount'],$s_type,0.00,trim($scale_array['text'],"'"), + $scale_array['label'],($scale_array['graphics']==1)?121:0); +} + +/* 8. Delete and re-add to product-related tables on the lanes. */ +/* push updates to the lanes */ +include('laneUpdates_WEFC_Toronto.php'); +// change products only +//updateProductAllLanes($upc); +updateAllLanes($upc, array("products", "productUser")); + +/* 9. Display the post-update values and an input for the next edit. */ +/* Display some of the post-update values and an input for the next edit. + * The page contains form elements but there is no submit for the them. + * The record-select input is also displayed in a proper form with a submit. +*/ +$prodQ = "SELECT * FROM products WHERE upc = ".$upc; +$prodR = $dbc->query($prodQ); +$row = $dbc->fetch_array($prodR); + + echo "
        "; + echo ""; + echo ""; + echo "
        UPC".$upc."
        Description".$row['description']."Price\$ ".$row['normal_price']."
        "; + echo ""; + echo ""; + echo ""; + + $dept = $row["department"]; + $query2 = "SELECT * FROM departments where dept_no = ".$row["department"]; + $result2 = $dbc->query($query2); + $row2 = $dbc->fetch_array($result2); + + $subdept = $row["subdept"]; + $query2a = "SELECT * FROM subdepts WHERE subdept_no = ".$row["subdept"]; + $result2a = $dbc->query($query2a); + $row2a = $dbc->fetch_array($result2a); + + echo ""; + + echo ""; + + echo ""; + + echo "
        DeptsubDeptFSScaleQtyFrcNoDiscinUsedeposit"; + echo "
        "; + echo $dept . ' ' . $row2[1]; + echo " "; + echo $subdept . ' ' . $row2a[1]; + echo "
        "; + echo "
        "; + echo "
        "; + echo promptForUPC($upc); + + echo "
        "; + + /* 10. If requested on the capture form, pop a window for making a shelf tag. */ + if (isset($_REQUEST['newshelftag'])){ + echo ""; + } + ?> + + + + diff --git a/fannie/item/item.css b/fannie/item/item.css new file mode 100644 index 000000000..a9cda8b43 --- /dev/null +++ b/fannie/item/item.css @@ -0,0 +1,96 @@ +FORM[name=search] { + text-align: center; +} + +INPUT[name=q] { + width: 200px; +} + +FORM[name=edit] { +} + +FIELDSET { +} + +.edit_row { + height: 2em; + line-height: 2em; + vertical-align: baseline; +} + +.edit_column { + width: 430px; + display: inline-block; + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.edit_subcolumn { + float: left; + width: 50%; +} + +LABEL[for="edit_description"], +LABEL[for="edit_department"], +LABEL[for="edit_subdepartment"] { + display: inline-block; + width: 100px; +} + +INPUT[name="edit_description"] { + width: 286px; +} + +LABEL[for="edit_price"] { + display: inline-block; + width: 100px; +} + +INPUT[name="edit_price"] { + text-align: right; + width: 100px; +} + +LABEL[for="edit_tax"], +LABEL[for="edit_tareweight"], +LABEL[for="edit_size"], +LABEL[for="edit_unitofmeasure"], +LABEL[for="edit_deposit"] { + display: inline-block; + width: 50px; +} + +INPUT[name="edit_tax"], +INPUT[name="edit_tareweight"], +INPUT[name="edit_size"], +INPUT[name="edit_unitofmeasure"], +INPUT[name="edit_deposit"] { + text-align: right; + width: 130px; +} + +LABEL[for="edit_foodstamp"], +LABEL[for="edit_weighed"], +LABEL[for="edit_advertised"], +LABEL[for="edit_discount"], +LABEL[for="edit_wicable"], +LABEL[for="edit_inuse"] { + display: inline-block; + padding-left: 20px; + width: 100px; +} + +#results_similar_products_wrap { + clear: both; + overflow-y: scroll; +} + +#results_similar_products { + margin-left: auto; + margin-right: auto; +} + +INPUT[name="edit_upc"] { + border: 0px; +} \ No newline at end of file diff --git a/fannie/item/item.js b/fannie/item/item.js new file mode 100644 index 000000000..c7805af88 --- /dev/null +++ b/fannie/item/item.js @@ -0,0 +1,115 @@ + // Attached to body.onload +function body_onload() { + document.search.q.focus(); + + if (document.getElementById('results_similar_products')) { + set_boxes(); + } +} + + // Called after similar products table is made + // TODO - Add to body.onresize and error check if table exists +function set_boxes() { + var a=window.innerHeight; + var b=document.getElementById('page_top').offsetHeight; + var c=document.getElementById('page_foot').offsetHeight; + var d=document.search.offsetHeight; + var e=0; + if (document.edit) { + e=document.edit.offsetHeight; + } + + // TODO - Only add the 26 margin when the offsetHeight is positive? + var f=document.getElementById('page_panel_statuses').offsetHeight+26; + + var g=a-b-c-d-e-f-24; + + // If the similar results box will fit and display at least 76px then resize it, if not, set a decent size and force a vertical scroll + if (g>76) { + document.getElementById('results_similar_products_wrap').style.height=g+'px'; + } else { + document.getElementById('results_similar_products_wrap').style.height='300px'; + } +} + +function valid_description(e) { + /* 30 Characters or less, following are not allowed: ' , + */ + // TODO - Wait, do we really not allow single quotes? I forget + var re_description = new RegExp("[+\',]", "g"); + + if (e.value.length > 30 || re_description.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} + +function valid_price(e) { + /* SQL Data Type 'Money' */ + // TODO: Add more logic to regex + var re_price = new RegExp("[^\$\.0-9]", "g"); + + if (e.value.length > 10 || re_price.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} + +function valid_tax(e) { + /* SQL Data Type 'smallint' */ + + var re_tax = new RegExp("[^0-9]", "g"); + + if (e.value.length > 5 || e.value > 32767 || (e.value.length > 0 && e.value < 0) || re_tax.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} + +function valid_tareweight(e) { + /* SQL Data Type 'double', but bound to change */ + + var re_tareweight = new RegExp("[^0-9\.]", "g"); + + if (e.value.length > 5 || e.value > 32767 || (e.value.length > 0 && e.value < 0) || re_tareweight.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} + +function valid_size(e) { + /* 9 Characters or less, following are not allowed: ' , + */ + var re_size = new RegExp("[+\',]", "g"); + + if (e.value.length > 9 || re_size.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} + +function valid_unitofmeasure(e) { + /* 15 Characters or less, following are not allowed: ' , + */ + var re_unitofmeasure = new RegExp("[+\',]", "g"); + + if (e.value.length > 15 || re_unitofmeasure.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} + +function valid_deposit(e) { + /* SQL Data Type 'Money' */ + // TODO: Add more logic to regex + var re_deposit = new RegExp("[^\$\.0-9]", "g"); + + if (e.value.length > 10 || re_deposit.test(e.value)) { + e.style.color='#F00'; + } else { + e.style.color='#000'; + } +} \ No newline at end of file diff --git a/fannie/item/itemMaint.php b/fannie/item/itemMaint.php new file mode 100644 index 000000000..c08fefa2f --- /dev/null +++ b/fannie/item/itemMaint.php @@ -0,0 +1,29 @@ + diff --git a/fannie/item/itemMaint_WEFC_Toronto.php b/fannie/item/itemMaint_WEFC_Toronto.php new file mode 100644 index 000000000..61505aa8c --- /dev/null +++ b/fannie/item/itemMaint_WEFC_Toronto.php @@ -0,0 +1,168 @@ + I didn't change the likecodes handling but haven't tested it. + * + Others may not want this editor to touch vendorItems, preferring it to + * come from vendors, but we do not get machine-readable data from vendors. + * + Edit tables productUser, vendorItems and a table of per-coop product data. + * + In edit form, group some inputs into blocks that can be displayed + * optionally, controlled by a module-name-like value. + * + The fieldsets all float and have been made a regular size so they will + * will rearrange themselves sort of neatly, a la the membership editor does. + * $Fannie_Item_Modules = array("Operations","ExtraInfo", + * + Extend edit to products.size, .unitofmeasure, vendorItems.sku + * + "Module" blocks for Sale and Multiples (3-for-$1) values. + * -> JS Calendars for date fields. + * + Use "module" setting to control whether exisiting multiples code that is + * an alternatice to the regular Price is enabled. + * + The module-control array is not yet part of config.php or an install page, + * in part pending seeing how Andy did his modularization of the editor. + * + Compose, optionally, products.descriptin and productUser.description with + * "package" description "200 g" appended. + * + JS counter for length of products.description, with or without appended + * pacakge info. + * + Regularize some variable names betwee updateItems, insertItem and deleteItem + * + Use showAsMoney() and saveAsMoney() to prepare money values for display and writing to table. + * saveAsMoney() inserts decimals if the value in the form lacks them. + * + Initial item# prompt extended to make options more obvious and made into a + * function that is used throughout. + * + Extend lane updates to multiple lane-side tables. +*/ + +include('prodFunction_WEFC_Toronto.php'); +include('../config.php'); +include('../src/mysql_connect.php'); +$page_title = 'Fannie - Item Maintanence WEFC_Toronto'; +$header = 'Item Maintanence WEFC_Toronto'; +include('../src/header.html'); + +?> + + + + + + +Edit Item"; +echo ""; +echo "
        "; +/* Original +echo " Enter + or product name here
        "; +//EL echo "To add a product enter its UPC or PLU
        "; +echo " "; +*/ + +echo promptForUPC(); + +/* 22Feb13 EL Formatting woodshed. +echo "Enter the code for, or words from the description of, an existing product:"; +echo "
        "; +//echo "Enter "; +echo ""; +echo " "; +echo " is a "; +echo ""; +//echo " or product name here: "; +echo "
        "; +echo "To add a product enter its UPC or PLU or Vendor SKU."; +if ( !empty($upc) ) + echo "
          Edit $upc again"; +echo "
        "; +*/ + +echo "
        "; +} + +include ('../src/footer.html'); + +?> diff --git a/fannie/item/itemMaint_orig.php b/fannie/item/itemMaint_orig.php new file mode 100644 index 000000000..ff0f87e43 --- /dev/null +++ b/fannie/item/itemMaint_orig.php @@ -0,0 +1,91 @@ + + + + + +Edit Item"; +echo ""; +echo "
        "; +if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == "WEFC_Toronto" ) { +echo "

        Please use the WEFC Toronto Editor

        "; +} else { +echo " Enter + or product name here
        "; + +echo " "; +} +echo "
        "; +} + +include ('../src/footer.html'); + +?> diff --git a/fannie/item/laneUpdates.php b/fannie/item/laneUpdates.php new file mode 100644 index 000000000..0f9bea49c --- /dev/null +++ b/fannie/item/laneUpdates.php @@ -0,0 +1,86 @@ +table_definition('products',$FANNIE_OP_DB); + + // generate list of server columns + $server_cols = array(); + foreach($server_table_def as $k=>$v) + $server_cols[$k] = True; + + for ($i = 0; $i < count($FANNIE_LANES); $i++){ + $laneupdate_sql->add_connection($FANNIE_LANES[$i]['host'],$FANNIE_LANES[$i]['type'], + $FANNIE_LANES[$i]['op'],$FANNIE_LANES[$i]['user'], + $FANNIE_LANES[$i]['pw']); + + // generate list of columns that exist on both + // the server and the lane + $lane_table_def = $laneupdate_sql->table_definition('products',$FANNIE_LANES[$i]['op']); + $matching_columns = array(); + foreach($lane_table_def as $k=>$v){ + if (isset($server_cols[$k])) $matching_columns[] = $k; + } + + $selQ = "SELECT "; + $ins = "INSERT INTO products ("; + foreach($matching_columns as $col){ + $selQ .= $col.","; + $ins .= $col.","; + } + $selQ = rtrim($selQ,",")." FROM products WHERE upc='$upc' ORDER BY store_id DESC"; + $selQ = $laneupdate_sql->add_select_limit($selQ, 1, $FANNIE_OP_DB); + $ins = rtrim($ins,",").")"; + + $laneupdate_sql->transfer($FANNIE_OP_DB,$selQ,$FANNIE_LANES[$i]['op'],$ins); + } +} + +function deleteProductAllLanes($upc){ + global $laneupdate_sql, $FANNIE_OP_DB, $FANNIE_LANES; + + for ($i = 0; $i < count($FANNIE_LANES); $i++){ + $tmp = new SQLManager($FANNIE_LANES[$i]['host'],$FANNIE_LANES[$i]['type'], + $FANNIE_LANES[$i]['op'],$FANNIE_LANES[$i]['user'], + $FANNIE_LANES[$i]['pw']); + $delQ = $tmp->prepare_statement("DELETE FROM products WHERE upc=?"); + $delR = $tmp->exec_statement($delQ,array($upc),$FANNIE_LANES[$i]['op']); + } +} + +function updateProductAllLanes($upc){ + deleteProductAllLanes($upc); + addProductAllLanes($upc); +} + +?> diff --git a/fannie/item/laneUpdates_WEFC_Toronto.php b/fannie/item/laneUpdates_WEFC_Toronto.php new file mode 100644 index 000000000..15736e913 --- /dev/null +++ b/fannie/item/laneUpdates_WEFC_Toronto.php @@ -0,0 +1,165 @@ +table_definition('products',$FANNIE_OP_DB); + + // generate list of server columns + $server_cols = array(); + foreach($server_table_def as $k=>$v) + $server_cols[$k] = True; + + for ($i = 0; $i < count($FANNIE_LANES); $i++){ + $laneupdate_sql->add_connection($FANNIE_LANES[$i]['host'],$FANNIE_LANES[$i]['type'], + $FANNIE_LANES[$i]['op'],$FANNIE_LANES[$i]['user'], + $FANNIE_LANES[$i]['pw']); + + // generate list of columns that exist on both + // the server and the lane + $lane_table_def = $laneupdate_sql->table_definition('products',$FANNIE_LANES[$i]['op']); + $matching_columns = array(); + foreach($lane_table_def as $k=>$v){ + if (isset($server_cols[$k])) $matching_columns[] = $k; + } + + $selQ = "SELECT "; + $ins = "INSERT INTO products ("; + foreach($matching_columns as $col){ + $selQ .= $col.","; + $ins .= $col.","; + } + $selQ = rtrim($selQ,",")." FROM products WHERE upc='$upc' ORDER BY store_id DESC"; + $selQ = $laneupdate_sql->add_select_limit($selQ, 1, $FANNIE_OP_DB); + $ins = rtrim($ins,",").")"; + + $laneupdate_sql->transfer($FANNIE_OP_DB,$selQ,$FANNIE_LANES[$i]['op'],$ins); + } +} + +function deleteProductAllLanes($upc){ + global $laneupdate_sql, $FANNIE_OP_DB, $FANNIE_LANES; + + for ($i = 0; $i < count($FANNIE_LANES); $i++){ + $tmp = new SQLManager($FANNIE_LANES[$i]['host'],$FANNIE_LANES[$i]['type'], + $FANNIE_LANES[$i]['op'],$FANNIE_LANES[$i]['user'], + $FANNIE_LANES[$i]['pw']); + $delQ = "DELETE FROM products WHERE upc='$upc'"; + $delR = $tmp->query($delQ,$FANNIE_LANES[$i]['op']); + } +} + +function updateProductAllLanes($upc){ + deleteProductAllLanes($upc); + addProductAllLanes($upc); +} + +/* Functions like the above with table_name as a parameter. */ + +function addAllLanes($upc, $table_name){ + global $laneupdate_sql, $FANNIE_LANES, $FANNIE_OP_DB, $FANNIE_SERVER_DBMS; + + $server_table_def = $laneupdate_sql->table_definition("{$table_name}",$FANNIE_OP_DB); + if (count($server_table_def) == 0) + echo "
        server_table_def is empty for >{$table_name}<"; + + // generate list of server columns + $server_cols = array(); + foreach($server_table_def as $k=>$v) + $server_cols[$k] = True; + + for ($i = 0; $i < count($FANNIE_LANES); $i++){ + $laneupdate_sql->add_connection($FANNIE_LANES[$i]['host'],$FANNIE_LANES[$i]['type'], + $FANNIE_LANES[$i]['op'],$FANNIE_LANES[$i]['user'], + $FANNIE_LANES[$i]['pw']); + + if ( $laneupdate_sql->table_exists("$table_name") ) { + // generate list of columns that exist on both + // the server and the lane + $lane_table_def = $laneupdate_sql->table_definition("{$table_name}",$FANNIE_LANES[$i]['op']); + $matching_columns = array(); + foreach($lane_table_def as $k=>$v){ + if (isset($server_cols[$k])) $matching_columns[] = $k; + } + + $selQ = "SELECT "; + $ins = "INSERT INTO $table_name ("; + foreach($matching_columns as $col){ + $selQ .= $col.","; + $ins .= $col.","; + } + $selQ = rtrim($selQ,",")." FROM $table_name WHERE upc='$upc'"; + if ( isset($matching_columns['store_id']) ) + $selQ .= " ORDER BY store_id DESC"; + $selQ = $laneupdate_sql->add_select_limit($selQ, 1, $FANNIE_OP_DB); + $ins = rtrim($ins,",").")"; + + $laneupdate_sql->transfer($FANNIE_OP_DB,$selQ,$FANNIE_LANES[$i]['op'],$ins); + } + } +} + +function removeAllLanes($upc, $table_name){ + global $laneupdate_sql, $FANNIE_OP_DB, $FANNIE_LANES; + + for ($i = 0; $i < count($FANNIE_LANES); $i++){ + $tmp = new SQLManager($FANNIE_LANES[$i]['host'],$FANNIE_LANES[$i]['type'], + $FANNIE_LANES[$i]['op'],$FANNIE_LANES[$i]['user'], + $FANNIE_LANES[$i]['pw']); + if ( $tmp->table_exists("$table_name") ) { + $delQ = "DELETE FROM $table_name WHERE upc='$upc'"; + $delR = $tmp->query($delQ,$FANNIE_LANES[$i]['op']); + } + } +} + +function updateAllLanes($upc, $tables){ + foreach ($tables as $table) { + removeAllLanes($upc, $table); + addAllLanes($upc, $table); + } +} + +function deleteAllLanes($upc, $tables){ + foreach ($tables as $table) { + removeAllLanes($upc, $table); + } +} + +?> diff --git a/fannie/item/likecodes/LikeCodeEditor.php b/fannie/item/likecodes/LikeCodeEditor.php new file mode 100644 index 000000000..bc2067d14 --- /dev/null +++ b/fannie/item/likecodes/LikeCodeEditor.php @@ -0,0 +1,144 @@ +msgs .= "
        Error: $lc is not a number
        "; + else { + $chkP = $dbc->prepare_statement('SELECT * FROM likeCodes WHERE likeCode=?'); + $chk = $dbc->exec_statement($chkP,array($lc)); + if ($dbc->num_rows($chk) > 0){ + $upP = $dbc->prepare_statement("UPDATE likeCodes SET + likeCodeDesc=? + WHERE likeCode=?"); + $upR = $dbc->exec_statement($upP,array($name,$lc)); + $this->msgs .= "LC #$lc renamed $name
        "; + } + else { + $insP = $dbc->prepare_statement('INSERT INTO likeCodes + (likeCode,likeCodeDesc) VALUES (?,?)'); + $insR = $dbc->exec_statement($insP,array($lc,$name)); + $this->msgs .= "LC #$lc ($name) created
        "; + } + } + } + elseif (FormLib::get_form_value('submit2') !== ''){ + $lc = $_REQUEST['lcselect']; + $lc = FormLib::get_form_value('lcselect',0); + + $q1 = $dbc->prepare_statement('DELETE FROM likeCodes WHERE likeCode=?'); + $q2 = $dbc->prepare_statement('DELETE FROM upcLike WHERE likeCode=?'); + $dbc->exec_statement($q1,array($lc)); + $dbc->exec_statement($q2,array($lc)); + + $this->msgs .= "LC #$lc has been deleted
        "; + } + return True; + } + + + function javascript_content(){ + ob_start(); + ?> +function loadlc(id){ + $.ajax({ + url: 'ajax.php', + type: 'get', + data: 'lc='+id+'&action=fetch', + error: function(request,error){ + console.log(request); + console.log(error); + }, + success: function(resp){ + $('#rightdiv').html(resp); + } + }); +} + prepare_statement("SELECT likeCode,likeCodeDesc FROM likeCodes ORDER BY likeCode"); + $res = $dbc->exec_statement($p); + while($row = $dbc->fetch_row($res)) + $opts .= ""; + + $ret = ''; + if (!empty($msgs)){ + $ret .= "
        $msgs
        "; + } + ob_start(); + ?> +
        +
        +
        +

        + #: + Name: +

        + +

        +
        +
        +
        +
        +
        + draw_page(); +} diff --git a/fannie/item/likecodes/ajax.php b/fannie/item/likecodes/ajax.php new file mode 100644 index 000000000..b24067902 --- /dev/null +++ b/fannie/item/likecodes/ajax.php @@ -0,0 +1,44 @@ +prepare_statement("SELECT u.upc,p.description FROM + upcLike AS u INNER JOIN products AS p + ON u.upc=p.upc WHERE u.likeCode=? + ORDER BY p.description"); + $res = $dbc->exec_statement($prep,array(FormLib::get_form_value('lc',0))); + $ret = ""; + while($row = $dbc->fetch_row($res)){ + $ret .= ""; + $ret .= $row[0]." ".substr($row[1],0,25)."
        "; + } + echo $ret; + break; +} + +?> diff --git a/fannie/item/likecodes/index.php b/fannie/item/likecodes/index.php new file mode 100644 index 000000000..ffdbbbcdb --- /dev/null +++ b/fannie/item/likecodes/index.php @@ -0,0 +1,25 @@ + diff --git a/fannie/item/localItems.php b/fannie/item/localItems.php new file mode 100644 index 000000000..509581bb3 --- /dev/null +++ b/fannie/item/localItems.php @@ -0,0 +1,267 @@ + + + +prepare_statement("UPDATE products SET local=? + WHERE upc=?"); + for($i=0;$iexec_statement($p,array( + $_REQUEST['local'][$i], + $_REQUEST['upc'][$i] + )); + } + } + + $q = "SELECT p.upc,x.manufacturer,p.description,p.local, + p.department,d.dept_name FROM + products AS p LEFT JOIN departments AS d + ON p.department=d.dept_no LEFT JOIN + MasterSuperDepts AS m ON p.department=m.dept_ID + LEFT JOIN prodExtra AS x ON p.upc=x.upc + WHERE "; + $args = array(); + if ($super != 0){ + $q .= "m.superID=?"; + $q = str_replace("MasterSuperDepts","superdepts",$q); + $args = array($super); + } + else{ + $q .= "p.department BETWEEN ? AND ?"; + $args = array($start,$end); + } + switch($sort){ + case 'upc': + default: + $q .= ' ORDER BY p.upc'; + break; + case 'manu': + $q .= ' ORDER BY manufacturer,p.upc'; + break; + case 'desc': + $q .= ' ORDER BY description,p.upc'; + break; + case 'dept': + $q .= ' ORDER BY dept_name,p.upc'; + break; + } + + if (!isset($_REQUEST['excel'])) + echo '
        '; + echo ''; + if (!isset($_REQUEST['excel'])){ + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + else + echo ''; + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p, $args); + while($w = $dbc->fetch_row($r)){ + $class = ""; + if ($w['local'] > 0){ + if ($w['local'] == 1) $class = ' class="green" '; + elseif ($w['local'] == 2) $class = ' class="blue" '; + } + printf(' + ', + $class,$w['upc'],$w['manufacturer'], + $w['description'],$w['department'], + $w['dept_name'],$w['upc']); + if (!isset($_REQUEST['excel'])){ + echo ''; + } + else { + echo ''; + } + } + echo '
        UPCBrandDescDeptLocal
        UPCBrandDescDeptLocal
        %s%s%s%d%s
        '; + switch($w['local']){ + case 0: echo 'No'; break; + case 1: echo 'SC'; break; + case 2: echo '300mi'; break; + } + echo '
        '; + if (!isset($_REQUEST['excel'])){ + echo ''; + printf(' + + + ', + $super,$start,$end,$sort); + echo '
        '; + } + + exit; +} + +$page_title = 'Fannie - Local Products'; +$header = 'Local Products'; +include($FANNIE_ROOT.'src/header.html'); + +$deptQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptR = $dbc->exec_statement($deptQ); +$dept_nos = array(); +$dept_names = array(); +$count = 0; +while ($deptW = $dbc->fetch_array($deptR)){ + $dept_nos[$count] = $deptW[0]; + $dept_names[$count] = $deptW[1]; + $count++; +} + +$deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM superDeptNames WHERE + superID > 0 ORDER BY superID"); +$deptSubR = $dbc->exec_statement($deptSubQ); +$deptSubList = ""; + +while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=""; +} + +?> + + + + + + + + + + diff --git a/fannie/item/mapping/index.php b/fannie/item/mapping/index.php new file mode 100644 index 000000000..218ad16cb --- /dev/null +++ b/fannie/item/mapping/index.php @@ -0,0 +1,261 @@ +'invalid request ')); + exit; + } + } + $store = $_REQUEST['store_id']; + $section = $_REQUEST['section']; + $subsection = $_REQUEST['subsection']; + $shelfset = $_REQUEST['shelfset']; + $shelf = $_REQUEST['shelf']; + $location = $_REQUEST['location']; + switch($_REQUEST['ajax']){ + case 'get': + $output = lookupItem($store,$section,$subsection,$shelfset,$shelf,$location); + echo JsonLib::array_to_json($output); + break; + case 'set': + if (!isset($_REQUEST['upc']) || !is_numeric($_REQUEST['upc'])){ + echo JsonLib::array_to_json(array('errors'=>'invalid request')); + exit; + } + saveItem($store,$section,$subsection,$shelfset,$shelf,$location,$_REQUEST['upc']); + $output = lookupItem($store,$section,$subsection,$shelfset,$shelf,$location+1); + echo JsonLib::array_to_json($output); + break; + case 'default': + echo JsonLib::array_to_json(array('errors'=>'invalid request')); + break; + } + exit; +} + +function lookupItem($store,$sec,$subsec,$sh_set,$shelf,$loc){ + global $dbc; + $q = $dbc->prepare_statement("SELECT l.upc,p.description FROM prodPhysicalLocation AS l + LEFT JOIN products AS p ON l.upc=p.upc + WHERE l.store_id=? AND section=? AND subsection=? + AND shelf_set=? AND shelf=? AND location=?"); + $args = array($store,$sec,$subsec,$sh_set,$shelf,$loc); + $r = $dbc->exec_statement($q,$args); + $ret = array('upc'=>'','description'=>'no item at this location'); + if ($dbc->num_rows($r) > 0){ + $w = $dbc->fetch_row($r); + $ret['upc'] = $w['upc']; + $ret['description'] = $w['description']; + } + return $ret; +} + +function saveItem($store,$sec,$subsec,$sh_set,$shelf,$loc,$upc){ + global $dbc; + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + $q = sprintf("DELETE FROM prodPhysicalLocation WHERE + store_id=? AND section=? AND subsection=? + AND shelf_set=? AND shelf=? AND location=?"); + $args = array($store,$sec,$subsec,$sh_set,$shelf,$loc); + $r = $dbc->exec_statement($q,$args); + $q = $dbc->prepare_statement("INSERT INTO prodPhysicalLocation (upc, + store_id,section,subsection,shelf_set,shelf, + location) VALUES (%s,%d,%d,%d,%d,%d,%d)"); + $args = array($upc,$store,$sec,$subsec,$sh_set, + $shelf,$loc); + $r = $dbc->exec_statement($q,$args); +} + + +$sectionsQ = $dbc->prepare_statement("SELECT superID,super_name FROM MasterSuperDepts + WHERE superID > 0 ORDER BY superID"); +$sectionsR = $dbc->exec_statement($sectionsQ); +$supers = array(); +while($sectionsW = $dbc->fetch_row($sectionsR)) + $supers[$sectionsW[0]] = $sectionsW[1]; +?> +Shelf Mapping + + + + + + +
        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + +
        + +
        Subsection:
        Shelf Set:
        Shelf:
        Location:
        UPC
        + +
        + + diff --git a/fannie/item/modules/AllLanesItemModule.php b/fannie/item/modules/AllLanesItemModule.php new file mode 100644 index 000000000..254bf5fed --- /dev/null +++ b/fannie/item/modules/AllLanesItemModule.php @@ -0,0 +1,74 @@ +'; + $ret .= 'Lane Status'; + + for($i=0;$iconnections[$f['op']] === False){ + $ret .= "Can't connect to lane ".($i+1)."
        "; + continue; + } + $prep = $sql->prepare_statement($queryItem); + $resultItem = $sql->exec_statement($prep,array($upc)); + $num = $sql->num_rows($resultItem); + + if ($num == 0){ + $ret .= "Item $upc not found on Lane ".($i+1)."
        "; + } + else if ($num > 1){ + $ret .= "Item $upc found multiple times on Lane ".($i+1)."
        "; + while ($rowItem = $sql->fetch_array($resultItem)){ + $ret .= "{$rowItem['upc']} {$rowItem['description']}
        "; + } + } + else { + $rowItem = $sql->fetch_array($resultItem); + $ret .= "Item $upc on Lane ".($i+1)."
        "; + $ret .= "Price: {$rowItem['normal_price']}"; + if ($rowItem['special_price'] <> 0){ + $ret .= "    ON SALE: {$rowItem['special_price']}"; + } + $ret .= "
        "; + } + if ($i < count($FANNIE_LANES) - 1){ + $ret .= "
        "; + } + } + $ret .= ''; + return $ret; + } +} + +?> diff --git a/fannie/item/modules/BaseItemModule.php b/fannie/item/modules/BaseItemModule.php new file mode 100644 index 000000000..7d2466f47 --- /dev/null +++ b/fannie/item/modules/BaseItemModule.php @@ -0,0 +1,406 @@ +'; + $ret .= "Item"; + + $dbc = $this->db(); + $p = $dbc->prepare_statement('SELECT p.*,x.* FROM products AS p LEFT JOIN prodExtra + AS x ON p.upc=x.upc WHERE p.upc=?'); + $r = $dbc->exec_statement($p,array($upc)); + $rowItem = array(); + $prevUPC = False; + $nextUPC = False; + $likeCode = False; + if($dbc->num_rows($r) > 0){ + //existing item + $rowItem = $dbc->fetch_row($r); + + /* find previous and next items in department */ + $pnP = $dbc->prepare_statement('SELECT upc FROM products WHERE department=? ORDER BY upc'); + $pnR = $dbc->exec_statement($pnP,array($upc)); + $passed_it = False; + while($pnW = $dbc->fetch_row($pnR)){ + if (!$passed_it && $upc != $pnW[0]) + $prevUPC = $pnW[0]; + else if (!$passed_it && $upc == $pnW[0]) + $passed_it = True; + else if ($passed_it){ + $nextUPC = $pnW[0]; + break; + } + } + + $lcP = $dbc->prepare_statement('SELECT likeCode FROM upcLike WHERE upc=?'); + $lcR = $dbc->exec_statement($lcP,array($upc)); + if ($dbc->num_rows($lcR) > 0) + $likeCode = array_pop($dbc->fetch_row($lcR)); + } + else { + // new item + $ret .= "Item not found. You are creating a new one. "; + + /** + Check for entries in the vendorItems table to prepopulate + fields for the new item + */ + $vendorP = "SELECT description,brand as manufacturer,cost, + vendorName as distributor,margin,i.vendorID + FROM vendorItems AS i LEFT JOIN vendors AS v ON i.vendorID=v.vendorID + LEFT JOIN vendorDepartments AS d ON i.vendorDept=d.deptID + WHERE upc=?"; + $args = array($upc); + $vID = FormLib::get_form_value('vid',''); + if ($vID !== ''){ + $vendorP .= ' AND vendorID=?'; + $args[] = $vID; + } + $vendorP = $dbc->prepare_statement($vendorP); + $vendorR = $dbc->exec_statement($vendorP,$args); + + if ($dbc->num_rows($vendorR) > 0){ + $v = $dbc->fetch_row($vendorR); + $ret .= "
        This product is in the ".$v['distributor']." catalog. Values have + been filled in where possible
        "; + $rowItem['description'] = $v['description']; + $rowItem['manufacturer'] = $v['manufacturer']; + $rowItem['cost'] = $v['cost']; + $rowItem['distributor'] = $v['distributor']; + + while($v = $dbc->fetch_row($vendorR)){ + printf('This product is also in %s
        ', + $upc,$v['vendorID'],$v['distributor']); + } + } + + /** + Look for items with a similar UPC to guess what + department this item goes in. If found, use + department settings to fill in some defaults + */ + $rowItem['department'] = 0; + $search = substr($upc,0,12); + $searchP = $dbc->prepare_statement('SELECT department FROM products WHERE upc LIKE ?'); + while(strlen($search) >= 8){ + $searchR = $dbc->exec_statement($searchP,array($search.'%')); + if ($dbc->num_rows($searchR) > 0){ + $rowItem['department'] = array_pop($dbc->fetch_row($searchR)); + $settingP = $dbc->prepare_statement('SELECT dept_tax,dept_fs,dept_discount + FROM departments WHERE dept_no=?'); + $settingR = $dbc->exec_statement($settingP,array($rowItem['department'])); + if ($dbc->num_rows($settingR) > 0){ + $d = $dbc->fetch_row($settingR); + $rowItem['tax'] = $d['dept_tax']; + $rowItem['foodstamp'] = $d['dept_fs']; + $rowItem['discount'] = $d['dept_discount']; + } + break; + } + $search = substr($search,0,strlen($search)-1); + } + } + + $ret .= ""; + + $ret .= ''; + + // system for store-level records not refined yet; might go here + $ret .= ''; + + $ret .= ''; + + $limit = 35 - strlen(isset($rowItem['description'])?$rowItem['description']:''); + $ret .= ''; + + /** + Drop down box changes price field from single price to + X for $Y style pricing + */ + if (!isset($rowItem['pricemethod'])) $rowItem['pricemethod'] = 0; + $ret .= ''; + $ret .= sprintf('', (isset($rowItem['normal_price']) ? $rowItem['normal_price'] : 0) + ); + + $ret .= ''; + + $ret .= ''; + $ret .= sprintf('', + ($rowItem['pricemethod'] >0 ? 'checked' : ''), + (isset($rowItem['quantity']) ? $rowItem['quantity'] : 0), + (isset($rowItem['groupprice']) ? $rowItem['groupprice'] : 0), + ($rowItem['pricemethod'] >0 ? 'checked' : ''), + $rowItem['pricemethod'] + ); + $ret .= ''; + + $ret .=""; + $ret .= ""; + $ret .= ''; + + if (isset($rowItem['special_price']) && $rowItem['special_price'] <> 0){ + /* show sale info */ + $batchP = $dbc->prepare_statement("SELECT b.batchName FROM batches AS b + LEFT JOIN batchList as l + on b.batchID=l.batchID WHERE '".date('Y-m-d')."' BETWEEN b.startDate + AND b.endDate AND (l.upc=? OR l.upc=?)"); + $batchR = $dbc->exec_statement($batchP,array($upc,'LC'.$likeCode)); + $batch = "Unknown"; + if ($dbc->num_rows($batchR) > 0) + $batch = array_pop($dbc->fetch_row($batchR)); + + $ret .= ''; + $ret .= ""; + $ret .= ""; + $ret .= ''; + } + $ret .= "
        UPC'.$upc; + $ret .= ''; + if ($prevUPC) $ret .= " Previous"; + if ($nextUPC) $ret .= " Next"; + $ret .= ''; + $ret .= ''; + $ret .= ' 
        Description + '.$limit.'Price$ +
        Package Size'; + $ret .= 'Unit of measure + + + for $ +
        ManufacturerDistributor
        Sale Price:$rowItem[6] (Batch: $batch)End Date:$rowItem[11]
        "; + + $ret .= ""; + $ret .= ""; + + $depts = array(); + $subs = array(); + if (!isset($rowItem['subdept'])) $rowItem['subdept'] = 0; + $p = $dbc->prepare_statement('SELECT dept_no,dept_name,subdept_no,subdept_name,dept_ID + FROM departments AS d + LEFT JOIN subdepts AS s ON d.dept_no=s.dept_ID + ORDER BY d.dept_no'); + $r = $dbc->exec_statement($p); + while($w = $dbc->fetch_row($r)){ + if (!isset($depts[$w['dept_no']])) $depts[$w['dept_no']] = $w['dept_name']; + if ($w['subdept_no'] == '') continue; + if (!isset($subs[$w['dept_ID']])) + $subs[$w['dept_ID']] = ''; + $subs[$w['deptID']] = sprintf('', + ($w['subdept_no'] == $rowItem['subdept'] ? 'selected':''), + $w['subdept_no'],$w['subdept_name']); + } + + $json = count($subs) == 0 ? '{}' : JsonLib::array_to_json($subs); + ob_start(); + ?> + + "; + $ret .= "'; + + $taxQ = $dbc->prepare_statement('SELECT id,description FROM taxrates ORDER BY id'); + $taxR = $dbc->exec_statement($taxQ); + $rates = array(); + while ($taxW = $dbc->fetch_row($taxR)) + array_push($rates,array($taxW[0],$taxW[1])); + array_push($rates,array("0","NoTax")); + $ret .= ''; + + $ret .= sprintf('', + (isset($rowItem['foodstamp']) && $rowItem['foodstamp']==1 ? 'checked' : '')); + + $ret .= sprintf('', + (isset($rowItem['scale']) && $rowItem['scale']==1 ? 'checked' : '')); + + $ret .= sprintf('', + (isset($rowItem['qttyEnforced']) && $rowItem['qttyEnforced']==1 ? 'checked' : '')); + + $ret .= sprintf('', + (isset($rowItem['discount']) && $rowItem['discount']==0 ? 'checked' : '')); + + $ret .= ''; + $ret .= '
        DeptTaxFSScaleQtyFrcNoDisc
        "; + $ret .= '
        '; + $ret .= ''; + $ret .= '
        '; + return $ret; + } + + function SaveFormData($upc){ + $upc = str_pad($upc,13,0,STR_PAD_LEFT); + $dbc = $this->db(); + + $up_array = array(); + $up_array['tax'] = FormLib::get_form_value('tax',0); + $up_array['foodstamp'] = FormLib::get_form_value('FS',0); + $up_array['scale'] = FormLib::get_form_value('Scale',0); + $up_array['qttyEnforced'] = FormLib::get_form_value('QtyFrc',0); + $up_array['discount'] = FormLib::get_form_value('NoDisc',1); + $up_array['normal_price'] = FormLib::get_form_value('price',0.00); + $up_array['description'] = FormLib::get_form_value('descript',''); + $up_array['pricemethod'] = 0; + $up_array['groupprice'] = 0.00; + $up_array['quantity'] = 0; + $up_array['department'] = FormLib::get_form_value('department',0); + $up_array['size'] = FormLib::get_form_value('size',''); + $up_array['scaleprice'] = 0.00; + $up_array['modified'] = $dbc->now(); + $up_array['advertised'] = 1; + $up_array['tareweight'] = 0; + $up_array['unitofmeasure'] = FormLib::get_form_value('unitm',''); + $up_array['wicable'] = 0; + $up_array['idEnforced'] = 0; + $up_array['subdept'] = FormLib::get_form_value('subdepartment',0); + $up_array['store_id'] = 0; + + /* turn on volume pricing if specified, but don't + alter pricemethod if it's already non-zero */ + $doVol = FormLib::get_form_value('doVolume',False); + $vprice = FormLib::get_form_value('vol_price',''); + $vqty = FormLib::get_form_value('vol_qtty',''); + if ($doVol !== False && is_numeric($vprice) && is_numeric($vqty)){ + $up_array['pricemethod'] = FormLib::get_form_value('pricemethod',0); + if ($up_array['pricemethod']==0) $up_array['pricemethod']=2; + $up_array['groupprice'] = $vprice; + $up_array['quantity'] = $vqty; + } + + ProductsModel::update($upc, $up_array); + + if ($dbc->table_exists('prodExtra')){ + $arr = array(); + $arr['manufacturer'] = $dbc->escape(FormLib::get_form_value('manufacturer')); + $arr['distributor'] = $dbc->escape(FormLib::get_form_value('distributor')); + $arr['location'] = 0; + + $checkP = $dbc->prepare_statement('SELECT upc FROM prodExtra WHERE upc=?'); + $checkR = $dbc->exec_statement($checkP,array($upc)); + if ($dbc->num_rows($checkR) == 0){ + // if prodExtra record doesn't exist, needs more values + $arr['upc'] = $dbc->escape($upc); + $arr['variable_pricing'] = 0; + $arr['margin'] = 0; + $arr['case_quantity'] = "''"; + $arr['case_cost'] = 0.00; + $arr['case_info'] = "''"; + $dbc->smart_insert('prodExtra',$arr); + } + else { + $dbc->smart_update('prodExtra',$arr,"upc='$upc'"); + } + } + } + + function AjaxCallback(){ + $json = array('tax'=>0,'fs'=>False,'nodisc'=>False); + $dept = FormLib::get_form_value('dept_defaults',''); + $db = $this->db(); + $p = $db->prepare_statement('SELECT dept_tax,dept_fs,dept_discount + FROM departments WHERE dept_no=?'); + $r = $db->exec_statement($p,array($dept)); + if ($db->num_rows($r)){ + $w = $db->fetch_row($r); + $json['tax'] = $w['dept_tax']; + if ($w['dept_fs'] == 1) $json['fs'] = True; + if ($w['dept_discount'] == 0) $json['nodisc'] = True; + } + echo JsonLib::array_to_json($json); + } +} + +/** + This form does some fancy tricks via AJAX calls. This block + ensures the AJAX functionality only runs when the script + is accessed via the browser and not when it's included in + another PHP script. +*/ +if (basename($_SERVER['SCRIPT_NAME']) == basename(__FILE__)){ + $obj = new BaseItemModule(); + $obj->AjaxCallback(); +} + +?> diff --git a/fannie/item/modules/ExtraInfoModule.php b/fannie/item/modules/ExtraInfoModule.php new file mode 100644 index 000000000..d38c556ff --- /dev/null +++ b/fannie/item/modules/ExtraInfoModule.php @@ -0,0 +1,92 @@ +'; + $ret .= "Extra Info"; + + $info = array('cost'=>0.00,'deposit'=>0,'local'=>0,'inUse'=>1,'modified'=>'Unknown'); + $dbc = $this->db(); + $p = $dbc->prepare_statement('SELECT cost,deposit,local,inUse,modified FROM products WHERE upc=?'); + $r = $dbc->exec_statement($p,array($upc)); + if ($dbc->num_rows($r) > 0) + $info = $dbc->fetch_row($r); + + $local_opts = array(0=>'No'); + $p = $dbc->prepare_statement('SELECT originID,shortName FROM originName WHERE local=1 ORDER BY originID'); + $r = $dbc->exec_statement($p); + while($w = $dbc->fetch_row($r)){ + $local_opts[$w['originID']] = $w['shortName']; + } + if (count($local_opts) == 0) $local_opts[1] = 'Yes'; // generic local if no origins defined + $localSelect = ''; + + $ret .= ""; + $ret .= ''; + $ret .= sprintf(' + + + + ', + $info['deposit'],$info['cost'],$localSelect, + ($info['inUse']==1 ? 'checked': '') + ); + $ret .= ''; + $ret .= '
        DepositCostLocalIn Use
        %s
        Last modified: '.$info['modified'].'
        '; + return $ret; + } + + function SaveFormData($upc){ + $upc = str_pad($upc,13,0,STR_PAD_LEFT); + $deposit = FormLib::get_form_value('deposit',0); + $cost = FormLib::get_form_value('cost',0.00); + $inUse = FormLib::get_form_value('inUse',0); + $local = FormLib::get_form_value('local',0); + + $r1 = ProductsModel::update($upc,array('deposit'=>$deposit,'local'=>$local, + 'inUse'=>$inUse,'cost'=>$cost)); + $dbc = $this->db(); + $p = $dbc->prepare_statement('UPDATE prodExtra SET cost=? WHERE upc=?'); + $r2 = $dbc->exec_statement($p,array($cost,$upc)); + + if ($r1 === False || $r2 === False) + return False; + else + return True; + } +} + +?> diff --git a/fannie/item/modules/ItemFlagsModule.php b/fannie/item/modules/ItemFlagsModule.php new file mode 100644 index 000000000..3b8f7293d --- /dev/null +++ b/fannie/item/modules/ItemFlagsModule.php @@ -0,0 +1,83 @@ +'; + $ret .= "Flags"; + + $dbc = $this->db(); + $q = "SELECT f.description, + f.bit_number, + (1<<(f.bit_number-1)) & p.numflag AS flagIsSet + FROM products AS p, prodFlags AS f + WHERE p.upc=?"; + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p,array($upc)); + + if ($dbc->num_rows($r) == 0){ + // item does not exist + $p = $dbc->prepare_statement('SELECT f.description,f.bit_number,0 AS flagIsSet + FROM prodFlags AS f'); + $r = $dbc->exec_statement($p); + } + + + $ret .= ''; + $i=0; + while($w = $dbc->fetch_row($r)){ + if ($i==0) $ret .= ''; + if ($i != 0 && $i % 2 == 0) $ret .= ''; + $ret .= sprintf(' + ',$w['bit_number'], + ($w['flagIsSet']==0 ? '' : 'checked'), + $w['description'] + ); + $i++; + } + $ret .= '
        %s
        '; + + $ret .= ''; + return $ret; + } + + function SaveFormData($upc){ + $flags = FormLib::get_form_value('flags',array()); + if (!is_array($flags)) return False; + $numflag = 0; + foreach($flags as $f){ + if ($f != (int)$f) continue; + $numflag = $numflag | (1 << ($f-1)); + } + return ProductsModel::update($upc,array('numflag'=>$numflag),True); + } +} + +?> diff --git a/fannie/item/modules/ItemLinksModule.php b/fannie/item/modules/ItemLinksModule.php new file mode 100644 index 000000000..3c4fbb634 --- /dev/null +++ b/fannie/item/modules/ItemLinksModule.php @@ -0,0 +1,85 @@ +db(); + $p = $dbc->prepare_statement('SELECT upc FROM products WHERE upc=?'); + $r = $dbc->exec_statement($p,array($upc)); + + $ret = '
        '; + $ret .= "Links"; + + if ($dbc->num_rows($r) > 0){ + $ret .= '
        '; + $ret .= "
      • New Shelf Tag
      • "; + $ret .= "
      • Delete this item
      • "; + $ret .= '
        '; + + $ret .= '
        '; + $ret .= "
      • Price History
      • "; + $ret .= "
      • Recent Sales History
      • "; + $ret .= '
        '; + + $ret .= '
        '; + + $ret .= ""; + } + else { + $ret .= sprintf(' + Create Shelf Tag',$upc); + } + $ret .= '
        '; + + + return $ret; + } + + function SaveFormData($upc){ + $upc = str_pad($upc,13,0,STR_PAD_LEFT); + $ret = ''; + if (FormLib::get_form_value('newshelftag','') != ''){ + $ret .= ""; + } + echo $ret; // output javascript to result page + return True; + } + +} + +?> diff --git a/fannie/item/modules/ItemMarginModule.php b/fannie/item/modules/ItemMarginModule.php new file mode 100644 index 000000000..5378239f8 --- /dev/null +++ b/fannie/item/modules/ItemMarginModule.php @@ -0,0 +1,129 @@ +db(); + $p = $db->prepare_statement('SELECT normal_price,cost,department FROM products WHERE upc=?'); + $r = $db->exec_statement($p,array($upc)); + $vals = array(0,0,0); + if ($db->num_rows($r) > 0) + $vals = $db->fetch_row($r); + $ret = '
        '; + $ret .= 'Margin'; + $ret .= '
        '; + $ret .= $this->CalculateMargin($vals[0],$vals[1],$vals[2]); + $ret .= '
        '; + $ret .= '
        '; + $ret .= $this->js(); + return $ret; + } + + private function getSRP($cost,$margin){ + $srp = sprintf("%.2f",$cost/(1-$margin)); + while (substr($srp,strlen($srp)-1,strlen($srp)) != "5" && + substr($srp,strlen($srp)-1,strlen($srp)) != "9") + $srp += 0.01; + return $srp; + } + + private function CalculateMargin($price,$cost,$dept){ + $dbc = $this->db(); + + $dmP = $dbc->prepare_statement("SELECT margin FROM deptMargin WHERE dept_ID=?"); + $dmR = $dbc->exec_statement($dmP,array($dept)); + $dm = "Unknown"; + if ($dbc->num_rows($dmR) > 0){ + $dm = sprintf('%.2f',array_pop($dbc->fetch_row($dmR))*100); + } + + $ret = "Desired margin on this department is ".$dm."%"; + $ret .= "
        "; + + $actual = 0; + if ($price != 0) + $actual = (($price-$cost)/$price)*100; + if ($actual > $dm && is_numeric($dm)){ + $ret .= sprintf("Current margin on this item is %.2f%%
        ", + $actual); + } + elseif (!is_numeric($price)){ + $ret .= "No price has been saved for this item
        "; + } + else { + $ret .= sprintf("Current margin on this item is %.2f%%
        ", + $actual); + $srp = $this->getSRP($cost,$dm/100.0); + $ret .= sprintf("Suggested price: \$%.2f ",$srp); + $ret .= sprintf("(Use this price)",$srp); + } + + return $ret; + } + + private function js(){ + global $FANNIE_URL; + ob_start(); + ?> + + CalculateMargin($p,$c,$d); + } +} + +/** + This form does some fancy tricks via AJAX calls. This block + ensures the AJAX functionality only runs when the script + is accessed via the browser and not when it's included in + another PHP script. +*/ +if (basename($_SERVER['SCRIPT_NAME']) == basename(__FILE__)){ + $obj = new ItemMarginModule(); + $obj->AjaxCallback(); +} diff --git a/fannie/item/modules/LikeCodeModule.php b/fannie/item/modules/LikeCodeModule.php new file mode 100644 index 000000000..d0e90f27a --- /dev/null +++ b/fannie/item/modules/LikeCodeModule.php @@ -0,0 +1,181 @@ +Likecode'; + + $dbc = $this->db(); + $p = $dbc->prepare_statement('SELECT likeCode FROM upcLike WHERE upc=?'); + $r = $dbc->exec_statement($p,array($upc)); + $myLC = -1; + if ($dbc->num_rows($r) > 0) + $myLC = array_pop($dbc->fetch_row($r)); + + $ret .= ""; + $ret .= " + "; + $ret .= ''; + $ret .= ''; + $ret .= '
        Like code "; + $ret .= "Check to not update like code items
        '; + $ret .= $this->LikeCodeItems($myLC); + $ret .= '
        '; + $ret .= $this->js(); + + return $ret; + } + + function SaveFormData($upc){ + $lc = FormLib::get_form_value('likeCode'); + $dbc = $this->db(); + + $delP = $dbc->prepare_statement('DELETE FROM upcLike WHERE upc=?'); + $delR = $dbc->exec_statement($delP,array($upc)); + if ($lc == -1){ + return ($delR === False) ? False : True; + } + + $insP = 'INSERT INTO upcLike (upc,likeCode) VALUES (?,?)'; + $insR = $dbc->exec_statement($insP,array($upc,$lc)); + + if (FormLib::get_form_value('LikeCodeNoUpdate') == 'noupdate'){ + return ($insR === False) ? False : True; + } + + /* get values for current item */ + $valuesP = $dbc->prepare_statement('SELECT normal_price,pricemethod,groupprice,quantity, + department,scale,tax,foodstamp,discount,qttyEnforced,local + FROM products WHERE upc=?'); + $valuesR = $dbc->exec_statement($valuesP,array($upc)); + if ($dbc->num_rows($valuesR) == 0) return False; + $values = $dbc->fetch_row($valuesR); + + /* apply current values to other other items + in the like code */ + $upcP = $dbc->prepare_statement('SELECT upc FROM upcLike WHERE likeCode=? AND upc<>?'); + $upcR = $dbc->exec_statement($upcP,array($lc,$upc)); + while($upcW = $dbc->fetch_row($upcR)){ + ProductsModel::update($upcW['upc'],$values); + updateProductAllLanes($upcW['upc']); + } + return True; + } + + private function js(){ + global $FANNIE_URL; + ob_start(); + ?> + + '; + $ret .= 'Likecode Sales History'; + return $ret; + } + + private function LikeCodeItems($lc){ + if ($lc == -1) return ''; + $ret = "Like Code Linked Items
        "; + $ret .= ""; + $dbc = $this->db(); + $p = $dbc->prepare_statement("SELECT p.upc,p.description FROM + products AS p INNER JOIN upcLike AS u ON + p.upc=u.upc WHERE u.likeCode=? + ORDER BY p.upc"); + $res = $dbc->exec_statement($p,array($lc)); + while($row = $dbc->fetch_row($res)){ + $ret .= sprintf(" + ",$row[0],$row[0],$row[1]); + } + $ret .= "
        %s%s
        "; + $ret .= '
        '; + return $ret; + } + + function AjaxCallback(){ + $lc = FormLib::get_form_value('lc',-1); + $json = array( + 'items' => $this->LikeCodeItems($lc), + 'link' => $this->HistoryLink($lc) + ); + echo JsonLib::array_to_json($json); + } +} + +/** + This form does some fancy tricks via AJAX calls. This block + ensures the AJAX functionality only runs when the script + is accessed via the browser and not when it's included in + another PHP script. +*/ +if (basename($_SERVER['SCRIPT_NAME']) == basename(__FILE__)){ + $obj = new LikeCodeModule(); + $obj->AjaxCallback(); +} + +?> diff --git a/fannie/item/modules/ScaleItemModule.php b/fannie/item/modules/ScaleItemModule.php new file mode 100644 index 000000000..ba9b8c42b --- /dev/null +++ b/fannie/item/modules/ScaleItemModule.php @@ -0,0 +1,158 @@ +'; + $ret .= "Scale"; + + $dbc = $this->db(); + $p = $dbc->prepare_statement('SELECT * FROM scaleItems WHERE plu=?'); + $r = $dbc->exec_statement($p,array($upc)); + $scale = array('itemdesc'=>'','weight'=>0,'bycount'=>0,'tare'=>0, + 'shelflife'=>0,'label'=>133,'graphics'=>0,'text'=>''); + if ($dbc->num_rows($r) > 0) + $scale = $dbc->fetch_row($r); + + $p = $dbc->prepare_statement('SELECT description FROM products WHERE upc=?'); + $r = $dbc->exec_statement($p,array($upc)); + $reg_description = ''; + if ($dbc->num_rows($r) > 0) + $reg_description = array_pop($dbc->fetch_row($r)); + + $ret .= sprintf('',$upc); + $ret .= ""; + $ret .= sprintf("", + ($reg_description == $scale['itemdesc'] ? '': $scale['itemdesc'])); + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ''; + + $ret .= sprintf("", + ($scale['bycount']==1?'checked':'')); + + $ret .= sprintf("", + $scale['tare']); + + $ret .= sprintf("", + $scale['shelflife']); + + $ret .= "'; + + $ret .= sprintf("", + ($scale['graphics']==1?'checked':'')); + $ret .= ''; + + $ret .= ""; + + $ret .= ""; + + $ret .= '
        Longer description
         
        WeightBy CountTareShelf LifeLabelSafehandling
        '; + if ($scale['weight']==0){ + $ret .= " Random
        "; + $ret .= " Fixed
        "; + } + else { + $ret .= " Random
        "; + $ret .= " Fixed
        "; + } + $ret .= '
         
        "; + $ret .= "Expanded text:
        '; + return $ret; + } + + function SaveFormData($upc){ + /* check if data was submitted */ + if (FormLib::get_form_value('s_plu') === '') return False; + + $desc = FormLib::get_form_value('description',''); + $longdesc = FormLib::get_form_value('s_longdesc',''); + if ($longdesc !== '') $desc = $longdesc; + $price = FormLib::get_form_value('price',0); + $tare = FormLib::get_form_value('s_tare',0); + $shelf = FormLib::get_form_value('s_shelflife',0); + $bycount = FormLib::get_form_value('s_bycount',0); + $graphics = FormLib::get_form_value('s_graphics',0); + $type = FormLib::get_form_value('s_type','Random Weight'); + $weight = ($s_type == 'Random Weight') ? 0 : 1; + $text = FormLib::get_form_value('s_text',''); + $label = FormLib::get_form_value('s_label','horizontal'); + + if ($label == "horizontal" && $type == "Random Weight") + $label = 133; + elseif ($label == "horizontal" && $type == "Fixed Weight") + $label = 63; + elseif ($label == "vertical" && $type == "Random Weight") + $label = 103; + elseif ($label == "vertical" && $type == "Fixed Weight") + $label = 23; + + $dbc = $this->db(); + $chkP = $dbc->prepare_statement('SELECT * FROM scaleItems WHERE plu=?'); + $chkR = $dbc->exec_statement($chkP,array($upc)); + $action = 'ChangeOneItem'; + if ($dbc->num_rows($chkR) == 0){ + $insP = $dbc->prepare_statement("INSERT INTO scaleItems (plu, price, itemdesc, + exceptionprice, weight, bycount, tare, shelflife, text, class, + label, graphics) VALUES (?, ?, ?, 0.00, ?, ?, ?, ?, '', ?, ?)"); + $insR = $dbc->exec_statement($insP,array($upc, $price, $desc, $weight, $bycount, + $tare, $shelf, $text, $label, $graphics)); + $action = "WriteOneItem"; + } + else { + $upP = $dbc->prepare_statement('UPDATE scaleItems SET price=?, itemdesc=?, weight=?, + bycount=?, tare=?, shelflife=?, text=?, label=?, graphics=? + WHERE plu=?'); + $upR = $dbc->exec_statement($upP,array($price, $desc, $weight, $bycount, $tare, + $shelf, $text, $label, $graphics, $upc)); + $action = "ChangeOneItem"; + } + + include(dirname(__FILE__).'/hobartcsv/parse.php'); + parseitem($action,$upc,$desc,$tare,$shelf,$price,$bycount,$type, + 0.00,$text,$label,($graphics==1?121:0)); + } +} + +?> diff --git a/fannie/item/modules/VendorItemModule.php b/fannie/item/modules/VendorItemModule.php new file mode 100644 index 000000000..a64783f0b --- /dev/null +++ b/fannie/item/modules/VendorItemModule.php @@ -0,0 +1,115 @@ +'; + $ret .= "Vendor Items"; + + $dbc = $this->db(); + $p = $dbc->prepare_statement('SELECT vendorID,vendorName FROM vendors ORDER BY vendorID'); + $r = $dbc->exec_statement($p); + if ($dbc->num_rows($r) == 0) return ''; // no vendors available + $vendors = array(); + while($w = $dbc->fetch_row($r)) + $vendors[$w['vendorID']] = $w['vendorName']; + + $ret .= ''; + + $prep = $dbc->prepare_statement('SELECT * FROM vendorItems WHERE vendorID=? AND upc=?'); + $style = 'display:table;'; + foreach($vendors as $id => $name){ + $ret .= ""; + $row = array('cost'=>0,'sku'=>'','units'=>1); + $res = $dbc->exec_statement($prep,array($id,$upc)); + if ($dbc->num_rows($res) > 0) + $row = $dbc->fetch_row($res); + $ret .= ''; + $ret .= sprintf('',$row['cost']); + $ret .= ''; + $ret .= sprintf('',($row['units']*$row['cost'])); + $ret .= ''; + + $ret .= '
        SKUUnit Cost$
        Units/CaseCase Cost$%.2f
        '; + + $style = 'display:none;'; + } + + $ret .= ''; + return $ret; + } + + function SaveFormData($upc){ + $upc = str_pad($upc,13,0,STR_PAD_LEFT); + $ids = FormLib::get_form_value('v_id',array()); + $skus = FormLib::get_form_value('v_sku',array()); + $costs = FormLib::get_form_value('v_cost',array()); + $units = FormLib::get_form_value('v_units',array()); + + $dbc = $this->db(); + $chkP = $dbc->prepare_statement('SELECT upc FROM vendorItems WHERE vendorID=? AND upc=?'); + $insP = $dbc->prepare_statement('INSERT INTO vendorItems (upc,vendorID,cost,units,sku) + VALUES (?,?,?,?,?)'); + $upP = $dbc->prepare_statement('UPDATE vendorItems SET cost=?,units=?,sku=? WHERE + upc=? AND vendorID=?'); + + $ret = True; + for ($i=0;$iexec_statement($chkP,array($ids[$i],$upc)); + if ($dbc->num_rows($chkR) == 0){ + $try = $dbc->exec_statement($insP,array($upc,$ids[$i], + $costs[$i],$units[$i],$skus[$i])); + if ($try === False) $ret = False; + } + else { + $try = $dbc->exec_statement($upP,array($costs[$i], + $units[$i],$skus[$i],$upc,$ids[$i])); + if ($try === False) $ret = False; + } + } + + return $ret; + } +} + +?> diff --git a/fannie/item/pricePerOunce.php b/fannie/item/pricePerOunce.php new file mode 100644 index 000000000..88907f19d --- /dev/null +++ b/fannie/item/pricePerOunce.php @@ -0,0 +1,79 @@ + diff --git a/fannie/item/pricePerSI.php b/fannie/item/pricePerSI.php new file mode 100644 index 000000000..554aea0a2 --- /dev/null +++ b/fannie/item/pricePerSI.php @@ -0,0 +1,144 @@ + diff --git a/fannie/item/prodAd.php b/fannie/item/prodAd.php new file mode 100644 index 000000000..323e4dd51 --- /dev/null +++ b/fannie/item/prodAd.php @@ -0,0 +1,249 @@ +prepare_statement("SELECT upc FROM productUser WHERE upc=?"); + $r = $dbc->exec_statement($q, array($upc)); + if ($dbc->num_rows($r) == 0){ + $ins = $dbc->prepare_statement("INSERT INTO productUser + (upc, description, brand, sizing, photo, long_text, enableOnline) + VALUES (?,?,?,?,NULL,NULL,0)"); + $dbc->exec_statement($ins, array($upc,$desc,$brand,$size)); + } + else { + $up = $dbc->prepare_statement("UPDATE productUser SET description=?, + brand=?,sizing=? + WHERE upc=?"); + $dbc->exec_statement($up, array($desc,$brand,$size,$upc)); + } + + echo "Saved"; + exit; +} + +$page_title = 'Fannie - Advertising Info'; +$header = 'Advertising Info'; +include('../src/header.html'); + +if (isset($_REQUEST['upc']) && isset($_REQUEST['savebutton'])){ + //save + $upc = $_REQUEST['upc']; + $desc = $_REQUEST['desc']; + $size = $_REQUEST['size']; + $brand = $_REQUEST['brand']; + + $q = $dbc->prepare_statement("SELECT upc FROM productUser WHERE upc=?"); + $r = $dbc->exec_statement($q, array($upc)); + if ($dbc->num_rows($r) == 0){ + $ins = $dbc->prepare_statement("INSERT INTO productUser + (upc, description, brand, sizing, photo, long_text, enableOnline) + VALUES (?,?,?,?,NULL,NULL,0)"); + $dbc->exec_statement($ins, array($upc,$desc,$brand,$size)); + } + else { + $up = $dbc->prepare_statement("UPDATE productUser SET description=?, + brand=?,sizing=? + WHERE upc=?"); + $dbc->exec_statement($up, array($desc,$brand,$size,$upc)); + } + + unset($_REQUEST['upc']); +} + +if (isset($_REQUEST['upc'])){ + $q = $dbc->prepare_statement("SELECT description,brand,sizing,photo FROM productUser + WHERE upc=?"); + $r = $dbc->exec_statement($q,array($_REQUEST['upc'])); + $desc = ''; + $brand = ''; + $size = ''; + $photo = ''; + if ($dbc->num_rows($r) > 0){ + $row = $dbc->fetch_row($r); + $desc = $row[0]; + $brand = $row[1]; + $size = $row[2]; + $photo = $row[3]; + } + echo "
        "; + echo "Description: "; + echo "

        "; + echo "Brand: "; + echo "

        "; + echo "Size: "; + echo "

        "; + echo ""; + echo ""; + if (isset($_REQUEST['sale'])) + echo ""; + if (isset($_REQUEST['trim'])) + echo ""; + echo "

        "; + echo ""; + if (!empty($photo)){ + $img = 'images/done/'.$photo; + $pts = explode('.',$photo); + $thumb = 'images/done/'; + for($i=0; $i',$img,$thumb); + } +} +else { + +?> + + + 0) + ORDER BY p.upc"; + + // sales, current or starting within the week + if (isset($_REQUEST['sale'])){ + $q = "SELECT p.upc,u.description,p.description, + u.brand,u.sizing,u.photo,p.start_date,p.end_date + FROM products AS p LEFT JOIN + productUser AS u ON u.upc=p.upc + WHERE p.discounttype <> 0 + ORDER BY p.upc"; + } + + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p); + + if (isset($_REQUEST['trim'])){ + echo "Show all items"; + } + else { + echo "Show unfinished items"; + } + if (!isset($_REQUEST['sale'])){ + echo "    "; + echo "Show current & upcoming sale items"; + } + echo ""; + echo ""; + while($w = $dbc->fetch_row($r)){ + $hilite = ""; + if (empty($w[1]) || empty($w[3]) || empty($w[4]) + || $w[1] == strtoupper($w[1]) + || $w[3] == strtoupper($w[3])) + $hilite = "style=\"background:#ffffcc;\""; + if (isset($_REQUEST['trim']) && empty($hilite)) $hilite = "style=\"display:none;\""; + printf(" + + + + + ", + $hilite,$w[0],$w[0], + ltrim($w[0],'0'),$w[0], + $w[0],(empty($w[1])?' ':$w[1]), + $w[2], + $w[0],$w[3], + $w[0],$w[4], + (empty($w[5])?' ':'X')); + } + echo "
        UPCAdPOSBrandSizingImg
        %s + p%s%s%s%s%s
        "; +} + +include('../src/footer.html'); +?> diff --git a/fannie/item/prodAllLanes_WEFC_Toronto.php b/fannie/item/prodAllLanes_WEFC_Toronto.php new file mode 100644 index 000000000..5e1d51c57 --- /dev/null +++ b/fannie/item/prodAllLanes_WEFC_Toronto.php @@ -0,0 +1,52 @@ +"; + continue; + } + $resultItem = $sql->query($queryItem); + $num = $sql->num_rows($resultItem); + + if ($num == 0){ + $ret .= "Item $upc not found on Lane ".($i+1)."
        "; + } + else if ($num > 1){ + $ret .= "Item $upc found multiple times on Lane ".($i+1)."
        "; + while ($rowItem = $sql->fetch_array($resultItem)){ + $ret .= "{$rowItem['upc']} {$rowItem['description']}
        "; + } + } + else { + $rowItem = $sql->fetch_array($resultItem); + $ret .= "Item $upc on Lane ".($i+1)."
        "; + $ret .= "Price: {$rowItem['normal_price']}"; + if ($rowItem['special_price'] <> 0){ + $ret .= "    ON SALE: {$rowItem['special_price']}"; + } + $ret .= "
        "; + } + if ($i < count($FANNIE_LANES) - 1){ + $ret .= "
        "; + } + } + return $ret; +} +?> diff --git a/fannie/item/prodFunction.php b/fannie/item/prodFunction.php new file mode 100644 index 000000000..3a6f1854e --- /dev/null +++ b/fannie/item/prodFunction.php @@ -0,0 +1,765 @@ +query($queryItem); + $num = $dbc->num_rows($resultItem); + + $likeCodeQ = "SELECT u.*,l.likeCodeDesc FROM upcLike as u, likeCodes as l + WHERE u.likeCode = l.likeCode and u.upc = '$upc'"; + $likeCodeR = $dbc->query($likeCodeQ); + $likeCodeRow = $dbc->fetch_row($likeCodeR); + $likeCodeNum = $dbc->num_rows($likeCodeR); + $likecode = ($likeCodeNum > 0)?$likeCodeRow[1]:''; + + echo ""; + + if($num == 0 || !$num){ + noItem(); + $data = array(); + if (is_numeric($upc)){ + $dataQ = "SELECT description,brand,cost/units as cost,vendorName,margin,i.vendorID + FROM vendorItems AS i LEFT JOIN vendors AS v ON i.vendorID=v.vendorID + LEFT JOIN vendorDepartments AS d ON i.vendorDept=d.deptID + WHERE upc='$upc'"; + if (isset($_REQUEST['vid'])) $dataQ .= " AND i.vendorID=".((int)$_REQUEST['vid']); + $dataR = $dbc->query($dataQ); + if ($dbc->num_rows($dataR) > 0){ + $data = $dbc->fetch_row($dataR); + if (is_numeric($data['cost']) && is_numeric($data['margin'])) + $data['srp'] = getSRP($data['cost'],$data['margin']); + } + } + echo ""; + echo "Item not found. You are creating a new one. "; + if (count($data) > 0){ + echo "
        This product is in the ".$data['vendorName']." catalog. Values have + been filled in where possible
        "; + while($vendorW = $dbc->fetch_row($dataR)){ + printf('This product is also in %s
        ', + $upc,$vendorW['vendorID'],$vendorW['vendorName']); + } + } + echo "
        "; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo " + "; + echo "
        UPC +  
        Description + Price$
        ManufacturerDistributor
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        DeptTaxFSScaleQtyFrcNoDisc
        "; + /** + ** BEGIN CHAINEDSELECTOR CLASS + **/ + require('../src/chainedSelectors.php'); + + //prepare names + $selectorNames = array( + CS_FORM=>"pickSubDepartment", + CS_FIRST_SELECTOR=>"department", + CS_SECOND_SELECTOR=>"subdepartment"); + + // $department = $rowItem[12]; + // $subdepartment = $rowItem[27]; + + //query database, assemble data for selectors + $Query = "SELECT d.dept_no AS dept_no, d.dept_name AS dept_name, + CASE WHEN s.subdept_no IS NULL THEN 0 ELSE s.subdept_no END as subdept_no, + CASE WHEN s.subdept_name IS NULL THEN 'None' ELSE s.subdept_name END AS subdept_name + FROM departments AS d LEFT JOIN + subdepts AS s ON d.dept_no=s.dept_ID + ORDER BY d.dept_no,s.subdept_no"; + if(!($DatabaseResult = $dbc->query($Query))) + { + print("The query failed!
        \n"); + exit(); + } + + while($row = $dbc->fetch_object($DatabaseResult)) + { + $selectorData[] = array( + CS_SOURCE_ID=>$row->dept_no, + CS_SOURCE_LABEL=>$row->dept_name, + CS_TARGET_ID=>$row->subdept_no, + CS_TARGET_LABEL=>$row->subdept_name); + } + + //instantiate class + $subdept = new chainedSelectors( + $selectorNames, + $selectorData); + ?> + + + + + + + + printSelectors($row); //rowItem + ?> + + + +
        "; + $taxQ = "SELECT id,description FROM taxrates ORDER BY id"; + $taxR = $dbc->query($taxQ); + $rates = array(); + while ($taxW = $dbc->fetch_row($taxR)) + array_push($rates,array($taxW[0],$taxW[1])); + array_push($rates,array("0","NoTax")); + echo "
        "; + echo "
        "; + + if (substr($upc,0,3) == "002"){ + echo "
        Scale"; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo "
        Longer description
         
        WeightBy CountTareShelf LifeLabelSafehandling
        "; + echo " Random
        "; + echo " Fixed
        "; + echo "
         
        "; + echo "Expanded text:
        "; + } + + echo "
        Extra Info"; + echo "
          "; + echo "
        • New Shelf Tag
        • "; + echo "
        • Recent Sales History
        • "; + echo "
        • Price History
        • "; + echo "
        "; + echo "
        "; + echo ""; + echo ""; + echo ""; + printf("", + (isset($data['cost']) && is_numeric($data['cost'])?$data['cost']:0) ); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Deposit
        Cost$
        Location
        Local
        InUse
        "; + echo "
        Last modified: ".date('r'); + echo "
        "; + + echo '
        Likecode'; + echo ""; + echo " + '; + echo '
        Like code "; + echo "Check to not update like code items
        Like Code Linked Items
        "; + echo '
        '; + echo 'Likecode Sales History
        '; + + echo "
        "; + echo "Margin"; + echo "
        "; + echo ""; + + + }elseif($num > 1){ + moreItems($upc); + for($i=0;$i < $num;$i++){ + $rowItem= $dbc->fetch_array($resultItem); + $upc = $rowItem['upc']; + echo "" . $upc . " - " . $rowItem['description']; + if($rowItem['discounttype'] == 0) { echo "-- $" .$rowItem['normal_price']. "
        "; } + else { echo "-- $" .$rowItem['special_price']. " onsale
        "; } + } + }else{ + oneItem($upc); + + if ($FANNIE_STORE_ID != 0){ + /* if this isn't HQ, revise the lookup query to search + for HQ records AND store records + ordering by store_id descendings means we'll get the + store record if there is one and the HQ record if + there isn't */ + $clause = sprintf("p.store_id IN (0,%d)",$FANNIE_STORE_ID); + $queryItem = str_replace("p.store_id=0",$clause,$queryItem); + if (strstr($queryItem, "ORDER BY")) + $queryItem = array_shift(explode("ORDER BY",$queryItem)); + $queryItem .= " ORDER BY p.store_id DESC"; + $resultItem = $dbc->query($queryItem); + } + + $rowItem = $dbc->fetch_array($resultItem); + $upc = $rowItem['upc']; + $xtraQ = "SELECT * FROM prodExtra WHERE upc='$upc'"; + $xtraR = $dbc->query($xtraQ); + $xtraRow = $dbc->fetch_row($xtraR); + + $pnQ = "SELECT upc FROM products WHERE department=".$rowItem['department']." ORDER BY upc"; + $prevUPC = False; + $nextUPC = False; + $passed_it = False; + $pnR = $dbc->query($pnQ); + while($pnW = $dbc->fetch_row($pnR)){ + if (!$passed_it && $upc != $pnW[0]) + $prevUPC = $pnW[0]; + else if (!$passed_it && $upc == $pnW[0]) + $passed_it = True; + else if ($passed_it){ + $nextUPC = $pnW[0]; + break; + } + } + + echo "Update Item"; + + echo ""; + echo ""; + echo ""; + echo "
        "; + echo "'; + echo ''; + echo ""; + echo ''; + echo ""; + echo ""; + + if($rowItem[6] <> 0){ + $batchQ = "SELECT b.batchName FROM batches AS b LEFT JOIN batchList as l + on b.batchID=l.batchID WHERE '".date('Y-m-d')."' BETWEEN b.startDate + AND b.endDate AND (l.upc='$upc' OR l.upc='LC$likecode')"; + $batchR = $dbc->query($batchQ); + $batch = "Unknown"; + if ($dbc->num_rows($batchR) > 0) + $batch = array_pop($dbc->fetch_row($batchR)); + echo ""; + } + echo "
        UPC".$rowItem[0].""; + if ($prevUPC) echo " Previous"; + if ($nextUPC) echo " Next"; + echo ''; + echo ''; + echo ($rowItem['store_id']==0 ? 'Master' : 'Store').' record'; + echo '
        Description$'; + echo ''; + echo ''; + echo '
        ManufacturerDistributor
        Sale Price:$rowItem[6] (Batch: $batch)"; + echo "End Date:$rowItem[11]
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        DeptTaxFSScaleQtyFrcNoDisc
        "; + /** + ** BEGIN CHAINEDSELECTOR CLASS + **/ + require('../src/chainedSelectors.php'); + + $selectorNames = array( + CS_FORM=>"pickSubDepartment", + CS_FIRST_SELECTOR=>"department", + CS_SECOND_SELECTOR=>"subdepartment"); + + $Query = "SELECT d.dept_no AS dept_no, d.dept_name AS dept_name, + CASE WHEN s.subdept_no IS NULL THEN 0 ELSE s.subdept_no END as subdept_no, + CASE WHEN s.subdept_name IS NULL THEN 'None' ELSE s.subdept_name END AS subdept_name + FROM departments AS d LEFT JOIN + subdepts AS s ON d.dept_no=s.dept_ID + ORDER BY d.dept_no,s.subdept_no"; + + $DatabaseResult = False; + if(!($DatabaseResult = $dbc->query($Query))) + { + print("The query failed!
        \n"); + exit(); + } + while($row = $dbc->fetch_object($DatabaseResult)) + { + $selectorData[] = array( + CS_SOURCE_ID=>$row->dept_no, + CS_SOURCE_LABEL=>$row->dept_no." - ".$row->dept_name, + CS_TARGET_ID=>$row->subdept_no, + CS_TARGET_LABEL=>$row->subdept_name); + } + + $subdept = new chainedSelectors( + $selectorNames, + $selectorData); + ?> + + + + + + + + printSelectors($rowItem); + ?> + + + + "; + echo "
        "; + $taxQ = "SELECT id,description FROM taxrates ORDER BY id"; + $taxR = $dbc->query($taxQ); + $rates = array(); + while ($taxW = $dbc->fetch_row($taxR)) + array_push($rates,array($taxW[0],$taxW[1])); + array_push($rates,array("0","NoTax")); + echo ""; + echo "
        "; + /* + echo "Deposit "; + echo ""; + */ + echo " +         + Back"; + echo "
        "; + + if (substr($upc,0,3) == "002"){ + echo "
        Scale"; + echo ""; + $scaleR = $dbc->query("SELECT * FROM scaleItems WHERE plu='$upc'"); + $scale = array(); + if ($dbc->num_rows($scaleR) > 0) + $scale = $dbc->fetch_row($scaleR); + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo "
        Longer description
         
        WeightBy CountTareShelf LifeLabelSafehandling
        "; + if (!isset($scale['weight']) || $scale['weight']==0){ + echo " Random
        "; + echo " Fixed
        "; + } + else { + echo " Random
        "; + echo " Fixed
        "; + } + echo "
         
        "; + echo "Expanded text:
        "; + } + + echo "
        Extra Info"; + echo "
        "; + echo "
        "; + echo ""; + echo ""; + echo ""; + printf("",$rowItem['cost']); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Deposit
        Cost$
        Location
        Local
        InUse
        "; + echo "
        Last modified: {$rowItem['modified']}"; + echo "
        "; + echo '
        Likecode'; + echo ""; + echo " + '; + echo '
        Like code "; + echo "Check to not update like code items
        '; + + echo "
        "; + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == "WEFC_Torontx" ) { + echo "Markup"; + MarkupFS($rowItem['upc'],$rowItem['cost'],$rowItem['department']); + } else { + echo "Margin"; + MarginFS($rowItem['upc'],$rowItem['cost'],$rowItem['department']); + } + echo "
        "; + + echo '
        '; + echo 'Lane Status'; + include('prodAllLanes.php'); + echo allLanes($upc); + echo '
        '; + + } + return $num; +} + +function likedtotable($query,$border,$bgcolor) +{ + global $dbc; + $results = $dbc->query($query) or + die("
      • errorno=".$dbc->errno() + ."
      • error=" .$dbc->error() + ."
      • query=".$query); + $number_cols = $dbc->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $dbc->fetch_row($results)) + { + echo "\n"; + echo "\n"; + } echo "\n"; + } echo "
        " . $dbc->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + + "; + } + for ($i=1;$i<$number_cols-1; $i++) + { + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +function noItem() +{ + echo "

        No Items Found

        "; +} + +function moreItems($upc) +{ + echo "More than 1 item found for:

        " . $upc . "


        "; +} + +function oneItem($upc) +{ + echo "One item found for: " . $upc; +} + +// +// PHP INPUT DEBUG SCRIPT -- very helpful! +// + +/* +function debug_p($var, $title) +{ + print "

        $title

        ";
        +    print_r($var);
        +    print "
        "; +} + +debug_p($_REQUEST, "all the data coming in"); +*/ +?> + diff --git a/fannie/item/prodFunction_WEFC_Toronto.php b/fannie/item/prodFunction_WEFC_Toronto.php new file mode 100644 index 000000000..8e70003c2 --- /dev/null +++ b/fannie/item/prodFunction_WEFC_Toronto.php @@ -0,0 +1,1357 @@ +query($queryItem); + $num = $dbc->num_rows($resultItem); + + $likeCodeQ = "SELECT u.*,l.likeCodeDesc FROM upcLike as u, likeCodes as l + WHERE u.likeCode = l.likeCode and u.upc = '$upc'"; + $likeCodeR = $dbc->query($likeCodeQ); + $likeCodeRow = $dbc->fetch_row($likeCodeR); + $likeCodeNum = $dbc->num_rows($likeCodeR); + $likecode = ($likeCodeNum > 0)?$likeCodeRow[1]:''; + + // 2. Compose code in the HEAD of the HTML page. + echo ""; + echo ""; + + // 3. No match. Compose form for creation of a new item. + if($num == 0 || !$num){ + $data = array(); + if (is_numeric($upc) || $numType == 'SKU'){ + $searchField = ($numType == 'SKU')?'sku':'upc'; + $dataQ = "SELECT description,brand,cost/units as cost,vendorName,margin,i.vendorID, + i.size,i.units,i.cost as case_cost,i.sku,i.upc + FROM vendorItems AS i LEFT JOIN vendors AS v ON i.vendorID=v.vendorID + LEFT JOIN vendorDepartments AS d ON i.vendorDept=d.deptID + WHERE $searchField = '$upc'"; + // When would this be set? + if (isset($_REQUEST['vid'])) + $dataQ .= " AND i.vendorID=".((int)$_REQUEST['vid']); + $dataR = $dbc->query($dataQ); + if ($dbc->num_rows($dataR) > 0){ + $data = $dbc->fetch_row($dataR); + // ->EL vendorItems.cost is case_cost but data[cost] is unit_cost. + if (is_numeric($data['cost']) && is_numeric($data['margin'])) + $data['srp'] = getSRP($data['cost'],$data['margin']); + if ( preg_match("/(\d+) *([a-z]+)/", $data['size'], $matches) ) { + $numeric_size = $matches[1]; + $unitofmeasure = $matches[2]; + } + } + } + + $char_count_class = "char_count"; + if ( isset($FANNIE_COMPOSE_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_PRODUCT_DESCRIPTION == "1" ) { + $char_count_class = "char_count_pkg"; + } + + // Is ever closed for Create? + echo ""; + noItem(); + if (count($data) > 0){ + echo "
        This product is in the ".$data['vendorName']." catalog. Values have + been filled in where possible
        "; + while($vendorW = $dbc->fetch_row($dataR)){ + printf('This product is also in %s
        ', + $upc,$vendorW['vendorID'],$vendorW['vendorName']); + } + } + echo ""; + + // 3a. Create - First Block + echo "
        "; + // 8Mar13 Use looked-up upc if there was one. + echo ""; + echo ""; + echo ""; + echo ""; + +//New{ + echo ""; + echo ""; + + echo ""; + echo ""; +//new} + echo " + "; + echo "
        UPC 
        Description"; + echo '
        Char ct
        '; + echo "
        Price $
        Package Size   Unit of measure Vendor SKU
        Long Desc.  
        ManufacturerDistributor
        "; + + // 3b. Create - Second Block + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        DeptTaxFSScaleQtyFrcNoDisc
        "; + /** + ** BEGIN CHAINEDSELECTOR CLASS + **/ + require('../src/chainedSelectors.php'); + + //prepare names + $selectorNames = array( + CS_FORM=>"pickSubDepartment", + CS_FIRST_SELECTOR=>"department", + CS_SECOND_SELECTOR=>"subdepartment"); + + // $department = $rowItem[12]; + // $subdepartment = $rowItem[27]; + + //query database, assemble data for selectors + $Query = "SELECT d.dept_no AS dept_no, d.dept_name AS dept_name, + CASE WHEN s.subdept_no IS NULL THEN 0 ELSE s.subdept_no END as subdept_no, + CASE WHEN s.subdept_name IS NULL THEN 'None' ELSE s.subdept_name END AS subdept_name + FROM departments AS d LEFT JOIN + subdepts AS s ON d.dept_no=s.dept_ID + ORDER BY d.dept_no,s.subdept_no"; + if(!($DatabaseResult = $dbc->query($Query))) + { + print("The query failed!
        \n"); + exit(); + } + + while($row = $dbc->fetch_object($DatabaseResult)) + { + $selectorData[] = array( + CS_SOURCE_ID=>$row->dept_no, + CS_SOURCE_LABEL=>$row->dept_name, + CS_TARGET_ID=>$row->subdept_no, + CS_TARGET_LABEL=>$row->subdept_name); + } + + //instantiate class + $subdept = new chainedSelectors( + $selectorNames, + $selectorData); + ?> + + + + + + + + printSelectors($row); //rowItem + ?> + + + +
        "; + $taxQ = "SELECT id,description FROM taxrates ORDER BY id"; + $taxR = $dbc->query($taxQ); + $rates = array(); + while ($taxW = $dbc->fetch_row($taxR)) + array_push($rates,array($taxW[0],$taxW[1])); + array_push($rates,array("0","NoTax")); + echo "
        "; + + echo "
        "; + echo " +         + Back"; + echo "        + Last modified: ".date('r').""; + echo "
        "; + echo "
        "; + + // 's Create - Deli scale item + if (substr($upc,0,3) == "002"){ + // 3c. Create - Deli-Scale Fieldset + echo "
        Scale"; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo "
        Longer description
         
        WeightBy CountTareShelf LifeLabelSafehandling
        "; + echo " Random
        "; + echo " Fixed
        "; + echo "
         
        "; + echo "Expanded text:
        "; + // Create - Deli-Scale + } + + $fieldsetWidth = 13; + // 3d. Create - Operations Fieldset + echo "
        "; + echo "
        Operations"; + echo "
          "; + echo "
        • New Shelf Tag
        • "; + echo "
        • Recent Sales
          History
        • "; + echo "
        • Price History
        • "; + echo "
        "; + echo "
        "; + echo "
        "; + + //'c 3ea. Create - Item Flags Fieldset + echo "
        "; + echo "
        Item Flags"; + echo ""; + + $q = "SELECT f.description, + f.bit_number, + (1<<(f.bit_number-1)) & p.numflag AS flagIsSet + FROM products AS p, prodFlags AS f + WHERE p.upc=$upc"; + $r = $dbc->query($q); + + // item does not exist. Just get the flag names. + if ($dbc->num_rows($r) == 0){ + $q = 'SELECT f.description,f.bit_number,0 AS flagIsSet + FROM prodFlags AS f'; + $r = $dbc->query($q); + } + + $ret = ''; + $i=0; + while($w = $dbc->fetch_row($r)){ + if ($i==0) $ret .= ''; + // n-column table + if ($i != 0 && $i % 2 == 0) $ret .= ''; + $ret .= sprintf(' + ',$w['bit_number'], + ($w['flagIsSet']==0 ? '' : 'checked'), + $w['description'] + ); + $i++; + } + if ( strlen($ret) > 0 ) + $ret .= ""; + echo "$ret"; + + echo "
        %s
        "; + echo "
        "; + echo "
        "; + + // 3eb. Create - Extra Info Fieldset + echo "
        "; + echo "
        Extra Info"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Deposit
        Location
        Local
        InUse
        "; + echo "
        "; + echo "
        "; + + // 3f. Create - Multiples Fieldset + // There will never be existing values. + echo "
        "; + echo '
        "Three for a dollar"'; + echo "
        "; + echo ""; + echo ""; + echo ""; + + echo ""; + echo ""; + + // ?pricemethod must default to 0. + echo ""; + echo ""; + + echo ""; + echo ""; + + echo "
        #items
        For \$
        Method
        MixMatch
        "; + echo "
        "; + echo "
        "; + echo "
        "; + + // 3g. Create - Cost Fieldset + echo "
        "; + echo "
        Cost"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + printf("", + (isset($data['units']) && is_numeric($data['units'])?$data['units']:'') ); + + echo "
        Single \$
        Case \$
        Items/case
        "; + echo ""; + echo "
        "; + echo "
        "; + + // 3h. Create - Sale Fieldset + echo "
        "; + echo '
        Sale'; + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + // This should really be in the db and be per-coop-configurable. + $discounttypes = array(0 => "None", 1 => "All", 2 => "Mem."); + echo ""; + + echo ""; + echo ""; + echo "
        Start Date
        End Date
        Sale for
        Price \$
        "; + + echo '
        "Three for a dollar"'; + echo ""; + + // quantity must default to 0. + echo ""; + echo ""; + + echo ""; + echo ""; + + // ?pricemethod must default to 0. + echo ""; + echo ""; + echo "
        #Items
        For \$
        Method
        "; + echo '
        '; + + echo ""; + echo '
        '; + echo "
        "; + + // 3i. Create - Margin Fieldset + echo "
        "; + echo "
        "; + echo "Margin"; + echo "
        "; + echo ""; + echo "
        "; + + // 3j. Create - Likecode Fieldset + echo "
        "; + echo '
        Likecode'; + echo ""; + echo ""; + echo "'; + echo '
        Like code "; + $lcWidth = ($fieldsetWidth - 4); // Was 175px + echo "
        Check to not update like code items
        Like Code Linked Items
        "; + echo '
        '; + echo 'Likecode Sales History
        '; + echo "
        "; + + // Form for Create. + } + // 4. More than one match. Make a list to choose from. + elseif($num > 1){ + moreItems($upc); + for($i=0;$i < $num;$i++){ + $rowItem= $dbc->fetch_array($resultItem); + $upc = $rowItem['upc']; + echo "" . $upc . " - " . $rowItem['description']; + if($rowItem['discounttype'] == 0) { echo "-- $" .$rowItem['normal_price']. "
        "; } + else { echo "-- $" .$rowItem['special_price']. " onsale
        "; } + } + } + // 5. One match. Compose form for editing an existing item. + else{ + + if ($FANNIE_STORE_ID != 0){ + /* if this isn't HQ, revise the lookup query to search + for HQ records AND store records + ordering by store_id descending means we'll get the + store record if there is one and the HQ record if + there isn't */ + $clause = sprintf("p.store_id IN (0,%d)",$FANNIE_STORE_ID); + $queryItem = str_replace("p.store_id=0",$clause,$queryItem); + if (strstr($queryItem, "ORDER BY")) + $queryItem = array_shift(explode("ORDER BY",$queryItem)); + $queryItem .= " ORDER BY p.store_id DESC"; + $resultItem = $dbc->query($queryItem); + } + + // products.* and prodExtra .manufacturer and .distributor + $rowItem = $dbc->fetch_array($resultItem); + + // All of prodExtra + $upc = $rowItem['upc']; + $xtraQ = "SELECT * FROM prodExtra WHERE upc='$upc'"; + $xtraR = $dbc->query($xtraQ); + $xtraRow = $dbc->fetch_row($xtraR); + //EL+ All of productUser + $userQ = "SELECT * FROM productUser WHERE upc='$upc'"; + $userR = $dbc->query($userQ); + $userRow = $dbc->fetch_row($userR); + + /* For WEFC_Toronto only + * Raw versions of products.description and productUser.descriptio + * are in products_WEFC_Toronto + */ + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == "WEFC_Toronto" ) { + $coopQ = "SELECT * FROM products_{$FANNIE_COOP_ID} WHERE upc='$upc'"; + $coopR = $dbc->query($coopQ); + $coopRow = $dbc->fetch_row($coopR); + if ( !empty($coopRow['description']) ) { + $rowItem['description'] = $coopRow['description']; + } + if ( !empty($coopRow['search_description']) ) { + $userRow['description'] = $coopRow['search_description']; + } + } + + $char_count_class = "char_count"; + if ( isset($FANNIE_COMPOSE_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_PRODUCT_DESCRIPTION == "1" ) { + $char_count_class = "char_count_pkg"; + } + + // Get the previous and next upc from the same department. + $pnQ = "SELECT upc FROM products WHERE department=".$rowItem['department']." ORDER BY upc"; + $prevUPC = False; + $nextUPC = False; + $passed_it = False; + $pnR = $dbc->query($pnQ); + while($pnW = $dbc->fetch_row($pnR)){ + if (!$passed_it && $upc != $pnW[0]) + $prevUPC = $pnW[0]; + else if (!$passed_it && $upc == $pnW[0]) + $passed_it = True; + else if ($passed_it){ + $nextUPC = $pnW[0]; + break; + } + } + + echo "Update Item"; + + echo ""; + + echo ""; + oneItem($upc); + echo ""; + + // 5a. Update - First Block + echo "
        "; + echo "'; + echo ''; + // If the ThreeForDollar (Multiples) fieldset/module is enabled support only normal_price editing here. + if ( array_search('ThreeForDollar',$Fannie_Item_Modules) !== False ) { + echo ""; + echo ''; + } + // If the ThreeForDollar (Multiples) fieldset/module is not enabled support both normal_price and that editing here. + else { + echo ""; + echo ''; + } + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + // If the item is on sale. + if($rowItem[6] <> 0){ + $batchQ = "SELECT b.batchName FROM batches AS b + LEFT JOIN batchList as l ON b.batchID=l.batchID + WHERE '".date('Y-m-d')."' BETWEEN b.startDate + AND b.endDate AND (l.upc='$upc' OR l.upc='LC$likecode')"; + $batchR = $dbc->query($batchQ); + $batch = "Unknown"; + if ($dbc->num_rows($batchR) > 0) + $batch = array_pop($dbc->fetch_row($batchR)); + echo ""; + echo ""; + } + echo "
        UPC".$rowItem[0].""; + if ($prevUPC) echo " Previous"; + if ($nextUPC) echo " Next"; + echo ''; + echo ''; + echo ($rowItem['store_id']==0 ? 'Master' : 'Store').' record'; + echo '
        Description'; + echo '"; + echo '
        Char ct
        '; + echo '
        Price$
        $ '; + echo ''; + echo " for $"; + echo ''; + echo ''; + echo '
        Package Size   Unit of measure Vendor SKU
        Long Desc.  
        ManufacturerDistributor
        Sale Price:$rowItem[6] (Batch: $batch)End Date:$rowItem[11]
        "; + + // 5b. Update - Second Block + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        DeptTaxFSScaleQtyFrcNoDisc
        "; + /** + ** BEGIN CHAINEDSELECTOR CLASS + **/ + require('../src/chainedSelectors.php'); + + $selectorNames = array( + CS_FORM=>"pickSubDepartment", + CS_FIRST_SELECTOR=>"department", + CS_SECOND_SELECTOR=>"subdepartment"); + + $Query = "SELECT d.dept_no AS dept_no, d.dept_name AS dept_name, + CASE WHEN s.subdept_no IS NULL THEN 0 ELSE s.subdept_no END as subdept_no, + CASE WHEN s.subdept_name IS NULL THEN 'None' ELSE s.subdept_name END AS subdept_name + FROM departments AS d LEFT JOIN + subdepts AS s ON d.dept_no=s.dept_ID + ORDER BY d.dept_no,s.subdept_no"; + + $DatabaseResult = False; + if(!($DatabaseResult = $dbc->query($Query))) + { + print("The query failed!
        \n"); + exit(); + } + while($row = $dbc->fetch_object($DatabaseResult)) + { + $selectorData[] = array( + CS_SOURCE_ID=>$row->dept_no, + CS_SOURCE_LABEL=>$row->dept_no." - ".$row->dept_name, + CS_TARGET_ID=>$row->subdept_no, + CS_TARGET_LABEL=>$row->subdept_name); + } + + $subdept = new chainedSelectors( + $selectorNames, + $selectorData); + ?> + + + + + + + + printSelectors($rowItem); + ?> + + + + "; + echo "
        "; + $taxQ = "SELECT id,description FROM taxrates ORDER BY id"; + $taxR = $dbc->query($taxQ); + $rates = array(); + while ($taxW = $dbc->fetch_row($taxR)) + array_push($rates,array($taxW[0],$taxW[1])); + array_push($rates,array("0","NoTax")); + echo ""; + echo "
        "; + echo "
        "; + echo " +         + Back"; + echo "        + Last modified: {$rowItem['modified']}"; + echo "        + Delete this item"; + echo "
        "; + echo "
        "; + + if (substr($upc,0,3) == "002"){ + // 5c. Update - Deli-Scale Fieldset + // Might be better to do top whitespace with margin. + echo "
        Scale"; + echo ""; + $scaleR = $dbc->query("SELECT * FROM scaleItems WHERE plu='$upc'"); + $scale = array(); + if ($dbc->num_rows($scaleR) > 0) + $scale = $dbc->fetch_row($scaleR); + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo "
        Longer description
         
        WeightBy CountTareShelf LifeLabelSafehandling
        "; + if (!isset($scale['weight']) || $scale['weight']==0){ + echo " Random
        "; + echo " Fixed
        "; + } + else { + echo " Random
        "; + echo " Fixed
        "; + } + echo "
         
        "; + echo "Expanded text:
        "; + // Update - Deli-Scale + } + + // 5d. Update - Operations Fieldset + $fieldsetWidth = 13; + echo "
        "; + echo "
        Operations"; + echo "
        "; + //echo "
        "; + echo "
        "; + echo "
        "; + echo ""; + + //'u 5ea. Update - Item Flags Fieldset + echo "
        "; + echo "
        Item Flags"; + echo ""; + $q = "SELECT f.description, + f.bit_number, + (1<<(f.bit_number-1)) & p.numflag AS flagIsSet + FROM products AS p, prodFlags AS f + WHERE p.upc=$upc + ORDER BY f.bit_number"; + $r = $dbc->query($q); + + // item does not exist. Just get the flag names. + if ($dbc->num_rows($r) == 0){ + $q = 'SELECT f.description,f.bit_number,0 AS flagIsSet + FROM prodFlags AS f'; + $r = $dbc->query($q); + } + + $ret = ''; + $i=0; + while($w = $dbc->fetch_row($r)){ + if ($i==0) $ret .= ''; + // n-column table + if ($i != 0 && $i % 2 == 0) $ret .= ''; + $ret .= sprintf(' + ',$w['bit_number'], + ($w['flagIsSet']==0 ? '' : 'checked'), + $w['description'] + ); + $i++; + } + if ( strlen($ret) > 0 ) + $ret .= ""; + echo "$ret"; + + echo "
        %s
        "; + echo "
        "; + echo "
        "; + + // 5e. Update - Extra Info Fieldset + // ->EL Why does the top of this fieldset align below the top of Operations here but even with it in Create? + echo "
        "; + echo "
        Extra Info"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Deposit
        Location
        Local
        InUse
        "; + echo "
        "; + echo "
        "; + + // 5f. Update - Multiples Fieldset + echo "
        "; + echo '
        "Three for a dollar"'; + echo "
        "; + echo ""; + echo ""; + echo ""; + + echo ""; + echo ""; + + // ?pricemethod must default to 0. + echo ""; + echo ""; + + echo ""; + echo ""; + + echo "
        #items
        For \$
        Method
        MixMatch
        "; + echo "
        "; + echo "
        "; + echo "
        "; + + // 5g. Update - Cost Fieldset + echo "
        "; + echo "
        Cost"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + printf("", + (isset($xtraRow['case_quantity']) && is_numeric($xtraRow['case_quantity'])?$xtraRow['case_quantity']:'') ); + + echo "
        Single \$
        Case \$
        Items/case
        "; + echo "
        "; + echo "
        "; + + // 5h. Update - Sale Fieldset + echo "
        "; + echo '
        Sale'; + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + echo ""; + + echo ""; + // This should really be in the db and be per-coop-configurable. + $discounttypes = array(0 => "None", 1 => "All", 2 => "Mem."); + echo ""; + + echo ""; + echo ""; + echo "
        Start Date
        End Date
        Sale for
        Price \$
        "; + + echo '
        "Three for a dollar"'; + echo ""; + // quantity must default to 0. + echo ""; + echo ""; + + echo ""; + echo ""; + + // ?pricemethod must default to 0. + echo ""; + echo ""; + echo "
        #Items
        For \$
        Method
        "; + echo '
        '; + + echo ""; + echo '
        '; + echo "
        "; + + + // 5i. Update - Margin Fieldset + echo "
        "; + echo "
        "; + echo "Margin"; + MarginFS($rowItem['upc'],$rowItem['cost'],$rowItem['department']); + echo "
        "; + echo '
        '; //of what? + echo ""; + + // 5j. Update - Likecode Fieldset + echo "
        "; + echo "
        Likecode"; + echo ""; + echo ""; + $lcWidth = ($fieldsetWidth - 4); // Was 175px + echo ""; + + echo ""; + + echo "'; + echo ''; + echo ''; + echo '
        Like code
        Check to not update like code items
        '; + echo 'Likecode Sales History
        '; + echo '
        '; + echo ""; + + echo "

        "; + // 5k. Update - Lane Status Fieldset + echo "
        "; + echo '
        '; + echo 'Lane Status'; + include('prodAllLanes_WEFC_Toronto.php'); + echo allLanes($upc); + echo '
        '; + echo "
        "; + + } + return $num; + +// itemParse +} + +function likedtotable($query,$border,$bgcolor) +{ + global $dbc; + $results = $dbc->query($query) or + die("
      • errorno=".$dbc->errno() + ."
      • error=" .$dbc->error() + ."
      • query=".$query); + $number_cols = $dbc->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $dbc->fetch_row($results)) + { + echo "\n"; + echo "\n"; + } echo "\n"; + } echo "
        " . $dbc->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + + "; + } + for ($i=1;$i<$number_cols-1; $i++) + { + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +function noItem() +{ + //echo "

        No Items Found

        "; + echo "Item not found. You are creating a new one."; +} + +function moreItems($upc) +{ + echo "More than 1 item found for:

        " . $upc . "


        "; +} + +function oneItem($upc) +{ + echo "One item found for: " . $upc; +} + +/* Return numbers that are in named arrays formatted %.2f + * If entered without decimals, add them. + * Return non-numbers as $none + * Treat non-existent, empty, False and 0 values as $none and do not format. + * Does not change the original value. +*/ +function saveAsMoney(&$arr,$index,$none="0") { + if ( !empty($arr["$index"]) && is_numeric($arr["$index"]) ) { + if ( strpos($arr["$index"],'.') === False ) + $retVal = sprintf("%.2f", $arr["$index"]/100); + else + $retVal = sprintf("%.2f", $arr["$index"]); + } else { + $retVal = $none; + } + return $retVal; +// asMoney() +} + +/* Return numbers that are in named arrays formatted %.2f for display or edit. + * Return non-numbers as $none + * Treat non-existent, empty, False and 0 values as $none and do not format. + * Does not change the original value. +*/ +function showAsMoney(&$arr,$index,$none="") { + if ( is_int($index) ) { + // For a MySQL double with value 0, == 0 is True, === 0 is false. + // The money fields in products are double (float). + // The money fields in vendorItems, prodExtra are decimal(10,2). + // This 0.00 test for dec(10,2)'s that are 0.00 in the db doesn't seem to change anything. + //if ( array_key_exists($index,$arr) && ($arr[$index] == 0 || $arr[$index] === 0.00) ) {} + if ( array_key_exists($index,$arr) && $arr[$index] == 0 ) { + $retVal = "0.00"; + } elseif ( !empty($arr[$index]) && is_numeric($arr[$index]) ) { + $retVal = sprintf("%.2f", $arr[$index]); + } else { + $retVal = $none; + } + } + else { + // For a MySQL double with value 0, == 0 is True, === 0 is false. + // The money fields in products are double (float). + // The money fields in vendorItems, prodExtra are decimal(10,2). + // This 0.00 test for dec(10,2)'s that are 0.00 in the db doesn't seem to change anything. + //if ( array_key_exists("$index",$arr) && ($arr["$index"] == 0 || $arr["$index"] === 0.00) ) {} + if ( array_key_exists("$index",$arr) && $arr["$index"] == 0 ) { + $retVal = "0.00"; + } elseif ( !empty($arr["$index"]) && is_numeric($arr["$index"]) ) { + $retVal = sprintf("%.2f", $arr["$index"]); + } else { + $retVal = $none; + } + } + return $retVal; +// showAsMoney() +} + +function promptForUPC($upc="") { + $retVal = ''; + $retVal .= "Enter the code for, or words from the description of, an existing product:"; + $retVal .= "
        "; + + $retVal .= ""; + $retVal .= " "; + $retVal .= " is a "; + $retVal .= ""; + + $retVal .= "
        "; + $retVal .= "To add a product enter its UPC or PLU or Vendor SKU."; + if ( !empty($upc) ) + $retVal .= "
          Edit $upc again"; + $retVal .= "
        "; + + return $retVal; +} + +// $flags is an array of powers of 2. +function setProductFlags($flags){ + $numflag = 0; + if (is_array($flags)) { + foreach($flags as $f){ + if ($f != (int)$f) continue; + $numflag = $numflag | (1 << ($f-1)); + } + } + return $numflag; +} + +// +// PHP INPUT DEBUG SCRIPT -- very helpful! +// + +/* +function debug_p($var, $title) +{ + print "

        $title

        ";
        +    print_r($var);
        +    print "
        "; +} + +debug_p($_REQUEST, "all the data coming in"); +*/ +?> + diff --git a/fannie/item/productList.php b/fannie/item/productList.php new file mode 100644 index 000000000..c0f9b2432 --- /dev/null +++ b/fannie/item/productList.php @@ -0,0 +1,4 @@ + diff --git a/fannie/item/results.php b/fannie/item/results.php new file mode 100644 index 000000000..2b7cf0ec2 --- /dev/null +++ b/fannie/item/results.php @@ -0,0 +1,67 @@ + + + + + + + + + + + '; + + foreach ($backoffice['multiple_results'] as $row) { + $html.=' + + + + + '; + } + + $html.=' + +
        UPCDescriptionPrice
        '.$row['upc'].''.$row['description'].''.money_format("%!.2n", $row['normal_price']).'
        + '; + } else if (isset($backoffice['product_detail'])) { + similarproducts(&$backoffice); + if (count($backoffice['similar_products']>0)) { + $html=' +
        + + + + + + + + + + '; + + foreach ($backoffice['similar_products'] as $row) { + $html.=' + + + + + '; + } + + $html.=' + +
        UPCDescriptionPrice
        '.$row['upc'].''.$row['description'].''.money_format("%!.2n", $row['normal_price']).'
        +
        '; + } else { + $html=''; + } + } else { + $html=''; + } + return $html; + } diff --git a/fannie/item/scaleDelete.php b/fannie/item/scaleDelete.php new file mode 100644 index 000000000..facafd61c --- /dev/null +++ b/fannie/item/scaleDelete.php @@ -0,0 +1,98 @@ + + + +Delete Scale PLU Tool"; + +if (isset($_REQUEST['upc']) && !isset($_REQUEST['deny'])){ + $upc = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + + if (isset($_REQUEST['submit'])){ + $p = $dbc->prepare_statement("SELECT * FROM scaleItems WHERE plu=?"); + $rp = $dbc->exec_statement($p,array($upc)); + if ($dbc->num_rows($rp) == 0){ + printf("No item found for %s

        ",$upc); + echo "Go back"; + } + else { + $rw = $dbc->fetch_row($rp); + echo ""; + echo "Delete this item?
        "; + echo ""; + echo ""; + printf("",$rw['plu'], + $rw['plu'],$rw['plu'],$rw['itemdesc'],$rw['price']); + echo "
        UPCDescriptionPrice
        + %s%s%.2f

        "; + printf("",$upc); + echo ""; + echo "      "; + echo ""; + } + } + else if (isset($_REQUEST['confirm'])){ + $plu = substr($upc,3,4); + $p = $dbc->prepare_statement("DELETE FROM scaleItems WHERE plu=?"); + $rp = $dbc->exec_statement($p,array($upc)); + include('hobartcsv/parse.php'); + deleteitem($plu); + + include('laneUpdates.php'); + printf("Item %s has been deleted

        ",$upc); + echo "Delete another item"; + } +}else{ + echo ""; + echo " Enter UPC/PLU here

        "; + + echo ""; + echo "

      • "; + echo ""; +} + +include ('../src/footer.html'); + +?> diff --git a/fannie/item/updateItems.php b/fannie/item/updateItems.php new file mode 100644 index 000000000..8680c4cb4 --- /dev/null +++ b/fannie/item/updateItems.php @@ -0,0 +1,383 @@ +escape($_REQUEST['descript']); +$up_array['pricemethod'] = 0; +$up_array['groupprice'] = 0.00; +$up_array['quantity'] = 0; +$up_array['department'] = $_REQUEST['department']; +$up_array['size'] = "''"; +$up_array['scaleprice'] = 0.00; +$up_array['modified'] = $dbc->now(); +$up_array['advertised'] = 1; +$up_array['tareweight'] = 0; +$up_array['unitofmeasure'] = "''"; +$up_array['wicable'] = 0; +$up_array['idEnforced'] = 0; +$up_array['cost'] = $_REQUEST['cost']; +$up_array['inUse'] = 1; +$up_array['subdept'] = $_REQUEST['subdepartment']; +$up_array['local'] = isset($_REQUEST['local'])?1:0; +$up_array['store_id'] = isset($_REQUEST['store_id'])?$_REQUEST['store_id']:0; +$up_array['numflag'] = 0; + + +/* turn on volume pricing if specified, but don't + alter pricemethod if it's already non-zero */ +if (isset($_REQUEST['doVolume']) && is_numeric($_REQUEST['vol_price']) && is_numeric($_REQUEST['vol_qtty'])){ + $up_array['pricemethod'] = $_REQUEST['pricemethod']; + if ($up_array['pricemethod']==0) $up_array['pricemethod']=2; + $up_array['groupprice'] = $_REQUEST['vol_price']; + $up_array['quantity'] = $_REQUEST['vol_qtty']; +} + +/* pull the current, HQ values for all the editable fields + and compare them to the submitted values + Store actual changes in the array $CHANGES +*/ +$currentQ = "SELECT tax,foodstamp,scale,deposit,qttyEnforced,discount,normal_price, + description,pricemethod,groupprice,quantity,department,cost,subdept,local + FROM products WHERE upc='$upc' AND store_id=0"; +$currentR = $dbc->query($currentQ); +$currentW = array(); +if ($dbc->num_rows($currentR) > 0) + $currentW = $dbc->fetch_row($currentR); +$CHANGES = array(); +foreach($up_array as $column => $new_value){ + if (!isset($currentW[$column])) continue; + if ($currentW[$column] != trim($new_value,"'")){ + $CHANGES[$column] = array( + 'old' => $currentW[$column], + 'new' => trim($new_value,"'") + ); + } +} + +$sR = $dbc->query("SELECT superID FROM MasterSuperDepts WHERE dept_ID=".$up_array['department']); +$sID = 0; +if ($dbc->num_rows($sR) > 0) + $sID = array_pop($dbc->fetch_row($sR)); + +/* Xel. Validate credentials of the operator. */ +$uid = 0; +if (!$validatedUser && !$auditedUser && $logged_in){ + $validatedUser = validateUserQuiet('pricechange',$subdepartment); +} +if ($validatedUser){ + $validatedUID = getUID($validatedUser); + $uid = $validatedUID; +} +elseif ($auditedUser){ + $auditedUID = getUID($auditedUser); + $uid = $auditedUID; + include('audit.php'); +/* Xel. Notify dept manager of the new values. */ + if (!empty($likeCode)) + audit($sID,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc,$likeCode); + else + audit($sID,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc); +} + +/* Xel. Insert or update products */ +if ($up_array['store_id'] == $FANNIE_STORE_ID){ + // record exists so update it + $dbc->smart_update('products',$up_array,"upc='$upc'"); +} +else if($up_array['store_id']==0 && count($CHANGES) > 0){ + // only the HQ record exists and this is not HQ + // so it has to be an insert + // only create a new record if changes really exist + $up_array['store_id'] = $FANNIE_STORE_ID; + $up_array['upc'] = $dbc->escape($_REQUEST['upc']); + $up_array['special_price'] = 0.00; + $up_array['specialpricemethod'] = 0; + $up_array['specialgroupprice'] = 0.00; + $up_array['specialquantity'] = 0; + // EL When these are assignable don't use defaults + $up_array['mixmatchcode'] = "'0'"; + // + $up_array['discounttype'] = 0; + $up_array['start_date'] = "'1900-01-01'"; + $up_array['end_date'] = "'1900-01-01'"; + $up_array['numflag'] = 0; + $up_array['store_id'] = 0; + $dbc->smart_insert('products',$up_array); +} + +/* Xel. Apply HQ updates to non-HQ records */ +// apply HQ updates to non-HQ records +// where the current value matches the old HQ value +if ($FANNIE_STORE_ID==0 && count($CHANGES) > 0){ + foreach($CHANGES as $col => $values){ + $v_old = is_numeric($values['old']) ? $values['old'] : $dbc->escape($values['old']); + $v_new = is_numeric($values['new']) ? $values['new'] : $dbc->escape($values['new']); + $upQ = sprintf("UPDATE products SET %s=%s,modified=%s + WHERE %s=%s AND upc=%s AND store_id > 0", + $col,$v_new, + $dbc->now(), + $col,$v_old, + $dbc->escape($upc)); + $upR = $dbc->query($upQ); + } +} + +/* Xel. Insert or update prodExtra */ +if ($dbc->table_exists('prodExtra')){ + $arr = array(); + $arr['manufacturer'] = $dbc->escape($_REQUEST['manufacturer']); + $arr['distributor'] = $dbc->escape($_REQUEST['distributor']); + $arr['cost'] = $up_array['cost']; + $arr['location'] = $dbc->escape($_REQUEST['location']); + + $checkR = $dbc->query("SELECT upc FROM prodExtra WHERE upc='$upc'"); + if ($dbc->num_rows($checkR) == 0){ + // if prodExtra record doesn't exist, needs more values + $arr['upc'] = $dbc->escape($upc); + $arr['variable_pricing'] = 0; + $arr['margin'] = 0; + $arr['case_quantity'] = "''"; + $arr['case_cost'] = 0.00; + $arr['case_info'] = "''"; + $dbc->smart_insert('prodExtra',$arr); + } + else { + $dbc->smart_update('prodExtra',$arr,"upc='$upc'"); + } +} +/* Xel. Insert or update prodUpdate: audit trail */ +if ($dbc->table_exists("prodUpdate")){ + $puarray = array( + 'upc' => $dbc->escape($upc), + 'description' => $up_array['description'], + 'price' => $up_array['normal_price'], + 'dept' => $up_array['department'], + 'tax' => $up_array['tax'], + 'fs' => $up_array['foodstamp'], + 'scale' => $up_array['scale'], + 'likeCode' => isset($_REQUEST['likeCode'])?$_REQUEST['likeCode']:0, + 'modified' => $dbc->now(), + 'user' => $uid, + 'forceQty' => $up_array['qttyEnforced'], + 'noDisc' => $up_array['discount'], + 'inUse' => $up_array['inUse'] + ); + $dbc->smart_insert('prodUpdate',$puarray); +} +/* Xel. Insert or update scaleItems */ +if(isset($_REQUEST['s_plu'])){ + $s_plu = substr($_REQUEST['s_plu'],3,4); + $scale_array = array(); + $scale_array['plu'] = $upc; + $scale_array['itemdesc'] = $up_array['description']; + $scale_array['price'] = $up_array['normal_price']; + if (isset($_REQUEST['s_longdesc']) && !empty($_REQUEST['s_longdesc'])) + $scale_array['itemdesc'] = $dbc->escape($_REQUEST['s_longdesc']); + $scale_array['tare'] = isset($_REQUEST['s_tare'])?$_REQUEST['s_tare']:0; + $scale_array['shelflife'] = isset($_REQUEST['s_shelflife'])?$_REQUEST['s_shelflife']:0; + $scale_array['bycount'] = isset($_REQUEST['s_bycount'])?1:0; + $scale_array['graphics'] = isset($_REQUEST['s_graphics'])?1:0; + $s_type = isset($_REQUEST['s_type'])?$_REQUEST['s_type']:'Random Weight'; + $scale_array['weight'] = ($s_type=="Random Weight")?0:1; + $scale_array['text'] = isset($_REQUEST['s_text'])?$dbc->escape($_REQUEST['s_text']):"''"; + + $s_label = isset($_REQUEST['s_label'])?$_REQUEST['s_label']:'horizontal'; + if ($s_label == "horizontal" && $s_type == "Random Weight") + $s_label = 133; + elseif ($s_label == "horizontal" && $s_type == "Fixed Weight") + $s_label = 63; + elseif ($s_label == "vertical" && $s_type == "Random Weight") + $s_label = 103; + elseif ($s_label == "vertical" && $s_type == "Fixed Weight") + $s_label = 23; + + $scale_array['label'] = $s_label; + $scale_array['excpetionprice'] = 0.00; + $scale_array['class'] = "''"; + + $chk = $dbc->query("SELECT * FROM scaleItems WHERE plu='$upc'"); + $action = "ChangeOneItem"; + if ($dbc->num_rows($chk) == 0){ + $dbc->smart_insert('scaleItems',$scale_array); + $action = "WriteOneItem"; + } + else { + unset($scale_array['plu']); + $dbc->smart_update('scaleItems',$scale_array,"plu='$upc'"); + $action = "ChangeOneItem"; + } + + include('hobartcsv/parse.php'); + parseitem($action,$s_plu,trim($scale_array["itemdesc"],"'"), + $scale_array['tare'],$scale_array['shelflife'],$scale_array['price'], + $scale_array['bycount'],$s_type,0.00,trim($scale_array['text'],"'"), + $scale_array['label'],($scale_array['graphics']==1)?121:0); +} + +/* Xel. Update product-related tables on the lanes. */ +/* push updates to the lanes */ +include('laneUpdates.php'); +updateProductAllLanes($upc); + +/* Xel. Update likecodes */ +/* update the item's likecode if specified + also update other items in the likecode + if the appropriate box isn't checked */ +if (isset($_REQUEST['likeCode']) && $_REQUEST['likeCode'] != -1){ + $dbc->query("DELETE FROM upcLike WHERE upc='$upc'"); + $lcQ = "INSERT INTO upcLike (upc,likeCode) VALUES ('$upc',{$_REQUEST['likeCode']})"; + $dbc->query($lcQ); + + if (!isset($_REQUEST['update'])){ + $upcsQ = "SELECT upc FROM upcLike WHERE likeCode={$_REQUEST['likeCode']} AND upc <> '$upc'"; + $upcsR = $dbc->query($upcsQ); + unset($up_array['description']); + while($upcsW = $dbc->fetch_row($upcsR)){ + $dbc->smart_update('products',$up_array, + "upc='$upcsW[0]' AND store_id=$FANNIE_STORE_ID"); + updateProductAllLanes($upcsW[0]); + } + } +} +elseif (isset($_REQUEST['likeCode']) && $_REQUEST['likeCode'] == -1){ + $dbc->query("DELETE FROM upcLike WHERE upc='$upc'"); +} + + +/* Xel. Display the post-update values. */ +$query1 = "SELECT upc,description,normal_price,department,subdept, + foodstamp,scale,qttyEnforced,discount,inUse,deposit + FROM products WHERE upc = '$upc'"; +$result1 = $dbc->query($query1); +$row = $dbc->fetch_array($result1); + +echo ""; + echo ""; + echo ""; + echo "
        UPC".$row['upc']."
        DescriptionNew{$row['description']}Price\${$row['normal_price']}
        "; + echo ""; + echo ""; + echo ""; + $dept=$row['department']; + $query2 = "SELECT dept_name FROM departments where dept_no = " .$dept; + $result2 = $dbc->query($query2); + $row2 = $dbc->fetch_array($result2); + + $subdept=$row["subdept"]; + $query2a = "SELECT subdept_name FROM subdepts WHERE subdept_no = " .$subdept; + $result2a = $dbc->query($query2a); + $row2a = $dbc->fetch_array($result2a); + + echo ""; + + echo ""; + + echo ""; + + + echo "
        DeptsubDeptFSScaleQtyFrcNoDiscinUsedeposit"; + echo "
        "; + echo $dept . ' ' . + $row2['dept_name']; + echo " "; + echo $subdept . ' ' . + $row2a['subdept_name']; + echo "
        "; + echo "
        "; + echo "
        "; + echo " Enter UPC/PLU here
        "; + echo "To add a new item enter its UPC/PLU.
        "; + echo ""; + echo "
        "; +?> + + diff --git a/fannie/item/updateItems_WEFC_Toronto.php b/fannie/item/updateItems_WEFC_Toronto.php new file mode 100644 index 000000000..e2d9f5279 --- /dev/null +++ b/fannie/item/updateItems_WEFC_Toronto.php @@ -0,0 +1,566 @@ +escape(substr($_REQUEST['descript'],0,30)); +// Package +$string_size = substr(trim($_REQUEST['size']),0,9); +$numeric_size = (is_numeric($string_size))?$string_size:0; +$up_array['size'] = $dbc->escape("$string_size"); +$unitofmeasure = substr(trim($_REQUEST['unitofmeasure']),0,15); +$up_array['unitofmeasure'] = $dbc->escape("$unitofmeasure"); +// +$up_array['cost'] = saveAsMoney($_REQUEST,'cost'); +// +$up_array['modified'] = $dbc->now(); +// hidden on form? +$up_array['store_id'] = isset($_REQUEST['store_id'])?$_REQUEST['store_id']:0; +// 22Feb13 EL Ones that are still not in the form. +$up_array['scaleprice'] = 0.00; +$up_array['advertised'] = 1; +$up_array['tareweight'] = 0; +$up_array['wicable'] = 0; +$up_array['idEnforced'] = 0; +// Item flags, bits +$up_array['numflag'] = setProductFlags($_REQUEST['flags']); +// 3 for $1 from fieldset +// Only use these if the fieldset they are in is displayed ... +if ( array_search('ThreeForDollar',$Fannie_Item_Modules) !== False ) { + $up_array['pricemethod'] = is_numeric($_REQUEST['pricemethod'])?$_REQUEST['pricemethod']:0; + $up_array['groupprice'] = saveAsMoney($_REQUEST,'groupprice'); + //$up_array['groupprice'] = is_numeric($_REQUEST['groupprice'])?$_REQUEST['groupprice']:0.00; + $up_array['quantity'] = is_numeric($_REQUEST['quantity'])?$_REQUEST['quantity']:0; +} +// ... but use this regardless since it isn't edited in the "Volume" group. +// Is in effect hidden if its block isn't displayed. +// 22Feb13 Default to '0' seems odd. +$up_array['mixmatchcode'] = !empty($_REQUEST['mixmatchcode'])?$dbc->escape($_REQUEST['mixmatchcode']):"'0'"; +// Sale +$up_array['special_price'] = saveAsMoney($_REQUEST,'special_price'); +// 0=not on sale; 1=on sale to all; 2=on sale to members +$up_array['discounttype'] = is_numeric($_REQUEST['discounttype'])?$_REQUEST['discounttype']:0; +$up_array['start_date'] = isset($_REQUEST['start_date'])?$dbc->escape($_REQUEST['start_date']):"'1900-01-01'"; +$up_array['end_date'] = isset($_REQUEST['end_date'])?$dbc->escape($_REQUEST['end_date']):"'1900-01-01'"; +// Sale 3for$1 +$up_array['specialpricemethod'] = is_numeric($_REQUEST['specialpricemethod'])?$_REQUEST['specialpricemethod']:0; +$up_array['specialgroupprice'] = saveAsMoney($_REQUEST,'specialgroupprice'); +//$up_array['specialgroupprice'] = is_numeric($_REQUEST['specialgroupprice'])?$_REQUEST['specialgroupprice']:0.00; +$up_array['specialquantity'] = is_numeric($_REQUEST['specialquantity'])?$_REQUEST['specialquantity']:0; +/* turn on volume pricing if specified, but don't + alter pricemethod if it's already non-zero + If volume pricing specified but method still 0 silently use method 2. + 1Mar13 EL The whole Volume option is only available if the ThreeForDollar fieldset is not available. +*/ +if (isset($_REQUEST['doVolume']) && is_numeric($_REQUEST['vol_price']) && is_numeric($_REQUEST['vol_qtty'])){ + $up_array['pricemethod'] = $_REQUEST['vol_pricemethod']; + if ($up_array['pricemethod']==0) $up_array['pricemethod']=2; + $up_array['groupprice'] = saveAsMoney($_REQUEST,'vol_price'); + //$up_array['groupprice'] = $_REQUEST['vol_price']; + $up_array['quantity'] = $_REQUEST['vol_qtty']; +} + +/* pull the current, HQ values for all the editable fields + and compare them to the submitted values + Store actual changes in the array $CHANGES +*/ +$currentQ = "SELECT tax,foodstamp,scale,deposit,qttyEnforced,discount,normal_price, + description,pricemethod,groupprice,quantity,department,cost,subdept,local, + mixmatchcode,size,unitofmeasure, + special_price,specialpricemethod,specialgroupprice,specialquantity,discounttype,start_date,end_date + FROM products WHERE upc='$upc' AND store_id=0"; +$currentR = $dbc->query($currentQ); +$currentW = array(); +if ($dbc->num_rows($currentR) > 0) + $currentW = $dbc->fetch_row($currentR); +$CHANGES = array(); +foreach($up_array as $column => $new_value){ + if (!isset($currentW[$column])) continue; + if ($currentW[$column] != trim($new_value,"'")){ + $CHANGES[$column] = array( + 'old' => $currentW[$column], + 'new' => trim($new_value,"'") + ); + } +} + +$sR = $dbc->query("SELECT superID FROM MasterSuperDepts WHERE dept_ID=".$up_array['department']); +$sID = 0; +if ($dbc->num_rows($sR) > 0) + $sID = array_pop($dbc->fetch_row($sR)); + +/* 1. Validate credentials of the operator. */ +$uid = 0; +if (!$validatedUser && !$auditedUser && $logged_in){ + $validatedUser = validateUserQuiet('pricechange',$subdepartment); +} +if ($validatedUser){ + $validatedUID = getUID($validatedUser); + $uid = $validatedUID; +} +elseif ($auditedUser){ + $auditedUID = getUID($auditedUser); + $uid = $auditedUID; + include('audit.php'); +/* 2el. Notify dept manager of the new values. */ + if (!empty($likeCode)) + audit($sID,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc,$likeCode); + else + audit($sID,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc); +} + +/* 2. Insert or update per-coop products data */ +/* For WEFC_Toronto only + * Store the raw versions of products.description and productUser.description in products_WEFC_Toronto. +*/ +if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == "WEFC_Toronto" ) { + $table_name = "products_{$FANNIE_COOP_ID}"; + if ($dbc->table_exists("$table_name")){ + $coop_array = array("description" => $dbc->escape(substr($_REQUEST['descript'],0,255)), + "search_description" => isset($_REQUEST['puser_description'])?$dbc->escape(substr($_REQUEST['puser_description'],0,255)):''); + $checkR = $dbc->query("SELECT upc FROM $table_name WHERE upc='$upc'"); + if ($dbc->num_rows($checkR) == 0){ + $coop_array['upc'] = $dbc->escape($upc); + $dbc->smart_insert("$table_name",$coop_array); + } + else { + $dbc->smart_update("$table_name",$coop_array,"upc='$upc'"); + } + } +} + +// Compose "package" strings. +$package = ""; +$sizing = ""; +if ( $string_size != "" && $unitofmeasure != "" ) { + $package = " $string_size$unitofmeasure"; + $sizing = "$string_size $unitofmeasure"; +} + +// Compose products.description and productUser.description if wanted. +if ( isset($FANNIE_COMPOSE_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_PRODUCT_DESCRIPTION == "1" ) { + $plen = strlen($package); + $descp = $_REQUEST['descript']; + $dlen = strlen($descp); + $maxDescLen = 30; + $wlen = ($dlen + $plen); + + if ( $wlen <= $maxDescLen ) { + $up_array['description'] = $dbc->escape($descp . $package); + } else { + $up_array['description'] = $dbc->escape(substr($descp,0,($dlen - ($wlen - $maxDescLen))) . $package); + } +} +if ( isset($FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION) && $FANNIE_COMPOSE_LONG_PRODUCT_DESCRIPTION == "1" ) { + $plen = strlen($package); + $mlen = strlen($_REQUEST['manufacturer']); + $descp = $_REQUEST['puser_description']; + $dlen = strlen($descp); + $maxDescLen = 255; + $wlen = ($dlen + 3 + $mlen + 3 + $plen); + if ( $wlen <= $maxDescLen ) { + $puser_description = strtoupper($_REQUEST['manufacturer']) . ' | ' . $_REQUEST['puser_description'] . ' | ' . $package; + } else { + $puser_description = strtoupper($_REQUEST['manufacturer']) . ' | ' . + substr($descp,0,($dlen - ($wlen - $maxDescLen)) . ' | ' . $package); + } +} else { + $puser_description = substr($_REQUEST['puser_description'],0,255); +} + +/* 3. Insert or update products */ +if ($up_array['store_id'] == $FANNIE_STORE_ID){ + // record exists so update it + $dbc->smart_update('products',$up_array,"upc='$upc'"); +} +else if($up_array['store_id']==0 && count($CHANGES) > 0){ + // only the HQ record exists and we are not HQ + // so it has to be an insert + // only create a new record if changes really exist + // 22Feb13 EL store_id is set again below. + $up_array['store_id'] = $FANNIE_STORE_ID; + $up_array['upc'] = $dbc->escape($_REQUEST['upc']); + // 22Feb13 EL Not certain about using entered values instead of these defaults + // when inserting to HQ. Leave as-is for now. + $up_array['special_price'] = 0.00; + $up_array['specialpricemethod'] = 0; + $up_array['specialgroupprice'] = 0.00; + $up_array['specialquantity'] = 0; + $up_array['start_date'] = "'1900-01-01'"; + $up_array['end_date'] = "'1900-01-01'"; + $up_array['mixmatchcode'] = "'0'"; + $up_array['discounttype'] = 0; + $up_array['store_id'] = 0; + $dbc->smart_insert('products',$up_array); +} + +/* 4. Apply HQ updates to non-HQ records */ +// apply HQ updates to non-HQ records +// where the current value matches the old HQ value +if ($FANNIE_STORE_ID==0 && count($CHANGES) > 0){ + foreach($CHANGES as $col => $values){ + $v_old = is_numeric($values['old']) ? $values['old'] : $dbc->escape($values['old']); + $v_new = is_numeric($values['new']) ? $values['new'] : $dbc->escape($values['new']); + $upQ = sprintf("UPDATE products SET %s=%s,modified=%s + WHERE %s=%s AND upc=%s AND store_id > 0", + $col,$v_new, + $dbc->now(), + $col,$v_old, + $dbc->escape($upc)); + $upR = $dbc->query($upQ); + } +} + +/* 5. Insert or update productUser */ +if ($dbc->table_exists('productUser')){ + $puser_array = array(); + $puser_array['brand'] = $dbc->escape($_REQUEST['manufacturer']); + $puser_array['description'] = $dbc->escape($puser_description); + $puser_array['sizing'] = $dbc->escape($sizing); + $checkR = $dbc->query("SELECT upc FROM productUser WHERE upc='$upc'"); + if ($dbc->num_rows($checkR) == 0){ + // if productUser record doesn't exist, needs more values + $puser_array['upc'] = $dbc->escape($upc); + $puser_array['enableOnline'] = 0; + $dbc->smart_insert('productUser',$puser_array); + } + else { + $dbc->smart_update('productUser',$puser_array,"upc='$upc'"); + } +} + +/* 6. Insert or update vendorItems */ +/* Changing vendorItems at all should perhaps be an option. */ +if ($dbc->table_exists('vendorItems')){ + $vi_array = array(); + $vi_array['sku'] = $dbc->escape(substr($_REQUEST['sku'], 0, 10)); + $vi_array['brand'] = $dbc->escape(substr($_REQUEST['manufacturer'], 0, 50)); + $vi_array['description'] = $dbc->escape(substr($_REQUEST['descript'], 0, 50)); + $vi_array['cost'] = saveAsMoney($_REQUEST,'case_cost'); + $vi_array['size'] = $dbc->escape("$sizing"); + if ( is_numeric($_REQUEST['case_quantity']) && $_REQUEST['case_quantity'] > 0 ) + $vi_array['units'] = $_REQUEST['case_quantity']; + else + $vi_array['units'] = 'NULL'; + // Several vendorItems fields are not edited in itemMaint.php + $checkR = $dbc->query("SELECT upc FROM vendorItems WHERE upc='$upc'"); + if ($dbc->num_rows($checkR) == 0){ + $vi_array['upc'] = $dbc->escape($upc); + // vendorID + $checkR = $dbc->query("SELECT vendorID FROM vendorItems WHERE brand='{$vi_array['brand']}'"); + if ( $dbc->num_rows($checkR) > 0 ) { + $vi_row = $dbc->fetch_row($checkR); + $vi_array['vendorID'] = $vi_row['vendorID']; + } + else { + $vi_array['vendorID'] = 0; + } + $dbc->smart_insert('vendorItems',$vi_array); + } + else { + $dbc->smart_update('vendorItems',$vi_array,"upc='$upc'"); + } +} + +/* 7. Insert or update prodExtra */ +if ($dbc->table_exists('prodExtra')){ + $px_array = array(); + $px_array['manufacturer'] = $dbc->escape($_REQUEST['manufacturer']); + $px_array['distributor'] = $dbc->escape($_REQUEST['distributor']); + $px_array['cost'] = $up_array['cost']; + $px_array['location'] = $dbc->escape($_REQUEST['location']); + $px_array['case_cost'] = saveAsMoney($_REQUEST,'case_cost'); + $px_array['case_quantity'] = is_numeric($_REQUEST['case_quantity'])?$dbc->escape($_REQUEST['case_quantity']):"''"; + if ( $up_array['cost'] != 0 && $up_array['normal_price'] != 0 ) { + $px_array['margin'] = sprintf("%.2f", 1 -($up_array['cost'] / $up_array['normal_price'])); + } else { + $px_array['margin'] = 0.00; + } + $checkR = $dbc->query("SELECT upc FROM prodExtra WHERE upc='$upc'"); + if ($dbc->num_rows($checkR) == 0){ + // if prodExtra record doesn't exist, needs more values + $px_array['upc'] = $dbc->escape($upc); + $px_array['variable_pricing'] = 0; + $px_array['case_info'] = "''"; + $dbc->smart_insert('prodExtra',$px_array); + } + else { + $dbc->smart_update('prodExtra',$px_array,"upc='$upc'"); + } +} + +/* 8. Insert or update prodUpdate: audit trail */ +if ($dbc->table_exists("prodUpdate")){ + $pu_array = array( + 'upc' => $dbc->escape($upc), + 'description' => $up_array['description'], + 'price' => $up_array['normal_price'], + 'dept' => $up_array['department'], + 'tax' => $up_array['tax'], + 'fs' => $up_array['foodstamp'], + 'scale' => $up_array['scale'], + 'likeCode' => isset($_REQUEST['likeCode'])?$_REQUEST['likeCode']:0, + 'modified' => $dbc->now(), + 'user' => $uid, + 'forceQty' => $up_array['qttyEnforced'], + 'noDisc' => $up_array['discount'], + 'inUse' => $up_array['inUse'] + ); + $dbc->smart_insert('prodUpdate',$pu_array); +} + +/* 9. Insert or update scaleItems */ +if(isset($_REQUEST['s_plu'])){ + $s_plu = substr($_REQUEST['s_plu'],3,4); + $scale_array = array(); + $scale_array['plu'] = $upc; + $scale_array['itemdesc'] = $up_array['description']; + $scale_array['price'] = $up_array['normal_price']; + if (isset($_REQUEST['s_longdesc']) && !empty($_REQUEST['s_longdesc'])) + $scale_array['itemdesc'] = $dbc->escape($_REQUEST['s_longdesc']); + $scale_array['tare'] = isset($_REQUEST['s_tare'])?$_REQUEST['s_tare']:0; + $scale_array['shelflife'] = isset($_REQUEST['s_shelflife'])?$_REQUEST['s_shelflife']:0; + $scale_array['bycount'] = isset($_REQUEST['s_bycount'])?1:0; + $scale_array['graphics'] = isset($_REQUEST['s_graphics'])?1:0; + $s_type = isset($_REQUEST['s_type'])?$_REQUEST['s_type']:'Random Weight'; + $scale_array['weight'] = ($s_type=="Random Weight")?0:1; + $scale_array['text'] = isset($_REQUEST['s_text'])?$dbc->escape($_REQUEST['s_text']):"''"; + + $s_label = isset($_REQUEST['s_label'])?$_REQUEST['s_label']:'horizontal'; + if ($s_label == "horizontal" && $s_type == "Random Weight") + $s_label = 133; + elseif ($s_label == "horizontal" && $s_type == "Fixed Weight") + $s_label = 63; + elseif ($s_label == "vertical" && $s_type == "Random Weight") + $s_label = 103; + elseif ($s_label == "vertical" && $s_type == "Fixed Weight") + $s_label = 23; + + $scale_array['label'] = $s_label; + $scale_array['excpetionprice'] = 0.00; + $scale_array['class'] = "''"; + + $chk = $dbc->query("SELECT * FROM scaleItems WHERE plu='$upc'"); + $action = "ChangeOneItem"; + if ($dbc->num_rows($chk) == 0){ + $dbc->smart_insert('scaleItems',$scale_array); + $action = "WriteOneItem"; + } + else { + unset($scale_array['plu']); + $dbc->smart_update('scaleItems',$scale_array,"plu='$upc'"); + $action = "ChangeOneItem"; + } + + include('hobartcsv/parse.php'); + parseitem($action,$s_plu,trim($scale_array["itemdesc"],"'"), + $scale_array['tare'],$scale_array['shelflife'],$scale_array['price'], + $scale_array['bycount'],$s_type,0.00,trim($scale_array['text'],"'"), + $scale_array['label'],($scale_array['graphics']==1)?121:0); +} + +/* 10. Delete and re-add to product-related tables on the lanes. */ +/* push updates to the lanes */ +include('laneUpdates_WEFC_Toronto.php'); +//update only table products +//updateProductAllLanes($upc); +updateAllLanes($upc, array("products", "productUser")); + +/* 'i9el. Update likecodes */ +/* update the item's likecode if specified + also update other items in the likecode + if the appropriate box isn't checked */ +if (isset($_REQUEST['likeCode']) && $_REQUEST['likeCode'] != -1){ + $dbc->query("DELETE FROM upcLike WHERE upc='$upc'"); + $lcQ = "INSERT INTO upcLike (upc,likeCode) VALUES ('$upc',{$_REQUEST['likeCode']})"; + $dbc->query($lcQ); + + if (!isset($_REQUEST['update'])){ + $upcsQ = "SELECT upc FROM upcLike WHERE likeCode={$_REQUEST['likeCode']} AND upc <> '$upc'"; + $upcsR = $dbc->query($upcsQ); + unset($up_array['description']); + while($upcsW = $dbc->fetch_row($upcsR)){ + $dbc->smart_update('products',$up_array, + "upc='$upcsW[0]' AND store_id=$FANNIE_STORE_ID"); + updateProductAllLanes($upcsW[0]); + } + } +} +elseif (isset($_REQUEST['likeCode']) && $_REQUEST['likeCode'] == -1){ + $dbc->query("DELETE FROM upcLike WHERE upc='$upc'"); +} + + +/* 11. Display the post-update values and an input for the next edit. */ +/* Display some of the post-update values and an input for the next edit. + * The page contains form elements but there is no submit for the them. + * The record-select input is also displayed in a proper form with a submit. +*/ +$query1 = "SELECT upc,description,normal_price,department,subdept, + foodstamp,scale,qttyEnforced,discount,inUse,deposit + FROM products WHERE upc = '$upc'"; +$result1 = $dbc->query($query1); +$row = $dbc->fetch_array($result1); + +echo ""; + echo ""; + echo ""; + echo "
        UPC".$row['upc']."
        Description{$row['description']}Price\${$row['normal_price']}
        "; + echo ""; + echo ""; + echo ""; + $dept=$row['department']; + $query2 = "SELECT dept_name FROM departments where dept_no = " .$dept; + $result2 = $dbc->query($query2); + $row2 = $dbc->fetch_array($result2); + + $subdept=$row["subdept"]; + $query2a = "SELECT subdept_name FROM subdepts WHERE subdept_no = " .$subdept; + $result2a = $dbc->query($query2a); + $row2a = $dbc->fetch_array($result2a); + + echo ""; + + echo ""; + + echo ""; + + echo "
        DeptsubDeptFSScaleQtyFrcNoDiscinUsedeposit"; + echo "
        "; + echo $dept . ' ' . + $row2['dept_name']; + echo " "; + echo $subdept . ' ' . + $row2a['subdept_name']; + echo "
        "; + echo "
        "; + echo "
        "; + + echo promptForUPC($upc); + + echo "
        "; + + /* 12. If requested on the capture form, pop a window for making a shelf tag. */ + if (isset($_REQUEST['newshelftag'])){ + echo ""; + } +?> + + diff --git a/fannie/item/vendors/BrowseVendorItems.php b/fannie/item/vendors/BrowseVendorItems.php new file mode 100644 index 000000000..4294c7264 --- /dev/null +++ b/fannie/item/vendors/BrowseVendorItems.php @@ -0,0 +1,243 @@ +ajax_callbacks($ajax); + return False; + } + + return True; + } + + function ajax_callbacks($action){ + global $FANNIE_OP_DB; + switch($action){ + case 'getCategoryBrands': + $this->getCategoryBrands(FormLib::get_form_Value('vid'),FormLib::get_form_value('deptID')); + break; + case 'showCategoryItems': + $this->showCategoryItems( + FormLib::get_form_value('vid'), + FormLib::get_form_value('deptID'), + FormLib::get_form_value('brand') + ); + break; + case 'addPosItem': + $this->add_to_pos( + FormLib::get_form_value('upc'), + FormLib::get_form_value('vid'), + FormLib::get_form_value('price'), + FormLib::get_form_value('dept') + ); + break; + default: + echo 'bad request'; + break; + } + } + + private function getCategoryBrands($vid,$did){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $query = "SELECT brand FROM vendorItems AS v + LEFT JOIN vendorDepartments AS d ON + v.vendorDept=d.deptID WHERE v.vendorID=?"; + $args = array($vid); + if($did != 'All'){ + $query .= ' AND vendorDept=? '; + $args[] = $did; + } + $query .= "GROUP BY brand ORDER BY brand"; + $ret = ""; + $p = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($p,$args); + while($row=$dbc->fetch_row($result)) + $ret .= ""; + + echo $ret; + } + + private function showCategoryItems($vid,$did,$brand){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $depts = ""; + $p = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); + $rp = $dbc->exec_statement($p); + while($rw = $dbc->fetch_row($rp)) + $depts .= ""; + + $query = "SELECT v.upc,v.brand,v.description,v.size, + v.cost/v.units as cost, + CASE WHEN d.margin IS NULL THEN 0 ELSE d.margin END as margin, + CASE WHEN p.upc IS NULL THEN 0 ELSE 1 END as inPOS, + s.srp + FROM vendorItems AS v LEFT JOIN products AS p + ON v.upc=p.upc LEFT JOIN vendorDepartments AS d + ON d.deptID=v.vendorDept + LEFT JOIN vendorSRPs AS s + ON v.upc=s.upc AND v.vendorID=s.vendorID + WHERE v.vendorID=? AND brand=?"; + $args = array($vid,$brand); + if ($did != 'All'){ + $query .= ' AND vendorDept=? '; + $args[] = $dept; + } + $query .= "ORDER BY v.upc"; + + $ret = ""; + $ret .= ""; + $ret .= ""; + $p = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($p,$args); + while($row = $dbc->fetch_row($result)){ + if ($row['inPOS'] == 1){ + $ret .= sprintf(" + + ",$row['upc'],$row['brand'], + $row['description'],$row['size'],$row['cost']); + } + else { + $srp = !empty($row['srp']) ? $row['srp'] : $this->getSRP($row['cost'],$row['margin']); + $ret .= sprintf(" + + ",$row['upc'], + $row['upc'],$row['brand'],$row['description'], + $row['size'],$row['cost'],$srp,$row['upc'], + $row['upc'],$depts,$row['upc'],$row['upc']); + } + } + $ret .= "
        UPCBrandDescriptionSizeCost 
        %s%s%s%s\$%.2f  +
        %s%s%s%s\$%.2f + + +
        "; + + echo $ret; + } + + private function add_to_pos($upc,$vid,$price,$dept){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $p = $dbc->prepare_statement("SELECT i.*,v.vendorName FROM vendorItems AS i + LEFT JOIN vendors AS v ON v.vendorID=i.vendorID + WHERE i.vendorID=? AND upc=?"); + $vinfo = $dbc->exec_statement($p, array($vid,$upc)); + $vinfo = $dbc->fetch_row($vinfo); + $p = $dbc->prepare_statement("SELECT * FROM departments WHERE dept_no=?"); + $dinfo = $dbc->exec_statement($p,array($dept)); + $dinfo = $dbc->fetch_row($dinfo); + + ProductsModel::update($upc,array( + 'description' => $vinfo['description'], + 'normal_price' => $price, + 'department' => $dept, + 'tax' => $dinfo['dept_tax'], + 'foodstamp' => $dinfo['dept_fs'], + 'cost' => ($vinfo['cost']/$vinfo['units']) + )); + + $xInsQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc,distributor,manufacturer,cost,margin,variable_pricing,location, + case_quantity,case_cost,case_info) VALUES + (?,?,?,?,0.00,0,'','',0.00,'')"); + $args = array($upc,$vinfo['brand'], + $vinfo['vendorName'],($vinfo['cost']/$vinfo['units'])); + $dbc->exec_statement($xInsQ,$args); + + echo "Item added"; + } + + private function getSRP($cost,$margin){ + $srp = sprintf("%.2f",$cost/(1-$margin)); + while (substr($srp,strlen($srp)-1,strlen($srp)) != "5" && + substr($srp,strlen($srp)-1,strlen($srp)) != "9") + $srp += 0.01; + return $srp; + } + + function body_content(){ + global $FANNIE_OP_DB, $FANNIE_URL; + $vid = FormLib::get_form_value('vid'); + if ($vid === ''){ + return "Error: no vendor selected"; + } + + $dbc = FannieDB::get($FANNIE_OP_DB); + $cats = ""; + $p = $dbc->prepare_statement("SELECT deptID,name FROM vendorDepartments + WHERE vendorID=?"); + $rp = $dbc->exec_statement($p,array($vid)); + while($rw = $dbc->fetch_row($rp)) + $cats .= ""; + + if ($cats =="") $cats = ""; + else $cats = "".$cats; + + ob_start(); + ?> +
        + +     + +
        +
        +
        + +
        + + + add_script($FANNIE_URL.'src/jquery/jquery.js'); + $this->add_script('browse.js'); + + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new BrowseVendorItems(); + $obj->draw_page(); +} +?> diff --git a/fannie/item/vendors/DefaultUploadPage.php b/fannie/item/vendors/DefaultUploadPage.php new file mode 100644 index 000000000..83ca9a78d --- /dev/null +++ b/fannie/item/vendors/DefaultUploadPage.php @@ -0,0 +1,242 @@ + array( + 'name' => 'upc', + 'display_name' => 'UPC', + 'default' => 0, + 'required' => True + ), + 'srp' => array( + 'name' => 'srp', + 'display_name' => 'SRP', + 'default' => 1, + 'required' => True + ), + 'brand' => array( + 'name' => 'brand', + 'display_name' => 'Brand', + 'default' => 2, + 'required' => True + ), + 'desc' => array( + 'name' => 'desc', + 'display_name' => 'Description', + 'default' => 3, + 'required' => True + ), + 'sku' => array( + 'name' => 'sku', + 'display_name' => 'SKU', + 'default' => 4, + 'required' => False + ), + 'qty' => array( + 'name' => 'qty', + 'display_name' => 'Case Qty', + 'default' => 5, + 'required' => True + ), + 'size' => array( + 'name' => 'size', + 'display_name' => 'Unit Size', + 'default' => 6, + 'required' => False + ), + 'cost' => array( + 'name' => 'cost', + 'display_name' => 'Case Cost', + 'default' => 7, + 'required' => True + ) + ); + + protected $use_splits = True; + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + if (!isset($_SESSION['vid'])){ + $this->error_details = 'Missing vendor setting'; + return False; + } + $VENDOR_ID = $_SESSION['vid']; + + $p = $dbc->prepare_statement("SELECT vendorID FROM vendors WHERE vendorID=?"); + $idR = $dbc->exec_statement($p,array($VENDOR_ID)); + if ($dbc->num_rows($idR) == 0){ + $this->error_details = 'Cannot find vendor'; + return False; + } + + $SKU = $this->get_column_index('sku'); + $BRAND = $this->get_column_index('brand'); + $DESCRIPTION = $this->get_column_index('desc'); + $QTY = $this->get_column_index('qty'); + $SIZE1 = $this->get_column_index('size'); + $UPC = $this->get_column_index('upc'); + $CATEGORY = $this->get_column_index('cat'); + $REG_COST = $this->get_column_index('cost'); + $NET_COST = $this->get_column_index('cost'); + $SRP = $this->get_column_index('srp'); + + $itemP = $dbc->prepare_statement("INSERT INTO vendorItems + (brand,sku,size,upc,units,cost,description,vendorDept,vendorID) + VALUES (?,?,?,?,?,?,?,?,?)"); + $srpP = $dbc->prepare_statement("INSERT INTO vendorSRPs (vendorID, upc, srp) VALUES (?,?,?)"); + + foreach($linedata as $data){ + if (!is_array($data)) continue; + + if (!isset($data[$UPC])) continue; + + // grab data from appropriate columns + $sku = $data[$SKU]; + $brand = $data[$BRAND]; + $description = $data[$DESCRIPTION]; + $qty = $data[$QTY]; + $size = $data[$SIZE1]; + $upc = substr($data[$UPC],0,13); + // zeroes isn't a real item, skip it + if ($upc == "0000000000000") + continue; + if ($_SESSION['vUploadCheckDigits']) + $upc = '0'.substr($upc,0,12); + $category = $data[$CATEGORY]; + $reg = trim($data[$REG_COST]); + $net = trim($data[$NET_COST]); + $srp = trim($data[$SRP]); + // can't process items w/o price (usually promos/samples anyway) + if (empty($reg) or empty($net) or empty($srp)) + continue; + + // syntax fixes. kill apostrophes in text fields, + // trim $ off amounts as well as commas for the + // occasional > $1,000 item + $brand = str_replace("'","",$brand); + $description = str_replace("'","",$description); + $reg = str_replace('$',"",$reg); + $reg = str_replace(",","",$reg); + $net = $reg; + $srp = str_replace('$',"",$srp); + $srp = str_replace(",","",$srp); + + // skip the item if prices aren't numeric + // this will catch the 'label' line in the first CSV split + // since the splits get returned in file system order, + // we can't be certain *when* that chunk will come up + if (!is_numeric($reg) or !is_numeric($net) or !is_numeric($srp)) + continue; + + // need unit cost, not case cost + $reg_unit = $reg / $qty; + + $args = array($brand,($sku===False?'':$sku),($size===False?'':$size), + $upc,$qty,$reg_unit,$description,$category,$VENDOR_ID); + $dbc->exec_statement($itemP,$args); + + $dbc->exec_statement($srpP,array($VENDOR_ID,$upc,$srp)); + } + + return True; + } + + /* clear tables before processing */ + function split_start(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + if (!isset($_SESSION['vid'])){ + $this->error_details = 'Missing vendor setting'; + return False; + } + $VENDOR_ID = $_SESSION['vid']; + + $p = $dbc->prepare_statement("SELECT vendorID FROM vendors WHERE vendorID=?"); + $idR = $dbc->exec_statement($p,array($VENDOR_ID)); + if ($dbc->num_rows($idR) == 0){ + $this->error_details = 'Cannot find vendor'; + return False; + } + + $p = $dbc->prepare_statement("DELETE FROM vendorItems WHERE vendorID=?"); + $dbc->exec_statement($p,array($VENDOR_ID)); + $p = $dbc->prepare_statement("DELETE FROM vendorSRPs WHERE vendorID=?"); + $dbc->exec_statement($p,array($VENDOR_ID)); + + if (FormLib::get_form_value('rm_cds') !== '') + $_SESSION['vUploadCheckDigits'] = True; + else + $_SESSION['vUploadCheckDigits'] = False; + } + + function preview_content(){ + return ' Remove check digits'; + } + + function results_content(){ + $ret = "Price data import complete

        "; + $ret .= 'Upload Another'; + unset($_SESSION['vid']); + unset($_SESSION['vUploadCheckDigits']); + return $ret; + } + + function form_content(){ + global $FANNIE_OP_DB; + $vid = FormLib::get_form_value('vid'); + if ($vid === ''){ + $this->add_onload_command("\$('#FannieUploadForm').remove();"); + return 'Error: No Vendor Selected'; + } + $dbc = FannieDB::get($FANNIE_OP_DB); + $vp = $dbc->prepare_statement('SELECT vendorName FROM vendors WHERE vendorID=?'); + $vr = $dbc->exec_statement($vp,array($vid)); + if ($dbc->num_rows($vr)==0){ + $this->add_onload_command("\$('#FannieUploadForm').remove();"); + return 'Error: No Vendor Found'; + } + $vrow = $dbc->fetch_row($vr); + $_SESSION['vid'] = $vid; + return '

        Instructions + Upload a price file for '.$vrow['vendorName'].' ('.$vid.'). File must be + CSV. Files > 2MB may be zipped.

        '; + } +} + +$obj = new DefaultUploadPage(); +$obj->draw_page(); diff --git a/fannie/item/vendors/UploadPluMapPage.php b/fannie/item/vendors/UploadPluMapPage.php new file mode 100644 index 000000000..4ccb6d375 --- /dev/null +++ b/fannie/item/vendors/UploadPluMapPage.php @@ -0,0 +1,155 @@ + array( + 'name' => 'sku', + 'display_name' => 'SKU', + 'default' => 0, + 'required' => True + ), + 'plu' => array( + 'name' => 'plu', + 'display_name' => 'PLU', + 'default' => 1, + 'required' => True + ) + ); + + protected $use_splits = False; + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + if (!isset($_SESSION['vid'])){ + $this->error_details = 'Missing vendor setting'; + return False; + } + $VENDOR_ID = $_SESSION['vid']; + + $p = $dbc->prepare_statement("SELECT vendorID FROM vendors WHERE vendorID=?"); + $idR = $dbc->exec_statement($p,array($VENDOR_ID)); + if ($dbc->num_rows($idR) == 0){ + $this->error_details = 'Cannot find vendor'; + return False; + } + + $SKU = $this->get_column_index('sku'); + $PLU = $this->get_column_index('plu'); + $mode = FormLib::get_form_value('map_mode',0); + $REPLACE = ($mode === '1') ? True : False; + + if ($REPLACE){ + $delP = $dbc->prepare_statement('DELETE FROM vendorSKUtoPLU WHERE vendorID=?'); + $dbc->exec_statement($delP, array($VENDOR_ID)); + } + + $insP = $dbc->prepare_statement('INSERT INTO vendorSKUtoPLU (vendorID, sku, upc) VALUES (?,?,?)'); + $upP = $dbc->prepare_statement('UPDATE vendorSKUtoPLU SET upc=? WHERE sku=? AND vendorID=?'); + $chkP = $dbc->prepare_statement('SELECT upc FROM vendorSKUtoPLU WHERE sku=? AND upc=? AND vendorID=?'); + $pluP = $dbc->prepare_statement('SELECT upc FROM vendorSKUtoPLU WHERE sku=? AND vendorID=?'); + + foreach($linedata as $data){ + if (!is_array($data)) continue; + + if (!isset($data[$PLU])) continue; + if (!isset($data[$SKU])) continue; + + // grab data from appropriate columns + $sku = $data[$SKU]; + $plu = substr($data[$PLU],0,13); + $plu = str_pad($plu,13,'0',STR_PAD_LEFT); + if (!is_numeric($plu)) continue; + + $chkR = $dbc->exec_statement($chkP, array($sku,$plu,$VENDOR_ID)); + if ($dbc->num_rows($chkR) > 0) continue; // entry exists + + $pluR = $dbc->exec_statement($chkP, array($sku,$plu,$VENDOR_ID)); + if ($dbc->num_rows($pluR) == 0){ + $dbc->exec_statement($insP, array($VENDOR_ID, $sku, $plu)); + } + else { + $dbc->exec_statement($upP, array($plu, $sku, $VENDOR_ID)); + } + } + + // update vendorItems to use the new PLU mapping + $resetP = $dbc->prepare_statement('UPDATE vendorItems AS i + INNER JOIN vendorSKUtoPLU as s + ON s.sku=i.sku AND s.vendorID=i.vendorID + SET i.upc=s.upc + WHERE i.vendorID=?'); + $dbc->exec_statement($resetP, array($VENDOR_ID)); + + return True; + } + + function preview_content(){ + return 'Mode '; + } + + function results_content(){ + $ret = "Mapping updated

        "; + $ret .= 'Upload Another'; + unset($_SESSION['vid']); + return $ret; + } + + function form_content(){ + global $FANNIE_OP_DB; + $vid = FormLib::get_form_value('vid'); + if ($vid === ''){ + $this->add_onload_command("\$('#FannieUploadForm').remove();"); + return 'Error: No Vendor Selected'; + } + $dbc = FannieDB::get($FANNIE_OP_DB); + $vp = $dbc->prepare_statement('SELECT vendorName FROM vendors WHERE vendorID=?'); + $vr = $dbc->exec_statement($vp,array($vid)); + if ($dbc->num_rows($vr)==0){ + $this->add_onload_command("\$('#FannieUploadForm').remove();"); + return 'Error: No Vendor Found'; + } + $vrow = $dbc->fetch_row($vr); + $_SESSION['vid'] = $vid; + return '

        Instructions + Upload a PLU and SKU file for '.$vrow['vendorName'].' ('.$vid.'). File + can be CSV, XLS, or XLSX.

        '; + } +} + +$obj = new UploadPluMapPage(); +$obj->draw_page(); diff --git a/fannie/item/vendors/VendorDepartmentEditor.php b/fannie/item/vendors/VendorDepartmentEditor.php new file mode 100644 index 000000000..3aaac9b02 --- /dev/null +++ b/fannie/item/vendors/VendorDepartmentEditor.php @@ -0,0 +1,176 @@ +ajax_callbacks($ajax); + return False; + } + + return True; + } + + function ajax_callbacks($action){ + global $FANNIE_OP_DB; + switch($action){ + case 'createCat': + $this->createVendorDepartment( + FormLib::get_form_value('vid'), + FormLib::get_form_value('deptID'), + FormLib::get_form_value('name') + ); + break; + case 'deleteCat': + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("DELETE FROM vendorDepartments + WHERE vendorID=? AND deptID=?"); + $dbc->exec_statement($q, + array(FormLib::get_form_value('vid'), + FormLib::get_form_value('deptID')) ); + echo "Department deleted"; + break; + case 'updateCat': + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("UPDATE vendorDepartments + SET name=?, margin=? + WHERE vendorID=? AND deptID=?"); + $args = array( + FormLib::get_form_value('name'), + trim(FormLib::get_form_value('margin',0),'%')/100, + FormLib::get_form_value('vid'), + FormLib::get_form_value('deptID') + ); + $dbc->exec_statement($q,$args); + echo 'Saved'; + break; + default: + echo 'bad request'; + break; + } + } + + private function createVendorDepartment($vid,$did,$name){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $chkQ = $dbc->prepare_statement("SELECT * FROM vendorDepartments WHERE + vendorID=? AND deptID=?"); + $chkR = $dbc->exec_statement($chkQ,array($vid,$did)); + if ($dbc->num_rows($chkR) > 0){ + echo "Number #$did is already in use!"; + return; + } + + $insQ = $dbc->prepare_statement("INSERT INTO vendorDepartments (vendorID,deptID, + name,margin,testing,posDeptID) VALUES (?,?, + ?,0.00,0.00,0)"); + $insR = $dbc->exec_statement($insQ,array($vid,$did,$name)); + + echo "Department created"; + } + + function body_content(){ + global $FANNIE_URL; + $vid = FormLib::get_form_value('vid'); + if ($vid === '') + return "Error: no vendor selected"; + + ob_start(); + ?> +
        + New vendor department + +
        +
        +
        + vendorDeptDisplay($vid); ?> +
        + + + add_script('vdepts.js'); + + return ob_get_clean(); + } + + private function vendorDeptDisplay($id){ + global $FANNIE_OP_DB, $FANNIE_URL; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $nameQ = $dbc->prepare_statement("SELECT vendorName FROM vendors WHERE vendorID=?"); + $nameR = $dbc->exec_statement($nameQ,array($id)); + $name = array_pop($dbc->fetch_row($nameR)); + + $ret = "Departments in $name
        "; + $ret .= ""; + $ret .= " + "; + + $deptQ = $dbc->prepare_statement("SELECT * FROM vendorDepartments WHERE vendorID=? + ORDER BY deptID");; + $deptR = $dbc->exec_statement($deptQ,array($id)); + while($row = $dbc->fetch_row($deptR)){ + $ret .= sprintf(" + + + + + + ", + $row[1],$row[1],$row[2],$row[1], + $row[3]*100, + $row[1],$row[1], + $FANNIE_URL.'src/img/buttons/b_edit.png', + $row[1],$row[2], + $FANNIE_URL.'src/img/buttons/b_drop.png'); + } + $ret .= "
        No.NameMargin  
        %d%s%.2f%% + \"Edit\" + \"Delete\"
        "; + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new VendorDepartmentEditor(); + $obj->draw_page(); +} diff --git a/fannie/item/vendors/VendorIndexPage.php b/fannie/item/vendors/VendorIndexPage.php new file mode 100644 index 000000000..d93952d14 --- /dev/null +++ b/fannie/item/vendors/VendorIndexPage.php @@ -0,0 +1,181 @@ +ajax_callbacks($ajax); + return False; + } + + return True; + } + + function ajax_callbacks($action){ + switch($action){ + case 'vendorDisplay': + $this->getVendorInfo(FormLib::get_form_value('vid',0)); + break; + case 'newVendor': + $this->newVendor(FormLib::get_form_value('name','')); + break; + default: + echo 'Bad request'; + break; + } + } + + private function getVendorInfo($id){ + global $FANNIE_OP_DB,$FANNIE_ROOT; + $dbc = FannieDB::get($FANNIE_OP_DB); + $ret = ""; + + $nameQ = $dbc->prepare_statement("SELECT vendorName FROM vendors WHERE vendorID=?"); + $nameR = $dbc->exec_statement($nameQ,array($id)); + if ($dbc->num_rows($nameR) < 1) + $ret .= "Name: Unknown"; + else + $ret .= "Id: $id   Name: ".array_pop($dbc->fetch_row($nameR)); + $ret .= "

        "; + + /* + $scriptQ = $dbc->prepare_statement("SELECT loadScript FROM vendorLoadScripts WHERE vendorID=?"); + $scriptR = $dbc->exec_statement($scriptQ,array($id)); + $ls = ""; + if ($scriptR && $dbc->num_rows($scriptR) > 0) + $ls = array_pop($dbc->fetch_row($scriptR)); + + $ret .= "Load script:

        '; + */ + + $itemQ = $dbc->prepare_statement("SELECT COUNT(*) FROM vendorItems WHERE vendorID=?"); + $itemR = $dbc->exec_statement($itemQ,array($id)); + $num = array_pop($dbc->fetch_row($itemR)); + if ($num == 0) + $ret .= "This vendor contains 0 items"; + else { + $ret .= "This vendor contains $num items"; + $ret .= "
        "; + $ret .= "Browse vendor catalog"; + } + $ret .= "
        "; + $ret .= "Update vendor catalog"; + $ret .= "
        "; + $ret .= "Update PLU/SKU mapping"; + $ret .= "

        "; + + $itemQ = $dbc->prepare_statement("SELECT COUNT(*) FROM vendorDepartments WHERE vendorID=?"); + $itemR = $dbc->exec_statement($itemQ,array($id)); + $num = array_pop($dbc->fetch_row($itemR)); + if ($num == 0) + $ret .= "This vendor's items are not yet arranged into departments"; + else { + $ret .= "This vendor's items are divided into "; + $ret .= $num." departments"; + $ret .= "
        "; + $ret .= "Display/Edit vendor departments"; + } + + echo $ret; + } + + private function newVendor($name){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $id = 1; + $p = $dbc->prepare_statement("SELECT max(vendorID) FROM vendors"); + $rp = $dbc->exec_statement($p); + $rw = $dbc->fetch_row($rp); + if ($rw[0] != "") + $id = $rw[0]+1; + + $insQ = $dbc->prepare_statement("INSERT INTO vendors VALUES (?,?)"); + $dbc->exec_statement($insQ,array($id,$name)); + + echo $id; + } + + function body_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $vendors = ""; + $vendors .= ""; + $q = $dbc->prepare_statement("SELECT * FROM vendors ORDER BY vendorName"); + $rp = $dbc->exec_statement($q); + $vid = FormLib::get_form_value('vid'); + while($rw = $dbc->fetch_row($rp)){ + if ($vid !== '' && $vid == $rw[0]) + $vendors .= ""; + else + $vendors .= ""; + } + ob_start(); + ?> +

        + +
        +
        +
        +
        + add_script('index.js'); + $this->add_onload_command('vendorchange();'); + + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new VendorIndexPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/item/vendors/ajax.php b/fannie/item/vendors/ajax.php new file mode 100644 index 000000000..efe559975 --- /dev/null +++ b/fannie/item/vendors/ajax.php @@ -0,0 +1,43 @@ +prepare_statement("DELETE FROM vendorLoadScripts WHERE vendorID=?"); + $dbc->exec_statement($q1,array($_REQUEST['vid'])); + $q2 = $dbc->prepare_statement("INSERT INTO vendorLoadScripts (vendorID,loadScript) VALUES (?,?)"); + $dbc->exec_statement($q2,array($_REQUEST['vid'],$_REQUEST['script'])); + break; + } +} diff --git a/fannie/item/vendors/browse.js b/fannie/item/vendors/browse.js new file mode 100644 index 000000000..c46ff79e5 --- /dev/null +++ b/fannie/item/vendors/browse.js @@ -0,0 +1,68 @@ +function catchange(){ + var did = $('#categoryselect').val(); + var vid = $('#vendorID').val(); + + $('#contentarea').html(''); + if (did == ""){ + $('#brandselect').html(""); + } + else { + $.ajax({ + url: 'BrowseVendorItems.php', + type: 'post', + timeout: 1000, + data: 'vid='+vid+'&deptID='+did+'&action=getCategoryBrands', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#brandselect').html(resp); + } + }); + } +} + +function addToPos(upc){ + var vid = $('#vendorID').val(); + var price = $('#price'+upc).val(); + var dept = $('#dept'+upc).val(); + $.ajax({ + url: 'BrowseVendorItems.php', + type: 'POST', + timeout: 1000, + data: 'upc='+upc+'&vid='+vid+'&price='+price+'&dept='+dept+'&action=addPosItem', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#price'+upc).parent().html(' '); + $('#dept'+upc).parent().html(' '); + $('#button'+upc).html(' '); + var cssObj = { "background" : "#ffffcc" } + $('#row'+upc).css(cssObj); + } + }); +} + +function brandchange() { + var did = $('#categoryselect').val(); + var vid = $('#vendorID').val(); + var brand = $('#brandselect').val(); + + if (brand == ""){ + $('#contentarea').html(''); + } + else { + $.ajax({ + url: 'BrowseVendorItems.php', + type: 'post', + data: 'vid='+vid+'&deptID='+did+'&brand='+brand+'&action=showCategoryItems', + error: function(e1,e2){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#contentarea').html(resp); + } + }); + } +} diff --git a/fannie/item/vendors/index.js b/fannie/item/vendors/index.js new file mode 100644 index 000000000..faa06e64e --- /dev/null +++ b/fannie/item/vendors/index.js @@ -0,0 +1,90 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function saveScript(vID){ + var scriptName = $('#vscript').val(); + + if (vscript == ''){ + return; + } + + $.ajax({ + url: 'ajax.php', + type: 'POST', + timeout: 1000, + data: 'vid='+vID+'&script='+scriptName+'&action=saveScript', + error: function(){ + alert('Error saving script name'); + }, + success: function(resp){ + alert('Saved as '+scriptName); + } + }); +} + +function vendorchange(){ + var vID = $('#vendorselect').val(); + + if (vID == ''){ + $('#contentarea').html(''); + return; + } + + if (vID == 'new'){ + var content = "New vendor name: "; + content += ""; + content += "

        "; + content += ""; + $('#contentarea').html(content); + return; + } + + $.ajax({ + url: 'VendorIndexPage.php', + type: 'POST', + timeout: 1000, + data: 'vid='+vID+'&action=vendorDisplay', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + $('#contentarea').html(resp); + } + }); +} + +function newvendor(){ + var name = $('#newname').val(); + $.ajax({ + url: 'VendorIndexPage.php', + type: 'POST', + timeout: 1000, + data: 'name='+name+'&action=newVendor', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + top.location='VendorIndexPage.php?vid='+resp; + } + }); +} diff --git a/fannie/item/vendors/index.php b/fannie/item/vendors/index.php new file mode 100644 index 000000000..c84bd3b9a --- /dev/null +++ b/fannie/item/vendors/index.php @@ -0,0 +1,34 @@ + diff --git a/fannie/item/vendors/vdepts.js b/fannie/item/vendors/vdepts.js new file mode 100644 index 000000000..7fd1da7d6 --- /dev/null +++ b/fannie/item/vendors/vdepts.js @@ -0,0 +1,82 @@ +function deleteCat(num,name){ + var vid = $('#vendorID').val(); + if (confirm('Delete '+name+' ('+num+')?')){ + $.ajax({ + url: 'VendorDepartmentEditor.php', + type: 'POST', + timeout: 1000, + data: 'deptID='+num+'&vid='+vid+'&action=deleteCat', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + alert(resp); + top.location='VendorDepartmentEditor.php?vid='+vid; + } + }); + } +} + +function newdept(){ + var vid = $('#vendorID').val(); + var num = $('#newno').val(); + var name = $('#newname').val(); + + $.ajax({ + url: 'VendorDepartmentEditor.php', + type: 'POST', + timeout: 1000, + data: 'deptID='+num+'&vid='+vid+'&name='+name+'&action=createCat', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + alert(resp); + if (resp == "Department created") + top.location='VendorDepartmentEditor.php?vid='+vid; + } + }); +} + +function edit(did){ + var name = $('#nametd'+did).html(); + var margin = $('#margintd'+did).html(); + var path = $('#urlpath').val(); + + $('#nametd'+did).html(""); + $('#margintd'+did).html(""); + + var newbutton = ""; + newbutton += ""; + $('#button'+did).html(newbutton); +} + +function save(did){ + var name = $('#in'+did).val(); + var margin = $('#im'+did).val(); + var path = $('#urlpath').val(); + var vid = $('#vendorID').val(); + + $('#nametd'+did).html(name); + $('#margintd'+did).html(margin); + + var newbutton = ""; + newbutton += ""; + $('#button'+did).html(newbutton); + + name = encodeURIComponent(name); + $.ajax({ + url: 'VendorDepartmentEditor.php', + type: 'POST', + timeout: 1000, + data: 'deptID='+did+'&vid='+vid+'&name='+name+'&margin='+margin+'&action=updateCat', + error: function(){ + alert('Error loading XML document'); + }, + success: function(resp){ + // do nothing + } + }); +} diff --git a/fannie/item/wordCount.js b/fannie/item/wordCount.js new file mode 100644 index 000000000..8ff3f14cb --- /dev/null +++ b/fannie/item/wordCount.js @@ -0,0 +1,176 @@ +/* word_count(), char_count() and char_count_pkg() support. + * Needs jQuery. + * Source: http://www.electrictoolbox.com/jquery-count-words-textarea-input/ +*/ + +/* Calculate the number of words or characters in an element and + * display a message about it in another element. + * + * Usage: word_count("#id of textarea", "#id of element where count-of-words is to be displayed", max-words) + * e.g.: onkeyup='javascript:word_count("#C02ad", "#C02ad_count", 100);' + * + * --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * 21Jan11 EL Add #-words limit param. Add info/warnings about size limit. + * This does not prevent entering "too many" words, altho $(id).text(foo) + * could be used to do this. +*/ +function word_count(field, count, wordLimit) { + + var number = 0; + var numberLeft = 0; + //var wordLimit = 100; + var msg = ""; + var matches = $(field).val().match(/\b/g); + if(matches) { + // match returns 2x too many words, so divide. + number = matches.length/2; + } + + // Compose the message ... + numberLeft = (wordLimit - number); + if ( numberLeft >= 0 ) { + msg = 'The box can hold about ' + numberLeft + ' more words'; + } else { + //numberLeft = (number - wordLimit); + msg = 'Please reduce your comment by ' + Math.abs(numberLeft) + ' words to ' + wordLimit + '.'; + } + + // ... and assign it to the text attibute of the information element. + $(count).text(msg); + //$(count).text( 'The box can hold about ' + numberLeft + ' more words'); + //$(count).text( number + ' word' + (number != 1 ? 's' : '') + ' approx'); + +// word_count +} + +/* jQuery "ready" waits for DOM to load + * so that all objects will be available to refer to. + * Then go through the document and act on selected objects. + * This is a preliminary or setup pass. +*/ http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery +$(document).ready(function() { + + // For each object with class="word_count" execute a function. + $('.word_count').each(function() { + var input = '#' + this.id; + var count = input + '_count'; + // count contains e.g. "#C02ad_count", i.e. an ID reference + // I assume this changes the word-count display area (div) display:none to display:block + // I don't what the point of setting it to none in the first place was. + $(count).show(); + // Do an initial call to word_count on this object to display the current count. + word_count(input, count, 100); + // Bind a call to word_count to the keyup action in the object. + // This is the equivalent of onkeyup='javascript:word_count("#C02ad", "#C02ad_count", 100);' + // or onkeyup='javascript:word_count("#" + this.id, "#" + this.id + "_count", 100);' + // so that the function will be executed as the user changes the field. + // Only works for keyboard entry, not cut/paste, which does not fire keyup. ?mouseup + $(this).keyup(function() { word_count(input, count, 100) }); + }); + +}); + +/* char_count() like word_count for all chars, shorter message +*/ +function char_count(field, count, charLimit) { + + var number = 0; + var numberLeft = 0; + var msg = ""; + number = $(field).val().length; + + // Compose the message ... + numberLeft = (charLimit - number); + if ( numberLeft >= 0 ) { + msg = numberLeft; + } else { + msg = numberLeft; + } + + // ... and assign it to the text attibute of the information element. + $(count).text(msg); + +// char_count +} + +/* jQuery "ready" waits for DOM to load + * so that all objects will be available to refer to. + * Then go through the document and act on selected objects. + * This is a preliminary or setup pass. +*/ http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery +$(document).ready(function() { + + // For each object with class="char_count" execute a function. + $('.char_count').each(function() { + var input = '#' + this.id; + var count = input + '_count'; + // count contains e.g. "#C02ad_count", i.e. an ID reference + // I assume this changes the char-count display area (div) display:none to display:block + // I don't what the point of setting it to none in the first place was. + $(count).show(); + // Do an initial call to char_count on this object to display the current count. + char_count(input, count, 30); + // Bind a call to char_count to the keyup action in the object. + // This is the equivalent of onkeyup='javascript:char_count("#C02ad", "#C02ad_count", 100);' + // or onkeyup='javascript:char_count("#" + this.id, "#" + this.id + "_count", 100);' + // so that the function will be executed as the user changes the field. + // Only works for keyboard entry, not cut/paste, which does not fire keyup. ?mouseup + $(this).keyup(function() { char_count(input, count, 30) }); + }); + +}); + +/* char_count_pkg() like word_count for all chars, shorter message + * and allow for a "package" statement that will be appended to it. +*/ +function char_count_pkg(field, count, charLimit) { + + var number = 0; + var numberLeft = 0; + var msg = ""; + number = $(field).val().length; + // Allow for the package spec that is appended: " 220g" + var uom = $(unitofmeasure).val().length; + var sze = $(size).val().length; + number = number + (uom + sze + 1); + + // Compose the message ... + numberLeft = (charLimit - number); + if ( numberLeft >= 0 ) { + msg = numberLeft; + } else { + msg = numberLeft; + } + + // ... and assign it to the text attibute of the information element. + $(count).text(msg); + +// char_count_pkg +} + +/* jQuery "ready" waits for DOM to load + * so that all objects will be available to refer to. + * Then go through the document and act on selected objects. + * This is a preliminary or setup pass. +*/ http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery +$(document).ready(function() { + + // For each object with class="char_count" execute a function. + $('.char_count_pkg').each(function() { + var input = '#' + this.id; + var count = input + '_count'; + // count contains e.g. "#C02ad_count", i.e. an ID reference + // I assume this changes the char-count display area (div) display:none to display:block + // I don't what the point of setting it to none in the first place was. + $(count).show(); + // Do an initial call to char_count on this object to display the current count. + char_count_pkg(input, count, 30); + // Bind a call to char_count to the keyup action in the object. + // This is the equivalent of onkeyup='javascript:char_count("#C02ad", "#C02ad_count", 100);' + // or onkeyup='javascript:char_count("#" + this.id, "#" + this.id + "_count", 100);' + // so that the function will be executed as the user changes the field. + // Only works for keyboard entry, not cut/paste, which does not fire keyup. ?mouseup + $(this).keyup(function() { char_count_pkg(input, count, 30) }); + }); + +}); diff --git a/fannie/label/Screenshot.png b/fannie/label/Screenshot.png new file mode 100644 index 000000000..ca36ca431 Binary files /dev/null and b/fannie/label/Screenshot.png differ diff --git a/fannie/label/index.php b/fannie/label/index.php new file mode 100644 index 000000000..e5649385c --- /dev/null +++ b/fannie/label/index.php @@ -0,0 +1,31 @@ + + + '; + + $html.=head(); + + $html.=' + IT CORE - Labels + + '; + + $html.=body(); + + $html.=' +

        + Screenshot of Wedge Label Maker +
        '; + + $html.=foot(); + + $html.=' + +'; + + print_r($html); +?> diff --git a/fannie/legacy/FE/overshort.php b/fannie/legacy/FE/overshort.php new file mode 100755 index 000000000..88e1ec6bb --- /dev/null +++ b/fannie/legacy/FE/overshort.php @@ -0,0 +1,1025 @@ +query("USE is4c_trans"); + +/* actions via POST are AJAX requests */ +if (isset($_POST['action'])){ + switch($_POST['action']){ + case 'save': + $date = $_POST['curDate']; + $data = $_POST['data']; + $user = $_POST['user']; + $resolved = $_POST['resolved']; + $notes = $_POST['notes']; + + $checkQ = "select username from overshortsLog where date='$date'"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "insert into overshortsLog values ('$date','$user',$resolved)"; + $insR = $sql->query_all($insQ); + } + else { + $upQ = "update overshortsLog set username='$user',resolved=$resolved where date='$date'"; + $upR = $sql->query_all($upQ); + } + + save($date,$data); + saveNotes($date,$notes); + echo "saved"; + break; + case 'date': + $date = $_POST['arg']; + require($FANNIE_ROOT."src/select_dlog.php"); + $dlog = select_dlog($date); + if ($dlog != "is4c_trans.dlog") + $dlog = "trans_archive.dlogBig"; + /* determine who worked that day (and their first names) */ + $empsQ = "select e.firstname,d.emp_no from $dlog as d,is4c_op.employees as e where + ".$sql->date_equals('d.tdate',$date)." and trans_type='T' and d.emp_no = e.emp_no + group by d.emp_no,e.firstname order by e.firstname"; + $empsR=$sql->query($empsQ); + $output = "

        $date

        "; + //$output .= "
        "; + $output .= ""; + $output .= ""; + $output .= ""; + + /* global totals */ + $caTotal = 0; + $ckTotal = 0; + $ccTotal = 0; + $miTotal = 0; + $tcTotal = 0; + $gdTotal = 0; + $efTotal = 0; + $ecTotal = 0; + $cpTotal = 0; + $icTotal = 0; + $scTotal = 0; + + $countCATotal = 0; + $countCKTotal = 0; + $countCCTotal = 0; + $countMITotal = 0; + $countTCTotal = 0; + $countGDTotal = 0; + $countEFTotal = 0; + $countECTotal = 0; + $countCPTotal = 0; + $countICTotal = 0; + $countSCTotal = 0; + + $osCATotal = 0; + $osCKTotal = 0; + $osCCTotal = 0; + $osMITotal = 0; + $osTCTotal = 0; + $osGDTotal = 0; + $osEFTotal = 0; + $osECTotal = 0; + $osCPTotal = 0; + $osICTotal = 0; + $osSCTotal = 0; + + $overallTotal = 0; + $overallCountTotal = 0; + $overallOSTotal = 0; + + /* get cash, check, and credit totals for each employee + print them in a table along with input boxes for over/short */ + $q = "SELECT -1*sum(total) AS total,emp_no, + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END + AS trans_subtype + FROM $dlog + WHERE ".$sql->date_equals('tdate',$date)." + GROUP BY emp_no, + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END"; + $r = $sql->query($q); + $posttl = array(); + while($w = $sql->fetch_row($r)){ + if (!isset($posttl[$w['emp_no']])) $posttl[$w['emp_no']] = array(); + $posttl[$w['emp_no']][$w['trans_subtype']] = $w['total']; + } + while ($row = $sql->fetch_array($empsR)){ + $perCashierTotal = 0; + $perCashierCountTotal = 0; + $perCashierOSTotal = 0; + + /* + $caQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CA'"; + $caR = $sql->query($caQ); + $caW = $sql->fetch_array($caR); + */ + $caW = array((isset($posttl[$row[1]]['CA'])) ? $posttl[$row[1]]['CA'] : 0); + $caTotal += $caW[0]; + if (empty($caW[0])) + $caW[0] = 0; + $perCashierTotal += $caW[0]; + + /* + $ckQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CK'"; + $ckR = $sql->query($ckQ); + $ckW = $sql->fetch_array($ckR); + */ + $ckW = array((isset($posttl[$row[1]]['CK'])) ? $posttl[$row[1]]['CK'] : 0); + $ckTotal += $ckW[0]; + if (empty($ckW[0])) + $ckW[0] = 0; + $perCashierTotal += $ckW[0]; + + /* + $ccQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CC'"; + $ccR = $sql->query($ccQ); + $ccW = $sql->fetch_array($ccR); + */ + $ccW = array((isset($posttl[$row[1]]['CC'])) ? $posttl[$row[1]]['CC'] : 0); + $ccTotal += $ccW[0]; + if (empty($ccW[0])) + $ccW[0] = 0; + $perCashierTotal += $ccW[0]; + + /* + $miQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'MI'"; + $miR = $sql->query($miQ); + $miW = $sql->fetch_array($miR); + */ + $miW = array((isset($posttl[$row[1]]['MI'])) ? $posttl[$row[1]]['MI'] : 0); + $miTotal += $miW[0]; + if (empty($miW[0])) + $miW[0] = 0; + $perCashierTotal += $miW[0]; + + /* + $tcQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'TC'"; + $tcR = $sql->query($tcQ); + $tcW = $sql->fetch_array($tcR); + */ + $tcW = array((isset($posttl[$row[1]]['TC'])) ? $posttl[$row[1]]['TC'] : 0); + $tcTotal += $tcW[0]; + if (empty($tcW[0])) + $tcW[0] = 0; + $perCashierTotal += $tcW[0]; + + /* + $gdQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'GD'"; + $gdR = $sql->query($gdQ); + $gdW = $sql->fetch_array($gdR); + */ + $gdW = array((isset($posttl[$row[1]]['GD'])) ? $posttl[$row[1]]['GD'] : 0); + $gdTotal += $gdW[0]; + if (empty($gdW[0])) + $gdW[0] = 0; + $perCashierTotal += $gdW[0]; + + /* + $efQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'EF'"; + $efR = $sql->query($efQ); + $efW = $sql->fetch_array($efR); + */ + $efW = array((isset($posttl[$row[1]]['EF'])) ? $posttl[$row[1]]['EF'] : 0); + $efTotal += $efW[0]; + if (empty($efW[0])) + $efW[0] = 0; + $perCashierTotal += $efW[0]; + + /* + $ecQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'EC'"; + $ecR = $sql->query($ecQ); + $ecW = $sql->fetch_array($ecR); + */ + $ecW = array((isset($posttl[$row[1]]['EC'])) ? $posttl[$row[1]]['EC'] : 0); + $ecTotal += $ecW[0]; + if (empty($ecW[0])) + $ecW[0] = 0; + $perCashierTotal += $ecW[0]; + + /* + $cpQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CP'"; + $cpR = $sql->query($cpQ); + $cpW = $sql->fetch_array($cpR); + */ + $cpW = array((isset($posttl[$row[1]]['CP'])) ? $posttl[$row[1]]['CP'] : 0); + $cpTotal += $cpW[0]; + if (empty($cpW[0])) + $cpW[0] = 0; + $perCashierTotal += $cpW[0]; + + /* + $icQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'IC'"; + $icR = $sql->query($icQ); + $icW = $sql->fetch_array($icR); + */ + $icW = array((isset($posttl[$row[1]]['IC'])) ? $posttl[$row[1]]['IC'] : 0); + $icTotal += $icW[0]; + if (empty($icW[0])) + $icW[0] = 0; + $perCashierTotal += $icW[0]; + + /* + $scQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'SC'"; + $scR = $sql->query($scQ); + $scW = $sql->fetch_array($scR); + */ + $scW = array((isset($posttl[$row[1]]['SC'])) ? $posttl[$row[1]]['SC'] : 0); + $scTotal += $scW[0]; + if (empty($scW[0])) + $scW[0] = 0; + $perCashierTotal += $scW[0]; + + $noteQ = "select note from dailyNotes where emp_no=$row[1] and date='$date'"; + $noteR = $sql->query($noteQ); + $noteW = $sql->fetch_array($noteR); + $note = stripslashes($noteW[0]); + + $output .= ""; + + $output .= ""; + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='SCA'"; + $fetchR = $sql->query($fetchQ); + $startcash = 0; + if ($sql->num_rows($fetchR) == 0) + $output .= ""; + else { + $startcash = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $perCashierCountTotal -= $startcash; + $countCATotal -= $startcash; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CA'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $cash = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($cash - $caW[0] - $startcash,2); + $output .= ""; + $output .= ""; + + $countCATotal += $cash; + $osCATotal += $os; + + $perCashierCountTotal += $cash; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CK'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $check = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($check - $ckW[0],2); + $output .= ""; + $output .= ""; + + $countCKTotal += $check; + $osCKTotal += $os; + + $perCashierCountTotal += $check; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CC'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $credit = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($credit - $ccW[0],2); + $output .= ""; + $output .= ""; + + $countCCTotal += $credit; + $osCCTotal += $os; + + $perCashierCountTotal += $credit; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='MI'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $mi = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($mi - $miW[0],2); + $output .= ""; + $output .= ""; + + $countMITotal += $mi; + $osMITotal += $os; + + $perCashierCountTotal += $mi; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='EF'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $ef = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($ef - $efW[0],2); + $output .= ""; + $output .= ""; + + $countEFTotal += $ef; + $osEFTotal += $os; + + $perCashierCountTotal += $ef; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='EC'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $ec = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($ec - $ecW[0],2); + $output .= ""; + $output .= ""; + + $countECTotal += $ec; + $osECTotal += $os; + + $perCashierCountTotal += $ec; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='GD'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $gd = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($gd - $gdW[0],2); + $output .= ""; + $output .= ""; + + $countGDTotal += $gd; + $osGDTotal += $os; + + $perCashierCountTotal += $gd; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='TC'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $tc = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($tc - $tcW[0],2); + $output .= ""; + $output .= ""; + + $countTCTotal += $tc; + $osTCTotal += $os; + + $perCashierCountTotal += $tc; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CP'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $cp = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($cp - $cpW[0],2); + $output .= ""; + $output .= ""; + + $countCPTotal += $cp; + $osCPTotal += $os; + + $perCashierCountTotal += $cp; + $perCashierOSTotal += $os; + } + + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='IC'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $ic = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = $ic - $icW[0]; + $output .= ""; + $output .= ""; + + $countICTotal += $ic; + $osICTotal += $os; + + $perCashierCountTotal += $ic; + $perCashierOSTotal += $os; + } + + $output .= ""; + $fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='SC'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $sc = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = $sc - $scW[0]; + $output .= ""; + $output .= ""; + + $countSCTotal += $sc; + $osSCTotal += $os; + + $perCashierCountTotal += $sc; + $perCashierOSTotal += $os; + } + + $perCashierTotal = round($perCashierTotal,2); + $perCashierCountTotal = round($perCashierCountTotal,2); + $perCashierOSTotal = round($perCashierOSTotal,2); + + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + + $output .= ""; + + } + /* add overall totals */ + $output .= ""; + + $caTotal = round($caTotal,2); + $countCATotal = round($countCATotal,2); + $osCATotal = round($osCATotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $caTotal; + $overallCountTotal += $countCATotal; + $overallOSTotal += $osCATotal; + + $ckTotal = round($ckTotal,2); + $countCKTotal = round($countCKTotal,2); + $osCKTotal = round($osCKTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $ckTotal; + $overallCountTotal += $countCKTotal; + $overallOSTotal += $osCKTotal; + + $ccTotal = round($ccTotal,2); + $countCCTotal = round($countCCTotal,2); + $osCCTotal = round($osCCTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $ccTotal; + $overallCountTotal += $countCCTotal; + $overallOSTotal += $osCCTotal; + + $miTotal = round($miTotal,2); + $countMITotal = round($countMITotal,2); + $osMITotal = round($osMITotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $miTotal; + $overallCountTotal += $countMITotal; + $overallOSTotal += $osMITotal; + + $tcTotal = round($tcTotal,2); + $countTCTotal = round($countTCTotal,2); + $osTCTotal = round($osTCTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $tcTotal; + $overallCountTotal += $countTCTotal; + $overallOSTotal += $osTCTotal; + + $gdTotal = round($gdTotal,2); + $countGDTotal = round($countGDTotal,2); + $osGDTotal = round($osGDTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $gdTotal; + $overallCountTotal += $countGDTotal; + $overallOSTotal += $osGDTotal; + + $efTotal = round($efTotal,2); + $countEFTotal = round($countEFTotal,2); + $osEFTotal = round($osEFTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $efTotal; + $overallCountTotal += $countEFTotal; + $overallOSTotal += $osEFTotal; + + $ecTotal = round($ecTotal,2); + $countECTotal = round($countECTotal,2); + $osECTotal = round($osECTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $ecTotal; + $overallCountTotal += $countECTotal; + $overallOSTotal += $osECTotal; + + $cpTotal = round($cpTotal,2); + $countCPTotal = round($countCPTotal,2); + $osCPTotal = round($osCPTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $cpTotal; + $overallCountTotal += $countCPTotal; + $overallOSTotal += $osCPTotal; + + $icTotal = round($icTotal,2); + $countICTotal = round($countICTotal,2); + $osICTotal = round($osICTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $icTotal; + $overallCountTotal += $countICTotal; + $overallOSTotal += $osICTotal; + + $scTotal = round($scTotal,2); + $countSCTotal = round($countSCTotal,2); + $osSCTotal = round($osSCTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $scTotal; + $overallCountTotal += $countSCTotal; + $overallOSTotal += $osSCTotal; + + $overallTotal = round($overallTotal,2); + $overallCountTotal = round($overallCountTotal,2); + $overallOSTotal = round($overallOSTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + + $noteQ = "select note from dailyNotes where date='$date' and emp_no = -1"; + $noteR = $sql->query($noteQ); + $noteW = $sql->fetch_array($noteR); + $note = $noteW[0]; + $output .= ""; + + $output .= "
        Name TotalCounted AmtOver/Short
        $row[0]Starting cashn/an/a
        n/a
         Cash$caW[0] 
        $os
         Check$ckW[0] 
        $os
         Credit$ccW[0] 
        $os
         Store Charge$miW[0] 
        $os
         EBT Food$efW[0] 
        $os
         EBT Cash$ecW[0] 
        $os
         Gift Card$gdW[0] 
        $os
         Gift Certificate$tcW[0] 
        $os
         Coupons".sprintF("%.2f",$cpW[0])." 
        $os
         InStore Coupons$icW[0] 
        $os
         Store Credit$scW[0] 
        $os
         Cashier totals$perCashierTotal$perCashierCountTotal$perCashierOSTotal
         Notes"; + $output .= "
             
             
        TotalsCash$caTotal$countCATotal$osCATotal
         Checks$ckTotal$countCKTotal$osCKTotal
         Credit$ccTotal$countCCTotal$osCCTotal
         Store Charge$miTotal$countMITotal$osMITotal
         Gift Certificate$tcTotal$countTCTotal$osTCTotal
         Gift Card$gdTotal$countGDTotal$osGDTotal
         EBT Food$efTotal$countEFTotal$osEFTotal
         EBT Cash$ecTotal$countECTotal$osECTotal
         Coupons$cpTotal$countCPTotal$osCPTotal
         InStore Coupons$icTotal$countICTotal$osICTotal
         Store Credit$scTotal$countSCTotal$osSCTotal
        Grand totals $overallTotal$overallCountTotal$overallOSTotal
         Notes"; + $output .= "
        "; + + $extraQ = "select username, resolved from overshortsLog where date='$date'"; + $extraR = $sql->query($extraQ); + $extraW = $sql->fetch_array($extraR); + $output .= "This date last edited by: $extraW[0]
        "; + $output .= ""; + $output .= "query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "insert into dailyCounts values ('$date',$cashier,'$tender_type',$amt)"; + $insR = $sql->query_all($insQ); + } + else { + $upQ = "update dailyCounts set amt=$amt where date='$date' and emp_no=$cashier and tender_type='$tender_type'"; + $upR = $sql->query_all($upQ); + } + } + } + } +} + +function saveNotes($date,$notes){ + global $sql; + $noteIDs = explode('`',$notes); + foreach ($noteIDs as $n){ + $temp = explode('|',$n); + $emp = $temp[0]; + $note = str_replace("'","''",urldecode($temp[1])); + + $checkQ = "select emp_no from dailyNotes where date='$date' and emp_no=$emp"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "insert into dailyNotes values ('$date',$emp,'$note')"; + $insR = $sql->query_all($insQ); + } + else { + $upQ = "update dailyNotes set note='$note' where date='$date' and emp_no=$emp"; + $upR = $sql->query_all($upQ); + } + } +} + +?> + +Overshorts + + + + + + + + +Date: + + +
        + +
        + +
        + + diff --git a/fannie/legacy/FE/overshort/.gitignore b/fannie/legacy/FE/overshort/.gitignore new file mode 100644 index 000000000..dcaa8e8a8 --- /dev/null +++ b/fannie/legacy/FE/overshort/.gitignore @@ -0,0 +1 @@ +acct diff --git a/fannie/legacy/FE/overshort/cashier.js b/fannie/legacy/FE/overshort/cashier.js new file mode 100644 index 000000000..0a875f3ef --- /dev/null +++ b/fannie/legacy/FE/overshort/cashier.js @@ -0,0 +1,143 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'cashier.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'loadCashier': + document.getElementById('display').innerHTML=array[1]; + document.getElementById('countSCA').focus(); + break; + case 'save': + alert(array[1]); + break; + default: + alert("ERROR:"+response); + } + } +} + +function loadCashier(){ + var empno = document.getElementById('empno').value; + var tdate = document.getElementById('date').value; + + phpSend('loadCashier&empno='+empno+'&date='+tdate); + + document.getElementById('date').value=''; + document.getElementById('empno').value=''; +} + +var tenders = Array('CA','CK','CC','MI','EF','EC','GD','TC','CP','IC','SC'); + +function resumSheet(){ + var countTotal = 0; + var osTotal = 0; + var posTotal = 0; + + for (var i = 0; i < tenders.length; i++){ + var c = 0; + if (tenders[i] != 'CK') + c = Number(document.getElementById('count'+tenders[i]).value); + else + c = Number(document.getElementById('countCK').innerHTML); + + var p = Number(document.getElementById('pos'+tenders[i]).innerHTML); + + var os = Math.round( (c - p)*100 ) / 100; + if (tenders[i] == 'CA'){ + var sca = Number(document.getElementById('countSCA').value); + posTotal += sca; + os = Math.round( (c - p - sca)*100 ) / 100; + } + + osTotal += os; + countTotal += c; + posTotal += p; + + document.getElementById('os'+tenders[i]).innerHTML = os; + } + + document.getElementById('posT').innerHTML = Math.round(posTotal*100)/100; + document.getElementById('countT').innerHTML = Math.round(countTotal*100)/100; + document.getElementById('osT').innerHTML = Math.round(osTotal*100)/100; +} + +function resumChecks(){ + var checks = document.getElementById('checklisting').value; + var tmp = checks.split("\n"); + var sum = 0; + for (var i = 0; i < tmp.length; i++){ + sum += Number(tmp[i]); + } + + document.getElementById('countCK').innerHTML = Math.round(sum*100)/100; + resumSheet(); +} + +function save(){ + var tenders = saveTenders(); + var checks = saveChecks(); + var notes = escape(document.getElementById('notes').value); + var empno = document.getElementById('current_empno').value; + var tdate = document.getElementById('current_date').value; + + phpSend('save&empno='+empno+'&date='+tdate+'&tenders='+tenders+'&checks='+checks+'¬es='+notes); +} + +function saveTenders(){ + var ret = ''; + var sca = document.getElementById('countSCA').value; + ret += "SCA:"+sca; + for (var i = 0; i < tenders.length; i++){ + var t = 0; + if (tenders[i] != 'CK') + t = document.getElementById('count'+tenders[i]).value; + else + t = document.getElementById('count'+tenders[i]).innerHTML; + + ret += "|"+tenders[i]+":"+t; + } + + return ret; +} + +function saveChecks(){ + var ret = ''; + var checks = document.getElementById('checklisting').value; + var tmp = checks.split("\n") + + for (var i=0; iquery("use is4c_trans"); + +if (isset($_GET["action"])){ + $out = $_GET["action"]."`"; + + switch($_GET["action"]){ + case 'loadCashier': + $date = $_GET['date']; + $empno = $_GET['empno']; + $out .= displayCashier($date,$empno); + break; + case 'save': + $date = $_GET['date']; + $empno = $_GET['empno']; + $tenders = $_GET['tenders']; + $notes = $_GET['notes']; + $checks = $_GET['checks']; + $out .= save($empno,$date,$tenders,$checks,$notes); + break; + } + echo $out; + return; +} + +function displayCashier($date,$empno){ + global $sql; + + $dlog = select_dlog($date); + $dlog = "trans_archive.dlogBig"; + + $tenders = array('CA','CK','CC','MI','GD','TC','EF','EC','CP','IC','SC','AX'); + $totals = array(); + $counts = array(); + $tClause = "("; + foreach($tenders as $t) { + $totals[$t] = 0; + $counts[$t] = 0; + $tClause .= "'$t',"; + } + $tClause = substr($tClause,0,strlen($tClause)-1).")"; + $counts["SCA"] = 0.00; + + + $totalsQ = "SELECT + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END + as trans_subtype, + -1*SUM(total) FROM $dlog WHERE emp_no = $empno + AND ".$sql->date_equals('tdate',$date)." AND trans_subtype IN $tClause + GROUP BY + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END"; + $totalsR = $sql->query($totalsQ); + while($totalsW = $sql->fetch_row($totalsR)) + $totals[$totalsW[0]] = $totalsW[1]; + + $countsQ = "SELECT tender_type,amt FROM dailyCounts WHERE emp_no = $empno AND + ".$sql->date_equals('date',$date); + $countsR = $sql->query($countsQ); + while($countsW = $sql->fetch_row($countsR)) + $counts[$countsW[0]] = $countsW[1]; + + $posTotal = 0; + $countTotal = 0; + $osTotal = 0; + + $ret = ""; + $ret .= "$date - Emp. #$empno

        "; + $ret .= "Starting cash:
        "; + $posTotal += $counts['SCA']; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['CA'] - $totals['CA'] - $counts['SCA'],2); + $ret .= ""; + + $posTotal += $totals['CA']; + $countTotal += $counts['CA']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['CK'] - $totals['CK'],2); + $ret .= ""; + $checksQ = "select checks from dailyChecks where ".$sql->date_equals('date',$date)." and emp_no=$empno"; + $checksR = $sql->query($checksQ); + $checks = ""; + while($checksW = $sql->fetch_row($checksR)){ + $checks = ""; + foreach( explode(",",$checksW[0]) as $c){ + if (is_numeric($c)) + $checks .= "$c\n"; + } + $checks = substr($checks,0,strlen($checks)-1); + } + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['CK']; + $countTotal += $counts['CK']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['CC'] - $totals['CC'],2); + $ret .= ""; + + $posTotal += $totals['CC']; + $countTotal += $counts['CC']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['MI'] - $totals['MI'],2); + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['MI']; + $countTotal += $counts['MI']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['EF'] - $totals['EF'],2); + $ret .= ""; + + $posTotal += $totals['EF']; + $countTotal += $counts['EF']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['EC'] - $totals['EC'],2); + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['EC']; + $countTotal += $counts['EC']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['GD'] - $totals['GD'],2); + $ret .= ""; + + $posTotal += $totals['GD']; + $countTotal += $counts['GD']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['TC'] - $totals['TC'],2); + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['TC']; + $countTotal += $counts['TC']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['CP'] - $totals['CP'],2); + $ret .= ""; + + $posTotal += $totals['CP']; + $countTotal += $counts['CP']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['IC'] - $totals['IC'],2); + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['IC']; + $countTotal += $counts['IC']; + $osTotal += $os; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['SC'] - $totals['SC'],2); + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['SC']; + $countTotal += $counts['SC']; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $noteQ = "select note from dailyNotes where date='$date' and emp_no = $empno"; + $noteR = $sql->query($noteQ); + $noteW = $sql->fetch_array($noteR); + $note = str_replace("''","'",$noteW[0]); + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= "
        CashPOSCountO/S ChecksPOSCountO/SList checks
         ".$totals['CA']."$os  ".$totals['CK']."".$counts['CK']."$os
         
        Credit CardPOSCountO/S Store ChargePOSCountO/S
         ".$totals['CC']."$os  ".$totals['MI']."$os
         
        EBT FoodPOSCountO/S EBT CashPOSCountO/S
         ".$totals['EF']."$os  ".$totals['EC']."$os
          
        Gift CardsPOSCountO/S Gift Cert.POSCountO/S
         ".$totals['GD']."$os  ".$totals['TC']."$os
         
        Vendor CpnsPOSCountO/S Store CpnsPOSCountO/S
         ".sprintf("%.2f",$totals['CP'])."$os  ".$totals['IC']."$os
        Store CreditPOSCountO/S 
         ".$totals['SC']."$os 
         
        TotalsPOSCountO/S 
         $posTotal$countTotal$osTotal 
        "; + $ret .= ""; + $ret .= "
        "; + + $ret .= ""; + $ret .= ""; + + return $ret; +} + +function save($empno,$date,$tenders,$checks,$notes){ + global $sql; + + $notes = str_replace("'","''",urldecode($notes)); + $checkQ = "select emp_no from dailyNotes where ".$sql->date_equals('date',$date)." and emp_no=$empno"; + if ($sql->num_rows($sql->query($checkQ)) == 0){ + $insQ = "INSERT INTO dailyNotes VALUES ('$date',$empno,'$notes')"; + $sql->query_all($insQ); + } + else { + $upQ = "UPDATE dailyNotes SET note='$notes' WHERE ".$sql->date_equals('date',$date)." and emp_no=$empno"; + $sql->query_all($upQ); + } + + $checkQ = "select id from dailyChecks where ".$sql->date_equals('date',$date)." and emp_no=$empno"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "INSERT INTO dailyChecks (date,emp_no,checks) VALUES ('$date',$empno,'$checks')"; + $sql->query_all($insQ); + } + else { + $upQ = "UPDATE dailyChecks SET checks='$checks' WHERE ".$sql->date_equals('date',$date)." and emp_no=$empno"; + $sql->query_all($upQ); + } + + $tarray = explode("|",$tenders); + foreach($tarray as $t){ + $temp = explode(":",$t); + if (count($temp) != 2) continue; + if (!is_numeric($temp[1])) continue; + + $tender = $temp[0]; + $amt = $temp[1]; + + $checkQ = "SELECT emp_no FROM dailyCounts where ".$sql->date_equals('date',$date)." and emp_no=$empno and tender_type='$tender'"; + if ($sql->num_rows($sql->query($checkQ)) == 0){ + $insQ = "INSERT INTO dailyCounts VALUES ('$date',$empno,'$tender',$amt)"; + $sql->query_all($insQ); + } + else { + $upQ = "UPDATE dailyCounts SET amt=$amt WHERE ".$sql->date_equals('date',$date)." and emp_no=$empno and tender_type='$tender'"; + $sql->query_all($upQ); + } + } + + return "Saved"; +} + +?> + + + + Cashier + + + + + + +
        +
        +Date: +Cashier: + +
        +
        + +
        +
        + + + diff --git a/fannie/legacy/FE/overshort/count.js b/fannie/legacy/FE/overshort/count.js new file mode 100644 index 000000000..4d2d616e6 --- /dev/null +++ b/fannie/legacy/FE/overshort/count.js @@ -0,0 +1,382 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'count.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'loader': + document.getElementById('display').innerHTML=array[1]; + break; + case 'save': + alert(array[1]); + break; + default: + alert('ERROR:'+response); + } + } +} + +function loader(){ + document.getElementById('display').innerHTML=''; + var date1 = document.getElementById('startDate').value; + var date2 = document.getElementById('endDate').value; + phpSend('loader&date1='+date1+'&date2='+date2); +} + +function save(){ + var date1 = document.getElementById('savedDate1').value; + var date2 = document.getElementById('savedDate2').value; + + var changeOrder = saveChangeOrder(); + var openSafeCount = saveOpenSafeCount(); + var closeSafeCount = saveCloseSafeCount(); + var buyAmount = saveBuyAmount(); + var dropAmount = saveDropAmount(); + var depositAmount = saveDepositAmount(); + var atmAmount = saveAtmAmount(); + + phpSend('save&date1='+date1+'&date2='+date2+'&changeOrder='+changeOrder+'&openSafeCount='+openSafeCount+'&closeSafeCount='+closeSafeCount+'&buyAmount='+buyAmount+'&dropAmount='+dropAmount+"&depositAmount="+depositAmount+'&atmAmount='+atmAmount); +} + +var denoms = Array('0.01','0.05','0.10','0.25','Junk','1.00','5.00','10.00','20.00','50.00','100.00','Checks'); + +function saveDepositAmount(){ + var ret = ''; + for(var i=0; iquery("use is4c_trans"); +require($FANNIE_ROOT.'src/select_dlog.php'); + +if (isset($_GET["action"])){ + $out = $_GET["action"]."`"; + + switch($_GET["action"]){ + case 'loader': + $d1 = $_GET['date1']; + $d2 = $_GET['date2']; + + $dateStr = $d1." ".$d2; + if ($d1 == $d2) $dateStr = $d1; + + $out .= displayUI($dateStr); + break; + case 'save': + $d1 = $_GET['date1']; + $d2 = $_GET['date2']; + + $dateStr = $d1." ".$d2; + if ($d1 == $d2) $dateStr = $d1; + + $out .= save($dateStr, + $_GET['changeOrder'], + $_GET['openSafeCount'], + $_GET['closeSafeCount'], + $_GET['buyAmount'], + $_GET['dropAmount'], + $_GET['depositAmount'], + $_GET['atmAmount']); + + } + echo $out; + return; +} + +function save($dateStr,$changeOrder,$openSafeCount,$closeSafeCount,$buyAmount,$dropAmount,$depositAmount,$atmAmount){ + saveInputs($dateStr,'changeOrder',$changeOrder); + saveInputs($dateStr,'openSafeCount',$openSafeCount); + saveInputs($dateStr,'closeSafeCount',$closeSafeCount); + saveInputs($dateStr,'buyAmount',$buyAmount); + saveInputs($dateStr,'dropAmount',$dropAmount); + saveInputs($dateStr,'depositAmount',$depositAmount); + saveInputs($dateStr,'atm',$atmAmount); + + return 'Saved'; +} + +function saveInputs($dateStr,$row,$data){ + global $sql; + + $temp = explode('|',$data); + foreach($temp as $t){ + $temp2 = explode(':',$t); + if (count($temp2) < 2) continue; + $denom = $temp2[0]; + $amt = $temp2[1]; + + if ($amt == '') continue; + + $checkQ = "SELECT amt FROM dailyDeposit WHERE dateStr='$dateStr' AND rowName='$row' AND denomination='$denom'"; + if ($sql->num_rows($sql->query($checkQ)) == 0){ + $insQ = "INSERT INTO dailyDeposit VALUES ('$dateStr','$row','$denom',$amt)"; + $sql->query_all($insQ); + } + else { + $upQ = "UPDATE dailyDeposit SET amt=$amt WHERE dateStr='$dateStr' AND rowName='$row' AND denomination='$denom'"; + $sql->query_all($upQ); + } + } +} + +function displayUI($dateStr){ + global $sql; + + $startDate = $dateStr; + $endDate = $dateStr; + if (strstr($dateStr," ")){ + $temp = explode(" ",$dateStr); + $startDate = $temp[0]; + $endDate = $temp[1]; + } + + $holding = array('changeOrder'=>array(), + 'openSafeCount'=>array(), + 'closeSafeCount'=>array(), + 'dropAmount'=>array(), + 'atm'=>array('fill'=>0,'reject'=>0) + ); + + $denoms = array('0.01','0.05','0.10','0.25','Junk','1.00','5.00','10.00','20.00','50.00','100.00','Checks'); + foreach($denoms as $d){ + foreach($holding as $k=>$v){ + $holding[$k]["$d"] = 0; + } + } + + $dataQ = "select rowName,denomination,amt from dailyDeposit where datestr='$dateStr' and rowName <> 'buyAmount'"; + $dataR = $sql->query($dataQ); + while($dataW = $sql->fetch_row($dataR)){ + $holding[$dataW[0]][$dataW[1]] = $dataW[2]; + } + + $actualTotal = 0; + $accountableTotal = 0; + $buyAmountTotal = 0; + + $ret = "

        $dateStr

        "; + $ret .= ""; + foreach ($denoms as $d) $ret .= ""; + $ret .= ""; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == 'Checks' || $d == "100.00" || $d == "50.00" || $d == "20.00" || $d == "Junk") + $ret .= ""; + else{ + $ret .= ""; + $sum += $holding['changeOrder'][$d]; + } + } + $ret .= ""; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == 'Checks') + $ret .= ""; + else{ + $ret .= ""; + $sum += $holding['openSafeCount'][$d]; + } + } + $ret .= ""; + + $dateClause = " ".$sql->date_equals('date',$dateStr)." "; + if (strstr($dateStr," ")){ + $dates = explode(" ",$dateStr); + $dateClause = " date BETWEEN '$dates[0] 00:00:00' AND '$dates[1] 23:59:59' "; + } + $countQ = "SELECT tender_type,sum(amt) from dailyCounts where tender_type in ('CA','CK','SCA') and $dateClause GROUP BY tender_type"; + $countR = $sql->query($countQ); + $osCounts = array('CA'=>0,'CK'=>0,'SCA'=>0); + while($countW = $sql->fetch_row($countR)) + $osCounts[$countW[0]] = $countW[1]; + + $bagQ = "SELECT sum(amt) FROM dailyCounts WHERE $dateClause AND tender_type='SCA'"; + $start_cash = array_pop($sql->fetch_row($sql->query($bagQ))); + $bags = round($start_cash / 168.00); + //$osCounts['CA'] -= 168*$bags; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == "Checks"){ + $ret .= ""; + } + else { + $val = $holding['changeOrder'][$d] + $holding['openSafeCount'][$d]; + $ret .= ""; + $sum += $val; + } + } + $ret .= ""; + $accountableTotal += $sum; + + $ret .= ""; + foreach($denoms as $d){ + if ($d == "1.00"){ + $ret .= ""; + } + else if ($d == "Checks"){ + $ret .= ""; + } + else { + $ret .= ""; + } + } + $val = ($osCounts['CA'] + $osCounts['CK']); + $ret .= ""; + $buyAmountTotal -= $val; + $accountableTotal += $val; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $accountableTotal += ($holding['atm']['reject'] - $holding['atm']['fill']); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $accountableTotal -= (168*$bags); + + $fills = array('0.01'=>1,'0.05'=>2,'0.10'=>5,'0.25'=>10,'1.00'=>50,'5.00'=>50,'10.00'=>50); + $pars = array("0.01"=>40,"0.05"=>60,"0.10"=>200,"0.25"=>700,"1.00"=>1700,"5.00"=>500,"10.00"=>800); + + $ret .= ""; + $sum = 0; + $depositAmount = array(); + foreach($denoms as $d){ + if ($d == 'Checks'){ + $ret .= ""; + $sum += $osCounts['CK']; + $depositAmount['Checks'] = $osCounts['CK']; + } + else if ($d == '100.00' || $d == '50.00' || $d == 'Junk'){ + $ret .= ""; + $sum += ($holding['openSafeCount'][$d] + $holding['dropAmount'][$d]); + $depositAmount[$d] = $holding['openSafeCount'][$d]+$holding['dropAmount'][$d]; + } + else if ($d == '20.00'){ + $atmTtl = $holding['openSafeCount'][$d] + $holding['dropAmount'][$d] + - $holding['atm']['fill'] + $holding['atm']['reject']; + $ret .= ""; + $sum += $atmTtl; + $depositAmount[$d] = $atmTtl; + } + else if ($d == '10.00'){ + $val = $holding['changeOrder'][$d] + $holding['openSafeCount'][$d] + $holding['dropAmount'][$d] - $pars['10.00'] - (50*$bags); + $val = round($val,2); + if ($val < 0) $val = 0; + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '5.00'){ + $val = $holding['changeOrder'][$d] + $holding['openSafeCount'][$d] + $holding['dropAmount'][$d] - $pars['5.00'] - (50*$bags); + $val = round($val,2); + if ($val < 0) $val = 0; + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '1.00'){ + $ret .= ""; + $val = round($val,2); + $depositAmount[$d] = 0; + } + else if ($d == '0.25'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/10)) * 10 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '0.10'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/5)) * 5 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '0.05'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/2)) * 2 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '0.01'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/0.50)) * 0.50 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + } + $ret .= ""; + $buyAmountTotal += $sum; + $accountableTotal -= $sum; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == 'Checks' || $d == "Junk") + $ret .= ""; + else{ + $ret .= ""; + $sum += $holding['closeSafeCount'][$d]; + } + } + $ret .= ""; + $actualTotal += $sum; + + $parTTL = 0; foreach($pars as $k=>$v) $parTTL += $v; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= sprintf("",$parTTL); + + $buyAmounts = array("0.01"=>0,"0.05"=>0,"0.10"=>0,"0.25"=>0,"1.00"=>0,"5.00"=>0,"10.00"=>0); + foreach ($buyAmounts as $k=>$v){ + $val = $pars[$k]; + $val -= $holding['changeOrder'][$k]; + $val -= $holding['openSafeCount'][$k]; + $val -= $holding['dropAmount'][$k]; + $val += $depositAmount[$k]; + $val += ($fills[$k]*$bags); + if ($val < 0) $val = 0; + $buyAmounts[$k] = $val; + } + $overage = 0; + while($buyAmounts['1.00'] % 50 != 0){ + $buyAmounts['1.00'] -= 1; + $overage += 1; + } + while($buyAmounts['5.00'] % 5 == 0 && $buyAmounts['5.00'] % 50 != 0){ + $buyAmounts['5.00'] -= 5; + $overage += 5; + } + while($buyAmounts['10.00'] % 10 == 0 && $buyAmounts['10.00'] % 50 != 0){ + $buyAmounts['10.00'] -= 10; + $overage += 10; + } + + $overs = denom_overage($overage); + $buyAmounts['0.25'] += $overs['0.25']; + $buyAmounts['0.10'] += $overs['0.10']; + $buyAmounts['0.05'] += $overs['0.05']; + $buyAmounts['0.01'] += $overs['0.01']; + + $ret .= ""; + foreach ($denoms as $d){ + if (isset($buyAmounts[$d])) + $ret .= ""; + else + $ret .= ""; + } + $ret .= ""; + + $dlog = select_dlog($startDate,$endDate); + $dlog = "trans_archive.dlogBig"; + $posTotalQ = "SELECT -1*sum(d.total) FROM $dlog as d WHERE ".str_replace(" date "," d.tdate ",$dateClause)." AND d.trans_subtype IN ('CA','CK')"; + $posTotal = array_pop($sql->fetch_row($sql->query($posTotalQ))); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + + $dailies = array(); + $countQ = "SELECT YEAR(date),MONTH(date),DAY(date), + SUM(CASE WHEN tender_type IN ('CA','CK') THEN amt + WHEN tender_type = 'SCA' THEN -amt + ELSE 0 end) AS total + FROM dailyCounts WHERE date BETWEEN + '$startDate 00:00:00' AND '$endDate 23:59:59' + GROUP BY YEAR(date),MONTH(date),DAY(date)"; + $posQ = "SELECT YEAR(tdate),MONTH(tdate),DAY(tdate), + SUM(case when trans_subtype in ('CA','CK') then -total ELSE 0 END) as total + FROM $dlog AS d WHERE tdate BETWEEN + '$startDate 00:00:00' AND '$endDate 23:59:59' + GROUP BY YEAR(tdate),MONTH(tdate),DAY(tdate)"; + $countR = $sql->query($countQ); + while($row = $sql->fetch_row($countR)){ + $d = $row[0]."-".str_pad($row[1],2,'0',STR_PAD_LEFT)."-".str_pad($row[2],2,'0',STR_PAD_LEFT); + if (!isset($dailies[$d])) $dailies[$d] = array(0,0); + $dailies[$d][0] = $row[3]; + } + $posR = $sql->query($posQ); + while($row = $sql->fetch_row($posR)){ + $d = $row[0]."-".str_pad($row[1],2,'0',STR_PAD_LEFT)."-".str_pad($row[2],2,'0',STR_PAD_LEFT); + if (!isset($dailies[$d])) $dailies[$d] = array(0,0); + $dailies[$d][1] = $row[3]; + } + $num = 0; + foreach($dailies as $k=>$v){ + if ($num % 2 == 0){ + if ($num != 0) $ret .= ""; + if ($num % 4 == 0) $ret .= ""; + else $ret .= ""; + } + $ret .= sprintf(" + ",$k,$v[0],$v[1],($v[0]-$v[1])); + $num++; + } + if ($num % 2 != 0) + $ret .= ""; + $ret .= ""; + + $ret .= "
         $dTotal
        Change Order $sum
        Open Safe Count $sum
        Total change fund $val$sum
        Drop Amount".$holding['dropAmount'][$d]."".$osCounts['CK']."".round($val,2)."
        ATM Fill: Reject: 
        Fill Amount".(1*$bags)."".(2*$bags)."".(5*$bags)."".(10*$bags)." ".(50*$bags)."".(50*$bags)."".(50*$bags)." ".(168*$bags)."
        Deposit Amount".$osCounts['CK']."".($holding['openSafeCount'][$d] + $holding['dropAmount'][$d])."".$atmTtl."".$val."".$val."0".$val."".$val."".$val."".$val."$sum
        Close Safe Count $sum
        Par Amounts".$pars['0.01']."".$pars['0.05']."".$pars['0.10']."".$pars['0.25']." ".$pars['1.00']."".$pars['5.00']."".$pars['10.00']." %.2f
        Buy Amount".$buyAmounts[$d]." ".array_sum($buyAmounts)."
        Over/ShortsCount total".round(($osCounts['CA']+$osCounts['CK'] - $osCounts['SCA'] ),2)."POS total".$posTotal."Variance".round(($osCounts['CA']+$osCounts['CK']) - $osCounts['SCA'] -$posTotal,2)."Actual$actualTotalAccountable".round($accountableTotal,2)."Variance".round($actualTotal - $accountableTotal,2)." 
        %sCount%.2fPOS%.2fVariance + %.2f 
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + + return $ret; +} + +function denom_overage($overage){ + $ret = array("0.25"=>0,"0.10"=>0,"0.05"=>0,"0.01"=>0); + + $ret["0.25"] = floor($overage / 10.0)*10; + $overage = $overage % 10; + $ret["0.10"] = floor($overage / 5.0)*5; + $overage = $overage % 5; + $ret["0.05"] = floor($overage / 2.0)*2; + $overage = $overage % 2; + $ret["0.01"] = floor($overage / 0.50)*0.50; + + return $ret; +} + +?> + + + + Count + + + + + + + +
        + + + + + + + + +
        Start Date + +
        End Date
        +
        + +
        + +
        + + + diff --git a/fannie/legacy/FE/overshort/depositslips.php b/fannie/legacy/FE/overshort/depositslips.php new file mode 100644 index 000000000..ee54c7eca --- /dev/null +++ b/fannie/legacy/FE/overshort/depositslips.php @@ -0,0 +1,265 @@ +SetFont('Arial','',$fs); + $pdf->SetMargins(5,5,5); + $pdf->SetAutoPageBreak(True,5); + $pdf->AddPage(); + + $dateClause = $start; + if ($start != $end) + $dateClause = $start." ".$end; + + include('../../db.php'); + $sql->query("use $FANNIE_TRANS_DB"); + + $query = "select checks from dailyChecks where + date BETWEEN '$start' AND '$end' + order by + case when id >= 68 then id+1 + when id = 43 then 68 + else id end"; + $result = $sql->query($query); + $acc = array(); + $counts = array(); + $ckSum = 0; + $width = 30; + $i = 0; + $num = 1; + $breakon = 1; + while($row = $sql->fetch_row($result)){ + $real = $num; + if (($num-1) % 6 == 0 && $num > 0 && $num != $breakon){ + $pdf->AddPage(); + $breakon = $num; + } + if ($num > 6){ + $real = ($num%6); + if ($real == 0) $real = 6; + } + $vals = explode(",",$row[0]); + + $extra = array(); + + $vcount = 0; + foreach($vals as $v){ + if (is_numeric($v)) $vcount++; + } + + if ($vcount + count($acc) <= 57){ + foreach($vals as $v){ + if (is_numeric($v)) array_push($acc,$v); + } + $i = $i+1; + } + else { + foreach($vals as $v){ + if (is_numeric($v)) array_push($extra,$v); + } + while ($i % 4 != 0) $i++; + } + if ($i % 4 == 0){ + $str1 = "WFC #$num\n"; + $sum = 0; + $str = ""; + for($j=0;$j<57;$j++){ + if ($j < count($acc)){ + $str .= sprintf("%.2f",$acc[$j]); + $sum += $acc[$j]; + } + $str .= "\n"; + } + $str2 = "TTL: ".sprintf("%.2f",$sum); + $str3 = "CT: ".count($acc); + array_push($counts,$sum); + $ckSum += $sum; + + $j = 1; + if ($real == 1) $j = 0; + $k = 6; + if ($real == 6) $k = 2; + $pdf->SetXY(($width-0)*$j + ($width+7)*($real-1-$j),10); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str1,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFontSize($fs-1); + $pdf->MultiCell($width+($j==0?-1:$k),4.35,$str,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFont('Arial','B',$fs-1); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str2,'R','L'); + $pdf->SetFont('Arial','',$fs-1); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str3,'R','L'); + + $acc = array(); + $num++; + } + if (count($extra) > 0){ + foreach($extra as $e) array_push($acc,$e); + $i = $i+1; + } + } + $str1 = "WFC #$num\n"; + $real = $num; + if ($num % 7 == 0 && $num > 0) $pdf->AddPage(); + if ($num > 6){ + $real = ($num%6); + if ($real == 0) $real = 6; + } + + if (count($acc) > 0){ + $sum = 0; + $str = ""; + for($j=0;$j<57;$j++){ + if ($j < count($acc)){ + $str .= sprintf("%.2f",$acc[$j]); + $sum += $acc[$j]; + } + $str .= "\n"; + } + $str2 = "TTL: ".sprintf("%.2f",$sum); + $str3 = "CT: ".count($acc); + array_push($counts,$sum); + $ckSum += $sum; + + $j = 1; + if ($real == 1) $j = 0; + $k = 6; + if ($real == 6) $k = 2; + $pdf->SetXY(($width-0)*$j + ($width+7)*($real-1-$j),10); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str1,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFontSize($fs-1); + $pdf->MultiCell($width+($j==0?-1:$k),4.35,$str,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFont('Arial','B',$fs); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str2,'R','L'); + $pdf->SetFont('Arial','',$fs); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str3,'R','L'); + } + + if ($num <= 6 || $num > 10) $pdf->AddPage(); + + /* shift last box over a bit */ + $width += 3; + + $pdf->SetXY(($width+2)*4 + 5,10); + $pdf->SetFillColor(0,0,0); + $pdf->SetTextColor(255,255,255); + $pdf->SetFontSize(12); + $str = "Whole Foods Community\nCO-OP Deposit Slip\n"; + $str .= trim(file_get_contents("acct"),"\r\n")."\n\n"; + $str .= "Date\t".date("m/d/y")."\n"; + $pdf->MultiCell(55,5,$str,0,'C',1); + + $pdf->SetTextColor(0,0,0); + $str = ""; + for($i=0;$i<10 || $i < count($counts); $i++){ + $str .= "Check # ".($i+1).":"; + if ($i < count($counts)) + $str .= "\t\t$counts[$i]"; + $str .= "\n"; + } + $pdf->SetX(($width+2)*4 + 5); + $pdf->MultiCell(55,7,$str,'LR','L'); + + $dbstack = array('buyAmount'=>array(), + 'depositAmount'=>array()); + $dbQ = "SELECT rowName,denomination,amt FROM dailyDeposit WHERE + dateStr = '$dateClause' AND rowName IN ('buyAmount','depositAmount')"; + $dbR = $sql->query($dbQ); + while($dbW = $sql->fetch_row($dbR)){ + $dbstack[$dbW[0]][$dbW[1]] = $dbW[2]; + } + + $coin = 0; + if (isset($dbstack['depositAmount']['0.01'])) $coin += $dbstack['depositAmount']['0.01']; + if (isset($dbstack['depositAmount']['0.05'])) $coin += $dbstack['depositAmount']['0.05']; + if (isset($dbstack['depositAmount']['0.10'])) $coin += $dbstack['depositAmount']['0.10']; + if (isset($dbstack['depositAmount']['0.25'])) $coin += $dbstack['depositAmount']['0.25']; + $junk = 0; + if (isset($dbstack['depositAmount']['Junk'])) $junk += $dbstack['depositAmount']['Junk']; + $cash = 0; + if (isset($dbstack['depositAmount']['1.00'])) $cash += $dbstack['depositAmount']['1.00']; + if (isset($dbstack['depositAmount']['5.00'])) $cash += $dbstack['depositAmount']['5.00']; + if (isset($dbstack['depositAmount']['10.00'])) $cash += $dbstack['depositAmount']['10.00']; + if (isset($dbstack['depositAmount']['20.00'])) $cash += $dbstack['depositAmount']['20.00']; + if (isset($dbstack['depositAmount']['50.00'])) $cash += $dbstack['depositAmount']['50.00']; + if (isset($dbstack['depositAmount']['100.00'])) $cash += $dbstack['depositAmount']['100.00']; + + + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Checks','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$ckSum),'TBR',1); + //$pdf->Cell(40,7,"",'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Coin','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$coin),'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Cash','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$cash),'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Other','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$junk),'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Total','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$junk+$cash+$coin+$ckSum),'TBR',1); + + $pdf->SetTextColor(255,255,255); + $pdf->SetX(($width+2)*4+5); + $pdf->MultiCell(55,5,"Change Request",0,'C',1); + + $pdf->SetTextColor(0,0,0); + $denoms = array('0.01','0.05','0.10','0.25','1.00','5.00','10.00'); + $total = array_sum($dbstack['buyAmount']); + if (!empty($dbstack['buyAmount'])){ + if ($dbstack['buyAmount']['0.01'] > 50) + $total = $dbstack['buyAmount']['0.01']; + foreach($denoms as $d){ + $pdf->SetX(($width+2)*4+5); + $pdf->Cell(10,7,'$','L',0,'L'); + $pdf->Cell(10,7,"$d",0,0,'R'); + $pdf->Cell(35,7,$dbstack['buyAmount'][$d],'RB',1,'C'); + } + } + $pdf->SetX(($width+2)*4+5); + $pdf->Cell(20,7,"Total:",'LB',0,'R'); + $pdf->Cell(35,7,sprintf('%.2f',$total),'RB',1,'C'); + + $pdf->Output('deposit.pdf','I'); +} +else { +?> + + + + Print deposit slips + + + + +
        + + + +
        Start
        End
        + +
        + + + + diff --git a/fannie/legacy/FE/overshort/index.php b/fannie/legacy/FE/overshort/index.php new file mode 100644 index 000000000..364e533ca --- /dev/null +++ b/fannie/legacy/FE/overshort/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/legacy/FE/overshort/journal.js b/fannie/legacy/FE/overshort/journal.js new file mode 100644 index 000000000..eb027bc09 --- /dev/null +++ b/fannie/legacy/FE/overshort/journal.js @@ -0,0 +1,128 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); +var busy = 0; + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + if (busy == 0){ + busy = 1; + http.open('get', 'journal.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); + } + else + setTimeout("phpSend('"+action+"')",50); +} + +/* ajax callback function +by convention, results return [actionname]`[data] +splitting on backtick separates, then switch on action name +allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + busy = 0; + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'repull': + document.getElementById('display').innerHTML += "
        Done clearing. Reloading from POS (this'll take a minute)"; + phpSend('dateinput&startDate='+array[1]+'&endDate='+array[2]); + break; + case 'dateinput': + case 'dateinput2': + document.getElementById('display').innerHTML = array[1]; + break; + case 'save2': + case 'save3': + case 'save4': + case 'saveMisc': + break; + default: + alert(response); + } + } +} + +function loader(){ + var d1 = document.getElementById('startDate').value; + var d2 = document.getElementById('endDate').value; + phpSend('dateinput&startDate='+d1+'&endDate='+d2); +} + +function loader2(){ + var val = document.getElementById('selectDate').value; + phpSend('dateinput2&dateStr='+val); +} + +function repull(d1,d2){ + document.getElementById('display').innerHTML = 'Clearing current data'; + phpSend('repull&startDate='+d1+'&endDate='+d2); +} + +function save2(newval,key1,key2){ + var datestr = document.getElementById('datestr').value; + phpSend('save2&datestr='+datestr+'&val='+newval+'&key1='+key1+'&key2='+key2); +} + +function save3(newval,key1,key2,key3){ + if (key2=='AX') { + var oldcc = document.getElementById('tender'+key3+'CC').value; + document.getElementById('tender'+key3+'CC').value = oldcc-newval; + save3(oldcc-newval,'tenders','CC',key3); + var fees = newval * 0.0315; + fees = Math.round(fees*100)/100; + document.getElementById('axfees'+key3).value = fees; + saveMisc(fees,'axfees',key3,'sales'); + newval = newval-fees; + document.getElementById('tender'+key3+'AX').value = newval; + } + var datestr = document.getElementById('datestr').value; + phpSend('save3&datestr='+datestr+'&val='+newval+'&key1='+key1+'&key2='+key2+'&key3='+key3); +} + +function save4(newval,key1,key2,key3,key4){ + var datestr = document.getElementById('datestr').value; + phpSend('save4&datestr='+datestr+'&val='+newval+'&key1='+key1+'&key2='+key2+'&key3='+key3+'&key4='+key4); +} + +function saveMisc(newval,misckey,timestamp,savetype){ + var datestr = document.getElementById('datestr').value; + phpSend('saveMisc&datestr='+datestr+'&val='+newval+'&misc='+misckey+'&ts='+timestamp+'&type='+savetype); +} + +// rebalance( timestamp ) +function rb(ts){ + var os = 0; + + var debits = document.getElementsByName('debit'+ts); + for(var i=0;iquery('use is4c_trans'); + +$pCodes_lookup = array( + 41201 => "DELI PREPARED FOODS", + 41205 => "DELI CHEESE", + 41300 => "PRODUCE", + 41305 => "SEEDS", + 41310 => "TRANSPLANTS", + 41315 => "GEN MERC/FLOWERS", + 41400 => "GROCERY", + 41405 => "GROCERY CLEANING, PAPER", + 41407 => "GROCERY BULK WATER", + 41410 => "BULK A", + 41415 => "BULK B", + 41420 => "COOL", + 41425 => "COOL BUTTER", + 41430 => "COOL MILK", + 41435 => "COOL FROZEN", + 41500 => "HABA BULK/SPICES & HERBS", + 41505 => "HABA BULK/PKG COFFEE", + 41510 => "HABA BODY CARE", + 41515 => "HABA VIT/MN/HRB/HOMEOPA", + 41520 => "GEN MERC/BOOKS", + 41600 => "GROCERY BAKERY FROM VEN", + 41605 => "GEN MERC/HOUSEWARES", + 41610 => "MARKETING", + 41640 => "GEN MERC/CARDS", + 41645 => "GEN MERC/MAGAZINES", + 41700 => "MEAT/POULTRY/SEAFOOD FR", + 41705 => "MEAT/POULTRY/SEAFOOD FZ", + 42225 => "Class" +); + +$tender_pcode_lookup = array( + 'CA' => 10110, + 'CC' => 10120, + 'AX' => 10120, + 'RR' => 63380, + 'CP' => 10740, + 'GD' => 21205, + 'TC' => 21200, + 'SC' => 21200, + 'MI' => 10710, + 'IC' => 67710, + 'MA' => 66600, + 'RR' => 63380, + 'EF' => 10120, + 'PP' => 10120 +); + +$double_lookup = array( + 600 => array('Supplies',64410), + 604 => array('Misc PO',''), + 900 => array('Gift Cert sold',''), + 990 => array('AR Payments',10710), + 991 => array('Class B Equity',31110), + 992 => array('Class A Equity',31100), + 700 => array('Totes',63320), + 701 => array('Donations','31130'), + 703 => array('Old Misc.',42230), + 902 => array('Gift Card Sales',21205), + 800 => array('IT Corrections',''), + 708 => array('Class',63350), + 610 => array('RRR Department',''), + 881 => array('Misc Inc #1',42231), + 882 => array('Misc Inc #2',42232) +); + +if (isset($_GET["action"])){ + $out = $_GET["action"]."`"; + + switch($_GET["action"]){ + case 'repull': + $datestr = $_GET['startDate']." ".$_GET['endDate']; + $sql->query_all("DELETE FROM dailyDebitCredit WHERE dateStr='$datestr'"); + $out .= $_GET['startDate']."`".$_GET['endDate']; + break; + case 'dateinput': + $startDate = $_GET["startDate"]; + $endDate = $_GET["endDate"]; + $out .= sprintf("Save to Excel", + $startDate." ".$endDate); + $out .= " | "; + $out .= "Reload from POS"; + $out .= display($startDate,$endDate); + break; + case 'dateinput2': + $dateStr = $_GET['dateStr']; + $temp = explode(" ",$dateStr); + $startDate = $temp[0]; + $endDate = $startDate; + if (count($temp) > 1) + $endDate = $temp[1]; + $out .= sprintf("Save to Excel", + $startDate." ".$endDate); + $out .= " | "; + $out .= "Reload from POS"; + $out .= display($startDate,$endDate); + break; + case 'save2': + $datestr = $_GET['datestr']; + $val = $_GET['val']; + $k1 = $_GET['key1']; + $k2 = $_GET['key2']; + + $dataR = $sql->query("SELECT phpData FROM dailyDebitCredit WHERE dateStr='$datestr'"); + $data = unserialize(array_pop($sql->fetch_row($dataR))); + + $data[$k1][$k2] = $val; + $sql->query_all(sprintf("UPDATE dailyDebitCredit SET phpData='%s' WHERE dateStr='%s'", + serialize($data),$datestr)); + break; + case 'save3': + $datestr = $_GET['datestr']; + $val = $_GET['val']; + $k1 = $_GET['key1']; + $k2 = $_GET['key2']; + $k3 = $_GET['key3']; + + $dataR = $sql->query("SELECT phpData FROM dailyDebitCredit WHERE dateStr='$datestr'"); + $data = unserialize(array_pop($sql->fetch_row($dataR))); + + $data[$k1][$k2][$k3] = $val; + $sql->query_all(sprintf("UPDATE dailyDebitCredit SET phpData='%s' WHERE dateStr='%s'", + serialize($data),$datestr)); + break; + case 'save4': + $datestr = $_GET['datestr']; + $val = $_GET['val']; + $k1 = $_GET['key1']; + $k2 = $_GET['key2']; + $k3 = $_GET['key3']; + $k4 = $_GET['key4']; + + $dataR = $sql->query("SELECT phpData FROM dailyDebitCredit WHERE dateStr='$datestr'"); + $data = unserialize(array_pop($sql->fetch_row($dataR))); + + $data[$k1][$k2][$k3][$k4] = $val; + $sql->query_all(sprintf("UPDATE dailyDebitCredit SET phpData='%s' WHERE dateStr='%s'", + serialize($data),$datestr)); + break; + case 'saveMisc': + $datestr = $_GET['datestr']; + $val = $_GET['val']; + $misc = $_GET['misc']; + $ts = $_GET['ts']; + $type = $_GET['type']; + + $dataR = $sql->query("SELECT phpData FROM dailyDebitCredit WHERE dateStr='$datestr'"); + $data = unserialize(array_pop($sql->fetch_row($dataR))); + + if ($type == 'sales') + $data['other'][$misc][1][$ts] = $val; + elseif ($type == 'pcode') + $data['other'][$misc][0] = $val; + + $sql->query_all(sprintf("UPDATE dailyDebitCredit SET phpData='%s' WHERE dateStr='%s'", + serialize($data),$datestr)); + break; + } + + echo $out; + return; +} +elseif (isset($_GET['excel'])){ + $dates = explode(" ",$_GET["datestr"]); + + header('Content-Type: application/ms-excel'); + header("Content-Disposition: attachment; filename=\"journal $dates[0] to $dates[1].xls\""); + + echo display($dates[0],$dates[1],True); + return; +} + +function display($date1,$date2,$excel=False){ + global $sql,$pCodes_lookup,$tender_pcode_lookup,$double_lookup; + + $classes = array("one","two"); + $c = 0; + + $data = array(); + $dataR = $sql->query("SELECT phpData FROM dailyDebitCredit WHERE dateStr='$date1 $date2'"); + if ($sql->num_rows($dataR) == 0){ + $data = fetch_data($date1,$date2); + $saveQ = sprintf("INSERT INTO dailyDebitCredit (dateStr, phpData) VALUES ('%s','%s')", + "$date1 $date2",serialize($data)); + $saveR = $sql->query_all($saveQ); + } + else { + $data = unserialize(array_pop($sql->fetch_row($dataR))); + } + + $ret = ""; + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + + if (!$excel) + $ret .= ""; + + $temp = explode("-",$date1); + $startTS = mktime(0,0,0,$temp[1],$temp[2],$temp[0]); + $sY = (int)$temp[0]; $sM = (int)$temp[1]; (int)$sD = $temp[2]; + $temp = explode("-",$date2); + $endTS = mktime(0,0,0,$temp[1],$temp[2],$temp[0]); + + $num_days = round( ($endTS - $startTS) / (60*60*24) ) + 1; + + $stamps = ""; + $overshorts = array(); + for($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $stamps .= $ts.":"; + $overshorts[$ts] = 0; + } + $stamps = substr($stamps,strlen($stamps)-1); + $ret .= ""; + + for($i=0;$i<$num_days;$i++){ + $ret .= "",date("m/d/y",mktime(0,0,0,$sM,$sD+$i,$sY))); + } + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for($i=0;$i<$num_days;$i++){ + $ret .= ""; + } + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days-1;$i++) + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days-1;$i++) + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days-1;$i++) + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + foreach($data['tenders'] as $k=>$v){ + if ($k == "SCA" || $k == "") continue; + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + if ($i==$num_days-1 && $k == "CA"){ + $v[$ts] = 0; + $v[$ts] = array_sum($v)*-1; + } + $ret .= ""; + } + $ret .= ""; + } + + foreach($data['sales'] as $k=>$v){ + $ret .= ""; $c = ($c+1)%2; + if ($k > 40000){ + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + for($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + } + $ret .= ""; + } + + foreach($data['other']['discount'] as $k=>$v){ + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + if ($k == "Member") + $ret .= ""; + else + $ret .= ""; + for($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + $ret .= ""; + } + $ret .= ""; + } + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + } + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for ($i=0;$i<$num_days-1;$i++) + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; $c = ($c+1)%2; + $ret .= ""; + for($i=0;$i<$num_days;$i++){ + $ts = mktime(0,0,0,$sM,$sD+$i,$sY); + $overshorts[$ts] = round($overshorts[$ts],2); + $ret .= ""; + } + $ret .= ""; + + + $ret .= "
        Sales Entries
        $date1 through $date2
        Type: General
        "; + $ret .= sprintf("Date: %s
        DescriptionAccountDebitCredit
        Cash deposit10120  "; + if (!$excel){ + $ret .= ""; + } + else + $ret .= (isset($data['other']['depositAmount'])?$data['other']['depositAmount']:''); + $overshorts[$endTS] += isset($data['other']['depositAmount'])?$data['other']['depositAmount']:0; + + $ret .= " 
        Check deposit10120  "; + if (!$excel){ + $ret .= ""; + } + else + $ret .= (isset($data['other']['depositChecks'])?$data['other']['depositChecks']:''); + $overshorts[$endTS] += isset($data['other']['depositChecks'])?$data['other']['depositChecks']:0; + + $ret .= " 
        ATM Cash10112  "; + if (!$excel){ + $ret .= ""; + } + else + $ret .= (isset($data['other']['atmNet'])?$data['other']['atmNet']:''); + + $ret .= " 
        "; + $ret .= $v['name']; + $ret .= ""; + $ret .= $tender_pcode_lookup[$k]; + $ret .= ""; + if (!isset($v[$ts])) $v[$ts] = 0; + $v[$ts] = round($v[$ts],2); + if ($v[$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $v[$ts]; + $overshorts[$ts] += $v[$ts]; + } + else + $ret .= " "; + $ret .= ""; + if ($v[$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$v[$ts]; + $overshorts[$ts] -= -1*$v[$ts]; + } + else + $ret .= " "; + $ret .= "
        "; + $ret .= isset($pCodes_lookup[$k])?$pCodes_lookup[$k]:''; + $ret .= "$k"; + $ret .= $double_lookup[$k][0]; + $ret .= ""; + $ret .= $double_lookup[$k][1]; + $ret .= ""; + if (isset($v[$ts]) && $v[$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= sprintf("%.2f",-1*$v[$ts]); + $overshorts[$ts] += -1*$v[$ts]; + } + else + $ret .= " "; + $ret .= ""; + if (isset($v[$ts]) && $v[$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= sprintf("%.2f",$v[$ts]); + $overshorts[$ts] -= $v[$ts]; + } + else + $ret .= " "; + $ret .= "
        ".$k."6660061170"; + if (isset($v[$ts]) && $v[$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $v[$ts]; + $overshorts[$ts] += $v[$ts]; + } + else + $ret .= " "; + $ret .= ""; + if (isset($v[$ts]) && $v[$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$v[$ts]; + $overshorts[$ts] -= -1*$v[$ts]; + } + else + $ret .= " "; + $ret .= "
        Sales Tax Collected21180"; + if (isset($data['other']['tax'][$ts]) && $data['other']['tax'][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['tax'][$ts]; + $overshorts[$ts] += -1*$data['other']['tax'][$ts]; + } + else + $ret .= " "; + $ret .= ""; + if (isset($data['other']['tax'][$ts]) && $data['other']['tax'][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['tax'][$ts]; + $overshorts[$ts] -= $data['other']['tax'][$ts]; + } + else + $ret .= " "; + $ret .= "
        Gazette Ads10730"; + $ret .= ""; + if (isset($data['other']['gazette'][$ts]) && $data['other']['gazette'][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['gazette'][$ts]; + $overshorts[$ts] += (-1*$data['other']['gazette'][$ts]); + } + else + $ret .= " "; + if (isset($data['other']['gazette'][$ts]) && $data['other']['gazette'][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['gazette'][$ts]; + $overshorts[$ts] -= $data['other']['gazette'][$ts]; + } + else + $ret .= " "; + + } + $ret .= "
        Found Money63350"; + $ret .= ""; + if (isset($data['other']['foundmoney'][$ts]) && $data['other']['foundmoney'][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['foundmoney'][$ts]; + $overshorts[$ts] += (-1*$data['other']['foundmoney'][$ts]); + } + else + $ret .= " "; + if (isset($data['other']['foundmoney'][$ts]) && $data['other']['foundmoney'][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['foundmoney'][$ts]; + $overshorts[$ts] -= $data['other']['foundmoney'][$ts]; + } + else + $ret .= " "; + + } + $ret .= "
        Old Misc"; + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['misc0'][0]; + $ret .= ""; + if (isset($data['other']['misc0'][1][$ts]) && $data['other']['misc0'][1][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['misc0'][1][$ts]; + $overshorts[$ts] += (-1*$data['other']['misc0'][1][$ts]); + } + else + $ret .= " "; + $ret .= ""; + if (isset($data['other']['misc0'][1][$ts]) && $data['other']['misc0'][1][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['misc0'][1][$ts]; + $overshorts[$ts] -= $data['other']['misc0'][1][$ts]; + } + else + $ret .= " "; + } + $ret .= "
        Misc #1"; + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['misc1'][0]; + $ret .= ""; + if (isset($data['other']['misc1'][1][$ts]) && $data['other']['misc1'][1][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['misc1'][1][$ts]; + $overshorts[$ts] += (-1*$data['other']['misc1'][1][$ts]); + } + else + $ret .= " "; + $ret .= ""; + if (isset($data['other']['misc1'][1][$ts]) && $data['other']['misc1'][1][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['misc1'][1][$ts]; + $overshorts[$ts] -= $data['other']['misc1'][1][$ts]; + } + else + $ret .= " "; + } + $ret .= "
        Misc #2"; + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['misc2'][0]; + $ret .= ""; + if (isset($data['other']['misc2'][1][$ts]) && $data['other']['misc2'][1][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['misc2'][1][$ts]; + $overshorts[$ts] += (-1*$data['other']['misc2'][1][$ts]); + } + else + $ret .= " "; + $ret .= ""; + if (isset($data['other']['misc2'][1][$ts]) && $data['other']['misc2'][1][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['misc2'][1][$ts]; + $overshorts[$ts] -= $data['other']['misc2'][1][$ts]; + } + else + $ret .= " "; + + } + $ret .= "
        AMEX Fees"; + $ret .= $data['other']['axfees'][0]; + $ret .= ""; + if (isset($data['other']['axfees'][1][$ts]) && $data['other']['axfees'][1][$ts] >= 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= -1*$data['other']['axfees'][1][$ts]; + $overshorts[$ts] += (-1*$data['other']['axfees'][1][$ts]); + } + else + $ret .= " "; + $ret .= ""; + if (isset($data['other']['axfees'][1][$ts]) && $data['other']['axfees'][1][$ts] < 0){ + if (!$excel){ + $ret .= ""; + } + else + $ret .= $data['other']['axfees'][1][$ts]; + $overshorts[$ts] -= $data['other']['axfees'][1][$ts]; + } + else + $ret .= " "; + + } + $ret .= "
        Change Buy10120   "; + if (!$excel){ + $ret .= ""; + } + else + $ret .= (isset($data['other']['buyAmount'])?$data['other']['buyAmount']:''); + $overshorts[$endTS] -= isset($data['other']['buyAmount'])?$data['other']['buyAmount']:0; + $ret .= "
        Over/Short63350"; + if ($overshorts[$ts] < 0){ + $ret .= -1*$overshorts[$ts]; + } + else + $ret .= " "; + $ret .= ""; + if ($overshorts[$ts] >= 0){ + $ret .= $overshorts[$ts]; + } + else + $ret .= " "; + $ret .= "
        "; + return $ret; +} + +function fetch_data($date1,$date2){ + global $sql,$pCodes_lookup; + + $data = array( + 'tenders'=>array(), + 'sales'=>array(), + 'other'=>array() + ); + $ret = ""; + $dlog = select_dlog($date1,$date2); + $dlog = "trans_archive.dlogBig"; + + $pageOneQ = "select rowName,sum(amt) from dailyDeposit + WHERE dateStr = '$date1 $date2' and + rowName in ('depositAmount','buyAmount') + group by rowName"; + $pageOneR = $sql->query($pageOneQ); + while($pageOneW = $sql->fetch_row($pageOneR)){ + $data['other'][$pageOneW[0]] = $pageOneW[1]; + } + + $data['other']['depositChecks'] = 0; + $data['other']['atmNet'] = 0; + $pageOneQ2 = "select denomination,amt FROM dailyDeposit + WHERE dateStr = '$date1 $date2' and + rowName in ('depositAmount','atm') + and denomination in ('Checks','fill','reject')"; + $pageOneR2 = $sql->query($pageOneQ2); + while($w = $sql->fetch_row($pageOneR2)){ + switch(strtolower($w['denomination'])){ + case 'checks': + $data['other']['depositChecks'] += $w['amt']; + $data['other']['depositAmount'] -= $w['amt']; + break; + case 'fill': + $data['other']['atmNet'] += $w['amt']; + break; + case 'reject': + $data['other']['atmNet'] -= $w['amt']; + break; + } + } + + $tenderQ = "select sum(amt), + tender_type,tendername, + YEAR(date),MONTH(date),DAY(date) + FROM dailyCounts as d left join is4c_op.tenders as t + on d.tender_type = t.tenderCode + WHERE date between '$date1 00:00:00' AND + '$date2 23:59:59' + group by + YEAR(date),MONTH(date),DAY(date), + tender_type,tendername order by tendername"; + $tenderR = $sql->query($tenderQ); + while ($tenderW = $sql->fetch_row($tenderR)){ + $y = $tenderW[3]; + $m = $tenderW[4]; + $d = $tenderW[5]; + $timestamp = mktime(0,0,0,$m,$d,$y); + + $code = $tenderW[1]; + $name = $tenderW[2]; + if ($code == "SCA"){ + $code = "CA"; + $tenderW[0] *= -1; + } + if ($code == "CK") $code = "CA"; + if ($code == "CA") $name = "Coin, Cash, and Checks"; + if ($code == "EC") $code = "EF"; + if ($code == "CC") { + $name = "Electronic Deposit (CC)"; + } + if ($code == "EF"){ + $name = "Electronic Deposit (EBT)"; + $data['tenders']['AX']['name'] = 'Electronic Deposit (AMEX)'; + } + + if (!isset($data['tenders'][$code])) + $data['tenders'][$code] = array(); + + if (!isset($data['tenders'][$code][$timestamp])) + $data['tenders'][$code][$timestamp] = 0; + + $data['tenders'][$code]['name'] = $name; + $data['tenders'][$code][$timestamp] += $tenderW[0]; + //$data['tenders']['AX'][$timestamp] = 0; + } + + $extraTenderQ = "select YEAR(tdate),MONTH(tdate),DAY(tdate), + trans_subtype,sum(total)*-1 FROM $dlog as d + WHERE tdate between '$date1 00:00:00' AND + '$date2 23:59:59' and trans_subtype in ('MA','RR','PP') + group by + YEAR(tdate),MONTH(tdate),DAY(tdate), + trans_subtype"; + $extraTenderR = $sql->query($extraTenderQ); + while($extraTenderW = $sql->fetch_row($extraTenderR)){ + $y = $extraTenderW[0]; + $m = $extraTenderW[1]; + $d = $extraTenderW[2]; + $timestamp = mktime(0,0,0,$m,$d,$y); + $code = $extraTenderW[3]; + + if (!isset($data['tenders'][$code])) + $data['tenders'][$code] = array(); + + if (!isset($data['tenders'][$code][$timestamp])) + $data['tenders'][$code][$timestamp] = 0; + + $name = "RRR Coupons"; + if ($code == "MA") $name = "Mad Coupons"; + if ($code == "PP") $name = "Pay Pal"; + + $data['tenders'][$code]['name'] = $name; + $data['tenders'][$code][$timestamp] += $extraTenderW[4]; + } + + // always include these + $data['other']['misc0'] = array('',array()); + $data['other']['misc1'] = array('',array()); + $data['other']['misc2'] = array('',array()); + $data['other']['axfees'] = array('63340',array()); + + $salesQ = "select YEAR(tdate),MONTH(tdate),DAY(tdate), + CASE WHEN department = 991 then '991' when department=992 then '992' else convert(s.salesCode,char) end as pcode, + sum(total),trans_type + FROM $dlog as d left join is4c_op.departments as t on + d.department = t.dept_no LEFT JOIN + is4c_op.deptSalesCodes AS s ON t.dept_no=s.dept_ID + WHERE tdate BETWEEN '$date1 00:00:00' AND + '$date2 23:59:59' + AND trans_subtype NOT IN ('CP','IC') + and trans_type not in ('S','T') + AND (register_no <> 20 or department=703) + GROUP BY + YEAR(tdate),MONTH(tdate),DAY(tdate), + trans_type, + CASE WHEN department = 991 then '991' when department=992 then '992' else convert(s.SalesCode,char) end + ORDER BY + CASE WHEN department = 991 then '991' when department=992 then '992' else convert(s.SalesCode,char) end"; + $salesR = $sql->query($salesQ); + $preTS = 0; + while($salesW = $sql->fetch_row($salesR)){ + $y = $salesW[0]; + $m = $salesW[1]; + $d = $salesW[2]; + $timestamp = mktime(0,0,0,$m,$d,$y); + + /* fill in zeroes for all pcodes */ + if ($timestamp != $preTS){ + foreach($pCodes_lookup as $k=>$v){ + if (!isset($data['sales'][$k])) + $data['sales'][$k] = array(); + if (!isset($data['sales'][$k][$timestamp])) + $data['sales'][$k][$timestamp] = 0; + } + $preTS = $timestamp; + } + + if (!isset($data['other']['axfees'][1][$timestamp])) + $data['other']['axfees'][1][$timestamp] = 0; + $pcode = $salesW[3]; + if ($pcode == "422311"){ + if (!isset($data['other']['misc1'][1][$timestamp])) + $data['other']['misc1'][1][$timestamp] = 0; + $data['other']['misc1'][1][$timestamp] += $salesW[4]; + } + elseif ($pcode == "42232"){ + if (!isset($data['other']['misc2'][1][$timestamp])) + $data['other']['misc2'][1][$timestamp] = 0; + $data['other']['misc2'][1][$timestamp] += $salesW[4]; + } + elseif ($pcode == "703"){ + if (!isset($data['other']['misc0'][1][$timestamp])) + $data['other']['misc0'][1][$timestamp] = 0; + $data['other']['misc0'][1][$timestamp] += $salesW[4]; + } + elseif ($pcode != 0){ + if (!isset($data['sales'][$pcode])) + $data['sales'][$pcode] = array(); + if (!isset($data['sales'][$pcode][$timestamp])) + $data['sales'][$pcode][$timestamp] = 0; + $data['sales'][$pcode][$timestamp] += $salesW[4]; + } + elseif ($salesW[5] == "A"){ + if (!isset($data['other']['tax'])) + $data['other']['tax'] = array(); + $data['other']['tax'][$timestamp] = $salesW[4]; + } + $data['other']['gazette'][$timestamp] = 0; + $data['other']['foundmoney'][$timestamp] = 0; + } + + $discountQ = "select YEAR(tdate),MONTH(tdate),DAY(tdate), + memDesc,-sum(total) + from $dlog as d left join is4c_op.memTypeID as m on d.memtype=m.memtypeID + where upc='DISCOUNT' and tdate between '$date1 00:00:00' and '$date2 23:59:59' + group by YEAR(tdate),MONTH(tdate),DAY(tdate), + memDesc"; + $discountR = $sql->query($discountQ); + $data['other']['discount'] = array(); + while($discountW = $sql->fetch_row($discountR)){ + $y = $discountW[0]; + $m = $discountW[1]; + $d = $discountW[2]; + $ts = mktime(0,0,0,$m,$d,$y); + + $type = $discountW[3]; + if ($type == 'Non Member') $type = 'Staff Member'; + if (!isset($data['other']['discount'][$type])) + $data['other']['discount'][$type] = array(); + if (!isset($data['other']['discount'][$type][$ts])) + $data['other']['discount'][$type][$ts] = 0; + $data['other']['discount'][$type][$ts] += $discountW[4]; + } + + return $data; +} + +?> + + + + Journal + + + + + + + +
        + + + + + + + + +
        Start Date
        End Date
        + +
        +
        +Or choose from calculated deposits
        + + +
        +
        + +
        + +
        + + + diff --git a/fannie/legacy/FE/overshort/menu.php b/fannie/legacy/FE/overshort/menu.php new file mode 100644 index 000000000..6dc56e251 --- /dev/null +++ b/fannie/legacy/FE/overshort/menu.php @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Old overshort page
        + Link
        The previous over short page. This still works.
        Deposit/Safe Count
        + Link
        Counts for change order, safe, and deposit (page #1)
        New overshort page
        + Link
        Per-cashier overshort, including check listing (page #2)
        Deposit slips
        + Link
        Generate deposit slips (page #3)
        Journal Entry
        + Link
        Get credits/debits by sales code (page #4)
        + + + + diff --git a/fannie/legacy/FE/overshortSingleEmp.php b/fannie/legacy/FE/overshortSingleEmp.php new file mode 100755 index 000000000..2080e2d4c --- /dev/null +++ b/fannie/legacy/FE/overshortSingleEmp.php @@ -0,0 +1,404 @@ +query($query); +$row = $sql->fetch_array($result); + +$output = "

        $date

        "; +$output .= "
        "; +$output .= ""; +$output .= ""; + +$sql->query("USE is4c_trans"); + +$q = "SELECT -1*sum(total) AS total,emp_no,trans_subtype FROM $dlog +WHERE ".$sql->date_equals('tdate',$date)." +GROUP BY emp_no,trans_subtype"; +$r = $sql->query($q); +$posttl = array(); +while($w = $sql->fetch_row($r)){ + if (!isset($posttl[$w['emp_no']])) $posttl[$w['emp_no']] = array(); + $posttl[$w['emp_no']][$w['trans_subtype']] = $w['total']; +} + +$perCashierTotal = 0; +$perCashierCountTotal = 0; +$perCashierOSTotal = 0; + +/* +$caQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CA'"; +$caR = $sql->query($caQ); +$caW = $sql->fetch_array($caR); +*/ +$caW = array((isset($posttl[$row[1]]['CA'])) ? $posttl[$row[1]]['CA'] : 0); +if (empty($caW[0])) + $caW[0] = 0; +$perCashierTotal += $caW[0]; + +/* +$ckQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CK'"; +$ckR = $sql->query($ckQ); +$ckW = $sql->fetch_array($ckR); +*/ +$ckW = array((isset($posttl[$row[1]]['CK'])) ? $posttl[$row[1]]['CK'] : 0); +if (empty($ckW[0])) + $ckW[0] = 0; +$perCashierTotal += $ckW[0]; + +/* +$ccQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CC'"; +$ccR = $sql->query($ccQ); +$ccW = $sql->fetch_array($ccR); +*/ +$ccW = array((isset($posttl[$row[1]]['CC'])) ? $posttl[$row[1]]['CC'] : 0); +if (empty($ccW[0])) + $ccW[0] = 0; +$perCashierTotal += $ccW[0]; + +/* +$miQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'MI'"; +$miR = $sql->query($miQ); +$miW = $sql->fetch_array($miR); +*/ +$miW = array((isset($posttl[$row[1]]['MI'])) ? $posttl[$row[1]]['MI'] : 0); +if (empty($miW[0])) + $miW[0] = 0; +$perCashierTotal += $miW[0]; + +/* +$tcQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'TC'"; +$tcR = $sql->query($tcQ); +$tcW = $sql->fetch_array($tcR); +*/ +$tcW = array((isset($posttl[$row[1]]['TC'])) ? $posttl[$row[1]]['TC'] : 0); +if (empty($tcW[0])) + $tcW[0] = 0; +$perCashierTotal += $tcW[0]; + +/* +$gdQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'GD'"; +$gdR = $sql->query($gdQ); +$gdW = $sql->fetch_array($gdR); +*/ +$gdW = array((isset($posttl[$row[1]]['GD'])) ? $posttl[$row[1]]['GD'] : 0); +if (empty($gdW[0])) + $gdW[0] = 0; +$perCashierTotal += $gdW[0]; + +/* +$efQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'EF'"; +$efR = $sql->query($efQ); +$efW = $sql->fetch_array($efR); +*/ +$efW = array((isset($posttl[$row[1]]['EF'])) ? $posttl[$row[1]]['EF'] : 0); +if (empty($efW[0])) + $efW[0] = 0; +$perCashierTotal += $efW[0]; + +/* +$ecQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'EC'"; +$ecR = $sql->query($ecQ); +$ecW = $sql->fetch_array($ecR); +*/ +$ecW = array((isset($posttl[$row[1]]['EC'])) ? $posttl[$row[1]]['EC'] : 0); +if (empty($ecW[0])) + $ecW[0] = 0; +$perCashierTotal += $ecW[0]; + +/* +$cpQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'CP'"; +$cpR = $sql->query($cpQ); +$cpW = $sql->fetch_array($cpR); +*/ +$cpW = array((isset($posttl[$row[1]]['CP'])) ? $posttl[$row[1]]['CP'] : 0); +if (empty($cpW[0])) + $cpW[0] = 0; +$perCashierTotal += $cpW[0]; + + +/* +$icQ = "select -1*sum(total) from $dlog where emp_no = $row[1] + and datediff(dd,tdate,'$date') = 0 and trans_subtype = 'IC'"; +$icR = $sql->query($icQ); +$icW = $sql->fetch_array($icR); +*/ +$icW = array((isset($posttl[$row[1]]['IC'])) ? $posttl[$row[1]]['IC'] : 0); +$icTotal = $icW[0]; +if (empty($icW[0])) +$icW[0] = 0; +$perCashierTotal += $icW[0]; + +$noteQ = "select note from dailyNotes where emp_no=$row[1] and date='$date'"; +$noteR = $sql->query($noteQ); +$noteW = $sql->fetch_array($noteR); +$note = $noteW[0]; + +$output .= ""; + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='SCA'"; +$fetchR = $sql->query($fetchQ); +$startcash = 0; +if ($sql->num_rows($fetchR) == 0) + $output .= ""; +else { + $startcash = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $perCashierCountTotal -= $startcash; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CA'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $cash = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($cash - $caW[0] - $startcash,2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $cash; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CK'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $check = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($check - $ckW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $check; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CC'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $credit = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($credit - $ccW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $credit; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='MI'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $mi = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($mi - $miW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $mi; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='EF'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $ef = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($ef - $efW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $ef; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='EC'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $ec = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($ec - $ecW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $ec; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='GD'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $gd = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($gd - $gdW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $gd; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='TC'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $tc = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($tc - $tcW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $tc; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='CP'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $cp = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = round($cp - $cpW[0],2); + $output .= ""; + $output .= ""; + + $perCashierCountTotal += $cp; + $perCashierOSTotal += $os; +} + +$output .= ""; +$fetchQ = "select amt from dailyCounts where date='$date' and emp_no=$row[1] and tender_type='IC'"; +$fetchR = $sql->query($fetchQ); +if ($sql->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; +} +else { + $ic = array_pop($sql->fetch_array($fetchR)); + $output .= ""; + $os = $ic - $icW[0]; + $output .= ""; + $output .= ""; + + $countICTotal = $ic; + $osICTotal = $os; + + $perCashierCountTotal += $ic; + $perCashierOSTotal += $os; +} + + +$perCashierTotal = round($perCashierTotal,2); +$perCashierCountTotal = round($perCashierCountTotal,2); +$perCashierOSTotal = round($perCashierOSTotal,2); + +$output .= ""; +$output .= ""; +$output .= ""; +$output .= ""; +$output .= ""; + +?> + +Overshorts + + + + +
        + +
        + + diff --git a/fannie/legacy/IT/UNFI/README b/fannie/legacy/IT/UNFI/README new file mode 100644 index 000000000..d1595cd5a --- /dev/null +++ b/fannie/legacy/IT/UNFI/README @@ -0,0 +1,62 @@ +A lot of this isn't my code, you're going to have to poke around a bit +yourself for details. + +price_compare.php (price_compare.js has some AJAX calls): +This lists the products in the current order. The order table isn't +used directly. There are instead two views: unfi_diff & unfi_all. +unfi_diff looks like this: + +BEGIN SQL: +CREATE view unfi_diff as +select p.upc,u.upcc, +p.description, +u.item_desc, +u.wholesale, +u.vd_cost, +p.normal_price, +u.unfi_sku, +u.wfc_srp, +u.cat, +p.department, +CASE WHEN p.normal_price = 0 THEN 0 ELSE +CONVERT(decimal(10,5),(p.normal_price - (u.vd_cost/u.pack))/p.normal_price) +END as our_margin, +CONVERT(decimal(10,5),(u.wfc_srp - (u.vd_cost/u.pack))/ u.wfc_srp) +as unfi_margin, +case when u.wfc_srp > p.normal_price then 1 else 0 END as diff +from products as p +right join unfi_order as u +on left(u.upcc,13)=p.upc +where +p.normal_price <> u.wfc_srp and +p.upc is not NULL +END SQL + +This view is calculating the margin with the current price ("our_margin") +and the margin with the new SRP ("unfi_margin"). The unfi_all view is +nearly identical. It just lacks the "p.normal_price <> u.wfc_srp" clause. + +The list gets color coded to signify where new SRPs will give better margin +than current prices. When the form is submitted, items that are checked on +the far right will be put into a price update batch. + +A unfi_cat table is needed for this page. It's used to determine which +subset of items in the order should be shown. + +The stuff in the AJAX section (isset($_GET["action"])) is pretty much all +optional. Anything that prevents the file from processing can +probably get chopped out, like do_prod_update or updateProductAllLanes. + +price_update.php: +Processes data from price_update.php. It creates a batch and inserts +the selected items into that batch (with the new SRPs). The tables +batchTest and batchListTest are required. The shelf tag related stuff +(pricePerOunce, tables newBar*) can all get chopped out if they cause problems. + +batches.php: +Lists existing batches. Items can be removed from batches, otherwise there isn't +much editing functionality here. To make the actual change, click the batch name, +then go to the bottom of the item list and click Force Batch Now. This makes the +appropriate price changes in the table Products. The actual update happens in +forceBatch.php. The productsUpdateAll stored procedure pushes my Products table +from the server to each of the lanes. That probably needs to be removed or changed. diff --git a/fannie/legacy/IT/UNFI/batchList.php b/fannie/legacy/IT/UNFI/batchList.php new file mode 100644 index 000000000..870ecdb75 --- /dev/null +++ b/fannie/legacy/IT/UNFI/batchList.php @@ -0,0 +1,56 @@ +query($delQ1); + $delR2 = $sql->query($delQ2); +} + +$batchListQ= "SELECT b.batchID,b.batchName,b.startDate,b.endDate + FROM batchTest as b + ORDER BY b.batchID DESC"; + +$batchListR = $sql->query($batchListQ); + +?> + + + + + + + + + +"; +$i = 0; +echo ""; + echo ""; + echo ""; + $i++; +} +?> + diff --git a/fannie/legacy/IT/UNFI/batches.php b/fannie/legacy/IT/UNFI/batches.php new file mode 100644 index 000000000..14b43c4ee --- /dev/null +++ b/fannie/legacy/IT/UNFI/batches.php @@ -0,0 +1,90 @@ +query($dateQ); +} +else if(isset($_REQUEST['submit']) && $_REQUEST['submit']=="submit"){ + foreach ($_REQUEST AS $key => $value) { + $batchID = $_REQUEST['batchID']; + + //echo "values".$key . ": ".$value . "
        "; + if(substr($key,0,4) == 'sale'){ + $$key = $value; + $upc1 = substr($key,4); + $queryTest = "UPDATE batchListTest SET salePrice = $value WHERE upc = '$upc1' and batchID = $batchID"; + //echo $queryTest . "
        "; + $resultTest = $sql->query($queryTest); + $updateBarQ = "UPDATE newbarcodes SET normal_price=$value WHERE upc = '$upc1'"; + $updateBarR = $sql->query($updateBarQ); + } + + if(substr($key,0,3) == 'del'){ + $$key = $value; + $upc1 = substr($key,3); + $infoQ = "select b.batchName,l.salePrice from batchListTest as l left join batchTest as b on b.batchID + = l.batchID where b.batchID = $batchID and l.upc = '$upc1'"; + $infoR = $sql->query($infoQ); + $infoW = $sql->fetch_array($infoR); + $name = $infoW[0]; + preg_match("/priceUpdate(.*?)\d+/",$name,$matches); + $name = $matches[1]; + $price = $infoW[1]; + $delItmQ = "DELETE FROM batchListTest WHERE upc = '$upc1' and batchID = $batchID"; + $delBarQ = "DELETE FROM shelftags WHERE upc='$upc1' and normal_price=$price"; + //echo $delBarQ."
        "; + $delItmR = $sql->query($delItmQ); + $delBarR = $sql->query($delBarQ); + } + } +} + +$batchInfoQ = "SELECT * FROM batchTest WHERE batchID = $batchID"; +$batchInfoR = $sql->query($batchInfoQ); +$batchInfoW = $sql->fetch_array($batchInfoR); + + +$selBItemsQ = "SELECT b.*,p.* from batchListTest as b LEFT JOIN + products as p ON p.upc = b.upc WHERE batchID = $batchID + ORDER BY b.listID DESC"; +//echo $selBItemsQ; +$selBItemsR = $sql->query($selBItemsQ); + +echo ""; +echo "
        Name TotalCounted AmtOver/Short
        $row[0]Starting cashn/an/a
        n/a
         Cash$caW[0] 
        $os
         Check$ckW[0] 
        $os
         Credit$ccW[0] 
        $os
         Store Charge$miW[0] 
        $os
         EBT Food$efW[0] 
        $os
         EBT Cash$ecW[0] 
        $os
         Gift Card$gdW[0] 
        $os
         Gift Certificate$tcW[0] 
        $os
         Coupons$cpW[0] 
        $os
         InStore Coupons$icW[0] 
        $os
         Cashier totals$perCashierTotal$perCashierCountTotal$perCashierOSTotal
         Notes"; +$output .= "
        Batch NameStart Date"; +while($batchListW = $sql->fetch_array($batchListR)){ + $start = $batchListW[2]; + $end = $batchListW[3]; + $imod = $i%2; + if($imod==1){ + $bColor = '#ffffff'; + }else{ + $bColor = '#ffffcc'; + } + echo "
        "; + echo "$batchListW[1]$batchListW[3]Delete
        "; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; + echo ""; + echo ""; + echo ""; +} +echo ""; +echo ""; +echo ""; + +echo "
        Batch Name: $batchInfoW[3]Start Date: End Date:
        UPCDescriptionNormal PriceUNFI SRPDelete"; +while($selBItemsW = $sql->fetch_array($selBItemsR)){ + $upc = $selBItemsW[1]; + $field = 'sale'.$upc; + $del = 'del'.$upc; + //echo $del; + echo "
        $selBItemsW[1]{$selBItemsW['description']}{$selBItemsW['normal_price']}{$selBItemsW['salePrice']}
        Force Sale Batch Now
        "; + +?> diff --git a/fannie/legacy/IT/UNFI/display.php b/fannie/legacy/IT/UNFI/display.php new file mode 100755 index 000000000..0af4cc4d5 --- /dev/null +++ b/fannie/legacy/IT/UNFI/display.php @@ -0,0 +1,55 @@ +query($getBatchIDQ); +$getBatchIDW = $sql->fetch_array($getBatchIDR); + +$batchID = $_GET['batchID']; + +extract($_POST); + +if($getBatchIDW[0] < $batchID){ + if($batchType == 6){ + $discounttype = 2; + }elseif($batchType == 4 || $batchType == 5){ + $discounttype = 0; + }else{ + $discounttype = 1; + } + + /*$insBatchQ = "INSERT INTO batches(startDate,endDate,batchName,batchType,discounttype) + VALUES('$startDate','$endDate','$batchName',$batchType,$discounttype)"; + //echo $insBatchQ; + $insBatchR = $sql->query($insBatchQ);*/ +} + +?> + + + + diff --git a/fannie/legacy/IT/UNFI/forceBatch.php b/fannie/legacy/IT/UNFI/forceBatch.php new file mode 100644 index 000000000..57ad6ad49 --- /dev/null +++ b/fannie/legacy/IT/UNFI/forceBatch.php @@ -0,0 +1,48 @@ +query($batchInfoQ); + +$batchInfoW = $sql->fetch_array($batchInfoR); + +$forceQ = "UPDATE products AS p + LEFT JOIN batchListTest as l + ON l.upc=p.upc + SET normal_price = l.salePrice, + modified = now() + WHERE l.batchID = $batchID"; + +//echo $forceQ; +$forceR = $sql->query($forceQ); + +$upQ = "INSERT INTO prodUpdate + SELECT p.upc,description,normal_price, + department,tax,foodstamp,scale,0, + modified,0,qttyEnforced,discount,inUse + FROM products as p, + batchListTest as l + WHERE l.upc = p.upc + AND l.batchID = $batchID"; +$sql->query($upQ); + +//$query1R = $sql->query($query1Q); + +//$batchUpQ = "EXEC productsUpdateAll"; +//$batchUpR = $sql->query($batchUpQ); + +//exec("php fork.php sync products"); +include($FANNIE_ROOT.'legacy/queries/laneUpdates.php'); +syncProductsAllLanes(); + +echo "Batch $batchID has been forced"; + + +?> + diff --git a/fannie/legacy/IT/UNFI/index.php b/fannie/legacy/IT/UNFI/index.php new file mode 100644 index 000000000..94f2db608 --- /dev/null +++ b/fannie/legacy/IT/UNFI/index.php @@ -0,0 +1,23 @@ + +Start here... +Select a buyer if you like.... +
        + +
        +Show all items +
        + +
        + + diff --git a/fannie/legacy/IT/UNFI/new.php b/fannie/legacy/IT/UNFI/new.php new file mode 100644 index 000000000..25488ad76 --- /dev/null +++ b/fannie/legacy/IT/UNFI/new.php @@ -0,0 +1,48 @@ +query($delQ); + $delQ = "delete from newItemsBatchList where batchID=".$_GET["delete"]; + $delR = $sql->query($delQ); +} + +?> + +Start here... +Select a buyer +
        + +
        +query($q); +echo ""; +echo ""; +$selected = "checked"; +while ($w = $sql->fetch_array($r)){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $selected = ""; +} +echo "
        Batch NameDeleteSelect
        ".$w[1]."Delete
        "; +?> + +
        + + diff --git a/fannie/legacy/IT/UNFI/newBatchEdit.php b/fannie/legacy/IT/UNFI/newBatchEdit.php new file mode 100644 index 000000000..d8d502a8e --- /dev/null +++ b/fannie/legacy/IT/UNFI/newBatchEdit.php @@ -0,0 +1,35 @@ +query($catQ,$mydb); +while($catW = $mysql->fetch_array($catR)) + $unfi_cats .= $catW[0].","; +$unfi_cats = substr($unfi_cats,0,strlen($unfi_cats)-1).")"; + +$itemsQ = "select upc,description,price from newItemsBatchList + where batchID=".$_POST["batchID"]." and unfi_category in ".$unfi_cats; +$itemsR = $sql->query($itemsQ,$db); + +echo ""; +echo ""; +$colors = array('#FFFFCC','#FFFFFF'); +$c = 0; +while ($itemsW = $sql->fetch_array($itemsR)){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $c = ($c+1)%2; +} +echo "
        UPCDescriptionPriceDepartmentIgnore
        $itemsW[0]
        "; + +?> diff --git a/fannie/legacy/IT/UNFI/new_items.js b/fannie/legacy/IT/UNFI/new_items.js new file mode 100755 index 000000000..924e5c53a --- /dev/null +++ b/fannie/legacy/IT/UNFI/new_items.js @@ -0,0 +1,47 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'new_items.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'getBrands': + document.getElementById('brands').innerHTML = array[1]; + break; + default: + alert(response); + } + } +} + +function getBrands(catID){ + phpSend('getBrands&catID='+catID); +} + diff --git a/fannie/legacy/IT/UNFI/new_items.php b/fannie/legacy/IT/UNFI/new_items.php new file mode 100644 index 000000000..b739bd89a --- /dev/null +++ b/fannie/legacy/IT/UNFI/new_items.php @@ -0,0 +1,193 @@ +query($q); + $out .= ""; + while($w = $sql->fetch_row($r)){ + $out .= ""; + } + break; + } + echo $out; + return; +} + +if (isset($_GET['cat'])){ + $catID = $_GET["cat"]; + $brand = ""; + if (isset($_GET["brands"]) && $_GET["brands"] != "") + $brand = " AND v.brand='".$_GET["brands"]."' "; + + $mysql = new SQLManager('mysql.wfco-op.store','mysql','IS4C','is4c','is4c'); + $dsubs = " superID IN ("; + $buyersR = $mysql->query("SELECT buyer FROM unfi_cat WHERE unfi_cat=$catID"); + $buyers = array(); + while($buyersW = $mysql->fetch_row($buyersR)) + array_push($buyers,$buyersW[0]); + foreach($buyers as $b) + $dsubs .= $b.","; + $dsubs = substr($dsubs,0,strlen($dsubs)-1).")"; + + $SHELFTAG_PAGES = array( + 1 => "Bulk", + 2 => "Cool", + 3 => "Deli", + 4 => "Grocery", + 5 => "HBC", + 8 => "Meat", + 9 => "Gen Merch" + ); + + $deptR = $sql->query("SELECT dept_no,dept_name FROM departments AS d + LEFT JOIN MasterSuperDepts AS m ON d.dept_no=m.dept_ID + WHERE $dsubs ORDER BY superID,dept_no"); + $depts = ""; + + $dataQ = "SELECT v.upc,brand,v.description,v.vendorDept, + s.srp,v.cost, + v.size,v.units,v.sku FROM vendorItems AS v + LEFT JOIN products AS p ON v.upc = p.upc + left join vendorSRPs as s ON v.upc=s.upc AND v.vendorID=s.vendorID + WHERE p.upc IS NULL and v.vendorID=1 + AND v.vendorDept=$catID $brand order by v.vendorDept,v.brand,v.description"; + $dataR = $sql->query($dataQ); + + echo "
        "; + echo "Shelf tag page:

        "; + echo ""; + echo ""; + echo ""; + while ($dataW = $sql->fetch_row($dataR)){ + echo ""; + printf("",$dataW["upc"]); + printf("",$dataW["upc"]); + printf("",$dataW["brand"]); + printf("",$dataW["brand"]); + printf("",$dataW["description"]); + printf("",$dataW["description"]); + printf("",$dataW["vendorDept"]); + printf("",$dataW["cost"]); + printf("",$dataW["cost"]); + echo ""; + printf("",$dataW["srp"]); + echo ""; + printf("",$dataW["size"]); + printf("",$dataW["units"]); + printf("",$dataW["sku"]); + } + echo "
        UPCBrandDescriptionUNFI Cat.CostDeptSRP
        %s%s%s%s%s$depts
        "; + echo ""; + echo "

        "; + +} +else if (isset($_POST["upc"])){ + $upcs = $_POST['upc']; + $brands = $_POST["brand"]; + $descs = $_POST["desc"]; + $costs = $_POST["cost"]; + $depts = $_POST["dept"]; + $prices = $_POST["price"]; + $packs = $_POST["pack"]; + $sizes = $_POST["size"]; + $skus = $_POST["sku"]; + + $bID = $_POST["shelftagpage"]; + + for ($i=0; $i%s %s
        ",$upcs[$i],$upcs[$i],$descs[$i]); + flush(); + + $taxfsR = $sql->query("SELECT dept_tax,dept_fs FROM departments WHERE dept_no=$depts[$i]"); + $tax = 0; + $fs = 0; + while($taxfsW = $sql->fetch_row($taxfsR)){ + $tax = $taxfsW[0]; + $fs = $taxfsW[1]; + } + + $prodQ = "INSERT INTO products (upc,description,normal_price,pricemethod,groupprice,quantity, + special_price,specialpricemethod,specialgroupprice,specialquantity,start_date,end_date, + department,size,tax,foodstamp,scale,mixmatchcode,modified,advertised,tareweight, + discount,discounttype,unitofmeasure,wicable,qttyEnforced,inUse,numflag,subdept, + deposit,local,idEnforced,scaleprice,cost) VALUES ( + '$upcs[$i]','$descs[$i]',$prices[$i],0,0,0, + 0,0,0,0,'1900-01-01','1900-01-01', + $depts[$i],0,$tax,$fs,0,0,now(),1,0, + 1,0,'lb',0,0,1,0,0,0.00,0,0,0,0.00)"; + + $upQ = "INSERT INTO prodUpdate (upc,description,price,dept,tax,fs,scale,likeCode,modified,[user], + forceQty,noDisc,inUse) VALUES ('$upcs[$i]','$descs[$i]',$prices[$i],$depts[$i], + $tax,$fs,0,0,now(),-2,0,1,1)"; + + $xtraQ = "INSERT INTO prodExtra (upc,distributor,manufacturer,cost,margin,variable_pricing,location) + VALUES ('$upcs[$i]','UNFI','$brands[$i]',$costs[$i],0,0,'')"; + + $ppo = pricePerOunce($prices[$i],$sizes[$i]); + $barQ = "INSERT INTO shelftags (id,upc,description,normal_price,brand,sku,units,size,vendor, + pricePerUnit) VALUES ($bID,'$upcs[$i]','$descs[$i]',$prices[$i],'$brands[$i]','$skus[$i]','$sizes[$i]', + '$packs[$i]','UNFI','$ppo')"; + + $sql->query($prodQ); + $sql->query($upQ); + $sql->query($xtraQ); + $sql->query($barQ); + + updateProductAllLanes($upcs[$i]); + } + echo "Pushing products to the lanes
        "; + flush(); + //syncProductsAllLanes(); + //exec("php fork.php sync products"); + echo ""; +} +else { + $dataR = $sql->query("SELECT categoryID,name FROM unfiCategories ORDER BY categoryID"); + echo "Add UNFI items"; + echo ""; + echo ""; + + echo "Choose UNFI category
        "; + echo "
        "; + echo "

        "; + + echo "(Optional) choose a brand
        "; + echo "

        "; + + echo ""; + echo "

        "; +} + +?> diff --git a/fannie/legacy/IT/UNFI/price_compare.js b/fannie/legacy/IT/UNFI/price_compare.js new file mode 100755 index 000000000..bd230c15c --- /dev/null +++ b/fannie/legacy/IT/UNFI/price_compare.js @@ -0,0 +1,101 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'price_compare.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'savePrice': + document.getElementById('row'+array[1]).innerHTML = array[2]; + break; + case 'saveUnfiPrice': + case 'toggleVariable': + break; + default: + alert(response); + } + } +} + +function editPrice(upc){ + var price = document.getElementById('pricefield'+upc).innerHTML.replace(/.+?>(.+)<\/a>/i,"$1") + + var content = ""; + content += ""; + + document.getElementById('pricefield'+upc).innerHTML = content; +} + +function savePrice(upc){ + var newprice = document.getElementById('priceedit'+upc).value; + + var content = ""; + content += newprice+""; + + document.getElementById('pricefield'+upc).innerHTML = content; + + phpSend('savePrice&upc='+upc+'&price='+newprice); +} + +function editUnfiPrice(upc){ + var price = document.getElementById('unfiprice'+upc).innerHTML.replace(/.+?>(.+)<\/a>/i,"$1") + + var content = ""; + content += ""; + + document.getElementById('unfiprice'+upc).innerHTML = content; +} + +function savePrice(upc){ + var newprice = document.getElementById('priceedit'+upc).value; + + var content = ""; + content += newprice+""; + + document.getElementById('pricefield'+upc).innerHTML = content; + + phpSend('savePrice&upc='+upc+'&price='+newprice); +} + +function saveUnfiPrice(upc){ + var newprice = document.getElementById('unfipriceedit'+upc).value; + + var content = ""; + content += newprice+""; + + document.getElementById('unfiprice'+upc).innerHTML = content; + + phpSend('saveUnfiPrice&upc='+upc+'&price='+newprice); +} + +function toggleVariable(upc){ + var toggle = document.getElementById('var'+upc).checked; + phpSend('toggleVariable&upc='+upc+'&toggle='+toggle); +} diff --git a/fannie/legacy/IT/UNFI/price_compare.php b/fannie/legacy/IT/UNFI/price_compare.php new file mode 100644 index 000000000..8a6394165 --- /dev/null +++ b/fannie/legacy/IT/UNFI/price_compare.php @@ -0,0 +1,215 @@ +query($upQ); + + require('../../queries/laneUpdates.php'); + updateProductAllLanes($upc,$db); + + $out .= $upc."`"; + + $query = "SELECT u.*,p.cost FROM unfi_all as u left join prodExtra as p on u.upc=p.upc + WHERE u.upc = '$upc'"; + $result = $sql->query($query); + $row = $sql->fetch_array($result); + + $pupc = $row[0]; + $uupc = $row['upcc']; + $pdesc = $row['description']; + $udesc = $row['item_desc']; + $pprice = $row['normal_price']; + $uprice = $row['wfc_srp']; + $cat = $row['cat']; + $ourMarg = (100 * (float)$row['our_margin'])."%"; + $unMarg = (100 * (float)$row['unfi_margin'])."%"; + $dept = $row['department']; + $diff = $row['diff']; + $cost = $row['cost']; + + if($diff==1){ + $bg = "ff6677"; + $sort = 1; + }else{ + $bg = "#ccffcc"; + $sort = 0; + } + $out .= "$pupc$pdesc$cost$pprice"; + $out .= "$ourMarg$uprice$unMarg$cat$sort"; + break; + case 'saveUnfiPrice': + $upc = $_GET['upc']; + $price = $_GET['price']; + $upQ = "update unfi_order set wfc_srp=$price where upcc='$upc'"; + $upR = $sql->query($upQ); + break; + case 'toggleVariable': + $upc = $_GET['upc']; + $val = ($_GET['toggle'] == "true") ? 1 : 0; + $upQ = "update prodExtra set variable_pricing=$val where upc='$upc'"; + $upR = $sql->query($upQ); + break; + } + echo $out; + return; +} + +//Get buyID from index form. Set to 99 (all buyers) if not set. +if(isset($_POST['buyer'])){ + $buyID = $_POST['buyer']; +}elseif(isset($_GET['buyer'])){ + $buyID = $_GET['buyer']; +}else{ + $buyID = '99'; +} + +$filter = isset($_REQUEST['filter'])?$_REQUEST['filter']:''; + +$unfi_table = "unfi_diff"; +if ($filter == "Yes") + $unfi_table = "unfi_all"; + +//echo $buyID . "
        "; +//Test to see if we are dumping this to Excel. Apply Excel header if we are. +if(isset($_GET['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="UNFI_prices.xls"'); +} +else { +?> + + + + +Dump to Excel
        "; + +//Connect to mysql server + +$mysql = new SQLManager('mysql.wfco-op.store','MYSQL','IS4C','is4c','is4c'); + +if($buyID == 99){ + $getCatQ = "SELECT unfi_cat FROM unfi_cat"; +}else{ + $getCatQ = "SELECT unfi_cat FROM unfi_cat WHERE buyer = $buyID"; +} + +//echo $getCatQ; + +$getCatR = $mysql->query($getCatQ); + + $sort = isset($_GET['sort'])?$_GET['sort']:''; + + //create form page + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + +echo "
        Our UPCOur DescCostOur PriceOur MarginUNFI SRPUNFI Margin"; + if($sort=='cat'){ + echo "Cat"; + }else{ + echo "Cat"; + } + if($sort == 'diff'){ + echo "Diff"; + }else{ + echo "Diff"; + } + if($sort=='variable_pricing'){ + echo "Var"; + } + else { + echo "Var"; + } + $i = 1; + +$strCat = "("; + +while($getCatW = $mysql->fetch_array($getCatR)){ + $cat = $getCatW['unfi_cat']; + //echo $cat . "
        "; + $strCat = $strCat.$cat.","; +} + +$strCat = substr($strCat,0,-1); +$strCat = $strCat . ")"; +//echo $strCat; + + //If sort is set (header has been clicked, test to see if we need to reverse + //the sort of the last refresh. + $query = ""; + if(isset($_GET['sort'])){ + if(substr($sort,-1,1) == 1){ + $sort = substr($sort,0,-1) . " DESC "; + } + //echo $sort; + if(substr($sort,0,3) == 'cat'){ + $query = "SELECT u.*,p.cost,p.variable_pricing FROM $unfi_table as u left join prodExtra as p on u.upc=p.upc + WHERE cat IN$strCat order by $sort,department,u.upc"; + } + else if (strstr("variable_pricing",$sort)){ + $query = "SELECT u.*,p.cost,p.variable_pricing FROM $unfi_table as u left join prodExtra as p on u.upc=p.upc + WHERE cat IN$strCat order by $sort,cat,department,u.upc"; + }else{ + $query = "SELECT u.*,p.cost,p.variable_pricing FROM $unfi_table as u left join prodExtra as p on u.upc=p.upc + WHERE cat IN$strCat order by $sort,cat,department,u.upc"; + } + }else{ + $query = "SELECT u.*,p.cost,p.variable_pricing FROM $unfi_table as u left join prodExtra as p on u.upc=p.upc + WHERE cat IN$strCat order by cat, department, u.upc"; + } + $result = $sql->query($query); + + while($row = $sql->fetch_array($result)){ + $pupc = $row[0]; + $uupc = $row['upcc']; + $pdesc = $row['description']; + $udesc = $row['item_desc']; + $pprice = $row['normal_price']; + $uprice = $row['wfc_srp']; + $cat = $row['cat']; + $ourMarg = (100 * (float)$row['our_margin'])."%"; + $unMarg = (100 * (float)$row['unfi_margin'])."%"; + $dept = $row['department']; + $diff = $row['diff']; + $cost = $row['cost']; + $var = $row['variable_pricing']; + + if($diff==1){ + $bg = "ff6677"; + $sort = 1; + }else{ + $bg = "#ccffcc"; + $sort = 0; + } + echo "
        $pupc$pdesc$cost$pprice$ourMarg$uprice$unMarg$cat$sort"; + echo "
        "; +echo ""; +echo "
        "; +?> diff --git a/fannie/legacy/IT/UNFI/price_update.php b/fannie/legacy/IT/UNFI/price_update.php new file mode 100644 index 000000000..74c7b9801 --- /dev/null +++ b/fannie/legacy/IT/UNFI/price_update.php @@ -0,0 +1,81 @@ +query($getBuyerQ); + $getBuyerW = $sql->fetch_array($getBuyerR); + $buyer = $getBuyerW['subdept_name']; +} +$date = date('mjY'); +$batchName = "priceUpdate".$buyer.$date; + +$insBatchQ = "INSERT INTO batchTest(startDate,endDate,batchName,batchType,discounttype) + VALUES(now(),now(),'$batchName',7,0)"; +//echo $insBatchQ; +$insBatchR = $sql->query($insBatchQ); + +echo "".$buyer."
        "; +echo "Check tag info"; +echo ""; + echo ""; + echo ""; + +} +echo ""; +echo "
        UPCDescriptionSKUBrandPackSizePrice"; +echo "
        "; +foreach ($_POST["pricechange"] as $value) { + $getUNFIPriceQ = "SELECT * FROM unfi_all where upc = '".$value."'"; + //echo $getUNFIPriceQ . "
        "; + $getUNFIPriceR = $sql->query($getUNFIPriceQ); + $getUNFIPriceW = $sql->fetch_array($getUNFIPriceR); + $upc = $getUNFIPriceW['upc']; + $upcl = ltrim($getUNFIPriceW['upc'],0); + $upcl = str_pad($upcl,10,"0",STR_PAD_LEFT); + //$upc = str_pad($upc,11,0,STR_PAD_LEFT); + $unfiPrice = $getUNFIPriceW['wfc_srp']; + + $maxBatchQ = "SELECT max(batchID) as maxID FROM batchTest"; + $maxBatchR = $sql->query($maxBatchQ); + $maxBatchW = $sql->fetch_array($maxBatchR); + $maxID = $maxBatchW['maxID']; + + $insBItemQ = "INSERT INTO batchListTest(upc,batchID,salePrice) + VALUES('$upc',$maxID,$unfiPrice)"; + $insBItemR = $sql->query($insBItemQ); + //echo $insBItemQ; + + $getTagInfoQ = "SELECT * FROM unfi_order WHERE upcc LIKE '%".$upcl."%'"; + //echo $getTagInfoQ; + $getTagInfoR = $sql->query($getTagInfoQ); + $getTagInfoW = $sql->fetch_array($getTagInfoR); + $desc = $getTagInfoW['item_desc']; + $sku = $getTagInfoW['unfi_sku']; + $brand = addslashes($getTagInfoW['brand']); + $pak = $getTagInfoW['pack']; + $size = $getTagInfoW['pack_size']; + $ppo = pricePerOunce($unfiPrice,$size); + + if(empty($pak)){ + $pak = 0; + } + $insQ = "INSERT INTO shelftags VALUES(".$buyID.",'".$upc."','".$desc."',$unfiPrice,'".$brand."','".$sku."','".$size."',$pak,'UNFI','$ppo')"; + //echo $insQ . "
        "; + $insR = $sql->query($insQ); + + echo "
        $upc$desc$sku$brand$pak$size$unfiPriceUNFI
        "; + +echo "Go to barcode page"; +?> diff --git a/fannie/legacy/db.php b/fannie/legacy/db.php new file mode 100644 index 000000000..e3d4c7476 --- /dev/null +++ b/fannie/legacy/db.php @@ -0,0 +1,12 @@ + diff --git a/fannie/legacy/images/AR.gif b/fannie/legacy/images/AR.gif new file mode 100644 index 000000000..9c2ae15e4 Binary files /dev/null and b/fannie/legacy/images/AR.gif differ diff --git a/fannie/legacy/images/GKC1.png b/fannie/legacy/images/GKC1.png new file mode 100644 index 000000000..f7d0d50da Binary files /dev/null and b/fannie/legacy/images/GKC1.png differ diff --git a/fannie/legacy/images/WFCLogoCThru1.gif b/fannie/legacy/images/WFCLogoCThru1.gif new file mode 100644 index 000000000..48a1e9fa1 Binary files /dev/null and b/fannie/legacy/images/WFCLogoCThru1.gif differ diff --git a/fannie/legacy/images/WFCLogoCThru1.jpg b/fannie/legacy/images/WFCLogoCThru1.jpg new file mode 100644 index 000000000..fa23d75c9 Binary files /dev/null and b/fannie/legacy/images/WFCLogoCThru1.jpg differ diff --git a/fannie/legacy/images/WFCLogoCThru1.png b/fannie/legacy/images/WFCLogoCThru1.png new file mode 100644 index 000000000..c5cb5bbda Binary files /dev/null and b/fannie/legacy/images/WFCLogoCThru1.png differ diff --git a/fannie/legacy/images/batches1.png b/fannie/legacy/images/batches1.png new file mode 100644 index 000000000..f579a167e Binary files /dev/null and b/fannie/legacy/images/batches1.png differ diff --git a/fannie/legacy/images/batches10.png b/fannie/legacy/images/batches10.png new file mode 100644 index 000000000..917d1a6b8 Binary files /dev/null and b/fannie/legacy/images/batches10.png differ diff --git a/fannie/legacy/images/batches11.png b/fannie/legacy/images/batches11.png new file mode 100644 index 000000000..f31518515 Binary files /dev/null and b/fannie/legacy/images/batches11.png differ diff --git a/fannie/legacy/images/batches12.png b/fannie/legacy/images/batches12.png new file mode 100644 index 000000000..3dcc24b83 Binary files /dev/null and b/fannie/legacy/images/batches12.png differ diff --git a/fannie/legacy/images/batches13.png b/fannie/legacy/images/batches13.png new file mode 100644 index 000000000..de673677c Binary files /dev/null and b/fannie/legacy/images/batches13.png differ diff --git a/fannie/legacy/images/batches14.png b/fannie/legacy/images/batches14.png new file mode 100644 index 000000000..65e0cf4b0 Binary files /dev/null and b/fannie/legacy/images/batches14.png differ diff --git a/fannie/legacy/images/batches15.png b/fannie/legacy/images/batches15.png new file mode 100644 index 000000000..10b36c6f0 Binary files /dev/null and b/fannie/legacy/images/batches15.png differ diff --git a/fannie/legacy/images/batches16.png b/fannie/legacy/images/batches16.png new file mode 100644 index 000000000..ff9fa7886 Binary files /dev/null and b/fannie/legacy/images/batches16.png differ diff --git a/fannie/legacy/images/batches17.png b/fannie/legacy/images/batches17.png new file mode 100644 index 000000000..975b53720 Binary files /dev/null and b/fannie/legacy/images/batches17.png differ diff --git a/fannie/legacy/images/batches18.png b/fannie/legacy/images/batches18.png new file mode 100644 index 000000000..b611ecb34 Binary files /dev/null and b/fannie/legacy/images/batches18.png differ diff --git a/fannie/legacy/images/batches19.png b/fannie/legacy/images/batches19.png new file mode 100644 index 000000000..12f132b4f Binary files /dev/null and b/fannie/legacy/images/batches19.png differ diff --git a/fannie/legacy/images/batches2.png b/fannie/legacy/images/batches2.png new file mode 100644 index 000000000..8f4e22523 Binary files /dev/null and b/fannie/legacy/images/batches2.png differ diff --git a/fannie/legacy/images/batches20.png b/fannie/legacy/images/batches20.png new file mode 100644 index 000000000..705d75a16 Binary files /dev/null and b/fannie/legacy/images/batches20.png differ diff --git a/fannie/legacy/images/batches21.png b/fannie/legacy/images/batches21.png new file mode 100644 index 000000000..a9d6b385b Binary files /dev/null and b/fannie/legacy/images/batches21.png differ diff --git a/fannie/legacy/images/batches22.png b/fannie/legacy/images/batches22.png new file mode 100644 index 000000000..9f576ea7f Binary files /dev/null and b/fannie/legacy/images/batches22.png differ diff --git a/fannie/legacy/images/batches3.png b/fannie/legacy/images/batches3.png new file mode 100644 index 000000000..195599cc6 Binary files /dev/null and b/fannie/legacy/images/batches3.png differ diff --git a/fannie/legacy/images/batches4.png b/fannie/legacy/images/batches4.png new file mode 100644 index 000000000..d0be5b3cb Binary files /dev/null and b/fannie/legacy/images/batches4.png differ diff --git a/fannie/legacy/images/batches5.png b/fannie/legacy/images/batches5.png new file mode 100644 index 000000000..066e6d7e5 Binary files /dev/null and b/fannie/legacy/images/batches5.png differ diff --git a/fannie/legacy/images/batches6.png b/fannie/legacy/images/batches6.png new file mode 100644 index 000000000..d7c959e00 Binary files /dev/null and b/fannie/legacy/images/batches6.png differ diff --git a/fannie/legacy/images/batches7.png b/fannie/legacy/images/batches7.png new file mode 100644 index 000000000..d6c463e26 Binary files /dev/null and b/fannie/legacy/images/batches7.png differ diff --git a/fannie/legacy/images/batches8.png b/fannie/legacy/images/batches8.png new file mode 100644 index 000000000..f47676b53 Binary files /dev/null and b/fannie/legacy/images/batches8.png differ diff --git a/fannie/legacy/images/batches9.png b/fannie/legacy/images/batches9.png new file mode 100644 index 000000000..76ec7e25d Binary files /dev/null and b/fannie/legacy/images/batches9.png differ diff --git a/fannie/legacy/images/control.gif b/fannie/legacy/images/control.gif new file mode 100644 index 000000000..934ffeda5 Binary files /dev/null and b/fannie/legacy/images/control.gif differ diff --git a/fannie/legacy/images/deliQ1.png b/fannie/legacy/images/deliQ1.png new file mode 100644 index 000000000..0560d8985 Binary files /dev/null and b/fannie/legacy/images/deliQ1.png differ diff --git a/fannie/legacy/images/deliQ2.png b/fannie/legacy/images/deliQ2.png new file mode 100644 index 000000000..eda9cd7e1 Binary files /dev/null and b/fannie/legacy/images/deliQ2.png differ diff --git a/fannie/legacy/images/deliQ3.png b/fannie/legacy/images/deliQ3.png new file mode 100644 index 000000000..f7ea7e677 Binary files /dev/null and b/fannie/legacy/images/deliQ3.png differ diff --git a/fannie/legacy/images/deliQ4.png b/fannie/legacy/images/deliQ4.png new file mode 100644 index 000000000..d20889ea8 Binary files /dev/null and b/fannie/legacy/images/deliQ4.png differ diff --git a/fannie/legacy/images/deliQ5.png b/fannie/legacy/images/deliQ5.png new file mode 100644 index 000000000..84e10d829 Binary files /dev/null and b/fannie/legacy/images/deliQ5.png differ diff --git a/fannie/legacy/images/deliQ6.png b/fannie/legacy/images/deliQ6.png new file mode 100644 index 000000000..4f1e82f65 Binary files /dev/null and b/fannie/legacy/images/deliQ6.png differ diff --git a/fannie/legacy/images/detail.gif b/fannie/legacy/images/detail.gif new file mode 100644 index 000000000..5bce880ca Binary files /dev/null and b/fannie/legacy/images/detail.gif differ diff --git a/fannie/legacy/images/equity.gif b/fannie/legacy/images/equity.gif new file mode 100644 index 000000000..4ffcca7d0 Binary files /dev/null and b/fannie/legacy/images/equity.gif differ diff --git a/fannie/legacy/images/exist_up.gif b/fannie/legacy/images/exist_up.gif new file mode 100644 index 000000000..355082578 Binary files /dev/null and b/fannie/legacy/images/exist_up.gif differ diff --git a/fannie/legacy/images/famfamfam/WFC Logo_color.jpg b/fannie/legacy/images/famfamfam/WFC Logo_color.jpg new file mode 100644 index 000000000..ed912b3bf Binary files /dev/null and b/fannie/legacy/images/famfamfam/WFC Logo_color.jpg differ diff --git a/fannie/legacy/images/famfamfam/action_back.gif b/fannie/legacy/images/famfamfam/action_back.gif new file mode 100644 index 000000000..46a8ffb19 Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_back.gif differ diff --git a/fannie/legacy/images/famfamfam/action_forward.gif b/fannie/legacy/images/famfamfam/action_forward.gif new file mode 100644 index 000000000..21da43758 Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_forward.gif differ diff --git a/fannie/legacy/images/famfamfam/action_go.gif b/fannie/legacy/images/famfamfam/action_go.gif new file mode 100644 index 000000000..82ae7ed82 Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_go.gif differ diff --git a/fannie/legacy/images/famfamfam/action_paste.gif b/fannie/legacy/images/famfamfam/action_paste.gif new file mode 100644 index 000000000..bffd6b0b3 Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_paste.gif differ diff --git a/fannie/legacy/images/famfamfam/action_print.gif b/fannie/legacy/images/famfamfam/action_print.gif new file mode 100644 index 000000000..92e7e0a1a Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_print.gif differ diff --git a/fannie/legacy/images/famfamfam/action_refresh.gif b/fannie/legacy/images/famfamfam/action_refresh.gif new file mode 100644 index 000000000..8268958a1 Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_refresh.gif differ diff --git a/fannie/legacy/images/famfamfam/action_refresh_blue.gif b/fannie/legacy/images/famfamfam/action_refresh_blue.gif new file mode 100644 index 000000000..7c8bcd00f Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_refresh_blue.gif differ diff --git a/fannie/legacy/images/famfamfam/action_save.gif b/fannie/legacy/images/famfamfam/action_save.gif new file mode 100644 index 000000000..6e6f7decc Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_save.gif differ diff --git a/fannie/legacy/images/famfamfam/action_stop.gif b/fannie/legacy/images/famfamfam/action_stop.gif new file mode 100644 index 000000000..c941c1902 Binary files /dev/null and b/fannie/legacy/images/famfamfam/action_stop.gif differ diff --git a/fannie/legacy/images/famfamfam/application_dreamweaver.gif b/fannie/legacy/images/famfamfam/application_dreamweaver.gif new file mode 100644 index 000000000..15fe1071e Binary files /dev/null and b/fannie/legacy/images/famfamfam/application_dreamweaver.gif differ diff --git a/fannie/legacy/images/famfamfam/application_firefox.gif b/fannie/legacy/images/famfamfam/application_firefox.gif new file mode 100644 index 000000000..1192e3e77 Binary files /dev/null and b/fannie/legacy/images/famfamfam/application_firefox.gif differ diff --git a/fannie/legacy/images/famfamfam/application_flash.gif b/fannie/legacy/images/famfamfam/application_flash.gif new file mode 100644 index 000000000..92abbcbe2 Binary files /dev/null and b/fannie/legacy/images/famfamfam/application_flash.gif differ diff --git a/fannie/legacy/images/famfamfam/arrow_down.gif b/fannie/legacy/images/famfamfam/arrow_down.gif new file mode 100644 index 000000000..f0bb6a4ea Binary files /dev/null and b/fannie/legacy/images/famfamfam/arrow_down.gif differ diff --git a/fannie/legacy/images/famfamfam/arrow_left.gif b/fannie/legacy/images/famfamfam/arrow_left.gif new file mode 100644 index 000000000..932ade160 Binary files /dev/null and b/fannie/legacy/images/famfamfam/arrow_left.gif differ diff --git a/fannie/legacy/images/famfamfam/arrow_right.gif b/fannie/legacy/images/famfamfam/arrow_right.gif new file mode 100644 index 000000000..780431c2b Binary files /dev/null and b/fannie/legacy/images/famfamfam/arrow_right.gif differ diff --git a/fannie/legacy/images/famfamfam/arrow_up.gif b/fannie/legacy/images/famfamfam/arrow_up.gif new file mode 100644 index 000000000..e8234178e Binary files /dev/null and b/fannie/legacy/images/famfamfam/arrow_up.gif differ diff --git a/fannie/legacy/images/famfamfam/box.gif b/fannie/legacy/images/famfamfam/box.gif new file mode 100644 index 000000000..cd4729a5d Binary files /dev/null and b/fannie/legacy/images/famfamfam/box.gif differ diff --git a/fannie/legacy/images/famfamfam/calendar.gif b/fannie/legacy/images/famfamfam/calendar.gif new file mode 100644 index 000000000..f78788cbe Binary files /dev/null and b/fannie/legacy/images/famfamfam/calendar.gif differ diff --git a/fannie/legacy/images/famfamfam/comment.gif b/fannie/legacy/images/famfamfam/comment.gif new file mode 100644 index 000000000..897cf2e3e Binary files /dev/null and b/fannie/legacy/images/famfamfam/comment.gif differ diff --git a/fannie/legacy/images/famfamfam/comment_blue.gif b/fannie/legacy/images/famfamfam/comment_blue.gif new file mode 100644 index 000000000..897cf2e3e Binary files /dev/null and b/fannie/legacy/images/famfamfam/comment_blue.gif differ diff --git a/fannie/legacy/images/famfamfam/comment_delete.gif b/fannie/legacy/images/famfamfam/comment_delete.gif new file mode 100644 index 000000000..691b546b3 Binary files /dev/null and b/fannie/legacy/images/famfamfam/comment_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/comment_new.gif b/fannie/legacy/images/famfamfam/comment_new.gif new file mode 100644 index 000000000..aa7e9d3ff Binary files /dev/null and b/fannie/legacy/images/famfamfam/comment_new.gif differ diff --git a/fannie/legacy/images/famfamfam/comment_yellow.gif b/fannie/legacy/images/famfamfam/comment_yellow.gif new file mode 100644 index 000000000..df7158a47 Binary files /dev/null and b/fannie/legacy/images/famfamfam/comment_yellow.gif differ diff --git a/fannie/legacy/images/famfamfam/copy.gif b/fannie/legacy/images/famfamfam/copy.gif new file mode 100644 index 000000000..ff81b3bf2 Binary files /dev/null and b/fannie/legacy/images/famfamfam/copy.gif differ diff --git a/fannie/legacy/images/famfamfam/cut.gif b/fannie/legacy/images/famfamfam/cut.gif new file mode 100644 index 000000000..ffd7f4f7d Binary files /dev/null and b/fannie/legacy/images/famfamfam/cut.gif differ diff --git a/fannie/legacy/images/famfamfam/date.gif b/fannie/legacy/images/famfamfam/date.gif new file mode 100644 index 000000000..0cbdf001c Binary files /dev/null and b/fannie/legacy/images/famfamfam/date.gif differ diff --git a/fannie/legacy/images/famfamfam/date_delete.gif b/fannie/legacy/images/famfamfam/date_delete.gif new file mode 100644 index 000000000..65f716b75 Binary files /dev/null and b/fannie/legacy/images/famfamfam/date_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/date_new.gif b/fannie/legacy/images/famfamfam/date_new.gif new file mode 100644 index 000000000..e224d7803 Binary files /dev/null and b/fannie/legacy/images/famfamfam/date_new.gif differ diff --git a/fannie/legacy/images/famfamfam/famfamfam_mini_icons.zip b/fannie/legacy/images/famfamfam/famfamfam_mini_icons.zip new file mode 100644 index 000000000..5d0f88fcc Binary files /dev/null and b/fannie/legacy/images/famfamfam/famfamfam_mini_icons.zip differ diff --git a/fannie/legacy/images/famfamfam/file_acrobat.gif b/fannie/legacy/images/famfamfam/file_acrobat.gif new file mode 100644 index 000000000..7bc7de95d Binary files /dev/null and b/fannie/legacy/images/famfamfam/file_acrobat.gif differ diff --git a/fannie/legacy/images/famfamfam/file_font.gif b/fannie/legacy/images/famfamfam/file_font.gif new file mode 100644 index 000000000..52b5ef3e4 Binary files /dev/null and b/fannie/legacy/images/famfamfam/file_font.gif differ diff --git a/fannie/legacy/images/famfamfam/file_font_truetype.gif b/fannie/legacy/images/famfamfam/file_font_truetype.gif new file mode 100644 index 000000000..0569425f1 Binary files /dev/null and b/fannie/legacy/images/famfamfam/file_font_truetype.gif differ diff --git a/fannie/legacy/images/famfamfam/flag_blue.gif b/fannie/legacy/images/famfamfam/flag_blue.gif new file mode 100644 index 000000000..a0924052f Binary files /dev/null and b/fannie/legacy/images/famfamfam/flag_blue.gif differ diff --git a/fannie/legacy/images/famfamfam/flag_green.gif b/fannie/legacy/images/famfamfam/flag_green.gif new file mode 100644 index 000000000..76b89250d Binary files /dev/null and b/fannie/legacy/images/famfamfam/flag_green.gif differ diff --git a/fannie/legacy/images/famfamfam/flag_orange.gif b/fannie/legacy/images/famfamfam/flag_orange.gif new file mode 100644 index 000000000..0596070f2 Binary files /dev/null and b/fannie/legacy/images/famfamfam/flag_orange.gif differ diff --git a/fannie/legacy/images/famfamfam/flag_red.gif b/fannie/legacy/images/famfamfam/flag_red.gif new file mode 100644 index 000000000..16698e32e Binary files /dev/null and b/fannie/legacy/images/famfamfam/flag_red.gif differ diff --git a/fannie/legacy/images/famfamfam/flag_white.gif b/fannie/legacy/images/famfamfam/flag_white.gif new file mode 100644 index 000000000..b566c018c Binary files /dev/null and b/fannie/legacy/images/famfamfam/flag_white.gif differ diff --git a/fannie/legacy/images/famfamfam/folder.gif b/fannie/legacy/images/famfamfam/folder.gif new file mode 100644 index 000000000..8dc04c495 Binary files /dev/null and b/fannie/legacy/images/famfamfam/folder.gif differ diff --git a/fannie/legacy/images/famfamfam/folder_delete.gif b/fannie/legacy/images/famfamfam/folder_delete.gif new file mode 100644 index 000000000..ce9f44835 Binary files /dev/null and b/fannie/legacy/images/famfamfam/folder_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/folder_images.gif b/fannie/legacy/images/famfamfam/folder_images.gif new file mode 100644 index 000000000..81a7c3b41 Binary files /dev/null and b/fannie/legacy/images/famfamfam/folder_images.gif differ diff --git a/fannie/legacy/images/famfamfam/folder_lock.gif b/fannie/legacy/images/famfamfam/folder_lock.gif new file mode 100644 index 000000000..b1bfa0205 Binary files /dev/null and b/fannie/legacy/images/famfamfam/folder_lock.gif differ diff --git a/fannie/legacy/images/famfamfam/folder_new.gif b/fannie/legacy/images/famfamfam/folder_new.gif new file mode 100644 index 000000000..5f30cfa2e Binary files /dev/null and b/fannie/legacy/images/famfamfam/folder_new.gif differ diff --git a/fannie/legacy/images/famfamfam/folder_page.gif b/fannie/legacy/images/famfamfam/folder_page.gif new file mode 100644 index 000000000..a8c53e2f7 Binary files /dev/null and b/fannie/legacy/images/famfamfam/folder_page.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_accept.gif b/fannie/legacy/images/famfamfam/icon_accept.gif new file mode 100644 index 000000000..35e949963 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_accept.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_airmail.gif b/fannie/legacy/images/famfamfam/icon_airmail.gif new file mode 100644 index 000000000..2be845745 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_airmail.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_alert.gif b/fannie/legacy/images/famfamfam/icon_alert.gif new file mode 100644 index 000000000..429a5d9be Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_alert.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_attachment.gif b/fannie/legacy/images/famfamfam/icon_attachment.gif new file mode 100644 index 000000000..4400e61e9 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_attachment.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_clock.gif b/fannie/legacy/images/famfamfam/icon_clock.gif new file mode 100644 index 000000000..6ac6ebca2 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_clock.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_component.gif b/fannie/legacy/images/famfamfam/icon_component.gif new file mode 100644 index 000000000..bde079f97 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_component.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_download.gif b/fannie/legacy/images/famfamfam/icon_download.gif new file mode 100644 index 000000000..d052d0920 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_download.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_email.gif b/fannie/legacy/images/famfamfam/icon_email.gif new file mode 100644 index 000000000..62bc6ffd4 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_email.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_extension.gif b/fannie/legacy/images/famfamfam/icon_extension.gif new file mode 100644 index 000000000..50c2d4622 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_extension.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_favourites.gif b/fannie/legacy/images/famfamfam/icon_favourites.gif new file mode 100644 index 000000000..785b93875 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_favourites.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_get_world.gif b/fannie/legacy/images/famfamfam/icon_get_world.gif new file mode 100644 index 000000000..f99a5383b Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_get_world.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_history.gif b/fannie/legacy/images/famfamfam/icon_history.gif new file mode 100644 index 000000000..4473b1bc7 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_history.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_home.gif b/fannie/legacy/images/famfamfam/icon_home.gif new file mode 100644 index 000000000..327e76f92 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_home.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_info.gif b/fannie/legacy/images/famfamfam/icon_info.gif new file mode 100644 index 000000000..9dfa0e196 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_info.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_key.gif b/fannie/legacy/images/famfamfam/icon_key.gif new file mode 100644 index 000000000..e3853e5af Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_key.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_link.gif b/fannie/legacy/images/famfamfam/icon_link.gif new file mode 100644 index 000000000..c64c23c1f Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_link.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_mail.gif b/fannie/legacy/images/famfamfam/icon_mail.gif new file mode 100644 index 000000000..5b5c7a75b Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_mail.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_monitor_mac.gif b/fannie/legacy/images/famfamfam/icon_monitor_mac.gif new file mode 100644 index 000000000..b70028777 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_monitor_mac.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_monitor_pc.gif b/fannie/legacy/images/famfamfam/icon_monitor_pc.gif new file mode 100644 index 000000000..d9a947268 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_monitor_pc.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_network.gif b/fannie/legacy/images/famfamfam/icon_network.gif new file mode 100644 index 000000000..c607888a0 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_network.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_package.gif b/fannie/legacy/images/famfamfam/icon_package.gif new file mode 100644 index 000000000..e01b1ffbd Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_package.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_package_get.gif b/fannie/legacy/images/famfamfam/icon_package_get.gif new file mode 100644 index 000000000..19712a9c2 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_package_get.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_package_open.gif b/fannie/legacy/images/famfamfam/icon_package_open.gif new file mode 100644 index 000000000..e630faf91 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_package_open.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_padlock.gif b/fannie/legacy/images/famfamfam/icon_padlock.gif new file mode 100644 index 000000000..f70cc953a Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_padlock.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_security.gif b/fannie/legacy/images/famfamfam/icon_security.gif new file mode 100644 index 000000000..929284daa Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_security.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_settings.gif b/fannie/legacy/images/famfamfam/icon_settings.gif new file mode 100644 index 000000000..14339f700 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_settings.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_user.gif b/fannie/legacy/images/famfamfam/icon_user.gif new file mode 100644 index 000000000..dcb5c2a89 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_user.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_wand.gif b/fannie/legacy/images/famfamfam/icon_wand.gif new file mode 100644 index 000000000..d4eb47e76 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_wand.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_world.gif b/fannie/legacy/images/famfamfam/icon_world.gif new file mode 100644 index 000000000..355c1a950 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_world.gif differ diff --git a/fannie/legacy/images/famfamfam/icon_world_dynamic.gif b/fannie/legacy/images/famfamfam/icon_world_dynamic.gif new file mode 100644 index 000000000..e5ed08ce6 Binary files /dev/null and b/fannie/legacy/images/famfamfam/icon_world_dynamic.gif differ diff --git a/fannie/legacy/images/famfamfam/image.gif b/fannie/legacy/images/famfamfam/image.gif new file mode 100644 index 000000000..d5924f4bb Binary files /dev/null and b/fannie/legacy/images/famfamfam/image.gif differ diff --git a/fannie/legacy/images/famfamfam/image_new.gif b/fannie/legacy/images/famfamfam/image_new.gif new file mode 100644 index 000000000..4f4d12e5d Binary files /dev/null and b/fannie/legacy/images/famfamfam/image_new.gif differ diff --git a/fannie/legacy/images/famfamfam/interface_browser.gif b/fannie/legacy/images/famfamfam/interface_browser.gif new file mode 100644 index 000000000..602ef5042 Binary files /dev/null and b/fannie/legacy/images/famfamfam/interface_browser.gif differ diff --git a/fannie/legacy/images/famfamfam/interface_dialog.gif b/fannie/legacy/images/famfamfam/interface_dialog.gif new file mode 100644 index 000000000..31e1b071d Binary files /dev/null and b/fannie/legacy/images/famfamfam/interface_dialog.gif differ diff --git a/fannie/legacy/images/famfamfam/interface_installer.gif b/fannie/legacy/images/famfamfam/interface_installer.gif new file mode 100644 index 000000000..4b11af38e Binary files /dev/null and b/fannie/legacy/images/famfamfam/interface_installer.gif differ diff --git a/fannie/legacy/images/famfamfam/list_comments.gif b/fannie/legacy/images/famfamfam/list_comments.gif new file mode 100644 index 000000000..b313894a1 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_comments.gif differ diff --git a/fannie/legacy/images/famfamfam/list_components.gif b/fannie/legacy/images/famfamfam/list_components.gif new file mode 100644 index 000000000..d38de9d29 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_components.gif differ diff --git a/fannie/legacy/images/famfamfam/list_errors.gif b/fannie/legacy/images/famfamfam/list_errors.gif new file mode 100644 index 000000000..2e68d107c Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_errors.gif differ diff --git a/fannie/legacy/images/famfamfam/list_extensions.gif b/fannie/legacy/images/famfamfam/list_extensions.gif new file mode 100644 index 000000000..a5e542a0c Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_extensions.gif differ diff --git a/fannie/legacy/images/famfamfam/list_images.gif b/fannie/legacy/images/famfamfam/list_images.gif new file mode 100644 index 000000000..f744f19a3 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_images.gif differ diff --git a/fannie/legacy/images/famfamfam/list_keys.gif b/fannie/legacy/images/famfamfam/list_keys.gif new file mode 100644 index 000000000..6d3990a01 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_keys.gif differ diff --git a/fannie/legacy/images/famfamfam/list_links.gif b/fannie/legacy/images/famfamfam/list_links.gif new file mode 100644 index 000000000..4beb04496 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_links.gif differ diff --git a/fannie/legacy/images/famfamfam/list_packages.gif b/fannie/legacy/images/famfamfam/list_packages.gif new file mode 100644 index 000000000..c6cadf3bb Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_packages.gif differ diff --git a/fannie/legacy/images/famfamfam/list_security.gif b/fannie/legacy/images/famfamfam/list_security.gif new file mode 100644 index 000000000..3e32002f1 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_security.gif differ diff --git a/fannie/legacy/images/famfamfam/list_settings.gif b/fannie/legacy/images/famfamfam/list_settings.gif new file mode 100644 index 000000000..084509565 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_settings.gif differ diff --git a/fannie/legacy/images/famfamfam/list_users.gif b/fannie/legacy/images/famfamfam/list_users.gif new file mode 100644 index 000000000..394aba63f Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_users.gif differ diff --git a/fannie/legacy/images/famfamfam/list_world.gif b/fannie/legacy/images/famfamfam/list_world.gif new file mode 100644 index 000000000..a56265e03 Binary files /dev/null and b/fannie/legacy/images/famfamfam/list_world.gif differ diff --git a/fannie/legacy/images/famfamfam/note.gif b/fannie/legacy/images/famfamfam/note.gif new file mode 100644 index 000000000..17b9f4185 Binary files /dev/null and b/fannie/legacy/images/famfamfam/note.gif differ diff --git a/fannie/legacy/images/famfamfam/note_delete.gif b/fannie/legacy/images/famfamfam/note_delete.gif new file mode 100644 index 000000000..13402a582 Binary files /dev/null and b/fannie/legacy/images/famfamfam/note_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/note_new.gif b/fannie/legacy/images/famfamfam/note_new.gif new file mode 100644 index 000000000..431ff64d1 Binary files /dev/null and b/fannie/legacy/images/famfamfam/note_new.gif differ diff --git a/fannie/legacy/images/famfamfam/page.gif b/fannie/legacy/images/famfamfam/page.gif new file mode 100644 index 000000000..c5743c066 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page.gif differ diff --git a/fannie/legacy/images/famfamfam/page_alert.gif b/fannie/legacy/images/famfamfam/page_alert.gif new file mode 100644 index 000000000..4719a1f92 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_alert.gif differ diff --git a/fannie/legacy/images/famfamfam/page_attachment.gif b/fannie/legacy/images/famfamfam/page_attachment.gif new file mode 100644 index 000000000..a8e1b45ce Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_attachment.gif differ diff --git a/fannie/legacy/images/famfamfam/page_bookmark.gif b/fannie/legacy/images/famfamfam/page_bookmark.gif new file mode 100644 index 000000000..1b2a923a5 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_bookmark.gif differ diff --git a/fannie/legacy/images/famfamfam/page_boy.gif b/fannie/legacy/images/famfamfam/page_boy.gif new file mode 100644 index 000000000..4ae3ff0a7 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_boy.gif differ diff --git a/fannie/legacy/images/famfamfam/page_code.gif b/fannie/legacy/images/famfamfam/page_code.gif new file mode 100644 index 000000000..912517b83 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_code.gif differ diff --git a/fannie/legacy/images/famfamfam/page_colors.gif b/fannie/legacy/images/famfamfam/page_colors.gif new file mode 100644 index 000000000..0141d3842 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_colors.gif differ diff --git a/fannie/legacy/images/famfamfam/page_component.gif b/fannie/legacy/images/famfamfam/page_component.gif new file mode 100644 index 000000000..f9aee3f3c Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_component.gif differ diff --git a/fannie/legacy/images/famfamfam/page_cross.gif b/fannie/legacy/images/famfamfam/page_cross.gif new file mode 100644 index 000000000..bf43a0a0b Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_cross.gif differ diff --git a/fannie/legacy/images/famfamfam/page_delete.gif b/fannie/legacy/images/famfamfam/page_delete.gif new file mode 100644 index 000000000..0c6be0348 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/page_deny.gif b/fannie/legacy/images/famfamfam/page_deny.gif new file mode 100644 index 000000000..2bf5013ab Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_deny.gif differ diff --git a/fannie/legacy/images/famfamfam/page_down.gif b/fannie/legacy/images/famfamfam/page_down.gif new file mode 100644 index 000000000..390ba6974 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_down.gif differ diff --git a/fannie/legacy/images/famfamfam/page_dynamic.gif b/fannie/legacy/images/famfamfam/page_dynamic.gif new file mode 100644 index 000000000..11c59e68e Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_dynamic.gif differ diff --git a/fannie/legacy/images/famfamfam/page_edit.gif b/fannie/legacy/images/famfamfam/page_edit.gif new file mode 100644 index 000000000..7b02b6e72 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_edit.gif differ diff --git a/fannie/legacy/images/famfamfam/page_extension.gif b/fannie/legacy/images/famfamfam/page_extension.gif new file mode 100644 index 000000000..7bbe56a7b Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_extension.gif differ diff --git a/fannie/legacy/images/famfamfam/page_favourites.gif b/fannie/legacy/images/famfamfam/page_favourites.gif new file mode 100644 index 000000000..eab0d9d1a Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_favourites.gif differ diff --git a/fannie/legacy/images/famfamfam/page_find.gif b/fannie/legacy/images/famfamfam/page_find.gif new file mode 100644 index 000000000..9ae5e3489 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_find.gif differ diff --git a/fannie/legacy/images/famfamfam/page_flash.gif b/fannie/legacy/images/famfamfam/page_flash.gif new file mode 100644 index 000000000..6e17277b1 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_flash.gif differ diff --git a/fannie/legacy/images/famfamfam/page_girl.gif b/fannie/legacy/images/famfamfam/page_girl.gif new file mode 100644 index 000000000..9f48a2239 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_girl.gif differ diff --git a/fannie/legacy/images/famfamfam/page_html.gif b/fannie/legacy/images/famfamfam/page_html.gif new file mode 100644 index 000000000..34e79d162 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_html.gif differ diff --git a/fannie/legacy/images/famfamfam/page_java.gif b/fannie/legacy/images/famfamfam/page_java.gif new file mode 100644 index 000000000..6592a87a0 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_java.gif differ diff --git a/fannie/legacy/images/famfamfam/page_key.gif b/fannie/legacy/images/famfamfam/page_key.gif new file mode 100644 index 000000000..ebf83ca7d Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_key.gif differ diff --git a/fannie/legacy/images/famfamfam/page_left.gif b/fannie/legacy/images/famfamfam/page_left.gif new file mode 100644 index 000000000..f222b4693 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_left.gif differ diff --git a/fannie/legacy/images/famfamfam/page_link.gif b/fannie/legacy/images/famfamfam/page_link.gif new file mode 100644 index 000000000..ff0b39d0f Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_link.gif differ diff --git a/fannie/legacy/images/famfamfam/page_lock.gif b/fannie/legacy/images/famfamfam/page_lock.gif new file mode 100644 index 000000000..07a275685 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_lock.gif differ diff --git a/fannie/legacy/images/famfamfam/page_new.gif b/fannie/legacy/images/famfamfam/page_new.gif new file mode 100644 index 000000000..0888abf85 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_new.gif differ diff --git a/fannie/legacy/images/famfamfam/page_next.gif b/fannie/legacy/images/famfamfam/page_next.gif new file mode 100644 index 000000000..60769b66d Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_next.gif differ diff --git a/fannie/legacy/images/famfamfam/page_package.gif b/fannie/legacy/images/famfamfam/page_package.gif new file mode 100644 index 000000000..d94a07586 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_package.gif differ diff --git a/fannie/legacy/images/famfamfam/page_php.gif b/fannie/legacy/images/famfamfam/page_php.gif new file mode 100644 index 000000000..d99790321 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_php.gif differ diff --git a/fannie/legacy/images/famfamfam/page_prev.gif b/fannie/legacy/images/famfamfam/page_prev.gif new file mode 100644 index 000000000..f0bb78da6 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_prev.gif differ diff --git a/fannie/legacy/images/famfamfam/page_refresh.gif b/fannie/legacy/images/famfamfam/page_refresh.gif new file mode 100644 index 000000000..dc238461e Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_refresh.gif differ diff --git a/fannie/legacy/images/famfamfam/page_right.gif b/fannie/legacy/images/famfamfam/page_right.gif new file mode 100644 index 000000000..aedf4ba62 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_right.gif differ diff --git a/fannie/legacy/images/famfamfam/page_script.gif b/fannie/legacy/images/famfamfam/page_script.gif new file mode 100644 index 000000000..44717b306 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_script.gif differ diff --git a/fannie/legacy/images/famfamfam/page_security.gif b/fannie/legacy/images/famfamfam/page_security.gif new file mode 100644 index 000000000..5050dc4b5 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_security.gif differ diff --git a/fannie/legacy/images/famfamfam/page_settings.gif b/fannie/legacy/images/famfamfam/page_settings.gif new file mode 100644 index 000000000..af4099724 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_settings.gif differ diff --git a/fannie/legacy/images/famfamfam/page_sound.gif b/fannie/legacy/images/famfamfam/page_sound.gif new file mode 100644 index 000000000..1526ad11c Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_sound.gif differ diff --git a/fannie/legacy/images/famfamfam/page_tag_blue.gif b/fannie/legacy/images/famfamfam/page_tag_blue.gif new file mode 100644 index 000000000..5ceb96ced Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_tag_blue.gif differ diff --git a/fannie/legacy/images/famfamfam/page_tag_red.gif b/fannie/legacy/images/famfamfam/page_tag_red.gif new file mode 100644 index 000000000..4aa2416b6 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_tag_red.gif differ diff --git a/fannie/legacy/images/famfamfam/page_text.gif b/fannie/legacy/images/famfamfam/page_text.gif new file mode 100644 index 000000000..c1132e472 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_text.gif differ diff --git a/fannie/legacy/images/famfamfam/page_text_delete.gif b/fannie/legacy/images/famfamfam/page_text_delete.gif new file mode 100644 index 000000000..f3178ab40 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_text_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/page_tick.gif b/fannie/legacy/images/famfamfam/page_tick.gif new file mode 100644 index 000000000..d7edd0c0d Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_tick.gif differ diff --git a/fannie/legacy/images/famfamfam/page_tree.gif b/fannie/legacy/images/famfamfam/page_tree.gif new file mode 100644 index 000000000..847274e6d Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_tree.gif differ diff --git a/fannie/legacy/images/famfamfam/page_up.gif b/fannie/legacy/images/famfamfam/page_up.gif new file mode 100644 index 000000000..08ef934c7 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_up.gif differ diff --git a/fannie/legacy/images/famfamfam/page_url.gif b/fannie/legacy/images/famfamfam/page_url.gif new file mode 100644 index 000000000..1b27952c2 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_url.gif differ diff --git a/fannie/legacy/images/famfamfam/page_user.gif b/fannie/legacy/images/famfamfam/page_user.gif new file mode 100644 index 000000000..ad39fb794 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_user.gif differ diff --git a/fannie/legacy/images/famfamfam/page_user_dark.gif b/fannie/legacy/images/famfamfam/page_user_dark.gif new file mode 100644 index 000000000..6ee2c1c81 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_user_dark.gif differ diff --git a/fannie/legacy/images/famfamfam/page_user_light.gif b/fannie/legacy/images/famfamfam/page_user_light.gif new file mode 100644 index 000000000..2b7a924b7 Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_user_light.gif differ diff --git a/fannie/legacy/images/famfamfam/page_video.gif b/fannie/legacy/images/famfamfam/page_video.gif new file mode 100644 index 000000000..a1c50325d Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_video.gif differ diff --git a/fannie/legacy/images/famfamfam/page_wizard.gif b/fannie/legacy/images/famfamfam/page_wizard.gif new file mode 100644 index 000000000..fd816ea7e Binary files /dev/null and b/fannie/legacy/images/famfamfam/page_wizard.gif differ diff --git a/fannie/legacy/images/famfamfam/readme.txt b/fannie/legacy/images/famfamfam/readme.txt new file mode 100644 index 000000000..0b0307974 --- /dev/null +++ b/fannie/legacy/images/famfamfam/readme.txt @@ -0,0 +1,2 @@ +mini icons - famfamfam.com +Contact: mjames@gmail.com \ No newline at end of file diff --git a/fannie/legacy/images/famfamfam/table.gif b/fannie/legacy/images/famfamfam/table.gif new file mode 100644 index 000000000..e5daec441 Binary files /dev/null and b/fannie/legacy/images/famfamfam/table.gif differ diff --git a/fannie/legacy/images/famfamfam/table_delete.gif b/fannie/legacy/images/famfamfam/table_delete.gif new file mode 100644 index 000000000..99190cd53 Binary files /dev/null and b/fannie/legacy/images/famfamfam/table_delete.gif differ diff --git a/fannie/legacy/images/famfamfam/tables.gif b/fannie/legacy/images/famfamfam/tables.gif new file mode 100644 index 000000000..87246be87 Binary files /dev/null and b/fannie/legacy/images/famfamfam/tables.gif differ diff --git a/fannie/legacy/images/general.gif b/fannie/legacy/images/general.gif new file mode 100644 index 000000000..40d15593d Binary files /dev/null and b/fannie/legacy/images/general.gif differ diff --git a/fannie/legacy/images/itemsDown.gif b/fannie/legacy/images/itemsDown.gif new file mode 100644 index 000000000..02e9cdabe Binary files /dev/null and b/fannie/legacy/images/itemsDown.gif differ diff --git a/fannie/legacy/images/itemsOver.gif b/fannie/legacy/images/itemsOver.gif new file mode 100644 index 000000000..842cff536 Binary files /dev/null and b/fannie/legacy/images/itemsOver.gif differ diff --git a/fannie/legacy/images/itemsUp.gif b/fannie/legacy/images/itemsUp.gif new file mode 100644 index 000000000..102d332bc Binary files /dev/null and b/fannie/legacy/images/itemsUp.gif differ diff --git a/fannie/legacy/images/letterhead.jpg b/fannie/legacy/images/letterhead.jpg new file mode 100644 index 000000000..c8ab57d3d Binary files /dev/null and b/fannie/legacy/images/letterhead.jpg differ diff --git a/fannie/legacy/images/letterhead.png b/fannie/legacy/images/letterhead.png new file mode 100644 index 000000000..6c1849cc1 Binary files /dev/null and b/fannie/legacy/images/letterhead.png differ diff --git a/fannie/legacy/images/locked.gif b/fannie/legacy/images/locked.gif new file mode 100644 index 000000000..d1986703b Binary files /dev/null and b/fannie/legacy/images/locked.gif differ diff --git a/fannie/legacy/images/logoGrnBckSm.gif b/fannie/legacy/images/logoGrnBckSm.gif new file mode 100644 index 000000000..f1f762322 Binary files /dev/null and b/fannie/legacy/images/logoGrnBckSm.gif differ diff --git a/fannie/legacy/images/memDown.gif b/fannie/legacy/images/memDown.gif new file mode 100644 index 000000000..0c2d0bcb5 Binary files /dev/null and b/fannie/legacy/images/memDown.gif differ diff --git a/fannie/legacy/images/memOver.gif b/fannie/legacy/images/memOver.gif new file mode 100644 index 000000000..9cd0d89bb Binary files /dev/null and b/fannie/legacy/images/memOver.gif differ diff --git a/fannie/legacy/images/memUp.gif b/fannie/legacy/images/memUp.gif new file mode 100644 index 000000000..c2d3194f1 Binary files /dev/null and b/fannie/legacy/images/memUp.gif differ diff --git a/fannie/legacy/images/newLogo_small.gif b/fannie/legacy/images/newLogo_small.gif new file mode 100644 index 000000000..375a4dd88 Binary files /dev/null and b/fannie/legacy/images/newLogo_small.gif differ diff --git a/fannie/legacy/images/newLogo_small.jpg b/fannie/legacy/images/newLogo_small.jpg new file mode 100644 index 000000000..595db0d94 Binary files /dev/null and b/fannie/legacy/images/newLogo_small.jpg differ diff --git a/fannie/legacy/images/newLogo_small1.gif b/fannie/legacy/images/newLogo_small1.gif new file mode 100644 index 000000000..ec4ba2cbb Binary files /dev/null and b/fannie/legacy/images/newLogo_small1.gif differ diff --git a/fannie/legacy/images/new_up.gif b/fannie/legacy/images/new_up.gif new file mode 100644 index 000000000..b4bc48015 Binary files /dev/null and b/fannie/legacy/images/new_up.gif differ diff --git a/fannie/legacy/images/patronage.gif b/fannie/legacy/images/patronage.gif new file mode 100644 index 000000000..490999587 Binary files /dev/null and b/fannie/legacy/images/patronage.gif differ diff --git a/fannie/legacy/images/persons.gif b/fannie/legacy/images/persons.gif new file mode 100644 index 000000000..f699d1c54 Binary files /dev/null and b/fannie/legacy/images/persons.gif differ diff --git a/fannie/legacy/images/prodList1.png b/fannie/legacy/images/prodList1.png new file mode 100644 index 000000000..c82b0dc29 Binary files /dev/null and b/fannie/legacy/images/prodList1.png differ diff --git a/fannie/legacy/images/prodList2.png b/fannie/legacy/images/prodList2.png new file mode 100644 index 000000000..fd5f19097 Binary files /dev/null and b/fannie/legacy/images/prodList2.png differ diff --git a/fannie/legacy/images/prodList3.png b/fannie/legacy/images/prodList3.png new file mode 100644 index 000000000..34982cdcb Binary files /dev/null and b/fannie/legacy/images/prodList3.png differ diff --git a/fannie/legacy/images/prodList4.png b/fannie/legacy/images/prodList4.png new file mode 100644 index 000000000..0a5dfef52 Binary files /dev/null and b/fannie/legacy/images/prodList4.png differ diff --git a/fannie/legacy/images/prodList5.png b/fannie/legacy/images/prodList5.png new file mode 100644 index 000000000..7659bf963 Binary files /dev/null and b/fannie/legacy/images/prodList5.png differ diff --git a/fannie/legacy/images/refDown.gif b/fannie/legacy/images/refDown.gif new file mode 100644 index 000000000..a67cd7610 Binary files /dev/null and b/fannie/legacy/images/refDown.gif differ diff --git a/fannie/legacy/images/refOver.gif b/fannie/legacy/images/refOver.gif new file mode 100644 index 000000000..d5b414953 Binary files /dev/null and b/fannie/legacy/images/refOver.gif differ diff --git a/fannie/legacy/images/refUp.gif b/fannie/legacy/images/refUp.gif new file mode 100644 index 000000000..7f5d1f31c Binary files /dev/null and b/fannie/legacy/images/refUp.gif differ diff --git a/fannie/legacy/images/repDown.gif b/fannie/legacy/images/repDown.gif new file mode 100644 index 000000000..53e46a3db Binary files /dev/null and b/fannie/legacy/images/repDown.gif differ diff --git a/fannie/legacy/images/repOver.gif b/fannie/legacy/images/repOver.gif new file mode 100644 index 000000000..d4028947a Binary files /dev/null and b/fannie/legacy/images/repOver.gif differ diff --git a/fannie/legacy/images/repUp.gif b/fannie/legacy/images/repUp.gif new file mode 100644 index 000000000..08caf3767 Binary files /dev/null and b/fannie/legacy/images/repUp.gif differ diff --git a/fannie/legacy/images/tab.png b/fannie/legacy/images/tab.png new file mode 100644 index 000000000..672716f87 Binary files /dev/null and b/fannie/legacy/images/tab.png differ diff --git a/fannie/legacy/images/test.png b/fannie/legacy/images/test.png new file mode 100644 index 000000000..1c2dd8f11 Binary files /dev/null and b/fannie/legacy/images/test.png differ diff --git a/fannie/legacy/inventory/.gitignore b/fannie/legacy/inventory/.gitignore new file mode 100644 index 000000000..b81fb08cd --- /dev/null +++ b/fannie/legacy/inventory/.gitignore @@ -0,0 +1 @@ +unfidownload.bak diff --git a/fannie/legacy/inventory/archive/.gitignore b/fannie/legacy/inventory/archive/.gitignore new file mode 100644 index 000000000..c4c4ffc6a --- /dev/null +++ b/fannie/legacy/inventory/archive/.gitignore @@ -0,0 +1 @@ +*.zip diff --git a/fannie/legacy/inventory/archive/invoice_10_1_2010.zip b/fannie/legacy/inventory/archive/invoice_10_1_2010.zip new file mode 100644 index 000000000..11689ced0 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_10_1_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_10_2_2010.zip b/fannie/legacy/inventory/archive/invoice_10_2_2010.zip new file mode 100644 index 000000000..3245a3ddb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_10_2_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_10_4_2010.zip b/fannie/legacy/inventory/archive/invoice_10_4_2010.zip new file mode 100644 index 000000000..2acff7ed7 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_10_4_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_10_2010.zip b/fannie/legacy/inventory/archive/invoice_4_10_2010.zip new file mode 100644 index 000000000..a7b7395b0 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_10_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_12_2010.zip b/fannie/legacy/inventory/archive/invoice_4_12_2010.zip new file mode 100644 index 000000000..e107ec0e6 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_12_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_13_2010.zip b/fannie/legacy/inventory/archive/invoice_4_13_2010.zip new file mode 100644 index 000000000..7866b0f9e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_13_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_15_2010.zip b/fannie/legacy/inventory/archive/invoice_4_15_2010.zip new file mode 100644 index 000000000..bf848f334 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_15_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_16_2010.zip b/fannie/legacy/inventory/archive/invoice_4_16_2010.zip new file mode 100644 index 000000000..39dce42c4 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_16_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_17_2010.zip b/fannie/legacy/inventory/archive/invoice_4_17_2010.zip new file mode 100644 index 000000000..84d3fcb26 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_17_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_20_2010.zip b/fannie/legacy/inventory/archive/invoice_4_20_2010.zip new file mode 100644 index 000000000..fa313c328 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_20_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_21_2010.zip b/fannie/legacy/inventory/archive/invoice_4_21_2010.zip new file mode 100644 index 000000000..71505b3de Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_21_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_22_2010.zip b/fannie/legacy/inventory/archive/invoice_4_22_2010.zip new file mode 100644 index 000000000..9d1ced64f Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_22_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_23_2010.zip b/fannie/legacy/inventory/archive/invoice_4_23_2010.zip new file mode 100644 index 000000000..e5b37a634 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_23_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_24_2010.zip b/fannie/legacy/inventory/archive/invoice_4_24_2010.zip new file mode 100644 index 000000000..2e67e649b Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_24_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_26_2010.zip b/fannie/legacy/inventory/archive/invoice_4_26_2010.zip new file mode 100644 index 000000000..1be7bfe1b Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_26_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_27_2010.zip b/fannie/legacy/inventory/archive/invoice_4_27_2010.zip new file mode 100644 index 000000000..7bac713fb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_27_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_28_2010.zip b/fannie/legacy/inventory/archive/invoice_4_28_2010.zip new file mode 100644 index 000000000..e24a5ea1f Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_28_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_29_2010.zip b/fannie/legacy/inventory/archive/invoice_4_29_2010.zip new file mode 100644 index 000000000..381a5974e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_29_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_30_2010.zip b/fannie/legacy/inventory/archive/invoice_4_30_2010.zip new file mode 100644 index 000000000..f58d3a0fd Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_30_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_6_2010.zip b/fannie/legacy/inventory/archive/invoice_4_6_2010.zip new file mode 100644 index 000000000..7375163a3 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_6_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_4_8_2010.zip b/fannie/legacy/inventory/archive/invoice_4_8_2010.zip new file mode 100644 index 000000000..58bd7b6cb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_4_8_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_11_2010.zip b/fannie/legacy/inventory/archive/invoice_5_11_2010.zip new file mode 100644 index 000000000..c2acb2dac Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_11_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_13_2010.zip b/fannie/legacy/inventory/archive/invoice_5_13_2010.zip new file mode 100644 index 000000000..595fbb8b1 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_13_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_14_2010.zip b/fannie/legacy/inventory/archive/invoice_5_14_2010.zip new file mode 100644 index 000000000..c9e3a8b75 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_14_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_15_2010.zip b/fannie/legacy/inventory/archive/invoice_5_15_2010.zip new file mode 100644 index 000000000..c0591f402 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_15_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_18_2010.zip b/fannie/legacy/inventory/archive/invoice_5_18_2010.zip new file mode 100644 index 000000000..8f798e314 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_18_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_19_2010.zip b/fannie/legacy/inventory/archive/invoice_5_19_2010.zip new file mode 100644 index 000000000..5cbd1f767 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_19_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_1_2010.zip b/fannie/legacy/inventory/archive/invoice_5_1_2010.zip new file mode 100644 index 000000000..beaccde03 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_1_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_20_2010.zip b/fannie/legacy/inventory/archive/invoice_5_20_2010.zip new file mode 100644 index 000000000..04c289cc5 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_20_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_21_2010.zip b/fannie/legacy/inventory/archive/invoice_5_21_2010.zip new file mode 100644 index 000000000..0746359a4 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_21_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_22_2010.zip b/fannie/legacy/inventory/archive/invoice_5_22_2010.zip new file mode 100644 index 000000000..ca701c034 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_22_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_24_2010.zip b/fannie/legacy/inventory/archive/invoice_5_24_2010.zip new file mode 100644 index 000000000..fa1bd6a11 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_24_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_25_2010.zip b/fannie/legacy/inventory/archive/invoice_5_25_2010.zip new file mode 100644 index 000000000..56f4d389e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_25_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_27_2010.zip b/fannie/legacy/inventory/archive/invoice_5_27_2010.zip new file mode 100644 index 000000000..4a2b478b5 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_27_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_28_2010.zip b/fannie/legacy/inventory/archive/invoice_5_28_2010.zip new file mode 100644 index 000000000..d42912b4a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_28_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_29_2010.zip b/fannie/legacy/inventory/archive/invoice_5_29_2010.zip new file mode 100644 index 000000000..cd750af8e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_29_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_3_2010.zip b/fannie/legacy/inventory/archive/invoice_5_3_2010.zip new file mode 100644 index 000000000..88457670e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_3_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_4_2010.zip b/fannie/legacy/inventory/archive/invoice_5_4_2010.zip new file mode 100644 index 000000000..c4d6bffc6 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_4_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_5_2010.zip b/fannie/legacy/inventory/archive/invoice_5_5_2010.zip new file mode 100644 index 000000000..db880bfcc Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_5_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_6_2010.zip b/fannie/legacy/inventory/archive/invoice_5_6_2010.zip new file mode 100644 index 000000000..726231c0c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_6_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_7_2010.zip b/fannie/legacy/inventory/archive/invoice_5_7_2010.zip new file mode 100644 index 000000000..5a8ebf26b Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_7_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_5_8_2010.zip b/fannie/legacy/inventory/archive/invoice_5_8_2010.zip new file mode 100644 index 000000000..d30a1806c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_5_8_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_10_2010.zip b/fannie/legacy/inventory/archive/invoice_6_10_2010.zip new file mode 100644 index 000000000..588ae0f7b Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_10_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_12_2010.zip b/fannie/legacy/inventory/archive/invoice_6_12_2010.zip new file mode 100644 index 000000000..8f6f9e4ff Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_12_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_14_2010.zip b/fannie/legacy/inventory/archive/invoice_6_14_2010.zip new file mode 100644 index 000000000..9c03bca48 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_14_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_15_2010.zip b/fannie/legacy/inventory/archive/invoice_6_15_2010.zip new file mode 100644 index 000000000..d9e2a75fb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_15_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_17_2010.zip b/fannie/legacy/inventory/archive/invoice_6_17_2010.zip new file mode 100644 index 000000000..47493ba09 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_17_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_18_2010.zip b/fannie/legacy/inventory/archive/invoice_6_18_2010.zip new file mode 100644 index 000000000..667afaab3 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_18_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_19_2010.zip b/fannie/legacy/inventory/archive/invoice_6_19_2010.zip new file mode 100644 index 000000000..21acb5020 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_19_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_1_2010.zip b/fannie/legacy/inventory/archive/invoice_6_1_2010.zip new file mode 100644 index 000000000..3c18290ad Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_1_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_22_2010.zip b/fannie/legacy/inventory/archive/invoice_6_22_2010.zip new file mode 100644 index 000000000..6aff83fc8 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_22_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_23_2010.zip b/fannie/legacy/inventory/archive/invoice_6_23_2010.zip new file mode 100644 index 000000000..300b005a9 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_23_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_24_2010.zip b/fannie/legacy/inventory/archive/invoice_6_24_2010.zip new file mode 100644 index 000000000..0c4756026 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_24_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_25_2010.zip b/fannie/legacy/inventory/archive/invoice_6_25_2010.zip new file mode 100644 index 000000000..278df43e3 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_25_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_26_2010.zip b/fannie/legacy/inventory/archive/invoice_6_26_2010.zip new file mode 100644 index 000000000..9432fe1ed Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_26_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_28_2010.zip b/fannie/legacy/inventory/archive/invoice_6_28_2010.zip new file mode 100644 index 000000000..bd3ad1013 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_28_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_29_2010.zip b/fannie/legacy/inventory/archive/invoice_6_29_2010.zip new file mode 100644 index 000000000..710adf79c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_29_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_30_2010.zip b/fannie/legacy/inventory/archive/invoice_6_30_2010.zip new file mode 100644 index 000000000..a2c091d9a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_30_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_3_2010.zip b/fannie/legacy/inventory/archive/invoice_6_3_2010.zip new file mode 100644 index 000000000..d9bae6cab Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_3_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_5_2010.zip b/fannie/legacy/inventory/archive/invoice_6_5_2010.zip new file mode 100644 index 000000000..fa93ae1df Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_5_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_8_2010.zip b/fannie/legacy/inventory/archive/invoice_6_8_2010.zip new file mode 100644 index 000000000..ffde678ec Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_8_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_6_9_2010.zip b/fannie/legacy/inventory/archive/invoice_6_9_2010.zip new file mode 100644 index 000000000..ebb97adf4 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_6_9_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_10_2010.zip b/fannie/legacy/inventory/archive/invoice_7_10_2010.zip new file mode 100644 index 000000000..5a7f159c6 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_10_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_13_2010.zip b/fannie/legacy/inventory/archive/invoice_7_13_2010.zip new file mode 100644 index 000000000..196d910cb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_13_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_14_2010.zip b/fannie/legacy/inventory/archive/invoice_7_14_2010.zip new file mode 100644 index 000000000..bcb0e34fc Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_14_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_15_2010.zip b/fannie/legacy/inventory/archive/invoice_7_15_2010.zip new file mode 100644 index 000000000..f84e9d8c4 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_15_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_16_2010.zip b/fannie/legacy/inventory/archive/invoice_7_16_2010.zip new file mode 100644 index 000000000..edd482bdc Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_16_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_17_2010.zip b/fannie/legacy/inventory/archive/invoice_7_17_2010.zip new file mode 100644 index 000000000..95abe8c19 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_17_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_19_2010.zip b/fannie/legacy/inventory/archive/invoice_7_19_2010.zip new file mode 100644 index 000000000..c10e57687 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_19_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_1_2010.zip b/fannie/legacy/inventory/archive/invoice_7_1_2010.zip new file mode 100644 index 000000000..49745afc8 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_1_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_20_2010.zip b/fannie/legacy/inventory/archive/invoice_7_20_2010.zip new file mode 100644 index 000000000..c9af2209f Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_20_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_21_2010.zip b/fannie/legacy/inventory/archive/invoice_7_21_2010.zip new file mode 100644 index 000000000..07c3cabdf Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_21_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_22_2010.zip b/fannie/legacy/inventory/archive/invoice_7_22_2010.zip new file mode 100644 index 000000000..69f708a7d Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_22_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_24_2010.zip b/fannie/legacy/inventory/archive/invoice_7_24_2010.zip new file mode 100644 index 000000000..a302466cf Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_24_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_27_2010.zip b/fannie/legacy/inventory/archive/invoice_7_27_2010.zip new file mode 100644 index 000000000..8fc72b796 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_27_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_28_2010.zip b/fannie/legacy/inventory/archive/invoice_7_28_2010.zip new file mode 100644 index 000000000..04954ce41 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_28_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_29_2010.zip b/fannie/legacy/inventory/archive/invoice_7_29_2010.zip new file mode 100644 index 000000000..8a1db497e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_29_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_30_2010.zip b/fannie/legacy/inventory/archive/invoice_7_30_2010.zip new file mode 100644 index 000000000..aff2164e7 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_30_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_31_2010.zip b/fannie/legacy/inventory/archive/invoice_7_31_2010.zip new file mode 100644 index 000000000..b82b78d86 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_31_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_3_2010.zip b/fannie/legacy/inventory/archive/invoice_7_3_2010.zip new file mode 100644 index 000000000..8c2b408d9 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_3_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_6_2010.zip b/fannie/legacy/inventory/archive/invoice_7_6_2010.zip new file mode 100644 index 000000000..e2dc53fed Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_6_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_7_2010.zip b/fannie/legacy/inventory/archive/invoice_7_7_2010.zip new file mode 100644 index 000000000..03c24ed2c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_7_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_8_2010.zip b/fannie/legacy/inventory/archive/invoice_7_8_2010.zip new file mode 100644 index 000000000..e870fbe5a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_8_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_7_9_2010.zip b/fannie/legacy/inventory/archive/invoice_7_9_2010.zip new file mode 100644 index 000000000..7a83c6052 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_7_9_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_10_2010.zip b/fannie/legacy/inventory/archive/invoice_8_10_2010.zip new file mode 100644 index 000000000..d20a1c22a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_10_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_11_2010.zip b/fannie/legacy/inventory/archive/invoice_8_11_2010.zip new file mode 100644 index 000000000..c6a8bee4c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_11_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_12_2010.zip b/fannie/legacy/inventory/archive/invoice_8_12_2010.zip new file mode 100644 index 000000000..145e5ba08 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_12_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_13_2010.zip b/fannie/legacy/inventory/archive/invoice_8_13_2010.zip new file mode 100644 index 000000000..0ad250903 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_13_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_14_2010.zip b/fannie/legacy/inventory/archive/invoice_8_14_2010.zip new file mode 100644 index 000000000..c50ce7741 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_14_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_17_2010.zip b/fannie/legacy/inventory/archive/invoice_8_17_2010.zip new file mode 100644 index 000000000..1a1bcab8e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_17_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_19_2010.zip b/fannie/legacy/inventory/archive/invoice_8_19_2010.zip new file mode 100644 index 000000000..39bfc4a2a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_19_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_20_2010.zip b/fannie/legacy/inventory/archive/invoice_8_20_2010.zip new file mode 100644 index 000000000..d12338d14 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_20_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_21_2010.zip b/fannie/legacy/inventory/archive/invoice_8_21_2010.zip new file mode 100644 index 000000000..651210751 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_21_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_23_2010.zip b/fannie/legacy/inventory/archive/invoice_8_23_2010.zip new file mode 100644 index 000000000..0aadc6bec Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_23_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_24_2010.zip b/fannie/legacy/inventory/archive/invoice_8_24_2010.zip new file mode 100644 index 000000000..cd4e9f058 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_24_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_25_2010.zip b/fannie/legacy/inventory/archive/invoice_8_25_2010.zip new file mode 100644 index 000000000..a7bf479bc Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_25_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_26_2010.zip b/fannie/legacy/inventory/archive/invoice_8_26_2010.zip new file mode 100644 index 000000000..85c45350a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_26_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_28_2010.zip b/fannie/legacy/inventory/archive/invoice_8_28_2010.zip new file mode 100644 index 000000000..1fd548c7b Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_28_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_2_2010.zip b/fannie/legacy/inventory/archive/invoice_8_2_2010.zip new file mode 100644 index 000000000..a8b64e03d Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_2_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_30_2010.zip b/fannie/legacy/inventory/archive/invoice_8_30_2010.zip new file mode 100644 index 000000000..e23552f1b Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_30_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_31_2010.zip b/fannie/legacy/inventory/archive/invoice_8_31_2010.zip new file mode 100644 index 000000000..f1501a84d Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_31_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_3_2010.zip b/fannie/legacy/inventory/archive/invoice_8_3_2010.zip new file mode 100644 index 000000000..d46a7114e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_3_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_4_2010.zip b/fannie/legacy/inventory/archive/invoice_8_4_2010.zip new file mode 100644 index 000000000..c83eead53 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_4_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_5_2010.zip b/fannie/legacy/inventory/archive/invoice_8_5_2010.zip new file mode 100644 index 000000000..77fca95ff Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_5_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_8_7_2010.zip b/fannie/legacy/inventory/archive/invoice_8_7_2010.zip new file mode 100644 index 000000000..065c8bbba Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_8_7_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_10_2010.zip b/fannie/legacy/inventory/archive/invoice_9_10_2010.zip new file mode 100644 index 000000000..9c4d75afb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_10_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_11_2010.zip b/fannie/legacy/inventory/archive/invoice_9_11_2010.zip new file mode 100644 index 000000000..d59e91ff3 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_11_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_13_2010.zip b/fannie/legacy/inventory/archive/invoice_9_13_2010.zip new file mode 100644 index 000000000..bcd93ce5c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_13_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_14_2010.zip b/fannie/legacy/inventory/archive/invoice_9_14_2010.zip new file mode 100644 index 000000000..1b6c0d5bf Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_14_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_15_2010.zip b/fannie/legacy/inventory/archive/invoice_9_15_2010.zip new file mode 100644 index 000000000..bc3d5303f Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_15_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_16_2010.zip b/fannie/legacy/inventory/archive/invoice_9_16_2010.zip new file mode 100644 index 000000000..e0ae58edf Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_16_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_17_2010.zip b/fannie/legacy/inventory/archive/invoice_9_17_2010.zip new file mode 100644 index 000000000..c1361b4be Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_17_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_18_2010.zip b/fannie/legacy/inventory/archive/invoice_9_18_2010.zip new file mode 100644 index 000000000..000d38bee Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_18_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_21_2010.zip b/fannie/legacy/inventory/archive/invoice_9_21_2010.zip new file mode 100644 index 000000000..1b9a83150 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_21_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_22_2010.zip b/fannie/legacy/inventory/archive/invoice_9_22_2010.zip new file mode 100644 index 000000000..9c4e71a35 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_22_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_23_2010.zip b/fannie/legacy/inventory/archive/invoice_9_23_2010.zip new file mode 100644 index 000000000..6580d5c4e Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_23_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_25_2010.zip b/fannie/legacy/inventory/archive/invoice_9_25_2010.zip new file mode 100644 index 000000000..0b0fac803 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_25_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_28_2010.zip b/fannie/legacy/inventory/archive/invoice_9_28_2010.zip new file mode 100644 index 000000000..543d71fa7 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_28_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_29_2010.zip b/fannie/legacy/inventory/archive/invoice_9_29_2010.zip new file mode 100644 index 000000000..9bf689b92 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_29_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_2_2010.zip b/fannie/legacy/inventory/archive/invoice_9_2_2010.zip new file mode 100644 index 000000000..594213410 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_2_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_30_2010.zip b/fannie/legacy/inventory/archive/invoice_9_30_2010.zip new file mode 100644 index 000000000..306e5a3e4 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_30_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_3_2010.zip b/fannie/legacy/inventory/archive/invoice_9_3_2010.zip new file mode 100644 index 000000000..0d4446f7c Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_3_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_4_2010.zip b/fannie/legacy/inventory/archive/invoice_9_4_2010.zip new file mode 100644 index 000000000..27c1693d1 Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_4_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_7_2010.zip b/fannie/legacy/inventory/archive/invoice_9_7_2010.zip new file mode 100644 index 000000000..fbef8a2fb Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_7_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_8_2010.zip b/fannie/legacy/inventory/archive/invoice_9_8_2010.zip new file mode 100644 index 000000000..eba473d3f Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_8_2010.zip differ diff --git a/fannie/legacy/inventory/archive/invoice_9_9_2010.zip b/fannie/legacy/inventory/archive/invoice_9_9_2010.zip new file mode 100644 index 000000000..2289c962a Binary files /dev/null and b/fannie/legacy/inventory/archive/invoice_9_9_2010.zip differ diff --git a/fannie/legacy/inventory/invoice.php b/fannie/legacy/inventory/invoice.php new file mode 100644 index 000000000..4b37d6b98 --- /dev/null +++ b/fannie/legacy/inventory/invoice.php @@ -0,0 +1,184 @@ +"; + echo "
        + +
        + +
        "; + echo "Invoice: "; + echo ""; + echo "

        "; + echo "Filters: "; + echo ""; + echo " "; + + echo ""; + echo "
        "; + echo "Vendor Categories"; + echo "
        "; + $q = "SELECT deptID,name FROM vendorDepartments WHERE vendorID=".((int)$vendor)." + ORDER BY deptID"; + $r = $dbc->query($q); + echo ""; + $i = 0; + while($w = $dbc->fetch_row($r)){ + if ($i % 2 == 0){ + if ($i != 0) echo ""; + echo ""; + } + echo ""; + echo ""; + $i++; + } + echo "
        $w[1]
        "; + echo "
        "; +} + +$query = "select i.upc,v.brand, + case when p.description is null then v.description + else p.description end as description, + d.vendorName,i.quantity,v.units, + i.quantity/v.units as cases,i.price + from invDelivery as i + inner join vendorItems as v + on i.upc=v.upc left join + vendors as d on i.vendor_id=d.vendorID + left join products as p on + i.upc=p.upc left join + MasterSuperDepts as m ON + p.department=m.dept_ID + where datediff(dd,inv_date,".$dbc->escape($date).")=0 + and vendor_id=".((int)$vendor); +if (isset($_REQUEST['super']) && !empty($_REQUEST['super'])) + $query .= " AND m.superID=".((int)($_REQUEST['super'])); +if (count($vdepts) > 0){ + $query .= " AND v.vendorDept IN ("; + foreach($vdepts as $k=>$v) + $query .= ((int)$v).","; + $query = substr($query,0,strlen($query)-1).")"; +} +$query .= " ORDER BY i.upc"; + +if (isset($_REQUEST['po'])){ + $name = "Auto ".date("m/d/y"); + $poQ = "INSERT INTO PurchaseOrder (name,stamp) + VALUES ('$name',".$dbc->now().")"; + $dbc->query($poQ); + + $idQ = "SELECT MAX(id) FROM PurchaseOrder + WHERE name='$name'"; + $idR = $dbc->query($idQ); + $id = array_pop($dbc->fetch_row($idR)); + + $result = $dbc->query($query); + while($row = $dbc->fetch_row($result)){ + $q = sprintf("INSERT INTO PurchaseOrderItems (upc,vendor_id, + order_id,quantity) VALUES (%s,%d,%d,%d)", + $dbc->escape($row['upc']),$vendor,$id,$row['cases']); + $dbc->query($q); + } + header("Location: purchase.php"); + exit; +} + +ob_start(); + +echo ""; +echo " +"; +$result = $dbc->query($query); +while($row = $dbc->fetch_row($result)){ + printf(" + ", + $row['upc'],$row['brand'],$row['description'], + $row['vendorName'],$row['quantity'],$row['units'], + $row['cases'],$row['price']); +} +echo "
        UPCBrandDescVendorQtyPackCasesPrice
        %s%s%s%s%d%d%d%.2f
        "; + +$data = ob_get_contents(); +ob_end_clean(); + +if (!isset($_REQUEST['excel'])){ + echo $data; + printf("",$vendor); + echo ""; + include($FANNIE_ROOT.'src/footer.html'); +} +else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToCsv.php'); + + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="invoice '.$date.'.csv"'); + + $html = HtmlToArray($data); + $csv = ArrayToCsv($html); + echo $csv; +} +?> diff --git a/fannie/legacy/inventory/item.php b/fannie/legacy/inventory/item.php new file mode 100644 index 000000000..884f7ddca --- /dev/null +++ b/fannie/legacy/inventory/item.php @@ -0,0 +1,133 @@ +escape($upc); +$result = $dbc->query($query); + +if ($dbc->num_rows($result) == 0){ + echo "Error: no inventory info for this item"; +} +else { + $row = $dbc->fetch_row($result); + + echo "Product Information"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        UPC".$row['upc']."Desc".$row['description']."
        Brand".$row['brand']."Vendor".$row['vendorName']."
        Unit size".$row['size']."Pack".$row['units']."
        "; + + echo "
        "; + + echo "Inventory"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Qty OrderedQty SoldAdj.Est. Stock
        ".$row['OrderedQty']."".$row['SoldQty']."".$row['Adjustments']."".$row['CurrentStock']."
        "; + echo "Last adjustment: ".$row['LastAdjustDate'].""; + + echo "

        "; + + echo "Order History"; + echo ""; + echo " + "; + + $query = "select inv_date,quantity,price,v.vendorName, + i.vendor_id + from InvDelivery as i + left join vendors as v + on i.vendor_id = v.vendorID + where upc=".$dbc->escape($upc)." + union all + select inv_date,quantity,price,v.vendorName, + i.vendor_id + from InvDeliveryLM as i + left join vendors as v + on i.vendor_id = v.vendorID + where upc=".$dbc->escape($upc)." + order by inv_date desc"; + $result = $dbc->query($query); + while($row = $dbc->fetch_row($result)){ + $tmp = explode(' ',$row['inv_date']); + $row['inv_date'] = $tmp[0]; + printf(" + ", + $row['inv_date'],$row['vendor_id'], + $row['inv_date'],$row['quantity'],$row['price'], + $row['vendorName']); + } + + $query = "select year(inv_date),month(inv_date),quantity,price,v.vendorName + from InvDeliveryArchive as i + left join vendors as v + on i.vendor_id = v.vendorID + where upc=".$dbc->escape($upc)." + order by inv_date desc"; + $result = $dbc->query($query); + while($row = $dbc->fetch_row($result)){ + printf("", + date('M Y',mktime(0,0,0,$row[1],1,$row[0])), + $row['quantity'],$row['price'], + $row['vendorName']); + } + echo "
        Invoice DateQtyPriceVendor
        %s%d%.2f%s
        %s%d%.2f%s
        "; +} + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/legacy/inventory/purchase.php b/fannie/legacy/inventory/purchase.php new file mode 100644 index 000000000..0e6a81d1f --- /dev/null +++ b/fannie/legacy/inventory/purchase.php @@ -0,0 +1,144 @@ +query($q); + + ob_start(); + echo ""; + echo " + + "; + $eans = array(); + while($w = $dbc->fetch_row($r)){ + $upc = ltrim($w['upc'],'0'); + if (strlen($upc) > 11 ){ + $upc = Ean13CheckDigit($upc); + $eans[$upc] = $w['quantity']; + // scan genius can't mix/match EAN13 and + // UPC-A. If downloading, stick EANs + // in a separate file + if (isset($_REQUEST['save'])) + continue; + } + else { + $upc = UpcACheckDigit($upc); + } + printf(" + + ",$upc,$w['quantity'], + $w['vendorName'],$w['brand'],$w['description'], + $w['size'],$w['units']); + } + echo "
        UPCCasesVendorBrandDescSizePack
        %s%d%s%s%s%s%d
        "; + + $str = ob_get_contents(); + ob_end_clean(); + + if (!isset($_REQUEST['save'])){ + echo $str; + printf("Download Order",$_REQUEST['oid']); + } + else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToCsv.php'); + $arr = HtmlToArray($str); + $csv = ArrayToCsv($arr); + + if (count($eans)==0){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="purchaseorder.csv"'); + echo $csv; + } + else { + // Create separate UPC and EAN CSVs + // and zip them up for download + $upcfn = tempnam(sys_get_temp_dir(),''); + $fp = fopen($upcfn,'w'); + fwrite($fp,$csv); + fclose($fp); + + $eanfn = tempnam(sys_get_temp_dir(),''); + $fp = fopen($eanfn,'w'); + fwrite($fp,"\"EAN\",\"Cases\"\r\n"); + foreach($eans as $k=>$v){ + fwrite($fp,"\"$k\",\"$v\"\r\n"); + } + fclose($fp); + + $zip = new ZipArchive(); + $zfn = tempnam(sys_get_temp_dir(),''); + $zip->open($zfn, ZipArchive::CREATE); + $zip->addEmptyDir('PurchaseOrder'); + $zip->addFile($upcfn,'PurchaseOrder/order.upc.csv'); + $zip->addFile($eanfn,'PurchaseOrder/order.ean.csv'); + $zip->close(); + + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="PurchaseOrder.zip"'); + header('Content-Transfer-Encoding: binary'); + readfile($zfn); + + unlink($upcfn); + unlink($eanfn); + unlink($zfn); + } + exit; + } +} +else { + $q = "SELECT id,name,stamp FROM PurchaseOrder + ORDER BY stamp desc"; + $r = $dbc->query($q); + echo ""; + while($w = $dbc->fetch_row($r)){ + printf("", + $w['id'],$w['name'],$w['stamp']); + } + echo "
        %s + %s
        "; +} + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/legacy/inventory/recent.php b/fannie/legacy/inventory/recent.php new file mode 100644 index 000000000..05ff431d9 --- /dev/null +++ b/fannie/legacy/inventory/recent.php @@ -0,0 +1,68 @@ +query($query); + +echo ""; +echo " + +"; +while($row = $dbc->fetch_row($result)){ + printf(" + + + + + + ",$row['upc'],$row['upc'],$row['brand'], + $row['description'], + array_shift(explode(' ',$row['inv_date'])), + $row['orderQty'], + $row['soldQty'], + $row['orderQty'] - $row['soldQty'], + $row['caseQty']); +} +echo "
        UPCBrandDescriptionLast OrderedQty OrderedQty SoldDiffCase Qty
        %s%s%s%s%d%d%d%d
        "; + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/legacy/inventory/unfidownload.py b/fannie/legacy/inventory/unfidownload.py new file mode 100755 index 000000000..e9adc3263 --- /dev/null +++ b/fannie/legacy/inventory/unfidownload.py @@ -0,0 +1,105 @@ +#!/usr/bin/python + +import cookielib,urllib2,urllib +import re + +# CONFIGURATION +# Put in your username and password +# Choose what type you'd like cownloaded (CSV, TAB, or FLAT) +# Choose which directory downloads should be stored in (w/ trailing slash) +# Requires python >= 2.4 +TYPE="CSV" +USERNAME="" +PASSWORD="" +DL_DIR="csvs/" + +LOGIN_URL="http://www.unfi.com/Default.aspx" +LOGIN_CB_URL="https://east.unfi.com/public/LogonPost.aspx" +INVOICE_URL="http://east.unfi.com/invoices/listinvoices2.aspx" +TYPES = { "CSV":"rdoCSV","TAB":"rdoTab","FLAT":"rdoFlat" } + +cj = cookielib.CookieJar() +opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) +fp = opener.open(LOGIN_URL) + +vs_pat = re.compile("id=\"__VIEWSTATE\" value=\"(.*?)\"") +ev_pat = re.compile("id=\"__EVENTVALIDATION\" value=\"(.*?)\"") +pv_pat = re.compile("id=\"__PREVIOUSPAGE\" value=\"(.*?)\"") +args = [] +#print "Getting hidden input values for login" +# __VIEWSTATS and __EVENTVALIDATION are required POST arguments +for line in fp.readlines(): + match = vs_pat.search(line) + if match: + args.append(("__VIEWSTATE",match.group(1))) + + match = ev_pat.search(line) + if match: + args.append(("__EVENTVALIDATION",match.group(1))) + + match = pv_pat.search(line) + if match: + args.append(("__PREVIOUSPAGE",match.group(1))) + + if len(args) >= 3: break +fp.close() + +# add remaining POST arguments +args.append(("__EVENTTARGET","")) +args.append(("__EVENTARGUMENT","")) +args.append(("__LASTFOCUS","")) +args.append(("ctl00$PlaceHolderMain$ucLogin$rblCustSupp","0")) +args.append(("ctl00$PlaceHolderMain$ucLogin$txtUserName",USERNAME)) +args.append(("ctl00$PlaceHolderMain$ucLogin$txtPassword",PASSWORD)) +args.append(("ctl00$PlaceHolderMain$ucLogin$btnLogin","Login")) +args.append(("ctl00$PlaceHolderMain$ucLogin$ddlWarehouses","E-8")) + +#print "Logging in" +fp = opener.open(LOGIN_CB_URL,urllib.urlencode(args)) +fp.close() + +fp = opener.open(INVOICE_URL) +args = [] +dates = [] +opt_pat = re.compile("option value=\"(.*?)\"") +#print "Getting available invoice dates" +# Again, __VIEWSTATE and __EVENTVALIDATION are required +# Also get available invoice dates from the ',$row['card_no']); + echo ''; + echo ''; + echo ''; + printf('',$row['name']); + echo ''; + printf('',$row['phone']); + echo ''; + printf('',$row['email']); + echo ''; + printf('',$row['guest_count']); + echo ''; + printf('',$row['child_count']); + $nQ = "SELECT notes FROM regNotes WHERE card_no=".$row['card_no']; + $nR = $dbc->query($nQ); + $notes = array_pop($dbc->fetch_row($nR)); + echo ''; + echo ''; + echo '
        Owner #'.$row['card_no'].'
        Name%s
        Ph #%s
        Email%s
        # Guests%d
        # Kids%d
        Notes'.str_replace("\n","
        ",$notes).'

        '; + $m1Q = sprintf("SELECT subtype FROM regMeals WHERE card_no=%d AND type='OWNER'",$row['card_no']); + $m2Q = sprintf("SELECT subtype FROM regMeals WHERE card_no=%d AND type='GUEST'",$row['card_no']); + $m3Q = sprintf("SELECT * FROM regMeals WHERE card_no=%d AND type='CHILD'",$row['card_no']); + $m1R = $dbc->query($m1Q); + $m2R = $dbc->query($m2Q); + $m3R = $dbc->query($m3Q); + $meals = array(1=>"Chicken",2=>"Curry"); + echo 'Owner Meal: '; + $om = array_pop($dbc->fetch_row($m1R)); + foreach($meals as $k=>$v){ + if ($k==$om) echo $v; + } + echo '

        '; + for($i=0;$i<$dbc->num_rows($m2R);$i++){ + $w = $dbc->fetch_row($m2R); + echo 'Guest Meal '.($i+1).': '; + foreach($meals as $k=>$v){ + if ($k==$w[0]) echo $v; + } + echo '

        '; + } + $kids = 0; + for($kids;$kids<$dbc->num_rows($m3R);$kids++){ + echo 'Child Meal '.($kids+1).': Spaghetti'; + echo '

        '; + } + for($kids;$kids<$row['child_count'];$kids++){ + echo 'Child Meal '.($kids+1).': None'; + echo '

        '; + } +} + +?> diff --git a/fannie/legacy/it/AnnualMeeting/index.php b/fannie/legacy/it/AnnualMeeting/index.php new file mode 100644 index 000000000..99d886255 --- /dev/null +++ b/fannie/legacy/it/AnnualMeeting/index.php @@ -0,0 +1,264 @@ +now(),$_REQUEST['card_no'],$dbc->escape($_REQUEST['fullname']), + $dbc->escape($_REQUEST['ph']),$dbc->escape($_REQUEST['email']), + $_REQUEST['guests'],$_REQUEST['kids']); + $r = $dbc->query($q); + $dbc->query(sprintf("DELETE FROM regMeals WHERE card_no=%d",$_REQUEST['card_no'])); + $q = sprintf("INSERT INTO regMeals (card_no,type,subtype) VALUES (%d,'OWNER',%d)", + $_REQUEST['card_no'],$_REQUEST['meals'][0]); + $r = $dbc->query($q); + for($i=0;$i<$_REQUEST['guests'];$i++){ + $q = sprintf("INSERT INTO regMeals (card_no,type,subtype) VALUES (%d,'GUEST',1)", + $_REQUEST['card_no']); + $r = $dbc->query($q); + } + + $dbc->query(sprintf("INSERT INTO regNotes VALUES (%d,NOW(),%s)", + $_REQUEST['card_no'],$dbc->escape($_REQUEST['regNotes']) + )); + } + else if (isset($_REQUEST['upBtn'])){ + $q = sprintf("UPDATE registrations SET name=%s,phone=%s,email=%s,guest_count=%d, + child_count=%d WHERE card_no=%d",$dbc->escape($_REQUEST['fullname']), + $dbc->escape($_REQUEST['ph']),$dbc->escape($_REQUEST['email']), + $_REQUEST['guests'],$_REQUEST['kids'],$_REQUEST['card_no']); + $r = $dbc->query($q); + $dbc->query(sprintf("DELETE FROM regMeals WHERE card_no=%d",$_REQUEST['card_no'])); + for($i=0;$iquery($q); + } + for($i=0;$iquery($q); + } + + if (empty($_REQUEST['fullname']) && empty($_REQUEST['ph']) && empty($_REQUEST['email'])){ + $dbc->query(sprintf("DELETE FROM registrations WHERE card_no=%d",$_REQUEST['card_no'])); + $dbc->query(sprintf("DELETE FROM regMeals WHERE card_no=%d",$_REQUEST['card_no'])); + } + + $dbc->query(sprintf("DELETE FROM regNotes WHERE card_no=%d",$_REQUEST['card_no'])); + $dbc->query(sprintf("INSERT INTO regNotes VALUES (%d,NOW(),%s)", + $_REQUEST['card_no'],$dbc->escape($_REQUEST['regNotes']) + )); + } + echo 'Registration Saved

        '; + showForm($_REQUEST['card_no']); +} +else if (isset($_REQUEST['memnum'])){ + if (!empty($_REQUEST['memnum'])){ + $q1 = sprintf("SELECT CardNo FROM custdata WHERE CardNo=%d",$_REQUEST['memnum']); + $r1 = $dbc->query($q1); + $cn = -1; + if ($dbc->num_rows($r1) == 0){ + $upc = str_pad($_REQUEST['memnum'],13,'0',STR_PAD_LEFT); + $q2 = sprintf("SELECT card_no membercards WHERE upc=%s",$dbc->escape($upc)); + $r2 = $dbc->query($q2); + if ($dbc->num_rows($r2)==0){ + echo 'Account not found

        '; + echo ''; + } + else + $cn = array_pop($dbc->fetch_row($r2)); + } + else + $cn = array_pop($dbc->fetch_row($r1)); + if ($cn != -1) + showForm($cn); + } + else if (!empty($_REQUEST['ln'])){ + $q1 = sprintf("SELECT CardNo,LastName,FirstName FROM custdata WHERE LastName LIKE %s", + $dbc->escape($_REQUEST['ln'].'%')); + if (!empty($_REQUEST['fn'])) + $q1 .= sprintf(" AND FirstName LIKE %s",$dbc->escape($_REQUEST['fn'].'%')); + $r1 = $dbc->query($q1); + if ($dbc->num_rows($r1) == 1){ + showForm(array_pop($dbc->fetch_row($r1))); + } + else if ($dbc->num_rows($r1) == 0){ + $q2 = sprintf("SELECT CardNo,LastName,FirstName FROM custdata WHERE LastName LIKE %s", + $dbc->escape('%'.$_REQUEST['ln'].'%')); + if (!empty($_REQUEST['fn'])) + $q2 .= sprintf(" AND FirstName LIKE %s",$dbc->escape('%'.$_REQUEST['fn'].'%')); + $r2 = $dbc->query($q2); + if ($dbc->num_rows($r2) == 1){ + showForm(array_pop($dbc->fetch_row($r2))); + } + else if ($dbc->num_rows($r2) == 0){ + echo 'Account not found

        '; + echo ''; + } + else + multipleMatches($r2); + } + else + multipleMatches($r1); + } +} +else { + echo '

        '; + echo '# or UPC

        '; + echo 'Last Name '; + echo 'First Name '; + echo '

        '; + echo ''; + echo '
        '; +} +include($FANNIE_ROOT.'src/footer.html'); + +function showForm($cn){ + global $dbc; + $chkQ = sprintf("SELECT * FROM registrations WHERE card_no=%d",$cn); + $chkR = $dbc->query($chkQ); + if ($dbc->num_rows($chkR)==0){ + showNewForm($cn); + } + else{ + $data = $dbc->fetch_row($chkR); + showUpdateForm($data); + } +} + +function showNewForm($cn){ + echo '
        '; + printf('',$cn); + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
        Owner #'.$cn.'
        Name
        Ph #
        Email
        # Guests
        # Kids
        Notes

        '; + echo 'Owner Meal: '; + echo '

        '; + echo ''; + echo '    '; + echo ''; + echo '
        '; +} + +function showUpdateForm($row){ + global $dbc; + if (True || $row['paid']==0){ + echo '
        '; + } + else { + echo 'This registration was paid online'; + } + printf('',$row['card_no']); + echo ''; + echo ''; + echo ''; + printf('',$row['name']); + echo ''; + printf('',$row['phone']); + echo ''; + printf('',$row['email']); + echo ''; + printf('',$row['guest_count']); + echo ''; + printf('',$row['child_count']); + $nQ = "SELECT notes FROM regNotes WHERE card_no=".$row['card_no']; + $nR = $dbc->query($nQ); + $notes = array_pop($dbc->fetch_row($nR)); + echo ''; + echo ''; + echo '
        Owner #'.$row['card_no'].'
        Name
        Ph #
        Email
        # Guests
        # Kids
        Notes

        '; + $m1Q = sprintf("SELECT subtype FROM regMeals WHERE card_no=%d AND type='OWNER'",$row['card_no']); + $m2Q = sprintf("SELECT subtype FROM regMeals WHERE card_no=%d AND type='GUEST'",$row['card_no']); + $m3Q = sprintf("SELECT * FROM regMeals WHERE card_no=%d AND type='CHILD'",$row['card_no']); + $m1R = $dbc->query($m1Q); + $m2R = $dbc->query($m2Q); + $m3R = $dbc->query($m3Q); + $meals = array(1=>"Chicken",2=>"Curry"); + echo 'Owner Meal: '; + echo '

        '; + for($i=0;$i<$dbc->num_rows($m2R);$i++){ + $w = $dbc->fetch_row($m2R); + echo 'Guest Meal '.($i+1).': '; + echo '

        '; + } + $kids = 0; + for($kids;$kids<$dbc->num_rows($m3R);$kids++){ + echo 'Child Meal '.($kids+1).': '; + echo '

        '; + } + for($kids;$kids<$row['child_count'];$kids++){ + echo 'Child Meal '.($kids+1).': '; + echo '

        '; + } + + if (True || $row['paid'] == 0){ + echo ''; + echo '    '; + echo ''; + echo '    '; + echo ''; + echo '
        '; + } +} + +function multipleMatches($r){ + global $dbc; + echo 'Multiple matching accounts: '; + echo '

        '; + echo ''; +} + +?> diff --git a/fannie/legacy/it/AnnualMeeting/report.php b/fannie/legacy/it/AnnualMeeting/report.php new file mode 100644 index 000000000..452d93f26 --- /dev/null +++ b/fannie/legacy/it/AnnualMeeting/report.php @@ -0,0 +1,87 @@ +Save as Excel

        '; +} + +$q = "SELECT tdate,r.card_no,name,email, + phone,guest_count,child_count, + SUM(CASE WHEN m.subtype=1 THEN 1 ELSE 0 END) as chicken, + SUM(CASE WHEN m.subtype=2 THEN 1 ELSE 0 END) as veg + FROM registrations AS r LEFT JOIN + regMeals AS m ON r.card_no=m.card_no + GROUP BY tdate,r.card_no,name,email, + phone,guest_count,child_count + ORDER BY tdate"; +$r = $dbc->query($q); +echo ' + + + + + '; +$sum = 0; +$ksum = 0; +$xsum = 0; +$vsum = 0; +while($w = $dbc->fetch_row($r)){ + if (!strstr($w['email'],'@') && !preg_match('/\d+/',$w['email']) && + $w['email'] != 'no email'){ + $w['name'] .= ' '.$w['email']; + $w['email'] = ''; + } + $ln = ""; $fn=""; + if (strstr($w['name'],' ')){ + $w['name'] = trim($w['name']); + $parts = explode(' ',$w['name']); + if (count($parts) > 1){ + $ln = $parts[count($parts)-1]; + for($i=0;$i 0) + $ln = $parts[0]; + } + else + $ln = $w['name']; + printf(' + + ', + $w['tdate'],$w['card_no'],$ln,$fn,$w['email'], + $w['phone'],$w['guest_count']+1,$w['chicken'],$w['veg'],$w['child_count'], + (isset($_REQUEST['excel'])?'':'Details') + ); + $sum += ($w['guest_count']+1); + $ksum += $w['child_count']; + $xsum += $w['chicken']; + $vsum += $w['veg']; +} +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo '
        Reg. DateOwner#Last NameFirst NameEmailPh.AdultsChickenCurryKidsDetails
        %s%d%s%s%s%s%d%d%d%d%s
        Totals'.$sum.''.$xsum.''.$vsum.''.$ksum.' 
        '; + +if (isset($_REQUEST['excel'])){ + $output = ob_get_contents(); + ob_end_clean(); + + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $array = HtmlToArray($output); + $xls = ArrayToXls($array); + + echo $xls; +} + +?> diff --git a/fannie/legacy/it/ApplicationTracking/comment.php b/fannie/legacy/it/ApplicationTracking/comment.php new file mode 100644 index 000000000..a5734a3af --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/comment.php @@ -0,0 +1,76 @@ +",$note_text); + $note_text = str_replace("'","\\'",$note_text); + + if ($noteID == -1){ + $insQ = "INSERT INTO notes (appID,note_date,note_text,username) VALUES + ($appID,'$note_date','$note_text','$username')"; + $sql->query($insQ); + } + else { + $upQ = "UPDATE notes SET note_text='$note_text' WHERE noteID=$noteID"; + $sql->query($upQ); + } + + header("Location: /it/ApplicationTracking/view.php?appID=$appID"); + return; +} + +$id = $_GET['id']; +$username = validateUserQuiet('apptracking',0); +if (!$username){ + header("Location: {$FANNIE_RUL}auth/ui/loginform.php?redirect={$FANNIE_URL}legacy/it/ApplicationTracking/comment.php?id=$id"); + return; +} +refreshSession(); + +$temp = explode(":",$id); +$noteID = $temp[0]; +$appID = $temp[1]; + +$note_text = ""; +$note_date = date("Y-m-d"); + +if ($noteID != -1){ + $dataQ = "SELECT note_text,note_date FROM notes WHERE noteID=$noteID"; + $dataR = $sql->query($dataQ); + $dataW = $sql->fetch_row($dataR); + + $note_date = $dataW[1]; + $note_text = str_replace("\\'","'",$dataW[0]); + $note_text = str_replace("
        ","\n",$note_text); +} + +?> + + + Comment + + + +
        +Comment by
        +Date:
        +
        + + + + + + + + diff --git a/fannie/legacy/it/ApplicationTracking/db.php b/fannie/legacy/it/ApplicationTracking/db.php new file mode 100644 index 000000000..91e094171 --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/db.php @@ -0,0 +1,11 @@ + diff --git a/fannie/legacy/it/ApplicationTracking/index.php b/fannie/legacy/it/ApplicationTracking/index.php new file mode 100644 index 000000000..cdebca607 --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/legacy/it/ApplicationTracking/list.php b/fannie/legacy/it/ApplicationTracking/list.php new file mode 100644 index 000000000..e19398571 --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/list.php @@ -0,0 +1,147 @@ + + + + + List of applicants + + + + +query($positionQ); +$positions = array(); +$openings = array(); +while($positionW = $sql->fetch_row($positionR)){ + $positions["$positionW[0]"] = array(False,$positionW[1]); + $openings["$positionW[0]"] = array(False,$positionW[1]); +} + +$deptQ = "select deptID,name from departments order by name"; +$deptR = $sql->query($deptQ); +$depts = array(); +while ($deptW = $sql->fetch_row($deptR)) + $depts["$deptW[0]"] = array(False,$deptW[1]); + +$orderby = "app_date"; +if (isset($_GET["orderby"])) $orderby = $_GET["orderby"]; +$search = ""; +if (isset($_GET["simplesearch"]) && $_GET["simplesearch"] != ""){ + $terms = explode(" ",$_GET["simplesearch"]); + $search = "WHERE "; + foreach($terms as $t) + $search .= "(a.first_name like '%$t%' or a.last_name like '%$t%') AND"; + $search = substr($search,0,strlen($search)-3); +} +if (isset($_GET['advancedsearch'])){ + $search = "WHERE "; + if (isset($_GET['lname'])){ + $terms = explode(" ",$_GET["lname"]); + $search .= "("; + foreach($terms as $t) + $search .= "a.last_name like '%$t%' OR"; + $search = substr($search,0,strlen($search)-2); + $search .= ") AND "; + } + if (isset($_GET['fname'])){ + $terms = explode(" ",$_GET["fname"]); + $search .= "("; + foreach($terms as $t) + $search .= "a.first_name like '%$t%' OR "; + $search = substr($search,0,strlen($search)-3); + $search .= ") AND "; + } + if (isset($_GET["applied_for"])){ + $search .= "("; + foreach($_GET['applied_for'] as $p) + $search .= "positions like '%,$p,%' OR positions like '$p,%' OR positions like '%,$p' OR positions = '$p' OR "; + $search = substr($search,0,strlen($search)-3); + $search .= ") AND "; + } + if (isset($_GET["sent_to"])){ + $search .= "("; + foreach($_GET['sent_to'] as $p) + $search .= "sent_to like '%,$p,%' OR sent_to like '$p,%' OR sent_to like '%,$p' OR sent_to = '$p' OR "; + $search = substr($search,0,strlen($search)-3); + $search .= ") AND "; + } + if ($search == "WHERE ") $search = ""; + else $search = substr($search,0,strlen($search)-4); + + $orderby = $_GET["orderby"]; +} + +$query = "SELECT * FROM applicants as a + LEFT JOIN interview_status as i on a.appID=i.appID + $search + ORDER BY $orderby"; +$result = $sql->query($query); + +echo ""; +echo " "; +echo " Advanced search"; +if ($admin){ + echo " "; +} +echo "
        "; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +if ($admin) echo ""; +while($row = $sql->fetch_row($result)){ + echo ""; + echo ""; + echo ""; + echo ""; + + $str = ""; + foreach(explode(",",$row['positions']) as $p) + $str .= $positions["$p"][1].", "; + $str = substr($str,0,strlen($str)-2); + echo ""; + + $str = ""; + foreach(explode(",",$row['sent_to']) as $p) + $str .= $depts["$p"][1].", "; + $str = substr($str,0,strlen($str)-2); + echo ""; + + echo ""; + echo ""; + + if ($admin){ + echo ""; + } + + echo ""; +} +echo "
        NameApplication
        date
        InternalApplied ForForwarded toBeen
        interviewed
        Future interviews
        scheduled
         "; +echo "
        "; + echo $row['last_name'].", ".$row['first_name']."".$row['app_date']."".(($row['internal']==1)?'YES':'NO')."".$str."".$str."".(($row['pastInterviews'])==1?'YES':'NO')."".(($row['futureInterviews'])==1?'YES':'NO')."
        "; + +?> diff --git a/fannie/legacy/it/ApplicationTracking/newApp.php b/fannie/legacy/it/ApplicationTracking/newApp.php new file mode 100644 index 000000000..f2e1c2725 --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/newApp.php @@ -0,0 +1,188 @@ +query($positionQ); +$positions = array(); +$openings = array(); +while($positionW = $sql->fetch_row($positionR)){ + $positions["$positionW[0]"] = array(False,$positionW[1]); + $openings["$positionW[0]"] = array(False,$positionW[1]); +} + +$deptQ = "select deptID,name from departments order by name"; +$deptR = $sql->query($deptQ); +$depts = array(); +while ($deptW = $sql->fetch_row($deptR)) + $depts["$deptW[0]"] = array(False,$deptW[1]); + +$today = date("Y-m-d"); +$fname = ""; +$lname = ""; +$pc_date = date("Y-m-d"); +$internal = 0; +$bestpractices = 0; +$referral = ""; +$hired = 0; + +$ERRORS = ""; + +$appID = -1; +if (isset($_GET["appID"]) || isset($_POST["appID"])){ + if (isset($_POST["appID"])) $appID = $_POST["appID"]; + else $appID = $_GET["appID"]; + + if (isset($_POST["submit"])){ + if (isset($_POST["appDate"])) $today = $_POST["appDate"]; + if (isset($_POST["fname"])) $fname = $_POST["fname"]; + if (isset($_POST["lname"])) $lname = $_POST["lname"]; + foreach($_POST["applied_for"] as $p) $positions["$p"][0] = True; + foreach($_POST["openings"] as $p) $openings["$p"][0] = True; + foreach($_POST["sent_to"] as $p) $depts["$p"][0] = True; + if (isset($_POST["postcard_date"])) $pc_date = $_POST["postcard_date"]; + if (isset($_POST["internal"])) $internal = 1; + if (isset($_POST["bestpractices"])) $bestpractices = 1; + if (isset($_POST["referral"])) $referral = $_POST["referral"]; + if (isset($_POST["hired"])) $hired = 1; + + if ($pc_date == '') $pc_date = "NULL"; + else $pc_date = "'$pc_date'"; + + $applyStr = ""; + foreach($positions as $k=>$v){ + if ($v[0]) $applyStr .= $k.","; + } + $applyStr = substr($applyStr,0,strlen($applyStr)-1); + + $openStr = ""; + foreach($openings as $k=>$v){ + if ($v[0]) $openStr .= $k.","; + } + $openStr = substr($openStr,0,strlen($openStr)-1); + + $deptStr = ""; + foreach($depts as $k=>$v){ + if ($v[0]) $deptStr .= $k.","; + } + $deptStr = substr($deptStr,0,strlen($deptStr)-1); + + if ($appID == "-1"){ + $insQ = "INSERT INTO applicants (first_name,last_name,app_date,postcard_date,internal, + best_practices,positions,openings,sent_to,referral,hired) VALUES ('$fname','$lname', + '$today',$pc_date,$internal,$bestpractices,'$applyStr','$openStr','$deptStr', + '$referral',$hired)"; + $sql->query($insQ); + } + else { + $upQ = "UPDATE applicants SET + first_name='$fname', + last_name='$lname', + app_date='$today', + postcard_date=$pc_date, + internal=$internal, + best_practices=$bestpractices, + positions='$applyStr', + openings='$openStr', + sent_to='$deptStr', + referral='$referral', + hired=$hired + WHERE appID=$appID"; + echo $upQ; + $sql->query($upQ); + } + } + + $dataQ = "SELECT * FROM applicants WHERE appID=$appID"; + $dataR = $sql->query($dataQ); + if ($sql->num_rows($dataR) == 0 && $appID != -1) + $ERRORS .= "Warning: No data found for applicant #$appID
        "; + else if ($appID != -1){ + $dataW = $sql->fetch_row($dataR); + $fname = $dataW[1]; + $lname = $dataW[2]; + $today = $dataW[3]; + $pc_date = $dataW[4]; + $internal = $dataW[5]; + $bestpractices = $dataW[6]; + foreach(explode(",",$dataW[7]) as $i) $positions["$i"][0] = True; + foreach(explode(",",$dataW[8]) as $i) $openings["$i"][0] = True; + foreach(explode(",",$dataW[9]) as $i) $depts["$i"][0] = True; + $referral = $dataW[10]; + $hired = $dataW[11]; + } +} + +?> + + + + Edit applicant + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Application Date
        First NameLast Name
        Positions applied for + $v) { + echo " $v[1]
        "; + } ?> +
        Curent openings + $v) { + echo " $v[1]
        "; + } ?> +
        Forwarded to
        department managers
        + $v) { + echo " $v[1]
        "; + } ?> +
        Postcard sent
        Internal />
        Best Practices />
        ReferralHired />
        + + + +
        + + diff --git a/fannie/legacy/it/ApplicationTracking/search.php b/fannie/legacy/it/ApplicationTracking/search.php new file mode 100644 index 000000000..f681c5836 --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/search.php @@ -0,0 +1,62 @@ +query($positionQ); +$positions = array(); +$openings = array(); +while($positionW = $sql->fetch_row($positionR)){ + $positions["$positionW[0]"] = array(False,$positionW[1]); + $openings["$positionW[0]"] = array(False,$positionW[1]); +} + +$deptQ = "select deptID,name from departments order by name"; +$deptR = $sql->query($deptQ); +$depts = array(); +while ($deptW = $sql->fetch_row($deptR)) + $depts["$deptW[0]"] = array(False,$deptW[1]); + +?> + + + + Advanced Search + + +
        + + + + + + + + + + + + + + +
        First NameLast Name
        Positions applied for + $v) { + echo " $v[1]
        "; + } ?> +
        Forwarded to + $v) { + echo " $v[1]
        "; + } ?> +
        +Sort by: + + + + diff --git a/fannie/legacy/it/ApplicationTracking/set_interview.php b/fannie/legacy/it/ApplicationTracking/set_interview.php new file mode 100644 index 000000000..f9a69e968 --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/set_interview.php @@ -0,0 +1,80 @@ +fetch_row($sql->query("select appID from interviews where interviewID=$id"))); + switch($_GET['action']){ + case 'fin': + $sql->query("UPDATE interviews SET took_place=1 WHERE interviewID=$id"); + break; + case 'reg': + $sql->query("UPDATE interviews SET sent_regret=1 WHERE interviewID=$id"); + break; + case 'del': + $sql->query("DELETE FROM interviews WHERE interviewID=$id"); + break; + } + header("Location: {$FANNIE_URL}legacy/it/ApplicationTracking/view.php?appID=$appID"); + return; +} + +if (isset($_POST['submit'])){ + + $appID = $_POST['appID']; + $username = $_POST['username']; + $date = $_POST['date']; + + $insQ = "INSERT INTO interviews (scheduled, appID, sent_regret, username,took_place) VALUES + ('$date',$appID,0,'$username',0)"; + $insR = $sql->query($insQ); + + header("Location: {$FANNIE_URL}legacy/it/ApplicationTracking/view.php?appID=$appID"); + return; + +} +else { + +$appID = $_GET['appID']; +$nameQ = "select concat(first_name,' ',last_name) from applicants where appID=$appID"; +$name = array_pop($sql->fetch_row($sql->query($nameQ))); +$username = validateUserQuiet('apptracking',0); +if (!$username){ + header("Location: {$FANNIE_URL}auth/ui/loginform.php?redirect={$FANNIE_URL}legacy/it/ApplicationTracking/set_interview.php?appID=$appID"); + return; +} +refreshSession(); + +?> + + + + Schedule an interview + + + + +
        + + will interview on +
        + + + + +
        +
        + + + + diff --git a/fannie/legacy/it/ApplicationTracking/view.php b/fannie/legacy/it/ApplicationTracking/view.php new file mode 100644 index 000000000..7f28c67ca --- /dev/null +++ b/fannie/legacy/it/ApplicationTracking/view.php @@ -0,0 +1,213 @@ +query($positionQ); +$positions = array(); +$openings = array(); +while($positionW = $sql->fetch_row($positionR)){ + $positions["$positionW[0]"] = array(False,$positionW[1]); + $openings["$positionW[0]"] = array(False,$positionW[1]); +} + +$deptQ = "select deptID,name from departments order by name"; +$deptR = $sql->query($deptQ); +$depts = array(); +while ($deptW = $sql->fetch_row($deptR)) + $depts["$deptW[0]"] = array(False,$deptW[1]); + +$today = date("Y-m-d"); +$fname = ""; +$lname = ""; +$pc_date = date("Y-m-d"); +$internal = 0; +$bestpractices = 0; +$referral = ""; +$hired = 0; +$ERRORS = ""; + +$dataQ = "SELECT * FROM applicants WHERE appID=$appID"; +$dataR = $sql->query($dataQ); +if ($sql->num_rows($dataR) == 0 && $appID != -1) + $ERRORS .= "Warning: No data found for applicant #$appID
        "; +else if ($appID != -1){ + $dataW = $sql->fetch_row($dataR); + $fname = $dataW[1]; + $lname = $dataW[2]; + $today = $dataW[3]; + $pc_date = $dataW[4]; + $internal = $dataW[5]; + $bestpractices = $dataW[6]; + foreach(explode(",",$dataW[7]) as $i) $positions["$i"][0] = True; + foreach(explode(",",$dataW[8]) as $i) $openings["$i"][0] = True; + foreach(explode(",",$dataW[9]) as $i) $depts["$i"][0] = True; + $referral = $dataW[10]; + $hired = $dataW[11]; +} + +?> + + + + View applicant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Application Date
        First NameLast Name
        Positions applied for + $v) { + if ($v[0]) echo "$v[1]
        "; + } ?> +
        Forwarded to
        department managers
        + $v) { + if ($v[0]) echo "$v[1]
        "; + } ?> +
        InternalHired
        +

        Interview History & Comments

        +query($interviewQ); + +$interviews = array(); +while($interviewW = $sql->fetch_row($interviewR)){ + $dateparts = explode("-",$interviewW['scheduled']); + $jd = gregoriantojd($dateparts[1],$dateparts[2],$dateparts[0]); + array_push($interviews,array($jd,$interviewW['scheduled'],$interviewW['username'],$interviewW['sent_regret'], + $interviewW['took_place'],$interviewW['interviewID'])); +} + +$notesQ = "select noteID,appID,note_text,note_date,username from notes + where appID=$appID order by note_date"; +$notesR = $sql->query($notesQ); + +$notes = array(); +while($notesW = $sql->fetch_row($notesR)){ + $dateparts = explode('-',$notesW['note_date']); + $jd = gregoriantojd($dateparts[1],$dateparts[2],$dateparts[0]); + array_push($notes,array($jd,$notesW['noteID'],$notesW['appID'],$notesW['username'], + $notesW['note_date'],$notesW['note_text'])); +} + +echo ""; +while(!empty($interviews) or !empty($notes)){ + if (empty($notes) or (!empty($interviews) and $interviews[0][0] <= $notes[0][0])){ + $i = array_shift($interviews); + if (count($interviews) % 2 == 0) + echo ""; + else + echo ""; + echo ""; + echo ""; + echo ""; + if ($i[4] == 0){ + if ($username == $i[2]){ + echo ""; + } + else + echo ""; + echo ""; + } + else { + echo ""; + if ($i[3] == 0){ + if ($username == $i[2]){ + echo ""; + } + else + echo ""; + } + else { + echo ""; + } + + } + echo ""; + } + else { + $n = array_shift($notes); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + if ($n[3] == $username){ + echo ""; + } + else + echo ""; + } +} + +?> diff --git a/fannie/legacy/it/CasePricing/index.php b/fannie/legacy/it/CasePricing/index.php new file mode 100644 index 000000000..4c631d3c1 --- /dev/null +++ b/fannie/legacy/it/CasePricing/index.php @@ -0,0 +1,228 @@ +Data to import
        "; + echo "
        Interview Scheduled".$i[1]."".$i[2].""; + echo ""; + echo " "; + echo ""; + echo "PENDING COMPLETE"; + echo ""; + echo "No regret noticeRegret notice sent
        Comment$n[5]
        $n[4]
        $n[3]
        "; + echo ""; + echo "
         
        "; + echo ""; + echo ""; + echo ""; + echo ""; + while (!feof($fp)){ + $line = fgets($fp); + $data = csv_parser($line); + + if (!is_numeric($data[0])) continue; + + echo ""; + printf("", $data[0],$data[0]); + printf("", $data[1],$data[1]); + printf("", $data[2],$data[2]); + $data[3] = ltrim($data[3],"$"); + printf("", $data[3],$data[3]); + printf("", $data[4],$data[4]); + printf("", $data[5],$data[5]); + printf("", $data[6],$data[6]); + printf("", $data[7],$data[7]); + printf("", $data[8],$data[8]); + printf("", $data[9],$data[9]); + } + echo "
        LikecodeDescriptionStatusPriceLocalSupplierOriginCase SizeCase Price
        %s%s%s%s%s%s%s%s%s%s
        "; + echo ""; + + fclose($fp); + unlink($fn); +} +else if (isset($_POST['lc'])){ + $lcs = $_POST["lc"]; + $descs = $_POST["descs"]; + $status = $_POST["status"]; + $prices = $_POST["prices"]; + $local = $_POST["local"]; + $dist = $_POST["dist"]; + $origins = $_POST["origins"]; + $caseq1 = $_POST["caseq1"]; + $caseq2 = $_POST["caseq2"]; + $caseprices = $_POST["caseprices"]; + + // remove current case pricing + $q = "UPDATE prodExtra SET case_quantity='',case_cost=0, case_info='' + WHERE upc not in ('00000000899991','0000000089992','0000000089993')"; + $ms->query($q); + $q = "UPDATE prodExtra SET case_qty='',case_price=0, case_info='' + WHERE upc not in ('00000000899991','0000000089992','0000000089993')"; + $sql->query($q); + + for ($i=0;$iquery("SELECT TOP 1 upc FROM upcLike WHERE likecode=".$lcs[$i]." ORDER BY upc"); + $upc = array_pop($ms->fetch_array($upcR)); + + $l = (strtolower($local[$i])=='y')?1:0; + $qty = $caseq1[$i]." ".$caseq2[$i]; + $info = $status[$i].":".$dist[$i].":".$origins[$i]; + $localUpdate = "UPDATE prodExtra SET location='$l', + case_cost=".$caseprices[$i].", + case_quantity='$qty', + case_info='$info', + cost=$prices[$i] + FROM prodExtra as x INNER JOIN upcLike as u + on x.upc = u.upc + WHERE u.likeCode=".$lcs[$i]; + $remoteUpdate = "UPDATE prodExtra SET location='$l', + case_price=".$caseprices[$i].", + case_qty='$qty', + case_info='$info', + cost=$prices[$i] + WHERE upc='$upc'"; + + $ms->query($localUpdate); + $sql->query($remoteUpdate); + } + echo "Case pricing updated!"; +} +else { + +// update extra items, if present +if (isset($_POST["update_extra"])){ + $upcs = $_POST["upc"]; + $prices = $_POST["price"]; + $status = $_POST["status"]; + $dists = $_POST["dist"]; + $origins = $_POST["origin"]; + $descs = $_POST["desc"]; + $csizes = $_POST["csize"]; + $cprices = $_POST["cprice"]; + for ($i=0;$iquery($msUp1); + $ms->query($msUp2); + $sql->query($myUp1); + $sql->query($myUp2); + } + else { + $msUp1 = sprintf("UPDATE Products SET description='%s' WHERE upc='%s'",$descs[$i],$upcs[$i]); + $msUp2 = sprintf("UPDATE prodExtra SET case_info='%s',case_cost=%s,location='%s',case_quantity='%s',cost=%s WHERE upc='%s'", + $status[$i].":".$dists[$i].":".$origins[$i],$prices[$i], + (isset($_POST["local".$upcs[$i]]))?"1":"0",$csizes[$i],$cprices[$i],$upcs[$i]); + $myUp1 = sprintf("UPDATE Products SET description='%s' WHERE upc='%s'",$descs[$i],$upcs[$i]); + $myUp2 = sprintf("UPDATE prodExtra SET case_info='%s',case_price=%s,location='%s',case_qty='%s',cost=%s WHERE upc='%s'", + $status[$i].":".$dists[$i].":".$origins[$i],$prices[$i], + (isset($_POST["local".$upcs[$i]]))?"1":"0",$csizes[$i],$cprices[$i],$upcs[$i]); + $ms->query($msUp1); + $ms->query($msUp2); + $sql->query($myUp1); + $sql->query($myUp2); + } + } +} + +if (isset($_POST["update_msg"])){ + $msg = str_replace("'","''",$_POST["msg"]); + $sql->query("UPDATE MotD SET msg='$msg' WHERE id='motd'"); +} + +// current data gathering +$query = "select p.upc,p.description,x.location,x.case_quantity,x.case_cost, + x.cost,x.case_info + from products as p left join prodExtra as x on p.upc=x.upc + where p.upc in ('0000000089991','0000000089992','0000000089993') + order by p.upc"; +$items = array(); +$result = $ms->query($query); +while($row = $ms->fetch_row($result)){ + array_unshift($items,array()); + $items[0]["upc"] = $row[0]; + if ($row[1] == "RESERVED"){ + $items[0]["desc"] = ""; + $items[0]["local"] = ""; + $items[0]["status"] = ""; + $items[0]["dist"] = ""; + $items[0]["origin"] = ""; + $items[0]["price"] = ""; + $items[0]["cprice"] = ""; + $items[0]["csize"] = ""; + } + else{ + $items[0]["desc"] = $row[1]; + $items[0]["local"] = $row[2]; + $temp = explode(":",$row[6]); + $items[0]["status"] = $temp[0]; + $items[0]["dist"] = (isset($temp[1])?$temp[1]:''); + $items[0]["origin"] = (isset($temp[2])?$temp[2]:''); + $items[0]["cprice"] = $row[4]; + $items[0]["price"] = $row[5]; + $items[0]["csize"] = $row[3]; + } +} + +$msg = array_pop($sql->fetch_row($sql->query("SELECT msg FROM MotD"))); + +?> + + + + Upload Case Pricing CSV + + +

        Upload a CSV file for case pricing

        +
        + +Filename: + +
        +
        +

        Update Message Box

        +
        + +
        + +
        +
        +

        Extra Items

        +
        + + + + +"; + printf(" + + + + + + + + ", + $item["status"],$item["desc"],$item["upc"],($item["local"]==1)?"checked":"", + $item["dist"],$item["origin"],$item["csize"],$item["cprice"],$item["price"],$item["upc"]); + echo ""; +} +?> +
        StatusDescriptionLocalBest $OriginCs SizeCs PriceUnit Price
        + +
        + + + diff --git a/fannie/legacy/it/CrisisGuide/index.html b/fannie/legacy/it/CrisisGuide/index.html new file mode 100644 index 000000000..b1caeeb3d --- /dev/null +++ b/fannie/legacy/it/CrisisGuide/index.html @@ -0,0 +1,14 @@ + + +IT Minor Crisis Guide + + +Computer systems don't always behave themselves. These step +by step instructions solve small calamaties. + + + diff --git a/fannie/legacy/it/CrisisGuide/memnums.html b/fannie/legacy/it/CrisisGuide/memnums.html new file mode 100644 index 000000000..c93b46ed3 --- /dev/null +++ b/fannie/legacy/it/CrisisGuide/memnums.html @@ -0,0 +1,18 @@ + + + Create New Member Numbers + + +
          +
        1. Go to http://key/git/fannie/mem/new.php +and select type Member. Note that the default number of members to create, 40, works +out to exactly one sheet of stickers for CSC.
        2. +
        3. Click Create Members. Note the Starting Member Number. +
        4. To make stickers for CSC, go to +http://key/git/fannie/mem/numbers/index.php +and enter the starting member number from step #2.
        5. +
        6. Click Get PDF to generate a printable file. This file is formatted +for Avery 5267 labels.
        7. +
        + + diff --git a/fannie/legacy/it/CrisisGuide/phonetime.html b/fannie/legacy/it/CrisisGuide/phonetime.html new file mode 100644 index 000000000..5f46a670a --- /dev/null +++ b/fannie/legacy/it/CrisisGuide/phonetime.html @@ -0,0 +1,18 @@ + + +Phone Time +</head> +<body> +Our phone system is unaware of modern changes to +daylight saving time, so it's off a few times a year +minimum. To change the phone time: +<ol> +<li>Go to a master phone. The master phones are CSC +and the IT office. The latter is probably easier.</li> +<li>Leaving the receiver down, press Feature, 9, #</li> +<li>The time will start flashing on the display. Use the +number keys to enter the correct time.</li> +<li>Press Feature again to complete the change</li> +</ol> +</body> +</html> diff --git a/fannie/legacy/it/CrisisGuide/timeclock.html b/fannie/legacy/it/CrisisGuide/timeclock.html new file mode 100644 index 000000000..b390c3ad0 --- /dev/null +++ b/fannie/legacy/it/CrisisGuide/timeclock.html @@ -0,0 +1,25 @@ +<html> +<head> + <title>Timeclock woes + + +Occasionally, the time clock will stop sending punches +to ADP. There's no real rhyme or reason to it; ADP's software +simply stops working now and then. To fix this: +
          +
        1. Open http://192.168.1.99:5800 in +a browser. You may have to accept a certificate when prompted. After the +page loads you will be prompted for a password. The password is IS4C. +
          • If this step doesn't work, the payroll machine is probably + turned off. Turning it back on should fix the problem. + It is a black PC located in the IT office with a fancy duct + tape label reading "Payroll"
          +
        2. +
        3. Go to the start menu and choose "Turn off computer" then "Restart"
        4. +
        +If you need to get punches over to ADP immediately, access the payroll +machine as described in step #1 and double click the desktop icon labeled +Send Punches to ezLaborManager. After punches are sent, the machine +should still be restarted. + + diff --git a/fannie/legacy/it/PrinterCounts/index.php b/fannie/legacy/it/PrinterCounts/index.php new file mode 100644 index 000000000..d1fcc394f --- /dev/null +++ b/fannie/legacy/it/PrinterCounts/index.php @@ -0,0 +1,47 @@ +query($query); +$data = array(); +$modified = ""; +while($row = $sql->fetch_row($result)){ + $modified = $row[4]; + if (!isset($data[$row[0]])) $data[$row[0]] = array(); + if (!isset($data[$row[0]][$row[1]])) $data[$row[0]][$row[1]] = array(); + $data[$row[0]][$row[1]][$row[2]] = $row[3]; +} + +echo "Updated: ".array_shift(explode(" ",$modified)).""; +echo ""; +foreach($data as $k=>$v){ + echo ""; + $rows = 0; + foreach($v as $cat=>$sub) $rows += count($sub); + echo ""; + $count = 0; + foreach($v as $cat=>$sub){ + if ($count++ > 0) echo ""; + echo ""; + $bcount = 0; + foreach($sub as $label=>$num){ + if ($bcount++ > 0) echo ""; + echo ""; + echo ""; + echo ""; + } + } + echo ""; +} +echo "
        $k
        $cat
        $label$num
         
        "; + +?> diff --git a/fannie/legacy/it/ProduceWeekly/index.php b/fannie/legacy/it/ProduceWeekly/index.php new file mode 100644 index 000000000..847a54112 --- /dev/null +++ b/fannie/legacy/it/ProduceWeekly/index.php @@ -0,0 +1,215 @@ +$value){ + if ($key == "submit") continue; + list($sub,$id) = explode(":",$key,2); + if (!empty($queries[$id])) continue; + $query = sprintf("INSERT INTO produceWeeklyData VALUES + (%d,%f,%f,%f,%f,%f,%f)",$id, + (isset($_POST["M:$id"])?$_POST["M:$id"]:0), + (isset($_POST["T:$id"])?$_POST["T:$id"]:0), + (isset($_POST["W:$id"])?$_POST["W:$id"]:0), + (isset($_POST["Th:$id"])?$_POST["Th:$id"]:0), + (isset($_POST["F:$id"])?$_POST["F:$id"]:0), + (isset($_POST["Sa:$id"])?$_POST["Sa:$id"]:0) + ); + $queries[$id] = $query; + } + $sql->query("TRUNCATE TABLE produceWeeklyData"); + foreach($queries as $q) + $sql->query($q); + + if ($_POST['submit'] == "Archive"){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="order archive '.date("m-d-y",$now).'.xls"'); + } +} + +?> + + + + + +
        +
        +Order for Week of: %s",date("m/d/y",$now)); +?> +     + +     + +
        + + + + + + + + + + + + + + + + + + + +query($query); +$count = 0; +while($row = $sql->fetch_row($result)){ + if ($count % 2 == 0) + echo ""; + else + echo ""; + $count++; + if ($row[1] == "" && $row[2] == "") + echo ""; + else { + $sum = 0; + for($i=6;$i<12;$i++){ + if (!is_numeric($row[$i])) $row[$i] = 0; + $sum += $row[$i]; + } + if ($_POST['submit'] == "Archive"){ + printf(" + + + + + + + + + ", + $row[0], + ($row[1]!="")?$row[1]:" ", + ($row[2]!="")?$row[2]:" ", + ($row[3]!="")?$row[3]:" ", + ($row[3]!="")?$row[3]-$sum:" ", + $row[6], + $row[7], + $row[8], + $row[9], + $row[10], + $row[11], + " ", + ($row[4]!="")?$row[4]:" "); + } + else { + printf(" + + + + + + + + + ", + $row[0], + ($row[1]!="")?$row[1]:" ", + ($row[2]!="")?$row[2]:" ", + ($row[3]!="")?$row[3]:" ", + ($row[3]!="")?$row[3]-$sum:" ", + $row[6],$row[5], + $row[7],$row[5], + $row[8],$row[5], + $row[9],$row[5], + $row[10],$row[5], + $row[11],$row[5], + " ", + ($row[4]!="")?$row[4]:" "); + } + } + echo ""; +} +?> + +
        DescPriceUnitWeeklyNeedMTWThFSaNotesLC
        ".$row[0]."%s%s%s%s%s%.2f%.2f%.2f%.2f%.2f%.2f%s%s%s%s%s%s%s%s%s
        +
        +
        + + + diff --git a/fannie/legacy/it/ProduceWeekly/spacer.png b/fannie/legacy/it/ProduceWeekly/spacer.png new file mode 100644 index 000000000..dd4f31c22 Binary files /dev/null and b/fannie/legacy/it/ProduceWeekly/spacer.png differ diff --git a/fannie/legacy/it/adjust/additem.php b/fannie/legacy/it/adjust/additem.php new file mode 100644 index 000000000..5308e1df3 --- /dev/null +++ b/fannie/legacy/it/adjust/additem.php @@ -0,0 +1,253 @@ +query("INSERT dtransactions ".$strqinsert); + if ($TODAY_FLAG != 1) + $sql->query("INSERT transarchive ".$strqinsert); +} + +//________________________________end addItem() + +//---------------------------------- insert tax line item -------------------------------------- + +function addtax($tax) { + addItem("TAX", "Tax", "A", "", "", 0, 0, 0, $tax, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//________________________________end addtax() + +// ----------------------------- insert transaction discount ----------------------------------- + +function addtransDiscount($disc) { + addItem("DISCOUNT", "Discount", "I", "", "", 0, 1, number_format($disc,2), number_format($disc,2), 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + + +//---------------------------------- insert tender line item ----------------------------------- +function addtender($strtenderdesc, $strtendercode, $dbltendered) { + addItem("", $strtenderdesc, "T", $strtendercode, "", 0, 0, 0, $dbltendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//_______________________________end addtender() + +function addcomment($comment) { + addItem("",$comment, "C", "CM", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//--------------------------------- insert change line item ------------------------------------ + +function addchange($dblcashreturn) { + addItem("", "Change", "T", "CA", "", 0, 0, 0, $dblcashreturn, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addchange() + + +//-------------------------------- insert foods stamp change item ------------------------------ + +function addfsones($intfsones) { + addItem("", "FS Change", "T", "FS", "", 0, 0, 0, $intfsones, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addfsones() + + +//------------------------------- insert discount line ----------------------------------------- + +function adddiscount($dbldiscount,$department) { + $strsaved = "** YOU SAVED $".number_format($dbldiscount,2)." **"; + addItem("", $strsaved, "I", "", "D", $department, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2); +} + +//_____________________________end adddiscount() + + +//------------------------------ insert 'discount applied' line -------------------------------- + +function discountnotify($strl) { + if ($strl == 10.01) { + $strL = 10; + } + addItem("", "** ".$strl."% Discount Applied **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4); +} + +//_____________________________end discountnotify() + + +//------------------------------- insert tax exempt statement line ----------------------------- + +function addTaxExempt() { + addItem("", "** Order is Tax Exempt **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); +} + +//_____________________________end addTaxExempt() + + +//------------------------------ insert reverse tax exempt statement --------------------------- + +function reverseTaxExempt() { + addItem("", "** Tax Exemption Reversed **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); +} + +//_____________________________end reverseTaxExempt() + +//------------------------------ insert manufacturer coupon statement -------------------------- + +function addCoupon($strupc, $intdepartment, $dbltotal) { + addItem($strupc, " * Manufacturers Coupon", "I", "CP", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +//___________________________end addCoupon() + +//------------------------------ insert tare statement ----------------------------------------- + +function addTare($dbltare) { + $tare = $dbltare/100; + addItem("", "** Tare Weight ".$tare." **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); +} + +//___________________________end addTare() + + +//------------------------------- insert MAD coupon statement (WFC specific) ------------------- + +function addMadCoup() { + $madCoup = -1 * $_SESSION["madCoup"]; + addItem("MAD Coupon", "Member Appreciation Coupon", "I", "CP", "C", 0, 1, $madCoup, $madCoup, $madCoup, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 17); + +} + +//___________________________end addMadCoupon() + +function nullwrap($num) { + + + if ( !$num ) { + return 0; + } + elseif (!is_numeric($num) && strlen($num) < 1) { + return " "; + } + else { + return $num; + } +} + +?> diff --git a/fannie/legacy/it/adjust/index.js b/fannie/legacy/it/adjust/index.js new file mode 100644 index 000000000..cfdd32c3f --- /dev/null +++ b/fannie/legacy/it/adjust/index.js @@ -0,0 +1,59 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'refund': + alert(array[2]); // fall through intentional! + case 'loadReceipt': + document.getElementById('contentarea').innerHTML = array[1]; + break; + default: + alert(response); + } + } +} + +function loadReceipt(){ + var date = document.getElementById('rdate').value; + var trans_num = document.getElementById('rtrans_num').value; + phpSend('loadReceipt&date='+date+'&trans_num='+trans_num); +} + +function refund(datestamp,trans_num){ + var changeDate = document.getElementById('newdate').value; + if (changeDate == ''){ + alert("Please enter a date to file changes on"); + return; + } + phpSend('refund&date='+datestamp+'&trans_num='+trans_num+'&newdate='+changeDate); +} diff --git a/fannie/legacy/it/adjust/index.php b/fannie/legacy/it/adjust/index.php new file mode 100644 index 000000000..5a2c3d824 --- /dev/null +++ b/fannie/legacy/it/adjust/index.php @@ -0,0 +1,280 @@ +query("use $FANNIE_OP_DB"); + $query = "select d.upc,d.trans_type,d.trans_subtype,d.trans_status, + d.total,d.card_no,p.description from $dlog as d left join + products as p on d.upc = p.upc + where tdate BETWEEN '$date 00:00:00' AND '$date 23:59:59' + and trans_num='$trans_num' + order by d.trans_id"; + $result = $sql->query($query); + + if ($sql->num_rows($result) == 0) + return "Error: Transaction $trans_num not found on date $date"; + + $ret = ""; + $ret .= ""; + $ret .= ""; + $cardno = ""; + while ($row = $sql->fetch_array($result)){ + $cardno = $row['card_no']; + $ret .= ""; + $ret .= ""; + if (($row['trans_status'] == '0' || $row['trans_status'] == '') && + ($row['trans_subtype'] == '0' || $row['trans_subtype'] == '')) + $ret .= ""; + else if ($row['trans_type'] == 'T'){ + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + $ret .= "
        TypeStatusUPCDescriptionTotal
        "; + switch($row['trans_type']){ + case 'I': + $ret .= "Item"; break; + case 'T': + $ret .= "Tender"; break; + case 'S': + $ret .= "Discount"; break; + case 'A': + $ret .= "Tax"; break; + default: + $ret .= $row['trans_type']; break; + } + $ret .= ""; + switch ($row['trans_subtype']){ + case 'CA': + if ($row['total'] < 0) + $ret .= "Cash"; + else + $ret .= "Change"; + break; + case 'CC': + $ret .= "Credit Card"; break; + case 'CK': + $ret .= "Check"; break; + case 'MI': + $ret .= "Store Charge"; break; + case 'GD': + $ret .= "Gift Card"; break; + case 'TC': + $ret .= "Gift Certificate"; break; + case 'CP': + $ret .= "Coupon"; break; + default: + $ret .= $row['trans_subtype']; + } + $ret .= "".$row[0]."".$row['description']."".$row['total']."

        "; + $ret .= "Date: ".$date." Trans #: ".$trans_num."
        "; + $ret .= "Member number: ".$cardno."

        "; + + $ret .= ""; + $ret .= "Void this receipt
        "; + //$ret .= ""; + //$ret .= "Move to another member"; + //$ret .= " (new member number )
        "; + $ret .= "Date to file changes: "; + + return $ret; +} + +function void_receipt($target_date,$receipt_date,$trans_num,$card_no=0){ + global $CARDNO,$MEMTYPE,$ISSTAFF,$TRANSNO,$DATESTR,$TRANS_ID,$TODAY_FLAG,$sql,$FANNIE_TRANS_DB; + $sql->query("use $FANNIE_TRANS_DB"); + + $emp_no = 1001; + $register_no = 30; + + $TODAY_FLAG = 0; + $todayQ = "select ".$sql->datediff("'$target_date'",$sql->now()); + $todayR = $sql->query($todayQ); + if (array_pop($sql->fetch_array($todayR)) == 0){ + $TODAY_FLAG = 1; + } + + $dtrans = "transarchive"; + $receiptTodayQ = "select ".$sql->datediff("'$receipt_date'",$sql->now()); + $receiptTodayR = $sql->query($receiptTodayQ); + if (array_pop($sql->fetch_array($receiptTodayR)) == 0){ + $dtrans = "dtransactions"; + } + + $newTransNumQ = "select max(trans_no) from dtransactions where + emp_no = $emp_no and register_no = $register_no"; + $newTransNumR = $sql->query($newTransNumQ); + $TRANSNO = 0; + if ($sql->num_rows($newTransNumR) > 0) + $TRANSNO = array_pop($sql->fetch_array($newTransNumR)); + $TRANSNO++; + $TRANS_ID = 0; + + $CARDNO = $card_no; + $DATESTR = $target_date.' 00:00:00'; + + $ret = ""; + list($old_emp,$old_reg,$old_trans) = explode("-",$trans_num); + $query = "select upc, description, trans_type, trans_subtype, + trans_status, department, quantity, Scale, unitPrice, + total, regPrice, tax, foodstamp, discount, memDiscount, + discountable, discounttype, voided, PercentDiscount, + ItemQtty, volDiscType, volume, volSpecial, mixMatch, + matched, memType, staff, card_no, trans_id + from $dtrans where register_no = $old_reg + and emp_no = $old_emp and trans_no = $old_trans + and datetime BETWEEN '$receipt_date 00:00:00' AND '$receipt_date 23:59:59' + and trans_status <> 'X' + order by trans_id"; + $result = $sql->query($query); + addcomment("VOIDING TRANSACTION $trans_num"); + $total = 0; + while ($row = $sql->fetch_array($result)){ + if ($CARDNO == 0) + $CARDNO = $row["card_no"]; + $MEMTYPE = $row["memType"]; + $ISSTAFF = $row["isStaff"]; + + if ($row["upc"] == "TAX"){ + addtax(-1*$row["total"]); + $total += -1*$row["total"]; + } + elseif ($row["upc"] == "DISCOUNT"){ + addtransDiscount(-1*$row["total"]); + $total += -1*$row["total"]; + } + elseif ($row["trans_type"] == "T"){ + if ($row["description"] == "Change"){ + addchange(-1*$row["total"]); + $total += -1*$row["total"]; + } + elseif ($row["description"] == "FS Change"){ + addfsones(-1*$row["total"]); + $total += -1*$row["total"]; + } + else{ + addtender($row["description"],$row["trans_subtype"],-1*$row["total"]); + $total += -1*$row["total"]; + } + } + elseif (strstr($row["description"],"** YOU SAVED")){ + $temp = explode("$",$row["description"]); + adddiscount(substr($temp[1],0,-3),$row["department"]); + } + elseif (strstr($row["description"],"% Discount Applied")){ + $temp = explode("%",$row["description"]); + discountnotify(substr($temp[0],3)); + } + elseif ($row["description"] == "** Order is Tax Exempt **") + addTaxExempt(); + elseif ($row["description"] == "** Tax Excemption Reversed **") + reverseTaxExempt(); + elseif ($row["description"] == " * Manufacturers Coupon") + addCoupon($row["upc"],$row["department"],-1*$row["total"]); + elseif (strstr($row["description"],"** Tare Weight")){ + $temp = explode(" ",$row["description"]); + addTare($temp[3]*100); + } + elseif ($row["upc"] == "MAD Coupon") + addMadCoup(); + elseif ($row["upc"] != "0" && + (is_numeric($row["upc"]) || strstr($row["upc"],"DP"))) { + $row["trans_status"] = "V"; + $row["total"] *= -1; + $row["discount"] *= -1; + $row["memDiscount"] *= -1; + $row["quantity"] *= -1; + $row["ItemQtty"] *= -1; + addItem($row["upc"],$row["description"],$row["trans_type"],$row["trans_subtype"], + $row["trans_status"],$row["department"],$row["quantity"], + $row["unitPrice"],$row["total"],$row["regPrice"], + $row["Scale"],$row["tax"],$row["foodstamp"],$row["discount"], + $row["memDiscount"],$row["discountable"],$row["discounttype"], + $row["ItemQtty"],$row["volDiscType"],$row["volume"],$row["volSpecial"], + $row["mixMatch"],$row["matched"],$row["voided"]); + $total += $row["total"]; + } + + } + if ($TODAY_FLAG == 0){ + $voidHistQ = "insert voidTransHistory values ('$DATESTR','VOIDING TRANSACTION $trans_num', + '$emp_no-$register_no-$TRANSNO',$total)"; + $voidHistR = $sql->query($voidHistQ); + } + + return "1001-30-".$TRANSNO." ".$target_date; +} + +?> + + +Transaction adjustment tool + + + +
        +Date
        +Trans #
        + +
        + +
        + +
        diff --git a/fannie/legacy/it/barcode.php b/fannie/legacy/it/barcode.php new file mode 100755 index 000000000..60c0e9f4e --- /dev/null +++ b/fannie/legacy/it/barcode.php @@ -0,0 +1,180 @@ + +
        +Get barcodes for UPC: +      + +
        +Barcode($x,$y,$barcode,$h,$w,13); +} + +function UPC_A($x,$y,$barcode,$h=16,$w=.35) +{ + $this->Barcode($x,$y,$barcode,$h,$w,12); +} + +function GetCheckDigit($barcode) +{ + //Compute the check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*(isset($barcode[$i])?$barcode[$i]:0); + for($i=0;$i<=10;$i+=2) + $sum+=(isset($barcode[$i])?$barcode[$i]:0); + $r=$sum%10; + if($r>0) + $r=10-$r; + return $r; +} + +function TestCheckDigit($barcode) +{ + //Test validity of check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + return ($sum+$barcode{12})%10==0; +} + +function Barcode($x,$y,$barcode,$h,$w,$len) +{ + //Padding + $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT); + if($len==12) + $barcode='0'.$barcode; + //Add or control the check digit + if(strlen($barcode)==12) + $barcode.=$this->GetCheckDigit($barcode); + elseif(!$this->TestCheckDigit($barcode)) { + $this->Error('This is an Incorrect check digit' . $barcode); + //echo $x.$y.$barcode."\n"; + } + //Convert digits to bars + $codes=array( + 'A'=>array( + '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011', + '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'), + 'B'=>array( + '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101', + '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'), + 'C'=>array( + '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100', + '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100') + ); + $parities=array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $code='101'; + $p=$parities[$barcode{0}]; + for($i=1;$i<=6;$i++) + $code.=$codes[$p[$i-1]][$barcode{$i}]; + $code.='01010'; + for($i=7;$i<=12;$i++) + $code.=$codes['C'][$barcode{$i}]; + $code.='101'; + //Draw bars + for($i=0;$iRect($x+$i*$w,$y,$w,$h,'F'); + } + //Print text uder barcode + $this->SetFont('Arial','',9); + $this->Text($x+6,$y+$h+11/$this->k,substr($barcode,-$len)); +} +} + +//echo $query; + + +$pdf=new PDF(); +$pdf->Open(); +$pdf->SetTopMargin(20); +$pdf->SetLeftMargin(4); +$pdf->SetRightMargin(0); +$pdf->AddPage(); +$i = 9; +$j = 33; +$l = 28; +$k = 25; +$m = 0; +$n = 20; +$r = 24; +$p = 5; +$t = 32; +$u = 20; +$down = 31; + +while($m < 32){ + if($m == 32){ + $pdf->AddPage(); + $i = 9; + $j = 33; + $l = 28; + $k = 25; + $m = 0; + $n = 20; + $p = 5; + $q = 24; + $r = 24; + $t = 32; + $u = 20; + } + if($i > 175){ + $i = 9; + $j = $j + $down; + $k = 25; + $l = $l + $down; + $n = $n + $down; + $r = $r + $down; + $p = 5; + $u = 20; + $t = $t + $down; + } + $upc = "49999900009"; + if (isset($_GET['upc'])) $upc = $_GET['upc']; + + $check = $pdf->GetCheckDigit($upc); + + $pdf->SetFont('Arial','',8); + + $newUPC = $upc . $check; + //echo $newUPC . "
        "; + //echo "
        " . $row['upc'] . "check: " . $check . "new: " . $newUPC;; + $pdf->UPC_A($i,$j,$upc,7); + + $i =$i+ 53; + $k = $k + 53; + $m = $m + 1; + $p = $p + 53; + $u = $u + 53; +} + +$pdf->Output(); + +?> diff --git a/fannie/legacy/it/cards/index.php b/fannie/legacy/it/cards/index.php new file mode 100644 index 000000000..6a0b927e4 --- /dev/null +++ b/fannie/legacy/it/cards/index.php @@ -0,0 +1,71 @@ +query($fetchQ); + + echo "Memberno,First Name,Second Name,Address,City/State/Zip,Exp\n"; + $curName1 = ""; + while ($fetchW = $sql->fetch_array($fetchR)){ + echo $fetchW[0].","; + if ($fetchW[1] == 1) + $curName1 = $fetchW[3]." ".$fetchW[2]; + echo "\"$curName1\","; + if ($fetchW[1] != 1) + echo "\"$fetchW[3] $fetchW[2]\","; + else + echo ","; + if (strstr($fetchW[5],"\n") === False) + echo "\"$fetchW[5]\","; + else{ + $pts = explode("\n",$fetchW[5]); + echo "\"$pts[0]\",\"$pts[1]\","; + } + echo "\"$fetchW[7], $fetchW[8] $fetchW[9]\","; + echo "$fetchW[4]\n"; + } +} +else if (isset($_GET['range1'])){ + $range1 = $_GET['range1']; + $range2 = $_GET['range2']; + if ($range2 < $range1){ + $temp = $range1; + $range1 = $range2; + $range2 = $temp; + } + echo "
        "; + echo "
        "; + echo ""; +} +else { +?> + +Enter a range of member numbers:
        +Start: End:
        + +
        + diff --git a/fannie/legacy/it/cash_tenders/genReport.php b/fannie/legacy/it/cash_tenders/genReport.php new file mode 100755 index 000000000..aa9bcaec0 --- /dev/null +++ b/fannie/legacy/it/cash_tenders/genReport.php @@ -0,0 +1,109 @@ +"; + echo "Cash tender report for what date (YYYY-MM-DD)?
        "; + echo "
        "; + echo " "; + echo ""; + echo "
        Excel"; + echo "
        "; + echo ""; + return; +} + +include('../../../config.php'); +if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."src/SQLManager.php"); + +include('../../db.php'); +include($FANNIE_ROOT.'src/select_dlog.php'); + +if (isset($_GET['excel']) && $_GET['excel'] == 'on'){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="cashTenderReport.xls"'); +} + +$date = $_GET['date']; +echo "

        Cash Tender Report for $date

        "; + +$dlog = select_dlog($date); + +// make me a custom tender tape +// for the correct day +$tempQ = "select tdate,emp_no,register_no,trans_no, + (case when trans_subtype = 'mi' then -1*total else 0 end) as miTender, + (case when trans_subtype = 'ck' then -1*total else 0 end) as ckTender, + (case when trans_subtype = 'ef' or trans_subtype = 'ec' or trans_subtype = 'ta' then -1 * total else 0 end) as ebtTender, + (case when trans_subtype = 'ca' and total > 0 then -1*total else 0 end) as changeGiven, + (case when trans_subtype = 'ca' and total < 0 then -1*total else 0 end) as cashTender + into tempTenderTape + from $dlog + where datediff(dd, tdate, '$date') = 0"; +$tempR = $sql->query($tempQ); + +$empnosQ = "select emp_no from tempTenderTape group by emp_no order by emp_no"; +$empnosR = $sql->query($empnosQ); + +$sheet_sum = 0; +while ($empnosRow = $sql->fetch_array($empnosR)){ + $diff = 0; + $diff2 = 0; + $cur_emp = $empnosRow[0]; + echo "Employee no: $cur_emp
        "; + echo "Cash taken in:
        "; + $inQ = "select tdate,register_no,trans_no,cashTender from tempTenderTape + where emp_no = $cur_emp and cashTender <> 0 order by tdate"; + $inR = $sql->query($inQ); + if ($sql->num_rows($inR) > 0){ + echo ""; + echo ""; + while ($inRow = $sql->fetch_array($inR)){ + echo ""; + echo ""; + echo ""; + } + $totalQ = "select sum(cashTender) from tempTenderTape where emp_no = $cur_emp"; + $totalR = $sql->query($totalQ); + $totalRow = $sql->fetch_array($totalR); + echo ""; + $diff = $totalRow[0]; + echo "
        TimestampRegisterTransactionTotal
        $inRow[0]$inRow[1]$inRow[2]$inRow[3]
        Total$totalRow[0]
        "; + } + else { + echo "No cash in

        "; + } + echo "Change given out:
        "; + $outQ = "select tdate,register_no,trans_no,changeGiven from tempTenderTape + where emp_no = $cur_emp and changeGiven <> 0 order by tdate"; + $outR = $sql->query($outQ); + if ($sql->num_rows($outR) > 0){ + echo ""; + echo ""; + while ($outRow = $sql->fetch_array($outR)){ + echo ""; + echo ""; + echo ""; + } + $totalQ = "select sum(changeGiven) from tempTenderTape where emp_no = $cur_emp"; + $totalR = $sql->query($totalQ); + $totalRow = $sql->fetch_array($totalR); + echo ""; + $diff2 = $totalRow[0]; + echo "
        TimestampRegisterTransactionTotal
        $outRow[0]$outRow[1]$outRow[2]$outRow[3]
        Total$totalRow[0]
        "; + } + else { + echo "No change given

        "; + } + $difference = $diff + $diff2; + echo "
        Difference: $difference"; + $sheet_sum += $difference; + echo "


        "; + //break; +} +echo "

        Report total: $sheet_sum

        "; + +// get rid of the extra table +$dropQ = "drop table tempTenderTape"; +$dropR = $sql->query($dropQ); + +?> diff --git a/fannie/legacy/it/dailySalesUPC.php b/fannie/legacy/it/dailySalesUPC.php new file mode 100755 index 000000000..74410819d --- /dev/null +++ b/fannie/legacy/it/dailySalesUPC.php @@ -0,0 +1,61 @@ +"; + + $q = "select year(tdate),month(tdate),day(tdate),sum(quantity),sum(total) + from $dlog as d where + datediff(dd,tdate,'$date1') <= 0 and + datediff(dd,tdate,'$date2') >= 0 and + upc = '$upc' + group by year(tdate),month(tdate),day(tdate) + order by year(tdate),month(tdate),day(tdate)"; + //echo $q."
        "; + $r = $sql->query($q); + + $out = "Sales report for item: $upc
        "; + $out .= "From $date1 to $date2
        "; + $out .= ""; + $out .= ""; + while ($w = $sql->fetch_array($r)) + $out .= ""; + $out .= "
        DateQtySales
        $w[0]-$w[1]-$w[2]$w[3]$w[4]
        "; + + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="dailySales-'.$upc.'.xls"'); + + echo $out; + +} +else { +?> +Single UPC movement + + + +
        + + + + +
        UPC
        Start date
        End date
        + +
        + + diff --git a/fannie/legacy/it/delimenu/index.php b/fannie/legacy/it/delimenu/index.php new file mode 100644 index 000000000..965d1aba5 --- /dev/null +++ b/fannie/legacy/it/delimenu/index.php @@ -0,0 +1,96 @@ +",$_POST["menu".$i]); + $menu = preg_replace("/\r/","",$menu); + $menu = addslashes($menu); + + //echo "
        ".$menu."

        "; + + $upQ = "update delimenu set dayname='$dayname', menu='$menu' where day=$i"; + //echo $upQ."
        "; + $upR = $sql->query($upQ); +} + +} + +?> + + +Edit the menu page + +This week: + +query($fetchQ); + +echo "
        "; +echo ""; +echo ""; +for ($i = 0; $i < 7; $i++){ + echo ""; + $id = $i+1; + echo ""; + $ts += 86400; +} +echo ""; +echo ""; +for ($i = 0; $i < 7; $i++){ + echo ""; +} +echo ""; +echo "
        ".date('M j',$ts)."
        "; + $id = $i+1; + echo ""; + echo "

        "; + +echo "Next week:"; +echo ""; +echo ""; +for ($i = 0; $i < 7; $i++){ + echo ""; + $id = $i+8; + echo ""; + $ts += 86400; +} +echo ""; +echo ""; +for ($i = 0; $i < 7; $i++){ + echo ""; +} +echo ""; +echo "
        ".date('M j',$ts)."
        "; + $id = $i+8; + echo ""; + echo "

        "; +echo ""; +echo "
        "; +?> + + + diff --git a/fannie/legacy/it/demographics_reload.py b/fannie/legacy/it/demographics_reload.py new file mode 100644 index 000000000..ef55e06a6 --- /dev/null +++ b/fannie/legacy/it/demographics_reload.py @@ -0,0 +1,72 @@ +#!/usr/bin/python + +import datetime +import Sybase + +today = datetime.date.today() + +fp = open('../../src/Credentials/GenericDB.python') +line = fp.read().strip() +fp.close() +hostname,username,pw = line.split(",") + +conn = Sybase.connect(hostname,username,pw) +db = conn.cursor() +db.execute('use WedgePOS') + +dlog = "(" +curmonth = today.month +curyear = today.year +for i in xrange(12): + curmonth -= 1 + if curmonth == 0: + curyear -= 1 + curmonth = 12 + dlog += "select * from trans_archive.dbo.dlog"+str(curyear)+str(curmonth).zfill(2) + if i < 11: + dlog += " union all " +dlog += ")" + +query = """INSERT INTO YTD_Patronage_Speedup + select d.card_no,datepart(mm,d.tdate) as month_no, + sum(CASE WHEN d.trans_type='T' THEN d.total ELSE 0 END) as total + from """+dlog+""" as d + LEFT JOIN custdata as c on c.cardno=d.card_no and c.personnum=1 + LEFT JOIN suspensions as s on s.cardno = d.card_no + WHERE c.memtype=1 or s.memtype1=1 + GROUP BY d.card_no, + datepart(yy,d.tdate), datepart(mm,d.tdate),datepart(dd,d.tdate),d.trans_num""" + +db.execute("TRUNCATE TABLE YTD_Patronage_Speedup") +db.execute(query) + +conn.commit() + +dlog = "(" +curmonth = today.month +curyear = today.year - 1 +for i in xrange(12): + curmonth -= 1 + if curmonth == 0: + curyear -= 1 + curmonth = 12 + dlog += "select * from trans_archive.dbo.dlog"+str(curyear)+str(curmonth).zfill(2) + if i < 11: + dlog += " union all " +dlog += ")" + +query = """INSERT INTO YTD_Patronage_Speedup_Previous + select d.card_no,datepart(mm,d.tdate) as month_no, + sum(CASE WHEN d.trans_type='T' THEN d.total ELSE 0 END) as total + from """+dlog+""" as d + LEFT JOIN custdata as c on c.cardno=d.card_no and c.personnum=1 + LEFT JOIN suspensions as s on s.cardno = d.card_no + WHERE c.memtype=1 or s.memtype1=1 + GROUP BY d.card_no, + datepart(yy,d.tdate), datepart(mm,d.tdate),datepart(dd,d.tdate),d.trans_num""" + +db.execute("TRUNCATE TABLE YTD_Patronage_Speedup_Previous") +db.execute(query) + +conn.commit() +conn.close() diff --git a/fannie/legacy/it/drive_status/README b/fannie/legacy/it/drive_status/README new file mode 100644 index 000000000..b965d4296 --- /dev/null +++ b/fannie/legacy/it/drive_status/README @@ -0,0 +1,2 @@ +Old scripts for reference; none of this +probably works w/ current OS config diff --git a/fannie/legacy/it/drive_status/date.log b/fannie/legacy/it/drive_status/date.log new file mode 100644 index 000000000..ab7ff034b --- /dev/null +++ b/fannie/legacy/it/drive_status/date.log @@ -0,0 +1 @@ +Last updated 08/09/07 01:35:28PM diff --git a/fannie/legacy/it/drive_status/index.php b/fannie/legacy/it/drive_status/index.php new file mode 100644 index 000000000..cc30e3281 --- /dev/null +++ b/fannie/legacy/it/drive_status/index.php @@ -0,0 +1,83 @@ + rsync.log 2>&1 &'); + sleep(2); + break; + } +} + +?> + +Backup hdd status page + + + + +Mount status
        +$l"; + elseif ($l == "The drive is currently mounted"){ + echo "
        "; + echo $l; + if (file_exists('op.lock')) + echo " [ Update in progress ]"; + else + echo " [ Unmount ]"; + } + elseif ($l == "The drive is mounted in the correct spot") + echo "
        $l"; + else + echo "
        $l"; + echo "
        "; +} + +?> +
        + +Update status
        +Refresh ]"; + else + echo " [ Update now ]"; + echo "
        "; +?> +
        + +Rsync status
        +"; + echo "The drive is currently being updated by rsync [ Refresh ]"; + echo "
        "; + } + else { + echo "
        "; + echo "The drive is not in use"; + echo "
        "; + } +?> + + + diff --git a/fannie/legacy/it/drive_status/mountcheck.sh b/fannie/legacy/it/drive_status/mountcheck.sh new file mode 100644 index 000000000..f29ee1f9d --- /dev/null +++ b/fannie/legacy/it/drive_status/mountcheck.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +MOUNT_CHECK=`mount | grep sda1` +if [ -n "$MOUNT_CHECK" ]; then + echo "The drive is currently mounted" + POSITION_CHECK=`mount | grep /mnt/ext3drive` + if [ -n "$POSITION_CHECK" ]; then + echo "The drive is mounted in the correct spot" + else + echo "The drive is not mounted correctly" + fi +else + echo "The drive is not currently mounted" +fi + diff --git a/fannie/legacy/it/drive_status/op.lock b/fannie/legacy/it/drive_status/op.lock new file mode 100644 index 000000000..e69de29bb diff --git a/fannie/legacy/it/drive_status/rsync.log b/fannie/legacy/it/drive_status/rsync.log new file mode 100644 index 000000000..d4b124deb --- /dev/null +++ b/fannie/legacy/it/drive_status/rsync.log @@ -0,0 +1,16519 @@ +Mounting drive +Setting lock file +receiving file list ... done +deleting www/htdocs/totspn_error.php +deleting www/htdocs/totspn.php +deleting www/htdocs/testReport.php +deleting www/htdocs/testEOM.php +deleting www/htdocs/testDiff.php +deleting www/htdocs/test.php +deleting www/htdocs/session.php +deleting www/htdocs/reports/report97/user.html +deleting www/htdocs/reports/report97/technical.html +deleting www/htdocs/reports/report97/style.css +deleting www/htdocs/reports/report97/result.php +deleting www/htdocs/reports/report97/query.class +deleting www/htdocs/reports/report97/pdf.class +deleting www/htdocs/reports/report97/no_results.php +deleting www/htdocs/reports/report97/junk +deleting www/htdocs/reports/report97/journal.php +deleting www/htdocs/reports/report97/bg.jpg +deleting www/htdocs/reports/report97/backend_functions.inc +deleting directory www/htdocs/reports/report97 +deleting www/htdocs/reports/movement/user.html +deleting www/htdocs/reports/movement/test_it_out.php +deleting www/htdocs/reports/movement/technical.html +deleting www/htdocs/reports/movement/style.css +deleting www/htdocs/reports/movement/query.php +deleting www/htdocs/reports/movement/index.php +deleting www/htdocs/reports/movement/classes/pdf/supppdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/specialspdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/rgpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/producepdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/pgpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/pdf.class +deleting www/htdocs/reports/movement/classes/pdf/pcpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/meatpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/juicebarpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/hspdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/genmerchpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/fspdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/frozenpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/flowerspdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/delipdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/cheesepdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/bulkpdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/bread.subclass +deleting www/htdocs/reports/movement/classes/pdf/bakehousepdf.subclass +deleting www/htdocs/reports/movement/classes/pdf/allpdf.subclass +deleting directory www/htdocs/reports/movement/classes/pdf +deleting www/htdocs/reports/movement/classes/builder/yogurtbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/suppbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/specialsbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/rgbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/producebuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/pgbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/pcbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/msbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/meatbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/juicebarbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/hsbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/hbcbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/genmerchbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/fsbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/frozenbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/flowersbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/delibuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/coffee.subclass +deleting www/htdocs/reports/movement/classes/builder/cheesebuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/candybuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/bulkncbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/bulkbuilder.subclass +deleting www/htdocs/reports/movement/classes/builder/builder.class +deleting www/htdocs/reports/movement/classes/builder/bread.builder +deleting www/htdocs/reports/movement/classes/builder/bakehouse.builder +deleting www/htdocs/reports/movement/classes/builder/allbuilder.subclass +deleting directory www/htdocs/reports/movement/classes/builder +deleting directory www/htdocs/reports/movement/classes +deleting www/htdocs/reports/movement/bg2.jpg +deleting www/htdocs/reports/movement/bg.jpg +deleting directory www/htdocs/reports/movement +deleting www/htdocs/reports/lane_status.php +deleting www/htdocs/reports.php +deleting directory www/htdocs/reports +deleting www/htdocs/reportWeekly.php +deleting www/htdocs/reportDateXL.php +deleting www/htdocs/reportDateLastXL.php +deleting www/htdocs/reportDateLast.php +deleting www/htdocs/reportDate.php_orig +deleting www/htdocs/reportDate.php +deleting www/htdocs/report.php +deleting www/htdocs/repDateXL.php +deleting www/htdocs/queries/labels/test.php~ +deleting www/htdocs/queries/labels/barcodenew.php~ +deleting www/htdocs/png2gd.php +deleting www/htdocs/phpcal/update.php +deleting www/htdocs/phpcal/messages.po +deleting www/htdocs/phpcal/locale/index.html +deleting www/htdocs/phpcal/locale/de/index.html +deleting www/htdocs/phpcal/locale/de/LC_MESSAGES/messages.po +deleting www/htdocs/phpcal/locale/de/LC_MESSAGES/index.html +deleting directory www/htdocs/phpcal/locale/de/LC_MESSAGES +deleting directory www/htdocs/phpcal/locale/de +deleting directory www/htdocs/phpcal/locale +deleting www/htdocs/phpcal/install.php +deleting www/htdocs/phpcal/index.php +deleting www/htdocs/phpcal/includes/style.php +deleting www/htdocs/phpcal/includes/setup.php +deleting www/htdocs/phpcal/includes/search.php +deleting www/htdocs/phpcal/includes/options_submit.php +deleting www/htdocs/phpcal/includes/new_user_submit.php +deleting www/htdocs/phpcal/includes/logout.php +deleting www/htdocs/phpcal/includes/login.php +deleting www/htdocs/phpcal/includes/index.html +deleting www/htdocs/phpcal/includes/html.php +deleting www/htdocs/phpcal/includes/event_submit.php +deleting www/htdocs/phpcal/includes/event_form.php +deleting www/htdocs/phpcal/includes/event_delete.php +deleting www/htdocs/phpcal/includes/display.php +deleting www/htdocs/phpcal/includes/db.php +deleting www/htdocs/phpcal/includes/calendar.php +deleting www/htdocs/phpcal/includes/admin.php +deleting directory www/htdocs/phpcal/includes +deleting www/htdocs/phpcal/config.php +deleting www/htdocs/phpcal/adodb/xsl/remove-0.2.xsl +deleting www/htdocs/phpcal/adodb/xsl/convert-0.2-0.1.xsl +deleting www/htdocs/phpcal/adodb/xsl/convert-0.1-0.2.xsl +deleting directory www/htdocs/phpcal/adodb/xsl +deleting www/htdocs/phpcal/adodb/xmlschema.dtd +deleting www/htdocs/phpcal/adodb/tohtml.inc.php +deleting www/htdocs/phpcal/adodb/toexport.inc.php +deleting www/htdocs/phpcal/adodb/tests/xmlschema.xml +deleting www/htdocs/phpcal/adodb/tests/tmssql.php +deleting www/htdocs/phpcal/adodb/tests/time.php +deleting www/htdocs/phpcal/adodb/tests/testsessions.php +deleting www/htdocs/phpcal/adodb/tests/testpear.php +deleting www/htdocs/phpcal/adodb/tests/testpaging.php +deleting www/htdocs/phpcal/adodb/tests/testoci8cursor.php +deleting www/htdocs/phpcal/adodb/tests/testoci8.php +deleting www/htdocs/phpcal/adodb/tests/testmssql.php +deleting www/htdocs/phpcal/adodb/tests/testgenid.php +deleting www/htdocs/phpcal/adodb/tests/testdatabases.inc.php +deleting www/htdocs/phpcal/adodb/tests/testcache.php +deleting www/htdocs/phpcal/adodb/tests/test_rs_array.php +deleting www/htdocs/phpcal/adodb/tests/test5.php +deleting www/htdocs/phpcal/adodb/tests/test4.php +deleting www/htdocs/phpcal/adodb/tests/test3.php +deleting www/htdocs/phpcal/adodb/tests/test2.php +deleting www/htdocs/phpcal/adodb/tests/test.php +deleting www/htdocs/phpcal/adodb/tests/test-xmlschema.php +deleting www/htdocs/phpcal/adodb/tests/test-php5.php +deleting www/htdocs/phpcal/adodb/tests/test-pgblob.php +deleting www/htdocs/phpcal/adodb/tests/test-perf.php +deleting www/htdocs/phpcal/adodb/tests/test-datadict.php +deleting www/htdocs/phpcal/adodb/tests/pdo.php +deleting www/htdocs/phpcal/adodb/tests/client.php +deleting www/htdocs/phpcal/adodb/tests/benchmark.php +deleting directory www/htdocs/phpcal/adodb/tests +deleting www/htdocs/phpcal/adodb/session/crypt.inc.php +deleting www/htdocs/phpcal/adodb/session/adodb-sessions.oracle.sql +deleting www/htdocs/phpcal/adodb/session/adodb-sessions.oracle.clob.sql +deleting www/htdocs/phpcal/adodb/session/adodb-sessions.mysql.sql +deleting www/htdocs/phpcal/adodb/session/adodb-session.php +deleting www/htdocs/phpcal/adodb/session/adodb-session-clob.php +deleting www/htdocs/phpcal/adodb/session/adodb-sess.txt +deleting www/htdocs/phpcal/adodb/session/adodb-encrypt-secret.php +deleting www/htdocs/phpcal/adodb/session/adodb-encrypt-md5.php +deleting www/htdocs/phpcal/adodb/session/adodb-encrypt-mcrypt.php +deleting www/htdocs/phpcal/adodb/session/adodb-cryptsession.php +deleting www/htdocs/phpcal/adodb/session/adodb-compress-gzip.php +deleting www/htdocs/phpcal/adodb/session/adodb-compress-bzip2.php +deleting directory www/htdocs/phpcal/adodb/session +deleting www/htdocs/phpcal/adodb/server.php +deleting www/htdocs/phpcal/adodb/rsfilter.inc.php +deleting www/htdocs/phpcal/adodb/readme.txt +deleting www/htdocs/phpcal/adodb/pivottable.inc.php +deleting www/htdocs/phpcal/adodb/perf/perf-postgres.inc.php +deleting www/htdocs/phpcal/adodb/perf/perf-oci8.inc.php +deleting www/htdocs/phpcal/adodb/perf/perf-mysql.inc.php +deleting www/htdocs/phpcal/adodb/perf/perf-mssql.inc.php +deleting www/htdocs/phpcal/adodb/perf/perf-informix.inc.php +deleting www/htdocs/phpcal/adodb/perf/perf-db2.inc.php +deleting directory www/htdocs/phpcal/adodb/perf +deleting www/htdocs/phpcal/adodb/license.txt +deleting www/htdocs/phpcal/adodb/lang/adodb-sv.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-ru1251.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-ro.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-pt-br.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-pl.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-nl.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-it.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-hu.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-fr.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-es.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-en.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-de.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-cz.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-cn.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-ca.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-bgutf8.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-bg.inc.php +deleting www/htdocs/phpcal/adodb/lang/adodb-ar.inc.php +deleting directory www/htdocs/phpcal/adodb/lang +deleting www/htdocs/phpcal/adodb/drivers/adodb-vfp.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-sybase.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-sqlitepo.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-sqlite.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-sqlanywhere.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-sapdb.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-proxy.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-postgres7.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-postgres64.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-postgres.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-pdo.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-oracle.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-odbtp_unicode.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-odbtp.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-odbc_oracle.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-odbc_mssql.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-odbc.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-oci8po.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-oci805.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-oci8.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-netezza.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-mysqlt.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-mysqli.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-mysql.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-mssqlpo.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-mssql.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-ldap.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-informix72.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-informix.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-ibase.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-firebird.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-fbsql.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-db2.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-csv.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-borland_ibase.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-ado_mssql.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-ado_access.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-ado5.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-ado.inc.php +deleting www/htdocs/phpcal/adodb/drivers/adodb-access.inc.php +deleting directory www/htdocs/phpcal/adodb/drivers +deleting www/htdocs/phpcal/adodb/docs/tute.htm +deleting www/htdocs/phpcal/adodb/docs/tips_portable_sql.htm +deleting www/htdocs/phpcal/adodb/docs/readme.htm +deleting www/htdocs/phpcal/adodb/docs/old-changelog.htm +deleting www/htdocs/phpcal/adodb/docs/docs-session.htm +deleting www/htdocs/phpcal/adodb/docs/docs-perf.htm +deleting www/htdocs/phpcal/adodb/docs/docs-oracle.htm +deleting www/htdocs/phpcal/adodb/docs/docs-datadict.htm +deleting www/htdocs/phpcal/adodb/docs/docs-adodb.htm +deleting directory www/htdocs/phpcal/adodb/docs +deleting www/htdocs/phpcal/adodb/datadict/datadict-sybase.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-sapdb.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-postgres.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-oci8.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-mysql.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-mssql.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-informix.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-ibase.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-generic.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-firebird.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-db2.inc.php +deleting www/htdocs/phpcal/adodb/datadict/datadict-access.inc.php +deleting directory www/htdocs/phpcal/adodb/datadict +deleting www/htdocs/phpcal/adodb/cute_icons_for_site/adodb2.gif +deleting www/htdocs/phpcal/adodb/cute_icons_for_site/adodb.gif +deleting directory www/htdocs/phpcal/adodb/cute_icons_for_site +deleting www/htdocs/phpcal/adodb/contrib/toxmlrpc.inc.php +deleting directory www/htdocs/phpcal/adodb/contrib +deleting www/htdocs/phpcal/adodb/adodb.inc.php +deleting www/htdocs/phpcal/adodb/adodb-xmlschema.inc.php +deleting www/htdocs/phpcal/adodb/adodb-time.zip +deleting www/htdocs/phpcal/adodb/adodb-time.inc.php +deleting www/htdocs/phpcal/adodb/adodb-php4.inc.php +deleting www/htdocs/phpcal/adodb/adodb-perf.inc.php +deleting www/htdocs/phpcal/adodb/adodb-pear.inc.php +deleting www/htdocs/phpcal/adodb/adodb-pager.inc.php +deleting www/htdocs/phpcal/adodb/adodb-lib.inc.php +deleting www/htdocs/phpcal/adodb/adodb-iterator.inc.php +deleting www/htdocs/phpcal/adodb/adodb-exceptions.inc.php +deleting www/htdocs/phpcal/adodb/adodb-errorpear.inc.php +deleting www/htdocs/phpcal/adodb/adodb-errorhandler.inc.php +deleting www/htdocs/phpcal/adodb/adodb-error.inc.php +deleting www/htdocs/phpcal/adodb/adodb-datadict.inc.php +deleting www/htdocs/phpcal/adodb/adodb-csvlib.inc.php +deleting directory www/htdocs/phpcal/adodb +deleting www/htdocs/phpcal/TODO +deleting www/htdocs/phpcal/README +deleting www/htdocs/phpcal/NEWS +deleting www/htdocs/phpcal/INSTALL +deleting www/htdocs/phpcal/COPYING +deleting www/htdocs/phpcal/AUTHORS +deleting directory www/htdocs/phpcal +deleting www/htdocs/phpMyAdmin/config.inc.php.rpmsave +deleting directory www/htdocs/phpMyAdmin +deleting www/htdocs/pdf/yaps-1.2/src/yaps.jpg +deleting directory www/htdocs/pdf/yaps-1.2/src/temp +deleting www/htdocs/pdf/yaps-1.2/src/interakt.jpg +deleting www/htdocs/pdf/yaps-1.2/src/fonts/Encoding.Standard.php +deleting directory www/htdocs/pdf/yaps-1.2/src/fonts +deleting www/htdocs/pdf/yaps-1.2/src/Yaps.inc.php +deleting www/htdocs/pdf/yaps-1.2/src/Ex2.php +deleting www/htdocs/pdf/yaps-1.2/src/Ex1.php +deleting directory www/htdocs/pdf/yaps-1.2/src +deleting www/htdocs/pdf/yaps-1.2/doc/translate.html +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/warning.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/up.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/toc-plus.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/toc-minus.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/toc-blank.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/tip.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/stylesheet-images.tmp +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/prev.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/note.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/next.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/important.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/home.gif +deleting www/htdocs/pdf/yaps-1.2/doc/stylesheet-images/caution.gif +deleting directory www/htdocs/pdf/yaps-1.2/doc/stylesheet-images +deleting www/htdocs/pdf/yaps-1.2/doc/stroke.html +deleting www/htdocs/pdf/yaps-1.2/doc/showimage.html +deleting www/htdocs/pdf/yaps-1.2/doc/showboxed.html +deleting www/htdocs/pdf/yaps-1.2/doc/showatunderline.html +deleting www/htdocs/pdf/yaps-1.2/doc/showat.html +deleting www/htdocs/pdf/yaps-1.2/doc/setunderline.html +deleting www/htdocs/pdf/yaps-1.2/doc/setlinewidth.html +deleting www/htdocs/pdf/yaps-1.2/doc/setlinejoin.html +deleting www/htdocs/pdf/yaps-1.2/doc/setlinecap.html +deleting www/htdocs/pdf/yaps-1.2/doc/setinfo.html +deleting www/htdocs/pdf/yaps-1.2/doc/setfont.html +deleting www/htdocs/pdf/yaps-1.2/doc/setdash.html +deleting www/htdocs/pdf/yaps-1.2/doc/setcolor.html +deleting www/htdocs/pdf/yaps-1.2/doc/setautostroke.html +deleting www/htdocs/pdf/yaps-1.2/doc/setalign.html +deleting www/htdocs/pdf/yaps-1.2/doc/rotate.html +deleting www/htdocs/pdf/yaps-1.2/doc/rectangle.html +deleting www/htdocs/pdf/yaps-1.2/doc/pstopdf.html +deleting www/htdocs/pdf/yaps-1.2/doc/pie.html +deleting www/htdocs/pdf/yaps-1.2/doc/overview.html +deleting www/htdocs/pdf/yaps-1.2/doc/out.html +deleting www/htdocs/pdf/yaps-1.2/doc/open.html +deleting www/htdocs/pdf/yaps-1.2/doc/newpath.html +deleting www/htdocs/pdf/yaps-1.2/doc/moveto.html +deleting www/htdocs/pdf/yaps-1.2/doc/ln13.html +deleting www/htdocs/pdf/yaps-1.2/doc/lineto.html +deleting www/htdocs/pdf/yaps-1.2/doc/line.html +deleting www/htdocs/pdf/yaps-1.2/doc/index.html +deleting www/htdocs/pdf/yaps-1.2/doc/getunderline.html +deleting www/htdocs/pdf/yaps-1.2/doc/getfontsize.html +deleting www/htdocs/pdf/yaps-1.2/doc/getfontname.html +deleting www/htdocs/pdf/yaps-1.2/doc/getalign.html +deleting www/htdocs/pdf/yaps-1.2/doc/functions.html +deleting www/htdocs/pdf/yaps-1.2/doc/fullpie.html +deleting www/htdocs/pdf/yaps-1.2/doc/endpage.html +deleting www/htdocs/pdf/yaps-1.2/doc/endclip.html +deleting www/htdocs/pdf/yaps-1.2/doc/disc.html +deleting www/htdocs/pdf/yaps-1.2/doc/delps.html +deleting www/htdocs/pdf/yaps-1.2/doc/delpdf.html +deleting www/htdocs/pdf/yaps-1.2/doc/curve.html +deleting www/htdocs/pdf/yaps-1.2/doc/closewebps.html +deleting www/htdocs/pdf/yaps-1.2/doc/closeweb.html +deleting www/htdocs/pdf/yaps-1.2/doc/closepath.html +deleting www/htdocs/pdf/yaps-1.2/doc/close.html +deleting www/htdocs/pdf/yaps-1.2/doc/circle.html +deleting www/htdocs/pdf/yaps-1.2/doc/beginpage .html +deleting www/htdocs/pdf/yaps-1.2/doc/begineoclip.html +deleting www/htdocs/pdf/yaps-1.2/doc/beginclip.html +deleting www/htdocs/pdf/yaps-1.2/doc/bar.html +deleting directory www/htdocs/pdf/yaps-1.2/doc +deleting www/htdocs/pdf/yaps-1.2/README.txt +deleting www/htdocs/pdf/yaps-1.2/LICENSE.txt +deleting www/htdocs/pdf/yaps-1.2/INSTALL.txt +deleting www/htdocs/pdf/yaps-1.2/ChangeLog.txt +deleting directory www/htdocs/pdf/yaps-1.2 +deleting www/htdocs/pdf/fpdf151/tutorial/tuto7.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto7.htm +deleting www/htdocs/pdf/fpdf151/tutorial/tuto6.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto6.htm +deleting www/htdocs/pdf/fpdf151/tutorial/tuto5.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto5.htm +deleting www/htdocs/pdf/fpdf151/tutorial/tuto4.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto4.htm +deleting www/htdocs/pdf/fpdf151/tutorial/tuto3.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto3.htm +deleting www/htdocs/pdf/fpdf151/tutorial/tuto2.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto2.htm +deleting www/htdocs/pdf/fpdf151/tutorial/tuto1.php +deleting www/htdocs/pdf/fpdf151/tutorial/tuto1.htm +deleting www/htdocs/pdf/fpdf151/tutorial/makefont.php +deleting www/htdocs/pdf/fpdf151/tutorial/logo_pb.png +deleting www/htdocs/pdf/fpdf151/tutorial/logo.png +deleting www/htdocs/pdf/fpdf151/tutorial/index.htm +deleting www/htdocs/pdf/fpdf151/tutorial/countries.txt +deleting www/htdocs/pdf/fpdf151/tutorial/calligra.z +deleting www/htdocs/pdf/fpdf151/tutorial/calligra.ttf +deleting www/htdocs/pdf/fpdf151/tutorial/calligra.php +deleting www/htdocs/pdf/fpdf151/tutorial/calligra.afm +deleting www/htdocs/pdf/fpdf151/tutorial/20k_c2.txt +deleting www/htdocs/pdf/fpdf151/tutorial/20k_c1.txt +deleting directory www/htdocs/pdf/fpdf151/tutorial +deleting www/htdocs/pdf/fpdf151/install.txt +deleting www/htdocs/pdf/fpdf151/histo.htm +deleting www/htdocs/pdf/fpdf151/fpdf.php +deleting www/htdocs/pdf/fpdf151/fpdf.css +deleting www/htdocs/pdf/fpdf151/font/zapfdingbats.php +deleting www/htdocs/pdf/fpdf151/font/toullmrs.php +deleting www/htdocs/pdf/fpdf151/font/timesi.php +deleting www/htdocs/pdf/fpdf151/font/timesbi.php +deleting www/htdocs/pdf/fpdf151/font/timesb.php +deleting www/htdocs/pdf/fpdf151/font/times.php +deleting www/htdocs/pdf/fpdf151/font/symbol.php +deleting www/htdocs/pdf/fpdf151/font/makefont/makefont.php +deleting www/htdocs/pdf/fpdf151/font/makefont/koi8-r.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-9.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-7.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-5.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-4.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-2.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-16.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-15.map +deleting www/htdocs/pdf/fpdf151/font/makefont/iso-8859-1.map +deleting www/htdocs/pdf/fpdf151/font/makefont/cp1257.map +deleting www/htdocs/pdf/fpdf151/font/makefont/cp1254.map +deleting www/htdocs/pdf/fpdf151/font/makefont/cp1253.map +deleting www/htdocs/pdf/fpdf151/font/makefont/cp1252.map +deleting www/htdocs/pdf/fpdf151/font/makefont/cp1251.map +deleting www/htdocs/pdf/fpdf151/font/makefont/cp1250.map +deleting directory www/htdocs/pdf/fpdf151/font/makefont +deleting www/htdocs/pdf/fpdf151/font/ltbelle.php +deleting www/htdocs/pdf/fpdf151/font/helveticai.php +deleting www/htdocs/pdf/fpdf151/font/helveticabi.php +deleting www/htdocs/pdf/fpdf151/font/helveticab.php +deleting www/htdocs/pdf/fpdf151/font/helvetica.php +deleting www/htdocs/pdf/fpdf151/font/georgiai.php +deleting www/htdocs/pdf/fpdf151/font/georgiabi.php +deleting www/htdocs/pdf/fpdf151/font/georgiab.php +deleting www/htdocs/pdf/fpdf151/font/georgia.php +deleting www/htdocs/pdf/fpdf151/font/fontfiles/toullmrs.ttf +deleting www/htdocs/pdf/fpdf151/font/fontfiles/ltbelle.ttf +deleting www/htdocs/pdf/fpdf151/font/fontfiles/georgiai.ttf +deleting www/htdocs/pdf/fpdf151/font/fontfiles/georgiabi.ttf +deleting www/htdocs/pdf/fpdf151/font/fontfiles/georgiab.ttf +deleting www/htdocs/pdf/fpdf151/font/fontfiles/georgia.ttf +deleting directory www/htdocs/pdf/fpdf151/font/fontfiles +deleting www/htdocs/pdf/fpdf151/font/courier.php +deleting www/htdocs/pdf/fpdf151/font/ToullMRS.ttf +deleting directory www/htdocs/pdf/fpdf151/font +deleting www/htdocs/pdf/fpdf151/doc/write.htm +deleting www/htdocs/pdf/fpdf151/doc/text.htm +deleting www/htdocs/pdf/fpdf151/doc/sety.htm +deleting www/htdocs/pdf/fpdf151/doc/setxy.htm +deleting www/htdocs/pdf/fpdf151/doc/setx.htm +deleting www/htdocs/pdf/fpdf151/doc/settopmargin.htm +deleting www/htdocs/pdf/fpdf151/doc/settitle.htm +deleting www/htdocs/pdf/fpdf151/doc/settextcolor.htm +deleting www/htdocs/pdf/fpdf151/doc/setsubject.htm +deleting www/htdocs/pdf/fpdf151/doc/setrightmargin.htm +deleting www/htdocs/pdf/fpdf151/doc/setmargins.htm +deleting www/htdocs/pdf/fpdf151/doc/setlink.htm +deleting www/htdocs/pdf/fpdf151/doc/setlinewidth.htm +deleting www/htdocs/pdf/fpdf151/doc/setleftmargin.htm +deleting www/htdocs/pdf/fpdf151/doc/setkeywords.htm +deleting www/htdocs/pdf/fpdf151/doc/setfontsize.htm +deleting www/htdocs/pdf/fpdf151/doc/setfont.htm +deleting www/htdocs/pdf/fpdf151/doc/setfillcolor.htm +deleting www/htdocs/pdf/fpdf151/doc/setdrawcolor.htm +deleting www/htdocs/pdf/fpdf151/doc/setdisplaymode.htm +deleting www/htdocs/pdf/fpdf151/doc/setcreator.htm +deleting www/htdocs/pdf/fpdf151/doc/setcompression.htm +deleting www/htdocs/pdf/fpdf151/doc/setautopagebreak.htm +deleting www/htdocs/pdf/fpdf151/doc/setauthor.htm +deleting www/htdocs/pdf/fpdf151/doc/rect.htm +deleting www/htdocs/pdf/fpdf151/doc/pageno.htm +deleting www/htdocs/pdf/fpdf151/doc/output.htm +deleting www/htdocs/pdf/fpdf151/doc/open.htm +deleting www/htdocs/pdf/fpdf151/doc/multicell.htm +deleting www/htdocs/pdf/fpdf151/doc/ln.htm +deleting www/htdocs/pdf/fpdf151/doc/link.htm +deleting www/htdocs/pdf/fpdf151/doc/line.htm +deleting www/htdocs/pdf/fpdf151/doc/index.htm +deleting www/htdocs/pdf/fpdf151/doc/image.htm +deleting www/htdocs/pdf/fpdf151/doc/header.htm +deleting www/htdocs/pdf/fpdf151/doc/gety.htm +deleting www/htdocs/pdf/fpdf151/doc/getx.htm +deleting www/htdocs/pdf/fpdf151/doc/getstringwidth.htm +deleting www/htdocs/pdf/fpdf151/doc/fpdf.htm +deleting www/htdocs/pdf/fpdf151/doc/footer.htm +deleting www/htdocs/pdf/fpdf151/doc/error.htm +deleting www/htdocs/pdf/fpdf151/doc/close.htm +deleting www/htdocs/pdf/fpdf151/doc/cell.htm +deleting www/htdocs/pdf/fpdf151/doc/aliasnbpages.htm +deleting www/htdocs/pdf/fpdf151/doc/addpage.htm +deleting www/htdocs/pdf/fpdf151/doc/addlink.htm +deleting www/htdocs/pdf/fpdf151/doc/addfont.htm +deleting www/htdocs/pdf/fpdf151/doc/acceptpagebreak.htm +deleting directory www/htdocs/pdf/fpdf151/doc +deleting www/htdocs/pdf/fpdf151/FAQ.htm +deleting directory www/htdocs/pdf/fpdf151 +deleting directory www/htdocs/pdf +deleting www/htdocs/odbc.php +deleting www/htdocs/obrien.php +deleting www/htdocs/newReportXL.php~ +deleting www/htdocs/newReportTrans.php~ +deleting www/htdocs/newReportTest.php +deleting www/htdocs/mysql.php +deleting www/htdocs/members_test/testFunc.php +deleting www/htdocs/members_test/testEdit.php +deleting www/htdocs/members_test/newMem.php +deleting www/htdocs/members_test/memTrans.php +deleting www/htdocs/members_test/memStart.php +deleting www/htdocs/members_test/memLogin.php +deleting www/htdocs/members_test/memList.php +deleting www/htdocs/members_test/memGen.php~ +deleting www/htdocs/members_test/memGen.php +deleting www/htdocs/members_test/memEdit.php~ +deleting www/htdocs/members_test/memEdit.php.old +deleting www/htdocs/members_test/memCon.php +deleting www/htdocs/members_test/memAddress.php +deleting www/htdocs/members_test/mainMenu3.php +deleting www/htdocs/members_test/mainMenu1.php +deleting www/htdocs/members_test/mainMenu.php +deleting www/htdocs/members_test/list.php +deleting www/htdocs/members_test/insertEdit.php +deleting www/htdocs/members_test/index_old.php +deleting www/htdocs/members_test/index.php +deleting www/htdocs/members_test/images/test.png +deleting www/htdocs/members_test/images/tab.png +deleting www/htdocs/members_test/images/repUp.gif +deleting www/htdocs/members_test/images/repOver.gif +deleting www/htdocs/members_test/images/repDown.gif +deleting www/htdocs/members_test/images/refUp.gif +deleting www/htdocs/members_test/images/refOver.gif +deleting www/htdocs/members_test/images/refDown.gif +deleting www/htdocs/members_test/images/persons.gif +deleting www/htdocs/members_test/images/new_up.gif +deleting www/htdocs/members_test/images/newLogo_small.jpg +deleting www/htdocs/members_test/images/newLogo_small.gif +deleting www/htdocs/members_test/images/memUp.gif +deleting www/htdocs/members_test/images/memOver.gif +deleting www/htdocs/members_test/images/memDown.gif +deleting www/htdocs/members_test/images/logoGrnBckSm.gif +deleting www/htdocs/members_test/images/itemsUp.gif +deleting www/htdocs/members_test/images/itemsOver.gif +deleting www/htdocs/members_test/images/itemsDown.gif +deleting www/htdocs/members_test/images/general.gif +deleting www/htdocs/members_test/images/exist_up.gif +deleting www/htdocs/members_test/images/equity.gif +deleting www/htdocs/members_test/images/detail.gif +deleting www/htdocs/members_test/images/control.gif +deleting www/htdocs/members_test/images/_notes/repUp.gif.mno +deleting www/htdocs/members_test/images/_notes/repOver.gif.mno +deleting www/htdocs/members_test/images/_notes/repDown.gif.mno +deleting www/htdocs/members_test/images/_notes/refUp.gif.mno +deleting www/htdocs/members_test/images/_notes/refOver.gif.mno +deleting www/htdocs/members_test/images/_notes/refDown.gif.mno +deleting www/htdocs/members_test/images/_notes/memOver.gif.mno +deleting www/htdocs/members_test/images/_notes/memDown.gif.mno +deleting www/htdocs/members_test/images/_notes/itemsUp.gif.mno +deleting www/htdocs/members_test/images/_notes/itemsOver.gif.mno +deleting www/htdocs/members_test/images/_notes/itemsDown.gif.mno +deleting www/htdocs/members_test/images/_notes/._repUp.gif.mno +deleting www/htdocs/members_test/images/_notes/._repOver.gif.mno +deleting www/htdocs/members_test/images/_notes/._repDown.gif.mno +deleting www/htdocs/members_test/images/_notes/._refUp.gif.mno +deleting www/htdocs/members_test/images/_notes/._refOver.gif.mno +deleting www/htdocs/members_test/images/_notes/._refDown.gif.mno +deleting www/htdocs/members_test/images/_notes/._memOver.gif.mno +deleting www/htdocs/members_test/images/_notes/._memDown.gif.mno +deleting www/htdocs/members_test/images/_notes/._itemsUp.gif.mno +deleting www/htdocs/members_test/images/_notes/._itemsOver.gif.mno +deleting www/htdocs/members_test/images/_notes/._itemsDown.gif.mno +deleting directory www/htdocs/members_test/images/_notes +deleting www/htdocs/members_test/images/GKC1.png +deleting www/htdocs/members_test/images/AR.gif +deleting www/htdocs/members_test/images/._test.png +deleting www/htdocs/members_test/images/._tab.png +deleting www/htdocs/members_test/images/._repUp.gif +deleting www/htdocs/members_test/images/._repOver.gif +deleting www/htdocs/members_test/images/._repDown.gif +deleting www/htdocs/members_test/images/._refUp.gif +deleting www/htdocs/members_test/images/._refOver.gif +deleting www/htdocs/members_test/images/._refDown.gif +deleting www/htdocs/members_test/images/._persons.gif +deleting www/htdocs/members_test/images/._new_up.gif +deleting www/htdocs/members_test/images/._memUp.gif +deleting www/htdocs/members_test/images/._memOver.gif +deleting www/htdocs/members_test/images/._memDown.gif +deleting www/htdocs/members_test/images/._logoGrnBckSm.gif +deleting www/htdocs/members_test/images/._itemsUp.gif +deleting www/htdocs/members_test/images/._itemsOver.gif +deleting www/htdocs/members_test/images/._itemsDown.gif +deleting www/htdocs/members_test/images/._general.gif +deleting www/htdocs/members_test/images/._exist_up.gif +deleting www/htdocs/members_test/images/._equity.gif +deleting www/htdocs/members_test/images/._detail.gif +deleting www/htdocs/members_test/images/._control.gif +deleting www/htdocs/members_test/images/._GKC1.png +deleting www/htdocs/members_test/images/._AR.gif +deleting directory www/htdocs/members_test/images +deleting www/htdocs/members_test/header.html +deleting www/htdocs/members_test/genNums.php +deleting www/htdocs/members_test/functMem.php +deleting www/htdocs/members_test/editNew.php +deleting www/htdocs/members_test/artest.php +deleting www/htdocs/members_test/_notes/meminfo.php.mno +deleting www/htdocs/members_test/_notes/memTest.php.mno +deleting www/htdocs/members_test/_notes/memPage.php.mno +deleting www/htdocs/members_test/_notes/memList.php.mno +deleting www/htdocs/members_test/_notes/._meminfo.php.mno +deleting www/htdocs/members_test/_notes/._memTest.php.mno +deleting www/htdocs/members_test/_notes/._memPage.php.mno +deleting www/htdocs/members_test/_notes/._memList.php.mno +deleting directory www/htdocs/members_test/_notes +deleting www/htdocs/members_test/AR_90.php +deleting www/htdocs/members_test/ARStatement.php +deleting www/htdocs/members_test/AR.php +deleting www/htdocs/members_test/.memAddress.php.swp +deleting www/htdocs/members_test/.memAddress.php.swo +deleting www/htdocs/members_test/.memAddress.php.swn +deleting www/htdocs/members_test/.memAddress.php.swm +deleting www/htdocs/members_test/._meminfo.php +deleting www/htdocs/members_test/._memTrans.php +deleting www/htdocs/members_test/._memTest.php +deleting www/htdocs/members_test/._memStart.php +deleting www/htdocs/members_test/._memPage.php +deleting www/htdocs/members_test/._memMaint.php +deleting www/htdocs/members_test/._memLogin.php +deleting www/htdocs/members_test/._memList.php +deleting www/htdocs/members_test/._mainMenu3.php +deleting www/htdocs/members_test/._mainMenu1.php +deleting www/htdocs/members_test/._mainMenu.php +deleting www/htdocs/members_test/._list.php +deleting www/htdocs/members_test/._index.php +deleting www/htdocs/members_test/.DS_Store +deleting directory www/htdocs/members_test +deleting www/htdocs/members/zerostock.php~ +deleting www/htdocs/members/workMem.php +deleting www/htdocs/members/testGen.php +deleting www/htdocs/members/testFunc.php +deleting www/htdocs/members/testEdit_orig.php +deleting www/htdocs/members/testEdit_cur.php +deleting www/htdocs/members/testDrop.php +deleting www/htdocs/members/test.php +deleting www/htdocs/members/reprint_old.php +deleting www/htdocs/members/reactivate.php~ +deleting www/htdocs/members/query.php +deleting www/htdocs/members/php_error_log_file +deleting www/htdocs/members/memsByDate.pl~ +deleting www/htdocs/members/memsByDate.php~ +deleting www/htdocs/members/memStart.php +deleting www/htdocs/members/memLogin.php +deleting www/htdocs/members/memList.php +deleting www/htdocs/members/memGen_old.php +deleting www/htdocs/members/memEdit.php.old +deleting www/htdocs/members/memAddress.php~ +deleting www/htdocs/members/memARTrans.php_orig +deleting www/htdocs/members/mainMenu3.php +deleting www/htdocs/members/mainMenu1.php +deleting www/htdocs/members/list.php +deleting www/htdocs/members/insertEdit.php~ +deleting www/htdocs/members/index_old.php +deleting www/htdocs/members/images/_notes/repUp.gif.mno +deleting www/htdocs/members/images/_notes/repOver.gif.mno +deleting www/htdocs/members/images/_notes/repDown.gif.mno +deleting www/htdocs/members/images/_notes/refUp.gif.mno +deleting www/htdocs/members/images/_notes/refOver.gif.mno +deleting www/htdocs/members/images/_notes/refDown.gif.mno +deleting www/htdocs/members/images/_notes/memOver.gif.mno +deleting www/htdocs/members/images/_notes/memDown.gif.mno +deleting www/htdocs/members/images/_notes/itemsUp.gif.mno +deleting www/htdocs/members/images/_notes/itemsOver.gif.mno +deleting www/htdocs/members/images/_notes/itemsDown.gif.mno +deleting www/htdocs/members/images/_notes/._repUp.gif.mno +deleting www/htdocs/members/images/_notes/._repOver.gif.mno +deleting www/htdocs/members/images/_notes/._repDown.gif.mno +deleting www/htdocs/members/images/_notes/._refUp.gif.mno +deleting www/htdocs/members/images/_notes/._refOver.gif.mno +deleting www/htdocs/members/images/_notes/._refDown.gif.mno +deleting www/htdocs/members/images/_notes/._memOver.gif.mno +deleting www/htdocs/members/images/_notes/._memDown.gif.mno +deleting www/htdocs/members/images/_notes/._itemsUp.gif.mno +deleting www/htdocs/members/images/_notes/._itemsOver.gif.mno +deleting www/htdocs/members/images/_notes/._itemsDown.gif.mno +deleting directory www/htdocs/members/images/_notes +deleting www/htdocs/members/functMem_orig.php +deleting www/htdocs/members/fullList.php +deleting www/htdocs/members/editNabs.pl~ +deleting www/htdocs/members/editMore.php +deleting www/htdocs/members/editHouse2.php_orig +deleting www/htdocs/members/editHouse2.php +deleting www/htdocs/members/editHouse.php_orig +deleting www/htdocs/members/editHouse.php +deleting www/htdocs/members/deactivate.php~ +deleting www/htdocs/members/artest.php +deleting www/htdocs/members/_notes/meminfo.php.mno +deleting www/htdocs/members/_notes/memTest.php.mno +deleting www/htdocs/members/_notes/memPage.php.mno +deleting www/htdocs/members/_notes/memList.php.mno +deleting www/htdocs/members/_notes/._meminfo.php.mno +deleting www/htdocs/members/_notes/._memTest.php.mno +deleting www/htdocs/members/_notes/._memPage.php.mno +deleting www/htdocs/members/_notes/._memList.php.mno +deleting directory www/htdocs/members/_notes +deleting www/htdocs/members/ARStatement_orig.php +deleting www/htdocs/members/.memAddress.php.swp +deleting www/htdocs/members/.memAddress.php.swo +deleting www/htdocs/members/.memAddress.php.swn +deleting www/htdocs/members/.memAddress.php.swm +deleting www/htdocs/members/._meminfo.php +deleting www/htdocs/members/._memTrans.php +deleting www/htdocs/members/._memTest.php +deleting www/htdocs/members/._memStart.php +deleting www/htdocs/members/._memPage.php +deleting www/htdocs/members/._memMaint.php +deleting www/htdocs/members/._memLogin.php +deleting www/htdocs/members/._memList.php +deleting www/htdocs/members/._mainMenu3.php +deleting www/htdocs/members/._mainMenu1.php +deleting www/htdocs/members/._mainMenu.php +deleting www/htdocs/members/._list.php +deleting www/htdocs/members/._index.php +deleting www/htdocs/members/.DS_Store +deleting www/htdocs/it_samba_case_sensitivity +deleting www/htdocs/it_other +deleting www/htdocs/it/voicemail.html +deleting www/htdocs/it/unfipres.php +deleting www/htdocs/it/tunneler.tar.bz2 +deleting www/htdocs/it/test2.php +deleting www/htdocs/it/test.php +deleting www/htdocs/it/supplies.php +deleting www/htdocs/it/scalatest.html +deleting www/htdocs/it/scala/scalatest.php +deleting www/htdocs/it/scala/scala_regular.php +deleting www/htdocs/it/scala/php_error_log_file +deleting directory www/htdocs/it/scala +deleting www/htdocs/it/sales_traffic/trends.py +deleting www/htdocs/it/sales_traffic/index.php +deleting directory www/htdocs/it/sales_traffic +deleting www/htdocs/it/sales_check/index.php~ +deleting www/htdocs/it/sales_check/index.php +deleting directory www/htdocs/it/sales_check +deleting www/htdocs/it/recipizer/index_orig.php +deleting www/htdocs/it/receipt.php +deleting www/htdocs/it/projects/report_orig.php +deleting www/htdocs/it/projects/report1.php +deleting www/htdocs/it/produce_avg/index.php +deleting directory www/htdocs/it/produce_avg +deleting www/htdocs/it/picker/watchlist.php +deleting www/htdocs/it/picker/test.py +deleting www/htdocs/it/picker/index.php +deleting www/htdocs/it/picker/cron.py +deleting directory www/htdocs/it/picker +deleting www/htdocs/it/phpbits.php +deleting www/htdocs/it/perl_playground/serial_test.pl~ +deleting www/htdocs/it/perl_playground/serial_test.pl +deleting www/htdocs/it/perl_playground/serial.c~ +deleting www/htdocs/it/perl_playground/serial.c +deleting www/htdocs/it/perl_playground/scanner +deleting www/htdocs/it/perl_playground/scale +deleting www/htdocs/it/perl_playground/index.php~ +deleting www/htdocs/it/perl_playground/index.php +deleting www/htdocs/it/perl_playground/a.out +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/ttyS0_test.cfg +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/test4.t +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/test3.t +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/test2.t +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/test1.t +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/DefaultPort.pm +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/AltPort.pm +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/t/01timing.t +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/t +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/show-tiocm.c.test +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/pm_to_blib +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/modemtest +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/options.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example8.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example7.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example6.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example5.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example4.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example3.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example2.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/example1.txt +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo8.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo7.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo6.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo5.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo4.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo3.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo2.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/demo1.plx +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg/any_os.plx +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/eg +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/rules +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/prerm +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/postrm +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/postinst +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/copyright +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/control +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian/changelog +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/debian +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/configure +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/config.status +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/config.log +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/config.h.in +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/config.h +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/script/modemtest +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/script/.exists +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/script +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/man3/Device::SerialPort.3 +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/man3/.exists +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/man3 +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/man1/modemtest.1 +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/man1/.exists +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/man1 +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device/SerialPort/.exists +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device/SerialPort +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device/SerialPort.pm +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device/.exists +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/lib +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort/SerialPort.so +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort/SerialPort.bs +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort/.exists +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib/arch +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/blib +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/mkinstalldirs +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/missing +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/install-sh +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/depcomp +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/config.sub +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/config.rpath +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools/config.guess +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002/autotools +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/TODO +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/SerialPort.xs +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/SerialPort.pm +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/SerialPort.o +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/SerialPort.c +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/SerialPort.bs +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/README +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/Makefile.PL +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/Makefile +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/META.yml +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/MANIFEST +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/Device-SerialPort.spec +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/Changes +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002/#README# +deleting www/htdocs/it/perl_playground/Device-SerialPort-1.002.tar.gz +deleting directory www/htdocs/it/perl_playground/Device-SerialPort-1.002 +deleting directory www/htdocs/it/perl_playground +deleting www/htdocs/it/perl_freetds_sample.pl +deleting www/htdocs/it/nexusconnect.php +deleting www/htdocs/it/newbatch_dev/index.php +deleting www/htdocs/it/newbatch_dev/index.js +deleting www/htdocs/it/newbatch_dev/index.css +deleting www/htdocs/it/newbatch_dev/forceBatch.php +deleting www/htdocs/it/newbatch_dev/barcodenew.php +deleting directory www/htdocs/it/newbatch_dev +deleting www/htdocs/it/leave_orig.php +deleting www/htdocs/it/inventory/index.php +deleting www/htdocs/it/inventory/index.js +deleting www/htdocs/it/inventory/index.css +deleting directory www/htdocs/it/inventory +deleting www/htdocs/it/httpLogin.pl +deleting www/htdocs/it/httpFetcher.pl +deleting www/htdocs/it/head.gif +deleting www/htdocs/it/functions.php +deleting www/htdocs/it/fixShortUPC.php +deleting www/htdocs/it/fakeheight.jpg +deleting www/htdocs/it/dupTest.php +deleting www/htdocs/it/dlogArchiveTest.php +deleting www/htdocs/it/deptlist.php +deleting www/htdocs/it/datespan.php +deleting www/htdocs/it/cookies.txt +deleting www/htdocs/it/computers.php +deleting www/htdocs/it/cash_tenders/genReport.php~ +deleting www/htdocs/it/banner.jpg +deleting www/htdocs/it/banner.gif +deleting www/htdocs/it/backOutReceipt.php +deleting www/htdocs/index_lang/index.html.zh-tw.big5 +deleting www/htdocs/index_lang/index.html.zh-cn.gb2312 +deleting www/htdocs/index_lang/index.html.var +deleting www/htdocs/index_lang/index.html.sv +deleting www/htdocs/index_lang/index.html.ru.utf8 +deleting www/htdocs/index_lang/index.html.ru.koi8-r +deleting www/htdocs/index_lang/index.html.ru.iso-ru +deleting www/htdocs/index_lang/index.html.ru.cp866 +deleting www/htdocs/index_lang/index.html.ru.cp-1251 +deleting www/htdocs/index_lang/index.html.pt-br +deleting www/htdocs/index_lang/index.html.pt +deleting www/htdocs/index_lang/index.html.po.iso8859-2 +deleting www/htdocs/index_lang/index.html.no +deleting www/htdocs/index_lang/index.html.nn +deleting www/htdocs/index_lang/index.html.nl +deleting www/htdocs/index_lang/index.html.lb.utf8 +deleting www/htdocs/index_lang/index.html.ko.euc-kr +deleting www/htdocs/index_lang/index.html.ja.iso2022-jp +deleting www/htdocs/index_lang/index.html.it +deleting www/htdocs/index_lang/index.html.hr.iso8859-2 +deleting www/htdocs/index_lang/index.html.he.iso8859-8 +deleting www/htdocs/index_lang/index.html.fr +deleting www/htdocs/index_lang/index.html.et +deleting www/htdocs/index_lang/index.html.es +deleting www/htdocs/index_lang/index.html.en +deleting www/htdocs/index_lang/index.html.el +deleting www/htdocs/index_lang/index.html.ee +deleting www/htdocs/index_lang/index.html.dk +deleting www/htdocs/index_lang/index.html.de +deleting www/htdocs/index_lang/index.html.cz.iso8859-2 +deleting www/htdocs/index_lang/index.html.ca +deleting directory www/htdocs/index_lang +deleting directory www/htdocs/ical +deleting www/htdocs/gif/u_arrow.gif +deleting www/htdocs/gif/r_hand.gif +deleting www/htdocs/gif/r_arrow.gif +deleting www/htdocs/gif/l_arrow.gif +deleting directory www/htdocs/gif +deleting www/htdocs/full.php +deleting www/htdocs/freetds.php +deleting www/htdocs/finance/upload.html +deleting www/htdocs/finance/tenderReport.php +deleting directory www/htdocs/finance +deleting www/htdocs/empl_import.php +deleting www/htdocs/date.php +deleting www/htdocs/custCount.php~ +deleting www/htdocs/cheatSheet.php +deleting www/htdocs/calendar/year.php +deleting www/htdocs/calendar/week.php +deleting www/htdocs/calendar/templates/default/year.tpl +deleting www/htdocs/calendar/templates/default/week.tpl +deleting www/htdocs/calendar/templates/default/todo.tpl +deleting www/htdocs/calendar/templates/default/sidebar.tpl +deleting www/htdocs/calendar/templates/default/search.tpl +deleting www/htdocs/calendar/templates/default/rss_index.tpl +deleting www/htdocs/calendar/templates/default/print.tpl +deleting www/htdocs/calendar/templates/default/preferences.tpl +deleting www/htdocs/calendar/templates/default/month_small.tpl +deleting www/htdocs/calendar/templates/default/month_medium.tpl +deleting www/htdocs/calendar/templates/default/month_large.tpl +deleting www/htdocs/calendar/templates/default/month.tpl +deleting www/htdocs/calendar/templates/default/images/year_on.gif +deleting www/htdocs/calendar/templates/default/images/week_on.gif +deleting www/htdocs/calendar/templates/default/images/time_bg.gif +deleting www/htdocs/calendar/templates/default/images/spacer.gif +deleting www/htdocs/calendar/templates/default/images/smallicon.gif +deleting www/htdocs/calendar/templates/default/images/side_bg.gif +deleting www/htdocs/calendar/templates/default/images/shadow_r.gif +deleting www/htdocs/calendar/templates/default/images/shadow_m.gif +deleting www/htdocs/calendar/templates/default/images/shadow_l.gif +deleting www/htdocs/calendar/templates/default/images/search.gif +deleting www/htdocs/calendar/templates/default/images/right_day.gif +deleting www/htdocs/calendar/templates/default/images/right_arrows.gif +deleting www/htdocs/calendar/templates/default/images/printer.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_7.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_6.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_5.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_4.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_3.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_2.gif +deleting www/htdocs/calendar/templates/default/images/monthdot_1.gif +deleting www/htdocs/calendar/templates/default/images/month_on.gif +deleting www/htdocs/calendar/templates/default/images/left_day.gif +deleting www/htdocs/calendar/templates/default/images/left_arrows.gif +deleting www/htdocs/calendar/templates/default/images/event_dot.gif +deleting www/htdocs/calendar/templates/default/images/download_arrow.gif +deleting www/htdocs/calendar/templates/default/images/day_title.gif +deleting www/htdocs/calendar/templates/default/images/day_on.gif +deleting www/htdocs/calendar/templates/default/images/back.gif +deleting www/htdocs/calendar/templates/default/images/allday_dot.gif +deleting www/htdocs/calendar/templates/default/images/allday_bg.gif +deleting www/htdocs/calendar/templates/default/images/allday_7.gif +deleting www/htdocs/calendar/templates/default/images/allday_6.gif +deleting www/htdocs/calendar/templates/default/images/allday_5.gif +deleting www/htdocs/calendar/templates/default/images/allday_4.gif +deleting www/htdocs/calendar/templates/default/images/allday_3.gif +deleting www/htdocs/calendar/templates/default/images/allday_2.gif +deleting www/htdocs/calendar/templates/default/images/allday_1.gif +deleting directory www/htdocs/calendar/templates/default/images +deleting www/htdocs/calendar/templates/default/header.tpl +deleting www/htdocs/calendar/templates/default/footer.tpl +deleting www/htdocs/calendar/templates/default/event.tpl +deleting www/htdocs/calendar/templates/default/error.tpl +deleting www/htdocs/calendar/templates/default/default.css +deleting www/htdocs/calendar/templates/default/day.tpl +deleting www/htdocs/calendar/templates/default/calendar_nav.tpl +deleting www/htdocs/calendar/templates/default/admin.tpl +deleting directory www/htdocs/calendar/templates/default +deleting directory www/htdocs/calendar/templates +deleting www/htdocs/calendar/search.php +deleting www/htdocs/calendar/rss/rss.php +deleting www/htdocs/calendar/rss/index.php +deleting directory www/htdocs/calendar/rss +deleting www/htdocs/calendar/print.php +deleting www/htdocs/calendar/preferences.php +deleting www/htdocs/calendar/month.php +deleting www/htdocs/calendar/languages/traditional_chinese.inc.php +deleting www/htdocs/calendar/languages/swedish.inc.php +deleting www/htdocs/calendar/languages/spanish.inc.php +deleting www/htdocs/calendar/languages/portuguese.inc.php +deleting www/htdocs/calendar/languages/polish.inc.php +deleting www/htdocs/calendar/languages/norwegian.inc.php +deleting www/htdocs/calendar/languages/lithuanian.inc.php +deleting www/htdocs/calendar/languages/korean.inc.php +deleting www/htdocs/calendar/languages/japanese.inc.php +deleting www/htdocs/calendar/languages/italian.inc.php +deleting www/htdocs/calendar/languages/german.inc.php +deleting www/htdocs/calendar/languages/french.inc.php +deleting www/htdocs/calendar/languages/finnish.inc.php +deleting www/htdocs/calendar/languages/esperanto.inc.php +deleting www/htdocs/calendar/languages/english.inc.php +deleting www/htdocs/calendar/languages/dutch.inc.php +deleting www/htdocs/calendar/languages/danish.inc.php +deleting www/htdocs/calendar/languages/czech.inc.php +deleting www/htdocs/calendar/languages/catalan.inc.php +deleting www/htdocs/calendar/languages/brazilian.inc.php +deleting directory www/htdocs/calendar/languages +deleting www/htdocs/calendar/index.php +deleting www/htdocs/calendar/includes/todo.php +deleting www/htdocs/calendar/includes/login.php +deleting www/htdocs/calendar/includes/event.php +deleting directory www/htdocs/calendar/includes +deleting www/htdocs/calendar/images/valid-rss.png +deleting www/htdocs/calendar/images/tentative.gif +deleting www/htdocs/calendar/images/spacer.gif +deleting www/htdocs/calendar/images/recurring.gif +deleting www/htdocs/calendar/images/phpical-logo.gif +deleting www/htdocs/calendar/images/not_completed.gif +deleting www/htdocs/calendar/images/important.gif +deleting www/htdocs/calendar/images/confirmed.gif +deleting www/htdocs/calendar/images/completed.gif +deleting www/htdocs/calendar/images/cancelled.gif +deleting directory www/htdocs/calendar/images +deleting www/htdocs/calendar/functions/userauth_functions.php +deleting www/htdocs/calendar/functions/upload_functions.php +deleting www/htdocs/calendar/functions/timezones.php +deleting www/htdocs/calendar/functions/template.php +deleting www/htdocs/calendar/functions/overlapping_events.php +deleting www/htdocs/calendar/functions/list_functions.php +deleting www/htdocs/calendar/functions/init.inc.php +deleting www/htdocs/calendar/functions/ical_parser.php +deleting www/htdocs/calendar/functions/event.js +deleting www/htdocs/calendar/functions/error.php +deleting www/htdocs/calendar/functions/draw_functions.php +deleting www/htdocs/calendar/functions/date_functions.php +deleting www/htdocs/calendar/functions/calendar_functions.php +deleting www/htdocs/calendar/functions/admin_functions.php +deleting directory www/htdocs/calendar/functions +deleting www/htdocs/calendar/day.php +deleting www/htdocs/calendar/config.inc.php +deleting www/htdocs/calendar/calendars/publish.mozilla.php +deleting www/htdocs/calendar/calendars/publish.ical.php +deleting www/htdocs/calendar/calendars/chris.ics +deleting www/htdocs/calendar/calendars/US Holidays.ics +deleting www/htdocs/calendar/calendars/Payroll.ics +deleting www/htdocs/calendar/calendars/.DS_Store +deleting directory www/htdocs/calendar/calendars +deleting www/htdocs/calendar/admin/index.php +deleting directory www/htdocs/calendar/admin +deleting www/htdocs/calendar/TIMEZONES +deleting www/htdocs/calendar/README +deleting www/htdocs/calendar/COPYING +deleting www/htdocs/calendar/AUTHORS +deleting www/htdocs/calendar.php +deleting directory www/htdocs/calendar +deleting www/htdocs/apache_pb2_ani.gif +deleting www/htdocs/apache_pb2.png +deleting www/htdocs/apache_pb2.gif +deleting www/htdocs/apache_pb.png +deleting www/htdocs/apache_pb.gif +deleting www/htdocs/Mreport.php +deleting www/htdocs/IT/testList.php +deleting www/htdocs/IT/testEmail.php +deleting www/htdocs/IT/testDate.php +deleting www/htdocs/IT/test4.php +deleting www/htdocs/IT/test.php +deleting www/htdocs/IT/playspace/test.html +deleting www/htdocs/IT/playspace/pos99Log.php +deleting www/htdocs/IT/playspace/ajax_test.html +deleting directory www/htdocs/IT/playspace +deleting www/htdocs/IT/newReportXL.php +deleting www/htdocs/IT/newReport.php +deleting www/htdocs/IT/memLog.php +deleting www/htdocs/IT/lane04.php +deleting www/htdocs/IT/it_other +deleting www/htdocs/IT/functions.php +deleting www/htdocs/IT/functMem.php +deleting www/htdocs/IT/funct1Mem.php +deleting www/htdocs/IT/edit.php +deleting www/htdocs/IT/dropTest2.php +deleting www/htdocs/IT/dropTest1.php +deleting www/htdocs/IT/dropTest.php +deleting www/htdocs/IT/deliQuery.php +deleting www/htdocs/IT/chrgeFix.php +deleting www/htdocs/IT/batches/testFunct.php +deleting www/htdocs/IT/batches/testAlert.php +deleting www/htdocs/IT/batches/session.php +deleting www/htdocs/IT/batches/index_orig.php +deleting www/htdocs/IT/batches/index.php~ +deleting www/htdocs/IT/batches/deleteBatch.php~ +deleting www/htdocs/IT/batches/calendar.html +deleting www/htdocs/IT/batches/batches_orig.php +deleting www/htdocs/IT/batches/batches.php~ +deleting www/htdocs/IT/batches/batcher.php~ +deleting www/htdocs/IT/batches/batcher.php +deleting www/htdocs/IT/batches/addItems.php~ +deleting www/htdocs/IT/batches/addBat_orig.php +deleting www/htdocs/IT/batches/CalendarControl/CalendarControl_O.js +deleting www/htdocs/IT/batches/CalendarControl/CalendarControl.js +deleting www/htdocs/IT/batches/CalendarControl/CalendarControl.css +deleting directory www/htdocs/IT/batches/CalendarControl +deleting www/htdocs/IT/batches/.batches.php.swp +deleting www/htdocs/IT/batches/.batches.php.swo +deleting www/htdocs/IT/batches/.addItems.php.swp +deleting www/htdocs/IT/barcodenew.php +deleting www/htdocs/IT/addShelfTag1.php~ +deleting www/htdocs/IT/addShelfTag.php~ +deleting www/htdocs/IT/UNFI/test.php +deleting www/htdocs/IT/UNFI/forceBatch.phpwe +deleting www/htdocs/IT/UNFI/3.php +deleting www/htdocs/IT/UNFI/3 +deleting www/htdocs/IT/SPINS/testData.php +deleting www/htdocs/IT/SPINS/test.php +deleting www/htdocs/IT/SPINS/perl_freetds_sample.pl +deleting directory www/htdocs/IT/SPINS +deleting www/htdocs/IT/EOMreport.php +deleting directory www/htdocs/HR +deleting www/htdocs/FE/insertqry.php +deleting www/htdocs/FE/employees.inc~ +deleting www/htdocs/FE/EmpInfo.php +deleting www/htdocs/FE/AddEmpInsertBack.php~ +deleting www/htdocs/EOMreportTest.php +deleting www/htdocs/EOMreportNov.php +deleting www/htdocs/EOMreport.php_orig +deleting www/htdocs/CalendarPopup.js +deleting mail/lindy +deleting mail/jeremye +deleting home/smurphy/HR 2007 /Finance/evaluation summary IT.doc +deleting home/smurphy/HR 2007 /Finance/IT MGR 1-06.doc +deleting home/smurphy/HR 2007 /Finance/IT Criteria.doc +deleting home/smurphy/HR 2007 /Finance/IT Coord Job 010807.doc +deleting home/smurphy/HR 2007 /Finance/IT C eval sheet.xls +deleting home/smurphy/HR 2007 /Finance/Eval Wkst IT 11.06.xls +deleting home/smurphy/HR 2007 /Finance/Eval IT Mgr 8.06.doc +deleting home/smurphy/HR 2007 /Finance/Eval IT Mgr 11.06.doc +deleting home/smurphy/HR 2007 /Finance/Criteria IT Mgr 1.06.doc +deleting home/smurphy/HR 2007 /Finance/Criteria FinMgr 4-06.doc +deleting home/smurphy/HR 2007 /Finance/._evaluation summary IT.doc +deleting home/smurphy/HR 2007 /Finance/._IT MGR 1-06.doc +deleting home/smurphy/HR 2007 /Finance/._IT Criteria.doc +deleting home/smurphy/HR 2007 /Finance/._IT Coord Job 010807.doc +deleting home/smurphy/HR 2007 /Finance/._IT C eval sheet.xls +deleting home/smurphy/HR 2007 /Finance/._Eval Wkst IT 11.06.xls +deleting home/smurphy/HR 2007 /Finance/._Eval IT Mgr 8.06.doc +deleting home/smurphy/HR 2007 /Finance/._Eval IT Mgr 11.06.doc +deleting home/smurphy/HR 2007 /Finance/._Criteria IT Mgr 1.06.doc +deleting home/smurphy/HR 2007 /Finance/._Criteria FinMgr 4-06.doc +deleting home/smurphy/HR 2007 /Colter 07/Int Cust Srvc 071107.doc +deleting home/smurphy/HR 2007 /Colter 07/Int Cust Srvc 071107-3.doc +deleting home/smurphy/HR 2007 /Colter 07/Int Cust Srvc 071107-2.doc +deleting home/smurphy/HR 2007 /Colter 07/2007QuestionnaireDraft.doc +deleting home/smurphy/HR 2007 /Colter 07/._Int Cust Srvc 071107.doc +deleting home/smurphy/HR 2007 /Colter 07/._Int Cust Srvc 071107-3.doc +deleting home/smurphy/HR 2007 /Colter 07/._Int Cust Srvc 071107-2.doc +deleting home/smurphy/HR 2007 /Colter 07/._2007QuestionnaireDraft.doc +deleting home/raelynn/Sales Information/Margin summary 07.xls +deleting home/raelynn/Sales Information/._Margin summary 07.xls +deleting home/briana/public +deleting home/SHARE/Public/Vicky's folder/MENU #2 KIT JUly 15-21 +deleting home/SHARE/Public/Vicky's folder/MENU #2 JUly 15 -21 +deleting home/SHARE/Public/Vicky's folder/MENU #1 KIT JULY 8-13 +deleting home/SHARE/Public/Vicky's folder/MENU #1 JULY 8-13 +deleting home/SHARE/Public/Vicky's folder/._Word Work File L_4 +deleting home/SHARE/Public/Vicky's folder/._MENU #2 KIT JUly 15-21 +deleting home/SHARE/Public/Vicky's folder/._MENU #2 JUly 15 -21 +deleting home/SHARE/Public/Vicky's folder/._MENU #1 KIT JULY 8-13 +deleting home/SHARE/Public/Vicky's folder/._MENU #1 JULY 8-13 +deleting home/SHARE/Public/Departments/Store/Admin/Fin Mgr 0505.doc +deleting home/SHARE/Public/Departments/Store/Admin/CriteriaFinMgr0505.doc +deleting home/SHARE/Public/Departments/Store/Admin/._Fin Mgr 0505.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/quiz orientation eval 12-13-05.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/exit interview.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/evaluation summary.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Work Plan.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Title Page.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Terminations.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Table of Contents.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Solving Performance Issues.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Safety Quiz 2006.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/SCORESHEET-Store 2006.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/SCORESHEET-Deli 5-05.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/PolicyStandardWksht.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Personnel Administration.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Pay Level Requirements.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/PAY RANGES CURRENT.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Orientation eval.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Meeting Ground Rules.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Management orientation.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/MT Mission Stmt.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/MT Meetings.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/MT Guidelines 4-05.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/MGMT STRUCTURE.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/MEETING PROCESS.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Interview-Hire.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Injury Report.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Ill&Inj Report3.21.06.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Hiring Practices.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Finances-Payroll.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Extended Unpaid Leave.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Evaluations.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Eval Wkst Template.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Employment Application.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Emergency Contact Form.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Discp Actn Template 2.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Discp Actn Template 1.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Discp Actn Sxl Harass.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Discp Actn Attendance3.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Discp Actn Attendance2.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Discp Actn Attendance1.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Disciplinary Action Guide.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Dept-GenMerch.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Department Meetings.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Criteria Store 2006.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Contract Employees.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Attendance notes.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Attendance documntn.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Attendance Form.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Attend Class&Mtg.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Applying in another dept.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/Applying for a promotion.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/ATTENDANCE TRKNG.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/ALL STAFF MTGS.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._quiz orientation eval 12-13-05.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._exit interview.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._evaluation summary.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Work Plan.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Title Page.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Terminations.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Table of Contents.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Solving Performance Issues.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Safety Quiz 2006.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._SCORESHEET-Store 2006.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._SCORESHEET-Deli 5-05.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._PolicyStandardWksht.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Personnel Administration.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Pay Level Requirements.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._PAY RANGES CURRENT.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Orientation eval.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Meeting Ground Rules.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Management orientation.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._MT Mission Stmt.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._MT Meetings.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._MT Guidelines 4-05.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._MGMT STRUCTURE.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._MEETING PROCESS.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Interview-Hire.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Injury Report.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Ill&Inj Report3.21.06.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Hiring Practices.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Finances-Payroll.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Extended Unpaid Leave.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Evaluations.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Eval Wkst Template.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Employment Application.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Emergency Contact Form.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Discp Actn Template 2.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Discp Actn Template 1.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Discp Actn Sxl Harass.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Discp Actn Attendance3.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Discp Actn Attendance2.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Discp Actn Attendance1.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Disciplinary Action Guide.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Dept-GenMerch.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Department Meetings.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Criteria Store 2006.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Contract Employees.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Attendance notes.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Attendance documntn.xls +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Attendance Form.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Attend Class&Mtg.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Applying in another dept.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._Applying for a promotion.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._ATTENDANCE TRKNG.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._ALL STAFF MTGS.doc +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/._.DS_Store +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06/.DS_Store +deleting home/SHARE/Public/Departments/Management/Best Practices 5-29-06.sitx +deleting directory home/SHARE/Public/Departments/Management/Best Practices 5-29-06 +deleting home/SHARE/Public/Departments/Management/._Best Practices 5-29-06.sitx +deleting home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/.eval scores 1106+.xls.7mVDGQ +deleting home/SHARE/Produce/Tools (Jahn look here first)/RP22.xls +deleting home/SHARE/Produce/Tools (Jahn look here first)/._Daily Sheet.xls +deleting home/SHARE/Finance/Assistants files/AR Reports/2007/July 2007 AR report.xls +deleting home/SHARE/FE/regulars to print/in-out 0707.xls +deleting home/SHARE/FE/regulars to print/._in-out 0707.xls +etc/ +etc/apache2/sysconfig.d/ +etc/backup_utils/ +etc/samba/ +etc/webmin/postfix/ +etc/webmin/sshd/ +home/SHARE/ +home/SHARE/FE/ +home/SHARE/FE/CSC info/ +home/SHARE/FE/RRR/ +home/SHARE/FE/regulars to print/ +home/SHARE/FE/signage/ +home/SHARE/Finance/ +home/SHARE/Finance/Assistants files/AR Reports/2007/ +home/SHARE/Finance/Assistants files/NSF hit lists/ +home/SHARE/Finance/Cash Room/2007/ +home/SHARE/Finance/Cash Room/2007/August 2007/ +home/SHARE/Finance/Cash Room/2007/July 2007/ +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/ +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/AUGUST 2007/ +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/ +etc/aliases +etc/aliases.db +etc/apache2/sysconfig.d/global.conf +etc/apache2/sysconfig.d/include.conf +etc/apache2/sysconfig.d/loadmodule.conf +etc/backup_utils/rsync.log +etc/group +etc/motd +etc/mtab +etc/passwd +etc/samba/smbpasswd +etc/shadow +home/SHARE/Finance/Finance Membership/FY08 Inactive Member Equity/ +etc/webmin/postfix/version +home/SHARE/.DS_Store +home/SHARE/FE/.DS_Store +home/SHARE/FE/RRR/._RRR Report 0607.xls +home/SHARE/FE/RRR/RRR Report 0607.xls +home/SHARE/FE/regulars to print/._in-out.xls +home/SHARE/FE/regulars to print/._letterhead color10 05.doc +home/SHARE/FE/regulars to print/DisorderlyPersonReport.xls +home/SHARE/FE/regulars to print/in-out.xls +home/SHARE/Finance/Assistants files/AR Reports/2007/July 07 AR report.xls +home/SHARE/Finance/Assistants files/NSF hit lists/NSF 8-03-07.xls +home/SHARE/Finance/Assistants files/NSF hit lists/NSF 8-06-07.xls +home/SHARE/Finance/Assistants files/NSF hit lists/NSF 8-08-07.xls +home/SHARE/Finance/Cash Room/2007/.DS_Store +home/SHARE/Finance/Cash Room/2007/August 2007/.DS_Store +home/SHARE/Finance/Cash Room/2007/August 2007/._08-02-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/._08-03-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/._08-04-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/._08-05-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/._08-06-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/._08-07-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/08-02-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/08-03-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/08-04-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/08-05-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/08-06-07 CBS V5.xls +home/SHARE/Finance/Cash Room/2007/August 2007/08-07-07 CBS V5.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/AUGUST 2007/08-01-2007 Daily Sum V16.xls +home/SHARE/Finance/Finance Membership/membership checklist master/ +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/AUGUST 2007/08-02-2007 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/AUGUST 2007/08-03-2007 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/AUGUST 2007/08-04-2007 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/AUGUST 2007/MM-DD-YY Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-14-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-15-207 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-16-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-19-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-20-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-21-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-22-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-23-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-24-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-25-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-26-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-27-2007 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-28-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-29-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-29-07 Daily Sum V16cc.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-30-07 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/07-31-2007 Daily Sum V16.xls +home/SHARE/Finance/DAILY SUM SHEET/2007 Daily Sums/JULY 2007/MM-DD-YY Daily Sum V16.xls +home/SHARE/Finance/Gazette AR/2007 billing/ +home/SHARE/Finance/Restricted/MEMBER LOAN DATA/FY07/ +home/SHARE/Finance/Restricted/MEMBER LOAN DATA/Member Loan Interest/ +home/SHARE/Finance/Finance Membership/FY08 Inactive Member Equity/FY08 0A ##B Report.xls +home/SHARE/Finance/Restricted/MEMBER LOAN DATA/FY07/FY07 Member Loans.xls +home/SHARE/MMS/ +home/SHARE/MTM/ +home/SHARE/Merch/ +home/SHARE/Merch/Joe Sales info/ +home/SHARE/Merch/Joe Sales info/July 07/ +home/SHARE/Merch/Joe Sales info/august 2k7/ +home/SHARE/Finance/Restricted/MEMBER LOAN DATA/Member Loan Interest/Buckley, J.A.xls +home/SHARE/Merch/Merch/ +home/SHARE/Finance/atgpc.log +home/SHARE/MMS/.DS_Store +home/SHARE/MTM/._Who to call 0807.doc +home/SHARE/MTM/Who to call 0807.doc +home/SHARE/Merch/.DS_Store +home/SHARE/Merch/._UNFI IA Top 25 Ranking 03.31.07.xls +home/SHARE/Merch/._UNFI IA Top 25 by Category 04.30.07.xls +home/SHARE/Merch/Joe Sales info/.DS_Store +home/SHARE/Merch/Joe Sales info/august 2k7/.DS_Store +home/SHARE/Merch/Joe Sales info/august 2k7/._AUG EC.xls +home/SHARE/Merch/Joe Sales info/august 2k7/AUG EC.xls +home/SHARE/Merch/Joe Sales info/august 2k7/AUGUSTMOS8UPS.xls +home/SHARE/Payroll/ +home/SHARE/Payroll/Colleens report/ +home/SHARE/Payroll/Colleens report/August 2007/ +home/SHARE/Payroll/Colleens report/July 2007/ +home/SHARE/Payroll/HR Reports/ +home/SHARE/Payroll/HR Reports/Anniversary reports/ +home/SHARE/Payroll/PTO/July 2007/ +home/SHARE/Payroll/Sharons report/ +home/SHARE/Payroll/Sharons report/August 2007/ +home/SHARE/Payroll/Sharons report/July 2007/ +home/SHARE/Produce/Tools (Jahn look here first)/ +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/ +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/2007/ +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/Farmer Tags & Signs/ +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/Farmer Tags & Signs/Food Farm/ +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/Farmer Tags & Signs/Northern Harvest/ +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/Farmer Tags & Signs/Olund/ +home/SHARE/Produce/Tools (Jahn look here first)/Invoices/ +home/SHARE/Produce/Tools (Jahn look here first)/MOFF/ +home/SHARE/Merch/Joe Sales info/august 2k7/GroceryAugCap.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/ +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/ +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/ +home/SHARE/Produce/Tools (Jahn look here first)/Signs/--USE THESE SIGNS--/ +home/SHARE/Merch/Joe Sales info/august 2k7/august2ups.xls +home/SHARE/Merch/Merch/.DS_Store +home/SHARE/Merch/Merch/Karl/.DS_Store +home/SHARE/Merch/Merch/Lisa/.DS_Store +home/SHARE/Merch/Merch/Lisa/Buyers/.DS_Store +home/SHARE/Merch/Merch/Lisa/Buyers/Lisa/.DS_Store +home/SHARE/Merch/UNFI IA Top 25 Ranking 03.31.07.xls +home/SHARE/Merch/UNFI IA Top 25 by Category 04.30.07.xls +home/SHARE/Produce/Tools (Jahn look here first)/Skeds, phone lists/ +home/SHARE/Payroll/Colleens report/August 2007/Weekly Labor Report 7-30 to 8-5-07.xls +home/SHARE/Payroll/PTO/July 2007/ADP PTO Accrual Report to 7-31-2007.pdf +home/SHARE/Payroll/PTO/July 2007/PTO payday labels for 8-07-2007.doc +home/SHARE/Produce/Tools (Jahn look here first)/Weekly Tools/ +home/SHARE/Payroll/Sharons report/08-05-07.xls +home/SHARE/Public/ +home/SHARE/Payroll/Sharons report/August 2007/08-05-07.xls +home/SHARE/Payroll/Sharons report/August 2007/Weekly Labor Report 7-30 to 8-5-07.xls +home/SHARE/Payroll/Sharons report/July 2007/Weekly Labor Report 7-23-07 to 7-29-07.xls +home/SHARE/Payroll/payroll sheet 2007.xls +home/SHARE/Produce/Grab Bag/.DS_Store +home/SHARE/Produce/Tools (Jahn look here first)/.DS_Store +home/SHARE/Produce/Tools (Jahn look here first)/._RP23.xls +home/SHARE/Produce/Tools (Jahn look here first)/._SOUP KITCHEN +home/SHARE/Produce/Tools (Jahn look here first)/Daily Sheet.xls +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/._Daily Sheet.xls +home/SHARE/Produce/Tools (Jahn look here first)/Farmer Info/2007/Farmer Task list & codes.xls +home/SHARE/Produce/Tools (Jahn look here first)/Invoices/._Invoices Aug 2007.xls +home/SHARE/Produce/Tools (Jahn look here first)/Invoices/Invoices Aug 2007.xls +home/SHARE/Produce/Tools (Jahn look here first)/Invoices/Invoices July 2007.xls +home/SHARE/Produce/Tools (Jahn look here first)/Non-Dep for 1st Quarter 08.xls +home/SHARE/Produce/Tools (Jahn look here first)/RP23.xls +home/SHARE/Produce/Tools (Jahn look here first)/Reporting.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/.DS_Store +home/SHARE/Public/.TemporaryItems/folders.502/ +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/._Cleaning Crews.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/._Jul06 vs. Jul07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/._New Loss Sheet.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/._Soup Kitchen TOTALS +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/._Soup Kitchen totals JULY 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Cleaning Crews.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Jul06 vs. Jul07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/New Loss Sheet.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen AUGUST 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen SEPT 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen Dec 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen NOV 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen OCT 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen totals JUNE 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen totals apr 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/._Soup Kitchen totals may 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen AUGUST 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen SEPT 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen Dec 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen NOV 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen OCT 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen totals JUNE 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen totals apr 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2006/Soup Kitchen totals may 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/.DS_Store +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._.DS_Store +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen Apr07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen Aug07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen Feb 07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen Jan 07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen July07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen June07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen MAR07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/._Soup Kitchen May07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen Apr07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen Aug07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen Feb 07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen Jan 07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen July07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen June07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen MAR07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen 2007/Soup Kitchen May07.xls +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen TOTALS +home/SHARE/Produce/Tools (Jahn look here first)/SOUP KITCHEN/Soup Kitchen totals JULY 06.xls +home/SHARE/Produce/Tools (Jahn look here first)/Skeds, phone lists/Hematite Schedule.xls +home/SHARE/Produce/Tools (Jahn look here first)/Skeds, phone lists/RP22.xls +home/SHARE/Public/Departments/ +home/SHARE/Public/Departments/FE/ +home/SHARE/Public/Departments/FE/Briana/ +home/SHARE/Public/Departments/FE/Briana/BJL/ +home/SHARE/Public/Departments/FE/Briana/FE evaluees/ +home/SHARE/Public/Departments/FE/Briana/FE evaluees/eval comments and letter/ +home/SHARE/Public/Departments/FE/Briana/FE evaluees/eval sched&posters/ +home/SHARE/Public/Departments/FE/Briana/FE evaluees/eval stuff/ +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/ +home/SHARE/Public/Departments/FE/FE supplies/csc forms/ +home/SHARE/Public/Departments/FE/michael o/FEnder/ +home/SHARE/Produce/Tools (Jahn look here first)/Staff Documentation.xls +home/SHARE/Public/.DS_Store +home/SHARE/Public/._menus table tents +home/SHARE/Public/BURN/._Copy of Tuscan New Years SOup.doc +home/SHARE/Public/Departments/.DS_Store +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/eval scores 1106+.xls +home/SHARE/Public/Departments/FE/michael o/attendance charts/ +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/eval scores 1106+_1.xls +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/eval scores 1106.xls +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/eval scores 1106_1.xls +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/eval scores 1206+.xls +home/SHARE/Public/Departments/FE/Briana/FE evaluees/scores_old/eval scores 1206+_1.xls +home/SHARE/Public/Departments/FE/michael o/till tracker/ +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/._CCMA BJL 2007.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/._CCMA June 2007 LKA.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/._CCMA – June 2007SSrevise.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/._Coord mtg notes 0707.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/CCMA BJL 2007.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/CCMA June 2007 LKA.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/CCMA – June 2007SSrevise.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/Coord mtg notes 0707.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/Coord mtg notes dec06.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/Coord mtg notes may07.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/FE meeting notes may07.doc +home/SHARE/Public/Departments/FE/Briana/mtg notes & agendas/FE mtg agenda 021407.doc +home/SHARE/Public/Departments/FE/Briana/my self evals/ BJL self eval annual07.doc +home/SHARE/Public/Departments/FE/Briana/pics/ClipArt [DYDBY].cil +home/SHARE/Public/Departments/FE/Briana/pics/ClipArt [JVVOX].cil +home/SHARE/Public/Departments/FE/Briana/pics/ClipArt [QAAAH].cil +home/SHARE/Public/Departments/FE/Briana/pics/ClipArt [QFRRC].cil +home/SHARE/Public/Departments/FE/Briana/pics/ClipArt [U.cil +home/SHARE/Public/Departments/FE/Briana/pics/ClipArt [UEUCY].cil +home/SHARE/Public/Departments/FE/FE IT fix lists/FE IT fix list 040907.doc +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/._FE PPL thru 010707.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/._FE PPL thru 112606.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/._FE PPL thru 121006.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 010707.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 012107.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 012707.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 053107.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 061507.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 071507.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 112606.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE PPL thru 121006.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/FE payrates 030607.pdf +home/SHARE/Public/Departments/FE/FE Paid Leave & PRates/Front End-PTO to 12-24-2006.pdf +home/SHARE/Public/Departments/FE/FE supplies/.DS_Store +home/SHARE/Public/Departments/FE/FE supplies/FE postings/bagging tetris.xls +home/SHARE/Public/Departments/FE/FE supplies/csc forms/._in-out.xls +home/SHARE/Public/Departments/FE/FE supplies/csc forms/in-out.xls +home/SHARE/Public/Departments/FE/FE training/all quizes for FE/._FEnder Safety quiz.doc +home/SHARE/Public/Departments/FE/FE training/all quizes for FE/._Orientation quiz.doc +home/SHARE/Public/Departments/FE/michael o/.DS_Store +home/SHARE/Public/Departments/FE/michael o/FEnder/._calendar orange sheet2007.xls +home/SHARE/Public/Departments/FE/michael o/FEnder/._schedule07.xls +home/SHARE/Public/Departments/FE/michael o/FEnder/calendar orange sheet2007.xls +home/SHARE/Public/Departments/FE/michael o/FEnder/schedule07.xls +home/SHARE/Public/Departments/FE/michael o/attendance charts/._fe attendance2007.xls +home/SHARE/Public/Departments/FE/michael o/attendance charts/fe attendance2007.xls +home/SHARE/Public/Departments/FE/michael o/till tracker/._till charts2007.xls +home/SHARE/Public/Departments/FE/michael o/till tracker/FE discrepancy notice 1206.xls +home/SHARE/Public/Departments/IT/SPINS/ +home/SHARE/Public/Departments/FE/michael o/till tracker/till charts2007.xls +home/SHARE/Public/Departments/IT/SPINS/wfcc_wk30.csv +home/SHARE/Public/Departments/IT/SPINS/wfcc_wk30.zip +home/SHARE/Public/Departments/IT/SPINS/wfcc_wk31.csv +home/SHARE/Public/Departments/Management/ +home/SHARE/Public/Departments/Store/ +home/SHARE/Public/Departments/Store/Admin/ +home/SHARE/Public/Departments/Store/Store/ +home/SHARE/Public/Departments/IT/SPINS/wfcc_wk31.zip +home/SHARE/Public/Departments/Management/.DS_Store +home/SHARE/Public/Departments/Store/.DS_Store +home/SHARE/Public/Departments/Store/Admin/.DS_Store +home/SHARE/Public/Departments/Store/Debbie/.DS_Store +home/SHARE/Public/Departments/Store/Documents/.DS_Store +home/SHARE/Public/Departments/Store/Store/.DS_Store +home/SHARE/Public/Job Descriptions 07/Finance&IT/ +home/SHARE/Public/Job evaluation materials/ +home/SHARE/Public/Job evaluation materials/Admin/ +home/SHARE/Public/Network Trash Folder/ +home/SHARE/Public/Pictures/ +home/SHARE/Public/Pictures/ pix/ +home/SHARE/Public/Pictures/ pix/21/ +home/SHARE/Public/Pictures/ pix/21/Data/ +home/SHARE/Public/Pictures/ pix/21/Thumbs/ +home/SHARE/Public/Departments/coopEd.ppt +home/SHARE/Public/Pictures/GMM II/ +home/SHARE/Public/Pictures/Produce_Pics/ +home/SHARE/Public/STAFF LISTS/ +home/SHARE/Public/Job Descriptions 07/.DS_Store +home/SHARE/Public/Job Descriptions 07/ADMIN/._STORE MANAGER.doc +home/SHARE/Public/Job Descriptions 07/Finance&IT/._IT Coord Criteria 010807.doc +home/SHARE/Public/Job Descriptions 07/deli/._DeliCounterStaff.doc +home/SHARE/Public/Job Descriptions 07/deli/._counter man. criteria.doc +home/SHARE/Public/Job evaluation materials/.DS_Store +home/SHARE/Public/Job evaluation materials/Admin/._M&MS Mgr 4-06.doc +home/SHARE/Public/NEW DELI 8.xls +home/SHARE/Public/Network Trash Folder/.DS_Store +home/SHARE/Public/Organic Standards/.DS_Store +home/SHARE/Public/Pictures/ pix/.DS_Store +home/SHARE/Public/Pictures/ pix/21/.DS_Store +home/SHARE/Public/Pictures/ pix/21/._P1010001.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010002.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010003.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010004.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010005.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010006.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010007.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010008.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010009.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010010.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010011.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010012.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010013.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010014.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010015.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010016.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010017.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010018.JPG +home/SHARE/Public/Vicky's folder/ +home/SHARE/Public/Pictures/ pix/21/._P1010020.JPG +home/SHARE/Public/Pictures/ pix/21/._P1010021.JPG +home/SHARE/Public/Pictures/ pix/21/Data/.DS_Store +home/SHARE/Public/Pictures/ pix/21/Data/2247 +home/SHARE/Public/Pictures/ pix/21/Data/2247.attr +home/SHARE/Public/Pictures/ pix/21/Data/2248 +home/SHARE/Public/Pictures/ pix/21/Data/2248.attr +home/SHARE/Public/Pictures/ pix/21/Data/2249 +home/SHARE/Public/Pictures/ pix/21/Data/2249.attr +home/SHARE/Public/Pictures/ pix/21/Data/2250 +home/SHARE/Public/Pictures/ pix/21/Data/2250.attr +home/SHARE/Public/Pictures/ pix/21/Data/2251 +home/SHARE/Public/Pictures/ pix/21/Data/2251.attr +home/SHARE/Public/Pictures/ pix/21/Data/2252 +home/SHARE/Public/Pictures/ pix/21/Data/2252.attr +home/SHARE/Public/Pictures/ pix/21/Data/2253 +home/SHARE/Public/Pictures/ pix/21/Data/2253.attr +home/SHARE/Public/Pictures/ pix/21/Data/2254 +home/SHARE/Public/Pictures/ pix/21/Data/2254.attr +home/SHARE/Public/Pictures/ pix/21/Data/2255 +home/SHARE/Public/Pictures/ pix/21/Data/2255.attr +home/SHARE/Public/Pictures/ pix/21/Data/2256 +home/SHARE/Public/Pictures/ pix/21/Data/2256.attr +home/SHARE/Public/Pictures/ pix/21/Data/2257 +home/SHARE/Public/Pictures/ pix/21/Data/2257.attr +home/SHARE/Public/Pictures/ pix/21/Data/2258 +home/SHARE/Public/Pictures/ pix/21/Data/2258.attr +home/SHARE/Public/Pictures/ pix/21/Data/2259 +home/SHARE/Public/Pictures/ pix/21/Data/2259.attr +home/SHARE/Public/Pictures/ pix/21/Data/2260 +home/SHARE/Public/Pictures/ pix/21/Data/2260.attr +home/SHARE/Public/Pictures/ pix/21/Data/2261 +home/SHARE/Public/Pictures/ pix/21/Data/2261.attr +home/SHARE/Public/Pictures/ pix/21/Data/2262 +home/SHARE/Public/Pictures/ pix/21/Data/2262.attr +home/SHARE/Public/Pictures/ pix/21/Data/2263 +home/SHARE/Public/Pictures/ pix/21/Data/2263.attr +home/SHARE/Public/Pictures/ pix/21/Data/2264 +home/SHARE/Public/Pictures/ pix/21/Data/2264.attr +home/SHARE/Public/Pictures/ pix/21/Data/2265 +home/SHARE/Public/Pictures/ pix/21/Data/2265.attr +home/SHARE/Public/Pictures/ pix/21/Data/2266 +home/SHARE/Public/Pictures/ pix/21/Data/2266.attr +home/SHARE/Public/Pictures/ pix/21/Data/2267 +home/SHARE/Public/Pictures/ pix/21/Data/2267.attr +home/SHARE/Public/Pictures/ pix/21/P1010001.JPG +home/SHARE/Public/Pictures/ pix/21/P1010002.JPG +home/SHARE/Public/Pictures/ pix/21/P1010003.JPG +home/SHARE/Public/Pictures/ pix/21/P1010004.JPG +home/SHARE/Public/Pictures/ pix/21/P1010005.JPG +home/SHARE/Public/Pictures/ pix/21/P1010006.JPG +home/SHARE/Public/Pictures/ pix/21/P1010007.JPG +home/SHARE/Public/Pictures/ pix/21/P1010008.JPG +home/SHARE/Public/Pictures/ pix/21/P1010009.JPG +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/ +home/SHARE/Public/Vicky's folder/HOT BAR NEW SIGNS/ +home/SHARE/Public/Pictures/ pix/21/P1010010.JPG +home/SHARE/Public/Pictures/ pix/21/P1010011.JPG +home/SHARE/Public/Pictures/ pix/21/P1010012.JPG +home/SHARE/Public/Pictures/ pix/21/P1010013.JPG +home/SHARE/Public/Pictures/ pix/21/P1010014.JPG +home/SHARE/Public/Pictures/ pix/21/P1010015.JPG +home/SHARE/Public/Pictures/ pix/21/P1010016.JPG +home/SHARE/Public/Pictures/ pix/21/P1010017.JPG +home/SHARE/Public/Pictures/ pix/21/P1010018.JPG +home/SHARE/Public/Vicky's folder/MENUS OLD 2007/ +home/SHARE/Public/Pictures/ pix/21/P1010020.JPG +home/SHARE/Public/Pictures/ pix/21/P1010021.JPG +home/SHARE/Public/Pictures/ pix/21/Thumbs.db +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 / +home/SHARE/Public/Pictures/ pix/21/Thumbs/.DS_Store +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2247.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2248.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2249.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2250.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2251.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2252.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2253.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2254.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2255.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2256.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2257.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2258.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2259.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2260.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2261.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2262.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2263.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2264.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2265.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2266.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/._2267.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2247.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2248.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2249.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2250.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2251.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2252.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2253.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2254.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2255.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2256.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2257.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2258.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2259.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2260.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2261.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2262.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2263.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2264.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2265.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2266.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/2267.jpg +home/SHARE/Public/Pictures/ pix/21/Thumbs/Thumbs.db +home/SHARE/Public/Pictures/.DS_Store +home/SHARE/Public/Pictures/GMM II/.DS_Store +home/SHARE/Public/Pictures/GMM/.DS_Store +home/SHARE/Public/Pictures/GMM/100OLYMP/.DS_Store +home/SHARE/Public/Pictures/Produce_Pics/.DS_Store +home/SHARE/Public/STAFF LISTS/._BigList.xls +home/SHARE/Public/STAFF LISTS/._STAFFLIST 7-24-07.xls +home/SHARE/Public/STAFF LISTS/BigList.xls +home/SHARE/Public/STAFF LISTS/STAFFLIST 7-24-07.xls +home/SHARE/Public/Vicky's folder/.DS_Store +home/SHARE/Public/Vicky's folder/RECIPES TYPED/ +home/SHARE/Public/Vicky's folder/._COOP PARTNERS ORDER FORM +home/SHARE/Public/Vicky's folder/._COST PER # PRODUCE LIST +home/SHARE/Public/Vicky's folder/._Grocery_8.xls +home/SHARE/Public/Vicky's folder/._H BROOKS ORDER GUIDE +home/SHARE/Public/Vicky's folder/._INGRED LIST 5-9-07.xls +home/SHARE/Public/Vicky's folder/._MENU #1 AUG 5-11 +home/SHARE/Public/Vicky's folder/._MENU #1 KIT AUG 5-11 +home/SHARE/Public/Vicky's folder/._MENU #2 AUG 12 -18 +home/SHARE/Public/Vicky's folder/._MENU #2 AUG 12-18 KIT COPY +home/SHARE/Public/Vicky's folder/._MENU #3 JUly 22-JUly28 KIT COPY +home/SHARE/Public/Vicky's folder/._MENU #4 JULY 29-AUG 4 +home/SHARE/Public/Vicky's folder/._MENU #4 KIT JUL 29-AUG 4.doc +home/SHARE/Public/Vicky's folder/._MENU MONTH CALENDAR.xls +home/SHARE/Public/Vicky's folder/._SIGN HOT BAR HOURS .doc +home/SHARE/Public/Vicky's folder/._SUPPLIER LIST +home/SHARE/Public/Vicky's folder/._Word Work File L_3 +home/SHARE/Public/Vicky's folder/._Word Work File L_3558 +home/SHARE/Public/Vicky's folder/BLANK SIGNS Plain 2_4_8 sign.xls +home/SHARE/Public/Vicky's folder/COOP PARTNERS ORDER FORM +home/SHARE/Public/Vicky's folder/COST PER # PRODUCE LIST +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/._GAZZETE MENU LIST +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/._MENU COMPLET LIST +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/._MENU COMPLET LIST 2 +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/._MENU LIST +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/GAZZETE MENU LIST +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/MENU COMPLET LIST +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/MENU COMPLET LIST 2 +home/SHARE/Public/Vicky's folder/GAZZET MENU FILE/MENU LIST +home/SHARE/Public/Vicky's folder/Grocery_8.xls +home/SHARE/Public/Video/ +home/SHARE/Public/Vicky's folder/H BROOKS ORDER GUIDE +home/SHARE/Public/Vicky's folder/HOT BAR NEW SIGNS/._GOLDEN MUSTARD TOFU-COLESLAW +home/SHARE/Public/Vicky's folder/HOT BAR NEW SIGNS/GOLDEN MUSTARD TOFU-COLESLAW +home/SHARE/Public/Vicky's folder/HOT BAR PLANNER.xls +home/SHARE/Public/Vicky's folder/INGRED LIST 5-9-07.xls +home/SHARE/Public/Vicky's folder/MENU #1 AUG 5-11 +home/SHARE/Public/Vicky's folder/MENU #1 KIT AUG 5-11 +home/SHARE/Public/Vicky's folder/MENU #2 AUG 12 -18 +home/SHARE/Public/Vicky's folder/MENU #2 AUG 12-18 KIT COPY +home/SHARE/Public/Vicky's folder/MENU #3 JUly 22-JUly28 KIT COPY +home/SHARE/Public/Vicky's folder/MENU #4 JULY 29-AUG 4 +home/SHARE/Public/Vicky's folder/MENU #4 KIT JUL 29-AUG 4.doc +home/SHARE/Public/Vicky's folder/MENU MONTH CALENDAR.xls +home/SHARE/Public/Vicky's folder/MENUS OLD 2007/._MENU #2 JUly 15 -21 +home/SHARE/Public/Vicky's folder/MENUS OLD 2007/._MENU #2 KIT JUly 15-21 +home/SHARE/Public/Vicky's folder/MENUS OLD 2007/MENU #2 JUly 15 -21 +home/SHARE/Public/Vicky's folder/MENUS OLD 2007/MENU #2 KIT JUly 15-21 +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /._FOUR BEAN SALAD +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /._QUINOA CORN SALAD W PUMPKIN #E7 +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /._QUINOA SALAD WITH TOASTED AL#D8 +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /._THAI BROC SALAD +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /FOUR BEAN SALAD +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /QUINOA CORN SALAD W PUMPKIN #E7 +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /QUINOA SALAD WITH TOASTED AL#D8 +home/SHARE/Public/Vicky's folder/NEW CASE SIGNS 3-5-07 /THAI BROC SALAD +home/SHARE/Public/Vicky's folder/RECIPES TYPED/._CREAMY CAROLINA COLESLAW RECIPE +home/SHARE/Public/Vicky's folder/RECIPES TYPED/._GOLDEN MUSTARD BBQ SAUCE RECIPE +home/SHARE/Public/Vicky's folder/RECIPES TYPED/CREAMY CAROLINA COLESLAW RECIPE +home/SHARE/Public/Vicky's folder/RECIPES TYPED/GOLDEN MUSTARD BBQ SAUCE RECIPE +home/SHARE/Public/Vicky's folder/SIGN HOT BAR HOURS .doc +home/SHARE/Public/Vicky's folder/Word Work File L_3 +home/SHARE/Public/Video/10_20070727174726_100_MARK.avi +home/SHARE/Public/is4c/.DS_Store +home/SHARE/Public/plu-list.csv +home/SHARE/Public/who to call.xls +home/aaron/.openwebmail/db/aaron.cache +home/aaron/.openwebmail/db/aaron.dir +home/aaron/.openwebmail/db/aaron.pag +home/aaron/.openwebmail/db/mail-trash.dir +home/aaron/.openwebmail/db/mail-trash.pag +home/aaron/.openwebmail/db/sent-mail.dir +home/aaron/.openwebmail/db/sent-mail.pag +home/aaron/.openwebmail/history.log +home/aaron/.openwebmail/pop3/pop3.check +home/aaron/.openwebmail/webmail/filter.check +home/aaron/.openwebmail/webmail/filter.pid +home/aaron/.openwebmail/webmail/trash.check +home/aaron/mail/mail-trash +home/aaron/mail/sent-mail +home/akemp/.openwebmail/db/akemp.cache +home/akemp/.openwebmail/db/akemp.dir +home/akemp/.openwebmail/db/akemp.pag +home/akemp/.openwebmail/db/mail-trash.dir +home/akemp/.openwebmail/db/mail-trash.pag +home/akemp/.openwebmail/db/sent-mail.dir +home/akemp/.openwebmail/db/sent-mail.pag +home/akemp/.openwebmail/db/spam-mail.pag +home/akemp/.openwebmail/history.log +home/akemp/.openwebmail/pop3/pop3.check +home/akemp/.openwebmail/webmail/filter.check +home/akemp/.openwebmail/webmail/filter.pid +home/akemp/.openwebmail/webmail/trash.check +home/akemp/mail/mail-trash +home/akemp/mail/sent-mail +home/akemp/mail/spam-mail +home/alepak/.openwebmail/db/alepak.cache +home/alepak/.openwebmail/db/alepak.pag +home/alepak/.openwebmail/db/mail-trash.dir +home/alepak/.openwebmail/db/mail-trash.pag +home/alepak/.openwebmail/history.log +home/alepak/.openwebmail/pop3/pop3.check +home/alepak/.openwebmail/webmail/filter.check +home/alepak/.openwebmail/webmail/filter.pid +home/alepak/.openwebmail/webmail/trash.check +home/alepak/mail/mail-trash +home/alex/.openwebmail/db/alex.cache +home/alex/.openwebmail/db/alex.dir +home/alex/.openwebmail/db/alex.pag +home/alex/.openwebmail/history.log +home/alex/.openwebmail/pop3/pop3.check +home/alex/.openwebmail/webmail/filter.check +home/alex/.openwebmail/webmail/filter.pid +home/alex/.openwebmail/webmail/trash.check +home/amber/.openwebmail/db/amber.cache +home/amber/.openwebmail/db/amber.dir +home/amber/.openwebmail/db/amber.pag +home/amber/.openwebmail/db/mail-trash.dir +home/amber/.openwebmail/db/mail-trash.pag +home/amber/.openwebmail/db/sent-mail.dir +home/amber/.openwebmail/db/sent-mail.pag +home/amber/.openwebmail/history.log +home/amber/.openwebmail/pop3/pop3.check +home/amber/.openwebmail/webmail/filter.check +home/amber/.openwebmail/webmail/filter.pid +home/amber/.openwebmail/webmail/trash.check +home/amber/mail/mail-trash +home/amber/mail/sent-mail +home/andrea/.openwebmail/db/andrea.cache +home/andrea/.openwebmail/db/andrea.dir +home/andrea/.openwebmail/db/andrea.pag +home/andy/ +home/andrea/.openwebmail/db/mail-trash.pag +home/andrea/.openwebmail/history.log +home/andrea/.openwebmail/pop3/pop3.check +home/andrea/.openwebmail/webmail/filter.check +home/andrea/.openwebmail/webmail/filter.pid +home/andrea/.openwebmail/webmail/trash.check +home/andrea/mail/mail-trash +home/andy/.bash_history +home/andy/.mysql_history +home/andy/.openwebmail/db/andy.cache +home/andy/.openwebmail/db/andy.dir +home/andy/.openwebmail/db/andy.pag +home/andy/.openwebmail/db/mail-trash.dir +home/andy/.openwebmail/db/mail-trash.pag +home/andy/.openwebmail/db/notme.cache +home/andy/.openwebmail/db/notme.pag +home/andy/.openwebmail/db/saved-messages.cache +home/andy/.openwebmail/db/saved-messages.pag +home/andy/.openwebmail/db/sent-mail.dir +home/andy/.openwebmail/db/sent-mail.pag +home/andy/.openwebmail/history.log +home/andy/.openwebmail/pop3/pop3.check +home/andy/.openwebmail/webmail/filter.check +home/andy/.openwebmail/webmail/filter.folderdb.pag +home/andy/.openwebmail/webmail/filter.pid +home/andy/.openwebmail/webmail/filter.ruledb.pag +home/andy/.openwebmail/webmail/trash.check +home/andy/.viminfo +home/andy/.viminfu.tmp +home/andy/mail/mail-trash +home/andy/mail/notme +home/andy/mail/saved-messages +home/anni/.openwebmail/db/ +home/andy/mail/sent-mail +home/anni/.openwebmail/db/Annual Meeting.cache +home/anni/.openwebmail/db/Annual Meeting.dir +home/anni/.openwebmail/db/Annual Meeting.pag +home/anni/.openwebmail/db/BCO art gallery.cache +home/anni/.openwebmail/db/BCO art gallery.pag +home/anni/.openwebmail/db/Gluten-Free Additions.dir +home/anni/.openwebmail/db/Gluten-Free Additions.pag +home/anni/.openwebmail/db/anni.cache +home/anni/.openwebmail/db/anni.dir +home/anni/.openwebmail/db/anni.pag +home/anni/.openwebmail/db/class ideas.pag +home/anni/.openwebmail/db/classes.dir +home/anni/.openwebmail/db/classes.pag +home/anni/.openwebmail/db/demos.dir +home/anni/.openwebmail/db/demos.pag +home/anni/.openwebmail/db/mail-trash.cache +home/anni/.openwebmail/db/mail-trash.dir +home/anni/.openwebmail/db/mail-trash.pag +home/anni/.openwebmail/db/marketing.dir +home/anni/.openwebmail/db/marketing.pag +home/anni/.openwebmail/db/member .dir +home/anni/.openwebmail/db/member .pag +home/anni/.openwebmail/db/paperroute.pag +home/anni/.openwebmail/db/personal.cache +home/anni/.openwebmail/db/personal.dir +home/anni/.openwebmail/db/personal.pag +home/anni/.openwebmail/db/sent-mail.cache +home/anni/.openwebmail/db/sent-mail.dir +home/anni/mail/ +home/anni/.openwebmail/db/sent-mail.pag +home/anni/.openwebmail/history.log +home/anni/.openwebmail/pop3/pop3.check +home/anni/.openwebmail/webmail/filter.check +home/anni/.openwebmail/webmail/filter.pid +home/anni/.openwebmail/webmail/search.cache +home/anni/.openwebmail/webmail/trash.check +home/anni/mail/Annual Meeting +home/anni/mail/BCO art gallery +home/anni/mail/Gluten-Free Additions +home/anni/mail/class ideas +home/anni/mail/classes +home/anni/mail/demos +home/anni/mail/mail-trash +home/anni/mail/marketing +home/anni/mail/member +home/anni/mail/paperroute +home/anni/mail/personal +home/anni/mail/sent-mail +home/atse/.openwebmail/db/atse.cache +home/atse/.openwebmail/db/atse.dir +home/atse/.openwebmail/db/atse.pag +home/atse/.openwebmail/db/mail-trash.dir +home/atse/.openwebmail/db/mail-trash.pag +home/atse/.openwebmail/history.log +home/atse/.openwebmail/pop3/pop3.check +home/atse/.openwebmail/webmail/filter.check +home/atse/.openwebmail/webmail/filter.pid +home/atse/.openwebmail/webmail/trash.check +home/atse/mail/mail-trash +home/bjornb/.openwebmail/db/bjornb.cache +home/bjornb/.openwebmail/db/bjornb.pag +home/bjornb/.openwebmail/db/mail-trash.dir +home/bjornb/.openwebmail/db/mail-trash.pag +home/bjornb/.openwebmail/db/sent-mail.pag +home/bjornb/.openwebmail/history.log +home/bjornb/.openwebmail/pop3/pop3.check +home/bjornb/.openwebmail/webmail/filter.check +home/bjornb/.openwebmail/webmail/filter.pid +home/bjornb/.openwebmail/webmail/trash.check +home/bjornb/mail/mail-trash +home/bjornb/mail/sent-mail +home/brad/.openwebmail/db/brad.cache +home/brad/.openwebmail/db/brad.pag +home/brad/.openwebmail/db/saved-messages.cache +home/brad/.openwebmail/db/saved-messages.dir +home/brad/.openwebmail/db/saved-messages.pag +home/brad/.openwebmail/db/sent-mail.dir +home/brad/.openwebmail/db/sent-mail.pag +home/brad/.openwebmail/history.log +home/brad/.openwebmail/pop3/pop3.check +home/brad/.openwebmail/webmail/filter.check +home/brad/.openwebmail/webmail/filter.pid +home/brad/.openwebmail/webmail/trash.check +home/brad/mail/saved-messages +home/briana/ +home/briana/.openwebmail/db/ +home/brad/mail/sent-mail +home/briana/.DS_Store +home/briana/.openwebmail/db/CSC.cache +home/briana/.openwebmail/db/CSC.dir +home/briana/.openwebmail/db/CSC.pag +home/briana/.openwebmail/db/Coords.dir +home/briana/.openwebmail/db/Coords.pag +home/briana/.openwebmail/db/Deli.dir +home/briana/.openwebmail/db/Deli.pag +home/briana/.openwebmail/db/FE completion notices.pag +home/briana/.openwebmail/db/FE eval comments.cache +home/briana/.openwebmail/db/FE eval comments.pag +home/briana/.openwebmail/db/FE fixit requests.dir +home/briana/.openwebmail/db/FE fixit requests.pag +home/briana/.openwebmail/db/FE sched dream-schoool.cache +home/briana/.openwebmail/db/FE sched dream-schoool.dir +home/briana/.openwebmail/db/FE sched dream-schoool.pag +home/briana/.openwebmail/db/FE sched help need.cache +home/briana/.openwebmail/db/FE sched help need.dir +home/briana/.openwebmail/db/FE sched help need.pag +home/briana/.openwebmail/db/FE schedule payroll.dir +home/briana/.openwebmail/db/FE schedule payroll.pag +home/briana/.openwebmail/db/FE supplies.cache +home/briana/.openwebmail/db/FE supplies.dir +home/briana/.openwebmail/db/FE supplies.pag +home/briana/.openwebmail/db/FEnder.pag +home/briana/.openwebmail/db/Finance.dir +home/briana/.openwebmail/db/Finance.pag +home/briana/.openwebmail/db/Goings ons - instore.dir +home/briana/.openwebmail/db/Goings ons - instore.pag +home/briana/.openwebmail/db/Goings ons - outside.dir +home/briana/.openwebmail/db/Goings ons - outside.pag +home/briana/.openwebmail/db/HR.cache +home/briana/.openwebmail/db/HR.dir +home/briana/.openwebmail/db/HR.pag +home/briana/.openwebmail/db/IT.dir +home/briana/.openwebmail/db/IT.pag +home/briana/.openwebmail/db/M&M.dir +home/briana/.openwebmail/db/M&M.pag +home/briana/.openwebmail/db/MTM.cache +home/briana/.openwebmail/db/MTM.dir +home/briana/.openwebmail/db/MTM.pag +home/briana/.openwebmail/db/Merch.dir +home/briana/.openwebmail/db/Merch.pag +home/briana/.openwebmail/db/My Work Plan.cache +home/briana/.openwebmail/db/My Work Plan.dir +home/briana/.openwebmail/db/My Work Plan.pag +home/briana/.openwebmail/db/NSF checks.cache +home/briana/.openwebmail/db/NSF checks.dir +home/briana/.openwebmail/db/NSF checks.pag +home/briana/.openwebmail/db/Produce.pag +home/briana/.openwebmail/db/WP Jess.pag +home/briana/.openwebmail/db/WP Michael.dir +home/briana/.openwebmail/db/WP Michael.pag +home/briana/.openwebmail/db/WP Rain.pag +home/briana/.openwebmail/db/attachments.pag +home/briana/.openwebmail/db/briana.cache +home/briana/.openwebmail/db/briana.dir +home/briana/.openwebmail/db/briana.pag +home/briana/.openwebmail/db/classes.dir +home/briana/.openwebmail/db/classes.pag +home/briana/.openwebmail/db/customers shoplift disorderly.dir +home/briana/.openwebmail/db/customers shoplift disorderly.pag +home/briana/.openwebmail/db/customers transaction service.dir +home/briana/.openwebmail/db/customers transaction service.pag +home/briana/.openwebmail/db/daysheets.dir +home/briana/.openwebmail/db/daysheets.pag +home/briana/.openwebmail/db/employee morale.dir +home/briana/.openwebmail/db/employee morale.pag +home/briana/.openwebmail/db/eval notes.cache +home/briana/.openwebmail/db/eval notes.dir +home/briana/.openwebmail/db/eval notes.pag +home/briana/.openwebmail/db/gargaz.dir +home/briana/.openwebmail/db/gargaz.pag +home/briana/.openwebmail/db/industry.dir +home/briana/.openwebmail/db/industry.pag +home/briana/.openwebmail/db/jobz.pag +home/briana/.openwebmail/db/lost and found.dir +home/briana/.openwebmail/db/lost and found.pag +home/briana/.openwebmail/db/meeting notes (all).pag +home/briana/.openwebmail/db/new hire trainings.dir +home/briana/.openwebmail/db/new hire trainings.pag +home/briana/.openwebmail/db/new store.pag +home/briana/.openwebmail/db/personal leave.dir +home/briana/.openwebmail/db/personal leave.pag +home/briana/.openwebmail/db/sales and budget.cache +home/briana/.openwebmail/db/sales and budget.dir +home/briana/.openwebmail/db/sales and budget.pag +home/briana/.openwebmail/db/saved-messages.cache +home/briana/.openwebmail/db/saved-messages.dir +home/briana/.openwebmail/db/saved-messages.pag +home/briana/.openwebmail/db/sent-mail.cache +home/briana/.openwebmail/db/sent-mail.dir +home/briana/.openwebmail/db/sent-mail.pag +home/briana/mail/ +home/briana/.openwebmail/db/sentimental value.cache +home/briana/.openwebmail/db/sentimental value.dir +home/briana/.openwebmail/db/sentimental value.pag +home/briana/.openwebmail/db/spam-mail.pag +home/briana/.openwebmail/db/talkin' to's.cache +home/briana/.openwebmail/db/talkin' to's.dir +home/briana/.openwebmail/db/talkin' to's.pag +home/briana/.openwebmail/db/voicemail poll.pag +home/briana/.openwebmail/history.log +home/briana/.openwebmail/pop3/pop3.check +home/briana/.openwebmail/webmail/filter.check +home/briana/.openwebmail/webmail/filter.pid +home/briana/.openwebmail/webmail/search.cache +home/briana/.openwebmail/webmail/trash.check +home/briana/mail/CSC +home/briana/mail/Coords +home/briana/mail/Deli +home/briana/mail/FE completion notices +home/briana/mail/FE eval comments +home/briana/mail/FE fixit requests +home/briana/mail/FE sched dream-schoool +home/briana/mail/FE sched help need +home/briana/mail/FE schedule payroll +home/briana/mail/FE supplies +home/briana/mail/FEnder +home/briana/mail/Finance +home/briana/mail/Goings ons - instore +home/briana/mail/Goings ons - outside +home/briana/mail/HR +home/briana/mail/IT +home/briana/mail/M&M +home/briana/mail/MTM +home/briana/mail/Merch +home/briana/mail/My Work Plan +home/briana/mail/NSF checks +home/briana/mail/Produce +home/briana/mail/WP Jess +home/briana/mail/WP Michael +home/briana/mail/WP Rain +home/briana/mail/attachments +home/briana/mail/classes +home/briana/mail/customers shoplift disorderly +home/briana/mail/customers transaction service +home/briana/mail/daysheets +home/briana/mail/employee morale +home/briana/mail/eval notes +home/briana/mail/gargaz +home/briana/mail/industry +home/briana/mail/jobz +home/briana/mail/lost and found +home/briana/mail/meeting notes (all) +home/briana/mail/new hire trainings +home/briana/mail/new store +home/briana/mail/personal leave +home/briana/mail/sales and budget +home/briana/mail/saved-messages +home/briana/mail/sent-mail +home/brianne/ +home/brianne/.openwebmail/db/ +home/brianne/mail/ +home/byoung/.openwebmail/webaddr/ +home/byoung/.openwebmail/webmail/ +home/briana/mail/sentimental value +home/briana/mail/spam-mail +home/briana/mail/talkin' to's +home/briana/mail/voicemail poll +home/brianne/.DS_Store +home/brianne/.openwebmail/db/brianne.cache +home/brianne/.openwebmail/db/brianne.dir +home/brianne/.openwebmail/db/brianne.pag +home/brianne/.openwebmail/db/mail-trash.dir +home/brianne/.openwebmail/db/mail-trash.pag +home/brianne/.openwebmail/db/saved-drafts.cache +home/brianne/.openwebmail/db/saved-drafts.dir +home/brianne/.openwebmail/db/saved-drafts.pag +home/brianne/.openwebmail/db/saved-messages.cache +home/brianne/.openwebmail/db/saved-messages.dir +home/brianne/.openwebmail/db/saved-messages.pag +home/brianne/.openwebmail/db/sent-mail.cache +home/brianne/.openwebmail/db/sent-mail.dir +home/brianne/.openwebmail/db/sent-mail.pag +home/brianne/.openwebmail/history.log +home/brianne/.openwebmail/openwebmailrc +home/brianne/.openwebmail/pop3/pop3.check +home/brianne/.openwebmail/webmail/filter.check +home/brianne/.openwebmail/webmail/filter.pid +home/brianne/.openwebmail/webmail/signature +home/brianne/.openwebmail/webmail/trash.check +home/brianne/.vacation.msg +home/brianne/mail/mail-trash +home/brianne/mail/saved-drafts +home/brianne/mail/saved-messages +home/brianne/mail/sent-mail +home/byoung/.openwebmail/db/byoung.cache +home/byoung/.openwebmail/db/byoung.pag +home/byoung/.openwebmail/db/mail-trash.dir +home/byoung/.openwebmail/db/mail-trash.pag +home/byoung/.openwebmail/db/sent-mail.pag +home/byoung/.openwebmail/history.log +home/byoung/.openwebmail/pop3/pop3.check +home/byoung/.openwebmail/webaddr/.address.book.old +home/byoung/.openwebmail/webaddr/Converted +home/byoung/.openwebmail/webmail/address.book +home/byoung/.openwebmail/webmail/filter.check +home/byoung/.openwebmail/webmail/filter.pid +home/byoung/.openwebmail/webmail/trash.check +home/byoung/mail/mail-trash +home/byoung/mail/sent-mail +home/carol/.openwebmail/db/carol.cache +home/carol/.openwebmail/db/carol.pag +home/carol/.openwebmail/db/sent-mail.dir +home/carol/.openwebmail/db/sent-mail.pag +home/carol/.openwebmail/history.log +home/carol/.openwebmail/pop3/pop3.check +home/carol/.openwebmail/webmail/filter.check +home/carol/.openwebmail/webmail/filter.pid +home/carol/.openwebmail/webmail/trash.check +home/carol/mail/sent-mail +home/charlotte/.openwebmail/db/charlotte.cache +home/charlotte/.openwebmail/db/charlotte.dir +home/charlotte/.openwebmail/db/charlotte.pag +home/charlotte/.openwebmail/db/mail-trash.dir +home/charlotte/.openwebmail/db/mail-trash.pag +home/charlotte/.openwebmail/db/sent-mail.dir +home/charlotte/.openwebmail/db/sent-mail.pag +home/charlotte/.openwebmail/history.log +home/charlotte/.openwebmail/pop3/pop3.check +home/charlotte/.openwebmail/webmail/filter.check +home/charlotte/.openwebmail/webmail/filter.pid +home/charlotte/.openwebmail/webmail/trash.check +home/charlotte/mail/mail-trash +home/charlotte/mail/sent-mail +home/colleen/.openwebmail/db/colleen.cache +home/colleen/.openwebmail/db/colleen.dir +home/colleen/.openwebmail/db/colleen.pag +home/colleen/.openwebmail/db/mail-trash.pag +home/colleen/.openwebmail/db/saved-messages.cache +home/colleen/.openwebmail/db/saved-messages.dir +home/colleen/.openwebmail/db/saved-messages.pag +home/colleen/.openwebmail/db/sent-mail.cache +home/colleen/.openwebmail/db/sent-mail.dir +home/colleen/.openwebmail/db/sent-mail.pag +home/colleen/.openwebmail/history.log +home/colleen/.openwebmail/pop3/pop3.check +home/colleen/.openwebmail/webmail/filter.check +home/colleen/.openwebmail/webmail/filter.pid +home/colleen/.openwebmail/webmail/trash.check +home/colleen/mail/mail-trash +home/colleen/mail/saved-messages +home/colleen/mail/sent-mail +home/cslettedahl/.openwebmail/db/cslettedahl.cache +home/cslettedahl/.openwebmail/db/cslettedahl.dir +home/cslettedahl/.openwebmail/db/cslettedahl.pag +home/cslettedahl/.openwebmail/db/sent-mail.dir +home/cslettedahl/.openwebmail/db/sent-mail.pag +home/cslettedahl/.openwebmail/history.log +home/cslettedahl/.openwebmail/pop3/pop3.check +home/cslettedahl/.openwebmail/webmail/filter.check +home/cslettedahl/.openwebmail/webmail/filter.pid +home/cslettedahl/.openwebmail/webmail/trash.check +home/cslettedahl/mail/sent-mail +home/dan/.openwebmail/db/dan.cache +home/dan/.openwebmail/db/dan.pag +home/dan/.openwebmail/db/mail-trash.pag +home/dan/.openwebmail/db/sent-mail.pag +home/dan/.openwebmail/history.log +home/dan/.openwebmail/pop3/pop3.check +home/dan/.openwebmail/webmail/filter.check +home/dan/.openwebmail/webmail/filter.pid +home/dan/.openwebmail/webmail/trash.check +home/dan/mail/mail-trash +home/dan/mail/sent-mail +home/debbie/.openwebmail/db/Dictionary.dir +home/debbie/.openwebmail/db/Dictionary.pag +home/debbie/.openwebmail/db/Food Safety.dir +home/debbie/.openwebmail/db/Food Safety.pag +home/debbie/.openwebmail/db/Personal.cache +home/debbie/.openwebmail/db/Personal.dir +home/debbie/.openwebmail/db/Personal.pag +home/debbie/.openwebmail/db/Personnel.cache +home/debbie/.openwebmail/db/Projects.cache +home/debbie/.openwebmail/db/Projects.dir +home/debbie/.openwebmail/db/Projects.pag +home/debbie/.openwebmail/db/Schedule.cache +home/debbie/.openwebmail/db/Schedule.pag +home/debbie/.openwebmail/db/debbie.cache +home/debbie/.openwebmail/db/debbie.dir +home/debbie/.openwebmail/db/debbie.pag +home/debbie/.openwebmail/db/mail-trash.cache +home/debbie/.openwebmail/db/mail-trash.dir +home/debbie/.openwebmail/db/mail-trash.pag +home/debbie/.openwebmail/db/saved-messages.dir +home/debbie/.openwebmail/db/saved-messages.pag +home/debbie/.openwebmail/db/sent-mail.cache +home/debbie/.openwebmail/db/sent-mail.dir +home/debbie/.openwebmail/db/sent-mail.pag +home/debbie/.openwebmail/db/spam-mail.pag +home/debbie/.openwebmail/history.log +home/debbie/.openwebmail/pop3/pop3.check +home/debbie/.openwebmail/webmail/filter.check +home/debbie/.openwebmail/webmail/filter.pid +home/debbie/.openwebmail/webmail/search.cache +home/debbie/.openwebmail/webmail/trash.check +home/debbie/mail/Dictionary +home/debbie/mail/Food Safety +home/debbie/mail/Personal +home/debbie/mail/Projects +home/debbie/mail/Schedule +home/debbie/mail/mail-trash +home/debbie/mail/saved-messages +home/dstewart/.openwebmail/db/ +home/debbie/mail/sent-mail +home/debbie/mail/spam-mail +home/dolores/.openwebmail/db/dolores.cache +home/dolores/.openwebmail/db/dolores.pag +home/dolores/.openwebmail/db/mail-trash.dir +home/dolores/.openwebmail/db/mail-trash.pag +home/dolores/.openwebmail/db/sent-mail.dir +home/dolores/.openwebmail/db/sent-mail.pag +home/dolores/.openwebmail/history.log +home/dolores/.openwebmail/pop3/pop3.check +home/dolores/.openwebmail/webmail/filter.check +home/dolores/.openwebmail/webmail/filter.pid +home/dolores/.openwebmail/webmail/trash.check +home/dolores/mail/mail-trash +home/dolores/mail/sent-mail +home/dstewart/.openwebmail/db/dstewart.cache +home/dstewart/.openwebmail/db/dstewart.pag +home/dstewart/.openwebmail/db/mail-trash.dir +home/dstewart/.openwebmail/db/mail-trash.pag +home/dstewart/.openwebmail/db/misc. saved.cache +home/dstewart/.openwebmail/db/misc. saved.dir +home/dstewart/.openwebmail/db/misc. saved.pag +home/dstewart/.openwebmail/db/sent-mail.cache +home/dstewart/.openwebmail/db/sent-mail.pag +home/dstewart/.openwebmail/history.log +home/dstewart/.openwebmail/pop3/pop3.check +home/dstewart/.openwebmail/webmail/filter.check +home/dstewart/.openwebmail/webmail/filter.pid +home/dstewart/.openwebmail/webmail/trash.check +home/dstewart/mail/mail-trash +home/dstewart/mail/misc. saved +home/dstewart/mail/sent-mail +home/emily/.openwebmail/db/emily.cache +home/emily/.openwebmail/db/emily.pag +home/emily/.openwebmail/db/saved-messages.dir +home/emily/.openwebmail/db/saved-messages.pag +home/emily/.openwebmail/db/sent-mail.dir +home/emily/.openwebmail/db/sent-mail.pag +home/emily/.openwebmail/history.log +home/emily/.openwebmail/pop3/pop3.check +home/emily/.openwebmail/webmail/filter.check +home/emily/.openwebmail/webmail/filter.pid +home/emily/.openwebmail/webmail/trash.check +home/emily/mail/saved-messages +home/emily/mail/sent-mail +home/eric/.openwebmail/db/eric.cache +home/eric/.openwebmail/db/eric.dir +home/eric/.openwebmail/db/eric.pag +home/eric/.openwebmail/db/mail-trash.dir +home/eric/.openwebmail/db/mail-trash.pag +home/eric/.openwebmail/db/saved-drafts.cache +home/eric/.openwebmail/db/saved-drafts.dir +home/eric/.openwebmail/db/saved-drafts.pag +home/eric/.openwebmail/db/sent-mail.dir +home/eric/.openwebmail/db/sent-mail.pag +home/eric/.openwebmail/history.log +home/eric/.openwebmail/pop3/pop3.check +home/eric/.openwebmail/webmail/filter.check +home/eric/.openwebmail/webmail/filter.pid +home/eric/.openwebmail/webmail/trash.check +home/eric/mail/mail-trash +home/eric/mail/saved-drafts +home/eric/mail/sent-mail +home/erik/.openwebmail/db/erik.cache +home/erik/.openwebmail/db/erik.dir +home/erik/.openwebmail/db/erik.pag +home/erik/.openwebmail/db/mail-trash.pag +home/erik/.openwebmail/history.log +home/erik/.openwebmail/pop3/pop3.check +home/erik/.openwebmail/webmail/filter.check +home/erik/.openwebmail/webmail/filter.pid +home/erik/.openwebmail/webmail/trash.check +home/erik/mail/mail-trash +home/eriq/.DS_Store +home/eriq/.openwebmail/db/credit.cache +home/eriq/.openwebmail/db/credit.dir +home/eriq/.openwebmail/db/credit.pag +home/eriq/.openwebmail/db/eriq.cache +home/eriq/.openwebmail/db/eriq.pag +home/imontgomery/.openwebmail/webmail/ +home/eriq/.openwebmail/db/mail-trash.cache +home/eriq/.openwebmail/db/mail-trash.dir +home/eriq/.openwebmail/db/mail-trash.pag +home/eriq/.openwebmail/db/saved-drafts.cache +home/eriq/.openwebmail/db/saved-drafts.pag +home/eriq/.openwebmail/db/sent-mail.cache +home/eriq/.openwebmail/db/sent-mail.dir +home/eriq/.openwebmail/db/sent-mail.pag +home/eriq/.openwebmail/history.log +home/eriq/.openwebmail/pop3/pop3.check +home/eriq/.openwebmail/webmail/filter.check +home/eriq/.openwebmail/webmail/filter.pid +home/eriq/.openwebmail/webmail/trash.check +home/eriq/mail/credit +home/eriq/mail/mail-trash +home/eriq/mail/saved-drafts +home/eriq/mail/sent-mail +home/heidi/.openwebmail/db/heidi.cache +home/heidi/.openwebmail/db/heidi.dir +home/heidi/.openwebmail/db/heidi.pag +home/heidi/.openwebmail/db/mail-trash.dir +home/heidi/.openwebmail/db/mail-trash.pag +home/heidi/.openwebmail/db/sent-mail.dir +home/heidi/.openwebmail/db/sent-mail.pag +home/heidi/.openwebmail/history.log +home/heidi/.openwebmail/pop3/pop3.check +home/heidi/.openwebmail/webmail/filter.check +home/heidi/.openwebmail/webmail/filter.pid +home/heidi/.openwebmail/webmail/trash.check +home/heidi/mail/mail-trash +home/heidi/mail/sent-mail +home/imontgomery/.openwebmail/db/imontgomery.cache +home/imontgomery/.openwebmail/db/imontgomery.dir +home/imontgomery/.openwebmail/db/imontgomery.pag +home/imontgomery/.openwebmail/db/sent-mail.dir +home/imontgomery/.openwebmail/db/sent-mail.pag +home/imontgomery/.openwebmail/history.log +home/imontgomery/.openwebmail/pop3/pop3.check +home/imontgomery/.openwebmail/webmail/address.book +home/imontgomery/.openwebmail/webmail/filter.check +home/imontgomery/.openwebmail/webmail/filter.pid +home/imontgomery/.openwebmail/webmail/trash.check +home/imontgomery/mail/sent-mail +home/jackie/.openwebmail/db/jackie.cache +home/jackie/.openwebmail/db/jackie.dir +home/jackie/.openwebmail/db/jackie.pag +home/jackie/.openwebmail/db/mail-trash.pag +home/jackie/.openwebmail/db/sent-mail.dir +home/jackie/.openwebmail/db/sent-mail.pag +home/jackie/.openwebmail/history.log +home/jackie/.openwebmail/pop3/pop3.check +home/jackie/.openwebmail/webmail/filter.check +home/jackie/.openwebmail/webmail/filter.pid +home/jackie/.openwebmail/webmail/trash.check +home/jackie/mail/mail-trash +home/jackie/mail/sent-mail +home/jahn/.openwebmail/db/jahn.cache +home/jahn/.openwebmail/db/jahn.dir +home/jahn/.openwebmail/db/jahn.pag +home/jahn/.openwebmail/db/mail-trash.dir +home/jahn/.openwebmail/db/mail-trash.pag +home/jahn/.openwebmail/db/saved-messages.dir +home/jahn/.openwebmail/db/saved-messages.pag +home/jahn/.openwebmail/db/sent-mail.dir +home/jahn/.openwebmail/db/sent-mail.pag +home/jahn/.openwebmail/history.log +home/jahn/.openwebmail/pop3/pop3.check +home/jahn/.openwebmail/webmail/filter.check +home/jahn/.openwebmail/webmail/filter.pid +home/jahn/.openwebmail/webmail/trash.check +home/jahn/mail/mail-trash +home/jahn/mail/saved-messages +home/jahn/mail/sent-mail +home/jake/.openwebmail/db/jake.cache +home/jake/.openwebmail/db/jake.dir +home/jake/.openwebmail/db/jake.pag +home/jake/.openwebmail/db/mail-trash.dir +home/jake/.openwebmail/db/mail-trash.pag +home/jake/.openwebmail/history.log +home/jake/.openwebmail/pop3/pop3.check +home/jake/.openwebmail/webmail/filter.check +home/jake/.openwebmail/webmail/filter.pid +home/jake/.openwebmail/webmail/trash.check +home/jake/mail/mail-trash +home/jane/.openwebmail/db/jane.cache +home/jane/.openwebmail/db/jane.dir +home/jane/.openwebmail/db/jane.pag +home/jane/.openwebmail/db/mail-trash.dir +home/jane/.openwebmail/db/mail-trash.pag +home/jane/.openwebmail/db/sent-mail.dir +home/jane/.openwebmail/db/sent-mail.pag +home/jane/.openwebmail/history.log +home/jane/.openwebmail/pop3/pop3.check +home/jane/.openwebmail/webmail/filter.check +home/jane/.openwebmail/webmail/filter.pid +home/jane/.openwebmail/webmail/trash.check +home/jane/mail/mail-trash +home/jane/mail/sent-mail +home/jason/.openwebmail/db/jason.cache +home/jason/.openwebmail/db/jason.pag +home/jason/.openwebmail/db/mail-trash.dir +home/jason/.openwebmail/db/mail-trash.pag +home/jason/.openwebmail/db/sent-mail.dir +home/jason/.openwebmail/db/sent-mail.pag +home/jason/.openwebmail/history.log +home/jason/.openwebmail/pop3/pop3.check +home/jason/.openwebmail/webmail/filter.check +home/jboie/.openwebmail/webaddr/ +home/jboie/.openwebmail/webmail/ +home/jason/.openwebmail/webmail/filter.pid +home/jason/.openwebmail/webmail/trash.check +home/jason/mail/mail-trash +home/jason/mail/sent-mail +home/jay/.openwebmail/db/jay.cache +home/jay/.openwebmail/db/jay.pag +home/jay/.openwebmail/db/mail-trash.pag +home/jay/.openwebmail/db/sent-mail.dir +home/jay/.openwebmail/db/sent-mail.pag +home/jay/.openwebmail/history.log +home/jay/.openwebmail/pop3/pop3.check +home/jay/.openwebmail/webmail/filter.check +home/jay/.openwebmail/webmail/filter.pid +home/jay/.openwebmail/webmail/trash.check +home/jay/mail/mail-trash +home/jay/mail/sent-mail +home/jboie/.openwebmail/db/jboie.cache +home/jboie/.openwebmail/db/jboie.dir +home/jboie/.openwebmail/db/jboie.pag +home/jboie/.openwebmail/db/mail-trash.dir +home/jboie/.openwebmail/db/mail-trash.pag +home/jboie/.openwebmail/db/sent-mail.dir +home/jboie/.openwebmail/db/sent-mail.pag +home/jboie/.openwebmail/history.log +home/jboie/.openwebmail/pop3/pop3.check +home/jboie/.openwebmail/webaddr/.address.book.old +home/jboie/.openwebmail/webaddr/Converted +home/jboie/.openwebmail/webmail/address.book +home/jboie/.openwebmail/webmail/filter.check +home/jboie/.openwebmail/webmail/filter.pid +home/jboie/.openwebmail/webmail/trash.check +home/jboie/mail/mail-trash +home/jboie/mail/sent-mail +home/jeanmarie/.openwebmail/db/jeanmarie.cache +home/jeanmarie/.openwebmail/db/jeanmarie.dir +home/jeanmarie/.openwebmail/db/jeanmarie.pag +home/jeanmarie/.openwebmail/db/mail-trash.dir +home/jeanmarie/.openwebmail/db/mail-trash.pag +home/jeanmarie/.openwebmail/db/saved-drafts.pag +home/jeanmarie/.openwebmail/db/sent-mail.dir +home/jeanmarie/.openwebmail/db/sent-mail.pag +home/jeanmarie/.openwebmail/history.log +home/jeanmarie/.openwebmail/pop3/pop3.check +home/jeanmarie/.openwebmail/webmail/filter.check +home/jeanmarie/.openwebmail/webmail/filter.pid +home/jeanmarie/.openwebmail/webmail/trash.check +home/jeanmarie/mail/mail-trash +home/jeanmarie/mail/saved-drafts +home/jeanmarie/mail/sent-mail +home/jenniel/.openwebmail/db/jenniel.cache +home/jenniel/.openwebmail/db/jenniel.dir +home/jenniel/.openwebmail/db/jenniel.pag +home/jenniel/.openwebmail/db/mail-trash.pag +home/jenniel/.openwebmail/db/sent-mail.pag +home/jenniel/.openwebmail/history.log +home/jenniel/.openwebmail/pop3/pop3.check +home/jenniel/.openwebmail/webmail/filter.check +home/jenniel/.openwebmail/webmail/filter.pid +home/jenniel/.openwebmail/webmail/trash.check +home/jenniel/mail/mail-trash +home/jenniel/mail/sent-mail +home/jennifer/.openwebmail/db/jennifer.cache +home/jennifer/.openwebmail/db/jennifer.dir +home/jennifer/.openwebmail/db/jennifer.pag +home/jeremy/.openwebmail/db/ +home/jennifer/.openwebmail/db/mail-trash.pag +home/jennifer/.openwebmail/db/saved-drafts.cache +home/jennifer/.openwebmail/db/saved-drafts.pag +home/jennifer/.openwebmail/db/sent-mail.pag +home/jennifer/.openwebmail/db/spam-mail.pag +home/jennifer/.openwebmail/history.log +home/jennifer/.openwebmail/pop3/pop3.check +home/jennifer/.openwebmail/webmail/filter.check +home/jennifer/.openwebmail/webmail/filter.folderdb.pag +home/jennifer/.openwebmail/webmail/filter.pid +home/jennifer/.openwebmail/webmail/filter.ruledb.pag +home/jennifer/.openwebmail/webmail/trash.check +home/jennifer/mail/mail-trash +home/jennifer/mail/saved-drafts +home/jennifer/mail/sent-mail +home/jennifer/mail/spam-mail +home/jeremy/.openwebmail/db/jeremy.cache +home/jeremy/.openwebmail/db/jeremy.dir +home/jeremy/.openwebmail/db/jeremy.pag +home/jeremy/.openwebmail/db/mail-trash.cache +home/jeremy/.openwebmail/db/mail-trash.dir +home/jeremy/.openwebmail/db/mail-trash.pag +home/jeremy/.openwebmail/db/sent-mail.dir +home/jeremy/.openwebmail/db/sent-mail.pag +home/jeremyb/.openwebmail/db/ +home/jeremy/.openwebmail/history.log +home/jeremy/.openwebmail/pop3/pop3.check +home/jeremy/.openwebmail/webmail/filter.check +home/jeremy/.openwebmail/webmail/filter.pid +home/jeremy/.openwebmail/webmail/trash.check +home/jeremy/mail/mail-trash +home/jeremy/mail/sent-mail +home/jeremyb/.openwebmail/db/jeremyb.cache +home/jeremyb/.openwebmail/db/jeremyb.dir +home/jeremyb/.openwebmail/db/jeremyb.pag +home/jeremyb/.openwebmail/db/mail-trash.pag +home/jeremyb/.openwebmail/db/saved-drafts.cache +home/jeremyb/.openwebmail/db/saved-drafts.dir +home/jeremyb/.openwebmail/db/saved-drafts.pag +home/jeremyb/.openwebmail/db/sent-mail.dir +home/jeremyb/mail/ +home/jeremyb/.openwebmail/db/sent-mail.pag +home/jeremyb/.openwebmail/history.log +home/jeremyb/.openwebmail/pop3/pop3.check +home/jeremyb/.openwebmail/webmail/filter.check +home/jeremyb/.openwebmail/webmail/filter.pid +home/jeremyb/.openwebmail/webmail/trash.check +home/jeremyb/mail/mail-trash +home/jeremyb/mail/saved-drafts +home/jeremyb/mail/sent-mail +home/jeremye/.openwebmail/db/jeremye.cache +home/jeremye/.openwebmail/db/jeremye.pag +home/jeremye/.openwebmail/db/mail-trash.pag +home/jeremye/.openwebmail/db/sent-mail.cache +home/jeremye/.openwebmail/db/sent-mail.dir +home/jeremye/.openwebmail/db/sent-mail.pag +home/jeremye/.openwebmail/history.log +home/jeremye/.openwebmail/pop3/pop3.check +home/jeremye/.openwebmail/webmail/filter.check +home/jeremye/.openwebmail/webmail/filter.pid +home/jeremye/.openwebmail/webmail/trash.check +home/jeremye/mail/mail-trash +home/jeremye/mail/sent-mail +home/jesse/.openwebmail/db/jesse.cache +home/jesse/.openwebmail/db/jesse.pag +home/jesse/.openwebmail/db/mail-trash.dir +home/jesse/.openwebmail/db/mail-trash.pag +home/jesse/.openwebmail/db/sent-mail.dir +home/jesse/.openwebmail/db/sent-mail.pag +home/jesse/.openwebmail/history.log +home/jesse/.openwebmail/pop3/pop3.check +home/jesse/.openwebmail/webmail/filter.check +home/jesse/.openwebmail/webmail/filter.pid +home/jesse/.openwebmail/webmail/search.cache +home/jesse/.openwebmail/webmail/trash.check +home/jesse/mail/mail-trash +home/jesse/mail/sent-mail +home/jessica/.openwebmail/db/jessica.cache +home/jessica/.openwebmail/db/jessica.dir +home/jessica/.openwebmail/db/jessica.pag +home/jhorn/.openwebmail/db/ +home/jhorn/.openwebmail/webmail/ +home/jhorn/mail/ +home/jessica/.openwebmail/db/saved-messages.dir +home/jessica/.openwebmail/db/saved-messages.pag +home/jessica/.openwebmail/db/sent-mail.dir +home/jessica/.openwebmail/db/sent-mail.pag +home/jessica/.openwebmail/history.log +home/jessica/.openwebmail/openwebmailrc +home/jessica/.openwebmail/pop3/pop3.check +home/jessica/.openwebmail/webmail/filter.check +home/jessica/.openwebmail/webmail/filter.pid +home/jessica/.openwebmail/webmail/signature +home/jessica/.openwebmail/webmail/trash.check +home/jessica/.vacation.msg +home/jessica/mail/saved-messages +home/jillh/public_html/ +home/jillhall/.openwebmail/db/ +home/jessica/mail/sent-mail +home/jgilbertson/.openwebmail/db/jgilbertson.cache +home/jgilbertson/.openwebmail/db/jgilbertson.dir +home/jgilbertson/.openwebmail/db/jgilbertson.pag +home/jgilbertson/.openwebmail/db/sent-mail.pag +home/jgilbertson/.openwebmail/history.log +home/jgilbertson/.openwebmail/pop3/pop3.check +home/jgilbertson/.openwebmail/webmail/filter.check +home/jgilbertson/.openwebmail/webmail/filter.pid +home/jgilbertson/.openwebmail/webmail/trash.check +home/jgilbertson/mail/sent-mail +home/jhorn/.openwebmail/db/jhorn.cache +home/jhorn/.openwebmail/db/jhorn.dir +home/jhorn/.openwebmail/db/jhorn.pag +home/jhorn/.openwebmail/db/mail-trash.dir +home/jhorn/.openwebmail/db/mail-trash.pag +home/jhorn/.openwebmail/db/sent-mail.pag +home/jhorn/.openwebmail/db/spam-mail.dir +home/jhorn/.openwebmail/db/spam-mail.pag +home/jhorn/.openwebmail/db/virus-mail.dir +home/jhorn/.openwebmail/db/virus-mail.pag +home/jhorn/.openwebmail/history.log +home/jhorn/.openwebmail/pop3/pop3.check +home/jhorn/.openwebmail/webmail/filter.check +home/jhorn/.openwebmail/webmail/filter.pid +home/jhorn/.openwebmail/webmail/trash.check +home/jhorn/mail/mail-trash +home/jhorn/mail/sent-mail +home/jhorn/mail/spam-mail +home/jhorn/mail/virus-mail +home/jillh/.openwebmail/db/jillh.cache +home/jillh/.openwebmail/db/jillh.dir +home/jillh/.openwebmail/db/jillh.pag +home/jillh/.openwebmail/db/sent-mail.cache +home/jillh/.openwebmail/db/sent-mail.pag +home/jillh/.openwebmail/history.log +home/jillh/.openwebmail/pop3/pop3.check +home/jillh/.openwebmail/webmail/filter.check +home/jillh/.openwebmail/webmail/filter.pid +home/jillh/.openwebmail/webmail/trash.check +home/jillh/mail/sent-mail +home/jillh/public_html/.DS_Store +home/jillhall/.DS_Store +home/jillhall/.openwebmail/autologin.check.pag +home/jillhall/.openwebmail/db/CREDITS.pag +home/jillhall/.openwebmail/db/jillhall.cache +home/jillhall/.openwebmail/db/jillhall.dir +home/jillhall/.openwebmail/db/jillhall.pag +home/jillhall/.openwebmail/db/mail-trash.cache +home/jillhall/.openwebmail/db/mail-trash.dir +home/jillhall/.openwebmail/db/mail-trash.pag +home/jillhall/.openwebmail/db/saved-drafts.cache +home/jillhall/.openwebmail/db/sent-mail.cache +home/jillhall/.openwebmail/db/sent-mail.dir +home/jillhall/Jill's MASTER FOLDER/ +home/jillhall/Jill's MASTER FOLDER/Gazette/ +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/ +home/jillhall/Jill's MASTER FOLDER/MOS/ +home/jillhall/Jill's MASTER FOLDER/Merch/ +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/ +home/jillhall/.openwebmail/db/sent-mail.pag +home/jillhall/Jill's MASTER FOLDER/Price Changes/ +home/jillhall/Jill's MASTER FOLDER/UNFI Pricing/ +home/jillhall/.openwebmail/db/spam-mail.pag +home/jillhall/.openwebmail/history.log +home/jillhall/.openwebmail/pop3/pop3.check +home/jillhall/.openwebmail/webmail/filter.check +home/jillhall/.openwebmail/webmail/filter.folderdb.pag +home/jillhall/.openwebmail/webmail/filter.pid +home/jillhall/.openwebmail/webmail/filter.ruledb.pag +home/jillhall/.openwebmail/webmail/search.cache +home/jillhall/.openwebmail/webmail/trash.check +home/jillhall/Jill's MASTER FOLDER/.DS_Store +home/jillhall/Jill's MASTER FOLDER/Gazette/.DS_Store +home/jillhall/Jill's MASTER FOLDER/Gazette/._HBCNewItemsJULY.doc +home/jillhall/Jill's MASTER FOLDER/Gazette/._gazette july.rtf +home/jillhall/Jill's MASTER FOLDER/Gazette/HBCNewItemsJULY.doc +home/jillhall/Jill's MASTER FOLDER/Gazette/gazette july.rtf +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/._ADDLAUG.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/._AUGALBA.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/._AUGCAP16-2.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/._AUGEXTRA16.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/._AUGMOS16.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/._AUGTPR2.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/ADDLAUG.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/AUGALBA.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/AUGCAP16-2.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/AUGEXTRA16.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/AUGMOS16.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/AUG/AUGTPR2.xls +home/jillhall/Jill's MASTER FOLDER/JILL's SALE SIGNS/JULY/JULYCAPAURACACIA.xls +home/jillhall/Jill's MASTER FOLDER/MOS/._MOS formHBC AUG.doc +home/jillhall/Jill's MASTER FOLDER/MOS/MOS formHBC AUG.doc +home/jillhall/Jill's MASTER FOLDER/Merch/._HERBSetChanges.xls +home/jillhall/Jill's MASTER FOLDER/Merch/HERBSetChanges.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/._AubreyOrganics.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/._HerbPharmOrder.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/._LOTUS ORDER.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/._New Chapter Order.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/._ORDERHISTORY.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/._selectguide.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/AubreyOrganics.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/ECLECTIC ORDER GUIDE2.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/HerbPharmOrder.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/LOTUS ORDER.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/New Chapter Order.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/ORDERHISTORY.xls +home/jillhall/Jill's MASTER FOLDER/Order Guides after upgrade/selectguide.xls +home/jillhall/Jill's MASTER FOLDER/Price Changes/.DS_Store +home/jillhall/Jill's MASTER FOLDER/Price Changes/._PRICECHANGES07.xls +home/jillhall/Jill's MASTER FOLDER/Price Changes/PRICECHANGES07.xls +home/jillhall/Jill's MASTER FOLDER/UNFI Pricing/._August 07 UNFI Prices.xls +home/jillhall/Jill's MASTER FOLDER/UNFI Pricing/August 07 UNFI Prices.xls +home/jillhall/mail/.DS_Store +home/jillhall/mail/CREDITS +home/jillhall/mail/mail-trash +home/jillhall/mail/sent-mail +home/jillhall/mail/spam-mail +home/jim/.openwebmail/db/brag file.cache +home/jim/.openwebmail/db/brag file.pag +home/jim/.openwebmail/db/jim.cache +home/jim/.openwebmail/db/jim.dir +home/jim/.openwebmail/db/jim.pag +home/jim/.openwebmail/db/mail-trash.cache +home/jim/.openwebmail/db/mail-trash.dir +home/jim/.openwebmail/db/mail-trash.pag +home/jim/.openwebmail/db/saved-drafts.pag +home/jim/.openwebmail/db/sent-mail.dir +home/jim/.openwebmail/db/sent-mail.pag +home/joe/.openwebmail/webaddr/ +home/joe/.openwebmail/webmail/ +home/jim/.openwebmail/db/spam-mail.pag +home/jim/.openwebmail/history.log +home/jim/.openwebmail/pop3/pop3.check +home/jim/.openwebmail/webmail/filter.check +home/jim/.openwebmail/webmail/filter.folderdb.pag +home/jim/.openwebmail/webmail/filter.pid +home/jim/.openwebmail/webmail/filter.ruledb.pag +home/jim/.openwebmail/webmail/trash.check +home/jim/mail/brag file +home/jim/mail/mail-trash +home/jim/mail/saved-drafts +home/jim/mail/sent-mail +home/jim/mail/spam-mail +home/joe/.openwebmail/db/joe.cache +home/joe/.openwebmail/db/joe.pag +home/joe/.openwebmail/db/mail-trash.cache +home/joe/.openwebmail/db/mail-trash.dir +home/joe/.openwebmail/db/mail-trash.pag +home/joe/.openwebmail/db/sent-mail.cache +home/joe/.openwebmail/db/sent-mail.dir +home/joe/.openwebmail/db/sent-mail.pag +home/joe/.openwebmail/history.log +home/joe/.openwebmail/pop3/pop3.check +home/joe/.openwebmail/webaddr/.address.book.old +home/joe/.openwebmail/webaddr/Converted +home/joe/.openwebmail/webmail/address.book +home/joe/.openwebmail/webmail/filter.check +home/joe/.openwebmail/webmail/filter.pid +home/joe/.openwebmail/webmail/trash.check +home/joe/mail/mail-trash +home/joe/mail/sent-mail +home/joeu/.openwebmail/autologin.check.pag +home/joeu/.openwebmail/db/joeu.cache +home/joeu/.openwebmail/db/joeu.dir +home/joeu/.openwebmail/db/joeu.pag +home/joeu/.openwebmail/db/mail-trash.cache +home/joeu/.openwebmail/db/mail-trash.dir +home/joeu/.openwebmail/db/mail-trash.pag +home/joeu/.openwebmail/db/sent-mail.cache +home/joeu/.openwebmail/db/sent-mail.dir +home/joeu/.openwebmail/db/sent-mail.pag +home/joeu/.openwebmail/history.log +home/joeu/.openwebmail/pop3/pop3.check +home/joeu/.openwebmail/webmail/filter.check +home/joeu/.openwebmail/webmail/filter.pid +home/joeu/.openwebmail/webmail/trash.check +home/joeu/mail/mail-trash +home/joeu/mail/sent-mail +home/johnf/.openwebmail/db/johnf.cache +home/johnf/.openwebmail/db/johnf.dir +home/johnf/.openwebmail/db/johnf.pag +home/johnf/.openwebmail/db/mail-trash.dir +home/johnf/.openwebmail/db/mail-trash.pag +home/johnf/.openwebmail/history.log +home/johnf/.openwebmail/pop3/pop3.check +home/johnf/.openwebmail/webmail/filter.check +home/johnf/.openwebmail/webmail/filter.pid +home/johnf/.openwebmail/webmail/trash.check +home/johnf/mail/mail-trash +home/johnu/.openwebmail/db/johnu.cache +home/johnu/.openwebmail/db/johnu.pag +home/johnu/.openwebmail/db/mail-trash.pag +home/johnu/.openwebmail/history.log +home/johnu/.openwebmail/pop3/pop3.check +home/johnu/.openwebmail/webmail/filter.check +home/johnu/.openwebmail/webmail/filter.pid +home/johnu/.openwebmail/webmail/trash.check +home/johnu/mail/mail-trash +home/jp/.openwebmail/db/jp.cache +home/jp/.openwebmail/db/jp.dir +home/jp/.openwebmail/db/jp.pag +home/jp/.openwebmail/db/mail-trash.dir +home/jp/.openwebmail/db/mail-trash.pag +home/jp/.openwebmail/db/sent-mail.cache +home/jp/.openwebmail/db/sent-mail.pag +home/jp/.openwebmail/history.log +home/jp/.openwebmail/pop3/pop3.check +home/jp/.openwebmail/webmail/filter.check +home/jp/.openwebmail/webmail/filter.pid +home/jp/.openwebmail/webmail/trash.check +home/jp/mail/mail-trash +home/jp/mail/sent-mail +home/julie/.openwebmail/db/julie.cache +home/julie/.openwebmail/db/julie.dir +home/julie/.openwebmail/db/julie.pag +home/justin/.openwebmail/db/ +home/julie/.openwebmail/db/sent-mail.dir +home/julie/.openwebmail/db/sent-mail.pag +home/julie/.openwebmail/history.log +home/julie/.openwebmail/pop3/pop3.check +home/julie/.openwebmail/webmail/filter.check +home/julie/.openwebmail/webmail/filter.pid +home/julie/.openwebmail/webmail/trash.check +home/julie/mail/sent-mail +home/justin/.openwebmail/db/justin.cache +home/justin/.openwebmail/db/justin.dir +home/justin/.openwebmail/db/justin.pag +home/justin/.openwebmail/db/saved-messages.cache +home/justin/.openwebmail/db/saved-messages.dir +home/justin/.openwebmail/db/saved-messages.pag +home/justin/.openwebmail/db/sent-mail.cache +home/justin/.openwebmail/db/sent-mail.dir +home/justin/.openwebmail/db/sent-mail.pag +home/justin/.openwebmail/db/spam-mail.dir +home/justin/.openwebmail/db/spam-mail.pag +home/justin/.openwebmail/db/virus-mail.dir +home/justin/.openwebmail/db/virus-mail.pag +home/justin/.openwebmail/history.log +home/justin/.openwebmail/pop3/pop3.check +home/justin/.openwebmail/webmail/filter.check +home/justin/.openwebmail/webmail/filter.pid +home/justin/.openwebmail/webmail/search.cache +home/justin/.openwebmail/webmail/trash.check +home/justin/mail/saved-messages +home/justin/mail/sent-mail +home/justin/mail/spam-mail +home/justin/mail/virus-mail +home/kala/.openwebmail/db/kala.cache +home/kala/.openwebmail/db/kala.pag +home/kala/.openwebmail/db/mail-trash.dir +home/kala/.openwebmail/db/mail-trash.pag +home/kala/.openwebmail/db/sent-mail.pag +home/kala/.openwebmail/history.log +home/kala/.openwebmail/pop3/pop3.check +home/kala/.openwebmail/webmail/filter.check +home/kala/.openwebmail/webmail/filter.pid +home/kala/.openwebmail/webmail/trash.check +home/kala/mail/mail-trash +home/kala/mail/sent-mail +home/kappel/.openwebmail/db/kappel.cache +home/kappel/.openwebmail/db/kappel.dir +home/kappel/.openwebmail/db/kappel.pag +home/kappel/.openwebmail/db/mail-trash.dir +home/kappel/.openwebmail/db/mail-trash.pag +home/kappel/.openwebmail/db/sent-mail.pag +home/kappel/.openwebmail/history.log +home/kappel/.openwebmail/pop3/pop3.check +home/kappel/.openwebmail/webmail/filter.check +home/kappel/.openwebmail/webmail/filter.pid +home/kappel/.openwebmail/webmail/trash.check +home/kappel/mail/mail-trash +home/kappel/mail/sent-mail +home/karen/.openwebmail/db/AR.cache +home/karen/.openwebmail/db/AR.dir +home/karen/.openwebmail/db/AR.pag +home/karen/.openwebmail/db/CHRISTINA - Finance.cache +home/karen/.openwebmail/db/CHRISTINA - Finance.pag +home/karen/.openwebmail/db/COLLEEN.dir +home/karen/.openwebmail/db/COLLEEN.pag +home/karen/.openwebmail/db/Cash Room.dir +home/karen/.openwebmail/db/Cash Room.pag +home/karen/.openwebmail/db/Gazette.pag +home/karen/.openwebmail/db/PAYROLL.dir +home/karen/.openwebmail/db/PAYROLL.pag +home/karen/.openwebmail/db/SHARON.cache +home/karen/.openwebmail/db/SHARON.dir +home/karen/.openwebmail/db/SHARON.pag +home/karen/.openwebmail/db/Safety Committee.dir +home/karen/.openwebmail/db/Safety Committee.pag +home/karen/.openwebmail/db/coupons.cache +home/karen/.openwebmail/db/coupons.dir +home/karen/.openwebmail/db/coupons.pag +home/karen/.openwebmail/db/karen.cache +home/karen/.openwebmail/db/karen.pag +home/karen/.openwebmail/db/mail-trash.dir +home/karen/.openwebmail/db/mail-trash.pag +home/karen/.openwebmail/db/saved-messages.cache +home/karen/.openwebmail/db/saved-messages.dir +home/karen/.openwebmail/db/saved-messages.pag +home/karen/.openwebmail/db/sent-mail.cache +home/karen/.openwebmail/db/sent-mail.dir +home/karen/.openwebmail/db/sent-mail.pag +home/karen/.openwebmail/history.log +home/karen/.openwebmail/pop3/pop3.check +home/karen/.openwebmail/webmail/filter.check +home/karen/.openwebmail/webmail/filter.folderdb.pag +home/karen/.openwebmail/webmail/filter.pid +home/karen/.openwebmail/webmail/filter.ruledb.pag +home/karen/.openwebmail/webmail/search.cache +home/karen/.openwebmail/webmail/trash.check +home/karen/mail/AR +home/karen/mail/CHRISTINA - Finance +home/karen/mail/COLLEEN +home/karen/mail/Cash Room +home/karen/mail/Gazette +home/karen/mail/PAYROLL +home/karen/mail/SHARON +home/karen/mail/Safety Committee +home/karen/mail/coupons +home/karen/mail/mail-trash +home/karen/mail/saved-messages +home/karen/mail/sent-mail +home/kevin/.openwebmail/db/ +home/kaugustyn/.openwebmail/db/kaugustyn.cache +home/kaugustyn/.openwebmail/db/kaugustyn.dir +home/kaugustyn/.openwebmail/db/kaugustyn.pag +home/kaugustyn/.openwebmail/db/mail-trash.dir +home/kaugustyn/.openwebmail/db/mail-trash.pag +home/kaugustyn/.openwebmail/history.log +home/kaugustyn/.openwebmail/pop3/pop3.check +home/kaugustyn/.openwebmail/webmail/filter.check +home/kaugustyn/.openwebmail/webmail/filter.pid +home/kaugustyn/.openwebmail/webmail/trash.check +home/kaugustyn/mail/mail-trash +home/kevin/.openwebmail/db/kevin.cache +home/kevin/mail/ +home/kevin/.openwebmail/db/kevin.pag +home/kevin/.openwebmail/history.log +home/kevin/.openwebmail/pop3/pop3.check +home/kevin/.openwebmail/webmail/filter.check +home/kevin/.openwebmail/webmail/filter.pid +home/kevin/.openwebmail/webmail/trash.check +home/klebakken/.openwebmail/db/klebakken.cache +home/klebakken/.openwebmail/db/klebakken.dir +home/klebakken/.openwebmail/db/klebakken.pag +home/klebakken/.openwebmail/db/sent-mail.pag +home/klebakken/.openwebmail/history.log +home/klebakken/.openwebmail/pop3/pop3.check +home/klebakken/.openwebmail/webmail/filter.check +home/klebakken/.openwebmail/webmail/filter.pid +home/klebakken/.openwebmail/webmail/trash.check +home/klebakken/mail/sent-mail +home/ktoumi/.openwebmail/db/ktoumi.cache +home/ktoumi/.openwebmail/db/ktoumi.pag +home/ktoumi/.openwebmail/db/mail-trash.dir +home/ktoumi/.openwebmail/db/mail-trash.pag +home/ktoumi/.openwebmail/db/sent-mail.dir +home/ktoumi/.openwebmail/db/sent-mail.pag +home/ktoumi/.openwebmail/history.log +home/ktoumi/.openwebmail/pop3/pop3.check +home/ktoumi/.openwebmail/webmail/filter.check +home/ktoumi/.openwebmail/webmail/filter.pid +home/ktoumi/.openwebmail/webmail/trash.check +home/ktoumi/mail/mail-trash +home/ktoumi/mail/sent-mail +home/larry/.openwebmail/db/larry.cache +home/larry/.openwebmail/db/larry.pag +home/larry/.openwebmail/db/mail-trash.dir +home/larry/.openwebmail/db/mail-trash.pag +home/larry/.openwebmail/db/sent-mail.pag +home/larry/.openwebmail/history.log +home/larry/.openwebmail/pop3/pop3.check +home/larry/.openwebmail/webmail/filter.check +home/larry/.openwebmail/webmail/filter.pid +home/larry/.openwebmail/webmail/trash.check +home/larry/mail/mail-trash +home/larry/mail/sent-mail +home/lisa/.DS_Store +home/lisa/.openwebmail/db/Buyers .cache +home/lisa/.openwebmail/db/Buyers .dir +home/lisa/.openwebmail/db/Buyers .pag +home/lisa/.openwebmail/db/Credits UNFI.dir +home/lisa/.openwebmail/db/Credits UNFI.pag +home/lisa/.openwebmail/db/Eval info.cache +home/lisa/.openwebmail/db/Eval info.pag +home/lisa/.openwebmail/db/IT .dir +home/lisa/.openwebmail/db/IT .pag +home/lisa/.openwebmail/db/Lisa's Personal Stuff.cache +home/lisa/.openwebmail/db/Lisa's Personal Stuff.dir +home/lisa/.openwebmail/db/Lisa's Personal Stuff.pag +home/lisa/.openwebmail/db/MTM.cache +home/lisa/.openwebmail/db/MTM.dir +home/lisa/.openwebmail/db/MTM.pag +home/lisa/.openwebmail/db/Out of stocks.dir +home/lisa/.openwebmail/db/Out of stocks.pag +home/lisa/.openwebmail/db/Personel.cache +home/lisa/.openwebmail/db/Personel.dir +home/lisa/.openwebmail/db/Personel.pag +home/lisa/.openwebmail/db/Sales Reports.dir +home/lisa/.openwebmail/db/Sales Reports.pag +home/lisa/.openwebmail/db/Specials-CAP, MOS, HA.cache +home/lisa/.openwebmail/db/Specials-CAP, MOS, HA.dir +home/lisa/.openwebmail/db/Specials-CAP, MOS, HA.pag +home/lisa/.openwebmail/db/Spins.dir +home/lisa/.openwebmail/db/Spins.pag +home/lisa/.openwebmail/db/UNFI & Product info.cache +home/lisa/.openwebmail/db/UNFI & Product info.dir +home/lisa/.openwebmail/db/UNFI & Product info.pag +home/lisa/.openwebmail/db/brokers.cache +home/lisa/.openwebmail/db/brokers.dir +home/lisa/.openwebmail/db/brokers.pag +home/lisa/.openwebmail/db/cAP CGA info.dir +home/lisa/.openwebmail/db/cAP CGA info.pag +home/lisa/.openwebmail/db/equipment.pag +home/lisa/.openwebmail/db/ideas products misc.dir +home/lisa/.openwebmail/db/ideas products misc.pag +home/lisa/.openwebmail/db/lisa.cache +home/lisa/.openwebmail/db/lisa.pag +home/lisa/.openwebmail/db/mail-trash.dir +home/lisa/.openwebmail/db/mail-trash.pag +home/lisa/.openwebmail/db/saved-drafts.cache +home/lisa/.openwebmail/db/saved-drafts.pag +home/lisa/.openwebmail/db/sent-mail.cache +home/lisa/.openwebmail/db/sent-mail.dir +home/lisa/.openwebmail/db/sent-mail.pag +home/lisa/.openwebmail/db/spam-mail.pag +home/lisa/.openwebmail/history.log +home/lisa/.openwebmail/pop3/pop3.check +home/lisa/.openwebmail/webmail/filter.check +home/lisa/.openwebmail/webmail/filter.pid +home/lisa/.openwebmail/webmail/filter.ruledb.pag +home/lisa/.openwebmail/webmail/search.cache +home/lisa/.openwebmail/webmail/trash.check +home/lisa/mail/Buyers +home/lisa/mail/Credits UNFI +home/lisa/mail/Eval info +home/lisa/mail/IT +home/lisa/mail/Lisa's Personal Stuff +home/lisa/mail/MTM +home/lisa/mail/Out of stocks +home/lisa/mail/Personel +home/lisa/mail/Sales Reports +home/lisa/mail/Specials-CAP, MOS, HA +home/lisa/mail/Spins +home/lisa/mail/UNFI & Product info +home/lisa/mail/brokers +home/lisa/mail/cAP CGA info +home/lisa/mail/equipment +home/lisa/mail/ideas products misc +home/lisa/mail/mail-trash +home/lisa/mail/saved-drafts +home/lisa/mail/sent-mail +home/lisa/mail/spam-mail +home/lwiesen/.openwebmail/db/lwiesen.cache +home/lwiesen/.openwebmail/db/lwiesen.dir +home/lwiesen/.openwebmail/db/lwiesen.pag +home/lwiesen/.openwebmail/db/mail-trash.dir +home/lwiesen/.openwebmail/db/mail-trash.pag +home/lwiesen/.openwebmail/history.log +home/lwiesen/.openwebmail/pop3/pop3.check +home/lwiesen/.openwebmail/webmail/filter.check +home/lwiesen/.openwebmail/webmail/filter.pid +home/lwiesen/.openwebmail/webmail/trash.check +home/lwiesen/mail/mail-trash +home/lynette/.openwebmail/db/lynette.cache +home/lynette/.openwebmail/db/lynette.dir +home/lynette/.openwebmail/db/lynette.pag +home/lynette/.openwebmail/db/mail-trash.pag +home/lynette/.openwebmail/history.log +home/lynette/.openwebmail/pop3/pop3.check +home/lynette/.openwebmail/webmail/filter.check +home/lynette/.openwebmail/webmail/filter.pid +home/lynette/.openwebmail/webmail/trash.check +home/lynette/mail/mail-trash +home/melanie/.openwebmail/db/melanie.cache +home/melanie/.openwebmail/db/melanie.pag +home/melanie/.openwebmail/db/sent-mail.pag +home/melanie/.openwebmail/history.log +home/melanie/.openwebmail/pop3/pop3.check +home/melanie/.openwebmail/webmail/filter.check +home/melanie/.openwebmail/webmail/filter.pid +home/melanie/.openwebmail/webmail/trash.check +home/melanie/mail/sent-mail +home/michael/.openwebmail/db/external.cache +home/michael/.openwebmail/db/external.dir +home/michael/.openwebmail/db/external.pag +home/michael/.openwebmail/db/mail-trash.cache +home/michael/.openwebmail/db/mail-trash.dir +home/michael/.openwebmail/db/mail-trash.pag +home/michael/.openwebmail/db/michael.cache +home/michael/.openwebmail/db/michael.dir +home/michael/.openwebmail/db/michael.pag +home/michael/.openwebmail/db/saved-drafts.cache +home/michael/.openwebmail/db/saved-drafts.pag +home/michael/.openwebmail/db/saved-messages.pag +home/michael/.openwebmail/db/sent-mail.cache +home/michael/.openwebmail/db/sent-mail.pag +home/michael/.openwebmail/history.log +home/michael/.openwebmail/pop3/pop3.check +home/michael/.openwebmail/webmail/filter.check +home/michael/.openwebmail/webmail/filter.folderdb.pag +home/michael/.openwebmail/webmail/filter.pid +home/michael/.openwebmail/webmail/filter.ruledb.pag +home/michael/.openwebmail/webmail/search.cache +home/michael/.openwebmail/webmail/trash.check +home/michael/mail/external +home/michael/mail/mail-trash +home/michael/mail/saved-drafts +home/michael/mail/saved-messages +home/michael/mail/sent-mail +home/michaelo/.DS_Store +home/michaelo/.openwebmail/db/FEnder info.pag +home/michaelo/.openwebmail/db/HR.dir +home/michaelo/.openwebmail/db/HR.pag +home/michaelo/.openwebmail/db/coord report.dir +home/michaelo/.openwebmail/db/coord report.pag +home/michaelo/.openwebmail/db/coord.pag +home/michaelo/.openwebmail/db/csc report.dir +home/michaelo/.openwebmail/db/csc report.pag +home/michaelo/.openwebmail/db/customer service.pag +home/michaelo/.openwebmail/db/finance.pag +home/michaelo/.openwebmail/db/flown the coop.dir +home/michaelo/.openwebmail/db/flown the coop.pag +home/michaelo/.openwebmail/db/marketing.pag +home/michaelo/.openwebmail/db/merch.dir +home/michaelo/.openwebmail/db/merch.pag +home/michaelo/.openwebmail/db/michaelo.cache +home/michaelo/.openwebmail/db/michaelo.pag +home/michaelo/mail/ +home/michaelo/.openwebmail/db/personnel.pag +home/michaelo/.openwebmail/db/schedule requests.cache +home/michaelo/.openwebmail/db/schedule requests.dir +home/michaelo/.openwebmail/db/schedule requests.pag +home/michaelo/.openwebmail/db/sent-mail.cache +home/michaelo/.openwebmail/db/sent-mail.dir +home/michaelo/.openwebmail/db/sent-mail.pag +home/michaelo/.openwebmail/db/store ops.pag +home/michaelo/.openwebmail/db/stuff.pag +home/michaelo/.openwebmail/history.log +home/michaelo/.openwebmail/pop3/pop3.check +home/michaelo/.openwebmail/webmail/filter.check +home/michaelo/.openwebmail/webmail/filter.pid +home/michaelo/.openwebmail/webmail/search.cache +home/michaelo/.openwebmail/webmail/trash.check +home/michaelo/mail/.DS_Store +home/michaelo/mail/FEnder info +home/michaelo/mail/HR +home/michaelo/mail/coord +home/michaelo/mail/coord report +home/michaelo/mail/csc report +home/michaelo/mail/customer service +home/michaelo/mail/finance +home/michaelo/mail/flown the coop +home/michaelo/mail/marketing +home/michaelo/mail/merch +home/michaelo/mail/personnel +home/michaelo/mail/schedule requests +home/michaelo/mail/sent-mail +home/nikki/ +home/nikki/.openwebmail/db/ +home/nikki/mail/ +home/pmlaker/.openwebmail/webaddr/ +home/pmlaker/.openwebmail/webmail/ +home/michaelo/mail/store ops +home/michaelo/mail/stuff +home/mikec/.openwebmail/db/mikec.cache +home/mikec/.openwebmail/db/mikec.pag +home/raelynn/ +home/mikec/.openwebmail/history.log +home/mikec/.openwebmail/pop3/pop3.check +home/mikec/.openwebmail/webmail/filter.check +home/mikec/.openwebmail/webmail/filter.pid +home/mikec/.openwebmail/webmail/trash.check +home/msowl/.openwebmail/db/msowl.cache +home/msowl/.openwebmail/db/msowl.dir +home/msowl/.openwebmail/db/msowl.pag +home/msowl/.openwebmail/history.log +home/msowl/.openwebmail/pop3/pop3.check +home/msowl/.openwebmail/webmail/filter.check +home/msowl/.openwebmail/webmail/filter.pid +home/msowl/.openwebmail/webmail/trash.check +home/mwalsh/.openwebmail/db/mail-trash.dir +home/mwalsh/.openwebmail/db/mail-trash.pag +home/mwalsh/.openwebmail/db/mwalsh.cache +home/mwalsh/.openwebmail/db/mwalsh.dir +home/mwalsh/.openwebmail/db/mwalsh.pag +home/mwalsh/.openwebmail/history.log +home/mwalsh/.openwebmail/openwebmailrc +home/mwalsh/.openwebmail/pop3/pop3.check +home/mwalsh/.openwebmail/webmail/filter.check +home/mwalsh/.openwebmail/webmail/filter.pid +home/mwalsh/.openwebmail/webmail/signature +home/mwalsh/.openwebmail/webmail/trash.check +home/mwalsh/.vacation.msg +home/mwalsh/mail/mail-trash +home/nate/.openwebmail/db/mail-trash.pag +home/nate/.openwebmail/db/nate.cache +home/nate/.openwebmail/db/nate.dir +home/nate/.openwebmail/db/nate.pag +home/nate/.openwebmail/history.log +home/nate/.openwebmail/pop3/pop3.check +home/nate/.openwebmail/webmail/filter.check +home/nate/.openwebmail/webmail/filter.pid +home/nate/.openwebmail/webmail/trash.check +home/nate/mail/mail-trash +home/nikki/.DS_Store +home/nikki/.openwebmail/db/mail-trash.dir +home/nikki/.openwebmail/db/mail-trash.pag +home/nikki/.openwebmail/db/nikki.cache +home/nikki/.openwebmail/db/nikki.pag +home/nikki/.openwebmail/db/saved-drafts.cache +home/nikki/.openwebmail/db/saved-drafts.dir +home/nikki/.openwebmail/db/saved-drafts.pag +home/nikki/.openwebmail/db/sent-mail.cache +home/nikki/.openwebmail/db/sent-mail.dir +home/nikki/.openwebmail/db/sent-mail.pag +home/nikki/.openwebmail/history.log +home/nikki/.openwebmail/pop3/pop3.check +home/nikki/.openwebmail/webmail/filter.check +home/nikki/.openwebmail/webmail/filter.pid +home/nikki/.openwebmail/webmail/trash.check +home/nikki/mail/mail-trash +home/nikki/mail/saved-drafts +home/nikki/mail/sent-mail +home/pauline/.openwebmail/db/mail-trash.cache +home/pauline/.openwebmail/db/mail-trash.dir +home/pauline/.openwebmail/db/mail-trash.pag +home/pauline/.openwebmail/db/pauline.cache +home/pauline/.openwebmail/db/pauline.dir +home/pauline/.openwebmail/db/pauline.pag +home/pauline/.openwebmail/db/sent-mail.cache +home/pauline/.openwebmail/db/sent-mail.dir +home/pauline/.openwebmail/db/sent-mail.pag +home/pauline/.openwebmail/db/xina.cache +home/pauline/.openwebmail/db/xina.dir +home/pauline/.openwebmail/db/xina.pag +home/pauline/.openwebmail/history.log +home/pauline/.openwebmail/pop3/pop3.check +home/pauline/.openwebmail/webmail/filter.check +home/pauline/.openwebmail/webmail/filter.pid +home/pauline/.openwebmail/webmail/trash.check +home/pauline/mail/mail-trash +home/pauline/mail/sent-mail +home/pauline/mail/xina +home/pmlaker/.openwebmail/db/pmlaker.cache +home/pmlaker/.openwebmail/db/pmlaker.dir +home/pmlaker/.openwebmail/db/pmlaker.pag +home/pmlaker/.openwebmail/db/sent-mail.pag +home/pmlaker/.openwebmail/history.log +home/pmlaker/.openwebmail/pop3/pop3.check +home/pmlaker/.openwebmail/webaddr/.address.book.old +home/pmlaker/.openwebmail/webaddr/Converted +home/pmlaker/.openwebmail/webmail/address.book +home/pmlaker/.openwebmail/webmail/filter.check +home/pmlaker/.openwebmail/webmail/filter.pid +home/pmlaker/.openwebmail/webmail/trash.check +home/pmlaker/mail/sent-mail +home/ppfaff/.openwebmail/db/mail-trash.dir +home/ppfaff/.openwebmail/db/mail-trash.pag +home/ppfaff/.openwebmail/db/ppfaff.cache +home/ppfaff/.openwebmail/db/ppfaff.pag +home/ppfaff/.openwebmail/history.log +home/ppfaff/.openwebmail/pop3/pop3.check +home/ppfaff/.openwebmail/webmail/filter.check +home/ppfaff/.openwebmail/webmail/filter.pid +home/ppfaff/.openwebmail/webmail/trash.check +home/ppfaff/mail/mail-trash +home/raelynn/.DS_Store +home/raelynn/._defrost times 0806.xls +home/raelynn/.openwebmail/db/FE.dir +home/raelynn/.openwebmail/db/FE.pag +home/raelynn/.openwebmail/db/Finance.dir +home/raelynn/.openwebmail/db/Finance.pag +home/raelynn/.openwebmail/db/HR info.dir +home/raelynn/.openwebmail/db/HR info.pag +home/raelynn/.openwebmail/db/IT says.pag +home/raelynn/.openwebmail/db/Lisa says.cache +home/raelynn/.openwebmail/db/Lisa says.dir +home/raelynn/.openwebmail/db/Lisa says.pag +home/raelynn/.openwebmail/db/MKT.dir +home/raelynn/.openwebmail/db/MKT.pag +home/raelynn/.openwebmail/db/Stocker Emails.pag +home/raelynn/.openwebmail/db/brad says.dir +home/raelynn/.openwebmail/db/brad says.pag +home/raelynn/.openwebmail/db/deli.dir +home/raelynn/.openwebmail/db/deli.pag +home/raelynn/.openwebmail/db/eriq emails.dir +home/raelynn/.openwebmail/db/eriq emails.pag +home/raelynn/.openwebmail/db/jesse says.dir +home/raelynn/.openwebmail/db/jesse says.pag +home/raelynn/.openwebmail/db/jillhall says.dir +home/raelynn/.openwebmail/db/jillhall says.pag +home/raelynn/.openwebmail/db/jim emails.dir +home/raelynn/.openwebmail/db/jim emails.pag +home/raelynn/.openwebmail/db/mail-trash.dir +home/raelynn/.openwebmail/db/mail-trash.pag +home/raelynn/CAP & Sale info/ +home/raelynn/CAP & Sale info/August 07/ +home/raelynn/CAP & Sale info/Oct 07/ +home/raelynn/CAP & Sale info/Sept 07/ +home/raelynn/Merch Loss Donation/ +home/raelynn/Merch Loss Donation/Bulk LD/ +home/raelynn/Merch Loss Donation/Cool frozen LD/ +home/raelynn/Merch Loss Donation/Meat LD/ +home/raelynn/Merch Loss Donation/Q's LD 06-07/ +home/raelynn/Out of Stocks/ +home/raelynn/Price comparison/ +home/raelynn/Sales Information/ +home/raelynn/Sample Info/ +home/raelynn/.openwebmail/db/produce.dir +home/raelynn/.openwebmail/db/produce.pag +home/raelynn/.openwebmail/db/raelynn.cache +home/raelynn/.openwebmail/db/raelynn.pag +home/raelynn/UNFI INVOICES/ +home/raelynn/bin/ +home/raelynn/.openwebmail/db/saved-drafts.dir +home/raelynn/.openwebmail/db/saved-drafts.pag +home/raelynn/.openwebmail/db/sent-mail.cache +home/raelynn/.openwebmail/db/sent-mail.dir +home/raelynn/.openwebmail/db/sent-mail.pag +home/raelynn/.openwebmail/db/sharron says.dir +home/raelynn/.openwebmail/db/sharron says.pag +home/raelynn/.openwebmail/db/shiftee emails.dir +home/raelynn/.openwebmail/db/shiftee emails.pag +home/raelynn/.openwebmail/db/spam-mail.pag +home/raelynn/.openwebmail/history.log +home/raelynn/.openwebmail/pop3/pop3.check +home/raelynn/.openwebmail/webmail/filter.check +home/raelynn/.openwebmail/webmail/filter.folderdb.pag +home/raelynn/.openwebmail/webmail/filter.pid +home/raelynn/.openwebmail/webmail/filter.ruledb.pag +home/raelynn/.openwebmail/webmail/search.cache +home/raelynn/.openwebmail/webmail/trash.check +home/raelynn/CAP & Sale info/.DS_Store +home/raelynn/CAP & Sale info/Oct 07/._1007 MW CAP Modified.xls +home/raelynn/CAP & Sale info/Oct 07/._1007 MW CAP Order Form.xls +home/raelynn/CAP & Sale info/Oct 07/._710 Midwest Oct 2007 HOG.xls +home/raelynn/CAP & Sale info/Oct 07/1007 MW CAP Modified.xls +home/raelynn/CAP & Sale info/Oct 07/1007 MW CAP Order Form.xls +home/raelynn/CAP & Sale info/Oct 07/710 Midwest Oct 2007 HOG.xls +home/raelynn/CAP & Sale info/Sept 07/._0907 CAP Central Demos.xls +home/raelynn/CAP & Sale info/Sept 07/0907 CAP Central Demos.xls +home/raelynn/Merch Loss Donation/.DS_Store +home/raelynn/Merch Loss Donation/Bulk LD/._Bulk 7-07 LD.xls +home/raelynn/Merch Loss Donation/Bulk LD/Bulk 7-07 LD.xls +home/raelynn/Merch Loss Donation/Cool frozen LD/Froz 7-07 LD.xls +home/raelynn/Merch Loss Donation/Meat LD/._Meat 7-07 LD.xls +home/raelynn/Merch Loss Donation/Meat LD/Meat 7-07 LD.xls +home/raelynn/Merch Loss Donation/Q's LD 06-07/.DS_Store +home/raelynn/Merch Loss Donation/Q's LD 06-07/._Merch 7-07 LD.xls +home/raelynn/Merch Loss Donation/Q's LD 06-07/July loss ER.xls +home/raelynn/Merch Loss Donation/Q's LD 06-07/Merch 7-07 LD.xls +home/raelynn/Out of Stocks/._Out of Stocks 8-6-07.xls +home/raelynn/Out of Stocks/Out of Stocks 8-6-07.xls +home/raelynn/Price comparison/._Price Comp 2007.xls +home/raelynn/Price comparison/Price Comp 2007.xls +home/raelynn/Sales Information/._01QFY07Margin-sm.xls +home/raelynn/Sales Information/._02QFY07Margin-sm.xls +home/raelynn/Sales Information/._03QFY07Margin-sm.xls +home/raelynn/Sales Information/._04QFY07Margin-sm.xls +home/raelynn/Sales Information/._Dept Sales Wksht FY08.xls +home/raelynn/Sales Information/._Margin summary FY2006.xls +home/raelynn/Sales Information/01QFY07Margin-sm.xls +home/raelynn/Sales Information/02QFY07Margin-sm.xls +home/raelynn/Sales Information/03QFY07Margin-sm.xls +home/raelynn/Sales Information/04QFY07Margin-sm.xls +home/raelynn/Sales Information/Dept Sales Wksht FY08.xls +home/raelynn/Sales Information/Margin summary FY2006.xls +home/raelynn/Sample Info/._In-Store Demo Tracking.xls +home/raelynn/Sample Info/._Sample Signage.xls +home/raelynn/Sample Info/._WFC Demo Fills.xls +home/raelynn/Sample Info/In-Store Demo Tracking.xls +home/raelynn/Sample Info/Sample Signage.xls +home/raelynn/Sample Info/WFC Demo Fills.xls +home/raelynn/UNFI INVOICES/ SN 7-20-07.xls +home/raelynn/UNFI INVOICES/._ SN 7-20-07.xls +home/raelynn/UNFI INVOICES/._SN 7-27-07.xls +home/raelynn/UNFI INVOICES/._UNFI 7-24-07.xls +home/raelynn/UNFI INVOICES/._UNFI 7-26-07.xls +home/raelynn/UNFI INVOICES/._UNFI 7-28-07.xls +home/raelynn/UNFI INVOICES/._UNFI 7-31-07.xls +home/raelynn/UNFI INVOICES/._UNFI 8-2-07.xls +home/raelynn/UNFI INVOICES/._UNFI 8-4-07.xls +home/raelynn/UNFI INVOICES/SN 7-27-07.xls +home/raelynn/UNFI INVOICES/UNFI 7-24-07.xls +home/raelynn/UNFI INVOICES/UNFI 7-26-07.xls +home/raelynn/UNFI INVOICES/UNFI 7-28-07.xls +home/raelynn/UNFI INVOICES/UNFI 7-31-07.xls +home/raelynn/UNFI INVOICES/UNFI 8-2-07.xls +home/raelynn/UNFI INVOICES/UNFI 8-4-07.xls +home/raelynn/bin/._Employee Doc 2-22.xls +home/raelynn/bin/._Employee Doc RL.xls +home/raelynn/bin/._Schedule 2007.xls +home/raelynn/bin/Employee Doc 2-22.xls +home/raelynn/bin/Employee Doc RL.xls +home/raelynn/bin/Schedule 2007.xls +home/raelynn/defrost times 0806.xls +home/raelynn/mail/FE +home/raelynn/mail/Finance +home/raelynn/mail/HR info +home/raelynn/mail/IT says +home/raelynn/mail/Lisa says +home/raelynn/mail/MKT +home/raelynn/mail/Stocker Emails +home/raelynn/mail/brad says +home/raelynn/mail/deli +home/raelynn/mail/eriq emails +home/raelynn/mail/jesse says +home/raelynn/mail/jillhall says +home/raelynn/mail/jim emails +home/raelynn/mail/mail-trash +home/raelynn/mail/produce +home/raelynn/mail/saved-drafts +home/raelynn/mail/sent-mail +home/shannon/ +home/raelynn/mail/sharron says +home/raelynn/mail/shiftee emails +home/raelynn/mail/spam-mail +home/rain/.openwebmail/db/rain.cache +home/rain/.openwebmail/db/rain.dir +home/rain/.openwebmail/db/rain.pag +home/rain/.openwebmail/db/sent-mail.dir +home/rain/.openwebmail/db/sent-mail.pag +WARNING: home/rain/.openwebmail/db/sent-mail.pag failed verification -- update discarded (will try again). +home/rain/.openwebmail/history.log +WARNING: home/rain/.openwebmail/history.log failed verification -- update discarded (will try again). +home/rain/.openwebmail/pop3/pop3.check +home/rain/.openwebmail/webmail/filter.check +home/rain/.openwebmail/webmail/filter.pid +home/rain/.openwebmail/webmail/trash.check +home/rain/mail/sent-mail +home/rayann/.openwebmail/db/mail-trash.dir +home/rayann/.openwebmail/db/mail-trash.pag +WARNING: home/rayann/.openwebmail/db/mail-trash.pag failed verification -- update discarded (will try again). +home/rayann/.openwebmail/db/rayann.cache +home/rayann/.openwebmail/db/rayann.pag +home/rayann/.openwebmail/db/sent-mail.dir +home/rayann/.openwebmail/db/sent-mail.pag +WARNING: home/rayann/.openwebmail/db/sent-mail.pag failed verification -- update discarded (will try again). +home/rayann/.openwebmail/history.log +WARNING: home/rayann/.openwebmail/history.log failed verification -- update discarded (will try again). +home/rayann/.openwebmail/pop3/pop3.check +home/rayann/.openwebmail/webmail/filter.check +home/rayann/.openwebmail/webmail/filter.pid +home/rayann/.openwebmail/webmail/trash.check +home/rayann/mail/mail-trash +WARNING: home/rayann/mail/mail-trash failed verification -- update discarded (will try again). +home/rayann/mail/sent-mail +home/rianna/.openwebmail/db/mail-trash.dir +home/rianna/.openwebmail/db/mail-trash.pag +home/rianna/.openwebmail/db/rianna.cache +home/rianna/.openwebmail/db/rianna.dir +home/rianna/.openwebmail/db/rianna.pag +WARNING: home/rianna/.openwebmail/db/rianna.pag failed verification -- update discarded (will try again). +home/rianna/.openwebmail/db/sent-mail.dir +home/rianna/.openwebmail/db/sent-mail.pag +home/rianna/.openwebmail/history.log +WARNING: home/rianna/.openwebmail/history.log failed verification -- update discarded (will try again). +home/rianna/.openwebmail/pop3/pop3.check +home/rianna/.openwebmail/webmail/filter.check +home/rianna/.openwebmail/webmail/filter.pid +home/rianna/.openwebmail/webmail/trash.check +home/rianna/mail/mail-trash +WARNING: home/rianna/mail/mail-trash failed verification -- update discarded (will try again). +home/rianna/mail/sent-mail +home/sdykema/.openwebmail/db/mail-trash.dir +home/sdykema/.openwebmail/db/mail-trash.pag +home/sdykema/.openwebmail/db/sdykema.cache +home/sdykema/.openwebmail/db/sdykema.dir +home/sdykema/.openwebmail/db/sdykema.pag +home/sdykema/.openwebmail/history.log +WARNING: home/sdykema/.openwebmail/history.log failed verification -- update discarded (will try again). +home/sdykema/.openwebmail/pop3/pop3.check +home/sdykema/.openwebmail/webmail/filter.check +home/sdykema/.openwebmail/webmail/filter.pid +home/sdykema/.openwebmail/webmail/trash.check +home/sdykema/mail/mail-trash +WARNING: home/sdykema/mail/mail-trash failed verification -- update discarded (will try again). +home/shannon/.openwebmail/db/saved-drafts.cache +home/shannon/.openwebmail/db/saved-drafts.pag +home/shannon/.openwebmail/db/saved-messages.cache +WARNING: home/shannon/.openwebmail/db/saved-messages.cache failed verification -- update discarded (will try again). +home/shannon/.openwebmail/db/saved-messages.dir +home/shannon/.openwebmail/db/saved-messages.pag +home/shannon/.openwebmail/db/sent-mail.cache +home/shannon/.openwebmail/db/sent-mail.dir +home/shannon/.openwebmail/db/sent-mail.pag +home/shannon/.openwebmail/db/shannon.cache +WARNING: home/shannon/.openwebmail/db/shannon.cache failed verification -- update discarded (will try again). +home/shannon/.openwebmail/db/shannon.dir +home/shannon/.openwebmail/db/shannon.pag +WARNING: home/shannon/.openwebmail/db/shannon.pag failed verification -- update discarded (will try again). +home/shannon/.openwebmail/db/spam-mail.pag +home/shannon/.openwebmail/history.log +home/shannon/.openwebmail/pop3/pop3.check +home/shannon/.openwebmail/webmail/filter.check +home/shannon/.openwebmail/webmail/filter.pid +home/shannon/.openwebmail/webmail/search.cache +home/shannon/.openwebmail/webmail/trash.check +home/shannon/Desktop/7-07Due.doc +home/shannon/Desktop/CAP_Custom_Flyer_Update_Apr07_Final.doc +home/shannon/Desktop/CCP program/CCP Legal.doc +home/shannon/Desktop/Event summaries/Document1 +home/shannon/Desktop/Event summaries/MOFF letter 07.doc +home/shannon/Desktop/Gazette/early gazette stuff/DiannaFarewell.doc +home/shannon/Desktop/List of Donations in FY07.doc +home/shannon/Desktop/M&MS 1Q 2007.doc +home/shannon/Desktop/MembershipBoardReportJune07.doc +home/shannon/Desktop/SzymkowiakShannon.doc +home/shannon/Desktop/WP 07 11 07.doc +home/shannon/Documents/Microsoft User Data/AutoRecovery save of CCMA – Jun +home/shannon/Documents/Microsoft User Data/AutoRecovery save of Szymkowiak +home/shannon/EE fundraising brochure.jpg +home/shannon/allproducts2006.jpg +home/shannon/mail/saved-drafts +home/shannon/mail/saved-messages +home/shannon/mail/sent-mail +home/smurphy/Board 07/Annual Report FY 07/ +home/smurphy/Board 07/Annual Report FY 2006/ +home/smurphy/Budget FY08/ +home/smurphy/EOM FY08/ +home/smurphy/EOM FY08/Trial Balance/ +home/smurphy/GAP 2007/MERCH 07/ +home/smurphy/HR 2007 / +home/smurphy/HR 2007 /Colter 07/ +home/smurphy/HR 2007 /Deli/ +home/smurphy/HR 2007 /Eval info/ +home/smurphy/HR 2007 /Finance/ +home/smurphy/HR 2007 /IT COORD/ +home/smurphy/HR 2007 /Store OPS/ +home/smurphy/NCGA 2007/Store Audit/ +home/smurphy/Policies/ +home/smurphy/Policies/Mgmt Training/ +home/smurphy/Weekly Report 0607/ +home/shannon/mail/spam-mail +rsync: send_files failed to open "home/shawn/.mozilla/default/fedcba98.slt/News/newsrc-mynews" (in backup_key): Permission denied (13) +home/smurphy/.DS_Store +home/smurphy/._EOM FY07 +home/smurphy/._EOM FY08 +home/smurphy/.openwebmail/db/MTM.cache +home/smurphy/.openwebmail/db/MTM.dir +home/smurphy/.openwebmail/db/MTM.pag +home/smurphy/.openwebmail/db/mail-trash.cache +home/smurphy/.openwebmail/db/mail-trash.dir +home/smurphy/.openwebmail/db/mail-trash.pag +home/smurphy/.openwebmail/db/saved-drafts.cache +home/smurphy/.openwebmail/db/saved-drafts.pag +home/smurphy/.openwebmail/db/saved-messages.cache +home/smurphy/.openwebmail/db/saved-messages.dir +home/smurphy/.openwebmail/db/saved-messages.pag +home/smurphy/.openwebmail/db/sent-mail.cache +home/smurphy/.openwebmail/db/sent-mail.dir +home/smurphy/.openwebmail/db/sent-mail.pag +home/smurphy/.openwebmail/db/smurphy.cache +home/smurphy/.openwebmail/db/smurphy.dir +home/smurphy/.openwebmail/db/smurphy.pag +home/smurphy/.openwebmail/history.log +home/smurphy/.openwebmail/pop3/pop3.check +home/smurphy/.openwebmail/webmail/filter.check +home/smurphy/.openwebmail/webmail/filter.pid +home/smurphy/.openwebmail/webmail/search.cache +home/smurphy/.openwebmail/webmail/trash.check +home/smurphy/Board 07/.DS_Store +home/smurphy/Board 07/._.DS_Store +home/smurphy/Board 07/._0A stock members 7-27-07.xls +home/smurphy/Board 07/._Abandoned equity plan.doc +home/smurphy/Board 07/._Acronyms 101-A.doc +home/smurphy/Board 07/._BOARD CONFLICT STATEMENT.doc +home/smurphy/Board 07/._BOARD AGENDA.doc +home/smurphy/Board 07/._BOARD BINDER.doc +home/smurphy/Board 07/._BOARD LIST 042307.xls +home/smurphy/Board 07/._BOARD LIST post.xls +home/smurphy/Board 07/._BOARD REPORT +home/smurphy/Board 07/._BOARD REPORT 2.doc +home/smurphy/Board 07/._BOARD REPORT III.doc +home/smurphy/Board 07/._Board Calendar.xls +home/smurphy/Board 07/._Board Labels previous.doc +home/smurphy/Board 07/._Board Labels.doc +home/smurphy/Board 07/._Board Orientation.doc +home/smurphy/Board 07/._Board Policies 07.doc +home/smurphy/Board 07/._Board application pkt020507.doc +home/smurphy/Board 07/._Board perf survey.doc +home/smurphy/Board 07/._Board survey 06.doc +home/smurphy/Board 07/._CBJ list.xls +home/smurphy/Board 07/._D11 Compliance.doc +home/smurphy/Board 07/._Directors.doc +home/smurphy/Board 07/._Finance Com.doc +home/smurphy/Board 07/._ICAn arvot ja periaatteet 1995-päs-1.ppt +home/smurphy/Board 07/._Inactive 062307.xls +home/smurphy/Board 07/._Insurance 06.doc +home/smurphy/Board 07/._MISSION-VALUES.doc +home/smurphy/Board 07/._Member Report062407.doc +home/smurphy/Board 07/._Member loan research.doc +home/smurphy/Board 07/._MembershipBoardReportJune07.doc +home/smurphy/Board 07/._Mission Stmts.doc +home/smurphy/Board 07/._Monitor Report Process.doc +home/smurphy/Board 07/._PAT REBATE.xls +home/smurphy/Board 07/._POLICY C4.xls +home/smurphy/Board 07/._Proposal D4 Code of Conduct.doc +home/smurphy/Board 07/._STATEMENT OF COMMITMENT.doc +home/smurphy/Board 07/._co-op historyII.doc +home/smurphy/Board 07/0A stock members 7-27-07.xls +home/smurphy/Board 07/Annual Report FY 07/.DS_Store +home/smurphy/Board 07/Annual Report FY 07/._.DS_Store +home/smurphy/Board 07/Annual Report FY 07/._07 Owner Survey 072507.doc +home/smurphy/Board 07/Annual Report FY 07/._Ballot 2007.doc +home/smurphy/Board 07/Annual Report FY 07/._Board List 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Co-op Principles 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Committees 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Erik's Candidate Statement.doc +home/smurphy/Board 07/Annual Report FY 07/._Fena 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Financials 07.xls +home/smurphy/Board 07/Annual Report FY 07/._Heather's profile.doc +home/smurphy/Board 07/Annual Report FY 07/._Management Report.doc +home/smurphy/Board 07/Annual Report FY 07/._Minutes 7-06 Anl Mtg.doc +home/smurphy/Board 07/Annual Report FY 07/._Mission-Values 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Notice-Agenda 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Sidebars 07.doc +home/smurphy/Board 07/Annual Report FY 07/._Staff List 07.doc +home/smurphy/Board 07/Annual Report FY 07/07 Owner Survey 072507.doc +home/smurphy/Board 07/Annual Report FY 07/Ballot 2007.doc +home/smurphy/Board 07/Annual Report FY 07/Board List 07.doc +home/smurphy/Board 07/Annual Report FY 07/Co-op Principles 07.doc +home/smurphy/Board 07/Annual Report FY 07/Committees 07.doc +home/smurphy/Board 07/Annual Report FY 07/Erik's Candidate Statement.doc +home/smurphy/Board 07/Annual Report FY 07/Fena 07.doc +home/smurphy/Board 07/Annual Report FY 07/Financials 07.xls +home/smurphy/Board 07/Annual Report FY 07/Heather's profile.doc +home/smurphy/Board 07/Annual Report FY 07/Management Report.doc +home/smurphy/Board 07/Annual Report FY 07/Minutes 7-06 Anl Mtg.doc +home/smurphy/Board 07/Annual Report FY 07/Mission-Values 07.doc +home/smurphy/Board 07/Annual Report FY 07/Notice-Agenda 07.doc +home/smurphy/Board 07/Annual Report FY 07/RRR Report 0707.xls +home/smurphy/Board 07/Annual Report FY 07/Sidebars 07.doc +home/smurphy/Board 07/Annual Report FY 07/Staff List 07.doc +home/smurphy/Board 07/Annual Report FY 2006/.DS_Store +home/smurphy/Board 07/Annual Report FY 2006/._.DS_Store +home/smurphy/Board 07/Annual Report FY 2006/._APPLICATION Helf.doc +home/smurphy/Board 07/Annual Report FY 2006/._BALLOT 8.2.06.doc +home/smurphy/Board 07/Annual Report FY 2006/._BALLOT 8.29.06 +home/smurphy/Board 07/Annual Report FY 2006/._Board List.doc +home/smurphy/Board 07/Annual Report FY 2006/._Board Report-Jean.doc +home/smurphy/Board 07/Annual Report FY 2006/._Co-op Principles.doc +home/smurphy/Board 07/Annual Report FY 2006/._Committees 06.doc +home/smurphy/Board 07/Annual Report FY 2006/._Committees.doc +home/smurphy/Board 07/Annual Report FY 2006/._Directors 10.06.doc +home/smurphy/Board 07/Annual Report FY 2006/._FY 06 Inc Bal.xls +home/smurphy/Board 07/Annual Report FY 2006/._Giving Forward-Shannon.doc +home/smurphy/Board 07/Annual Report FY 2006/._Idea.doc +home/smurphy/Board 07/Annual Report FY 2006/._Management Report.doc +home/smurphy/Board 07/Annual Report FY 2006/._Menu-RSVP-Shannon.doc +home/smurphy/Board 07/Annual Report FY 2006/._Minutes 9-05 Anl Mtg.doc +home/smurphy/Board 07/Annual Report FY 2006/._Mission-Values.doc +home/smurphy/Board 07/Annual Report FY 2006/._Notice-Agenda.doc +home/smurphy/Board 07/Annual Report FY 2006/._Outreach-Shannon.doc +home/smurphy/Board 07/Annual Report FY 2006/._Sidebars.doc +home/smurphy/Board 07/Annual Report FY 2006/._Staff List Shannon.doc +home/smurphy/Board 07/Annual Report FY 2006/._Survey comments 0906.doc +home/smurphy/Board 07/Annual Report FY 2006/._agenda notes.doc +home/smurphy/Board 07/Annual Report FY 2006/BALLOT 8.2.06.doc +home/smurphy/Board 07/Art Project/._.DS_Store +home/smurphy/Board 07/Art Project/._Art Options.xls +home/smurphy/Board 07/Art Project/._Benson 070307.doc +home/smurphy/Board 07/Art Project/._art jury results.doc +home/smurphy/Board 07/Art Project/._art proposal.doc +home/smurphy/Board 07/Arts & By-Laws/._.DS_Store +home/smurphy/Board 07/Arts & By-Laws/._308A.doc +home/smurphy/Board 07/Arts & By-Laws/._A of I Research.doc +home/smurphy/Board 07/Arts & By-Laws/._Articles Gazette.doc +home/smurphy/Board 07/Arts & By-Laws/._Arts Inc 070107.doc +home/smurphy/Board 07/Arts & By-Laws/._Arts Inc draft-1.doc +home/smurphy/Board 07/Arts & By-Laws/._Arts Inc draft-2mp.doc +home/smurphy/Board 07/Arts & By-Laws/._By-Laws Review 2006.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 012107.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 012407.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 013107.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 022807.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 040990.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 041107.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 050107.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 062107.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 070107.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 090306.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 092206.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 101806.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 112906.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws 122006.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws Committee.doc +home/smurphy/Board 07/Arts & By-Laws/._Bylaws Gazette.doc +home/smurphy/Board 07/Arts & By-Laws/._Comments to Amended Articles.doc +home/smurphy/Board 07/Arts & By-Laws/._Escheat research.doc +home/smurphy/Board 07/Arts & By-Laws/._Notes 062807.doc +home/smurphy/Board 07/Arts & By-Laws/._Probst1.DOC +home/smurphy/Board 07/Arts & By-Laws/._Time Line Arts&Bylaws.doc +home/smurphy/Board 07/Arts & By-Laws/._bylaws by statute.doc +home/smurphy/Board 07/Arts & By-Laws/Articles Gazette.doc +home/smurphy/Board 07/Arts & By-Laws/Bylaws Gazette.doc +home/smurphy/Board 07/BOARD AGENDA.doc +home/smurphy/Board 07/BOARD REPORT +home/smurphy/Board 07/Board Compensation/._.DS_Store +home/smurphy/Board 07/Board Compensation/._Board Compensation 0407.doc +home/smurphy/Board 07/Board Compensation/._Board Compensation.xls +home/smurphy/Board 07/Board Compensation/._D15 proposed.doc +home/smurphy/Board 07/Board Policies 07.doc +home/smurphy/Board 07/Board retreat/._.DS_Store +home/smurphy/Board 07/Board retreat/._Attendees.doc +home/smurphy/Board 07/Board retreat/._Board's Budget FY07.xls +home/smurphy/Board 07/Board retreat/._Marilyn 06.doc +home/smurphy/Board 07/Board retreat/._Marilyn 106.doc +home/smurphy/Board 07/Board retreat/._Other.doc +home/smurphy/Board 07/Board retreat/._Retreat follow-up.doc +home/smurphy/Board 07/Board retreat/._WFDuluth 107 Eval.doc +home/smurphy/Board 07/Board retreat/._Whole Foods Duluth 2007 retreat outcomes.doc +home/smurphy/Board 07/Compliance Reports/._.DS_Store +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 0307.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 12-06.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 2-06.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 5-06.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 6-07.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 7-06.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 7-07.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 8-06.doc +home/smurphy/Board 07/Compliance Reports/._COMPLIANCE 9-06.doc +home/smurphy/Board 07/Compliance Reports/._Compliance 0207.doc +home/smurphy/Board 07/Compliance Reports/._Compliance 10-06.doc +home/smurphy/Board 07/Compliance Reports/._Compliance Report 0207.doc +home/smurphy/Board 07/Compliance Reports/._Compliance Report 0507.doc +home/smurphy/Board 07/Compliance Reports/._Compliance Report 0707.doc +home/smurphy/Board 07/Compliance Reports/._Compliance Report 1006.doc +home/smurphy/Board 07/Compliance Reports/._Compliance Report 1106.doc +home/smurphy/Board 07/Compliance Reports/Compliance Report 0707.doc +home/smurphy/Board 07/ENDS/.DS_Store +home/smurphy/Board 07/ENDS/._.DS_Store +home/smurphy/Board 07/ENDS/._April Visioning Notes.doc +home/smurphy/Board 07/ENDS/._ENDS 072307.doc +home/smurphy/Board 07/ENDS/._Visioning Session.doc +home/smurphy/Board 07/ENDS/ENDS 072307.doc +home/smurphy/Board 07/FPCR 07/._.DS_Store +home/smurphy/Board 07/FPCR 07/._FP Committee 041007.doc +home/smurphy/Board 07/FPCR 07/._FPC 032207.doc +home/smurphy/Board 07/FPCR 07/._FPC 2007 Comp amend SS.doc +home/smurphy/Board 07/FPCR 07/._FPC Deli 07.doc +home/smurphy/Board 07/FPCR 07/._Food Policies 0406.doc +home/smurphy/Board 07/FPCR 07/._Food Policies 042307.doc +home/smurphy/Board 07/FPCR 07/._Food Policies 2007 Merch.doc +home/smurphy/Board 07/FPCR 07/._Produce FPC 2007.doc +home/smurphy/Board 07/FPCR 07/._SO FPCR 2007.doc +home/smurphy/Board 07/General Mgr/._.DS_Store +home/smurphy/Board 07/General Mgr/._GM CONTRACT 05-07.doc +home/smurphy/Board 07/General Mgr/._GM CONTRACT 07-09.doc +home/smurphy/Board 07/General Mgr/._GM job descrip 052107.doc +home/smurphy/Board 07/General Mgr/GM CONTRACT 07-09.doc +home/smurphy/Board 07/Membership Com/._M&M ideas.doc +home/smurphy/Board 07/Membership Com/._MEMBER COM.doc +home/smurphy/Board 07/Membership Com/._NEWSLETTER POLICYproposal.doc +home/smurphy/Board 07/MembershipBoardReportJune07.doc +home/smurphy/Board 07/Minutes/._.DS_Store +home/smurphy/Board 07/Minutes/._Minutes 012207.doc +home/smurphy/Board 07/Minutes/._Minutes 022607.doc +home/smurphy/Board 07/Minutes/._Minutes 032607.doc +home/smurphy/Board 07/Minutes/._Minutes 042307.doc +home/smurphy/Board 07/Minutes/._Minutes 052107.doc +home/smurphy/Board 07/Minutes/._Minutes 062507.doc +home/smurphy/Board 07/Minutes/._Minutes 072307.doc +home/smurphy/Board 07/Minutes/._Minutes Closed 022607.doc +home/smurphy/Board 07/Minutes/Minutes 062507.doc +home/smurphy/Board 07/Minutes/Minutes 072307.doc +home/smurphy/Board 07/POLICY C4.xls +home/smurphy/Board 07/Plan 100 Years/._.DS_Store +home/smurphy/Budget FY08/.DS_Store +home/smurphy/Budget FY08/._.DS_Store +home/smurphy/Budget FY08/._BUDGET % 08.xls +home/smurphy/Budget FY08/._BUDGET PLANNING 08.xls +home/smurphy/Budget FY08/._Deli budget FY08.xls +home/smurphy/Budget FY08/._Equip Merch 2008.xls +home/smurphy/Budget FY08/._Equip Merch FY08.xls +home/smurphy/Budget FY08/._HR Budget fy08.doc +home/smurphy/Budget FY08/._Health Ins FY 08.doc +home/smurphy/Budget FY08/._Health Ins FY08.xls +home/smurphy/Budget FY08/._M&MS Budget FY08.xls +home/smurphy/Budget FY08/._Training Budget FY 2008.xls +home/smurphy/Budget FY08/9607_2[1].pdf +home/smurphy/Budget FY08/BUDGET % 08.xls +home/smurphy/Budget FY08/BUDGET PLANNING 08.xls +home/smurphy/Budget FY08/Deli budget FY08.xls +home/smurphy/Budget FY08/Equip Merch 2008.xls +home/smurphy/Budget FY08/Equip Merch FY08.xls +home/smurphy/Budget FY08/FE budget FY08.xls +home/smurphy/Budget FY08/FinIT Budget 08.xls +home/smurphy/Budget FY08/HR Budget fy08.doc +home/smurphy/Budget FY08/Health Ins FY 08.doc +home/smurphy/Budget FY08/Health Ins FY08.xls +home/smurphy/Budget FY08/M&MS Budget FY08.xls +home/smurphy/Budget FY08/OPS budget fy08.xls +home/smurphy/Budget FY08/Training Budget FY 2008.xls +home/smurphy/Budget FY08/wholebinder.pdf +home/smurphy/Budget/.DS_Store +home/smurphy/Budget/._.DS_Store +home/smurphy/Budget/._BUDGET % 06.xls +home/smurphy/Budget/._BUDGET % 07.xls +home/smurphy/Budget/._BUDGET PLANNING 07.xls +home/smurphy/Budget/._Board's Budget FY07.xls +home/smurphy/Budget/._Capital Expenses FY06 .xls +home/smurphy/Budget/._CoCoBud06.xls +home/smurphy/Budget/._Equip FY07.xls +home/smurphy/Budget/._Equip Merch 2008.xls +home/smurphy/Budget/._Equip budget 022807.xls +home/smurphy/Budget/._Equipment allocation.xls +home/smurphy/Budget/._IT budget07.xls +home/smurphy/Budget/._MarketingBudgetAnalysis.doc +home/smurphy/Budget/._Mktg-2 FY07.xls +home/smurphy/Budget/._Strategic Plan.doc +home/smurphy/Budget/._Training Budget FY 2007.xls +home/smurphy/Budget/._WFDB052306.xls +home/smurphy/Budget/._budget 05 +home/smurphy/Budget/Budget 08/._.DS_Store +home/smurphy/Budget/Budget 08/._BUDGET % 08.xls +home/smurphy/Budget/Budget 08/._BUDGET PLANNING 08.xls +home/smurphy/Budget/Budget 08/._Cash flow FY06-12.xls +home/smurphy/Budget/Budget 08/._Cash flow FY06-12cc.xls +home/smurphy/Budget/Budget 08/._Deli budget FY08.xls +home/smurphy/Budget/Budget 08/._Equip Merch 2008.xls +home/smurphy/Budget/Budget 08/._HR Budget fy08.doc +home/smurphy/Budget/Budget 08/._Health Ins FY 08.doc +home/smurphy/Budget/Budget 08/._Health Ins FY08.xls +home/smurphy/Budget/Budget 08/._M&MS Budget FY08.xls +home/smurphy/Budget/Budget 08/._MAS 90 050907.xls +home/smurphy/Budget/Budget 08/._MAS 90.doc +home/smurphy/Budget/Budget 08/._Training Budget FY 2007.xls +home/smurphy/Budget/Budget 08/._Training Budget FY 2008.xls +home/smurphy/Budget/Budget 08/BUDGET % 08.xls +home/smurphy/Budget/budget 05/._.DS_Store +home/smurphy/Budget/budget 05/._ADMIN 2005.doc +home/smurphy/Budget/budget 05/._BUDGET % +home/smurphy/Budget/budget 05/._BUDGET PLANNING +home/smurphy/Budget/budget 05/._Budget05Pro.xls +home/smurphy/Budget/budget 05/._Discounts chart.xls +home/smurphy/Budget/budget 05/._Discounts.xls +home/smurphy/Budget/budget 05/._FINANCES 101.xls +home/smurphy/Budget/budget 05/._IT budget2005.xls +home/smurphy/Budget/budget 05/._Promo expense history +home/smurphy/Bus Pln Compliance/.DS_Store +home/smurphy/Bus Pln Compliance/._.DS_Store +home/smurphy/Bus Pln Compliance/._Business Plan - Produce 14May.doc +home/smurphy/Bus Pln Compliance/._Business Plan update 0707.doc +home/smurphy/Bus Pln Compliance/._Deli 2Q update.doc +home/smurphy/Bus Pln Compliance/._FE 2007 Bus Plan Progress.doc +home/smurphy/Bus Pln Compliance/._FE busi plan prog 073107.doc +home/smurphy/Bus Pln Compliance/._Fi and IT 2007 1st Qtr 07 report.doc +home/smurphy/Bus Pln Compliance/._Fi and IT 2007 2nd Qtr 07 report.doc +home/smurphy/Bus Pln Compliance/._HR 07 update5-1-07.doc +home/smurphy/Bus Pln Compliance/._M&MS 1Q 2007.doc +home/smurphy/Bus Pln Compliance/._MAYDAY 07 Summary.doc +home/smurphy/Bus Pln Compliance/._MMSbusinessplanFQ04FY07.doc +home/smurphy/Bus Pln Compliance/._MOFF 0707.xls +home/smurphy/Bus Pln Compliance/._MOFF summary 2007.doc +home/smurphy/Bus Pln Compliance/._Merch BP update 0407.doc +home/smurphy/Bus Pln Compliance/._Merch BP update 0707.doc +home/smurphy/Bus Pln Compliance/._SO biz plan 0407.doc +home/smurphy/Bus Pln Compliance/._business plan Deli update.doc +home/smurphy/Bus Pln Compliance/Business Plan update 0707.doc +home/smurphy/Bus Pln Compliance/Deli 2Q update.doc +home/smurphy/Bus Pln Compliance/FE busi plan prog 073107.doc +home/smurphy/Bus Pln Compliance/Fi and IT 2007 2nd Qtr 07 report.doc +home/smurphy/Bus Pln Compliance/HR 07 update7-31-07.doc +home/smurphy/Bus Pln Compliance/MMSbusinessplanFQ04FY07.doc +home/smurphy/Bus Pln Compliance/MOFF 0707.xls +home/smurphy/Bus Pln Compliance/MOFF summary 2007.doc +home/smurphy/Bus Pln Compliance/Merch BP update 0707.doc +home/smurphy/Bus Pln Compliance/Produce 2Q07.doc +home/smurphy/Bus Pln Compliance/SO bus plan/Day in the Life of a SL.doc +home/smurphy/Bus Pln Compliance/SO bus plan/SL Closing Check.doc +home/smurphy/Bus Pln Compliance/SO bus plan/SL Opening Check.doc +home/smurphy/Bus Pln Compliance/SO bus plan/SO biz plan 0707.doc +home/smurphy/CCMA 07/._.DS_Store +home/smurphy/CCMA 07/._Board CCMA expense.xls +home/smurphy/CCMA 07/._Board attend ccma.doc +home/smurphy/CCMA 07/._Bowers Pledge Proposal.xls +home/smurphy/CCMA 07/._Bowling For Bowers Regist.doc +home/smurphy/CCMA 07/._CCMA 07sm.doc +home/smurphy/CCMA 07/._CCMA 2007dm.doc +home/smurphy/CCMA 07/._CCMA BJL 2007.doc +home/smurphy/CCMA 07/._CCMA June 2007 LKA.doc +home/smurphy/CCMA 07/._CCMA Panel.doc +home/smurphy/CCMA 07/._CCMA cell.xls +home/smurphy/CCMA 07/._CCMA lodging.xls +home/smurphy/CCMA 07/._CCMA per diem checks.xls +home/smurphy/CCMA 07/._CCMA – June 2007SSrevise.doc +home/smurphy/CCMA 07/._CCMA_Hotel&Travel_07.doc +home/smurphy/CCMA 07/._CCMA_RegForm_07.doc +home/smurphy/CCMA 07/._Lessons Learned Prep WFC.doc +home/smurphy/CCMA 07/._Lessons Learned Questionnaire all 4.doc +home/smurphy/CCMA 07/._MT attend ccma.doc +home/smurphy/CCMA 07/CCMA BJL 2007.doc +home/smurphy/Classes-staff/.DS_Store +home/smurphy/Classes-staff/._.DS_Store +home/smurphy/Classes-staff/._CLASS DESCRIP.doc +home/smurphy/Classes-staff/._Dollars-Sense.xls +home/smurphy/Classes-staff/._Instructor Bios.doc +home/smurphy/Classes-staff/._Labels Co-ops.doc +home/smurphy/Classes-staff/._REGISTRATION FORM.doc +home/smurphy/Classes-staff/._Word Work File L_1126 +home/smurphy/Classes-staff/._Word Work File L_3830 +home/smurphy/Classes-staff/._classes co-ops 040107.doc +home/smurphy/Classes-staff/._classes co-ops 072507.doc +home/smurphy/Classes-staff/Finances 101/._.DS_Store +home/smurphy/Classes-staff/Finances 101/._01QFY06Margin-101.xls +home/smurphy/Classes-staff/Finances 101/._BUDGET % 06.101.xls +home/smurphy/Classes-staff/Finances 101/._BUDGET PLANNING 06.101.xls +home/smurphy/Classes-staff/Finances 101/._Balance Sheet 2Q06-101.xls +home/smurphy/Classes-staff/Finances 101/._Bank Recon 10-05-101.xls +home/smurphy/Classes-staff/Finances 101/._Buyers Mtg-outline101.doc +home/smurphy/Classes-staff/Finances 101/._COA 12.03-101.xls +home/smurphy/Classes-staff/Finances 101/._Dept Sales %101.xls +home/smurphy/Classes-staff/Finances 101/._EOQ SHRINK-101.xls +home/smurphy/Classes-staff/Finances 101/._Feb 2006 EOM Rpts101.xls +home/smurphy/Classes-staff/Finances 101/._Finance Class Notes.xls +home/smurphy/Classes-staff/Finances 101/._GROSS MARGIN-101.xls +home/smurphy/Classes-staff/Finances 101/._INVENT sum 12.31-101.xls +home/smurphy/Classes-staff/Finances 101/._Inc Stmt 2-101.xls +home/smurphy/Classes-staff/Finances 101/._JOURNAL 2.06-101.xls +home/smurphy/Classes-staff/Finances 101/._MARGIN-DEPT101.xls +home/smurphy/Classes-staff/Finances 101/._MARGINS-SRPS-101.xls +home/smurphy/Classes-staff/Finances 101/._TRIAL BAL 2.06-101.xls +home/smurphy/Classes-staff/Finances 101/._WFD1Q05HiFi-101.xls +home/smurphy/Classes-staff/Finances 101/._WFD4Q05Gap-101.xls +home/smurphy/Classes-staff/classes co-ops 072507.doc +home/smurphy/Documents/._NEWSLETTER .doc +home/smurphy/Documents/._Word Work File L_1534 +home/smurphy/Documents/._Word Work File L_2510 +home/smurphy/Documents/._Word Work File L_2630 +home/smurphy/Documents/._Word Work File L_2958 +home/smurphy/Documents/._Word Work File L_3366 +home/smurphy/Documents/._Word Work File L_3462 +home/smurphy/Documents/._Word Work File L_3494 +home/smurphy/Documents/._Word Work File L_4046 +home/smurphy/Documents/._Word Work File L_510 +home/smurphy/Documents/NEWSLETTER .doc +home/smurphy/Documents/Word Work File L_1534 +home/smurphy/Documents/Word Work File L_2510 +home/smurphy/Documents/Word Work File L_2630 +home/smurphy/Documents/Word Work File L_2958 +home/smurphy/Documents/Word Work File L_3366 +home/smurphy/Documents/Word Work File L_3462 +home/smurphy/Documents/Word Work File L_3494 +home/smurphy/Documents/Word Work File L_4046 +home/smurphy/Documents/Word Work File L_510 +home/smurphy/EOM FY07/._.DS_Store +home/smurphy/EOM FY07/._01-07 All EOM Rpts.xls +home/smurphy/EOM FY07/._01QFY07Margin-sm.xls +home/smurphy/EOM FY07/._02-07 All EOM Rpts.xls +home/smurphy/EOM FY07/._02QFY07Margin-sm.xls +home/smurphy/EOM FY07/._03QFY07Margin-sm.xls +home/smurphy/EOM FY07/._04-07 All EOM Rpts.xls +home/smurphy/EOM FY07/._04QFY07Margin-sm.xls +home/smurphy/EOM FY07/._05-07 All EOM Rpts vers 4.xls +home/smurphy/EOM FY07/._06-07 All EOM Rpts.xls +home/smurphy/EOM FY07/._08-06 All EOM Rpts Rev1.xls +home/smurphy/EOM FY07/._09-06 All EOM Rpts.xls +home/smurphy/EOM FY07/._10-06 All EOM Rpts.xls +home/smurphy/EOM FY07/._11-06 All EOM Rpts.xls +home/smurphy/EOM FY07/._12-06 All EOM Rpts.xls +home/smurphy/EOM FY07/._Average Daily Sales-update.xls +home/smurphy/EOM FY07/._Balance Sheet 1Q07.xls +home/smurphy/EOM FY07/._Balance Sheet 2Q07.xls +home/smurphy/EOM FY07/._Balance Sheet 3Q07.xls +home/smurphy/EOM FY07/._Balance Sheet 4Q06.xls +home/smurphy/EOM FY07/._Balance Sheet 4Q07.xls +home/smurphy/EOM FY07/._COA 1-1-07.xls +home/smurphy/EOM FY07/._CODING +home/smurphy/EOM FY07/._Cash Flow.xls +home/smurphy/EOM FY07/._Dept Sales %.xls +home/smurphy/EOM FY07/._EOQ SHRINK.xls +home/smurphy/EOM FY07/._Equipment-Charge Card.xls +home/smurphy/EOM FY07/._GROSS MARGIN +home/smurphy/EOM FY07/._Hallway graphs.xls +home/smurphy/EOM FY07/._INVENT in-out 033107.xls +home/smurphy/EOM FY07/._INVENT in-out 063007.xls +home/smurphy/EOM FY07/._INVENT in-out 12.31.06.xls +home/smurphy/EOM FY07/._INVENT in-out 6.30.06.xls +home/smurphy/EOM FY07/._INVENT in-out 9.30.06.xls +home/smurphy/EOM FY07/._Inc Stmt 0507.xls +home/smurphy/EOM FY07/._Inc Stmt 0607.xls +home/smurphy/EOM FY07/._Inc Stmt 1-07.xls +home/smurphy/EOM FY07/._Inc Stmt 10-06.xls +home/smurphy/EOM FY07/._Inc Stmt 11-06.xls +home/smurphy/EOM FY07/._Inc Stmt 12-06.xls +home/smurphy/EOM FY07/._Inc Stmt 2-07.xls +home/smurphy/EOM FY07/._Inc Stmt 3-07.xls +home/smurphy/EOM FY07/._Inc Stmt 4-07.xls +home/smurphy/EOM FY07/._Inc Stmt 7-06.xls +home/smurphy/EOM FY07/._Inc Stmt 8-06.xls +home/smurphy/EOM FY07/._Inc Stmt 9-06.xls +home/smurphy/EOM FY07/._Income Stmt 2Q07.xls +home/smurphy/EOM FY07/._Income Stmt 3Q07.xls +home/smurphy/EOM FY07/._Income Stmt 4Q07.xls +home/smurphy/EOM FY07/._Income Stmt-1Q07.xls +home/smurphy/EOM FY07/._Income Stmt-YTD 06.xls +home/smurphy/EOM FY07/._Income Stmt-YTD 07.xls +home/smurphy/EOM FY07/._JOURNAL 01-07.xls +home/smurphy/EOM FY07/._JOURNAL 02-07.xls +home/smurphy/EOM FY07/._JOURNAL 03-07 revised.xls +home/smurphy/EOM FY07/._JOURNAL 03-07.xls +home/smurphy/EOM FY07/._JOURNAL 10-06.xls +home/smurphy/EOM FY07/._JOURNAL 11-06.xls +home/smurphy/EOM FY07/._JOURNAL 12-06.xls +home/smurphy/EOM FY07/._JOURNAL 7-06.xls +home/smurphy/EOM FY07/._JOURNAL 8-06.xls +home/smurphy/EOM FY07/._JOURNAL 9-06.xls +home/smurphy/EOM FY07/._Journal 04-07.xls +home/smurphy/EOM FY07/._Journal 0507.xls +home/smurphy/EOM FY07/._Journal 0607.xls +home/smurphy/EOM FY07/._July 2006 All EOM Rpts Rev2.xls +home/smurphy/EOM FY07/._LoanInfo Template.XLT +home/smurphy/EOM FY07/._MARGIN-DEPT FY07.xls +home/smurphy/EOM FY07/._MARGIN-DEPT FY08.xls +home/smurphy/EOM FY07/._MARGIN-DEPT.xls +home/smurphy/EOM FY07/._MARGINS-SRPS.xls +home/smurphy/EOM FY07/._MEMO EOM.doc +home/smurphy/EOM FY07/._Margin Contribn-Cool.xls +home/smurphy/EOM FY07/._Margin SRPs 0407.xls +home/smurphy/EOM FY07/._Memo - bank reconciliation +home/smurphy/EOM FY07/._NON-CASH REPORT +home/smurphy/EOM FY07/._RESEARCH-amended 4-25-06.xls +home/smurphy/EOM FY07/._TRIAL BAL 0607-071907.xls +home/smurphy/EOM FY07/._TRIAL BAL 1-07.xls +home/smurphy/EOM FY07/._TRIAL BAL 10-06.xls +home/smurphy/EOM FY07/._TRIAL BAL 11-06.xls +home/smurphy/EOM FY07/._TRIAL BAL 12-06.xls +home/smurphy/EOM FY07/._TRIAL BAL 1Q07.xls +home/smurphy/EOM FY07/._TRIAL BAL 2-07.xls +home/smurphy/EOM FY07/._TRIAL BAL 2Q07.xls +home/smurphy/EOM FY07/._TRIAL BAL 3-07.xls +home/smurphy/EOM FY07/._TRIAL BAL 3Q07.xls +home/smurphy/EOM FY07/._TRIAL BAL 4-07.xls +home/smurphy/EOM FY07/._TRIAL BAL 4Q07-071907.xls +home/smurphy/EOM FY07/._TRIAL BAL 4Q07.xls +home/smurphy/EOM FY07/._TRIAL BAL 5-07.xls +home/smurphy/EOM FY07/._TRIAL BAL 6-07.xls +home/smurphy/EOM FY07/._TRIAL BAL 7-06.xls +home/smurphy/EOM FY07/._TRIAL BAL 8-06.xls +home/smurphy/EOM FY07/._TRIAL BAL 9-06.xls +home/smurphy/EOM FY07/._Transaction comps.xls +home/smurphy/EOM FY07/._margin analysis.xls +home/smurphy/EOM FY07/Equipment-Charge Card.xls +home/smurphy/EOM FY07/Hallway graphs.xls +home/smurphy/EOM FY07/MEMO EOM.doc +home/smurphy/EOM FY08/.DS_Store +home/smurphy/EOM FY08/._.DS_Store +home/smurphy/EOM FY08/._Average Daily Sales-update.xls +home/smurphy/EOM FY08/._COA 1-1-07.xls +home/smurphy/EOM FY08/._Cash Flow.xls +home/smurphy/EOM FY08/._EOQ SHRINK.xls +home/smurphy/EOM FY08/._Equipment-Charge Card.xls +home/smurphy/EOM FY08/._Hallway graphs.xls +home/smurphy/EOM FY08/._LoanInfo Template.XLT +home/smurphy/EOM FY08/._MEMO EOM.doc +home/smurphy/EOM FY08/._NON-CASH REPORT +home/smurphy/EOM FY08/._RESEARCH-amended 4-25-06.xls +home/smurphy/EOM FY08/._Transaction comps.xls +home/smurphy/EOM FY08/Average Daily Sales-update.xls +home/smurphy/EOM FY08/Balance Sheets/.DS_Store +home/smurphy/EOM FY08/Balance Sheets/._.DS_Store +home/smurphy/EOM FY08/Balance Sheets/._Balance Sheet 4Q07.xls +home/smurphy/EOM FY08/Balance Sheets/Balance Sheet 4Q07.xls +home/smurphy/EOM FY08/COA 1-1-07.xls +home/smurphy/EOM FY08/Cash Flow.xls +home/smurphy/EOM FY08/EOM Reports/._07-07 All EOM Rpts.xls +home/smurphy/EOM FY08/EOM Reports/07-07 All EOM Rpts.xls +home/smurphy/EOM FY08/EOQ SHRINK.xls +home/smurphy/EOM FY08/Equipment-Charge Card.xls +home/smurphy/EOM FY08/Hallway graphs.xls +home/smurphy/EOM FY08/Income Stmts/.DS_Store +home/smurphy/EOM FY08/Income Stmts/._.DS_Store +home/smurphy/EOM FY08/Income Stmts/._Inc Stmt 0607.xls +home/smurphy/EOM FY08/Income Stmts/._Income Stmt 4Q07.xls +home/smurphy/EOM FY08/Income Stmts/._Income Stmt-YTD 07.xls +home/smurphy/EOM FY08/Income Stmts/Inc Stmt 0607.xls +home/smurphy/EOM FY08/Income Stmts/Income Stmt 4Q07.xls +home/smurphy/EOM FY08/Income Stmts/Income Stmt-YTD 07.xls +home/smurphy/EOM FY08/Inventory/._INVENT in-out 063007.xls +home/smurphy/EOM FY08/Inventory/INVENT in-out 063007.xls +home/smurphy/EOM FY08/Journal/.DS_Store +home/smurphy/EOM FY08/Journal/._.DS_Store +home/smurphy/EOM FY08/Journal/._Journal 0607.xls +home/smurphy/EOM FY08/Journal/._Journal 0707.xls +home/smurphy/EOM FY08/Journal/Journal 0607.xls +home/smurphy/EOM FY08/Journal/Journal 0707.xls +home/smurphy/EOM FY08/LoanInfo Template.XLT +home/smurphy/EOM FY08/MEMO EOM.doc +home/smurphy/EOM FY08/Margin/.DS_Store +home/smurphy/EOM FY08/Margin/._.DS_Store +home/smurphy/EOM FY08/Margin/._04QFY07Margin-sm.xls +home/smurphy/EOM FY08/Margin/._GROSS MARGIN +home/smurphy/EOM FY08/Margin/._MARGIN-DEPT FY07.xls +home/smurphy/EOM FY08/Margin/._MARGIN-DEPT FY08.xls +home/smurphy/EOM FY08/Margin/._Margin SRPs 0407.xls +home/smurphy/EOM FY08/Margin/04QFY07Margin-sm.xls +home/smurphy/EOM FY08/Margin/Cont to Margin 072507.xls +home/smurphy/EOM FY08/Margin/GROSS MARGIN +home/smurphy/EOM FY08/Margin/MARGIN-DEPT FY07.xls +home/smurphy/EOM FY08/Margin/MARGIN-DEPT FY08.xls +home/smurphy/EOM FY08/Margin/Margin SRPs 0407.xls +home/smurphy/EOM FY08/Margin/Margin Wksht CoCo.xls +home/smurphy/EOM FY08/NON-CASH REPORT +home/smurphy/EOM FY08/RESEARCH-amended 4-25-06.xls +home/smurphy/EOM FY08/Transaction comps.xls +home/smurphy/EOM FY08/Trial Balance/.DS_Store +home/smurphy/EOM FY08/Trial Balance/._.DS_Store +home/smurphy/EOM FY08/Trial Balance/._TRIAL BAL 0607-071907.xls +home/smurphy/EOM FY08/Trial Balance/._TRIAL BAL 4Q07-071907.xls +home/smurphy/EOM FY08/Trial Balance/TRIAL BAL 0607-071907.xls +home/smurphy/EOM FY08/Trial Balance/TRIAL BAL 4Q07-071907.xls +home/smurphy/GAP 2007/.DS_Store +home/smurphy/GAP 2007/._.DS_Store +home/smurphy/GAP 2007/._Depts GAP 07.xls +home/smurphy/GAP 2007/._GAP 07 goals 031307.xls +home/smurphy/GAP 2007/._WFD1Q07HiFi042507.xls +home/smurphy/GAP 2007/._WFD2Q07Gap072107.xls +home/smurphy/GAP 2007/._WFD2Q07HiFi072107.xls +home/smurphy/GAP 2007/._WFDGap07test.xls +home/smurphy/GAP 2007/DELI 07/._.DS_Store +home/smurphy/GAP 2007/DELI 07/._Bread GAP 0107.xls +home/smurphy/GAP 2007/DELI 07/._Bread GAP 0207.xls +home/smurphy/GAP 2007/DELI 07/._Bread GAP test.xls +home/smurphy/GAP 2007/DELI 07/._CHS GAP 0107.xls +home/smurphy/GAP 2007/DELI 07/._CHS GAP 0207.xls +home/smurphy/GAP 2007/DELI 07/._CHS GAP test.xls +home/smurphy/GAP 2007/DELI 07/._PrepFdsGAP 0107.xls +home/smurphy/GAP 2007/DELI 07/._PrepFdsGAP 0207.xls +home/smurphy/GAP 2007/DELI 07/._PrepFdsGAPtest.xls +home/smurphy/GAP 2007/DELI 07/Bread GAP 0207.xls +home/smurphy/GAP 2007/DELI 07/CHS GAP 0207.xls +home/smurphy/GAP 2007/DELI 07/PrepFdsGAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/._.DS_Store +home/smurphy/GAP 2007/MERCH 07/._GenMerch GAP 0107.xls +home/smurphy/GAP 2007/MERCH 07/._GenMerch GAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/._GenMerch GAP test.xls +home/smurphy/GAP 2007/MERCH 07/._GrocBulkGAP 0107.xls +home/smurphy/GAP 2007/MERCH 07/._GrocBulkGAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/._GrocBulkGAPtest.xls +home/smurphy/GAP 2007/MERCH 07/._GrocFZ GAP0107.xls +home/smurphy/GAP 2007/MERCH 07/._GrocFZ GAP0207.xls +home/smurphy/GAP 2007/MERCH 07/._GrocFZ GAPtest.xls +home/smurphy/GAP 2007/MERCH 07/._GrocPkgGap 0107.xls +home/smurphy/GAP 2007/MERCH 07/._GrocPkgGap 0207.xls +home/smurphy/GAP 2007/MERCH 07/._GrocPkgGaptest.xls +home/smurphy/GAP 2007/MERCH 07/._GrocRefGAP0107.xls +home/smurphy/GAP 2007/MERCH 07/._GrocRefGAP0207.xls +home/smurphy/GAP 2007/MERCH 07/._GrocRefGAPtest.xls +home/smurphy/GAP 2007/MERCH 07/._HBC GAP 0107.xls +home/smurphy/GAP 2007/MERCH 07/._HBC GAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/._HBC GAP test.xls +home/smurphy/GAP 2007/MERCH 07/._Meat GAP 0107.xls +home/smurphy/GAP 2007/MERCH 07/._Meat GAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/._Meat GAP test.xls +home/smurphy/GAP 2007/MERCH 07/GenMerch GAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/GrocBulkGAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/GrocFZ GAP0207.xls +home/smurphy/GAP 2007/MERCH 07/GrocPkgGap 0207.xls +home/smurphy/GAP 2007/MERCH 07/GrocRefGAP0207.xls +home/smurphy/GAP 2007/MERCH 07/HBC GAP 0107.xls +home/smurphy/GAP 2007/MERCH 07/HBC GAP 0207.xls +home/smurphy/GAP 2007/MERCH 07/Meat GAP 0207.xls +home/smurphy/GAP 2007/NCGA1Q07BothGraphsCentralCorridorMWChapter060907/._.DS_Store +home/smurphy/GAP 2007/PRODUCE 07/._.DS_Store +home/smurphy/GAP 2007/PRODUCE 07/._Produce GAP 0107.xls +home/smurphy/GAP 2007/PRODUCE 07/._Produce GAP 0207.xls +home/smurphy/GAP 2007/PRODUCE 07/._Produce GAP test.xls +home/smurphy/GAP 2007/PRODUCE 07/Produce GAP 0207.xls +home/smurphy/GAP 2007/WFD2Q07Gap072107.xls +home/smurphy/GAP 2007/WFD2Q07HiFi072107.xls +home/smurphy/HR 2007 /.DS_Store +home/smurphy/HR 2007 /._.DS_Store +home/smurphy/HR 2007 /._5-07Due.doc +home/smurphy/HR 2007 /._FMLAAG5-07.doc +home/smurphy/HR 2007 /._News Trib5-8-07.doc +home/smurphy/HR 2007 /._ONFhandbook.doc +home/smurphy/HR 2007 /._Paid Leave FAQ.doc +home/smurphy/HR 2007 /._Seniority and Pay level-cc.xls +home/smurphy/HR 2007 /._WSGC personnel manual FY2004.doc +home/smurphy/HR 2007 /._pay rates 7-18-07 in#1A084B.xls +home/smurphy/HR 2007 /ADMIN/._.DS_Store +home/smurphy/HR 2007 /ADMIN/._Deli-Mngr 5-5-05.doc +home/smurphy/HR 2007 /ADMIN/._FRONT END MGR 12-05.doc +home/smurphy/HR 2007 /ADMIN/._Fin Mgr 010807.doc +home/smurphy/HR 2007 /ADMIN/._GM job descrip 052107.doc +home/smurphy/HR 2007 /ADMIN/._HR Mgr 7.15 +home/smurphy/HR 2007 /ADMIN/._MERCH MGR 5-05.doc +home/smurphy/HR 2007 /ADMIN/._MMSCjob 010507.doc +home/smurphy/HR 2007 /ADMIN/._Produce Mgr 5-22-05.doc +home/smurphy/HR 2007 /ADMIN/._STORE MANAGER.doc +home/smurphy/HR 2007 /All Staff Mtgs/._.DS_Store +home/smurphy/HR 2007 /All Staff Mtgs/._All Staff Notice.doc +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._.DS_Store +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._NEXT STEPS.doc +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._Prep allstaff 040207.doc +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._Text of Survey.doc +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._all-staff 0407.xls +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._allstaff 0407.ppt +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._sales pay for labor.doc +home/smurphy/HR 2007 /All Staff Mtgs/all-staff 2.0/._summary slide.doc +home/smurphy/HR 2007 /Colter 07/.DS_Store +home/smurphy/HR 2007 /Colter 07/._.DS_Store +home/smurphy/HR 2007 /Colter 07/._2007SurveyInstructionsFixed.doc +home/smurphy/HR 2007 /Colter 07/._Memo to staff 080107.doc +home/smurphy/HR 2007 /Colter 07/._MiniSurveyProposal2007.doc +home/smurphy/HR 2007 /Colter 07/._email 050107.doc +home/smurphy/HR 2007 /Colter 07/._policies for Carolee.doc +home/smurphy/HR 2007 /Colter 07/._staff survey time linecc.doc +home/smurphy/HR 2007 /Colter 07/2007SurveyFinal.pdf +home/smurphy/HR 2007 /Colter 07/2007SurveyInstructionsFixed.doc +home/smurphy/HR 2007 /Colter 07/Memo to staff 080107.doc +home/smurphy/HR 2007 /Colter 07/WFC2007eligiblestaff.xls +home/smurphy/HR 2007 /Colter 07/staff survey time linecc.doc +home/smurphy/HR 2007 /Colter 2006/._.DS_Store +home/smurphy/HR 2007 /Colter 2006/._AppendixA2006.doc +home/smurphy/HR 2007 /Colter 2006/._AppendixB2006.doc +home/smurphy/HR 2007 /Colter 2006/._CaroleeColterInvoice11-26-06.doc +home/smurphy/HR 2007 /Colter 2006/._CaroleeColterInvoice7-30-06.doc +home/smurphy/HR 2007 /Colter 2006/._Colter 2006.doc +home/smurphy/HR 2007 /Colter 2006/._Colter presents.doc +home/smurphy/HR 2007 /Colter 2006/._DeliFindings.doc +home/smurphy/HR 2007 /Colter 2006/._FrontEndFindings.doc +home/smurphy/HR 2007 /Colter 2006/._MerchandisingFindings.doc +home/smurphy/HR 2007 /Colter 2006/._Outline srvy recs.doc +home/smurphy/HR 2007 /Colter 2006/._ProduceFindings.doc +home/smurphy/HR 2007 /Colter 2006/._Survey Memo 2006.doc +home/smurphy/HR 2007 /Colter 2006/._Survey handout.doc +home/smurphy/HR 2007 /Colter 2006/._SurveyReport06.doc +home/smurphy/HR 2007 /DA/._.DS_Store +home/smurphy/HR 2007 /DA/._AR CK 041907.doc +home/smurphy/HR 2007 /DA/._AR JK 070507.doc +home/smurphy/HR 2007 /DA/._AR SS 0707-1.doc +home/smurphy/HR 2007 /DA/._CVV 5-02-07 AR.doc +home/smurphy/HR 2007 /DA/._D Elmer 11-26-06 cashshort.doc +home/smurphy/HR 2007 /DA/._DA BL 606.doc +home/smurphy/HR 2007 /DA/._DA Blohm.doc +home/smurphy/HR 2007 /DA/._DA Hauser.doc +home/smurphy/HR 2007 /DA/._DA Winan.doc +home/smurphy/HR 2007 /DA/._DA-not completing classes.doc +home/smurphy/HR 2007 /DA/._DAED 10-17-06.doc +home/smurphy/HR 2007 /DA/._DAJH 092606.6.doc +home/smurphy/HR 2007 /DA/._DAJH-Board.doc +home/smurphy/HR 2007 /DA/._DAJH.doc +home/smurphy/HR 2007 /DA/._DE DA 113006.doc +home/smurphy/HR 2007 /DA/._EPMissedShift-1.doc +home/smurphy/HR 2007 /DA/._FMLA ML5-23-07.doc +home/smurphy/HR 2007 /DA/._Grievance JH.doc +home/smurphy/HR 2007 /DA/._Grievance TE.doc +home/smurphy/HR 2007 /DA/._LAattendTerm2-07 14-25-54.doc +home/smurphy/HR 2007 /DA/._LC 5-3-07.doc +home/smurphy/HR 2007 /DA/._ML 3-8-07.doc +home/smurphy/HR 2007 /DA/._ML 4-20-07.doc +home/smurphy/HR 2007 /DA/._MLattendTerm6-07.doc +home/smurphy/HR 2007 /DA/._Waive Best Pract1.doc +home/smurphy/HR 2007 /DA/._grievance JW.doc +home/smurphy/HR 2007 /DA/._position elimination.doc +home/smurphy/HR 2007 /DA/._work accommJZ 070607.doc +home/smurphy/HR 2007 /Deli/._ Cook job 040607.doc +home/smurphy/HR 2007 /Deli/._.DS_Store +home/smurphy/HR 2007 /Deli/._Anl Deli Mgr 0707.doc +home/smurphy/HR 2007 /Deli/._COUNTER STAFF EVAL 7-14.doc +home/smurphy/HR 2007 /Deli/._CriteriaDeliMgr12.05.doc +home/smurphy/HR 2007 /Deli/._DELI COOK EVAL 7-14-05.doc +home/smurphy/HR 2007 /Deli/._Deli-Mngr 5-5-05.doc +home/smurphy/HR 2007 /Deli/._Dishwshr Eval Wkst.xls +home/smurphy/HR 2007 /Deli/._EVAL wksht DM.xls +home/smurphy/HR 2007 /Deli/._Eval Sum Deli Mgr.doc +home/smurphy/HR 2007 /Deli/._Perf Deli Mgr 0407.doc +home/smurphy/HR 2007 /Deli/._Prep cook crit 082806.doc +home/smurphy/HR 2007 /Deli/._Prep cook eval wksht.xls +home/smurphy/HR 2007 /Deli/._Sample scoresht Deli.xls +home/smurphy/HR 2007 /Deli/._counter mgr eval 7-14-05.doc +home/smurphy/HR 2007 /Deli/._dishwasher crit 082806.doc +home/smurphy/HR 2007 /Deli/._dishwasher job 082806.doc +home/smurphy/HR 2007 /Deli/._evaluation sum Deli.doc +home/smurphy/HR 2007 /Deli/._kitchen mgr eval 7-14-05.doc +home/smurphy/HR 2007 /Deli/._prep cook job 082806.doc +home/smurphy/HR 2007 /Deli/Anl Deli Mgr 0707.doc +home/smurphy/HR 2007 /Deli/EVAL wksht DM.xls +home/smurphy/HR 2007 /Deli/Eval Sum Deli Mgr.doc +home/smurphy/HR 2007 /Eval info/.DS_Store +home/smurphy/HR 2007 /Eval info/._.DS_Store +home/smurphy/HR 2007 /Eval info/._Criteria Store 2006.doc +home/smurphy/HR 2007 /Eval info/._Eval Sum.doc +home/smurphy/HR 2007 /Eval info/._Eval Wkst 2006.xls +home/smurphy/HR 2007 /Eval info/._MT Eval Comments.xls +home/smurphy/HR 2007 /Eval info/._SCORESHEET-Store 2006.xls +home/smurphy/HR 2007 /Eval info/._Salaries semi-mo.xls +home/smurphy/HR 2007 /Eval info/._Salaries-1.xls +home/smurphy/HR 2007 /Eval info/._Salary Agrmts 2007-1.doc +home/smurphy/HR 2007 /Eval info/._Salary Xina.doc +home/smurphy/HR 2007 /Eval info/._Scoresheets 4-06.xls +home/smurphy/HR 2007 /Eval info/MT Eval Comments.xls +home/smurphy/HR 2007 /Eval info/Salary Agrmts 2007-1.doc +home/smurphy/HR 2007 /FE/._.DS_Store +home/smurphy/HR 2007 /FE/._Annual FE Mgr 1.06.doc +home/smurphy/HR 2007 /FE/._Criteria FE Mgr 12-05.doc +home/smurphy/HR 2007 /FE/._Eval Sum FE.doc +home/smurphy/HR 2007 /FE/._Eval Wkst FE.xls +home/smurphy/HR 2007 /FE/._FE Mgr Annual 0107.doc +home/smurphy/HR 2007 /FE/._FEA criteria 020707sm.doc +home/smurphy/HR 2007 /FE/._FEA job 012207.doc +home/smurphy/HR 2007 /FE/._FRONT END MGR 12-05.doc +home/smurphy/HR 2007 /FE/shift leader FEC/._.DS_Store +home/smurphy/HR 2007 /Finance/.DS_Store +home/smurphy/HR 2007 /Finance/._.DS_Store +home/smurphy/HR 2007 /Finance/._Admin Assist 010507.doc +home/smurphy/HR 2007 /Finance/._Admin Assist eval 01-07.xls +home/smurphy/HR 2007 /Finance/._Criteria Admn Asst 010507.doc +home/smurphy/HR 2007 /Finance/._Criteria FinMgr 062807.doc +home/smurphy/HR 2007 /Finance/._Criteria FinMgr 0807.doc +home/smurphy/HR 2007 /Finance/._Eval Wkst FIN MGR.xls +home/smurphy/HR 2007 /Finance/._Eval Wkst FiM.xls +home/smurphy/HR 2007 /Finance/._Eval Wkst IT.06.xls +home/smurphy/HR 2007 /Finance/._Fin Mgr 010807.doc +home/smurphy/HR 2007 /Finance/._Fin Mgr job 0807.doc +home/smurphy/HR 2007 /Finance/._FinMgr Eval wrkst 0807.xls +home/smurphy/HR 2007 /Finance/._FinMgr scoresht 0807.xls +home/smurphy/HR 2007 /Finance/._Perf Fin Mgr 0507.doc +home/smurphy/HR 2007 /Finance/._Scoresheet Fin Mgr 062807.xls +home/smurphy/HR 2007 /Finance/Criteria FinMgr 0807.doc +home/smurphy/HR 2007 /Finance/Fin Mgr job 0807.doc +home/smurphy/HR 2007 /Finance/FinMgr Eval wrkst 0807.xls +home/smurphy/HR 2007 /Finance/FinMgr scoresht 0807.xls +home/smurphy/HR 2007 /HR Dept/._.DS_Store +home/smurphy/HR 2007 /HR Dept/._Crit HR Mgr.doc +home/smurphy/HR 2007 /HR Dept/._Criteria-Trng Coord 7-06sm.doc +home/smurphy/HR 2007 /HR Dept/._CriteriaHRMgr12.05.doc +home/smurphy/HR 2007 /HR Dept/._Eval Wkst HR.xls +home/smurphy/HR 2007 /HR Dept/._HR Mgr 7.15.05 +home/smurphy/HR 2007 /HR Dept/._HRMgr 0607.doc +home/smurphy/HR 2007 /HR Dept/._HRMgr9.06.doc +home/smurphy/HR 2007 /HR Dept/._Train Coord job 010507.doc +home/smurphy/HR 2007 /HR Dept/._evaluation summary HR.doc +home/smurphy/HR 2007 /IT COORD/.DS_Store +home/smurphy/HR 2007 /IT COORD/._.DS_Store +home/smurphy/HR 2007 /IT COORD/._IT Coord job 0807.doc +home/smurphy/HR 2007 /IT COORD/._IT Coord scoresheet.xls +home/smurphy/HR 2007 /IT COORD/._IT Criteria 0807.doc +home/smurphy/HR 2007 /IT COORD/._IT Proposal 071807.doc +home/smurphy/HR 2007 /IT COORD/._IT eval wrksht.xls +home/smurphy/HR 2007 /IT COORD/IT Coord job 0807.doc +home/smurphy/HR 2007 /IT COORD/IT Coord scoresheet.xls +home/smurphy/HR 2007 /IT COORD/IT Criteria 0807.doc +home/smurphy/HR 2007 /IT COORD/IT Proposal 071807.doc +home/smurphy/HR 2007 /IT COORD/IT eval wrksht.xls +home/smurphy/HR 2007 /M&MS/._.DS_Store +home/smurphy/HR 2007 /M&MS/._Annual M&MS 5-06.doc +home/smurphy/HR 2007 /M&MS/._Criteria M&MS 070807.doc +home/smurphy/HR 2007 /M&MS/._Criteria M&MS 4-06.doc +home/smurphy/HR 2007 /M&MS/._Eval Wkst M&MS.xls +home/smurphy/HR 2007 /M&MS/._M&MS Mgr 4-06.doc +home/smurphy/HR 2007 /M&MS/._M&MS Perf 2-07.doc +home/smurphy/HR 2007 /M&MS/._MMSCjob 010507.doc +home/smurphy/HR 2007 /M&MS/._Perf M&MSM 2-06.doc +home/smurphy/HR 2007 /Merch/._.DS_Store +home/smurphy/HR 2007 /Merch/._Anl MerchMgr 1106.doc +home/smurphy/HR 2007 /Merch/._CriteriaMerchMgr 12-05.doc +home/smurphy/HR 2007 /Merch/._Eval MerchMgr 8-06.doc +home/smurphy/HR 2007 /Merch/._Eval Sum Merch.doc +home/smurphy/HR 2007 /Merch/._Eval Wkst Merch.xls +home/smurphy/HR 2007 /Merch/._JD Buyer 053107.doc +home/smurphy/HR 2007 /Merch/._JD Stocker Merch 0905.doc +home/smurphy/HR 2007 /Merch/._MERCH MGR 5-05.doc +home/smurphy/HR 2007 /Produce/._.DS_Store +home/smurphy/HR 2007 /Produce/._CRITERIA PROD MGR 12-05.doc +home/smurphy/HR 2007 /Produce/._CRITERIA PROD MGR 2-19-06.doc +home/smurphy/HR 2007 /Produce/._Eval Wkst PM.xls +home/smurphy/HR 2007 /Produce/._PROD MGR 051606.doc +home/smurphy/HR 2007 /Produce/._Prod Mgr Annual 0507.doc +home/smurphy/HR 2007 /Produce/._Prod Mgr Perf 0207.doc +home/smurphy/HR 2007 /Produce/._Produce Mgr 5-22-05.doc +home/smurphy/HR 2007 /Store OPS/._.DS_Store +home/smurphy/HR 2007 /Store OPS/._CriteriaStoreMgr 12.05.doc +home/smurphy/HR 2007 /Store OPS/._Eval Sum OPS Mgr.doc +home/smurphy/HR 2007 /Store OPS/._Eval Wkst SM.xls +home/smurphy/HR 2007 /Store OPS/._STORE MANAGER.doc +home/smurphy/HR 2007 /Store OPS/._Store Mgr Annual 07.doc +home/smurphy/HR 2007 /Store OPS/._Store Mgr Annual.doc +home/smurphy/HR 2007 /Store OPS/._Store Mgr Perf 07.doc +home/smurphy/HR 2007 /Store OPS/._evaluation summary SM 07.doc +home/smurphy/HR 2007 /Store OPS/._evaluation summary SM.doc +home/smurphy/HR 2007 /Store OPS/Eval Sum OPS Mgr.doc +home/smurphy/HR 2007 /Store OPS/Eval Wkst SM.xls +home/smurphy/HR 2007 /Store OPS/Store Mgr Annual 07.doc +home/smurphy/HR 2007 /shift leader FEC/._.DS_Store +home/smurphy/HR 2007 /shift leader FEC/._Day in the Life of a SL.doc +home/smurphy/HR 2007 /shift leader FEC/._Expectations of SL.doc +home/smurphy/HR 2007 /shift leader FEC/._SL FEC ROLES.doc +home/smurphy/HR 2007 /shift leader FEC/._SL FEC cross train.doc +home/smurphy/HR 2007 /shift leader FEC/._SL FEC options.xls +home/smurphy/NCGA 2007/.DS_Store +home/smurphy/NCGA 2007/._.DS_Store +home/smurphy/NCGA 2007/._2006 Central Corridor Workgroup Plan Draft 1.doc +home/smurphy/NCGA 2007/._CAT report SWG3.doc +home/smurphy/NCGA 2007/._CCInitialGapAnalysis033106.doc +home/smurphy/NCGA 2007/._Central Store Audit process-1.ppt +home/smurphy/NCGA 2007/._Conference Call instructions.doc +home/smurphy/NCGA 2007/._Getting Unstuck - Expansion.doc +home/smurphy/NCGA 2007/._GrocPkgGap Example.xls +home/smurphy/NCGA 2007/._Market Trends 2005.pdf +home/smurphy/NCGA 2007/._NCGA Planning Process Master 2008.xls +home/smurphy/NCGA 2007/._NPP EC part agreement comments june 06 III.doc +home/smurphy/NCGA 2007/._NPP Process.ppt +home/smurphy/NCGA 2007/._NPP implementation policies Apr 06.doc +home/smurphy/NCGA 2007/._NPP participation agreement June 06.DOC +home/smurphy/NCGA 2007/._PLANTASTICS.doc +home/smurphy/NCGA 2007/._Peer Accountability.pdf +home/smurphy/NCGA 2007/._Picture clipping.pictClipping +home/smurphy/NCGA 2007/._Produce Project Abstract.doc +home/smurphy/NCGA 2007/._Produce Project.ppt +home/smurphy/NCGA 2007/._River Market F07.doc +home/smurphy/NCGA 2007/._SWG 030907.doc +home/smurphy/NCGA 2007/._SWG Chairs ConfCall5-4-06 Notes.doc +home/smurphy/NCGA 2007/._SWG Check-in.doc +home/smurphy/NCGA 2007/._SWG-Cuber.xls +home/smurphy/NCGA 2007/._San Diego swg.doc +home/smurphy/NCGA 2007/._Site comparison.xls +home/smurphy/NCGA 2007/._SoS- Support Our Success Program Development RFP .pdf +home/smurphy/NCGA 2007/._Store Audit Application.doc +home/smurphy/NCGA 2007/._The Dreaded P Word.ppt +home/smurphy/NCGA 2007/._Triangle of Success.ppt +home/smurphy/NCGA 2007/._WGCentralBudget2007.xls +home/smurphy/NCGA 2007/._assistant DD jd final.doc +home/smurphy/NCGA 2007/1006 CAP Store Data/._.DS_Store +home/smurphy/NCGA 2007/Austin Assembly/._.DS_Store +home/smurphy/NCGA 2007/Austin Assembly/._Austin notes sm.doc +home/smurphy/NCGA 2007/Austin Assembly/._Austin notes.doc +home/smurphy/NCGA 2007/Austin Assembly/._Central Corridor NPP Call Notes 9-7-06 PM.doc +home/smurphy/NCGA 2007/City Center/._.DS_Store +home/smurphy/NCGA 2007/City Center/._City Center Audit Call Notes 4-11-07.doc +home/smurphy/NCGA 2007/City Center/._City Center Financials.xls +home/smurphy/NCGA 2007/City Center/._City Center SWOT.doc +home/smurphy/NCGA 2007/City Center/._City Center041707Deli.doc +home/smurphy/NCGA 2007/City Center/._Deli Audit form.xls +home/smurphy/NCGA 2007/City Center/._Deli Expectations.DOC +home/smurphy/NCGA 2007/City Center/._Deli Team Report Notes.doc +home/smurphy/NCGA 2007/City Center/._MOMS_08_22_06ProForma.xls +home/smurphy/NCGA 2007/City Center/._OverviewCityCenterAudit4-17-07.doc +home/smurphy/NCGA 2007/City Center/._SummaryCityCenterAudit5-4-07.doc +home/smurphy/NCGA 2007/City Center/OverviewCityCenterAudit4-17-07.doc +home/smurphy/NCGA 2007/City Center/SummaryCityCenterAudit5-4-07.doc +home/smurphy/NCGA 2007/Eastside Co-op/._.DS_Store +home/smurphy/NCGA 2007/Eastside Co-op/._EFC Operating Plan - Co-op Appeal.doc +home/smurphy/NCGA 2007/Eastside Co-op/._EFC Operating Plan-Sharon.doc +home/smurphy/NCGA 2007/Menomonie/._.DS_Store +home/smurphy/NCGA 2007/Menomonie/._Menomonie.doc +home/smurphy/NCGA 2007/Menomonie/._Menomonoie Store audit.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._.DS_Store +home/smurphy/NCGA 2007/NPP Packet for Members/._JLFNPPCentralFinal.xls +home/smurphy/NCGA 2007/NPP Packet for Members/._NCGA - UNFI Contract Evaluation - 08-29-06FINAL.xls +home/smurphy/NCGA 2007/NPP Packet for Members/._NPP Contract.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._NPP Meeting.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._NPP Transition Update 010907.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._NPP board resolution-1.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._NPP payment terms memo 111006.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._NPP transition update 111006.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._Sample changes report-Price, Disco'd, New items.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._Steering Committee Conf Notes12-20-07.doc +home/smurphy/NCGA 2007/NPP Packet for Members/._UNFI EAST and Midwest margin-markup form.xls +home/smurphy/NCGA 2007/NPP Packet for Members/._Whole Foods Community Coop.xls +home/smurphy/NCGA 2007/NPP Packet for Members/._sample page cost plus price book.doc +home/smurphy/NCGA 2007/NPP Packet for Members/Mid-Qtr Cost+ 2Q07.xls +home/smurphy/NCGA 2007/Phoenix/._.DS_Store +home/smurphy/NCGA 2007/Phoenix/._NCGA Phoenix 0307.doc +home/smurphy/NCGA 2007/Store Audit/.DS_Store +home/smurphy/NCGA 2007/Store Audit/._.DS_Store +home/smurphy/NCGA 2007/Store Audit/._2007RetailAuditWorkbook.xls +home/smurphy/NCGA 2007/Store Audit/._Store Audit Form.doc +home/smurphy/NCGA 2007/Store Audit/2007RetailAuditWorkbook.xls +home/smurphy/NCGA 2007/Store Audit/Deli Audit form.xls +home/smurphy/NCGA 2007/Store Audit/Store Audit Form.doc +home/smurphy/Policies/._.DS_Store +home/smurphy/Policies/._Admin 10.5.06.doc +home/smurphy/Policies/._Alarm System-1.doc +home/smurphy/Policies/._Expansion Issues.doc +home/smurphy/Policies/._IOU Policy-Staff 1-24-06 rev proposal.doc +home/smurphy/Policies/._IOU Staff change proposal.doc +home/smurphy/Policies/._IT Contract 120506.doc +home/smurphy/Policies/._IT MGR reassign.doc +home/smurphy/Policies/._MISSION-ENDS.doc +home/smurphy/Policies/._MISSION-VALUES.doc +home/smurphy/Policies/._MT Agenda.doc +home/smurphy/Policies/._MT Calendar.xls +home/smurphy/Policies/._MT Notes.doc +home/smurphy/Policies/._MT Retreat.doc +home/smurphy/Policies/._Marketing Ideas 2.doc +home/smurphy/Policies/._Mgmt Structure 0807.xls +home/smurphy/Policies/._Outpost notes.doc +home/smurphy/Policies/._PTO brainstorm.doc +home/smurphy/Policies/._Pay Period Conversion Salaried.xls +home/smurphy/Policies/._Quiz Perf eval.doc +home/smurphy/Policies/._Retreat Priorities.doc +home/smurphy/Policies/._SAFE Quiz sm12.05.doc +home/smurphy/Policies/._SAFETY Quiz sm.doc +home/smurphy/Policies/._SPECIAL ORDER PREPAYMENT .doc +home/smurphy/Policies/._STAFF SURVEY-06.doc +home/smurphy/Policies/._STAFF SURVEY.doc +home/smurphy/Policies/._Safety 2004.xls +home/smurphy/Policies/._Safety 2005.xls +home/smurphy/Policies/._Seeds Flowers Transplts.doc +home/smurphy/Policies/._Shopping for customers.doc +home/smurphy/Policies/._Sonja 2 depts sm.doc +home/smurphy/Policies/._Structure proposal 080507.doc +home/smurphy/Policies/._TO MT 071507.doc +home/smurphy/Policies/._Transplant summary form f.doc +home/smurphy/Policies/._Who to call 0807.doc +home/smurphy/Policies/._benefits survey.xls +home/smurphy/Policies/._cash flow 091706.xls +home/smurphy/Policies/._increaserings.doc +home/smurphy/Policies/._labor hrs.xls +home/smurphy/Policies/._longevityproposal.doc +home/smurphy/Policies/._outdoor art letterfinal.doc +home/smurphy/Policies/._prevent harassmt.doc +home/smurphy/Policies/._promo calendar.doc +home/smurphy/Policies/._response4-4.doc +home/smurphy/Policies/MT Agenda.doc +home/smurphy/Policies/MT Notes.doc +home/smurphy/Policies/Mgmt Structure 0807.xls +home/smurphy/Policies/Mgmt Training/._.DS_Store +home/smurphy/Policies/Mgmt Training/._Contract - DDI Interaction Skills.doc +home/smurphy/Policies/Mgmt Training/._Fearless Facilitation.doc +home/smurphy/Policies/Mgmt Training/._Glad I Could Help Whole Foods.doc +home/smurphy/Policies/Mgmt Training/._JH survey response.doc +home/smurphy/Policies/Mgmt Training/._LSC Training eval etc..doc +home/smurphy/Policies/Mgmt Training/._LSC training letter.doc +home/smurphy/Policies/Mgmt Training/._LSC.doc +home/smurphy/Policies/Mgmt Training/._Meeting proposal 060807.doc +home/smurphy/Policies/Mgmt Training/._Mgmt skills survey rev.doc +home/smurphy/Policies/Mgmt Training/._Mgmt survey responses.doc +home/smurphy/Policies/Mgmt Training/._Mgmt training notes.doc +home/smurphy/Policies/Mgmt Training/._Participatant Satisfaction Survey Results 3-28-07.doc +home/smurphy/Policies/Mgmt Training/._Participatant Satisfaction Survey Results 4-11-07.doc +home/smurphy/Policies/Mgmt Training/._Participatant Satisfaction Survey Results 5-23-07.doc +home/smurphy/Policies/Mgmt Training/._SPE_Discussion_Planner.doc +home/smurphy/Policies/Mgmt Training/._Training Proposal 073107.doc +home/smurphy/Policies/Mgmt Training/._Universal_Discussion_Planner.doc +home/smurphy/Policies/Mgmt Training/._scenarios.doc +home/smurphy/Policies/Mgmt Training/Training Proposal 073107.doc +home/smurphy/Policies/PTO brainstorm.doc +home/smurphy/Policies/Produce proposal/._.DS_Store +home/smurphy/Policies/Produce proposal/._New New Assitant Criteria.doc +home/smurphy/Policies/Produce proposal/._Produce Proposal.doc +home/smurphy/Policies/Produce proposal/._Proposal -The words.doc +home/smurphy/Policies/Structure proposal 080507.doc +home/smurphy/Policies/TO MT 071507.doc +home/smurphy/Policies/Who to call 0807.doc +home/smurphy/Policies/breaks/._.DS_Store +home/smurphy/Policies/breaks/._BREAKS CK.doc +home/smurphy/Policies/breaks/._BREAKS CvR.doc +home/smurphy/Policies/breaks/._BREAKS cc.doc +home/smurphy/Policies/breaks/._BREAKS dm.doc +home/smurphy/Policies/breaks/._BREAKS mk.doc +home/smurphy/Policies/breaks/._BREAKS sm.doc +home/smurphy/Policies/breaks/._BREAKS ss.doc +home/smurphy/Policies/breaks/._smoke breaks.doc +home/smurphy/Policies/dress code/._.DS_Store +home/smurphy/Policies/dress code/._Admin dress code.doc +home/smurphy/Policies/dress code/._Dress Code now.doc +home/smurphy/Policies/dress code/._DressCodeLA418.doc +home/smurphy/Policies/dress code/._DressCodeSS&Ck0417.doc +home/smurphy/Policies/dress code/._DressCodedm0417.doc +home/smurphy/Policies/dress code/._dress code & illness.doc +home/smurphy/Policies/dress code/._dress code draft 050707.doc +home/smurphy/Policies/dress code/._dress code draft BJL.doc +home/smurphy/Policies/dress code/._dress code.doc +home/smurphy/Policies/pay-benefit structure/._.DS_Store +home/smurphy/Policies/pay-benefit structure/._031507 proposal.doc +home/smurphy/Policies/pay-benefit structure/._2Q04gainshare.xls +home/smurphy/Policies/pay-benefit structure/._ADMN wages.xls +home/smurphy/Policies/pay-benefit structure/._ADMN wagesCC.xls +home/smurphy/Policies/pay-benefit structure/._BUDGET plan 020807.xls +home/smurphy/Policies/pay-benefit structure/._Bonus Example.xls +home/smurphy/Policies/pay-benefit structure/._Deli Wages.xls +home/smurphy/Policies/pay-benefit structure/._Depts GAP 07.xls +home/smurphy/Policies/pay-benefit structure/._Employee Performance Incentive Plan - River Market Community Co-op.doc +home/smurphy/Policies/pay-benefit structure/._FE wages work.xls +home/smurphy/Policies/pay-benefit structure/._Freeze update.doc +home/smurphy/Policies/pay-benefit structure/._Freeze.doc +home/smurphy/Policies/pay-benefit structure/._GAP 07 goals 031307.xls +home/smurphy/Policies/pay-benefit structure/._GainshareBasics03.doc +home/smurphy/Policies/pay-benefit structure/._GainshareBasics06.doc +home/smurphy/Policies/pay-benefit structure/._Job schuffling proposal.doc +home/smurphy/Policies/pay-benefit structure/._Labor 020807.xls +home/smurphy/Policies/pay-benefit structure/._Labor payout.doc +home/smurphy/Policies/pay-benefit structure/._Labor.doc +home/smurphy/Policies/pay-benefit structure/._MT 050807.xls +home/smurphy/Policies/pay-benefit structure/._Mead-MT.xls +home/smurphy/Policies/pay-benefit structure/._Pay Level redraft.doc +home/smurphy/Policies/pay-benefit structure/._Pay structure opts-051507..doc +home/smurphy/Policies/pay-benefit structure/._Pay structure opts-staff.doc +home/smurphy/Policies/pay-benefit structure/._Profit Sharing.doc +home/smurphy/Policies/pay-benefit structure/._Scenario 032007.xls +home/smurphy/Policies/pay-benefit structure/._Seniority and Pay level-cc.xls +home/smurphy/Policies/pay-benefit structure/._Staff Comment 032007 sm-1.doc +home/smurphy/Policies/pay-benefit structure/._Structure draft 022107.xls +home/smurphy/Policies/pay-benefit structure/._cost of options.xls +home/smurphy/Policies/pay-benefit structure/._equity deduction.doc +home/smurphy/Policies/pay-benefit structure/._labor hrs.xls +home/smurphy/Policies/pay-benefit structure/._labor pie (version 1).xls +home/smurphy/Policies/pay-benefit structure/._margin reports wksht.xls +home/smurphy/Policies/pay-benefit structure/._pay structure options.xls +home/smurphy/Policies/pay-benefit structure/Livable Wage/._.DS_Store +home/smurphy/Policies/pay-benefit structure/Livable Wage/._2006InstructionsforFamilies.doc +home/smurphy/Policies/pay-benefit structure/Livable Wage/._2006LWInstructions.doc +home/smurphy/Policies/pay-benefit structure/Livable Wage/._2006LWSpreadsheet.xls +home/smurphy/Policies/pay-benefit structure/Livable Wage/._LWCaseStudies2006.doc +home/smurphy/Policies/pay-benefit structure/Livable Wage/._LivableWageFAQs.doc +home/smurphy/Policies/safety floor plans/._.DS_Store +home/smurphy/Policies/safety floor plans/._safety lower level.jpg +home/smurphy/Policies/safety floor plans/._safety sales floor.jpg +home/smurphy/Weekly Report 0607/.DS_Store +home/smurphy/Weekly Report 0607/._.DS_Store +home/smurphy/Weekly Report 0607/._Graph Depts 07-3.xls +home/smurphy/Weekly Report 0607/._Graph Depts 07.xls +home/smurphy/Weekly Report 0607/._margin reports wksht.xls +home/smurphy/Weekly Report 0607/._weekly report-SPLH.xls +home/smurphy/Weekly Report 0607/Graph Depts 07-3.xls +home/smurphy/Weekly Report 0607/Graph Depts 07.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._.DS_Store +home/smurphy/Weekly Report 0607/Mead-WFC/._Deli Kitchn sched.doc +home/smurphy/Weekly Report 0607/Mead-WFC/._Deli counter sched.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Deli_Top10.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Duluth Handout.DOC +home/smurphy/Weekly Report 0607/Mead-WFC/._Finance July.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Front End weekly schedules.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Mead_Stone-IT.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Mead_Stone2.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Media Breakdown 7-10 16-06.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Merch Sales Schedule info.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Plan and Actual for Whole Foods Duluth.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Produce July sched.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Sales Data July Produce.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Store OPS sched.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Variable Fixed Worksheet for Whole Foods Duluth.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._Weekly report-Mead.xls +home/smurphy/Weekly Report 0607/Mead-WFC/._mead_report3.xls +home/smurphy/Weekly Report 0607/Mead-WFC/post-Mead/._.DS_Store +home/smurphy/Weekly Report 0607/Mead-WFC/post-Mead/._Duluth Handout.DOC +home/smurphy/Weekly Report 0607/margin reports wksht.xls +home/smurphy/Weekly Report 0607/weekly report-SPLH.xls +home/smurphy/mail/MTM +home/smurphy/mail/mail-trash +home/smurphy/mail/saved-drafts +home/smurphy/mail/saved-messages +home/smurphy/mail/sent-mail +home/smurphy/survey owner & nonowner/.DS_Store +home/smurphy/survey owner & nonowner/._.DS_Store +home/smurphy/survey owner & nonowner/._2007 Owner Survey SRC Comments.doc +home/smurphy/survey owner & nonowner/._2007SrvyInstruct.doc +home/smurphy/survey owner & nonowner/._MT suggests.doc +home/smurphy/survey owner & nonowner/._Marilyn email 050807.doc +home/smurphy/survey owner & nonowner/._Survey 072507.doc +home/smurphy/survey owner & nonowner/._Survey CDS comments.doc +home/smurphy/survey owner & nonowner/._Survey Customers 080107.doc +home/smurphy/survey owner & nonowner/._Survey draft 050107.doc +home/smurphy/survey owner & nonowner/._Survey memo 022607.doc +home/smurphy/survey owner & nonowner/._Surveys-other co-ops.doc +home/smurphy/survey owner & nonowner/._Top 500 FY 07.xls +home/smurphy/survey owner & nonowner/._Top 500 FY06.xls +home/smurphy/survey owner & nonowner/._survey comments.doc +home/smurphy/survey owner & nonowner/._survey2007.xls +home/smurphy/survey owner & nonowner/2007 Owner Survey SRC Comments.doc +home/smurphy/survey owner & nonowner/2007SrvyInstruct.doc +home/smurphy/survey owner & nonowner/MT suggests.doc +home/smurphy/survey owner & nonowner/Marilyn email 050807.doc +home/smurphy/survey owner & nonowner/Survey 072507.doc +home/smurphy/survey owner & nonowner/Survey CDS comments.doc +home/smurphy/survey owner & nonowner/Survey Cstmrs.pdf +home/smurphy/survey owner & nonowner/Survey Customers 080107.doc +home/smurphy/survey owner & nonowner/Survey draft 050107.doc +home/smurphy/survey owner & nonowner/Survey memo 022607.doc +home/smurphy/survey owner & nonowner/SurveyOwners.pdf +home/smurphy/survey owner & nonowner/Surveys-other co-ops.doc +home/smurphy/survey owner & nonowner/Top 500 FY 07.xls +home/smurphy/survey owner & nonowner/Top 500 FY06.xls +home/smurphy/survey owner & nonowner/c923.ppt +home/smurphy/survey owner & nonowner/survey comments.doc +home/smurphy/survey owner & nonowner/survey2007.xls +home/smurphy/to do 07/.DS_Store +home/smurphy/to do 07/._.DS_Store +home/smurphy/to do 07/._2006workmembers.xls +home/smurphy/to do 07/._Buyers wages.xls +home/smurphy/to do 07/._CHANGING STORE MAILBOX.doc +home/smurphy/to do 07/._Construction & maintenance issues.doc +home/smurphy/to do 07/._DirectLines.xls +home/smurphy/to do 07/._FY06 Vendor by zip code.xls +home/smurphy/to do 07/._Green Routes Workshop.doc +home/smurphy/to do 07/._Hours worked.xls +home/smurphy/to do 07/._Insurance.doc +home/smurphy/to do 07/._MCCU Savings.xls +home/smurphy/to do 07/._Match Fund Report-sm.doc +home/smurphy/to do 07/._Mem Loan 070507.doc +home/smurphy/to do 07/._Member Lenders 706cc.doc +home/smurphy/to do 07/._Merch hour breakdown 4Q06.doc +home/smurphy/to do 07/._Orientation eval 0706.doc +home/smurphy/to do 07/._Recall.doc +home/smurphy/to do 07/._SO Calendar.xls +home/smurphy/to do 07/._Skinner Fund Guidelines.xls +home/smurphy/to do 07/._UNFI payment schedule.xls +home/smurphy/to do 07/._Wish List.xls +home/smurphy/to do 07/._bookclub.doc +home/smurphy/to do 07/._brxPrinterPatch104.dmg +home/smurphy/to do 07/._member contact list memo 102405.DOC +home/smurphy/to do 07/._to do.doc +home/smurphy/to do 07/._worker comp audit.xls +home/smurphy/to do 07/._worker comp claim process.doc +home/smurphy/to do 07/Co-op 101/.DS_Store +home/smurphy/to do 07/Co-op 101/._.DS_Store +home/smurphy/to do 07/Co-op 101/._CO-OP 101 NOTES.doc +home/smurphy/to do 07/ERT/._.DS_Store +home/smurphy/to do 07/ERT/._Armored Car.doc +home/smurphy/to do 07/ERT/._ERT Training Outline.doc +home/smurphy/to do 07/ERT/._ERT labels.doc +home/smurphy/to do 07/ERT/._Welcome to ERT.doc +home/smurphy/to do 07/ERT/._Who to call 0207.doc +home/smurphy/to do 07/John/._2008 Nomination Form.doc +home/smurphy/to do 07/John/._Press Release june 07.doc +home/smurphy/to do 07/LEED/._.DS_Store +home/smurphy/to do 07/LEED/._LEED Energy 062406.xls +home/smurphy/to do 07/LEED/._LEED Energy Building.xls +home/smurphy/to do 07/LEED/._LEED Project Whole Foods Co-Op Report_0507.doc +home/smurphy/to do 07/LEED/._LEED Survey Implementation.doc +home/smurphy/to do 07/LEED/._LEED Tour Notes.doc +home/smurphy/to do 07/LEED/._LEED info.doc +home/smurphy/to do 07/LEED/._LEED labels.doc +home/smurphy/to do 07/LEED/._LEED plaques-1.doc +home/smurphy/to do 07/LEED/LEED cert/._.DS_Store +home/smurphy/to do 07/LEED/LEED cert/._3308 Prelim LEED Review V2.pdf +home/smurphy/to do 07/LEED/LEED cert/._Carpool Policy-WFC.doc +home/smurphy/to do 07/LEED/LEED cert/._Carpool-requirements.doc +home/smurphy/to do 07/LEED/LEED cert/._IPM Contract.doc +home/smurphy/to do 07/LEED/LEED cert/._IPM-letter.doc +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/._.DS_Store +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/._S K Training Checklist.doc +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/._cleaning program.doc +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/._keepers daily.xls +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/MSDS/._ Seventh Generation.webarchive +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/MSDS/._.DS_Store +home/smurphy/to do 07/LEED/LEED cert/Green Cleaning/MSDS/._TSUNAMI 100 msds.pdf +home/smurphy/to do 07/LEED/LEED cert/LEED Recycling/._.DS_Store +home/smurphy/to do 07/LEED/LEED cert/LEED Recycling/._recycling downstairs.jpg +home/smurphy/to do 07/LEED/LEED cert/LEED Recycling/._recycling program.doc +home/smurphy/to do 07/LEED/LEED cert/LEED Recycling/._recycling upstairs.jpg +home/smurphy/to do 07/Letterhead/._.DS_Store +home/smurphy/to do 07/Letterhead/._AR overdue.doc +home/smurphy/to do 07/Letterhead/._letterhead b&w 10 05.doc +home/smurphy/to do 07/Letterhead/._letterhead color10 05.doc +home/smurphy/to do 07/Letterhead/letterhead color10 05.doc +home/sonya/.openwebmail/db/sent-mail.cache +home/sonya/.openwebmail/db/sent-mail.dir +home/sonya/.openwebmail/db/sent-mail.pag +home/sonya/.openwebmail/db/sonya.cache +home/sonya/.openwebmail/db/sonya.dir +home/sonya/.openwebmail/db/sonya.pag +home/sonya/.openwebmail/history.log +home/sonya/.openwebmail/pop3/pop3.check +home/sonya/.openwebmail/webmail/filter.check +home/sonya/.openwebmail/webmail/filter.pid +home/sonya/.openwebmail/webmail/trash.check +home/sonya/mail/sent-mail +home/sstewart/.openwebmail/db/mail-trash.pag +home/sstewart/.openwebmail/db/sent-mail.dir +home/sstewart/.openwebmail/db/sent-mail.pag +home/sstewart/.openwebmail/db/sstewart.cache +home/sstewart/.openwebmail/db/sstewart.dir +home/sstewart/.openwebmail/db/sstewart.pag +home/sstewart/.openwebmail/history.log +home/sstewart/.openwebmail/pop3/pop3.check +home/sstewart/.openwebmail/webmail/filter.check +home/sstewart/.openwebmail/webmail/filter.pid +home/sstewart/.openwebmail/webmail/trash.check +home/sstewart/mail/mail-trash +home/sstewart/mail/sent-mail +home/susan/.openwebmail/db/mail-trash.dir +home/susan/.openwebmail/db/mail-trash.pag +home/susan/.openwebmail/db/sent-mail.dir +home/susan/.openwebmail/db/sent-mail.pag +home/susan/.openwebmail/db/susan.cache +home/susan/.openwebmail/db/susan.dir +home/susan/.openwebmail/db/susan.pag +home/susan/.openwebmail/history.log +home/susan/.openwebmail/pop3/pop3.check +home/susan/.openwebmail/webmail/filter.check +home/susan/.openwebmail/webmail/filter.pid +home/susan/.openwebmail/webmail/trash.check +home/susan/mail/mail-trash +home/susan/mail/sent-mail +home/tdaniel/.openwebmail/db/mail-trash.dir +home/tdaniel/.openwebmail/db/mail-trash.pag +home/tdaniel/.openwebmail/db/tdaniel.cache +home/tdaniel/.openwebmail/db/tdaniel.dir +home/tdaniel/.openwebmail/db/tdaniel.pag +home/tdaniel/.openwebmail/history.log +home/tdaniel/.openwebmail/pop3/pop3.check +home/tdaniel/.openwebmail/webmail/filter.check +home/tdaniel/.openwebmail/webmail/filter.pid +home/tdaniel/.openwebmail/webmail/trash.check +home/tdaniel/mail/mail-trash +home/tleutgeb/.openwebmail/db/mail-trash.pag +home/tleutgeb/.openwebmail/db/tleutgeb.cache +home/tleutgeb/.openwebmail/db/tleutgeb.pag +home/tleutgeb/.openwebmail/history.log +home/tleutgeb/.openwebmail/pop3/pop3.check +home/tleutgeb/.openwebmail/webmail/filter.check +home/tleutgeb/.openwebmail/webmail/filter.pid +home/tleutgeb/.openwebmail/webmail/trash.check +home/tleutgeb/mail/mail-trash +home/travis/.openwebmail/db/sent-mail.dir +home/travis/.openwebmail/db/sent-mail.pag +home/travis/.openwebmail/db/travis.cache +home/travis/.openwebmail/db/travis.dir +home/travis/.openwebmail/db/travis.pag +home/travis/.openwebmail/history.log +home/travis/.openwebmail/pop3/pop3.check +home/travis/.openwebmail/webmail/filter.check +home/travis/.openwebmail/webmail/filter.pid +home/travis/.openwebmail/webmail/search.cache +home/travis/.openwebmail/webmail/trash.check +home/travis/mail/sent-mail +home/twhittet/.openwebmail/db/twhittet.cache +home/twhittet/.openwebmail/db/twhittet.dir +home/twhittet/.openwebmail/db/twhittet.pag +home/twhittet/.openwebmail/history.log +home/twhittet/.openwebmail/pop3/pop3.check +home/twhittet/.openwebmail/webmail/filter.check +home/twhittet/.openwebmail/webmail/filter.pid +home/twhittet/.openwebmail/webmail/trash.check +home/vicky/.openwebmail/db/mail-trash.dir +home/vicky/.openwebmail/db/mail-trash.pag +home/vicky/.openwebmail/db/saved-messages.cache +home/vicky/.openwebmail/db/saved-messages.dir +home/vicky/.openwebmail/db/saved-messages.pag +home/vicky/.openwebmail/db/sent-mail.cache +home/vicky/.openwebmail/db/sent-mail.dir +home/vicky/.openwebmail/db/sent-mail.pag +home/vicky/.openwebmail/db/vicky.cache +home/vicky/.openwebmail/db/vicky.pag +home/vicky/.openwebmail/history.log +home/vicky/.openwebmail/pop3/pop3.check +home/vicky/.openwebmail/webmail/filter.check +home/vicky/.openwebmail/webmail/filter.pid +home/vicky/.openwebmail/webmail/trash.check +home/vicky/mail/mail-trash +home/vicky/mail/saved-messages +home/vicky/mail/sent-mail +home/wendy/.openwebmail/db/mail-trash.pag +home/wendy/.openwebmail/db/sent-mail.dir +home/wendy/.openwebmail/db/sent-mail.pag +home/wendy/.openwebmail/db/wendy.cache +home/wendy/.openwebmail/db/wendy.pag +home/wendy/.openwebmail/history.log +home/wendy/.openwebmail/pop3/pop3.check +home/wendy/.openwebmail/webmail/filter.check +home/wendy/.openwebmail/webmail/filter.pid +home/wendy/.openwebmail/webmail/trash.check +home/wendy/mail/mail-trash +home/xina/.openwebmail/db/ +home/wendy/mail/sent-mail +home/xina/.openwebmail/db/mail-trash.pag +home/xina/.openwebmail/db/saved-drafts.dir +home/xina/.openwebmail/db/saved-drafts.pag +home/xina/.openwebmail/db/sent-mail.cache +home/xina/.openwebmail/db/sent-mail.dir +home/xina/.openwebmail/db/sent-mail.pag +mail/ +home/xina/.openwebmail/db/xina.cache +home/xina/.openwebmail/db/xina.dir +home/xina/.openwebmail/db/xina.pag +home/xina/.openwebmail/history.log +home/xina/.openwebmail/openwebmailrc +home/xina/.openwebmail/pop3/pop3.check +home/xina/.openwebmail/webaddr/Converted +home/xina/.openwebmail/webmail/filter.check +home/xina/.openwebmail/webmail/filter.pid +home/xina/.openwebmail/webmail/search.cache +home/xina/.openwebmail/webmail/signature +home/xina/.openwebmail/webmail/trash.check +home/xina/.vacation.msg +home/xina/mail/mail-trash +home/xina/mail/saved-drafts +home/xina/mail/sent-mail +mail/aaron +mail/akemp +mail/alepak +mail/alex +mail/amber +mail/andrea +mail/andy +mail/anni +mail/atse +mail/bjornb +mail/brad +mail/briana +mail/brianne +mail/byoung +mail/carol +mail/charlotte +mail/colleen +mail/cslettedahl +mail/dan +mail/debbie +mail/dolores +mail/dstewart +mail/emily +mail/eric +mail/erik +mail/eriq +mail/heidi +mail/imontgomery +mail/jackie +mail/jahn +mail/jake +mail/jane +mail/jason +mail/jay +mail/jboie +mail/jeanmarie +mail/jenniel +mail/jennifer +mail/jeremy +mail/jeremyb +mail/jesse +mail/jessica +mail/jgilbertson +mail/jhorn +mail/jillh +mail/jillhall +mail/jim +mail/joe +mail/joeu +mail/john +mail/johnf +mail/johnu +mail/jp +mail/julie +mail/justin +mail/kala +mail/kappel +mail/karen +mail/kaugustyn +mail/kevin +mail/klebakken +mail/ktoumi +mail/larry +mail/lisa +mail/lwiesen +mail/lynette +mail/marial +mail/melanie +mail/michael +mail/michaelo +mail/mikec +mail/msowl +mail/mwalsh +mail/nate +mail/nikki +mail/pauline +mail/pmlaker +mail/ppfaff +mail/raelynn +mail/rain +mail/rayann +mail/rianna +mail/sdykema +mail/shannon +mail/smurphy +mail/sonya +mail/sstewart +mail/susan +mail/tdaniel +mail/tleutgeb +mail/travis +mail/twhittet +mail/vicky +mail/wendy +www/cgi-bin/openwebmail/etc/sessions/ +www/htdocs/ +www/htdocs/FE/ +www/htdocs/IT/ +www/htdocs/IT/UNFI/ +www/htdocs/IT/batches/ +www/htdocs/auth/ +www/htdocs/it/ +www/htdocs/it/adjust/ +www/htdocs/it/cards/ +www/htdocs/it/cash_tenders/ +www/htdocs/it/delimenu/ +www/htdocs/it/drive_status/ +www/htdocs/it/inventory_dev/ +www/htdocs/it/likecode_manager/ +www/htdocs/it/moff/ +mail/xina +www/htdocs/it/newbatch/ +www/htdocs/it/npp/ +www/htdocs/it/pcode/ +www/htdocs/it/pricehistory/ +www/htdocs/it/projects/ +www/htdocs/it/recipizer/ +www/htdocs/it/shoppers/ +www/htdocs/it/transactionReport/ +www/htdocs/it/trends/ +www/htdocs/it/tutorials/ +www/htdocs/it/undo/ +www/htdocs/members/ +www/htdocs/members/images/ +www/htdocs/members/statements/ +www/htdocs/produce/ +www/htdocs/queries/ +www/htdocs/queries/hobartcsv/csvfiles/ +www/htdocs/queries/labels/ +www/htdocs/sql/ +www/cgi-bin/openwebmail/etc/addressbooks/global +www/cgi-bin/openwebmail/etc/sessions/alepak*key-session-0.114863641866581 +www/cgi-bin/openwebmail/etc/sessions/andy*key-session-0.429819832396792 +www/cgi-bin/openwebmail/etc/sessions/anni*key-session-0.395919110932486 +www/cgi-bin/openwebmail/etc/sessions/brad*192.168.1.2-session-0.533844362552376 +www/cgi-bin/openwebmail/etc/sessions/carol*key-session-0.442743067703308 +www/cgi-bin/openwebmail/etc/sessions/colleen*key-session-0.832819768766971 +www/cgi-bin/openwebmail/etc/sessions/dan*key-session-0.861551442955719 +www/cgi-bin/openwebmail/etc/sessions/eriq*key-session-0.930948309441195 +www/cgi-bin/openwebmail/etc/sessions/jane*key-session-0.709510136236535 +www/cgi-bin/openwebmail/etc/sessions/jeremy*key-session-0.582983459186838 +www/cgi-bin/openwebmail/etc/sessions/jesse*key-session-0.247001695520343 +www/cgi-bin/openwebmail/etc/sessions/jgilbertson*key-session-0.365230126612918 +www/cgi-bin/openwebmail/etc/sessions/jillh*key-session-0.748291565842045 +www/cgi-bin/openwebmail/etc/sessions/jim*key-session-0.549048957513065 +www/cgi-bin/openwebmail/etc/sessions/joe*key-session-0.519874812201948 +www/cgi-bin/openwebmail/etc/sessions/joeu*key-session-0.218170382156135 +www/cgi-bin/openwebmail/etc/sessions/johnf*key-session-0.324179058036865 +www/cgi-bin/openwebmail/etc/sessions/justin*key-session-0.636630112146126 +www/cgi-bin/openwebmail/etc/sessions/kappel*key-session-0.519432614631118 +www/cgi-bin/openwebmail/etc/sessions/karen*key-session-0.26666572158323 +www/cgi-bin/openwebmail/etc/sessions/kaugustyn*key-session-0.455187546628625 +www/cgi-bin/openwebmail/etc/sessions/klebakken*key-session-0.292863397234218 +www/cgi-bin/openwebmail/etc/sessions/lisa*key-session-0.601260609998466 +www/cgi-bin/openwebmail/etc/sessions/michaelo*key-session-0.192300405659811 +www/cgi-bin/openwebmail/etc/sessions/michaelo*key-session-0.872079607638629 +www/cgi-bin/openwebmail/etc/sessions/mwalsh*key-session-0.800319004411907 +www/cgi-bin/openwebmail/etc/sessions/nate*key-session-0.540663014705391 +www/cgi-bin/openwebmail/etc/sessions/pauline*192.168.1.2-session-0.614426335160719 +www/cgi-bin/openwebmail/etc/sessions/pauline*192.168.1.2-session-0.803572581921802 +www/cgi-bin/openwebmail/etc/sessions/pauline*192.168.1.2-session-0.945647996923984 +www/cgi-bin/openwebmail/etc/sessions/pmlaker*key-session-0.16410539774725 +www/cgi-bin/openwebmail/etc/sessions/raelynn*key-session-0.488914824164571 +www/cgi-bin/openwebmail/etc/sessions/shannon*key-session-0.523005847659991 +www/cgi-bin/openwebmail/etc/sessions/shannon*localhost-session-0.910313659654097 +www/cgi-bin/openwebmail/etc/sessions/vicky*key-session-0.457078330758126 +www/htdocs/EOMreport.php +www/htdocs/EOMreportXL.php +www/htdocs/FE/AddEmpInsertBack.php +www/htdocs/FE/ChooseEmpName.php +www/htdocs/FE/ViewEmp.php +www/htdocs/FE/deleteEmp.php +www/htdocs/FE/deleteqry.php +www/htdocs/FE/employees.inc +www/htdocs/FE/overshort.php +www/htdocs/FE/overshortSingleEmp.php +www/htdocs/IT/UNFI/batchList.php +www/htdocs/IT/UNFI/batches.php +www/htdocs/IT/UNFI/display.php +www/htdocs/IT/UNFI/force.php +www/htdocs/IT/UNFI/forceBatch.php +www/htdocs/IT/UNFI/new.php +www/htdocs/IT/UNFI/newBatchEdit.php +www/htdocs/IT/UNFI/price_compare.php +www/htdocs/IT/UNFI/price_update.php +www/htdocs/IT/addShelfTag.php +www/htdocs/IT/addShelfTag1.php +www/htdocs/IT/batches/addBatch.php +www/htdocs/IT/batches/addItems.php +www/htdocs/IT/batches/batchTest.php +www/htdocs/IT/batches/batches.php +www/htdocs/IT/batches/deleteBatch.php +www/htdocs/IT/batches/display.php +www/htdocs/IT/batches/forceBatch.php +www/htdocs/IT/batches/index.php +www/htdocs/IT/batches/reloadShelfTag.php +www/htdocs/IT/deliScale.php +www/htdocs/IT/index.php +www/htdocs/IT/receiptNew.php +www/htdocs/IT/staffAR.php +www/htdocs/IT/transHistory.php +www/htdocs/accountAdjust.php +www/htdocs/ar_report.php +www/htdocs/auth/groups.php +www/htdocs/auth/login.php +www/htdocs/auth/privileges.php +www/htdocs/auth/utilities.php +www/htdocs/connect.php +www/htdocs/custCount.php +www/htdocs/datediff.php +www/htdocs/functions.php +www/htdocs/it/adjust/additem.php +www/htdocs/it/adjust/index.php +www/htdocs/it/cards/index.php +www/htdocs/it/cash_tenders/genReport.php +www/htdocs/it/dailySalesUPC.php +www/htdocs/it/delimenu/index.php +www/htdocs/it/drive_status/date.log +www/htdocs/it/drive_status/rsync.log +www/htdocs/it/inventory_dev/index.php +www/htdocs/it/likecode_manager/delete.php +www/htdocs/it/likecode_manager/edit.php +www/htdocs/it/likecode_manager/index.php +www/htdocs/it/moff/index.php +www/htdocs/it/newbatch/barcodenew.php +www/htdocs/it/newbatch/batchReport.php +www/htdocs/it/newbatch/forceBatch.php +www/htdocs/it/newbatch/index.php +www/htdocs/it/npp/dept_margin.php +www/htdocs/it/npp/invoice_importer.php +www/htdocs/it/pcode/movement.php +www/htdocs/it/pricehistory/index.php +www/htdocs/it/projects/addnote.php +www/htdocs/it/projects/assign.php +www/htdocs/it/projects/complete.php +www/htdocs/it/projects/delete.php +www/htdocs/it/projects/edit.php +www/htdocs/it/projects/index.php +www/htdocs/it/projects/newproject.php +www/htdocs/it/projects/project.php +www/htdocs/it/projects/reopen.php +www/htdocs/it/projects/report.php +www/htdocs/it/projects/unassign.php +www/htdocs/it/projects/watch.php +www/htdocs/it/recipizer/dbconnect.php +www/htdocs/it/recipizer/index.php +www/htdocs/it/recipizer/ingredients.php +www/htdocs/it/recipizer/loadconversions.php +www/htdocs/it/recipizer/print.php +www/htdocs/it/recipizer/products.php +www/htdocs/it/recipizer/readInventory.php +www/htdocs/it/recipizer/viewer.php +www/htdocs/it/shoppers/index.php +www/htdocs/it/transactionReport/index.php +www/htdocs/it/trends/index.php +www/htdocs/it/trends/trends.php +www/htdocs/it/tutorials/voicemail.html +www/htdocs/it/undo/index.php +www/htdocs/it/undo/index2.php +www/htdocs/members/AR.php +www/htdocs/members/ARStatement.php +www/htdocs/members/AR_90.php +www/htdocs/members/arReport.php +www/htdocs/members/deactivate.php +www/htdocs/members/editNabs.php +www/htdocs/members/editNabs.pl +www/htdocs/members/editNew.php +www/htdocs/members/expiringMems.php +www/htdocs/members/fullMailingList.php +www/htdocs/members/functMem.php +www/htdocs/members/genBus.php +www/htdocs/members/genGaz.php +www/htdocs/members/genNums.php +www/htdocs/members/genStaff.php +www/htdocs/members/headerTest.php +www/htdocs/members/insertEdit.php +www/htdocs/members/limits.php +www/htdocs/members/memARTrans.php +www/htdocs/members/memAddress.php +www/htdocs/members/memBalancesLM.php +www/htdocs/members/memDBHistory.php +www/htdocs/members/memGen.php +www/htdocs/members/memTrans.php +www/htdocs/members/memsCSV.php +www/htdocs/members/memsReport.php +www/htdocs/members/memsReportStaff.php +www/htdocs/members/newMem.php +www/htdocs/members/newmems.php +www/htdocs/members/noteHistory.php +www/htdocs/members/reactivate.php +www/htdocs/members/reprint.php +www/htdocs/members/staffAR.php +www/htdocs/members/staffARmanager.php +www/htdocs/members/staffCurrAR.php +www/htdocs/members/statements/indStatement.php +www/htdocs/members/statements/makeStatement.php +www/htdocs/members/status.php +www/htdocs/members/stockClear.php +www/htdocs/members/stockDetails.php +www/htdocs/members/suspensionHistory.php +www/htdocs/members/testDetails.php +www/htdocs/members/testEdit.php +www/htdocs/members/zerostock.php +www/htdocs/newReport.php +www/htdocs/newReportXL.php +www/htdocs/phpinfo.php +www/htdocs/prodUpdate.php +www/htdocs/produce/produce_history.php +www/htdocs/queries/emailReport.php +www/htdocs/queries/hobartcsv/query.log +www/htdocs/queries/hourlySalesAuth1.php +www/htdocs/queries/labels/barcodenarrow.php +www/htdocs/queries/lisaQuery.php +www/htdocs/queries/productListTest.php +www/htdocs/select_dlog.php +www/htdocs/sql/SQLManager.php +www/htdocs/zipReport.php +home/rain/.openwebmail/db/sent-mail.pag +home/rain/.openwebmail/history.log +home/rayann/.openwebmail/db/mail-trash.pag +home/rayann/.openwebmail/db/sent-mail.pag +home/rayann/.openwebmail/history.log +home/rayann/mail/mail-trash +home/rianna/.openwebmail/db/rianna.pag +home/rianna/.openwebmail/history.log +home/rianna/mail/mail-trash +home/sdykema/.openwebmail/history.log +home/sdykema/mail/mail-trash +home/shannon/.openwebmail/db/saved-messages.cache +home/shannon/.openwebmail/db/shannon.cache +home/shannon/.openwebmail/db/shannon.pag + +sent 10496403 bytes received 573132215 bytes 28485.67 bytes/sec +total size is 64926371055 speedup is 111.25 +rsync error: some files could not be transferred (code 23) at main.c(1158) +receiving file list ... done +rsync: readlink "/mnt/ext3drive/nexus/admin/user_backups/jillh/Desktop/interview.doc" failed: Input/output error (5) +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/jillh/Desktop/jeremyf.doc" +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/jillh/Documents" +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/jillh/.lastrun" +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/joe" +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/lisa" +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/peeps" +file has vanished: "/mnt/ext3drive/nexus/admin/user_backups/wolfgang" +file has vanished: "/mnt/ext3drive/nexus/admin/mnt" +file has vanished: "/mnt/ext3drive/nexus/admin/payroll.bak.sql" +file has vanished: "/mnt/ext3drive/nexus/admin/.bash_profile" +file has vanished: "/mnt/ext3drive/nexus/admin/.bashrc" +file has vanished: "/mnt/ext3drive/nexus/admin/.vimrc" +file has vanished: "/mnt/ext3drive/nexus/data" +file has vanished: "/mnt/ext3drive/nexus/.DS_Store" +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer" failed: Read-only file system (30) +rsync: stat "/mnt/ext3drive/nexus/WebServer" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/CGI-Executables" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/CGI-Executables" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/NetBoot" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/NetBoot" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/WebServer/Documents.OLD/NetBoot/NetBootSP0" -> "/Library/NetBoot/NetBootSP0" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/stream" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/stream" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/events" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/events" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/util" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/util" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/io" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/io" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/validation" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/validation" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/psvi" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/psvi" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xmlcommons" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xmlcommons" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ranges" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ranges" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/traversal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/traversal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/views" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/views" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/ext" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/ext" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/WebServer/Documents.OLD/manual" -> "/Library/Documentation/Services/apache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/weblog" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/weblog" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/weblog/default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/weblog/default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/webmail" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/webmail" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents.OLD/webmail/src" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents.OLD/webmail/src" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.root" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.root" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.safetable" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.safetable" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.runtime" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.runtime" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.runtime/.settings" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.runtime/.settings" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.debug.core" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.debug.core" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.debug.ui" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.debug.ui" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.jdt.core" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.jdt.core" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.jdt.ui" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.jdt.ui" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.ui" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.ui" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.ui.workbench" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.ui.workbench" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/CalendarControl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/CalendarControl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/FE" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/FE" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/HR" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/HR" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/auth/doc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/auth/doc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/admin" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/admin" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/rss" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/rss" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/emp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/emp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/finance" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/finance" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/fpdf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/fpdf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/gif" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/gif" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/goals" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/goals" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/ical" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/ical" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/image_area" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/image_area" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/index_lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/index_lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/SPINS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/SPINS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adjust" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adjust" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/contrib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/contrib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear/Auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear/Auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/backup_status" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/backup_status" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/batches" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/batches" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/CalendarControl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/CalendarControl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/cards" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/cards" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/cash_tenders" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/cash_tenders" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/computers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/computers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/contrib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/contrib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear/Auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear/Auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/delimenu" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/delimenu" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/contrib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/contrib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear/Auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear/Auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/likecode_manager" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/likecode_manager" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/moff" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/moff" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/npp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/npp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/csv" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/csv" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/tmp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/tmp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/pcode" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/pcode" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device/SerialPort" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device/SerialPort" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man1" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man1" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man3" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man3" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/script" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/script" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/picker" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/picker" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/playspace" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/playspace" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/pricehistory" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/pricehistory" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/produce_avg" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/produce_avg" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/projects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/projects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_check" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_check" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_traffic" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_traffic" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/samba" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/samba" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/scala" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/scala" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/shoppers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/shoppers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/transactionReport" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/transactionReport" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/trends" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/trends" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/it/undo" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/it/undo" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members/_notes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members/_notes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members/statements" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members/statements" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members_test" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members_test" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members_test/_notes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members_test/_notes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/npp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/npp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/npp/csv" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/npp/csv" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/npp/db" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/npp/db" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/npp/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/npp/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/npp/tmp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/npp/tmp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/fonts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/fonts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/temp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/temp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpMyAdmin" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpMyAdmin" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/contrib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/contrib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/xsl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/xsl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/produce" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/produce" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/FE" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/FE" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/CalendarControl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/CalendarControl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/CalendarControl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/CalendarControl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/..DS_Store.f6mlsl" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/..DS_Store.Ll4Nif" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.PoweredByMacOSX.gif.pJCh98" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.PoweredByMacOSXLarge.gif.CIHLZ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-bw.gif.prNjQW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-fade.gif.aUbSGQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-line.gif.lZ0qxK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-line2.gif.lO3ZnE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple.gif.iKczey" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Attribute.gif.fcx84r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Back2MetalBtn.gif.5KpIVl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BackMetalBtn.gif.ffBiMf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BackWOBtn.gif.2dbTC9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Background.gif.xRZtt3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BuildQueryWOBoxMenu.gif.65T4jX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BuildQueryWOBoxMenuGrey.gif.D91FaR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonBuildQuery.gif.5Nwh1K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonCancel.gif.vAfTRE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonCustomize.gif.P1avIy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonDelete.gif.dZb7ys" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonEdit.gif.1nxaqm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonHome.gif.uHaehg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonInspect.gif.rRmi89" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonLogin.gif.dHLmZ3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonLogout.gif.rOCTRX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonNew.gif.lBbrKR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonQueryDB.gif.1M4YCL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSave.gif.uoo4xF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSearch.gif.jwpatz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallAdd.gif.EKKgot" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallDelete.gif.e8cnjn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallEdit.gif.3NTteh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallInspect.gif.JoIA9a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallSearch.gif.ogEH44" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallSelect.gif.EFHk2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CancelMetalBtn.gif.pvvYZS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CancelWOBtn.gif.0xACXM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CheckboxOff.gif.GsTgVG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CheckboxOn.gif.DsjVSA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ChooseMetalBan.gif.2zRzQu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ConfirmMetalBan.gif.FdfWOo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CurrentlyMetalBan.gif.7mujNi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CustomizeWOBoxMenu.gif.E13LMc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CustomizeWOBoxMenuGrey.gif.FmSfM6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.D2W-ban.gif.tGRJL0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DTW.gif.m3tVLU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteMetalBtn.gif.b4R7LO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteMetalSmBtn.gif.ZvSMNI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteWOBtn.gif.gRJsPC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteWOSmBtn.gif.SnM8Qw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DownArrow.gif.Fh4OSq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditBan.gif.qfoDXk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditMetalBan.gif.Gsws2e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditMetalBtn.gif.oXVh78" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditMetalSmBtn.gif.rTHPc3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditWOBoxBan.gif.skeoiX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditWOBtn.gif.ih01oR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditWOSmBtn.gif.h0wGvL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Entity.gif.u1flCF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ErrorMetalBan.gif.YhpXJz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.FindMetalBan.gif.e6iARt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.FindWOBoxBan.gif.O2ldZn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.HomeWOBoxMenu.gif.2RmV7h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.HomeWOBoxMenuGrey.gif.BlfEgc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectMetalBan.gif.HhPnp6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectMetalSmBtn.gif.Mjg2A0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectWOSmBtn.gif.kWqHMU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectorSmallButton.gif.xENmYO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LeftArrow.gif.JUn29I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ListMetalBan.gif.gI8KmD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ListWOBoxBan.gif.vBNuzx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LoginMetalBtn.gif.UM3AMr" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csv_temp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csv_temp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csvfiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csvfiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/delitags" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/delitags" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/tmp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/tmp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/tmp/__MACOSX" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/tmp/__MACOSX" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/old" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LoginWOBtn.gif.YPqi3l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LogoutWOBoxMenu.gif.346Zjg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LogoutWOBoxMenuGrey.gif.Ts2HAa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.MetalBtn.gif.FT2pR4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.MoreMetalSmBtn.gif.aqm87Y" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/old_stuff" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/old_stuff" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/queries/test" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/queries/test" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/reports" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/reports" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/WebServer/Documents/weekly" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/WebServer/Documents/weekly" failed: No such file or directory (2) +admin/ +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.MoreWOSmBtn.gif.uKQzqT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewMetalBtn.gif.Xe91IN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewRecordBlackMenu.gif.TDDu1H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewRecordWOBoxMenu.gif.pZlXjC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewRecordWOBoxMenuGrey.gif.jYxLGw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewWOBoxMenu.gif.mejB3q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewWOBoxMenuGrey.gif.5fnrql" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NoMetalBtn.gif.yeyhNf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.OKMetalBtn.gif.ye3799" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Plus.gif.Bj31w4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryDBMetalBtn.gif.0xkWTY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryDBWOBtn.gif.7WMQgT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryMetalBan.gif.tRf7EN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryMetalBtn.gif.xrNo3H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryWOBoxBan.gif.Q5BGrC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Relationship.gif.mMt2Pw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.RemoveMetalSmBtn.gif.poi5hr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.RemoveWOSmBtn.gif.eb78Jl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ReturnButton.gif.TK8ccg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ReturnMetalBtn.gif.WXflEa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ReturnWOBtn.gif.yVbu64" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.RightArrow.gif.GckDyZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SaveMetalBtn.gif.MA8R2T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SaveWOBtn.gif.o787wO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchDBMetalBtn.gif.eEto1I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchDBWOBtn.gif.lsyFvD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchMetalBan.gif.DViXZx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchWOBoxBan.gif.zcFfus" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash" failed: Read-only file system (30) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/MacOS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/MacOS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/.ssh" failed: Read-only file system (30) +rsync: stat "/mnt/ext3drive/nexus/admin/.ssh" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop" failed: Read-only file system (30) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/CGI-Executables" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/CGI-Executables" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/NetBoot" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/NetBoot" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/NetBoot/NetBootSP0" -> "/Library/NetBoot/NetBootSP0" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchWOBoxMenu.gif.HnYL6m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchWOBoxMenuGrey.gif.sq8iJh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SelectMetalSmBtn.gif.qGvQlc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SmallPBWO.gif.3v4nY6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.UpArrow.gif.NNXZA1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ViewMetalSmBtn.gif.QMtCdW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ViewWOSmBtn.gif.2PafQQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.WhiteAppleWOBox.gif.MF6RsL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.YesMetalBtn.gif.qxp89F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.add-sm-btn.gif.juKpRA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.back-btn.gif.v7aHyv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.bino-btn.gif.LZVYfq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.bldqry-btn.gif.yUMgXk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.bldqry-grey-btn.gif.CszCEf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.cancel-btn.gif.ARmZla" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.cancel.gif.Qqsm34" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.choose-ban.gif.8TMmMZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.confirm-ban.gif.Jr7nvU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.currently-ban.gif.QYydjP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.custmz-btn.gif.qsb46J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.custmz-grey-btn.gif.PsRYUE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.del-sm-btn.gif.tQsUIz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.delete-btn.gif.LH9Pwu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.edit-ban.gif.PebMkp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.edit-btn.gif.VGHhbk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.edit-sm-btn.gif.lZqO1e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.error-ban.gif.ZLmlS9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.exclamation.gif.fTQVI4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.eye.gif.JXLwzZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.find-ban.gif.GdT7pU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.find-btn.gif.PWarjP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.fuzzyGreyStripe.gif.kDsLcK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.grayWebObjects.gif.Ky355E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.greyStripe-noline.gif.WGUuZz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.greyStripe.gif.rAhUSu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.home-btn.gif.5eXjMp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.home-grey-btn.gif.rekKFk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.inspect-sm-btn.gif.4Z9fBf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.inspectMagGlass.gif.LKHMwa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.lft-OSarw.gif.9utjs5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.list-ban.gif.VLlQn0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.login-ban.gif.5SunjV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.login-btn.gif.VE9WeQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.logout-btn.gif.ps4JdL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.logout-grey-btn.gif.9P6xcG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.magglass-btn.gif.zrsmbB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.more-sm-btn.gif.6hUaaw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.new-btn.gif.4dA38q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.new-grey-btn.gif.JmSW7l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.new-lt-btn.gif.S5lQ6g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.newrec-btn.gif.OL1J5b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.newrec-grey-btn.gif.74r796" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.no-btn.gif.tDJve2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.no.gif.h89TiX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ok-btn.gif.fRBmnS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ok.gif.IWQPrN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.powrdbyWO-ban.gif.39ojwI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.qry-ban.gif.8qWJDD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.qrydb-btn.gif.MuGbLy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.remv-sm-btn.gif.TkJHSt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.return-btn.gif.FTje0o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.rt-OSarw.gif.vxdL7j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.rt-arw.gif.1Ldiff" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.save-btn.gif.tBlPma" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-ban.gif.Q4Mmu5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-btn.gif.hNd3F0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-grey-btn.gif.wGNKRV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-lt-btn.gif.pcys3Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.searchdb-btn.gif.05vefM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.select-sm-btn.gif.ZU60qH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.trashcan-btn.gif.juVNCC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.view-ban.gif.rTPAOx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.view-sm-btn.gif.dwNK2s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.write-btn.gif.WAFVgo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.yes-btn.gif.JcK6uj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.yes.gif.H40hJe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAdd-windows.gif.19vtX9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAdd.gif.9Vg0e5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAppend-windows.gif.2v7xw0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAppend.gif.lWI6NV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconCancel-windows.gif.4bDF5Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconCancel.gif.ZboinM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconClear-windows.gif.FqEVEH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconClear.gif.PQdzWC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDelete-windows.gif.fwYcey" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDelete.gif.8K5wyt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDeselect-windows.gif.VnfSSo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDeselect.gif.H5Eddk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconFind-windows.gif.xthzxf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconFind.gif.PLTYRa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconInspect-windows.gif.wlWoc6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconInspect.gif.KW5Ow1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconNew-windows.gif.RqrfRW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconNew.gif.hqz6eS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOk-windows.gif.53NYCN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOk.gif.OEfR0I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOpen-windows.gif.PFTJoE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOpen.gif.8cNGMz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRemove-windows.gif.d9qEav" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRemove.gif.RBJCyq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRevert-windows.gif.vScBWl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRevert.gif.DOVDmh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSave-windows.gif.DMFHMc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSave.gif.BVALc8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSelect-windows.gif.aoWPC3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSelect.gif.XEHU2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/English.lproj/.Localizable.strings.HqMZsU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/German.lproj/.Localizable.strings.v0qqTP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/.JavaEOApplication.jar.5ekvnL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.BeansAppletContext.class.os733G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.BeansAppletStub.class.HmODKC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.BeansCallback.class.RQlOty" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$1.class.GFUZcu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$ActiveWindowDependentAction.class.owEbWp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$Enabling.class.WBWnFl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_ActionEventSource.class.bFsAoh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_Application.class.6HbN7c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_ControllerHierarchy.class.coPFR8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_FocusComponent.class.Db1DB4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_Object.class.4bMvm0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_Supercontrollers.class.XfFo7V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_WindowObserver.class.eXVlSR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction.class.VvOJDN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionButtonsController.class.8DYJpJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionMenuController.class.4spqcF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionTrigger.class.cS7aZA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgetController.class.sNAfMw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets$_ActionMenuComboBoxModel.class.zWI9zs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets$_Button.class.IDZ8no" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets$_MenuItem.class.gCLMck" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets.class.kOVr1f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$1.class.LCsQRb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$2.class.jzPfI7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$3.class.LSoFy3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$ApplicationSupport.class.Stm5oZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_ControllerInitializationData.class.SR06hV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_MenuItem.class.3KG9aR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_QuitHandler.class.91Dc4M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_RecentDocumentsMenuHandler.class.qv8fXI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication.class.SmWjQE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOArchive$_ObjectInstantiationDelegate.class.r7RlKA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOArchive.class.tzOoEw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOArchiveController.class.LSuMys" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAssociationConnector.class.WSseuo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOBeanSupport.class.tKkHpk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOBoxController$_TitledBorder.class.CrJelg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOBoxController.class.TgA4gc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$ActionCollector.class.hSQkf8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$Activation.class.toaCd4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$EndEditing.class.MjSTb0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$Modal.class.bbNbaW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$ResetUserInterface.class.OZUt8R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController.class.IV2M6N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_Abstract.class.DBZY5J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_ControllerAndSubcontrollers.class.LwLb5F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_ControllerAndSupercontrollers.class.HteC6B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_OnlySubcontrollers.class.Fa237x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_OnlySupercontrollers.class.sCZv9t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration.class.2QsYaq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$_DisposeCallback.class.rDkrcm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController.class.9DqUdi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODataSourceFactory.class.qJdOge" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODefaults.class.P0JMja" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogController.class.NT2Kn6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_InputData.class.UMTNr2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_StringInputHandler$_DocumentListener.class.jg1QvY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_StringInputHandler$_OperationListener.class.TayPAU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_StringInputHandler.class.TN4OFQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs.class.0eb0LM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODisplayUtilities$_FocusComponentActivation.class.sf0cSI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODisplayUtilities.class.5ZmqYE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODocument.class.ZMwB5A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODocumentController.class.Q8GNcx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOEditable.class.DqJHkt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOEntityController.class.i1GCsp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOFrameController.class.NqWlBl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOInspectorController$_InspectorWindowManager.class.5Ft6Jh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOInspectorController.class.xSteTd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOInterfaceController.class.naxp39" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOMenuSwitchController$_SwitchComboBoxModel.class.JdlCd6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOMenuSwitchController.class.BsoPn2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOModalDialogController$ModalActions.class.tBBFyY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOModalDialogController.class.x7wwJU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOObjectDisplay.class.Tq9LVQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOObjectDisplayDocument.class.0dO27M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOProgrammaticSwitchController.class.N1rkkJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSimpleWindowController.class.Ir0CwF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSplitController$_SplitPane.class.oJzDJB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSplitController.class.lj6ZWx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSwitchController.class.u8KJau" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOTabSwitchController$_TabbedPane.class.QBEkpq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOTabSwitchController.class.WoGWDm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOURLClassLoader.class.YLpAUi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_ConcreteIconSet.class.VFKibf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_ConcreteTitleSet.class.VNB1rb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_DarkImageFilter.class.8aMKI7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_IconHandler.class.Dz8tZ3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_IconSet.class.4FGqi0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_LightImageFilter.class.qCooBW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_TitleSet.class.qWnmUS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_TransparentIconFilter.class.xSMkdP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters.class.BlyjwL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowController$_Toobar.class.mRVWPH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowController.class.bz5Z9D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver$1.class.xVzvvA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver$_ActivateWindowRunnable.class.TZk2Qw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver$_MenuItem.class.hKBzct" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver.class.Xz96xp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOXMLUnarchiver$_SpecialInstance.class.MsjnUl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOXMLUnarchiver.class.sunEgi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOControllerNotifications.class.L9SxDe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EODebugUtilities.class.YIDs0a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOFoundationUtilities.class.BZt5n7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOInvocationUtilities.class.ttEJL3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOMRJUtilities$1.class.XFNLa0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOMRJUtilities$_MRJCode.class.1POSzW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOMRJUtilities.class.IYs0YS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$1.class.0Is8nP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$Callback.class.dPU6OL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$CallbackAdaptor.class.zna7fI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$_TimerThread.class.Iez7GE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer.class.5bj87A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOValueConversion.class.UwR9yx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOWidgetUtilities$_Box.class.QjAg1t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOWidgetUtilities.class.oFjotq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOApplet.class.Kes7Vm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOAppletController.class.mXfTpj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientApplicationSupport$_DataSourceFactory.class.WN8FTf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientApplicationSupport.class.znQtnc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientResourceBundle$_Enumeration.class.f9Q0R8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientResourceBundle.class.p74ym5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EORemoteStorageDefaults.class.kJoGS1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EOApplicationURLDialog$1.class.rhMOoY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EOApplicationURLDialog$2.class.XnFXUU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EOApplicationURLDialog.class.zrK6qR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EORemoteRequestUtilities.class.oQlYXN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.MenuIconEdited.gif.dOPQuK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.MenuIconEditedHighlight.gif.svQy4G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.PoweredByWebObjects.gif.ZyVhED" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/.JavaEODistribution.jar.3Md1dA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EOAttribute.class.iqwUPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedArrayFaultHandler.class.GBRrst" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedClassDescription.class.YLK04p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedDataSource.class.49bWHm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedFaultHandler.class.ItKymj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedObjectStore$1.class.JdDc1f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedObjectStore$_ClientDatabaseRecord.class.4hVQFc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedObjectStore.class.R5nvk9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionChannel$Delegate.class.Vn89Z5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionChannel$_DefaultExceptionHandler.class.rOMPF2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionChannel.class.re2vmZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionDeferredFaultHandler.class.apUd3V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EOHTTPChannel.class.laOWJS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EORelationship.class.eAxgtP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/._EOCheapCopyHandler.class.65JudM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOCompleteProxy.class.rBcKXI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Awake$Callback.class.OfFvKF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Awake.class.fO9hxC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$ObjectStore.class.YTP4jz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Replace$Callback.class.2YJR6v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Replace.class.zbkITs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks.class.iXwzGp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EONotificationCarrier.class.kYUqtm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EONotificationRequest.class.dZmqhj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceProxy.class.4d9t5f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoder$Delegate.class.k5ByTc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoder$_Decoder.class.KhDhI9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoder.class.tZK1w6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoding$Support.class.lAp5m3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoding$_EOKeyGlobalIDSupport.class.eCqad0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoding.class.LCYf3W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOSavingProxy.class.ngJlTT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOServerEOInvocation.class.DtxaKQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOServerInvocation.class.mKk0AN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOServerReturnValue.class.YEpowK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/English.lproj/.Localizable.strings.8p4NrH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/German.lproj/.Localizable.strings.DnUdnE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/.JavaEOGeneration.jar.vYaEiB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOActionController$_Action.class.LvN2ky" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOActionController.class.1ROsnv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOAssociationController.class.Tc4cqs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOCheckBoxController.class.YK80tp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOComboBoxController.class.wywTxm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$1.class.M87DDj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$10.class.W2ApJg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$2.class.mihfPd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$3.class.7r75Ua" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$4.class.B37W07" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$5.class.IBcT84" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$6.class.69mQg2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$7.class.f7HNoZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$8.class.7i5OwW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$9.class.ptZQET" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$ControllerTaskAdaptor.class.pV3SMQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$ControllerTaskCallback.class.bCjCXN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Delegate.class.PvAm8K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Insert.class.QYa7iI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$List.class.OTgVtF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Open.class.haEJEC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Query.class.iyeyPz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Select.class.VR0m0w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$SelectByInserting.class.dX1bbu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$_SpecificationData.class.OBmEnr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$_XMLProvider.class.TMU8zo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory.class.XAPDMl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODefaultActionTrigger.class.NaLMZi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODetailSelectionController.class.kacOdg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODisplayStatisticsController$_DisplayGroupObserver.class.KIuRrd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODisplayStatisticsController.class.Tk5UFa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODynamicApplication$1.class.mAzHU7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODynamicApplication.class.BJwv94" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEditingController.class.RHA1o2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_ActivateHelpWindow.class.y94yFZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_ActivateToolWindow.class.fPs7VW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_ActivateWindow.class.zFFidU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Entity.class.rWzyuR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Insert.class.RJvPMO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_List.class.SNv74L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Open.class.rgRtnJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Query.class.pn9QGG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction.class.jdzf0D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnumerationController.class.LrYHjB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOFormController.class.52ftDy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOFormatValueController.class.MIhWXv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOImageViewController.class.L42tit" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOListController.class.brXkDq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOMultipleValuesEnumerationController.class.Z55GYn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOOneValueEnumerationController.class.hQZ1kl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOQueryController.class.keyIHi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOQueryObjectDisplay.class.urvN4f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOQuickTimeViewController.class.685xsd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EORangeTextFieldController.class.ckrmQa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EORangeValueController.class.FU5ve8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EORangeWidgetController.class.kkN2C5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOStaticIconController.class.yeyC22" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOStaticLabelController.class.cQmds0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOStaticTextFieldController.class.4cHSRX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTableColumnController.class.IgF8jV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTableController.class.LVDuMS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTextAreaController.class.BMnYfQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTextFieldController.class.NAwtJN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTitlesController.class.If8IdL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTreeController$_SelectionUtilities.class.eZrkII" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTreeController.class.hg3hdG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOValueAndURLController.class.CKiEID" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOValueController.class.UbUngB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$DefaultAction$CommonWidgetHandler.class.FAF8Ny" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$DefaultAction.class.9s5Tlw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$FormatWidget.class.6EHFTt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$QueryWidget.class.5Xurrr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$TableWidget.class.ciJdZo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController.class.Mqa0wm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/._EOExtendedValueConversion.class.5vrw5j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/._EOKeyPathUtility.class.nsc4Dh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client/._EODistributionKeyPathUtility.class.d6L2cf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client/._EORemoteXMLProvider.class.ElMmPc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/.JavaEOInterface.jar.aBTHra" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionAssociation.class.4tgV67" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionInsertionAssociation.class.gMydM5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionWidgetAssociation$ActionPlugin.class.dtewr3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionWidgetAssociation.class.Upe970" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOAssociation$_AspectBinding.class.AfmNOY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOAssociation.class.h7fsvW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EODetailSelectionAssociation.class.TrgOdU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EODisplayGroup$Delegate.class.XmqbWR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EODisplayGroup.class.s2kzEP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterAssociation.class.2kVfoN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterCopyAssociation.class.3kpX7K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterDetailAssociation.class.DTYIRI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterPeerAssociation.class.u6ldDG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOPickTextAssociation.class.dtKIoE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableAssociation$TablePlugin.class.BqIfaC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableAssociation.class.yjYMVz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableColumnAssociation$TableColumnPlugin.class.XDI3Hx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableColumnAssociation.class.SNvluv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTextAssociation$TextPlugin.class.eSlXgt" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/install" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/install" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/ws" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/ws" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTextAssociation.class.K6213q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTreeAssociation$TreePlugin.class.CrrNTo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTreeAssociation.class.F0EzJm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueAssociation$ValuePlugin.class.VKwXzk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueAssociation.class.U2Smqi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueSelectionAssociation$ValueSelectionPlugin.class.gsXthg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueSelectionAssociation.class.NzjC8d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetAssociation$WidgetPlugin$Formatting.class.qPl91b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetAssociation$WidgetPlugin.class.vzKKV9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetAssociation.class.6iRmP7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetPluginRegistry$WidgetSetPlugin.class.EIhZJ5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetPluginRegistry$_RegistryInfo.class.B3bDE3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetPluginRegistry.class.97mhz1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/.JavaEOInterfaceSwing.jar.zVSrvZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOColumnEditor.class.8k5HuX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOControlActionAdapter.class.C882tV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOForm.class.25RKuT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOFormCell.class.ljItvR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOFrame.class.u7pgwP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOImageView.class.RHJ3wN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOMatrix.class.tAzuyL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOQuickTimeView.class.2TqXzJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingButtonPlugin.class.4RX5CH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingCheckBoxPlugin.class.PutfGF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingComboBoxPlugin$_ComboBoxModel.class.XtAsJD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingComboBoxPlugin.class.MXVGNB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingImageViewPlugin.class.Egw0Rz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingQuickTimeViewPlugin.class.HgNkWx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingSetPlugin.class.4aHU1v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin$1.class.NOPz7t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin$TableColumnCustomizer.class.k5zfds" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin$_DefaultTableColumnCustomizer.class.jCwViq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin.class.RFaToo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTablePlugin$_TableModel.class.PbvAvm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTablePlugin.class.z67iCk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTextPlugin.class.Q3rmJi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTreePlugin$_TreeCellRenderer.class.GOWbTg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTreePlugin$_TreeNode.class.tRl32e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTreePlugin.class.27eVcd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingUtilities$1.class.AMRHob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingUtilities$_EventHandler.class.IyrvA9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingUtilities.class.dXenM7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTable$_EOTableColumn.class.fXy3Y5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTable.class.fiQKb4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextArea.class.OjWlp2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextColumnEditor.class.52eYC0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextComponentAccess.class.rfNEQY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextField.class.Rp478W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOView.class.hDkCrV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOViewLayout$1.class.0ab7JT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOViewLayout$_EOViewLayoutData.class.GYdC2R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOViewLayout.class.Y9X7kQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/._EODefaultBorder.class.F8J0DO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowDown.gif.Gigi6M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowLeft.gif.GbJAyL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowRight.gif.zZ4T0J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowUp.gif.CrEdtI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.Default.gif.aEFxVG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/.JavaEORuleSystem.jar.ANTRnF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant$1.class.4MR6RD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant$Editor.class.TILmmC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant$_RuleProvider.class.6vYCSA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant.class.tqeUoz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistantAction.class.FqUyVx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistantRule.class.hMHwsw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOEntitiesEditor.class.jbfRZu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOMiscellaneousEditor.class.QFByxt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOPropertiesEditor.class.DZXC5r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOUserInterfaceParametersEditor.class.llP3Dq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWidgetParametersEditor$1.class.FIhRcp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWidgetParametersEditor$ValueCustomizer.class.81qvMn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWidgetParametersEditor.class.6fqamm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWindowParametersEditor$1.class.FDobWk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWindowParametersEditor$ValueCustomizer.class.aHmmzj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWindowParametersEditor.class.WFeyci" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOXMLEditor$1.class.PIxrRg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOXMLEditor$_DisplayObject.class.ShFlwf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOXMLEditor.class.E2IAbe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorExplanation.class.YwNVRc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorSelectionValueCustomizer$_Model.class.KdUhyb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorSelectionValueCustomizer.class.wODEea" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringAddition$AdditionListener.class.kU6IV8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringAddition.class.WfpOC7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringList$ChangeListener.class.lnUYk6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringList$_Object.class.itra34" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringList.class.5UtmL3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringSelector$ChangeListener.class.IFCju2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringSelector$_Model.class.KmChd1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringSelector.class.jhExWZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringValueCustomizer.class.EbxaGY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorValueCustomizer$DefaultValue.class.f2oxqX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorValueCustomizer.class.MIlVaW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EORemoteRuleProvider.class.BzeFVU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Ascending.gif.lp1oKT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BackClick.gif.TMz9yS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BarLeftEnd.gif.VkmUnR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BarMiddle.gif.6ZmFcQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BarRightEnd.gif.8Qvq1O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Descending.gif.yZLbQN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.DownTriangle.gif.dB9WEM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.ForwardClick.gif.YwJItL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.PoweredByWebObjects.gif.f8yuiK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.RightTriangle.gif.vuqlcJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Spacer.gif.U51c6H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.TransparentPixel.gif.frR4ZG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Unsorted.gif.jIOWTF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.appOff.gif.tO1ONE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.appOn.gif.DLkHHD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.back.gif.qtfABC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.dir.gif.FBntvB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.exclamation.gif.LUPmpA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.eye.gif.Ejwgjz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.leftTab.gif.pxqady" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.lft-OSarw.gif.HDt46w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.rightTab.gif.xdEY0v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.rt-OSarw.gif.K8VSUu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.scrollDown.gif.ABedSt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.text.gif.6zGyPs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.woapp.gif.5zlUMr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.woappsrv.gif.1fogKq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/.JavaDirectToWeb.jar.UrJCHp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/.JavaEOControl.jar.iQBwJo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/.JavaFoundation.jar.1kzTWn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/.JavaWOJSPServlet_client.jar.QnFTon" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ActionsConfigurationPanel.class.LaMrRm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$1.class.s5iNmm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$2.class.ceF9Rl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$3.class.a0bwnl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$4.class.x1WSSk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel.class.JE2Aok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantApplet$1.class.jM1pVj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantApplet$2.class.MZXgsj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantApplet.class.Jd57Yi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantClient$PacketDecoder.class.WO9Wwi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantClient.class.hmvN4h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantFrame.class.ptCiDh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.AssistantPageApplet.class.fHfPbh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.BkgColorComponentConfigurationPanel.class.uyaHKg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.CheckboxComponentConfigurationPanel.class.Ongbkg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ChoiceComponentConfigurationPanel.class.4P8FTf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ClientArchivingDelegate.class.lkBCuf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ClientInterface.class.fp9z5e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ColorComponentConfigurationPanel.class.T3TxGe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ColorWell.class.pFddie" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ComponentConfigurationContainer.class.vXzTTd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ComponentConfigurationPanel.class.DpPpwd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ComponentInspectorPanel.class.orRW8c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ComponentPickerDialog.class.GZccMc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.CompositeComponentConfigurationPanel.class.owmspc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.CustomKeyPathDialog.class.MgFN3b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.D2WAssociation.class.OYM9Hb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.D2WAssociationDestination.class.6c6vmb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DataTypesPanel.class.OOJt1a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DisplayKeyComponentConfigurationPanel.class.S5LsGa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$1.class.KMnfna" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$2.class.jKK239" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$3.class.YskQK9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$4.class.RT7Dr9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$5.class.cgNw98" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$6.class.vPyqR8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel.class.3oxkz8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.EditActionDialog.class.dnr3h8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.EntitiesPanel.class.K89M07" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.FramesActivePanel.class.3AEfK7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.FreezeDialog.class.3q4It7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.InspectorWindow.class.OumNd7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.LhsPanel.class.90wAZ6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ManipulationInterface.class.9q8oL6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.NewDynamicPageDialog.class.k37Cy6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.NoComponentConfiguration.class.PqPRl6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.NothingToInspectPanel.class.r2O685" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageConfigurationPanel.class.xMj4W5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageManipulationPanel.class.EsB2K5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageRhsPanel.class.KzS5z5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionPanel.class.QpU9o5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel$1.class.QT5de5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel$2.class.0Vbn44" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel$_MinimumSizeChoice.class.VhpxU4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel.class.AxOHK4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$1.class.3PLdB4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$2.class.ZPp1u4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$3.class.FtWPo4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$InspectionCallback.class.lmDEi4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel.class.cuOOc4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertyDataSource.class.OJ8l73" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertyInspectorPanel.class.0dRf23" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.PropertyManipulationPanel.class.VUZvX3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.Reconnector.class.lngwT3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.RemoteControl.class.cnmxP3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.RhsPanel.class.dWNTL3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.SmartChoice.class.FYcZI3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.TasksPanel.class.T2l5F3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.TextFieldComponentConfigurationPanel.class.dTBxD3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/.ValidateActionCommand.class.EfAsC3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.Action.class.N2hoB3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.AssistantPacket$ReceptionCallback.class.AdfkA3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.AssistantPacket.class.4ODBz3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.ComponentConfiguration.class.fh0Bz3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueArchiver.class.Z8iDz3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueArchiving.class.GwZmA3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueArchivingDelegate.class.2rp7A3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueUnarchiver.class.gqvdC3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.PageConfiguration.class.Pa72D3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.Property.class.mPATF3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.PropertyListParser.class.gvZ5H3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.PropertyListUtilities.class.mN6EK3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/common/.Settings.class.qtgXN3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.BooleanButtonMonitor.class.WSClS3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.BooleanMenuItemMonitor.class.zGDKW3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.BooleansBooleanMonitor.class.RFY903" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.ItemStringAssociation.class.IB4D63" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.Monitor.class.XIZ8b4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.ObservableBoolean.class.YI7Dh4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.ObservableReference.class.ASdXo4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.ObservableString.class.Nx9gw4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringBooleanMonitor.class.ywiBD4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringCardLayoutMonitor.class.fTwVK4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringFrameTitleMonitor.class.DXK3T4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringMonitor.class.NYMc34" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.AlertDialog.class.qa9lc5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.BorderPanel.class.kCGvl5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.BrowserDataSource.class.d4lnv5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.BrowserObjectList.class.gqNfF5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ButtonTabPanel.class.Q9PtP5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ColumnBrowser$ColumnBrowserObserver.class.R8qr05" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ColumnBrowser.class.i8Rpb6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.Command.class.CUN6m6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.Decorator.class.ILuOy6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.GrayFilter.class.vtCeL6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ImageButton.class.K3vFX6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ImageLabel.class.rGKsa7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ModifiableCheckbox.class.3vJYn7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ModifiableChoice.class.KByvB7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ModifiableTextField.class.XhOKP7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ObjectChoice.class.q4U037" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ObjectList.class.MaMCi8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.OkCancelDialog.class.qfjBx8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.ResourceManager.class.ugpWM8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.Services.class.9m6D28" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.TabPanel.class.ZFCIi9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/apple/client/directtoweb/utils/.YorNDialog.class.EebTz9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOAccountEvent.class.oUu4Q9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOAggregateEvent.class.QSoB89" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOAndQualifier.class.vepvqa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOArrayDataSource.class.a5dYIa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$1.class.thyk2a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$ClassDelegate.class.YBEHlb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$_EOCDBinderMaps.class.lhgyGb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$_EOClassToBinderMaps.class.HQBq1b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$_EONopClassDescription.class.o77imc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription.class.ymSbHc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOCooperatingObjectStore.class.iOJ92c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_BooleanFieldBinding.class.6On8od" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_FieldBinding.class.qAk7Kd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_LazyFieldBinding.class.rY5f8d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_NumberFieldBinding.class.kMRpve" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject.class.j3qASe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EODataSource.class.F5nlgf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EODeferredFaulting.class.aU2aFf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EODelayedObserver.class.Qgv13f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EODelayedObserverQueue.class.PV6Rsg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EODetailDataSource.class.kmR4Rg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$1.class.fimEhh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$Delegate.class.D8r2Ih" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$EditingContextEvent.class.efkrai" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$Editor.class.wrwQBi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$MessageHandler.class.4ENf3i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$_EOInvalidFaultHandler.class.Nfjnwj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$_EOThreadSafeQueue.class.qDXvZj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$_EventLoggingEnabler.class.gU7Esk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext.class.yIwOVk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEnterpriseObject.class.mIM7pl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEvent.class.vtssUl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEventCenter$EventRecordingHandler.class.GgNZpm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOEventCenter.class.7t2xVm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOFaultHandler.class.R6Eurn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOFaulting.class.Wxa0Xn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOFetchSpecification.class.dPDwuo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOGenericRecord$_DictionaryBinding.class.qHp91o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOGenericRecord$_LazyDictionaryBinding.class.NCnNzp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOGenericRecord.class.0Lyr7p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOGlobalID.class.uZFMFq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyComparisonQualifier.class.uDP8dr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyGlobalID.class.8fIPMr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiver$Delegate.class.2uCgms" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiver.class.2GvIVs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$Awaking.class.NINIwt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$FinishInitialization.class.4nTJ7t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$Support.class.XqcLIu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$_NullValueSupport.class.foTMjv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$_NumberSupport.class.pBt8Vv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$_TimestampSupport.class.YGZuyw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving.class.4NNRax" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$DefaultImplementation.class.6guzNx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$Utility.class.881nry" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_BestBindingCreation$_ForwardingBindingCheck.class.M8Cd5y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_BestBindingCreation.class.wAD3Iz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_KeyBindingCreation.class.zIiOoA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_StoredForwardingBinding.class.gFOz4A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding.class.jFwlKB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCodingAdditions$DefaultImplementation.class.Mzp7pC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCodingAdditions$Utility.class.eCFe6C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCodingAdditions.class.1Wh5MD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueQualifier.class.DyWWtE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueUnarchiver$Delegate.class.rgZwbF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueUnarchiver$_EOKeyValueArchivingContainer.class.YXP7SF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueUnarchiver.class.nWY3AG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EONotQualifier.class.jMhgjH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObjectStore.class.RUtO1H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObjectStoreCoordinator.class.65oJKI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObserverCenter$_EOObserverArray.class.DjtLuJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObserverCenter$_ThreadInfo.class.nnFPeK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObserverCenter.class.5zbUYK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObserverProxy.class.cCUvKL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOObserving.class.wRL8vM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOOrQualifier.class.uLVLhN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier$Comparison.class.go653N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier$ComparisonSupport.class.uXnrQO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier$QualifierVariableSubstitutionException.class.4tcvDP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier.class.QdYzqQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifierEvaluation.class.lYC0dR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifierVariable.class.i7B21R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOQualifierVisitor.class.HBA5PS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EORelationshipManipulation.class.P97QET" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSharedEditingContext.class.ixODtU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$Comparison.class.cfHvjV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$ComparisonSupport.class.tCko9V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_MultipleSortValueHolder.class.iNVl0W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_MultipleValueComparator.class.VMnkRX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_SingleSortValueHolder.class.0LuRJY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_SingleValueComparator.class.LeApCZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_SortValueHolder.class.yc4Xu0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering.class.X3Kwn1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOTemporaryGlobalID.class.5pQqg2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/.EOValidation.class.AsmH92" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOCheapCopyArray.class.VhhC33" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOCheapCopyMutableArray.class.im9xX4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOEventDurationComparator.class.SR5MR5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOFlatMutableDictionary.class.7OSKM6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOIntegralKeyGlobalID.class.4twJH7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOKnownSelector.class.R1IqD8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableDefaultValueDictionary.class.8RM8y9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer$_FastAccessBinding.class.2Syzva" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer$_GenericRecordBinding.class.Rph1rb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer$_LazyGenericRecordBinding.class.9Rvipc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer.class.tPPAmd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$SubsetMapping.class.VURBke" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary.class.GDWDif" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOPrivateMemento$DefaultImplementation.class.LqD1gg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOPrivateMemento.class.O6b8fh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOVectorKeyGlobalID.class.JCtffi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/._EOWeakReference.class.0QBIej" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/.ASCII_UCodeESC_CharStream.class.5vsafk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/.ParseException.class.59vYfl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/.Token.class.EjZShm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/.TokenMgrError.class.mxjOjn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParser$KeyString.class.9pTKlo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParser.class.O1P2np" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParserConstants.class.Iq6Gqq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParserTokenManager.class.RBwOtr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$Operator.class.V55Ixs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$_AvgNumberOperator.class.3PqEBt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$_CountOperator.class.ucUXGu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$_MaxOperator.class.ig7hMv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$_MinOperator.class.GUvCRw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$_Operator.class.xB8WWx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray$_SumNumberOperator.class.77vS2y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSArray.class.KXUO8z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoder.class.jeHtfB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$Support.class.3k98lC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_BigDecimalSupport.class.DGJwtD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_BigIntegerSupport.class.NzpDBE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_BooleanSupport.class.b0UKJF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_ByteSupport.class.3HuOTG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_CharacterSupport.class.2WPS3H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_DateSupport.class.zEoXdJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_DoubleSupport.class.ip91nK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_FloatSupport.class.O176xL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_IntegerSupport.class.4V6eKM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_LongSupport.class.aJhoWN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_NumberSupport.class.vtZx8O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_ShortSupport.class.QWYHkQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding$_StringSupport.class.xrAiyR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSCoding.class.jVOTLS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSComparator$ComparisonException.class.N6kvZT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSComparator$_NSSelectorComparator.class.Ro56cV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSComparator$_NumberComparator.class.chZqrW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSComparator$_StringComparator.class.MoBLFX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSComparator$_TimestampComparator.class.G9pWUY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSComparator.class.tYX79Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSData.class.4M6Ep1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSDelayedCallbackCenter$NSLightInvocation.class.a3pzF2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSDelayedCallbackCenter$_Delegate.class.xOAcW3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSDelayedCallbackCenter.class.VOoQc5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSDictionary.class.46FQt6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSDisposable.class.SqH6K7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSDisposableRegistry.class.l1D428" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSForwardException.class.eBn3ka" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$1.class.sj8KDb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$DefaultImplementation.class.kTKtWc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$ErrorHandling.class.JMSUfe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$Null.class.aQRmzf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$UnknownKeyException.class.LUV0Tg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$Utility.class.1NNFei" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$ValueAccessor.class.n202zj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_BooleanFieldBinding.class.7CkwWk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_BooleanMethodBinding.class.FJn0im" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_FieldBinding.class.EyCuFn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ForwardingBinding.class.h2Lk2o" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_KeyBinding.class.fZvzpq" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_KeyBindingCreation.class.FHynNr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_MethodBinding.class.4OAcbt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_NumberFieldBinding.class.VXcPAu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_NumberMethodBinding.class.lWUs0v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ReflectionKeyBindingCreation$Callback.class.Wn66px" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ReflectionKeyBindingCreation$_BindingStorage.class.hvKLPy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ReflectionKeyBindingCreation.class.dC0qfA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding.class.5g6DGB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCodingAdditions$DefaultImplementation.class.8laS7C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCodingAdditions$Utility.class.eNhazE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCodingAdditions.class.uZ2s0F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLock.class.FRIntH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLocking.class.TFAjWI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLog$Log4JLogger.class.3BDfpK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLog$Logger.class.TpjfSL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLog$PrintStreamLogger.class.kemflN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLog$_DevNullPrintStream.class.rKGfPO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSLog.class.UmfijQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMultiReaderLock$ConditionLock.class.cP36NR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMultiReaderLock$LockRecord.class.PXMWiT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMultiReaderLock.class.BU9LOU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMutableArray.class.7URDkW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMutableData.class.xUK0QX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMutableDictionary.class.ZxesoZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMutableRange.class.gbHXV0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSMutableSet.class.DLBtt2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSNotification.class.TEtC13" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSNotificationCenter$_Entry.class.g1JPz5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSNotificationCenter.class.cgKm86" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSNumberFormatter$1.class.CC8YH8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSNumberFormatter$ConstructionBuffer.class.qPzCha" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSNumberFormatter.class.5X7gRb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSPathUtilities.class.Vmvxrd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSProperties.class.xso81e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_Utilities.class.yRN6Cg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_XML$DictionaryParser$XMLNode.class.Avttei" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_XML$DictionaryParser.class.ODfDQj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_XML.class.YSbSsl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization.class.uy4K5m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSRange.class.UOAJIo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSRecursiveLock.class.QA9lmq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSSelector.class.PUs0Zr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSSet.class.1Zr1Dt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSSocketUtilities$SocketThread.class.MAalkv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSSocketUtilities.class.sHlG0w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimeZone$__NSTZPeriod.class.QOl2Gy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimeZone$__NSTZPeriodComparator.class.BILonA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimeZone.class.TGlL3B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimestamp$GregorianDateAsRawUnits.class.DQtMLD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimestamp$IntRef.class.28sPtF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimestamp.class.HtXSbH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimestampFormatter$1.class.FjRCUI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimestampFormatter$__NSSimpleDateFormat.class.1bZnDK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSTimestampFormatter.class.wAUumM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$1.class.YquK6N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoBeginMark.class.kn10QP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoEndMark.class.s6JhBR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoLightInvocation.class.cUSVmT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoObject.class.wBbB8U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoStack.class.khZgUW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSUndoManager.class.PMtXFY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSValidation$DefaultImplementation.class.HPPes0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSValidation$Utility.class.Q5Slf2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSValidation$ValidationException.class.I2ny23" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSValidation$_MethodBinding.class.wmDLP5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSValidation$_ValidationBinding.class.XRqYD7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.NSValidation.class.Lcqcs9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSArrayUtilities.class.HTMugb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSBase64.class.VT7A7c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSCollectionEnumerator.class.jE3IYe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSCollectionPrimitives.class.4a9QPg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSCollectionReaderWriterLock.class.hD0tHi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSDelegate.class.q367yk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSDictionaryUtilities.class.ziaQrm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSFoundationCollection.class.FgECko" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSGregorianCalendar.class.Hwopdq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSIntegerDictionary.class.YPCv6r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSIntegerKeyDictionary.class.GgfM1t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSJavaArrayEnumerator.class.gWk7Wv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSJavaArrayWrapper.class.X2RtTx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSMutableIntegerDictionary.class.xhARPz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSMutableIntegerKeyDictionary.class.Rm1iMB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSObjectStreamClass$1.class.FXyqJD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSObjectStreamClass.class.DMkzGF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSReadReentrantReaderWriterLock.class.ABTxEH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSReflectionUtilities.class.zjfyCJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector$1.class.NmXzCL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector$2.class.6yLDCN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector$Factory.class.h57HCP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector.class.8kGMCR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSSerialFieldDesc.class.7vTFET" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSStreamingOutputData.class.a38zGV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSStringUtilities$_PatternAnalyzer.class.XbBbaY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSStringUtilities$_StringAnalyzer.class.GzVND0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSStringUtilities.class.kmU072" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeMutableArray.class.8QCBC5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeMutableDictionary.class.Xscy77" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeMutableSet.class.1jORCa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeWrapper.class.nDUuad" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSUtilities$JavaArchiveFilter.class.uHz9Hf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSUtilities$JavaClassFilter.class.POqOfi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSUtilities$_NoClassUnderTheSun.class.7iutNk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSUtilities$_ResourceSearcher.class.kMY8kn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSUtilities.class.lJzOSp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSUtilitiesExtra.class.309Yrs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableArray.class.HUAa1u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection$_NSWeakMutableCollectionEnumerator.class.5LrlBx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection$_NSWeakMutableCollectionReference.class.T20wbA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection$_NSWeakMutableCollectionReferenceEnumerator.class.yzlOMC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection.class.nAO6nF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableSet.class.K3wpZH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/._NSWeakValueMutableDictionary.class.qdc3AK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/foundation/.__NSLocalTimeZone.class.mds3cN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOBindingTag.class.QtNgQP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOComponentTag.class.8GXutS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WODirectActionTag.class.6ViJ6U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOExtraHeaderTag.class.xoq3KX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOFormValueTag.class.L7Cop0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOServletAdaptor$JavaArchiveFilter.class.DB1J32" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOServletAdaptor.class.LBpqI5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/.WOTag.class.j1e5n8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/com/webobjects/jspservlet/._WOServletAppInterface.class.Te8K3a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.DocumentBuilder.class.YejrJd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.DocumentBuilderFactory.class.Jxmnsg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.FactoryConfigurationError.class.4wokbj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.FactoryFinder$ConfigurationError.class.DtUhUl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.FactoryFinder.class.ZeEfDo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.ParserConfigurationException.class.kk4Umr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.SAXParser.class.DrkB6t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/parsers/.SAXParserFactory.class.aZdDQw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.ErrorListener.class.R6PSBz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.FactoryFinder$ConfigurationError.class.vWS9mC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.FactoryFinder.class.a7dr8E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.OutputKeys.class.hJguWH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.Result.class.5aayKK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.Source.class.QanCyN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.SourceLocator.class.jhMGmQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.Templates.class.6EqLaT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.Transformer.class.6ibQYV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.TransformerConfigurationException.class.BtaVMY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.TransformerException.class.BkkHB1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.TransformerFactory.class.W0kuq4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.TransformerFactoryConfigurationError.class.i5Xsh7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/.URIResolver.class.eLCs89" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/dom/.DOMLocator.class.3MtsZc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/dom/.DOMResult.class.MgrsQf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/dom/.DOMSource.class.kNAsHi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax/.SAXResult.class.aRxLzl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax/.SAXSource.class.7Kj5ro" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax/.SAXTransformerFactory.class.thBpkr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax/.TemplatesHandler.class.3O2Jcu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/sax/.TransformerHandler.class.5WFv6w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/stream/.StreamResult.class.ONCi0z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/javax/xml/transform/stream/.StreamSource.class.TY35TC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.LICENSE.dom-documentation.txt.T6MTNF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.LICENSE.dom-software.txt.2KOoII" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.LICENSE.sax.txt.wecWCL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.LICENSE.txt.iTHhyO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.README.dom.txt.tkdEtR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.README.sax.txt.47SsqU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/license/.README.txt.IhSinX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.CollectionIndex.class.Jjd9j0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLAnchorElementImpl.class.55LZg3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLAppletElementImpl.class.vMPvf6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLAreaElementImpl.class.ioU2d9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLBRElementImpl.class.j88Rec" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLBaseElementImpl.class.PojIff" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLBaseFontElementImpl.class.YkWygi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLBodyElementImpl.class.vbMphl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLBuilder.class.C1ABio" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLButtonElementImpl.class.RNLwkr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLCollectionImpl.class.CIOsmu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLDListElementImpl.class.71o7ox" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLDOMImplementationImpl.class.AfKMrA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLDirectoryElementImpl.class.LGApvD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLDivElementImpl.class.P8L3yG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLDocumentImpl.class.8X6HCJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLElementImpl.class.Q8EKGM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLFieldSetElementImpl.class.fnPzMP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLFontElementImpl.class.wXhqSS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLFormControl.class.SaBhYV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLFormElementImpl.class.ju183Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLFrameElementImpl.class.WvJ091" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLFrameSetElementImpl.class.pUi3g5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLHRElementImpl.class.jbX6n8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLHeadElementImpl.class.zNLavb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLHeadingElementImpl.class.4tkjDe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLHtmlElementImpl.class.yfgtLh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLIFrameElementImpl.class.WpvDTk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLImageElementImpl.class.MjJu2n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLInputElementImpl.class.ItUmbr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLIsIndexElementImpl.class.O1szlu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLLIElementImpl.class.bf3Mvx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLLabelElementImpl.class.ztW0FA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLLegendElementImpl.class.fYYFRD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLLinkElementImpl.class.ISYl3G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLMapElementImpl.class.uZe2eK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLMenuElementImpl.class.Rs5gsN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLMetaElementImpl.class.y6LwFQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLModElementImpl.class.UiXMST" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLOListElementImpl.class.J9k35W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLObjectElementImpl.class.Sny1j0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLOptGroupElementImpl.class.ldR0x3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLOptionElementImpl.class.2yGIM6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLParagraphElementImpl.class.bjps19" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLParamElementImpl.class.SjtRhd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLPreElementImpl.class.tCfhyg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLQuoteElementImpl.class.JrsHOj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLScriptElementImpl.class.wvQ74m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLSelectElementImpl.class.JXvTlq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLStyleElementImpl.class.8urLDt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTableCaptionElementImpl.class.XNKFVw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTableCellElementImpl.class.2fpAdA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTableColElementImpl.class.e61iwD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTableElementImpl.class.70a3OG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTableRowElementImpl.class.b9i87J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTableSectionElementImpl.class.GnKWrN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTextAreaElementImpl.class.tXhMLQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLTitleElementImpl.class.gO0j6T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.HTMLUListElementImpl.class.OoKSqX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/html/dom/.NameNodeListImpl.class.ogUrP0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLAElement.class.4Q51d4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLAccessElement.class.SOtCC7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLAnchorElement.class.Q46c1a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLBElement.class.cbSNpe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLBigElement.class.erKoOh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLBrElement.class.NnRZcl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLCardElement.class.yU5ABo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLDOMImplementation.class.R92c0r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLDoElement.class.NJ6Oov" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLDocument.class.ATChRy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLElement.class.ChoLjC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLEmElement.class.d2pfMF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLFieldsetElement.class.DtHJeJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLGoElement.class.Fo4dHM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLHeadElement.class.xYHI9P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLIElement.class.ZtrdCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLImgElement.class.wDiI4W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLInputElement.class.U9odx0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLMetaElement.class.u2BIZ3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLNoopElement.class.lrEhx7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLOneventElement.class.9cHR4a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLOptgroupElement.class.NHWrCe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLOptionElement.class.eYh29h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLPElement.class.ppSCHl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLPostfieldElement.class.7KAdfp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLPrevElement.class.ToqOMs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLRefreshElement.class.TKnpkw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLSelectElement.class.PJA0Rz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLSetvarElement.class.9nUBpD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLSmallElement.class.IgldXG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLStrongElement.class.q81OuK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLTableElement.class.P1Oq2N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLTdElement.class.jP8oDR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLTemplateElement.class.5QNoeV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLTimerElement.class.D0MoPY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLTrElement.class.aQRoq2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLUElement.class.Wg4o15" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/.WMLWmlElement.class.6jxpC9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLAElementImpl.class.LB7pdd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLAccessElementImpl.class.eXUqOg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLAnchorElementImpl.class.A0UKqk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLBElementImpl.class.d8K52n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLBigElementImpl.class.I0UqFr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLBrElementImpl.class.SJaMhv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLCardElementImpl.class.sRVbVy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLDOMImplementationImpl.class.vc4CyC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLDoElementImpl.class.JQm4bG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLDocumentImpl.class.CeUQPJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLElementImpl.class.ZIUIuN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLEmElementImpl.class.DwXB9Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLFieldsetElementImpl.class.10hvOU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLGoElementImpl.class.onVjvY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLHeadElementImpl.class.pWB9b2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLIElementImpl.class.UlBZS5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLImgElementImpl.class.ERNPz9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLInputElementImpl.class.wcCnhd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLMetaElementImpl.class.SAwWYg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLNoopElementImpl.class.OFWsHk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLOneventElementImpl.class.j2N0po" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLOptgroupElementImpl.class.d1Oy8r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLOptionElementImpl.class.ceNxSv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLPElementImpl.class.fcbyCz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLPostfieldElementImpl.class.3jOymD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLPrevElementImpl.class.31y77G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLRefreshElementImpl.class.iLgHTK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLSelectElementImpl.class.6NhhFO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLSetvarElementImpl.class.TksRqS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLSmallElementImpl.class.GQdwdW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLStrongElementImpl.class.ilQb0Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLTableElementImpl.class.CeKRM3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLTdElementImpl.class.4VWRA7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLTemplateElementImpl.class.2JbTob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLTimerElementImpl.class.JLCUcf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLTrElementImpl.class.yUgW0i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLUElementImpl.class.EcaLQm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/wml/dom/.WMLWmlElementImpl.class.uDlBGq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ASDOMImplementationImpl.class.NT1rwu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ASModelImpl.class.CBTimy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.AttrImpl.class.SlyucC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.AttrNSImpl.class.l3i32F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.AttributeMap.class.O6mYTJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CDATASectionImpl.class.9UG7LN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CharacterDataImpl$1.class.KBiiER" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CharacterDataImpl.class.Xn7swV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ChildNode.class.z8FHpZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CommentImpl.class.vDcXi3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CoreDOMImplementationImpl.class.Q9Ucc7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CoreDocumentImpl$UserDataRecord.class.3kdk6a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.CoreDocumentImpl.class.jgts0e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMErrorImpl.class.R8SXVi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMImplementationImpl.class.i36tRm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMImplementationSourceImpl.class.wMRDNq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMInputSourceImpl.class.foYOJu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMLocatorImpl.class.GZYWGy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMMessageFormatter.class.lbX5DC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMNormalizer$XMLAttributesProxy.class.3r4eBG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMNormalizer.class.PPqJyK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DOMValidationConfiguration.class.0NWAwO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeepNodeListImpl.class.gyAPuS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredAttrImpl.class.AfeNtW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredAttrNSImpl.class.4sCLs0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredCDATASectionImpl.class.FrKFt4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredCommentImpl.class.3v7Au8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentImpl$IntVector.class.rCGwvc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentImpl$RefCount.class.LOsswg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentImpl.class.bSYIxk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentTypeImpl.class.ma5mzo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredElementDefinitionImpl.class.NAzJBs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredElementImpl.class.n956Dw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredElementNSImpl.class.bodzHA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredEntityImpl.class.eco2KE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredEntityReferenceImpl.class.1CXvOI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredNode.class.jH23SM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredNotationImpl.class.6E2CXQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredProcessingInstructionImpl.class.NFcc2U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DeferredTextImpl.class.dvQSaZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DocumentFragmentImpl.class.Sl4Aj3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DocumentImpl$EnclosingAttr.class.uCtjs7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DocumentImpl$LEntry.class.PO61Ab" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DocumentImpl.class.bMXKJf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.DocumentTypeImpl.class.L0SOSj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ElementDefinitionImpl.class.OaaJ2n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ElementImpl.class.sk3Ecs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ElementNSImpl.class.7HKYmw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.EntityImpl.class.2XDZxA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.EntityReferenceImpl.class.bjp1IE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.LCount.class.0AiLUI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.NamedNodeMapImpl.class.59mw6M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.NodeImpl.class.ocvDiR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.NodeIteratorImpl.class.Ql1ovV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.NodeListCache.class.9QRbIZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.NotationImpl.class.1xBCV3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.PSVIAttrNSImpl.class.4Tp487" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.PSVIDOMImplementationImpl.class.AreBnc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.PSVIDocumentImpl.class.RWY8Bg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.PSVIElementNSImpl.class.2I0GQk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ParentNode$1.class.i8oY5o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ParentNode.class.wl1glt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.ProcessingInstructionImpl.class.75RKBx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.RangeExceptionImpl.class.Mx9fSB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.RangeImpl.class.oHEL8F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.TextImpl.class.XYTCpK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/.TreeWalkerImpl.class.gJIPGO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/events/.EventImpl.class.CGgKZS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom/events/.MutationEventImpl.class.CQOFiX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/.DOMError.class.X5vBB1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/.DOMErrorHandler.class.gTrxU5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/.DOMImplementationRegistry.class.X9QDfa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/.DOMImplementationSource.class.ZrrLAe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/.DOMLocator.class.FD7SVi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/.UserDataHandler.class.CO20gn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASAttributeDeclaration.class.PnQkDr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASContentModel.class.KwFFZv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASDataType.class.cUO0lA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASElementDeclaration.class.NrQ2JE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASEntityDeclaration.class.saI57I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASModel.class.FVF8vN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASNamedObjectMap.class.2SXbUR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASNotationDeclaration.class.AoA8kW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASObject.class.Md55L0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ASObjectList.class.puN3c5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.CharacterDataEditAS.class.7EK1D9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.DOMASBuilder.class.NGMZ4d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.DOMASException.class.3p3Xvi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.DOMASWriter.class.dZqWWm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.DOMImplementationAS.class.RW4Unr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.DocumentAS.class.wlabRv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.DocumentEditAS.class.v38skA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.ElementEditAS.class.XckLNE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/dom3/as/.NodeEditAS.class.1RA3gJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.Constants$ArrayEnumeration.class.1A5lKN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.Constants.class.XmNEdS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.RevalidationHandler.class.cc2THW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.Version.class.uS09b1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XML11DTDScannerImpl.class.xfcqG5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XML11DocumentScannerImpl.class.rV20aa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XML11EntityManager$XML11EntityScanner.class.dTVlGe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XML11EntityManager.class.7V9Mcj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDTDScannerImpl.class.QqUfJn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl$Dispatcher.class.yaKigs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl$ElementStack.class.CvL3Nw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.class.vGLPlB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl.class.kjzYTF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$ContentDispatcher.class.KTWQsK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$DTDDispatcher.class.sTdK1O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$PrologDispatcher.class.oYqYAT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$TrailingMiscDispatcher.class.kvmzaY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$XMLDeclDispatcher.class.ishwK2" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl.class.qXVQk7" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/stream" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/stream" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityHandler.class.VdcxVb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$Entity.class.0MmXwg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$EntityScanner.class.sr3o8k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$ExternalEntity.class.09jELp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$InternalEntity.class.l5LUou" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$RewindableInputStream.class.g9Hb2y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$ScannedEntity.class.CcntFD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager.class.WqkLiI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLEntityScanner.class.afWPWM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLErrorReporter.class.v7cZAR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLNamespaceBinder.class.nbsrfW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/.XMLScanner.class.krYgU0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar$1.class.01YIA5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar$ChildrenList.class.JsKbha" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar$QNameHashtable.class.naCtYe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar.class.bOGMFj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammarBucket.class.kGGZoo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLAttributeDecl.class.4PUg8s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLContentSpec$Provider.class.vsHyRx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLContentSpec.class.z6GQAC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDDescription.class.rxdNkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDLoader.class.t4MK4L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDProcessor.class.j2D4OQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDValidator.class.H1cMzV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLElementDecl.class.hrISm0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLEntityDecl.class.JLH094" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLNotationDecl.class.ig08W9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLSimpleType.class.J0VkKe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMAny.class.Ghhxxj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMBinOp.class.8xNJko" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMLeaf.class.8bN09s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMNode.class.RtIjZx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMStateSet.class.OjZCOC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMUniOp.class.oULWDH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.ContentModelValidator.class.mMQgtM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.DFAContentModel.class.ReoBiR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.MixedContentModel.class.1mNh8V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dtd/models/.SimpleContentModel.class.Qywd10" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.DTDDVFactory.class.IHOaU5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.DVFactoryException.class.91k8Ma" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.DatatypeException.class.3t55Ff" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.DatatypeValidator.class.nqT7yk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.InvalidDatatypeFacetException.class.kmfasp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.InvalidDatatypeValueException.class.wqOclu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.SchemaDVFactory.class.enufez" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.ValidatedInfo.class.zGnybE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.ValidationContext.class.iPvS8I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.XSFacets.class.48Vc6N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/.XSSimpleType.class.ZPrx3S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.DTDDVFactoryImpl.class.sgLS0X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.ENTITYDatatypeValidator.class.Zx4hY2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.IDDatatypeValidator.class.c0THV7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.IDREFDatatypeValidator.class.ttU7Sc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.ListDatatypeValidator.class.Bp9xQh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.NMTOKENDatatypeValidator.class.XaIEPm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.NOTATIONDatatypeValidator.class.nFcMOr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.StringDatatypeValidator.class.TITTNw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/util/.Base64.class.tiN1MB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/util/.HexBin.class.STlzMG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.AbstractDateTimeDV.class.XSC7LL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.AnySimpleDV.class.nhypMQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.AnyURIDV.class.ffjIMV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.Base64BinaryDV.class.d0BjV0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.BaseDVFactory.class.HXMV35" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.BooleanDV.class.CjLufb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DateDV.class.fmH4qg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DateTimeDV.class.A9OECl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DayDV.class.4f8WOq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DecimalDV.class.nUgg1v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DoubleDV.class.Xp0heB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DurationDV.class.ybzkrG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.EntityDV.class.baS5EL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.FloatDV.class.rgmSSQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.FullDVFactory.class.ODnJ7V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.HexBinaryDV.class.ZKiBm1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.IDDV.class.gqaoD6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.IDREFDV.class.sB5bUb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.ListDV.class.zlc0ah" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.MonthDV.class.zhxOrm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.MonthDayDV.class.b5tlJr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.QNameDV.class.X5dT0w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.SchemaDVFactoryImpl.class.ryEMiC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.SchemaDateTimeException.class.bmciBH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.StringDV.class.qeoOTM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.TimeDV.class.z6NLdS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.TypeValidator.class.cY3JxX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.UnionDV.class.pNCIR2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XDecimal.class.8qgHb8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl$1.class.ZRC4yd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl$2.class.w47sWi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl$ValidationContextImpl.class.Q70Rjo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl.class.t6chHt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.YearDV.class.wHoD5y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/dv/xs/.YearMonthDV.class.RPp0tE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/io/.ASCIIReader.class.2YncTJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/io/.UCSReader.class.GybpiP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/io/.UTF8Reader.class.pFQXHU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg/.DOMMessages.properties.Lq7T7Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg/.XMLMessageFormatter.class.FqUGy5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg/.XMLMessages.properties.pmJuZa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg/.XMLSchemaMessages.properties.5F51qg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/msg/.XMLSerializerMessages.properties.ScRaTl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/validation/.EntityState.class.u9bomr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/validation/.ValidationManager.class.MibCPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/validation/.ValidationState.class.FVsQiC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$1.class.bn2oNH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Axis.class.4slYhN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$LocationPath.class.UMYxMS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$NodeTest.class.WdHPhY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Scanner.class.m0x8M3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Step.class.4CEMi9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Tokens.class.B9WMOe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath.class.GvRblk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/.XPathException.class.REqVRp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.BMPattern.class.PSgwpv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Match.class.Y8Z7WA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$CharOp.class.wsf8xG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$ChildOp.class.LYf98L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$ConditionOp.class.KZraKR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$ModifierOp.class.caTblX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$RangeOp.class.4h0dW2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$StringOp.class.YS1jy8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$UnionOp.class.okOqae" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op.class.l7NxMj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.ParseException.class.zbqnpp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.ParserForXMLSchema.class.sjZd2u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.REUtil.class.yG9qFA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RangeToken.class.MFkskG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegexParser$ReferencePosition.class.J7Cy1L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegexParser.class.E2QFIR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegularExpression$Context.class.WAagrX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegularExpression.class.UHwR92" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$CharToken.class.S6EKT8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ClosureToken.class.m1EIDe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ConcatToken.class.A8hHnk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ConditionToken.class.dsUF8p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$FixedStringContainer.class.RVlFTv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ModifierToken.class.UCZEEB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ParenToken.class.QFiRqH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$StringToken.class.o4F4cN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$UnionToken.class.zddiZS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token.class.d8lrNY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.message.properties.O13lC4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.message_fr.properties.pbJhra" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.message_ja.properties.BpVSgg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.AttributePSVImpl.class.n38C7l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.ElementPSVImpl.class.gBhoYr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$1.class.oaRbQx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$BuiltinAttrDecl.class.iZ3ZHD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$BuiltinSchemaGrammar.class.O1AOzJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$XSAnyType.class.IHUYrP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar.class.yWrvkV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaNamespaceSupport.class.6z4Md1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaSymbols.class.GHG566" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.SubstitutionGroupHandler.class.6RAI0c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaException.class.ZuIrVi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaLoader$LocationArray.class.oyRbQo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaLoader.class.WdbWKu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$KeyRefValueStore.class.EwOqGA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$KeyValueStore.class.n0kWBG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$LocalIDKey.class.4fYiAM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$OrderedHashtable$Entry.class.E5sGyS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$OrderedHashtable.class.3Oa4wY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$UniqueValueStore.class.j7DTw4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$ValueStoreBase.class.9pQJwa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$ValueStoreCache.class.fwdWwg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$XPathMatcherStack.class.2nQJym" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$XSIErrorReporter.class.CkuyAs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator.class.DWonCy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSAttributeDecl.class.TBoMEE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSAttributeGroupDecl.class.BEBwHK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSAttributeUseImpl.class.MQN0KQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSComplexTypeDecl.class.DJ3vOW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSConstraints.class.u9knS2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSDDescription.class.pPhBW8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSDeclarationPool.class.pjUa1e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSElementDecl.class.zBI56k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSGrammarBucket.class.hE3Bdr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSGroupDecl.class.Hqe9jx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSMessageFormatter.class.gICorD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSModelGroupImpl.class.kaQEyJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSModelImpl.class.rrbhGP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSNotationDecl.class.bxkDOV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSParticleDecl.class.P4c0W1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSTypeDecl.class.5RC557" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/.XSWildcardDecl.class.FqQbfe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/dom/.DOMNodePool.class.SBr7ok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/dom/.DOMParser.class.YgDpzq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/dom/.DocumentImpl.class.AbjrKw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/dom/.ElementNSImpl.class.xaPtVC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Field$Matcher.class.BwTe7I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Field$XPath.class.DvK0iP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Field.class.lTyrxV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.FieldActivator.class.o4aTL1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.IDValue.class.4t0k07" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.IdentityConstraint.class.Xcrvfe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.KeyRef.class.UJLGuk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Selector$Matcher.class.8vAWKq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Selector$XPath.class.5Yhd1w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Selector.class.a39thD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.UniqueOrKey.class.PttQyJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.ValueStore.class.6FSdQP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/identity/.XPathMatcher.class.MCuB7V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.CMBuilder.class.0w0jp2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSAllCM.class.ZnVLH8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMBinOp.class.FWEe0e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMLeaf.class.aWmvkl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMUniOp.class.tMgNEr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMValidator.class.mml5Yx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSDFACM.class.ExRnjE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSEmptyCM.class.BB21DK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.ObjectList.class.LknB1Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.PSVIProvider.class.J5TbpX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.StringList.class.hEKMM3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAnnotation.class.hNHnaa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAttributeDeclaration.class.dVMYxg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAttributeGroupDefinition.class.0h5zVm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAttributeUse.class.Bqvbjt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSComplexTypeDefinition.class.l09MGz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSConstants.class.J59a6F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSElementDeclaration.class.xKSzvM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSIDConstraintDefinition.class.LfVYUS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSModel.class.zh3nkZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSModelGroup.class.cxOOM5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSModelGroupDefinition.class.qIigfc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSNamedMap.class.3K1HHi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSNamespaceItem.class.YcZ99o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSNotationDeclaration.class.RZ8BCv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSObject.class.Rsp44B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSObjectList.class.6eNwxI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSParticle.class.YrrZZO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSSimpleTypeDefinition.class.rBpuuV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSTerm.class.Ldg0Y1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSTypeDefinition.class.fTjwt8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSWildcard.class.knD2Xe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.OneAttr.class.BRAzsl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.OneElement.class.L9L6Wr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSAttributeChecker.class.sGn6ry" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractIDConstraintTraverser.class.8MbMXE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractParticleTraverser$ParticleArray.class.TvG6tL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractParticleTraverser.class.Ej0r0R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractTraverser$FacetInfo.class.OXK8wY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractTraverser.class.qOT244" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAttributeGroupTraverser.class.1IbnDb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAttributeTraverser.class.osJ0bi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDComplexTypeTraverser$ComplexTypeRecoverableError.class.MHPnLo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDComplexTypeTraverser.class.8c0Lkv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDElementTraverser.class.ruU8UB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDGroupTraverser.class.ShMYvI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDHandler$XSDKey.class.cvPF7O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDHandler.class.gxXnJV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDKeyrefTraverser.class.tx2Jl2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDNotationTraverser.class.z5zLY8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDSimpleTypeTraverser.class.h7eOBf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDUniqueOrKeyTraverser.class.wTwkgm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDWildcardTraverser.class.vbIRUs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDocumentInfo.class.8ftIzz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.ObjectListImpl.class.NTjUfG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.SimpleLocator.class.L5V6VM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.StringListImpl.class.67IjCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.XInt.class.in1Xj0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.XIntPool.class.fF2C16" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.XSNamedMap4Types.class.VMgiJd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.XSNamedMapImpl.class.0UNXqk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/impl/xs/util/.XSObjectListImpl.class.zygl9q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp/.DefaultValidationErrorHandler.class.ORzJRx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp/.DocumentBuilderFactoryImpl.class.T91PAE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp/.DocumentBuilderImpl.class.UQiXjL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp/.JAXPConstants.class.jOVW3R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp/.SAXParserFactoryImpl.class.OAlXNY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/jaxp/.SAXParserImpl.class.gXTXx5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.AbstractDOMParser.class.hTzMic" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.AbstractSAXParser$AttributesProxy.class.Jaed4i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.AbstractSAXParser$LocatorProxy.class.nvJBQp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.AbstractSAXParser.class.2Yh1Cw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.AbstractXMLDocumentParser.class.CbaNpD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.BasicParserConfiguration.class.LVZUcK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.CachingParserPool$ShadowedGrammarPool.class.AUzM0Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.CachingParserPool$SynchronizedGrammarPool.class.iHYEOX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.CachingParserPool.class.8IVoE4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.DOMASBuilderImpl.class.EcH9tb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.DOMBuilderImpl.class.AZDRki" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.DOMParser.class.eusfcp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.DTDConfiguration.class.f5rB4v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.DTDParser.class.JSgnXC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.NonValidatingConfiguration.class.wDSsQJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.SAXParser.class.E7MUJQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.StandardParserConfiguration.class.SEvJDX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.XML11Configuration.class.DHjxy4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.XMLDocumentParser.class.YUbmtb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.XMLGrammarCachingConfiguration.class.BQlboi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.XMLGrammarParser.class.8bCHjp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.XMLGrammarPreparser.class.ltBefw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/parsers/.XMLParser.class.jIfubD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$AugmentationsItemsContainer.class.0WMK7J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$LargeContainer.class.fy054Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$SmallContainer$SmallContainerKeyEnumeration.class.c0as2X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$SmallContainer.class.3zxOZ4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl.class.nQy0Xb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.DOMEntityResolverWrapper.class.jvwdWi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.DOMErrorHandlerWrapper.class.VLP8Up" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.DOMUtil.class.rEtqUw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.DefaultErrorHandler.class.SR0rUD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.EncodingMap.class.DmFuUK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.EntityResolverWrapper.class.1NSVUR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.ErrorHandlerWrapper$1.class.UWTVVY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.ErrorHandlerWrapper.class.X8MWW5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.IntStack.class.fN9LZc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.MessageFormatter.class.62dC2j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.NamespaceSupport$Context.class.SBus5q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.NamespaceSupport.class.TRYi8x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.ObjectFactory$ConfigurationError.class.3l2QbF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.ObjectFactory.class.DVOpfM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.ParserConfigurationSettings.class.9CtsjT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SecuritySupport.class.tw9Ao0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$1.class.AsDKt7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$2.class.jIkUye" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$3.class.E1kpFl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$4.class.We6ULs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12.class.J4arSz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.ShadowedSymbolTable.class.C2rXYG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SymbolHash$Entry.class.RItT6N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SymbolHash.class.4MnQeV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SymbolTable$Entry.class.4fyNm2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SymbolTable.class.sZMbw9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.SynchronizedSymbolTable.class.QZ3AFg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.URI$MalformedURIException.class.aIj1On" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.URI.class.ekLrYu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLAttributesImpl$Attribute.class.Mt6G8B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLAttributesImpl.class.jrFijJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLChar.class.Ys7guQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLGrammarPoolImpl$Entry.class.B7NYFX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLGrammarPoolImpl.class.2PlHR4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLResourceIdentifierImpl.class.23W03b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLStringBuffer.class.UZllgj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/util/.XMLSymbols.class.iOFtuq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.Augmentations.class.5PNCIx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.NamespaceContext.class.OxaMWE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.QName.class.I7KVaM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLAttributes.class.1s39pT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLDTDContentModelHandler.class.VzipF0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLDTDHandler.class.jfKEU7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLDocumentFragmentHandler.class.CvO4bf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLDocumentHandler.class.UCIvtm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLLocator.class.c4EYNt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLResourceIdentifier.class.Fdms8A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XMLString.class.ZdhWsI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/.XNIException.class.1GoqNP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars/.Grammar.class.jmKU7W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars/.XMLGrammarDescription.class.KPbps4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars/.XMLGrammarLoader.class.pvmUMb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars/.XMLGrammarPool.class.MdAaaj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/grammars/.XSGrammar.class.d5Erxq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLComponent.class.SFXIUx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLComponentManager.class.x9m0hF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLConfigurationException.class.g01hFM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDContentModelFilter.class.IpLz2T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDContentModelSource.class.2UJRp1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDFilter.class.OHP9M8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDScanner.class.VXV4dg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDSource.class.r9M0En" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDocumentFilter.class.xpTW5u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDocumentScanner.class.lb6SwC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDocumentSource.class.rKxPXJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLEntityResolver.class.Cc5LoR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLErrorHandler.class.kyKIPY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLInputSource.class.wgEFg6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLParseException.class.VsRNId" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLParserConfiguration.class.htSWal" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/parser/.XMLPullParserConfiguration.class.GsNfGs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/psvi/.AttributePSVI.class.4PEzbA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/psvi/.ElementPSVI.class.LqKTGH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xerces/xni/psvi/.ItemPSVI.class.ksaecP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.BaseMarkupSerializer.class.EJMyHW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.DOMSerializer.class.ZErKd4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.DOMWriterImpl.class.s7PWJb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.ElementState.class.PYaIgj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.EncodingInfo.class.jIguNq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.Encodings.class.VlpYky" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.HTMLEntities.res.ZwntSF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.HTMLSerializer.class.XAbkqN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.HTMLdtd.class.r1VxYU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.IndentPrinter.class.NKZ7w2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.LineSeparator.class.D2RE79" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.Method.class.n5FcIh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.OutputFormat$DTD.class.QlHKip" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.OutputFormat$Defaults.class.QBhjTw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.OutputFormat.class.taYRtE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.Printer.class.f7JL4L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.Serializer.class.Yi6KGT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.SerializerFactory.class.bFcLi1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.SerializerFactoryImpl.class.eHzLU8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.SieveEncodingInfo$BAOutputStream.class.4hldyg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.SieveEncodingInfo.class.GcYFbo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.TextSerializer.class.eqT8Ov" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.XHTMLSerializer.class.FABXsD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xml/serialize/.XMLSerializer.class.rYC86K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/apache/xmlcommons/.Version.class.0YSuMS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Attr.class.ovLSr0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.CDATASection.class.V2Wg77" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.CharacterData.class.nButPf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Comment.class.BBLGxn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.DOMException.class.E68Tfv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.DOMImplementation.class.4IK7XC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Document.class.rGzlGK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.DocumentFragment.class.ZbCzoS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.DocumentType.class.N8LN6Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Element.class.ZoOlP7" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/events" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/events" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/util" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/util" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/io" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/io" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/validation" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/validation" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Entity.class.gAhGBf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.EntityReference.class.aT60nn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.NamedNodeMap.class.C21lav" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Node.class.QHbHWC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.NodeList.class.mUy2IK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Notation.class.iI3nvS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.ProcessingInstruction.class.cUGJh0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/.Text.class.w4p537" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSS2Properties.class.03hrQf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSCharsetRule.class.RxkoHn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSFontFaceRule.class.Xkrmyv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSImportRule.class.wAKkpD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSMediaRule.class.qsajgL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSPageRule.class.MWHh7S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSPrimitiveValue.class.xPzkY0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSRule.class.BWboP8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSRuleList.class.jL0rGg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSStyleDeclaration.class.Nwbwxo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSStyleRule.class.9CAAow" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSStyleSheet.class.MdeFfE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSUnknownRule.class.rsZJ6L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSValue.class.2orD4T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.CSSValueList.class.4GDx21" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.Counter.class.jv3r09" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.DOMImplementationCSS.class.fiImYh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.DocumentCSS.class.TfvhWp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.ElementCSSInlineStyle.class.GEncUx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.RGBColor.class.z5v7RF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.Rect.class.zZL2PN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/css/.ViewCSS.class.Qg9XNV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.DocumentEvent.class.l9DTL3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.Event.class.uPpPJb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.EventException.class.2ThLHj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.EventListener.class.BkoHFr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.EventTarget.class.wkCDDz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.MouseEvent.class.geTfHH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.MutationEvent.class.98YSKP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/events/.UIEvent.class.VcjwOX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLAnchorElement.class.LaI9R5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLAppletElement.class.YvmNVd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLAreaElement.class.lmIrZl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLBRElement.class.krg62t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLBaseElement.class.VdWK6B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLBaseFontElement.class.waKpaK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLBodyElement.class.EQ02hS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLButtonElement.class.J20Gp0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLCollection.class.F4dlx8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLDListElement.class.0XyZEg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLDirectoryElement.class.Zx8DMo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLDivElement.class.NePiUw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLDocument.class.FoDX1E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLElement.class.O6GC9M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLFieldSetElement.class.aFQhhV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLFontElement.class.wVgXo3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLFormElement.class.GkOCwb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLFrameElement.class.8I2CNj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLFrameSetElement.class.7q0D4r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLHRElement.class.lNbFlA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLHeadElement.class.ncCGCI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLHeadingElement.class.qp8HTQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLHtmlElement.class.GUMJaZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLIFrameElement.class.VmHLr7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLImageElement.class.yVHNIf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLInputElement.class.waWPZn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLIsIndexElement.class.SFkntw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLLIElement.class.90WVWE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLLabelElement.class.JFLuqN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLLegendElement.class.MiP3TV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLLinkElement.class.QIZCn4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLMapElement.class.JBocRc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLMenuElement.class.hPTLkl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLMetaElement.class.o1ElOt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLModElement.class.ccyVhC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLOListElement.class.Y1wvLK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLObjectElement.class.kpfArT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLOptGroupElement.class.25LF71" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLOptionElement.class.V6uLNa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLParagraphElement.class.ZktRtj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLParamElement.class.v0xX9r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLPreElement.class.uSQ3PA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLQuoteElement.class.IlhawJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLScriptElement.class.nEPgcS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLSelectElement.class.KgDnS0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLStyleElement.class.pOHoF9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTableCaptionElement.class.D1xqsi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTableCellElement.class.76ssfr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTableColElement.class.TIAu2z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTableElement.class.xrXwPI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTableRowElement.class.3vwzCR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTableSectionElement.class.bj5yz0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTextAreaElement.class.gt0zw9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLTitleElement.class.ZH8Ati" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/html/.HTMLUListElement.class.7juCqr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMBuilder.class.3IXDnA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMBuilderFilter.class.mcEFkJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMEntityResolver.class.90yHhS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMImplementationLS.class.T7AJe1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMInputSource.class.zFUffa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMWriter.class.6FWMfj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DOMWriterFilter.class.Z7bkgs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.DocumentLS.class.1AFRgB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.LSLoadEvent.class.Y4gphK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.LSProgressEvent.class.oS6WhT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ls/.ParseErrorEvent.class.pY4ui2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ranges/.DocumentRange.class.OAa3ib" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ranges/.Range.class.twnBjk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/ranges/.RangeException.class.2LNMnt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets/.DocumentStyle.class.m8YYrC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets/.LinkStyle.class.5UpbwL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets/.MediaList.class.ntWnAU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets/.StyleSheet.class.Z6AAE3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/stylesheets/.StyleSheetList.class.PTuNIc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/traversal/.DocumentTraversal.class.fSv0Ml" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/traversal/.NodeFilter.class.dgLdRu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/traversal/.NodeIterator.class.g45qVD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/traversal/.TreeWalker.class.gZH32M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/views/.AbstractView.class.r9aHaW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/w3c/dom/views/.DocumentView.class.tfLki5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.AttributeList.class.tnzYpe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.Attributes.class.HPtCxn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.ContentHandler.class.ufDgFw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.DTDHandler.class.dHSUMF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.DocumentHandler.class.mWnzUO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.EntityResolver.class.GAZd2X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.ErrorHandler.class.gSPS96" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.HandlerBase.class.hCmUjg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.InputSource.class.RCDWtp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.Locator.class.0a6YDy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.Parser.class.xzN1NH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.SAXException.class.lCC4XQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.SAXNotRecognizedException.class.Zd90a0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.SAXNotSupportedException.class.YWrYn9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.SAXParseException.class.JCXVAi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.XMLFilter.class.fiFTNr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/.XMLReader.class.nuuR0A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/ext/.DeclHandler.class.WnxPdK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/ext/.LexicalHandler.class.1SGNqT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.AttributeListImpl.class.kbyAE2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.AttributesImpl.class.p1doSb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.DefaultHandler.class.lvrh7k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.LocatorImpl.class.pmubmu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.NamespaceSupport$Context.class.w6d6AD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.NamespaceSupport.class.QAwlQM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.NewInstance.class.tEhz6V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.ParserAdapter$AttributeListAdapter.class.xlcOm5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.ParserAdapter.class.RHB3Ce" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.ParserFactory.class.fl03Tn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.XMLFilterImpl.class.Oqe5ax" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.XMLReaderAdapter$AttributesAdapter.class.46NLsG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.XMLReaderAdapter.class.mz6sKP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/org/xml/sax/helpers/.XMLReaderFactory.class.7JAw2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/Java/.wojavaclient.jar.KZq7m8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.AppleLogo.gif.ANGhmi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonAddInstance.gif.h7Rsls" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonConfig.gif.lYAHkC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonDelete.gif.atPWjM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonDetailView.gif.gL0AmW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonRefresh.gif.vipgp6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonWOStats.gif.hujZrg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonWOStatsOff.gif.zLuIuq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.DirectoryIcon.gif.SuN64A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_Off.gif.fURvFL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_Off_Yellow.gif.049UfW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_On_Green.gif.ihHkQ6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_On_Yellow.gif.PbQKqh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PathWizard.gif.sRcb1r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PowerSwitch_Off.gif.8jMBBC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PowerSwitch_On.gif.JK2XcN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PoweredByWebObjects.gif.UlplOX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.TransparentPixel.gif.fq3qq8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Turning_Off.gif.C7tx2i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Turning_On.gif.Klc0Et" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.applications_bar.gif.hznOhE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.applications_tab_active.gif.1TQmVO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.applications_tab_inactive.gif.YlgWyZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.background.gif.HgBqea" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.help_bar.gif.DfOVTk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.help_tab_active.gif.c39Mzv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.help_tab_inactive.gif.SBsggG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.hosts_bar.gif.TiyKWQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.hosts_tab_active.gif.TK1DF1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.hosts_tab_inactive.gif.bIwUoc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.preferences_bar.gif.SOwg9m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.preferences_tab_active.gif.utvDTx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.preferences_tab_inactive.gif.oU7lEI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.site_bar.gif.rIorpT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.site_tab_active.gif.vC2fb4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.site_tab_inactive.gif.JH05We" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.start.gif.Hf6FJp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.stop.gif.pZ0gwA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.apache_pb.gif.lDcyjL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.apple_stylesheet_overrides.css.ozmQ6V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.base_layout.css.QYeuU6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.error.html.cbivIh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.favicon.ico.Gj5Sws" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.grayline.gif.kAq0lD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.grayx.jpg.1Tr8aO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.YXVB0Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ca.F9wrQ9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.cn.maWmHk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.cz.R65iyv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.de.SDyfpG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.dk.gOnUgR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ee.bP3z81" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.el.3NAY0c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.en.poZnTn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.es.0y3eNy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.fr.wxY6GJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.he.iso8859-8.IWcZAU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.hu.ofizv5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.it.xPKSqg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ja.jis.t21cmr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.kr.iso-kr.7aGfiC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.lb.utf8.887ieN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.nl.1ZY4aY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.nn.0wxR78" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.no.gq9I5j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.po.iso-pl.TbvB3u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.pt.krCu1F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.pt-br.Wwt5ZQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.cp-1251.2lbHY1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.cp866.hOkl0c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.iso-ru.8Ho01n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.koi8-r.eNLF3y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.ucs2.brVF5J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.ucs4.7vN27U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.ru.utf8.IncNa6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.se.nK1Ceh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.index.html.zh-tw.big5.BDCtis" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.info.php.G5okmD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.logo.gif.giJ1qO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.main.css.daSJvZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.osxserver.gif.bcjNAa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.poweredbymacosxserver.gif.mpw2Hl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.template.spotlight.vzsiPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.test.php.3ZIyWH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.v5_background_link.jpg.2q5O3S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.v5_background_linkhover.jpg.rRuac4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.v5_background_main.jpg.mmTwkf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/.v5_background_top.jpg.YqrTsq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/weblog/default/.index.html.f37jCB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/weblog/.index.html.WiDLLM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/webmail/.index.html.jv3JYX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents.OLD/webmail/src/.index.html.4PAJb9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/..DS_Store.a9xJok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/..cdtproject.MVymOv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/..lock.vtk0dH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/..log.ModEDS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/.properties.index.veEq63" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.plugins/org.eclipse.core.runtime/.settings/.org.eclipse.ui.prefs.MpVdzf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.metadata/.version.ini.hZR11q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/..project.KD1PuC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/CalendarControl/.CalendarControl.css.8djEXN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/CalendarControl/.CalendarControl.js.oC7MqZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/CalendarControl/.CalendarControl_O.js.uUUiUa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.CalendarPopup.js.kdkEqm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.EOMreport.php.xxiFXx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.EOMreport.php_orig.xBqkvJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.EOMreportNov.php.Tytn3U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.EOMreportTest.php.ZxLUB6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.EOMreportXL.php.nEwOai" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.AddEmp.php.6S2pKt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.AddEmpInsertBack.php.Abk2jF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.AddEmpInsertBack.php~.LfDYUQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.ChooseEmpName.php.XUDVv2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.EmpInfo.php.VQRS6d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.EmpIntHome.php.yIjQHp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.ViewEmp.php.8qk6lB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.deleteEmp.php.uVen0M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.deleteqry.php.kolEEY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.employees.inc.gYhQka" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.employees.inc~.Ar520l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.index.php.padgHx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.insertqry.php.j8qtnJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.overshort.php.1jTG3U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/FE/.overshortSingleEmp.php.18JwK6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.Mreport.php.3DXNri" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.accountAdjust.php.K08q9t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.apache_pb.gif.NmQNRF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.apache_pb.png.e1fbAR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.apache_pb2.gif.CjNgj3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.apache_pb2.png.yJan2e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.apache_pb2_ani.gif.DsnaNq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.ar_report.php.GjjZxC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/doc/.index.html.TjsOiO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.groups.php.0Rc13Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.login.php.OrGxPb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.login.php~.wPZqBn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.loginform.php~.qREGnz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.privileges.php.y92MaL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.privileges.php~.68lUXW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.addAuth.php.YxtnL8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.addAuth.php~.qxXiAk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.addGroup.php.f9ffpw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.addGroupAuth.php.bOMbeI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.addGroupUser.php.qwx82T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.changepass.php.st2CU5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.changepass.php~.rum8Lh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.createUser.php.RF0DDt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.createUser.php~.2xsRvF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteAuth.php.qHM5nR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteAuth.php~.kiLUg3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteGroup.php.KGzK9e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteGroupAuth.php.gfDR5q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteGroupUser.php.GRwZ1C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteUser.php.HsC7XO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.deleteUser.php~.gn1GV0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.groupDetail.php.FwdhTc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.index.php.wPDRQo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.loginform.php.cwbsOA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.loginform.php~.vO9oQM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.menu.php.S16mSY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.menu.php~.ICflUa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.resetUserPassword.php.RuBjWm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.viewAuths.php.Be9W0y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.viewAuths.php~.OvsB5K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.viewGroups.php.TJrgaX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.viewUsers.php.GuFVe9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/ui/.viewUsers.php~.V00Ajl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/auth/.utilities.php.01Agox" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.calendar.php.7JgWsJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.AUTHORS.KYRVxV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.COPYING.SeniD7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.README.H1F3Ij" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.TIMEZONES.qb69Ov" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/admin/.index.php.c2FZVH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars/..DS_Store.mcrq3T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars/.Payroll.ics.HikAb6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars/.US Holidays.ics.60fLji" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars/.chris.ics.uGaFsu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars/.publish.ical.php.X5NzBG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/calendars/.publish.mozilla.php.IjPPKS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.config.inc.php.FYQsU4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.day.php.lBjs4g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.admin_functions.php.YxEVet" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.calendar_functions.php.UYBLpF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.date_functions.php.wLeYAR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.draw_functions.php.ShPUM3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.error.php.e2dSYf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.event.js.dsSGbs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.ical_parser.php.zEtwoE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.init.inc.php.3WpWBQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.list_functions.php.XY92P2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.overlapping_events.php.EnUv4e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.template.php.dXODjr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.timezones.php.t40wzD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.upload_functions.php.bwwZPP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/functions/.userauth_functions.php.9xmt61" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.cancelled.gif.eu4moe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.completed.gif.pxxhGq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.confirmed.gif.n26bYC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.important.gif.10N6fP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.not_completed.gif.05BzG1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.phpical-logo.gif.Vye36d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.recurring.gif.BF9wxq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.spacer.gif.ajc1XC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.tentative.gif.thuvoP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/images/.valid-rss.png.ns8ZO1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/includes/.event.php.HLn1fe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/includes/.login.php.oXz3Gq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/includes/.todo.php.o39a9C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.index.php.1ibkBP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.brazilian.inc.php.Flpt31" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.catalan.inc.php.ZxFZve" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.czech.inc.php.5EpYYq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.danish.inc.php.Yy0jsD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.dutch.inc.php.Nzj2VP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.english.inc.php.1RI7p2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.esperanto.inc.php.q7EBUe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.finnish.inc.php.kDxppr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.french.inc.php.cjYzUD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.german.inc.php.81S0pQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.italian.inc.php.DiNOV2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.japanese.inc.php.rutXrf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.korean.inc.php.6ugtYr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.lithuanian.inc.php.MNLlvE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.norwegian.inc.php.ZHTB2Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.polish.inc.php.uImdA3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.portuguese.inc.php.u0dc8f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.spanish.inc.php.8WDxGs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.swedish.inc.php.ZYcofF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/languages/.traditional_chinese.inc.php.ujYTQR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.month.php.vu17s4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.preferences.php.3dvI5g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.print.php.P1AFIt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/rss/.index.php.luoknG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/rss/.rss.php.iWB01S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.search.php.KT41G5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.admin.tpl.a2s6oi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.calendar_nav.tpl.VAdx7u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.day.tpl.0qtkQH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.default.css.nAdvzU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.error.tpl.gYi2i7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.event.tpl.GIRE3j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.footer.tpl.OSfiOw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.header.tpl.iQQVyJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_1.gif.sI2YqW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_2.gif.wff3i9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_3.gif.ykw7am" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_4.gif.GA3b3y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_5.gif.boIgVL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_6.gif.qQQlNY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_7.gif.6vdrFb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_bg.gif.IwHwxo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.allday_dot.gif.8jjCpB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.back.gif.F71HhO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.day_on.gif.ZcCO90" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.day_title.gif.wBiV1d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.download_arrow.gif.PNi3Tq" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/psvi" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/psvi" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xmlcommons" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xmlcommons" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ranges" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ranges" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/traversal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/traversal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/views" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/views" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/ext" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/ext" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/ADOdb" -> "ADOdb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/contrib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/contrib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.event_dot.gif.UMt4VD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.left_arrows.gif.NGt6XQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.left_day.gif.WCH8Z3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.month_on.gif.ry1a2g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_1.gif.7z4d4t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_2.gif.gQdh6G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_3.gif.Lcuk8T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_4.gif.nrTna7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_5.gif.Jpyrck" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_6.gif.xIlvex" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.monthdot_7.gif.AqizgK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.printer.gif.5QlDiX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.right_arrows.gif.5uwHka" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.right_day.gif.KDOLmn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.search.gif.C8mQoA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.shadow_l.gif.cw3UqN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.shadow_m.gif.wKQZs0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.shadow_r.gif.9fM4ud" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.side_bg.gif.kgR9wq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.smallicon.gif.2K2ezD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.spacer.gif.8knkBQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.time_bg.gif.zpgEF3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.week_on.gif.UleZJg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/images/.year_on.gif.e0pkOt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.month.tpl.7hIFSG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.month_large.tpl.q2s5WT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.month_medium.tpl.GPKv16" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.month_small.tpl.l5FJ9j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.preferences.tpl.BjxYhx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.print.tpl.zoNhqK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.rss_index.tpl.DpnezX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.search.tpl.Iy3eIa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.sidebar.tpl.7c6zRn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.todo.tpl.5KBE1A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.week.tpl.bR9JbO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/templates/default/.year.tpl.TtFom1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.week.php.O927we" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/calendar/.year.php.gPDxIr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.cash_report.php.q49XTE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.cheatSheet.php.bLF2bS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.connect.php.X5f8t5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.custCount.php.lWVdMi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.date.php.f1Vj4v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.datediff.php.R42pmJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.2.iDLAEW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.addEmp.php.TL5RY9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.addEmp.php~.C1RSjn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.contact.php.hvrUEA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.edit.php.7kDh0N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.empContact.php.Bs7do1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.employee.php.2glbMe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.finalPTO.html.H3sQas" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.finalPTO.php.s4wwzF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.index.php.ocarYS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.logo.gif.hjyHn6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.logo_smaller.gif.V08nNj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.print_emp.php.Qomodx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.status.php.Uiz7DK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/emp/.styles.css.VmtR4X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.empl_import.php.wcXAxb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.favicon.ico.n6Hl0o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/finance/.tenderReport.php.ObI6sC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/finance/.upload.html.m1VRVP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/..example.php.swo.f3hDo3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/..example.php.swp.TrC4Rg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.acceptpagebreak.htm.lUxdmu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.addfont.htm.UuhnQH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.addlink.htm.4EwulV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.addpage.htm.37wCQ8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.aliasnbpages.htm.qfQKlm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.cell.htm.A40ARz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.close.htm.323rnN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.error.htm.RlyoU0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.footer.htm.BDNlre" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.fpdf.htm.rUcjYr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.getstringwidth.htm.0yhIwF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.getx.htm.ly874S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.gety.htm.MadyD6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.header.htm.1XmYbk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.image.htm.1CVTNx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.index.htm.JChQpL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.line.htm.jt4u2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.link.htm.BfGaFc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.ln.htm.XUgViq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.multicell.htm.oaDGWD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.output.htm.xmfsAR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.pageno.htm.pXBqf5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.rect.htm.G4BpUi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setauthor.htm.rjWozw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setautopagebreak.htm.jMLcgK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setcompression.htm.7bl1WX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setcreator.htm.dRdQDb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setdisplaymode.htm.IicFkp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setdrawcolor.htm.JYbx3C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setfillcolor.htm.0RTpMQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setfont.htm.NScGz4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setfontsize.htm.UbnXmi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setkeywords.htm.t2rgaw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setleftmargin.htm.qu2zXJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setlinewidth.htm.V9OTKX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setlink.htm.3QPdyb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setmargins.htm.V4znop" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setrightmargin.htm.X7myeD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setsubject.htm.iomJ4Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.settextcolor.htm.REyUU4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.settitle.htm.FYK9Ki" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.settopmargin.htm.2supBw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setx.htm.NxqFrK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.setxy.htm.VRzVhY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.sety.htm.CQFU9b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.text.htm.wDFU1p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/doc/.write.htm.wJYUTD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/.example.php.anTVLR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/.faq.htm.NIZWD5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.SBd_____.afm.eE24wj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.SBd_____.pfb.0LZWqx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.SBd_____.php.zirUlL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.SRg_____.afm.5utTgZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.SRg_____.pfb.d4Pchd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.SRg_____.php.ajaair" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.ScSBd___.afm.9imqjF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.ScSBd___.pfb.HwadlT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.ScSBd___.php.qMHDn7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.ScSRg___.afm.D0Rlql" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.ScSRg___.pfb.aAdCtz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.ScSRg___.php.WcqrxN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.courier.php.alMYB1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.helvetica.php.SDMwGf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.helveticab.php.FxLFLt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.helveticabi.php.OEEPQH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.helveticai.php.3KclWV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.ScSBd___.afm.3ITn59" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.ScSBd___.pfb.yWbnho" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.ScSBd___.php.0kvXtC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.ScalaSanReg.ttf.RlzOKQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1250.map.o1X544" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1251.map.8ITGpj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1252.map.LhVEKx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1253.map.zAeZ5L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1254.map.Hz7Fr0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1255.map.NTGJNe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1257.map.81b39s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp1258.map.GYnOxH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.cp874.map.F8ZVVV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-1.map.Jzuqka" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-11.map.hcrhJo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-15.map.OdJv8C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-16.map.BU5jzR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-2.map.loCu05" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-4.map.Z7Z1rk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-5.map.PONVTy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-7.map.Hia5lN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.iso-8859-9.map.4hUAO1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.koi8-r.map.INothg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.koi8-u.map.E4WHKu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.makefont.php.BBEjeJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/makefont/.scala.php.j7XHIX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.symbol.php.Zn36cc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.times.php.1o5aIq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.timesb.php.Gs0fdF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.timesbi.php.NII1JT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.timesi.php.8B29g8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/font/.zapfdingbats.php.guHEOm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/.fpdf.css.8nv1mB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/.fpdf.php.AafpVP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/.histo.htm.9Ajpu4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/.install.txt.6tC16i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.20k_c1.txt.AYEEJx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.20k_c2.txt.miKDmM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.calligra.afm.rNLZZ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.calligra.php.6FAKDf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.calligra.ttf.IS09ju" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.calligra.z.mauk1I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.countries.txt.X8UPMX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.index.htm.506lyc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.logo.png.EpxSjr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.logo_pb.png.zcxJ5F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.makefont.php.gTWaTU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto1.htm.FI1CG9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto1.php.YlINuo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto2.htm.oirZiD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto2.php.j0bU7R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto3.htm.fZUPW6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto3.php.97v6Ll" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto4.htm.z8fJBA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto4.php.n1p7rP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto5.htm.IwBwi4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto5.php.tXUE9i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto6.htm.wKJO0x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto6.php.ufcFSM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto7.htm.5AEwK1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/fpdf/tutorial/.tuto7.php.RNuQDg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.freetds.php.Fnbcxv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.full.php.ekeyqK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.functions.php.1owUjZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/gif/.l_arrow.gif.bLfiee" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/gif/.r_arrow.gif.XnKG8s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/gif/.r_hand.gif.PBt52H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/gif/.u_arrow.gif.YnSVYW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/goals/.index.php.SbfNUb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.graph.php.KCYEQq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.ecrgvqwlpthtgmiudnmggoalsdaily.png.LaHQSF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.ehwkovucerxgwhwpjrlucash_report_0.png.g0aA6U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.ehwkovucerxgwhwpjrlucash_report_1.png.9nskka" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.ehwkovucerxgwhwpjrlucash_report_2.png.PiR7zp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.ehwkovucerxgwhwpjrlucash_report_3.png.og6VPE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.ehwkovucerxgwhwpjrlucash_report_4.png.j3wK5T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.pjzqgwnycbyzsrgzrzfe_weekly_0.png.IlOxq9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.pjzqgwnycbyzsrgzrzfe_weekly_percent_0.png.DLCKOo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.xavbdkkmylanzblwmhafcash_report_0.png.xJUCkE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.xavbdkkmylanzblwmhafcash_report_1.png.qLWvQT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.xavbdkkmylanzblwmhafcash_report_2.png.1Spyr9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.xavbdkkmylanzblwmhafcash_report_3.png.TyMB2o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/image_area/.xavbdkkmylanzblwmhafcash_report_4.png.t7lFDE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.WFCLogoCThru1.gif.LegJeU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.WFCLogoCThru1.jpg.F9CiS9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.WFCLogoCThru1.png.xK9uDp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches1.png.NZM1sF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches10.png.4SrekV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches11.png.NeA3bb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches12.png.nXKs4q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches13.png.6wifXG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches14.png.EllCQW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches15.png.LmclKc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches16.png.L0ErEs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches17.png.rx3UyI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches18.png.BqiqwY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches19.png.AOiiue" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches2.png.Hzolvu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches20.png.VjkLwK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches21.png.vIEwy0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches22.png.FilGAg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches3.png.xoHRFw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches4.png.pHOELM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches5.png.Ey2NR2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches6.png.i6sjYi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches7.png.qV4a5y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches8.png.VmbpcP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.batches9.png.MKd2j5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.deliQ1.png.nOdwsl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.deliQ2.png.hI2sDB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.deliQ3.png.mXM0OR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.deliQ4.png.HESg17" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.deliQ5.png.RGz9do" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.deliQ6.png.8wpOtE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.locked.gif.QLZpNU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.prodList1.png.mly26a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.prodList2.png.LsTtrr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.prodList3.png.Vx9DMH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.prodList4.png.Ozf98X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/images/.prodList5.png.qaJuwe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.index.html.UKCOUu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ca.grg9iL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.cz.iso8859-2.E8N8H1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.de.og786h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.dk.y3iNzy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ee.dAUs2O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.el.SW4cw5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.en.qlXXZl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.es.MaaJtC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.et.cIzcYS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.fr.ZgIGs9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.he.iso8859-8.A2AwXp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.hr.iso8859-2.FhNstG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.it.8GQpZW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ja.iso2022-jp.gM4mvd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ko.euc-kr.9D611t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.lb.utf8.O0VHyK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.nl.SHo650" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.nn.gkIvDh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.no.m0Jmcy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.po.iso8859-2.7DyeLO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.pt.3Zy6j5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.pt-br.jfJGTl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ru.cp-1251.H6MhtC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ru.cp866.uwMX3S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ru.iso-ru.68BEE9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ru.koi8-r.0VDlfq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.ru.utf8.FG3KQG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.sv.c5ebsX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.var.AjVj4d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.zh-cn.gb2312.OrBtGu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/index_lang/.index.html.zh-tw.big5.RVUqpL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.EOMreport.php.H1jp81" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/SPINS/.perl_freetds_sample.pl.4E7xSi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/SPINS/.test.php.eBLHCz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/SPINS/.testData.php.kZBRmQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.3.n69166" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.3.php.agkHRn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.batchList.php.2YW5CE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.batches.php.jqrvoV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.display.php.CGXCac" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.force.php.RIpLWs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.forceBatch.php.m60sKJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.forceBatch.phpwe.eEgby0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.index.php.ooJTlh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.new.php.8mpC9x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.newBatchEdit.php.9gc3XO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.price_compare.js.9FLuM5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.price_compare.php.BdiiBm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.price_update.php.2MlDtD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/UNFI/.test.php.fnpZlU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.addShelfTag.php.LPv3eb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.addShelfTag.php~.axw87r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.addShelfTag1.php.Szp31I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.addShelfTag1.php~.Nv4YVZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adjust/.additem.php.kFPmRg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adjust/.index.js.Ln5lNx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adjust/.index.php.8ohmJO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.ADOdb.ho8GP5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-active-record.inc.php.Cm02Vm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-csvlib.inc.php.swzK2D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-datadict.inc.php.sazO9U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-error.inc.php.NHrihc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-errorhandler.inc.php.3ZB5ot" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-errorpear.inc.php.mP2BxK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-exceptions.inc.php.Jyh9F1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-iterator.inc.php.27JxPi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-lib.inc.php.eDnXYz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-pager.inc.php.lSUX8Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-pear.inc.php.2V3ij8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-perf.inc.php.QEcaup" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-php4.inc.php.71n9FG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-time.inc.php.vtC9RX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-xmlschema.inc.php.bhWZ4e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb-xmlschema03.inc.php.z52Giw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.adodb.inc.php.eiZIxN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/contrib/.toxmlrpc.inc.php.d6UEO4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/cute_icons_for_site/.adodb.gif.yMSo7l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/cute_icons_for_site/.adodb2.gif.t3uUtD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-access.inc.php.FD2qQU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-db2.inc.php.oIQXcc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-firebird.inc.php.HGgQzt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-generic.inc.php.gIt5WK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-ibase.inc.php.57Zfn2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-informix.inc.php.bJprNj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-mssql.inc.php.7GyZdB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-mysql.inc.php.eZHWES" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-oci8.inc.php.jcOc69" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-postgres.inc.php.BSSPxr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-sapdb.inc.php.1eSSZI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/datadict/.datadict-sybase.inc.php.3oufs0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.docs-active-record.htm.9czYUh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.docs-adodb.htm.DBYsrz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.docs-datadict.htm.3i0E1Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.docs-oracle.htm.WVfrC8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.docs-perf.htm.XlIXdq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.docs-session.htm.fcz5PH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.old-changelog.htm.XY5HsZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.readme.htm.pauh6g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.tips_portable_sql.htm.eaGdKy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/docs/.tute.htm.q4myoQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-access.inc.php.97Zc37" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-ado.inc.php.xtVeIp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-ado5.inc.php.9q4EnH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-ado_access.inc.php.42ht3Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-ado_mssql.inc.php.X4oWJg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-borland_ibase.inc.php.HPrqqy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-csv.inc.php.Wtbg7P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-db2.inc.php.uitOP7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-fbsql.inc.php.4ftJyp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-firebird.inc.php.JPboiH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-ibase.inc.php.O1631Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-informix.inc.php.o78jMg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-informix72.inc.php.zePXwy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-ldap.inc.php.Upj4hQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-mssql.inc.php.UQvH37" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-mssqlpo.inc.php.bNwUPp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-mysql.inc.php.XdduCH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-mysqli.inc.php.ktT4pZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-mysqlt.inc.php.vGneeh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-netezza.inc.php.IKGJ2y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-oci8.inc.php.VzsKRQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-oci805.inc.php.akspH8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-oci8po.inc.php.z2Cnxq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-odbc.inc.php.S6pEqI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-odbc_db2.inc.php.VGdik0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-odbc_mssql.inc.php.9nqhei" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-odbc_oracle.inc.php.edrD8z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-odbtp.inc.php.nE4l3R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-odbtp_unicode.inc.php.fvxPY9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-oracle.inc.php.7QUkUr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-pdo.inc.php.S5qYRJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-pdo_mssql.inc.php.uHflQ1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-pdo_mysql.inc.php.ChJIOj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-pdo_oci.inc.php.wSqONB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-pdo_pgsql.inc.php.AEfVMT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-postgres.inc.php.uZSTMb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-postgres64.inc.php.DJDTMt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-postgres7.inc.php.OMCtNL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-postgres8.inc.php.jjW7O3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-proxy.inc.php.iBbNQl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-sapdb.inc.php.pQ5sSD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-sqlanywhere.inc.php.WAWtUV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-sqlite.inc.php.F4yRWd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-sqlitepo.inc.php.QRTBZv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-sybase.inc.php.T9zI2N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-sybase_ase.inc.php.dKyhc6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/drivers/.adodb-vfp.inc.php.fqvRlo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-ar.inc.php.skLjzG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-bg.inc.php.LjJMMY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-bgutf8.inc.php.W2zB0g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-ca.inc.php.gaShfz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-cn.inc.php.uDXYtR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-cz.inc.php.s4loJ9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-da.inc.php.qMDOYr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-de.inc.php.QTNWeK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-en.inc.php.oHU5u2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-es.inc.php.cWDBLk" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear/Auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear/Auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/cal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/cal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/contrib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/contrib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/cute_icons_for_site" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-esperanto.inc.php.Brgf3C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-fr.inc.php.eknTkV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-hu.inc.php.7RFxCd" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear/Auth" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear/Auth" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear/Auth/Container" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/old" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/old" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-it.inc.php.HmpRUv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-nl.inc.php.yE5bdO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-pl.inc.php.AS3vz6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-pt-br.inc.php.U27QVo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-ro.inc.php.GdAfiH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-ru1251.inc.php.TwiEEZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-sv.inc.php.MVu93h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/lang/.adodb-uk1251.inc.php.4GSFtA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.license.txt.EghdTS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear/Auth/Container/.ADOdb.php.n1sGlb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/pear/.readme.Auth.txt.qSZ4Ot" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf/.perf-db2.inc.php.gIzuiM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf/.perf-informix.inc.php.eqEYL4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf/.perf-mssql.inc.php.VSNLin" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf/.perf-mysql.inc.php.OHQAPF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf/.perf-oci8.inc.php.Z5bmpY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/perf/.perf-postgres.inc.php.KmWvZg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.pivottable.inc.php.f1u9Cz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.readme.txt.f0aeiS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.rsfilter.inc.php.WHRjXa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.server.php.0SotCt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-compress-bzip2.php.44uDhM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-compress-gzip.php.lyBxY4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-cryptsession.php.CgAsFn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-encrypt-mcrypt.php.DKLnmG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-encrypt-md5.php.dCJ55Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-encrypt-secret.php.hQXOPh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-encrypt-sha1.php.FYkzzA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-sess.txt.8RTjjT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-session-clob.php.5in52b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-session.php.Pp3QMu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-sessions.mysql.sql.tqAdAN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-sessions.oracle.clob.sql.e14An6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.adodb-sessions.oracle.sql.o20Yap" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.crypt.inc.php.mMZnYH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/old/.adodb-cryptsession.php.FxdNL0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/old/.adodb-session-clob.php.c5Hxzj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/old/.adodb-session.php.48OFnC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/old/.crypt.inc.php.RgkVeV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/session/.session_schema.xml.7IYe6d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.benchmark.php.VSSyXw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.client.php.Cp6SOP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.pdo.php.CctmH8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.rr.htm.K8ERzr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-active-record.php.2NpmtK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-active-recs2.php.Or3Rm3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-datadict.php.TtiUgm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-perf.php.HyZ1aF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-pgblob.php.ZOMa7X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-php5.php.dgUk3g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test-xmlschema.php.jSUvZz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test.php.12qHVS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test2.php.uTn6Sb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test3.php.jr2vQu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test4.php.oE0VNN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test5.php.6QwJM6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.test_rs_array.php.ZwkyLp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testcache.php.x7yoKI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testdatabases.inc.php.KtbfJ1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testgenid.php.3FAIKk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testmssql.php.neOcMD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testoci8.php.cO3KNW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testoci8cursor.php.CoMjPf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testpaging.php.7Ms7Ry" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testpear.php.erFZUR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.testsessions.php.zBoSXa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.time.php.ICqL0t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.tmssql.php.BUQU9M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.xmlschema-mssql.xml.QP44i6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/tests/.xmlschema.xml.tJufsp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.toexport.inc.php.iaLqBI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.tohtml.inc.php.GskXK1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.xmlschema.dtd.WeBVVk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/.xmlschema03.dtd.qAhV6D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl/.convert-0.1-0.2.xsl.FmqVhX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl/.convert-0.1-0.3.xsl.x708sg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl/.convert-0.2-0.1.xsl.cZvJEz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl/.convert-0.2-0.3.xsl.M5KGQS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl/.remove-0.2.xsl.HSnJ3b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/adodb/xsl/.remove-0.3.xsl.QDRMgv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.backOutReceipt.php.6uwQtO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/backup_status/.index.php.7QpDH7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.banner.gif.EUqrVq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.banner.jpg.VuQ49J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.barcodenew.php.bupJo3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/..addItems.php.swp.cxlEGm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/..batches.php.swo.nNxXYF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/..batches.php.swp.9PUBhZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/CalendarControl/.CalendarControl.css.Ok6mFi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/CalendarControl/.CalendarControl.js.IG892B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/CalendarControl/.CalendarControl_O.js.CsihrV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.addBat_orig.php.DIh8Pe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.addBatch.php.eY7Zey" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.addItems.php.TFXcER" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.addItems.php~.MmxM3a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.batchTest.php.eBbHuu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.batcher.php.OhFCVN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.batcher.php~.JRgym7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.batches.php.fUZtNq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.batches.php~.qkdLeK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.batches_orig.php.7JzpG3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.calendar.html.ZVkw9m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.deleteBatch.php.8fRDCG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.deleteBatch.php~.3gAL5Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.display.php.9fxTyj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.forceBatch.php.1Yvo2C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.index.php.4NmUvW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.index.php~.MefZZf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.index_orig.php.a0LTvz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.reloadShelfTag.php.jSfP1S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.session.php.ig5Kxc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.testAlert.php.itaH3v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/batches/.testFunct.php.DvnDzP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.cancel.php.74aL68" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/cards/.index.php.QvLTDs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/cash_tenders/.genReport.php.y6C2aM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/cash_tenders/.genReport.php~.T6yTI5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.chrgeFix.php.E2N6gp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.computers.php.0UeeTI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/computers/.index.css.ILVmv2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/computers/.index.js.T1ow7l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/computers/.index.php.Dny0JF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.ADOdb.R1SLpZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-active-record.inc.php.NsAA5i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-csvlib.inc.php.HtVILC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-datadict.inc.php.zWefsW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-error.inc.php.SKfWbg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-errorhandler.inc.php.F0zXVz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-errorpear.inc.php.jy5HGT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-exceptions.inc.php.1Qptrd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-iterator.inc.php.WCP6cx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-lib.inc.php.G9gLYQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-pager.inc.php.WBz0Ka" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-pear.inc.php.URmAxu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-perf.inc.php.BSzGkO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-php4.inc.php.Dr9T87" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-time.inc.php.XYP8Wr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-xmlschema.inc.php.oLvdML" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb-xmlschema03.inc.php.7uk9B5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.adodb.inc.php.5Yyktp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/contrib/.toxmlrpc.inc.php.DxOWoJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/cute_icons_for_site/.adodb.gif.SOQHn3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/cute_icons_for_site/.adodb2.gif.YfWtmn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-access.inc.php.iZxXlH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-db2.inc.php.2T2rl1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-firebird.inc.php.FGyill" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-generic.inc.php.1Q8ClF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-ibase.inc.php.sM8mpZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-informix.inc.php.CBt8sj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-mssql.inc.php.cKcUwD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-mysql.inc.php.1gI0AX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-oci8.inc.php.1wuuFh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-postgres.inc.php.viYkKB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-sapdb.inc.php.RbJAPV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/datadict/.datadict-sybase.inc.php.oJmQXf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.docs-active-record.htm.JfA98z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.docs-adodb.htm.VrtxpU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.docs-datadict.htm.33e5Le" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.docs-oracle.htm.ip958y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.docs-perf.htm.yLXQwT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.docs-session.htm.vXlcVd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.old-changelog.htm.G111jy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.readme.htm.rjpOJS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.tips_portable_sql.htm.GmxC9c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/docs/.tute.htm.kwtaAx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-access.inc.php.3sTq1R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-ado.inc.php.G8rIsc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-ado5.inc.php.FZSlUw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-ado_access.inc.php.KxJJmR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-ado_mssql.inc.php.Dqp8Ob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-borland_ibase.inc.php.T0iPhw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-csv.inc.php.VDQSKQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-db2.inc.php.PQMqeb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-fbsql.inc.php.TXHlIv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-firebird.inc.php.XKt0cQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-ibase.inc.php.FYnGHa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-informix.inc.php.gFGEev" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-informix72.inc.php.gF4DLP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-ldap.inc.php.hkvZia" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-mssql.inc.php.B5SOQu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-mssqlpo.inc.php.sm1CpP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-mysql.inc.php.57fsY9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-mysqli.inc.php.yeJLxu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-mysqlt.inc.php.WL5taP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-netezza.inc.php.gYrdN9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-oci8.inc.php.TycQsu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-oci805.inc.php.J7BO9O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-oci8po.inc.php.YpPNQ9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-odbc.inc.php.gCb7xu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-odbc_db2.inc.php.L6oOfP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-odbc_mssql.inc.php.xvFQX9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-odbc_oracle.inc.php.2GgCGu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-odbtp.inc.php.t1hppP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-odbtp_unicode.inc.php.xyOz89" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-oracle.inc.php.QtFjSu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-pdo.inc.php.VkjqCP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-pdo_mssql.inc.php.5iCina" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-pdo_mysql.inc.php.LxLb8u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-pdo_oci.inc.php.GPtnTP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-pdo_pgsql.inc.php.h7K6Ha" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-postgres.inc.php.KgnIxv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-postgres64.inc.php.LeQknQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-postgres7.inc.php.bt5xdb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-postgres8.inc.php.MoMP4v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-proxy.inc.php.Fyp8VQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-sapdb.inc.php.A0drNb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-sqlanywhere.inc.php.NDi5Ew" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-sqlite.inc.php.kxn5wR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-sqlitepo.inc.php.WHaRpc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-sybase.inc.php.f2XDix" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-sybase_ase.inc.php.d4oKbS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/drivers/.adodb-vfp.inc.php.Iw8c5c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-ar.inc.php.CZGZ0x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-bg.inc.php.PskNWS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-bgutf8.inc.php.hwmFTd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-ca.inc.php.DAiyQy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-cn.inc.php.RLahOT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-cz.inc.php.we50Le" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-da.inc.php.4rvtKz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-de.inc.php.zbkXIU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-en.inc.php.HmF8Hf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-es.inc.php.e2RkHA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-esperanto.inc.php.zAJVJV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-fr.inc.php.ThYxMg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-hu.inc.php.Gw8RPB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-it.inc.php.akPdTW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-nl.inc.php.A9biXh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-pl.inc.php.whnn1C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-pt-br.inc.php.5tba6X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-ro.inc.php.FPXXaj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-ru1251.inc.php.CrGtgE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-sv.inc.php.pCg0lZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/lang/.adodb-uk1251.inc.php.HwV8wk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.license.txt.aouiIF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear/Auth/Container/.ADOdb.php.3ZK3T0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/pear/.readme.Auth.txt.ol7h7l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf/.perf-db2.inc.php.V1nxkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf/.perf-informix.inc.php.RKSMx2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf/.perf-mssql.inc.php.h0wkLn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf/.perf-mysql.inc.php.sT3eZI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf/.perf-oci8.inc.php.9atxd4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/perf/.perf-postgres.inc.php.ERCbsp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.pivottable.inc.php.agZbHK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.readme.txt.UB7YW5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.rsfilter.inc.php.zZ1Mcr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.server.php.Z9QOvM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-compress-bzip2.php.H7IRO7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-compress-gzip.php.8b3Y8s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-cryptsession.php.5qL7sO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-encrypt-mcrypt.php.E2IgN9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-encrypt-md5.php.MyEQ8u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-encrypt-secret.php.3dDruQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-encrypt-sha1.php.ean3Pb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-sess.txt.LRkFbx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-session-clob.php.eePZxS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-session.php.k7flUd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-sessions.mysql.sql.Bk4Mkz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-sessions.oracle.clob.sql.Zv5fLU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.adodb-sessions.oracle.sql.unqJbg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.crypt.inc.php.c54cCB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/old/.adodb-cryptsession.php.kj5G2W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/old/.adodb-session-clob.php.VDCEti" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/old/.adodb-session.php.u1pYUD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/old/.crypt.inc.php.lPuGmZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/session/.session_schema.xml.792AXk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.benchmark.php.k5IwyG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.client.php.e1VN91" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.pdo.php.BAQXLn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.rr.htm.tlH8nJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-active-record.php.HRog14" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-active-recs2.php.kA1oEq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-datadict.php.RsbShM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-perf.php.dQorW7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-pgblob.php.Iwz1At" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-php5.php.Dg0BfP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test-xmlschema.php.lusbVa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test.php.V7VLAw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test2.php.0JXoiS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test3.php.5XI2Zd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test4.php.tTaHHz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test5.php.HXNFpV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.test_rs_array.php.JRUS8g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testcache.php.2i06RC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testdatabases.inc.php.YPhlBY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testgenid.php.WFIhlk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testmssql.php.aYYe5F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testoci8.php.hrvtR1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testoci8cursor.php.vx7qEn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testpaging.php.WSPprJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testpear.php.MsI6e5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.testsessions.php.52sO2q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.time.php.mXEwmN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.tmssql.php.QVNfG9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.xmlschema-mssql.xml.9w6YZv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/tests/.xmlschema.xml.yTBIjS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.toexport.inc.php.8hV1De" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.tohtml.inc.php.0cWHYA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.xmlschema.dtd.803ZjX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/.xmlschema03.dtd.I7TiFj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl/.convert-0.1-0.2.xsl.3gJk1F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl/.convert-0.1-0.3.xsl.62OJn2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl/.convert-0.2-0.1.xsl.jkgvKo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl/.convert-0.2-0.3.xsl.YL3B7K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl/.remove-0.2.xsl.vRFsv7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/adodb/xsl/.remove-0.3.xsl.Tb5jTt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.all-ie.css.29VKiQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.authors.i8CdIc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.config.php.dHpG7y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.copying.gpq9wV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.admin.php.8lIXXh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.calendar.php.8ObepE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.display.php.uZfRQ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.event_delete.php.nLzdjn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.event_form.php.tyHALJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.event_submit.php.5fHie6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.globals.php.1EIKHs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.html.php.q5LdbP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.index.html.oeKhFb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.logincal.php.Zgtm9x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.logoutcal.php.Fwj9DU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.new_user_submit.php.G3ZW8g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.options_submit.php.7a0OED" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.search.php.A3jIa0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.setup.php.TgGXGm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/includes/.style.php.Jx0zdJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.index.php.yaDFK5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.install.465hls" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de/LC_MESSAGES/.index.html.SklWVO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de/LC_MESSAGES/.messages.po.J2OAwb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/de/.index.html.xiKd8x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/.index.html.KhFRJU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja/LC_MESSAGES/.index.html.EfNvlh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja/LC_MESSAGES/.messages.po.u119WD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/ja/.index.html.asmnz0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl/LC_MESSAGES/.index.html.pAEBbn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl/LC_MESSAGES/.messages.po.VeUQNJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/locale/nl/.index.html.8WNjq6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.messages.po.VrLN2s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.news.MZPCFP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.readme.sxSajc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.todo.SPHJWy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.update.eQw0AV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/conference-room/.update.php.vemifi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.cookies.txt.EWuiUE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dailySalesUPC.php.6lqjz1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.datespan.php.uIiafo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.deliQuery.php.y261UK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.deliScale.php.lQYYB7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/delimenu/.index.php.k1KWiu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.deptlist.php.IAAd2Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dlogArchiveTest.php.VsevLd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dlog_archive_create_next.pl.WD2MuA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.date.log.KdaNeX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.index.php.j5WNYj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.mountcheck.sh.O0JZKG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.rsync.log.MHscx3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.sync.sh.F9gpjq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.umount.sh.eHjC5M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/drive_status/.wrapper.sh.kFtPR9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dropTest.php.2sM2Dw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dropTest1.php.C25AqT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dropTest2.php.vnHwdg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.dupTest.php.JPjO0C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.edit.php.zik6SZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.fakeheight.jpg.RmwpLm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.ADOdb.Ch2IDJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-active-record.inc.php.sZK2v6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-csvlib.inc.php.fFPHot" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-datadict.inc.php.v2SIhQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-error.inc.php.Vdb7ad" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-errorhandler.inc.php.DEFQ4z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-errorpear.inc.php.hUtbZW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-exceptions.inc.php.XCkxTj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-iterator.inc.php.BzPJOG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-lib.inc.php.uLmXJ3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-pager.inc.php.RJqNFq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-pear.inc.php.N23XBN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-perf.inc.php.JEHDya" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-php4.inc.php.vpkrwx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-time.inc.php.9o6fuU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-xmlschema.inc.php.wqu6uh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb-xmlschema03.inc.php.oShOwE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.adodb.inc.php.8p4Zz1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/contrib/.toxmlrpc.inc.php.HkhmIo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/cute_icons_for_site/.adodb.gif.aXD8SL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/cute_icons_for_site/.adodb2.gif.Gsh048" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-access.inc.php.bpMSgw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-db2.inc.php.CtyLsT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-firebird.inc.php.x2KZEg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-generic.inc.php.9qstRD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-ibase.inc.php.CoXF40" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-informix.inc.php.U4jTho" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-mssql.inc.php.2VMsvL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-mysql.inc.php.1VQoJ8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-oci8.inc.php.wNrHXv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-postgres.inc.php.VKqmdT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-sapdb.inc.php.3Xe3vg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/datadict/.datadict-sybase.inc.php.oqC6OD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.docs-active-record.htm.yyz880" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.docs-adodb.htm.KGuLxo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.docs-datadict.htm.mhNe0L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.docs-oracle.htm.CQOat9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.docs-perf.htm.w7LBWw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.docs-session.htm.vDXDqU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.old-changelog.htm.naepVh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.readme.htm.XfX9qF" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav/iCal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav/iCal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav/iCal/.DAV" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav/iCal/.DAV" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/adodb" -> "../adodb/" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl/LC_MESSAGES" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/goals" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/goals" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/manual" -> "/Library/Documentation/Services/apache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/playspace" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/playspace" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webcal" -> "WebCalendar-1.0.3" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weblog" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weblog" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weblog/default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weblog/default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webmail" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webmail" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webmail/src" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webmail/src" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weekly" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weekly" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/davlocks" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/davlocks" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs.d" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs.d" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs.d/auto-save-list" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs.d/auto-save-list" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ethereal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ethereal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/autotext" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/autotext" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/Standard" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/Standard" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global/accelerator" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global/accelerator" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global/accelerator/en-US" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global/accelerator/en-US" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/accelerator" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/accelerator" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/accelerator/en-US" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/accelerator/en-US" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/images/Bitmaps" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/images/Bitmaps" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/menubar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/menubar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/statusbar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/statusbar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/toolbar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/toolbar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/accelerator" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/accelerator" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/accelerator/en-US" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/accelerator/en-US" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/images/Bitmaps" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/images/Bitmaps" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/menubar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/menubar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/statusbar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/statusbar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/toolbar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/toolbar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/accelerator" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/accelerator" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/accelerator/en-US" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/accelerator/en-US" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/images/Bitmaps" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/images/Bitmaps" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/menubar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/menubar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/statusbar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/statusbar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/toolbar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/toolbar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database/biblio" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database/biblio" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/gallery" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/gallery" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.tips_portable_sql.htm.FZ4lX2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/docs/.tute.htm.JjDOtq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-access.inc.php.yhaZ0N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-ado.inc.php.qTVayb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-ado5.inc.php.cjXI5y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-ado_access.inc.php.r5fIEW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-ado_mssql.inc.php.n8lIdk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-borland_ibase.inc.php.bDqMMH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-csv.inc.php.IA6Ql5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-db2.inc.php.mtueVs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-fbsql.inc.php.ddDjvQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-firebird.inc.php.44Pt5d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-ibase.inc.php.WKbNGB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-informix.inc.php.FiJRiZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-informix72.inc.php.VTkXUm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-ldap.inc.php.w0TmxK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-mssql.inc.php.6v2aa8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-mssqlpo.inc.php.y9cXNv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-mysql.inc.php.hspKrT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-mysqli.inc.php.QxWZ5g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-mysqlt.inc.php.5POEKE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-netezza.inc.php.FTl6p2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-oci8.inc.php.V24z5p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-oci805.inc.php.kvn4LN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-oci8po.inc.php.Jyqzsb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-odbc.inc.php.D0Pvcz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-odbc_db2.inc.php.hlqQWW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-odbc_mssql.inc.php.DTOwHk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-odbc_oracle.inc.php.fKJitI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-odbtp.inc.php.y2a6e6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-odbtp_unicode.inc.php.86bD1t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-oracle.inc.php.cMbbOR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-pdo.inc.php.xEI3Af" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-pdo_mssql.inc.php.BocHoD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-pdo_mysql.inc.php.7Evlc1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-pdo_oci.inc.php.npDE0o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-pdo_pgsql.inc.php.1TrZOM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-postgres.inc.php.KIlpGa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-postgres64.inc.php.CRlQxy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-postgres7.inc.php.UfddqW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-postgres8.inc.php.4vEEik" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-proxy.inc.php.u8A6aI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-sapdb.inc.php.ihxw45" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-sqlanywhere.inc.php.Na80Xt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-sqlite.inc.php.JoXORR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-sqlitepo.inc.php.mzanMf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-sybase.inc.php.eQlWGD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-sybase_ase.inc.php.2rBTB1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/drivers/.adodb-vfp.inc.php.fHCcxp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-ar.inc.php.VnAswN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-bg.inc.php.UvVJvb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-bgutf8.inc.php.cbv1uz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-ca.inc.php.IMKmuX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-cn.inc.php.WOufyl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-cz.inc.php.LkA9BJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-da.inc.php.kMa7F7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-de.inc.php.r704Jv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-en.inc.php.uU1MPT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-es.inc.php.MLlwVh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-esperanto.inc.php.3jVf1F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-fr.inc.php.0D3263" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-hu.inc.php.PCtQcs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-it.inc.php.7nSTjQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-nl.inc.php.ZMuYqe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-pl.inc.php.Fqo7xC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-pt-br.inc.php.rNNgF0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-ro.inc.php.jJOMNo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-ru1251.inc.php.O30jWM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-sv.inc.php.RBnV4a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/lang/.adodb-uk1251.inc.php.5Xmxdz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.license.txt.lBi4qX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear/Auth/Container/.ADOdb.php.JQ20Hl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/pear/.readme.Auth.txt.E6gJZJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf/.perf-db2.inc.php.N7esh8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf/.perf-informix.inc.php.z1ytzw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf/.perf-mssql.inc.php.WtT6RU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf/.perf-mysql.inc.php.5Dh7aj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf/.perf-oci8.inc.php.4mouuH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/perf/.perf-postgres.inc.php.mVUdO5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.pivottable.inc.php.EALj8t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.readme.txt.NBAvtS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.rsfilter.inc.php.J79HOg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.server.php.0yUU9E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-compress-bzip2.php.pj3Av3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-compress-gzip.php.S0xmSr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-cryptsession.php.jWU8eQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-encrypt-mcrypt.php.1juVBe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-encrypt-md5.php.3J1o0C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-encrypt-secret.php.9AgTo1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-encrypt-sha1.php.VkPnNp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-sess.txt.t6uSbO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-session-clob.php.2JdEDc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-session.php.lYkr5A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-sessions.mysql.sql.FsyHyZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-sessions.oracle.clob.sql.ExuY1n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.adodb-sessions.oracle.sql.yzEfvM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.crypt.inc.php.Pq3wYa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/old/.adodb-cryptsession.php.Nz26rz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/old/.adodb-session-clob.php.7jw4VX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/old/.adodb-session.php.EAXoqm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/old/.crypt.inc.php.isAfVK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/session/.session_schema.xml.NVHhv9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.benchmark.php.h1Dk5x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.client.php.LVkoFW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.pdo.php.9Y8Mfl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.rr.htm.Lw47SJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-active-record.php.yaorx8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-active-recs2.php.SyDLbx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-datadict.php.jmRqQV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-perf.php.sRtsvk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-pgblob.php.XMgdbJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-php5.php.9mTYQ7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test-xmlschema.php.8whCxw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test.php.BjLgeV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test2.php.swqhZj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test3.php.HVUiKI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test4.php.B7Bkv7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test5.php.Faf3gw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.test_rs_array.php.YzHM2U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testcache.php.i6bpSj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testdatabases.inc.php.GEw2HI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testgenid.php.PN1qB7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testmssql.php.lKgQuw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testoci8.php.z9gXoV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testoci8cursor.php.Vpa5ik" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testpaging.php.wk0ydJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testpear.php.srpv97" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.testsessions.php.hgxs5w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.time.php.uvWp1V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.tmssql.php.MGAnXk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.xmlschema-mssql.xml.P0ypZJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/tests/.xmlschema.xml.CBSs18" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.toexport.inc.php.yNow3x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.tohtml.inc.php.2DUU5W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.xmlschema.dtd.Pt7D9l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/.xmlschema03.dtd.E7fodL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl/.convert-0.1-0.2.xsl.fqI8ga" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl/.convert-0.1-0.3.xsl.dKdflz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl/.convert-0.2-0.1.xsl.WDpIpY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl/.convert-0.2-0.3.xsl.Y2Rxun" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl/.remove-0.2.xsl.3MSHBM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/adodb/xsl/.remove-0.3.xsl.CxXSIb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.all-ie.css.tGd4PA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.authors.erAfXZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.config.php.urir4o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.copying.o8gDbO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.admin.php.pOlLjd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.calendar.php.JO1fsC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.display.php.RM06A1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.event_delete.php.GpRmKq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.event_form.php.L7O3TP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.event_submit.php.mEH73e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.globals.php.xUkvgE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.html.php.tUSTs3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.index.html.rXdGIs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.logincal.php.7CdtYR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.logoutcal.php.PQcZeh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.new_user_submit.php.NkTvvG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.options_submit.php.pX0IN5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.search.php.00XW5u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.setup.php.rdXwoU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/includes/.style.php.E5ltHj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.index.php.Ynws3I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.install.loAsp8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de/LC_MESSAGES/.index.html.W8POLx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de/LC_MESSAGES/.messages.po.mMSb8W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/de/.index.html.KGlVum" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/.index.html.ZDMFRL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja/LC_MESSAGES/.index.html.f9Gqeb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja/LC_MESSAGES/.messages.po.vKPbBA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/ja/.index.html.oulhYZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl/LC_MESSAGES/.index.html.JiHnlp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl/LC_MESSAGES/.messages.po.4xiuIO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/locale/nl/.index.html.jU4X5d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.messages.po.UFIstD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.news.XYahR2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.readme.OMwWfs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.todo.DNJCER" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.update.AsVc6g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/fe-schedule/.update.php.fmSNxG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.fin_inactive_check.pl.wBk7Z5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.fixShortUPC.php.vKFrsv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.funct1Mem.php.46p8UU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.functMem.php.9RPsok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.functions.php.7Os8RJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.head.gif.xe1Lm9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.httpFetcher.pl.7svqRy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.httpLogin.pl.lP64lY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.index.php.xNnoTn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.info.php.G1kIqN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory/.index.css.Wcu2Xc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory/.index.js.UelnvC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory/.index.php.Cd3m51" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/images/.b_down.png.xVQiIr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/images/.b_drop.png.ZFMNnR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/images/.b_edit.png.pFFj3g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/images/.b_up.png.iYMPIG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/.index.css.HvXap6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/.index.js.ZfTw5v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/inventory_dev/.index.php.Wg9cMV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.lane04.php.AdXgtl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.leave_orig.php.owRrbL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/likecode_manager/.delete.php.TluDTa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/likecode_manager/.edit.php.KcPlDA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/likecode_manager/.index.php.ph34m0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.memLog.php.VutO6p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/moff/.index.php.oH6xQP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.newReport.php.PSb4Cf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.newReportXL.php.l5nXpF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch/.barcodenew.php.BqRAd5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch/.batchReport.php.6GYk2u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch/.forceBatch.php.Ir05QU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch/.index.css.6m3EGk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch/.index.js.gGdfwK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch/.index.php.WZhcma" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev/.barcodenew.php.LtpLcA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev/.forceBatch.php.zg8E3Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev/.index.css.z28hVp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev/.index.js.r06VMP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/newbatch_dev/.index.php.pCXWEf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.nexusconnect.php.k2ddyF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.csv_parser.php.pKfur5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.dept_margin.php.DHsLkv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.invoice_importer.php.1zmleV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01343200.csv.zSti9k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354260.csv.Soxg4K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354261.csv.5NtQZa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354262.csv.QEyaWA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354263.csv.0rpNS0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354264.csv.FUmMPq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354265.csv.JzzuNQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354266.csv.qxHdLg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354267.csv.lkhFJG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354268.csv.WVT7H6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354269.csv.j4xQKw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354270.csv.PMoANW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354271.csv.HaoWQm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354272.csv.g046UM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354273.csv.l4OiZc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354274.csv.u4CV5C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354275.csv.44ygd3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354276.csv.I1wCkt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354277.csv.iWhGsT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354278.csv.edSKAj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354279.csv.ebzyJJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354280.csv.5ninS9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354281.csv.KsCN1z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354282.csv.61fCe0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354283.csv.2hNrrq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354284.csv.W3F1EQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354285.csv.4cnCSg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354286.csv.hqOS6G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354287.csv.6cFal7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061031_01354288.csv.es0aAx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061124_01462842.csv.7E2bPX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061124_01463055.csv.uRVn6n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061124_01463063.csv.PbxAnO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469396.csv.tQlNEe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469397.csv.LIcaZE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469398.csv.pu0xj5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469399.csv.I4sxEv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469400.csv.JXV6ZV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469401.csv.CzjHlm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469402.csv.mCOZHM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469403.csv.sg1E4c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469404.csv.fVHzsD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469405.csv.7yrvQ3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469406.csv.lXlreu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469407.csv.OmiZCU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469408.csv.Sdo61k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469409.csv.QaFzrL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469410.csv.sUTLRb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469411.csv.mH1YhC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469412.csv.o2jhJ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469413.csv.9SkAat" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469414.csv.2UWBCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469415.csv.10iE4j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469416.csv.2vOoxK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469417.csv.G419Za" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469418.csv.iQD8tB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469419.csv.jv4pY1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469420.csv.Binmts" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469421.csv.lDLFYS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469422.csv.Cnamuj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469423.csv.9DNK0J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469424.csv.QJmaxa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469425.csv.dVyi4A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469426.csv.mbJrB1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469427.csv.ZsCW8r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469428.csv.3FPNGS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469429.csv.F6TNij" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061125_01469430.csv.a5TOUJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061127_01464385.csv.bp5Pwa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061127_01464389.csv.h09V9A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061127_01467872.csv.H8X2M1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01476791.csv.7NZ9ps" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477682.csv.mbxS3S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477683.csv.34SBHj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477684.csv.WCkGlK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477685.csv.Wm5t0a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477686.csv.rGnEFB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477687.csv.Uzebl2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477688.csv.3Uxd1s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477689.csv.Eg8RHT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477690.csv.cWbZok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477691.csv.hAdP6K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477692.csv.pqnGOb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477693.csv.jUHBzC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477694.csv.9U4xk3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477695.csv.VDK45t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477696.csv.3kxjSU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477697.csv.3ylzEl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477698.csv.sGCrrM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477699.csv.t0Oked" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477700.csv.2or21D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477701.csv.HIaLP4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477702.csv.QNZ5Dv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477703.csv.Mn1UsW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477704.csv.7vS4hn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477705.csv.obkDaO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477706.csv.GZtB3e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477707.csv.MTeTWF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477708.csv.FQvxQ6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477709.csv.EGhVKx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477710.csv.6hRjFY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477711.csv.Rbx9Ap" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477712.csv.6hi0wQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477713.csv.UcnRsh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477714.csv.zm8spI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477715.csv.gAA5l9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061128_01477716.csv.g8lIiA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061129_01483196.csv.Or8Gi1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01489022.csv.AsKGis" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01489056.csv.FpNojT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01489079.csv.NYy7jk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01489097.csv.9i5HlL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491719.csv.WJsjnc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491720.csv.cx6hpD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491721.csv.jgvks4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491722.csv.ATqovv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491723.csv.RMPsyW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491724.csv.GIp7Bn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491725.csv.pDTXGO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491726.csv.sVrPLf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491727.csv.tDuHQG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491728.csv.TTFkW7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491729.csv.15HY1y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491730.csv.pflCa0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491731.csv.OTeSjr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491732.csv.ieqttS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491733.csv.UmNjDj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491734.csv.gh5SNK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491735.csv.3aROYb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491736.csv.ND769C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491737.csv.yIBHo4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491738.csv.rSnjDv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491739.csv.L0WgSW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491740.csv.xvzX7n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491741.csv.PYeFnP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491742.csv.iXXeEg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491743.csv.uBsPUH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061130_01491744.csv.GNr5b9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061201_01489927.csv.FFfmtA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502114.csv.OhvlL1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502115.csv.JPHl3s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502116.csv.OmEHlU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502117.csv.aWcFEl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502118.csv.vkCDXM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502119.csv.TzcZge" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502120.csv.01zHAF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502121.csv.Ak27U6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502122.csv.girzfy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502123.csv.UXYJAZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502124.csv.apnVVq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502125.csv.UIU7jS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502126.csv.7NalIj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502127.csv.cLla7K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502128.csv.a8gyzc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502129.csv.R0Lw2D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502130.csv.NBHQv5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502131.csv.eJxwZw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502132.csv.IetOtY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502133.csv.VFg7Xp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502134.csv.Ubn8sR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502135.csv.kriaYi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502136.csv.FM5xtK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502137.csv.gc2yZb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502138.csv.vutlwD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502139.csv.8cK824" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502140.csv.32RdAw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061202_01502141.csv.m0KI7X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061204_01495747.csv.VCfgGp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061204_01501084.csv.MMBOeR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061204_01501102.csv.lg9mNi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510758.csv.SJBhmK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510759.csv.RRyyVb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510760.csv.VvQyvD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510761.csv.XapA54" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510762.csv.bWI6Fw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510763.csv.qA1ehY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510764.csv.cVIJSp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510765.csv.2TazuR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510766.csv.xmcL6i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510767.csv.ayIpKK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510768.csv.4wW4nc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510769.csv.xPog5D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510770.csv.kcExN5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510771.csv.88OPvx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510772.csv.l0v8dZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510773.csv.PgFLWq" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/UI" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/UI" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework/Versions" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework/Versions" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework/Versions/2.4" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework/Versions/2.4" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework/Versions/2.4/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Frameworks/Python.framework/Versions/2.4/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/MacOS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/MacOS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/config" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/config" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload/Crypto" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload/Crypto" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload/Crypto/Cipher" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload/Crypto/Cipher" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload/wx" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/tunneler.app/Contents/Resources/lib/python2.4/lib-dynload/wx" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data/Entourage Temp" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data/Entourage Temp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data/Office X Identities" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data/Office X Identities" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data/Office X Identities/Main Identity" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/Microsoft User Data/Office X Identities/Main Identity" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/mySQL Backup" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Documents/mySQL Backup" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510774.csv.oySKFS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/AddressBook" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/AddressBook" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/AddressBook/Images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/AddressBook/Images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default/bookmarkbackups" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default/bookmarkbackups" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default/chrome" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default/chrome" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default/extensions" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Firefox/Profiles/4jvvff05.default/extensions" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2005111116" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2005111116" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006011112" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006011112" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006030803" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006030803" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006042618" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006042618" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006050817" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006050817" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006072814" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006072814" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006090921" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006090921" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL/Administrator" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL/Administrator" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL/Administrator/Profiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL/Administrator/Profiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL/QueryBrowser" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/MySQL/QueryBrowser" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510775.csv.DZi3ok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510776.csv.T5t28L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510777.csv.87W2Sd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510778.csv.58csGF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510779.csv.N9LSt7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510780.csv.wkSjhz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510781.csv.xSCL40" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510782.csv.oJUNSs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510783.csv.aERwHU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510784.csv.cV7gwm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510785.csv.qwvnlO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061205_01510786.csv.mlKacg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061206_01515379.csv.PzLZ2H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061206_01515402.csv.dqWOT9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061206_01515437.csv.qVUEKB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522955.csv.wj5uB3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522956.csv.izGHsv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522957.csv.cNtllX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522958.csv.xbj0dp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522959.csv.QtrF6Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522960.csv.ticS0i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522961.csv.ffE6UK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522962.csv.kwnlPc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522963.csv.E1TNKE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522964.csv.mjuhG6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522965.csv.pmyLBy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522966.csv.E79Px0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522967.csv.1rEfus" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522968.csv.ZOoJrU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522969.csv.89cipm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522970.csv.GPDRmO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522971.csv.qVqGlg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522972.csv.nPwzkI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522973.csv.5y0sja" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522974.csv.0oGmiC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522975.csv.UeFWh4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522976.csv.htHxhw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522977.csv.wriuhY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522978.csv.PnW9hq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522979.csv.ijJQiS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522980.csv.j2tIkk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061207_01522981.csv.IlrFmM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061208_01527224.csv.Xg7Coe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061208_01527227.csv.ru1lwG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061208_01527230.csv.BFD5D8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061208_01527835.csv.LoLTMA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061208_01527836.csv.zwBIV2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535029.csv.gQEx4u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535032.csv.2iXdeX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535033.csv.4Zvqop" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535034.csv.GXOWyR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535035.csv.fnZPJj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535036.csv.eW44UL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535037.csv.Agxq7d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535038.csv.3MQMjG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535039.csv.csl9v8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535040.csv.wITdJA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535041.csv.M6gjW2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535042.csv.oRvBav" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535043.csv.AdSUoX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535044.csv.jZoADp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535045.csv.6AIYSR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535046.csv.nW4n8j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535047.csv.e0IKoM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535048.csv.ZXf8Ee" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535049.csv.mFXvVG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535050.csv.7orCc9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535051.csv.2BWJtB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535052.csv.DIKeL3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535053.csv.eGMM3v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535054.csv.f56lmY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535055.csv.MtchFq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535056.csv.8pu2YS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535057.csv.KSJOil" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535058.csv.U3EWCN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535059.csv.fM9qXf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061209_01535060.csv.8jKhjI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061211_01533205.csv.F738Ea" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544990.csv.qmz00C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544991.csv.FTadn5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544992.csv.iroMJx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544993.csv.WBPd7Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544994.csv.lnbGus" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544995.csv.INHKSU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544996.csv.olN9gn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544997.csv.W2RUFP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544998.csv.sjX94h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01544999.csv.MkN8uK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545000.csv.NEt8Uc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545001.csv.SlBtlF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545002.csv.rGAxM7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545003.csv.lOtCdA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545004.csv.rI08E2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545005.csv.EPMk7u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545006.csv.NwCxzX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545007.csv.ic5i2p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545008.csv.eP77xS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545009.csv.4fcj4k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545010.csv.On3QAN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545011.csv.MW177f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545012.csv.jXRpFI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545013.csv.6s3Wcb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545014.csv.MkiQKD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545015.csv.D785i6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545016.csv.Rpj5Ry" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545017.csv.WpQvr1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545018.csv.cOdX0t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061212_01545019.csv.c3vpBW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556404.csv.QaTSbp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556405.csv.cvD7OR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556406.csv.1JZnsk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556407.csv.1OCE5M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556408.csv.g6fxJf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556409.csv.gl1MnI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556410.csv.EfP52a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556411.csv.hHFpID" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556412.csv.xlpOn6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556413.csv.zJ143y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556414.csv.oHXmK1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556415.csv.FkvFqu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556416.csv.iuvl7W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556417.csv.ri9HOp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556418.csv.lGh6vS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556419.csv.oyGVel" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556420.csv.3bcMXN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556421.csv.1PjGGg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556422.csv.FJWApJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556423.csv.d4cO8b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556424.csv.EG2vSE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556425.csv.urCSE7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556426.csv.vcDgrA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556427.csv.tx09g3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556428.csv.Bkk86v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/old/.C54835061214_01556429.csv.kPES1Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.readall.php.rE5DWr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.unfi.csv.UyKpRU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.unfi_invoice_fixer.php.mR4meo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/npp/.upload.php.mXdlBR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.paydays.py.LUyjYk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pcode/.movement.php.0ZZhlO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/.Brother_MFC8840D_Network_User_Guide.pdf.ljbIKh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/.Brother_MFC8840D_User_Guide.pdf.sWZxKL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/.DTermMan.pdf.TM9vRg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/.Hobart_User_Guide.pdf.EjoggM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/.Magellan_Product_Reference_Guide.pdf.wmi7Xh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/.index.html.fJVIMO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.ColorGuide.pdf.Tx4QEl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.basic.pdf.1oLbxT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.eFilingGuide.pdf.7FbCXt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.netAdmin.pdf.mGHTO5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.netFax.pdf.vryzuI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.printing.pdf.s6boUl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.quick.pdf.mpuvr1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.scan.pdf.lkoqGH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.topAccess.pdf.21NxDo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.userFunct.pdf.I25WP6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pdfs/toshiba/.userManage.pdf.sGNI0P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.perl_freetds_sample.pl.9Gy4sz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.Device-SerialPort-1.002.tar.gz.8twrVi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.#README#.nH6ip2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.Changes.w2JMTL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.Device-SerialPort.spec.m0pZov" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.MANIFEST.ZzTZWe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.META.yml.0mp1uY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.Makefile.aPk32H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.Makefile.PL.r06FBr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.README.wIGEab" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.SerialPort.bs.P0x2JU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.SerialPort.c.L97qjE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.SerialPort.o.Hx87Sn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.SerialPort.pm.04KZt7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.SerialPort.xs.sTlk6Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.TODO.lndsJA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.config.guess.fe4Amk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.config.rpath.pn9l03" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.config.sub.rW5AEN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.depcomp.NeHrjx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.install-sh.h9ICYg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.missing.jUdaE0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/autotools/.mkinstalldirs.nBXWkK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort/..exists.icYK1t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort/.SerialPort.bs.PNczId" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/arch/auto/Device/SerialPort/.SerialPort.so.w7FnpX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device/..exists.H2cx7G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/Device/.SerialPort.pm.DXqIPq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/lib/auto/Device/SerialPort/..exists.2WT4za" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man1/..exists.iimskU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man1/.modemtest.1.2I1P4D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man3/..exists.FRVKUn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/man3/.Device::SerialPort.3.PjAGK7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/script/..exists.ib9cBR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/blib/script/.modemtest.lysKrB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.config.h.3m5Eil" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.config.h.in.TOroa5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.config.log.SW381O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.config.status.NggwUy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.configure.XIDLOi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.changelog.98CtL2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.control.p3wcIM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.copyright.igddHw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.postinst.hFKeGg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.postrm.YRogF0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.prerm.gshiEK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/debian/.rules.NQhkDu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.any_os.plx.X5tmCe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo1.plx.Yn06BY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo2.plx.U8lSBI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo3.plx.VInZBs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo4.plx.20iPCc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo5.plx.NpaHDW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo6.plx.pfzUEG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo7.plx.LiPBGq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.demo8.plx.HdUoJa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example1.txt.uIKcMU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example2.txt.DDM0OE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example3.txt.8z5VVo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example4.txt.X65R28" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example5.txt.bsqO9S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example6.txt.oaQKgD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example7.txt.zSWLon" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.example8.txt.I2RNw7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/eg/.options.plx.do6PER" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.modemtest.VPGdNB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.pm_to_blib.4Ce4Wl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.show-tiocm.c.test.qjsV65" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.01timing.t.MOSMgQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.AltPort.pm.npwEqA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.DefaultPort.pm.vVowAk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.test1.t.FZjOM4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.test2.t.C2btZO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.test3.t.qalncz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/t/.test4.t.yfSOpj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/Device-SerialPort-1.002/.ttyS0_test.cfg.C3TWD3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.a.out.gN05RN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.index.php.eXBn6x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.index.php~.QG6bmi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.scale.zos1B2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.scanner.rm1QRM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.serial.c.1J4G7w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.serial.c~.jh1Rnh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.serial_test.pl.53FME1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/perl_playground/.serial_test.pl~.Io8HVL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.phpbits.php.4EXHdw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/picker/.cron.py.hsAIvg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/picker/.index.php.wSsJN0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/picker/.test.py.jY8W6K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/picker/.watchlist.php.xuVbqv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/playspace/.ajax_test.html.dHOhLf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/playspace/.pos99Log.php.k4wo6Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/playspace/.test.html.zIsvrK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/pricehistory/.index.php.gzxCMu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/produce_avg/.index.php.cqc27e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.addnote.php.9uIpuZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.assign.php.cI3NQJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.complete.php.ZzCcdu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.delete.php.F3TFAe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.edit.php.hp09XY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.index.php.hnoElJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.newproject.php.W4iuJt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.project.php.nz3G7d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.projects.sql.TfsUwY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.reopen.php.6TXQXI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.report.php.iOaOot" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.report1.php.YTN3Pd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.report_orig.php.FyhzhY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.unassign.php.52yNJI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/projects/.watch.php.3U62bt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.receipt.php.Vaz0Ed" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.receiptNew.php.FkWY7X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.conversions.txt.q9Z0CI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.dbconnect.php.ar837s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.fraction.py.4Rn7Cd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images/.LogoBig.gif.mQ0a8X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images/.b_down.png.MIpEGI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images/.b_drop.png.H5nAgt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images/.b_edit.png.7OmxQd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images/.b_up.png.v7xuqY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/images/.tomatoman.png.0H310I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.index.css.70CVBt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.index.js.b5iQfe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.index.php.wKv9TY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.index_orig.php.JBFOyJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.ingredients.js.AzaRdu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.ingredients.php.nNPdTe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.loadconversions.php.XX7jzZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.print.php.kbarfK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.products.php.yFZnWu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.readInventory.php.DtylDf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.viewer.js.nC91k0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/recipizer/.viewer.php.tzBJ2K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_check/.index.php.LDl9Kv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_check/.index.php~.HgSztg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_traffic/.index.php.o5Bed1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/sales_traffic/.trends.py.7gmUWL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/samba/.backer.pkg.tar.bz2.vPhAGw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/samba/.index.php.zwcVsh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/scala/.php_error_log_file.WUXgf2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/scala/.scala_regular.php.6DoD1M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/scala/.scalatest.php.2z2ZNx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.scalatest.html.9IOmAi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/shoppers/.index.php.hdIJm3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.staffAR.php.L1oM9N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.supplies.php.er9xXy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.test.php.3rEkLj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.test2.php.2nQPz4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.test4.php.tx8loP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.testDate.php.ZyQHdA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.testEmail.php.6Si42k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.testList.php.voEvT5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.transHistory.php.czVXJQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/transactionReport/.index.php.SunqAB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/trends/.index.php.nSeerm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/trends/.trends.php.JJHoi7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/trends/.trends.py.4PnmcS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.tunneler.tar.bz2.3ccl6C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.TOSHIBA_e-STUDIO451cSeries.ppd.VbRnfq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.ajax.html.Hovgqd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.qa_connect.png.2AEqB0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.qa_query.png.KFkZMN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.qa_select_db.png.7o4UYA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.qa_startmenu.png.pdQkbo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.serveragent.png.B7Peob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.sqlserver.png.1uRtBY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/crashes-images/.taskbar.png.ZhQ6OL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.crashes.html.3rO32y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.hobart.html.5udohm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.index.html.DpVdx9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.completed_labels.png.vqs5MW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.data_merge.png.zl9J4J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.excel_sheet.png.hbz3px" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.fields_complete.png.twl6Lk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.index.html.jikn97" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.insert_merge_field.png.jWDFwV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.inserted_field.png.Kt1DUI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.merge_new.png.40umjw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.open_data_source.png.0yPPIj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.open_worksheet.png.0DyU86" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/labels/.tools_labels.png.i5bUAU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.phones.html.nP834H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.phonewrangling.html.THXezv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.pix-ing.html.ayWt4i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.printer.html.pHSJz6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.pto.php.J8ZZ4T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.finder-pane.png.SL2vCH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.finder.png.Gp5vdv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.go-menu.png.8LoqSi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.index.html.ughvz6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.password.png.BDvBgU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.share-select.png.wLqiYH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/public-homes/.smb-connect.png.ZeLAGv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.recSG.html.vRKtpj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.sgspeed.html.t1TH86" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.valutec.html.7pijSU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/.virus-cleaning.html.5XohCI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto/..DS_Store.O4UImw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto/.connected.png.5FEx7j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto/.disconnected.png.vRPKS7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto/.index.html.pD0FFV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto/.other.png.IZaDsJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/tutorials/wifi-howto/.wificoop.png.kXS7hx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/undo/.index.php.6HSb8k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/undo/.index2.php.BBhBY8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.unfipres.php.4ZJ6PW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.voicemail.html.SX8CHK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/it/.website_menu_rollover.py.AUD9yy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/..DS_Store.6nB1qm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/..memAddress.php.swm.9fthja" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/..memAddress.php.swn.10IteY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/..memAddress.php.swo.9qo29L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/..memAddress.php.swp.tslX5z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.AR.php.6ytf2n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.ARStatement.php.stfP0b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.ARStatement_orig.php.Q1UpZZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.AR_90.php.rLaF0N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/_notes/.memList.php.mno.RhnV1B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/_notes/.memPage.php.mno.HqDM3p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/_notes/.memTest.php.mno.hdDE5d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/_notes/.meminfo.php.mno.7GMk91" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.arReport.php.UgJ1cQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.artest.php.BxMIgE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.deactivate.php.rB3pks" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.deactivate.php~.U6Lsog" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editHouse.php.lpPSs4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editHouse.php_orig.pqBMxS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editHouse2.php.N7dWGG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editHouse2.php_orig.CgC6Pu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editMore.php.90chZi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editNabs.php.EgVw96" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editNabs.pl.GtmNjV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editNabs.pl~.C673tJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.editNew.php.OEzNEx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.expiringMems.php.iYaUPl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.fullList.php.EUdK19" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.functMem.php.xNqBdY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.functMem_orig.php.Bz7PpM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.genBus.php.xASLCA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.genGaz.php.rpwIPo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.genNums.php.GotC3c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.genStaff.php.Vo9wh1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.header.html.la8rvP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.headerTest.php.E4BIJD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.AR.gif.1vxE5r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.GKC1.png.awpBrg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.itemsDown.gif.mno.gaAeZ4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.itemsOver.gif.mno.ukJSwT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.itemsUp.gif.mno.Zdtx4H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.memDown.gif.mno.wiicCw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.memOver.gif.mno.ggmR9k" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e00410064006400720065007300730042006f006f006b" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e00410064006400720065007300730042006f006f006b" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004b006500790063006800610069006e" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004b006500790063006800610069006e" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004d00610069006c" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004d00610069006c" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e005300610066006100720069" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e005300610066006100720069" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e006900430061006c" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e006900430061006c" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/conflicts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/SyncServices/Local/conflicts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Terminal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/Terminal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal/Sources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal/Sources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal/Sources/A9FF082A-1A4F-47DC-9F03-C7D23F35F670.calendar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal/Sources/A9FF082A-1A4F-47DC-9F03-C7D23F35F670.calendar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal/Sources/AB1D7A1B-56EA-455B-A707-D1EE446BA091.calendar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Application Support/iCal/Sources/AB1D7A1B-56EA-455B-A707-D1EE446BA091.calendar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Assistants" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Assistants" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins/Components" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins/Components" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins/Digidesign" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins/Digidesign" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins/VST" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Plug-Ins/VST" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Sounds" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Sounds" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Sounds/Alerts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Sounds/Alerts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Sounds/Banks" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Audio/Sounds/Banks" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Autosave Information" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Autosave Information" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/01/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/01/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/07/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/DashboardClient/07/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Desktop" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Desktop" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox/Profiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox/Profiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox/Profiles/4jvvff05.default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox/Profiles/4jvvff05.default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox/Profiles/4jvvff05.default/Cache" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Firefox/Profiles/4jvvff05.default/Cache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/Safari" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/Safari" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/iCal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/iCal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/iCal/A9FF082A-1A4F-47DC-9F03-C7D23F35F670" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/iCal/A9FF082A-1A4F-47DC-9F03-C7D23F35F670" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/iCal/AB1D7A1B-56EA-455B-A707-D1EE446BA091" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Metadata/iCal/AB1D7A1B-56EA-455B-A707-D1EE446BA091" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/MySQL Query Browser" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/MySQL Query Browser" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/00/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/00/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/00/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/00/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/01/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/01/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/01/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/01/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/03/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/03/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/03/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/03/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/04/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/04/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/04/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/04/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/05/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/05/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/07/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/07/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/08/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/08/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/11/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/11/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/12/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/12/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/13/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/13/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/14/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/14/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/14/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/14/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/15/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/15/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/15/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/QuickTime/downloads/15/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/02" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.refDown.gif.mno.D1kcL9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.refOver.gif.mno.zLCxmY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.refUp.gif.mno.jt2SXM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.repDown.gif.mno.qgHezB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.repOver.gif.mno.VLtAaq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/_notes/.repUp.gif.mno.I4oWLe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.control.gif.lasin3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.detail.gif.pOCEYR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.equity.gif.Dc30zG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.exist_up.gif.OlAnbv" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/00/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/10" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.general.gif.WW9JNj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.itemsDown.gif.LQr7p8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.itemsOver.gif.PIVu2W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.itemsUp.gif.VKzFGL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.logoGrnBckSm.gif.7jkRkA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.memDown.gif.bDn3Yo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.memOver.gif.ACAjDd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.memUp.gif.wxxAh2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.newLogo_small.gif.ftV1VQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.newLogo_small.jpg.XB4HBF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.newLogo_small1.gif.4f4Jhu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.new_up.gif.sicOZi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.patronage.gif.oJyTH7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.persons.gif.WV0YpW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.refDown.gif.4pH47K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.refOver.gif.zdAeQz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.refUp.gif.N02oyo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.repDown.gif.YOu4hd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.repOver.gif.EL7K11" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.repUp.gif.i76rLQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.tab.png.UaqavF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/images/.test.png.q0X6fu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.index.php.joyn2i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.index_old.php.uto8R7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.insertEdit.php.mY4gIW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.insertEdit.php~.A5PTyL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.limits.php.0ruqsA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.list.php.MHfYlp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.mailList.php.KjMwfe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.mainMenu.php.0zt582" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.mainMenu1.php.ryGZ2R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.mainMenu3.php.kSLgXG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memARTrans.php.WLxESv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memARTrans.php_orig.wLi3Nk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memAddress.php.cUFsJ9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memAddress.php~.MxGrFY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memBalancesLM.php.UgGDCN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memCon.php.KlPQzC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memDBHistory.php.isb4wr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memEdit.php.old.G5sXug" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memGen.php.tcxSs5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memGen_old.php.O0BarU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memList.php.wbx8qJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memLogin.php.IlFbry" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memStart.php.awufrn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memTrans.php.ruxjrc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsByDate.php.HktAt1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsByDate.php~.LtmSvQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsByDate.pl.mPlayF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsByDate.pl~.hIFsAu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsCSV.php.4HyOCj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsReport.php.PTLaF8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.memsReportStaff.php.FhvcIX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.newMem.php.HUJfLM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.newmems.php.nGHLSB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.noteHistory.php.lxzi0q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.patronage.php.1TUT7f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.php_error_log_file.boLvf5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.query.php.AHQ7mU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.reactivate.php.Gy7ayJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.reactivate.php~.hrgfJy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.reprint.php.yQ6nVn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.reprint_old.php.nYCB7c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.staffAR.php.vOHPj2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.staffARmanager.php.Q2b4wR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.staffCurrAR.php.YKbkKG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/statements/.indStatement.php.xGmAXv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/statements/.index.html.iIusbl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/statements/.makeStatement.php.1tClpa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.status.php.Da7uKZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.stockClear.php.pJwF5O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.stockDetails.php.XoDUqE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.suspensionHistory.php.QtA6Ot" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.test.php.ZXrndj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testDetails.php.4HQEB8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testDrop.php.3MrWZX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testEdit.php.Z98doN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testEdit_cur.php.UPK8MC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testEdit_orig.php.rao8bs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testFunc.php.7KMFBh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.testGen.php.xn4d16" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.workMem.php.CvxesW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.zerostock.php.pv5fTL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members/.zerostock.php~.uePhkB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/..DS_Store.ZWLjLq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/..memAddress.php.swm.YlpLeg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/..memAddress.php.swn.zUnAI5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/..memAddress.php.swo.weGOfV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/..memAddress.php.swp.ObYoNK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.AR.php.49uXmA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.ARStatement.php.KT3wWp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.AR_90.php.Ay4Rxf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/_notes/.memList.php.mno.YQRd94" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/_notes/.memPage.php.mno.HxPDKU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/_notes/.memTest.php.mno.Meu4lK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/_notes/.meminfo.php.mno.ZXYvYz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.artest.php.dDjYAp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.editNew.php.QLYqdf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.functMem.php.UjzfQ4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.genNums.php.9diyuU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.header.html.Kf4R8J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.AR.gif.bJ6bNz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.GKC1.png.V2sWvp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.itemsDown.gif.mno.se4tsf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.itemsOver.gif.mno.yGw2o5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.itemsUp.gif.mno.xscBlV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.memDown.gif.mno.Yo09hL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.memOver.gif.mno.Se9IeB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.refDown.gif.mno.Bewibr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.refOver.gif.mno.Di0R7g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.refUp.gif.mno.DqDr46" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.repDown.gif.mno.f4m10W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.repOver.gif.mno.3Gvs0M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/_notes/.repUp.gif.mno.csnUZC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.control.gif.fvUmZs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.detail.gif.zYGPYi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.equity.gif.WJAiY8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.exist_up.gif.myBLXY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.general.gif.0BTeXO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.itemsDown.gif.l3qIWE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.itemsOver.gif.OQWSWu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.itemsUp.gif.9eb4Wk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.logoGrnBckSm.gif.VQtkYa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.memDown.gif.SAABZ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.memOver.gif.e1RS0Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.memUp.gif.Qe4S2G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.newLogo_small.gif.7dcU4w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.newLogo_small.jpg.hrCi7m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.new_up.gif.E6kLad" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.persons.gif.TARee3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.refDown.gif.53CIhT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.refOver.gif.ry9TlJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.refUp.gif.ryr6pz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.repDown.gif.lP80up" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.repOver.gif.uLGWzf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.repUp.gif.CqZIF5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.tab.png.OzcwLV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/images/.test.png.wuGzSL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.index.php.aF5x1B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.index_old.php.yCyxas" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.insertEdit.php.9hfQji" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.list.php.U5kvt8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.mainMenu.php.sCJxDY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.mainMenu1.php.XZxWNO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.mainMenu3.php.Dp3IYE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memAddress.php.eQKS9u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memCon.php.mfNTol" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memEdit.php.old.8ATVDb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memEdit.php~.LRYYS1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memGen.php.Ika27R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memGen.php~.jneqnI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memList.php.OU7aDy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memLogin.php.0c2hTo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memStart.php.ucqnaf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.memTrans.php.imNtr5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.newMem.php.9fnAIV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.testEdit.php.EAs2ZL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/members_test/.testFunc.php.QW38kC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.mysql.php.JJEgGs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.newLogo_small.gif.malo1i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.newLogo_small.jpg.s0XSm9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.newLogo_small1.gif.5o8IIZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.newReport.php.hxkV4P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.newReportTest.php.074vrG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.newReportXL.php.7jIzOw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.csv_parser.php.7nvZgn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/db/.gwfc.sh.nZBtVd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/db/.import_invoice.py.exL0z4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/db/.inv_footer.sql.gR3nhV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/db/.inv_header.sql.MBaMYL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/db/.inv_lines.sql.rZbBMC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/db/.wfc_data.sql.DYjrAt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.dept_margin.php.V38E0k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.fixed.csv.yOk7xc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.interface.js.MEuQD4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.interface.php.OsASbX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.invoice_importer.php.pgDKPP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.loadUNFIprices.php.EeIFtI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070223_01869569.csv.QgeB7A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070223_01877776.csv.4IQQPt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070223_01877777.csv.Cettym" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070223_01877778.csv.4yVOhf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070223_01877779.csv.WAgb17" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070223_01877780.csv.g20GO0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884185.csv.ZiIdCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884186.csv.sAa1xM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884187.csv.zGuPtF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884188.csv.zanXpy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884189.csv.mB5rmr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884190.csv.gurGjk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884191.csv.pHnWgd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884192.csv.806we6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884193.csv.QrGScZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884194.csv.XwefbS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884195.csv.9iSiaL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884196.csv.KTfd3C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884197.csv.uHsC2v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884198.csv.kmwK4o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884199.csv.dRraai" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884200.csv.Z81Tfb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884201.csv.pBc0l4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884202.csv.ZdActX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884203.csv.SlQpAQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070224_01884204.csv.fkiDHJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01891019.csv.U6EZWC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893263.csv.DPsncw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893264.csv.eJY5rp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893265.csv.wZvfKi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893266.csv.cBCL2b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893267.csv.OGR0l5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893268.csv.CPXgFY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893269.csv.OlkTYR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893270.csv.G3Q0jL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893271.csv.YFUrFE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893272.csv.zQBf1x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893273.csv.RZbrnr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893274.csv.6PNYJk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893275.csv.AjUS6d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893276.csv.vdRou7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893277.csv.fswVR0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893278.csv.xFUWfU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893279.csv.WFWAEN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893280.csv.hIxh5G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893281.csv.35RjxA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893282.csv.HnkXZt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893283.csv.tjbWsn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893284.csv.B1EjWg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893285.csv.fIncqa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893286.csv.tmSoU3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893287.csv.mvQkpX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893288.csv.cSEhUQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893289.csv.v6rXpK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893290.csv.zJCEVD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070227_01893291.csv.H5Jnwx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01898744.csv.qsE76q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01898772.csv.24PRHk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01903131.csv.rk8Bje" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01903144.csv.MYTnV7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905054.csv.QsHcz1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905055.csv.aOT2cV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905056.csv.up4ARO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905057.csv.PEW9vI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905058.csv.5Kp4aC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905059.csv.osslQv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905060.csv.Lq8Zvp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905061.csv.4uf1bj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905062.csv.Kjf2Sc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905063.csv.CC3TA6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905064.csv.AG0Mi0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905065.csv.8igg1T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905066.csv.6cI4JN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905067.csv.9WDftH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905068.csv.7kkefB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905069.csv.Jh6z2u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905070.csv.EqVWPo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905071.csv.lDxsFi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905072.csv.0EEZuc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905073.csv.jqfxk6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905074.csv.kurra0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905075.csv.9ice1T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905076.csv.JzN1RN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905077.csv.IsYtJH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070301_01905078.csv.ufXXAB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070305_01915616.csv.w9RqBv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070305_01915668.csv.j0HUBp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070305_01915680.csv.V7f9Cj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070305_01915749.csv.NDAoEd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070305_01915777.csv.4IxnI7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926762.csv.o0lnM1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926763.csv.E0xhTV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926764.csv.gaOc0P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926765.csv.sUut7J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926766.csv.MrlufE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926767.csv.rrkwny" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926768.csv.gijOvs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926769.csv.y2vyEm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926770.csv.BTbYNg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926771.csv.wPULYa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926772.csv.aE3A94" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926773.csv.uJDqkZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926774.csv.QwKCvT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926775.csv.gSIKJN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926776.csv.cjfz0H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926777.csv.zORzhC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926778.csv.aL2jzw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926779.csv.M894Qq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926780.csv.nkYx9k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926781.csv.gxD1rf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926782.csv.X6OdL9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926783.csv.cNQq43" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926784.csv.GW0lpY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926785.csv.dAeCMS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926786.csv.pwhT9M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926787.csv.xCfuxH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926788.csv.hAnnVB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926789.csv.PQyVjw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070306_01926790.csv.9xkvIq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938780.csv.qfbwdl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938781.csv.xlvSIf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938782.csv.l80Bea" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938783.csv.mjNmO4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938784.csv.su68nZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938785.csv.YeAVXT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938786.csv.4VW3xO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938787.csv.xjCx8I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938788.csv.PFAKJD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938789.csv.RHIYky" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938790.csv.7oIYWs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938791.csv.L6xZyn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938792.csv.gOuibi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938793.csv.ut9YNc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938794.csv.BxO2q7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938795.csv.Agdu41" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938796.csv.fI2fIW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938797.csv.llvomR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938798.csv.7zWT0L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938799.csv.gn7aJG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938800.csv.KNtOrB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938801.csv.sgMFcw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938802.csv.ArQ72q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070308_01938803.csv.85VATl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951643.csv.Ktd4Jg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951644.csv.7LP1Db" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951645.csv.kptzz6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951646.csv.TALcw1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951647.csv.QFrRsW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951648.csv.vq3wpR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951649.csv.4NTFmM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951650.csv.d4hqkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951651.csv.prOviC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951652.csv.hI4Xgx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951653.csv.WPx9fs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951654.csv.pylmfn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951655.csv.jtpVei" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951656.csv.UIHdfd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951657.csv.jaJwf8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951658.csv.nNqbg3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951659.csv.PP2DkY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951660.csv.TnN7oT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951661.csv.5fKYtO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951662.csv.z0hpzJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951663.csv.OXq0GE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951664.csv.Y3NFOz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951665.csv.izfZWu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070310_01951666.csv.w2Dj5p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962659.csv.Tjz2gl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962660.csv.U2Gvxg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962661.csv.uboIOb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962662.csv.SSuW56" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962663.csv.1kPvn2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962664.csv.SmZsFX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962665.csv.v9dMXS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962666.csv.dlqrgO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962667.csv.cxhtzJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962668.csv.XopBTE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962669.csv.2pHKdA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962670.csv.PxUfyv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962671.csv.f9e8Sq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962672.csv.Rthmem" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962673.csv.mDgXzh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962674.csv.8SNTVc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962675.csv.fj0Qi8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962676.csv.lxo9H3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962677.csv.paCs7Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962678.csv.Rwx3wU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962679.csv.9es1WP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962680.csv.ijClnL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962681.csv.fXb7QG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962682.csv.N68TkC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962683.csv.557jPx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962684.csv.13i7lt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962685.csv.zLcVSo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962686.csv.LC74pk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962687.csv.nGDAXf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070313_01962688.csv.oXP2xb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974064.csv.0Z6v86" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974065.csv.sgEIM2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974066.csv.ZG9VqY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974067.csv.KKAR6T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974068.csv.SPYNMP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974069.csv.2OV7sL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974070.csv.LeuL9G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974071.csv.KKCMQC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974072.csv.q86wyy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974073.csv.7cFigu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974074.csv.4Y5pYp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974075.csv.HTCiHl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974076.csv.zf6bqh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974077.csv.TaSo9c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974078.csv.XOZ2S8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974079.csv.zMQHC4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974080.csv.nfkmn0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974081.csv.Oaj27V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974082.csv.2dh3SR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974083.csv.toKnGN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974084.csv.2xkqwJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974085.csv.rCV3mF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974086.csv.ZDEpeB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070315_01974087.csv.w2PM5w" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/01/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/02/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/03/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/04" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986004.csv.Jv5r4s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986005.csv.fYkh3o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986006.csv.2iIh2k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986007.csv.h8M21g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986008.csv.KeSO1c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986009.csv.YbIX18" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986010.csv.qVg134" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986011.csv.vwU550" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986012.csv.9K0d8W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986013.csv.zS2ZaT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986014.csv.yCFOdP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986015.csv.Er3RgL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986016.csv.CCVPmH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986017.csv.QVTOsD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986018.csv.sLaOyz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986019.csv.t42NEv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986020.csv.0Z3ILr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986021.csv.jdOFSn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986022.csv.lvKZZj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986023.csv.DVhh8f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986024.csv.4WjAgc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986025.csv.e5Btr8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986026.csv.bZ4gH4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986027.csv.OFQ5W0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070317_01986028.csv.zzKYcX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996138.csv.6paSsT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996139.csv.n5C0OP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996140.csv.0qdwbM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996141.csv.3sALyI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996142.csv.ih21VE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996143.csv.gKUEjB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996144.csv.8BpTHx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996145.csv.gBft6t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996146.csv.ga8pvq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996147.csv.aK9qWm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996148.csv.uIftnj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996149.csv.ZatOQf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996150.csv.foh2kc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996151.csv.EJMgP8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996152.csv.5Wqbk5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996153.csv.xTb7O1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996154.csv.7OyqkY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996155.csv.LKx4PU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996156.csv.OPj5lR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996157.csv.wq8kSN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996158.csv.GkvWoK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996159.csv.TEVbWG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996160.csv.nburuD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996161.csv.3cRH2z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996162.csv.4PqDBw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996163.csv.PFPzat" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996164.csv.X9qKJp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/old/.C54835070320_01996165.csv.iSW4lm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.readall.php.yXgqYi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/npp/.upload.php.vyQLAf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.obrien.php.2Ou7cc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.odbc.php.TCptP8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/.FAQ.htm.PGQas5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.acceptpagebreak.htm.xWIB51" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.addfont.htm.BIo3IY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.addlink.htm.uUfznV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.addpage.htm.ctV61R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.aliasnbpages.htm.8vLEGO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.cell.htm.fjxxlL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.close.htm.CpJV4H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.error.htm.o2LkOE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.footer.htm.Pi1JxB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.fpdf.htm.cDs9gy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.getstringwidth.htm.irJJ2u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.getx.htm.JtJkOr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.gety.htm.gvXVzo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.header.htm.37pxll" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.image.htm.ZSsJ7h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.index.htm.oXrWTe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.line.htm.YpVQGb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.link.htm.oalMt8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.ln.htm.6lqai5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.multicell.htm.BYNz61" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.open.htm.IjrZUY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.output.htm.nQhpJV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.pageno.htm.3HREBS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.rect.htm.YQGVtP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setauthor.htm.bWMcmM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setautopagebreak.htm.39ZteJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setcompression.htm.OxlP6F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setcreator.htm.JYebZC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setdisplaymode.htm.pllxRz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setdrawcolor.htm.HyUYLw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setfillcolor.htm.2fMrGt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setfont.htm.31VUAq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setfontsize.htm.pO0rvn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setkeywords.htm.xhFZpk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setleftmargin.htm.Y3vxkh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setlinewidth.htm.sPsdke" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setlink.htm.5RFUjb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setmargins.htm.RC2Bj8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setrightmargin.htm.hXCjj5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setsubject.htm.uFn5i2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.settextcolor.htm.45DRiZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.settitle.htm.xa6DiW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.settopmargin.htm.H9LqiT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setx.htm.IGoqlQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.setxy.htm.Gh7qoN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.sety.htm.BxjsrK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.text.htm.5JPtuH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/doc/.write.htm.AurvxE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.ToullMRS.ttf.0VPxAB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.courier.php.gTYNFy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles/.georgia.ttf.sZ75Kv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles/.georgiab.ttf.mjbDUs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles/.georgiabi.ttf.ikAz7p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles/.georgiai.ttf.6Esion" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles/.ltbelle.ttf.Ea7DHk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/fontfiles/.toullmrs.ttf.twce2h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.georgia.php.7pCPnf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.georgiab.php.dPHtJc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.georgiabi.php.ju2U59" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.georgiai.php.ekgrs7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.helvetica.php.ms5XP4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.helveticab.php.4jgwd2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.helveticabi.php.IeM8AZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.helveticai.php.ZusQ1W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.ltbelle.php.7abDsU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.cp1250.map.fwB3TR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.cp1251.map.pjFylP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.cp1252.map.c0oJNM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.cp1253.map.iIYYfK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.cp1254.map.s49RIH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.cp1257.map.unLQbF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-1.map.dfYtFC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-15.map.ZxB88z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-16.map.i56BDx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-2.map.mMPa8u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-4.map.VDrnDs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-5.map.eBaE8p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-7.map.gPEzEn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.iso-8859-9.map.zaQBal" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.koi8-r.map.oBDVGi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/makefont/.makefont.php.DZbvdg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.symbol.php.XnWLKd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.times.php.Ihq7hb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.timesb.php.Ej6tQ8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.timesbi.php.ik2Ro6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.timesi.php.yP5jX3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.toullmrs.php.IKrNw1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/font/.zapfdingbats.php.wyyl6Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/.fpdf.css.RHeUFW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/.fpdf.php.gyk0fU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/.histo.htm.TgvJQR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/.install.txt.BGPXtP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.20k_c1.txt.IIod7M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.20k_c2.txt.o7TtKK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.calligra.afm.6066nI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.calligra.php.1zw81F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.calligra.ttf.7I9CGD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.calligra.z.LT0SlB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.countries.txt.vKiy2y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.index.htm.NCjeJw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.logo.png.1hxUpu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.logo_pb.png.gyWE6r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.makefont.php.fa6HQp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto1.htm.aYuMAn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto1.php.D5LRkl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto2.htm.njgX4i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto2.php.mjvLPg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto3.htm.ovNAAe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto3.php.Huogmc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto4.htm.PgAX79" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto4.php.hXHkU7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto5.htm.L37IG5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto5.php.ozIvt3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto6.htm.HUZCg1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto6.php.67nt4Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto7.htm.8jllSW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/fpdf151/tutorial/.tuto7.php.t71UHU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/.ChangeLog.txt.CRyvxS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/.INSTALL.txt.5lC6mQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/.LICENSE.txt.5VSHcO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/.README.txt.ZgjC7L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.bar.html.3srx2J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.beginclip.html.9hEwXH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.begineoclip.html.GQnwSF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.beginpage .html.UmDXPD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.circle.html.1j4tNB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.close.html.yR80Kz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.closepath.html.JEv2Jx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.closeweb.html.Uk94Iv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.closewebps.html.NZTbIt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.curve.html.25gjHr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.delpdf.html.OW2MHp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.delps.html.795hIn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.disc.html.ea5QIl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.endclip.html.vvGqJj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.endpage.html.pcxSKh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.fullpie.html.ecClMf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.functions.html.0RPSNd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.getalign.html.augNQb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.getfontname.html.iJaJT9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.getfontsize.html.v4TIW7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.getunderline.html.uv1IZ5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.index.html.lQB123" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.line.html.jaB591" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.lineto.html.IKBdh0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.ln13.html.GQZloY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.moveto.html.FcoVzW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.newpath.html.KYCvLU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.open.html.PGW9WS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.out.html.ESMO8Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.overview.html.IX9slP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.pie.html.MXR8xN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.pstopdf.html.joGSKL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.rectangle.html.hxk0YJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.rotate.html.yG88cI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setalign.html.OyZlrG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setautostroke.html.j1szFE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setcolor.html.gqt9UC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setdash.html.59nKaB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setfont.html.LSqpqz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setinfo.html.Lf74Fx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setlinecap.html.ecvKWv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setlinejoin.html.ybRudu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setlinewidth.html.lLOfus" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.setunderline.html.sIDnMq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.showat.html.NxDw4o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.showatunderline.html.jqaKmn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.showboxed.html.AdqYEl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.showimage.html.2AuVYj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.stroke.html.jzoXii" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.caution.gif.9Rl0Cg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.home.gif.Ncu3We" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.important.gif.wipFkd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.next.gif.XIgiIb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.note.gif.vmkV59" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.prev.gif.D6zyt8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.stylesheet-images.tmp.KoXfR6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.tip.gif.aSMXe5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.toc-blank.gif.LpWFC3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.toc-minus.gif.9hdo01" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.toc-plus.gif.PUA6n0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.up.gif.dbcPLY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/stylesheet-images/.warning.gif.lSoDbX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/doc/.translate.html.7WBsBV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/.Ex1.php.Geii1T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/.Ex2.php.XCt8qS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/.Yaps.inc.php.RB4YQQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/fonts/.Encoding.Standard.php.1IFPhP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/.interakt.jpg.RjcHIN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/pdf/yaps-1.2/src/.yaps.jpg.lVaAaM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.phones.html.cLluCK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpMyAdmin/.config.inc.php.rpmsave.eo5o4I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.AUTHORS.XkNlxH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.COPYING.1zdj0F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.INSTALL.R5p8tE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.NEWS.Ha91XC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.README.xVRjtB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.TODO.m0wCYz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-csvlib.inc.php.ypRVty" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-datadict.inc.php.HMIBZw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-error.inc.php.tAjEvv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-errorhandler.inc.php.1C8K2t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-errorpear.inc.php.VJRSzs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-exceptions.inc.php.ODD46q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-iterator.inc.php.omy2Jp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-lib.inc.php.K5w1mo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-pager.inc.php.IMsB0m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-pear.inc.php.8TBxEl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-perf.inc.php.wQrYik" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-php4.inc.php.l0IoYi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-time.inc.php.veZPDh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-time.zip.OO4Ikg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb-xmlschema.inc.php.Lkue2e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.adodb.inc.php.Ukk6Kd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/contrib/.toxmlrpc.inc.php.ChtOxc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/cute_icons_for_site/.adodb.gif.KONelb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/cute_icons_for_site/.adodb2.gif.bESF89" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-access.inc.php.ZmgPW8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-db2.inc.php.DduZK7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-firebird.inc.php.nzeoz6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-generic.inc.php.S9o9n5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-ibase.inc.php.VkjEd4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-informix.inc.php.ouW922" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-mssql.inc.php.UMQ0S1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-mysql.inc.php.DAPeJ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-oci8.inc.php.aAqTBZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-postgres.inc.php.NtMUuY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-sapdb.inc.php.duZloX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/datadict/.datadict-sybase.inc.php.OPk6hW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.docs-adodb.htm.aNqwiV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.docs-datadict.htm.QpnUmU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.docs-oracle.htm.V3zMrT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.docs-perf.htm.YHP4zS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.docs-session.htm.xWPXIR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.old-changelog.htm.S6BkSQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.readme.htm.uSox2P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.tips_portable_sql.htm.WIQLcP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/docs/.tute.htm.5zImnO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-access.inc.php.ukFhyN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-ado.inc.php.9GTzJM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-ado5.inc.php.Ut2VXL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-ado_access.inc.php.aXTGcL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-ado_mssql.inc.php.GiF6rK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-borland_ibase.inc.php.apkxHJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-csv.inc.php.T9jcXI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-db2.inc.php.Ar0ddI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-fbsql.inc.php.TcrCtH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-firebird.inc.php.k92RKG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-ibase.inc.php.urL81F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-informix.inc.php.0pU7jF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-informix72.inc.php.DW07BE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-ldap.inc.php.KgxoXD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-mssql.inc.php.3s9dlD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-mssqlpo.inc.php.FvRFJC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-mysql.inc.php.subB8B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-mysqli.inc.php.pOyUxB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-mysqlt.inc.php.3v4cYA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-netezza.inc.php.TlgxoA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-oci8.inc.php.3cjjPz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-oci805.inc.php.jj5mjz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-oci8po.inc.php.6GFrNy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-odbc.inc.php.B0b5hy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-odbc_mssql.inc.php.4Aa7Mx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-odbc_oracle.inc.php.WVztix" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-odbtp.inc.php.ZAydOw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-odbtp_unicode.inc.php.Zp9Hkw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-oracle.inc.php.8htdRv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-pdo.inc.php.77R2nv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-postgres.inc.php.5Jw3Xu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-postgres64.inc.php.xl84xu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-postgres7.inc.php.gtVI8t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-proxy.inc.php.PLn3Jt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-sapdb.inc.php.x4Aolt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-sqlanywhere.inc.php.xhI5Ws" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-sqlite.inc.php.AEI9ys" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-sqlitepo.inc.php.WxBzbs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-sybase.inc.php.3UcVQr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/drivers/.adodb-vfp.inc.php.Nk4Fwr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-ar.inc.php.7Iimdr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-bg.inc.php.9Wg3Tq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-bgutf8.inc.php.dWisBq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-ca.inc.php.147Riq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-cn.inc.php.6EF00p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-cz.inc.php.zCW9Ip" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-de.inc.php.hrL1rp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-en.inc.php.kkYUap" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-es.inc.php.zsYEUo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-fr.inc.php.vEUpEo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-hu.inc.php.ywoepo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-it.inc.php.58G39n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-nl.inc.php.lK5QVn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-pl.inc.php.rejFHn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-pt-br.inc.php.sgOttn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-ro.inc.php.ZoKZfn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-ru1251.inc.php.Laww2m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/lang/.adodb-sv.inc.php.SvaUPm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.license.txt.llViDm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf/.perf-db2.inc.php.PBwirm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf/.perf-informix.inc.php.lqz0fm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf/.perf-mssql.inc.php.8rqJ4l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf/.perf-mysql.inc.php.hCFVTl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf/.perf-oci8.inc.php.z6ovJl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/perf/.perf-postgres.inc.php.i4Crzl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.pivottable.inc.php.jv1Jpl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.readme.txt.AQfLgl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.rsfilter.inc.php.hYqN7k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.server.php.guirZk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-compress-bzip2.php.6c75Qk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-compress-gzip.php.7519Kk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-cryptsession.php.P2FeFk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-encrypt-mcrypt.php.wpyjzk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-encrypt-md5.php.D7Ttuk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-encrypt-secret.php.s57Epk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-sess.txt.WoxQkk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-session-clob.php.spNKgk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-session.php.Zh8Fck" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-sessions.mysql.sql.fNnOdk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-sessions.oracle.clob.sql.XdmXek" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.adodb-sessions.oracle.sql.Gdy6fk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/session/.crypt.inc.php.F2Pfhk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.benchmark.php.3vlpik" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.client.php.hVRTjk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.pdo.php.hzQ7lk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test-datadict.php.77Mmok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test-perf.php.hQAGrk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test-pgblob.php.JJ60uk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test-php5.php.WPgbzk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test-xmlschema.php.8BimDk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test.php.lUM9Hk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test2.php.TrhiOk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test3.php.2DvrUk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test4.php.isXA0k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test5.php.IXD46k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.test_rs_array.php.jaPEel" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testcache.php.mnKfml" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testdatabases.inc.php.8E5Qtl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testgenid.php.ejXwCl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testmssql.php.scEdLl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testoci8.php.C2WUTl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testoci8cursor.php.c74W2l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testpaging.php.SCckdm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testpear.php.qfgInm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.testsessions.php.8px6xm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.time.php.h3DuMm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.tmssql.php.Zc1T0m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/tests/.xmlschema.xml.VuGjfn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.toexport.inc.php.1hSjun" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.tohtml.inc.php.g7clJn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/.xmlschema.dtd.l79qZn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/xsl/.convert-0.1-0.2.xsl.hV7xfo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/xsl/.convert-0.2-0.1.xsl.kfC1vo" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/04/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/05/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/00" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/adodb/xsl/.remove-0.2.xsl.JQEzNo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.config.php.0JF84o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.admin.php.YcWHmp" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/06/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/07" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.calendar.php.MD1DEp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.db.php.xOxjXp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.display.php.mux0fq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.event_delete.php.bFghzq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.event_form.php.vf5ySq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.event_submit.php.iOjxcr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.html.php.KlTzwr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.index.html.OXF0Rr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.login.php.U2xsds" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.logout.php.nvEUys" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.new_user_submit.php.oXmqUs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.options_submit.php.hypWft" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.search.php.ZSSVDt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.setup.php.4ZP11t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/includes/.style.php.L6pfru" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.index.php.tzluQu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.install.php.GGFJfv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de/LC_MESSAGES/.index.html.hg50Hv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de/LC_MESSAGES/.messages.po.KD1iaw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/de/.index.html.ZuBWCw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/locale/.index.html.5FKA5w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.messages.po.Rm1eyx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/phpcal/.update.php.fr4G2x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.png2gd.php.UEAdxy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.prodUpdate.php.NLGK1y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/produce/.index.php.UqShwz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/produce/.produce_history.php.T2hP0z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/produce/.smallCal.php.Ltz0vA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/..DS_Store.gsad1A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/..addClerks.php.swp.hoVMwB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/..barcode.php.swp.4f9I2B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/..checkProdChanges.php.swp.v0QlBC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/..edits.swp.x82jaD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.AR_30.php.ImahLD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.AR_60.php.OwBfmE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.AR_90.php.6JeeXE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.AR_Curr.php.1aYcyF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.Enter_calls.php.0TWb9F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/FE/.cash_report.php.7rzALG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/FE/.cash_report.php~.eel0nH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/FE/.funct1Mem.php.mWAq0H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.ITcall.html.i2dvEI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.ITdbconnect.php.6BkBiJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.PriceChange.bak.MdEHWJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.PriceChange.html.f38NAK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.\.O4JUeL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.action.php.mHFUWL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.addClerks.php.JlnVEM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.addLikeCode.php.lncWmN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.addShelfTag.php.tGfX4N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.addShelfTag1.php.GatWQO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.barPage.php.uNBWCP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.barcode.php.y6aXoQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.bartest.php.CU6KcR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.batch.html.iTfA0R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.batch.php.WT0pOS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.batchList.php.0sWfCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.batchMovementReport.php.sA35pU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.batchMvRpt.php.7XwDeV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.batchTest.php.yw6b3V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/..addItems.php.swp.2TzASW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/..batches.php.swo.CPwmIX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/..batches.php.swp.ZYvvyY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/CalendarControl/.CalendarControl.css.oQIKpZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/CalendarControl/.CalendarControl.js.sJ60g0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/CalendarControl/.CalendarControl_O.js.utZC80" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.addBat_orig.php.WjP601" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.addBatch.php.vutBT2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.addItems.php.M2gdO3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.batchTest.php.yi3PI4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.batcher.php.U8XwD5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.batcher.php~.B2rey6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.batches.php.l71Vs7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.batches.php~.Mt3Bp8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.batches_orig.php.qLajm9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.calendar.html.Kan4ia" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.deleteBatch.php.yu8Pfb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.deleteBatch.php~.Pi4Bcc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.display.php.gHgo9c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.forceBatch.php.D9sE7d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.index.php.yTNV5e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.index.php~.fVoh4f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.index_orig.php.4fCD2g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.session.php.y1TJ2h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.testAlert.php.ekeR2i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches.old/.testFunct.php.zPDY2j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/..batches.php.swo.Mwt62k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/CalendarControl/.CalendarControl.css.D26Q3l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/CalendarControl/.CalendarControl.js.b0LC4m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/CalendarControl/.CalendarControl_O.js.8WaI5n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.addBat_orig.php.TyeH7o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.addBatch.php.2aeH9p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.addItems.php.AQcper" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.addItems_prob.php.Oh9bjs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.batchTest.php.umIbrt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.batcher.php.G8Vczu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.batcher.php~.oqmeHv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.batches.php.MWVfPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.batches.php~.XEwlXx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.batches_orig.php.8PIE7y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.calendar.html.ypYYhA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.changeReportDate.php.UsqjsB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.deleteBatch.php.0DQHCC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.deleteBatch.php~.Vsw6MD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.display.php.P6svXE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.forLisa.php.6RkU8F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.forceBatch.php.aOjkkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.index.php.CUYNvI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.index.php~.oSDLJJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.index_orig.php.XZjKXK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.session.php.EY6MbM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.testAlert.php.I5tQpN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/batches/.testFunct.php.hB4TDO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.bradQuery.html.D3MXRP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.bulkInventory.php.Auim8Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.checkDigit.php.BRILoS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.compareProducts.php.qelbFT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.compareProductsOld.php.zQgBVU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.connect.php.QQl5bW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.csvLisa.html.msYzsX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.csvQuery.html.uaWXNY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.csvQuery.php.gX1m9Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.dailySalesReport.php.1r8Pu1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deleteItem.php.szIjQ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deli.working.UzBNb4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deliQuery.php.UAHhx5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deliQuery_orig.php.zSBLT6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deliconnect.paekg8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deliquery.html.IOpTC9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deliquery.orig.kMwc1a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.dept_pCodes.php.P2Ewpc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.deptavg.php.iFhRNd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/docs/.batches.html.8Diccf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/docs/.hourly.html.mtcYBg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/docs/.movement.html.dBXK1h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/docs/.prodList.html.awiBrj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.editReceipt.php.JNYrRk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.editReceipt2.php.vy7iim" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.emailReport.php.0gibJn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterItem.php.dKa89o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterItemTest.php.KZBUDq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterItem_orig.php.zTWM7r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterTestItem.php.KDDiCt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterTestItemPalm.php.qP0Q6u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterTestItemScale.php.oR1LBw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.enterTestItemScanner.php.uIhf8x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.findReceipt.php.17rOEz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.forLisa.php.Ar7nbB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.frankSales.php.FU6XHC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.funct1Mem.php.zG7PeE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.functMem.php.GlThMF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.functions.php.dGPZjH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.graphtest.php.yibaXI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csvfiles/.jcbsubkzuduruwkjqqhc_et_scale_0.csv.ZRfpAK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csvfiles/.jcbsubkzuduruwkjqqhc_et_scale_1.csv.79SEdM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csvfiles/.jcbsubkzuduruwkjqqhc_wi_scale_0.csv.CAVUQN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/csvfiles/.jcbsubkzuduruwkjqqhc_wi_scale_1.csv.cFabuP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.delete.php.ReZr7Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.error.log.KO1IKS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.ini.php.vhb0nU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.parse.php.cTqv6V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.query.log.XUH1OX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.read.php.reMW8Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.read_et.php.HuwAx2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/hobartcsv/.writecsv.php.SSZeW4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourSalesTest.php.Y0Rel7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlyAuthCSV.php.s6mYK9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlyCSV.php.T4FIac" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlySales.html.zO4aBe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlySales.php.bYeE1g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlySalesAuth.php.xY2vvj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlySalesAuth1.php.PNzoZl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlySalesDept.php.NN8Cto" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlySalesTest1.php.1wzIYq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlyTest.CSV.php.1mNOtt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hourlyTestCSV.php.1GwgZv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.hours90.php.fNKawy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.include.php.YU352A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.index.html.LrQ1zD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.index.php.VJDb7F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.item_check.php.ppzKHI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.justinCSV.html.iFOkiL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodebrad.php.fvfVSN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodecell.php.5jUQtQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodejesse.php.rgk94S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodejill.php.48pOGV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodejim.php.naWPiY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodekarl.php.o7DeV0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodenew.php.GLpZx3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodenew.php~.yPGZa6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.barcodesusan.php.hvVlO8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.cleanDupProduct.php.DVP4rb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.cleanDups.php.Ww7w6d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.delibar.php.TE20Kg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.delibarlist.php.PzJMrj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/delitags/.index.js.p7bz8l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/delitags/.index.php.wnxHPo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarbrad.php.c5uiyr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarcodes.php.FyeUgu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarjesse.php.1FawZw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarjill.php.xam8Hz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarjim.php.SehcsC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarkarl.php.yETgcF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpBarsusan.php.LXPlWH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.dumpNewProd.php.QVSqGK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.fixProd.php.uc1zrN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.index.html.cGSJcQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.index.php.6r3TXS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.labelFunct.php.qFFmLV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.test.php.lH6PyY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.test.php~.1KKjm1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/labels/.testCheck.php.Ki7Ra4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.laneUpdates.php.5t9qZ6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.leave_orig.php.U0o0N9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.likeCodes.php.SEdiDc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.lisaCSV.html.PORAsf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.lisaQuery.html.vIpJii" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.lisaQuery.php.iDLS8k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.lisaTest.php.Z9aLZn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.listDel.php.ZEREQq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.masterList.php.jJmTHt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.memTrans.php.FWoPAw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.michaelQuery.html.IwnMtz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.modified.php.eAxJmC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.monthlySalesReport.php.NEOGfF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.monthlySalesXL.php.L1kE8H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.movementManu.php.bdMX1K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.movementProd.php.AcRDVN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.categoryMargins.php.MW32PQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.csv_parser.php.Z30sKT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.howtoUL.php.cZGfGW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/images/.archive.png.W2h3BZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/images/.results.png.x0C9y2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/images/.saveas.png.Su0Jw5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/images/.techsupport.jpg.kvV5u8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.import.log.DNwbxb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.importCategories.py.og4hze" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.index.php.xsHoBh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.loadUNFIprices.php.flePDk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.npp_planning.txt.PyNZGn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.reCalcSRPs.php.TH9aKq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.unfi_invoice_fixer.php.V7r4Nt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.unficategories.csv.JBsYRw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/npp/.uploadPriceSheet.php.d1jsXz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.lisaQuery_orig.html.yNVW2C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesBulk.php.iuJr8F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesCool.php.Dq9heJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesDeli.php.m0nRkM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesGroc.php.VUprrP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesHBA.php.op4CyS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesProd.php.Dg0PFV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old/.salesWeekTotal.php.lu2tOY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/old_stuff/.view.php.aGR8W1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.penavg.php.piMN54" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.penny.php.eyqOe8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.pickList.php.chVVob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodAllLanes.php.w6g4ye" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodFunction.php.tvUcJh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodFunction2.php.zIfXTk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodFunctionPalm.php.VLdi5n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodFunctionScanner.php.cfw0gr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodFunction_test.php.ukA4su" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodFunction_test.php[B.FDluFx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodMaint.php.942hSA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodName.php.cXoH5D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.prodUpdateDel.php.o6HOjH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productCSV.php.gSTWxK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productCSV.php.orig.VFCqMN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productDel.php.LrOD1Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productInfo.php.nLVRgU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productInfoTest.php.1YgswX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productInfo_orig.php.ZCTqM0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productList.php.JRVR23" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productListCSV.php.NdXEj7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productListCSV_Justin.php.jvEbBa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productListDesc.php.8NB4Sd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productListDisco.php.8dbkbh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productListTest.php.ZnmXtk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productTest.php.PPGdNn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productTestLike.php.T79u6q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productTestPalm.php.6ePcru" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productTestScale.php.tPjVLx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productTestScanner.php.MvAE6A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.productTest_orig.php.LCQHrE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.query.class.o2mcNH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.query.html.trdZ8K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.reprint.php.F2xZvO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.saleTest.php.QSO0SR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesFunction.php.2Mx2fV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesFunctionSelectable.php.5vDpDY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesFunctionTest.php.0GF901" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesFunctions.php.oBeis5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesReport.php.JehNT8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesReport1.php.HyfFlc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesReportSelectable.php.laLTNf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesToday.php.Ph1dhj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.salesYest.php.nCdzKm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.scaleList.php.obCUdq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.scaleSynch.php.sEOkIt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.staffAR.php.oAVLcx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test.html.dJcdHA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test.php.2pbKcE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/test/.batchFrame.php.bX2hIH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/test/.batchHeader.php.YOwDfL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/test/.batches.php.6UVZMO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/test/.functions.php.UrqmkS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/test/.testBatch.php.hUaJRV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/test/.testProd.php.TP25oZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test1.php.heJaX2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test4.php.mRngv6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test4_orig.php.KzfI39" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test4a.php.TMbwCd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test4csv.php.KMHGbh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test4xl.php.fBZaNk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test4xl_old.php.YFu1oo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.test5.php.6qBh1r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testBrand.php.10IaGv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testDrop.php.c0I4kz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testFunc.php.r8OYZC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testList.php.SE8SEG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testName.php.R6HNjK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testPForm.php.bLnIYN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testPlant.html.HO3iFR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testPlant.php.1kIUlV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testSales.php.9yxw2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.testUPC.php.4J28I2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.transaction.php.qUIRr6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.trash.png.fR3Aaa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.unsale.php.7eDkTd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.untitled text.SzzKDh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItem.php.A2jbol" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItemTest.php.4Trc9o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItemTestPalm.php.BLgyUs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItemTestScale.php.WiRgGw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItemTestScanner.php.ADgmsA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItemTesting.php.Mx1UeE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateItem_orig.php.C0oQ1H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateProdcuct.bak.Uit8OL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateProduct.php.CbeNCP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateTest.php.R8iOqT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.updateTestItem.php.E7dwhX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.weeklySalesReport.php.iyCG90" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.weeklySalesReportXL.php.vpZR14" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/queries/.weeklySalesXL.php.RvA3T8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.repDateXL.php.IDhfMc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.report.php.rLPLEg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reportDate.php.Sr1Exk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reportDate.php_orig.f1b5qo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reportDateLast.php.RZ4Oks" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reportDateLastXL.php.xtPWew" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reportDateXL.php.FS6vbA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reportWeekly.php.B07M8D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.reports.php.Lp645H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/.lane_status.php.ApkI3L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.bg.jpg.oM9g4P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.bg2.jpg.R1hc5T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.allbuilder.subclass.Suj5bY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.bakehouse.builder.7MpZi2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.bread.builder.1IWTp6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.builder.class.iWyOwa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.bulkbuilder.subclass.fu42Ee" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.bulkncbuilder.subclass.R0kiNi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.candybuilder.subclass.mFNxVm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.cheesebuilder.subclass.hwtN3q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.coffee.subclass.YXFtdv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.delibuilder.subclass.jFDanz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.flowersbuilder.subclass.ymTRwD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.frozenbuilder.subclass.OslzGH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.fsbuilder.subclass.qqzVSL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.genmerchbuilder.subclass.LmFi5P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.hbcbuilder.subclass.l9QFhU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.hsbuilder.subclass.uRg3tY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.juicebarbuilder.subclass.uxVqG2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.meatbuilder.subclass.XVEOS6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.msbuilder.subclass.jT7c5a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.pcbuilder.subclass.0wvhjf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.pgbuilder.subclass.KFJmxj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.producebuilder.subclass.eccsLn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.rgbuilder.subclass.dzJxZr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.specialsbuilder.subclass.VuvDdw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.suppbuilder.subclass.pfcBvA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/builder/.yogurtbuilder.subclass.OyDzNE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.allpdf.subclass.Fbhy5I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.bakehousepdf.subclass.3hxSnN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.bread.subclass.NLizGR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.bulkpdf.subclass.rSPCZV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.cheesepdf.subclass.9cd3i0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.delipdf.subclass.22KzC4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.flowerspdf.subclass.cBaJW8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.frozenpdf.subclass.mY3ehd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.fspdf.subclass.GxE7Bh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.genmerchpdf.subclass.CvWmXl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.hspdf.subclass.E5ZYiq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.juicebarpdf.subclass.9sFDHu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.meatpdf.subclass.9nUE6y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.pcpdf.subclass.Y1cawD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.pdf.class.Gug2VH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.pgpdf.subclass.EEximM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.producepdf.subclass.PezUMQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.rgpdf.subclass.seDSdV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.specialspdf.subclass.oeqdFZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/classes/pdf/.supppdf.subclass.7M0U63" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.index.php.rMKRy8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.query.php.PY0a1c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.style.css.fQaduh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.technical.html.oTGgXl" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/07/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/08/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/07" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.test_it_out.php.oA66qq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/movement/.user.html.D35XUu" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/09/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/04" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.backend_functions.inc.fgM5oz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.bg.jpg.nFRDTD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.journal.php.ZJBprI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.junk.xb6fZM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.no_results.php.vBF7xR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.pdf.class.E5g06V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.query.class.uyMTF0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.result.php.cY2Tf5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.style.css.ki4UP9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.technical.html.iZhWpe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/reports/report97/.user.html.UzRz2i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.robots.txt.dnDeFn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.select_dlog.php.jQvThs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.session.php.Mk2BUw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.styles.css.TmWkxB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.test.php.0t039F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.testDiff.php.ZrkNMK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.testEOM.php.vlhbqP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.testReport.php.ijZA3T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.totspn.php.MPFeHY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.totspn_error.php.BVbgl3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/weekly/.index.php.Kt1BZ7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/WebServer/Documents/.zipReport.php.pJgeJc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..CFUserTextEncoding.uGZLuh" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..DS_Store.lWXJim" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/.OSXvnc1.71.dmg.JYthdr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/.custserve2.VCtoxw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/.mysql-gui-tools-5.0-r4-osx10.4-universal.dmg.VxtwRB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/.Info.plist.Fp3FEQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/MacOS/.webcruiser.cuLQr5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/.PkgInfo.FLkJgk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj/.InfoPlist.strings.KlxC5y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib/.classes.nib.N0VvUN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib/.info.nib.T3zpJ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.Trash/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib/.keyedobjects.nib.Qt2kzh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..bash_history.iu6SUw" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..bash_profile.fTxpfN" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..bashrc.aa4Mj4" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..crontab.K9Cdol" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..mysql_history.P4cGsC" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.ssh/.authorized_keys.fLudxT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.ssh/.id_dsa.8sQLBa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.ssh/.id_dsa.pub.Ju2kGr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.ssh/.id_rsa.ZmrUKI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/.ssh/.known_hosts.Vf3tPZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..viminfo.K7k7Tg" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/..vimrc.c6JQYx" failed: Read-only file system (30) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/..DS_Store.0W3D3O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/..localized.aAru85" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/.1015.csv.6Geldn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/.Ext2FS_1.4d4.dmg.fWCVoE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/.Scala Sans 1PS.zip.zke3eW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/..DS_Store.W5y9je" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/..DS_Store.hOgGrw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/..DS_Store.khm9AO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.ADODB481.tar.XZ0uO6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.PoweredByMacOSX.gif.FoVMwp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.PoweredByMacOSXLarge.gif.VT4NfI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.WebCalendar-1.0.3.tar.OV5C10" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.AUTHORS.2k46Ak" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.GPL.html.JGGKdE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.NEWS.AdsMQX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.README.html.u46buh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.UPGRADING.html.7BVU7A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.activity_log.php.0qq0LU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.add_entry.php.nwtsqe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.admin.php.iKbq5x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.admin_handler.php.XBP2KR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.adminhome.php.9gcMsb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.approve_entry.php.bDTebv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.assistant_edit.php.WeiITO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.assistant_edit_handler.php.wIUgD8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.availability.php.BsfQms" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.category.php.YHQp6L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.category_handler.php.eKdlQ5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.circle.gif.XajmBp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.colors.php.Jg1nmJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.datesel.php.dJ0p72" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.day.php.h83NSm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.del_entry.php.QfZyEG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.del_layer.php.HqNgs0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs/.README.iesZfk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs/.WebCalendar-Database.html.RinH4D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs/.WebCalendar-DeveloperGuide.html.H4BuUX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs/.WebCalendar-Styling.html.tQVZKh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs/.WebCalendar-SysAdmin.html.eebnDB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/docs/.newwin.gif.8DdAxV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_entry.php.sgeesf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_entry_handler.php.E2yDnz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_layer.php.m5xDjT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_layer_handler.php.uOsYfd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_nonusers.php.bDXFcx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_nonusers_handler.php.wah79Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_report.php.8aGz7a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_report_handler.php.CzMn5u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_template.php.My9U3O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_user.php.DoCt28" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.edit_user_handler.php.7PDJ1s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.export.php.gTD00M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.export_handler.php.tRDM06" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.favicon.ico.TcVc1q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.gradient.php.jLB92K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.group_edit.php.YO7O54" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.group_edit_handler.php.EPvv8o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.groups.php.yqehcJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help.gif.GL23f3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_admin.php.S72Qjn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_bug.php.D5xwoH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_edit_entry.php.tPYct1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_import.php.tfRUyl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_index.php.6sCDEF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_layers.php.yyzmKZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.help_pref.php.9bwpRj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.htmlarea-3.0rc1.zip.s95P1D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.import.php.CpMpfY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.import_handler.php.i4Xwti" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.import_ical.php.lPtgIC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.import_palmdesktop.php.IriKYW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.import_vcal.php.hNNwfh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.config.php.88iIwB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.connect.php.qG04PV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.dbtable.php.qXmMag" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.functions.php.68o8wA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.help_trailer.php.cAMyXU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.index.html.5Fb0nf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.index.php.V3LrOz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.init.php.yTgUeU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.js.php.WvpGFe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.admin.php.Y2uU7y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.assistant_edit.php.qc7RAT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.availability.php.KkrQ3d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.colors.php.LCHTxy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.datesel.php.kzVX1S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.edit_entry.php.10F2vd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.edit_layer.php.yfoX0x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.export.php.XyPSvS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.popups.php.VEG90c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.pref.php.qMo9wx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.purge.php.X7V92R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.search.php.02vlBc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.users.php.zTVx9w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.usersel.php.FbxKHR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.view_d.php.EM5phc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.views_edit.php.37H6Qw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/js/.visible.php.ckvNqR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.php-dbi.php.aiHu0b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.print_styles.css.3AU7Aw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.settings.php.orig.puYLbR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.site_extras.php.Ta8DMb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.styles.php.fVZlpw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.trailer.php.9flH2Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.translate.php.EqwoGb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.user-app-postnuke.php.djqqkw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.user-ldap.php.MUTQYQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.user-nis.php.XCwDDb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.user.php.A8OMiw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/includes/.validate.php.kdThYQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.index.php.jKOSEb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.install-datebook.patch.mbHulw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/install/.index.php.Li761Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.layers.php.MNpkJb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.layers_toggle.php.nXVSqw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.leftarrow.gif.dLlU9Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.leftarrowsmall.gif.dKDWSb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.list_unapproved.php.za0YBw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.login.gif.2CxClR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.login.php.EXZg5b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.month.php.PKmhPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.new.gif.fjZPBR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.nonusers.php.c2ppoc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.nonusers_handler.php.av1Yax" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.pix.gif.8NkRYR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.pixb.gif.DGVKMc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.pref.php.0snFAx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.pref_handler.php.ja4qpS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.publish.php.iJMded" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.purge.php.INPz4x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.reject_entry.php.bEygVS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.report.php.35pkMd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.rightarrow.gif.wmKwEy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.rightarrowsmall.gif.qpJJwT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.search.php.ogWWoe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.search_handler.php.TjSHhz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.select_user.php.P8ItaU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.set_entry_cat.php.SGV06e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.spacer.gif.S1ez3z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.tables-db2.sql.njX7ZU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.tables-ibase.sql.LAz3Wf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.tables-mysql.sql.sbWlUA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.tables-oracle.sql.E3wgSV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.tables-postgres.sql.p6HKRg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.check_translation.pl.Fi1USB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.convert_passwords.php.u4UgWW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.palm_datebook.pl.2bXDZh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.send_reminders.php.GK9m3C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.summary.txt.mqRs7X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.translation_summary.pl.RtPWej" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.update_all.pl.tmCsmE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.update_translation.pl.o5IYtZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/tools/.upgrade_to_0.9.7.pl.QqCPBk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Basque.txt.a2ebKF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Bulgarian.txt.14iuV0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Catalan.txt.V1hx7l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Chinese-Big5.txt.xZF2kH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Chinese-GB2312.txt.YAHgz2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Czech.txt.lbXmOn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Danish.txt.ZJ633I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Dutch.txt.VpDIk4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.English-US.txt.cMw7Bp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Estonian.txt.2HbgUK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Finnish.txt.XoH0c6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.French.txt.VNdXwr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Galician.txt.ANMCRM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.German.txt.aLP2c8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Holo-Big5.txt.89VEzt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Hungarian.txt.lku0WO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Icelandic.txt.dhktla" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Italian.txt.18CtKv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Japanese-eucjp.txt.a6uoaR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Japanese-utf8.txt.MTm3Ac" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Japanese.txt.pmNp2x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Korean.txt.Pk6xuT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Norwegian.txt.ndWoXe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Polish.txt.dmIYqA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Portuguese.txt.qDngVV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Portuguese_BR.txt.aDYiqh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Romanian.txt.uFk3VC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Russian.txt.FnrTsY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Spanish.txt.UEMt0j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Swedish.txt.MU7MyF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Turkish.txt.w9BP70" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/translations/.Welsh.txt.qtLAHm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.upcoming.php.qKXZhI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.users.php.7bOUS3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.usersel.php.WCUUtp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_d.php.7Upd5K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_entry.php.Hsk1G6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_l.php.Wkstjs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_m.php.S5TfWN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_t.php.65woz9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_v.php.69X1cv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.view_w.php.5cZ1QQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.views.php.zhJKvc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.views_edit.php.n8Cuay" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.views_edit_handler.php.M9rXPT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.week.php.Uzkrvf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.week_details.php.XQigbB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.week_ssi.php.bcsuRW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/ws/.get_events.php.5Ch2xi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/ws/.get_reminders.php.z8TWeE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/ws/.login.php.UhRgWZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebCalendar-1.0.3/.year.php.miCTDl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-bw.gif.kKn5nH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-fade.gif.FOVh82" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-line.gif.OdJuSo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple-line2.gif.QnLHCK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Apple.gif.KW0Um6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Attribute.gif.yi6P7r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Back2MetalBtn.gif.Vz7LSN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BackMetalBtn.gif.Hep9E9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BackWOBtn.gif.A8vxrv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Background.gif.B2PVdR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BuildQueryWOBoxMenu.gif.L7nk0c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.BuildQueryWOBoxMenuGrey.gif.tUIaOy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonBuildQuery.gif.r7N1BU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonCancel.gif.qhFTpg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonCustomize.gif.AlFLdC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonDelete.gif.zjZ32X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonEdit.gif.x98mSj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonHome.gif.48sGHF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonInspect.gif.dz0Zw1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonLogin.gif.Sahonn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonLogout.gif.jNuNdJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonNew.gif.MhRc44" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonQueryDB.gif.eXmqWq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSave.gif.JkOEOM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSearch.gif.OgrTG8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallAdd.gif.08f8yu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallDelete.gif.JXjnrQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallEdit.gif.u1Kvmc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallInspect.gif.XrWEhy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallSearch.gif.HwlOcU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ButtonSmallSelect.gif.H9VX7f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CancelMetalBtn.gif.LXe82B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CancelWOBtn.gif.KeQiYX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CheckboxOff.gif.kWzgVj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CheckboxOn.gif.8n4eSF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ChooseMetalBan.gif.0oNdP1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ConfirmMetalBan.gif.JbGcMn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CurrentlyMetalBan.gif.M5QbJJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CustomizeWOBoxMenu.gif.4oxfH5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.CustomizeWOBoxMenuGrey.gif.6m2jFr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.D2W-ban.gif.QIKoDN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DTW.gif.XTbPB9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteMetalBtn.gif.s2eIBv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteMetalSmBtn.gif.Zf6BBR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteWOBtn.gif.657vBd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DeleteWOSmBtn.gif.KIoqBz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.DownArrow.gif.HNRqCV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditBan.gif.3SasDh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditMetalBan.gif.p7DtED" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditMetalBtn.gif.MelTHZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditMetalSmBtn.gif.M9lkLl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditWOBoxBan.gif.pAELOH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditWOBtn.gif.ItHaT3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.EditWOSmBtn.gif.eAtAXp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Entity.gif.ugu01L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ErrorMetalBan.gif.lwBu77" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.FindMetalBan.gif.fJzZcu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.FindWOBoxBan.gif.LwHuiQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.HomeWOBoxMenu.gif.g2L4oc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.HomeWOBoxMenuGrey.gif.bVAFvy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectMetalBan.gif.8O6PDU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectMetalSmBtn.gif.YCo1Lg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectWOSmBtn.gif.SuZcUC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.InspectorSmallButton.gif.g3No2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LeftArrow.gif.2iXEbl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ListMetalBan.gif.rlWVkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ListWOBoxBan.gif.kW4cu3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LoginMetalBtn.gif.mHEPDp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LoginWOBtn.gif.x4cNOL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LogoutWOBoxMenu.gif.rI7LZ7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.LogoutWOBoxMenuGrey.gif.2tcLau" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.MetalBtn.gif.54uKlQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.MoreMetalSmBtn.gif.zZRxyc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.MoreWOSmBtn.gif.s33lLy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewMetalBtn.gif.TCtaYU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewRecordBlackMenu.gif.uf3Yah" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewRecordWOBoxMenu.gif.dYD3qD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewRecordWOBoxMenuGrey.gif.ck98GZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewWOBoxMenu.gif.XfQeXl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NewWOBoxMenuGrey.gif.w9KkdI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.NoMetalBtn.gif.ExKqt4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.OKMetalBtn.gif.Dp4wJq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Plus.gif.movP0M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryDBMetalBtn.gif.XtD8h9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryDBWOBtn.gif.9h3rzv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryMetalBan.gif.LX5PRR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryMetalBtn.gif.ajWeae" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.QueryWOBoxBan.gif.zaCZsA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.Relationship.gif.mKuIMW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.RemoveMetalSmBtn.gif.KQhs6i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.RemoveWOSmBtn.gif.u3mcqF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ReturnButton.gif.KXr6K1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ReturnMetalBtn.gif.2Kq15n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ReturnWOBtn.gif.VfIWqK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.RightArrow.gif.DERlN6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SaveMetalBtn.gif.SUSL9s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SaveWOBtn.gif.UfbcwP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchDBMetalBtn.gif.p1FCSb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchDBWOBtn.gif.3EfLfy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchMetalBan.gif.Z2wUCU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchWOBoxBan.gif.zuop0g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchWOBoxMenu.gif.HNoCpD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SearchWOBoxMenuGrey.gif.Ho7POZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SelectMetalSmBtn.gif.1b33dm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.SmallPBWO.gif.GciiDI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.UpArrow.gif.kKaX34" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ViewMetalSmBtn.gif.EqoDur" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ViewWOSmBtn.gif.wwMjVN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.WhiteAppleWOBox.gif.Dvo0la" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.YesMetalBtn.gif.8J4YOw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.add-sm-btn.gif.HACYhT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.back-btn.gif.LqnYKf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.bino-btn.gif.lRjYdC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.bldqry-btn.gif.vdvYGY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.bldqry-grey-btn.gif.92J2al" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.cancel-btn.gif.0oH7EH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.cancel.gif.TMYc93" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.choose-ban.gif.gCHTDq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.confirm-ban.gif.d7cB8M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.currently-ban.gif.45T0D9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.custmz-btn.gif.W4pr9v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.custmz-grey-btn.gif.yFBjGS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.del-sm-btn.gif.IODcdf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.delete-btn.gif.9YR5JB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.edit-ban.gif.IAiZgY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.edit-btn.gif.TIO4Ok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.edit-sm-btn.gif.t56anH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.error-ban.gif.qjBhV3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.exclamation.gif.EguPuq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.eye.gif.smco4M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.find-ban.gif.t95WD9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.find-btn.gif.4jItew" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.fuzzyGreyStripe.gif.Jx70OS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.grayWebObjects.gif.D2Iypf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.greyStripe-noline.gif.z3ux1B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.greyStripe.gif.pc7wDY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.home-btn.gif.NAVwfl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.home-grey-btn.gif.l3UwRH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.inspect-sm-btn.gif.dg4Ov4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.inspectMagGlass.gif.nP779q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.lft-OSarw.gif.YvorON" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.list-ban.gif.kZ5Ksa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.login-ban.gif.QE346w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.login-btn.gif.gVitMT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.logout-btn.gif.V4nSrg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.logout-grey-btn.gif.MyLh7C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.magglass-btn.gif.kwLKOZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.more-sm-btn.gif.zLuewm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.new-btn.gif.OCrIdJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.new-grey-btn.gif.o2HcV5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.new-lt-btn.gif.h5bHCs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.newrec-btn.gif.QpuClP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.newrec-grey-btn.gif.9Iuy4b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.no-btn.gif.rTMuNy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.no.gif.ZhgrwV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ok-btn.gif.c4aIfi" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/10/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/11/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/12/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/01" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.ok.gif.iuNE0E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.powrdbyWO-ban.gif.iPpIL1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.qry-ban.gif.SDoMwo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.qrydb-btn.gif.tSbKiL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.remv-sm-btn.gif.9YGI47" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.return-btn.gif.L3vHQu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.rt-OSarw.gif.wNQrFR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.rt-arw.gif.tI7cue" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.save-btn.gif.XcDYiB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-ban.gif.FgjK7X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-btn.gif.j8mwWk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-grey-btn.gif.aJjmLH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.search-lt-btn.gif.OlNcA4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.searchdb-btn.gif.UZy3or" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.select-sm-btn.gif.2IOojO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.trashcan-btn.gif.Ki6Kdb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.view-ban.gif.4EA77x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.view-sm-btn.gif.wkmu2U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.write-btn.gif.q2mVWh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.yes-btn.gif.E5ZmRE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaDirectToWeb.framework/WebServerResources/.yes.gif.HKMOL1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAdd-windows.gif.bTMgGo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAdd.gif.mltJAL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAppend-windows.gif.Y8tcv8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconAppend.gif.aJ6Wyv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconCancel-windows.gif.mDuICS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconCancel.gif.8C5tGf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconClear-windows.gif.iM0fKC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconClear.gif.4l09QZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDelete-windows.gif.krH4Xm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDelete.gif.MkIZ4J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDeselect-windows.gif.lNWUb7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconDeselect.gif.R0ydmu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconFind-windows.gif.C8ZwwR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconFind.gif.gnBQGe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconInspect-windows.gif.hVjcUB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconInspect.gif.t3Ly7Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconNew-windows.gif.ZzyVkm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconNew.gif.nZviyJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOk-windows.gif.BgFFL6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOk.gif.bdYt0t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOpen-windows.gif.hx5ifR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconOpen.gif.czw8te" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRemove-windows.gif.K27XIB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRemove.gif.ffiBZY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRevert-windows.gif.Orffgm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconRevert.gif.XouTwJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSave-windows.gif.KQVxN6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSave.gif.4OhE5t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSelect-windows.gif.9WGLnR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.ActionIconSelect.gif.ODnTFe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/English.lproj/.Localizable.strings.WCg1XB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/German.lproj/.Localizable.strings.kD3tgZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/.JavaEOApplication.jar.V4GuBm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.BeansAppletContext.class.2PgM8J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.BeansAppletStub.class.uLXaH7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.BeansCallback.class.0QtAfv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$1.class.P0K0NS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$ActiveWindowDependentAction.class.TTwSng" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$Enabling.class.PrfLXD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_ActionEventSource.class.BO9Dx1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_Application.class.qEix7o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_ControllerHierarchy.class.xPtLHM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_FocusComponent.class.7Gamia" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_Object.class.vRwyTx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_Supercontrollers.class.enNLuV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction$_WindowObserver.class.jidl6i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAction.class.Ip5pIG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionButtonsController.class.iMs6k4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionMenuController.class.L5g8Xr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionTrigger.class.FuQwBP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgetController.class.VlT0ed" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets$_ActionMenuComboBoxModel.class.aLAzVA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets$_Button.class.wR4uCY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets$_MenuItem.class.Ja1Mjm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOActionWidgets.class.y9Pr1J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$1.class.LuaQJ7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$2.class.ENefsv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$3.class.C6M5bT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$ApplicationSupport.class.ducXVg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_ControllerInitializationData.class.ffSOFE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_MenuItem.class.2WKGp2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_QuitHandler.class.BH1Kaq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication$_RecentDocumentsMenuHandler.class.QljQVN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOApplication.class.GpSVGb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOArchive$_ObjectInstantiationDelegate.class.BYgGsz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOArchive.class.pRrIeX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOArchiveController.class.v8p80k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOAssociationConnector.class.MUxhOI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOBeanSupport.class.aOArB6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOBoxController$_TitledBorder.class.RzKhpu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOBoxController.class.QJ2cdS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$ActionCollector.class.t2kK3f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$Activation.class.6KdjUD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$EndEditing.class.YuoSK1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$Modal.class.XwXrBp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController$ResetUserInterface.class.VYJ1rN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOComponentController.class.w4IBib" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_Abstract.class.g97nfz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_ControllerAndSubcontrollers.class.x6rbcX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_ControllerAndSupercontrollers.class.PH67sl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_OnlySubcontrollers.class.ugf9LJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration$_OnlySupercontrollers.class.9bEb57" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$Enumeration.class.z2jeow" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController$_DisposeCallback.class.lokhHU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOController.class.60YM0i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODataSourceFactory.class.2FmVkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODefaults.class.7DBoF5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogController.class.kWsB0t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_InputData.class.aW6OlS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_StringInputHandler$_DocumentListener.class.cGXmIg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_StringInputHandler$_OperationListener.class.WhPV4E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs$_StringInputHandler.class.4iJXr3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODialogs.class.mA8mPr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODisplayUtilities$_FocusComponentActivation.class.1QdEdQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODisplayUtilities.class.qMsWBe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODocument.class.r37b1C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EODocumentController.class.wsRsq1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOEditable.class.a1SjQp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOEntityController.class.D7PbgO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOFrameController.class.J4DoGc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOInspectorController$_InspectorWindowManager.class.RgWX6A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOInspectorController.class.DBIhyZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOInterfaceController.class.ffxj0n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOMenuSwitchController$_SwitchComboBoxModel.class.ztfmsM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOMenuSwitchController.class.ehweVa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOModalDialogController$ModalActions.class.u1bQoz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOModalDialogController.class.XzBsSX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOObjectDisplay.class.a1O9mm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOObjectDisplayDocument.class.FbTRRK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOProgrammaticSwitchController.class.aY8zm9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSimpleWindowController.class.Vl7DRx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSplitController$_SplitPane.class.w0J1mW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSplitController.class.3nTHSk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOSwitchController.class.WEzMoJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOTabSwitchController$_TabbedPane.class.648bV7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOTabSwitchController.class.85KXrw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOURLClassLoader.class.pGk6YU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_ConcreteIconSet.class.sxXXwj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_ConcreteTitleSet.class.2OoQ4H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_DarkImageFilter.class.aJRhE6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_IconHandler.class.aM8Jdv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_IconSet.class.GEIcNT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_LightImageFilter.class.dJvFmi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_TitleSet.class.BoFIXG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters$_TransparentIconFilter.class.ynUMy5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOUserInterfaceParameters.class.s3vR9t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowController$_Toobar.class.x9PTLS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowController.class.EH4Xnh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver$1.class.8Dyk2F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver$_ActivateWindowRunnable.class.0H8HG4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver$_MenuItem.class.kDT5kt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOWindowObserver.class.AQmMZR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOXMLUnarchiver$_SpecialInstance.class.vG0dFg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/.EOXMLUnarchiver.class.NYPGkF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOControllerNotifications.class.6IvZ03" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EODebugUtilities.class.FiVjHs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOFoundationUtilities.class.gkhXnR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOInvocationUtilities.class.LMJW4f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOMRJUtilities$1.class.oY99ME" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOMRJUtilities$_MRJCode.class.Mpqov3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOMRJUtilities.class.SzRCds" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$1.class.htHVWQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$Callback.class.FCNfGf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$CallbackAdaptor.class.fBdApE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer$_TimerThread.class.jqVPa3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOTimer.class.ejy6Vr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOValueConversion.class.DvlJHQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOWidgetUtilities$_Box.class.Poj6tf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/._EOWidgetUtilities.class.yIkugE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOApplet.class.dDbW32" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOAppletController.class.FKOtSr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientApplicationSupport$_DataSourceFactory.class.ZxTnHQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientApplicationSupport.class.pOdFwf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientResourceBundle$_Enumeration.class.PHjmmE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EOClientResourceBundle.class.yJZlc3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/.EORemoteStorageDefaults.class.fnSI2r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EOApplicationURLDialog$1.class.31ObUQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EOApplicationURLDialog$2.class.sxpGLf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EOApplicationURLDialog.class.lyhbDE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/Java/com/webobjects/eoapplication/client/._EORemoteRequestUtilities.class.LIC0u3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.MenuIconEdited.gif.dUDVns" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.MenuIconEditedHighlight.gif.z8tRgR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOApplication.framework/WebServerResources/.PoweredByWebObjects.gif.4LEN9f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/.JavaEODistribution.jar.yTDR4E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EOAttribute.class.K2JG23" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedArrayFaultHandler.class.A34d1s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedClassDescription.class.y7CMZR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedDataSource.class.68sOYg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedFaultHandler.class.b2VZ0F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedObjectStore$1.class.xSxc34" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedObjectStore$_ClientDatabaseRecord.class.eUwp5t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributedObjectStore.class.nHOC7S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionChannel$Delegate.class.thQcbi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionChannel$_DefaultExceptionHandler.class.6wLNeH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionChannel.class.hARoi6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EODistributionDeferredFaultHandler.class.a2lhmv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EOHTTPChannel.class.bTJ6rU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/.EORelationship.class.9iqlyj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/client/._EOCheapCopyHandler.class.YbLgFI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOCompleteProxy.class.G5ddM7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Awake$Callback.class.J6LOVw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Awake.class.791q5V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$ObjectStore.class.ozC3el" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Replace$Callback.class.uCpGoK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks$Replace.class.Nunjy9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EODistributionCallbacks.class.tFyWHy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EONotificationCarrier.class.BaMURX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EONotificationRequest.class.eI7t2m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceProxy.class.idg4cM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoder$Delegate.class.i9ymob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoder$_Decoder.class.s4LFzA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoder.class.8RRoLZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoding$Support.class.vpsQXo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoding$_EOKeyGlobalIDSupport.class.piUiaO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOReferenceRecordingCoding.class.rMjrnd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOSavingProxy.class.2eMAAC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOServerEOInvocation.class.5FPcO1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOServerInvocation.class.5bLb2q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEODistribution.framework/WebServerResources/Java/com/webobjects/eodistribution/common/._EOServerReturnValue.class.sbRNjQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/English.lproj/.Localizable.strings.790qBf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/German.lproj/.Localizable.strings.uwo4SE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/.JavaEOGeneration.jar.hfZHa4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOActionController$_Action.class.Lp68zt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOActionController.class.PZao1S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOAssociationController.class.neq1si" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOCheckBoxController.class.733lVH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOComboBoxController.class.uNDMn7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$1.class.2z7HRw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$10.class.YUmElW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$2.class.8dUAPl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$3.class.SoExjL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$4.class.OGCbOa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$5.class.vNsQiA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$6.class.O41POZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$7.class.24rQkp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$8.class.w41QQO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$9.class.PRNRme" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$ControllerTaskAdaptor.class.TLhXTD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$ControllerTaskCallback.class.Zc83q3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Delegate.class.dlibYs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Insert.class.qwYmwS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$List.class.hmuz4h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Open.class.XVbMCH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Query.class.gi7Tc7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$Select.class.xuM2Mw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$SelectByInserting.class.I9KbnW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$_SpecificationData.class.ikWkXl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory$_XMLProvider.class.6rOFzL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOControllerFactory.class.F2N1bb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODefaultActionTrigger.class.lHmkPA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODetailSelectionController.class.hjcEs0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODisplayStatisticsController$_DisplayGroupObserver.class.qFMF6p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODisplayStatisticsController.class.oQCIKP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODynamicApplication$1.class.oP86of" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EODynamicApplication.class.f8EZ3E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEditingController.class.c1TeJ4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_ActivateHelpWindow.class.Th2Tou" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_ActivateToolWindow.class.W2ve5T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_ActivateWindow.class.1UMzLj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Entity.class.YSd6tJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Insert.class.odBZc9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_List.class.WV1BWy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Open.class.vqhfGY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction$_Query.class.Lnneqo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnterAction.class.4N1saO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOEnumerationController.class.cvR3Ud" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOFormController.class.WBg1FD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOFormatValueController.class.YEjlr3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOImageViewController.class.jVM1ct" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOListController.class.46xrZS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOMultipleValuesEnumerationController.class.fwJdNi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOOneValueEnumerationController.class.JSStBI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOQueryController.class.cSy6p8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOQueryObjectDisplay.class.YpMRfy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOQuickTimeViewController.class.L7UD5X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EORangeTextFieldController.class.gWZOWn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EORangeValueController.class.pMJnON" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EORangeWidgetController.class.toKDGd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOStaticIconController.class.hC8YyD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOStaticLabelController.class.nFcCr3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOStaticTextFieldController.class.WqRBkt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTableColumnController.class.aQR5dT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTableController.class.zlpW7i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTextAreaController.class.HFt91I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTextFieldController.class.i8gJW8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTitlesController.class.4oXFRy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTreeController$_SelectionUtilities.class.K36YMY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOTreeController.class.TcvEIo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOValueAndURLController.class.SWuZEO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOValueController.class.QsvlBe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$DefaultAction$CommonWidgetHandler.class.bZL5yE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$DefaultAction.class.YsSQw4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$FormatWidget.class.kf9Buu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$QueryWidget.class.PkDnsU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController$TableWidget.class.RvDQqk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/.EOWidgetController.class.fOIkpK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/._EOExtendedValueConversion.class.0k7aoa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/._EOKeyPathUtility.class.gZ2unA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client/._EODistributionKeyPathUtility.class.cNUbn0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOGeneration.framework/WebServerResources/Java/com/webobjects/eogeneration/client/._EORemoteXMLProvider.class.5r3Bnq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/.JavaEOInterface.jar.bFUNpQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionAssociation.class.102Mug" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionInsertionAssociation.class.tgW4zG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionWidgetAssociation$ActionPlugin.class.bUU5F6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOActionWidgetAssociation.class.qTC7Lw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOAssociation$_AspectBinding.class.BhMeTW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOAssociation.class.qj0m0m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EODetailSelectionAssociation.class.44KQ7M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EODisplayGroup$Delegate.class.XnQcgd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EODisplayGroup.class.4rnAoD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterAssociation.class.2JDAx3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterCopyAssociation.class.832fHt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterDetailAssociation.class.BtgWQT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOMasterPeerAssociation.class.KH2X0j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOPickTextAssociation.class.awKmbK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableAssociation$TablePlugin.class.hOSuma" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableAssociation.class.fT2DxA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableColumnAssociation$TableColumnPlugin.class.lf38I0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTableColumnAssociation.class.30l0Uq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTextAssociation$TextPlugin.class.0cQ38Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTextAssociation.class.K597mh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTreeAssociation$TreePlugin.class.7jKxBH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOTreeAssociation.class.tMTjQ7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueAssociation$ValuePlugin.class.FUbP5x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueAssociation.class.9qyllY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueSelectionAssociation$ValueSelectionPlugin.class.L7NABo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOValueSelectionAssociation.class.Q7eRRO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetAssociation$WidgetPlugin$Formatting.class.aKmP8e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetAssociation$WidgetPlugin.class.eYiOpF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetAssociation.class.2Wf9G5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetPluginRegistry$WidgetSetPlugin.class.4KXQYv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetPluginRegistry$_RegistryInfo.class.x7hhhW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterface.framework/WebServerResources/Java/com/webobjects/eointerface/.EOWidgetPluginRegistry.class.BILIzm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/.JavaEOInterfaceSwing.jar.9DXNTM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOColumnEditor.class.ouNogd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOControlActionAdapter.class.7I4GDD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOForm.class.kwk003" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOFormCell.class.lW7Eou" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOFrame.class.HBi3MU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOImageView.class.blbsbl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOMatrix.class.EpnAAL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOQuickTimeView.class.SnCJZb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingButtonPlugin.class.E7qLpC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingCheckBoxPlugin.class.S47NP2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingComboBoxPlugin$_ComboBoxModel.class.biGvgt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingComboBoxPlugin.class.pCafHT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingImageViewPlugin.class.NUtgak" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingQuickTimeViewPlugin.class.5zCiDK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingSetPlugin.class.9OYw7a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin$1.class.osdMBB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin$TableColumnCustomizer.class.HfF151" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin$_DefaultTableColumnCustomizer.class.GMDmBs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTableColumnPlugin.class.M5II6S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTablePlugin$_TableModel.class.VHLpCj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTablePlugin.class.N2am8J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTextPlugin.class.55SEEa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTreePlugin$_TreeCellRenderer.class.m2vkbB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTreePlugin$_TreeNode.class.BeWJI1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingTreePlugin.class.pcmags" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingUtilities$1.class.WEDXRS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingUtilities$_EventHandler.class.WV1Ltj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOSwingUtilities.class.9QZA5J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTable$_EOTableColumn.class.sb0gLa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTable.class.fuSXqB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextArea.class.FddA81" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextColumnEditor.class.VxxdQs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextComponentAccess.class.J0PGyT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOTextField.class.IiXahk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOView.class.Sbp70K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOViewLayout$1.class.OsT4Kb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOViewLayout$_EOViewLayoutData.class.YVz2uC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/.EOViewLayout.class.jNr0e3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEOInterfaceSwing.framework/WebServerResources/Java/com/webobjects/eointerface/swing/._EODefaultBorder.class.8NdYZt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowDown.gif.xPUWKU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowLeft.gif.HYhrzl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowRight.gif.wdaXnM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.ArrowUp.gif.mjttcd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/.Default.gif.01RZ0D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/.JavaEORuleSystem.jar.z0AwP4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant$1.class.mhm9Gv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant$Editor.class.P0dNyW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant$_RuleProvider.class.wAnrqn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistant.class.UunqiO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistantAction.class.cBMNaf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOAssistantRule.class.S7AR3F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOEntitiesEditor.class.nTjWW6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOMiscellaneousEditor.class.gWKfQx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOPropertiesEditor.class.hIMVJY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOUserInterfaceParametersEditor.class.LVhYDp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWidgetParametersEditor$1.class.jlsdAQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWidgetParametersEditor$ValueCustomizer.class.I8rtwh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWidgetParametersEditor.class.ff23sI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWindowParametersEditor$1.class.o8foq9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWindowParametersEditor$ValueCustomizer.class.xbjJnA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOWindowParametersEditor.class.tX0pl1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOXMLEditor$1.class.aA0cks" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOXMLEditor$_DisplayObject.class.Jmc1iT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/.EOXMLEditor.class.f6CPhk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorExplanation.class.Xp4YgL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorSelectionValueCustomizer$_Model.class.tmzlhc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorSelectionValueCustomizer.class.epbJhD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringAddition$AdditionListener.class.XswPi4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringAddition.class.4QGWjv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringList$ChangeListener.class.0db2lW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringList$_Object.class.1IV8nn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringList.class.UDWgqO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringSelector$ChangeListener.class.NEV4sf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringSelector$_Model.class.4pSTvG" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/13/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/14/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Safari/15/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Software Update" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/Software Update" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.AddressBook" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.AddressBook" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.AddressBook/MetaData" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.AddressBook/MetaData" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/00/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/11" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringSelector.class.Tm6GA7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorStringValueCustomizer.class.E2LGFy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorValueCustomizer$DefaultValue.class.4ilxLZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EOEditorValueCustomizer.class.Gs4oRq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaEORuleSystem.framework/WebServerResources/Java/com/webobjects/eogeneration/assistant/._EORemoteRuleProvider.class.eQZ70R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Ascending.gif.ZKmVaj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BackClick.gif.RxhJkK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BarLeftEnd.gif.Hvpxub" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BarMiddle.gif.vVLlEC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.BarRightEnd.gif.ELeaO3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Descending.gif.JQWYXu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.DownTriangle.gif.6wKN7V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.ForwardClick.gif.IQLChn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.PoweredByWebObjects.gif.7h0rrO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.RightTriangle.gif.HzJGGf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Spacer.gif.enJWVG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.TransparentPixel.gif.rdZcb8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.Unsorted.gif.kHXtqz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.appOff.gif.7d9KF0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.appOn.gif.Mjr2Ur" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.back.gif.reYjaT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.dir.gif.cYCBpk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.exclamation.gif.rAwTEL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.eye.gif.kKwbUc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.leftTab.gif.omJt9D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.lft-OSarw.gif.SM3Lo5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.rightTab.gif.KDC4Dw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.rt-OSarw.gif.IRinTX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.scrollDown.gif.3Y6F8o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.text.gif.sGQCvQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.woapp.gif.V0JASh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Frameworks/JavaWOExtensions.framework/WebServerResources/.woappsrv.gif.pK4yfJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/.JavaDirectToWeb.jar.fBHxCa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/.JavaEOControl.jar.OuYa4B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/.JavaFoundation.jar.lNbpG3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/.JavaWOJSPServlet_client.jar.BZa8xv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ActionsConfigurationPanel.class.AAKqqX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$1.class.0Vy3jp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$2.class.vDcHdR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$3.class.rW8k7i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel$4.class.BMtZ0K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ApplicationManipulationPanel.class.npHYUc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantApplet$1.class.kx7BQE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantApplet$2.class.mfAgM6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantApplet.class.dRcVHy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantClient$PacketDecoder.class.FuHRD0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantClient.class.ObQ9zs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantFrame.class.Gvp4wU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.AssistantPageApplet.class.BOc0tm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.BkgColorComponentConfigurationPanel.class.zmvhrO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.CheckboxComponentConfigurationPanel.class.q1Mhpg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ChoiceComponentConfigurationPanel.class.NVZinI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ClientArchivingDelegate.class.nRGLma" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ClientInterface.class.ZjBfmC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ColorComponentConfigurationPanel.class.LrVJl4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ColorWell.class.Cdd4lw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ComponentConfigurationContainer.class.ym9pmY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ComponentConfigurationPanel.class.0S2snq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ComponentInspectorPanel.class.yPKwoS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ComponentPickerDialog.class.vfAiqk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.CompositeComponentConfigurationPanel.class.MDl5rM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.CustomKeyPathDialog.class.SbtPue" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.D2WAssociation.class.v8tAxG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.D2WAssociationDestination.class.3mOlA8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DataTypesPanel.class.R43BGA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DisplayKeyComponentConfigurationPanel.class.lktTM2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$1.class.I9UeTu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$2.class.fmTAZW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$3.class.ub4W5o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$4.class.FRrjcR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$5.class.zxBxkj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel$6.class.AYEMsL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.DynamicPagesPanel.class.QKT1Ad" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.EditActionDialog.class.uYcPKF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.EntitiesPanel.class.UsEDU7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.FramesActivePanel.class.kbMv4z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.FreezeDialog.class.6rFoe2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.InspectorWindow.class.wuFnqu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.LhsPanel.class.ODUqCW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ManipulationInterface.class.A5zuOo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.NewDynamicPageDialog.class.duQi2Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.NoComponentConfiguration.class.nej8fj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.NothingToInspectPanel.class.4Z3XtL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageConfigurationPanel.class.WvqRHd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageManipulationPanel.class.sWrLVF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageRhsPanel.class.4oCFb8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionPanel.class.JEYArA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel$1.class.AF0wH2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel$2.class.CUBtXu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel$_MinimumSizeChoice.class.qmpqdX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PageSelectionRhsPanel.class.utpntp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$1.class.lH9cLR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$2.class.2KS72j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$3.class.MDb3kM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel$InspectionCallback.class.8eMYCe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertiesPanel.class.6TsTVG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertyDataSource.class.92YTe9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertyInspectorPanel.class.Wu5xyB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.PropertyManipulationPanel.class.qSGgS3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.Reconnector.class.eLe8cw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.RemoteControl.class.fIX0xY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.RhsPanel.class.hHiXSq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.SmartChoice.class.vbEUeT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.TasksPanel.class.Wj1SAl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.TextFieldComponentConfigurationPanel.class.L9tVWN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/.ValidateActionCommand.class.g9eIkg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.Action.class.mv7vII" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.AssistantPacket$ReceptionCallback.class.CHmk6a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.AssistantPacket.class.SjrcuD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.ComponentConfiguration.class.E3IrT5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueArchiver.class.im9Hiy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueArchiving.class.aVu2H0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueArchivingDelegate.class.e3ln7s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.D2WKeyValueUnarchiver.class.qJZNxV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.PageConfiguration.class.xgCiYn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.Property.class.CVNOoQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.PropertyListParser.class.5sKyPi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.PropertyListUtilities.class.iV5EgL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/common/.Settings.class.qCH7Hd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.BooleanButtonMonitor.class.ziNHdG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.BooleanMenuItemMonitor.class.OMViJ8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.BooleansBooleanMonitor.class.X7oUeB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.ItemStringAssociation.class.xk7yK3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.Monitor.class.xfdegw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.ObservableBoolean.class.CewTLY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.ObservableReference.class.VdZKkr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.ObservableString.class.5hxDTT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringBooleanMonitor.class.bHnwsm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringCardLayoutMonitor.class.Cxrp1O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringFrameTitleMonitor.class.X0jmAh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/mvc/.StringMonitor.class.blOj9J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.AlertDialog.class.UVshIc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.BorderPanel.class.78pfhF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.BrowserDataSource.class.tzdeR7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.BrowserObjectList.class.TvJdrA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ButtonTabPanel.class.jTLi12" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ColumnBrowser$ColumnBrowserObserver.class.mvGICv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ColumnBrowser.class.wOI9dY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.Command.class.ebjEPq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.Decorator.class.YCb9qT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.GrayFilter.class.sAtM3l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ImageButton.class.MibrGO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ImageLabel.class.gvgajh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ModifiableCheckbox.class.SgigXJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ModifiableChoice.class.ZklnBc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ModifiableTextField.class.ZQAyfF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ObjectChoice.class.2byKT7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ObjectList.class.k5OOyA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.OkCancelDialog.class.Z3etf3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.ResourceManager.class.8GdcWv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.Services.class.2svsDY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.TabPanel.class.KMKMkr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/apple/client/directtoweb/utils/.YorNDialog.class.J9FP2T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOAccountEvent.class.KUjTKm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOAggregateEvent.class.cCABtP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOAndQualifier.class.QAQoci" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOArrayDataSource.class.jTrAWK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$1.class.HuEQGd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$ClassDelegate.class.0Ao7qG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$_EOCDBinderMaps.class.RV7Vc9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$_EOClassToBinderMaps.class.6NZLYB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription$_EONopClassDescription.class.IB8BK4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOClassDescription.class.8guswx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOCooperatingObjectStore.class.2JKen0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_BooleanFieldBinding.class.ndk2dt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_FieldBinding.class.BUnQ4V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_LazyFieldBinding.class.iZREVo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject$_NumberFieldBinding.class.YwwtMR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOCustomObject.class.xaAiDk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EODataSource.class.hC3JuN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EODeferredFaulting.class.kMZyng" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EODelayedObserver.class.rVZogJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EODelayedObserverQueue.class.KSff9b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EODetailDataSource.class.r9t91E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$1.class.giad07" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$Delegate.class.nPcwYA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$EditingContextEvent.class.ErTPW3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$Editor.class.D4J9Uw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$MessageHandler.class.M8OtTZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$_EOInvalidFaultHandler.class.9EreVs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$_EOThreadSafeQueue.class.M89ZWV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext$_EventLoggingEnabler.class.CuoMYo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEditingContext.class.BuQy0R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEnterpriseObject.class.4tai3k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEvent.class.HRC25N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEventCenter$EventRecordingHandler.class.pYXC9g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOEventCenter.class.4agedK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOFaultHandler.class.ZV68gd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOFaulting.class.aBwNlG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOFetchSpecification.class.m5gtq9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOGenericRecord$_DictionaryBinding.class.XTD7vC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOGenericRecord$_LazyDictionaryBinding.class.OU8MB5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOGenericRecord.class.tRXsHy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOGlobalID.class.h9K9O1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyComparisonQualifier.class.KJmSWu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyGlobalID.class.zJHV4X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiver$Delegate.class.wqh5dr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiver.class.JmhgnU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$Awaking.class.Y05Lwn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$FinishInitialization.class.fu6nHQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$Support.class.hvP0Rj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$_NullValueSupport.class.fp8D2M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$_NumberSupport.class.65Lleg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving$_TimestampSupport.class.pnf4pJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueArchiving.class.sUTMBc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$DefaultImplementation.class.T0hRNF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$Utility.class.p1yf28" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_BestBindingCreation$_ForwardingBindingCheck.class.dgaFgC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_BestBindingCreation.class.oV24u5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_KeyBindingCreation.class.sIP2Ky" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding$_StoredForwardingBinding.class.aJr101" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCoding.class.Rde0gv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCodingAdditions$DefaultImplementation.class.9RuZwY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCodingAdditions$Utility.class.vVHjNr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueCodingAdditions.class.IQtn4U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueQualifier.class.2scslo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueUnarchiver$Delegate.class.0e57CR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueUnarchiver$_EOKeyValueArchivingContainer.class.eelPUk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOKeyValueUnarchiver.class.fFmAdO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EONotQualifier.class.DlPIwh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObjectStore.class.R6DAQK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObjectStoreCoordinator.class.lCCOae" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObserverCenter$_EOObserverArray.class.TNEhwH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObserverCenter$_ThreadInfo.class.RMGLRa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObserverCenter.class.uwUfdE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObserverProxy.class.6gYMz7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOObserving.class.diJlWA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOOrQualifier.class.IZKUi4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier$Comparison.class.ia63Fx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier$ComparisonSupport.class.gLYe30" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier$QualifierVariableSubstitutionException.class.GAyuru" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifier.class.sFJLPX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifierEvaluation.class.zJsner" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifierVariable.class.nk5HDU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOQualifierVisitor.class.7yz32n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EORelationshipManipulation.class.lSg8sR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSharedEditingContext.class.mINeTk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$Comparison.class.D6IrkO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$ComparisonSupport.class.nuuFLh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_MultipleSortValueHolder.class.006ydL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_MultipleValueComparator.class.BLFtFe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_SingleSortValueHolder.class.RV9W8H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_SingleValueComparator.class.i3vsCb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering$_SortValueHolder.class.PIdY5E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOSortOrdering.class.AQ7tz8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOTemporaryGlobalID.class.6q2G3B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/.EOValidation.class.vEeFy5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOCheapCopyArray.class.aI9D3y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOCheapCopyMutableArray.class.WRtjz2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOEventDurationComparator.class.Suye5v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOFlatMutableDictionary.class.vbjSBZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOIntegralKeyGlobalID.class.C26w8s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOKnownSelector.class.Jpp9FW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableDefaultValueDictionary.class.3JjNdq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer$_FastAccessBinding.class.P1GcOT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer$_GenericRecordBinding.class.MDTCon" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer$_LazyGenericRecordBinding.class.b1gLZQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$Initializer.class.pMIUAk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary$SubsetMapping.class.17sFcO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOMutableKnownKeyDictionary.class.wjPrOh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOPrivateMemento$DefaultImplementation.class.aEkzqL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOPrivateMemento.class.8i2p3e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOVectorKeyGlobalID.class.jRDhGI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/._EOWeakReference.class.zkyekc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/.ASCII_UCodeESC_CharStream.class.wN9cYF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/.ParseException.class.VX1vC9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/.Token.class.QEC2hD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/.TokenMgrError.class.yiiAX6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParser$KeyString.class.pBd8CA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParser.class.PFa2i4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParserConstants.class.mWkiZx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/eocontrol/_private/._EOQualifierParserTokenManager.class.TifVF1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$Operator.class.vAQynv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$_AvgNumberOperator.class.ZMcd5Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$_CountOperator.class.szLRMs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$_MaxOperator.class.AW7UvW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$_MinOperator.class.2itZeq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$_Operator.class.9E63XT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray$_SumNumberOperator.class.4dfSHn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSArray.class.VrjHrR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoder.class.897fcl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$Support.class.ykFPWO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_BigDecimalSupport.class.5YVPHi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_BigIntegerSupport.class.Oa1BtM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_BooleanSupport.class.e1Zofg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_ByteSupport.class.BuEc3J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_CharacterSupport.class.zXA1Qd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_DateSupport.class.4zTQEH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_DoubleSupport.class.18vGsb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_FloatSupport.class.2flwgF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_IntegerSupport.class.0DjM58" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_LongSupport.class.Iga3UC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_NumberSupport.class.MuTkK6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_ShortSupport.class.6rRCzA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding$_StringSupport.class.fobtq4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSCoding.class.w2Lkhy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSComparator$ComparisonException.class.25Lc81" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSComparator$_NSSelectorComparator.class.nj04Yv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSComparator$_NumberComparator.class.Eqm1QZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSComparator$_StringComparator.class.adNYIt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSComparator$_TimestampComparator.class.HdQDBX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSComparator.class.7pNjur" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSData.class.GcBlnV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSDelayedCallbackCenter$NSLightInvocation.class.Hy9Cgp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSDelayedCallbackCenter$_Delegate.class.nhfEaT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSDelayedCallbackCenter.class.BKdG4m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSDictionary.class.Qvr3YQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSDisposable.class.codNTk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSDisposableRegistry.class.0bkgPO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSForwardException.class.CUTKKi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$1.class.bXlXGM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$DefaultImplementation.class.ZdPaDg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$ErrorHandling.class.mI9dAK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$Null.class.pAUixe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$UnknownKeyException.class.P87rvI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$Utility.class.iBoCtc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$ValueAccessor.class.ES57rG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_BooleanFieldBinding.class.h3jCra" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_BooleanMethodBinding.class.kSA7qE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_FieldBinding.class.bnaDq8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ForwardingBinding.class.PxjQqC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_KeyBinding.class.Fqj4q6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_KeyBindingCreation.class.pGaErA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_MethodBinding.class.ZjnAs4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_NumberFieldBinding.class.zKUlvy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_NumberMethodBinding.class.B5k8x2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ReflectionKeyBindingCreation$Callback.class.ezfVAw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ReflectionKeyBindingCreation$_BindingStorage.class.rqnID0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding$_ReflectionKeyBindingCreation.class.MDaJGu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCoding.class.fZztKY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCodingAdditions$DefaultImplementation.class.m6WfOs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCodingAdditions$Utility.class.a0I5SW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSKeyValueCodingAdditions.class.PInWXq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLock.class.xnkN2U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLocking.class.hUSm8o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLog$Log4JLogger.class.S4IXdT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLog$Logger.class.Zi2nkn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLog$PrintStreamLogger.class.rPmPqR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLog$_DevNullPrintStream.class.YOCYxl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSLog.class.xszuFP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMultiReaderLock$ConditionLock.class.FHt8Nj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMultiReaderLock$LockRecord.class.MupNWN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMultiReaderLock.class.Ywws5h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMutableArray.class.8VWjeM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMutableData.class.gBrxng" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMutableDictionary.class.Hh47wK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMutableRange.class.VIYrHe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSMutableSet.class.AAfNRI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSNotification.class.4IGt2c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSNotificationCenter$_Entry.class.EnLwdH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSNotificationCenter.class.h1tWob" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSNumberFormatter$1.class.jHTXBF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSNumberFormatter$ConstructionBuffer.class.Vsg0O9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSNumberFormatter.class.NP121D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSPathUtilities.class.zInqf8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSProperties.class.ooEctC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_Utilities.class.bwWiH6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_XML$DictionaryParser$XMLNode.class.KCoLVA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_XML$DictionaryParser.class.UtWsa5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization$_XML.class.RTSwpz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSPropertyListSerialization.class.OzoXE3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSRange.class.bhcKUx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSRecursiveLock.class.Uc9Ta2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSSelector.class.HvRqrw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSSet.class.AfBGI0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSSocketUtilities$SocketThread.class.tTvN0u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSSocketUtilities.class.HiNViZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimeZone$__NSTZPeriod.class.NZx8Bt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimeZone$__NSTZPeriodComparator.class.jhumVX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimeZone.class.75MAes" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimestamp$GregorianDateAsRawUnits.class.NNDTyW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimestamp$IntRef.class.AlNdTq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimestamp.class.AZIydV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimestampFormatter$1.class.h8Dvyp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimestampFormatter$__NSSimpleDateFormat.class.iwhtTT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSTimestampFormatter.class.ziqKeo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$1.class.n8XOCS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoBeginMark.class.6mzU0m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoEndMark.class.f0k0oR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoLightInvocation.class.QQj6Ml" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoObject.class.ZvoDcQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager$_NSUndoStack.class.zkxbCk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSUndoManager.class.U4G41O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSValidation$DefaultImplementation.class.W8Bksj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSValidation$Utility.class.r0kXSN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSValidation$ValidationException.class.Imfjki" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSValidation$_MethodBinding.class.wDFGLM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSValidation$_ValidationBinding.class.EdVveh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.NSValidation.class.4LcmHL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSArrayUtilities.class.knNcag" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSBase64.class.O9eoDK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSCollectionEnumerator.class.OAqi7e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSCollectionPrimitives.class.dFfeBJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSCollectionReaderWriterLock.class.bK8x5d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSDelegate.class.D4rkAI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSDictionaryUtilities.class.BBmo5c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSFoundationCollection.class.vWg8AH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSGregorianCalendar.class.f3aT6b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSIntegerDictionary.class.0xjZCG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSIntegerKeyDictionary.class.9gFs9a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSJavaArrayEnumerator.class.H9jiGF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSJavaArrayWrapper.class.d49Qda" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSMutableIntegerDictionary.class.P31qLE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSMutableIntegerKeyDictionary.class.UOamj9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSObjectStreamClass$1.class.9nJ0RD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSObjectStreamClass.class.fhNGq8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSReadReentrantReaderWriterLock.class.E3zL2C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSReflectionUtilities.class.KaxRE7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector$1.class.jIiEiC" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/01/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/02/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/03/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/04/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/05/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/06/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/07/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/08/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/09/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/10/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/11/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/12/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/13/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/14/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.SoftwareUpdate/15/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/04/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/04/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/08/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/08/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/12/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/12/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/12/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/12/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/14/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/14/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/15/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/15/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/System Image Utility Help" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.helpui/System Image Utility Help" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal/Incoming" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal/Incoming" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal/Temporary Files" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal/Temporary Files" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal/inbox.calendar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Caches/com.apple.iCal/inbox.calendar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Classic" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Classic" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/ColorPickers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/ColorPickers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Cookies" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Cookies" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Documentation" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Documentation" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Documentation/Help" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Documentation/Help" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Favorites" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Favorites" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Favorites/Documents" -> "../../Documents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/FontCollections" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/FontCollections" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Fonts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Fonts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/03/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/03/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/03/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/03/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/08/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Icons/08/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Internet Plug-Ins" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Internet Plug-Ins" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Keyboard Layouts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Keyboard Layouts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Keychains" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Keychains" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Logs" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Logs" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Logs/CrashReporter" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Logs/CrashReporter" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Logs/Sync" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Logs/Sync" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/ByHost" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/ByHost" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/#SharedObjects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/#SharedObjects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/#SharedObjects/H7FJQ4TY" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/#SharedObjects/H7FJQ4TY" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com/support" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com/support" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com/support/flashplayer" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com/support/flashplayer" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com/support/flashplayer/sys" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Macromedia/Flash Player/macromedia.com/support/flashplayer/sys" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft/Clipboard" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft/Clipboard" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft/Clipboard/msoclip1" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft/Clipboard/msoclip1" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft/Clipboard/msoclip1/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/Microsoft/Clipboard/msoclip1/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/com.apple.mcx.manifests" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/com.apple.mcx.manifests" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/com.symantec.schedScanResults" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/com.symantec.schedScanResults" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/com.symantec.symsched" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Preferences/com.symantec.symsched" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/MacOS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/MacOS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/Main.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/Main.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/English.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/Main.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/Main.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/LPR_BW.app/Contents/Resources/German.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector$2.class.S0qj06" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector$Factory.class.p2HZHB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSSerialClassReflector.class.n1eGp6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSSerialFieldDesc.class.a7yXbB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSStreamingOutputData.class.sNAjY5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSStringUtilities$_PatternAnalyzer.class.gJzdPA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSStringUtilities$_StringAnalyzer.class.1x58F5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSStringUtilities.class.o1T5wA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeMutableArray.class.9Cixr5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeMutableDictionary.class.IJr3lA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeMutableSet.class.tbvdh5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSThreadsafeWrapper.class.XgascA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSUtilities$JavaArchiveFilter.class.6E4ca5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSUtilities$JavaClassFilter.class.RXwvfA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSUtilities$_NoClassUnderTheSun.class.Z1xOk5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSUtilities$_ResourceSearcher.class.eVK7pA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSUtilities.class.yxbrv5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSUtilitiesExtra.class.U1DNAA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableArray.class.WDpaG5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection$_NSWeakMutableCollectionEnumerator.class.Jr4xLA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection$_NSWeakMutableCollectionReference.class.B61VQ5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection$_NSWeakMutableCollectionReferenceEnumerator.class.xhnkWA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableCollection.class.Es1I15" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakMutableSet.class.YGY76A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/._NSWeakValueMutableDictionary.class.ezSxc6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/foundation/.__NSLocalTimeZone.class.6ckYhB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOBindingTag.class.yRHpn6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOComponentTag.class.6ahRsB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WODirectActionTag.class.kBajy6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOExtraHeaderTag.class.pXwrEB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOFormValueTag.class.X9nBK6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOServletAdaptor$JavaArchiveFilter.class.R3yLQB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOServletAdaptor.class.yOWVW6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/.WOTag.class.6JKJ3B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/com/webobjects/jspservlet/._WOServletAppInterface.class.SBlQe7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.DocumentBuilder.class.zspYpC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.DocumentBuilderFactory.class.hqI6A7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.FactoryConfigurationError.class.Tc7iMC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.FactoryFinder$ConfigurationError.class.lw1vX7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.FactoryFinder.class.Dr8I8C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.ParserConfigurationException.class.Incil8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.SAXParser.class.Rn7RxD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/parsers/.SAXParserFactory.class.KqfwK8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.ErrorListener.class.ryXaXD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.FactoryFinder$ConfigurationError.class.997Tc9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.FactoryFinder.class.NcdEsE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.OutputKeys.class.aVhtI9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.Result.class.y1rjYE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.Source.class.X4O9da" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.SourceLocator.class.CVp0tF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.Templates.class.E86QJa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.Transformer.class.Ig3HZF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.TransformerConfigurationException.class.yCczfb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.TransformerException.class.93bSAG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.TransformerFactory.class.EukcWb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.TransformerFactoryConfigurationError.class.FBs9hH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/.URIResolver.class.3Cs7Dc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/dom/.DOMLocator.class.vBx5ZH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/dom/.DOMResult.class.d7R3ld" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/dom/.DOMSource.class.ALp2HI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax/.SAXResult.class.7p903d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax/.SAXSource.class.izqqrJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax/.SAXTransformerFactory.class.id4QOe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax/.TemplatesHandler.class.yr1hcK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/sax/.TransformerHandler.class.sr3Izf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/stream/.StreamResult.class.LcDlYK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/javax/xml/transform/stream/.StreamSource.class.hw7Ymg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.LICENSE.dom-documentation.txt.SM0CLL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.LICENSE.dom-software.txt.QisCah" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.LICENSE.sax.txt.hXCYzM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.LICENSE.txt.ULL3Zh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.README.dom.txt.4VgbqN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.README.sax.txt.MbxBRi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/license/.README.txt.qOK2iO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.CollectionIndex.class.eBauKj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLAnchorElementImpl.class.2xPVbP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLAppletElementImpl.class.yv25Dk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLAreaElementImpl.class.FH8g6P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLBRElementImpl.class.yblnAl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLBaseElementImpl.class.egAu4Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLBaseFontElementImpl.class.ZH1Bym" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLBodyElementImpl.class.rFFJ2R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLBuilder.class.kbvcxn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLButtonElementImpl.class.6PMo2S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLCollectionImpl.class.RC0Bxo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLDListElementImpl.class.i31U3T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLDOMImplementationImpl.class.DYReAp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLDirectoryElementImpl.class.0Pfv7U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLDivElementImpl.class.xMHMEq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLDocumentImpl.class.9z84bW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLElementImpl.class.wwB5Jr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLFieldSetElementImpl.class.x186hX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLFontElementImpl.class.iOWzRs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLFormControl.class.yIB3qY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLFormElementImpl.class.kPmx0t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLFrameElementImpl.class.TTo1zZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLFrameSetElementImpl.class.6CPHav" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLHRElementImpl.class.aG4oL0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLHeadElementImpl.class.GYC6lw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLHeadingElementImpl.class.uWSeY1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLHtmlElementImpl.class.DR7nAx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLIFrameElementImpl.class.Odyxc3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLImageElementImpl.class.wNfHOy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLInputElementImpl.class.Mzf5q4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLIsIndexElementImpl.class.kNGV4z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLLIElementImpl.class.usQMI5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLLabelElementImpl.class.INkEmB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLLegendElementImpl.class.AVMA16" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLLinkElementImpl.class.fW1xGC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLMapElementImpl.class.2nwvl8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLMenuElementImpl.class.7mbL2D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLMetaElementImpl.class.WVH1J9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLModElementImpl.class.p3virF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLOListElementImpl.class.0pxz8a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLObjectElementImpl.class.gvLQPG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLOptGroupElementImpl.class.1Qitxc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLOptionElementImpl.class.5RO6fI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLParagraphElementImpl.class.kklLYd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLParamElementImpl.class.RX1pHJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLPreElementImpl.class.j5ntrf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLQuoteElementImpl.class.vGtxbL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLScriptElementImpl.class.O6KBVg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLSelectElementImpl.class.w760FM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLStyleElementImpl.class.WgXDri" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTableCaptionElementImpl.class.odFhdO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTableCellElementImpl.class.N1yVYj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTableColElementImpl.class.GWHhLP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTableElementImpl.class.jutFxl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTableRowElementImpl.class.TxFokR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTableSectionElementImpl.class.OJzO8m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTextAreaElementImpl.class.Yo1fXS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLTitleElementImpl.class.81WLLo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.HTMLUListElementImpl.class.pGtiAU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/html/dom/.NameNodeListImpl.class.BEbPoq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLAElement.class.biPJiW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLAccessElement.class.KndFcs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLAnchorElement.class.ZoPA6X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLBElement.class.Ktww0t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLBigElement.class.QossUZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLBrElement.class.uGuoOv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLCardElement.class.NoNkI1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLDOMImplementation.class.GVahCx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLDoElement.class.XTOdw3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLDocument.class.Skzaqz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLElement.class.3DfAo5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLEmElement.class.RFL0mB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLFieldsetElement.class.6Etrl7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLGoElement.class.5IiSjD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLHeadElement.class.S6kji9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLIElement.class.xeuKgF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLImgElement.class.AcSbfb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLInputElement.class.vQmDdH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLMetaElement.class.GwF5bd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLNoopElement.class.F7ayaJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLOneventElement.class.PjM08e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLOptgroupElement.class.erDfBL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLOptionElement.class.jbkv3h" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLPElement.class.eMdLvO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLPostfieldElement.class.uYk1Xk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLPrevElement.class.WlyhqR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLRefreshElement.class.VI0xSn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLSelectElement.class.8CzOkU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLSetvarElement.class.Qrm5Mq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLSmallElement.class.2qfmfX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLStrongElement.class.nmnDHt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLTableElement.class.C3BU9Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLTdElement.class.Co5bCw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLTemplateElement.class.Uq2A72" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLTimerElement.class.CTQ0Cz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLTrElement.class.cuSq85" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLUElement.class.15ZQDC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/.WMLWmlElement.class.O7mh98" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLAElementImpl.class.4hXHEF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLAccessElementImpl.class.mWI89b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLAnchorElementImpl.class.778zFI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLBElementImpl.class.XmArcf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLBigElementImpl.class.7HSjJL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLBrElementImpl.class.fsncgi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLCardElementImpl.class.FW44MO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLDOMImplementationImpl.class.6UTMkl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLDoElementImpl.class.DexvSR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLDocumentImpl.class.QMpAqo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLElementImpl.class.ubcOZU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLEmElementImpl.class.YsN2yr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLFieldsetElementImpl.class.ZVHh8X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLGoElementImpl.class.ggR9Iu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLHeadElementImpl.class.xaP2j1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLIElementImpl.class.ct7VUx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLImgElementImpl.class.oeCPv4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLInputElementImpl.class.NbH08A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLMetaElementImpl.class.FgHcM7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLNoopElementImpl.class.XRQtqE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLOneventElementImpl.class.k7JL4a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLOptgroupElementImpl.class.ffP3IH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLOptionElementImpl.class.bDmGoe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLPElementImpl.class.PBfk4K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLPostfieldElementImpl.class.xxqYJh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLPrevElementImpl.class.1MOCpO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLRefreshElementImpl.class.gv7k6k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLSelectElementImpl.class.hti4MR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLSetvarElementImpl.class.hqJNto" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLSmallElementImpl.class.zGMYbV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLStrongElementImpl.class.JXFaUr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLTableElementImpl.class.09JmCY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLTdElementImpl.class.w88ykv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLTemplateElementImpl.class.rL8W31" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLTimerElementImpl.class.hqYlNy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLTrElementImpl.class.6tYKw5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLUElementImpl.class.h0l0hC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/wml/dom/.WMLWmlElementImpl.class.xGCg38" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ASDOMImplementationImpl.class.p13wOF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ASModelImpl.class.RDHNzc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.AttrImpl.class.HUAglJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.AttrNSImpl.class.Huf66f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.AttributeMap.class.xC6hTM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CDATASectionImpl.class.DgGQFj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CharacterDataImpl$1.class.8bXeuQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CharacterDataImpl.class.A9QDin" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ChildNode.class.Yjw77T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CommentImpl.class.hG7BXq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CoreDOMImplementationImpl.class.a6V6MX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CoreDocumentImpl$UserDataRecord.class.1JCrDu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.CoreDocumentImpl.class.B8pNt1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMErrorImpl.class.Rlxaly" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMImplementationImpl.class.rDuyc5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMImplementationSourceImpl.class.WIRH4B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMInputSourceImpl.class.W14RW8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMLocatorImpl.class.Bcd7PF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMMessageFormatter.class.6PbnJc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMNormalizer$XMLAttributesProxy.class.zslDCJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMNormalizer.class.FG0fwg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DOMValidationConfiguration.class.TdjfqN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeepNodeListImpl.class.3Nrtkk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredAttrImpl.class.qitqfR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredAttrNSImpl.class.IKeoao" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredCDATASectionImpl.class.hKAx7U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredCommentImpl.class.LWRH4r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentImpl$IntVector.class.sF6S1Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentImpl$RefCount.class.KYE4Yv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentImpl.class.ExCgW2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredDocumentTypeImpl.class.SmN2Tz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredElementDefinitionImpl.class.7DNfT6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredElementImpl.class.4YCtSD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredElementNSImpl.class.YrKHRa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredEntityImpl.class.yyHERH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredEntityReferenceImpl.class.ugsCRe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredNode.class.ez80SL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredNotationImpl.class.HkEqUi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredProcessingInstructionImpl.class.2ntQVP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DeferredTextImpl.class.e2tgXm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DocumentFragmentImpl.class.Yqvu0T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DocumentImpl$EnclosingAttr.class.tGCJ3q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DocumentImpl$LEntry.class.vGiZ6X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DocumentImpl.class.Qjafav" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.DocumentTypeImpl.class.a55Sd2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ElementDefinitionImpl.class.nehdiz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ElementImpl.class.yxpym6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ElementNSImpl.class.zdzfrD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.EntityImpl.class.txVFwa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.EntityReferenceImpl.class.hMd7BH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.LCount.class.CeMgIe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.NamedNodeMapImpl.class.JogrOL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.NodeImpl.class.XdkGUi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.NodeIteratorImpl.class.vdvY1P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.NodeListCache.class.pswh9m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.NotationImpl.class.3ukghU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.PSVIAttrNSImpl.class.UqXfpr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.PSVIDOMImplementationImpl.class.48BMzY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.PSVIDocumentImpl.class.rV9jKv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.PSVIElementNSImpl.class.yw1RU2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ParentNode$1.class.Cdt85z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ParentNode.class.OmXph7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.ProcessingInstructionImpl.class.klF2sE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.RangeExceptionImpl.class.OfFoFb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.RangeImpl.class.FoDLRI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.TextImpl.class.UMdv4f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/.TreeWalkerImpl.class.OjGjiN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/events/.EventImpl.class.bQ68vk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom/events/.MutationEventImpl.class.nV8pLR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/.DOMError.class.AY5H0o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/.DOMErrorHandler.class.5Uf0fW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/.DOMImplementationRegistry.class.UCwivt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/.DOMImplementationSource.class.vLb2L0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/.DOMLocator.class.HEFM2x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/.UserDataHandler.class.TAlxj5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASAttributeDeclaration.class.RzeiAC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASContentModel.class.apG7R9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASDataType.class.XpSX9G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASElementDeclaration.class.SFkOre" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASEntityDeclaration.class.X0XjML" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASModel.class.aPnQ6i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASNamedObjectMap.class.w06mrQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASNotationDeclaration.class.gA2TLn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASObject.class.B6aH9U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ASObjectList.class.lwfvxs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.CharacterDataEditAS.class.YYwjVZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.DOMASBuilder.class.JMT7ix" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.DOMASException.class.EouWG4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.DOMASWriter.class.szkL4B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.DOMImplementationAS.class.wGJAs9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.DocumentAS.class.AblqQG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.DocumentEditAS.class.bL52fe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.ElementEditAS.class.qQTGFL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/dom3/as/.NodeEditAS.class.eHUk5i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.Constants$ArrayEnumeration.class.UV7YuQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.Constants.class.NFxDUn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.RevalidationHandler.class.NJGtlV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.Version.class.OezkMs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XML11DTDScannerImpl.class.EGDbd0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XML11DocumentScannerImpl.class.oECoEx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XML11EntityManager$XML11EntityScanner.class.gDQX54" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XML11EntityManager.class.KZJgyC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDTDScannerImpl.class.rMSW09" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl$Dispatcher.class.qmPguH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl$ElementStack.class.SdvBXe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.class.sxjfrM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentFragmentScannerImpl.class.Z4igVj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$ContentDispatcher.class.VUg0pR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$DTDDispatcher.class.r88KUo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$PrologDispatcher.class.zWeRpW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$TrailingMiscDispatcher.class.GrnkVt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl$XMLDeclDispatcher.class.N6iwr1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLDocumentScannerImpl.class.m0eJXy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityHandler.class.ZMzMu6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$Entity.class.eKCQ1D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$EntityScanner.class.n5Lfzb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$ExternalEntity.class.faWJ8I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$InternalEntity.class.chggLg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$RewindableInputStream.class.sFnNnO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager$ScannedEntity.class.2abD2l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityManager.class.jXZtHT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLEntityScanner.class.TCnmqr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLErrorReporter.class.kxAf9Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLNamespaceBinder.class.ncfWTw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/.XMLScanner.class.0ksWG4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar$1.class.Evl9wC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar$ChildrenList.class.EDZmna" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar$QNameHashtable.class.OMQAdI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammar.class.I94e4f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.DTDGrammarBucket.class.7b6xVN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLAttributeDecl.class.z4ZPPl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLContentSpec$Provider.class.tEH8JT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLContentSpec.class.YWBrEr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDDescription.class.HyNKyZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDLoader.class.3Fritx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDProcessor.class.ah8co5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLDTDValidator.class.ZizvjD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLElementDecl.class.lLN1gb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLEntityDecl.class.2dQyeJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLNotationDecl.class.PE35bh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/.XMLSimpleType.class.CbuD9O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMAny.class.pbqb8m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMBinOp.class.DHbK6U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMLeaf.class.x9kL6s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMNode.class.C4jN60" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMStateSet.class.ZyBP6y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.CMUniOp.class.kdE376" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.ContentModelValidator.class.757i9E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.DFAContentModel.class.czNyad" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.MixedContentModel.class.0epwcL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dtd/models/.SimpleContentModel.class.duQuej" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.DTDDVFactory.class.FL4xhR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.DVFactoryException.class.ZK7Bkp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.DatatypeException.class.jnnGnX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.DatatypeValidator.class.Yrirsv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.InvalidDatatypeFacetException.class.k3Wcx3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.InvalidDatatypeValueException.class.QEOYBB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.SchemaDVFactory.class.q1TKG9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.ValidatedInfo.class.IlaxLH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.ValidationContext.class.S2BKRf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.XSFacets.class.GhNYXN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/.XSSimpleType.class.ciid4l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.DTDDVFactoryImpl.class.Sz4raU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.ENTITYDatatypeValidator.class.ug9Bis" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.IDDatatypeValidator.class.pd3Mq0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.IDREFDatatypeValidator.class.brhYyy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.ListDatatypeValidator.class.ySG9G6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.NMTOKENDatatypeValidator.class.LCnFQE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.NOTATIONDatatypeValidator.class.GxNb0c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/dtd/.StringDatatypeValidator.class.fg2I9K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/util/.Base64.class.yksgjj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/util/.HexBin.class.QEjvtR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.AbstractDateTimeDV.class.5BeLDp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.AnySimpleDV.class.eyvsPX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.AnyURIDV.class.Hiwa1v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.Base64BinaryDV.class.WcQSc4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.BaseDVFactory.class.AzJWoC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.BooleanDV.class.LOXdCa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DateDV.class.M40vPI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DateTimeDV.class.3FgO2g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DayDV.class.cmybhP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DecimalDV.class.TGFzvn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DoubleDV.class.xWCyKV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.DurationDV.class.d1tyZt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.EntityDV.class.wYBgf2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.FloatDV.class.WIyZuA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.FullDVFactory.class.DKNNL8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.HexBinaryDV.class.okVC2G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.IDDV.class.oWesjf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.IDREFDV.class.623lBN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.ListDV.class.imfhTl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.MonthDV.class.OXJcbU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.MonthDayDV.class.KFvXts" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.QNameDV.class.OH3IM0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.SchemaDVFactoryImpl.class.k8cQ5y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.SchemaDateTimeException.class.FgN3p7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.StringDV.class.IR5hKF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.TimeDV.class.erIw4d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.TypeValidator.class.yik6oM" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/MacOS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/MacOS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/Main.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/Main.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/English.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/Main.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/Main.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/New_Color.app/Contents/Resources/German.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/MacOS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/MacOS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/Main.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/Main.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/English.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/FaxQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/Main.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/Main.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/PrintQueue.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/ResumeOnPage.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Printers/color_lpr.app/Contents/Resources/German.lproj/SupplyLevels.nib" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Recent Servers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Recent Servers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/00/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/00/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/00/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/00/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/01/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/02/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/02/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/03/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/03/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/04/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/04/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/04/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/04/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/05/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/05/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/06/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/06/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/07/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/07/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/07/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/07/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/08/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/09/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/09/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/09/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/09/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/10/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/10/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/11/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/11/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/11/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/11/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/12/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/13/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/14/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Safari/Icons/15/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Sounds" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Sounds" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Syndication" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/Syndication" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/iMovie" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/iMovie" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/iMovie/Plug-ins" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/iMovie/Plug-ins" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/iMovie/Sound Effects" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Library/iMovie/Sound Effects" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Movies" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Movies" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Music" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Music" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Pictures" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Pictures" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Pictures/iChat Icons" -> "/Library/Application Support/Apple/iChat Icons/" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Public" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Public" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Public/Drop Box" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Public/Drop Box" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Sites" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Sites" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Sites/Streaming" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Sites/Streaming" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Sites/images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Sites/images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave/leave" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave/leave" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave/leave/term" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave/leave/term" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave/leave/update" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/leave/leave/update" failed: No such file or directory (2) +rsync: symlink "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/www" -> "/Library/WebServer/Documents/" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/calendar" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/calendar" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/computers" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/computers" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/mysql" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/mysql" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/payroll1" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/payroll1" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/payroll1/arc" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/payroll1/arc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.UnionDV.class.PwMQLk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XDecimal.class.jmNB8S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl$1.class.sT0mvr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl$2.class.btp8RZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl$ValidationContextImpl.class.UP0Tey" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.XSSimpleTypeDecl.class.wJI3B6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.YearDV.class.ZU4T0E" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/dv/xs/.YearMonthDV.class.83UOpd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/io/.ASCIIReader.class.ki8JOL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/io/.UCSReader.class.KAuFdk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/io/.UTF8Reader.class.IEudDS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg/.DOMMessages.properties.ggQQ2q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg/.XMLMessageFormatter.class.piVgtZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg/.XMLMessages.properties.l6uITx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg/.XMLSchemaMessages.properties.3u1Tk6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/msg/.XMLSerializerMessages.properties.I4WuOE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/validation/.EntityState.class.rzL6hd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/validation/.ValidationManager.class.tqNILL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/validation/.ValidationState.class.Kr9kfk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$1.class.3JO0IS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Axis.class.pnMGcr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$LocationPath.class.ChrvHZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$NodeTest.class.0t0kcy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Scanner.class.l8YaH6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Step.class.3zWIcF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath$Tokens.class.LyWhId" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPath.class.9whceM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/.XPathException.class.O1KfNk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.BMPattern.class.zG3jmT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Match.class.UxBoVr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$CharOp.class.Drhxu0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$ChildOp.class.3TtG3y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$ConditionOp.class.LQSPC7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$ModifierOp.class.APuZbG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$RangeOp.class.o6UlNe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$StringOp.class.U0GJoN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op$UnionOp.class.OnG7Zl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Op.class.xRQvBU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.ParseException.class.kkRUct" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.ParserForXMLSchema.class.KJ3jO1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.REUtil.class.o3D5pA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RangeToken.class.lQwc28" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegexParser$ReferencePosition.class.7InWEH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegexParser.class.HF9Ghg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegularExpression$Context.class.OoIpVO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.RegularExpression.class.5ki9yn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$CharToken.class.lKX9eW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ClosureToken.class.X4wbVu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ConcatToken.class.nOchB3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ConditionToken.class.4SunhC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$FixedStringContainer.class.bjfuXa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ModifierToken.class.PheBDJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$ParenToken.class.hVw3ki" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$StringToken.class.ru1w2Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token$UnionToken.class.qou1Jp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.Token.class.2QLwrY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.message.properties.kwQM9w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.message_fr.properties.6pH3R5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xpath/regex/.message_ja.properties.5CHOBE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.AttributePSVImpl.class.DRiEld" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.ElementPSVImpl.class.wFwu5L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$1.class.Oyl3Qk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$BuiltinAttrDecl.class.B0NDCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$BuiltinSchemaGrammar.class.L5yeos" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar$XSAnyType.class.oyRba1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaGrammar.class.wFpaWz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaNamespaceSupport.class.VNgTI8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SchemaSymbols.class.l63CvH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.SubstitutionGroupHandler.class.VsB7kg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaException.class.DHUGaP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaLoader$LocationArray.class.99Hg0n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaLoader.class.ZW07PW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$KeyRefValueStore.class.9pwoGv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$KeyValueStore.class.jfR2y4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$LocalIDKey.class.nLYIrD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$OrderedHashtable$Entry.class.40npkc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$OrderedHashtable.class.D9Z5cL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$UniqueValueStore.class.jTrN5j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$ValueStoreBase.class.djavYS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$ValueStoreCache.class.SsOyRr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$XPathMatcherStack.class.InYVL0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator$XSIErrorReporter.class.1mfkGz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XMLSchemaValidator.class.tA9IA8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSAttributeDecl.class.jSmrwH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSAttributeGroupDecl.class.Avsasg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSAttributeUseImpl.class.nOuYnP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSComplexTypeDecl.class.EgToko" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSConstraints.class.8M1QgX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSDDescription.class.V3U1dw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSDeclarationPool.class.B52db5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSElementDecl.class.MMYl9D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSGrammarBucket.class.mMyy7c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSGroupDecl.class.jLr86L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSMessageFormatter.class.TtnJ6k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSModelGroupImpl.class.GJ9k6T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSModelImpl.class.Mzm05s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSNotationDecl.class.AxRa71" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSParticleDecl.class.TRDm8A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSTypeDecl.class.kaYy99" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/.XSWildcardDecl.class.1TwLaJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/dom/.DOMNodePool.class.GMYndi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/dom/.DOMParser.class.9ou1fR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/dom/.DocumentImpl.class.3DHJiq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/dom/.ElementNSImpl.class.VOyqnZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Field$Matcher.class.1Kq8ry" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Field$XPath.class.05TTw7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Field.class.HMwFBG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.FieldActivator.class.bSsrGf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.IDValue.class.llCdLO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.IdentityConstraint.class.84pnRn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.KeyRef.class.fQ0BXW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Selector$Matcher.class.SNeR3v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Selector$XPath.class.EDO694" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.Selector.class.ttbShE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.UniqueOrKey.class.5TaFpd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.ValueStore.class.2qksxM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/identity/.XPathMatcher.class.EMHfFl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.CMBuilder.class.j0vINU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSAllCM.class.NrWfWt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMBinOp.class.Resa72" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMLeaf.class.Bf15hC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMUniOp.class.cX41sb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSCMValidator.class.5zRYDK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSDFACM.class.3x3VOj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/models/.XSEmptyCM.class.xQoz2S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.ObjectList.class.aSydgs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.PSVIProvider.class.MhXRt1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.StringList.class.L0qwHA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAnnotation.class.KT9aV9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAttributeDeclaration.class.nT5P8I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAttributeGroupDefinition.class.6Z7umi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSAttributeUse.class.cTtYDR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSComplexTypeDefinition.class.pKLsVq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSConstants.class.WslXc0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSElementDeclaration.class.fAHsuz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSIDConstraintDefinition.class.OaeYL8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSModel.class.q7Ax3H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSModelGroup.class.XqB7kh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSModelGroupDefinition.class.Ob7HCQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSNamedMap.class.wbMiUp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSNamespaceItem.class.XkGTbZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSNotationDeclaration.class.cHLuty" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSObject.class.xHBEN7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSObjectList.class.bAaP7G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSParticle.class.JBXZrg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSSimpleTypeDefinition.class.JsYaMP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSTerm.class.ZJhm6o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSTypeDefinition.class.HiHxqY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/psvi/.XSWildcard.class.rWjJKx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.OneAttr.class.Pa3J66" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.OneElement.class.koWLsG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSAttributeChecker.class.NN7NOf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractIDConstraintTraverser.class.7ONebP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractParticleTraverser$ParticleArray.class.JFTkyo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractParticleTraverser.class.x0zsVX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractTraverser$FacetInfo.class.o6Lhjx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAbstractTraverser.class.itG7G6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAttributeGroupTraverser.class.B1ee5F" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDAttributeTraverser.class.r7MEtf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDComplexTypeTraverser$ComplexTypeRecoverableError.class.6u0PSO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDComplexTypeTraverser.class.mZe2ho" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDElementTraverser.class.mnlzHX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDGroupTraverser.class.CXVu7w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDHandler$XSDKey.class.zr6fy6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDHandler.class.chc2YF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDKeyrefTraverser.class.y7yrqf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDNotationTraverser.class.WDCvSO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDSimpleTypeTraverser.class.Wn9Ako" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDUniqueOrKeyTraverser.class.YFYKNX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDWildcardTraverser.class.l8GVgx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/traversers/.XSDocumentInfo.class.xozaK6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.ObjectListImpl.class.Wzy0fG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.SimpleLocator.class.mPmRLf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.StringListImpl.class.GTHMhP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.XInt.class.0tHINo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.XIntPool.class.12SEjY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.XSNamedMap4Types.class.LxgBPx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.XSNamedMapImpl.class.soSto7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/impl/xs/util/.XSObjectListImpl.class.DhonXG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp/.DefaultValidationErrorHandler.class.8lehwg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp/.DocumentBuilderFactoryImpl.class.xxQe5P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp/.DocumentBuilderImpl.class.h1YcEp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp/.JAXPConstants.class.nf2IeZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp/.SAXParserFactoryImpl.class.Mv5fPy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/jaxp/.SAXParserImpl.class.iXZNp8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.AbstractDOMParser.class.p7fm0H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.AbstractSAXParser$AttributesProxy.class.YRWbCh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.AbstractSAXParser$LocatorProxy.class.hwj3dR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.AbstractSAXParser.class.6MYUPq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.AbstractXMLDocumentParser.class.XbS6r0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.BasicParserConfiguration.class.DbD04z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.CachingParserPool$ShadowedGrammarPool.class.vAlZH9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.CachingParserPool$SynchronizedGrammarPool.class.jY5AmJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.CachingParserPool.class.QoDe1i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.DOMASBuilderImpl.class.sPzSFS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.DOMBuilderImpl.class.mPDRks" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.DOMParser.class.BmcO01" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.DTDConfiguration.class.VVtMGB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.DTDParser.class.WWQ7mb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.NonValidatingConfiguration.class.0k5N3K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.SAXParser.class.9J6cLk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.StandardParserConfiguration.class.p0YGsU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.XML11Configuration.class.E5Gcbu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.XMLDocumentParser.class.DlNJT3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.XMLGrammarCachingConfiguration.class.w59gCD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.XMLGrammarParser.class.fX9Yld" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.XMLGrammarPreparser.class.dadI5M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/parsers/.XMLParser.class.qDgvPm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$AugmentationsItemsContainer.class.oSMVAW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$LargeContainer.class.Kb1mmw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$SmallContainer$SmallContainerKeyEnumeration.class.5fCO75" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl$SmallContainer.class.zSWjTF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.AugmentationsImpl.class.v5SPEf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.DOMEntityResolverWrapper.class.fjdlrP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.DOMErrorHandlerWrapper.class.WVERdp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.DOMUtil.class.a7So0Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.DefaultErrorHandler.class.xihFNy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.EncodingMap.class.PgHWA8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.EntityResolverWrapper.class.DrMOsI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.ErrorHandlerWrapper$1.class.tRKHki" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.ErrorHandlerWrapper.class.jI2AcS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.IntStack.class.qqhy4r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.MessageFormatter.class.ePgwW1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.NamespaceSupport$Context.class.wpsuOB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.NamespaceSupport.class.QFoOHb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.ObjectFactory$ConfigurationError.class.x9w9AL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.ObjectFactory.class.CuRuul" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.ParserConfigurationSettings.class.3QsUnV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SecuritySupport.class.7iA9jv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$1.class.DTGpg5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$2.class.FD3JcF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$3.class.xzV48e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12$4.class.8hZp5O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SecuritySupport12.class.3E4L1o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.ShadowedSymbolTable.class.s7Oo2Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SymbolHash$Entry.class.9Dz22y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SymbolHash.class.5CCG38" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SymbolTable$Entry.class.i9Yn4I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SymbolTable.class.o8C54i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.SynchronizedSymbolTable.class.8BzN5S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.URI$MalformedURIException.class.SpMo8s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.URI.class.gGW0a3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLAttributesImpl$Attribute.class.iepneD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLAttributesImpl.class.sPHKhd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLChar.class.c55qlN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLGrammarPoolImpl$Entry.class.Zx94pn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLGrammarPoolImpl.class.mG8JuX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLResourceIdentifierImpl.class.AtNszx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLStringBuffer.class.hHswH7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/util/.XMLSymbols.class.2vWAPH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.Augmentations.class.dnIFXh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.NamespaceContext.class.rJHK5R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.QName.class.8aNPds" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLAttributes.class.mRKYl2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLDTDContentModelHandler.class.XI28tC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLDTDHandler.class.8lujCc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLDocumentFragmentHandler.class.qhLaNM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLDocumentHandler.class.mQO2Xm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLLocator.class.NDDY8W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLResourceIdentifier.class.Zx4Ujx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XMLString.class.XjHRu7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/.XNIException.class.6kwOFH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars/.Grammar.class.YYxLQh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars/.XMLGrammarDescription.class.nEeibS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars/.XMLGrammarLoader.class.bYQPvs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars/.XMLGrammarPool.class.rrDnQ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/grammars/.XSGrammar.class.v8BVaD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLComponent.class.GUOtvd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLComponentManager.class.RKs2PN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLConfigurationException.class.ZNiBao" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDContentModelFilter.class.fzlfvY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDContentModelSource.class.Qp7TPy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDFilter.class.bzYya9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDScanner.class.ey4dvJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDTDSource.class.DapTPj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDocumentFilter.class.dGpzaU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDocumentScanner.class.mfDfvu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLDocumentSource.class.jYVVP4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLEntityResolver.class.9ktCaF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLErrorHandler.class.JQ7ivf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLInputSource.class.6Bd0PP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLParseException.class.tkXqcq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLParserConfiguration.class.hVBSy0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/parser/.XMLPullParserConfiguration.class.RGavXA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/psvi/.AttributePSVI.class.GTK8lb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/psvi/.ElementPSVI.class.GjMMKL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xerces/xni/psvi/.ItemPSVI.class.J9Zq9l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.BaseMarkupSerializer.class.CKq5xW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.DOMSerializer.class.hYftXw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.DOMWriterImpl.class.I3PRm7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.ElementState.class.jnNFNH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.EncodingInfo.class.Nktuei" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.Encodings.class.0BsjFS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.HTMLEntities.res.TSB85s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.HTMLSerializer.class.X4Tix3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.HTMLdtd.class.7G8QYD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.IndentPrinter.class.ImZKqe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.LineSeparator.class.7P3tUO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.Method.class.nhaeop" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.OutputFormat$DTD.class.sVHYRZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.OutputFormat$Defaults.class.O0qJlA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.OutputFormat.class.WUnuPa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.Printer.class.Mo1zjL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.Serializer.class.QUopOl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.SerializerFactory.class.aDvfjW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.SerializerFactoryImpl.class.zfsxPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.SieveEncodingInfo$BAOutputStream.class.KskQl7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.SieveEncodingInfo.class.lPp9RH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.TextSerializer.class.ErRNoi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.XHTMLSerializer.class.A0dbWS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xml/serialize/.XMLSerializer.class.0Lwztt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/apache/xmlcommons/.Version.class.R2nn13" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Attr.class.RgP2BE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.CDATASection.class.780Icf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.CharacterData.class.AQopNP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Comment.class.jo05nq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.DOMException.class.q1jNY0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.DOMImplementation.class.T1QuzB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Document.class.gNscac" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.DocumentFragment.class.yH5pNM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.DocumentType.class.nttEqn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Element.class.mF5S3X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Entity.class.cNS7Gy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.EntityReference.class.ERMmk9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.NamedNodeMap.class.EcVBXJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Node.class.SFhRAk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.NodeList.class.ORmhgV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Notation.class.QjqIVv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.ProcessingInstruction.class.JtG9A6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/.Text.class.tW9AgH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSS2Properties.class.twK2Vh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSCharsetRule.class.mRZnES" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSFontFaceRule.class.UH0Jmt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSImportRule.class.NB6543" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSMediaRule.class.0SpsNE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSPageRule.class.LAYOvf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSPrimitiveValue.class.xUCbeQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSRule.class.KZAyWq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSRuleList.class.P3HVI1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSStyleDeclaration.class.wy8jvC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSStyleRule.class.l3KIhd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSStyleSheet.class.eTA73N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSUnknownRule.class.lwxwQo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSValue.class.RCIVCZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.CSSValueList.class.DH0kpA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.Counter.class.DPxKbb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.DOMImplementationCSS.class.IPaaYL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.DocumentCSS.class.Eb4zKm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.ElementCSSInlineStyle.class.J73ZwX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.RGBColor.class.48wsoy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.Rect.class.PJPVf9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/css/.ViewCSS.class.09dp7J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.DocumentEvent.class.kOPSYk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.Event.class.a9FmQV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.EventException.class.5aCQHw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.EventListener.class.AUMkz7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.EventTarget.class.Fe4OqI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.MouseEvent.class.GuAjij" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.MutationEvent.class.JndO9T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/events/.UIEvent.class.ew3i1u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLAnchorElement.class.KG8NS5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLAppletElement.class.BuKUNG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLAreaElement.class.OO61Ih" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLBRElement.class.4MM9DS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLBaseElement.class.umzhzt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLBaseFontElement.class.5KApu4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLBodyElement.class.dBIxpF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLButtonElement.class.VM5Fkg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLCollection.class.XezOfR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLDListElement.class.AQhXas" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLDirectoryElement.class.JP5552" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLDivElement.class.wBie5D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLDocument.class.zmnn4e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLElement.class.31Dw3P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLFieldSetElement.class.RA7F2q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLFontElement.class.ynIP11" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLFormElement.class.5XxZ0C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLFrameElement.class.0Yz9Zd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLFrameSetElement.class.UEIjZO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLHRElement.class.ve6tYp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLHeadElement.class.ViAEX0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLHeadingElement.class.oSBq0B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLHtmlElement.class.ThQd3c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLIFrameElement.class.Hyh15N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLImageElement.class.MMUO8o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLInputElement.class.zYLCb0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLIsIndexElement.class.uSPqeB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLLIElement.class.R5Zehc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLLabelElement.class.LCp3jN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLLegendElement.class.68URmo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLLinkElement.class.oPoitZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLMapElement.class.NsCJzA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLMenuElement.class.Fg2aGb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLMetaElement.class.wyyCMM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLModElement.class.Pwj4Sn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLOListElement.class.cIawZY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLObjectElement.class.2FhY5z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLOptGroupElement.class.sDAqcb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLOptionElement.class.mUZSiM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLParagraphElement.class.LddYsn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLParamElement.class.Ngg4CY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLPreElement.class.t5vaNz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLQuoteElement.class.qe2gXa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLScriptElement.class.Oweo7L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLSelectElement.class.A6Yvhn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLStyleElement.class.LrWDrY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTableCaptionElement.class.WJ8LBz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTableCellElement.class.hprULa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTableColElement.class.xY82VL" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/recipizer" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/recipizer" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/test" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/Xserve/mysqldata/test" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/excelfix.exe.download" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/excelfix.exe.download" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/MacOS" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/MacOS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/Resources" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/Resources" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/Resources/English.lproj" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Desktop/webcruiser.app/Contents/Resources/English.lproj/MainMenu.nib" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTableElement.class.55M38m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTableRowElement.class.iTk5lY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTableSectionElement.class.po46yz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTextAreaElement.class.jU18La" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLTitleElement.class.sHMbZL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/html/.HTMLUListElement.class.exJecn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMBuilder.class.tYMhpY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMBuilderFilter.class.HiGyKz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMEntityResolver.class.TXnQ5a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMImplementationLS.class.y4h8qM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMInputSource.class.QvoqMn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMWriter.class.ADJI7Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DOMWriterFilter.class.lth1sA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.DocumentLS.class.REVjOb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.LSLoadEvent.class.J20G9M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.LSProgressEvent.class.iVB4uo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ls/.ParseErrorEvent.class.wtpsQZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ranges/.DocumentRange.class.L5rQbB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ranges/.Range.class.36Aexc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/ranges/.RangeException.class.im3CSN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets/.DocumentStyle.class.LxJ1dp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets/.LinkStyle.class.cyvqz0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets/.MediaList.class.YfwPUB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets/.StyleSheet.class.zmEegd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/stylesheets/.StyleSheetList.class.AkU4HO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/traversal/.DocumentTraversal.class.HVzW9p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/traversal/.NodeFilter.class.0DpOB1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/traversal/.NodeIterator.class.jSsG3C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/traversal/.TreeWalker.class.VUKyve" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/views/.AbstractView.class.ui8qXP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/w3c/dom/views/.DocumentView.class.54Jjpr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.AttributeList.class.BoscR2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.Attributes.class.CWq5iE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.ContentHandler.class.GCuYKf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.DTDHandler.class.ycIVcR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.DocumentHandler.class.TFzTEs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.EntityResolver.class.vSDR63" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.ErrorHandler.class.DCOPyF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.HandlerBase.class.EdeO0g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.InputSource.class.LSNMsS" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Documents" failed: Read-only file system (30) +rsync: stat "/mnt/ext3drive/nexus/admin/Documents" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library" failed: Read-only file system (30) +rsync: stat "/mnt/ext3drive/nexus/admin/Library" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/AddressBook" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/AddressBook" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/AddressBook/Images" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/AddressBook/Images" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default/bookmarkbackups" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default/bookmarkbackups" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default/chrome" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default/chrome" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default/extensions" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Firefox/Profiles/hng3h41g.default/extensions" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/FullCircle" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/FullCircle" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006090921" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006090921" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006102516" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/FullCircle/MozillaOrgFirefox15MacOSX2006102516" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/MySQL" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/MySQL" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/MySQL/Administrator" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/MySQL/Administrator" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/MySQL/Administrator/Profiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/MySQL/Administrator/Profiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e00410064006400720065007300730042006f006f006b" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e00410064006400720065007300730042006f006f006b" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004b006500790063006800610069006e" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004b006500790063006800610069006e" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004d00610069006c" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e004d00610069006c" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e005300610066006100720069" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e005300610066006100720069" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e006900430061006c" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/clientdata/0063006f006d002e006100700070006c0065002e006900430061006c" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/conflicts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/SyncServices/Local/conflicts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Application Support/Terminal" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Application Support/Terminal" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Assistants" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Assistants" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins/Components" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins/Components" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins/Digidesign" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins/Digidesign" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins/VST" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Plug-Ins/VST" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Sounds" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Sounds" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Sounds/Alerts" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Sounds/Alerts" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Audio/Sounds/Banks" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Audio/Sounds/Banks" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Autosave Information" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Autosave Information" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/DashboardClient" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/DashboardClient" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/DashboardClient/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/DashboardClient/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/DashboardClient/01/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/DashboardClient/01/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Desktop" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Desktop" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox/Profiles" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox/Profiles" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox/Profiles/hng3h41g.default" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox/Profiles/hng3h41g.default" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox/Profiles/hng3h41g.default/Cache" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Firefox/Profiles/hng3h41g.default/Cache" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Metadata" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Metadata" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Metadata/Safari" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Metadata/Safari" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/09/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/09/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/12/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/12/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/12/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/QuickTime/downloads/12/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/03" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.Locator.class.V4NmZt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.Parser.class.k2WXv5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.SAXException.class.3rgz2G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.SAXNotRecognizedException.class.JLMazi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.SAXNotSupportedException.class.kSxM5T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.SAXParseException.class.RRqoCv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.XMLFilter.class.sfv086" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/.XMLReader.class.90TFFI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/ext/.DeclHandler.class.n1zlck" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/ext/.LexicalHandler.class.l531IV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.AttributeListImpl.class.NjLIfx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.AttributesImpl.class.OaDpM8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.DefaultHandler.class.vJiskK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.LocatorImpl.class.7uPzSl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.NamespaceSupport$Context.class.LETHqX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.NamespaceSupport.class.rR2c0y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.NewInstance.class.hwlJza" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.ParserAdapter$AttributeListAdapter.class.Rang9L" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.ParserAdapter.class.CvHNIn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.ParserFactory.class.2ya4iZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.XMLFilterImpl.class.MSGlTA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.XMLReaderAdapter$AttributesAdapter.class.Tygryc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.XMLReaderAdapter.class.nSRxdO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/org/xml/sax/helpers/.XMLReaderFactory.class.RQ1ESp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/Java/.wojavaclient.jar.dAEMx1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.AppleLogo.gif.M1j1SD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonAddInstance.gif.fdVgeg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonConfig.gif.HTcAzS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonDelete.gif.3PQTUu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonDetailView.gif.zhFdg7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonRefresh.gif.qBMrFJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonWOStats.gif.pF2G4l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.ButtonWOStatsOff.gif.E6NZtY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.DirectoryIcon.gif.SWNiTA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_Off.gif.4c2Bid" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_Off_Yellow.gif.tvvVHP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_On_Green.gif.6z3e7r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Panel_On_Yellow.gif.wZ1Ey4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PathWizard.gif.LZ15ZG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PowerSwitch_Off.gif.Bkvxrj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PowerSwitch_On.gif.iRgZSV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.PoweredByWebObjects.gif.7WMrky" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.TransparentPixel.gif.QhJCMa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Turning_Off.gif.hCGOeN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.Turning_On.gif.BjdvHp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.applications_bar.gif.c2OKa2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.applications_tab_active.gif.rsE4DE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.applications_tab_inactive.gif.9atM8g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.background.gif.oofzDT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.help_bar.gif.6vxm8v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.help_tab_active.gif.5zdaE8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.help_tab_inactive.gif.PPYY9K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.hosts_bar.gif.kXXRFn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.hosts_tab_active.gif.WRALc0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.hosts_tab_inactive.gif.bilGJC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.preferences_bar.gif.WwaFgf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.preferences_tab_active.gif.JfbFOR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.preferences_tab_inactive.gif.orSJmu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.site_bar.gif.yqrPU6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.site_tab_active.gif.vGWUtJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.site_tab_inactive.gif.chh52l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.start.gif.QmigCY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/WebObjects/JavaMonitor.woa/Contents/WebServerResources/.stop.gif.xoktcB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-active-record.inc.php.0KhHMd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-csvlib.inc.php.GLh4mQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-datadict.inc.php.Jr8nYs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-error.inc.php.EHV3z5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-errorhandler.inc.php.fB5NcI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-errorpear.inc.php.AMczPk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-exceptions.inc.php.I9LnsX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-iterator.inc.php.K9m05z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-lib.inc.php.Z7OEJc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-pager.inc.php.FT3UnP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-pear.inc.php.waDv2r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-perf.inc.php.l0pdI4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-php4.inc.php.Vcs3oH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-time.inc.php.6kEU5j" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-xmlschema.inc.php.J4WANW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb-xmlschema03.inc.php.gv0awz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.adodb.inc.php.uf1bgc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/contrib/.toxmlrpc.inc.php.nWAz3O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/cute_icons_for_site/.adodb.gif.NNnmSr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/cute_icons_for_site/.adodb2.gif.xtbaH4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-access.inc.php.4Gw1vH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-db2.inc.php.LQ6Skk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-firebird.inc.php.CFhpaX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-generic.inc.php.luNZZz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-ibase.inc.php.YZVCQc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-informix.inc.php.mz6gHP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-mssql.inc.php.ayTVxs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-mysql.inc.php.uWUDp5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-oci8.inc.php.K6znhI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-postgres.inc.php.Qfeu9k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-sapdb.inc.php.mUb01X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/datadict/.datadict-sybase.inc.php.J4OxVA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.docs-active-record.htm.xJU7Od" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.docs-adodb.htm.iQ0lLQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.docs-datadict.htm.eKCRKt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.docs-oracle.htm.llmgL6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.docs-perf.htm.vJOiMJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.docs-session.htm.ibuUNm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.old-changelog.htm.9xfwRZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.readme.htm.9Z4lWC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.tips_portable_sql.htm.tsIv1f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/docs/.tute.htm.QFah7S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-access.inc.php.JPq0dw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-ado.inc.php.EEFKk9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-ado5.inc.php.VbLQrM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-ado_access.inc.php.1XWGzp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-ado_mssql.inc.php.fF2xH2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-borland_ibase.inc.php.ipk4PF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-csv.inc.php.vYDBYi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-db2.inc.php.KJEv7V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-fbsql.inc.php.7twMgz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-firebird.inc.php.xCEMqc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-ibase.inc.php.moMNAP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-informix.inc.php.20UxLs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-informix72.inc.php.Q07iW5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-ldap.inc.php.d1PZ8I" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-mssql.inc.php.cspamm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-mssqlpo.inc.php.hgLGAZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-mysql.inc.php.08fePC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-mysqli.inc.php.0JWd4f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-mysqlt.inc.php.MmbGjT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-netezza.inc.php.xVUgzw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-oci8.inc.php.ymFmP9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-oci805.inc.php.NJYr6M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-oci8po.inc.php.wHcynq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-odbc.inc.php.I7fYE3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-odbc_db2.inc.php.UPtLWG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-odbc_mssql.inc.php.P8LUek" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-odbc_oracle.inc.php.JQALyX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-odbtp.inc.php.S0ODSA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-odbtp_unicode.inc.php.nTUcde" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-oracle.inc.php.LlhNxR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-pdo.inc.php.0LbKSu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-pdo_mssql.inc.php.lnXSe8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-pdo_mysql.inc.php.6vA2AL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-pdo_oci.inc.php.e2cNXo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-pdo_pgsql.inc.php.DIhzk2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-postgres.inc.php.hqEiJF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-postgres64.inc.php.MD727i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-postgres7.inc.php.3vfpxW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-postgres8.inc.php.pUHaYz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-proxy.inc.php.5o2Wod" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-sapdb.inc.php.tZwJPQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-sqlanywhere.inc.php.ZMEAgu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-sqlite.inc.php.JYIJH7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-sqlitepo.inc.php.lBCD9K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-sybase.inc.php.KIwyBo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-sybase_ase.inc.php.d1gW31" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/drivers/.adodb-vfp.inc.php.KBnCxF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-ar.inc.php.bZGm1i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-bg.inc.php.r2s7uW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-bgutf8.inc.php.ol6f0z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-ca.inc.php.rhTpvd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-cn.inc.php.IpCD0Q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-cz.inc.php.JlESvu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-da.inc.php.fgGz37" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-de.inc.php.iQWhBL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-en.inc.php.QOR38o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-es.inc.php.x3IQG2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-esperanto.inc.php.Uwq8fG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-fr.inc.php.PnfrPj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-hu.inc.php.yYuOoX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-it.inc.php.cDscYA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-nl.inc.php.ojBbze" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-pl.inc.php.2RXbaS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-pt-br.inc.php.icPgLv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-ro.inc.php.2fumm9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-ru1251.inc.php.KQosXM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-sv.inc.php.aYGFzq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/lang/.adodb-uk1251.inc.php.3kZTb4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.license.txt.SS18NH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear/Auth/Container/.ADOdb.php.QJvAsl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/pear/.readme.Auth.txt.y6Nr8Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf/.perf-db2.inc.php.VBunOC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf/.perf-informix.inc.php.yV4jug" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf/.perf-mssql.inc.php.EMpUaU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf/.perf-mysql.inc.php.QExwRx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf/.perf-oci8.inc.php.Tx1oyb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/perf/.perf-postgres.inc.php.XKYXfP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.pivottable.inc.php.WUmyXs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.readme.txt.SVtWG6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.rsfilter.inc.php.BqwlqK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.server.php.alOO9n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-compress-bzip2.php.TKMiT1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-compress-gzip.php.VONmFF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-cryptsession.php.g9Prrj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-encrypt-mcrypt.php.yY4wdX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-encrypt-md5.php.KEpGZA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-encrypt-secret.php.a7hQLe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-encrypt-sha1.php.M4k0xS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-sess.txt.jG4akw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-session-clob.php.4JZZ69" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-session.php.NI0PTN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-sessions.mysql.sql.WqwtIr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-sessions.oracle.clob.sql.04a8w5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.adodb-sessions.oracle.sql.zr1MlJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.crypt.inc.php.hE5ran" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/old/.adodb-cryptsession.php.qID7Y0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/old/.adodb-session-clob.php.kWg8NE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/old/.adodb-session.php.dfcMDi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/old/.crypt.inc.php.LrKPuW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/session/.session_schema.xml.bClXlA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.benchmark.php.41f5ce" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.client.php.kord4R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.pdo.php.rFm8Vv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.rr.htm.Zr34N9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-active-record.php.BGt8GN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-active-recs2.php.3BUcAr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-datadict.php.Z2OAt5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-perf.php.aQJppJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-pgblob.php.JIEfln" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-php5.php.eF95g1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test-xmlschema.php.CwtXcF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test.php.dTXO8i" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test2.php.XxXH6W" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test3.php.ziGB4A" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test4.php.4DHv2e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test5.php.ezWt0S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.test_rs_array.php.ZoLtZw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testcache.php.KExuYa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testdatabases.inc.php.XhuvXO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testgenid.php.GmmWXs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testmssql.php.sC5nY6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testoci8.php.sxMTYK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testoci8cursor.php.b78pZo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testpaging.php.X98V02" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testpear.php.vZsw2G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.testsessions.php.sI663k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.time.php.smJO7Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.tmssql.php.nhmxbD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.xmlschema-mssql.xml.0Vmgfh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/tests/.xmlschema.xml.n4MZiV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.toexport.inc.php.N1FJmz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.tohtml.inc.php.Bt8tqd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.xmlschema.dtd.50LEvR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/.xmlschema03.dtd.8atQAv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl/.convert-0.1-0.2.xsl.wfp6F9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl/.convert-0.1-0.3.xsl.Uv1ZLN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl/.convert-0.2-0.1.xsl.lMmVRr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl/.convert-0.2-0.3.xsl.HEbeY5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl/.remove-0.2.xsl.d9QT7J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/adodb/xsl/.remove-0.3.xsl.tLDAho" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.apache_pb.gif.VPHhr2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.apple_stylesheet_overrides.css.piZ2AG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.groups.php.lWl6Kk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.login.php.al7DVY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.login.php~.MVzg7C" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.loginform.php~.ExlXih" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.privileges.php.V6oEuV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.privileges.php~.7FBCHz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.addAuth.php.cIUFUd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.addAuth.php~.4eMJ7R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.addGroup.php.fjofnw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.addGroupAuth.php.fM6LCa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.addGroupUser.php.BF7iSO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.changepass.php.zteQ7s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.changepass.php~.DXWqn7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.createUser.php.eN71CL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.createUser.php~.QwvDSp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteAuth.php.F67I93" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteAuth.php~.0zWPqI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteGroup.php.btZ0Hm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteGroupAuth.php.QDEcZ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteGroupUser.php.9ifalF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteUser.php.pfW8Gj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.deleteUser.php~.TaV72X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.groupDetail.php.8UmbpC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.index.php.4PqfLg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.loginform.php.v1Aj7U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.loginform.php~.wH4ntz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.menu.php.2xJsPd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.menu.php~.YbqrfS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.viewAuths.php.eIfrFw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.viewAuths.php~.EHvr5a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.viewGroups.php.onYrvP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.viewUsers.php.4VwsVt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/ui/.viewUsers.php~.zqdtl8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/auth/.utilities.php.PnluLM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.base_layout.css.wKVvbr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/cal/.index.html.CLYxB5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.cash_report.php.cyhA1J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.computers.php.D9oHso" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.AUTHORS.LUvPT2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.COPYING.4gQXkH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.INSTALL.gFuyMl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.NEWS.AbMne0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.README.Ea3kHE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.TODO.Urajaj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.UPDATE.FuEhDX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-active-record.inc.php.D7sz6B" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-csvlib.inc.php.lXlCAg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-datadict.inc.php.yfZ04U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-error.inc.php.HWWLzz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-errorhandler.inc.php.EpSA5d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-errorpear.inc.php.3BZtBS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-exceptions.inc.php.XXsn7w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-iterator.inc.php.cU23Eb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-lib.inc.php.GBELcQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-pager.inc.php.FUvrLu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-pear.inc.php.F0Lrk9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-perf.inc.php.GAEXTN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-php4.inc.php.XOCBus" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-time.inc.php.gFmi56" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-xmlschema.inc.php.88JMGL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb-xmlschema03.inc.php.T798iq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.adodb.inc.php.BsHRW4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/contrib/.toxmlrpc.inc.php.BNQICJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/cute_icons_for_site/.adodb.gif.5ly6jo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/cute_icons_for_site/.adodb2.gif.Fsfv12" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-access.inc.php.iSeUIH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-db2.inc.php.Zpinqm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-firebird.inc.php.xzdu80" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-generic.inc.php.yq1FQF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-ibase.inc.php.9t5Tzk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-informix.inc.php.XTV9iZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-mssql.inc.php.th9p2D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-mysql.inc.php.gdvmMi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-oci8.inc.php.VSjkwX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-postgres.inc.php.cNNFgC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-sapdb.inc.php.1BkI1g" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/datadict/.datadict-sybase.inc.php.ir3OMV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.docs-active-record.htm.piYfyA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.docs-adodb.htm.vlX5lf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.docs-datadict.htm.9Pn3cU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.docs-oracle.htm.6rsJ4y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.docs-perf.htm.MKG7Wd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.docs-session.htm.IZu0PS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.old-changelog.htm.4Ii6Jx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.readme.htm.bCOR3c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.tips_portable_sql.htm.MZSdoS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/docs/.tute.htm.jBO5Ix" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-access.inc.php.yZkl4c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-ado.inc.php.oyiUpS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-ado5.inc.php.6zeSLx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-ado_access.inc.php.SRWe8c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-ado_mssql.inc.php.ZX9fvS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-borland_ibase.inc.php.dBgiSx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-csv.inc.php.CWCGfd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-db2.inc.php.X5GsDS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-fbsql.inc.php.HRxA1x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-firebird.inc.php.duOzqd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-ibase.inc.php.lF7zPS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-informix.inc.php.v7ebfy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-informix72.inc.php.JsB7Ed" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-ldap.inc.php.Aods5S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-mssql.inc.php.5Lnhwy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-mssqlpo.inc.php.MejLXd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-mysql.inc.php.w4rxpT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-mysqli.inc.php.XA6PRy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-mysqlt.inc.php.p60Oke" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-netezza.inc.php.yvviOT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-oci8.inc.php.FxUNhz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-oci805.inc.php.hB6rMe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-oci8po.inc.php.eLrghU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-odbc.inc.php.W7eAMz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-odbc_db2.inc.php.f1Ihif" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-odbc_mssql.inc.php.XHcHOU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-odbc_oracle.inc.php.ncVslA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-odbtp.inc.php.tFaDSf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-odbtp_unicode.inc.php.zlepqV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-oracle.inc.php.rQ7bYA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-pdo.inc.php.dW3iwg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-pdo_mssql.inc.php.jcHO4V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-pdo_mysql.inc.php.U0IDDB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-pdo_oci.inc.php.6dIcdh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-pdo_pgsql.inc.php.jAPMMW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-postgres.inc.php.XJSHmC" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/00/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/01/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/00" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-postgres64.inc.php.M0RbXh" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/02/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/01" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-postgres7.inc.php.Iu8fyX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-postgres8.inc.php.HmSIaD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-proxy.inc.php.XGGcNi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-sapdb.inc.php.eMEGpY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-sqlanywhere.inc.php.z9ef2D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-sqlite.inc.php.bmL5Ej" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-sqlitepo.inc.php.L3fHiZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-sybase.inc.php.0qMjWE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-sybase_ase.inc.php.5wzNAk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/drivers/.adodb-vfp.inc.php.Jyzif0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-ar.inc.php.1X2wVF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-bg.inc.php.ptCMBl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-bgutf8.inc.php.qCs6h1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-ca.inc.php.vO6qYG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-cn.inc.php.vexnGm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-cz.inc.php.Fd6ko2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-da.inc.php.CFYm6H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-de.inc.php.nrypOn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-en.inc.php.3OGOx3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-es.inc.php.w1UehJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-esperanto.inc.php.suBI0o" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-fr.inc.php.TxEcK4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-hu.inc.php.PUDbvK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-it.inc.php.iUIbgq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-nl.inc.php.lmeg15" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-pl.inc.php.VtrlML" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-pt-br.inc.php.7bHFyr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-ro.inc.php.d080k7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-ru1251.inc.php.UcMq7M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-sv.inc.php.1n7QTs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/lang/.adodb-uk1251.inc.php.RPv4G8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.license.txt.eQUiuO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear/Auth/Container/.ADOdb.php.sX6uiu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/pear/.readme.Auth.txt.2E1399" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf/.perf-db2.inc.php.ZFLD1P" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf/.perf-informix.inc.php.DnXhTv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf/.perf-mssql.inc.php.8JIWKb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf/.perf-mysql.inc.php.viRSCR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf/.perf-oci8.inc.php.JuX5ux" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/perf/.perf-postgres.inc.php.Ac5End" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.pivottable.inc.php.H4zWgT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.readme.txt.QkDjaz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.rsfilter.inc.php.SkmH3e" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.server.php.XZBv0U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-compress-bzip2.php.ivVkXA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-compress-gzip.php.He3dUg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-cryptsession.php.nZS7QW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-encrypt-mcrypt.php.csV1NC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-encrypt-md5.php.6nW0Mi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-encrypt-secret.php.JtS0LY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-encrypt-sha1.php.2T00KE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-sess.txt.Abn5Jk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-session-clob.php.mqtaJ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-session.php.gSIFIG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-sessions.mysql.sql.VjLYJm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-sessions.oracle.clob.sql.TyNiL2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.adodb-sessions.oracle.sql.AxfDMI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.crypt.inc.php.eBTXNo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/old/.adodb-cryptsession.php.H9hjP4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/old/.adodb-session-clob.php.n2Z0QK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/old/.adodb-session.php.4AzjTq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/old/.crypt.inc.php.Vuc3W6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/session/.session_schema.xml.MSKN0M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.benchmark.php.xC3y4s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.client.php.4Jso88" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.pdo.php.f530cP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.rr.htm.nEIEhv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-active-record.php.KenBnb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-active-recs2.php.BcBztR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-datadict.php.Gg6xzx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-perf.php.RQsfGd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-pgblob.php.w0DXMT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-php5.php.68lYUz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test-xmlschema.php.elf02f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test.php.MpO2aW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test2.php.YjwblC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test3.php.IA2kvi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test4.php.I6KuFY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test5.php.3HfUQE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.test_rs_array.php.XE0k2k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testcache.php.EAVLd1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testdatabases.inc.php.7S3cpH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testgenid.php.Nk1PBn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testmssql.php.x9CxO3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testoci8.php.2uVf1J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testoci8cursor.php.IKOcfq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testpaging.php.sHubt6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testpear.php.Y7IdHM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.testsessions.php.QffgVs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.time.php.7ze2a9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.tmssql.php.p1ePqP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.xmlschema-mssql.xml.wcECGv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/tests/.xmlschema.xml.qugqWb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.toexport.inc.php.9K4hcS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.tohtml.inc.php.YnAhty" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.xmlschema.dtd.V4FlKe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/.xmlschema03.dtd.9r7p1U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl/.convert-0.1-0.2.xsl.RMbvjB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl/.convert-0.1-0.3.xsl.cVqCBh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl/.convert-0.2-0.1.xsl.x4d8TX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl/.convert-0.2-0.3.xsl.TvFYcE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl/.remove-0.2.xsl.f2SRxk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/adodb/xsl/.remove-0.3.xsl.j84LS0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.all-ie.css.S06JdH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.config.php.0gvIyn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.admin.php.QS8GT3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.calendar.php.N1dYeK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.display.php.0M2CAq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.event_delete.php.9EAFW6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.event_form.php.ASsvjN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.event_submit.php.swrqGt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.globals.php.JluZ39" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.html.php.ANjDrQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.index.html.O3HVPw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.logincal.php.1y4eed" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.logoutcal.php.7QpCCT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.new_user_submit.php.gvlT1z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.options_submit.php.q2nbrg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.search.php.EKlxQW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.setup.php.u5gxgD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/includes/.style.php.A5LCGj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.index.php.iys06Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de/LC_MESSAGES/.index.html.lMfLxG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de/LC_MESSAGES/.messages.po.RgUwYm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/de/.index.html.v8SCp3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/.index.html.LqyKQJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja/LC_MESSAGES/.index.html.V1pShq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja/LC_MESSAGES/.messages.po.QfH0I6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/ja/.index.html.nXVuaN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl/LC_MESSAGES/.index.html.d68ZBt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl/LC_MESSAGES/.messages.po.Qrsv39" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/locale/nl/.index.html.ymEmvQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.messages.po.gnSeXw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/conference-room/.update.php.wBJEqd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.connect.php.Who6TT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/dav/iCal/.Work.ics.PggynA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.emp.tar.tcGDRg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.2.3ZsYmX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.addEmp.php.oQwkSD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.addEmp.php~.tJRpok" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.contact.php.SMSzU0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.edit.php.phsKqH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.empContact.php.bJkiYn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.employee.php.lnGRv4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.finalPTO.html.G6pr3K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.finalPTO.php.WTe1Ar" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.index.php.iyUk97" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.logo.gif.THFFHO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.logo_smaller.gif.5Cglgv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.print_emp.php.sIwrQb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.status.php.sTOyqS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/emp/.styles.css.gTiG0y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.error.html.m42RAf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.favicon.ico.BNvHcW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.AUTHORS.7dzRQC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.COPYING.haA2uj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.INSTALL.5Uzba0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.NEWS.SyREPG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.README.oKlyxn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.TODO.anKwf4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.UPDATE.UFiwXK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.all-ie.css.CtbwFr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.config.php.GIawn8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.admin.php.1cow5O" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.calendar.php.8BsONv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.display.php.5xUswc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.event_delete.php.cI9QfT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.event_form.php.jYkgZz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.event_submit.php.RgM1Ig" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.globals.php.Sy9AtX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.html.php.Bx6eeE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.index.html.3iXxZk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.logincal.php.e3yRK1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.logoutcal.php.hWdfwI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.new_user_submit.php.HUSDip" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.options_submit.php.VlE345" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.search.php.aTexRM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.setup.php.SSmxEt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/includes/.style.php.NBWBra" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.index.php.vjX3gR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de/LC_MESSAGES/.index.html.oYrx6x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de/LC_MESSAGES/.messages.po.ztl1Ve" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/de/.index.html.JiI5LV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/.index.html.DK7aCC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja/LC_MESSAGES/.index.html.Ruphsj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja/LC_MESSAGES/.messages.po.GUUni0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/ja/.index.html.Wq7O8G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl/LC_MESSAGES/.index.html.ukkhZn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl/LC_MESSAGES/.messages.po.ToCJP4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/locale/nl/.index.html.N3BxGL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.messages.po.V7smxs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fe-schedule/.update.php.BOuTo9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/.FAQ.htm.vUoNgQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.acceptpagebreak.htm.ZNDnax" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.addfont.htm.wgSY3d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.addlink.htm.Vy0DXU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.addpage.htm.taLjRB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.aliasnbpages.htm.0BGZKi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.cell.htm.UkluHZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.close.htm.Af13DG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.error.htm.ypcEAn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.footer.htm.q4Hex4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.fpdf.htm.JvnPtL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.getstringwidth.htm.YjlDss" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.getx.htm.vqrsr9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.gety.htm.pAIhqQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.header.htm.Yzd7ox" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.image.htm.8Eo0ne" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.index.htm.3hbUmV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.line.htm.HjHanC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.link.htm.dyHsnj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.ln.htm.ue6Nn0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.multicell.htm.kfM9nH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.output.htm.fUSdro" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.pageno.htm.GVYiu5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.rect.htm.93ooxM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setauthor.htm.UwUxAt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setautopagebreak.htm.yh3HDa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setcompression.htm.qEmSGR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setcreator.htm.1vT2Jy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setdisplaymode.htm.Aoo3Of" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setdrawcolor.htm.Jd44TW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setfillcolor.htm.Qx06YD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setfont.htm.Zhwc4k" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setfontsize.htm.6dECc2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setkeywords.htm.yjN3kJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setleftmargin.htm.hkgvtq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setlinewidth.htm.r4UWB7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setlink.htm.6pwsKO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setmargins.htm.4kLYSv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setrightmargin.htm.EXiv1c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setsubject.htm.qz319T" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.settextcolor.htm.0EZulB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.settitle.htm.owVYwi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.settopmargin.htm.ke3sIZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setx.htm.HtnXTG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.setxy.htm.wJkw5n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.sety.htm.jOU5g5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.text.htm.cPHFsM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/doc/.write.htm.9FGfEt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/.example.php.F9yxRa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.courier.php.vmsQ4R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.helvetica.php.Z0y9hz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.helveticab.php.ZQqwvg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.helveticabi.php.ohiqKX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.helveticai.php.ZiBlZE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.ScalaSanReg.ttf.jy3hem" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1250.map.2lUAu3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1251.map.XF6FLK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1252.map.RFmR3r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1253.map.mozKm9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1254.map.iCrIFQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1255.map.V0yHZx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1257.map.1PtLjf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp1258.map.WOwtEW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.cp874.map.VCrgZD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-1.map.ZOWyll" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-11.map.1BqWH2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-15.map.Rd8w7J" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-16.map.XNp9wr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-2.map.VaQ9W8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-4.map.5i7apQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-5.map.agBhRx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-7.map.TaR7kf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.iso-8859-9.map.Ri52OW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.koi8-r.map.K8qHjE" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.koi8-u.map.vrQmOl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.makefont.php.emukj3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/makefont/.scala.php.ecZmPK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.symbol.php.8Eeqls" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.times.php.WHsxR9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.timesb.php.OL9EoR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.timesbi.php.0Z7RVy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.timesi.php.fvJ5sg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/font/.zapfdingbats.php.Ynzs1X" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/.fpdf.css.pkXQzF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/.fpdf.php.XSwf8m" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/.histo.htm.clSgH4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/.install.txt.aL7NiM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.20k_c1.txt.UavmUt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.20k_c2.txt.FVrBwb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.calligra.afm.3oyS8S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.calligra.php.AP7ZLA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.calligra.ttf.h3Z8oi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.calligra.z.Z3712Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.countries.txt.130zIH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.index.htm.Lrj9np" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.logo.png.iqPM36" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.logo_pb.png.ho8qJO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.makefont.php.L4uqqw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto1.htm.9RLq7d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto1.php.Kf7rOV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto2.htm.WBStvD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto2.php.q2eedl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto3.htm.FoFZU2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto3.php.jKXtDK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto4.htm.SOzZls" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto4.php.rhrU59" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto5.htm.bCwQPR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto5.php.rjJaAz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto6.htm.rfyslh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto6.php.uooA7Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto7.htm.RZRJTG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/fpdf/tutorial/.tuto7.php.qwMzGo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.gdtest.php.tx1zt6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/goals/.index.php.4KkRhO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.graph.php.I1M95v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.grayline.gif.FDVSWd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.grayx.jpg.qi3CNV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.image.php.5Y2qED" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area/.ihihzqovjroxvwombnkzgoalsdaily.png.bVAfvl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area/.wxotldtyfykuzvhybknscash_report_0.png.L8y4m3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area/.wxotldtyfykuzvhybknscash_report_1.png.Qn6UeL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area/.wxotldtyfykuzvhybknscash_report_2.png.2owP6s" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area/.wxotldtyfykuzvhybknscash_report_3.png.yZhM0a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/image_area/.wxotldtyfykuzvhybknscash_report_4.png.vJ5JUS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.index.html.T1aIOA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.is4ctest.php.rHfKIi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.logo.gif.B8SMC0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.main.css.XeNPwI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.newLogo_small.gif.RD1hrq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.newLogo_small.jpg.A8lrm8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.newLogo_small1.gif.U3a7hQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.osxserver.gif.mW4ggy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.phpinfo.php.LaKveg" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/playspace/.testado.php.UNWKcY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.poweredbymacosxserver.gif.TZl0aG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.salesToday.php.c73f9n" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.styles.css.XDZv75" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.template.spotlight.6khV7N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.testDate.php.uTAl8v" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.v5_background_link.jpg.u9kM8d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.v5_background_linkhover.jpg.Tbjd9V" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.v5_background_main.jpg.PwDE9D" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/.v5_background_top.jpg.7os69l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weblog/default/.index.html.Jsb8c4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weblog/.index.html.XPUagM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webmail/.index.html.Bo6dju" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/webmail/src/.index.html.ZDgimc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/WebServer/WebServer/Documents/weekly/.index.php.WFcnpU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..CFUserTextEncoding.37YTxC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..DS_Store.4cHrGk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..Xauthority.bSJmQ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..bash_history.4vti0K" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..bash_profile.hdX8et" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..bashrc.Y9b0tb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..emacs.LwERIT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..backer!!!Users!admin!.~1~.HMeJXB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..bashrc!!!Users!admin!.~1~.073Ack" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..bashrc!!!Users!admin!.~2~.kWYsr2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..bashrc!!!Users!admin!.~3~.KW1kGK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..crontab!!!Users!admin!.backer!.~1~.FkjdVs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..crontab!!!Users!admin!.backer!.~3~.I9r69a" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..crontab!!!Users!admin!.backer!.~4~.pFPZoT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..crontab!!!Users!admin!.backer!.~5~.b4kTDB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..emacs!!!Users!admin!.~1~.7ZQrUj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..screenrc!!!Users!admin!.~1~.mo60a2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..screenrc!!!Users!admin!.~2~.xTyArK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/..screenrc!!!Users!admin!.~3~.9E79Hs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.Drinking for your education.html!!!Users!admin!Documents!.~1~.rRVJYa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.Drinking for your education.html!!!Users!admin!Documents!.~2~.y1DPfT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.Makefile!!!Users!admin!Documents!cod!ogl!.~1~.HeOPyB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.adduser.php!!!Library!WebServer!Documents!example!admin!.~1~.wwXQRj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.adduser.php!!!Library!WebServer!Documents!example!admin!.~2~.twtSa2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.adduser2.php!!!Library!WebServer!Documents!example!admin!.~1~.oeKUtK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.backer.sh!!!Users!admin!.backer!.~1~.jJLdUs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.backer.sh!!!Users!admin!.backer!.~2~.3OQxkb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.changepassword.php!!!Library!WebServer!Documents!example!admin!.~1~.O86RKT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.checklogin.php!!!Library!WebServer!Documents!.~1~.uezcbC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.checklogin.php!!!Library!WebServer!Documents!example!essentials!.~1~.FRfxBk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.createpage.php!!!Library!WebServer!Documents!example!admin!.~1~.sjIO62" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.createpage.php!!!Library!WebServer!Documents!example!admin!FCKeditor!.~1~.cQV6BL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.crontab!!!Users!admin!.~1~.rimp7t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.crontab!!!Users!admin!.~4~.7qTHCc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.crontab!!!Users!admin!.~5~.GKx07U" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.crontab!!!Users!admin!.~6~.RKZjDD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.ddgen.php!!!Library!WebServer!Documents!example!admin!.~1~.gTGD8l" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.ddgen.php!!!Library!WebServer!Documents!example!admin!.~2~.nSBXD4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.ddgen.php!!!Library!WebServer!Documents!example!admin!.~3~.NPJh9M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editddmenu.php!!!Library!WebServer!Documents!example!admin!.~1~.4fUoGv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editddmenu.php!!!Library!WebServer!Documents!example!admin!.~2~.njTwde" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editpage.php!!!Library!WebServer!Documents!example!admin!.~1~.D0aFKW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editpage.php!!!Library!WebServer!Documents!example!admin!.~2~.K4ENhF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editpage.php!!!Library!WebServer!Documents!example!admin!.~3~.4FmWOn" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editpage.php!!!Library!WebServer!Documents!example!admin!FCKeditor!.~1~.FHQLm6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.editpage.php!!!Library!WebServer!Documents!example!admin!FCKeditor.V2.Package!.~1~.xqaCUO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.fck_startup.js!!!Library!WebServer!Documents!example!admin!FCKeditor!editor!js!.~1~.M13Nsx" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.fck_startup.js!!!Library!WebServer!Documents!example!admin!FCKeditor!editor!js!.~2~.8QRn1f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.fckeditor.php!!!Library!WebServer!Documents!example!admin!FCKeditor!.~1~.IErjAY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.fckeditorcode_gecko_1.js!!!Library!WebServer!Documents!example!admin!FCKeditor!editor!js!.~1~.fnzJ9G" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.gen.php!!!Library!WebServer!Documents!.~1~.rbhVJp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.globals.php!!!Library!WebServer!Documents!example!essentials!.~1~.Yz5xl8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.imagedir.php!!!Users!admin!.~1~.L6BcXQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.imagedir.php!!!Users!admin!Desktop!1005!.~1~.1TUbBz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.imagedir.php!!!Users!admin!Desktop!1005!.~2~.n9pJgi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.imagedir.php!!!Users!admin!Desktop!pictures for website!picture gallery for new store!.~1~.Ie5pZ0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index.php!!!Library!WebServer!Documents!example!.~1~.ehWVIJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index.php!!!Library!WebServer!Documents!example!.~3~.rUysss" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index.php!!!Library!WebServer!Documents!example!.~4~.EEXHcb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index.php!!!Library!WebServer!Documents!example!.~5~.xOhYWT" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index.php!!!Library!WebServer!Documents!example!admin!.~1~.7M0WHC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index.php!!!Library!WebServer!Documents!new!.~1~.0cIWsl" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.index2.php!!!Library!WebServer!Documents!example!.~1~.oSxHe4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.login.php!!!Library!WebServer!Documents!example!admin!.~1~.m0ct0M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.logout.php!!!Library!WebServer!Documents!example!admin!.~1~.nGtgNv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.mengen.php!!!Library!WebServer!Documents!.~1~.5rP4ze" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.menucode.js!!!Library!WebServer!Documents!example!essentials!.~1~.VxETmX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.menucode.js!!!Library!WebServer!Documents!example!essentials!.~2~.k4F49F" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/03/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/14" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/15" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/04/15" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/00" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/00" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/01" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/01" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/02" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/02" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/03" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/03" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/04" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/04" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/05" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/05" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/06" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/06" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/07" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/07" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/08" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/08" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/09" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/09" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/10" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/10" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/11" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/11" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/12" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/12" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/13" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/13" failed: No such file or directory (2) +rsync: recv_generator: mkdir "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/14" failed: No such file or directory (2) +rsync: stat "/mnt/ext3drive/nexus/admin/Library/Caches/Safari/05/14" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.menuedit.php!!!Library!WebServer!Documents!.~1~.hpCnYo" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.notes!!!Users!admin!.~1~.2FEQM7" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.one.php!!!Library!WebServer!Documents!example!essentials!.~1~.NqTjBQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.one.php!!!Library!WebServer!Documents!example!essentials!.~2~.o6Gnqz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.pageedit.php!!!Library!WebServer!Documents!.~1~.LWaPgi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.pagegen.php!!!Library!WebServer!Documents!example!admin!.~1~.Oicl70" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.pagegen.php!!!Library!WebServer!Documents!example!admin!.~2~.OtNRXJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.passchanger.php!!!Library!WebServer!Documents!example!admin!.~1~.4AapOs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.quotes.js!!!Users!admin!Documents!.~1~.Qm6GGb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.sample01.php!!!Library!WebServer!Documents!example!admin!FCKeditor.V2.Package!_samples!php!.~1~.iYk0yU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.ssh_config!!!private!etc!.~1~.Q8OjrD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.styles.css!!!Library!WebServer!Documents!example!essentials!.~1~.ESBDjm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.styles.css!!!Library!WebServer!Documents!example!essentials!.~2~.m6VSe5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.styles.css!!!Library!WebServer!Documents!example!essentials!.~3~.CCb99N" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.styles.css!!!Library!WebServer!Documents!example!essentials!.~4~.gBLp5w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.test!!!Users!admin!.~1~.gqsG0f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.test.pl!!!Library!WebServer!Documents!example!.~1~.ktnXVY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.test.sql!!!Users!admin!.~1~.zqDeRH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.testcsv.php!!!Library!WebServer!Documents!csv!.~1~.eD3TOq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_common/backup/.website_backups!!!Users!admin!.~1~.WYrAM9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.backup-dir.el.el8gKS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.backup-dir.elc.QvwpIB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.css-mode.el.W1nUGk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.css-mode.elc.KYHLF3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-auto.el.aw91EM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-auto.elc.oewCEv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-class.el.R0lWEe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-class.elc.bflDFX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-cmds.el.A54GGG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-cmds.elc.KaG8Hp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-compat.el.4SDXJ8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-compat.elc.XUhrMR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-cweb.el.LwkZOA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-cweb.elc.hytdSj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-mason.el.YsWsV2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-mason.elc.JzepZL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-mode.el.4eqn3u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-mode.elc.B0sq8d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-noweb.el.t85udX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-noweb.elc.MapWiG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-region.el.JEZRop" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-region.elc.souOv8" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-rpm.el.YFumDR" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-rpm.elc.LbvsLA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-sample.el.adCzTj" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-sample.elc.kaH312" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-univ.el.QIaCbM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-univ.elc.sWVblv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-utils.el.RD0Lue" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-utils.elc.SkjbFX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-vars.el.XHcCPG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.mmm-vars.elc.BcVN0p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.php-mode.el.ROaBc9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.php-mode.elc.fpj4oS" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-api.el.qAECBB" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-charent.el.Ps9POk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-debug.el.nRNb23" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-dtd.el.dbVigN" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-edit.el.D3sDvw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-fs.el.RBJpMf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-info.el.8REy3Y" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-lucid.el.lNI2kI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-maint.el.gWrXDr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-maint.elc.cjuUWa" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-other.el.SO0RfU" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml-parse.el.xMrkAD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.psgml.el.mFhLWm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.emacs_path/.temp.el.XAh5l6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..emacs~.3MbqLP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ethereal/.recent.8MHLaz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..fonts.cache-1.BpH7zi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..lpoptions.pc2R11" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..mysql_history.InnDtL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..mysql_history.TMP.oMk30u" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/..lock.SNJjsd" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/autotext/.mytexts.bau.CwEKZW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/Standard/.Module1.xba.y5YbxG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/Standard/.dialog.xlb.pqvD4p" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/Standard/.script.xlb.WCh5B9" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/.dialog.xlc.yrYA9S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/basic/.script.xlc.g496GC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.arrowhd.soe.OGEDem" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.autotbl.fmt.jfSyM5" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.classic.sog.NyZflP" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.cmyk.soc.PzkzUy" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.gallery.soc.YmBwui" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.hatching.soh.fpTx41" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.html.soc.q2kSEL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.fps_office680en-US159273.Pe7Bfv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.ooo680en-US1592215.T9SFQe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.res_commandimagelist_sc_enUS116.Ti7TsY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.res_commandimagelist_sc_enUS514.aJiR8H" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.res_commandimagelist_sc_enUS59.1pdSWr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.sc680en-US2755.S1l6Lb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.svt680en-US1592267.8ummBV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.svt680en-US1592567.8yIrrF" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.svx680en-US323.LQUkip" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/imagecache/.svx680en-US363.zLbW98" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.javasettings_MacOSX_PowerPC.xml.Ak8y1S" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.modern.sog.RJlcTC" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.palette.soc.JEiZMm" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/global/accelerator/en-US/.current.xml.acXQG6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/scalc/accelerator/en-US/.current.xml.zP11AQ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/sweb/accelerator/en-US/.current.xml.Q1CzvA" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/soffice.cfg/modules/swriter/accelerator/en-US/.current.xml.2eduqk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.standard.sob.ULowp4" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.standard.soc.4aAdvO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.standard.sod.irp9By" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.standard.soe.obH9Ii" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.standard.sog.diFaQ2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.standard.soh.MnBcYM" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.styles.sod.iflj6w" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.sun-color.soc.UoGqeh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/config/.web.soc.ey0Xm1" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database/.biblio.odb.ZhC1wL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database/biblio/.biblio.dbf.V0C6Gv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/database/biblio/.biblio.dbt.5pt4Tf" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/gallery/.sg100.sdv.qncS8Z" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/gallery/.sg100.thm.WbIGnK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/gallery/.sg30.sdv.sVqvCu" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/gallery/.sg30.thm.2k5ETe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.FirstStartWizard.dat.YwMPaZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.LDAP.dat.8KF0rJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Addons.dat.T0MbJt" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Calc.dat.q3yq0d" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Commands.dat.J88FhY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Common.dat.RJxezI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Compatibility.dat.6t2uRs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.DataAccess.dat.hSDN9c" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Embedding.dat.s9ctsX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Events.dat.DYKfOH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Impress.dat.J5h39r" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Jobs.dat.l2pUvc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Linguistic.dat.pJMLRW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.ProtocolHandler.dat.xZsDdH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Recovery.dat.GtRoBr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.SFX.dat.E8AbZb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Substitution.dat.EUDYmW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.TypeDetection.dat.l8RLKG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.CalcCommands.dat.dBXz8q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.CalcWindowState.dat.dCBYwb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.Controller.dat.LifKVV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.Factories.dat.nUDioG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.GenericCommands.dat.NL3RQq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.WriterCommands.dat.a17elb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.WriterWebWindowState.dat.b3bXQV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.WriterWindowState.dat.9WyZmG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.UI.dat.RoooTq" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Views.dat.TxOxqb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.Writer.dat.qvfIXV" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Office.WriterWeb.dat.Z4zPvG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.Setup.dat.5YUX3q" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.System.dat.CjDkDb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.TypeDetection.Filter.dat.BdpIcW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.TypeDetection.GraphicFilter.dat.SDjwNG" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.TypeDetection.Misc.dat.q59ipr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.TypeDetection.Types.dat.aq560b" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.TypeDetection.UISort.dat.QfFBDW" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.UserProfile.dat.XgfzjH" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.VCL.dat.4qLxZr" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.ucb.Configuration.dat.TeikJc" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/cache/.org.openoffice.ucb.Store.dat.uaUbtX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/.Common.xcu.UFK3cI" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/.Linguistic.xcu.r2FUXs" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/.Recovery.xcu.CNjRId" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/UI/.CalcWindowState.xcu.ATEOtY" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/UI/.WriterWebWindowState.xcu.pwuLfJ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/UI/.WriterWindowState.xcu.mQwJ1t" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/Office/.Views.xcu.dzOLNe" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.openoffice.org2/user/registry/data/org/openoffice/.Setup.xcu.1EkhCZ" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh/.authorized_keys.JX5NqK" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh/.id_dsa.lg9kfv" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh/.id_dsa.pub.AAoS3f" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh/.id_rsa.KpKpS0" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.ssh/.known_hosts.L8LYGL" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..viminfo.qL0xvw" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..viminfo.tmp.gelInh" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/..vimrc.FcgUf2" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/.20hours.sql.oPv67M" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/..DS_Store.nrbj0x" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/..localized.5q6mXi" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/..DS_Store.UD0rU3" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.030606.csv.94GDSO" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.0319.csv.AFDaTz" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.ADODB481.tar.0L9hXk" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.Cr_Memo_7741_from_Moonblink.pdf.ZYdDv6" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.DTermMan.pdf.FbEH6R" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.EditTerminatedEmployee(2).asp.eMl7YD" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.EditTerminatedEmployee(3).asp.04zfSp" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.EditTerminatedEmployee.asp.3ajmMb" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.Entropy-PHP-5.0.4-apache2-1.dmg.45HeJX" failed: No such file or directory (2) +rsync: mkstemp "/mnt/ext3drive/nexus/admin/Desktop/Xserve/admin/Desktop/Downloads/.Entropy-PHP-5.1.2-1.dmg.89wItQ" failed: No such file or directory (2) +rsync error: received SIGUSR1 or SIGINT (code 20) at rsync.c(242) +rsync error: received SIGUSR1 or SIGINT (code 20) at main.c(977) +Removing lock file +rm: cannot remove `/srv/www/htdocs/it/drive_status/op.lock': No such file or directory +Unmounting drive +umount: /dev/sda1: not mounted +umount: /dev/sda1: not mounted diff --git a/fannie/legacy/it/drive_status/sync.sh b/fannie/legacy/it/drive_status/sync.sh new file mode 100755 index 000000000..3d4491c51 --- /dev/null +++ b/fannie/legacy/it/drive_status/sync.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +RSYNC_OPTIONS="-av --delete" +TARGET="/mnt/ext3drive" +DRIVE="/dev/sda1" +PREFIX="/srv/www/htdocs/it/drive_status" + +MOUNT_TEST=`mount | grep ext3drive` +if [ -z "$MOUNT_TEST" ]; then + echo "Mounting drive" + mount $DRIVE +fi + +MOUNT_VERIFY=`mount | grep ext3drive` +if [ -z "$MOUNT_VERIFY" ]; then + echo "Drive could not be mounted" + exit +fi + +echo "Setting lock file" +touch $PREFIX/op.lock + +rsync $RSYNC_OPTIONS rsync://nexus/backup_key/ /mnt/ext3drive/key +rsync $RSYNC_OPTIONS rsync://nexus/backup_nexus/ /mnt/ext3drive/nexus + +echo "Removing lock file" +rm $PREFIX/op.lock + +UMOUNT_TEST=`mount | grep ext3drive` +if [ -n "$UMOUNT_TEST" ]; then + echo "Unmounting drive" + umount $DRIVE +fi + +DATE=`date +"%D %I:%M:%S%p"` +echo "Last updated $DATE" > $PREFIX/date.log diff --git a/fannie/legacy/it/drive_status/umount.sh b/fannie/legacy/it/drive_status/umount.sh new file mode 100755 index 000000000..d20ff7a1e --- /dev/null +++ b/fannie/legacy/it/drive_status/umount.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# simple script to find everywhere the drive is mounted +# and attempt to unmount it from each spot + +DRIVE="/dev/sda1" +MOUNT_POINT=`mount | grep $DRIVE | awk '{ print $3 }'` + +for i in $MOUNT_POINT; do + umount $i +done diff --git a/fannie/legacy/it/drive_status/wrapper.sh b/fannie/legacy/it/drive_status/wrapper.sh new file mode 100755 index 000000000..029c5cbc4 --- /dev/null +++ b/fannie/legacy/it/drive_status/wrapper.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +nohup setsid sh /srv/www/htdocs/it/drive_status/sync.sh diff --git a/fannie/legacy/it/equipment/log.html b/fannie/legacy/it/equipment/log.html new file mode 100644 index 000000000..c4220eb99 --- /dev/null +++ b/fannie/legacy/it/equipment/log.html @@ -0,0 +1,942 @@ + + + Equipment Information + + + + +

        Servers

        +
        + +
        +
        Key
        +
        Purchased: ? (Downtown Computer, I think)
        +
        + Everything Server. Currently in IT Office. +
        +
        + +
        +
        IS4CSERV
        +
        Purchased: ? (Downtown Computer, I think)
        +
        + POS Server. Currently in IT Office.
        +
        6/25/2008 - Added PCI SATA card, 160GB HDD to + provide increased space for SQL backups
        +
        6/23/2009 - Added 1GB RAM (slots maxed)
        +
        +
        + +
        +
        Honeywell
        +
        Purchased: Late 2005 from Great Lakes Alarm
        +
        + Security system DVR. Currently in the IT Office. +
        +
        + +
        +
        MAS90
        +
        Purchased: June 2007 from Dell
        +
        + 3 GHz Xeon, 2GB RAM, 75GB HDD (RAID-1?), Windows 2003 Server +
        +
        + Server for MAS90 (also provides backend for ChefTec). + Currently in IT Office. +
        5/24/2010 - Warranty extended through 5/30/2012
        +
        +
        + +
        +
        Nexus (Xserve)
        +
        Purchased: Late 2005
        +
        Serial: QP53810ARTQ
        +
        + 2 Ghz G5, 1GB RAM, 77GB HDD, 250GB external HDD +
        +
        + Server for internal jabber, MySQL, rsync backups. + Currently in the IT Office. +
        +
        + +
        +
        Payroll Server
        +
        Purchased: Maybe early 2004, source unknown
        +
        + 1.6 Ghz Sempron 2300, 480MB RAM, 75GB HDD, XP Pro +
        +
        + Connected to timeclock via cable. Periodically pulls + punch info and transmits it to ADP. Currently in + the IT Office. +
        +
        + +
        +
        Passpoint
        +
        Purchased: unknown date, likely from Downtown Computer
        +
        + Semrpon 2300, 480MB RAM, 112GB HDD, Windows 2000 +
        +
        + Connected to security system control board. Primarily used to issue + or revoke passcards. Currently in the IT Office. +
        +
        + +
        + +

        Laptops

        +
        + +
        +
        iBook G4 (#1)
        +
        Purchased: Early 2005
        +
        Serial: 4H517404RCQ
        +
        + 1.2 Ghz G4, 768MB RAM, 28 GB HDD, Wifi +
        +
        + Currently unassigned. +
        +
        + +
        +
        iBook G4 (#2)
        +
        Purchased: Mid 2005
        +
        Serial: 4H535AHBSE7
        +
        + 1.33 Ghz G4, 512MB RAM, 37 GB HDD, Wifi +
        +
        + Currently unused. +
        +
        + +
        +
        iBook G4 (#3)
        +
        Purchased: Early 2005
        +
        Serial: 4H5177XWRCQ
        +
        + 1.2 Ghz G4, 768MB RAM, 28 GB HDD, Wifi +
        +
        + Currently assigned to Jill (PE). +
        +
        + +
        +
        iBook G3 (#4)
        +
        Purchased: Late 2003
        +
        Serial: UV3422U3MRR
        +
        + 800 Mhz G3, 384MB RAM, 37 GB HDD, Wifi +
        +
        + Currently assigned to Eriq. +
        +
        + +
        +
        iBook G4 (#5)
        +
        Purchased: Early 2005
        +
        Serial: 4H51789CRCQ
        +
        + 1.2 Ghz G4, 768MB RAM, 28 GB HDD, Wifi +
        +
        + Currently assigned to Produce. +
        +
        + +
        +
        iBook G4 (#6)
        +
        Purchased: Late 2004
        +
        Serial: UV4473VNRCQ
        +
        + 1.2 Ghz G4, 768MB RAM, 28 GB HDD, Wifi +
        +
        + Sold to staff 10/04/2010. +
        +
        + +
        +
        iBook G4 (#7)
        +
        Purchased: Mid 2005
        +
        Serial: 4H5328G5SE7
        +
        + 1.33 Ghz G4, 1.5GB RAM, 37GB HDD, Wifi +
        +
        + Currently assigned to Kate. +
        +
        + +
        +
        iBook G4 (#8)
        +
        Purchased: Late 2005
        +
        Serial: 4H549B0KSE7
        +
        + 1.33 Ghz G4, 1GB RAM, 37GB HDD, Wifi +
        +
        + Currently unassigned. +
        +
        + +
        +
        Powerbook G4 (17")
        +
        Purchased: Early 2005
        +
        Serial: W85180F6RJ3
        +
        + 1.67 Ghz G4, 1GB RAM, 93 GB HDD, Wifi +
        +
        + Currently assigned to Andy. Laptop monitor is bad but stable. +
        +
        + +
        +
        Macbook C2D #1
        +
        Purchased: August 2008
        +
        Serial: W88337HV0P0
        +
        + 2.1 Ghz Core 2 Duo, 1GB RAM, 112GB HDD, OSX 10.5 +
        +
        + Currently assigned to Briana. Two year warranty. +
        +
        + +
        +
        Macbook C2D #2
        +
        Purchased: August 2008
        +
        Serial:
        +
        + 2.1 Ghz Core 2 Duo, 1GB RAM, 112GB HDD, OSX 10.5 +
        +
        + Currently assigned to Sharon. Two year warranty. +
        +
        + +
        +
        Macbook C2D #3
        +
        Purchased: Mid 2006 (Lease?)
        +
        Serial: 4H6260HMWE7
        +
        + 1.8 Ghz Core 2 Duo, 1GB RAM, 56GB HDD, OSX 10.4 +
        +
        + Currently unassigned. +
        +
        + +
        +
        Acer #1
        +
        Purchased: January 2007 from CDW
        +
        Serial: LXTCJ0611363608E452500
        +
        + 1.66 Ghz Core Duo, 512MB RAM, 25(50)GB HDD, Wifi, XP Pro +
        +
        + Currently assigned to Dale. 3 year warranty. +
        +
        + +
        +
        Acer #2
        +
        Purchased: January 2007 from CDW
        +
        Serial: LXTCJ0611363608DE72500
        +
        + 1.66 Ghz Core Duo, 512MB RAM, 25(50)GB HDD, Wifi, XP Pro +
        +
        + Currently assigned to Michael (Produce). 3 year warranty. +
        +
        + +
        +
        Vostro #1
        +
        Purchased: 10/3/2008 from Dell
        +
        Service Tag: 7BWLVD1
        +
        + 1.7Ghz A64 X2, 1GB RAM, 75GB HDD, Wifi, XP +
        +
        + Currently assigned to Debbie. 3 year warranty. +
        +
        + +
        +
        Vostro #2
        +
        Purchased: 10/3/2008 from Dell
        +
        Service Tag:
        +
        + 1.7Ghz A64 X2, 1GB RAM, 75GB HDD, Wifi, XP +
        +
        + Currently assigned to Colleen. 3 year warranty. +
        +
        + +
        +
        Spare PC Laptop / Survey Laptop
        +
        Purchased: August 2009 from Dell
        +
        + 2.2 Ghz Celeron 900, 2GB RAM, 250 GB HDD, Wifi, Vista Home +
        +
        + Currently on office table for general use. 1 year warranty. +
        +
        + +
        +
        Lenovo #1
        +
        Purchased: January 2010 from Citon
        +
        Serial: R8-XPFH8 09/10
        +
        + 2.1 Ghz C2D T6500, 3GB RAM, 250 GB HDD, Wifi, XP Pro +
        +
        + Currently assigned to Lisa. 3 year warranty. +
        +
        + +
        +
        Lenovo #2
        +
        Purchased: January 2010 from Citon
        +
        Serial: R8-XPCL4 09/10
        +
        + 2.1 Ghz C2D T6500, 3GB RAM, 250 GB HDD, Wifi, XP Pro +
        +
        + Currently assigned to Raelynn. 3 year warranty. +
        +
        + +
        +
        Vostro i3 #1
        +
        Purchased: August 2010 from Dell
        +
        Service Tag: D7685N1
        +
        + 2.4 Ghz Core i3, 4GB RAM, 285GB HDD, Win7 Pro (32) +
        +
        + Currently assigned to Shannon. 3 year warranty. +
        +
        + +
        +
        Vostro i3 #2
        +
        Purchased: August 2010 from Dell
        +
        Service Tag: F7685N1
        +
        + 2.4 Ghz Core i3, 4GB RAM, 285GB HDD, Win7 Pro (32) +
        +
        + Currently assigned to Jill (P&E). 3 year warranty. +
        +
        + +
        +
        Vostro i3 #3
        +
        Purchased: August 2010 from Dell
        +
        Service Tag: C7685N1
        +
        + 2.4 Ghz Core i3, 4GB RAM, 285GB HDD, Win7 Pro (32) +
        +
        + Currently assigned to Chris. 3 year warranty. +
        +
        + +
        + +

        Desktops

        +
        + +
        +
        Scan Genius PC
        +
        Purchased: Unknown. Pre-2005 move.
        +
        + 866 Mhz P3, 256MB RAM, 19GB HDD, Windows 2000 +
        +
        + Used for ordering via handhelds. +
        +
        + +
        +
        iMac IM3 (Blue)
        +
        Purchased: Mid 2000
        +
        Serial: YM034ASTJWQ
        +
        + 350 Mhz G3, 576MB RAM, 38 GB HDD +
        +
        + Currently unassigned.
        +
        4/10/2010 - Recycled. Retained RAM, HDD
        +
        +
        + +
        +
        iMac IM4 (Blue)
        +
        Purchased: Early 2001
        +
        Serial: YM11026ZKLX
        +
        + 400 Mhz G3, 384MB RAM, 75 GB HDD +
        +
        + Currently unassigned.
        +
        4/10/2010 - Recycled. Retained RAM, HDD
        +
        +
        + +
        +
        iMac IM5 (Blue)
        +
        Purchased: Mid 2002
        +
        Serial: YM221575MB6
        +
        + 500 Mhz G3, 384MB RAM, 20 GB HDD +
        +
        + Currently unassigned.
        +
        4/10/2010 - Recycled. Retained RAM, HDD
        +
        +
        + +
        +
        iMac IM6 (White/Gray)
        +
        Purchased: Early 2001
        +
        Serial: RN1151KVKM3
        +
        + 500 Mhz G3, 384MB RAM, 20 GB HDD +
        +
        + Currently unassigned.
        +
        4/10/2010 - Recycled. Retained RAM, HDD
        +
        +
        + +
        +
        iMac IM7 (Blue)
        +
        Purchased: Mid 2002
        +
        Serial: G8223970MB6
        +
        + 500 Mhz G3, 384MB RAM, 19 GB HDD +
        +
        + Currently unused.
        +
        4/10/2010 - Recycled. Retained RAM, HDD
        +
        +
        + +
        +
        Mac Mini #1
        +
        Purchased: Late 2005
        +
        Serial: G853738PTYV
        +
        + 1.25 Ghz G4, 512MB RAM, 37GB HDD +
        +
        + Currently in the Deli Kitchen. +
        +
        + +
        +
        Mac Mini #2
        +
        Purchased: Late 2005
        +
        Serial: G85372JTTYV
        +
        + 1.25 Ghz G4, 512MB RAM, 37GB HDD +
        +
        + Currently at CSC. +
        +
        + +
        +
        Mac Mini #3
        +
        Purchased: Late 2005
        +
        Serial: G85372JNTYV
        +
        + 1.25 Ghz G4, 512MB RAM, 37GB HDD +
        +
        + Currently in the Honey Closet. +
        +
        + +
        +
        Flatscreen iMac #1
        +
        Purchased: Late 2006 (Lease?)
        +
        Serial: QP6381RQWRQ
        +
        + 1.8 Ghz Core 2 Duo, 1GB RAM, 150GB HDD, Wifi +
        +
        + Currently assigned to Alex/Jeff. +
        +
        + +
        +
        Flatscreen iMac #2
        +
        Purchased: Late 2006 (Lease?)
        +
        Serial: QP6381QLWRQ
        +
        + 1.8 Ghz Core 2 Duo, 1GB RAM, 150GB HDD, Wifi +
        +
        + Currently assigned to Alyssa. +
        +
        + +
        +
        Flatscreen iMac #3
        +
        Purchased: Late 2006 (Lease?)
        +
        Serial:
        +
        + 1.8 Ghz Core 2 Duo, 1GB RAM, 150GB HDD, Wifi +
        +
        + Currently assigned to Michael (FE). +
        +
        + +
        +
        Dell Optiplex
        +
        Purchased: ?
        +
        + 1.7 Ghz Celeron, 128MB RAM, 7GB HDD, Windows 2000 +
        +
        + Old Healthnotes kiosk machine. Now running Sunnybeam + display. Currently located at CSC. +
        +
        + +
        +
        eMachines T1300
        +
        Purchased: ?
        +
        + 1.3 Ghz Celeron, 256MB RAM, 40GB HDD, XP Home +
        +
        + Currently in the Healthnotes kiosk. +
        +
        + +
        +
        eMachines T2742
        +
        Purchased: Probably early to mid 2004
        +
        + 2.7 Ghz Celeron, 256MB RAM, 37GB HDD, XP Home +
        +
        + Currently assigned to Amanda. +
        +
        + +
        +
        HP s7320n
        +
        Purchased: Probably early to mid 2006
        +
        + 1.6 Ghz Celeron, 1GB RAM, 178GB HDD, XP MCE +
        +
        + Currently assigned to Karen. +
        +
        + +
        +
        Vostro 200
        +
        Purchased: 10/3/2008
        +
        Service Tag: CNBLVD1
        +
        + 1.6 Ghz Pentium Dual Core E2140, 1GB RAM, 75GB HD, XP Home +
        +
        + Currently assigned to Justin. +
        +
        + +
        +
        Breakroom Vostro #1
        +
        Purchased: August 2009 from Dell
        +
        + 2.2 Ghz Celeron 450, 1GB RAM, 80 GB HDD, Vista Home, 17" LCD +
        +
        + Currently in the break room. 1 year warranty. +
        +
        + +
        +
        Breakroom Vostro #2
        +
        Purchased: August 2009 from Dell
        +
        + 2.2 Ghz Celeron 450, 1GB RAM, 80 GB HDD, Vista Home +
        +
        + Currently in the break room. 1 year warranty. +
        +
        + +
        +
        Breakroom Vostro #3
        +
        Purchased: August 2009 from Dell
        +
        + 2.2 Ghz Celeron 450, 1GB RAM, 80 GB HDD, Vista Home +
        +
        + Currently in the break room. 1 year warranty. +
        +
        + +
        +
        Citon #1
        +
        Purchased: January 2010 from Citon
        +
        Serial: 0101U10A19724
        +
        + 2.8 Ghz Core Duo E6300, 3GB RAM, 160 GB HDD, XP Pro, 17" LCD +
        +
        + Currently assigned to Jesse. 1 year warranty. +
        +
        + +
        +
        Citon #2
        +
        Purchased: January 2010 from Citon
        +
        Serial: 0101U10A19721
        +
        + 2.8 Ghz Core Duo E6300, 3GB RAM, 160 GB HDD, XP Pro, 17" LCD +
        +
        + Currently assigned to Jim. 1 year warranty. +
        +
        + +
        +
        Citon #3
        +
        Purchased: January 2010 from Citon
        +
        Serial: 0101U10A19722
        +
        + 2.8 Ghz Core Duo E6300, 3GB RAM, 160 GB HDD, XP Pro, 17" LCD +
        +
        + Currently assigned to Jill (Merch). 1 year warranty. +
        +
        + +
        +
        Citon #4
        +
        Purchased: January 2010 from Citon
        +
        Serial: 0101U10A19723
        +
        + 2.8 Ghz Core Duo E6300, 3GB RAM, 160 GB HDD, XP Pro, 17" LCD +
        +
        + Currently assigned to Joe. 1 year warranty. +
        +
        + +
        + +

        Lanes

        +
        + +
        +
        Lane 1
        +
        Purchased: pre-2005 move (I think), probably from Downtown Computer
        +
        + 2.60 Ghz Celeron, 512MB RAM, 75GB HDD +
        +
        + Currently at Lane 1.
        +
        +
        + +
        +
        Lane 2
        +
        Purchased: pre-2005 move (I think), probably from Downtown Computer
        +
        + 2.60 Ghz Celeron, 512MB RAM, 75GB HDD +
        +
        + Currently at Lane 2.
        +
        Not original case & power supply
        +
        +
        + +
        +
        Lane 3
        +
        Purchased: September 2005 (I think), probably from Downtown Computer
        +
        + 2.66 Ghz Celeron, 512MB RAM, 75GB HDD +
        +
        + Currently at Lane 3.
        +
        +
        + +
        +
        Lane 4
        +
        Purchased: September 2005 (I think), probably from Downtown Computer
        +
        + 2.66 Ghz Celeron, 512MB RAM, 75GB HDD +
        +
        + Currently at Lane 4.
        +
        +
        + +
        +
        Lane 5
        +
        Purchased: September 2005 (I think), probably from Downtown Computer
        +
        + 2.66 Ghz Celeron, 512MB RAM, 75GB HDD +
        +
        + Currently at Lane 5.
        +
        +
        + +
        +
        Lane 6
        +
        Purchased: September 2005 (I think), probably from Downtown Computer
        +
        + 2.66 Ghz Celeron, 512MB RAM, 18GB HDD +
        +
        + Currently at CSC.
        +
        Not original case & power supply
        +
        Original HDD replaced
        +
        +
        + +
        +
        Lane 99
        +
        Purchased: pre-2005 move (I think), probably from Downtown Computer
        +
        + 2.60 Ghz Celeron, 512MB RAM, 75GB HDD +
        +
        + Currently in the IT Office.
        +
        Dual video cards (from failed sunnyboy experiment)
        +
        +
        + +
        + +

        Monitors

        +
        + +
        +
        CTX PV5931TR 15" Touchscreen Monitor
        +
        Purchased: 6/9/2009 (Newegg.com)
        +
        Serial: RHH-91000125
        +
        +Currently at CSC +
        +
        + +
        +
        Planar PT1510MX 15" Touch Screen LCD
        +
        Purchased: 1/8/2010 (Tigerdirect.com)
        +
        +Currently in Healthnotes kiosk (replacement of original). +
        +
        + +
        +
        HP L1506 15" Monitor
        +
        Purchased: 3/6/2009 (Newegg.com)
        +
        +Currently in FE +
        +
        + +
        + +

        Printers

        +
        + +
        +
        Brother HL-1440
        +
        Purchased: Unknown. Pre-2005 move.
        +
        + Small black & white laser printer. + Currently in the Healthnotes kiosk. +
        +
        + +
        +
        Brother MFC-8840D
        +
        Purchased: Unknown. Pre-2005 move.
        +
        + Small black & white laser MFC. Currently between Finance + and Sharon's office. +
        +
        + +
        +
        Brother HL2170W B&W Laser
        +
        Purchased: 4/21/2008 (Newegg.com)
        +
        + Small footprint laser printer. Currently in the Deli + kitchen. +
        +
        + +
        +
        Sharp MX1501N Copier
        +
        Purchased: October 2009 from Integrated Office Solutions
        +
        + Primary printer/copier/fax. Currently in the Copy Room. + Five year parts/service contract. +
        +
        + +
        +
        Brother MFC-7440N
        +
        Purchased: September 2010 from newegg
        +
        Serial: E0N190230
        +
        + Small black & white laser MFC. Currently between Finance + and Sharon's office. +
        +
        + +
        +
        HP DesignJet 111 (Roll)
        +
        Purchased: September 2010 from HP
        +
        Serial: MY08C08002
        +
        + Large-format color inkjet. Located in front of window near + P & E. Has JetDirect ethernet card installed. +
        +
        + +
        + +

        Other

        +
        + +
        +
        APC BR900 UPS
        +
        Purchased: 1/21/2009 (Newegg.com)
        +
        +Providing power backup for key, IS4CSERV, minimal network. +Currently in IT Office. +
        +
        + +
        + +

        Networking

        +
        + +
        +
        Rosewill 8-port 10/100 switch
        +
        Purchased: 1/20/2009 (Newegg.com)
        +
        + Separate physical network for Verifone credit card machines + (PCI compliance). Currently in IT Office. +
        +
        + +
        +
        Netgear JGS524 10/100 24-port switch
        +
        Purchased: Unknown. Pre-2005 move.
        +
        + Network switch for POS network. + Currently in IT Office. +
        +
        + +
        +
        Linksys EtherFast 10/100 24-port hub
        +
        Purchased: Unknown. Pre-2005 move.
        +
        + Original controller for office network. Still in use, although + most equipment is hooked into the JFS524 instead. + Currently in IT Office. +
        +
        + +
        +
        Netgear JFS524 10/100 24-port switch
        +
        Purchased: 4/21/2008 (Newegg.com)
        +
        + Supplemented old office-network switch - old switch was also 24 + but had bad ports. Currently in IT Office. +
        +
        + +
        +
        Cisco PIX
        +
        Unknown. Pre-2005 move.
        +
        + Hardware firewall between T1 and internal network. Currently + in the IT Office. +
        +
        + +
        +
        Buffalo AirStation
        +
        Unknown. Pre-2005 move.
        +
        + Primary office wifi router. Current in the IT Office. +
        +
        + +
        +
        Linksys WRT-54GL Router
        +
        Purchased: 11/12/2009 (Newegg.com)
        +
        + Extra wifi router. Expand office wifi range, increase stability. + Currently in IT Office. +
        +
        + +
        + + + diff --git a/fannie/legacy/it/hours/avg.php b/fannie/legacy/it/hours/avg.php new file mode 100644 index 000000000..210f08fb2 --- /dev/null +++ b/fannie/legacy/it/hours/avg.php @@ -0,0 +1,39 @@ +query($query); +$avgs = array(); +while($row = $sql->fetch_row($result)){ + $avgs["$row[0]"] = $row[1]; +} + +$query = "SELECT e.empID,e.name,h.totalHours FROM + Employees as e LEFT JOIN hoursalltime AS h + on e.empID=h.empID + WHERE e.deleted = 0 and h.totalHours > 0 + ORDER BY e.name"; +$result = $sql->query($query); + +echo ""; +echo ""; +while($row = $sql->fetch_row($result)){ + $avg = $avgs["$row[0]"]; + printf(" + ", + $row[1],$row[2],($row[2]+(2*$avg)), + ($row[2]+(6*$avg))); +} +echo "
        NameHours4/16/1
        %s%.2f%.2f%.2f
        "; + +?> diff --git a/fannie/legacy/it/hours/csvdump.php b/fannie/legacy/it/hours/csvdump.php new file mode 100644 index 000000000..d6bd9262e --- /dev/null +++ b/fannie/legacy/it/hours/csvdump.php @@ -0,0 +1,53 @@ +query($fetchQ); + +while ($fetchW = $sql->fetch_row($fetchR)){ + echo "\"$fetchW[0]\","; + echo "$fetchW[1],"; + echo "$fetchW[2],"; + echo "$fetchW[6],"; + echo "$fetchW[7],"; + echo "$fetchW[3]\r\n"; +} + +?> diff --git a/fannie/legacy/it/hours/db.php b/fannie/legacy/it/hours/db.php new file mode 100644 index 000000000..5673e0db7 --- /dev/null +++ b/fannie/legacy/it/hours/db.php @@ -0,0 +1,13 @@ + diff --git a/fannie/legacy/it/hours/editEmployee.php b/fannie/legacy/it/hours/editEmployee.php new file mode 100644 index 000000000..062928dc5 --- /dev/null +++ b/fannie/legacy/it/hours/editEmployee.php @@ -0,0 +1,51 @@ +Error: no employee ID specified
        "; + return; +} + +echo "Edit"; + +echo ""; +$fetchQ = "select adpid,name,department from employees where empID=$empID"; +$fetchR = $db->query($fetchQ); +$fetchW = $db->fetch_row($fetchR); +echo "
        "; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        ADP ID#
        Name
        Department"; +$deptsQ = "select name,deptID from Departments order by name"; +$deptsR = $db->query($deptsQ); +echo ""; +echo "
        "; +echo "
        "; +echo ""; + +?> diff --git a/fannie/legacy/it/hours/empWeekly.php b/fannie/legacy/it/hours/empWeekly.php new file mode 100644 index 000000000..3e4be0973 --- /dev/null +++ b/fannie/legacy/it/hours/empWeekly.php @@ -0,0 +1,192 @@ +query("SELECT empID FROM EmpWeeklyNotes WHERE empID=$empID"); + if ($sql->num_rows($checkR) == 0){ + $sql->query("INSERT INTO EmpWeeklyNotes VALUES ($empID,'$notes')"); + } + else{ + $sql->query("UPDATE EmpWeeklyNotes SET notes='$notes' WHERE empID=$empID"); + } +} + + +$limitQ = "SELECT weekStart FROM weeklyHours GROUP BY weekStart ORDER BY weekStart DESC"; +$limitR = $sql->query($limitQ); +$limitDay = ""; +$limit2 = ""; +$weekHeaders = array(); +$i = 0; +while($limitW = $sql->fetch_row($limitR)){ + array_unshift($weekHeaders,$limitW[0]); + if($i==0) $limit2 = $limitW[0]; + if($i==12) $limitDay = $limitW[0]; + $i++; +} +if (isset($_GET["start"])) $limitDay = $_GET["start"]; +if (isset($_POST["start"])) $limitDay = $_POST["start"]; +if (isset($_GET["end"])) $limit2 = $_GET["end"]; +if (isset($_POST["end"])) $limit2 = $_POST["end"]; + +$query = "SELECT e.name,e.adpID,d.name,n.notes, + w.hours,w.weekStart,w.weekEnd + FROM employees as e LEFT JOIN Departments + AS d ON e.department = d.deptID LEFT JOIN + EmpWeeklyNotes AS n on e.empID = n.empID + LEFT JOIN weeklyHours AS w ON e.empID=w.empID + WHERE datediff(w.weekStart,'$limitDay') >= 0 + AND datediff(w.weekStart,'$limit2') <= 0 + AND e.empID=$empID + ORDER BY w.weekStart"; +$result = $sql->query($query); + +$name = ""; +$adpID = ""; +$dept = ""; +$notes = ""; +$hours = array(); +$labels = array(); +while($row = $sql->fetch_row($result)){ + $name = $row[0]; + $adpID = $row[1]; + $dept = $row[2]; + $notes = $row[3]; + array_push($hours,$row[4]); + $d1 = explode("-",$row[5]); + $d2 = explode("-",$row[6]); + $dstr = $d1[1]."/".$d1[2]."/".$d1[0]; + $dstr .= " - "; + $dstr .= $d2[1]."/".$d2[2]."/".$d2[0]; + array_push($labels,$dstr); +} + +?> + + + + Weekly Hours Report + + + +
        +"; + +echo "
        $adpID
        "; +echo "
        $name
        "; +echo "
        "; +echo "
        + Notes

        + +

        + +

        "; +echo "
        "; +echo "Starting from:

        "; +echo "Ending on:

        "; +for($i = 0; $i < count($hours); $i++){ + echo "

        "; + echo "".$labels[$i].""; + printf("%.2f",$hours[$i]); + echo "
        "; +} +echo "
        "; +echo "
        "; +echo "
        Primary Department: $dept
        "; +printf("
        Average hours: %.2f
        ",array_sum($hours)/count($hours)); +echo "
        "; +echo "Back to Full Listing"; + +?> + +
        + + diff --git a/fannie/legacy/it/hours/eval/index.php b/fannie/legacy/it/hours/eval/index.php new file mode 100644 index 000000000..69507ff12 --- /dev/null +++ b/fannie/legacy/it/hours/eval/index.php @@ -0,0 +1,21 @@ + diff --git a/fannie/legacy/it/hours/eval/list.php b/fannie/legacy/it/hours/eval/list.php new file mode 100644 index 000000000..7c1f49ae6 --- /dev/null +++ b/fannie/legacy/it/hours/eval/list.php @@ -0,0 +1,71 @@ +query($q); +echo ''; +echo '
        '; +echo 'Filter by next eval: '; +echo ' '; +echo '
        '; +echo 'Reports: '; +echo 'Most Recent Eval'; +echo '

        '; +echo ""; +echo ' + + + + +'; +while($w = $db->fetch_row($r)){ + $next = " "; + $tmp = explode("-",$w[3]); + if (is_array($tmp) && count($tmp) == 3){ + $next = $tmp[1]."/".$tmp[0]; + } + printf(" + ", + $w[0],$w[1],$w[2], + (!empty($w[4])?$w[4]:' '),$next, + (!empty($w[5])?$w[5]:' ')); +} +echo "
        NameADP IDHire DateNext Eval
        %s%d%s%s%s
        "; + +?> diff --git a/fannie/legacy/it/hours/eval/report.php b/fannie/legacy/it/hours/eval/report.php new file mode 100644 index 000000000..0402de4d3 --- /dev/null +++ b/fannie/legacy/it/hours/eval/report.php @@ -0,0 +1,53 @@ +Save as Excel'; +} + +$db = hours_dbconnect(); + +$q = "SELECT s.month,s.year,t.title,s.evalScore,e.name,e.empID,e.adpID + FROM employees as e left join evalScores as s ON s.empID=e.empID + LEFT JOIN EvalTypes as t ON s.evalType=t.id + WHERE deleted=0 ORDER BY e.name,s.year desc, s.month desc"; +$r = $db->query($q); +echo ""; +echo ' +'; +$lastEID = -1; +while($w = $db->fetch_row($r)){ + if ($w['empID'] == $lastEID) continue; + else $lastEID = $w['empID']; + $date = ' '; + if (!empty($w['month']) && !empty($w['year'])) + $date = date("F Y",mktime(0,0,0,$w['month'],1,$w['year'])); + $score = ' '; + if (!empty($w['evalScore'])){ + $score = str_pad($w['evalScore'],3,'0'); + $score = substr($score,0,strlen($score)-2).".".substr($score,-2); + } + printf('', + $w['name'],$w['adpID'],$date,(!empty($w['title'])?$w['title']:' '),$score); +} +echo "
        %s%s%s%s%s
        "; + +?> diff --git a/fannie/legacy/it/hours/eval/view.php b/fannie/legacy/it/hours/eval/view.php new file mode 100644 index 000000000..a5fff05ed --- /dev/null +++ b/fannie/legacy/it/hours/eval/view.php @@ -0,0 +1,407 @@ +query($q); + + echo getHistory($empID); + exit; +} +elseif (isset($_REQUEST['addComment'])){ + $db = hours_dbconnect(); + $empID = $_REQUEST['id']; + $user = $_REQUEST['user']; + $comment = $_REQUEST['comment']; + + $q = sprintf("INSERT INTO evalComments(empID,comment,stamp,user,deleted) VALUES + (%d,'%s',now(),'%s',0)",$empID,mysql_real_escape_string($comment), + mysql_real_escape_string($user)); + $r = $db->query($q); + + echo getComments($empID); + exit; +} +elseif (isset($_REQUEST['deleteComment'])){ + $db = hours_dbconnect(); + $q = sprintf("UPDATE evalComments SET deleted=1 WHERE id=%d",$_REQUEST['deleteComment']); + $r = $db->query($q); + echo getComments($_REQUEST['empID']); + exit; +} +elseif (isset($_REQUEST['delEntry'])){ + $entryID = sprintf("%d",$_REQUEST['delEntry']); + $empID = sprintf("%d",$_REQUEST['empID']); + $q = "DELETE FROM evalScores WHERE id=$entryID AND empID=$empID"; + $db = hours_dbconnect(); + $db->query($q); + + echo getHistory($empID); + exit; +} +elseif (isset($_REQUEST['saveInfo'])){ + $id = $_REQUEST['id']; + $month = isset($_REQUEST['month'])?$_REQUEST['month']:''; + $year = isset($_REQUEST['year'])?$_REQUEST['year']:''; + $pos = $_REQUEST['pos']; + $date = "null"; + if (!empty($month) && !empty($year)){ + $date = "'".$year."-".str_pad($month,2,'0',STR_PAD_LEFT)."-01'"; + } + $db = hours_dbconnect(); + $hire = isset($_REQUEST['hire'])?$_REQUEST['hire']:''; + if (strstr($hire,"/") !== False){ + $tmp = explode("/",$hire); + if (count($tmp)==3) + $hire = $tmp[2]."-".$tmp[0]."-".$tmp[1]; + else + $hire = ''; + } + $hire = !empty($hire)?"'".mysql_real_escape_string($hire)."'":"null"; + $etype = $_REQUEST['etype']; + + $delQ = sprintf("DELETE FROM evalInfo WHERE empID=%d",$id); + $insQ = sprintf("INSERT evalInfo VALUES (%d,'%s',%s,%s,%d)",$id, + mysql_real_escape_string($pos),$date,$hire,$etype); + $db->query($delQ); + $db->query($insQ); + echo "Info saved\nPositions: $pos\nNext Eval: ".trim($date,"'")."\nHire: ".trim($hire,"'"); + exit; +} + +if (!isset($_REQUEST['id'])){ + echo "Error: no employee selected"; + exit; +} + +$empID = sprintf("%d",$_REQUEST['id']); + +function getHistory($id){ + $db = hours_dbconnect(); + + $q = "SELECT e.month,e.year,t.title,e.evalScore,e.pos,e.id + FROM evalScores AS e LEFT JOIN EvalTypes AS t + ON e.evalType = t.id + WHERE e.empID=$id + ORDER BY e.year DESC, e.month DESC"; + $r = $db->query($q); + $ret = ""; + $ret .= ""; + while($w = $db->fetch_row($r)){ + $score = str_pad($w[3],3,'0'); + $score = substr($score,0,strlen($score)-2).".".substr($score,-2); + $ret .= sprintf(" + ", + date("F Y",mktime(0,0,0,$w[0],1,$w[1])), + $w[2], + $score, + $w[4],$w[5]); + } + $ret .= "
        DateTypeScorePosition
        %s%s%.2f%s[ X ]
        "; + return $ret; +} + +function getComments($id){ + $ret = ""; + + $db = hours_dbconnect(); + $q = "SELECT stamp,user,comment,id FROM evalComments WHERE empID=$id AND deleted=0 ORDER BY stamp DESC"; + $r = $db->query($q); + while($w = $db->fetch_row($r)){ + $ret .= sprintf('

        %s - %s + [delete]
        +
        %s
        ', + $w['stamp'],$w['user'],$w['id'], + str_replace("\n","
        ",$w['comment'])); + } + return $ret; +} + +function empInfo($id){ + $db = hours_dbconnect(); + $ret = ""; + $q = "SELECT e.name,i.positions,i.nextEval,i.hireDate,i.nextTypeID FROM employees as e + left join evalInfo as i on e.empID=i.empID + WHERE e.empID=$id"; + $r = $db->query($q); + $w = $db->fetch_row($r); + $ret .= ""; + $ret .= ""; + $tmp = explode("-",$w[3]); + if (count($tmp) == 3) + $w[3] = $tmp[1]."/".$tmp[2]."/".$tmp[0]; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        Name$w[0]
        Position(s)
        Hire Date
        Next Eval"; + $ret .= "
        "; + $ret .= "
        "; + return $ret; +} + +function addForm(){ + $ret = ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= "
        ScorePos.
        "; + return $ret; +} + +function commentForm(){ + $ret = ""; + $ret .= "

        "; + $ret .= ""; + return $ret; +} + +?> + + + + + + + + + + + +

        Employee +
        + +
        +
        +
        + + +
        +
        + +
        History +
        + +
        +
        + +
        + +
        +
        +
        Comments +
        + +
        +
        + + /> + + + + + + diff --git a/fannie/legacy/it/hours/importUTO.php b/fannie/legacy/it/hours/importUTO.php new file mode 100644 index 000000000..027ec8ce9 --- /dev/null +++ b/fannie/legacy/it/hours/importUTO.php @@ -0,0 +1,123 @@ + +Upload Data + + +"; + +if (isset($_POST["MAX_FILE_SIZE"])){ + $filename = md5(time()); + move_uploaded_file($_FILES['upload']['tmp_name'],"tmp/$filename"); + + $pp = $_POST["ppID"]; + + $fp = fopen("tmp/$filename","r"); + $c = 1; + echo "
        "; + echo ""; + echo ""; + echo ""; + while (!feof($fp)){ + $line = fgets($fp); + + $fields = csv_parser($line); + if (count($fields) == 0) continue; + + $adpID = $fields[$ADP_COL]; + if (!is_numeric($adpID)) continue; + + $checkQ = "select empID from employees where adpID=$adpID"; + $checkR = $db->query($checkQ); + if ($db->num_rows($checkR) < 1){ + echo "Notice: ADP ID #$adpID doesn't match any current employee."; + echo "Data for this ID is being omitted.
        "; + continue; + } + + $hours = $fields[$HOURS_COL]; + if ($hours == "") $hours = 0; + + echo ""; + echo ""; + echo ""; + + echo ""; + + $c = ($c+1)%2; + } + echo "
        ADP IDUTO Hours
        $adpID$hours
        "; + echo ""; + + fclose($fp); + unlink("tmp/$filename"); + return; +} +elseif (isset($_POST["data"])){ + $datalines = $_POST["data"]; + $ppID = $_POST["pp"]; + + foreach ($datalines as $line){ + $fields = explode(",",$line); + $eIDQ = "select empID from employees where adpID=$fields[0]"; + $eIDR = $db->query($eIDQ); + if ($db->num_rows($eIDR) < 1) continue; + $empID = array_pop($db->fetch_row($eIDR)); + + $upQ = "update ImportedHoursData set UTOHours=$fields[1] where empID=$empID and periodID=$ppID LIMIT 1"; + $upR = $db->query($upQ); + } + + echo "UTO data import complete!
        "; + echo "View Employees
        "; + echo "View Pay Periods"; + + return; +} + +?> + + + +Pay Period:

        +Filename: + +

        + + + diff --git a/fannie/legacy/it/hours/importWeekly.php b/fannie/legacy/it/hours/importWeekly.php new file mode 100644 index 000000000..ac3439e42 --- /dev/null +++ b/fannie/legacy/it/hours/importWeekly.php @@ -0,0 +1,172 @@ + +Upload Data + + + + +"; + +function strnorm($str){ + return strtolower(trim($str)); +} + + +if (isset($_POST["MAX_FILE_SIZE"])){ + $filename = md5(time()); + move_uploaded_file($_FILES['upload']['tmp_name'],"tmp/$filename"); + + $fp = fopen("tmp/$filename","r"); + $emps = array(); + while (!feof($fp)){ + $line = fgets($fp); + $fields = csv_parser($line); + if (!is_numeric(trim($fields[$HOURS_COL]))){ + for($i=0;$iquery($checkQ); + if ($db->num_rows($checkR) < 1){ + echo "Notice: ADP ID #$adpID doesn't match any current employee."; + echo "Data for this ID is being omitted.
        "; + continue; + } + $empID = array_pop($db->fetch_row($checkR)); + + $hours = 0; + if (is_numeric(trim($fields[$HOURS_COL]))){ + $hours = trim($fields[$HOURS_COL]); + } + $status = $fields[$STATUS_COL]; + + if(!isset($emps["$adpID"])){ + $emps["$adpID"] = array(); + $emps["$adpID"][0] = $hours; + $emps["$adpID"][1] = $status; + $emps["$adpID"][2] = $empID; + } + else + $emps["$adpID"][0] += $hours; + + } + fclose($fp); + unlink("tmp/$filename"); + + $start = $_POST["startDay"]; + $temp = explode("-",$start); + $end = date("Y-m-d",mktime(0,0,0,ltrim($temp[1],"0"),ltrim($temp[2],"0")+6,$temp[0])); + + echo "
        "; + echo "Start date: ".$start."
        "; + echo "End date: ".$end."
        "; + echo ""; + echo ""; + $c = 1; + foreach($emps as $k=>$v){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + echo ""; + } + echo "
        ADP IDHoursStatus
        $k$v[0]$v[1]
        "; + echo ""; + echo ""; + echo ""; + echo "
        "; + + return; +} +elseif (isset($_POST["data"])){ + $start = $_POST["startDay"]; + $end = $_POST["endDay"]; + foreach($_POST["data"] as $d){ + $fields = explode(",",$d); + $empID = $fields[0]; + $hours = $fields[1]; + $status = $fields[2]; + + $res = $db->query("SELECT * FROM fullTimeStatus WHERE empID=$empID"); + if ($db->num_rows($res) == 0){ + $q = "INSERT INTO fullTimeStatus VALUES ($empID,'$status')"; + $db->query($q); + } + else { + $q = "UPDATE fullTimeStatus SET status='$status' WHERE empID=$empID"; + $db->query($q); + } + + $q = "INSERT INTO weeklyHours VALUES ('$start','$end',$empID,$hours)"; + $db->query($q); + } + + echo "ADP data import complete!
        "; + echo "Main Menu
        "; + + return; +} + +?> + +
        + +Week Beginning On:

        +Filename: + +

        + + + diff --git a/fannie/legacy/it/hours/index.php b/fannie/legacy/it/hours/index.php new file mode 100644 index 000000000..5c7c3726c --- /dev/null +++ b/fannie/legacy/it/hours/index.php @@ -0,0 +1,17 @@ + diff --git a/fannie/legacy/it/hours/list.php b/fannie/legacy/it/hours/list.php new file mode 100644 index 000000000..f67a1b4ed --- /dev/null +++ b/fannie/legacy/it/hours/list.php @@ -0,0 +1,198 @@ +query($upQ); + break; + case 'delete': + $id = $_GET["id"]; + $upQ = "update employees set deleted=1 where empID=$id"; + $upR = $sql->query($upQ); + break; + case 'undelete': + $id = $_GET["id"]; + $upQ = "update employees set deleted=0 where empID=$id"; + $upR = $sql->query($upQ); + break; + } +} + +$fetchQ = "select e.name,e.adpID, + case when e.department=999 then 'Salary' else e.PTOLevel end as PTOLevel, + case when e.department=999 then ' ' else h.totalHours end as totalHours, + c.cusp,e.empID, + case when s.totalTaken is null then p.ptoremaining else e.adpID-s.totalTaken end as ptoremaining, + case when e.department=999 then ' ' else u.hours end as hours + from employees as e left join hoursalltime as h on e.empID=h.empID + left join cusping as c on e.empID=c.empID + left join pto as p on e.empID=p.empID + left join uto as u on e.empID=u.empID + left join salarypto_ytd s on e.empID=s.empID + $dept_restrict + order by $sort $dir"; +$fetchR = $sql->query($fetchQ); + +echo "Employees"; +echo ""; +echo ""; + +if ($ALL){ + $deptsQ = "select name,deptID from Departments order by name"; + $deptsR = $sql->query($deptsQ); + echo "Show Department: "; + echo ""; +} + +echo ""; +if ($sort == "e.name") + echo ""; +else + echo ""; +if ($sort == "e.adpid") + echo ""; +else + echo ""; +if ($sort == "e.ptolevel") + echo ""; +else + echo ""; +if ($sort == "p.ptoremaining") + echo ""; +else + echo ""; +if ($sort == "u.hours") + echo ""; +else + echo ""; +if ($sort == "u.hours") + echo ""; +else + echo ""; +echo ""; + +while ($fetchW = $sql->fetch_row($fetchR)){ + if ($fetchW[4] == "PRE") + echo ""; + elseif ($fetchW[4] == "POST") + echo ""; + elseif ($fetchW[4] == "!!!") + echo ""; + else + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + if ($edit){ + echo ""; + if ($selected_dept == "-1") echo ""; + else echo ""; + } + echo ""; +} + +echo "
        NameNameADP IDADP IDPTO LevelPTO LevelAvail. PTOAvail. PTOAvail. UTOAvail. UTOTotal HoursTotal Hours
        $fetchW[0]"; + echo "$fetchW[1]$fetchW[2]".(is_numeric($fetchW[6])?sprintf("%.2f",$fetchW[6]):$fetchW[6])."".(is_numeric($fetchW[7])?sprintf("%.2f",$fetchW[7]):$fetchW[7])."".(is_numeric($fetchW[3])?sprintf("%.2f",$fetchW[3]):$fetchW[3])."EditUndeleteDelete
        "; +echo ""; + +?> diff --git a/fannie/legacy/it/hours/menu.php b/fannie/legacy/it/hours/menu.php new file mode 100644 index 000000000..1de392b3e --- /dev/null +++ b/fannie/legacy/it/hours/menu.php @@ -0,0 +1,34 @@ + + + +Menu + + + + + + diff --git a/fannie/legacy/it/hours/pps.php b/fannie/legacy/it/hours/pps.php new file mode 100644 index 000000000..4fcf7be39 --- /dev/null +++ b/fannie/legacy/it/hours/pps.php @@ -0,0 +1,106 @@ +Pay Periods + +"; + +echo ""; + +echo ""; +echo ""; +if ($order == "e.name") + echo ""; +else + echo ""; +if ($order == "e.adpid") + echo ""; +else + echo ""; +if ($order == "i.hours") + echo ""; +else + echo ""; +if ($order == "i.othours") + echo ""; +else + echo ""; +if ($order == "i.ptohours") + echo ""; +else + echo ""; +if ($order == "i.emergencyhours") + echo ""; +else + echo ""; +if ($order == "i.secondratehours") + echo ""; +else + echo ""; +echo ""; +$dataQ = "select e.name,e.adpid,i.hours,i.othours,i.ptohours,i.emergencyhours,i.secondratehours + from ImportedHoursData as i left join employees as e on i.empID=e.empID + where periodID=$ppID + order by $order $dir"; +$dataR = $db->query($dataQ); +$class = array("one","two"); +$c = 1; +while ($dataW = $db->fetch_row($dataR)){ + echo ""; + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + echo ""; + $c = ($c+1)%2; +} +echo "
        NameNameADP IDADP IDReg. HoursReg. HoursOT HoursOT HoursPTO HoursPTO HoursEmerg. HoursEmerg. HoursAlt. HoursAlt. Hours
        $dataW[0]$dataW[1]$dataW[2]$dataW[3]$dataW[4]$dataW[5]$dataW[6]
        "; + +echo ""; + +?> diff --git a/fannie/legacy/it/hours/report.php b/fannie/legacy/it/hours/report.php new file mode 100644 index 000000000..56587ad22 --- /dev/null +++ b/fannie/legacy/it/hours/report.php @@ -0,0 +1,86 @@ +query($periodQ); +while($periodW = $sql->fetch_row($periodR)) + $periods .= ""; + +if (isset($_GET["startPeriod"])){ + $sp = $_GET["startPeriod"]; + $ep = $_GET["endPeriod"]; + + $query = "SELECT e.name,e.adpID,sum(i.hours),sum(i.OTHours), + sum(i.SecondRateHours), + sum(i.PTOHours), + sum(i.UTOHours), + sum(i.hours+i.OTHours+i.SecondRateHours) + FROM ImportedHoursData as i + LEFT JOIN employees as e + ON i.empID = e.empID + WHERE (i.periodID BETWEEN $sp AND $ep + OR i.periodID BETWEEN $ep AND $sp) + AND e.deleted = 0 + GROUP BY i.empID,e.name,e.adpID + ORDER BY e.name"; + $result = $sql->query($query); + + if (isset($_GET['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="hoursWorked.xls"'); + } + else + echo "Save to Excel

        "; + + echo ""; + echo ""; + echo ""; + $colors = array("#ffffcc","#ffffff"); + $c = 0; + while($row = $sql->fetch_row($result)){ + echo ""; + for($i=0;$i<8;$i++) + echo ""; + echo ""; + $c = ($c+1)%2; + } + echo "
        NameADP ID#Reg. HoursOT HoursAlt. RatePTOUTOTotal
        $row[$i]
        "; + +} +else { +?> +Hours worked report + + +

        + + + +
        +Starting pay period: + + +
        +Ending pay period: + + +
        + + Excel +
        + + + diff --git a/fannie/legacy/it/hours/salaryPTO.php b/fannie/legacy/it/hours/salaryPTO.php new file mode 100644 index 000000000..699bd9185 --- /dev/null +++ b/fannie/legacy/it/hours/salaryPTO.php @@ -0,0 +1,44 @@ +"; + $sql->query($insQ); + } + echo "Salary PTO added"; +} +else { + echo "
        "; + $fetchQ = "select empID,name from employees where department=999 + and deleted=0 order by name"; + $fetchR = $sql->query($fetchQ); + echo ""; + echo ""; + while($fetchW = $sql->fetch_row($fetchR)){ + echo ""; + echo ""; + echo ""; + } + echo ""; + echo ""; + echo "
        EmployeeDays taken
        $fetchW[1]
        MonthYear
        "; + echo "
        "; + echo "
        "; + echo ""; + echo "
        "; +} +?> diff --git a/fannie/legacy/it/hours/sync.php b/fannie/legacy/it/hours/sync.php new file mode 100644 index 000000000..97341c8e9 --- /dev/null +++ b/fannie/legacy/it/hours/sync.php @@ -0,0 +1,76 @@ +True, + 'finance'=>True, + 'pop'=>True, + 'quickbooks'=>True, + 'testuser'=>True, + 'printer'=>True, + 'games'=>True, + 'csc'=>True, + 'ldap'=>True, + 'relfvin'=>True, + 'jkresha'=>True +); + +$new_accounts = array(); + +$db = hours_dbconnect(); +$fp = fopen($USER_FILE,'r'); +while( ($line = fgets($fp)) !== False ){ + $fields = explode(":",$line); + $uid = $fields[2]; + $group = $fields[3]; + if ($group != "100") continue; + + $shortname = $fields[0]; + if (isset($EXCLUDE_EMAILS[$shortname])) continue; + + $tmp = explode(" ",$fields[4]); + $name = ""; + for($i=1;$i 1) + $name = trim($name).", "; + if (count($tmp) == 0) + $name = $shortname; + else + $name .= $tmp[0]; + + $chkQ = "SELECT empID FROM employees WHERE empID=".$uid; + $chkR = $db->query($chkQ); + if ($db->num_rows($chkR) == 0){ + $new_accounts[$uid] = $shortname; + $insQ = sprintf("INSERT INTO employees VALUES (%d,%s,NULL,0,8,NULL,0)", + $uid,$db->escape($name)); + $db->query($insQ); + echo "Added ADP entry for $name
        "; + } +} +fclose($fp); + +include('../../db.php'); +foreach($new_accounts as $uid => $uname){ + $uid = str_pad($uid,4,'0',STR_PAD_LEFT); + $chkQ = "SELECT uid FROM Users WHERE uid='$uid'"; + $chkR = $dbc->query($chkQ); + if ($dbc->num_rows($chkR) == 0){ + $insQ = sprintf("INSERT INTO Users VALUES (%s,'','',%s,'','')", + $dbc->escape($uname),$dbc->escape($uid)); + $dbc->query($insQ); + echo "Added user account for $uname
        "; + } +} + +if (count($new_accounts) == 0){ + echo 'No new employees found
        '; +} + +?> +

        +Main Menu diff --git a/fannie/legacy/it/hours/upload.php b/fannie/legacy/it/hours/upload.php new file mode 100644 index 000000000..197e6eece --- /dev/null +++ b/fannie/legacy/it/hours/upload.php @@ -0,0 +1,190 @@ + +Upload Data + + +"; + +if (isset($_POST["MAX_FILE_SIZE"])){ + $filename = md5(time()); + move_uploaded_file($_FILES['upload']['tmp_name'],"tmp/$filename"); + + $pp = $_POST["pp"]; + + $fp = fopen("tmp/$filename","r"); + $c = 1; + echo "

        "; + echo "Pay Period: $pp
        "; + echo ""; + echo ""; + echo ""; + echo ""; + $rows = array(); + while (!feof($fp)){ + $line = fgets($fp); + if ($HEADERS){ + $HEADERS = false; + continue; + } + $fields = csv_parser($line); + if (count($fields) == 0) continue; + if (!isset($fields[$ADP_COL])) continue; + + $adpID = ltrim($fields[$ADP_COL],"U8U"); + if (!isset($rows[$adpID])){ + $rows[$adpID] = array( + "regular"=>0.0, + "overtime"=>0.0, + "pto"=>0.0, + "uto"=>0.0, + "alt"=>0.0, + "holiday"=>0.0 + ); + } + + $checkQ = "select empID from employees where adpID=$adpID"; + $checkR = $db->query($checkQ); + if ($db->num_rows($checkR) < 1){ + echo "Notice: ADP ID #$adpID doesn't match any current employee."; + echo "Data for this ID is being omitted.
        "; + continue; + } + + $hours = 0; + if (is_numeric($fields[$HOURS_COL])) + $hours = $fields[$HOURS_COL]; + + switch(strtoupper($fields[$TYPE_COL])){ + case 'REGLAR': + if (substr($fields[$ALT_COL],-1)=="0") + $rows[$adpID]['regular'] += $hours; + else + $rows[$adpID]['alt'] += $hours; + break; + case 'REGRT2': + $rows[$adpID]['alt'] += $hours; + break; + case 'OVTIME': + $rows[$adpID]['overtime'] += $hours; + break; + case 'PERSNL': + $rows[$adpID]['pto'] += $hours; + break; + case 'UTO': + $rows[$adpID]['uto'] += $hours; + break; + case 'WRKHOL': + $rows[$adpID]['regular'] += $hours; + break; + case 'HOLDAY': + $rows[$adpID]['holiday'] += $hours; + break; + default: + echo "Unknown type: ".$fields[$TYPE_COL]."
        "; + } + + } + + foreach($rows as $adpID => $row){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + printf("", + $adpID,$row['regular'],$row['overtime'],$row['pto'], + $row['uto'],$row['alt'],$row['holiday'] + ); + + $c = ($c+1)%2; + } + echo "
        ADP IDReg. HoursOT HoursPTOUTOAlt. RateHoliday
        $adpID{$row['regular']}{$row['overtime']}{$row['pto']}{$row['uto']}{$row['alt']}{$row['holiday']}
        "; + echo ""; + + fclose($fp); + unlink("tmp/$filename"); + return; +} +elseif (isset($_POST["data"])){ + $datalines = $_POST["data"]; + $pp = $_POST["pp"]; + + $ppIDQ = "select max(periodID)+1 from PayPeriods"; + $ppIDR = $db->query($ppIDQ); + $ppID = array_pop($db->fetch_row($ppIDR)); + + $ppQ = "INSERT INTO PayPeriods VALUES ($ppID,'$pp',YEAR(CURDATE()))"; + $ppR = $db->query($ppQ); + + foreach ($datalines as $line){ + $fields = explode(",",$line); + $eIDQ = "select empID from employees where adpID=$fields[0]"; + $eIDR = $db->query($eIDQ); + if ($db->num_rows($eIDR) < 1) continue; + $empID = array_pop($db->fetch_row($eIDR)); + + $insQ = "INSERT INTO ImportedHoursData VALUES ($empID,$ppID,year(curdate()), + $fields[1],$fields[2],$fields[3],0,$fields[5],$fields[6],$fields[4])"; + $insR = $db->query($insQ); + } + + $cuspQ = "UPDATE cusping as c left join employees as e + on c.empID = e.empID + SET e.PTOLevel=e.PTOLevel+1, e.PTOCutoff=$ppID + where c.cusp = '!!!'"; + $cuspR = $db->query($cuspQ); + + echo "ADP data import complete!
        "; + echo "View Employees
        "; + echo "View Pay Periods"; + + return; +} + +?> + + + +Pay Period:

        +Holiday Hours:

        +Filename: + +

        + + + diff --git a/fannie/legacy/it/hours/viewEmployee.php b/fannie/legacy/it/hours/viewEmployee.php new file mode 100644 index 000000000..423a02656 --- /dev/null +++ b/fannie/legacy/it/hours/viewEmployee.php @@ -0,0 +1,208 @@ +query($checkQ); + if ($d == array_pop($sql->fetch_row($checkR))){ + $validated = true; + break; + } + } + } + + /* no access permissions found, so only allow the + logged in user to see themself + */ + if (!$validated) + $empID = getUID($name); +} + +$deptQ = "select department from employees where empID=".$empID; +$deptR = $sql->query($deptQ); +if (array_pop($sql->fetch_row($deptR)) == "999"){ + header("Location: {$FANNIE_URL}legacy/it/hours/viewEmployeeSalary.php?id=$empID"); + exit; +} + +echo "View"; +echo ""; +echo ""; + +echo "

        Employee Total Hours Worked and PTO Status

        "; + +$infoQ = "select e.name,e.PTOLevel,p.dateStr, + l.HoursWorked - h.totalHours as remaining, + o.PTOremaining,o.totalPTO,h.totalHours,u.hours + from employees as e left join PayPeriods as p on e.PTOCutoff = p.periodID + left join hoursalltime as h on e.empID=h.empID + left join PTOLevels as l on e.PTOLevel+1 = l.levelID + left join pto as o on e.empID=o.empID + left join uto as u on e.empID=u.empID + where e.empID=$empID"; +$infoR = $sql->query($infoQ); +$infoW = $sql->fetch_row($infoR); + +$startdate = $infoW[2]; +if (preg_match("/(\d+?.\d+?.\d+)$/",$startdate,$matches) > 0) + $startdate = $matches[1]; + if (preg_match("/(\d\d?).(\d\d?).(\d\d\d?\d?)/",$startdate,$matches) > 0){ + $month = $matches[1]; + $day = $matches[2]; + $year = $matches[3]; + + $timestamp = mktime(0,0,0,$month,$day,$year); + $startdate = strftime("%D",$timestamp+(24*60*60)); + } + +echo "

        $infoW[0] [ Logout ]

        "; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +printf("",$infoW[3]); +echo ""; +echo "
        Consecutive Hours Worked$infoW[6]
        Current PTO Level$infoW[1]
        Starting PTO Allocation$infoW[5]
        PTO Hours Remaining$infoW[4]
        Effective Since$startdate
        Hours to Next Level%.2f
        UTO Hours Remaining$infoW[7]
        "; + +$periodsQ = "select min(p.dateStr),sum(i.hours),sum(i.OTHours),sum(i.PTOHours), + sum(i.UTOHours),sum(i.SecondRateHours),i.periodID + from ImportedHoursData as i left join PayPeriods as p on i.periodID=p.periodID + where i.empID=$empID group by i.periodID order by i.periodID desc"; +$periodsR = $sql->query($periodsQ); +$sums = array(0,0,0,0,0,0); +$class = array("one","two"); +$prev_hours = 0; +$c = 0; +echo ""; +echo ""; +echo ""; +while ($row = $sql->fetch_row($periodsR)){ + if ($row[6] < 5){ + $prev_hours += $row[1]; + $sums[0] += $row[1]; + $sums[5] += $row[1]; + continue; + } + + echo ""; + $total = $row[1]+$row[2]+$row[5]; + echo ""; + for ($i=1; $i<6;$i++) echo ""; + echo ""; + echo ""; + for ($i=1; $i<6;$i++) + $sums[$i-1]+=$row[$i]; + $sums[5]+=$total; + $c = ($c+1)%2; +} + +echo ""; +echo ""; +for ($i=0;$i<4;$i++) echo ""; +echo ""; +$c = ($c+1)%2; + + +echo ""; +echo ""; +foreach ($sums as $s) echo ""; +echo ""; +echo "
        Pay PeriodReg. HoursOT HoursPTO TakenUTO TakenAlt. Position HoursTotal Hours*
        $row[0]$row[$i]$total
        Previous hours$prev_hours0$prev_hours
        Total$s
        "; +echo "* Total does not include PTO & UTO hours taken. These hours do not count towards +consecutive hours worked."; +echo "

        "; +echo "

        +Please Note: This web-base PTO Access Page is new. If you notice any problems, +please contact Colleen or Andy. +
        "; + + +echo ""; + +?> diff --git a/fannie/legacy/it/hours/viewEmployeeSalary.php b/fannie/legacy/it/hours/viewEmployeeSalary.php new file mode 100644 index 000000000..7d5ab18a5 --- /dev/null +++ b/fannie/legacy/it/hours/viewEmployeeSalary.php @@ -0,0 +1,130 @@ +View"; +echo ""; +echo ""; + +echo "

        Salary Employee PTO Status

        "; + +$infoQ = "select e.name,e.adpID, + s.totalTaken as daysTaken + from employees as e left join + salarypto_ytd as s on e.empID=s.empID + where e.empID=$empID"; +$infoR = $sql->query($infoQ); +$infoW = $sql->fetch_row($infoR); + +echo "

        $infoW[0] [ Logout ]

        "; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        PTO Allocation$infoW[1]
        PTO Taken, YTD$infoW[2]
        PTO Remaining".($infoW[1]-$infoW[2])."
        "; + +$periodsQ = "select daysUsed,month(dstamp),year(dstamp) from salaryHours where empID=$empID order by dstamp DESC"; +$periodsR = $sql->query($periodsQ); +$class = array("one","two"); +$c = 0; +echo ""; +echo ""; +while ($row = $sql->fetch_row($periodsR)){ + echo ""; + $dstr = date("F Y",mktime(0,0,0,$row[1],1,$row[2])); + echo ""; + echo ""; + echo ""; + $c = ($c+1)%2; +} + +echo "
        MonthPTO Taken
        $dstr$row[0]
        "; +echo "
        +Please Note: This web-base PTO Access Page is new. If you notice any problems, +please contact Colleen or Andy. +
        "; + + +echo ""; + +?> diff --git a/fannie/legacy/it/hours/weeklyReport.php b/fannie/legacy/it/hours/weeklyReport.php new file mode 100644 index 000000000..04f99b999 --- /dev/null +++ b/fannie/legacy/it/hours/weeklyReport.php @@ -0,0 +1,110 @@ +query($limitQ); +$limitDay = ""; +while($limitW = $sql->fetch_row($limitR)){ + $temp = explode("-",$limitW[0]); + array_unshift($weekHeaders,$temp[1]."/".$temp[2]); + $limitDay = $limitW[0]; +} + +$query = "SELECT e.empID,e.name,e.adpID,f.status,w.hours + FROM employees AS e LEFT JOIN fullTimeStatus AS f + ON e.empID = f.empID LEFT JOIN weeklyHours AS w + ON e.empID = w.empID + WHERE datediff(w.weekStart,'$limitDay') >= 0 + AND deleted = 0 + ORDER BY e.name,w.weekStart"; +$result = $sql->query($query); +while($row = $sql->fetch_row($result)){ + if (!isset($empData["$row[0]"])) + $empData["$row[0]"] = array(); + $empData["$row[0]"]["name"] = $row[1]; + $empData["$row[0]"]["adpID"] = $row[2]; + $empData["$row[0]"]["status"] = $row[3]; + if (!isset($empData["$row[0]"]["hours"])) + $empData["$row[0]"]["hours"] = array(); + array_push($empData["$row[0]"]["hours"],$row[4]); +} + +?> + + + Weekly Hours Report + + +"; +echo ""; +echo " StatusAvg."; +foreach($weekHeaders as $w) + echo "$w"; +echo ""; + +foreach($empData as $k=>$v){ + $empID = $k; + $name = $v["name"]; + $adpID = $v["adpID"]; + $status = $v["status"]; + $hours = $v["hours"]; + $avg = array_sum($hours)/count($hours); + + if (substr($status,0,4) == "FULL" && $avg < 30.0) + echo ""; + elseif(substr($status,0,2) == "FT" && $avg < 30.0) + echo ""; + elseif(substr($status,0,2) == "PT" && $avg >= 30.0) + echo ""; + else + echo ""; + echo "$adpID"; + printf("%s",$empID,$name); + echo "$status"; + printf("%.2f",$avg); + for($i=0; $i "; + foreach($hours as $h) + printf("%.2f",$h); + echo ""; +} +echo ""; + + +?> diff --git a/fannie/legacy/it/inventory/index.php b/fannie/legacy/it/inventory/index.php new file mode 100644 index 000000000..8e619dd1a --- /dev/null +++ b/fannie/legacy/it/inventory/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/legacy/it/inventory_dev/images/b_down.png b/fannie/legacy/it/inventory_dev/images/b_down.png new file mode 100644 index 000000000..41d33bd54 Binary files /dev/null and b/fannie/legacy/it/inventory_dev/images/b_down.png differ diff --git a/fannie/legacy/it/inventory_dev/images/b_drop.png b/fannie/legacy/it/inventory_dev/images/b_drop.png new file mode 100644 index 000000000..6fc4d3b20 Binary files /dev/null and b/fannie/legacy/it/inventory_dev/images/b_drop.png differ diff --git a/fannie/legacy/it/inventory_dev/images/b_edit.png b/fannie/legacy/it/inventory_dev/images/b_edit.png new file mode 100644 index 000000000..05711a094 Binary files /dev/null and b/fannie/legacy/it/inventory_dev/images/b_edit.png differ diff --git a/fannie/legacy/it/inventory_dev/images/b_up.png b/fannie/legacy/it/inventory_dev/images/b_up.png new file mode 100644 index 000000000..2db3acec6 Binary files /dev/null and b/fannie/legacy/it/inventory_dev/images/b_up.png differ diff --git a/fannie/legacy/it/inventory_dev/index.css b/fannie/legacy/it/inventory_dev/index.css new file mode 100755 index 000000000..3b4cc03b6 --- /dev/null +++ b/fannie/legacy/it/inventory_dev/index.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/fannie/legacy/it/inventory_dev/index.js b/fannie/legacy/it/inventory_dev/index.js new file mode 100755 index 000000000..8d44dedcb --- /dev/null +++ b/fannie/legacy/it/inventory_dev/index.js @@ -0,0 +1,210 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); +var busy = false; + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + if (busy) + setTimeout("phpSend('"+action+"')",10); + else { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); + busy = true; + } +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + busy = false; + var response = http.responseText; + //alert(response); + var array = response.split('`'); + switch(array[0]){ + case 'additem': + document.getElementById('tablearea').innerHTML = array[1]; + break; + case 'deleteitem': + case 'saveCategory': + case 'moveUp': + case 'moveDown': + case 'changeCat': + case 'clearAll': + case 'refresh': + document.getElementById('tablearea').innerHTML = array[1]; + break; + case 'catList': + document.getElementById('changecat'+array[1]).innerHTML = array[2]; + break; + case 'saveitem': + saveCount--; + if (saveCount <= 0) + phpSend('refresh'); + break; + default: + alert(response); + alert("There was an error processing your request"); + } + } +} + +/********************* END AJAX BASICS ******************/ + +function additem(category){ + var item = escape(document.getElementById('newitem'+category).value); + var orderno = document.getElementById('neworderno'+category).value; + var units = document.getElementById('newunits'+category).value; + var price = document.getElementById('newprice'+category).value; + var size = escape(document.getElementById('newsize'+category).value); + var cases = document.getElementById('newcases'+category).value; + var fraction = document.getElementById('newfraction'+category).value; + + units = units.replace(/\#/g,'%23'); + fraction = fraction.replace(/\#/g,'%23'); + + var sendcat = category+""; + if (category == "__new__") + sendcat = document.getElementById('category__new__').value; + + phpSend('additem&item='+item+'&orderno='+orderno+'&units='+units+'&cases='+'&price='+price+'&size='+size+'&cases='+cases+'&fraction='+fraction+'&category='+sendcat); + + document.getElementById('newform'+category).reset(); + document.getElementById('newitem'+category).focus(); +} + +function edititem(id){ + if (in_queue(id)) return; + else queue_add(id); + + var item = document.getElementById('item'+id+'col0').innerHTML; + var size = document.getElementById('item'+id+'col1').innerHTML; + var orderno = document.getElementById('item'+id+'col2').innerHTML; + var units = document.getElementById('item'+id+'col3').innerHTML; + var cases = document.getElementById('item'+id+'col4').innerHTML; + var fraction = document.getElementById('item'+id+'col5').innerHTML; + var price = document.getElementById('item'+id+'col7').innerHTML; + + document.getElementById('item'+id+'col0').innerHTML = ""; + document.getElementById('item'+id+'col1').innerHTML = ""; + document.getElementById('item'+id+'col2').innerHTML = ""; + document.getElementById('item'+id+'col3').innerHTML = ""; + document.getElementById('item'+id+'col4').innerHTML = ""; + document.getElementById('item'+id+'col5').innerHTML = ""; + document.getElementById('item'+id+'col7').innerHTML = ""; + + document.getElementById('edit'+id).innerHTML = "Save"; +} + +function key_callback(e){ + var keycode = e.keyCode; + if (e.keyCode == 13) saveAll(); +} + +var saveCount = 0; +function saveAll(){ + saveCount = 0; + while (editQueue.length > 0){ + saveitem(editQueue.pop()); + saveCount++; + } +} + +function saveitem(id){ + var item = escape(document.getElementById('itemname'+id).value); + var orderno = document.getElementById('orderno'+id).value; + var units = document.getElementById('units'+id).value; + var cases = document.getElementById('cases'+id).value; + var fraction = document.getElementById('fraction'+id).value; + var price = document.getElementById('price'+id).value; + var size = escape(document.getElementById('size'+id).value); + + units = units.replace(/\#/g,'%23'); + fraction = fraction.replace(/\#/g,'%23'); + item = item.replace(/\+/g,'%2B'); + + phpSend('saveitem&id='+id+'&item='+item+'&orderno='+orderno+'&units='+units+'&cases='+cases+'&fraction='+fraction+'&price='+price+'&size='+size); +} + +function deleteitem(id){ + if (confirm("Delete this item?")){ + saveAll(); + phpSend("deleteitem&id="+id); + } +} + +function moveUp(id,category){ + phpSend("moveUp&id="+id+"&category="+category); +} + +function moveDown(id,category){ + phpSend("moveDown&id="+id+"&category="+category); +} + +function renameCategory(category){ + var curName = document.getElementById('category'+category).innerHTML; + var clearName = curName.replace(/_/,' '); + var form = ""; + var link = " (Save)"; + document.getElementById('category'+category).innerHTML = form; + document.getElementById('renameTrigger'+category).innerHTML = link; +} + +function saveCategory(category){ + var newcat = document.getElementById('renameCategory'+category).value; + phpSend('saveCategory&oldcat='+category+'&newcat='+newcat); +} + +function catList(id,category){ + phpSend('catList&id='+id+'&category='+category); +} + +function saveCat(id){ + var newcat = document.getElementById('catSelect'+id).value; + phpSend('changeCat&id='+id+'&newcat='+newcat); +} + +function clearAll(){ + if (confirm("Are you sure you want to clear all totals?")) + phpSend('clearAll'); +} + +// UTILITY +var editQueue = new Array(); + +function in_queue(val){ + for (var i = 0; i < editQueue.length; i++){ + if (editQueue[i] == val) return true; + } + return false; +} + +function queue_add(val){ + editQueue.push(val); +} + +function queue_rm(val){ + var temp = new Array(); + for (var i = 0; i < editQueue.length; i++){ + if (editQueue[i] != val) temp.push(editQueue[i]); + } + editQueue = temp; +} diff --git a/fannie/legacy/it/inventory_dev/index.php b/fannie/legacy/it/inventory_dev/index.php new file mode 100755 index 000000000..43d1e4e7e --- /dev/null +++ b/fannie/legacy/it/inventory_dev/index.php @@ -0,0 +1,366 @@ +query($idQ); + $id = array_pop($sql->fetch_array($idR)) + 1; + + $insQ = "insert into deliInventoryCat values + ($id,'$item','$orderno','$units',$cases,'$fraction',$stocktotal,$price,$total,'$size','$category')"; + $insR = $sql->query($insQ); + + $out .= gettable(); + break; + case 'saveitem': + $id = $_GET["id"]; + $item = strim($_GET['item']); + $orderno = strim($_GET['orderno']); + $units = strim($_GET['units']); + $cases = strim($_GET['cases']); + $fraction = strim($_GET['fraction']); + $price = strim($_GET['price']); + $size = strim($_GET['size']); + + if (empty($cases) || !is_numeric($cases)) + $cases = 0; + if (empty($fraction)) + $fraction = 0; + + $stocktotal = 0; + if (!empty($units)){ + if ($units[strlen($units)-1] == '#' && + $fraction[strlen($fraction)-1] == '#' && $units != 0){ + $partial = substr($fraction,0,strlen($fraction)-1) / substr($units,0,strlen($units)-1); + $stocktotal = $cases + $partial; + } + else if ($units != 0){ + $partial = $fraction / $units; + $stocktotal = $cases + $partial; + } + } + $total = $stocktotal * $price; + + $upQ = "update deliInventoryCat set item='$item',orderno='$orderno',units='$units',cases=$cases, + fraction='$fraction',totalstock=$stocktotal,price=$price,total=$total,size='$size' + where id=$id"; + $upR = $sql->query($upQ); + + break; + case 'refresh': + $out .= gettable(); + break; + case 'deleteitem': + $id = $_GET['id']; + + $delQ = "delete from deliInventoryCat where id=$id"; + $delR = $sql->query($delQ); + + $out .= gettable(); + break; + case 'printview': + $category = $_GET['category']; + + $out = ""; + + if (isset($_GET["excel"])){ + header("Content-Disposition: inline; filename=deliInventoryCat.xls"); + header("Content-Description: PHP3 Generated Data"); + header("Content-type: application/vnd.ms-excel; name='excel'"); + } + else { + $out .= "Save to Excel
        "; + } + $out .= gettable(true,$category); + break; + case 'saveCategory': + $oldcat = preg_replace("/_/"," ",$_GET['oldcat']); + $newcat = preg_replacE("/_/"," ",$_GET['newcat']); + + $updateQ = "update deliInventoryCat set category='$newcat' where category='$oldcat'"; + $updateR = $sql->query($updateQ); + + $out .= gettable(); + break; + case 'moveUp': + $id = $_GET['id']; + $cat = preg_replace("/_/"," ",$_GET['category']); + + $locateQ = "select max(id) from deliInventoryCat where + id < $id and category='$cat'"; + $locateR = $sql->query($locateQ); + $loc = array_pop($sql->fetch_array($locateR)); + if ($loc != "") + swap($id,$loc); + + $out .= gettable(); + break; + case 'moveDown': + $id = $_GET['id']; + $cat = preg_replace("/_/"," ",$_GET['category']); + + $locateQ = "select min(id) from deliInventoryCat where + id > $id and category='$cat'"; + $locateR = $sql->query($locateQ); + $loc = array_pop($sql->fetch_array($locateR)); + if ($loc != "") + swap($id,$loc); + + $out .= gettable(); + break; + case 'catList': + $id = $_GET['id']; + $cat = preg_replace("/_/"," ",$_GET['category']); + + $fetchQ = "select category from deliInventoryCat + group by category order by category"; + $fetchR = $sql->query($fetchQ); + + $out .= "$id"."`"; + $out .= ""; + break; + case 'changeCat': + $id = $_GET['id']; + $newcat = $_GET['newcat']; + $upQ = "update deliInventoryCat set category='$newcat' where id=$id"; + $upR = $sql->query($upQ); + + $out .= gettable(); + break; + case 'clearAll': + $clearQ = "update deliInventoryCat set cases=0, fraction=0, + totalstock=0, total=0"; + $clearR = $sql->query($clearQ); + $out .= gettable(); + break; + } + + echo $out; + return; +} + +function gettable($limit=false,$limitCat="ALL"){ + global $sql; + $ret = ""; + $colors = array('#ffffcc','#ffffff'); + $c = 0; + + $fetchQ = "select item,size,orderno,units, + case when cases='0' then NULL else cases end as cases, + case when fraction='0' then NULL else fraction end as fraction, + case when totalstock='0' then NULL else totalstock end as totalstock, + price,total,category,id + from deliInventoryCat + order by category, item"; + if ($limit){ + $fetchQ = "select item,size,orderno,units, + case when cases='0' then NULL else cases end as cases, + case when fraction='0' then NULL else fraction end as fraction, + case when totalstock='0' then NULL else totalstock end as totalstock, + price,total,category,id + from deliInventoryCat + where category='$limitCat' + order by category, item"; + } + $fetchR = $sql->query($fetchQ); + + $ret = "Save all changes | Clear all totals

        "; + + $currentCat = ""; + $sum = 0.0; + while ($fetchW = $sql->fetch_array($fetchR)){ + $catfixed = $currentCat; + if ($fetchW['category'] != $currentCat){ + if ($currentCat != ""){ + $ret .= "Grand Total"; + for ($i = 0; $i < 7; $i++) + $ret .= " "; + $ret .= "$sum"; + $ret .= ""; + if (!$limit) + $ret .= inputBox($currentCat); + $ret .= "
        "; + } + $currentCat = $fetchW['category']; + $catfixed = preg_replace("/ /","_",$currentCat); + $ret .= "$currentCat"; + $ret .= ""; + if (!$limit){ + $ret .= " [Rename This Category]"; + $ret .= " [Print this Category]"; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $c = 0; + $sum = 0.0; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $sum += $fetchW['total']; + + if (!$limit){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + + $ret .= ""; + $c = ($c+1)%2; + + } + $ret .= ""; + for ($i = 0; $i < 7; $i++) + $ret .= ""; + $ret .= ""; + $ret .= "
        ItemSizeOrder #Units/CaseCases#/EachTotal casesPrice/caseTotal
        ".$fetchW['item']." ".$fetchW['size']." ".$fetchW['orderno']." ".$fetchW['units']." ".$fetchW['cases']." ".$fetchW['fraction']." ".$fetchW['totalstock']." ".$fetchW['price']." ".$fetchW['total']." Category
        Grand Total $sum
        "; + if (!$limit) + $ret .= inputBox($currentCat); + + + return $ret; +} + +function inputBox($category){ + global $sql; + $category = preg_replace("/ /","_",$category); + $ret = "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        ItemSizeOrder #Units/CaseCases#/EachPrice/case
        "; + $ret .= "
        "; + + return $ret; +} + +function swap($id1,$id2){ + global $sql; + $q1 = "update deliInventoryCat set id=-1*$id2 where id=$id2"; + $sql->query($q1); + + $q2 = "update deliInventoryCat set id=$id2 where id=$id1"; + $sql->query($q2); + + $q3 = "update deliInventoryCat set id=$id1 where id=-1*$id2"; + $sql->query($q3); +} + +// safari trim +// also takes off ascii 160 chars +function strim($str){ + return trim($str,chr(32).chr(9).chr(10).chr(11).chr(13).chr(0).chr(160).chr(194)); +} +?> + + +Inventory + + + + +
        +
        +
        +Add an item to a new category
        +
        + + + + + + + + + + + + + + + + +
        ItemSizeOrder #Units/CaseCases#/EachPrice/caseCategory Name
        +
        +
        +
        + + diff --git a/fannie/legacy/it/invoices/index.js b/fannie/legacy/it/invoices/index.js new file mode 100644 index 000000000..701730b36 --- /dev/null +++ b/fannie/legacy/it/invoices/index.js @@ -0,0 +1,84 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); +var busy = false; + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + if (!busy){ + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + busy = true; + http.send(null); + } + else + setTimeout("phpSend('"+action+"')",50); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + busy = false; + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'pickDate': + case 'upcSearch': + document.getElementById('invoicenumber').innerHTML = array[1]; + break; + case 'pickNum': + document.getElementById('invoice').innerHTML = array[1]; + break; + default: + alert(response); + } + } +} + +function pickDate(){ + var date = document.getElementById('date_select').value; + + if (date != "") + phpSend("pickDate&date="+date); +} + +function pickNum(){ + var date = document.getElementById('current_date').value; + var num = document.getElementById('select_num').value; + + if (num != "") + phpSend("pickNum&date="+date+"&num="+num); +} + +function upcSearch(){ + var upc = document.getElementById('search_upc').value; + + if (upc != "") + phpSend("upcSearch&upc="+upc); +} + +function pickInv(){ + var invoice = document.getElementById('select_inv').value; + + if (invoice != ""){ + var temp = invoice.split(' '); + phpSend('pickNum&date='+temp[0]+'&num='+temp[1]); + } +} diff --git a/fannie/legacy/it/invoices/index.php b/fannie/legacy/it/invoices/index.php new file mode 100644 index 000000000..61b1faa07 --- /dev/null +++ b/fannie/legacy/it/invoices/index.php @@ -0,0 +1,233 @@ +Invoice Number
        : "; + $out .= " "; + $out .= ""; + $out .= ""; + break; + case 'pickNum': + $date = $_GET['date']; + $num = $_GET['num']; + $csv = False; + if (isset($_GET['csv'])){ + $csv = True; + $out = ""; + } + $out .= getInvoice($num,$date,$csv); + break; + case 'upcSearch': + $upc = $_GET['upc']; + if (!strstr($upc,"-")){ + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + $upc = substr($upc,0,8)."-".substr($upc,8); + $upc = ltrim($upc,"0"); + } + + $searchQ = "select invoicedate,invnum from inv_lines where upc like '%$upc%' order by invoicedate desc"; + $searchR = $sql->query($searchQ); + $out .= "Invoice Number: "; + $out .= " "; + $out .= ""; + break; + } + + echo $out; + return; +} + +function getDates(){ + global $sql; + + $datesQ = "select invoicedate from headers group by invoicedate order by invoicedate desc limit 50"; + $datesR = $sql->query($datesQ); + + $ret = array(); + $i = 0; + while ($datesW = $sql->fetch_row($datesR)) + $ret[$i++] = $datesW[0]; + return $ret; +} + +function getInvoice($InvoiceNum,$InvoiceDate,$csv=False){ + global $sql; + $ret = ""; + + if (!$csv){ + $ret .= ""; + $ret .= "Download as CSV
        "; + $ret .= ""; + } + else { + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="'.$InvoiceDate."_".$InvoiceNum.'.csv"'); + } + $ret .= getHeader($InvoiceNum,$InvoiceDate,$csv); + $ret .= getDetails($InvoiceNum,$InvoiceDate,$csv); + $ret .= getFooter($InvoiceNum,$InvoiceDate,$csv); + if (!$csv){ + $ret .= "
        "; + } + return $ret; +} + +function getHeader($InvoiceNum,$InvoiceDate,$csv=False){ + global $sql; + $LINE_START=""; + $SEP=""; + $NL=""; + $Q=""; + if ($csv){ + $LINE_START=""; + $SEP=","; + $NL="\r\n"; + $Q="\""; + } + + $ret = $LINE_START.'RecordType'.$SEP.'InvNum'.$SEP.'OrderNumber'.$SEP.'InvoiceDate'.$SEP.'DBA'.$SEP; + $ret .= 'CustomerNumber'.$SEP.'CustomerName'.$SEP.'CustAddr1'.$SEP.'CustAddr2'.$SEP.'City'.$SEP.'State'.$SEP; + $ret .= 'ZipCode'.$SEP.'PhoneNumber'.$SEP.'Whse'.$SEP.'Trip'.$SEP.'Terms'.$SEP.'DCFlag'.$SEP.'TermsMsg'.$SEP.'CorpCustID'.$SEP; + $ret .= 'CoverSheet'.$SEP.'OrdEntryData'.$SEP.'ChainCode'.$SEP.'ApplyToNum'.$SEP.'PONum'.$NL; + + $headersQ = "select 'Header',InvNum,Type,OrderNumber,InvoiceDate,DBA,CustomerNumber,CustomerName, + CustAddr1,CustAddr2,City,State,ZipCode,PhoneNumber,Whse,Trip,Terms,DCFlag,TermsMsg,CorpCustID, + CoverSheet,OrdEntryDate,ChainCode,ApplyToNum,PONum + FROM headers WHERE InvNum=$InvoiceNum AND InvoiceDate='$InvoiceDate'"; + $headersR = $sql->query($headersQ); + while ($w = $sql->fetch_row($headersR)){ + $ret .= $LINE_START; + $ret .= $w[0].$SEP.$w[1].$SEP.$w[2].$SEP.$w[3].$SEP.$w[4].$SEP.$w[5].$SEP; + $ret .= $w[7].$SEP.$w[8].$SEP.$w[9].$SEP.$w[10].$SEP.$w[11].$SEP.$w[12].$SEP; + $ret .= $w[13].$SEP.$w[14].$SEP.$w[15].$SEP.$w[16].$SEP.$w[17].$SEP.$w[18].$SEP; + $ret .= $w[19].$SEP.$w[20].$SEP.$w[21].$SEP.$w[22].$SEP.$w[23].$SEP.$w[24].$NL; + } + + return $ret; +} + +function getDetails($InvoiceNum,$InvoiceDate,$csv=False){ + global $sql; + $LINE_START=""; + $SEP=""; + $NL=""; + $Q=""; + if ($csv){ + $LINE_START=""; + $SEP=","; + $NL="\r\n"; + $Q="\""; + } + + $ret = $LINE_START.'RecordType'.$SEP.'InvNum'.$SEP.'Type'.$SEP.'UPC'.$SEP.'ProductID'.$SEP; + $ret .= 'QuantityShipped'.$SEP.'Unit'.$SEP.'Size'.$SEP.$Q.'Brand'.$Q.$SEP.$Q.'Description'.$Q.$SEP.'RegularSRP'.$SEP; + $ret .= 'Status'.$SEP.'NetPricePerUnit'.$SEP.'ExtendedPrice'.$SEP.'SaleSRP'.$SEP.'RegPricePerUnit'.$SEP.'CustomerID'.$SEP; + $ret .= 'PriceOrigin'.$SEP.'QuantityOrdered'.$SEP.'Taxable'.$SEP.'LBFlag'.$SEP.'CWFlag'.$SEP; + $ret .= 'CNF_RegSRP'.$SEP.'CNF_SpcSRP'.$SEP.'CorpCustID'.$SEP.'CorpProdID'.$SEP.'OrderNumber'.$SEP; + $ret .= 'InvoiceDate'.$SEP.'Servings'.$NL; + + $detailsQ = "select 'Detail',InvNum,Type,UPC,ProductID,QuantityShipped,Unit,Size,Brand,Description,RegularSRP, + Status,NetPricePerUnit,ExtendedPrice,SaleSRP,RegPricePerUnit,CustomerID,PriceOrigin,QuantityOrdered, + Taxable,LBFlag,CWFlag,CNF_RegSRP,CNF_SpcSRP,CorpCustID,CorpProdID,OrderNumber,InvoiceDate,Servings + FROM inv_lines WHERE InvNum=$InvoiceNum and InvoiceDate='$InvoiceDate'"; + $detailsR = $sql->query($detailsQ); + while($w = $sql->fetch_row($detailsR)){ + $ret .= $LINE_START; + $ret .= $w[0].$SEP.$w[1].$SEP.$w[2].$SEP.$w[3].$SEP.$w[4].$SEP.$w[5].$SEP.$w[6].$SEP; + $ret .= $w[7].$SEP.$Q.$w[8].$Q.$SEP.$Q.$w[9].$Q.$SEP.$w[10].$SEP.$w[11].$SEP.$w[12].$SEP; + $ret .= $w[13].$SEP.$w[14].$SEP.$w[15].$SEP.$w[16].$SEP.$w[17].$SEP.$w[18].$SEP; + $ret .= $w[19].$SEP.$w[20].$SEP.$w[21].$SEP.$w[22].$SEP.$w[23].$SEP.$w[24].$SEP; + $ret .= $w[25].$SEP.$w[26].$SEP.$w[27].$SEP.$w[28].$NL; + } + + return $ret; +} + +function getFooter($InvoiceNum,$InvoiceDate,$csv=False){ + global $sql; + $LINE_START=""; + $SEP=""; + $NL=""; + $Q=""; + if ($csv){ + $LINE_START=""; + $SEP=","; + $NL="\r\n"; + $Q="\""; + } + + $ret = $LINE_START.'RecordType'.$SEP.'InvNum'.$SEP.'Type'.$SEP.'NumGroceryItems'.$SEP.'NumRefrigItems'.$SEP; + $ret .= 'NumRepackItems'.$SEP.'NumFrozenItems'.$SEP.'TotalPcs'.$SEP.'TotalWt'.$SEP.'TotalCubes'.$SEP.'NonSpecial'.$SEP; + $ret .= 'Special'.$SEP.'GrossTotal'.$SEP.'VolDiscnt'.$SEP.'Discount'.$SEP.'NetTotal'.$SEP.'TotalRetail'.$SEP.'Deposits'.$SEP; + $ret .= 'Adjustments'.$SEP.'ProfitAmnt'.$SEP.'ProfitPercent'.$SEP.'InvDate'.$SEP.'CorpCustID'.$SEP.'OrderNumber'.$NL; + + $footersQ = "select 'Footer',InvNum,Type,NumGroceryItems,NumRefrigItems,NumRepackItems,NumFrozenItems, + TotalPcs,TotalWt,TotalCubes,NonSpecial,Special,GrossTotal,VolDiscnt,Discount,NetTotal,TotalRetail, + Deposits,Adjustments,ProfitAmnt,ProfitPercent,InvDate,CorpCustID,OrderNumber + FROM footers WHERE InvNum=$InvoiceNum AND InvDate='$InvoiceDate'"; + $footersR = $sql->query($footersQ); + while($w = $sql->fetch_row($footersR)){ + $ret .= $LINE_START; + $ret .= $w[0].$SEP.$w[1].$SEP.$w[2].$SEP.$w[3].$SEP.$w[4].$SEP.$w[5].$SEP; + $ret .= $w[7].$SEP.$w[8].$SEP.$w[9].$SEP.$w[10].$SEP.$w[11].$SEP.$w[12].$SEP; + $ret .= $w[13].$SEP.$w[14].$SEP.$w[15].$SEP.$w[16].$SEP.$w[17].$SEP.$w[18].$SEP; + $ret .= $w[19].$SEP.$w[20].$SEP.$w[21].$SEP.$w[22].$SEP.$w[23].$SEP.$w[24].$SEP; + $ret .= $w[25].$NL; + } + + return $ret; +} + +?> + + +UNFI Invoices + + + + +
        +Invoice Date: + + +    OR    +UPC: + +
        +
        + +
        +
        + +
        + + diff --git a/fannie/legacy/it/likecode_manager/delete.php b/fannie/legacy/it/likecode_manager/delete.php new file mode 100644 index 000000000..1474910a6 --- /dev/null +++ b/fannie/legacy/it/likecode_manager/delete.php @@ -0,0 +1,21 @@ + + +
        +Delete like code
        + +> + +    + +
        diff --git a/fannie/legacy/it/likecode_manager/edit.php b/fannie/legacy/it/likecode_manager/edit.php new file mode 100644 index 000000000..413429c76 --- /dev/null +++ b/fannie/legacy/it/likecode_manager/edit.php @@ -0,0 +1,30 @@ +query($q); +$row = $sql->fetch_array($r); +$desc = $row[0]; + +?> + +
        +Like code:
        +Description: +
        + + +> + +
        diff --git a/fannie/legacy/it/likecode_manager/index.php b/fannie/legacy/it/likecode_manager/index.php new file mode 100644 index 000000000..729c6c326 --- /dev/null +++ b/fannie/legacy/it/likecode_manager/index.php @@ -0,0 +1,59 @@ +query($fetchQ); + while($row = $sql->fetch_array($fetchR)) + echo $row[0].",\"".$row[1]."\"\n"; + return; +} + +if (isset($_POST['type'])){ + $lc = $_POST['likecode']; + if ($_POST['type'] == "edit"){ + $desc = $_POST['desc']; + $q = "update likecodes set likecodedesc='$desc' where likecode=$lc"; + $sql->query($q); + } + else if ($_POST['type'] == "delete"){ + if ($_POST['submit'] == "Yes"){ + $q = "delete from likecodes where likecode=$lc"; + $sql->query($q); + $q = "delete from upclike where likecode=$lc"; + $sql->query($q); + } + } +} + +$q = "select likecode,likecodedesc from likecodes order by likecode"; +$r = $sql->query($q); + +echo "Save to Excel
        "; +echo ""; +echo ""; +while ($row = $sql->fetch_array($r)){ + echo ""; + $lc = $row[0]; + $desc = $row[1]; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        Like CodeDescription
        $lc$descEditDelete
        "; + +?> diff --git a/fannie/legacy/it/mas90/ar.php b/fannie/legacy/it/mas90/ar.php new file mode 100644 index 000000000..a740a790b --- /dev/null +++ b/fannie/legacy/it/mas90/ar.php @@ -0,0 +1,64 @@ +query("use $FANNIE_TRANS_DB"); + +$SEP=","; +$Q = ""; +$NL = "\r\n"; + +$query = "select num from lastMasInvoice"; +$result = $sql->query($query); +$INV_NUM = (int)array_pop($sql->fetch_array($result)); + +$query = "select card_no,trans_num, + -1*total, + case when trans_subtype='MI' then 'STORE CHARGE' ELSE 'PAYMENT RECEIVED' END, + year(tdate),month(tdate),day(tdate), + case when trans_subtype='MI' then 'CG' else 'PY' END + from dlog_90_view + where ".$sql->datediff($sql->now(),'tdate')." = 1 + and (trans_subtype='MI' or department=990) + and card_no <> 11 + order by department,card_no"; +if (isset($_GET['date'])){ +$query = "select card_no,trans_num, + -1*total, + case when trans_subtype='MI' then 'STORE CHARGE' ELSE 'PAYMENT RECEIVED' END, + year(tdate),month(tdate),day(tdate), + case when trans_subtype='MI' then 'CG' else 'PY' END + from dlog_90_view + where ".$sql->datediff("'$date'",'tdate')." = 0 + and (trans_subtype='MI' or department=990) + and card_no <> 11 + order by department,card_no"; + +} +$result = $sql->query($query); + +while ($row = $sql->fetch_row($result)){ + if ($INV_NUM <= 5000000) $INV_NUM=5000000; + echo "H".$SEP; + echo $INV_NUM.$SEP; + echo $row[0].$SEP; + echo $Q.$row[4]."-".$row[5]."-".$row[6].$Q.$SEP; + echo $Q.$row[3]." ".$row[1].$Q.$SEP; + echo $Q.$row[1].$Q.$NL; + echo "L".$SEP; + echo $INV_NUM.$SEP; + echo $Q.$row[7].$Q.$SEP; + echo trim($row[2]).$NL; + $INV_NUM=($INV_NUM+1)%10000000; +} + +$INV_NUM--; +$sql->query("update lastMasInvoice set num=$INV_NUM"); + +?> diff --git a/fannie/legacy/it/mas90/equity.php b/fannie/legacy/it/mas90/equity.php new file mode 100644 index 000000000..b16a62ccf --- /dev/null +++ b/fannie/legacy/it/mas90/equity.php @@ -0,0 +1,61 @@ +query("use $FANNIE_TRANS_DB"); + +$SEP=","; +$Q = ""; +$NL = "\r\n"; + +$query = "select num from lastMasInvoice"; +$result = $sql->query($query); +$INV_NUM = (int)array_pop($sql->fetch_array($result)); + +$query = "select card_no,trans_num, + total, + case when department=991 then 'EQUITY B' else 'EQUITY A' END, + year(tdate),month(tdate),day(tdate), + case when department=991 then 'EQB' else 'EQA' END + from dlog_15 + where ".$sql->datediff($sql->now(),'tdate')." = 1 + and department in (991,992) + order by department,card_no"; +if (isset($_GET['date'])){ + $query = "select card_no,trans_num, + total, + case when department=991 then 'EQUITY B' else 'EQUITY A' END, + year(tdate),month(tdate),day(tdate), + case when department=991 then 'EQB' else 'EQA' END + from dlog_15 + where ".$sql->datediff("'$date'",'tdate')." = 0 + and department in (991,992) + order by department,card_no"; +} +$result = $sql->query($query); + +while ($row = $sql->fetch_row($result)){ + if ($INV_NUM <= 5000000) $INV_NUM=5000000;; + echo "H".$SEP; + echo $INV_NUM.$SEP; + echo $row[0].$SEP; + echo $Q.$row[4]."-".$row[5]."-".$row[6].$Q.$SEP; + echo $Q.$row[3]." ".$row[1].$Q.$SEP; + echo $Q.$row[1].$Q.$NL; + echo "L".$SEP; + echo $INV_NUM.$SEP; + echo $Q.$row[7].$Q.$SEP; + echo trim($row[2]).$NL; + $INV_NUM=($INV_NUM+1)%10000000; +} + +$INV_NUM--; +$sql->query("update lastMasInvoice set num=$INV_NUM"); + +?> diff --git a/fannie/legacy/it/mas90/invoice_num b/fannie/legacy/it/mas90/invoice_num new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/fannie/legacy/it/mas90/invoice_num @@ -0,0 +1 @@ +0 diff --git a/fannie/legacy/it/mas90/journal.js b/fannie/legacy/it/mas90/journal.js new file mode 100644 index 000000000..89ccfc0fb --- /dev/null +++ b/fannie/legacy/it/mas90/journal.js @@ -0,0 +1,517 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); +var busy = false; + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + if (!busy){ + http.open('get', 'journal.php?action='+action); + http.onreadystatechange = handleResponse; + busy = true; + http.send(null); + } + else + setTimeout("phpSend('"+action+"')",50); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + busy = false; + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'initDate': + case 'reInit': + document.getElementById('contentarea').innerHTML = array[1]; + resumSheet(); + break; + case 'save': + if (array[1] != '') alert(array[1]); + break; + default: + alert(response); + } + } +} + +function initDate(){ + var date = document.getElementById('init_date').value; + document.getElementById('currentDate').value = date; + document.getElementById('contentarea').innerHTML = " "; + phpSend("initDate&date="+date); +} + +function resumSheet(){ + resumTenders(); + resumSales(); + resumOtherIncome(); + resumMisc(); + resumTotals(); +} + +function resumTenders(){ + var cash = Number(document.getElementById('inputCash').value); + var check = Number(document.getElementById('inputCheck').value); + var depTotal = Math.round((cash+check)*100) / 100; + document.getElementById('depositTotal').innerHTML = depTotal; + document.getElementById('jDepositTotal').innerHTML = depTotal; + + var ebt = Number(document.getElementById('inputEBT').value); + var mc = Number(document.getElementById('inputCCMC').value); + var visa = Number(document.getElementById('inputCCVisa').value); + var disc1 = Number(document.getElementById('inputCCDisc1').value); + var disc2 = Number(document.getElementById('inputCCDisc2').value); + //document.getElementById('jCCMain').innerHTML = Math.round((ebt+mc+visa)*100) / 100; + //document.getElementById('jCCDisc1').innerHTML = disc1; + //document.getElementById('jCCDisc2').innerHTML = disc2; + document.getElementById('totalFAPs').innerHTML = Math.round((mc+visa+disc1+disc2)*100) / 100; + document.getElementById('totalCCEBT').innerHTML = Math.round((mc+visa+disc1+disc2+ebt)*100) / 100; + document.getElementById('jTotalCCEBT').innerHTML = Math.round((mc+visa+disc1+disc2+ebt)*100) / 100; + + var rrr = Number(document.getElementById('inputRRR').value); + var coupons = Number(document.getElementById('inputCoupons').value); + var gc = Number(document.getElementById('inputGC').value); + var tc = Number(document.getElementById('inputTC').value); + var storecharge = Number(document.getElementById('inputStoreCharge').value); + var instorecoup = Number(document.getElementById('inputInStoreCoup').value); + document.getElementById('jRRR').innerHTML = rrr; + document.getElementById('jCoupons').innerHTML = coupons; + document.getElementById('jGC').innerHTML = gc; + document.getElementById('jTC').innerHTML = tc; + document.getElementById('jStoreCharge').innerHTML = storecharge; + document.getElementById('jInStoreCoup').innerHTML = instorecoup; + + var tenderTotal = Math.round((cash+check+ebt+visa+mc+disc1+disc2+rrr+coupons+gc+tc+storecharge+instorecoup)*100) / 100; + document.getElementById('tenderTotal').innerHTML = tenderTotal; +} + +function resumSales(){ + var pcodes = new Array(41201,41205,41300,41305,41310,41315,41400,41405,41407,41410,41415,41420, + 41425,41430,41435,41440,41500,41505,41510,41515,41520,41525,41530, + 41600,41605,41610,41640,41645,41700,41705); + var pCodeTotal = 0; + for (var i=0; i"; + content += " "; + content += " "; + content += ""; + + num = Number(num); + + var table = document.getElementById('thetable'); + var row = table.insertRow(87+num); + row.innerHTML = content; + document.getElementById('miscCount').value = num+1; +} + +function saveMisc(date){ + var total = document.getElementById('miscCount').value; + var sendStr = ""; + for (var i = 0; i < total; i++){ + var val = document.getElementById('inputMisc'+i).value; + if (val != ''){ + var account = document.getElementById('accountMisc'+i).value; + sendStr += account+":"+val+";"; + } + } + sendStr = sendStr.substring(0,sendStr.length-1); + phpSend('save&date='+date+'&type=M&data='+sendStr); +} + +function resumMisc(){ + var total = document.getElementById('miscCount').value; + for (var i = 0; i < total; i++){ + var val = Number(document.getElementById('inputMisc'+i).value); + if (val < 0){ + document.getElementById('jDebitMisc'+i).innerHTML = -1*val; + document.getelementById('jCreditMisc'+i).innerHTML = " "; + } + else{ + document.getElementById('jDebitMisc'+i).innerHTML = " "; + document.getElementById('jCreditMisc'+i).innerHTML = val; + } + } +} diff --git a/fannie/legacy/it/mas90/journal.php b/fannie/legacy/it/mas90/journal.php new file mode 100644 index 000000000..97128c28e --- /dev/null +++ b/fannie/legacy/it/mas90/journal.php @@ -0,0 +1,501 @@ +query($checkQ); + if ($sql->num_rows($checkR) > 0) $FROM_SAVED = True; + } + + $ret .= "Save | "; + $ret .= "Reload from POS | "; + $ret .= "Export to CSV
        "; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $dlog = select_dlog($date); + + $tenderQ = "select t.tenderName,-sum(d.total) as total + from $dlog as d, Tenders as t + where datediff(dd,'$date',d.tDate) = 0 + and d.trans_status <> 'X' + and d.trans_subtype = t.tenderCode + group by t.tenderName"; + if ($FROM_SAVED){ + $tenderQ = "select sub_type,value from dailyJournal + where datediff(dd,tdate,'$date') = 0 and + type = 'T'"; + } + $tenderR = $sql->query($tenderQ); + $cash = 0; + $check = 0; + $MAD = 0; + $RRR = 0; + $coupons = 0; + $GC = 0; + $TC = 0; + $storecharge = 0; + $EBT = 0; + $MC = 0; + $Visa = 0; + $Disc1 = 0; + $Disc2 = 0; + $instoreCoup = 0; + while ($w = $sql->fetch_row($tenderR)){ + if ($w[0] == "Cash") $cash = $w[1]; + elseif ($w[0] == "Check") $check = $w[1]; + elseif ($w[0] == "MAD Coupon") $MAD = $w[1]; + elseif ($w[0] == "RRR Coupon") $RRR = $w[1]; + elseif ($w[0] == "Coupons") $coupons = $w[1]; + elseif ($w[0] == "Gift Card") $GC = $w[1]; + elseif ($w[0] == "GIFT CERT") $TC = $w[1]; + elseif ($w[0] == "InStore Charges") $storecharge = $w[1]; + elseif ($w[0] == "EBT") $EBT = $w[1]; + elseif ($w[0] == "MC") $MC = $w[1]; + elseif ($w[0] == "Visa") $Visa = $w[1]; + elseif ($w[0] == "Discover1") $Disc1 = $w[1]; + elseif ($w[0] == "Discover2") $Disc2 = $w[1]; + elseif ($w[0] == "InStoreCoupon") $instoreCoup = $w[1]; + } + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $style = ""; + if ($Disc1 == 0) $style = "display:none;"; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $salesQ = "select d.pCode,sum(l.total) as total from + $dlog as l join departments as d on l.department = d.dept_no + where datediff(dd,'$date',tDate) = 0 + and l.department < 600 and l.department <> 0 + and l.trans_type <> 'T' + group by d.pCode + order by d.pCode"; + if ($FROM_SAVED){ + $salesQ = "select sub_type,value from dailyJournal where + datediff(dd,tdate,'$date') = 0 and type='P' order by sub_type"; + } + $pCodes = array(41201,41205,41300,41305,41310,41315,41400,41405,41407,41410,41415,41420, + 41425,41430,41435,41440,41500,41505,41510,41515,41520,41525,41530,41600, + 41605,41610,41640,41645,41700,41705); + $i = 0; + $salesR = $sql->query($salesQ); + while ($w = $sql->fetch_row($salesR)){ + if ($i >= count($pCodes)) break; + while ($w[0] > $pCodes[$i]){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + } + if ($w[0] == $pCodes[$i]){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + } + } + while ($i < count($pCodes)){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + } + + $ret .= ""; + + $totalQ = "select sum(l.total) as totalSales from $dlog as l + where datediff(dd,'$date',tDate) = 0 + and l.department < 600 and l.department <> 0 + and l.trans_type <> 'T'"; + $totalR = $sql->query($totalQ); + $totalW = $sql->fetch_row($totalR); + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + + $otherQ = "select d.department,sum(total) as total from $dlog as d + where datediff(dd,'$date',tDate) = 0 + and d.department > 300 and d.department <> 0 and d.register_no <> 20 + group by d.department order by d.department"; + if ($FROM_SAVED){ + $otherQ = "select sub_type,value from dailyJournal where + datediff(dd,tdate,'$date') = 0 and type = 'O'"; + } + $otherR = $sql->query($otherQ); + + $gcSales = 0; + $tcSales = 0; + $miscPO = 0; + $classA = 0; + $classB = 0; + $ar = 0; + $ITCorrections = 0; + $misc1 = 0; + $misc2 = 0; + $supplies = 0; + $class = 0; + $foundMoney = 0; + $totes = 0; + while ($w = $sql->fetch_row($otherR)){ + if ($w[0] == 902) $gcSales = $w[1]; + elseif ($w[0] == 900) $tcSales = $w[1]; + elseif ($w[0] == 604) $miscPO = $w[1]; + elseif ($w[0] == 992) $classA = $w[1]; + elseif ($w[0] == 991) $classB = $w[1]; + elseif ($w[0] == 990) $ar = $w[1]; + elseif ($w[0] == 800) $ITCorrections = $w[1]; + elseif ($w[0] == 801) $misc1 = $w[1]; + elseif ($w[0] == 802) $misc2 = $w[1]; + elseif ($w[0] == 600) $supplies = $w[1]; + elseif ($w[0] == 708) $class = $w[1]; + elseif ($w[0] == 700) $totes = $w[1]; + elseif ($w[0] == "FOUND") $foundMoney = $w[1]; + } + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + + $discountQ = "select m.memDesc, sum(d.total)*-1 as discount from + $dlog as d inner join custdata as c on c.cardno = d.card_no + inner join memtypeID as m on c.memType = m.memTypeID + where datediff(dd,'$date',d.tdate) = 0 + and d.upc = 'DISCOUNT' and c.personnum = 1 + group by m.memDesc,d.upc"; + if ($FROM_SAVED){ + $discountQ = "select sub_type,value from dailyJournal where + datediff(dd,tdate,'$date') = 0 and type = 'D'"; + } + $discountR = $sql->query($discountQ); + $discMem = 0; + $discStaffMem = 0; + $discStaffNonMem = 0; + while ($w = $sql->fetch_row($discountR)){ + if ($w[0] == "Member") $discMem = $w[1]; + elseif ($w[0] == "Staff Member") $discStaffMem = $w[1]; + elseif ($w[0] == "Staff NonMem") $discStaffNonMem = $w[1]; + } + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $taxQ = "select sum(total) as tax_collected from $dlog as d + where datediff(dd,'$date',tdate) = 0 + and d.upc = 'TAX' group by d.upc"; + if ($FROM_SAVED){ + $taxQ = "select value from dailyJournal where type = 'X' + and datediff(dd,tdate,'$date') = 0"; + } + $taxR = $sql->query($taxQ); + $taxW = $sql->fetch_row($taxR); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $miscCount = 0; + if ($FROM_SAVED){ + $miscQ = "select sub_type,value from dailyJournal where + datediff(dd,'$date',tdate) = 0 and type='M'"; + $miscR = $sql->query($miscQ); + while ($row = $sql->fetch_row($miscR)){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $miscCount++; + } + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
         InputJournal Entries
          DebitCreditAccount
        Deposit    
        Cash"; + $ret .= "   
        Check"; + $ret .= "   
        TOTAL Deposit   10120
        Credit Cards/EBT    
        EBT/Debit Approved"; + $ret .= "   
             
        MasterCard"; + $ret .= "   
        VISA"; + $ret .= "   
        Discover Discount"; + $ret .= "   
        Discover Outlet Total"; + $ret .= "   
        Total FAPS    
        Total All Credit Cards/EBT   10120
             
        RRR Coupon"; + $ret .= "  63380
        Coupons"; + $ret .= "  10740
        Gift Card as Tender"; + $ret .= "  21205
        Gift Cert as Tender"; + $ret .= "  21200
        InStore Charges"; + $ret .= "  10710
        InStore Coupons"; + $ret .= "  67710
             
        Tenders Total    
             
        SALES    
        pCode    
        {$pCodes[$i]}  {$pCodes[$i]}
        {$pCodes[$i]}  {$pCodes[$i]}
        {$pCodes[$i]}  {$pCodes[$i]}
        column TOTAL    
        Total Sales POS report$totalW[0]   
        Difference    
             
        Gift Card Sales"; + $ret .= "  21205
        Gift Certificate Sales"; + $ret .= "  21200
        Misc PO"; + $ret .= "   
             
        EQUITY    
        Class A Equity"; + $ret .= "  31100
        Class B Equity"; + $ret .= "  31110
        TOTAL Equity    
             
        AR Payments"; + $ret .= "  10710
             
        Discounts    
        Member"; + $ret .= "  66600
        Staff Member"; + $ret .= "  61170
        Staff NonMem"; + $ret .= "  61170
        MAD Coupon"; + $ret .= "  66600
        TOTAL Discounts    
        Sales Tax Collected"; + $ret .= "  21180
             
        Other Income    
        IT Corrections"; + $ret .= "   
        Misc. #1"; + $ret .= "  42231
        Misc. #2"; + $ret .= "  42232
        Supplies (Stamps sold)"; + $ret .= "  64410
        Class (public not staff)"; + $ret .= "  42225
        Found Money"; + $ret .= "  63350
        Totes"; + $ret .= "  63320
        MiscReceipt  
        Add MiscReceipt    
             
        SHEET SUBTOTAL    
        Over/Short   63350
             
        SHEET TOTAL    
        SHEET IMBALANCE    
        "; + + return $ret; +} + +function save($date,$type,$data){ + global $sql; + if ($type == 'M'){ + $delQ = "delete from dailyJournal where datediff(dd,tdate,'$date') = 0 + and type = 'M'"; + $sql->query($delQ); + } + if ($data == "") return; + $data_pairs = explode(";",$data); + foreach ($data_pairs as $dp){ + list($sub,$val) = explode(":",$dp); + $val = rtrim($val); + if(empty($val)) $val = 0; + + $checkQ = "select value from dailyJournal where datediff(dd,tdate,'$date') = 0 + and type='$type' and sub_type='$sub'"; + $checkR = $sql->query($checkQ); + if ($type=="M" || $sql->num_rows($checkR) == 0){ + $insQ = "insert dailyJournal values ('$date','$type','$sub',$val)"; + $insR = $sql->query($insQ); + } + else { + $upQ = "update dailyJournal set value=$val where + datediff(dd,tdate,'$date') = 0 and type='$type' and sub_type='$sub'"; + $upR = $sql->query($upQ); + } + } +} + +?> + + + + + + + +
        +Date: +
        +
        + +
        diff --git a/fannie/legacy/it/mas90/names.php b/fannie/legacy/it/mas90/names.php new file mode 100644 index 000000000..02e4dc24f --- /dev/null +++ b/fannie/legacy/it/mas90/names.php @@ -0,0 +1,49 @@ + 4999 and m.card_no <= 5499 then '22' + when m.card_no > 5499 and m.card_no <= 5999 then '99' + else '14' end as payTermCode + from meminfo as m left join custdata as c + on m.card_no=c.CardNo where c.personNum = 1 + and c.Type <> 'TERM'"; +$result = $sql->query($query); + +while ($row = $sql->fetch_row($result)){ + echo $row[0].$SEP; + echo $Q.$row[1].$Q.$SEP; + if (strstr($row[2],"\n") === False) + echo $Q.$row[2].$Q.$SEP.$Q.$Q.$SEP; + else{ + $pts = explode("\n",$row[2]); + echo $Q.$pts[0].$Q.$SEP; + echo $Q.$pts[1].$Q.$SEP; + } + echo $Q.$row[3].$Q.$SEP; + echo $Q.$row[4].$Q.$SEP; + echo $Q.$row[5].$Q.$SEP; + echo $Q.$row[6].$Q.$SEP; + echo $Q.$row[7].$Q.$SEP; + echo $row[8].$NL; +} + +?> diff --git a/fannie/legacy/it/mas90/stock.php b/fannie/legacy/it/mas90/stock.php new file mode 100644 index 000000000..de44e964d --- /dev/null +++ b/fannie/legacy/it/mas90/stock.php @@ -0,0 +1,23 @@ +datediff($sql->>now(),'tdate')." = 1 + group by card_no"; +$result = $sql->query($query); + +while($row = $sql->fetch_row($result)){ + echo "00-".str_pad($row[0],7,"0",STR_PAD_LEFT).$SEP; + echo $row[1].$NL; +} + +?> diff --git a/fannie/legacy/it/memEquityJune08.php b/fannie/legacy/it/memEquityJune08.php new file mode 100644 index 000000000..5c2298fc6 --- /dev/null +++ b/fannie/legacy/it/memEquityJune08.php @@ -0,0 +1,28 @@ + 'TERM' and c.cardno <> 11 + group by c.cardno,c.firstname,c.lastname,n.payments + having n.payments - sum(case when datediff(dd,tdate,'2008-06-30') < 0 + then stockPurchase else 0 end) <> 0 + order by convert(int,c.cardno)"; + +select_to_table2($q,array(),1,'#ffffff',120,0,0,array('Mem#','First','Last','Equity')); + + +?> diff --git a/fannie/legacy/it/minimap/index.php b/fannie/legacy/it/minimap/index.php new file mode 100644 index 000000000..4c4079df5 --- /dev/null +++ b/fannie/legacy/it/minimap/index.php @@ -0,0 +1,228 @@ +"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        User
        Password
        "; + echo ""; + echo ""; + } + else { + $user = $_REQUEST['username']; + $pass = $_REQUEST['pass']; + $mb = imap_open($server,$user,$pass); + if (!$mb){ + echo "Login failed. "; + echo "Retry"; + } + else { + $block = enc($user,$pass,$iv); + setcookie("minimap-user",$user); + setcookie("minimap-session",$block); + header("Location: index.php"); + } + } + exit; +} + +$user = $_COOKIE["minimap-user"]; +$pass = dec($user,$_COOKIE['minimap-session'],$iv); +$mb = imap_open($server,$user,$pass); + +if (isset($_REQUEST['attach'])){ + $mb = imap_open($server.$_REQUEST['mbox'],$user,$pass); + stream_attachment($mb,$_REQUEST['num'],$_REQUEST['sub'],base64_decode($_REQUEST['fname'])); + exit; +} + +$output = " + +"; + +if (isset($_REQUEST['send'])){ + $to = $_REQUEST['to_line']; + $cc = $_REQUEST['cc_line']; + $from = $user."@".$domain; + $subject = $_REQUEST['subject']; + $body = $_REQUEST['body']; + + $headers = "From: ".$from."\r\n"; + if (!empty($cc)) + $headers .= "Cc: ".$cc."\r\n"; + if (strstr(strtolower($body),"") !== False){ + $headers = 'MIME-Version: 1.0' . "\r\n"; + $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; + } + + mail($to,$subject,$body,$headers); + + $output .= "
        Message sent
        "; + $_REQUEST['folder'] = $_REQUEST['mbox']; +} + +if (isset($_REQUEST['folder'])){ + $output .= "Back
        "; + + $mb = imap_open($server.$_REQUEST['folder'],$user,$pass); + $n = imap_num_msg($mb); + imap_headers($mb); + $output .= ""; + for($i=$n; $i > 0; $i--){ + $h = imap_header($mb,$i); + $output .= "Unseen=='U' || $h->Recent=='N') + $output .= " class=\"unread\""; + $output .= ">"; + $output .= ""; + $output .= ""; + $output .= sprintf("", + $_REQUEST['folder'],$i,$h->subject); + $output .= ""; + } + $output .= "
        ".date("n/d/y g:ia",$h->udate)."".$h->fromaddress."%s
        "; +} +else if (isset($_REQUEST['msg'])){ + $mb = imap_open($server.$_REQUEST['mbox'],$user,$pass); + + $msgBody = get_body($mb,$_REQUEST['msg']); + + $h = imap_headerinfo($mb,$_REQUEST['msg']); + + $output .= "Back"; + $output .= "    "; + $output .= "Reply"; + $output .= "    "; + $output .= "ReplyAll"; + $output .= "    "; + $output .= "Trash"; + $output .= "
        "; + + $output .= "Date: ".date("n/d/y g:ia",$h->udate); + $output .= "
        "; + $output .= "From: ".$h->fromaddress; + $output .= "
        "; + $output .= "To: ".$h->toaddress; + $output .= "
        "; + $output .= "CC: ".$h->ccaddress; + $output .= "
        "; + $output .= $msgBody; + + $attachments = get_attachments($mb,$_REQUEST['msg']); + foreach($attachments as $a){ + $output .= "
        "; + $output .= sprintf("%s
        ", + $_REQUEST['msg'],$a['num'],$_REQUEST['mbox'], + base64_encode(!empty($a['name'])?$a['name']:$a['filename']), + (!empty($a['name'])?$a['name']:$a['filename'])); + $output .= $a['mime']." (".better_size($a['size']).")"; + } +} +else if (isset($_REQUEST['mode'])){ + $mb = imap_open($server.$_REQUEST['mbox'],$user,$pass); + if ($_REQUEST['mode'] == 'trash'){ + imap_mail_move($mb,$_REQUEST['num'],$trash_folder); + imap_expunge($mb); + header("Location: index.php?folder=".$_REQUEST['mbox']); + exit; + } + + $h = imap_headerinfo($mb,$_REQUEST['num']); + + $to = ""; + $cc = ""; + if (isset($h->reply_to)){ + foreach($h->reply_to as $r) + $to .= $r->mailbox."@".$r->host.", "; + } + if ($_REQUEST['mode'] == "replyall"){ + foreach($h->to as $t){ + $addr = $t->mailbox."@".$t->host; + // don't include yourself + if (strtolower($addr)==strtolower($user."@".$domain)) continue; + if(strstr($to,$addr) === False) + $to .= $addr.", "; + } + foreach($h->cc as $c){ + $addr = $c->mailbox."@".$c->host; + // don't include yourself + if (strtolower($addr)==strtolower($user."@".$domain)) continue; + if(strstr($to,$addr) === False && strstr($cc,$addr) === False) + $cc .= $addr.", "; + } + } + $to = substr($to,0,strlen($to)-2); + $cc = substr($cc,0,strlen($cc)-2); + + $subject = $h->subject; + if (substr(strtolower($subject),0,3) != "re:") + $subject = "RE: ".$subject; + + $output .= "
        "; + + $output .= "To: "; + $output .= sprintf("",$to); + $output .= "
        "; + + $output .= "CC: "; + $output .= sprintf("",$cc); + $output .= "
        "; + + $output .= "Subject: "; + $output .= sprintf("",$subject); + $output .= "
        "; + + $msgBody = get_body($mb,$_REQUEST['num'],False); + if (strstr(strtolower($msgBody),"") !== False) + $msgBody .= "\n\n\n
        "; // ultra lazy, no parsing + else { + $msgBody = "\n\n\n>".str_replace("\n","\n>",$msgBody); + } + $output .= ""; + + $output .= "
        "; + $output .= ""; + $output .= sprintf("",$_REQUEST['mbox']); + $output .= "
        "; +} +else { + $folders = imap_getmailboxes($mb,$server,"*"); + + $output .= "INBOX
        "; + foreach($folders as $f){ + $name = substr($f->name,strlen($server)); + if ($name == "INBOX") continue; + $output .= sprintf("%s
        ", + $name,$name); + } +} + +$output .= "
        "; +$output .= "Logout"; + +echo $output; +?> diff --git a/fannie/legacy/it/minimap/lib.php b/fannie/legacy/it/minimap/lib.php new file mode 100644 index 000000000..5ff5bca53 --- /dev/null +++ b/fannie/legacy/it/minimap/lib.php @@ -0,0 +1,152 @@ +",$dataTxt); + return $dataTxt; +} + +function get_mime_type(&$structure) { + $primary_mime_type = array("TEXT", "MULTIPART","MESSAGE", "APPLICATION", "AUDIO","IMAGE", "VIDEO", "OTHER"); + if($structure->subtype) { + return $primary_mime_type[(int) $structure->type] . '/' .$structure->subtype; + } + return "TEXT/PLAIN"; +} + +function get_part($stream, $msg_number, $mime_type, $structure = false,$part_number = false) { + + if(!$structure) { + $structure = imap_fetchstructure($stream, $msg_number); + } + if($structure) { + if($mime_type == get_mime_type($structure)) { + if(!$part_number) { + $part_number = "1"; + } + $text = imap_fetchbody($stream, $msg_number, $part_number); + if($structure->encoding == 3) { + return imap_base64($text); + } else if($structure->encoding == 4) { + return imap_qprint($text); + } else { + return $text; + } + } + + if($structure->type == 1) /* multipart */ { + while(list($index, $sub_structure) = each($structure->parts)) { + if($part_number) { + $prefix = $part_number . '.'; + } + $data = get_part($stream, $msg_number, $mime_type, $sub_structure,$prefix . ($index + 1)); + if($data) { + return $data; + } + } // END OF WHILE + } // END OF MULTIPART + } // END OF STRUTURE + return false; +} // END OF FUNCTION + +$MIME_PRIMARY_TYPE = array( + 0 => "text", + 1 => "multipart", + 2 => "message", + 3 => "application", + 4 => "audio", + 5 => "image", + 6 => "video", + 7 => "other" +); + +function get_attachments($imap, $msg){ + global $MIME_PRIMARY_TYPE; + $ret = array(); + $struct = imap_fetchstructure($imap,$msg); + $pos = 1; + foreach($struct->parts as $p){ + $obj = array('filename'=>'','name'=>'','size'=>$p->bytes,'num'=>$pos); + + if ($p->ifdparameters){ + foreach($p->dparameters as $o){ + if (strtolower($o->attribute)=='filename'){ + $obj['filename']=$o->value; + break; + } + } + } + + if ($p->ifparameters){ + foreach($p->parameters as $o){ + if (strtolower($o->attribute)=='name'){ + $obj['name']=$o->value; + break; + } + } + } + + $obj["mime"] = $MIME_PRIMARY_TYPE[$p->type]."/".strtolower($p->subtype); + + if (!empty($obj['filename']) || !empty($obj['name'])) + array_push($ret,$obj); + + $pos++; + } + + return $ret; +} + +function better_size($bytes){ + if ($bytes < 1024){ + return $bytes."B"; + } + if ($bytes < (1024*1024)){ + return (round($bytes/1024.0,1))."KB"; + } + return (round($bytes/(1024.0*1024.0),1))."MB"; +} + +function stream_attachment($imap,$msg,$num,$name){ + global $MIME_PRIMARY_TYPE; + + $struct = imap_fetchstructure($imap,$msg); + $part = $struct->parts[$num-1]; + $mime = $MIME_PRIMARY_TYPE[$part->type]."/".strtolower($part->subtype); + + $bytes = imap_fetchbody($imap,$msg,$num); + if ($part->encoding == 3) + $bytes = base64_decode($bytes); + elseif($part->encoding == 4) + $bytes = imap_qprint($bytes); + + header("Content-type: ".$mime); + if ($part->type == 3) + header("Content-Disposition: attachment; filename=".$name); + echo $bytes; +} + +?> diff --git a/fannie/legacy/it/moff/2009/index.php b/fannie/legacy/it/moff/2009/index.php new file mode 100644 index 000000000..00ade06f5 --- /dev/null +++ b/fannie/legacy/it/moff/2009/index.php @@ -0,0 +1,60 @@ +Save as Excel

        "; +} + +?> +

        Likecoded sales

        + + +query($query1); +while($row = $sql->fetch_row($result)){ + printf("", + $row[0],$row[1],$row[2],$row[3]); +} +?> +
        LCDescQty$
        %s%s%.2f%.2f
        +

        Non-likecoded sales

        + + +query($query2); +while($row = $sql->fetch_row($result)){ + printf("", + $row[0],$row[1],$row[2],$row[3]); +} +?> +
        LCDescQty$
        %s%s%.2f%.2f
        diff --git a/fannie/legacy/it/moff/2010/index.php b/fannie/legacy/it/moff/2010/index.php new file mode 100755 index 000000000..f93d8bd21 --- /dev/null +++ b/fannie/legacy/it/moff/2010/index.php @@ -0,0 +1,67 @@ + + + + + MOFF Results + + + +Excel

        "; + } + + if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."src/SQLManager.php"); + include('../../db.php'); + + $date = '2010-08-07'; + $reg = 40; + require($FANNIE_ROOT.'src/select_dlog.php'); + $dlog = select_dlog($date); + $dlog = str_replace("dlog","transarchive",$dlog); + $dlog = "trans_archive.dbo.transArchive201008"; + + $query = "SELECT DISTINCT t.upc, min(t.description), SUM(t.quantity),SUM(t.total),d.dept_name,s.salesCode,u.likeCode + FROM $dlog as t + LEFT JOIN departments as d on d.dept_no = t.department + LEFT JOIN deptSalesCodes as s on d.dept_no=s.dept_ID + LEFT JOIN upcLike as u on t.upc=u.upc + WHERE t.trans_type in ('I','D') and t.upc <> 'DISCOUNT' and + datediff(dd,'$date',t.datetime) = 0 AND t.register_no = $reg + and trans_Status <> 'X' + GROUP BY t.upc, d.dept_name,s.salesCode,u.likeCode + ORDER BY t.upc"; + + $result = $sql->query($query); + + echo "\n"; //create table + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n";//create table header + $qtysum = 0; + $salesum = 0; + while ($myrow = $sql->fetch_array($result)){ + printf("\n",$myrow[0], $myrow[1],$myrow[2], $myrow[3], $myrow[4], $myrow[5],$myrow[6]); + $qtysum += $myrow[2]; + $salesum += $myrow[3]; + } + echo ""; + echo "
        UPCDescriptionQtySalesDepartmentpCodeLikeCode
        %s%s%.2f%s%s%s%d
        Totals $qtysum$salesum
        "; + +?> + + diff --git a/fannie/legacy/it/moff/index.php b/fannie/legacy/it/moff/index.php new file mode 100755 index 000000000..8a5f43b15 --- /dev/null +++ b/fannie/legacy/it/moff/index.php @@ -0,0 +1,70 @@ + + + + + MOFF Results + + + +Excel

        "; + } + + if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."src/SQLManager.php"); + include('../../db.php'); + + $date = '2011-08-06'; + $reg = "21,22"; + require($FANNIE_ROOT.'src/select_dlog.php'); + $dlog = select_dtrans($date); + //$dlog = str_replace("dlog","transarchive",$dlog); + //$dlog = "trans_archive.dbo.transArchive201008"; + + $query = "SELECT DISTINCT t.upc, min(t.description), SUM(t.quantity),SUM(t.total),d.dept_name,s.salesCode,u.likeCode + FROM $dlog as t + LEFT JOIN departments as d on d.dept_no = t.department + LEFT JOIN deptSalesCodes as s on d.dept_no=s.dept_ID + LEFT JOIN upcLike as u on t.upc=u.upc + WHERE t.trans_type in ('I','D') and t.upc <> 'DISCOUNT' and + datediff(dd,'$date',t.datetime) = 0 AND t.register_no + in ( $reg ) + and trans_Status <> 'X' + and emp_no <> 9999 + GROUP BY t.upc, d.dept_name,s.salesCode,u.likeCode + ORDER BY t.upc"; + + //echo $query; + $result = $sql->query($query); + + echo "\n"; //create table + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n";//create table header + $qtysum = 0; + $salesum = 0; + while ($myrow = $sql->fetch_array($result)){ + printf("\n",$myrow[0], $myrow[1],$myrow[2], $myrow[3], $myrow[4], $myrow[5],$myrow[6]); + $qtysum += $myrow[2]; + $salesum += $myrow[3]; + } + echo ""; + echo "
        UPCDescriptionQtySalesDepartmentpCodeLikeCode
        %s%s%.2f%s%s%s%d
        Totals $qtysum$salesum
        "; + +?> + + diff --git a/fannie/legacy/it/newbatch/audit.php b/fannie/legacy/it/newbatch/audit.php new file mode 100644 index 000000000..e941e0519 --- /dev/null +++ b/fannie/legacy/it/newbatch/audit.php @@ -0,0 +1,144 @@ +"andy@wholefoods.coop", + 1=>"jim@wholefoods.coop, lisa@wholefoods.coop", + 2=>"jesse@wholefoods.coop, lisa@wholefoods.coop", + 3=>"debbie@wholefoods.coop, aelliott@wholefoods.coop, justin@wholefoods.coop", + 4=>"joeu@wholefoods.coop, lisa@wholefoods.coop", + 5=>"jillhall@wholefoods.coop, lisa@wholefoods.coop", + 6=>"michael@wholefoods.coop, alex@wholefoods.coop", + 7=>"shannon@wholefoods.coop", + 8=>"jesse@wholefoods.coop, lisa@wholefoods.coop", + 9=>"lisa@wholefoods.coop" +); + +function auditPriceChange($sql,$uid,$upc,$price,$batchID){ + global $tos; + + $query = "select p.description,b.batchName,d.superID from products as p, batches as b, + MasterSuperDepts as d where p.upc = '$upc' and b.batchID='$batchID' + and p.department=d.dept_ID"; + $result = $sql->query($query); + $row = $sql->fetch_row($result); + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been added to the batch\n"; + $message .= "Sale Price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://key.wfco-op.store/it/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditPriceChangeLC($sql,$uid,$upc,$price,$batchID){ + global $tos; + + $query = "select l.likeCodeDesc,b.batchName from likecodes as l, batches as b + where b.batchID=$batchID and l.likecode=".substr($upc,2); + $result = $sql->query($query); + $row = $sql->fetch_row($result); + $deptQ = "select d.superID from products as p left join + upclike as u on p.upc=u.upc left join MasterSuperDepts as d on p.department=d.dept_ID + where u.likecode=".substr($upc,2)." and d.superID is not null + group by d.superID order by count(*) desc"; + $deptR = $sql->query($deptQ); + $dept_sub = array_pop($sql->fetch_row($deptR)); + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Likecode $upc ($row[0]) has been added to the batch\n"; + $message .= "Sale price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://key/it/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditSavePrice($sql,$uid,$upc,$price,$batchID){ + global $tos; + + $query = "select p.description,b.batchName,d.superID from products as p, batches as b, + MasterSuperDepts as d where p.upc = '$upc' and b.batchID='$batchID' + and p.department=d.dept_ID"; + if (substr($upc,0,2) == "LC"){ + $query = "select l.likeCodeDesc,b.batchName from likecodes as l, batches as b + where b.batchID=$batchID and l.likecode=".substr($upc,2); + } + $result = $sql->query($query); + $row = $sql->fetch_row($result); + $dept_sub = 0; + if (substr($upc,0,2) == "LC"){ + $deptQ = "select d.superID,count(*) from products as p left join + upclike as u on p.upc=u.upc left join MasterSuperDepts as d on p.department=d.dept_ID + where u.likecode=".substr($upc,2)." and d.superID is not null + group by d.superID order by count(*) desc"; + $deptR = $sql->query($deptQ); + $dept_sub = array_pop($sql->fetch_row($deptR)); + } + else + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been re-priced\n"; + $message .= "Sale Price: $".$price."\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://key/it/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +function auditDelete($sql,$uid,$upc,$batchID){ + global $tos; + + $query = "select p.description,b.batchName,d.superID from products as p, batches as b, + MasterSuperDepts as d where p.upc = '$upc' and b.batchID='$batchID' + and p.department=d.dept_ID"; + if (substr($upc,0,2) == "LC"){ + $query = "select l.likeCodeDesc,b.batchName from likecodes as l, batches as b + where b.batchID=$batchID and l.likecode=".substr($upc,2); + } + $result = $sql->query($query); + $row = $sql->fetch_row($result); + $dept_sub = 0; + if (substr($upc,0,2) == "LC"){ + $deptQ = "select d.superID from products as p left join + upclike as u on p.upc=u.upc left join MasterSuperDepts as d on p.department=d.dept_ID + where u.likecode=".substr($upc,2)." and d.superID is not null + group by d.superID order by count(*) desc"; + $deptR = $sql->query($deptQ); + $dept_sub = array_pop($sql->fetch_row($deptR)); + } + else + $dept_sub = $row[2]; + + $subject = "Batch Update notification: ".$row[1]; + $message = "Batch $row[1] has been changed\n"; + $message .= "Item $upc ($row[0]) has been deleted from the batch\n"; + $message .= "\n"; + $message .= "Go to the batch page:\n"; + $message .= "http://key/it/newbatch/\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} +?> diff --git a/fannie/legacy/it/newbatch/barcodenew.php b/fannie/legacy/it/newbatch/barcodenew.php new file mode 100755 index 000000000..33d300550 --- /dev/null +++ b/fannie/legacy/it/newbatch/barcodenew.php @@ -0,0 +1,346 @@ +"; + echo "Select batch(es*) to be printed:
        "; + $fetchQ = "select b.batchID,b.batchName + from batches as b left join + batchBarcodes as c on b.batchID = c.batchID + where c.upc is not null + group by b.batchID,b.batchName + order by b.batchID desc"; + $fetchR = $sql->query($fetchQ); + echo "
        "; + echo " "; + echo " Narrow"; + echo ""; + echo "Back to batch list

        "; + echo "* Hold the apple key while clicking to select multiple batches "; + echo "(or the control key if you're not on a Mac)"; +} +else { + $batchIDList = ''; + foreach($_GET['batchID'] as $x) + $batchIDList .= $x.','; + $batchIDList = substr($batchIDList,0,strlen($batchIDList)-1); + $narrow = (isset($_GET['narrow']))?True:False; + + define('FPDF_FONTPATH','font/'); + require($FANNIE_ROOT.'src/fpdf/fpdf.php'); + + /****Credit for the majority of what is below for barcode generation + has to go to Olivier for posting the script on the FPDF.org scripts + webpage.****/ + + class PDF extends FPDF + { + function EAN13($x,$y,$barcode,$h=16,$w=.35) + { + $this->Barcode($x,$y,$barcode,$h,$w,13); + } + + function UPC_A($x,$y,$barcode,$h=16,$w=.35) + { + $this->Barcode($x,$y,$barcode,$h,$w,12); + } + + function GetCheckDigit($barcode) + { + if (strlen($barcode) < 12) + $barcode = str_pad($barcode,12,"0",STR_PAD_LEFT); + //Compute the check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + $r=$sum%10; + if($r>0) + $r=10-$r; + return $r; + } + + function TestCheckDigit($barcode) + { + //Test validity of check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + return ($sum+$barcode{12})%10==0; + } + + function Barcode($x,$y,$barcode,$h,$w,$len) + { + //Padding + $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT); + if($len==12) + $barcode='0'.$barcode; + //Add or control the check digit + if(strlen($barcode)==12) + $barcode.=$this->GetCheckDigit($barcode); + /* + elseif(!$this->TestCheckDigit($barcode)){ + $this->Error('This is an Incorrect check digit' . $barcode); + //echo $x.$y.$barcode."\n"; + }*/ + //Convert digits to bars + $codes=array( + 'A'=>array( + '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011', + '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'), + 'B'=>array( + '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101', + '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'), + 'C'=>array( + '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100', + '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100') + ); + $parities=array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $code='101'; + $p=$parities[$barcode{0}]; + for($i=1;$i<=6;$i++) + $code.=$codes[$p[$i-1]][$barcode{$i}]; + $code.='01010'; + for($i=7;$i<=12;$i++) + $code.=$codes['C'][$barcode{$i}]; + $code.='101'; + //Draw bars + for($i=0;$iRect($x+$i*$w,$y,$w,$h,'F'); + } + //Print text uder barcode + $this->SetFont('Arial','',9); + if (isset($_GET['narrow'])) + $this->Text($x,$y+$h+11/$this->k,substr($barcode,-$len)); + else + $this->Text($x+6,$y+$h+11/$this->k,substr($barcode,-$len)); + } + } + + $query = "SELECT upc,description,normal_price,brand,sku,size,units,vendor FROM batchBarcodes WHERE batchID in ($batchIDList) and description <> '' order by batchID"; + + $result = $sql->query($query); + + if (!$narrow){ + $pdf=new PDF('P','mm','Letter'); //start new instance of PDF + $pdf->Open(); //open new PDF Document + $pdf->SetTopMargin(20); //Set top margin of the page + $pdf->SetLeftMargin(4); //Set left margin of the page + $pdf->SetRightMargin(0); //Set the right margin of the page + $pdf->AddPage(); //Add a page + + //Set increment counters for rows + $i = 9; //x location of barcode + $j = 33; //y locaton of barcode + $l = 28; //y location of size and price on label + $k = 25; //x location of date and price on label + $m = 0; //number of labels created + $n = 20; //y location of description for label + $r = 24; //y location of brand name for label + $p = 5; //x location fields on label + $t = 32; //y location of SKU and vendor info + $u = 20; //x locaiton of vendor info for label + $down = 31; + + $diff = 0; + $j -= $diff; + $l -= $diff; + $n -= $diff; + $r -= $diff; + $t -= $diff; + + //cycle through result array of query + while($row = $sql->fetch_array($result)){ + //If $m == 32 add a new page and reset all counters.. + if($m == 32){ + $pdf->AddPage(); + $i = 9; + $j = 33; + $l = 28; + $k = 25; + $m = 0; + $n = 20; + $p = 5; + $r = 24; + $t = 32; + $u = 20; + $diff = 0; + $j -= $diff; + $l -= $diff; + $n -= $diff; + $r -= $diff; + $t -= $diff; + } + + //If $i > 175, start a new line of labels + if($i > 175){ + $i = 9; + $j = $j + $down; + $k = 25; + $l = $l + $down; + $n = $n + $down; + $r = $r + $down; + $p = 5; + $u = 20; + $t = $t + $down; + } + $price = $row['normal_price']; + $desc = strtoupper(substr($row['description'],0,27)); + $brand = ucwords(strtolower(substr($row['brand'],0,13))); + $pak = $row['units']; + $size = $row['units'] . "-" . $row['size']; + $sku = $row['sku']; + $upc = ltrim($row['upc'],0); + $check = $pdf->GetCheckDigit($upc); + $tagdate = date('m/d/y'); + $vendor = substr($row['vendor'],0,7); + + //Start laying out a label + $pdf->SetFont('Arial','',8); //Set the font + $pdf->TEXT($p,$n,$desc); //Add description to label + $pdf->TEXT($p,$r,$brand); //Add brand name to label + $pdf->TEXT($p,$l,$size); //Add size to label + $pdf->TEXT($k+9,$t,$tagdate); //Add date to lable + $pdf->SetFont('Arial','',10); //change font size + $pdf->TEXT($p,$t,$sku); //add UNFI SKU + $pdf->TEXT($u-2,$t,$vendor); //add vendor + $pdf->SetFont('Arial','B',24); //change font for price + $pdf->TEXT($k,$l,$price); //add price + + $newUPC = $upc . $check; //add check digit to upc + $pdf->UPC_A($i,$j,$upc,7); //generate barcode and place on label + + //increment counters + $i =$i+ 53; + $k = $k + 53; + $m = $m + 1; + $p = $p + 53; + $u = $u + 53; + } + + $pdf->Output(); //Output PDF file to screen. + } + else { + $pdf=new PDF('P','mm','Letter'); //start new instance of PDF + $pdf->Open(); //open new PDF Document + $pdf->SetTopMargin(40); //Set top margin of the page + $pdf->SetLeftMargin(4); //Set left margin of the page + $pdf->SetRightMargin(0); //Set the right margin of the page + $pdf->AddPage(); //Add a page + + //Set increment counters for rows + $i = 5; //x location of barcode + $j = 33; //y locaton of barcode + $l = 32; //y location of size and price on label + $k = 5; //x location of date and price on label + $m = 0; //number of labels created + $n = 20; //y location of description for label + $r = 26; //y location of date for label + $p = 5; //x location fields on label + $t = 30; //y location of SKU and vendor info + $u = 20; //x locaiton of vendor info for label + $down = 31.0; + + //cycle through result array of query + while($row = $sql->fetch_array($result)){ + //If $m == 32 add a new page and reset all counters.. + if($m == 32){ + $pdf->AddPage(); + $i = 5; + $j = 33; + $l = 32; + $k = 5; + $m = 0; + $n = 20; + $p = 5; + $r = 26; + $t = 30; + $u = 20; + } + + //If $i > 175, start a new line of labels + if($i > 175){ + $i = 5; + $j = $j + $down; + $k = 5; + $l = $l + $down; + $n = $n + $down; + $r = $r + $down; + $p = 5; + $u = 20; + $t = $t + $down; + } + $price = $row['normal_price']; + $desc = strtoupper(substr($row['description'],0,27)); + $brand = ucwords(strtolower(substr($row['brand'],0,13))); + $pak = $row['units']; + $size = $row['units'] . "-" . $row['size']; + $sku = $row['sku']; + $upc = ltrim($row['upc'],0); + $check = $pdf->GetCheckDigit($upc); + $tagdate = date('m/d/y'); + $vendor = substr($row['vendor'],0,7); + + //Start laying out a label + $pdf->SetFont('Arial','',8); //Set the font + + $words = split("[ ,-]",$desc); + $limit = 13; + $lineheight = 0; + $curStr = ""; + foreach($words as $w){ + if (strlen($curStr." ".$w) <= $limit) + $curStr .= " ".$w; + else { + $pdf->TEXT($p,$n+$lineheight,$curStr); + $curStr = ""; + $lineheight += 3; + } + } + $pdf->TEXT($p,$n+$lineheight,$curStr); + + //$pdf->TEXT($p,$n,$desc); //Add description to label + + $pdf->TEXT($p,$r,$tagdate); //Add date to lable + $pdf->TEXT($p+12,$r,$size); //Add size to label + $pdf->SetFont('Arial','B',18); //change font for price + $pdf->TEXT($k,$l,$price); //add price + + $newUPC = $upc . $check; //add check digit to upc + $pdf->UPC_A($i,$j,$upc,7,.23); //generate barcode and place on label + + //increment counters + $i =$i+ 52.7; + $k = $k + 52.7; + $m = $m + 1; + $p = $p + 52.7; + $u = $u + 52.7; + } + + $pdf->Output(); //Output PDF file to screen. + } +} +?> diff --git a/fannie/legacy/it/newbatch/batchReport.php b/fannie/legacy/it/newbatch/batchReport.php new file mode 100644 index 000000000..ed0b3c026 --- /dev/null +++ b/fannie/legacy/it/newbatch/batchReport.php @@ -0,0 +1,101 @@ +query($batchInfoQ); + + +if(isset($_GET['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="batchSales.xls"'); + +}else{ +?> + + +Sales Batch History + + + + +fetch_array($batchInfoR)){ + $bName = $batchInfoW['batchName']; + if(isset($_GET['startDate'])){ + $bStart = $_GET['startDate']." 00:00:00"; + }else{ + $bStart = $batchInfoW['startDate']; + } + if(isset($_GET['endDate'])){ + $bEnd = $_GET['endDate']." 23:59:59"; + }else{ + $bEnd = $batchInfoW['endDate']; + } + + echo "

        $bName

        "; + echo "

        From: $bStart to: $bEnd

        "; + //echo "

        Click here to change date range"; + //echo " Reset dates

        "; +} + +$dlog = select_dlog($bStart); +//echo $dlog; + + +$bnStart = strtotime($bStart); +$bnStart = date('Y-m-j',$bnStart); + +$bnEnd = strtotime($bEnd); +$bnEnd = date('Y-m-j',$bnEnd); + +if(!isset($_GET['excel'])){ + echo "

        Click here for Excel version

        "; +} + +$salesBatchQ ="select d.upc, b.description, sum(d.total) as sales, sum(d.quantity) as quantity + FROM $dlog as d left join batchMergeTable as b + ON d.upc = b.upc + WHERE d.tdate BETWEEN '$bStart' and '$bEnd' + AND b.batchID = $batchID + GROUP BY d.upc, b.description"; +//echo $salesBatchQ; + +$salesBatchR= $sql->query($salesBatchQ); + +$i = 0; + +echo ""; + $i++; +} +?> + + diff --git a/fannie/legacy/it/newbatch/batchmobile-large.png b/fannie/legacy/it/newbatch/batchmobile-large.png new file mode 100644 index 000000000..61d965018 Binary files /dev/null and b/fannie/legacy/it/newbatch/batchmobile-large.png differ diff --git a/fannie/legacy/it/newbatch/batchmobile-small.png b/fannie/legacy/it/newbatch/batchmobile-small.png new file mode 100644 index 000000000..42d4bf282 Binary files /dev/null and b/fannie/legacy/it/newbatch/batchmobile-small.png differ diff --git a/fannie/legacy/it/newbatch/forceBatch.php b/fannie/legacy/it/newbatch/forceBatch.php new file mode 100644 index 000000000..2a77c9f50 --- /dev/null +++ b/fannie/legacy/it/newbatch/forceBatch.php @@ -0,0 +1,189 @@ +query($batchInfoQ); + $batchInfoW = $sql->fetch_array($batchInfoR); + + $forceQ = ""; + $forceLCQ = ""; + $forceMMQ = ""; + if ($batchInfoW['discountType'] != 0){ + + $forceQ="UPDATE products AS p + INNER JOIN batchList AS l + ON p.upc=l.upc + INNER JOIN batches AS b + ON l.batchID=b.batchID + SET p.start_date = b.startDate, + p.end_date=b.endDate, + p.special_price=l.salePrice, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialpricemethod=l.pricemethod, + p.specialquantity=l.quantity, + p.discounttype=b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN concat('b',convert(l.batchID,char)) + ELSE p.mixmatchcode + END + WHERE l.upc not like 'LC%' + and l.batchID = $batchID"; + + $forceLCQ = "UPDATE products AS p + INNER JOIN likeCodeView AS v + ON v.upc=p.upc + INNER JOIN batchList as l + ON l.upc=concat('LC',convert(v.likecode,char)) + INNER JOIN batches AS b + ON b.batchID=l.batchID + set p.special_price = l.salePrice, + p.end_date = b.endDate,p.start_date=b.startDate, + p.specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + p.specialpricemethod=l.pricemethod, + p.specialquantity=l.quantity, + p.discounttype = b.discounttype, + p.mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(l.batchID,char) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(-1*l.batchID,char) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN concat('b',convert(l.batchID,char)) + ELSE p.mixmatchcode + END + where l.batchID=$batchID"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $forceQ="UPDATE products + SET start_date = b.startDate, + end_date=b.endDate, + special_price=l.salePrice, + specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + specialpricemethod=l.pricemethod, + specialquantity=l.quantity, + discounttype=b.discounttype, + mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(varchar,l.batchID) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(varchar,-1*l.batchID) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN 'b'+convert(varchar,l.batchID) + ELSE p.mixmatchcode + END + FROM products as p, + batches as b, + batchList as l + WHERE l.upc = p.upc + and l.upc not like 'LC%' + and b.batchID = l.batchID + and b.batchID = $batchID"; + + $forceLCQ = "update products set special_price = l.salePrice, + end_date = b.endDate,start_date=b.startDate, + discounttype = b.discounttype, + specialpricemethod=l.pricemethod, + specialquantity=l.quantity, + specialgroupprice=CASE WHEN l.salePrice < 0 THEN -1*l.salePrice ELSE l.salePrice END, + mixmatchcode = CASE + WHEN l.pricemethod IN (3,4) AND l.salePrice >= 0 THEN convert(varchar,l.batchID) + WHEN l.pricemethod IN (3,4) AND l.salePrice < 0 THEN convert(varchar,-1*l.batchID) + WHEN l.pricemethod = 0 AND l.quantity > 0 THEN 'b'+convert(varchar,l.batchID) + ELSE p.mixmatchcode + END + from products as p left join + likeCodeView as v on v.upc=p.upc left join + batchList as l on l.upc='LC'+convert(varchar,v.likecode) + left join batches as b on b.batchID = l.batchID + where b.batchID=$batchID"; + } + } + else{ + $forceQ = "UPDATE products AS p + INNER JOIN batchList AS l + ON l.upc=p.upc + SET p.normal_price = l.salePrice, + p.modified = now() + WHERE l.upc not like 'LC%' + AND l.batchID = $batchID"; + + $forceLCQ = "UPDATE products AS p + INNER JOIN upcLike AS v + ON v.upc=p.upc INNER JOIN + batchList as b on b.upc=concat('LC',convert(v.likecode,char)) + set p.normal_price = b.salePrice, + p.modified=now() + where b.batchID=$batchID"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $forceQ = "UPDATE products + SET normal_price = l.salePrice, + modified = getdate() + FROM products as p, + batches as b, + batchList as l + WHERE l.upc = p.upc + AND l.upc not like 'LC%' + AND b.batchID = l.batchID + AND b.batchID = $batchID"; + + $forceLCQ = "update products set normal_price = b.salePrice, + modified=getdate() + from products as p left join + upcLike as v on v.upc=p.upc left join + batchList as b on b.upc='LC'+convert(varchar,v.likecode) + where b.batchID=$batchID"; + } + } + + $forceR = $sql->query($forceQ); + $forceLCR = $sql->query($forceLCQ); + + if (!function_exists("updateProductAllLanes")) include($FANNIE_ROOT.'legacy/queries/laneUpdates.php'); + + $q = "SELECT upc FROM batchList WHERE batchID=".$batchID; + $r = $sql->query($q); + while($w = $sql->fetch_row($r)){ + $upcs = array($w['upc']); + if (substr($w['upc'],0,2)=='LC'){ + $upcs = array(); + $lc = substr($w['upc'],2); + $q2 = "SELECT upc FROM upcLike WHERE likeCode=".$lc; + $r2 = $sql->query($q2); + while($w2 = $sql->fetch_row($r2)) + $upcs[] = $w2['upc']; + } + foreach($upcs as $u){ + updateProductAllLanes($u); + } + } +} + +?> diff --git a/fannie/legacy/it/newbatch/fork.php b/fannie/legacy/it/newbatch/fork.php new file mode 120000 index 000000000..59ccd0d5b --- /dev/null +++ b/fannie/legacy/it/newbatch/fork.php @@ -0,0 +1 @@ +../../queries/fork.php \ No newline at end of file diff --git a/fannie/legacy/it/newbatch/index.css b/fannie/legacy/it/newbatch/index.css new file mode 100755 index 000000000..b3e76b46a --- /dev/null +++ b/fannie/legacy/it/newbatch/index.css @@ -0,0 +1,22 @@ +form { + display: inline; +} + +a { + color: #0000ff; +} + +#inputarea { + text-align: left; + width: 80%; + padding-bottom: 8px; + border-bottom: 1px solid #000000; +} + +#inputarea th { + text-align: left; +} + +#displayarea { + padding-top: 8px; +} \ No newline at end of file diff --git a/fannie/legacy/it/newbatch/index.js b/fannie/legacy/it/newbatch/index.js new file mode 100755 index 000000000..c0839ab08 --- /dev/null +++ b/fannie/legacy/it/newbatch/index.js @@ -0,0 +1,360 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + //alert(response); + var array = response.split('`'); + switch(array[0]){ + case 'newBatch': + case 'deleteBatch': + case 'deleteItem': + case 'refilter': + case 'redisplay': + case 'redisplayWithOrder': + document.getElementById('displayarea').innerHTML = array[1]; + break; + case 'newTag': + document.getElementById('inputarea').innerHTML = array[1]; + break; + case 'saveBatch': + case 'savePrice': + case 'forceBatch': + case 'unsale': + break; + case 'showBatch': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('addItemUPC').focus(); + break; + case 'backToList': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('newBatchName').focus(); + break; + case 'addItemUPC': + case 'addItemLC': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('addItemPrice').focus(); + break; + case 'switchToLC': + case 'switchFromLC': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('addItemUPC').focus(); + document.getElementById('addItemUPC').select(); + break; + case 'addItemPrice': + case 'addItemLCPrice': + case 'addTag': + document.getElementById('inputarea').innerHTML = array[1]; + document.getElementById('displayarea').innerHTML = array[2]; + document.getElementById('addItemUPC').focus(); + document.getElementById('addItemUPC').select(); + break; + case 'expand': + doExpand(array[1],array[2],array); + break; + default: + alert(response); + } + } +} + +/********************* END AJAX BASICS ******************/ + +var batchtypes = new Array('Co-op Deals','Cha-Ching Web','Cha-Ching NonWeb','Price Change','delete','Owner Extras','Volume','Floating MOS','% MOS'); +var owners = new Array('','Cool','Deli','Meat','HBC','Bulk','Grocery','Produce','Gen Merch','IT'); + +function newBatch(){ + var type = document.getElementById('newBatchType').value; + var name = document.getElementById('newBatchName').value; + var startdate = document.getElementById('newBatchStartDate').value; + var enddate = document.getElementById('newBatchEndDate').value; + var owner = document.getElementById('newBatchOwner').value; + + phpSend('newBatch&type='+type+'&name='+name+'&startdate='+startdate+'&enddate='+enddate+'&owner='+owner); + + document.getElementById('newBatchType').value = 0; + document.getElementById('newBatchName').value = ''; + document.getElementById('newBatchStartDate').value = ''; + document.getElementById('newBatchEndDate').value = ''; + + document.getElementById('newBatchName').focus(); +} + +function deleteBatch(id,name){ + var audited = document.getElementById('isAudited').value; + if (audited == "1"){ + alert("You're not allowed to delete batches"); + return; + } + + if (confirm('Delete this batch ('+name+')?')) + phpSend('deleteBatch&id='+id); +} + +function editBatch(id){ + var name = document.getElementById('namelink'+id).innerHTML; + var type = document.getElementById('type'+id).innerHTML; + var startdate = document.getElementById('startdate'+id).innerHTML; + var enddate = document.getElementById('enddate'+id).innerHTML; + var owner = document.getElementById('owner'+id).innerHTML; + + var typeselect = ""; + + var ownerselect = ""; + + document.getElementById('name'+id).innerHTML = ""; + document.getElementById('type'+id).innerHTML = typeselect; + document.getElementById('startdate'+id).innerHTML = ""; + document.getElementById('enddate'+id).innerHTML = ""; + document.getElementById('owner'+id).innerHTML = ownerselect; + document.getElementById('edit'+id).innerHTML = "Save"; + + document.getElementById('name'+id+'i').focus(); +} + +function saveBatch(id){ + var name = document.getElementById('name'+id+'i').value; + var type = document.getElementById('type'+id+'i').value; + var startdate = document.getElementById('startdate'+id+'i').value; + var enddate = document.getElementById('enddate'+id+'i').value; + var owner = document.getElementById('owner'+id+'i').value; + + document.getElementById('name'+id).innerHTML = ""+name+""; + document.getElementById('type'+id).innerHTML = batchtypes[type-1]; + document.getElementById('startdate'+id).innerHTML = startdate; + document.getElementById('enddate'+id).innerHTML = enddate; + document.getElementById('owner'+id).innerHTML = owner; + document.getElementById('edit'+id).innerHTML = "Edit"; + + phpSend('saveBatch&id='+id+'&name='+name+'&type='+type+'&startdate='+startdate+'&enddate='+enddate+'&owner='+owner); +} + +function showBatch(id,tag){ + if (document.getElementById('isAudited').value == "1"){ + if (document.getElementById('type'+id).innerHTML == "Price Change"){ + alert("You can't edit price change batches"); + return; + } + } + phpSend('showBatch&id='+id+'&tag='+tag); +} + +function backToList(){ + phpSend('backToList'); +} + +function addItem(){ + var id = document.getElementById('currentBatchID').value; + var upc = document.getElementById('addItemUPC').value; + var tag = document.getElementById('addItemTag').checked; + var lc = document.getElementById('addItemLikeCode').checked; + + if (!lc) + phpSend('addItemUPC&id='+id+'&upc='+upc+'&tag='+tag); + else + phpSend('addItemLC&id='+id+'&lc='+upc); +} + +function addItemFinish(upc){ + var id = document.getElementById('currentBatchID').value; + var price = document.getElementById('addItemPrice').value; + var tag = document.getElementById('addItemTag').checked; + + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + if (!tag || audited=="1") + phpSend('addItemPrice&id='+id+'&upc='+upc+'&price='+price+'&uid='+uid+'&audited='+audited); + else + phpSend('newTag&id='+id+'&upc='+upc+'&price='+price); +} + +function addItemLCFinish(lc){ + var id = document.getElementById('currentBatchID').value; + var price = document.getElementById('addItemPrice').value; + + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('addItemLCPrice&id='+id+'&lc='+lc+'&price='+price+'&uid='+uid+'&audited='+audited); +} + +function deleteItem(upc){ + var id = document.getElementById('currentBatchID').value; + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('deleteItem&id='+id+'&upc='+upc+'&uid='+uid+'&audited='+audited); +} + +function refilter(){ + var owner = document.getElementById('filterOwner').value; + + phpSend('refilter&owner='+owner); +} + +function redisplay(mode){ + phpSend('redisplay&mode='+mode); +} + +function editPrice(upc){ + var saleprice = document.getElementById('salePrice'+upc).innerHTML; + var qty = ""; + if (saleprice.indexOf(" for ") != -1){ + var tmp = saleprice.split(" for "); + qty = tmp[0]; + saleprice = tmp[1]; + } + + var content = "( for)"; + content += ""; + + document.getElementById('salePrice'+upc).innerHTML = content; + document.getElementById('editLink'+upc).innerHTML = "Save"; +} + +function savePrice(upc){ + var saleprice = document.getElementById('salePrice'+upc+'i').value; + var saleqty = document.getElementById('saleQty'+upc+'i').value; + var content = saleprice; + if (!/\D/.test(saleqty)) + content = saleqty + ' for ' + saleprice; + if (saleqty == "") + content = saleprice; + + document.getElementById('salePrice'+upc).innerHTML = content; + document.getElementById('editLink'+upc).innerHTML = "Edit"; + + var id = document.getElementById('currentBatchID').value; + var uid = document.getElementById('uid').value; + var audited = document.getElementById('isAudited').value; + + phpSend('savePrice&id='+id+'&upc='+upc+'&saleprice='+saleprice+'&uid='+uid+'&audited='+audited+'&saleqty='+saleqty); +} + +function newTag(){ + var id = document.getElementById('newTagID').value; + var upc = document.getElementById('newTagUPC').value; + var price = document.getElementById('newTagPrice').value; + var desc = document.getElementById('newTagDesc').value; + var brand = document.getElementById('newTagBrand').value; + var units = document.getElementById('newTagUnits').value; + var size = document.getElementById('newTagSize').value; + var sku = document.getElementById('newTagSKU').value; + var vendor = document.getElementById('newTagVendor').value; + + phpSend('addTag&id='+id+'&upc='+upc+'&price='+price+'&desc='+desc+'&brand='+brand+'&units='+units+'&size='+size+'&sku='+sku+'&vendor='+vendor); +} + +function forceBatch(id){ + phpSend('forceBatch&id='+id); + alert('Batch '+id+' has been forced'); +} + +function unsale(id){ + phpSend('unsale&id='+id); + alert('Batch '+id+' has been taken off sale'); +} + +function lcselect_util(){ + var lc = document.getElementById('lcselect').value; + document.getElementById('addItemUPC').value = lc; +} + +function switchToLC(){ + phpSend('switchToLC'); +} + +function switchFromLC(){ + phpSend('switchFromLC'); +} + +function redisplayWithOrder(id,neworder){ + phpSend('redisplayWithOrder&id='+id+'&order='+neworder); +} + +function expand(likecode,saleprice){ + phpSend('expand&likecode='+likecode+'&saleprice='+saleprice); +} + +function doExpand(likecode,saleprice,data){ + var table = document.getElementById('yeoldetable'); + var num = 0; + var row = document.getElementById('expandId'+likecode).value; + for (var i = 3; i < data.length; i++){ + var newrow = table.insertRow(Number(row)+1); + newrow.innerHTML = data[i]; + num++; + } + + var inputs = document.getElementsByName('expandId'); + for (var i = 0; i < inputs.length; i++){ + var theInput = inputs.item(i); + if (Number(theInput.value) > Number(row)) + theInput.value = Number(theInput.value)+num; + } + + var newSpan = " [-]"; + document.getElementById("LCToggle"+likecode).innerHTML = newSpan; +} + +function doCollapse(likecode,saleprice,num){ + var table = document.getElementById('yeoldetable'); + var row = document.getElementById('expandId'+likecode).value; + for (var i = 0; i < num; i++) + table.deleteRow(Number(row)+1); + + var inputs = document.getElementsByName('expandId'); + for (var i = 0; i < inputs.length; i++){ + var theInput = inputs.item(i); + if (Number(theInput.value) > Number(row)) + theInput.value = Number(theInput.value)-num; + } + + var newSpan = " [+]"; + document.getElementById("LCToggle"+likecode).innerHTML = newSpan; +} diff --git a/fannie/legacy/it/newbatch/index.php b/fannie/legacy/it/newbatch/index.php new file mode 100755 index 000000000..3b47289aa --- /dev/null +++ b/fannie/legacy/it/newbatch/index.php @@ -0,0 +1,782 @@ +query($typesQ); +while ($typesW = $sql->fetch_array($typesR)) + $batchtypes[$typesW[0]] = $typesW[1]; + +$owners = array('','Cool','Deli','Meat','HBC','Bulk','Grocery','Produce','Gen Merch','IT'); + +/* ajax responses + * $out is the output sent back + * by convention, the request name ($_GET['action']) + * is prepended to all output so the javascript receiver + * can handle responses differently as needed. + * a backtick separates request name from data + */ +$out = ''; +if (isset($_GET['action'])){ + // prepend request name & backtick + $out = $_GET['action']."`"; + // switch on request name + switch ($_GET['action']){ + case 'newBatch': + $type = $_GET['type']; + $name = str_replace("'","''",$_GET['name']); + $startdate = $_GET['startdate']." 00:00:00.00"; + $enddate = $_GET['enddate']." 00:00:00.00"; + $owner = $_GET['owner']; + + $infoQ = "select discType from batchType where batchTypeID=$type"; + $infoR = $sql->query($infoQ); + $discounttype = array_pop($sql->fetch_array($infoR)); + + $insQ = "insert into batches (startDate, endDate, batchName, batchType, discountType, + priority) values ('$startdate','$enddate','$name',$type,$discounttype,0)"; + $insR = $sql->query($insQ); + $id = $sql->insert_id(); + + /* + $idQ = "select max(batchID) from batches"; + $idR = $sql->query($idQ); + $id = array_pop($sql->fetch_array($idR)); + */ + + $insQ = "insert batchowner values ($id,'$owner')"; + $insR = $sql->query($insQ); + + $out .= batchListDisplay(); + break; + case 'deleteBatch': + $id = $_GET['id']; + + $unsaleQ = "UPDATE products AS p LEFT JOIN batchList as b + ON p.upc=b.upc + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,p.discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + WHERE b.upc NOT LIKE '%LC%' + AND b.batchID=$id"; + if ($FANNIE_SERVER_DBMS=="MSSQL"){ + $unsaleQ = "UPDATE products SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + FROM products AS p, batchList as b + WHERE p.upc=b.upc AND b.upc NOT LIKE '%LC%' + AND b.batchID=$id"; + } + $unsaleR = $sql->query($unsaleQ); + + $unsaleLCQ = "UPDATE products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc=concat('LC',convert(v.likeCode,char)) + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,p.discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + WHERE l.upc LIKE '%LC%' + AND l.batchID=$id"; + if ($FANNIE_SERVER_DBMS=="MSSQL"){ + $unsaleLCQ = "UPDATE products + SET special_price=0, + specialpricemethod=0,specialquantity=0, + specialgroupprice=0,discounttype=0, + start_date='1900-01-01',end_date='1900-01-01' + FROM products AS p LEFT JOIN + likeCodeView AS v ON v.upc=p.upc LEFT JOIN + batchList AS l ON l.upc='LC'+convert(varchar,v.likeCode) + WHERE l.upc LIKE '%LC%' + AND l.batchID=$id"; + } + $unsaleLCR = $sql->query($unsaleLCQ); + + $delQ = "delete from batches where batchID=$id"; + $delR = $sql->query($delQ); + + $delQ = "delete from batchList where batchID=$id"; + $delR = $sql->query($delQ); + + exec("touch /pos/sync/scheduled/products"); + + $out .= batchListDisplay(); + break; + case 'saveBatch': + $id = $_GET['id']; + $name = $_GET['name']; + $type = $_GET['type']; + $startdate = $_GET['startdate']; + $enddate = $_GET['enddate']; + $owner = $_GET['owner']; + + $infoQ = "select discType from batchType where batchTypeID=$type"; + $infoR = $sql->query($infoQ); + $discounttype = array_pop($sql->fetch_array($infoR)); + + $upQ = "update batches set batchname='$name',batchtype=$type,discounttype=$discounttype,startdate='$startdate',enddate='$enddate' where batchID=$id"; + $upR = $sql->query($upQ); + + $checkQ = "select batchID from batchowner where batchID=$id"; + $checkR = $sql->query($checkQ); + if($sql->num_rows($checkR) == 0){ + $insQ = "insert batchowner values ($id,'$owner')"; + $insR = $sql->query($insQ); + } + else{ + $upQ = "update batchowner set owner='$owner' where batchID=$id"; + $upR = $sql->query($upQ); + } + + break; + case 'showBatch': + $id = $_GET['id']; + $tag = false; + if ($_GET['tag'] == 'true') + $tag = true; + + $out .= addItemUPCInput($tag); + $out .= "`"; + $out .= showBatchDisplay($id); + + break; + case 'backToList': + $out .= newBatchInput(); + $out .= "`"; + $out .= batchListDisplay(); + + break; + case 'addItemUPC': + $id = $_GET['id']; + $upc = str_pad($_GET['upc'],13,'0',STR_PAD_LEFT); + $newupc = fixBarcode($upc); + $tag = false; + if ($_GET['tag'] == 'true') + $tag = true; + $testQ = "select * from products where upc='$newupc'"; + $testR = $sql->query($testQ); + if ($sql->num_rows($testR) > 0) $upc = $newupc; + + $out .= addItemPriceInput($upc,$tag); + break; + case 'addItemLC': + $id = $_GET['id']; + $lc = $_GET['lc']; + $out .= addItemPriceLCInput($lc); + break; + case 'addItemPrice': + $id = $_GET['id']; + $upc = $_GET['upc']; + $price = $_GET['price']; + + if ($price != ""){ + $checkQ = "select upc from batchList where upc='$upc' and batchID=$id"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "insert into batchList (upc,batchID,salePrice,active,pricemethod,quantity) + values ('$upc',$id,$price,1,0,0)"; + $insR = $sql->query($insQ); + } + else { + $upQ = "update batchList set saleprice=$price where upc='$upc' and batchID=$id"; + $upR = $sql->query($upQ); + } + $audited = $_GET['audited']; + if ($audited == 1) + auditPriceChange($sql,$_GET['uid'],$upc,$price,$id); + } + + $out .= addItemUPCInput(); + $out .= '`'; + $out .= showBatchDisplay($id); + break; + case 'addItemLCPrice': + $id = $_GET['id']; + $lc = $_GET['lc']; + $price = $_GET['price']; + + if ($price != ""){ + $checkQ = "select upc from batchList where upc='LC$lc' and batchID='$id'"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "insert into batchList (upc,batchID,salePrice,active,pricemethod,quantity) + values ('LC$lc',$id,$price,1,0,0)"; + $insR = $sql->query($insQ); + } + else { + $upQ = "update batchList set saleprice=$price where upc='LC$lc' and batchID=$id"; + $upR = $sql->query($upQ); + } + $audited = $_GET['audited']; + if ($audited == 1) + auditPriceChangeLC($sql,$_GET['uid'],$upc,$price,$id); + } + + $out .= addItemLCInput(); + $out .= '`'; + $out .= showBatchDisplay($id); + break; + case 'deleteItem': + $id = $_GET['id']; + $upc = $_GET['upc']; + + $delQ = "delete from batchList where batchID=$id and upc='$upc'"; + $delR = $sql->query($delQ); + + $delQ = "delete from batchBarcodes where upc='$upc' and batchID='$id'"; + $delR = $sql->query($delQ); + + if (substr($upc,0,2) != 'LC'){ + // take the item off sale if this batch is currently on sale + $unsaleQ = "UPDATE products AS p LEFT JOIN batchList as b on p.upc=b.upc + set p.discounttype=0,special_price=0,start_date=0,end_date=0 + WHERE p.upc='$upc' and b.batchID=$id"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $unsaleQ = "update products set discounttype=0,special_price=0,start_date=0,end_date=0 + from products as p, batches as b where + p.upc='$upc' and b.batchID=$id and b.startdate=p.start_date and b.enddate=p.end_date"; + } + $unsaleR = $sql->query($unsaleQ); + + updateProductAllLanes($upc); + } + else { + $lc = substr($upc,2); + $unsaleQ = "UPDATE products AS p LEFT JOIN upcLike as u on p.upc=u.upc + LEFT JOIN batchList as b ON b.upc=concat('LC',convert(u.likeCode,char)) + set p.discounttype=0,special_price=0,start_date=0,end_date=0 + WHERE u.likeCode='$lc' and b.batchID=$id"; + if ($FANNIE_SERVER_DBMS == "MSSQL"){ + $unsaleQ = "update products set discounttype=0,special_price=0,start_date=0,end_date=0 + from products as p, batches as b, upcLike as u + where u.likeCode=$lc and u.upc=p.upc and b.startdate=p.start_date and b.enddate=p.end_date + and b.batchID=$id"; + } + $unsaleR = $sql->query($unsaleQ); + + exec("touch /pos/sync/scheduled/products"); + } + $audited = $_GET['audited']; + if ($audited == "1") + auditDelete($sql,$_GET['uid'],$upc,$id); + + $out .= showBatchDisplay($id); + break; + case 'refilter': + $owner = $_GET['owner']; + + $out .= batchListDisplay($owner); + break; + case 'savePrice': + $id = $_GET['id']; + $upc = $_GET['upc']; + $saleprice = $_GET['saleprice']; + $method = 0; + $qty = $_GET['saleqty']; + if (is_numeric($qty)) $method=2; + else $qty=0; + + $upQ = "update batchList set saleprice=$saleprice,pricemethod=$method,quantity=$qty where batchID=$id and upc='$upc'"; + $upR = $sql->query($upQ); + + $upQ = "update batchBarcodes set normal_price=$saleprice where upc='$upc' and batchID=$id"; + $upR = $sql->query($upQ); + + $audited = $_GET["audited"]; + if ($audited == "1") + auditSavePrice($sql,$_GET['uid'],$upc,$saleprice,$id); + + break; + case 'newTag': + $id = $_GET['id']; + $upc = $_GET['upc']; + $price = $_GET['price']; + + $out .= newTagInput($upc,$price,$id); + + break; + case 'addTag': + $id = $_GET['id']; + $upc = $_GET['upc']; + $price = $_GET['price']; + $desc = $_GET['desc']; + $brand = $_GET['brand']; + $units = $_GET['units']; + $size = $_GET['size']; + $sku = $_GET['sku']; + $vendor = $_GET['vendor']; + + $checkQ = "select upc from batchBarcodes where upc='$upc' and batchID = $id"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $insQ = "insert into batchBarcodes values ('$upc','$desc',$price,'$brand','$sku','$size','$units','$vendor',$id)"; + $insR = $sql->query($insQ); + } + else { + $upQ = "update batchBarcodes set normal_price=$price where upc='$upc'"; + $upR = $sql->query($upQ); + } + + $insQ = "insert into batchList (upc,batchID,salePrice,active,pricemethod,quantity) + values ('$upc',$id,$price,1,0,0)"; + $insR = $sql->query($insQ); + + $out .= addItemUPCInput('true'); + $out .= '`'; + $out .= showBatchDisplay($id); + break; + case 'redisplay': + $mode = $_GET['mode']; + $out .= batchListDisplay('',$mode); + break; + case 'forceBatch': + $id = $_GET['id']; + require('forceBatch.php'); + forceBatch($id); + break; + case 'unsale': + $id = $_GET['id']; + require('unsale.php'); + unsale($id); + break; + case 'switchToLC': + $out .= addItemLCInput(); + break; + case 'switchFromLC': + $out .= addItemUPCInput(); + break; + case 'redisplayWithOrder': + $id = $_GET['id']; + $order = $_GET['order']; + $out .= showBatchDisplay($id,$order); + break; + case 'expand': + $likecode = $_GET['likecode']; + $saleprice = $_GET['saleprice']; + $out .= $likecode."`"; + $out .= $saleprice."`"; + for ($i = 0; $i < 6; $i++) $out .= ""; + $out .= "`"; + + $likeQ = "select p.upc,p.description,p.normal_price,$saleprice + from products as p left join upcLike as u on p.upc=u.upc + where u.likeCode = $likecode order by p.upc desc"; + $likeR = $sql->query($likeQ); + while ($likeW = $sql->fetch_row($likeR)){ + $out .= ""; + $out .= ""; + $out .= ""; + $out .= ""; + $out .= ""; + $out .= ""; + $out .= "`"; + } + $out = substr($out,0,strlen($out)-1); + break; + } + + print $out; + return; +} + +/* input functions + * functions for generating content that goes in the + * inputarea div + */ +function newBatchInput(){ + global $batchtypes; + + $ret = ""; + $ret .= "
        UPCDescription$ SalesQuantity"; +while($salesBatchW = $sql->fetch_array($salesBatchR)){ + $upc = $salesBatchW['upc']; + $desc = $salesBatchW['description']; + $sales = $salesBatchW['sales']; + $qty = $salesBatchW['quantity']; + $imod = $i%2; + + if($imod==1){ + $rColor= '#ffffff'; + }else{ + $rColor= '#ffffcc'; + } + + echo "
        $upc$desc$sales$qty
         $likeW[0]$likeW[1]$likeW[2]$likeW[3]  
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        Batch TypeNameStart dateEnd dateOwner

        "; + + $ret .= "Filter: show batches owned by: "; + $ret .= ""; + + $ret .= " Print shelf tags"; + + return $ret; +} + +function addItemUPCInput($newtags=false){ + $ret = "
        "; + $ret .= "UPC: "; + $ret .= ""; + $ret .= " Likecode"; + $ret .= "
        "; + + return $ret; +} + +function addItemLCInput($newtags=false){ + global $sql; + $ret = "
        "; + $ret .= "Like code: "; + $ret .= ""; + $ret .= ""; + $ret .= " Likecode"; + $ret .= "
        "; + + return $ret; +} + +function addItemPriceInput($upc,$newtags=false){ + global $sql; + $fetchQ = "select description,normal_price from products where upc='$upc'"; + $fetchR = $sql->query($fetchQ); + $fetchW = $sql->fetch_array($fetchR); + + $ret = "
        "; + $ret .= "UPC: $upc Description: $fetchW[0] Normal price: $fetchW[1] "; + $ret .= "Sale price: "; + $ret .= ""; + $ret .= "query($fetchQ); + $desc = array_pop($sql->fetch_array($fetchR)); + + /* get the most common price for items in a given + * like code + */ + $fetchQ = "select p.normal_price from products as p + left join upcLike as u on p.upc=u.upc and u.likeCode=$lc + where u.upc is not null + group by p.normal_price + order by count(*) desc"; + $fetchQ = $sql->add_select_limit($fetchQ,1); + $fetchR = $sql->query($fetchQ); + $normal_price = array_pop($sql->fetch_array($fetchR)); + + $ret = ""; + $ret .= "Like code: $lc Description: $desc Normal price: $normal_price "; + $ret .= "Sale price: "; + $ret .= ""; + $ret .= "
        "; + + return $ret; +} + +function newTagInput($upc,$price,$id){ + global $sql; + $unfiQ = "select distinct * from UNFI where upc = '$upc'"; + $unfiR = $sql->query($unfiQ); + $unfiN = $sql->num_rows($unfiR); + + $size = ''; + $brand = ''; + $units = ''; + $sku = ''; + $desc = ''; + $vendor = ''; + // grab info from the UNFI table if possible. + if ($unfiN == 1){ + $unfiW = $sql->fetch_array($unfiR); + $size = $unfiW['size']; + $brand = strtoupper($unfiW['brand']); + $brand = preg_replace("/\'/","",$brand); + $units = $unfiW['units']; + $sku = $unfiW['sku']; + $desc = strtoupper($unfiW['description']); + $desc = preg_replace("/\'/","",$desc); + $vendor = 'UNFI'; + } + // otherwise, snag at least the description from products + else { + $descQ = "select description from products where upc='$upc'"; + $descR = $sql->query($descQ); + $desc = strtoupper(array_pop($sql->fetch_array($descR))); + } + + $ret = "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "
        UPC$upc
        Description
        Brand
        Units
        Size
        Vendor
        SKU
        Price$price"; + $ret .= "
        Cancel
        "; + + return $ret; +} + +/* display functions + * functions for generating content that goes in the + * displayarea div + */ +function batchListDisplay($filter='',$mode='all'){ + global $batchtypes, $sql; + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $ret = "Display: "; + if ($mode != 'pending') + $ret .= "Pending | "; + else + $ret .= "Pending | "; + if ($mode != 'current') + $ret .= "Current | "; + else + $ret .= "Current | "; + if ($mode != 'historical') + $ret .= "Historical | "; + else + $ret .= "Historical | "; + if ($mode != 'all') + $ret .= "All"; + else + $ret .= "All
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + // the 'all' query + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID order by b.batchID desc"; + switch($mode){ + case 'pending': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + where ".$sql->datediff('b.startDate',$sql->now())." > 0 + order by b.batchID desc"; + break; + case 'current': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + where ".$sql->datediff('b.startDate',$sql->now())." < 1 + and ".$sql->datediff('b.endDate',$sql->now())." > 0 + order by b.batchID desc"; + break; + case 'historical': + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID + where ".$sql->datediff('b.endDate',$sql->now())." <= 0 + order by b.batchID desc"; + break; + } + // use a filter - only works in 'all' mode + if ($filter != ''){ + $fetchQ = "select b.batchName,b.batchType,b.startDate,b.endDate,b.batchID, + o.owner from batches as b left outer join batchowner as o + on b.batchID = o.batchID where o.owner='$filter' order by b.batchID desc"; + } + $fetchR = $sql->query($fetchQ); + + $count = 0; + while($fetchW = $sql->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $count += 1; + //if ($count > 100) break; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + + $ret .= "
        Batch NameTypeStart dateEnd dateOwner
        $fetchW[0]".$batchtypes[$fetchW[1]]."$fetchW[2]$fetchW[3]$fetchW[5]EditDeleteReport
        "; + return $ret; +} + +function showBatchDisplay($id,$orderby=' ORDER BY b.listID DESC'){ + global $sql; + $nameQ = "select batchName,batchType from batches where batchID=$id"; + $nameR = $sql->query($nameQ); + $nameW = $sql->fetch_row($nameR); + $name = $nameW[0]; + $type = $nameW[1]; + $saleHeader = "Sale Price"; + if ($type == 8){ + $saleHeader = "$ Discount"; + } + elseif ($type == 9){ + $saleHeader = "% Discount"; + } + else if ($type == 4){ + $saleHeader = "New Price"; + } + + $fetchQ = "select b.upc, + case when l.likeCode is null then p.description + else l.likeCodeDesc end as description, + p.normal_price,b.salePrice, + b.quantity + from batchList as b left outer join products as p on + b.upc = p.upc left outer join likeCodes as l on + b.upc = concat('LC',convert(l.likeCode,char)) + where b.batchID = $id $orderby"; + $fetchR = $sql->query($fetchQ); + + $ret = "Batch name: $name
        "; + $ret .= "Back to batch list | "; + $ret .= "Print shelf tags | "; + $ret .= "Force batch | "; + $ret .= "Take Batch Off Sale
        "; + $ret .= ""; + $ret .= ""; + if ($orderby != "ORDER BY b.upc ASC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY description ASC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY p.normal_price DESC") + $ret .= ""; + else + $ret .= ""; + if ($orderby != "ORDER BY b.saleprice DESC") + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + + $colors = array('#ffffff','#ffffcc'); + $c = 0; + $row = 1; + while($fetchW = $sql->fetch_array($fetchR)){ + $c = ($c + 1) % 2; + $ret .= ""; + $fetchW[0] = rtrim($fetchW[0]); + if (substr($fetchW[0],0,2) == "LC"){ + $likecode = rtrim(substr($fetchW[0],2)); + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + if ($fetchW[4] != 0) + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $row++; + } + $ret .= "
        UPCUPCDescriptionDescriptionNormal priceNormal price$saleHeader$saleHeader
        $fetchW[0]"; + $ret .= ""; + $ret .= " [+]"; + $ret .= "$fetchW[0]$fetchW[1]$fetchW[2]$fetchW[4] for $fetchW[3]$fetchW[3]EditDelete
        "; + $ret .= ""; + + return $ret; +} + +include($FANNIE_ROOT.'auth/login.php'); +$user = validateUserQuiet('batches'); +$audited=0; +if (!$user){ + $audited=1; + $user = validateUserQuiet('batches_audited'); +} +if (!$user){ + header("Location: {$FANNIE_URL}auth/ui/loginform.php?redirect={$FANNIE_URL}legacy/it/newbatch"); + return; +} + +?> + + +Batch controller + + + + + + +
        + +
        +Hide +
        +
        + +
        +
        + +
        + + + + diff --git a/fannie/legacy/it/newbatch/laneUpdates.php b/fannie/legacy/it/newbatch/laneUpdates.php new file mode 120000 index 000000000..4065e4dd3 --- /dev/null +++ b/fannie/legacy/it/newbatch/laneUpdates.php @@ -0,0 +1 @@ +../../queries/laneUpdates.php \ No newline at end of file diff --git a/fannie/legacy/it/newbatch/unsale.php b/fannie/legacy/it/newbatch/unsale.php new file mode 100644 index 000000000..3e3345a52 --- /dev/null +++ b/fannie/legacy/it/newbatch/unsale.php @@ -0,0 +1,70 @@ +query($unsale1Q); + $sql->query($unsale2Q); + } + else { + $unsale1Q = "update products as p + left join batchList as b ON p.upc=b.upc + set special_price=0, + p.discounttype=0,start_date='',end_date='', + specialpricemethod=0,specialquantity=0, + specialgroupprice=0 + where b.batchID=".$batchID; + + $unsale2Q = "update products as p left join + likeCodeView as v on v.upc=p.upc left join + batchList as l on l.upc=concat('LC',convert(v.likeCode,char)) + left join batches as b on b.batchID = l.batchID + set special_price=0, + p.discounttype=0,start_date='',end_date='', + specialpricemethod=0,specialquantity=0, + specialgroupprice=0 + where b.batchID=$batchID"; + $sql->query($unsale1Q); + $sql->query($unsale2Q); + } + + if (!function_exists("updateProductAllLanes")) include($FANNIE_ROOT.'legacy/queries/laneUpdates.php'); + + $q = "SELECT upc FROM batchList WHERE batchID=".$batchID; + $r = $sql->query($q); + while($w = $sql->fetch_row($r)){ + $upcs = array($w['upc']); + if (substr($w['upc'],0,2)=='LC'){ + $upcs = array(); + $lc = substr($w['upc'],2); + $q2 = "SELECT upc FROM upcLike WHERE likeCode=".$lc; + $r2 = $sql->query($q2); + while($w2 = $sql->fetch_row($r2)) + $upcs[] = $w2['upc']; + } + foreach($upcs as $u){ + updateProductAllLanes($u); + } + } +} + +?> diff --git a/fannie/legacy/it/npp/dept_margin.php b/fannie/legacy/it/npp/dept_margin.php new file mode 100644 index 000000000..48f05e599 --- /dev/null +++ b/fannie/legacy/it/npp/dept_margin.php @@ -0,0 +1,220 @@ +THIS WON'T WORK IF COST VALUES ARE NOT IN PRODEXTRA"; +echo "
        "; +echo "Dept no: "; +echo "Month: "; +echo "Year: "; +echo ""; +echo "
        "; + +if (isset($_GET['dept'])){ + $dept = $_GET['dept']; + $month = 0; + if (isset($_GET['month'])) $month = $_GET['month']; + $year = 0; + if (isset($_GET['year'])) $year = $_GET['year']; + + $margin = dept_projected_margin($dept); + $margin2 = dept_realized_margin($dept,$month,$year); + + echo "Projected: $margin%
        "; + echo "Realized: $margin2%
        "; +} + +echo "
        "; +echo "
        "; +echo "Sub no: "; +echo "Month: "; +echo "Year: "; +echo ""; +echo "
        "; + +if (isset($_GET['sub'])){ + $dept = $_GET['sub']; + $month = 0; + if (isset($_GET['month'])) $month = $_GET['month']; + $year = 0; + if (isset($_GET['year'])) $year = $_GET['year']; + + $margin = sub_projected_margin($dept); + $margin2 = sub_realized_margin($dept,$month,$year); + + echo "Projected: $margin%
        "; + echo "Realized: $margin2%
        "; +} + +// END TESTING STUFF + +/* + Weighted average of all items in a sub department +*/ +function sub_realized_margin($sub,$month=0,$year=0){ + global $sql; + if ($month == 0) + $month = date("m"); + if ($year == 0) + $year = date("Y"); + + $counts = select_counts($month,$year); + + $countQ = "select p.normal_price,q.cost,c.count from + products as p left join prodExtra as q + on p.upc = q.upc left join $counts as c + on p.upc = c.upc left join departments as d + on c.department = d.dept_no + left join MasterSuperDepts AS s ON + s.dept_ID=d.dept_no + where s.superID = $sub + and q.cost <> 0 order by c.count desc"; + $countR = $sql->query($countQ); + + $num = 0; + $denom = 0; + + while($countW = $sql->fetch_array($countR)){ + $num += $countW[2] * margin($countW[0],$countW[1]); + $denom += $countW[2]; + } + + return $num / $denom; +} + +/* + Average of all items in a sub department +*/ +function sub_projected_margin($sub){ + $prodQ = "select p.normal_price,q.cost from products as p + left join prodExtra as q on p.upc = q.upc + left join departments as d on p.department = d.dept_no + left join MasterSuperDepts AS s ON d.dept_no=s.dept_ID + where s.superID = $sub and q.cost <> 0"; + $prodR = $sql->query($prodQ); + + $count = 0; + $margin = 0; + while ($prodW = $sql->fetch_array($prodR)){ + $margin += margin($prodW[0],$prodW[1]); + $count++; + } + + return $margin / $count; +} + +/* + Average margin of all items in department +*/ +function dept_realized_margin($dept,$month=0,$year=0){ + global $sql; + if ($month == 0) + $month = date("m"); + if ($year == 0) + $year = date("Y"); + + $counts = select_counts($month,$year); + + $countQ = "select p.normal_price,q.cost,c.count from + products as p left join prodExtra as q + on p.upc = q.upc left join $counts as c + on p.upc = c.upc + where c.department = $dept + and q.cost <> 0 order by c.count desc"; + $countR = $sql->query($countQ); + + $num = 0; + $denom = 0; + + while($countW = $sql->fetch_array($countR)){ + $num += $countW[2] * margin($countW[0],$countW[1]); + $denom += $countW[2]; + } + + return $num / $denom; +} + +/* + weighted average all items in department +*/ +function dept_projected_margin($dept){ + global $sql; + $prodQ = "select p.normal_price,q.cost from products as p + left join prodExtra as q on p.upc = q.upc + where p.department = $dept and q.cost <> 0"; + $prodR = $sql->query($prodQ); + + $count = 0; + $margin = 0; + while ($prodW = $sql->fetch_array($prodR)){ + $margin += margin($prodW[0],$prodW[1]); + $count++; + } + + return $margin / $count; +} + +/* + Calculate the margin given a price and a cost + Separate for the sake of modularity + Returns % margin, multiplied by 100 (for + common % representation) +*/ +function margin($price,$cost){ + return ( ($price - $cost) / $cost ) * 100; +} + + +/* + load item sale counts into the proper dlog_archive.dbo.count_* table +*/ +function reload_counts($month,$year){ + global $sql; + $datestring = str_pad($year,4,'20',STR_PAD_LEFT)."_".str_pad($month,2,'0',STR_PAD_LEFT); + $dlog = "dlog_archive.dbo.dlog_".$datestring; + + $dropQ = "drop table dlog_archive.dbo.counts_".$datestring; + $dropR = $sql->query($dropQ); + + $insQ = "select d.upc,p.department,sum(d.quantity) as count + into dlog_archive.dbo.counts_$datestring + from $dlog as d left join products as p on + d.upc = p.upc + where p.department is not NULL + group by d.upc,p.department"; + $insR = $sql->query($insQ); +} + +/* + reload all the counts tables, 9/2004 through present +*/ +function reload_all_counts(){ + $month = 9; + $year = 2004; + + $endmonth = date('n'); + $endyear = date('Y'); + + while (($month < $endmonth and $year <= $endyear) or $year < $endyear){ + reload_counts($month,$year); + $month++; + if ($month > 12){ + $month = 1; + $year++; + } + } +} + +/* + return the proper counts table for the given month +*/ +function select_counts($month,$year){ + if (date("m-Y") == str_pad($month,2,'0',STR_PAD_LEFT)."-".str_pad($year,4,'20',STR_PAD_LEFT)) + return "counts"; + else + return "dlog_archive.dbo.counts_".str_pad($year,4,'20',STR_PAD_LEFT)."_".str_pad($month,2,'0',STR_PAD_LEFT); +} +?> diff --git a/fannie/legacy/it/npp/invoice_importer.php b/fannie/legacy/it/npp/invoice_importer.php new file mode 100644 index 000000000..d5cbb04a3 --- /dev/null +++ b/fannie/legacy/it/npp/invoice_importer.php @@ -0,0 +1,60 @@ + $SKIP_LINES){ + $data = csv_parser($line); + $upc = $data[$UPC]; + $cost = $data[$COST]; + // stop when the shipping line or a non-UPC is hit + if ($upc == "000000-000000" || !preg_match("/\d\d\d\d\d\d-\d\d\d\d\d\d/",$upc)) + break; + // just go on to the next item if cost is zero + if ($cost == 0) + continue; + $wupc = UNFItoWFC($upc); + echo $wupc." ".$cost."
        "; + $upQ = "update prodExtra set cost=$cost where upc='$wupc'"; + $upR = $sql->query($upQ); + } + $line_num++; + } +} + +/* + change upcs from UNFI style (6 digit, hyphen, 6 digit) + to WFC style (13 digit, no check) +*/ +function UNFItoWFC($upc){ + list($left,$right) = sscanf($upc,"%d-%d"); + $right = substr($right,0,strlen($right)-1); + $combined = $left . str_pad($right,5,'0',STR_PAD_LEFT); + return str_pad($combined,13,'0',STR_PAD_LEFT); +} + +?> diff --git a/fannie/legacy/it/npp/readall.php b/fannie/legacy/it/npp/readall.php new file mode 100644 index 000000000..81069ea86 --- /dev/null +++ b/fannie/legacy/it/npp/readall.php @@ -0,0 +1,17 @@ +$filename
        "; + copy("csv/".$filename, "tmp/invoice.csv"); + import_invoice(); + rename("csv/".$filename,"old/".$filename); + } +} +unlink("tmp/invoice.csv"); + +?> diff --git a/fannie/legacy/it/npp/unfi_invoice_fixer.php b/fannie/legacy/it/npp/unfi_invoice_fixer.php new file mode 100644 index 000000000..b80775610 --- /dev/null +++ b/fannie/legacy/it/npp/unfi_invoice_fixer.php @@ -0,0 +1,33 @@ + 0){ + $data = csv_parser($line); + $data[5] = str_pad($data[5],13,'0',STR_PAD_LEFT); + if ($data[1][0] != "\"") + $data[1] = "\"".$data[1]."\""; + if ($data[2][0] != "\"") + $data[2] = "\"".$data[2]."\""; + while (!is_numeric($data[6][0])) + $data[6] = substr($data[6],1,strlen($data[6])); + $outstr = ""; + foreach($data as $d) + $outstr .= $d.","; + $outstr = substr($outstr,0,strlen($outstr)-1); + echo $outstr."
        "; + fputs($fp2,$outstr); + } + $lc++; +} +fclose($fp); +fclose($fp2); + +?> diff --git a/fannie/legacy/it/npp/upload.php b/fannie/legacy/it/npp/upload.php new file mode 100644 index 000000000..f3a3d4f8a --- /dev/null +++ b/fannie/legacy/it/npp/upload.php @@ -0,0 +1,25 @@ + /dev/null"); + unlink("csv/unfi.zip"); + header("Location: readall.php"); +} +else { +?> + + + +Upload UNFI Invoice + + +
        + +Filename: + +
        + + + diff --git a/fannie/legacy/it/paydays.py b/fannie/legacy/it/paydays.py new file mode 100644 index 000000000..a1c189cb7 --- /dev/null +++ b/fannie/legacy/it/paydays.py @@ -0,0 +1,56 @@ +#!/usr/bin/python + +import datetime +import Sybase + +paydays = { + '2011-01-07' : 1, + '2011-01-21' : 1, + '2011-02-07' : 1, + '2011-02-23' : 1, + '2011-03-07' : 1, + '2011-03-22' : 1, + '2011-04-07' : 1, + '2011-04-22' : 1, + '2011-05-06' : 1, + '2011-05-23' : 1, + '2011-06-07' : 1, + '2011-06-22' : 1, + '2011-07-07' : 1, + '2011-07-22' : 1, + '2011-08-08' : 1, + '2011-08-22' : 1, + '2011-09-08' : 1, + '2011-09-22' : 1, + '2011-10-07' : 1, + '2011-10-21' : 1, + '2011-11-07' : 1, + '2011-11-22' : 1, + '2011-12-07' : 1, + '2011-12-22' : 1, + '2012-01-06' : 1, + '2010-12-22' : 1 +} + +today = datetime.date.today() + +if paydays.has_key(str(today)): + fp = open('/var/www/html/git/fannie/src/Credentials/GenericDB.python') + line = fp.read().strip() + fp.close() + hostname,username,pw = line.split(",") + + conn = Sybase.connect(hostname,username,pw) + db = conn.cursor() + db.execute('use WedgePOS') + + db.execute('INSERT INTO dtransactions SELECT * FROM staffaradjview') + db.execute("""UPDATE custdata SET balance=balance-s.total + FROM custdata AS c + INNER JOIN staffArAdjView AS s + ON c.cardno=s.card_no""") + + print "Staff IOUs are being cleared" + + conn.commit() + conn.close() diff --git a/fannie/legacy/it/pcode/index.php b/fannie/legacy/it/pcode/index.php new file mode 100644 index 000000000..e80a14c4d --- /dev/null +++ b/fannie/legacy/it/pcode/index.php @@ -0,0 +1,43 @@ +Save to Excel
        "; +} +else { +header('Content-Type: application/ms-excel'); +header('Content-Disposition: attachment; filename="departments.xls"'); +} + +include('../../../config.php'); +if (!class_exists("SQLManager")) require($FANNIE_ROOT."src/SQLManager.php"); + +include('../../db.php'); + +$sub_depts = array("MISC","BULK","COOL","DELI","GROCERY","HBC","PRODUCE","MARKETING","MEAT","GEN MERCH"); + +echo ""; +echo ""; +$cur_dept = "-1"; + +$deptQ = "select dept_no,superID,dept_name,dept_tax,dept_fs,salesCode from departments + as d LEFT JOIN MasterSuperDepts AS m on d.dept_no=m.dept_ID + LEFT JOIN deptSalesCodes AS s ON d.dept_no=s.dept_ID order by + superID,dept_no"; +$deptR = $sql->query($deptQ); + +while ($row = $sql->fetch_row($deptR)){ + if ($cur_dept != $row[1]){ + echo ""; + $cur_dept = $row[1]; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        Dept#DescTaxFSpCode
        ".$sub_depts[$row[1]]."
        ".$row[0]."".$row[2]."".$row[3]."".$row[4]."".$row[5]."
        "; + +?> diff --git a/fannie/legacy/it/pcode/movement.php b/fannie/legacy/it/pcode/movement.php new file mode 100755 index 000000000..e38b5a390 --- /dev/null +++ b/fannie/legacy/it/pcode/movement.php @@ -0,0 +1,162 @@ +"; + echo "From "; + print $date1; + echo " to "; + print $date2; + echo "
        "; + echo " pCode range: "; + print $salesCode1; + echo " to "; + print $salesCode2; + echo "
        "; + echo "Save to Excel
        "; + + $dlog = select_dlog($date1,$date2); + + $date2a = $date2 . " 23:59:59"; + $date1a = $date1 . " 00:00:00"; + + $groupBy = "upc"; + $query1 = "description"; + + + $query = "SELECT DISTINCT t.upc,p.description, SUM(t.quantity),SUM(t.total), + d.salesCode + FROM $dlog as t LEFT JOIN Products as p on t.upc = p.upc + LEFT JOIN deptSalesCodes as d on d.dept_ID = t.department WHERE + d.salesCode BETWEEN '$salesCode1' AND '$salesCode2' + AND tDate >= '$date1a' AND tDate <= '$date2a' GROUP BY t.upc,p.description, + d.salesCode ORDER BY $order $dir"; + $result = $sql->query($query,$db); + echo "\n"; //create table + echo ""; + echo ""; + else + echo "ASC>UPC"; + echo ""; + else + echo "ASC>Description"; + echo ""; + else + echo "DESC>Qty"; + echo ""; + else + echo "DESC>Sales"; + echo ""; + else + echo "ASC>pCode"; + echo "\n";//create table header + + while ($myrow = $sql->fetch_array($result)) //create array from query + printf("\n",$myrow[0], $myrow[1],$myrow[2],$myrow[3],$myrow[4]); + //convert row information to strings, enter in table cells + + echo "
        UPCDescriptionQtySalespCode
        %s%s%s%s%s
        \n";//end table + +} +else +{ +?> + + +Query + + + + +
        + + + + + + + + + + + + + + + +

        pCode Start

        +

        pCode End

        + +

        +

        + +

        +

        Date Start

        +

        Date End

        +
        +

        + +

        +

        + +

        +
        Excel  
        +
        +
        +
        +
        +
        +
        +
        + + + + + + + diff --git a/fannie/legacy/it/poll/index.css b/fannie/legacy/it/poll/index.css new file mode 100644 index 000000000..936c856f4 --- /dev/null +++ b/fannie/legacy/it/poll/index.css @@ -0,0 +1,22 @@ +.pollObj { + padding: 10px; + width: 90%; + border: solid 1px red; + margin-bottom: 15px; +} + +#pollstart { + padding: 10px; + border-bottom: solid 1px black; +} + +.pollname { + padding: 5px; + font-size: 125%; + font-weight: bold; + text-align: center; +} + +a { + color: blue; +} diff --git a/fannie/legacy/it/poll/index.js b/fannie/legacy/it/poll/index.js new file mode 100644 index 000000000..1eb1f58ff --- /dev/null +++ b/fannie/legacy/it/poll/index.js @@ -0,0 +1,114 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + switch(response[0]){ + default: + alert(response); + } + } +} + +function newPoll(){ + var name = document.getElementById('newPollName').value; + var content = "
        "+name+"
        "; + content += "
        "; + content += "
        "; + content += ""; + content += " "; + + document.getElementById('pollNumQuestions').value=0; + document.getElementById('polldisplay').innerHTML = content; +} + +function addText(){ + var id = Number(document.getElementById('pollNumQuestions').value)+1; + var content = "
        "; + content += "
        "; + document.getElementById('pollquestions').innerHTML += content; + editText(id); + document.getElementById('pollNumQuestions').value = id; +} + +function editText(id){ + var val = document.getElementById('pollObjText'+id).innerHTML; + var content = ""; + content += "Save
        "; + content += ""; + document.getElementById('pollObj'+id).innerHTML = content; +} + +function saveText(id){ + var val = document.getElementById('textObjTA'+id).value; + var content = "Edit"; + content += "
        "; + content += "
        "+val+"
        "; + document.getElementById('pollObj'+id).innerHTML=content; +} + +function addQuestion(){ + var qtype = document.getElementById('pollQtype').value; + switch(qtype){ + case 'Short text': + addShortText(); break; + } +} + +function addShortText(){ + var id = Number(document.getElementById('pollNumQuestions').value)+1; + var content = "
        "; + content += "
        "; + document.getElementById('pollquestions').innerHTML += content; + editShortText(id); + document.getElementById('pollNumQuestions').value = id; +} + +function editShortText(id){ + var title = document.getElementById('pollObjShort'+id).innerHTML; + var req = document.getElementById('req'+id).innerHTML; + + var content = ""; + content += "Save
        "; + content += "Question: "; + content += "
        "; + content += " + +Poll Maker + + + + +
        +Create a new Poll + +
        + +
        + +
        + diff --git a/fannie/legacy/it/pricefile/likecode.php b/fannie/legacy/it/pricefile/likecode.php new file mode 100644 index 000000000..b3e6c14a0 --- /dev/null +++ b/fannie/legacy/it/pricefile/likecode.php @@ -0,0 +1,93 @@ +Data to import
        "; + echo ""; + echo ""; + echo ""; + echo ""; + while (!feof($fp)){ + $line = fgets($fp); + $data = csv_parser($line); + + if (!is_numeric($data[$LC_COL])) continue; + + $q = "select l.likeCodeDesc,min(p.normal_price) from products as p + left join upcLike as u on u.upc=p.upc + left join likeCodes as l on l.likeCode=u.likeCode where + u.likeCode=".$data[$LC_COL]." group by + u.likeCode, l.likeCodeDesc + order by count(*) desc"; + $r = $sql->query($q); + if ($sql->num_rows($r) == 0){ + echo "Error - unknown like code #".$data[$LC_COL]."
        "; + continue; + } + $row = $sql->fetch_array($r); + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + //echo ""; + echo ""; + } + echo "
        LikecodeDescriptionCurrent PriceNew Price
        ".$data[$LC_COL]."".$row[0]."".$row[1]."
        "; + echo ""; + + fclose($fp); + unlink($fn); + +} +else if (isset($_POST['likecode'])){ + $likecodes = $_POST['likecode']; + $prices = $_POST['price']; + //$scales = $_POST['scale']; + + echo "Peforming updates
        "; + for ($i = 0; $i < count($likecodes); $i++){ + $q = "update products as p left join upcLike as u on p.upc=u.upc + SET normal_price=".trim($prices[$i],' $').", modified=".$sql->now()." + where u.likeCode=".$likecodes[$i]; + echo "Setting likecode #".$likecodes[$i]." to $".$prices[$i]."
        "; + $sql->query($q); + + $q2 = "SELECT upc FROM upcLike WHERE likeCode=".$likecodes[$i]; + $r2 = $sql->query($q2); + while($w2 = $sql->fetch_row($r2)) + updateProductAllLanes($w2['upc']); + } +} +else{ +?> + + +Upload Price Sheet + + +
        + +Filename: + +
        + + + diff --git a/fannie/legacy/it/pricefile/local.php b/fannie/legacy/it/pricefile/local.php new file mode 100644 index 000000000..dd28ac4f8 --- /dev/null +++ b/fannie/legacy/it/pricefile/local.php @@ -0,0 +1,102 @@ + + tr.local td { background: #ffffcc; } + "; + echo "Data to import
        "; + echo ""; + echo ""; + echo ""; + echo ""; + while (!feof($fp)){ + $line = fgets($fp); + $data = csv_parser($line); + + if (!is_numeric($data[$LC_COL])) continue; + + $q = "select l.likeCodeDesc + from likeCodes as l where + l.likecode=".$data[$LC_COL]; + $r = $sql->query($q); + if ($sql->num_rows($r) == 0){ + echo "Error - unknown like code #".$data[$LC_COL]."
        "; + continue; + } + $row = $sql->fetch_array($r); + + $local = 'No'; + if (!empty($data[$LOCAL_COL]) && $data[$LOCAL_COL] == 2) $local = '300'; + if (!empty($data[$LOCAL_COL]) && $data[$LOCAL_COL] == 1) $local = 'S.C.'; + + if (!empty($data[$LOCAL_COL])) + echo ""; + else + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        LikecodeDescriptionLocal
        ".$data[$LC_COL]."".$row[0]."
        "; + echo ""; + + fclose($fp); + unlink($fn); + +} +else if (isset($_POST['likecode'])){ + $likecodes = $_POST['likecode']; + $local = $_POST['local']; + + echo "Peforming updates
        "; + for ($i = 0; $i < count($likecodes); $i++){ + $lval = 0; + if ($local[$i] == '300') $lval = 2; + elseif ($local[$i] == 'S.C.') $lval = 1; + $q = "update products as p left join upcLike as u on p.upc=u.upc + set local=$lval + where u.likecode=".$likecodes[$i]; + echo "Setting likecode #".$likecodes[$i]." to local =>".$local[$i]."
        "; + $sql->query($q); + } + + echo "Pushing updates to the lanes
        "; + //$sql->query("exec productsUpdateAll"); +} +else{ +?> + + +Upload Local Sheet + + +Update local status by like code
        +File format: CSV, Likecode in column A, Anything in B if local, blank in B if not +

        +

        + +Filename: + +
        + + + diff --git a/fannie/legacy/it/pricefile/salesBatchLC.php b/fannie/legacy/it/pricefile/salesBatchLC.php new file mode 100644 index 000000000..f2968bc84 --- /dev/null +++ b/fannie/legacy/it/pricefile/salesBatchLC.php @@ -0,0 +1,141 @@ +Data to import
        "; + $typeQ = "select typeDesc,discType from batchType where batchTypeID=".$_POST["batchType"]; + $typeR = $sql->query($typeQ); + $typeW = $sql->fetch_row($typeR); + echo "".$typeW[0]." batch running from "; + echo $_POST["startDate"]." to ".$_POST["endDate"]."
        "; + echo ""; + echo ""; + echo ""; + echo ""; + while (!feof($fp)){ + $line = fgets($fp); + $data = csv_parser($line); + + if (!is_numeric($data[$LC_COL])) continue; + + $q = "select l.likeCodeDesc,min(p.normal_price) from products as p + left join upcLike as u on u.upc=p.upc + left join likeCodes as l on l.likeCode=u.likeCode where + u.likeCode=".$data[$LC_COL]." group by + u.likeCode, l.likeCodeDesc + order by count(*) desc"; + $r = $sql->query($q); + if ($sql->num_rows($r) == 0){ + echo "Error - unknown like code #".$data[$LC_COL]."
        "; + continue; + } + $row = $sql->fetch_array($r); + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        LikecodeDescriptionCurrent PriceSale Price
        ".$data[$LC_COL]."".$row[0]."".$row[1]."
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + fclose($fp); + unlink($fn); + +} +else if (isset($_POST['likecode'])){ + $likecodes = $_POST['likecode']; + $prices = $_POST['price']; + $batchType = $_POST["batchType"]; + $batchName = $_POST["batchName"]; + $startDate = $_POST["startDate"]; + $endDate = $_POST["endDate"]; + $discount = $_POST["discount"]; + + echo "Creating batch
        "; + $createQ = "insert into batches (startDate, endDate, batchName, batchType, discountType, priority) + values ('$startDate','$endDate','$batchName',$batchType,$discount,0)"; + $sql->query($createQ); + $batchID = $sql->insert_id(); + + $ownerQ = "insert into batchowner values ($batchID,'Produce')"; + $sql->query($ownerQ); + + echo "Adding items
        "; + for ($i = 0; $i < count($likecodes); $i++){ + $q = "insert into batchList (upc, batchID, salePrice, active, pricemethod, quantity) + VALUES ('LC".$likecodes[$i]."',$batchID,".ltrim($prices[$i],'$').",1,0,0)"; + echo "Setting likecode #".$likecodes[$i]." on sale for $".$prices[$i]."
        "; + $sql->query($q); + } + + echo "Go to batch page"; +} +else{ +?> + + +Upload Price Sheet + + + + +
        +Create a new sales batch:
        + + + + + + + + + + + + + + + + + + + + +
        Batch typeBatch name
        Start DateEnd Date
        Filename
        + +
        + + + diff --git a/fannie/legacy/it/pricehistory/index.php b/fannie/legacy/it/pricehistory/index.php new file mode 100644 index 000000000..c883b954c --- /dev/null +++ b/fannie/legacy/it/pricehistory/index.php @@ -0,0 +1,184 @@ +query($q); + + echo ""; + echo ""; + echo ""; + if (!isset($_GET['upc'])) + echo ""; + echo ""; + + $prevUPC = ''; + $prevPrice = ''; + $prow = ''; + $currentPrice = ''; + $lastprice = ''; + while ($row = $sql->fetch_array($r)){ + if ($prevUPC != $row['upc']){ + if ($prevUPC != ''){ + echo ""; + echo ""; + $prevPrice = ''; + } + if (!isset($_GET['upc'])){ + $currQ = "select price from products where upc='{$row['upc']}'"; + $currR = $sql->query($currQ); + $currW = $sql->fetch_array($currR); + $currentPrice = $currW[0]; + } + /* + echo ""; + echo ""; + echo ""; + echo ""; + if (!isset($_GET['upc'])) + echo ""; + echo ""; + */ + } + else { + /* eat rows where price didn't change */ + if ($prow["price"] != $row['price']){ + echo ""; + echo ""; + echo ""; + echo ""; + if (!isset($_GET['upc'])) + echo ""; + echo ""; + $lastprice = $row['price']; + } + } + $prevUPC = $row['upc']; + $prow = $row; + } + if ($lastprice != $row['price']){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        UPCDescriptionPriceDateCurrent Price
             
        $row[0]$row[1]$row[2]$row[3]$currentPrice
        $prow[0]$prow[1]$prow[2]$prow[3]$currentPrice
        $prow[0]$prow[1]$prow[2]$prow[3]
        "; +} +else { +?> + + + + + + +
        +Type: UPC + Department + Manufacturer +
        + +
        +UPC:
        +
        + +
        +Department Start:
        +Department End:
        +
        + +
        +Manufacturer:
        + UPC prefix + Manufacturer name
        +
        + +Start Date:
        +End Date:
        + Excel +
        + + + diff --git a/fannie/legacy/it/projects/addnote.php b/fannie/legacy/it/projects/addnote.php new file mode 100755 index 000000000..2e6525d6d --- /dev/null +++ b/fannie/legacy/it/projects/addnote.php @@ -0,0 +1,93 @@ +',$_POST['notes']); + $date = date("y/m/d : H:i:s",time()); + + $q = "insert into project_notes values( + $projID,'$name','$notes','$date')"; + $r = $sql->query($q); + + // get the project description + $nameQ = "select projDesc from projects where projID=$projID"; + $nameR = $sql->query($nameQ); + $row = $sql->fetch_array($nameR); + $projDesc = $row['projDesc']; + + $checkQ = "select * from projects left outer join project_parties + on projects.ITName = project_parties.email + where LCASE(projects.ITName) = LCASE('$name') or + LCASE(project_parties.email) = LCASE('$name') + limit 1"; + $checkR = $sql->query($checkQ); + // check #2 - see if this person is already 'in on' this project + $check2Q = "select * from project_parties where email='$name' and projID=$projID"; + $check2R = $sql->query($check2Q); + // not an IT person so add to interested parties + if ($sql->num_rows($checkR) == 0 && $sql->num_rows($check2R) == 0){ + $partyQ = "insert into project_parties values ($projID,'$name')"; + $partyR = $sql->query($partyQ); + } + + // build email 'to' all interested parties + $q = "select email from project_parties where projID = $projID"; + $r = $sql->query($q); + $to_string = 'it@wholefoods.coop'; + if ($mail == 'all' && $sql->num_rows($r) > 0){ + while($row = $sql->fetch_array($r)){ + $to_string .= ", ".$row[0]."@wholefoods.coop"; + } + } + + // mail notification + $to = "it@wholefoods.coop"; + $subject = "New note: $projDesc"; + $message = wordwrap("A new note has been posted to $projDesc at http://key/it/projects/project.php?projID=$projID", 70); + $message.="\n\n".wordwrap($_POST['notes'], 70); + $headers = "From: automail@wholefoods.coop"; + mail($to_string,$subject,$message,$headers); + + header("Location: project.php?projID=$projID"); +} +else { + $projID = $_GET['projID']; + + require($FANNIE_ROOT.'auth/login.php'); + $user = validateUserQuiet('projects'); + + ?> +
        > + /> + + /> + Posting as
        + + Who are you?
        +
        + +
        + + +
        + diff --git a/fannie/legacy/it/projects/assign.php b/fannie/legacy/it/projects/assign.php new file mode 100644 index 000000000..a89414a36 --- /dev/null +++ b/fannie/legacy/it/projects/assign.php @@ -0,0 +1,19 @@ +query($q); + +header("Location: index.php"); + +?> diff --git a/fannie/legacy/it/projects/complete.php b/fannie/legacy/it/projects/complete.php new file mode 100644 index 000000000..a34504be3 --- /dev/null +++ b/fannie/legacy/it/projects/complete.php @@ -0,0 +1,42 @@ +query($q); + +// build email 'to' all interested parties +$q = "select email from project_parties where projID = $projID"; +$r = $sql->query($q); +$to_string = 'it@wholefoods.coop'; +if ($sql->num_rows($r) > 0){ + while($row = $sql->fetch_array($r)){ + $to_string .= ", ".$row[0]."@wholefoods.coop"; + } +} + + +$descQ = "select projDesc from projects where projID='$projID'"; +$descR = $sql->query($descQ); +$descW = $sql->fetch_array($descR); +$projDesc = $descW[0]; + +// mail notification +$subject = "Completed project: $projDesc"; +$message = wordwrap("The project $projDesc has been marked completed. http://key/it/projects/project.php?projID=$projID", 70); +$headers = "From: automail@wholefoods.coop"; +mail($to_string,$subject,$message,$headers); + +header("Location: index.php"); + +?> diff --git a/fannie/legacy/it/projects/delete.php b/fannie/legacy/it/projects/delete.php new file mode 100644 index 000000000..23040cdff --- /dev/null +++ b/fannie/legacy/it/projects/delete.php @@ -0,0 +1,18 @@ +query($q); + +header("Location: index.php"); + +?> diff --git a/fannie/legacy/it/projects/edit.php b/fannie/legacy/it/projects/edit.php new file mode 100755 index 000000000..5189b2aaf --- /dev/null +++ b/fannie/legacy/it/projects/edit.php @@ -0,0 +1,86 @@ +',$_POST['notes']); + $q = "update projects set + projDesc = '$projDesc', + link = '$link', + priority = $priority, + notes = '$notes' + where projID=$projID"; + $r = $sql->query($q); + + $mails = explode(",",$emaillist); + $q = "delete from project_parties where projID=$projID"; + $r = $sql->query($q); + + foreach ($mails as $m){ + $m = trim($m); + if ($m != ''){ + $q = "insert into project_parties values ($projID,'$m')"; + $r = $sql->query($q); + } + } + + header("Location: project.php?projID=$projID"); +} +else { + $projID = $_GET['projID']; + + $q = "select projDesc, notes, link, priority from projects where projID=$projID"; + $r = $sql->query($q); + + $row = $sql->fetch_array($r); + $olddesc = $row['projDesc']; + $oldnotes = preg_replace('/
        /',"\n",$row['notes']); + $oldlink = $row['link']; + $oldpriority = $row['priority']; + + $emailQ = "select email from project_parties where projID=$projID order by email"; + $emailR = $sql->query($emailQ); + $emaillist = ""; + while ($emailW = $sql->fetch_array($emailR)) + $emaillist .= $emailW[0].", "; + $emaillist = substr($emaillist,0,strlen($emaillist)-2); +?> + +
        > + /> + Project description:
        +
        + Link:
        +    + Priority:
        + Email list:
        +
        + Notes:
        +
        + +
        + diff --git a/fannie/legacy/it/projects/index.php b/fannie/legacy/it/projects/index.php new file mode 100644 index 000000000..684dadf06 --- /dev/null +++ b/fannie/legacy/it/projects/index.php @@ -0,0 +1,52 @@ + +IT Projects + + + +New project

        "; +} +else { + echo "Login to add projects

        "; +} +echo "Report

        "; + +for ($i = 0; $i < 3; $i++){ + echo "

        $n[$i]

        "; + echo ""; + echo ""; + if ($i == 2) + echo ""; + echo ""; + $r = $sql->query($q[$i]); + while ($row = $sql->fetch_array($r)){ + echo ""; + echo ""; + if ($i == 2) + echo ""; + echo ""; + } + echo "
        Project nameIT contactRequest datePriorityComplete date
        $row[0]$row[1]$row[2]$row[4]$row[5]
        "; +} + + +?> + + + diff --git a/fannie/legacy/it/projects/newproject.php b/fannie/legacy/it/projects/newproject.php new file mode 100644 index 000000000..a85481f8a --- /dev/null +++ b/fannie/legacy/it/projects/newproject.php @@ -0,0 +1,88 @@ +',$_POST['notes']); + $status = 0; + + $q = "select max(projID) from projects"; + $r = $sql->query($q); + $row = $sql->fetch_array($r); + $projID = $row[0] + 1; + $date = date("Y-m-d"); + if(isset($_POST['party'])){ + foreach($_POST['party'] as $key=>$value){ + $insPartyQ = "INSERT INTO project_parties VALUES($projID,'$value')"; + $insPartyR = $sql->query($insPartyQ); + } + } + $q = "insert into projects (projID,projDesc,reqestDate,status,notes,link,priority) + values ($projID,'$projDesc','$date',$status,'$notes','$link',$priority)"; + $r = $sql->query($q); + + $checkQ = "select * from projects where LCASE(ITName) = LCASE('$user') limit 1"; + $checkR = $sql->query($checkQ); + // not an IT person so add to interested parties + if ($sql->num_rows($checkR) == 0){ + $partyQ = "insert into project_parties values ($projID,'$user')"; + $partyR = $sql->query($partyQ); + } + + // build email 'to' all interested parties + $q = "select email from project_parties where projID = $projID"; + $r = $sql->query($q); + $to_string = 'it@wholefoods.coop'; + if ($sql->num_rows($r) > 0){ + while($row = $sql->fetch_array($r)){ + $to_string .= ", ".$row[0]."@wholefoods.coop"; + } + } + + // mail notification + $subject = "New project: $projDesc"; + $message = wordwrap("A new project has been posted at http://key/it/projects/project.php?projID=$projID", 70); + $headers = "From: automail@wholefoods.coop"; + mail($to_string,$subject,$message,$headers); + + header("Location: index.php"); +} +else { +?> +New project +"; + echo "Project name:

        "; + echo "Link:
          "; + echo "Priority:
        "; + echo "Description:
        "; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} + +?> + + + diff --git a/fannie/legacy/it/projects/project.php b/fannie/legacy/it/projects/project.php new file mode 100755 index 000000000..88a0ba0da --- /dev/null +++ b/fannie/legacy/it/projects/project.php @@ -0,0 +1,208 @@ + +Project details + + + + +query($q); + +$row = $sql->fetch_array($r); + +$emailQ = "select email from project_parties where projID=$projID order by email"; +$emailR = $sql->query($emailQ); +$emaillist = ""; +while ($emailW = $sql->fetch_array($emailR)) + $emaillist .= $emailW[0].", "; +$emaillist = substr($emaillist,0,strlen($emaillist)-2); + +require($FANNIE_ROOT.'auth/login.php'); +$admin_user = validateUserQuiet('admin'); +$proj_user = validateUserQuiet('projects'); + +switch($row['status']){ + case 0: + echo "

        STATUS: PENDING

        "; + echo "Project name: {$row['projDesc']}
        "; + echo "Link: {$row['link']}
        "; + echo "Request date: {$row['reqestDate']}
        "; + echo "Email receivers: $emaillist
        "; + echo "Notes:
        {$row['notes']}

        "; + if ($admin_user){ + echo "
        "; + echo ""; + echo ""; + echo "
        "; + echo ""; + echo ""; + echo "

        "; + } + break; + case 1: + echo "

        STATUS: IN PROGRESS

        "; + echo "Project name: {$row['projDesc']}
        "; + echo "IT Contact: {$row['ITName']}
        "; + echo "Link: {$row['link']}
        "; + echo "Request date: {$row['reqestDate']}
        "; + echo "Email receivers: $emaillist
        "; + echo "Notes:
        {$row['notes']}

        "; + if ($admin_user){ + echo "Unassign project
        "; + echo "Completed

        "; + } + break; + case 2: + echo "

        STATUS: COMPLETE

        "; + echo "Project name: {$row['projDesc']}
        "; + echo "IT Contact: {$row['ITName']}
        "; + echo "Link: {$row['link']}
        "; + echo "Request date: {$row['reqestDate']}
        "; + echo "Email receivers: $emaillist
        "; + echo "Notes:
        {$row['notes']}

        "; + if ($admin_user){ + echo "Reopen project

        "; + } + break; +} + +if ($admin_user){ + echo "Edit project
        "; + echo "Delete

        "; +} +//else if ($proj_user){ +// echo "Edit project
        "; +//} +else { + echo ""; + echo "Login to edit this project

        "; +} + +echo "Projects main

        "; + +// notes +$notesQ = "select ITName, stamp, notes from project_notes where projID = $projID + order by stamp DESC"; +$notesR = $sql->query($notesQ); +$num = $sql->num_rows($notesR); +echo "

        Additional notes on this project

        "; +if ($proj_user){ + echo "Add a note for this project
        "; + + $checkQ = "select * from projects left outer join project_parties + on projects.ITName = project_parties.email + where LCASE(projects.ITName) = LCASE('$proj_user') or + LCASE(project_parties.email) = LCASE('$proj_user') + limit 1"; + $checkR = $sql->query($checkQ); + // check #2 - see if this person is already 'in on' this project + $check2Q = "select * from project_parties where email='$proj_user' and projID=$projID"; + $check2R = $sql->query($check2Q); + /* not an IT person or an interested party */ + if ($sql->num_rows($checkR) == 0 && $sql->num_rows($check2R) == 0){ + echo "
        "; + echo "

        Watch this project
        "; + echo "

        "; + } + /* IT doesn't get to stop watching projects */ + else if ($sql->num_rows($checkR) == 0){ + echo "
        "; + echo "

        Stop watching this project
        "; + echo "

        "; + } +} +else { + echo "


        "; + echo "Login
        to add notes to this project

        "; +} +echo "


        "; +for ($i = 0; $i < $num; $i++){ + $row = $sql->fetch_array($notesR); + echo "Posted by {$row['ITName']} on {$row['stamp']}"; + echo "
        {$row['notes']}
        "; + echo "
        "; +} + +if ($proj_user){ + echo "Add a note for this project
        "; + + $checkQ = "select * from projects left outer join project_parties + on projects.ITName = project_parties.email + where LCASE(projects.ITName) = LCASE('$proj_user') or + LCASE(project_parties.email) = LCASE('$proj_user') + limit 1"; + $checkR = $sql->query($checkQ); + // check #2 - see if this person is already 'in on' this project + $check2Q = "select * from project_parties where email='$proj_user' and projID=$projID"; + $check2R = $sql->query($check2Q); + /* not an IT person or an interested party */ + if ($sql->num_rows($checkR) == 0 && $sql->num_rows($check2R) == 0){ + echo "
        "; + echo "

        Watch this project
        "; + echo "

        "; + } + /* IT doesn't get to stop watching projects */ + else if ($sql->num_rows($checkR) == 0){ + echo "
        "; + echo "

        Stop watching this project
        "; + echo "

        "; + } +} +else { + echo "


        "; + echo "Login
        to add notes to this project

        "; +} +echo "Projects main

        "; + +?> + + + diff --git a/fannie/legacy/it/projects/reopen.php b/fannie/legacy/it/projects/reopen.php new file mode 100644 index 000000000..973375e47 --- /dev/null +++ b/fannie/legacy/it/projects/reopen.php @@ -0,0 +1,18 @@ +query($q); + +header("Location: index.php"); + +?> diff --git a/fannie/legacy/it/projects/report.php b/fannie/legacy/it/projects/report.php new file mode 100755 index 000000000..1ed6a8a37 --- /dev/null +++ b/fannie/legacy/it/projects/report.php @@ -0,0 +1,127 @@ + '$date' AND status = 2) or status = 1) + order by status,priority,completeDate desc,priority"; + //echo $q; + $r = $sql->query($q); + echo "
        "; + echo ""; + $count = 0; + echo "

        In progress

        "; + echo "
        Check interested parties:SharonMTM
         BrianaMichael O
         MichaelJustin
         LisaRae Lynn
         XinaFinance
         ColleenFront End
         ShannonBuyers
        "; + echo ""; + $complete_flag = false; + while ($row = $sql->fetch_array($r)){ + if (!$complete_flag && $row['status'] == 2){ + echo "
        DescriptionRequest DatePriorityIncludeNo details
        "; + echo "

        Completed

        "; + echo ""; + echo ""; + $complete_flag = true; + } + echo ""; + echo ""; + echo ""; + echo ""; + if ($complete_flag) + echo ""; + echo ""; + echo ""; + //if(!$complete_flag){ + echo " checked "; + //} + echo "/>"; + echo ""; + if($complete_flag){ + echo " checked "; + } + echo "/>"; + $count++; + } + echo "
        DescriptionRequest DateComplete DatePriorityIncludeNo details
        {$row['projDesc']}{$row['reqestDate']}{$row['completeDate']}{$row['priority']}
        "; + echo "
        "; + echo ""; + echo ""; + echo ""; +} +/* + read the post arguments into arrays + print the project is its include is checked + include the details if its details ISN'T checked + (including details is the default) +*/ +else if (isset($_POST['proj0'])){ + $projID = array(); + $include = array(); + $details = array(); + $count = 0; + while (isset($_POST['proj'.$count])){ + $projID[$count] = $_POST['proj'.$count]; + $include[$count] = $_POST['include'.$count]; + $details[$count] = $_POST['details'.$count]; + $count++; + } + $name = $_POST['name']; + $date = $_POST['date']; + echo "

        Project report for $name

        "; + echo "
        "; + for ($i = 0; $i < count($projID); $i++){ + if ($include[$i]){ + $q = "select projDesc,reqestDate,status,priority,completeDate,notes from projects where projID = $projID[$i] order by priority"; + $r = $sql->query($q); + $row = $sql->fetch_array($r); + echo "Project: {$row['projDesc']}
        "; + echo "Request date: {$row['reqestDate']} Priority: {$row['priority']}
        "; + if ($row['status'] == 2) + echo "Complete date: {$row['completeDate']}
        "; + echo $row["notes"]."
        "; + if (!$details[$i]){ + echo "Notes:
        "; + $notesQ = "select ITName, stamp, notes from project_notes where projID = $projID[$i] + AND stamp > '$date' order by stamp DESC"; + //echo $notesQ; + $notesR = $sql->query($notesQ); + $num = $sql->num_rows($notesR); + if ($num > 0){ + echo "
        Additional notes on this project:
        "; + for ($j = 0; $j < $num; $j++){ + $row = $sql->fetch_array($notesR); + echo "Posted by {$row['ITName']} on {$row['stamp']}"; + echo "
        {$row['notes']}
        "; + } + } + } + echo "
        "; + } + } +} +else { + echo "
        \n"; + echo "\n"; + echo "
        Start Date: "; + echo "\n"; + echo "
        "; +} + +?> diff --git a/fannie/legacy/it/projects/unassign.php b/fannie/legacy/it/projects/unassign.php new file mode 100644 index 000000000..ab7dc0561 --- /dev/null +++ b/fannie/legacy/it/projects/unassign.php @@ -0,0 +1,18 @@ +query($q); + +header("Location: index.php"); + +?> diff --git a/fannie/legacy/it/projects/watch.php b/fannie/legacy/it/projects/watch.php new file mode 100644 index 000000000..63b9cb0eb --- /dev/null +++ b/fannie/legacy/it/projects/watch.php @@ -0,0 +1,21 @@ +query($q); + echo "

        Stop watching this project
        "; + break; + case 'no': + $q = "delete from project_parties where projID = $projID and email = '$user'"; + $r = $sql->query($q); + echo "

        Watch this project
        "; + break; +} + +?> diff --git a/fannie/legacy/it/receipt.php b/fannie/legacy/it/receipt.php new file mode 100644 index 000000000..67ed2f3a3 --- /dev/null +++ b/fannie/legacy/it/receipt.php @@ -0,0 +1,102 @@ +query($clearQ); + + for ($i = 0; $i < count($hs); $i++){ + $q = "insert into receipt values ('$hs[$i]',$i,'header')"; + $r = $sql->query($q); + } + + for ($i = 0; $i < count($fs); $i++){ + $q = "insert into receipt values ('$fs[$i]',$i,'footer')"; + $r = $sql->query($q); + } + + foreach ($FANNIE_LANES as $lane){ + $sql->add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw']); + $ins = "INSERT INTO customReceipt"; + $sel = "SELECT * FROM receipt"; + $sql->query("TRUNCATE TABLE customReceipt",$lane['op']); + $sql->transfer($FANNIE_OP_DB,$sel,$lane['op'],$ins); + } +} + +$headerQ = "select text from receipt where type='header' order by seq"; +$headerR = $sql->query($headerQ); +$headers = array(); +$headercount = 0; +while($row = $sql->fetch_array($headerR)){ + $headers[$headercount++] = $row[0]; +} + +$footerQ = "select text from receipt where type='footer' order by seq"; +$footerR = $sql->query($footerQ); +$footers = array(); +$footercount = 0; +while($row = $sql->fetch_array($footerR)){ + $footers[$footercount++] = $row[0]; +} + +echo "

        "; +echo "Current Headers"; +echo ""; +echo ""; +for ($i = 0; $i < $headercount; $i++){ + echo ""; + echo ""; + echo ""; + echo ""; +} +echo ""; +echo ""; +echo ""; +echo "
        TextDelete
        NEW

        "; + +echo "Current Footers"; +echo ""; +echo ""; +for ($i = 0; $i < $footercount; $i++){ + echo ""; + echo ""; + echo ""; + echo ""; +} +echo ""; +echo ""; +echo ""; +echo "
        TextDelete
        NEW

        "; +echo ""; + +?> + + diff --git a/fannie/legacy/it/recipizer/conversions.txt b/fannie/legacy/it/recipizer/conversions.txt new file mode 100755 index 000000000..838ac6e6d --- /dev/null +++ b/fannie/legacy/it/recipizer/conversions.txt @@ -0,0 +1,46 @@ +tsp fl oz 0.166666667 +tsp T 0.333333333 +tsp cup 0.0208333333 +tsp pint 0.0104166667 +tsp quart 0.00520833333 +tsp gallon 0.00130208333 +T tsp 3 +T fl oz 0.5 +T cup 0.0625 +T pint 0.03125 +T quart 0.015625 +T gallon 0.00390625 +fl oz tsp 6 +fl oz T 2 +fl oz cup 0.125 +fl oz pint 0.0625 +fl oz quart 0.03125 +fl oz gallon 0.0078125 +cup tsp 48 +cup T 16 +cup fl oz 8 +cup pint 0.5 +cup quart 0.25 +cup gallon 0.0625 +pint tsp 96 +pint T 32 +pint fl oz 16 +pint cup 2 +pint quart 0.5 +pint gallon 0.125 +quart tsp 192 +quart T 64 +quart fl oz 32 +quart cup 4 +quart pint 2 +quart gallon 0.25 +gallon tsp 768 +gallon T 256 +gallon fl oz 128 +gallon cup 16 +gallon pint 8 +gallon quart 4 +oz lbs 0.0625 +lbs oz 16 +each each 1 + diff --git a/fannie/legacy/it/recipizer/dbconnect.php b/fannie/legacy/it/recipizer/dbconnect.php new file mode 100755 index 000000000..34ab6b3d9 --- /dev/null +++ b/fannie/legacy/it/recipizer/dbconnect.php @@ -0,0 +1,10 @@ + diff --git a/fannie/legacy/it/recipizer/fraction.py b/fannie/legacy/it/recipizer/fraction.py new file mode 100755 index 000000000..b194602ce --- /dev/null +++ b/fannie/legacy/it/recipizer/fraction.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +import math + +class fraction: + error = 6 + + def __init__(self,w=0,n=0,d=1): + self.numerator = n + self.denominator = d + self.whole = w + + def parseDecimal(self,decimal): + (f,w) = math.modf(decimal) + self.whole = int(w) + + n = 1 + d = 1 + f = round(f,self.error) + error = 1 * (10 ** (-1*self.error)) + while round(math.fabs(float(self.numerator)/self.denominator - f),self.error) > error: + self.numerator = 0 + self.denominator = 1 + d += 1 + frac = fraction(0,n,d) + while round(float(self.numerator)/self.denominator + float(n)/d,self.error) <= f + error: + self.add(frac) + + if d > 100: + print "APPROXIMATION ERROR" + break; + + print self.toStr() + + + def add(self,frac): + if self.denominator == frac.denominator: + self.numerator += frac.numerator + else: + self.numerator = self.numerator*frac.denominator + frac.numerator*self.denominator + self.denominator = self.denominator*frac.denominator + + def reduce(self): + for i in range(self.numerator,0,-1): + if self.numerator % i == 0 and self.denominator % i == 0: + self.numerator /= i + self.denominator /= i + break + + def toStr(self): + return str(self.whole) + " " + str(self.numerator) + "/" + str(self.denominator) + \ No newline at end of file diff --git a/fannie/legacy/it/recipizer/images/LogoBig.gif b/fannie/legacy/it/recipizer/images/LogoBig.gif new file mode 100644 index 000000000..97fae1023 Binary files /dev/null and b/fannie/legacy/it/recipizer/images/LogoBig.gif differ diff --git a/fannie/legacy/it/recipizer/images/b_down.png b/fannie/legacy/it/recipizer/images/b_down.png new file mode 100644 index 000000000..41d33bd54 Binary files /dev/null and b/fannie/legacy/it/recipizer/images/b_down.png differ diff --git a/fannie/legacy/it/recipizer/images/b_drop.png b/fannie/legacy/it/recipizer/images/b_drop.png new file mode 100644 index 000000000..6fc4d3b20 Binary files /dev/null and b/fannie/legacy/it/recipizer/images/b_drop.png differ diff --git a/fannie/legacy/it/recipizer/images/b_edit.png b/fannie/legacy/it/recipizer/images/b_edit.png new file mode 100644 index 000000000..05711a094 Binary files /dev/null and b/fannie/legacy/it/recipizer/images/b_edit.png differ diff --git a/fannie/legacy/it/recipizer/images/b_up.png b/fannie/legacy/it/recipizer/images/b_up.png new file mode 100644 index 000000000..2db3acec6 Binary files /dev/null and b/fannie/legacy/it/recipizer/images/b_up.png differ diff --git a/fannie/legacy/it/recipizer/images/tomatoman.png b/fannie/legacy/it/recipizer/images/tomatoman.png new file mode 100644 index 000000000..be59753a7 Binary files /dev/null and b/fannie/legacy/it/recipizer/images/tomatoman.png differ diff --git a/fannie/legacy/it/recipizer/index.css b/fannie/legacy/it/recipizer/index.css new file mode 100755 index 000000000..377180479 --- /dev/null +++ b/fannie/legacy/it/recipizer/index.css @@ -0,0 +1,49 @@ +#left { + position: absolute; + left: 5px; + width: 13em; + padding: 0.2em; + margin-top: 0.3em; + border: solid black 1px; +} + +body { + background: url(images/LogoBig.gif); + background-repeat: no-repeat; +} + +a { + color: blue; + text-decoration: none; +} + +form { + display: inline; +} + +img { + border: none; +} + +#right { + position: absolute; + left: 14em; + padding: 0.2em; + width: 40em; + height: 200px; + background: url(images/tomatoman.png); + background-repeat: no-repeat; + background-position: top right; +} + +#top { + width: 95%; + padding: 0.2em; + left: 5px; + border: solid black 1px; + font-size: 120%; +} + +#ingredientSelect { + visibility: hidden; +} diff --git a/fannie/legacy/it/recipizer/index.js b/fannie/legacy/it/recipizer/index.js new file mode 100755 index 000000000..2ca79813f --- /dev/null +++ b/fannie/legacy/it/recipizer/index.js @@ -0,0 +1,482 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'addCategory': + document.getElementById('left').innerHTML = array[1]; + document.getElementById('right').innerHTML = "Category added"; + break; + case 'viewRecipes': + case 'addRecipe': + case 'copyRecipe': + case 'displayRecipe': + case 'deleteRecipe': + document.getElementById('right').innerHTML = array[1]; + break; + case 'writeField': + case 'writeInfo': + case 'savePrice': + case 'changeCat': + break; + case 'saveNewStep': + case 'saveStep': + case 'deleteStep': + document.getElementById('recipesteps').innerHTML = array[1]; + break; + case 'saveNewIngredient': + case 'saveIngredient': + case 'deleteIngredient': + document.getElementById('recipeingredients').innerHTML = array[1]; + break; + case 'moveUp': + case 'moveDown': + document.getElementById(array[1]).innerHTML = array[2]; + break; + case 'remargin': + document.getElementById('recipecurrentmargin').innerHTML = array[1]; + break; + case 'autoprice': + document.getElementById('recipeprice').innerHTML = array[1]; + document.getElementById('recipecurrentmargin').innerHTML = array[2]; + break; + case 'restatus': + document.getElementById('recipestatus').innerHTML = array[1]; + break; + case 'getcats': + document.getElementById('recipecategory').innerHTML = array[1]; + break; + case 'copyform': + document.getElementById('right').innerHTML = array[1]; + document.getElementById('name').focus(); + break; + default: + alert(response); + } + } +} + +/* display a form to input a new category */ +function newCategory(){ + var content = ""; + content += "New category name:

        "; + content += "" + content += "

        "; + document.getElementById('right').innerHTML = content; + document.getElementById('name').focus(); +} + +/* check if the category is blank, then submit the request */ +function addCategory(){ + var category = document.getElementById('name').value; + if (category == ''){ + alert('Category name cannot be blank'); + } + else { + phpSend('addCategory&newCategory='+category) + } +} + +/* wrapper for sending view request */ +function viewRecipes(id){ + phpSend('viewRecipes&catID='+id); +} + +/* global definition of units select box @ loadtime */ +var unitSelect = ''; + +/* form for a new recipe */ +function newRecipe(id){ + var content = "
        "; + content += ""; + content += ""; + content += ""; + content += ""; + content += ""; + content += ""; + content += ""; + content += "
        Name
        UPC
        Desired Margin
        Servings
        Shelf Life
        "; + content += "
        "; + document.getElementById('right').innerHTML = content; + document.getElementById('name').focus(); +} + +function copyRecipe(id){ + phpSend("copyform&id="+id); +} + +/* check blank fields and add the new recipe */ +function addRecipe(){ + var name = document.getElementById('name').value; + var upc = document.getElementById('upc').value; + var margin = document.getElementById('margin').value; + var servings = document.getElementById('servings').value; + var shelflife = document.getElementById('shelflife').value; + var catID = document.getElementById('catID').value; + if (name == '' || margin == ''){ + alert("Name and margin must not be blank"); + } + else { + phpSend('addRecipe&name='+name+'&upc='+upc+'&margin='+margin+'&servings='+servings+'&shelflife='+shelflife+'&catID='+catID); + } +} + +function addCopy(){ + var newname = document.getElementById('name').value; + var id = document.getElementById('tocopy').value; + phpSend('copyRecipe&id='+id+'&name='+newname); +} + +/* wrapper for displaying recipe */ +function displayRecipe(id){ + phpSend('displayRecipe&id='+id); +} + +/* change one of the main recipe fields (margin,name,upc) + to an edit dialog willed with current value */ +function editRecipeField(field){ + var value = document.getElementById('hrecipe'+field).value; + var content = "
        "; + content += " "; + content += ""; + content += "
        "; + document.getElementById('recipe'+field).innerHTML = content; + document.getElementById(field).focus(); +} + +/* saves on of the main recipe fields and reverts it to the + normal display style */ +function setRecipeField(field){ + var newvalue = document.getElementById(field).value; + var content = " "+newvalue+" "; + content += ""; + content += ""; + content += ""; + document.getElementById('recipe'+field).innerHTML = content; + + var id = document.getElementById('recipeID').value; + phpSend('writeField&id='+id+'&field='+field+'&value='+newvalue); +} + +/* append a form to the end of the step list for adding a new one */ +function addStep(){ + var content = document.getElementById('recipesteps').innerHTML; + var stepscount = document.getElementById('stepscount').value; + stepscount++; + content += "
        "; + content += ""; + content += "
        "; + content += ""; + content += "

        "; + + document.getElementById('stepscount').value = stepscount; + document.getElementById('recipesteps').innerHTML = content; + document.getElementById('step'+stepscount).focus(); +} + +/* save the new step */ +function saveNewStep(num){ + var id = document.getElementById('recipeID').value; + var ord = document.getElementById('ord'+num).value; + var step = document.getElementById('step'+num).value; + + phpSend('saveNewStep&id='+id+'&ord='+ord+'&step='+step); +} + +/* change a step in the list to an edit box */ +function editStep(num){ + var value = document.getElementById('steplist'+num).innerHTML; + var content = "
        "; + content += ""; + content += "
        "; + content += ""; + content += "
        "; + document.getElementById('steplist'+num).innerHTML = content; + document.getElementById('step'+num).focus(); +} + +/* save an edited step */ +function saveStep(num){ + var id = document.getElementById('recipeID').value; + var ord = document.getElementById('ord'+num).value; + var step = document.getElementById('step'+num).value; + + phpSend('saveStep&id='+id+'&ord='+ord+'&step='+step); +} + +/* delete a step */ +function deleteStep(num){ + if (confirm("Delete this step?")){ + var id = document.getElementById('recipeID').value; + phpSend('deleteStep&id='+id+'&ord='+num); + } +} + +/* move an item in the list up, if possible */ +function moveUp(table,num){ + if (num <= 1){ + return false; + } + var id = document.getElementById('recipeID').value; + phpSend('moveUp&id='+id+'&table='+table+'&ord='+num); + return true; +} + +/* move an item in the list down, if possible */ +function moveDown(table,num){ + var count = document.getElementById(table+'count').value; + if (num == count){ + return false; + } + var id = document.getElementById('recipeID').value; + phpSend('moveDown&id='+id+'&table='+table+'&ord='+num); + return true; +} + +/* toggle 'info' area to edit */ +function editInfo(id){ + var value = document.getElementById('infovalue').innerHTML; + var content = "
        "; + content += "
        "; + content += ""; + content += "
        "; + document.getElementById('recipeinfo').innerHTML = content; + document.getElementById('editinfo').focus(); +} + +/* save changes to info */ +function writeInfo(id){ + var newvalue = document.getElementById('editinfo').value; + + var content = "
        "+newvalue+"
        "; + content += "
        ( Edit )"; + + document.getElementById('recipeinfo').innerHTML = content; + + phpSend('writeInfo&id='+id+'&info='+newvalue); +} + +/* display interface for adding an ingredient */ +function addIngredient(){ + var content = document.getElementById('recipeingredients').innerHTML; + var ingredientcount = document.getElementById('ingredientlistcount').value; + ingredientcount++; + var selects = document.getElementById('ingredientSelect').innerHTML; + content += "
        "; + content += ""; + content += ""; + content += ""; + content += ""; + content += " Prep: "; + content += ""; + content += "

        "; + + document.getElementById('ingredientlistcount').value = ingredientcount; + document.getElementById('recipeingredients').innerHTML = content; + document.getElementById('ingredientMeasure'+ingredientcount).focus(); +} + +/* insert a new ingredient into the ingredient list */ +function saveNewIngredient(num){ + var id = document.getElementById('recipeID').value; + var ord = document.getElementById('ingredientord'+num).value; + var ingredientID = document.getElementById('ingredientID'+num).value; + var measure = document.getElementById('ingredientMeasure'+num).value; + var units = document.getElementById('ingredientUnits'+num).value; + var prep = document.getElementById('ingredientPrep'+num).value; + + phpSend('saveNewIngredient&id='+id+'&ord='+ord+'&ingredientID='+ingredientID+'&measure='+measure+'&units='+units+'&prep='+prep); +} + +/* bring up an edit form for an ingredient */ +function editIngredient(num){ + var name = document.getElementById('ingredientname'+num).value; + var measure = 0; + var units = '0'; + if (name != "LABEL"){ + var measure = document.getElementById('ingredientmeasure'+num).innerHTML; + var units = document.getElementById('ingredientunits'+num).innerHTML; + } + var prep = document.getElementById('ingredientprep'+num).innerHTML; + var content = "
        "; + content += ""; + if (name == "LABEL"){ + content += ""; + content += ""; + content += ""; + } + else { + content += ""; + content += ""; + content += ""; + } + content += ""; + content += ""; + content += "
        "; + document.getElementById('ingredientlist'+num).innerHTML = content; + document.getElementById('ingredientPrep'+num).focus(); +} + +/* save changes to the ingredient */ +function saveIngredient(num){ + var id = document.getElementById('recipeID').value; + var ord = document.getElementById('ingredientord'+num).value; + var ingredientID = document.getElementById('ingredientID'+num).value; + var measure = document.getElementById('ingredientMeasure'+num).value; + var units = document.getElementById('ingredientUnits'+num).value; + var prep = document.getElementById('ingredientPrep'+num).value; + + phpSend('saveIngredient&id='+id+'&ord='+ord+'&ingredientID='+ingredientID+'&measure='+measure+'&units='+units+'&prep='+prep); +} + +/* remove an ingredient from the list */ +function deleteIngredient(num){ + if (confirm("Delete this ingredient from this recipe?")){ + var id = document.getElementById('recipeID').value; + phpSend('deleteIngredient&id='+id+'&ord='+num); + } +} + +/* bring up edit interface for price */ +function editPrice(){ + var id = document.getElementById('recipeID').value; + var price = document.getElementById('hrecipeprice').value; + var content = "
        "; + content += "Price: "; + content += " "; + content += ""; + document.getElementById('recipeprice').innerHTML = content; +} + +/* save price changes */ +function savePrice(id){ + var newprice = document.getElementById('price').value; + var content = "Price: "+newprice+" ["; + content += "Edit"; + content += " ] "; + + phpSend('savePrice&id='+id+'&price='+newprice); + + document.getElementById('recipeprice').innerHTML = content; + +} + +/* re-calculate the current margin */ +function remargin(){ + var id = document.getElementById('recipeID').value; + phpSend('remargin&id='+id); +} + +/* assign a price based on desired margin */ +function autoprice(){ + var id = document.getElementById('recipeID').value; + phpSend('autoprice&id='+id); +} + +/* create an input box to add a 'label' to the ingredient list + a label is just an ingredient with id 0 and prep filled in with + the label text (so it can be manipulated like a label within + the list) +*/ +function addLabel(){ + var content = document.getElementById('recipeingredients').innerHTML; + var ingredientcount = document.getElementById('ingredientlistcount').value; + ingredientcount++; + + content += ""; + content += ""; + content += ""; + content += ""; + content += ""; + content += " Label: "; + content += ""; + content += "

        "; + + document.getElementById('ingredientlistcount').value = ingredientcount; + document.getElementById('recipeingredients').innerHTML = content; + document.getElementById('ingredientMeasure'+ingredientcount).focus(); +} + +function restatus(id){ + phpSend('restatus&id='+id); +} + +function changeCategory(current){ + phpSend('getcats¤t='+current); +} + +function updateCategory(){ + var id = document.getElementById('recipeID').value; + var cat = document.getElementById('categoryselect').value; + + var content = cat+" "; + content += ""; + + document.getElementById('recipecategory').innerHTML = content; + phpSend('changeCat&id='+id+'&cat='+cat); +} + +function deleteRecipe(name){ + if (confirm("Are you sure you want to delete \""+name+"\"?")){ + var id = document.getElementById('recipeID').value; + phpSend("deleteRecipe&id="+id); + } +} diff --git a/fannie/legacy/it/recipizer/index.php b/fannie/legacy/it/recipizer/index.php new file mode 100644 index 000000000..5f72fe1ba --- /dev/null +++ b/fannie/legacy/it/recipizer/index.php @@ -0,0 +1,751 @@ +query($idQ); + $idRow = $sql->fetch_array($idR); + $id = $idRow[0]+1; + + $insQ = "insert into categories values ($id,'$newCat')"; + $insR = $sql->query($insQ); + $out .= getCategories(); + break; + case 'viewRecipes': + $catID = $_GET['catID']; + $out .= getRecipes($catID); + break; + case 'addRecipe': + $name = $_GET['name']; + $upc = $_GET['upc']; + $margin = $_GET['margin']; + $servings = 0; + if (!empty($_GET['servings'])) + $servings = $_GET['servings']; + $shelflife = 0; + if (!empty($_GET['shelflife'])) + $shelflife = $_GET['shelflife']; + $catID = $_GET['catID']; + + $idQ = "select max(id) from recipes"; + $idR = $sql->query($idQ); + $idRow = $sql->fetch_array($idR); + $id = $idRow[0]+1; + + $insQ = "insert into recipes values ($id,'$name','$upc',0,$margin,$catID,$servings,0,$shelflife)"; + $insR = $sql->query($insQ); + + $insQ = "insert into info values ($id,'')"; + $insR = $sql->query($insQ); + + $out .= displayRecipe($id); + break; + case 'displayRecipe': + $id = $_GET['id']; + $out .= displayRecipe($id); + break; + case 'writeField': + $id = $_GET['id']; + $field = $_GET['field']; + $value = $_GET['value']; + + $upQ = "update recipes set $field='$value' where id=$id"; + $upR = $sql->query($upQ); + break; + case 'saveNewStep': + $id = $_GET['id']; + $ord = $_GET['ord']; + $step = $_GET['step']; + + $insQ = "insert into steps values ($id,$ord,'$step')"; + $insR = $sql->query($insQ); + + $out .= getSteps($id); + break; + case 'saveStep': + $id = $_GET['id']; + $ord = $_GET['ord']; + $step = $_GET['step']; + + $upQ = "update steps set step='$step' where ord=$ord and recipeID=$id"; + $upR = $sql->query($upQ); + + $out .= getSteps($id); + break; + case 'deleteStep': + $id = $_GET['id']; + $ord = $_GET['ord']; + + $delQ = "delete from steps where recipeID=$id and ord=$ord limit 1"; + $delR = $sql->query($delQ); + + fixOrder('steps',$ord); + + $out .= getSteps($id); + break; + case 'moveUp': + $id = $_GET['id']; + $table = $_GET['table']; + $ord = $_GET['ord']; + $swap = $ord-1; + + $openQ = "update $table set ord=-1*$swap where ord=$swap and recipeID=$id"; + $openR = $sql->query($openQ); + + $fillQ = "update $table set ord=$swap where ord=$ord and recipeID=$id"; + $fillR = $sql->query($fillQ); + + $finishQ = "update $table set ord=$ord where ord=-1*$swap and recipeID=$id"; + $finishR = $sql->query($finishQ); + + if ($table == 'steps'){ + $out .= "recipesteps`"; + $out .= getSteps($id); + } + else if ($table == 'ingredientlist'){ + $out .= "recipeingredients`"; + $out .= getIngredients($id); + } + break; + case 'moveDown': + $id = $_GET['id']; + $table = $_GET['table']; + $ord = $_GET['ord']; + $swap = $ord+1; + + $openQ = "update $table set ord=-1*$swap where ord=$swap and recipeID=$id"; + $openR = $sql->query($openQ); + + $fillQ = "update $table set ord=$swap where ord=$ord and recipeID=$id"; + $fillR = $sql->query($fillQ); + + $finishQ = "update $table set ord=$ord where ord=-1*$swap and recipeID=$id"; + $finishR = $sql->query($finishQ); + + if ($table == 'steps'){ + $out .= "recipesteps`"; + $out .= getSteps($id); + } + else if ($table == 'ingredientlist'){ + $out .= "recipeingredients`"; + $out .= getIngredients($id); + } + break; + case 'writeInfo': + $id = $_GET['id']; + $info = $_GET['info']; + + $upQ = "update info set info='$info' where recipeID = $id"; + $upR = $sql->query($upQ); + break; + case 'saveNewIngredient': + $id = $_GET['id']; + $ord = $_GET['ord']; + $ingredientID = $_GET['ingredientID']; + $measure = $_GET['measure']; + $units = $_GET['units']; + $prep = $_GET['prep']; + + $insQ = "insert into ingredientlist values ($id,$measure,'$units',$ingredientID,$ord,'$prep')"; + $insR = $sql->query($insQ); + + $out .= getIngredients($id); + break; + case 'saveIngredient': + $id = $_GET['id']; + $ord = $_GET['ord']; + $ingredientID = $_GET['ingredientID']; + $measure = $_GET['measure']; + $units = $_GET['units']; + $prep = $_GET['prep']; + + $upQ = "update ingredientlist set ingredientID=$ingredientID,measure=$measure,unit='$units',prep='$prep' where recipeID=$id and ord=$ord"; + $upR = $sql->query($upQ); + + $out .= getIngredients($id); + break; + case 'deleteIngredient': + $id = $_GET['id']; + $ord = $_GET['ord']; + + $delQ = "delete from ingredientlist where recipeID=$id and ord=$ord limit 1"; + $delR = $sql->query($delQ); + + fixOrder('ingredientlist',$ord); + + $out .= getIngredients($id); + break; + case 'savePrice': + $id = $_GET['id']; + $price = $_GET['price']; + + $upQ = "update recipes set price=$price where id=$id"; + $upR = $sql->query($upQ); + + $upcQ = "select upc from recipes where id=$id"; + $upcR = $sql->query($upcQ); + $upcW = $sql->fetch_array($upcR); + $upc = $upcW[0]; + + setPrice($upc,$price); + break; + case 'remargin': + $id = $_GET['id']; + + $current_margin = margin($id); + + $upQ = "update recipes set current_margin=$current_margin where id=$id"; + $upR = $sql->query($upQ); + + $fetchQ = "select margin from recipes where id=$id"; + $fetchR = $sql->query($fetchQ); + $fetchW = $sql->fetch_array($fetchR); + + if ($current_margin < $fetchW[0]) + $out .= currentMarginDiv($current_margin,'#bb0000'); + else + $out .= currentMarginDiv($current_margin,'#00bb00'); + break; + case 'autoprice': + $id = $_GET['id']; + + // get info + $fetchQ = "select price,current_margin,margin,servings,upc from recipes where id=$id"; + $fetchR = $sql->query($fetchQ); + $fetchW = $sql->fetch_array($fetchR); + + // calculate a price to meet desired margin + $recipe_cost = $fetchW['price'] - $fetchW['current_margin']; + $newprice = $recipe_cost + $fetchW['margin']; + $newprice = (string)$newprice; + $len = strlen($newprice); + $newprice[$len-1] = '9'; + + // update the price + $upQ = "update recipes set price=$newprice where id=$id"; + $upR = $sql->query($upQ); + setPrice($fetchW['upc'],$newprice); + + // re-do current margin + $newcurrentmargin = margin($id); + $upQ = "update recipes set current_margin=$newcurrentmargin where id=$id"; + $upR = $sql->query($upQ); + + // new price field + $out .= "Price: $newprice [ "; + $out .= ""; + $out .= " ]"; + $out .= ""; + + // extra separator + $out .= "`"; + + // new current margin field + if ($newcurrentmargin < $fetchW['margin']) + $out .= currentMarginDiv($newcurrentmargin,'#bb0000'); + else + $out .= currentMarginDiv($newcurrentmargin,'#00bb00'); + + break; + case 'restatus': + $id = $_GET['id']; + $out .= getStatus($id); + break; + case 'getcats': + $current = $_GET['current']; + $q = "select name from categories order by name"; + $r = $sql->query($q); + + $out .= ""; + $out .= ""; + break; + case 'changeCat': + $id = $_GET['id']; + $cat = $_GET['cat']; + + $q = "select id from categories where name='$cat'"; + $catID = array_pop($sql->fetch_array($sql->query($q))); + + $q = "update recipes set categoryID=$catID where id=$id"; + $r = $sql->query($q); + break; + case 'copyform': + $catID = $_GET['id']; + + $q = "select name,id from recipes where categoryID=$catID order by name"; + $r = $sql->query($q); + + $out .= "
        "; + $out .= ""; + $out .= ""; + $out .= ""; + $out .= "
        Name
        Recipe to copy
        "; + $out .= "
        "; + break; + case 'copyRecipe': + $id = $_GET['id']; + $name = $_GET['name']; + $newid = copyRecipe($id,$name); + $out .= displayRecipe($newid); + break; + case 'deleteRecipe': + $id = $_GET['id']; + + $delQ1 = "delete from recipes where id=$id"; + $delR1 = $sql->query($delQ1); + $delQ2 = "delete from ingredientList where recipeID=$id"; + $delR2 = $sql->query($delQ2); + $delQ3 = "delete from steps where recipeID=$id"; + $delR3 = $sql->query($delQ3); + $delQ4 = "delete from info where recipeID=$id"; + $delR4 = $sql->query($delQ4); + + $out .= "The recipe has been deleted"; + break; + } + + + // send output and return (so ajax doesn't get all the html') + print $out; + return; +} + +// returns a list of categories as a string +function getCategories(){ + global $sql; + $ret = "Categories: ( New )"; + $ret .= "
          "; + $q = "select name,id from categories order by name"; + $r = $sql->query($q); + if ($sql->num_rows($r) != 0){ + while ($w = $sql->fetch_array($r)){ + $ret .= "
        • "; + $ret .= $w[0]."
        • "; + } + } + $ret .= "
        "; + + return $ret; +} + +// returns a list of recipes in category with id $id (as a string again) +function getRecipes($id){ + global $sql; + $q = "select name from categories where id=$id"; + $r = $sql->query($q); + $w = $sql->fetch_array($r); + $catName = $w[0]; + + $ret = "Category: ".$catName."
        "; + $ret .= "Recipes: ( New "; + $ret .= ":: Copy"; + $ret .= ")"; + $ret .= "
          "; + $q = "select name,id from recipes where categoryID = $id order by name"; + $r = $sql->query($q); + if ($sql->num_rows($r) != 0){ + while ($w = $sql->fetch_array($r)){ + $ret .= "
        • "; + $ret .= $w[0]."
        • "; + } + } + $ret .= "
        "; + + return $ret; +} + +// gives an html "; + $q = "select distinct output from convertor"; + $r = $sql->query($q); + while ($w = $sql->fetch_array($r)){ + $ret .= ""; + } + $ret .= ""; + + return $ret; +} + +// displays a recipe. this may become 'ze doozy' +function displayRecipe($id){ + global $sql; + $ret = ""; + $q = "select r.name,r.upc,r.margin,r.price,r.servings,r.shelflife,r.current_margin,i.info, + c.name as category + from recipes as r, info as i, categories as c + where r.id=i.recipeID and c.id=r.categoryID and r.id=$id"; + $r = $sql->query($q); + $w = $sql->fetch_array($r); + + $name = $w['name']; + $upc = $w['upc']; + $margin = $w['margin']; + $price = $w['price']; + $servings = $w['servings']; + $shelflife = $w['shelflife']; + $current_margin = $w['current_margin']; + $info = $w['info']; + $category = $w['category']; + + $ret .= ""; + + $ret .= "Name: $name "; + $ret .= ""; + $ret .= " "; + $ret .= ""; + $ret .= ""; + $ret .= "
        "; + + $ret .= "Category: $category "; + $ret .= ""; + $ret .= " "; + $ret .= "
        "; + + $ret .= "\nUPC: $upc "; + $ret .= ""; + $ret .= " "; + $ret .= "
        "; + + $ret .= "
        Price: $price "; + $ret .= ""; + $ret .= " "; + $ret .= "
        "; + + $ret .= "\nServings: $servings "; + $ret .= ""; + $ret .= " "; + $ret .= "
        "; + + $ret .= "\nShelf Life: $shelflife "; + $ret .= ""; + $ret .= " "; + $ret .= "
        "; + + $ret .= "\nDesired Margin: $margin "; + $ret .= ""; + $ret .= " "; + $ret .= "
        "; + + $ret .= "
        "; + if ($current_margin < $margin) + $ret .= currentMarginDiv($current_margin,'#bb0000'); + else + $ret .= currentMarginDiv($current_margin,'#00bb00'); + $ret .= "
        "; + + $ret .= "
        Ingredients"; + $ret .= "
        "; + $ret .= getIngredients($id); + $ret .= "
        "; + $ret .= "( New ingredient ) "; + $ret .= "( New label )"; + + $ret .= "

        Steps:"; + $ret .= "
        "; + $ret .= getSteps($id); + $ret .= "
        "; + $ret .= "( New step )"; + + $ret .= "

        Info:"; + $ret .= "
        "; + $ret .= "
        ".$info."
        "; + $ret .= "
        ( )"; + $ret .= "
        "; + $ret .= "
        Status: "; + $ret .= ""; + $ret .= getStatus($id); + $ret .= " "; + $ret .= "[ Refresh ]"; + + return $ret; +} + +// prints the list of steps +function getSteps($id){ + global $sql; + $ret = ""; + $q = "select step from steps where recipeID = $id order by ord"; + $r = $sql->query($q); + $i = 1; + while ($w = $sql->fetch_array($r)){ + if ($i % 2 != 0) + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + } + $i--; + $ret .= "
        $i."; + $ret .= $w[0]."
        "; + $ret .= ""; + + return $ret; +} + +// get the list of ingredients as a string +function getIngredients($id){ + global $sql; + $ret = ""; + $q = "select i.name,l.measure,l.unit,l.prep from ingredientlist as l + left join ingredients as i on i.id = l.ingredientID + where recipeID = $id order by ord"; + $r = $sql->query($q); + $i = 1; + $numbering = 1; + while ($w = $sql->fetch_array($r)){ + if ($i % 2 != 0) + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + if ($w[0] == 'LABEL'){ + $numbering = 0; + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + $numbering++; + } + $i--; + $ret .= "
         $w[3]$numbering."; + $ret .= "$w[0] - "; + $ret .= "$w[1] "; + $ret .= "$w[2] - "; + $ret .= "$w[3]"; + $ret .= "
        "; + $ret .= ""; + + return $ret; +} + +// fixes the 'ord' column values in the given $table after +// the row with ord $ord was deleted. +// uni-directional; not peak efficient. +function fixOrder($table,$ord){ + global $sql; + $cur = $ord; + $next = $ord+1; + + $maxQ = "select max(ord) from $table"; + $maxR = $sql->query($maxQ); + $maxW = $sql->fetch_array($maxR); + $max = $maxW[0]; + + while ($next <= $max){ + $upQ = "update $table set ord=$cur where ord=$next"; + $upR = $sql->query($upQ); + $cur++; + $next++; + } +} + +// get a select box of available ingredients +function ingredientSelect(){ + global $sql; + $ret = ""; + $fetchQ = "select name,id from ingredients where id > 0 order by name"; + $fetchR = $sql->query($fetchQ); + while ($row = $sql->fetch_array($fetchR)) + $ret .= $row[1].":".$row[0]."|"; + return substr($ret,0,strlen($ret)-1); +} + +// calculate the current margin +function margin($id){ + global $sql; + // get all measurement and cost information + $fetchQ = "select l.measure,l.unit,i.cost,i.volume,i.volumeunit, + i.size,i.sizeunit + from ingredientlist as l left join ingredients as i + on l.ingredientID = i.id where l.recipeID = $id and i.id > 0"; + $fetchR = $sql->query($fetchQ); + + // accumulate cost + $cost = 0.0; + while ($row = $sql->fetch_array($fetchR)){ + $insize = $row['measure']; + $inunit = $row['unit']; + $outsize = $row['volume']; + $outunit = $row['volumeunit']; + $outsize2 = $row['size']; + $outunit2 = $row['sizeunit']; + $item_cost = $row['cost']; + + // if the unit matches the volume size, do nothing + // if it matches the weight size, switch outsize + // to from volume to weight for later calculation + if ($inunit == $outunit2) + $outsize = $outsize2; + elseif ($inunit != $outunit){ + // try as a volume conversion first + $q = "select multiplier from convertor where input = '$outunit' + and output='$inunit'"; + $r = $sql->query($q); + $w = $sql->fetch_array($r); + // if that fails, try a weight conversion + // (one of these 2 is assumed to work) + if ($w[0] == ''){ + $q = "select multiplier from convertor where input = '$outunit2' + and output = '$inunit'"; + $r = $sql->query($q); + $w = $sql->fetch_array($r); + //echo "IN: $outunit2 OUT: $inunit MULT: $w[0]
        "; + $outsize = $outsize2 * $w[0]; + $item_cost *= $w[0]; + } + else { + //echo "IN: $outunit OUT: $inunit MULT: $w[0]
        "; + $outsize *= $w[0]; + $item_cost *= $w[0]; + } + } + $cost += ($insize / $outsize) * $item_cost; + } + + $priceQ = "select price,servings from recipes where id=$id"; + $priceR = $sql->query($priceQ); + $priceW = $sql->fetch_array($priceR); + + $current_margin = $priceW[0] - ($cost / $priceW[1]); + $current_margin = round($current_margin,2); + + return $current_margin; +} + +// create the current margin div with $color text color +function currentMarginDiv($current_margin,$color){ + $ret = "Current Margin: "; + $ret .= "$current_margin"; + $ret .= " [ Refresh ]"; + $ret .= " [ Autoprice ]"; + + return $ret; +} + +// determine allergen status +function getStatus($id){ + global $sql; + $q = "select name from ingredientclasses where id in ( + select s.classID from ingredientlist as l + left join ingredientstatus as s + on s.ingredientID = l.ingredientID + where l.recipeID = $id + group by s.classID having count(*) >= ( + select count(*) from ingredientlist + where recipeID = $id + ) + ) order by name"; + $r = $sql->query($q); + $ret = ''; + while ($w = $sql->fetch_array($r)){ + $ret .= $w[0].", "; + } + + return substr($ret,0,strlen($ret)-2); +} + +function copyRecipe($id,$name){ + global $sql; + $idQ = "select max(id) from recipes"; + $idR = $sql->query($idQ); + $idRow = $sql->fetch_array($idR); + $newid = $idRow[0]+1; + + $recipesQ = "insert into recipes + select $newid,'$name',upc,price,margin,categoryID,servings,current_margin,shelflife + from recipes where id=$id"; + $recipesR = $sql->query($recipesQ); + + $ingredientsQ = "insert into ingredientlist + select $newid,measure,unit,ingredientID,ord,prep + from ingredientlist where recipeID=$id"; + $ingredientsR = $sql->query($ingredientsQ); + + $stepsQ = "insert into steps + select $newid,ord,step from steps where recipeID=$id"; + $stepsR = $sql->query($stepsQ); + + $infoQ = "insert into info + select $newid,info from info where recipeID=$id"; + $infoR = $sql->query($infoQ); + + return $newid; +} + +?> + + +Recipizer::Index + + + + + + +
        + + + +
        + + +
        + +
        + + diff --git a/fannie/legacy/it/recipizer/ingredients.js b/fannie/legacy/it/recipizer/ingredients.js new file mode 100755 index 000000000..c8d7d852e --- /dev/null +++ b/fannie/legacy/it/recipizer/ingredients.js @@ -0,0 +1,177 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'ingredients.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'addIngredient': + document.getElementById('left').innerHTML = array[1]; + break; + case 'viewIngredient': + document.getElementById('right').innerHTML = array[1]; + break; + case 'editName': + document.getElementById('ingredientName').innerHTML = array[1]; + break; + case 'saveName': + case 'saveSize': + case 'saveVolume': + case 'saveCost': + case 'flipOn': + case 'flipOff': + break; + case 'editSize': + document.getElementById('ingredientSize').innerHTML = array[1]; + break; + case 'editVolume': + document.getElementById('ingredientVolume').innerHTML = array[1]; + break; + case 'editCost': + document.getElementById('ingredientCost').innerHTML = array[1]; + break; + default: + alert(response); + } + } +} + +/* input form for a new ingredient */ +function newIngredient(){ + var content = "
        "; + content += ""; + content += ""; + content += ""; + content += ""; + content += ""; + content += "
        Name:
        Weight: "; + content += "
        Volume: "; + content += "
        Cost:
        "; + content += ""; + content += "
        " + document.getElementById('right').innerHTML = content; +} + +/* send form data to the backend for adding */ +function addIngredient(){ + var name = document.getElementById('name').value; + var size = document.getElementById('size').value; + var sizeUnit = document.getElementById('sizeUnit').value; + var volume = document.getElementById('volume').value; + var volumeUnit = document.getElementById('volumeUnit').value; + var cost = document.getElementById('cost').value; + + var str = 'addIngredient&name='+name+'&size='+size+'&sizeUnit='+sizeUnit; + str += '&volume='+volume+'&volumeUnit='+volumeUnit+'&cost='+cost; + phpSend(str); + + var content = 'Ingredient '+name+' added.'; + document.getElementById('right').innerHTML = content; +} + +/* jscript wrapper */ +function viewIngredient(id){ + phpSend('viewIngredient&id='+id); +} + +function editName(id){ + phpSend('editName&id='+id); +} + +function saveName(id){ + var newname = document.getElementById('name'+id).value; + var content = "Name:"+newname+""; + content += "Edit"; + + phpSend('saveName&id='+id+'&name='+newname); + + document.getElementById('ingredientName').innerHTML = content; +} + +function editSize(id){ + phpSend('editSize&id='+id); +} + +function saveSize(id){ + var newsize = document.getElementById('size'+id).value; + var newsizeUnit = document.getElementById('sizeUnit'+id).value; + var content = "Weight:"+newsize+" "+newsizeUnit+""; + content += "Edit"; + + phpSend('saveSize&id='+id+'&size='+newsize+'&sizeUnit='+newsizeUnit); + + document.getElementById('ingredientSize').innerHTML = content; +} + +function editVolume(id){ + phpSend('editVolume&id='+id); +} + +function saveVolume(id){ + var newvolume = document.getElementById('volume'+id).value; + var newvolumeUnit = document.getElementById('volumeUnit'+id).value; + var content = "Volume:"+newvolume+" "+newvolumeUnit+""; + content += "Edit"; + + phpSend('saveVolume&id='+id+'&volume='+newvolume+'&volumeUnit='+newvolumeUnit); + + document.getElementById('ingredientVolume').innerHTML = content; +} + +function editCost(id){ + phpSend('editCost&id='+id); +} + +function saveCost(id){ + var newcost = document.getElementById('cost'+id).value; + var content = "Cost:"+newcost+""; + content += "Edit"; + + phpSend('saveCost&id='+id+'&cost='+newcost); + + document.getElementById('ingredientCost').innerHTML = content; +} + +function flipStatus(id,className,classID){ + var current = document.getElementById(className+classID).checked; + if (current){ + phpSend('flipOn&id='+id+'&class='+classID); + } + else { + phpSend('flipOff&id='+id+'&class='+classID); + } +} diff --git a/fannie/legacy/it/recipizer/ingredients.php b/fannie/legacy/it/recipizer/ingredients.php new file mode 100755 index 000000000..8fb89fb0e --- /dev/null +++ b/fannie/legacy/it/recipizer/ingredients.php @@ -0,0 +1,231 @@ +query($idQ); + $idW = $sql->fetch_array($idR); + $id = $idW[0]+1; + + $insQ = "insert into ingredients values ($id,'$name',$size,'$sizeUnit',$volume,'$volUnit',$cost)"; + //echo $insQ; + $insR = $sql->query($insQ); + + $out .= getIngredients(); + break; + case 'viewIngredient': + $id = $_GET['id']; + $out .= viewIngredient($id); + break; + case 'editName': + $id = $_GET['id']; + $nameQ = "select name from ingredients where id=$id"; + $nameR = $sql->query($nameQ); + $nameW = $sql->fetch_array($nameR); + $name = $nameW[0]; + + $out .= "Name:"; + $out .= "
        "; + $out .= " "; + $out .= ""; + $out .= "
        "; + break; + case 'saveName': + $id = $_GET['id']; + $name = $_GET['name']; + + $upQ = "update ingredients set name='$name' where id=$id"; + $upR = $sql->query($upQ); + break; + case 'editSize': + $id = $_GET['id']; + $sizeQ = "select size,sizeUnit from ingredients where id=$id"; + $sizeR = $sql->query($sizeQ); + $sizeW = $sql->fetch_array($sizeR); + $size = $sizeW[0]; + $sizeUnit = $sizeW[1]; + + $out .= "Weight:"; + $out .= "
        "; + $out .= " "; + $out .= " "; + $out .= " "; + $out .= ""; + $out .= "
        "; + break; + case 'saveCost': + $id = $_GET['id']; + $cost = $_GET['cost']; + + $upQ = "update ingredients set cost=$cost where id=$id"; + $upR = $sql->query($upQ); + break; + case 'flipOn': + $id = $_GET['id']; + $class = $_GET['class']; + + $inQ = "insert into ingredientstatus values ($id,$class)"; + $inR = $sql->query($inQ); + break; + case 'flipOff': + $id = $_GET['id']; + $class = $_GET['class']; + + $delQ = "delete from ingredientstatus where ingredientID=$id and classID=$class"; + $delR = $sql->query($delQ); + break; + } + echo $out; + return; +} + +// returns a list of ingredients as a string +function getIngredients(){ + global $sql; + $ret = "Ingredients: ( New )"; + $ret .= "
          "; + $q = "select name,id from ingredients where id > 0 order by name"; + $r = $sql->query($q); + if ($sql->num_rows($r) != 0){ + while ($w = $sql->fetch_array($r)){ + $ret .= "
        • "; + $ret .= $w[0]."
        • "; + } + } + $ret .= "
        "; + + return $ret; +} + +function viewIngredient($id){ + global $sql; + $fetchQ = "select name,size,sizeUnit,volume,volumeUnit,cost from ingredients where id=$id"; + $fetchR = $sql->query($fetchQ); + $fetchW = $sql->fetch_array($fetchR); + + $ret = ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + $ret .= "
        Name:".$fetchW['name']."Edit
        Weight:".$fetchW['size']." ".$fetchW['sizeUnit']."Edit
        Volume:".$fetchW['volume']." ".$fetchW['volumeUnit']."Edit
        Cost:".$fetchW['cost']."Edit
        "; + + $statusQ = "select c.id,c.name,case when s.classID is NULL then 0 else 1 end as flag + from ingredientclasses as c left outer join ingredientstatus as s + on c.id = s.classID and s.ingredientID=$id"; + $statusR = $sql->query($statusQ); + while ($statusW = $sql->fetch_array($statusR)){ + $ret .= "".$statusW['name'].": "; + $ret .= "
        "; + } + + return $ret; +} +?> + + +Recipizer::Ingredients + + + + +
        + +
        + + + diff --git a/fannie/legacy/it/recipizer/loadconversions.php b/fannie/legacy/it/recipizer/loadconversions.php new file mode 100755 index 000000000..fddd9baa6 --- /dev/null +++ b/fannie/legacy/it/recipizer/loadconversions.php @@ -0,0 +1,22 @@ +query($truncQ); + +$fp = fopen('conversions.txt','r'); +while ($line = fgets($fp)){ + $matches = array(); + preg_match("/^(.+?)\\t+(.+?)\\t+(.+?)\\n$/", $line, $matches); + echo $matches[1].":".$matches[2].":".$matches[3]."
        "; + $from = $matches[1]; + $to = $matches[2]; + $mult = $matches[3]; + $insQ = "insert into convertor values ('$from','$to',$mult)"; + $insR = $sql->query($insQ); +} +?> diff --git a/fannie/legacy/it/recipizer/print.php b/fannie/legacy/it/recipizer/print.php new file mode 100644 index 000000000..3f8854d33 --- /dev/null +++ b/fannie/legacy/it/recipizer/print.php @@ -0,0 +1,105 @@ +query($q); + $w = $sql->fetch_array($r); + + $name = $w['name']; + $upc = $w['upc']; + $margin = $w['margin']; + $price = $w['price']; + $servings = $w['servings']; + $current_margin = $w['current_margin']; + $info = $w['info']; + + $ret .= "$name
        "; + $ret .= "\nUPC: $upc
        "; + $ret .= "\nServings: $servings
        "; + + $ret .= "
        Ingredients"; + $ret .= "
        "; + $ret .= getIngredients($id); + $ret .= "
        "; + + $ret .= "

        Steps:"; + $ret .= "
        "; + $ret .= getSteps($id); + $ret .= "
        "; + + $ret .= "

        Info:"; + $ret .= "
        ".$info."
        "; + + return $ret; +} + +// prints the list of steps +function getSteps($id){ + global $sql; + $ret = ""; + $q = "select step from steps where recipeID = $id order by ord"; + $r = $sql->query($q); + $i = 1; + while ($w = $sql->fetch_array($r)){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + } + $ret .= "
        $i."; + $ret .= $w[0]."
        "; + + return $ret; +} + +// get the list of ingredients as a string +function getIngredients($id,$mult=1){ + global $sql; + $ret = ""; + $q = "select i.name,l.measure,l.unit,l.prep from ingredientlist as l + left join ingredients as i on i.id = l.ingredientID + where recipeID = $id order by ord"; + $r = $sql->query($q); + $i = 1; + $numbering = 1; + while ($w = $sql->fetch_array($r)){ + $ret .= ""; + if ($w[0] == 'LABEL'){ + $numbering = 0; + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + $ret .= ""; + } + $ret .= ""; + $i++; + $numbering++; + } + $ret .= "
         $w[3]$numbering."; + $ret .= "$w[0] - "; + $w[1] *= $mult; + $ret .= "$w[1] "; + $ret .= "$w[2] - "; + $ret .= "$w[3]"; + $ret .= "
        "; + + return $ret; +} + +?> diff --git a/fannie/legacy/it/recipizer/products.php b/fannie/legacy/it/recipizer/products.php new file mode 100755 index 000000000..a502e484b --- /dev/null +++ b/fannie/legacy/it/recipizer/products.php @@ -0,0 +1,38 @@ +query($q,$msdb); + + if ($sql->num_rows($r) == 0) + return false; + + $w = $sql->fetch_array($r); + return $w[0]; + } + + function setPrice($upc,$price){ + $sql = productdb(); + + $q = "update products set normal_price = $price where upc='$upc'"; + $r = $sql->query($q,$msdb); + } + + +?> diff --git a/fannie/legacy/it/recipizer/readInventory.php b/fannie/legacy/it/recipizer/readInventory.php new file mode 100644 index 000000000..1a4641dc8 --- /dev/null +++ b/fannie/legacy/it/recipizer/readInventory.php @@ -0,0 +1,108 @@ += $itemID"; +$clearR = $mysql->query($clearQ,$mydb); + + +if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."src/SQLManager.php"); +include('../../db.php'); +$mssql = $sql; + +$q = "select item,size,units,price from deliInventory where item <> '' and item not like '----%' order by item"; +$r = $mssql->query($q,$db); + +echo ""; +echo ""; +$prev_name = ""; +while ($w = $mssql->fetch_array($r)){ + if ($w[0] == $prev_name || $w[3] == 0) + continue; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $unit = ' '; + $amt = 0; + if (is_numeric($w[1])){ + $unit = "each"; + $amt = $w[1]; + } + else if ($u = unit_mapper($w[1])){ + $unit = $u; + $amt = 1; + } + else if ($w[1] == "LT"){ + $unit = "fl oz"; + $amt = 33.81; + } + else { + preg_match("/(\d*?\.\d+|\d+)(.*)/",$w[1],$matches); + $unit = unit_mapper($matches[2]); + $amt = $matches[1]; + } + echo ""; + echo ""; + $case = trim($w[2]); + if ($case == "#") + $case = 1; + $case = rtrim($case,"#"); + if ($case == "EA") + $case = 1; + if (is_numeric($case)){ + $total = $case*$amt; + echo ""; + } + else { + echo ""; + } + echo ""; + + $name = trim($w[0]); + if ($unit == "lb" || $unit == "oz" || $unit == "each"){ + $insQ = "insert into ingredients values ($itemID,'$name',$total,'$unit',0,'tsp',$w[3])"; + echo $insQ."
        "; + $insR = $mysql->query($insQ,$mydb); + } + else { + $insQ = "insert into ingredients values ($itemID,'$name',0,'oz',$total,'$unit',$w[3])"; + echo $insQ."
        "; + $insR = $mysql->query($insQ,$mydb); + } + $itemID++; + + $prev_name = $w[0]; +} + +function unit_mapper($input){ + $input = strtoupper(trim($input)); + if ($input == "EA"){ + return "each"; + } + else if ($input == "GAL"){ + return "gallon"; + } + else if ($input == "QT"){ + return "quart"; + } + else if ($input == "#"){ + return "lb"; + } + else if ($input == "PT"){ + return "pint"; + } + else if ($input == "OZ"){ + return "oz"; + } + else if ($input == "FL OZ"){ + return "fl oz"; + } + return false; +} + +?> diff --git a/fannie/legacy/it/recipizer/viewer.js b/fannie/legacy/it/recipizer/viewer.js new file mode 100755 index 000000000..bab9d6a4f --- /dev/null +++ b/fannie/legacy/it/recipizer/viewer.js @@ -0,0 +1,59 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'viewer.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'viewRecipes': + case 'displayRecipe': + document.getElementById('right').innerHTML = array[1]; + break; + case 'multiply': + document.getElementById('recipeingredients').innerHTML = array[1]; + break; + } + } +} + +/* wrapper for sending view request */ +function viewRecipes(id){ + phpSend('viewRecipes&catID='+id); +} + +/* wrapper for displaying recipe */ +function displayRecipe(id){ + phpSend('displayRecipe&id='+id); +} + +function mult(id){ + var multiplier = document.getElementById('multiplier').value; + phpSend('multiply&id='+id+'&multiplier='+multiplier); +} \ No newline at end of file diff --git a/fannie/legacy/it/recipizer/viewer.php b/fannie/legacy/it/recipizer/viewer.php new file mode 100755 index 000000000..d12418bfd --- /dev/null +++ b/fannie/legacy/it/recipizer/viewer.php @@ -0,0 +1,207 @@ +Categories:"; + $ret .= "
          "; + $q = "select name,id from categories order by name"; + $r = $sql->query($q); + if ($sql->num_rows($r) != 0){ + while ($w = $sql->fetch_array($r)){ + $ret .= "
        • "; + $ret .= $w[0]."
        • "; + } + } + $ret .= "
        "; + + return $ret; +} + +// returns a list of recipes in category with id $id (as a string again) +function getRecipes($id){ + global $sql; + $q = "select name from categories where id=$id"; + $r = $sql->query($q); + $w = $sql->fetch_array($r); + $catName = $w[0]; + + $ret = "Category: ".$catName."
        "; + $ret .= "Recipes:"; + $ret .= "
          "; + $q = "select name,id from recipes where categoryID = $id order by name"; + $r = $sql->query($q); + if ($sql->num_rows($r) != 0){ + while ($w = $sql->fetch_array($r)){ + $ret .= "
        • "; + $ret .= $w[0]."
        • "; + } + } + $ret .= "
        "; + + return $ret; +} + +// displays a recipe. this may become 'ze doozy' +function displayRecipe($id){ + global $sql; + $ret = ""; + $q = "select r.name,r.upc,r.margin,r.price,r.servings,r.current_margin,i.info + from recipes as r, info as i where r.id=i.recipeID and r.id=$id"; + $r = $sql->query($q); + $w = $sql->fetch_array($r); + + $name = $w['name']; + $upc = $w['upc']; + $margin = $w['margin']; + $price = $w['price']; + $servings = $w['servings']; + $current_margin = $w['current_margin']; + $info = $w['info']; + + $ret .= "Name: $name
        "; + $ret .= "\nUPC: $upc
        "; + $ret .= "
        Price: $price
        "; + $ret .= "\nServings: $servings
        "; + $ret .= "Multiplier: "; + $ret .= "Change | "; + $ret .= "Print
        "; + + $ret .= "
        Ingredients"; + $ret .= "
        "; + $ret .= getIngredients($id); + $ret .= "
        "; + + $ret .= "

        Steps:"; + $ret .= "
        "; + $ret .= getSteps($id); + $ret .= "
        "; + + $ret .= "

        Info:"; + $ret .= "
        ".$info."
        "; + + return $ret; +} + +// prints the list of steps +function getSteps($id){ + global $sql; + $ret = "
        NamePkg sizePkg/caseCostPkg amtPkg unitsCase contents
        $w[0]$w[1]$w[2]$w[3]$amt$unit$total $unit 
        "; + $q = "select step from steps where recipeID = $id order by ord"; + $r = $sql->query($q); + $i = 1; + while ($w = $sql->fetch_array($r)){ + if ($i % 2 != 0) + $ret .= ""; + else + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $i++; + } + $ret .= "
        $i."; + $ret .= $w[0]."
        "; + + return $ret; +} + +// get the list of ingredients as a string +function getIngredients($id,$mult=1){ + global $sql; + $ret = ""; + $q = "select i.name,l.measure,l.unit,l.prep from ingredientlist as l + left join ingredients as i on i.id = l.ingredientID + where recipeID = $id order by ord"; + $r = $sql->query($q); + $i = 1; + $numbering = 1; + while ($w = $sql->fetch_array($r)){ + if ($i % 2 != 0) + $ret .= ""; + else + $ret .= ""; + if ($w[0] == 'LABEL'){ + $numbering = 0; + $ret .= ""; + $ret .= ""; + } + else { + $ret .= ""; + $ret .= ""; + } + $ret .= ""; + $i++; + $numbering++; + } + $ret .= "
         $w[3]$numbering."; + $ret .= "$w[0] - "; + $w[1] *= $mult; + $ret .= "$w[1] "; + $ret .= "$w[2] - "; + $ret .= "$w[3]"; + $ret .= "
        "; + + return $ret; +} + +?> + + +Recipizer::Index + + + + + + +
        + + + +
        + + + diff --git a/fannie/legacy/it/sales.php b/fannie/legacy/it/sales.php new file mode 100644 index 000000000..e040c6f9a --- /dev/null +++ b/fannie/legacy/it/sales.php @@ -0,0 +1,53 @@ +"; +echo "DateBulkCoolDeli +GroceryHBCProduce +MarketingMeatGen. Merch +EquityBNKN/B"; + +$query = "SELECT datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate), + SUM(CASE WHEN d.superID=1 THEN total ELSE 0 END) as Blk, + SUM(CASE WHEN d.superID=2 THEN total ELSE 0 END) as Cool, + SUM(CASE WHEN d.superID=3 THEN total ELSE 0 END) as Deli, + SUM(CASE WHEN d.superID=4 THEN total ELSE 0 END) as Grocery, + SUM(CASE WHEN d.superID=5 THEN total ELSE 0 END) as HBC, + SUM(CASE WHEN d.superID=6 THEN total ELSE 0 END) as Produce, + SUM(CASE WHEN d.superID=7 THEN total ELSE 0 END) as Marketing, + SUM(CASE WHEN d.superID=8 THEN total ELSE 0 END) as Meat, + SUM(CASE WHEN d.superID=9 THEN total ELSE 0 END) as GenMerch, + SUM(CASE WHEN t.department IN (991,992) THEN total ELSE 0 END) as Equity, + SUM(CASE WHEN t.trans_type='T' AND t.trans_subtype IN ('CA','CK') + THEN t.total ELSE 0 END) as BNK, + SUM(CASE WHEN t.trans_type='T' AND t.trans_subtype NOT IN ('CA','CK') + THEN t.total ELSE 0 END) as NBNK + FROM $dlog AS t LEFT JOIN departments AS d + ON t.department = d.dept_no + LEFT JOIN MasterSuperDepts AS s ON d.dept_no=s.dept_ID + GROUP BY datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate) + ORDER BY datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate)"; +//echo $query; +$result = $sql->query($query); + +while($row = $sql->fetch_row($result)){ + echo ""; + echo "".$row[0]."-".$row[1]."-".$row[2].""; + for($i=3;$i<15;$i++) + echo "$row[$i]"; + echo ""; +} +echo ""; + +?> diff --git a/fannie/legacy/it/samba/backer.pkg.tar.bz2 b/fannie/legacy/it/samba/backer.pkg.tar.bz2 new file mode 100644 index 000000000..ade872691 Binary files /dev/null and b/fannie/legacy/it/samba/backer.pkg.tar.bz2 differ diff --git a/fannie/legacy/it/samba/index.php b/fannie/legacy/it/samba/index.php new file mode 100644 index 000000000..bfd3d1d2c --- /dev/null +++ b/fannie/legacy/it/samba/index.php @@ -0,0 +1,51 @@ +Try again"; + return; + } + // passwords must be valid characters + if (!isAlphanumeric($password1)){ + echo "Password can only contain numbers, letters, and underscores. "; + echo "Try again"; + return; + } + // double-check to make sure argument is shell-safe + $password1 = escapeshellarg($password1); + exec("sudo /usr/local/bin/sambapass.sh $name $password1"); + echo "Samba password changed for user '$name'"; +} +else{ +?> +
        +Changing the samba password for user '' +

        + + + + + +
        New password
        Re-type password
        + +

        + diff --git a/fannie/legacy/it/shoppers/index.php b/fannie/legacy/it/shoppers/index.php new file mode 100644 index 000000000..564d0357d --- /dev/null +++ b/fannie/legacy/it/shoppers/index.php @@ -0,0 +1,120 @@ + +Customer traffic + + +datediff('tdate',$sql->now())." >= -7 + and hour(tdate) between 7 and 20 + group by year(tdate),month(tdate), + day(tdate),hour(tdate) + order by year(tdate),month(tdate), + day(tdate),hour(tdate)"; +$hourlyR = $sql->query($hourlyQ); + +echo "Customers per hour, last 7 days"; +$curyear = ''; +$curmonth = ''; +$curday = ''; +$accumulator = array(); +$curmax = 0; +$i = 0; +echo ""; +echo ""; +echo ""; +/* + what's this accumulator mess: + the query returns rows like this: + so there are multiple rows for each + the point of the accumulator is to find the biggest per day + so it can be bolded when it's dumped out + as well as sum each day's customer count for a total +*/ +while ($hourlyW = $sql->fetch_array($hourlyR)){ + if ($curyear != $hourlyW[0] || $curmonth != $hourlyW[1] || $curday != $hourlyW[2]){ + if ($curyear != ''){ + $sum = 0; + for ($j = 0; $j < $i; $j++){ + if ($j == $curmax) + echo ""; + else + echo ""; + $accumulator = array(); + $curmax = 0; + $i = 0; + } + echo ""; + echo ""; + $curyear = $hourlyW[0]; + $curmonth = $hourlyW[1]; + $curday = $hourlyW[2]; + } + $accumulator[$i] = $hourlyW[4]; + if ($hourlyW[4] > $accumulator[$curmax]) + $curmax = $i; + $i++; +} +// write out the last date's data +$sum = 0; +for ($j = 0; $j < $i; $j++){ + if ($j == $curmax) + echo ""; + else + echo "
        Date7[am]89101112[pm]12345678Total
        $accumulator[$j]$accumulator[$j]"; + $sum += $accumulator[$j]; + } + echo "$sum
        $hourlyW[1]/$hourlyW[2]/$hourlyW[0]$accumulator[$j]$accumulator[$j]"; + $sum += $accumulator[$j]; +} +echo "$sum
        "; + + +$monthlyQ = "select datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate), + min(datepart(dw,tdate)),count(distinct trans_num) from dlog_90_view + where datepart(hh,tdate) between 7 and 20 + group by datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate), + datepart(hh,tdate) + order by datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate)"; +$monthlyR = $sql->query($monthlyQ); + +$days = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); +echo "

        Customers per day, last 30 days"; +echo ""; +echo ""; +$curyear = ''; +$curmonth = ''; +$curday = ''; +$curdw = ''; +$sum = 0; +/* + what's all this nonsense? why is it being grouped pointlessly by hour? + this is to be consistent with the above hourly chart. the way the hourly + chart works, a customer that begins his transaction at x:59 (or less) and + finishes the transaction at y:00 (or more) gets counted as two customers. + hourly grouping is used here so that the totals are consistent for the days + on both charts. so technically the totals are off a little bit, but variance + introduced isn't much - the trends still show through. +*/ +while($monthlyW = $sql->fetch_array($monthlyR)){ + if ($curyear != $monthlyW[0] || $curmonth != $monthlyW[1] || $curday != $monthlyW[2]){ + if ($curyear != '') + echo ""; + echo ""; + $curdw = $days[$monthlyW[3]-1]; + $curyear = $monthlyW[0]; + $curmonth = $monthlyW[1]; + $curday = $monthlyW[2]; + $sum = 0; + echo ""; + } + $sum += $monthlyW[4]; +} +echo "
        DayDateTotal
        $sum
        $curdw$curmonth/$curday/$curyear$sum
        "; + +?> diff --git a/fannie/legacy/it/survey/index.php b/fannie/legacy/it/survey/index.php new file mode 100644 index 000000000..e4a1ede9c --- /dev/null +++ b/fannie/legacy/it/survey/index.php @@ -0,0 +1,124 @@ + + + + + +

        +Mem#
        +MEMBER BENEFITS
        +
        "; +} +?> +Zipcode
        +Gender
        +Age bracket
        +Adults
        +Children
        +Income
        +Education
        +Weekly
        +Weekly WFC
        +WFC EXPERIENCE
        +
        "; +} +?> +Other:
        +Poor:
        +ITEMS
        +1.
        +2.
        +3.
        +SERVICES
        +Fruit/veg
        +Juicebar
        +Online
        +Delivery
        +Catering
        +Vendor
        +Hours
        +Other
        +DEPTS
        + "; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        "; +} +?> +CSC
        +
        "; +} +?> +Other:
        +Poor:
        +IMPORTANCE
        +
        "; +} +?> +Other:
        +STAFF
        +
        "; +} +?> +Other:
        +FEATURES
        +Location
        +Parking
        +Atmosphere
        +Staff
        +Service
        +Cleanliness
        +Publictrans
        +Organiclocal
        +Allergy
        +ProdInfo
        +Prices
        +Coop_model
        +Owner
        +Localsupport
        +Community
        +Environment
        +Other
        +Other Store
        +Advertising
        +Signage
        +Flyers
        +Brochures
        +website
        +Newsletter
        +Billboards
        +NPR
        +Radio
        +TV
        +DNT
        +Events
        +Meetings
        +Booth
        +Employee
        +Friend
        +Other
        +PARTICIPATION
        +
        "; +} +?> +General Other
        + +
        + + + diff --git a/fannie/legacy/it/survey/results.php b/fannie/legacy/it/survey/results.php new file mode 100644 index 000000000..0b2b0ec97 --- /dev/null +++ b/fannie/legacy/it/survey/results.php @@ -0,0 +1,1285 @@ +query("select count(*) from survey_main where card_no <> 11 or card_no is NULL"); +$mems = array_pop($sql->fetch_row($r)); +$r = $sql->query("select count(*) from survey_main where card_no = 11"); +$nonmems = array_pop($sql->fetch_row($r)); + +echo "Total surveys collected: ".($mems+$nonmems)."
        "; +echo "Member surveys collected: ".$mems."
        "; +echo "Non-member surveys collected: ".$nonmems."
        "; +echo "
        "; + +echo "Member benefit usage
        "; +echo "Scale 1-4. 1 - Never, 4 - Every Opportunity
        "; +echo ""; +echo ""; +$tags = array("Special ordered a product to get Owner case discount", + "Special ordred a product WFC doesn't carry", + "Shopped at businesses in the Community Cooperation Program", + "Read the Garbanzo Gazette", + "Used my quarterly Member Appreciation Coupon", + "Suggested someone shop at WFC", + "Encouraged someone to become an Owner of WFC", + "Attended a WFC class at discounted price for Owners", + "Attended a Co-op Event", + "Dined in the BCO", + "Attended the Annual Owners Meeting", + "Voted for the Board of Directors", + "Visited WFC's website", + "Volunteered at a WFC event or on a WFC committee", + "Used the monthly in-store flyer listing Member-only Specials", + "Attended a Monthly Member Mixer", + "Benefited from a Member Only Coupon from the booklet mailed to you"); +for ($i=0; $i<17;$i++){ + echo ""; + echo ""; + $r = $sql->query("select avg(rating+1) from member_benefits where sub_question = '".chr(97+$i)."'"); + $avg = array_pop($sql->fetch_row($r)); + $r = $sql->query("select std(rating+1) from member_benefits where sub_question = '".chr(97+$i)."'"); + $std = array_pop($sql->fetch_row($r)); + $r = $sql->query("select count(*) from member_benefits where sub_question = '".chr(97+$i)."'"); + $total = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. Dev.Total
        ".chr(97+$i).". ".$tags[$i]."".round($avg,2)."".round($std,2)."".$total."
        "; +echo "
        "; + +echo "Zip code
        "; +$remainder = 0; +echo ""; +echo ""; +$r = $sql->query("select zipcode,count(*) from survey_main group by zipcode order by count(*) desc"); +while($w = $sql->fetch_row($r)){ + if ($w[1] < 5){ + $remainder++; + continue; + } + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        Zip CodeTotal
        ".$w[0]."".$w[1]."
        "; +echo "There were ".$remainder." other zip codes with less than five responses each
        "; +echo "
        "; + +echo "Gender
        "; +$r = $sql->query("select count(*) from survey_main where gender = 0"); +$male = array_pop($sql->fetch_row($r)); +$r = $sql->query("select count(*) from survey_main where gender = 1"); +$female = array_pop($sql->fetch_row($r)); +echo "Overall
        "; +echo "Male: ".$male."
        "; +echo "Female: ".$female."
        "; +$r = $sql->query("select count(*) from survey_main where gender = 0 and (card_no <> 11 or card_no is NULL)"); +$male = array_pop($sql->fetch_row($r)); +$r = $sql->query("select count(*) from survey_main where gender = 1 and (card_no <> 11 or card_no is NULL)"); +$female = array_pop($sql->fetch_row($r)); +echo "Member
        "; +echo "Male: ".$male."
        "; +echo "Female: ".$female."
        "; +$r = $sql->query("select count(*) from survey_main where gender = 0 and (card_no = 11 )"); +$male = array_pop($sql->fetch_row($r)); +$r = $sql->query("select count(*) from survey_main where gender = 1 and (card_no = 11 )"); +$female = array_pop($sql->fetch_row($r)); +echo "Non-Member
        "; +echo "Male: ".$male."
        "; +echo "Female: ".$female."
        "; +echo "
        "; + +echo "Age bracket
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select age_bracket,count(*) from survey_main group by age_bracket"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        18-24".round((($arr[0]/$num)*100),2)."%
        25-34".round((($arr[1]/$num)*100),2)."%
        35-44".round((($arr[2]/$num)*100),2)."%
        45-54".round((($arr[3]/$num)*100),2)."%
        55-64".round((($arr[4]/$num)*100),2)."%
        65+".round((($arr[5]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select age_bracket,count(*) from survey_main where card_no is null or card_no <> 11 group by age_bracket"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        18-24".round((($arr[0]/$num)*100),2)."%
        25-34".round((($arr[1]/$num)*100),2)."%
        35-44".round((($arr[2]/$num)*100),2)."%
        45-54".round((($arr[3]/$num)*100),2)."%
        55-64".round((($arr[4]/$num)*100),2)."%
        65+".round((($arr[5]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Non-member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select age_bracket,count(*) from survey_main where card_no = 11 group by age_bracket"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        18-24".round((($arr[0]/$num)*100),2)."%
        25-34".round((($arr[1]/$num)*100),2)."%
        35-44".round((($arr[2]/$num)*100),2)."%
        45-54".round((($arr[3]/$num)*100),2)."%
        55-64".round((($arr[4]/$num)*100),2)."%
        65+".round((($arr[5]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Number of adults
        "; +echo ""; +echo ""; +$r = $sql->query("select avg(num_adults) from survey_main"); +$avg = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select std(num_adults) from survey_main"); +$std = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select count(*) from survey_main where num_adults is not null"); +$tot = array_pop($sql->fetch_row($r)); +echo ""; +$r = $sql->query("select avg(num_adults) from survey_main where card_no is null or card_no <> 11"); +$avg = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select std(num_adults) from survey_main where card_no is null or card_no <> 11"); +$std = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select count(*) from survey_main where num_adults is not null and (card_no is null or card_no <> 11)"); +$tot = array_pop($sql->fetch_row($r)); +echo ""; +$r = $sql->query("select avg(num_adults) from survey_main where card_no = 11"); +$avg = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select std(num_adults) from survey_main where card_no = 11"); +$std = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select count(*) from survey_main where num_adults is not null and (card_no = 11)"); +$tot = array_pop($sql->fetch_row($r)); +echo ""; +echo "
         Avg.Std. Dev.Total
        Overall$avg$std$tot
        Member$avg$std$tot
        Non-Member$avg$std$tot
        "; +echo "
        "; + +echo "Number of children
        "; +echo ""; +echo ""; +$r = $sql->query("select avg(num_children) from survey_main"); +$avg = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select std(num_children) from survey_main"); +$std = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select count(*) from survey_main where num_children is not null"); +$tot = array_pop($sql->fetch_row($r)); +echo ""; +$r = $sql->query("select avg(num_children) from survey_main where card_no is null or card_no <> 11"); +$avg = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select std(num_children) from survey_main where card_no is null or card_no <> 11"); +$std = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select count(*) from survey_main where num_children is not null and (card_no is null or card_no <> 11)"); +$tot = array_pop($sql->fetch_row($r)); +echo ""; +$r = $sql->query("select avg(num_children) from survey_main where card_no = 11"); +$avg = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select std(num_children) from survey_main where card_no = 11"); +$std = round(array_pop($sql->fetch_row($r)),2); +$r = $sql->query("select count(*) from survey_main where num_children is not null and (card_no = 11)"); +$tot = array_pop($sql->fetch_row($r)); +echo ""; +echo "
         Avg.Std. Dev.Total
        Overall$avg$std$tot
        Member$avg$std$tot
        Non-Member$avg$std$tot
        "; +echo "
        "; + +echo "Income
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select income,count(*) from survey_main group by income"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        <$10k".round((($arr[0]/$num)*100),2)."%
        $10k-$15k".round((($arr[1]/$num)*100),2)."%
        $15k-$25k".round((($arr[2]/$num)*100),2)."%
        $25k-35k".round((($arr[3]/$num)*100),2)."%
        $35k-$50k".round((($arr[4]/$num)*100),2)."%
        $50k-$75k".round((($arr[5]/$num)*100),2)."%
        $75k-$100k".round((($arr[6]/$num)*100),2)."%
        >$100k".round((($arr[7]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select income,count(*) from survey_main where card_no is null or card_no <> 11 group by income"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        <$10k".round((($arr[0]/$num)*100),2)."%
        $10k-$15k".round((($arr[1]/$num)*100),2)."%
        $15k-$25k".round((($arr[2]/$num)*100),2)."%
        $25k-35k".round((($arr[3]/$num)*100),2)."%
        $35k-$50k".round((($arr[4]/$num)*100),2)."%
        $50k-$75k".round((($arr[5]/$num)*100),2)."%
        $75k-$100k".round((($arr[6]/$num)*100),2)."%
        >$100k".round((($arr[7]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Non-Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select income,count(*) from survey_main where card_no = 11 group by income"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        <$10k".round((($arr[0]/$num)*100),2)."%
        $10k-$15k".round((($arr[1]/$num)*100),2)."%
        $15k-$25k".round((($arr[2]/$num)*100),2)."%
        $25k-35k".round((($arr[3]/$num)*100),2)."%
        $35k-$50k".round((($arr[4]/$num)*100),2)."%
        $50k-$75k".round((($arr[5]/$num)*100),2)."%
        $75k-$100k".round((($arr[6]/$num)*100),2)."%
        >$100k".round((($arr[7]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Education
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select education,count(*) from survey_main group by education"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Not a HS grad".round((($arr[0]/$num)*100),2)."%
        HS Grad/GED".round((($arr[1]/$num)*100),2)."%
        Some college/tech".round((($arr[2]/$num)*100),2)."%
        College Grad".round((($arr[3]/$num)*100),2)."%
        Post-grad".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select education,count(*) from survey_main where card_no is null or card_no <> 11 group by education"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Not a HS grad".round((($arr[0]/$num)*100),2)."%
        HS Grad/GED".round((($arr[1]/$num)*100),2)."%
        Some college/tech".round((($arr[2]/$num)*100),2)."%
        College Grad".round((($arr[3]/$num)*100),2)."%
        Post-grad".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Non-Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select education,count(*) from survey_main where card_no = 11 group by education"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Not a HS grad".round((($arr[0]/$num)*100),2)."%
        HS Grad/GED".round((($arr[1]/$num)*100),2)."%
        Some college/tech".round((($arr[2]/$num)*100),2)."%
        College Grad".round((($arr[3]/$num)*100),2)."%
        Post-grad".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Weekly spending
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select weekly_spending,count(*) from survey_main group by weekly_spending"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Up to $50".round((($arr[0]/$num)*100),2)."%
        $51 to $75".round((($arr[1]/$num)*100),2)."%
        $76 to $100".round((($arr[2]/$num)*100),2)."%
        $101 to $150".round((($arr[3]/$num)*100),2)."%
        Over $150".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select weekly_spending,count(*) from survey_main where card_no is null or card_no <> 11 group by weekly_spending"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Up to $50".round((($arr[0]/$num)*100),2)."%
        $51 to $75".round((($arr[1]/$num)*100),2)."%
        $76 to $100".round((($arr[2]/$num)*100),2)."%
        $101 to $150".round((($arr[3]/$num)*100),2)."%
        Over $150".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Non-Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select weekly_spending,count(*) from survey_main where card_no = 11 group by weekly_spending"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Up to $50".round((($arr[0]/$num)*100),2)."%
        $51 to $75".round((($arr[1]/$num)*100),2)."%
        $76 to $100".round((($arr[2]/$num)*100),2)."%
        $101 to $150".round((($arr[3]/$num)*100),2)."%
        Over $150".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "% Weekly spending @ WFC
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select weekly_spending_wfc,count(*) from survey_main group by weekly_spending"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Under 10%".round((($arr[0]/$num)*100),2)."%
        11%-25%".round((($arr[1]/$num)*100),2)."%
        26%-50%".round((($arr[2]/$num)*100),2)."%
        51%-75%".round((($arr[3]/$num)*100),2)."%
        Over 75%".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select weekly_spending_wfc,count(*) from survey_main where card_no is null or card_no <> 11 group by weekly_spending"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Under 10%".round((($arr[0]/$num)*100),2)."%
        11%-25%".round((($arr[1]/$num)*100),2)."%
        26%-50%".round((($arr[2]/$num)*100),2)."%
        51%-75%".round((($arr[3]/$num)*100),2)."%
        Over 75%".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Non-member
        "; +$num = 0; +$arr = array(); +$skip = 0; +$r = $sql->query("select weekly_spending_wfc,count(*) from survey_main where card_no = 11 group by weekly_spending"); +while($w = $sql->fetch_row($r)){ + if ($w[0] == "") + $skip = $w[1]; + else { + $arr[$w[0]] = $w[1]; + $num += $w[1]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Under 10%".round((($arr[0]/$num)*100),2)."%
        11%-25%".round((($arr[1]/$num)*100),2)."%
        26%-50%".round((($arr[2]/$num)*100),2)."%
        51%-75%".round((($arr[3]/$num)*100),2)."%
        Over 75%".round((($arr[4]/$num)*100),2)."%
        "; +echo $skip." chose not to respond
        "; +echo "
        "; + +echo "Rate WFC experience
        "; +echo "Scale 1-5: 1 - Poor, 5 - Excellent
        "; +echo ""; +echo ""; +$tags = array("Store Lighting", + "Store music", + "Store cleanliness", + "Variety of products", + "Products clearly priced", + "Easy to shop layout", + "Uncluttered aisles", + "Assistance available", + "Product information available", + "Accuracy at checkout", + "Speed of checkout", + "Overall shopping experience"); +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from shopping_experience where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from shopping_experience where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from shopping_experience where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Experience, Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from shopping_experience as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no is null or s.card_no <> 11)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from shopping_experience as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no is null or s.card_no <> 11)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from shopping_experience as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no is null or s.card_no <> 11)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Experience, Non-Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from shopping_experience as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from shopping_experience as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from shopping_experience as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Shopping experience \"Other\" comments, Member
        "; +echo "
        "; +$r = $sql->query("select comment from experience_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='m' and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Shopping experience \"Other\" comments, Non-Member
        "; +echo "
        "; +$r = $sql->query("select comment from experience_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='m' and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; + +echo "Shopping experience \"Poor\" comments, Member
        "; +echo "
        "; +$r = $sql->query("select sub_question,comment from experience_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question<>'m' and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]." - ".$w[1]."

        "; +echo "
        "; +echo "Shopping experience \"Poor\" comments, Non-Member
        "; +echo "
        "; +$r = $sql->query("select sub_question,comment from experience_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question<>'m' and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]." - ".$w[1]."

        "; +echo "
        "; +echo "
        "; + +echo "Rate CSC experience
        "; +echo "Scale 1-5: 1 - Poor, 5 - Excellent
        "; +echo ""; +echo ""; +$tags = array("Return a product for refund", + "Request a rain check", + "Purchase a gift card", + "Purchase stamps", + "Request product information", + "Receive sale/event information", + "Register for a WFC class", + "Place a special order", + "Pick up a special order", + "Request member information", + "Resolve a member benefit issue", + "Purchase WFC logo products"); +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from csc where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from csc where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from csc where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "CSC, Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from csc as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no <> 11 or s.card_no is null)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from csc as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no <> 11 or s.card_no is null)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from csc as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no <> 11 or s.card_no is null)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "CSC, Non-Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from csc as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from csc as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from csc as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "CSC experience \"Other\" comments, Member
        "; +echo "
        "; +$r = $sql->query("select comment from csc_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='m' and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "CSC experience \"Other\" comments, Non-Member
        "; +echo "
        "; +$r = $sql->query("select comment from csc_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='m' and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; + +echo "CSC experience \"Poor\" comments, Member
        "; +echo "
        "; +$r = $sql->query("select sub_question,comment from csc_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question<>'m' and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]." - ".$w[1]."

        "; +echo "
        "; +echo "CSC experience \"Poor\" comments, Non-Member
        "; +echo "
        "; +$r = $sql->query("select sub_question,comment from csc_poor as e left join survey_main as s on e.surveyID=s.surveyID where sub_question<>'m' and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]." - ".$w[1]."

        "; +echo "
        "; +echo "
        "; + +echo "How important are the following items in making food choices?
        "; +echo "Scale 1-4: 1 - Not important, 4 - Very Important
        "; +echo ""; +echo ""; +$tags = array("Certified organic", + "Locally/regionally grown/produced", + "Certified fair trade", + "Preservative-free", + "Free of genetically engineered ingredients", + "Vegetarian", + "Vegan", + "Free of common food allergens", + "Free of antibiotics & growth hormones", + "Price", + "Brands I trust", + "Minimal and/or recyclable packaging", + "Quality of products", + "Variety of products", + "Taste/Flavor", + "Ready to eat"); +for ($i = 0; $i < 16; $i++){ + $r = $sql->query("select avg(rating) from importance where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from importance where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from importance where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Importance, Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from importance as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no <> 11 or s.card_no is null)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from importance as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no <> 11 or s.card_no is null)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from importance as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no <> 11 or s.card_no is null)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Importance, Non-Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 12; $i++){ + $r = $sql->query("select avg(rating) from importance as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating) from importance as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from importance as e left join survey_main as s on e.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating > 0 and rating is not NULL and (s.card_no = 11 )"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Food choices \"Other\" comments, Member
        "; +echo "
        "; +$r = $sql->query("select comment from extra_other as e left join survey_main as s on e.surveyID=s.surveyID where question=16 and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Food choices \"Other\" comments, Non-Member
        "; +echo "
        "; +$r = $sql->query("select comment from extra_other as e left join survey_main as s on e.surveyID=s.surveyID where question=16 and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "
        "; + +echo "Items WFC doesn't carry, Member
        "; +echo "
        "; +$r = $sql->query("select item from desired_items as e left join survey_main as s on e.surveyID=s.surveyID where (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Items WFC doesn't carry, Non-Member
        "; +echo "
        "; +$r = $sql->query("select item from desired_items as e left join survey_main as s on e.surveyID=s.surveyID where (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "
        "; + +echo "Food services
        "; +$r = $sql->query("select sum(fruit_veg),sum(juice_bar),sum(online_orders),sum(delivery),sum(catering),sum(vendor),count(*) from services"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select hours,count(*) from services where hours<>'' and hours <> 'NULL' group by hours"); +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + echo ""; +} +echo "
         YesNo
        Cut/packaged produce".$w[0]."".($w[6]-$w[0])."
        Frush juice bar".$w[1]."".($w[6]-$w[1])."
        Online ordering".$w[2]."".($w[6]-$w[2])."
        Home delivery".$w[3]."".($w[6]-$w[3])."
        Catering".$w[4]."".($w[6]-$w[4])."
        Food Vendor".$w[5]."".($w[6]-$w[5])."
        Hours: ".$w[0]."$w[1] 

        "; + +echo "Services, Members
        "; +$r = $sql->query("select sum(fruit_veg),sum(juice_bar),sum(online_orders),sum(delivery),sum(catering),sum(vendor),count(*) from services as v left join survey_main as s on v.surveyID = s.surveyID where s.card_no <> 11 or s.card_no is null"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select hours,count(*) from services as v left join survey_main as s on v.surveyID=s.surveyID where (s.card_no <> 11 or s.card_no is null) and hours<>'' and hours <> 'NULL' group by hours"); +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + echo ""; +} +echo "
         YesNo
        Cut/packaged produce".$w[0]."".($w[6]-$w[0])."
        Frush juice bar".$w[1]."".($w[6]-$w[1])."
        Online ordering".$w[2]."".($w[6]-$w[2])."
        Home delivery".$w[3]."".($w[6]-$w[3])."
        Catering".$w[4]."".($w[6]-$w[4])."
        Food Vendor".$w[5]."".($w[6]-$w[5])."
        Hours: ".$w[0]."$w[1] 

        "; + +echo "Services, Non-Members
        "; +$r = $sql->query("select sum(fruit_veg),sum(juice_bar),sum(online_orders),sum(delivery),sum(catering),sum(vendor),count(*) from services as v left join survey_main as s on v.surveyID = s.surveyID where s.card_no = 11 "); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select hours,count(*) from services as v left join survey_main as s on v.surveyID=s.surveyID where (s.card_no = 11 ) and hours<>'' and hours <> 'NULL' group by hours"); +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + echo ""; +} +echo "
         YesNo
        Cut/packaged produce".$w[0]."".($w[6]-$w[0])."
        Frush juice bar".$w[1]."".($w[6]-$w[1])."
        Online ordering".$w[2]."".($w[6]-$w[2])."
        Home delivery".$w[3]."".($w[6]-$w[3])."
        Catering".$w[4]."".($w[6]-$w[4])."
        Food Vendor".$w[5]."".($w[6]-$w[5])."
        Hours: ".$w[0]."$w[1] 

        "; + +echo "Services Other, Member
        "; +echo "
        "; +$r = $sql->query("select other from services as e left join survey_main as s on e.surveyID=s.surveyID where other <> 'NULL' and other <> '' and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Services Other, Non-Member
        "; +echo "
        "; +$r = $sql->query("select other from services as e left join survey_main as s on e.surveyID=s.surveyID where other <> 'NULL' and other <> '' and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "
        "; + +echo "Department ratings
        "; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select sub_question,sum(buy_at_wfc),count(*)-sum(buy_at_wfc),sum(poor_quality),sum(out_of_stock),sum(price),sum(selection),sum(no_need) from dept_ratings group by sub_question order by sub_question"); +$tags = array("Baby food", + "Bulk coffee", + "Bulk foods", + "Bulk herbs & spices", + "Bulk tea", + "Cheese", + "Deli coffee bar", + "Deli desserts/baked goods", + "Deli prepared foods", + "Fresh breads", + "Hot bar", + "Frozen food", + "Refrigerated/dairy", + "Poultry/meat - fresh", + "Poultry/meat - frozen", + "Packaged grocery", + "Produce", + "Cleaning supplies", + "Paper products", + "Pet food", + "Body care", + "Supplements", + "Books", + "Greeting cards", + "Housewares", + "Magazines"); +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + for ($i = 1; $i < 8; $i++) + echo ""; + echo ""; +} +echo "
         Buy at WFCReason(s)
        Dept.YesNoQualityOut of stockPriceSelectionOther
        ".$w[0].". ".$tags[ord($w[0])-97]."".$w[$i]."

        "; + +echo "Department ratings, Member
        "; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select sub_question,sum(buy_at_wfc),count(*)-sum(buy_at_wfc),sum(poor_quality),sum(out_of_stock),sum(price),sum(selection),sum(no_need) from dept_ratings as d left join survey_main as s on s.surveyID=d.surveyID where s.card_no <> 11 or s.card_no is null group by sub_question order by sub_question"); +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + for ($i = 1; $i < 8; $i++) + echo ""; + echo ""; +} +echo "
         Buy at WFCReason(s)
        Dept.YesNoQualityOut of stockPriceSelectionOther
        ".$w[0].". ".$tags[ord($w[0])-97]."".$w[$i]."

        "; + +echo "Department ratings, Non-Member
        "; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select sub_question,sum(buy_at_wfc),count(*)-sum(buy_at_wfc),sum(poor_quality),sum(out_of_stock),sum(price),sum(selection),sum(no_need) from dept_ratings as d left join survey_main as s on s.surveyID=d.surveyID where s.card_no = 11 group by sub_question order by sub_question"); +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + for ($i = 1; $i < 8; $i++) + echo ""; + echo ""; +} +echo "
         Buy at WFCReason(s)
        Dept.YesNoQualityOut of stockPriceSelectionOther
        ".$w[0].". ".$tags[ord($w[0])-97]."".$w[$i]."

        "; + +echo "Rate WFC staff
        "; +echo "Scale 1-5: 1 - Strongly disagree, 5 - Strongly agree
        "; +echo ""; +echo ""; +$tags = array("Identifiable (name tag visible", + "Available", + "Approachable", + "Knowledgeable", + "Converned with doing a good job", + "Recognizes me", + "Responsive to my concerns", + "Smiles", + "Asks if I need assistance"); +for ($i = 0; $i < 9; $i++){ + $r = $sql->query("select avg(rating+1) from staff_rating where sub_question='".chr(97+$i)."' and rating is not NULL"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating+1) from staff_rating where sub_question='".chr(97+$i)."' and rating is not NULL"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from staff_rating where sub_question='".chr(97+$i)."' and rating is not NULL"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Staff rating, Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 9; $i++){ + $r = $sql->query("select avg(rating+1) from staff_rating as r left join survey_main as s on r.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating is not NULL and (s.card_no is null or s.card_no <> 11)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating+1) from staff_rating as r left join survey_main as s on r.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating is not NULL and (s.card_no is null or s.card_no <> 11)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from staff_rating as r left join survey_main as s on s.surveyID=r.surveyID where sub_question='".chr(97+$i)."' and rating is not NULL and (s.card_no is not null or s.card_no <> 11)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Staff rating, Non-Member
        "; +echo ""; +echo ""; +for ($i = 0; $i < 9; $i++){ + $r = $sql->query("select avg(rating+1) from staff_rating as r left join survey_main as s on r.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating is not NULL and (s.card_no = 11)"); + $avg = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select std(rating+1) from staff_rating as r left join survey_main as s on r.surveyID=s.surveyID where sub_question='".chr(97+$i)."' and rating is not NULL and (s.card_no = 11)"); + $std = round(array_pop($sql->fetch_row($r)),2); + $r = $sql->query("select count(*) from staff_rating as r left join survey_main as s on s.surveyID=r.surveyID where sub_question='".chr(97+$i)."' and rating is not NULL and (s.card_no = 11)"); + $tot = array_pop($sql->fetch_row($r)); + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        QuestionAvgStd. DevTotal
        ".chr(97+$i).". ".$tags[$i]."$avg$std$tot
        "; +echo "
        "; + +echo "Reaspons for choosing WFC
        "; +$r = $sql->query("select sum(location),sum(parking),sum(atmosphere),sum(staff),sum(service),sum(cleanliness),sum(public_trans),sum(organic_local),sum(allergy_dietary),sum(product_info),sum(prices),sum(coop_model),sum(owner),sum(local_support),sum(community),sum(environment),count(*) from features"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
         YesNo
        Convenient Location".$w[0]."".($w[16]-$w[0])."
        Accessible Parking".$w[1]."".($w[16]-$w[1])."
        Atmosphere".$w[2]."".($w[16]-$w[2])."
        Knowledgeable Staff".$w[3]."".($w[16]-$w[3])."
        Friendly Service".$w[4]."".($w[16]-$w[4])."
        Cleanliness of store".$w[5]."".($w[16]-$w[5])."
        Proximity to public transportation".$w[6]."".($w[16]-$w[6])."
        Organic and local products".$w[7]."".($w[16]-$w[7])."
        Allergy or dietary choices".$w[8]."".($w[16]-$w[8])."
        Product info".$w[9]."".($w[16]-$w[9])."
        Prices".$w[10]."".($w[16]-$w[10])."
        Co-op business model".$w[11]."".($w[16]-$w[11])."
        I am an owner".$w[12]."".($w[16]-$w[12])."
        Support local growers".$w[13]."".($w[16]-$w[13])."
        Support community".$w[14]."".($w[16]-$w[14])."
        Support environment".$w[15]."".($w[16]-$w[15])."

        "; + +echo "Reaspons for choosing WFC, Member
        "; +$r = $sql->query("select sum(location),sum(parking),sum(atmosphere),sum(staff),sum(service),sum(cleanliness),sum(public_trans),sum(organic_local),sum(allergy_dietary),sum(product_info),sum(prices),sum(coop_model),sum(owner),sum(local_support),sum(community),sum(environment),count(*) from features as f left join survey_main as s on f.surveyID = s.surveyID where s.card_no is null or s.card_no <> 11"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
         YesNo
        Convenient Location".$w[0]."".($w[16]-$w[0])."
        Accessible Parking".$w[1]."".($w[16]-$w[1])."
        Atmosphere".$w[2]."".($w[16]-$w[2])."
        Knowledgeable Staff".$w[3]."".($w[16]-$w[3])."
        Friendly Service".$w[4]."".($w[16]-$w[4])."
        Cleanliness of store".$w[5]."".($w[16]-$w[5])."
        Proximity to public transportation".$w[6]."".($w[16]-$w[6])."
        Organic and local products".$w[7]."".($w[16]-$w[7])."
        Allergy or dietary choices".$w[8]."".($w[16]-$w[8])."
        Product info".$w[9]."".($w[16]-$w[9])."
        Prices".$w[10]."".($w[16]-$w[10])."
        Co-op business model".$w[11]."".($w[16]-$w[11])."
        I am an owner".$w[12]."".($w[16]-$w[12])."
        Support local growers".$w[13]."".($w[16]-$w[13])."
        Support community".$w[14]."".($w[16]-$w[14])."
        Support environment".$w[15]."".($w[16]-$w[15])."

        "; + +echo "Reaspons for choosing WFC, Non-Member
        "; +$r = $sql->query("select sum(location),sum(parking),sum(atmosphere),sum(staff),sum(service),sum(cleanliness),sum(public_trans),sum(organic_local),sum(allergy_dietary),sum(product_info),sum(prices),sum(coop_model),sum(owner),sum(local_support),sum(community),sum(environment),count(*) from features as f left join survey_main as s on f.surveyID = s.surveyID where s.card_no = 11"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
         YesNo
        Convenient Location".$w[0]."".($w[16]-$w[0])."
        Accessible Parking".$w[1]."".($w[16]-$w[1])."
        Atmosphere".$w[2]."".($w[16]-$w[2])."
        Knowledgeable Staff".$w[3]."".($w[16]-$w[3])."
        Friendly Service".$w[4]."".($w[16]-$w[4])."
        Cleanliness of store".$w[5]."".($w[16]-$w[5])."
        Proximity to public transportation".$w[6]."".($w[16]-$w[6])."
        Organic and local products".$w[7]."".($w[16]-$w[7])."
        Allergy or dietary choices".$w[8]."".($w[16]-$w[8])."
        Product info".$w[9]."".($w[16]-$w[9])."
        Prices".$w[10]."".($w[16]-$w[10])."
        Co-op business model".$w[11]."".($w[16]-$w[11])."
        I am an owner".$w[12]."".($w[16]-$w[12])."
        Support local growers".$w[13]."".($w[16]-$w[13])."
        Support community".$w[14]."".($w[16]-$w[14])."
        Support environment".$w[15]."".($w[16]-$w[15])."

        "; + +echo "Other grocery store"; +$stores = array("CUB","Super One - Lakeside","Super One - Kenwood","Super One - Mall Area","Super One - Plaza Shopping Center","Super One - West End","Super One - Superior","Super One - Two Harbors","Super Valu - Homecroft","Mount Royal Fine Foods","Piggly Wiggly/Woodland","Target/Duluth","Target/Superior","Wal-Mart Super Center/Superior","Sam's Club/Duluth","Convenience Store"); +$r = $sql->query("select store,count(*) from other_stores group by store order by count(*) desc"); +echo ""; +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        ".$stores[$w[0]]."".$w[1]."

        "; + +echo "Other grocery store, Member"; +$stores = array("CUB","Super One - Lakeside","Super One - Kenwood","Super One - Mall Area","Super One - Plaza Shopping Center","Super One - West End","Super One - Superior","Super One - Two Harbors","Super Valu - Homecroft","Mount Royal Fine Foods","Piggly Wiggly/Woodland","Target/Duluth","Target/Superior","Wal-Mart Super Center/Superior","Sam's Club/Duluth","Convenience Store"); +$r = $sql->query("select store,count(*) from other_stores as o left join survey_main as s on o.surveyID=s.surveyID where s.card_no is null or s.card_no <> 11 group by store order by count(*) desc"); +echo ""; +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        ".$stores[$w[0]]."".$w[1]."

        "; + +echo "Other grocery store, Non-Member"; +$stores = array("CUB","Super One - Lakeside","Super One - Kenwood","Super One - Mall Area","Super One - Plaza Shopping Center","Super One - West End","Super One - Superior","Super One - Two Harbors","Super Valu - Homecroft","Mount Royal Fine Foods","Piggly Wiggly/Woodland","Target/Duluth","Target/Superior","Wal-Mart Super Center/Superior","Sam's Club/Duluth","Convenience Store"); +$r = $sql->query("select store,count(*) from other_stores as o left join survey_main as s on o.surveyID=s.surveyID where s.card_no = 11 group by store order by count(*) desc"); +echo ""; +while ($w = $sql->fetch_row($r)){ + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        ".$stores[$w[0]]."".$w[1]."

        "; + +echo "Other store write-in, Member
        "; +echo "
        "; +$r = $sql->query("select comment from extra_other as e left join survey_main as s on e.surveyID=s.surveyID where question=22 and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Other store write-in, Non-Member
        "; +echo "
        "; +$r = $sql->query("select comment from extra_other as e left join survey_main as s on e.surveyID=s.surveyID where question=22 and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "
        "; + +echo "Advertising
        "; +$r = $sql->query("select sum(signage),sum(flyers),sum(brochures),sum(website),sum(newsletter),sum(billboards),sum(public_radio),sum(radio),sum(tv),sum(dnt),sum(event),sum(meeting),sum(booth),sum(employee),sum(friend),count(*) from advertising"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
         YesNo
        Signs in the store".$w[0]."".($w[15]-$w[0])."
        Flyers in the store".$w[1]."".($w[15]-$w[1])."
        Brochures in the store".$w[2]."".($w[15]-$w[2])."
        WFC's web site".$w[3]."".($w[15]-$w[3])."
        WFC's newsletter".$w[4]."".($w[15]-$w[4])."
        Billboards".$w[5]."".($w[15]-$w[5])."
        Public Radio".$w[6]."".($w[15]-$w[6])."
        Commercial Radio".$w[7]."".($w[15]-$w[7])."
        Television".$w[8]."".($w[15]-$w[8])."
        Duluth News-Tribune".$w[9]."".($w[15]-$w[9])."
        WFC sponsored event".$w[10]."".($w[15]-$w[10])."
        Halloween,Annual Owners Meeting, in-store classes".$w[11]."".($w[15]-$w[11])."
        WFC booth".$w[12]."".($w[15]-$w[12])."
        A WFC employee".$w[13]."".($w[15]-$w[13])."
        A friend".$w[14]."".($w[15]-$w[14])."

        "; + +echo "Advertising, Member
        "; +$r = $sql->query("select sum(signage),sum(flyers),sum(brochures),sum(website),sum(newsletter),sum(billboards),sum(public_radio),sum(radio),sum(tv),sum(dnt),sum(event),sum(meeting),sum(booth),sum(employee),sum(friend),count(*) from advertising as a left join survey_main as s on a.surveyID=s.surveyID where s.card_no is null or s.card_no <> 11"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
         YesNo
        Signs in the store".$w[0]."".($w[15]-$w[0])."
        Flyers in the store".$w[1]."".($w[15]-$w[1])."
        Brochures in the store".$w[2]."".($w[15]-$w[2])."
        WFC's web site".$w[3]."".($w[15]-$w[3])."
        WFC's newsletter".$w[4]."".($w[15]-$w[4])."
        Billboards".$w[5]."".($w[15]-$w[5])."
        Public Radio".$w[6]."".($w[15]-$w[6])."
        Commercial Radio".$w[7]."".($w[15]-$w[7])."
        Television".$w[8]."".($w[15]-$w[8])."
        Duluth News-Tribune".$w[9]."".($w[15]-$w[9])."
        WFC sponsored event".$w[10]."".($w[15]-$w[10])."
        Halloween,Annual Owners Meeting, in-store classes".$w[11]."".($w[15]-$w[11])."
        WFC booth".$w[12]."".($w[15]-$w[12])."
        A WFC employee".$w[13]."".($w[15]-$w[13])."
        A friend".$w[14]."".($w[15]-$w[14])."

        "; + +echo "Advertising, Non-Member
        "; +$r = $sql->query("select sum(signage),sum(flyers),sum(brochures),sum(website),sum(newsletter),sum(billboards),sum(public_radio),sum(radio),sum(tv),sum(dnt),sum(event),sum(meeting),sum(booth),sum(employee),sum(friend),count(*) from advertising as a left join survey_main as s on a.surveyID=s.surveyID where s.card_no = 11"); +$w = $sql->fetch_row($r); +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
         YesNo
        Signs in the store".$w[0]."".($w[15]-$w[0])."
        Flyers in the store".$w[1]."".($w[15]-$w[1])."
        Brochures in the store".$w[2]."".($w[15]-$w[2])."
        WFC's web site".$w[3]."".($w[15]-$w[3])."
        WFC's newsletter".$w[4]."".($w[15]-$w[4])."
        Billboards".$w[5]."".($w[15]-$w[5])."
        Public Radio".$w[6]."".($w[15]-$w[6])."
        Commercial Radio".$w[7]."".($w[15]-$w[7])."
        Television".$w[8]."".($w[15]-$w[8])."
        Duluth News-Tribune".$w[9]."".($w[15]-$w[9])."
        WFC sponsored event".$w[10]."".($w[15]-$w[10])."
        Halloween,Annual Owners Meeting, in-store classes".$w[11]."".($w[15]-$w[11])."
        WFC booth".$w[12]."".($w[15]-$w[12])."
        A WFC employee".$w[13]."".($w[15]-$w[13])."
        A friend".$w[14]."".($w[15]-$w[14])."

        "; + +echo "Advertising \"Other\", Member
        "; +echo "
        "; +$r = $sql->query("select other from advertising as e left join survey_main as s on e.surveyID=s.surveyID where other <> '' and other <> 'NULL' and (s.card_no is null or s.card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Advertising \"Other\", Non-Member
        "; +echo "
        "; +$r = $sql->query("select other from advertising as e left join survey_main as s on e.surveyID=s.surveyID where other<>'NULL' and other<>'' and (s.card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "
        "; + +echo "Would you participate in:
        "; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation where sub_question='a' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation where sub_question='b' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation where sub_question='c' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation where sub_question='d' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo "
         YesNoMaybeNo response
        a. Local farm tours$w[1]
        b. Book group$w[1]
        c. Lecture Series$w[1]
        d. Film Series$w[1]

        "; + +echo "Participation, Member
        "; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no is null or s.card_no <> 11) and sub_question='a' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no is null or s.card_no <> 11) and sub_question='b' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no is null or s.card_no <> 11) and sub_question='c' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no is null or s.card_no <> 11) and sub_question='d' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo "
         YesNoMaybeNo response
        a. Local farm tours$w[1]
        b. Book group$w[1]
        c. Lecture Series$w[1]
        d. Film Series$w[1]

        "; + +echo "Participation, Non-Member
        "; +echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no = 11) and sub_question='a' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no = 11) and sub_question='b' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no = 11) and sub_question='c' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo ""; +$r = $sql->query("select rating,count(*) from participation as p left join survey_main as s on p.surveyID=s.surveyID where (s.card_no = 11) and sub_question='d' group by rating order by rating desc"); +while ($w = $sql->fetch_row($r)) + echo ""; +echo ""; +echo "
         YesNoMaybeNo response
        a. Local farm tours$w[1]
        b. Book group$w[1]
        c. Lecture Series$w[1]
        d. Film Series$w[1]

        "; + +echo "Other comments, Member
        "; +echo "
        "; +$r = $sql->query("select overall_comment from survey_main where overall_comment <> 'NULL' and overall_comment <> '' and (card_no is null or card_no <> 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +echo "Other comments, Non-Member
        "; +echo "
        "; +$r = $sql->query("select overall_comment from survey_main where overall_comment <> 'NULL' and overall_comment <> '' and (card_no = 11)"); +while ($w = $sql->fetch_array($r)) + echo $w[0]."

        "; +echo "
        "; +?> diff --git a/fannie/legacy/it/survey/survey_proc.php b/fannie/legacy/it/survey/survey_proc.php new file mode 100644 index 000000000..3f02e4341 --- /dev/null +++ b/fannie/legacy/it/survey/survey_proc.php @@ -0,0 +1,178 @@ +query($idQ); +$id = 0; +if ($sql->num_rows($idR) > 0) + $id = array_pop($sql->fetch_row($idR)); +$id++; + +$mainQ = "insert survey_main values (" + .$id."," + .getval("cardno")."," + .getval("zipcode")."," + .getval("gender")."," + .getval("age_bracket")."," + .getval("adults")."," + .getval("children")."," + .getval("income")."," + .getval("education")."," + .getval("weekly")."," + .getval("weekly_wfc")."," + ."'".getval("general_other")."')"; +$sql->query($mainQ); + +for ($i = 0; $i < 9; $i++){ + if (getval("staff$i") != "NULL"){ + $q = "insert staff_rating values ($id,'".chr($i+97)."',".getval("staff$i").")"; + $sql->query($q); + } +} +if (getval("staff_other_text") != "NULL"){ + $q = "insert extra_other values ($id,20,'".getval("staff_other_text")."')"; + $sql->query($q); +} + +for ($i = 0; $i < 12; $i++){ + if (getval("exp$i") != "NULL"){ + $q = "insert shopping_experience values ($id,'".chr($i+97)."',".getval("exp$i").")"; + $sql->query($q); + } +} +if (getval("exp_other_text") != "NULL"){ + $q = "insert experience_poor values ($id,'m','".getval("exp_other_text")."')"; + $sql->query($q); +} +if (getval("exp_poor_text") != "NULL"){ + $q = "insert experience_poor values ($id,'".getval("exp_poor")."','".getval("exp_poor_text")."')"; + $sql->query($q); +} + +$servicesQ = "insert services values ($id," + .getval("fruitveg")."," + .getval("juicebar")."," + .getval("online")."," + .getval("delivery")."," + .getval("catering")."," + .getval("vendor")."," + ."'".getval("hours")."'," + ."'".getval("services_other")."')"; +$sql->query($servicesQ); + +for ($i = 0; $i < 4; $i++){ + if (getval("part$i") != "NULL"){ + $q = "insert participation values ($id,'".chr($i+97)."',".getval("part$i").")"; + $sql->query($q); + } +} + +if (getval("other_store") != "NULL"){ + $otherQ = "insert other_stores values ($id,".getval("other_store").")"; + $sql->query($otherQ); +} + +for ($i = 0; $i < 17; $i++){ + if (getval("mem$i") != "NULL"){ + $q = "insert member_benefits values ($id,'".chr($i+97)."',".getval("mem$i").")"; + $sql->query($q); + } +} + +for ($i = 0; $i < 16; $i++){ + if (getval("imp$i") != "NULL"){ + $q = "insert importance values ($id,'".chr($i+97)."',".getval("imp$i").")"; + $sql->query($q); + } +} +if (getval("imp_other_text") != "NULL"){ + $q = "insert extra_other values ($id,16,'".getval("imp_other_text")."')"; + $sql->query($q); +} + +$featuresQ = "insert features values ($id," + .getval("location")."," + .getval("parking")."," + .getval("atmosphere")."," + .getval("staff")."," + .getval("service")."," + .getval("cleanliness")."," + .getval("public_trans")."," + .getval("orgainc_local")."," + .getval("allergy")."," + .getval("prod_info")."," + .getval("prices")."," + .getval("coop_model")."," + .getval("owner")."," + .getval("local_support")."," + .getval("community")."," + .getval("environment")."," + ."'".getval("features_other")."')"; +$sql->query($featuresQ); + +for ($i = 1; $i <= 3; $i++){ + if (getval("items$i") != "NULL"){ + $q = "insert desired_items values ($id,'".getval("items$i")."')"; + $sql->query($q); + } +} + +for ($i = 0; $i < 26; $i++){ + if (getval("deptyn$i") != "NULL"){ + $q = "insert dept_ratings values ($id,'".chr($i+97)."'," + .getval("deptyn$i")."," + .getval("deptquality$i")."," + .getval("deptstock$i")."," + .getval("deptprice$i")."," + .getval("deptselection$i")."," + .getval("deptneed$i").")"; + $sql->query($q); + } +} + +for ($i = 0; $i < 12; $i++){ + if (getval("csc$i") != "NULL"){ + $q = "insert csc values ($id,'".chr($i+97)."',".getval("csc$i").")"; + $sql->query($q); + } +} +if (getval("csc_other_text") != "NULL"){ + $q = "insert csc_poor values ($id,'m','".getval("csc_other_text")."')"; + $sql->query($q); +} +if (getval("csc_poor_text") != "NULL"){ + $q = "insert csc_poor values ($id,'".getval("csc_poor")."','".getval("csc_poor_text")."')"; + $sql->query($q); +} + +$advertQ = "insert advertising values ($id," + .getval("signage")."," + .getval("flyers")."," + .getval("brochures")."," + .getval("website")."," + .getval("newsletter")."," + .getval("billboards")."," + .getval("public_radio")."," + .getval("radio")."," + .getval("tv")."," + .getval("dnt")."," + .getval("events")."," + .getval("meetings")."," + .getval("booth")."," + .getval("employee")."," + .getval("friend")."," + ."'".getval("advert_other")."')"; +$sql->query($advertQ); + +header("Location: index.php"); +?> diff --git a/fannie/legacy/it/textify/Monaco.ttf b/fannie/legacy/it/textify/Monaco.ttf new file mode 100644 index 000000000..99a7f9675 Binary files /dev/null and b/fannie/legacy/it/textify/Monaco.ttf differ diff --git a/fannie/legacy/it/textify/index.php b/fannie/legacy/it/textify/index.php new file mode 100644 index 000000000..319f0c6da --- /dev/null +++ b/fannie/legacy/it/textify/index.php @@ -0,0 +1,26 @@ + diff --git a/fannie/legacy/it/transactionReport/index.php b/fannie/legacy/it/transactionReport/index.php new file mode 100644 index 000000000..115c89d49 --- /dev/null +++ b/fannie/legacy/it/transactionReport/index.php @@ -0,0 +1,131 @@ +Save to Excel

        "; +} + +if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."src/SQLManager.php"); +include('../../db.php'); + +$totalsByType = array(); +$itemsByType = array(); +$salesByType = array(); +$memTypes = array('Member', 'Non Member', 'Staff Member', 'Staff NonMem', 'Work/Dis Mem', 'Sen Non Member', 'Senior Member', 'On-Call Staff', 'Promo'); + +foreach($memTypes as $m){ + $totalsByType[$m] = 0; + $itemsByType[$m] = 0; + $salesByType[$m] = 0; +} + +$DoW = date("w"); + +for ($datediff = -7 - $Dow; $datediff <= -1 - $DoW; $datediff++){ + + $dailyTotals = array(); + $dailySales = array(); + $dailyItems = array(); + foreach($memTypes as $m){ + $dailyTotals[$m] = 0; + $dailyItems[$m] = 0; + $dailySales[$m] = 0; + } + + $transQ = "select q.trans_num,sum(q.quantity) as items,sum(q.total) as sales,q.transaction_type from + ( + select trans_num,card_no,quantity,total, + m.memdesc as transaction_type + from dlog_15 as d + left join custdata as c on d.card_no = c.cardno + left join memtypeid as m on c.memtype = m.memtypeid + where ".$sql->datediff('tdate',$sql->now())."=$datediff and trans_type='I' + ) as q + group by q.trans_num,q.transaction_type"; + $transR = $sql->query($transQ); + + while($transW = $sql->fetch_array($transR)){ + $dailyTotals[$transW[3]] += 1; + $dailyItems[$transW[3]] += $transW[1]; + $dailySales[$transW[3]] += $transW[2]; + + $totalsByType[$transW[3]] += 1; + $itemsByType[$transW[3]] += $transW[1]; + $salesByType[$transW[3]] += $transW[2]; + } + + $date = date("D, M j, Y", time() + (60*60*24*$datediff)); + + echo "$date
        "; + echo ""; + echo ""; + $trans = 0; + $items = 0; + $sales = 0; + foreach($memTypes as $m){ + if ($dailyTotals[$m] != 0){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + $trans += $dailyTotals[$m]; + $items += $dailyItems[$m]; + $sales += $dailySales[$m]; + } + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        TypeTransactionsItemsAvgSalesAvg
        $m".$dailyTotals[$m]."".$dailyItems[$m]."".round($dailyItems[$m]/$dailyTotals[$m],2)."".$dailySales[$m]."".round($dailySales[$m]/$dailyTotals[$m],2)."
        Total$trans$items".round($items/$trans,2).""; + echo "$sales".round($sales/$trans,2).""; + echo "
        "; + echo "
        "; +} + +echo "Overall
        "; +echo ""; +echo ""; +$trans = 0; +$items = 0; +$sales = 0; +foreach($memTypes as $m){ + if ($totalsByType[$m] != 0){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + $trans += $totalsByType[$m]; + $items += $itemsByType[$m]; + $sales += $salesByType[$m]; + } +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        TypeTransactionsItemsAvgSalesAvg
        $m".$totalsByType[$m]."".$itemsByType[$m]."".round($itemsByType[$m]/$totalsByType[$m],2)."".$salesByType[$m]."".round($salesByType[$m]/$totalsByType[$m],2)."
        Total$trans$items".round($items/$trans,2).""; +echo "$sales".round($sales/$trans,2).""; +echo "
        "; + + +?> diff --git a/fannie/legacy/it/trends/index.php b/fannie/legacy/it/trends/index.php new file mode 100755 index 000000000..bb9e121f7 --- /dev/null +++ b/fannie/legacy/it/trends/index.php @@ -0,0 +1,153 @@ += 0 + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by year(d.tdate),month(d.tdate),day(d.tdate),sum(d.total) desc"; + $result = $sql->query($query); + echo ""; + $current_day = -1; + $count = 0; + $i = 0; + $sum = 0; + $data = array(); + echo ""; + while ($row = $sql->fetch_array($result)){ + + if ($current_day != $row['day']){ + for ($j = 0; $j < count($data); $j++){ + if ($j == 0){ + echo ""; + $count++; + } + + $sum = 0; + $current_day = $row['day']; + $data = array(); + $i = 0; + if ($count % $daysperrow == 0) + echo ""; + } + $data[$i] = $row; + $sum += $row['total']; + + $i++; + } + for ($j = 0; $j < count($data); $j++){ + if ($j == 0){ + echo ""; + $count++; + } + + echo "
        "; + echo "".$data[0]['month']."/".$data[0]['day']."/".$data[0]['year']; + echo "
        "; + echo "Total: $sum
        "; + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + if ($current_day != -1){ + echo "
        ".$data[$j]['upc']."".$data[$j]['description']."".$data[$j]['total']."
        "; + echo "".$data[0]['month']."/".$data[0]['day']."/".$data[0]['year']; + echo "
        "; + echo "Total: $sum
        "; + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + if ($current_day != -1){ + echo "
        ".$data[$j]['upc']."".$data[$j]['description']."".$data[$j]['total']."
        "; +} +else { + $deptsQ = "select dept_no,dept_name from departments order by dept_no"; + $deptsR = $sql->query($deptsQ); + $deptsList = ""; + while ($deptsW = $sql->fetch_array($deptsR)) + $deptsList .= ""; +?> + + +Query + + + + + +
        + + + + + +
        Start department: + + +Start date:
        End department: + + +End date:

        +Days shown per row: +Excel
        + +
        + diff --git a/fannie/legacy/it/trends/trends.php b/fannie/legacy/it/trends/trends.php new file mode 100755 index 000000000..0f4317f1c --- /dev/null +++ b/fannie/legacy/it/trends/trends.php @@ -0,0 +1,292 @@ += 0 + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + break; + case 'manu': + if ($man_type == "name"){ + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + d.upc, p.description, + sum(d.quantity) as total + from $dlog as d left join products as p on d.upc = p.upc + left join prodExtra as x on p.upc = x.upc + where x.manufacturer = '$manufacturer' + and datediff(dd,d.tdate,'$date1') <= 0 + and datediff(dd,d.tdate,'$date2') >= 0 + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + } + else { + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + d.upc, p.description, + sum(d.quantity) as total + from $dlog as d left join products as p on d.upc = p.upc + where p.upc like '%$manufacturer%' + and datediff(dd,d.tdate,'$date1') <= 0 + and datediff(dd,d.tdate,'$date2') >= 0 + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + } + break; + case 'upc': + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + d.upc, p.description, + sum(d.quantity) as total + from $dlog as d left join products as p on d.upc = p.upc + where p.upc = '$upc' + and datediff(dd,d.tdate,'$date1') <= 0 + and datediff(dd,d.tdate,'$date2') >= 0 + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + break; + + } + //echo $query; + $result = $sql->query($query); + + // let python get dates for me - easier + exec("./trends.py $date1 $date2",$datelist); + $dates = explode(",",$datelist[0]); + + echo ""; + echo ""; + foreach ($dates as $i) + echo ""; + echo ""; + + $current_upc = ""; + $current_desc = ""; + $data = array(); + // track upc while going through the rows, storing + // all data about a given upc before printing + while ($row = $sql->fetch_array($result)){ + if ($current_upc != $row['upc']){ + // print the data + if ($current_upc != ""){ + echo ""; + echo ""; + echo ""; + foreach ($dates as $i){ + if (isset($data[$i])) + echo ""; + else + echo ""; + } + echo ""; + } + // update 'current' values and clear data + $current_upc = $row['upc']; + $current_desc = $row['description']; + $data = array(); + } + // get a yyyy-mm-dd format date from sql results + $year = $row['year']; + $month = str_pad($row['month'],2,'0',STR_PAD_LEFT); + $day = str_pad($row['day'],2,'0',STR_PAD_LEFT); + $datestr = $year."-".$month."-".$day; + + // index result into data based on date string + // this is to properly place data in the output table + // even when there are 'missing' days for a given upc + $data[$datestr] = $row['total']; + } + // print the last data set + echo ""; + echo ""; + echo ""; + foreach ($dates as $i){ + if (isset($data[$i])) + echo ""; + else + echo ""; + } + echo ""; +} +else { + $deptsQ = "select dept_no,dept_name from departments order by dept_no"; + $deptsR = $sql->query($deptsQ); + $deptsList = ""; + while ($deptsW = $sql->fetch_array($deptsR)) + $deptsList .= ""; +?> + + +Query + + + + + + + +Type: Department +Manufacturer +Single item
        + +
        +
        UPCDescription$i
        ".$current_upc."".$current_desc."".$data[$i]."0
        ".$current_upc."".$current_desc."".$data[$i]."0
        + + + + +
        Start department: + + +Start date:
        End department: + + +End date:
        +
        + +
        + + + + + +
        Manufacturer: + +Start date:
        +Name +UPC prefix +End date:
        +
        + +
        + + + + + +
        UPC: + +Start date:
        +End date:
        +
        + +
        +Excel
        + + + + + diff --git a/fannie/legacy/it/trends/trends.py b/fannie/legacy/it/trends/trends.py new file mode 100755 index 000000000..1b778170c --- /dev/null +++ b/fannie/legacy/it/trends/trends.py @@ -0,0 +1,37 @@ +#!/usr/bin/python + +""" usage: trends.py [start date] [end date] + date format is yyyy-mm-dd + returns a comma separated list of dates between the + start and end dates +""" + +import datetime +import sys +import string + +""" read command line args """ +start = sys.argv[1] +end = sys.argv[2] + +""" make dates out of the strings """ +temp = string.split(start,'-') +start_date = datetime.date(int(temp[0]),int(temp[1]),int(temp[2])) +temp = string.split(end,'-') +end_date = datetime.date(int(temp[0]),int(temp[1]),int(temp[2])) + +""" difference between dates """ +diff = end_date - start_date + +""" one day object for incrementing """ +one = datetime.timedelta(days=1) + +""" append """ +ret = start_date.isoformat()+"," +for i in xrange(diff.days - 1): + start_date += one + ret += start_date.isoformat()+"," +ret += end_date.isoformat() + +""" output """ +print ret \ No newline at end of file diff --git a/fannie/legacy/it/undo/index.php b/fannie/legacy/it/undo/index.php new file mode 100644 index 000000000..94be0be7e --- /dev/null +++ b/fannie/legacy/it/undo/index.php @@ -0,0 +1,96 @@ +"; +echo "UPC: "; +echo " "; +echo ""; + +if (isset($_GET['modified'])){ + $modified = $_GET['modified']; + $upc = $_GET['upc']; + $desc = $_GET['desc']; + $price = $_GET['price']; + $tax = $_GET['tax']; + $fs = $_GET['fs']; + $scale = $_GET['scale']; + $likecode = $_GET['likecode']; + $qty = $_GET['qty']; + $discount = $_GET['discount']; + $inuse = $_GET['inuse']; + + + $checkQ = "select upc from products where upc='$upc'"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + $fixQ = "insert products values ('$upc','$desc',$price,0,.0,0,.0,0,.0,0,'1900-01-01 00:00:00','1900-01-01 00:00:00', + $dept,0,$tax,$fs,$scale,0,now(),0,0,$discount,0,0,0,$qty,$inuse)"; + $fixR = $sql->query($fixQ); + + $checkQ2 = "select upc from prodExtra where upc='$upc'"; + $checkR2 = $sql->query($checkQ2); + if ($sql->num_rows($checkR2) == 0){ + $fixQ2 = "insert into prodExtra values ('$upc','','',0,0,0)"; + $fixR2 = $sql->query($fixQ2); + } + } + else { + $fixQ = "update products set description='$desc', + normal_price = $price, + tax = $tax, + foodstamp = $fs, + Scale = $scale, + discount = $discount, + qttyEnforced = $qty, + inUse = $inuse + where upc='$upc'"; + $fixR = $sql->query($fixQ); + + if ($likecode != -1){ + $checkQ2 = "select upc from upclike where upc='$upc' and likecode=$likecode"; + $checkR2 = $sql->query($checkQ2); + if ($sql->num_rows($checkR2) == 0){ + $fixQ2 = "insert into upclike values ('$upc',$likecode)"; + $fixR2 = $sql->query($fixQ2); + } + } + else { + $fixQ2 = "delete from upclike where upc='$upc'"; + $fixR2 = $sql->query($fixQ2); + } + } +} + +if (isset($_GET['upc'])){ + $upc = str_pad($_GET['upc'],13,'0',STR_PAD_LEFT); + + $fetchQ = "select * from prodUpdate where upc='$upc' order by modified desc"; + $fetchR = $sql->query($fetchQ); + + echo ""; + echo ""; + echo ""; + echo ""; + + while($fetchW = $sql->fetch_array($fetchR)){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        ModifiedDescriptionPriceDeptTaxFSScaleLike codeQty ForceDiscountIn Use
        {$fetchW['modified']}
        "; +} +?> diff --git a/fannie/legacy/it/undo/index2.php b/fannie/legacy/it/undo/index2.php new file mode 100644 index 000000000..1a6a7f565 --- /dev/null +++ b/fannie/legacy/it/undo/index2.php @@ -0,0 +1,131 @@ +query($upQ); +} +else if (isset($_GET['upc'])){ + $upc = str_pad($_GET['upc'],13,'0',STR_PAD_LEFT); + + $prodQ = "select upSty,updated,modifiedby,upc,description,normal_price, + special_price,datepart(ss,updated),datepart(ms,updated) + from prodUpdateFull where upc='$upc' order by updated desc"; + $prodR = $sql->query($prodQ); + + if ($sql->num_rows($prodR) == 0){ + echo "Bad UPC"; + return; + } + + $prodW = $sql->fetch_array($prodR); + $types = array('NEW ITEM','PRICE CHANGE','DELETED','BATCH START','BATCH END'); + + echo "$prodW[3] : $prodW[4]
        "; + echo ""; + echo ""; + do { + echo ""; + echo ""; + $str = datefix($prodW[1],$prodW[7],$prodW[8]); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } while ($prodW = $sql->fetch_array($prodR)); +} +else { +?> + +Product reversal + + + +UPC: + + + + +query returns an approximation of date times to PHP + reformat the string return by sql to correct format (YYYY-MM-DD HH:MM) + and tack on seconds and milliseconds (YYYY-MM-DD HH:MM:SS.MMM) + the returned string can be compared directly in a query + e.g., where updated = '$str' +*/ +function datefix($sql_str,$seconds=0,$milliseconds=0){ + $matches = array(); + preg_match("/(.*?) (\d\d) (\d\d\d\d) (\d\d):(\d\d)(.*?)/",$sql_str,$matches); + + $months = array( + "Jan" => 1, + "Feb" => 2, + "Mar" => 3, + "Apr" => 4, + "May" => 5, + "Jun" => 6, + "Jul" => 7, + "Aug" => 8, + "Sep" => 9, + "Oct" => 10, + "Nov" => 11, + "Dec" => 12 + ); + + $datestring = $matches[3]."-"; + $datestring .= str_pad($months[$matches[1]],2,'0',STR_PAD_LEFT)."-"; + $datestring .= $matches[2]." "; + $hour = (int)$matches[4]; + if ($matches[6] == "PM" and $hour != 12){ + $hour += 12 ; + } + else if ($matches[6] == "AM" and $hour == 12){ + $hour = 0; + } + $datestring .= str_pad($hour,2,'0',STR_PAD_LEFT); + $datestring .= ":".$matches[5].":"; + $datestring .= str_pad($seconds,2,'0',STR_PAD_LEFT)."."; + $datestring .= str_pad($milliseconds,3,'0',STR_PAD_LEFT); + + return $datestring; +} + +?> diff --git a/fannie/legacy/it/votenet.php b/fannie/legacy/it/votenet.php new file mode 100644 index 000000000..7fda36cb9 --- /dev/null +++ b/fannie/legacy/it/votenet.php @@ -0,0 +1,22 @@ +query($query); + +echo "username,password,firstname,lastname,email".$NL; +while($row = $sql->fetch_row($result)){ + $row[2] = str_replace(","," ",$row[2]); + $uname = strtolower($row[1][0] . $row[2]); + echo $uname.",".trim($row[0]).",".$row[1].",".$row[2].",".$NL; +} + +?> diff --git a/fannie/legacy/it/website_menu_rollover.py b/fannie/legacy/it/website_menu_rollover.py new file mode 100644 index 000000000..5f7f0fcaa --- /dev/null +++ b/fannie/legacy/it/website_menu_rollover.py @@ -0,0 +1,36 @@ +#!/usr/bin/python + +import MySQLdb + +fp = open('/var/www/html/git/fannie/src/Credentials/ExternalDB.python') +line = fp.read().strip() +fp.close() +hostname,username,pw,dbname = line.split(",") + +conn = MySQLdb.connect(hostname,username,pw,dbname,use_unicode=True) +db = conn.cursor() + +for i in xrange(1,8,1): + fetchQ = u"select dayname,menu from delimenu where day="+str(i+7) + db.execute(fetchQ) + row = db.fetchone() + dayname = row[0] + menu = row[1].replace("'","''") + + upQ1 = u"update delimenu set dayname='"+dayname+"',menu='"+menu+"' where day="+str(i) + upQ2 = u"update delimenu set dayname='',menu='' where day="+str(i+7) + + db.execute(upQ1) + db.execute(upQ2) + +checkQ = "select menu from delimenu where day=1" +db.execute(checkQ) +row = db.fetchone() +if row[0] == '': + import smtplib + server = smtplib.SMTP('localhost') + toaddr = 'gohanman@gmail.com' + fromaddr = 'andy@wholefoods.coop' + subject = 'Deli Menu' + headers = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (fromaddr,toaddr,subject) + server.sendmail(fromaddr,toaddr,headers+'You forgot the deli menu') diff --git a/fannie/legacy/lanedefs.php b/fannie/legacy/lanedefs.php new file mode 100644 index 000000000..18a390554 --- /dev/null +++ b/fannie/legacy/lanedefs.php @@ -0,0 +1,25 @@ + diff --git a/fannie/legacy/members/.gitignore b/fannie/legacy/members/.gitignore new file mode 100644 index 000000000..bd402716b --- /dev/null +++ b/fannie/legacy/members/.gitignore @@ -0,0 +1 @@ +docfile/* diff --git a/fannie/legacy/members/EOM_Reporting/agedPatronage.php b/fannie/legacy/members/EOM_Reporting/agedPatronage.php new file mode 100644 index 000000000..d0db8a22a --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/agedPatronage.php @@ -0,0 +1,148 @@ +monthdiff($sql->now(),'d.tdate')." as monthsAgo, + sum(CASE WHEN d.trans_type='T' THEN -1*d.total ELSE 0 END) + FROM $dlog AS d LEFT JOIN + meminfo AS m ON d.card_no = m.card_no LEFT JOIN + custdata AS c ON d.card_no = c.CardNo AND c.personNum = 1 + WHERE c.memType = 1 + GROUP BY m.card_no,".$sql->monthdiff($sql->now(),'d.tdate').",d.trans_num + ORDER BY m.card_no,".$sql->monthdiff($sql->now(),'d.tdate')." DESC"; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +echo "
        TypeDatePriceSale Price
        {$types[$prodW[0]]}$str$prodW[5]$prodW[6]Revert
        "; +echo ""; +for ($i=4; $i >=0; $i--){ + echo ""; +} +echo ""; +$b = 1; +echo ""; +echo ""; +echo ""; +echo ""; +for ($i=0;$i<5;$i++){ + echo ""; + echo ""; + echo ""; + echo ""; +} +$b = 0; +echo ""; + +$result = $sql->query($query); +$skip = True; +$curNo = -1; +$demo = array('','',''); +$data = array( + array(0,0), + array(0,0), + array(0,0), + array(0,0), + array(0,0) +); +while($row = $sql->fetch_row($result)){ + if ($curNo != $row[0]){ + if (!$skip){ + echo ""; + echo ""; + foreach($demo as $d) echo ""; + foreach($data as $d){ + echo ""; + echo ""; + echo ""; + $avg = 0; + if ($d[1] != 0) $avg = $d[0]/$d[1]; + echo ""; + } + echo ""; + for ($i=0;$i<3;$i++) echo ""; + echo ""; + $b = ($b+1)%2; + } + $curNo = $row[0]; + $demo[0] = $row[1].' '.$row[2]; + $demo[1] = $row[3]; + $demo[2] = $row[4]; + $skip = False; + $data = array( + array(0,0), + array(0,0), + array(0,0), + array(0,0) + ); + } + if (!$skip){ + if ($row[5] == -1) { + $skip = True; + } + else { + if ($row[5] == -1) echo "WTF"; + $index = 5 - (-1*$row[5]); + $data[$index][0] += $row[6]; + $data[$index][1] += 1; + } + } +} + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/agedTrialBalances.php b/fannie/legacy/members/EOM_Reporting/agedTrialBalances.php new file mode 100644 index 000000000..20b9c8654 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/agedTrialBalances.php @@ -0,0 +1,56 @@ + 'TERM' + and ( + priorBalance <> 0 or + threeMonthCharges <> 0 or + threeMonthPayments <> 0 or + threeMonthBalance <> 0 or + twoMonthCharges <> 0 or + twoMonthPayments <> 0 or + twoMonthBalance <> 0 or + lastMonthCharges <> 0 or + lastMonthPayments <> 0 or + lastMonthBalance <> 0 + ) + order by a.cardno"; +$headers = array('Mem Num','Name','Prior Balance', + 'Charge','Payment','Balance', + 'Charge','Payment','Balance', + 'Charge','Payment','Balance'); + +echo "
        Aged Patronage Report ".date("M Y",mktime(0,0,0,$dates[$i][0],1,$dates[$i][1]))."
        No.NameCityZip SalesVisitsAvg
        $curNo$d $d[0]$d[1]".round($avg,2)." 0
        \n"; +echo ""; +echo ""; +echo ""; +echo ""; + +select_to_table2($query,array(),0,'#ffffcc',120,0,0,$headers,True); + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/defectors.php b/fannie/legacy/members/EOM_Reporting/defectors.php new file mode 100644 index 000000000..0e14c315c --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/defectors.php @@ -0,0 +1,68 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no,CONCAT(c.FirstName,' ',c.LastName),z.start_date, + m.zip,d.fiveMonthsAgo,d.fourMonthsAgo, + d.threeMonthsAgo + from meminfo as m left join + custdata as c on m.card_no=c.CardNo + and c.personNum=1 left join + Defectors as d on m.card_no = d.card_no + left join memDates AS z ON m.card_no=z.card_no + where d.card_no is not null + and d.type = 'DEFECTOR' + and ".$sql->monthdiff($sql->now(),'selectionDate')." = 0 + order by m.card_no"; + +echo "
         3 Months Prior2 Months PriorLast Month
        \n"; +$headers = array('Mem Num','Name','Opening Date','Zipcode'); +array_push($headers,date("M y",mktime(0,0,0,date("n")-5,1,date("Y")))); +array_push($headers,date("M y",mktime(0,0,0,date("n")-4,1,date("Y")))); +array_push($headers,date("M y",mktime(0,0,0,date("n")-3,1,date("Y")))); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +while($row = $sql->fetch_row($result)){ + echo ""; + echo sprintf("",$backgrounds[$b],$row[0]); + echo sprintf("",$backgrounds[$b],$row[1]); + echo sprintf("",$backgrounds[$b],$row[2]); + echo sprintf("",$backgrounds[$b],substr($row[3],0,5)); + echo sprintf("",$backgrounds[$b],$row[4]); + echo sprintf("",$backgrounds[$b],$row[5]); + echo sprintf("",$backgrounds[$b],$row[6]); + echo ""; + $b = ($b+1)%2; +} +echo "
        $h
        %s%s%s%s%s%s%s
        "; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/defectors.py b/fannie/legacy/members/EOM_Reporting/defectors.py new file mode 100644 index 000000000..f9951e8f5 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/defectors.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +import datetime + +today = datetime.datetime.today() +year = today.year +month = today.month + +dlog = "(" +for i in xrange(5): + month -= 1 + if month == 0: + month = 12 + year -= 1 + dlog += "SELECT * FROM dlog_archive.dbo.dlog_%d_%s" % (year, str(month).zfill(2)) + if i != 4: dlog += " UNION ALL " + else: dlog += ")" + + +query = """ +INSERT INTO Defectors +select d.card_no,'DEFECTOR',getdate(), +sum(case when datediff(mm,getdate(),tdate)=-5 + and trans_type in ('D','I') then d.total else 0 end) as month1, +sum(case when datediff(mm,getdate(),tdate)=-4 + and trans_type in ('D','I') then d.total else 0 end) as month2, +sum(case when datediff(mm,getdate(),tdate)=-3 + and trans_type in ('D','I') then d.total else 0 end) as month3 +from +%s as d +LEFT JOIN DefectionNotices as n +on d.card_no = n.card_no +LEFT JOIN custdata as c +on d.card_no=c.cardno and c.personnum=1 +where noticesThisYear <= 1 and noticesThisQuarter = 0 +and c.type <> 'TERM' and c.memType not in (3,9) +group by d.card_no +having +sum(case when datediff(mm,getdate(),tdate)=-5 then 1 else 0 end) <> 0 and +sum(case when datediff(mm,getdate(),tdate)=-4 then 1 else 0 end) <> 0 and +sum(case when datediff(mm,getdate(),tdate)=-3 then 1 else 0 end) <> 0 and +sum(case when datediff(mm,getdate(),tdate)=-2 then 1 else 0 end) = 0 and +sum(case when datediff(mm,getdate(),tdate)=-1 then 1 else 0 end) = 0""" % dlog + +print query + +import Sybase +conn = Sybase.connect() +db = conn.cursor() +db.execute("use WedgePOS") +db.execute(query) +conn.commit() diff --git a/fannie/legacy/members/EOM_Reporting/demographics.php b/fannie/legacy/members/EOM_Reporting/demographics.php new file mode 100644 index 000000000..a7755e989 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/demographics.php @@ -0,0 +1,220 @@ +query($totalQ); + +$totalMems = 0; +$totalActiveMems = 0; +$yearBuckets = array("1991 or earlier"=>array(0,0)); +while ($totalW = $sql->fetch_row($totalR)){ + if ($totalW[0] <= 1991){ + if ($totalW[1] == 'PC') + $yearBuckets["1991 or earlier"][0]++; + $yearBuckets["1991 or earlier"][1]++; + } + else { + if (empty($yearBuckets["$totalW[0]"]) || !isset($yearBuckets["$totalW[0]"])) + $yearBuckets["$totalW[0]"] = array(0,0); + if ($totalW[1] == 'PC') + $yearBuckets["$totalW[0]"][0]++; + $yearBuckets["$totalW[0]"][1]++; + } + + $totalMems++; + if ($totalW[1] == 'PC') $totalActiveMems++; +} + +echo ""; +echo ""; +echo ""; +echo "
        Total members$totalMemsActive$totalActiveMems".round(100*$totalActiveMems/$totalMems,2)."%
        "; + +echo "

        "; + +echo ""; +echo ""; +foreach ($yearBuckets as $k=>$v){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        Activated Still active 
        $k$v[1]$v[0]".round(100*$v[0]/$v[1],2)."%
        "; + +$patronageLMQ = "select d.card_no from $dlog_lm as d LEFT JOIN + custdata as c on c.CardNo=d.card_no LEFT JOIN + suspensions as s on s.cardno=d.card_no + WHERE c.personNum=1 and (c.memType=1 or s.memtype1=1) + AND register_no <> 30 + AND (tdate BETWEEN $lm_span) + GROUP BY d.card_no"; +$patronageLM = $sql->num_rows($sql->query($patronageLMQ)); + +$patronageLQQ = "select d.card_no from $dlog_lq as d LEFT JOIN + custdata as c on c.CardNo=d.card_no LEFT JOIN + suspensions as s on s.cardno=d.card_no + WHERE c.personNum=1 and (c.memType=1 or s.memtype1=1) + and register_no <> 30 + AND tdate BETWEEN $lq_span + GROUP BY d.card_no"; +$patronageLQ = $sql->num_rows($sql->query($patronageLQQ)); + +$yearQ = "select y.card_no,month_no,-1*total, + ".$sql->monthdiff($sql->now(),'m.start_date')." + from YTD_Patronage_Speedup as y left join + memDates as m on y.card_no=m.card_no + where y.total <> 0 + order by y.card_no"; +$yearR = $sql->query($yearQ); + +$curNo = 0; +$curVisits = array(0,0,0,0,0,0,0,0,0,0,0,0,0); +$curLength=0; +$curSpending = 0; +$patronageLY = 0; + +$patronageBuckets = array("More than 4"=>0,"3-4"=>0,"2-3"=>0,"1-2"=>0,"Less than 1"=>0); +$loyaltyBuckets = array("Over $5,000"=>0, + "$4,000.01 - $5,000"=>0, + "$3,000.01 - $4,000"=>0, + "$2,000.01 - $3,000"=>0, + "$1,000.01 - $2,000"=>0, + "$1,000 or less"=>0); +while($yearW = $sql->fetch_row($yearR)){ + if ($yearW[0] != $curNo){ + if ($curNo != 0){ + if ($curSpending <= 1000) $loyaltyBuckets["$1,000 or less"]++; + elseif ($curSpending <= 2000) $loyaltyBuckets["$1,000.01 - $2,000"]++; + elseif ($curSpending <= 3000) $loyaltyBuckets["$2,000.01 - $3,000"]++; + elseif ($curSpending <= 4000) $loyaltyBuckets["$3,000.01 - $4,000"]++; + elseif ($curSpending <= 5000) $loyaltyBuckets["$4,000.01 - $5,000"]++; + elseif ($curSpending > 5000) $loyaltyBuckets["Over $5,000"]++; + + $sum = 0; + foreach($curVisits as $c) $sum+=$c; + $avg = $sum/12.0; + if ($curLength < 12) + $avg = ($curLength==0) ? 0 : $sum / ((float)$curLength); + if ($avg < 1) $patronageBuckets["Less than 1"]++; + elseif ($avg < 2) $patronageBuckets["1-2"]++; + elseif ($avg < 3) $patronageBuckets["2-3"]++; + elseif ($avg < 4) $patronageBuckets["3-4"]++; + elseif ($avg >= 4) $patronageBuckets["More than 4"]++; + + $patronageLY++; + } + $curVisits = array(0,0,0,0,0,0,0,0,0,0,0,0,0); + $curSpending = 0; + $curNo = $yearW[0]; + $curLength = $yearW[3]; + } + $curSpending += $yearW[2]; + $curVisits[(int)$yearW[1]]++; +} +// last set +if ($curSpending <= 1000) $loyaltyBuckets["$1,000 or less"]++; +elseif ($curSpending <= 2000) $loyaltyBuckets["$1,000.01 - $2,000"]++; +elseif ($curSpending <= 3000) $loyaltyBuckets["$2,000.01 - $3,000"]++; +elseif ($curSpending <= 4000) $loyaltyBuckets["$3,000.01 - $4,000"]++; +elseif ($curSpending <= 5000) $loyaltyBuckets["$4,000.01 - $5,000"]++; +elseif ($curSpending > 5000) $loyaltyBuckets["Over $5,000"]++; + +$sum = 0; +foreach($curVisits as $c) $sum+=$c; +$avg = $sum/12.0; +if ($curLength < 12) + $avg = ($curLength==0) ? 0 : $sum / ((float)$curLength); +if ($avg < 1) $patronageBuckets["Less than 1"]++; +elseif ($avg < 2) $patronageBuckets["1-2"]++; +elseif ($avg < 3) $patronageBuckets["2-3"]++; +elseif ($avg < 4) $patronageBuckets["3-4"]++; +elseif ($avg >= 4) $patronageBuckets["More than 4"]++; + +$patronageLY++; + +echo "

        Participation (at least one purchase in the:)"; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Last Month$patronageLM".round(100*$patronageLM/$totalActiveMems,2)."%
        Last 3 Months$patronageLQ".round(100*$patronageLQ/$totalActiveMems,2)."%
        Last 12 Months$patronageLY".round(100*$patronageLY/$totalActiveMems,2)."%
        "; + +echo "

        Patronage (Avg. monthly visits in the last 12 months)"; +echo ""; +foreach($patronageBuckets as $k=>$v){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        $k$v".round(100*$v/$totalActiveMems,2)."%
        "; + +echo "

        Loyalty (Spending in the last 12 months)"; +echo ""; +foreach($loyaltyBuckets as $k=>$v){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        $k$v".round(100*$v/$totalActiveMems,2)."%
        "; + +$output = ob_get_contents(); +ob_end_clean(); +if (!isset($_RREQUEST['month'])) + put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/developers.php b/fannie/legacy/members/EOM_Reporting/developers.php new file mode 100644 index 000000000..6954e4195 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/developers.php @@ -0,0 +1,79 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +/*************************************************************** +* SQL Note: +* The last three columns in Defectors are named fiveMonthsAgo +* fourMonthsAgo, and threeMonthsAgo. That's correct for +* defectors but wrong for developers. I'm sticking more recent +* data in those columns in this case. +* +* The two types were merged into one table so that total mailing +* per period time could be limited. The column names are +* an artificat of earlier separation +***************************************************************/ +$query = "select m.card_no,c.firstname+' '+c.lastname,z.start_date, + m.zip,d.fiveMonthsAgo,d.fourMonthsAgo, + d.threeMonthsAgo + from meminfo as m left join + custdata as c on m.card_no=c.cardno + and c.personnum=1 left join + Defectors as d on m.card_no = d.card_no + left join memDates as z ON m.card_no=z.card_no + where d.card_no is not null + and d.type = 'DEVELOPER' + and ".$sql->monthdiff($sql->now(),'selectionDate')." = 0 + order by m.card_no"; + +echo "\n"; +$headers = array('Mem Num','Name','Opening Date','Zipcode'); +array_push($headers,date("M y",mktime(0,0,0,date("n")-3,1,date("Y")))); +array_push($headers,date("M y",mktime(0,0,0,date("n")-2,1,date("Y")))); +array_push($headers,date("M y",mktime(0,0,0,date("n")-1,1,date("Y")))); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +while($row = $sql->fetch_row($result)){ + echo ""; + echo sprintf("",$backgrounds[$b],$row[0]); + echo sprintf("",$backgrounds[$b],$row[1]); + echo sprintf("",$backgrounds[$b],$row[2]); + echo sprintf("",$backgrounds[$b],substr($row[3],0,5)); + echo sprintf("",$backgrounds[$b],$row[4]); + echo sprintf("",$backgrounds[$b],$row[5]); + echo sprintf("",$backgrounds[$b],$row[6]); + echo ""; + $b = ($b+1)%2; +} +echo "
        $h
        %s%s%s%s%s%s%s
        "; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/developers.py b/fannie/legacy/members/EOM_Reporting/developers.py new file mode 100644 index 000000000..8bfff05c4 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/developers.py @@ -0,0 +1,64 @@ +import datetime + +today = datetime.datetime.today() +year = today.year +month = today.month + +dlog = "(" +for i in xrange(3): + month -= 1 + if month == 0: + month = 12 + year -= 1 + dlog += "SELECT * FROM trans_archive.dbo.dlog%d%s" % (year, str(month).zfill(2)) + if i != 2: dlog += " UNION ALL " + else: dlog += ")" + +################################################################ +# SQL Note: +# The last three columns in Defectors are named fiveMonthsAgo +# fourMonthsAgo, and threeMonthsAgo. That's correct for +# defectors but wrong for developers. I'm sticking more recent +# data in those columns here. +# +# The two were merged into one table so that total mailing +# per period time could be limited. The column names are +# an artificat of earlier separation +################################################################ +query = """ +INSERT INTO Defectors +select d.card_no,'DEVELOPER',getdate(), +sum(case when datediff(mm,getdate(),tdate)=-3 + and trans_type in ('D','I') then d.total else 0 end) as month1, +sum(case when datediff(mm,getdate(),tdate)=-2 + and trans_type in ('D','I') then d.total else 0 end) as month2, +sum(case when datediff(mm,getdate(),tdate)=-1 + and trans_type in ('D','I') then d.total else 0 end) as month3 +from +%s as d +LEFT JOIN DefectionNotices as n +on d.card_no = n.card_no +LEFT JOIN custdata as c +on d.card_no=c.cardno and c.personnum=1 +where noticesThisYear <= 1 and noticesThisQuarter = 0 +and c.type <> 'TERM' and c.memType not in (3,9) +group by d.card_no +having +sum(case when datediff(mm,getdate(),tdate)=-3 + and trans_type in ('D','I') then d.total else 0 end) + BETWEEN 0.01 and 50.00 AND +sum(case when datediff(mm,getdate(),tdate)=-2 + and trans_type in ('D','I') then d.total else 0 end) + BETWEEN 0.01 and 50.00 AND +sum(case when datediff(mm,getdate(),tdate)=-1 + and trans_type in ('D','I') then d.total else 0 end) + BETWEEN 0.01 and 50.00 """ % dlog + +print query + +import Sybase +conn = Sybase.connect() +db = conn.cursor() +db.execute("use WedgePOS") +db.execute(query) +conn.commit() diff --git a/fannie/legacy/members/EOM_Reporting/equityDue1.php b/fannie/legacy/members/EOM_Reporting/equityDue1.php new file mode 100644 index 000000000..8023fd7ff --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/equityDue1.php @@ -0,0 +1,112 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no,CONCAT(c.FirstName,' ',c.LastName),m.start_date, + DATE_ADD(m.start_date, INTERVAL 2 YEAR) as endDate, + s.stockPurchase,s.tdate,n.payments + from memDates as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join is4c_trans.stockpurchases as s on m.card_no=s.card_no + left join is4c_trans.newBalanceStockToday_test as n on m.card_no=n.memnum + where ".$sql->monthdiff($sql->now(),'DATE_ADD(m.start_date,INTERVAL 2 YEAR)')." = 1 + and c.type='PC' and n.payments < 100 + order by m.card_no,s.tdate"; + +echo "\n"; +$headers = array('Mem Num','Name','Opening Date','Ending Date', +'First Buy Ammount','Last Buy Date','Total Equity'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$firstBuy=0; +$lastrow = array(); +while($row = $sql->fetch_row($result)){ + if ($curMem != $row[0]){ + if ($curMem != -1){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + } + $curMem = $row[0]; + $firstBuy = $row[4]; + } + $lastrow = $row; +} +if (count($lastrow) > 0){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; +} +echo "
        $h
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/equityDue2.php b/fannie/legacy/members/EOM_Reporting/equityDue2.php new file mode 100644 index 000000000..14157d1cf --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/equityDue2.php @@ -0,0 +1,112 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no,CONCAT(c.FirstName,' ',c.LastName),m.start_date, + DATE_ADD(m.start_date,INTERVAL 2 YEAR) as endDate, + s.stockPurchase,s.tdate,n.payments + from memDates as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join is4c_trans.stockpurchases as s on m.card_no=s.card_no + left join is4c_trans.newBalanceStockToday_test as n on m.card_no=n.memnum + where ".$sql->monthdiff($sql->now(),'DATE_ADD(m.card_no,INTERVAL 2 YEAR)')." = 0 + and c.Type='PC' and n.payments < 100 + order by m.card_no,s.tdate"; + +echo "\n"; +$headers = array('Mem Num','Name','Opening Date','Ending Date', +'First Buy Ammount','Last Buy Date','Total Equity'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$firstBuy=0; +$lastrow = array(); +while($row = $sql->fetch_row($result)){ + if ($curMem != $row[0]){ + if ($curMem != -1){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + } + $curMem = $row[0]; + $firstBuy = $row[4]; + } + $lastrow = $row; +} +if (count($lastrow) > 0){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; +} +echo "
        $h
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/inactivationsAR.php b/fannie/legacy/members/EOM_Reporting/inactivationsAR.php new file mode 100644 index 000000000..a2ebcb128 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/inactivationsAR.php @@ -0,0 +1,48 @@ + 'TERM' and c.memtype <> 9 + and c.type <> 'INACT' + and twoMonthBalance > 1 + and c.balance <> 0 + and lastMonthPayments < twoMonthBalance + order by convert(int,a.cardno)"; +$headers = array('Mem Num','Name','Prior Balance', + 'Charge','Payment','Balance', + 'Charge','Payment','Balance', + 'Charge','Payment','Balance'); + +echo "\n"; +echo ""; +echo ""; +echo ""; +echo ""; + +select_to_table2($query,array(),0,'#ffffcc',120,0,0,$headers,True); + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/inactivationsStock.php b/fannie/legacy/members/EOM_Reporting/inactivationsStock.php new file mode 100644 index 000000000..c3e3eb80d --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/inactivationsStock.php @@ -0,0 +1,112 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no,CONCAT(c.FirstName,' ',c.LastName),m.start_date, + DATE_ADD(m.start_date,INTERVAL 2 YEAR) as endDate, + s.stockPurchase,s.tdate,n.payments + from memDates as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join is4c_trans.stockpurchases as s on m.card_no=s.card_no + left join is4c_trans.newBalanceStockToday_test as n on m.card_no=n.memnum + where ".$sql->monthdiff($sql->now(),'DATE_ADD(m.start_date,INTERVAL 2 YEAR)')." = -1 + and c.Type='PC' and n.payments < 100 + order by m.card_no,s.tdate"; + +echo "
         3 Months Prior2 Months PriorLast Month
        \n"; +$headers = array('Mem Num','Name','Opening Date','Ending Date', +'First Buy Ammount','Last Buy Date','Total Equity'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$firstBuy=0; +$lastrow = array(); +while($row = $sql->fetch_row($result)){ + if ($curMem != $row[0]){ + if ($curMem != -1){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + } + $curMem = $row[0]; + $firstBuy = $row[4]; + } + $lastrow = $row; +} +if (count($lastrow) > 0){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; +} +echo "
        $h
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/inactiveAll.php b/fannie/legacy/members/EOM_Reporting/inactiveAll.php new file mode 100644 index 000000000..5422c3e8d --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/inactiveAll.php @@ -0,0 +1,120 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select s.cardno,r.mask from + suspensions as s left join reasoncodes as r + on s.reasoncode & r.mask <> 0 + where s.memtype2 = 'PC' and + ".$sql->monthdiff($sql->now(),'s.suspDate')." = 1 + order by s.cardno"; + +echo "\n"; +$headers = array('Mem Num','Overdue A/R','Equity Lapse','NSF Check','Contact Info','Equity Trans','Other'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$firstBuy=0; +$reasons = array(" "," "," "," "," "," "); +$rsums = array(0,0,0,0,0,0); +while($row = $sql->fetch_row($result)){ + if ($curMem != $row[0]){ + if ($curMem != -1){ + echo ""; + echo ""; + foreach ($reasons as $r){ + echo ""; + } + echo ""; + $b = ($b+1)%2; + } + $curMem = $row[0]; + $reasons = array(" "," "," "," "," "," "); + } + switch($row[1]){ + case '1': + $reasons[0] = "1"; + $rsums[0] += 1; + break; + case '2': + case '4': + $reasons[1] = "1"; + $rsums[1] += 1; + break; + case '8': + $reasons[2] = "1"; + $rsums[2] += 1; + break; + case '16': + $reasons[3] = "1"; + $rsums[3] += 1; + break; + case '32': + $reasons[4] = "1"; + $rsums[4] += 1; + break; + default: + $reasons[5] = "1"; + $rsums[5] += 1; + } +} +echo ""; +echo ""; +foreach ($reasons as $r){ + echo ""; +} +echo ""; +$b = ($b+1)%2; +echo ""; +echo ""; +foreach ($rsums as $r){ + echo ""; +} +echo ""; +echo "
        $h
        $curMem$r
        $curMem$r
        Totals$r
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/inactiveCurrent.php b/fannie/legacy/members/EOM_Reporting/inactiveCurrent.php new file mode 100644 index 000000000..9b95691b3 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/inactiveCurrent.php @@ -0,0 +1,109 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select s.cardno,r.mask from + suspensions as s left join reasoncodes as r + on s.reasoncode & r.mask <> 0 + left join custdata as c ON s.cardno=c.CardNo + AND c.personNum=1 + where s.memtype2 = 'PC' + AND c.Type = 'INACT' + AND s.reasoncode <> 0 + order by s.cardno"; + +echo "\n"; +$headers = array('Mem Num','Overdue A/R','Equity Lapse','NSF Check','Contact Info','Equity Trans','Other'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$firstBuy=0; +$reasons = array(" "," "," "," "," "," "); +$rsums = array(0,0,0,0,0,0); +while($row = $sql->fetch_row($result)){ + if ($curMem != $row[0]){ + if ($curMem != -1){ + echo ""; + echo ""; + foreach ($reasons as $r){ + echo ""; + } + echo ""; + $b = ($b+1)%2; + } + $curMem = $row[0]; + $reasons = array(" "," "," "," "," "," "); + } + switch($row[1]){ + case '1': + $reasons[0] = "1"; + $rsums[0] += 1; + break; + case '2': + case '4': + $reasons[1] = "1"; + $rsums[1] += 1; + break; + case '8': + $reasons[2] = "1"; + $rsums[2] += 1; + break; + case '16': + $reasons[3] = "1"; + $rsums[3] += 1; + break; + case '32': + $reasons[4] = "1"; + $rsums[4] += 1; + break; + default: + $reasons[5] = "1"; + $rsums[5] += 1; + } +} +echo ""; +echo ""; +foreach ($reasons as $r){ + echo ""; +} +echo ""; +$b = ($b+1)%2; +echo ""; +echo ""; +foreach ($rsums as $r){ + echo ""; +} +echo ""; +echo "
        $h
        $curMem$r
        $curMem$r
        Totals$r
        "; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/inactiveStockYTD.php b/fannie/legacy/members/EOM_Reporting/inactiveStockYTD.php new file mode 100644 index 000000000..b66c38015 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/inactiveStockYTD.php @@ -0,0 +1,115 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no,CONCAT(c.FirstName,' ',c.LastName),m.start_date, + DATE_ADD(m.start_date,INTERVAL 2 YEAR) as endDate, + s.stockPurchase,s.tdate,n.payments + from memDates as m left join + custdata as c on c.CardNo=m.card_no and c.personNum=1 + left join is4c_trans.stockpurchases as s on m.card_no=s.card_no + left join is4c_trans.newBalanceStockToday_test as n on m.card_no=n.memnum + where datediff(now(),DATE_ADD(m.start_date,INTERVAL 2 YEAR)) >= 1 + and datediff(now(),DATE_ADD(m.start_date,INTERVAL 2 YEAR)) = 0 + and c.Type in ('INACT','INACT2','TERM') and n.payments < 100 + and m.card_no not between 5000 and 5999 + and c.memType <> 2 + order by m.card_no,s.tdate"; + +echo "\n"; +$headers = array('Mem Num','Name','Opening Date','Ending Date', +'First Buy Ammount','Last Buy Date','Total Equity'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$firstBuy=0; +$lastrow = array(); +while($row = $sql->fetch_row($result)){ + if ($curMem != $row[0]){ + if ($curMem != -1){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + } + $curMem = $row[0]; + $firstBuy = $row[4]; + } + $lastrow = $row; +} +if (count($lastrow) > 0){ + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[3]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + $temp = explode(' ',$lastrow[5]); + $temp = explode('-',$temp[0]); + $fixeddate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; +} +echo "
        $h
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        $lastrow[0]$lastrow[1]$lastrow[2]$fixeddate$firstBuy$fixeddate$lastrow[6]
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/index.php b/fannie/legacy/members/EOM_Reporting/index.php new file mode 100644 index 000000000..6b544572a --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/index.php @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        ReportDescription
        Aged Trial Balances
        + Regular
        + Excel +
        Summary of AR last month, two months ago, and three months ago + for all members except:
          +
        • Terminated memberships
        • +
        • Staff Non-members
        • +
        • Members with no AR activity in the time span
        • +
        Inactivations for AR
        + Regular
        + Excel +
        Lists members with a balance > $1 three months ago + and no payments. Members who meet these conditions but + are already inactive are currently exluded. Again, + terminated members and staff non-members are also excluded. +
        New Members Last Month
        + Regular
        + Excel +
        + All members joining last month with contact information, + start & end dates, and first stock purchase amount. + This report also includes potential matches against existing + memberships. +
        New Members Year to Date
        + Regular
        + Excel +
        + All members joining this yearwith contact information, + start & end dates, and first stock purchase amount. +
        First Equity Due
        + Regular
        + Excel +
        + Members whose final equity payment is due next month +
        Second Equity Due
        + Regular
        + Excel +
        + Members whose final equity payment is due this month +
        Inactivations for Equity
        + Regular
        + Excel +
        + Members whose final equity payment was due last month + and have less than $100 equity +
        Inactivations for Equity YTD
        + Regular
        + Excel +
        + Members who have been inactivated or termed with less + than $100 equity and a final due date this year. +
        Aged Patronage Report
        + Regular
        + Excel +
        + Listing of members who made no purchases in the previous month + but visited the store at some point in the four months before that. + There's very small chance that number of visits is occasionally underestimated, + but I don't want to slow the report down even more to fix it. +
        Shopper statistics
        + Regular
        + Excel +
        + Active members, shopping frequency, and spending +
        Patronage Report (defectors)
        + Regular
        + Excel +
        + List of members who visited the store five, four, and three months ago + but made no visits in the previous two months. Members are selected for this + list at most once quarterly and twice yearly + (In combination with the developers report below). + Terminated memberships and + staff are suppressed. +
        Patronage Report (developers)
        + Regular
        + Excel +
        + List of members who consistently shopped here for the last three months + and spent between $0.01 and $50.00 per month. + Members are selected for this list at most once quarterly and twice yearly + (In combination with the defectors report above). + Terminated memberships and staff are suppressed. +
        Inactivations Last Month
        + Regular
        + Excel +
        + Members who were made inactive last month & the reason given. + This differs from the above AR and Equity above. Members in this report + are already inactive. Members in the above reports should be + made inactive. +
        Current Inactivations
        + Regular
        + Excel +
        + All members who are currently inactive. +
        diff --git a/fannie/legacy/members/EOM_Reporting/newMembersEOM.php b/fannie/legacy/members/EOM_Reporting/newMembersEOM.php new file mode 100644 index 000000000..3a49259be --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/newMembersEOM.php @@ -0,0 +1,150 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no, + c.FirstName,c.LastName, + m.street,m.city,m.state,m.zip, + d.start_date, + DATE_ADD(d.start_date,INTERVAL 2 YEAR) as endDate, + s.stockPurchase, + year(d.start_date), + month(d.start_date), + day(d.start_date) + from meminfo as m + left join is4c_trans.stockpurchases as s on m.card_no=s.card_no + left join custdata as c on m.card_no=c.CardNo and c.personNum=1 + left join memDates as d on m.card_no=d.card_no + where ".$sql>monthdiff($sql->now(),'d.start_date')."=1 + and c.Type='PC' + order by m.card_no,s.tdate"; + +echo "\n"; +$headers = array('Mem Num','Name','Address','City', +'State','Zip','Opening date','Ending Date', +'First stock ammount'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$curyear = 0; +$curday = 0; +$curmonth = 0; +$stock = 0; +$row = array(); +while($t_row = $sql->fetch_row($result)){ + if ($curMem != $t_row[0]) { + if ($curMem != -1){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(" ",$row[8]); + $temp = explode("-",$temp[0]); + $fixdate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + + $checkQ = "select cardno,firstname,lastname from custdata where lastname like '%$row[2]%' + and (firstname like '%$row[1]%' or firstname like '".substr($row[1],0,1). + "%') and personnum = 1 and cardno <> $row[0]"; + $checkR = $sql->query($checkQ); + while($checkW = $sql->fetch_row($checkR)){ + echo ""; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + } + } + $curMem = $t_row[0]; + $row = $t_row; + $stock = 0; + + $curyear = $t_row[10]; + $curday = $t_row[11]; + $curmonth = $t_row[12]; + } + if ($t_row[10]==$curyear && $t_row[11]==$curday && $t_row[12]==$curmonth) + $stock += $t_row[9]; + +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +$temp = explode(" ",$row[8]); +$temp = explode("-",$temp[0]); +$fixdate = $temp[1]."/".$temp[2]."/".$temp[0]; +echo ""; +echo ""; +echo ""; +$b = ($b+1)%2; + +$checkQ = "select cardno,firstname,lastname from custdata where lastname like '%$row[2]%' + and (firstname like '%$row[1]%' or firstname like '".substr($row[1],0,1). + "%') and personnum = 1 and cardno <> $row[0]"; +$checkR = $sql->query($checkQ); +while($checkW = $sql->fetch_row($checkR)){ + echo ""; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; +} +echo "
        $h
        $row[0]$row[1] $row[2]$row[3]$row[4]$row[5]$row[6]$row[7]$fixdate$stock
         Potential match: #$checkW[0] $checkW[1] $checkW[2]
        $row[0]$row[1] $row[2]$row[3]$row[4]$row[5]$row[6]$row[7]$fixdate$stock
         Potential match: #$checkW[0] $checkW[1] $checkW[2]
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/EOM_Reporting/newMembersYTD.php b/fannie/legacy/members/EOM_Reporting/newMembersYTD.php new file mode 100644 index 000000000..3f81a0e89 --- /dev/null +++ b/fannie/legacy/members/EOM_Reporting/newMembersYTD.php @@ -0,0 +1,121 @@ +"01", +"Feb"=>"02", +"Mar"=>"03", +"Apr"=>"04", +"May"=>"05", +"Jun"=>"06", +"Jul"=>"07", +"Aug"=>"08", +"Sep"=>"09", +"Oct"=>"10", +"Nov"=>"11", +"Dec"=>"12", +); + +$query = "select m.card_no, + c.FirstName,c.LastName, + m.street,m.city,m.state,m.zip, + d.start_date, + DATE_ADD(d.start_date,INTERVAL 2 YEAR) as endDate, + s.stockPurchase, + YEAR(s.tdate),DAY(s.tdate),MONTH(s.tdate) + from meminfo as m + left join is4c_trans.stockpurchases as s on m.card_no=s.card_no + left join custdata as c on m.card_no=c.CardNo and c.personNum=1 + left join memDates as d ON m.card_no=d.card_no + where YEAR(d.start_date)=YEAR(now()) + and c.Type='PC' + order by m.card_no,s.tdate"; + +echo "\n"; +$headers = array('Mem Num','Name','Address','City', +'State','Zip','Opening date','Ending Date', +'First stock ammount'); +echo ""; +foreach($headers as $h) + echo ""; +echo ""; + +$backgrounds = array('#ffffcc','#ffffff'); +$b = 0; + +$result = $sql->query($query); +$curMem=-1; +$curyear = 0; +$curday = 0; +$curmonth = 0; +$stock = 0; +$row = array(); +while($t_row = $sql->fetch_row($result)){ + if ($curMem != $t_row[0]) { + if ($curMem != -1){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $temp = explode(" ",$row[8]); + $temp = explode("-",$temp[0]); + $fixdate = $temp[1]."/".$temp[2]."/".$temp[0]; + echo ""; + echo ""; + echo ""; + $b = ($b+1)%2; + } + $curMem = $t_row[0]; + $row = $t_row; + $stock = 0; + $curyear = $t_row[10]; + $curday = $t_row[11]; + $curmonth = $t_row[12]; + } + if ($t_row[10]==$curyear && $t_row[11]==$curday && $t_row[12]==$curmonth) + $stock += $t_row[9]; +} +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; +$temp = explode(" ",$row[8]); +$temp = explode("-",$temp[0]); +$fixdate = $temp[1]."/".$temp[2]."/".$temp[0]; +echo ""; +echo ""; +echo ""; +echo "
        $h
        $row[0]$row[1] $row[2]$row[3]$row[4]$row[5]$row[6]$row[7]$fixdate$stock
        $row[0]$row[1] $row[2]$row[3]$row[4]$row[5]$row[6]$row[7]$fixdate$stock
        "; + +$output = ob_get_contents(); +ob_end_clean(); +put_cache('monthly',$output); +echo $output; + +?> diff --git a/fannie/legacy/members/GazetteBilling/csv_parser.php b/fannie/legacy/members/GazetteBilling/csv_parser.php new file mode 100644 index 000000000..6c3684f22 --- /dev/null +++ b/fannie/legacy/members/GazetteBilling/csv_parser.php @@ -0,0 +1,40 @@ +"; +echo $test."

        "; +echo "OUTPUT
        "; +var_dump(csv_parser($test)); +*/ + +?> diff --git a/fannie/legacy/members/GazetteBilling/index.php b/fannie/legacy/members/GazetteBilling/index.php new file mode 100644 index 000000000..5ec667d4e --- /dev/null +++ b/fannie/legacy/members/GazetteBilling/index.php @@ -0,0 +1,201 @@ + 45.00, + "1/15B/W" => 60.00, + "1/10B/W" => 90.00, + "1/5B/W" => 187.50, + "1/ 5B/W" => 187.50, + "1/2B/W" => 412.50, + "1/ 2B/W" => 412.50, + "1/20FULL" => 63.75, + "1/15FULL" => 75.00, + "1/10FULL" => 112.50, + "1/5FULL" => 225, + "1/ 5FULL" => 225, + "1/2FULL" => 562.50, + "1/ 2FULL" => 562.50 +); + +$BILLING_NONMEMBER = array( + "1/20B/W" => 60, + "1/15B/W" => 80, + "1/10B/W" => 120, + "1/5B/W" => 250, + "1/ 5B/W" => 250, + "1/2B/W" => 550, + "1/ 2B/W" => 550, + "1/20FULL" => 85, + "1/15FULL" => 100, + "1/10FULL" => 150, + "1/5FULL" => 300, + "1/ 5FULL" => 300, + "1/2FULL" => 750, + "1/ 2FULL" => 750 +); + +if (isset($_POST['cardnos'])){ + echo "Date: ".date("m/d/Y")."
        + Summary of charges
        + + "; + $sql->query("use $FANNIE_TRANS_DB"); + foreach($_POST['cardnos'] as $cardno){ + $amt = $_POST['billable'.$cardno]; + $transQ = "SELECT MAX(trans_no) FROM dtransactions + WHERE emp_no=$EMP_NO AND register_no=$LANE_NO"; + $transR = $sql->query($transQ); + $t_no = array_pop($sql->fetch_array($transR)); + if ($t_no == "") $t_no = 1; + else $t_no++; + $desc = isset($_POST['desc'.$cardno]) ? $_POST['desc'.$cardno] : ''; + $desc = substr($desc,0,24); + + $insQ = "INSERT INTO dtransactions VALUES ( + now(),0,0,$LANE_NO,$EMP_NO,$t_no, + '{$amt}DP703','Gazette Ad {$desc}','D','','',703, + 1.0,0,0,$amt,$amt,$amt,0,0,.0,.0, + 0,0,0,NULL,0.0,0,0,.0,0,0,0,0, + 0,'',$cardno,1)"; + $amt *= -1; + $insQ2 = "INSERT INTO dtransactions VALUES ( + now(),0,0,$LANE_NO,$EMP_NO,$t_no, + 0,'InStore Charges','T','MI',0,0, + 0.0,0,0,.0,$amt,.0,0,0,.0,.0, + 0,0,0,NULL,0.0,0,0,.0,0,0,0,0, + 0,'',$cardno,2)"; + $sql->query($insQ); + $sql->query($insQ2); + + printf("", + $cardno,$amt*-1,$EMP_NO."-".$LANE_NO."-".$t_no); + } +} +else if (isset($_POST['MAX_FILE_SIZE'])){ + $file = tempnam(sys_get_temp_dir(),"GGB"); + move_uploaded_file($_FILES['upload']['tmp_name'],$file); + $fp = fopen($file,"r"); + echo "Gazette Billing Preview
        +
        AccountChargeReceipt #
        %d$%.2f%s
        + + + "; + while(!feof($fp)){ + $line = fgets($fp); + $data = csv_parser($line); + + if (!isset($data[$PHONE])) continue; + + $ph = $data[$PHONE]; + if (strstr($ph," OR ")) + $ph = array_pop(explode(" OR ",$ph)); + $ph = str_replace(" ","",$ph); + $cn = $sql->escape($data[$CONTACT]); + $sz = trim(strtoupper($data[$SIZE])); + $clr = trim(strtoupper($data[$COLOR])); + if ($clr[0] == "B") $clr = "B/W"; + elseif($clr == "COLOR") $clr = "FULL"; + + if (strstr($cn,'STAR CREATIVE')){ + if (strstr($cn,'TYCOONS')) + $ph = '218-623-1889'; + elseif(strstr($cn,'BURRITO')) + $ph = '218-348-4557'; + elseif(strstr($cn,'BREWHOUSE')) + $ph = '218-726-1392'; + } + + $desc = "($sz, ".($clr=="FULL" ? "color" : "b&w"); + $desc .= ((substr($data[$MEMBER],0,3)=="YES") ? ', owner' : '').")"; + + $searchQ = "SELECT m.card_no,c.lastname FROM + meminfo as m left join custdata as c + on m.card_no=c.cardno and c.personnum=1 + left join suspensions as s on + m.card_no = s.cardno + WHERE (c.memtype = 2 or s.memtype1 = 2) + and (m.phone='$ph' OR m.email_1='$ph' OR m.email_2='$ph' + or c.lastname=$cn)"; + $searchR = $sql->query($searchQ); + + if ($sql->num_rows($searchR) > 1){ + $tmp = explode(" ",$data[$CONTACT]); + $searchQ = "SELECT m.card_no,c.lastname FROM + meminfo as m left join custdata as c + on m.card_no=c.cardno and c.personnum=1 + WHERE c.memtype = 2 + AND c.lastname like '$tmp[0]%' and + (m.phone='$ph' OR m.email_1='$ph' OR m.email_2='$ph')"; + $searchR = $sql->query($searchQ); + } + + if ($sql->num_rows($searchR) == 0){ + printf("Warning: no membership found for %s (%s)
        ", + $data[$CONTACT],$ph); + } + elseif ($sql->num_rows($searchR) > 1){ + printf("Warning: multiple memberships found for %s (%s)
        ", + $data[$CONTACT],$ph); + + } + else { + $row = $sql->fetch_row($searchR); + printf("
        + + + ", + $row[0],$row[1],$data[$SIZE], + $data[$COLOR], + (substr($data[$MEMBER],0,3)=="YES")? + 'MEMBER':'NON-MEMBER', + $row[0], + (substr($data[$MEMBER],0,3)=="YES")? + $BILLING_NONMEMBER[$sz.$clr]*0.75: + $BILLING_NONMEMBER[$sz.$clr], + $row[0],$desc,$row[0]); + if (!isset($BILLING_NONMEMBER[$sz.$clr])){ + var_dump($sz.$clr); + } + } + } + echo "
        #NameTypeCost
        %d%s%s %s (%s)
        "; + echo ""; + echo ""; + fclose($fp); + unlink($file); +} +else { +?> + + +Upload Invoice + + +

        Gazette Billing

        +
        + +Filename: + +
        + + + + diff --git a/fannie/legacy/members/GenericBilling/index.php b/fannie/legacy/members/GenericBilling/index.php new file mode 100644 index 000000000..0367fcacb --- /dev/null +++ b/fannie/legacy/members/GenericBilling/index.php @@ -0,0 +1,126 @@ + + + Generic AR Billing + + +Billing description (For) required

        "; + unset($_REQUEST['amount']); + } + elseif(empty($_REQUEST['amount']) && isset($_REQUEST['desc'])){ + echo "Billing amount required

        "; + unset($_REQUEST['desc']); + } +} + +regularDisplay(); + +if (isset($_REQUEST['amount'])) + bill($_REQUEST['memnum'],$_REQUEST['amount'],$_REQUEST['desc']); +elseif (isset($_REQUEST['memnum'])) + billingDisplay($_REQUEST['memnum']); + +function regularDisplay(){ + global $sql; + $value = isset($_REQUEST['memnum'])?$_REQUEST['memnum']:'6000'; + echo "

        + Member #: + + + +

        "; +} + +function billingDisplay($cardno){ + global $sql; + + $query = "SELECT c.CardNo,c.LastName,n.balance + FROM custdata AS c LEFT JOIN + is4c_trans.ar_live_balance AS n ON c.CardNo=n.card_no + WHERE c.CardNo=$cardno AND c.personNum=1"; + $result = $sql->query($query); + $row = $sql->fetch_row($result); + + printf("
        + + + + + + + + + + + + + + + + + +
        Member%dName%s
        Current Balance%.2fBill$
        For
        + +
        ", + $row[0],$row[0],$row[1],$row[2]); +} + +function bill($cardno,$amt,$desc){ + global $sql,$EMP_NO,$LANE_NO,$FANNIE_TRANS_DB; + $sql->query("use $FANNIE_TRANS_DB"); + + $desc = str_replace("'","''",$desc); + + $transQ = "SELECT MAX(trans_no) FROM dtransactions + WHERE emp_no=$EMP_NO AND register_no=$LANE_NO"; + $transR = $sql->query($transQ); + $t_no = array_pop($sql->fetch_array($transR)); + if ($t_no == "") $t_no = 1; + else $t_no++; + + $insQ = "INSERT INTO dtransactions VALUES ( + ".$sql->now().",0,0,$LANE_NO,$EMP_NO,$t_no, + '{$amt}DP703','$desc','D','','',703, + 1.0,0,0.00,$amt,$amt,$amt,0,0,.0,.0, + 0,0,0,NULL,0.0,0,0,.0,0,0,0,0,0,'', + $cardno,1)"; + $amt *= -1; + $insQ2 = "INSERT INTO dtransactions VALUES ( + ".$sql->now().",0,0,$LANE_NO,$EMP_NO,$t_no, + 0,'InStore Charges','T','MI',0,0, + 0.0,0,0.00,.0,$amt,.0,0,0,.0,.0, + 0,0,0,NULL,0.0,0,0,.0,0,0,0,0,0,'', + $cardno,2)"; + $sql->query($insQ); + $sql->query($insQ2); + + printf("Member %d billed $%.2f.
        + Receipt is %d-%d-%d.",$cardno,$amt*-1, + $EMP_NO,$LANE_NO,$t_no); +} + +?> + + + diff --git a/fannie/legacy/members/RegularShoppers.php b/fannie/legacy/members/RegularShoppers.php new file mode 100644 index 000000000..bf13d93b3 --- /dev/null +++ b/fannie/legacy/members/RegularShoppers.php @@ -0,0 +1,238 @@ + 0"; + if (isset($_POST["staff"])) + $memtypeRestrict = "max(d.memtype) = 1"; + $query = ""; + $month = date('n'); + $year = date('Y'); + $startdate = ""; + $enddate = ""; + switch($_POST["type"]){ + case 'month': + $stamp = mktime(0,0,0,$month,0,$year); + $startdate = date("Y-m-01",$stamp); + $enddate = date("Y-m-d",$stamp); + $dlog = "trans_archive.dbo.dlog".date("Ym",$stamp); + $query = "select card_no,max(memtype), + sum(case when trans_type in ('I','D','M') then total else 0 end) + from $dlog as d + group by card_no,datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate),trans_num + having $memtypeRestrict and card_no > 0 + order by convert(int,card_no)"; + break; + case 'ytd': + $stamp = mktime(0,0,0,$month,0,$year); + $enddate = date("Y-m-d",$stamp); + $stamp = mktime(0,0,0,1,1,$year); + $startdate = date("Y-m-d",$stamp); + $dlog = select_dlog($startdate,$enddate); + + $extraRestrict ="or (max(d.memtype) is null and max(c.memtype)"; + if ($memtypeRestrict[strlen($memtypeRestrict)-1] == "1") + $extraRestrict .= "=1)"; + else + $extraRestrict .= ">0)"; + + $query = "select card_no,case when max(d.memtype) is null then max(c.memtype) else max(d.memtype) end, + sum(case when trans_type in ('I','D','M') then total else 0 end) + from $dlog as d left join custdata as c on d.card_no=c.cardno + where c.personnum=1 + group by card_no,datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate),trans_num + having ($memtypeRestrict $extraRestrict) and card_no > 0 + order by convert(int,card_no)"; + break; + case 'last3': + $stamp = mktime(0,0,0,$month,0,$year); + $enddate = date("Y-m-d",$stamp); + for($i=0;$i<3;$i++){ + $month -= 1; + if ($month == 0){ + $year -= 1; + $month = 12; + } + } + $stamp = mktime(0,0,0,$month,1,$year); + $startdate = date("Y-m-d",$stamp); + + $dlog = select_dlog($startdate,$enddate); + $query = "select card_no,max(d.memtype), + sum(case when trans_type in ('I','D','M') then total else 0 end) + from $dlog as d + group by card_no,datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate),trans_num + having $memtypeRestrict and card_no > 0 + order by convert(int,card_no)"; + break; + } + //echo $query; + $result = $sql->query($query); + + $curNum = ""; + $curType = ""; + $sum = 0; + $visits = 0; + $totals = array(0,0,0); + $types = array(1=>'Member',3=>'StaffMember'); + echo "Reporting period: $startdate through $enddate"; + echo ""; + echo ""; + while($row=$sql->fetch_row($result)){ + if ($curNum != trim($row[0]) && $curNum != ""){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $curNum = trim($row[0]); + $curType = $row[1]; + $sum = 0; + $visits = 0; + $totals[0] += 1; + } + else if ($curNum != trim($row[0])){ + $curNum = trim($row[0]); + $curType = $row[1]; + $totals[0] += 1; + } + $sum += $row[2]; + $visits += 1; + $totals[1] += 1; + $totals[2] += $row[2]; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Mem#TypeNum. TransPurchasesAvg. Purchase
        $curNum$types[$curType]$visits$sum".round($sum/$visits,2)."
        $curNum$types[$curType]$visits$sum".round($sum/$visits,2)."
        "; + + echo "

        "; + echo "Totals"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Unique members$totals[0]
        Transactions$totals[1]
        Avg. Transactions".round($totals[1]/$totals[0],2)."
        Purchases".round($totals[2],2)."
        Avg. Purchase".round($totals[2]/$totals[1],2)."
        "; + +} +elseif (isset($_POST["type2"])){ + $query = ""; + $month = date('n'); + $year = date('Y'); + $startdate = ""; + $enddate = ""; + + $cardnos = array(); + $restrict = "memtype in (1,3)"; + if (isset($_POST["staff"])) + $restrict = "memtype=1"; + $cardR = $sql->query("select cardno from custdata where type='PC' and $restrict group by cardno"); + while($cardW = $sql->fetch_row($cardR)) + $cardnos["x".trim($cardW[0])] = False; + + $dlog = ""; + switch($_POST["type2"]){ + case 'month': + $stamp = mktime(0,0,0,$month,0,$year); + $startdate = date("Y-m-01",$stamp); + $enddate = date("Y-m-d",$stamp); + $dlog = "trans_archive.dbo.dlog".date("Ym",$stamp); + break; + case 'ytd': + $stamp = mktime(0,0,0,$month,0,$year); + $enddate = date("Y-m-d",$stamp); + $stamp = mktime(0,0,0,1,1,$year); + $startdate = date("Y-m-d",$stamp); + $dlog = select_dlog($startdate,$enddate); + break; + case 'last3': + $stamp = mktime(0,0,0,$month,0,$year); + $enddate = date("Y-m-d",$stamp); + for($i=0;$i<3;$i++){ + $month -= 1; + if ($month == 0){ + $year -= 1; + $month = 12; + } + } + $stamp = mktime(0,0,0,$month,1,$year); + $startdate = date("Y-m-d",$stamp); + $dlog = select_dlog($startdate,$enddate); + break; + } + + $dataQ = "select d.card_no from $dlog as d group by d.card_no"; + $dataR = $sql->query($dataQ); + while($dataW = $sql->fetch_row($dataR)){ + $num = trim($dataW[0]); + if (isset($cardnos["x".$num])) $cardnos["x".$num] = True; + } + + $idle = array(); + $i = 0; + //echo var_dump($cardnos); + foreach($cardnos as $key=>$value){ + if (!$value) + $idle[$i++] = substr($key,1); + } + sort($idle); + echo "Memberships with no purchases
        "; + echo "Reporting period: $startdate through $enddate"; + echo ""; + foreach($idle as $num){ + echo ""; + } + echo "
        $num
        "; + echo "Total: ".count($idle); +} +else { +?> +

        +Regular Customers reports + + + + + +
        Time span Last month
        +Last 3 months
        +Year to date
        Ignore staff
        Excel
        +
        + +
        +
        +
        +Customers NOT purchasing reports + + + + + +
        Time span Last month
        +Last 3 months
        +Year to date
        Ignore staff
        Excel
        +
        + +
        + + diff --git a/fannie/legacy/members/alterstatus.php b/fannie/legacy/members/alterstatus.php new file mode 100644 index 000000000..4c080db21 --- /dev/null +++ b/fannie/legacy/members/alterstatus.php @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + +

        ItemsReference
        + +"; + echo "
        "; + echo ""; + $curReasonCode = array_pop($sql->fetch_row($sql->query("SELECT reasonCode from suspensions WHERE cardno=$memNum"))); + $curType = array_pop($sql->fetch_row($sql->query("SELECT type FROM custdata WHERE cardno=$memNum AND personnum=1"))); + $stats = array('INACT'=>'Inactive','TERM'=>'Termed','INACT2'=>'Term pending'); + echo ""; + $query = "select textStr,mask from reasoncodes"; + $result = $sql->query($query); + echo ""; + while($row = $sql->fetch_row($result)){ + echo ""; + } + echo "
        $row[0]
        "; + echo ""; + echo "
        "; +} +else if (validateUserQuiet('editmembers')){ + $memNum = $_POST["memNum"]; + $codes = array(); + if (isset($_POST["reasoncodes"])) + $codes = $_POST["reasoncodes"]; + $status = $_POST["status"]; + + $reasonCode = 0; + foreach($codes as $c) + $reasonCode = $reasonCode | ((int)$c); + + alterReason($memNum,$reasonCode,$status); + + addressList($memNum); + + // FIRE ALL UPDATE + include('custUpdates.php'); + updateCustomerAllLanes($memNum); + +} +else if (validateUserQuiet('editmembers_csc') && isset($_GET['fixedaddress'])){ + $curQ = "select reasoncode from suspensions where cardno=$memNum"; + $curR = $sql->query($curQ); + $curCode = (int)(array_pop($sql->fetch_array($curR))); + + $newCode = $curCode & ~16; + alterReason($memNum,$newCode); + + addressList($memNum); + + // FIRE ALL UPDATE + include('custUpdates.php'); + updateCustomerAllLanes($memNum); +} + +?> + + + + + + +
        +Edit Info + +  +
        + + diff --git a/fannie/legacy/members/custUpdates.php b/fannie/legacy/members/custUpdates.php new file mode 100644 index 000000000..0b031e559 --- /dev/null +++ b/fannie/legacy/members/custUpdates.php @@ -0,0 +1,90 @@ +'TERM'"; + $addR = $sql->query($addQ); + } + else { + $sql->add_connection($lanes[$i],$types[$i],$dbs[$i],'root','is4c'); + $selQ = "SELECT CardNo,personNum,LastName,FirstName, + CashBack,Balance,Discount,MemDiscountLimit,ChargeOK, + WriteChecks,StoreCoupons,Type,memType,staff,SSI,Purchases, + NumberOfChecks,memCoupons,blueLine,Shown FROM custdata WHERE cardno='$cardno'"; + if ($lanes[$i] != "129.103.2.16") + $selQ .= " AND type <> 'TERM'"; + $ins = "INSERT INTO custdata (CardNo,personNum,LastName,FirstName, + CashBack,Balance,Discount,MemDiscountLimit,ChargeOK, + WriteChecks,StoreCoupons,Type,memType,staff,SSI,Purchases, + NumberOfChecks,memCoupons,blueLine,Shown)"; + $sql->transfer('is4c_op',$selQ,$dbs[$i],$ins); + } + } +} + +function deleteCustomerAllLanes($cardno){ + global $lanes,$numlanes,$dbs,$sql,$types; + for ($i = 0; $i < $numlanes; $i++){ + if ($types[$i] == "MSSQL"){ + $delQ = "delete from $lanes[$i].$dbs[$i].dbo.custdata where cardno='$cardno'"; + $delR = $sql->query($delQ); + } + else { + $tmp = new SQLManager($lanes[$i],$types[$i],$dbs[$i],'root','is4c'); + $delQ = "DELETE FROM custdata WHERE cardno='$cardno'"; + $delR = $tmp->query($delQ); + } + } +} + +function redoCard($cardno){ + global $lanes,$numlanes,$dbs,$sql,$types; + + $upcQ = "SELECT upc FROM memberCards WHERE card_no=$cardno"; + $upcR = $sql->query($upcQ); + $upc = ""; + if ($sql->num_rows($upcR) > 0) + $upc = array_pop($sql->fetch_row($upcR)); + + for ($i = 0; $i < $numlanes; $i++){ + if ($types[$i] == "MSSQL"){ + $delQ = "delete from $lanes[$i].$dbs[$i].dbo.memberCards where card_no='$cardno'"; + $delR = $sql->query($delQ); + if (!empty($upc)){ + $sql->query("INSERT INTO $lanes[$i].$dbs[$i].dbo.memberCards + VALUES ($cardno,'$upc')"); + } + } + else { + $tmp = new SQLManager($lanes[$i],$types[$i],$dbs[$i],'root','is4c'); + $delQ = "DELETE FROM memberCards WHERE card_no='$cardno'"; + $delR = $tmp->query($delQ); + if (!empty($upc)){ + $tmp->query("INSERT INTO memberCards + VALUES ($cardno,'$upc')"); + } + } + } + +} + +function updateCustomerAllLanes($cardno){ + deleteCustomerAllLanes($cardno); + addCustomerAllLanes($cardno); + redoCard($cardno); +} + +?> diff --git a/fannie/legacy/members/deactivate.php b/fannie/legacy/members/deactivate.php new file mode 100755 index 000000000..48939c362 --- /dev/null +++ b/fannie/legacy/members/deactivate.php @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + +

        ItemsReference
        + +"; + echo "
        "; + echo "   
        "; + echo ""; + $query = "select textStr,mask from reasoncodes"; + $result = $sql->query($query); + echo ""; + while($row = $sql->fetch_row($result)) + echo ""; + echo "
        $row[0]
        "; + echo "   "; + echo "
        "; +} +else { + $memNum = $memID; + $termType = $_POST['termType']; + $codes = isset($_REQUEST["reasoncodes"])?$_REQUEST['reasoncodes']:array(); + + $reasonCode = 0; + foreach($codes as $c) + $reasonCode = $reasonCode | ((int)$c); + + deactivate($memNum,$termType,'',$reasonCode); + + addressList($memNum); + + // FIRE ALL UPDATE + include('custUpdates.php'); + updateCustomerAllLanes($memNum); +} + +?> + + + + + + + + +
        +Edit Info + +  + + +
        + + diff --git a/fannie/legacy/members/discounts.php b/fannie/legacy/members/discounts.php new file mode 100644 index 000000000..8c6dd0418 --- /dev/null +++ b/fannie/legacy/members/discounts.php @@ -0,0 +1,69 @@ + 11 +and ".$sql->monthdiff($sql->now(),'tdate')." = 1 +group by card_no +having +SUM(CASE WHEN trans_status = 'M' and trans_type in ('I','D') then total else 0 end) <> 0 +or SUM(CASE WHEN trans_subtype='MA' then total else 0 end) <> 0 +order by convert(int,card_no)"; +$result = $sql->query($query); + +echo ""; +echo ""; +$tP=0; +$tS=0; +$tC=0; +$tD=0; + +$c=0; +$aPurch = 0; +$aPercent = 0; +$aDollar = 0; +while ($row = $sql->fetch_row($result)){ + $purch = $row[3]; + $MoS = -1*$row[1]; + $MAD = -1*$row[2]; + $savings = round(100*((float)($MoS+$MAD))/$purch,2); + $dollars = round($purch*$savings/100,2); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $tP += $purch; + $tS += $MoS; + $tC += $MAD; + $tD += $dollars; + + $aPurch += $purch; + $aPercent += $savings; + $aDollar += $dollars; + $c += 1; +} +echo ""; +echo ""; +echo ""; +echo ""; +echo "
        Mem#SalesCouponPurchases% Saved$ Saved
        $row[0]$MoS$MAD$purch$savings$dollars
        Total$tS$tC$tP".round(100*((float)($tS+$tC))/$tP,2)."".round(((float)($tS+$tC))/$tP*$tD,2)."
        "; +echo "
        "; +echo "Average percent saved: ".round($aPercent/$c,2)."
        "; +echo "Average dollars saved: ".round($aDollar/$c,2)."
        "; +echo "Average spending: ".round($aPurch/$c,2)."
        "; +echo "Avg. percent saved * Avg. spending: ".round(($aPercent/$c)*($aPurch/$c/100),2); +?> diff --git a/fannie/legacy/members/equity_letters/barcodepdf.php b/fannie/legacy/members/equity_letters/barcodepdf.php new file mode 100644 index 000000000..10d6d35fb --- /dev/null +++ b/fannie/legacy/members/equity_letters/barcodepdf.php @@ -0,0 +1,105 @@ +Barcode($x,$y,$barcode,$h,$w,13); + } + + function UPC_A($x,$y,$barcode,$h=16,$w=.35,$nonumbers=False) + { + $this->Barcode($x,$y,$barcode,$h,$w,12,$nonumbers); + } + + function GetCheckDigit($barcode) + { + //Compute the check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + $r=$sum%10; + if($r>0) + $r=10-$r; + return $r; + } + + function TestCheckDigit($barcode) + { + //Test validity of check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + return ($sum+$barcode{12})%10==0; + } + + function Barcode($x,$y,$barcode,$h,$w,$len,$nonumbers=False) + { + //Padding + $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT); + if($len==12) + $barcode='0'.$barcode; + //Add or control the check digit + if(strlen($barcode)==12) + $barcode.=$this->GetCheckDigit($barcode); + elseif(!$this->TestCheckDigit($barcode)){ + $this->Error('This is an Incorrect check digit' . $barcode); + //echo $x.$y.$barcode."\n"; + } + //Convert digits to bars + $codes=array( + 'A'=>array( + '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011', + '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'), + 'B'=>array( + '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101', + '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'), + 'C'=>array( + '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100', + '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100') + ); + $parities=array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $code='101'; + $p=$parities[$barcode{0}]; + for($i=1;$i<=6;$i++) + $code.=$codes[$p[$i-1]][$barcode{$i}]; + $code.='01010'; + for($i=7;$i<=12;$i++) + $code.=$codes['C'][$barcode{$i}]; + $code.='101'; + //Draw bars + for($i=0;$iRect($x+$i*$w,$y,$w,$h,'F'); + } + //Print text uder barcode + if (!$nonumbers){ + $this->SetFont('Arial','',9); + $this->Text($x,$y+$h+11/$this->k,substr($barcode,-$len)); + } + } +} + +?> diff --git a/fannie/legacy/members/equity_letters/cards.php b/fannie/legacy/members/equity_letters/cards.php new file mode 100644 index 000000000..8c6310dc8 --- /dev/null +++ b/fannie/legacy/members/equity_letters/cards.php @@ -0,0 +1,167 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +$startX = 15; +$startY = 15; +$x = $startX; +$y = $startY; +$w = 80; +$left = 97; +$down = 54; + +$count = 0; +$primary = ""; +$pdf->SetAutoPageBreak(True,0); +$pdf->AddPage(); +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + if ($count % 2 == 0 && $count != 0){ + $y += $down; + $x = $startX; + } + if ($count % 10 == 0 && $count != 0){ + addTempBacks(); + $pdf->AddPage(); + $y = $startY; + $x = $startX; + } + + if ($selAddW[10] < 100) + $pdf->Image("watermark.jpg",$x,$y,$w,50,"JPG"); + + $pdf->SetXY($x,$y); + $pdf->SetFont('Scala','','10'); + if ($selAddW[10] >= 100){ + $pdf->Cell(21,5,"Member No.",0); + $pdf->Cell($w-21,5,$selAddW[0],"B",1,"C"); + } + else { + $pdf->Cell(21,5,"Member No.",0); + $pdf->Cell(15,5,$selAddW[0],"B",0,"C"); + $pdf->Cell(15,5,"Exp. Date ",0); + $pdf->Cell($w-21-15-15,5,$selAddW[9],"B",1,"C"); + } + + $fullname = $selAddW[1]." ".$selAddW[2]; + if ($selAddW[8] == 1) + $primary = $fullname; + + $pdf->SetX($x); + $pdf->Cell(25,5,"First Full Name",0); + $pdf->Cell($w-25,5,$primary,"B",1,"C"); + + $pdf->SetX($x); + $pdf->Cell(30,5,"Second Full Name",0); + $pdf->Cell($w-30,5,($primary==$fullname)?"":$fullname,"B",1,"C"); + + $pdf->SetX($x); + $address = str_replace("\n"," ",$selAddW[3]); + $pdf->Cell(25,5,"Street Address",0); + $pdf->Cell($w-25,5,$address,"B",1,"C"); + + $pdf->SetX($x); + $str = $selAddW[5].", ".$selAddW[6]." ".$selAddW[7]; + $pdf->Cell(25,5,"City/State/Zip",0); + $pdf->Cell($w-25,5,$str,"B",1,"C"); + + $pdf->Ln(12); + $pdf->SetX($x); + $pdf->Cell($w,5,"(Member's Signature)","T",0,"C"); + $pdf->Ln(5); + + $txt = "Whole Foods Community Co-op, Inc."; + $pdf->SetFont("Scala","B",10); + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"C"); + $pdf->SetFont("Scala","",10); + + $x += $left; + $tag = $count % 10; + $row = floor($tag / 2); + $y = $startY + ($down*$row); + + $count += 1; +} + +if ($pdf->PageNo() % 2 != 0) + addTempBacks(); +$pdf->Output('member cards.pdf','D'); + +function addTempBacks(){ + global $startX,$startY,$left,$down,$pdf,$w; + + $x = $startX; + $y = $startY; + + $pdf->AddPage(); + for($count = 0; $count < 10; $count++){ + if ($count % 2 == 0 && $count != 0){ + $y += $down; + $x = $startX; + } + + $txt = "Membership Card\nWhole Foods Community Co-op, Inc."; + $pdf->SetFont("Scala","B",10); + $pdf->SetXY($x,$y); + $pdf->MultiCell($w,4,$txt,0,"C"); + $pdf->SetFont("Scala","",8); + + $txt = "This card must be shown to receive rights and benefits of membership +such as a discount on purchase or the right to vote at member meet- +ings. Membership is not transferrable."; + $pdf->SetX($x); + $pdf->MultiCell($w,4,str_replace("\n"," ",$txt),0,"L"); + + $txt = "\tThis card will be void and invalid when a member:"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "1) Terminates membership OR"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "2) Does not comply with membership requirements as outlined in the Bylaws of this association OR"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "3) Does not complete the purchase of four shares of Class B Stock ($20/share) within two years of the date of the issue of this card."; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + + $x += $left; + $row = floor($count / 2); + $y = $startY + ($down*$row); + } + +} diff --git a/fannie/legacy/members/equity_letters/due.php b/fannie/legacy/members/equity_letters/due.php new file mode 100644 index 000000000..fbaa7f4a6 --- /dev/null +++ b/fannie/legacy/members/equity_letters/due.php @@ -0,0 +1,120 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF(); + +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Scala','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$today,0); + $pdf->Ln(15); + + $firstname = ucwords(strtolower($selAddW[1])); + $lastname = ucwords(strtolower($selAddW[2])); + $fullname = $firstname." ".$lastname; + $equity = $selAddW[8]; + $classA = 20; + $classB = $equity - 20; + $remainingB = 100 - $equity; + $endDate = $selAddW[10].'/'.$selAddW[11].'/'.$selAddW[9]; + + //Member address + $pdf->Cell(10,10,trim($fullname),0); + $pdf->Ln(5); + + if (strstr($selAddW[3],"\n") === False){ + $pdf->Cell(80,10,$selAddW[3],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[3]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[5] . ', ' . $selAddW[6] . ' ' . $selAddW[7],0); + $pdf->Ln(10); + + $pdf->Cell(30,10,"",0); + $pdf->Cell(100,10,sprintf("Remaining equity payment of $%.2f is due by %s.",$remainingB,$endDate),0); + $pdf->Ln(15); + + $pdf->MultiCell(0,5,"Dear ".$firstname.","); + $pdf->Ln(5); + + $txt = "This is a reminder regarding the balance of your required equity. From the date of joining +WFC, you have two years to complete the purchase of the required $80.00 of Class B equity stock. Our +records indicate that the above balance of Class B equity stock is due. If your receipts differ, please +advise me immediately."; + $pdf->MultiCell(0,5,str_replace("\n"," ",$txt)); + $pdf->Ln(5); + + $txt = "We hope you will choose to continue your membership. However, if we do not receive your +payment by the due date, your membership will become inactive and you will not be eligible for +Owner discounts and benefits or to participate in the governance of WFC."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "Owners with restricted income may apply to the Fran Skinner Memorial Matching Fund +for assistance with the purchase of Class B stock. Information on the Matching Fund is available on +our web site (www.wholefoods.coop) and in the store."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "If you have any questions, please do not hesitate to ask. I can be reached at the number above or +at mms@wholefoods.coop"; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Sincerely yours,"); + $pdf->MultiCell(0,5,"WHOLE FOODS COMMUNITY CO-OP, INC."); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Amanda Borgren"); + $pdf->MultiCell(0,5,"Owner Services"); + +} + +$pdf->Output('equity reminder letters.pdf','D'); diff --git a/fannie/legacy/members/equity_letters/index.js b/fannie/legacy/members/equity_letters/index.js new file mode 100644 index 000000000..90753b5d9 --- /dev/null +++ b/fannie/legacy/members/equity_letters/index.js @@ -0,0 +1,166 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + tack on more arguments as needed with '&' and '=' +*/ +function phpSend(action) { + http.open('get', 'index.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + by convention, results return [actionname]`[data] + splitting on backtick separates, then switch on action name + allows different actions to be handled differently +*/ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + //alert(response); + var array = response.split('`'); + switch(array[0]){ + case 'redisplay': + document.getElementById('contents').innerHTML = array[1]; + break; + default: + alert(response); + } + } +} + +function newType(mytype){ + switch(mytype){ + case 'welcome': + showWelcome(); + break; + case 'due': + showDue(); + break; + case 'pastdue': + showPastDue(); + break; + case 'ar': + showAR(); + break; + case 'upgrade': + showUpgrade(); + break; + case 'term': + showTerm(); + break; + case 'paidinfull': + showPaidInFull(); + break; + } +} + +function selectall(elem){ + var e = document.getElementById(elem); + for (var i=0; i This month"; + b += " Last month"; + b += " Two months ago"; + b += " All members"; + document.getElementById('buttons').innerHTML = b; + + redisplay('welcome','0month'); +} + +function showUpgrade(){ + var b = "Show: "; + b += " This month"; + b += " Last month"; + b += " Two months ago"; + b += " All members"; + document.getElementById('buttons').innerHTML = b; + + redisplay('upgrade','0month'); +} + +function showPaidInFull(){ + var b = "Show: "; + b += " This month"; + b += " Last month"; + b += " Two months ago"; + b += " All members"; + document.getElementById('buttons').innerHTML = b; + + redisplay('paidinfull','0month'); +} + +function showTerm(){ + var b = "Show: "; + b += " This month"; + b += " Last month"; + b += " Two months ago"; + b += " All members"; + document.getElementById('buttons').innerHTML = ''; + + redisplay('term',''); +} + +function showDue(){ + var b = "Show: "; + b += " This month"; + b += " 30 days"; + b += " 60 days"; + b += " All members"; + document.getElementById('buttons').innerHTML = b; + + redisplay('due','0month'); +} + +function showPastDue(){ + var b = "Show: "; + b += " This month"; + b += " Last month"; + b += " Two months ago"; + b += " All members"; + document.getElementById('buttons').innerHTML = b; + + redisplay('pastdue','0month'); +} + +function showAR(){ + var b = "Show: "; + b += " Regular"; + b += " Business (EOM)"; + b += " Business (Any balance)"; + document.getElementById('buttons').innerHTML = b; + + redisplay('ar','reg'); +} + +var e1; +var e2; + +function redisplay(type,subtype){ + e1 = type; + e2 = subtype; + document.getElementById('contents').innerHTML = ""; + phpSend('redisplay&type='+type+'&subtype='+subtype); +} + +function doExcel(){ + top.location='index.php?excel=yes&type='+e1+'&subtype='+e2; +} diff --git a/fannie/legacy/members/equity_letters/index.php b/fannie/legacy/members/equity_letters/index.php new file mode 100644 index 000000000..b94fec1c5 --- /dev/null +++ b/fannie/legacy/members/equity_letters/index.php @@ -0,0 +1,491 @@ +/","",$opts); + $opts = preg_replace("/<\/select>.*/","",$opts); + $opts = preg_replace("/",$opts); + + $out = ""; + foreach($opts as $o){ + if ($o == "") continue; + $temp = explode(" - ",$o); + $out .= ""; + foreach($temp as $t) + $out .= ""; + $out .= ""; + } + $out .= "
        ".$t."
        "; + + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="memberPortalList.xls"'); + echo $out; + return; +} + +function welcomeDisplays($subtype){ + global $sql; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +function upgradeDisplays($subtype){ + global $sql,$TRANS; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +function paidInFullDisplays($subtype){ + global $sql,$TRANS; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +function termDisplays($subtype){ + global $sql; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +function dueDisplays($subtype){ + global $sql, $TRANS; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +function pastDueDisplays($subtype){ + global $sql,$TRANS; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +function arDisplays($subtype){ + global $sql,$TRANS; + $target = "../statements/makeStatement.php"; + if ($subtype == "business") + $target = "../statements/makeStatementBusiness.php"; + elseif($subtype == "allbusiness") + $target = "../statements/makeStatementBusinessAll.php"; + $ret = "
        "; + $ret .= "
        "; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + return $ret; +} + +?> + + + + Member Letter Portal + + + +Type: + + + Paid In Full + Equity Reminders + + AR Notices + Term Letters +

        +

        +
        +

        + + + diff --git a/fannie/legacy/members/equity_letters/logo-faded.jpg b/fannie/legacy/members/equity_letters/logo-faded.jpg new file mode 100644 index 000000000..68dcc659e Binary files /dev/null and b/fannie/legacy/members/equity_letters/logo-faded.jpg differ diff --git a/fannie/legacy/members/equity_letters/logo-faded.png b/fannie/legacy/members/equity_letters/logo-faded.png new file mode 100644 index 000000000..42aa42f07 Binary files /dev/null and b/fannie/legacy/members/equity_letters/logo-faded.png differ diff --git a/fannie/legacy/members/equity_letters/mcards.php b/fannie/legacy/members/equity_letters/mcards.php new file mode 100644 index 000000000..42ab8eaec --- /dev/null +++ b/fannie/legacy/members/equity_letters/mcards.php @@ -0,0 +1,180 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new BarcodePDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +$startX = 15; +$startY = 15; +$x = $startX; +$y = $startY; +$w = 80; +$left = 97; +$down = 54; + +$count = 0; +$primary = ""; +$person = 0; +$pdf->SetAutoPageBreak(True,0); +$pdf->AddPage(); +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + if ($count % 2 == 0 && $count != 0){ + $y += $down; + $x = $startX; + } + if ($count % 10 == 0 && $count != 0){ + addTempBacks(); + $pdf->AddPage(); + $y = $startY; + $x = $startX; + } + + + $pdf->SetXY($x,$y); + $pdf->SetFont('Scala','','12'); + $pdf->Cell($w,5,"Whole Foods Co-op",0,1,"C"); + $pdf->SetX($x); + if ($selAddW[10] < 100) + $pdf->Cell($w,5,"Temporary Membership Card",0,1,"C"); + else + $pdf->Cell($w,5,"Membership Card",0,1,"C"); + $pdf->SetFont('Scala','','8'); + $pdf->SetX($x); + if ($selAddW[10] < 100) + $pdf->Cell($w,4,"Expiration Date: $selAddW[9]",0,1,"C"); + else + $pdf->Cell($w,4,"",0,1,"C"); + $pdf->SetFont('Scala','','10'); + + $fullname = $selAddW[1]." ".$selAddW[2]; + if ($selAddW[8] == 1){ + $primary = $fullname; + $person = 1; + } + + $pdf->SetX($x); + $pdf->Cell(25,4,"Primary Member:",0); + $pdf->Cell($w-25,4,$primary,0,1,"R"); + + $pdf->SetX($x); + $pdf->Cell(30,4,"Household Member:",0); + $pdf->Cell($w-30,4,($primary==$fullname)?"":$fullname,0,1,"R"); + + $pdf->SetX($x); + $address = str_replace("\n"," ",$selAddW[3]); + $pdf->Cell(25,4,"Street Address:",0); + $pdf->Cell($w-25,4,$address,0,1,"R"); + + $pdf->SetX($x); + $str = $selAddW[5].", ".$selAddW[6]." ".$selAddW[7]; + $pdf->Cell(25,4,"City/State/Zip:",0); + $pdf->Cell($w-25,4,$str,0,1,"R"); + + $pdf->Ln(3); + $pdf->SetX($x); + $pdf->Cell(2,4,"",0); + $pdf->Cell(35,4,"Cardholder's Signature:",0,0,"L"); + $pdf->Cell(1,4,"",0); + $pdf->Cell($w-38,4,"","B",1,"R"); + + $pdf->Ln(5); + + $pdf->SetX($x); + $pdf->SetFont("Scala","","11"); + $pdf->Cell(30,5,"Member # $selAddW[0]",0,0,"L"); + + $barcode = "4"; + $barcode .= str_pad($person,3,"0",STR_PAD_LEFT); + $barcode .= str_pad(9999999-((int)$selAddW[0]),7,STR_PAD_LEFT); + $pdf->UPC_A($x+45,$y+41,$barcode,7,.35,True); + + $x += $left; + $tag = $count % 10; + $row = floor($tag / 2); + $y = $startY + ($down*$row); + + $count += 1; + $person += 1; +} + +if ($pdf->PageNo() % 2 != 0) + addTempBacks(); +$pdf->Output('member cards.pdf','D'); + +function addTempBacks(){ + global $startX,$startY,$left,$down,$pdf,$w; + + $x = $startX; + $y = $startY; + + $pdf->AddPage(); + for($count = 0; $count < 10; $count++){ + if ($count % 2 == 0 && $count != 0){ + $y += $down; + $x = $startX; + } + + $txt = "Membership Card\nWhole Foods Community Co-op, Inc."; + $pdf->SetFont("Scala","B",10); + $pdf->SetXY($x,$y); + $pdf->MultiCell($w,4,$txt,0,"C"); + $pdf->SetFont("Scala","",8); + + $txt = "This card must be shown to receive rights and benefits of membership such as a discount on purchase or the right to vote at member meetings. Membership is not transferrable."; + $pdf->SetX($x); + $pdf->MultiCell($w,4,str_replace("\n"," ",$txt),0,"L"); + + $txt = "\tThis card will be void and invalid when a member:"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "1) Terminates membership OR"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "2) Does not comply with membership requirements as outlined in the Bylaws of this association OR"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "3) Does not complete the purchase of four shares of Class B Stock ($20/share) within two years of the date of the issue of this card."; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + + $x += $left; + $row = floor($count / 2); + $y = $startY + ($down*$row); + } + +} diff --git a/fannie/legacy/members/equity_letters/newcards.php b/fannie/legacy/members/equity_letters/newcards.php new file mode 100644 index 000000000..44a4c889d --- /dev/null +++ b/fannie/legacy/members/equity_letters/newcards.php @@ -0,0 +1,177 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new BarcodePDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +$startX = 15; +$startY = 10; +$x = $startX; +$y = $startY; +$w = 80; +$left = 97; +$down = 56; + +$count = 0; +$primary = ""; +$person = 0; +$pdf->SetAutoPageBreak(True,0); +$pdf->AddPage(); +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + if ($count % 2 == 0 && $count != 0){ + $y += $down; + $x = $startX; + } + if ($count % 10 == 0 && $count != 0){ + addTempBacks(); + $pdf->AddPage(); + $y = $startY; + $x = $startX; + } + + $pdf->Image("wheat3.jpg",$x,$y,0,50,"JPG"); + + $pdf->SetXY($x,$y+11); + $pdf->SetFont('Scala','','10'); + //$selAddW[0] = "12345"; /* REMOVE */ + if ($selAddW[10] >= 100){ + $pdf->Cell($w,4,"Member No. $selAddW[0]",0,1,"L"); + } + else { + $pdf->Cell(36,4,"Member No. $selAddW[0]",0); + $pdf->Cell($w-36,4,"Exp. $selAddW[9]",0,1,'R'); + } + + $fullname = $selAddW[1]." ".$selAddW[2]; + //$fullname = "JOHN SAMPLE"; /* REMOVE */ + if ($selAddW[8] == 1){ + $primary = $fullname; + $person = 1; + } + + $pdf->SetX($x); + $pdf->Cell(25,4,"Membership Name",0); + $pdf->Cell($w-25,4,$primary,0,1,"R"); + + $pdf->SetX($x); + $pdf->Cell(30,4,"Household Member",0); + $pdf->Cell($w-30,4,($primary==$fullname)?"":$fullname,0,1,"R"); + + $pdf->SetX($x); + $address = str_replace("\n"," ",$selAddW[3]); + $pdf->Cell(25,4,"Street Address",0); + $pdf->Cell($w-25,4,$address,0,1,"R"); + + $pdf->SetX($x); + $str = $selAddW[5].", ".$selAddW[6]." ".$selAddW[7]; + $pdf->Cell(25,4,"City/State/Zip",0); + $pdf->Cell($w-25,4,$str,0,1,"R"); + + $pdf->SetX($x); + $pdf->Cell($w,3,"Membership",0,1,"L"); + $pdf->SetX($x); + $pdf->Cell(20,4,"Signature:",0,0,"L"); + $pdf->Cell($w-20,4,"","B",0); + $pdf->Ln(5); + + $barcode = "4"; + $barcode .= str_pad($person,3,"0",STR_PAD_LEFT); + $barcode .= str_pad(9999999-((int)$selAddW[0]),7,STR_PAD_LEFT); + + $str = ($selAddW[10] < 100) ? "Temporary" : ""; + + $pdf->SetX($x); + $pdf->Cell(15,9,$str,0,0,"L"); + //$pdf->UPC_A($x+25,$y+39,$barcode,7,.35,True); + $pdf->SetX($x+65); + $pdf->Cell(15,9,$str,0,0,"R"); + + $x += $left; + $tag = $count % 10; + $row = floor($tag / 2); + $y = $startY + ($down*$row); + + $count += 1; + $person += 1; +} + +if ($pdf->PageNo() % 2 != 0) + addTempBacks(); +$pdf->Output('member cards.pdf','D'); + +function addTempBacks(){ + global $startX,$startY,$left,$down,$pdf,$w; + + $x = $startX; + $y = $startY + 3; + + $pdf->AddPage(); + for($count = 0; $count < 10; $count++){ + if ($count % 2 == 0 && $count != 0){ + $y += $down; + $x = $startX; + } + + $txt = "Membership Card\nWhole Foods Community Co-op, Inc."; + $pdf->SetFont("Scala","B",10); + $pdf->SetXY($x,$y); + $pdf->MultiCell($w,4,$txt,0,"C"); + $pdf->SetFont("Scala","",8); + + $txt = "This card must be shown to receive rights and benefits of membership such as a discount on purchase or the right to vote at member meetings. Membership is not transferrable."; + $pdf->SetX($x); + $pdf->MultiCell($w,4,str_replace("\n"," ",$txt),0,"L"); + + $txt = "\tThis card will be void and invalid when a member:"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "1) Terminates membership OR"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "2) Does not comply with membership requirements as outlined in the Bylaws of this association OR"; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + $txt = "3) Does not complete the purchase of four shares of Class B Stock ($20/share) within two years of the date of the issue of this card."; + $pdf->SetX($x); + $pdf->MultiCell($w,4,$txt,0,"L"); + + + $x += $left; + $row = floor($count / 2); + $y = $startY + ($down*$row) + 3; + } + +} diff --git a/fannie/legacy/members/equity_letters/pastdue.php b/fannie/legacy/members/equity_letters/pastdue.php new file mode 100644 index 000000000..f15650ce0 --- /dev/null +++ b/fannie/legacy/members/equity_letters/pastdue.php @@ -0,0 +1,120 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Scala','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$today,0); + $pdf->Ln(15); + + $firstname = ucwords(strtolower($selAddW[1])); + $lastname = ucwords(strtolower($selAddW[2])); + $fullname = $firstname." ".$lastname; + $equity = $selAddW[8]; + $classA = 20; + $classB = $equity - 20; + $remainingB = 100 - $equity; + $endDate = $selAddW[9]; + + //Member address + $pdf->Cell(10,10,trim($fullname),0); + $pdf->Ln(5); + + if (strstr($selAddW[3],"\n") === False){ + $pdf->Cell(80,10,$selAddW[3],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[3]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[5] . ', ' . $selAddW[6] . ' ' . $selAddW[7],0); + $pdf->Ln(10); + + $pdf->Cell(30,10,"",0); + $pdf->Cell(100,10,sprintf("Equity past due $%.2f",$remainingB),0); + $pdf->Ln(15); + + $pdf->MultiCell(0,5,"Dear ".$firstname.","); + $pdf->Ln(5); + + $txt = "From the date of joining WFC, you had two years to complete the purchase of the required +$80.00 of Class B equity stock. Our records indicate that the above balance of Class B equity stock +is now overdue. Your membership has become inactive and you can no longer receive Owner +benefits or discounts or participate in the governance of WFC."; + $pdf->MultiCell(0,5,str_replace("\n"," ",$txt)); + $pdf->Ln(5); + + $txt = "We hope you will choose to reactivate your membership. You can reactivate your membership +at the Customer Service Counter at any time during open hours by paying the entire balance of equity +due and confirming your current contact information."; + $pdf->MultiCell(0,5,str_replace("\n"," ",$txt)); + $pdf->Ln(5); + + $txt = "Owners with restricted income may apply to the Fran Skinner Memorial Matching Fund +for assistance with the purchase of Class B stock. Information on the Matching Fund is available on +our web site (www.wholefoods.coop) and in the store."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "If you have any questions, please do not hesitate to ask. I can be reached at the number above or +at mms@wholefoods.coop"; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Sincerely yours,"); + $pdf->MultiCell(0,5,"WHOLE FOODS COMMUNITY CO-OP, INC."); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Amanda Borgren"); + $pdf->MultiCell(0,5,"Owner Services"); + +} + +$pdf->Output('equity past due letters.pdf','D'); diff --git a/fannie/legacy/members/equity_letters/postcards.php b/fannie/legacy/members/equity_letters/postcards.php new file mode 100644 index 000000000..b7490f6fa --- /dev/null +++ b/fannie/legacy/members/equity_letters/postcards.php @@ -0,0 +1,50 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF('L','in',array(3.5,5.0)); +$pdf->AddFont('ScalaSans','','ScalaSans.php'); + +$primary = ""; +$pdf->SetAutoPageBreak(True,0); +$pdf->SetFont("ScalaSans","",10); +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $fullname = $selAddW[1]." ".$selAddW[2]; + + $pdf->SetXY(2.75,1.45); + $pdf->Cell(2,0.25,$fullname,"",1,"L"); + + $pdf->SetX(2.75); + $address = str_replace("\n"," ",$selAddW[3]); + $pdf->Cell(2,0.25,$address,"",1,"L"); + + $pdf->SetX(2.75); + $str = $selAddW[5].", ".$selAddW[6]." ".$selAddW[7]; + $pdf->Cell(2,0.25,$str,"",1,"L"); +} + +$pdf->Output('member postcards.pdf','D'); diff --git a/fannie/legacy/members/equity_letters/term.php b/fannie/legacy/members/equity_letters/term.php new file mode 100644 index 000000000..62533b351 --- /dev/null +++ b/fannie/legacy/members/equity_letters/term.php @@ -0,0 +1,116 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Scala','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$today,0); + $pdf->Ln(15); + + $firstname = ucwords(strtolower($selAddW[1])); + $lastname = ucwords(strtolower($selAddW[2])); + $fullname = $firstname." ".$lastname; + /* + $equity = $selAddW[8]; + $classA = 20; + $classB = $equity - 20; + $remainingB = 100 - $equity; + $endDate = $selAddW[9]; + */ + + //Member address + $pdf->Cell(10,10,trim($fullname),0); + $pdf->Ln(5); + + if (strstr($selAddW[3],"\n") === False){ + $pdf->Cell(80,10,$selAddW[3],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[3]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[5] . ', ' . $selAddW[6] . ' ' . $selAddW[7],0); + $pdf->Ln(15); + + $pdf->MultiCell(0,5,"Dear ".$firstname.","); + $pdf->Ln(5); + + $txt = "We have received your Application to Terminate your membership at WFC. The +Board reviews termination requests annually in "; + $pdf->SetFont("Scala","","12"); + $pdf->Write(5,str_replace("\n"," ",$txt)); + $pdf->SetFont("Scala","B","12"); + $pdf->Write(5,"February"); + $pdf->SetFont("Scala","","12"); + $txt = ". Refunds, less any indebtedness owed to WFC, are authorized for payment in +the order received subject to the financial health of WFC and receipt of additional stock +from new members. Your stock will be refunded as soon as possible based on these criteria."; + $pdf->Write(5,str_replace("\n"," ",$txt)."\n"); + $pdf->Ln(5); + + $txt = "Submission of an Application to Terminate immediately inactivates your owner +benefits and discounts and your right to participate in governance of WFC. Please keep us +advised of any changes in your mailing address."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "If you have any questions, please do not hesitate to ask. I can be reached at the +number above or at mms@wholefoods.coop. Thank you."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $pdf->MultiCell(0,5,"Thank you for your support of WFC"); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Sincerely yours,"); + $pdf->MultiCell(0,5,"WHOLE FOODS COMMUNITY CO-OP, INC."); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Amanda Borgren"); + $pdf->MultiCell(0,5,"Owner Services"); + +} + +$pdf->Output('member term letters.pdf','D'); diff --git a/fannie/legacy/members/equity_letters/upgrade.php b/fannie/legacy/members/equity_letters/upgrade.php new file mode 100644 index 000000000..3201c40e3 --- /dev/null +++ b/fannie/legacy/members/equity_letters/upgrade.php @@ -0,0 +1,114 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Scala','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$today,0); + $pdf->Ln(15); + + $firstname = ucwords(strtolower($selAddW[1])); + $lastname = ucwords(strtolower($selAddW[2])); + $fullname = $firstname." ".$lastname; + /* + $equity = $selAddW[8]; + $classA = 20; + $classB = $equity - 20; + $remainingB = 100 - $equity; + $endDate = $selAddW[9]; + */ + + //Member address + $pdf->Cell(10,10,trim($fullname),0); + $pdf->Ln(5); + + if (strstr($selAddW[3],"\n") === False){ + $pdf->Cell(80,10,$selAddW[3],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[3]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[5] . ', ' . $selAddW[6] . ' ' . $selAddW[7],0); + $pdf->Ln(15); + + $pdf->MultiCell(0,5,"Dear ".$firstname.","); + $pdf->Ln(5); + + $pdf->MultiCell(0,5,"Thank you for fulfilling your WFC equity requirement!"); + $pdf->Ln(5); + + $pdf->Write(5,"This letter certifies that you are the owner of twenty"); + $pdf->Write(5," shares (at $5.00/share) of stock in WFC. Your investment represents"); + $pdf->Write(5," four Class A/voting shares and"); + $pdf->Write(5,str_replace("\n"," "," sixteen Class B/equity shares. WFC uses electronic records to document stock purchases and +no longer issues paper stock certificates. Please keep your stock purchase receipts and this letter +as proof of your ownership.")); + $pdf->Write(5,"\n"); + $pdf->Ln(5); + + $txt = "Don't forget to use your Owner card each time you shop. This card qualifies +you for discounts at local businesses participating in our Community Cooperation Program, +identifies you at WFC's checkouts, and properly allocates your purchases. Please remember +to keep WFC updated with any changes in your address or phone number."; + $pdf->SetFont("Scala","","12"); + $pdf->Write(5,str_replace("\n"," ",$txt)."\n"); + $pdf->Ln(5); + + $txt = "If you have any questions, please do not hesitate to ask. I can be reached at the number above or +at mms@wholefoods.coop"; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Sincerely yours,"); + $pdf->MultiCell(0,5,"WHOLE FOODS COMMUNITY CO-OP, INC."); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Amanda Borgren"); + $pdf->MultiCell(0,5,"Owner Services"); + +} + +$pdf->Output('member welcome letters.pdf','D'); diff --git a/fannie/legacy/members/equity_letters/watermark.jpg b/fannie/legacy/members/equity_letters/watermark.jpg new file mode 100644 index 000000000..ccbcd86b4 Binary files /dev/null and b/fannie/legacy/members/equity_letters/watermark.jpg differ diff --git a/fannie/legacy/members/equity_letters/welcome.php b/fannie/legacy/members/equity_letters/welcome.php new file mode 100644 index 000000000..38389d0a3 --- /dev/null +++ b/fannie/legacy/members/equity_letters/welcome.php @@ -0,0 +1,149 @@ +query($selAddQ); + +$today = date("F j, Y"); + +$pdf = new FPDF(); +$pdf->AddFont('Scala','B','Scala-Bold.php'); +$pdf->AddFont('Scala','','Scala.php'); + +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Scala','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$today,0); + $pdf->Ln(15); + + $firstname = ucwords(strtolower($selAddW[1])); + $lastname = ucwords(strtolower($selAddW[2])); + $fullname = $firstname." ".$lastname; + $equity = $selAddW[8]; + $classA = 20; + $classB = $equity - 20; + $remainingB = 100 - $equity; + $endDate = $selAddW[9]; + + //Member address + $pdf->Cell(10,10,trim($fullname),0); + $pdf->Ln(5); + + if (strstr($selAddW[3],"\n") === False){ + $pdf->Cell(80,10,$selAddW[3],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[3]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[5] . ', ' . $selAddW[6] . ' ' . $selAddW[7],0); + $pdf->Ln(15); + + $pdf->MultiCell(0,5,"Dear ".$firstname.","); + $pdf->Ln(5); + + $pdf->MultiCell(0,5,"Thank you for becoming an Owner of WFC!"); + $pdf->Ln(5); + + if ($classB == 0){ + $pdf->Write(5,"This letter certifies that you are the owner of "); + $pdf->SetFont("Scala","B","12"); + $pdf->Write(5,$numbers[$classA/5]); + $pdf->SetFont("Scala","","12"); + $pdf->Write(5,str_replace("\n"," "," shares (at $5.00/share) of Class A stock in WFC. WFC uses electronic records to +document stock purchases and no longer issues paper stock certificates. Please keep your stock purchase +receipts and this letter as proof of ownership.")); + $pdf->Write(5,"\n"); + $pdf->Ln(5); + } + else { + $pdf->Write(5,"This letter certifies that you are the owner of "); + $pdf->Write(5,$numbers[$equity/5]); + $pdf->Write(5," shares (at $5.00/share) of stock in WFC. Your investment represents "); + $pdf->SetFont("Scala","B","12"); + $pdf->Write(5,$numbers[$classA/5]); + $pdf->SetFont("Scala","","12"); + $pdf->Write(5," Class A/voting shares and "); + $pdf->SetFont("Scala","B","12"); + $pdf->Write(5,$numbers[$classB/5]); + $pdf->SetFont("Scala","","12"); + $pdf->Write(5,str_replace("\n"," "," Class B/equity shares. WFC uses electronic records to document stock purchases and +no longer issues paper stock certificates. Please keep your stock purchase receipts and this letter +as proof of your ownership")); + $pdf->Write(5,"\n"); + $pdf->Ln(5); + } + + if ($remainingB != 0){ + $txt = sprintf("With your initial payment of $%.2f, you purchased Class A voting stock. You have two years +to fulfill your Subscription Agreement by purchasing the remaining $%.2f of Class B equity +stock. Equity stock can be purchased in any increment, at any time through ", + $classA,$remainingB); + $pdf->Write(5,str_replace("\n"," ",$txt)); + $pdf->SetFont("Scala","B","12"); + $pdf->Write(5,array_shift(explode(" ",$endDate))); + $pdf->SetFont("Scala","","12"); + $pdf->Write(5,".\n"); + $pdf->Ln(5); + } + + $txt = "At the time of sign up you received your owner card. This card qualifies +you for discounts at local businesses participating in our Community Cooperation Program, +identifies you at WFC's checkouts, and properly allocates your purchases. Please remember +to keep WFC updated with any changes in your address or phone number."; + $pdf->SetFont("Scala","","12"); + $pdf->Write(5,str_replace("\n"," ",$txt)."\n"); + $pdf->Ln(5); + + $txt = "If you have any questions, please do not hesitate to ask. I can be reached at the number above or +at mms@wholefoods.coop"; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Sincerely yours,"); + $pdf->MultiCell(0,5,"WHOLE FOODS COMMUNITY CO-OP, INC."); + $pdf->Ln(10); + + $pdf->MultiCell(0,5,"Amanda Borgren"); + $pdf->MultiCell(0,5,"Owner Services"); + +} + +$pdf->Output('member welcome letters.pdf','D'); diff --git a/fannie/legacy/members/equity_letters/wheat.jpg b/fannie/legacy/members/equity_letters/wheat.jpg new file mode 100644 index 000000000..9aa70bc3a Binary files /dev/null and b/fannie/legacy/members/equity_letters/wheat.jpg differ diff --git a/fannie/legacy/members/equity_letters/wheat.png b/fannie/legacy/members/equity_letters/wheat.png new file mode 100644 index 000000000..7589bf149 Binary files /dev/null and b/fannie/legacy/members/equity_letters/wheat.png differ diff --git a/fannie/legacy/members/equity_letters/wheat2.jpg b/fannie/legacy/members/equity_letters/wheat2.jpg new file mode 100644 index 000000000..be62c9a5d Binary files /dev/null and b/fannie/legacy/members/equity_letters/wheat2.jpg differ diff --git a/fannie/legacy/members/equity_letters/wheat2.png b/fannie/legacy/members/equity_letters/wheat2.png new file mode 100644 index 000000000..b901c11f1 Binary files /dev/null and b/fannie/legacy/members/equity_letters/wheat2.png differ diff --git a/fannie/legacy/members/equity_letters/wheat3.jpg b/fannie/legacy/members/equity_letters/wheat3.jpg new file mode 100644 index 000000000..1d293073f Binary files /dev/null and b/fannie/legacy/members/equity_letters/wheat3.jpg differ diff --git a/fannie/legacy/members/expiringMems.php b/fannie/legacy/members/expiringMems.php new file mode 100644 index 000000000..7147356fe --- /dev/null +++ b/fannie/legacy/members/expiringMems.php @@ -0,0 +1,22 @@ + + + + diff --git a/fannie/legacy/members/expiringThisMonth.php b/fannie/legacy/members/expiringThisMonth.php new file mode 100644 index 000000000..e52f2fb42 --- /dev/null +++ b/fannie/legacy/members/expiringThisMonth.php @@ -0,0 +1,35 @@ + +Mem#FirstLastEnd date +OwnedDueAddress"; +$result = $sql->query($query); +while($row = $sql->fetch_row($result)){ + echo ""; + for($i=0;$i<$sql->num_fields($result);$i++) echo "$row[$i]"; + echo ""; +} + +?> + + + diff --git a/fannie/legacy/members/fullMailingList.php b/fannie/legacy/members/fullMailingList.php new file mode 100644 index 000000000..852028217 --- /dev/null +++ b/fannie/legacy/members/fullMailingList.php @@ -0,0 +1,41 @@ + now() or d.end_date = '' or d.end_date is NULL) + and m.street <> '' + order by convert(int,c.cardno)"; +$NL = "
        "; +if (!isset($_GET["excel"])){ + echo "Save to Excel".$NL; +} +else { + $NL = "\n"; + header("Content-Disposition: inline; filename=FullMailingList.csv"); + header("Content-type: application/vnd.ms-excel; name='excel'"); +} +echo "Mem#,Lastname,Firstname,Address1,Address2,City,State,Zip".$NL; +$result = $sql->query($query); +while ($row = $sql->fetch_array($result)){ + echo $row[0].","; + echo "\"".$row[1]."\","; + echo "\"".$row[2]."\","; + if (strstr($row[3],"\n") === False){ + echo "\"".$row[3]."\",\"\","; + } + else { + $pts = explode("\n",$row[3]); + echo "\"".$pts[0]."\",\"".$pts[1]."\","; + } + echo "\"".$row[4]."\","; + echo "\"".$row[5]."\","; + echo "\"".$row[6]."\"".$NL; +} +?> diff --git a/fannie/legacy/members/functMem.php b/fannie/legacy/members/functMem.php new file mode 100644 index 000000000..55d10708f --- /dev/null +++ b/fannie/legacy/members/functMem.php @@ -0,0 +1,554 @@ +query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + + + /*for($i=0; $i<5; $i++) + { + echo "\n"; + }*/ + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + echo ""; + }elseif("$row[$i]"=='P'){ + echo ""; + }elseif("$row[$i]"=='C'){ + echo ""; + }elseif("$row[$i]" == 'MC'){ + echo ""; + }else{ + echo "\n"; + } + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + + "; + } + for ($i=3;$i<$number_cols-1; $i++) + { + if("$row[$i]"=='S'){ + echo ""; + echo $row[$i]; + echo ""; + echo $row[$i]; + echo ""; + echo $row[$i]; + echo ""; + echo $row[$i]; + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + + +/* -------------------------------end select_to_table-------------------*/ + +function head_to_table($query,$border,$bgcolor) +{ + global $sql; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + $r=0; + + while($r < $sql->num_fields($results)){ + $reportF = $sql->fetch_field($results,$r); + $field = $reportF->name; + echo "\n"; + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + echo ""; + } + for ($i=1;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $field; + $r++; + } + echo "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + echo $row[0]; + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +}/* -------------------------------end select_to_table-------------------*/ + +/* -------------------------------start edit_to_table ------------------*/ + +function edit_to_table($query,$border,$bgcolor) +{ + global $sql; + //echo $query; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + echo ""; + } + for ($i=2;$i<$number_cols; $i++) + { + + echo "\n"; + } echo "\n"; + } echo "
        MemNumPer #Last NameFirst NameChargeEdit"; + echo "
        "; + + if(!isset($row[0])) + { + echo "NULL"; + }else{ + echo $row[0]; + echo "" . $row[1] . ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }elseif($i <> 4){ + echo ""; + echo ""; + echo ""; + echo ""; + }else{ + if($row[4] == 1){ + echo ""; + }else{ + echo ""; + } + echo ""; + } + echo "
        \n"; +} +/* -------------------------------end edit_to_table --------------------*/ + +/* -------------------------------start select_star_from----------------*/ +/* creates a table returning all values from a table (SELECT * FROM depts) + Variables are: + $table = table to run query on + + example: + select_star_from(depts); +*/ + +function select_star_from($table) +{ + global $sql; + $query = "SELECT * FROM $table"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + //for($i=0; $i<$number_cols; $i++) + //{ + // echo "\n"; + //} + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +/* ------------------------------end select_start_from-----------------0-------*/ + +/* ------------------------------start select_where_equal----------------------*/ +/* creates a table using a SELECT WHERE syntax (SELECT * FROM transmemhead WHERE memNum = '175') + Variables are + $table = table for select + $where = field for where statement + $whereVar = value for where statement + + example: + select_where(transmemhead,memNum,175) + +*/ + +function select_where_equal($table,$where,$whereVar,$order) +{ + global $sql; + if(empty($order)){ + $query = "SELECT * FROM $table WHERE $where = '$whereVar'"; + }else{ + $query = "SELECT * FROM $table WHERE $where = '$whereVar' order by $order"; + } + + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +/* ----------------------------end select_where_equal--------------------------*/ +/* ----------------------------start edit_where_equal--------------------------*/ + +function edit_where_equal($table,$where,$whereVar,$order) +{ + global $sql; + if(empty($order)){ + $query = "SELECT * FROM $table WHERE $where = '$whereVar'"; + }else{ + $query = "SELECT * FROM $table WHERE $where = '$whereVar' order by $order"; + } + + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo ""; + } + echo "
        \n"; +} + +/* ----------------------------end edit_where_equal --------------------------*/ + +/* ----------------------------start select_where_between----------------------*/ +/* creates a table using a SELECT WHERE syntax (SELECT * FROM transmemhead WHERE memNum BETWEEN '175' AND '185') + Variables are + $table = table for select + $where = field for where statement + $whereVar1 = beginning value for where statement + $whereVar2 = ending value for where statement + + example: + select_where_between(transmemhead,memNum,175,185) + +*/ + +function select_where_between($table,$where,$whereVar1,$whereVar2) +{ + global $sql; + $query = "SELECT * FROM $table WHERE $where BETWEEN '$whereVar1' AND '$whereVar2'"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + for($i=0; $i<$number_cols; $i++) + { + echo "\n"; + } + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} +/* ----------------------------end select_where_between------------------*/ + + +/* ----------------------------start select_to_drop----------------------*/ +/* creates a dynamic drop down menu for use in forms. Variables are: + $table = table for select + $value = field to be used for drop down value + $label = field to be used for the label on the drop down menu + $name = name of the drop down menu + $default = default value on the drop down menu + + example: + select_to_drop(depts,deptNum,deptDesc,deptList) + +*/ + +function select_to_drop($table,$value,$label,$name,$default) +{ + global $sql; + $query = "SELECT * FROM $table"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + echo ""; + do + { + if($selected = $row_members[$value]){ + echo ""; + }else{ + echo ""; + } + } while ($row_members = $sql->fetch_array($results)); + $rows = $sql->num_rows($results); + +}*/ + +function query_to_drop($dropQ,$value,$label,$name,$line) +{ + global $sql; + $dropR= $sql->query($dropQ); + $dropNC= $sql->num_fields($dropR); + //display query + //echo $number_cols; + //echo "query: $query"; + echo "\n\n\n\n"; +} + + + + +/* add_household_member adds a new household member to an account, setting all variables to person 1, except for personnum, lastname, firstname, and chargeok */ + +function add_household_member($cardNo,$person,$lastName,$firstName,$chargeOk){ + global $sql; + + $selCustQ = "SELECT * FROM custdata WHERE cardNo = '$cardNo' and personnum = '1'"; + $selCustR = $sql->query($selCustQ,$db); + + $selCustA = $sql->fetch_array($selCustR); + foreach ($selCustA AS $key => $value) { + $$key = $value; + } + + $blueLine = $cardNo . " " . $lastName; + + $insCustQ = "INSERT INTO custdata VALUES( + '$CardNo', + '$person', + '$lastName', + '$firstName', + CONVERT(money,$CashBack), + CONVERT(money,$Balance), + '$Discount', + CONVERT(money,$MemDiscountLimit), + '$chargeOk', + '$WriteChecks', + '$StoreCoupons', + '$Type', + '$memType', + '$staff', + '$SSI', + CONVERT(money,$Purchases), + '$NumberOfChecks', + '$memCoupons', + '$blueLine', + '$Shown')"; + //echo $insCustQ; + $insCustR = $sql->query($insCustQ,$db); + + $dbPOS1 = $sql->connect('129.103.2.11','sa'); + $sql->select_db('POSBDAT',$dbPOS1); + $insCustRp1 = $sql->query($insCustQ,$dbPOS1); + +} + +function update_household_member($cardNo,$person,$lname,$fname,$chargeOK) +{ + global $sql; + $blueLine = $cardNo . ' ' . $lname; + + $updateCustQ = "UPDATE custdata SET lastName = '$lname', + firstName = '$fname', chargeOK = $chargeOK, + blueLine = '$blueLine' WHERE cardno = $cardNo + and personnum = $person"; + echo $updateCustQ; + $updateCustR = $sql->query($updateCustQ); + +} + +function edit_work_status($query,$border,$bgcolor) +{ + global $sql; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + /*$r=0; + + while($r < $sql->num_fields($results)){ + $reportF = $sql->fetch_field($results,$r); + $field = $reportF->name; + echo "\n"; + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_array($results)) + { + echo "\n"; + echo ""; + } + for ($i=1;$i<$number_cols; $i++) + { + echo "\n"; + } + + echo ""; + echo "\n"; + } echo "
        " . $field; + $r++; + }*/ + echo "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + echo $row[0]; + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo ""; + echo ""; + echo "
        \n"; +} + +function log_info($name,$variable){ + global $FANNIE_ROOT; + $logfile = $FANNIE_ROOT."logs/loginfo.txt"; + $log = fopen($logfile,"a"); + $message = "[".date('d-M-Y H:i:s')."] ".$name . ": ".$variable."\n"; + fwrite($log,$message); + fclose($log); +} +?> diff --git a/fannie/legacy/members/genNums.php b/fannie/legacy/members/genNums.php new file mode 100755 index 000000000..fdeca333f --- /dev/null +++ b/fannie/legacy/members/genNums.php @@ -0,0 +1,48 @@ +Log in"; + echo " to generate new member numbers"; + return; +} + +$query = "SELECT MAX(card_no) FROM meminfo"; +$result = $sql->query($query); +$row = $sql->fetch_array($result); + +//$numStart = 6910; +$numBegin= $row[0] + 1; +$numEnd = $numBegin + 39; +//echo $row[0] . "
        "; +echo $numBegin . ' Starting Number
        '; +echo $numEnd . " Ending Number
        "; +$numName = $numStart . " NEW MEMBER"; + +FOR($numStart=$numBegin;$numStart<$numEnd+1;$numStart++){ + $query1 = "INSERT INTO mbrmastr VALUES($numStart,'','','','','DULUTH','MN','','',20,80,'00/00/0000',0,0,1,20,0,'','',0,1,'','','P',1,'',0,0,0,0,0,'',0,'00/00/0000',0,0,0,0,'00/00/0000','00/00/0000','','',0,0,0,1,1,0,0,'00/00/0000',0,0,0,0,0,0,0,1,'00/00/0000',0,'00/00/0000',0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,'00/00/0000','',0)"; + echo $query1 . "
        "; + $result1 = $sql->query($query1); + + $query4 = "INSERT INTO meminfo VALUES ($numStart,'','','','','','','','','','','',0)"; + echo $query4 ."
        "; + $sql->query($query4); + + $query2 = "INSERT INTO memNames VALUES('NEW MEMBER','',$numStart,1,1,1,1,'$numStart.1.1')"; + echo $query2 . "
        "; + $result2 = $sql->query($query2); + + $query3 = "INSERT INTO custdata VALUES($numStart,1,'NEW MEMBER','',999.99,0,0,0.00,1,1,1,'PC',1,0,0,0,999,1,'$numName',1)"; + echo $query3; + $result3 = $sql->query($query3); + + $query4 = "INSERT INTO memDates VALUES($numStart,NULL,NULL)"; + echo $query4; + $result4 = $sql->query($query4); +} +?> diff --git a/fannie/legacy/members/genStaff.php b/fannie/legacy/members/genStaff.php new file mode 100755 index 000000000..898306c2b --- /dev/null +++ b/fannie/legacy/members/genStaff.php @@ -0,0 +1,35 @@ +query($query); +$row = $sql->fetch_array($result); + +//$numStart = 6910; +$numBegin= $row[0] + 1; +$numEnd = $numBegin + 20; +echo $row[0] . "
        "; +echo $numEnd . "
        "; + +FOR($numStart=$numBegin;$numStart<$numEnd+1;$numStart++){ + $query1 = "INSERT INTO mbrmastr VALUES($numStart,'','','','','DULUTH','MN','','',20,80,'00/00/0000',0,0,1,0,0,'','',0,3,'','','P',1,'',0,0,0,0,0,'',0,'00/00/0000',0,0,0,0,'00/00/0000','00/00/0000','','',0,0,0,1,1,0,0,'00/00/0000',0,0,0,0,0,0,0,1,'00/00/0000',0,'00/00/0000',0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,'00/00/0000','',0)"; + echo $query1 . "
        "; + //$result1 = $sql->query($query1); + + $query4 = "INSERT INTO meminfo VALUES ($numStart,'','','','','','','','','','','',0)"; + echo $query4 ."
        "; + $sql->query($query4); + + $query2 = "INSERT INTO memNames VALUES('NEW STAFF','',$numStart,1,1,1,1,'$numStart.1.1')"; + echo $query2 . "
        "; + //$result2 = $sql->query($query2); + + $query3 = "INSERT INTO custdata VALUES($numStart,1,'NEW STAFF','',999.99,0,12,0,1,1,1,'REG',9,0,0,0,999,999,'$numName',1)"; + echo $query3; + $result3 = $sql->query($query3); + +} +?> diff --git a/fannie/legacy/members/header.html b/fannie/legacy/members/header.html new file mode 100644 index 000000000..7f3beceef --- /dev/null +++ b/fannie/legacy/members/header.html @@ -0,0 +1 @@ + diff --git a/fannie/legacy/members/headerTest.php b/fannie/legacy/members/headerTest.php new file mode 100644 index 000000000..c400ab87e --- /dev/null +++ b/fannie/legacy/members/headerTest.php @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + +
        + + + + + + + + + + + +
        + + + Items + Reference +
        + + + diff --git a/fannie/legacy/members/images/AR.gif b/fannie/legacy/members/images/AR.gif new file mode 100644 index 000000000..9c2ae15e4 Binary files /dev/null and b/fannie/legacy/members/images/AR.gif differ diff --git a/fannie/legacy/members/images/GKC1.png b/fannie/legacy/members/images/GKC1.png new file mode 100644 index 000000000..f7d0d50da Binary files /dev/null and b/fannie/legacy/members/images/GKC1.png differ diff --git a/fannie/legacy/members/images/WFCLogoCThru1.gif b/fannie/legacy/members/images/WFCLogoCThru1.gif new file mode 100644 index 000000000..48a1e9fa1 Binary files /dev/null and b/fannie/legacy/members/images/WFCLogoCThru1.gif differ diff --git a/fannie/legacy/members/images/WFCLogoCThru1.jpg b/fannie/legacy/members/images/WFCLogoCThru1.jpg new file mode 100644 index 000000000..fa23d75c9 Binary files /dev/null and b/fannie/legacy/members/images/WFCLogoCThru1.jpg differ diff --git a/fannie/legacy/members/images/WFCLogoCThru1.png b/fannie/legacy/members/images/WFCLogoCThru1.png new file mode 100644 index 000000000..c5cb5bbda Binary files /dev/null and b/fannie/legacy/members/images/WFCLogoCThru1.png differ diff --git a/fannie/legacy/members/images/batches1.png b/fannie/legacy/members/images/batches1.png new file mode 100644 index 000000000..f579a167e Binary files /dev/null and b/fannie/legacy/members/images/batches1.png differ diff --git a/fannie/legacy/members/images/batches10.png b/fannie/legacy/members/images/batches10.png new file mode 100644 index 000000000..917d1a6b8 Binary files /dev/null and b/fannie/legacy/members/images/batches10.png differ diff --git a/fannie/legacy/members/images/batches11.png b/fannie/legacy/members/images/batches11.png new file mode 100644 index 000000000..f31518515 Binary files /dev/null and b/fannie/legacy/members/images/batches11.png differ diff --git a/fannie/legacy/members/images/batches12.png b/fannie/legacy/members/images/batches12.png new file mode 100644 index 000000000..3dcc24b83 Binary files /dev/null and b/fannie/legacy/members/images/batches12.png differ diff --git a/fannie/legacy/members/images/batches13.png b/fannie/legacy/members/images/batches13.png new file mode 100644 index 000000000..de673677c Binary files /dev/null and b/fannie/legacy/members/images/batches13.png differ diff --git a/fannie/legacy/members/images/batches14.png b/fannie/legacy/members/images/batches14.png new file mode 100644 index 000000000..65e0cf4b0 Binary files /dev/null and b/fannie/legacy/members/images/batches14.png differ diff --git a/fannie/legacy/members/images/batches15.png b/fannie/legacy/members/images/batches15.png new file mode 100644 index 000000000..10b36c6f0 Binary files /dev/null and b/fannie/legacy/members/images/batches15.png differ diff --git a/fannie/legacy/members/images/batches16.png b/fannie/legacy/members/images/batches16.png new file mode 100644 index 000000000..ff9fa7886 Binary files /dev/null and b/fannie/legacy/members/images/batches16.png differ diff --git a/fannie/legacy/members/images/batches17.png b/fannie/legacy/members/images/batches17.png new file mode 100644 index 000000000..975b53720 Binary files /dev/null and b/fannie/legacy/members/images/batches17.png differ diff --git a/fannie/legacy/members/images/batches18.png b/fannie/legacy/members/images/batches18.png new file mode 100644 index 000000000..b611ecb34 Binary files /dev/null and b/fannie/legacy/members/images/batches18.png differ diff --git a/fannie/legacy/members/images/batches19.png b/fannie/legacy/members/images/batches19.png new file mode 100644 index 000000000..12f132b4f Binary files /dev/null and b/fannie/legacy/members/images/batches19.png differ diff --git a/fannie/legacy/members/images/batches2.png b/fannie/legacy/members/images/batches2.png new file mode 100644 index 000000000..8f4e22523 Binary files /dev/null and b/fannie/legacy/members/images/batches2.png differ diff --git a/fannie/legacy/members/images/batches20.png b/fannie/legacy/members/images/batches20.png new file mode 100644 index 000000000..705d75a16 Binary files /dev/null and b/fannie/legacy/members/images/batches20.png differ diff --git a/fannie/legacy/members/images/batches21.png b/fannie/legacy/members/images/batches21.png new file mode 100644 index 000000000..a9d6b385b Binary files /dev/null and b/fannie/legacy/members/images/batches21.png differ diff --git a/fannie/legacy/members/images/batches22.png b/fannie/legacy/members/images/batches22.png new file mode 100644 index 000000000..9f576ea7f Binary files /dev/null and b/fannie/legacy/members/images/batches22.png differ diff --git a/fannie/legacy/members/images/batches3.png b/fannie/legacy/members/images/batches3.png new file mode 100644 index 000000000..195599cc6 Binary files /dev/null and b/fannie/legacy/members/images/batches3.png differ diff --git a/fannie/legacy/members/images/batches4.png b/fannie/legacy/members/images/batches4.png new file mode 100644 index 000000000..d0be5b3cb Binary files /dev/null and b/fannie/legacy/members/images/batches4.png differ diff --git a/fannie/legacy/members/images/batches5.png b/fannie/legacy/members/images/batches5.png new file mode 100644 index 000000000..066e6d7e5 Binary files /dev/null and b/fannie/legacy/members/images/batches5.png differ diff --git a/fannie/legacy/members/images/batches6.png b/fannie/legacy/members/images/batches6.png new file mode 100644 index 000000000..d7c959e00 Binary files /dev/null and b/fannie/legacy/members/images/batches6.png differ diff --git a/fannie/legacy/members/images/batches7.png b/fannie/legacy/members/images/batches7.png new file mode 100644 index 000000000..d6c463e26 Binary files /dev/null and b/fannie/legacy/members/images/batches7.png differ diff --git a/fannie/legacy/members/images/batches8.png b/fannie/legacy/members/images/batches8.png new file mode 100644 index 000000000..f47676b53 Binary files /dev/null and b/fannie/legacy/members/images/batches8.png differ diff --git a/fannie/legacy/members/images/batches9.png b/fannie/legacy/members/images/batches9.png new file mode 100644 index 000000000..76ec7e25d Binary files /dev/null and b/fannie/legacy/members/images/batches9.png differ diff --git a/fannie/legacy/members/images/control.gif b/fannie/legacy/members/images/control.gif new file mode 100644 index 000000000..934ffeda5 Binary files /dev/null and b/fannie/legacy/members/images/control.gif differ diff --git a/fannie/legacy/members/images/deliQ1.png b/fannie/legacy/members/images/deliQ1.png new file mode 100644 index 000000000..0560d8985 Binary files /dev/null and b/fannie/legacy/members/images/deliQ1.png differ diff --git a/fannie/legacy/members/images/deliQ2.png b/fannie/legacy/members/images/deliQ2.png new file mode 100644 index 000000000..eda9cd7e1 Binary files /dev/null and b/fannie/legacy/members/images/deliQ2.png differ diff --git a/fannie/legacy/members/images/deliQ3.png b/fannie/legacy/members/images/deliQ3.png new file mode 100644 index 000000000..f7ea7e677 Binary files /dev/null and b/fannie/legacy/members/images/deliQ3.png differ diff --git a/fannie/legacy/members/images/deliQ4.png b/fannie/legacy/members/images/deliQ4.png new file mode 100644 index 000000000..d20889ea8 Binary files /dev/null and b/fannie/legacy/members/images/deliQ4.png differ diff --git a/fannie/legacy/members/images/deliQ5.png b/fannie/legacy/members/images/deliQ5.png new file mode 100644 index 000000000..84e10d829 Binary files /dev/null and b/fannie/legacy/members/images/deliQ5.png differ diff --git a/fannie/legacy/members/images/deliQ6.png b/fannie/legacy/members/images/deliQ6.png new file mode 100644 index 000000000..4f1e82f65 Binary files /dev/null and b/fannie/legacy/members/images/deliQ6.png differ diff --git a/fannie/legacy/members/images/detail.gif b/fannie/legacy/members/images/detail.gif new file mode 100644 index 000000000..5bce880ca Binary files /dev/null and b/fannie/legacy/members/images/detail.gif differ diff --git a/fannie/legacy/members/images/equity.gif b/fannie/legacy/members/images/equity.gif new file mode 100644 index 000000000..4ffcca7d0 Binary files /dev/null and b/fannie/legacy/members/images/equity.gif differ diff --git a/fannie/legacy/members/images/exist_up.gif b/fannie/legacy/members/images/exist_up.gif new file mode 100644 index 000000000..355082578 Binary files /dev/null and b/fannie/legacy/members/images/exist_up.gif differ diff --git a/fannie/legacy/members/images/famfamfam/WFC Logo_color.jpg b/fannie/legacy/members/images/famfamfam/WFC Logo_color.jpg new file mode 100644 index 000000000..ed912b3bf Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/WFC Logo_color.jpg differ diff --git a/fannie/legacy/members/images/famfamfam/action_back.gif b/fannie/legacy/members/images/famfamfam/action_back.gif new file mode 100644 index 000000000..46a8ffb19 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_back.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_forward.gif b/fannie/legacy/members/images/famfamfam/action_forward.gif new file mode 100644 index 000000000..21da43758 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_forward.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_go.gif b/fannie/legacy/members/images/famfamfam/action_go.gif new file mode 100644 index 000000000..82ae7ed82 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_go.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_paste.gif b/fannie/legacy/members/images/famfamfam/action_paste.gif new file mode 100644 index 000000000..bffd6b0b3 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_paste.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_print.gif b/fannie/legacy/members/images/famfamfam/action_print.gif new file mode 100644 index 000000000..92e7e0a1a Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_print.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_refresh.gif b/fannie/legacy/members/images/famfamfam/action_refresh.gif new file mode 100644 index 000000000..8268958a1 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_refresh.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_refresh_blue.gif b/fannie/legacy/members/images/famfamfam/action_refresh_blue.gif new file mode 100644 index 000000000..7c8bcd00f Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_refresh_blue.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_save.gif b/fannie/legacy/members/images/famfamfam/action_save.gif new file mode 100644 index 000000000..6e6f7decc Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_save.gif differ diff --git a/fannie/legacy/members/images/famfamfam/action_stop.gif b/fannie/legacy/members/images/famfamfam/action_stop.gif new file mode 100644 index 000000000..c941c1902 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/action_stop.gif differ diff --git a/fannie/legacy/members/images/famfamfam/application_dreamweaver.gif b/fannie/legacy/members/images/famfamfam/application_dreamweaver.gif new file mode 100644 index 000000000..15fe1071e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/application_dreamweaver.gif differ diff --git a/fannie/legacy/members/images/famfamfam/application_firefox.gif b/fannie/legacy/members/images/famfamfam/application_firefox.gif new file mode 100644 index 000000000..1192e3e77 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/application_firefox.gif differ diff --git a/fannie/legacy/members/images/famfamfam/application_flash.gif b/fannie/legacy/members/images/famfamfam/application_flash.gif new file mode 100644 index 000000000..92abbcbe2 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/application_flash.gif differ diff --git a/fannie/legacy/members/images/famfamfam/arrow_down.gif b/fannie/legacy/members/images/famfamfam/arrow_down.gif new file mode 100644 index 000000000..f0bb6a4ea Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/arrow_down.gif differ diff --git a/fannie/legacy/members/images/famfamfam/arrow_left.gif b/fannie/legacy/members/images/famfamfam/arrow_left.gif new file mode 100644 index 000000000..932ade160 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/arrow_left.gif differ diff --git a/fannie/legacy/members/images/famfamfam/arrow_right.gif b/fannie/legacy/members/images/famfamfam/arrow_right.gif new file mode 100644 index 000000000..780431c2b Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/arrow_right.gif differ diff --git a/fannie/legacy/members/images/famfamfam/arrow_up.gif b/fannie/legacy/members/images/famfamfam/arrow_up.gif new file mode 100644 index 000000000..e8234178e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/arrow_up.gif differ diff --git a/fannie/legacy/members/images/famfamfam/box.gif b/fannie/legacy/members/images/famfamfam/box.gif new file mode 100644 index 000000000..cd4729a5d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/box.gif differ diff --git a/fannie/legacy/members/images/famfamfam/calendar.gif b/fannie/legacy/members/images/famfamfam/calendar.gif new file mode 100644 index 000000000..f78788cbe Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/calendar.gif differ diff --git a/fannie/legacy/members/images/famfamfam/comment.gif b/fannie/legacy/members/images/famfamfam/comment.gif new file mode 100644 index 000000000..897cf2e3e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/comment.gif differ diff --git a/fannie/legacy/members/images/famfamfam/comment_blue.gif b/fannie/legacy/members/images/famfamfam/comment_blue.gif new file mode 100644 index 000000000..897cf2e3e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/comment_blue.gif differ diff --git a/fannie/legacy/members/images/famfamfam/comment_delete.gif b/fannie/legacy/members/images/famfamfam/comment_delete.gif new file mode 100644 index 000000000..691b546b3 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/comment_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/comment_new.gif b/fannie/legacy/members/images/famfamfam/comment_new.gif new file mode 100644 index 000000000..aa7e9d3ff Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/comment_new.gif differ diff --git a/fannie/legacy/members/images/famfamfam/comment_yellow.gif b/fannie/legacy/members/images/famfamfam/comment_yellow.gif new file mode 100644 index 000000000..df7158a47 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/comment_yellow.gif differ diff --git a/fannie/legacy/members/images/famfamfam/copy.gif b/fannie/legacy/members/images/famfamfam/copy.gif new file mode 100644 index 000000000..ff81b3bf2 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/copy.gif differ diff --git a/fannie/legacy/members/images/famfamfam/cut.gif b/fannie/legacy/members/images/famfamfam/cut.gif new file mode 100644 index 000000000..ffd7f4f7d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/cut.gif differ diff --git a/fannie/legacy/members/images/famfamfam/date.gif b/fannie/legacy/members/images/famfamfam/date.gif new file mode 100644 index 000000000..0cbdf001c Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/date.gif differ diff --git a/fannie/legacy/members/images/famfamfam/date_delete.gif b/fannie/legacy/members/images/famfamfam/date_delete.gif new file mode 100644 index 000000000..65f716b75 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/date_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/date_new.gif b/fannie/legacy/members/images/famfamfam/date_new.gif new file mode 100644 index 000000000..e224d7803 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/date_new.gif differ diff --git a/fannie/legacy/members/images/famfamfam/famfamfam_mini_icons.zip b/fannie/legacy/members/images/famfamfam/famfamfam_mini_icons.zip new file mode 100644 index 000000000..5d0f88fcc Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/famfamfam_mini_icons.zip differ diff --git a/fannie/legacy/members/images/famfamfam/file_acrobat.gif b/fannie/legacy/members/images/famfamfam/file_acrobat.gif new file mode 100644 index 000000000..7bc7de95d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/file_acrobat.gif differ diff --git a/fannie/legacy/members/images/famfamfam/file_font.gif b/fannie/legacy/members/images/famfamfam/file_font.gif new file mode 100644 index 000000000..52b5ef3e4 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/file_font.gif differ diff --git a/fannie/legacy/members/images/famfamfam/file_font_truetype.gif b/fannie/legacy/members/images/famfamfam/file_font_truetype.gif new file mode 100644 index 000000000..0569425f1 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/file_font_truetype.gif differ diff --git a/fannie/legacy/members/images/famfamfam/flag_blue.gif b/fannie/legacy/members/images/famfamfam/flag_blue.gif new file mode 100644 index 000000000..a0924052f Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/flag_blue.gif differ diff --git a/fannie/legacy/members/images/famfamfam/flag_green.gif b/fannie/legacy/members/images/famfamfam/flag_green.gif new file mode 100644 index 000000000..76b89250d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/flag_green.gif differ diff --git a/fannie/legacy/members/images/famfamfam/flag_orange.gif b/fannie/legacy/members/images/famfamfam/flag_orange.gif new file mode 100644 index 000000000..0596070f2 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/flag_orange.gif differ diff --git a/fannie/legacy/members/images/famfamfam/flag_red.gif b/fannie/legacy/members/images/famfamfam/flag_red.gif new file mode 100644 index 000000000..16698e32e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/flag_red.gif differ diff --git a/fannie/legacy/members/images/famfamfam/flag_white.gif b/fannie/legacy/members/images/famfamfam/flag_white.gif new file mode 100644 index 000000000..b566c018c Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/flag_white.gif differ diff --git a/fannie/legacy/members/images/famfamfam/folder.gif b/fannie/legacy/members/images/famfamfam/folder.gif new file mode 100644 index 000000000..8dc04c495 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/folder.gif differ diff --git a/fannie/legacy/members/images/famfamfam/folder_delete.gif b/fannie/legacy/members/images/famfamfam/folder_delete.gif new file mode 100644 index 000000000..ce9f44835 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/folder_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/folder_images.gif b/fannie/legacy/members/images/famfamfam/folder_images.gif new file mode 100644 index 000000000..81a7c3b41 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/folder_images.gif differ diff --git a/fannie/legacy/members/images/famfamfam/folder_lock.gif b/fannie/legacy/members/images/famfamfam/folder_lock.gif new file mode 100644 index 000000000..b1bfa0205 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/folder_lock.gif differ diff --git a/fannie/legacy/members/images/famfamfam/folder_new.gif b/fannie/legacy/members/images/famfamfam/folder_new.gif new file mode 100644 index 000000000..5f30cfa2e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/folder_new.gif differ diff --git a/fannie/legacy/members/images/famfamfam/folder_page.gif b/fannie/legacy/members/images/famfamfam/folder_page.gif new file mode 100644 index 000000000..a8c53e2f7 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/folder_page.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_accept.gif b/fannie/legacy/members/images/famfamfam/icon_accept.gif new file mode 100644 index 000000000..35e949963 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_accept.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_airmail.gif b/fannie/legacy/members/images/famfamfam/icon_airmail.gif new file mode 100644 index 000000000..2be845745 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_airmail.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_alert.gif b/fannie/legacy/members/images/famfamfam/icon_alert.gif new file mode 100644 index 000000000..429a5d9be Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_alert.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_attachment.gif b/fannie/legacy/members/images/famfamfam/icon_attachment.gif new file mode 100644 index 000000000..4400e61e9 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_attachment.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_clock.gif b/fannie/legacy/members/images/famfamfam/icon_clock.gif new file mode 100644 index 000000000..6ac6ebca2 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_clock.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_component.gif b/fannie/legacy/members/images/famfamfam/icon_component.gif new file mode 100644 index 000000000..bde079f97 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_component.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_download.gif b/fannie/legacy/members/images/famfamfam/icon_download.gif new file mode 100644 index 000000000..d052d0920 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_download.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_email.gif b/fannie/legacy/members/images/famfamfam/icon_email.gif new file mode 100644 index 000000000..62bc6ffd4 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_email.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_extension.gif b/fannie/legacy/members/images/famfamfam/icon_extension.gif new file mode 100644 index 000000000..50c2d4622 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_extension.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_favourites.gif b/fannie/legacy/members/images/famfamfam/icon_favourites.gif new file mode 100644 index 000000000..785b93875 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_favourites.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_get_world.gif b/fannie/legacy/members/images/famfamfam/icon_get_world.gif new file mode 100644 index 000000000..f99a5383b Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_get_world.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_history.gif b/fannie/legacy/members/images/famfamfam/icon_history.gif new file mode 100644 index 000000000..4473b1bc7 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_history.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_home.gif b/fannie/legacy/members/images/famfamfam/icon_home.gif new file mode 100644 index 000000000..327e76f92 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_home.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_info.gif b/fannie/legacy/members/images/famfamfam/icon_info.gif new file mode 100644 index 000000000..9dfa0e196 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_info.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_key.gif b/fannie/legacy/members/images/famfamfam/icon_key.gif new file mode 100644 index 000000000..e3853e5af Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_key.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_link.gif b/fannie/legacy/members/images/famfamfam/icon_link.gif new file mode 100644 index 000000000..c64c23c1f Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_link.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_mail.gif b/fannie/legacy/members/images/famfamfam/icon_mail.gif new file mode 100644 index 000000000..5b5c7a75b Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_mail.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_monitor_mac.gif b/fannie/legacy/members/images/famfamfam/icon_monitor_mac.gif new file mode 100644 index 000000000..b70028777 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_monitor_mac.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_monitor_pc.gif b/fannie/legacy/members/images/famfamfam/icon_monitor_pc.gif new file mode 100644 index 000000000..d9a947268 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_monitor_pc.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_network.gif b/fannie/legacy/members/images/famfamfam/icon_network.gif new file mode 100644 index 000000000..c607888a0 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_network.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_package.gif b/fannie/legacy/members/images/famfamfam/icon_package.gif new file mode 100644 index 000000000..e01b1ffbd Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_package.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_package_get.gif b/fannie/legacy/members/images/famfamfam/icon_package_get.gif new file mode 100644 index 000000000..19712a9c2 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_package_get.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_package_open.gif b/fannie/legacy/members/images/famfamfam/icon_package_open.gif new file mode 100644 index 000000000..e630faf91 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_package_open.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_padlock.gif b/fannie/legacy/members/images/famfamfam/icon_padlock.gif new file mode 100644 index 000000000..f70cc953a Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_padlock.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_security.gif b/fannie/legacy/members/images/famfamfam/icon_security.gif new file mode 100644 index 000000000..929284daa Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_security.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_settings.gif b/fannie/legacy/members/images/famfamfam/icon_settings.gif new file mode 100644 index 000000000..14339f700 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_settings.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_user.gif b/fannie/legacy/members/images/famfamfam/icon_user.gif new file mode 100644 index 000000000..dcb5c2a89 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_user.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_wand.gif b/fannie/legacy/members/images/famfamfam/icon_wand.gif new file mode 100644 index 000000000..d4eb47e76 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_wand.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_world.gif b/fannie/legacy/members/images/famfamfam/icon_world.gif new file mode 100644 index 000000000..355c1a950 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_world.gif differ diff --git a/fannie/legacy/members/images/famfamfam/icon_world_dynamic.gif b/fannie/legacy/members/images/famfamfam/icon_world_dynamic.gif new file mode 100644 index 000000000..e5ed08ce6 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/icon_world_dynamic.gif differ diff --git a/fannie/legacy/members/images/famfamfam/image.gif b/fannie/legacy/members/images/famfamfam/image.gif new file mode 100644 index 000000000..d5924f4bb Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/image.gif differ diff --git a/fannie/legacy/members/images/famfamfam/image_new.gif b/fannie/legacy/members/images/famfamfam/image_new.gif new file mode 100644 index 000000000..4f4d12e5d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/image_new.gif differ diff --git a/fannie/legacy/members/images/famfamfam/interface_browser.gif b/fannie/legacy/members/images/famfamfam/interface_browser.gif new file mode 100644 index 000000000..602ef5042 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/interface_browser.gif differ diff --git a/fannie/legacy/members/images/famfamfam/interface_dialog.gif b/fannie/legacy/members/images/famfamfam/interface_dialog.gif new file mode 100644 index 000000000..31e1b071d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/interface_dialog.gif differ diff --git a/fannie/legacy/members/images/famfamfam/interface_installer.gif b/fannie/legacy/members/images/famfamfam/interface_installer.gif new file mode 100644 index 000000000..4b11af38e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/interface_installer.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_comments.gif b/fannie/legacy/members/images/famfamfam/list_comments.gif new file mode 100644 index 000000000..b313894a1 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_comments.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_components.gif b/fannie/legacy/members/images/famfamfam/list_components.gif new file mode 100644 index 000000000..d38de9d29 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_components.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_errors.gif b/fannie/legacy/members/images/famfamfam/list_errors.gif new file mode 100644 index 000000000..2e68d107c Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_errors.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_extensions.gif b/fannie/legacy/members/images/famfamfam/list_extensions.gif new file mode 100644 index 000000000..a5e542a0c Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_extensions.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_images.gif b/fannie/legacy/members/images/famfamfam/list_images.gif new file mode 100644 index 000000000..f744f19a3 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_images.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_keys.gif b/fannie/legacy/members/images/famfamfam/list_keys.gif new file mode 100644 index 000000000..6d3990a01 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_keys.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_links.gif b/fannie/legacy/members/images/famfamfam/list_links.gif new file mode 100644 index 000000000..4beb04496 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_links.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_packages.gif b/fannie/legacy/members/images/famfamfam/list_packages.gif new file mode 100644 index 000000000..c6cadf3bb Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_packages.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_security.gif b/fannie/legacy/members/images/famfamfam/list_security.gif new file mode 100644 index 000000000..3e32002f1 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_security.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_settings.gif b/fannie/legacy/members/images/famfamfam/list_settings.gif new file mode 100644 index 000000000..084509565 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_settings.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_users.gif b/fannie/legacy/members/images/famfamfam/list_users.gif new file mode 100644 index 000000000..394aba63f Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_users.gif differ diff --git a/fannie/legacy/members/images/famfamfam/list_world.gif b/fannie/legacy/members/images/famfamfam/list_world.gif new file mode 100644 index 000000000..a56265e03 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/list_world.gif differ diff --git a/fannie/legacy/members/images/famfamfam/note.gif b/fannie/legacy/members/images/famfamfam/note.gif new file mode 100644 index 000000000..17b9f4185 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/note.gif differ diff --git a/fannie/legacy/members/images/famfamfam/note_delete.gif b/fannie/legacy/members/images/famfamfam/note_delete.gif new file mode 100644 index 000000000..13402a582 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/note_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/note_new.gif b/fannie/legacy/members/images/famfamfam/note_new.gif new file mode 100644 index 000000000..431ff64d1 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/note_new.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page.gif b/fannie/legacy/members/images/famfamfam/page.gif new file mode 100644 index 000000000..c5743c066 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_alert.gif b/fannie/legacy/members/images/famfamfam/page_alert.gif new file mode 100644 index 000000000..4719a1f92 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_alert.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_attachment.gif b/fannie/legacy/members/images/famfamfam/page_attachment.gif new file mode 100644 index 000000000..a8e1b45ce Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_attachment.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_bookmark.gif b/fannie/legacy/members/images/famfamfam/page_bookmark.gif new file mode 100644 index 000000000..1b2a923a5 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_bookmark.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_boy.gif b/fannie/legacy/members/images/famfamfam/page_boy.gif new file mode 100644 index 000000000..4ae3ff0a7 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_boy.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_code.gif b/fannie/legacy/members/images/famfamfam/page_code.gif new file mode 100644 index 000000000..912517b83 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_code.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_colors.gif b/fannie/legacy/members/images/famfamfam/page_colors.gif new file mode 100644 index 000000000..0141d3842 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_colors.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_component.gif b/fannie/legacy/members/images/famfamfam/page_component.gif new file mode 100644 index 000000000..f9aee3f3c Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_component.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_cross.gif b/fannie/legacy/members/images/famfamfam/page_cross.gif new file mode 100644 index 000000000..bf43a0a0b Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_cross.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_delete.gif b/fannie/legacy/members/images/famfamfam/page_delete.gif new file mode 100644 index 000000000..0c6be0348 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_deny.gif b/fannie/legacy/members/images/famfamfam/page_deny.gif new file mode 100644 index 000000000..2bf5013ab Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_deny.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_down.gif b/fannie/legacy/members/images/famfamfam/page_down.gif new file mode 100644 index 000000000..390ba6974 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_down.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_dynamic.gif b/fannie/legacy/members/images/famfamfam/page_dynamic.gif new file mode 100644 index 000000000..11c59e68e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_dynamic.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_edit.gif b/fannie/legacy/members/images/famfamfam/page_edit.gif new file mode 100644 index 000000000..7b02b6e72 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_edit.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_extension.gif b/fannie/legacy/members/images/famfamfam/page_extension.gif new file mode 100644 index 000000000..7bbe56a7b Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_extension.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_favourites.gif b/fannie/legacy/members/images/famfamfam/page_favourites.gif new file mode 100644 index 000000000..eab0d9d1a Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_favourites.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_find.gif b/fannie/legacy/members/images/famfamfam/page_find.gif new file mode 100644 index 000000000..9ae5e3489 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_find.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_flash.gif b/fannie/legacy/members/images/famfamfam/page_flash.gif new file mode 100644 index 000000000..6e17277b1 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_flash.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_girl.gif b/fannie/legacy/members/images/famfamfam/page_girl.gif new file mode 100644 index 000000000..9f48a2239 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_girl.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_html.gif b/fannie/legacy/members/images/famfamfam/page_html.gif new file mode 100644 index 000000000..34e79d162 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_html.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_java.gif b/fannie/legacy/members/images/famfamfam/page_java.gif new file mode 100644 index 000000000..6592a87a0 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_java.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_key.gif b/fannie/legacy/members/images/famfamfam/page_key.gif new file mode 100644 index 000000000..ebf83ca7d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_key.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_left.gif b/fannie/legacy/members/images/famfamfam/page_left.gif new file mode 100644 index 000000000..f222b4693 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_left.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_link.gif b/fannie/legacy/members/images/famfamfam/page_link.gif new file mode 100644 index 000000000..ff0b39d0f Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_link.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_lock.gif b/fannie/legacy/members/images/famfamfam/page_lock.gif new file mode 100644 index 000000000..07a275685 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_lock.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_new.gif b/fannie/legacy/members/images/famfamfam/page_new.gif new file mode 100644 index 000000000..0888abf85 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_new.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_next.gif b/fannie/legacy/members/images/famfamfam/page_next.gif new file mode 100644 index 000000000..60769b66d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_next.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_package.gif b/fannie/legacy/members/images/famfamfam/page_package.gif new file mode 100644 index 000000000..d94a07586 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_package.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_php.gif b/fannie/legacy/members/images/famfamfam/page_php.gif new file mode 100644 index 000000000..d99790321 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_php.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_prev.gif b/fannie/legacy/members/images/famfamfam/page_prev.gif new file mode 100644 index 000000000..f0bb78da6 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_prev.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_refresh.gif b/fannie/legacy/members/images/famfamfam/page_refresh.gif new file mode 100644 index 000000000..dc238461e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_refresh.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_right.gif b/fannie/legacy/members/images/famfamfam/page_right.gif new file mode 100644 index 000000000..aedf4ba62 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_right.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_script.gif b/fannie/legacy/members/images/famfamfam/page_script.gif new file mode 100644 index 000000000..44717b306 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_script.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_security.gif b/fannie/legacy/members/images/famfamfam/page_security.gif new file mode 100644 index 000000000..5050dc4b5 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_security.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_settings.gif b/fannie/legacy/members/images/famfamfam/page_settings.gif new file mode 100644 index 000000000..af4099724 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_settings.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_sound.gif b/fannie/legacy/members/images/famfamfam/page_sound.gif new file mode 100644 index 000000000..1526ad11c Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_sound.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_tag_blue.gif b/fannie/legacy/members/images/famfamfam/page_tag_blue.gif new file mode 100644 index 000000000..5ceb96ced Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_tag_blue.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_tag_red.gif b/fannie/legacy/members/images/famfamfam/page_tag_red.gif new file mode 100644 index 000000000..4aa2416b6 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_tag_red.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_text.gif b/fannie/legacy/members/images/famfamfam/page_text.gif new file mode 100644 index 000000000..c1132e472 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_text.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_text_delete.gif b/fannie/legacy/members/images/famfamfam/page_text_delete.gif new file mode 100644 index 000000000..f3178ab40 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_text_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_tick.gif b/fannie/legacy/members/images/famfamfam/page_tick.gif new file mode 100644 index 000000000..d7edd0c0d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_tick.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_tree.gif b/fannie/legacy/members/images/famfamfam/page_tree.gif new file mode 100644 index 000000000..847274e6d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_tree.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_up.gif b/fannie/legacy/members/images/famfamfam/page_up.gif new file mode 100644 index 000000000..08ef934c7 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_up.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_url.gif b/fannie/legacy/members/images/famfamfam/page_url.gif new file mode 100644 index 000000000..1b27952c2 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_url.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_user.gif b/fannie/legacy/members/images/famfamfam/page_user.gif new file mode 100644 index 000000000..ad39fb794 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_user.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_user_dark.gif b/fannie/legacy/members/images/famfamfam/page_user_dark.gif new file mode 100644 index 000000000..6ee2c1c81 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_user_dark.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_user_light.gif b/fannie/legacy/members/images/famfamfam/page_user_light.gif new file mode 100644 index 000000000..2b7a924b7 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_user_light.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_video.gif b/fannie/legacy/members/images/famfamfam/page_video.gif new file mode 100644 index 000000000..a1c50325d Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_video.gif differ diff --git a/fannie/legacy/members/images/famfamfam/page_wizard.gif b/fannie/legacy/members/images/famfamfam/page_wizard.gif new file mode 100644 index 000000000..fd816ea7e Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/page_wizard.gif differ diff --git a/fannie/legacy/members/images/famfamfam/readme.txt b/fannie/legacy/members/images/famfamfam/readme.txt new file mode 100644 index 000000000..0b0307974 --- /dev/null +++ b/fannie/legacy/members/images/famfamfam/readme.txt @@ -0,0 +1,2 @@ +mini icons - famfamfam.com +Contact: mjames@gmail.com \ No newline at end of file diff --git a/fannie/legacy/members/images/famfamfam/table.gif b/fannie/legacy/members/images/famfamfam/table.gif new file mode 100644 index 000000000..e5daec441 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/table.gif differ diff --git a/fannie/legacy/members/images/famfamfam/table_delete.gif b/fannie/legacy/members/images/famfamfam/table_delete.gif new file mode 100644 index 000000000..99190cd53 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/table_delete.gif differ diff --git a/fannie/legacy/members/images/famfamfam/tables.gif b/fannie/legacy/members/images/famfamfam/tables.gif new file mode 100644 index 000000000..87246be87 Binary files /dev/null and b/fannie/legacy/members/images/famfamfam/tables.gif differ diff --git a/fannie/legacy/members/images/general.gif b/fannie/legacy/members/images/general.gif new file mode 100644 index 000000000..40d15593d Binary files /dev/null and b/fannie/legacy/members/images/general.gif differ diff --git a/fannie/legacy/members/images/itemsDown.gif b/fannie/legacy/members/images/itemsDown.gif new file mode 100644 index 000000000..02e9cdabe Binary files /dev/null and b/fannie/legacy/members/images/itemsDown.gif differ diff --git a/fannie/legacy/members/images/itemsOver.gif b/fannie/legacy/members/images/itemsOver.gif new file mode 100644 index 000000000..842cff536 Binary files /dev/null and b/fannie/legacy/members/images/itemsOver.gif differ diff --git a/fannie/legacy/members/images/itemsUp.gif b/fannie/legacy/members/images/itemsUp.gif new file mode 100644 index 000000000..102d332bc Binary files /dev/null and b/fannie/legacy/members/images/itemsUp.gif differ diff --git a/fannie/legacy/members/images/locked.gif b/fannie/legacy/members/images/locked.gif new file mode 100644 index 000000000..d1986703b Binary files /dev/null and b/fannie/legacy/members/images/locked.gif differ diff --git a/fannie/legacy/members/images/logoGrnBckSm.gif b/fannie/legacy/members/images/logoGrnBckSm.gif new file mode 100644 index 000000000..f1f762322 Binary files /dev/null and b/fannie/legacy/members/images/logoGrnBckSm.gif differ diff --git a/fannie/legacy/members/images/memDown.gif b/fannie/legacy/members/images/memDown.gif new file mode 100644 index 000000000..0c2d0bcb5 Binary files /dev/null and b/fannie/legacy/members/images/memDown.gif differ diff --git a/fannie/legacy/members/images/memOver.gif b/fannie/legacy/members/images/memOver.gif new file mode 100644 index 000000000..9cd0d89bb Binary files /dev/null and b/fannie/legacy/members/images/memOver.gif differ diff --git a/fannie/legacy/members/images/memUp.gif b/fannie/legacy/members/images/memUp.gif new file mode 100644 index 000000000..c2d3194f1 Binary files /dev/null and b/fannie/legacy/members/images/memUp.gif differ diff --git a/fannie/legacy/members/images/newLogo_small.gif b/fannie/legacy/members/images/newLogo_small.gif new file mode 100644 index 000000000..375a4dd88 Binary files /dev/null and b/fannie/legacy/members/images/newLogo_small.gif differ diff --git a/fannie/legacy/members/images/newLogo_small.jpg b/fannie/legacy/members/images/newLogo_small.jpg new file mode 100644 index 000000000..595db0d94 Binary files /dev/null and b/fannie/legacy/members/images/newLogo_small.jpg differ diff --git a/fannie/legacy/members/images/newLogo_small1.gif b/fannie/legacy/members/images/newLogo_small1.gif new file mode 100644 index 000000000..ec4ba2cbb Binary files /dev/null and b/fannie/legacy/members/images/newLogo_small1.gif differ diff --git a/fannie/legacy/members/images/new_up.gif b/fannie/legacy/members/images/new_up.gif new file mode 100644 index 000000000..b4bc48015 Binary files /dev/null and b/fannie/legacy/members/images/new_up.gif differ diff --git a/fannie/legacy/members/images/patronage.gif b/fannie/legacy/members/images/patronage.gif new file mode 100644 index 000000000..490999587 Binary files /dev/null and b/fannie/legacy/members/images/patronage.gif differ diff --git a/fannie/legacy/members/images/persons.gif b/fannie/legacy/members/images/persons.gif new file mode 100644 index 000000000..f699d1c54 Binary files /dev/null and b/fannie/legacy/members/images/persons.gif differ diff --git a/fannie/legacy/members/images/prodList1.png b/fannie/legacy/members/images/prodList1.png new file mode 100644 index 000000000..c82b0dc29 Binary files /dev/null and b/fannie/legacy/members/images/prodList1.png differ diff --git a/fannie/legacy/members/images/prodList2.png b/fannie/legacy/members/images/prodList2.png new file mode 100644 index 000000000..fd5f19097 Binary files /dev/null and b/fannie/legacy/members/images/prodList2.png differ diff --git a/fannie/legacy/members/images/prodList3.png b/fannie/legacy/members/images/prodList3.png new file mode 100644 index 000000000..34982cdcb Binary files /dev/null and b/fannie/legacy/members/images/prodList3.png differ diff --git a/fannie/legacy/members/images/prodList4.png b/fannie/legacy/members/images/prodList4.png new file mode 100644 index 000000000..0a5dfef52 Binary files /dev/null and b/fannie/legacy/members/images/prodList4.png differ diff --git a/fannie/legacy/members/images/prodList5.png b/fannie/legacy/members/images/prodList5.png new file mode 100644 index 000000000..7659bf963 Binary files /dev/null and b/fannie/legacy/members/images/prodList5.png differ diff --git a/fannie/legacy/members/images/refDown.gif b/fannie/legacy/members/images/refDown.gif new file mode 100644 index 000000000..a67cd7610 Binary files /dev/null and b/fannie/legacy/members/images/refDown.gif differ diff --git a/fannie/legacy/members/images/refOver.gif b/fannie/legacy/members/images/refOver.gif new file mode 100644 index 000000000..d5b414953 Binary files /dev/null and b/fannie/legacy/members/images/refOver.gif differ diff --git a/fannie/legacy/members/images/refUp.gif b/fannie/legacy/members/images/refUp.gif new file mode 100644 index 000000000..7f5d1f31c Binary files /dev/null and b/fannie/legacy/members/images/refUp.gif differ diff --git a/fannie/legacy/members/images/repDown.gif b/fannie/legacy/members/images/repDown.gif new file mode 100644 index 000000000..53e46a3db Binary files /dev/null and b/fannie/legacy/members/images/repDown.gif differ diff --git a/fannie/legacy/members/images/repOver.gif b/fannie/legacy/members/images/repOver.gif new file mode 100644 index 000000000..d4028947a Binary files /dev/null and b/fannie/legacy/members/images/repOver.gif differ diff --git a/fannie/legacy/members/images/repUp.gif b/fannie/legacy/members/images/repUp.gif new file mode 100644 index 000000000..08caf3767 Binary files /dev/null and b/fannie/legacy/members/images/repUp.gif differ diff --git a/fannie/legacy/members/images/tab.png b/fannie/legacy/members/images/tab.png new file mode 100644 index 000000000..672716f87 Binary files /dev/null and b/fannie/legacy/members/images/tab.png differ diff --git a/fannie/legacy/members/images/test.png b/fannie/legacy/members/images/test.png new file mode 100644 index 000000000..1c2dd8f11 Binary files /dev/null and b/fannie/legacy/members/images/test.png differ diff --git a/fannie/legacy/members/inactiveNetEquity.php b/fannie/legacy/members/inactiveNetEquity.php new file mode 100644 index 000000000..c9a4888bc --- /dev/null +++ b/fannie/legacy/members/inactiveNetEquity.php @@ -0,0 +1,39 @@ +query($query); + +if (isset($_GET['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="InactiveNetEquity.xls"'); +} +else + echo "Save to Excel

        "; + +echo ""; +echo ""; +echo ""; +echo ""; +$colors = array("#ffffcc","#ffffff"); +$c = 0; +while($row = $sql->fetch_row($result)){ + echo ""; + for($i=0;$i<6;$i++) + echo ""; + echo ""; + $c = ($c+1)%2; +} +echo "
        Account#NameStart dateAR BalanceStock BalanceNet Equity
        $row[$i]
        "; + +?> diff --git a/fannie/legacy/members/index.php b/fannie/legacy/members/index.php new file mode 100644 index 000000000..081ca744e --- /dev/null +++ b/fannie/legacy/members/index.php @@ -0,0 +1,34 @@ + + +Welcome to the Back End! + + + + + + + + + + + +
        To begin, select one of the two options below...
        +
        +
        +

        +Login to create owner numbers"; +} +else { + echo "Create Owner Numbers"; +} +echo "
        Print Owner Stickers"; +?> +
        + + + diff --git a/fannie/legacy/members/insertEdit.php b/fannie/legacy/members/insertEdit.php new file mode 100755 index 000000000..365a808bf --- /dev/null +++ b/fannie/legacy/members/insertEdit.php @@ -0,0 +1,191 @@ +now().",$uid,1, + CardNo,personNum,LastName,FirstName, + CashBack,Balance,Discount,MemDiscountLimit,ChargeOK, + WriteChecks,StoreCoupons,Type,memType,staff,SSI,Purchases, + NumberOfChecks,memCoupons,blueLine,Shown,id from custdata where cardno=$memID"; +//$auditR = $sql->query($auditQ); + +?> + + + + + + + + + + + + + + + + +

        + + + + + + + + + + + + + +
        ItemsReference
        + +CardNo($memNum); +$cust->personNum(1); +$cust->load(); // get all current values +$cust->MemDiscountLimit($_POST['chargeLimit']); +$cust->memType($_POST['discList']); +$cust->Type('REG'); +$cust->Staff(0); +$cust->Discount(0); + +MemberCardsModel::update($memNum,$_REQUEST['cardUPC']); + +$sql->query_all("UPDATE memContact SET pref=".$MI_FIELDS['ads_OK']." WHERE card_no=$memNum"); + +if ($cust->memType() == 1 || $cust->memType() == 3){ + $cust->Type('PC'); +} +if ($cust->memType() == 3 || $cust->memType() == 9){ + $cust->Discount(12); + $cust->Staff(1); +} + +$cust->FirstName($_POST['fName']); +$cust->LastName($_POST['lName']); +$cust->BlueLine( $cust->CardNo().' '.$cust->LastName() ); +$cust->save(); // save personNum=1 + +$lnames = $_REQUEST['hhLname']; +$fnames = $_REQUEST['hhFname']; +$count = 2; +for($i=0;$ipersonNum($count); + $cust->FirstName($fnames[$i]); + $cust->LastName($lnames[$i]); + $cust->BlueLine( $cust->CardNo().' '.$cust->LastName() ); + $cust->save(); // save next personNum + + $count++; +} +// remove names that were blank on the form +for($i=$count;$i<5;$i++){ + $cust->personNum($i); + $cust->delete(); +} + +MeminfoModel::update($memNum, $MI_FIELDS); +MemDatesModel::update($memNum, $_POST['startDate'], $_POST['endDate']); + +// FIRE ALL UPDATE +include('custUpdates.php'); +updateCustomerAllLanes($memNum); + +/* general note handling */ +$notetext = $_POST['notetext']; +$notetext = preg_replace("/\n/","
        ",$notetext); +$notetext = preg_replace("/\'/","''",$notetext); +$checkQ = "select * from memberNotes where note='$notetext' and cardno=$memNum"; +$checkR = $sql->query($checkQ); +if ($sql->num_rows($checkR) == 0){ + $noteQ = "insert into memberNotes values ($memNum,'$notetext',".$sql->now().",'$username')"; + $noteR = $sql->query($noteQ); +} + +addressList($memNum); + +?> + + + +Login to edit | "; +} +else { + echo ""; +} +?> + + + + + +
        [ Logged in ] Edit Info | + + +  + + +Prev Mem + + +Next Mem + +
        + + diff --git a/fannie/legacy/members/limitedEdit.php b/fannie/legacy/members/limitedEdit.php new file mode 100644 index 000000000..b02782e4c --- /dev/null +++ b/fannie/legacy/members/limitedEdit.php @@ -0,0 +1,76 @@ +You must be Logged in to edit"; +} +else { + +//echo $memnum; +//$lName = $_POST['lastName']; +//$fName = $_POST['firstName'];/* +//$username = $_COOKIE['ow-loginname']; + +?> + + + + + + + + + + + + + + + + + +

        ItemsReference
        + + + + + + diff --git a/fannie/legacy/members/limitedSave.php b/fannie/legacy/members/limitedSave.php new file mode 100755 index 000000000..ff01af4d1 --- /dev/null +++ b/fannie/legacy/members/limitedSave.php @@ -0,0 +1,195 @@ +query($auditQ); + +?> + + + + + + + + + + + + + + + + +

        + + + + + + + + + + + + + +
        ItemsReference
        + +escape($fname); +$lName = str_replace("'","",$_POST['lName']); +$lName = $sql->escape($lName); +$blueline = $memNum . " " . $_POST['lName']; +$bladd = ""; +if ($_POST['status'] == "ACTIVE"){ + $bladd = " Coup(".$_POST['memcoupons'].")"; +} +$blueline .= $bladd; +$blueline = $dbc->escape($blueline); +$MI_FIELDS['street'] = $_POST['address1'] . (!empty($_POST['address2']) ? "\n".$_POST['address2'] : ''); +$MI_FIELDS['city'] = $_POST['city']; +$MI_FIELDS['state'] = $_POST['state']; +$MI_FIELDS['zip'] = $_POST['zip']; +$MI_FIELDS['phone'] = $_POST['phone']; +$MI_FIELDS['email_2'] = $_POST['phone2']; +$MI_FIELDS['email_1'] = $_POST['email']; +$MI_FIELDS['ads_OK'] = $_POST['mailflag']; +$fnames = $_POST["hfname"]; +$lnames = $_POST["hlname"]; +for($i=0;$iescape($fnames[$i]); +} +for($i=0;$iescape($lnames[$i]); +} + +add_second_server(); +$sql->query_all(sprintf("DELETE FROM memberCards WHERE card_no=%d",$memNum)); +if (isset($_REQUEST['cardUPC']) && is_numeric($_REQUEST['cardUPC'])){ + $sql->query_all(sprintf("INSERT INTO memberCards VALUES (%d,'%s')", + $memNum,str_pad($_REQUEST['cardUPC'],13,'0',STR_PAD_LEFT))); +} + +// update top name +$custdataQ = "Update custdata set lastname = $lName, firstname = $fname, blueline=$blueline where cardNo = $memNum and personnum = 1"; +$custdataR = $sql->query_all($custdataQ); + +for($i=0;$i<3;$i++){ + if ($fnames[$i]=="''") $fnames[$i] = ""; + if ($lnames[$i]=="''") $lnames[$i] = ""; +} +for($i=0; $i<3; $i++){ + $sql->query_all("DELETE FROM custdata WHERE cardno=$memNum and personnum=".($i+2)); + //$sql->query("DELETE FROM memnames WHERE memNum=$memNum and personnum=".($i+2)); + if (is_array($fnames) && isset($fnames[$i]) && + is_array($lnames) && isset($lnames[$i]) && + !empty($lnames[$i]) && !empty($fnames[$i])){ + $custQ = sprintf("INSERT INTO custdata (CardNo,personNum,LastName,FirstName,CashBack,Balance, + Discount,MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type, + memType,staff,SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown) + SELECT cardno,%d,%s,%s,CashBack,Balance, + Discount,MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type, + memType,staff,SSI,Purchases,NumberOfChecks,memCoupons,'%s',1 FROM + custdata WHERE CardNo=%d AND personNum=1",($i+2),$lnames[$i],$fnames[$i], + ($memNum.' '.trim($lnames[$i],"'").$bladd),$memNum); + $memQ = sprintf("INSERT INTO memNames SELECT %s,%s,memNum,%d,checks,charge, + active,'%s' FROM memNames where memNum=%d and personnum=1", + $lnames[$i],$fnames[$i], + ($i+2),($memNum.'.'.($i+2).'.1'),$memNum); + $sql->query_all($custQ); + //$sql->query($memQ); + } +} + +MeminfoModel::update($memNum, $MI_FIELDS); + +/* general note handling */ +$notetext = $_POST['notetext']; +$notetext = preg_replace("/\n/","
        ",$notetext); +$notetext = preg_replace("/\'/","''",$notetext); +$checkQ = "select * from memberNotes where note='$notetext' and cardno=$memNum"; +$checkR = $sql->query($checkQ); +if ($sql->num_rows($checkR) == 0){ + $noteQ = "insert into memberNotes values ($memNum,'$notetext',".$sql->now().",'$username')"; + $noteR = $sql->query($noteQ); +} + +// FIRE ALL UPDATE +include('custUpdates.php'); +updateCustomerAllLanes($memNum); + +addressList($memNum); + +?> + + + +Login to edit | "; +} +else { + echo ""; +} +?> + + + +
        [ Logged in ] Edit Info | Log out + + +  +
        + + diff --git a/fannie/legacy/members/limits.php b/fannie/legacy/members/limits.php new file mode 100644 index 000000000..7319f76ff --- /dev/null +++ b/fannie/legacy/members/limits.php @@ -0,0 +1,57 @@ +query($memTypesQ); + +$selected = 0; +if (isset($_GET['type'])) + $selected = $_GET['type']; + +if (!isset($_GET['excel'])){ + echo "
        "; + echo ""; + echo " Excel "; + echo " "; + echo "
        "; +} +else { + header("Content-Disposition: inline; filename=memLimits.xls"); + header("Content-Description: PHP3 Generated Data"); + header("Content-type: application/vnd.ms-excel; name='excel'"); +} + +if (isset($_GET['type'])){ + $type = $_GET['type']; + + $memQ = "select c.cardno,c.memDiscountLimit from custdata as c + left outer join suspensions as s on c.cardno = s.cardno + where c.memType=$type and c.personnum=1 and + c.lastname not like 'NEW %' and s.cardno is NULL + order by c.cardno"; + $memR = $sql->query($memQ); + + echo ""; + echo ""; + while ($memW = $sql->fetch_array($memR)){ + echo ""; + if (!isset($_GET['excel'])) + echo ""; + else + echo ""; + echo ""; + echo ""; + } + echo "
        Member #Charge limit
        $memW[0]$memW[0]$memW[1]
        "; +} + +?> diff --git a/fannie/legacy/members/lookupReceipt.php b/fannie/legacy/members/lookupReceipt.php new file mode 100644 index 000000000..ddd6347c8 --- /dev/null +++ b/fannie/legacy/members/lookupReceipt.php @@ -0,0 +1,3 @@ + diff --git a/fannie/legacy/members/mailList.php b/fannie/legacy/members/mailList.php new file mode 100644 index 000000000..0c7cfe6b7 --- /dev/null +++ b/fannie/legacy/members/mailList.php @@ -0,0 +1,58 @@ +"; +echo "Mailing List"; +echo ""; +echo ""; +if (!class_exists("SQLManager")) include($_SERVER["DOCUMENT_ROOT"]."/sql/SQLManager.php"); +include('../db.php'); + +$query = "SELECT CardNo, + LastName, + FirstName, + street, + city, + state, + zip, + phone, + memType, + end_date + FROM custdata AS c + LEFT JOIN meminfo AS m + ON c.cardno=m.card_no + LEFT JOIN memDates AS d + ON c.cardno=d.card_no + WHERE + memType in (1,3) + AND c.Type='PC' + AND (end_date > now() or end_date = '') + AND ads_OK = 1 + AND PersonNum = 1 + order by m.card_no"; + +$result = $sql->query($query,$db); + +echo ''; +while($row = $sql->fetch_row($result)){ + echo ''; +} + +?> + + + diff --git a/fannie/legacy/members/mainMenu.php b/fannie/legacy/members/mainMenu.php new file mode 100644 index 000000000..bf33f6181 --- /dev/null +++ b/fannie/legacy/members/mainMenu.php @@ -0,0 +1,74 @@ + + +
        '. $row[0].''.$row[1]; + if (strstr($row[2],"\n") === False) + echo ''.$row[2].' '; + else { + $pts = explode("\n",$row[2]); + echo ''.$pts[0].''.$pts[1]; + } + echo ''.$row[3].''.$row[4]; + echo ''.$row[5].''.$row[6]; + echo ''.$row[7].''.$row[8]; + echo '
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        PI Killer
        + + + + +
        + + + + +Items + +Reference 
            
         Owner + # or UPC: + + + + Last Name + + ?> + + + + First + Name: + + + +
        + +

         

        + + diff --git a/fannie/legacy/members/memARTrans.php b/fannie/legacy/members/memARTrans.php new file mode 100644 index 000000000..4c1894818 --- /dev/null +++ b/fannie/legacy/members/memARTrans.php @@ -0,0 +1,60 @@ +query("USE $FANNIE_TRANS_DB"); + +$mem = $_GET['memID']; +$col='#FFFF99'; +/* +$query="SELECT datepart(mm,dateTimeStamp),datepart(dd,dateTimeStamp),datepart(yy,dateTimeStamp), + tendertotal,memberID,trans_num, + (CASE WHEN ARPayment <> '0' + THEN 'P' + ELSE '' END) as payment, + (CASE WHEN chargeTotal <> 0 + THEN 'C' + ELSE '' END) as charge, + datepart(mi,dateTimeStamp) + FROM rp_dt_header + where memberID=$mem + AND (ARPayment<> 0 or chargetotal <> 0) + order by dateTimeStamp DESC"; +*/ + +$query="SELECT month(tdate) as tm,day(tdate) as td,year(tdate) as ty, + CASE WHEN charges <> 0 THEN charges ELSE Payments END as tendertotal, + card_no,trans_num, + (CASE WHEN payments <> 0 + THEN 'P' + ELSE '' END) as payment, + (CASE WHEN charges <> 0 + THEN 'C' + ELSE '' END) as charge + from ar_history_today + WHERE card_no = $mem + + union all + + SELECT month(tdate) as tm,day(tdate) as td,year(tdate) as ty, + CASE WHEN charges <> 0 THEN charges ELSE Payments END as tendertotal, + card_no,trans_num, + (CASE WHEN payments <> 0 + THEN 'P' + ELSE '' END) as payment, + (CASE WHEN charges <> 0 + THEN 'C' + ELSE '' END) as charge + from ar_history + WHERE card_no = $mem + + order by ty desc, tm desc, td desc"; + + +trans_to_table($query,1,$col); + + +?> diff --git a/fannie/legacy/members/memAddress.php b/fannie/legacy/members/memAddress.php new file mode 100755 index 000000000..f43645cf3 --- /dev/null +++ b/fannie/legacy/members/memAddress.php @@ -0,0 +1,699 @@ +query($custQ); + $custN = $sql->num_rows($custR); + $custW = $sql->fetch_row($custR); + $status = $custW[11]; + + if($status == 'PC') $status='ACTIVE'; + elseif($status == 'REG') $status='NONMEM'; + elseif($status == 'INACT2') $status='TERM (PENDING)'; + + $infoQ = "SELECT * FROM meminfo WHERE card_no=$memNum"; + $infoR = $sql->query($infoQ); + $infoW = $sql->fetch_row($infoR); + $getsMail = $infoW['ads_OK']; + + $cardsQ = "SELECT upc FROM memberCards WHERE card_no=$memNum"; + $cardsR = $sql->query($cardsQ); + $cardUPC = ""; + if ($sql->num_rows($cardsR) > 0){ + $cardUPC = array_pop($sql->fetch_row($cardsR)); + } + + $type = trim($custW[12]," "); + //echo "
        Here is type: " .$type; + $query1 = "SELECT t.* FROM memTypeID as t WHERE t.memTypeID = $type"; + //echo "
        ".$query1; + $result1 = $sql->query($query1); + $row1 = $sql->fetch_row($result1); + + $dateQ = "SELECT CASE WHEN start_date IS NULL or start_date='' OR start_date='1900-01-01' OR start_date=0 + THEN '' ELSE DATE(start_date) END, + CASE WHEN end_date IS NULL OR end_date = '' OR end_date='1900-01-01' OR end_date=0 + THEN '' ELSE + DATE(end_date) END from memDates + WHERE card_no=$memNum"; + $dateR = $sql->query($dateQ); + $dateW = $sql->fetch_row($dateR); + + //updated to new stock view based on stockpurchases table....CvR 02/27/06 + $query2 = "SELECT payments FROM is4c_trans.newBalanceStockToday_test WHERE memnum = $memNum"; + $stockResult = $sql->query($query2); + $row2 = $sql->fetch_row($stockResult); + + //$query3 = "SELECT * FROM newBalanceToday WHERE memnum = $memNum"; + $query3 = "SELECT * FROM is4c_trans.ar_live_balance WHERE card_no= $memNum"; + $arResult = $sql->query($query3); + $row3 = $sql->fetch_row($arResult); + + $query4 = "select LastName,FirstName from custdata where CardNo=$memNum and PersonNum > 1 order by PersonNum"; + $nameResult = $sql->query($query4); + $nameRows = $sql->num_rows($nameResult); + + + $suspensionQ = "select type,reason,textStr,s.reasoncode&16 from suspensions s + left join reasoncodes r on s.reasoncode & r.mask <> 0 + where cardno=$memNum"; + $suspensionR = $sql->query($suspensionQ); + $suspensionW = $sql->fetch_array($suspensionR); + $suspended = $sql->num_rows($suspensionR); + + echo ""; + echo ""; + echo ""; + echo ""; + if($suspended != 0){ + $code = $suspensionW[3]; + echo ""; + if ($suspended != 0){ + echo ""; + elseif(validateUserQuiet('editmembers_csc') && $code == 16) + echo "   Address corrected"; + } + else { + echo ""; + echo ""; + else + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $address = array(); + if (strstr($infoW['street'],"\n") === False) + $address[0] = $infoW['street']; + else + $address = explode("\n",$infoW['street']); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $noteQ = "select note from memberNotes where cardno=$memNum order by stamp desc limit 1"; + $noteR = $sql->query($noteQ); + $notetext = ""; + if ($sql->num_rows($noteR) == 1) + $notetext = stripslashes(array_pop($sql->fetch_array($noteR))); + echo ""; + echo ""; + for($i=0;$i<$nameRows;$i++){ + echo ""; + $rowNames = $sql->fetch_row($nameResult); + $num = $i+1; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        Owner Num" . $memNum . "$status"; + if ($suspensionW['reason'] != '') echo $suspensionW['reason']; + else { + $reasons = $suspensionW['textStr']; + while($suspensionW=$sql->fetch_array($suspensionR)) + $reasons .= ", ".$suspensionW['textStr']; + echo $reasons; + } + echo "   History"; + } + if (validateUserQuiet('editmembers')) + echo "   Change status$status $suspendedHistory"; + if (validateUserQuiet('editmembers')) + echo "   Change StatusSpecial Orders
        First Name: " . $custW['FirstName'] . "Last Name: " . $custW['LastName'] . "
        Address1: " . $address[0] . "Gets mailings:"; + if ($getsMail == 0){ + echo "No"; + } + else{ + echo "Yes"; + } + echo "
        Address2: " . (isset($address[1])?$address[1]:' ') . "UPC: "; + echo $cardUPC; + echo "
        City: " . $infoW['city'] . "State: " . $infoW['state'] . "Zip: " . $infoW['zip'] . "
        Phone Number: " . $infoW['phone'] . "Start Date: " . $dateW[0] . "End Date: " . $dateW[1] . "
        Alt. Phone: " . $infoW['email_2'] . "E-mail: " . $infoW['email_1'] . "
        Stock Purchased: " ; + echo $row2['payments']; + echo "Mem Type: " . $row1[1] . "Discount:".$custW[6]."
        Charge Limit: " . $custW['MemDiscountLimit'] . "Current Balance: " . $row3['balance'] . "
        Additional household membersAdditional NotesNotes history
        First NameLast Name$notetext
        ".$num.".".$rowNames[1]."".$rowNames[0]."
        "; +} + +function addressForm($memNum) +{ + global $sql; + $typeQ = "select * from custdata where CardNo = $memNum and personNum = 1"; + $typeR = $sql->query($typeQ); + $typeRow = $sql->fetch_array($typeR); + $type = trim($typeRow['memType']," "); + $status = trim($typeRow['Type']," "); + $memcoupons = $typeRow['memCoupons']; + if ($status != "PC") $memcoupons = 0; + if($status == 'PC') $status = 'ACTIVE'; + elseif($status == 'REG') $status='NONMEM'; + elseif($status == 'INACT2') $status='TERM (PENDING)'; + + $infoQ = "SELECT * FROM meminfo WHERE card_no=$memNum"; + $infoR = $sql->query($infoQ); + $infoW = $sql->fetch_row($infoR); + $getsMail = $infoW['ads_OK']; + + $cardsQ = "SELECT upc FROM memberCards WHERE card_no=$memNum"; + $cardsR = $sql->query($cardsQ); + $cardUPC = ""; + if ($sql->num_rows($cardsR) > 0){ + $cardUPC = array_pop($sql->fetch_row($cardsR)); + } + + $query1 = "SELECT t.* FROM memTypeID as t WHERE t.memTypeID = $type"; + $result1 = $sql->query($query1); + $row1 = $sql->fetch_row($result1); + $memIDQ = "SELECT * FROM memTypeID"; + + $query2 = "SELECT payments FROM is4c_trans.newBalanceStockToday_test WHERE memnum = $memNum"; + $stockResult = $sql->query($query2); + $row2 = $sql->fetch_row($stockResult); + + $query3 = "SELECT * FROM is4c_trans.ar_live_balance WHERE card_no = $memNum"; + $arResult = $sql->query($query3); + $row3 = $sql->fetch_row($arResult); + + //$query4 = "SELECT * FROM memnames WHERE memnum = $memNum AND personnum > 1 AND active = 1"; + $query4 = "SELECT LastName,FirstName FROM custdata where CardNo = $memNum AND PersonNum > 1 order by PersonNum"; + $nameResult = $sql->query($query4); + $nameRows = $sql->num_rows($nameResult); + + $dateQ = "SELECT CASE WHEN start_date IS NULL or start_date='' or start_date='1900-01-01' + THEN '' ELSE DATE(start_date) END, + CASE WHEN end_date IS NULL OR end_date = '' or end_date='1900-01-01' + THEN '' ELSE + DATE(end_date) END from memDates + WHERE card_no=$memNum"; + $dateR = $sql->query($dateQ); + $dateW = $sql->fetch_row($dateR); + + $suspensionQ = "select type,reason from suspensions where cardno=$memNum"; + $suspensionR = $sql->query($suspensionQ); + $suspensionW = $sql->fetch_array($suspensionR); + $suspended = $sql->num_rows($suspensionR); + + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + if($suspended != 0){ + if ($suspensionW[0] == 'I') + echo ""; + else if ($suspensionW[0] == 'T') + echo ""; + else + echo ""; + if ($suspended != 0){ + echo ""; + } + }else{ + echo ""; + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $address = array(); + if (strstr($infoW['street'],"\n") === False) + $address[0] = $infoW['street']; + else + $address = explode("\n",$infoW['street']); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + if ($typeRow['Discount'] <> 10 && ($type == 9 || $type == 3)) + echo ""; + else if ($typeRow['Discount'] <> 0 && ($type == 0 || $type == 1 || $type == 6 || $type == 8)) + echo ""; + else + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $noteQ = "select note from memberNotes where cardno=$memNum order by stamp desc limit 1"; + $noteR = $sql->query($noteQ); + $notetext = ""; + if ($sql->num_rows($noteR) == 1){ + $notetext = stripslashes(array_pop($sql->fetch_array($noteR))); + $notetext = preg_replace("/
        /","\n",$notetext); + } + echo ""; + echo ""; + for($i=0;$i<3;$i++){ + echo ""; + $rowNames = $sql->fetch_row($nameResult); + $num = $i+1; + + if(empty($rowNames[1])){ + $rowFName = ''; + }else{ + $rowFName=$rowNames[1]; + } + if(empty($rowNames[0])){ + $rowLName=''; + }else{ + $rowLName=$rowNames[0]; + } + + echo ""; + echo ""; + echo ""; + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        Owner Num" . $memNum . "$status$status$status{$suspensionW['reason']} History$statusHistory
        First Name: Last Name:
        Address1: Gets mail:
        Address2: UPC:
        City: State: Zip:
        Phone Number:Start Date: End Date:
        Alt. Phone:E-mail:
        Stock Purchased: " . $row2['payments'] . "Discount: " ; + //echo $type; + echo ""; + ?> Discount override Discount override Discount override
        Charge Limit: Current Balance: " . $row3['balance'] . "
        Additional household membersAdditional NotesNotes history
        First NameLast Name
        ".$num.".
        "; + echo "
        "; + echo ""; + echo ""; + echo "
        "; +} + +function alterReason($memNum,$reasonCode,$status=False){ + global $sql; + + $username = checkLogin(); + $uid = getUID($username); + + $upQ = "UPDATE suspensions SET reasoncode=$reasonCode WHERE cardno=$memNum"; + $upR = $sql->query($upQ); + if ($reasonCode == 0){ + activate($memNum); + } + else { + $now = date("Y-m-d h:i:s"); + $insQ = "INSERT INTO suspension_history VALUES ('$username','$now','','$memNum',$reasonCode)"; + $insR = $sql->query_all($insQ); + if ($status){ + $sql->query_all("UPDATE custdata SET type='$status' WHERE cardno=$memNum"); + if ($status == "TERM") + $sql->query_all("UPDATE suspensions SET type='T' WHERE cardno=$memNum"); + else + $sql->query_all("UPDATE suspensions SET type='I' WHERE cardno=$memNum"); + } + } +} + +function deactivate($memNum,$type,$reason,$reasonCode){ + global $sql; + + $username = checkLogin(); + $uid = getUID($username); + $auditQ = "insert custUpdate select now(),$uid,1,* from custdata where cardno=$memNum"; + //$auditR = $sql->query($auditQ); + + if ($type == 'TERM'){ + $query = "select memtype,type,memDiscountLimit,discount from custdata where cardno=$memNum"; + $result = $sql->query($query); + $row = $sql->fetch_array($result); + $otherQ = "select ads_OK from meminfo where card_no=$memNum"; + $otherR = $sql->query($otherQ); + $mailflag = array_pop($sql->fetch_array($otherR)); + + $now = date('Y-m-d h:i:s'); + $query = "insert into suspensions values ($memNum,'T',$row[0],'$row[1]','$reason','$now',$mailflag,$row[3],$row[2],$reasonCode)"; + //echo $query."
        "; + $result = $sql->query_all($query); + + $username = validateUserQuiet('editmembers'); + + $query = "insert into suspension_history values ('$username','$now','$reason','$memNum',$reasonCode)"; + $result = $sql->query_all($query); + + $mQ = "update meminfo set ads_OK=0 where card_no = $memNum"; + $cQ = "update custdata set memtype=0, type='TERM',chargeok=0,discount=0,memdiscountlimit=0 where cardno=$memNum"; + $mR = $sql->query_all($mQ); + $cR = $sql->query_all($cQ); + }elseif($type=='INACT' || $type=='INACT2'){ + $query = "select memtype,type,memDiscountLimit,discount from custdata where cardno=$memNum"; + $result = $sql->query($query); + $row = $sql->fetch_array($result); + $otherQ = "select ads_OK from meminfo where card_no=$memNum"; + $otherR = $sql->query($otherQ); + $mailflag = array_pop($sql->fetch_array($otherR)); + + $now = date('Y-m-d h:i:s'); + $query = "insert into suspensions values ($memNum,'I',$row[0],'$row[1]','$reason','$now',$mailflag,$row[3],$row[2],$reasonCode)"; + //echo $query."
        "; + $result = $sql->query_all($query); + + $username = validateUserQuiet('editmembers'); + + $query = "insert into suspension_history values ('$username','$now','$reason','$memNum',$reasonCode)"; + $result = $sql->query_all($query); + + $mQ = "update meminfo set ads_OK=0 where card_no = $memNum"; + $cQ = "update custdata set memtype=0, type='$type',chargeok=0,discount=0,memDiscountLimit=0 where cardno=$memNum"; + $mR = $sql->query_all($mQ); + $cR = $sql->query_all($cQ); + } +} + +function activate($memNum){ + global $sql; + + $username = checkLogin(); + $uid = getUID($username); + $auditQ = "insert custUpdate select now(),$uid,1,* from custdata where cardno=$memNum"; + //$auditR = $sql->query($auditQ); + + $query = "select type,memtype1,memtype2,discount,chargelimit,mailflag from suspensions where cardno=$memNum"; + $result = $sql->query($query); + $row = $sql->fetch_array($result); + // type S shouldn't exist any more, in here to deal with historical rows + if ($row[0] == 'I' || $row[0] == 'T' || $row[0] == 'S'){ + $mQ = "update meminfo set ads_OK=$row[5] where card_no=$memNum"; + $cQ = "update custdata set memtype=$row[1], type='$row[2]',chargeok=1,discount=$row[3],memDiscountLimit=$row[4] where cardno=$memNum"; + $mR = $sql->query_all($mQ); + $cR = $sql->query_all($cQ); + } + else if ($row[0] == 'X'){ + $cQ = "update custdata set discount=$row[3], type='$row[2]', chargeOk = 1, + memtype = $row[1], memdiscountlimit = $row[4], memcoupons = 1 + where cardno=$memNum"; + $cR = $sql->query_all($cQ); + $mQ = "update meminfo set ads_OK=$row[5] where card_no=$memNum"; + $mR = $sql->query_all($mQ); + } + $query = "delete from suspensions where cardno=$memNum"; + $result = $sql->query_all($query); + + $username = validateUserQuiet('editmembers'); + + $now = date("Y-m-d h:i:s"); + $query = "insert into suspension_history values ('$username','$now','Account reactivated','$memNum',-1)"; + $result = $sql->query_all($query); +} + +function addressFormLimited($memNum) +{ + global $sql; + $typeQ = "select * from custdata where CardNo = $memNum and personNum = 1"; + $typeR = $sql->query($typeQ); + $typeRow = $sql->fetch_array($typeR); + $type = trim($typeRow['memType']," "); + $status = trim($typeRow['Type']," "); + $memcoupons = $typeRow['memCoupons']; + if ($status != "PC") $memcoupons = 0; + if($status == 'PC') $status = 'ACTIVE'; + if($status == 'REG') $status = 'NONMEM'; + //echo "
        Here is type: " .$type; + $query1 = "SELECT t.* FROM memTypeID as t WHERE t.memTypeID = $type"; + //echo "
        ".$query1; + $result1 = $sql->query($query1); + $row1 = $sql->fetch_row($result1); + $memIDQ = "SELECT * FROM memTypeID"; + + $infoQ = "SELECT * FROM meminfo WHERE card_no=$memNum"; + $infoR = $sql->query($infoQ); + $infoW = $sql->fetch_row($infoR); + $getsMail = $infoW['ads_OK']; + + $cardsQ = "SELECT upc FROM memberCards WHERE card_no=$memNum"; + $cardsR = $sql->query($cardsQ); + $cardUPC = ""; + if ($sql->num_rows($cardsR) > 0){ + $cardUPC = array_pop($sql->fetch_row($cardsR)); + } + + $suspensionQ = "select type,reason from suspensions where cardno=$memNum"; + $suspensionR = $sql->query($suspensionQ); + $suspensionW = $sql->fetch_array($suspensionR); + $suspended = $sql->num_rows($suspensionR); + + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + if($suspended != 0){ + if ($suspensionW[0] == 'I') + echo ""; + else if ($suspended != 0 and $suspensionW[0] == 'T') + echo ""; + else + echo ""; + if ($suspended != 0){ + echo ""; + } + }else{ + echo ""; + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $address = array(); + if (strstr($infoW['street'],"\n") === False) + $address[0] = $infoW['street']; + else + $address = explode("\n",$infoW['street']); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ''; + echo ""; + echo ""; + echo ""; + $noteQ = "select note from memberNotes where cardno=$memNum order by stamp desc limit 1"; + $noteR = $sql->query($noteQ); + $notetext = ""; + if ($sql->num_rows($noteR) == 1){ + $notetext = stripslashes(array_pop($sql->fetch_array($noteR))); + $notetext = preg_replace("/
        /","\n",$notetext); + } + echo ""; + echo ""; + $nameQ = "SELECT firstName,LastName FROM custdata WHERE cardno=$memNum and personnum > 1 order by personnum"; + $nameR = $sql->query($nameQ); + $num = 1; + while($nameW = $sql->fetch_row($nameR)){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $num++; + } + while($num <= 3){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + $num++; + } + echo "
        Owner Num" . $memNum . "$status$status$status{$suspensionW['reason']} History$statusHistory
        First Name: Last Name:
        Address1: Gets mail:
        Address2: UPC:
        City: State: Zip:
        Phone Number:
        Alt. Phone:E-mail:
        "; + echo "
        First NameLast Name
        ".$num.".
        ".$num.".
        "; + echo ""; + echo ""; + echo ""; + echo "
        "; +} + +?> diff --git a/fannie/legacy/members/memControl.php b/fannie/legacy/members/memControl.php new file mode 100644 index 000000000..b7f26045a --- /dev/null +++ b/fannie/legacy/members/memControl.php @@ -0,0 +1,3 @@ + diff --git a/fannie/legacy/members/memDBHistory.php b/fannie/legacy/members/memDBHistory.php new file mode 100644 index 000000000..7b206bd19 --- /dev/null +++ b/fannie/legacy/members/memDBHistory.php @@ -0,0 +1,170 @@ +"; + echo "Enter member number:
        "; + echo ""; + echo ""; +} +else if (isset($_GET['edit'])){ + $memID = $_GET['memID']; + + $fetchQ = "select * from custdata where cardno=$memID order by personnum"; + $fetchR = $sql->query($fetchQ); + + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + $personnum=0; + while ($fetchW = $sql->fetch_array($fetchR)){ + $cardno = $fetchW[0]; + $personnum = $fetchW[1]; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        CardPersonLastnameFirstnameCashbackBalanceDiscountLimitChargeChecksStoreCPtypeMemTypeStaffSSIPurchasesNumChecksMemCPBluelineShown
        $cardno$personnum$fetchW[5] $fetchW[15] $fetchW[17] $fetchW[18] 
        "; + echo ""; + echo ""; + echo ""; + echo "
        "; +} +else { + $memID = $_GET['memID']; + if (!$username){ + header("Location: /auth/ui/loginform.php?redirect=/members/memDBHistory.php?memID=$memID"); + return; + } + + if (isset($_GET['stamp'])){ + $stamp = $_GET['stamp']; + $revertQ = "update custdata set + lastname=b.lastname, + firstname=b.firstname, + cashback=b.cashback, + discount=b.discount, + memdiscountlimit=b.memdiscountlimit, + chargeok=b.chargeok, + writechecks=b.writechecks, + storecoupons=b.storecoupons, + type=b.type, + memtype=b.memtype, + staff=b.staff, + ssi=b.ssi, + numberofchecks=b.numberofchecks, + shown=b.shown + from custdata as c, custUpdate as b + where c.cardno=b.cardno and c.cardno=$memID + and c.personnum=b.personnum and + datediff(mi,'$stamp',tdate) = 0"; + echo $revertQ."
        "; + + $uid=getUID($username); + $auditQ = "insert custUpdate select now(),$uid,1,* from custdata where cardno=$memID"; + + $sql->query($auditQ); + $sql->query($revertQ); + + } + else if (isset($_GET['doneEditing'])){ + foreach(array_keys($_GET) as $key){ + $_GET[$key] = rtrim($_GET[$key]); + if ($_GET[$key] == "") + $_GET[$key] = "NULL"; + } + $upQs = array($_GET["maxpersonnum"]); + for ($i = 1; $i <= $_GET['maxpersonnum']; $i++){ + $upQ = "update custdata set + lastname='".$_GET["lastname$i"]."', + firstname='".$_GET["firstname$i"]."', + cashback=".$_GET["cashback$i"].", + discount=".$_GET["discount$i"].", + memdiscountlimit=".$_GET["limit$i"].", + chargeok=".$_GET["charge$i"].", + writechecks=".$_GET["check$i"].", + storecoupons=".$_GET["storecp$i"].", + type='".$_GET["type$i"]."', + memtype=".$_GET["memtype$i"].", + staff=".$_GET["staff$i"].", + ssi=".$_GET["ssi$i"].", + numberofchecks=".$_GET["numchecks$i"].", + shown=".$_GET["shown$i"]." + where cardno=".$_GET["memID"]." + and personnum=$i"; + $upQs[$i-1] = $upQ; + } + + + $uid=getUID($username); + $auditQ = "insert custUpdate select now(),$uid,1,* from custdata where cardno=$memID"; + $sql->query($auditQ); + + foreach($upQs as $q) + $sql->query($q); + + } + + $fetchQ = "select now() as tdate,0,2 as optype,*,'current' from custdata where cardno=$memID + union + select c.*,u.name from custUpdate as c left join users as u on c.uid=u.uid where cardno=$memID order by tdate desc, personnum, optype desc"; + $fetchR = $sql->query($fetchQ); + + echo "
        Edit
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + $ops = array('Original','Edit','Current'); + $colors = array('#ffffcc','#ffffff'); + $c = 1; + while ($fetchW = $sql->fetch_array($fetchR)){ + if ($fetchW[4] == 1) + $c = ($c+1) % 2; + echo ""; + echo ""; + echo ""; + echo ""; + for ($i=3; $i<24; $i++) + echo ""; + if ($fetchW[4] == 1) + echo ""; + echo ""; + } + echo "
        DateUser IDStatusCardPersonLastnameFirstnameCashbackBalanceDiscountLimitChargeChecksStoreCPtypeMemTypeStaffSSIPurchasesNumChecksMemCPBluelineShown
        $fetchW[0]$fetchW[1]".$ops[$fetchW[2]]."".$fetchW[$i]." Revert
        "; +} + +?> diff --git a/fannie/legacy/members/memDocs.php b/fannie/legacy/members/memDocs.php new file mode 100644 index 000000000..dabcdc491 --- /dev/null +++ b/fannie/legacy/members/memDocs.php @@ -0,0 +1,12 @@ + + + diff --git a/fannie/legacy/members/memGen.php b/fannie/legacy/members/memGen.php new file mode 100755 index 000000000..823e99c79 --- /dev/null +++ b/fannie/legacy/members/memGen.php @@ -0,0 +1,304 @@ +num_rows($result) > 0){ + $row = $sql->fetch_array($result); + $memID = $row[0]; +} + +?> + + + + + + + + + + + +
        + + + + + + + + + + + +
        + + + Items + Reference +
        + + here to return."; +} +else{ + $numMemRows= $sql->num_rows($result); + //echo $numMemRows; + + $cliplName = substr($lName,0,6) . '%'; + //echo $cliplName; + $clipfName = substr($fName,0,1) . '%'; + //echo $clipfName; + + if($numMemRows < 1){ + echo "No member found
        "; + + } + elseif($numMemRows == 1){ + addressList($row[0]); + } + // show multiple results + else{ + echo "There is more than one result
        "; + //echo $numMemRows; + //$query_drop = "SELECT * FROM custdata where LastName like '$cliplName' AND FirstName LIKE '$clipfName' order by FirstName,CardNo"; + //echo $query_drop; + $value="CardNo"; + $label="FirstName"; + $mem="memName"; + echo "
        "; + echo ""; + echo ""; + echo "
        "; + query_to_drop($query_drop,$value,$label,$mem,$cliplName); + echo "
        "; + echo "
        "; + + } +} + +$memNext = $memID+1; +$memPrec = $memID-1; + +?> + + +Login to edit | "; +} +else { + if (validateUserQuiet('editmembers')) + echo ""; + else + echo ""; +} +?> + + + + +
        [ Logged in ] Edit Info | Logout[ Logged in ] Edit Info | Logout +  + + +Prev Mem + + +Next Mem + +
        + + + +query($query); + if ($sql->num_rows($result) > 0) + return $result; + + $query = "SELECT CardNo + FROM custdata + WHERE + LastName LIKE '%$lName%' + AND FirstName LIKE '%$fName%' + ORDER BY LastName,FirstName,CardNo"; + $qd = "SELECT * + FROM custdata + WHERE + LastName LIKE '%$lName%' + AND FirstName LIKE '%$fName%' + ORDER BY LastName,FirstName,CardNo"; + $result = $sql->query($query); + if ($sql->num_rows($result) > 0) + return $result; + + $cliplName = substr($lName,0,6) . '%'; + //echo $cliplName . "
        "; + $clipfName = substr($fName,0,6) . '%'; + //echo $clipfName . "
        "; + + $query = "SELECT CardNo + FROM custdata + WHERE + LastName LIKE '$cliplName' + AND FirstName LIKE '$clipfName' + ORDER BY LastName,FirstName,CardNo"; + $qd = "SELECT * + FROM custdata + WHERE + LastName LIKE '$cliplName' + AND FirstName LIKE '$clipfName' + ORDER BY LastName,FirstName,CardNo"; + $result = $sql->query($query); + if ($sql->num_rows($result) > 0) + return $result; + + $query = "SELECT CardNo + FROM custdata + WHERE + LastName LIKE '%$cliplName' + AND FirstName LIKE '%$clipfName' + ORDER BY LastName,FirstName,CardNo"; + $qd = "SELECT * + FROM custdata + WHERE + LastName LIKE '%$cliplName' + AND FirstName LIKE '%$clipfName' + ORDER BY LastName,FirstName,CardNo"; + $result = $sql->query($query); + return $result; + } + } + else{ + $query = sprintf("SELECT CardNo + FROM custdata + WHERE + CardNo = %d + AND PersonNum= 1",$memID); + + $result = $sql->query($query); + if ($sql->num_rows($result) == 0){ + // alternative: try number as ID card UPC + $query = sprintf("SELECT card_no AS CardNo FROM + memberCards WHERE upc=%s", + $sql->escape(str_pad($memID,13,'0',STR_PAD_LEFT)) + ); + $result = $sql->query($query); + if ($sql->num_rows($result)==0){ + // alt alt: try removing check digit + $query = sprintf("SELECT card_no AS CardNo FROM + memberCards WHERE upc=%s", + $sql->escape(str_pad( + substr($memID,0,strlen($memID)-1), + 13,'0',STR_PAD_LEFT)) + ); + $result = $sql->query($query); + + } + } + return $result; + } +} diff --git a/fannie/legacy/members/memTrans.php b/fannie/legacy/members/memTrans.php new file mode 100644 index 000000000..95ef04b53 --- /dev/null +++ b/fannie/legacy/members/memTrans.php @@ -0,0 +1,79 @@ +query($query); + +echo "
        "; +echo ""; +$ts = mktime(); +echo ""; + +$visits = 0; +$spending = 0.0; +echo ""; +while($row = $sql->fetch_row($result)){ + echo ""; + printf("",$row[0],$row[1],$row[2]); + printf("", + $row[3],$row[0],$row[1],$row[2],$row[3]); + printf("",$row[4]); + echo ""; + echo ""; + $spending += $row[4]; + $visits += 1; +} +echo "
        %d/%d/%d%s\$%.2f"; + if ($row[5] != 0) echo "P"; + if ($row[6] != 0) echo "C"; + if ($row[7] != 0) echo "S"; + if ($row[8] != 0) echo "MC"; + if ($row[9] != 0) echo "%"; + if ($row[10] != 0) echo "IC"; + echo " 
        "; +printf("Visits: %d
        Spending: \$%.2f +
        Avg: \$%.2f", + $visits,$spending, + ($visits > 0 ? $spending/$visits : 0)); + + + +?> diff --git a/fannie/legacy/members/memsCSV.php b/fannie/legacy/members/memsCSV.php new file mode 100644 index 000000000..9e3096146 --- /dev/null +++ b/fannie/legacy/members/memsCSV.php @@ -0,0 +1,35 @@ + 'TERM' and + c.personnum = 1 order by convert(int,c.cardno)"; +$result = $sql->query($query); + +header('Content-Type: application/ms-excel'); +header('Content-Disposition: attachment; filename="memberData.csv"'); + +echo "MemberID,Name,Address1,Address2,City,State,Zip,Phone,TermsCode,TaxSchedule,Type\r\n"; +while ($row = $sql->fetch_array($result)){ +echo $row['cardno'].","; +echo "\"".$row['firstname']." ".$row['lastname']."\","; +if (strstr($row['street'],"\n") === False) + echo "\"".$row['street']."\",\"\","; +else { + $pts = explode("\n",$row['street']); + echo "\"".$pts[0]."\",\"".$pts[1]."\","; +} +echo "\"".$row['city']."\","; +echo "\"".$row['state']."\","; +echo "\"".$row['zipcode']."\","; +echo "\"".$row['phone']."\","; +echo ","; +echo ","; +echo $row["memType"]."\r\n"; +} + +?> diff --git a/fannie/legacy/members/memsReport.php b/fannie/legacy/members/memsReport.php new file mode 100644 index 000000000..faf6ab04d --- /dev/null +++ b/fannie/legacy/members/memsReport.php @@ -0,0 +1,3 @@ + diff --git a/fannie/legacy/members/newmems.php b/fannie/legacy/members/newmems.php new file mode 100644 index 000000000..da451a4ea --- /dev/null +++ b/fannie/legacy/members/newmems.php @@ -0,0 +1,57 @@ + 0 + AND personnum = 1 + AND m.card_no between $start and $end"; + +$result = $sql->query($query); + + +echo ""; +while($row = $sql->fetch_array($result)){ + echo ''; +} + +echo "
        '.$row['card_no'].''.$row['lastname']. + ''.$row['firstname'].''; + if (strstr($row['street'],"\n")===False) + echo $row['street']." "; + else { + $pts = explode("\n",$row['street']); + echo $pts[0]."".$pts[1]; + } + echo ''.$row['city']. + ''.$row['state'].''.$row['zip']. + ''.$row['phone'].'
        "; +}else{ + +?> +Get new member info + + + + + + +
        + + + diff --git a/fannie/legacy/members/noteHistory.php b/fannie/legacy/members/noteHistory.php new file mode 100755 index 000000000..56294b114 --- /dev/null +++ b/fannie/legacy/members/noteHistory.php @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + +

        ItemsReference
        +

        +

        +query($q); +while($w = $sql->fetch_array($r)){ + $text = stripslashes($w[1]); + if (empty($text)) continue; + echo "$w[2] - note added by $w[0]
        "; + echo "$text

        "; +} + +?> +
        diff --git a/fannie/legacy/members/patronage.php b/fannie/legacy/members/patronage.php new file mode 100644 index 000000000..e01a84ef7 --- /dev/null +++ b/fannie/legacy/members/patronage.php @@ -0,0 +1,19 @@ +
        Historical Totals:"; +head_to_table($sumPatQ,1,'FFFFCC'); + +?> diff --git a/fannie/legacy/members/reprint.php b/fannie/legacy/members/reprint.php new file mode 100755 index 000000000..5ddd112ce --- /dev/null +++ b/fannie/legacy/members/reprint.php @@ -0,0 +1,83 @@ + + +
        +Date:
        +Receipt Num:
        + + diff --git a/fannie/legacy/members/staffAR.php b/fannie/legacy/members/staffAR.php new file mode 100755 index 000000000..4a5d808ce --- /dev/null +++ b/fannie/legacy/members/staffAR.php @@ -0,0 +1,116 @@ + + + Please log in + + + + +
        Click here to login

        "; +}else{ + + $sql->query("use is4c_trans"); + + if(isset($_POST['recalc'])){ + $truncQ = "TRUNCATE TABLE staffAR"; + $truncR = $sql->query($truncQ); + + $query = "SELECT + c.CardNo, + c.LastName, + c.FirstName, + n.balance as Ending_Balance + FROM is4c_op.custdata as c INNER JOIN staffID as a ON a.cardNo = c.CardNo + LEFT JOIN ar_live_balance AS n ON c.CardNo=n.card_no + WHERE (c.memType = 9 OR c.memType = 3) + and c.personNum = 1 + order by c.LastName"; + + $result=$sql->query($query); + + $insARQ = "INSERT INTO staffAR (cardNo, lastName, firstName, adjust) + SELECT + c.CardNo, + c.LastName, + c.FirstName, + n.balance as Ending_Balance + FROM is4c_op.custdata as c INNER JOIN staffID as a ON a.cardNo = c.CardNo + LEFT JOIN ar_live_balance AS n ON c.CardNo=n.card_no + WHERE (c.memType = 9 OR c.memType = 3) + and c.personNum = 1 + order by c.LastName"; + + $insARR = $sql->query($insARQ); + } + + +?> + + Staff AR Page + + + + + +$value){ + //echo $key . ": ".$value."
        "; + if($value !='Submit'){ + $updateQ = "UPDATE staffAR SET adjust=$value WHERE cardno=$key"; + //echo $updateQ ."
        "; + $updateR = $sql->query($updateQ); + } + } + } + + $query = "SELECT a.*,s.adpID FROM staffAR AS a LEFT JOIN + staffID AS s ON a.cardNo=s.cardno order by lastName"; + $result = $sql->query($query); + + echo ""; + echo ""; + echo ""; + echo ""; + $sum = 0; + $colors = array('#ffffff','#ffffaa'); + $c = 1; + while($row = $sql->fetch_array($result)){ + echo "" + ."" + ."" + ."" + ."" + .""; + $sum += $row['adjust']; + echo ""; + $c = ($c + 1) % 2; + } + echo ""; + echo ""; + echo ""; + + echo "
        Mem#ADP#LastnameFirstnameCurrent deductionChange deduction to
        ".$row['cardNo']."".$row['adpID']."".$row['lastName']."".$row['firstName']."".trim($row['adjust'])."
          Sum:$sum 
        "; + echo "

        "; + echo ""; + echo ""; +} +?> + diff --git a/fannie/legacy/members/staffARmanager.php b/fannie/legacy/members/staffARmanager.php new file mode 100755 index 000000000..f47de37cf --- /dev/null +++ b/fannie/legacy/members/staffARmanager.php @@ -0,0 +1,96 @@ +query("use is4c_trans"); + +/* delete is easy + * just delete from staffID and staffAR + */ +if (isset($_POST['remove'])){ + $cardno = $_POST['cardno']; + $delQ = "delete from staffID where cardno=$cardno"; + $delR = $sql->query($delQ); + $delQ = "delete from staffAR where cardNo=$cardno"; + $delQ = $sql->query($delQ); + echo "Member #$cardno removed from staff AR

        "; +} +/* add an employee to staffAR + * this requires an ADP ID, which I attempt to find using + * first and last names, otherwise the user is prompted to + * enter the ADP ID + * redeux: just lastname. employees on nexus tends to have full[er] names + * and middle initials + */ +if (isset($_POST['add'])){ + $cardno = $_POST['cardno']; + + $namesQ = "select FirstName,LastName from is4c_op.custdata where CardNo=$cardno and personNum=1"; + $namesR = $sql->query($namesQ); + $namesW = $sql->fetch_array($namesR); + $fname = $namesW[0]; + $lname = $namesW[1]; + + echo "Enter the employee's ADP ID#
        "; + echo "

        "; + echo " "; + echo ""; + echo ""; + echo "
        "; + return; // not done adding yet +} +/* adp id wasn't found, so a form of + * some kind was submitted to fill it in + */ + if (isset($_POST['adpID'])){ + $cardno = $_POST['cardno']; + $adpID = $_POST['adpID']; + // the user provided an adp id + if ($adpID != 'None of these'){ + $insQ = "insert into staffID values ($cardno,$adpID,1)"; + $insR = $sql->query($insQ); + balance($cardno); + echo "Member #$cardno added to staff AR"; + } + // the user didn't like the possible choices presented, give + // manual entry form + else { + echo "Enter the employee's ADP ID#
        "; + echo "
        "; + echo " "; + echo ""; + echo ""; + echo "
        "; + return; // not done adding yet + } +} + +// add the correct balance for the cardno to staffAR +function balance($cardno){ + global $sql; + $balanceQ = "INSERT INTO staffAR (cardNo, lastName, firstName, adjust) + SELECT + CardNo, + LastName, + FirstName, + Balance as Ending_Balance + from is4c_op.custdata where CardNo=$cardno and personNum=1"; + $balanceR = $sql->query($balanceQ); +} + +// main insert / delete form follows +?> +
        +Add employee:
        +Member number: + + +
        +
        +
        +Remove employee:
        +Member number: + + +
        diff --git a/fannie/legacy/members/staffCurrAR.php b/fannie/legacy/members/staffCurrAR.php new file mode 100644 index 000000000..42711a282 --- /dev/null +++ b/fannie/legacy/members/staffCurrAR.php @@ -0,0 +1,14 @@ + diff --git a/fannie/legacy/members/statements/makeStatement.php b/fannie/legacy/members/statements/makeStatement.php new file mode 100644 index 000000000..39b0bf68a --- /dev/null +++ b/fannie/legacy/members/statements/makeStatement.php @@ -0,0 +1,408 @@ + 9 and a.twoMonthBalance > 1 + and c.Balance <> 0 + and c.memType <> 2 + $cardsClause + and a.lastMonthPayments < a.twoMonthBalance + ORDER BY a.cardno"; +$selAddR = $sql->query($selAddQ); + + $selTransQ = "SELECT card_no, CASE WHEN trans_subtype='MI' THEN -total ELSE 0 END as charges, + CASE WHEN department=990 then total ELSE 0 END as payments, tdate, trans_num, + '','',register_no,emp_no,trans_no FROM {$TRANS}dlog_90_view as m WHERE 1=1 $cardsClause + AND (department=990 OR trans_subtype='MI') + ORDER BY card_no, tdate, trans_num"; +$selTransR = $sql->query($selTransQ); +$selTransN = $sql->num_rows($selTransR); + +$arRows = array(); +$trans_clause = ""; +while($w = $sql->fetch_row($selTransR)){ + if (!isset($arRows[$w['card_no']])) + $arRows[$w['card_no']] = array(); + $arRows[$w['card_no']][] = $w; + $date = explode(' ',$w['tdate']); + $rn = $w['register_no']; + $tn = $w['trans_no']; + $en = $w['emp_no']; + $trans_clause .= " (datediff('$date[0]',datetime)=0 AND register_no=$rn AND emp_no=$en AND trans_no=$tn) OR "; +} +$trans_clause = substr($trans_clause,0,strlen($trans_clause)-3); +$q = "SELECT card_no,description,department,emp_no,register_no,trans_no + FROM {$TRANS}transarchive + WHERE trans_type IN ('I','D') and emp_no <> 9999 + AND register_no <> 99 AND trans_status <> 'X' + AND upc <> 'DISCOUNT' + AND ($trans_clause)"; +$details = array(); +$r = $sql->query($q); +while($w = $sql->fetch_row($r)){ + $tn = $w['emp_no']."-".$w['register_no']."-".$w['trans_no']; + if (!isset($details[$w['card_no']])) + $details[$w['card_no']] = array(); + if (!isset($details[$w['card_no']][$tn])) + $details[$w['card_no']][$tn] = array(); + $details[$w['card_no']][$tn][] = $w['description']; +} + +$today= date("d-F-Y"); +$month = date("n"); +$year = date("Y"); + +if($month != 1){ + $prevMonth = $month- 1; +}else{ + $prevMonth = 12; + $year = $year - 1; +} +$prevYear = $year; + +$prevPrevMonth = $prevMonth - 1; +$prevPrevYear = $year; +if ($prevPrevMonth == 0){ + $prevPrevMonth = 12; + $prevPrevYear = $year - 1; +} + +$stateDate = date("d F, Y",mktime(0,0,0,$month,0,$year)); + +$pdf = new FPDF(); + +//Meat of the statement +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Arial','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$stateDate,0); + $pdf->Ln(8); + + + //Member address + $pdf->SetX(15); + $pdf->Cell(50,10,trim($selAddW[0]).' '.trim($selAddW[1]),0); + $pdf->Ln(5); + + if (strstr($selAddW[2],"\n") === False){ + $pdf->Cell(80,10,$selAddW[2],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[2]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[4] . ', ' . $selAddW[5] . ' ' . $selAddW[6],0); + $pdf->Ln(25); + + $txt = "If payment has been made or sent, please ignore this statement. If you have any questions about this statement or would like to make arrangements to pay your balance, please write or call the Finance Department at the above address or (218) 728-0884. See reverse side for WFC IOU Policies. "; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $startYear = date('Y'); + $lastMonth = date("n")-1; + $lastMonth = $lastMonth . '/01/'. $startYear; + $twoMonth = date("n")-2; + $twoMonth = $twoMonth . '/01/'.$startYear; + + $span = date("F Y",mktime(0,0,0,$prevMonth,1,$prevYear)); + $dateStart = date('F',strtotime($lastMonth)); + $pdf->Cell(0,8,"Balance summary $span",0,1,'C'); + $pdf->SetFillColor(200); + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(40,8,'Beginning Balance',0,0,'L',1); + $pdf->Cell(20,8,'Charges',0,0,'L',1); + $pdf->Cell(25,8,'Payments',0,0,'L',1); + $pdf->Cell(35,8,'Ending Balance',0,0,'L',1); + //$pdf->SetFillColor(255,0,0); + $pdf->SetFont('Arial','B','14'); + $pdf->Cell(35,8,'Amount Due',0,1,'L',1); + $pdf->SetFont('Arial','','12'); + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(40,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + $pdf->Cell(20,8,'$ ' . sprintf("%.2f",$selAddW[8]),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$selAddW[9]),0,0,'L'); + $pdf->Cell(35,8,'$ ' . sprintf("%.2f",$selAddW[10]),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$selAddW[10]),0,0,'L'); + $pdf->Ln(20); + + $date2Month = date('F',strtotime($twoMonth)); + $pdf->Cell(0,8,"Recent 90 Day History",0,1,'C'); + $pdf->SetFillColor(200); + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,'Date',0,0,'L',1); + $pdf->Cell(20,8,'Receipt',0,0,'L',1); + $pdf->Cell(25,8,'Charges',0,0,'L',1); + $pdf->Cell(25,8,'Payments',0,1,'L',1); + + //$selTransQ = "SELECT * FROM ar_history WHERE datediff(mm,now(),tdate) = -1 + // AND card_no = $selAddW[0]"; + /* + $selTransQ = "SELECT card_no, charges, payments, + convert(varchar(50),date,101), trans_num,description,dept_name + FROM AR_statementHistory WHERE card_no = $selAddW[0] + order by date,trans_num,description,dept_name"; + + $selTransR = $sql->query($selTransQ); + $selTransN = $sql->num_rows($selTransR); + */ + + /* + $prevD = ""; + $prevT = ""; + $prev = ""; + if($selTransN == 0){ + $date = ''; + $trans = ''; + $charges = '0.00'; + $payment = '0.00'; + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + $pdf->Cell(20,8,$trans,0,0,'L'); + $pdf->Cell(25,8,'$ ' . $charges,0,0,'L'); + $pdf->Cell(25,8,'$ ' . $payment,0,0,'L'); + $pdf->Ln(5); + } + */ + + $lineitem=""; + //while($selTransW = $sql->fetch_row($selTransR)){ + foreach($arRows[$selAddW[0]] as $arRow){ + + $date = $arRow['tdate']; + $trans = $arRow['trans_num']; + $charges = $arRow['charges']; + $payment = $arRow['payments']; + + $detail = $details[$selAddW[0]][$trans]; + + if (strstr($detail[0],"Gazette Ad")) + $gazette = True; + $lineitem = (count($detail)==1) ? $detail[0] : '(multiple items)'; + if ($lineitem == "ARPAYMEN") $lineitem = "Payment Received - Thank You"; + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + //$pdf->Cell(40,8,date('M-d-Y',$date),0,0,'L'); + $pdf->Cell(20,8,$trans,0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$charges),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$payment),0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + if (!empty($lineitem)){ + $pdf->SetFontSize(10); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + $pdf->SetFontSize(12); + } + /* + if($selTransN != 0){ + $date = $selTransW[3]; + $trans = $selTransW[4]; + $charges = $selTransW[1]; + $payment = $selTransW[2]; + + //list($year, $month, $day) = split("-", $date); + //$date = date('M-d-Y', mktime(0, 0, 0, $month, $day, $year)); + } + if ($date != $prevD || $trans != $prevT){ + if (!empty($lineitem)){ + $pdf->SetFontSize(10); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + $pdf->SetFontSize(12); + } + $lineitem = ""; + $prev = ""; + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + //$pdf->Cell(40,8,date('M-d-Y',$date),0,0,'L'); + $pdf->Cell(20,8,$trans,0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$charges),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$payment),0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + + } + if ($selTransW[5] != "" && $selTransW[5] != $prev){ + $lineitem = (empty($lineitem))?$selTransW[5]:'(Multiple items)'; + $prev = $selTransW[5]; + } + elseif ($selTransW[6] != "" && $selTransW[6] != $prev){ + $lineitem = (empty($lineitem))?$selTransW[6]:'(Multiple items)'; + $prev = $selTransW[6]; + } + $prevD = $date; + $prevT = $trans; + */ + } + /* + if (!empty($lineitem)){ + $pdf->SetFontSize(10); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + $pdf->SetFontSize(12); + } + */ + + addBackPage($pdf); +} + +/* +$pdf->AddPage(); + +while($selAdd1W = $sql->fetch_row($selAddR)){ + $cell = $selAdd1W[0] . ' ' . $selAdd1W[1] . ', ' . $selAdd1W[2]; + $pdf->Cell(0,5,$cell,0,1); +} +*/ +$pdf->Output('makeStatement.pdf','D'); + +function addBackPage($pdf){ + $pdf->AddPage(); + $pdf->SetFont('Arial','B',16); + $pdf->SetTextColor(105); + //$pdf->Cell(0,10,'',0,1,'C'); + $pdf->Cell(0,10,'IOU POLICY',0,1,'C'); + //$pdf->Ln(5); + $pdf->SetFont('Arial','',12); + $pdf->Cell(0,10,'OF WHOLE FOODS COMMUNITY CO-OP, INC.',0,1,'C'); + $pdf->SetFont('Arial','',10); + $txt = "WFC members may charge purchases to a maximum of $20.00 payable within two (2) weeks from the date incurred. IOU's must be signed by the maker. IOU's may not, under any circumstances, be paid with Food Stamps or EBT card. WFC asks that its members only use the charge system for emergencies." ; + + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "-Members with an IOU account credit balance will receive a + reminder of that balance on each purchase receipt. + -Members with an IOU debit balance will receive a reminder + of that balance on each purchase receipt. + + If WFC is not reimbursed by a member within sixty (60) days from the date of an overdue IOU for the amount of that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all indebtedness owed to WFC, will be converted to non-voting Class B stock. + + If WFC is not reimbursed by a member within sixty (60) days from the date of a bounced check for the amount of that check plus the amount of any administrative fee, that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all indebtedness owed to WFC, will converted to non-voting Class B stock. + + IOU credit balances over sixty (60) days will be credited to the Member's non-voting Class B stock and the IOU account will be adjusted to zero. Members may request the return of Class B stock in excess of the amount required by the By-Laws by submitting to the Board a Request to Terminate that excess stock. + + At the discretion of the General Manager, member business and non-profit agency accounts may have higher IOU limits and/or extended payment terms. + "; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(1); + + $txt="Special Orders"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,20,'',0,0); + + $txt = "Special orders not picked up or paid for within thirty (30) days of the time items are received at WFC will be put out for sale or disposed of at management discretion. Future special orders from members or from non-members who have not previously promptly paid for and/or picked up special orders, at management discretion, may require prepayment."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(2); + + $txt="Newsletter Ads"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,20,'',0,0); + + $txt = "Members may charge the cost of advertising their business in WFC's newsletter under the same IOU payment terms as noted above but on an IOU account separate from the member's IOU account for inventory purchases. + + Members will be mailed an invoice within ten (10) days of the date of publication for the amount of the advertising charge. Failure to pay the amount due is then subject to the provisions of this IOU policy. + "; + + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(0); + + $txt="NOTE"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,15,'',0,0); + + $txt = + "Memberships with IOUs and/or other credit problems in excess of sixty (60) days may be placed on inactive status by management pending Board action. Purchases by inactive members will not be recorded and will not count toward eligibility for a patronage rebate. Purchases by inactive members are not eligible for member discounts or member specials. + Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject to Board discretion with respect to access to member credit benefits. + "; + + $pdf->MultiCell(0,4,$txt); + + $pdf->SetFont('Arial','B',10); + $txt = " + Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject to Board discretion with respect to access to member credit benefits."; + $pdf->Cell(15,20,'',0,0); + $pdf->MultiCell(0,5,$txt); + + $pdf->Ln(5); + $pdf->SetTextColor(0); + $pdf->SetFont('Arial','',10); +} + +?> diff --git a/fannie/legacy/members/statements/makeStatementBusiness.php b/fannie/legacy/members/statements/makeStatementBusiness.php new file mode 100644 index 000000000..0acf5bca8 --- /dev/null +++ b/fannie/legacy/members/statements/makeStatementBusiness.php @@ -0,0 +1,338 @@ + 0 or a.lastMonthCharges <> 0 or a.lastMonthPayments <> 0) + ORDER BY a.cardno"; +$selAddR = $sql->query($selAddQ); + +$selTransQ = "SELECT card_no, charges, payments, + convert(varchar(50),date,101), trans_num,description,dept_name + FROM AR_statementHistory as m WHERE 1=1 $cardsClause + order by card_no,date desc,trans_num,description,dept_name"; +$selTransR = $sql->query($selTransQ); +$selTransN = $sql->num_rows($selTransR); + +$today= date("d-F-Y"); +$month = date("n"); +$year = date("Y"); + +if($month != 1){ + $prevMonth = $month- 1; +}else{ + $prevMonth = 12; + $year = $year - 1; +} +$prevYear = $year; + +$prevPrevMonth = $prevMonth - 1; +$prevPrevYear = $year; +if ($prevPrevMonth == 0){ + $prevPrevMonth = 12; + $prevPrevYear = $year - 1; +} + +$stateDate = date("d F, Y",mktime(0,0,0,$month,0,$year)); + +$pdf = new FPDF(); + +//Meat of the statement +$rowNum=0; +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Arial','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,10,$stateDate,0); + $pdf->Ln(8); + + + //Member address + $pdf->SetX(15); + $pdf->Cell(50,10,trim($selAddW[0]).' '.trim($selAddW[1]),0); + $pdf->Ln(5); + + if (strstr($selAddW[2],"\n") === False){ + $pdf->Cell(80,10,$selAddW[2],0); + $pdf->Ln(5); + } + else { + $pts = explode("\n",$selAddW[2]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[4] . ', ' . $selAddW[5] . ' ' . $selAddW[6],0); + $pdf->Ln(25); + + $txt = "If payment has been made or sent, please ignore this invoice. If you have any questions about this invoice or would like to make arrangements to pay your balance, please write or call the Finance Department at the above address or (218) 728-0884. See reverse side for WFC IOU Policies. "; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $startYear = date('Y'); + $lastMonth = date("n")-1; + $lastMonth = $lastMonth . '/01/'. $startYear; + $twoMonth = date("n")-2; + $twoMonth = $twoMonth . '/01/'.$startYear; + + $span = date("F Y",mktime(0,0,0,$prevMonth,1,$prevYear)); + $dateStart = date('F',strtotime($lastMonth)); + $pdf->Cell(0,8,"Balance summary $span",0,1,'C'); + $pdf->SetFillColor(200); + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(40,8,'Beginning Balance',0,0,'L',1); + $pdf->Cell(20,8,'Charges',0,0,'L',1); + $pdf->Cell(25,8,'Payments',0,0,'L',1); + $pdf->Cell(35,8,'Ending Balance',0,0,'L',1); + //$pdf->SetFillColor(255,0,0); + $pdf->SetFont('Arial','B','14'); + $pdf->Cell(35,8,'Amount Due',0,1,'L',1); + $pdf->SetFont('Arial','','12'); + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(40,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + $pdf->Cell(20,8,'$ ' . sprintf("%.2f",$selAddW[8]),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$selAddW[9]),0,0,'L'); + $pdf->Cell(35,8,'$ ' . sprintf("%.2f",$selAddW[10]),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$selAddW[10]),0,0,'L'); + $pdf->Ln(10); + + $date2Month = date('F',strtotime($twoMonth)); + $pdf->SetFontSize(10); + $pdf->Cell(0,5,"Recent Activity (90 days OR 15 transactions)",0,0,'C'); + $pdf->Ln(5); + $pdf->SetFillColor(200); + $pdf->Cell(20,5,'',0,0,'L'); + $pdf->Cell(60,5,'Date',0,0,'L',1); + $pdf->Cell(20,5,'Receipt',0,0,'L',1); + $pdf->Cell(25,5,'Charges',0,0,'L',1); + $pdf->Cell(25,5,'Payments',0,0,'L',1); + $pdf->Ln(5); + + $prevD = ""; + $prevT = ""; + $prev = ""; + if($selTransN == 0){ + $date = ''; + $trans = ''; + $charges = '0.00'; + $payment = '0.00'; + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + $pdf->Cell(20,8,$trans,0,0,'L'); + $pdf->Cell(25,8,'$ ' . $charges,0,0,'L'); + $pdf->Cell(25,8,'$ ' . $payment,0,0,'L'); + $pdf->Ln(5); + } + + $lineitem=""; + $count = 0; + while($selTransW = $sql->fetch_row($selTransR)){ + if ($selTransW[0] != $selAddW[0]){ + $sql->data_seek($selTransR,$rowNum); + break; + } + else $rowNum++; + + if ($count > 14) continue; + + if($selTransN != 0){ + $date = $selTransW[3]; + $trans = $selTransW[4]; + $charges = $selTransW[1]; + $payment = $selTransW[2]; + + //list($year, $month, $day) = split("-", $date); + //$date = date('M-d-Y', mktime(0, 0, 0, $month, $day, $year)); + } + if ($date != $prevD || $trans != $prevT){ + if (!empty($lineitem)){ + $pdf->SetFontSize(8); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(3.5); + $pdf->SetFontSize(10); + $count++; + /* + if ($count > 14) { + $lineitem=""; + break; + } + */ + } + $lineitem = ""; + $prev = ""; + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + //$pdf->Cell(40,8,date('M-d-Y',$date),0,0,'L'); + $pdf->Cell(20,8,$trans,0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$charges),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$payment),0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(3.5); + + } + if ($selTransW[5] != "" && $selTransW[5] != $prev){ + $lineitem = (empty($lineitem))?$selTransW[5]:'(Multiple items)'; + $prev = $selTransW[5]; + } + elseif ($selTransW[6] != "" && $selTransW[6] != $prev){ + $lineitem = (empty($lineitem))?$selTransW[6]:'(Multiple items)'; + $prev = $selTransW[6]; + } + $prevD = $date; + $prevT = $trans; + } + if (!empty($lineitem)){ + $pdf->SetFontSize(8); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + $pdf->SetFontSize(10); + } + $pdf->SetFontSize(12); + addBackPage($pdf); +} + +/* +$pdf->AddPage(); + +while($selAdd1W = $sql->fetch_row($selAddR)){ + $cell = $selAdd1W[0] . ' ' . $selAdd1W[1] . ', ' . $selAdd1W[2]; + $pdf->Cell(0,5,$cell,0,1); +} +*/ +$pdf->Output('makeStatement.pdf','D'); + +function addBackPage($pdf){ + $pdf->AddPage(); + $pdf->SetFont('Arial','B',16); + $pdf->SetTextColor(105); + //$pdf->Cell(0,10,'',0,1,'C'); + $pdf->Cell(0,10,'IOU POLICY',0,1,'C'); + //$pdf->Ln(5); + $pdf->SetFont('Arial','',12); + $pdf->Cell(0,10,'OF WHOLE FOODS COMMUNITY CO-OP, INC.',0,1,'C'); + $pdf->SetFont('Arial','',10); + $txt = "WFC members may charge purchases to a maximum of $20.00 payable within two (2) weeks from the date incurred. IOU's must be signed by the maker. IOU's may not, under any circumstances, be paid with Food Stamps or EBT card. WFC asks that its members only use the charge system for emergencies." ; + + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "-Members with an IOU account credit balance will receive a + reminder of that balance on each purchase receipt. + -Members with an IOU debit balance will receive a reminder + of that balance on each purchase receipt. + + If WFC is not reimbursed by a member within sixty (60) days from the date of an overdue IOU for the amount of that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all indebtedness owed to WFC, will be converted to non-voting Class B stock. + + If WFC is not reimbursed by a member within sixty (60) days from the date of a bounced check for the amount of that check plus the amount of any administrative fee, that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all indebtedness owed to WFC, will converted to non-voting Class B stock. + + IOU credit balances over sixty (60) days will be credited to the Member's non-voting Class B stock and the IOU account will be adjusted to zero. Members may request the return of Class B stock in excess of the amount required by the By-Laws by submitting to the Board a Request to Terminate that excess stock. + + At the discretion of the General Manager, member business and non-profit agency accounts may have higher IOU limits and/or extended payment terms. + "; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(1); + + $txt="Special Orders"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,20,'',0,0); + + $txt = "Special orders not picked up or paid for within thirty (30) days of the time items are received at WFC will be put out for sale or disposed of at management discretion. Future special orders from members or from non-members who have not previously promptly paid for and/or picked up special orders, at management discretion, may require prepayment."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(2); + + $txt="Newsletter Ads"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,20,'',0,0); + + $txt = "Members may charge the cost of advertising their business in WFC's newsletter under the same IOU payment terms as noted above but on an IOU account separate from the member's IOU account for inventory purchases. + + Members will be mailed an invoice within ten (10) days of the date of publication for the amount of the advertising charge. Failure to pay the amount due is then subject to the provisions of this IOU policy. + "; + + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(0); + + $txt="NOTE"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,15,'',0,0); + + $txt = + "Memberships with IOUs and/or other credit problems in excess of sixty (60) days may be placed on inactive status by management pending Board action. Purchases by inactive members will not be recorded and will not count toward eligibility for a patronage rebate. Purchases by inactive members are not eligible for member discounts or member specials. + Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject to Board discretion with respect to access to member credit benefits. + "; + + $pdf->MultiCell(0,4,$txt); + + $pdf->SetFont('Arial','B',10); + $txt = " + Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject to Board discretion with respect to access to member credit benefits."; + $pdf->Cell(15,20,'',0,0); + $pdf->MultiCell(0,5,$txt); + + $pdf->Ln(5); + $pdf->SetTextColor(0); + $pdf->SetFont('Arial','',10); +} + +?> diff --git a/fannie/legacy/members/statements/makeStatementBusinessAll.php b/fannie/legacy/members/statements/makeStatementBusinessAll.php new file mode 100644 index 000000000..cc7fa597b --- /dev/null +++ b/fannie/legacy/members/statements/makeStatementBusinessAll.php @@ -0,0 +1,456 @@ + 0 + $cardsClause + ORDER BY m.card_no"; +$selAddR = $sql->query($selAddQ); + +$selTransQ = "SELECT card_no, CASE WHEN trans_subtype='MI' THEN -total ELSE 0 END as charges, + CASE WHEN department=990 then total ELSE 0 END as payments, tdate, trans_num, + '','',register_no,emp_no,trans_no FROM {$TRANS}dlog_90_view as m WHERE 1=1 $cardsClause + AND (department=990 OR trans_subtype='MI') + ORDER BY card_no, tdate, trans_num"; +$selTransR = $sql->query($selTransQ); +$selTransN = $sql->num_rows($selTransR); + +$arRows = array(); +$trans_clause = ""; +while($w = $sql->fetch_row($selTransR)){ + if (!isset($arRows[$w['card_no']])) + $arRows[$w['card_no']] = array(); + $arRows[$w['card_no']][] = $w; + $date = explode(' ',$w['tdate']); + $rn = $w['register_no']; + $tn = $w['trans_no']; + $en = $w['emp_no']; + $trans_clause .= " (datediff('$date[0]',datetime)=0 AND register_no=$rn AND emp_no=$en AND trans_no=$tn) OR "; +} +$trans_clause = substr($trans_clause,0,strlen($trans_clause)-3); +$q = "SELECT card_no,description,department,emp_no,register_no,trans_no + FROM {$TRANS}transarchive + WHERE trans_type IN ('I','D') and emp_no <> 9999 + AND register_no <> 99 AND trans_status <> 'X' + AND upc <> 'DISCOUNT' + AND ($trans_clause)"; +$details = array(); +$r = $sql->query($q); +while($w = $sql->fetch_row($r)){ + $tn = $w['emp_no']."-".$w['register_no']."-".$w['trans_no']; + if (!isset($details[$w['card_no']])) + $details[$w['card_no']] = array(); + if (!isset($details[$w['card_no']][$tn])) + $details[$w['card_no']][$tn] = array(); + $details[$w['card_no']][$tn][] = $w['description']; +} + +$today= date("d-F-Y"); +$month = date("n"); +$year = date("Y"); + +if($month != 1){ + $prevMonth = $month- 1; +}else{ + $prevMonth = 12; + $year = $year - 1; +} +$prevYear = $year; + +$prevPrevMonth = $prevMonth - 1; +$prevPrevYear = $year; +if ($prevPrevMonth == 0){ + $prevPrevMonth = 12; + $prevPrevYear = $year - 1; +} + +$stateDate = date("d F, Y",mktime(0,0,0,date('n'),0,date('Y'))); + +$pdf = new FPDF(); + +//Meat of the statement +$rowNum=0; +while($selAddW = $sql->fetch_row($selAddR)){ + $pdf->AddPage(); + $pdf->Ln(5); + $pdf->Image($FANNIE_ROOT.'legacy/images/letterhead.jpg',10,10,200); + $pdf->Ln(5); + $pdf->SetFont('Arial','','12'); + $pdf->Ln(35); + + $pdf->Cell(10,5,sprintf("Invoice #: %s-%s",$selAddW[0],date("ymd")),0,1,'L'); + $pdf->Cell(10,5,$stateDate,0); + $pdf->Ln(8); + + + //Member address + $pdf->SetX(15); + $name = $selAddW['LastName']; + if (!empty($selAddW['FirstName'])) + $name = $selAddW['FirstName'].' '.$name; + $pdf->Cell(50,10,trim($selAddW[0]).' '.trim($name),0); + $pdf->Ln(5); + $pdf->SetX(15); + + if (strstr($selAddW[2],"\n") === False){ + $pdf->Cell(80,10,$selAddW[2],0); + $pdf->Ln(5); + $pdf->SetX(15); + } + else { + $pts = explode("\n",$selAddW[2]); + $pdf->Cell(80,10,$pts[0],0); + $pdf->Ln(5); + $pdf->SetX(15); + $pdf->Cell(80,10,$pts[1],0); + $pdf->Ln(5); + $pdf->SetX(15); + } + $pdf->Cell(90,10,$selAddW[4] . ', ' . $selAddW[5] . ' ' . $selAddW[6],0); + $pdf->Ln(25); + + $txt = "If payment has been made or sent, please ignore this invoice. If you have any questions about this invoice or would like to make arrangements to pay your balance, please write or call the Finance Department at the above address or (218) 728-0884."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(10); + + $startYear = date('Y'); + $lastMonth = date("n")-1; + $lastMonth = $lastMonth . '/01/'. $startYear; + $twoMonth = date("n")-2; + $twoMonth = $twoMonth . '/01/'.$startYear; + +/* + $span = date("F Y"); + $dateStart = date('F',strtotime($lastMonth)); + $pdf->Cell(0,8,"Balance summary $span",0,1,'C'); + $pdf->SetFillColor(200); + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(40,8,'Beginning Balance',0,0,'L',1); + $pdf->Cell(20,8,'Charges',0,0,'L',1); + $pdf->Cell(25,8,'Payments',0,0,'L',1); + $pdf->Cell(35,8,'Ending Balance',0,0,'L',1); + //$pdf->SetFillColor(255,0,0); + $pdf->SetFont('Arial','B','14'); + $pdf->Cell(35,8,'Amount Due',0,1,'L',1); + $pdf->SetFont('Arial','','12'); + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(40,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + $pdf->Cell(20,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",0),0,0,'L'); + $pdf->Cell(35,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + $pdf->Ln(20); +*/ + + $priorQ = "SELECT sum(charges) - sum(payments) FROM is4c_trans.ar_history + WHERE ".$sql->datediff('tdate',$sql->now())." < -90 + AND card_no = $selAddW[0]"; + $priorR = $sql->query($priorQ); + $priorBalance = array_pop($sql->fetch_row($priorR)); + + $pdf->Cell(20,8,''); + $pdf->SetFillColor(200); + $pdf->SetFont('Arial','B','12'); + $pdf->Cell(40,8,'Balance Forward',0,0,'L',1); + $pdf->SetFont('Arial','','12'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$priorBalance),0,0,'L'); + $pdf->Ln(8); + + $date2Month = date('F',strtotime($twoMonth)); + $pdf->Cell(0,8,"90-Day Billing History",0,1,'C'); + $pdf->SetFillColor(200); + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,'Date',0,0,'L',1); + $pdf->Cell(30,8,'Receipt',0,0,'L',1); + $pdf->Cell(25,8,'',0,0,'L',1); + $pdf->Cell(25,8,'Amount',0,1,'L',1); + + //$selTransQ = "SELECT * FROM ar_history WHERE datediff(mm,now(),tdate) = -1 + // AND card_no = $selAddW[0]"; + + $prevD = ""; + $prevT = ""; + $prev = ""; + if($selTransN == 0){ + $date = ''; + $trans = ''; + $charges = '0.00'; + $payment = '0.00'; + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + $pdf->Cell(30,8,$trans,0,0,'L'); + $pdf->Cell(25,8,'',0,0,'L'); + if ($charges != 0) + $pdf->Cell(25,8,'$ ' . $charges,0,0,'L'); + elseif ($payments != 0) + $pdf->Cell(25,8,'($ ' . $payments.")",0,0,'L'); + $pdf->Ln(5); + } + + $gazette = False; + $first = True; + $isPayment = False; + + $lineitem=""; + //while($selTransW = $sql->fetch_row($selTransR)){ + foreach($arRows[$selAddW[0]] as $arRow){ + + /* + if ($selTransW[0] != $selAddW[0]){ + $sql->data_seek($selTransR,$rowNum); + break; + } + else $rowNum++; + */ + + + $date = $arRow['tdate']; + $trans = $arRow['trans_num']; + $charges = $arRow['charges']; + $payment = $arRow['payments']; + + $detail = $details[$selAddW[0]][$trans]; + + if (strstr($detail[0],"Gazette Ad")) + $gazette = True; + $lineitem = (count($detail)==1) ? $detail[0] : '(multiple items)'; + if ($lineitem == "ARPAYMEN") $lineitem = "Payment Received - Thank You"; + + + $pdf->Cell(20,8,'',0,0,'L'); + $pdf->Cell(60,8,$date,0,0,'L'); + //$pdf->Cell(40,8,date('M-d-Y',$date),0,0,'L'); + $pdf->Cell(55,8,$trans,0,0,'L'); + if ($payment > $charges) + $pdf->Cell(25,8,'$ ' . sprintf('%.2f',$payment-$charges),0,0,'L'); + else + $pdf->Cell(25,8,'$ ' . sprintf('(%.2f)',abs($payment-$charges)),0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + if (!empty($lineitem)){ + $pdf->SetFontSize(10); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + $pdf->SetFontSize(12); + } + + } + /* + if ($selTransW[5] != "" && $selTransW[5] != $prev){ + $lineitem = (empty($lineitem))?$selTransW[5]:'(Multiple items)'; + $prev = $selTransW[5]; + } + elseif ($selTransW[6] != "" && $selTransW[6] != $prev){ + $lineitem = (empty($lineitem))?$selTransW[6]:'(Multiple items)'; + $prev = $selTransW[6]; + } + $prevD = $date; + $prevT = $trans; + */ + //} + /* + if (!empty($lineitem)){ + $pdf->SetFontSize(10); + $pdf->Cell(30,8,'',0,0,'L'); + $pdf->Cell(60,8,$lineitem,0,0,'L'); + if ($pdf->GetY() > 265){ + addBackPage($pdf); + $pdf->AddPage(); + } + else + $pdf->Ln(5); + $pdf->SetFontSize(12); + } + */ + + $pdf->Ln(15); + $pdf->Cell(20,8,''); + $pdf->SetFillColor(200); + $pdf->SetFont('Arial','B','14'); + $pdf->Cell(35,8,'Amount Due',0,0,'L',1); + $pdf->SetFont('Arial','','14'); + $pdf->Cell(25,8,'$ ' . sprintf("%.2f",$selAddW[7]),0,0,'L'); + + if ($gazette){ + $pdf->Image($FANNIE_ROOT.'legacy/images/WFCLogoCThru1.jpg',75,214,50,25); + + $pdf->SetY(205); + $pdf->Cell(0,8,'','B',1); + $pdf->Ln(5); + + $pdf->Cell(30,5,'Whole Foods Co-op'); + $pdf->Cell(115,5,''); + $pdf->Cell(20,5,'Invoice Date:',0,0,'R'); + $pdf->Cell(20,5,date("m/d/Y"),0,1,'L'); + $pdf->Cell(30,5,'610 East 4th Street'); + $pdf->Cell(115,5,''); + $pdf->Cell(20,5,'Customer Number:',0,0,'R'); + $pdf->Cell(20,5,$selAddW[0],0,1,'L'); + $pdf->Cell(30,5,'Duluth, MN 55805'); + $pdf->Cell(115,5,''); + $pdf->Cell(20,5,'Invoice Total:',0,0,'R'); + $pdf->Cell(20,5,$selAddW[7],0,1,'L'); + + $pdf->Ln(5); + $pdf->Cell(10,10,trim($selAddW[0]),0); + $pdf->Ln(5); + $pdf->Cell(50,10,trim($selAddW[1]),0); + $pdf->Ln(5); + $pdf->Cell(80,10,$selAddW[2],0); + $pdf->Ln(5); + if($selAddW[3]!= ''){ //if there is an address2 add it + $pdf->Cell(80,10,$selAddW[3],0); + $pdf->Ln(5); + } + $pdf->Cell(90,10,$selAddW[4] . ', ' . $selAddW[5] . ' ' . $selAddW[6],0); + + $pdf->SetXY(80,240); + $pdf->SetFontSize(10); + $pdf->MultiCell(110,6,"( ) Please continue this ad in the next issue. +( ) I would like to make some changes to my ad for the next issue. +( ) I do not wish to continue an ad in the next issue. +( ) I will contact you at a later date with my advertising decision."); + $pdf->Ln(3); + + $pdf->SetFontSize(12); + $pdf->Cell(0,8,'Please Return This Portion With Your Payment',0,0,'C'); + + } + + addBackPage($pdf); +} + +/* +$pdf->AddPage(); + +while($selAdd1W = $sql->fetch_row($selAddR)){ + $cell = $selAdd1W[0] . ' ' . $selAdd1W[1] . ', ' . $selAdd1W[2]; + $pdf->Cell(0,5,$cell,0,1); +} +*/ +$pdf->Output('makeStatement.pdf','D'); + +function addBackPage($pdf){ + return; + $pdf->AddPage(); + $pdf->SetFont('Arial','B',16); + $pdf->SetTextColor(105); + //$pdf->Cell(0,10,'',0,1,'C'); + $pdf->Cell(0,10,'IOU POLICY',0,1,'C'); + //$pdf->Ln(5); + $pdf->SetFont('Arial','',12); + $pdf->Cell(0,10,'OF WHOLE FOODS COMMUNITY CO-OP, INC.',0,1,'C'); + $pdf->SetFont('Arial','',10); + $txt = "WFC members may charge purchases to a maximum of $20.00 payable within two (2) weeks from the date incurred. IOU's must be signed by the maker. IOU's may not, under any circumstances, be paid with Food Stamps or EBT card. WFC asks that its members only use the charge system for emergencies." ; + + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(5); + + $txt = "-Members with an IOU account credit balance will receive a + reminder of that balance on each purchase receipt. + -Members with an IOU debit balance will receive a reminder + of that balance on each purchase receipt. + + If WFC is not reimbursed by a member within sixty (60) days from the date of an overdue IOU for the amount of that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all indebtedness owed to WFC, will be converted to non-voting Class B stock. + + If WFC is not reimbursed by a member within sixty (60) days from the date of a bounced check for the amount of that check plus the amount of any administrative fee, that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all indebtedness owed to WFC, will converted to non-voting Class B stock. + + IOU credit balances over sixty (60) days will be credited to the Member's non-voting Class B stock and the IOU account will be adjusted to zero. Members may request the return of Class B stock in excess of the amount required by the By-Laws by submitting to the Board a Request to Terminate that excess stock. + + At the discretion of the General Manager, member business and non-profit agency accounts may have higher IOU limits and/or extended payment terms. + "; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(1); + + $txt="Special Orders"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,20,'',0,0); + + $txt = "Special orders not picked up or paid for within thirty (30) days of the time items are received at WFC will be put out for sale or disposed of at management discretion. Future special orders from members or from non-members who have not previously promptly paid for and/or picked up special orders, at management discretion, may require prepayment."; + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(2); + + $txt="Newsletter Ads"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,20,'',0,0); + + $txt = "Members may charge the cost of advertising their business in WFC's newsletter under the same IOU payment terms as noted above but on an IOU account separate from the member's IOU account for inventory purchases. + + Members will be mailed an invoice within ten (10) days of the date of publication for the amount of the advertising charge. Failure to pay the amount due is then subject to the provisions of this IOU policy. + "; + + $pdf->MultiCell(0,5,$txt); + $pdf->Ln(0); + + $txt="NOTE"; + + $pdf->SetFont('Arial','B',12); + $pdf->Cell(70,5,$txt,0,0); + $pdf->Ln(5); + $pdf->SetFont('Arial','',10); + $pdf->Cell(15,15,'',0,0); + + $txt = + "Memberships with IOUs and/or other credit problems in excess of sixty (60) days may be placed on inactive status by management pending Board action. Purchases by inactive members will not be recorded and will not count toward eligibility for a patronage rebate. Purchases by inactive members are not eligible for member discounts or member specials. + Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject to Board discretion with respect to access to member credit benefits. + "; + + $pdf->MultiCell(0,4,$txt); + + $pdf->SetFont('Arial','B',10); + $txt = " + Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject to Board discretion with respect to access to member credit benefits."; + $pdf->Cell(15,20,'',0,0); + $pdf->MultiCell(0,5,$txt); + + $pdf->Ln(5); + $pdf->SetTextColor(0); + $pdf->SetFont('Arial','',10); +} + +?> diff --git a/fannie/legacy/members/stockOverdueReport.php b/fannie/legacy/members/stockOverdueReport.php new file mode 100755 index 000000000..5d68fda86 --- /dev/null +++ b/fannie/legacy/members/stockOverdueReport.php @@ -0,0 +1,135 @@ + + + + + + + +Click here for Excel version"; + + +$balanceQ = "SELECT s.memnum,s.payments,s.enddate,b.balance, + c.lastname,c.firstname,m.street, + m.city,m.state,m.zip + FROM newBalanceStockToday_test as s left join + custdata as c on s.memnum=c.cardno left join + ar_live_balance as b on s.memnum=b.card_no + left join meminfo as m on s.memnum=m.card_no + WHERE c.personnum = 1 and c.type <> 'TERM' + and s.payments < 100 and + ".$sql->datediff('s.enddate',$sql->now())." < -60 + order by s.memnum"; +$balanceR = $sql->query($balanceQ); +$balances = array(); +while ($row = $sql->fetch_row($balanceR)){ + $temp = explode(" ",$row[2]); + $datestr = $temp[0]; + $balances["$row[0]"] = array($row[4].", ".$row[5],str_replace("\n"," ",$row[6]),$row[7],$row[8],$row[9],$row[1],$datestr,$row[3]); +} + +echo tablify($balances,array(0,1,2,3,4,5,6,7,8),array("Account","Name","Address","City","State","Zip", + "Current Stock Balance","Stock due date","Current AR Balance"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT, + $ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY)); + + +function tablify($data,$col_order,$col_headers,$formatting,$sum_col=-1){ + $sum = 0; + $ret = ""; + + $ret .= ""; + $i = 0; + foreach ($col_headers as $c){ + while ($formatting[$i] == 0) $i++; + $ret .= cellify("".$c."",$formatting[$i++]&7); + } + $ret .= ""; + + foreach(array_keys($data) as $k){ + $ret .= ""; + foreach($col_order as $c){ + if($c == 0) $ret .= cellify($k,$formatting[$c]); + else $ret .= cellify($data[$k][$c-1],$formatting[$c]); + + if ($sum_col != -1 && $c == $sum_col) + $sum += $data[$k][$c-1]; + } + $ret .= ""; + } + if (count($data) == 0){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + + if ($sum_col != -1 && count($data) > 0){ + $ret .= ""; + foreach($col_order as $c){ + if ($c+1 == $sum_col) $ret .= ""; + elseif ($c == $sum_col) $ret .= cellify($sum,$formatting[$c]); + else $ret .= ""; + } + $ret .= ""; + } + + $ret .= "
        "; + $ret .= "No results to report"."
        Total 
        "; + + return $ret; +} + +function cellify($data,$formatting){ + $ALIGN_RIGHT = 1; + $ALIGN_LEFT = 2; + $ALIGN_CENTER = 4; + $TYPE_MONEY = 8; + $ret = ""; + if ($formatting & $ALIGN_LEFT) $ret .= ""; + elseif ($formatting & $ALIGN_RIGHT) $ret .= ""; + elseif ($formatting & $ALIGN_CENTER) $ret .= ""; + + if ($formatting & $TYPE_MONEY) $ret .= sprintf("%.2f",$data); + else $ret .= $data; + + $ret .= ""; + + return $ret; +} +?> diff --git a/fannie/legacy/members/suspensionHistory.php b/fannie/legacy/members/suspensionHistory.php new file mode 100755 index 000000000..64e885cd6 --- /dev/null +++ b/fannie/legacy/members/suspensionHistory.php @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + +

        ItemsReference
        +

        +

        +query($codesQ); +$codes = array(); +while($codesW=$sql->fetch_row($codesR)) + $codes["$codesW[0]"] = (int)$codesW[1]; + +$q = "select username,post,postdate,reasoncode from suspension_history where cardno='$memNum' order by postdate desc"; +$r = $sql->query($q); +while($w = $sql->fetch_array($r)){ + echo "$w[2] - status changed by $w[0]
        "; + $reasonCode = (int)$w[3]; + if ($reasonCode == -1) + echo "$w[1]

        "; + else { + foreach($codes as $key=>$value){ + if ($reasonCode & $value) + echo $key."
        "; + } + echo "
        "; + } +} + +?> +
        diff --git a/fannie/legacy/members/testDetails.php b/fannie/legacy/members/testDetails.php new file mode 100644 index 000000000..fa50d7b13 --- /dev/null +++ b/fannie/legacy/members/testDetails.php @@ -0,0 +1,20 @@ +query("USE $FANNIE_TRANS_DB"); + +//new query based on stockpurchases table +$query = "SELECT month(tdate),day(tdate),year(tdate),stockpurchase,card_no,trans_num + from stockpurchases + where card_no = $mem + order by tdate DESC"; +trans_to_table($query,1,$col); + + +?> diff --git a/fannie/legacy/members/testEdit.php b/fannie/legacy/members/testEdit.php new file mode 100644 index 000000000..366b02585 --- /dev/null +++ b/fannie/legacy/members/testEdit.php @@ -0,0 +1,75 @@ +You must be Logged in to edit"; +} +else { + +//echo $memnum; +//$lName = $_POST['lastName']; +//$fName = $_POST['firstName'];/* +//$username = $_COOKIE['ow-loginname']; + +?> + + + + + + + + + + + + + + + + + +

        ItemsReference
        + + + + + + diff --git a/fannie/legacy/queries/HouseCoupon/explainify.html b/fannie/legacy/queries/HouseCoupon/explainify.html new file mode 100644 index 000000000..f661236c6 --- /dev/null +++ b/fannie/legacy/queries/HouseCoupon/explainify.html @@ -0,0 +1,56 @@ + + + Explanations + + +

        Explanation of terms and options

        +First, the simple ones: +
          +
        • Expires is when the coupon runs through, inclusive. E.g., if the expiration date is +January 31, 2010, the coupon will ring as "expired" starting February 1, 2010 +
        • Limit is the number of times the coupon can be used per transaction +
        • Member-only coupons can only be used by members +
        • Department dicates how the discount gets coded by the POS +
        +

        Required purchases

        +The bulk of features are here. The settings for minimum purchase dictate which kinds +of discounts can be applied. Many of these have similar options for at least +and more than. The usage is the same for all of them and affects how the minimum +is applied. E.g., if a soda coupon requires a quantity of at least 2, then purchasing +2 sodas is enough to use the coupon. On the other hand, if the requirement was a +quantity of more than 2, then 3 (or more) soda purchases would be needed. +
          +
        • Quantity requires a minimum purchase of specific items. Quantity is +measured by each or by the pound depending on the setting for the item. A quantity +minimum must have items associated with it. This is the one of the more flexible +minimum types; it works with every discount type except scaling discount (department) +
        • Department requires a minimum total purchase across the selected departments. +Purchase is measured in dollars rather than quantity. Applicable discount types are +scaling discount (department), flat discount, and percent discount. +
        • Mixed is the most complicated minimum type (yet). The customer must purchase +at least the specified quantity of qualifying items and some quantity of discount +items. Mixed discount is the only case where an item's QUALIFIER/DISCOUNT/BOTH setting +should be used. Like quantity discount, mixed discount can be used with any discount +type except scaling discount (department) +
        • Total discount simply refers to the total of the entire transaction in +dollars. No specific items or departments are associated with this minimum. The only +applicable discount types are flat discount and percent discount +
        • No minimum is exactly what it sounds like. +
        +

        Discount types

        +
          +
        • Quantity discount gives a certain number of items free. Fractions are OK, so +this ends up being like a percent discount. A value of 1.0 gives an item for free, a value of +0.5 gives an item for 50% off, etc. The discount is always applied to the cheapest valid item. +
        • Set Price discount locks in the coupon price. Regardless of the regular price, the +price with coupon will be exactly what's specified here. +
        • Flat Discount (Item) discounts the chepeast applicable item by the specified amount. +This scales with quantity to deal with by-weight items. +
        • Flat Discount (Department) is the same as above except for an item in the specified +department(s) instead of a specific UPC +
        • Flat Discount removes exactly the given amount, once, from the transaction +
        • Percent Discount provides a percentage off all discountable items (e.g., member +appreciation month) +
        + + diff --git a/fannie/legacy/queries/HouseCoupon/index.php b/fannie/legacy/queries/HouseCoupon/index.php new file mode 100644 index 000000000..2fbba733f --- /dev/null +++ b/fannie/legacy/queries/HouseCoupon/index.php @@ -0,0 +1,248 @@ + + + +Custom Coupons + + + + +Help!

        +query($query); +while($row = $sql->fetch_row($result)){ + $depts[$row[0]] = $row[1]; +} + +if (isset($_REQUEST['new'])){ + $maxQ = "SELECT max(coupID) from houseCoupons"; + $max = array_pop($sql->fetch_row($sql->query($maxQ))); + $cid = $max+1; + + $insQ = "INSERT INTO houseCoupons (coupID) values ($cid)"; + $sql->query($insQ); + $_REQUEST['cid'] = $cid; +} + +if (isset($_REQUEST['cid'])){ + $cid = $_REQUEST['cid']; + if (isset($_REQUEST['submitsave']) || isset($_REQUEST['submitadd']) + || isset($_REQUEST['submitdelete'])){ + $expires = isset($_REQUEST['expires'])?$_REQUEST['expires']:''; + if ($expires == '') $expires = "NULL"; + else $expires = "'$expires'"; + $limit = isset($_REQUEST['limit'])?$_REQUEST['limit']:1; + $mem = isset($_REQUEST['memberonly'])?1:0; + $dept = isset($_REQUEST['dept'])?$_REQUEST['dept']:800; + $dtype = isset($_REQUEST['dtype'])?$_REQUEST['dtype']:'Q'; + $dval = isset($_REQUEST['dval'])?$_REQUEST['dval']:0; + $mtype = isset($_REQUEST['mtype'])?$_REQUEST['mtype']:'Q'; + $mval = isset($_REQUEST['mval'])?$_REQUEST['mval']:0; + + $query =sprintf("UPDATE houseCoupons SET endDate=%s, + limit=%d,memberOnly=%d,discountType='%s', + discountValue=%f,minType='%s',minValue=%f, + department=%d WHERE coupID=%d", + $expires,$limit,$mem,$dtype,$dval,$mtype, + $mval,$dept,$cid); + $sql->query($query); + } + + if (isset($_REQUEST['upc']) && $_REQUEST['upc'] != 0){ + $upc = $_REQUEST['upc']; + if (!isset($_REQUEST['upcIsDept'])) + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + $type = $_REQUEST['newtype']; + $check = "SELECT upc FROM houseCouponItems WHERE + upc='$upc' and coupID=$cid"; + $check = $sql->query($check); + if ($sql->num_rows($check) == 0){ + $query = sprintf("INSERT INTO houseCouponItems VALUES ( + %s,'%s','%s')",$cid,$upc,$type); + $sql->query($query); + } + else { + $query = sprintf("UPDATE houseCouponItems SET type='%s' + WHERE upc='%s' AND coupID=%s",$type,$upc,$cid); + $sql->query($query); + } + } + + if (isset($_REQUEST['del'])){ + foreach($_REQUEST['del'] as $upc){ + $query = sprintf("DELETE FROM houseCouponItems + WHERE upc='%s' AND coupID=%s",$upc,$cid); + $sql->query($query); + } + } + + displayCoupon($_REQUEST['cid']); +} +else { + displayDefault(); +} +?> + + + +Make a new coupon

        "; + + $query = "SELECT coupID,endDate FROM houseCoupons ORDER BY coupID DESC"; + $result = $sql->query($query); + while($row = $sql->fetch_row($result)){ + printf("Coupon #%d (Expires: %s)
        ", + $row[0],$row[0],($row[1]==""?'never':$row[1])); + } +} + +function displayCoupon($cid){ + global $sql,$depts; + + $q1 = "SELECT * FROM houseCoupons WHERE coupID=$cid"; + $r1 = $sql->query($q1); + $row = $sql->fetch_row($r1); + + $expires = $row['endDate']; + $limit = $row['limit']; + $mem = $row['memberOnly']; + $dType = $row['discountType']; + $dVal = $row['discountValue']; + $mType = $row['minType']; + $mVal = $row['minValue']; + $dept = $row['department']; + + echo "

        "; + echo ""; + + printf(" + + + "; + + $dts = array('Q'=>'Quantity Discount', + 'P'=>'Set Price Discount', + 'FI'=>'Scaling Discount (Item)', + 'FD'=>'Scaling Discount (Department)', + 'F'=>'Flat Discount', + '%'=>'Percent Discount (Transaction)' + ); + echo " + "; + + + $mts = array( + 'Q'=>'Quantity (at least)', + 'Q+'=>'Quantity (more than)', + 'D'=>'Department (at least $)', + 'D+'=>'Department (more than $)', + 'M'=>'Mixed', + '$'=>'Total (at least $)', + '$+'=>'Total (more than $)', + ''=>'No minimum' + ); + echo " + "; + + echo "
        Coupon ID#%sUPC%s
        Expires + Limit
        Member-only + + Department
        Discount Type + Discount value
        Minimum Type + Minimum value
        "; + echo "
        "; + + if ($mType == "Q" || $mType == "Q+" || $mType == "M"){ + echo "
        "; + echo "Add UPC: + + "; + echo "

        "; + echo " + "; + $query = "SELECT h.upc,p.description,h.type FROM + houseCouponItems as h LEFT JOIN products AS + p ON h.upc = p.upc WHERE coupID=$cid"; + $result = $sql->query($query); + while($row = $sql->fetch_row($result)){ + printf(" + ", + $row[0],$row[1],$row[2],$row[0]); + } + echo "
        Items
        %s%s%s
        "; + echo "
        "; + echo ""; + } + else if ($mType == "D" || $mType == "D+"){ + echo "
        "; + echo ""; + echo "Add Dept: "; + echo " + "; + echo "

        "; + echo " + "; + $query = "SELECT h.upc,d.dept_name,h.type FROM + houseCouponItems as h LEFT JOIN departments as d + ON h.upc = d.dept_no WHERE coupID=$cid"; + $result = $sql->query($query); + while($row = $sql->fetch_row($result)){ + printf(" + ", + $row[0],$row[1],$row[2],$row[0]); + } + echo "
        Items
        %s%s%s
        "; + echo "
        "; + echo ""; + } + + echo "
        "; +} + +?> diff --git a/fannie/legacy/queries/UNFIsales.php b/fannie/legacy/queries/UNFIsales.php new file mode 100644 index 000000000..954cbc4ff --- /dev/null +++ b/fannie/legacy/queries/UNFIsales.php @@ -0,0 +1,206 @@ +Barcode($x,$y,$barcode,$h,$w,13); + } + + function UPC_A($x,$y,$barcode,$h=16,$w=.35) + { + $this->Barcode($x,$y,$barcode,$h,$w,12); + } + + function GetCheckDigit($barcode) + { + //Compute the check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*(isset($barcode[$i])?$barcode[$i]:0); + for($i=0;$i<=10;$i+=2) + $sum+=(isset($barcode[$i])?$barcode[$i]:0); + $r=$sum%10; + if($r>0) + $r=10-$r; + return $r; + } + + function TestCheckDigit($barcode) + { + //Test validity of check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + return ($sum+$barcode{12})%10==0; + } + + function Barcode($x,$y,$barcode,$h,$w,$len) + { + //Padding + $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT); + if($len==12) + $barcode='0'.$barcode; + //Add or control the check digit + if(strlen($barcode)==12) + $barcode.=$this->GetCheckDigit($barcode); + elseif(!$this->TestCheckDigit($barcode)){ + //$this->Error('This is an Incorrect check digit' . $barcode); + //echo $x.$y.$barcode."\n"; + } + //Convert digits to bars + $codes=array( + 'A'=>array( + '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011', + '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'), + 'B'=>array( + '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101', + '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'), + 'C'=>array( + '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100', + '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100') + ); + $parities=array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $code='101'; + $p=$parities[$barcode{0}]; + for($i=1;$i<=6;$i++) + $code.=$codes[$p[$i-1]][$barcode{$i}]; + $code.='01010'; + for($i=7;$i<=12;$i++) + $code.=$codes['C'][$barcode{$i}]; + $code.='101'; + //Draw bars + for($i=0;$i= 45 && $i <= 50) || + ($i > strlen($code)-4) ){ + if($code{$i}=='1') + $this->Rect($x+$i*$w,$y,$w,$h+2,'F'); + } + else { + if($code{$i}=='1') + $this->Rect($x+$i*$w,$y,$w,$h,'F'); + } + } + //Print text uder barcode + $this->SetFont('Arial','',6); + //$this->Text($x+12,$y+$h+2,substr($barcode,-$len)); + $this->Text($x+6,$y+$h+2,substr($barcode,0,6)); + $this->Text($x+24,$y+$h+2,substr($barcode,6,6)); + } +} + +if (isset($_REQUEST['upcs'])){ + $upcs = $_REQUEST['upcs']; + + $pdf=new PDF(); //start new instance of PDF + $pdf->Open(); //open new PDF Document + $pdf->SetTopMargin(5); //Set top margin of the page + $pdf->SetLeftMargin(4); //Set left margin of the page + $pdf->SetRightMargin(0); //Set the right margin of the page + $pdf->AddPage(); + + $count = 0; + foreach($upcs as $upc){ + if ($count == 13*5){ + $pdf->AddPage(); + $count = 0; + } + $x = $pdf->GetX(); + $y = $pdf->GetY(); + if ($count % 5 == 0){ + $x = 4; + $row = $count/5; + $y = 5+($row*20); + $pdf->SetXY($x,$y); + } + $pdf->SetFont('Arial','',8); //change font for price + $desc = $sql->query("SELECT description FROM products WHERE upc='$upc'"); + $desc = array_pop($sql->fetch_row($desc)); + if (strlen($desc)>20) + $desc = substr($desc,0,20)."\n".substr($desc,20); + + $pdf->Cell(40,20,'','TB',0,'C'); + $pdf->SetXY($x,$y); + $pdf->MultiCell(40,3,$desc,0,'C'); + $pdf->UPC_A($x+2,$y+7,ltrim($upc,'0'),10,.38); + + $pdf->SetXY($x+40,$y); + $count++; + + } + + $pdf->Output(); + exit; +} + +$subQ = "select superID,super_name from superDeptNames + where superID NOT IN (0,7) + group by superID,super_name + order by superID"; +$subR = $sql->query($subQ); + +$sub = isset($_REQUEST['sub'])?$_REQUEST['sub']:""; + +echo "
        +Sales from yesterday + + +
        +
        "; + +if ($sub != ""){ + echo "
        + + "; + + $itemQ = "SELECT d.upc,p.description,sum(d.quantity) + FROM dlog_15 as d INNER JOIN products AS p + ON d.upc = p.upc INNER JOIN unfi AS u + ON p.upc = u.upc LEFT JOIN departments as t + ON d.department = t.dept_no + LEFT JOIN superdepts AS s ON s.dept_ID=t.dept_no + WHERE s.superID = $sub AND + datediff(dd,getdate(),tdate)=-1 + AND trans_type='I' and trans_status <> 'M' + GROUP BY d.upc,p.description + ORDER BY SUM(d.quantity) DESC"; + $itemsR = $sql->query($itemQ); + while($itemsW = $sql->fetch_row($itemsR)){ + printf(" + ", + $itemsW[0],$itemsW[1],$itemsW[2],$itemsW[0]); + } + echo "
        UPCDescQtyInclude
        %s%s%.2f
        + +
        "; +} + +?> diff --git a/fannie/legacy/queries/addLikeCode.php b/fannie/legacy/queries/addLikeCode.php new file mode 100644 index 000000000..9ddf1e44c --- /dev/null +++ b/fannie/legacy/queries/addLikeCode.php @@ -0,0 +1,36 @@ +"; +if (empty($lc)){ + echo "
        "; + echo "Like Code: "; + echo "

        "; + echo "Description: "; + echo "

        "; + echo ""; +} +else { + if (!class_exists("SQLManager")) require_once($FANNIE_ROOT.'src/SQLManager.php'); + include('../db.php'); + + $checkQ = "select * from likeCodes where likecode=$lc"; + $checkR = $sql->query($checkQ); + $checkRow = $sql->fetch_row($checkR); + if ($sql->num_rows($checkR) > 0){ + echo "Like code $lc is already in use as $checkRow[1]"; + echo "
        "; + echo "Try again?
        "; + echo "Close"; + } + else { + $writeQ = "insert into likeCodes (likecode,likecodedesc) values ($lc,'$desc')"; + $writeR = $sql->query($writeQ); + echo "Like code $lc added as $desc

        "; + echo "Add another
        "; + echo "Close"; + } +} +?> diff --git a/fannie/legacy/queries/addShelfTag.php b/fannie/legacy/queries/addShelfTag.php new file mode 100644 index 000000000..2d5f88eec --- /dev/null +++ b/fannie/legacy/queries/addShelfTag.php @@ -0,0 +1,173 @@ +'All','jim'=>'Bulk', + 'joeu'=>'Grocery','brad'=>'Cool', + 'jillhall'=>'HBC','susans'=>'Gen Merch', + 'jesse'=>'Meat','eric'=>'Deli'); + +$upc=str_pad($_GET['upc'],13,0,STR_PAD_LEFT); +$clearUPC = substr($upc,-11); +$price = isset($_GET['saleprice'])?$_GET['saleprice']:''; +$batchID = isset($_GET['batchID'])?$_GET['batchID']:''; +$del = isset($_GET['delete'])?$_GET['delete']:''; + +if (!class_exists("SQLManager")) require_once($FANNIE_ROOT.'src/SQLManager.php'); +include('../db.php'); + +$unfiQ = "SELECT DISTINCT * FROM vendorItems where upc = '$upc'"; +//echo $unfiQ; + +$unfiR = $sql->query($unfiQ); +$unfiN = $sql->num_rows($unfiR); + +$prodQ = "SELECT * FROM products where upc='$upc'"; +//echo $prodQ; +$prodR = $sql->query($prodQ); +$prodW = $sql->fetch_array($prodR); +if (empty($price)) + $price = $prodW['normal_price']; + +if (!empty($batchID)){ + $selBListQ = "select * from batchList where upc='$upc' and batchID=$batchID"; + $selBListR = $sql->query($selBListQ); + $selBListN = $sql->num_rows($selBListR); + + if($del == 1){ + $delBListQ = "DELETE FROM batchList WHERE upc = '$upc' AND + batchID = $batchID"; + $delBListR = $sql->query($delBListQ); + }else{ + if($selBListN == 0){ + $insBItemQ = "INSERT INTO batchList(upc,batchID,salePrice) + VALUES('$upc',$batchID,$price)"; + //echo $insBItemQ; + $insBItemR = $sql->query($insBItemQ); + }else{ + $upBItemQ = "UPDATE batchList SET salePrice=$price WHERE upc = '$upc' + AND batchID = $batchID"; + //echo $upBItemQ; + $upBItemR = $sql->query($upBItemQ); + } + } +} + +//echo $unfiN; +echo "New Shelf Tag:
        " . str_pad($clearUPC,13,'0',STR_PAD_LEFT); +$prodExtraN = 0; +$ppo = ""; +if($unfiN == 1){ + $unfiW = $sql->fetch_array($unfiR); + $size = $unfiW['size']; + $brand = $unfiW['brand']; + $units = $unfiW['units']; + $sku = $unfiW['sku']; + $desc = $unfiW['description']; + $ppo = pricePerOunce($price,$size); +} +else { + $prodExtraQ = "select manufacturer,distributor from prodExtra where upc='$upc'"; + $prodExtraR = $sql->query($prodExtraQ); + $prodExtraN = $sql->num_rows($prodExtraR); + if ($prodExtraN == 1){ + $prodExtraW = $sql->fetch_array($prodExtraR); + $brand = $prodExtraW[0]; + $vendor = $prodExtraW[1]; + } +} + +?> + + + +Description
        + +>
        +Brand: +>
        +Units: +> +Size: +>
        +PricePer: />
        +Vendor: +>
        +SKU: +> +Price: > + 1){ + echo ""; +}else{ + echo ""; +} +?> +Barcode page:
        +
        +Log out"; +else + echo "You're not logged in. Log in now"; +?> +
        +
        + + diff --git a/fannie/legacy/queries/addShelfTag1.php b/fannie/legacy/queries/addShelfTag1.php new file mode 100644 index 000000000..13c69300a --- /dev/null +++ b/fannie/legacy/queries/addShelfTag1.php @@ -0,0 +1,49 @@ +1,'Grocery'=>4, + 'Cool'=>2,'HBC'=>5, + 'Gen Merch'=>9,'Meat'=>8, + 'Deli'=>3); + +$id = 0; +if ($barcodepage != "All") + $id = $buyers[$barcodepage]; + +$checkUPCQ = "SELECT * FROM shelftags where upc = '$upc' AND id=$id"; +$checkUPCR = $sql->query($checkUPCQ); +$checkUPCN = $sql->num_rows($checkUPCR); +//echo $del . ":
        "; +$insQ = ""; +if($del == 1){ + $insQ = "DELETE FROM shelftags where upc = '$upc'"; +}elseif($checkUPCN == 0){ + $insQ = "INSERT INTO shelftags VALUES($id,'$upc','$description',$price,'$brand','$sku','$size','$units','$vendor','$ppo')"; +}else{ + $insQ = "UPDATE shelftags SET normal_price = $price, pricePerUnit='$ppo' WHERE upc = '$upc'"; +} + +$insR = $sql->query($insQ); + + +//header('location=productTest.php?upc=$upc'); +//echo "javascript:close()"; +?> + + +(Type a title for your page here) + + + + + + + diff --git a/fannie/legacy/queries/audit.php b/fannie/legacy/queries/audit.php new file mode 100644 index 000000000..f69d25c2b --- /dev/null +++ b/fannie/legacy/queries/audit.php @@ -0,0 +1,41 @@ +"andy", + 1=>"jim, lisa", + 2=>"jesse, lisa", + 3=>"debbie, eric, justin, vicky", + 4=>"joeu, lisa", + 5=>"jillhall, lisa", + 6=>"michael, alex", + 7=>"shannon", + 8=>"jesse, lisa", + 9=>"raelynn, lisa" + ); + + $subject = "Item Update notification: ".$upc; + $message = "Item $upc ($desc) has been changed\n"; + $message .= "Price: $price\n"; + $message .= "Tax: ".$taxes[$tax]."\n"; + $message .= "Foodstampable: ".($fs==1?"Yes":"No")."\n"; + $message .= "Scale: ".($scale==1?"Yes":"No")."\n"; + $message .= "Discountable: ".($discount==1?"Yes":"No")."\n"; + if ($likecode != False){ + if ($likecode == -1) + $message .= "This item is not in a like code\n"; + else + $message .= "All items in this likecode ($likecode) were changed\n"; + } + $message .= "\n"; + $message .= "Adjust this item?\n"; + $message .= "http://key/git/fannie/legacy/queries/productTest.php?upc=$upc\n"; + $message .= "\n"; + $message .= "This change was made by user $uid\n"; + + $from = "From: automail\r\n"; + + mail($tos[$dept_sub],$subject,$message,$from); +} + +?> diff --git a/fannie/legacy/queries/barcode.php b/fannie/legacy/queries/barcode.php new file mode 100644 index 000000000..757049946 --- /dev/null +++ b/fannie/legacy/queries/barcode.php @@ -0,0 +1,143 @@ +"; + print "The UPC you entered has been modified:
        "; + if ($MODIFICATIONS & $MOD_UPC_CHECK) + print "The UPC check digit has been removed
        "; + if ($MODIFICATIONS & $MOD_EAN_CHECK) + print "The EAN check digit has been removed
        "; + if ($MODIFICATIONS & $MOD_UPC_E) + print "The UPC-E has been expanded to UPC-A
        "; + if ($MODIFICATIONS & $MOD_SCALE_UPC) + print "The last 6 digits have been changed to zero for the scale UPC
        "; + if ($MODIFICATIONS & $MOD_ORG_NINE) + print "The leading 9 has been removed from the organic produce PLU
        "; + print "If you really want to use this UPC: ".$original_upc.", "; + print "Click Here to override"; + print "
        "; +} + +?> diff --git a/fannie/legacy/queries/bulkInventory.php b/fannie/legacy/queries/bulkInventory.php new file mode 100644 index 000000000..8357ff901 --- /dev/null +++ b/fannie/legacy/queries/bulkInventory.php @@ -0,0 +1,33 @@ +"; +if (!class_exists("SQLManager")) require_once($FANNIE_ROOT'src/SQLManager.php'); +include('../db.php'); + +$query = "SELECT p.upc,p.description,p.department,p.normal_price,d.superID, +CASE WHEN x.distributor is null or x.distributor='' then ' ' else x.distributor end as distributor +FROM products as p LEFT JOIN MasterSuperDepts as d ON p.department=d.dept_ID +LEFT JOIN prodExtra as x on p.upc = x.upc +WHERE (d.superID = 1 or superID = 5 or superID = 9) AND scale = 1 +order by d.superID,p.department"; + +$result = $sql->query($query,$db); + +echo ''; +echo ' + '; +while($row = $sql->fetch_row($result)){ + echo ''; +} + +?> + + + diff --git a/fannie/legacy/queries/ddd.php b/fannie/legacy/queries/ddd.php new file mode 100644 index 000000000..b672e2d71 --- /dev/null +++ b/fannie/legacy/queries/ddd.php @@ -0,0 +1,23 @@ +"; + +$q = "SELECT month,day,year,upc,description,dept_no,dept_name,quantity,total + FROM dddItems + order by year desc, month desc, day desc, description"; +$r = $sql->query($q); +echo " +"; +while($w = $sql->fetch_row($r)){ + printf(" + ", + $w[0],$w[1],$w[2],$w[3],$w[3],$w[4],$w[5],$w[6],$w[7],$w[8]); +} +echo "
        PLUDescDeptPriceBuyerDistributor
        '. $row[0].''.$row[1]; + echo ''.$row[2].''.$row[3]; + echo ''.$row[4].''.$row[5]; + echo '
        DateUPCItemDept#Dept nameQty$
        %d/%d/%d%s + %s%d%s%.2f%.2f
        "; + +?> diff --git a/fannie/legacy/queries/docs/batches.html b/fannie/legacy/queries/docs/batches.html new file mode 100644 index 000000000..d91fbaa98 --- /dev/null +++ b/fannie/legacy/queries/docs/batches.html @@ -0,0 +1,72 @@ + +Instructions for Movement Reporting page + + + +
        +

        How to use the Batch Controller Page

        +
        +

        Below is a screenshot of the interface for the Batch Controller page. The page can be accessed directly by navigating to http://key/it/newbatch/. +

        +
        +

        Definitions:

        +
        +

        Batch Type - Type of batch (CAP, Member only special [MOS], price change, etc).

        +

        Name - Name for batch. Typically set to something recognizable (e.g. CAP GROC Dec 2006, for December 2006 Grocery CAP batch).

        +

        Start date - Date for the start of the batch

        +

        End date - Date for the end of the batch.

        +

        Owner - Buyer or department creating the batch.

        +

        Filter - Filter batches by their owner

        +

        Current - Batches that are currently running sales in the POS

        +

        Pending - Batches that are scheduled for some date in the future

        +

        Historical - Batches that have ended.

        +
        +

        +

        To start a new batch

        +
        +

        Select the Batch Type.

        +

        Once you have selected a batch type, enter a name for the batch. Placing your cursor in the 'Start date' and 'End date' fields will popup calendars to select the start and end dates of the batch.

        Note: if a mistake is made entering the date, you will need to hand edit the date. The calendar will show 'Undefined' as its year on a second attempt.

        +

        Lastly, select an Owner for the report. It is not necessary to enter an owner, but by doing so, you will be able to filter this batch, by selecting this owner.

        +

        Click 'Add' to add this batch to the batch list. Note: if the batch date is set for the future, it will not show under 'Current' batches, but under 'Pending' batches.

        +

        The batch list display

        +

        The first thing to note in the batch list display is that there are several options for viewing the batchlist. The default view is to show 'Current' batches. The view can be changed to show Pending batches, Historical batches or All batches, but selecting the appropriate Display link.

        +

        Editing batch information

        +

        To edit basic information for a batch such as its name, start/end date, owner, etc., Click 'Edit' on the line for the batch in question.
        +

        +

        This will open all the fields for that batch for editing and change the 'Edit' link to 'Save'. Once your edits have been made, click 'Save' and the batch information will be updated.

        +

        Deleting a batch

        +

        To delete a batch, click the 'Delete' link for the batch.

        +

        You will be asked to confirm that you indeed do want to delete the batch.

        + +

        Displaying a Movement Report for a batch

        +

        Clicking the 'Report' link will display the sales history for the items in the batch during the sale period defined by the start and end dates of the batch.

        +

        +

        You will notice here that you have the option of changing the date range for the products in the sales batch movement report. This is useful when you wish to see how these products moved during a period within the sales batch time frame (for example, over the last weekend) or even for a period outside the batch dates (for example, you are looking to see how this product sold the month before the sales batch and the month after). The displayed report can also be dumped to an Excel file using the 'Click here for Excel version' link.

        +

        Editing items in a batch

        +

        Once a batch has been created, items can be added/subtracted from a batch by clicking the link that is the name of the batch. This will load the item maintenance interface to the batch controller.

        +

        Entering a upc and clicking 'Add' (or pressing [Enter]) will pull preliminary information (description and current price) about the item.
        +

        +

        A Sale price field will appear at this point, as well. Enter the sale price for the item and click 'Add' or press [Enter] and the item will be added to the list of items in the sales batch.

        +

        To edit the sale price for an item already in a sales batch, click 'Edit', edit the sale price and click 'Save' and the price will be changed within the sales batch.

        To delete an item a batch, click 'Delete'. This will remove the item from the batch.

        +

        Adding like codes to batches

        +

        Like codes can be used in batches in addition to items. To enter the items in a like code, select 'Like Code'. This switches to a like code entry form. If you know the like code that you want, you can simply enter it in the left box. Otherwise, select it from the drop down list. To go back to the regular entry form, uncheck 'Like Code'.
        +

        +

        This will load a review showing the like code description and price information for that like code.

        +

        Upon adding this item to the batch you will now see a description of 'LC' plus the like code ID number listed in the item list.
        +

        +

        Like codes in the batch item list can be edited and deleted like items (see above: Editing items in a batch)

        +

        Shelf Tags

        +

        Shelf tags are incorporated directly into the batch page. To create a new shelf tag for an item, check the 'New shelf tag" checkbox. This will automatically maintain the same setting while items are being entered.

        + +

        Adding an item with a new shelf tag brings up an additional entry form for shelf tag specific information. 'Add' will add the item to the batch and create a new shelf tag. 'Cancel' will go back without adding the item or creating a shelf tag.

        + +

        There are two ways to print shelf tags. When viewing a single batch, click 'Print Shelf Tags'.

        + +

        Alternately, to get shelf tags from multiple batches at once, click the 'Print Shelf Tags' link on the list of all batches.

        + +

        A list of all batches that have shelf tags is presented. Select as many as desired, then click 'Print'

        + +
        +
        + + diff --git a/fannie/legacy/queries/docs/hourly.html b/fannie/legacy/queries/docs/hourly.html new file mode 100644 index 000000000..80121b649 --- /dev/null +++ b/fannie/legacy/queries/docs/hourly.html @@ -0,0 +1,11 @@ + + + +Hourly Sales Reporting Page + + +
        +

        How to use the Hourly Reporting page

        +
        + + diff --git a/fannie/legacy/queries/docs/movement.html b/fannie/legacy/queries/docs/movement.html new file mode 100644 index 000000000..9000f50ac --- /dev/null +++ b/fannie/legacy/queries/docs/movement.html @@ -0,0 +1,37 @@ + +Instructions for Movement Reporting page + + + +
        +

        How to use the Movement Reporting Page

        +
        +

        Below is a screenshot of the interface for the Movement Report Page. The page can be accessed directly by navigating to http://key/queries/deliQuery.php. +

        +
        +

        Definitions:

        +
        +

        Buyer/Dept - All departments/items associated with a particular buyer or department manager.

        +

        Send to Excel - Generate an Excel document from report, rather than display report.

        +

        Department Start/End - Report will include the movement of all items in departments included in range.

        +

        Date Start/End - Report will include all movement on all days included in range.

        +

        Sum movement by? - Determines what category to sum movement information

        +
        +

        +

        To generate a movement report for all departments for a Buyer/Dept

        +
        +

        Select Buyer/Dept interested in.

        +

        Once you have selected a Buyer/Dept, selecting a Department Start/End is no longer considered in generating the report. Next, select a start date and end date for the report.

        +

        Lastly, you need to decide how you would like the movement summed. Summing by PLU will show movement at the item level, summing by department will show total movement in departments selected with buyer/dept, and summing by date will sum all movement in the selected buyer/dept manager's departments

        +

        To generate movement report for specific department range

        +

        This report is generally the same as by Buyer/Dept, except that the Buyer/Dept must be set to the blank row at the top of the select list. If a Buyer/Dept is selected it will override any department selections made. Department ranges may be set by either entering department numbers, or by selecting departments from drop down menus.

        +

        Once the department range is set, a date range needs to be set per instructions above, as well as, setting sum by criteria.

        +

        Sending report to Excel

        +

        There are two ways of sending this report to Excel. The first is to simply click the 'Send to Excel' checkbox BEFORE running the report.

        +

        The other method is to click the 'Save to Excel' link on the resulting report without selecting the 'Send to Excel' checkbox before running the report

        +

        Using the Movement Report

        +

        The image above shows the look of the movement report. The header for the report explains how it is currently summed, the date of the report, the date range and the either the Buyer/Dept or the department range. As explained above, the report may also be sent to Excel, by clicking the Save to Excel' link. The default sort for this report is by UPC if report is summed by PLU/UPC, date if summed by date, and by department if summed by department. The column headers are all links to sort the report. Clicking the same column header twice will sort the report in the reverse direction from its current sort.

        +
        +
        + + diff --git a/fannie/legacy/queries/docs/prodList.html b/fannie/legacy/queries/docs/prodList.html new file mode 100644 index 000000000..79bd99172 --- /dev/null +++ b/fannie/legacy/queries/docs/prodList.html @@ -0,0 +1,34 @@ + +Instructions for Product List page + + + +
        +

        How to use the Product List Page

        +
        +

        Below is a screenshot of the interface for the Product List Page. The page can be accessed directly by navigating to http://key/queries/lisaQuery.php. +

        +
        +

        Definitions:

        +
        +

        Buyer - Report will include movement of all items for given buyer/department. Overrides department settings.

        +

        Department Start/End - Report will include the movement of all items in departments included in range.

        +

        Sort report by? - Set to sort report by UPC, names, etc

        +
        +

        To genereate product list report for specific buyer/Dept

        +

        Select department/buyer from dropdown

        Once the buyer has been set, set the 'Sort report by?' field and submit.

        +

        To generate product list report for specific department range

        +

        Department ranges may be set by entering department numbers

        +

        Once the department range is set, setting the 'Sort report by?' field is used to set the default sort of the report.

        +

        Using the Product List Report

        +



        The image above shows the look of the product list report. The header for the report explains how it is currently sorted, the date of the report and the department range. The report may also be sent to Excel, by clicking the 'Save to Excel' link. The default sort for this report is by UPC. The report can be resorted by clicking any of the header fields (UPC, Description, etc).

        +

        Quick edits to items in this list can be done by clicking the 'Edit' link on the right hand of the item. This will change the line to an input format. Fields that +can be edited this way are: description, department, price and tax, food stamp, discount and weighable status. When completed making changes, click 'Save' on the right to submit the changes.
        +

        +

        More advanced edits (like code edits, deli tax, manufacturer, etc) can be done by clicking the upc. This links to the Price Change page for that item.

        +

        Items may also be deleted from the product table by clicking the trashcan next to the UPC. A dialogue window will appear confirming your intention to delete the item. +
        Clicking 'Yes' will permanently delete the item from the product table. Clicking 'No' will save your item from being deleted from the product table.

        +
        + + + diff --git a/fannie/legacy/queries/enterTestItem.php b/fannie/legacy/queries/enterTestItem.php new file mode 100755 index 000000000..87da171b5 --- /dev/null +++ b/fannie/legacy/queries/enterTestItem.php @@ -0,0 +1,239 @@ + + + + + + + + +query($del99Q,$db1); +$delISR = $sql->query($del99Q); + +//echo '
        ' .$upc; +//echo $descript; +//echo $price; + +// set the tax and foodstamp according to values in departments +$taxfsQ = "select dept_tax,dept_fs,superID,dept_discount +from departments as d left join +MasterSuperDepts AS s ON d.dept_no=s.dept_ID +where dept_no = $dept"; +$taxfsR = $sql->query($taxfsQ); +if ($sql->num_rows($taxfsR) == 1){ + $taxfsRow = $sql->fetch_array($taxfsR); + $tax = $taxfsRow[0]; + $FS = $taxfsRow[1]; + if ($taxfsRow[3] == 0) + $NoDisc = 0; +} + +/* if the user isn't validated but is logged in, then + they don't have permission to change prices on all + items. So get the sub department and check that. +*/ +$deptSub = $taxfsRow[2]; +if (!$validatedUser && !$auditedUser && $logged_in){ + $validatedUser = validateUserQuiet('pricechange',$deptSub); +} + +$uid = 1005; +if ($validatedUser){ + $validatedUID = getUID($validatedUser); + $uid = $validatedUID; +} +elseif ($auditedUser){ + $auditedUID = getUID($auditedUser); + $uid = $auditedUID; + require('audit.php'); + if (!empty($likeCode)) + audit($deptSub,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc,$likeCode); + else + audit($deptSub,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc); +} +if (!$validatedUser && !$auditedUser && substr($upc,0,3) != "002"){ + echo "Please "; + echo ""; + echo "login to add new items"; + return; +} + +$descript = str_replace("'","",$descript); +$descript = $sql->escape($descript); + +$query1 = "INSERT INTO prodUpdate + VALUES('$upc',$descript, + $price,$dept, + $tax,$FS, $Scale, + $likeCode, + getdate(), + $uid, + $QtyFrc, + $NoDisc, + $inUse) + "; +//echo $query1; +$result1 = $sql->query($query1); + + +$query99 = "INSERT INTO products + VALUES('$upc',$descript,$price,0,0.00,0,0.00,0,0.00,0,'','',$dept,0,$tax,$FS,$Scale,0,0,getdate(),0,0,$NoDisc,0,0,0,0,0,0.00,1, + 0,0,0.00,$local)"; +//echo $query99; +//$result = $sql->query($query99,$db1); +$resultI = $sql->query($query99); + +//$insertR = $sql->query('EXEC insertItemProc',$db); +require('laneUpdates.php'); +addProductAllLanes($upc); + +if (empty($manufacturer)) + $manufacturer = ''; +if (empty($distributor)) + $distributor = ''; +$manufacturer = preg_replace("/\\\'/","",$manufacturer); +$distributor = preg_replace("/\\\'/","",$distributor); +$checkQ = "select * from prodExtra where upc='$upc'"; +$checkR = $sql->query($checkQ); +if ($sql->num_rows($checkR) == 0){ + $extraQ = "insert into prodExtra values ('$upc','$distributor','$manufacturer',0,0,0,'','',0,'')"; + $extraR = $sql->query($extraQ); +} + +//$result99 = $sql->query($query99,$db1); +if(isset($likeCode) && $likeCode > 0){ + $delLikeCode = "DELETE FROM upcLike WHERE upc = '$upc'"; + $insLikeCode = "INSERT INTO upcLike VALUES('$upc','$likeCode')"; + $delLikeCodeR = $sql->query($delLikeCode); + $insLikeCodeR = $sql->query($insLikeCode); +} + +$query1 = "SELECT * FROM products WHERE upc = '$upc'"; +$result1 = $sql->query($query1); +$row = $sql->fetch_array($result1); +//echo '
        '.$query1; + +if (isset($_REQUEST['shelftag'])){ + printf("",$upc); +} + +echo ""; + echo ""; + echo ""; + echo "
        UPC".$row[0]."
        Description$row[1]Price$$row[2]
        "; + echo ""; + echo ""; + echo ""; + //$dept=$row[12]; + $query2 = "SELECT * FROM departments where dept_no = $dept"; + $result2 = $sql->query($query2); + $num = $sql->num_rows($result2); + $row2 = $sql->fetch_array($result2); + echo ""; + echo ""; + + echo "
        DeptTaxFSScale"; + echo "
        "; + echo $dept.' ' . $row2['dept_name']; + echo " "; + echo "Reg
        Deli
        "; + echo "No Tax
        "; + echo "
        "; + //echo "I am here."; + echo "
        "; + echo " Enter UPC/PLU here
        "; + echo ""; + echo " Manufacturer Prefix"; + echo "
        "; +?> + diff --git a/fannie/legacy/queries/fork.php b/fannie/legacy/queries/fork.php new file mode 100644 index 000000000..82eb9470c --- /dev/null +++ b/fannie/legacy/queries/fork.php @@ -0,0 +1,197 @@ +connections[$FANNIE_SERVER_OP]) || $sql->connections[$FANNIE_SERVER_OP] === False){ + echo "Dead main DB!\n"; + exit(0); + } + + if (count($args) < 2) exit(0); + + switch($args[1]){ + case 'laneUpdates': + if (count($args) < 3) exit(0); + $upc = $args[2]; + include($FANNIE_ROOT.'legacy/queries/laneUpdates.php'); + updateProductAllLanes($upc); + break; + case 'sync': + if (count($args) < 3) exit(0); + $table = $args[2]; + tableSync($table); + break; + } +} + +function db(){ + global $FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW; + include('/var/www/html/git/fannie/legacy/db.php'); + return $sql; +} + +function tableSync($table){ + global $sql,$FANNIE_LANES,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW,$FANNIE_OP_DB,$FANNIE_ROOT; + + switch(strtolower($table)){ + case 'products': + include($FANNIE_ROOT.'legacy/queries/laneUpdates.php'); + syncProductsAllLanes(); + break; + + case 'departments': + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw'])) + break; + + $sql->query("TRUNCATE TABLE departments","opdata"); + $sql->query("TRUNCATE TABLE subdepts","opdata"); + + $selQ = "SELECT dept_no,dept_name,dept_tax,dept_fs,dept_limit,dept_minimum, + dept_discount,modified,modifiedby FROM departments"; + $ins = "INSERT INTO departments"; + $sql->transfer("WedgePOS",$selQ,"opdata",$ins); + + $selQ = "SELECT * FROM MasterSuperDepts"; + $ins = "INSERT INTO subdepts"; + $sql->transfer("WedgePOS",$selQ,"opdata",$ins); + } + break; + + case 'employees': + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw'])) + break; + $sql->query("TRUNCATE TABLE employees","opdata"); + + $selQ = "SELECT emp_no,CashierPassword,AdminPassword,FirstName, + LastName,JobTitle,EmpActive,frontendsecurity, + backendsecurity FROM employees"; + $ins = "INSERT INTO employees"; + $sql->transfer("WedgePOS",$selQ,"opdata",$ins); + } + break; + + case 'custdata': + $sql->query("exec master..xp_cmdshell 'dtsrun /S IS4CSERV\IS4CSERV /U {$FANNIE_SERVER_USER} /P {$FANNIE_SERVER_PW} /N CSV_custdata',no_output","WedgePOS"); + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw'])) + continue; + + if (!is_readable('/pos/csvs/custdata.csv')) break; + + $sql->query("TRUNCATE TABLE custdata","opdata"); + + $sql->query("LOAD DATA LOCAL INFILE '/pos/csvs/custdata.csv' INTO TABLE + custdata FIELDS TERMINATED BY ',' OPTIONALLY + ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n'","opdata"); + + if ($lane['host'] != "129.103.2.16"){ + $sql->query("DELETE FROM custdata WHERE type NOT IN ('PC','REG')","opdata"); + } + else { + $sql->query("DELETE FROM custdata WHERE type IN ('TERM')","opdata"); + } + } + break; + + case 'valutec': + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['trans'],$lane['user'],$lane['pw'])) + break; + + $sql->transfer("translog","select * from valutecRequest", + "WedgePOS","insert into valutecRequest"); + $sql->query("TRUNCATE TABLE valutecRequest","translog"); + + $sql->transfer("translog","select * from valutecRequestMod", + "WedgePOS","insert into valutecRequestMod"); + $sql->query("TRUNCATE TABLE valutecRequestMod","translog"); + + $sql->transfer("translog","select * from valutecResponse", + "WedgePOS","insert into valutecResponse"); + $sql->query("TRUNCATE TABLE valutecRequestMod","translog"); + } + break; + case 'efsnet': + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['trans'],$lane['user'],$lane['pw'])) + break; + + $sql->transfer("translog","select * from efsnetRequest", + "WedgePOS","insert into efsnetRequest"); + $sql->query("TRUNCATE TABLE efsnetRequest","translog"); + + $sql->transfer("translog","select * from efsnetResponse", + "WedgePOS","insert into efsnetResponse"); + $sql->query("TRUNCATE TABLE efsnetResponse","translog"); + + $sql->transfer("translog","select * from efsnetRequestMod", + "WedgePOS","insert into efsnetRequestMod"); + $sql->query("TRUNCATE TABLE efsnetRequestMod","translog"); + } + break; + + case 'housecoupons': + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw'])) + break; + + $sql->query("TRUNCATE TABLE houseCoupons","opdata"); + $sql->transfer("WedgePOS","select * from houseCoupons", + "opdata","INSERT INTO houseCoupons"); + + $sql->query("TRUNCATE TABLE houseCouponItems","opdata"); + $sql->transfer("WedgePOS","select * from houseCouponItems", + "opdata","INSERT INTO houseCouponItems"); + } + break; + + case 'memcards': + foreach($FANNIE_LANES as $lane){ + if(!$sql->add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw'])) + break; + + $sql->query("TRUNCATE TABLE memberCards","opdata"); + $sql->transfer("WedgePOS","select * from memberCards", + "opdata","INSERT INTO memberCards"); + + } + break; + + + case 'manualdtrans': + $dtcols = "datetime,register_no,emp_no,trans_no,upc,description, + trans_type,trans_subtype,trans_status,department,quantity, + Scale,cost,unitPrice,total,regPrice,tax,foodstamp,discount, + memDiscount,discountable,discounttype,voided,percentDiscount, + ItemQtty,volDiscType,volume,VolSpecial,mixMatch,matched, + memType,isStaff,numflag,charflag,card_no,trans_id"; + if(!$sql->add_connection("do this manually")); + break; + + $sql->transfer("translog","select * from dtrancleanup", + "WedgePOS","INSERT INTO transarchive ($dtcols)"); + break; + } +} + + +?> diff --git a/fannie/legacy/queries/funct1Mem.php b/fannie/legacy/queries/funct1Mem.php new file mode 100755 index 000000000..ef5df3817 --- /dev/null +++ b/fannie/legacy/queries/funct1Mem.php @@ -0,0 +1,685 @@ +query($query); + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + echo ""; + } + for ($i=1;$i<$cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }elseif(isset($row[5])){ + ?> + + + "; + } + else { + echo $row[0].""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + if ($i == 2) + $sum += $row[$i]; + echo "
        \n"; + return $sum; +} + +function prodList_to_table($query,$border,$bgcolor,$upc) +{ + global $sql; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + if($row[0]==$upc){ + echo ""; + for ($i=2;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + }else{ + echo ""; + } + + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + + "; + } + echo ""; + if(!isset($row[1])) + { + echo "NULL"; + }else{ + echo $row[1]; + } + echo ""; + + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +function like_to_table($query,$border,$bgcolor) +{ + global $sql; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + + "; + } + for ($i=1;$i<$number_cols-1; $i++) + { + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + + + + +function receipt_to_table($query,$query2,$border,$bgcolor) +{ + global $sql; + //echo $query2; + $result = $sql->query($query2); + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + $number2_cols = $sql->num_fields($result); + //display query + //echo "query: $query"; + //layout table header + $row2 = $sql->fetch_row($result); + $emp_no = $row2[4]; + //echo $emp_no; + //$queryEmp = "SELECT * FROM employees where emp_no = $emp_no"; + //$resEmp = $sql->query($queryEmp,$db); + //$rowEmp = $sql->fetch_row($resEmp); + //echo $rowEmp[4]; + + //echo $query2; + echo "\n"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + echo "\n"; + } + + echo "\n"; + + + } + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        W H O L E" . "   " ."F O O D S" . "   "."C O - O P
        (218) 728-0884
        MEMBER OWNED SINCE 1970
        $row2[0]     $row2[2]
        Cashier: $row2[4]
         
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + "; + } + for ($i=1;$i<$number_cols-1; $i++) + { + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
         
        --------------------------------------------------------
        Reprinted Transaction
        --------------------------------------------------------
        Member #: $row2[1]"; + echo "
        \n"; + + +} + +function edit_receipt($query,$query2,$border,$bgcolor) +{ + global $sql; + $result = $sql->query($query2); + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + $number2_cols = $sql->num_fields($result); + $row2 = $sql->fetch_row($result); + $emp_no = $row2[4]; + echo "
        "; + echo "\n"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n"; + while($row = $sql->fetch_row($results)) + { + echo "\n"; + echo "\n"; + } + echo ""; + echo "\n"; + + + } + $transID = rtrim($row2[2]); + $emp = rtrim($row2[4]); + $reg = rtrim($row2[3]); + $trans = rtrim($row2[5]); + //echo $trans . "trans"; + $date = rtrim($row2[0]); + //echo $date; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        W H O L E" . "   " ."F O O D S" . "   "."C O - O P
        (218) 728-0884
        MEMBER OWNED SINCE 1970
        $row2[0]     $row2[2]
        Cashier: $row2[4]
         
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + "; + } + for ($i=1;$i<$number_cols-1; $i++) + { + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
         
        --------------------------------------------------------
        --------------------------------------------------------
        Member #: $row2[1]"; + echo "
        \n"; + echo "
        "; +} + +/* -------------------------------start select_star_from----------------*/ +/* creates a table returning all values from a table (SELECT * FROM depts) + Variables are: + $table = table to run query on + + example: + select_star_from(depts); +*/ + +function select_star_from($table) +{ + global $sql; + $query = "SELECT * FROM $table"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + for($i=0; $i<$number_cols; $i++) + { + echo "\n"; + } + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +/* ------------------------------end select_start_from-----------------0-------*/ + +/* ------------------------------start select_where_equal----------------------*/ +/* creates a table using a SELECT WHERE syntax (SELECT * FROM transmemhead WHERE memNum = '175') + Variables are + $table = table for select + $where = field for where statement + $whereVar = value for where statement + + example: + select_where(transmemhead,memNum,175) + +*/ + +function select_where_equal($table,$where,$whereVar) +{ + global $sql; + $query = "SELECT * FROM $table WHERE $where = '$whereVar'"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + for($i=0; $i<$number_cols; $i++) + { + echo "\n"; + } + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +/* ----------------------------end select_where_equal--------------------------*/ + +/* ----------------------------start select_where_between----------------------*/ +/* creates a table using a SELECT WHERE syntax (SELECT * FROM transmemhead WHERE memNum BETWEEN '175' AND '185') + Variables are + $table = table for select + $where = field for where statement + $whereVar1 = beginning value for where statement + $whereVar2 = ending value for where statement + + example: + select_where_between(transmemhead,memNum,175,185) + +*/ + +function select_where_between($table,$where,$whereVar1,$whereVar2) +{ + global $sql; + $query = "SELECT * FROM $table WHERE $where BETWEEN '$whereVar1' AND '$whereVar2'"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + //layout table header + echo "\n"; + echo "\n"; + for($i=0; $i<$number_cols; $i++) + { + echo "\n"; + } + echo "\n"; //end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} +/* ----------------------------end select_where_between------------------*/ + + +/* ----------------------------start select_to_drop----------------------*/ +/* creates a dynamic drop down menu for use in forms. Variables are: + $table = table for select + $value = field to be used for drop down value + $label = field to be used for the label on the drop down menu + $name = name of the drop down menu + + example: + select_to_drop(depts,deptNum,deptDesc,deptList) + +*/ + +function select_to_drop($table,$value,$label,$name) +{ + global $sql; + $query = "SELECT * FROM $table"; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + echo "query: $query"; + echo ""; + while ($row_members = $sql->fetch_array($results)) + { + if($label == 'dept_name'){ + $label1 = $row_members['dept_no'] . " " . $row_members['dept_name']; + }else{ + $label1 = $row_members[$label]; + } + if($line == $row_members[$value]){ + echo "
        Click here to login

        "; +}else{ +?> + + +Barcode Label Page + + + + +

        + + + + diff --git a/fannie/legacy/queries/labels/old.html b/fannie/legacy/queries/labels/old.html new file mode 100644 index 000000000..aef1f512f --- /dev/null +++ b/fannie/legacy/queries/labels/old.html @@ -0,0 +1,33 @@ + + + +Barcode Label Page + + + + + + + +Login to view barcodes

        "; + +} +?> diff --git a/fannie/legacy/queries/laneUpdates.php b/fannie/legacy/queries/laneUpdates.php new file mode 100644 index 000000000..2c1f147a6 --- /dev/null +++ b/fannie/legacy/queries/laneUpdates.php @@ -0,0 +1,66 @@ +add_connection($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw']); + $selQ = "SELECT upc,description,normal_price,pricemethod,groupprice,quantity, + special_price,specialpricemethod,specialgroupprice,specialquantity,start_date,end_date, + department,size,tax,foodstamp,scale,scaleprice,mixmatchcode,modified,advertised,tareweight,discount, + discounttype,unitofmeasure,wicable,qttyEnforced,idEnforced,cost,inUse,numflag,subdept, + deposit,local,id FROM products WHERE upc='$upc'"; + $ins = "INSERT INTO products (upc,description,normal_price,pricemethod,groupprice,quantity, + special_price,specialpricemethod,specialgroupprice,specialquantity,start_date,end_date, + department,size,tax,foodstamp,scale,scaleprice,mixmatchcode,modified,advertised,tareweight,discount, + discounttype,unitofmeasure,wicable,qttyEnforced,idEnforced,cost,inUse,numflag,subdept, + deposit,local,id)"; + $sql->transfer($FANNIE_OP_DB,$selQ,$lane['op'],$ins); + } + rowRelease(); +} + +function deleteProductAllLanes($upc){ + global $sql,$FANNIE_ROOT,$FANNIE_LANES,$FANNIE_OP_DB; + + rowRestrict(); + foreach($FANNIE_LANES as $lane){ + $tmp = new SQLManager($lane['host'],$lane['type'],$lane['op'],$lane['user'],$lane['pw']); + $delQ = "DELETE FROM products WHERE upc='$upc'"; + $delR = $tmp->query($delQ,$lane['op']); + } + rowRelease(); +} + +function updateProductAllLanes($upc){ + deleteProductAllLanes($upc); + addProductAllLanes($upc); +} + +function rowRestrict(){ + global $sql,$FANNIE_SERVER_DBMS; + if (strtoupper($FANNIE_SERVER_DBMS) != "MSSQL") return; + $restrictQ = "set rowcount 1"; + $restrictR = $sql->query($restrictQ); +} + +function rowRelease(){ + global $sql,$FANNIE_SERVER_DBMS; + if (strtoupper($FANNIE_SERVER_DBMS) != "MSSQL") return; + $releaseQ = "set rowcount 0"; + $releaseQ = $sql->query($releaseQ); +} + +function syncProductsAllLanes(){ + global $FANNIE_ROOT,$FANNIE_SERVER,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW,$FANNIE_OP_DB,$FANNIE_LANES; + ob_start(); + $table = 'products'; + include($FANNIE_ROOT.'sync/special/products.php'); + ob_end_clean(); +} + +?> diff --git a/fannie/legacy/queries/likeCodes.php b/fannie/legacy/queries/likeCodes.php new file mode 100644 index 000000000..c8be0109b --- /dev/null +++ b/fannie/legacy/queries/likeCodes.php @@ -0,0 +1,114 @@ +"; + $out .= "UPCdescription"; + $q = "select p.upc,p.description from products as p, upcLike as u where p.upc = u.upc and u.likecode = $lc order by p.description"; + $r = $sql->query($q); + while ($w = $sql->fetch_array($r)){ + $out .= ""; + $out .= "$w[0]"; + $out .= "$w[1]"; + $out .= ""; + } + $out .= ""; + break; + + } + + echo $out; + return; +} + +?> + + + + + + + + +query($q); + +echo "

        "; +echo "
        "; +echo "
        "; + +?> + + + diff --git a/fannie/legacy/queries/listDel.php b/fannie/legacy/queries/listDel.php new file mode 100644 index 000000000..f33f8eef3 --- /dev/null +++ b/fannie/legacy/queries/listDel.php @@ -0,0 +1,125 @@ + + + +query($gatherQ); + $gatherRow = $sql->fetch_row($gatherR); + + // log the deletion in prodUpdate. I'm not bothering to pull the like code + // from upcLike since it's an extra query + // 1005 == modified by, since this isn't set up yet + $prodUpQ = "insert into prodUpdate values ( + '$gatherRow[0]', + '$gatherRow[1]', + $gatherRow[2], + $gatherRow[3], + $gatherRow[4], + $gatherRow[5], + $gatherRow[6], + 0, + getdate(), + $uid, + $gatherRow[8], + $gatherRow[9], + $gatherRow[10], + 2 + )"; + $prodUpR = $sql->query($prodUpQ); + + $query = ''; + if (isset($_POST['description'])){ + $desc = base64_decode($_POST['description']); + $query = "delete from products where upc = '$upc' and description='$desc'"; + //echo $query; + //return; + } + else { + $query = "delete from products where upc = '$upc'"; + } + //echo $query; + $result = $sql->query($query); + + $extraQ = "delete from prodExtra where upc='$upc'"; + $extraR = $sql->query($extraQ); + + if (isset($_POST["scale_delete"]) && $_POST["scale_delete"] == "on"){ + $plu = substr($upc,3,4); + include("hobartcsv/parse.php"); + deleteitem($plu); + } + + echo ""; + +} +else if (isset($_POST['No'])){ + echo ""; +} +else { + $upc = $_GET['upc']; + echo "Are you sure you want to delete item $upc"; + + if (isset($_GET['description'])){ + $d = base64_decode($_GET['description']); + echo " ($d)"; + $q = "select normal_price,special_price, + case when tax = 1 then 'Reg' else case when tax = 2 then 'Deli' else 'NoTax' end end as t, + case when foodstamp = 1 then 'Yes' else 'No' end as fs, + case when scale = 1 then 'Yes' else 'No' end as s + from products where upc='$upc' and description='$d'"; + $r = $sql->query($q); + $row = $sql->fetch_row($r); + echo ""; + echo ""; + echo "
        Normal priceSpecial priceTaxFoodstampScale
        $row[0]$row[1]$row[2]$row[3]$row[4]
        "; + } + + echo "

        "; + + echo "

        "; + echo " "; + echo ""; + echo ""; + if (isset($_GET['description'])){ + $desc = $_GET['description']; + echo ""; + } + if (substr($upc,0,3) == "002"){ + echo ""; + echo "Delete from the scales, too"; + } + + echo "
        "; +} +?> + + + diff --git a/fannie/legacy/queries/modified.php b/fannie/legacy/queries/modified.php new file mode 100644 index 000000000..2ca883286 --- /dev/null +++ b/fannie/legacy/queries/modified.php @@ -0,0 +1,17 @@ + 199 order by modified,description"; + +$result = $sql->query($query); + +echo ""; +while($row = $sql->fetch_row($result)){ + echo ""; +} + +echo "
        upcdescriptionpricedepttaxFSscaleqttyEnforceinUse
        $row[0]$row[1]$row[2]$row[3]$row[4]$row[5]$row[6]$row[7]$row[8]
        "; + +?> diff --git a/fannie/legacy/queries/movementLikeCode.php b/fannie/legacy/queries/movementLikeCode.php new file mode 100755 index 000000000..a8ba43f20 --- /dev/null +++ b/fannie/legacy/queries/movementLikeCode.php @@ -0,0 +1,214 @@ += 0 + group by u.likecode,l.likecodedesc + order by $sort $dir"; + //echo $query; + $result = $sql->query($query); + + // make headers sort links + $today = date("F d, Y"); + //Following lines creates a header for the report, listing sort option chosen, report date, date and department range. + echo "Report summed by "; + echo "date on "; + echo "
        "; + echo $today; + echo "
        "; + echo "From "; + print $date1; + echo " to "; + print $date2; + echo "
        "; + + if (!isset($_GET['excel'])){ + echo "
        Save to Excel
        "; + } + + echo ""; + echo ""; + if (!isset($_GET['excel'])){ + if ($sort == "u.likecode"){ + echo ""; + } + else { + echo ""; + } + if ($sort == "l.likeCodeDesc"){ + echo ""; + } + else { + echo ""; + } + if ($sort == "t.department"){ + echo ""; + } + else { + echo ""; + } + if ($sort == "sum(t.quantity)"){ + echo ""; + } + else { + echo ""; + } + if ($sort == "sum(t.total)"){ + echo ""; + } + else { + echo ""; + } + } + else { + echo ""; + } + echo ""; + while ($row = $sql->fetch_array($result)){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + echo "
        LikecodeLikecodeDescriptionDescriptionDeptDeptQtyQtySalesSalesLikecodeDescriptionQtySales
        ".$row[0]."".$row[1]."".$row[2]."".$row[3]."".$row[4]."
        "; + + return; +} + +$lcQ = "select likeCode,likeCodeDesc from likeCodes order by likeCode"; +$lcR = $sql->query($lcQ); +$options = ""; +while ($lcW = $sql->fetch_array($lcR)) + $options .= ""; + +?> + + +Query + + + + + + +
        +
        + + + + + + + + + + + + + + + + +

        Start

        +

        End

        +

        + + +

        +

        + + +

        +
        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
          Excel
        +
        +
        +
        +
        +
        +
        +
        + + + + + + diff --git a/fannie/legacy/queries/pricePerOunce.php b/fannie/legacy/queries/pricePerOunce.php new file mode 100644 index 000000000..33d18be75 --- /dev/null +++ b/fannie/legacy/queries/pricePerOunce.php @@ -0,0 +1,59 @@ + diff --git a/fannie/legacy/queries/prodAllLanes.php b/fannie/legacy/queries/prodAllLanes.php new file mode 100755 index 000000000..954719f8a --- /dev/null +++ b/fannie/legacy/queries/prodAllLanes.php @@ -0,0 +1,46 @@ +query($queryItem); + $num = $sql->num_rows($resultItem); + + if ($num == 0){ + echo "Item $upc not found on Lane ".($i+1)."
        "; + } + else if ($num > 1){ + echo "Item $upc found multiple times on Lane ".($i+1)."
        "; + while ($rowItem = $sql->fetch_array($resultItem)){ + echo "{$rowItem['upc']} {$rowItem['description']}
        "; + } + } + else { + $rowItem = $sql->fetch_array($resultItem); + echo "Item $upc on Lane ".($i+1)."
        "; + echo "Price: {$rowItem['normal_price']}"; + if ($rowItem['special_price'] <> 0){ + echo "    ON SALE: {$rowItem['special_price']}"; + } + echo "
        "; + } + if ($i < count($lanes) - 1){ + echo "
        "; + } + } +} +?> diff --git a/fannie/legacy/queries/prodFunction.php b/fannie/legacy/queries/prodFunction.php new file mode 100755 index 000000000..5d446406f --- /dev/null +++ b/fannie/legacy/queries/prodFunction.php @@ -0,0 +1,563 @@ +"; + echo "function shelftag(u){"; + echo "testwindow= window.open (\"addShelfTag.php?upc=\"+u, \"New Shelftag\",\"location=0,status=1,scrollbars=1,width=300,height=220\");"; + echo "testwindow.moveTo(50,50);"; + echo "}"; + echo ""; + + $barcodeUPC = ltrim($upc,"0"); + echo ""; + echo ""; + + $num = 0; + $resultItem = $sql->query($queryItem); + $num = $sql->num_rows($resultItem); + + $likeCodeQ = "SELECT u.*,l.likeCodeDesc FROM upcLike as u, likeCodes as l + WHERE u.likeCode = l.likeCode and u.upc = '$upc'"; + $likeCodeR = $sql->query($likeCodeQ); + $likeCodeRow= $sql->fetch_row($likeCodeR); + $likeCodeNum = $sql->num_rows($likeCodeR); + + $listCodeQ = "SELECT * from likeCodes"; + $listCodeR = $sql->query($listCodeQ); + $listCodeRow = $sql->fetch_row($likeCodeR); + + if($num == 0) + { + noItem(); + echo "Enter New Item"; + echo ""; + printMods($savedUPC); + echo "Item not found, would you like to enter it?"; + echo "
        "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        UPC +
        Description + Price$
        ManufacturerDistributor 
        "; + echo ""; + echo ""; + echo ""; + $query2 = "SELECT * FROM departments as d, + MasterSuperDepts AS s WHERE s.dept_ID=d.dept_no AND dept_no NOT IN (60,225) + ORDER BY superID, dept_no"; + echo ""; + echo ""; + if ($logged_in){ + echo " "; + echo "
        DeptTaxFSScaleQtyFrcNoDiscLocalLike CodeShelf Tag"; + echo "
        "; + $upc_split = substr($upc,0,7); + $guessQ = "select department from products where upc like '$upc_split%' + group by department + order by count(*) desc"; + $guessR = $sql->query($guessQ); + $guess = 60; + if ($sql->num_rows($guessR) > 0) + $guess = array_pop($sql->fetch_array($guessR)); + $table = "departments"; + $value = "dept_no"; + $label = "dept_name"; + $deptList = "dept"; + query_to_drop($query2,$value,$label,$deptList,$guess); + echo " Reg"; + echo "
        "; + echo "Deli
        "; + echo "No Tax
        "; + //echo ""; + echo ""; + echo "
        "; + } + else { + echo "
        Please "; + echo "login to add items"; + } + + echo "
        "; + + }elseif($num > 1){ + moreItems($upc); + $upcs = array(); + $descriptions = array(); + for($i=0;$i < $num;$i++){ + $rowItem= $sql->fetch_array($resultItem); + $upcs[$i] = $rowItem['upc']; + $descriptions[$i] = $rowItem['description']; + $modified[$i] = $rowItem['modified']; + //echo "" . $upc . " - " . $rowItem['description'] . "
        "; + } + for ($i=0;$i<$num;$i++){ + $dupe = false; + for ($j=0; $j<$num; $j++){ + if ($i != $j and $upcs[$i] == $upcs[$j]){ + $enc = base64_encode($descriptions[$i]); + echo "{$upcs[$i]}-{$descriptions[$i]} - DUPLICATE - "; + echo "
        "; + $j = $num; + $dupe = true; + } + } + if (!$dupe){ + echo "{$upcs[$i]}-{$descriptions[$i]}
        "; + } + } + }else{ + oneItem($upc); + $rowItem = $sql->fetch_array($resultItem); + $upc = $rowItem['upc']; + + + $currentDepartment = $rowItem[12]; + $prev = $next = 0; + $modified = $rowItem['modified']; + deptPrevNext($currentDepartment,$upc,$prev,$next); + $modDate = $modified; + + $likecode = ''; + if(!empty($likeCodeRow[1])) + $likecode = $likeCodeRow[1]; + + //echo $rowItem['upc'] . " - " . $rowItem['description'] . "
        "; + echo "Update Item"; + echo ""; + printMods($savedUPC); + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "Click for Price History"; + $invCheck = "SELECT upc FROM InvCache WHERE upc='$rowItem[0]'"; + $invCheck = $sql->query($invCheck); + if ($sql->num_rows($invCheck) > 0){ + echo "    "; + echo "Click for Order History"; + } + if($rowItem[6] <> 0){ + echo ""; + $findBatchQ = "select batchName from batches as b, batchList as l + where b.batchID = l.batchID and l.upc like '$upc' + AND now() BETWEEN b.startDate AND b.endDate"; + $findBatchR = $sql->query($findBatchQ); + $batchName = ($sql->num_rows($findBatchR) == 0) ? "Unknown" :array_pop($sql->fetch_array($findBatchR)); + if ($batchName == "Unknown" && $likecode != ""){ + $findBatchQ = "select batchName from batches as b, batchList as l + where b.batchID=l.batchID and l.upc = 'LC$likecode' + AND now() BETWEEN b.startDate AND b.endDate"; + $findBatchR = $sql->query($findBatchQ); + $batchName = ($sql->num_rows($findBatchR) == 0) ? "Unknown" :array_pop($sql->fetch_array($findBatchR)); + } + echo ""; + } + } + echo "
        UPC".$rowItem[0].""; + if ($prev != -1) + echo "  Previous"; + if ($next != -1) + echo "  Next"; + echo "
        DescriptionPrice$
        Enable Volume Price "; + echo ""; + echo ""; + echo " for $
        ManufacturerDistributor 
        Sale Price:$rowItem[6]"; + echo "End Date: $rowItem[11]
        Batch: $batchName "; + if (validateUserQuiet('pricechange') || substr($upc,0,3) == "002" ){ + echo "(Take this item off sale now)
        "; + echo ""; + echo ""; + echo ""; + //$dept=$row1[3]; + $query2 = "SELECT * FROM departments as d, + MasterSuperDepts AS s WHERE s.dept_ID=d.dept_no AND dept_no NOT IN (60,225) + ORDER BY superID, dept_no"; + echo ""; + echo ""; + echo "New Shelf Tag"; + echo ""; + echo ""; + echo ""; + echo ""; + echo""; + echo ""; + } + if ($logged_in || (preg_match("/^002/",$rowItem[0]) && $row3[1] == 3)){ + echo " "; + echo ""; + } + return $num; +} + +function likedtotable($query,$border,$bgcolor) +{ + global $sql; + $results = $sql->query($query); + $number_cols = $sql->num_fields($results); + //display query + //echo "query: $query"; + //layout table header + echo "
        DeptTaxFSScaleQtyFrcNoDiscLocalLike Code "; + echo "
        "; + $query3 = "SELECT dept_no,superID FROM departments as d + LEFT JOIN MasterSuperDepts AS s ON d.dept_no=s.dept_ID + WHERE dept_no = $rowItem[12]"; + $result3 = $sql->query($query3); + $row3 = $sql->fetch_array($result3); + $table = "departments"; + $value = "dept_no"; + $label = "dept_name"; + $deptList = "dept"; + $select = $rowItem[12]; + query_to_drop($query2,$value,$label,$deptList,$select); + echo " Reg "; + echo "
        Deli
        NoTax
        "./*what".$rowItem[21].*/""; + //echo ""; + echo ""; + echo ""; + echo "Add like code"; + echo "
        Last Modified: $modDateClick for History
        "; + // kick out a scale input for upcs starting with 002 + // pass variables with prefix s_ + if (preg_match("/^002/",$rowItem[0]) && $row3[1] == 3){ + $scaleQuery = "select * from scaleItems where plu='$rowItem[0]'"; + $scaleRes = $sql->query($scaleQuery); + $scaleRow = $sql->fetch_row($scaleRes); + echo ""; + echo "
        "; + echo "Scale Information:
        "; + echo "UPC: {$rowItem[0]}

        "; + echo ""; + // update: some items might need a longer description + echo "Longer description:"; + // only show a longer description if the description differs + echo "  "; + echo "

        "; + // EXCEPTION PRICE? + // Unnecessary to users but expected by csv package + echo ""; + echo ""; + echo ""; + echo ""; + echo "
        WeightBy CountTareShelf LifeLabelSafehandling
        "; + echo " Random
        "; + } + else { + echo "> Random
        "; + } + echo " Fixed
        "; + } + else { + echo "> Fixed
        "; + } + echo "
        "; + echo ""; + } + else { + echo ">"; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + if ($scaleRow[11] == 0) + echo ""; + else + echo ""; + echo "

        "; + echo "

        Expanded text:
        "; + + echo "

        "; + } + echo "
        "; + echo "Like Code Linked Items Check to not update like code items
        "; + if($likeCodeNum > 0){ + $selLikeQ = "SELECT p.upc,p.description,p.normal_price FROM products as p, upcLike as u WHERE u.upc = p.upc and u.likeCode = $likeCodeRow[1]"; + likedtotable($selLikeQ,0,'FFFFCC'); + echo"Click for Like Code History
        "; + echo " Delete this item | "; + } + else { + echo "
        Please "; + echo "login to change prices"; + } + echo " Back
         
        "; + allLanes($upc); + echo "
        \n"; + echo "\n"; + /*for($i=0; $i<5; $i++) + { + echo "\n"; + } + echo "\n"; *///end table header + //layout table body + while($row = $sql->fetch_row($results)) + { + echo "\n"; + echo "\n"; + } echo "\n"; + } echo "
        " . $sql->field_name($results,$i). "
        "; + if(!isset($row[0])) + { + echo "NULL"; + }else{ + ?> + + + "; + } + for ($i=1;$i<$number_cols-1; $i++) + { + echo ""; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "
        \n"; +} + +function noItem() +{ + echo "No Items Found
        "; +} + +function moreItems($upc) +{ + echo "More than 1 item found for: " . $upc . "
        "; +} + +function oneItem($upc) +{ + //echo "One item found for: " . $upc . "
        "; +} + +function upcCheck($upc){ + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + + $check = 10 - ($sum)%10; + return $check; +} + + +function upcCheckOld($upc) +{ + $dig1 = substr($upc,0,1); + $dig2 = substr($upc,1,1); + $dig3 = substr($upc,2,1); + $dig4 = substr($upc,3,1); + $dig5 = substr($upc,4,1); + $dig6 = substr($upc,5,1); + $dig7 = substr($upc,6,1); + $dig8 = substr($upc,7,1); + $dig9 = substr($upc,8,1); + $dig10 = substr($upc,9,1); + $dig11 = substr($upc,10,1); + $dig12 = substr($upc,11,1); + $dig13 = substr($upc,12,1); + //echo $upc . ": ". $dig1 . " ". $dig2 . " ". $dig3. " ". $dig13 . "
        "; + $mult1 = 3*dig1; + $mult2 = 3*dig2; + $mult3 = 3*dig3; + $mult5 = 3*dig5; + $mult7 = 3*dig7; + $mult9 = 3*dig9; + $mult11 = 3*dig11; + $mult13 = 3*dig13; + + $mod = 10; + + //$preCheck = $mult1+$dig2+$multi3+$dig4+$multi5+$dig6+$multi7+$dig8+$multi9+$dig10+$multi11+$dig12+$mult13; + //echo $upc . " "; + $odd = $dig13+$dig11+$dig9+$dig7+$dig5+$dig3+$dig1; + //echo $odd . " "; + $odd3 = $odd * 3; + //echo $odd3 . " "; + $even = $dig12+$dig10+$dig8+$dig6+$dig4+$dig2; + //echo $even . " "; + $precheck = $odd3+$even; + //echo $precheck . " "; + $modTen = $precheck % $mod; + //echo $modTen . " "; + $checkDigit = 10-$modTen; + //echo $checkDigit . "
        "; + return $checkDigit; +} + +/* for a given upc in a given department, find + * the previous and next upcs in that department + * -1 for a upc value indicates no previous or + * next item. Returns true + */ +function deptPrevNext($dept,$upc,&$prev,&$next){ + global $sql; + $deptQ = "select upc from products where department = $dept order by upc"; + $deptR = $sql->query($deptQ); + $p = -1; + while ($row = $sql->fetch_array($deptR)){ + if ($upc == $row[0]){ + $prev = $p; + break; + } + $p = $row[0]; + } + $row = $sql->fetch_array($deptR); + if ($row) + $next = $row[0]; + else + $next = -1; + + return true; +} + +?> diff --git a/fannie/legacy/queries/productTest.php b/fannie/legacy/queries/productTest.php new file mode 100644 index 000000000..cf6789b4f --- /dev/null +++ b/fannie/legacy/queries/productTest.php @@ -0,0 +1,89 @@ + + + + + + +"; +echo "function delete_popup(upc,description){"; +echo "testwindow= window.open (\"listDel.php?upc=\"+upc+\"&description=\"+description, upc+description,\"location=0,status=1,scrollbars=1,width=600,height=200\");"; +//echo "testwindow.moveTo(50,50);"; +echo "if (!testwindow.opener)\n"; +echo "testwindow.opener = self;"; +echo "}"; +echo ""; +?> + +"; +echo ""; +echo "
        "; + +if(isset($_POST['submit'])){ + $upc = $_POST['upc']; +// if(isset($_GET['upc'])){ +// $upc=$_GET['upc']; +// } + if (isset($_POST['prefix'])){ + itemParse($upc,'no','',true); + } + else { + itemParse($upc); + } +// echo $num; + +}elseif(isset($_GET['upc'])){ + $upc = $_GET['upc']; + //echo $upc; + itemParse($upc); + +}else{ + + + +//echo $upc; +echo "Edit Item"; +echo ""; +echo ""; +echo " Enter + or product name here
        "; + +echo ""; +echo ""; +echo "Small-screen"; +} +echo "
        "; +echo ""; +echo ""; +?> diff --git a/fannie/legacy/queries/salesToday.php b/fannie/legacy/queries/salesToday.php new file mode 100644 index 000000000..19c7c09f8 --- /dev/null +++ b/fannie/legacy/queries/salesToday.php @@ -0,0 +1,40 @@ +query($query1); +$result2=$sql->query($query2); +$num1 = $sql->num_rows($result1); +$row2 = $sql->fetch_row($result2); + +echo "

        Today's Sales!

        "; +echo ""; +echo ""; +while($row1 = $sql->fetch_row($result1)){ + echo ""; +} +echo ""; +echo "
        HourSales
        ".$row1[0]."".$row1[1]."
        $row2[0]
        "; + +?> diff --git a/fannie/legacy/queries/salesTodayDeli.php b/fannie/legacy/queries/salesTodayDeli.php new file mode 100644 index 000000000..b1201103d --- /dev/null +++ b/fannie/legacy/queries/salesTodayDeli.php @@ -0,0 +1,46 @@ +query($query1); +$result2=$sql->query($query2); +$num1 = $sql->num_rows($result1); +$row2 = $sql->fetch_row($result2); + +echo "

        Today's Deli Sales!

        "; +echo ""; +echo ""; +while($row1 = $sql->fetch_row($result1)){ + echo ""; +} +echo ""; +echo "
        HourSales
        ".$row1[0]."".$row1[1]." (".round($row1[1]/$row1[2]*100,2)."%)
        Total$row2[0] (".round($row2[0]/$row2[1]*100,2)."%)
        "; + +?> diff --git a/fannie/legacy/queries/salesTodayMoff.php b/fannie/legacy/queries/salesTodayMoff.php new file mode 100644 index 000000000..908fd450f --- /dev/null +++ b/fannie/legacy/queries/salesTodayMoff.php @@ -0,0 +1,44 @@ +query($query1); +$result2=$sql->query($query2); +$num1 = $sql->num_rows($result1); +$row2 = $sql->fetch_row($result2); + +echo "

        Today's MOFF Sales!

        "; +echo ""; +echo ""; +while($row1 = $sql->fetch_row($result1)){ + echo ""; +} +echo ""; +echo "
        HourSales
        ".$row1[0]."".$row1[1]." (".round($row1[1]/$row1[2]*100,2)."%)
        $row2[0] (".round($row2[0]/$row2[1]*100,2)."%)
        "; + +?> diff --git a/fannie/legacy/queries/salesTodayProduce.php b/fannie/legacy/queries/salesTodayProduce.php new file mode 100644 index 000000000..2ba5c82df --- /dev/null +++ b/fannie/legacy/queries/salesTodayProduce.php @@ -0,0 +1,46 @@ +query($query1); +$result2=$sql->query($query2); +$num1 = $sql->num_rows($result1); +$row2 = $sql->fetch_row($result2); + +echo "

        Today's Produce Sales!

        "; +echo ""; +echo ""; +while($row1 = $sql->fetch_row($result1)){ + echo ""; +} +echo ""; +echo "
        HourSales
        ".$row1[0]."".$row1[1]." (".round($row1[1]/$row1[2]*100,2)."%)
        Total$row2[0] (".round($row2[0]/$row2[1]*100,2)."%)
        "; + +?> diff --git a/fannie/legacy/queries/scaleList.php b/fannie/legacy/queries/scaleList.php new file mode 100644 index 000000000..397269b60 --- /dev/null +++ b/fannie/legacy/queries/scaleList.php @@ -0,0 +1,79 @@ +Deli Scale Items"; + +// connect to the database +if (!class_exists("SQLManager")) require_once($IS4C_ROOT."src/SQLManager.php"); +include('../db.php'); + +// records per page, not in use right now +$perpage = 25; + +// order results by either plu or item description +$orderby = 'plu'; +if (isset($_GET['orderby'])){ + $orderby = $_GET['orderby']; +} + +// sort ascending or descending +$sort = "Asc"; +if (isset($_GET['sort'])){ + $sort = $_GET['sort']; +} + +// resorting the currently selected column changes +// its sorting order. defaults to ascending +$upcsort = "Asc"; +if ($orderby == 'plu' and $sort == 'Asc'){ + $upcsort = "Desc"; +} + +$itemsort = "Asc"; +if ($orderby == 'itemdesc' and $sort == 'Asc'){ + $itemsort = "Desc"; +} + +// current query gets plus and descriptions, ordered as specified +// commented out one is for paging +//$query = "select top $perpage plu, itemdesc from scaleItems order by $orderby $sort"; +$query = "select plu,itemdesc from + scaleItems + order by $orderby $sort"; +$result = $sql->query($query); + +// table 'header' +// puts sorting links over columns +echo ""; +echo ""; +echo ""; +echo ""; +echo ""; + +// kick out the query results into the table +// link the plus to their price change page +while ($row = $sql->fetch_row($result)){ + echo ""; + echo ""; + echo ""; + echo ""; +} +echo "
        UPCDescription
        $row[0]$row[1]
        "; + +// paging is ridiculous in sql server... +// so it isn't happening right now +// but this gets the number of records +$query = "select count(plu) from scaleItems"; +$result = $sql->query($query); +$row = $sql->fetch_row($result); +// and this divides to determine the number of pages +$pagecount = ceil($row[0] / $perpage); + +echo "

        "; +echo "Send all items to the scales
        "; +echo "Send all items as new"; + +// wrap up html +echo ""; + +?> diff --git a/fannie/legacy/queries/scaleSynch.php b/fannie/legacy/queries/scaleSynch.php new file mode 100644 index 000000000..b7216a323 --- /dev/null +++ b/fannie/legacy/queries/scaleSynch.php @@ -0,0 +1,79 @@ +query($q); +$row = $sql->fetch_array($r); + +$plu = array(); +$price = array(); +$itemdesc = array(); +$exceptionprice = array(); +$weight = array(); +$bycount = array(); +$tare = array(); +$shelflife = array(); +$text = array(); +$graphics = array(); +$label = array(); + +$count = 0; +while ($row = $sql->fetch_array($r)){ + if ($row[1] == 0) + continue; + $plu[$count] = substr($row[0],3,4); + $price[$count] = rtrim($row[1],' '); + $itemdesc[$count] = $row[2]; + $exceptionprice[$count] = rtrim($row[3],' '); + if ($row[4] == 0){ + $weight[$count] = "Random Weight"; + } + else { + $weight[$count] = "Fixed Weight"; + } + $bycount[$count] = $row[5]; + $tare[$count] = rtrim($row[6],' '); + $shelflife[$count] = $row[7]; + $text[$count] = $row[8]; + $label[$count] = $row[10]; + if ($row[11] == 0) + $graphics[$count] = false; + else + $graphics[$count] = $row[11]; + $count++; +} + +echo "Items sent to the scale:
        "; +echo ""; +echo ""; +echo ""; +echo ""; +for ($i = 0; $i < count($plu); $i++){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + //parseitem('ChangeOneItem',$plu[$i],$itemdesc[$i],$tare[$i],$shelflife[$i],$price[$i],$bycount[$i],$weight[$i],$exceptionprice[$i],$text[$i],$label[$i],$graphics[$i]); +} +echo "
        upcpricedescriptionexception priceweightby counttareshelf lifetext
        $plu[$i]$price[$i]$itemdesc[$i]$exceptionprice[$i]$weight[$i]$bycount[$i]$tare[$i]$shelflife[$i]$text[$i]
        "; + +if (isset($_GET['asnew'])){ + parseitem('WriteOneItem',$plu,$itemdesc,$tare,$shelflife,$price,$bycount,$weight,$exceptionprice,$text,$label,$graphics); +} +else { + parseitem('ChangeOneItem',$plu,$itemdesc,$tare,$shelflife,$price,$bycount,$weight,$exceptionprice,$text,$label,$graphics); +} + +?> diff --git a/fannie/legacy/queries/spotlight/index.php b/fannie/legacy/queries/spotlight/index.php new file mode 100644 index 000000000..e8d74b076 --- /dev/null +++ b/fannie/legacy/queries/spotlight/index.php @@ -0,0 +1,122 @@ + +Product spotlight + + + +

        +UPC(s): + +

        +query($prods); +echo "

        Product(s)

        "; +while($row = $sql->fetch_row($res)){ + echo "
      • ".$row[1]."
      • "; +} + +$this_month = date("F Y"); +$last_month = date("F Y",mktime(0,0,0,date('n')-1,1,date("Y"))); + +$allSalesQ = "SELECT datepart(dw,tdate),datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate), + sum(case when d.trans_status='M' then itemqtty else quantity end) as qty + FROM dlog_90_view as d + WHERE $where + GROUP BY datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate),datepart(dw,tdate) + ORDER BY datepart(yy,tdate),datepart(mm,tdate),datepart(dd,tdate)"; +$allSalesR = $sql->query($allSalesQ); +$data = array(); +while($row = $sql->fetch_row($allSalesR)){ + $data[] = array( + 'date' => mktime(0,0,0,$row[2],$row[3],$row[1]), + 'day' => $row[0], + 'sales' => $row[4] + ); +} + +echo "

        Weekly sales"; +echo " + + + "; +$week = array(); +$sum = 0; +$day = 1; +$date = mktime(0,0,0,date('n'),date('j')-90,date('Y')); +$start = $date; +if (date('N',$date) != 7){ + for($i=0;$i"; + +function printweek($start,$end,$week,$sum){ + global $c; + printf("", + ($c==0)?'one':'two',date('n/j',$start),date('n/j',$end)); + foreach($week as $w) echo ""; + printf("",$sum); + $c = ($c+1)%2; +} + +?> diff --git a/fannie/legacy/queries/testSales.php b/fannie/legacy/queries/testSales.php new file mode 100644 index 000000000..bcccc5687 --- /dev/null +++ b/fannie/legacy/queries/testSales.php @@ -0,0 +1,47 @@ +"; +/*echo ""; +item_sales_month($upc,$day,$time0); +echo "*/echo ""; +$function($upc,$day,$time1); +echo ""; +$function($upc,$day,$time2); +echo ""; +$function($upc,$day,$time3); +echo ""; +$function($upc,$week,$time0); +echo ""; +$function($upc,$week,$time1); +echo ""; +$function($upc,$period,$time0); +echo ""; +$function_last_month($upc,$period,$time1); +echo "
        WeekSMTWTFSTotal
        %s - %s$w%.2f
         QtySales
        Today
        Yesterday
        2 Days ago
        3 Days ago
        This Week
        Last Week
        This Month
        Last Month
        "; +?> diff --git a/fannie/legacy/queries/trash.png b/fannie/legacy/queries/trash.png new file mode 100644 index 000000000..d21645a31 Binary files /dev/null and b/fannie/legacy/queries/trash.png differ diff --git a/fannie/legacy/queries/unsale.php b/fannie/legacy/queries/unsale.php new file mode 100644 index 000000000..6c2937ca1 --- /dev/null +++ b/fannie/legacy/queries/unsale.php @@ -0,0 +1,86 @@ +"; + echo "
        "; + echo "
        "; + echo ""; + echo ""; + echo " "; + echo "
        "; + echo "
        "; + echo "
        "; + echo ""; + echo ""; + echo "
        "; + echo "
        "; +} +else { + if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."sql/SQLManager.php"); + include('../db.php'); + + // find the discount type for the selected upc + $discountQ = "select discounttype from products where upc = '$upc'"; + $discountR = $sql->query($discountQ); + $discountRow = $sql->fetch_array($discountR); + $discounttype = $discountRow['discounttype']; + + // find the batchID(s) of active batches + // containing the upc + $batchIDQ = "select b.batchID from batches as b, batchList as l where + b.batchID = l.batchID and l.upc = '$upc' and b.discounttype = $discounttype + and datediff(dd,getdate(),b.startdate) < 1 + and datediff(dd,getdate(),b.enddate) > 0"; + echo $batchIDQ."

        ";; + $batchIDR = $sql->query($batchIDQ); + + // if there isn't a batch putting that item on sale, then + // i don't know what's going on. SO DON'T CHANGE ANYTHING + if ($sql->num_rows($batchIDR) != 0){ + // now delete the upc from the batch list(s) + while ($row = $sql->fetch_array($batchIDR)){ + $batchID = $row['batchID']; + $batchQ = "delete from batchList where + upc = '$upc' and batchID = $batchID"; + echo $batchQ."

        "; + $batchR = $sql->query($batchQ); + } + + // take the item off sale in products + $unsaleQ = "update products set start_date = 0, end_date = 0, + discounttype = 0, special_price = 0 + where upc = '$upc'"; + echo $unsaleQ."

        "; + $unsaleR = $sql->query($unsaleQ); + + // fire change to the lanes + require('laneUpdates.php'); + updateProductAllLanes($upc); + + echo "Item $upc is no longer on sale "; + } + else if (isset($_GET['force'])){ + // take the item off sale in products + $unsaleQ = "update products set start_date = 0, end_date = 0, + discounttype = 0, special_price = 0 + where upc = '$upc'"; + echo $unsaleQ."

        "; + $unsaleR = $sql->query($unsaleQ); + + // fire change to the lanes + require('laneUpdates.php'); + updateProductAllLanes($upc,$db); + + echo "Item $upc is no longer on sale "; + } + else { + echo "Item $upc doesn't appear to be on sale "; + echo "
        Force unsale"; + } +} + +?> diff --git a/fannie/legacy/queries/updateItemTest.php b/fannie/legacy/queries/updateItemTest.php new file mode 100755 index 000000000..e708a4520 --- /dev/null +++ b/fannie/legacy/queries/updateItemTest.php @@ -0,0 +1,413 @@ + + + + + + + +"; + +if (!class_exists("SQLManager")) require_once($FANNIE_ROOT."src/SQLManager.php"); +include('../db.php'); +//$descr = $_POST['descript'] ; +//$price = $_POST['price']; + +//$db2=$sql->connect('129.103.2.11','sa'); +//$sql->select_db('POSBDAT',$db2); + +//$db3=$sql->connect('129.103.2.12','sa'); +//$sql->select_db('POSBDAT',$db3); + +/*$db1=$sql->connect('129.103.2.99','sa'); +$sql->select_db('POSBDAT',$db1); +*/ +extract($_POST); + +//echo $today; + +$Scale = (isset($_POST["Scale"])) ? 1 : 0; +$FS = (isset($_POST["FS"])) ? 1 : 0; +$NoDisc = (isset($_POST["NoDisc"])) ? 0 : 1; +$inUse = (isset($_POST["inUse"])) ? 1 : 0; +$QtyFrc = (isset($_POST["QtyFrc"])) ? 1 : 0; +$local = (isset($_POST["local"])) ? 1 : 0; + +/* if the user isn't validated but is logged in, then + they don't have permission to change prices on all + items. So get the sub department and check that. +*/ +$deptSubQ = "select superID from MasterSuperDepts where dept_ID = $dept"; +$deptSubR = $sql->query($deptSubQ); +$deptSubW = $sql->fetch_array($deptSubR); +$deptSub = $deptSubW[0]; +if (!$validatedUser && !$auditedUser && $logged_in){ + $validatedUser = validateUserQuiet('pricechange',$deptSub); +} + +$uid = 1005; +if ($validatedUser){ + $validatedUID = getUID($validatedUser); + $uid = $validatedUID; +} +elseif ($auditedUser){ + $auditedUID = getUID($auditedUser); + $uid = $auditedUID; + include('audit.php'); + if (!empty($likeCode)) + audit($deptSub,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc,$likeCode); + else + audit($deptSub,$auditedUser,$upc,$descript,$price,$tax,$FS,$Scale,$NoDisc); +} + +if (!$validatedUser && !$auditedUser && substr($upc,0,3) != "002"){ + echo "Please "; + echo ""; + echo "login to add new items"; + return; +} + +$price_method=0; +$vol_price = 0; +$vol_qtty = 0; +if (isset($_POST['doVolume']) && isset($_POST['vol_price']) && isset($_POST['vol_qtty'])){ + $price_method=2; + if (isset($_POST["pricemethod"]) && $_POST["pricemethod"] != 0) + $price_method = $_POST["pricemethod"]; + $vol_price = $_POST['vol_price']; + $vol_qtty = $_POST['vol_qtty']; +} +if (empty($vol_price) || $vol_price == 0) { + $price_method = 0; + $vol_price = 0; +} +if (empty($vol_qtty) || $vol_qtty == 0){ + $price_method = 0; + $vol_qtty = 0; +} + +$descript = $sql->escape($descript); + +$query = "UPDATE products + SET description = $descript, + normal_price=$price, + tax='$tax', + Scale='$Scale', + foodstamp='$FS', + department = '$dept', + inUse = '$inUse', + modified= getdate(), + qttyEnforced = '$QtyFrc', + discount='$NoDisc', + pricemethod='$price_method', + groupprice=$vol_price, + quantity='$vol_qtty', + local=$local + where upc ='$upc'"; +//echo $query; + +$query1 = "INSERT INTO prodUpdate + VALUES('$upc',$descript, + $price,$dept, + $tax,$FS, + $Scale, + $likeCode, + getdate(), + $uid, + $QtyFrc, + $NoDisc, + $inUse) + "; +//////////echo $query1; +//$resultU = $sql->query($query1,$db); +$result1 = $sql->query($query1); + +$result = $sql->query($query); + +if (empty($manufacturer)) + $manufacturer = ''; +if (empty($distributor)) + $distributor = ''; +$manufacturer = str_replace("'","",$manufacturer); +$distributor = str_replace("'","",$distributor); +$extraQ = "update prodExtra set manufacturer='$manufacturer',distributor='$distributor' where upc='$upc'"; +$extraR = $sql->query($extraQ); + +require('laneUpdates.php'); +updateProductAllLanes($upc); + +$query1 = "SELECT * FROM products WHERE upc = '$upc'"; +$result1 = $sql->query($query1); +$row = $sql->fetch_array($result1); +//echo '
        '.$query1; +//$modDateQ = "SELECT MAX(modified) FROM prodUpdate WHERE upc = '$upc'"; +//echo $modDateQ; +//$modDateR = $sql->query($modDateQ); +//$modDateW = $sql->fetch_row($modDateR); +//$strMod = strtotime($modDateW[0]); +//echo $strMod; +//echo $row['modified']; +$strMod = strtotime($row['modified']); +//echo $strMod; +//$modDate = date('Y-m-j h:i:s',$strMod); +//echo $modDate; + +$modDate = $row['modified']; + +// Hobart Scale stuff +// send data to scales if appropriate fields +// are present +if (!empty($s_plu)){ + // grab price, item description from the main input + // fields. This eliminates the need for separate + // inputs for these values on the scale input form + // (reducing necessary input AND chances of mismatches) + $s_itemdesc = $descript; + if ($s_longdesc != ""){ + $s_itemdesc = $dbc->escape($s_longdesc); + } + $s_price = trim($price," "); + + // bycount is a simple boolean in the db + // set $bc 0 or 1 accordingly + $s_bycount = ""; + if (isset($_POST["s_bycount"])) $s_bycount = $_POST["s_bycount"]; + $bc = 0; + if ($s_bycount == "on"){ + $bc = 1; + } + // weight is also a simple boolean in the db + $wt = 0; + if ($s_type == "Fixed Weight"){ + $wt = 1; + } + $tare = 0; + if (!empty($s_tare)){ + $tare = $s_tare; + } + if (!isset($s_text)){ + $s_text = " "; + } + $shelflife = 0; + if (!empty($s_shelflife)){ + $shelflife = $s_shelflife; + } + if (!is_numeric($shelflife)){ + if (preg_match("/(\d*).*/",$shelflife,$matches) == 1) + $shelflife = $matches[1]; + else + $shelflife = 0; + } + + $s_label = 103; + if ($s_label == "horizontal" && $s_type == "Random Weight") + $s_label = 133; + elseif ($s_label == "horizontal" && $s_type == "Fixed Weight") + $s_label = 63; + elseif ($s_label == "vertical" && $s_type == "Random Weight") + $s_label = 103; + elseif ($s_label == "vertical" && $s_type == "Fixed Weight") + $s_label = 23; + + $graphics = 0; + $s_graphics = ""; + if (isset($_POST["s_graphics"])) $s_graphics = $_POST["s_graphics"]; + if ($s_graphics == "on"){ + $graphics = 121; + $s_label = 53; + } + + // for right now, check if the item is in the scaleItems + // table and add it if it isn't + // otherwise, update the row + $scaleQuery = "Select plu from scaleItems where plu='{$s_plu}'"; + $scaleRes = $sql->query($scaleQuery); + $nr = $sql->num_rows($scaleRes); + + /* apostrophe filter */ + $s_itemdesc = str_replace("'","",$s_itemdesc); + $s_text = str_replace("'","",$s_text); + $s_itemdesc = str_replace("\"","",$s_itemdesc); + $s_text = str_replace("\"","",$s_text); + + if ($nr == 0){ + $scaleQuery = "insert into scaleItems (plu,price,itemdesc,exceptionprice, + weight,bycount,tare,shelflife,text,label,graphics) + values + ('$s_plu',$s_price,'$s_itemdesc', + $s_exception,$wt,$bc,$tare, + $shelflife,'$s_text',$s_label,$graphics)"; + //echo $scaleQuery; + $scaleRes = $sql->query($scaleQuery); + } + else { + $scaleQuery = "update scaleItems set + price = $s_price, + itemdesc = '$s_itemdesc', + exceptionprice = $s_exception, + weight = $wt, + bycount = $bc, + tare = $tare, + shelflife = $shelflife, + text = '$s_text', + label = $s_label, + graphics = $graphics + where plu = '$s_plu'"; + //echo $scaleQuery; + $scareRes = $sql->query($scaleQuery); + } + + $datetime = date("m/d/Y h:i:s a"); + $fp = fopen('hobartcsv/query.log','a'); + fwrite($fp,"$datetime\n$scaleQuery\n\n"); + fclose($fp); + + // trim the upc down to size + // grabbing the 4 or 5 non-zero digits after the 2 + // might just need 4, ask chris + preg_match("/002(\d\d\d\d)0/",$s_plu,$matches); + $s_plu = $matches[1]; + + //echo "
        plu ".$s_plu; + + // hobart csv functionality + include('hobartcsv/parse.php'); + + // generate csv files and place them in the + // DGW import directory + parseitem('ChangeOneItem',$s_plu,$s_itemdesc,$tare,$shelflife,$s_price, + $s_bycount,$s_type,$s_exception,$s_text,$s_label,$graphics); +} + + +if(!empty($likeCode)){ + if ($likeCode == -1){ + $updateLikeQ = "delete from upcLike where upc='$upc'"; + $updateLikeR = $sql->query($updateLikeQ); + } + else if(!isset($update)){ + //Update all like coded items to $upc + $likeQuery = "UPDATE products SET normal_price = $price,department = '$dept',tax = '$tax',scale='$Scale',foodstamp='$FS',inUse='$inUse', modified = '$modDate' , + pricemethod='$price_method',groupprice=$vol_price,quantity='$vol_qtty',local=$local + FROM products as p, upcLike as u WHERE u.upc = p.upc and u.likeCode = '$likeCode'"; + + //echo $likeQuery; + $likeResult = $sql->query($likeQuery); + + + //INSERTED HERE TO INSERT UPDATE INTO prodUpdate for likecoded items. + // and push updates to the lanes + $selectQ = "SELECT u.* FROM upcLike as u inner join products as p + on u.upc=p.upc WHERE likecode = $likeCode"; + //echo $selectQ; + $selectR = $sql->query($selectQ); + while($selectW = $sql->fetch_array($selectR)){ + $upcL = $selectW['upc']; + if($upcL != $upc){ + $insQ= "INSERT INTO prodUpdate SELECT upc, description,normal_price,department,tax,foodstamp,scale,$likeCode,getdate(),$uid,qttyEnforced,discount,1 + FROM products where upc = '$upcL'"; + $insR= $sql->query($insQ); + //echo $selectQ . "
        "; + updateProductAllLanes($upcL); + } + } + + //check to see if $upc exists in upcLike, if not, then add it to upcLike + $checkLikeQ = "SELECT * FROM upcLike WHERE upc = '$upc'"; + $checkLikeR = $sql->query($checkLikeQ); + $checkLikeN = $sql->num_rows($checkLikeR); //returns 0 if not in upcLike + + //echo $upc." ".$checkLikeN."
        "; + if($checkLikeN == 0){ + $updateLikeQ = "INSERT INTO upcLike VALUES('$upc','$likeCode')"; + $updateLikeR = $sql->query($updateLikeQ); + } + else { + $updateLikeQ = "Update upcLike set likeCode=$likeCode where upc='$upc'"; + //echo $updateLikeQ; + $updateLikeR = $sql->query($updateLikeQ); + } + // more than one item may have been changed. Push the whole table to the lanes + exec("touch /pos/sync/scheduled/products"); + } +} + +echo ""; + echo ""; + echo ""; + echo "
        UPC".$row[0]."
        Description$row[1]Price$$row[2]
        "; + echo ""; + echo ""; + echo ""; + $dept=$row[12]; + $query2 = "SELECT * FROM departments where dept_no = $dept"; + $result2 = $sql->query($query2); + $row2 = $sql->fetch_array($result2); + echo ""; + echo ""; + //echo ""; + //echo ""; + echo ""; + echo ""; + echo "
        DeptTaxFSScale"; + echo "
        "; + echo $dept . ' ' . + $row2['dept_name']; + echo " "; + echo "Reg
        Deli
        "; + echo "No Tax
        " . $row[4] . "" . $row[5]. "" . $row[6] ."" . $row[7] . "" . $row[8] . "
        " . $row[9] . "" . $row[10] . "" . $row[11] . "" . $row[12] . "
        Last Modified$modDate
        "; + //echo "I am here."; + echo "


        "; + echo "
        "; + echo " Enter here
        "; + echo ""; + echo "
        "; + +?> diff --git a/fannie/legacy/styles.css b/fannie/legacy/styles.css new file mode 100644 index 000000000..eb7185eac --- /dev/null +++ b/fannie/legacy/styles.css @@ -0,0 +1,196 @@ +body { + font-family: Arial, Helvetica, sans-serif; + font-size: 14px; + margin-top: 2px; + margin-left: 4px; + margin: 4px; + color: #000000; +} + +a { + text-decoration:none +} + +#logo { + position: absolute; + left:4px; + top: 4px; +} + +#main { + position: absolute; + left: 10px; + top: 150px; + width: 250px; +} + +#docmain { + position: absolute; + left: 10px; + top: 50px; + width: 700px; +} + +#doctext { + position: relative; + left: 20px; +} +#comment{ + position:absolute; + left: 180px; + font-size:12px; + text-align: left; +} + +#products{ + position: absolute; + left: 10px; + top : 150px; +} +#comment1{ + position:absolute; + left:275px; + top:200px; + text-align:left; + border: double 2px brown; + padding: 3px; +} + +#textwlogo{ + position: absolute; + left:5px; + top: 120px; + width: 500px; +} +p.rmargin { + position: absolute; + left: 10px; + top: 120px; + margin-right: 5% +} + +p.logfail{ + position: absolute; + left: 10px; + top: 175px; + font-weight:bold; + color:#FF3333 +} + p.message{ + position: absolute; + left: 10px; + top: 175px; + color: #003399; + } + + p.info{ + position: absolute; + left: 10px; + top: 150px; + font-size:10px; + } + +a { + color: #663300; +} + +a active visited{ + color: #663300; +} + +p.email{ + position: absolute; + left: 10px; + top:450px +} + +img.logo{ + position: absolute; + left: 10px; + top: 10px +} + +form.login{ + position: absolute; + left: 10px; + top: 200px; +} + +td { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +th { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.bodystyle { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.small { + font-family: Arial, Helvetica, sans-serif; + font-size: 9px; +} + +.medium { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.big { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; +} + +.xbig { + font-family: Arial, Helvetica, sans-serif; + font-size: 24px; +} + +.expanded { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 24px; + letter-spacing: 2px; +} + +.justified { + font-family: Arial, Helvetica, sans-serif; + text-align: justify; +} + +.footer { + font-family: "Times New Roman", Times, serif; + font-size: 9px; + color: #999999; +} + +.box1 { + padding: 3px; + border-width: medium; + border-style: solid; + border-color: #CCCCCC #666666 #666666 #CCCCCC; +} + +.box2 { + font-style: italic; + word-spacing: 2pt; + padding: 3px; + border: 1px solid; +} + +.white{ + color: white; + font-size: 14px; +} + +.store { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + font-weight: bold; + color: #A46833; +} diff --git a/pos/license/license.txt b/fannie/license/license.txt old mode 100755 new mode 100644 similarity index 100% rename from pos/license/license.txt rename to fannie/license/license.txt diff --git a/fannie/logs/.gitignore b/fannie/logs/.gitignore new file mode 100644 index 000000000..2ebe1a99c --- /dev/null +++ b/fannie/logs/.gitignore @@ -0,0 +1,2 @@ +*.log* +*.log diff --git a/fannie/logs/LogViewer.php b/fannie/logs/LogViewer.php new file mode 100644 index 000000000..5f59f4eda --- /dev/null +++ b/fannie/logs/LogViewer.php @@ -0,0 +1,150 @@ +mode = 'show'; + if (FormLib::get_form_value('rotate',False) !== False) + $this->doRotate(base64_decode($fn),$FANNIE_LOG_COUNT); + } + return True; + } + + function body_content(){ + if ($this->mode == 'list') + return $this->list_content(); + elseif ($this->mode == 'show') + return $this->show_content(); + } + + function list_content(){ + $ret = "Choose a log file:
          "; + $dh = opendir("."); + while(($file = readdir($dh)) !== false){ + if ($file[0] == "." || $file == "index.php" || $file == 'LogViewer.php') + continue; + if (is_numeric(substr($file,-1))) // log rotations + continue; + if (is_dir($file)) // someone put a directory here + continue; + $ret .= sprintf('
        • %s
        • ', + $_SERVER['PHP_SELF'], + base64_encode($file), + $file); + } + $ret .= "
        "; + return $ret; + } + + function css_content(){ + if ($this->mode == 'show'){ + // force word wrap + return ' + pre { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + } + '; + } + return ''; + } + + function show_content(){ + global $FANNIE_PRETTY_LOGS,$FANNIE_URL; + + $fn = base64_decode(FormLib::get_form_value('logfile')); + $fp = @file_get_contents($fn); + + $ret = 'Back to listing'; + if ($fp){ + $ret .= '     '; + $ret .= sprintf('Rotate + log',base64_encode($fn)); + } + $ret .= '
        '; + if ($fp === false) $ret .= "Error opening logfile
        "; + elseif (empty($fp)) $ret .= "File is empty
        "; + else { + + if ($FANNIE_PRETTY_LOGS != 0){ + $this->add_script($FANNIE_URL.'src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.min.js'); + $highlite_cmd = sprintf(' + $.SyntaxHighlighter.init({ + \'baseUrl\' : \'%s\', + \'prettifyBaseUrl\': \'%s\' + });', + $FANNIE_URL.'src/jquery/jQuery-SyntaxHighlighter', + $FANNIE_URL.'src/jquery/jQuery-SyntaxHighlighter/prettify'); + $this->add_onload_command($highlite_cmd); + } + + $ret .= '
        ';
        +			$ret .= $fp;
        +			$ret .= '
        '; + } + + return $ret; + } + + function doRotate($fn,$limit){ + // don't rotate empty files + if (filesize($fn) == 0) return False; + + for($i=$limit-1; $i>=0; $i--){ + if (file_exists($fn.".".$i)) + rename($fn.".".$i,$fn.".".($i+1)); + } + + if (file_exists($fn)) + rename($fn,$fn.".0"); + + $fp = fopen($fn,"w"); + fclose($fp); + + return True; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new LogViewer(); + $obj->draw_page(); +} +?> diff --git a/fannie/logs/index.php b/fannie/logs/index.php new file mode 100644 index 000000000..85e3c9223 --- /dev/null +++ b/fannie/logs/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/logs/nightlylog.txt b/fannie/logs/nightlylog.txt new file mode 100644 index 000000000..e69de29bb diff --git a/fannie/mem/MemCorrectionIndex.php b/fannie/mem/MemCorrectionIndex.php new file mode 100644 index 000000000..4394d65e9 --- /dev/null +++ b/fannie/mem/MemCorrectionIndex.php @@ -0,0 +1,55 @@ + + + msgs.ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemCorrectionIndex(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/MemStatusEditor.php b/fannie/mem/MemStatusEditor.php new file mode 100644 index 000000000..7f37ec3a5 --- /dev/null +++ b/fannie/mem/MemStatusEditor.php @@ -0,0 +1,183 @@ +cardno = FormLib::get_form_value('memID',False); + + + if (FormLib::get_form_value('savebtn',False) !== False){ + $reason = 0; + $codes = FormLib::get_form_value('rcode',array()); + $type = FormLib::get_form_value('type','INACT'); + if (is_array($codes)){ + foreach($codes as $r) + $reason = $reason | $r; + } + + if ($reason == 0) + $this->reactivate_account($this->cardno); + else + $this->deactivate_account($this->cardno, $reason, $type); + + header("Location: MemberEditor.php?memNum=".$this->cardno); + return False; + } + return True; + } + + function body_content(){ + global $FANNIE_OP_DB; + + if ($this->cardno === False){ + return 'Error - no member specified'; + } + + $dbc = FannieDB::get($FANNIE_OP_DB); + $ret = sprintf('

        Account #%d

        ',$this->cardno); + $ret .= '
        '; + $ret .= sprintf('',$this->cardno); + + $statusQ = $dbc->prepare_statement("SELECT Type FROM custdata WHERE CardNo=?"); + $statusR = $dbc->exec_statement($statusQ,array($this->cardno)); + $status_string = array_pop($dbc->fetch_row($statusR)); + + $reasonQ = $dbc->prepare_statement("SELECT textStr,mask, + CASE WHEN cardno IS NULL THEN 0 ELSE 1 END as checked + FROM reasoncodes AS r LEFT JOIN suspensions AS s + ON s.cardno=? AND r.mask & s.reasoncode <> 0 + ORDER BY mask"); + $reasonR = $dbc->exec_statement($reasonQ,array($this->cardno)); + $ret .= ''; + $ret .= ''; + while($reasonW = $dbc->fetch_row($reasonR)){ + $ret .= sprintf('', + $reasonW['mask'], + ($reasonW['checked']==1?'checked':''), + $reasonW['textStr'] + ); + } + $ret .= '
        Mode
        + %s

        '; + $ret .= ''; + $ret .= '
        '; + + return $ret; + } + function reactivate_account($cardno){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + // fetch stored values + $valQ = $dbc->prepare_statement("SELECT memtype1,memtype2,mailflag,discount,chargelimit + FROM suspensions WHERE cardno=?"); + $valR = $dbc->exec_statement($valQ,array($cardno)); + $valW = $dbc->fetch_row($valR); + + // restore stored values + $fixQ = $dbc->prepare_statement("UPDATE custdata SET Type=?, memType=?, + Discount=?, memDiscountLimit=? + WHERE CardNo=?"); + $fixR = $dbc->exec_statement($fixQ,array($valW['memtype2'],$valW['memtype1'], + $valW['discount'],$valW['chargelimit'],$cardno)); + + $mailQ = $dbc->prepare_statement("UPDATE meminfo SET ads_OK=? WHERE card_no=?"); + $mailR = $dbc->exec_statement($mailQ,array($valW['mailflag'],$cardno)); + + // remove suspension and log action to history + $delQ = $dbc->prepare_statement("DELETE FROM suspensions WHERE cardno=?"); + $delR = $dbc->exec_statement($delQ,$cardno); + + $username = $this->current_user; + $now = date('Y-m-d h:i:s'); + $histQ = $dbc->prepare_statement("INSERT INTO suspension_history (username, postdate, + post, cardno, reasoncode) VALUES (?,".$dbc->now().",'Account reactivated',?,-1)"); + $histR = $dbc->exec_statement($histQ,array($username,$cardno)); + + } + + function deactivate_account($cardno, $reason, $type){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $chkQ = $dbc->prepare_statement("SELECT cardno FROM suspensions WHERE cardno=?"); + $chkR = $dbc->exec_statement($chkQ,array($cardno)); + if ($dbc->num_rows($chkR)>0){ + // if account is already suspended, just update the reason + $upQ = $dbc->prepare_statement("UPDATE suspensions SET reasoncode=?, type=? + WHERE cardno=?"); + $upR = $dbc->exec_statement($upQ,array($reason,substr($type,0,1),$cardno)); + } + else { + // new suspension + // get current values and save them in suspensions table + $cdQ = $dbc->prepare_statement("SELECT memType,Type,Discount,memDiscountLimit, + ads_OK FROM custdata AS c LEFT JOIN meminfo AS m + ON c.CardNo=m.card_no AND c.personNum=1 + WHERE c.CardNo=?"); + $cdR = $dbc->exec_statement($cdQ,array($cardno)); + $cdW = $dbc->fetch_row($cdR); + + $now = date('Y-m-d H:i:s'); + $insQ = $dbc->prepare_statement("INSERT INTO suspensions (cardno, type, memtype1, + memtype2, reason, suspDate, mailflag, discount, chargelimit, + reasoncode) VALUES (?,?,?,?,'',".$dbc->now().",?,?,?,?)"); + $insR = $dbc->exec_statement($insQ,array($cardno, substr($type,0,1), + $cdW['memType'],$cdW['Type'], $cdW['ads_OK'], + $cdW['Discount'],$cdW['memDiscountLimit'],$reason)); + + // log action + $username = $this->current_user; + $histQ = $dbc->prepare_statement("INSERT INTO suspension_history (username, postdate, + post, cardno, reasoncode) VALUES (?,".$dbc->now().",'',?,?)"); + $histR = $dbc->exec_statement($histQ,array($username,$cardno,$reason)); + } + + // remove account privileges in custdata + $deactivateQ = $dbc->prepare_statement("UPDATE custdata SET Type=?,memType=0,Discount=0, + memDiscountLimit=0 WHERE CardNo=?"); + $deactivateR = $dbc->exec_statement($deactivateQ,array($type,$cardno)); + + $mailingQ = $dbc->prepare_statement("UPDATE meminfo SET ads_OK=0 WHERE card_no=?"); + $mailingR = $dbc->exec_statement($mailingQ,array($cardno)); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemStatusEditor(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/MemberEditor.php b/fannie/mem/MemberEditor.php new file mode 100644 index 000000000..6cefe5087 --- /dev/null +++ b/fannie/mem/MemberEditor.php @@ -0,0 +1,201 @@ +auth_classes = array('members_edit_full'); + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == 'WEFC_Toronto' ) + $this->auth_classes = array('editmembers'); + } + */ + + function preprocess(){ + global $FANNIE_COUNTRY, $FANNIE_MEMBER_MODULES, $FANNIE_OP_DB; + + $this->country = (isset($FANNIE_COUNTRY)&&!empty($FANNIE_COUNTRY))?$FANNIE_COUNTRY:"US"; + $this->memNum = FormLib::get_form_value('memNum',False); + if ($this->memNum !== False){ + $this->title .= $this->memNum; + $this->header .= $this->memNum; + + /* start building prev/next links */ + $prev = ''; $prevLink=''; + $next = ''; $nextLink=''; + $list = FormLib::get_form_value('l'); + if (is_array($list)){ + // list mode + for($i=0;$imemNum){ + if (isset($list[$i-1])) + $prev = $list[$i-1]; + if (isset($list[$i+1])) + $next = $list[$i+1]; + } + } + } + else { + $dbc = FannieDB::get($FANNIE_OP_DB); + $prevP = $dbc->prepare_statement('SELECT MAX(CardNo) FROM custdata WHERE CardNo < ?'); + $prevR = $dbc->exec_statement($prevP,array($this->memNum)); + if ($dbc->num_rows($prevR) > 0) + $prev = array_pop($dbc->fetch_row($prevR)); + $nextP = $dbc->prepare_statement('SELECT MIN(CardNo) FROM custdata WHERE CardNo > ?'); + $nextR = $dbc->exec_statement($nextP,array($this->memNum)); + if ($dbc->num_rows($nextR) > 0) + $next = array_pop($dbc->fetch_row($nextR)); + } + + if ($prev != ''){ + $prevLink = ''; + $prevLink .= (is_array($list)) ? 'Prev Match' : 'Prev'; + $prevLink .= ''; + } + if ($next != ''){ + $nextLink = ''; + $nextLink .= (is_array($list)) ? 'Next Match' : 'Next'; + $nextLink .= ''; + } + + if (!empty($prevLink)) + $this->header .= '       '.$prevLink; + if (!empty($nextLink)) + $this->header .= '       '.$nextLink; + $this->header .= '       '.'Back'; + $this->header .= '       '.'Find'; + /* end building prev/next links */ + + /* form was submitted. save input. */ + if (FormLib::get_form_value('saveBtn',False) !== False){ + $whichBtn = FormLib::get_form_value('saveBtn'); + foreach($FANNIE_MEMBER_MODULES as $mm){ + if (!class_exists($mm)) + include('modules/'.$mm.'.php'); + $instance = new $mm(); + $this->msgs .= $instance->SaveFormData($this->memNum); + } + + if (!empty($this->msgs)){ + // implies: errors occurred + // stay on this page + $this->msgs .= '
        '; + } + else { + // By default, go back to search page w/ review info. + // If user clicked Save & Next and another match is + // available, edit the next match + $loc = 'MemberSearchPage.php?review='.$this->memNum; + if($whichBtn == 'Save & Next' && !empty($next)){ + $loc = 'MemberEditor.php?memNum='.$next; + foreach($list as $l) + $loc .= '&l[]='.$l; + } + header('Location: '.$loc); + return False; + } + } + } + else { + // cannot operate without a member number + header('Location: MemberSearchPage.php'); + return False; + } + return True; + + // preprocess() + } + + function body_content(){ + global $FANNIE_MEMBER_MODULES; + $ret = ''; + if (!empty($this->msgs)){ + $ret .= $this->msgs; + } + + $list = FormLib::get_form_value('l'); + + $ret .= '
        '; + $ret .= sprintf('',$this->memNum); + if (is_array($list)){ + foreach($list as $l) + $ret .= sprintf('',$l); + } + foreach($FANNIE_MEMBER_MODULES as $mm){ + if (!class_exists($mm)) + include('modules/'.$mm.'.php'); + $instance = new $mm(); + $ret .= '
        '; + $ret .= $instance->ShowEditForm($this->memNum, $this->country); + $ret .= '
        '; + } + $ret .= '
        '; + $ret .= '
        '; + if (is_array($list)){ + $ret .= ''; + $ret .= '     '; + $ret .= ''; + } + else + $ret .= ''; + $ret .= '     '; + $ret .= ''; + $ret .= '
        '; + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemberEditor(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/MemberIndexPage.php b/fannie/mem/MemberIndexPage.php new file mode 100644 index 000000000..5632c852b --- /dev/null +++ b/fannie/mem/MemberIndexPage.php @@ -0,0 +1,49 @@ + + + draw_page(); +} +?> diff --git a/fannie/mem/MemberModule.php b/fannie/mem/MemberModule.php new file mode 100644 index 000000000..fde83b561 --- /dev/null +++ b/fannie/mem/MemberModule.php @@ -0,0 +1,57 @@ + diff --git a/fannie/mem/MemberSearchPage.php b/fannie/mem/MemberSearchPage.php new file mode 100644 index 000000000..55efb79eb --- /dev/null +++ b/fannie/mem/MemberSearchPage.php @@ -0,0 +1,164 @@ + + Enter criteria to find one member or a list members from which to choose.

        "; + + private $mode = 'search'; + private $country; + private $results = array(); + + public function __construct(){ + global $FANNIE_COOP_ID; + parent::__construct(); + if ( isset($FANNIE_COOP_ID) && $FANNIE_COOP_ID == 'WEFC_Toronto' ) + $this->auth_classes = array('editmembers'); + } + + function preprocess(){ + global $FANNIE_COUNTRY,$FANNIE_MEMBER_MODULES,$FANNIE_OP_DB; + $this->country = (isset($FANNIE_COUNTRY)&&!empty($FANNIE_COUNTRY))?$FANNIE_COUNTRY:"US"; + + /* do search */ + if (FormLib::get_form_value('doSearch',False) !== False){ + $dbc = FannieDB::get($FANNIE_OP_DB); + $num = FormLib::get_form_value('memNum',''); + + /* if member number is provided and exists, go + directly to the result */ + if ($num !== ''){ + $q = $dbc->prepare_statement("SELECT cardno FROM custdata WHERE cardno=?"); + $r = $dbc->exec_statement($q,array($num)); + if ($dbc->num_rows($r) > 0){ + header("Location: MemberEditor.php?memNum=".$num); + return False; + } + } + + /* process each available search and merge the + results */ + foreach($FANNIE_MEMBER_MODULES as $mm){ + include('modules/'.$mm.'.php'); + $instance = new $mm(); + if ($instance->HasSearch()){ + $tmp = $instance->GetSearchResults(); + foreach($tmp as $id => $label){ + if (!isset($this->results[$id])) + $this->results[$id] = $label; + } + } + } + + /* if modules find exactly one member, go directly to + the result */ + if (count($this->results) == 1){ + $num = array_pop(array_keys($this->results)); + header("Location: MemberEditor.php?memNum=".$num); + return False; + } + + /* search returned either zero or multiple results */ + $this->mode = 'results'; + } + return True; + } + + function body_content(){ + if ($this->mode == 'search') + return $this->form_content(); + elseif ($this->mode == 'results') + return $this->results_content(); + } + + function form_content(){ + global $FANNIE_MEMBER_MODULES, $FANNIE_OP_DB; + $ret = ''; + + $review = FormLib::get_form_value('review',False); + if ($review !== False){ + $ret .= '
        Review'; + $dbc = FannieDB::get($FANNIE_OP_DB); + $prep = $dbc->prepare_statement('SELECT LastName,FirstName FROM custdata + WHERE personNum=1 AND CardNo=?'); + $res = $dbc->exec_statement($prep,array($review)); + $ret .= 'Saved Member #'.$review.' ('; + if ($dbc->num_rows($res) > 0){ + $row = $dbc->fetch_row($res); + $ret .= $row['FirstName'].' '.$row['LastName']; + } + $ret .= ')'; + $ret .= '
        Edit Again'; + $ret .= '
        '; + } + + $ret .= '
        '; + $ret .= '

        Member Number:

        '; + foreach($FANNIE_MEMBER_MODULES as $mm){ + include('modules/'.$mm.'.php'); + $instance = new $mm(); + if ($instance->HasSearch()){ + $ret .= $instance->ShowSearchForm($this->country); + } + } + $ret .= '
        '; + $ret .= ''; + $ret .= ''; + $this->add_onload_command("\$('input#mn').focus();"); + + return $ret; + } + + function results_content(){ + $ret = ''; + if (empty($this->results)){ + $ret .= "Error: No matching member found"; + } + else { + $list = ''; + foreach($this->results as $cn => $name){ + if (strlen($list) > 1900) break; // avoid excessively long URLs + $list .= '&l[]='.$cn; + } + $ret .= "
          "; + foreach($this->results as $cn => $name){ + $ret .= "
        • $cn $name
        • "; + } + $ret .= "
        "; + } + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemberSearchPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/mem/MemberTypeEditor.php b/fannie/mem/MemberTypeEditor.php new file mode 100644 index 000000000..e514910c5 --- /dev/null +++ b/fannie/mem/MemberTypeEditor.php @@ -0,0 +1,289 @@ +prepare_statement("UPDATE memdefaults SET cd_type=? + WHERE memtype=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveMem','REG'), + FormLib::get_form_value('t_id',0) + )); + return False; + } + elseif (FormLib::get_form_value('saveStaff',False) !== False){ + $q = $dbc->prepare_statement("UPDATE memdefaults SET staff=? + WHERE memtype=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveStaff',0), + FormLib::get_form_value('t_id',0) + )); + return False; + } + elseif (FormLib::get_form_value('saveSSI',False) !== False){ + $q = $dbc->prepare_statement("UPDATE memdefaults SET SSI=? + WHERE memtype=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveSSI',0), + FormLib::get_form_value('t_id',0) + )); + return False; + } + elseif (FormLib::get_form_value('saveDisc',False) !== False){ + $q = $dbc->prepare_statement("UPDATE memdefaults SET discount=? + WHERE memtype=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveDisc',0), + FormLib::get_form_value('t_id',0) + )); + return False; + } + elseif (FormLib::get_form_value('saveType',False) !== False){ + $q = $dbc->prepare_statement("UPDATE memdefaults SET memDesc=? + WHERE memtype=?"); + $r = $dbc->exec_statement($q,array( + FormLib::get_form_value('saveType',0), + FormLib::get_form_value('t_id',0) + )); + return False; + } + elseif (FormLib::get_form_value('newMemForm',False) !== False){ + $q = $dbc->prepare_statement("SELECT MAX(memtype) FROM memtype"); + $r = $dbc->exec_statement($q); + $sug = 0; + if($dbc->num_rows($r)>0){ + $w = $dbc->fetch_row($r); + if(!empty($w)) $sug = $w[0]+1; + } + echo "Give the new memtype an ID number. The one + provided is only a suggestion. ID numbers + must be unique."; + printf('

        New ID: ',$sug); + echo ' '; + echo ' '; + return False; + } + elseif (FormLib::get_form_value('new_t_id',False) !== False){ + /* do some extra sanity checks + on a new member type + */ + $id = FormLib::get_form_value('new_t_id'); + if (!is_numeric($id)){ + echo 'ID '.$id.' is not a number'; + echo '

        '; + echo 'Try Again'; + } + else { + $q = $dbc->prepare_statement("SELECT memtype FROM memtype WHERE + memtype=?"); + $r = $dbc->exec_statement($q,array($id)); + if ($dbc->num_rows($r) > 0){ + echo 'ID is already in use'; + echo '

        '; + echo 'Try Again'; + } + else { + $mtP = $dbc->prepare_statement("INSERT INTO memtype (memtype,memDesc) VALUES (?,'')"); + $dbc->exec_statement($mtP, array($id)); + $mdP = $dbc->prepare_statement("INSERT INTO memdefaults (memtype,cd_type, + discount,staff,SSI) VALUES (?, 'REG', 0, 0, 0)"); + $dbc->exec_statement($mdP, array($id)); + + echo $this->getTypeTable(); + } + } + exit; + } + elseif (FormLib::get_form_value('goHome',False) !== False){ + echo $this->getTypeTable(); + exit; + } + /* end ajax callbacks */ + return True; + } + + private function getTypeTable(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $ret = ' + + + + '; + + $q = $dbc->prepare_statement("SELECT m.memtype,m.memDesc,d.cd_type,d.discount,d.staff,d.SSI + FROM memtype AS m LEFT JOIN memdefaults AS d + ON m.memtype=d.memtype + ORDER BY m.memtype"); + $r = $dbc->exec_statement($q); + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf(' + + + + + + ',$w['memtype'], + $w['memDesc'],$w['memtype'], + ($w['cd_type']=='PC'?'checked':''),$w['memtype'], + $w['discount'],$w['memtype'], + ($w['staff']=='1'?'checked':''),$w['memtype'], + ($w['SSI']=='1'?'checked':''),$w['memtype'] + ); + } + $ret .= "
        ID#DescriptionMemberDiscountStaffSSI
        %d
        "; + $ret .= '
        New Member Type'; + return $ret; + } + + function javascript_content(){ + ob_start(); + ?> + function newMemType(){ + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 'newMemForm=yes', + success: function(data){ + $('#mainDisplay').html(data); + } + }); + } + + function finishMemType(){ + var t_id = $('#newTypeID').val(); + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 'new_t_id='+t_id, + success: function(data){ + $('#mainDisplay').html(data); + } + }); + } + + function cancelMemType(){ + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 'goHome=yes', + success: function(data){ + $('#mainDisplay').html(data); + } + }); + } + + function saveMem(st,t_id){ + var cd_type = 'REG'; + if (st == true) cd_type='PC'; + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 't_id='+t_id+'&saveMem='+cd_type, + success: function(data){ + + } + }); + } + + function saveStaff(st,t_id){ + var staff = 0; + if (st == true) staff=1; + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 't_id='+t_id+'&saveStaff='+staff, + success: function(data){ + + } + }); + } + + function saveSSI(st,t_id){ + var ssi = 0; + if (st == true) ssi=1; + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 't_id='+t_id+'&saveSSI='+ssi, + success: function(data){ + + } + }); + } + + function saveDisc(disc,t_id){ + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 't_id='+t_id+'&saveDisc='+disc, + success: function(data){ + + } + }); + } + + function saveType(typedesc,t_id){ + $.ajax({url:'MemberTypeEditor.php', + cache: false, + type: 'post', + data: 't_id='+t_id+'&saveType='+typedesc, + success: function(data){ + + } + }); + } + ' + .$this->getTypeTable() + .'
        '; + } +} + +if(basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemberTypeEditor(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/NewMemberTool.php b/fannie/mem/NewMemberTool.php new file mode 100644 index 000000000..7e65b01aa --- /dev/null +++ b/fannie/mem/NewMemberTool.php @@ -0,0 +1,201 @@ +errors = "Error: member type wasn't set correctly"; + elseif (!is_numeric(FormLib::get_form_value('num'))) + $this->errors = "'How Many' needs to be a number"; + elseif (FormLib::get_form_value('num') <= 0) + $this->errors = "'How Many' needs to be positive"; + else + $this->mode = 'results'; + } + return True; + } + + function body_content(){ + if ($this->mode == 'form') + return $this->form_content(); + elseif ($this->mode == 'results') + return $this->results_content(); + } + + function form_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + // inner join so that only types + // with defaults set up are shown + $q = $dbc->prepare_statement("SELECT m.memtype,m.memDesc + FROM memtype AS m + INNER JOIN memdefaults AS d ON + m.memtype=d.memtype ORDER BY + m.memtype"); + $r = $dbc->exec_statement($q); + $opts = ""; + while($w = $dbc->fetch_row($r)){ + $opts .= sprintf("", + $w['memtype'],$w['memDesc']); + } + + $ret = ''; + if (!empty($this->errors)){ + $ret .= '
        '; + $ret .= $this->errors; + $ret .= '

        '; + } + + $ret .= "Create New Members
        "; + $ret .= '
        '; + $ret .= 'Type: '; + $ret .= '

        '; + $ret .= 'How Many: '; + $ret .= '

        '; + $ret .= 'Name: '; + $ret .= '

        '; + $ret .= ' Specify first number'; + $ret .= ''; + $ret .= '

        '; + $ret .= ''; + $ret .= '
        '; + + return $ret; + } + + function results_content(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $mtype = FormLib::get_form_value('memtype',0); + $num = FormLib::get_form_value('num',0); + $name = FormLib::get_form_value('name','NEW MEMBER'); + $manual_start = FormLib::get_form_value('start',False); + if (!is_numeric($manual_start)) $manual_start = False; + + /* going to create memberships + part of the insert arrays can + be prepopulated */ + $meminfo = array( + 'last_name'=>"''", + 'first_name'=>"''", + 'othlast_name'=>"''", + 'othfirst_name'=>"''", + 'street'=>"''", + 'city'=>"''", + 'state'=>"''", + 'zip'=>"''", + 'phone'=>"''", + 'email_1'=>"''", + 'email_2'=>"''", + 'ads_OK'=>1 + ); + + $custdata = array( + 'personNum'=>1, + 'LastName'=>$dbc->escape($name), + 'FirstName'=>"''", + 'CashBack'=>999.99, + 'Balance'=>0, + 'MemDiscountLimit'=>0, + 'ChargeOk'=>1, + 'WriteChecks'=>1, + 'StoreCoupons'=>1, + 'Purchases'=>0, + 'NumberOfChecks'=>999, + 'memCoupons'=>0, + 'blueLine'=>$dbc->escape($name), + 'Shown'=>1 + ); + + $defaultsQ = $dbc->prepare_statement("SELECT cd_type,discount,staff,SSI + FROM memdefaults WHERE memtype=?"); + $defaultsR = $dbc->exec_statement($defaultsQ,array($mtype)); + $defaults = $dbc->fetch_row($defaultsR); + + $args = array(0, $name, $defaults['discount'], + $defaults['cd_type'], $defaults['staff'], + $defaults['SSI'], $mtype, $name); + + /* everything's set but the actual member #s */ + $numQ = $dbc->prepare_statement("SELECT MAX(CardNo) FROM custdata"); + if ($FANNIE_SERVER_DBMS == 'MSSQL') + $numQ = $dbc->prepare_statement("SELECT MAX(CAST(CardNo AS int)) FROM custdata"); + $numR = $dbc->exec_statement($numQ); + $start = 1; + if ($dbc->num_rows($numR) > 0){ + $numW = $dbc->fetch_row($numR); + if (!empty($numW[0])) $start = $numW[0]+1; + } + + if ($manual_start) + $start = (int)$manual_start; + + $end = $start + $num - 1; + + $ret = "Starting number: $start
        "; + $ret .= "Ending number: $end
        "; + $insP = $dbc->prepare_statement("INSERT INTO custdata (CardNo,personNum,LastName, + FirstName,CashBack,Balance,MemDiscountLimit,ChargeOk,WriteChecks, + StoreCoupons,Purchases,NumberOfChecks,memCoupons,Shown,Discount, + Type,staff,SSI,memType,blueLine) VALUES (?, 1, ?, '', 999.99, 0, + 0, 1, 1, 1, 0, 999, 0, 1, ?, ?, ?, ?, ?, ?)"); + $chkP = $dbc->prepare_statement('SELECT CardNo FROM custdata WHERE CardNo=?'); + $mdP = $dbc->prepare_statement("INSERT INTO memDates VALUES (?,NULL,NULL)"); + $mcP = $dbc->prepare_statement("INSERT INTO memContact (card_no,pref) VALUES (?,1)"); + for($i=$start; $i<=$end; $i++){ + // skip if record already exists + $chkR = $dbc->exec_statement($chkP,array($i)); + if ($dbc->num_rows($chkR) > 0) continue; + + $args[0] = $i; + $dbc->exec_statement($insP,$args); + MeminfoModel::update($i, array()); + $dbc->exec_statement($mdP, array($i)); + $dbc->exec_statement($mcP, array($i)); + } + return $ret; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new NewMemberTool(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/correction_pages/MemArEquityDumpTool.php b/fannie/mem/correction_pages/MemArEquityDumpTool.php new file mode 100644 index 000000000..5f7b47e5b --- /dev/null +++ b/fannie/mem/correction_pages/MemArEquityDumpTool.php @@ -0,0 +1,388 @@ +errors .= "Error: no AR departments found"; + return True; + } + + if (empty($FANNIE_EQUITY_DEPARTMENTS)){ + $this->errors .= "Error: no Equity departments found"; + return True; + } + + $ret = preg_match_all("/[0-9]+/",$FANNIE_AR_DEPARTMENTS,$depts); + if ($ret == 0){ + $this->errors .= "Error: can't read AR department definition"; + return True; + } + $temp_depts = array_pop($depts); + + $ret = preg_match_all("/[0-9]+/",$FANNIE_EQUITY_DEPARTMENTS,$depts); + if ($ret == 0){ + $this->errors .= "Error: can't read Equity department definition"; + return True; + } + $temp_depts2 = array_pop($depts); + foreach($temp_depts2 as $num) + $temp_depts[] = $num; + + $dlist = "("; + $dArgs = array(); + foreach ($temp_depts as $d){ + $dlist .= "?,"; + $dArgs[] = $d; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments WHERE dept_no IN $dlist"); + $r = $dbc->exec_statement($q,$dArgs); + if ($dbc->num_rows($r) == 0){ + return "Error: department(s) don't exist"; + } + + $this->depts = array(); + while($row = $dbc->fetch_row($r)){ + $this->depts[$row[0]] = $row[1]; + } + + if (FormLib::get_form_value('submit1',False) !== False) + $this->mode = 'confirm'; + elseif (FormLib::get_form_value('submit2',False) !== False) + $this->mode = 'finish'; + + // error check inputs + if ($this->mode != 'init'){ + + $this->dept1 = FormLib::get_form_value('deptFrom'); + $this->dept2 = FormLib::get_form_value('deptTo'); + $this->amount = FormLib::get_form_value('amount'); + $this->cn = FormLib::get_form_value('card_no'); + + if (!is_numeric($this->amount)){ + $this->errors .= "Error: amount given (".$this->amount.") isn't a number" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->cn)){ + $this->errors .= "Error: member given (".$this->cn1.") isn't a number" + ."

        " + ."Back"; + return True; + } + if ($this->dept1 == $this->dept2){ + $this->errors .= "Error: departments are the same; nothing to convert" + ."

        " + ."Back"; + return True; + } + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name1 = $row[0].' '.$row[1]; + } + + return True; + } + + function body_content(){ + if ($this->mode == 'init') + return $this->form_content(); + elseif($this->mode == 'confirm') + return $this->confirm_content(); + elseif($this->mode == 'finish') + return $this->finish_content(); + } + + function confirm_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "Confirm transactions"; + $ret .= "

        "; + $ret .= sprintf("\$%.2f will be moved from %s to %s for Member #%d (%s)", + $this->amount,$this->depts[$this->dept1], + $this->dept2,$this->cn,$this->name1); + $ret .= "

        "; + $ret .= "dept1}\" />"; + $ret .= "dept2}\" />"; + $ret .= "amount}\" />"; + $ret .= "cn}\" />"; + $ret .= ""; + $ret .= ""; + $ret .= "      "; + $ret .= ""; + $ret .= "

        "; + + return $ret; + } + + function finish_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = ''; + + $dtrans = array(); + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,-1*$this->amount,$this->dept1,$this->cn); + + $dtrans['trans_id']++; + $this->doInsert($dtrans,$this->amount,$this->dept2,$this->cn); + + $comment = FormLib::get_form_value('comment'); + if (!empty($comment)){ + $dtrans['trans_id']++; + $this->doComment($dtrans,$comment,$this->cn); + } + + $ret .= sprintf("Receipt #1: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + return $ret; + } + + function form_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "

        "; + $ret .= "Remove $ "; + $ret .= ""; + $ret .= " to Dept. #"; + $ret .= "DEFAULT_DEPT\" />"; + $ret .= "

        "; + $memNum = FormLib::get_form_value('memIN'); + $ret .= "Member # "; + $ret .= "

        "; + $ret .= "Comment: "; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= "
        "; + + return $ret; + } + + function getTransNo($emp,$register){ + global $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $q = $dbc->prepare_statement("SELECT max(trans_no) FROM dtransactions WHERE register_no=? AND emp_no=?"); + $r = $dbc->exec_statement($q,array($register,$emp)); + $n = array_pop($dbc->fetch_row($r)); + return (empty($n)?1:$n+1); + } + + function doInsert($dtrans,$amount,$department,$cardno){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $OP = $FANNIE_OP_DB.$dbc->sep(); + + $defaults = array( + 'register_no'=>$this->CORRECTION_LANE, + 'emp_no'=>$this->CORRECTION_CASHIER, + 'trans_no'=>$dtrans['trans_no'], + 'upc'=>'', + 'description'=>'', + 'trans_type'=>'D', + 'trans_subtype'=>'', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>1, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>1, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>'', + 'trans_id'=>$dtrans['trans_id'] + ); + + $defaults['department'] = $department; + $defaults['card_no'] = $cardno; + $defaults['unitPrice'] = $amount; + $defaults['regPrice'] = $amount; + $defaults['total'] = $amount; + if ($amount < 0){ + $defaults['trans_status'] = 'R'; + $defaults['quantity'] = -1; + } + $defaults['upc'] = abs($amount).'DP'.$department; + + if (isset($this->depts[$department])) + $defaults['description'] = $this->depts[$department]; + else { + $nameP = $dbc->prepare_statement("SELECT dept_name FROM {$OP}departments WHERE dept_no=?"); + $nameR = $dbc->exec_statement($nameP,$department); + $defaults['description'] = array_pop($dbc->fetch_row($nameR)); + } + + $q = $dbc->prepare_statement("SELECT memType,Staff FROM {$OP}custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($q,array($cardno)); + $w = $dbc->fetch_row($r); + $defaults['memType'] = $w[0]; + $defaults['staff'] = $w[1]; + + $columns = 'datetime,'; + $values = $dbc->now().','; + $args = array(); + foreach($defaults as $k=>$v){ + $columns .= $k.','; + $values .= '?,'; + $args[] = $v; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + $prep = $dbc->prepare_statement("INSERT INTO dtransactions ($columns) VALUES ($values)"); + $dbc->exec_statement($prep, $args); + } + + function doComment($dtrans,$comment,$cardno){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $OP = $FANNIE_OP_DB.$dbc->sep(); + + $defaults = array( + 'register_no'=>$this->CORRECTION_LANE, + 'emp_no'=>$this->CORRECTION_CASHIER, + 'trans_no'=>$dtrans['trans_no'], + 'upc'=>'0', + 'description'=>$comment, + 'trans_type'=>'C', + 'trans_subtype'=>'CM', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>0, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>0, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>$cardno, + 'trans_id'=>$dtrans['trans_id'] + ); + + $q = $dbc->prepare_statement("SELECT memType,Staff FROM {$OP}custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($q,array($cardno)); + $w = $dbc->fetch_row($r); + $defaults['memType'] = $w[0]; + $defaults['staff'] = $w[1]; + + $columns = 'datetime,'; + $values = $dbc->now().','; + $args = array(); + foreach($defaults as $k=>$v){ + $columns .= $k.','; + $values .= '?,'; + $args[] = $v; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + $prep = $dbc->prepare_statement("INSERT INTO dtransactions ($columns) VALUES ($values)"); + $dbc->exec_statement($prep, $args); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemArEquityDumpTool(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/correction_pages/MemArEquitySwapTool.php b/fannie/mem/correction_pages/MemArEquitySwapTool.php new file mode 100644 index 000000000..7b01d067d --- /dev/null +++ b/fannie/mem/correction_pages/MemArEquitySwapTool.php @@ -0,0 +1,325 @@ +errors .= "Error: no AR departments found"; + return True; + } + + if (empty($FANNIE_EQUITY_DEPARTMENTS)){ + $this->errors .= "Error: no Equity departments found"; + return True; + } + + $ret = preg_match_all("/[0-9]+/",$FANNIE_AR_DEPARTMENTS,$depts); + if ($ret == 0){ + $this->errors .= "Error: can't read AR department definition"; + return True; + } + $temp_depts = array_pop($depts); + + $ret = preg_match_all("/[0-9]+/",$FANNIE_EQUITY_DEPARTMENTS,$depts); + if ($ret == 0){ + $this->errors .= "Error: can't read Equity department definition"; + return True; + } + $temp_depts2 = array_pop($depts); + foreach($temp_depts2 as $num) + $temp_depts[] = $num; + + $dlist = "("; + $dArgs = array(); + foreach ($temp_depts as $d){ + $dlist .= "?,"; + $dArgs[] = $d; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments WHERE dept_no IN $dlist"); + $r = $dbc->exec_statement($q,$dArgs); + if ($dbc->num_rows($r) == 0){ + return "Error: department(s) don't exist"; + } + + $this->depts = array(); + while($row = $dbc->fetch_row($r)){ + $this->depts[$row[0]] = $row[1]; + } + + if (FormLib::get_form_value('submit1',False) !== False) + $this->mode = 'confirm'; + elseif (FormLib::get_form_value('submit2',False) !== False) + $this->mode = 'finish'; + + // error check inputs + if ($this->mode != 'init'){ + + $this->dept1 = FormLib::get_form_value('deptFrom'); + $this->dept2 = FormLib::get_form_value('deptTo'); + $this->amount = FormLib::get_form_value('amount'); + $this->cn = FormLib::get_form_value('card_no'); + + if (!isset($this->depts[$this->dept1]) || !isset($this->depts[$this->dept2])){ + $this->errors .= "Error: AR department doesn't exist" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->amount)){ + $this->errors .= "Error: amount given (".$this->amount.") isn't a number" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->cn)){ + $this->errors .= "Error: member given (".$this->cn1.") isn't a number" + ."

        " + ."Back"; + return True; + } + if ($this->dept1 == $this->dept2){ + $this->errors .= "Error: departments are the same; nothing to convert" + ."

        " + ."Back"; + return True; + } + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name1 = $row[0].' '.$row[1]; + } + + return True; + } + + function body_content(){ + if ($this->mode == 'init') + return $this->form_content(); + elseif($this->mode == 'confirm') + return $this->confirm_content(); + elseif($this->mode == 'finish') + return $this->finish_content(); + } + + function confirm_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "Confirm transactions"; + $ret .= "

        "; + $ret .= sprintf("\$%.2f will be moved from %s to %s for Member #%d (%s)", + $this->amount,$this->depts[$this->dept1], + $this->depts[$this->dept2],$this->cn,$this->name1); + $ret .= "

        "; + $ret .= "dept1}\" />"; + $ret .= "dept2}\" />"; + $ret .= "amount}\" />"; + $ret .= "cn}\" />"; + $ret .= ""; + $ret .= "      "; + $ret .= ""; + $ret .= "

        "; + + return $ret; + } + + function finish_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = ''; + + $dtrans = array(); + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,-1*$this->amount,$this->dept1,$this->cn); + + $dtrans['trans_id']++; + $this->doInsert($dtrans,$this->amount,$this->dept2,$this->cn); + + $ret .= sprintf("Receipt #1: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + return $ret; + } + + function form_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "

        "; + $ret .= "Convert $ "; + $ret .= ""; + $ret .= " to "; + $ret .= ""; + $ret .= "

        "; + $memNum = FormLib::get_form_value('memIN'); + $ret .= "Member # "; + $ret .= "

        "; + $ret .= ""; + $ret .= "

        "; + $ret .= "
        "; + + return $ret; + } + + function getTransNo($emp,$register){ + global $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $q = $dbc->prepare_statement("SELECT max(trans_no) FROM dtransactions WHERE register_no=? AND emp_no=?"); + $r = $dbc->exec_statement($q,array($register,$emp)); + $n = array_pop($dbc->fetch_row($r)); + return (empty($n)?1:$n+1); + } + + function doInsert($dtrans,$amount,$department,$cardno){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $OP = $FANNIE_OP_DB.$dbc->sep(); + + $defaults = array( + 'register_no'=>$this->CORRECTION_LANE, + 'emp_no'=>$this->CORRECTION_CASHIER, + 'trans_no'=>$dtrans['trans_no'], + 'upc'=>'', + 'description'=>'', + 'trans_type'=>'D', + 'trans_subtype'=>'', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>1, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>1, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>'', + 'trans_id'=>$dtrans['trans_id'] + ); + + $defaults['department'] = $department; + $defaults['card_no'] = $cardno; + $defaults['unitPrice'] = $amount; + $defaults['regPrice'] = $amount; + $defaults['total'] = $amount; + if ($amount < 0){ + $defaults['trans_status'] = 'R'; + $defaults['quantity'] = -1; + } + $defaults['upc'] = abs($amount).'DP'.$department; + + if (isset($this->depts[$department])) + $defaults['description'] = $this->depts[$department]; + else { + $nameP = $dbc->prepare_statement("SELECT dept_name FROM {$OP}departments WHERE dept_no=?"); + $nameR = $dbc->exec_statement($nameP,$department); + $defaults['description'] = array_pop($dbc->fetch_row($nameR)); + } + + $q = $dbc->prepare_statement("SELECT memType,Staff FROM {$OP}custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($q,array($cardno)); + $w = $dbc->fetch_row($r); + $defaults['memType'] = $w[0]; + $defaults['staff'] = $w[1]; + + $columns = 'datetime,'; + $values = $dbc->now().','; + $args = array(); + foreach($defaults as $k=>$v){ + $columns .= $k.','; + $values .= '?,'; + $args[] = $v; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + $prep = $dbc->prepare_statement("INSERT INTO dtransactions ($columns) VALUES ($values)"); + $dbc->exec_statement($prep, $args); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemArEquitySwapTool(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/correction_pages/MemArTransferTool.php b/fannie/mem/correction_pages/MemArTransferTool.php new file mode 100644 index 000000000..f099e798e --- /dev/null +++ b/fannie/mem/correction_pages/MemArTransferTool.php @@ -0,0 +1,330 @@ +errors .= "Error: no AR departments found"; + return True; + } + + $ret = preg_match_all("/[0-9]+/",$FANNIE_AR_DEPARTMENTS,$depts); + if ($ret == 0){ + $this->errors .= "Error: can't read AR department definition"; + return True; + } + $temp_depts = array_pop($depts); + + $dlist = "("; + $dArgs = array(); + foreach ($temp_depts as $d){ + $dlist .= "?,"; + $dArgs[] = $d; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments WHERE dept_no IN $dlist"); + $r = $dbc->exec_statement($q,$dArgs); + if ($dbc->num_rows($r) == 0){ + return "Error: equity department(s) don't exist"; + } + + $this->depts = array(); + while($row = $dbc->fetch_row($r)){ + $this->depts[$row[0]] = $row[1]; + } + + if (FormLib::get_form_value('submit1',False) !== False) + $this->mode = 'confirm'; + elseif (FormLib::get_form_value('submit2',False) !== False) + $this->mode = 'finish'; + + // error check inputs + if ($this->mode != 'init'){ + + $this->dept = FormLib::get_form_value('dept'); + $this->amount = FormLib::get_form_value('amount'); + $this->cn1 = FormLib::get_form_value('memFrom'); + $this->cn2 = FormLib::get_form_value('memTo'); + + if (!isset($this->depts[$this->dept])){ + $this->errors .= "Error: AR department doesn't exist" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->amount)){ + $this->errors .= "Error: amount given (".$this->amount.") isn't a number" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->cn1)){ + $this->errors .= "Error: member given (".$this->cn1.") isn't a number" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->cn2)){ + $this->errors .= "Error: member given (".$this->cn2.") isn't a number" + ."

        " + ."Back"; + return True; + } + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn1)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn1."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name1 = $row[0].' '.$row[1]; + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn2)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn2."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name2 = $row[0].' '.$row[1]; + } + + return True; + } + + function body_content(){ + if ($this->mode == 'init') + return $this->form_content(); + elseif($this->mode == 'confirm') + return $this->confirm_content(); + elseif($this->mode == 'finish') + return $this->finish_content(); + } + + function confirm_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "Confirm transfer"; + $ret .= "

        "; + $ret .= printf("\$%.2f %s will be moved from %d (%s) to %d (%s)", + $this->amount,$this->depts[$this->dept], + $this->cn1,$this->name1,$this->cn2,$this->name2); + $ret .= "

        "; + $ret .= "dept}\" />"; + $ret .= "amount}\" />"; + $ret .= "cn1}\" />"; + $ret .= "cn2}\" />"; + $ret .= ""; + $ret .= "      "; + $ret .= ""; + $ret .= "

        "; + + return $ret; + } + + function finish_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = ''; + + $dtrans = array(); + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,$this->amount,$this->CORRECTION_DEPT,$this->cn1); + + $dtrans['trans_id']++; + $this->doInsert($dtrans,-1*$this->amount,$this->dept,$this->cn1); + + $ret .= sprintf("Receipt #1: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,$this->amount,$this->dept,$this->cn2); + + $dtrans['trans_id']++; + $this->doInsert($dtrans,-1*$this->amount,$this->CORRECTION_DEPT,$this->cn2); + + $ret .= "

        "; + $ret .= sprintf("Receipt #2: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + return $ret; + } + + function form_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "

        "; + $ret .= "Transfer $ "; + $ret .= ""; + $ret .= "

        "; + $memNum = FormLib::get_form_value('memIN'); + $ret .= "From member # "; + $ret .= "to member #"; + $ret .= "

        "; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= "
        "; + + return $ret; + } + + function getTransNo($emp,$register){ + global $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $q = $dbc->prepare_statement("SELECT max(trans_no) FROM dtransactions WHERE register_no=? AND emp_no=?"); + $r = $dbc->exec_statement($q,array($register,$emp)); + $n = array_pop($dbc->fetch_row($r)); + return (empty($n)?1:$n+1); + } + + function doInsert($dtrans,$amount,$department,$cardno){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $OP = $FANNIE_OP_DB.$dbc->sep(); + + $defaults = array( + 'register_no'=>$this->CORRECTION_LANE, + 'emp_no'=>$this->CORRECTION_CASHIER, + 'trans_no'=>$dtrans['trans_no'], + 'upc'=>'', + 'description'=>'', + 'trans_type'=>'D', + 'trans_subtype'=>'', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>1, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>1, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>'', + 'trans_id'=>$dtrans['trans_id'] + ); + + $defaults['department'] = $department; + $defaults['card_no'] = $cardno; + $defaults['unitPrice'] = $amount; + $defaults['regPrice'] = $amount; + $defaults['total'] = $amount; + if ($amount < 0){ + $defaults['trans_status'] = 'R'; + $defaults['quantity'] = -1; + } + $defaults['upc'] = abs($amount).'DP'.$department; + + if (isset($this->depts[$department])) + $defaults['description'] = $this->depts[$department]; + else { + $nameP = $dbc->prepare_statement("SELECT dept_name FROM {$OP}departments WHERE dept_no=?"); + $nameR = $dbc->exec_statement($nameP,$department); + $defaults['description'] = array_pop($dbc->fetch_row($nameR)); + } + + $q = $dbc->prepare_statement("SELECT memType,Staff FROM {$OP}custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($q,array($cardno)); + $w = $dbc->fetch_row($r); + $defaults['memType'] = $w[0]; + $defaults['staff'] = $w[1]; + + $columns = 'datetime,'; + $values = $dbc->now().','; + $args = array(); + foreach($defaults as $k=>$v){ + $columns .= $k.','; + $values .= '?,'; + $args[] = $v; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + $prep = $dbc->prepare_statement("INSERT INTO dtransactions ($columns) VALUES ($values)"); + $dbc->exec_statement($prep, $args); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemArTransferTool(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/correction_pages/MemEquityTransferTool.php b/fannie/mem/correction_pages/MemEquityTransferTool.php new file mode 100644 index 000000000..185085e2e --- /dev/null +++ b/fannie/mem/correction_pages/MemEquityTransferTool.php @@ -0,0 +1,329 @@ +errors .= "Error: no equity departments found"; + return True; + } + + $ret = preg_match_all("/[0-9]+/",$FANNIE_EQUITY_DEPARTMENTS,$depts); + if ($ret == 0){ + $this->errors .= "Error: can't read equity department definition"; + return True; + } + $temp_depts = array_pop($depts); + + $dlist = "("; + $dArgs = array(); + foreach ($temp_depts as $d){ + $dlist .= "?,"; + $dArgs[] = $d; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments WHERE dept_no IN $dlist"); + $r = $dbc->exec_statement($q,$dArgs); + if ($dbc->num_rows($r) == 0){ + return "Error: equity department(s) don't exist"; + } + + $this->depts = array(); + while($row = $dbc->fetch_row($r)){ + $this->depts[$row[0]] = $row[1]; + } + + if (FormLib::get_form_value('submit1',False) !== False) + $this->mode = 'confirm'; + elseif (FormLib::get_form_value('submit2',False) !== False) + $this->mode = 'finish'; + + // error check inputs + if ($this->mode != 'init'){ + + $this->dept = FormLib::get_form_value('dept'); + $this->amount = FormLib::get_form_value('amount'); + $this->cn1 = FormLib::get_form_value('memFrom'); + $this->cn2 = FormLib::get_form_value('memTo'); + + if (!isset($this->depts[$this->dept])){ + $this->errors .= "Error: equity department doesn't exist" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->amount)){ + $this->errors .= "Error: amount given (".$this->amount.") isn't a number" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->cn1)){ + $this->errors .= "Error: member given (".$this->cn1.") isn't a number" + ."

        " + ."Back"; + return True; + } + if (!is_numeric($this->cn2)){ + $this->errors .= "Error: member given (".$this->cn2.") isn't a number" + ."

        " + ."Back"; + return True; + } + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn1)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn1."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name1 = $row[0].' '.$row[1]; + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn2)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn2."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name2 = $row[0].' '.$row[1]; + } + + return True; + } + + function body_content(){ + if ($this->mode == 'init') + return $this->form_content(); + elseif($this->mode == 'confirm') + return $this->confirm_content(); + elseif($this->mode == 'finish') + return $this->finish_content(); + } + + function confirm_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "Confirm transfer"; + $ret .= "

        "; + $ret .= printf("\$%.2f %s will be moved from %d (%s) to %d (%s)", + $this->amount,$this->depts[$this->dept], + $this->cn1,$this->name1,$this->cn2,$this->name2); + $ret .= "

        "; + $ret .= "dept}\" />"; + $ret .= "amount}\" />"; + $ret .= "cn1}\" />"; + $ret .= "cn2}\" />"; + $ret .= ""; + $ret .= "      "; + $ret .= ""; + $ret .= "

        "; + + return $ret; + } + + function finish_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = ''; + + $dtrans = array(); + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,$this->amount,$this->CORRECTION_DEPT,$this->cn1); + + $dtrans['trans_id']++; + $this->doInsert($dtrans,-1*$this->amount,$this->dept,$this->cn1); + + $ret .= sprintf("Receipt #1: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,$this->amount,$this->dept,$this->cn2); + + $dtrans['trans_id']++; + $this->doInsert($dtrans,-1*$this->amount,$this->CORRECTION_DEPT,$this->cn2); + + $ret .= "

        "; + $ret .= sprintf("Receipt #2: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + return $ret; + } + + function form_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "

        "; + $ret .= "Transfer $ "; + $ret .= ""; + $ret .= "

        "; + $memNum = FormLib::get_form_value('memIN'); + $ret .= "From member # "; + $ret .= "to member #"; + $ret .= "

        "; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= "
        "; + + return $ret; + } + + function getTransNo($emp,$register){ + global $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $q = $dbc->prepare_statement("SELECT max(trans_no) FROM dtransactions WHERE register_no=? AND emp_no=?"); + $r = $dbc->exec_statement($q,array($register,$emp)); + $n = array_pop($dbc->fetch_row($r)); + return (empty($n)?1:$n+1); + } + + function doInsert($dtrans,$amount,$department,$cardno){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $OP = $FANNIE_OP_DB.$dbc->sep(); + + $defaults = array( + 'register_no'=>$this->CORRECTION_LANE, + 'emp_no'=>$this->CORRECTION_CASHIER, + 'trans_no'=>$dtrans['trans_no'], + 'upc'=>'', + 'description'=>'', + 'trans_type'=>'D', + 'trans_subtype'=>'', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>1, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>1, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>'', + 'trans_id'=>$dtrans['trans_id'] + ); + + $defaults['department'] = $department; + $defaults['card_no'] = $cardno; + $defaults['unitPrice'] = $amount; + $defaults['regPrice'] = $amount; + $defaults['total'] = $amount; + if ($amount < 0){ + $defaults['trans_status'] = 'R'; + $defaults['quantity'] = -1; + } + $defaults['upc'] = abs($amount).'DP'.$department; + + if (isset($this->depts[$department])) + $defaults['description'] = $this->depts[$department]; + else { + $nameP = $dbc->prepare_statement("SELECT dept_name FROM {$OP}departments WHERE dept_no=?"); + $nameR = $dbc->exec_statement($nameP,$department); + $defaults['description'] = array_pop($dbc->fetch_row($nameR)); + } + + $q = $dbc->prepare_statement("SELECT memType,Staff FROM {$OP}custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($q,array($cardno)); + $w = $dbc->fetch_row($r); + $defaults['memType'] = $w[0]; + $defaults['staff'] = $w[1]; + + $columns = 'datetime,'; + $values = $dbc->now().','; + $args = array(); + foreach($defaults as $k=>$v){ + $columns .= $k.','; + $values .= '?,'; + $args[] = $v; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + $prep = $dbc->prepare_statement("INSERT INTO dtransactions ($columns) VALUES ($values)"); + $dbc->exec_statement($prep, $args); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemEquityTransferTool(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/correction_pages/PatronageTransferTool.php b/fannie/mem/correction_pages/PatronageTransferTool.php new file mode 100644 index 000000000..bb6283876 --- /dev/null +++ b/fannie/mem/correction_pages/PatronageTransferTool.php @@ -0,0 +1,277 @@ +mode = 'confirm'; + elseif (FormLib::get_form_value('submit2',False) !== False) + $this->mode = 'finish'; + + // error check inputs + if ($this->mode != 'init'){ + + $this->date = FormLib::get_form_value('date'); + $this->tn = FormLib::get_form_value('trans_num'); + $this->cn2 = FormLib::get_form_value('memTo'); + + if (!is_numeric($this->cn2)){ + $this->errors .= "Error: member given (".$this->cn2.") isn't a number" + ."

        " + ."Back"; + return True; + } + + $q = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE CardNo=? AND personNum=1"); + $r = $dbc->exec_statement($q,array($this->cn2)); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: no such member: ".$this->cn2."" + ."

        " + ."Back"; + return True; + } + $row = $dbc->fetch_row($r); + $this->name2 = $row[0].' '.$row[1]; + + $dlog = select_dlog($this->date); + $q = $dbc->prepare_statement("SELECT card_no FROM $dlog WHERE trans_num=? AND + tdate BETWEEN ? AND ? + ORDER BY card_no DESC"); + $r = $dbc->exec_statement($q,array($this->tn,$this->date.' 00:00:00',$this->date.' 23:59:59')); + if ($dbc->num_rows($r) == 0){ + $this->errors .= "Error: receipt not found: $tn" + ."

        " + ."Back"; + return True; + } + $this->cn1 = array_pop($dbc->fetch_row($r)); + + $q = $dbc->prepare_statement("SELECT SUM(CASE WHEN trans_type in ('I','M','D') then total else 0 END) + FROM $dlog WHERE trans_num=? AND tdate BETWEEN ? AND ?"); + $r = $dbc->exec_statement($q,array($this->tn,$this->date.' 00:00:00',$this->date.' 23:59:59')); + $this->amt = array_pop($dbc->fetch_row($r)); + } + + return True; + } + + function body_content(){ + if ($this->mode == 'init') + return $this->form_content(); + elseif($this->mode == 'confirm') + return $this->confirm_content(); + elseif($this->mode == 'finish') + return $this->finish_content(); + } + + function confirm_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "Confirm transfer"; + $ret .= "

        "; + $ret .= sprintf("\$%.2f will be moved from %d to %d (%s)", + $this->amt,$this->cn1,$this->cn2,$this->name2); + $ret .= "

        "; + $ret .= "date}\" />"; + $ret .= "tn}\" />"; + $ret .= "cn2}\" />"; + $ret .= ""; + $ret .= "      "; + $ret .= ""; + $ret .= "

        "; + + return $ret; + } + + function finish_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = ''; + + $dtrans = array(); + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,-1*$this->amt,$this->CORRECTION_DEPT,$this->cn1); + + $ret .= sprintf("Receipt #1: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + $dtrans['trans_no'] = $this->getTransNo($this->CORRECTION_CASHIER,$this->CORRECTION_LANE); + $dtrans['trans_id'] = 1; + $this->doInsert($dtrans,$this->amt,$this->CORRECTION_DEPT,$this->cn2); + + $ret .= "

        "; + $ret .= sprintf("Receipt #2: %s",$this->CORRECTION_CASHIER.'-'.$this->CORRECTION_LANE.'-'.$dtrans['trans_no']); + + return $ret; + } + + function form_content(){ + + if (!empty($this->errors)) return $this->errors; + + $ret = "
        "; + $ret .= "

        "; + $ret .= "Date "; + $ret .= '
        '; + $ret .= "Receipt "; + $ret .= "

        "; + $memNum = FormLib::get_form_value('memIN'); + $ret .= "To member #"; + $ret .= "

        "; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= "
        "; + + return $ret; + } + + function getTransNo($emp,$register){ + global $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $q = $dbc->prepare_statement("SELECT max(trans_no) FROM dtransactions WHERE register_no=? AND emp_no=?"); + $r = $dbc->exec_statement($q,array($register,$emp)); + $n = array_pop($dbc->fetch_row($r)); + return (empty($n)?1:$n+1); + } + + function doInsert($dtrans,$amount,$department,$cardno){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $OP = $FANNIE_OP_DB.$dbc->sep(); + + $defaults = array( + 'register_no'=>$this->CORRECTION_LANE, + 'emp_no'=>$this->CORRECTION_CASHIER, + 'trans_no'=>$dtrans['trans_no'], + 'upc'=>'', + 'description'=>'', + 'trans_type'=>'D', + 'trans_subtype'=>'', + 'trans_status'=>'', + 'department'=>'', + 'quantity'=>1, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>'', + 'total'=>'', + 'regPrice'=>'', + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>0, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>1, + 'volDiscType'=>0, + 'volume'=>0, + 'volSpecial'=>0, + 'mixMatch'=>'', + 'matched'=>0, + 'memType'=>'', + 'staff'=>'', + 'numflag'=>0, + 'charflag'=>'', + 'card_no'=>'', + 'trans_id'=>$dtrans['trans_id'] + ); + + $defaults['department'] = $department; + $defaults['card_no'] = $cardno; + $defaults['unitPrice'] = $amount; + $defaults['regPrice'] = $amount; + $defaults['total'] = $amount; + if ($amount < 0){ + $defaults['trans_status'] = 'R'; + $defaults['quantity'] = -1; + } + $defaults['upc'] = abs($amount).'DP'.$department; + + if (isset($this->depts[$department])) + $defaults['description'] = $this->depts[$department]; + else { + $nameP = $dbc->prepare_statement("SELECT dept_name FROM {$OP}departments WHERE dept_no=?"); + $nameR = $dbc->exec_statement($nameP,$department); + $defaults['description'] = array_pop($dbc->fetch_row($nameR)); + } + + $q = $dbc->prepare_statement("SELECT memType,Staff FROM {$OP}custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($q,array($cardno)); + $w = $dbc->fetch_row($r); + $defaults['memType'] = $w[0]; + $defaults['staff'] = $w[1]; + + $columns = 'datetime,'; + $values = $dbc->now().','; + $args = array(); + foreach($defaults as $k=>$v){ + $columns .= $k.','; + $values .= '?,'; + $args[] = $v; + } + $columns = substr($columns,0,strlen($columns)-1); + $values = substr($values,0,strlen($values)-1); + $prep = $dbc->prepare_statement("INSERT INTO dtransactions ($columns) VALUES ($values)"); + $dbc->exec_statement($prep, $args); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new PatronageTransferTool(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/import/EquityHistoryImportPage.php b/fannie/mem/import/EquityHistoryImportPage.php new file mode 100644 index 000000000..39fad8bb9 --- /dev/null +++ b/fannie/mem/import/EquityHistoryImportPage.php @@ -0,0 +1,122 @@ + array( + 'name' => 'memnum', + 'display_name' => 'Member Number', + 'default' => 0, + 'required' => True + ), + 'amt' => array( + 'name' => 'amt', + 'display_name' => 'Equity Amt', + 'default' => 1, + 'required' => True + ), + 'date' => array( + 'name' => 'date', + 'display_name' => 'Date', + 'default' => 2, + 'required' => False + ), + 'transID' => array( + 'name' => 'transID', + 'display_name' => 'Transaction ID', + 'default' => 3, + 'required' => False + ), + 'dept' => array( + 'name' => 'dept', + 'display_name' => 'Dept. #', + 'default' => 4, + 'required' => False + ) + ); + + + private $details = ''; + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $mn_index = $this->get_column_index('memnum'); + $amt_index = $this->get_column_index('amt'); + $date_index = $this->get_column_index('date'); + $dept_index = $this->get_column_index('dept'); + $trans_index = $this->get_column_index('transID'); + + // prepare statements + $insP = $dbc->prepare_statement("INSERT INTO stockpurchases card_no,stockPurchase, + tdate,trans_num,dept) VALUES (?,?,?,?,?)"); + foreach($linedata as $line){ + // get info from file and member-type default settings + // if applicable + $cardno = $line[$mn_index]; + if (!is_numeric($cardno)) continue; // skip bad record + $amt = $line[$amt_index]; + $date = ($date_index !== False) ? $line[$date_index] : '0000-00-00'; + $dept = ($dept_index !== False) ? $line[$dept_index] : 0; + $trans = ($trans_index !== False) ? $line[$trans_index] : ""; + + $insR = $dbc->exec_statement($insP,array($cardno,$amt,$date,$trans,$dept)); + if ($insR === False){ + $this->details .= "Error importing entry for member $cardno
        "; + } + else { + $this->details .= "Imported entry for member $cardno
        "; + } + } + return True; + } + + function form_content(){ + return '
        Instructions + Upload a CSV or XLS file containing member numbers and equity purchase amounts. + Optionally, you can include purchase dates, transaction identifiers, and + department numbers. +
        A preview helps you to choose and map spreadsheet fields to the database. +
        The uploaded file will be deleted after the load. +

        '; + } + + function results_content(){ + return $this->details .= 'Import completed successfully'; + } +} +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new EquityHistoryImportPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/mem/import/MemContactImportPage.php b/fannie/mem/import/MemContactImportPage.php new file mode 100644 index 000000000..f39a12aa6 --- /dev/null +++ b/fannie/mem/import/MemContactImportPage.php @@ -0,0 +1,168 @@ + array( + 'name' => 'memnum', + 'display_name' => 'Member Number', + 'default' => 0, + 'required' => True + ), + 'street' => array( + 'name' => 'street', + 'display_name' => 'Street Address', + 'default' => 1, + 'required' => False + ), + 'street2' => array( + 'name' => 'street2', + 'display_name' => '2nd Address Line', + 'default' => 2, + 'required' => False + ), + 'city' => array( + 'name' => 'city', + 'display_name' => 'City', + 'default' => 3, + 'required' => False + ), + 'state' => array( + 'name' => 'state', + 'display_name' => 'State', + 'default' => 4, + 'required' => False, + ), + 'zip' => array( + 'name' => 'zip', + 'display_name' => 'Zip Code', + 'default' => 5, + 'required' => False, + ), + 'ph1' => array( + 'name' => 'ph1', + 'display_name' => 'Phone #', + 'default' => 6, + 'required' => False, + ), + 'ph2' => array( + 'name' => 'ph2', + 'display_name' => 'Alt. Phone #', + 'default' => 7, + 'required' => False, + ), + 'email' => array( + 'name' => 'email', + 'display_name' => 'Email', + 'default' => 8, + 'required' => False, + ) + ); + + private $details = ''; + + function MemContactImportPage(){ + global $country; + if ($country == 'CA'){ + $this->preview_opts['state']['display_name'] = 'Province'; + $this->preview_opts['zip']['display_name'] = 'Postal Code'; + } + } + + function process_file($linedata){ + $mn_index = $this->get_column_index('memnum'); + $st_index = $this->get_column_index('street'); + $st2_index = $this->get_column_index('street2'); + $city_index = $this->get_column_index('city'); + $state_index = $this->get_column_index('state'); + $zip_index = $this->get_column_index('zip'); + $ph_index = $this->get_column_index('ph1'); + $ph2_index = $this->get_column_index('ph2'); + $email_index = $this->get_column_index('email'); + + foreach($linedata as $line){ + // get info from file and member-type default settings + // if applicable + $cardno = $line[$mn_index]; + if (!is_numeric($cardno)) continue; // skip bad record + $street = ($st_index !== False) ? $line[$st_index] : ""; + $street2 = ($st2_index !== False) ? $line[$st2_index] : ""; + $city = ($city_index !== False) ? $line[$city_index] : ""; + $state = ($state_index !== False) ? $line[$state_index] : ""; + $zip = ($zip_index !== False) ? $line[$zip_index] : ""; + $ph1 = ($ph_index !== False) ? $line[$ph_index] : ""; + $ph2 = ($ph2_index !== False) ? $line[$ph2_index] : ""; + $email = ($email_index !== False) ? $line[$email_index] : ""; + + // combine multi-line addresses + $full_street = !empty($street2) ? $street."\n".$street2 : $street; + + $try = MeminfoModel::update($cardno,array( + 'street' => $full_street, + 'city' => $city, + 'state' => $state, + 'zip' => $zip, + 'phone' => $ph1, + 'email_1' => $email, + 'email_2' => $ph2 + )); + if ($try === False){ + $this->details .= "Error importing member $cardno
        "; + } + else { + $this->details .= "Imported contact info for member $cardno
        "; + } + + } + return True; + } + + function form_content(){ + return '
        Instructions + Upload a CSV or XLS file containing member numbers, address, phone number(s), + and emails. All fields are optional except member number. +
        A preview helps you to choose and map spreadsheet fields to the database. +
        The uploaded file will be deleted after the load. +

        '; + } + + function results_content(){ + return $this->details .= 'Import completed successfully'; + } +} +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemContactImportPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/mem/import/MemImportIndex.php b/fannie/mem/import/MemImportIndex.php new file mode 100644 index 000000000..1acef9228 --- /dev/null +++ b/fannie/mem/import/MemImportIndex.php @@ -0,0 +1,48 @@ + + + draw_page(); +} +?> + diff --git a/fannie/mem/import/MemNameNumImportPage.php b/fannie/mem/import/MemNameNumImportPage.php new file mode 100644 index 000000000..e44c40a84 --- /dev/null +++ b/fannie/mem/import/MemNameNumImportPage.php @@ -0,0 +1,154 @@ + array( + 'name' => 'memnum', + 'display_name' => 'Member Number', + 'default' => 0, + 'required' => True + ), + 'fn' => array( + 'name' => 'fn', + 'display_name' => 'First Name', + 'default' => 1, + 'required' => True + ), + 'ln' => array( + 'name' => 'ln', + 'display_name' => 'Last Name', + 'default' => 2, + 'required' => True + ), + 'mtype' => array( + 'name' => 'memtype', + 'display_name' => 'Type', + 'default' => 3, + 'required' => False + ) + ); + + + private $details = ''; + + function process_file($linedata){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $mn_index = $this->get_column_index('memnum'); + $fn_index = $this->get_column_index('fn'); + $ln_index = $this->get_column_index('ln'); + $t_index = $this->get_column_index('mtype'); + + $defaults_table = array(); + $defQ = $dbc->prepare_statement("SELECT memtype,cd_type,discount,staff,SSI from memdefaults"); + $defR = $dbc->exec_statement($defQ); + while($defW = $dbc->fetch_row($defR)){ + $defaults_table[$defW['memtype']] = array( + 'type' => $defW['cd_type'], + 'discount' => $defW['discount'], + 'staff' => $defW['staff'], + 'SSI' => $defW['SSI'] + ); + } + + // prepare statements + $perP = $dbc->prepare_statement("SELECT MAX(personNum) FROM custdata WHERE CardNo=?"); + $insP = $dbc->prepare_statement("INSERT INTO custdata (CardNo,personNum,LastName,FirstName,CashBack, + Balance,Discount,MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type, + memType,staff,SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown) + VALUES (?,?,?,?,0,0,?,0,0,0,0,?,?,?,?,0,0,0,?,1)"); + $dateP = $dbc->prepare_statement('INSERT INTO memDates (card_no) VALUES (?)'); + foreach($linedata as $line){ + // get info from file and member-type default settings + // if applicable + $cardno = $line[$mn_index]; + if (!is_numeric($cardno)) continue; // skip bad record + $ln = $line[$ln_index]; + $fn = $line[$fn_index]; + $mtype = ($t_index !== False) ? $line[$t_index] : 0; + $type = "PC"; + $discount = 0; + $staff = 0; + $SSI = 0; + if ($t_index !== False){ + if (isset($defaults_table[$mtype]['type'])) + $type = $defaults_table[$mtype]['type']; + if (isset($defaults_table[$mtype]['discount'])) + $discount = $defaults_table[$mtype]['discount']; + if (isset($defaults_table[$mtype]['staff'])) + $staff = $defaults_table[$mtype]['staff']; + if (isset($defaults_table[$mtype]['SSI'])) + $SSI = $defaults_table[$mtype]['SSI']; + } + + // determine person number + $perR = $dbc->exec_statement($perP,array($cardno)); + $result = array_pop($dbc->fetch_row($perR)); + $pn = !empty($result) ? ($result+1) : 1; + + $insR = $dbc->exec_statement($insP,array($cardno,$pn,$ln,$fn, + $discount,$type,$memtype,$staff,$SSI,$cardno.' '.$ln)); + if ($insR === False){ + $this->details .= "Error importing member $cardno ($fn $ln)
        "; + } + else { + $this->details .= "Imported member $cardno ($fn $ln)
        "; + } + + if ($pn == 1){ + MeminfoModel::update($cardno,array()); + $dbc->exec_statement($dateP,array($cardno)); + } + } + return True; + } + + function form_content(){ + return '
        Instructions + Upload a CSV or XLS file containing member numbers, first & last names, + and optionally type IDs. +
        A preview helps you to choose and map spreadsheet fields to the database. +
        The uploaded file will be deleted after the load. +

        '; + } + + function results_content(){ + return $this->details .= 'Import completed successfully'; + } +} +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemNameNumImportPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/mem/import/index.php b/fannie/mem/import/index.php new file mode 100644 index 000000000..9ae79b9a5 --- /dev/null +++ b/fannie/mem/import/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/mem/index.php b/fannie/mem/index.php new file mode 100644 index 000000000..462322365 --- /dev/null +++ b/fannie/mem/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/mem/mailList.php b/fannie/mem/mailList.php new file mode 100644 index 000000000..4f105a915 --- /dev/null +++ b/fannie/mem/mailList.php @@ -0,0 +1,86 @@ +prepare_statement("SELECT CardNo, + LastName, + FirstName, + street, + city, + state, + zip, + phone, + memType, + end_date + FROM custdata AS c + LEFT JOIN meminfo AS m + ON c.CardNo=m.card_no + LEFT JOIN memDates AS d + ON c.CardNo=d.card_no + WHERE + memType IN (1,3) + AND c.Type='PC' + AND (end_date > ".$dbc->now()." + or end_date = '' + or end_date is null + or end_date='1900-01-01 00:00:00' + or end_date='0000-00-00 00:00:00') + AND ads_OK = 1 + AND personNum = 1 + AND LastName <> 'NEW MEMBER' + order by m.card_no"); + +$result = $dbc->exec_statement($query); + +$ret = array(); +while($row = $dbc->fetch_row($result)){ + $new = array(11); + $new[0] = $row[0]; + $new[1] = $row[1]; + $new[2] = $row[2]; + + if (strstr($row[3],"\n") === False){ + $new[3] = $row[3]; + $new[4] = ""; + } + else { + $pts = explode("\n",$row[3]); + $new[3] = $pts[0]; + $new[4] = $pts[1]; + } + for($i=5;$i<=10;$i++) $new[$i] = $row[$i-1]; + $ret[] = $new; +} + +//$xls = ArrayToXls($ret); +$xls = ArrayToCsv($ret); +echo $xls; +?> diff --git a/fannie/mem/modules/AR.php b/fannie/mem/modules/AR.php new file mode 100644 index 000000000..125562c5e --- /dev/null +++ b/fannie/mem/modules/AR.php @@ -0,0 +1,75 @@ +db(); + $trans = $FANNIE_TRANS_DB.$dbc->sep(); + + $infoQ = $dbc->prepare_statement("SELECT c.memDiscountLimit,n.balance + FROM custdata AS c LEFT JOIN + {$trans}ar_live_balance AS n ON + c.CardNo=n.card_no + WHERE c.CardNo=? AND c.personNum=1"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + $infoW = $dbc->fetch_row($infoR); + + $ret = "
        A/R"; + $ret .= ""; + + $ret .= ""; + $ret .= sprintf('',$infoW['memDiscountLimit']); + $ret .= ""; + $ret .= sprintf('',$infoW['balance']); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= "
        Limit + Current Balance%.2fHistory
        Transfer A/RConvert A/R
        "; + return $ret; + } + + function SaveFormData($memNum){ + global $FANNIE_ROOT; + $dbc = $this->db(); + if (!class_exists("CustdataModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/CustdataModel.php'); + + $limit = FormLib::get_form_value('AR_limit',0); + $test = CustdataModel::update($memNum, + array('MemDiscountLimit' => $limit)); + + if ($test === False) + return 'Error: Problme saving A/R limit
        '; + else + return ''; + } +} + +?> diff --git a/fannie/mem/modules/ContactInfo.php b/fannie/mem/modules/ContactInfo.php new file mode 100644 index 000000000..aa7295002 --- /dev/null +++ b/fannie/mem/modules/ContactInfo.php @@ -0,0 +1,251 @@ +db(); + + $infoQ = $dbc->prepare_statement("SELECT CardNo,FirstName,LastName, + street,city,state,zip,phone,email_1, + email_2,ads_OK FROM custdata AS c + LEFT JOIN meminfo AS m ON c.CardNo = m.card_no + WHERE c.personNum=1 AND CardNo=?"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + $infoW = $dbc->fetch_row($infoR); + + $labels = array(); + switch ($country) { + case "US": + $labels['state'] = "State"; + $labels['zip'] = "Zip"; + break; + case "CA": + $labels['state'] = "Province"; + $labels['zip'] = "Postal Code"; + break; + } + + $ret = "
        Contact Info"; + $ret .= ""; + + $ret .= ""; + $ret .= sprintf('',$infoW['FirstName']); + $ret .= ""; + $ret .= sprintf('',$infoW['LastName']); + + $addrs = strstr($infoW['street'],"\n")?explode("\n",$infoW['street']):array($infoW['street'],''); + $ret .= ""; + $ret .= sprintf('',$addrs[0]); + $ret .= ""; + $ret .= sprintf('',($infoW['ads_OK']==1?'checked':'')); + + $ret .= ""; + $ret .= sprintf('',$addrs[1]); + + $ret .= ""; + $ret .= sprintf('',$infoW['city']); + $ret .= ""; + $ret .= sprintf('',$infoW['state']); + $ret .= ""; + $ret .= sprintf('',$infoW['zip']); + + $ret .= ""; + $ret .= sprintf('',$infoW['phone']); + $ret .= ""; + $ret .= sprintf('',$infoW['email_2']); + $ret .= ""; + $ret .= sprintf('',$infoW['email_1']); + + $ret .= "
        First NameLast Name
        AddressGets Mail
        Address (2)City{$labels['state']}{$labels['zip']}
        PhoneAlt. PhoneE-mail
        "; + return $ret; + } + + function SaveFormData($memNum){ + global $FANNIE_ROOT; + $dbc = $this->db(); + if (!class_exists("MeminfoModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/MeminfoModel.php'); + if (!class_exists("CustdataModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/CustdataModel.php'); + + $MI_FIELDS = array( + 'street' => FormLib::get_form_value('ContactInfo_addr1',''), + 'city' => FormLib::get_form_value('ContactInfo_city',''), + 'state' => FormLib::get_form_value('ContactInfo_state',''), + 'zip' => FormLib::get_form_value('ContactInfo_zip',''), + 'phone' => FormLib::get_form_value('ContactInfo_ph1',''), + 'email_2' => FormLib::get_form_value('ContactInfo_ph2',''), + 'email_1' => FormLib::get_form_value('ContactInfo_email',''), + 'ads_OK' => (FormLib::get_form_value('ContactInfo_mail')!=='' ? 1 : 0) + ); + /* Canadian Postal Code, and City and Province + * Phone style: ###-###-#### + */ + if ( preg_match("/^[A-Z]\d[A-Z]/i", $MI_FIELDS['zip']) ) { + $MI_FIELDS['zip'] = strtoupper($MI_FIELDS['zip']); + if ( strlen($MI_FIELDS['zip']) == 6 ) { + $MI_FIELDS['zip'] = substr($MI_FIELDS['zip'],0,3).' '. substr($MI_FIELDS['zip'],3,3); + } + // Postal code M* supply City and Province + if ( preg_match("/^M/", $MI_FIELDS['zip']) && + $MI_FIELDS['city'] == '' && $MI_FIELDS['state'] == '') { + $MI_FIELDS['city'] = 'Toronto'; + $MI_FIELDS['state'] = 'ON'; + } + // Phone# style: ###-###-#### + if ( preg_match("/^[MKLP]/", $MI_FIELDS['zip']) ) { + if ( preg_match("/^[-() .0-9]+$/",$MI_FIELDS['phone']) ) { + $phone = preg_replace("/[^0-9]/", '' ,$MI_FIELDS['phone']); + if ( preg_match("/^\d{10}$/",$phone) ) + $MI_FIELDS['phone'] = preg_replace("/(\d{3})(\d{3})(\d{4})/",'${1}-${2}-${3}',$phone); + } + if ( preg_match("/^[-() .0-9]+$/",$MI_FIELDS['email_2']) ) { + $phone = preg_replace("/[^0-9]/", '' ,$MI_FIELDS['email_2']); + if ( preg_match("/^\d{10}$/",$phone) ) + $MI_FIELDS['email_2'] = preg_replace("/(\d{3})(\d{3})(\d{4})/",'${1}-${2}-${3}',$phone); + } + } + } + if (FormLib::get_form_value('ContactInfo_addr2','') !== '') + $MI_FIELDS['street'] .= "\n".FormLib::get_form_value('ContactInfo_addr2'); + $test1 = MeminfoModel::update($memNum, $MI_FIELDS); + + $CUST_FIELDS = array( + 'personNum' => array(1), + 'FirstName' => array(FormLib::get_form_value('ContactInfo_fn')), + 'LastName' => array(FormLib::get_form_value('ContactInfo_ln')) + ); + $test2 = CustdataModel::update($memNum, $CUST_FIELDS); + + if ($test1 === False || $test2 === False) + return "Error: problem saving Contact Information
        "; + else + return ""; + } + + function HasSearch(){ return True; } + + function ShowSearchForm($country="US"){ + $labels = array(); + switch ($country) { + case "US": + $labels['state'] = "State"; + $labels['zip'] = "Zip"; + break; + case "CA": + $labels['state'] = "Province"; + $labels['zip'] = "Postal Code"; + break; + } + return "

        First Name:     Last Name: + +

        + Address: + +

        + City: + + {$labels['state']}: + + {$labels['zip']}: + +

        + Email: + +

        "; + } + + function GetSearchResults(){ + $dbc = $this->db(); + + $fn = FormLib::get_form_value('ContactInfo_fn'); + $ln = FormLib::get_form_value('ContactInfo_ln'); + $addr = FormLib::get_form_value('ContactInfo_addr'); + $city = FormLib::get_form_value('ContactInfo_city'); + $state = FormLib::get_form_value('ContactInfo_state'); + $zip = FormLib::get_form_value('ContactInfo_zip'); + $email = FormLib::get_form_value('ContactInfo_email'); + + $where = ""; + $args = array(); + if (!empty($fn)){ + $where .= " AND FirstName LIKE ?"; + $args[] = '%'.$fn.'%'; + } + if (!empty($ln)){ + $where .= " AND LastName LIKE ?"; + $args[] = '%'.$ln.'%'; + } + if (!empty($addr)){ + $where .= " AND street LIKE ?"; + $args[] = '%'.$addr.'%'; + } + if (!empty($city)){ + $where .= " AND city LIKE ?"; + $args[] = '%'.$city.'%'; + } + if (!empty($state)){ + $where .= " AND state LIKE ?"; + $args[] = '%'.$state.'%'; + } + if (!empty($zip)){ + $where .= " AND zip LIKE ?"; + $args[] = '%'.$zip.'%'; + } + if (!empty($email)){ + $where .= " AND email_1 LIKE ?"; + $args[] = '%'.$email.'%'; + } + + $ret = array(); + if (!empty($where)){ + $q = $dbc->prepare_statement("SELECT CardNo,FirstName,LastName FROM + custdata as c LEFT JOIN meminfo AS m + ON c.CardNo = m.card_no + WHERE 1=1 $where ORDER BY m.card_no"); + $r = $dbc->exec_statement($q,$args); + if ($dbc->num_rows($r) > 0){ + while($w = $dbc->fetch_row($r)){ + $ret[$w[0]] = $w[1]." ".$w[2]; + } + } + } + return $ret; + } +} + +?> diff --git a/fannie/mem/modules/ContactPref.php b/fannie/mem/modules/ContactPref.php new file mode 100644 index 000000000..838322470 --- /dev/null +++ b/fannie/mem/modules/ContactPref.php @@ -0,0 +1,120 @@ +db(); + + // Select the preference for this member and all of the options. + $infoQ = $dbc->prepare_statement("SELECT n.pref, p.pref_id, p.pref_description + FROM memContact AS n, + memContactPrefs AS p + WHERE n.card_no=? + ORDER BY p.pref_id"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + + // If no preference exists get the options and force a default in pref. + if ( $dbc->num_rows($infoR) == 0 ) { + $infoQ = $dbc->prepare_statement("SELECT IF(pref_id=2,2,-1) pref, pref_id, pref_description + FROM memContactPrefs + ORDER BY pref_id"); + $infoR = $dbc->exec_statement($infoQ); + } + + // Compose the display/edit block. + $ret = "
        Member Contact Preference"; + $ret .= ""; + + $ret .= ""; + + $ret .= '"; + + $ret .= "
        Preference
        "; + + return $ret; + + // showEditForm + } + + // Update or insert the Contact Preference. + // Return "" on success or an error message. + function SaveFormData($memNum){ + $dbc = $this->db(); + + $formPref = FormLib::get_form_value('MemContactPref',-1); + + // Does a preference for this member exist? + $infoQ = $dbc->prepare_statement("SELECT pref + FROM memContact + WHERE card_no=?"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + + // If no preference exists, add one if one was chosen. + if ( $dbc->num_rows($infoR) == 0 ) { + if ( $formPref > -1 ) { + $upQ = $dbc->prepare_statement("INSERT INTO memContact (card_no, pref) + VALUES (?, ?)"); + $upR = $dbc->exec_statement($upQ,array($memNum, $formPref)); + if ( $upR === False ) + return "Error: problem adding Contact Preference."; + else + return ""; + } + } + // If one exists, update it unless there was no change. + else { + $row = $dbc->fetch_row($infoR); + $dbPref = $row['pref']; + if ( $formPref != $dbPref ) { + $upQ = $dbc->prepare_statement("UPDATE memContact SET pref = ? + WHERE card_no = ?"); + $upR = $dbc->exec_statement($upQ,array($formPref, $memNum)); + if ( $upR === False ) + return "Error: problem updating Contact Preference."; + else + return ""; + } + } + + return ""; + + // SaveFormData + } + +// ContactPref +} + +?> diff --git a/fannie/mem/modules/Equity.php b/fannie/mem/modules/Equity.php new file mode 100644 index 000000000..20249fc18 --- /dev/null +++ b/fannie/mem/modules/Equity.php @@ -0,0 +1,57 @@ +db(); + $trans = $FANNIE_TRANS_DB.$dbc->sep(); + + $infoQ = $dbc->prepare_statement("SELECT payments + FROM {$trans}newBalanceStockToday_test + WHERE memnum=?"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + $equity = 0; + if ($dbc->num_rows($infoR) > 0) + $equity = array_pop($dbc->fetch_row($infoR)); + + $ret = "
        Equity"; + $ret .= ""; + + $ret .= ""; + $ret .= sprintf('',$equity); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + + + $ret .= "
        Stock Purhcased%.2fHistory
        Transfer EquityConvert Equity
        "; + return $ret; + } +} + +?> diff --git a/fannie/mem/modules/HouseholdMembers.php b/fannie/mem/modules/HouseholdMembers.php new file mode 100644 index 000000000..80b688ac5 --- /dev/null +++ b/fannie/mem/modules/HouseholdMembers.php @@ -0,0 +1,111 @@ +db(); + + $infoQ = $dbc->prepare_statement("SELECT c.FirstName,c.LastName + FROM custdata AS c + WHERE c.CardNo=? AND c.personNum > 1 + ORDER BY c.personNum"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + + $ret = "
        Household Members"; + $ret .= ""; + + $count = 0; + while($infoW = $dbc->fetch_row($infoR)){ + $ret .= sprintf(' + + + ', + $infoW['FirstName'],$infoW['LastName']); + $count++; + } + + while($count < 3){ + $ret .= sprintf(' + + + '); + $count++; + } + + $ret .= "
        First NameLast Name
        First NameLast Name
        "; + return $ret; + } + + function SaveFormData($memNum){ + global $FANNIE_ROOT; + $dbc = $this->db(); + if (!class_exists("CustdataModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/CustdataModel.php'); + + $CUST_FIELDS = array('personNum'=>array(),'FirstName'=>array(),'LastName'=>array()); + + /** + Model needs all names, so lookup primary member + */ + $lookupP = $dbc->prepare_statement("SELECT FirstName,LastName FROM custdata WHERE + personNum=1 AND CardNo=?"); + $lookupR = $dbc->exec_statement($lookupP, array($memNum)); + if ($dbc->num_rows($lookupR) == 0){ + return "Error: Problem saving household members
        "; + } + $lookupW = $dbc->fetch_row($lookupR); + $CUST_FIELDS['personNum'][] = 1; + $CUST_FIELDS['FirstName'][] = $lookupW['FirstName']; + $CUST_FIELDS['LastName'][] = $lookupW['LastName']; + + $fns = FormLib::get_form_value('HouseholdMembers_fn',array()); + $lns = FormLib::get_form_value('HouseholdMembers_ln',array()); + $pn = 2; + for($i=0; $i"; + + return ''; + } +} + +?> diff --git a/fannie/mem/modules/MemCard.php b/fannie/mem/modules/MemCard.php new file mode 100644 index 000000000..12aa66391 --- /dev/null +++ b/fannie/mem/modules/MemCard.php @@ -0,0 +1,99 @@ +db(); + + $prefix = isset($FANNIE_MEMBER_UPC_PREFIX) ? $FANNIE_MEMBER_UPC_PREFIX : ""; + $plen = strlen($prefix); + + $infoQ = $dbc->prepare_statement("SELECT upc + FROM memberCards + WHERE card_no=?"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + if ( $infoR === false ) { + return "Error: problem checking for Member Card
        "; + } + + $ret = "
        Membership Card"; + $ret .= ""; + + if ( $dbc->num_rows($infoR) > 0 ) { + $infoW = $dbc->fetch_row($infoR); + $upc = $infoW['upc']; + if ( $prefix && strpos("$upc", "$prefix") === 0 ) { + $upc = substr($upc,$plen); + $upc = ltrim($upc,"0"); + } + } else { + $upc = ""; + } + $ret .= ""; + $ret .= ""; + $ret .= ''; + + $ret .= "
        Card#
        "; + + return $ret; + + // showEditForm + } + + // Update, insert or delete the Member Card#. + // Return "" on success or an error message. + function SaveFormData($memNum){ + + global $FANNIE_MEMBER_UPC_PREFIX, $FANNIE_ROOT; + $dbc = $this->db(); + if (!class_exists("MemberCardsModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/MemberCardsModel.php'); + + $prefix = isset($FANNIE_MEMBER_UPC_PREFIX) ? $FANNIE_MEMBER_UPC_PREFIX : ""; + $plen = strlen($prefix); + + $form_upc = FormLib::get_form_value('memberCard',''); + // Restore prefix and leading 0's to upc. + if ( $form_upc && strlen($form_upc) < 13 ) { + $clen = (13 - $plen); + $form_upc = sprintf("{$prefix}%0{$clen}d", $form_upc); + } + + if (!MemberCardsModel::update($memNum, $form_upc)) + return 'Error: problem saving Member Card
        '; + else + return ''; + + // saveFormData + } + +// MemCard +} + +?> diff --git a/fannie/mem/modules/MemDates.php b/fannie/mem/modules/MemDates.php new file mode 100644 index 000000000..9345af9de --- /dev/null +++ b/fannie/mem/modules/MemDates.php @@ -0,0 +1,76 @@ +db(); + + $infoQ = $dbc->prepare_statement("SELECT start_date,end_date + FROM memDates + WHERE card_no=?"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + $infoW = $dbc->fetch_row($infoR); + + $ret = ""; + $ret .= "
        Membership Dates"; + $ret .= ""; + + $ret .= ""; + $ret .= sprintf('',$infoW['start_date']); + $ret .= ""; + $ret .= sprintf('',$infoW['end_date']); + + $ret .= "
        Start DateEnd Date
        "; + + return $ret; + } + + function SaveFormData($memNum){ + global $FANNIE_ROOT; + $dbc = $this->db(); + if (!class_exists("MemDatesModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/MemDatesModel.php'); + + $test = MemDatesModel::update($memNum, + FormLib::get_form_value('MemDates_start'), + FormLib::get_form_value('MemDates_end') + ); + + if ($test === False) + return "Error: problem saving start/end dates
        "; + else + return ""; + } +} + +?> diff --git a/fannie/mem/modules/MemType.php b/fannie/mem/modules/MemType.php new file mode 100644 index 000000000..cad97d183 --- /dev/null +++ b/fannie/mem/modules/MemType.php @@ -0,0 +1,108 @@ +db(); + + $infoQ = $dbc->prepare_statement("SELECT c.memType,n.memType,n.memDesc,c.discount + FROM custdata AS c, + memtype AS n + WHERE c.CardNo=? AND c.personNum=1 + ORDER BY n.memType"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + + $ret = "
        Membership Type"; + $ret .= ""; + + $ret .= ""; + $ret .= '"; + + $ret .= ""; + /* + $ret .= sprintf('',$disc); + */ + $ret .= sprintf('',$disc); + + $ret .= "
        TypeDiscount
        %d%%
        "; + return $ret; + } + + function SaveFormData($memNum){ + global $FANNIE_ROOT; + $dbc = $this->db(); + if (!class_exists("CustdataModel")) + include($FANNIE_ROOT.'classlib2.0/data/models/CustdataModel.php'); + + $mtype = FormLib::get_form_value('MemType_type',0); + $q = $dbc->prepare_statement("SELECT discount,staff,SSI,cd_type FROM memdefaults + WHERE memtype=?"); + $r = $dbc->exec_statement($q,array($mtype)); + + $CUST_FIELDS = array(); + $CUST_FIELDS['memType'] = $mtype; + $CUST_FIELDS['Type'] = 'REG'; + $CUST_FIELDS['Staff'] = 0; + $CUST_FIELDS['Discount'] = 0; + $CUST_FIELDS['SSI'] = 0; + if ($dbc->num_rows($r) > 0){ + $w = $dbc->fetch_row($r); + $CUST_FIELDS['Type'] = $w['cd_type']; + $CUST_FIELDS['Discount'] = $w['discount']; + $CUST_FIELDS['Staff'] = $w['staff']; + $CUST_FIELDS['SSI'] = $w['SSI']; + } + + $cust = new CustdataModel($dbc); + $cust->CardNo($memNum); + foreach($cust->Find() as $obj){ + $obj->memType($mtype); + $obj->Type($CUST_FIELDS['Type']); + $obj->Staff($CUST_FIELDS['Staff']); + $obj->Discount($CUST_FIELDS['Discount']); + $obj->SSI($CUST_FIELDS['SSI']); + $obj->save(); + } + + if ($upR === False ) + return "Error: problem saving Member Type
        "; + else + return ""; + } +} + +?> diff --git a/fannie/mem/modules/Notes.php b/fannie/mem/modules/Notes.php new file mode 100644 index 000000000..ce4e6cd29 --- /dev/null +++ b/fannie/mem/modules/Notes.php @@ -0,0 +1,127 @@ +db(); + + $infoQ = $dbc->prepare_statement("SELECT note,stamp FROM memberNotes + WHERE cardno=? ORDER BY stamp DESC"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + + $recentNote = ""; + $recentDate = ""; + /* + Always show the most recent note + */ + if ($dbc->num_rows($infoR) > 0){ + $temp = $dbc->fetch_row($infoR); + $recentNote = str_replace("
        ","\n",$temp['note']); + $recentDate = $temp['stamp']; + } + + $ret = "
        Notes"; + + $ret .= ""; + $ret .= ""; +// $ret .= ""; + $ret .= "\n"; + $ret .= ""; + $ret .= ''; + $ret .= "
        Additional NotesHistory
        "; + if ($dbc->num_rows($infoR) > 1){ + $ret .= ""; + $ret .= ""; + } + $ret .= "
        \n"; + + $ret .= ""; + while ( $infoW = $dbc->fetch_row($infoR) ) { + // converting br tags to newlines is only necessary + // when displaying in a textarea + $note = $infoW['note']; + $date = $infoW['stamp']; + $ret .= "\n"; + } + $ret .= "
        $date$note
        \n"; + + $ret .= "
        \n"; + return $ret; + } + + function SaveFormData($memNum){ + + /* entry blank. do not save */ + $note = FormLib::get_form_value('Notes_text'); + if ( $note == "" ) { + return ""; + } + + /* entry has note changed. this means it's already + in memberNotes as the most recent entry */ + $current = FormLib::get_form_value('Notes_current'); + if ($note == base64_decode($current)){ + return ""; + } + + $dbc = $this->db(); + + $insertNote = $dbc->prepare_statement("INSERT into memberNotes + (cardno, note, stamp, username) + VALUES (?, ?, ".$dbc->now().", 'Admin')"); + + // convert newlines back to br tags + // so displayed notes have user's + // paragraph formatting + $note = str_replace("\n",'
        ',$note); + $test1 = $dbc->exec_statement($insertNote,array($memNum,$note)); + + if ($test1 === False ) + return "Error: problem saving Notes
        "; + else + return ""; + } + +// Notes +} + +?> diff --git a/fannie/mem/modules/Suspension.php b/fannie/mem/modules/Suspension.php new file mode 100644 index 000000000..aed86d108 --- /dev/null +++ b/fannie/mem/modules/Suspension.php @@ -0,0 +1,72 @@ +db(); + + $infoQ = $dbc->prepare_statement("SELECT CASE WHEN s.type = 'I' THEN 'Inactive' ELSE 'Terminated' END as status, + s.suspDate, + CASE WHEN s.reasoncode = 0 THEN s.reason ELSE r.textStr END as reason + FROM suspensions AS s LEFT JOIN reasoncodes AS r + ON s.reasoncode & r.mask <> 0 + WHERE s.cardno=?"); + $infoR = $dbc->exec_statement($infoQ,array($memNum)); + + $status = "Active"; + $date = ""; + $reason = ""; + if ($dbc->num_rows($infoR) > 0){ + while($infoW = $dbc->fetch_row($infoR)){ + $status = $infoW['status']; + $date = $infoW['suspDate']; + $reason .= $infoW['reason'].", "; + } + $reason = rtrim($reason,", "); + } + + $ret = "
        Active Status"; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + if (!empty($reason)){ + $ret .= ""; + $ret .= ""; + } + $ret .= ""; + $ret .= ""; + + $ret .= "
        Current Status$statusReason$reason
        HistoryChange Status
        "; + return $ret; + } +} + +?> diff --git a/fannie/mem/numbers/MemberStickerPage.php b/fannie/mem/numbers/MemberStickerPage.php new file mode 100644 index 000000000..bcfca652b --- /dev/null +++ b/fannie/mem/numbers/MemberStickerPage.php @@ -0,0 +1,85 @@ +SetMargins(0.5,0.5,0.5); + $pdf->SetAutoPageBreak(False,0.5); + $pdf->AddPage(); + + $start = FormLib::get_form_value('start'); + $x = 0.5; + $y = 0.5; + $pdf->AddFont('Scala-Bold','B','Scala-Bold.php'); + $pdf->SetFont('Scala-Bold','B',16); + for($i=0;$i<40;$i++){ + $current = $start+$i; + $pdf->SetXY($x,$y); + $pdf->Cell(1.75,0.5,$current,0,0,'C'); + $pdf->Cell(1.75,0.5,$current,0,0,'C'); + if ($i % 2 == 0) $x += (1.75*2)+0.5; + else { + $x = 0.5; + $y += 0.5; + } + } + $pdf->Close(); + $pdf->Output("mem stickers $start.pdf","I"); + + return False; + } + return True; + } + + function body_content(){ + return '
        +

        + Generate a sheet of member stickers
        + Format: Avery 5267
        + Starting member number: +
        +
        + +

        +
        '; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new MemberStickerPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/mem/numbers/index.php b/fannie/mem/numbers/index.php new file mode 100644 index 000000000..df7740908 --- /dev/null +++ b/fannie/mem/numbers/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/mem/patronage/gross.php b/fannie/mem/patronage/gross.php new file mode 100644 index 000000000..039112ff6 --- /dev/null +++ b/fannie/mem/patronage/gross.php @@ -0,0 +1,77 @@ +table_exists("patronage_workingcopy")){ + $drop = $dbc->prepare_statement("DROP TABLE patronage_workingcopy"); + $dbc->exec_statement($drop); + } + $create = $dbc->prepare_statement(duplicate_structure($FANNIE_SERVER_DBMS,'patronage','patronage_workingcopy')); + $dbc->exec_statement($create); + + $insQ = sprintf("INSERT INTO patronage_workingcopy + SELECT card_no, + SUM(CASE WHEN trans_type IN ('I','D') THEN total ELSE 0 END), + SUM(CASE WHEN trans_type IN ('S') then total ELSE 0 END), + 0,0,0,0,0,? + FROM %s%sdlog_patronage as d + LEFT JOIN MasterSuperDepts AS m + ON d.department=m.dept_ID WHERE m.superID is null or m.superID <> 0 + GROUP BY card_no",$FANNIE_TRANS_DB,$dbc->sep()); + $prep = $dbc->prepare_statement($insQ); + $dbc->exec_statement($prep,array($_REQUEST['FY'])); + + echo 'Purchases and Discounts loaded'; +} +else { + echo '
        '; + echo 'Step two: calculate totals sales and percent discounts per member for the year'; + echo '
        '; + echo '
        '; + echo 'Fiscal Year: '; + echo ''; + echo '

        '; + echo ''; + echo '
        '; +} + +echo '

        '; +echo 'Patronage Menu'; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/mem/patronage/index.php b/fannie/mem/patronage/index.php new file mode 100644 index 000000000..76e3dd13d --- /dev/null +++ b/fannie/mem/patronage/index.php @@ -0,0 +1,40 @@ + + + diff --git a/fannie/mem/patronage/net.php b/fannie/mem/patronage/net.php new file mode 100644 index 000000000..e3083d9d1 --- /dev/null +++ b/fannie/mem/patronage/net.php @@ -0,0 +1,39 @@ +prepare_statement("UPDATE patronage_workingcopy SET + net_purch = purchase + discounts + rewards"); +$r = $dbc->exec_statement($q); +echo 'Net purchases updated'; + +echo '

        '; +echo 'Patronage Menu'; +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/mem/patronage/report.php b/fannie/mem/patronage/report.php new file mode 100644 index 000000000..d3bc2baf7 --- /dev/null +++ b/fannie/mem/patronage/report.php @@ -0,0 +1,90 @@ +Patronage Menu'; + echo '

        '; + echo 'Download Report'; + echo '

        '; +} +else { + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="patronage-draft.csv"'); +} + +$q = $dbc->prepare_statement("SELECT p.cardno,c.LastName,c.FirstName,c.Type, + CASE WHEN c.Type IN ('REG','PC') then a.memDesc + ELSE b.memDesc END as memDesc, + p.purchase,p.discounts,p.rewards,p.net_purch, + CASE WHEN s.reasoncode IS NULL then 'No' + WHEN s.reasoncode & 16 <> 0 then 'Yes' + ELSE 'No' END as badAddress + FROM patronage_workingcopy AS p LEFT JOIN + custdata AS c ON p.cardno=c.CardNo AND c.personNum=1 + LEFT JOIN suspensions AS s ON p.cardno=s.cardno + LEFT JOIN memtype AS a ON c.memType=a.memtype + LEFT JOIN memtype AS b ON s.memtype1=b.memtype + ORDER BY p.cardno"); +$r = $dbc->exec_statement($q); +echo ''; +echo ' + +'; +while($w = $dbc->fetch_row($r)){ + printf(' + + ',$w['cardno'],$w['LastName'], + $w['FirstName'],$w['Type'],$w['memDesc'], + $w['purchase'],-1*$w['discounts'],-1*$w['rewards'], + $w['net_purch'],$w['badAddress'] + ); +} +echo '
        #LastFirstStatusTypeGrossDiscountsRewardsNetBad Address
        %d%s%s%s%s%.2f%.2f%.2f%.2f%s
        '; + +if (!isset($_REQUEST['excel'])) + include($FANNIE_ROOT.'src/footer.html'); + +$output = ob_get_contents(); +ob_end_clean(); + +if (!isset($_REQUEST['excel'])){ + echo $output; +} +else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + //include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToCsv.php'); + $array = HtmlToArray($output); + //$xls = ArrayToXls($array); + $xls = ArrayToCsv($array); + echo $xls; +} +?> diff --git a/fannie/mem/patronage/rewards.php b/fannie/mem/patronage/rewards.php new file mode 100644 index 000000000..7e2ac6da8 --- /dev/null +++ b/fannie/mem/patronage/rewards.php @@ -0,0 +1,79 @@ +sep(),$upcs); + $prep = $dbc->prepare_statement($fetchQ); + $fetchR = $dbc->exec_statement($prep,$args); + + $upP = $dbc->prepare_statement("UPDATE patronage_workingcopy + SET rewards=? WHERE cardno=?"); + while($fetchW = $dbc->fetch_row($fetchR)){ + if ($fetchW['total']==0) continue; + $dbc->exec_statement($upP,array($fetchW['total'],$fetchW['card_no'])); + } + + echo 'Rewards loaded'; +} +else { + echo '
        '; + echo 'Step three: calculate additonal member rewards. This currently includes + the virtual coupon and any custom coupon UPCs specified here'; + echo '
        '; + echo '
        '; + echo 'UPC(s): '; + echo ''; + echo '

        '; + echo ''; + echo '
        '; +} + +echo '

        '; +echo 'Patronage Menu'; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/mem/patronage/upload.php b/fannie/mem/patronage/upload.php new file mode 100644 index 000000000..60d8440f4 --- /dev/null +++ b/fannie/mem/patronage/upload.php @@ -0,0 +1,64 @@ +prepare_statement("INSERT INTO patronage (cardno,purchase,discounts,rewards,net_purch,tot_pat, + cash_pat,equit_pat,FY) VALUES (?,?,?,?,?,?,?,?,?)"); + foreach($argSets as $args) + $dbc->exec_statement($insP,$args); + echo "Patronage imported!"; + } + + fclose($fp); + unlink($filename); +} +else { +?> + +
        + +Fiscal Year:

        +

        +Filename: + +

        + + + + + diff --git a/fannie/mem/patronage/working.php b/fannie/mem/patronage/working.php new file mode 100644 index 000000000..237655037 --- /dev/null +++ b/fannie/mem/patronage/working.php @@ -0,0 +1,107 @@ +table_exists("dlog_patronage")){ + $drop = $dbc->prepare_statement("DROP TABLE dlog_patronage"); + $dbc->exec_statement($drop); + } + $create = $dbc->prepare_statement(duplicate_structure($FANNIE_SERVER_DBMS,'dlog_15','dlog_patronage')); + $dbc->exec_statement($create); + + $insQ = sprintf("INSERT INTO dlog_patronage + SELECT d.* FROM %s AS d + LEFT JOIN %s%scustdata AS c ON c.CardNo=d.card_no + AND c.personNum=1 LEFT JOIN + %s%ssuspensions AS s ON d.card_no=s.cardno + WHERE (d.trans_type IN ('I','D','S') + OR (d.trans_type='T' AND d.trans_subtype IN ('MA','IC'))) + AND d.total <> 0 + AND (s.memtype1 IN %s OR c.memType IN %s) + AND d.tdate BETWEEN ? AND ?", + $dlog,$FANNIE_OP_DB,$dbc->sep(), + $FANNIE_OP_DB,$dbc->sep(), + $mtype,$mtype); + $args = $mArgs; + foreach($mArgs as $m) $args[] = $m; // need them twice + $args[] = $_REQUEST['date1'].' 00:00:00'; + $args[] = $_REQUEST['date2'].' 23:59:59'; + + $prep = $dbc->prepare_statement($insQ); + $dbc->exec_statement($prep,$args); + + echo 'Patronage working table created'; +} +else { + echo ''; + echo '
        '; + echo 'Step one: gather member transactions for the year. Dates specify the start and + end of the year. Inactive and terminated memberships will be included if their type, + prior to suspension, matches one of the requested types.'; + echo '
        '; + echo '
        '; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
        Start Date'; + echo '
        End Date'; + echo '
        Member Type:
        '; + $typeQ = $dbc->prepare_statement("SELECT memtype,memDesc FROM ".$FANNIE_OP_DB.$dbc->sep()."memtype ORDER BY memtype"); + $typeR = $dbc->exec_statement($typeQ); + while($typeW = $dbc->fetch_row($typeR)){ + printf('
        ', + $typeW['memtype'],$typeW['memtype'], + $typeW['memtype'],$typeW['memDesc'] + ); + } + echo '

        '; + echo ''; + echo '
        '; +} + +echo '

        '; +echo 'Patronage Menu'; + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/mem/prefs.php b/fannie/mem/prefs.php new file mode 100644 index 000000000..d411ee104 --- /dev/null +++ b/fannie/mem/prefs.php @@ -0,0 +1,85 @@ +Error - no member specified
        '; +} +else { + + if (isset($_REQUEST['savebtn'])){ + $pk = isset($_REQUEST['pref_k']) ? $_REQUEST['pref_k'] : array(); + $pv = isset($_REQUEST['pref_v']) ? $_REQUEST['pref_v'] : array(); + if (is_array($pk) && is_array($pv) && count($pk)==count($pv)){ + $delP = $dbc->prepare_statement("DELETE FROM custPreferences + WHERE card_no=? AND pref_key=?"); + $insP = $dbc->prepare_statement("INSERT INTO custPreferences + (card_no, pref_key, pref_value) VALUES (?,?,?)"); + for($i=0;$iexec_statement($delP,array($cardno,$pk[$i])); + $dbc->exec_statement($insP,array($cardno,$pk[$i],$pv[$i])); + } + echo '
        Settings Saved
        '; + } + } + + printf('

        Account #%d

        ',$cardno); + echo '
        '; + printf('',$cardno); + + $prefQ = $dbc->prepare_statement("SELECT a.pref_key, + CASE WHEN c.pref_value IS NULL THEN a.pref_default_value ELSE c.pref_value END + AS current_value, + a.pref_description + FROM custAvailablePrefs AS a + LEFT JOIN custPreferences AS c + ON a.pref_key=c.pref_key AND c.card_no=? + ORDER BY a.pref_key"); + $prefR = $dbc->exec_statement($prefQ,array($cardno)); + echo ''; + echo ''; + while($prefW = $dbc->fetch_row($prefR)){ + printf(' + + ', + $prefW['pref_description'], + $prefW['current_value'], + $prefW['pref_key'] + ); + } + echo '
        SettingValue
        %s

        '; + echo ''; + echo '
        '; +} + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/mem/statements/busAR.php b/fannie/mem/statements/busAR.php new file mode 100644 index 000000000..9831414b2 --- /dev/null +++ b/fannie/mem/statements/busAR.php @@ -0,0 +1,213 @@ +",$_REQUEST['msg']); + $msg = str_replace("\r","",$msg); + $msg = "".$msg.""; + $headers = "From: Whole Foods Co-op \r\n"; + $headers .= 'MIME-Version: 1.0' . "\r\n"; + $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; + mail($to,$sub,$msg,$headers); + $logQ = $dbc->prepare_statement("INSERT INTO emailLog VALUES (".$dbc->now().",?,?,'AR (Business EOM)')"); + $dbc->exec_statement($logQ,array($_REQUEST['curcard'],$to)); + echo "E-mail sent to $to
        "; + } + else if (isset($_REQUEST['skip_email'])){ + $to = $_REQUEST['email']; + echo "Did not send e-mail to $to
        "; + } + if (!empty($cns)){ + $cur = array_shift($cns); + $q = $dbc->prepare_statement("SELECT m.card_no, a.memName, + m.email_1, + a.TwoMonthBalance,a.LastMonthCharges, + a.LastMonthPayments,a.LastMonthBalance + FROM AR_EOM_Summary a LEFT JOIN + meminfo m ON a.cardno = m.card_no + LEFT JOIN custdata as c on c.cardno=a.cardno and c.personnum=1 + WHERE a.cardno=?"); + $r = $dbc->exec_statement($q,array($cur)); + $w = $dbc->fetch_row($r); + + echo "
        "; + foreach($cns as $c) + echo ""; + echo ""; + echo "Email Address:

        "; + echo "Message Preview:
        "; + $beg = sprintf("%.2f",$w[3]); + $chg = sprintf("%.2f",$w[4]); + $pay = sprintf("%.2f",$w[5]); + $bal = sprintf("%.2f",$w[6]); + $span = date("F Y",mktime(0,0,0,date('m')-1,1,date('Y'))); + $msg = "Whole Foods Co-op +610 East Fourth Street +Duluth, MN 55805 +(218) 728-0884 + +$w[0] +$w[1] +$w[2] + +If payment has been made or sent, please ignore this invoice. If you have any questions about this invoice or would like to make arrangements to pay your balance, please write or call the Finance Department at the above address or e-mail mms@wholefoods.coop. See below for WFC IOU Policies. + + + +
        Balance summary $span
        Beginning BalanceChargesPaymentsEnding BalanceAmount Due
        \$$beg\$$chg\$$pay\$$bal\$$bal
        \n"; + $histQ = $dbc->prepare_statement("SELECT card_no, max(charges) as charges, max(payments) as payments, + convert(varchar(50),date,101), trans_num,min(description),min(dept_name), + count(*) + FROM AR_statementHistory WHERE card_no = ? + group by convert(varchar(50),date,101),trans_num,card_no + order by max(date) desc"); + $gazetteFlag = False; + $msg .= " +"; + $histR = $dbc->exec_statement($histQ,array($cur)); + while ($histW = $dbc->fetch_row($histR)){ + $msg .= sprintf("", + $histW[3],$histW[4],$histW[1],$histW[2]); + if ($histW[2] > 0) + $msg .= ""; + elseif ($histW[7] > 0) + $msg .= ""; + elseif (!empty($histW[5])) + $msg .= ""; + else + $msg .= ""; + if ($histW[5] == 'Gazette Ad' || $histW[6] == 'Gazette Ad') + $gazetteFlag = True; + } + $msg .= "
        Recent 90 Day History
        DateReceiptChargesPayments
        %s%s\$%.2f\$%.2f
        Payment - Thank You!
        (Multiple items)
        $histW[5]
        $histW[6]
        \n"; + + if ($gazetteFlag){ + $msg .= "

        "; + $msg .= "To continue, discontinue, or alter your gazette advertisement, "; + $msg .= "Please Click Here "; + $msg .= "or copy/paste this link into your browser's address bar:
        "; + $msg .= "http://wholefoods.coop/gz/?m=$cur"; + $msg .= "

        "; + } + + $msg = str_replace("\n","
        ",$msg); + echo $msg; + + $msg .= "
        +IOU POLICY + +OF WHOLE FOODS COMMUNITY CO-OP, INC. + +WFC members may charge purchases to a maximum of $20.00 payable within two (2) weeks from the date incurred. +IOU's must be signed by the maker. IOU's may not, under any circumstances, be paid with Food Stamps or EBT card. +WFC asks that its members only use the charge system for emergencies. + +-Members with an IOU account credit balance will receive a reminder of that balance on each purchase receipt. +-Members with an IOU debit balance will receive a reminder of that balance on each purchase receipt. + +If WFC is not reimbursed by a member within sixty (60) days from the date of an overdue IOU for the amount of +that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all +indebtedness owed to WFC, will be converted to non-voting Class B stock. + +If WFC is not reimbursed by a member within sixty (60) days from the date of a bounced check for the amount of +that check plus the amount of any administrative fee, that person's membership may be terminated by the Board +and any remaining stock, after reimbursement for all indebtedness owed to WFC, will converted to non-voting +Class B stock. + +IOU credit balances over sixty (60) days will be credited to the Member's non-voting Class B stock and the IOU +account will be adjusted to zero. Members may request the return of Class B stock in excess of the amount +required by the By-Laws by submitting to the Board a Request to Terminate that excess stock. + +At the discretion of the General Manager, member business and non-profit agency accounts may have higher IOU +limits and/or extended payment terms. + +SPECIAL ORDERS +Special orders not picked up or paid for within thirty (30) days of the time items are received at WFC will +be put out for sale or disposed of at management discretion. Future special orders from members or from non- +members who have not previously promptly paid for and/or picked up special orders, at management discretion, +may require prepayment. + +NEWSLETTER ADS +Members may charge the cost of advertising their business in WFC's newsletter under the same IOU payment terms +as noted above but on an IOU account separate from the member's IOU account for inventory purchases. + +Members will be mailed an invoice within ten (10) days of the date of publication for the amount of the advertising +charge. Failure to pay the amount due is then subject to the provisions of this IOU policy. + +NOTE +Memberships with IOUs and/or other credit problems in excess of sixty (60) days may be placed on inactive status +by management pending Board action. Purchases by inactive members will not be recorded and will not count toward +eligibility for a patronage rebate. Purchases by inactive members are not eligible for member discounts or member +specials. Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject +to Board discretion with respect to access to member credit benefits."; + $msg = str_replace("\n","
        ",$msg); + $msg = str_replace("\r","",$msg); + $msg = str_replace("\"","",$msg); + echo ""; + + echo ""; + echo "     "; + echo ""; + echo "
        "; + } + else { + echo "Done with all selected memberships
        + Home"; + } +} +elseif (!isset($_REQUEST['cardno'])){ + echo "
        "; + $query = $dbc->prepare_statement("SELECT a.cardno, c.lastname,i.email_1 + FROM AR_EOM_Summary a LEFT JOIN + custdata as c on c.cardno=a.cardno and c.personnum=1 + LEFT JOIN meminfo AS i ON c.cardno=i.card_no + WHERE c.type not in ('TERM') and + c.memtype = 2 + and (a.LastMonthBalance <> 0 or a.lastMonthCharges <> 0 or a.lastMonthPayments <> 0) + ORDER BY a.cardno"); + $result = $dbc->exec_statement($query); + echo " + "; + while($row = $dbc->fetch_row($result)){ + printf(" + ", + (empty($row[2])?' ':""), + $row[0],$row[1],$row[2]); + } + echo "
         MemberE-mail
        %s%d - %s%s
        "; + echo ""; + echo "
        "; +} + +include('../../src/footer.html'); +?> diff --git a/fannie/mem/statements/busInv.php b/fannie/mem/statements/busInv.php new file mode 100644 index 000000000..853e0a328 --- /dev/null +++ b/fannie/mem/statements/busInv.php @@ -0,0 +1,175 @@ +",$_REQUEST['msg']); + $msg = str_replace("\r","",$msg); + $msg = "".$msg.""; + $headers = "From: Whole Foods Co-op \r\n"; + $headers .= 'MIME-Version: 1.0' . "\r\n"; + $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; + mail($to,$sub,$msg,$headers); + $logQ = $dbc->prepare_statement("INSERT INTO emailLog VALUES (".$dbc->now().",?,?,'AR (Business Any Balance)')"); + $dbc->exec_statement($logQ,array($_REQUEST['curcard'],$to)); + echo "E-mail sent to $to
        "; + } + else if (isset($_REQUEST['skip_email'])){ + $to = $_REQUEST['email']; + echo "Did not send e-mail to $to
        "; + } + if (!empty($cns)){ + $cur = array_shift($cns); + $q = $dbc->prepare_statement("SELECT m.card_no, + CASE WHEN c.firstname='' THEN c.lastname ELSE c.firstname+' '+c.lastname END, + m.email_1,n.balance + FROM meminfo AS m LEFT JOIN + custdata as c on c.cardno=m.card_no and c.personnum=1 + LEFT JOIN {$trans}.ar_live_balance AS n + ON m.card_no=n.card_no + WHERE m.card_no=?"); + $r = $dbc->exec_statement($q,array($cur)); + $w = $dbc->fetch_row($r); + + echo "
        "; + foreach($cns as $c) + echo ""; + echo ""; + echo "Email Address:

        "; + echo "Message Preview:
        "; + $bal = sprintf("%.2f",$w[3]); + + $trans = $FANNIE_TRANS_DB; + if ($FANNIE_SERVER_DBMS=='MSSQL') $trans .= ".dbo"; + $priorQ = $dbc->prepare_statement("SELECT sum(charges) - sum(payments) FROM {$trans}.ar_history + WHERE datediff(dd,getdate(),tdate) < -90 + AND card_no = ?"); + $priorR = $dbc->exec_statement($priorQ,array($cur)); + $priorBalance = array_pop($dbc->fetch_row($priorR)); + + $msg = "Whole Foods Co-op +610 East Fourth Street +Duluth, MN 55805 +(218) 728-0884 + +$w[0] +$w[1] +$w[2] + +If payment has been made or sent, please ignore this invoice. If you have any questions about this invoice or would like to make arrangements to pay your balance, please write or call the Finance Department at the above address or e-mail mms@wholefoods.coop.\n"; + +$msg .= "\nBalance Forward: \$".$priorBalance."\n"; + + $histQ = $dbc->prepare_statement("SELECT card_no, max(charges) as charges, max(payments) as payments, + convert(varchar(50),date,101), trans_num,min(description),min(dept_name), + count(*) + FROM AR_statementHistory WHERE card_no = ? + group by convert(varchar(50),date,101),trans_num,card_no + order by max(date) desc"); + $gazetteFlag = False; + $msg .= " +"; + $histR = $dbc->exec_statement($histQ,array($cur)); + while ($histW = $dbc->fetch_row($histR)){ + $msg .= sprintf("", + $histW[3],$histW[4],$histW[1],$histW[2]); + if ($histW[2] > 0) + $msg .= ""; + elseif ($histW[7] > 0) + $msg .= ""; + elseif (!empty($histW[5])) + $msg .= ""; + else + $msg .= ""; + if ($histW[5] == 'Gazette Ad' || $histW[6] == 'Gazette Ad') + $gazetteFlag = True; + } + $msg .= "
        Recent 90 Day History
        DateReceiptChargesPayments
        %s%s\$%.2f\$%.2f
        Payment - Thank You!
        (Multiple items)
        $histW[5]
        $histW[6]
        \n"; + + $msg .= "Amount Due: \$".$bal."\n"; + + if ($gazetteFlag){ + $msg .= "

        "; + $msg .= "To continue, discontinue, or alter your gazette advertisement, "; + $msg .= "Please Click Here "; + $msg .= "or copy/paste this link into your browser's address bar:
        "; + $msg .= "http://wholefoods.coop/gz/?m=$cur"; + $msg .= "

        "; + } + + $msg = str_replace("\n","
        ",$msg); + echo $msg; + + $msg = str_replace("\"","",$msg); + echo ""; + + echo ""; + echo "     "; + echo ""; + echo "
        "; + } + else { + echo "Done with all selected memberships
        + Home"; + } +} +elseif (!isset($_REQUEST['cardno'])){ + echo "
        "; + $query = $dbc->prepare_statement("SELECT c.cardno, c.lastname,i.email_1 + FROM + custdata as c + LEFT JOIN meminfo AS i ON c.cardno=i.card_no + LEFT JOIN {$trans}.ar_live_balance AS n + ON c.cardno=n.card_no + WHERE c.type not in ('TERM') and + c.memtype = 2 AND c.personnum=1 + and n.balance > 0 + ORDER BY c.cardno"); + $result = $dbc->exec_statement($query); + echo " + "; + while($row = $dbc->fetch_row($result)){ + printf(" + ", + (empty($row[2])?' ':""), + $row[0],$row[1],$row[2]); + } + echo "
         MemberE-mail
        %s%d - %s%s
        "; + echo ""; + echo "
        "; +} + +include('../../src/footer.html'); +?> diff --git a/fannie/mem/statements/equity.php b/fannie/mem/statements/equity.php new file mode 100644 index 000000000..04784dcf8 --- /dev/null +++ b/fannie/mem/statements/equity.php @@ -0,0 +1,131 @@ +\r\n"; + mail($to,$sub,$msg,$headers); + $logQ = $dbc->prepare_statement("INSERT INTO emailLog VALUES (".$dbc->now().",?,?,'Equity')"); + $dbc->exec_statement($logQ,array($_REQUEST['curcard'],$to)); + echo "E-mail sent to $to
        "; + } + else if (isset($_REQUEST['skip_email'])){ + $to = $_REQUEST['email']; + echo "Did not send e-mail to $to
        "; + } + if (!empty($cns)){ + $cur = array_shift($cns); + $q = $dbc->prepare_statement("SELECT m.card_no,c.firstname,c.lastname, + m.email_1,n.payments, + convert(varchar,d.end_date,101) + FROM meminfo AS m LEFT JOIN + custdata AS c ON m.card_no=c.cardno + AND c.personnum=1 LEFT JOIN + {$trans}.newBalanceStockToday_test AS n + on m.card_no = n.memnum + LEFT JOIN memDates AS d ON m.card_no=d.card_no + WHERE cardno = ?"); + $r = $dbc->exec_statement($q,array($cn)); + $w = $dbc->fetch_row($r); + + echo "
        "; + foreach($cns as $c) + echo ""; + echo ""; + echo "Email Address:

        "; + echo "Message Preview:
        "; + echo ""; + echo "
        "; + echo ""; + echo "     "; + echo ""; + echo "
        "; + } + else { + echo "Done with all selected memberships
        + Home"; + } +} +elseif (!isset($_REQUEST['cardno'])){ + echo "
        "; + $query = $dbc->prepare_statement("select m.card_no,c.lastname,i.email_1, + datediff(mm,getdate(),m.end_date) as months_left from + memDates as m left join custdata as c + on m.card_no=c.cardno and c.personnum=1 + left join {$trans}.newBalanceStockToday_test as n on + m.card_no = n.memnum left join meminfo as i + on i.card_no=m.card_no + where ".$dbc->monthdiff($dbc->now(),'m.end_date')." BETWEEN 0 AND 2 + and c.type NOT IN ('REG','TERM','INACT2') and n.payments < 100 + order by ".$dbc->monthdiff($dbc->now(),'m.end_date')." DESC, m.card_no"); + $result = $dbc->exec_statement($query); + echo " + "; + while($row = $dbc->fetch_row($result)){ + printf(" + ", + (empty($row[2])?' ':""), + $row[0],$row[1],$row[2],$row[3]); + } + echo "
         MemberE-mailMonths Remaining
        %s%d - %s%s%d
        "; + echo ""; + echo "
        "; +} + +include('../../src/footer.html'); +?> diff --git a/fannie/mem/statements/history.php b/fannie/mem/statements/history.php new file mode 100644 index 000000000..c0757d157 --- /dev/null +++ b/fannie/mem/statements/history.php @@ -0,0 +1,61 @@ +"; +echo "   "; +echo ""; +echo ""; +echo "
        "; +echo " + "; +$q = $dbc->prepare_statement("SELECT * FROM emailLog WHERE month(tdate)=? AND year(tdate)=? ORDER BY tdate"); +$r = $dbc->exec_statement($q,array($month,$year)); +while($w = $dbc->fetch_row($r)){ + printf("", + array_shift(explode(" ",$w[0])),$w[1],$w[2],$w[3]); +} +echo "
        DateMem #E-mailType
        %s%d%s%s
        "; + +include('../../src/footer.html'); +?> diff --git a/fannie/mem/statements/index.php b/fannie/mem/statements/index.php new file mode 100644 index 000000000..e0780ed43 --- /dev/null +++ b/fannie/mem/statements/index.php @@ -0,0 +1,40 @@ + + +

        +Sent E-mail History + diff --git a/fannie/mem/statements/indvAR.php b/fannie/mem/statements/indvAR.php new file mode 100644 index 000000000..6b78f513b --- /dev/null +++ b/fannie/mem/statements/indvAR.php @@ -0,0 +1,200 @@ +",$_REQUEST['msg']); + $msg = str_replace("\r","",$msg); + $msg = "".$msg.""; + $headers = "From: Whole Foods Co-op \r\n"; + $headers .= 'MIME-Version: 1.0' . "\r\n"; + $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; + mail($to,$sub,$msg,$headers); + $logQ = $dbc->prepare_statement("INSERT INTO emailLog VALUES (".$dbc->now().",?,?,'AR (Member EOM)')"); + $dbc->exec_statement($logQ,array($_REQUEST['curcard'],$to)); + echo "E-mail sent to $to


        "; + } + else if (isset($_REQUEST['skip_email'])){ + $to = $_REQUEST['email']; + echo "Did not send e-mail to $to
        "; + } + if (!empty($cns)){ + $cur = array_shift($cns); + $q = $dbc->prepare_statement("SELECT m.card_no, a.memName, + m.email_1, + a.TwoMonthBalance,a.LastMonthCharges, + a.LastMonthPayments,a.LastMonthBalance + FROM AR_EOM_Summary a LEFT JOIN + meminfo m ON a.cardno = m.card_no + LEFT JOIN custdata as c on c.cardno=a.cardno and c.personnum=1 + WHERE a.cardno=?"); + $r = $dbc->exec_statement($q,array($cur)); + $w = $dbc->fetch_row($r); + + echo "
        "; + foreach($cns as $c) + echo ""; + echo ""; + echo "Email Address:

        "; + echo "Message Preview:
        "; + $beg = sprintf("%.2f",$w[3]); + $chg = sprintf("%.2f",$w[4]); + $pay = sprintf("%.2f",$w[5]); + $bal = sprintf("%.2f",$w[6]); + $span = date("F Y",mktime(0,0,0,date('m')-1,1,date('Y'))); + $msg = "Whole Foods Co-op +610 East Fourth Street +Duluth, MN 55805 +(218) 728-0884 + +$w[0] +$w[1] +$w[2] + +If payment has been made or sent, please ignore this invoice. If you have any questions about this invoice or would like to make arrangements to pay your balance, please write or call the Finance Department at the above address or e-mail mms@wholefoods.coop. See below for WFC IOU Policies. + + + +
        Balance summary July 2010
        Beginning BalanceChargesPaymentsEnding BalanceAmount Due
        \$$beg\$$chg\$$pay\$$bal\$$bal
        \n"; + $histQ = $dbc->prepare_statement("SELECT card_no, max(charges) as charges, max(payments) as payments, + convert(varchar(50),date,101), trans_num,min(description),min(dept_name), + count(*) + FROM AR_statementHistory WHERE card_no = ? + group by convert(varchar(50),date,101),trans_num,card_no + order by max(date) desc"); + $msg .= " +"; + $histR = $dbc->exec_statement($histQ,array($cur)); + while ($histW = $dbc->fetch_row($histR)){ + $msg .= sprintf("", + $histW[3],$histW[4],$histW[1],$histW[2]); + if ($histW[7] > 0) + $msg .= ""; + elseif (!empty($histW[5])) + $msg .= ""; + else + $msg .= ""; + } + $msg .= "
        Recent 90 Day History
        DateReceiptChargesPayments
        %s%s\$%.2f\$%.2f
        (Multiple items)
        $histW[5]
        $histW[6]
        \n"; + + $msg = str_replace("\n","
        ",$msg); + echo $msg; + + $msg .= "
        +IOU POLICY + +OF WHOLE FOODS COMMUNITY CO-OP, INC. + +WFC members may charge purchases to a maximum of $20.00 payable within two (2) weeks from the date incurred. +IOU's must be signed by the maker. IOU's may not, under any circumstances, be paid with Food Stamps or EBT card. +WFC asks that its members only use the charge system for emergencies. + +-Members with an IOU account credit balance will receive a reminder of that balance on each purchase receipt. +-Members with an IOU debit balance will receive a reminder of that balance on each purchase receipt. + +If WFC is not reimbursed by a member within sixty (60) days from the date of an overdue IOU for the amount of +that person's membership may be terminated by the Board and any remaining stock, after reimbursement for all +indebtedness owed to WFC, will be converted to non-voting Class B stock. + +If WFC is not reimbursed by a member within sixty (60) days from the date of a bounced check for the amount of +that check plus the amount of any administrative fee, that person's membership may be terminated by the Board +and any remaining stock, after reimbursement for all indebtedness owed to WFC, will converted to non-voting +Class B stock. + +IOU credit balances over sixty (60) days will be credited to the Member's non-voting Class B stock and the IOU +account will be adjusted to zero. Members may request the return of Class B stock in excess of the amount +required by the By-Laws by submitting to the Board a Request to Terminate that excess stock. + +At the discretion of the General Manager, member business and non-profit agency accounts may have higher IOU +limits and/or extended payment terms. + +SPECIAL ORDERS +Special orders not picked up or paid for within thirty (30) days of the time items are received at WFC will +be put out for sale or disposed of at management discretion. Future special orders from members or from non- +members who have not previously promptly paid for and/or picked up special orders, at management discretion, +may require prepayment. + +NEWSLETTER ADS +Members may charge the cost of advertising their business in WFC's newsletter under the same IOU payment terms +as noted above but on an IOU account separate from the member's IOU account for inventory purchases. + +Members will be mailed an invoice within ten (10) days of the date of publication for the amount of the advertising +charge. Failure to pay the amount due is then subject to the provisions of this IOU policy. + +NOTE +Memberships with IOUs and/or other credit problems in excess of sixty (60) days may be placed on inactive status +by management pending Board action. Purchases by inactive members will not be recorded and will not count toward +eligibility for a patronage rebate. Purchases by inactive members are not eligible for member discounts or member +specials. Memberships inactivated or terminated due to credit problems will be eligible for reactivation subject +to Board discretion with respect to access to member credit benefits."; + $msg = str_replace("\n","
        ",$msg); + $msg = str_replace("\r","",$msg); + $msg = str_replace("\"","",$msg); + echo ""; + + echo ""; + echo "     "; + echo ""; + echo "
        "; + } + else { + echo "Done with all selected memberships
        + Home"; + } +} +elseif (!isset($_REQUEST['cardno'])){ + echo "
        "; + $query = $dbc->prepare_statement("SELECT a.cardno, c.lastname,i.email_1 + FROM AR_EOM_Summary a + LEFT JOIN custdata as c on c.cardno=a.cardno and c.personnum=1 + LEFT JOIN meminfo AS i ON c.cardno=i.card_no + WHERE c.type not in ('TERM') and + c.memtype <> 9 and a.twoMonthBalance > 1 + and c.Balance <> 0 + and a.lastMonthPayments < a.twoMonthBalance + ORDER BY a.cardno"); + $result = $dbc->exec_statement($query); + echo " + "; + while($row = $dbc->fetch_row($result)){ + printf(" + ", + (empty($row[2])?' ':""), + $row[0],$row[1],$row[2]); + } + echo "
         MemberE-mail
        %s%d - %s%s
        "; + echo ""; + echo "
        "; +} + +include('../../src/footer.html'); +?> diff --git a/fannie/modules/NOTE b/fannie/modules/NOTE new file mode 100644 index 000000000..8c60edbbf --- /dev/null +++ b/fannie/modules/NOTE @@ -0,0 +1,8 @@ +I don't like the module structure initially implemented here. +Fannie's class-lib will eventually be deprecated and replaced +with classlib2.0. The structure will have more in common with +the lane's class and plugin usage. It's a better structure +and consistency is good. + +UPDATE: +old structure gone diff --git a/fannie/modules/index.php b/fannie/modules/index.php new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/fannie/modules/index.php @@ -0,0 +1,2 @@ + diff --git a/fannie/modules/plugins2.0/Brewventory/Brewventory.php b/fannie/modules/plugins2.0/Brewventory/Brewventory.php new file mode 100644 index 000000000..d6980b80e --- /dev/null +++ b/fannie/modules/plugins2.0/Brewventory/Brewventory.php @@ -0,0 +1,1143 @@ +add_script($FANNIE_URL.'src/jquery/js/jquery.js'); + $this->add_script($FANNIE_URL.'src/jquery/js/jquery-ui-1.8.1.custom.min.js'); + $this->add_css_file($FANNIE_URL."src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css"); + + ob_start(); + vprintf(' + Home +      + View +      + Add +      + Use +      + Adjust +      + Import +      + ',array_fill(0,6,'Brewventory.php')); + return ob_get_clean(); + } + + function form_tag(){ + return '
        '; + } + + function module_url(){ + return 'Brewventory.php'; + } + + function adjust(){ + ob_start(); + echo $this->init(); + if (!empty($this->msgs)){ + echo '
        '.$this->msgs.'
        '; + $this->msgs = ""; + } + echo $this->form_tag(); + ?> +

        + Ingredient: +

        + +
        + add_onload_command( + sprintf("\$('#upc').autocomplete({source:'%s&LookUp=1'});", + $this->module_url()) + ); + $this->add_onload_command("\$('#upc').focus();"); + + echo '

        '; + printf('Home',$this->module_url()); + return ob_get_clean(); + } + + function adjust_confirm(){ + global $FANNIE_OP_DB; + $ret = $this->init(); + $ret .= $this->form_tag(); + + $upc = array_pop(array_keys($this->msgs)); + $amt = $this->msgs[$upc]; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $q = $dbc->prepare_statement("SELECT description FROM productUser WHERE upc=?"); + $r = $dbc->exec_statement($q,array($upc)); + $w = $dbc->fetch_row($r); + $dbc->close(); + + $ret .= '

        '.$w['description'].'

        '; + $ret .= sprintf('',$upc); + + $ret .= '

        Listed stock: '; + $pts = $this->kg_to_lb_oz($amt); + $ret .= sprintf("%d lbs %.2f ozs",$pts['lbs'],$pts['ozs']); + $ret .= '

        '; + $ret .= sprintf('',$amt); + + $ret .= '

        Actual stock: '; + $ret .= 'lbs '; + $ret .= 'ozs '; + $ret .= '

        '; + + $ret .= ''; + $ret .= ''; + + return $ret; + } + + function import(){ + ob_start(); + echo $this->init(); + echo str_replace('form ', 'form enctype="multipart/form-data" ',$this->form_tag()); + ?> + + BeerXML file: + + + init(); + echo str_replace('form ', 'form enctype="multipart/form-data" ',$this->form_tag()); + ?> +

        Use Single Ingredient

        +

        + Ingredient: +

        +

        + lbs: + ozs: +

        + +
        +

        Upload Recipe

        + + BeerXML file: + + + add_onload_command( + sprintf("\$('#upc').autocomplete({source:'%s&LookUp=1'});", + $this->module_url()) + ); + return ob_get_clean(); + } + + function sale_confirm(){ + if (!is_array($this->msgs)){ + return "Error: no item(s) specified."; + } + + $qty = $this->get_stock(array_keys($this->msgs)); + $name = $this->get_names(array_keys($this->msgs)); + + $ret = $this->init(); + $ret .= $this->form_tag('post'); + $ret .= ''; + $ret .= ''; + foreach($this->msgs as $upc => $info){ + $start = ''; + $line = ''; + $line .= sprintf('',$upc); + $line .= ''; + $line .= sprintf('',$info['qty']); + if (isset($info['yeast'])) + $line .= sprintf('',$info['qty']); + else { + $weight = $this->kg_to_lb_oz($info['qty']); + $line .= sprintf('',$weight['lbs'],$weight['ozs']); + } + $line .= ''; + } + else if (!isset($qty[$upc]) || $qty[$upc] <= 0){ + $line .= ''; + $start = ''; + } + else if ($info['qty'] <= $qty[$upc]){ + $line .= ''; + $line .= ''; + $start = ''; + } + else { + $line .= ''; + $line .= ''; + $line .= ''; + $start = ''; + } + $line .= ''; + $line .= ''; + $ret .= $start.$line; + } + $ret .= '
        IDNameAmountDecrease Inventory
        '.$upc.''.(isset($name[$upc])?$name[$upc]:$info['name']).'%d%d lbs %.2f ozs
        '; + $ret .= ''; + $ret .= ''; + return $ret; + } + + function get_stock($upcs=False){ + global $FANNIE_TRANS_DB; + $dbc = FannieDB::get($FANNIE_TRANS_DB); + + $where = ""; + $args = array(); + $ret = array(); + if ($upcs && is_array($upcs) && count($upcs)>0){ + $where = "WHERE d.upc IN ("; + foreach($upcs as $upc){ + $where .= '?,'; + $args[] = $upc; + } + $where = rtrim($where,",").")"; + } + + $upcQ = $dbc->prepare_statement("SELECT d.upc, + SUM(d.quantity) + - SUM(CASE WHEN s.quantity IS NULL THEN 0 ELSE s.quantity END) + - SUM(CASE WHEN a.diff IS NULL THEN 0 ELSE a.diff END) as stock + FROM InvDeliveryArchive AS d + LEFT JOIN InvSalesArchive AS s ON d.upc=s.upc + LEFT JOIN InvAdjustments AS a ON d.upc=a.upc + $where + GROUP BY d.upc"); + $upcR = $dbc->exec_statement($upcQ,$args); + while($upcW = $dbc->fetch_row($upcR)){ + $ret[$upcW['upc']] = $upcW['stock']; + } + + $dbc->close(); + return $ret; + } + + function get_names($upcs){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + $ret = array(); + $args = array(); + if ($upcs && is_array($upcs) && count($upcs)>0){ + $where = "WHERE upc IN ("; + foreach($upcs as $upc){ + $where .= '?,'; + $args[] = $upc; + } + $where = rtrim($where,",").")"; + } + $q = $dbc->prepare_statement("SELECT upc,description FROM productUser ".$where); + $r = $dbc->exec_statement($q,$args); + while($w = $dbc->fetch_row($r)){ + $ret[$w['upc']] = $w['description']; + } + $dbc->close(); + return $ret; + } + + function view(){ + global $FANNIE_OP_DB; + $qty = $this->get_stock(); + $upcs = "("; + $args = array(); + foreach($qty as $upc=>$amt){ + $upcs .= '?,'; + $args[] = $upc; + } + $upcs = rtrim($upcs,",").")"; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $query = $dbc->prepare_statement("SELECT p.upc,p.mixmatchcode,u.*,x.* + FROM products AS p LEFT JOIN + productUser AS u ON p.upc=u.upc + LEFT JOIN prodExtra AS x ON p.upc=x.upc + WHERE p.mixmatchcode IN ('brewmisc','hops','malts','yeasts') + AND p.upc IN $upcs ORDER BY u.description"); + $result = $dbc->exec_statement($query,$args); + + $rows = array('hops'=>array(),'brewmisc'=>array(),'malts'=>array(),'yeasts'=>array()); + while($row = $dbc->fetch_row($result)) + $rows[$row['mixmatchcode']][] = $row; + $dbc->close(); + + ob_start(); + echo $this->init(); + ?> + +

        Hops

        + + + + + + + + + + + + + + + + + + + + ', + $hops['description'], + (!empty($hops['brand'])?$hops['brand']:' '), + (!empty($hops['distributor'])?$hops['distributor']:' '), + (!empty($hops['sizing'])?$hops['sizing']:' '), + (!empty($hops['cost'])?$hops['cost']:' '), + (!empty($hops['margin'])?$hops['margin']:' '), + (!empty($hops['case_cost'])?$hops['case_cost']:' '), + $lbs, $ozs + ); + } + ?> +
        NameBrandOriginTypeAlphaBetaHSICurrent Supply
        %s%s%s%s%.2f%%%.2f%%%.2f%%%d lb%.2f oz
        + +

        Fermentables

        + + + + + + + + + + + + + + ', + $malts['description'], + (!empty($malts['brand'])?$malts['brand']:' '), + (!empty($malts['distributor'])?$malts['distributor']:' '), + (!empty($malts['cost'])?$malts['cost']:' '), + $lbs, $ozs + ); + } + ?> +
        NameBrandOriginSRMCurrent Supply
        %s%s%s%.1f%d lb%.2f oz
        + +

        Yeasts

        + + + + + + + + + + + + + ', + $yeasts['description'] + .(!empty($yeasts['case_info'])?' ('.$yeasts['case_info'].')':''), + (!empty($yeasts['brand'])?$yeasts['brand']:' '), + (!empty($yeasts['distributor'])?$yeasts['distributor']:' '), + (!empty($yeasts['sizing'])?$hops['sizing']:' '), + $ttl + ); + } + ?> +
        NameBrandTypeFormCurrent Supply
        %s%s%s%s%d
        + +

        Misc.

        + + + + + + + + + + + + ', + $misc['description'], + (!empty($misc['brand'])?$misc['brand']:' '), + (!empty($misc['sizing'])?$misc['sizing']:' '), + $lbs, $ozs + ); + } + ?> +
        NameBrandTypeCurrent Supply
        %s%s%s%d lb%.2f oz
        + + '; + printf('Home',$this->module_url()); + return ob_get_clean(); + } + + function receive(){ + ob_start(); + echo $this->init(); + if (!empty($this->msgs)){ + echo '
        '.$this->msgs.'
        '; + $this->msgs = ""; + } + echo $this->form_tag(); + ?> +

        + Ingredient: +

        +

        + lbs: + ozs: +

        + + + add_onload_command( + sprintf("\$('#upc').autocomplete({source:'%s&LookUp=1'});", + $this->module_url()) + ); + $this->add_onload_command("\$('#upc').focus();"); + + echo '

        '; + printf('Home',$this->module_url()); + return ob_get_clean(); + } + + function menu(){ + $ret = '

        BrewVentory

        '; + $ret .= '
          '; + $ret .= sprintf('
        • %s', + $this->module_url(),'view','View Current Inventory'); + $ret .= sprintf('
        • %s', + $this->module_url(),'receive','Add Purchases'); + $ret .= sprintf('
        • %s', + $this->module_url(),'sale','Use Ingredients'); + $ret .= sprintf('
        • %s', + $this->module_url(),'adjust','Enter Adjustments'); + $ret .= sprintf('
        • %s', + $this->module_url(),'import','Import Ingredient Definitions'); + $ret .= '
        '; + return $ret; + } + + function kg_to_lb_oz($kgs){ + $ttl = $kgs * 2.20462262; + $lbs = floor($ttl); + $ozs = ($ttl - $lbs) * 16; + if (sprintf('%.2f',$ozs)=='16.00'){ + $lbs += 1; + $ozs -= 16.00; + if ($ozs < 0) $ozs=0.0; + } + return array('lbs'=>$lbs,'ozs'=>$ozs); + } + + function lb_oz_to_kg($lbs,$ozs){ + $ttl = $lbs + ($ozs/16.0); + $kgs = $ttl * 0.45359237; + return $kgs; + } + + function preprocess(){ + global $FANNIE_TRANS_DB, $FANNIE_OP_DB; + $this->mode = FormLib::get_form_value('mode','menu'); + + /** + Begin form callbacks + */ + + /** + Callback for import() display function + */ + if (isset($_REQUEST['import_submit'])){ + $tmpfile = $_FILES['import_xml_file']['tmp_name']; + $filename = tempnam(sys_get_temp_dir(),'brewvenImport'); + move_uploaded_file($tmpfile, $filename); + + $bxml = new BeerXMLParser($filename); + $data = $bxml->get_data(); + + $dbc = FannieDB::get($FANNIE_OP_DB); + foreach($data['Hops'] as $h) + echo $this->add_hops($dbc, $h)."
        "; + + foreach($data['Fermentables'] as $f) + echo $this->add_malt($dbc, $f)."
        "; + + foreach($data['Yeast'] as $y) + echo $this->add_yeast($dbc, $y)."
        "; + + foreach($data['Misc'] as $m) + echo $this->add_misc($dbc, $m)."
        "; + + echo '

        '; + printf('Home',$this->module_url()); + unlink($filename); + return False; + } + + /** + Callback #1 for sale() display function + Process uploaded file + */ + if (isset($_REQUEST['sale_recipe_submit'])){ + $tmpfile = $_FILES['import_xml_file']['tmp_name']; + $filename = tempnam(sys_get_temp_dir(),'brewvenImport'); + move_uploaded_file($tmpfile, $filename); + + $bxml = new BeerXMLParser($filename); + $data = $bxml->get_data(); + + $this->msgs = array(); + + foreach($data['Hops'] as $h){ + $upc = $this->hash('hops',$h); + if (!isset($this->msgs[$upc])) + $this->msgs[$upc] = array('qty'=>0.0,'name'=>$h['name']); + $this->msgs[$upc]['qty'] += (isset($h['amount'])?$h['amount']:0.0); + } + + foreach($data['Fermentables'] as $f){ + $upc = $this->hash('malt',$f); + if (!isset($this->msgs[$upc])) + $this->msgs[$upc] = array('qty'=>0.0,'name'=>$f['name']); + $this->msgs[$upc]['qty'] += (isset($f['amount'])?$f['amount']:0.0); + } + + foreach($data['Yeast'] as $y){ + $upc = $this->hash('yeast',$y); + if (!isset($this->msgs[$upc])) + $this->msgs[$upc] = array('qty'=>0.0,'name'=>$y['name']); + $this->msgs[$upc]['qty'] += 1; + $this->msgs[$upc]['yeast'] = True; + } + + foreach($data['Misc'] as $m){ + $upc = $this->hash('misc',$m); + if (!isset($this->msgs[$upc])) + $this->msgs[$upc] = array('qty'=>0.0,'name'=>$m['name']); + $this->msgs[$upc]['qty'] += (isset($m['amount'])?$m['amount']:0.0); + } + + $this->mode = "sale_confirm"; + + unlink($filename); + return True; + } + + /** + Callback #2 for sale() display function + Process single ingredient + */ + if (isset($_REQUEST['sale_submit'])){ + $upc = FormLib::get_form_value('upc',''); + $lbs = FormLib::get_form_value('lbs',0.0); + $ozs = FormLib::get_form_value('ozs',0.0); + $kgs = $this->lb_oz_to_kg($lbs,$ozs); + + $this->msgs = array($upc=>array('qty'=>$kgs,'name'=>'')); + $this->mode = "sale_confirm"; + return True; + } + + /** + Callback for sale_confirm() display function + Process single ingredient + */ + if (isset($_REQUEST['submit_sale_confirm'])){ + $upcs = FormLib::get_form_value('upc',array()); + $amts = FormLib::get_form_value('amt',array()); + $confirms = FormLib::get_form_value('decrement',array()); + + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $p = $dbc->prepare_statement("INSERT INTO InvSalesArchive (inv_date, upc, quantity, price) + VALUES (".$dbc->now().", ?, ?, 0.0)"); + for($i=0;$iget_stock(array($upc)); + if (isset($stock[$upc])) $amt = $stock[$upc]; + else continue; // couldn't find current stock + } + + $r = $dbc->exec_statement($p, array($upc,$amt)); + $dbc->close(); + } + + $this->mode = 'view'; + return True; + } + + /** + Callback for receive() display function + */ + if (isset($_REQUEST['receive_submit'])){ + $upc = FormLib::get_form_value('upc',''); + $lbs = FormLib::get_form_value('lbs',0.0); + $ozs = FormLib::get_form_value('ozs',0.0); + $ttl = $lbs + ($ozs/16.0); + + $kgs = $ttl * 0.45359237; + + $dbc = FannieDB::get($FANNIE_OP_DB); + $query = $dbc->prepare_statement("SELECT description FROM productUser + WHERE upc=?"); + $result = $dbc->exec_statement($query,array($upc)); + if ($dbc->num_rows($result)==0){ + $this->msgs = "Product not found"; + } + else { + $item = array_pop($dbc->fetch_row($result)); + $dbc->close(); + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $insQ = $dbc->prepare_statement("INSERT INTO InvDeliveryArchive + (inv_date, upc, vendor_id, quantity, price) + VALUES (".$dbc->now().", ?, 0, ?, 0.00)"); + $add = $dbc->exec_statement($insQ,array($upc,$kgs)); + if ($add) + $this->msgs = "Added $item to inventory"; + else + $this->msgs = "Error adding product: ".$item; + } + $dbc->close(); + + $this->mode = 'receive'; + return True; + } + + /** + Callback for adjust_confirm() display function + */ + if (isset($_REQUEST['adjust_confirm_submit'])){ + $upc = FormLib::get_form_value('upc',''); + $lbs = FormLib::get_form_value('lbs',0.0); + $ozs = FormLib::get_form_value('ozs',0.0); + $amt = FormLib::get_form_value('amt',0.0); + + $newamt = $this->lb_oz_to_kg($lbs,$ozs); + $diff = $amt - $newamt; + + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $q = $dbc->prepare_statement("INSERT INTO InvAdjustments (inv_date,upc,diff) + VALUES(".$dbc->now().", ?, ?)"); + $r = $dbc->exec_statement($q,array($upc,$diff)); + $dbc->close(); + + $this->msgs = 'Adjustment saved'; + $this->mode = 'adjust'; + + return True; + } + + /** + Callback for adjust() display function + */ + if (isset($_REQUEST['adjust_submit'])){ + $upc = FormLib::get_form_value('upc',''); + + $current = $this->get_stock(array($upc)); + if(!isset($current[$upc])){ + $this->msgs = 'Item not in stock'; + $this->mode = 'adjust'; + } + else { + $this->msgs = $current; + $this->mode = 'adjust_confirm'; + } + + return True; + } + + /** + jQuery autocomplete callback + */ + if (isset($_REQUEST['LookUp']) && isset($_REQUEST['term'])){ + $dbc = FannieDB::get($FANNIE_OP_DB); + $query = $dbc->prepare_statement("SELECT p.upc,u.description,u.brand,u.sizing, + x.distributor FROM products AS p + INNER JOIN productUser as u ON p.upc=u.upc + INNER JOIN prodExtra AS x ON p.upc=x.upc + WHERE p.mixmatchcode IN ('hops','malts','yeasts','brewmisc') + AND u.description LIKE ?"); + + $json = "["; + $result = $dbc->exec_statement($query,array('%'.$_REQUEST['term'].'%')); + while($row = $dbc->fetch_row($result)){ + $json .= "{ \"label\": \"".$row['description']; + + if (!empty($row['brand']) || !empty($row['sizing']) || !empty($row['distributor'])) + $json .= " ("; + if (!empty($row['brand'])) + $json .= $row['brand'].", "; + if (!empty($row['distributor'])) + $json .= $row['distributor'].", "; + if (!empty($row['sizing'])) + $json .= $row['sizing'].", "; + $json = rtrim($json,", "); + if (!empty($row['brand']) || !empty($row['sizing']) || !empty($row['distributor'])) + $json .= ")"; + + $json .= "\", \"value\": \"".$row['upc']."\"},"; + } + $json = rtrim($json,","); + $json .= "]"; + + header("Content-type: application/json"); + echo $json; + return False; + } + + /** + End form callbacks + */ + + + return True; + } + + /** + Hasing function for pseudo-UPCs + @param $type ingredient type + @param $fields BeerXML array + @return unique(ish) 13 character hash + */ + private function hash($type, $fields){ + $hash = $fields['name']; + switch(strtolower($type)){ + case 'malt': + case 'malts': + $hash .= (isset($fields['supplier'])?$fields['supplier']:''); + $hash .= (isset($fields['origin'])?$fields['origin']:''); + break; + case 'misc': + case 'brewmisc': + $hash .= (isset($fields['supplier'])?$fields['supplier']:''); + $hash .= (isset($fields['type'])?$fields['type']:''); + break; + case 'yeast': + case 'yeasts': + $hash .= (isset($fields['laboratory'])?$fields['laboratory']:''); + $hash .= (isset($fields['product_id'])?$fields['product_id']:''); + break; + case 'hop': + case 'hops': + $hash .= (isset($fields['origin'])?$fields['origin']:''); + $hash .= (isset($fields['form'])?$fields['form']:''); + break; + } + return substr(md5($hash),0,13); + } + + /** + Add malts to product database + @param $dbc SQLManager object + @param $malt_info array of BeerXML fields + @return string describing result + */ + private function add_malt($dbc, $malt_info){ + $good_desc = $malt_info['name']; + $short_desc = substr($malt_info['name'],0,30); + $upc = $this->hash('malt', $malt_info); + + $q = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); + $r = $dbc->exec_statement($q,array($upc)); + if ($dbc->num_rows($r) > 0) + return "Omitting malt: $good_desc (already exists)"; + + $userQ = $dbc->prepare_statement("INSERT INTO productUser + (upc, description, brand, sizing, photo, + long_text, enableOnline) VALUES + (?, ?, ?, '', '', ?, 0)"); + + $delP = $dbc->prepare_statement("DELETE FROM productUser WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($userQ,array( + $upc, $good_desc, + (isset($malt_info['supplier'])?$malt_info['supplier']:''), + (isset($malt_info['notes'])?$malt_info['notes']:'') + )); + + $xtraQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc, distributor, + manufacturer, cost, margin, variable_pricing, location, + case_quantity, case_cost, case_info) VALUES + (?, ?, '', ?, 0, 0, '', '', 0, '')"); + + $delP = $dbc->prepare_statement("DELETE FROM prodExtra WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($xtraQ,array( + $upc, + (isset($malt_info['origin'])?$malt_info['origin']:''), + (isset($malt_info['color'])?$malt_info['color']:0) + )); + + $prodQ = $dbc->prepare_statement("INSERT INTO products (upc, description, modified, mixmatchcode) VALUES + (?, ?, ".$dbc->now().", 'malts')"); + + $delP = $dbc->prepare_statement("DELETE FROM products WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($prodQ,array($upc,$short_desc)); + + return "Imported malt: $good_desc"; + } + + /** + Add misc ingredients to product database + @param $dbc SQLManager object + @param $misc_info array of BeerXML fields + @return string describing result + */ + private function add_misc($dbc, $misc_info){ + $good_desc = $misc_info['name']; + $short_desc = substr($misc_info['name'],0,30); + $upc = $this->hash('misc', $misc_info); + + $q = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); + $r = $dbc->exec_statement($q,array($upc)); + if ($dbc->num_rows($r) > 0) + return "Omitting misc: $good_desc (already exists)"; + + $userQ = $dbc->prepare_statement("INSERT INTO productUser + (upc, description, brand, sizing, photo, + long_text, enableOnline) VALUES + (?, ?, ?, ?, '', ?, 0)"); + + $delP = $dbc->prepare_statement("DELETE FROM productUser WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($userQ,array( + $upc, $good_desc, + (isset($misc_info['supplier'])?$misc_info['supplier']:''), + (isset($misc_info['type'])?$misc_info['type']:''), + (isset($misc_info['notes'])?$misc_info['notes']:'') + )); + + $xtraQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc, distributor, + manufacturer, cost, margin, variable_pricing, location, + case_quantity, case_cost, case_info) VALUES + (?, '', '', 0, 0, 0, '', '', 0, '')"); + + $delP = $dbc->prepare_statement("DELETE FROM prodExtra WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($xtraQ,array($upc)); + + $prodQ = $dbc->prepare_statement("INSERT INTO products (upc, description, modified, mixmatchcode) VALUES + (?, ?, ".$dbc->now().", 'brewmisc')"); + + $delP = $dbc->prepare_statement("DELETE FROM products WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($prodQ,array($upc,$short_desc)); + + return "Imported misc: $good_desc"; + } + + /** + Add yeast to product database + @param $dbc SQLManager object + @param $yeast_info array of BeerXML fields + @return string describing result + */ + private function add_yeast($dbc, $yeast_info){ + $good_desc = $yeast_info['name']; + $short_desc = substr($yeast_info['name'],0,30); + $upc = $this->hash('yeast', $yeast_info); + + $q = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); + $r = $dbc->exec_statement($q,array($upc)); + if ($dbc->num_rows($r) > 0) + return "Omitting yeast: $good_desc (already exists)"; + + $userQ = $dbc->prepare_statement("INSERT INTO productUser + (upc, description, brand, sizing, photo, + long_text, enableOnline) VALUES + (?, ?, ?, ?, '', ?, 0)"); + $delP = $dbc->prepare_statement("DELETE FROM productUser WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($userQ,array( + $upc, $good_desc, + (isset($yeast_info['laboratory'])?$yeast_info['laboratory']:''), + (isset($yeast_info['form'])?$yeast_info['form']:''), + (isset($yeast_info['notes'])?$yeast_info['notes']:'') + )); + + $xtraQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc, distributor, + manufacturer, cost, margin, variable_pricing, location, + case_quantity, case_cost, case_info) VALUES + (?, ?, '', 0, 0, 0, '', '', 0, ?)"); + $delP = $dbc->prepare_statement("DELETE FROM prodExtra WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($xtraQ,array( + $upc, + (isset($yeast_info['type'])?$yeast_info['type']:''), + (isset($yeast_info['product_id'])?$yeast_info['product_id']:'') + )); + + $prodQ = $dbc->prepare_statement("INSERT INTO products (upc, description, modified, mixmatchcode) VALUES + (?, ?, ".$dbc->now().", 'yeasts')"); + + $delP = $dbc->prepare_statement("DELETE FROM products WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($prodQ,array($upc,$short_desc)); + + return "Imported yeast: $good_desc"; + } + + /** + Add hops to product database + @param $dbc SQLManager object + @param $hop_info array of BeerXML fields + @return string describing result + */ + private function add_hops($dbc, $hop_info){ + $good_desc = $hop_info['name']; + $short_desc = substr($hop_info['name'],0,30); + $upc = $this->hash('hops', $hop_info); + + $q = $dbc->prepare_statement("SELECT upc FROM products WHERE upc=?"); + $r = $dbc->exec_statement($q,array($upc)); + if ($dbc->num_rows($r) > 0) + return "Omitting hops: $good_desc (already exists)"; + + $userQ = $dbc->prepare_statement("INSERT INTO productUser + (upc, description, brand, sizing, photo, + long_text, enableOnline) VALUES + (?, ?, ?, ?, '', ?, 0)"); + $delP = $dbc->prepare_statement("DELETE FROM prodExtra WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($userQ,array( + $upc,$good_desc, + (isset($hop_info['supplier'])?$hop_info['supplier']:''), + (isset($hop_info['form'])?$hop_info['form']:''), + (isset($hop_info['notes'])?$hop_info['notes']:'') + )); + + $xtraQ = $dbc->prepare_statement("INSERT INTO prodExtra (upc, distributor, + manufacturer, cost, margin, variable_pricing, location, + case_quantity, case_cost, case_info) VALUES + (?, ?, '', ?, ?, 0, '', '', ?, '')"); + $delP = $dbc->prepare_statement("DELETE FROM prodExtra WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($xtraQ,array( + $upc, + (isset($hop_info['origin'])?$hop_info['origin']:''), + (isset($hop_info['alpha'])?$hop_info['alpha']:0), + (isset($hop_info['beta'])?$hop_info['beta']:0), + (isset($hop_info['hsi'])?$hop_info['hsi']:0) + )); + + $prodQ = $dbc->prepare_statement("INSERT INTO products (upc, description, modified, mixmatchcode) VALUES + (?, ?, ".$dbc->now().", 'hops')"); + + $delP = $dbc->prepare_statement("DELETE FROM products WHERE upc=?"); + $dbc->exec_statement($delP,array($upc)); + $dbc->exec_statement($prodQ,array($upc,$short_desc)); + + return "Imported hops: $good_desc"; + } + + function css_content(){ + global $FANNIE_URL; + ob_start(); + ?> + a { color:blue; } + body { + background-image: url(); + background-position: right top; + background-repeat: no-repeat; + } + array(), + 'Fermentables'=>array(), + 'Yeast'=>array(), + 'Misc'=>array() + ); + + private $hop; + private $ferm; + private $yeast; + private $misc; + private $outer_element = ""; + private $current_element = array(); + + public function BeerXMLParser($filename){ + $file = file_get_contents($filename); + if (!$file) $this->data = False; + else { + // beersmith bad data correction + $file = str_replace(chr(0x01),"",$file); + + $xml_parser = xml_parser_create(); + xml_set_object($xml_parser,$this); + xml_set_element_handler($xml_parser, "startElement", "endElement"); + xml_set_character_data_handler($xml_parser, "charData"); + xml_parse($xml_parser, $file, True); + xml_parser_free($xml_parser); + } + } + + public function get_data(){ + return $this->data; + } + + private function startElement($parser,$name,$attrs){ + switch(strtolower($name)){ + case 'hop': + $this->outer_element = "hop"; + $this->hop = array(); + break; + case 'fermentable': + $this->outer_element = "fermentable"; + $this->ferm = array(); + break; + case 'yeast': + $this->outer_element = "yeast"; + $this->yeast = array(); + break; + case 'misc': + $this->outer_element = "misc"; + $this->misc = array(); + break; + } + array_unshift($this->current_element,strtolower($name)); + } + + private function endElement($parser,$name){ + switch(strtolower($name)){ + case 'hop': + $this->data['Hops'][] = $this->hop; + break; + case 'fermentable': + $this->data['Fermentables'][] = $this->ferm; + break; + case 'yeast': + $this->data['Yeast'][] = $this->yeast; + break; + case 'misc': + $this->data['Misc'][] = $this->misc; + break; + } + array_shift($this->current_element); + } + + private function charData($parser,$data){ + switch($this->outer_element){ + case 'hop': + if (!isset($this->hop[$this->current_element[0]])) + $this->hop[$this->current_element[0]] = ""; + $this->hop[$this->current_element[0]] .= $data; + break; + case 'fermentable': + if (!isset($this->ferm[$this->current_element[0]])) + $this->ferm[$this->current_element[0]] = ""; + $this->ferm[$this->current_element[0]] .= $data; + break; + case 'yeast': + if (!isset($this->yeast[$this->current_element[0]])) + $this->yeast[$this->current_element[0]] = ""; + $this->yeast[$this->current_element[0]] .= $data; + break; + case 'misc': + if (!isset($this->misc[$this->current_element[0]])) + $this->misc[$this->current_element[0]] = ""; + $this->misc[$this->current_element[0]] .= $data; + break; + } + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new Brewventory(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/Brewventory/FannieInventory.php b/fannie/modules/plugins2.0/Brewventory/FannieInventory.php new file mode 100644 index 000000000..fd3f49c57 --- /dev/null +++ b/fannie/modules/plugins2.0/Brewventory/FannieInventory.php @@ -0,0 +1,101 @@ +mode){ + case 'view': + return $this->view(); + case 'receive': + return $this->receive(); + case 'sale': + return $this->sale(); + case 'adjust': + return $this->adjust(); + default: + $func = $this->mode; + if (method_exists($this, $func)) + return $this->$func(); + else + return ""; + } + } + + /** + Display receiving entry form + @return HTML string + */ + function receive(){ + return ""; + } + + /** + Display sales entry form + @return HTML string + */ + function sale(){ + return ""; + } + + /** + Display adjustment entry form + @return HTML string + */ + function adjustt(){ + return ""; + } + + /** + Display current inventory + @return HTML string + */ + function view(){ + return ""; + } +} + +?> diff --git a/fannie/modules/plugins2.0/Brewventory/bg.jpg b/fannie/modules/plugins2.0/Brewventory/bg.jpg new file mode 100644 index 000000000..594991736 Binary files /dev/null and b/fannie/modules/plugins2.0/Brewventory/bg.jpg differ diff --git a/fannie/modules/plugins2.0/CalendarPlugin/CalendarAjax.php b/fannie/modules/plugins2.0/CalendarPlugin/CalendarAjax.php new file mode 100644 index 000000000..8d097dba7 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/CalendarAjax.php @@ -0,0 +1,122 @@ +prepare_statement("SELECT calendarID FROM monthview_events + WHERE eventDate=? and uid=? and calendarID=?"); + $rowCheck = $db->exec_statement($chkP,array($date,$uid,$id)); + if ($db->num_rows($rowCheck) <= 0 && $text != ""){ + $insP = $db->prepare_statement("INSERT INTO monthview_events VALUES (?,?,?,?)"); + $db->exec_statement($insP,array($id,$date,$text,$uid)); + } + else if ($text == ""){ + $delP = $db->prepare_statement("DELETE FROM monthview_events WHERE + calendarID=? AND eventDate=? + AND uid=?"); + $db->exec_statement($delP,array($id,$date,$uid)); + } + else { + $upP = $db->prepare_statement("UPDATE monthview_events SET + eventText=? + WHERE calendarID=? AND eventDate=? + AND uid=?"); + $db->exec_statement($upP,array($text,$id,$date,$uid)); + } + break; + case 'createCalendar': + $name = FormLib::get_form_value('name'); + $uid = FormLib::get_form_value('uid',0); + + $db = CalendarPluginDB::get(); + $p = $db->prepare_statement("INSERT INTO calendars (name) VALUES (?)"); + $db->exec_statement($p,array($name)); + + $id = $db->insert_id(); + + $p = $db->prepare_statement("INSERT INTO permissions (calendarID,uid,classID) + VALUES (?,?,4)"); + $db->exec_statement($p,array($id,$uid)); + + $data[] = "

        $name

        "; + break; + case 'savePrefs': + $calID = FormLib::get_form_value('calID'); + $name = str_replace("'","''",$_GET['name']); + $name = FormLib::get_form_value('name'); + $viewers = FormLib::get_form_value('viewers',array()); + $writers = FormLib::get_form_value('writers',array()); + + $db = CalendarPluginDB::get(); + $p = $db->prepare_statement("UPDATE calendars SET name=? WHERE calendarID=?"); + $db->exec_statement($p,array($name,$calID)); + + $p = $db->prepare_statement("DELETE FROM permissions WHERE calendarID=? and classID < 4"); + $db->exec_statement($p,array($calID)); + $insP = $db->prepare_statement("INSERT INTO permissions VALUES (?,?,?)"); + if ($viewers != ""){ + foreach(explode(",",$viewers) as $v){ + $db->exec_statement($insP,array($calID,$v,1)); + } + } + if ($writers != ""){ + foreach(explode(",",$writers) as $w){ + $db->exec_statement($insP,array($calID,$w,2)); + } + } + break; + } + } + return $data; + } + +} + +new CalendarAjax(); + +?> diff --git a/fannie/modules/plugins2.0/CalendarPlugin/CalendarMainPage.php b/fannie/modules/plugins2.0/CalendarPlugin/CalendarMainPage.php new file mode 100644 index 000000000..1c5992e5b --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/CalendarMainPage.php @@ -0,0 +1,101 @@ +uid = ltrim(getUID($this->current_user),"0"); + $this->title = "Cal"; + $this->header = "Calendars"; + + $plugin = new CalendarPlugin(); + $this->add_script($plugin->plugin_url().'/javascript/calendar.js'); + $this->add_script($plugin->plugin_url().'/javascript/ajax.js'); + + $view = FormLib::get_form_value('view','index'); + if ($view == 'month') + $this->window_dressing = False; + else + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + + if (file_exists(dirname(__FILE__).'/css/'.$view.'.css')) + $this->add_css_file($plugin->plugin_url().'/css/'.$view.'.css'); + + return True; + } + + function body_content(){ + $view = FormLib::get_form_value('view','index'); + switch ($view){ + case 'month': + $editable = True; + + $year = FormLib::get_form_value('year',date('Y')); + $month = FormLib::get_form_value('month',date('n')); + $calID = FormLib::get_form_value('calID',0); + + echo CalendarPluginDisplayLib::monthView($calID,$month,$year,$this->uid); + break; + case 'prefs': + $calID = FormLib::get_form_value('calID',''); + echo CalendarPluginDisplayLib::prefsView($calID,$this->uid); + break; + case 'overlays': + echo CalendarPluginDisplayLib::overlaysView($this->uid); + break; + case 'showoverlay': + $cals = FormLib::get_form_value('cals'); + $start = FormLib::get_form_value('startdate'); + $end = FormLib::get_form_value('enddate'); + echo CalendarPluginDisplayLib::showoverlayView($cals,$startdate,$enddate); + break; + case 'index': + default: + echo CalendarPluginDisplayLib::indexView($this->uid); + break; + } + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new CalendarMainPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/CalendarPlugin/CalendarPlugin.php b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPlugin.php new file mode 100644 index 000000000..8c1125f14 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPlugin.php @@ -0,0 +1,92 @@ + array('default'=>'core_calendar','label'=>'Database', + 'description'=>'Database to calendars. Can + be one of the default CORE databases or a + separate one.') + ); + + public $plugin_description = 'Plugin for calendars'; + + + public function setting_change(){ + global $FANNIE_ROOT, $FANNIE_PLUGIN_SETTINGS; + + $db_name = $FANNIE_PLUGIN_SETTINGS['CalendarDatabase']; + if (empty($db_name)) return; + + $dbc = FannieDB::get($db_name); + + $errors = array(); + $errors[] = $this->plugin_db_struct($dbc, 'account_classes', $db_name); + $errors[] = $this->plugin_db_struct($dbc, 'calendars', $db_name); + $errors[] = $this->plugin_db_struct($dbc, 'monthview_events', $db_name); + $errors[] = $this->plugin_db_struct($dbc, 'permissions', $db_name); + + if ($dbc->table_exists('account_classes')){ + /* populate account classes */ + $classes = array( + 1 => 'VIEWER', + 2 => 'CONTRIBUTOR', + 3 => 'ADMIN', + 4 => 'OWNER' + ); + $chkP = $dbc->prepare_statement("SELECT classID FROM account_classes WHERE classID=?"); + $insP = $dbc->prepare_statement("INSERT INTO account_classes (classID, classDesc) VALUES (?, ?)"); + $upP = $dbc->prepare_statement("UPDATE account_classes SET classDesc=? WHERE classID=?"); + foreach($classes as $id => $name){ + $chkR = $dbc->exec_statement($chkP,array($id)); + if ($dbc->num_rows($chkR) == 0){ + $dbc->exec_statement($insP,array($id,$name)); + } + else { + $dbc->exec_statement($upP,array($name,$id)); + } + } + } + + foreach($errors as $e){ + if ($e === True) continue; + echo 'CalendarPlugin error: '.$e.'
        '; + } + } + + public function plugin_enable(){ + } +} + +?> diff --git a/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginDB.php b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginDB.php new file mode 100644 index 000000000..6598b6f5e --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginDB.php @@ -0,0 +1,35 @@ + diff --git a/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginDisplayLib.php b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginDisplayLib.php new file mode 100644 index 000000000..41bdff207 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginDisplayLib.php @@ -0,0 +1,457 @@ +prepare_statement(" + SELECT m.eventDate,m.eventText,m.uid,u.real_name + FROM monthview_events as m LEFT JOIN " + .$FANNIE_OP_DB.$sql->sep()."Users as u on m.uid=u.uid + WHERE calendarID=? AND + month(eventDate)=? AND + year(eventDate)=?"); + $dataR = $sql->exec_statement($dataP,array($id,$month,$year)); + $db_data = array(); + while($dataW = $sql->fetch_row($dataR)){ + $dataW[0] = trim(preg_replace('/\d+:\d+:\d+/','',$dataW[0])); + if (!isset($db_data[$dataW[0]])) + $db_data[$dataW[0]] = array(); + array_unshift($db_data[$dataW[0]],array($dataW[1],$dataW[2],$dataW[3])); + } + + $name = array_pop( + $sql->fetch_row( + $sql->exec_statement( + $sql->prepare_statement('SELECT name FROM calendars + WHERE calendarID=?'), + array($id) + ) + ) + ); + + $startTS = mktime(0,0,0,$month,1,$year); + + $prevTS = mktime(0,0,0,$month-1,1,$year); + $nextTS = mktime(0,0,0,$month+1,1,$year); + + $ret = ""; + $ret .= ""; + $ret .= ""; + + $ret .= "
        $name
        \n"; + + $ret .= "\n"; + + $ret .= "\n"; + $ret .= "\n"; + $ret .= ""; + $ret .= "\n"; + $ret .= "\n"; + + $ret .= "\n"; + foreach($DAY_NAMES as $DAY){ + $ret .= "\n"; + } + $ret .= "\n"; + + $ret .= "\n"; + for($i=0;$i<7;$i++){ + if (date("w",$startTS) == $i) break; + $ret .= "\n"; + } + $classes = array("monthview_box","monthview_box_alt"); + while(date("w",$startTS) > 0){ + $datestring = date("Y-m-d",$startTS); + $ret .= " + ", + $row[0],$row[1],$row[2],$row[0]); + } + $ret .= "
        "; + $ret .= sprintf("Previous", + $id,date("Y",$prevTS),date("n",$prevTS)); + $ret .= ""; + $ret .= date("F",$startTS)." ".$year.""; + $ret .= sprintf("Next", + $id,date("Y",$nextTS),date("n",$nextTS)); + $ret .= "
        "; + $ret .= $DAY[0]; + $ret .= "
        "; + $ret .= " "; + $ret .= "\n"; + $ret .= date("j",$startTS); + $ret .= "\n"; + $c = 0; + $found = False; + if (isset($db_data[$datestring])){ + foreach($db_data[$datestring] as $dat){ + $ret .= sprintf("
        \n"; + for ($i=0;$i<7;$i++){ + $datestring = date("Y-m-d",$startTS); + $ret .= "
        \n"; + $ret .= date("j",$startTS); + $ret .= "\n"; + $c = 0; + $found = False; + if (isset($db_data[$datestring])){ + foreach($db_data[$datestring] as $dat){ + $ret .= sprintf("
        \n"; + $ret .= "Back to list of calendars"; + if ($OWNER){ + $ret .= " || Settings for this calendar\n"; + } + $ret .= "
        \n"; + + return $ret; + } + + public static function indexView($uid){ + global $FANNIE_URL; + $yours = CalendarPluginPermissions::get_own_calendars($uid); + $theirs = CalendarPluginPermissions::get_other_calendars($uid); + + $ret = ""; + $ret .= "
        Your Calendars
        "; + $ret .= "
        "; + foreach($yours as $k=>$v){ + $ret .= "

        $v

        "; + } + $ret .= "
        "; + $ret .= "

        "; + $ret .= ""; + $ret .= "Create a new calendar

        "; + + $ret .= "
        Other Calendars
        "; + $ret .= "
        "; + foreach($theirs as $k=>$v){ + $ret .= "

        $v

        "; + } + $ret .= "
        "; + + $ret .= "
        Tools
        "; + $ret .= "
        "; + $ret .= "

        Compare Calendars

        "; + $ret .= "
        "; + $url = $FANNIE_URL."auth/ui/loginform.php?logout=yes"; + $ret .= "

        Logout

        "; + + return $ret; + } + + public static function showoverlayView($calIDs,$startDate,$endDate){ + $ret = ""; + + $sql = CalendarPluginDB::get(); + $ids = "("; + $args = array(); + foreach($calIDs as $c){ + $ids .= "?,"; + $args[] = $c; + } + $ids = rtrim($ids,","); + $ids .= ")"; + + $dataP = $sql->prepare_statement(" + SELECT m.eventDate,m.eventText,c.name + FROM monthview_events as m LEFT JOIN + calendars as c on m.calendarID=c.calendarID + WHERE m.calendarID in $ids AND + datediff(eventDate,?)>=0 + and datediff(eventDate,?)<=0 + order by eventDate,c.name"); + $args[] = $startDate; + $args[] = $endDate; + $dataR = $sql->exec_statement($dataP,$args); + $curDate = ""; + $classes = array("overlay_one","overlay_two"); + $c = 0; + while($dataW = $sql->fetch_row($dataR)){ + if ($curDate != $dataW[0]){ + if ($curDate != "") + $ret .= ""; + $ret .= "
        "; + $temp = explode("-",$dataW[0]); + $ts = mktime(0,0,0,$temp[1],$temp[2],$temp[0]); + $str = date("l, F j, Y",$ts); + $ret .= "

        $str

        "; + $c = 0; + $curDate = $dataW[0]; + } + $ret .= "
        "; + $ret .= "$dataW[2]: $dataW[1]
        "; + $c = ($c+1) % 2; + } + $ret .= "
        "; + $ret .= ""; + + $ret .= "
        \n"; + $ret .= "Back to list of calendars"; + $ret .= "   "; + $ret .= "::"; + $ret .= "   "; + $ret .= "View a different combination"; + $ret .= "
        "; + + return $ret; + } + + public static function overlaysView($uid){ + $yours = CalendarPluginPermissions::get_own_calendars($uid); + $theirs = CalendarPluginPermissions::get_other_calendars($uid); + + $ret = ""; + $ret .= "
        "; + $ret .= "

        Select calendars (hold apple or ctrl to select multiple)

        "; + $ret .= "
        "; + $ret .= ""; + $ret .= "
        "; + $ret .= "
        "; + $ret .= "Start Date: "; + $ret .= "

        "; + $ret .= "End Date: "; + $ret .= "

        "; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= "
        "; + + $ret .= "
        \n"; + $ret .= "Back to list of calendars"; + $ret .= "
        "; + $ret .= ""; + + return $ret; + } + + public static function prefsView($calID,$uid){ + global $FANNIE_OP_DB; + if (!CalendarPluginPermissions::is_owner($uid,$calID)){ + return "

        Either something goofed up or you aren't allowed to change + settings for this calendar

        "; + } + + $db = CalendarPluginDB::get(); + $name = array_pop( + $db->fetch_row( + $db->exec_statement( + $db->prepare_statement('SELECT name FROM calendars + WHERE calendarID=?'), + array($calID) + ) + ) + ); + + $ret = ""; + $ret .= "

        Name: "; + $ret .= "


        "; + + $userP = $db->prepare_statement("SELECT uid,real_name,name FROM " + .$FANNIE_OP_DB.$db->sep()."Users + WHERE uid<>? order by name,real_name"); + $userR = $db->exec_statement($userP,array($uid)); + $userOpts = array(); + while ($userW = $db->fetch_row($userR)){ + $name = $userW['real_name']; + if ($name == '') $name = $userW['name']; + else if ($name == 'Array') $name = $userW['name']; + $userOpts[$userW['uid']] = ""; + } + + $ret .= "

        Users who can view this calendar (left):"; + $ret .= ""; + $viewP = $db->prepare_statement("SELECT p.uid,u.real_name,u.name FROM permissions as p + LEFT JOIN ".$FANNIE_OP_DB.$db->sep()."Users as u on p.uid=u.uid + WHERE p.calendarID=? + AND p.classID = 1"); + $viewR = $db->exec_statement($viewP,array($calID)); + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ">\" onclick=\"select_remove('prefViewers');\" />

        "; + $ret .= "


        "; + + $ret .= "

        Users who can write on this calendar (left):"; + $ret .= ""; + $viewP = $db->prepare_statement("SELECT p.uid,u.real_name,u.name FROM permissions as p + LEFT JOIN ".$FANNIE_OP_DB.$db->sep()."Users as u on p.uid=u.uid + WHERE p.calendarID=? + AND p.classID = 2"); + $viewR = $db->exec_statement($viewP,array($calID)); + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= "

        "; + $ret .= ">\" onclick=\"select_remove('prefWriters');\" />

        "; + $ret .= "


        "; + + $ret .= " "; + $ret .= " "; + + return $ret; + } + +} + +?> diff --git a/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginPermissions.php b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginPermissions.php new file mode 100644 index 000000000..1bce47194 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/CalendarPluginPermissions.php @@ -0,0 +1,107 @@ +prepare_statement("SELECT c.calendarID,c.name FROM + calendars AS c LEFT JOIN permissions AS p + ON c.calendarID=p.calendarID WHERE + p.uid=? AND p.classID=4 order by c.name"); + $results = $db->exec_statement($p,array($uid)); + $ret = array(); + while($row = $db->fetch_row($results)) + $ret[$row[0]] = $row[1]; + + return $ret; + } + + public static function get_other_calendars($uid){ + $db = CalendarPluginDB::get(); + + $p = $db->prepare_statement("SELECT c.calendarID,c.name,p.classID FROM + calendars AS c LEFT JOIN permissions AS p + ON c.calendarID=p.calendarID WHERE + p.uid=? or p.uid=-1 order by c.name"); + $results = $db->exec_statement($p,array($uid)); + $ret = array(); + while($row = $db->fetch_row($results)){ + $ret[$row[0]] = $row[1]; + if ($row[2] == 4) + unset($ret[$row[0]]); + } + + return $ret; + } + + public static function can_read($uid,$calID){ + $db = CalendarPluginDB::get(); + $p = $db->prepare_statement("SELECT c.calendarID,c.name FROM + calendars AS c LEFT JOIN permissions AS p + ON c.calendarID=p.calendarID WHERE + p.uid=? OR p.uid=-1 AND c.calendarID=?"); + $results = $db->exec_statement($p,array($uid,$calID)); + if ($db->num_rows($results) > 0) return True; + return False; + } + + public static function can_write($uid,$calID){ + $db = CalendarPluginDB::get(); + $p = $db->prepare_statement("SELECT c.calendarID,c.name FROM + calendars AS c LEFT JOIN permissions AS p + ON c.calendarID=p.calendarID WHERE + (p.uid=? OR p.uid=-1) AND p.classID > 1 and c.calendarID=?"); + $results = $db->exec_statement($p,array($uid,$calID)); + if ($db->num_rows($results) > 0) return True; + return False; + } + + public static function can_admin($uid,$calID){ + $db = CalendarPluginDB::get(); + $p = $db->prepare_statement("SELECT c.calendarID,c.name FROM + calendars AS c LEFT JOIN permissions AS p + ON c.calendarID=p.calendarID WHERE + p.uid=? AND p.classID > 2 and c.calendarID=?"); + $results = $db->exec_statement($p,array($uid,$calID)); + if ($db->num_rows($results) > 0) return True; + return False; + } + + public static function is_owner($uid,$calID){ + $db = CalendarPluginDB::get(); + $p = $db->prepare_statement("SELECT c.calendarID,c.name FROM + calendars AS c LEFT JOIN permissions AS p + ON c.calendarID=p.calendarID WHERE + p.uid=? AND p.classID = 4 and c.calendarID=?"); + $results = $db->exec_statement($p,array($uid,$calID)); + if ($db->num_rows($results) > 0) return True; + return False; + } + +} + +?> diff --git a/fannie/modules/plugins2.0/CalendarPlugin/css/month.css b/fannie/modules/plugins2.0/CalendarPlugin/css/month.css new file mode 100644 index 000000000..9e0afc7cf --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/css/month.css @@ -0,0 +1,103 @@ +a { + color: blue; +} + +p.index { + margin-left: 1.5em; + line-height: .7em; +} + +div.indexTitle { + font-weight: bold; + font-size: 120%; + line-height: 1em; +} + +p#indexCreateNew { + font-size: 90%; + margin-left: 3em; +} + +div.monthViewHeader { + font-size: 130%; + font-weight: bold; + text-align: center; +} + +table.monthview { + border: solid 1px black; +} + +table.monthview a { + color: #0000ff; +} + +th.monthview_head { + width: 10em; + border: solid 1px black; +} + +td.monthview_body { + border: solid 1px black; + width: 10em; + height: 5em; + vertical-align: top; +} + +div.monthview_box { + margin: 0 6px 6px 6px; + font-size: 80%; +} + +div.monthview_box_alt { + margin: 0 6px 6px 6px; + font-size: 80%; + color: #000099; +} + +td.monthview_previous { + padding-left: 20px; + text-align: left; +} + +td.monthview_next { + padding-right: 20px; + text-align: right; +} + +td.monthview_current { + text-align: center; +} + +div.overlay_outerbox { + margin: 5px; + border: solid 1px black; +} + +div.overlay_date { + border-bottom: solid 1px black; + font-size: 90%; + font-weight: bold; + padding-left: 10px; +} + +div.overlay_one { + padding: 5px; + color: #000000; + background: #ffffff; +} + +div.overlay_two { + padding: 5px; + color: #000000; + background: #dddddd; +} + +div#overlayinput { + color: #000000; + float: left; +} + +#overlayinput b{ + color: black; +} diff --git a/fannie/modules/plugins2.0/CalendarPlugin/index.php b/fannie/modules/plugins2.0/CalendarPlugin/index.php new file mode 100644 index 000000000..568e6764c --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/modules/plugins2.0/CalendarPlugin/javascript/ajax.js b/fannie/modules/plugins2.0/CalendarPlugin/javascript/ajax.js new file mode 100644 index 000000000..de65e1c91 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/javascript/ajax.js @@ -0,0 +1,49 @@ +/* ajax request */ +function createRequestObject() { + var ro; + var browser = navigator.appName; + if(browser == "Microsoft Internet Explorer"){ + ro = new ActiveXObject("Microsoft.XMLHTTP"); + }else{ + ro = new XMLHttpRequest(); + } + return ro; +} + +/* global request object */ +var http = createRequestObject(); + +/* send action to this page + * tack on more arguments as needed with '&' and '=' + * */ +function phpSend(action) { + http.open('get', 'CalendarAjax.php?action='+action); + http.onreadystatechange = handleResponse; + http.send(null); +} + +/* ajax callback function + * by convention, results return [actionname]`[data] + * splitting on backtick separates, then switch on action name + * allows different actions to be handled differently + * */ +function handleResponse() { + if(http.readyState == 4){ + var response = http.responseText; + var array = response.split('`'); + switch(array[0]){ + case 'monthview_save': + break; + case 'createCalendar': + var cur = document.getElementById('yours').innerHTML; + cur += array[1]; + document.getElementById('yours').innerHTML = cur; + break; + case 'savePrefs': + alert('Settings have been saved'); + break; + default: + alert(response); + } + } +} diff --git a/fannie/modules/plugins2.0/CalendarPlugin/javascript/calendar.js b/fannie/modules/plugins2.0/CalendarPlugin/javascript/calendar.js new file mode 100644 index 000000000..8363e97f0 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/javascript/calendar.js @@ -0,0 +1,131 @@ +// ************************************************************************ +// Display: monthview functions +// ************************************************************************ + +var placeHolder = null; + +function try_edit_monthview(idstr,uid){ + if (placeHolder == null) + edit_monthview(idstr,uid); +} + +function edit_monthview(idstr,uid){ + if (idstr+":"+uid == placeHolder) return; + + if (placeHolder != null){ + var datecheck = placeHolder.split(':'); + if (datecheck[0] == idstr) return; + } + + if (placeHolder != null) + save_monthview(); + + var content = document.getElementById(idstr+uid).innerHTML; + content = content.replace(/
        /g,"\n"); + + var area = ""; + + document.getElementById(idstr+uid).innerHTML = area; + placeHolder = idstr+":"+uid; + document.getElementById("TA_"+idstr+uid).focus(); +} + +function save_monthview(){ + var temp = placeHolder.split(":"); + var datestr = temp[0]; + var uid = temp[1]; + + var textstr = document.getElementById("TA_"+datestr+uid).value; + textstr = textstr.replace(/\r/g,""); + textstr = textstr.replace(/\n/g,"
        "); + document.getElementById(datestr+uid).innerHTML = textstr; + var id = document.getElementById('calendarID').value; + + textstr = textstr.replace(/&/g,"%26"); + phpSend('monthview_save&id='+id+'&text='+textstr+'&date='+datestr+'&uid='+uid); + placeHolder = null; +} + +// Refresh periodically for concurrency, but +// make sure nothing's open for editing +function monthview_refresher(){ + if (placeHolder != null){ + setTimeout('monthview_refresher()',15000); + } + else { + location.reload(true); + } +} + +// ************************************************************************ +// Display: index functions +// ************************************************************************ + +function newCalendar(uid){ + var content = "Name: "; + content += " "; + content += ""; + content += ""; + + document.getElementById('indexCreateNew').innerHTML=content; + document.getElementById('newCalName').focus(); +} + +function makeNewCal(doCreate){ + var uid = document.getElementById('newCalUID').value; + var name = document.getElementById('newCalName').value; + if (doCreate == 1 && name != ""){ + phpSend('createCalendar&name='+name+'&uid='+uid); + } + + var content = ""; + content += "Create a new calendar"; + document.getElementById('indexCreateNew').innerHTML=content; +} + +// ************************************************************************ +// Display: prefs functions +// ************************************************************************ + +function select_add(src,dest){ + var opts = document.getElementById(src).options; + var src_element = document.getElementById(dest); + for(var i=0;i=0;i--){ + if (opts[i].selected) + src_element.remove(i); + } +} + +function savePrefs(calID){ + var name = document.getElementById('prefName').value; + + var viewers = ""; + var opts = document.getElementById('prefViewers').options; + for(var i=0;i diff --git a/fannie/modules/plugins2.0/CalendarPlugin/sql/calendars.php b/fannie/modules/plugins2.0/CalendarPlugin/sql/calendars.php new file mode 100644 index 000000000..8537c1162 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/sql/calendars.php @@ -0,0 +1,38 @@ + diff --git a/fannie/modules/plugins2.0/CalendarPlugin/sql/monthview_events.php b/fannie/modules/plugins2.0/CalendarPlugin/sql/monthview_events.php new file mode 100644 index 000000000..df373a705 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/sql/monthview_events.php @@ -0,0 +1,34 @@ + diff --git a/fannie/modules/plugins2.0/CalendarPlugin/sql/permissions.php b/fannie/modules/plugins2.0/CalendarPlugin/sql/permissions.php new file mode 100644 index 000000000..1f5458048 --- /dev/null +++ b/fannie/modules/plugins2.0/CalendarPlugin/sql/permissions.php @@ -0,0 +1,32 @@ + diff --git a/fannie/modules/plugins2.0/CoreWarehouse/CoreWarehouse.php b/fannie/modules/plugins2.0/CoreWarehouse/CoreWarehouse.php new file mode 100644 index 000000000..b4108fc41 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/CoreWarehouse.php @@ -0,0 +1,84 @@ + array('default'=>'core_warehouse','label'=>'Database', + 'description'=>'Database to store transaction information. Can + be one of the default CORE databases or a + separate one.') + ); + + public $plugin_description = 'Plugin for managing data warehouse. No end-user facing + functionality here. The plugin is just a set of tools for creating summary + tables and loading historical transaction data into said tables. Reports may + utilize the warehouse when available. In some cases it may just mean simpler + queries; in others there may be a performance benefit to querying + pre-aggregated data.'; + + + public function setting_change(){ + global $FANNIE_ROOT, $FANNIE_PLUGIN_SETTINGS; + + $db_name = $FANNIE_PLUGIN_SETTINGS['WarehouseDatabase']; + if (empty($db_name)) return; + + $dbc = FannieDB::get($db_name); + + if (!class_exists('WarehouseModel')) + include(dirname(__FILE__).'/models/WarehouseModel.php'); + + $tables = array( + 'SumDeptSalesByDay', + 'SumDiscountsByDay', + 'SumMemSalesByDay', + 'SumMemTypeSalesByDay', + 'SumRingSalesByDay', + 'SumTendersByDay', + 'SumUpcSalesByDay', + 'TransactionSummary' + ); + + foreach($tables as $t){ + $model_class = $t.'Model'; + if (!class_exists($model_class)) + include_once(dirname(__FILE__).'/models/'.$model_class.'.php'); + $instance = new $model_class($dbc); + $instance->create(); + } + } +} + +?> diff --git a/fannie/modules/plugins2.0/CoreWarehouse/CwLoadDataPage.php b/fannie/modules/plugins2.0/CoreWarehouse/CwLoadDataPage.php new file mode 100644 index 000000000..545e39081 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/CwLoadDataPage.php @@ -0,0 +1,246 @@ +reload($FANNIE_ARCHIVE_DB, $month, $year); + } + return True; + } + + public function get_models(){ + $dh = opendir(dirname(__FILE__).'/models'); + $ret = array(); + while(($file=readdir($dh)) !== False){ + if ($file[0] == '.') continue; + if (substr($file,-9) != 'Model.php') continue; + if ($file == 'CoreWarehouseModel.php') continue; + $ret[] = substr($file,0,strlen($file)-4); + } + sort($ret); + return $ret; + } + + function body_content(){ + ob_start(); + ?> +
        +

        + Table: +

        +

        + + +

        + +
        +
        + You can use this page as a command line tool, too. It's a better option if + there's lots of data to deal with. + draw_page(); + } + else { + function print_cli_help(){ + echo "Usage: php CwReloadDataPage.php [-a || -m ]\n"; + echo "\t[ -d [-e ]]\n"; + echo "Specify a single date or a range of months.\n"; + } + $start = array(); + $end = array(); + $day = array(); + $file = False; + $all = False; + $models = $obj->get_models(); + for ($i=1;$i 12){ + print_cli_help(); + echo "Invalid start month\n"; + exit; + } + elseif ($start[1] < 1950 || $start[1] > date('Y')){ + print_cli_help(); + echo "Invalid start year\n"; + exit; + } + break; + case '-e': + case '--end': + if (!isset($argv[$i+1])){ + print_cli_help(); + echo "Missing end month\n"; + exit; + } + elseif(!isset($argv[$i+2])){ + print_cli_help(); + echo "Missing end year\n"; + exit; + } + $end = array($argv[$i+1],$argv[$i+2]); + $i+=2; + if ($end[0] < 1 || $end[0] > 12){ + print_cli_help(); + echo "Invalid start month\n"; + exit; + } + elseif ($end[1] < 1950 || $end[1] > date('Y')){ + print_cli_help(); + echo "Invalid start year\n"; + exit; + } + break; + case '-m': + case '--model-file': + if (!isset($argv[$i+1])){ + print_cli_help(); + echo "No file given\n"; + exit; + } + $file = $argv[$i+1]; + $i+=1; + if (!file_exists($file)){ + print_cli_help(); + echo "File does not exist: $file\n"; + exit; + } + $file = basename($file); + break; + case '-d': + case '--date': + if (!isset($argv[$i+1])){ + print_cli_help(); + echo "No date provided\n"; + exit; + } + $date = $argv[$i+1]; + $i+=1; + $tmp = explode('-',$date); + if (count($tmp) != 3){ + print_cli_help(); + echo "Date format is YYYY-MM-DD\n"; + exit; + } + $date = array($tmp[0],$tmp[1],$tmp[2]); + break; + case '-a': + case '--all': + $all = True; + break; + case '-h': + case '-?': + case '--help': + default: + print_cli_help(); + exit; + break; + } + } + + if (!$all && !$file){ + print_cli_help(); + echo "Must specify model file or use option -a for 'all'\n"; + exit; + } + if (empty($start) && empty($date)){ + print_cli_help(); + echo "Either date or Start & end month is required\n"; + exit; + } + if (empty($end)){ + $end = array(date('n'),date('Y')); + } + + if (!class_exists('CoreWarehouseModel')) + include_once(dirname(__FILE__).'/models/CoreWarehouseModel.php'); + + if ($file){ + $models = array(substr($file,0,strlen($file)-4)); + } + + $con = FannieDB::get($FANNIE_PLUGIN_SETTINGS['WarehouseDatabase']); + foreach($models as $class){ + echo "Reloading data for $class\n"; + if (!class_exists($class)) + include(dirname(__FILE__).'/models/'.$class.'.php'); + $obj = new $class($con); + if (empty($date)) + $obj->reload($FANNIE_ARCHIVE_DB, $start[0], $start[1], $end[0], $end[1]); + else + $obj->refresh_data($FANNIE_ARCHIVE_DB, $date[1], $date[0], $date[2]); + } + } +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/index.php b/fannie/modules/plugins2.0/CoreWarehouse/index.php new file mode 100644 index 000000000..a6d3371d1 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/CoreWarehouseModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/CoreWarehouseModel.php new file mode 100644 index 000000000..7b819d16d --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/CoreWarehouseModel.php @@ -0,0 +1,72 @@ + $end_month) + break; // done processing + if (php_sapi_name() == 'cli'){ + echo 'Processing '.date('F',mktime(0,0,0,$start_month)).', '.$start_year."\n"; + } + $this->refresh_data($trans_db, $start_month, $start_year); + $start_month += 1; + if ($start_month > 12){ + $start_year += 1; + $start_month = 1; + } + } + } + + /** + Reload data for a specific month or day + Subclasses should override + @param $trans_db Name of Fannie trans_archive database + @param $month the month + @param $year the year + @param $day (optional) if omitted reload entire month + */ + public function refresh_data($trans_db, $month, $year, $day=False){ + + } + +} + +?> diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumDeptSalesByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumDeptSalesByDayModel.php new file mode 100644 index 000000000..55f89dea5 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumDeptSalesByDayModel.php @@ -0,0 +1,129 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'department' => array('type'=>'INT','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'quantity' => array('type'=>'DOUBLE','default'=>0.00) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives */ + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + department, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as quantity + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('I','D') AND upc <> '0' + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), department"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function department(){ + if(func_num_args() == 0){ + if(isset($this->instance["department"])) + return $this->instance["department"]; + elseif(isset($this->columns["department"]["default"])) + return $this->columns["department"]["default"]; + else return null; + } + else{ + $this->instance["department"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumDiscountsByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumDiscountsByDayModel.php new file mode 100644 index 000000000..07d0f3062 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumDiscountsByDayModel.php @@ -0,0 +1,129 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'memType' => array('type'=>'SMALLINT','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'transCount' => array('type'=>'INT','default'=>0) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives */ + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + memType, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + COUNT(DISTINCT trans_num) as transCount + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('S') AND total <> 0 + AND upc='DISCOUNT' AND card_no <> 0 + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), memType"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function memType(){ + if(func_num_args() == 0){ + if(isset($this->instance["memType"])) + return $this->instance["memType"]; + elseif(isset($this->columns["memType"]["default"])) + return $this->columns["memType"]["default"]; + else return null; + } + else{ + $this->instance["memType"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function transCount(){ + if(func_num_args() == 0){ + if(isset($this->instance["transCount"])) + return $this->instance["transCount"]; + elseif(isset($this->columns["transCount"]["default"])) + return $this->columns["transCount"]["default"]; + else return null; + } + else{ + $this->instance["transCount"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumMemSalesByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumMemSalesByDayModel.php new file mode 100644 index 000000000..47d310c64 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumMemSalesByDayModel.php @@ -0,0 +1,145 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'card_no' => array('type'=>'INT','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'quantity' => array('type'=>'DOUBLE','default'=>0.00), + 'transCount' => array('type'=>'SMALLINT','default'=>0) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives */ + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + card_no, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as quantity, + COUNT(DISTINCT trans_num) AS transCount + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('I','D') + AND card_no <> 0 + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), card_no"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + + public function transCount(){ + if(func_num_args() == 0){ + if(isset($this->instance["transCount"])) + return $this->instance["transCount"]; + elseif(isset($this->columns["transCount"]["default"])) + return $this->columns["transCount"]["default"]; + else return null; + } + else{ + $this->instance["transCount"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumMemTypeSalesByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumMemTypeSalesByDayModel.php new file mode 100644 index 000000000..21ad4088d --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumMemTypeSalesByDayModel.php @@ -0,0 +1,170 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'memType' => array('type'=>'SMALLINT','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'quantity' => array('type'=>'DOUBLE','default'=>0.00), + 'transCount' => array('type'=>'INT','default'=>0) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives + The process for this controller is iterative because of + an old bug that assigns incorrect values to the transaction's + memType column on records with trans_status 'M'. Using + aggregates directly on the table over-counts memType zero + so instead we count transactions one at a time. + */ + $sql = "SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + MAX(memType) as memType, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as quantity + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('I','D') AND upc <> 'RRR' + AND card_no <> 0 AND memType IS NOT NULL + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), trans_num + ORDER BY DATE_FORMAT(tdate,'%Y%m%d'), MAX(memType)"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + $this->reset(); + while($row = $this->connection->fetch_row($result)){ + if($this->date_id() != $row['date_id'] || $this->memType() != $row['memType']){ + if ($this->date_id() !== 0){ + $this->save(); + } + $this->reset(); + $this->date_id($row['date_id']); + $this->memType($row['memType']); + $this->total(0.00); + $this->quantity(0.00); + $this->transCount(0); + } + $this->total( $this->total() + $row['total'] ); + $this->quantity( $this->quantity() + $row['quantity'] ); + $this->transCount( $this->transCount() + 1 ); + } + if ($this->date_id() !== ''){ + $this->save(); + } + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function memType(){ + if(func_num_args() == 0){ + if(isset($this->instance["memType"])) + return $this->instance["memType"]; + elseif(isset($this->columns["memType"]["default"])) + return $this->columns["memType"]["default"]; + else return null; + } + else{ + $this->instance["memType"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + + public function transCount(){ + if(func_num_args() == 0){ + if(isset($this->instance["transCount"])) + return $this->instance["transCount"]; + elseif(isset($this->columns["transCount"]["default"])) + return $this->columns["transCount"]["default"]; + else return null; + } + else{ + $this->instance["transCount"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumRingSalesByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumRingSalesByDayModel.php new file mode 100644 index 000000000..d6443ba8a --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumRingSalesByDayModel.php @@ -0,0 +1,143 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'upc' => array('type'=>'VARCHAR(13)','primary_key'=>True,'default'=>''), + 'department' => array('type'=>'INT','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'quantity' => array('type'=>'DOUBLE','default'=>0.00) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives */ + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + upc,department, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as quantity + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('I','D') AND upc <> '0' + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), upc, department"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function upc(){ + if(func_num_args() == 0){ + if(isset($this->instance["upc"])) + return $this->instance["upc"]; + elseif(isset($this->columns["upc"]["default"])) + return $this->columns["upc"]["default"]; + else return null; + } + else{ + $this->instance["upc"] = func_get_arg(0); + } + } + + public function department(){ + if(func_num_args() == 0){ + if(isset($this->instance["department"])) + return $this->instance["department"]; + elseif(isset($this->columns["department"]["default"])) + return $this->columns["department"]["default"]; + else return null; + } + else{ + $this->instance["department"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumTendersByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumTendersByDayModel.php new file mode 100644 index 000000000..81531a805 --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumTendersByDayModel.php @@ -0,0 +1,129 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'trans_subtype' => array('type'=>'VARCHAR(2)','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'quantity' => array('type'=>'DOUBLE','default'=>0.00) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives */ + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + trans_subtype, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + COUNT(*) AS quantity + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('T') + AND total <> 0 + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), trans_subtype"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function trans_subtype(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_subtype"])) + return $this->instance["trans_subtype"]; + elseif(isset($this->columns["trans_subtype"]["default"])) + return $this->columns["trans_subtype"]["default"]; + else return null; + } + else{ + $this->instance["trans_subtype"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/SumUpcSalesByDayModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/SumUpcSalesByDayModel.php new file mode 100644 index 000000000..1cbd4ed8c --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/SumUpcSalesByDayModel.php @@ -0,0 +1,129 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'upc' => array('type'=>'VARCHAR(13)','primary_key'=>True,'default'=>''), + 'total' => array('type'=>'MONEY','default'=>0.00), + 'quantity' => array('type'=>'DOUBLE','default'=>0.00) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + /* reload table from transarction archives */ + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + upc, + CONVERT(SUM(total),DECIMAL(10,2)) as total, + CONVERT(SUM(CASE WHEN trans_status='M' THEN itemQtty + WHEN unitPrice=0.01 THEN 1 ELSE quantity END),DECIMAL(10,2)) as quantity + FROM $target_table WHERE + tdate BETWEEN ? AND ? AND + trans_type IN ('I') AND upc <> '0' + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), upc"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function upc(){ + if(func_num_args() == 0){ + if(isset($this->instance["upc"])) + return $this->instance["upc"]; + elseif(isset($this->columns["upc"]["default"])) + return $this->columns["upc"]["default"]; + else return null; + } + else{ + $this->instance["upc"] = func_get_arg(0); + } + } + + public function total(){ + if(func_num_args() == 0){ + if(isset($this->instance["total"])) + return $this->instance["total"]; + elseif(isset($this->columns["total"]["default"])) + return $this->columns["total"]["default"]; + else return null; + } + else{ + $this->instance["total"] = func_get_arg(0); + } + } + + public function quantity(){ + if(func_num_args() == 0){ + if(isset($this->instance["quantity"])) + return $this->instance["quantity"]; + elseif(isset($this->columns["quantity"]["default"])) + return $this->columns["quantity"]["default"]; + else return null; + } + else{ + $this->instance["quantity"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/models/TransactionSummaryModel.php b/fannie/modules/plugins2.0/CoreWarehouse/models/TransactionSummaryModel.php new file mode 100644 index 000000000..af2564ffe --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/models/TransactionSummaryModel.php @@ -0,0 +1,346 @@ + array('type'=>'INT','primary_key'=>True,'default'=>0), + 'trans_num' => array('type'=>'VARCHAR(25)','primary_key'=>True,'default'=>''), + 'register_no' => array('type'=>'SMALLINT'), + 'emp_no' => array('type'=>'SMALLINT'), + 'tenderTotal' => array('type'=>'MONEY'), + 'taxTotal' => array('type'=>'MONEY'), + 'discountTotal' => array('type'=>'MONEY'), + 'percentDiscount' => array('type'=>'DOUBLE'), + 'retailTotal' => array('type'=>'MONEY'), + 'retailQty' => array('type'=>'DOUBLE'), + 'nonRetailTotal' => array('type'=>'MONEY'), + 'nonRetailQty' => array('type'=>'DOUBLE'), + 'ringCount' => array('type'=>'INT'), + 'start_time' => array('type'=>'DATETIME'), + 'end_time' => array('type'=>'DATETIME'), + 'duration' => array('type'=>'INT'), + 'card_no' => array('type'=>'INT','index'=>True), + 'memType' => array('type'=>'SMALLINT','index'=>True) + ); + + public function refresh_data($trans_db, $month, $year, $day=False){ + global $FANNIE_OP_DB; + $start_id = date('Ymd',mktime(0,0,0,$month,1,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,1,$year)); + $end_id = date('Ymt',mktime(0,0,0,$month,1,$year)); + $end_date = date('Y-m-t',mktime(0,0,0,$month,1,$year)); + if ($day !== False){ + $start_id = date('Ymd',mktime(0,0,0,$month,$day,$year)); + $start_date = date('Y-m-d',mktime(0,0,0,$month,$day,$year)); + $end_id = $start_id; + $end_date = $start_date; + } + + $target_table = select_dlog($start_date, $end_date); + + /* clear old entries */ + $sql = 'DELETE FROM '.$this->name.' WHERE date_id BETWEEN ? AND ?'; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_id, $end_id)); + + // 5Jul2013 - percentDiscount not currently exposed via dlog + $sql = "INSERT INTO ".$this->name." + SELECT DATE_FORMAT(tdate, '%Y%m%d') as date_id, + trans_num, + register_no, + emp_no, + SUM(CASE WHEN trans_type='T' THEN total ELSE 0 END) as tenderTotal, + SUM(CASE WHEN upc='TAX' THEN total ELSE 0 END) as taxTotal, + SUM(CASE WHEN upc='DISCOUNT' THEN total ELSE 0 END) as discountTotal, + 0 as percentDiscount, + SUM(CASE WHEN trans_type IN ('I','D') AND m.superID <> 0 THEN total else 0 END) as retailTotal, + SUM(CASE WHEN trans_type IN ('I','D') AND m.superID <> 0 AND trans_status='M' THEN itemQtty + WHEN trans_type IN ('I','D') AND m.superID <> 0 AND unitPrice=0.01 THEN 1 + WHEN trans_type IN ('I','D') AND m.superID <> 0 AND trans_status<>'M' + AND unitPrice<>0.01 THEN quantity ELSE 0 END) as retailQty, + SUM(CASE WHEN trans_type IN ('I','D') AND m.superID = 0 THEN total else 0 END) as retailTotal, + SUM(CASE WHEN trans_type IN ('I','D') AND m.superID = 0 AND trans_status='M' THEN itemQtty + WHEN trans_type IN ('I','D') AND m.superID = 0 AND unitPrice=0.01 THEN 1 + WHEN trans_type IN ('I','D') AND m.superID = 0 AND trans_status<>'M' + AND unitPrice<>0.01 THEN quantity ELSE 0 END) as retailQty, + SUM(CASE WHEN trans_type in ('I','D') THEN 1 ELSE 0 END) as ringCount, + MIN(tdate) as start_time, + MAX(tdate) as end_time, " + .$this->connection->seconddiff('MIN(tdate)','MAX(tdate)')." as duration, + MAX(card_no) as card_no, + MAX(memType) as memType + FROM $target_table as t LEFT JOIN " + .$FANNIE_OP_DB.$this->connection->sep()."MasterSuperDepts as m + ON t.department=m.dept_ID + WHERE tdate BETWEEN ? AND ? AND upc <> 'RRR' + GROUP BY DATE_FORMAT(tdate,'%Y%m%d'), trans_num"; + $prep = $this->connection->prepare_statement($sql); + $result = $this->connection->exec_statement($prep, array($start_date.' 00:00:00',$end_date.' 23:59:59')); + } + + /* START ACCESSOR FUNCTIONS */ + + public function date_id(){ + if(func_num_args() == 0){ + if(isset($this->instance["date_id"])) + return $this->instance["date_id"]; + elseif(isset($this->columns["date_id"]["default"])) + return $this->columns["date_id"]["default"]; + else return null; + } + else{ + $this->instance["date_id"] = func_get_arg(0); + } + } + + public function trans_num(){ + if(func_num_args() == 0){ + if(isset($this->instance["trans_num"])) + return $this->instance["trans_num"]; + elseif(isset($this->columns["trans_num"]["default"])) + return $this->columns["trans_num"]["default"]; + else return null; + } + else{ + $this->instance["trans_num"] = func_get_arg(0); + } + } + + public function register_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["register_no"])) + return $this->instance["register_no"]; + elseif(isset($this->columns["register_no"]["default"])) + return $this->columns["register_no"]["default"]; + else return null; + } + else{ + $this->instance["register_no"] = func_get_arg(0); + } + } + + public function emp_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["emp_no"])) + return $this->instance["emp_no"]; + elseif(isset($this->columns["emp_no"]["default"])) + return $this->columns["emp_no"]["default"]; + else return null; + } + else{ + $this->instance["emp_no"] = func_get_arg(0); + } + } + + public function tenderTotal(){ + if(func_num_args() == 0){ + if(isset($this->instance["tenderTotal"])) + return $this->instance["tenderTotal"]; + elseif(isset($this->columns["tenderTotal"]["default"])) + return $this->columns["tenderTotal"]["default"]; + else return null; + } + else{ + $this->instance["tenderTotal"] = func_get_arg(0); + } + } + + public function taxTotal(){ + if(func_num_args() == 0){ + if(isset($this->instance["taxTotal"])) + return $this->instance["taxTotal"]; + elseif(isset($this->columns["taxTotal"]["default"])) + return $this->columns["taxTotal"]["default"]; + else return null; + } + else{ + $this->instance["taxTotal"] = func_get_arg(0); + } + } + + public function discountTotal(){ + if(func_num_args() == 0){ + if(isset($this->instance["discountTotal"])) + return $this->instance["discountTotal"]; + elseif(isset($this->columns["discountTotal"]["default"])) + return $this->columns["discountTotal"]["default"]; + else return null; + } + else{ + $this->instance["discountTotal"] = func_get_arg(0); + } + } + + public function percentDiscount(){ + if(func_num_args() == 0){ + if(isset($this->instance["percentDiscount"])) + return $this->instance["percentDiscount"]; + elseif(isset($this->columns["percentDiscount"]["default"])) + return $this->columns["percentDiscount"]["default"]; + else return null; + } + else{ + $this->instance["percentDiscount"] = func_get_arg(0); + } + } + + public function retailTotal(){ + if(func_num_args() == 0){ + if(isset($this->instance["retailTotal"])) + return $this->instance["retailTotal"]; + elseif(isset($this->columns["retailTotal"]["default"])) + return $this->columns["retailTotal"]["default"]; + else return null; + } + else{ + $this->instance["retailTotal"] = func_get_arg(0); + } + } + + public function retailQty(){ + if(func_num_args() == 0){ + if(isset($this->instance["retailQty"])) + return $this->instance["retailQty"]; + elseif(isset($this->columns["retailQty"]["default"])) + return $this->columns["retailQty"]["default"]; + else return null; + } + else{ + $this->instance["retailQty"] = func_get_arg(0); + } + } + + public function nonRetailTotal(){ + if(func_num_args() == 0){ + if(isset($this->instance["nonRetailTotal"])) + return $this->instance["nonRetailTotal"]; + elseif(isset($this->columns["nonRetailTotal"]["default"])) + return $this->columns["nonRetailTotal"]["default"]; + else return null; + } + else{ + $this->instance["nonRetailTotal"] = func_get_arg(0); + } + } + + public function nonRetailQty(){ + if(func_num_args() == 0){ + if(isset($this->instance["nonRetailQty"])) + return $this->instance["nonRetailQty"]; + elseif(isset($this->columns["nonRetailQty"]["default"])) + return $this->columns["nonRetailQty"]["default"]; + else return null; + } + else{ + $this->instance["nonRetailQty"] = func_get_arg(0); + } + } + + public function ringCount(){ + if(func_num_args() == 0){ + if(isset($this->instance["ringCount"])) + return $this->instance["ringCount"]; + elseif(isset($this->columns["ringCount"]["default"])) + return $this->columns["ringCount"]["default"]; + else return null; + } + else{ + $this->instance["ringCount"] = func_get_arg(0); + } + } + + public function start_time(){ + if(func_num_args() == 0){ + if(isset($this->instance["start_time"])) + return $this->instance["start_time"]; + elseif(isset($this->columns["start_time"]["default"])) + return $this->columns["start_time"]["default"]; + else return null; + } + else{ + $this->instance["start_time"] = func_get_arg(0); + } + } + + public function end_time(){ + if(func_num_args() == 0){ + if(isset($this->instance["end_time"])) + return $this->instance["end_time"]; + elseif(isset($this->columns["end_time"]["default"])) + return $this->columns["end_time"]["default"]; + else return null; + } + else{ + $this->instance["end_time"] = func_get_arg(0); + } + } + + public function duration(){ + if(func_num_args() == 0){ + if(isset($this->instance["duration"])) + return $this->instance["duration"]; + elseif(isset($this->columns["duration"]["default"])) + return $this->columns["duration"]["default"]; + else return null; + } + else{ + $this->instance["duration"] = func_get_arg(0); + } + } + + public function card_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["card_no"])) + return $this->instance["card_no"]; + elseif(isset($this->columns["card_no"]["default"])) + return $this->columns["card_no"]["default"]; + else return null; + } + else{ + $this->instance["card_no"] = func_get_arg(0); + } + } + + public function memType(){ + if(func_num_args() == 0){ + if(isset($this->instance["memType"])) + return $this->instance["memType"]; + elseif(isset($this->columns["memType"]["default"])) + return $this->columns["memType"]["default"]; + else return null; + } + else{ + $this->instance["memType"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/CoreWarehouse/reload-yesterday.sh b/fannie/modules/plugins2.0/CoreWarehouse/reload-yesterday.sh new file mode 100755 index 000000000..bc7f51c4c --- /dev/null +++ b/fannie/modules/plugins2.0/CoreWarehouse/reload-yesterday.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# +# simple script to load yesterday's data +# temporary solution until plugins can tie +# into Fannie's cron system + +my_folder=`dirname "$0"` +cd "$my_folder" + +yesterday=`date --date=yesterday +"%F"` + +php CwLoadDataPage.php -a -d "$yesterday" diff --git a/fannie/modules/plugins2.0/HouseCoupon/HouseCoupon.php b/fannie/modules/plugins2.0/HouseCoupon/HouseCoupon.php new file mode 100644 index 000000000..1e8325f31 --- /dev/null +++ b/fannie/modules/plugins2.0/HouseCoupon/HouseCoupon.php @@ -0,0 +1,339 @@ +display_function = 'list_house_coupons'; + + if (FormLib::get_form_value('edit_id','') !== ''){ + $this->coupon_id = (int)FormLib::get_form_value('edit_id',0); + $this->display_function = 'edit_coupon'; + } + else if (FormLib::get_form_value('new_coupon_submit') !== ''){ + $dbc = FannieDB::get($FANNIE_OP_DB); + + $maxQ = $dbc->prepare_statement("SELECT max(coupID) from houseCoupons"); + $max = array_pop($dbc->fetch_row($dbc->exec_statement($maxQ))); + $this->coupon_id = $max+1; + + $insQ = $dbc->prepare_statement("INSERT INTO houseCoupons (coupID) values (?)"); + $dbc->exec_statement($insQ,array($this->coupon_id)); + + $this->display_function='edit_coupon'; + + $dbc->close(); + } + else if (FormLib::get_form_value('explain_submit') !== ''){ + include(dirname(__FILE__).'/explainify.html'); + return False; + } + else if (FormLib::get_form_value('submit_save') !== '' + || FormLib::get_form_value('submit_add_upc') !== '' + || FormLib::get_form_value('submit_delete_upc') !== '' + || FormLib::get_form_value('submit_add_dept') !== '' + || FormLib::get_form_value('submit_delete_dept') !== '' ){ + + $dbc = FannieDB::get($FANNIE_OP_DB); + + $this->coupon_id = FormLib::get_form_value('cid',0); + $expires = FormLib::get_form_value('expires'); + if ($expires == '') $expires = null; + $limit = FormLib::get_form_value('limit',1); + $mem = FormLib::get_form_value('memberonly',0); + $dept = FormLib::get_form_value('dept',0); + $dtype = FormLib::get_form_value('dtype','Q'); + $dval = FormLib::get_form_value('dval',0); + $mtype = FormLib::get_form_value('mtype','Q'); + $mval = FormLib::get_form_value('mval',0); + + $query = "UPDATE houseCoupons SET endDate=?, + ".$dbc->identifier_escape('limit')."=? + ,memberOnly=?,discountType=?, + discountValue=?,minType=?,minValue=?, + department=? WHERE coupID=?"; + $args = array($expires,$limit,$mem,$dtype, + $dval,$mtype,$mval,$dept,$this->coupon_id); + $prep = $dbc->prepare_statement($query); + $dbc->exec_statement($prep,$args); + + $this->display_function = 'edit_coupon'; + + if (FormLib::get_form_value('submit_add_upc') !== '' && FormLib::get_form_value('new_upc') !== ''){ + /** + Add (or update) a UPC + */ + $upc = str_pad(FormLib::get_form_value('new_upc'),13,'0',STR_PAD_LEFT); + $type = FormLib::get_form_value('newtype','BOTH'); + $checkP = $dbc->prepare_statement('SELECT upc FROM houseCouponItems WHERE upc=? and coupID=?'); + $check = $dbc->exec_statement($checkP,array($upc,$this->coupon_id)); + if ($dbc->num_rows($check) == 0){ + $query = $dbc->prepare_statement("INSERT INTO houseCouponItems VALUES (?,?,?)"); + $dbc->exec_statement($query,array($this->coupon_id,$upc,$type)); + } + else { + $query = $dbc->prepare_statement("UPDATE houseCouponItems SET type=? + WHERE upc=? AND coupID=?"); + $dbc->exec_statement($query,array($type,$upc,$this->coupon_id)); + } + } + if (FormLib::get_form_value('submit_add_dept') !== '' && FormLib::get_form_value('new_dept') !== ''){ + /** + Add (or update) a department + */ + $dept = (int)FormLib::get_form_value('new_dept',0); + $type = FormLib::get_form_value('newtype','BOTH'); + $checkP = $dbc->prepare_statement('SELECT upc FROM houseCouponItems WHERE upc=? and coupID=?'); + $check = $dbc->exec_statement($checkP,array($dept,$this->coupon_id)); + if ($dbc->num_rows($check) == 0){ + $query = $dbc->prepare_statement("INSERT INTO houseCouponItems VALUES (?,?,?)"); + $dbc->exec_statement($query,array($this->coupon_id,$dept,$type)); + } + else { + $query = $dbc->prepare_statement("UPDATE houseCouponItems SET type=? + WHERE upc=? AND coupID=?"); + $dbc->exec_statement($query,array($type,$dept,$this->coupon_id)); + } + } + elseif (FormLib::get_form_value('submit_delete_upc') !== '' || FormLib::get_form_value('submit_delete_dept') !== ''){ + /** + Delete UPCs and departments + */ + $query = $dbc->prepare_statement("DELETE FROM houseCouponItems + WHERE upc=? AND coupID=?"); + foreach(FormLib::get_form_value('del',array()) as $upc){ + $dbc->exec_statement($query,array($upc,$this->coupon_id)); + } + } + } + + return True; + } + + function body_content(){ + $func = $this->display_function; + return $this->$func(); + } + + function list_house_coupons(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $ret = '
        '; + $ret .= ''; + $ret .= '      '; + $ret .= ''; + $ret .= '
        '; + $ret .= ''; + $ret .= ''; + $q = $dbc->prepare_statement("SELECT coupID, discountValue, discountType, endDate FROM houseCoupons ORDER BY coupID"); + $r = $dbc->exec_statement($q); + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf(' + ', + $w['coupID'],$w['coupID'], + $w['discountValue'],$w['discountType'],$w['endDate']); + } + $ret .= '
        IDValueExpires
        #%d Edit%.2f%s%s
        '; + + $dbc->close(); + return $ret; + } + + function edit_coupon(){ + global $FANNIE_URL; + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $depts = array(); + $query = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); + $result = $dbc->exec_statement($query); + while($row = $dbc->fetch_row($result)){ + $depts[$row[0]] = $row[1]; + } + + $cid = $this->coupon_id; + + $q1 = $dbc->prepare_statement("SELECT * FROM houseCoupons WHERE coupID=?"); + $r1 = $dbc->exec_statement($q1,array($cid)); + $row = $dbc->fetch_row($r1); + + $expires = $row['endDate']; + if (strstr($expires,' ')) + $expires = array_shift(explode(' ',$expires)); + $limit = $row['limit']; + $mem = $row['memberOnly']; + $dType = $row['discountType']; + $dVal = $row['discountValue']; + $mType = $row['minType']; + $mVal = $row['minValue']; + $dept = $row['department']; + + $ret .= '
        '; + $ret .= ''; + + $ret .= sprintf(' + + + "; + + $mts = array( + 'Q'=>'Quantity (at least)', + 'Q+'=>'Quantity (more than)', + 'D'=>'Department (at least $)', + 'D+'=>'Department (more than $)', + 'M'=>'Mixed', + '$'=>'Total (at least $)', + '$+'=>'Total (more than $)', + ''=>'No minimum' + ); + $ret .= ""; + + $ret .= "
        Coupon ID#%sUPC%s
        Expires + Limit
        Member-only + + Department
        Discount Type +
        Minimum Type +
        "; + $ret .= "
        "; + $ret .= ' | '; + + if ($mType == "Q" || $mType == "Q+" || $mType == "M"){ + $ret .= "
        "; + $ret .= "Add UPC: + + "; + $ret .= "

        "; + $ret .= " + "; + $query = $dbc->prepare_statement("SELECT h.upc,p.description,h.type FROM + houseCouponItems as h LEFT JOIN products AS + p ON h.upc = p.upc WHERE coupID=?"); + $result = $dbc->exec_statement($query,array($cid)); + while($row = $dbc->fetch_row($result)){ + $ret .= sprintf(" + ", + $row[0],$row[1],$row[2],$row[0]); + } + $ret .= "
        Items
        %s%s%s
        "; + $ret .= "
        "; + $ret .= ""; + } + else if ($mType == "D" || $mType == "D+"){ + $ret .= "
        "; + $ret .= "Add Dept:
        %s%s%s
        "; + $ret .= "
        "; + $ret .= ""; + } + + $dbc->close(); + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + return $ret; + } +} + +/** + More stopgap; load self if needed +*/ +if (basename($_SERVER['PHP_SELF']) == 'HouseCoupon.php'){ + $obj = new HouseCoupon(); + $obj->draw_page(); +} + diff --git a/fannie/modules/plugins2.0/HouseCoupon/explainify.html b/fannie/modules/plugins2.0/HouseCoupon/explainify.html new file mode 100644 index 000000000..d01eda7ff --- /dev/null +++ b/fannie/modules/plugins2.0/HouseCoupon/explainify.html @@ -0,0 +1,56 @@ + + + House Coupon Explanations + + +

        Explanation of House Coupon terms and options

        +First, the simple ones: +
          +
        • Expires is when the coupon runs through, inclusive. E.g., if the expiration date is +January 31, 2010, the coupon will ring as "expired" starting February 1, 2010 +
        • Limit is the number of times the coupon can be used per transaction +
        • Member-only coupons can only be used by members +
        • Department dicates how the discount gets coded by the POS +
        +

        Required purchases

        +The bulk of features are here. The settings for minimum purchase dictate which kinds +of discounts can be applied. Many of these have similar options for at least +and more than. The usage is the same for all of them and affects how the minimum +is applied. E.g., if a soda coupon requires a quantity of at least 2, then purchasing +2 sodas is enough to use the coupon. On the other hand, if the requirement was a +quantity of more than 2, then 3 (or more) soda purchases would be needed. +
          +
        • Quantity (Q, Q+) requires a minimum purchase of specific items. Quantity is +measured by each or by the pound depending on the setting for the item. A quantity +minimum must have items associated with it. This is the one of the more flexible +minimum types; it works with every discount type except scaling discount (department) +
        • Department (D, D+) requires a minimum total purchase across the selected departments. +Purchase is measured in dollars rather than quantity. Applicable discount types are +scaling discount (department), flat discount, and percent discount. +
        • Mixed (M) is the most complicated minimum type (yet). The customer must purchase +at least the specified quantity of qualifying items and some quantity of discount +items. Mixed discount is the only case where an item's QUALIFIER/DISCOUNT/BOTH setting +should be used. Like quantity discount, mixed discount can be used with any discount +type except scaling discount (department) +
        • Total ($, $+) discount simply refers to the total of the entire transaction in +dollars. No specific items or departments are associated with this minimum. The only +applicable discount types are flat discount and percent discount +
        • No minimum (blank) is exactly what it sounds like. +
        +

        Discount types

        +
          +
        • Quantity discount gives a certain number of items free. Fractions are OK, so +this ends up being like a percent discount. A value of 1.0 gives an item for free, a value of +0.5 gives an item for 50% off, etc. The discount is always applied to the cheapest valid item. +
        • Set Price discount locks in the coupon price. Regardless of the regular price, the +price with coupon will be exactly what's specified here. +
        • Flat Discount (Item) discounts the chepeast applicable item by the specified amount. +This scales with quantity to deal with by-weight items. +
        • Flat Discount (Department) is the same as above except for an item in the specified +department(s) instead of a specific UPC +
        • Flat Discount removes exactly the given amount, once, from the transaction +
        • Percent Discount provides a percentage off all discountable items (e.g., member +appreciation month) +
        + + diff --git a/fannie/modules/plugins2.0/OverShortTools/.gitignore b/fannie/modules/plugins2.0/OverShortTools/.gitignore new file mode 100644 index 000000000..dcaa8e8a8 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/.gitignore @@ -0,0 +1 @@ +acct diff --git a/fannie/modules/plugins2.0/OverShortTools/OverShortCashierPage.php b/fannie/modules/plugins2.0/OverShortTools/OverShortCashierPage.php new file mode 100644 index 000000000..c6f6ebb21 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/OverShortCashierPage.php @@ -0,0 +1,313 @@ +ajaxRequest($action); + return False; + } + return True; + } + + function ajaxRequest($action){ + global $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + $date = FormLib::get_form_value('date'); + $empno = FormLib::get_form_value('empno'); + switch($action){ + case 'loadCashier': + echo $this->displayCashier($date,$empno); + break; + case 'save': + $tenders = FormLib::get_form_value('tenders'); + $notes = FormLib::get_form_value('notes'); + $checks = FormLib::get_form_value('checks'); + echo $this->save($empno,$date,$tenders,$checks,$notes); + break; + } + } + + function displayCashier($date,$empno){ + global $FANNIE_PLUGIN_SETTINGS, $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + + $dlog = select_dlog($date); + + $totals = array(); + $counts = array(); + $names = array(); + $counts["SCA"] = 0.00; + + $totalsQ = "SELECT + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END + as trans_subtype,TenderName, + -1*SUM(total) FROM $dlog as d LEFT JOIN " + .$FANNIE_OP_DB.$dbc->sep()."tenders as t + ON d.trans_subtype=t.TenderCode + WHERE emp_no = ? + AND tdate BETWEEN ? AND ? + AND trans_type='T' + GROUP BY + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END, + TenderName, TenderID + ORDER BY TenderID"; + $totalsP = $dbc->prepare_statement($totalsQ); + $totalsR = $dbc->exec_statement($totalsP, array($empno,$date.' 00:00:00',$date.' 23:59:59')); + while($totalsW = $dbc->fetch_row($totalsR)){ + $totals[$totalsW[0]] = $totalsW[2]; + $names[$totalsW[0]] = $totalsW[1]; + $counts[$totalsW[0]] = 0.00; + } + + $model = new DailyCountsModel($dbc); + $model->date($date); + $model->emp_no($empno); + foreach($model->find() as $obj) + $counts[$obj->tender_type()] = $obj->amt(); + + $posTotal = 0; + $countTotal = 0; + $osTotal = 0; + + // cash + checks required + if (!isset($totals['CA'])) $totals['CA'] = 0.00; + if (!isset($counts['CA'])) $counts['CA'] = 0.00; + if (!isset($totals['CK'])) $totals['CK'] = 0.00; + if (!isset($counts['CK'])) $counts['CK'] = 0.00; + + $ret = ""; + $ret .= "$date - Emp. #$empno

        "; + $ret .= "Starting cash:
        "; + $posTotal += $counts['SCA']; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['CA'] - $totals['CA'] - $counts['SCA'],2); + $ret .= ""; + + $posTotal += $totals['CA']; + $countTotal += $counts['CA']; + $osTotal += $os; + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $os = round($counts['CK'] - $totals['CK'],2); + $ret .= ""; + $checks = ""; + $model = new DailyChecksModel($dbc); + $model->date($date); + $model->emp_no($empno); + $model->load(); + $checks = ""; + foreach( explode(",",$model->checks()) as $c){ + if (is_numeric($c)) + $checks .= "$c\n"; + } + $checks = substr($checks,0,strlen($checks)-1); + $ret .= ""; + $ret .= ""; + + $posTotal += $totals['CK']; + $countTotal += $counts['CK']; + $osTotal += $os; + + $codes = array_keys($totals); + for($i=0;$i "; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + if ($next){ + $ret .= ""; + $ret .= ""; + } + else + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + if (!isset($counts[$code])) $counts[$code] = 0.00; + $os = round($counts[$code] - $totals[$code],2); + $ret .= ""; + + $posTotal += $totals[$code]; + $countTotal += $counts[$code]; + $osTotal += $os; + + $ret .= ""; + + if ($next){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + if (!isset($counts[$next])) $counts[$next] = 0.00; + $os = round($counts[$next] - $totals[$next],2); + $ret .= ""; + + $posTotal += $totals[$next]; + $countTotal += $counts[$next]; + $osTotal += $os; + } + else + $ret .= ""; + $ret .= ""; + } + + $ret .= ""; + + $ret .= ""; + $ret .= ""; + $model = new DailyNotesModel($dbc); + $model->date($date); + $model->emp_no($empno); + $model->load(); + $note = str_replace("''","'",$model->note()); + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $ret .= "
        CashPOSCountO/S ChecksPOSCountO/SList checks
         ".$totals['CA']."$os  ".$totals['CK']."".$counts['CK']."$os
        ".$names[$code]."POSCountO/S ".$names[$next]."POSCountO/S
         
         ".$totals[$code]."$os  ".$totals[$next]."$os 
         
        TotalsPOSCountO/S 
         $posTotal$countTotal$osTotal 
        "; + $ret .= ""; + $ret .= ""; + + $ret .= ""; + $ret .= ""; + + return $ret; + } + + function save($empno,$date,$tenders,$checks,$notes){ + global $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + + $model = new DailyNotesModel($dbc); + $model->date($date); + $model->emp_no($empno); + $notes = str_replace("'","''",urldecode($notes)); + $model->note($notes); + $model->save(); + + $model = new DailyChecksModel($dbc); + $model->date($date); + $model->emp_no($empno); + $model->checks($checks); + $model->save(); + + $model = new DailyCountsModel($dbc); + $model->date($date); + $model->emp_no($empno); + $tarray = explode("|",$tenders); + foreach($tarray as $t){ + $temp = explode(":",$t); + if (count($temp) != 2) continue; + if (!is_numeric($temp[1])) continue; + + $tender = $temp[0]; + $amt = $temp[1]; + + $model->tender_type($tender); + $model->amt($amt); + $model->save(); + } + + return "Saved"; + } + + function css_content(){ + return ' + tr.color { + background: #ffffcc; + } + '; + } + + function body_content(){ + global $FANNIE_URL; + ob_start(); + $this->add_script('js/cashier.js'); + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + $this->add_css_file($FANNIE_URL.'src/style.css'); + ?> + + + Cashier + + +
        +
        + Date: + Cashier: + +
        +
        + +
        +
        + draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/OverShortTools/OverShortDayPage.php b/fannie/modules/plugins2.0/OverShortTools/OverShortDayPage.php new file mode 100644 index 000000000..d34a989a9 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/OverShortDayPage.php @@ -0,0 +1,572 @@ +ajaxRequest($action); + return False; + } + return True; + } + + function ajaxRequest($action){ + global $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + switch($action){ + case 'save': + $date = FormLib::get_form_value('curDate'); + $data = FormLib::get_form_value('data'); + $user = FormLib::get_form_value('user'); + $resolved = FormLib::get_form_value('resolved'); + $notes = FormLib::get_form_value('notes'); + + $model = new OverShortsLogModel($dbc); + $model->date($date); + $model->username($user); + $model->resolved($resolved); + $model->save(); + + $this->save($date,$data); + $this->saveNotes($date,$notes); + echo "saved"; + break; + + case 'date': + $date = FormLib::get_form_value('arg'); + $dlog = select_dlog($date); + + $empsR = null; + if (FormLib::get_form_value('emp_no') !== ''){ + /* get info for single employee */ + $empsQ = "SELECT e.firstname,e.emp_no FROM " + .$FANNIE_OP_DB.$dbc->sep()."employees AS e + WHERE emp_no=?"; + $empsP = $dbc->prepare_statement($empsQ); + $empsR = $dbc->exec_statement($empsP,array(FormLib::get_form_value('emp_no'))); + } + else { + /* determine who worked that day (and their first names) */ + $empsQ = "select e.firstname,d.emp_no from $dlog as d,$FANNIE_OP_DB".$dbc->sep()."employees as e where + d.tdate BETWEEN ? AND ? and trans_type='T' and d.emp_no = e.emp_no + group by d.emp_no,e.firstname order by e.firstname"; + $empsP = $dbc->prepare_statement($empsQ); + $empsR=$dbc->exec_statement($empsP,array($date.' 00:00:00',$date.' 23:59:59')); + } + $output = "

        $date

        "; + + $output .= "
        "; + $output .= ""; + $output .= ""; + + $tQ = "SELECT d.trans_subtype,t.TenderName FROM $dlog as d, " + .$FANNIE_OP_DB.$dbc->sep()."tenders AS t WHERE + d.tdate BETWEEN ? AND ? AND trans_type='T' + AND d.trans_subtype = t.TenderCode + GROUP BY d.trans_subtype, t.TenderName, t.tenderID + ORDER BY t.TenderID"; + $tP = $dbc->prepare_statement($tQ); + $tR=$dbc->exec_statement($tP,array($date.' 00:00:00',$date.' 23:59:59')); + + $tender_info = array(); + while($tW = $dbc->fetch_row($tR)){ + if ($tW['trans_subtype'] == 'AX') + continue; // group AMEX w/ other credit + $record = array( + 'name' => $tW['TenderName'], + 'posTtl' => 0.0, + 'countTtl' => 0.0, + 'osTtl' => 0.0, + 'perEmp' => array() + ); + $tender_info[$tW['trans_subtype']] = $record; + } + + $overallTotal = 0; + $overallCountTotal = 0; + $overallOSTotal = 0; + + /* get cash, check, and credit totals for each employee + print them in a table along with input boxes for over/short */ + $args = array($date.' 00:00:00',$date.' 23:59:59'); + $q = "SELECT -1*sum(total) AS total,emp_no, + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END + AS trans_subtype + FROM $dlog + WHERE tdate BETWEEN ? AND ? AND trans_type='T' "; + if (FormLib::get_form_value('emp_no') !== ''){ + $q .= ' AND emp_no=? '; + $args[] = FormLib::get_form_value('emp_no'); + } + $q .= "GROUP BY emp_no, + CASE WHEN trans_subtype IN ('CC','AX') THEN 'CC' ELSE trans_subtype END"; + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p, $args); + $posttl = array(); + while($w = $dbc->fetch_row($r)){ + $tender_info[$w['trans_subtype']]['perEmp'][$w['emp_no']] = $w['total']; + } + + $noteP = $dbc->prepare_statement('SELECT note FROM dailyNotes WHERE emp_no=? AND date=?'); + $scaP = $dbc->prepare_statement('SELECT amt FROM dailyCounts WHERE date=? AND emp_no=? + AND tender_type=\'SCA\''); + $countP = $dbc->prepare_statement("select amt from dailyCounts where date=? and emp_no=? and tender_type=?"); + + while ($row = $dbc->fetch_array($empsR)){ + $emp_no = $row[1]; + $perCashierTotal = 0; + $perCashierCountTotal = 0; + $perCashierOSTotal = 0; + + $noteR = $dbc->exec_statement($noteP, array($emp_no, $date)); + $noteW = $dbc->fetch_array($noteR); + $note = stripslashes($noteW[0]); + + $output .= ""; + + $output .= ""; + $output .= ""; + $fetchR = $dbc->exec_statement($scaP, array($date, $emp_no)); + $startcash = 0; + if ($dbc->num_rows($fetchR) == 0) + $output .= ""; + else { + $startcash = array_pop($dbc->fetch_array($fetchR)); + $output .= ""; + $perCashierCountTotal -= $startcash; + $tender_info['CA']['posTtl'] -= $startcash; + } + + foreach($tender_info as $code => $info){ + $posAmt = 0; + if (isset($info['perEmp'][$emp_no])) + $posAmt = $info['perEmp'][$emp_no]; + $output .= " + "; + $output .= ""; + + $fetchR = $dbc->exec_statement($countP, array($date, $emp_no, $code)); + if ($dbc->num_rows($fetchR) == 0){ + $output .= ""; + $output .= ""; + $output .= ""; + } + else { + $cash = array_pop($dbc->fetch_array($fetchR)); + $output .= ""; + $os = round($cash - $posAmt,2); + if ($code == 'CA') + $os = round($cash - $posAmt - $startcash,2); + $output .= ""; + $output .= ""; + + $tender_info[$code]['countTtl'] += $cash; + $tender_info[$code]['osTtl'] += $os; + + $perCashierCountTotal += $cash; + $perCashierOSTotal += $os; + } + $tender_info[$code]['posTtl'] += $posAmt; + $perCashierTotal += $posAmt; + } + + + $perCashierTotal = round($perCashierTotal,2); + $perCashierCountTotal = round($perCashierCountTotal,2); + $perCashierOSTotal = round($perCashierOSTotal,2); + + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + + $output .= ""; + } + if (FormLib::get_form_value('emp_no') !== ''){ + // single employee view. grand totals are redundant + echo $output; + return False; + } + /* add overall totals */ + $output .= ""; + + $overallTotal = 0.0; + $overallCountTotal = 0.0; + $overallOSTotal = 0.0; + foreach($tender_info as $code => $info){ + $caTotal = round($info['posTtl'],2); + $countCATotal = round($info['countTtl'],2); + $osCATotal = round($info['osTtl'],2); + $output .= ""; + $output .= ""; + $output .= ""; + $overallTotal += $caTotal; + $overallCountTotal += $countCATotal; + $overallOSTotal += $osCATotal; + } + + $overallTotal = round($overallTotal,2); + $overallCountTotal = round($overallCountTotal,2); + $overallOSTotal = round($overallOSTotal,2); + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + + $noteR = $dbc->exec_statement($noteP, array(-1, $date)); + $noteW = $dbc->fetch_array($noteR); + $note = $noteW[0]; + $output .= ""; + + $output .= "
        Name TotalCounted AmtOver/Short
        $row[0]Starting cashn/an/a
        n/a
         ".$info['name']."$posAmt 
        $os
         Cashier totals$perCashierTotal$perCashierCountTotal$perCashierOSTotal
         Notes"; + $output .= "
             
             
        Totals".$info['name']."$caTotal$countCATotal$osCATotal
        Grand totals $overallTotal$overallCountTotal$overallOSTotal
         Notes"; + $output .= "
        "; + + $model = new OverShortsLogModel($dbc); + $model->date($date); + $model->load(); + $output .= "This date last edited by: ".$model->username()."
        "; + $output .= ""; + $output .= "resolved() == 1) + $output .= "checked"; + $output .= " /> Resolved"; + $output .= "
        "; + + /* "send" output back */ + echo $output; + break; + } + } + + function save($date,$data){ + global $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + $bycashier = explode(',',$data); + + $model = new DailyCountsModel($dbc); + $model->date($date); + foreach ($bycashier as $c){ + $temp = explode(':',$c); + if (count($temp) != 2) continue; + $cashier = $temp[0]; + $tenders = explode(';',$temp[1]); + $model->emp_no($cashier); + echo $cashier."\n"; + foreach($tenders as $t){ + $temp = explode('|',$t); + $tender_type = $temp[0]; + $amt = rtrim($temp[1]); + echo $tender_type." ".$amt."\n"; + if ($amt != ''){ + $model->tender_type($tender_type); + $model->amt($amt); + $model->save(); + } + } + } + } + + function saveNotes($date,$notes){ + global $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + $noteIDs = explode('`',$notes); + $model = new DailyNotesModel($dbc); + $model->date($date); + foreach ($noteIDs as $n){ + $temp = explode('|',$n); + $emp = $temp[0]; + $note = str_replace("'","''",urldecode($temp[1])); + $model->emp_no($emp); + $model->note($note); + $model->save(); + } + } + + function javascript_content(){ + ob_start(); + ?> + +/* global variables */ +var loading = 0; // signal that loading should be shown +var lock = 0; // lock (for synchronization) +var formstext = ""; // reponse text stored globally + // makes pseudo-threading easier + +/* waits for the loading function to release the lock, + then sets the reponse text in place */ +function setFormsText(){ + if (!lock) + $('#forms').html(formstext); + else + setTimeout('setFormsText()',50) +} + +/* the 'main' function, essentially + this is called when a date is submitted + the datefield is cleared (so the calendar script will work again correctly) + the Loading display is initialized, loading flag set, and lock taken + the global response text is also cleared + both the loading animation and request are started */ + +function setdate(){ + var date = $('#date').val(); + $('#date').val(''); + $('#forms').innerHTML = "Loading"; + loading=1; + lock=1; + formstext = ''; + $.ajax({ + url: 'OverShortDayPage.php', + data: 'action=date&arg='+date, + success: function(data){ + formstext = data; + loading = 0; + setFormsText(); + } + }); + loadingBar(); +} + +/* the loading animation + appends periods to the Loading display + releases the lock when loading stops */ +function loadingBar(){ + if (loading){ + var text = $('#loading').html(); + if (text == "Loading.......") + text = "Loading"; + else + text = text+"."; + $('#loading').html(text); + setTimeout('loadingBar()',100); + } + else { + lock = 0; + } +} + +function calcOS(type,empID){ + var dlogAmt = $('#dlog'+type+empID).html(); + var countAmt = $('#count'+type+empID).val(); + + if (countAmt.indexOf('+') != -1){ + var temp = countAmt.split('+'); + var countAmt = 0; + for (var i = 0; i < temp.length; i++){ + countAmt += Number(temp[i]); + } + $('#count'+type+empID).val(Math.round(countAmt*100)/100); + } + + var extraAmt = 0; + if (type == 'CA'){ + extraAmt = $('#startingCash'+empID).val(); + + if (extraAmt.indexOf('+') != -1){ + var temp = extraAmt.split('+'); + var extraAmt = 0; + for (var i = 0; i < temp.length; i++){ + extraAmt += Number(temp[i]); + } + $('#startingCash'+empID).val(Math.round(extraAmt*100)/100); + } + } + + var diff = Math.round((countAmt - dlogAmt - extraAmt)*100)/100; + + $('#os'+type+empID).html(diff); + $('#os'+type+empID+'Hidden').val(diff); + + resum(type); + cashierResum(empID); +} + +function resum(type){ + var countSum = 0; + $('.countT'+type).each(function(){ + countSum += Number($(this).val()); + }); + + if (type == 'CA'){ + $('.startingCash').each(function(){ + countSum -= Number($(this).val()); + }); + } + + var osSum = 0; + $('.osT'+type).each(function(){ + osSum += Number($(this).val()); + }); + + var oldcount = Number($('#count'+type+'Total').html()); + var oldOS = Number($('#os'+type+'Total').html()); + var newcount = Math.round(countSum*100)/100; + var newOS = Math.round(osSum*100)/100; + + $('#count'+type+'Total').html(newcount); + $('#os'+type+'Total').html(newOS); + + var overallCount = Number($('#overallCountTotal').html()); + var overallOS = Number($('#overallOSTotal').html()); + + var newOverallCount = overallCount + (newcount - oldcount); + var newOverallOS = overallOS + (newOS - oldOS); + + $('#overallCountTotal').html(Math.round(newOverallCount*100)/100); + $('#overallOSTotal').html(Math.round(newOverallOS*100)/100); +} + +function cashierResum(empID){ + var countSum = 0; + countSum -= Number($('#startingCash'+empID).val()); + $('.countEmp'+empID).each(function(){ + countSum += Number($(this).val()); + }); + var osSum = 0; + $('.osEmp'+empID).each(function(){ + osSum += Number($(this).val()); + }); + $('#countTotal'+empID).html(Math.round(countSum*100)/100); + $('#osTotal'+empID).html(Math.round(osSum*100)/100); +} + +function save(){ + var outstr = ''; + var notes = ''; + var emp_nos = document.getElementsByName('cashier'); + $('.cashier').each(function(){ + var emp_no = $(this).val(); + outstr += emp_no+":"; + if ($('#startingCash'+emp_no).length != 0) + outstr += "SCA|"+$('#startingCash'+emp_no).val()+";"; + + $('.tcode'+emp_no).each(function(){ + var code = $(this).val(); + if ($('#count'+code+emp_no).length != 0) + outstr += code+"|"+$('#count'+code+emp_no).val()+";"; + }); + + var note = $('#note'+emp_no).val(); + + notes += emp_no + "|" + escape(note); + outstr += ","; + notes += "`"; + }); + var note = $('#totalsnote').val(); + notes += "-1|"+escape(note); + + var curDate = $('#currentdate').html(); + var user = $('#user').val(); + var resolved = 0; + if (document.getElementById('resolved').checked) + resolved = 1; + + $('#lastEditedBy').html(""+user+""); + + $.ajax({ + url: 'OverShortDayPage.php', + type: 'post', + data: 'action=save&curDate='+curDate+'&data='+outstr+'&user='+user+'&resolved='+resolved+'¬es='+notes, + success: function(data){ + if (data == "saved") + alert('Data saved successfully'); + else + alert(data); + } + }); +} + + +#forms { + +} + +#loading { + font-size: 125%; + text-align: center; +} + +a { + color: blue; +} + add_css_file($FANNIE_URL.'src/style.css'); + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + ob_start(); + ?> + + Overshorts + + +
        + Date: + + +
        + +
        + +
        + draw_page(); +} diff --git a/fannie/modules/plugins2.0/OverShortTools/OverShortDepositSlips.php b/fannie/modules/plugins2.0/OverShortTools/OverShortDepositSlips.php new file mode 100644 index 000000000..17d974408 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/OverShortDepositSlips.php @@ -0,0 +1,303 @@ +outputPDF(); + return False; + } + return True; + } + + function outputPDF(){ + global $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + $start = FormLib::get_form_value('startDate'); + $end = FormLib::get_form_value('endDate'); + + $fs = 12; + + $pdf = new FPDF("P","mm","A4"); + $pdf->SetFont('Arial','',$fs); + $pdf->SetMargins(5,5,5); + $pdf->SetAutoPageBreak(True,5); + $pdf->AddPage(); + + $dateClause = $start; + if ($start != $end) + $dateClause = $start." ".$end; + + /** + Print check amounts in vertical columns + Overly complicated. Bank requirements suck. + */ + $query = "select checks from dailyChecks where + date BETWEEN ? AND ? + order by + case when id >= 68 then id+1 + when id = 43 then 68 + else id end"; + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep, array($start, $end)); + $acc = array(); + $counts = array(); + $ckSum = 0; + $width = 30; + $i = 0; + $num = 1; + $breakon = 1; + while($row = $dbc->fetch_row($result)){ + $real = $num; + if (($num-1) % 6 == 0 && $num > 0 && $num != $breakon){ + $pdf->AddPage(); + $breakon = $num; + } + if ($num > 6){ + $real = ($num%6); + if ($real == 0) $real = 6; + } + $vals = explode(",",$row[0]); + + $extra = array(); + + $vcount = 0; + foreach($vals as $v){ + if (is_numeric($v)) $vcount++; + } + + if ($vcount + count($acc) <= 57){ + foreach($vals as $v){ + if (is_numeric($v)) array_push($acc,$v); + } + $i = $i+1; + } + else { + foreach($vals as $v){ + if (is_numeric($v)) array_push($extra,$v); + } + while ($i % 4 != 0) $i++; + } + if ($i % 4 == 0){ + $str1 = "WFC #$num\n"; + $sum = 0; + $str = ""; + for($j=0;$j<57;$j++){ + if ($j < count($acc)){ + $str .= sprintf("%.2f",$acc[$j]); + $sum += $acc[$j]; + } + $str .= "\n"; + } + $str2 = "TTL: ".sprintf("%.2f",$sum); + $str3 = "CT: ".count($acc); + array_push($counts,$sum); + $ckSum += $sum; + + $j = 1; + if ($real == 1) $j = 0; + $k = 6; + if ($real == 6) $k = 2; + $pdf->SetXY(($width-0)*$j + ($width+7)*($real-1-$j),10); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str1,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFontSize($fs-1); + $pdf->MultiCell($width+($j==0?-1:$k),4.35,$str,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFont('Arial','B',$fs-1); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str2,'R','L'); + $pdf->SetFont('Arial','',$fs-1); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str3,'R','L'); + + $acc = array(); + $num++; + } + if (count($extra) > 0){ + foreach($extra as $e) array_push($acc,$e); + $i = $i+1; + } + } + $str1 = "WFC #$num\n"; + $real = $num; + if ($num % 7 == 0 && $num > 0) $pdf->AddPage(); + if ($num > 6){ + $real = ($num%6); + if ($real == 0) $real = 6; + } + + if (count($acc) > 0){ + $sum = 0; + $str = ""; + for($j=0;$j<57;$j++){ + if ($j < count($acc)){ + $str .= sprintf("%.2f",$acc[$j]); + $sum += $acc[$j]; + } + $str .= "\n"; + } + $str2 = "TTL: ".sprintf("%.2f",$sum); + $str3 = "CT: ".count($acc); + array_push($counts,$sum); + $ckSum += $sum; + + $j = 1; + if ($real == 1) $j = 0; + $k = 6; + if ($real == 6) $k = 2; + $pdf->SetXY(($width-0)*$j + ($width+7)*($real-1-$j),10); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str1,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFontSize($fs-1); + $pdf->MultiCell($width+($j==0?-1:$k),4.35,$str,'R','L'); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->SetFont('Arial','B',$fs); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str2,'R','L'); + $pdf->SetFont('Arial','',$fs); + $pdf->SetX(($width-0)*$j+ ($width+7)*($real-1-$j)); + $pdf->MultiCell($width+($j==0?-1:$k),5,$str3,'R','L'); + } + + if ($num <= 6 || $num > 10) $pdf->AddPage(); + + /* shift last box over a bit */ + $width += 3; + + $pdf->SetXY(($width+2)*4 + 5,10); + $pdf->SetFillColor(0,0,0); + $pdf->SetTextColor(255,255,255); + $pdf->SetFontSize(12); + $str = "Whole Foods Community\nCO-OP Deposit Slip\n"; + $str .= trim(file_get_contents("acct"),"\r\n")."\n\n"; + $str .= "Date\t".date("m/d/y")."\n"; + $pdf->MultiCell(55,5,$str,0,'C',1); + + $pdf->SetTextColor(0,0,0); + $str = ""; + for($i=0;$i<10 || $i < count($counts); $i++){ + $str .= "Check # ".($i+1).":"; + if ($i < count($counts)) + $str .= "\t\t$counts[$i]"; + $str .= "\n"; + } + $pdf->SetX(($width+2)*4 + 5); + $pdf->MultiCell(55,7,$str,'LR','L'); + + $dbstack = array('buyAmount'=>array(), + 'depositAmount'=>array()); + $dbQ = "SELECT rowName,denomination,amt FROM dailyDeposit WHERE + dateStr = ? AND rowName IN ('buyAmount','depositAmount')"; + $dbP = $dbc->prepare_statement($dbQ); + $dbR = $dbc->exec_statement($dbP,array($dateClause)); + while($dbW = $dbc->fetch_row($dbR)){ + $dbstack[$dbW[0]][$dbW[1]] = $dbW[2]; + } + + $coin = 0; + if (isset($dbstack['depositAmount']['0.01'])) $coin += $dbstack['depositAmount']['0.01']; + if (isset($dbstack['depositAmount']['0.05'])) $coin += $dbstack['depositAmount']['0.05']; + if (isset($dbstack['depositAmount']['0.10'])) $coin += $dbstack['depositAmount']['0.10']; + if (isset($dbstack['depositAmount']['0.25'])) $coin += $dbstack['depositAmount']['0.25']; + $junk = 0; + if (isset($dbstack['depositAmount']['Junk'])) $junk += $dbstack['depositAmount']['Junk']; + $cash = 0; + if (isset($dbstack['depositAmount']['1.00'])) $cash += $dbstack['depositAmount']['1.00']; + if (isset($dbstack['depositAmount']['5.00'])) $cash += $dbstack['depositAmount']['5.00']; + if (isset($dbstack['depositAmount']['10.00'])) $cash += $dbstack['depositAmount']['10.00']; + if (isset($dbstack['depositAmount']['20.00'])) $cash += $dbstack['depositAmount']['20.00']; + if (isset($dbstack['depositAmount']['50.00'])) $cash += $dbstack['depositAmount']['50.00']; + if (isset($dbstack['depositAmount']['100.00'])) $cash += $dbstack['depositAmount']['100.00']; + + + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Checks','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$ckSum),'TBR',1); + //$pdf->Cell(40,7,"",'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Coin','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$coin),'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Cash','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$cash),'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Other','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$junk),'TBR',1); + $pdf->SetX(($width+2)*4 + 5); + $pdf->Cell(15,7,'Total','L',0,'L'); + $pdf->Cell(40,7,"\t$".sprintf('%.2f',$junk+$cash+$coin+$ckSum),'TBR',1); + + $pdf->SetTextColor(255,255,255); + $pdf->SetX(($width+2)*4+5); + $pdf->MultiCell(55,5,"Change Request",0,'C',1); + + $pdf->SetTextColor(0,0,0); + $denoms = array('0.01','0.05','0.10','0.25','1.00','5.00','10.00'); + $total = array_sum($dbstack['buyAmount']); + if (!empty($dbstack['buyAmount'])){ + if ($dbstack['buyAmount']['0.01'] > 50) + $total = $dbstack['buyAmount']['0.01']; + foreach($denoms as $d){ + $pdf->SetX(($width+2)*4+5); + $pdf->Cell(10,7,'$','L',0,'L'); + $pdf->Cell(10,7,"$d",0,0,'R'); + $pdf->Cell(35,7,$dbstack['buyAmount'][$d],'RB',1,'C'); + } + } + $pdf->SetX(($width+2)*4+5); + $pdf->Cell(20,7,"Total:",'LB',0,'R'); + $pdf->Cell(35,7,sprintf('%.2f',$total),'RB',1,'C'); + + $pdf->Output('deposit.pdf','I'); + } + + function body_content(){ + global $FANNIE_URL; + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + ob_start(); + ?> +
        + + + +
        Start
        End
        + +
        + draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/OverShortTools/OverShortIndexPage.php b/fannie/modules/plugins2.0/OverShortTools/OverShortIndexPage.php new file mode 100644 index 000000000..3101a3681 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/OverShortIndexPage.php @@ -0,0 +1,50 @@ + + + draw_page(); +} diff --git a/fannie/modules/plugins2.0/OverShortTools/OverShortSafecountPage.php b/fannie/modules/plugins2.0/OverShortTools/OverShortSafecountPage.php new file mode 100644 index 000000000..1265cf106 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/OverShortSafecountPage.php @@ -0,0 +1,529 @@ +ajaxRequest($action); + return False; + } + return True; + } + + function ajaxRequest($action){ + global $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + $d1 = FormLib::get_form_value('date1'); + $d2 = FormLib::get_form_value('date2'); + + $dateStr = $d1." ".$d2; + if ($d1 == $d2) $dateStr = $d1; + switch($action){ + case 'loader': + echo $this->displayUI($dateStr); + break; + case 'save': + echo $this->save($dateStr, + FormLib::get_form_value('changeOrder'), + FormLib::get_form_value('openSafeCount'), + FormLib::get_form_value('closeSafeCount'), + FormLib::get_form_value('buyAmount'), + FormLib::get_form_value('dropAmount'), + FormLib::get_form_value('depositAmount'), + FormLib::get_form_value('atmAmount') + ); + break; + } + } + + function save($dateStr,$changeOrder,$openSafeCount,$closeSafeCount,$buyAmount,$dropAmount,$depositAmount,$atmAmount){ + saveInputs($dateStr,'changeOrder',$changeOrder); + saveInputs($dateStr,'openSafeCount',$openSafeCount); + saveInputs($dateStr,'closeSafeCount',$closeSafeCount); + saveInputs($dateStr,'buyAmount',$buyAmount); + saveInputs($dateStr,'dropAmount',$dropAmount); + saveInputs($dateStr,'depositAmount',$depositAmount); + saveInputs($dateStr,'atm',$atmAmount); + + return 'Saved'; + } + + function saveInputs($dateStr,$row,$data){ + global $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + + $model = new DailyDepositModel($dbc); + $model->dateStr($dateStr); + $model->rowName($row); + + $temp = explode('|',$data); + foreach($temp as $t){ + $temp2 = explode(':',$t); + if (count($temp2) < 2) continue; + $denom = $temp2[0]; + $amt = $temp2[1]; + + if ($amt == '') continue; + + $model->denomination($denom); + $model->amt($amt); + $model->save(); + } + } + + function displayUI($dateStr){ + global $FANNIE_PLUGIN_SETTINGS; + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['OverShortDatabase']); + + $startDate = $dateStr; + $endDate = $dateStr; + if (strstr($dateStr," ")){ + $temp = explode(" ",$dateStr); + $startDate = $temp[0]; + $endDate = $temp[1]; + } + + $holding = array('changeOrder'=>array(), + 'openSafeCount'=>array(), + 'closeSafeCount'=>array(), + 'dropAmount'=>array(), + 'atm'=>array('fill'=>0,'reject'=>0) + ); + + $denoms = array('0.01','0.05','0.10','0.25','Junk','1.00','5.00','10.00','20.00','50.00','100.00','Checks'); + foreach($denoms as $d){ + foreach($holding as $k=>$v){ + $holding[$k]["$d"] = 0; + } + } + + $model = new DailyDepositModel($dbc); + $model->dateStr($dateStr); + foreach($model->find() as $obj){ + if ($obj->rowName() == 'buyAmount') + continue; + + $holding[$obj->rowName()][$obj->denomination()] = $obj->amt(); + } + + $actualTotal = 0; + $accountableTotal = 0; + $buyAmountTotal = 0; + + $ret = "

        $dateStr

        "; + $ret .= ""; + foreach ($denoms as $d) $ret .= ""; + $ret .= ""; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == 'Checks' || $d == "100.00" || $d == "50.00" || $d == "20.00" || $d == "Junk") + $ret .= ""; + else{ + $ret .= ""; + $sum += $holding['changeOrder'][$d]; + } + } + $ret .= ""; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == 'Checks') + $ret .= ""; + else{ + $ret .= ""; + $sum += $holding['openSafeCount'][$d]; + } + } + $ret .= ""; + + $dateClause = ' date = ?'; + $dateArgs = array($dateStr); + if (strstr($dateStr," ")){ + $dates = explode(" ",$dateStr); + $dateClause = ' date BETWEEN ? AND ?'; + $dateArgs = array($dates[0],$dates[1]); + } + $countQ = "SELECT tender_type,sum(amt) from dailyCounts where tender_type in ('CA','CK','SCA') and $dateClause GROUP BY tender_type"; + $countP = $dbc->prepare_statement($countQ); + $countR = $dbc->exec_statement($countP, $dateArgs); + $osCounts = array('CA'=>0,'CK'=>0,'SCA'=>0); + while($countW = $dbc->fetch_row($countR)) + $osCounts[$countW[0]] = $countW[1]; + + $bags = round($osCounts['SCA'] / 168.00); + //$osCounts['CA'] -= 168*$bags; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == "Checks"){ + $ret .= ""; + } + else { + $val = $holding['changeOrder'][$d] + $holding['openSafeCount'][$d]; + $ret .= ""; + $sum += $val; + } + } + $ret .= ""; + $accountableTotal += $sum; + + $ret .= ""; + foreach($denoms as $d){ + if ($d == "1.00"){ + $ret .= ""; + } + else if ($d == "Checks"){ + $ret .= ""; + } + else { + $ret .= ""; + } + } + $val = ($osCounts['CA'] + $osCounts['CK']); + $ret .= ""; + $buyAmountTotal -= $val; + $accountableTotal += $val; + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $accountableTotal += ($holding['atm']['reject'] - $holding['atm']['fill']); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + $accountableTotal -= (168*$bags); + + $fills = array('0.01'=>1,'0.05'=>2,'0.10'=>5,'0.25'=>10,'1.00'=>50,'5.00'=>50,'10.00'=>50); + $pars = array("0.01"=>40,"0.05"=>60,"0.10"=>200,"0.25"=>700,"1.00"=>1700,"5.00"=>500,"10.00"=>800); + + $ret .= ""; + $sum = 0; + $depositAmount = array(); + foreach($denoms as $d){ + if ($d == 'Checks'){ + $ret .= ""; + $sum += $osCounts['CK']; + $depositAmount['Checks'] = $osCounts['CK']; + } + else if ($d == '100.00' || $d == '50.00' || $d == 'Junk'){ + $ret .= ""; + $sum += ($holding['openSafeCount'][$d] + $holding['dropAmount'][$d]); + $depositAmount[$d] = $holding['openSafeCount'][$d]+$holding['dropAmount'][$d]; + } + else if ($d == '20.00'){ + $atmTtl = $holding['openSafeCount'][$d] + $holding['dropAmount'][$d] + - $holding['atm']['fill'] + $holding['atm']['reject']; + $ret .= ""; + $sum += $atmTtl; + $depositAmount[$d] = $atmTtl; + } + else if ($d == '10.00'){ + $val = $holding['changeOrder'][$d] + $holding['openSafeCount'][$d] + $holding['dropAmount'][$d] - $pars['10.00'] - (50*$bags); + $val = round($val,2); + if ($val < 0) $val = 0; + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '5.00'){ + $val = $holding['changeOrder'][$d] + $holding['openSafeCount'][$d] + $holding['dropAmount'][$d] - $pars['5.00'] - (50*$bags); + $val = round($val,2); + if ($val < 0) $val = 0; + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '1.00'){ + $ret .= ""; + $val = round($val,2); + $depositAmount[$d] = 0; + } + else if ($d == '0.25'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/10)) * 10 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '0.10'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/5)) * 5 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '0.05'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/2)) * 2 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + else if ($d == '0.01'){ + $val = $holding['dropAmount'][$d] - ( ((int)($holding['dropAmount'][$d]/0.50)) * 0.50 ); + $val = round($val,2); + $ret .= ""; + $sum += $val; + $depositAmount[$d] = $val; + } + } + $ret .= ""; + $buyAmountTotal += $sum; + $accountableTotal -= $sum; + + $ret .= ""; + $sum = 0; + foreach($denoms as $d){ + if ($d == 'Checks' || $d == "Junk") + $ret .= ""; + else{ + $ret .= ""; + $sum += $holding['closeSafeCount'][$d]; + } + } + $ret .= ""; + $actualTotal += $sum; + + $parTTL = 0; foreach($pars as $k=>$v) $parTTL += $v; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= sprintf("",$parTTL); + + $buyAmounts = array("0.01"=>0,"0.05"=>0,"0.10"=>0,"0.25"=>0,"1.00"=>0,"5.00"=>0,"10.00"=>0); + foreach ($buyAmounts as $k=>$v){ + $val = $pars[$k]; + $val -= $holding['changeOrder'][$k]; + $val -= $holding['openSafeCount'][$k]; + $val -= $holding['dropAmount'][$k]; + $val += $depositAmount[$k]; + $val += ($fills[$k]*$bags); + if ($val < 0) $val = 0; + $buyAmounts[$k] = $val; + } + $overage = 0; + while($buyAmounts['1.00'] % 50 != 0){ + $buyAmounts['1.00'] -= 1; + $overage += 1; + } + while($buyAmounts['5.00'] % 5 == 0 && $buyAmounts['5.00'] % 50 != 0){ + $buyAmounts['5.00'] -= 5; + $overage += 5; + } + while($buyAmounts['10.00'] % 10 == 0 && $buyAmounts['10.00'] % 50 != 0){ + $buyAmounts['10.00'] -= 10; + $overage += 10; + } + + $overs = $this->denom_overage($overage); + $buyAmounts['0.25'] += $overs['0.25']; + $buyAmounts['0.10'] += $overs['0.10']; + $buyAmounts['0.05'] += $overs['0.05']; + $buyAmounts['0.01'] += $overs['0.01']; + + $ret .= ""; + foreach ($denoms as $d){ + if (isset($buyAmounts[$d])) + $ret .= ""; + else + $ret .= ""; + } + $ret .= ""; + + $dlog = select_dlog($startDate,$endDate); + $posTotalQ = "SELECT -1*sum(d.total) FROM $dlog as d WHERE ".str_replace(" date "," d.tdate ",$dateClause)." AND d.trans_subtype IN ('CA','CK')"; + $posTotalP = $dbc->prepare_statement($posTotalQ); + $posTotalR = $dbc->exec_statement($posTotalP, $dateArgs); + $posTotal = array_pop($dbc->fetch_row($posTotalR)); + + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + + + $dailies = array(); + $countQ = "SELECT date, + SUM(CASE WHEN tender_type IN ('CA','CK') THEN amt + WHEN tender_type = 'SCA' THEN -amt + ELSE 0 end) AS total + FROM dailyCounts WHERE date BETWEEN ? AND ? + GROUP BY date"; + $countP = $dbc->prepare_statement($countQ); + $countR = $dbc->exec_statement($countP, array($startDate,$endDate)); + while($row = $dbc->fetch_row($countR)){ + $d = $row['date']; + if (!isset($dailies[$d])) $dailies[$d] = array(0,0); + $dailies[$d][0] = $row['total']; + } + $posQ = "SELECT YEAR(tdate),MONTH(tdate),DAY(tdate), + SUM(case when trans_subtype in ('CA','CK') then -total ELSE 0 END) as total + FROM $dlog AS d WHERE tdate BETWEEN ? AND ? + GROUP BY YEAR(tdate),MONTH(tdate),DAY(tdate)"; + $posP = $dbc->prepare_statement($posQ); + $posR = $dbc->exec_statement($posP, array($startDate.' 00:00:00',$endDate.' 23:59:59')); + while($row = $dbc->fetch_row($posR)){ + $d = $row[0]."-".str_pad($row[1],2,'0',STR_PAD_LEFT)."-".str_pad($row[2],2,'0',STR_PAD_LEFT); + if (!isset($dailies[$d])) $dailies[$d] = array(0,0); + $dailies[$d][1] = $row[3]; + } + $num = 0; + foreach($dailies as $k=>$v){ + if ($num % 2 == 0){ + if ($num != 0) $ret .= ""; + if ($num % 4 == 0) $ret .= ""; + else $ret .= ""; + } + $ret .= sprintf(" + ",$k,$v[0],$v[1],($v[0]-$v[1])); + $num++; + } + if ($num % 2 != 0) + $ret .= ""; + $ret .= ""; + + $ret .= "
         $dTotal
        Change Order $sum
        Open Safe Count $sum
        Total change fund $val$sum
        Drop Amount".$holding['dropAmount'][$d]."".$osCounts['CK']."".round($val,2)."
        ATM Fill: Reject: 
        Fill Amount".(1*$bags)."".(2*$bags)."".(5*$bags)."".(10*$bags)." ".(50*$bags)."".(50*$bags)."".(50*$bags)." ".(168*$bags)."
        Deposit Amount".$osCounts['CK']."".($holding['openSafeCount'][$d] + $holding['dropAmount'][$d])."".$atmTtl."".$val."".$val."0".$val."".$val."".$val."".$val."$sum
        Close Safe Count $sum
        Par Amounts".$pars['0.01']."".$pars['0.05']."".$pars['0.10']."".$pars['0.25']." ".$pars['1.00']."".$pars['5.00']."".$pars['10.00']." %.2f
        Buy Amount".$buyAmounts[$d]." ".array_sum($buyAmounts)."
        Over/ShortsCount total".round(($osCounts['CA']+$osCounts['CK'] - $osCounts['SCA'] ),2)."POS total".$posTotal."Variance".round(($osCounts['CA']+$osCounts['CK']) - $osCounts['SCA'] -$posTotal,2)."Actual$actualTotalAccountable".round($accountableTotal,2)."Variance".round($actualTotal - $accountableTotal,2)." 
        %sCount%.2fPOS%.2fVariance + %.2f 
        "; + $ret .= ""; + $ret .= ""; + foreach($denoms as $d){ + $ret .= ""; + } + $ret .= ""; + + return $ret; + } + + function denom_overage($overage){ + $ret = array("0.25"=>0,"0.10"=>0,"0.05"=>0,"0.01"=>0); + + $ret["0.25"] = floor($overage / 10.0)*10; + $overage = $overage % 10; + $ret["0.10"] = floor($overage / 5.0)*5; + $overage = $overage % 5; + $ret["0.05"] = floor($overage / 2.0)*2; + $overage = $overage % 2; + $ret["0.01"] = floor($overage / 0.50)*0.50; + + return $ret; + } + + function css_content(){ + return ' + tr.color { + background: #ffffcc; + } + '; + } + + function body_content(){ + global $FANNIE_URL; + $this->add_script('js/count.js'); + $this->add_script($FANNIE_URL.'src/CalendarControl.js'); + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + $this->add_css_file($FANNIE_URL.'src/style.css'); + ob_start(); + ?> + + + Count + + + +
        + + + + + + + + +
        Start Date + +
        End Date
        +
        + +
        + +
        + draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/OverShortTools/OverShortTools.php b/fannie/modules/plugins2.0/OverShortTools/OverShortTools.php new file mode 100644 index 000000000..e45918c92 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/OverShortTools.php @@ -0,0 +1,75 @@ + array('default'=>'core_overshort','label'=>'Database', + 'description'=>'Database to store tender counts and related info') + ); + + public $plugin_description = 'Plugin for comparing counted cashier tender totals + to POS totals'; + + + public function setting_change(){ + global $FANNIE_ROOT, $FANNIE_PLUGIN_SETTINGS; + + $db_name = $FANNIE_PLUGIN_SETTINGS['OverShortDatabase']; + if (empty($db_name)) return; + + $dbc = FannieDB::get($db_name); + + $tables = array( + 'SumDeptSalesByDay', + 'SumDiscountsByDay', + 'SumMemSalesByDay', + 'SumMemTypeSalesByDay', + 'SumRingSalesByDay', + 'SumTendersByDay', + 'SumUpcSalesByDay', + 'TransactionSummary' + ); + + foreach($tables as $t){ + $model_class = $t.'Model'; + if (!class_exists($model_class)) + include_once(dirname(__FILE__).'/models/'.$model_class.'.php'); + $instance = new $model_class($dbc); + $instance->create(); + } + } +} + +?> diff --git a/fannie/modules/plugins2.0/OverShortTools/index.php b/fannie/modules/plugins2.0/OverShortTools/index.php new file mode 100644 index 000000000..407ced4fc --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/modules/plugins2.0/OverShortTools/js/cashier.js b/fannie/modules/plugins2.0/OverShortTools/js/cashier.js new file mode 100644 index 000000000..ad72c4324 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/js/cashier.js @@ -0,0 +1,110 @@ +function loadCashier(){ + var data = 'action=loadCashier'; + data += '&empno='+$('#empno').val(); + data += '&date='+$('#date').val(); + + $.ajax({ + url: 'OverShortCashierPage.php', + data: data, + success: function(data){ + $('#display').html(data); + $('#countSCA').focus(); + } + }); + + $('#date').val(''); + $('#empno').val(''); +} + +function resumSheet(){ + var countTotal = 0; + var osTotal = 0; + var posTotal = 0; + + $('.tenderCode').each(function(){ + var c = 0; + var code = $(this).val(); + if (code != 'CK') + c = Number($('#count'+code).val()); + else + c = Number($('#countCK').html()); + + var p = Number($('#pos'+code).html()); + + var os = Math.round( (c - p)*100 ) / 100; + if (code == 'CA'){ + var sca = Number($('#countSCA').val()); + posTotal += sca; + os = Math.round( (c - p - sca)*100 ) / 100; + } + + osTotal += os; + countTotal += c; + posTotal += p; + + $('#os'+code).html(os); + }); + + $('#posT').html(Math.round(posTotal*100)/100); + $('#countT').html(Math.round(countTotal*100)/100); + $('#osT').html(Math.round(osTotal*100)/100); +} + +function resumChecks(){ + var checks = $('#checklisting').val(); + var tmp = checks.split("\n"); + var sum = 0; + for (var i = 0; i < tmp.length; i++){ + sum += Number(tmp[i]); + } + + $('#countCK').html(Math.round(sum*100)/100); + resumSheet(); +} + +function save(){ + var tenders = saveTenders(); + var checks = saveChecks(); + var notes = escape($('#notes').val()); + var empno = $('#current_empno').val(); + var tdate = $('#current_date').val(); + + var args = 'action=save&empno='+empno+'&date='+tdate+'&tenders='+tenders+'&checks='+checks+'¬es='+notes; + $.ajax({ + url: 'OverShortCashierPage.php', + type: 'post', + data: args, + success(data){ + alert(data); + } + }); +} + +function saveTenders(){ + var ret = ''; + var sca = $('#countSCA').val(); + ret += "SCA:"+sca; + $('.tenderCode').each(function(){ + var code = $(this).val(); + ret += "|"+code+":"; + if (code != 'CK') + ret += $('#count'+code).val(); + else + ret += $('#count'+code).html(); + }); + + return ret; +} + +function saveChecks(){ + var ret = ''; + var checks = $('#checklisting').val(); + var tmp = checks.split("\n") + + for (var i=0; i array('type'=>'VARCHAR(10)'), + 'emp_no' => array('type'=>'SMALLINT'), + 'checks' => array('type'=>'TEXT'), + 'id' => array('type'=>'INT','primary_key'=>True,'increment'=>True) + ); + + protected $unique = array('date','emp_no'); + + /* START ACCESSOR FUNCTIONS */ + + public function date(){ + if(func_num_args() == 0){ + if(isset($this->instance["date"])) + return $this->instance["date"]; + elseif(isset($this->columns["date"]["default"])) + return $this->columns["date"]["default"]; + else return null; + } + else{ + $this->instance["date"] = func_get_arg(0); + } + } + + public function emp_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["emp_no"])) + return $this->instance["emp_no"]; + elseif(isset($this->columns["emp_no"]["default"])) + return $this->columns["emp_no"]["default"]; + else return null; + } + else{ + $this->instance["emp_no"] = func_get_arg(0); + } + } + + public function checks(){ + if(func_num_args() == 0){ + if(isset($this->instance["checks"])) + return $this->instance["checks"]; + elseif(isset($this->columns["checks"]["default"])) + return $this->columns["checks"]["default"]; + else return null; + } + else{ + $this->instance["checks"] = func_get_arg(0); + } + } + + public function id(){ + if(func_num_args() == 0){ + if(isset($this->instance["id"])) + return $this->instance["id"]; + elseif(isset($this->columns["id"]["default"])) + return $this->columns["id"]["default"]; + else return null; + } + else{ + $this->instance["id"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/OverShortTools/models/DailyCountsModel.php b/fannie/modules/plugins2.0/OverShortTools/models/DailyCountsModel.php new file mode 100644 index 000000000..1eaeb236a --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/models/DailyCountsModel.php @@ -0,0 +1,89 @@ + array('type'=>'VARCHAR(10)','primary_key'=>True), + 'emp_no' => array('type'=>'SMALLINT','primary_key'=>True), + 'tender_type' => array('type'=>'VARCHAR(10)','primary_key'=>True), + 'amt' => array('type'=>'MONEY','default'=>0) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function date(){ + if(func_num_args() == 0){ + if(isset($this->instance["date"])) + return $this->instance["date"]; + elseif(isset($this->columns["date"]["default"])) + return $this->columns["date"]["default"]; + else return null; + } + else{ + $this->instance["date"] = func_get_arg(0); + } + } + + public function emp_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["emp_no"])) + return $this->instance["emp_no"]; + elseif(isset($this->columns["emp_no"]["default"])) + return $this->columns["emp_no"]["default"]; + else return null; + } + else{ + $this->instance["emp_no"] = func_get_arg(0); + } + } + + public function tender_type(){ + if(func_num_args() == 0){ + if(isset($this->instance["tender_type"])) + return $this->instance["tender_type"]; + elseif(isset($this->columns["tender_type"]["default"])) + return $this->columns["tender_type"]["default"]; + else return null; + } + else{ + $this->instance["tender_type"] = func_get_arg(0); + } + } + + public function amt(){ + if(func_num_args() == 0){ + if(isset($this->instance["amt"])) + return $this->instance["amt"]; + elseif(isset($this->columns["amt"]["default"])) + return $this->columns["amt"]["default"]; + else return null; + } + else{ + $this->instance["amt"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/OverShortTools/models/DailyDepositModel.php b/fannie/modules/plugins2.0/OverShortTools/models/DailyDepositModel.php new file mode 100644 index 000000000..ddcd008fb --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/models/DailyDepositModel.php @@ -0,0 +1,89 @@ + array('type'=>'VARCHAR(21)','primary_key'=>True), + 'rowName' => array('type'=>'VARCHAR(15)','primary_key'=>True), + 'denomination' => array('type'=>'VARCHAR(6)','primary_key'=>True), + 'amt' => array('type'=>'MONEY','default'=>0) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function dateStr(){ + if(func_num_args() == 0){ + if(isset($this->instance["dateStr"])) + return $this->instance["dateStr"]; + elseif(isset($this->columns["dateStr"]["default"])) + return $this->columns["dateStr"]["default"]; + else return null; + } + else{ + $this->instance["dateStr"] = func_get_arg(0); + } + } + + public function rowName(){ + if(func_num_args() == 0){ + if(isset($this->instance["rowName"])) + return $this->instance["rowName"]; + elseif(isset($this->columns["rowName"]["default"])) + return $this->columns["rowName"]["default"]; + else return null; + } + else{ + $this->instance["rowName"] = func_get_arg(0); + } + } + + public function denomination(){ + if(func_num_args() == 0){ + if(isset($this->instance["denomination"])) + return $this->instance["denomination"]; + elseif(isset($this->columns["denomination"]["default"])) + return $this->columns["denomination"]["default"]; + else return null; + } + else{ + $this->instance["denomination"] = func_get_arg(0); + } + } + + public function amt(){ + if(func_num_args() == 0){ + if(isset($this->instance["amt"])) + return $this->instance["amt"]; + elseif(isset($this->columns["amt"]["default"])) + return $this->columns["amt"]["default"]; + else return null; + } + else{ + $this->instance["amt"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/OverShortTools/models/DailyNotesModel.php b/fannie/modules/plugins2.0/OverShortTools/models/DailyNotesModel.php new file mode 100644 index 000000000..c6e3b5636 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/models/DailyNotesModel.php @@ -0,0 +1,75 @@ + array('type'=>'VARCHAR(10)','primary_key'=>True), + 'emp_no' => array('type'=>'SMALLINT','primary_key'=>True), + 'note' => array('type'=>'TEXT') + ); + + /* START ACCESSOR FUNCTIONS */ + + public function date(){ + if(func_num_args() == 0){ + if(isset($this->instance["date"])) + return $this->instance["date"]; + elseif(isset($this->columns["date"]["default"])) + return $this->columns["date"]["default"]; + else return null; + } + else{ + $this->instance["date"] = func_get_arg(0); + } + } + + public function emp_no(){ + if(func_num_args() == 0){ + if(isset($this->instance["emp_no"])) + return $this->instance["emp_no"]; + elseif(isset($this->columns["emp_no"]["default"])) + return $this->columns["emp_no"]["default"]; + else return null; + } + else{ + $this->instance["emp_no"] = func_get_arg(0); + } + } + + public function note(){ + if(func_num_args() == 0){ + if(isset($this->instance["note"])) + return $this->instance["note"]; + elseif(isset($this->columns["note"]["default"])) + return $this->columns["note"]["default"]; + else return null; + } + else{ + $this->instance["note"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/OverShortTools/models/OverShortsLogModel.php b/fannie/modules/plugins2.0/OverShortTools/models/OverShortsLogModel.php new file mode 100644 index 000000000..0149405e1 --- /dev/null +++ b/fannie/modules/plugins2.0/OverShortTools/models/OverShortsLogModel.php @@ -0,0 +1,75 @@ + array('type'=>'VARCHAR(10)','primary_key'=>True), + 'username' => array('type'=>'VARCHAR(25)'), + 'resolved' => array('type'=>'TINYINT','default'=>0) + ); + + /* START ACCESSOR FUNCTIONS */ + + public function date(){ + if(func_num_args() == 0){ + if(isset($this->instance["date"])) + return $this->instance["date"]; + elseif(isset($this->columns["date"]["default"])) + return $this->columns["date"]["default"]; + else return null; + } + else{ + $this->instance["date"] = func_get_arg(0); + } + } + + public function username(){ + if(func_num_args() == 0){ + if(isset($this->instance["username"])) + return $this->instance["username"]; + elseif(isset($this->columns["username"]["default"])) + return $this->columns["username"]["default"]; + else return null; + } + else{ + $this->instance["username"] = func_get_arg(0); + } + } + + public function resolved(){ + if(func_num_args() == 0){ + if(isset($this->instance["resolved"])) + return $this->instance["resolved"]; + elseif(isset($this->columns["resolved"]["default"])) + return $this->columns["resolved"]["default"]; + else return null; + } + else{ + $this->instance["resolved"] = func_get_arg(0); + } + } + /* END ACCESSOR FUNCTIONS */ +} diff --git a/fannie/modules/plugins2.0/PIKiller/PIArPage.php b/fannie/modules/plugins2.0/PIKiller/PIArPage.php new file mode 100644 index 000000000..603b45750 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PIArPage.php @@ -0,0 +1,81 @@ +card_no = $this->id; + + $this->title = 'AR History : Member '.$this->card_no; + + $this->__models['ar'] = $this->get_model(FannieDB::get($FANNIE_TRANS_DB), 'ArHistoryModel', + array('card_no'=>$this->id),'tdate'); + $this->__models['ar'] = array_reverse($this->__models['ar']); + + return True; + } + + protected function get_id_view(){ + global $FANNIE_URL; + echo ''; + echo ''; + foreach($this->__models['ar'] as $transaction){ + $stamp = strtotime($transaction->tdate()); + if ($transaction->Payments() != 0){ + printf(' + + + + + ', + $FANNIE_URL, date('Y-m-d',$stamp), $transaction->trans_num(), date('Y-m-d',$stamp), + $transaction->Payments(), + $transaction->card_no() + ); + } + if ($transaction->Charges() != 0){ + printf(' + + + + + ', + $FANNIE_URL, date('Y-m-d',$stamp), $transaction->trans_num(), date('Y-m-d',$stamp), + $transaction->Charges(), + $transaction->card_no() + ); + } + } + echo '
        %s%.2f%dP
        %s%.2f%dC
        '; + return ob_get_clean(); + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PIDocumentsPage.php b/fannie/modules/plugins2.0/PIKiller/PIDocumentsPage.php new file mode 100644 index 000000000..abfe84012 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PIDocumentsPage.php @@ -0,0 +1,55 @@ +card_no = $this->id; + + $this->title = 'Documents : Member '.$this->card_no; + + return True; + } + + protected function get_id_view(){ + ob_start(); + echo ''; + + echo ''; + + echo ''; + return ob_get_clean(); + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PIEquityPage.php b/fannie/modules/plugins2.0/PIKiller/PIEquityPage.php new file mode 100644 index 000000000..a7c4c2b03 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PIEquityPage.php @@ -0,0 +1,66 @@ +card_no = $this->id; + + $this->title = 'Equity History : Member '.$this->card_no; + + $this->__models['equity'] = $this->get_model(FannieDB::get($FANNIE_TRANS_DB), 'StockpurchasesModel', + array('card_no'=>$this->id),'tdate'); + $this->__models['equity'] = array_reverse($this->__models['equity']); + + return True; + } + + protected function get_id_view(){ + global $FANNIE_URL; + echo ''; + echo ''; + foreach($this->__models['equity'] as $transaction){ + $stamp = strtotime($transaction->tdate()); + printf(' + + + + ', + $FANNIE_URL, date('Y-m-d',$stamp), $transaction->trans_num(), date('Y-m-d',$stamp), + $transaction->stockPurchase(), + $transaction->card_no() + ); + } + echo '
        %s%.2f%d
        '; + return ob_get_clean(); + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PIKiller.php b/fannie/modules/plugins2.0/PIKiller/PIKiller.php new file mode 100644 index 000000000..f8c900e74 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PIKiller.php @@ -0,0 +1,32 @@ +auth_mode = 'Full'; + elseif (FannieAuth::validateUserQuiet('editmembers_csc')) + $this->auth_mode = 'Limited'; + + if ($this->auth_mode == 'None'){ + if (isset($_REQUEST['edit'])) unset($_REQUEST['edit']); + if (isset($_POST['edit'])) unset($_POST['edit']); + if (isset($_GET['edit'])) unset($_GET['edit']); + } + + $this->__routes[] = 'get'; + + return parent::preprocess(); + } + + protected function get_id_login_handler(){ + global $FANNIE_URL; + $auth = $FANNIE_URL.'auth/ui/loginform.php'; + $redir = $FANNIE_URL.'modules/plugins2.0/PIKiller/PIMemberPage.php?id='.$this->id; + header("Location: $auth?redirect=$redir"); + + return False; + } + + protected function get_id_handler(){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $this->card_no = $this->id; + + $this->title = 'Member '.$this->card_no; + + $dbc = FannieDB::get($FANNIE_OP_DB); + + $this->__models['custdata'] = $this->get_model($dbc, 'CustdataModel', + array('CardNo'=>$this->card_no), 'personNum'); + + $this->__models['meminfo'] = $this->get_model($dbc, 'MeminfoModel', + array('card_no'=>$this->card_no)); + + $this->__models['memDates'] = $this->get_model($dbc, 'MemDatesModel', + array('card_no'=>$this->card_no)); + + $this->__models['memberCards'] = $this->get_model($dbc, 'MemberCardsModel', + array('card_no'=>$this->card_no)); + + $susp = $this->get_model($dbc,'SuspensionsModel',array('cardno'=>$this->card_no)); + if ($susp->load()) $this->__models['suspended'] = $susp; + + $noteP = $dbc->prepare_statement('SELECT note FROM memberNotes WHERE cardno=? ORDER BY stamp DESC'); + $noteR = $dbc->exec_statement($noteP, array($this->card_no)); + $this->__models['note'] = ''; + if ($dbc->num_rows($noteR) > 0){ + $tmp = $dbc->fetch_row($noteR); + $this->__models['note'] = $tmp['note']; + } + + $dbc = FannieDB::get($FANNIE_TRANS_DB); + + $this->__models['equity'] = $this->get_model($dbc, 'EquityLiveBalanceModel', + array('memnum'=>$this->card_no)); + + $this->__models['ar'] = $this->get_model($dbc, 'ArLiveBalanceModel', + array('card_no'=>$this->card_no)); + + return True; + } + + protected function post_id_handler(){ + global $FANNIE_OP_DB, $FANNIE_TRANS_DB; + $this->card_no = $this->id; + if ($this->auth_mode == 'None') + return $this->unknown_request_handler(); + + $dbc = FannieDB::get($FANNIE_OP_DB); + + if ($this->auth_mode == 'Full'){ + $dates = $this->get_model($dbc, 'MemDatesModel', array('card_no'=>$this->card_no)); + $dates->start_date(FormLib::get_form_value('start_date')); + $dates->end_date(FormLib::get_form_value('end_date')); + $dates->save(); + } + + $upc = FormLib::get_form_value('upc'); + if ($upc != ''){ + $card = $this->get_model($dbc, 'MemberCardsModel', array('card_no'=>$this->card_no)); + $card->upc(str_pad($upc,13,'0',STR_PAD_LEFT)); + $card->save(); + $card->push_to_lanes(); + } + + $meminfo = new MeminfoModel($dbc); + $meminfo->card_no($this->card_no); + $meminfo->city(FormLib::get_form_value('city')); + $meminfo->state(FormLib::get_form_value('state')); + $meminfo->zip(FormLib::get_form_value('zip')); + $meminfo->phone(FormLib::get_form_value('phone')); + $meminfo->email_1(FormLib::get_form_value('email')); + $meminfo->email_2(FormLib::get_form_value('phone2')); + $meminfo->ads_OK(FormLib::get_form_value('mailflag')); + $street = FormLib::get_form_value('address1'); + if (FormLib::get_form_value('address2') !== '') + $street .= "\n".FormLib::get_form_value('address2'); + $meminfo->street($street); + $meminfo->save(); + + $custdata = new CustdataModel($dbc); + $custdata->CardNo($this->card_no); + $custdata->personNum(1); + $custdata->load(); + + $custdata->FirstName(FormLib::get_form_value('FirstName')); + $custdata->LastName(FormLib::get_form_value('LastName')); + $custdata->blueLine($this->card_no.' '.$custdata->LastName()); + + if ($this->auth_mode == 'Full'){ + $custdata->memType(FormLib::get_form_value('memType')); + $custdata->memDiscountLimit(FormLib::get_form_value('chargelimit')); + + $default = $this->get_model($dbc, 'MemdefaultsModel', array('memtype'=>$custdata->memType())); + $custdata->Type($default->cd_type()); + $custdata->Discount($default->discount()); + $custdata->staff($default->staff()); + $custdata->SSI($default->SSI()); + } + + $custdata->save(); + $custdata->push_to_lanes(); + + $personNum=2; + $names = array('first'=>FormLib::get_form_value('fn'), + 'last'=>FormLib::get_form_value('ln')); + $fn = FormLib::get_form_value('fn'); + $ln = FormLib::get_form_value('ln'); + for($i=0;$i isset($fn[$i]) ? $fn[$i] : '', + 'last' => isset($ln[$i]) ? $ln[$i] : '' + ); + if ($set['first']=='' && $set['last']=='') + continue; // deleted named + $custdata->personNum($personNum); + $custdata->FirstName($set['first']); + $custdata->LastName($set['last']); + $custdata->blueLine($this->card_no.' '.$custdata->LastName()); + $custdata->save(); + $custdata->push_to_lanes(); + $personNum++; + } + + // if submission has fewer names than + // original form, delete the extras + for($i=$personNum; $i<=4; $i++){ + $custdata->personNum($i); + $custdata->delete_from_lanes(); + $custdata->delete(); + } + + $note = FormLib::get_form_value('notetext'); + $hash = FormLib::get_form_value('_notetext'); + if (base64_decode($hash) != $note){ + $noteP = $dbc->prepare_statement('INSERT INTO memberNotes + (cardno, note, stamp, username) VALUES + (?, ?, '.$dbc->now().', ?)'); + $noteR = $dbc->exec_statement($noteP,array($this->card_no, + str_replace("\n",'
        ',$note), + $this->current_user)); + } + + header('Location: PIMemberPage.php?id='.$this->card_no); + return False; + } + + protected function get_id_view(){ + global $FANNIE_OP_DB, $FANNIE_URL; + $dbc = FannieDB::get($FANNIE_OP_DB); + $limitedEdit = $this->auth_mode == 'Full' ? False : True; + ob_start(); + echo '
        '; + else + echo 'method="post">'; + echo ''; + echo ""; + echo ""; + echo ""; + echo ""; + + $status = $this->__models['custdata'][0]->Type(); + if($status == 'PC') $status='ACTIVE'; + elseif($status == 'REG') $status='NONMEM'; + elseif($status == 'INACT2') $status='TERM (PENDING)'; + + if (isset($this->__models['suspended'])){ + echo ""; + echo "'; + } + else { + echo ""; + } + echo "'; + echo ""; + echo ""; + + echo ""; + echo ""; + echo ''; + echo ""; + echo ''; + echo ''; + + echo ""; + $address = explode("\n",$this->__models['meminfo']->street(),2); + echo ""; + echo ''; + echo ""; + echo ''; + echo ""; + + echo ""; + echo ""; + echo ''; + echo ""; + echo ''; + echo ""; + + echo ""; + echo ""; + echo ''; + echo ""; + echo ''; + echo ""; + echo ''; + echo ""; + + echo ""; + echo ""; + echo ''; + echo ""; + $start = $this->__models['memDates']->start_date(); + if (strstr($start,' ') !== False) list($start,$junk) = explode(' ',$start,2); + if ($start == '1900-01-01' || $start == '0000-00-00') $start = ''; + echo ''; + echo ""; + $end = $this->__models['memDates']->end_date(); + if (strstr($end,' ') !== False) list($end,$junk) = explode(' ',$end,2); + if ($end == '1900-01-01' || $end == '0000-00-00') $end = ''; + echo ''; + echo ""; + + echo ""; + echo ""; + echo ''; + echo ""; + echo ''; + echo ""; + + echo ""; + echo ""; + echo "'; + echo ""; + $labels = array(); + $opts = array(); + $memtypes = new MemtypeModel($dbc); + foreach($memtypes->find('memtype') as $mt){ + $labels[] = $mt->memDesc(); + $opts[] = $mt->memtype(); + } + echo ''; + echo ""; + echo ''; + echo ""; + + echo ""; + echo ""; + echo ''; + echo ""; + echo ''; + echo ""; + + echo ""; + + echo ""; + echo ''; + echo ''; + echo ''; + echo ""; + echo ""; + + echo ""; + echo ''; + echo ''; + echo ''; + echo ""; + echo ''; + + for($i=1;$i__models['custdata']);$i++){ + $cust = $this->__models['custdata'][$i]; + echo ''; + echo ''; + echo ''; + echo ''; + } + for ($i=count($this->__models['custdata'])-1;$i<3;$i++){ + echo ''; + echo ''; + echo ''; + echo ''; + + } + echo ''; + + echo ''; + echo ''; + + echo ''; + + echo "
        Owner Num".$this->card_no."$status"; + if ($this->__models['suspended']->reason() != '') + echo $this->__models['suspended']->reason(); + else { + $reasons = new ReasoncodesModel($dbc); + foreach($reasons->find('mask') as $r){ + if (((int)$r->mask() & (int)$this->__models['suspended']->reasoncode()) != 0){ + echo $r->textStr().' '; + } + } + } + echo '$statuscard_no.">History"; + if ($this->auth_mode == 'Full') + echo '   Change Status'; + else if ($this->auth_mode == 'Limited' && $this->__models['suspended']->reasoncode() == 16){ + echo '   Address Corrected'; + } + echo 'card_no."\">Special Orders
        First Name: '.$this->text_or_field('FirstName',$this->__models['custdata'][0]->FirstName()).'Last Name: '.$this->text_or_field('LastName',$this->__models['custdata'][0]->LastName()).'
        Address1: '.$this->text_or_field('address1',$address[0]).'Gets mailings: '.$this->text_or_select('mailflag',$this->__models['meminfo']->ads_OK(), + array(1,0), array('Yes','No')).'
        Address2: '.$this->text_or_field('address2',(isset($address[1])?$address[1]:'')).'UPC: '.$this->text_or_field('upc',$this->__models['memberCards']->upc()).'
        City: '.$this->text_or_field('city',$this->__models['meminfo']->city()).'State: '.$this->text_or_field('state',$this->__models['meminfo']->state()).'Zip: '.$this->text_or_field('zip',$this->__models['meminfo']->zip()).'
        Phone Number: '.$this->text_or_field('phone',$this->__models['meminfo']->phone()).'Start Date: '.$this->text_or_field('start_date',$start,array(),$limitedEdit).'End Date: '.$this->text_or_field('end_date',$end,array(),$limitedEdit).'
        Alt. Phone: '.$this->text_or_field('phone2',$this->__models['meminfo']->email_2()).'E-mail: '.$this->text_or_field('email',$this->__models['meminfo']->email_1()).'
        Stock Purchased: ".sprintf('%.2f',$this->__models['equity']->payments()).'Mem Type: '.$this->text_or_select('memType',$this->__models['custdata'][0]->memType(), + $opts, $labels,array(),$limitedEdit).'Discount: '.$this->__models['custdata'][0]->Discount().'
        Charge Limit: '.$this->text_or_field('chargelimit',$this->__models['custdata'][0]->memDiscountLimit(), + array(),$limitedEdit).'Current Balance: '.sprintf('%.2f',$this->__models['ar']->balance()).'
        Additional household membersAdditional Notescard_no.">Notes history
        First NameLast Name"; + echo $this->text_or_area('notetext',$this->__models['note'], + array('rows'=>7,'cols'=>50), 2); + echo "
        '.($i+1).''.$this->text_or_field('fn[]',$cust->FirstName()).''.$this->text_or_field('ln[]',$cust->LastName()).'
        '.($i+1).''.$this->text_or_field('fn[]','').''.$this->text_or_field('ln[]','').'
        '; + if (FormLib::get_form_value('edit',False) === False){ + if ($this->current_user){ + echo ''; + echo ''; + } + else { + echo ''; + echo ''; + } + } + else + echo ''; + echo '
        "; + return ob_get_clean(); + } + + private function text_or_field($name, $value, $attributes=array(), $limited=False){ + if (FormLib::get_form_value('edit',False) === False || $limited) + return $value; + + $tag = '$val) + $tag .= ' '.$key.'="'.$val.'"'; + $tag .= '/>'; + return $tag; + } + + private function text_or_select($name, $value, $opts, $labels=array(), $attributes=array(), $limited=False){ + if (FormLib::get_form_value('edit',False) === False || $limited){ + if (!empty($labels)){ + for($i=0;$i$val) + $tag .= ' '.$key.'="'.$val.'"'; + $tag .= '>'; + for($i=0;$i%s', + $opts[$i], + ($opts[$i]==$value ? 'selected': ''), + (isset($labels[$i]) ? $labels[$i] : $opts[$i]) + ); + } + $tag .= ''; + return $tag; + } + + /** + swap values + 0 - make no changes + 1 - value has newlines + 2 - value has br tags + */ + private function text_or_area($name, $value, $attributes=array(), $swap=0, $limited=False){ + if (FormLib::get_form_value('edit',False) === False || $limited){ + switch($swap){ + case 1: + return str_replace("\n",'
        ',$value); + break; + case 2: + case 0: + default: + return $value; + break; + } + } + + $ret = ''; + + $ret .= ''; + + return $ret; + } + + public function css_content(){ + return ' + .greenbg { background: #006633; } + .greentxt { color: #006633; } + .yellowbg { background: #FFFF33; } + .yellowtxt { color: #FFFF33; } + '; + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PINoteHistoryPage.php b/fannie/modules/plugins2.0/PIKiller/PINoteHistoryPage.php new file mode 100644 index 000000000..172c0adb4 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PINoteHistoryPage.php @@ -0,0 +1,59 @@ +card_no = $this->id; + + $this->title = 'Notes History : Member '.$this->card_no; + + $this->__models['notes'] = $this->get_model(FannieDB::get($FANNIE_OP_DB), 'MemberNotesModel', + array('cardno'=>$this->id),'stamp'); + $this->__models['notes'] = array_reverse($this->__models['notes']); + + return True; + } + + protected function get_id_view(){ + global $FANNIE_URL; + ob_start(); + echo ''; + foreach($this->__models['notes'] as $note){ + if(trim($note->note()) == '') continue; + echo ''.$note->stamp().' - note added by '.$note->username().'
        '; + echo $note->note().'

        '; + } + echo ''; + return ob_get_clean(); + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PIPatronagePage.php b/fannie/modules/plugins2.0/PIKiller/PIPatronagePage.php new file mode 100644 index 000000000..4731fd0f4 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PIPatronagePage.php @@ -0,0 +1,93 @@ +card_no = $this->id; + + $this->title = 'Patronage : Member '.$this->card_no; + + $this->__models['patronage'] = $this->get_model(FannieDB::get($FANNIE_OP_DB), + 'PatronageModel', + array('cardno'=>$this->id), + 'FY'); + return True; + } + + protected function get_id_view(){ + ob_start(); + echo ''; + + $totals = array('cash'=>0.00,'equity'=>0.00); + + echo ''; + echo ' + + '; + foreach($this->__models['patronage'] as $obj){ + printf(' + + + + + + + + ', + $obj->FY(), + $obj->purchase(), + $obj->discounts(), + $obj->rewards(), + $obj->net_purch(), + $obj->tot_pat(), + $obj->cash_pat(), + $obj->equit_pat() + ); + $totals['cash'] += $obj->cash_pat(); + $totals['equity'] += $obj->equit_pat(); + } + echo '
        FYPurchasesDiscountsRewardsNet PurchasesTotal PatronageCash PortionEquity Portion
        %d + %.2f%.2f%.2f%.2f%.2f%.2f%.2f
        '; + + echo '

        Historical Totals:

        '; + echo ''; + echo ''; + printf('', + $this->id,($totals['cash']+$totals['equity']), + $totals['cash'],$totals['equity']); + echo '
        Mem#TotalCashEquity
        %d%.2f%.2f%.2f
        '; + + echo ''; + return ob_get_clean(); + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PIPurchasesPage.php b/fannie/modules/plugins2.0/PIKiller/PIPurchasesPage.php new file mode 100644 index 000000000..c7efa2dae --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PIPurchasesPage.php @@ -0,0 +1,125 @@ +card_no = $this->id; + + $my = FormLib::get_form_value('my',date('Ym')); + $start = date("Y-m-d",mktime(0,0,0,substr($my,4),1,substr($my,0,4))); + $end = date("Y-m-t",mktime(0,0,0,substr($my,4),1,substr($my,0,4))); + $table = DTransactionsModel::select_dlog($start,$end); + + $this->__models['start'] = $start; + $this->__models['end'] = $end; + + return True; + } + + protected function get_id_view(){ + global $FANNIE_TRANS_DB,$FANNIE_URL; + $table = DTransactionsModel::select_dlog($this->__models['start'],$this->__models['end']); + $my = date('Ym',strtotime($this->__models['start'])); + + $dbc = FannieDB::get($FANNIE_TRANS_DB); + $query = "SELECT month(tdate),day(tdate),year(tdate),trans_num, + sum(case when trans_type='T' then -total else 0 end) as tenderTotal, + sum(case when department=990 then total else 0 end) as payment, + sum(case when trans_subtype='MI' then total else 0 end) as charges, + sum(case when department in (991,992) then total else 0 end) as stock, + sum(case when trans_subtype='MA' then total else 0 end) as madcoupon, + sum(case when upc='DISCOUNT' then total else 0 end) as discountTTL, + sum(case when upc like '00499999%' then total else 0 end) as wfcoupon + FROM $table as t + WHERE card_no=? + AND tdate BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(tdate),trans_num + ORDER BY year(tdate) DESC, month(tdate) DESC, + day(tdate) DESC"; + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep, + array($this->id, $this->__models['start'].' 00:00:00', $this->__models['end'].' 23:59:59')); + + ob_start(); + echo ''; + + echo ""; + echo "id."\" />"; + $ts = time(); + echo ""; + + $visits = 0; + $spending = 0.0; + echo ""; + while($row = $dbc->fetch_row($result)){ + echo ""; + printf("",$row[0],$row[1],$row[2]); + printf("", + $row[3],$row[0],$row[1],$row[2],$row[3]); + printf("",$row[4]); + echo ""; + echo ""; + $spending += $row[4]; + $visits += 1; + } + echo "
        %d/%d/%d%s\$%.2f"; + if ($row[5] != 0) echo "P"; + if ($row[6] != 0) echo "C"; + if ($row[7] != 0) echo "S"; + if ($row[8] != 0) echo "MC"; + if ($row[9] != 0) echo "%"; + if ($row[10] != 0) echo "IC"; + echo " 
        "; + printf("Visits: %d
        Spending: \$%.2f +
        Avg: \$%.2f", + $visits,$spending, + ($visits > 0 ? $spending/$visits : 0)); + + echo ''; + return ob_get_clean(); + } + +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/PISearchPage.php b/fannie/modules/plugins2.0/PIKiller/PISearchPage.php new file mode 100644 index 000000000..0735cbd67 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PISearchPage.php @@ -0,0 +1,132 @@ +__routes[] = 'get'; + return parent::preprocess(); + } + + function get_id_handler(){ + $this->first = ''; + $this->last = ''; + return $this->get_id_first_last_handler(); + } + + function get_id_first_last_handler(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + if (empty($this->id) && empty($this->last)) + return True; // invalid search + + if (!empty($this->id)){ + $custdata = new CustdataModel($dbc); + $custdata->CardNo($this->id); + if (count($custdata->find()) > 0){ + header('Location: PIMemberPage.php?id='.$this->id); + return False; + } + $cards = new MemberCardsModel($dbc); + $cards->upc(str_pad($this->id,13,'0',STR_PAD_LEFT)); + foreach($cards->find() as $obj){ + header('Location: PIMemberPage.php?id='.$obj->card_no()); + return False; + } + } + else { + $q = $dbc->prepare_statement('SELECT CardNo, LastName, FirstName FROM + custdata WHERE LastName LIKE ? AND FirstName LIKE ? + ORDER BY LastName,FirstName,CardNo'); + $r = $dbc->exec_statement($q, array($this->last.'%',$this->first.'%')); + $this->__models['custdata'] = array(); + while($w = $dbc->fetch_row($r)){ + $this->__models['custdata'][] = $w; + } + if (count($this->__models['custdata'])==1){ + header('Location: PIMemberPage.php?id='.$this->id); + return False; + } + } + return True; + } + + function get_view(){ + ob_start(); + ?> + + +   + Owner + # or UPC: + + + + + + Last Name + + + + + + First + Name: + + + + + add_onload_command('$(\'#memNum_t\').focus();'); + return ob_get_clean(); + } + + function get_id_first_last_view(){ + if (!isset($this->__models['custdata']) || count($this->__models['custdata']) == 0){ + return '

        No results from search

        ' + .$this->get_view(); + } + $ret = '

        There is more than one result

        '; + $ret .= '
        '; + $ret .= ' '; + $ret .= ''; + $ret .= '
        '; + $this->add_onload_command('$(\'#memNum_s\').focus();'); + return $ret; + } +} + +FannieDispatch::go(); diff --git a/fannie/modules/plugins2.0/PIKiller/PISuspensionPage.php b/fannie/modules/plugins2.0/PIKiller/PISuspensionPage.php new file mode 100644 index 000000000..58161ba53 --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/PISuspensionPage.php @@ -0,0 +1,269 @@ + + Show suspension history for member + + Route: get + Show current suspension status for member + as editable form + + Route: post + Update suspension status for member then + redirect to PIMemberPage.php + + Route get + Special case clear suspension for bad address only + */ + + function preprocess(){ + global $FANNIE_OP_DB; + $rc = new ReasoncodesModel(FannieDB::get($FANNIE_OP_DB)); + $this->__models['codes'] = $rc->find('mask'); + + if (FormLib::get_form_value('id',False) !== False){ + $this->card_no = FormLib::get_form_value('id'); + $susp = $this->get_model(FannieDB::get($FANNIE_OP_DB),'SuspensionsModel',array('cardno'=>$this->card_no)); + if ($susp->load()) $this->__models['suspended'] = $susp; + } + + $this->__routes[] = 'get'; + $this->__routes[] = 'get'; + return parent::preprocess(); + } + + protected function get_id_edit_handler(){ + global $FANNIE_OP_DB; + $this->card_no = $this->id; + if (!FannieAuth::validateUserQuiet('editmembers')) + return $this->unknown_request_handler(); + + $this->title = 'Suspension Status : Member '.$this->card_no; + + $this->__models['custdata'] = $this->get_model(FannieDB::get($FANNIE_OP_DB),'CustdataModel', + array('CardNo'=>$this->id,'personNum'=>1)); + return True; + } + + protected function get_id_fixaddress_handler(){ + global $FANNIE_OP_DB; + $susp = new SuspensionsModel(FannieDB::get($FANNIE_OP_DB)); + $susp->cardno($this->id); + if (!$susp->load()){ + // not currently suspended + header('Location: PIMemberPage.php?id='.$this->id); + return False; + } + else if ($susp->reasoncode() == 16){ + // clear suspension for bad address + return $this->post_id_handler(); + } + else + return $this->unknown_request_handler(); + } + + protected function get_id_handler(){ + global $FANNIE_OP_DB; + $this->card_no = $this->id; + + $this->title = 'Suspension History : Member '.$this->card_no; + + $this->__models['history'] = $this->get_model(FannieDB::get($FANNIE_OP_DB), 'SuspensionHistoryModel', + array('cardno'=>$this->id),'postdate'); + $this->__models['history'] = array_reverse($this->__models['history']); + + return True; + } + + protected function get_id_view(){ + global $FANNIE_URL; + ob_start(); + echo ''; + foreach($this->__models['history'] as $obj){ + echo ''.$obj->postdate().' - status changed by '.$obj->username().'
        '; + if ($obj->reasoncode() == -1) + echo $obj->post().'

        '; + else { + foreach($this->__models['codes'] as $reason){ + if (($reason->mask() & $obj->reasoncode()) != 0) + echo $reason->textStr().'
        '; + } + echo '
        '; + } + } + echo ''; + return ob_get_clean(); + } + + function get_id_edit_view(){ + ob_start(); + echo ''; + echo '
        '; + echo ''; + echo "   Reason for suspending membership ".$this->id.'
        '; + echo ""; + echo ''; + foreach($this->__models['codes'] as $reason){ + echo ''; + } + echo "
        '; + echo '__models['suspended']) && $this->__models['suspended']->reasoncode() & $reason->mask()) + echo ' checked'; + echo ' />'.$reason->textStr().'
        "; + echo ""; + echo "
        "; + echo ''; + + return ob_get_clean(); + } + + function post_id_handler(){ + global $FANNIE_OP_DB; + if (!FannieAuth::validateUserQuiet('editmembers') && !FannieAuth::validateUserQuiet('editmembers_csc')) + return $this->unknown_request_handler(); + $dbc = FannieDB::get($FANNIE_OP_DB); + + $status = FormLib::get_form_value('status','INACT'); + $codes = FormLib::get_form_value('reasoncodes',array()); + $code = 0; + foreach($codes as $selected_code){ + $code = $code | ((int)$selected_code); + } + + if ($code == 0){ + // reactivate account + // add history/log record, restore settings, delete suspensions record + $history = new SuspensionHistoryModel($dbc); + $history->username($this->current_user); + $history->cardno($this->id); + $history->reasoncode(-1); + $history->post('Account reactivated'); + $history->postdate(date('Y-m-d H:i:s')); + $history->save(); + + if (isset($this->__models['suspended'])){ + $cdP = $dbc->prepare_statement('UPDATE custdata SET + Type=?, memType=?, ChargeOk=1, memCoupons=1, + Discount=?, memDiscountLimit=? + WHERE CardNo=?'); + $cdR = $dbc->exec_statement($cdP,array( + $this->__models['suspended']->memtype2(), + $this->__models['suspended']->memtype1(), + $this->__models['suspended']->discount(), + $this->__models['suspended']->chargelimit(), + $this->id)); + + $cust = new CustdataModel($dbc); + $cust->CardNo($this->id); + for($i=1;$i<=4;$i++){ + $cust->personNum($i); + if($cust->load()) + $cust->push_to_lanes(); + } + + $mi = new MeminfoModel($dbc); + $mi->card_no($this->id); + $mi->ads_OK($this->__models['suspended']->mailflag()); + $mi->save(); + + $this->__models['suspended']->delete(); + } + } + else if (isset($this->__models['suspended'])){ + // account already suspended + // add history/log record, update suspended record + if ($status == 'TERM') + $this->__models['suspended']->type('T'); + else + $this->__models['suspended']->type('I'); + $this->__models['suspended']->reasoncode($code); + + $history = new SuspensionHistoryModel($dbc); + $history->username($this->current_user); + $history->cardno($this->id); + $history->reasoncode($code); + $history->postdate(date('Y-m-d H:i:s')); + $history->save(); + + $cdP = $dbc->prepare_statement('UPDATE custdata SET Type=? + WHERE CardNo=?'); + $cdR = $dbc->exec_statement($cdP, array($status, $this->id)); + } + else { + // suspend active account + // create suspensions and log/history records + // set custdata & meminfo to inactive + $mi = $this->get_model($dbc,'MeminfoModel',array('card_no'=>$this->id)); + $cd = $this->get_model($dbc,'CustdataModel',array('CardNo'=>$this->id,'personNum'=>1)); + + $susp = new SuspensionsModel($dbc); + $susp->cardno($this->id); + $susp->type( $status == 'TERM' ? 'T' : 'I' ); + $susp->memtype1($cd->memType()); + $susp->memtype2($cd->Type()); + $susp->suspDate(date('Y-m-d H:i:s')); + $susp->reason(''); + $susp->mailflag($mi->ads_OK()); + $susp->discount($cd->Discount()); + $susp->chargelimit($cd->MemDiscountLimit()); + $susp->reasoncode($code); + $susp->save(); + + $history = new SuspensionHistoryModel($dbc); + $history->username($this->current_user); + $history->cardno($this->id); + $history->reasoncode($code); + $history->postdate(date('Y-m-d H:i:s')); + $history->save(); + + $mi->ads_OK(0); + $cdP = $dbc->prepare_statement('UPDATE custdata SET + memType=0,Type=?,ChargeOk=0,memCoupons=0, + Discount=0,MemDiscountLimit=0 + WHERE CardNo=?'); + $cdR = $dbc->exec_statement($cdP, array($status, $this->id)); + } + + header('Location: PIMemberPage.php?id='.$this->id); + return False; + } +} + +FannieDispatch::go(); + +?> diff --git a/fannie/modules/plugins2.0/PIKiller/css/styles.css b/fannie/modules/plugins2.0/PIKiller/css/styles.css new file mode 100644 index 000000000..eb7185eac --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/css/styles.css @@ -0,0 +1,196 @@ +body { + font-family: Arial, Helvetica, sans-serif; + font-size: 14px; + margin-top: 2px; + margin-left: 4px; + margin: 4px; + color: #000000; +} + +a { + text-decoration:none +} + +#logo { + position: absolute; + left:4px; + top: 4px; +} + +#main { + position: absolute; + left: 10px; + top: 150px; + width: 250px; +} + +#docmain { + position: absolute; + left: 10px; + top: 50px; + width: 700px; +} + +#doctext { + position: relative; + left: 20px; +} +#comment{ + position:absolute; + left: 180px; + font-size:12px; + text-align: left; +} + +#products{ + position: absolute; + left: 10px; + top : 150px; +} +#comment1{ + position:absolute; + left:275px; + top:200px; + text-align:left; + border: double 2px brown; + padding: 3px; +} + +#textwlogo{ + position: absolute; + left:5px; + top: 120px; + width: 500px; +} +p.rmargin { + position: absolute; + left: 10px; + top: 120px; + margin-right: 5% +} + +p.logfail{ + position: absolute; + left: 10px; + top: 175px; + font-weight:bold; + color:#FF3333 +} + p.message{ + position: absolute; + left: 10px; + top: 175px; + color: #003399; + } + + p.info{ + position: absolute; + left: 10px; + top: 150px; + font-size:10px; + } + +a { + color: #663300; +} + +a active visited{ + color: #663300; +} + +p.email{ + position: absolute; + left: 10px; + top:450px +} + +img.logo{ + position: absolute; + left: 10px; + top: 10px +} + +form.login{ + position: absolute; + left: 10px; + top: 200px; +} + +td { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +th { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.bodystyle { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.small { + font-family: Arial, Helvetica, sans-serif; + font-size: 9px; +} + +.medium { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.big { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; +} + +.xbig { + font-family: Arial, Helvetica, sans-serif; + font-size: 24px; +} + +.expanded { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 24px; + letter-spacing: 2px; +} + +.justified { + font-family: Arial, Helvetica, sans-serif; + text-align: justify; +} + +.footer { + font-family: "Times New Roman", Times, serif; + font-size: 9px; + color: #999999; +} + +.box1 { + padding: 3px; + border-width: medium; + border-style: solid; + border-color: #CCCCCC #666666 #666666 #CCCCCC; +} + +.box2 { + font-style: italic; + word-spacing: 2pt; + padding: 3px; + border: 1px solid; +} + +.white{ + color: white; + font-size: 14px; +} + +.store { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + font-weight: bold; + color: #A46833; +} diff --git a/fannie/modules/plugins2.0/PIKiller/images/AR.gif b/fannie/modules/plugins2.0/PIKiller/images/AR.gif new file mode 100644 index 000000000..9c2ae15e4 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/AR.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/control.gif b/fannie/modules/plugins2.0/PIKiller/images/control.gif new file mode 100644 index 000000000..934ffeda5 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/control.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/detail.gif b/fannie/modules/plugins2.0/PIKiller/images/detail.gif new file mode 100644 index 000000000..5bce880ca Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/detail.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/equity.gif b/fannie/modules/plugins2.0/PIKiller/images/equity.gif new file mode 100644 index 000000000..4ffcca7d0 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/equity.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/general.gif b/fannie/modules/plugins2.0/PIKiller/images/general.gif new file mode 100644 index 000000000..40d15593d Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/general.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/itemsDown.gif b/fannie/modules/plugins2.0/PIKiller/images/itemsDown.gif new file mode 100644 index 000000000..02e9cdabe Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/itemsDown.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/itemsOver.gif b/fannie/modules/plugins2.0/PIKiller/images/itemsOver.gif new file mode 100644 index 000000000..842cff536 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/itemsOver.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/itemsUp.gif b/fannie/modules/plugins2.0/PIKiller/images/itemsUp.gif new file mode 100644 index 000000000..102d332bc Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/itemsUp.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/memDown.gif b/fannie/modules/plugins2.0/PIKiller/images/memDown.gif new file mode 100644 index 000000000..0c2d0bcb5 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/memDown.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/memOver.gif b/fannie/modules/plugins2.0/PIKiller/images/memOver.gif new file mode 100644 index 000000000..9cd0d89bb Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/memOver.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/memUp.gif b/fannie/modules/plugins2.0/PIKiller/images/memUp.gif new file mode 100644 index 000000000..c2d3194f1 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/memUp.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/newLogo_small1.gif b/fannie/modules/plugins2.0/PIKiller/images/newLogo_small1.gif new file mode 100644 index 000000000..ec4ba2cbb Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/newLogo_small1.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/patronage.gif b/fannie/modules/plugins2.0/PIKiller/images/patronage.gif new file mode 100644 index 000000000..490999587 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/patronage.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/refDown.gif b/fannie/modules/plugins2.0/PIKiller/images/refDown.gif new file mode 100644 index 000000000..a67cd7610 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/refDown.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/refOver.gif b/fannie/modules/plugins2.0/PIKiller/images/refOver.gif new file mode 100644 index 000000000..d5b414953 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/refOver.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/refUp.gif b/fannie/modules/plugins2.0/PIKiller/images/refUp.gif new file mode 100644 index 000000000..7f5d1f31c Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/refUp.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/repDown.gif b/fannie/modules/plugins2.0/PIKiller/images/repDown.gif new file mode 100644 index 000000000..53e46a3db Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/repDown.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/repOver.gif b/fannie/modules/plugins2.0/PIKiller/images/repOver.gif new file mode 100644 index 000000000..d4028947a Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/repOver.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/images/repUp.gif b/fannie/modules/plugins2.0/PIKiller/images/repUp.gif new file mode 100644 index 000000000..08caf3767 Binary files /dev/null and b/fannie/modules/plugins2.0/PIKiller/images/repUp.gif differ diff --git a/fannie/modules/plugins2.0/PIKiller/index.php b/fannie/modules/plugins2.0/PIKiller/index.php new file mode 100644 index 000000000..081ca744e --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/index.php @@ -0,0 +1,34 @@ + + +Welcome to the Back End! + + + + + + + + + + + +
        To begin, select one of the two options below...
        +
        +
        +
        +Login to create owner numbers"; +} +else { + echo "Create Owner Numbers"; +} +echo "
        Print Owner Stickers"; +?> +
        + + + diff --git a/fannie/modules/plugins2.0/PIKiller/lib/PIKillerPage.php b/fannie/modules/plugins2.0/PIKiller/lib/PIKillerPage.php new file mode 100644 index 000000000..957ef247d --- /dev/null +++ b/fannie/modules/plugins2.0/PIKiller/lib/PIKillerPage.php @@ -0,0 +1,86 @@ +add_css_file('css/styles.css'); + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + return ' + + + + '.$this->title.' + + + + + + + + + + + + + + + + + + + '; + } + + function get_footer(){ + return '

        PI Killer
        + + + + + + +
        + + + + + + Items + + Reference 
            
        '; + } +} diff --git a/fannie/modules/plugins2.0/ShelfAudit/SaHandheldPage.php b/fannie/modules/plugins2.0/ShelfAudit/SaHandheldPage.php new file mode 100644 index 000000000..d2b7d6c29 --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/SaHandheldPage.php @@ -0,0 +1,305 @@ +section = $_SESSION['SaPluginSection']; + + /* ajax callbacks */ + $ajax = FormLib::get_form_value('action',''); + /* save new quantity */ + if ($ajax === 'save'){ + $upc = FormLib::get_form_value('upc',''); + $qty = FormLib::get_form_value('qty',0); + + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['ShelfAuditDB']); + $delP = $dbc->prepare_statement('DELETE FROM sa_inventory + WHERE upc=? AND '.$dbc->datediff($dbc->now(),'datetime').'=0'); + $insP = $dbc->prepare_statement('INSERT INTO sa_inventory (datetime,upc,clear,quantity,section) + VALUES ('.$dbc->now().',?,0,?,?)'); + $dbc->exec_statement($delP, array($upc)); + if ($qty > 0){ + $dbc->exec_statement($insP, array($upc, $qty, $this->section)); + } + echo 'quantity updated'; + return False; + } + + /* upc scan; lookup item */ + $upc = FormLib::get_form_value('upc_in',''); + if ($upc !== ''){ + $dbc = FannieDB::get($FANNIE_OP_DB); + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + $this->current_item_data['upc'] = $upc; + $q = 'SELECT p.description,v.brand,s.quantity,v.units FROM + products AS p LEFT JOIN vendorItems AS v ON p.upc=v.upc + LEFT JOIN '.$FANNIE_PLUGIN_SETTINGS['ShelfAuditDB'].$dbc->sep(). + 'sa_inventory AS s ON p.upc=s.upc + WHERE p.upc=? ORDER BY v.vendorID'; + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p,array($upc)); + if($dbc->num_rows($r)==0){ + // try again; item on-hand but not in products + $q = 'SELECT v.description,v.brand,s.quantity,v.units FROM + vendorItems AS v + LEFT JOIN '.$FANNIE_PLUGIN_SETTINGS['ShelfAuditDB'].$dbc->sep(). + 'sa_inventory AS s ON s.upc=v.upc + WHERE v.upc=? ORDER BY v.vendorID'; + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p,array($upc)); + } + + + while($w = $dbc->fetch_row($r)){ + if (!isset($this->current_item_data['desc'])){ + $this->current_item_data['desc'] = $w['brand'].' '.$w['description']; + } + if (!isset($this->current_item_data['qty'])){ + $this->current_item_data['qty'] = is_numeric($w['quantity']) ? $w['quantity'] : 0; + } + if (!isset($this->current_item_data['case_sizes'])){ + $this->current_item_data['case_sizes'] = array(); + } + if ($w['units'] > 0) + $this->current_item_data['case_sizes'][] = $w['units']; + } + } + + $this->add_script($FANNIE_URL.'src/jquery/jquery.js'); + + $this->linea_ios_mode = $this->linea_support_available(); + if ($this->linea_ios_mode){ + $this->add_script($FANNIE_URL.'src/linea/cordova-2.2.0.js'); + $this->add_script($FANNIE_URL.'src/linea/ScannerLib-Linea-2.0.0.js'); + } + + return True; + } + + function css_content(){ + ob_start(); + ?> +input.addButton { + width: 60px; + height: 50px; + background-color: #090; + color: #fff; + font-weight: bold; + font-size: 135%; +} +input.subButton { + width: 60px; + height: 50px; + background-color: #900; + color: #fff; + font-weight: bold; + font-size: 135%; +} +input#cur_qty { + width: 60px; + height: 50px; + font-size: 135%; + font-weight: bold; +} +input.focused { + background: #ffeebb; +} + +function paint_focus(elem){ + if (elem == 'upc_in'){ + $('#upc_in').addClass('focused'); + $('#cur_qty').removeClass('focused'); + } + else { + $('#cur_qty').addClass('focused'); + $('#upc_in').removeClass('focused'); + } +} +function update_qty(amt){ + var cur = Number($('#cur_qty').val()); + if (cur + amt < 0) + cur = 0; + else + cur = cur+amt; + $('#cur_qty').val(cur); + + // save new quantity, return cursor to upc input + var args = 'action=save&upc='+$('#cur_upc').val()+'&qty='+cur; + $.ajax({ + url: 'SaHandheldPage.php', + data: args, + cache: false, + error: function(){ + $('#upc_in').focus(); + paint_focus('upc_in'); + }, + success: function(){ + $('#upc_in').focus(); + paint_focus('upc_in'); + } + }); +} + +function qty_typed(ev){ + var cur = Number($('#cur_qty').val()); + // save new quantity, return cursor to upc input + var args = 'action=save&upc='+$('#cur_upc').val()+'&qty='+cur; + $.ajax({ + url: 'SaHandheldPage.php', + data: args, + cache: false, + error: function(){ + }, + success: function(){ + } + }); + if (ev.keyCode==13){ + $('#upc_in').focus(); + paint_focus('upc_in'); + } + else if (ev.keyCode >= 37 && ev.keyCode <= 40){ + $('#upc_in').focus(); + paint_focus('upc_in'); + } +} + + linea_ios_mode){ ?> +Device = new ScannerDevice({ + barcodeData: function (data, type){ + var upc = data.substring(0,data.length-1); + if ($('#upc_in').length > 0){ + $('#upc_in').val(upc); + $('#goBtn').click(); + } + }, + magneticCardData: function (track1, track2, track3){ + }, + magneticCardRawData: function (data){ + }, + buttonPressed: function (){ + }, + buttonReleased: function (){ + }, + connectionState: function (state){ + } +}); +ScannerDevice.registerListener(Device); + + + current_item_data['upc']) && isset($this->current_item_data['desc'])) $elem = '#cur_qty'; + ?> + +Scan Inventory + +
        +UPC: +/> + +
        +
        + current_item_data['upc'])){ + if (!isset($this->current_item_data['desc'])){ + echo 'Item not found ('; + echo $this->current_item_data['desc']; + echo ')'; + } + else { + echo ''; + echo $this->current_item_data['upc']; + echo ' '; + echo $this->current_item_data['desc']; + echo ''; + echo '
        '; + printf(' + ', + $this->current_item_data['qty'], + (($elem=='#cur_qty')?'class="focused"':''), + $this->current_item_data['upc'] + ); + printf(' + ', + 1,1,1,-1); + $used = array(1=>True); + foreach($this->current_item_data['case_sizes'] as $s){ + if (isset($used[$s])) continue; + printf(' + ', + $s,$s,$s,-1*$s); + } + } + } + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new SaHandheldPage(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/ShelfAudit/SaPriceChangePage.php b/fannie/modules/plugins2.0/ShelfAudit/SaPriceChangePage.php new file mode 100644 index 000000000..a7d593022 --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/SaPriceChangePage.php @@ -0,0 +1,231 @@ +add_script($FANNIE_URL.'src/jquery/jquery.js'); + + $this->linea_ios_mode = $this->linea_support_available(); + if ($this->linea_ios_mode){ + $this->add_script($FANNIE_URL.'src/linea/cordova-2.2.0.js'); + $this->add_script($FANNIE_URL.'src/linea/ScannerLib-Linea-2.0.0.js'); + } + + $this->__routes[] = 'post'; + + return parent::preprocess(); + } + + function post_upc_price_handler(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $prod = new ProductsModel($dbc); + $prod->upc(str_pad($this->upc,13,'0',STR_PAD_LEFT)); + $prod->normal_price($this->price); + $prod->save(); + $prod->push_to_lanes(); + + $this->id = $this->upc; + return $this->get_id_handler(); + } + + function get_id_handler(){ + global $FANNIE_OP_DB; + $dbc = FannieDB::get($FANNIE_OP_DB); + + $prodQ = $dbc->prepare_statement('SELECT upc, description, normal_price + FROM products WHERE upc=?'); + $upc = str_pad($this->id, 13, '0', STR_PAD_LEFT); + $prodR = $dbc->exec_statement($prodQ, array($upc)); + + if ($dbc->num_rows($prodR) == 0){ + echo 'No item found for: '.$upc.''; + return False; + } + + $prodW = $dbc->fetch_row($prodR); + + echo ''.$prodW['upc'].' '; + echo ''.$prodW['description'].' '; + echo ''.sprintf('$%.2f',$prodW['normal_price']).''; + + $pendR = 0; + if ($dbc->table_exists('batchListTest')){ + $pendQ = $dbc->prepare_statement('SELECT salePrice FROM batchListTest as l + LEFT JOIN batchTest AS b ON l.batchID=b.batchID WHERE + b.discounttype=0 AND l.upc=? ORDER BY l.batchID DESC'); + $pendR = $dbc->exec_statement($pendQ, array($upc)); + } + + if ($pendR === 0 || $dbc->num_rows($pendR) == 0){ + $pendQ = $dbc->prepare_statement('SELECT salePrice FROM batchList as l + LEFT JOIN batches AS b ON l.batchID=b.batchID WHERE + b.discounttype=0 AND l.upc=? ORDER BY l.batchID DESC'); + $pendR = $dbc->exec_statement($pendQ, array($upc)); + } + + // no pending price change batch + if ($dbc->num_rows($pendR) == 0) + return False; + + $pendW = $dbc->fetch_row($pendR); + // latest price change already applied + if ($pendW['salePrice'] == $prodW['normal_price']) + return False; + + echo '
        '; + printf('',$upc, + $pendW['salePrice'],$pendW['salePrice']); + echo '
        '; + return False; + } + + function css_content(){ + ob_start(); + ?> +input.addButton { + width: 60px; + height: 50px; + background-color: #090; + color: #fff; + font-weight: bold; + font-size: 135%; +} +input.focused { + background: #ffeebb; +} +input.pending { + font-weight: bold; + background-color: #090; + font-size: 135%; + color: #fff; +} + linea_ios_mode){ + ?> +Device = new ScannerDevice({ + barcodeData: function (data, type){ + var upc = data.substring(0,data.length-1); + if ($('#upc_in').length > 0){ + $('#upc_in').val(upc); + $('#goBtn').click(); + } + }, + magneticCardData: function (track1, track2, track3){ + }, + magneticCardRawData: function (data){ + }, + buttonPressed: function (){ + }, + buttonReleased: function (){ + }, + connectionState: function (state){ + } +}); +ScannerDevice.registerListener(Device); + +function lookupItem(){ + var upc = $('#upc_in').val(); + if (upc == '') return false; + $('#upc_in').val(''); + $.ajax({ + url: 'SaPriceChangePage.php', + type: 'get', + data: 'id='+upc, + success: function(data){ + $('#output_area').html(data); + } + }); +} +function do_pricechange(upc, newprice){ + $.ajax({ + url: 'SaPriceChangePage.php', + type: 'post', + data: 'upc='+upc+'&price='+newprice, + success: function(data){ + $('#output_area').html(data); + $('#upc_in').focus(); + } + }); +} + current_item_data['upc']) && isset($this->current_item_data['desc'])) $elem = '#cur_qty'; + ?> + +Price Check + +
        +UPC: + +
        +
        +
        + diff --git a/fannie/modules/plugins2.0/ShelfAudit/SaReportPage.php b/fannie/modules/plugins2.0/ShelfAudit/SaReportPage.php new file mode 100644 index 000000000..6d702d9b7 --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/SaReportPage.php @@ -0,0 +1,369 @@ +connections[$FANNIE_PLUGIN_SETTINGS['ShelfAuditDB']] === False){ + $this->status = 'bad - cannot connect'; + return True; + } + if (FormLib::get_form_value('delete') == 'yes'){ + $query=$dbc->prepare_statement('delete from sa_inventory where id=?'); + $result=$dbc->exec_statement($query,array(FormLib::get_form_value('id'))); + if ($result) { + $this->sql_actions='Deleted record.'; + } else { + $this->sql_actions='Unable to delete record, please try again. '; + } + } else if (FormLib::get_form_value('clear') == 'yes'){ + $query=$dbc->prepare_statement('update sa_inventory set clear=1;'); + $result=$dbc->exec_statement($query); + if ($result) { + $this->sql_actions='Cleared old scans.'; + header ("Location: SaReportPage.php"); + return False; + } else { + $this->sql_actions='Unable to clear old scans, try again. '; + } + } else if ($_GET['change']=='yes') { + } + + if (FormLib::get_form_value('view') == 'dept'){ + $order='d.dept_no,s.section,s.datetime'; + } else { + $order='s.section,d.dept_no,s.datetime'; + } + + /* omitting wedge-specific temp tables Andy 29Mar2013 + $t=true; + + $q='START TRANSACTION'; + $r=mysql_query($q, $link); + $t=&$r; + + $q='CREATE TEMPORARY TABLE `shelfaudit`.`tLastModified` (`upc` VARCHAR(13) NOT NULL, + `modified` DATETIME NOT NULL, KEY `upc_modified` (`upc`,`modified`)) + ENGINE = MYISAM'; + $r=mysql_query($q, $link); + $t=&$r; + + $q='SELECT `upc`, `datetime` FROM `shelfaudit`.`hbc_inventory` WHERE CLEAR!=1'; + $r=mysql_query($q, $link); + $t=&$r; + + $scans=array(); + + while ($row=mysql_fetch_assoc($r)) { + array_push($scans, array($row['upc'], $row['datetime'])); + } + + foreach ($scans as $scan) { + $q='INSERT INTO `shelfaudit`.`tLastModified` + SELECT \''.$scan[0].'\', MAX(`modified`) + FROM `wedgepos`.`itemTableLog` WHERE `upc`=\''.$scan[0].'\''; + $r=mysql_query($q, $link); + $t=&$r; + } + */ + + $q= $dbc->prepare_statement('SELECT + s.id, + s.datetime, + s.upc, + s.quantity, + s.section, + p.description, + d.dept_name, + d.dept_no, + + CASE WHEN p.discounttype > 0 THEN p.special_price + ELSE p.normal_price END AS retail, + + CASE WHEN p.discounttype = 2 THEN \'M\' + ELSE \'\' END AS retailstatus + + FROM sa_inventory AS s LEFT JOIN '. + $FANNIE_OP_DB.$dbc->sep().'products AS p + ON s.upc=p.upc LEFT JOIN '. + $FANNIE_OP_DB.$dbc->sep().'departments AS d + ON p.department=d.dept_no + WHERE clear!=1 + ORDER BY '.$order); + $r=$dbc->exec_statement($q); + if ($r) { + $this->status = 'Good - Connected'; + $num_rows=$dbc->num_rows($r); + if ($num_rows>0) { + $this->scans=array(); + while($row = $dbc->fetch_row($r)){ + $this->scans[] = $row; + } + } else { + $this->status = 'Good - No scans'; + } + } else { + $this->status = 'Bad - IT problem'; + } + return True; + } + + function css_content(){ + ob_start(); + ?> +body { + width: 768px; + margin: auto; + font-family: Helvetica, sans, Arial, sans-serif; + background-color: #F9F9F9; +} + +#bdiv { + width: 768px; + margin: auto; + text-align: center; +} + +body p, +body div { + border: 1px solid #CfCfCf; + background-color: #EFEFEF; + line-height: 1.5; + margin: 0px; +} + +body table { + font-size: small; + text-align: center; + border-collapse: collapse; + width: 100%; +} + +body table caption { + font-family: sans-mono, Helvetica, sans, Arial, sans-serif; + margin-top: 1em; +} + +body table th { + border-bottom: 2px solid #090909; +} + +table tr:hover { + background-color:#CFCFCF; +} + +.right { + text-align: right; +} +.small { + font-size: smaller; +} +#col_a { + width: 150px; +} +#col_b { + width: 100px; +} +#col_c { + width: 270px; +} +#col_d { + width: 40px; +} +#col_e { + width: 60px; +} +#col_f { + width: 20px; +} +#col_g { + width: 80px; +} +#col_h { + width: 48px; +} + + + + + +
        +

        Enter a new scan

        +

        Alternate Scan Page

        +

        sql_actions); ?>

        +

        status); ?>

        +

        view by pos department view by scanned section

        + scans) { + $clear = ''; + print_r($clear); + } + + $table = ''; + $view = FormLib::get_form_value('view','dept'); + $counter = ($view == 'dept') ? 'd' : 's'; + foreach($this->scans as $row) { + + if (!isset($counter_number)) { + if ($counter=='d') { $counter_number=$row['dept_no']; } + else { $counter_number=$row['section']; } + + $counter_total=$row['quantity']*$row['retail']; + + if ($counter=='d') { $caption=$row['dept_name'].' Department'; } + else { $caption='Section #'.$row['section']; } + + $table .= ' + + + + + + + + + + + + + + + + + + + + + + + + + '; + } else if ($counter_number!=$row['section'] && $counter_number!=$row['dept_no']) { + if ($counter=='d') { $counter_number=$row['dept_no']; } + else { $counter_number=$row['section']; } + + if ($counter=='d') { $caption=$row['dept_name'].' Department'; } + else { $caption='Section #'.$row['section']; } + + $table .= ' + + + + + + + + +
        '.$caption.'
        Date+TimeUPCDescriptionQtyEachSaleTotalDelete
        '.$row['datetime'].''.$row['upc'].''.$row['item_desc'].''.$row['quantity'].''.money_format('%.2n', $row['retail']).''.(($row['retailstatus'])?$row['retailstatus']:' ').''.money_format('%!.2n', ($row['quantity']*$row['retail'])).'
         '.money_format('%.2n', $counter_total).' 
        + + + + + + + + + + + + + + + + + + + + + + + + + '; + + $counter_total=$row['quantity']*$row['retail']; + } else { + $counter_total+=$row['quantity']*$row['retail']; + + $table .= ' + + + + + + + + + + '; + } + } + + $table .= ' + + + + + + + + +
        '.$caption.'
        Date+TimeUPCDescriptionQtyEachSaleTotalDelete
        '.$row['datetime'].''.$row['upc'].''.$row['item_desc'].''.$row['quantity'].''.money_format('%.2n', $row['retail']).''.(($row['retailstatus'])?$row['retailstatus']:' ').''.money_format('%!.2n', ($row['quantity']*$row['retail'])).'
        '.$row['datetime'].''.$row['upc'].''.$row['item_desc'].''.$row['quantity'].''.money_format('%.2n', $row['retail']).''.(($row['retailstatus'])?$row['retailstatus']:' ').''.money_format('%!.2n', ($row['quantity']*$row['retail'])).'
         '.money_format('%.2n', $counter_total).' 
        +'; + if (!empty($table)) + print_r($table); + ?> +
        + + + draw_page(); +} diff --git a/fannie/modules/plugins2.0/ShelfAudit/SaScanningPage.php b/fannie/modules/plugins2.0/ShelfAudit/SaScanningPage.php new file mode 100644 index 000000000..6599956ff --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/SaScanningPage.php @@ -0,0 +1,205 @@ +status = 'waiting - no input'; + + /** + Store session in browser section. + */ + @session_start(); + if (!isset($_SESSION['SaPluginSection'])) + $_SESSION['SaPluginSection'] = 0; + $this->section = $_SESSION['SaPluginSection']; + + $dbc = FannieDB::get($FANNIE_PLUGIN_SETTINGS['ShelfAuditDB']); + if (!is_object($dbc) || $dbc->connections[$FANNIE_PLUGIN_SETTINGS['ShelfAuditDB']] === False){ + $this->status = 'bad - cannot connect'; + return True; + } + + if (FormLib::get_form_value('sflag') == 1){ + $query = $dbc->prepare_statement('SELECT MAX(section) AS new_section FROM sa_inventory'); + $result = $dbc->exec_statement($query); + $section = 0; + if ($dbc->num_rows($result) > 0) + $section = array_pop($dbc->fetch_row($result)); + + $this->section = $section + 1; + $_SESSION['SaPluginSection'] = $section + 1; + $this->status = 'good - section changed'; + } + else if (FormLib::get_form_value('minput') !== ''){ + $upc = FormLib::get_form_value('minput'); + if (FormLib::get_form_value('isbnflag')=='1'){ + $upc=str_pad(substr($_GET['minput'],0,12), 13, '0', STR_PAD_LEFT); + } else { + $upc=str_pad(substr($_GET['minput'],0,11), 13, '0', STR_PAD_LEFT); + } + + /* Short tag rules */ + if (strcmp('0000000',substr($upc,0,7))==0) { + switch ($upc[12]) { + case '0': + $upc='00'.substr($upc,6,3).'00000'.substr($upc,10,3); + break; + case '1': + $upc='00'.substr($upc,6,3).'10000'.substr($upc,10,3); + break; + case '2': + $upc='00'.substr($upc,6,3).'20000'.substr($upc,10,3); + break; + case '3': + $upc='00'.substr($upc,6,4).'00000'.substr($upc,10,2); + break; + case '4': + $upc='00'.substr($upc,6,5).'00000'.substr($upc,11,1); + break; + default: + $upc='00'.substr($upc,6,6).'0000'.substr($upc,12,1); + break; + } + } + + /* + * Strip the z from qinput. Quick hack version + */ + $qty = FormLib::get_form_value('qinput'); + $qty = rtrim($qty,'z'); + $args = array($upc); + $stmt = $dbc->prepare_statement('INSERT INTO sa_inventory + (id,datetime,upc,clear,quantity,section) + VALUES (NULL,'.$dbc->now().',?,0,?,?)'); + + if ($qty != '' && ctype_digit($qty)){ + $args[] = $qty; + $args[] = $this->section; + } else if ($qty != '') { + $split=strpos($qty,'s'); + $quantity=substr($qty,0,$split); + $section=substr($qty,$split+1); + $args[] = $quantity; + $args[] = $section; + } else { + $args[] = 1; + $args[] = $this->section; + } + + $result = $dbc->exec_statement($stmt, $args); + if ($result) { $this->status = 'good - scan entered:'.$upc.''; + } else { $this->status = 'bad - strange scan:'.$query; } + } + + return True; + } + + function body_content(){ + ob_start(); + ?> + + +
        +
        + + + + +
        +
        + + +
        + on section (section; ?>) +
        +
        scan or type upc
        +
        status: status); ?>
        + +
        + + + +function waitforz() { + if (document.forms[0]) { + var qinputvalue = document.forms[0].qinput.value; + + if (qinputvalue.charAt(qinputvalue.length - 1) == 'z') { + document.forms[0].submit(); + } else { + t=setTimeout("waitforz()",1000); + } + } +} + +function readinput() { + if (document.forms[0]) { + var inputvalue = document.forms[0].minput.value; + + if (inputvalue.length == 12) { + document.forms[0].qinput.value=""; + document.forms[0].qinput.focus(); + waitforz(); + } else if (inputvalue.length == 13) { + document.forms[0].isbnflag.value="1"; + document.forms[0].qinput.value=""; + document.forms[0].qinput.focus(); + waitforz(); + } else { + document.forms[0].minput.focus(); + t=setTimeout("readinput()",1000); + } + } else { + } +} + draw_page(); +} diff --git a/fannie/modules/plugins2.0/ShelfAudit/ShelfAudit.php b/fannie/modules/plugins2.0/ShelfAudit/ShelfAudit.php new file mode 100644 index 000000000..55bd24054 --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/ShelfAudit.php @@ -0,0 +1,63 @@ + array('default'=>'core_shelfaudit','label'=>'Database', + 'description'=>'Database to store inventory information. Can + be one of the default CORE databases or a + separate one.') + ); + + public $plugin_description = 'Plugin for scanning items on hand'; + + public function setting_change(){ + global $FANNIE_ROOT, $FANNIE_PLUGIN_SETTINGS; + + $db_name = $FANNIE_PLUGIN_SETTINGS['ShelfAuditDB']; + if (empty($db_name)) return; + + $dbc = FannieDB::get($db_name); + + $errors = array(); + $errors[] = $this->plugin_db_struct($dbc, 'sa_inventory', $db_name); + + foreach($errors as $e){ + if ($e === True) continue; + echo 'ShelfAuditPlugin error: '.$e.'
        '; + } + } +} + +?> diff --git a/fannie/modules/plugins2.0/ShelfAudit/index.php b/fannie/modules/plugins2.0/ShelfAudit/index.php new file mode 100644 index 000000000..cca5fe62c --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/modules/plugins2.0/ShelfAudit/sql/sa_inventory.php b/fannie/modules/plugins2.0/ShelfAudit/sql/sa_inventory.php new file mode 100644 index 000000000..2c93f9155 --- /dev/null +++ b/fannie/modules/plugins2.0/ShelfAudit/sql/sa_inventory.php @@ -0,0 +1,37 @@ + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/EditTimesheetDatePage.php b/fannie/modules/plugins2.0/TimesheetPlugin/EditTimesheetDatePage.php new file mode 100644 index 000000000..f3713e440 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/EditTimesheetDatePage.php @@ -0,0 +1,237 @@ +header = 'Timesheet Management'; + $this->title = 'Fannie - Administration Module'; + $this->errors = array(); + $this->display_func = ''; + + $submit = FormLib::get_form_value('submit',''); + $submitted = FormLib::get_form_value('submitted',''); + $emp_no = FormLib::get_form_value('emp_no',''); + $date = FormLib::get_form_value('date',''); + $periodID = FormLib::get_form_value('periodID',''); + if (empty($submitted) && empty($emp_no)){ + $this->errors[] = 'You have found this page mistakenly.'; + } + elseif (isset($_POST['submitted'])) { // If the form has been submitted. + if ($_POST['submit'] == 'delete') { + $query = $ts_db->prepare_statement("DELETE + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet + WHERE emp_no=? AND date=?"); + $result = $ts_db->exec_statement($query,array($emp_no,$date)); + if ($result) { + $this->display_func = 'ts_delete_msg'; + } + else { + $this->errors[] = 'The day could not be removed, please try again later.'; + } + } + elseif ($_POST['submit'] == 'submit') { + + // Validate the data. + $entrycount = 0; + for ($i = 1; $i <= $max; $i++) { + if ((isset($_POST['hours' . $i])) && (is_numeric($_POST['area' . $i]))) { + $entrycount++; + } + } + + $hours = array(); + $area = array(); + + if ($entrycount == 0) { + $this->errors[] = 'You didn\'t enter any hours.'; + } + else { + for ($i = 1; $i <= $entrycount; $i++) { + if (((!$_POST['hours' . $i]) || (!$_POST['area' . $i])) && $_POST['hours' . $i] != 0) + $this->errors[] = "For entry $i: Either the Hours or the Labor Category were not set."; + } + for ($i = 1; $i <= $max; $i++) { + if ((isset($_POST['hours' . $i])) && (is_numeric($_POST['area' . $i]))) { + $hours[$i] = $_POST['hours' . $i]; + $area[$i] = $_POST['area' . $i]; + $ID[$i] = $_POST['ID' . $i]; + } + } + } + + if (empty($errors)) { // All good. + + $successcount = 0; + $upP = $ts_db->prepare_statement("UPDATE + {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet + SET hours=?,area=? + WHERE emp_no=? AND tdate=? AND ID=?"); + $insP = $ts_db->prepare_statement("INSERT INTO + {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet + (emp_no, hours, area, tdate, periodID) VALUES (?,?,?,?,?)"); + for ($i = 1; $i <= $entrycount; $i++) { + if (is_numeric($ID[$i])) { + $result = $ts_db->exec_statement($upP,array( + $hours[$i],$area[$i], + $emp_no, $date, $ID[$i] + )); + if ($result) {$successcount++;} + else { + $this->errors[] = 'Query: ' . $query; + $this->errors[] = 'MySQL Error: ' . $ts_db->error(); + } + } + elseif ($ID[$i] == 'insert') { + $result = $ts_db->exec_statement($insP,array( + $emp_no, $hours[$i], + $area[$i], $date, $periodID + )); + if ($result) {$successcount++;} + else { + $this->errors[] = 'Query: ' . $query; + $this->errors[] = 'MySQL Error: ' . $ts_db->error(); + } + } + } + + if ($successcount == $entrycount) { + // Start the redirect. + $url = "ViewsheetPage.php?emp_no=$emp_no&period=$periodID"; + header("Location: $url"); + return False; + } + else { + $this->errors[] = 'The entered hours could not be updated, Unknown error.'; + $this->errors[] = 'Error: ' . $ts_db->error(); + $this->errors[] = '

        Query: ' . $query; + } + + } + } + } + else if (!empty($periodID)){ + // Make sure we're in a valid pay period. + $query = $ts_db->prepare_statement("SELECT DATEDIFF(CURDATE(), DATE(periodEnd)) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $result = $ts_db->exec_statement($query,array($periodID)); + list($datediff) = $ts_db->fetch_row($result); + + if ($datediff > 1) { // Bad. + $this->errors[] = "You can't edit hours more than a day after the pay period has ended."; + } + } + + if (!empty($this->errors)){ + $this->display_func = 'ts_error'; + } + + return True; + } + + function delete_msg(){ + include ('./includes/header.html'); + echo '

        The day has been removed from your timesheet.

        '; + } + + function error_content(){ + include ('./includes/header.html'); + echo '

        The following error(s) occurred:

        '; + foreach ($this->errors AS $message) { + echo "

        - $message

        "; + } + echo '

        Please try again.

        '; + } + + function body_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + include ('./includes/header.html'); + if ($this->display_func == 'ts_error') + return $this->error_content(); + elseif ($this->display_func == 'ts_delete_msg') + return $this->delete_msg(); + + $emp_no = FormLib::get_form_value('emp_no',''); + $date = FormLib::get_form_value('date',''); + $periodID = FormLib::get_form_value('periodID',''); + + $query = $ts_db->prepare_statement("SELECT CONCAT(FirstName,' ',LastName) + FROM {$FANNIE_OP_DB}.employees where emp_no=?"); + $result = $ts_db->exec_statement($query,array($emp_no)); + // echo $query; + list($name) = $ts_db->fetch_row($result); + echo "
        + + + +

        +
        "; + + echo "
        "; + echo " + + + "; + + echo " + \n"; + + for ($i = 1; $i <= $max; $i++) { + $inc = $i - 1; + $query = $ts_db->prepare_statement("SELECT hours, area, ID + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE emp_no = ? AND tdate = ? ORDER BY ID ASC LIMIT ".$inc.",1"); + // echo $query; + $result = $ts_db->exec_statement($query,array($emp_no,$date)); + $num = $ts_db->num_rows($result); + + if ($row = $ts_db->fetch_row($result)) { + $hours = ($row[0])?$row[0]:''; + $area = $row[1]; + $ID = $row[2]; + } else { + $hours = ''; + $area = NULL; + $ID = "insert"; + } + + echo ""; + $query = $ts_db->prepare_statement("SELECT IF(NiceName='', ShiftName, NiceName), ShiftID + FROM " . $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'] . ".shifts + WHERE visible=true ORDER BY ShiftOrder ASC"); + $result = $ts_db->exec_statement($query); + echo '"; + echo "\n"; + + } + echo ''; + echo '

        Name: $name

        Date: ". substr($date, 0, 4) . "-" . substr($date, 5, 2) . "-" . substr($date, 8, 2) . "

        Total HoursLabor Category
        +
        '; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new EditTimesheetDatePage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/PayrollDetail.php b/fannie/modules/plugins2.0/TimesheetPlugin/PayrollDetail.php new file mode 100644 index 000000000..0abe6a904 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/PayrollDetail.php @@ -0,0 +1,132 @@ +add_css_file('includes/style.css'); + return True; + } + + function body_content(){ + global $FANNIE_PLUGIN_SETTINGS, $FANNIE_OP_DB; + $ts_db = FannieDB::get($FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']); + $periodID = FormLib::get_form_value('periodID',False); + $emp_no = FormLib::get_form_value('emp_no',False); + if (is_numeric($periodID) && is_numeric($emp_no)) { // If submitted. + $query = $ts_db->prepare_statement("SELECT ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2), + date_format(t.date, '%a %b %D'), + t.emp_no, + e.FirstName, + date_format(p.periodStart, '%M %D, %Y'), + date_format(p.periodEnd, '%M %D, %Y'), + t.date + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_OP_DB}.employees AS e + ON (t.emp_no = e.emp_no) + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (t.periodID = p.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 13 + GROUP BY t.date"); + + $weekoneQ = $ts_db->prepare_statement("SELECT ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 13 + AND t.date >= DATE(p.periodStart) + AND t.date < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + + $weektwoQ = $ts_db->prepare_statement("SELECT ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 13 + AND t.date >= DATE(date_add(p.periodStart, INTERVAL 7 day)) AND t.date <= DATE(p.periodEnd)"); + + $vacationQ = $ts_db->prepare_statement("SELECT ROUND(vacation, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area = 13"); + + $weekoneR = $ts_db->exec_statement($weekoneQ,array($emp_no,$periodID)); + $weektwoR = $ts_db->exec_statement($weektwoQ,array($emp_no,$periodID)); + $vacationR = $ts_db->exec_statement($vacationQ,array($emp_no,$periodID)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + if ($ts_db->num_rows($vacationR) != 0) { + list($vacation) = $ts_db->fetch_row($vacationR); + } elseif (is_null($vacation)) { + $vacation = 0; + } else { + $vacation = 0; + } + + $result = $ts_db->exec_statement($query,array($emp_no,$periodID)); + if ($ts_db->num_rows($result) > 0) { + ob_start(); + $first = TRUE; + $periodHours = 0; + while ($row = $ts_db->fetch_row($result)) { + if ($first == TRUE) { + echo "

        Timesheet for $row[3] from $row[4] to $row[5]:

        "; + echo ''; + } + if ($row[0] > 24) {$fontopen = ''; $fontclose = '';} + else {$fontopen = NULL; $fontclose = NULL;} + echo ""; + $first = FALSE; + $periodHours += $row[0]; + } + + $roundhour = explode('.', number_format($periodHours, 2)); + + if ($roundhour[1] < 13) {$roundhour[1] = 00;} + elseif ($roundhour[1] >= 13 && $roundhour[1] < 37) {$roundhour[1] = 25;} + elseif ($roundhour[1] >= 37 && $roundhour[1] < 63) {$roundhour[1] = 50;} + elseif ($roundhour[1] >= 63 && $roundhour[1] < 87) {$roundhour[1] = 75;} + elseif ($roundhour[1] >= 87) {$roundhour[1] = 00; $roundhour[0]++;} + + $periodHours = number_format($roundhour[0] . '.' . $roundhour[1], 2); + + echo "
        DateTotal Hours Worked
        $row[1]$fontopen$row[0]$fontclose(Edit)
        +

        Total hours in this pay period: $periodHours

        +

        Week One: "; + if ($weekone > 40) {echo ''; $font = '';} else {$font = NULL;} + echo "$weekone" . $font . "

        +

        Week Two: "; + if ($weektwo > 40) {echo ''; $font = '';} else {$font = NULL;} + echo "$weektwo" . $font . "

        +

        Vacation Pay: "; + if ($vacation > 0) {echo ''; $font = '';} else {$font = NULL;} + echo "$vacation" . $font . "

        "; + return ob_get_clean(); + } + else { + return '

        There is no timesheet available for that pay period.

        '; + } + + } + + return 'Error: no data provided'; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new PayrollDetail(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/PayrollSummaryPage.php b/fannie/modules/plugins2.0/TimesheetPlugin/PayrollSummaryPage.php new file mode 100644 index 000000000..fb52834dc --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/PayrollSummaryPage.php @@ -0,0 +1,328 @@ +header = 'Timeclock - Payroll Summary'; + $this->title = 'Fannie - Administration Module'; + return True; + } + + function javascript_content(){ + ob_start(); + ?> + + prepare_statement("SELECT ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2), + t.emp_no, + e.RealFirstName, + date_format(p.periodStart, '%M %D, %Y'), + date_format(p.periodEnd, '%M %D, %Y'), + e.card_no, + e.LastName + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_OP_DB}.employees AS e + ON (t.emp_no = e.emp_no) + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (t.periodID = p.periodID) + WHERE t.periodID = ? + AND t.area NOT IN (13, 14) + GROUP BY t.emp_no + ORDER BY e.RealFirstName ASC"); + + $result = $ts_db->exec_statement($query,array($periodID)); + + $periodQ = $ts_db->prepare_statement("SELECT periodStart, periodEnd + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $periodR = $ts_db->exec_statement($periodQ,array($periodID)); + list($periodStart, $periodEnd) = $ts_db->fetch_row($periodR); + + if ($ts_db->num_rows($result) > 0) { + $first = TRUE; + + // Counter variables. + $totalPeriodHours = 0; + $totalWeekOne = 0; + $totalWeekTwo = 0; + $totalVacation = 0; + $totalPrevious = 0; + $count = 0; + $totalHouseCharge = 0; + $hours = array(); + + $bg = '#eeeeee'; + $prevP = $ts_db->prepare_statement("SELECT + SUM(ROUND(TIMESTAMPDIFF(MINUTE, time_in, time_out)/60,2)), + tdate, DAYOFWEEK(date) + FROM timesheet + WHERE emp_no = ? + AND periodID = ? + AND tdate NOT BETWEEN ? AND ? + GROUP BY date"); + $weekP = $ts_db->prepare_statement("SELECT + DATE_ADD(?, INTERVAL (1-?) DAY) AS weekStart, + DATE_ADD(?, INTERVAL (7-?) DAY) AS weekEnd)"); + $tsP = $ts_db->prepare_statement("SELECT + SUM(ROUND(TIMESTAMPDIFF(MINUTE, time_in, time_out)/60,2)) + FROM timesheet + WHERE emp_no = ? + AND tdate BETWEEN ? AND ?"); + $weekoneP = $ts_db->prepare_statement("SELECT + ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.tdate >= DATE(p.periodStart) + AND t.tdate < DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.area NOT IN (31)"); + $weektwoP = $ts_db->prepare_statement("SELECT + ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.tdate >= DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.tdate <= DATE(p.periodEnd) + AND t.area NOT IN (31)"); + $vacationP = $ts_db->prepare_statement("SELECT ROUND(vacation, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area = 31"); + $oncallP = $ts_db->prepare_statement("SELECT + ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area =100"); + while ($row = $ts_db->fetch_array($result)) { + $emp_no = $row[1]; + $cn = $row[5]; + + $yearStart = substr($periodStart, 0, 4); + $yearEnd = substr($periodEnd, 0, 4); + + $prevR = $ts_db->exec_statement($prevP,array($emp_no,$periodID, + $periodStart,$periodEnd)); + + if ($ts_db->num_rows($prevR) > 0) { + $totalPHours[$emp_no] = 0; + $totalPOT[$emp_no] = 0; + + while (list($pHours, $pDate, $pDay) = $ts_db->fetch_row($prevR)) { + // Get a week range for the old payday. + $weekR = $ts_db->exec_statement($weekP,array( + $pDate,$pDay,$pDate,$pDay)); + + list($weekStart, $weekEnd) = $ts_db->fetch_row($weekR); + // echo $weekStart . " & " . $weekEnd . " & " . $emp_no; + $R = $ts_db->exec_statement($tsP,array($emp_no,$weekStart,$weekEnd)); + + list($totalHours) = $ts_db->fetch_row($R); + + $prevOT = NULL; + if (($totalHours > 40) && ($totalHours - $pHours < 40) && (!$week[$startWeek])) + $prevOT = $totalHours - 40; + + $week[$startWeek] = TRUE; + + $totalPHours[$emp_no] += $pHours; + $totalPOT[$emp_no] += $prevOT; + + } + } + + + if ($yearStart == $yearEnd) { + $houseChargeQ = "SELECT ROUND(SUM(d.total),2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.trans_$yearStart AS d + WHERE d.datetime BETWEEN '$periodStart' AND '$periodEnd' + AND d.trans_subtype = 'MI' + AND d.card_no = $cn + AND d.emp_no <> 9999 AND d.trans_status <> 'X'"; + } + else { + $houseChargeQ = "SELECT ROUND(SUM(Total),2) + FROM ("; + + $houseChargeQ .= "SELECT ROUND(SUM(d.total),2) AS Total + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.trans_$yearStart AS d + WHERE d.datetime BETWEEN '$periodStart' AND '$periodEnd' + AND d.trans_subtype = 'MI' + AND d.card_no = $cn + AND d.emp_no <> 9999 AND d.trans_status <> 'X'"; + + $houseChargeQ .= " UNION ALL SELECT ROUND(SUM(d.total),2) AS Total + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.trans_$yearEnd AS d + WHERE d.datetime BETWEEN '$periodStart' AND '$periodEnd' + AND d.trans_subtype = 'MI' + AND d.card_no = $cn + AND d.emp_no <> 9999 AND d.trans_status <> 'X') AS yearSpan"; + } + + $weekoneR = $ts_db->exec_statement($weekoneP,array($emp_no,$periodID)); + $weektwoR = $ts_db->exec_statement($weektwoP,array($emp_no,$periodID)); + $vacationR = $ts_db->exec_statement($vacationP,array($emp_no,$periodID)); + $oncallR = $ts_db->exec_statement($oncallP,array($emp_no,$periodID)); + + $roundhour = explode('.', number_format($row[0], 2)); + + if ($roundhour[1] < 13) {$roundhour[1] = 00;} + elseif ($roundhour[1] >= 13 && $roundhour[1] < 37) {$roundhour[1] = 25;} + elseif ($roundhour[1] >= 37 && $roundhour[1] < 63) {$roundhour[1] = 50;} + elseif ($roundhour[1] >= 63 && $roundhour[1] < 87) {$roundhour[1] = 75;} + elseif ($roundhour[1] >= 87) {$roundhour[1] = 00; $roundhour[0]++;} + + $row[0] = number_format($roundhour[0] . '.' . $roundhour[1], 2); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + + if ($ts_db->num_rows($vacationR) != 0) { + list($vacation) = $ts_db->fetch_row($vacationR); + } elseif (!isset($vacation) || is_null($vacation)) { + $vacation = 0; + } else { + $vacation = 0; + } + + list($oncall) = $ts_db->fetch_row($oncallR); + if (is_null($oncall)) $oncall = 0; + // list($houseCharge) = $ts_db->fetch_row($houseChargeR); + // $houseCharge = number_format($houseCharge * -1, 2); + // if (is_null($houseCharge)) + $houseCharge = '0.00'; + + if ($first == TRUE) { + echo "

        Payroll Summary for $row[3] to $row[4]:

        "; + echo ''; + } + $bg = ($bg == '#eeeeee' ? '#ffffff' : '#eeeeee'); // Switch the background color. + if ($row[0] > 80 || (isset($totalPOT[$emp_no]) && $totalPOT[$emp_no] > 0) ) {$fontopen = ''; $fontclose = '';} else {$fontopen = NULL; $fontclose = NULL;} + printf(""; + + if (isset($totalPOT[$emp_no]) && $totalPOT[$emp_no] > 0) {$fontopen = ''; $fontclose = '';} else {$fontopen = NULL; $fontclose = NULL;} + echo ""; + + if ($weekone > 40) {$fontopen = ''; $fontclose = '';} else {$fontopen = NULL; $fontclose = NULL;} + echo ""; + if ($weektwo > 40) {$fontopen = ''; $fontclose = '';} else {$fontopen = NULL; $fontclose = NULL;} + echo ""; + if ($vacation > 0) {$fontopen = ''; $fontclose = '';} else {$fontopen = NULL; $fontclose = NULL;} + echo ""; + echo ""; + echo ""; + + $first = FALSE; + + // Counter variables. + $totalPeriodHours += $row[0]; + $totalWeekOne += $weekone; + $totalWeekTwo += $weektwo; + $totalVacation += $vacation; + $totalPrevious += (isset($totalPHours[$emp_no]) ? $totalPHours[$emp_no] : 0); + ++$count; + $totalHouseCharge += $houseCharge; + } + + printf(' + + + + + + + + + + +
        EmployeeTotal Hours WorkedPrevious Pay PeriodsWeek OneWeek TwoVacation HoursHouse ChargesDetailed View
        %s%s%s", $row[2] . " " . substr($row[6], 0, 1), $fontopen, $row[0]); + if ($oncall > 0) {echo '
        (On Call: ' . $oncall . ')
        ';} + echo "$fontclose
        $fontopen" . (isset($totalPHours[$emp_no]) && $totalPHours[$emp_no] > 0 ? number_format($totalPHours[$emp_no], 2) : "N/A") . (isset($totalPOT[$emp_no]) && $totalPOT[$emp_no] > 0 ? "(" . number_format($totalPOT[$emp_no], 2) . ")" : NULL) . "$fontclose$fontopen$weekone$fontclose$fontopen$weektwo$fontclose$fontopen$vacation$fontclose$$houseCharge(Detailed View)
        Totals%.2f%s%.2f%.2f%.2f$%.2f%u Employees

        ', $totalPeriodHours, + $totalPrevious > 0 ? number_format($totalPrevious, 2) : "N/A", + $totalWeekOne, $totalWeekTwo, $totalVacation, + $totalHouseCharge, $count); + } + else { + echo '

        There is no timesheet available for that pay period.

        '; + } + } + else { + $query = $ts_db->prepare_statement("SELECT FirstName, emp_no FROM " + .$FANNIE_OP_DB.$ts_db->sep()."employees + WHERE EmpActive=1 ORDER BY FirstName ASC"); + $result = $ts_db->exec_statement($query); + echo '
        '; + $currentQ = $ts_db->prepare_statement("SELECT periodID-1 FROM + {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT DATE_FORMAT(periodStart, '%M %D, %Y'), + DATE_FORMAT(periodEnd, '%M %D, %Y'), periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()); + $result = $ts_db->exec_statement($query); + + echo '

        Pay Period:

        '; + + echo ' + +
        '; + } + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new PayrollSummaryPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetExport.php b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetExport.php new file mode 100644 index 000000000..38679ff59 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetExport.php @@ -0,0 +1,189 @@ +title = "Timeclock - EXPORT"; + $this->header = "TimeclockExport"; + $this->report_cache = 'none'; + + if (FormLib::get_form_value('Run') == 'run'){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + + return True; + } + + function form_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + include('./includes/header.html'); + + echo "
        "; + + $currentQ = $ts_db->prepare_statement("SELECT periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Pay Period:

        '; + } + + function fetch_report_data(){ + global $ts_db, $FANNIE_PLUGIN_SETTINGS, $FANNIE_OP_DB; + $periodID = FormLib::get_form_value('period',0); + $_SESSION['periodID'] = $periodID; + $perDatesQ = $ts_db->prepare_statement("SELECT * FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".payperiods WHERE periodID = ?"); + $perDatesR = $ts_db->exec_statement($perDatesQ,array($periodID)); + $perDates = $ts_db->fetch_array($perDatesR); + + $dumpQ = $ts_db->prepare_statement("SELECT t.date, e.emp_no, e.LastName, e.FirstName, t.area, SUM(t.hours) AS hours + FROM (SELECT emp_no,FirstName, LastName FROM ".$FANNIE_OP_DB.".employees WHERE empActive = 1) e + LEFT JOIN ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t ON e.emp_no = t.emp_no + AND t.periodID = ? GROUP BY e.emp_no"); + $result = $ts_db->exec_statement($dumpQ,array($periodID)); + + $data = array(); + $data[] = array("TC"); + $data[] = array("00001"); + $nonPTOtotalP = $ts_db->prepare_statement("SELECT SUM(hours) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID = ? AND area <> 31 AND emp_no = ?"); + $weekoneP = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(p.periodStart) + AND t.tdate < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + $weektwoP = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.tdate <= DATE(p.periodEnd)"); + $vacationP = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area = 31"); + while ($row = $ts_db->fetch_row($result)) { + $nonPTOtotalr = $ts_db->exec_statement($nonPTOtotalP,array($periodID,$row['emp_no'])); + $nonPTOtotal = $ts_db->fetch_row($nonPTOtotalr); + + $nonPTOtot = $nonPTOtotal[0]; + $date = (is_null($row['date'])) ? 0 : $row['date']; + $area = (is_null($row['area'])) ? 0 : $row['area']; + $hours = (is_null($row['hours'])) ? 0 : $row['hours']; + + if ($hours > 0) { + + + $weekoneR = $ts_db->exec_statement($weekoneP,array($row['emp_no'],$periodID)); + $weektwoR = $ts_db->exec_statement($weektwoP,array($row['emp_no'],$periodID)); + $vacationR = $ts_db->exec_statement($vacationP,array($row['emp_no'],$periodID)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + list($pto) = $ts_db->fetch_row($vacationR); + if (is_null($pto)) $pto = 0; + + $ft = 40; + + + $otime1 = (($weekone - $ft) < 0) ? 0 : $weekone - $ft; + $otime2 = (($weektwo - $ft) < 0) ? 0 : $weektwo - $ft; + $otime = $otime1 + $otime2; + $total = ($otime != 0) ? $ft + (($otime2 != 0) ? $ft : $weektwo) : $nonPTOtot; + + $record = array(strftime("%D",strtotime($date)), + $row['emp_no'],$row['LastName'], + $row['FirstName'], "01", + number_format($total,2)); + $data[] = $record; + + if ($weekone > $ft || $weektwo > $ft) { + $ot_record = array(strftime("%D",strtotime($date)), + $row['emp_no'],$row['LastName'], + $row['FirstName'], "02", + number_format($otime,2)); + $data[] = $ot_record; + } + if ($pto != 0) { + $pto_record = array(strftime("%D",strtotime($date)), + $row['emp_no'],$row['LastName'], + $row['FirstName'], "08", + number_format($pto,2)); + $data[] = $pto_record; + } + + } + else { + $null_record = array(strftime("%D",strtotime($row['periodEnd'])), + $row['emp_no'],$row['LastName'], + $row['FirstName'], "01", "0.00"); + $data[] = $null_record; + } + } + return $data; + } + + function earncode($val) { + // Surepay earning codes: + // 01 regular + // 02 o/time = >40 / week + // 08 other h + + $area = "01"; + + return $area; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TimesheetExport(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetGeneralReport.php b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetGeneralReport.php new file mode 100644 index 000000000..c97bead45 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetGeneralReport.php @@ -0,0 +1,88 @@ +"; + + $currentQ = $ts_db->prepare_statement("SELECT periodID FROM + {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods WHERE + ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Starting Pay Period:

        '; + + if ($_GET['Export'] == 'export') { + $periodID = $_GET['period']; + + $query = $ts_db->prepare_statement("SELECT s.ShiftID as id, + IF(s.NiceName='', s.ShiftName, s.NiceName) as area + FROM (SELECT ShiftID, NiceName, ShiftName, ShiftOrder FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".shifts WHERE visible = 1) s + GROUP BY s.ShiftID ORDER BY s.ShiftOrder"); + // echo $query; + $result = $ts_db->exec_statement($query); + + $oneP = $ts_db->prepare_statement("SELECT SUM(IF(? = 31, t.vacation,t.hours)) as total + FROM ". $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.periodID = ? AND t.area = ?"); + $twoP = $ts_db->prepare_statement("SELECT SUM(e.pay_rate) as agg FROM ". + $FANNIE_OP_DB.$ts_db->sep()."employees e, ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.emp_no = e.emp_no AND t.periodID = ? AND t.area = ?"); + echo "\n + \n\n"; + while ($row = $ts_db->fetch_row($result)) { + + echo ""; + + // echo $query2; + $result2 = $ts_db->exec_statement($twoP,array($periodID,$row['id'])); + $totAgg = $ts_db->fetch_row($result2); + $agg = ($totAgg[0]) ? $totAgg[0] : 0; + + $wages = $tot * $agg; + + echo "\n"; + } + echo "
        IDAreaTotalwages
        ".$row['id']."".$row['area'].""; + + // echo $query1; + $result1 = $ts_db->exec_statement($oneP,array($row['id'],$periodID,$row['id'])); + $totHrs = $ts_db->fetch_row($result1); + $tot = ($totHrs[0]) ? $totHrs[0] : 0; + + echo $tot . "" . money_format('%#8n', $wages) . "
        \n"; + } + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TimesheetGeneralReport(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetPage.php b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetPage.php new file mode 100644 index 000000000..fb7aa64b1 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetPage.php @@ -0,0 +1,249 @@ +header = 'Timeclock - Entry'; + $this->title = 'Fannie - Administration Module'; + $this->display_func = ''; + + $max = ($_GET['max']) ? 10 : 10; // Max number of entries. + + if (!$this->current_user && $_GET['login'] == 1 ){ + $this->login_redirect(); + return False; + } + + if (isset($_POST['submitted'])) { // If the form has been submitted. + // Validate the data. + $this->errors = array(); + $date = $_POST['date']; + + if (strtotime($date) > strtotime(date('Y-m-d'))) { + $this->errors[] = 'You can\'t enter hours for a future date.'; + } + + // Make sure we're in a valid pay period. + $query = $ts_db->prepare_statement("SELECT periodID, periodStart FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']. + ".payperiods WHERE ? BETWEEN DATE(periodStart) AND DATE(periodEnd)"); + + $result = $ts_db->exec_statement($query,array($date)); + list($periodID, $periodStart) = $ts_db->fetch_row($result); + + $query = $ts_db->prepare_statement("SELECT DATEDIFF(CURDATE(), DATE(periodEnd)) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".payperiods WHERE periodID = ?"); + + $result = $ts_db->exec_statement($query,array($periodID)); + list($datediff) = $ts_db->fetch_row($result); + + $empnoChkQ = $ts_db->prepare_statement("SELECT * FROM employees WHERE emp_no = ?"); + $empnoChkR = $ts_db->exec_statement($empnoChkQ,array($_POST['emp_no'])); + + if ($_POST['emp_no'] && ($_POST['emp_no'] != '')) { + if (!is_numeric($_POST['emp_no'])) { + $this->errors[] = 'Employee number entered is not numeric.'; + } elseif ($ts_db->num_rows($empnoChkR) != 1) { + $this->errors[] = 'Error finding that Employee Number.'; + } else { + $emp_no = $_POST['emp_no']; + } + } else { + $this->errors[] = 'Please enter an Employee Number.'; + } + + // if ($datediff > 1) { // Bad. + // $this->errors[] = 'You can\'t add hours more than a day after the pay period has ended.'; + // $date = NULL; + // } + $entrycount = 0; + for ($i = 1; $i <= $max; $i++) { + if (($_POST['hours' . $i]) && (is_numeric($_POST['area' . $i]))) { + $entrycount++; + } + } + // echo $entrycount; + $lunch = $_POST['lunch']; + $hour = array(); + $area = array(); + if ($entrycount == 0) { + $this->errors[] = "You didn't enter any hours or labor categories."; + } else { + for ($i = 1; $i <= $max; $i++) { + if ((isset($_POST['hours' . $i])) && (is_numeric($_POST['area' . $i]))) { + $hours[$i] = $_POST['hours' . $i]; + $area[$i] = $_POST['area' . $i]; + } + } + } + + if (empty($this->errors)) { // All good. + + setcookie("timesheet", $emp_no, time()+60*3); + + // First check to make sure they haven't already entered hours for this day. + $query = $ts_db->prepare_statement("SELECT * FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']. + ".timesheet WHERE emp_no=? AND tdate=? and area <> 31"); + + $result = $ts_db->exec_statement($query,array($emp_no,$date)); + if ($ts_db->num_rows($result) == 0) { // Success. + // if (strtotime($date) < strtotime($periodStart)) { + // echo "Previous Pay period!!!"; + // exit; + // } + $successcount = 0; + $insP = $ts_db->prepare_statement("INSERT INTO ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']. + ".timesheet (emp_no, hours, area, tdate, periodID) + VALUES (?,?,?,?,?)"); + for ($i = 1; $i <= $entrycount; $i++) { + $result = $ts_db->exec_statement($insP,array( + $emp_no, $_POST['hours'.$i], + $_POST['area'.$i],$date,$periodID + )); + if ($ts_db->affected_rows() == 1) {$successcount++;} + } + if ($successcount == $entrycount) { + $this->display_func = 'ts_success'; + } else { + $this->errors[] = 'ERR01: The entered hours could not be added, please try again later.'; + $this->errors[] = 'Error: ' . $ts_db->error(); + $this->errors[] = 'Query: ' . $query; + $this->display_func = 'ts_error'; + } + + } else { + $this->errors[] = 'You have already entered hours for that day, please edit that day instead.'; + $this->display_func = 'ts_error'; + } + } else { // Report errors. + $this->display_func = 'ts_error'; + } + } + return True; + } + + function javascript_content(){ + ob_start(); + ?> + window.onload = initAll; + function initAll() { + for (var i = 1; i <= 5 ; i++) { + document.getElementById(i + "14").disabled = true; + } + } + //this function was used by Matthaus (#7012) to hide certain Categories + function updateshifts(sIndex) { + if (sIndex == 7012) { + for (var i = 1; i <= 5 ; i++) { + document.getElementById(i + "14").disabled = false; + } + } else { + for (var i = 1; i <= 5 ; i++) { + document.getElementById(i + "14").disabled = true; + } + } + } +

        Success!

        "; + echo '

        If you like, you may add more hours + or you can edit hours.

        '; + } + + function error_content(){ + include ('./includes/header.html'); + echo '

        The following error(s) occurred:

        '; + foreach ($this->errors AS $message) { + echo "

        - $message

        "; + } + echo '

        Please try again.

        '; + } + + function body_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_URL, $FANNIE_PLUGIN_SETTINGS; + include ('./includes/header.html'); + /** + if preprocess() changed the setting for display_func + based on form input, show that content instead of + the default form + */ + if ($this->display_func == 'ts_success') + return $this->success_content(); + elseif ($this->display_func == 'ts_error') + return $this->error_content(); + + echo ""; + echo '
        '; + echo ''; + if ($this->current_user){ + echo ''; + } else { + echo ""; + } + echo ''; + echo ""; + echo ""; + $queryP = $ts_db->prepare_statement("SELECT IF(NiceName='', ShiftName, NiceName), ShiftID + FROM " . $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'] . ".shifts + WHERE visible=true ORDER BY ShiftOrder ASC"); + for ($i = 1; $i <= $max; $i++) { + echo ""; + + $result = $ts_db->exec_statement($queryP); + echo '' . "\n"; + } + echo ' + +

        Name:   *

        Employee Number*:

        Date*: +


        Total HoursLabor Category

        + +
        '; + if ($this->current_user){ + echo ""; + } else { + echo ""; // class='loginbox' + } + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TimesheetPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetPlugin.php b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetPlugin.php new file mode 100644 index 000000000..eb5a29570 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TimesheetPlugin.php @@ -0,0 +1,84 @@ + array('default'=>'core_timesheet','label'=>'Database', + 'description'=>'Database to store timesheet information. Can + be one of the default CORE databases or a + separate one.') + ); + + public $plugin_description = 'Plugin for timeclock operations'; + + + public function setting_change(){ + global $FANNIE_ROOT, $FANNIE_PLUGIN_SETTINGS; + + $db_name = $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']; + if (empty($db_name)) return; + + $dbc = FannieDB::get($db_name); + + $errors = array(); + $errors[] = $this->plugin_db_struct($dbc, 'payperiods', $db_name); + $errors[] = $this->plugin_db_struct($dbc, 'shifts', $db_name); + $errors[] = $this->plugin_db_struct($dbc, 'timesheet', $db_name); + + foreach($errors as $e){ + if ($e === True) continue; + echo 'TimesheetPlugin error: '.$e.'
        '; + } + } + + public function plugin_enable(){ + ob_start(); + $try = createClass('timesheet_access', + 'Grants user permission to use the + Timesheet plugin'); + ob_end_clean(); + if ($try === False){ + echo 'Failed to create authentication class. + Make sure authentication is enabled in + Fannie and you\'re logged in as an admin + then try turning Timesheet on and off + again'; + } + } +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TsAreasReport.php b/fannie/modules/plugins2.0/TimesheetPlugin/TsAreasReport.php new file mode 100644 index 000000000..8237cedde --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TsAreasReport.php @@ -0,0 +1,96 @@ +header = "Timeclock - Labor Category Totals"; + $this->title = "Timeclock - Labor Category Totals"; + return True; + } + + function body_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + include('./includes/header.html'); + + echo "
        "; + + $currentQ = $ts_db->prepare_statement("SELECT periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Starting Pay Period:   

        '; + + if (FormLib::get_form_value('Export') == 'export') { + $periodID = FormLib::get_form_value('period',0); + + $query = $ts_db->prepare_statement("SELECT s.ShiftID as id, + CASE WHEN s.NiceName='' OR s.NiceName IS NULL THEN s.ShiftName + ELSE s.NiceName END as area + FROM (SELECT ShiftID, NiceName, ShiftName, ShiftOrder + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".shifts WHERE visible = 1) s + GROUP BY s.ShiftID ORDER BY s.ShiftOrder"); + // echo $query; + $result = $ts_db->exec_statement($query); + echo "\n + \n\n"; + $queryP = $ts_db->prepare_statement("SELECT SUM(IF(".$row['id']." = 31, t.vacation,t.hours)) as total + FROM ". $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.periodID = ? AND t.area = ?"); + $query2P = $ts_db->prepare_statement("SELECT SUM(e.pay_rate) as agg FROM ".$FANNIE_OP_DB.".employees e, ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.emp_no = e.emp_no AND t.periodID = ? AND t.area = ?"); + while ($row = $ts_db->fetch_row($result)) { + + echo ""; + + // echo $query2; + $result2 = $ts_db->exec_statement($query2,array($periodID,$row['id'])); + $totAgg = $ts_db->fetch_row($result2); + $agg = ($totAgg[0]) ? $totAgg[0] : 0; + + // echo ""; + + $wages = $tot * $agg; + + echo "\n"; + } + } + echo "
        IDAreaTotalwages
        ".$row['id']."".$row['area'].""; + + // echo $query1; + $result1 = $ts_db->exec_statement($queryP,array($periodID,$row['id'])); + $totHrs = $ts_db->fetch_row($result1); + $tot = ($totHrs[0]) ? $totHrs[0] : 0; + + echo $tot . "$agg" . money_format('%#8n', $wages) . "
        \n"; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsAreasReport(); + $obj->draw_page(); +} + + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TsEmployeesReport.php b/fannie/modules/plugins2.0/TimesheetPlugin/TsEmployeesReport.php new file mode 100644 index 000000000..458bf1202 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TsEmployeesReport.php @@ -0,0 +1,252 @@ +header = "Timeclock - Employees Report"; + $this->title = "Timeclock - Employees Report"; + return True; + } + + function body_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + include('./includes/header.html'); + // FULL TIME: Number of hours per week + $ft = 40; + + echo "
        "; + + $currentQ = $ts_db->prepare_statement("SELECT periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Starting Pay Period:
        "; + echo '

        Ending Pay Period:

        '; + if (FormLib::get_form_value('run') == 'run') { + $periodID = FormLib::get_form_value('period',0); + $end = FormLib::get_form_value('end',$periodID); + if ($end == 0) $end = $periodID; + + $namesq = $ts_db->prepare_statement("SELECT e.emp_no, e.FirstName, e.LastName, e.pay_rate, JobTitle + FROM employees e WHERE e.empActive = 1 ORDER BY e.LastName"); + $namesr = $ts_db->exec_statement($namesq); + $areasq = $ts_db->prepare_statement("SELECT ShiftName, ShiftID + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".shifts + WHERE visible = 1 AND ShiftID <> 31 ORDER BY ShiftOrder"); + $areasr = $ts_db->exec_statement($areasq); + $shiftInfo = array(); + while($row = $ts_db->fetch_row($areasr)){ + $shiftInfo[$row['ShiftID']] = $row['ShiftName']; + } + + $query1 = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + periodID as pid + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $result1 = $ts_db->exec_statement($query1,array($periodID)); + $periodStart = $ts_db->fetch_row($result1); + + $query2 = $ts_db->prepare_statement("SELECT date_format(periodEnd, '%M %D, %Y') as periodEnd, + periodID as pid + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $result2 = $ts_db->exec_statement($query2,array($end)); + $periodEnd = $ts_db->fetch_row($result2); + + // $periodct = ($end !== $periodID) ? $end - $periodID : 1; + $periodct = 0; + $p = array(); + for ($i = $periodStart[1]; $i <= $periodEnd[1]; $i++) { + // echo $i; + $periodct++; + $p[] = $i; + } + echo "
        "; + echo "

        " . $periodStart[0] . " — " . $periodEnd[0] . "

        \n"; + echo "Number of payperiods: " . $periodct . "\n"; + // + // END TITLE + echo "
        "; + + + echo "\n"; + while ($areas = $ts_db->fetch_array($areasr)) { + echo "
        "; // -- TODO vertical align th, static col width + } + echo "\n\n"; + $PTOnew = array(); + $totalP = $ts_db->prepare_statement("SELECT SUM(hours) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID >= ? AND periodID <= ? AND emp_no = ?"); + $depttotP = $ts_db->prepare_statement("SELECT SUM(t.hours) FROM + {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet t + WHERE t.periodID >= ? AND t.periodID <= ? + AND t.emp_no = ? AND t.area = ?"); + $weekoneQ = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(p.periodStart) + AND t.tdate < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + $weektwoQ = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.tdate <= DATE(p.periodEnd)"); + $usedP = $ts_db->prepare_statement("SELECT SUM(hours) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID >= ? AND periodID <= ? AND + emp_no = ? AND area = 31"); + $nonPTOtotalP = $ts_db->prepare_statement("SELECT SUM(hours) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID >= ? AND periodID <= ? + AND area <> 31 AND emp_no = ?"); + while ($row = $ts_db->fetch_row($namesr)) { + $emp_no = $row['emp_no']; + + $totalr = $ts_db->exec_statement($totalP,array($periodID,$end,$row['emp_no'])); + $total = $ts_db->fetch_row($totalr); + $color = ($total[0] > (80 * $periodct)) ? "FF0000" : "000000"; + echo ""; + $total0 = (!$total[0]) ? 0 : number_format($total[0],2); + // + // LABOR DEPARTMENT TOTALS + + foreach($shiftInfo as $area => $shiftName){ + // echo $depttotq; + $depttotr = $ts_db->exec_statement($depttotP,array($periodID,$end,$emp_no,$area)); + $depttot = $ts_db->fetch_row($depttotr); + $depttotal = (!$depttot[0]) ? 0 : number_format($depttot[0],2); + echo ""; + } + // END LABOR DEPT. TOTALS + + // + // OVERTIME + // + $otime = 0; + $otime1 = 0; + $otime2 = 0; + foreach ($p as $v) { + + + $weekoneR = $ts_db->exec_statement($weekoneQ,array($emp_no,$v)); + $weektwoR = $ts_db->exec_statement($weektwoQ,array($emp_no,$v)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + + if ($weekone > $ft) $otime1 = $weekone - $ft; + if ($weektwo > $ft) $otime2 = $weektwo - $ft; + $otime = $otime + $otime1 + $otime2; + } + $OT[] = $otime; + echo ""; + // END OVERTIME + + // + // PTO USED + $usedR = $ts_db->exec_statement($usedP,array($periodID,$end,$emp_no)); + $ptoused = $ts_db->fetch_row($usedR); + $PTOuse = (!$ptoused[0]) ? 0 : number_format($ptoused[0],2); + echo ""; + + // + // PTO CALC + $nonPTOtotalr = $ts_db->exec_statement($nonPTOtotalP,array($periodID,$end,$emp_no)); + $nonPTOtotal = $ts_db->fetch_row($nonPTOtotalr); + $ptoAcc = ($row['JobTitle'] == 'STAFF') ? $nonPTOtotal[0] * 0.075 : 0; + echo ""; + $PTOnew[] = $ptoAcc; + + // + // TOTAL + echo ""; + + echo ""; + } + echo ""; + + $areasr = $ts_db->exec_statement($areasq); + $TOT = array(); + $query = $ts_db->prepare_statement("SELECT ROUND(SUM(t.hours),2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet t + WHERE t.periodID BETWEEN ? AND ? + AND t.area = ?"); + foreach($shiftInfo as $area => $shiftName){ + // echo $query; + $totsr = $ts_db->exec_statement($query,array($periodID,$end,$area)); + $tots = $ts_db->fetch_row($totsr); + $tot = (!$tots[0] || $tots[0] == '') ? '0' : $tots[0]; + echo ""; + $TOT[] = $tot; + } + + $ptoq = $ts_db->prepare_statement("SELECT ROUND(SUM(t.hours),2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet t + WHERE t.periodID BETWEEN ? AND ? + AND t.area = 31"); + $ptor = $ts_db->exec_statement($ptoq,array($periodID,$end)); + $pto = $ts_db->fetch_row($ptor); + + $OTTOT = number_format(array_sum($OT),2); + echo ""; + + $PTOUSED = (!$pto[0] || $pto[0] == '') ? '0' : $pto[0]; + echo ""; + + $PTOTOT = number_format(array_sum($PTOnew),2); + echo ""; + + $TOTAL = number_format(array_sum($TOT),2); + echo ""; + + echo""; + echo "
        NameWage" . substr($areas[0],0,6) . "OTPTO usedPTO newTotal
        ".ucwords($row['FirstName'])." - " . ucwords(substr($row['FirstName'],0,1)) . ucwords(substr($row['LastName'],0,1)) . "$" . $row['pay_rate'] . "" . $depttotal . "" . $otime . "$PTOuse" . number_format($ptoAcc,2) . "" . $total0 . "
        TOTALS$tot$OTTOT$PTOUSED$PTOTOT$TOTAL
        \n"; + } // end 'run' button + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsEmployeesReport(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TsStaffMemReport.php b/fannie/modules/plugins2.0/TimesheetPlugin/TsStaffMemReport.php new file mode 100644 index 000000000..a18a3b0ea --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TsStaffMemReport.php @@ -0,0 +1,310 @@ +title = "Timeclock - Staff Member Totals Report"; + $this->header = "Timeclock - Staff Member Totals Report"; + if (!$this->current_user && $_GET['login'] == 1 ){ + $this->login_redirect(); + return False; + } + return True; + } + + function css_content(){ + ob_start(); + ?> + table th { + font-size: 8px; + text-transform: uppercase; + } + '; + $stored = ($_COOKIE['timesheet']) ? $_COOKIE['timesheet'] : ''; + if ($_SESSION['logged_in'] == True) { + echo '

        Name:   *

        '; + } + else { + echo "

        Employee Number*:

        "; + } + + + $currentQ = $ts_db->prepare_statement("SELECT periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Starting Pay Period:
        "; + echo '

        Ending Pay Period:

        '; + if (FormLib::get_form_value('run','') == 'run') { + + $emp_no = FormLib::get_form_value('emp_no',0); + $namesq = $ts_db->prepare_statement("SELECT e.emp_no, e.FirstName, e.LastName, e.pay_rate, JobTitle + FROM employees e WHERE e.emp_no = ? AND e.empActive = 1"); + $namesr = $ts_db->exec_statement($namesq,array($_GET['emp_no'])); + + if (!$namesr) { + echo "

        Error!

        Incorrect, invalid, or inactive employee number entered.

        +

        Please try again

        "; + } + else { + $name = $ts_db->fetch_row($namesr); + + setcookie("timesheet", $emp_no, time()+60*3); + + $periodID = FormLib::get_form_value('period',0); + $end = FormLib::get_form_value('end',$periodID); + if ($end == 0) $end = $periodID; + + $query1 = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + periodID as pid + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $result1 = $ts_db->exec_statement($query1,array($periodID)); + $periodStart = $ts_db->fetch_row($result1); + + $query2 = $ts_db->prepare_statement("SELECT date_format(periodEnd, '%M %D, %Y') as periodEnd, + periodID as pid + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods WHERE periodID = ?"); + $result2 = $ts_db->exec_statement($query2,array($end)); + $periodEnd = $ts_db->_fetch_row($result2); + $p = array(); + for ($i = $periodStart[1]; $i < $periodEnd[1]; $i++) { + $p[] = $i; + } + + $firstppP = $ts_db->prepare_statement("SELECT MIN(periodID) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE YEAR(periodStart) = YEAR(".$ts_db->now().")"); + $firstppR = $ts_db->exec_statement($firstppP); + $firstpp = $ts_db->fetch_row($firstppR); + $y = array(); + for ($i = $firstpp[0]; $i <= $periodEnd[1]; $i++) { + $y[] = $i; + } + + // $sql_incl = ""; + // $sql_excl = "AND emp_no <> 9999"; + $staffQ = $ts_db->prepare_statement("SELECT * FROM employees WHERE emp_no = ?"); + $staffR = $ts_db->exec_statement($staffQ,array($emp_no)); + $staff = $ts_db->fetch_row($staffR); + + echo "

        $emp_no — ".$staff['FirstName']." ". $staff['LastName']."

        "; + + // BEGIN TITLE + // + $query1 = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + periodID as pid, DATE(periodStart) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $result1 = $ts_db->exec_statement($query1,array($periodID)); + $periodStart = $ts_db->fetch_row($result1); + + $query2 = $ts_db->prepare_statement("SELECT date_format(periodEnd, '%M %D, %Y') as periodEnd, + periodID as pid, DATE(periodEnd) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $result2 = $ts_db->exec_statement($query2,array($end)); + $periodEnd = $ts_db->fetch_row($result2); + + // $periodct = ($end !== $periodID) ? $end - $periodID : 1; + for ($i = $periodStart[1]; $i <= $periodEnd[1]; $i++) { + // echo $i; + $periodct++; + $p[] = $i; + } + echo "

        " . $periodStart[0] . " — " . $periodEnd[0] . "

        \n"; + echo "Number of payperiods: " . $periodct . "\n"; + // + // END TITLE + echo "
        "; + + $areasq = $ts_db->prepare_statement("SELECT ShiftName, ShiftID + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".shifts + WHERE visible = 1 ORDER BY ShiftOrder"); + $areasr = $ts_db->exec_statement($areasq); + + $shiftInfo = array(); + echo "\n"; + while ($areas = $ts_db->fetch_array($areasr)) { + echo "
        "; // -- TODO vertical align th, static col width + $shiftInfo[$areas['ShiftID']] = $areas['ShiftName']; + } + echo "\n\n"; + + $weekQ = $ts_db->prepare_statement("SELECT emp_no, area, tdate, periodID, + hours, WEEK(tdate) as week_number + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE emp_no = ? + AND tdate >= ? AND tdate <= ? + GROUP BY WEEK(tdate)"); + $weekR = $ts_db->exec_statement($weekQ,array($emp_no,$periodStart[2],$periodEnd[2])); + + $totalP = $ts_db->prepare_statement("SELECT SUM(hours) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID >= ? AND periodID <= ? AND emp_no = ?"); + $depttotP = $ts_db->prepare_statement("SELECT SUM(t.hours) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet t + WHERE WEEK(t.tdate) = ? AND t.emp_no = ? AND t.area = ?"); + $nonPTOtotalP = $ts_db->prepare_statement("SELECT SUM(hours) FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID >= ? AND periodID <= ? AND area <> 31 + AND emp_no = ?"); + $weekoneP = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + AS p ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(p.periodStart) + AND t.tdate < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + $weektwoP = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.tdate <= DATE(p.periodEnd)"); + while ($row = $ts_db->fetch_row($weekR)) { + $week_no = $row['week_number']; + $emp_no = $row['emp_no']; + + $totalr = $ts_db->exec_statement($totalP,array($periodID,$end,$emp_no)); + $total = $ts_db->fetch_row($totalr); + $color = ($total[0] > (80 * $periodct)) ? "FF0000" : "000000"; + echo ""; + echo ""; + $total0 = (!$total[0]) ? 0 : number_format($total[0],2); + + + // + // LABOR DEPARTMENT TOTALS + foreach($shiftInfo as $area => $shiftName){ + // echo $depttotq; + $depttotr = $ts_db->exec_statement($depttotq,array($week_no,$emp_no,$area)); + $depttot = $ts_db->fetch_row($depttotr); + $depttotal = (!$depttot[0]) ? 0 : number_format($depttot[0],2); + echo ""; + } + // END LABOR DEPT. TOTALS + + + // TOTALS column + // echo ""; + + // + // PTO CALC + $nonPTOtotalr = $ts_db->exec_statement($nonPTOtotalP,array($periodID,$end,$emp_no)); + $nonPTOtotal = $ts_db->fetch_row($nonPTOtotalr); + $ptoAcc = ($row['JobTitle'] == 'STAFF') ? $nonPTOtotal[0] * 0.075 : 0; + echo ""; + + + echo ""; + + // + // OVERTIME + // + $otime1 = array(); + $otime2 = array(); + foreach ($p as $v) { + + + $weekoneR = $ts_db->exec_statement($weekoneP,array($emp_no,$v)); + $weektwoR = $ts_db->exec_statement($weektwoP,array($emp_no,$v)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + + if ($weekone > $ft) $otime1[] = $weekone - $ft; + if ($weektwo > $ft) $otime2[] = $weektwo - $ft; + // $otime = $otime + $otime1 + $otime2; + + } + $ot1 = array_sum($otime1); + $ot2 = array_sum($otime2); + $otime = $ot1 + $ot2; + // print_r($p); + echo ""; + $otime = 0; + $otime1 = array(); + $otime2 = array(); + // END OVERTIME + echo ""; + + } + echo "
        WeekNameWage" . substr($areas[0],0,6) . "PTO newTotalOT
        $week_no".ucwords($name['FirstName'])." - " . ucwords(substr($name['FirstName'],0,1)) . ucwords(substr($name['LastName'],0,1)) . "$" . $name['pay_rate'] . "" . $depttotal . "" . $total0 . "" . number_format($ptoAcc,2) . "" . $total0 . "" . $otime . "
        \n"; + } + + } // end 'run' button + + if ($this->current_user){ + echo ""; + } else { + echo ""; // class='loginbox' + } + } + + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsStaffMemReport(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/TsWagesReport.php b/fannie/modules/plugins2.0/TimesheetPlugin/TsWagesReport.php new file mode 100644 index 000000000..348126f2b --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/TsWagesReport.php @@ -0,0 +1,346 @@ +header = "Timeclock - Department Totals Report"; + $this->title = "Timeclock - Department Totals Report"; + setlocale(LC_MONETARY, 'en_US'); + return True; + } + + function body_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS; + include('./includes/header.html'); + // FULL TIME: Number of hours per week + $ft = 40; + + echo "
        "; + + $currentQ = $ts_db->prepare_statement("SELECT periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, + date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Starting Pay Period:
        "; + echo '

        Ending Pay Period:

        '; + + if (FormLib::get_form_value('Export') == 'export') { + $periodID = FormLib::get_form_value('period',0); + $end = FormLib::get_form_value('end',$periodID); + if ($end == 0) $end = $periodID; + + // BEGIN TITLE + // + $query1 = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y') as periodStart, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods WHERE periodID = ?"); + $result1 = $ts_db->exec_statement($query1,array($periodID)); + $periodStart = $ts_db->fetch_row($result1); + + $query2 = $ts_db->prepare_statement("SELECT date_format(periodEnd, '%M %D, %Y') as periodEnd, periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods WHERE periodID = ?"); + $result2 = $ts_db->exec_statement($query2,array($end)); + $periodEnd = $ts_db->fetch_row($result2); + + // $periodct = ($end !== $periodID) ? $end - $periodID : 1; + $p = array(); + $periodct = 0; + for ($i = $periodStart[1]; $i <= $periodEnd[1]; $i++) { + // echo $i; + $periodct++; + $p[] = $i; + } + + echo "
        "; + echo "

        " . $periodStart[0] . " — " . $periodEnd[0] . "

        "; + echo "Number of payperiods: " . $periodct; + // + // END TITLE + + $query = $ts_db->prepare_statement("SELECT s.ShiftID as id, + IF(s.NiceName='', s.ShiftName, s.NiceName) as area + FROM (SELECT ShiftID, NiceName, ShiftName, ShiftOrder + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".shifts WHERE visible = 1 AND ShiftID <> 31) s + GROUP BY s.ShiftID ORDER BY s.ShiftOrder"); + // echo $query; + $result = $ts_db->exec_statement($query); + + echo "\n + \n\n"; + + $queryP = $ts_db->prepare_statement("SELECT SUM(t.hours) as total + FROM ". $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.periodID >= ? AND t.periodID <= ? AND t.area = ?"); + $query2P = $ts_db->prepare_statement("SELECT SUM(e.pay_rate) as agg FROM ".$FANNIE_OP_DB.".employees e, ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.emp_no = e.emp_no AND t.periodID >= ? + AND t.periodID <= ? AND t.area = ?"); + while ($row = $ts_db->fetch_row($result)) { + + echo ""; + + $totArray[] = $tot; + // $totArray = array(); + // array_push($totArray, $tot); + // foreach ($tot as $t) { + // $totArray[] = $t; + // } + + $result2 = $ts_db->exec_statement($query2P,array($periodID,$end,$row['id'])); + $totAgg = $ts_db->fetch_row($result2); + $agg = ($totAgg[0]) ? $totAgg[0] : 0; + + // echo "\n"; + + $wageArray[] = $wages; + // $wageArray = array(); + // array_push($wageArray, $wages); + // foreach ($wages as $w) { + // $wageArray[] = $w; + // } + + if ($row['id'] == "31") $csvwages .= ""; // Hide PTO from copy&paste output + else $csvwages .= $wages . "\t"; + + if ($row['id'] == "31") $csvhours .= ""; + else $csvhours .= $tot . "\t"; + } + // print_r($totArray); + + echo ""; + echo " + + "; + // + // OVERTIME + // + $OT1 = array(); + $OT2 = array(); + $empP = $ts_db->prepare_statement("SELECT emp_no FROM employees WHERE EmpActive = 1"); + $weekoneP = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(p.periodStart) + AND t.tdate < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + $weektwoQ = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.tdate <= DATE(p.periodEnd)"); + foreach ($p as $v) { + $empR = $ts_db->exec_statement($empP); + while ($row = $ts_db->fetch_array($empR)) { + + $weekoneR = $ts_db->exec_statement($weekoneP,array($row['emp_no'],$v)); + $weektwoR = $ts_db->exec_statement($weektwoP,array($row['emp_no'],$v)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + + if ($weekone > $ft) $otime1 = $weekone - $ft; + if ($weektwo > $ft) $otime2 = $weektwo - $ft; + // $otime = $otime + $otime1 + $otime2; + $OT1[] = $otime1; + $OT2[] = $otime2; + $otime1 = 0; + $otime2 = 0; + } + } + // print_r($OT1); + $OT = array_sum($OT1) + array_sum($OT2); + $OTTOT = number_format($OT,2); + + echo ""; + // END OVERTIME + + // PTO REQUESTED + $ptoQ = $ts_db->prepare_statement("SELECT SUM(t.hours) as total FROM ". + $FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet t + WHERE t.periodID >= ? AND t.periodID <= ? AND t.area = 31"); + $ptoR = $ts_db->exec_statement($ptoQ,array($periodID,$end)); + $pto = $ts_db->fetch_row($ptoR); + $PTOREQ = number_format($pto[0],2); + echo ""; + // END PTO REQUESTED + + // PTO NEW + $empQ = $ts_db->prepare_statement("SELECT emp_no FROM employees + WHERE EmpActive = 1 AND JobTitle = 'STAFF'"); + $empR = $ts_db->exec_statement($empQ); + $nonPTOtotalP = $ts_db->prepare_statement("SELECT SUM(hours) + FROM ".$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase'].".timesheet + WHERE periodID >= ? AND periodID <= ? AND area <> 31 + AND emp_no = ?"); + $PTOnew = array(); + while ($row = $ts_db->fetch_array($empR)) { + $nonPTOtotalr = $ts_db->exec_statement($nonPTOtotalP,array($periodID,$end,$row['emp_no'])); + $nonPTOtotal = $ts_db->fetch_row($nonPTOtotalr); + $ptoAcc = $nonPTOtotal[0] * 0.075; + $PTOnew[] = $ptoAcc; + } + // print_r($PTOnew); + $PTONEW = number_format(array_sum($PTOnew),2); + echo ""; + // END PTO NEW + + echo "
        IDAreaTotal Hrswages
        ".$row['id']."".$row['area'].""; + + $result1 = $ts_db->exec_statement($queryP,array($periodID,$end,$row['id'])); + $totHrs = $ts_db->fetch_row($result1); + $tot = ($totHrs[0]) ? $totHrs[0] : 0; + + echo $tot . "$agg"; + + $wages = $tot * $agg; + + echo "" . money_format('%n', $wages) . "

         TOTALS" . number_format(array_sum($totArray),2) . "" . number_format(array_sum($wageArray),2) . "
         OT Total$OTTOT
         PTO Requested$PTOREQ
         PTO New$PTONEW
        \n"; + + echo "
        "; + echo "Copy & Paste Hours data (columns C:AB):"; + echo "
        "; + echo "Copy & Paste the OT/PTO Hours data (columns AG:AI):"; + echo "
        "; + // echo "
        "; + echo "Copy & Paste Wages data:"; + echo "
        "; + } + } + + function javascript_content(){ + ob_start(); + ?> + ZeroClipboard.setMoviePath( '../src/ZeroClipboard10.swf' ); + var clip = new ZeroClipboard.Client(); + clip.setText( '' ); // will be set later on mouseDown + clip.setHandCursor( true ); + clip.setCSSEffects( true ); + + clip.addEventListener( 'load', function(client) { + // alert( "movie is loaded" ); + }); + clip.addEventListener( 'complete', function(client, text) { + alert("Copied text to clipboard: " + text ); + }); + clip.addEventListener( 'mouseOver', function(client) { + // alert("mouse over"); + }); + clip.addEventListener( 'mouseOut', function(client) { + // alert("mouse out"); + }); + clip.addEventListener( 'mouseDown', function(client) { + // set text to copy here + clip.setText( document.getElementById('copyMe').value ); + + // alert("mouse down"); + }); + clip.addEventListener( 'mouseUp', function(client) { + // alert("mouse up"); + }); + + clip.glue( 'copyLink' ); + + + var clip1 = new ZeroClipboard.Client(); + clip1.setText( '' ); // will be set later on mouseDown + clip1.setHandCursor( true ); + clip1.setCSSEffects( true ); + + clip1.addEventListener( 'load', function(client) { + // alert( "movie is loaded" ); + }); + clip1.addEventListener( 'complete', function(client, text) { + alert("Copied text to clip1board: " + text ); + }); + clip1.addEventListener( 'mouseOver', function(client) { + // alert("mouse over"); + }); + clip1.addEventListener( 'mouseOut', function(client) { + // alert("mouse out"); + }); + clip1.addEventListener( 'mouseDown', function(client) { + // set text to copy here + clip1.setText( document.getElementById('copyMe2').value ); + + // alert("mouse down"); + }); + clip1.addEventListener( 'mouseUp', function(client) { + // alert("mouse up"); + }); + + clip1.glue( 'copyLink2' ); + + var clip2 = new ZeroClipboard.Client(); + clip2.setText( '' ); // will be set later on mouseDown + clip2.setHandCursor( true ); + clip2.setCSSEffects( true ); + + clip2.addEventListener( 'load', function(client) { + // alert( "movie is loaded" ); + }); + clip2.addEventListener( 'complete', function(client, text) { + alert("Copied text to clip2board: " + text ); + }); + clip2.addEventListener( 'mouseOver', function(client) { + // alert("mouse over"); + }); + clip2.addEventListener( 'mouseOut', function(client) { + // alert("mouse out"); + }); + clip2.addEventListener( 'mouseDown', function(client) { + // set text to copy here + clip2.setText( document.getElementById('copyMe3').value ); + + // alert("mouse down"); + }); + clip2.addEventListener( 'mouseUp', function(client) { + // alert("mouse up"); + }); + + clip2.glue( 'copyLink3' ); + draw_page(); +} diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/ViewsheetPage.php b/fannie/modules/plugins2.0/TimesheetPlugin/ViewsheetPage.php new file mode 100644 index 000000000..e8b2fc86b --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/ViewsheetPage.php @@ -0,0 +1,330 @@ +current_user && $_GET['login'] == 1 ){ + $this->login_redirect(); + return False; + } + // $loggedin = (isset($_COOKIE['verify'])) ? True : False; + + $this->header = 'Timesheet Management' . $_GET['login']; + $this->title = 'Fannie - Administration Module'; + $this->errors = array(); + $this->display_func = ''; + + $emp_no = FormLib::get_form_value('emp_no',''); + $periodID = FormLib::get_form_value('period',''); + $submitted = FormLib::get_form_value('submitted',False); + $addvaca = FormLib::get_form_value('addvaca',False); + + if ($submitted && $emp_no && is_numeric($emp_no) && $periodID && is_numeric($periodID)) { + $this->display_func = 'ts_show'; + } + elseif (isset($_POST['addvaca'])) { + $errors = array(); + $emp = FormLib::get_form_value('emp',''); + $date = date('Y-m-d'); + $vaca = FormLib::get_form_value('vaca',0); + $vacaID = FormLib::get_form_value('vacationID',''); + $perID = FormLib::get_form_value('period',''); + if (is_numeric($vaca)){ + $vaca = (float) $vaca; + + $roundvaca = explode('.', number_format($vaca, 2)); + + if ($roundvaca[1] < 13) {$roundvaca[1] = 00;} + elseif ($roundvaca[1] >= 13 && $roundvaca[1] < 37) {$roundvaca[1] = 25;} + elseif ($roundvaca[1] >= 37 && $roundvaca[1] < 63) {$roundvaca[1] = 50;} + elseif ($roundvaca[1] >= 63 && $roundvaca[1] < 87) {$roundvaca[1] = 75;} + elseif ($roundvaca[1] >= 87) {$roundvaca[1] = 00; $roundvaca[0]++;} + + $vaca = number_format($roundvaca[0] . '.' . $roundvaca[1], 2); + + } + else { + $errors[] = "Vacation hours to be used must be a number."; + $vaca = False; + } + + $vacaQ = ''; + $args = array(); + if ($vaca !== False && is_numeric($vacaID) && is_numeric($perID)) { + $vacaID = (int) $vacaID; + $perID = (int) $perID; + $vacaQ = "UPDATE {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet + SET tdate = ?, vacation = ? WHERE ID = ?"; + $args = array($date, $vaca, $vacaID); + } + elseif ($vaca !== False && $vacaID == 'insert' && is_numeric($perID)) { + $perID = (int) $perID; + $vacaQ = "INSERT INTO {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet + (emp_no, hours, area, vacation, tdate, periodID) + VALUES (?, ?, 31, ?, ?, ?)"; + $args = array($emp, $vaca, $vaca, $date, $perID); + } + + if (empty($errors)) { + $vacaP = $ts_db->prepare_statement($vacaQ); + $vacaR = $ts_db->exec_statement($vacaP,$args); + if ($vacaR) { + $url = $_SERVER['PHP_SELF']."?emp_no=$emp&period=$perID"; + header("Location: $url"); + return False; + } + else { + $this->errors[] = 'The vacation hours could not be added due to a system error, please try again later.'; + $this->display_func = 'ts_error'; + } + } + else { + $this->display_func = 'ts_error'; + } + } + else if ($submitted) { + $this->errors[] = 'You forgot to select your name.'; + $this->display_func = 'ts_error'; + } + + return True; + } + + function error_contents(){ + include ('./includes/header.html'); + echo "

        The following errors occurred:

          "; + + foreach ($this->errors as $msg) { + echo "

          - $msg

          "; + } + echo "



        "; + } + + function show_sheet($emp_no, $periodID){ + global $ts_db, $FANNIE_PLUGIN_SETTINGS, $FANNIE_OP_DB; + include ('./includes/header.html'); + + $ft = 40; + + $query = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2), + date_format(t.tdate, '%a %b %D'), + t.emp_no, + e.FirstName, + date_format(p.periodStart, '%M %D, %Y'), + date_format(p.periodEnd, '%M %D, %Y'), + t.date + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_OP_DB}.employees AS e + ON (t.emp_no = e.emp_no) + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (t.periodID = p.periodID) + WHERE t.emp_no = ? + AND t.area <> 31 + AND t.periodID = ? + AND (t.vacation IS NULL OR t.vacation = 0) + GROUP BY t.tdate"); + + $periodQ = $ts_db->prepare_statement("SELECT periodStart, periodEnd FROM + {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodID = ?"); + $periodR = $ts_db->exec_statement($periodQ,array($periodID)); + list($periodStart, $periodEnd) = $ts_db->fetch_row($periodR); + + $weekoneQ = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(p.periodStart) + AND t.tdate < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + $weekoneR = $ts_db->exec_statement($weekoneQ,array($emp_no, $periodID)); + + $weektwoQ = $ts_db->prepare_statement("SELECT ROUND(SUM(hours), 2) + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + INNER JOIN {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.tdate >= DATE(date_add(p.periodStart, INTERVAL 7 day)) AND t.tdate <= DATE(p.periodEnd)"); + $weektwoR = $ts_db->exec_statement($weektwoQ,array($emp_no, $periodID)); + + $vacationQ = "SELECT ROUND(hours, 2), ID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.timesheet AS t + WHERE t.emp_no = $emp_no + AND t.periodID = $periodID + AND t.area = 31"; + + $WageQ = $ts_db->prepare_statement("SELECT pay_rate FROM {$FANNIE_OP_DB}.employees WHERE emp_no = ?"); + + $WageR = $ts_db->exec_statement($WageQ, array($emp_no)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + + $vacation=0; + $vacationID=0; + if ($ts_db->num_rows($vacationR) != 0) + list($vacation, $vacationID) = $ts_db->fetch_row($vacationR); + + list($Wage) = $ts_db->fetch_row($WageR); + if (is_null($Wage)) $Wage = 0; + + $nameQ = $ts_db->prepare_statement("SELECT firstName FROM {$FANNIE_OP_DB}.employees WHERE emp_no=?"); + $nameR = $ts_db->exec_statement($nameQ,array($emp_no)); + list($name) = $ts_db->fetch_row($nameR); + + /** + I merged two sections a bit here rather than having separate + sections for when $query finds rows and when it doesn't + */ + + echo "

        Timesheet for $name from " . date_format(date_create($periodStart), 'F dS, Y') . + " to " . date_format(date_create($periodEnd), 'F dS, Y') . ": + View + Staff Member Totals +

        + + \n"; + + $result = $ts_db->exec_statement($query,array($emp_no,$periodID)); + + $periodHours = 0.00; + while ($row = $ts_db->fetch_array($result)) { + if ($row[0] > 24) { + $fontopen = ''; $fontclose = ''; + } + else { + $fontopen = NULL; + $fontclose = NULL; + } + echo "\n"; + $first = FALSE; + $periodHours += $row[0]; + } + if ($periodHours == 0.00) + echo ''; + + $roundhour = explode('.', number_format($periodHours, 2)); + if ($roundhour[1] < 13) {$roundhour[1] = 00;} + elseif ($roundhour[1] >= 13 && $roundhour[1] < 37) {$roundhour[1] = 25;} + elseif ($roundhour[1] >= 37 && $roundhour[1] < 63) {$roundhour[1] = 50;} + elseif ($roundhour[1] >= 63 && $roundhour[1] < 87) {$roundhour[1] = 75;} + elseif ($roundhour[1] >= 87) {$roundhour[1] = 00; $roundhour[0]++;} + + $periodHours = number_format($roundhour[0] . '.' . $roundhour[1], 2); + + echo "
        DateTotal Hours Worked
        $row[1]$fontopen$row[0]$fontclose + (Edit)
        No hours this period
        +
        +

        Total hours in this pay period: " . number_format($periodHours, 2) . "

        + "; + $ot1 = (($weekone - $ft) > 0) ? $weekone - $ft : 0; + if ($ot1 > 0) echo ""; + echo ""; + echo ""; + $ot2 = (($weektwo - $ft) > 0) ? $weektwo - $ft : 0; + if ($ot2 > 0) echo ""; + echo ""; + // echo ""; + echo " + + "; + $otime = ($ot1 + $ot2) * 1.5; + $week1 = ($weekone > $ft) ? $ft : $weekone; + $week2 = ($weektwo > $ft) ? $ft : $weektwo; + $gw = $Wage * ($week1 + $week2 + $vacation + $otime); + + echo ""; + echo "
        Week One: "; + if ($weekone > $ft) {echo ''; $font = '';} else {$font = NULL;} + echo number_format($weekone, 2) . $font . "OT: $ot1
        Week Two: "; + if ($weektwo > $ft) {echo ''; $font = '';} else {$font = NULL;} + echo number_format($weektwo, 2) . $font . "OT: $ot2
        Coming Soon-Amount House Charged: $" . number_format($houseCharge, 2) . "
        Paid Time Off (PTO): "; + echo "" . $font . " + + +
        Gross Wages (before taxes): $" . number_format($gw, 2) . "

        "; + } + + function body_content(){ + global $ts_db, $FANNIE_OP_DB, $FANNIE_PLUGIN_SETTINGS, $FANNIE_URL; + include ('./includes/header.html'); + + if ($this->display_func == 'ts_error') + return $this->error_contents(); + elseif ($this->display_func == 'ts_show') + return $this->show_sheet(FormLib::get_form_value('emp_no'),FormLib::get_form_value('period')); + + echo ""; + $query = $ts_db->prepare_statement("SELECT FirstName, LastName, emp_no + FROM {$FANNIE_OP_DB}.employees where EmpActive=1 ORDER BY FirstName ASC"); + $result = $ts_db->exec_statement($query); + echo '
        '; + + if ($_SESSION['logged_in'] == True) { + echo '

        Name:

        '; + } + else { + echo "

        Employee Number*:

        "; + } + $currentQ = $ts_db->prepare_statement("SELECT periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE ".$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + list($ID) = $ts_db->fetch_row($currentR); + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y'), + date_format(periodEnd, '%M %D, %Y'), periodID + FROM {$FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']}.payperiods + WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Pay Period:

        '; + + echo ' + +
        '; + if ($this->current_user){ + echo ""; + } + else { + echo ""; // class='loginbox' + } + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new ViewsheetPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/admin.php b/fannie/modules/plugins2.0/TimesheetPlugin/admin.php new file mode 100644 index 000000000..5c7eca219 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/admin.php @@ -0,0 +1,3 @@ + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminAdd.php b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminAdd.php new file mode 100644 index 000000000..d659a3fe9 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminAdd.php @@ -0,0 +1,249 @@ +errors[] = 'The date you have entered is not a valid date.'; + } + + if (strtotime($date) > strtotime(date('Y-m-d'))) { + $this->errors[] = 'You can\'t enter hours for a future date.'; + } + + // Make sure we're in a valid pay period. + $query = $ts_db->prepare_statement("SELECT periodID FROM payperiods + WHERE ".$ts_db->now()." BETWEEN DATE(periodStart) AND DATE(periodEnd)"); + $result = $ts_db->exec_statement($query); + list($periodID) = $ts_db->fetch_row($result); + + $emp_no = $_GET['emp_no']; + if (!is_numeric($_GET['emp_no'])) + $this->errors[] = 'You didn\'t select your name.'; + + $entrycount = 0; + for ($i = 1; $i <= $this->max; $i++) { + if ((isset($_GET['in' . $i])) && (isset($_GET['out' . $i])) && (is_numeric($_GET['area' . $i]))) { + $entrycount++; + } + } + + $lunch = $_GET['lunch']; + $hour = array(); + $area = array(); + + if ($entrycount == 0) { + $this->errors[] = "You didn't enter anys- hours."; + } + else { + for ($i = 1; $i <= $this->max; $i++) { + if ((isset($_GET['in' . $i])) && (isset($_GET['out' . $i])) && (is_numeric($_GET['area' . $i]))) { + if (strlen($_GET['in' . $i]) == 2 && is_numeric($_GET['in' . $i])) { + $_GET['in' . $i] = $_GET['in' . $i] . ':00'; + } elseif (strlen($_GET['in' . $i]) == 4 && is_numeric($_GET['in' . $i])) { + $_GET['in' . $i] = substr($_GET['in' . $i], 0, 2) . ':' . substr($_GET['in' . $i], 2, 2); + } elseif (strlen($_GET['in' . $i]) == 3 && is_numeric($_GET['in' . $i])) { + $_GET['in' . $i] = substr($_GET['in' . $i], 0, 1) . ':' . substr($_GET['in' . $i], 1, 2); + } elseif (strlen($_GET['in' . $i]) == 1 && is_numeric($_GET['in' . $i])) { + $_GET['in' . $i] = $_GET['in' . $i] . ':00'; + } + + if (strlen($_GET['out' . $i]) == 2 && is_numeric($_GET['out' . $i])) { + $_GET['out' . $i] = $_GET['out' . $i] . ':00'; + } elseif (strlen($_GET['out' . $i]) == 4 && is_numeric($_GET['out' . $i])) { + $_GET['out' . $i] = substr($_GET['out' . $i], 0, 2) . ':' . substr($_GET['out' . $i], 2, 2); + } elseif (strlen($_GET['out' . $i]) == 3 && is_numeric($_GET['out' . $i])) { + $_GET['out' . $i] = substr($_GET['out' . $i], 0, 1) . ':' . substr($_GET['out' . $i], 1, 2); + } elseif (strlen($_GET['out' . $i]) == 1 && is_numeric($_GET['out' . $i])) { + $_GET['out' . $i] = $_GET['out' . $i] . ':00'; + } + + $in = explode(':', $_GET['in' . $i]); + $out = explode(':', $_GET['out' . $i]); + + if (($_GET['inmeridian' . $i] == 'PM') && ($in[0] < 12)) { + $in[0] = $in[0] + 12; + } elseif (($_GET['inmeridian' . $i] == 'AM') && ($in[0] == 12)) { + $in[0] = 0; + } + if (($_GET['outmeridian' . $i] == 'PM') && ($out[0] < 12)) { + $out[0] = $out[0] + 12; + } elseif (($_GET['outmeridian' . $i] == 'AM') && ($out[0] == 12)) { + $out[0] = 0; + } + + $timein[$i] = $date . ' ' . $in[0] . ':' . $in[1] . ':00'; + $timeout[$i] = $date . ' ' . $out[0] . ':' . $out[1] . ':00'; + $area[$i] = $_GET['area' . $i]; + + if (strtotime($timein[$i]) >= strtotime($timeout[$i])) { + $this->errors[] = "You can't have gotten here after you finished work.

        Or, you couldn't have finished work before you started work."; + } + } + } + } + + if (empty($this->errors)) { // All good. + // First check to make sure they haven't already entered hours for this day. + $query = $ts_db->prepare_statement("SELECT * FROM timesheet WHERE emp_no=? AND date=?"); + $result = $ts_db->exec_statement($query,array($emp_no,$date)); + if ($ts_db->num_rows($result) == 0) { // Success. + $successcount = 0; + $query = $ts_db->prepare_statement("INSERT INTO timesheet + (emp_no, time_in, time_out, area, date, periodID) + VALUES (?,?,?,?,?,?)"); + for ($i = 1; $i <= $entrycount; $i++) { + $result = $ts_db->exec_statement($query,array( + $emp_no, $timein[$i], $timeout[$i], + $area[$i], $date, $periodID + )); + if ($ts_db->affected_rows() == 1) {$successcount++;} + } + if ($successcount != $entrycount) { + $this->errors[] = '

        The entered hours could not be added, please try again later.

        '; + $this->errors[] = '

        Error: ' . $ts_db->error() . '

        '; + $this->errors[] = '

        Query: ' . $query . '

        '; + return True; + } + $query = $ts_db->prepare_statement("INSERT INTO timesheet + (emp_no, time_out, time_in, area, date, periodID) + VALUES (?, '2008-01-01 00:00:00', ?, 0, ?, ?)"); + $result = $ts_db->exec_statement($query, array($emp_no, + ('2008-01-01 '.$lunch), $date, $periodID)); + if (!$result) { + $this->errors[] = '

        The entered hours could not be added, please try again later.

        '; + $this->errors[] = '

        Error: ' . $ts_db->error() . '

        '; + $this->errors[] = '

        Query: ' . $query . '

        '; + return True; + } + else { + // Start the redirect. + $url = sprintf('TsAdminView.php?emp_no=%d&periodID=%d', + $emp_no, $periodID); + header("Location: $url"); + return False; + } + } + else { + $this->errors[] = '

        You have already entered hours for that day, please edit that day instead.

        '; + } + } + } + return True; + } + + function body_content(){ + global $FANNIE_OP_DB,$FANNIE_PLUGIN_SETTINGS; + $ts_db = FannieDB::get($FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']); + + if (!empty($this->errors)){ + $msg = '

        Errors occurred

          '; + foreach($this->errors as $e) + $msg .= '
        • '.$e.'
        • '; + $msg .= '
        '; + return $msg; + } + + $months = array(01=>'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); + + ob_start(); + echo '
        +

        Name:

        +

        Month: + Date: Year: '; + echo '
        (Today is '; + echo date('l\, F jS, Y'); + echo ')

        '; + echo '

        Lunch?

        '; + + // echo "

        Please use enter times in (HH:MM) format. For example 8:45, 12:30, etc.

        "; + echo "\n"; + $query = $ts_db->prepare_statement("SELECT * FROM shifts + WHERE ShiftID NOT IN (0, 13) ORDER BY ShiftID ASC"); + for ($i = 1; $i <= $this->max; $i++) { + $result = $ts_db->exec_statement($query); + + echo ' + + + \n"; + } + echo '
        Time InTime OutArea Worked
        + + + +
        + + +
        '; + + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsAdminAdd(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminDelete.php b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminDelete.php new file mode 100644 index 000000000..bac6cfa8c --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminDelete.php @@ -0,0 +1,91 @@ +prepare_statement("DELETE FROM timesheet + WHERE date=? + AND emp_no=? + AND periodID=?"); + $result = $ts_db->exec_statement($query,array($_GET['date'], + $_GET['emp_no'],$_GET['periodID'])); + + if ($result) { + $url = sprintf('TsAdminView.php?emp_no=%d&periodID=%d', + $_GET['emp_no'],$_GET['periodID']); + header('Location: '.$url); + return False; + } + + } elseif (isset($_GET['submitted']) && $_GET['confirm'] == 'skip') { + // Redirect... + $url = sprintf('TsAdminView.php?emp_no=%d&periodID=%d', + $_GET['emp_no'],$_GET['periodID']); + header('Location: '.$url); + } + return True; + } + + function body_content(){ + global $FANNIE_OP_DB,$FANNIE_PLUGIN_SETTINGS; + $ts_db = FannieDB::get($FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']); + $query = $ts_db->prepare_statement("SELECT + CASE area WHEN 0 THEN TIME_FORMAT(time_in, '%H:%i') ELSE TIME_FORMAT(time_in, '%h:%i %p') END, + CASE area WHEN 0 THEN time_out ELSE TIME_FORMAT(time_out, '%h:%i %p') END, + ShiftName, + area + ID + FROM timesheet INNER JOIN shifts ON (shifts.ShiftID = timesheet.area) + WHERE date=? + AND emp_no=? + AND periodID=? + ORDER BY ID asc"); + $result = $ts_db->exec_statement($query,array($_GET['date'],$_GET['emp_no'],$_GET['periodID'])); + if (!$result) echo '

        ' . $ts_db->error() . '

        '; + $empQ = $ts_db->prepare_statement("SELECT CONCAT(firstname, ' ', lastname), + date_format(?, '%M %D, %Y') FROM ". + $FANNIE_OP_DB.$ts_db->sep()."employees WHERE emp_no=?"); + $empR = $ts_db->exec_statement($empQ,array($_GET['date'],$_GET['emp_no'])); + list($name, $date) = $ts_db->fetch_row($empR); + + ob_start(); + echo '
        + + + + + +
        Hours for ' . $name . ' on ' . $date . ' +
          '; + // Fetch results... + while ($row = $ts_db->fetch_row($result)) { + if ($row[3] == 0) { + $hours = substr($row[0], 0, 2) == 0 ? "" : substr($row[0], 1, 1) . " hour(s), "; + $msg = "
        • With a lunch of " . $hours . substr($row[0], 3, 2) . " minutes.
        • "; + } else { + echo "
        • From $row[0] to $row[1] as $row[2].
        • "; + } + } + + echo $msg . '
        +
        + + +
        '; + return ob_get_clean(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsAdminDelete(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminMain.php b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminMain.php new file mode 100644 index 000000000..e08329927 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminMain.php @@ -0,0 +1,72 @@ + +
        +

        '; + + $query = $ts_db->prepare_statement("SELECT FirstName, emp_no FROM ". + $FANNIE_OP_DB.$ts_db->sep()."employees where EmpActive=1 ORDER BY FirstName ASC"); + $result = $ts_db->exec_statement($query); + echo '

        Name:

        '; + $currentQ = $ts_db->prepare_statement("SELECT periodID FROM payperiods WHERE " + .$ts_db->now()." BETWEEN periodStart AND periodEnd"); + $currentR = $ts_db->exec_statement($currentQ); + $row = $ts_db->fetch_row($currentR); + $ID = $row[0]; + + $query = $ts_db->prepare_statement("SELECT date_format(periodStart, '%M %D, %Y'), + date_format(periodEnd, '%M %D, %Y'), periodID + FROM payperiods WHERE periodStart < ".$ts_db->now()." ORDER BY periodID DESC"); + $result = $ts_db->exec_statement($query); + + echo '

        Pay Period:

        '; + echo '

        +

        +
        +
        + '; + return ob_get_clean(); + } +} +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsAdminMain(); + $obj->draw_page(); +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminView.php b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminView.php new file mode 100644 index 000000000..54e970912 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/admin/TsAdminView.php @@ -0,0 +1,394 @@ + + function toggleTable(id, obj) { + if (id == 'all') { + div = document.getElementById(id); + tables = div.getElementsByTagName("table"); + for (var b=0; b < tables.length; b++) { + rows = tables[b].getElementsByTagName("tr"); + header = rows[0].getElementsByTagName("th"); + anchor = header[0].getElementsByTagName("a"); + + if (obj.innerHTML == 'Expand All') { + for (var i=1; i < rows.length; i++) { + rows[i].style.display = 'table-row'; + } + anchor[0].innerHTML = '-'; + } else { + for (var i=1; i < rows.length; i++) { + rows[i].style.display = 'none'; + } + anchor[0].innerHTML = '+'; + } + + } + + if (obj.innerHTML == 'Expand All') { + obj.innerHTML = 'Collapse All'; + } else { + obj.innerHTML = 'Expand All'; + } + + } else { + rows = document.getElementById(id).getElementsByTagName("tr"); + + header = rows[0].getElementsByTagName("th"); + + anchor = header[0].getElementsByTagName("a"); + + + if (anchor[0].innerHTML == '-') { + for (var i=1; i < rows.length; i++) { + rows[i].style.display = 'none'; + } + anchor[0].innerHTML = '+'; + + } else if (anchor[0].innerHTML == '+') { + for (var i=1; i < rows.length; i++) { + rows[i].style.display = 'table-row'; + } + + anchor[0].innerHTML = '-'; + } + } + } + emp_no = FormLib::get_form_value('emp_no',0); + $this->periodID = FormLib::get_form_value('periodID',0); + + if ($this->emp_no == 0 || $this->periodID == 0 || $this->emp_no < 0){ + header('Location: TsAdminMain.php'); + return False; + } + + if ($_GET['function'] == 'edit' && isset($_GET['submitted']) + && isset($_GET['emp_no']) && isset($_GET['periodID']) && isset($_GET['id'])) { + + $oneP = $ts_db->prepare_statement("UPDATE timesheet + SET time_in=?, time_out=?, area=? + WHERE ID=?"); + $twoP = $ts_db->prepare_statement("UPDATE timesheet + SET time_in=? + WHERE ID=?"); + foreach ($_GET['id'] AS $key => $id) { + + $area = (int) $_GET['area'][$id]; + $date = $_GET['date'][$id]; + $timein = $this->parseTime($_GET['time_in'][$id], $_GET['inmeridian'][$id]); + $timeout = $this->parseTime($_GET['time_out'][$id], $_GET['outmeridian'][$id]); + + $result = False; + if ($area != 0) { + $args = array( + $date.' '.$timein, + $date.' '.$timeout, + $area, + $id + ); + $result = $ts_db->exec_statement($oneP,$args); + } else { + $args = array( + '2008-01-01 '.$timein, + $id + ); + $result = $ts_db->exec_statement($twoP,$args); + } + + if (!$result) { + $this->errors[] = "

        Query: $query

        "; + $this->errors[] = "

        MySQL Error: " . $ts_db->error() . "

        "; + } + } + } + return True; + } + + function body_content(){ + global $FANNIE_OP_DB,$FANNIE_PLUGIN_SETTINGS; + $ts_db = FannieDB::get($FANNIE_PLUGIN_SETTINGS['TimesheetDatabase']); + + $emp_no = (int) $this->emp_no; + $periodID = (int) $this->periodID; + + $mainQ = $ts_db->prepare_statement("SELECT date, DATE_FORMAT(date, '%M %D'), + ROUND(SUM(TIMESTAMPDIFF(MINUTE, time_in, time_out))/60, 2) + FROM timesheet + WHERE emp_no = ? + AND periodID = ? + GROUP BY date"); + $mainR = $ts_db->exec_statement($mainQ, array($emp_no,$periodID)); + + $nameQ = $ts_db->prepare_statement("SELECT firstname FROM ". + $FANNIE_OP_DB.$ts_db->sep()."employees WHERE emp_no=?"); + $nameR = $ts_db->exec_statement($nameQ, array($emp_no)); + list($name) = $ts_db->fetch_row($nameR); + + $periodQ = $ts_db->prepare_statement("SELECT + date_format(periodStart, '%M %D, %Y'), date_format(periodEnd, '%M %D, %Y') + FROM payperiods WHERE periodID=?"); + $periodR = $ts_db->exec_statement($periodQ, array($periodID)); + $period = $ts_db->fetch_row($periodR); + + $query = $ts_db->prepare_statement("SELECT CASE area WHEN 0 THEN TIME_FORMAT(time_in, '%H:%i') + ELSE TIME_FORMAT(time_in, '%r') END, + CASE area WHEN 0 THEN time_out ELSE TIME_FORMAT(time_out, '%r') END, + area, + ID + FROM timesheet + WHERE emp_no = ? + AND area <> 31 + AND periodID = ? + AND date = ?"); + $shiftP = $ts_db->prepare_statement("SELECT * FROM shifts WHERE ShiftID + NOT IN (0,31) ORDER BY ShiftID ASC"); + + ob_start(); + echo '
        + Timesheet For ' . $name . ' from ' . $period[0] . ' to ' . $period[1] . ' + Expand All
        '; + while ($mainRow = $ts_db->fetch_row($mainR)) { + echo ' + + + + + + '; + $result = $ts_db->exec_statement($query, array($emp_no, $periodID, $mainRow[0])); + if (!$result) echo "

        Error!

        Query: $query

        " . $ts_db->error() . "

        "; + while ($row = $ts_db->fetch_row($result)) { + if ($row[2] == 0) { + $lunch = $row[0]; + $lunchID = $row[3]; + echo ' + + + '; + } + else { + $in = substr($row[0], 9, 2); + $out = substr($row[1], 9, 2); + + $shiftR = $ts_db->exec_statement($shiftP); + + echo ' + + + + + "; + } + } + echo '
        +' . $mainRow[1] . 'Delete' . $mainRow[2] . ' Hours
        '; + } + echo '
        '; + + $periodQ = $ts_db->prepare_statement("SELECT periodStart, periodEnd + FROM payperiods WHERE periodID = ?"); + $periodR = $ts_db->exec_statement($periodQ, array($periodID)); + list($periodStart, $periodEnd) = $ts_db->fetch_row($periodR); + + $weekoneQ = $ts_db->prepare_statement("SELECT + ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM timesheet AS t + INNER JOIN payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.date >= DATE(p.periodStart) + AND t.date < DATE(date_add(p.periodStart, INTERVAL 7 day))"); + + $weektwoQ = $ts_db->prepare_statement("SELECT + ROUND(SUM(TIMESTAMPDIFF(MINUTE, t.time_in, t.time_out))/60, 2) + FROM timesheet AS t + INNER JOIN payperiods AS p + ON (p.periodID = t.periodID) + WHERE t.emp_no = ? + AND t.periodID = ? + AND t.area <> 31 + AND t.date >= DATE(date_add(p.periodStart, INTERVAL 7 day)) + AND t.date <= DATE(p.periodEnd)"); + + $vacationQ = $ts_db->prepare_statement("SELECT ROUND(vacation, 2), ID + FROM timesheet AS t + WHERE t.emp_no = $emp_no + AND t.periodID = $periodID + AND t.area = 31"); + + $WageQ = $ts_db->prepare_statement("SELECT pay_rate FROM ". + $FANNIE_OP_DB.$ts_db->sep()."employees WHERE emp_no = ?"); + + $weekoneR = $ts_db->exec_statement($weekoneQ, array($emp_no,$periodID)); + $weektwo = $ts_db->exec_statement($weektwoQ, array($emp_no,$periodID)); + $vacationR = $ts_db->exec_statement($vacationQ, array($emp_no,$periodID)); + $WageR = $ts_db->exec_statement($WageQ, array($emp_no)); + + list($weekone) = $ts_db->fetch_row($weekoneR); + if (is_null($weekone)) $weekone = 0; + list($weektwo) = $ts_db->fetch_row($weektwoR); + if (is_null($weektwo)) $weektwo = 0; + + $vacation = 0; + $vacationID = 'insert'; + if ($ts_db->num_rows($vacationR) != 0) { + list($vacation, $vacationID) = $ts_db->fetch_row($vacationR); + } + if (!isset($vacation) || is_null($vacation)) { + $vacation = 0; + $vacationID = 'insert'; + } + + if (is_null($houseCharge)) $houseCharge = 0; + list($Wage) = $ts_db->fetch_row($WageR); + if (is_null($Wage)) $Wage = 0; + + echo " +

        Total hours in this pay period: " . number_format($weekone + $weektwo, 2) . "

        + "; + echo ""; + echo ""; + echo ""; + echo "
        Week One: "; + if ($weekone > 40) {echo ''; $font = '';} else {$font = NULL;} + echo number_format($weekone, 2) . $font . "Gross Wages (before taxes): $" . number_format($Wage * ($weekone + $weektwo + $vacation), 2) . "
        Week Two: "; + if ($weektwo > 40) {echo ''; $font = '';} else {$font = NULL;} + echo number_format($weektwo, 2) . $font . "Amount House Charged: $" . number_format($houseCharge, 2) . "
        Vacation Hours: "; + if ($vacation > 0) {echo ''; $font = '';} else {$font = NULL;} + echo number_format($vacation, 2) . $font; + + echo ' +
        + + + +
        '; + + return ob_get_clean(); + } + + private function roundTime($number) { + // This function takes a two digit precision number and rounds it to the nearest quarter. + + $roundhour = explode('.', number_format($number, 2)); + + if ($roundhour[1] < 13) {$roundhour[1] = 00;} + elseif ($roundhour[1] >= 13 && $roundhour[1] < 37) {$roundhour[1] = 25;} + elseif ($roundhour[1] >= 37 && $roundhour[1] < 63) {$roundhour[1] = 50;} + elseif ($roundhour[1] >= 63 && $roundhour[1] < 87) {$roundhour[1] = 75;} + elseif ($roundhour[1] >= 87) {$roundhour[1] = 00; $roundhour[0]++;} + + return number_format($roundhour[0] . '.' . $roundhour[1], 2); + } + + private function parseTime($time, $mer) { + $hour = array(); + if (strlen($time) == 2 && is_numeric($time)) { + $time = $time . ':00'; + } elseif (strlen($time) == 4 && is_numeric($time)) { + $time = substr($time, 0, 2) . ':' . substr($time, 2, 2); + } elseif (strlen($time) == 3 && is_numeric($time)) { + $time = substr($time, 0, 1) . ':' . substr($time, 1, 2); + } + + $in = explode(':', $time); + + if (($mer == 'PM') && ($in[0] < 12)) { + $in[0] = $in[0] + 12; + } elseif (($mer == 'AM') && ($in[0] == 12)) { + $in[0] = 0; + } + + return $in[0] . ':' . $in[1] . ':00'; + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)){ + $obj = new TsAdminView(); + $obj->draw_page(); +} +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/db/payperiods.sql b/fannie/modules/plugins2.0/TimesheetPlugin/db/payperiods.sql new file mode 100644 index 000000000..f00c9f5c4 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/db/payperiods.sql @@ -0,0 +1,494 @@ +-- phpMyAdmin SQL Dump +-- version 2.11.8.1deb1ubuntu0.2 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Generation Time: Jan 20, 2013 at 06:31 PM +-- Server version: 5.0.67 +-- PHP Version: 5.2.6-2ubuntu4.3 + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Database: `is4c_log` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `payperiods` +-- + +CREATE TABLE IF NOT EXISTS `payperiods` ( + `periodID` smallint(6) NOT NULL auto_increment, + `periodStart` datetime default NULL, + `periodEnd` datetime default NULL, + PRIMARY KEY (`periodID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=461 ; + +-- +-- Dumping data for table `payperiods` +-- + +INSERT INTO `payperiods` (`periodID`, `periodStart`, `periodEnd`) VALUES +(6, '2012-01-15 00:00:00', '2012-01-28 23:59:59'), +(7, '2012-01-29 00:00:00', '2012-02-11 23:59:59'), +(8, '2012-02-12 00:00:00', '2012-02-25 23:59:59'), +(9, '2012-02-26 00:00:00', '2012-03-10 23:59:59'), +(10, '2012-03-11 00:00:00', '2012-03-24 23:59:59'), +(11, '2012-03-25 00:00:00', '2012-04-07 23:59:59'), +(12, '2012-04-08 00:00:00', '2012-04-21 23:59:59'), +(13, '2012-04-22 00:00:00', '2012-05-05 23:59:59'), +(14, '2012-05-06 00:00:00', '2012-05-19 23:59:59'), +(15, '2012-05-20 00:00:00', '2012-06-02 23:59:59'), +(16, '2012-06-03 00:00:00', '2012-06-16 23:59:59'), +(17, '2012-06-17 00:00:00', '2012-06-30 23:59:59'), +(18, '2012-07-01 00:00:00', '2012-07-14 23:59:59'), +(19, '2012-07-15 00:00:00', '2012-07-28 23:59:59'), +(20, '2012-07-29 00:00:00', '2012-08-11 23:59:59'), +(21, '2012-08-12 00:00:00', '2012-08-25 23:59:59'), +(22, '2012-08-26 00:00:00', '2012-09-08 23:59:59'), +(23, '2012-09-09 00:00:00', '2012-09-22 23:59:59'), +(24, '2012-09-23 00:00:00', '2012-10-06 23:59:59'), +(25, '2012-10-07 00:00:00', '2012-10-20 23:59:59'), +(26, '2012-10-21 00:00:00', '2012-11-03 23:59:59'), +(27, '2012-11-04 00:00:00', '2012-11-17 23:59:59'), +(28, '2012-11-18 00:00:00', '2012-12-01 23:59:59'), +(29, '2012-12-02 00:00:00', '2012-12-15 23:59:59'), +(30, '2012-12-16 00:00:00', '2012-12-29 23:59:59'), +(31, '2012-12-30 00:00:00', '2013-01-12 23:59:59'), +(32, '2013-01-13 00:00:00', '2013-01-26 23:59:59'), +(33, '2013-01-27 00:00:00', '2013-02-09 23:59:59'), +(34, '2013-02-10 00:00:00', '2013-02-23 23:59:59'), +(35, '2013-02-24 00:00:00', '2013-03-09 23:59:59'), +(36, '2013-03-10 00:00:00', '2013-03-23 23:59:59'), +(37, '2013-03-24 00:00:00', '2013-04-06 23:59:59'), +(38, '2013-04-07 00:00:00', '2013-04-20 23:59:59'), +(39, '2013-04-21 00:00:00', '2013-05-04 23:59:59'), +(40, '2013-05-05 00:00:00', '2013-05-18 23:59:59'), +(41, '2013-05-19 00:00:00', '2013-06-01 23:59:59'), +(42, '2013-06-02 00:00:00', '2013-06-15 23:59:59'), +(43, '2013-06-16 00:00:00', '2013-06-29 23:59:59'), +(44, '2013-06-30 00:00:00', '2013-07-13 23:59:59'), +(45, '2013-07-14 00:00:00', '2013-07-27 23:59:59'), +(46, '2013-07-28 00:00:00', '2013-08-10 23:59:59'), +(47, '2013-08-11 00:00:00', '2013-08-24 23:59:59'), +(48, '2013-08-25 00:00:00', '2013-09-07 23:59:59'), +(49, '2013-09-08 00:00:00', '2013-09-21 23:59:59'), +(50, '2013-09-22 00:00:00', '2013-10-05 23:59:59'), +(51, '2013-10-06 00:00:00', '2013-10-19 23:59:59'), +(52, '2013-10-20 00:00:00', '2013-11-02 23:59:59'), +(53, '2013-11-03 00:00:00', '2013-11-16 23:59:59'), +(54, '2013-11-17 00:00:00', '2013-11-30 23:59:59'), +(55, '2013-12-01 00:00:00', '2013-12-14 23:59:59'), +(56, '2013-12-15 00:00:00', '2013-12-28 23:59:59'), +(57, '2013-12-29 00:00:00', '2014-01-11 23:59:59'), +(58, '2014-01-12 00:00:00', '2014-01-25 23:59:59'), +(59, '2014-01-26 00:00:00', '2014-02-08 23:59:59'), +(60, '2014-02-09 00:00:00', '2014-02-22 23:59:59'), +(61, '2014-02-23 00:00:00', '2014-03-08 23:59:59'), +(62, '2014-03-09 00:00:00', '2014-03-22 23:59:59'), +(63, '2014-03-23 00:00:00', '2014-04-05 23:59:59'), +(64, '2014-04-06 00:00:00', '2014-04-19 23:59:59'), +(65, '2014-04-20 00:00:00', '2014-05-03 23:59:59'), +(66, '2014-05-04 00:00:00', '2014-05-17 23:59:59'), +(67, '2014-05-18 00:00:00', '2014-05-31 23:59:59'), +(68, '2014-06-01 00:00:00', '2014-06-14 23:59:59'), +(69, '2014-06-15 00:00:00', '2014-06-28 23:59:59'), +(70, '2014-06-29 00:00:00', '2014-07-12 23:59:59'), +(71, '2014-07-13 00:00:00', '2014-07-26 23:59:59'), +(72, '2014-07-27 00:00:00', '2014-08-09 23:59:59'), +(73, '2014-08-10 00:00:00', '2014-08-23 23:59:59'), +(74, '2014-08-24 00:00:00', '2014-09-06 23:59:59'), +(75, '2014-09-07 00:00:00', '2014-09-20 23:59:59'), +(76, '2014-09-21 00:00:00', '2014-10-04 23:59:59'), +(77, '2014-10-05 00:00:00', '2014-10-18 23:59:59'), +(78, '2014-10-19 00:00:00', '2014-11-01 23:59:59'), +(79, '2014-11-02 00:00:00', '2014-11-15 23:59:59'), +(80, '2014-11-16 00:00:00', '2014-11-29 23:59:59'), +(81, '2014-11-30 00:00:00', '2014-12-13 23:59:59'), +(82, '2014-12-14 00:00:00', '2014-12-27 23:59:59'), +(83, '2014-12-28 00:00:00', '2015-01-10 23:59:59'), +(84, '2015-01-11 00:00:00', '2015-01-24 23:59:59'), +(85, '2015-01-25 00:00:00', '2015-02-07 23:59:59'), +(86, '2015-02-08 00:00:00', '2015-02-21 23:59:59'), +(87, '2015-02-22 00:00:00', '2015-03-07 23:59:59'), +(88, '2015-03-08 00:00:00', '2015-03-21 23:59:59'), +(89, '2015-03-22 00:00:00', '2015-04-04 23:59:59'), +(90, '2015-04-05 00:00:00', '2015-04-18 23:59:59'), +(91, '2015-04-19 00:00:00', '2015-05-02 23:59:59'), +(92, '2015-05-03 00:00:00', '2015-05-16 23:59:59'), +(93, '2015-05-17 00:00:00', '2015-05-30 23:59:59'), +(94, '2015-05-31 00:00:00', '2015-06-13 23:59:59'), +(95, '2015-06-14 00:00:00', '2015-06-27 23:59:59'), +(96, '2015-06-28 00:00:00', '2015-07-11 23:59:59'), +(97, '2015-07-12 00:00:00', '2015-07-25 23:59:59'), +(98, '2015-07-26 00:00:00', '2015-08-08 23:59:59'), +(99, '2015-08-09 00:00:00', '2015-08-22 23:59:59'), +(100, '2015-08-23 00:00:00', '2015-09-05 23:59:59'), +(101, '2015-09-06 00:00:00', '2015-09-19 23:59:59'), +(102, '2015-09-20 00:00:00', '2015-10-03 23:59:59'), +(103, '2015-10-04 00:00:00', '2015-10-17 23:59:59'), +(104, '2015-10-18 00:00:00', '2015-10-31 23:59:59'), +(105, '2015-11-01 00:00:00', '2015-11-14 23:59:59'), +(106, '2015-11-15 00:00:00', '2015-11-28 23:59:59'), +(107, '2015-11-29 00:00:00', '2015-12-12 23:59:59'), +(108, '2015-12-13 00:00:00', '2015-12-26 23:59:59'), +(109, '2015-12-27 00:00:00', '2016-01-09 23:59:59'), +(110, '2016-01-10 00:00:00', '2016-01-23 23:59:59'), +(111, '2016-01-24 00:00:00', '2016-02-06 23:59:59'), +(112, '2016-02-07 00:00:00', '2016-02-20 23:59:59'), +(113, '2016-02-21 00:00:00', '2016-03-05 23:59:59'), +(114, '2016-03-06 00:00:00', '2016-03-19 23:59:59'), +(115, '2016-03-20 00:00:00', '2016-04-02 23:59:59'), +(116, '2016-04-03 00:00:00', '2016-04-16 23:59:59'), +(117, '2016-04-17 00:00:00', '2016-04-30 23:59:59'), +(118, '2016-05-01 00:00:00', '2016-05-14 23:59:59'), +(119, '2016-05-15 00:00:00', '2016-05-28 23:59:59'), +(120, '2016-05-29 00:00:00', '2016-06-11 23:59:59'), +(121, '2016-06-12 00:00:00', '2016-06-25 23:59:59'), +(122, '2016-06-26 00:00:00', '2016-07-09 23:59:59'), +(123, '2016-07-10 00:00:00', '2016-07-23 23:59:59'), +(124, '2016-07-24 00:00:00', '2016-08-06 23:59:59'), +(125, '2016-08-07 00:00:00', '2016-08-20 23:59:59'), +(126, '2016-08-21 00:00:00', '2016-09-03 23:59:59'), +(127, '2016-09-04 00:00:00', '2016-09-17 23:59:59'), +(128, '2016-09-18 00:00:00', '2016-10-01 23:59:59'), +(129, '2016-10-02 00:00:00', '2016-10-15 23:59:59'), +(130, '2016-10-16 00:00:00', '2016-10-29 23:59:59'), +(131, '2016-10-30 00:00:00', '2016-11-12 23:59:59'), +(132, '2016-11-13 00:00:00', '2016-11-26 23:59:59'), +(133, '2016-11-27 00:00:00', '2016-12-10 23:59:59'), +(134, '2016-12-11 00:00:00', '2016-12-24 23:59:59'), +(135, '2016-12-25 00:00:00', '2017-01-07 23:59:59'), +(136, '2017-01-08 00:00:00', '2017-01-21 23:59:59'), +(137, '2017-01-22 00:00:00', '2017-02-04 23:59:59'), +(138, '2017-02-05 00:00:00', '2017-02-18 23:59:59'), +(139, '2017-02-19 00:00:00', '2017-03-04 23:59:59'), +(140, '2017-03-05 00:00:00', '2017-03-18 23:59:59'), +(141, '2017-03-19 00:00:00', '2017-04-01 23:59:59'), +(142, '2017-04-02 00:00:00', '2017-04-15 23:59:59'), +(143, '2017-04-16 00:00:00', '2017-04-29 23:59:59'), +(144, '2017-04-30 00:00:00', '2017-05-13 23:59:59'), +(145, '2017-05-14 00:00:00', '2017-05-27 23:59:59'), +(146, '2017-05-28 00:00:00', '2017-06-10 23:59:59'), +(147, '2017-06-11 00:00:00', '2017-06-24 23:59:59'), +(148, '2017-06-25 00:00:00', '2017-07-08 23:59:59'), +(149, '2017-07-09 00:00:00', '2017-07-22 23:59:59'), +(150, '2017-07-23 00:00:00', '2017-08-05 23:59:59'), +(151, '2017-08-06 00:00:00', '2017-08-19 23:59:59'), +(152, '2017-08-20 00:00:00', '2017-09-02 23:59:59'), +(153, '2017-09-03 00:00:00', '2017-09-16 23:59:59'), +(154, '2017-09-17 00:00:00', '2017-09-30 23:59:59'), +(155, '2017-10-01 00:00:00', '2017-10-14 23:59:59'), +(156, '2017-10-15 00:00:00', '2017-10-28 23:59:59'), +(157, '2017-10-29 00:00:00', '2017-11-11 23:59:59'), +(158, '2017-11-12 00:00:00', '2017-11-25 23:59:59'), +(159, '2017-11-26 00:00:00', '2017-12-09 23:59:59'), +(160, '2017-12-10 00:00:00', '2017-12-23 23:59:59'), +(161, '2017-12-24 00:00:00', '2018-01-06 23:59:59'), +(162, '2018-01-07 00:00:00', '2018-01-20 23:59:59'), +(163, '2018-01-21 00:00:00', '2018-02-03 23:59:59'), +(164, '2018-02-04 00:00:00', '2018-02-17 23:59:59'), +(165, '2018-02-18 00:00:00', '2018-03-03 23:59:59'), +(166, '2018-03-04 00:00:00', '2018-03-17 23:59:59'), +(167, '2018-03-18 00:00:00', '2018-03-31 23:59:59'), +(168, '2018-04-01 00:00:00', '2018-04-14 23:59:59'), +(169, '2018-04-15 00:00:00', '2018-04-28 23:59:59'), +(170, '2018-04-29 00:00:00', '2018-05-12 23:59:59'), +(171, '2018-05-13 00:00:00', '2018-05-26 23:59:59'), +(172, '2018-05-27 00:00:00', '2018-06-09 23:59:59'), +(173, '2018-06-10 00:00:00', '2018-06-23 23:59:59'), +(174, '2018-06-24 00:00:00', '2018-07-07 23:59:59'), +(175, '2018-07-08 00:00:00', '2018-07-21 23:59:59'), +(176, '2018-07-22 00:00:00', '2018-08-04 23:59:59'), +(177, '2018-08-05 00:00:00', '2018-08-18 23:59:59'), +(178, '2018-08-19 00:00:00', '2018-09-01 23:59:59'), +(179, '2018-09-02 00:00:00', '2018-09-15 23:59:59'), +(180, '2018-09-16 00:00:00', '2018-09-29 23:59:59'), +(181, '2018-09-30 00:00:00', '2018-10-13 23:59:59'), +(182, '2018-10-14 00:00:00', '2018-10-27 23:59:59'), +(183, '2018-10-28 00:00:00', '2018-11-10 23:59:59'), +(184, '2018-11-11 00:00:00', '2018-11-24 23:59:59'), +(185, '2018-11-25 00:00:00', '2018-12-08 23:59:59'), +(186, '2018-12-09 00:00:00', '2018-12-22 23:59:59'), +(187, '2018-12-23 00:00:00', '2019-01-05 23:59:59'), +(188, '2019-01-06 00:00:00', '2019-01-19 23:59:59'), +(189, '2019-01-20 00:00:00', '2019-02-02 23:59:59'), +(190, '2019-02-03 00:00:00', '2019-02-16 23:59:59'), +(191, '2019-02-17 00:00:00', '2019-03-02 23:59:59'), +(192, '2019-03-03 00:00:00', '2019-03-16 23:59:59'), +(193, '2019-03-17 00:00:00', '2019-03-30 23:59:59'), +(194, '2019-03-31 00:00:00', '2019-04-13 23:59:59'), +(195, '2019-04-14 00:00:00', '2019-04-27 23:59:59'), +(196, '2019-04-28 00:00:00', '2019-05-11 23:59:59'), +(197, '2019-05-12 00:00:00', '2019-05-25 23:59:59'), +(198, '2019-05-26 00:00:00', '2019-06-08 23:59:59'), +(199, '2019-06-09 00:00:00', '2019-06-22 23:59:59'), +(200, '2019-06-23 00:00:00', '2019-07-06 23:59:59'), +(201, '2019-07-07 00:00:00', '2019-07-20 23:59:59'), +(202, '2019-07-21 00:00:00', '2019-08-03 23:59:59'), +(203, '2019-08-04 00:00:00', '2019-08-17 23:59:59'), +(204, '2019-08-18 00:00:00', '2019-08-31 23:59:59'), +(205, '2019-09-01 00:00:00', '2019-09-14 23:59:59'), +(206, '2019-09-15 00:00:00', '2019-09-28 23:59:59'), +(207, '2019-09-29 00:00:00', '2019-10-12 23:59:59'), +(208, '2019-10-13 00:00:00', '2019-10-26 23:59:59'), +(209, '2019-10-27 00:00:00', '2019-11-09 23:59:59'), +(210, '2019-11-10 00:00:00', '2019-11-23 23:59:59'), +(211, '2019-11-24 00:00:00', '2019-12-07 23:59:59'), +(212, '2019-12-08 00:00:00', '2019-12-21 23:59:59'), +(213, '2019-12-22 00:00:00', '2020-01-04 23:59:59'), +(214, '2020-01-05 00:00:00', '2020-01-18 23:59:59'), +(215, '2020-01-19 00:00:00', '2020-02-01 23:59:59'), +(216, '2020-02-02 00:00:00', '2020-02-15 23:59:59'), +(217, '2020-02-16 00:00:00', '2020-02-29 23:59:59'), +(218, '2020-03-01 00:00:00', '2020-03-14 23:59:59'), +(219, '2020-03-15 00:00:00', '2020-03-28 23:59:59'), +(220, '2020-03-29 00:00:00', '2020-04-11 23:59:59'), +(221, '2020-04-12 00:00:00', '2020-04-25 23:59:59'), +(222, '2020-04-26 00:00:00', '2020-05-09 23:59:59'), +(223, '2020-05-10 00:00:00', '2020-05-23 23:59:59'), +(224, '2020-05-24 00:00:00', '2020-06-06 23:59:59'), +(225, '2020-06-07 00:00:00', '2020-06-20 23:59:59'), +(226, '2020-06-21 00:00:00', '2020-07-04 23:59:59'), +(227, '2020-07-05 00:00:00', '2020-07-18 23:59:59'), +(228, '2020-07-19 00:00:00', '2020-08-01 23:59:59'), +(229, '2020-08-02 00:00:00', '2020-08-15 23:59:59'), +(230, '2020-08-16 00:00:00', '2020-08-29 23:59:59'), +(231, '2020-08-30 00:00:00', '2020-09-12 23:59:59'), +(232, '2020-09-13 00:00:00', '2020-09-26 23:59:59'), +(233, '2020-09-27 00:00:00', '2020-10-10 23:59:59'), +(234, '2020-10-11 00:00:00', '2020-10-24 23:59:59'), +(235, '2020-10-25 00:00:00', '2020-11-07 23:59:59'), +(236, '2020-11-08 00:00:00', '2020-11-21 23:59:59'), +(237, '2020-11-22 00:00:00', '2020-12-05 23:59:59'), +(238, '2020-12-06 00:00:00', '2020-12-19 23:59:59'), +(239, '2020-12-20 00:00:00', '2021-01-02 23:59:59'), +(240, '2021-01-03 00:00:00', '2021-01-16 23:59:59'), +(241, '2021-01-17 00:00:00', '2021-01-30 23:59:59'), +(242, '2021-01-31 00:00:00', '2021-02-13 23:59:59'), +(243, '2021-02-14 00:00:00', '2021-02-27 23:59:59'), +(244, '2021-02-28 00:00:00', '2021-03-13 23:59:59'), +(245, '2021-03-14 00:00:00', '2021-03-27 23:59:59'), +(246, '2021-03-28 00:00:00', '2021-04-10 23:59:59'), +(247, '2021-04-11 00:00:00', '2021-04-24 23:59:59'), +(248, '2021-04-25 00:00:00', '2021-05-08 23:59:59'), +(249, '2021-05-09 00:00:00', '2021-05-22 23:59:59'), +(250, '2021-05-23 00:00:00', '2021-06-05 23:59:59'), +(251, '2021-06-06 00:00:00', '2021-06-19 23:59:59'), +(252, '2021-06-20 00:00:00', '2021-07-03 23:59:59'), +(253, '2021-07-04 00:00:00', '2021-07-17 23:59:59'), +(254, '2021-07-18 00:00:00', '2021-07-31 23:59:59'), +(255, '2021-08-01 00:00:00', '2021-08-14 23:59:59'), +(256, '2021-08-15 00:00:00', '2021-08-28 23:59:59'), +(257, '2021-08-29 00:00:00', '2021-09-11 23:59:59'), +(258, '2021-09-12 00:00:00', '2021-09-25 23:59:59'), +(259, '2021-09-26 00:00:00', '2021-10-09 23:59:59'), +(260, '2021-10-10 00:00:00', '2021-10-23 23:59:59'), +(261, '2021-10-24 00:00:00', '2021-11-06 23:59:59'), +(262, '2021-11-07 00:00:00', '2021-11-20 23:59:59'), +(263, '2021-11-21 00:00:00', '2021-12-04 23:59:59'), +(264, '2021-12-05 00:00:00', '2021-12-18 23:59:59'), +(265, '2021-12-19 00:00:00', '2022-01-01 23:59:59'), +(266, '2022-01-02 00:00:00', '2022-01-15 23:59:59'), +(267, '2022-01-16 00:00:00', '2022-01-29 23:59:59'), +(268, '2022-01-30 00:00:00', '2022-02-12 23:59:59'), +(269, '2022-02-13 00:00:00', '2022-02-26 23:59:59'), +(270, '2022-02-27 00:00:00', '2022-03-12 23:59:59'), +(271, '2022-03-13 00:00:00', '2022-03-26 23:59:59'), +(272, '2022-03-27 00:00:00', '2022-04-09 23:59:59'), +(273, '2022-04-10 00:00:00', '2022-04-23 23:59:59'), +(274, '2022-04-24 00:00:00', '2022-05-07 23:59:59'), +(275, '2022-05-08 00:00:00', '2022-05-21 23:59:59'), +(276, '2022-05-22 00:00:00', '2022-06-04 23:59:59'), +(277, '2022-06-05 00:00:00', '2022-06-18 23:59:59'), +(278, '2022-06-19 00:00:00', '2022-07-02 23:59:59'), +(279, '2022-07-03 00:00:00', '2022-07-16 23:59:59'), +(280, '2022-07-17 00:00:00', '2022-07-30 23:59:59'), +(281, '2022-07-31 00:00:00', '2022-08-13 23:59:59'), +(282, '2022-08-14 00:00:00', '2022-08-27 23:59:59'), +(283, '2022-08-28 00:00:00', '2022-09-10 23:59:59'), +(284, '2022-09-11 00:00:00', '2022-09-24 23:59:59'), +(285, '2022-09-25 00:00:00', '2022-10-08 23:59:59'), +(286, '2022-10-09 00:00:00', '2022-10-22 23:59:59'), +(287, '2022-10-23 00:00:00', '2022-11-05 23:59:59'), +(288, '2022-11-06 00:00:00', '2022-11-19 23:59:59'), +(289, '2022-11-20 00:00:00', '2022-12-03 23:59:59'), +(290, '2022-12-04 00:00:00', '2022-12-17 23:59:59'), +(291, '2022-12-18 00:00:00', '2022-12-31 23:59:59'), +(292, '2023-01-01 00:00:00', '2023-01-14 23:59:59'), +(293, '2023-01-15 00:00:00', '2023-01-28 23:59:59'), +(294, '2023-01-29 00:00:00', '2023-02-11 23:59:59'), +(295, '2023-02-12 00:00:00', '2023-02-25 23:59:59'), +(296, '2023-02-26 00:00:00', '2023-03-11 23:59:59'), +(297, '2023-03-12 00:00:00', '2023-03-25 23:59:59'), +(298, '2023-03-26 00:00:00', '2023-04-08 23:59:59'), +(299, '2023-04-09 00:00:00', '2023-04-22 23:59:59'), +(300, '2023-04-23 00:00:00', '2023-05-06 23:59:59'), +(301, '2023-05-07 00:00:00', '2023-05-20 23:59:59'), +(302, '2023-05-21 00:00:00', '2023-06-03 23:59:59'), +(303, '2023-06-04 00:00:00', '2023-06-17 23:59:59'), +(304, '2023-06-18 00:00:00', '2023-07-01 23:59:59'), +(305, '2023-07-02 00:00:00', '2023-07-15 23:59:59'), +(306, '2023-07-16 00:00:00', '2023-07-29 23:59:59'), +(307, '2023-07-30 00:00:00', '2023-08-12 23:59:59'), +(308, '2023-08-13 00:00:00', '2023-08-26 23:59:59'), +(309, '2023-08-27 00:00:00', '2023-09-09 23:59:59'), +(310, '2023-09-10 00:00:00', '2023-09-23 23:59:59'), +(311, '2023-09-24 00:00:00', '2023-10-07 23:59:59'), +(312, '2023-10-08 00:00:00', '2023-10-21 23:59:59'), +(313, '2023-10-22 00:00:00', '2023-11-04 23:59:59'), +(314, '2023-11-05 00:00:00', '2023-11-18 23:59:59'), +(315, '2023-11-19 00:00:00', '2023-12-02 23:59:59'), +(316, '2023-12-03 00:00:00', '2023-12-16 23:59:59'), +(317, '2023-12-17 00:00:00', '2023-12-30 23:59:59'), +(318, '2023-12-31 00:00:00', '2024-01-13 23:59:59'), +(319, '2024-01-14 00:00:00', '2024-01-27 23:59:59'), +(320, '2024-01-28 00:00:00', '2024-02-10 23:59:59'), +(321, '2024-02-11 00:00:00', '2024-02-24 23:59:59'), +(322, '2024-02-25 00:00:00', '2024-03-09 23:59:59'), +(323, '2024-03-10 00:00:00', '2024-03-23 23:59:59'), +(324, '2024-03-24 00:00:00', '2024-04-06 23:59:59'), +(325, '2024-04-07 00:00:00', '2024-04-20 23:59:59'), +(326, '2024-04-21 00:00:00', '2024-05-04 23:59:59'), +(327, '2024-05-05 00:00:00', '2024-05-18 23:59:59'), +(328, '2024-05-19 00:00:00', '2024-06-01 23:59:59'), +(329, '2024-06-02 00:00:00', '2024-06-15 23:59:59'), +(330, '2024-06-16 00:00:00', '2024-06-29 23:59:59'), +(331, '2024-06-30 00:00:00', '2024-07-13 23:59:59'), +(332, '2024-07-14 00:00:00', '2024-07-27 23:59:59'), +(333, '2024-07-28 00:00:00', '2024-08-10 23:59:59'), +(334, '2024-08-11 00:00:00', '2024-08-24 23:59:59'), +(335, '2024-08-25 00:00:00', '2024-09-07 23:59:59'), +(336, '2024-09-08 00:00:00', '2024-09-21 23:59:59'), +(337, '2024-09-22 00:00:00', '2024-10-05 23:59:59'), +(338, '2024-10-06 00:00:00', '2024-10-19 23:59:59'), +(339, '2024-10-20 00:00:00', '2024-11-02 23:59:59'), +(340, '2024-11-03 00:00:00', '2024-11-16 23:59:59'), +(341, '2024-11-17 00:00:00', '2024-11-30 23:59:59'), +(342, '2024-12-01 00:00:00', '2024-12-14 23:59:59'), +(343, '2024-12-15 00:00:00', '2024-12-28 23:59:59'), +(344, '2024-12-29 00:00:00', '2025-01-11 23:59:59'), +(345, '2025-01-12 00:00:00', '2025-01-25 23:59:59'), +(346, '2025-01-26 00:00:00', '2025-02-08 23:59:59'), +(347, '2025-02-09 00:00:00', '2025-02-22 23:59:59'), +(348, '2025-02-23 00:00:00', '2025-03-08 23:59:59'), +(349, '2025-03-09 00:00:00', '2025-03-22 23:59:59'), +(350, '2025-03-23 00:00:00', '2025-04-05 23:59:59'), +(351, '2025-04-06 00:00:00', '2025-04-19 23:59:59'), +(352, '2025-04-20 00:00:00', '2025-05-03 23:59:59'), +(353, '2025-05-04 00:00:00', '2025-05-17 23:59:59'), +(354, '2025-05-18 00:00:00', '2025-05-31 23:59:59'), +(355, '2025-06-01 00:00:00', '2025-06-14 23:59:59'), +(356, '2025-06-15 00:00:00', '2025-06-28 23:59:59'), +(357, '2025-06-29 00:00:00', '2025-07-12 23:59:59'), +(358, '2025-07-13 00:00:00', '2025-07-26 23:59:59'), +(359, '2025-07-27 00:00:00', '2025-08-09 23:59:59'), +(360, '2025-08-10 00:00:00', '2025-08-23 23:59:59'), +(361, '2025-08-24 00:00:00', '2025-09-06 23:59:59'), +(362, '2025-09-07 00:00:00', '2025-09-20 23:59:59'), +(363, '2025-09-21 00:00:00', '2025-10-04 23:59:59'), +(364, '2025-10-05 00:00:00', '2025-10-18 23:59:59'), +(365, '2025-10-19 00:00:00', '2025-11-01 23:59:59'), +(366, '2025-11-02 00:00:00', '2025-11-15 23:59:59'), +(367, '2025-11-16 00:00:00', '2025-11-29 23:59:59'), +(368, '2025-11-30 00:00:00', '2025-12-13 23:59:59'), +(369, '2025-12-14 00:00:00', '2025-12-27 23:59:59'), +(370, '2025-12-28 00:00:00', '2026-01-10 23:59:59'), +(371, '2026-01-11 00:00:00', '2026-01-24 23:59:59'), +(372, '2026-01-25 00:00:00', '2026-02-07 23:59:59'), +(373, '2026-02-08 00:00:00', '2026-02-21 23:59:59'), +(374, '2026-02-22 00:00:00', '2026-03-07 23:59:59'), +(375, '2026-03-08 00:00:00', '2026-03-21 23:59:59'), +(376, '2026-03-22 00:00:00', '2026-04-04 23:59:59'), +(377, '2026-04-05 00:00:00', '2026-04-18 23:59:59'), +(378, '2026-04-19 00:00:00', '2026-05-02 23:59:59'), +(379, '2026-05-03 00:00:00', '2026-05-16 23:59:59'), +(380, '2026-05-17 00:00:00', '2026-05-30 23:59:59'), +(381, '2026-05-31 00:00:00', '2026-06-13 23:59:59'), +(382, '2026-06-14 00:00:00', '2026-06-27 23:59:59'), +(383, '2026-06-28 00:00:00', '2026-07-11 23:59:59'), +(384, '2026-07-12 00:00:00', '2026-07-25 23:59:59'), +(385, '2026-07-26 00:00:00', '2026-08-08 23:59:59'), +(386, '2026-08-09 00:00:00', '2026-08-22 23:59:59'), +(387, '2026-08-23 00:00:00', '2026-09-05 23:59:59'), +(388, '2026-09-06 00:00:00', '2026-09-19 23:59:59'), +(389, '2026-09-20 00:00:00', '2026-10-03 23:59:59'), +(390, '2026-10-04 00:00:00', '2026-10-17 23:59:59'), +(391, '2026-10-18 00:00:00', '2026-10-31 23:59:59'), +(392, '2026-11-01 00:00:00', '2026-11-14 23:59:59'), +(393, '2026-11-15 00:00:00', '2026-11-28 23:59:59'), +(394, '2026-11-29 00:00:00', '2026-12-12 23:59:59'), +(395, '2026-12-13 00:00:00', '2026-12-26 23:59:59'), +(396, '2026-12-27 00:00:00', '2027-01-09 23:59:59'), +(397, '2027-01-10 00:00:00', '2027-01-23 23:59:59'), +(398, '2027-01-24 00:00:00', '2027-02-06 23:59:59'), +(399, '2027-02-07 00:00:00', '2027-02-20 23:59:59'), +(400, '2027-02-21 00:00:00', '2027-03-06 23:59:59'), +(401, '2027-03-07 00:00:00', '2027-03-20 23:59:59'), +(402, '2027-03-21 00:00:00', '2027-04-03 23:59:59'), +(403, '2027-04-04 00:00:00', '2027-04-17 23:59:59'), +(404, '2027-04-18 00:00:00', '2027-05-01 23:59:59'), +(405, '2027-05-02 00:00:00', '2027-05-15 23:59:59'), +(406, '2027-05-16 00:00:00', '2027-05-29 23:59:59'), +(407, '2027-05-30 00:00:00', '2027-06-12 23:59:59'), +(408, '2027-06-13 00:00:00', '2027-06-26 23:59:59'), +(409, '2027-06-27 00:00:00', '2027-07-10 23:59:59'), +(410, '2027-07-11 00:00:00', '2027-07-24 23:59:59'), +(411, '2027-07-25 00:00:00', '2027-08-07 23:59:59'), +(412, '2027-08-08 00:00:00', '2027-08-21 23:59:59'), +(413, '2027-08-22 00:00:00', '2027-09-04 23:59:59'), +(414, '2027-09-05 00:00:00', '2027-09-18 23:59:59'), +(415, '2027-09-19 00:00:00', '2027-10-02 23:59:59'), +(416, '2027-10-03 00:00:00', '2027-10-16 23:59:59'), +(417, '2027-10-17 00:00:00', '2027-10-30 23:59:59'), +(418, '2027-10-31 00:00:00', '2027-11-13 23:59:59'), +(419, '2027-11-14 00:00:00', '2027-11-27 23:59:59'), +(420, '2027-11-28 00:00:00', '2027-12-11 23:59:59'), +(421, '2027-12-12 00:00:00', '2027-12-25 23:59:59'), +(422, '2027-12-26 00:00:00', '2028-01-08 23:59:59'), +(423, '2028-01-09 00:00:00', '2028-01-22 23:59:59'), +(424, '2028-01-23 00:00:00', '2028-02-05 23:59:59'), +(425, '2028-02-06 00:00:00', '2028-02-19 23:59:59'), +(426, '2028-02-20 00:00:00', '2028-03-04 23:59:59'), +(427, '2028-03-05 00:00:00', '2028-03-18 23:59:59'), +(428, '2028-03-19 00:00:00', '2028-04-01 23:59:59'), +(429, '2028-04-02 00:00:00', '2028-04-15 23:59:59'), +(430, '2028-04-16 00:00:00', '2028-04-29 23:59:59'), +(431, '2028-04-30 00:00:00', '2028-05-13 23:59:59'), +(432, '2028-05-14 00:00:00', '2028-05-27 23:59:59'), +(433, '2028-05-28 00:00:00', '2028-06-10 23:59:59'), +(434, '2028-06-11 00:00:00', '2028-06-24 23:59:59'), +(435, '2028-06-25 00:00:00', '2028-07-08 23:59:59'), +(436, '2028-07-09 00:00:00', '2028-07-22 23:59:59'), +(437, '2028-07-23 00:00:00', '2028-08-05 23:59:59'), +(438, '2028-08-06 00:00:00', '2028-08-19 23:59:59'), +(439, '2028-08-20 00:00:00', '2028-09-02 23:59:59'), +(440, '2028-09-03 00:00:00', '2028-09-16 23:59:59'), +(441, '2028-09-17 00:00:00', '2028-09-30 23:59:59'), +(442, '2028-10-01 00:00:00', '2028-10-14 23:59:59'), +(443, '2028-10-15 00:00:00', '2028-10-28 23:59:59'), +(444, '2028-10-29 00:00:00', '2028-11-11 23:59:59'), +(445, '2028-11-12 00:00:00', '2028-11-25 23:59:59'), +(446, '2028-11-26 00:00:00', '2028-12-09 23:59:59'), +(447, '2028-12-10 00:00:00', '2028-12-23 23:59:59'), +(448, '2028-12-24 00:00:00', '2029-01-06 23:59:59'), +(449, '2029-01-07 00:00:00', '2029-01-20 23:59:59'), +(450, '2029-01-21 00:00:00', '2029-02-03 23:59:59'), +(451, '2029-02-04 00:00:00', '2029-02-17 23:59:59'), +(452, '2029-02-18 00:00:00', '2029-03-03 23:59:59'), +(453, '2029-03-04 00:00:00', '2029-03-17 23:59:59'), +(454, '2029-03-18 00:00:00', '2029-03-31 23:59:59'), +(455, '2029-04-01 00:00:00', '2029-04-14 23:59:59'), +(456, '2029-04-15 00:00:00', '2029-04-28 23:59:59'), +(457, '2029-04-29 00:00:00', '2029-05-12 23:59:59'), +(458, '2029-05-13 00:00:00', '2029-05-26 23:59:59'), +(459, '2029-05-27 00:00:00', '2029-06-09 23:59:59'), +(460, '2029-06-10 00:00:00', '2029-06-23 23:59:59'); diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/db/shifts.sql b/fannie/modules/plugins2.0/TimesheetPlugin/db/shifts.sql new file mode 100644 index 000000000..bc54536d3 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/db/shifts.sql @@ -0,0 +1,69 @@ +-- phpMyAdmin SQL Dump +-- version 2.11.8.1deb1ubuntu0.2 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Generation Time: Jan 20, 2013 at 06:31 PM +-- Server version: 5.0.67 +-- PHP Version: 5.2.6-2ubuntu4.3 + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Database: `is4c_log` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `shifts` +-- + +CREATE TABLE IF NOT EXISTS `shifts` ( + `ShiftName` varchar(25) default NULL, + `NiceName` varchar(255) NOT NULL, + `ShiftID` int(2) NOT NULL, + `visible` tinyint(1) default NULL, + `ShiftOrder` int(2) default NULL, + PRIMARY KEY (`ShiftID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `shifts` +-- + +INSERT INTO `shifts` (`ShiftName`, `NiceName`, `ShiftID`, `visible`, `ShiftOrder`) VALUES +('Technology', '', 1, 1, 17), +('CashS', 'Cash Store', 2, 1, 1), +('CashP', 'Cash Paper', 3, 1, 2), +('Breaks', '', 4, 1, 3), +('ProdS', 'Produce Store', 5, 1, 5), +('ProdP', 'Produce Paper', 26, 1, 6), +('GrocS', 'Grocery Store', 25, 1, 7), +('GrocP', 'Grocery Paper', 24, 1, 8), +('BulkS', 'Bulk Store', 23, 1, 9), +('BulkP', 'Bulk Paper', 22, 1, 10), +('NF', 'Non Foods', 21, 1, 11), +('Maint', 'Maintenance', 20, 1, 12), +('OM', '', 19, 1, 13), +('Farm', 'Farmers Market', 17, 1, 14), +('HOO', '', 16, 1, 15), +('FC/Book', 'Finance Coord.', 15, 1, 16), +('FM', 'Finance Mgr.', 30, 1, 18), +('DM', 'Development Mgr.', 13, 1, 19), +('DORC', '', 12, 1, 20), +('PM/Hire', 'Personnel & Hiring', 11, 1, 21), +('MM', 'Marketing & Membership', 10, 1, 22), +('BoD', 'Board of Directors', 9, 1, 23), +('Train', 'Training', 8, 1, 24), +('TeamC', 'Team Coordinators', 7, 1, 25), +('CM', '', 6, 1, 26), +('FET', '', 27, 1, 4), +('PTO', 'PTO requested', 31, 1, 31), +('lunch', '', 0, 0, 32); diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/db/timesheet.sql b/fannie/modules/plugins2.0/TimesheetPlugin/db/timesheet.sql new file mode 100644 index 000000000..8d5391bde --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/db/timesheet.sql @@ -0,0 +1,38 @@ +-- phpMyAdmin SQL Dump +-- version 2.11.8.1deb1ubuntu0.2 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Generation Time: Jan 20, 2013 at 06:31 PM +-- Server version: 5.0.67 +-- PHP Version: 5.2.6-2ubuntu4.3 + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Database: `is4c_log` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `timesheet` +-- + +CREATE TABLE IF NOT EXISTS `timesheet` ( + `emp_no` int(4) NOT NULL, + `hours` double NOT NULL, + `area` int(3) NOT NULL, + `date` date default NULL, + `periodID` int(4) NOT NULL, + `ID` int(6) NOT NULL auto_increment, + `vacation` decimal(5,2) default NULL, + `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1783 ; diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/functions.php b/fannie/modules/plugins2.0/TimesheetPlugin/functions.php new file mode 100644 index 000000000..e69de29bb diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/includes/footer.html b/fannie/modules/plugins2.0/TimesheetPlugin/includes/footer.html new file mode 100644 index 000000000..30e09b5a3 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/includes/footer.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/includes/header.html b/fannie/modules/plugins2.0/TimesheetPlugin/includes/header.html new file mode 100644 index 000000000..e9830e95b --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/includes/header.html @@ -0,0 +1,21 @@ + + + + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/includes/header3.html b/fannie/modules/plugins2.0/TimesheetPlugin/includes/header3.html new file mode 100644 index 000000000..94afc55a7 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/includes/header3.html @@ -0,0 +1,36 @@ + + + + + <?php echo $page_title; ?> + + + + +
        + + +
        + + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/includes/layout.css b/fannie/modules/plugins2.0/TimesheetPlugin/includes/layout.css new file mode 100644 index 000000000..7f9dc7bcc --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/includes/layout.css @@ -0,0 +1,96 @@ +body { + font: 12px "Lucida Sans Unicode", Verdana, sans-serif; + color: #333333; + background: #FFF; + margin: 0; + padding: 0; +} +#wrapper { + margin: 0 auto; +} +#content { + margin: 0 25px 0 25px; + padding: 1px; +} +#content p { + margin: 0 130px 6px 0; + text-align: justify; +} +#nav { + position: static; + float: right; + width: 100px; +} +div#navbar1 { + height: 30px; + width: 100%; + border-top: solid #000 1px; + border-bottom: solid #000 1px; + font-family: Arial, Helvetica, sans-serif; + font-size: small; + text-align: center; + padding: 0px; + margin: 0px; + white-space: nowrap; + line-height: 30px; +} +#nav ul { + margin: 15px 0 15px 0; + padding: 0; + list-style: none; + border: 0; +} +#nav li { + text-align: center; + border-bottom: 1px solid #000; + width: 100px; + margin: 0; + padding: 0; + font: 10px/15px "Lucida Sans Unicode", Verdana, sans-serif; + color: #000; + background: #FFF; +} +.navtop { + border-top: 1px solid #000; +} +#nav li a { + display: block; + font-weight: normal; + font-size: 1.2em; + padding: 0; + border-left: 1px solid #000; + border-right: 1px solid #000; + background: #FFF; + color: #000; + text-decoration: none; + width: 100px; + voice-family: "\"}\""; + voice-family: inherit; + width: 98px; +} +html>#nav li a { + width: 98px; +} +#nav li a:hover { + font-weight: normal; + background: #999; + color: #000; + text-decoration: none; +} +#nav h3 { + font-size: 120%; + background-image: none; + text-align: center; + padding: 0; +} +#footer { + border-bottom: 1px solid #000; + border-top: 1px solid #000; + margin: 0 25px 0 25px; + padding: 10px; + text-align: center; +} +p span.attention { + color: red; + font-size: larger; +} diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/includes/menu_style.css b/fannie/modules/plugins2.0/TimesheetPlugin/includes/menu_style.css new file mode 100644 index 000000000..7096476f2 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/includes/menu_style.css @@ -0,0 +1,126 @@ + +#outside{ + border-bottom:1px solid #000000; + background:#ffffff; + } +#navigation-1 { + padding:1px 0; + margin:0px; + list-style:none; + width:100%; + height:21px; + border-top:1px solid #FFFFFF; + border-bottom:1px solid #FFFFFF; +} +#navigation-1 li { + margin:0; + padding:0; + display:block; + float:left; + position:relative; + width:148px; +} +#navigation-1 li a:link, #navigation-1 li a:visited { + padding:4px 0; + display:block; + text-align:center; + text-decoration:none; + background:#ffffff; + color:#306; + width:148px; + height:13px; + font-weight:bolder; +} +#navigation-1 li:hover a, #navigation-1 li a:hover, #navigation-1 li a:active { + padding:4px 0; + display:block; + text-align:center; + text-decoration:none; + background:#306; + color:#ffffff; + width:146px; + height:13px; + border-left:1px solid #ffffff; + border-right:1px solid #ffffff; +} +#navigation-1 li ul.navigation-2 { + margin:0; + padding:1px 1px 0; + list-style:none; + display:none; + background:#ffffff; + width:146px; + position:absolute; + top:21px; + left:-1px; + border:1px solid #000000; + border-top:none; +} +#navigation-1 li:hover ul.navigation-2 { + display:block; +} +#navigation-1 li ul.navigation-2 li { + width:146px; + clear:left; + width:146px; +} +#navigation-1 li ul.navigation-2 li a:link, #navigation-1 li ul.navigation-2 li a:visited { + clear:left; + background:#fff; + color:#306; + font-weight:normal; + padding:4px 0; + width:146px; + border:none; + border-bottom:1px solid #ffffff; + position:relative; + z-index:1000; +} +#navigation-1 li ul.navigation-2 li:hover a, #navigation-1 li ul.navigation-2 li a:active, #navigation-1 li ul.navigation-2 li a:hover { + clear:left; + background:#306; + color:#fff; + padding:4px 0; + width:146px; + border:none; + border-bottom:1px solid #ffffff; + position:relative; + z-index:1000; +} +#navigation-1 li ul.navigation-2 li ul.navigation-3 { + display:none; + margin:0; + padding:0; + list-style:none; + position:absolute; + left:145px; + top:-2px; + padding:1px 1px 0 1px; + border:1px solid #000000; + border-left:1px solid #000000; + background:#ffffff; + z-index:900; +} +#navigation-1 li ul.navigation-2 li:hover ul.navigation-3 { + display:block; +} +#navigation-1 li ul.navigation-2 li ul.navigation-3 li a:link, #navigation-1 li ul.navigation-2 li ul.navigation-3 li a:visited { + background:#000000; +} +#navigation-1 li ul.navigation-2 li ul.navigation-3 li:hover a, #navigation-1 li ul.navigation-2 li ul.navigation-3 li a:hover, #navigation-1 li ul.navigation-2 li ul.navigation-3 li a:active { + background:#666666; +} +#navigation-1 li ul.navigation-2 li a span { + position:absolute; + top:0; + left:132px; + font-size:12pt; + color:#fe676f; +} +#navigation-1 li ul.navigation-2 li:hover a span, #navigation-1 li ul.navigation-2 li a:hover span { + position:absolute; + top:0; + left:132px; + font-size:12pt; + color:#ffffff; +} diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/includes/passwd.php b/fannie/modules/plugins2.0/TimesheetPlugin/includes/passwd.php new file mode 100644 index 000000000..428afc1ee --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/includes/passwd.php @@ -0,0 +1,158 @@ +Logout +# +############################################################### + +################################################################## +# SETTINGS START +################################################################## + +// Add login/password pairs below, like described above +// NOTE: all rows except last must have comma "," at the end of line +$LOGIN_INFORMATION = array( + 'admin' => 'testing' +); + +// request login? true - show login and password boxes, false - password box only +define('USE_USERNAME', false); + +// User will be redirected to this page after logout +define('LOGOUT_URL', $_SERVER['PHP_SELF']); + +// time out after NN minutes of inactivity. Set to 0 to not timeout +define('TIMEOUT_MINUTES', 10); + +// This parameter is only useful when TIMEOUT_MINUTES is not zero +// true - timeout time from last activity, false - timeout time from login +define('TIMEOUT_CHECK_ACTIVITY', true); + +################################################################## +# SETTINGS END +################################################################## + + +/////////////////////////////////////////////////////// +// do not change code below +/////////////////////////////////////////////////////// + +// show usage example +if(isset($_GET['help'])) { + die('Include following code into every page you would like to protect, at the very beginning (first line):
        <?php include("' . str_replace('\\','\\\\',__FILE__) . '"); ?>'); +} + +// timeout in seconds +$timeout = (TIMEOUT_MINUTES == 0 ? 0 : time() + TIMEOUT_MINUTES * 60); + +// logout? +if(isset($_GET['logout'])) { + $_SESSION['logged_in'] = False; + setcookie("verify", '', $time-3600, '/'); // clear password; + // unset($_COOKIE['verify']); + session_destroy(); + header('Location: ' . LOGOUT_URL); + exit(); +} + +if(!function_exists('showLoginPasswordProtect')) { + +// show login form +function showLoginPasswordProtect($error_msg) { +?> + + + Fannie - Protected Area! + + + /style.css" type="text/css"> + + + + +

        Please enter password to access this page

        +
        +
        + +
        +
        Password:
        '; ?> +

        +
        +
        + ">Return to Fannie + +
        + + + +$val) { + $lp = (USE_USERNAME ? $key : '') .'%'.$val; + if ($_COOKIE['verify'] == md5($lp)) { + $found = true; + // prolong timeout + if (TIMEOUT_CHECK_ACTIVITY) { + setcookie("verify", md5($lp), $timeout, '/'); + } + break; + } + } + if (!$found) { + showLoginPasswordProtect(""); + } + +} + +?> diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/index.php b/fannie/modules/plugins2.0/TimesheetPlugin/index.php new file mode 100644 index 000000000..d3d23dd98 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/sql/payperiods.php b/fannie/modules/plugins2.0/TimesheetPlugin/sql/payperiods.php new file mode 100644 index 000000000..5091b055c --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/sql/payperiods.php @@ -0,0 +1,39 @@ + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/sql/shifts.php b/fannie/modules/plugins2.0/TimesheetPlugin/sql/shifts.php new file mode 100644 index 000000000..dcc36aff9 --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/sql/shifts.php @@ -0,0 +1,35 @@ + diff --git a/fannie/modules/plugins2.0/TimesheetPlugin/sql/timesheet.php b/fannie/modules/plugins2.0/TimesheetPlugin/sql/timesheet.php new file mode 100644 index 000000000..7febf059e --- /dev/null +++ b/fannie/modules/plugins2.0/TimesheetPlugin/sql/timesheet.php @@ -0,0 +1,44 @@ + diff --git a/fannie/ordering/ajax-calls.php b/fannie/ordering/ajax-calls.php new file mode 100644 index 000000000..1328e0c97 --- /dev/null +++ b/fannie/ordering/ajax-calls.php @@ -0,0 +1,1446 @@ +sep(); + +$canEdit = false; +if (validateUserQuiet('ordering_edit')) + $canEdit = true; + +if (!isset($_REQUEST['action'])) exit; +$orderID = isset($_REQUEST['orderID'])?(int)$_REQUEST['orderID']:''; + +switch ($_REQUEST['action']){ +case 'loadCustomer': + if (isset($_REQUEST['nonForm'])) + echo getCustomerNonForm($orderID); + else + echo getCustomerForm($orderID); + break; +case 'reloadMem': + echo getCustomerForm($orderID,$_REQUEST['memNum']); + break; +case 'loadItems': + if (isset($_REQUEST['nonForm'])) + echo getItemNonForm($orderID); + else + echo getItemForm($orderID); + break; +case 'newUPC': + $qty = is_numeric($_REQUEST['cases'])?(int)$_REQUEST['cases']:1; + $result = addUPC($orderID,$_REQUEST['memNum'],$_REQUEST['upc'],$qty); + if (!is_numeric($_REQUEST['upc'])) + echo getDeptForm($orderID,$result[1],$result[2]); + else if ($result[0] === False) + echo getItemForm($orderID); + else + echo getQtyForm($orderID,$result[0],$result[1],$result[2]); + break; +case 'deleteID': + $delP = $dbc->prepare_statement("DELETE FROM {$TRANS}PendingSpecialOrder WHERE order_id=? + AND trans_id=?"); + $delR = $dbc->exec_statement($delP, array($_REQUEST['orderID'],$_REQUEST['transID'])); + echo getItemForm($_REQUEST['orderID']); + break; +case 'deleteUPC': + $upc = str_pad($_REQUEST['upc'],13,'0',STR_PAD_LEFT); + $delP = $dbc->prepare_statement("DELETE FROM {$TRANS}PendingSpecialOrder WHERE order_id=? + AND upc=?"); + $delR = $dbc->exec_statement($delP, array($_REQUEST['orderID'],$_REQUEST['upc'])); + echo getItemForm($_REQUEST['orderID']); + break; +case 'saveDesc': + $desc = $_REQUEST['desc']; + $desc = rtrim($desc,' SO'); + $desc = substr($desc,0,32)." SO"; + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + description=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($desc,$_REQUEST['orderID'],$_REQUEST['transID'])); + break; +case 'saveCtC': + if (sprintf("%d",$_REQUEST['val']) == "2") + break; // don't save with no selection + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + numflag=? WHERE order_id=? AND trans_id=0"); + $dbc->exec_statement($upP, array($_REQUEST['val'],$_REQUEST['orderID'])); + $statusP = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderStatus SET status_flag=?,sub_status=? + WHERE order_id=? AND status_flag in (0,3)"); + if ($_REQUEST['val'] == 1){ + $dbc->exec_statement($statusP,array(3,time(),$_REQUEST['orderID'])); + } + else if ($_REQUEST['val'] == 0){ + $dbc->exec_statement($statusP,array(0,time(),$_REQUEST['orderID'])); + } + break; +case 'savePrice': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + total=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['price'],$_REQUEST['orderID'],$_REQUEST['transID'])); + $fetchP = $dbc->prepare_statement("SELECT ROUND(100*((regPrice-total)/regPrice),0) + FROM {$TRANS}PendingSpecialOrder WHERE trans_id=? AND order_id=?"); + $fetchR = $dbc->exec_statement($fetchP, array($_REQUEST['transID'],$_REQUEST['orderID'])); + echo array_pop($dbc->fetch_row($fetchR)); + break; +case 'saveSRP': + $srp = $_REQUEST['srp']; + if (strstr($srp,'*')){ + $tmp = explode('*',$srp); + $srp = 1; + foreach($tmp as $t) $srp *= $t; + } + + $info = reprice($_REQUEST['orderID'],$_REQUEST['transID'],$srp); + $fetchP = $dbc->prepare_statement("SELECT ROUND(100*((regPrice-total)/regPrice),0) + FROM {$TRANS}PendingSpecialOrder WHERE trans_id=? AND order_id=?"); + $fetchR = $dbc->exec_statement($fetchP, array($_REQUEST['transID'],$_REQUEST['orderID'])); + echo array_pop($dbc->fetch_row($fetchR)); + echo '`'.$info['regPrice'].'`'.$info['total']; + break; +case 'saveQty': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + quantity=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['qty'],$_REQUEST['orderID'],$_REQUEST['transID'])); + $info = reprice($_REQUEST['orderID'],$_REQUEST['transID']); + echo $info['regPrice'].'`'.$info['total']; + break; +case 'saveUnit': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + unitPrice=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['unitPrice'],$_REQUEST['orderID'],$_REQUEST['transID'])); + $info = reprice($_REQUEST['orderID'],$_REQUEST['transID']); + echo $info['regPrice'].'`'.$info['total']; + break; +case 'newQty': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + quantity=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['qty'],$_REQUEST['orderID'],$_REQUEST['transID'])); + $info = reprice($_REQUEST['orderID'],$_REQUEST['transID']); + echo getItemForm($_REQUEST['orderID']); + break; +case 'newDept': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + department=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['dept'],$_REQUEST['orderID'],$_REQUEST['transID'])); + echo getItemForm($_REQUEST['orderID']); + break; +case 'saveDept': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + department=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['dept'],$_REQUEST['orderID'],$_REQUEST['transID'])); + break; +case 'saveVendor': + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + mixMatch=? WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($upP, array($_REQUEST['vendor'],$_REQUEST['orderID'],$_REQUEST['transID'])); + break; +case 'saveAddr': + if (canSaveAddress($orderID) == True){ + $addr = $_REQUEST['addr1']; + if (!empty($_REQUEST['addr2'])) + $addr .= "\n".$_REQUEST['addr2']; + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET street=? WHERE card_no=?"); + $dbc->exec_statement($p, array($addr,$orderID)); + } + break; +case 'saveFN': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET first_name=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['fn'],$orderID)); + } + break; +case 'saveLN': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET last_name=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['ln'],$orderID)); + } + break; +case 'saveCity': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET city=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['city'],$orderID)); + } + break; +case 'saveState': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET state=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['state'],$orderID)); + } + break; +case 'saveZip': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET zip=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['zip'],$orderID)); + } + break; +case 'savePh': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET phone=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['ph'],$orderID)); + } + break; +case 'savePh2': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET email_2=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['ph2'],$orderID)); + } + break; +case 'saveEmail': + if (canSaveAddress($orderID) == True){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact + SET email_1=? WHERE card_no=?"); + $dbc->exec_statement($p, array($_REQUEST['email'],$orderID)); + } + break; +case 'UpdateStatus': + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderStatus SET + status_flag=?,sub_status=? WHERE order_id=?"); + $dbc->exec_statement($p, array($_REQUEST['val'],time(),$orderID)); + echo date("m/d/Y"); + break; +case 'saveNoteDept': + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderNotes SET + superID=? WHERE order_id=?"); + $dbc->exec_statement($p,array($_REQUEST['val'],$orderID)); + break; +case 'saveText': + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderNotes SET + notes=? WHERE order_id=?"); + $dbc->exec_statement($p,array($_REQUEST['val'],$orderID)); + break; +case 'confirmOrder': + $p = $dbc->prepare_statement("INSERT INTO {$TRANS}SpecialOrderHistory VALUES + (?,'CONFIRMED',".$dbc->now().",'')"); + $dbc->exec_statement($p,array($_REQUEST['orderID'])); + echo date("M j Y g:ia"); + break; +case 'unconfirmOrder': + $p = $dbc->prepare_statement("DELETE FROM {$TRANS}SpecialOrderHistory WHERE + order_id=? AND entry_type='CONFIRMED'"); + $dbc->exec_statement($p,array($_REQUEST['orderID'])); + break; +case 'savePN': + $v = (int)$_REQUEST['val']; + if ($v == 0) $v = 1; + $p = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + voided=? WHERE order_id=?"); + $dbc->exec_statement($p,array($v,$_REQUEST['orderID'])); + break; +case 'closeOrder': + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderStatus SET + status_flag=? WHERE order_id=?"); + $dbc->exec_statement($p, array($_REQUEST['status'],$_REQUEST['orderID'])); + + $moveP = $dbc->prepare_statement("INSERT INTO {$TRANS}CompleteSpecialOrder + SELECT * FROM {$TRANS}PendingSpecialOrder + WHERE order_id=?"); + $dbc->exec_statement($moveP, array($_REQUEST['orderID'])); + + $cleanP = $dbc->prepare_statement("DELETE FROM {$TRANS}PendingSpecialOrder + WHERE order_id=?"); + $dbc->exec_statement($cleanP, array($_REQUEST['orderID'])); + break; +case 'copyOrder': + $oid = sprintf("%d",$_REQUEST['orderID']); + $nid = DuplicateOrder($oid); + echo $nid; + break; +case 'SplitOrder': + $oid = sprintf("%d",$_REQUEST['orderID']); + $tid = sprintf("%d",$_REQUEST['transID']); + SplitOrder($oid,$tid); + echo getItemForm($oid); + break; +case 'UpdatePrint': + $user = $_REQUEST['user']; + $cachepath = sys_get_temp_dir()."/ordercache/"; + $prints = unserialize(file_get_contents("{$cachepath}{$user}.prints")); + if (isset($prints[$_REQUEST['orderID']])) + unset($prints[$_REQUEST['orderID']]); + else + $prints[$_REQUEST['orderID']] = array(); + $fp = fopen("{$cachepath}{$user}.prints",'w'); + fwrite($fp,serialize($prints)); + fclose($fp); + break; +case 'UpdateItemO': + $oid = sprintf("%d",$_REQUEST['orderID']); + $tid = sprintf("%d",$_REQUEST['transID']); + $p = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + memType=(memType+1)%2 WHERE order_id=? + AND trans_id=?"); + $dbc->exec_statement($p, array($oid,$tid)); + break; +case 'UpdateItemA': + $oid = sprintf("%d",$_REQUEST['orderID']); + $tid = sprintf("%d",$_REQUEST['transID']); + $p = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + staff=(staff+1)%2 WHERE order_id=? + AND trans_id=?"); + $dbc->exec_statement($p, array($oid,$tid)); + break; +} + +function canSaveAddress($orderID){ + global $dbc,$TRANS; + + $chkP = $dbc->prepare_statement("SELECT card_no FROM {$TRANS}PendingSpecialOrder + WHERE order_id=?"); + $chk = $dbc->exec_statement($chkP, array($orderID)); + if ($dbc->num_rows($chk) == 0){ + return False; + } + $row = $dbc->fetch_row($chk); + if ($row['card_no'] != 0 && False) return False; + + $chkP = $dbc->prepare_statement("SELECT card_no FROM {$TRANS}SpecialOrderContact + WHERE card_no=?"); + $chk = $dbc->exec_statement($chkP, array($orderID)); + if ($dbc->num_rows($chk) == 0) + CreateContactRow($orderID); + return True; +} + +function addUPC($orderID,$memNum,$upc,$num_cases=1){ + global $dbc, $TRANS; + + $sku = str_pad($upc,6,'0',STR_PAD_LEFT); + if (is_numeric($upc)) + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $manualSKU = False; + if (isset($upc[0]) && $upc[0] == "+"){ + $sku = substr($upc,1); + $upc = "zimbabwe"; + $manualSKU = True; + } + + $ins_array = genericRow($orderID); + $ins_array['upc'] = "'$upc'"; + if ($manualSKU) + $ins_array['upc'] = str_pad($sku,13,'0',STR_PAD_LEFT); + $ins_array['card_no'] = "'$memNum'"; + $ins_array['trans_type'] = "'I'"; + + $caseSize = 1; + $vendor = ""; + $vendor_desc = (!is_numeric($upc)?$upc:""); + $srp = 0.00; + $vendor_upc = (!is_numeric($upc)?'0000000000000':""); + $skuMatch=0; + $caseP = $dbc->prepare_statement("SELECT units,vendorName,description,srp,i.upc, + CASE WHEN i.upc=? THEN 0 ELSE 1 END as skuMatch FROM vendorItems as i + LEFT JOIN vendors AS v ON + i.vendorID=v.vendorID LEFT JOIN + vendorSRPs AS s ON i.upc=s.upc AND i.vendorID=s.vendorID + WHERE i.upc=? OR i.sku=? OR i.sku=? + ORDER BY i.vendorID"); + $caseR = $dbc->exec_statement($caseP, array($upc,$upc,$sku,'0'.$sku)); + if ($dbc->num_rows($caseR) > 0) + list($caseSize,$vendor,$vendor_desc,$srp,$vendor_upc,$skuMatch) = $dbc->fetch_row($caseR); + if (!empty($vendor_upc)) $ins_array['upc'] = "'$vendor_upc'"; + if ($skuMatch == 1){ + $ins_array['upc'] = "'$vendor_upc'"; + $upc = $vendor_upc; + } + $ins_array['quantity'] = $caseSize; + $ins_array['ItemQtty'] = $num_cases; + $ins_array['mixMatch'] = $dbc->escape(substr($vendor,0,26)); + $ins_array['description'] = $dbc->escape(substr($vendor_desc,0,32)." SO"); + + $mempricing = False; + if ($memNum != 0 && !empty($memNum)){ + $p = $dbc->prepare_statement("SELECT Type,memType FROM custdata WHERE CardNo=?"); + $r = $dbc->exec_statement($p, array($memNum)); + $w = $dbc->fetch_row($r); + if ($w['Type'] == 'PC') $mempricing = True; + elseif($w['memType'] == 9) $mempricing = True; + } + + $pdP = $dbc->prepare_statement("SELECT normal_price,special_price,department,discounttype, + description,discount FROM products WHERE upc=?"); + $pdR = $dbc->exec_statement($pdP, array($upc)); + $qtyReq = False; + if ($dbc->num_rows($pdR) > 0){ + $pdW = $dbc->fetch_row($pdR); + + $ins_array['department'] = $pdW['department']; + $ins_array['discountable'] = $pdW['discount']; + $mapP = $dbc->prepare_statement("SELECT map_to FROM + {$TRANS}SpecialOrderDeptMap WHERE dept_ID=?"); + $mapR = $dbc->exec_statement($mapP, array($pdW['department'])); + if ($dbc->num_rows($mapR) > 0) + $ins_array['department'] = array_pop($dbc->fetch_row($mapR)); + + $superP = $dbc->prepare_statement("SELECT superID + FROM superdepts WHERE dept_ID=?"); + $superR = $dbc->exec_statement($superP, array($ins_array['department'])); + while($superW = $dbc->fetch_row($superR)){ + if ($superW[0] == 5) $qtyReq = 3; + if ($qtyReq !== False){ + $caseSize = $qtyReq; + $ins_array['quantity'] = $qtyReq; + break; + } + } + + // only calculate prices for items that exist in + // vendorItems (i.e., have known case size) + if ($dbc->num_rows($caseR) > 0 || true){ // test always do this + $ins_array['total'] = $pdW['normal_price']*$caseSize*$num_cases; + $ins_array['regPrice'] = $pdW['normal_price']*$caseSize*$num_cases; + $ins_array['unitPrice'] = $pdW['normal_price']; + if ($pdW['discount'] != 0 && $pdW['discounttype'] == 1){ + $ins_array['total'] = $pdW['special_price']*$caseSize*$num_cases; + $ins_array['unitPrice'] = $pdW['special_price']; + } + elseif ($mempricing){ + if ($pdW['discounttype'] == 2){ + $ins_array['total'] = $pdW['special_price']*$caseSize*$num_cases; + $ins_array['unitPrice'] = $pdW['special_price']; + } + elseif ($pdW['discount'] != 0) + $ins_array['total'] = $pdW['normal_price']*$caseSize*$num_cases*0.85; + } + } + $ins_array['description'] = "'".substr($pdW['description'],0,32)." SO'"; + $ins_array['discounttype'] = $pdW['discounttype']; + } + elseif ($srp != 0){ + // use vendor SRP if applicable + $ins_array['regPrice'] = $srp*$caseSize*$num_cases; + $ins_array['total'] = $srp*$caseSize*$num_cases; + $ins_array['unitPrice'] = $srp; + if ($mempricing) + $ins_array['total'] *= 0.85; + } + + + $tidP = $dbc->prepare_statement("SELECT MAX(trans_id),MAX(voided),MAX(numflag) + FROM {$TRANS}PendingSpecialOrder WHERE order_id=?"); + $tidR = $dbc->exec_statement($tidP,array($orderID)); + $tidW = $dbc->fetch_row($tidR); + $ins_array['trans_id'] = $tidW[0]+1; + $ins_array['voided'] = $tidW[1]; + $ins_array['numflag'] = $tidW[2]; + + $dbc->smart_insert("{$TRANS}PendingSpecialOrder",$ins_array); + + return array($qtyReq,$ins_array['trans_id'],$ins_array['description']); +} + +function CreateContactRow($orderID){ + global $dbc,$TRANS; + + $testP = $dbc->prepare_statement("SELECT card_no FROM {$TRANS}SpecialOrderContact + WHERE card_no=?"); + $testR = $dbc->exec_statement($testP,array($orderID)); + if ($dbc->num_rows($testR) > 0) return True; + + $vals = array( + 'card_no'=>$orderID, + 'last_name'=>"''", + 'first_name'=>"''", + 'othlast_name'=>"''", + 'othfirst_name'=>"''", + 'street'=>"''", + 'city'=>"''", + 'state'=>"''", + 'zip'=>"''", + 'phone'=>"''", + 'email_1'=>"''", + 'email_2'=>"''", + 'ads_OK'=>1 + ); + $dbc->smart_insert("{$TRANS}SpecialOrderContact",$vals); +} + +function SplitOrder($orderID,$transID){ + global $dbc, $TRANS; + // copy entire order + $newID = DuplicateOrder($orderID,'PendingSpecialOrder'); + + // remove all items except desired one + $cleanP = $dbc->prepare_statement("DELETE FROM {$TRANS}PendingSpecialOrder WHERE + order_id=? AND trans_id > 0 AND trans_id<>?"); + $dbc->exec_statement($cleanP,array($newID,$transID)); + + // remove the item from original order + $cleanP2 = $dbc->prepare_statement("DELETE FROM {$TRANS}PendingSpecialOrder WHERE + order_id=? AND trans_id=?"); + $dbc->exec_statement($cleanP2,array($orderID,$transID)); + + // fix trans_id on the new order + $cleanP3 = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET trans_id=1 + WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($cleanP3,array($newID,$transID)); +} + +function DuplicateOrder($old_id,$from='CompleteSpecialOrder'){ + global $dbc, $TRANS; + $new_id = CreateEmptyOrder(); + $delQ = $dbc->prepare_statement("DELETE FROM {$TRANS}PendingSpecialOrder + WHERE order_id=?"); + $dbc->exec_statement($delQ,array($new_id)); + + $copyQ = $dbc->prepare_statement("INSERT INTO {$TRANS}PendingSpecialOrder + SELECT ?,".$dbc->now().", + register_no,emp_no,trans_no,upc,description, + trans_type,trans_subtype,trans_status, + department,quantity,scale,cost,unitPrice, + total,regPrice,tax,foodstamp,discount, + memDiscount,discountable,discounttype, + voided,percentDiscount,ItemQtty,volDiscType, + volume,VolSpecial,mixMatch,matched,memtype, + staff,0,'',card_no,trans_id + FROM {$TRANS}$from WHERE order_id=?"); + $dbc->exec_statement($copyQ, array($new_id,$old_id)); + + $delP = $dbc->prepare_statement("DELETE FROM {$TRANS}SpecialOrderContact WHERE card_no=?"); + $dbc->exec_statement($delP,array($new_id)); + $contactQ = $dbc->prepare_statement("INSERT INTO {$TRANS}SpecialOrderContact + SELECT ?,last_name,first_name,othlast_name,othfirst_name, + street,city,state,zip,phone,email_1,email_2,ads_OK FROM + {$TRANS}SpecialOrderContact WHERE card_no=?"); + $dbc->exec_statement($contactQ, array($new_id,$old_id)); + + $delP = $dbc->prepare_statement("DELETE FROM {$TRANS}SpecialOrderNotes WHERE order_id=?"); + $dbc->exec_statement($delP,array($new_id)); + $notesQ = $dbc->prepare_statement("INSERT INTO {$TRANS}SpecialOrderNotes + SELECT ?,notes,superID FROM + {$TRANS}SpecialOrderNotes WHERE order_id=?"); + $dbc->exec_statement($notesQ,array($new_id,$old_id)); + + $user = checkLogin(); + $userQ = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET mixMatch=? + WHERE order_id=? AND trans_id=0"); + $userR = $dbc->exec_statement($userQ, array($user,$new_id)); + + $statusQ = $dbc->prepare_statement("SELECT numflag FROM {$TRANS}PendingSpecialOrder + WHERE order_id=?"); + $statusR = $dbc->exec_statement($statusQ,array($new_id)); + $st = array_pop($dbc->fetch_row($statusR)); + $stP = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderStatus SET status_flag=?,sub_status=? + WHERE order_id=?"); + if ($st == 1){ + $dbc->exec_statement($stP,array(3,time(),$new_id)); + } + else if ($st == 0){ + $dbc->exec_statement($stP,array(0,time(),$new_id)); + } + + return $new_id; +} + +function CreateEmptyOrder(){ + global $dbc,$TRANS,$FANNIE_SERVER_DBMS; + $user = checkLogin(); + $orderID = 1; + $val = ($FANNIE_SERVER_DBMS != "MSSQL" ? "VALUES()" : "DEFAULT VALUES"); + $dbc->query("INSERT {$TRANS}SpecialOrderID $val"); + $orderID = $dbc->insert_id(); + + $ins_array = genericRow($orderID); + $ins_array['numflag'] = 2; + $ins_array['mixMatch'] = $dbc->escape($user); + $dbc->smart_insert("{$TRANS}PendingSpecialOrder",$ins_array); + + $vals = array( + 'order_id'=>$orderID, + 'notes'=>"''", + 'superID'=>0 + ); + $dbc->smart_insert("{$TRANS}SpecialOrderNotes",$vals); + + $vals = array( + 'order_id'=>$orderID, + 'status_flag'=>3, + 'sub_status'=>time() + ); + $dbc->smart_insert("{$TRANS}SpecialOrderStatus",$vals); + + CreateContactRow($orderID); + + return $orderID; +} + +function genericRow($orderID){ + global $dbc; + return array( + 'order_id'=>$orderID, + 'datetime'=>$dbc->now(), + 'emp_no'=>1001, + 'register_no'=>30, + 'trans_no'=>$orderID, + 'upc'=>'0', + 'description'=>"'SPECIAL ORDER'", + 'trans_type'=>"'C'", + 'trans_subtype'=>"''", + 'trans_status'=>"''", + 'department'=>0, + 'quantity'=>0, + 'scale'=>0, + 'cost'=>0, + 'unitPrice'=>0, + 'total'=>0, + 'regPrice'=>0, + 'tax'=>0, + 'foodstamp'=>0, + 'discount'=>0, + 'memDiscount'=>0, + 'discountable'=>1, + 'discounttype'=>0, + 'voided'=>0, + 'percentDiscount'=>0, + 'ItemQtty'=>0, + 'volDiscType'=>0, + 'volume'=>0, + 'VolSpecial'=>0, + 'mixMatch'=>0, + 'matched'=>0, + 'memType'=>0, + 'staff'=>0, + 'numflag'=>0, + 'charflag'=>"''", + 'card_no'=>0, + 'trans_id'=>0 + ); +} + +function getCustomerForm($orderID,$memNum="0"){ + global $dbc, $TRANS; + + if (empty($orderID)) $orderID = CreateEmptyOrder(); + + $names = array(); + $pn = 1; + $fn = ""; + $ln = ""; + $contact_row = array( + 'street'=>'', + 'city'=>'', + 'state'=>'', + 'zip'=>'', + 'phone'=>'', + 'email_1'=>'', + 'email_2'=>'' + ); + $status_row = array( + 'Type' => 'REG', + 'status' => '' + ); + + $notes = ""; + $noteDept = 0; + + $table = "PendingSpecialOrder"; + + // detect member UPC entry + if ($memNum > 9999999){ + $p = $dbc->prepare_statement("SELECT card_no FROM memberCards WHERE upc=?"); + $r = $dbc->exec_statement($p,array(str_pad($memNum,13,'0',STR_PAD_LEFT))); + if ($dbc->num_rows($r) > 0) + $memNum = array_pop($dbc->fetch_row($r)); + else + $memNum = ""; + } + + // look up member id if applicable + if ($memNum === "0"){ + $findMem = $dbc->prepare_statement("SELECT card_no,voided FROM {$TRANS}$table WHERE order_id=?"); + $memR = $dbc->exec_statement($findMem, array($orderID)); + if ($dbc->num_rows($memR) > 0){ + $memW = $dbc->fetch_row($memR); + $memNum = $memW['card_no']; + $pn = $memW['voided']; + } + } + else if ($memNum == ""){ + $p = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET card_no=?,voided=0 + WHERE order_id=?"); + $r = $dbc->exec_statement($p,array(0,$orderID)); + } + else { + + $p = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET card_no=? + WHERE order_id=?"); + $r = $dbc->exec_statement($p,array($memNum,$orderID)); + + $p = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact SET + street='',phone='' WHERE card_no=?"); + $r = $dbc->exec_statement($p, array($orderID)); + + // look up personnum, correct if it hasn't been set + $pQ = $dbc->prepare_statement("SELECT voided FROM {$TRANS}PendingSpecialOrder + WHERE order_id=?"); + $pR = $dbc->exec_statement($pQ,array($orderID)); + $pn = array_pop($dbc->fetch_row($pR)); + if ($pn == 0){ + $pn = 1; + $upP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET voided=? + WHERE order_id=?"); + $upR = $dbc->exec_statement($upP,array($pn,$orderID)); + } + } + + if ($memNum != 0){ + $namesP = $dbc->prepare_statement("SELECT personNum,FirstName,LastName FROM custdata + WHERE CardNo=? ORDER BY personNum"); + $namesR = $dbc->exec_statement($namesP,array($memNum)); + while($namesW = $dbc->fetch_row($namesR)) + $names[$namesW['personNum']] = array($namesW['FirstName'],$namesW['LastName']); + + // load member contact info into SpecialOrderContact + // on first go so it can be edited separately + $testQ = $dbc->prepare_statement("SELECT street,phone FROM + {$TRANS}SpecialOrderContact WHERE card_no=?"); + $testR = $dbc->exec_statement($testQ,array($orderID)); + $testW = $dbc->fetch_row($testR); + if (empty($testW['street']) && empty($testW['phone'])){ + $contactQ = $dbc->prepare_statement("SELECT street,city,state,zip,phone,email_1,email_2 + FROM meminfo WHERE card_no=?"); + $contactR = $dbc->exec_statement($contactQ, array($memNum)); + $contact_row = $dbc->fetch_row($contactR); + + $upP = $dbc->prepare_statement("UPDATE {$TRANS}SpecialOrderContact SET street=?,city=?,state=?,zip=?, + phone=?,email_1=?,email_2=? WHERE card_no=?"); + $upR = $dbc->exec_statement($upP,array( + $contact_row['street'], + $contact_row['city'], + $contact_row['state'], + $contact_row['zip'], + $contact_row['phone'], + $contact_row['email_1'], + $contact_row['email_2'], + $orderID + )); + } + else { + $contactQ = $dbc->prepare_statement("SELECT street,city,state,zip,phone,email_1,email_2 + FROM {$TRANS}SpecialOrderContact WHERE card_no=?"); + $contactR = $dbc->exec_statement($contactQ, array($orderID)); + $contact_row = $dbc->fetch_row($contactR); + } + + $statusQ = $dbc->prepare_statement("SELECT Type FROM custdata WHERE CardNo=?"); + $statusR = $dbc->exec_statement($statusQ,array($memNum)); + $status_row = $dbc->fetch_row($statusR); + if ($status_row['Type'] == 'INACT') + $status_row['status'] = 'Inactive'; + if ($status_row['Type'] == 'INACT2') + $status_row['status'] = 'Inactive'; + elseif ($status_row['Type'] == 'TERM') + $status_row['status'] = 'Terminated'; + } + else { + $contactQ = $dbc->prepare_statement("SELECT last_name,first_name,street,city, + state,zip,phone,email_1,email_2 + FROM {$TRANS}SpecialOrderContact WHERE card_no=?"); + $contactR = $dbc->exec_statement($contactQ, array($orderID)); + if ($dbc->num_rows($contactR) > 0){ + $contact_row = $dbc->fetch_row($contactR); + $fn = $contact_row['first_name']; + $ln = $contact_row['last_name']; + } + } + + $q = $dbc->prepare_statement("SELECT notes,superID FROM {$TRANS}SpecialOrderNotes WHERE order_id=?"); + $r = $dbc->exec_statement($q, array($orderID)); + if ($dbc->num_rows($r) > 0) + list($notes,$noteDept) = $dbc->fetch_row($r); + + $q = $dbc->prepare_statement("SELECT entry_date FROM {$TRANS}SpecialOrderHistory + WHERE order_id=? AND entry_type='CONFIRMED'"); + $r = $dbc->exec_statement($q, array($orderID)); + $confirm_date = ""; + if ($dbc->num_rows($r) > 0) + $confirm_date = array_pop($dbc->fetch_row($r)); + + $callback = 2; + $user = 'Unknown'; + $orderDate = ""; + $q = $dbc->prepare_statement("SELECT datetime,numflag,mixMatch FROM + {$TRANS}PendingSpecialOrder WHERE order_id=? AND trans_id=0"); + $r = $dbc->exec_statement($q, array($orderID)); + if ($dbc->num_rows($r) > 0) + list($orderDate,$callback,$user) = $dbc->fetch_row($r); + + $ret = ""; + $ret .= ''; + $ret .= '
        '; + $ret .= sprintf('',$orderID); + $ret .= sprintf('Owner Number: ',($memNum==0?'':$memNum)); + $ret .= '
        '; + $ret .= 'Owner: '.($status_row['Type']=='PC'?'Yes':'No'); + $ret .= sprintf('', + $status_row['Type']); + $ret .= '
        '; + if (!empty($status_row['status'])){ + $ret .= 'Account status: '.$status_row['status']; + $ret .= '
        '; + } + $ret .= '
        '; + $ret .= ""; + $username = checkLogin(); + $prints = array(); + $cachepath = sys_get_temp_dir()."/ordercache/"; + if (file_exists("{$cachepath}{$username}.prints")){ + $prints = unserialize(file_get_contents("{$cachepath}{$username}.prints")); + } + else { + $fp = fopen("{$cachepath}{$username}.prints",'w'); + fwrite($fp,serialize($prints)); + fclose($fp); + } + $ret .= sprintf('
        Queue tags ', + (isset($prints[$orderID])?'checked':''), + $username,$orderID + ); + $ret .= sprintf('
        Print Now', + $orderID,$orderID); + $ret .= '
        '; + + $extra = ""; + $extra .= ''; + $extra .= '
        '; + $extra .= "Taken by: ".$user."
        "; + $extra .= "On: ".date("M j, Y g:ia",strtotime($orderDate))."
        "; + $extra .= '
        '; + $extra .= 'Call to Confirm: '; + $extra .= '
        '; + $extra .= ''.(!empty($confirm_date)?'Confirmed '.$confirm_date:'Not confirmed')." "; + $extra .= '"; + $extra .= '
        '; + + $ret .= ''; + + // names + if (empty($names)){ + $ret .= sprintf('',$fn,$orderID); + $ret .= sprintf('', + $ln,$orderID); + } + else { + $ret .= sprintf(''; + $ret .= ''; + } + $ret .= sprintf('"; + + // address + if(strstr($contact_row['street'],"\n")){ + $tmp = explode("\n",$contact_row['street']); + $contact_row['street'] = $tmp[0]; + $contact_row['street2'] = $tmp[1]; + } + else + $contact_row['street2'] = ''; + + $ret .= sprintf(' + + + + + + ', + $contact_row['street'],$orderID, + $contact_row['email_1'],$orderID, + $orderID,$notes, + $contact_row['street2'],$orderID, + $contact_row['city'],$orderID, + $contact_row['phone'],$orderID, + $contact_row['email_2'],$orderID, + $contact_row['state'],$orderID, + $contact_row['zip'],$orderID); + + + $ret .= '
        First Name + Last Name
        Name For Department: +
        AddressE-mail + +
        Addr (2)City
        PhoneAlt. PhoneStateZip
        '; + + return $ret."`".$extra;; +} + +function getCustomerNonForm($orderID){ + global $dbc, $TRANS; + + $names = array(); + $pn = 1; + $fn = ""; + $ln = ""; + $contact_row = array( + 'street'=>'', + 'city'=>'', + 'state'=>'', + 'zip'=>'', + 'phone'=>'', + 'email_1'=>'', + 'email_2'=>'' + ); + $status_row = array( + 'Type' => 'REG', + 'status' => '' + ); + + $notes = ""; + $noteDept = 0; + + // look up member id + $memNum = 0; + $findMem = $dbc->prepare_statement("SELECT card_no,voided FROM {$TRANS}CompleteSpecialOrder WHERE order_id=?"); + $memR = $dbc->exec_statement($findMem, array($orderID)); + if ($dbc->num_rows($memR) > 0){ + $memW = $dbc->fetch_row($memR); + $memNum = $memW['card_no']; + $pn = $memW['voided']; + } + + // Get member info from custdata, non-member info from SpecialOrderContact + if ($memNum != 0){ + $namesP = $dbc->prepare_statement("SELECT personNum,FirstName,LastName FROM custdata + WHERE CardNo=? ORDER BY personNum"); + $namesR = $dbc->exec_statement($namesP,array($memNum)); + while($namesW = $dbc->fetch_row($namesR)) + $names[$namesW['personNum']] = array($namesW['FirstName'],$namesW['LastName']); + + $contactQ = $dbc->prepare_statement("SELECT street,city,state,zip,phone,email_1,email_2 + FROM meminfo WHERE card_no=?"); + $contactR = $dbc->exec_statement($contactQ, array($memNum)); + $contact_row = $dbc->fetch_row($contactR); + + $statusQ = $dbc->prepare_statement("SELECT Type FROM custdata WHERE CardNo=?"); + $statusR = $dbc->exec_statement($statusQ,array($memNum)); + $status_row = $dbc->fetch_row($statusR); + if ($status_row['Type'] == 'INACT') + $status_row['status'] = 'Inactive'; + if ($status_row['Type'] == 'INACT2') + $status_row['status'] = 'Inactive'; + elseif ($status_row['Type'] == 'TERM') + $status_row['status'] = 'Terminated'; + } + else { + $contactQ = $dbc->prepare_statement("SELECT last_name,first_name,street,city, + state,zip,phone,email_1,email_2 + FROM {$TRANS}SpecialOrderContact WHERE card_no=?"); + $contactR = $dbc->exec_statement($contactQ, array($orderID)); + if ($dbc->num_rows($r) > 0){ + $contact_row = $dbc->fetch_row($r); + $fn = $contact_row['first_name']; + $ln = $contact_row['last_name']; + } + } + + $q = $dbc->prepare_statement("SELECT notes,superID FROM {$TRANS}SpecialOrderNotes WHERE order_id=?"); + $r = $dbc->exec_statement($q, array($orderID)); + if ($dbc->num_rows($r) > 0) + list($notes,$noteDept) = $dbc->fetch_row($r); + + $q = $dbc->prepare_statement("SELECT entry_date FROM {$TRANS}SpecialOrderHistory + WHERE order_id=? AND entry_type='CONFIRMED'"); + $r = $dbc->exec_statement($q, array($orderID)); + $confirm_date = ""; + if ($dbc->num_rows($r) > 0) + $confirm_date = array_pop($dbc->fetch_row($r)); + + $callback = 1; + $user = 'Unknown'; + $q = $dbc->prepare_statement("SELECT datetime,numflag,mixMatch FROM + {$TRANS}PendingSpecialOrder WHERE order_id=? AND trans_id=0"); + $r = $dbc->exec_statement($q, array($orderID)); + if ($dbc->num_rows($r) > 0) + list($callback,$user) = $dbc->fetch_row($r); + + $ret = ""; + $ret .= sprintf('',$orderID); + $ret .= ''; + $ret .= '
        '; + $ret .= sprintf('Owner Number: %s', + ($memNum==0?'':$memNum)); + $ret .= '
        '; + $ret .= 'Owner: '.($status_row['Type']=='PC'?'Yes':'No'); + $ret .= '
        '; + if (!empty($status_row['status'])){ + $ret .= 'Account status: '.$status_row['status']; + $ret .= '
        '; + } + $ret .= "Taken by: ".$user."
        "; + $ret .= '
        '; + $ret .= 'Call to Confirm: '; + if ($callback == 1) + $ret .= 'Yes'; + else + $ret .= 'No'; + $ret .= '
        '; + $ret .= ''.(!empty($confirm_date)?'Confirmed '.$confirm_date:'Not confirmed')." "; + $ret .= '
        '; + + $ret .= ""; + $ret .= '
        '; + + $ret .= ''; + + // names + if (empty($names)){ + $ret .= sprintf('',$fn,$orderID); + $ret .= sprintf('', + $ln,$orderID); + } + else { + $ret .= ''; + $ret .= ''; + } + $ret .= sprintf('"; + + // address + if(strstr($contact_row['street'],"\n")){ + $tmp = explode("\n",$contact_row['street']); + $contact_row['street'] = $tmp[0]; + $contact_row['street2'] = $tmp[1]; + } + else + $contact_row['street2'] = ''; + + $ret .= sprintf(' + + + + + + + ', + $contact_row['street'], + $contact_row['email_1'], + $notes, + $contact_row['street2'], + $contact_row['city'], + $contact_row['phone'], + $contact_row['email_2'], + $contact_row['state'], + $contact_row['zip']); + + $ret .= '
        First Name%s + Last Name%s +
        Name'; + foreach($names as $p=>$n){ + if ($p == $pn) $ret .= $n[0].' '.$n[1]; + } + $ret .= ' Notes for: +
        Address%s + E-mail%s%s +
        Addr (2)%s + City%s +
        Phone%sAlt. Phone%sState%sZip%s
        '; + + return $ret; +} + +function getQtyForm($orderID,$default,$transID,$description){ + global $dbc; + $ret = 'This item ('.$description.') requires a quantity
        '; + $ret .= "
        "; + $ret .= 'Qty: '; + $ret .= '     '; + $ret .= ''; + $ret .= '
        '; + return $ret; +} + +function getDeptForm($orderID,$transID,$description){ + global $dbc, $TRANS; + $ret = 'This item ('.$description.') requires a department
        '; + $ret .= "
        "; + $ret .= '"; + $ret .= '     '; + $ret .= ''; + $ret .= '
        '; + return $ret; +} + +function getItemForm($orderID){ + global $dbc,$canEdit; + + $ret = "
        "; + $ret .= 'UPC: '; + $ret .= '     '; + $ret .= 'Cases: '; + $ret .= '     '; + $ret .= ''; + $ret .= '     '; + $ret .= ''; + $ret .= '
        '; + + $ret .= '

        '; + + // find the order in pending or completed table + $table = "PendingSpecialOrder"; + if ($table == "PendingSpecialOrder" && $canEdit) + $ret .= editableItemList($orderID); + else + $ret .= itemList($orderID,$table); + + // disable manual-close for now + if ($canEdit && True){ + $ret .= '

        '; + $ret .= 'Manually close order'; + $ret .= sprintf('', + $orderID,$orderID,$orderID); + } + return $ret; +} + +function editableItemList($orderID){ + global $dbc,$TRANS; + + $dQ = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments order by dept_no"); + $dR = $dbc->exec_statement($dQ); + $depts = array(0=>'Unassigned'); + while($dW = $dbc->fetch_row($dR)) + $depts[$dW['dept_no']] = $dW['dept_name']; + + $ret = ''; + $ret .= ''; + $q = $dbc->prepare_statement("SELECT o.upc,o.description,total,quantity,department, + v.sku,ItemQtty,regPrice,o.discounttype,o.charflag,o.mixMatch, + o.trans_id,o.unitPrice,o.memType,o.staff + FROM {$TRANS}PendingSpecialOrder as o + left join vendorItems as v on o.upc=v.upc AND vendorID=1 + WHERE order_id=? AND trans_type='I' + ORDER BY trans_id DESC"); + $r = $dbc->exec_statement($q, array($orderID)); + $num_rows = $dbc->num_rows($r); + $prev_id = 0; + while($w = $dbc->fetch_row($r)){ + if ($w['trans_id'] == $prev_id) continue; + $ret .= sprintf(' + + + + + + + + + + ', + $orderID,$w['trans_id'] + ); + $ret .= ''; + $ret .= sprintf('', + $w['unitPrice'],$w['trans_id'],$w['trans_id']); + $ret .= sprintf('',$w['mixMatch'],$w['trans_id']); + $ret .= ''; + if ($w['discounttype'] == 1 || $w['discounttype'] == 2) + $ret .= ''; + else if ($w['regPrice'] != $w['total']){ + $ret .= sprintf('',$w['upc'], + round(100*(($w['regPrice']-$w['total'])/$w['regPrice']))); + } + else { + $ret .= ''; + } + $ret .= sprintf('', + ($w['charflag']=='P'?'Yes':'No')); + if ($num_rows > 1){ + $ret .= sprintf('', + $orderID,$w['trans_id'], + ($w['memType']>0?'checked':''),$orderID,$w['trans_id'], + ($w['staff']>0?'checked':''),$orderID,$w['trans_id']); + } + else + $ret .= ''; + $ret .= ''; + $ret .= ''; + $prev_id=$w['trans_id']; + } + $ret .= '
        UPCSKUDescriptionCasesSRPActualQtyDept 
        %s%s%d[X]
        Unit Price: + Supplier: DiscountSale%d%%0%Printed: %s
        + O      + A +
         
        '; + return $ret; +} + +function itemList($orderID,$table="PendingSpecialOrder"){ + global $dbc,$TRANS; + + $ret = ''; + $ret .= ''; + // + //'; + $q = $dbc->prepare_statement("SELECT o.upc,o.description,total,quantity, + department,regPrice,ItemQtty,discounttype,trans_id FROM {$TRANS}$table as o + WHERE order_id=? AND trans_type='I'"); + $r = $dbc->exec_statement($q, array($orderID)); + while($w = $dbc->fetch_row($r)){ + $pricing = "Regular"; + if ($w['discounttype'] == 1) + $pricing = "Sale"; + elseif($w['regPrice'] != $w['total']){ + if ($w['discounttype']==2) + $pricing = "Sale"; + else + $pricing = "% Discount"; + } + $ret .= sprintf(' + + + + + ', + $w['upc'], + $w['description'], + $w['ItemQtty'], + $pricing, + $orderID,$w['trans_id'] + ); + } + $ret .= '
        UPCDescriptionCasesPricing 
        Est. PriceQtyEst. Savings 
        %s%s%d%sDelete +
        '; + return $ret; +} + +function getItemNonForm($orderID){ + global $dbc,$TRANS; + + $dQ = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments order by dept_no"); + $dR = $dbc->exec_statement($dQ); + $depts = array(0=>'Unassigned'); + while($dW = $dbc->fetch_row($dR)) + $depts[$dW['dept_no']] = $dW['dept_name']; + + $ret = ''; + $ret .= ''; + $q = $dbc->prepare_statement("SELECT o.upc,o.description,total,quantity,department, + sku,ItemQtty,regPrice,o.discounttype,o.charflag,o.mixMatch FROM {$TRANS}CompleteSpecialOrder as o + left join vendorItems as v on o.upc=v.upc + WHERE order_id=? AND trans_type='I' AND (vendorID=1 or vendorID is null) + ORDER BY trans_id DESC"); + $r = $dbc->exec_statement($q, array($orderID)); + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf(' + + + + + + + + '; + $ret .= ''; + $ret .= sprintf('', + ($w['regPrice']/$w['ItemQtty']/$w['quantity'])); + $ret .= sprintf('',$w['mixMatch']); + $ret .= ''; + if ($w['discounttype'] == 1 || $w['discounttype'] == 2) + $ret .= ''; + else if ($w['regPrice'] != $w['total']){ + $ret .= sprintf('',$w['upc'], + round(100*(($w['regPrice']-$w['total'])/$w['regPrice']))); + } + else { + $ret .= ''; + } + $ret .= sprintf('', + ($w['charflag']=='P'?'Yes':'No')); + $ret .= ''; + $ret .= ''; + } + $ret .= '
        UPCSKUDescriptionCasesSRPActualQtyDept
        %s%s%s%d%.2f%.2f%.2f
        Unit Price: $%.2fFrom: %sDiscountSale%d%%0%Printed: %s
         
        '; + return $ret; +} + +function reprice($oid,$tid,$reg=False){ + global $dbc,$TRANS; + + $query = $dbc->prepare_statement("SELECT o.unitPrice,o.itemQtty,o.quantity,o.discounttype, + c.type,c.memType,o.regPrice,o.total,o.discountable + FROM {$TRANS}PendingSpecialOrder AS o LEFT JOIN custdata AS c ON + o.card_no=c.CardNo AND c.personNum=1 + WHERE order_id=? AND trans_id=?"); + $response = $dbc->exec_statement($query, array($oid,$tid)); + $row = $dbc->fetch_row($response); + + $regPrice = $row['itemQtty']*$row['quantity']*$row['unitPrice']; + if ($reg) + $regPrice = $reg; + $total = $regPrice; + if (($row['type'] == 'PC' || $row['memType'] == 9) && $row['discountable'] != 0 && $row['discounttype'] == 0){ + $total *= 0.85; + } + + if ($row['unitPrice'] == 0 || $row['quantity'] == 0){ + $regPrice = $row['regPrice']; + $total = $row['total']; + } + + $query = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET + total=?,regPrice=? + WHERE order_id=? AND trans_id=?"); + $dbc->exec_statement($query, array($total,$regPrice,$oid,$tid)); + return array( + 'regPrice'=>sprintf("%.2f",$regPrice), + 'total'=>sprintf("%.2f",$total) + ); +} + + +?> diff --git a/fannie/ordering/clearinghouse.php b/fannie/ordering/clearinghouse.php new file mode 100644 index 000000000..22455fda2 --- /dev/null +++ b/fannie/ordering/clearinghouse.php @@ -0,0 +1,364 @@ + + '.$page_title.' + + + + + + '; +echo '

        '.$header.'

        '; +if (isset($_REQUEST['card_no'])){ + printf('(Back to All Owners)
        ', + (isset($_REQUEST['f1'])?$_REQUEST['f1']:''), + (isset($_REQUEST['f2'])?$_REQUEST['f2']:''), + (isset($_REQUEST['f3'])?$_REQUEST['f3']:''), + (isset($_REQUEST['order'])?$_REQUEST['order']:'') + ); +} + +$status = array( + 0 => "New, No Call", + 3 => "New, Call", + 1 => "Called/waiting", + 2 => "Pending", + 4 => "Placed", + 5 => "Arrived" +); + +$assignments = array(); +$q = "SELECT superID,super_name FROM MasterSuperDepts + GROUP BY superID,super_name ORDER BY superID"; +$r = $dbc->query($q); +while($w = $dbc->fetch_row($r)) + $assignments[$w[0]] = $w[1]; +unset($assignments[0]); + +$suppliers = array(''); +$q = "SELECT mixMatch FROM {$TRANS}PendingSpecialOrder WHERE trans_type='I' + GROUP BY mixMatch ORDER BY mixMatch"; +$r = $dbc->query($q); +while($w = $dbc->fetch_row($r)){ + $suppliers[] = $w[0]; +} + +$f1 = (isset($_REQUEST['f1']) && $_REQUEST['f1'] !== '')?(int)$_REQUEST['f1']:''; +$f2 = (isset($_REQUEST['f2']) && $_REQUEST['f2'] !== '')?$_REQUEST['f2']:''; +$f3 = (isset($_REQUEST['f3']) && $_REQUEST['f3'] !== '')?$_REQUEST['f3']:''; + +$filterstring = ""; +if ($f1 !== ''){ + $filterstring = sprintf("WHERE status_flag=%d",$f1); +} + +echo 'Main Menu'; +echo "     "; +echo "Current Orders"; +echo "     "; +echo sprintf('Old Orders', + (isset($_REQUEST['card_no'])?'?card_no='.$_REQUEST['card_no']:'') +); +echo "     "; +echo "     "; +echo ''; +echo ''; +echo '

        '; + +echo "Status: "; +echo ''; +echo ' '; +echo 'Buyer: '; +echo ' '; +echo 'Supplier: '; +echo '


        '; + +if (isset($_REQUEST['card_no']) && is_numeric($_REQUEST['card_no'])){ + if (empty($filterstring)) + $filterstring .= sprintf("WHERE p.card_no=%d",$_REQUEST['card_no']); + else + $filterstring .= sprintf(" AND p.card_no=%d",$_REQUEST['card_no']); + printf('',$_REQUEST['card_no']); +} +$order = isset($_REQUEST['order'])?$_REQUEST['order']:''; +printf('',$order); +if ($order !== '') $order = base64_decode($order); +else $order = 'min(datetime)'; + +$q = "SELECT min(datetime) as orderDate,p.order_id,sum(total) as value, + count(*)-1 as items,status_flag,sub_status, + CASE WHEN MAX(p.card_no)=0 THEN MAX(t.last_name) ELSE MAX(c.LastName) END as name, + MIN(CASE WHEN trans_type='I' THEN charflag ELSE 'ZZZZ' END) as charflag, + MAX(p.card_no) AS card_no + FROM {$TRANS}PendingSpecialOrder as p + LEFT JOIN {$TRANS}SpecialOrderStatus as s ON p.order_id=s.order_id + LEFT JOIN {$TRANS}SpecialOrderNotes as n ON n.order_id=p.order_id + LEFT JOIN custdata AS c ON c.CardNo=p.card_no AND personNum=p.voided + LEFT JOIN {$TRANS}SpecialOrderContact as t on t.card_no=p.order_id + $filterstring + GROUP BY p.order_id,status_flag,sub_status + HAVING count(*) > 1 OR + SUM(CASE WHEN notes LIKE '' THEN 0 ELSE 1 END) > 0 + ORDER BY $order"; +$r = $dbc->query($q); + +$orders = array(); +$valid_ids = array(); +while($w = $dbc->fetch_row($r)){ + $orders[] = $w; + $valid_ids[$w['order_id']] = True; +} + +if ($f2 !== '' || $f3 !== ''){ + $filter2 = ($f2!==''?sprintf("AND (m.superID IN (%s) OR n.superID IN (%s))",$f2,$f2):''); + $filter3 = ($f3!==''?sprintf("AND p.mixMatch=%s",$dbc->escape($f3)):''); + $q = "SELECT p.order_id FROM {$TRANS}PendingSpecialOrder AS p + LEFT JOIN MasterSuperDepts AS m ON p.department=m.dept_ID + LEFT JOIN {$TRANS}SpecialOrderNotes AS n ON p.order_id=n.order_id + WHERE 1=1 $filter2 $filter3 + GROUP BY p.order_id"; + $r = $dbc->query($q); + $valid_ids = array(); + while($w = $dbc->fetch_row($r)) + $valid_ids[$w['order_id']] = True; + + if ($f2 !== '' && $f3 === ''){ + $q2 = sprintf("SELECT s.order_id FROM {$TRANS}SpecialOrderNotes AS s + INNER JOIN {$TRANS}PendingSpecialOrder AS p + ON p.order_id=s.order_id + WHERE s.superID IN (%s) + GROUP BY s.order_id",$f2); + $r2 = $dbc->query($q2); + while($w2 = $dbc->fetch_row($r2)) + $valid_ids[$w2['order_id']] = True; + } +} + +$oids = "("; +foreach($valid_ids as $id=>$nonsense) + $oids .= $id.","; +$oids = rtrim($oids,",").")"; + +if ($oids == '()') $oids = '(-1)'; +$itemsQ = "SELECT order_id,description,mixMatch FROM {$TRANS}PendingSpecialOrder WHERE order_id IN $oids + AND trans_id > 0"; +$itemsR = $dbc->query($itemsQ); +$items = array(); +$suppliers = array(); +while($itemsW = $dbc->fetch_row($itemsR)){ + if (!isset($items[$itemsW['order_id']])) + $items[$itemsW['order_id']] = $itemsW['description']; + else + $items[$itemsW['order_id']] .= "; ".$itemsW['description']; + if (!empty($itemsW['mixMatch'])){ + if (!isset($suppliers[$itemsW['order_id']])) + $suppliers[$itemsW['order_id']] = $itemsW['mixMatch']; + else + $suppliers[$itemsW['order_id']] .= "; ".$itemsW['mixMatch']; + } +} +$lenLimit = 10; +foreach($items as $id=>$desc){ + if (strlen($desc) <= $lenLimit) continue; + + $min = substr($desc,0,$lenLimit); + $rest = substr($desc,$lenLimit); + + $desc = sprintf('%s + +', + $min,$id,$rest,$id); + $items[$id] = $desc; +} +$lenLimit = 10; +foreach($suppliers as $id=>$desc){ + if (strlen($desc) <= $lenLimit) continue; + + $min = substr($desc,0,$lenLimit); + $rest = substr($desc,$lenLimit); + + $desc = sprintf('%s + +', + $min,$id,$rest,$id); + $suppliers[$id] = $desc; +} + +$ret = '
        '; +$ret .= sprintf(' + + + + + + + + ', + base64_encode("min(datetime)"), + base64_encode("CASE WHEN MAX(p.card_no)=0 THEN MAX(t.last_name) ELSE MAX(c.LastName) END"), + base64_encode("sum(total)"), + base64_encode("count(*)-1"), + base64_encode("status_flag") +); +$ret .= sprintf('', + $FANNIE_URL.'src/img/buttons/action_print.gif'); +$ret .= ''; +$fp = fopen($cachepath.$key,"w"); +foreach($orders as $w){ + if (!isset($valid_ids[$w['order_id']])) continue; + + $ret .= sprintf(' + + + + ', + ($w['charflag']=='P'?'arrived':'notarrived'), + $w['order_id'],$key, + array_shift(explode(' ',$w['orderDate'])), + $w['card_no'],$w['name'], + (isset($items[$w['order_id']])?$items[$w['order_id']]:' '), + (isset($suppliers[$w['order_id']])?$suppliers[$w['order_id']]:' '), + $w['items'],$w['value']); + $ret .= '"; + $ret .= ""; + $ret .= sprintf('', + (isset($prints[$w['order_id']])?'checked':''), + $w['order_id'],$username,$w['order_id']); + fwrite($fp,$w['order_id']."\n"); +} +fclose($fp); +$ret .= "
        Order DateNameDescSupplierItems + ($)StatusPrintedPrint
        %s%s%s%s%d (%.2f) ".($w['sub_status']==0?'No Date':date('m/d/Y',$w['sub_status']))."".($w['charflag']=='P'?'Yes':'No')."
        "; + +echo $ret; +?> + + diff --git a/fannie/ordering/genericpdf.php b/fannie/ordering/genericpdf.php new file mode 100644 index 000000000..68d3c95be --- /dev/null +++ b/fannie/ordering/genericpdf.php @@ -0,0 +1,120 @@ +Open(); //open new PDF Document + + $count = 0; + $x = 0; + $y = 0; + $date = date("m/d/Y"); + for($i=0;$i<4;$i++){ + if ($count % 4 == 0){ + $pdf->AddPage(); + $pdf->SetDrawColor(0,0,0); + $pdf->Line(108,0,108,279); + $pdf->Line(0,135,215,135); + } + + $x = $count % 2 == 0 ? 5 : 115; + $y = ($count/2) % 2 == 0 ? 10 : 145; + $pdf->SetXY($x,$y); + + $tmp = explode(":",$toid); + + $pdf->SetFont('Arial','','12'); + $pdf->Text($x+85,$y,"1 / 1"); + + $pdf->SetFont('Arial','B','24'); + $pdf->Cell(100,10,'WFC Special',0,1,'C'); + $pdf->SetFont('Arial','','12'); + $pdf->SetX($x); + $pdf->SetFont('Arial','','16'); + $pdf->Cell(100,9,$_REQUEST['desc'],0,1,'C'); + $pdf->SetX($x); + $pdf->Cell(100,9,"",0,1,'C'); + $pdf->SetX($x); + $pdf->SetFont('Arial','B','16'); + $txt = explode("\n",wordwrap($_REQUEST['disc'],30)); + foreach($txt as $t){ + $pdf->Cell(100,9,$t,0,1,'C'); + $pdf->SetX($x); + } + $pdf->SetFont('Arial','','12'); + if (!isset($_REQUEST['owner'])){ + $pdf->Cell(100,9,'Sale Price',0,1,'C'); + $pdf->SetX($x); + + } + else{ + $pdf->Cell(100,9,'Owner-only Special',0,1,'C'); + $pdf->SetX($x); + } + $pdf->Cell(100,6,"Print Date: ".$date,0,1,'C'); + $pdf->SetX($x); + $pdf->Cell(100,6,"Dept #".$_REQUEST['dept'],0,1,'C'); + $pdf->SetX($x); + $pdf->Cell(100,6,"",0,1,'C'); + $pdf->SetXY($x,$y+85); + $pdf->Cell(160,10,"Notes: _________________________________"); + $pdf->SetX($x); + + $upc = str_pad($_REQUEST['upc'],11,'0',STR_PAD_LEFT); + $upc = $_REQUEST['upc']; + //$chk = $pdf->GetCheckDigit($upc); + + $pdf->UPC_A($x+30,$y+95,$upc); + + $count++; + } + + $pdf->Output(); + exit; +} + +$page_title = "Fannie :: Special Orders"; +$header = "Special Orders"; +include($FANNIE_ROOT.'src/header.html'); + +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo '
        UPC
        Main Text
        Discount Text
        Dept#
        Owner-only
        '; +echo '
        '; +echo ''; +echo '
        '; + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/ordering/historical.php b/fannie/ordering/historical.php new file mode 100644 index 000000000..d139a7782 --- /dev/null +++ b/fannie/ordering/historical.php @@ -0,0 +1,382 @@ + + '.$page_title.' + + + + + + '; +echo '

        '.$header.'

        '; +if (isset($_REQUEST['card_no'])){ + printf('(Back to All Owners)
        ', + (isset($_REQUEST['f1'])?$_REQUEST['f1']:''), + (isset($_REQUEST['f2'])?$_REQUEST['f2']:''), + (isset($_REQUEST['f3'])?$_REQUEST['f3']:''), + (isset($_REQUEST['order'])?$_REQUEST['order']:'') + ); +} + +$status = array( + 0 => "New", + 3 => "New, Call", + 1 => "Called/waiting", + 2 => "Pending", + 4 => "Placed", + 5 => "Arrived", + 7 => "Completed", + 8 => "Canceled", + 9 => "Inquiry" +); + +$assignments = array(); +$q = $dbc->prepare_statement("SELECT superID,super_name FROM MasterSuperDepts + GROUP BY superID,super_name ORDER BY superID"); +$r = $dbc->exec_statement($q); +while($w = $dbc->fetch_row($r)) + $assignments[$w[0]] = $w[1]; +unset($assignments[0]); + +$suppliers = array(''); +$q = $dbc->prepare_statement("SELECT mixMatch FROM {$TRANS}CompleteSpecialOrder WHERE trans_type='I' + GROUP BY mixMatch ORDER BY mixMatch"); +$r = $dbc->exec_statement($q); +while($w = $dbc->fetch_row($r)){ + $suppliers[] = $w[0]; +} + +$f1 = (isset($_REQUEST['f1']) && $_REQUEST['f1'] !== '')?(int)$_REQUEST['f1']:''; +$f2 = (isset($_REQUEST['f2']) && $_REQUEST['f2'] !== '')?$_REQUEST['f2']:''; +$f3 = (isset($_REQUEST['f3']) && $_REQUEST['f3'] !== '')?$_REQUEST['f3']:''; + +$filterstring = ""; +$filterargs = array(); +if ($f1 !== ''){ + $filterstring = 'WHERE status_flag=?'; + $filterargs[] = $f1; +} + +echo 'Main Menu'; +echo "     "; +echo sprintf('Current Orders', + (isset($_REQUEST['card_no'])?'?card_no='.$_REQUEST['card_no']:'') +); +echo "     "; +echo "Old Orders"; +echo '

        '; + +echo "Status: "; +echo ''; +echo ' '; +echo 'Buyer: '; +echo ' '; +echo 'Supplier: '; +echo '


        '; + +if (isset($_REQUEST['card_no']) && is_numeric($_REQUEST['card_no'])){ + if (empty($filterstring)){ + $filterstring .= "WHERE p.card_no=?"; + } + else{ + $filterstring .= " AND p.card_no=?"; + } + $filterargs[] = $_REQUEST['card_no']; + printf('',$_REQUEST['card_no']); +} +$page = isset($_REQUEST['page'])?$_REQUEST['page']:1; +$page = (int)$page; +$order = isset($_REQUEST['order'])?$_REQUEST['order']:''; +printf('',$order); +$orderby = 'min(datetime) desc'; +if ($order === 'date') + $orderby = "min(datetime)"; +elseif($order === 'name') + $orderby = "CASE WHEN MAX(p.card_no)=0 THEN MAX(t.last_name) ELSE MAX(c.LastName) END"; +elseif($order === 'ttl') + $orderby = "sum(total)"; +elseif($order === 'qty') + $orderby = "count(*)-1"; +elseif($order === 'status') + $orderby = "status_flag"; + +$p = $dbc->prepare_statement("SELECT min(datetime) as orderDate,p.order_id,sum(total) as value, + count(*)-1 as items,status_flag,sub_status, + CASE WHEN MAX(p.card_no)=0 THEN MAX(t.last_name) ELSE MAX(c.LastName) END as name, + MIN(CASE WHEN trans_type='I' THEN charflag ELSE 'ZZZZ' END) as charflag, + MAX(p.card_no) AS card_no + FROM {$TRANS}CompleteSpecialOrder as p + LEFT JOIN {$TRANS}SpecialOrderStatus as s ON p.order_id=s.order_id + LEFT JOIN {$TRANS}SpecialOrderNotes as n ON n.order_id=p.order_id + LEFT JOIN custdata AS c ON c.CardNo=p.card_no AND personNum=p.voided + LEFT JOIN {$TRANS}SpecialOrderContact as t on t.card_no=p.order_id + $filterstring + GROUP BY p.order_id,status_flag,sub_status + HAVING (count(*) > 1 OR + SUM(CASE WHEN notes LIKE '' THEN 0 ELSE 1 END) > 0 + ) + AND ".$dbc->monthdiff($dbc->now(),'min(datetime)')." >= ((?-1)*3) + AND ".$dbc->monthdiff($dbc->now(),'min(datetime)')." < (?*3) + ORDER BY $orderby"); +$filterargs[] = $page; +$filterargs[] = $page; // again +$r = $dbc->exec_statement($p,$filterargs); + +$orders = array(); +$valid_ids = array(); +while($w = $dbc->fetch_row($r)){ + $orders[] = $w; + $valid_ids[$w['order_id']] = True; +} + +if ($f2 !== '' || $f3 !== ''){ + $filter = ""; + $args = array(); + if ($f2 !== ''){ + $filter .= "AND (m.superID IN (?) OR n.superID IN (?))"; + $args = array($f2,$f2); + } + if ($f3 !== ''){ + $filter .= "AND p.mixMatch=?"; + $args[] = $f3; + } + $p = $dbc->prepare_statement("SELECT p.order_id FROM {$TRANS}CompleteSpecialOrder AS p + LEFT JOIN MasterSuperDepts AS m ON p.department=m.dept_ID + LEFT JOIN {$TRANS}SpecialOrderNotes AS n ON p.order_id=n.order_id + WHERE 1=1 $filter + GROUP BY p.order_id"); + $r = $dbc->exec_statement($p,$args); + $valid_ids = array(); + while($w = $dbc->fetch_row($r)) + $valid_ids[$w['order_id']] = True; + + if ($f2 !== '' && $f3 === ''){ + $q2 = $dbc->prepare_statement("SELECT s.order_id FROM + {$TRANS}SpecialOrderNotes AS s + INNER JOIN {$TRANS}CompleteSpecialOrder AS p + ON p.order_id=s.order_id + WHERE s.superID IN (?) + GROUP BY s.order_id"); + $r2 = $dbc->exec_statement($q2, array($f2)); + while($w2 = $dbc->fetch_row($r2)) + $valid_ids[$w2['order_id']] = True; + } +} + +$oids = "("; +$oargs = array(); +foreach($valid_ids as $id=>$nonsense){ + $oids .= "?,"; + $oargs[] = $id; +} +$oids = rtrim($oids,",").")"; +if (empty($oargs)){ + $oids = '(?)'; + $oargs = array(-1); + // avoid invalid query +} + +$itemsQ = $dbc->prepare_statement("SELECT order_id,description,mixMatch FROM + {$TRANS}CompleteSpecialOrder WHERE order_id IN $oids + AND trans_id > 0"); +$itemsR = $dbc->exec_statement($itemsQ, $oargs); +$items = array(); +$suppliers = array(); +while($itemsW = $dbc->fetch_row($itemsR)){ + if (!isset($items[$itemsW['order_id']])) + $items[$itemsW['order_id']] = $itemsW['description']; + else + $items[$itemsW['order_id']] .= "; ".$itemsW['description']; + if (!empty($itemsW['mixMatch'])){ + if (!isset($suppliers[$itemsW['order_id']])) + $suppliers[$itemsW['order_id']] = $itemsW['mixMatch']; + else + $suppliers[$itemsW['order_id']] .= "; ".$itemsW['mixMatch']; + } +} +$lenLimit = 10; +foreach($items as $id=>$desc){ + if (strlen($desc) <= $lenLimit) continue; + + $min = substr($desc,0,$lenLimit); + $rest = substr($desc,$lenLimit); + + $desc = sprintf('%s + +', + $min,$id,$rest,$id); + $items[$id] = $desc; +} +$lenLimit = 10; +foreach($suppliers as $id=>$desc){ + if (strlen($desc) <= $lenLimit) continue; + + $min = substr($desc,0,$lenLimit); + $rest = substr($desc,$lenLimit); + + $desc = sprintf('%s + +', + $min,$id,$rest,$id); + $suppliers[$id] = $desc; +} + +$ret = ' + + + + + + + + '; +$key = ""; +foreach($orders as $w){ + if (!isset($valid_ids[$w['order_id']])) continue; + + $ret .= sprintf(' + + + + ', + ($w['charflag']=='P'?'arrived':'notarrived'), + $w['order_id'],$key, + array_shift(explode(' ',$w['orderDate'])), + $w['card_no'],$w['name'], + (isset($items[$w['order_id']])?$items[$w['order_id']]:' '), + (isset($suppliers[$w['order_id']])?$suppliers[$w['order_id']]:' '), + $w['items'],$w['value']); + $ret .= '"; +} +$ret .= "
        Order DateNameDescSupplierItems + ($)Status
        %s%s%s%s%d (%.2f)'; + foreach($status as $k=>$v){ + if ($w['status_flag']==$k) $ret .= $v; + } + $ret .= " ".($w['sub_status']==0?'No Date':date('m/d/Y',$w['sub_status']))."
        "; + +$url = $_SERVER['REQUEST_URI']; +if (!strstr($url,"page=")){ + if (substr($url,-4)==".php") + $url .= "?page=".$page; + else + $url .= "&page=".$page; +} +if ($page > 1){ + $prev = $page-1; + $prev_url = preg_replace('/page=\d+/','page='.$prev,$url); + $ret .= sprintf('Previous  ||  ', + $prev_url); +} +$next = $page+1; +$next_url = preg_replace('/page=\d+/','page='.$next,$url); +$ret .= sprintf('Next',$next_url); + +echo $ret; +?> + + diff --git a/fannie/ordering/index.php b/fannie/ordering/index.php new file mode 100644 index 000000000..7a3a91e00 --- /dev/null +++ b/fannie/ordering/index.php @@ -0,0 +1,50 @@ + + + diff --git a/fannie/ordering/muzak.php b/fannie/ordering/muzak.php new file mode 100644 index 000000000..b2d49b775 --- /dev/null +++ b/fannie/ordering/muzak.php @@ -0,0 +1,59 @@ + + + + +

        +

        + + diff --git a/fannie/ordering/notes b/fannie/ordering/notes new file mode 100644 index 000000000..d20c86700 --- /dev/null +++ b/fannie/ordering/notes @@ -0,0 +1,3 @@ +vendor source +auto assign via department +zero pricing for non-UNFI items diff --git a/fannie/ordering/receivingReport.php b/fannie/ordering/receivingReport.php new file mode 100644 index 000000000..ef74e4dbe --- /dev/null +++ b/fannie/ordering/receivingReport.php @@ -0,0 +1,121 @@ + + + "Any", + 0 => "New", + 2 => "Pending", + 4 => "Placed" +); + +$order = isset($_REQUEST['order'])?$_REQUEST['order']:'mixMatch'; +$filter = isset($_REQUEST['f'])?$_REQUEST['f']:4; +$supp = isset($_REQUEST['s'])?$_REQUEST['s']:''; +if ($filter !== '') $filter = (int)$filter; + +echo ''; +echo '     '; + +$suppliers = array(''); +$q = $dbc->prepare_statement("SELECT mixMatch FROM PendingSpecialOrder WHERE trans_type='I' + GROUP BY mixMatch ORDER BY mixMatch"); +$r = $dbc->exec_statement($q); +while($w = $dbc->fetch_row($r)){ + $suppliers[] = $w[0]; +} +echo '

        '; +printf('',$order); + +$where = "p.trans_type = 'I'"; +$args = array(); +if (!empty($filter)){ + $where .= " AND s.status_flag=? "; + $args[] = ((int)$filter); +} +if (!empty($supp)){ + $where .= " AND mixMatch=? "; + $args[] = $supp; +} +$sql_order = 'mixMatch,upc'; +if ($order == 'upc') + $sql_order = 'upc'; +elseif($order == 'description') + $sql_order = 'description,upc'; +elseif($order == 'ItemQtty') + $sql_order = 'ItemQtty,upc'; +elseif($order == 'sub_status') + $sql_order = 'sub_status,upc'; + +$q = "SELECT upc,description,ItemQtty,mixMatch,sub_status + FROM PendingSpecialOrder AS p + LEFT JOIN SpecialOrderStatus as s + ON p.order_id=s.order_id + WHERE $where + ORDER BY $sql_order"; +$p = $dbc->prepare_statement($q); +$r = $dbc->exec_statement($q, $args); +echo ''; +echo ''; +while ($w = $dbc->fetch_row($r)){ + printf('', + $w['upc'],$w['description'],$w['ItemQtty'],$w['mixMatch'], + ($w['sub_status']==0?'Unknown':date('m/d/Y',$w['sub_status']))); +} +echo '
        UPC'; +echo 'Desc.'; +echo '# Cases'; +echo 'Supplier'; +echo 'Status Updated'; +echo '
        %s%s%d%s%s
        '; + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/ordering/review.php b/fannie/ordering/review.php new file mode 100644 index 000000000..5b146474f --- /dev/null +++ b/fannie/ordering/review.php @@ -0,0 +1,100 @@ + + +

        +Customer Information +
        +
        +
        +Order Items +
        +
        + + diff --git a/fannie/ordering/search.php b/fannie/ordering/search.php new file mode 100644 index 000000000..be5faca52 --- /dev/null +++ b/fannie/ordering/search.php @@ -0,0 +1,131 @@ + + + + +Items'; + echo '     '; + echo 'Owners'; + echo '     '; + echo 'Brands'; + echo '     '; + echo ''; + echo '     '; + echo ''; + + echo '
        '; + $itemP = $dbc->prepare_statement("SELECT upc,description FROM products WHERE description LIKE ? + ORDER BY description"); + $itemR = $dbc->exec_statement($itemP,array('%'.$_REQUEST['q'].'%')); + if ($dbc->num_rows($itemR) == 0) + echo 'No matching items'; + else { + echo '
          '; + while($itemW = $dbc->fetch_row($itemR)){ + printf('
        • %s
        • ', + $itemW['upc'],$itemW['description']); + } + echo '
        '; + } + echo '
        '; + + echo ''; + + echo ''; +} +else if (isset($_REQUEST['brand'])){ + $q = $dbc->prepare_statement("SELECT p.upc,p.description FROM products AS p + INNER JOIN prodExtra AS x ON p.upc=x.upc WHERE + x.manufacturer=? ORDER by p.description"); + $r = $dbc->exec_statement($q, array(base64_decode($_REQUEST['brand']))); + printf("%s items",base64_decode($_REQUEST['brand'])); + echo '
          '; + while($itemW = $dbc->fetch_row($r)){ + printf('
        • %s
        • ', + $itemW['upc'],$itemW['description']); + } + echo '
        '; +} +else { + echo '
        + + +       + +
        '; +} + +?> diff --git a/fannie/ordering/tagpdf.php b/fannie/ordering/tagpdf.php new file mode 100644 index 000000000..426382980 --- /dev/null +++ b/fannie/ordering/tagpdf.php @@ -0,0 +1,212 @@ +sep(); + +if (isset($_REQUEST['toids'])){ + define('FPDF_FONTPATH','font/'); + include($FANNIE_ROOT.'src/fpdf/fpdf.php'); + include($FANNIE_ROOT.'src/barcodepdf.php'); + + $pdf=new WFC_Standard_PDF('P','mm','Letter'); //start new instance of PDF + $pdf->Open(); //open new PDF Document + + $count = 0; + $x = 0; + $y = 0; + $date = date("m/d/Y"); + $infoP = $dbc->prepare_statement("SELECT ItemQtty,total,regPrice,p.card_no,description,department, + CASE WHEN p.card_no=0 THEN t.last_name ELSE c.LastName END as name, + CASE WHEN p.card_no=0 THEN t.first_name ELSE c.FirstName END as fname, + CASE WHEN t.phone is NULL THEN m.phone ELSE t.phone END as phone, + discounttype,quantity + FROM {$TRANS}PendingSpecialOrder AS p + LEFT JOIN custdata AS c ON p.card_no=c.CardNo AND personNum=p.voided + LEFT JOIN meminfo AS m ON c.CardNo=m.card_no + LEFT JOIN {$TRANS}SpecialOrderContact AS t ON t.card_no=p.order_id + WHERE trans_id=? AND p.order_id=?"); + $flagP = $dbc->prepare_statement("UPDATE {$TRANS}PendingSpecialOrder SET charflag='P' + WHERE trans_id=? AND order_id=?"); + $idP = $dbc->prepare_statement("SELECT trans_id FROM {$TRANS}PendingSpecialOrder WHERE + trans_id > 0 AND order_id=? ORDER BY trans_id"); + foreach($_REQUEST['toids'] as $toid){ + if ($count % 4 == 0){ + $pdf->AddPage(); + $pdf->SetDrawColor(0,0,0); + $pdf->Line(108,0,108,279); + $pdf->Line(0,135,215,135); + } + + $x = $count % 2 == 0 ? 5 : 115; + $y = ($count/2) % 2 == 0 ? 10 : 145; + $pdf->SetXY($x,$y); + + $tmp = explode(":",$toid); + $tid = $tmp[0]; + $oid = $tmp[1]; + + $r = $dbc->exec_statement($infoP, array($tid, $oid)); + $w = $dbc->fetch_row($r); + + // flag item as "printed" + $r2 = $dbc->exec_statement($flagP, array($tid, $oid)); + + $r3 = $dbc->exec_statement($idP, array($oid)); + $o_count = 0; + $rel_id = 1; + while($w3 = $dbc->fetch_row($r3)){ + $o_count++; + if ($w3['trans_id'] == $tid) + $rel_id = $o_count; + } + + $pdf->SetFont('Arial','','12'); + $pdf->Text($x+85,$y,"$rel_id / $o_count"); + + $pdf->SetFont('Arial','B','24'); + $pdf->Cell(100,10,$w['name'],0,1,'C'); + $pdf->SetFont('Arial','','12'); + $pdf->SetX($x); + $pdf->Cell(100,8,$w['fname'],0,1,'C'); + $pdf->SetX($x); + if ($w['card_no'] != 0){ + $pdf->Cell(100,8,"Owner #".$w['card_no'],0,1,'C'); + $pdf->SetX($x); + } + + $pdf->SetFont('Arial','','16'); + $pdf->Cell(100,9,$w['description'],0,1,'C'); + $pdf->SetX($x); + $pdf->Cell(100,9,"Cases: ".$w['ItemQtty'].' - '.$w['quantity'],0,1,'C'); + $pdf->SetX($x); + $pdf->SetFont('Arial','B','16'); + $pdf->Cell(100,9,sprintf("Total: \$%.2f",$w['total']),0,1,'C'); + $pdf->SetFont('Arial','','12'); + $pdf->SetX($x); + if ($w['discounttype'] == 1 || $w['discounttype'] == 2){ + $pdf->Cell(100,9,'Sale Price',0,1,'C'); + $pdf->SetX($x); + + } + elseif ($w['regPrice']-$w['total'] > 0){ + $percent = round(100 * (($w['regPrice']-$w['total'])/$w['regPrice'])); + $pdf->Cell(100,9,sprintf("Owner Savings: \$%.2f (%d%%)", + $w['regPrice'] - $w['total'],$percent),0,1,'C'); + $pdf->SetX($x); + } + $pdf->Cell(100,6,"Tag Date: ".$date,0,1,'C'); + $pdf->SetX($x); + $pdf->Cell(100,6,"Dept #".$w['department'],0,1,'C'); + $pdf->SetX($x); + $pdf->Cell(100,6,"Ph: ".$w['phone'],0,1,'C'); + $pdf->SetXY($x,$y+85); + $pdf->Cell(160,10,"Notes: _________________________________"); + $pdf->SetX($x); + + $upc = "454".str_pad($oid,6,'0',STR_PAD_LEFT).str_pad($tid,2,'0',STR_PAD_LEFT); + //$chk = $pdf->GetCheckDigit($upc); + + $pdf->UPC_A($x+30,$y+95,$upc); + + $count++; + } + + $pdf->Output(); + exit; +} + +$page_title = "Fannie :: Special Orders"; +$header = "Special Orders"; +include($FANNIE_ROOT.'src/header.html'); + +if (!isset($_REQUEST['oids'])){ + echo "No order(s) selected
        "; +} +else { + ?> + + '; + echo ''; + echo ''; + echo ''; + include($FANNIE_ROOT.'auth/login.php'); + $username = checkLogin(); + $cachepath = sys_get_temp_dir()."/ordercache/"; + if (file_exists("{$cachepath}{$username}.prints")){ + $prints = unserialize(file_get_contents("{$cachepath}{$username}.prints")); + foreach($prints as $oid=>$data){ + if (!in_array($oid,$_REQUEST['oids'])) + $_REQUEST['oids'][] = $oid; + } + } + $infoP = $dbc->prepare_statement("SELECT min(datetime) as orderDate,sum(total) as value, + count(*)-1 as items, + CASE WHEN MAX(p.card_no)=0 THEN MAX(t.last_name) ELSE MAX(c.LastName) END as name + FROM {$TRANS}PendingSpecialOrder AS p + LEFT JOIN custdata AS c ON c.CardNo=p.card_no AND personNum=p.voided + LEFT JOIN {$TRANS}SpecialOrderContact AS t ON t.card_no=p.order_id + WHERE p.order_id=?"); + $itemP = $dbc->prepare_statement("SELECT description,department,quantity,ItemQtty,total,trans_id + FROM {$TRANS}PendingSpecialOrder WHERE order_id=? AND trans_id > 0"); + foreach($_REQUEST['oids'] as $oid){ + $r = $dbc->exec_statement($infoP, array($oid)); + $w = $dbc->fetch_row($r); + printf(' + ', + $oid,$w['orderDate'],$w['name'],$w['value'],$w['items']); + + $r = $dbc->exec_statement($itemP, array($oid)); + while($w = $dbc->fetch_row($r)){ + if ($w['department']==0){ + echo ''; + echo ''; + } + else { + printf(' + + + ', + $w['description'],$w['department'],$w['ItemQtty'],$w['quantity'], + $w['total'],$w['trans_id'],$oid); + } + } + } + echo '
        Order #%d (%s, %s)Amt: $%.2fItems: %d 
         '; + echo 'No department set for: '.$w['description']; + echo '
         %s (%d)%d x %d$%.2f
        '; + echo '
        '; + echo ''; + echo ''; +} + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/ordering/view.js b/fannie/ordering/view.js new file mode 100644 index 000000000..828380bc5 --- /dev/null +++ b/fannie/ordering/view.js @@ -0,0 +1,456 @@ + +$(document).ready(function(){ + var initoid = $('#init_oid').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=loadCustomer&orderID='+initoid, + cache: false, + error: function(e1,e2,e3){ + alert(e1); + alert(e2); + alert(e3); + }, + success: function(resp){ + var tmp = resp.split("`"); + $('#customerDiv').html(tmp[0]); + $('#footerDiv').html(tmp[1]); + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=loadItems&orderID='+oid, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + } + }); + } + }); +}); + +$(window).unload(function() { + $('#nText').change(); + //$(':input').each(function(){ + // $(this).change(); + //}); +}); + + +function confirmC(oid,tid){ + var t = new Array(); + t[7] = "Completed"; + t[8] = "Canceled"; + t[9] = "Inquiry"; + + if (confirm("Are you sure you want to close this order as "+t[tid]+"?")){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=closeOrder&orderID='+oid+'&status='+tid, + cache: false, + success: function(resp){ + //location = 'review.php?orderID='+oid; + location = $('#redirectURL').val(); + } + }); + } +} +function memNumEntered(){ + var oid = $('#orderID').val(); + var cardno = $('#memNum').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=reloadMem&orderID='+oid+'&memNum='+cardno, + cache: false, + success: function(resp){ + var tmp = resp.split("`"); + $('#customerDiv').html(tmp[0]); + $('#footerDiv').html(tmp[1]); + } + }); +} + +function searchWindow(){ + window.open('search.php','Search', + 'width=350,height=400,status=0,toolbar=0,scrollbars=1'); +} + +function addUPC(){ + var oid = $('#orderID').val(); + var cardno = $('#memNum').val(); + var upc = $('#newupc').val(); + var qty = $('#newcases').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=newUPC&orderID='+oid+'&memNum='+cardno+'&upc='+upc+'&cases='+qty, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + if ($('#newqty').length) + $('#newqty').focus(); + } + }); +} +function deleteID(orderID,transID){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=deleteID&orderID='+orderID+'&transID='+transID, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + } + }); +} +function deleteUPC(orderID,upc){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=deleteUPC&orderID='+orderID+'&upc='+upc, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + } + }); +} +function saveDesc(new_desc,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveDesc&orderID='+oid+'&transID='+tid+'&desc='+new_desc, + cache: false, + success: function(resp){ + } + }); +} +function savePrice(new_price,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=savePrice&orderID='+oid+'&transID='+tid+'&price='+new_price, + cache: false, + success: function(resp){ + if ($('#discPercent'+upc).html() != 'Sale') + $('#discPercent'+upc).html(resp+"%"); + } + }); +} +function saveSRP(new_price,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveSRP&orderID='+oid+'&transID='+tid+'&srp='+new_price, + cache: false, + success: function(resp){ + var fields = resp.split('`') + $('#srp'+tid).val(fields[1]) + $('#act'+tid).val(fields[2]) + if ($('#discPercent'+tid).html() != 'Sale') + $('#discPercent'+tid).html(fields[0]+"%"); + } + }); +} +function saveCtC(val,oid){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveCtC&orderID='+oid+'&val='+val, + cache: false, + success: function(resp){ + } + }); +} +function saveQty(new_qty,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveQty&orderID='+oid+'&transID='+tid+'&qty='+new_qty, + cache: false, + success: function(resp){ + var tmp = resp.split('`'); + $('#srp'+tid).val(tmp[0]); + $('#act'+tid).val(tmp[1]); + } + }); +} +function saveUnit(new_unit,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveUnit&orderID='+oid+'&transID='+tid+'&unitPrice='+new_unit, + cache: false, + success: function(resp){ + var tmp = resp.split('`'); + $('#srp'+tid).val(tmp[0]); + $('#act'+tid).val(tmp[1]); + } + }); +} +function newQty(oid,tid){ + var qty = $('#newqty').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=newQty&orderID='+oid+'&transID='+tid+'&qty='+qty, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + } + }); +} +function newDept(oid,tid){ + var d = $('#newdept').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=newDept&orderID='+oid+'&transID='+tid+'&dept='+d, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + } + }); +} +function saveDept(new_dept,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveDept&orderID='+oid+'&transID='+tid+'&dept='+new_dept, + cache: false, + success: function(resp){ + } + }); +} +function saveVendor(new_vendor,tid){ + var oid = $('#orderID').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveVendor&orderID='+oid+'&transID='+tid+'&vendor='+new_vendor, + cache: false, + success: function(resp){ + } + }); +} +function saveFN(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveFN&orderID='+oid+'&fn='+val, + cache: false, + success: function(resp){} + }); +} +function saveLN(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveLN&orderID='+oid+'&ln='+val, + cache: false, + success: function(resp){} + }); +} +function saveCity(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveCity&orderID='+oid+'&city='+val, + cache: false, + success: function(resp){} + }); +} +function saveState(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveState&orderID='+oid+'&state='+val, + cache: false, + success: function(resp){} + }); +} +function saveZip(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveZip&orderID='+oid+'&zip='+val, + cache: false, + success: function(resp){} + }); +} +function savePh(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=savePh&orderID='+oid+'&ph='+val, + cache: false, + success: function(resp){} + }); +} +function savePh2(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=savePh2&orderID='+oid+'&ph2='+val, + cache: false, + success: function(resp){} + }); +} +function saveEmail(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveEmail&orderID='+oid+'&email='+val, + cache: false, + success: function(resp){} + }); +} +function saveAddr(oid){ + var addr1 = $('#t_addr1').val(); + var addr2 = $('#t_addr2').val(); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveAddr&addr1='+addr1+'&addr2='+addr2+'&orderID='+oid, + cache: false, + success: function(resp){} + }); +} +function saveNoteDept(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveNoteDept&val='+val+'&orderID='+oid, + cache: false, + success: function(resp){} + }); +} +function saveText(oid,val){ + val = escape(val); + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=saveText&val='+val+'&orderID='+oid, + cache: false, + success: function(resp){} + }); +} +function savePN(oid,val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=savePN&val='+val+'&orderID='+oid, + cache: false, + success: function(resp){} + }); +} +function saveConfirmDate(val,oid){ + if (val){ + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=confirmOrder&orderID='+oid, + cache: false, + success: function(resp){ + $('#confDateSpan').html('Confirmed '+resp); + } + }); + } + else { + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=unconfirmOrder&orderID='+oid, + cache: false, + success: function(resp){ + $('#confDateSpan').html('Not confirmed'); + } + }); + } +} +function togglePrint(username,oid){ + $.ajax({ + url: 'ajax-calls.php', + dataType: 'post', + data: 'action=UpdatePrint&orderID='+oid+'&user='+username, + cache: false, + success: function(resp){} + }); +} +function toggleO(oid,tid){ + $.ajax({ + url: 'ajax-calls.php', + dataType: 'post', + data: 'action=UpdateItemO&orderID='+oid+'&transID='+tid, + cache: false, + success: function(resp){} + }); +} +function toggleA(oid,tid){ + $.ajax({ + url: 'ajax-calls.php', + dataType: 'post', + data: 'action=UpdateItemA&orderID='+oid+'&transID='+tid, + cache: false, + success: function(resp){} + }); +} +function doSplit(oid,tid){ + var dcheck=false; + $('select.editDept').each(function(){ + if ($(this).val() == 0){ + dcheck=true; + } + }); + + if (dcheck){ + alert("Item(s) don't have a department set"); + return false; + } + + $.ajax({ + url: 'ajax-calls.php', + type: 'post', + data: 'action=SplitOrder&orderID='+oid+'&transID='+tid, + cache: false, + success: function(resp){ + $('#itemDiv').html(resp); + } + }); + +} +function validateAndHome(){ + var dcheck=false; + $('select.editDept').each(function(){ + if ($(this).val() == 0){ + dcheck=true; + } + }); + + if (dcheck){ + alert("Item(s) don't have a department"); + return false; + } + + var CtC = $('#ctcselect').val(); + if (CtC == 2){ + alert("Choose Call to Confirm option"); + return false; + } + + var nD = $('#nDept').val(); + var nT = $('#nText').val(); + if (nT != "" && nD == 0) + alert("Assign your notes to a department"); + else + location = $('#redirectURL').val(); + + return false; +} diff --git a/fannie/ordering/view.php b/fannie/ordering/view.php new file mode 100644 index 000000000..e8343a57f --- /dev/null +++ b/fannie/ordering/view.php @@ -0,0 +1,94 @@ +",$return_path); + +$prev = -1; +$next = -1; +$found = False; +$cachepath = sys_get_temp_dir()."/ordercache/"; +if (isset($_REQUEST['k']) && file_exists($cachepath.$_REQUEST['k'])){ + $fp = fopen($cachepath.$_REQUEST['k'],'r'); + while (($buffer = fgets($fp, 4096)) !== false) { + if ((int)$buffer == $orderID) $found = True; + else if (!$found) $prev = (int)$buffer; + else if ($found) { + $next = (int)$buffer; + break; + } + } + fclose($fp); + + echo '
        '; + if ($prev == -1) + echo 'Prev'; + else + printf('Prev',$prev,$_REQUEST['k']); + echo '
        '; + if ($next == -1) + echo 'Next'; + else + printf('Next',$next,$_REQUEST['k']); + echo '
        '; + echo '
        '; +} + + +?> +
        +Customer Information +
        +
        +
        +Order Items +
        +
        +
        + +",$orderID); +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/per_coop/README.html b/fannie/per_coop/README.html new file mode 100644 index 000000000..5188c4b71 --- /dev/null +++ b/fannie/per_coop/README.html @@ -0,0 +1,23 @@ + +per_coop/README + + +
        +27Feb3013 Re: $FANNIE/per_coop/*
        +The subdirectories, whose names match $FANNIE_COOP_ID for particular coops,
        +contain code that can be PHP include()'d by $FANNIE/src/navbar.html
        +to add options to the menu that will only appear for a the coop whose
        +$FANNIE_COOP_ID matches the subdirectory name.
        +
        +The files in the subdirectories are named:
        +
        +main-list.php           For a section in the top-level navbar.html menu.
        +main-index.php          A separate page the heading of that menu might link to.
        +
        +report-sales-list.php   A sub-list within the Reports > Sales group.
        +
        +navbar.php              A menu to completely replace $FANNIE/src/navbar.html
        +.                       Called from header.html
        +
        + + diff --git a/fannie/per_coop/WEFC_Toronto/index.php b/fannie/per_coop/WEFC_Toronto/index.php new file mode 100644 index 000000000..3a1bf7168 --- /dev/null +++ b/fannie/per_coop/WEFC_Toronto/index.php @@ -0,0 +1,47 @@ +"; +?> +
      • WEFC Item Editor
      • +
      • Upload Any File
      • +
      • Load Departments
      • +
      • Load Products
      • +
      • Product Export
      • + +"; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/per_coop/WEFC_Toronto/main-index.php b/fannie/per_coop/WEFC_Toronto/main-index.php new file mode 100644 index 000000000..2c53c6cee --- /dev/null +++ b/fannie/per_coop/WEFC_Toronto/main-index.php @@ -0,0 +1,45 @@ +"; +?> +
      • Upload Any File
      • +
      • Load Departments
      • +
      • Load Products
      • +
      • Product Export
      • +"; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/per_coop/WEFC_Toronto/main-list.php b/fannie/per_coop/WEFC_Toronto/main-list.php new file mode 100644 index 000000000..9ef7f00ae --- /dev/null +++ b/fannie/per_coop/WEFC_Toronto/main-list.php @@ -0,0 +1,16 @@ +
      • WEFC Toronto + +
      • +
        + WEFC Toronto utilities +
        diff --git a/fannie/per_coop/WEFC_Toronto/reports-sales-list.php b/fannie/per_coop/WEFC_Toronto/reports-sales-list.php new file mode 100644 index 000000000..8d26ea6da --- /dev/null +++ b/fannie/per_coop/WEFC_Toronto/reports-sales-list.php @@ -0,0 +1,5 @@ + diff --git a/fannie/reports/AR/index.php b/fannie/reports/AR/index.php new file mode 100644 index 000000000..19294192e --- /dev/null +++ b/fannie/reports/AR/index.php @@ -0,0 +1,35 @@ +prepare_statement("select charges,trans_num,payments, + year(tdate),month(tdate),day(tdate) + from ar_history AS s + WHERE s.card_no=? ORDER BY tdate DESC"); +if ($memNum == 0){ + echo "Error: no member specified"; +} +else { + echo ""; + echo ""; + $r = $dbc->exec_statement($q,array($memNum)); + while($w = $dbc->fetch_row($r)){ + printf('', + $w[4],$w[5],$w[3],$FANNIE_URL,$w[3],$w[4],$w[5],$w[1],$w[1], + ($w[0]!=0?$w[0]:$w[2]),($w[0]!=0?'Charge':'Payment')); + } + echo "
        DateReceiptAmountType
        %d/%d/%d + %s + %.2f%s
        "; +} + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/reports/BasketLimited/index.php b/fannie/reports/BasketLimited/index.php new file mode 100644 index 000000000..d588d9580 --- /dev/null +++ b/fannie/reports/BasketLimited/index.php @@ -0,0 +1,151 @@ +prepare_statement("CREATE TABLE groupingTempBS (year int, month int, day int, trans_num varchar(25))"); + $dbc->exec_statement($create); + + $setupQ = $dbc->prepare_statement("INSERT INTO groupingTempBS + SELECT year(tdate),month(tdate),day(tdate),trans_num + FROM $dlog AS d WHERE tdate BETWEEN ? AND ? + AND trans_type IN ('I','D') + GROUP BY year(tdate),month(tdate),day(tdate),trans_num + HAVING COUNT(*) <= ?"); + $dbc->exec_statement($setupQ,array($date1.' 00:00:00',$date2.' 23:59:59',$qty)); + + echo '

        Basket Size '.$qty.' or less

        '; + + $reportQ = $dbc->prepare_statement("SELECT d.upc,description,sum(d.quantity),count(*),sum(total) FROM + $dlog AS d INNER JOIN groupingTempBS as g ON + year(tdate)=g.year AND month(tdate)=g.month AND + day(tdate)=g.day AND d.trans_num=g.trans_num + LEFT JOIN products AS p ON d.upc=p.upc + WHERE trans_type IN ('I','D') GROUP BY + d.upc,description HAVING sum(total) <> 0 + ORDER BY count(*) DESC"); + $reportR = $dbc->exec_statement($reportQ); + + echo ''; + echo ''; + while($w = $dbc->fetch_row($reportR)){ + printf('', + $w[0],$w[1],$w[3],$w[2],$w[4]); + } + echo '
        UPCDescription# TransQty$
        %s%s%.2f%.2f%.2f
        '; + + $drop = $dbc->prepare_statement("DROP TABLE groupingTempBS"); + $dbc->exec_statement($drop); + + return; +} + +$page_title = "Fannie : Basket Size Limited Movement"; +$header = "Basket Size Limited Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + +

        Size Limit (Qty)

        +

        Excel

        +

        + +

        +

        + +

        +
        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
          
        +
        +
        + + + + + diff --git a/fannie/reports/BatchReport/BatchReport.php b/fannie/reports/BatchReport/BatchReport.php new file mode 100644 index 000000000..3ccc0366a --- /dev/null +++ b/fannie/reports/BatchReport/BatchReport.php @@ -0,0 +1,262 @@ +header = "Select batch(es)"; + $this->title = "Fannie :: Batch Report"; + $this->report_cache = 'day'; + + if (isset($_REQUEST['batchID'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('UPC','Description','$','Qty'); + + $this->header = "Batch Report"; // gets used as filename on xls/csv + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $bStart = FormLib::get_form_value('start',''); + $bEnd = FormLib::get_form_value('end',''); + + /** + Assemble argument array and appropriate string + for an IN clause in a prepared statement + */ + $batchID = FormLib::get_form_value('batchID','0'); + $inArgs = array(); + $inClause = '('; + foreach($batchID as $bID){ + $inClause .= '?,'; + $inArgs[] = $bID; + } + $inClause = rtrim($inClause,',').')'; + + $batchInfoQ = 'SELECT batchName, + year(startDate) as sy, month(startDate) as sm, day(startDate) as sd, + year(endDate) as ey, month(endDate) as em, day(endDate) as ed + FROM batches where batchID IN '.$inClause; + $batchInfoP = $dbc->prepare_statement($batchInfoQ); + $batchInfoR = $dbc->exec_statement($batchInfoP, $inArgs); + + $bName = ""; + while($batchInfoW = $dbc->fetch_array($batchInfoR)){ + $bName .= $batchInfoW['batchName']." "; + if (empty($bStart)) { + $bStart = sprintf("%d-%02d-%02d",$batchInfoW['sy'], + $batchInfoW['sm'],$batchInfoW['sd']); + } + if (empty($bEnd)){ + $bEnd = sprintf("%d-%02d-%02d",$batchInfoW['ey'], + $batchInfoW['em'],$batchInfoW['ed']); + } + } + + $dlog = select_dlog($bStart,$bEnd); + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumUpcSalesByDay"; + $bStart .= ' 00:00:00'; + $bEnd .= ' 23:59:59'; + + $salesBatchQ ="select d.upc, b.description, sum(d.total) as sales, + sum(d.quantity) as quantity + FROM $dlog as d left join batchMergeTable as b + ON d.upc = b.upc + WHERE + b.batchID IN $inClause + AND d.tdate BETWEEN ? AND ? + GROUP BY d.upc, b.description + ORDER BY d.upc"; + $salesBatchP = $dbc->prepare_statement($salesBatchQ); + $inArgs[] = $bStart; + $inArgs[] = $bEnd; + $salesBatchR = $dbc->exec_statement($salesBatchP, $inArgs); + + /** + Simple report + + Issue a query, build array of results + */ + $ret = array(); + while ($row = $dbc->fetch_array($salesBatchR)){ + $record = array(); + $record[] = $row['upc']; + $record[] = $row['description']; + $record[] = $row['sales']; + $record[] = $row['quantity']; + $ret[] = $record; + } + return $ret; + } + + /** + Sum the quantity and total columns + */ + function calculate_footers($data){ + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[3]; + $sumSales += $row[2]; + } + return array('Total',null,$sumSales,$sumQty); + } + + function form_content(){ + global $dbc; + + $filter1 = FormLib::get_form_value('btype',''); + $filter2 = FormLib::get_form_value('owner',''); + + $ownerQ = $dbc->prepare_statement("SELECT super_name FROM superDeptNames WHERE superID > 0 + ORDER BY superID"); + $ownerR = $dbc->exec_statement($ownerQ); + $o_opts = ""; + while($ownerW = $dbc->fetch_row($ownerR)){ + $o_opts .= sprintf("", + ((isset($_REQUEST['owner'])&&$_REQUEST['owner']==$ownerW[0])?'selected':''), + $ownerW[0]); + } + + $typeQ = $dbc->prepare_statement("SELECT batchTypeID,typeDesc FROM batchType ORDER BY batchTypeID"); + $typeR = $dbc->exec_statement($typeQ); + $t_opts = ""; + while($typeW = $dbc->fetch_row($typeR)){ + $t_opts .= sprintf("", + ((isset($_REQUEST['btype'])&&$_REQUEST['btype']==$typeW[0])?'selected':''), + $typeW[0],$typeW[1]); + } + + + echo "Filter: "; + echo ''; + echo '    '; + echo ''; + + echo '
        '; + + $batchQ = "SELECT b.batchID,batchName FROM batches as b + LEFT JOIN batchowner as o ON b.batchID=o.batchID + WHERE 1=1 "; + $args = array(); + if ($filter1 !== ""){ + $batchQ .= " AND batchType=? "; + $args[] = $filter1; + } + if ($filter2 !== ""){ + $batchQ .= " AND owner=? "; + $args[] = $filter2; + } + $batchQ .= "ORDER BY b.batchID desc"; + $batchP = $dbc->prepare_statement($batchQ); + $batchR = $dbc->exec_statement($batchP, $args); + + echo '
        '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + echo '
        '; + echo ''; + echo 'Start Date
        End Date
        Excel
        '; + } + + function report_description_content(){ + global $dbc; + $ret = array(); + $bStart = FormLib::get_form_value('start',''); + $bEnd = FormLib::get_form_value('end',''); + $batchID = FormLib::get_form_value('batchID','0'); + $inArgs = array(); + $inClause = '('; + foreach($batchID as $bID){ + $inClause .= '?,'; + $inArgs[] = $bID; + } + $inClause = rtrim($inClause,',').')'; + $batchInfoQ = $dbc->prepare_statement("SELECT batchName,startDate as startDate, + endDate as endDate FROM batches where batchID in $inClause"); + $batchInfoR = $dbc->exec_statement($batchInfoQ,$inArgs); + $bName = ""; + while($batchInfoW = $dbc->fetch_array($batchInfoR)){ + $bName .= $batchInfoW['batchName']." "; + if (empty($bStart)) + $bStart = $batchInfoW['startDate']; + if (empty($bEnd)) + $bEnd = $batchInfoW['endDate']; + } + $ret[] = ''.$bName.''; + $ret[] = "From: $bStart to: $bEnd"; + return $ret; + } +} + +$obj = new BatchReport(); +$obj->draw_page(); +?> diff --git a/fannie/reports/BatchReport/index.php b/fannie/reports/BatchReport/index.php new file mode 100644 index 000000000..b3017db92 --- /dev/null +++ b/fannie/reports/BatchReport/index.php @@ -0,0 +1,28 @@ + diff --git a/fannie/reports/CCReport/index.php b/fannie/reports/CCReport/index.php new file mode 100644 index 000000000..b9640c0e2 --- /dev/null +++ b/fannie/reports/CCReport/index.php @@ -0,0 +1,69 @@ + + + +Date: +"; + +echo "

        Integrated CC Report for $date

        "; + +$seconds = strtotime($dateStr); +$start = date('Y-m-d 00:00:00',$seconds); +$end = date('Y-m-d 23:59:59',$seconds); +$query = $dbc->prepare_statement("SELECT q.datetime,q.laneno,q.cashierno,q.transno,q.amount, + q.PAN, year(q.datetime),day(q.datetime), + month(q.datetime),r.xResultMessage + FROM efsnetRequest q LEFT JOIN efsnetResponse r + on r.date=q.date and r.cashierNo=q.cashierNo and + r.transNo=q.transNo and r.laneNo=q.laneNo + and r.transID=q.transID + left join efsnetRequestMod m + on m.date = q.date and m.cashierNo=q.cashierNo and + m.transNo=q.transNo and m.laneNo=q.laneNo + and m.transID=q.transID + where q.datetime between ? AND ? + and q.laneNo <> 99 and q.cashierNo <> 9999 + and m.transID is null + order by q.datetime,q.laneNo,q.transNo,q.cashierNo"); +$result = $dbc->exec_statement($query,array($start,$end)); + +echo " + +"; +$sum = 0; +$htable = array(); +while($row = $dbc->fetch_row($result)){ + printf(" + + ", + (isset($htable[$row[4]."+".$row[5]])||$row[9]=="")?"class=hilite":"", + $row[0],$row[5],$row[4],$row[9], + $row[8],$row[6],$row[7],($row[2]."-".$row[1]."-".$row[3])); + if (strstr($row[9],"APPROVED") || $row[9] == "" || strstr($row[9],"PENDING")){ + $sum += $row[4]; + $htable[$row[4]."+".$row[5]] = 1; + } +} +printf("",$sum); +echo ""; +echo "
        Date & TimeCardAmountResponsePOS receipt
        %s%s%.2f%s + POS receipt
        Total Approved%.2f 
        "; + +?> diff --git a/fannie/reports/CashierRecords/index.php b/fannie/reports/CashierRecords/index.php new file mode 100644 index 000000000..0844605e0 --- /dev/null +++ b/fannie/reports/CashierRecords/index.php @@ -0,0 +1,51 @@ + + +
        > + + + + + + + + + +
        Start Date
        End Date
        +
        + +prepare_statement("select emp_no,sum(-total),count(*)/2, + year(tdate),month(tdate),day(tdate) + from $dlog as d where + tdate BETWEEN ? AND ? + AND trans_type='T' + GROUP BY year(tdate),month(tdate),day(tdate),emp_no + ORDER BY sum(-total) DESC"); + $r = $dbc->exec_statement($q,array($date.' 00:00:00',$date2.' 23:59:59')); +?> + +fetch_array($r)){ + echo ""; + printf('', + $row['emp_no'],$row[4],$row[5],$row[3],$row[1],$row[2]); + echo ""; + } + echo "
        Emp#Date$# of Trans (approx)
        %d%d/%d/%d%.2f%d
        "; +} +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/reports/Correlated/index.php b/fannie/reports/Correlated/index.php new file mode 100644 index 000000000..f6bf17d39 --- /dev/null +++ b/fannie/reports/Correlated/index.php @@ -0,0 +1,212 @@ +prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptR = $dbc->exec_statement($deptQ); +$depts = array(); +while ($deptW = $dbc->fetch_array($deptR)){ + $depts[$deptW[0]] = $deptW[1]; +} + +if (isset($_REQUEST['submit'])){ + $depts = $_REQUEST['depts']; + $upc = $_REQUEST['upc']; + $date1 = $_REQUEST['date1']; + $date2 = $_REQUEST['date2']; + $filters = $_REQUEST['filters']; + + $dClause = ""; + $dArgs = array(); + foreach($_REQUEST['depts'] as $d){ + $dClause .= "?,"; + $dArgs[] = $d; + } + $dClause = "(".rtrim($dClause,",").")"; + + + $where = "d.department IN $dClause"; + $inv = "d.department NOT IN $dClause"; + if ($upc != "") { + $upc = str_pad($upc,13,"0",STR_PAD_LEFT); + $where = "d.upc = ?"; + $inv = "d.upc <> ?"; + $dArgs = array($upc); + } + $dlog = select_dlog($date1,$date2); + + $filter = ""; + $fArgs = array(); + if (is_array($filters)){ + $fClause = ""; + foreach($filters as $f){ + $fClause .= "?,"; + $fArgs[] = $f; + } + $fClause = "(".rtrim($fClause,",").")"; + $filter = "AND d.department IN $fClause"; + } + + $query = $dbc->prepare_statement("CREATE TABLE groupingTemp (tdate varchar(11), emp_no int, register_no int, trans_no int)"); + $dbc->exec_statement($query); + + $dateConvertStr = ($FANNIE_SERVER_DBMS=='MSSQL')?'convert(char(11),d.tdate,110)':'convert(date(d.tdate),char)'; + + $loadQ = $dbc->prepare_statement("INSERT INTO groupingTemp + SELECT $dateConvertStr as tdate, + emp_no,register_no,trans_no FROM $dlog AS d + WHERE $where AND tdate BETWEEN ? AND ? + GROUP BY $dateConvertStr, emp_no,register_no,trans_no"); + $dArgs[] = $date1.' 00:00:00'; + $dArgs[] = $date2.' 23:59:59'; + $dbc->exec_statement($loadQ,$dArgs); + + $dataQ = $dbc->prepare_statement("SELECT d.upc,p.description,t.dept_no,t.dept_name, + SUM(d.quantity) AS quantity FROM + $dlog AS d INNER JOIN groupingTemp AS g + ON $dateConvertStr = g.tdate + AND g.emp_no = d.emp_no + AND g.register_no = d.register_no + AND g.trans_no = d.trans_no + LEFT JOIN products AS p on d.upc=p.upc + LEFT JOIN departments AS t + ON d.department=t.dept_no + WHERE $inv + AND trans_type IN ('I','D') + AND d.tdate BETWEEN ? AND ? + AND d.trans_status='' + $filter + GROUP BY d.upc,p.description,t.dept_no,t.dept_name + ORDER BY SUM(d.quantity) DESC"); + foreach($fArgs as $f) $dArgs[] = $f; + $dataR = $dbc->exec_statement($dataQ,$dArgs); + + if (isset($_REQUEST['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="groupingReport.xls"'); + } + + echo "Corresponding sales for: "; + if ($upc == "") + echo "departments $dClause"; + else + echo "UPC $upc"; + if ($filter != "") + echo "
        Filtered to departments $fClause"; + echo "
        Period: $date1 to $date2

        "; + echo " + "; + while($dataW = $dbc->fetch_row($dataR)){ + printf("", + $dataW['upc'],$dataW['description'],$dataW['dept_no'], + $dataW['dept_name'],$dataW['quantity']); + } + echo "
        UPCDescDeptQty
        %s%s%d %s%.2f
        "; + + $drop = $dbc->prepare_statement("DROP TABLE groupingTemp"); + $dbc->exec_statement($drop); + exit; +} + +$page_title = "Fannie : Correlated Movement"; +$header = "Correlated Movement Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + + + + +

        + + + + + + + + + + + +
        +
        + Department(s)
        + +
        +
        + UPC: +
        +
        Start date
        End date
        +
        + + + + + + + +
        Result Filter (optional)
        + +
        +
        + + Excel +
        + diff --git a/fannie/reports/CustomerCount/CustomerCountReport.php b/fannie/reports/CustomerCount/CustomerCountReport.php new file mode 100644 index 000000000..68206d5f1 --- /dev/null +++ b/fannie/reports/CustomerCount/CustomerCountReport.php @@ -0,0 +1,186 @@ +title = "Fannie : Customer Report"; + $this->header = "Customer Report"; + $this->report_cache = 'day'; + + if (isset($_REQUEST['date1'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + + $typeQ = $dbc->prepare_statement("SELECT memtype,memDesc FROM memtype ORDER BY memtype"); + $typeR = $dbc->exec_statement($typeQ); + $this->memtypes = array(); + $this->report_headers = array('Date'); + while($typeW = $dbc->fetch_row($typeR)){ + $this->report_headers[] = $typeW['memDesc']; + $this->memtypes[$typeW['memtype']] = $typeW['memDesc']; + } + $this->report_headers[] = 'Total'; + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $date1 = FormLib::get_form_value('date1',date('Y-m-d')); + $date2 = FormLib::get_form_value('date2',date('Y-m-d')); + + $dlog = select_dlog($date1,$date2); + $date1 .= ' 00:00:00'; + $date2 .= ' 23:59:59'; + + $sales = "SELECT year(tdate) as year, month(tdate) as month, + day(tdate) as day,max(memType) as memType,trans_num + FROM $dlog as t + WHERE + tdate BETWEEN ? AND ? + and trans_type = 'T' + AND upc <> 'RRR' + group by year(tdate),month(tdate),day(tdate),trans_num + order by year(tdate),month(tdate),day(tdate),max(memType)"; + $salesP = $dbc->prepare_statement($sales); + $result = $dbc->exec_statement($salesP, array($date1, $date2)); + + /** + Create result records based on date and increment them + when the same type is encountered again + */ + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $stamp = date("M j, Y",mktime(0,0,0,$row['month'],$row['day'],$row['year'])); + if (!isset($ret[$stamp])){ + $ret[$stamp] = array("date"=>$stamp); + foreach($this->memtypes as $id=>$desc) + $ret[$stamp][$id] = 0; + $ret[$stamp]['ttl'] = 0; + } + $ret[$stamp]["ttl"]++; + $ret[$stamp][$row['memType']]++; + } + $ret = $this->dekey_array($ret); + return $ret; + } + + /** + Sum the quantity and total columns + */ + function calculate_footers($data){ + $sum = 0; + foreach($data as $row){ + $sum += $row[7]; + } + return array('Grand Total',null,null,null,null,null,null,$sum); + } + + function form_content(){ + $lastMonday = ""; + $lastSunday = ""; + + $ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); + while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); + } +?> +
        +
        + + + + + + + + + + + + + + +
        Start Date + +
        End Date
        + + +
        +
        +
        +draw_page(); +?> diff --git a/fannie/reports/CustomerCount/index.php b/fannie/reports/CustomerCount/index.php new file mode 100644 index 000000000..c53020413 --- /dev/null +++ b/fannie/reports/CustomerCount/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/reports/CustomerPurchases/CustomerPurchasesReport.php b/fannie/reports/CustomerPurchases/CustomerPurchasesReport.php new file mode 100644 index 000000000..b9acbd009 --- /dev/null +++ b/fannie/reports/CustomerPurchases/CustomerPurchasesReport.php @@ -0,0 +1,176 @@ +title = "Fannie : What Did I Buy?"; + $this->header = "What Did I Buy? Report"; + $this->report_cache = 'none'; + + if (isset($_REQUEST['date1'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('Date','UPC','Description','Dept','Cat','Qty','$'); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $date1 = FormLib::get_form_value('date1',date('Y-m-d')); + $date2 = FormLib::get_form_value('date2',date('Y-m-d')); + $card_no = FormLib::get_form_value('card_no','0'); + + $dlog = select_dlog($date1,$date2); + + $query = "select month(t.tdate),day(t.tdate),year(t.tdate), + t.upc,p.description, + t.department,d.dept_name,m.super_name, + sum(t.quantity) as qty, + sum(t.total) as ttl from + $dlog as t left join products as p on t.upc = p.upc + left join departments AS d ON t.department=d.dept_no + left join MasterSuperDepts AS m ON t.department=m.dept_ID + where t.card_no = ? AND + trans_type IN ('I','D') AND + tdate BETWEEN ? AND ? + group by year(t.tdate),month(t.tdate),day(t.tdate), + t.upc,p.description + order by year(t.tdate),month(t.tdate),day(t.tdate)"; + $args = array($card_no,$date1.' 00:00:00',$date2.' 23:59:59'); + + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + + /** + Simple report + + Issue a query, build array of results + */ + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + $record[] = $row[0]."/".$row[1]."/".$row[2]; + $record[] = $row['upc']; + $record[] = $row['description']; + $record[] = $row['department'].' '.$row['dept_name']; + $record[] = $row['super_name']; + $record[] = $row['qty']; + $record[] = $row['ttl']; + $ret[] = $record; + } + return $ret; + } + + function report_description_content(){ + $ret = array(); + $ret[] = "Movement from ".FormLib::get_form_value('date1','')." to ".FormLib::get_form_value('date2',''); + $ret[] = "For owner #".FormLib::get_form_value('card_no'); + return $ret; + } + + /** + Sum the quantity and total columns + */ + function calculate_footers($data){ + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[5]; + $sumSales += $row[6]; + } + return array('Total',null,null,null,null,$sumQty,$sumSales); + } + + function form_content(){ +?> +
        +
        + + + + + + + + + + + + + + + + + + + + +
        Owner# + + + + +
        Date Start + + + +
        End + +
        +
        +
        +draw_page(); +?> diff --git a/fannie/reports/CustomerPurchases/index.php b/fannie/reports/CustomerPurchases/index.php new file mode 100644 index 000000000..c25455d92 --- /dev/null +++ b/fannie/reports/CustomerPurchases/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/reports/DBA/index.php b/fannie/reports/DBA/index.php new file mode 100644 index 000000000..bf6e1d0b6 --- /dev/null +++ b/fannie/reports/DBA/index.php @@ -0,0 +1,175 @@ +prepare_statement("SELECT reportName,reportQuery FROM + customReports WHERE reportID=?"); + $r = $dbc->exec_statement($q,array($_REQUEST['loadID'])); + $w = $dbc->fetch_row($r); + echo $w['reportName']; + echo '`'; + echo base64_decode($w['reportQuery']); + exit; +} + +$errors = ""; +$query = ""; +if (isset($_REQUEST['query'])){ + $query = $_REQUEST['query']; + if (stristr($query,"drop")) + $errors .= "Illegal term drop
        "; + if (stristr($query,"truncate")) + $errors .= "Illegal term truncate
        "; + if (stristr($query,"delete")) + $errors .= "Illegal term delete
        "; + if (stristr($query,"update")) + $errors .= "Illegal term update
        "; + if (stristr($query,"alter")) + $errors .= "Illegal term alter
        "; +} + +if ($errors == "" && $query != ""){ + $dlog = ""; + $dtrans = ""; + if (!empty($_REQUEST['date1']) && !empty($_REQUEST['date2'])){ + $dlog = select_dlog($_REQUEST['date1'],$_REQUEST['date2']); + $dtrans = select_dtrans($_REQUEST['date1'],$_REQUEST['date2']); + } + elseif (!empty($_REQUEST['date1'])){ + $dlog = select_dlog($_REQUEST['date1']); + $dtrans = select_dtrans($_REQUEST['date1']); + } + + if (!empty($dlog)) + $query = str_ireplace(" dlog "," ".$dlog." ",$query); + if (!empty($dtrans)) + $query = str_ireplace(" dtransactions "," ".$dtrans." ",$query); + + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($query); + if (!$result){ + echo "Error occured: ".$dbc->error(); + echo "
        "; + echo "Your query: ".$query; + } + else if ($dbc->num_rows($result) == 0){ + echo "Query returned zero results
        "; + echo "Your query: ".$query; + } + else { + if (isset($_REQUEST['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="resultset.xls"'); + ob_start(); + } + echo ''; + echo ''; + $num = $dbc->num_fields($result); + for($i=0;$i<$num;$i++){ + echo '"; + } + echo ''; + while($row = $dbc->fetch_row($result)){ + echo ''; + for($i=0;$i<$num;$i++) + echo ''; + echo ''; + } + echo '
        '.$dbc->field_name($result,$i)."
        '.$row[$i].'
        '; + + if (isset($_REQUEST['excel'])){ + $output = ob_get_contents(); + ob_end_clean(); + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $array = HtmlToArray($output); + $xls = ArrayToXls($array); + echo $xls; + } + + if (!empty($_REQUEST['repName'])){ + $name = $_REQUEST['repName']; + $saveableQ = base64_encode($_REQUEST['query']); + + $chkQ = $dbc->prepare_statement("SELECT reportID FROM customReports WHERE reportName=?"); + $chkR = $dbc->exec_statement($chkQ,array($name)); + if ($dbc->num_rows($chkR) == 0){ + $idQ = $dbc->prepare_statement("SELECT max(reportID) FROM customReports"); + $idR = $dbc->exec_statement($idQ); + $id = array_pop($dbc->fetch_row($idR)); + $id = ($id=="")?1:$id+1; + $insQ = $dbc->prepare_statement("INSERT INTO customReports (reportID,reportName,reportQuery) + VALUES (?,?,?)"); + $insR = $dbc->exec_statement($insQ,array($id,$name,$saveableQ)); + } + else { + $id = array_pop($dbc->fetch_row($chkR)); + $upQ = $dbc->prepare_statement("UPDATE customReports SET reportQuery=? WHERE reportID=?"); + $upR = $dbc->exec_statement($upQ,array($saveableQ,$id)); + } + } + } +} +else { + $header = "Reporting for DBAs"; + $page_title = "Fannie :: Skip learning PHP/HTML"; + include($FANNIE_ROOT.'src/header.html'); + + if (!empty($errors)) + echo "
        ".$errors."
        "; + + $q = $dbc->prepare_statement("SELECT reportID,reportName FROM customReports ORDER BY reportName"); + $r = $dbc->exec_statement($q); + $opts = ""; + while($w = $dbc->fetch_row($r)) + $opts .= sprintf('',$w['reportID'],$w['reportName']); + + ?> + + +
        + Saved reports: +

        Save As +

        + +

        + Date range + + +
        + +

        + +

        '; + + include($FANNIE_ROOT.'src/footer.html'); +} + +?> diff --git a/fannie/reports/DepartmentMovement/DepartmentMovementReport.php b/fannie/reports/DepartmentMovement/DepartmentMovementReport.php new file mode 100644 index 000000000..143fc4fb8 --- /dev/null +++ b/fannie/reports/DepartmentMovement/DepartmentMovementReport.php @@ -0,0 +1,386 @@ +report_cache = 'none'; + $this->title = "Fannie : Department Movement"; + $this->header = "Department Movement"; + + if (isset($_REQUEST['date1'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + /** + Add a javascript function for the form + This could probably be re-done in jQuery and + just inlined directly into the form + */ + function javascript_content(){ + if ($this->content_function == "form_content"){ + ob_start(); + ?> + function swap(src,dst){ + var val = document.getElementById(src).value; + document.getElementById(dst).value = val; + } + 0){ + $filter_condition = 's.superID=?'; + $args = array($buyer); + } + elseif ($buyer !== "" && $buyer == -1){ + $filter_condition = "1=1"; + $args = array(); + } + elseif ($buyer !== "" && $buyer == -2){ + $filter_condition = "s.superID<>0"; + $args = array(); + } + + /** + Select a summary table. For UPC results, per-unique-ring + summary is needed. For date/dept/weekday results the + per-department summary is fine (and a smaller table) + */ + $dlog = select_dlog($date1,$date2); + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumRingSalesByDay"; + if (substr($dlog,-4)=="dlog") + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."vRingSalesToday"; + if ($groupby != "PLU"){ + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumDeptSalesByDay"; + if (substr($dlog,-4)=="dlog") + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."vDeptSalesToday"; + } + + /** + Build an appropriate query depending on the grouping option + */ + $query = ""; + $superTable = ($buyer !== "" && $buyer > 0) ? 'superdepts' : 'MasterSuperDepts'; + $args[] = $date1.' 00:00:00'; + $args[] = $date2.' 23:59:59'; + switch($groupby){ + case 'PLU': + $query = "SELECT t.upc,p.description, + SUM(t.quantity) as qty, + SUM(t.total) AS total, + d.dept_no,d.dept_name,s.superID,x.distributor + FROM $dlog as t LEFT JOIN products as p on t.upc = p.upc + LEFT JOIN departments as d on d.dept_no = t.department + LEFT JOIN $superTable AS s ON t.department = s.dept_ID + LEFT JOIN prodExtra as x on t.upc = x.upc + WHERE $filter_condition + AND tdate BETWEEN ? AND ? + GROUP BY t.upc,p.description, + d.dept_no,d.dept_name,s.superID,x.distributor ORDER BY SUM(t.total) DESC"; + break; + case 'Department': + $query = "SELECT t.department,d.dept_name,SUM(t.quantity) as Qty, SUM(total) as Sales + FROM $dlog as t LEFT JOIN departments as d on d.dept_no=t.department + LEFT JOIN $superTable AS s ON s.dept_ID = t.department + WHERE $filter_condition + AND tdate BETWEEN ? AND ? + GROUP BY t.department,d.dept_name ORDER BY SUM(total) DESC"; + break; + case 'Date': + $query = "SELECT year(tdate),month(tdate),day(tdate),SUM(t.quantity) as Qty, SUM(total) as Sales + FROM $dlog as t LEFT JOIN departments as d on d.dept_no=t.department + LEFT JOIN $superTable AS s ON s.dept_ID = t.department + WHERE $filter_condition + AND tdate BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(tdate) + ORDER BY year(tdate),month(tdate),day(tdate)"; + break; + case 'Weekday': + $cols = $dbc->dayofweek("tdate").",CASE + WHEN ".$dbc->dayofweek("tdate")."=1 THEN 'Sun' + WHEN ".$dbc->dayofweek("tdate")."=2 THEN 'Mon' + WHEN ".$dbc->dayofweek("tdate")."=3 THEN 'Tue' + WHEN ".$dbc->dayofweek("tdate")."=4 THEN 'Wed' + WHEN ".$dbc->dayofweek("tdate")."=5 THEN 'Thu' + WHEN ".$dbc->dayofweek("tdate")."=6 THEN 'Fri' + WHEN ".$dbc->dayofweek("tdate")."=7 THEN 'Sat' + ELSE 'Err' END"; + $query = "SELECT $cols,SUM(t.quantity) as Qty, SUM(total) as Sales + FROM $dlog as t LEFT JOIN departments as d on d.dept_no=t.department + LEFT JOIN $superTable AS s ON s.dept_ID = t.department + WHERE $filter_condition + AND tdate BETWEEN ? AND ? + GROUP BY $cols + ORDER BY ".$dbc->dayofweek('tdate'); + break; + } + + /** + Copy the results into an array. Date requires a + special case to combine year, month, and day into + a single field + */ + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + if ($groupby == "Date"){ + $record[] = $row[1]."/".$row[2]."/".$row[0]; + $record[] = $row[3]; + $record[] = $row[4]; + } + else { + for($i=0;$i<$dbc->num_fields($result);$i++) + $record[] .= $row[$i]; + } + $ret[] = $record; + } + return $ret; + } + + /** + Sum the quantity and total columns for a footer, + but also set up headers and sorting. + + The number of columns varies depending on which + data grouping the user selected. + */ + function calculate_footers($data){ + // no data; don't bother + if (empty($data)) + return array(); + + /** + Use the width of the first record to determine + how the data is grouped + */ + switch(count($data[0])){ + case 8: + $this->report_headers = array('UPC','Description','Qty','$', + 'Dept#','Department','Subdept','Vendor'); + $this->sort_column = 3; + $this->sort_direction = 1; + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[3]; + } + return array('Total',null,$sumQty,$sumSales,null,null,null,null); + break; + case 4: + /** + The Department and Weekday datasets are both four + columns wide so I have to resort to form parameters + */ + if (FormLib::get_form_value('sort')=='Weekday'){ + $this->report_headers = array('Day','Day','Qty','$'); + $this->sort_column = 0; + $this->sort_direction = 0; + } + else { + $this->report_headers = array('Dept#','Department','Qty','$'); + $this->sort_column = 3; + $this->sort_direction = 1; + } + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[3]; + } + return array('Total',null,$sumQty,$sumSales); + break; + case 3: + $this->report_headers = array('Date','Qty','$'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[1]; + $sumSales += $row[2]; + } + return array('Total',$sumQty,$sumSales); + break; + } + } + + function report_description_content(){ + $ret = array(); + $ret[] = "Movement from ".FormLib::get_form_value('date1','')." to ".FormLib::get_form_value('date2',''); + $ret[] = "Summed by ".FormLib::get_form_value('sort',''); + $buyer = FormLib::get_form_value('buyer',''); + if ($buyer === '0'){ + $ret[] = "Department ".FormLib::get_form_value('deptStart','').' to '.FormLib::get_form_value('deptEnd',''); + } + return $ret; + } + + function form_content(){ + global $dbc; + $deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); + $deptsR = $dbc->exec_statement($deptsQ); + $deptsList = ""; + + $deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM superDeptNames + WHERE superID <> 0 + ORDER BY superID"); + $deptSubR = $dbc->exec_statement($deptSubQ); + + $deptSubList = ""; + while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=" "; + } + while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; +?> +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Select Buyer/Dept + Send to Excel
        Selecting a Buyer/Dept overrides Department Start/Department End, but not Date Start/End. + To run reports for a specific department(s) leave Buyer/Dept or set it to 'blank'

        Department Start

        +

        End

        + + +

        +

        + + +

        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
        Sum movement by? + +
          
        +
        +draw_page(); +?> diff --git a/fannie/reports/DepartmentMovement/index.php b/fannie/reports/DepartmentMovement/index.php new file mode 100644 index 000000000..55d44eb2a --- /dev/null +++ b/fannie/reports/DepartmentMovement/index.php @@ -0,0 +1,128 @@ +prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $dbc->exec_statement($deptsQ); +$deptsList = ""; + +$deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM superDeptNames + WHERE superID <> 0 + ORDER BY superID"); +$deptSubR = $dbc->exec_statement($deptSubQ); + +$deptSubList = ""; +while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=" "; +} +while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Fannie : Department Movement"; +$header = "Department Movement"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Select Buyer/Dept + Send to Excel
        Selecting a Buyer/Dept overrides Department Start/Department End, but not Date Start/End. + To run reports for a specific department(s) leave Buyer/Dept or set it to 'blank'

        Department Start

        +

        End

        + + +

        +

        + + +

        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
        Sum movement by? Date format is YYYY-MM-DD
        (e.g. 2004-04-01 = April 1, 2004) +
          
        +
        + + diff --git a/fannie/reports/DepartmentSettings/index.php b/fannie/reports/DepartmentSettings/index.php new file mode 100644 index 000000000..398cd4f8d --- /dev/null +++ b/fannie/reports/DepartmentSettings/index.php @@ -0,0 +1,144 @@ +Save to Excel"; + } + else { + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="departmentSettings.xls"'); + } + + echo ""; + if (!isset($_REQUEST['excel'])){ + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + else { + echo ""; + } + echo ""; + + $query = $dbc->prepare_statement("SELECT d.dept_no,d.dept_name,c.salesCode,m.margin, + CASE WHEN d.dept_tax=0 THEN 'NoTax' ELSE t.description END as tax, + CASE WHEN d.dept_fs=1 THEN 'Yes' ELSE 'No' END as fs + FROM departments AS d LEFT JOIN taxrates AS t + ON d.dept_tax = t.id LEFT JOIN deptSalesCodes AS c + ON d.dept_no=c.dept_ID LEFT JOIN deptMargin AS m + ON d.dept_no=m.dept_ID $join + WHERE $where + ORDER BY d.dept_no"); + $result = $dbc->exec_statement($query,$args); + while($row = $dbc->fetch_row($result)){ + printf(" + ",$row[0], + (isset($_REQUEST['excel']))?$row[1]:"$row[1]", + $row[2],$row[3]*100,$row[4],$row[5]); + } + echo "
        Dept #Dept NameSales CodeMarginTaxFSDept #Dept NameSales CodeMarginTaxFS
        %d%s%d%.2f%%%s%s
        "; +} +else { +$opts = ""; +$prep = $dbc->prepare_statement("SELECT superID,super_name fROM superDeptNames ORDER BY super_name"); +$resp = $dbc->exec_statement($prep); +while($row = $dbc->fetch_row($resp)) + $opts .= ""; +$depts = ""; +$prep = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); +$resp = $dbc->exec_statement($prep); +$d1 = False; +while($row = $dbc->fetch_row($resp)){ + $depts .= ""; + if ($d1 === False) $d1 = $row[0]; +} +?> + + +
        +
        +

        + +

        +

        +

        + + +

        + + +

        + +

        +
        + diff --git a/fannie/reports/DepartmentTransactionCount/index.php b/fannie/reports/DepartmentTransactionCount/index.php new file mode 100644 index 000000000..f1459616e --- /dev/null +++ b/fannie/reports/DepartmentTransactionCount/index.php @@ -0,0 +1,137 @@ +prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $dbc->exec_statement($deptsQ); +$deptsList = ""; + +$deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM superDeptNames + WHERE superID <> 0 + ORDER BY superID"); +$deptSubR = $dbc->exec_statement($deptSubQ); + +$deptSubList = ""; +while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=" "; +} +while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Fannie : Department Transactions Report"; +$header = "Department Transactions"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Select Buyer/Dept + Send to Excel
        Selecting a Buyer/Dept overrides Department Start/Department End, but not Date Start/End. + To run reports for a specific department(s) leave Buyer/Dept or set it to 'blank'

        Department Start

        +

        End

        + + +

        +

        + + +

        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
        Date format is YYYY-MM-DD
        (e.g. 2004-04-01 = April 1, 2004)
          
        +
        + + diff --git a/fannie/reports/DepartmentTransactionCount/report.php b/fannie/reports/DepartmentTransactionCount/report.php new file mode 100644 index 000000000..4f74480b8 --- /dev/null +++ b/fannie/reports/DepartmentTransactionCount/report.php @@ -0,0 +1,111 @@ +prepare_statement($queryAll); + $result = $dbc->exec_statement($prep,$argsAll); + while($row = $dbc->fetch_row($result)){ + $datestr = sprintf("%d/%d/%d",$row['month'],$row['day'],$row['year']); + $dataset[$datestr] = array('ttl'=>$row['trans_count'],'sub'=>0); + } + + $prep = $dbc->prepare_statement($querySelected); + $result = $dbc->exec_statement($prep,$argsSel); + while($row = $dbc->fetch_row($result)){ + $datestr = sprintf("%d/%d/%d",$row['month'],$row['day'],$row['year']); + if (isset($dataset[$datestr])) + $dataset[$datestr]['sub'] =$row['trans_count']; + } + + echo ''; + echo ''; + foreach($dataset as $date => $count){ + printf('', + $date,$count['sub'],$count['ttl']); + } + echo '
        Date# Matching Trans# Total Trans
        %s%d%d
        '; + + $output = ob_get_contents(); + ob_end_clean(); + + if (!isset($_REQUEST['excel'])){ + echo $output; + } + else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $array = HtmlToArray($output); + $xls = ArrayToXls($array); + echo $xls; + } +?> diff --git a/fannie/reports/Discounts/index.php b/fannie/reports/Discounts/index.php new file mode 100644 index 000000000..3a5e6b3b6 --- /dev/null +++ b/fannie/reports/Discounts/index.php @@ -0,0 +1,101 @@ +Save to Excel", + $d1,$d2); + } + + $placeholder = isset($_REQUEST['excel'])?'':' '; + + $query = $dbc->prepare_statement("SELECT m.memDesc,sum(total) as total FROM $dlog AS d + LEFT JOIN custdata AS c ON d.card_no=c.CardNo + AND c.personNum=1 LEFT JOIN memtype AS m ON + c.memType=m.memtype + WHERE d.upc='DISCOUNT' + GROUP BY m.memDesc + ORDER BY m.memDesc"); + $result = $dbc->exec_statement($query); + + echo ''; + echo ''; + while($row = $dbc->fetch_row($result)){ + printf('', + $row['memDesc'],$row['total']); + } + echo '
        TypeTotal
        %s%.2f
        '; + + +} +else { + +$page_title = "Fannie : Discount Report"; +$header = "Discount Report"; +include($FANNIE_ROOT.'src/header.html'); +$lastMonday = ""; +$lastSunday = ""; + +$ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); +while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); +} +?> + +
        + + + + + + + + + + + +
        Start Date
        End Date
        Excel
        +
        + diff --git a/fannie/reports/Email/index.php b/fannie/reports/Email/index.php new file mode 100644 index 000000000..86d45968e --- /dev/null +++ b/fannie/reports/Email/index.php @@ -0,0 +1,77 @@ +prepare_statement($q); + $r = $dbc->exec_statement($p,$args); + + echo 'Matched '.$dbc->num_rows($r).' accounts'; + echo '    '; + echo '
        '; + echo ''; +} +else { + echo '
        '; + echo '
        Include Types'; + $p = $dbc->prepare_statement("SELECT memtype,memDesc FROM memtype ORDER BY memtype"); + $r = $dbc->exec_statement($p); + while($w = $dbc->fetch_row($r)){ + printf(' %s
        ', + $w['memtype'],$w['memDesc']); + } + echo '
        '; + echo '
        '; + echo ' Include Inactive Accounts
        '; + echo '
        '; + echo '
        '; + echo '
        '; + echo '
        '; +} + + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/reports/Equity/index.php b/fannie/reports/Equity/index.php new file mode 100644 index 000000000..7269f5f2e --- /dev/null +++ b/fannie/reports/Equity/index.php @@ -0,0 +1,39 @@ +prepare_statement("select stockPurchase,trans_num,dept_name, + year(tdate),month(tdate),day(tdate) + from {$trans}.stockpurchases AS s LEFT JOIN + departments AS d ON s.dept=d.dept_no + WHERE s.card_no=? ORDER BY tdate DESC"); +if ($memNum == 0){ + echo "Error: no member specified"; +} +else { + echo ""; + echo ""; + $r = $dbc->exec_statement($q,array($memNum)); + while($w = $dbc->fetch_row($r)){ + printf('', + $w[4],$w[5],$w[3],$FANNIE_URL,$w[3],$w[4],$w[5],$w[1],$w[1], + $w[0],$w[2]); + } + echo "
        DateReceiptAmountType
        %d/%d/%d + %s + %.2f%s
        "; +} + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/reports/EquityAll/index.php b/fannie/reports/EquityAll/index.php new file mode 100644 index 000000000..498212644 --- /dev/null +++ b/fannie/reports/EquityAll/index.php @@ -0,0 +1,67 @@ + 0)"; + if ($_REQUEST['owed'] == 2) + $equity_restrict = "(n.payments > 0 AND n.payments < 100)"; + + $q = $dbc->prepare_statement("SELECT n.memnum,c.LastName,c.FirstName,n.payments,m.end_date + FROM custdata AS c LEFT JOIN {$trans}.newBalanceStockToday_test as n ON + n.memnum=c.CardNo AND c.personNum=1 + LEFT JOIN memDates as m ON c.CardNo=m.card_no + WHERE $type_restrict AND $equity_restrict + ORDER BY n.memnum"); + + echo ""; + echo ""; + $r = $dbc->exec_statement($q); + while($w = $dbc->fetch_row($r)){ + echo ""; + printf('',$FANNIE_URL."reports/Equity/index.php?memNum=",$w['memnum'],$w['memnum']); + echo ""; + echo ""; + printf('',$w['payments']); + echo ""; + echo ""; + } + echo "
        Mem #Last NameFirst NameEquityDue Date
        %d".$w['LastName']."".$w['FirstName']."%.2f".$w['end_date']."
        "; + exit; +} + +$header = "Current Member Equity"; +$page_title = "Fannie :: Equity History"; +include($FANNIE_ROOT.'src/header.html'); +?> +
        +Active status: + +

        +Equity balance: + +

        + +
        + diff --git a/fannie/reports/GeneralDay/GeneralDayReport.php b/fannie/reports/GeneralDay/GeneralDayReport.php new file mode 100644 index 000000000..cd5d261bd --- /dev/null +++ b/fannie/reports/GeneralDay/GeneralDayReport.php @@ -0,0 +1,249 @@ +title = "Fannie : General Day Report"; + $this->header = "General Day Report"; + $this->report_cache = 'none'; + $this->grandTTL = 1; + $this->multi_report_mode = True; + $this->sortable = False; + + if (isset($_REQUEST['date1'])){ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('Desc','Qty','Amount'); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB, $FANNIE_EQUITY_DEPARTMENTS; + $d1 = FormLib::get_form_value('date1',date('Y-m-d')); + $dates = array($d1.' 00:00:00',$d1.' 23:59:59'); + $data = array(); + + $dlog = select_dlog($d1); + $tenderQ = $dbc->prepare_statement("SELECT + TenderName,count(d.total),sum(d.total) as total + FROM $dlog as d , tenders as t + WHERE d.tdate BETWEEN ? AND ? + AND d.trans_subtype = t.TenderCode + and d.total <> 0 + GROUP BY t.TenderName ORDER BY TenderName"); + $tenderR = $dbc->exec_statement($tenderQ,$dates); + $report = array(); + while($tenderW = $dbc->fetch_row($tenderR)){ + $record = array($tenderW['TenderName'],$tenderW[1], + sprintf('%.2f',$tenderW['total'])); + $report[] = $record; + } + $data[] = $report; + + $salesQ = $dbc->prepare_statement("SELECT m.super_name,sum(d.quantity) as qty, + sum(d.total) as total FROM $dlog AS d LEFT JOIN + MasterSuperDepts AS m ON d.department=m.dept_ID + WHERE d.tdate BETWEEN ? AND ? + AND d.department <> 0 AND d.trans_type <> 'T' + GROUP BY m.super_name ORDER BY m.super_name"); + $salesR = $dbc->exec_statement($salesQ,$dates); + $report = array(); + while($salesW = $dbc->fetch_row($salesR)){ + $record = array($salesW['super_name'], + sprintf('%.2f',$salesW['qty']), + sprintf('%.2f',$salesW['total'])); + $report[] = $record; + } + $data[] = $report; + + $discQ = $dbc->prepare_statement("SELECT m.memDesc, SUM(d.total) AS Discount,count(*) + FROM $dlog d INNER JOIN + custdata c ON d.card_no = c.CardNo AND c.personNum=1 + INNER JOIN + memTypeID m ON c.memType = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND d.upc = 'DISCOUNT' + and total <> 0 + GROUP BY m.memDesc ORDER BY m.memDesc"); + $discR = $dbc->exec_statement($discQ,$dates); + $report = array(); + while($discW = $dbc->fetch_row($discR)){ + $record = array($discW['memDesc'],$discW[2],$discW[1]); + $report[] = $record; + } + $data[] = $report; + + $taxSumQ = $dbc->prepare_statement("SELECT sum(total) as tax_collected + FROM $dlog as d + WHERE d.tdate BETWEEN ? AND ? + AND (d.upc = 'tax') + GROUP BY d.upc"); + $taxR = $dbc->exec_statement($taxSumQ,$dates); + $report = array(); + while($taxW = $dbc->fetch_row($taxR)){ + $record = array('Sales Tax',null,round($taxW['tax_collected'],2)); + $report[] = $record; + } + $data[] = $report; + + $transQ = $dbc->prepare_statement("select q.trans_num,sum(q.quantity) as items,transaction_type, sum(q.total) from + ( + select trans_num,card_no,quantity,total, + m.memdesc as transaction_type + from $dlog as d + left join custdata as c on d.card_no = c.cardno + left join memTypeID as m on c.memtype = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND trans_type in ('I','D') + and upc <> 'RRR' + and c.personNum=1 + ) as q + group by q.trans_num,q.transaction_type"); + $transR = $dbc->exec_statement($transQ,$dates); + $trans_info = array(); + while($row = $dbc->fetch_array($transR)){ + if (!isset($transinfo[$row[2]])) + $transinfo[$row[2]] = array(0,0.0,0.0,0.0,0.0); + $transinfo[$row[2]][0] += 1; + $transinfo[$row[2]][1] += $row[1]; + $transinfo[$row[2]][3] += $row[3]; + } + $tSum = 0; + $tItems = 0; + $tDollars = 0; + foreach(array_keys($transinfo) as $k){ + $transinfo[$k][2] = round($transinfo[$k][1]/$transinfo[$k][0],2); + $transinfo[$k][4] = round($transinfo[$k][3]/$transinfo[$k][0],2); + $tSum += $transinfo[$k][0]; + $tItems += $transinfo[$k][1]; + $tDollars += $transinfo[$k][3]; + } + $transinfo["Totals"] = array($tSum,$tItems,round($tItems/$tSum,2),$tDollars,round($tDollars/$tSum,2)); + $report = array(); + foreach($transinfo as $title => $info){ + array_unshift($info,$title); + $report[] = $info; + } + $data[] = $report; + + $ret = preg_match_all("/[0-9]+/",$FANNIE_EQUITY_DEPARTMENTS,$depts); + if ($ret != 0){ + /* equity departments exist */ + $depts = array_pop($depts); + $dlist = "("; + foreach($depts as $d){ + $dates[] = $d; // add query param + $dlist .= '?,'; + } + $dlist = substr($dlist,0,strlen($dlist)-1).")"; + + $equityQ = $dbc->prepare_statement("SELECT d.card_no,t.dept_name, sum(total) as total + FROM $dlog as d left join departments as t ON d.department = t.dept_no + WHERE d.tdate BETWEEN ? AND ? + AND d.department IN $dlist + GROUP BY d.card_no, t.dept_name ORDER BY d.card_no, t.dept_name"); + $equityR = $dbc->exec_statement($equityQ,$dates); + $report = array(); + while($equityW = $dbc->fetch_row($equityR)){ + $record = array($equityW['card_no'],$equityW['dept_name'], + sprintf('%.2f',$equityW['total'])); + $report[] = $record; + } + $data[] = $report; + } + + return $data; + } + + function calculate_footers($data){ + switch($this->multi_counter){ + case 1: + $this->report_headers[0] = 'Tenders'; + break; + case 2: + $this->report_headers[0] = 'Sales'; + break; + case 3: + $this->report_headers[0] = 'Discounts'; + break; + case 4: + $this->report_headers[0] = 'Tax'; + break; + case 5: + $this->report_headers = array('Type','Trans','Items','Avg. Items','Amount','Avg. Amount'); + return array(); + break; + case 6: + $this->report_headers = array('Mem#','Equity Type', 'Amount'); + break; + } + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[1]; + $sumSales += $row[2]; + } + return array(null,$sumQty,$sumSales); + } + + function form_content(){ + $start = date('Y-m-d',strtotime('yesterday')); + ?> +
        + + + + + + + + +
        Date
        Excel
        +
        + draw_page(); +?> diff --git a/fannie/reports/GeneralDay/index.php b/fannie/reports/GeneralDay/index.php new file mode 100644 index 000000000..7eded1458 --- /dev/null +++ b/fannie/reports/GeneralDay/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/reports/GeneralSales/GeneralSalesReport.php b/fannie/reports/GeneralSales/GeneralSalesReport.php new file mode 100644 index 000000000..39dd1d2e9 --- /dev/null +++ b/fannie/reports/GeneralSales/GeneralSalesReport.php @@ -0,0 +1,204 @@ +title = "Fannie : General Sales Report"; + $this->header = "General Sales Report"; + $this->report_cache = 'none'; + $this->grandTTL = 1; + $this->multi_report_mode = True; + $this->sortable = False; + + if (isset($_REQUEST['date1'])){ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('','Sales','Quantity','% Sales','Dept %'); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $d1 = FormLib::get_form_value('date1',date('Y-m-d')); + $d2 = FormLib::get_form_value('date2',date('Y-m-d')); + $dept = $_REQUEST['dept']; + + $dlog = select_dlog($d1,$d2); + + $sales = "SELECT d.Dept_name,sum(t.total),sum(t.quantity), + s.superID,s.super_name + FROM $dlog AS t LEFT JOIN departments AS d + ON d.dept_no=t.department LEFT JOIN + MasterSuperDepts AS s ON t.department=s.dept_ID + WHERE + (tDate BETWEEN ? AND ?) + AND (s.superID > 0 OR s.superID IS NULL) + AND (t.trans_type = 'I' or t.trans_type = 'D') + GROUP BY s.superID,s.super_name,d.dept_name,t.department + ORDER BY s.superID,t.department"; + if ($dept == 1){ + $sales = "SELECT CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + sum(t.total),sum(t.quantity), + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END + FROM $dlog AS t LEFT JOIN + products AS p ON t.upc=p.upc LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + departments AS e ON p.department=e.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=p.department LEFT JOIN + MasterSuperDepts AS r ON r.dept_ID=t.department + WHERE + (tDate BETWEEN ? AND ?) + AND (t.trans_type = 'I' or t.trans_type = 'D') + AND (s.superID > 0 OR (s.superID IS NULL AND r.superID > 0) + OR (s.superID IS NULL AND r.superID IS NULL)) + GROUP BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END, + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end + ORDER BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end"; + } + $supers = array(); + $prep = $dbc->prepare_statement($sales); + $salesR = $dbc->exec_statement($prep,array($d1.' 00:00:00',$d2.' 23:59:59')); + + $curSuper = 0; + $grandTotal = 0; + while($row = $dbc->fetch_row($salesR)){ + if ($curSuper != $row[3]){ + $curSuper = $row[3]; + } + if (!isset($supers[$curSuper])) + $supers[$curSuper] = array('sales'=>0.0,'qty'=>0.0,'name'=>$row[4],'depts'=>array()); + $supers[$curSuper]['sales'] += $row[1]; + $supers[$curSuper]['qty'] += $row[2]; + $supers[$curSuper]['depts'][] = array('name'=>$row[0],'sales'=>$row[1],'qty'=>$row[2]); + $grandTotal += $row[1]; + } + + $data = array(); + foreach($supers as $s){ + if ($s['sales']==0) continue; + $superSum = $s['sales']; + $report = array(); + foreach($s['depts'] as $d){ + $record = array( + $d['name'], + sprintf('%.2f',$d['sales']), + sprintf('%.2f',$d['qty']), + sprintf('%.2f',($d['sales'] / $grandTotal) * 100), + sprintf('%.2f',($d['sales'] / $superSum) * 100) + ); + $report[] = $record; + } + + $data[] = $report; + + /* + printf("%s\$%.2f%.2f + %.2f %% \n", + $s['name'],$s['sales'],$s['qty'],$s['sales']/$grandTotal * 100); + */ + } + + $this->grandTTL = $grandTotal; + return $data; + } + + function calculate_footers($data){ + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[1]; + } + return array(null,$sumSales,$sumQty,sprintf('%.2f',($sumSales/$this->grandTTL)*100),null); + } + + function form_content(){ + $lastMonday = ""; + $lastSunday = ""; + + $ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); + while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); + } + ?> +
        + + + + + + + + + + + + + + +
        Start Date + +
        End Date
        Excel
        +
        + draw_page(); +?> diff --git a/fannie/reports/GeneralSales/index.php b/fannie/reports/GeneralSales/index.php new file mode 100644 index 000000000..f3f237bee --- /dev/null +++ b/fannie/reports/GeneralSales/index.php @@ -0,0 +1,230 @@ +General Sales: %s \n", ($d1 == $d2) ? "For $d1" : "From $d1 to $d2"); + printf("Save to Excel", + $d1,$d2,$dept); + } + + $sales = "SELECT d.Dept_name,sum(t.total),sum(t.quantity), + s.superID,s.super_name + FROM $dlog AS t LEFT JOIN departments AS d + ON d.dept_no=t.department LEFT JOIN + MasterSuperDepts AS s ON t.department=s.dept_ID + WHERE + (tDate BETWEEN ? AND ?) + AND (s.superID > 0 OR s.superID IS NULL) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + GROUP BY s.superID,s.super_name,d.dept_name,t.department + ORDER BY s.superID,t.department"; + if ($dept == 1){ + $sales = "SELECT CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + sum(t.total),sum(t.quantity), + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END + FROM $dlog AS t LEFT JOIN + products AS p ON t.upc=p.upc LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + departments AS e ON p.department=e.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=p.department LEFT JOIN + MasterSuperDepts AS r ON r.dept_ID=t.department + WHERE + (tDate BETWEEN ? AND ?) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + AND (s.superID > 0 OR (s.superID IS NULL AND r.superID > 0) + OR (s.superID IS NULL AND r.superID IS NULL)) + GROUP BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END, + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end + ORDER BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end"; + } + $supers = array(); + $prep = $dbc->prepare_statement($sales); + $salesR = $dbc->exec_statement($prep,array($d1.' 00:00:00',$d2.' 23:59:59')); + + $curSuper = 0; + $grandTotal = 0; + while($row = $dbc->fetch_row($salesR)){ + if ($curSuper != $row[3]){ + $curSuper = $row[3]; + } + if (!isset($supers[$curSuper])) + $supers[$curSuper] = array('sales'=>0.0,'qty'=>0.0,'name'=>$row[4],'depts'=>array()); + $supers[$curSuper]['sales'] += $row[1]; + $supers[$curSuper]['qty'] += $row[2]; + $supers[$curSuper]['depts'][] = array('name'=>$row[0],'sales'=>$row[1],'qty'=>$row[2]); + $grandTotal += $row[1]; + } + + foreach($supers as $s){ + if ($s['sales']==0) continue; + echo "\n";//create table + echo "\n";//create table header + $superSum = $s['sales']; + foreach($s['depts'] as $d){ + printf(" + \n", + $d['name'],$d['sales'],$d['qty'], + $d['sales'] / $grandTotal * 100, + $d['sales'] / $superSum * 100); + } + + printf(" + \n", + $s['name'],$s['sales'],$s['qty'],$s['sales']/$grandTotal * 100); + + echo "
         SalesQty% SalesDept %
        %s\$%.2f%.2f%.2f %%%.2f %%
        %s\$%.2f%.2f%.2f %% 

        "; + } + + printf("Total Sales: \$%.2f",$grandTotal); +} +else { + +$page_title = "Fannie : General Sales Report"; +$header = "General Sales Report"; +include($FANNIE_ROOT.'src/header.html'); +$lastMonday = ""; +$lastSunday = ""; + +$ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); +while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); +} +?> + +
        + + + + + + ", + $arr[0],$arr['FirstName'],$arr['LastName'], + $arr['startdate'], + $arr['enddate'], + $arr['equity'], + ($arr['isInactive']==1?'INACTIVE - '.$arr['reason']:$ph) + ); +} + +?> diff --git a/fannie/reports/MonthOverMonth/MonthOverMonthReport.php b/fannie/reports/MonthOverMonth/MonthOverMonthReport.php new file mode 100644 index 000000000..bd693e526 --- /dev/null +++ b/fannie/reports/MonthOverMonth/MonthOverMonthReport.php @@ -0,0 +1,210 @@ +title = "Fannie : Month Over Month Movement"; + $this->header = "Month Over Month Movement"; + $this->report_cache = 'none'; + + if (isset($_REQUEST['month1'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('#','Description'); + // build headers and keys off span of months + $this->months = array(); + $stamp1 = mktime(0,0,0,FormLib::get_form_value('month1',1),1,FormLib::get_form_value('year1',1)); + $stamp2 = mktime(0,0,0,FormLib::get_form_value('month2',1),1,FormLib::get_form_value('year2',1)); + while($stamp1 <= $stamp2){ + $this->report_headers[] = date('F Y',$stamp1); + $this->months[] = date('Y-n',$stamp1); + $stamp1 = mktime(0,0,0,date('n',$stamp1)+1,1,date('Y',$stamp1)); + } + + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else { + $this->add_script("../../src/CalendarControl.js"); + $this->add_script("../../src/jquery/jquery.js"); + } + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $month1 = FormLib::get_form_value('month1',date('n')); + $month2 = FormLib::get_form_value('month2',date('n')); + $year1 = FormLib::get_form_value('year1',date('Y')); + $year2 = FormLib::get_form_value('year2',date('Y')); + + $date1 = date('Y-m-d',mktime(0,0,0,$month1,1,$year1)); + $date2 = date('Y-m-t',mktime(0,0,0,$month2,1,$year2)); + $dlog = select_dlog($date1,$date2); + $date1 .= ' 00:00:00'; + $date2 .= ' 00:00:00'; + + $qArgs = array($date1,$date2); + $query = ""; + $type = FormLib::get_form_value('mtype','upc'); + if ($type == 'upc'){ + $inClause = "("; + $vals = preg_split("/\D+/",FormLib::get_form_value('upcs','')); + foreach($vals as $v){ + $qArgs[] = str_pad($v,13,'0',STR_PAD_LEFT); + $inClause .= "?,"; + } + $inClause = rtrim($inClause,",").")"; + + $query = "SELECT t.upc,p.description, SUM(t.quantity) as qty, + SUM(total) as sales, MONTH(tdate) as month, YEAR(tdate) as year + FROM $dlog AS t + LEFT JOIN products AS p ON p.upc=t.upc + WHERE t.trans_status <> 'M' + AND tdate BETWEEN ? AND ? + AND t.upc IN $inClause + GROUP BY YEAR(tdate),MONTH(tdate),t.upc,p.description + ORDER BY YEAR(tdate),MONTH(tdate),t.upc,p.description"; + } + else { + $dept1 = FormLib::get_form_value('dept1',1); + $dept2 = FormLib::get_form_value('dept2',1); + $qArgs[] = $dept1; + $qArgs[] = $dept2; + $query = "SELECT t.department,d.dept_name,SUM(t.quantity) as qty, + SUM(total) as sales, MONTH(tdate) as month, YEAR(tdate) as year + FROM $dlog AS t + LEFT JOIN departments AS d ON t.department=d.dept_no + WHERE t.trans_status <> 'M' + AND tdate BETWEEN ? AND ? + AND t.department BETWEEN ? AND ? + GROUP BY YEAR(tdate),MONTH(tdate),t.department,d.dept_name + ORDER BY YEAR(tdate),MONTH(tdate),t.department,d.dept_name"; + } + + $queryP = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($queryP, $qArgs); + + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + if (!isset($ret[$row[0]])){ + $ret[$row[0]] = array('num'=>$row[0],'desc'=>$row[1]); + foreach($this->months as $mkey) + $ret[$row[0]][$mkey] = 0; + } + if (FormLib::get_form_value('results','Sales') == 'Sales') + $ret[$row[0]][$row['year'].'-'.$row['month']] = $row['sales']; + else + $ret[$row[0]][$row['year'].'-'.$row['month']] = $row['qty']; + } + return $this->dekey_array($ret); + } + + function form_content(){ + global $dbc; + $depts = array(); + $q = $dbc->prepare_statement("SELECT dept_no,dept_name FROM departments ORDER BY dept_no"); + $r = $dbc->exec_statement($q); + while($w = $dbc->fetch_row($r)) + $depts[$w[0]] = $w[1]; +?> +
        +
        +
        + + + + + + + + + + + + + + +
        Start Date + +
        End Date
        Excel
        + + + diff --git a/fannie/reports/HourlyCustomers/index.php b/fannie/reports/HourlyCustomers/index.php new file mode 100644 index 000000000..d53fb2fc0 --- /dev/null +++ b/fannie/reports/HourlyCustomers/index.php @@ -0,0 +1,58 @@ + + +
        > +Get transactions per hour for what date (YYYY-MM-DD)?
        +  + +
        + +prepare_statement("select datepart(hh,tdate) as hour, + count(distinct trans_num) + from $dlog where + tdate BETWEEN ? AND ? + group by datepart(hh,tdate) + order by datepart(hh,tdate)"); + $r = $dbc->exec_statement($q,array($date.' 00:00:00',$date.' 23:59:59')); + + echo "Report for $date
        "; +?> + +fetch_array($r)){ + echo ""; + $hour = $row[0]; + $num = $row[1]; + $total += $num; + $newhour = $hour; + if ($hour > 12){ + $newhour -= 12; + } + if ($hour < 12){ + $newhour .= ":00 am"; + } + else { + $newhour .= ":00 pm"; + } + echo ""; + echo ""; + } + echo ""; + echo "
        HourTransactions
        $newhour$num
        Total$total
        "; +} +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/reports/HourlySales/hourlySalesAuth.php b/fannie/reports/HourlySales/hourlySalesAuth.php new file mode 100644 index 000000000..d56b33782 --- /dev/null +++ b/fannie/reports/HourlySales/hourlySalesAuth.php @@ -0,0 +1,180 @@ +"; +echo "From $startDate to $endDate"; + +$dlog = select_dlog($startDate,$endDate); + +$dbconn = ($FANNIE_SERVER_DBMS=='MSSQL')?'.dbo.':'.'; + +$hourlySalesQ = ''; +$args = array(); +if(!isset($_REQUEST['weekday'])){ + if($buyer != -1){ + $hourlySalesQ = "SELECT year(d.tdate),month(d.tdate),day(d.tdate),".$dbc->hour('d.tdate').", + sum(d.total),avg(d.total) + FROM $dlog as d left join + {$FANNIE_OP_DB}{$dbconn}superdepts as t on d.department = t.dept_ID + WHERE (d.trans_type = 'I' or d.trans_type = 'D') AND + d.tdate BETWEEN ? AND ? + AND t.superID = ? + GROUP BY year(d.tdate),month(d.tdate),day(d.tdate), ".$dbc->hour('d.tdate')." + ORDER BY year(d.tdate),month(d.tdate),day(d.tdate), ".$dbc->hour('d.tdate'); + $args = array($dDiffStart,$dDiffEnd,$buyer); + }else{ + $hourlySalesQ = "SELECT year(d.tdate),month(d.tdate),day(tdate),".$dbc->hour('tdate').", + sum(total),avg(total) + FROM $dlog as d + WHERE (trans_type = 'I' or trans_type = 'D') AND + tdate BETWEEN ? AND ? + GROUP BY year(d.tdate),month(d.tdate),day(d.tdate), ".$dbc->hour('d.tdate')." + ORDER BY year(d.tdate),month(d.tdate),day(d.tdate), ".$dbc->hour('d.tdate'); + $args = array($dDiffStart,$dDiffEnd); + } +}else{ +echo "
        Grouped by weekday"; + if($buyer != -1){ + $hourlySalesQ = "SELECT + ".$dbc->dayofweek('tdate').", + ".$dbc->hour('d.tdate').", + sum(d.total),avg(total) + FROM $dlog as d LEFT JOIN + {$FANNIE_OP_DB}{$dbconn}superdepts as t on d.department = t.dept_ID + WHERE (d.trans_type = 'I' or d.trans_type = 'D') AND + d.tdate BETWEEN ? AND ? + AND t.superID = ? + GROUP BY ".$dbc->dayofweek('tdate').",".$dbc->hour('tdate')." + ORDER BY ".$dbc->dayofweek('tdate').",".$dbc->hour('tdate'); + $args = array($dDiffStart,$dDiffEnd,$buyer); + }else{ + $hourlySalesQ = "SELECT + ".$dbc->dayofweek('tdate').", + ".$dbc->hour('tdate').", + sum(total),avg(total) + FROM $dlog as d + WHERE (trans_type = 'I' or trans_type = 'D') AND + tdate BETWEEN ? AND ? + GROUP BY ".$dbc->dayofweek('tdate').",".$dbc->hour('tdate')." + ORDER BY ".$dbc->dayofweek('tdate').",".$dbc->hour('tdate'); + $args = array($dDiffStart,$dDiffEnd); + } +} + +//echo $hourlySalesQ; +if (isset($_REQUEST['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="hourlySales.xls"'); +} +else { + if(isset($_REQUEST['weekday'])){ + echo "
        Click here to dump to Excel File"; + }else{ + echo "
        Click here to dump to Excel File"; + } +} +$sum = 0; +$prep = $dbc->prepare_statement($hourlySalesQ); +$result = $dbc->exec_statement($prep,$args); +echo ""; +$minhour = 24; +$maxhour = 0; +$acc = array(); +$sums = array(); +if (!isset($_REQUEST['weekday'])){ + while($row=$dbc->fetch_row($result)){ + $hour = (int)$row[3]; + $date = $row[1]."/".$row[2]."/".$row[0]; + if (!isset($acc[$date])) $acc[$date] = array(); + if ($hour < $minhour) $minhour = $hour; + if ($hour > $maxhour) $maxhour = $hour; + $acc[$date][$hour] = $row[4]; + if (!isset($sums[$hour])) $sums[$hour] = 0; + $sums[$hour] += $row[4]; + } +} +else { + $days = array('','Sun','Mon','Tue','Wed','Thu','Fri','Sat'); + while($row = $dbc->fetch_row($result)){ + $hour = (int)$row[1]; + $date = $days[$row[0]]; + if (!isset($acc[$date])) $acc[$date] = array(); + if (!isset($sums[$hour])) $sums[$date] = 0; + if ($hour < $minhour) $minhour = $hour; + if ($hour > $maxhour) $maxhour = $hour; + $acc[$date][$hour] = $row[2]; + $sums[$hour] += $row[2]; + } +} +echo ""; +foreach($acc as $date=>$data){ + echo ""; +} +echo ""; + +for($i=$minhour;$i<=$maxhour;$i++){ + echo ""; + echo ""; + foreach($acc as $date=>$data){ + if (isset($data[$i])){ + printf("",$data[$i]); + if (!isset($sums[$i])) $sums[$i] = 0; + $sums[$date] += $data[$i]; + } + else + echo ""; + } + printf("",$sums[$i]); + echo ""; +} +$sum=0; +echo ""; +foreach($acc as $date=>$data){ + printf("",$sums[$date]); + $sum += $sums[$date]; +} +echo ""; + +echo "
        ".(isset($_REQUEST['weekday'])?'Day':'Date').""; + echo $date; + echo "Totals
        "; + if ($i < 12) echo $i."AM"; + elseif($i==12) echo $i."PM"; + else echo ($i-12)."PM"; + echo "%.2f %.2f
        Totals%.2f 
        "; + +echo "

        Total: $sum" +?> diff --git a/fannie/reports/HourlySales/hourlySalesDept.php b/fannie/reports/HourlySales/hourlySalesDept.php new file mode 100644 index 000000000..758917abc --- /dev/null +++ b/fannie/reports/HourlySales/hourlySalesDept.php @@ -0,0 +1,197 @@ +dayofweek('d.tdate')."),".$dbc->hour('d.tdate').",sum(d.total),avg(d.total) + FROM $dlog as d left join + {$FANNIE_OP_DB}{$dbconn}departments as t on d.department = t.dept_no + WHERE (d.trans_type = 'I' or d.trans_type = 'D') AND + d.tdate BETWEEN ? AND ? + and ".$dbc->hour('d.tdate')." between 7 and 20 + AND t.dept_no BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(d.tdate),".$dbc->hour('tdate')." + ORDER BY year(tdate),month(tdate),day(d.tdate),".$dbc->hour('tdate'); + $args = array($startDate,$endDate,$dept,$dept2); + if (isset($_GET['weekday'])){ + $hourlySalesQ = "SELECT min(".$dbc->dayofweek('d.tdate')."),".$dbc->hour('d.tdate').",sum(d.total),avg(d.total) + FROM $dlog as d left join + {$FANNIE_OP_DB}{$dbconn}departments as t on d.department = t.dept_no + WHERE (d.trans_type = 'I' or d.trans_type = 'D') AND + d.tdate BETWEEN ? AND ? + and ".$dbc->hour('d.tdate')." between 7 and 20 + AND dept_no BETWEEN ? AND ? + GROUP BY ".$dbc->dayofweek('tdate').",".$dbc->hour('tdate')." + ORDER BY ".$dbc->dayofweek('tdate').",".$dbc->hour('tdate'); + } + //echo $hourlySalesQ; + + if (isset($_GET['excel'])){ + header('Content-Type: application/ms-excel'); + header("Content-Disposition: attachment; filename=hourlySales-dept$dept-$dept2.xls"); + } + echo "Hourly sales report for department(s) $dept - $dept2
        "; + echo "$sd to $ed
        "; + if (!isset($_GET['excel'])){ + if (isset($_GET['weekday'])) + echo "Save to Excel
        "; + else + echo "Save to Excel
        "; + } + echo ""; + $colors=array('#ffffcc','#ffffff'); + $c = 0; + echo ""; + for ($i = 7; $i<=20; $i++){ + if ($i < 12) echo ""; + else if ($i == 12) echo ""; + else if ($i > 12) { + echo ""; + } + $c = ($c + 1) % 2; + } + echo ""; + echo ""; + $c = 0; + for ($i = 7; $i <=20; $i++, $c=($c+1)%2) + echo ""; + echo ""; + + //echo $hourlySalesQ."
        "; + $prep = $dbc->prepare_statement($hourlySalesQ); + $hourlySalesR = $dbc->exec_statement($prep,$args); + $curDay = ""; + $expectedHour = 7; + $c = 0; + $days = array('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); + while ($hourlyW = $dbc->fetch_array($hourlySalesR)){ + if ($curDay != $hourlyW[0]){ + if ($curDay != ""){ + while ($expectedHour++ <= 20){ + echo ""; + $c = ($c+1) %2; + } + echo ""; + } + echo ""; + $curDay = $hourlyW[0]; + echo ""; + $expectedHour = 7; + $c = 0; + } + $hour = $hourlyW[1]; + $sum = $hourlyW[2]; + $avg = $hourlyW[3]; + while ($hour > $expectedHour){ + echo ""; + echo ""; + $expectedHour++; + $c = ($c+1) %2; + } + echo ""; + echo ""; + $expectedHour++; + $c = ($c+1) %2; + } + while ($expectedHour++ <= 20){ + echo ""; + $c = ($c+1) % 2; + } + echo "
        Day$i AM$i PM"; + echo $i % 12; + echo " PM
         TotalAvg
          
        ".$days[$curDay-1]."  $sum$avg  
        "; + +} +else { +$page_title = "Fannie : Department Hourly Sales"; +$header = "Department Hourly Sales"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +prepare_statement("select dept_no,dept_name from departments order by dept_no"); + $deptR = $dbc->exec_statement($deptQ); + $depts = array(); + $dept_nos = array(); + $count = 0; + while ($deptW = $dbc->fetch_array($deptR)){ + $dept_nos[$count] = $deptW[0]; + $depts[$count++] = $deptW[1]; + } +?> +

        + + + + + + + + + + + +
        Dept. Start + + + Dept. End + + +
        Start DateEnd Date
        Group by weekday?
        +
        + + diff --git a/fannie/reports/HourlySales/index.php b/fannie/reports/HourlySales/index.php new file mode 100644 index 000000000..386a16222 --- /dev/null +++ b/fannie/reports/HourlySales/index.php @@ -0,0 +1,56 @@ +All"; +$prep = $dbc->prepare_statement("SELECT superID,super_name FROM superDeptNames + WHERE superID > 0"); +$res = $dbc->exec_statement($prep); +while($row = $dbc->fetch_row($res)) + $options .= sprintf("",$row[0],$row[1]); +?> + + +
        + + + + + + + +
        DeptStart DateEnd Date
        Group by weekday?
        + + + + + diff --git a/fannie/reports/HourlyTrans/hourlyTrans.php b/fannie/reports/HourlyTrans/hourlyTrans.php new file mode 100644 index 000000000..a33eb167d --- /dev/null +++ b/fannie/reports/HourlyTrans/hourlyTrans.php @@ -0,0 +1,129 @@ +prepare_statement("SELECT superID,super_name FROM superDeptNames ORDER BY super_name"); +$subdeptsR = $dbc->exec_statement($subdeptsQ); +$options = ""; +while($subW = $dbc->fetch_row($subdeptsR)) + $options .= ""; + +if (!isset($_REQUEST['date1'])){ + $page_title = "Fannie : Transactions by Hour"; + $header = "Transactions by Hour"; + include($FANNIE_ROOT.'src/header.html'); +?> + + + + + + + + + + + + + + + + +
        Department
        StartEnd
        Excel Group by week day
        +
        +hour('tdate'); + $args = array($date1.' 00:00:00',$date2.' 23:59:59'); + + $query = "select + $group, + min(".$dbc->dayofweek('tdate')."), + count(distinct trans_num), + sum(case when trans_type in ('I','D') then total else 0 end) + from $dlog as d + WHERE tdate BETWEEN ? AND ? + group by $group + order by $group"; + if ($_REQUEST['sub'] != -1){ + $query = "select + $group, + min(".$dbc->dayofweek('tdate').") as day, + count(distinct trans_num), + sum(case when trans_type in ('I','D') then total else 0 end) + from $dlog as d LEFT JOIN + departments as t on d.department = t.dept_no + left join superdepts AS s ON t.dept_no=s.dept_ID + WHERE tdate BETWEEN ? AND ? + AND s.superID = ? + group by $group + order by $group"; + $args[] = $_REQUEST['sub']; + } + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + + echo "Transactions from $date1 to $date2"; + if (isset($_REQUEST['group'])) + echo "
        Grouped by week day"; + if ($_REQUEST['sub'] != -1) + echo "
        For subdepartment #".$_REQUEST['sub']; + + if (!isset($_REQUEST['group'])){ + echo " + "; + while($row = $dbc->fetch_row($result)){ + printf(" + ", + $row[1],$row[2],$row[0],$row[3],$DAYS[$row[4]],$row[5],$row[6]); + } + echo "
        DateHourDay# Trans$
        %d/%d/%d%s%s%d%.2f
        "; + } + else { + $buckets = array(); + while($row = $dbc->fetch_row($result)){ + if (!isset($buckets[$row[4]])){ + $buckets[$row[4]] = array(); + $buckets[$row[4]]['trans'] = array(); + $buckets[$row[4]]['sales'] = array(); + } + + if (!isset($buckets[$row[4]]['trans'][$row[3]])) + $buckets[$row[4]]['trans'][$row[3]] = 0; + $buckets[$row[4]]['trans'][$row[3]] += $row[5]; + + if (!isset($buckets[$row[4]]['sales'][$row[3]])) + $buckets[$row[4]]['sales'][$row[3]] = 0; + $buckets[$row[4]]['sales'][$row[3]] += $row[5]; + } + echo " + "; + foreach($buckets as $day => $data){ + foreach(array_keys($data['trans']) as $hour){ + printf("", + $DAYS[$day],$hour,$data['trans'][$hour],$data['sales'][$hour]); + } + } + echo "
        DayHour# Trans$
        %s%s%d%.2f
        "; + } +} + +?> diff --git a/fannie/reports/ManufacturerMovement/ManufacturerMovementReport.php b/fannie/reports/ManufacturerMovement/ManufacturerMovementReport.php new file mode 100644 index 000000000..1482813f0 --- /dev/null +++ b/fannie/reports/ManufacturerMovement/ManufacturerMovementReport.php @@ -0,0 +1,219 @@ +report_cache = 'day'; + $this->title = "Fannie : Manufacturer Movement"; + $this->header = "Manufacturer Movement Report"; + + if (isset($_REQUEST['date1'])){ + $this->content_function = "report_content"; + $this->has_menus(False); + + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $date1 = FormLib::get_form_value('date1',date('Y-m-d')); + $date2 = FormLib::get_form_value('date2',date('Y-m-d')); + $manu = FormLib::get_form_value('manu',''); + $type = FormLib::get_form_value('type',''); + $groupby = FormLib::get_form_value('groupby','upc'); + + $dlog = select_dlog($date1,$date2); + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumUpcSalesByDay"; + + $type_condition = "e.manufacturer like ?"; + $args = array('%'.$manu.'%'); + if ($type == 'prefix') + $type_condition = 't.upc LIKE ?'; + + $query = ""; + $args[] = $date1.' 00:00:00'; + $args[] = $date2.' 23:59:59'; + switch($groupby){ + case 'upc': + $query = "select t.upc,p.description, + sum(t.quantity) as qty, + sum(t.total),d.dept_no,d.dept_name,s.superID + from $dlog as t left join products as p + on t.upc=p.upc left join prodExtra as e on p.upc = e.upc + left join departments as d on p.department = d.dept_no + left join MasterSuperDepts as s on d.dept_no = s.dept_ID + where $type_condition + and t.tdate between ? AND ? + group by t.upc,p.description,d.dept_no,d.dept_name,s.superID + order by sum(t.total) desc"; + break; + case 'date': + $query = "select year(t.tdate),month(t.tdate),day(t.tdate), + sum(t.quantity),sum(t.total) + from products as p left join prodExtra as e on p.upc = e.upc + left join $dlog as t on p.upc = t.upc + where $type_condition + and t.tdate between ? AND ? + group by year(t.tdate),month(t.tdate),day(t.tdate) + order by year(t.tdate),month(t.tdate),day(t.tdate)"; + break; + case 'dept': + $query = "select d.dept_no,d.dept_name,sum(t.quantity),sum(t.total),s.superID + from products as p left join prodExtra as e on p.upc = e.upc + left join $dlog as t on p.upc = t.upc + left join departments as d on p.department = d.dept_no + left join MasterSuperDepts as s on d.dept_no=s.dept_ID + where $type_condition + and t.tdate between ? AND ? + group by d.dept_no,d.dept_name,s.superID + order by sum(t.total) desc"; + break; + } + + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + if ($groupby == "date"){ + $record[] = $row[1]."/".$row[2]."/".$row[0]; + $record[] = $row[3]; + $record[] = $row[4]; + } + else { + for($i=0;$i<$dbc->num_fields($result);$i++) + $record[] .= $row[$i]; + } + $ret[] = $record; + } + return $ret; + } + + function calculate_footers($data){ + if (empty($data)) + return array(); + switch(count($data[0])){ + case 7: + $this->report_headers = array('UPC','Description','Qty','$', + 'Dept#','Department','Subdept'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[3]; + } + return array('Total',null,$sumQty,$sumSales,null,null,null); + break; + case 5: + $this->report_headers = array('Dept#','Department','Qty','$','Subdept'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[3]; + } + return array('Total',null,$sumQty,$sumSales,null); + break; + case 3: + $this->report_headers = array('Date','Qty','$'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[1]; + $sumSales += $row[2]; + } + return array('Total',$sumQty,$sumSales); + break; + } + } + + function form_content(){ +?> +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + +
        Manufacturer + + Date Start + +
        Type + + + End + +
        Sum report by + +
        +
        +
        +
        +draw_page(); +?> diff --git a/fannie/reports/ManufacturerMovement/index.php b/fannie/reports/ManufacturerMovement/index.php new file mode 100644 index 000000000..ddc7aa85f --- /dev/null +++ b/fannie/reports/ManufacturerMovement/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/reports/MarginMovement/index.php b/fannie/reports/MarginMovement/index.php new file mode 100644 index 000000000..ee5497c6d --- /dev/null +++ b/fannie/reports/MarginMovement/index.php @@ -0,0 +1,164 @@ +prepare_statement("SELECT d.upc,p.description,d.department,t.dept_name, + sum(total) as total,sum(d.cost) as cost + FROM $dlog AS d INNER JOIN products AS p + ON d.upc=p.upc LEFT JOIN departments AS t + ON d.department=t.dept_no + WHERE datetime BETWEEN '$date1 00:00:00' AND '$date2 23:59:59' + AND d.department BETWEEN $dept1 AND $dept2 + AND d.discounttype=0 + AND d.cost <> 0 + AND trans_status NOT IN ('X','Z') + AND emp_no <> 9999 and register_no <> 99 + GROUP BY d.upc,p.description,d.department,t.dept_name + ORDER BY sum(total) DESC)"); + $args = array($date1,$date2,$dept1,$dept2); + $result = $dbc->exec_statement($query,$args); + $data = array(); + $sumT = 0; + $sumC = 0; + while($row = $dbc->fetch_row($result)){ + $data[$row['upc']] = array( + "desc"=>$row['description'], + "dept_no"=>$row['department'], + "dept_name"=>$row['dept_name'], + "ttl"=>$row['total'], + "cost"=>$row['cost'] + ); + $data[$row['upc']]['margin'] = 100*($row['total']-$row['cost'])/$row['total']; + $sumT += $row['total']; + $sumC += $row['cost']; + } + echo ''; + echo ''; + echo ''; + echo ''; + foreach($data as $upc=>$row){ + printf(' + + ', + $upc,$row['desc'],$row['dept_no'],$row['dept_name'], + $row['cost'],$row['ttl'],$row['margin'], + $row['ttl']-$row['cost'], + 100*($row['ttl']-$row['cost'])/$sumT); + } + echo '
        UPCDescDeptCostSalesMarginContribution
        %s%s%d%s$%.2f$%.2f%.2f%%$%.2f%.2f%%
        '; + exit; +} + +$deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $dbc->exec_statement($deptsQ); +$deptsList = ""; +while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Fannie: Margin"; +$header = "Margin Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + + + + + +

        Department Start

        +

        End

        + + +

        +

        + + +

        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
        Excel + + + Date format is YYYY-MM-DD
        (e.g. 2004-04-01 = April 1, 2004)
          
        +
        +
        + + + + + diff --git a/fannie/reports/Members/index.php b/fannie/reports/Members/index.php new file mode 100644 index 000000000..7d66ba3a0 --- /dev/null +++ b/fannie/reports/Members/index.php @@ -0,0 +1,108 @@ + 5999) + and (c.CardNo < 9000 or c.CardNo > 9100) + and c.memType <> 2"; +$type = isset($_REQUEST['type'])?$_REQUEST['type']:'Regular'; +switch($type){ +case 'Regular': + break; +case 'Business': + $where = "c.memtype = 2"; + break; +case 'Staff Members': + $where = "c.memtype = 3"; + break; +case 'Staff NonMembers': + $where = "c.memtype = 9"; + break; +case '#5000s': + $where = "c.cardno BETWEEN 5000 AND 5999"; + break; +} + +if (isset($_REQUEST['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="member report.xls"'); +} +else { + echo "
        "; + echo "    "; + echo ""; + echo "    "; + echo " Excel"; + echo "

        "; +} + +$trans = $FANNIE_TRANS_DB; +if ($FANNIE_SERVER_DBMS=='MSSQL') $trans .= ".dbo"; +$q = $dbc->prepare_statement("SELECT c.CardNo, + month(CASE WHEN m.start_date IS NULL then n.startdate ELSE m.start_date END), + day(CASE WHEN m.start_date IS NULL then n.startdate ELSE m.start_date END), + year(CASE WHEN m.start_date IS NULL then n.startdate ELSE m.start_date END), + month(m.end_date),day(m.end_date),year(m.end_date), + c.FirstName,c.LastName, + CASE WHEN s.type = 'I' THEN 1 ELSE 0 END AS isInactive, + CASE WHEN r.textStr IS NULL THEN s.reason ELSE r.textStr END as reason, + CASE WHEN n.payments IS NULL THEN 0 ELSE n.payments END as equity + FROM custdata AS c LEFT JOIN memDates AS m + ON m.card_no = c.CardNo + LEFT JOIN {$trans}.newBalanceStockToday_test AS n + ON m.card_no=n.memnum LEFT JOIN suspensions AS s + ON m.card_no=s.cardno LEFT JOIN reasoncodes AS r + ON s.reasonCode & r.mask <> 0 + WHERE c.Type <> 'TERM' AND $where + AND c.personNum=1 + ORDER BY c.CardNo"); +$r = $dbc->exec_statement($q); +echo " + + + "; +$saveW = array(-1); +while($w = $dbc->fetch_row($r)){ + if ($w[0] != $saveW[0]){ + printRow($saveW); + $saveW = $w; + } + else { + $saveW['reason'] .= ", ".$w['reason']; + } + if ($saveW[3] < 1900 || ((int)$saveW[3]) == 0) + $saveW['startdate'] = isset($_REQUEST['excel']) ? '' : ' '; + else + $saveW['startdate'] = sprintf("%d/%d/%d",$saveW[1],$saveW[2],$saveW[3]); + if ($saveW[6] == 1900 || ((int)$saveW[6]) == 0) + $saveW['enddate'] = isset($_REQUEST['excel']) ? '' : ' '; + else + $saveW['enddate'] = sprintf("%d/%d/%d",$saveW[4],$saveW[5],$saveW[6]); +} +printRow($saveW); +echo "
        #First NameLast NameStartEndEquityInactive
        "; + +function printRow($arr){ + global $_REQUEST; + $ph = isset($_REQUEST['excel'])?'':" "; + if (count($arr) <= 1) return; + printf("
        %d%s%s%s%s%.2f%s
        + + + + + + + + + +
        " /> through " />
        + Report for: + UPC + Department +    Results in +
        + UPC(s): +
        +
        + + Excel + +
        +draw_page(); +?> diff --git a/fannie/reports/MonthOverMonth/index.php b/fannie/reports/MonthOverMonth/index.php new file mode 100644 index 000000000..a50c95d16 --- /dev/null +++ b/fannie/reports/MonthOverMonth/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/reports/MovementPrice/index.php b/fannie/reports/MovementPrice/index.php new file mode 100644 index 000000000..e2d5b72f5 --- /dev/null +++ b/fannie/reports/MovementPrice/index.php @@ -0,0 +1,234 @@ +prepare_statement("select t.upc,p.description, + sum(t.quantity) as qty, + CASE WHEN t.discounttype IN (2,5) AND memType IN (1,3) THEN unitPrice-memDiscount + ELSE unitPrice END as price, + t.department,d.dept_name,s.superID + from $dtrans as t inner join products as p + on p.upc=t.upc + left join departments as d on t.department = d.dept_no + left join MasterSuperDepts as s on d.dept_no = s.dept_ID + left join scaleItems as c on t.upc=c.plu + where t.datetime between ? AND ? + and trans_status NOT IN ('X','Z','M') and register_no <> 99 + and emp_no <> 9999 and $where + and (t.upc not like '002%' or c.weight=1) + group by t.upc, + CASE WHEN t.discounttype IN (2,5) and memType IN (1,3) THEN unitPrice-memDiscount + ELSE unitPrice END, + p.description,t.department,d.dept_name,s.superID + order by t.department,t.upc, + CASE WHEN t.discounttype IN (2,5) and memType IN (1,3) THEN unitPrice-memDiscount + ELSE unitPrice END"); + $result = $dbc->exec_statement($query,$args); + + // make headers sort links + $today = date("F d, Y"); + //Following lines creates a header for the report, listing sort option chosen, report date, date and department range. + + $qs = "Save to Excel
        "; + } + + echo $date1." through ".$date2; + echo ""; + echo ""; + printf(" + ", + (isset($_REQUST['excel'])?'Description':$qs."&sort=p.description>Description"), + (isset($_REQUST['excel'])?'Dept':$qs."&sort=t.department>Dept")); + echo ""; + + $prevUPC = null; + $rows = array(); + while($row = $dbc->fetch_row($result)){ + $line = sprintf(" + ", + $row['upc'],$row['description'], + $row['qty'],$row['price'], + $row['department'],$row['dept_name']); + if ($row['upc'] == $prevUPC || $prevUPC === null){ + $rows[] = $line; + $prevUPC = $row['upc']; + } + else { + foreach($rows as $r){ + if (count($rows) > 1) + echo str_replace("
        UPC%sQtyPrice%s
        %s%s%.2f%.2f%d %s
        ","",$r); + else + echo $r; + } + $rows = array(); + $prevUPC = null; + } + } + foreach($rows as $r){ + if (count($rows) > 1) + echo str_replace("","",$r); + else + echo $r; + } + echo "
        "; + + return; +} + +$deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $dbc->exec_statement($deptsQ); +$deptsList = ""; + +$deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM MasterSuperDepts + WHERE superID <> 0 + group by superID,super_name + ORDER BY superID"); +$deptSubR = $dbc->exec_statement($deptSubQ); + +$deptSubList = ""; +while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=" "; +} +while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Fannie : Movement By Price"; +$header = "Price Point Movement Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + + + + + +
        + +
        Buyer
        +

        Date Start

        +

        Date End

        +
        +

        + +

        +

        + +

        +
        Excel  
        +
        +
        + + + + diff --git a/fannie/reports/NewItems/index.php b/fannie/reports/NewItems/index.php new file mode 100644 index 000000000..3c8a78551 --- /dev/null +++ b/fannie/reports/NewItems/index.php @@ -0,0 +1,199 @@ +prepare_statement($query); + $result = $dbc->exec_statement($query,$args); + + $qs = "Save to Excel
        "; + } + + echo $date1." through ".$date2; + echo ""; + echo ""; + printf(" + "); + echo ""; + + while($row = $dbc->fetch_row($result)){ + printf(" + ", + $row['entryDate'],$row['upc'], + $row['description'], + $row['department'],$row['dept_name']); + } + echo "
        Entry DateUPCDescriptionDept #Dept Name
        %s%s%s%d%s
        "; + + return; +} + +$deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $dbc->exec_statement($deptsQ); +$deptsList = ""; + +$deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM MasterSuperDepts + WHERE superID <> 0 + group by superID,super_name + ORDER BY superID"); +$deptSubR = $dbc->exec_statement($deptSubQ); + +$deptSubList = ""; +while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=" "; +} +while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Fannie : New Items Report"; +$header = "New Items Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + + + + + +
        + +
        Buyer
        +

        Date Start

        +

        Date End

        +
        +

        + +

        +

        + +

        +
        Excel  
        +
        +
        + + + + diff --git a/fannie/reports/NonMovement/NonMovementReport.php b/fannie/reports/NonMovement/NonMovementReport.php new file mode 100644 index 000000000..b0a8e1d25 --- /dev/null +++ b/fannie/reports/NonMovement/NonMovementReport.php @@ -0,0 +1,227 @@ +title = "Fannie: Non-Movement"; + $this->header = "Non-Movement Report"; + $this->report_cache = 'none'; + + if (isset($_REQUEST['deleteItem'])){ + $upc = FormLib::get_form_value('deleteItem',''); + if (is_numeric($upc)) + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $query = "DELETE FROM products WHERE upc=?"; + $queryP = $dbc->prepare_statement($query); + $dbc->exec_statement($queryP, array($upc)); + + $query = "DELETE FROM productUser WHERE upc=?"; + $queryP = $dbc->prepare_statement($query); + $dbc->exec_statement($queryP, array($upc)); + + $query = "DELETE FROM prodExtra WHERE upc=?"; + $queryP = $dbc->prepare_statement($query); + $dbc->exec_statement($queryP, array($upc)); + + echo 'Deleted'; + exit; + } + + if (isset($_REQUEST['date1'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('UPC','Description','Dept#','Dept',''); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + else { + $this->add_script("../../src/jquery/jquery.js"); + $this->add_script('delete.js'); + } + } + else { + $this->add_script("../../src/CalendarControl.js"); + $this->add_script("../../src/jquery/jquery.js"); + } + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $date1 = FormLib::get_form_value('date1',date('Y-m-d')); + $date2 = FormLib::get_form_value('date2',date('Y-m-d')); + $dept1 = FormLib::get_form_value('deptStart',0); + $dept2 = FormLib::get_form_value('deptEnd',0); + + $tempName = "TempNoMove"; + $dlog = select_dlog($date1,$date2); + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumUpcSalesByDay"; + + $tempQ = $dbc->prepare_statement("CREATE TABLE $tempName (upc varchar(13))"); + $dbc->exec_statement($tempQ); + + $insQ = $dbc->prepare_statement("INSERT INTO $tempName + SELECT d.upc FROM $dlog AS d + WHERE + d.tdate BETWEEN ? AND ? + GROUP BY d.upc"); + $dbc->exec_statement($insQ,array($date1.' 00:00:00',$date2.' 23:59:59')); + + $query = $dbc->prepare_statement("SELECT p.upc,p.description,d.dept_no, + d.dept_name FROM products AS p LEFT JOIN + departments AS d ON p.department=d.dept_no + WHERE p.upc NOT IN (select upc FROM $tempName) + AND p.department + BETWEEN ? AND ? + ORDER BY p.upc"); + $result = $dbc->exec_statement($query,array($dept1,$dept2)); + + /** + Simple report + + Issue a query, build array of results + */ + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + $record[] = $row[0]; + $record[] = $row[1]; + $record[] = $row[2]; + $record[] = $row[3]; + if ($this->report_format == 'html'){ + $record[] = sprintf(' + Delete this item',$row[0],$row[0],$row[1]); + } + else + $record[] = ''; + $ret[] = $record; + } + + $drop = $dbc->prepare_statement("DROP TABLE $tempName"); + $dbc->exec_statement($drop); + return $ret; + } + + function form_content(){ + global $dbc; + $deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); + $deptsR = $dbc->exec_statement($deptsQ); + $deptsList = ""; + while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; +?> +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Department Start

        +

        End

        + + +

        +

        + + +

        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
        + + + + + +
        + + + +
          
        +
        +
        +draw_page(); +?> diff --git a/fannie/reports/NonMovement/delete.js b/fannie/reports/NonMovement/delete.js new file mode 100644 index 000000000..f6af6323c --- /dev/null +++ b/fannie/reports/NonMovement/delete.js @@ -0,0 +1,14 @@ +function backgroundDelete(upc, description){ + if (!confirm('Delete '+upc+' '+description)){ + return false; + } + + $.ajax({ + url: 'NonMovementReport.php', + cache: false, + data: 'deleteItem='+upc, + success: function(data){ + $('#del'+upc).html('DELETED'); + } + }); +} diff --git a/fannie/reports/NonMovement/index.php b/fannie/reports/NonMovement/index.php new file mode 100644 index 000000000..7178d5bd9 --- /dev/null +++ b/fannie/reports/NonMovement/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/reports/OpenRings/index.php b/fannie/reports/OpenRings/index.php new file mode 100644 index 000000000..ba5e0a4bd --- /dev/null +++ b/fannie/reports/OpenRings/index.php @@ -0,0 +1,141 @@ +prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $dbc->exec_statement($deptsQ); +$deptsList = ""; + +$deptSubQ = $dbc->prepare_statement("SELECT superID,super_name FROM superDeptNames + WHERE superID <> 0 + ORDER BY superID"); +$deptSubR = $dbc->exec_statement($deptSubQ); + +$deptSubList = ""; +while($deptSubW = $dbc->fetch_array($deptSubR)){ + $deptSubList .=" "; +} +while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Fannie : Open Rings"; +$header = "Open Rings"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Select Buyer/Dept + Send to Excel
        Selecting a Buyer/Dept overrides Department Start/Department End, but not Date Start/End. + To run reports for a specific department(s) leave Buyer/Dept or set it to 'blank'

        Department Start

        +

        End

        + + +

        +

        + + +

        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
        Show results by? Date format is YYYY-MM-DD
        (e.g. 2004-04-01 = April 1, 2004)
          
        +
        + + diff --git a/fannie/reports/OpenRings/report.php b/fannie/reports/OpenRings/report.php new file mode 100644 index 000000000..36e69e80f --- /dev/null +++ b/fannie/reports/OpenRings/report.php @@ -0,0 +1,272 @@ +Query Results"; + echo ""; + + echo ""; + + $today = date("F d, Y"); + //Following lines creates a header for the report, listing sort option chosen, report date, date and department range. + echo "Report summed by "; + echo $_GET['sort'] . " on "; + echo "
        "; + echo $today; + echo "
        "; + echo "From "; + print $date1; + echo " to "; + print $date2; + if (!isset($_REQUEST['excel'])){ + echo "
        "; + if(isset($buyer) && $buyer != 0){ + echo " Buyer/Dept: "; + $buyerQ = $dbc->prepare_statement("SELECT super_name as name FROM superDeptNames where superID = ?"); + $buyerR = $dbc->exec_statement($buyerQ,array($buyer)); + $buyerW = $dbc->fetch_array($buyerR); + $buyName = $buyerW['name']; + echo $buyName; + }else{ + echo " Department range: "; + print $deptStart; + echo " to "; + print $deptEnd; + } + echo "
        "; + echo "Save to Excel
        "; + } + + $dlog = select_dlog($date1,$date2); + + $date2a = $date2 . " 23:59:59"; + $date1a = $date1 . " 00:00:00"; + //decide what the sort index is and translate from lay person to mySQL table label + + $args = array(); + if($sort == "Date"){ + $query = ""; + if(isset($buyer) && $buyer > 0){ + $query = "SELECT year(tdate),month(tdate),day(tdate), + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + WHERE s.superID = ? AND trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(tdate) + ORDER BY year(tdate),month(tdate),day(tdate)"; + $args = array($buyer); + } + else if (isset($buyer) && $buyer == -1){ + $query = "SELECT year(tdate),month(tdate),day(tdate), + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + WHERE trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(tdate) + ORDER BY year(tdate),month(tdate),day(tdate)"; + } + else if (isset($buyer) && $buyer == -2){ + $query = "SELECT year(tdate),month(tdate),day(tdate), + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + WHERE s.superID <> 0 AND trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(tdate) + ORDER BY year(tdate),month(tdate),day(tdate)"; + } + else { + $query = "SELECT year(tdate),month(tdate),day(tdate), + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + WHERE t.department BETWEEN ? AND ? + AND trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY year(tdate),month(tdate),day(tdate) + ORDER BY year(tdate),month(tdate),day(tdate)"; + $args = array($deptStart,$deptEnd); + } + $args[] = $date1a; + $args[] = $date2a; + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + echo "\n"; //create table + echo ""; + echo ""; + echo "\n";//create table header + + while ($w = $dbc->fetch_row($result)) { //create array from query + + printf("", + $w[1],$w[2],$w[0],$w['total'],$w['qty'],$w['percentage']*100); + //convert row information to strings, enter in table cells + + } + + echo "
        Day$# Open Rings%
        %d/%d/%d%.2f%.2f%.2f%%
        \n";//end table + + }else if ($sort=="Department"){ //create alternate query if not sorting by PLU + $query=""; + $args = array(); + if(isset($buyer) && $buyer>0){ + $query = "SELECT t.department,d.dept_name, + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + LEFT JOIN departments AS d ON t.department=d.dept_no + WHERE s.superID = ? AND trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY t.department,d.dept_name + ORDER BY t.department,d.dept_name"; + $args = array($buyer); + } + else if (isset($buyer) && $buyer == -1){ + $query = "SELECT t.department,d.dept_name, + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + LEFT JOIN departments AS d ON t.department=d.dept_no + WHERE trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY t.department,d.dept_name + ORDER BY t.department,d.dept_name"; + } + else if (isset($buyer) && $buyer == -2){ + $query = "SELECT t.department,d.dept_name, + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + LEFT JOIN departments AS d ON t.department=d.dept_no + WHERE s.superID <> 0 AND trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY t.department,d.dept_name + ORDER BY t.department,d.dept_name"; + } + else { + $query = "SELECT t.department,d.dept_name, + SUM(CASE WHEN trans_type='D' THEN total ELSE 0 END) as total, + SUM(CASE WHEN trans_type='D' THEN abs(quantity) ELSE 0 END) as qty, + SUM(CASE WHEN trans_type='D' THEN 1.0 ELSE 0.0 END) / + SUM(CASE WHEN trans_type IN ('I','D') THEN 1.0 ELSE 0.0 END) as percentage + FROM $dlog as t + LEFT JOIN MasterSuperDepts AS s ON t.department = s.dept_ID + LEFT JOIN departments AS d ON t.department=d.dept_no + WHERE t.department BETWEEN ? AND ? + AND trans_type IN ('I','D') + AND tdate BETWEEN ? AND ? + GROUP BY t.department,d.dept_name + ORDER BY t.department,d.dept_name"; + $args = array($deptStart,$deptEnd); + } + //echo $query; + $args[] = $date1a; + $args[] = $date2a; + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + + echo "\n";//create table + echo ""; + echo ""; + echo ""; + + while ($w = $dbc->fetch_row($result)) { //create array from query + printf("", + $w['department'],$w['dept_name'],$w['total'], + $w['qty'],$w['percentage']*100); + } + echo "
        Dept.Name$# Open Rings%
        %d%s%.2f%.2f%.2f%%
        \n"; + + } + + $output = ob_get_contents(); + ob_end_clean(); + + if (!isset($_REQUEST['excel'])){ + echo $output; + echo ""; + } + else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + //include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToCsv.php'); + $array = HtmlToArray($output); + //$xls = ArrayToXls($array); + $xls = ArrayToCsv($array); + echo $xls; + } +?> diff --git a/fannie/reports/Patronage/index.php b/fannie/reports/Patronage/index.php new file mode 100644 index 000000000..6a5dff736 --- /dev/null +++ b/fannie/reports/Patronage/index.php @@ -0,0 +1,92 @@ +prepare_statement("SELECT FY FROM patronage GROUP BY FY ORDER BY FY DESC"); + $fyR = $dbc->exec_statement($fyQ); + echo ''; + echo '
        '; +} + +if ($fy != ""){ + $pQ = $dbc->prepare_statement("SELECT cardno,purchase,discounts,rewards,net_purch, + tot_pat,cash_pat,equit_pat,0 as type,0 as ttl FROM patronage as p + WHERE p.FY=? ORDER BY cardno"); + $pR = $dbc->exec_statement($pQ,array($fy)); + if (!isset($_REQUEST['excel'])) + printf('Download Report',$fy); + echo ''; + echo ''; + echo ' + '; + echo ' + + '; + while($pW = $dbc->fetch_row($pR)){ + printf(' + + + + + + + + + + + ', + $pW['cardno'],$pW['purchase'],-1*$pW['discounts'], + -1*$pW['rewards'],$pW['net_purch'],$pW['cash_pat'], + $pW['equit_pat'],$pW['tot_pat'], + ($pW['type']==''?'n/a':strtoupper($pW['type'])), + -1*$pW['ttl'] + ); + } + echo '
        Patronage FY'.$fy.'
         SpendingRebateRedeemed
        #GrossDiscountsRewardsNetCashEquityTTLTypeAmt
        %d%.2f%.2f%.2f%.2f%.2f%.2f%.2f%s%.2f
        '; +} + +if (!isset($_REQUEST['excel'])) + include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/reports/PriceHistory/index.php b/fannie/reports/PriceHistory/index.php new file mode 100644 index 000000000..21f420add --- /dev/null +++ b/fannie/reports/PriceHistory/index.php @@ -0,0 +1,196 @@ +prepare_statement($q); + $r = $sql->exec_statement($p,$args); + + echo ""; + echo ""; + echo ""; + if (!isset($_GET['upc'])) + echo ""; + echo ""; + + while ($row = $sql->fetch_array($r)){ + printf("", + $row['upc'],$row['description'],$row['price'], + $row['modified']); + if (!isset($_GET['upc'])) echo ""; + echo ""; + } + echo "
        UPCDescriptionPriceDateCurrent Price
        %s%s%.2f%s".$row['normal_price']."
        "; +} +else { + +$deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); +$deptsR = $sql->exec_statement($deptsQ); +$deptsList = ""; +while ($deptsW = $sql->fetch_array($deptsR)) + $deptsList .= ""; + +$page_title = "Price Change Report"; +$header = "Fannie : Price Change Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + + + + +
        +Type: UPC + Department + Manufacturer +
        + +
        +UPC:
        +
        + +
        +Department Start: +
        +Department End: +
        +
        + +
        +Manufacturer:
        + UPC prefix + Manufacturer name
        +
        + +Start Date:
        +End Date:
        + Excel +
        + diff --git a/fannie/reports/ProductMovement/ProductMovementModular.php b/fannie/reports/ProductMovement/ProductMovementModular.php new file mode 100644 index 000000000..2663ae3f8 --- /dev/null +++ b/fannie/reports/ProductMovement/ProductMovementModular.php @@ -0,0 +1,186 @@ +title = "Fannie : Product Movement"; + $this->header = "Product Movement Report"; + $this->report_cache = 'none'; + + if (isset($_REQUEST['date1'])){ + /** + Form submission occurred + + Change content function, turn off the menus, + set up headers + */ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('Date','UPC','Description','Qty','$'); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $date1 = FormLib::get_form_value('date1',date('Y-m-d')); + $date2 = FormLib::get_form_value('date2',date('Y-m-d')); + $upc = FormLib::get_form_value('upc','0'); + if (is_numeric($upc)) + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $dlog = select_dlog($date1,$date2); + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumUpcSalesByDay"; + + $query = "select month(t.tdate),day(t.tdate),year(t.tdate), + t.upc,p.description, + sum(t.quantity) as qty, + sum(t.total) from + $dlog as t left join products as p on t.upc = p.upc + where t.upc = ? AND + tdate BETWEEN ? AND ? + group by year(t.tdate),month(t.tdate),day(t.tdate), + t.upc,p.description + order by year(t.tdate),month(t.tdate),day(t.tdate)"; + $args = array($upc,$date1.' 00:00:00',$date2.' 23:59:59'); + + if (strtolower($upc) == "rrr" || $upc == "0000000000052"){ + if ($dlog == "dlog_90_view" || $dlog=="dlog_15") + $dlog = "transarchive"; + else { + $dlog = "trans_archive.bigArchive"; + } + + $query = "select MONTH(datetime),DAY(datetime),YEAR(datetime), + upc,'RRR', + sum(case when upc <> 'rrr' then quantity when volSpecial is null or volSpecial > 9999 then 0 else volSpecial end) as qty, + sum(t.total) from + $dlog as t + where upc = ? + AND datetime BETWEEN ? AND ? + and emp_no <> 9999 and register_no <> 99 + and trans_status <> 'X' + GROUP BY YEAR(datetime),MONTH(datetime),DAY(datetime) + ORDER BY YEAR(datetime),MONTH(datetime),DAY(datetime)"; + + } + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + + /** + Simple report + + Issue a query, build array of results + */ + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + $record[] = $row[0]."/".$row[1]."/".$row[2]; + $record[] = $row[3]; + $record[] = $row[4]; + $record[] = $row[5]; + $record[] = $row[6]; + $ret[] = $record; + } + return $ret; + } + + /** + Sum the quantity and total columns + */ + function calculate_footers($data){ + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[3]; + $sumSales += $row[4]; + } + return array('Total',null,null,$sumQty,$sumSales); + } + + function form_content(){ +?> +
        +
        + + + + + + + + + + + + + + + + + + + + +
        UPC + + + + +
        Date Start + + + +
        End + +
        +
        +
        +draw_page(); +?> diff --git a/fannie/reports/ProductMovement/index.php b/fannie/reports/ProductMovement/index.php new file mode 100644 index 000000000..029f277f2 --- /dev/null +++ b/fannie/reports/ProductMovement/index.php @@ -0,0 +1,24 @@ + diff --git a/fannie/reports/Recall/index.php b/fannie/reports/Recall/index.php new file mode 100644 index 000000000..451286673 --- /dev/null +++ b/fannie/reports/Recall/index.php @@ -0,0 +1,91 @@ +prepare_statement("SELECT description FROM products WHERE upc=?"); + $r = $dbc->exec_statement($q,array($upc)); + $w = $dbc->fetch_row($r); + $description = $w[0]; + + $q = $dbc->prepare_statement("SELECT d.card_no,c.lastname,c.firstname,m.street,m.city,m.state, + m.zip,m.phone,m.email_2,m.email_1,sum(quantity) as qty, + sum(total) as amt + FROM $dlog AS d LEFT JOIN custdata AS c + ON c.cardno=d.card_no AND c.personnum=1 + LEFT JOIN meminfo AS m ON m.card_no=c.cardno + WHERE d.upc=? AND + tdate BETWEEN ? AND ? + GROUP BY d.card_no,c.firstname,c.lastname,m.street,m.city, + m.state,m.zip,m.phone,m.email_1,m.email_2 + ORDER BY c.lastname,c.firstname"); + $r = $dbc->exec_statement($q,array($upc,$date1.' 00:00:00',$date2.' 23:59:59')); + + if(isset($_REQUEST['excel'])){ + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="recallReport.xls"'); + } + + ob_start(); + + echo "Purchases for $upc ($description)
        + between $date1 and $date2"; + echo ""; + echo " + + + "; + while($w = $dbc->fetch_row($r)){ + printf("", + $w[0],$w[1],$w[2]); + for($i=3;$i<12;$i++) + printf("",(empty($w[$i])?' ':$w[$i])); + echo ""; + } + echo "
        Mem#NameAddressCityStateZipPhoneAlt. PhoneEmailQtyAmt
        %d%s, %s%s
        "; + + $output = ob_get_contents(); + ob_end_clean(); + + if (!isset($_REQUEST['excel'])){ + echo $output; + } + else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + //include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToCsv.php'); + $array = HtmlToArray($output); + //$xls = ArrayToXls($array); + $xls = ArrayToCsv($array); + echo $xls; + } + +} +else { + $page_title = "Fannie : Product Purchasers"; + $header = "Product Purchasers"; + include($FANNIE_ROOT.'src/header.html'); + echo ' +
        + + + + + + + + + +
        UPC
        Start date
        End date
        +
        '; + include($FANNIE_ROOT.'src/footer.html'); +} + +?> diff --git a/fannie/reports/RecentSales/index.php b/fannie/reports/RecentSales/index.php new file mode 100644 index 000000000..c7f84f45c --- /dev/null +++ b/fannie/reports/RecentSales/index.php @@ -0,0 +1,120 @@ +sep()); + $args = array($_GET['likecode']); +} +else + exit; + +echo ""; + +$days = array(); +$stamp = strtotime('yesterday'); +for($i=1;$i<=3;$i++){ + $days[$i] = date("Y-m-d",$stamp); + $stamp = mktime(0,0,0,date("n",$stamp),date("j",$stamp)-1,date("Y",$stamp)); +} + +$weeks[0] = array(date("Y-m-d",strtotime("monday this week")), + date("Y-m-d",strtotime("sunday this week"))); +$weeks[1] = array(date("Y-m-d",strtotime("monday last week")), + date("Y-m-d",strtotime("sunday last week"))); + +$months[0] = array(date("Y-m-01"),date("Y-m-t")); +$stamp = mktime(0,0,0,date("n")-1,1,date("Y")); +$months[0] = array(date("Y-m-01",$stamp),date("Y-m-t",$stamp)); + +$q = "SELECT sum(case when ".$dbc->date_equals('tdate',$days[1])." AND trans_status<>'M' THEN quantity else 0 end) as qty1, + sum(case when ".$dbc->date_equals('tdate',$days[1])." THEN total else 0 end) as total1, + sum(case when ".$dbc->date_equals('tdate',$days[2])." AND trans_status<>'M' THEN quantity else 0 end) as qty2, + sum(case when ".$dbc->date_equals('tdate',$days[2])." THEN total else 0 end) as total2, + sum(case when ".$dbc->date_equals('tdate',$days[3])." AND trans_status<>'M' THEN quantity else 0 end) as qty3, + sum(case when ".$dbc->date_equals('tdate',$days[3])." THEN total else 0 end) as total3, + sum(case when (tdate BETWEEN '{$weeks[0][0]} 00:00:00' AND + '{$weeks[0][1]} 23:59:59') AND trans_status<>'M' THEN quantity else 0 end) as qtywk0, + sum(case when (tdate BETWEEN '{$weeks[0][0]} 00:00:00' AND + '{$weeks[0][1]} 23:59:59') THEN total else 0 end) as totalwk0, + sum(case when (tdate BETWEEN '{$weeks[1][0]} 00:00:00' AND + '{$weeks[1][1]} 23:59:59') AND trans_status<>'M' THEN quantity else 0 end) as qtywk1, + sum(case when (tdate BETWEEN '{$weeks[1][0]} 00:00:00' AND + '{$weeks[1][1]} 23:59:59') THEN total else 0 end) as totalwk1 + FROM dlog_15 as d $where"; +$p = $dbc->prepare_statement($q); +$r = $dbc->exec_statement($p,$args); +$w = $dbc->fetch_row($r); + +echo ""; +printf(""; +printf(""; +printf(""; +printf(""; +printf(""; +printf(""; +printf("
         QtySales
        Yesterday%.2f$%.2f", + $w['qty1'],$w['total1']); + +echo "
        2 Days ago%.2f$%.2f",$w['qty2'],$w['total2']); + +echo "
        3 Days ago%.2f$%.2f",$w['qty3'],$w['total3']); + +echo "
        This Week%.2f$%.2f",$w['qtywk0'],$w['totalwk0']); + +echo "
        Last Week%.2f$%.2f",$w['qtywk1'],$w['totalwk1']); + +$q = "SELECT sum(case when ".$dbc->monthdiff($dbc->now(),'tdate')."=0 AND trans_status<>'M' THEN quantity else 0 end) as qtym0, + sum(case when ".$dbc->monthdiff($dbc->now(),'tdate')."=0 THEN total else 0 end) as totalm0, + sum(case when ".$dbc->monthdiff($dbc->now(),'tdate')."=1 AND trans_status<>'M' THEN quantity else 0 end) as qtym1, + sum(case when ".$dbc->monthdiff($dbc->now(),'tdate')."=1 THEN total else 0 end) as totalm1 + FROM dlog_90_view as d $where"; +$p = $dbc->prepare_statement($q); +$r = $dbc->exec_statement($p,$args); +$w = $dbc->fetch_row($r); + +echo "
        This Month%.2f$%.2f",$w['qtym0'],$w['totalm0']); + +echo "
        Last Month%.2f$%.2f",$w['qtym1'],$w['totalm1']); + +echo "
        "; +?> diff --git a/fannie/reports/SalePerformance/index.php b/fannie/reports/SalePerformance/index.php new file mode 100644 index 000000000..e079f3f8f --- /dev/null +++ b/fannie/reports/SalePerformance/index.php @@ -0,0 +1,100 @@ +
        "; + $ret .= sprintf(" + ", + $m,$y); + $ret .= ""; + $ret .= ""; + $q = $dbc->prepare_statement("SELECT batchID,batchName,startDate,endDate FROM + batches WHERE discounttype <> 0 AND ( + (year(startDate)=? and month(startDate)=?) OR + (year(endDate)=? and month(endDate)=?) + ) ORDER BY startDate,batchType,batchName"); + $r = $dbc->exec_statement($q,array($y,$m,$y,$m)); + while($w = $dbc->fetch_row($r)){ + $start = array_shift(explode(' ',$w[2])); + $end = array_shift(explode(' ',$w[3])); + $ret .= sprintf(" + + ", + $w[0],$w[1],$start,$end,$w[1]." (".$start." ".$end.")"); + } + $ret .= "
         BatchStartEnd
        %s%s%s

        + +
        "; + echo $ret; + exit; +} + +$page_title = "Fannie : Sale Performance"; +$header = "Sale Performance"; +include($FANNIE_ROOT.'src/header.html'); +?> + + +
        + + +" /> + + +
        +
        + + diff --git a/fannie/reports/SalePerformance/report.php b/fannie/reports/SalePerformance/report.php new file mode 100644 index 000000000..251e1731a --- /dev/null +++ b/fannie/reports/SalePerformance/report.php @@ -0,0 +1,88 @@ +prepare_statement("SELECT min(tdate) as weekStart,max(tdate) as weekEnd, + batchName,sum(total) as sales,sum(d.quantity) as qty + FROM $table AS d INNER JOIN batchList + AS l ON d.upc=l.upc LEFT JOIN batches + as b ON b.batchID=l.batchID + WHERE l.batchID IN $bids + AND d.tdate >= b.startDate + AND d.tdate <= b.endDate + GROUP BY datepart(wk,tdate),batchName + ORDER BY batchName,min(tdate)"); +$r = $dbc->exec_statement($q,$args); +$ttls = array(); +$bttls = array(); +echo ""; +echo ""; +while($w = $dbc->fetch_row($r)){ + $s = array_shift(explode(' ',$w[0])); + $e = array_shift(explode(' ',$w[1])); + printf("", + $s,$e, + $w[2],$w[4],$w[3]); + if (!isset($ttls["$s to $e"])) $ttls["$s to $e"] = array(0.0,0.0); + $ttls["$s to $e"][0] += $w[4]; + $ttls["$s to $e"][1] += $w[3]; + if (!isset($bttls[$w[2]])) $bttls[$w[2]] = array(0.0,0.0); + $bttls[$w[2]][0] += $w[4]; + $bttls[$w[2]][1] += $w[3]; +} +echo "
        WeekBatchSales (Qty)Sales ($)
        %s%s%s%.2f\$%.2f
        "; + +echo "
        "; + +echo ""; +echo ""; +foreach($ttls as $k=>$v){ + printf("", + $k,$v[0],$v[1]); +} +echo "
        Weekly totalsSales (Qty)Sales ($)
        %s%.2f\$%.2f
        "; + +echo "
        "; + +echo ""; +echo ""; +foreach($bttls as $k=>$v){ + printf("", + $k,$v[0],$v[1]); +} +echo "
        Batch totalsSales (Qty)Sales ($)
        %s%.2f\$%.2f
        "; + + +?> diff --git a/fannie/reports/SalesToday/index.php b/fannie/reports/SalesToday/index.php new file mode 100644 index 000000000..fb44e788a --- /dev/null +++ b/fannie/reports/SalesToday/index.php @@ -0,0 +1,114 @@ +prepare_statement("SELECT superID,super_name FROM MasterSuperDepts ORDER BY super_name"); +$superR = $dbc->exec_statement($superP); +$supers = array(); +$supers[-1] = "All"; +while($row = $dbc->fetch_row($superR)){ + $supers[$row[0]] = $row[1]; + if ($selected == $row[0]) + $name = $row[1]; +} + +$page_title = "Fannie : Today's $name Sales"; +$header = "Today's $name Sales"; +include($FANNIE_ROOT.'src/header.html'); +$today = date("Y-m-d"); + +$query1="SELECT ".$dbc->hour('tdate').", +sum(total)as Sales +FROM ".$FANNIE_TRANS_DB.$dbc->sep()."dlog as d left join MasterSuperDepts as t +on d.department = t.dept_ID +WHERE ".$dbc->datediff('tdate',$dbc->now())."=0 +AND (trans_type ='I' OR trans_type = 'D' or trans_type='M') +AND (t.superID > 0 or t.superID IS NULL) +GROUP BY ".$dbc->hour('tdate')." +order by ".$dbc->hour('tdate'); +$args = array(); +if ($selected != -1){ + $query1="SELECT ".$dbc->hour('tdate').", + sum(total)as Sales, + sum(case when t.superID=? then total else 0 end) as prodSales + FROM ".$FANNIE_TRANS_DB.$dbc->sep()."dlog as d left join MasterSuperDepts as t + on d.department = t.dept_ID + WHERE ".$dbc->datediff('tdate',$dbc->now())."=0 + AND (trans_type ='I' OR trans_type = 'D' or trans_type='M') + AND t.superID > 0 + GROUP BY ".$dbc->hour('tdate')." + order by ".$dbc->hour('tdate'); + $args = array($selected); +} + +$prep = $dbc->prepare_statement($query1); +$result = $dbc->exec_statement($query1,$args); +echo "

        Today's $name Sales!

        "; +echo ""; +echo ""; +$sum = 0; +$sum2 = 0; +while($row=$dbc->fetch_row($result)){ + printf("", + $row[0], + ($selected==-1)?$row[1]:$row[2], + ($selected==-1)?'display:none;':'', + ($selected==-1)?0.00:$row[2]/$row[1]*100); + $sum += $row[1]; + if($selected != -1) $sum2 += $row[2]; +} +echo "
        HourSales
        %d%.2f%.2f%%
        Total"; +if ($selected != -1) + echo "$sum2".round($sum2/$sum*100,2)."%"; +else + echo $sum; +echo "
        "; + +echo "

        "; +echo "Also available:

        "; + +include($FANNIE_ROOT.'src/footer.html'); +?> diff --git a/fannie/reports/StockSummary/index.php b/fannie/reports/StockSummary/index.php new file mode 100644 index 000000000..b6054df58 --- /dev/null +++ b/fannie/reports/StockSummary/index.php @@ -0,0 +1,59 @@ +prepare_statement("select + card_no, + LastName,FirstName,Type, + sum(case when tdate <= '2005-11-26 23:59:59' then stockPurchase else 0 end) as unknown, + sum(case when tdate > '2005-11-26 23:59:59' and dept=992 then stockPurchase else 0 end) as classA, + sum(case when tdate > '2005-11-26 23:59:59' and dept=991 then stockPurchase else 0 end) as classB + from $trans.stockpurchases as s + left join custdata as c + on s.card_no=c.CardNo and c.personNum=1 + where card_no > 0 + group by card_no,LastName,FirstName,Type + order by card_no"); +$r = $dbc->exec_statement($q); + +if (!isset($_REQUEST['excel'])) + echo "Save as Excel"; + +ob_start(); + +echo " + +"; +$types = array('PC'=>'Member','REG'=>'NonMember', + 'TERM'=>'Termed','INACT'=>'Inactive', + 'INACT2'=>'Term Pending'); +while($w = $dbc->fetch_row($r)){ + printf(" + ", + $w['card_no'],$w['LastName'],$w['FirstName'], + $types[$w['Type']],$w['classA'],$w['classB'], + $w['unknown']); +} +echo "
        Mem#NameStatusABUnknown
        %d%s, %s%s%.2f%.2f%.2f
        "; + +$page = ob_get_contents(); +ob_end_clean(); + +if (!isset($_REQUEST['excel'])) + echo $page; +else { + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="StockSummary'.date('Y-m-d').'.xls"'); + + //$array = HtmlToArray($page); + //$xls = ArrayToXls($array); + echo $page; +} + +?> diff --git a/fannie/reports/Store-Specific/WEFC_Toronto/GeneralCosts/index.php b/fannie/reports/Store-Specific/WEFC_Toronto/GeneralCosts/index.php new file mode 100644 index 000000000..ac46b6cd0 --- /dev/null +++ b/fannie/reports/Store-Specific/WEFC_Toronto/GeneralCosts/index.php @@ -0,0 +1,300 @@ +General Costs: %s \n", ($d1 == $d2) ? "For $d1" : "From $d1 to $d2"); + printf("Save to Excel", + $d1,$d2,$dept); + } + + + /* Using department settings at the time of sale. + * I.e. The department# from the transaction. + * If that department# no longer exists or is different then the report will be wrong. + * This does not use a departments table contemporary with the transactions. + */ + if ($dept == 0){ + $costs = "SELECT + d.Dept_name, + sum(CASE WHEN t.trans_type = 'I' THEN t.cost WHEN t.trans_type = 'D' AND m.margin > 1.00 THEN t.total / m.margin ELSE 0.00 END), + sum(t.quantity), + s.superID, + s.super_name + FROM + $dlog AS t LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + MasterSuperDepts AS s ON t.department=s.dept_ID LEFT JOIN + deptMargin AS m ON t.department=m.dept_id + WHERE + (datetime BETWEEN ? AND ?) + AND (s.superID > 0 OR s.superID IS NULL) + AND (t.trans_type in ('I','D')) + AND ((t.trans_status not in ('D','X','Z')) and (t.emp_no not in (7000, 9999)) and (t.register_no <> 99)) + GROUP BY + s.superID,s.super_name,d.dept_name,t.department + ORDER BY + s.superID,t.department"; + + } + /* Using current department settings. + * I.e. The department for the upc from the current products table. + * This does not use a departments table contemporary with the transactions. + */ + elseif ($dept == 1){ + $costs = "SELECT + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + sum(CASE WHEN t.trans_type = 'I' THEN t.cost WHEN t.trans_type = 'D' AND m.margin > 1.00 THEN t.total / m.margin ELSE 0.00 END), + sum(t.quantity), + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END + FROM + $dlog AS t LEFT JOIN + products AS p ON t.upc=p.upc LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + departments AS e ON p.department=e.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=p.department LEFT JOIN + MasterSuperDepts AS r ON r.dept_ID=t.department LEFT JOIN + deptMargin AS m ON p.department=m.dept_id + WHERE + (datetime BETWEEN ? AND ?) + AND (t.trans_type = 'I' or t.trans_type = 'D') + AND (s.superID > 0 OR (s.superID IS NULL AND r.superID > 0) + OR (s.superID IS NULL AND r.superID IS NULL)) + AND ((t.trans_status not in ('D','X','Z')) and (t.emp_no not in (7000, 9999)) and (t.register_no <> 99)) + GROUP BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END, + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end + ORDER BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end"; + } + else { + print "
        Form variable 'dept' value >{$dept}< is unknown."; + exit; + } + + // Array in which totals used in the report are accumulated. + $supers = array(); + + $prep = $dbc->prepare_statement($costs); + $costsR = $dbc->exec_statement($prep,array($d1.' 00:00:00',$d2.' 23:59:59')); + + $curSuper = 0; + $grandTotal = 0; + while($row = $dbc->fetch_row($costsR)){ + if ($curSuper != $row[3]){ + $curSuper = $row[3]; + } + if (!isset($supers[$curSuper])) + $supers[$curSuper] = array('costs'=>0.0,'qty'=>0.0,'name'=>$row[4],'depts'=>array()); + $supers[$curSuper]['costs'] += $row[1]; + $supers[$curSuper]['qty'] += $row[2]; + $supers[$curSuper]['depts'][] = array('name'=>$row[0],'costs'=>$row[1],'qty'=>$row[2]); + $grandTotal += $row[1]; + } + + $superCount = 0; + foreach($supers as $s){ + if ($s['costs']==0) continue; + $superCount++; + if ( $superCount == 1) { + echo "\n"; + echo "\n"; + } else { + echo "\n"; + echo "\n"; + } + $superSum = $s['costs']; + foreach($s['depts'] as $d){ + printf(" + \n", + $d['name'],$d['costs'],$d['qty'], + $d['costs'] / $grandTotal * 100, + $d['costs'] / $superSum * 100); + } + + printf(" + \n", + $s['name'],$s['costs'],$s['qty'],$s['costs']/$grandTotal * 100); + + } + echo "
         CostQty% CostDept %
        Foo
         CostQty% CostDept %
        %s\$%.2f%.2f%.2f %%%.2f %%
        %s\$%.2f%.2f%.2f %% 

        "; + + printf("Total Costs: \$%.2f",$grandTotal); +} +// Form for specifying the report. +else { + +$page_title = "Fannie : General Costs Report"; +$header = "General Costs Report"; +include($FANNIE_ROOT.'src/header.html'); +$lastMonday = ""; +$lastSunday = ""; + +/* Default date range is the most recent complete Mon-Sun week, + * with calculation beginning yesterday. + * If today is Friday the 25th the range is 14th to 20th. + * If today is Monday the 28th the range is 21st to 27th. +*/ +$ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); +while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); +} +?> + +
        + + + + + + + + + + + +
        + + + + + + + + + +
        Start Date +
        End Date + +
        + Start - End +
        +
        +
        +Other dates + + + + +
        + Today
        + This week
        + This month
        +
        + Yesterday
        + Last week
        + Last month
        +
        +
        +
        Excel
        +
        + diff --git a/fannie/reports/Store-Specific/WEFC_Toronto/OntarioTaxes/index.php b/fannie/reports/Store-Specific/WEFC_Toronto/OntarioTaxes/index.php new file mode 100644 index 000000000..85e9e2d72 --- /dev/null +++ b/fannie/reports/Store-Specific/WEFC_Toronto/OntarioTaxes/index.php @@ -0,0 +1,255 @@ +Ontario Total Taxes: %s \n", ($d1 == $d2) ? "For $d1" : "From $d1 to $d2"); + printf("Save to Excel", + $d1,$d2,$dept); + } + + $sales = "SELECT + d.Dept_name, + sum(CASE WHEN t.tax = 0 THEN 0 ELSE t.total * x.rate END), + sum(t.quantity), + s.superID, + s.super_name + FROM $dlog AS t LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + MasterSuperDepts AS s ON t.department=s.dept_ID LEFT JOIN + core_op.taxrates AS x ON t.tax=x.id + WHERE + (tDate BETWEEN ? AND ?) + AND (s.superID > 0 OR s.superID IS NULL) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + GROUP BY s.superID,s.super_name,d.dept_name,t.department + ORDER BY s.superID,t.department"; + + // 1 = Current Dept. Settings. Default, 0 = Settings at time of sale. + if ($dept == 1){ + $sales = "SELECT + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + sum(CASE WHEN t.tax = 0 THEN 0 ELSE t.total * x.rate END), + sum(t.quantity), + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END + FROM $dlog AS t LEFT JOIN + products AS p ON t.upc=p.upc LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + departments AS e ON p.department=e.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=p.department LEFT JOIN + MasterSuperDepts AS r ON r.dept_ID=t.department LEFT JOIN + core_op.taxrates AS x ON t.tax=x.id + WHERE + (tDate BETWEEN ? AND ?) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + AND (s.superID > 0 OR (s.superID IS NULL AND r.superID > 0) + OR (s.superID IS NULL AND r.superID IS NULL)) + GROUP BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END, + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end + ORDER BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end"; + } + $supers = array(); + $salesP = $dbc->prepare_statement($sales); + $salesR = $dbc->exec_statement($salesP, array($d1.' 00:00:00',$d2.' 23:59:59')); + + $curSuper = 0; + $grandTotal = 0; + while($row = $dbc->fetch_row($salesR)){ + if ($curSuper != $row[3]){ + $curSuper = $row[3]; + } + if (!isset($supers[$curSuper])) + $supers[$curSuper] = array('sales'=>0.0,'qty'=>0.0,'name'=>$row[4],'depts'=>array()); + $supers[$curSuper]['sales'] += $row[1]; + $supers[$curSuper]['qty'] += $row[2]; + $supers[$curSuper]['depts'][] = array('name'=>$row[0],'sales'=>$row[1],'qty'=>$row[2]); + $grandTotal += $row[1]; + } + + foreach($supers as $s){ + if ($s['sales']==0) continue; + echo "\n";//create table + echo "\n";//create table header + $superSum = $s['sales']; + foreach($s['depts'] as $d){ + printf(" + \n", + $d['name'],$d['sales'],$d['qty'], + $d['sales'] / $grandTotal * 100, + $d['sales'] / $superSum * 100); + } + + printf(" + \n", + $s['name'],$s['sales'],$s['qty'],$s['sales']/$grandTotal * 100); + + echo "
         TaxesQty% SalesDept %
        %s\$%.2f%.2f%.2f %%%.2f %%
        %s\$%.2f%.2f%.2f %% 

        "; + } + + printf("Total Taxes: \$%.2f",$grandTotal); +} +else { + +$page_title = "Fannie : Ontario Total Taxes Report"; +$header = "Ontario Total Taxes Report"; +include($FANNIE_ROOT.'src/header.html'); +$lastMonday = ""; +$lastSunday = ""; + +$ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); +while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); +} +?> + +
        + + + + + + + + + + + + +
        + + + + + + + + + +
        Start Date +
        End Date
        + Start - End +
        +
        +
        +Other dates + + + + +
        + Today
        + This week
        + This month
        +
        + Yesterday
        + Last week
        + Last month
        +
        +
        +
        Excel
        +
        + diff --git a/fannie/reports/Store-Specific/WEFC_Toronto/ProductsExport/index.php b/fannie/reports/Store-Specific/WEFC_Toronto/ProductsExport/index.php new file mode 100644 index 000000000..f5e969a88 --- /dev/null +++ b/fannie/reports/Store-Specific/WEFC_Toronto/ProductsExport/index.php @@ -0,0 +1,322 @@ +Products Export: $dateStamp\n"; + echo "
        Save to Excel"; + } + + $taxNames = array(0 => ''); + $taxRates = array(0 => 0); + $tQ = "SELECT id, description,rate FROM core_op.taxrates WHERE id > 0 ORDER BY id"; + $tR = $dbc->query($tQ); + while ( $trow = $dbc->fetch_array($tR) ) { + $taxNames[$trow['id']] = $trow['description']; + $taxRates[$trow['id']] = $trow['rate']; + } + + //$productTables = array("products", "productUser", "products_WEFC_Toronto", "vendorItems", "prodExtra"); + + /* Indexes to the array returned by csv_parser, the column number in the .csv file. + "first" = 0. + 'c + $UPC = 0; // G:A:0 "Supplier UPC". UPC or PLU. + $SEARCH = 1; // B:B:1 search_description, for productUser.description + $VENDOR_NAME = 2; // E:C:2 Distributor + $ORDER_CODE = 3; // -:D:3 ORDER_CODE, from Buying system + $DEPT_NAME = 4; // F:E:4 Department + $BRAND_NAME = 5; // C:F:5 Brand deptMargin.dept_ID +// + $IN_USE = 6; // -:G:6 products:inUse +// H - qtyfrc (1 for true, 0 or blank for false, new as per email this evening) + $QTYFRC = 7; // -:H:7 products:qttyEnforced +// I - like code (has to be manually created in IS4C) + $MIXMATCH = 8; // -:I:8 products:mixmatchcode +// J - qcount (count of items of a quantity price, like "3" for "3 lemons for a dollar", blank means no q price) + $QUANTITY = 9; // -:J:9 products:quantity qcount +// K - qprice (the quantity price, new this evening, blank for none) + $GROUP_PRICE = 10; // -:K:10 products:groupprice qprice +// L - qstrict (whether or not the quantity price requires that many at least, +// or just over-rides the per-unit price, new this evening, +// 1 for true -> 2, 0 or blank for false -> 1 ) +// Error if 2 and normal_price = "" + $PRICE_METHOD = 11; // -:L:11 products:pricemethod qstrict +// :M-N are not used here ++ $DISCOUNTABLE = 12; // -:M:12 Item discountable 0=no 1=yes ++ $DISCOUNT_TYPE = 13; // -:N:13 Whether to use "special" i.e. sale prices and for which kind of customer: + + $DESCRIPTION = 14; // D:O:14 Item + $CASE_COST = 15; // H:P:15 "Case Cost" 9999.99 + $CASE_SIZE = 16; // J:Q:16 "Case Size" 99 + $UNIT_SIZE = 17; // K:R:17 "Unit Size" 99 + $UNIT_NAME = 18; // L:S:18 "Units "g"/"ml"/"bags" + $UNIT_COST = 19; // M:T:19 Cost per Unit 999.99 "Cost" +// + $CALC_PRICE = 20; // N:U:20 "Set Price" but in fact CASE_COST/CASE_SIZE + $SET_PRICE = 21; // O:V:21 "Price" Jiggered price +// + $TAX_TYPE = 22; // R:W:22 Tax 0/1/2 "Taxes" + $MARKUP = 23; // S:X:23 Markup "150%" -> 1.42 "Markup" ++ $SKU = 24; // D:Y:24 Vendor SKU +// ++ $SALE_PRICE = 25; // Z:25 "Sale Price" ++ $SALE_COST = 26; // AA:26 "Sale Cost" ++ $TEMP_COST = 27; // AB:27 "Temp Cost" ? Case sale price. +// :Y-AC are superdepts ++ $CATEGORY_SD = 28; // W:AC:28 Category SuperDept. +// + $SCALE = 30; // Z:AE:30 BULK. "BULK" means scale=1 + $VENDOR_ID = 34; // AE:AI:34 Vendor ID. +// +// 30Apr13 Columns AJ/35 - BN/64 are for Qualification flags. +// "" means not-assigned, probably implies No. 0=No 1=Yes +// +- $SALE_PRICE = 38; // Q:AM:38 "Sale Price" +- $SALE_COST = 39; // P:AN:39 "Sale Cost" +- $TEMP_COST = 40; // I:AO:40 "Temp Cost" ? Case sale price. +//-- :End + // $ONTARIO = 19; // T YES/NO/"" (very few examples) + // $CANADA = 20; // U YES/NO/"" (very few examples) + + // 'b + $insQ = sprintf("INSERT INTO products (upc, description, normal_price, + pricemethod, groupprice, quantity, special_price, specialpricemethod, + specialgroupprice, specialquantity, start_date, end_date, department, + size, tax, foodstamp, scale, scaleprice, mixmatchcode, modified, advertised, + tareweight, discount, discounttype, unitofmeasure, wicable, qttyEnforced, + idEnforced, cost, inUse, numflag, subdept, deposit, local) + VALUES (%s, %s, %.2f, + %d, %.2f, %d, %.2f, %d, + %.2f, %d, %s, %s, %d, + %d, %d, %d, %d, %.2f, %s, %s, %d, + %.2f, %d, %d, %s, %d, %d, + %d, %.2f, %d, %d, %d, %.2f, %d)", + $dbc->escape($upc), $dbc->escape($description), $normal_price, + $pricemethod, $groupprice, $quantity, $special_price, $specialpricemethod, + $specialgroupprice, $specialquantity, $start_date, $end_date, $department, + $size, $tax, $fs, $scale, $scaleprice, $dbc->escape($mixmatchcode), $dbc->now(), $advertised, + $tareweight, $discount, $discounttype, $dbc->escape($unitofmeasure), $wicable, $qttyEnforced, + $idEnforced, $cost, $inUse, $numflag, $subdept, $deposit, $local); + + + $UPC = 0; // G:A:0 "Supplier UPC". UPC or PLU. + p.upc upc, + $SEARCH = 1; // B:B:1 search_description, for productUser.description + w.search_description search_desc, + $VENDOR_NAME = 2; // E:C:2 Distributor -> vendorID from AI VENDOR_ID. vendors.vendorId is stale, not being maintained. + v.vendorID distrib_id, + e.distributor distrib_name, + $SKU = 3; // A:D:3 SKU + v.sku sku, + $DEPT_NAME = 4; // F:E:4 Department + p.department dept_id, + d.dept_name dept_name, + $BRAND_NAME = 5; // C:F:5 Brand deptMargin.dept_ID + u.brand brand, + + $IN_USE = 6; // -:G:6 products:inUse + p.inUse inUse, + $QTYFRC = 7; // -:H:7 products:qttyEnforced + p.qttyEnforced qttyEnforced, + $MIXMATCH = 8; // -:I:8 products:mixmatchcode + p.mixmatchcode mixmatchCode, + $QUANTITY = 9; // -:J:9 products:quantity qcount + p.quantity groupCount, + $GROUP_PRICE = 10; // -:K:10 products:groupprice qprice + p.groupprice groupPrice, + $PRICE_METHOD = 11; // -:L:11 products:pricemethod qstrict + p.pricemethod priceMethod, + + $DESCRIPTION = 14; // D:O:[14] Item + w.description desc, + $CASE_COST = 15; // H:P:[15] "Case Cost" 9999.99 + e.case_cost caseCost, + $CASE_SIZE = 16; // J:Q:[16] "Case Size" 99 + v.units caseSize, + $UNIT_SIZE = 17; // K:R:[17] "Unit Size" 99 + p.size unitSize, + $UNIT_NAME = 18; // L:S:[18] "Units "g"/"ml"/"bags" + p.unitofmeasure unitOfMeasure, + $UNIT_COST = 19; // M:T:[19] Cost per Unit 999.99 "Cost" -> No point in calculating this. +// + $CALC_PRICE = 20; // N:U:20 "Set Price" but in fact CASE_COST/CASE_SIZE -> No point in calculating this. + $SET_PRICE = 21; // O:V:21 "Price" Jiggered price + p.normal_price setPrice, +// + $TAX_TYPE = 22; // R:W:22 Tax 0/1/2 "Taxes" + p.tax taxType, + $MARKUP = 23; // S:X:23 Markup "150%" -> 1.42 "Markup" + e.margin markup, +// + $SCALE = 30; // Z:AE:30 BULK. "BULK" means scale=1 + WHEN p.scale = 1 THEN 'BULK' ELSE 'COUNT' END scale, + */ + + $productFlags = ""; + $j=0; + for($i=0;$i<30;$i++) { + $j++; + $productFlags .= "\n,CASE WHEN ((1<<$i) & p.numflag) = 0 THEN 0 ELSE 1 END pFlag$j"; + } + /* 'a The select is in the order of the final excel format. + * Column aliases are extracted for column heads. + */ + $pQ = "SELECT + p.upc upc, + w.search_description searchDesc, + v.vendorID distribId, + e.distributor distribName, + w.order_code orderCode, + p.department deptId, + d.dept_name deptName, + u.brand brand, + p.inUse inUse, + p.qttyEnforced qttyEnforced, + p.mixmatchcode mixmatchCode, + p.quantity groupCount, + p.groupprice groupPrice, + p.pricemethod priceMethod, + p.discount discount, + p.discounttype discountType, + w.description description, + e.case_cost caseCost, + v.units caseSize, + p.size unitSize, + p.unitofmeasure unitOfMeasure, + p.normal_price setPrice, + p.tax taxType, + CASE WHEN e.margin > 1.00 THEN e.margin ELSE ((1/e.margin)/((1/e.margin)-1)) END markup, + CASE WHEN p.scale = 1 THEN 'BULK' ELSE 'COUNT' END scale, + v.sku SKU, + p.special_price salePrice, + p.specialpricemethod salePriceMethod, + p.specialgroupprice saleGroupPrice, + p.specialquantity saleQuantity, + p.start_date saleStartDate, + p.end_date saleEndDate$productFlags + FROM + core_op.products AS p + LEFT JOIN core_op.productUser AS u ON p.upc = u.upc + LEFT JOIN core_op.prodExtra AS e ON p.upc = e.upc + LEFT JOIN core_op.products_WEFC_Toronto AS w ON p.upc = w.upc + LEFT JOIN core_op.vendorItems AS v ON p.upc = v.upc + LEFT JOIN core_op.departments AS d ON p.department = d.dept_no + WHERE + p.upc < '9000000000000' + ORDER BY + p.upc"; + + // Create column head labels from field aliases + $hstr = preg_replace("/\t|\n/", "", $pQ); + $hstr = preg_replace("/(^SELECT)(.*)(FROM.*$)/", "$2", $hstr); + $hraw = explode(",", $hstr); + $headers = preg_replace("/^.*( [a-zA-Z0-9]*$)/", "$1", $hraw); + + //select_to_table($pQ,array(),1,'ffffff'); + select_to_table2($pQ,array(),1,'ffffff', '', '0', '2', $headers, False); + //select_to_table2($query,$arguments,$border,$bgcolor,$width="120",$spacing="0",$padding="0",$headers=array(),$nostart=False) + +} +// Form for specifying the report. +else { + +$page_title = "Fannie : WEFC Toronto Products Export Report"; +$header = "WEFC Toronto Products Export Report"; +include($FANNIE_ROOT.'src/header.html'); +?> + +
        + + + + + +
        Excel
        +
        + diff --git a/fannie/reports/Store-Specific/WFC/AccountAdjustments/index.php b/fannie/reports/Store-Specific/WFC/AccountAdjustments/index.php new file mode 100644 index 000000000..2e71c8872 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/AccountAdjustments/index.php @@ -0,0 +1,121 @@ + + +Account Adjstment + + +
        +Daily: +Monthly:
        +Date: +Format: m/d/y

        + Excel +
        +"; +} + +include($FANNIE_ROOT.'src/functions.php'); + +/* defaults */ +$type = "daily"; +$today = date("m/j/y"); +// Calculate the previous day's date, old method just gave zero - Andy +$date = date('m/j/y', mktime(0, 0, 0, date("m") , date("d") - 1, date("Y"))); + +if (isset($_GET['type'])){ + $type = $_GET['type']; + $date = $_GET['date']; + + if (!strstr($date,"/")){ + echo "Sorry, date format needs to be m/d/y for daily or m/y for monthly
        "; + echo "Slashes are essential"; + return; + } +} + +echo '
        '.strtoupper(substr($type,0,1)).substr($type,1,strlen($type)).' report run ' . $today. ' for ' . $date."
        "; +if (!isset($_GET['excel'])){ + echo "(This report in excel)
        "; +} +echo "
        "; + +$ddiff=""; +if ($type=="daily"){ + list($month,$day,$year) = explode("/",$date); + $date = str_pad($year,4,'20',STR_PAD_LEFT)."-". + str_pad($month,2,'0',STR_PAD_LEFT)."-". + str_pad($day,2,'0',STR_PAD_LEFT); + $ddiff = $dbc->date_equals('tdate',$date); +} +else { + list($month,$year) = explode("/",$date); + $date = str_pad($year,4,'20',STR_PAD_LEFT)."-". + str_pad($month,2,'0',STR_PAD_LEFT)."-01"; + $date2 = date("Y-m-t",mktime(0,0,0,$month,1,$year)); + $ddiff = " (tdate BETWEEN '$date 00:00:00' AND '$date2 23:59:59') "; +} + +$dlog = select_dlog($date); +$args = array($date.' 00:00:00',$date.' 23:59:59'); + +$otherQ = "SELECT d.department,t.dept_name, sum(total) as total + FROM $dlog as d join departments as t ON d.department = t.dept_no + WHERE tdate BETWEEN ? AND ? + AND (d.department >300)AND d.Department <> 0 AND d.register_no = 20 + GROUP BY d.department, t.dept_name order by d.department"; +$stockQ = "SELECT d.card_no,t.dept_name, sum(total) as total + FROM $dlog as d join departments as t ON d.department = t.dept_no + WHERE tdate BETWEEN ? AND ? + AND (d.department IN(991,992))AND d.Department <> 0 and d.register_no = 20 + GROUP BY d.card_no, t.dept_name ORDER BY d.card_no, t.dept_name"; +$arQ = "SELECT d.card_no,CASE WHEN d.department = 990 THEN 'AR PAYMENT' ELSE 'STORE CHARGE' END as description, + sum(total) as total, count(card_no) as transactions FROM $dlog as d + WHERE tdate BETWEEN ? AND ? + AND (d.department =990 OR d.trans_subtype = 'MI') and d.register_no = 20 + GROUP BY d.card_no,d.department order by department,card_no"; + +echo 'Other'; +echo '
        ------------------------------'; +echo ' + +
        DeptDescriptionAmount
        '; +select_to_table($otherQ,$args,0,'99cccc'); +echo '
        '; +echo 'Equity Payments by Member Number'; +echo '
        ------------------------------'; +echo ' + +
        MemNumDescriptionAmount
        '; +select_to_table($stockQ,$args,0,'99cccc'); +echo '
        '; +echo 'AR Activity by Member Number'; +echo '
        ------------------------------'; +echo ' + + +
        MemNumDescriptionAmountTransactions
        '; + +select_to_table($arQ,$args,0,'99cccc'); +echo '
        '; + +?> + + diff --git a/fannie/reports/Store-Specific/WFC/CCSettle/fetchLib.php b/fannie/reports/Store-Specific/WFC/CCSettle/fetchLib.php new file mode 100644 index 000000000..72139a04e --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/CCSettle/fetchLib.php @@ -0,0 +1,159 @@ +prepare_statement("SELECT q.refNum,r.httpCode,q.PAN,q.issuer FROM efsnetRequest as q + LEFT JOIN efsnetResponse as r ON q.date=r.date + and q.cashierNo=r.cashierNo and q.laneNo=r.laneNo + and q.transNo=r.transNo and q.transID=r.transID + WHERE q.datetime BETWEEN ? AND ?"); + $result = $dbc->exec_statement($query,array($dateStr.' 00:00:00',$dateStr.' 23:59:59')); + while($row = $dbc->fetch_row($result)){ + $trans_stack[$row['refNum']] = array( + "http"=>$row['httpCode'], + "card"=>$row['PAN'], + "ctype"=>$row['issuer'] + ); + } + + list($year,$month,$day) = explode("-",$dateStr); + $today = date('mdy',mktime(0,0,0,$month,$day,$year)); + $tomorrow = date("mdy",mktime(0,0,0,$month,$day+1,$year)); + $auths = queryAuth($today); + loadAuthInfo($auths,$trans_stack); + $settles = querySettle($tomorrow); + loadSettleInfo($settles,$trans_stack); + + return $trans_stack; +} + +function loadSettleInfo($fn,&$trans_stack){ + if (!file_exists($fn)) return; + + $parser = new xmlData(file_get_contents($fn)); + $num_records = $parser->get_first('records_found'); + for($i=1;$i<=$num_records;$i++){ + if (strtolower($parser->get_first("trans_type$i")) != 'settle') + continue; // skip non-auth records + $orderID = $parser->get_first("order_id$i"); + if (!isset($trans_stack[$orderID])) + continue; // order settled on unexpected date... + + $ts = $parser->get_first("trans_time$i"); + $trans_stack[$orderID]['settle_dt'] = $ts; + } +} + +function loadAuthInfo($fn,&$trans_stack){ + if (!file_exists($fn)) return; + + $parser = new xmlData(file_get_contents($fn)); + $num_records = $parser->get_first('records_found'); + for($i=1;$i<=$num_records;$i++){ + if (strtolower($parser->get_first("trans_type$i")) != 'auth' && + strtolower($parser->get_first("trans_type$i")) != 'credit') + continue; // skip weird records + + $orderID = $parser->get_first("order_id$i"); + if (!isset($trans_stack[$orderID])){ + // backend correction via GoE web portal + $trans_stack[$orderID] = array(); + $trans_stack[$orderID]['ctype'] = $parser->get_first("card_type$i"); + $trans_stack[$orderID]['card'] = 'N/A'; + } + + $amt = $parser->get_first("amount$i"); + $settledAmt = $parser->get_first("amount_settled$i"); + $reversal = $parser->get_first("credit_void$i"); + $status = $parser->get_first("trans_status$i"); + + $trans_stack[$orderID]['auth_amt'] = $amt; + $trans_stack[$orderID]['settle_amt'] = $settledAmt; + if (strtolower($parser->get_first("trans_type$i")) == 'credit'){ + $creditAmt = $parser->get_first("amount_credited$i"); + $trans_stack[$orderID]['settle_amt'] = -1*$creditAmt; + $trans_stack[$orderID]['auth_amt'] *= -1; + } + $trans_stack[$orderID]['reversal'] = $reversal; + $trans_stack[$orderID]['success'] = $status; + } +} + +function queryAuth($dateStr){ + return doDuery('SALE',$dateStr); +} + +function querySettle($dateStr){ + return doDuery('SETTLE',$dateStr); +} + +/* query all transactions for a given date and type + return cached results, if any, otherwise query + processor and cache results +*/ +function doDuery($type,$dateStr){ + global $GOEMERCH_ID,$GOEMERCH_GATEWAY_ID; + + $cache_fn = 'xmlcache/'.$type.'.'.$dateStr.'.xml'; + if (file_exists($cache_fn)) return $cache_fn; + + echo 'issuing query...'; + $xml = ""; + $xml .= ""; + $xml .= ""; + $xml .= "$GOEMERCH_ID"; + $xml .= "$GOEMERCH_GATEWAY_ID"; + $xml .= "query"; + $xml .= "$type"; + $xml .= "$dateStr"; + $xml .= "0001AM"; + $xml .= "$dateStr"; + $xml .= "1159PM"; + $xml .= ""; + $xml .= ""; + + $result = docurl($xml); + if (!empty($result['response'])){ + $fp = fopen($cache_fn,'w'); + fwrite($fp,$result['response']); + fclose($fp); + } + + return $cache_fn; +} + +function docurl($xml){ + $curl_handle = curl_init("https://secure.goemerchant.com/secure/gateway/xmlgateway.aspx"); + + curl_setopt($curl_handle, CURLOPT_HEADER, 0); + curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,15); + curl_setopt($curl_handle, CURLOPT_FAILONERROR,false); + curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,false); + curl_setopt($curl_handle, CURLOPT_TIMEOUT,60); + curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array("Content-type: text/xml")); + curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $xml); + + set_time_limit(300); + + $response = curl_exec($curl_handle); + + $result = array( + 'curlErr' => curl_errno($curl_handle), + 'curlErrText' => curl_error($curl_handle), + 'curlTime' => curl_getinfo($curl_handle, + CURLINFO_TOTAL_TIME), + 'curlHTTP' => curl_getinfo($curl_handle, + CURLINFO_HTTP_CODE), + 'response' => $response + ); + + return $result; +} + +?> diff --git a/fannie/reports/Store-Specific/WFC/CCSettle/index.php b/fannie/reports/Store-Specific/WFC/CCSettle/index.php new file mode 100644 index 000000000..130098162 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/CCSettle/index.php @@ -0,0 +1,111 @@ +prepare_statement("SELECT d.tdate,-d.total as total,d.trans_num,q.refNum,d.card_no + FROM $dlog AS d LEFT JOIN efsnetRequest as q + ON d.register_no=q.laneNo AND d.emp_no=q.cashierNo + AND d.trans_no = q.transNo and d.trans_id=q.transID + AND q.date=? + WHERE tdate BETWEEN ? AND ? + AND d.trans_subtype='CC' + ORDER BY d.tdate"); +$r = $dbc->exec_statement($q,array($y.$m.$d, $date.' 00:00:00', $date.'23:59:59')); + +if (!isset($_REQUEST['excel'])){ + echo ''; + echo ''; + echo ''; + echo '
        '; + echo 'Date: '; + echo ' '; + echo '

        '; + echo 'Download Report'; +} +else { + header('Content-Type: application/ms-excel'); + header('Content-Disposition: attachment; filename="ccReport '.$date.'.xls"'); +} +echo ''; +echo ' + + + '; +$totals = array( + "pos"=>0.0, + "manual"=>0.0, + "settled"=>0.0, + "Visa"=>0.0, + "MasterCard"=>0.0, + "American Express"=>0.0, + "Discover"=>0.0 +); +$colors = array("one","two"); +$c = 1; +while($w = $dbc->fetch_row($r)){ + printf('', + $colors[$c],$w['tdate'],$w['trans_num'],$w['total']); + $totals["pos"] += $w['total']; + if (empty($w['refNum'])){ + echo ''; + $totals['manual'] += $w['total']; + } + else if (!isset($info[$w['refNum']])){ + echo ''; + } + else { + $data = $info[$w['refNum']]; + printf('', + $data['settle_amt'], + (isset($data['settle_dt'])?$data['settle_dt']:'Unknown'), + ($data['success']==1?'Yes':'No'),$data['reversal'], + ltrim($data['card'],'*'),$data['ctype']); + $totals['settled'] += $data['settle_amt']; + $totals[$data['ctype']] += $data['settle_amt']; + unset($info[$w['refNum']]); + } + echo ''; + echo ''; + $c = ($c+1) % 2; +} +foreach($info as $data){ + if (!isset($data['auth_amt'])){ + // pos trans never reached the processor + continue; + } + printf('',$colors[$c]); + printf('', + $data['auth_amt'],$data['settle_amt'], + (isset($data['settle_dt'])?$data['settle_dt']:'None'), + ($data['success']==1?'Yes':'No'),$data['reversal'], + ltrim($data['card'],'*'),$data['ctype']); + echo ''; + $c = ($c+1) % 2; +} +printf(' + + + + + ', + $totals['pos'],$totals['manual'], + $totals['settled'],$totals['Visa'],$totals['MasterCard'], + $totals['Discover']); +echo '
        Auth TimeReceipt#Auth Amt.Settle Amt.Settle TimeApprovedV/CCardTypeMem#
        %s%s%.2fNot integrated transactionIntegrated but no info found%.2f%s%s%s%s%s'.$w['card_no'].'
        Non-POS%.2f%.2f%s%s%s%s%sN/A
        POS Total%.2f
        Non-Integrated Total%.2f
        Settle Total%.2f
        Visa Total%.2f
        MC Total%.2f
        Discover Total%.2f
        '; + +?> diff --git a/fannie/reports/Store-Specific/WFC/CCSettle/xmlData.php b/fannie/reports/Store-Specific/WFC/CCSettle/xmlData.php new file mode 100644 index 000000000..15a123004 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/CCSettle/xmlData.php @@ -0,0 +1,83 @@ +valid = False; + $this->parser = xml_parser_create(); + xml_set_object($this->parser,$this); + xml_set_element_handler($this->parser,"startTag","endTag"); + xml_set_character_data_handler($this->parser,"tagData"); + xml_parse($this->parser,$str,True); + xml_parser_free($this->parser); + } + + function startTag($parser,$name,$attr){ + $name = strtoupper($name); + if (isset($attr["KEY"])) + $name = strtoupper($attr["KEY"]); + $this->curTag = array("tag"=>$name,"attributes"=>$attr,"chardata"=>""); + } + + function endTag($parser,$name){ + $name = $this->curTag["tag"]; + if (!isset($this->DATA["$name"])) + $this->DATA["$name"] = array(); + array_push($this->DATA["$name"],$this->curTag); + $this->valid = True; + } + + function tagData($parser,$data){ + $this->curTag["chardata"] = $data; + } + + function get($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + if (count($this->DATA["$tagname"]) == 1){ + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + + } + else { + $ret = array(); + foreach ($this->DATA["$tagname"] as $d) + array_push($ret,$d["chardata"]); + return $ret; + } + } + + function isValid(){ return $this->valid; } + + function get_first($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + else { + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + } + } + + function array_dump(){ + $ret = array(); + foreach ($this->DATA as $field=>$value){ + if (isset($value[0]) && + isset($value[0]["chardata"])) + $ret[$field] = $value[0]["chardata"]; + } + return $ret; + } +} + +?> diff --git a/fannie/reports/Store-Specific/WFC/ClassSales/index.php b/fannie/reports/Store-Specific/WFC/ClassSales/index.php new file mode 100755 index 000000000..9b4624b2f --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/ClassSales/index.php @@ -0,0 +1,75 @@ +prepare_statement("SELECT d.datetime,d.upc,p.description, + u.name,u.real_name,d.quantity + FROM dtransactions AS d + LEFT JOIN productUser AS p ON d.upc=p.upc + LEFT JOIN Users AS u ON d.emp_no=u.uid + WHERE trans_type='I' AND datetime BETWEEN ? AND ? + AND d.upc=?"); + $r = $dbc->exec_statement($q,array($qStart,$qEnd,$_REQUEST['upc'])); + $rc = 0; + while($w = $dbc->fetch_row($r)){ + if ($rc==0){ + printf('Sales for %s (%s) this quarter (%s to %s)', + $w['description'],$w['upc'],$qStart,$qEnd); + echo ' + '; + } + printf('', + $w['name'],$w['real_name'],$w['quantity']); + $rc++; + } + echo '
        EmailNameQty Sold
        %s%s%d
        '; +} +else { + echo 'Classes sold this quarter ('.$qStart.' to '.$qEnd.')'; + + $q = $dbc->prepare_statement("SELECT d.upc,p.description,sum(d.quantity) FROM dtransactions AS d + LEFT JOIN productUser AS p ON d.upc=p.upc + WHERE trans_type='I' AND datetime BETWEEN ? AND ? + GROUP BY d.upc,p.description ORDER BY p.description"); + $r = $dbc->exec_statement($q,array($qStart,$qEnd)); + echo ' + '; + while($w = $dbc->fetch_row($r)){ + printf('', + $w[0],$w[0],$w[1],$w[2]); + } + echo '
        UPCClassQty Sold
        %s%s%d
        '; +} +?> diff --git a/fannie/reports/Store-Specific/WFC/Daily2/index.php b/fannie/reports/Store-Specific/WFC/Daily2/index.php new file mode 100755 index 000000000..d41bc848f --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/Daily2/index.php @@ -0,0 +1,411 @@ + + + + + + + +"; + echo ""; + + echo ""; + echo ""; +} + +$today = date("m/j/y"); +// Calculate the previous day's date, old method just gave zero - Andy +$repDate = date('m/j/y', mktime(0, 0, 0, date("m") , date("d") - 1, date("Y"))); + +$dstr = date("Y-m-d",strtotime("yesterday")); +if(isset($_GET['date'])){ + $repDate = $_GET['date']; + $t1 = strtotime($repDate); + if ($t1) $dstr = date("Y-m-d",$t1); +} + +if (!isset($_GET['excel'])) + echo "
        Click here for Excel version"; + +echo '
        Report run ' . $today. ' for ' . $repDate."
        "; + +$dlog = select_dlog($dstr); +$OP = $FANNIE_SERVER_DBMS=='MSSQL' ? $FANNIE_OP_DB.'.dbo.' : $FANNIE_OP_DB.'.'; +$TRANS = $FANNIE_SERVER_DBMS=='MSSQL' ? $FANNIE_TRANS_DB.'.dbo.' : $FANNIE_TRANS_DB.'.'; +$ARCH = $FANNIE_SERVER_DBMS=='MSSQL' ? $FANNIE_ARCHIVE_DB.'.dbo.' : $FANNIE_ARCHIVE_DB.'.'; + +$tenderQ = $dbc->prepare_statement("SELECT t.TenderName,-sum(d.total) as total, d.quantity +FROM {$ARCH}sumTendersByDay as d ,{$OP}tenders as t +WHERE d.tdate=? +AND d.tender_code = t.TenderCode +and d.total <> 0 +GROUP BY t.TenderName"); +$tenderR = $dbc->exec_statement($tenderQ,array($dstr)); +$tenders = array("Cash"=>array(10120,0.0,0), + "Check"=>array(10120,0.0,0), + "Credit Card"=>array(10120,0.0,0), + "EBT CASH."=>array(10120,0.0,0), + "EBT FS"=>array(10120,0.0,0), + "Gift Card"=>array(21205,0.0,0), + "GIFT CERT"=>array(21200,0.0,0), + "InStore Charges"=>array(10710,0.0,0), + "Pay Pal"=>array(10120,0.0,0), + "Coupons"=>array(10740,0.0,0), + "InStoreCoupon"=>array(67710,0.0,0), + "RRR Coupon"=>array(63380,0.0,0)); +$mad = array(0.0,0); +while ($row = $dbc->fetch_row($tenderR)){ + if(isset($tenders[$row[0]])){ + $tenders[$row[0]][1] = $row[1]; + $tenders[$row[0]][2] = $row[2]; + } + elseif ($row[0] == "MAD Coupon"){ + $mad[0] = $row[1]; + $mad[1] = $row[2]; + } +} + +echo "
        Tenders"; +echo tablify($tenders,array(1,0,2,3),array("Account","Type","Amount","Count"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),2); + + +$pCodeQ = $dbc->prepare_statement("SELECT s.salesCode,-1*sum(l.total) as total,min(l.dept_ID) +FROM {$ARCH}sumDeptSalesByDay as l +INNER JOIN {$OP}deptSalesCodes AS s ON l.dept_ID=s.dept_ID +WHERE l.tdate=? +AND l.dept_ID < 600 AND l.dept_ID <> 0 +GROUP BY s.salesCode +order by s.salesCode"); +$pCodeR = $dbc->exec_statement($pCodeQ,array($dstr)); +$pCodes = array("41201"=>array(0.0), + "41205"=>array(0.0), + "41300"=>array(0.0), + "41305"=>array(0.0), + "41310"=>array(0.0), + "41315"=>array(0.0), + "41400"=>array(0.0), + "41405"=>array(0.0), + "41407"=>array(0.0), + "41410"=>array(0.0), + "41415"=>array(0.0), + "41420"=>array(0.0), + "41425"=>array(0.0), + "41430"=>array(0.0), + "41435"=>array(0.0), + "41440"=>array(0.0), + "41445"=>array(0.0), + "41500"=>array(0.0), + "41505"=>array(0.0), + "41510"=>array(0.0), + "41515"=>array(0.0), + "41520"=>array(0.0), + "41525"=>array(0.0), + "41530"=>array(0.0), + "41600"=>array(0.0), + "41605"=>array(0.0), + "41610"=>array(0.0), + "41640"=>array(0.0), + "41645"=>array(0.0), + "41700"=>array(0.0), + "41705"=>array(0.0)); +while($row = $dbc->fetch_row($pCodeR)){ + if (isset($pCodes[$row[0]])) $pCodes[$row[0]][0] = $row[1]; + //else var_dump( $row[2] ); +} +echo "
        Sales"; +echo tablify($pCodes,array(0,1),array("pCode","Sales"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),1); + +$saleSumQ = $dbc->prepare_statement("SELECT -1*sum(l.total) as totalSales +FROM {$ARCH}sumDeptSalesByDay as l +WHERE l.tdate = ? +AND l.dept_ID < 600 AND l.dept_ID <> 0"); +$saleSumR = $dbc->exec_statement($saleSumQ,array($dstr)); +echo "
        Total Sales
        "; +echo sprintf("%.2f
        ",array_pop($dbc->fetch_row($saleSumR))); + +$returnsQ = $dbc->prepare_statement("SELECT s.salesCode,-1*sum(L.total)as returns +FROM $dlog as L,deptSalesCodes as s +WHERE s.dept_ID = L.department +AND L.tdate BETWEEN ? AND ? +AND(trans_status = 'R') +GROUP BY s.salesCode"); +$dates = array($dstr.' 00:00:00',$dstr.' 23:59:59'); +$returnsR = $dbc->exec_statement($returnsQ,$dates); +$returns = array(); +while($row = $dbc->fetch_row($returnsR)) + $returns["$row[0]"] = array($row[1]); +echo "
        Returns"; +echo tablify($returns,array(0,1),array("pCode","Sales"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),1); + +// idea here is to get everything to the right of the +// RIGHT MOST space, hence the reverse +$voidTransQ = $dbc->prepare_statement("SELECT RIGHT(description,". + $dbc->locate("' '","REVERSE(description)")."-1), + trans_num,-1*total from + {$TRANS}voidTransHistory where tdate BETWEEN ? AND ?"); +$voidTransR = $dbc->exec_statement($voidTransQ,$dates); +$voids = array(); +while($row = $dbc->fetch_row($voidTransR)) + $voids["$row[0]"] = array($row[1],$row[2]); +echo "
        Voids"; +echo tablify($voids,array(0,1,2),array("Original","Void","Total"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),2); + +$otherQ = $dbc->prepare_statement("SELECT d.dept_ID,t.dept_name, -1*sum(total) as total +FROM {$ARCH}sumDeptSalesByDay as d left join departments as t ON d.dept_ID = t.dept_no +WHERE d.tdate=? +AND d.dept_ID > 300 +and d.dept_ID <> 610 +and d.dept_ID not between 500 and 599 +GROUP BY d.dept_ID, t.dept_name order by d.dept_ID"); +$otherR = $dbc->exec_statement($otherQ,array($dstr)); +$others = array("600"=>array("64410","SUPPLIES",0.0), + "604"=>array(" ","MISC PO",0.0), + "700"=>array("63320","TOTES",0.0), + "703"=>array(" ","MISCRECEIPT",0.0), + "708"=>array("42225","CLASSES",0.0), + "800"=>array(" ","IT Corrections",0.0), + "881"=>array("42231","MISC #1",0.0), + "882"=>array("42232","MISC #2",0.0), + "900"=>array("21200","GIFTCERT",0.0), + "902"=>array("21205","GIFTCARD",0.0), + "990"=>array("10710","ARPAYMEN",0.0), + "991"=>array("31110","CLASS B Equity",0.0), + "992"=>array("31100","CLASS A Equity",0.0)); +while($row = $dbc->fetch_row($otherR)){ + $others["$row[0]"][1] = $row[1]; + $others["$row[0]"][2] = $row[2]; +} +echo "
        Other"; +echo tablify($others,array(1,0,2,3),array("Account","Dept","Description","Amount"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),3); + +$equityQ = $dbc->prepare_statement("SELECT d.card_no,t.dept_name, -1*sum(stockPurchase) as total +FROM {$TRANS}stockpurchases as d left join departments as t ON d.dept = t.dept_no +WHERE d.tdate BETWEEN ? AND ? +GROUP BY d.card_no, t.dept_name ORDER BY d.card_no, t.dept_name"); +$equityR = $dbc->exec_statement($equityQ,$dates); +$equityrows = array(); +while($row = $dbc->fetch_row($equityR)){ + $newrow = array("00-".str_pad($row[0],7,"0",STR_PAD_LEFT),$row[0],$row[1],$row[2]); + array_push($equityrows,$newrow); +} +echo "
        Equity Payments by Member Number"; +echo tablify($equityrows,array(1,2,3,4),array("Account","MemNum","Description","Amount"), + array(0,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY)); + +$arQ = $dbc->prepare_statement("SELECT d.card_no,'STORE CHARGE' as description, +SUM(d.Charges), +count(card_no) as transactions +FROM {$TRANS}ar_history as d +WHERE d.tdate BETWEEN ? AND ? +AND d.Charges <> 0 +GROUP BY d.card_no + +UNION ALL + +SELECT d.card_no,'AR PAYMENT' as description, +-1*SUM(d.Payments), +count(card_no) as transactions +FROM {$TRANS}ar_history as d +WHERE d.tdate BETWEEN ? AND ? +AND d.Payments <> 0 +GROUP BY d.card_no + +ORDER BY description DESC, card_no"); +$arR = $dbc->exec_statement($arQ,array($dates[0],$dates[1],$dates[0],$dates[1])); +$ar_rows = array(); +while($row = $dbc->fetch_row($arR)){ + $newrow = array("01-".str_pad($row[0],7,"0",STR_PAD_LEFT),$row[0],$row[1],$row[2],$row[3]); + array_push($ar_rows,$newrow); +} +echo "
        AR Activity by Member Number"; +echo tablify($ar_rows,array(1,2,3,4,5),array("Account","MemNum","Description","Amount","Transactions"), + array(0,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT)); + +$discQ = $dbc->prepare_statement("SELECT m.memDesc, -1*SUM(d.total) AS Discount,SUM(transCount) +FROM {$ARCH}sumDiscountsByDay AS d INNER JOIN + memTypeID m ON d.memType = m.memTypeID +WHERE d.tdate=? +GROUP BY m.memDesc"); +$discR = $dbc->exec_statement($discQ,array($dstr)); +$discounts = array("MAD Coupon"=>array(66600,$mad[0],$mad[1]), + "Staff Member"=>array(61170,0.0,0), + "Staff NonMem"=>array(61170,0.0,0), + "Member"=>array(66600,0.0,0)); +while($row = $dbc->fetch_row($discR)){ + $discounts[$row[0]][1] = $row[1]; + $discounts[$row[0]][2] = $row[2]; +} +echo "
        Discounts"; +echo tablify($discounts,array(1,0,2,3),array("Account","Type","Amount","Count"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),2); + +$deliTax = 0.0325; +$checkQ = $dbc->prepare_statement("select ".$dbc->datediff("?","'2008-07-01'")); +$checkR = $dbc->exec_statement($checkQ,array($repDate)); +$diff = array_pop($dbc->fetch_row($checkR)); +if ($diff < 0) $deliTax = 0.025; + + +$taxQ = $dbc->prepare_statement("SELECT (CASE WHEN d.tax = 1 THEN 'Non Deli Sales' ELSE 'Deli Sales' END) as type, sum(total) as taxable_sales, +.01*(sum(CASE WHEN d.tax = 1 THEN total ELSE 0 END)) as city_tax_nonDeli, +$deliTax*(sum(CASE WHEN d.tax = 2 THEN total ELSE 0 END)) as city_tax_Del, +.065*(sum(total)) as state_tax, +((.01*(sum(CASE WHEN d.tax = 1 THEN total ELSE 0 END))) + ($deliTax*(sum(CASE WHEN d.tax = 2 THEN total ELSE 0 END))) + (.065*(sum(total)))) as total_tax +FROM $dlog as d +WHERE d.tdate BETWEEN ? AND ? +AND d.tax <> 0 +GROUP BY d.tax ORDER BY d.tax DESC"); +$taxR = $dbc->exec_statement($taxQ,$dates); +$taxes = array(); +while($row = $dbc->fetch_row($taxR)) + $taxes["$row[0]"] = array(-1*$row[1],-1*$row[2],-1*$row[3],-1*$row[4],-1*$row[5]); +echo "
        Sales Tax"; +echo tablify($taxes,array(0,1,2,3,4,5),array(" ","Taxable Sales","City Tax","Deli Tax","State Tax","Total Tax"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY, + $ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY)); + +$taxSumQ = $dbc->prepare_statement("SELECT -1*sum(total) as tax_collected +FROM $dlog as d +WHERE d.tdate BETWEEN ? AND ? +AND (d.upc = 'tax') +GROUP BY d.upc"); +$taxSumR = $dbc->exec_statement($taxSumQ,$dates); +echo "
        Actual Tax Collected
        "; +echo sprintf("%.2f
        ",array_pop($dbc->fetch_row($taxSumR))); + +$transQ = $dbc->prepare_statement("SELECT d.total,d.quantity,d.transCount,m.memdesc + FROM {$ARCH}sumMemTypeSalesByDay as d LEFT JOIN + memTypeID as m ON m.memTypeID=d.memType + WHERE d.tdate=?"); +$transR = $dbc->exec_statement($transQ,array($dstr)); +$transinfo = array("Member"=>array(0,0.0,0.0,0.0,0.0), + "Non Member"=>array(0,0.0,0.0,0.0,0.0), + "Staff Member"=>array(0,0.0,0.0,0.0,0.0), + "Staff NonMem"=>array(0,0.0,0.0,0.0,0.0)); +while($row = $dbc->fetch_array($transR)){ + if (!isset($transinfo[$row[3]])) continue; + $transinfo[$row[3]] = array($row[2],$row[1], + round($row[1]/$row[2],2),$row[0], + round($row[0]/$row[2],2) + ); +} +$tSum = 0; +$tItems = 0; +$tDollars = 0; +foreach(array_keys($transinfo) as $k){ + $tSum += $transinfo[$k][0]; + $tItems += $transinfo[$k][1]; + $tDollars += $transinfo[$k][3]; +} +$transinfo["Totals"] = array($tSum,$tItems,round($tItems/$tSum,2),$tDollars,round($tDollars/$tSum,2)); +echo "
        Transaction information"; +echo tablify($transinfo,array(0,1,2,3,4,5), + array("Type","Transactions","Items","Average items/transaction","$","$/transaction"), + array($ALIGN_LEFT,$ALIGN_RIGHT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY, + $ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY)); + +function tablify($data,$col_order,$col_headers,$formatting,$sum_col=-1){ + $sum = 0; + $ret = ""; + + $ret .= ""; + $i = 0; + foreach ($col_headers as $c){ + while ($formatting[$i] == 0) $i++; + $ret .= cellify("".$c."",$formatting[$i++]&7); + } + $ret .= ""; + + foreach(array_keys($data) as $k){ + $ret .= ""; + foreach($col_order as $c){ + if($c == 0) $ret .= cellify($k,$formatting[$c]); + else $ret .= cellify($data[$k][$c-1],$formatting[$c]); + + if ($sum_col != -1 && $c == $sum_col) + $sum += $data[$k][$c-1]; + } + $ret .= ""; + } + if (count($data) == 0){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + + if ($sum_col != -1 && count($data) > 0){ + $ret .= ""; + foreach($col_order as $c){ + if ($c+1 == $sum_col) $ret .= ""; + elseif ($c == $sum_col) $ret .= cellify($sum,$formatting[$c]); + else $ret .= ""; + } + $ret .= ""; + } + + $ret .= "
        "; + $ret .= "No results to report"."
        Total 
        "; + + return $ret; +} + +function cellify($data,$formatting){ + $ALIGN_RIGHT = 1; + $ALIGN_LEFT = 2; + $ALIGN_CENTER = 4; + $TYPE_MONEY = 8; + $ret = ""; + if ($formatting & $ALIGN_LEFT) $ret .= ""; + elseif ($formatting & $ALIGN_RIGHT) $ret .= ""; + elseif ($formatting & $ALIGN_CENTER) $ret .= ""; + + if ($formatting & $TYPE_MONEY) $ret .= sprintf("%.2f",$data); + else $ret .= $data; + + $ret .= ""; + + return $ret; +} +?> + diff --git a/fannie/reports/Store-Specific/WFC/DailyReport/index.php b/fannie/reports/Store-Specific/WFC/DailyReport/index.php new file mode 100755 index 000000000..6289a5740 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/DailyReport/index.php @@ -0,0 +1,461 @@ + + + + + + + +"; + echo ""; + + echo ""; + echo ""; +} + +$today = date("m/j/y"); +// Calculate the previous day's date, old method just gave zero - Andy +$repDate = date('m/j/y', mktime(0, 0, 0, date("m") , date("d") - 1, date("Y"))); + +$dstr = date("Y-m-d",strtotime("yesterday")); +if(isset($_GET['date'])){ + $repDate = $_GET['date']; + $t1 = strtotime($repDate); + if ($t1) $dstr = date("Y-m-d",$t1); +} +$dates = array($dstr.' 00:00:00',$dstr.' 23:59:59'); + +if (!isset($_GET['excel'])) + echo "
        Click here for Excel version"; + +echo '
        Report run ' . $today. ' for ' . $repDate."
        "; + +$dlog = select_dlog($dstr); +$OP = $FANNIE_SERVER_DBMS=='MSSQL' ? $FANNIE_OP_DB.'.dbo.' : $FANNIE_OP_DB.'.'; +$TRANS = $FANNIE_SERVER_DBMS=='MSSQL' ? $FANNIE_TRANS_DB.'.dbo.' : $FANNIE_TRANS_DB.'.'; + +$tenderQ = $dbc->prepare_statement("SELECT +CASE WHEN d.trans_subtype IN ('CC','AX') then 'Credit Card' ELSE t.TenderName END as TenderName, +-sum(d.total) as total, COUNT(d.total) +FROM $dlog as d ,{$OP}tenders as t +WHERE d.tdate BETWEEN ? AND ? +AND d.trans_status <>'X' +AND d.Trans_Subtype = t.TenderCode +and d.total <> 0 +GROUP BY CASE WHEN d.trans_subtype IN ('CC','AX') then 'Credit Card' ELSE t.TenderName END"); +$tenderR = $dbc->exec_statement($tenderQ,$dates); +$tenders = array("Cash"=>array(10120,0.0,0), + "Check"=>array(10120,0.0,0), + "Credit Card"=>array(10120,0.0,0), + "EBT CASH."=>array(10120,0.0,0), + "EBT FS"=>array(10120,0.0,0), + "Gift Card"=>array(21205,0.0,0), + "GIFT CERT"=>array(21200,0.0,0), + "InStore Charges"=>array(10710,0.0,0), + "Pay Pal"=>array(10120,0.0,0), + "Coupons"=>array(10740,0.0,0), + "InStoreCoupon"=>array(67710,0.0,0), + "Store Credit"=>array(21200,0.0,0), + "RRR Coupon"=>array(63380,0.0,0)); +$mad = array(0.0,0); +while ($row = $dbc->fetch_row($tenderR)){ + if(isset($tenders[$row[0]])){ + $tenders[$row[0]][1] = $row[1]; + $tenders[$row[0]][2] = $row[2]; + } + elseif ($row[0] == "MAD Coupon"){ + $mad[0] = $row[1]; + $mad[1] = $row[2]; + } +} + +echo "
        Tenders"; +echo tablify($tenders,array(1,0,2,3),array("Account","Type","Amount","Count"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),2); + +$stamp = strtotime($dstr); +$creditQ = "SELECT 1 as num, + MAX(CASE WHEN q.mode IN ('retail_alone_credit','Credit_Return') THEN -amount ELSE amount END) as ttl, + CASE WHEN q.refNum LIKE '%-%' THEN 'FAPS' ELSE 'Mercury' END as proc + FROM is4c_trans.efsnetRequest AS q LEFT JOIN is4c_trans.efsnetResponse AS r ON q.refNum=r.refNum + WHERE q.date=? and r.httpCode=200 and + (r.xResultMessage LIKE '%approved%' OR r.xResultMessage LIKE '%PENDING%') + AND q.CashierNo <> 9999 AND q.laneNo <> 99 + GROUP BY q.refNum"; +$creditP = $dbc->prepare_statement($creditQ); +$creditR = $dbc->exec_statement($creditP, array( date('Ymd',$stamp) )); +$cTallies = array('FAPS'=>array(0.0,0),'Mercury'=>array(0.0,0), + 'Non-integrated'=>array(0.0,0)); +while($creditW = $dbc->fetch_row($creditR)){ + $cTallies[$creditW['proc']][0] += $creditW['ttl']; + $cTallies[$creditW['proc']][1]++; +} +$nonQ = "SELECT count(*) as num, sum(-total) as ttl, 'Non-integrated' as proc + FROM $dlog as d LEFT JOIN + (SELECT * FROM is4c_trans.efsnetResponse WHERE date=? + and httpCode=200 and + (xResultMessage LIKE '%approved%' OR xResultMessage LIKE '%PENDING%') + ) AS r ON d.register_no=r.laneNo and d.emp_no=r.cashierNo and d.trans_no=r.transNo + and d.trans_id=r.transID + WHERE d.trans_type='T' AND d.trans_subtype='CC' AND r.transID IS NULL + AND d.tdate BETWEEN ? AND ?"; +$nonP = $dbc->prepare_statement($nonQ); +$nonR = $dbc->exec_statement($nonP, array( date('Ymd',$stamp), $dates[0], $dates[1] )); +if ($dbc->num_rows($nonR) > 0){ + $non = $dbc->fetch_row($nonR); + $cTallies['Non-integrated'] = array($non['ttl'],$non['num']); +} +echo '
        Integrated CC Supplement'; +echo tablify($cTallies,array(0,1,2),array('Processor','Amount','Count'), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),1); + + +$pCodeQ = $dbc->prepare_statement("SELECT s.salesCode,-1*sum(l.total) as total,min(l.department) +FROM $dlog as l +INNER JOIN {$OP}deptSalesCodes AS s ON l.department=s.dept_ID +WHERE l.tdate BETWEEN ? AND ? +AND l.department < 600 AND l.department <> 0 +AND l.trans_type <>'T' +GROUP BY s.salesCode +order by s.salesCode"); +$pCodeR = $dbc->exec_statement($pCodeQ,$dates); +$pCodes = array("41201"=>array(0.0), + "41205"=>array(0.0), + "41300"=>array(0.0), + "41305"=>array(0.0), + "41310"=>array(0.0), + "41315"=>array(0.0), + "41400"=>array(0.0), + "41405"=>array(0.0), + "41407"=>array(0.0), + "41410"=>array(0.0), + "41415"=>array(0.0), + "41420"=>array(0.0), + "41425"=>array(0.0), + "41430"=>array(0.0), + "41435"=>array(0.0), + "41440"=>array(0.0), + "41445"=>array(0.0), + "41500"=>array(0.0), + "41505"=>array(0.0), + "41510"=>array(0.0), + "41515"=>array(0.0), + "41520"=>array(0.0), + "41525"=>array(0.0), + "41530"=>array(0.0), + "41600"=>array(0.0), + "41605"=>array(0.0), + "41610"=>array(0.0), + "41640"=>array(0.0), + "41645"=>array(0.0), + "41700"=>array(0.0), + "41705"=>array(0.0)); +while($row = $dbc->fetch_row($pCodeR)){ + if (isset($pCodes[$row[0]])) $pCodes[$row[0]][0] = $row[1]; + //else var_dump( $row[2] ); +} +echo "
        Sales"; +echo tablify($pCodes,array(0,1),array("pCode","Sales"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),1); + +$saleSumQ = $dbc->prepare_statement("SELECT -1*sum(l.total) as totalSales +FROM $dlog as l +WHERE l.tdate BETWEEN ? AND ? +AND l.department < 600 AND l.department <> 0 +AND l.trans_type <> 'T'"); +$saleSumR = $dbc->exec_statement($saleSumQ,$dates); +echo "
        Total Sales
        "; +echo sprintf("%.2f
        ",array_pop($dbc->fetch_row($saleSumR))); + +$returnsQ = $dbc->prepare_statement("SELECT s.salesCode,-1*sum(L.total)as returns +FROM $dlog as L,deptSalesCodes as s +WHERE s.dept_ID = L.department +AND L.tdate BETWEEN ? AND ? +AND(trans_status = 'R') +GROUP BY s.salesCode"); +$returnsR = $dbc->exec_statement($returnsQ,$dates); +$returns = array(); +while($row = $dbc->fetch_row($returnsR)) + $returns["$row[0]"] = array($row[1]); +echo "
        Returns"; +echo tablify($returns,array(0,1),array("pCode","Sales"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),1); + +// idea here is to get everything to the right of the +// RIGHT MOST space, hence the reverse +$voidTransQ = $dbc->prepare_statement("SELECT RIGHT(description,". + $dbc->locate("' '","REVERSE(description)")."-1), + trans_num,-1*total from + {$TRANS}voidTransHistory + WHERE tdate BETWEEN ? AND ?"); +$voidTransR = $dbc->exec_statement($voidTransQ,$dates); +$voids = array(); +while($row = $dbc->fetch_row($voidTransR)) + $voids["$row[0]"] = array($row[1],$row[2]); +echo "
        Voids"; +echo tablify($voids,array(0,1,2),array("Original","Void","Total"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),2); + +$otherQ = $dbc->prepare_statement("SELECT d.department,t.dept_name, -1*sum(total) as total +FROM $dlog as d left join departments as t ON d.department = t.dept_no +WHERE d.tdate BETWEEN ? AND ? +AND d.department > 300 AND +(d.register_no <> 20 or d.department = 703) +and d.department <> 610 +and d.department not between 500 and 599 +GROUP BY d.department, t.dept_name order by d.department"); +$otherR = $dbc->exec_statement($otherQ,$dates); +$others = array("600"=>array("64410","SUPPLIES",0.0), + "604"=>array(" ","MISC PO",0.0), + "700"=>array("63320","TOTES",0.0), + "703"=>array(" ","MISCRECEIPT",0.0), + "708"=>array("42225","CLASSES",0.0), + "800"=>array(" ","IT Corrections",0.0), + "881"=>array("42231","MISC #1",0.0), + "882"=>array("42232","MISC #2",0.0), + "900"=>array("21200","GIFTCERT",0.0), + "902"=>array("21205","GIFTCARD",0.0), + "990"=>array("10710","ARPAYMEN",0.0), + "991"=>array("31110","CLASS B Equity",0.0), + "992"=>array("31100","CLASS A Equity",0.0)); +while($row = $dbc->fetch_row($otherR)){ + $others["$row[0]"][1] = $row[1]; + $others["$row[0]"][2] = $row[2]; +} +echo "
        Other"; +echo tablify($others,array(1,0,2,3),array("Account","Dept","Description","Amount"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),3); + +$equityQ = $dbc->prepare_statement("SELECT d.card_no,t.dept_name, -1*sum(total) as total +FROM $dlog as d left join departments as t ON d.department = t.dept_no +WHERE d.tdate BETWEEN ? AND ? +AND d.department IN(991,992) AND d.register_no <> 20 +GROUP BY d.card_no, t.dept_name ORDER BY d.card_no, t.dept_name"); +$equityR = $dbc->exec_statement($equityQ,$dates); +$equityrows = array(); +while($row = $dbc->fetch_row($equityR)){ + $newrow = array("00-".str_pad($row[0],7,"0",STR_PAD_LEFT),$row[0],$row[1],$row[2]); + array_push($equityrows,$newrow); +} +echo "
        Equity Payments by Member Number"; +echo tablify($equityrows,array(1,2,3,4),array("Account","MemNum","Description","Amount"), + array(0,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY)); + +$arQ = $dbc->prepare_statement("SELECT d.card_no,CASE WHEN d.department = 990 THEN 'AR PAYMENT' ELSE 'STORE CHARGE' END as description, +-1*sum(total) as total, count(card_no) as transactions +FROM $dlog as d +WHERE d.tdate BETWEEN ? AND ? +AND (d.department =990 OR d.trans_subtype = 'MI') and +(d.register_no <> 20 or d.department <> 990) +GROUP BY d.card_no,d.department order by department,card_no"); +$arR = $dbc->exec_statement($arQ,$dates); +$ar_rows = array(); +while($row = $dbc->fetch_row($arR)){ + $newrow = array("01-".str_pad($row[0],7,"0",STR_PAD_LEFT),$row[0],$row[1],$row[2],$row[3]); + array_push($ar_rows,$newrow); +} +echo "
        AR Activity by Member Number"; +echo tablify($ar_rows,array(1,2,3,4,5),array("Account","MemNum","Description","Amount","Transactions"), + array(0,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT)); + +$discQ = $dbc->prepare_statement("SELECT m.memDesc, -1*SUM(d.total) AS Discount,count(*) +FROM $dlog d INNER JOIN + custdata c ON d.card_no = c.CardNo INNER JOIN + memTypeID m ON c.memType = m.memTypeID +WHERE d.tdate BETWEEN ? AND ? + AND (d.upc = 'DISCOUNT') AND c.personnum= 1 +and total <> 0 +GROUP BY m.memDesc, d.upc "); +$discR = $dbc->exec_statement($discQ,$dates); +$discounts = array("MAD Coupon"=>array(66600,$mad[0],$mad[1]), + "Staff Member"=>array(61170,0.0,0), + "Staff NonMem"=>array(61170,0.0,0), + "Member"=>array(66600,0.0,0)); +while($row = $dbc->fetch_row($discR)){ + $discounts[$row[0]][1] = $row[1]; + $discounts[$row[0]][2] = $row[2]; +} +echo "
        Discounts"; +echo tablify($discounts,array(1,0,2,3),array("Account","Type","Amount","Count"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),2); + +$deliTax = 0.0225; +$checkQ = $dbc->prepare_statement("select ".$dbc->datediff("?","'2008-07-01'")); +$checkR = $dbc->exec_statement($checkQ,array($repDate)); +$diff = array_pop($dbc->fetch_row($checkR)); +if ($diff < 0) $deliTax = 0.025; + +$checkQ = $dbc->prepare_statement("select ".$dbc->datediff("?","'2012-11-01'")); +$checkR = $dbc->exec_statement($checkQ,array($repDate)); +$diff = array_pop($dbc->fetch_row($checkR)); +$deliTax = 0.0325; +$deliTax = 0.02775; + +$taxQ = $dbc->prepare_statement("SELECT (CASE WHEN d.tax = 1 THEN 'Non Deli Sales' ELSE 'Deli Sales' END) as type, sum(total) as taxable_sales, +.01*(sum(CASE WHEN d.tax = 1 THEN total ELSE 0 END)) as city_tax_nonDeli, +$deliTax*(sum(CASE WHEN d.tax = 2 THEN total ELSE 0 END)) as city_tax_Del, +.0685*(sum(total)) as state_tax, +((.01*(sum(CASE WHEN d.tax = 1 THEN total ELSE 0 END))) + ($deliTax*(sum(CASE WHEN d.tax = 2 THEN total ELSE 0 END))) + (.0685*(sum(total)))) as total_tax +FROM $dlog as d +WHERE d.tdate BETWEEN ? AND ? +AND d.tax <> 0 +GROUP BY d.tax ORDER BY d.tax DESC"); +$taxR = $dbc->exec_statement($taxQ,$dates); +$taxes = array(); +while($row = $dbc->fetch_row($taxR)) + $taxes["$row[0]"] = array(-1*$row[1],-1*$row[2],-1*$row[3],-1*$row[4],-1*$row[5]); +echo "
        Sales Tax"; +echo tablify($taxes,array(0,1,2,3,4,5),array(" ","Taxable Sales","City Tax","Deli Tax","State Tax","Total Tax"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY, + $ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY)); + +$taxSumQ = $dbc->prepare_statement("SELECT -1*sum(total) as tax_collected +FROM $dlog as d +WHERE d.tdate BETWEEN ? AND ? +AND (d.upc = 'tax') +GROUP BY d.upc"); +$taxSumR = $dbc->exec_statement($taxSumQ,$dates); +echo "
        Actual Tax Collected
        "; +echo sprintf("%.2f
        ",array_pop($dbc->fetch_row($taxSumR))); + +$transQ = $dbc->prepare_statement("select q.trans_num,sum(q.quantity) as items,transaction_type, sum(q.total) from + ( + select trans_num,card_no,quantity,total, + m.memdesc as transaction_type + from $dlog as d + left join custdata as c on d.card_no = c.cardno + left join memTypeID as m on c.memtype = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND trans_type in ('I','D') + and upc <> 'RRR' + and c.personNum=1 + ) as q + group by q.trans_num,q.transaction_type"); +$transR = $dbc->exec_statement($transQ,$dates); +$transinfo = array("Member"=>array(0,0.0,0.0,0.0,0.0), + "Non Member"=>array(0,0.0,0.0,0.0,0.0), + "Staff Member"=>array(0,0.0,0.0,0.0,0.0), + "Staff NonMem"=>array(0,0.0,0.0,0.0,0.0)); +while($row = $dbc->fetch_array($transR)){ + if (!isset($transinfo[$row[2]])) continue; + $transinfo[$row[2]][0] += 1; + $transinfo[$row[2]][1] += $row[1]; + $transinfo[$row[2]][3] += $row[3]; +} +$tSum = 0; +$tItems = 0; +$tDollars = 0; +foreach(array_keys($transinfo) as $k){ + $transinfo[$k][2] = round($transinfo[$k][1]/$transinfo[$k][0],2); + $transinfo[$k][4] = round($transinfo[$k][3]/$transinfo[$k][0],2); + $tSum += $transinfo[$k][0]; + $tItems += $transinfo[$k][1]; + $tDollars += $transinfo[$k][3]; +} +$transinfo["Totals"] = array($tSum,$tItems,round($tItems/$tSum,2),$tDollars,round($tDollars/$tSum,2)); +echo "
        Transaction information"; +echo tablify($transinfo,array(0,1,2,3,4,5), + array("Type","Transactions","Items","Average items/transaction","$","$/transaction"), + array($ALIGN_LEFT,$ALIGN_RIGHT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY, + $ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY)); + +function tablify($data,$col_order,$col_headers,$formatting,$sum_col=-1){ + $sum = 0; + $ret = ""; + + $ret .= ""; + $i = 0; + foreach ($col_headers as $c){ + while ($formatting[$i] == 0) $i++; + $ret .= cellify("".$c."",$formatting[$i++]&7); + } + $ret .= ""; + + foreach(array_keys($data) as $k){ + $ret .= ""; + foreach($col_order as $c){ + if($c == 0) $ret .= cellify($k,$formatting[$c]); + else $ret .= cellify($data[$k][$c-1],$formatting[$c]); + + if ($sum_col != -1 && $c == $sum_col) + $sum += $data[$k][$c-1]; + } + $ret .= ""; + } + if (count($data) == 0){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + + if ($sum_col != -1 && count($data) > 0){ + $ret .= ""; + foreach($col_order as $c){ + if ($c+1 == $sum_col) $ret .= ""; + elseif ($c == $sum_col) $ret .= cellify($sum,$formatting[$c]); + else $ret .= ""; + } + $ret .= ""; + } + + $ret .= "
        "; + $ret .= "No results to report"."
        Total 
        "; + + return $ret; +} + +function cellify($data,$formatting){ + $ALIGN_RIGHT = 1; + $ALIGN_LEFT = 2; + $ALIGN_CENTER = 4; + $TYPE_MONEY = 8; + $ret = ""; + if ($formatting & $ALIGN_LEFT) $ret .= ""; + elseif ($formatting & $ALIGN_RIGHT) $ret .= ""; + elseif ($formatting & $ALIGN_CENTER) $ret .= ""; + + if ($formatting & $TYPE_MONEY) $ret .= sprintf("%.2f",$data); + else $ret .= $data; + + $ret .= ""; + + return $ret; +} +?> + diff --git a/fannie/reports/Store-Specific/WFC/EOM-Nabs/index.php b/fannie/reports/Store-Specific/WFC/EOM-Nabs/index.php new file mode 100644 index 000000000..0bc0c7d9b --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/EOM-Nabs/index.php @@ -0,0 +1,243 @@ + + + + + +"; +$monthMinus = 1; +if (isset($_GET["monthMinus"])) $monthMinus = $_GET["monthMinus"]; +$stamp = strtotime("-$monthMinus month"); +echo strtoupper(date("F",$stamp)); +echo " "; +echo date("Y",$stamp); +$dlog = "is4c_trans.dlog_90_view"; +$dlog = "trans_archive.dlogBig"; +echo " NABS

        "; +if (!isset($_GET["excel"])) + echo "Save to Excel"; +echo "

        "; + +$output = get_cache("monthly"); +if (!$output){ + ob_start(); + + $start = date("Y-m-01",$stamp); + $end = date("Y-m-t",$stamp); + $span = array("$start 00:00:00","$end 23:59:59"); + + $accounts = array(); + $accountQ = $dbc->prepare_statement("SELECT CardNo from custdata WHERE memType=4 ORDER BY CardNo"); + $accountR = $dbc->exec_statement($accountQ); + while($accountW = $dbc->fetch_row($accountR)) + $accounts[] = $accountW['CardNo']; + + $accountStr = "("; + $args=array(); + foreach($accounts as $a){ + $accountStr .= "?,"; + $args[] = $a; + } + $accountStr = rtrim($accountStr,",").")"; + + echo "Total by account"; + $totalQ = $dbc->prepare_statement("select l.card_no,sum(l.total), + (sum(l.total)-(sum(l.total*m.margin))) as cost + FROM $dlog as l left join deptMargin as m on l.department = m.dept_ID + WHERE card_no IN $accountStr + and (l.department < 600 or l.department = 902) + and l.department <> 0 and l.trans_type <> 'T' + and tdate BETWEEN ? AND ? + GROUP BY card_no + ORDER BY card_no"); + $args[] = $span[0]; + $args[] = $span[1]; + $totalR = $dbc->exec_statement($totalQ,$args); + $data = array(); + while ($totalW=$dbc->fetch_row($totalR)){ + if (!isset($data["$totalW[0]"])){ + $data["$totalW[0]"] = array($totalW[1],$totalW[2]); + } + else { + $data["$totalW[0]"][0] += $totalW[1]; + $data["$totalW[0]"][1] += $totalW[2]; + } + } + echo tablify($data,array(0,1,2),array("Account","Retail","Wholesale"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY), + 2,array(1,2)); + + echo "
        Total by pCode"; + $totalQ = $dbc->prepare_statement("select d.salesCode,sum(l.total), + (sum(l.total)-(sum(l.total)*m.margin)) as cost + FROM $dlog as l left join deptSalesCodes as d on l.department = d.dept_ID + left join deptMargin as m on l.department=m.dept_ID + WHERE card_no IN $accountStr + and (l.department < 600 or l.department = 902) + and l.department <> 0 and l.trans_type <> 'T' + and tdate BETWEEN ? AND ? + GROUP BY d.salesCode,m.margin + ORDER BY d.salesCode"); + $totalR = $dbc->exec_statement($totalQ,$args); + $data = array(); + while ($totalW=$dbc->fetch_row($totalR)){ + if (empty($data["$totalW[0]"])){ + $data["$totalW[0]"] = array($totalW[1],$totalW[2]); + } + else { + $data["$totalW[0]"][0] += $totalW[1]; + $data["$totalW[0]"][1] += $totalW[2]; + } + } + echo tablify($data,array(0,1,2),array("pCode","Retail","Wholesale"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY), + 2,array(1,2)); + + $totalQ = $dbc->prepare_statement("select d.salesCode,sum(l.total), + (sum(l.total)-(sum(l.total)*m.margin)) as cost + FROM $dlog as l left join deptSalesCodes as d on l.department = d.dept_ID + left join deptMargin as m on l.department=m.dept_ID + WHERE card_no = ? + and (l.department < 600 or l.department = 902) + and l.department <> 0 and l.trans_type <> 'T' + and tdate BETWEEN ? AND ? + GROUP BY d.salesCode,m.margin + ORDER BY d.salesCode"); + foreach ($accounts as $account){ + echo "
        Total for $account"; + $totalR = $dbc->exec_statement($totalQ,array($account,$span[0],$span[1])); + $data = array(); + while ($totalW=$dbc->fetch_row($totalR)){ + if (empty($data["$totalW[0]"])){ + $data["$totalW[0]"] = array($totalW[1],$account,$totalW[2]); + } + else { + $data["$totalW[0]"][0] += $totalW[1]; + $data["$totalW[0]"][2] += $totalW[2]; + } + } + echo tablify($data,array(0,1,2,3),array("pCode","Retail","Account","Wholesale"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_CENTER,$ALIGN_RIGHT|$TYPE_MONEY), + 2,array(1,3)); + } + + $output = ob_get_contents(); + put_cache("monthly",$output); + ob_end_clean(); +} + +echo $output; + +function tablify($data,$col_order,$col_headers,$formatting,$sums=-1,$sum_cols=array()){ + $sum = 0; + $ret = ""; + + $ret .= ""; + $i = 0; + foreach ($col_headers as $c){ + while ($formatting[$i] == 0) $i++; + $ret .= cellify("".$c."",$formatting[$i++]&7); + } + $ret .= ""; + + $ttls = array(); + if ($sums != -1){ + for ($i=0;$i"; + $ret .= "No results to report".""; + $ret .= ""; + } + + if (!empty($sum_cols) && count($data) > 0){ + $ret .= ""; + foreach($col_order as $c){ + $skip = false; + foreach ($sum_cols as $s){ + if ($s == $c){ + $ret .= cellify($ttls[$c],$formatting[$c]); + $skip = true; + } + } + if (!$skip) + $ret .= ""; + } + $ret .= ""; + } + + $ret .= "
         
        "; + + return $ret; +} + +function cellify($data,$formatting){ + $ALIGN_RIGHT = 1; + $ALIGN_LEFT = 2; + $ALIGN_CENTER = 4; + $TYPE_MONEY = 8; + $ret = ""; + if ($formatting & $ALIGN_LEFT) $ret .= ""; + elseif ($formatting & $ALIGN_RIGHT) $ret .= ""; + elseif ($formatting & $ALIGN_CENTER) $ret .= ""; + + if ($formatting & $TYPE_MONEY) $ret .= sprintf("%.2f",$data); + else $ret .= $data; + + $ret .= ""; + + return $ret; +} + +?> diff --git a/fannie/reports/Store-Specific/WFC/EOMreport/index.php b/fannie/reports/Store-Specific/WFC/EOMreport/index.php new file mode 100644 index 000000000..53f84f5fb --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/EOMreport/index.php @@ -0,0 +1,322 @@ + + "; +$uoutput .= '
        Report run ' . $today; +echo $uoutput; + +$year = date('Y'); +$month = date('n'); +$stamp = mktime(0,0,0,$month-1,1,$year); +$dlog = "is4c_trans.dlog_90_view"; +$start = date("Y-m-01",$stamp); +$end = date("Y-m-t",$stamp); +$span = "'$start 00:00:00' AND '$end 23:59:59'"; +$args = array($start.' 00:00:00',$end.' 23:59:59'); + +$output = get_cache("monthly"); +if (!$output){ + ob_start(); + + $date = substr($start,0,strpos($start,":")-3); + $date1 = substr($end,0,strpos($end,":")-3); + echo ' for period
        from: '. $date . ' to: ' . $date1 . '
        '; + + $query1="select t.department, + s.superID, + c.salesCode,d.dept_name, + SUM(t.total) + FROM $dlog as t LEFT JOIN + departments as d ON t.department = d.dept_no + LEFT JOIN MasterSuperDepts AS s + ON s.dept_ID = d.dept_no + LEFT JOIN deptSalesCodes AS c + ON c.dept_ID = d.dept_no + WHERE tdate BETWEEN ? AND ? + AND t.Department < 600 + AND t.department <> 0 + AND t.trans_type <> 'T' + GROUP BY + s.superID,t.department,d.dept_name,c.salesCode + order by s.superID,t.department"; + + $query15 = "SELECT s.superID,sum(l.total) as total + FROM $dlog as l left join departments as d on l.department = d.dept_no + LEFT JOIN MasterSuperDepts AS s ON d.dept_no=s.dept_ID + WHERE l.tdate BETWEEN ? AND ? + AND l.department < 600 AND l.department <> 0 + AND l.trans_type <> 'T' + GROUP BY s.superID + order by s.superID"; + + $query16 = "SELECT sum(l.total) as totalSales + FROM $dlog as l + WHERE l.tdate BETWEEN ? AND ? + AND l.department < 600 AND l.department <> 0 + AND l.trans_type <> 'T'"; + + $query2 = "SELECT t.TenderName,-sum(d.total) as total, COUNT(d.total) + FROM $dlog d ,tenders as t + WHERE d.tdate BETWEEN ? AND ? + AND d.trans_status <>'X' + AND d.Trans_Subtype = t.TenderCode + and t.TenderName <> 'MAD Coupon' + and d.total <> 0 + GROUP BY t.TenderName"; + + $query3 = "SELECT c.salesCode,s.superID,sum(l.total) as total + FROM $dlog as l left join MasterSuperDepts AS s ON + l.department = s.dept_ID LEFT JOIN deptSalesCodes AS c + ON l.department = c.dept_ID + WHERE l.tdate BETWEEN ? AND ? + AND l.department < 600 AND l.department <> 0 + AND l.trans_type <> 'T' + GROUP BY c.salesCode,s.superID + order by c.salesCode,s.superID"; + + $query4 = "SELECT sum(l.total) as totalSales + FROM $dlog as l + WHERE l.tdate BETWEEN ? AND ? + AND l.department < 600 AND l.department <> 0 + AND l.trans_type <> 'T'"; + + $query5 = "SELECT d.department,t.dept_name, sum(total) as total + FROM $dlog as d join departments as t ON d.department = t.dept_no + LEFT JOIN MasterSuperDepts AS m ON t.dept_no=m.dept_ID + WHERE d.tdate BETWEEN ? AND ? + AND (d.department >300)AND d.Department <> 0 + AND m.superID = 0 + AND d.trans_type IN('I','D') and + (d.register_no <> 20 or d.department = 703) + GROUP BY d.department, t.dept_name"; + + $query6 = "SELECT d.card_no,t.dept_name, sum(total) as total + FROM $dlog as d join departments as t ON d.department = t.dept_no + WHERE d.tdate BETWEEN ? AND ? + AND (d.department =991)AND d.Department <> 0 + GROUP BY d.card_no, t.dept_name"; + + $query7 = "SELECT d.card_no,t.dept_name, sum(total) as total + FROM $dlog as d join departments as t ON d.department = t.dept_no + WHERE d.tdate BETWEEN ? AND ? + AND (d.department =990)AND d.Department <> 0 and d.register_no <> 20 + GROUP BY d.card_no, t.dept_name"; + + $query13 = "SELECT m.memDesc,SUM(d.total) AS Sales + FROM $dlog d INNER JOIN + custdata c ON d.card_no = c.CardNo INNER JOIN + memTypeID m ON c.memType = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND (d.department < 600) AND d.department <> 0 AND (c.personnum= 1 or c.personnum is null) + AND d.trans_type <> 'T' + GROUP BY m.memDesc + ORDER BY m.memDesc"; + + $query21 = "SELECT m.memdesc, COUNT(d.card_no) + FROM is4c_trans.transarchive AS d left join memTypeID m on d.memType = m.memTypeID + WHERE datetime BETWEEN ? AND ? AND (d.memType <> 4) + AND register_no<>99 and emp_no<>9999 AND trans_status NOT IN ('X','Z') + AND trans_id=1 AND upc <> 'RRR' + GROUP BY m.memdesc"; + + $query20 = "SELECT SUM(d.total) AS Sales + FROM $dlog d LEFT JOIN + custdata c ON d.card_no = c.CardNo LEFT JOIN + memTypeID m ON c.memType = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND (d.department < 600) AND d.department <> 0 + AND d.trans_type <> 'T' + AND (c.personnum= 1 or c.personnum is null)"; + + $query12 = "SELECT d.salesCode,sum(L.total)as returns + FROM $dlog as L,deptSalesCodes as d + WHERE d.dept_ID = L.department + AND L.tdate BETWEEN ? AND ? + AND(trans_status = 'R' OR upc LIKE '%dp606') + GROUP BY d.salesCode"; + + $query14 = "SELECT 'Total Sales', sum(l.total) as totalSales + FROM $dlog as l + WHERE l.tdate BETWEEN ? AND ? + AND l.department < 600 AND l.department <> 0 + AND l.trans_status = 'R'"; + + $query8 = "SELECT m.memDesc, SUM(d.total) AS Discount + FROM $dlog d INNER JOIN + custdata c ON d.card_no = c.CardNo INNER JOIN + memTypeID m ON c.memType = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND (d.upc = 'DISCOUNT') AND c.personnum= 1 + GROUP BY c.memType, m.memDesc, d.upc + ORDER BY c.memType"; + + $query9 = "SELECT d.upc, SUM(d.total) AS discount + FROM $dlog d INNER JOIN + custdata c ON d.card_no = c.CardNo INNER JOIN + memTypeID m ON c.memType = m.memTypeID + WHERE d.tdate BETWEEN ? AND ? + AND (d.upc = 'DISCOUNT') AND c.personnum = 1 + GROUP BY d.upc"; + + $queryMAD = "select 'MAD Coupon',sum(d.total),count(*) as discount + from $dlog as d + where tdate BETWEEN ? AND ? + and trans_status <> 'X' + and trans_subtype = 'MA'"; + + $query11 = "SELECT sum(total) as tax_collected + FROM $dlog as d + WHERE d.tdate BETWEEN ? AND ? + AND (d.upc = 'tax') + GROUP BY d.upc"; + + $query23="SELECT d.salesCode,sum(l.total) as total,card_no, + (sum(l.total)-(sum(l.total) * m.margin)) as cost + FROM $dlog as l left join deptSalesCodes as d on l.department = d.dept_ID + LEFT JOIN deptMargin AS m ON m.dept_ID = l.department + WHERE l.tdate BETWEEN ? AND ? + AND (l.department < 600 or l.department = 902) AND l.department <> 0 + AND l.trans_type <> 'T' + AND card_no BETWEEN 5500 AND 5950 + GROUP BY d.salesCode,card_no,m.margin + order by card_no,d.salesCode"; + + $query22="SELECT d.salesCode,sum(l.total) as total, + (sum(l.total)-(sum(l.total)* m.margin)) as cost + FROM $dlog as l left join deptSalesCodes as d on l.department = d.dept_ID + LEFT JOIN deptMargin AS m ON m.dept_ID = l.department + WHERE l.tdate BETWEEN ? AND ? + AND (l.department < 600 or l.department = 902) AND l.department <> 0 + AND l.trans_type <> 'T' + AND card_no BETWEEN 5500 AND 5950 + GROUP BY d.salesCode,m.margin + order by d.salesCode"; + + $queryRRR = " + SELECT sum(case when volSpecial is null then 0 + when volSpecial > 100 then 1 + else volSpecial end) as qty + from + is4c_trans.transarchive as t + where upc = 'RRR' + and t.datetime BETWEEN ? AND ? + and emp_no <> 9999 and register_no <> 99 + and trans_status <> 'X'"; + + + echo ''; + echo '
        '; + echo 'Sales by department'; + echo '
        ---------------------------'; + echo ' + + + + +
        Dept NoDepartmentpCodeGroupSales
        '; + select_to_table($query1,$args,0,'ffffff'); + echo 'Total Sales by Group'; + select_to_table($query15,$args,0,'ffffff'); + + echo ''; + echo '
        '; + echo 'Tenders'; + echo '
        ------------------------------'; + echo ' + +
        TypeAmountCount
        '; + select_to_table($query2,$args,0,'ffffff'); + echo '
        '; + echo 'Sales'; + echo '
        ------------------------------'; + echo ' +
        pCodeSales
        '; + select_to_table($query3,$args,0,'ffffff'); + echo 'Total Sales'; + + select_to_table($query4,$args,0,'ffffff'); + + echo '
        '; + echo 'Other income'; + echo '
        ------------------------------'; + echo ' + +
        DeptDescriptionAmount
        '; + select_to_table($query5,$args,0,'ffffff'); + echo 'Discounts'; + echo '
        ------------------------------'; + echo ' +
        Mem TypeDiscounts
        '; + select_to_table($query8,$args,0,'ffffff'); + select_to_table($query9,$args,0,'ffffff'); + select_to_table($queryMAD,$args,0,'ffffff'); + echo '
        '; + echo 'Member Sales'; + echo '
        ------------------------------'; + echo ' +
        Mem TypeSales
        '; + select_to_table($query13,$args,0,'ffffff'); + select_to_table($query20,$args,0,'ffffff'); + echo '
        '; + echo 'Nabs'; + echo '
        ------------------------------'; + echo ' + +
        pCodeRetailDept NumberWholeSale
        '; + select_to_table($query23,$args,0,'ffffff'); + select_to_table($query22,$args,0,'ffffff'); + echo '
        '; + echo 'Transactions'; + echo '
        ------------------------------'; + echo ' +
        Mem TypeTransactions
        '; + select_to_table($query21,$args,0,'ffffff'); + echo '
        '; + echo '
        '; + echo 'Sales Tax'; + echo '
        ------------------------------'; + echo ' + + + + + + +
        Taxable SalesTotal TaxState TaxableState TaxCity TaxableCity TaxDeli TaxableDeli Tax
        '; + $queryCorrect = "select TaxableSales,TotalTax,StateTaxable,StateTax,CityTaxable,CityTax,DeliTaxable,DeliTax + from is4c_trans.taxReport_corrected"; + select_to_table($queryCorrect,array(),0,'ffffff'); + echo '
        '; + echo 'Actual Tax Collected'; + select_to_table($query11,$args,0,'ffffff'); + + echo '
        '; + echo 'RRR Coupons Redeemed'; + select_to_table($queryRRR,$args,0,'ffffff'); + + echo '
        '; + echo "
        + + "; + + $output = ob_get_contents(); + put_cache("monthly",$output); + ob_end_clean(); +} + +echo $output; +?> diff --git a/fannie/reports/Store-Specific/WFC/ExternalEmail/index.php b/fannie/reports/Store-Specific/WFC/ExternalEmail/index.php new file mode 100644 index 000000000..479b83dc1 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/ExternalEmail/index.php @@ -0,0 +1,25 @@ +prepare_statement("SELECT email FROM userData WHERE email LIKE '%@%.%'"); +$r = $dbc->exec_statement($q); + +echo '
        '; +echo ''; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/reports/Store-Specific/WFC/LocalSales/index.php b/fannie/reports/Store-Specific/WFC/LocalSales/index.php new file mode 100755 index 000000000..93bf2b599 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/LocalSales/index.php @@ -0,0 +1,170 @@ +Save to Excel", + $d1,$d2); + } + + $sales = $dbc->prepare_statement("SELECT t.department,d.dept_name,s.superID,n.super_name, + sum(case when numflag = 2 then total else 0 end) as localSales, + sum(case when numflag = 1 then total else 0 end) as scSales, + sum(total) as allSales + FROM $dlog as t inner join departments as d + ON t.department=d.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=t.department + LEFT JOIN superDeptNames AS n ON s.superID=n.superID + WHERE + tdate BETWEEN ? AND ? + and trans_type = 'I' + and s.superID > 0 + AND upc Not IN ('RRR','DISCOUNT') + group by t.department,d.dept_name,s.superID,n.super_name + order by s.superID,t.department"); + $result = $dbc->exec_statement($sales,array($d1.' 00:00:00',$d2.' 23:59:59')); + $sID = -1; + $sname = ""; + $sttl = 0; + $slocal = 0; + $sc = 0; + $master_totals = array(0,0,0); + echo ''; + while($row = $dbc->fetch_row($result)){ + if ($sID != $row['superID']){ + if ($sID != -1){ + printf(' + + + ', + $sname,$slocal,100*($slocal/$sttl), + $sc,100*($sc/$sttl),$sttl); + } + printf(' + ', + (isset($_REQUEST['excel'])?'':' ')); + $sID = $row['superID']; + $sname = $row['super_name']; + $sttl = 0; + $slocal = 0; + $sc = 0; + } + if ($row['allSales'] == 0) $row['allSales']=1; // no div by zero + printf(' + + ', + $row['department'],$row['dept_name'], + $row['localSales'], + 100*($row['localSales']/$row['allSales']), + $row['scSales'], + 100*($row['scSales']/$row['allSales']), + $row['allSales'] + ); + $slocal += $row['localSales']; + $sc += $row['scSales']; + $sttl += $row['allSales']; + $master_totals[0] += $row['localSales']; + $master_totals[1] += $row['scSales']; + $master_totals[2] += $row['allSales']; + } + printf(' + + + ', + $sname,$slocal,100*($slocal/$sttl), + $sc,100*($sc/$sttl),$sttl); + + printf(' + + + + ', + $master_totals[0],100*($master_totals[0]/$master_totals[2]), + $master_totals[1],100*($master_totals[1]/$master_totals[2]), + $master_totals[2]); + + echo '
        Ttl%s$%.2f%.2f%%$%.2f%.2f%%$%.2f
        %s300mi%%SC%%Dept TTL
        %d%s$%.2f%.2f%%$%.2f%.2f%%$%.2f
        Ttl%s$%.2f%.2f%%$%.2f%.2f%%$%.2f
         
        TtlStore$%.2f%.2f%%$%.2f%.2f%%$%.2f
        '; + + if (isset($_REQUEST['excel'])){ + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $output = ob_get_contents(); + ob_end_clean(); + $array = HtmlToArray($output); + $xls = ArrayToXls($array); + echo $xls; + } + +} +else { + +$page_title = "Fannie : Local Sales Report"; +$header = "Local Sales Report"; +include($FANNIE_ROOT.'src/header.html'); +$lastMonday = ""; +$lastSunday = ""; + +$ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); +while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); +} +?> + +

        + + + + + + + + + + + +
        Start Date
        End Date
        Excel
        + + diff --git a/fannie/reports/Store-Specific/WFC/PayrollAR/PayrollARReport.php b/fannie/reports/Store-Specific/WFC/PayrollAR/PayrollARReport.php new file mode 100644 index 000000000..c75985fe5 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/PayrollAR/PayrollARReport.php @@ -0,0 +1,98 @@ +header = "Payroll AR Report"; + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('Owner#','First','Last','Limit','Deducted', + 'Household #1','Household #1','Household #2','Household #2', + 'Household #3','Household #3'); + + /** + Check if a non-html format has been requested + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_TRANS_DB; + + $query = $dbc->prepare_statement("SELECT c.CardNo,c.FirstName,c.LastName,c.memDiscountLimit, + CASE WHEN s.cardNo IS NULL THEN 'no' ELSE 'yes' END as autodeduct, + x.FirstName,x.LastName, + y.FirstName,y.LastName, + z.FirstName,z.LastName + FROM custdata AS c LEFT JOIN ". + $FANNIE_TRANS_DB.$dbc->sep()."staffAR as s ON c.CardNo=s.cardNo + LEFT JOIN custdata AS x ON c.CardNo=x.CardNo AND x.personNum=2 + LEFT JOIN custdata AS y ON c.CardNo=y.CardNo AND y.personNum=3 + LEFT JOIN custdata AS z ON c.CardNo=z.CardNo AND z.personNum=4 + WHERE c.personNum=1 AND c.memType in (3,9) + AND c.LastName <> 'NEW STAFF' + order by c.CardNo"); + + /** + Simple report + + Issue a query, build array of results + */ + $result = $dbc->exec_statement($query); + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + for($i=0;$i<$dbc->num_fields($result);$i++) + $record[] = $row[$i]; + $ret[] = $record; + } + return $ret; + } + + /** + Sum the quantity and total columns + */ + function calculate_footers($data){ + } + + function form_content(){ + } +} + +$obj = new PayrollARReport(); +$obj->draw_page(); +?> diff --git a/fannie/reports/Store-Specific/WFC/RangeReport/index.php b/fannie/reports/Store-Specific/WFC/RangeReport/index.php new file mode 100755 index 000000000..de6d37097 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/RangeReport/index.php @@ -0,0 +1,327 @@ + + + + + + + +"; + echo "Start Date"; + echo "End Date"; + echo ""; + echo ""; +} + +$today = date("m/j/y"); +// Calculate the previous day's date, old method just gave zero - Andy +$repDate = date('m/j/y', mktime(0, 0, 0, date("m") , date("d") - 1, date("Y"))); +$repDate2 = $repDate; + +$d1 = date("Y-m-d",strtotime('yesterday')); +$ddiff = "'$d1 00:00:00' AND '$d1 23:59:59'"; +if(isset($_REQUEST['date']) && isset($_REQUEST['date2'])){ + $repDate = $_REQUEST['date']; + $repDate2 = $_REQUEST['date2']; + + $t1 = strtotime($repDate); + $t2 = strtotime($repDate2); + $d1 = date('Y-m-d',($t1 ? $t1 : strtotime('yesterday'))); + $d2 = date('Y-m-d',($t2 ? $t2 : strtotime('yesterday'))); + + $ddiff = "'$d1 00:00:00' AND '$d2 23:59:59'"; +} +$dates = array($d1.' 00:00:00',$d2.' 23:59:59'); + +if (!isset($_GET['excel'])) + echo "
        Click here for Excel version"; + +echo '
        Report run ' . $today. ' for ' . $repDate." to ".$repDate2."
        "; + +$dlog = select_dlog($repDate,$repDate2); +//var_dump($dlog); +$dlog = "trans_archive.dlogBig"; +$ARCH = $FANNIE_SERVER_DBMS=='MSSQL' ? $FANNIE_ARCHIVE_DB.'.dbo.' : $FANNIE_ARCHIVE_DB.'.'; + +$tenderQ = $dbc->prepare_statement("SELECT t.TenderName,-sum(d.total) as total, SUM(d.quantity) +FROM {$ARCH}sumTendersByDay as d ,tenders as t +WHERE d.tdate BETWEEN ? AND ? +AND d.tender_code = t.TenderCode +and d.total <> 0 +GROUP BY t.TenderName"); +$tenderR = $dbc->exec_statement($tenderQ,$dates); +$tenders = array("Cash"=>array(10120,0.0,0), + "Check"=>array(10120,0.0,0), + "Credit Card"=>array(10120,0.0,0), + "EBT CASH."=>array(10120,0.0,0), + "EBT FS"=>array(10120,0.0,0), + "Gift Card"=>array(21205,0.0,0), + "GIFT CERT"=>array(21200,0.0,0), + "InStore Charges"=>array(10710,0.0,0), + "Pay Pal"=>array(10120,0.0,0), + "Coupons"=>array(10740,0.0,0), + "InStoreCoupon"=>array(67710,0.0,0), + "RRR Coupon"=>array(63380,0.0,0)); +$mad = array(0.0,0); +while ($row = $dbc->fetch_row($tenderR)){ + if(isset($tenders[$row[0]])){ + $tenders[$row[0]][1] = $row[1]; + $tenders[$row[0]][2] = $row[2]; + } + elseif ($row[0] == "MAD Coupon"){ + $mad[0] = $row[1]; + $mad[1] = $row[2]; + } +} + +echo "
        Tenders"; +echo tablify($tenders,array(1,0,2,3),array("Account","Type","Amount","Count"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),2); + + +$pCodeQ = $dbc->prepare_statement("SELECT s.salesCode,-1*sum(l.total) as total,min(l.dept_ID) +FROM {$ARCH}sumDeptSalesByDay as l join departments as d on l.dept_ID = d.dept_no +LEFT JOIN deptSalesCodes AS s ON d.dept_no=s.dept_ID +WHERE tdate BETWEEN ? AND ? +AND l.dept_ID < 600 AND l.dept_ID <> 0 +GROUP BY s.salesCode +order by s.salesCode"); +$pCodeR = $dbc->exec_statement($pCodeQ,$dates); +$pCodes = array("41201"=>array(0.0), + "41205"=>array(0.0), + "41300"=>array(0.0), + "41305"=>array(0.0), + "41310"=>array(0.0), + "41315"=>array(0.0), + "41400"=>array(0.0), + "41405"=>array(0.0), + "41407"=>array(0.0), + "41410"=>array(0.0), + "41415"=>array(0.0), + "41420"=>array(0.0), + "41425"=>array(0.0), + "41430"=>array(0.0), + "41435"=>array(0.0), + "41440"=>array(0.0), + "41445"=>array(0.0), + "41500"=>array(0.0), + "41505"=>array(0.0), + "41510"=>array(0.0), + "41515"=>array(0.0), + "41520"=>array(0.0), + "41525"=>array(0.0), + "41530"=>array(0.0), + "41600"=>array(0.0), + "41605"=>array(0.0), + "41610"=>array(0.0), + "41640"=>array(0.0), + "41645"=>array(0.0), + "41700"=>array(0.0), + "41705"=>array(0.0)); +while($row = $dbc->fetch_row($pCodeR)){ + if (isset($pCodes[$row[0]])) $pCodes[$row[0]][0] = $row[1]; + //else var_dump( $row[2] ); +} +echo "
        Sales"; +echo tablify($pCodes,array(0,1),array("pCode","Sales"), + array($ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),1); + +$saleSumQ = $dbc->prepare_statement("SELECT -1*sum(l.total) as totalSales +FROM {$ARCH}sumDeptSalesByDay as l +WHERE tdate BETWEEN ? AND ? +AND l.dept_ID < 600 AND l.dept_ID <> 0"); +$saleSumR = $dbc->exec_statement($saleSumQ,$dates); +echo "
        Total Sales
        "; +echo sprintf("%.2f
        ",array_pop($dbc->fetch_row($saleSumR))); + +$otherQ = $dbc->prepare_statement("SELECT d.dept_ID,t.dept_name, -1*sum(total) as total +FROM {$ARCH}sumDeptSalesByDay as d join departments as t ON d.dept_ID = t.dept_no +WHERE tdate BETWEEN ? AND ? +AND (d.dept_ID >300)AND d.dept_ID <> 0 +and d.dept_ID <> 610 +and d.dept_ID not between 500 and 599 +GROUP BY d.dept_ID, t.dept_name order by d.dept_ID"); +$otherR = $dbc->exec_statement($otherQ,$dates); +$others = array("600"=>array("64410","SUPPLIES",0.0), + "604"=>array(" ","MISC PO",0.0), + "700"=>array("63320","TOTES",0.0), + "703"=>array(" ","MISCRECEIPT",0.0), + "708"=>array("42225","CLASSES",0.0), + "800"=>array(" ","IT Corrections",0.0), + "881"=>array("42231","MISC #1",0.0), + "882"=>array("42232","MISC #2",0.0), + "900"=>array("21200","GIFTCERT",0.0), + "902"=>array("21205","GIFTCARD",0.0), + "990"=>array("10710","ARPAYMEN",0.0), + "991"=>array("31110","CLASS B Equity",0.0), + "992"=>array("31100","CLASS A Equity",0.0)); +while($row = $dbc->fetch_row($otherR)){ + $others["$row[0]"][1] = $row[1]; + $others["$row[0]"][2] = $row[2]; +} +echo "
        Other"; +echo tablify($others,array(1,0,2,3),array("Account","Dept","Description","Amount"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY),3); + +$discQ = $dbc->prepare_statement("SELECT m.memDesc, -1*SUM(d.total) AS Discount,count(*) +FROM $dlog d INNER JOIN + custdata c ON d.card_no = c.CardNo INNER JOIN + memTypeID m ON c.memType = m.memTypeID +WHERE (d.tdate BETWEEN ? AND ? ) + AND (d.upc = 'DISCOUNT') AND c.personnum= 1 +and total <> 0 +GROUP BY m.memDesc, d.upc "); +$discR = $dbc->exec_statement($discQ,$dates); +$discounts = array("MAD Coupon"=>array(66600,$mad[0],$mad[1]), + "Staff Member"=>array(61170,0.0,0), + "Staff NonMem"=>array(61170,0.0,0), + "Member"=>array(66600,0.0,0)); +while($row = $dbc->fetch_row($discR)){ + $discounts[$row[0]][1] = $row[1]; + $discounts[$row[0]][2] = $row[2]; +} +echo "
        Discounts"; +echo tablify($discounts,array(1,0,2,3),array("Account","Type","Amount","Count"), + array($ALIGN_LEFT,$ALIGN_LEFT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT),2); + +$taxSumQ = $dbc->prepare_statement("SELECT -1*sum(total) as tax_collected +FROM $dlog as d +WHERE tdate BETWEEN ? AND ? +AND (d.upc = 'tax') +GROUP BY d.upc"); +$taxSumR = $dbc->exec_statement($taxSumQ,$dates); +echo "
        Actual Tax Collected
        "; +echo sprintf("%.2f
        ",array_pop($dbc->fetch_row($taxSumR))); + +$transQ = $dbc->prepare_statement("SELECT SUM(d.total),SUM(d.quantity),SUM(d.transCount),m.memdesc + FROM {$ARCH}sumMemTypeSalesByDay as d LEFT JOIN + memTypeID as m ON m.memTypeID=d.memType + WHERE d.tdate BETWEEN ? AND ? + GROUP BY d.memType, m.memdesc"); +$transR = $dbc->exec_statement($transQ,$dates); +$transinfo = array("Member"=>array(0,0.0,0.0,0.0,0.0), + "Non Member"=>array(0,0.0,0.0,0.0,0.0), + "Staff Member"=>array(0,0.0,0.0,0.0,0.0), + "Staff NonMem"=>array(0,0.0,0.0,0.0,0.0)); +while($row = $dbc->fetch_array($transR)){ + if (!isset($transinfo[$row[3]])) continue; + $transinfo[$row[3]] = array($row[2],$row[1], + round($row[1]/$row[2],2),$row[0], + round($row[0]/$row[2],2) + ); +} +$tSum = 0; +$tItems = 0; +$tDollars = 0; +foreach(array_keys($transinfo) as $k){ + $tSum += $transinfo[$k][0]; + $tItems += $transinfo[$k][1]; + $tDollars += $transinfo[$k][3]; +} +$transinfo["Totals"] = array($tSum,$tItems,round($tItems/$tSum,2),$tDollars,round($tDollars/$tSum,2)); +echo "
        Transaction information"; +echo tablify($transinfo,array(0,1,2,3,4,5), + array("Type","Transactions","Items","Average items/transaction","$","$/transaction"), + array($ALIGN_LEFT,$ALIGN_RIGHT,$ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY, + $ALIGN_RIGHT|$TYPE_MONEY,$ALIGN_RIGHT|$TYPE_MONEY)); + +function tablify($data,$col_order,$col_headers,$formatting,$sum_col=-1){ + $sum = 0; + $ret = ""; + + $ret .= ""; + $i = 0; + foreach ($col_headers as $c){ + while ($formatting[$i] == 0) $i++; + $ret .= cellify("".$c."",$formatting[$i++]&7); + } + $ret .= ""; + + foreach(array_keys($data) as $k){ + $ret .= ""; + foreach($col_order as $c){ + if($c == 0) $ret .= cellify($k,$formatting[$c]); + else $ret .= cellify($data[$k][$c-1],$formatting[$c]); + + if ($sum_col != -1 && $c == $sum_col) + $sum += $data[$k][$c-1]; + } + $ret .= ""; + } + if (count($data) == 0){ + $ret .= ""; + $ret .= ""; + $ret .= ""; + } + + if ($sum_col != -1 && count($data) > 0){ + $ret .= ""; + foreach($col_order as $c){ + if ($c+1 == $sum_col) $ret .= ""; + elseif ($c == $sum_col) $ret .= cellify($sum,$formatting[$c]); + else $ret .= ""; + } + $ret .= ""; + } + + $ret .= "
        "; + $ret .= "No results to report"."
        Total 
        "; + + return $ret; +} + +function cellify($data,$formatting){ + $ALIGN_RIGHT = 1; + $ALIGN_LEFT = 2; + $ALIGN_CENTER = 4; + $TYPE_MONEY = 8; + $ret = ""; + if ($formatting & $ALIGN_LEFT) $ret .= ""; + elseif ($formatting & $ALIGN_RIGHT) $ret .= ""; + elseif ($formatting & $ALIGN_CENTER) $ret .= ""; + + if ($formatting & $TYPE_MONEY) $ret .= sprintf("%.2f",$data); + else $ret .= $data; + + $ret .= ""; + + return $ret; +} +?> + diff --git a/fannie/reports/Store-Specific/WFC/RebateChecks/index.php b/fannie/reports/Store-Specific/WFC/RebateChecks/index.php new file mode 100644 index 000000000..8f914033a --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/RebateChecks/index.php @@ -0,0 +1,41 @@ +prepare_statement("select year(tdate),month(tdate),day(tdate),count(*) From is4c_trans.dlog_90_view as d + left join custdata as c ON d.card_no=c.CardNo and c.personNum=1 + where upc='DISCOUNT' and total <> 0 and c.Discount=0 + and tdate > '2012-11-29 00:00:00' + AND c.Type in ('PC','REG') + group by year(tdate),month(tdate),day(tdate) + order by year(tdate),month(tdate),day(tdate)"); +$r = $dbc->exec_statement($q); +echo '

        Rebate Checks

        '; +echo ''; +$sum = 0; +while ($w = $dbc->fetch_row($r)){ + printf('', + $w[1],$w[2],$w[0],$w[3]); + $sum += $w[3]; +} +echo ''; +echo '
        %d/%d/%d%d
        Total'.$sum.'
        '; + +$q = $dbc->prepare_statement("select year(tdate),month(tdate),day(tdate),sum(quantity) From is4c_trans.dlog_90_view as d + where upc='0049999900021' + and tdate > '2012-11-29 00:00:00' + group by year(tdate),month(tdate),day(tdate) + order by year(tdate),month(tdate),day(tdate)"); +$r = $dbc->exec_statement($q); +echo '

        Rebate Coupons

        '; +echo ''; +$sum = 0; +while ($w = $dbc->fetch_row($r)){ + printf('', + $w[1],$w[2],$w[0],$w[3]); + $sum += $w[3]; +} +echo ''; +echo '
        %d/%d/%d%d
        Total'.$sum.'
        '; + +?> diff --git a/fannie/reports/Store-Specific/WFC/VoterList/index.php b/fannie/reports/Store-Specific/WFC/VoterList/index.php new file mode 100755 index 000000000..5ae650f75 --- /dev/null +++ b/fannie/reports/Store-Specific/WFC/VoterList/index.php @@ -0,0 +1,105 @@ +Save to Excel"); + } + + $q = $dbc->prepare_statement("SELECT c.CardNo,c.FirstName,c.LastName, + m.street,m.city,m.state,m.zip FROM + custdata AS c LEFT JOIN meminfo AS m + ON c.CardNo=m.card_no + WHERE personNum=1 AND Type='PC' + AND memType IN (1,3) + AND c.LastName <> 'NEW MEMBER' + ORDER BY c.CardNo"); + $r = $dbc->exec_statement($q); + + echo ''; + //echo ''; + echo ''; + echo ''; + echo ''; + while($row = $dbc->fetch_row($r)){ + echo ''; + $row['LastName'] = preg_replace('/[^A-Za-z ]/','',$row['LastName']); + $row['LastName'] = str_replace(" ","-",$row['LastName']); + /* + echo ''; + echo ''; + echo ''; + */ + echo ''; + if (strstr($row['street'],"\n")){ + list($one,$two) = explode("\n",$row['street']); + echo ''; + } + else + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
        UsernamePassword
        First LineFNLNAddr1Addr2CityStateZip
        '.strtolower($row['FirstName'][0].$row['LastName']).''.str_pad($row['CardNo'],5,'0',STR_PAD_LEFT).''.$row['FirstName'].' '.$row['LastName'].''; + echo strtolower($row['FirstName'][0].$row['LastName']); + echo ' '.str_pad($row['CardNo'],5,'0',STR_PAD_LEFT); + echo ''.$row['FirstName'].''.$row['LastName'].''.$one.''.$two.''.$row['street'].''.$row['city'].''.$row['state'].''.$row['zip'].'
        '; + + if (isset($_REQUEST['excel'])){ + include($FANNIE_ROOT.'src/ReportConvert/HtmlToArray.php'); + include($FANNIE_ROOT.'src/ReportConvert/ArrayToXls.php'); + $output = ob_get_contents(); + ob_end_clean(); + $array = HtmlToArray($output); + $xls = ArrayToXls($array); + echo $xls; + } + +} +else { + +$page_title = "Fannie : Voter List"; +$header = "Voter List"; +include($FANNIE_ROOT.'src/header.html'); +?> +
        +Generate list of current active owners for board election +

        +Excel +

        + +

        + diff --git a/fannie/reports/StoreSummary/StoreSummaryReport.php b/fannie/reports/StoreSummary/StoreSummaryReport.php new file mode 100644 index 000000000..567ba0a10 --- /dev/null +++ b/fannie/reports/StoreSummary/StoreSummaryReport.php @@ -0,0 +1,414 @@ +title = "Fannie : Store Summary Report"; + $this->header = "Store Summary Report"; + $this->report_cache = 'none'; + $this->grandTTL = 1; + $this->multi_report_mode = True; + if (isset($_REQUEST['sortable'])) + $this->sortable = True; + else + $this->sortable = False; + $this->cellTextAlign = 'right'; + + if (isset($_REQUEST['date1'])){ + $this->content_function = "report_content"; + $this->has_menus(False); + $this->report_headers = array('','Qty','Costs','% Costs','DeptC%','Sales','% Sales','DeptS %','GST','HST'); + + /** + Check if a non-html format has been requested + from the links in the initial display, not the form. + */ + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function report_description_content(){ + return $this->report_desc; + } + + function get_superdept_name($department_name){ + global $dbc, $FANNIE_OP_DB; + $ret = ''; + if ( $department_name != "" ) { + $sel = "SELECT super_name + FROM {$FANNIE_OP_DB}.MasterSuperDepts s + INNER JOIN {$FANNIE_OP_DB}.departments d ON d.dept_no = s.dept_ID + WHERE d.dept_name = ?"; + $selP = $dbc->prepare_statement($sel); + $selArgs = array($department_name); + $selR = $dbc->exec_statement($selP, $selArgs); + if ($selR && $dbc->num_rows($selR)>0) { + while($row = $dbc->fetch_array($selR)){ + $ret = $row['super_name']; + break; + } + } + } + return $ret; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $d1 = FormLib::get_form_value('date1',date('Y-m-d')); + $d2 = FormLib::get_form_value('date2',date('Y-m-d')); + $dept = $_REQUEST['dept']; + + $this->report_desc[] = sprintf("

        Store Summary: %s

        ", ($d1 == $d2) ? "For $d1" : "From $d1 to $d2"); + if ($dept == 0) { + $this->report_desc[] = "

        Using the department# the upc was assigned to at time of sale

        "; + } + elseif ($dept == 1) { + $this->report_desc[] = "

        Using the department# the upc is assigned to now

        "; + } + else { + // fetch_report_data() will abort on this condition. + $this->report_desc[] = "

        Department#-source choice >${dept}< not known.

        "; + } + $this->report_desc[] = "

        Note: For items where cost is not recorded the margin in the deptMargin table is relied on.

        "; + + $dlog = select_dtrans($d1,$d2); + // dlog is probably more efficient. But it doesn't work at this point. + //$dlog = select_dlog($d1,$d2); + //$this->report_desc[] = "dlog: $dlog"; +// $dbc->logger("dlog: $dlog"); + $datestamp = $dbc->identifier_escape('datetime'); + + // The eventual return value. + $data = array(); + + $taxNames = array(0 => ''); + $tQ = $dbc->prepare_statement("SELECT id, rate, description FROM core_op.taxrates WHERE id > 0 ORDER BY id"); + $tR = $dbc->exec_statement($tQ); + while ( $trow = $dbc->fetch_array($tR) ) { + $taxNames[$trow['id']] = $trow['description']; + } + + /* Using department settings at the time of sale. + * I.e. The department# from the transaction. + * If that department# no longer exists or is different then the report will be wrong. + * This does not use a departments table contemporary with the transactions. + * [0]Dept_name [1]Cost, [2]HST, [3]GST, [4]Sales, [x]Qty, [x]superID, [x]super_name + */ + if ($dept == 0){ + // Change varname to sales or totals + $costs = "SELECT + d.Dept_name dname, + sum(CASE WHEN t.trans_type = 'I' THEN t.cost WHEN t.trans_type = 'D' AND m.margin > 0.00 THEN t.total - (t.total * m.margin) END) costs, + sum(CASE WHEN t.tax = 1 THEN t.total * x.rate ELSE 0 END) taxes1, + sum(CASE WHEN t.tax = 2 THEN t.total * x.rate ELSE 0 END) taxes2, + sum(t.total) sales, + sum(t.quantity) qty, + s.superID sid, + s.super_name sname + FROM + $dlog AS t LEFT JOIN + core_op.departments AS d ON d.dept_no=t.department LEFT JOIN + core_op.MasterSuperDepts AS s ON t.department=s.dept_ID LEFT JOIN + core_op.deptMargin AS m ON t.department=m.dept_id LEFT JOIN + core_op.taxrates AS x ON t.tax=x.id + WHERE + ($datestamp BETWEEN ? AND ?) + AND (s.superID > 0 OR s.superID IS NULL) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + GROUP BY + s.superID, s.super_name, d.dept_name, t.department + ORDER BY + s.superID, t.department"; + + } + /* Using current department settings. + * I.e. The department for the upc from the current products table. + * This does not use a departments table contemporary with the transactions. + */ + elseif ($dept == 1){ + $costs = "SELECT + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name END dname, + sum(CASE WHEN t.trans_type = 'I' THEN t.cost WHEN t.trans_type = 'D' AND m.margin > 0.00 THEN t.total - (t.total * m.margin) END) costs, + sum(CASE WHEN t.tax = 1 THEN t.total * x.rate ELSE 0 END) taxes1, + sum(CASE WHEN t.tax = 2 THEN t.total * x.rate ELSE 0 END) taxes2, + sum(t.total) sales, + sum(t.quantity) qty, + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID END sid, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END sname + FROM + $dlog AS t LEFT JOIN + products AS p ON t.upc=p.upc LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + departments AS e ON p.department=e.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=p.department LEFT JOIN + MasterSuperDepts AS r ON r.dept_ID=t.department LEFT JOIN + deptMargin AS m ON p.department=m.dept_id LEFT JOIN + core_op.taxrates AS x ON t.tax=x.id + WHERE + ($datestamp BETWEEN ? AND ?) + AND (s.superID > 0 OR (s.superID IS NULL AND r.superID > 0) + OR (s.superID IS NULL AND r.superID IS NULL)) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + GROUP BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END, + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end + ORDER BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end"; + } + else { + // Abort. The message is in the heading. + return $data; + } + + $costsP = $dbc->prepare_statement($costs); + $costArgs = array($d1.' 00:00:00', $d2.' 23:59:59'); + $costsR = $dbc->exec_statement($costsP, $costArgs); + + // Array in which totals used in the report are accumulated. + $supers = array(); + $curSuper = 0; + $grandTotal = 0; + $this->grandCostsTotal = 0; + $this->grandSalesTotal = 0; + $this->grandTax1Total = 0; + $this->grandTax2Total = 0; + + while($row = $dbc->fetch_array($costsR)){ + if ($curSuper != $row['sid']){ + $curSuper = $row['sid']; + } + if (!isset($supers[$curSuper])) { + $supers[$curSuper] = array( + 'name'=>$row['sname'], + 'qty'=>0.0,'costs'=>0.0,'sales'=>0.0, + 'taxes1'=>0.0,'taxes2'=>0.0, + 'depts'=>array()); + } + $supers[$curSuper]['qty'] += $row['qty']; + $supers[$curSuper]['costs'] += $row['costs']; + $supers[$curSuper]['sales'] += $row['sales']; + $supers[$curSuper]['taxes1'] += $row['taxes1']; + $supers[$curSuper]['taxes2'] += $row['taxes2']; + // GROUP BY produces 1 row per dept. Values are sums. + $supers[$curSuper]['depts'][] = array('name'=>$row['dname'], + 'qty'=>$row['qty'], + 'costs'=>$row['costs'], + 'sales'=>$row['sales'], + 'taxes1'=>$row['taxes1'], + 'taxes2'=>$row['taxes2']); + + $this->grandCostsTotal += $row['costs']; + $this->grandSalesTotal += $row['sales']; + $this->grandTax1Total += $row['taxes1']; + $this->grandTax2Total += $row['taxes2']; + } + + foreach($supers as $s){ + if ($s['sales']==0) continue; + + $superCostsSum = $s['costs']; + $superSalesSum = $s['sales']; + // $superTaxes1Sum = $s['taxes1']; + // $superTaxes2Sum = $s['taxes2']; + $report = array(); + foreach($s['depts'] as $d){ + $record = array( + $d['name'], + sprintf('%.2f',$d['qty']), + sprintf('$%.2f',$d['costs']), + sprintf('%.2f %%',($d['costs'] / $this->grandCostsTotal) * 100), + sprintf('%.2f %%',($d['costs'] / $superCostsSum) * 100), + sprintf('$%.2f',$d['sales']), + sprintf('%.2f %%',($d['sales'] / $this->grandSalesTotal) * 100), + sprintf('%.2f %%',($d['sales'] / $superSalesSum) * 100), + sprintf('%.2f',$d['taxes2']), + sprintf('%.2f',$d['taxes1']) + ); + $report[] = $record; + } + + $data[] = $report; + + } + + // The summary of grand totals proportions. + + $report = array(); + + // Headings + $record = array( + '', + '', + 'Costs', + '', + '', + 'Sales', + 'Profit', + 'Margin %', + $taxNames['2'], + $taxNames['1'] + ); + $report[] = $record; + + // Grand totals + $record = array( + 'WHOLE STORE', + '', + '$ '.number_format($this->grandCostsTotal,2), + '', + '', + '$ '.number_format($this->grandSalesTotal,2), + '$ '.number_format(($this->grandSalesTotal - $this->grandCostsTotal),2), + number_format(((($this->grandSalesTotal - $this->grandCostsTotal) / $this->grandSalesTotal) * 100),2).' %', + '$ '.number_format($this->grandTax2Total,2), + '$ '.number_format($this->grandTax1Total,2) + ); + $report[] = $record; + + $this->summary_data[] = $report; + + $this->grandTTL = $grandTotal; + return $data; + + // fetch_report_data() + } + + function calculate_footers($data){ + + $sumQty = 0.0; + $sumSales = 0.0; + $sumCosts = 0.0; + $sumTax1 = 0.0; + $sumTax2 = 0.0; + // Proportion of whole store by this superdept. + //$propCosts = 0.0; + //$propSales = 0.0; + foreach($data as $row){ + $sumQty += $row[1]; + $sumCosts += preg_replace("/[^.0-9]/",'',$row[2]); + $sumSales += preg_replace("/[^.0-9]/",'',$row[5]); + $sumTax2 += preg_replace("/[^.0-9]/",'',$row[8]); + $sumTax1 += preg_replace("/[^.0-9]/",'',$row[9]); + } + return array( $this->get_superdept_name($data[0][0]), + $sumQty, + sprintf('$ %s',number_format($sumCosts,2)), + sprintf('%.2f %%',($sumCosts/$this->grandCostsTotal)*100), + null, + sprintf('$ %s',number_format($sumSales,2)), + sprintf('%.2f %%',($sumSales/$this->grandSalesTotal)*100), + null, + sprintf('$ %s',number_format($sumTax2,2)), + sprintf('$ %s',number_format($sumTax1,2)) + ); + + // calculate_footers() + } + + function form_content(){ + $lastMonday = ""; + $lastSunday = ""; + + $ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); + while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); + } + ?> +
        + + + + + + + + + + + + + +
        Start Date + +
        End Date
        Sortable +      
        +
        + draw_page(); +?> diff --git a/fannie/reports/StoreSummary/index.php b/fannie/reports/StoreSummary/index.php new file mode 100644 index 000000000..fef3d75c2 --- /dev/null +++ b/fannie/reports/StoreSummary/index.php @@ -0,0 +1,500 @@ +identifier_escape('datetime'); + + if (isset($_REQUEST['excel'])){ + header("Content-Disposition: inline; filename=costs_{$d1}_{$d2}.xls"); + header("Content-type: application/vnd.ms-excel; name='excel'"); + } + else { + printf("

        Store Summary: %s

        \n", ($d1 == $d2) ? "For $d1" : "From $d1 to $d2"); + if ($dept == 0) { + echo "Using the department# the upc was assigned to at time of sale\n"; + } + elseif ($dept == 1) { + echo "Using the department# the upc is assigned to now\n"; + } + else { + echo "Department#-source choice not known.\n"; + } + printf("
        Save to Excel", + $d1,$d2,$dept); + } + + $taxNames = array(0 => ''); + $taxRates = array(0 => 0); + $tQ = $dbc->prepare_statement("SELECT id, rate, description FROM core_op.taxrates WHERE id > 0 ORDER BY id"); + $tR = $dbc->exec_statement($tQ); + while ( $trow = $dbc->fetch_array($tR) ) { + $taxNames[$trow['id']] = $trow['description']; + $taxRates[$trow['id']] = $trow['rate']; + } + + + /* Using department settings at the time of sale. + * I.e. The department# from the transaction. + * If that department# no longer exists or is different then the report will be wrong. + * This does not use a departments table contemporary with the transactions. + * [0]Dept_name [1]Cost, [2]HST, [3]GST, [4]Sales, [x]Qty, [x]superID, [x]super_name + */ + if ($dept == 0){ + // Change varname to sales or totals + $costs = "SELECT + d.Dept_name dname, + sum(CASE WHEN t.trans_type = 'I' THEN t.cost WHEN t.trans_type = 'D' AND m.margin > 0.00 THEN t.total - (t.total * m.margin) END) costs, + sum(CASE WHEN t.tax = 1 THEN t.total * x.rate ELSE 0 END) taxes1, + sum(CASE WHEN t.tax = 2 THEN t.total * x.rate ELSE 0 END) taxes2, + sum(t.total) sales, + sum(t.quantity) qty, + s.superID sid, + s.super_name sname + FROM + $dlog AS t LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + MasterSuperDepts AS s ON t.department=s.dept_ID LEFT JOIN + deptMargin AS m ON t.department=m.dept_id LEFT JOIN + core_op.taxrates AS x ON t.tax=x.id + WHERE + ($datestamp BETWEEN ? AND ?) + AND (s.superID > 0 OR s.superID IS NULL) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + GROUP BY + s.superID, s.super_name, d.dept_name, t.department + ORDER BY + s.superID, t.department"; + + } + /* Using current department settings. + * I.e. The department for the upc from the current products table. + * This does not use a departments table contemporary with the transactions. + */ + elseif ($dept == 1){ + $costs = "SELECT + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name END dname, + sum(CASE WHEN t.trans_type = 'I' THEN t.cost WHEN t.trans_type = 'D' AND m.margin > 0.00 THEN t.total - (t.total * m.margin) END) costs, + sum(CASE WHEN t.tax = 1 THEN t.total * x.rate ELSE 0 END) taxes1, + sum(CASE WHEN t.tax = 2 THEN t.total * x.rate ELSE 0 END) taxes2, + sum(t.total) sales, + sum(t.quantity) qty, + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID END sid, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END sname + FROM + $dlog AS t LEFT JOIN + products AS p ON t.upc=p.upc LEFT JOIN + departments AS d ON d.dept_no=t.department LEFT JOIN + departments AS e ON p.department=e.dept_no LEFT JOIN + MasterSuperDepts AS s ON s.dept_ID=p.department LEFT JOIN + MasterSuperDepts AS r ON r.dept_ID=t.department LEFT JOIN + deptMargin AS m ON p.department=m.dept_id LEFT JOIN + core_op.taxrates AS x ON t.tax=x.id + WHERE + ($datestamp BETWEEN ? AND ?) + AND (s.superID > 0 OR (s.superID IS NULL AND r.superID > 0) + OR (s.superID IS NULL AND r.superID IS NULL)) + AND t.trans_type in ('I','D') + AND t.trans_status not in ('D','X','Z') + AND t.emp_no not in (7000, 9999) + AND t.register_no != 99 + GROUP BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN s.super_name IS NULL THEN r.super_name ELSE s.super_name END, + CASE WHEN e.dept_name IS NULL THEN d.dept_name ELSE e.dept_name end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end + ORDER BY + CASE WHEN s.superID IS NULL THEN r.superID ELSE s.superID end, + CASE WHEN e.dept_no IS NULL THEN d.dept_no ELSE e.dept_no end"; + } + else { + print "
        Form variable 'dept' value >{$dept}< is unknown."; + exit; + } + + // Array in which totals used in the report are accumulated. + $supers = array(); + + $costsP = $dbc->prepare_statement($costs); + $costArgs = array($d1.' 00:00:00', $d2.' 23:59:59'); + $costsR = $dbc->exec_statement($costsP, $costArgs); + + $curSuper = 0; + $grandTotal = 0; + + while($row = $dbc->fetch_array($costsR)){ + if ($curSuper != $row['sid']){ + $curSuper = $row['sid']; + } + if (!isset($supers[$curSuper])) { + $supers[$curSuper] = array( + 'name'=>$row['sname'], + 'qty'=>0.0,'costs'=>0.0,'sales'=>0.0, + 'taxes1'=>0.0,'taxes2'=>0.0, + 'depts'=>array()); + } + $supers[$curSuper]['qty'] += $row['qty']; + $supers[$curSuper]['costs'] += $row['costs']; + $supers[$curSuper]['sales'] += $row['sales']; + $supers[$curSuper]['taxes1'] += $row['taxes1']; + $supers[$curSuper]['taxes2'] += $row['taxes2']; + // GROUP BY produces 1 row per dept. Values are sums. + $supers[$curSuper]['depts'][] = array('name'=>$row['dname'], + 'qty'=>$row['qty'], + 'costs'=>$row['costs'], + 'sales'=>$row['sales'], + 'taxes1'=>$row['taxes1'], + 'taxes2'=>$row['taxes2']); + + $grandCostsTotal += $row['costs']; + $grandSalesTotal += $row['sales']; + $grandTax1Total += $row['taxes1']; + $grandTax2Total += $row['taxes2']; + } + + $superCount = 0; + foreach($supers as $s){ + if ($s['sales']==0) continue; + $superCount++; + if ( $superCount == 1) { + echo "\n"; + $headings = " + + + + + + + + + + + "; + echo "$headings\n"; + } else { + echo "\n"; + echo "$headings\n"; + //echo "\n"; + } + $superCostsSum = $s['costs']; + $superSalesSum = $s['sales']; +// $superTaxes1Sum = $s['taxes1']; +// $superTaxes2Sum = $s['taxes2']; + $deptCount = 0; + foreach($s['depts'] as $d){ + if ( ++$deptCount > 30 ) { + echo "$headings\n"; + $deptCount = 0; + } + printf(" + + + + \n", + $d['name'], + $d['qty'], + $d['costs'], + $d['costs'] / $grandCostsTotal * 100, + $d['costs'] / $superCostsSum * 100, + $d['sales'], + $d['sales'] / $grandSalesTotal * 100, + $d['sales'] / $superSalesSum * 100, + $d['taxes2'], + $d['taxes1']); + } + + if ( count($s['depts']) > 20 ) { + echo "$headings\n"; + } + // Footer of Totals for SuperDept + printf(" + + + + + + + + + + + \n", + $s['name'], + number_format($s['qty'],2), + number_format($s['costs'],2), + $s['costs']/$grandCostsTotal * 100, + ' ', + number_format($s['sales'],2), + $s['sales']/$grandSalesTotal * 100, + ' ', + number_format($s['taxes2'],2), + number_format($s['taxes1'],2)); + + /* With 0.2f + printf(" + + + + + + + + + + + \n", + $s['name'], + $s['qty'], + $s['costs'], + $s['costs']/$grandCostsTotal * 100, + ' ', + $s['sales'], + $s['sales']/$grandSalesTotal * 100, + ' ', + $s['taxes2'], + $s['taxes1']); + */ + + } + + // Whole-store totals + $headingsW = " + + + + + + + + + + + \n"; + echo "\n"; + echo "$headingsW\n"; + printf(" + + + + + + + + + + + \n", + 'WHOLE STORE', + ' ', + number_format($grandCostsTotal,2), + ' ', + ' ', + number_format($grandSalesTotal,2), + number_format(($grandSalesTotal - $grandCostsTotal),2), + ((($grandSalesTotal - $grandCostsTotal) / $grandSalesTotal) * 100), + number_format($grandTax2Total,2), + number_format($grandTax1Total,2)); + + echo "
         QtyCosts% CostsDeptC %Sales% SalesDeptS %{$taxNames['2']}{$taxNames['1']}
        Blank
         TaxesQty% TaxesDept %
        %s%.2f\$%.2f%.2f %%%.2f %%\$%.2f%.2f %%%.2f %%%.2f%.2f
        %s%s\$%s%.2f %%%s\$%s%.2f %%%s\$%s\$%s
        %s%.2f\$%.2f%.2f %%%s\$%.2f%.2f %%%s\$%.2f\$%.2f
          Costs  SalesProfitMargin %{$taxNames['2']}{$taxNames['1']}
        Blank
        %s%s\$%s%s%s\$%s\$%s%.2f %%\$%s\$%s

        "; + + /* + printf("
        Total Sales: \$%.2f\n",$grandSalesTotal); + printf("
        Total Costs: \$%.2f\n",$grandCostsTotal); + printf("
        Gross Profit: \$%.2f\n", ($grandSalesTotal - $grandCostsTotal)); + + printf("

        Total {$taxNames['2']}: \$%.2f\n",$grandTax2Total); + printf("
        Total {$taxNames['1']}: \$%.2f\n",$grandTax1Total); + printf("
        Total Taxes: \$%.2f\n", ($grandTax1Total + $grandTax2Total)); + */ + +} +// Form for specifying the report. +else { + +$page_title = "Fannie : Store Summary Report"; +$header = "Store Summary Report"; +include($FANNIE_ROOT.'src/header.html'); +$lastMonday = ""; +$lastSunday = ""; + +/* Default date range is the most recent complete Mon-Sun week, + * with calculation beginning yesterday. + * If today is Friday the 25th the range is 14th to 20th. + * If today is Monday the 28th the range is 21st to 27th. +*/ +$ts = mktime(0,0,0,date("n"),date("j")-1,date("Y")); +while($lastMonday == "" || $lastSunday == ""){ + if (date("w",$ts) == 1 && $lastSunday != "") + $lastMonday = date("Y-m-d",$ts); + elseif(date("w",$ts) == 0) + $lastSunday = date("Y-m-d",$ts); + $ts = mktime(0,0,0,date("n",$ts),date("j",$ts)-1,date("Y",$ts)); +} +?> + +
        + + + + + + + + + + + +
        + + + + + + + + + +
        Start Date +
        End Date + +
        + Start - End Dates +
        +
        +
        +Other dates + + + + +
        + Today
        + This week
        + This month
        +
        + Yesterday
        + Last week
        + Last month
        +
        +
        +
        Excel
        + +
        + diff --git a/fannie/reports/SuspensionHistory/index.php b/fannie/reports/SuspensionHistory/index.php new file mode 100644 index 000000000..206950741 --- /dev/null +++ b/fannie/reports/SuspensionHistory/index.php @@ -0,0 +1,34 @@ +prepare_statement("select username,postdate,post,textStr + from suspension_history AS s + LEFT JOIN reasoncodes AS r ON + s.reasoncode & r.mask > 0 + WHERE s.cardno=? ORDER BY postdate DESC"); +if ($memNum == 0){ + echo "Error: no member specified"; +} +else { + echo ""; + echo ""; + $r = $dbc->exec_statement($q,array($memNum)); + while($w = $dbc->fetch_row($r)){ + printf('', + $w['postdate'],(!empty($w['textStr'])?$w['textStr']:$w['post']), + $w['username']); + } + echo "
        DateReasonUser
        %s%s%s
        "; +} + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/reports/TenderInOut/index.php b/fannie/reports/TenderInOut/index.php new file mode 100644 index 000000000..39ee3dbba --- /dev/null +++ b/fannie/reports/TenderInOut/index.php @@ -0,0 +1,201 @@ +prepare_statement("select tdate,trans_num,-total as total,card_no + FROM $dlog as t + where t.trans_subtype = ? AND + trans_type='T' AND + tdate BETWEEN ? AND ? + order by tdate"); + //echo $query; + $result = $dbc->exec_statement($query,array($code,$date1.' 00:00:00',$date2.' 23:59:59')); + + // make headers sort links + $today = date("F d, Y"); + //Following lines creates a header for the report, listing sort option chosen, report date, date and department range. + echo "Report run "; + echo $today; + echo "
        "; + echo "From "; + print $date1; + echo " to "; + print $date2; + echo "
        "; + + if (!isset($_GET['excel'])){ + echo "Save to Excel
        "; + } + + echo ""; + echo ""; + if (!isset($_GET['excel'])){ + if ($sort == "tdate"){ + echo ""; + } + else { + echo ""; + } + echo ""; + if ($sort == "card_no"){ + echo ""; + } + else { + echo ""; + } + if ($sort == "total"){ + echo ""; + } + else { + echo ""; + } + } + else { + echo ""; + } + $sumSales = 0.0; + while ($row = $dbc->fetch_array($result)){ + echo ""; + echo "'; + echo ""; + echo ""; + echo ""; + echo ""; + $sumSales += $row['total']; + } + echo ""; + echo ""; + echo "
        DateDateReceipt#Mem#Mem#AmountAmountDateReceipt#Mem#Amount
        ".$row['tdate'].'".$row['trans_num']."".$row['card_no']."".sprintf('%.2f',$row['total'])."
        Total ".sprintf('%.2f',$sumSales)."
        "; + + return; +} + +$page_title = "Fannie : Tender Usage"; +$header = "Tender Usage Report"; +include($FANNIE_ROOT.'src/header.html'); +$tenders = array(); +$p = $dbc->prepare_statement("SELECT TenderCode,TenderName FROM tenders ORDER BY TenderName"); +$r = $dbc->exec_statement($p); +while($w = $dbc->fetch_row($r)) + $tenders[$w['TenderCode']] = $w['TenderName']; +?> + + +
        +
        + + + + + + + + + + + + + + + + +

        Tender

        +

        Excel

        +

        + +

        +

        + +

        +
        +

        Date Start

        +

        End

        +
        +

        + +

        +

        + +

        +
          
        +
        +
        + + + + + diff --git a/fannie/reports/Trends/index.php b/fannie/reports/Trends/index.php new file mode 100755 index 000000000..eae269324 --- /dev/null +++ b/fannie/reports/Trends/index.php @@ -0,0 +1,378 @@ + 'M' + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + $args = array($dept1,$dept2); + break; + case 'manu': + if ($man_type == "name"){ + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + d.upc, p.description, + sum(d.quantity) as total + from $dlog as d left join products as p on d.upc = p.upc + left join prodExtra as x on p.upc = x.upc + where x.manufacturer = ? + AND d.tdate BETWEEN ? AND ? + and trans_status <> 'M' + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + $args = array($manufacturer); + } + else { + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + d.upc, p.description, + sum(d.quantity) as total + from $dlog as d left join products as p on d.upc = p.upc + where p.upc like ? + AND d.tdate BETWEEN ? AND ? + and trans_status <> 'M' + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + $args = array('%'.$manufacturer.'%'); + } + break; + case 'upc': + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + d.upc, p.description, + sum(d.quantity) as total + from $dlog as d left join products as p on d.upc = p.upc + where p.upc = ? + AND d.tdate BETWEEN ? AND ? + and trans_status <> 'M' + group by year(d.tdate),month(d.tdate),day(d.tdate), + d.upc,p.description + order by d.upc,year(d.tdate),month(d.tdate),day(d.tdate)"; + $args = array($upc); + break; + + case 'likecode': + $query = "select + year(d.tdate) as year, + month(d.tdate) as month, + day(d.tdate) as day, + p.likeCode as upc, l.likeCodeDesc as description, + sum(d.quantity) as total + from $dlog as d left join upcLike as p on d.upc = p.upc + left join likeCodes AS l ON p.likeCode=l.likeCode + where p.likeCode BETWEEN ? AND ? + AND d.tdate BETWEEN ? AND ? + and trans_status <> 'M' + group by year(d.tdate),month(d.tdate),day(d.tdate), + p.likeCode, l.likeCodeDesc + order by p.likeCode,year(d.tdate),month(d.tdate),day(d.tdate)"; + $args = array($lc,$lc2); + break; + + + } + $args[] = $date1.' 00:00:00'; + $args[] = $date2.' 23:59:59'; + $prep = $dbc->prepare_statement($query); + $result = $dbc->exec_statement($prep,$args); + + $dates = array(); + while($date1 != $date2) { + $dates[] = $date1; + $parts = explode("-",$date1); + if (count($parts) != 3) break; + $date1 = date("Y-m-d",mktime(0,0,0,$parts[1],$parts[2]+1,$parts[0])); + } + $dates[] = $date2; + + echo ""; + echo ""; + foreach ($dates as $i) + echo ""; + echo ""; + echo ""; + + $current_upc = ""; + $current_desc = ""; + $data = array(); + // track upc while going through the rows, storing + // all data about a given upc before printing + while ($row = $dbc->fetch_array($result)){ + if ($current_upc != $row['upc']){ + // print the data + if ($current_upc != ""){ + echo ""; + echo ""; + echo ""; + $sum = 0; + foreach ($dates as $i){ + if (isset($data[$i])){ + echo ""; + $sum += $data[$i]; + } + else + echo ""; + } + printf("",$sum); + echo ""; + } + // update 'current' values and clear data + $current_upc = $row['upc']; + $current_desc = $row['description']; + $data = array(); + } + // get a yyyy-mm-dd format date from sql results + $year = $row['year']; + $month = str_pad($row['month'],2,'0',STR_PAD_LEFT); + $day = str_pad($row['day'],2,'0',STR_PAD_LEFT); + $datestr = $year."-".$month."-".$day; + + // index result into data based on date string + // this is to properly place data in the output table + // even when there are 'missing' days for a given upc + $data[$datestr] = $row['total']; + } + // print the last data set + echo ""; + echo ""; + echo ""; + $sum = 0; + foreach ($dates as $i){ + if (isset($data[$i])){ + echo ""; + $sum += $data[$i]; + } + else + echo ""; + } + printf("",$sum); + echo ""; + echo "
        UPCDescription$iTotal
        ".$current_upc."".$current_desc."".$data[$i]."0%.2f
        ".$current_upc."".$current_desc."".$data[$i]."0%.2f
        "; +} +else { + + $page_title = "Fannie : Trends"; + $header = "Trend Report"; + include($FANNIE_ROOT.'src/header.html'); + + $deptsQ = $dbc->prepare_statement("select dept_no,dept_name from departments order by dept_no"); + $deptsR = $dbc->exec_statement($deptsQ); + $deptsList = ""; + while ($deptsW = $dbc->fetch_array($deptsR)) + $deptsList .= ""; +?> + + + +
        + +Type: Department +Manufacturer +Single item +Like code
        + +
        + + + + + +
        Start department: + + +Start date:
        End department: + + +End date:
        +
        + + + + + + + +
        +Excel
        + +
        + + + diff --git a/fannie/reports/VendorMovement/VendorMovementReport.php b/fannie/reports/VendorMovement/VendorMovementReport.php new file mode 100644 index 000000000..802618c68 --- /dev/null +++ b/fannie/reports/VendorMovement/VendorMovementReport.php @@ -0,0 +1,206 @@ +report_cache = 'none'; + $this->title = "Fannie : Vendor Movement"; + $this->header = "Vendor Movement Report"; + + if (isset($_REQUEST['date1'])){ + $this->content_function = "report_content"; + $this->has_menus(False); + + if (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'xls') + $this->report_format = 'xls'; + elseif (isset($_REQUEST['excel']) && $_REQUEST['excel'] == 'csv') + $this->report_format = 'csv'; + } + else + $this->add_script("../../src/CalendarControl.js"); + + return True; + } + + function fetch_report_data(){ + global $dbc, $FANNIE_ARCHIVE_DB; + $date1 = FormLib::get_form_value('date1',date('Y-m-d')); + $date2 = FormLib::get_form_value('date2',date('Y-m-d')); + $vendor = FormLib::get_form_value('vendor',''); + $groupby = FormLib::get_form_value('groupby','upc'); + + $dlog = select_dlog($date1,$date2); + $sumTable = $FANNIE_ARCHIVE_DB.$dbc->sep()."sumUpcSalesByDay"; + + $query = ""; + switch($groupby){ + case 'upc': + $query = "select t.upc,p.description, + sum(t.quantity) as qty, + sum(t.total),d.dept_no,d.dept_name,s.superID + from $dlog as t left join products as p + on t.upc=p.upc left join prodExtra as e on p.upc = e.upc + left join departments as d on p.department = d.dept_no + left join MasterSuperDepts as s on d.dept_no = s.dept_ID + where e.distributor like ? + and t.tdate between ? AND ? + group by t.upc,p.description,d.dept_no,d.dept_name,s.superID + order by sum(t.total) desc"; + break; + case 'date': + $query = "select year(t.tdate),month(t.tdate),day(t.tdate), + sum(t.quantity),sum(t.total) + from products as p left join prodExtra as e on p.upc = e.upc + left join $dlog as t on p.upc = t.upc + where e.distributor like ? + and t.tdate between ? AND ? + group by year(t.tdate),month(t.tdate),day(t.tdate) + order by year(t.tdate),month(t.tdate),day(t.tdate)"; + break; + case 'dept': + $query = "select d.dept_no,d.dept_name,sum(t.quantity),sum(t.total),s.superID + from products as p left join prodExtra as e on p.upc = e.upc + left join $dlog as t on p.upc = t.upc + left join departments as d on p.department = d.dept_no + left join MasterSuperDepts as s on d.dept_no=s.dept_ID + where e.distributor like ? + and t.tdate between ? AND ? + group by d.dept_no,d.dept_name,s.superID + order by sum(t.total) desc"; + break; + } + $args = array('%'.$vendor.'%',$date1.' 00:00:00',$date2.' 23:59:59'); + $prep = $dbc->prepare_statement($query); + + $result = $dbc->exec_statement($prep,$args); + $ret = array(); + while ($row = $dbc->fetch_array($result)){ + $record = array(); + if ($groupby == "date"){ + $record[] = $row[1]."/".$row[2]."/".$row[0]; + $record[] = $row[3]; + $record[] = $row[4]; + } + else { + for($i=0;$i<$dbc->num_fields($result);$i++) + $record[] .= $row[$i]; + } + $ret[] = $record; + } + return $ret; + } + + function calculate_footers($data){ + if (empty($data)) + return array(); + switch(count($data[0])){ + case 7: + $this->report_headers = array('UPC','Description','Qty','$', + 'Dept#','Department','Subdept'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[3]; + } + return array('Total',null,$sumQty,$sumSales,null,null,null); + break; + case 5: + $this->report_headers = array('Dept#','Department','Qty','$','Subdept'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[2]; + $sumSales += $row[3]; + } + return array('Total',null,$sumQty,$sumSales,null); + break; + case 3: + $this->report_headers = array('Date','Qty','$'); + $sumQty = 0.0; + $sumSales = 0.0; + foreach($data as $row){ + $sumQty += $row[1]; + $sumSales += $row[2]; + } + return array('Total',$sumQty,$sumSales); + break; + } + } + + function form_content(){ +?> +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        Vendor + + Date Start + +
        Sum report byEnd + +
        + Excel + + +
        +
        +
        +draw_page(); +?> diff --git a/fannie/reports/VendorMovement/index.php b/fannie/reports/VendorMovement/index.php new file mode 100644 index 000000000..e36633e68 --- /dev/null +++ b/fannie/reports/VendorMovement/index.php @@ -0,0 +1,3 @@ + diff --git a/fannie/reports/ZipCodeReport/index.php b/fannie/reports/ZipCodeReport/index.php new file mode 100644 index 000000000..9032d59f1 --- /dev/null +++ b/fannie/reports/ZipCodeReport/index.php @@ -0,0 +1,77 @@ + + + +Zip Code Report + + + + + + +
        + + + + + + + + +
        Start date (YYYY-MM-DD):
        End date (YYYY-MM-DD):
        Limit (zero for all):
        + Excel + Omit Member #11 +
        + 11 "; + + + $dlog = select_dlog($startDate); + + $fetchQ = $dbc->prepare_statement("select d.card_no,sum(d.total), + case when m.zip='' then 'None Given' else m.zip end + from $dlog as d left join meminfo as m + on d.card_no = m.card_no + where trans_type='I' $mem11Str + d.tdate BETWEEN ? AND ? + group by d.card_no,m.zip + order by sum(d.total) desc"); + //echo $fetchQ."
        "; + $fetchR = $dbc->exec_statement($fetchQ,array($startDate,$endDate)); + + echo ""; + echo ""; + while ($fetchW = $dbc->fetch_array($fetchR)){ + echo ""; + echo ""; + echo ""; + } + echo "
        Mem No.TotalZipcode
        $fetchW[0]$fetchW[1]$fetchW[2]
        "; +} +?> diff --git a/fannie/reports/cash_report/graph.php b/fannie/reports/cash_report/graph.php new file mode 100755 index 000000000..7b26e4e37 --- /dev/null +++ b/fannie/reports/cash_report/graph.php @@ -0,0 +1,190 @@ += 0; $i--){ + if ($i % $period == 0){ + imageline($im,$left/2,$i*$row_height+$top,$left+$width,$i*$row_height+$top,$black); + imagestring($im,1,0,$i*$row_height-4+$top,$height/$row_height-$i,$black); + } + else { + imageline($im,$left,$i*$row_height+$top,$left+$width,$i*$row_height+$top,$black); + } + } + + /* fill in data */ + $fill = imagecolorallocate($im,$r,$g,$b); + for ($i = 0; $i < count($data); $i++){ + $temp_h = $data[$i] * $row_height; + imagefilledrectangle($im,$i*$col_width+$left+3,$height-$temp_h+$top, + $i*$col_width+$left+7,$height-1+$top,$fill); + + } + + /* save the image */ + imagepng($im,$filename); + + imagedestroy($im); + + return $width+$left+2; +} + + +function linegraph($data, $labels, $filename, $scale=-1,$thickness=1){ + $left = 46; + $bottom = 20; + $top = 5; + $col_width = 20; + $row_height = 10; + $width = (count($data)-1)*$col_width; + + /* create an image and paint it white */ + $max = 0; + $min = 999999; + foreach($data as $d){ + if (max($d) > $max) + $max = max($d); + if (abs_min($d) < $min) + $min = abs_min($d); + } + $range = $max - $min; + /* auto scaling, seems to work for now */ + if ($scale == -1) + $scale = .3/($range / 100); + $height = ceil($max*$row_height*$scale); + $offset = floor($min*$row_height*$scale); + $im = imagecreatetruecolor($width+$left+2,$height+$bottom+$top-$offset); + $white = imagecolorallocate($im,255,255,255); + imagefill($im,0,0,$white); + + /* get black */ + $black = imagecolorallocate($im,0,0,0); + + /* begin drawing the grid */ + + /* top and bottom */ + imageline($im,$left,$top,$width+$left,$top,$black); + imageline($im,$left,$height+$top-$offset,$width+$left,$height+$top-$offset,$black); + + /* draw column markers and periodic labels */ + for ($i = 0; $i < $width / $col_width; $i++){ + imageline($im,$col_width*$i+$left,$top,$col_width*$i+$left,$height+$top-$offset,$black); + if ($i % 7 == 0){ + imageline($im,$col_width*$i+$left,$height+$top-$offset, + $col_width*$i+$left,$height+$top-$offset+$bottom/2-1,$black); + imagestring($im,1,$col_width*$i+$left-20,$height+$top-$offset+$bottom/2, + $labels[$i],$black); + } + } + /* last column marker */ + imageline($im,$width+$left,$top,$width+$left,$height+$top-$offset,$black); + + /* draw row markers and periodic labels */ + $period = ceil(30 / $row_height); // as scale grows, place markers more often + for ($i = ($height-$offset)/$row_height-1; $i >= 0; $i--){ + if ($i % $period == 0){ + imageline($im,$left-6,$i*$row_height+$top,$left+$width,$i*$row_height+$top,$black); + imagestring($im,1,0,$i*$row_height-4+$top,round($height/$row_height/$scale-$i/$scale,2),$black); + } + else { + imageline($im,$left,$i*$row_height+$top,$left+$width,$i*$row_height+$top,$black); + } + } + + $colors = array( + array(255,0,0), + array(0,0,255), + array(0,255,0) + ); + /* map the data */ + imagesetthickness($im,$thickness); + $prevs = array_fill(0,count($data[0]),-1); + $backtrack = array_fill(0,count($data[0]),-1); + for ($i = 0; $i < count($data); $i++){ + for($j = 0; $j < count($data[$i]); $j++){ + if ($data[$i][$j] != -1){ + $fill = imagecolorallocate($im,$colors[$j][0],$colors[$j][1],$colors[$j][2]); + imagefilledellipse($im,$i*$col_width+$left,$height-($data[$i][$j]*$scale*$row_height)+$top,4*sqrt($thickness),4*sqrt($thickness),$fill); + if ($prevs[$j] != -1){ + imageline($im,$i*$col_width+$left,$height-($data[$i][$j]*$scale*$row_height)+$top, + ($i-$backtrack[$j])*$col_width+$left,$height-($prevs[$j]*$scale*$row_height)+$top,$fill); + } + } + if ($data[$i][$j] != -1){ + $prevs[$j] = $data[$i][$j]; + $backtrack[$j] = 1; + } + else{ + $backtrack[$j]++; + } + } + } + + /* save the image */ + imagepng($im,$filename); + + imagedestroy($im); + + return $width+$left+2; +} + +/* custom minimum function to ignore negative values */ +function abs_min($a){ + $min = 999999; + foreach($a as $i){ + if ($i < $min && $i >= 0) + $min = $i; + } + return $min; +} + +?> diff --git a/fannie/reports/cash_report/index.php b/fannie/reports/cash_report/index.php new file mode 100755 index 000000000..6038053a6 --- /dev/null +++ b/fannie/reports/cash_report/index.php @@ -0,0 +1,213 @@ + + +Enter an employee number
        +
        > +  + + PDF +
        +weekdiff($dbc->now(),'proc_date')." as week, + year(proc_date) as year, + SUM(Rings) / count(emp_no) as rings, + ".$dbc->convert('SUM(items)','int')." / count(emp_no) as items, + COUNT(Rings) / count(emp_no) as Trans, + SUM(CASE WHEN transinterval = 0 then 1 when transinterval > 600 then 600 else transinterval END) / count(emp_no) / 60 as minutes, + SUM(Cancels) / count(emp_no) as cancels, + MIN(proc_date) + from CashPerformDay_cache + GROUP BY emp_no,".$dbc->weekdiff($dbc->now(),'proc_date').",year(proc_date) + ORDER BY year(proc_date) desc,".$dbc->weekdiff($dbc->now(),'proc_date')." asc"; +} +else { +$query = "select + emp_no, + ".$dbc->weekdiff($dbc->now(),'proc_date')." as week, + year(proc_date) as year, + SUM(Rings) as rings, + ".$dbc->convert('SUM(items)','int')." as items, + COUNT(*) as TRANS, + SUM(CASE WHEN transInterval = 0 THEN 1 when transInterval > 600 then 600 ELSE transInterval END)/60 as minutes, + SUM(cancels)as cancels, + MIN(proc_date) + FROM CashPerformDay_cache + WHERE emp_no = ? + GROUP BY emp_no,".$dbc->weekdiff($dbc->now(),'proc_date').",year(proc_date) + ORDER BY year(proc_date) desc,".$dbc->weekdiff($dbc->now(),'proc_date')." asc"; +$args = array($emp_no); +} +$result = $dbc->exec_statement($query,$args); + +$rpm = array(); // rings per minute +$ipm = array(); // items per minute +$tpm = array(); // transactions per minute +$cpr = array(); // cancels per rings +$cpi = array(); // cancels per items +$week = array(); // first day of the week +$i = 0; +/* +calculate rates +remove the time from the week +*/ +while ($row = $dbc->fetch_array($result)){ + $temp = explode(" ",$row[8]); + $temp = explode("-",$temp[0]); + $week[$i] = $temp[0]." ".$temp[1]." ".$temp[2]; + $minutes = $row[6]; + // zeroes values where minutes = 0 + if ($minutes == 0) + $minutes = 999999999; + $rpm[$i] = $row[3] / $minutes; + $ipm[$i] = $row[4] / $minutes; + $tpm[$i] = $row[5] / $minutes; + if ($row[3] == 0) + $cpr[$i] = 0; + else + $cpr[$i] = ($row[7] / $row[3]) * 100; + if ($row[4] == 0) + $cpi[$i] = 0; + else + $cpi[$i] = ($row[7] / $row[4]) * 100; + $i++; +} + +include('graph.php'); + +/* clear out ony ld images */ +exec("rm -f image_area/*cash_report*.png"); + +/* generate a reasonably unique session key */ +$session_key = ''; +for ($i = 0; $i < 20; $i++){ + $num = rand(97,122); + $session_key = $session_key . chr($num); +} + +/* write graphs in the image_area directory */ +$session_key = "image_area/".$session_key; + +$width = graph($rpm,$week,$session_key."cash_report_0.png"); +graph($ipm,$week,$session_key."cash_report_1.png",10,0,0,255); +graph($tpm,$week,$session_key."cash_report_2.png",60,0,255,0); +graph($cpr,$week,$session_key."cash_report_3.png",90,0,0,255); +graph($cpi,$week,$session_key."cash_report_4.png",90); + + + +if(isset($_GET['pdf'])){ + require('lib/fpdf/fpdf.php'); + + $pdf = new FPDF(); + $pdf->AddPage(); + $pdf->SetFont('Arial','B',16); + $str = "Rings per minute\n"; + $str .= "(average: ".round(avg($rpm),2).")"; + $pdf->MultiCell(0,11,$str,0,'C'); + $pdf->Image($session_key."cash_report_0.png",65,35,$width/2); + $pdf->AddPage(); + $str = "Items per minute\n"; + $str .= "(average: ".round(avg($ipm),2).")"; + $pdf->MultiCell(0,11,$str,0,'C'); + $pdf->Image($session_key."cash_report_1.png",65,35,$width/2); + $pdf->AddPage(); + $str = "Transactions per minute\n"; + $str .= "(average: ".round(avg($tpm),2).")"; + $pdf->MultiCell(0,11,$str,0,'C'); + $pdf->Image($session_key."cash_report_2.png",65,35,$width/2); + $pdf->AddPage(); + $str = "% rings cancelled\n"; + $str .= "(average: ".round(avg($cpr),2).")"; + $pdf->MultiCell(0,11,$str,0,'C'); + $pdf->Image($session_key."cash_report_3.png",65,35,$width/2); + $pdf->AddPage(); + $str = "% items cancelled\n"; + $str .= "(average: ".round(avg($cpi),2).")"; + $pdf->MultiCell(0,11,$str,0,'C'); + $pdf->Image($session_key."cash_report_4.png",65,35,$width/2); + $pdf->Output("Cashier_" . $emp_no . "_Report.pdf","D"); +} +else { +?> + + + +

        Rings per minute

        +(average: )
        + /> +
        +
        +

        Items per minute

        +(average: )
        + /> +
        +
        +

        Transactions per minute

        +(average: )
        + /> +
        +
        +

        % Rings canceled

        +(average: )
        + /> +
        +
        +

        % Items canceled

        +(average: )
        + /> +
        + + +> diff --git a/fannie/reports/index.php b/fannie/reports/index.php new file mode 100644 index 000000000..6ca4d743a --- /dev/null +++ b/fannie/reports/index.php @@ -0,0 +1,91 @@ + +
          +
        • Movement Reports are a collection of reports relating to per-UPC sales stats +
            +
          • Department Movement lists sales + for a department or group of departments over a given date range.
          • +
          • Manufacturer Movement lists sales + for products from a specific manufacturer over a given date range. + Manufacturer is given either by name or as a UPC prefix.
          • +
          • Product Movement lists sales for a + specific UPC over a given date range.
          • +
          • Correlated Movement shows what + items purchasers from a certain department or group of departments + also buy. Optionally, results can be filtered by department too. + This may be clearer with an example: among transactions that + include a sandwich, what do sales from the beverages department + look like?
          • +
          • Non-Movement shows items in a department + or group of departments that have no sales over a given date range. + This is mostly for finding discontinued or mis-entered products.
          • +
          • Trends shows daily sales totals for items + over a given date range. Items can be included by UPC, department, + or manufacturer.
          • +
          • Monthly Movement shows monthly sales totals + for items or departments.
          • +
          • Movement by Price lists item sales with + a separate line for each price point. If an item was sold at more + than one price in the given date range, sales from each price + are listed separately.
          • +
          +
        • Sales Reports are a higher level collection generally relating to store-wide sales +
            +
          • General Sales Report shows total sales per + department for a given date range in dollars as well as a percentage + of store-wide sales.
          • +
          • General Costs Report shows total costs per + department for a given date range in dollars as well as a percentage + of store-wide costs. It uses actual item cost if known and estimates + cost from price and department margin if not; relies on department margins being accurate.
          • +
          • Today's Sales shows current day totals by hour.
          • +
          • Store Hourly Sales lists store-wide sales per hour + over a given date range.
          • +
          • Department Hourly Sales lists + sales per hour over a given date range for a subset of departments.
          • +
          +
        • Product List is a cross between a report and + a tool. It lists current item prices and status flags for a department or set + of departments but also allows editing.
        • +
        • Price History shows what prices an item as been + assigned over a given time period.
        • +
        • Department Settings provides a quick overview + of current department settings for margin, tax, and foodstamp status.
        • +
        • Open Rings shows UPC-less sales for a department or + group of departments over a given date range.
        • +
        • Batch Report lists sales for items in a + sales batch (or group of sales batches).
        • +
        • Customer Count lists the number of customers + per day, separated by membership type.
        • +
        + + diff --git a/fannie/src/CalendarControl.js b/fannie/src/CalendarControl.js new file mode 100644 index 000000000..94c9d8e0a --- /dev/null +++ b/fannie/src/CalendarControl.js @@ -0,0 +1,324 @@ +function positionInfo(object) { + + var p_elm = object; + + this.getElementLeft = getElementLeft; + function getElementLeft() { + var x = 0; + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + while (elm != null) { + x+= elm.offsetLeft; + elm = elm.offsetParent; + } + return parseInt(x); + } + + this.getElementWidth = getElementWidth; + function getElementWidth(){ + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + return parseInt(elm.offsetWidth); + } + + this.getElementRight = getElementRight; + function getElementRight(){ + return getElementLeft(p_elm) + getElementWidth(p_elm); + } + + this.getElementTop = getElementTop; + function getElementTop() { + var y = 0; + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + while (elm != null) { + y+= elm.offsetTop; + elm = elm.offsetParent; + } + return parseInt(y); + } + + this.getElementHeight = getElementHeight; + function getElementHeight(){ + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + return parseInt(elm.offsetHeight); + } + + this.getElementBottom = getElementBottom; + function getElementBottom(){ + return getElementTop(p_elm) + getElementHeight(p_elm); + } +} + +function CalendarControl() { + + var calendarId = 'CalendarControl'; + var currentYear = 0; + var currentMonth = 0; + var currentDay = 0; + + var selectedYear = 0; + var selectedMonth = 0; + var selectedDay = 0; + + var months = ['January','February','March','April','May','June','July','August','September','October','November','December']; + var dateField = null; + + function getProperty(p_property){ + var p_elm = calendarId; + var elm = null; + + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + if (elm != null){ + if(elm.style){ + elm = elm.style; + if(elm[p_property]){ + return elm[p_property]; + } else { + return null; + } + } else { + return null; + } + } + } + + function setElementProperty(p_property, p_value, p_elmId){ + var p_elm = p_elmId; + var elm = null; + + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + if((elm != null) && (elm.style != null)){ + elm = elm.style; + elm[ p_property ] = p_value; + } + } + + function setProperty(p_property, p_value) { + setElementProperty(p_property, p_value, calendarId); + } + + function getDaysInMonth(year, month) { + return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month-1]; + } + + function getDayOfWeek(year, month, day) { + var date = new Date(year,month-1,day) + return date.getDay(); + } + + this.setDate = setDate; + function setDate(year, month, day) { + if (dateField) { + if (month < 10) {month = "0" + month;} + if (day < 10) {day = "0" + day;} + + var dateString = year+"-"+month+"-"+day; + dateField.value = dateString; + hide(); + } + return; + } + + this.changeMonth = changeMonth; + function changeMonth(change) { + currentMonth += change; + currentDay = 0; + if(currentMonth > 12) { + currentMonth = 1; + currentYear++; + } else if(currentMonth < 1) { + currentMonth = 12; + currentYear--; + } + + calendar = document.getElementById(calendarId); + calendar.innerHTML = calendarDrawTable(); + } + + this.changeYear = changeYear; + function changeYear(change) { + currentYear += change; + currentDay = 0; + calendar = document.getElementById(calendarId); + calendar.innerHTML = calendarDrawTable(); + } + + function getCurrentYear() { + var year = new Date().getYear(); + if(year < 1900) year += 1900; + return year; + } + + function getCurrentMonth() { + return new Date().getMonth() + 1; + } + + function getCurrentDay() { + return new Date().getDate(); + } + + function calendarDrawTable() { + + var dayOfMonth = 1; + var validDay = 0; + var startDayOfWeek = getDayOfWeek(currentYear, currentMonth, dayOfMonth); + var daysInMonth = getDaysInMonth(currentYear, currentMonth); + var css_class = null; //CSS class for each day + + var table = ""; + table = table + ""; + table = table + " "; + table = table + " "; + table = table + " "; + table = table + ""; + table = table + ""; + + for(var week=0; week < 6; week++) { + table = table + ""; + for(var dayOfWeek=0; dayOfWeek < 7; dayOfWeek++) { + if(week == 0 && startDayOfWeek == dayOfWeek) { + validDay = 1; + } else if (validDay == 1 && dayOfMonth > daysInMonth) { + validDay = 0; + } + + if(validDay) { + if (dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth) { + css_class = 'current'; + } else if (dayOfWeek == 0 || dayOfWeek == 6) { + css_class = 'weekend'; + } else { + css_class = 'weekday'; + } + + table = table + ""; + dayOfMonth++; + } else { + table = table + ""; + } + } + table = table + ""; + } + + table = table + ""; + table = table + "
        < «" + months[currentMonth-1] + "
        " + currentYear + "
        » >
        SMTWTFS
        "+dayOfMonth+" 
        Close
        "; + + return table; + } + + this.show = show; + function show(field) { + + // If the calendar is visible and associated with + // this field do not do anything. + if (dateField == field) { + return; + } else { + dateField = field; + } + + if(dateField) { + try { + var dateString = new String(dateField.value); + var dateParts = dateString.split("-"); + + selectedMonth = parseInt(dateParts[0],10); + selectedDay = parseInt(dateParts[1],10); + selectedYear = parseInt(dateParts[2],10); + } catch(e) {} + } + + if (!(selectedYear && selectedMonth && selectedDay)) { + selectedMonth = getCurrentMonth(); + selectedDay = getCurrentDay(); + selectedYear = getCurrentYear(); + } + + currentMonth = selectedMonth; + currentDay = selectedDay; + currentYear = selectedYear; + + if(document.getElementById){ + + calendar = document.getElementById(calendarId); + calendar.innerHTML = calendarDrawTable(currentYear, currentMonth); + + setElementProperty('display', 'block', 'CalendarControlIFrame'); + setProperty('display', 'block'); + + var fieldPos = new positionInfo(dateField); + var calendarPos = new positionInfo(calendarId); + + var x = fieldPos.getElementLeft(); + var y = fieldPos.getElementBottom(); + + setProperty('left', x + "px"); + setProperty('top', y + "px"); + setElementProperty('left', x + "px", 'CalendarControlIFrame'); + setElementProperty('top', y + "px", 'CalendarControlIFrame'); + setElementProperty('width', calendarPos.getElementWidth() + "px", 'CalendarControlIFrame'); + setElementProperty('height', calendarPos.getElementHeight() + "px", 'CalendarControlIFrame'); + } + } + + this.hide = hide; + function hide() { + if(dateField) { + setProperty('display', 'none'); + setElementProperty('display', 'none', 'CalendarControlIFrame'); + dateField = null; + } + } +} + +var calendarControl = new CalendarControl(); + +function showCalendarControl(textField) { + textField.value = ''; + calendarControl.show(textField); +} + +function hideCalendarControl() { + calendarControl.hide(); +} + +function setCalendarControlDate(year, month, day) { + calendarControl.setDate(year, month, day); +} + +function changeCalendarControlYear(change) { + calendarControl.changeYear(change); +} + +function changeCalendarControlMonth(change) { + calendarControl.changeMonth(change); +} + +document.write(""); +document.write("
        "); diff --git a/fannie/src/CalendarControl_O.js b/fannie/src/CalendarControl_O.js new file mode 100644 index 000000000..c01d82a87 --- /dev/null +++ b/fannie/src/CalendarControl_O.js @@ -0,0 +1,323 @@ +function positionInfo(object) { + + var p_elm = object; + + this.getElementLeft = getElementLeft; + function getElementLeft() { + var x = 0; + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + while (elm != null) { + x+= elm.offsetLeft; + elm = elm.offsetParent; + } + return parseInt(x); + } + + this.getElementWidth = getElementWidth; + function getElementWidth(){ + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + return parseInt(elm.offsetWidth); + } + + this.getElementRight = getElementRight; + function getElementRight(){ + return getElementLeft(p_elm) + getElementWidth(p_elm); + } + + this.getElementTop = getElementTop; + function getElementTop() { + var y = 0; + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + while (elm != null) { + y+= elm.offsetTop; + elm = elm.offsetParent; + } + return parseInt(y); + } + + this.getElementHeight = getElementHeight; + function getElementHeight(){ + var elm; + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + return parseInt(elm.offsetHeight); + } + + this.getElementBottom = getElementBottom; + function getElementBottom(){ + return getElementTop(p_elm) + getElementHeight(p_elm); + } +} + +function CalendarControl() { + + var calendarId = 'CalendarControl'; + var currentYear = 0; + var currentMonth = 0; + var currentDay = 0; + + var selectedYear = 0; + var selectedMonth = 0; + var selectedDay = 0; + + var months = ['January','February','March','April','May','June','July','August','September','October','November','December']; + var dateField = null; + + function getProperty(p_property){ + var p_elm = calendarId; + var elm = null; + + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + if (elm != null){ + if(elm.style){ + elm = elm.style; + if(elm[p_property]){ + return elm[p_property]; + } else { + return null; + } + } else { + return null; + } + } + } + + function setElementProperty(p_property, p_value, p_elmId){ + var p_elm = p_elmId; + var elm = null; + + if(typeof(p_elm) == "object"){ + elm = p_elm; + } else { + elm = document.getElementById(p_elm); + } + if((elm != null) && (elm.style != null)){ + elm = elm.style; + elm[ p_property ] = p_value; + } + } + + function setProperty(p_property, p_value) { + setElementProperty(p_property, p_value, calendarId); + } + + function getDaysInMonth(year, month) { + return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month-1]; + } + + function getDayOfWeek(year, month, day) { + var date = new Date(year,month-1,day) + return date.getDay(); + } + + this.setDate = setDate; + function setDate(year, month, day) { + if (dateField) { + if (month < 10) {month = "0" + month;} + if (day < 10) {day = "0" + day;} + + var dateString = month+"-"+day+"-"+year; + dateField.value = dateString; + hide(); + } + return; + } + + this.changeMonth = changeMonth; + function changeMonth(change) { + currentMonth += change; + currentDay = 0; + if(currentMonth > 12) { + currentMonth = 1; + currentYear++; + } else if(currentMonth < 1) { + currentMonth = 12; + currentYear--; + } + + calendar = document.getElementById(calendarId); + calendar.innerHTML = calendarDrawTable(); + } + + this.changeYear = changeYear; + function changeYear(change) { + currentYear += change; + currentDay = 0; + calendar = document.getElementById(calendarId); + calendar.innerHTML = calendarDrawTable(); + } + + function getCurrentYear() { + var year = new Date().getYear(); + if(year < 1900) year += 1900; + return year; + } + + function getCurrentMonth() { + return new Date().getMonth() + 1; + } + + function getCurrentDay() { + return new Date().getDate(); + } + + function calendarDrawTable() { + + var dayOfMonth = 1; + var validDay = 0; + var startDayOfWeek = getDayOfWeek(currentYear, currentMonth, dayOfMonth); + var daysInMonth = getDaysInMonth(currentYear, currentMonth); + var css_class = null; //CSS class for each day + + var table = ""; + table = table + ""; + table = table + " "; + table = table + " "; + table = table + " "; + table = table + ""; + table = table + ""; + + for(var week=0; week < 6; week++) { + table = table + ""; + for(var dayOfWeek=0; dayOfWeek < 7; dayOfWeek++) { + if(week == 0 && startDayOfWeek == dayOfWeek) { + validDay = 1; + } else if (validDay == 1 && dayOfMonth > daysInMonth) { + validDay = 0; + } + + if(validDay) { + if (dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth) { + css_class = 'current'; + } else if (dayOfWeek == 0 || dayOfWeek == 6) { + css_class = 'weekend'; + } else { + css_class = 'weekday'; + } + + table = table + ""; + dayOfMonth++; + } else { + table = table + ""; + } + } + table = table + ""; + } + + table = table + ""; + table = table + "
        < «" + months[currentMonth-1] + "
        " + currentYear + "
        » >
        SMTWTFS
        "+dayOfMonth+" 
        Close
        "; + + return table; + } + + this.show = show; + function show(field) { + + // If the calendar is visible and associated with + // this field do not do anything. + if (dateField == field) { + return; + } else { + dateField = field; + } + + if(dateField) { + try { + var dateString = new String(dateField.value); + var dateParts = dateString.split("-"); + + selectedMonth = parseInt(dateParts[0],10); + selectedDay = parseInt(dateParts[1],10); + selectedYear = parseInt(dateParts[2],10); + } catch(e) {} + } + + if (!(selectedYear && selectedMonth && selectedDay)) { + selectedMonth = getCurrentMonth(); + selectedDay = getCurrentDay(); + selectedYear = getCurrentYear(); + } + + currentMonth = selectedMonth; + currentDay = selectedDay; + currentYear = selectedYear; + + if(document.getElementById){ + + calendar = document.getElementById(calendarId); + calendar.innerHTML = calendarDrawTable(currentYear, currentMonth); + + setElementProperty('display', 'block', 'CalendarControlIFrame'); + setProperty('display', 'block'); + + var fieldPos = new positionInfo(dateField); + var calendarPos = new positionInfo(calendarId); + + var x = fieldPos.getElementLeft(); + var y = fieldPos.getElementBottom(); + + setProperty('left', x + "px"); + setProperty('top', y + "px"); + setElementProperty('left', x + "px", 'CalendarControlIFrame'); + setElementProperty('top', y + "px", 'CalendarControlIFrame'); + setElementProperty('width', calendarPos.getElementWidth() + "px", 'CalendarControlIFrame'); + setElementProperty('height', calendarPos.getElementHeight() + "px", 'CalendarControlIFrame'); + } + } + + this.hide = hide; + function hide() { + if(dateField) { + setProperty('display', 'none'); + setElementProperty('display', 'none', 'CalendarControlIFrame'); + dateField = null; + } + } +} + +var calendarControl = new CalendarControl(); + +function showCalendarControl(textField) { + calendarControl.show(textField); +} + +function hideCalendarControl() { + calendarControl.hide(); +} + +function setCalendarControlDate(year, month, day) { + calendarControl.setDate(year, month, day); +} + +function changeCalendarControlYear(change) { + calendarControl.changeYear(change); +} + +function changeCalendarControlMonth(change) { + calendarControl.changeMonth(change); +} + +document.write(""); +document.write("
        "); diff --git a/fannie/src/Credentials/README b/fannie/src/Credentials/README new file mode 100644 index 000000000..5a46bb962 --- /dev/null +++ b/fannie/src/Credentials/README @@ -0,0 +1,3 @@ +Git ignores PHP files in this directory +so miscellaneous passwords and private stuff +can be safely stored here diff --git a/fannie/src/EanUpc.php b/fannie/src/EanUpc.php new file mode 100644 index 000000000..42297d378 --- /dev/null +++ b/fannie/src/EanUpc.php @@ -0,0 +1,64 @@ + diff --git a/fannie/src/Excel/README b/fannie/src/Excel/README new file mode 100644 index 000000000..5b8ed9394 --- /dev/null +++ b/fannie/src/Excel/README @@ -0,0 +1,25 @@ +INTRODUCTION +Read data from Excel spread sheets without Microsoft! +Provides an API to allow any application to read Excel +documents. Written in PHP. Based on the the Java version by Andy Khan. + +LINKS + +OpenOffice.org's Documentation +http://sc.openoffice.org/excelfileformat.pdf + +OLE2 Storage Documentation +http://jakarta.apache.org/poi/poifs/fileformat.html + +Java API for reading, writing and modifying the contents of Excel spreadsheets +http://www.andykhan.com/ + +CONTACT +Vadim Tkachenko +vt@apachephp.com + +INFO +For use encoding you must have installed iconv extension, otherwise data output in unicode + +HOW TO USE +see example.php \ No newline at end of file diff --git a/fannie/src/Excel/changelog.txt b/fannie/src/Excel/changelog.txt new file mode 100644 index 000000000..2b3fc5a8c --- /dev/null +++ b/fannie/src/Excel/changelog.txt @@ -0,0 +1,12 @@ +--------2k-------- +BugFix : +added patch by Rberto Innocenti - robyinno to fix infinite loop on 64 bit processors. +fixed order of operations error on date fields. - bizon153 + + +--------2j-------- +Features: +added example2.php which demonstrates a more feature rich use + +BugFix: +dates were being rolled back by one day \ No newline at end of file diff --git a/fannie/src/Excel/oleread.inc b/fannie/src/Excel/oleread.inc new file mode 100644 index 000000000..c7241aa86 --- /dev/null +++ b/fannie/src/Excel/oleread.inc @@ -0,0 +1,271 @@ +=4294967294) + { + $value=-2; + } + return $value; +} + + +class OLERead { + var $data = ''; + + + function OLERead(){ + + + } + + function read($sFileName){ + + // check if file exist and is readable (Darko Miljanovic) + if(!is_readable($sFileName)) { + $this->error = 1; + return false; + } + + $this->data = @file_get_contents($sFileName); + if (!$this->data) { + $this->error = 1; + return false; + } + //echo IDENTIFIER_OLE; + //echo 'start'; + if (substr($this->data, 0, 8) != IDENTIFIER_OLE) { + $this->error = 1; + return false; + } + $this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + $this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS); + $this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS); + $this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS); + $this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS); + + /* + echo $this->numBigBlockDepotBlocks." "; + echo $this->sbdStartBlock." "; + echo $this->rootStartBlock." "; + echo $this->extensionBlock." "; + echo $this->numExtensionBlocks." "; + */ + //echo "sbdStartBlock = $this->sbdStartBlock\n"; + $bigBlockDepotBlocks = array(); + $pos = BIG_BLOCK_DEPOT_BLOCKS_POS; + // echo "pos = $pos"; + $bbdBlocks = $this->numBigBlockDepotBlocks; + + if ($this->numExtensionBlocks != 0) { + $bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4; + } + + for ($i = 0; $i < $bbdBlocks; $i++) { + $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); + $pos += 4; + } + + + for ($j = 0; $j < $this->numExtensionBlocks; $j++) { + $pos = ($this->extensionBlock + 1) * BIG_BLOCK_SIZE; + $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1); + + for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) { + $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); + $pos += 4; + } + + $bbdBlocks += $blocksToRead; + if ($bbdBlocks < $this->numBigBlockDepotBlocks) { + $this->extensionBlock = GetInt4d($this->data, $pos); + } + } + + // var_dump($bigBlockDepotBlocks); + + // readBigBlockDepot + $pos = 0; + $index = 0; + $this->bigBlockChain = array(); + + for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) { + $pos = ($bigBlockDepotBlocks[$i] + 1) * BIG_BLOCK_SIZE; + //echo "pos = $pos"; + for ($j = 0 ; $j < BIG_BLOCK_SIZE / 4; $j++) { + $this->bigBlockChain[$index] = GetInt4d($this->data, $pos); + $pos += 4 ; + $index++; + } + } + + //var_dump($this->bigBlockChain); + //echo '=====2'; + // readSmallBlockDepot(); + $pos = 0; + $index = 0; + $sbdBlock = $this->sbdStartBlock; + $this->smallBlockChain = array(); + + while ($sbdBlock != -2) { + + $pos = ($sbdBlock + 1) * BIG_BLOCK_SIZE; + + for ($j = 0; $j < BIG_BLOCK_SIZE / 4; $j++) { + $this->smallBlockChain[$index] = GetInt4d($this->data, $pos); + $pos += 4; + $index++; + } + + $sbdBlock = $this->bigBlockChain[$sbdBlock]; + } + + + // readData(rootStartBlock) + $block = $this->rootStartBlock; + $pos = 0; + $this->entry = $this->__readData($block); + + /* + while ($block != -2) { + $pos = ($block + 1) * BIG_BLOCK_SIZE; + $this->entry = $this->entry.substr($this->data, $pos, BIG_BLOCK_SIZE); + $block = $this->bigBlockChain[$block]; + } + */ + //echo '==='.$this->entry."==="; + $this->__readPropertySets(); + + } + + function __readData($bl) { + $block = $bl; + $pos = 0; + $data = ''; + + while ($block != -2) { + $pos = ($block + 1) * BIG_BLOCK_SIZE; + $data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE); + //echo "pos = $pos data=$data\n"; + $block = $this->bigBlockChain[$block]; + } + return $data; + } + + function __readPropertySets(){ + $offset = 0; + //var_dump($this->entry); + while ($offset < strlen($this->entry)) { + $d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE); + + $nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) << 8); + + $type = ord($d[TYPE_POS]); + //$maxBlock = strlen($d) / BIG_BLOCK_SIZE - 1; + + $startBlock = GetInt4d($d, START_BLOCK_POS); + $size = GetInt4d($d, SIZE_POS); + + $name = ''; + for ($i = 0; $i < $nameSize ; $i++) { + $name .= $d[$i]; + } + + $name = str_replace("\x00", "", $name); + + $this->props[] = array ( + 'name' => $name, + 'type' => $type, + 'startBlock' => $startBlock, + 'size' => $size); + + if (($name == "Workbook") || ($name == "Book")) { + $this->wrkbook = count($this->props) - 1; + } + + if ($name == "Root Entry") { + $this->rootentry = count($this->props) - 1; + } + + //echo "name ==$name=\n"; + + + $offset += PROPERTY_STORAGE_BLOCK_SIZE; + } + + } + + + function getWorkBook(){ + if ($this->props[$this->wrkbook]['size'] < SMALL_BLOCK_THRESHOLD){ +// getSmallBlockStream(PropertyStorage ps) + + $rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']); + + $streamData = ''; + $block = $this->props[$this->wrkbook]['startBlock']; + //$count = 0; + $pos = 0; + while ($block != -2) { + $pos = $block * SMALL_BLOCK_SIZE; + $streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE); + + $block = $this->smallBlockChain[$block]; + } + + return $streamData; + + + }else{ + + $numBlocks = $this->props[$this->wrkbook]['size'] / BIG_BLOCK_SIZE; + if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) { + $numBlocks++; + } + + if ($numBlocks == 0) return ''; + + //echo "numBlocks = $numBlocks\n"; + //byte[] streamData = new byte[numBlocks * BIG_BLOCK_SIZE]; + //print_r($this->wrkbook); + $streamData = ''; + $block = $this->props[$this->wrkbook]['startBlock']; + //$count = 0; + $pos = 0; + //echo "block = $block"; + while ($block != -2) { + $pos = ($block + 1) * BIG_BLOCK_SIZE; + $streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE); + $block = $this->bigBlockChain[$block]; + } + //echo 'stream'.$streamData; + return $streamData; + } + } + +} +?> \ No newline at end of file diff --git a/fannie/src/Excel/reader.php b/fannie/src/Excel/reader.php new file mode 100644 index 000000000..d5e1efcf5 --- /dev/null +++ b/fannie/src/Excel/reader.php @@ -0,0 +1,1084 @@ + +* @license http://www.php.net/license/3_0.txt PHP License 3.0 +* @version CVS: $Id: reader.php 19 2007-03-13 12:42:41Z shangxiao $ +* @link http://pear.php.net/package/Spreadsheet_Excel_Reader +* @see OLE, Spreadsheet_Excel_Writer +*/ + + +//require_once 'PEAR.php'; +require_once dirname(__FILE__).'/oleread.inc'; +//require_once 'OLE.php'; + +define('SPREADSHEET_EXCEL_READER_BIFF8', 0x600); +define('SPREADSHEET_EXCEL_READER_BIFF7', 0x500); +define('SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS', 0x5); +define('SPREADSHEET_EXCEL_READER_WORKSHEET', 0x10); + +define('SPREADSHEET_EXCEL_READER_TYPE_BOF', 0x809); +define('SPREADSHEET_EXCEL_READER_TYPE_EOF', 0x0a); +define('SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET', 0x85); +define('SPREADSHEET_EXCEL_READER_TYPE_DIMENSION', 0x200); +define('SPREADSHEET_EXCEL_READER_TYPE_ROW', 0x208); +define('SPREADSHEET_EXCEL_READER_TYPE_DBCELL', 0xd7); +define('SPREADSHEET_EXCEL_READER_TYPE_FILEPASS', 0x2f); +define('SPREADSHEET_EXCEL_READER_TYPE_NOTE', 0x1c); +define('SPREADSHEET_EXCEL_READER_TYPE_TXO', 0x1b6); +define('SPREADSHEET_EXCEL_READER_TYPE_RK', 0x7e); +define('SPREADSHEET_EXCEL_READER_TYPE_RK2', 0x27e); +define('SPREADSHEET_EXCEL_READER_TYPE_MULRK', 0xbd); +define('SPREADSHEET_EXCEL_READER_TYPE_MULBLANK', 0xbe); +define('SPREADSHEET_EXCEL_READER_TYPE_INDEX', 0x20b); +define('SPREADSHEET_EXCEL_READER_TYPE_SST', 0xfc); +define('SPREADSHEET_EXCEL_READER_TYPE_EXTSST', 0xff); +define('SPREADSHEET_EXCEL_READER_TYPE_CONTINUE', 0x3c); +define('SPREADSHEET_EXCEL_READER_TYPE_LABEL', 0x204); +define('SPREADSHEET_EXCEL_READER_TYPE_LABELSST', 0xfd); +define('SPREADSHEET_EXCEL_READER_TYPE_NUMBER', 0x203); +define('SPREADSHEET_EXCEL_READER_TYPE_NAME', 0x18); +define('SPREADSHEET_EXCEL_READER_TYPE_ARRAY', 0x221); +define('SPREADSHEET_EXCEL_READER_TYPE_STRING', 0x207); +define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA', 0x406); +define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA2', 0x6); +define('SPREADSHEET_EXCEL_READER_TYPE_FORMAT', 0x41e); +define('SPREADSHEET_EXCEL_READER_TYPE_XF', 0xe0); +define('SPREADSHEET_EXCEL_READER_TYPE_BOOLERR', 0x205); +define('SPREADSHEET_EXCEL_READER_TYPE_UNKNOWN', 0xffff); +define('SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR', 0x22); +define('SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS', 0xE5); + +define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS' , 25569); +define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904', 24107); +define('SPREADSHEET_EXCEL_READER_MSINADAY', 86400); +//define('SPREADSHEET_EXCEL_READER_MSINADAY', 24 * 60 * 60); + +//define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%.2f"); +define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%s"); + + +/* +* Place includes, constant defines and $_GLOBAL settings here. +* Make sure they have appropriate docblocks to avoid phpDocumentor +* construing they are documented by the page-level docblock. +*/ + +/** +* A class for reading Microsoft Excel Spreadsheets. +* +* Originally developed by Vadim Tkachenko under the name PHPExcelReader. +* (http://sourceforge.net/projects/phpexcelreader) +* Based on the Java version by Andy Khan (http://www.andykhan.com). Now +* maintained by David Sanders. Reads only Biff 7 and Biff 8 formats. +* +* @category Spreadsheet +* @package Spreadsheet_Excel_Reader +* @author Vadim Tkachenko +* @copyright 1997-2005 The PHP Group +* @license http://www.php.net/license/3_0.txt PHP License 3.0 +* @version Release: @package_version@ +* @link http://pear.php.net/package/PackageName +* @see OLE, Spreadsheet_Excel_Writer +*/ +class Spreadsheet_Excel_Reader +{ + /** + * Array of worksheets found + * + * @var array + * @access public + */ + var $boundsheets = array(); + + /** + * Array of format records found + * + * @var array + * @access public + */ + var $formatRecords = array(); + + /** + * todo + * + * @var array + * @access public + */ + var $sst = array(); + + /** + * Array of worksheets + * + * The data is stored in 'cells' and the meta-data is stored in an array + * called 'cellsInfo' + * + * Example: + * + * $sheets --> 'cells' --> row --> column --> Interpreted value + * --> 'cellsInfo' --> row --> column --> 'type' - Can be 'date', 'number', or 'unknown' + * --> 'raw' - The raw data that Excel stores for that data cell + * + * @var array + * @access public + */ + var $sheets = array(); + + /** + * The data returned by OLE + * + * @var string + * @access public + */ + var $data; + + /** + * OLE object for reading the file + * + * @var OLE object + * @access private + */ + var $_ole; + + /** + * Default encoding + * + * @var string + * @access private + */ + var $_defaultEncoding; + + /** + * Default number format + * + * @var integer + * @access private + */ + var $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT; + + /** + * todo + * List of formats to use for each column + * + * @var array + * @access private + */ + var $_columnsFormat = array(); + + /** + * todo + * + * @var integer + * @access private + */ + var $_rowoffset = 1; + + /** + * todo + * + * @var integer + * @access private + */ + var $_coloffset = 1; + + /** + * List of default date formats used by Excel + * + * @var array + * @access public + */ + var $dateFormats = array ( + 0xe => "d/m/Y", + 0xf => "d-M-Y", + 0x10 => "d-M", + 0x11 => "M-Y", + 0x12 => "h:i a", + 0x13 => "h:i:s a", + 0x14 => "H:i", + 0x15 => "H:i:s", + 0x16 => "d/m/Y H:i", + 0x2d => "i:s", + 0x2e => "H:i:s", + 0x2f => "i:s.S"); + + /** + * Default number formats used by Excel + * + * @var array + * @access public + */ + var $numberFormats = array( + 0x1 => "%1.0f", // "0" + 0x2 => "%1.2f", // "0.00", + 0x3 => "%1.0f", //"#,##0", + 0x4 => "%1.2f", //"#,##0.00", + 0x5 => "%1.0f", /*"$#,##0;($#,##0)",*/ + 0x6 => '$%1.0f', /*"$#,##0;($#,##0)",*/ + 0x7 => '$%1.2f', //"$#,##0.00;($#,##0.00)", + 0x8 => '$%1.2f', //"$#,##0.00;($#,##0.00)", + 0x9 => '%1.0f%%', // "0%" + 0xa => '%1.2f%%', // "0.00%" + 0xb => '%1.2f', // 0.00E00", + 0x25 => '%1.0f', // "#,##0;(#,##0)", + 0x26 => '%1.0f', //"#,##0;(#,##0)", + 0x27 => '%1.2f', //"#,##0.00;(#,##0.00)", + 0x28 => '%1.2f', //"#,##0.00;(#,##0.00)", + 0x29 => '%1.0f', //"#,##0;(#,##0)", + 0x2a => '$%1.0f', //"$#,##0;($#,##0)", + 0x2b => '%1.2f', //"#,##0.00;(#,##0.00)", + 0x2c => '$%1.2f', //"$#,##0.00;($#,##0.00)", + 0x30 => '%1.0f'); //"##0.0E0"; + + // }}} + // {{{ Spreadsheet_Excel_Reader() + + /** + * Constructor + * + * Some basic initialisation + */ + function Spreadsheet_Excel_Reader() + { + $this->_ole =& new OLERead(); + $this->setUTFEncoder('iconv'); + } + + // }}} + // {{{ setOutputEncoding() + + /** + * Set the encoding method + * + * @param string Encoding to use + * @access public + */ + function setOutputEncoding($encoding) + { + $this->_defaultEncoding = $encoding; + } + + // }}} + // {{{ setUTFEncoder() + + /** + * $encoder = 'iconv' or 'mb' + * set iconv if you would like use 'iconv' for encode UTF-16LE to your encoding + * set mb if you would like use 'mb_convert_encoding' for encode UTF-16LE to your encoding + * + * @access public + * @param string Encoding type to use. Either 'iconv' or 'mb' + */ + function setUTFEncoder($encoder = 'iconv') + { + $this->_encoderFunction = ''; + + if ($encoder == 'iconv') { + $this->_encoderFunction = function_exists('iconv') ? 'iconv' : ''; + } elseif ($encoder == 'mb') { + $this->_encoderFunction = function_exists('mb_convert_encoding') ? + 'mb_convert_encoding' : + ''; + } + } + + // }}} + // {{{ setRowColOffset() + + /** + * todo + * + * @access public + * @param offset + */ + function setRowColOffset($iOffset) + { + $this->_rowoffset = $iOffset; + $this->_coloffset = $iOffset; + } + + // }}} + // {{{ setDefaultFormat() + + /** + * Set the default number format + * + * @access public + * @param Default format + */ + function setDefaultFormat($sFormat) + { + $this->_defaultFormat = $sFormat; + } + + // }}} + // {{{ setColumnFormat() + + /** + * Force a column to use a certain format + * + * @access public + * @param integer Column number + * @param string Format + */ + function setColumnFormat($column, $sFormat) + { + $this->_columnsFormat[$column] = $sFormat; + } + + + // }}} + // {{{ read() + + /** + * Read the spreadsheet file using OLE, then parse + * + * @access public + * @param filename + * @todo return a valid value + */ + function read($sFileName) + { + /* + require_once 'OLE.php'; + $ole = new OLE(); + $ole->read($sFileName); + + foreach ($ole->_list as $i => $pps) { + if (($pps->Name == 'Workbook' || $pps->Name == 'Book') && + $pps->Size >= SMALL_BLOCK_THRESHOLD) { + + $this->data = $ole->getData($i, 0, $ole->getDataLength($i)); + } elseif ($pps->Name == 'Root Entry') { + $this->data = $ole->getData($i, 0, $ole->getDataLength($i)); + } + //var_dump(strlen($ole->getData($i, 0, $ole->getDataLength($i))), $pps->Name, md5($this->data), $ole->getDataLength($i)); + } +//exit; + $this->_parse(); + + return sizeof($this->sheets) > 0; + */ + + $res = $this->_ole->read($sFileName); + + // oops, something goes wrong (Darko Miljanovic) + if($res === false) { + // check error code + if($this->_ole->error == 1) { + // bad file + die('The filename ' . $sFileName . ' is not readable'); + } + // check other error codes here (eg bad fileformat, etc...) + } + + $this->data = $this->_ole->getWorkBook(); + + + /* + $res = $this->_ole->read($sFileName); + + if ($this->isError($res)) { +// var_dump($res); + return $this->raiseError($res); + } + + $total = $this->_ole->ppsTotal(); + for ($i = 0; $i < $total; $i++) { + if ($this->_ole->isFile($i)) { + $type = unpack("v", $this->_ole->getData($i, 0, 2)); + if ($type[''] == 0x0809) { // check if it's a BIFF stream + $this->_index = $i; + $this->data = $this->_ole->getData($i, 0, $this->_ole->getDataLength($i)); + break; + } + } + } + + if ($this->_index === null) { + return $this->raiseError("$file doesn't seem to be an Excel file"); + } + + */ + + //echo "data =".$this->data; + //$this->readRecords(); + $this->_parse(); + } + + + // }}} + // {{{ _parse() + + /** + * Parse a workbook + * + * @access private + * @return bool + */ + function _parse() + { + $pos = 0; + + $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; + $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; + + $version = ord($this->data[$pos + 4]) | ord($this->data[$pos + 5])<<8; + $substreamType = ord($this->data[$pos + 6]) | ord($this->data[$pos + 7])<<8; + //echo "Start parse code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10,16).""."\n"; + + if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && + ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { + return false; + } + + if ($substreamType != SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS){ + return false; + } + + //print_r($rec); + $pos += $length + 4; + + $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; + $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; + + while ($code != SPREADSHEET_EXCEL_READER_TYPE_EOF) { + switch ($code) { + case SPREADSHEET_EXCEL_READER_TYPE_SST: + //echo "Type_SST\n"; + $spos = $pos + 4; + $limitpos = $spos + $length; + $uniqueStrings = $this->_GetInt4d($this->data, $spos+4); + $spos += 8; + for ($i = 0; $i < $uniqueStrings; $i++) { + // Read in the number of characters + if ($spos == $limitpos) { + $opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + if ($opcode != 0x3c) { + return -1; + } + $spos += 4; + $limitpos = $spos + $conlength; + } + $numChars = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8); + //echo "i = $i pos = $pos numChars = $numChars "; + $spos += 2; + $optionFlags = ord($this->data[$spos]); + $spos++; + $asciiEncoding = (($optionFlags & 0x01) == 0) ; + $extendedString = ( ($optionFlags & 0x04) != 0); + + // See if string contains formatting information + $richString = ( ($optionFlags & 0x08) != 0); + + if ($richString) { + // Read in the crun + $formattingRuns = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8); + $spos += 2; + } + + if ($extendedString) { + // Read in cchExtRst + $extendedRunLength = $this->_GetInt4d($this->data, $spos); + $spos += 4; + } + + $len = ($asciiEncoding)? $numChars : $numChars*2; + if ($spos + $len < $limitpos) { + $retstr = substr($this->data, $spos, $len); + $spos += $len; + }else{ + // found countinue + $retstr = substr($this->data, $spos, $limitpos - $spos); + $bytesRead = $limitpos - $spos; + $charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2)); + $spos = $limitpos; + + while ($charsLeft > 0){ + $opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + if ($opcode != 0x3c) { + return -1; + } + $spos += 4; + $limitpos = $spos + $conlength; + $option = ord($this->data[$spos]); + $spos += 1; + if ($asciiEncoding && ($option == 0)) { + $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); + $retstr .= substr($this->data, $spos, $len); + $charsLeft -= $len; + $asciiEncoding = true; + }elseif (!$asciiEncoding && ($option != 0)){ + $len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength); + $retstr .= substr($this->data, $spos, $len); + $charsLeft -= $len/2; + $asciiEncoding = false; + }elseif (!$asciiEncoding && ($option == 0)) { + // Bummer - the string starts off as Unicode, but after the + // continuation it is in straightforward ASCII encoding + $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); + for ($j = 0; $j < $len; $j++) { + $retstr .= $this->data[$spos + $j].chr(0); + } + $charsLeft -= $len; + $asciiEncoding = false; + }else{ + $newstr = ''; + for ($j = 0; $j < strlen($retstr); $j++) { + $newstr = $retstr[$j].chr(0); + } + $retstr = $newstr; + $len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength); + $retstr .= substr($this->data, $spos, $len); + $charsLeft -= $len/2; + $asciiEncoding = false; + //echo "Izavrat\n"; + } + $spos += $len; + + } + } + $retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr); +// echo "Str $i = $retstr\n"; + if ($richString){ + $spos += 4 * $formattingRuns; + } + + // For extended strings, skip over the extended string data + if ($extendedString) { + $spos += $extendedRunLength; + } + //if ($retstr == 'Derby'){ + // echo "bb\n"; + //} + $this->sst[]=$retstr; + } + /*$continueRecords = array(); + while ($this->getNextCode() == Type_CONTINUE) { + $continueRecords[] = &$this->nextRecord(); + } + //echo " 1 Type_SST\n"; + $this->shareStrings = new SSTRecord($r, $continueRecords); + //print_r($this->shareStrings->strings); + */ + // echo 'SST read: '.($time_end-$time_start)."\n"; + break; + + case SPREADSHEET_EXCEL_READER_TYPE_FILEPASS: + return false; + break; + case SPREADSHEET_EXCEL_READER_TYPE_NAME: + //echo "Type_NAME\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_FORMAT: + $indexCode = ord($this->data[$pos+4]) | ord($this->data[$pos+5]) << 8; + + if ($version == SPREADSHEET_EXCEL_READER_BIFF8) { + $numchars = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8; + if (ord($this->data[$pos+8]) == 0){ + $formatString = substr($this->data, $pos+9, $numchars); + } else { + $formatString = substr($this->data, $pos+9, $numchars*2); + } + } else { + $numchars = ord($this->data[$pos+6]); + $formatString = substr($this->data, $pos+7, $numchars*2); + } + + $this->formatRecords[$indexCode] = $formatString; + // echo "Type.FORMAT\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_XF: + //global $dateFormats, $numberFormats; + $indexCode = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8; + //echo "\nType.XF ".count($this->formatRecords['xfrecords'])." $indexCode "; + if (array_key_exists($indexCode, $this->dateFormats)) { + //echo "isdate ".$dateFormats[$indexCode]; + $this->formatRecords['xfrecords'][] = array( + 'type' => 'date', + 'format' => $this->dateFormats[$indexCode] + ); + }elseif (array_key_exists($indexCode, $this->numberFormats)) { + //echo "isnumber ".$this->numberFormats[$indexCode]; + $this->formatRecords['xfrecords'][] = array( + 'type' => 'number', + 'format' => $this->numberFormats[$indexCode] + ); + }else{ + $isdate = FALSE; + if ($indexCode > 0){ + if (isset($this->formatRecords[$indexCode])) + $formatstr = $this->formatRecords[$indexCode]; + //echo '.other.'; + //echo "\ndate-time=$formatstr=\n"; + if ($formatstr) + if (preg_match("/[^hmsday\/\-:\s]/i", $formatstr) == 0) { // found day and time format + $isdate = TRUE; + $formatstr = str_replace('mm', 'i', $formatstr); + $formatstr = str_replace('h', 'H', $formatstr); + //echo "\ndate-time $formatstr \n"; + } + } + + if ($isdate){ + $this->formatRecords['xfrecords'][] = array( + 'type' => 'date', + 'format' => $formatstr, + ); + }else{ + $this->formatRecords['xfrecords'][] = array( + 'type' => 'other', + 'format' => '', + 'code' => $indexCode + ); + } + } + //echo "\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR: + //echo "Type.NINETEENFOUR\n"; + $this->nineteenFour = (ord($this->data[$pos+4]) == 1); + break; + case SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET: + //echo "Type.BOUNDSHEET\n"; + $rec_offset = $this->_GetInt4d($this->data, $pos+4); + $rec_typeFlag = ord($this->data[$pos+8]); + $rec_visibilityFlag = ord($this->data[$pos+9]); + $rec_length = ord($this->data[$pos+10]); + + if ($version == SPREADSHEET_EXCEL_READER_BIFF8){ + $chartype = ord($this->data[$pos+11]); + if ($chartype == 0){ + $rec_name = substr($this->data, $pos+12, $rec_length); + } else { + $rec_name = $this->_encodeUTF16(substr($this->data, $pos+12, $rec_length*2)); + } + }elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){ + $rec_name = substr($this->data, $pos+11, $rec_length); + } + $this->boundsheets[] = array('name'=>$rec_name, + 'offset'=>$rec_offset); + + break; + + } + + //echo "Code = ".base_convert($r['code'],10,16)."\n"; + $pos += $length + 4; + $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; + $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; + + //$r = &$this->nextRecord(); + //echo "1 Code = ".base_convert($r['code'],10,16)."\n"; + } + + foreach ($this->boundsheets as $key=>$val){ + $this->sn = $key; + $this->_parsesheet($val['offset']); + } + return true; + + } + + /** + * Parse a worksheet + * + * @access private + * @param todo + * @todo fix return codes + */ + function _parsesheet($spos) + { + $cont = true; + // read BOF + $code = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + + $version = ord($this->data[$spos + 4]) | ord($this->data[$spos + 5])<<8; + $substreamType = ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8; + + if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { + return -1; + } + + if ($substreamType != SPREADSHEET_EXCEL_READER_WORKSHEET){ + return -2; + } + //echo "Start parse code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10,16).""."\n"; + $spos += $length + 4; + //var_dump($this->formatRecords); + //echo "code $code $length"; + while($cont) { + //echo "mem= ".memory_get_usage()."\n"; +// $r = &$this->file->nextRecord(); + $lowcode = ord($this->data[$spos]); + if ($lowcode == SPREADSHEET_EXCEL_READER_TYPE_EOF) break; + $code = $lowcode | ord($this->data[$spos+1])<<8; + $length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $spos += 4; + $this->sheets[$this->sn]['maxrow'] = $this->_rowoffset - 1; + $this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1; + //echo "Code=".base_convert($code,10,16)." $code\n"; + unset($this->rectype); + $this->multiplier = 1; // need for format with % + switch ($code) { + case SPREADSHEET_EXCEL_READER_TYPE_DIMENSION: + //echo 'Type_DIMENSION '; + if (!isset($this->numRows)) { + if (($length == 10) || ($version == SPREADSHEET_EXCEL_READER_BIFF7)){ + $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+2]) | ord($this->data[$spos+3]) << 8; + $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+6]) | ord($this->data[$spos+7]) << 8; + } else { + $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; + $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+10]) | ord($this->data[$spos+11]) << 8; + } + } + //echo 'numRows '.$this->numRows.' '.$this->numCols."\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS: + $cellRanges = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + for ($i = 0; $i < $cellRanges; $i++) { + $fr = ord($this->data[$spos + 8*$i + 2]) | ord($this->data[$spos + 8*$i + 3])<<8; + $lr = ord($this->data[$spos + 8*$i + 4]) | ord($this->data[$spos + 8*$i + 5])<<8; + $fc = ord($this->data[$spos + 8*$i + 6]) | ord($this->data[$spos + 8*$i + 7])<<8; + $lc = ord($this->data[$spos + 8*$i + 8]) | ord($this->data[$spos + 8*$i + 9])<<8; + //$this->sheets[$this->sn]['mergedCells'][] = array($fr + 1, $fc + 1, $lr + 1, $lc + 1); + if ($lr - $fr > 0) { + $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['rowspan'] = $lr - $fr + 1; + } + if ($lc - $fc > 0) { + $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['colspan'] = $lc - $fc + 1; + } + } + //echo "Merged Cells $cellRanges $lr $fr $lc $fc\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_RK: + case SPREADSHEET_EXCEL_READER_TYPE_RK2: + //echo 'SPREADSHEET_EXCEL_READER_TYPE_RK'."\n"; + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $rknum = $this->_GetInt4d($this->data, $spos + 6); + $numValue = $this->_GetIEEE754($rknum); + //echo $numValue." "; + if ($this->isDate($spos)) { + list($string, $raw) = $this->createDate($numValue); + }else{ + $raw = $numValue; + if (isset($this->_columnsFormat[$column + 1])){ + $this->curformat = $this->_columnsFormat[$column + 1]; + } + $string = sprintf($this->curformat, $numValue * $this->multiplier); + //$this->addcell(RKRecord($r)); + } + $this->addcell($row, $column, $string, $raw); + //echo "Type_RK $row $column $string $raw {$this->curformat}\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_LABELSST: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5])<<8; + $index = $this->_GetInt4d($this->data, $spos + 6); + //var_dump($this->sst); + $this->addcell($row, $column, $this->sst[$index]); + //echo "LabelSST $row $column $string\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_MULRK: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $colFirst = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $colLast = ord($this->data[$spos + $length - 2]) | ord($this->data[$spos + $length - 1])<<8; + $columns = $colLast - $colFirst + 1; + $tmppos = $spos+4; + for ($i = 0; $i < $columns; $i++) { + $numValue = $this->_GetIEEE754($this->_GetInt4d($this->data, $tmppos + 2)); + if ($this->isDate($tmppos-4)) { + list($string, $raw) = $this->createDate($numValue); + }else{ + $raw = $numValue; + if (isset($this->_columnsFormat[$colFirst + $i + 1])){ + $this->curformat = $this->_columnsFormat[$colFirst + $i + 1]; + } + $string = sprintf($this->curformat, $numValue * $this->multiplier); + } + //$rec['rknumbers'][$i]['xfindex'] = ord($rec['data'][$pos]) | ord($rec['data'][$pos+1]) << 8; + $tmppos += 6; + $this->addcell($row, $colFirst + $i, $string, $raw); + //echo "MULRK $row ".($colFirst + $i)." $string\n"; + } + //MulRKRecord($r); + // Get the individual cell records from the multiple record + //$num = ; + + break; + case SPREADSHEET_EXCEL_READER_TYPE_NUMBER: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent + if ($this->isDate($spos)) { + list($string, $raw) = $this->createDate($tmp['double']); + // $this->addcell(DateRecord($r, 1)); + }else{ + //$raw = $tmp['']; + if (isset($this->_columnsFormat[$column + 1])){ + $this->curformat = $this->_columnsFormat[$column + 1]; + } + $raw = $this->createNumber($spos); + $string = sprintf($this->curformat, $raw * $this->multiplier); + + // $this->addcell(NumberRecord($r)); + } + $this->addcell($row, $column, $string, $raw); + //echo "Number $row $column $string\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_FORMULA: + case SPREADSHEET_EXCEL_READER_TYPE_FORMULA2: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + if ((ord($this->data[$spos+6])==0) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //String formula. Result follows in a STRING record + //echo "FORMULA $row $column Formula with a string
        \n"; + } elseif ((ord($this->data[$spos+6])==1) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //Boolean formula. Result is in +2; 0=false,1=true + } elseif ((ord($this->data[$spos+6])==2) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //Error formula. Error code is in +2; + } elseif ((ord($this->data[$spos+6])==3) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //Formula result is a null string. + } else { + // result is a number, so first 14 bytes are just like a _NUMBER record + $tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent + if ($this->isDate($spos)) { + list($string, $raw) = $this->createDate($tmp['double']); + // $this->addcell(DateRecord($r, 1)); + }else{ + //$raw = $tmp['']; + if (isset($this->_columnsFormat[$column + 1])){ + $this->curformat = $this->_columnsFormat[$column + 1]; + } + $raw = $this->createNumber($spos); + $string = sprintf($this->curformat, $raw * $this->multiplier); + + // $this->addcell(NumberRecord($r)); + } + $this->addcell($row, $column, $string, $raw); + //echo "Number $row $column $string\n"; + } + break; + case SPREADSHEET_EXCEL_READER_TYPE_BOOLERR: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $string = ord($this->data[$spos+6]); + $this->addcell($row, $column, $string); + //echo 'Type_BOOLERR '."\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_ROW: + case SPREADSHEET_EXCEL_READER_TYPE_DBCELL: + case SPREADSHEET_EXCEL_READER_TYPE_MULBLANK: + break; + case SPREADSHEET_EXCEL_READER_TYPE_LABEL: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $this->addcell($row, $column, substr($this->data, $spos + 8, ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8)); + + // $this->addcell(LabelRecord($r)); + break; + + case SPREADSHEET_EXCEL_READER_TYPE_EOF: + $cont = false; + break; + default: + //echo ' unknown :'.base_convert($r['code'],10,16)."\n"; + break; + + } + $spos += $length; + } + + if (!isset($this->sheets[$this->sn]['numRows'])) + $this->sheets[$this->sn]['numRows'] = $this->sheets[$this->sn]['maxrow']; + if (!isset($this->sheets[$this->sn]['numCols'])) + $this->sheets[$this->sn]['numCols'] = $this->sheets[$this->sn]['maxcol']; + + } + + /** + * Check whether the current record read is a date + * + * @param todo + * @return boolean True if date, false otherwise + */ + function isDate($spos) + { + //$xfindex = GetInt2d(, 4); + $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; + //echo 'check is date '.$xfindex.' '.$this->formatRecords['xfrecords'][$xfindex]['type']."\n"; + //var_dump($this->formatRecords['xfrecords'][$xfindex]); + if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'date') { + $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format']; + $this->rectype = 'date'; + return true; + } else { + if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'number') { + $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format']; + $this->rectype = 'number'; + if (($xfindex == 0x9) || ($xfindex == 0xa)){ + $this->multiplier = 100; + } + }else{ + $this->curformat = $this->_defaultFormat; + $this->rectype = 'unknown'; + } + return false; + } + } + + //}}} + //{{{ createDate() + + /** + * Convert the raw Excel date into a human readable format + * + * Dates in Excel are stored as number of seconds from an epoch. On + * Windows, the epoch is 30/12/1899 and on Mac it's 01/01/1904 + * + * @access private + * @param integer The raw Excel value to convert + * @return array First element is the converted date, the second element is number a unix timestamp + */ + function createDate($numValue) + { + if ($numValue > 1) { + $utcDays = $numValue - ($this->nineteenFour ? SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS); + $utcValue = round(($utcDays+1) * SPREADSHEET_EXCEL_READER_MSINADAY); + $string = date ($this->curformat, $utcValue); + $raw = $utcValue; + } else { + $raw = $numValue; + $hours = floor($numValue * 24); + $mins = floor($numValue * 24 * 60) - $hours * 60; + $secs = floor($numValue * SPREADSHEET_EXCEL_READER_MSINADAY) - $hours * 60 * 60 - $mins * 60; + $string = date ($this->curformat, mktime($hours, $mins, $secs)); + } + + return array($string, $raw); + } + + function createNumber($spos) + { + $rknumhigh = $this->_GetInt4d($this->data, $spos + 10); + $rknumlow = $this->_GetInt4d($this->data, $spos + 6); + //for ($i=0; $i<8; $i++) { echo ord($this->data[$i+$spos+6]) . " "; } echo "
        "; + $sign = ($rknumhigh & 0x80000000) >> 31; + $exp = ($rknumhigh & 0x7ff00000) >> 20; + $mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); + $mantissalow1 = ($rknumlow & 0x80000000) >> 31; + $mantissalow2 = ($rknumlow & 0x7fffffff); + $value = $mantissa / pow( 2 , (20- ($exp - 1023))); + if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023))); + $value += $mantissalow2 / pow (2 , (52 - ($exp - 1023))); + //echo "Sign = $sign, Exp = $exp, mantissahighx = $mantissa, mantissalow1 = $mantissalow1, mantissalow2 = $mantissalow2
        \n"; + if ($sign) {$value = -1 * $value;} + return $value; + } + + function addcell($row, $col, $string, $raw = '') + { + //echo "ADD cel $row-$col $string\n"; + $this->sheets[$this->sn]['maxrow'] = max($this->sheets[$this->sn]['maxrow'], $row + $this->_rowoffset); + $this->sheets[$this->sn]['maxcol'] = max($this->sheets[$this->sn]['maxcol'], $col + $this->_coloffset); + $this->sheets[$this->sn]['cells'][$row + $this->_rowoffset][$col + $this->_coloffset] = $string; + if ($raw) + $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['raw'] = $raw; + if (isset($this->rectype)) + $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['type'] = $this->rectype; + + } + + + function _GetIEEE754($rknum) + { + if (($rknum & 0x02) != 0) { + $value = $rknum >> 2; + } else { +//mmp +// first comment out the previously existing 7 lines of code here +// $tmp = unpack("d", pack("VV", 0, ($rknum & 0xfffffffc))); +// //$value = $tmp['']; +// if (array_key_exists(1, $tmp)) { +// $value = $tmp[1]; +// } else { +// $value = $tmp['']; +// } +// I got my info on IEEE754 encoding from +// http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html +// The RK format calls for using only the most significant 30 bits of the +// 64 bit floating point value. The other 34 bits are assumed to be 0 +// So, we use the upper 30 bits of $rknum as follows... + $sign = ($rknum & 0x80000000) >> 31; + $exp = ($rknum & 0x7ff00000) >> 20; + $mantissa = (0x100000 | ($rknum & 0x000ffffc)); + $value = $mantissa / pow( 2 , (20- ($exp - 1023))); + if ($sign) {$value = -1 * $value;} +//end of changes by mmp + + } + + if (($rknum & 0x01) != 0) { + $value /= 100; + } + return $value; + } + + function _encodeUTF16($string) + { + $result = $string; + if ($this->_defaultEncoding){ + switch ($this->_encoderFunction){ + case 'iconv' : $result = iconv('UTF-16LE', $this->_defaultEncoding, $string); + break; + case 'mb_convert_encoding' : $result = mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' ); + break; + } + } + return $result; + } + + function _GetInt4d($data, $pos) + { + $value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); + if ($value>=4294967294) + { + $value=-2; + } + return $value; + } + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ + +?> diff --git a/fannie/src/JsonLib.php b/fannie/src/JsonLib.php new file mode 100644 index 000000000..a36ce431e --- /dev/null +++ b/fannie/src/JsonLib.php @@ -0,0 +1,87 @@ +$v){ + $ret .= '"'.$k.'":'; + $ret .= self::encode_value_json($v).","; + } + $ret = substr($ret,0,strlen($ret)-1)."}"; + return $ret; +} + +/** + Convert a variable to a JSON string + @param $val a single variable + @return A JSON string representing the variable +*/ +static public function encode_value_json($val){ + if (is_array($val)) return self::array_to_json($val); + if (is_numeric($val)) return $val; + if ($val === true) return 'true'; + if ($val === false) return 'false'; + else return '"'.addcslashes($val,"\\\"\r\n\t").'"'; +} + +/** + Remove newlines, carriage returns, and tabs + from the string (some browser don't like these + in JSON strings) + @str a string + @return the modified string +*/ +static public function fixstring($str){ + $str = str_replace("\n","",$str); + $str = str_replace("\r","",$str); + $str = str_replace("\t","",$str); +} + +} + +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel.php b/fannie/src/PHPExcel/Classes/PHPExcel.php new file mode 100644 index 000000000..f0b39e796 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel.php @@ -0,0 +1,823 @@ +_workSheetCollection = array(); + $this->_workSheetCollection[] = new PHPExcel_Worksheet($this); + $this->_activeSheetIndex = 0; + + // Create document properties + $this->_properties = new PHPExcel_DocumentProperties(); + + // Create document security + $this->_security = new PHPExcel_DocumentSecurity(); + + // Set named ranges + $this->_namedRanges = array(); + + // Create the cellXf supervisor + $this->_cellXfSupervisor = new PHPExcel_Style(true); + $this->_cellXfSupervisor->bindParent($this); + + // Create the default style + $this->addCellXf(new PHPExcel_Style); + $this->addCellStyleXf(new PHPExcel_Style); + } + + + /** + * Disconnect all worksheets from this PHPExcel workbook object, + * typically so that the PHPExcel object can be unset + * + */ + public function disconnectWorksheets() { + foreach($this->_workSheetCollection as $k => &$worksheet) { + $worksheet->disconnectCells(); + $this->_workSheetCollection[$k] = null; + } + unset($worksheet); + $this->_workSheetCollection = array(); + } + + /** + * Get properties + * + * @return PHPExcel_DocumentProperties + */ + public function getProperties() + { + return $this->_properties; + } + + /** + * Set properties + * + * @param PHPExcel_DocumentProperties $pValue + */ + public function setProperties(PHPExcel_DocumentProperties $pValue) + { + $this->_properties = $pValue; + } + + /** + * Get security + * + * @return PHPExcel_DocumentSecurity + */ + public function getSecurity() + { + return $this->_security; + } + + /** + * Set security + * + * @param PHPExcel_DocumentSecurity $pValue + */ + public function setSecurity(PHPExcel_DocumentSecurity $pValue) + { + $this->_security = $pValue; + } + + /** + * Get active sheet + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_workSheetCollection[$this->_activeSheetIndex]; + } + + /** + * Create sheet and add it to this workbook + * + * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last) + * @return PHPExcel_Worksheet + * @throws Exception + */ + public function createSheet($iSheetIndex = NULL) + { + $newSheet = new PHPExcel_Worksheet($this); + $this->addSheet($newSheet, $iSheetIndex); + return $newSheet; + } + + /** + * Chech if a sheet with a specified name already exists + * + * @param string $pSheetName Name of the worksheet to check + * @return boolean + */ + public function sheetNameExists($pSheetName) + { + return ($this->getSheetByName($pSheetName) !== NULL); + } + + /** + * Add sheet + * + * @param PHPExcel_Worksheet $pSheet + * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last) + * @return PHPExcel_Worksheet + * @throws Exception + */ + public function addSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = NULL) + { + if ($this->sheetNameExists($pSheet->getTitle())) { + throw new Exception("Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename this worksheet first."); + } + + if($iSheetIndex === NULL) { + if ($this->_activeSheetIndex < 0) { + $this->_activeSheetIndex = 0; + } + $this->_workSheetCollection[] = $pSheet; + } else { + // Insert the sheet at the requested index + array_splice( + $this->_workSheetCollection, + $iSheetIndex, + 0, + array($pSheet) + ); + + // Adjust active sheet index if necessary + if ($this->_activeSheetIndex >= $iSheetIndex) { + ++$this->_activeSheetIndex; + } + } + return $pSheet; + } + + /** + * Remove sheet by index + * + * @param int $pIndex Active sheet index + * @throws Exception + */ + public function removeSheetByIndex($pIndex = 0) + { + if ($pIndex > count($this->_workSheetCollection) - 1) { + throw new Exception("Sheet index is out of bounds."); + } else { + array_splice($this->_workSheetCollection, $pIndex, 1); + } + // Adjust active sheet index if necessary + if (($this->_activeSheetIndex >= $pIndex) && + ($pIndex > count($this->_workSheetCollection) - 1)) { + --$this->_activeSheetIndex; + } + + } + + /** + * Get sheet by index + * + * @param int $pIndex Sheet index + * @return PHPExcel_Worksheet + * @throws Exception + */ + public function getSheet($pIndex = 0) + { + if ($pIndex > count($this->_workSheetCollection) - 1) { + throw new Exception("Sheet index is out of bounds."); + } else { + return $this->_workSheetCollection[$pIndex]; + } + } + + /** + * Get all sheets + * + * @return PHPExcel_Worksheet[] + */ + public function getAllSheets() + { + return $this->_workSheetCollection; + } + + /** + * Get sheet by name + * + * @param string $pName Sheet name + * @return PHPExcel_Worksheet + * @throws Exception + */ + public function getSheetByName($pName = '') + { + $worksheetCount = count($this->_workSheetCollection); + for ($i = 0; $i < $worksheetCount; ++$i) { + if ($this->_workSheetCollection[$i]->getTitle() == $pName) { + return $this->_workSheetCollection[$i]; + } + } + + return null; + } + + /** + * Get index for sheet + * + * @param PHPExcel_Worksheet $pSheet + * @return Sheet index + * @throws Exception + */ + public function getIndex(PHPExcel_Worksheet $pSheet) + { + foreach ($this->_workSheetCollection as $key => $value) { + if ($value->getHashCode() == $pSheet->getHashCode()) { + return $key; + } + } + } + + /** + * Set index for sheet by sheet name. + * + * @param string $sheetName Sheet name to modify index for + * @param int $newIndex New index for the sheet + * @return New sheet index + * @throws Exception + */ + public function setIndexByName($sheetName, $newIndex) + { + $oldIndex = $this->getIndex($this->getSheetByName($sheetName)); + $pSheet = array_splice( + $this->_workSheetCollection, + $oldIndex, + 1 + ); + array_splice( + $this->_workSheetCollection, + $newIndex, + 0, + $pSheet + ); + return $newIndex; + } + + /** + * Get sheet count + * + * @return int + */ + public function getSheetCount() + { + return count($this->_workSheetCollection); + } + + /** + * Get active sheet index + * + * @return int Active sheet index + */ + public function getActiveSheetIndex() + { + return $this->_activeSheetIndex; + } + + /** + * Set active sheet index + * + * @param int $pIndex Active sheet index + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setActiveSheetIndex($pIndex = 0) + { + if ($pIndex > count($this->_workSheetCollection) - 1) { + throw new Exception("Active sheet index is out of bounds."); + } else { + $this->_activeSheetIndex = $pIndex; + } + return $this->getActiveSheet(); + } + + /** + * Set active sheet index by name + * + * @param string $pValue Sheet title + * @return PHPExcel_Worksheet + * @throws Exception + */ + public function setActiveSheetIndexByName($pValue = '') + { + if (($worksheet = $this->getSheetByName($pValue)) instanceof PHPExcel_Worksheet) { + $this->setActiveSheetIndex($this->getIndex($worksheet)); + return $worksheet; + } + + throw new Exception('Workbook does not contain sheet:' . $pValue); + } + + /** + * Get sheet names + * + * @return string[] + */ + public function getSheetNames() + { + $returnValue = array(); + $worksheetCount = $this->getSheetCount(); + for ($i = 0; $i < $worksheetCount; ++$i) { + $returnValue[] = $this->getSheet($i)->getTitle(); + } + + return $returnValue; + } + + /** + * Add external sheet + * + * @param PHPExcel_Worksheet $pSheet External sheet to add + * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function addExternalSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null) { + if ($this->sheetNameExists($pSheet->getTitle())) { + throw new Exception("Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename the external sheet first."); + } + + // count how many cellXfs there are in this workbook currently, we will need this below + $countCellXfs = count($this->_cellXfCollection); + + // copy all the shared cellXfs from the external workbook and append them to the current + foreach ($pSheet->getParent()->getCellXfCollection() as $cellXf) { + $this->addCellXf(clone $cellXf); + } + + // move sheet to this workbook + $pSheet->rebindParent($this); + + // update the cellXfs + foreach ($pSheet->getCellCollection(false) as $cellID) { + $cell = $pSheet->getCell($cellID); + $cell->setXfIndex( $cell->getXfIndex() + $countCellXfs ); + } + + return $this->addSheet($pSheet, $iSheetIndex); + } + + /** + * Get named ranges + * + * @return PHPExcel_NamedRange[] + */ + public function getNamedRanges() { + return $this->_namedRanges; + } + + /** + * Add named range + * + * @param PHPExcel_NamedRange $namedRange + * @return PHPExcel + */ + public function addNamedRange(PHPExcel_NamedRange $namedRange) { + if ($namedRange->getScope() == null) { + // global scope + $this->_namedRanges[$namedRange->getName()] = $namedRange; + } else { + // local scope + $this->_namedRanges[$namedRange->getScope()->getTitle().'!'.$namedRange->getName()] = $namedRange; + } + return true; + } + + /** + * Get named range + * + * @param string $namedRange + * @param PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope + * @return PHPExcel_NamedRange|null + */ + public function getNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null) { + $returnValue = null; + + if ($namedRange != '' && ($namedRange !== NULL)) { + // first look for global defined name + if (isset($this->_namedRanges[$namedRange])) { + $returnValue = $this->_namedRanges[$namedRange]; + } + + // then look for local defined name (has priority over global defined name if both names exist) + if (($pSheet !== NULL) && isset($this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange])) { + $returnValue = $this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange]; + } + } + + return $returnValue; + } + + /** + * Remove named range + * + * @param string $namedRange + * @param PHPExcel_Worksheet|null $pSheet Scope: use null for global scope. + * @return PHPExcel + */ + public function removeNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null) { + if ($pSheet === NULL) { + if (isset($this->_namedRanges[$namedRange])) { + unset($this->_namedRanges[$namedRange]); + } + } else { + if (isset($this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange])) { + unset($this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange]); + } + } + return $this; + } + + /** + * Get worksheet iterator + * + * @return PHPExcel_WorksheetIterator + */ + public function getWorksheetIterator() { + return new PHPExcel_WorksheetIterator($this); + } + + /** + * Copy workbook (!= clone!) + * + * @return PHPExcel + */ + public function copy() { + $copied = clone $this; + + $worksheetCount = count($this->_workSheetCollection); + for ($i = 0; $i < $worksheetCount; ++$i) { + $this->_workSheetCollection[$i] = $this->_workSheetCollection[$i]->copy(); + $this->_workSheetCollection[$i]->rebindParent($this); + } + + return $copied; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + foreach($this as $key => $val) { + if (is_object($val) || (is_array($val))) { + $this->{$key} = unserialize(serialize($val)); + } + } + } + + /** + * Get the workbook collection of cellXfs + * + * @return PHPExcel_Style[] + */ + public function getCellXfCollection() + { + return $this->_cellXfCollection; + } + + /** + * Get cellXf by index + * + * @param int $pIndex + * @return PHPExcel_Style + */ + public function getCellXfByIndex($pIndex = 0) + { + return $this->_cellXfCollection[$pIndex]; + } + + /** + * Get cellXf by hash code + * + * @param string $pValue + * @return PHPExcel_Style|false + */ + public function getCellXfByHashCode($pValue = '') + { + foreach ($this->_cellXfCollection as $cellXf) { + if ($cellXf->getHashCode() == $pValue) { + return $cellXf; + } + } + return false; + } + + /** + * Get default style + * + * @return PHPExcel_Style + * @throws Exception + */ + public function getDefaultStyle() + { + if (isset($this->_cellXfCollection[0])) { + return $this->_cellXfCollection[0]; + } + throw new Exception('No default style found for this workbook'); + } + + /** + * Add a cellXf to the workbook + * + * @param PHPExcel_Style $style + */ + public function addCellXf(PHPExcel_Style $style) + { + $this->_cellXfCollection[] = $style; + $style->setIndex(count($this->_cellXfCollection) - 1); + } + + /** + * Remove cellXf by index. It is ensured that all cells get their xf index updated. + * + * @param int $pIndex Index to cellXf + * @throws Exception + */ + public function removeCellXfByIndex($pIndex = 0) + { + if ($pIndex > count($this->_cellXfCollection) - 1) { + throw new Exception("CellXf index is out of bounds."); + } else { + // first remove the cellXf + array_splice($this->_cellXfCollection, $pIndex, 1); + + // then update cellXf indexes for cells + foreach ($this->_workSheetCollection as $worksheet) { + foreach ($worksheet->getCellCollection(false) as $cellID) { + $cell = $worksheet->getCell($cellID); + $xfIndex = $cell->getXfIndex(); + if ($xfIndex > $pIndex ) { + // decrease xf index by 1 + $cell->setXfIndex($xfIndex - 1); + } else if ($xfIndex == $pIndex) { + // set to default xf index 0 + $cell->setXfIndex(0); + } + } + } + } + } + + /** + * Get the cellXf supervisor + * + * @return PHPExcel_Style + */ + public function getCellXfSupervisor() + { + return $this->_cellXfSupervisor; + } + + /** + * Get the workbook collection of cellStyleXfs + * + * @return PHPExcel_Style[] + */ + public function getCellStyleXfCollection() + { + return $this->_cellStyleXfCollection; + } + + /** + * Get cellStyleXf by index + * + * @param int $pIndex + * @return PHPExcel_Style + */ + public function getCellStyleXfByIndex($pIndex = 0) + { + return $this->_cellStyleXfCollection[$pIndex]; + } + + /** + * Get cellStyleXf by hash code + * + * @param string $pValue + * @return PHPExcel_Style|false + */ + public function getCellStyleXfByHashCode($pValue = '') + { + foreach ($this->_cellXfStyleCollection as $cellStyleXf) { + if ($cellStyleXf->getHashCode() == $pValue) { + return $cellStyleXf; + } + } + return false; + } + + /** + * Add a cellStyleXf to the workbook + * + * @param PHPExcel_Style $pStyle + */ + public function addCellStyleXf(PHPExcel_Style $pStyle) + { + $this->_cellStyleXfCollection[] = $pStyle; + $pStyle->setIndex(count($this->_cellStyleXfCollection) - 1); + } + + /** + * Remove cellStyleXf by index + * + * @param int $pIndex + * @throws Exception + */ + public function removeCellStyleXfByIndex($pIndex = 0) + { + if ($pIndex > count($this->_cellStyleXfCollection) - 1) { + throw new Exception("CellStyleXf index is out of bounds."); + } else { + array_splice($this->_cellStyleXfCollection, $pIndex, 1); + } + } + + /** + * Eliminate all unneeded cellXf and afterwards update the xfIndex for all cells + * and columns in the workbook + */ + public function garbageCollect() + { + // how many references are there to each cellXf ? + $countReferencesCellXf = array(); + foreach ($this->_cellXfCollection as $index => $cellXf) { + $countReferencesCellXf[$index] = 0; + } + + foreach ($this->getWorksheetIterator() as $sheet) { + + // from cells + foreach ($sheet->getCellCollection(false) as $cellID) { + $cell = $sheet->getCell($cellID); + ++$countReferencesCellXf[$cell->getXfIndex()]; + } + + // from row dimensions + foreach ($sheet->getRowDimensions() as $rowDimension) { + if ($rowDimension->getXfIndex() !== null) { + ++$countReferencesCellXf[$rowDimension->getXfIndex()]; + } + } + + // from column dimensions + foreach ($sheet->getColumnDimensions() as $columnDimension) { + ++$countReferencesCellXf[$columnDimension->getXfIndex()]; + } + } + + // remove cellXfs without references and create mapping so we can update xfIndex + // for all cells and columns + $countNeededCellXfs = 0; + foreach ($this->_cellXfCollection as $index => $cellXf) { + if ($countReferencesCellXf[$index] > 0 || $index == 0) { // we must never remove the first cellXf + ++$countNeededCellXfs; + } else { + unset($this->_cellXfCollection[$index]); + } + $map[$index] = $countNeededCellXfs - 1; + } + $this->_cellXfCollection = array_values($this->_cellXfCollection); + + // update the index for all cellXfs + foreach ($this->_cellXfCollection as $i => $cellXf) { + $cellXf->setIndex($i); + } + + // make sure there is always at least one cellXf (there should be) + if (empty($this->_cellXfCollection)) { + $this->_cellXfCollection[] = new PHPExcel_Style(); + } + + // update the xfIndex for all cells, row dimensions, column dimensions + foreach ($this->getWorksheetIterator() as $sheet) { + + // for all cells + foreach ($sheet->getCellCollection(false) as $cellID) { + $cell = $sheet->getCell($cellID); + $cell->setXfIndex( $map[$cell->getXfIndex()] ); + } + + // for all row dimensions + foreach ($sheet->getRowDimensions() as $rowDimension) { + if ($rowDimension->getXfIndex() !== null) { + $rowDimension->setXfIndex( $map[$rowDimension->getXfIndex()] ); + } + } + + // for all column dimensions + foreach ($sheet->getColumnDimensions() as $columnDimension) { + $columnDimension->setXfIndex( $map[$columnDimension->getXfIndex()] ); + } + } + + // also do garbage collection for all the sheets + foreach ($this->getWorksheetIterator() as $sheet) { + $sheet->garbageCollect(); + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Autoloader.php b/fannie/src/PHPExcel/Classes/PHPExcel/Autoloader.php new file mode 100644 index 000000000..15193278b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Autoloader.php @@ -0,0 +1,85 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + if (!apc_store($this->_cachePrefix.$this->_currentObjectID.'.cache',serialize($this->_currentObject),$this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$this->_currentObjectID.' in APC'); + } + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @access public + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + $this->_cellCache[$pCoord] = true; + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @access public + * @param string $pCoord Coordinate address of the cell to check + * @return void + * @return boolean + */ + public function isDataSet($pCoord) { + // Check if the requested entry is the current object, or exists in the cache + if (parent::isDataSet($pCoord)) { + if ($this->_currentObjectID == $pCoord) { + return true; + } + // Check if the requested entry still exists in apc + $success = apc_fetch($this->_cachePrefix.$pCoord.'.cache'); + if ($success === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new Exception('Cell entry '.$pCoord.' no longer exists in APC'); + } + return true; + } + return false; + } // function isDataSet() + + + /** + * Get cell at a specific coordinate + * + * @access public + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (parent::isDataSet($pCoord)) { + $obj = apc_fetch($this->_cachePrefix.$pCoord.'.cache'); + if ($obj === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new Exception('Cell entry '.$pCoord.' no longer exists in APC'); + } + } else { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = unserialize($obj); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Delete a cell in cache identified by coordinate address + * + * @access public + * @param string $pCoord Coordinate address of the cell to delete + * @throws Exception + */ + public function deleteCacheData($pCoord) { + // Delete the entry from APC + apc_delete($this->_cachePrefix.$pCoord.'.cache'); + + // Delete the entry from our cell address array + parent::deleteCacheData($pCoord); + } // function deleteCacheData() + + + /** + * Clone the cell collection + * + * @access public + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newCachePrefix = substr(md5($baseUnique),0,8).'.'; + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + if ($cellID != $this->_currentObjectID) { + $obj = apc_fetch($this->_cachePrefix.$cellID.'.cache'); + if ($obj === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new Exception('Cell entry '.$cellID.' no longer exists in APC'); + } + if (!apc_store($newCachePrefix.$cellID.'.cache',$obj,$this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in APC'); + } + } + } + $this->_cachePrefix = $newCachePrefix; + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if ($this->_currentObject !== NULL) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + + // Flush the APC cache + $this->__destruct(); + + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) { + $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; + + if ($this->_cachePrefix === NULL) { + $baseUnique = $this->_getUniqueID(); + $this->_cachePrefix = substr(md5($baseUnique),0,8).'.'; + $this->_cacheTime = $cacheTime; + + parent::__construct($parent); + } + } // function __construct() + + + /** + * Destroy this cell collection + */ + public function __destruct() { + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + apc_delete($this->_cachePrefix.$cellID.'.cache'); + } + } // function __destruct() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + if (!function_exists('apc_store')) { + return false; + } + if (apc_sma_info() === false) { + return false; + } + + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/CacheBase.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/CacheBase.php new file mode 100644 index 000000000..deaae4ca1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/CacheBase.php @@ -0,0 +1,252 @@ +_parent = $parent; + } // function __construct() + + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return true; + } + // Check if the requested entry exists in the cache + return isset($this->_cellCache[$pCoord]); + } // function isDataSet() + + + /** + * Add or Update a cell in cache + * + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function updateCacheData(PHPExcel_Cell $cell) { + return $this->addCacheData($cell->getCoordinate(),$cell); + } // function updateCacheData() + + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws Exception + */ + public function deleteCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + $this->_currentObject->detach(); + $this->_currentObjectID = $this->_currentObject = null; + } + + if (is_object($this->_cellCache[$pCoord])) { + $this->_cellCache[$pCoord]->detach(); + unset($this->_cellCache[$pCoord]); + } + $this->_currentCellIsDirty = false; + } // function deleteCacheData() + + + /** + * Get a list of all cell addresses currently held in cache + * + * @return array of string + */ + public function getCellList() { + return array_keys($this->_cellCache); + } // function getCellList() + + + /** + * Sort the list of all cell addresses currently held in cache by row and column + * + * @return void + */ + public function getSortedCellList() { + $sortKeys = array(); + foreach ($this->getCellList() as $coord) { + list($column,$row) = sscanf($coord,'%[A-Z]%d'); + $sortKeys[sprintf('%09d%3s',$row,$column)] = $coord; + } + ksort($sortKeys); + + return array_values($sortKeys); + } // function sortCellList() + + + + /** + * Get highest worksheet column and highest row that have cell records + * + * @return array Highest column name and highest row number + */ + public function getHighestRowAndColumn() + { + // Lookup highest column and highest row + $col = array('A' => '1A'); + $row = array(1); + foreach ($this->getCellList() as $coord) { + list($c,$r) = sscanf($coord,'%[A-Z]%d'); + $row[$r] = $r; + $col[$c] = strlen($c).$c; + } + if (!empty($row)) { + // Determine highest column and row + $highestRow = max($row); + $highestColumn = substr(max($col),1); + } + + return array( 'row' => $highestRow, + 'column' => $highestColumn + ); + } + + + /** + * Get highest worksheet column + * + * @return string Highest column name + */ + public function getHighestColumn() + { + $colRow = $this->getHighestRowAndColumn(); + return $colRow['column']; + } + + /** + * Get highest worksheet row + * + * @return int Highest row number + */ + public function getHighestRow() + { + $colRow = $this->getHighestRowAndColumn(); + return $colRow['row']; + } + + + /** + * Generate a unique ID for cache referencing + * + * @return string Unique Reference + */ + protected function _getUniqueID() { + if (function_exists('posix_getpid')) { + $baseUnique = posix_getpid(); + } else { + $baseUnique = mt_rand(); + } + return uniqid($baseUnique,true); + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + $this->_parent = $parent; + if (($this->_currentObject !== NULL) && (is_object($this->_currentObject))) { + $this->_currentObject->attach($parent); + } + } // function copyCellCollection() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/DiscISAM.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/DiscISAM.php new file mode 100644 index 000000000..d93ab05e5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/DiscISAM.php @@ -0,0 +1,205 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + fseek($this->_fileHandle,0,SEEK_END); + $offset = ftell($this->_fileHandle); + fwrite($this->_fileHandle, serialize($this->_currentObject)); + $this->_cellCache[$this->_currentObjectID] = array('ptr' => $offset, + 'sz' => ftell($this->_fileHandle) - $offset + ); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + fseek($this->_fileHandle,$this->_cellCache[$pCoord]['ptr']); + $this->_currentObject = unserialize(fread($this->_fileHandle,$this->_cellCache[$pCoord]['sz'])); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newFileName = $this->_cacheDirectory.'/PHPExcel.'.$baseUnique.'.cache'; + // Copy the existing cell cache file + copy ($this->_fileName,$newFileName); + $this->_fileName = $newFileName; + // Open the copied cell cache file + $this->_fileHandle = fopen($this->_fileName,'a+'); + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + + // Close down the temporary cache file + $this->__destruct(); + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) { + $this->_cacheDirectory = ((isset($arguments['dir'])) && ($arguments['dir'] !== NULL)) + ? $arguments['dir'] + : PHPExcel_Shared_File::sys_get_temp_dir(); + + parent::__construct($parent); + if (is_null($this->_fileHandle)) { + $baseUnique = $this->_getUniqueID(); + $this->_fileName = $this->_cacheDirectory.'/PHPExcel.'.$baseUnique.'.cache'; + $this->_fileHandle = fopen($this->_fileName,'a+'); + } + } // function __construct() + + + /** + * Destroy this cell collection + */ + public function __destruct() { + if (!is_null($this->_fileHandle)) { + fclose($this->_fileHandle); + unlink($this->_fileName); + } + $this->_fileHandle = null; + } // function __destruct() + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/ICache.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/ICache.php new file mode 100644 index 000000000..56f621a59 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/ICache.php @@ -0,0 +1,112 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $this->_cellCache[$this->_currentObjectID] = igbinary_serialize($this->_currentObject); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = igbinary_unserialize($this->_cellCache[$pCoord]); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + if (!function_exists('igbinary_serialize')) { + return false; + } + + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Memcache.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Memcache.php new file mode 100644 index 000000000..3e5fcb4ad --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Memcache.php @@ -0,0 +1,298 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $obj = serialize($this->_currentObject); + if (!$this->_memcache->replace($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) { + if (!$this->_memcache->add($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$this->_currentObjectID.' in MemCache'); + } + } + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + $this->_cellCache[$pCoord] = true; + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return void + * @return boolean + */ + public function isDataSet($pCoord) { + // Check if the requested entry is the current object, or exists in the cache + if (parent::isDataSet($pCoord)) { + if ($this->_currentObjectID == $pCoord) { + return true; + } + // Check if the requested entry still exists in Memcache + $success = $this->_memcache->get($this->_cachePrefix.$pCoord.'.cache'); + if ($success === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new Exception('Cell entry '.$pCoord.' no longer exists in MemCache'); + } + return true; + } + return false; + } // function isDataSet() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (parent::isDataSet($pCoord)) { + $obj = $this->_memcache->get($this->_cachePrefix.$pCoord.'.cache'); + if ($obj === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new Exception('Cell entry '.$pCoord.' no longer exists in MemCache'); + } + } else { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = unserialize($obj); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws Exception + */ + public function deleteCacheData($pCoord) { + // Delete the entry from Memcache + $this->_memcache->delete($this->_cachePrefix.$pCoord.'.cache'); + + // Delete the entry from our cell address array + parent::deleteCacheData($pCoord); + } // function deleteCacheData() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newCachePrefix = substr(md5($baseUnique),0,8).'.'; + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + if ($cellID != $this->_currentObjectID) { + $obj = $this->_memcache->get($this->_cachePrefix.$cellID.'.cache'); + if ($obj === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache'); + } + if (!$this->_memcache->add($newCachePrefix.$cellID.'.cache',$obj,NULL,$this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in MemCache'); + } + } + } + $this->_cachePrefix = $newCachePrefix; + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + + // Flush the Memcache cache + $this->__destruct(); + + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) { + $memcacheServer = (isset($arguments['memcacheServer'])) ? $arguments['memcacheServer'] : 'localhost'; + $memcachePort = (isset($arguments['memcachePort'])) ? $arguments['memcachePort'] : 11211; + $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; + + if (is_null($this->_cachePrefix)) { + $baseUnique = $this->_getUniqueID(); + $this->_cachePrefix = substr(md5($baseUnique),0,8).'.'; + + // Set a new Memcache object and connect to the Memcache server + $this->_memcache = new Memcache(); + if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback'))) { + throw new Exception('Could not connect to MemCache server at '.$memcacheServer.':'.$memcachePort); + } + $this->_cacheTime = $cacheTime; + + parent::__construct($parent); + } + } // function __construct() + + + /** + * Memcache error handler + * + * @param string $host Memcache server + * @param integer $port Memcache port + * @throws Exception + */ + public function failureCallback($host, $port) { + throw new Exception('memcache '.$host.':'.$port.' failed'); + } + + + /** + * Destroy this cell collection + */ + public function __destruct() { + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + $this->_memcache->delete($this->_cachePrefix.$cellID.'.cache'); + } + } // function __destruct() + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + if (!function_exists('memcache_add')) { + return false; + } + + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Memory.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Memory.php new file mode 100644 index 000000000..f368e3977 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Memory.php @@ -0,0 +1,109 @@ +_cellCache[$pCoord] = $cell; + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Return requested entry + return $this->_cellCache[$pCoord]; + } // function getCacheData() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + + $newCollection = array(); + foreach($this->_cellCache as $k => &$cell) { + $newCollection[$k] = clone $cell; + $newCollection[$k]->attach($parent); + } + + $this->_cellCache = $newCollection; + } + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + // Because cells are all stored as intact objects in memory, we need to detach each one from the parent + foreach($this->_cellCache as $k => &$cell) { + $cell->detach(); + $this->_cellCache[$k] = null; + } + unset($cell); + + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/MemoryGZip.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/MemoryGZip.php new file mode 100644 index 000000000..694123126 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/MemoryGZip.php @@ -0,0 +1,123 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $this->_cellCache[$this->_currentObjectID] = gzdeflate(serialize($this->_currentObject)); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = unserialize(gzinflate($this->_cellCache[$pCoord])); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/MemorySerialized.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/MemorySerialized.php new file mode 100644 index 000000000..09f3b6658 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/MemorySerialized.php @@ -0,0 +1,123 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $this->_cellCache[$this->_currentObjectID] = serialize($this->_currentObject); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = unserialize($this->_cellCache[$pCoord]); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/PHPTemp.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/PHPTemp.php new file mode 100644 index 000000000..c3f2bd95b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/PHPTemp.php @@ -0,0 +1,192 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + fseek($this->_fileHandle,0,SEEK_END); + $offset = ftell($this->_fileHandle); + fwrite($this->_fileHandle, serialize($this->_currentObject)); + $this->_cellCache[$this->_currentObjectID] = array('ptr' => $offset, + 'sz' => ftell($this->_fileHandle) - $offset + ); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + fseek($this->_fileHandle,$this->_cellCache[$pCoord]['ptr']); + $this->_currentObject = unserialize(fread($this->_fileHandle,$this->_cellCache[$pCoord]['sz'])); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Open a new stream for the cell cache data + $newFileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+'); + // Copy the existing cell cache data to the new stream + fseek($this->_fileHandle,0); + while (!feof($this->_fileHandle)) { + fwrite($newFileHandle,fread($this->_fileHandle, 1024)); + } + $this->_fileHandle = $newFileHandle; + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + + // Close down the php://temp file + $this->__destruct(); + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) { + $this->_memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB'; + + parent::__construct($parent); + if (is_null($this->_fileHandle)) { + $this->_fileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+'); + } + } // function __construct() + + + /** + * Destroy this cell collection + */ + public function __destruct() { + if (!is_null($this->_fileHandle)) { + fclose($this->_fileHandle); + } + $this->_fileHandle = null; + } // function __destruct() + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/SQLite.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/SQLite.php new file mode 100644 index 000000000..515573dc9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/SQLite.php @@ -0,0 +1,270 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + if (!$this->_DBHandle->queryExec("INSERT OR REPLACE INTO kvp_".$this->_TableName." VALUES('".$this->_currentObjectID."','".sqlite_escape_string(serialize($this->_currentObject))."')")) + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + $query = "SELECT value FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; + $cellResultSet = $this->_DBHandle->query($query,SQLITE_ASSOC); + if ($cellResultSet === false) { + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + } elseif ($cellResultSet->numRows() == 0) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + + $cellResult = $cellResultSet->fetchSingle(); + $this->_currentObject = unserialize($cellResult); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Is a value set for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return true; + } + + // Check if the requested entry exists in the cache + $query = "SELECT id FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; + $cellResultSet = $this->_DBHandle->query($query,SQLITE_ASSOC); + if ($cellResultSet === false) { + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + } elseif ($cellResultSet->numRows() == 0) { + // Return null if requested entry doesn't exist in cache + return false; + } + return true; + } // function isDataSet() + + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws Exception + */ + public function deleteCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + $this->_currentObject->detach(); + $this->_currentObjectID = $this->_currentObject = null; + } + + // Check if the requested entry exists in the cache + $query = "DELETE FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; + if (!$this->_DBHandle->queryExec($query)) + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + + $this->_currentCellIsDirty = false; + } // function deleteCacheData() + + + /** + * Get a list of all cell addresses currently held in cache + * + * @return array of string + */ + public function getCellList() { + $query = "SELECT id FROM kvp_".$this->_TableName; + $cellIdsResult = $this->_DBHandle->unbufferedQuery($query,SQLITE_ASSOC); + if ($cellIdsResult === false) + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + + $cellKeys = array(); + foreach($cellIdsResult as $row) { + $cellKeys[] = $row['id']; + } + + return $cellKeys; + } // function getCellList() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + // Get a new id for the new table name + $tableName = str_replace('.','_',$this->_getUniqueID()); + if (!$this->_DBHandle->queryExec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB) + AS SELECT * FROM kvp_'.$this->_TableName)) + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + + // Copy the existing cell cache file + $this->_TableName = $tableName; + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + + // Close down the temporary cache file + $this->__destruct(); + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + */ + public function __construct(PHPExcel_Worksheet $parent) { + parent::__construct($parent); + if (is_null($this->_DBHandle)) { + $this->_TableName = str_replace('.','_',$this->_getUniqueID()); + $_DBName = ':memory:'; + + $this->_DBHandle = new SQLiteDatabase($_DBName); + if ($this->_DBHandle === false) + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + if (!$this->_DBHandle->queryExec('CREATE TABLE kvp_'.$this->_TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) + throw new Exception(sqlite_error_string($this->_DBHandle->lastError())); + } + } // function __construct() + + + /** + * Destroy this cell collection + */ + public function __destruct() { + $this->_DBHandle = null; + } // function __destruct() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + if (!function_exists('sqlite_open')) { + return false; + } + + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/SQLite3.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/SQLite3.php new file mode 100644 index 000000000..b867b4dd0 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/SQLite3.php @@ -0,0 +1,277 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $query = $this->_DBHandle->prepare("INSERT OR REPLACE INTO kvp_".$this->_TableName." VALUES(:id,:data)"); + $query->bindValue('id',$this->_currentObjectID,SQLITE3_TEXT); + $query->bindValue('data',serialize($this->_currentObject),SQLITE3_BLOB); + $result = $query->execute(); + if ($result === false) + throw new Exception($this->_DBHandle->lastErrorMsg()); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + $query = "SELECT value FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; + $cellResult = $this->_DBHandle->querySingle($query); + if ($cellResult === false) { + throw new Exception($this->_DBHandle->lastErrorMsg()); + } elseif (is_null($cellResult)) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + + $this->_currentObject = unserialize($cellResult); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Is a value set for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return true; + } + + // Check if the requested entry exists in the cache + $query = "SELECT id FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; + $cellResult = $this->_DBHandle->querySingle($query); + if ($cellResult === false) { + throw new Exception($this->_DBHandle->lastErrorMsg()); + } elseif (is_null($cellResult)) { + // Return null if requested entry doesn't exist in cache + return false; + } + return true; + } // function isDataSet() + + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws Exception + */ + public function deleteCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + $this->_currentObject->detach(); + $this->_currentObjectID = $this->_currentObject = null; + } + + // Check if the requested entry exists in the cache + $query = "DELETE FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; + $result = $this->_DBHandle->exec($query); + if ($result === false) + throw new Exception($this->_DBHandle->lastErrorMsg()); + + $this->_currentCellIsDirty = false; + } // function deleteCacheData() + + + /** + * Get a list of all cell addresses currently held in cache + * + * @return array of string + */ + public function getCellList() { + $query = "SELECT id FROM kvp_".$this->_TableName; + $cellIdsResult = $this->_DBHandle->query($query); + if ($cellIdsResult === false) + throw new Exception($this->_DBHandle->lastErrorMsg()); + + $cellKeys = array(); + while ($row = $cellIdsResult->fetchArray(SQLITE3_ASSOC)) { + $cellKeys[] = $row['id']; + } + + return $cellKeys; + } // function getCellList() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + // Get a new id for the new table name + $tableName = str_replace('.','_',$this->_getUniqueID()); + if (!$this->_DBHandle->exec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB) + AS SELECT * FROM kvp_'.$this->_TableName)) + throw new Exception($this->_DBHandle->lastErrorMsg()); + + // Copy the existing cell cache file + $this->_TableName = $tableName; + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + + // Close down the temporary cache file + $this->__destruct(); + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + */ + public function __construct(PHPExcel_Worksheet $parent) { + parent::__construct($parent); + if (is_null($this->_DBHandle)) { + $this->_TableName = str_replace('.','_',$this->_getUniqueID()); + $_DBName = ':memory:'; + + $this->_DBHandle = new SQLite3($_DBName); + if ($this->_DBHandle === false) + throw new Exception($this->_DBHandle->lastErrorMsg()); + if (!$this->_DBHandle->exec('CREATE TABLE kvp_'.$this->_TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) + throw new Exception($this->_DBHandle->lastErrorMsg()); + } + } // function __construct() + + + /** + * Destroy this cell collection + */ + public function __destruct() { + if (!is_null($this->_DBHandle)) { + $this->_DBHandle->close(); + } + $this->_DBHandle = null; + } // function __destruct() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + if (!class_exists('SQLite3',FALSE)) { + return false; + } + + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Wincache.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Wincache.php new file mode 100644 index 000000000..153444884 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorage/Wincache.php @@ -0,0 +1,280 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $obj = serialize($this->_currentObject); + if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) { + if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache'); + } + } else { + if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache'); + } + } + $this->_currentCellIsDirty = false; + } + + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + $this->_cellCache[$pCoord] = true; + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) { + // Check if the requested entry is the current object, or exists in the cache + if (parent::isDataSet($pCoord)) { + if ($this->_currentObjectID == $pCoord) { + return true; + } + // Check if the requested entry still exists in cache + $success = wincache_ucache_exists($this->_cachePrefix.$pCoord.'.cache'); + if ($success === false) { + // Entry no longer exists in Wincache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new Exception('Cell entry '.$pCoord.' no longer exists in WinCache'); + } + return true; + } + return false; + } // function isDataSet() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + $obj = null; + if (parent::isDataSet($pCoord)) { + $success = false; + $obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success); + if ($success === false) { + // Entry no longer exists in WinCache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new Exception('Cell entry '.$pCoord.' no longer exists in WinCache'); + } + } else { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = unserialize($obj); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws Exception + */ + public function deleteCacheData($pCoord) { + // Delete the entry from Wincache + wincache_ucache_delete($this->_cachePrefix.$pCoord.'.cache'); + + // Delete the entry from our cell address array + parent::deleteCacheData($pCoord); + } // function deleteCacheData() + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newCachePrefix = substr(md5($baseUnique),0,8).'.'; + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + if ($cellID != $this->_currentObjectID) { + $success = false; + $obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success); + if ($success === false) { + // Entry no longer exists in WinCache, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new Exception('Cell entry '.$cellID.' no longer exists in Wincache'); + } + if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in Wincache'); + } + } + } + $this->_cachePrefix = $newCachePrefix; + } // function copyCellCollection() + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + + // Flush the WinCache cache + $this->__destruct(); + + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) { + $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; + + if (is_null($this->_cachePrefix)) { + $baseUnique = $this->_getUniqueID(); + $this->_cachePrefix = substr(md5($baseUnique),0,8).'.'; + $this->_cacheTime = $cacheTime; + + parent::__construct($parent); + } + } // function __construct() + + + /** + * Destroy this cell collection + */ + public function __destruct() { + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + wincache_ucache_delete($this->_cachePrefix.$cellID.'.cache'); + } + } // function __destruct() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() { + if (!function_exists('wincache_ucache_add')) { + return false; + } + + return true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorageFactory.php b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorageFactory.php new file mode 100644 index 000000000..d523a2068 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/CachedObjectStorageFactory.php @@ -0,0 +1,239 @@ + array( + ), + self::cache_in_memory_gzip => array( + ), + self::cache_in_memory_serialized => array( + ), + self::cache_igbinary => array( + ), + self::cache_to_phpTemp => array( 'memoryCacheSize' => '1MB' + ), + self::cache_to_discISAM => array( 'dir' => NULL + ), + self::cache_to_apc => array( 'cacheTime' => 600 + ), + self::cache_to_memcache => array( 'memcacheServer' => 'localhost', + 'memcachePort' => 11211, + 'cacheTime' => 600 + ), + self::cache_to_wincache => array( 'cacheTime' => 600 + ), + self::cache_to_sqlite => array( + ), + self::cache_to_sqlite3 => array( + ), + ); + + + /** + * Arguments for the active cache storage method + * + * @var array of mixed array + */ + private static $_storageMethodParameters = array(); + + + /** + * Return the current cache storage method + * + * @return string|NULL + **/ + public static function getCacheStorageMethod() + { + return self::$_cacheStorageMethod; + } // function getCacheStorageMethod() + + + /** + * Return the current cache storage class + * + * @return PHPExcel_CachedObjectStorage_ICache|NULL + **/ + public static function getCacheStorageClass() + { + return self::$_cacheStorageClass; + } // function getCacheStorageClass() + + + /** + * Return the list of all possible cache storage methods + * + * @return string[] + **/ + public static function getAllCacheStorageMethods() + { + return self::$_storageMethods; + } // function getCacheStorageMethods() + + + /** + * Return the list of all available cache storage methods + * + * @return string[] + **/ + public static function getCacheStorageMethods() + { + $activeMethods = array(); + foreach(self::$_storageMethods as $storageMethod) { + $cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $storageMethod; + if (call_user_func(array($cacheStorageClass, 'cacheMethodIsAvailable'))) { + $activeMethods[] = $storageMethod; + } + } + return $activeMethods; + } // function getCacheStorageMethods() + + + /** + * Identify the cache storage method to use + * + * @param string $method Name of the method to use for cell cacheing + * @param array of mixed $arguments Additional arguments to pass to the cell caching class + * when instantiating + * @return boolean + **/ + public static function initialize($method = self::cache_in_memory, $arguments = array()) + { + if (!in_array($method,self::$_storageMethods)) { + return FALSE; + } + + $cacheStorageClass = 'PHPExcel_CachedObjectStorage_'.$method; + if (!call_user_func(array( $cacheStorageClass, + 'cacheMethodIsAvailable'))) { + return FALSE; + } + + self::$_storageMethodParameters[$method] = self::$_storageMethodDefaultParameters[$method]; + foreach($arguments as $k => $v) { + if (isset(self::$_storageMethodParameters[$method][$k])) { + self::$_storageMethodParameters[$method][$k] = $v; + } + } + + if (self::$_cacheStorageMethod === NULL) { + self::$_cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $method; + self::$_cacheStorageMethod = $method; + } + return TRUE; + } // function initialize() + + + /** + * Initialise the cache storage + * + * @param PHPExcel_Worksheet $parent Enable cell caching for this worksheet + * @return PHPExcel_CachedObjectStorage_ICache + **/ + public static function getInstance(PHPExcel_Worksheet $parent) + { + $cacheMethodIsAvailable = TRUE; + if (self::$_cacheStorageMethod === NULL) { + $cacheMethodIsAvailable = self::initialize(); + } + + if ($cacheMethodIsAvailable) { + $instance = new self::$_cacheStorageClass( $parent, + self::$_storageMethodParameters[self::$_cacheStorageMethod] + ); + if ($instance !== NULL) { + return $instance; + } + } + + return FALSE; + } // function getInstance() + +} \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation.php new file mode 100644 index 000000000..65d4f3d10 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation.php @@ -0,0 +1,3811 @@ +=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d{1,7})'); + // Named Range of cells + define('CALCULATION_REGEXP_NAMEDRANGE','((([^\s,!&%^\/\*\+<>=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?([_A-Z][_A-Z0-9\.]*)'); + } else { + // Cell reference (cell or range of cells, with or without a sheet reference) + define('CALCULATION_REGEXP_CELLREF','(((\w*)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)'); + // Named Range of cells + define('CALCULATION_REGEXP_NAMEDRANGE','(((\w*)|(\'.*\')|(\".*\"))!)?([_A-Z][_A-Z0-9\.]*)'); + } +} + + +/** + * PHPExcel_Calculation (Singleton) + * + * @category PHPExcel + * @package PHPExcel_Calculation + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Calculation { + + /** Constants */ + /** Regular Expressions */ + // Numeric operand + const CALCULATION_REGEXP_NUMBER = '[-+]?\d*\.?\d+(e[-+]?\d+)?'; + // String operand + const CALCULATION_REGEXP_STRING = '"(?:[^"]|"")*"'; + // Opening bracket + const CALCULATION_REGEXP_OPENBRACE = '\('; + // Function (allow for the old @ symbol that could be used to prefix a function, but we'll ignore it) + const CALCULATION_REGEXP_FUNCTION = '@?([A-Z][A-Z0-9\.]*)[\s]*\('; + // Cell reference (cell or range of cells, with or without a sheet reference) + const CALCULATION_REGEXP_CELLREF = CALCULATION_REGEXP_CELLREF; + // Named Range of cells + const CALCULATION_REGEXP_NAMEDRANGE = CALCULATION_REGEXP_NAMEDRANGE; + // Error + const CALCULATION_REGEXP_ERROR = '\#[A-Z][A-Z0_\/]*[!\?]?'; + + + /** constants */ + const RETURN_ARRAY_AS_ERROR = 'error'; + const RETURN_ARRAY_AS_VALUE = 'value'; + const RETURN_ARRAY_AS_ARRAY = 'array'; + + private static $returnArrayAsType = self::RETURN_ARRAY_AS_VALUE; + + + /** + * Instance of this class + * + * @access private + * @var PHPExcel_Calculation + */ + private static $_instance; + + + /** + * Calculation cache + * + * @access private + * @var array + */ + private static $_calculationCache = array (); + + + /** + * Calculation cache enabled + * + * @access private + * @var boolean + */ + private static $_calculationCacheEnabled = true; + + + /** + * Calculation cache expiration time + * + * @access private + * @var float + */ + private static $_calculationCacheExpirationTime = 15; + + + /** + * List of operators that can be used within formulae + * The true/false value indicates whether it is a binary operator or a unary operator + * + * @access private + * @var array + */ + private static $_operators = array('+' => true, '-' => true, '*' => true, '/' => true, + '^' => true, '&' => true, '%' => false, '~' => false, + '>' => true, '<' => true, '=' => true, '>=' => true, + '<=' => true, '<>' => true, '|' => true, ':' => true + ); + + + /** + * List of binary operators (those that expect two operands) + * + * @access private + * @var array + */ + private static $_binaryOperators = array('+' => true, '-' => true, '*' => true, '/' => true, + '^' => true, '&' => true, '>' => true, '<' => true, + '=' => true, '>=' => true, '<=' => true, '<>' => true, + '|' => true, ':' => true + ); + + /** + * Flag to determine how formula errors should be handled + * If true, then a user error will be triggered + * If false, then an exception will be thrown + * + * @access public + * @var boolean + * + */ + public $suppressFormulaErrors = false; + + /** + * Error message for any error that was raised/thrown by the calculation engine + * + * @access public + * @var string + * + */ + public $formulaError = null; + + /** + * Flag to determine whether a debug log should be generated by the calculation engine + * If true, then a debug log will be generated + * If false, then a debug log will not be generated + * + * @access public + * @var boolean + * + */ + public $writeDebugLog = false; + + /** + * Flag to determine whether a debug log should be echoed by the calculation engine + * If true, then a debug log will be echoed + * If false, then a debug log will not be echoed + * A debug log can only be echoed if it is generated + * + * @access public + * @var boolean + * + */ + public $echoDebugLog = false; + + + /** + * An array of the nested cell references accessed by the calculation engine, used for the debug log + * + * @access private + * @var array of string + * + */ + private $debugLogStack = array(); + + /** + * The debug log generated by the calculation engine + * + * @access public + * @var array of string + * + */ + public $debugLog = array(); + private $_cyclicFormulaCount = 0; + private $_cyclicFormulaCell = ''; + public $cyclicFormulaCount = 0; + + + private $_savedPrecision = 12; + + + private static $_localeLanguage = 'en_us'; // US English (default locale) + private static $_validLocaleLanguages = array( 'en' // English (default language) + ); + private static $_localeArgumentSeparator = ','; + private static $_localeFunctions = array(); + public static $_localeBoolean = array( 'TRUE' => 'TRUE', + 'FALSE' => 'FALSE', + 'NULL' => 'NULL' + ); + + + // Constant conversion from text name/value to actual (datatyped) value + private static $_ExcelConstants = array('TRUE' => true, + 'FALSE' => false, + 'NULL' => null + ); + + // PHPExcel functions + private static $_PHPExcelFunctions = array( // PHPExcel functions + 'ABS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'abs', + 'argumentCount' => '1' + ), + 'ACCRINT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::ACCRINT', + 'argumentCount' => '4-7' + ), + 'ACCRINTM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::ACCRINTM', + 'argumentCount' => '3-5' + ), + 'ACOS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'acos', + 'argumentCount' => '1' + ), + 'ACOSH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'acosh', + 'argumentCount' => '1' + ), + 'ADDRESS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::CELL_ADDRESS', + 'argumentCount' => '2-5' + ), + 'AMORDEGRC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::AMORDEGRC', + 'argumentCount' => '6,7' + ), + 'AMORLINC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::AMORLINC', + 'argumentCount' => '6,7' + ), + 'AND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::LOGICAL_AND', + 'argumentCount' => '1+' + ), + 'AREAS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'ASC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'ASIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'asin', + 'argumentCount' => '1' + ), + 'ASINH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'asinh', + 'argumentCount' => '1' + ), + 'ATAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'atan', + 'argumentCount' => '1' + ), + 'ATAN2' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ATAN2', + 'argumentCount' => '2' + ), + 'ATANH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'atanh', + 'argumentCount' => '1' + ), + 'AVEDEV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVEDEV', + 'argumentCount' => '1+' + ), + 'AVERAGE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGE', + 'argumentCount' => '1+' + ), + 'AVERAGEA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGEA', + 'argumentCount' => '1+' + ), + 'AVERAGEIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGEIF', + 'argumentCount' => '2,3' + ), + 'AVERAGEIFS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3+' + ), + 'BAHTTEXT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'BESSELI' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELI', + 'argumentCount' => '2' + ), + 'BESSELJ' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELJ', + 'argumentCount' => '2' + ), + 'BESSELK' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELK', + 'argumentCount' => '2' + ), + 'BESSELY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELY', + 'argumentCount' => '2' + ), + 'BETADIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::BETADIST', + 'argumentCount' => '3-5' + ), + 'BETAINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::BETAINV', + 'argumentCount' => '3-5' + ), + 'BIN2DEC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BINTODEC', + 'argumentCount' => '1' + ), + 'BIN2HEX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BINTOHEX', + 'argumentCount' => '1,2' + ), + 'BIN2OCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BINTOOCT', + 'argumentCount' => '1,2' + ), + 'BINOMDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::BINOMDIST', + 'argumentCount' => '4' + ), + 'CEILING' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::CEILING', + 'argumentCount' => '2' + ), + 'CELL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1,2' + ), + 'CHAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::CHARACTER', + 'argumentCount' => '1' + ), + 'CHIDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CHIDIST', + 'argumentCount' => '2' + ), + 'CHIINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CHIINV', + 'argumentCount' => '2' + ), + 'CHITEST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'CHOOSE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::CHOOSE', + 'argumentCount' => '2+' + ), + 'CLEAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::TRIMNONPRINTABLE', + 'argumentCount' => '1' + ), + 'CODE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::ASCIICODE', + 'argumentCount' => '1' + ), + 'COLUMN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::COLUMN', + 'argumentCount' => '-1', + 'passByReference' => array(true) + ), + 'COLUMNS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::COLUMNS', + 'argumentCount' => '1' + ), + 'COMBIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::COMBIN', + 'argumentCount' => '2' + ), + 'COMPLEX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::COMPLEX', + 'argumentCount' => '2,3' + ), + 'CONCATENATE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::CONCATENATE', + 'argumentCount' => '1+' + ), + 'CONFIDENCE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CONFIDENCE', + 'argumentCount' => '3' + ), + 'CONVERT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::CONVERTUOM', + 'argumentCount' => '3' + ), + 'CORREL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CORREL', + 'argumentCount' => '2' + ), + 'COS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'cos', + 'argumentCount' => '1' + ), + 'COSH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'cosh', + 'argumentCount' => '1' + ), + 'COUNT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNT', + 'argumentCount' => '1+' + ), + 'COUNTA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTA', + 'argumentCount' => '1+' + ), + 'COUNTBLANK' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTBLANK', + 'argumentCount' => '1' + ), + 'COUNTIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTIF', + 'argumentCount' => '2' + ), + 'COUNTIFS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'COUPDAYBS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYBS', + 'argumentCount' => '3,4' + ), + 'COUPDAYS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYS', + 'argumentCount' => '3,4' + ), + 'COUPDAYSNC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYSNC', + 'argumentCount' => '3,4' + ), + 'COUPNCD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPNCD', + 'argumentCount' => '3,4' + ), + 'COUPNUM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPNUM', + 'argumentCount' => '3,4' + ), + 'COUPPCD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPPCD', + 'argumentCount' => '3,4' + ), + 'COVAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COVAR', + 'argumentCount' => '2' + ), + 'CRITBINOM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CRITBINOM', + 'argumentCount' => '3' + ), + 'CUBEKPIMEMBER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBEMEMBER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBEMEMBERPROPERTY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBERANKEDMEMBER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBESET' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBESETCOUNT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBEVALUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUMIPMT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::CUMIPMT', + 'argumentCount' => '6' + ), + 'CUMPRINC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::CUMPRINC', + 'argumentCount' => '6' + ), + 'DATE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATE', + 'argumentCount' => '3' + ), + 'DATEDIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATEDIF', + 'argumentCount' => '2,3' + ), + 'DATEVALUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATEVALUE', + 'argumentCount' => '1' + ), + 'DAVERAGE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DAVERAGE', + 'argumentCount' => '3' + ), + 'DAY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DAYOFMONTH', + 'argumentCount' => '1' + ), + 'DAYS360' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DAYS360', + 'argumentCount' => '2,3' + ), + 'DB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DB', + 'argumentCount' => '4,5' + ), + 'DCOUNT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DCOUNT', + 'argumentCount' => '3' + ), + 'DCOUNTA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DCOUNTA', + 'argumentCount' => '3' + ), + 'DDB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DDB', + 'argumentCount' => '4,5' + ), + 'DEC2BIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOBIN', + 'argumentCount' => '1,2' + ), + 'DEC2HEX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOHEX', + 'argumentCount' => '1,2' + ), + 'DEC2OCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOOCT', + 'argumentCount' => '1,2' + ), + 'DEGREES' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'rad2deg', + 'argumentCount' => '1' + ), + 'DELTA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DELTA', + 'argumentCount' => '1,2' + ), + 'DEVSQ' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::DEVSQ', + 'argumentCount' => '1+' + ), + 'DGET' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DGET', + 'argumentCount' => '3' + ), + 'DISC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DISC', + 'argumentCount' => '4,5' + ), + 'DMAX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DMAX', + 'argumentCount' => '3' + ), + 'DMIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DMIN', + 'argumentCount' => '3' + ), + 'DOLLAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::DOLLAR', + 'argumentCount' => '1,2' + ), + 'DOLLARDE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DOLLARDE', + 'argumentCount' => '2' + ), + 'DOLLARFR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DOLLARFR', + 'argumentCount' => '2' + ), + 'DPRODUCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DPRODUCT', + 'argumentCount' => '3' + ), + 'DSTDEV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DSTDEV', + 'argumentCount' => '3' + ), + 'DSTDEVP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DSTDEVP', + 'argumentCount' => '3' + ), + 'DSUM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DSUM', + 'argumentCount' => '3' + ), + 'DURATION' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '5,6' + ), + 'DVAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DVAR', + 'argumentCount' => '3' + ), + 'DVARP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DVARP', + 'argumentCount' => '3' + ), + 'EDATE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::EDATE', + 'argumentCount' => '2' + ), + 'EFFECT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::EFFECT', + 'argumentCount' => '2' + ), + 'EOMONTH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::EOMONTH', + 'argumentCount' => '2' + ), + 'ERF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::ERF', + 'argumentCount' => '1,2' + ), + 'ERFC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::ERFC', + 'argumentCount' => '1' + ), + 'ERROR.TYPE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::ERROR_TYPE', + 'argumentCount' => '1' + ), + 'EVEN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::EVEN', + 'argumentCount' => '1' + ), + 'EXACT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'EXP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'exp', + 'argumentCount' => '1' + ), + 'EXPONDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::EXPONDIST', + 'argumentCount' => '3' + ), + 'FACT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::FACT', + 'argumentCount' => '1' + ), + 'FACTDOUBLE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::FACTDOUBLE', + 'argumentCount' => '1' + ), + 'FALSE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::FALSE', + 'argumentCount' => '0' + ), + 'FDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3' + ), + 'FIND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHSENSITIVE', + 'argumentCount' => '2,3' + ), + 'FINDB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHSENSITIVE', + 'argumentCount' => '2,3' + ), + 'FINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3' + ), + 'FISHER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::FISHER', + 'argumentCount' => '1' + ), + 'FISHERINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::FISHERINV', + 'argumentCount' => '1' + ), + 'FIXED' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::FIXEDFORMAT', + 'argumentCount' => '1-3' + ), + 'FLOOR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::FLOOR', + 'argumentCount' => '2' + ), + 'FORECAST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::FORECAST', + 'argumentCount' => '3' + ), + 'FREQUENCY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'FTEST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'FV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::FV', + 'argumentCount' => '3-5' + ), + 'FVSCHEDULE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::FVSCHEDULE', + 'argumentCount' => '2' + ), + 'GAMMADIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMADIST', + 'argumentCount' => '4' + ), + 'GAMMAINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMAINV', + 'argumentCount' => '3' + ), + 'GAMMALN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMALN', + 'argumentCount' => '1' + ), + 'GCD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::GCD', + 'argumentCount' => '1+' + ), + 'GEOMEAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GEOMEAN', + 'argumentCount' => '1+' + ), + 'GESTEP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::GESTEP', + 'argumentCount' => '1,2' + ), + 'GETPIVOTDATA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2+' + ), + 'GROWTH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GROWTH', + 'argumentCount' => '1-4' + ), + 'HARMEAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::HARMEAN', + 'argumentCount' => '1+' + ), + 'HEX2BIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTOBIN', + 'argumentCount' => '1,2' + ), + 'HEX2DEC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTODEC', + 'argumentCount' => '1' + ), + 'HEX2OCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTOOCT', + 'argumentCount' => '1,2' + ), + 'HLOOKUP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3,4' + ), + 'HOUR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::HOUROFDAY', + 'argumentCount' => '1' + ), + 'HYPERLINK' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::HYPERLINK', + 'argumentCount' => '1,2', + 'passCellReference'=> true + ), + 'HYPGEOMDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::HYPGEOMDIST', + 'argumentCount' => '4' + ), + 'IF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::STATEMENT_IF', + 'argumentCount' => '1-3' + ), + 'IFERROR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::IFERROR', + 'argumentCount' => '2' + ), + 'IMABS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMABS', + 'argumentCount' => '1' + ), + 'IMAGINARY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMAGINARY', + 'argumentCount' => '1' + ), + 'IMARGUMENT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMARGUMENT', + 'argumentCount' => '1' + ), + 'IMCONJUGATE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMCONJUGATE', + 'argumentCount' => '1' + ), + 'IMCOS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMCOS', + 'argumentCount' => '1' + ), + 'IMDIV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMDIV', + 'argumentCount' => '2' + ), + 'IMEXP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMEXP', + 'argumentCount' => '1' + ), + 'IMLN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMLN', + 'argumentCount' => '1' + ), + 'IMLOG10' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMLOG10', + 'argumentCount' => '1' + ), + 'IMLOG2' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMLOG2', + 'argumentCount' => '1' + ), + 'IMPOWER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMPOWER', + 'argumentCount' => '2' + ), + 'IMPRODUCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMPRODUCT', + 'argumentCount' => '1+' + ), + 'IMREAL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMREAL', + 'argumentCount' => '1' + ), + 'IMSIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSIN', + 'argumentCount' => '1' + ), + 'IMSQRT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSQRT', + 'argumentCount' => '1' + ), + 'IMSUB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSUB', + 'argumentCount' => '2' + ), + 'IMSUM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSUM', + 'argumentCount' => '1+' + ), + 'INDEX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::INDEX', + 'argumentCount' => '1-4' + ), + 'INDIRECT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::INDIRECT', + 'argumentCount' => '1,2', + 'passCellReference'=> true + ), + 'INFO' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'INT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::INT', + 'argumentCount' => '1' + ), + 'INTERCEPT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::INTERCEPT', + 'argumentCount' => '2' + ), + 'INTRATE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::INTRATE', + 'argumentCount' => '4,5' + ), + 'IPMT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::IPMT', + 'argumentCount' => '4-6' + ), + 'IRR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::IRR', + 'argumentCount' => '1,2' + ), + 'ISBLANK' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_BLANK', + 'argumentCount' => '1' + ), + 'ISERR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_ERR', + 'argumentCount' => '1' + ), + 'ISERROR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_ERROR', + 'argumentCount' => '1' + ), + 'ISEVEN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_EVEN', + 'argumentCount' => '1' + ), + 'ISLOGICAL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_LOGICAL', + 'argumentCount' => '1' + ), + 'ISNA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_NA', + 'argumentCount' => '1' + ), + 'ISNONTEXT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_NONTEXT', + 'argumentCount' => '1' + ), + 'ISNUMBER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_NUMBER', + 'argumentCount' => '1' + ), + 'ISODD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_ODD', + 'argumentCount' => '1' + ), + 'ISPMT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::ISPMT', + 'argumentCount' => '4' + ), + 'ISREF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'ISTEXT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_TEXT', + 'argumentCount' => '1' + ), + 'JIS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'KURT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::KURT', + 'argumentCount' => '1+' + ), + 'LARGE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LARGE', + 'argumentCount' => '2' + ), + 'LCM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::LCM', + 'argumentCount' => '1+' + ), + 'LEFT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::LEFT', + 'argumentCount' => '1,2' + ), + 'LEFTB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::LEFT', + 'argumentCount' => '1,2' + ), + 'LEN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::STRINGLENGTH', + 'argumentCount' => '1' + ), + 'LENB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::STRINGLENGTH', + 'argumentCount' => '1' + ), + 'LINEST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LINEST', + 'argumentCount' => '1-4' + ), + 'LN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'log', + 'argumentCount' => '1' + ), + 'LOG' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::LOG_BASE', + 'argumentCount' => '1,2' + ), + 'LOG10' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'log10', + 'argumentCount' => '1' + ), + 'LOGEST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LOGEST', + 'argumentCount' => '1-4' + ), + 'LOGINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LOGINV', + 'argumentCount' => '3' + ), + 'LOGNORMDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LOGNORMDIST', + 'argumentCount' => '3' + ), + 'LOOKUP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::LOOKUP', + 'argumentCount' => '2,3' + ), + 'LOWER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::LOWERCASE', + 'argumentCount' => '1' + ), + 'MATCH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::MATCH', + 'argumentCount' => '2,3' + ), + 'MAX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MAX', + 'argumentCount' => '1+' + ), + 'MAXA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MAXA', + 'argumentCount' => '1+' + ), + 'MAXIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MAXIF', + 'argumentCount' => '2+' + ), + 'MDETERM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MDETERM', + 'argumentCount' => '1' + ), + 'MDURATION' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '5,6' + ), + 'MEDIAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MEDIAN', + 'argumentCount' => '1+' + ), + 'MEDIANIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2+' + ), + 'MID' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::MID', + 'argumentCount' => '3' + ), + 'MIDB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::MID', + 'argumentCount' => '3' + ), + 'MIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MIN', + 'argumentCount' => '1+' + ), + 'MINA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MINA', + 'argumentCount' => '1+' + ), + 'MINIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MINIF', + 'argumentCount' => '2+' + ), + 'MINUTE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::MINUTEOFHOUR', + 'argumentCount' => '1' + ), + 'MINVERSE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MINVERSE', + 'argumentCount' => '1' + ), + 'MIRR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::MIRR', + 'argumentCount' => '3' + ), + 'MMULT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MMULT', + 'argumentCount' => '2' + ), + 'MOD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MOD', + 'argumentCount' => '2' + ), + 'MODE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MODE', + 'argumentCount' => '1+' + ), + 'MONTH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::MONTHOFYEAR', + 'argumentCount' => '1' + ), + 'MROUND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MROUND', + 'argumentCount' => '2' + ), + 'MULTINOMIAL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MULTINOMIAL', + 'argumentCount' => '1+' + ), + 'N' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::N', + 'argumentCount' => '1' + ), + 'NA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::NA', + 'argumentCount' => '0' + ), + 'NEGBINOMDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NEGBINOMDIST', + 'argumentCount' => '3' + ), + 'NETWORKDAYS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::NETWORKDAYS', + 'argumentCount' => '2+' + ), + 'NOMINAL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::NOMINAL', + 'argumentCount' => '2' + ), + 'NORMDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMDIST', + 'argumentCount' => '4' + ), + 'NORMINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMINV', + 'argumentCount' => '3' + ), + 'NORMSDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMSDIST', + 'argumentCount' => '1' + ), + 'NORMSINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMSINV', + 'argumentCount' => '1' + ), + 'NOT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::NOT', + 'argumentCount' => '1' + ), + 'NOW' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATETIMENOW', + 'argumentCount' => '0' + ), + 'NPER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::NPER', + 'argumentCount' => '3-5' + ), + 'NPV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::NPV', + 'argumentCount' => '2+' + ), + 'OCT2BIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTOBIN', + 'argumentCount' => '1,2' + ), + 'OCT2DEC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTODEC', + 'argumentCount' => '1' + ), + 'OCT2HEX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTOHEX', + 'argumentCount' => '1,2' + ), + 'ODD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ODD', + 'argumentCount' => '1' + ), + 'ODDFPRICE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '8,9' + ), + 'ODDFYIELD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '8,9' + ), + 'ODDLPRICE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '7,8' + ), + 'ODDLYIELD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '7,8' + ), + 'OFFSET' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::OFFSET', + 'argumentCount' => '3,5', + 'passCellReference'=> true, + 'passByReference' => array(true) + ), + 'OR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::LOGICAL_OR', + 'argumentCount' => '1+' + ), + 'PEARSON' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CORREL', + 'argumentCount' => '2' + ), + 'PERCENTILE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::PERCENTILE', + 'argumentCount' => '2' + ), + 'PERCENTRANK' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::PERCENTRANK', + 'argumentCount' => '2,3' + ), + 'PERMUT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::PERMUT', + 'argumentCount' => '2' + ), + 'PHONETIC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'PI' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'pi', + 'argumentCount' => '0' + ), + 'PMT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PMT', + 'argumentCount' => '3-5' + ), + 'POISSON' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::POISSON', + 'argumentCount' => '3' + ), + 'POWER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::POWER', + 'argumentCount' => '2' + ), + 'PPMT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PPMT', + 'argumentCount' => '4-6' + ), + 'PRICE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PRICE', + 'argumentCount' => '6,7' + ), + 'PRICEDISC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PRICEDISC', + 'argumentCount' => '4,5' + ), + 'PRICEMAT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PRICEMAT', + 'argumentCount' => '5,6' + ), + 'PROB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3,4' + ), + 'PRODUCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::PRODUCT', + 'argumentCount' => '1+' + ), + 'PROPER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::PROPERCASE', + 'argumentCount' => '1' + ), + 'PV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PV', + 'argumentCount' => '3-5' + ), + 'QUARTILE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::QUARTILE', + 'argumentCount' => '2' + ), + 'QUOTIENT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::QUOTIENT', + 'argumentCount' => '2' + ), + 'RADIANS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'deg2rad', + 'argumentCount' => '1' + ), + 'RAND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::RAND', + 'argumentCount' => '0' + ), + 'RANDBETWEEN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::RAND', + 'argumentCount' => '2' + ), + 'RANK' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::RANK', + 'argumentCount' => '2,3' + ), + 'RATE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::RATE', + 'argumentCount' => '3-6' + ), + 'RECEIVED' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::RECEIVED', + 'argumentCount' => '4-5' + ), + 'REPLACE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::REPLACE', + 'argumentCount' => '4' + ), + 'REPLACEB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::REPLACE', + 'argumentCount' => '4' + ), + 'REPT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'str_repeat', + 'argumentCount' => '2' + ), + 'RIGHT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::RIGHT', + 'argumentCount' => '1,2' + ), + 'RIGHTB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::RIGHT', + 'argumentCount' => '1,2' + ), + 'ROMAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ROMAN', + 'argumentCount' => '1,2' + ), + 'ROUND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'round', + 'argumentCount' => '2' + ), + 'ROUNDDOWN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ROUNDDOWN', + 'argumentCount' => '2' + ), + 'ROUNDUP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ROUNDUP', + 'argumentCount' => '2' + ), + 'ROW' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::ROW', + 'argumentCount' => '-1', + 'passByReference' => array(true) + ), + 'ROWS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::ROWS', + 'argumentCount' => '1' + ), + 'RSQ' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::RSQ', + 'argumentCount' => '2' + ), + 'RTD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1+' + ), + 'SEARCH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHINSENSITIVE', + 'argumentCount' => '2,3' + ), + 'SEARCHB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHINSENSITIVE', + 'argumentCount' => '2,3' + ), + 'SECOND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::SECONDOFMINUTE', + 'argumentCount' => '1' + ), + 'SERIESSUM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SERIESSUM', + 'argumentCount' => '4' + ), + 'SIGN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SIGN', + 'argumentCount' => '1' + ), + 'SIN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'sin', + 'argumentCount' => '1' + ), + 'SINH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'sinh', + 'argumentCount' => '1' + ), + 'SKEW' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::SKEW', + 'argumentCount' => '1+' + ), + 'SLN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::SLN', + 'argumentCount' => '3' + ), + 'SLOPE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::SLOPE', + 'argumentCount' => '2' + ), + 'SMALL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::SMALL', + 'argumentCount' => '2' + ), + 'SQRT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'sqrt', + 'argumentCount' => '1' + ), + 'SQRTPI' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SQRTPI', + 'argumentCount' => '1' + ), + 'STANDARDIZE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STANDARDIZE', + 'argumentCount' => '3' + ), + 'STDEV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEV', + 'argumentCount' => '1+' + ), + 'STDEVA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVA', + 'argumentCount' => '1+' + ), + 'STDEVP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVP', + 'argumentCount' => '1+' + ), + 'STDEVPA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVPA', + 'argumentCount' => '1+' + ), + 'STEYX' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STEYX', + 'argumentCount' => '2' + ), + 'SUBSTITUTE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SUBSTITUTE', + 'argumentCount' => '3,4' + ), + 'SUBTOTAL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUBTOTAL', + 'argumentCount' => '2+' + ), + 'SUM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUM', + 'argumentCount' => '1+' + ), + 'SUMIF' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMIF', + 'argumentCount' => '2,3' + ), + 'SUMIFS' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'SUMPRODUCT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMPRODUCT', + 'argumentCount' => '1+' + ), + 'SUMSQ' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMSQ', + 'argumentCount' => '1+' + ), + 'SUMX2MY2' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMX2MY2', + 'argumentCount' => '2' + ), + 'SUMX2PY2' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMX2PY2', + 'argumentCount' => '2' + ), + 'SUMXMY2' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMXMY2', + 'argumentCount' => '2' + ), + 'SYD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::SYD', + 'argumentCount' => '4' + ), + 'T' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::RETURNSTRING', + 'argumentCount' => '1' + ), + 'TAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'tan', + 'argumentCount' => '1' + ), + 'TANH' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'tanh', + 'argumentCount' => '1' + ), + 'TBILLEQ' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::TBILLEQ', + 'argumentCount' => '3' + ), + 'TBILLPRICE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::TBILLPRICE', + 'argumentCount' => '3' + ), + 'TBILLYIELD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::TBILLYIELD', + 'argumentCount' => '3' + ), + 'TDIST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TDIST', + 'argumentCount' => '3' + ), + 'TEXT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::TEXTFORMAT', + 'argumentCount' => '2' + ), + 'TIME' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::TIME', + 'argumentCount' => '3' + ), + 'TIMEVALUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::TIMEVALUE', + 'argumentCount' => '1' + ), + 'TINV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TINV', + 'argumentCount' => '2' + ), + 'TODAY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATENOW', + 'argumentCount' => '0' + ), + 'TRANSPOSE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::TRANSPOSE', + 'argumentCount' => '1' + ), + 'TREND' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TREND', + 'argumentCount' => '1-4' + ), + 'TRIM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::TRIMSPACES', + 'argumentCount' => '1' + ), + 'TRIMMEAN' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TRIMMEAN', + 'argumentCount' => '2' + ), + 'TRUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::TRUE', + 'argumentCount' => '0' + ), + 'TRUNC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::TRUNC', + 'argumentCount' => '1,2' + ), + 'TTEST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '4' + ), + 'TYPE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::TYPE', + 'argumentCount' => '1' + ), + 'UPPER' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::UPPERCASE', + 'argumentCount' => '1' + ), + 'USDOLLAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'VALUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'VAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARFunc', + 'argumentCount' => '1+' + ), + 'VARA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARA', + 'argumentCount' => '1+' + ), + 'VARP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARP', + 'argumentCount' => '1+' + ), + 'VARPA' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARPA', + 'argumentCount' => '1+' + ), + 'VDB' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '5-7' + ), + 'VERSION' => array('category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::VERSION', + 'argumentCount' => '0' + ), + 'VLOOKUP' => array('category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::VLOOKUP', + 'argumentCount' => '3,4' + ), + 'WEEKDAY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DAYOFWEEK', + 'argumentCount' => '1,2' + ), + 'WEEKNUM' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::WEEKOFYEAR', + 'argumentCount' => '1,2' + ), + 'WEIBULL' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::WEIBULL', + 'argumentCount' => '4' + ), + 'WORKDAY' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::WORKDAY', + 'argumentCount' => '2+' + ), + 'XIRR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::XIRR', + 'argumentCount' => '2,3' + ), + 'XNPV' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::XNPV', + 'argumentCount' => '3' + ), + 'YEAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::YEAR', + 'argumentCount' => '1' + ), + 'YEARFRAC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::YEARFRAC', + 'argumentCount' => '2,3' + ), + 'YIELD' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '6,7' + ), + 'YIELDDISC' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::YIELDDISC', + 'argumentCount' => '4,5' + ), + 'YIELDMAT' => array('category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::YIELDMAT', + 'argumentCount' => '5,6' + ), + 'ZTEST' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::ZTEST', + 'argumentCount' => '2-3' + ) + ); + + + // Internal functions used for special control purposes + private static $_controlFunctions = array( + 'MKMATRIX' => array('argumentCount' => '*', + 'functionCall' => 'self::_mkMatrix' + ) + ); + + + + + private function __construct() { + $localeFileDirectory = PHPEXCEL_ROOT.'PHPExcel/locale/'; + foreach (glob($localeFileDirectory.'/*',GLOB_ONLYDIR) as $filename) { + $filename = substr($filename,strlen($localeFileDirectory)+1); + if ($filename != 'en') { + self::$_validLocaleLanguages[] = $filename; + } + } + + $setPrecision = (PHP_INT_SIZE == 4) ? 12 : 16; + $this->_savedPrecision = ini_get('precision'); + if ($this->_savedPrecision < $setPrecision) { + ini_set('precision',$setPrecision); + } + } // function __construct() + + + public function __destruct() { + if ($this->_savedPrecision != ini_get('precision')) { + ini_set('precision',$this->_savedPrecision); + } + } + + /** + * Get an instance of this class + * + * @access public + * @return PHPExcel_Calculation + */ + public static function getInstance() { + if (!isset(self::$_instance) || (self::$_instance === NULL)) { + self::$_instance = new PHPExcel_Calculation(); + } + + return self::$_instance; + } // function getInstance() + + + /** + * Flush the calculation cache for any existing instance of this class + * but only if a PHPExcel_Calculation instance exists + * + * @access public + * @return null + */ + public static function flushInstance() { + if (isset(self::$_instance) && (self::$_instance !== NULL)) { + self::$_instance->clearCalculationCache(); + } + } // function flushInstance() + + + /** + * __clone implementation. Cloning should not be allowed in a Singleton! + * + * @access public + * @throws Exception + */ + public final function __clone() { + throw new Exception ('Cloning a Singleton is not allowed!'); + } // function __clone() + + + /** + * Return the locale-specific translation of TRUE + * + * @access public + * @return string locale-specific translation of TRUE + */ + public static function getTRUE() { + return self::$_localeBoolean['TRUE']; + } + + /** + * Return the locale-specific translation of FALSE + * + * @access public + * @return string locale-specific translation of FALSE + */ + public static function getFALSE() { + return self::$_localeBoolean['FALSE']; + } + + /** + * Set the Array Return Type (Array or Value of first element in the array) + * + * @access public + * @param string $returnType Array return type + * @return boolean Success or failure + */ + public static function setArrayReturnType($returnType) { + if (($returnType == self::RETURN_ARRAY_AS_VALUE) || + ($returnType == self::RETURN_ARRAY_AS_ERROR) || + ($returnType == self::RETURN_ARRAY_AS_ARRAY)) { + self::$returnArrayAsType = $returnType; + return true; + } + return false; + } // function setExcelCalendar() + + + /** + * Return the Array Return Type (Array or Value of first element in the array) + * + * @access public + * @return string $returnType Array return type + */ + public static function getArrayReturnType() { + return self::$returnArrayAsType; + } // function getExcelCalendar() + + + /** + * Is calculation caching enabled? + * + * @access public + * @return boolean + */ + public function getCalculationCacheEnabled() { + return self::$_calculationCacheEnabled; + } // function getCalculationCacheEnabled() + + + /** + * Enable/disable calculation cache + * + * @access public + * @param boolean $pValue + */ + public function setCalculationCacheEnabled($pValue = true) { + self::$_calculationCacheEnabled = $pValue; + $this->clearCalculationCache(); + } // function setCalculationCacheEnabled() + + + /** + * Enable calculation cache + */ + public function enableCalculationCache() { + $this->setCalculationCacheEnabled(true); + } // function enableCalculationCache() + + + /** + * Disable calculation cache + */ + public function disableCalculationCache() { + $this->setCalculationCacheEnabled(false); + } // function disableCalculationCache() + + + /** + * Clear calculation cache + */ + public function clearCalculationCache() { + self::$_calculationCache = array(); + } // function clearCalculationCache() + + + /** + * Get calculation cache expiration time + * + * @return float + */ + public function getCalculationCacheExpirationTime() { + return self::$_calculationCacheExpirationTime; + } // getCalculationCacheExpirationTime() + + + /** + * Set calculation cache expiration time + * + * @param float $pValue + */ + public function setCalculationCacheExpirationTime($pValue = 15) { + self::$_calculationCacheExpirationTime = $pValue; + } // function setCalculationCacheExpirationTime() + + + + + /** + * Get the currently defined locale code + * + * @return string + */ + public function getLocale() { + return self::$_localeLanguage; + } // function getLocale() + + + /** + * Set the locale code + * + * @return boolean + */ + public function setLocale($locale='en_us') { + // Identify our locale and language + $language = $locale = strtolower($locale); + if (strpos($locale,'_') !== false) { + list($language) = explode('_',$locale); + } + + // Test whether we have any language data for this language (any locale) + if (in_array($language,self::$_validLocaleLanguages)) { + // initialise language/locale settings + self::$_localeFunctions = array(); + self::$_localeArgumentSeparator = ','; + self::$_localeBoolean = array('TRUE' => 'TRUE', 'FALSE' => 'FALSE', 'NULL' => 'NULL'); + // Default is English, if user isn't requesting english, then read the necessary data from the locale files + if ($locale != 'en_us') { + // Search for a file with a list of function names for locale + $functionNamesFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.str_replace('_',DIRECTORY_SEPARATOR,$locale).DIRECTORY_SEPARATOR.'functions'; + if (!file_exists($functionNamesFile)) { + // If there isn't a locale specific function file, look for a language specific function file + $functionNamesFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'functions'; + if (!file_exists($functionNamesFile)) { + return false; + } + } + // Retrieve the list of locale or language specific function names + $localeFunctions = file($functionNamesFile,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($localeFunctions as $localeFunction) { + list($localeFunction) = explode('##',$localeFunction); // Strip out comments + if (strpos($localeFunction,'=') !== false) { + list($fName,$lfName) = explode('=',$localeFunction); + $fName = trim($fName); + $lfName = trim($lfName); + if ((isset(self::$_PHPExcelFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) { + self::$_localeFunctions[$fName] = $lfName; + } + } + } + // Default the TRUE and FALSE constants to the locale names of the TRUE() and FALSE() functions + if (isset(self::$_localeFunctions['TRUE'])) { self::$_localeBoolean['TRUE'] = self::$_localeFunctions['TRUE']; } + if (isset(self::$_localeFunctions['FALSE'])) { self::$_localeBoolean['FALSE'] = self::$_localeFunctions['FALSE']; } + + $configFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.str_replace('_',DIRECTORY_SEPARATOR,$locale).DIRECTORY_SEPARATOR.'config'; + if (!file_exists($configFile)) { + $configFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'config'; + } + if (file_exists($configFile)) { + $localeSettings = file($configFile,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($localeSettings as $localeSetting) { + list($localeSetting) = explode('##',$localeSetting); // Strip out comments + if (strpos($localeSetting,'=') !== false) { + list($settingName,$settingValue) = explode('=',$localeSetting); + $settingName = strtoupper(trim($settingName)); + switch ($settingName) { + case 'ARGUMENTSEPARATOR' : + self::$_localeArgumentSeparator = trim($settingValue); + break; + } + } + } + } + } + + self::$functionReplaceFromExcel = self::$functionReplaceToExcel = + self::$functionReplaceFromLocale = self::$functionReplaceToLocale = null; + self::$_localeLanguage = $locale; + return true; + } + return false; + } // function setLocale() + + + + public static function _translateSeparator($fromSeparator,$toSeparator,$formula,&$inBraces) { + $strlen = mb_strlen($formula); + for ($i = 0; $i < $strlen; ++$i) { + $chr = mb_substr($formula,$i,1); + switch ($chr) { + case '{' : $inBraces = true; + break; + case '}' : $inBraces = false; + break; + case $fromSeparator : + if (!$inBraces) { + $formula = mb_substr($formula,0,$i).$toSeparator.mb_substr($formula,$i+1); + } + } + } + return $formula; + } + + private static function _translateFormula($from,$to,$formula,$fromSeparator,$toSeparator) { + // Convert any Excel function names to the required language + if (self::$_localeLanguage !== 'en_us') { + $inBraces = false; + // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators + if (strpos($formula,'"') !== false) { + // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded + // the formula + $temp = explode('"',$formula); + $i = false; + foreach($temp as &$value) { + // Only count/replace in alternating array entries + if ($i = !$i) { + $value = preg_replace($from,$to,$value); + $value = self::_translateSeparator($fromSeparator,$toSeparator,$value,$inBraces); + } + } + unset($value); + // Then rebuild the formula string + $formula = implode('"',$temp); + } else { + // If there's no quoted strings, then we do a simple count/replace + $formula = preg_replace($from,$to,$formula); + $formula = self::_translateSeparator($fromSeparator,$toSeparator,$formula,$inBraces); + } + } + + return $formula; + } + + private static $functionReplaceFromExcel = null; + private static $functionReplaceToLocale = null; + + public function _translateFormulaToLocale($formula) { + if (self::$functionReplaceFromExcel === NULL) { + self::$functionReplaceFromExcel = array(); + foreach(array_keys(self::$_localeFunctions) as $excelFunctionName) { + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])'.preg_quote($excelFunctionName).'([\s]*\()/Ui'; + } + foreach(array_keys(self::$_localeBoolean) as $excelBoolean) { + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])'.preg_quote($excelBoolean).'([^\w\.])/Ui'; + } + + } + + if (self::$functionReplaceToLocale === NULL) { + self::$functionReplaceToLocale = array(); + foreach(array_values(self::$_localeFunctions) as $localeFunctionName) { + self::$functionReplaceToLocale[] = '$1'.trim($localeFunctionName).'$2'; + } + foreach(array_values(self::$_localeBoolean) as $localeBoolean) { + self::$functionReplaceToLocale[] = '$1'.trim($localeBoolean).'$2'; + } + } + + return self::_translateFormula(self::$functionReplaceFromExcel,self::$functionReplaceToLocale,$formula,',',self::$_localeArgumentSeparator); + } // function _translateFormulaToLocale() + + + private static $functionReplaceFromLocale = null; + private static $functionReplaceToExcel = null; + + public function _translateFormulaToEnglish($formula) { + if (self::$functionReplaceFromLocale === NULL) { + self::$functionReplaceFromLocale = array(); + foreach(array_values(self::$_localeFunctions) as $localeFunctionName) { + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])'.preg_quote($localeFunctionName).'([\s]*\()/Ui'; + } + foreach(array_values(self::$_localeBoolean) as $excelBoolean) { + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])'.preg_quote($excelBoolean).'([^\w\.])/Ui'; + } + } + + if (self::$functionReplaceToExcel === NULL) { + self::$functionReplaceToExcel = array(); + foreach(array_keys(self::$_localeFunctions) as $excelFunctionName) { + self::$functionReplaceToExcel[] = '$1'.trim($excelFunctionName).'$2'; + } + foreach(array_keys(self::$_localeBoolean) as $excelBoolean) { + self::$functionReplaceToExcel[] = '$1'.trim($excelBoolean).'$2'; + } + } + + return self::_translateFormula(self::$functionReplaceFromLocale,self::$functionReplaceToExcel,$formula,self::$_localeArgumentSeparator,','); + } // function _translateFormulaToEnglish() + + + public static function _localeFunc($function) { + if (self::$_localeLanguage !== 'en_us') { + $functionName = trim($function,'('); + if (isset(self::$_localeFunctions[$functionName])) { + $brace = ($functionName != $function); + $function = self::$_localeFunctions[$functionName]; + if ($brace) { $function .= '('; } + } + } + return $function; + } + + + + + /** + * Wrap string values in quotes + * + * @param mixed $value + * @return mixed + */ + public static function _wrapResult($value) { + if (is_string($value)) { + // Error values cannot be "wrapped" + if (preg_match('/^'.self::CALCULATION_REGEXP_ERROR.'$/i', $value, $match)) { + // Return Excel errors "as is" + return $value; + } + // Return strings wrapped in quotes + return '"'.$value.'"'; + // Convert numeric errors to NaN error + } else if((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return $value; + } // function _wrapResult() + + + /** + * Remove quotes used as a wrapper to identify string values + * + * @param mixed $value + * @return mixed + */ + public static function _unwrapResult($value) { + if (is_string($value)) { + if ((isset($value{0})) && ($value{0} == '"') && (substr($value,-1) == '"')) { + return substr($value,1,-1); + } + // Convert numeric errors to NaN error + } else if((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { + return PHPExcel_Calculation_Functions::NaN(); + } + return $value; + } // function _unwrapResult() + + + + + /** + * Calculate cell value (using formula from a cell ID) + * Retained for backward compatibility + * + * @access public + * @param PHPExcel_Cell $pCell Cell to calculate + * @return mixed + * @throws Exception + */ + public function calculate(PHPExcel_Cell $pCell = null) { + try { + return $this->calculateCellValue($pCell); + } catch (Exception $e) { + throw(new Exception($e->getMessage())); + } + } // function calculate() + + + /** + * Calculate the value of a cell formula + * + * @access public + * @param PHPExcel_Cell $pCell Cell to calculate + * @param Boolean $resetLog Flag indicating whether the debug log should be reset or not + * @return mixed + * @throws Exception + */ + public function calculateCellValue(PHPExcel_Cell $pCell = null, $resetLog = true) { + if ($resetLog) { + // Initialise the logging settings if requested + $this->formulaError = null; + $this->debugLog = $this->debugLogStack = array(); + $this->_cyclicFormulaCount = 1; + + $returnArrayAsType = self::$returnArrayAsType; + self::$returnArrayAsType = self::RETURN_ARRAY_AS_ARRAY; + } + + // Read the formula from the cell + if ($pCell === NULL) { + return NULL; + } + + if ($resetLog) { + self::$returnArrayAsType = $returnArrayAsType; + } + // Execute the calculation for the cell formula + try { + $result = self::_unwrapResult($this->_calculateFormulaValue($pCell->getValue(), $pCell->getCoordinate(), $pCell)); + } catch (Exception $e) { + throw(new Exception($e->getMessage())); + } + + if ((is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { + $testResult = PHPExcel_Calculation_Functions::flattenArray($result); + if (self::$returnArrayAsType == self::RETURN_ARRAY_AS_ERROR) { + return PHPExcel_Calculation_Functions::VALUE(); + } + // If there's only a single cell in the array, then we allow it + if (count($testResult) != 1) { + // If keys are numeric, then it's a matrix result rather than a cell range result, so we permit it + $r = array_keys($result); + $r = array_shift($r); + if (!is_numeric($r)) { return PHPExcel_Calculation_Functions::VALUE(); } + if (is_array($result[$r])) { + $c = array_keys($result[$r]); + $c = array_shift($c); + if (!is_numeric($c)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + } + $result = array_shift($testResult); + } + + if ($result === NULL) { + return 0; + } elseif((is_float($result)) && ((is_nan($result)) || (is_infinite($result)))) { + return PHPExcel_Calculation_Functions::NaN(); + } + return $result; + } // function calculateCellValue( + + + /** + * Validate and parse a formula string + * + * @param string $formula Formula to parse + * @return array + * @throws Exception + */ + public function parseFormula($formula) { + // Basic validation that this is indeed a formula + // We return an empty array if not + $formula = trim($formula); + if ((!isset($formula{0})) || ($formula{0} != '=')) return array(); + $formula = ltrim(substr($formula,1)); + if (!isset($formula{0})) return array(); + + // Parse the formula and return the token stack + return $this->_parseFormula($formula); + } // function parseFormula() + + + /** + * Calculate the value of a formula + * + * @param string $formula Formula to parse + * @return mixed + * @throws Exception + */ + public function calculateFormula($formula, $cellID=null, PHPExcel_Cell $pCell = null) { + // Initialise the logging settings + $this->formulaError = null; + $this->debugLog = $this->debugLogStack = array(); + + // Disable calculation cacheing because it only applies to cell calculations, not straight formulae + // But don't actually flush any cache + $resetCache = $this->getCalculationCacheEnabled(); + self::$_calculationCacheEnabled = false; + // Execute the calculation + try { + $result = self::_unwrapResult($this->_calculateFormulaValue($formula, $cellID, $pCell)); + } catch (Exception $e) { + throw(new Exception($e->getMessage())); + } + + // Reset calculation cacheing to its previous state + self::$_calculationCacheEnabled = $resetCache; + + return $result; + } // function calculateFormula() + + + /** + * Parse a cell formula and calculate its value + * + * @param string $formula The formula to parse and calculate + * @param string $cellID The ID (e.g. A3) of the cell that we are calculating + * @param PHPExcel_Cell $pCell Cell to calculate + * @return mixed + * @throws Exception + */ + public function _calculateFormulaValue($formula, $cellID=null, PHPExcel_Cell $pCell = null) { +// echo ''.$cellID.'
        '; + $cellValue = ''; + + // Basic validation that this is indeed a formula + // We simply return the "cell value" (formula) if not + $formula = trim($formula); + if ($formula{0} != '=') return self::_wrapResult($formula); + $formula = ltrim(substr($formula,1)); + if (!isset($formula{0})) return self::_wrapResult($formula); + + $wsTitle = "\x00Wrk"; + if ($pCell !== NULL) { + $pCellParent = $pCell->getParent(); + if ($pCellParent !== NULL) { + $wsTitle = $pCellParent->getTitle(); + } + } + // Is calculation cacheing enabled? + if ($cellID !== NULL) { + if (self::$_calculationCacheEnabled) { + // Is the value present in calculation cache? +// echo 'Testing cache value
        '; + if (isset(self::$_calculationCache[$wsTitle][$cellID])) { +// echo 'Value is in cache
        '; + $this->_writeDebug('Testing cache value for cell '.$cellID); + // Is cache still valid? + if ((microtime(true) - self::$_calculationCache[$wsTitle][$cellID]['time']) < self::$_calculationCacheExpirationTime) { +// echo 'Cache time is still valid
        '; + $this->_writeDebug('Retrieving value for '.$cellID.' from cache'); + // Return the cached result + $returnValue = self::$_calculationCache[$wsTitle][$cellID]['data']; +// echo 'Retrieving data value of '.$returnValue.' for '.$cellID.' from cache
        '; + if (is_array($returnValue)) { + $returnValue = PHPExcel_Calculation_Functions::flattenArray($returnValue); + return array_shift($returnValue); + } + return $returnValue; + } else { +// echo 'Cache has expired
        '; + $this->_writeDebug('Cache value for '.$cellID.' has expired'); + // Clear the cache if it's no longer valid + unset(self::$_calculationCache[$wsTitle][$cellID]); + } + } + } + } + + if ((in_array($wsTitle.'!'.$cellID,$this->debugLogStack)) && ($wsTitle != "\x00Wrk")) { + if ($this->cyclicFormulaCount <= 0) { + return $this->_raiseFormulaError('Cyclic Reference in Formula'); + } elseif (($this->_cyclicFormulaCount >= $this->cyclicFormulaCount) && + ($this->_cyclicFormulaCell == $wsTitle.'!'.$cellID)) { + return $cellValue; + } elseif ($this->_cyclicFormulaCell == $wsTitle.'!'.$cellID) { + ++$this->_cyclicFormulaCount; + if ($this->_cyclicFormulaCount >= $this->cyclicFormulaCount) { + return $cellValue; + } + } elseif ($this->_cyclicFormulaCell == '') { + $this->_cyclicFormulaCell = $wsTitle.'!'.$cellID; + if ($this->_cyclicFormulaCount >= $this->cyclicFormulaCount) { + return $cellValue; + } + } + } + $this->debugLogStack[] = $wsTitle.'!'.$cellID; + // Parse the formula onto the token stack and calculate the value + $cellValue = $this->_processTokenStack($this->_parseFormula($formula, $pCell), $cellID, $pCell); + array_pop($this->debugLogStack); + + // Save to calculation cache + if ($cellID !== NULL) { + if (self::$_calculationCacheEnabled) { + self::$_calculationCache[$wsTitle][$cellID]['time'] = microtime(true); + self::$_calculationCache[$wsTitle][$cellID]['data'] = $cellValue; + } + } + + // Return the calculated value + return $cellValue; + } // function _calculateFormulaValue() + + + /** + * Ensure that paired matrix operands are both matrices and of the same size + * + * @param mixed &$operand1 First matrix operand + * @param mixed &$operand2 Second matrix operand + * @param integer $resize Flag indicating whether the matrices should be resized to match + * and (if so), whether the smaller dimension should grow or the + * larger should shrink. + * 0 = no resize + * 1 = shrink to fit + * 2 = extend to fit + */ + private static function _checkMatrixOperands(&$operand1,&$operand2,$resize = 1) { + // Examine each of the two operands, and turn them into an array if they aren't one already + // Note that this function should only be called if one or both of the operand is already an array + if (!is_array($operand1)) { + list($matrixRows,$matrixColumns) = self::_getMatrixDimensions($operand2); + $operand1 = array_fill(0,$matrixRows,array_fill(0,$matrixColumns,$operand1)); + $resize = 0; + } elseif (!is_array($operand2)) { + list($matrixRows,$matrixColumns) = self::_getMatrixDimensions($operand1); + $operand2 = array_fill(0,$matrixRows,array_fill(0,$matrixColumns,$operand2)); + $resize = 0; + } + + list($matrix1Rows,$matrix1Columns) = self::_getMatrixDimensions($operand1); + list($matrix2Rows,$matrix2Columns) = self::_getMatrixDimensions($operand2); + if (($matrix1Rows == $matrix2Columns) && ($matrix2Rows == $matrix1Columns)) { + $resize = 1; + } + + if ($resize == 2) { + // Given two matrices of (potentially) unequal size, convert the smaller in each dimension to match the larger + self::_resizeMatricesExtend($operand1,$operand2,$matrix1Rows,$matrix1Columns,$matrix2Rows,$matrix2Columns); + } elseif ($resize == 1) { + // Given two matrices of (potentially) unequal size, convert the larger in each dimension to match the smaller + self::_resizeMatricesShrink($operand1,$operand2,$matrix1Rows,$matrix1Columns,$matrix2Rows,$matrix2Columns); + } + return array( $matrix1Rows,$matrix1Columns,$matrix2Rows,$matrix2Columns); + } // function _checkMatrixOperands() + + + /** + * Read the dimensions of a matrix, and re-index it with straight numeric keys starting from row 0, column 0 + * + * @param mixed &$matrix matrix operand + * @return array An array comprising the number of rows, and number of columns + */ + public static function _getMatrixDimensions(&$matrix) { + $matrixRows = count($matrix); + $matrixColumns = 0; + foreach($matrix as $rowKey => $rowValue) { + $matrixColumns = max(count($rowValue),$matrixColumns); + if (!is_array($rowValue)) { + $matrix[$rowKey] = array($rowValue); + } else { + $matrix[$rowKey] = array_values($rowValue); + } + } + $matrix = array_values($matrix); + return array($matrixRows,$matrixColumns); + } // function _getMatrixDimensions() + + + /** + * Ensure that paired matrix operands are both matrices of the same size + * + * @param mixed &$matrix1 First matrix operand + * @param mixed &$matrix2 Second matrix operand + */ + private static function _resizeMatricesShrink(&$matrix1,&$matrix2,$matrix1Rows,$matrix1Columns,$matrix2Rows,$matrix2Columns) { + if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) { + if ($matrix2Columns < $matrix1Columns) { + for ($i = 0; $i < $matrix1Rows; ++$i) { + for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) { + unset($matrix1[$i][$j]); + } + } + } + if ($matrix2Rows < $matrix1Rows) { + for ($i = $matrix2Rows; $i < $matrix1Rows; ++$i) { + unset($matrix1[$i]); + } + } + } + + if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) { + if ($matrix1Columns < $matrix2Columns) { + for ($i = 0; $i < $matrix2Rows; ++$i) { + for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) { + unset($matrix2[$i][$j]); + } + } + } + if ($matrix1Rows < $matrix2Rows) { + for ($i = $matrix1Rows; $i < $matrix2Rows; ++$i) { + unset($matrix2[$i]); + } + } + } + } // function _resizeMatricesShrink() + + + /** + * Ensure that paired matrix operands are both matrices of the same size + * + * @param mixed &$matrix1 First matrix operand + * @param mixed &$matrix2 Second matrix operand + */ + private static function _resizeMatricesExtend(&$matrix1,&$matrix2,$matrix1Rows,$matrix1Columns,$matrix2Rows,$matrix2Columns) { + if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) { + if ($matrix2Columns < $matrix1Columns) { + for ($i = 0; $i < $matrix2Rows; ++$i) { + $x = $matrix2[$i][$matrix2Columns-1]; + for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) { + $matrix2[$i][$j] = $x; + } + } + } + if ($matrix2Rows < $matrix1Rows) { + $x = $matrix2[$matrix2Rows-1]; + for ($i = 0; $i < $matrix1Rows; ++$i) { + $matrix2[$i] = $x; + } + } + } + + if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) { + if ($matrix1Columns < $matrix2Columns) { + for ($i = 0; $i < $matrix1Rows; ++$i) { + $x = $matrix1[$i][$matrix1Columns-1]; + for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) { + $matrix1[$i][$j] = $x; + } + } + } + if ($matrix1Rows < $matrix2Rows) { + $x = $matrix1[$matrix1Rows-1]; + for ($i = 0; $i < $matrix2Rows; ++$i) { + $matrix1[$i] = $x; + } + } + } + } // function _resizeMatricesExtend() + + + /** + * Format details of an operand for display in the log (based on operand type) + * + * @param mixed $value First matrix operand + * @return mixed + */ + private function _showValue($value) { + if ($this->writeDebugLog) { + $testArray = PHPExcel_Calculation_Functions::flattenArray($value); + if (count($testArray) == 1) { + $value = array_pop($testArray); + } + + if (is_array($value)) { + $returnMatrix = array(); + $pad = $rpad = ', '; + foreach($value as $row) { + if (is_array($row)) { + $returnMatrix[] = implode($pad,array_map(array($this,'_showValue'),$row)); + $rpad = '; '; + } else { + $returnMatrix[] = $this->_showValue($row); + } + } + return '{ '.implode($rpad,$returnMatrix).' }'; + } elseif(is_string($value) && (trim($value,'"') == $value)) { + return '"'.$value.'"'; + } elseif(is_bool($value)) { + return ($value) ? self::$_localeBoolean['TRUE'] : self::$_localeBoolean['FALSE']; + } + } + return PHPExcel_Calculation_Functions::flattenSingleValue($value); + } // function _showValue() + + + /** + * Format type and details of an operand for display in the log (based on operand type) + * + * @param mixed $value First matrix operand + * @return mixed + */ + private function _showTypeDetails($value) { + if ($this->writeDebugLog) { + $testArray = PHPExcel_Calculation_Functions::flattenArray($value); + if (count($testArray) == 1) { + $value = array_pop($testArray); + } + + if ($value === NULL) { + return 'a NULL value'; + } elseif (is_float($value)) { + $typeString = 'a floating point number'; + } elseif(is_int($value)) { + $typeString = 'an integer number'; + } elseif(is_bool($value)) { + $typeString = 'a boolean'; + } elseif(is_array($value)) { + $typeString = 'a matrix'; + } else { + if ($value == '') { + return 'an empty string'; + } elseif ($value{0} == '#') { + return 'a '.$value.' error'; + } else { + $typeString = 'a string'; + } + } + return $typeString.' with a value of '.$this->_showValue($value); + } + } // function _showTypeDetails() + + + private static function _convertMatrixReferences($formula) { + static $matrixReplaceFrom = array('{',';','}'); + static $matrixReplaceTo = array('MKMATRIX(MKMATRIX(','),MKMATRIX(','))'); + + // Convert any Excel matrix references to the MKMATRIX() function + if (strpos($formula,'{') !== false) { + // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators + if (strpos($formula,'"') !== false) { + // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded + // the formula + $temp = explode('"',$formula); + // Open and Closed counts used for trapping mismatched braces in the formula + $openCount = $closeCount = 0; + $i = false; + foreach($temp as &$value) { + // Only count/replace in alternating array entries + if ($i = !$i) { + $openCount += substr_count($value,'{'); + $closeCount += substr_count($value,'}'); + $value = str_replace($matrixReplaceFrom,$matrixReplaceTo,$value); + } + } + unset($value); + // Then rebuild the formula string + $formula = implode('"',$temp); + } else { + // If there's no quoted strings, then we do a simple count/replace + $openCount = substr_count($formula,'{'); + $closeCount = substr_count($formula,'}'); + $formula = str_replace($matrixReplaceFrom,$matrixReplaceTo,$formula); + } + // Trap for mismatched braces and trigger an appropriate error + if ($openCount < $closeCount) { + if ($openCount > 0) { + return $this->_raiseFormulaError("Formula Error: Mismatched matrix braces '}'"); + } else { + return $this->_raiseFormulaError("Formula Error: Unexpected '}' encountered"); + } + } elseif ($openCount > $closeCount) { + if ($closeCount > 0) { + return $this->_raiseFormulaError("Formula Error: Mismatched matrix braces '{'"); + } else { + return $this->_raiseFormulaError("Formula Error: Unexpected '{' encountered"); + } + } + } + + return $formula; + } // function _convertMatrixReferences() + + + private static function _mkMatrix() { + return func_get_args(); + } // function _mkMatrix() + + + // Convert infix to postfix notation + private function _parseFormula($formula, PHPExcel_Cell $pCell = null) { + if (($formula = self::_convertMatrixReferences(trim($formula))) === false) { + return FALSE; + } + + // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet), + // so we store the parent worksheet so that we can re-attach it when necessary + $pCellParent = ($pCell !== NULL) ? $pCell->getParent() : NULL; + + // Binary Operators + // These operators always work on two values + // Array key is the operator, the value indicates whether this is a left or right associative operator + $operatorAssociativity = array('^' => 0, // Exponentiation + '*' => 0, '/' => 0, // Multiplication and Division + '+' => 0, '-' => 0, // Addition and Subtraction + '&' => 0, // Concatenation + '|' => 0, ':' => 0, // Intersect and Range + '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0 // Comparison + ); + // Comparison (Boolean) Operators + // These operators work on two values, but always return a boolean result + $comparisonOperators = array('>' => true, '<' => true, '=' => true, '>=' => true, '<=' => true, '<>' => true); + + // Operator Precedence + // This list includes all valid operators, whether binary (including boolean) or unary (such as %) + // Array key is the operator, the value is its precedence + $operatorPrecedence = array(':' => 8, // Range + '|' => 7, // Intersect + '~' => 6, // Negation + '%' => 5, // Percentage + '^' => 4, // Exponentiation + '*' => 3, '/' => 3, // Multiplication and Division + '+' => 2, '-' => 2, // Addition and Subtraction + '&' => 1, // Concatenation + '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0 // Comparison + ); + + $regexpMatchString = '/^('.self::CALCULATION_REGEXP_FUNCTION. + '|'.self::CALCULATION_REGEXP_NUMBER. + '|'.self::CALCULATION_REGEXP_STRING. + '|'.self::CALCULATION_REGEXP_OPENBRACE. + '|'.self::CALCULATION_REGEXP_CELLREF. + '|'.self::CALCULATION_REGEXP_NAMEDRANGE. + '|'.self::CALCULATION_REGEXP_ERROR. + ')/si'; + + // Start with initialisation + $index = 0; + $stack = new PHPExcel_Calculation_Token_Stack; + $output = array(); + $expectingOperator = false; // We use this test in syntax-checking the expression to determine when a + // - is a negation or + is a positive operator rather than an operation + $expectingOperand = false; // We use this test in syntax-checking the expression to determine whether an operand + // should be null in a function call + // The guts of the lexical parser + // Loop through the formula extracting each operator and operand in turn + while(true) { +// echo 'Assessing Expression '.substr($formula, $index).'
        '; + $opCharacter = $formula{$index}; // Get the first character of the value at the current index position +// echo 'Initial character of expression block is '.$opCharacter.'
        '; + if ((isset($comparisonOperators[$opCharacter])) && (strlen($formula) > $index) && (isset($comparisonOperators[$formula{$index+1}]))) { + $opCharacter .= $formula{++$index}; +// echo 'Initial character of expression block is comparison operator '.$opCharacter.'
        '; + } + + // Find out if we're currently at the beginning of a number, variable, cell reference, function, parenthesis or operand + $isOperandOrFunction = preg_match($regexpMatchString, substr($formula, $index), $match); +// echo '$isOperandOrFunction is '.(($isOperandOrFunction) ? 'True' : 'False').'
        '; +// var_dump($match); + + if ($opCharacter == '-' && !$expectingOperator) { // Is it a negation instead of a minus? +// echo 'Element is a Negation operator
        '; + $stack->push('Unary Operator','~'); // Put a negation on the stack + ++$index; // and drop the negation symbol + } elseif ($opCharacter == '%' && $expectingOperator) { +// echo 'Element is a Percentage operator
        '; + $stack->push('Unary Operator','%'); // Put a percentage on the stack + ++$index; + } elseif ($opCharacter == '+' && !$expectingOperator) { // Positive (unary plus rather than binary operator plus) can be discarded? +// echo 'Element is a Positive number, not Plus operator
        '; + ++$index; // Drop the redundant plus symbol + } elseif ((($opCharacter == '~') || ($opCharacter == '|')) && (!$isOperandOrFunction)) { // We have to explicitly deny a tilde or pipe, because they are legal + return $this->_raiseFormulaError("Formula Error: Illegal character '~'"); // on the stack but not in the input expression + + } elseif ((isset(self::$_operators[$opCharacter]) or $isOperandOrFunction) && $expectingOperator) { // Are we putting an operator on the stack? +// echo 'Element with value '.$opCharacter.' is an Operator
        '; + while($stack->count() > 0 && + ($o2 = $stack->last()) && + isset(self::$_operators[$o2['value']]) && + @($operatorAssociativity[$opCharacter] ? $operatorPrecedence[$opCharacter] < $operatorPrecedence[$o2['value']] : $operatorPrecedence[$opCharacter] <= $operatorPrecedence[$o2['value']])) { + $output[] = $stack->pop(); // Swap operands and higher precedence operators from the stack to the output + } + $stack->push('Binary Operator',$opCharacter); // Finally put our current operator onto the stack + ++$index; + $expectingOperator = false; + + } elseif ($opCharacter == ')' && $expectingOperator) { // Are we expecting to close a parenthesis? +// echo 'Element is a Closing bracket
        '; + $expectingOperand = false; + while (($o2 = $stack->pop()) && $o2['value'] != '(') { // Pop off the stack back to the last ( + if ($o2 === NULL) return $this->_raiseFormulaError('Formula Error: Unexpected closing brace ")"'); + else $output[] = $o2; + } + $d = $stack->last(2); + if (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $d['value'], $matches)) { // Did this parenthesis just close a function? + $functionName = $matches[1]; // Get the function name +// echo 'Closed Function is '.$functionName.'
        '; + $d = $stack->pop(); + $argumentCount = $d['value']; // See how many arguments there were (argument count is the next value stored on the stack) +// if ($argumentCount == 0) { +// echo 'With no arguments
        '; +// } elseif ($argumentCount == 1) { +// echo 'With 1 argument
        '; +// } else { +// echo 'With '.$argumentCount.' arguments
        '; +// } + $output[] = $d; // Dump the argument count on the output + $output[] = $stack->pop(); // Pop the function and push onto the output + if (isset(self::$_controlFunctions[$functionName])) { +// echo 'Built-in function '.$functionName.'
        '; + $expectedArgumentCount = self::$_controlFunctions[$functionName]['argumentCount']; + $functionCall = self::$_controlFunctions[$functionName]['functionCall']; + } elseif (isset(self::$_PHPExcelFunctions[$functionName])) { +// echo 'PHPExcel function '.$functionName.'
        '; + $expectedArgumentCount = self::$_PHPExcelFunctions[$functionName]['argumentCount']; + $functionCall = self::$_PHPExcelFunctions[$functionName]['functionCall']; + } else { // did we somehow push a non-function on the stack? this should never happen + return $this->_raiseFormulaError("Formula Error: Internal error, non-function on stack"); + } + // Check the argument count + $argumentCountError = false; + if (is_numeric($expectedArgumentCount)) { + if ($expectedArgumentCount < 0) { +// echo '$expectedArgumentCount is between 0 and '.abs($expectedArgumentCount).'
        '; + if ($argumentCount > abs($expectedArgumentCount)) { + $argumentCountError = true; + $expectedArgumentCountString = 'no more than '.abs($expectedArgumentCount); + } + } else { +// echo '$expectedArgumentCount is numeric '.$expectedArgumentCount.'
        '; + if ($argumentCount != $expectedArgumentCount) { + $argumentCountError = true; + $expectedArgumentCountString = $expectedArgumentCount; + } + } + } elseif ($expectedArgumentCount != '*') { + $isOperandOrFunction = preg_match('/(\d*)([-+,])(\d*)/',$expectedArgumentCount,$argMatch); +// print_r($argMatch); +// echo '
        '; + switch ($argMatch[2]) { + case '+' : + if ($argumentCount < $argMatch[1]) { + $argumentCountError = true; + $expectedArgumentCountString = $argMatch[1].' or more '; + } + break; + case '-' : + if (($argumentCount < $argMatch[1]) || ($argumentCount > $argMatch[3])) { + $argumentCountError = true; + $expectedArgumentCountString = 'between '.$argMatch[1].' and '.$argMatch[3]; + } + break; + case ',' : + if (($argumentCount != $argMatch[1]) && ($argumentCount != $argMatch[3])) { + $argumentCountError = true; + $expectedArgumentCountString = 'either '.$argMatch[1].' or '.$argMatch[3]; + } + break; + } + } + if ($argumentCountError) { + return $this->_raiseFormulaError("Formula Error: Wrong number of arguments for $functionName() function: $argumentCount given, ".$expectedArgumentCountString." expected"); + } + } + ++$index; + + } elseif ($opCharacter == ',') { // Is this the separator for function arguments? +// echo 'Element is a Function argument separator
        '; + while (($o2 = $stack->pop()) && $o2['value'] != '(') { // Pop off the stack back to the last ( + if ($o2 === NULL) return $this->_raiseFormulaError("Formula Error: Unexpected ,"); + else $output[] = $o2; // pop the argument expression stuff and push onto the output + } + // If we've a comma when we're expecting an operand, then what we actually have is a null operand; + // so push a null onto the stack + if (($expectingOperand) || (!$expectingOperator)) { + $output[] = array('type' => 'NULL Value', 'value' => self::$_ExcelConstants['NULL'], 'reference' => null); + } + // make sure there was a function + $d = $stack->last(2); + if (!preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $d['value'], $matches)) + return $this->_raiseFormulaError("Formula Error: Unexpected ,"); + $d = $stack->pop(); + $stack->push($d['type'],++$d['value'],$d['reference']); // increment the argument count + $stack->push('Brace', '('); // put the ( back on, we'll need to pop back to it again + $expectingOperator = false; + $expectingOperand = true; + ++$index; + + } elseif ($opCharacter == '(' && !$expectingOperator) { +// echo 'Element is an Opening Bracket
        '; + $stack->push('Brace', '('); + ++$index; + + } elseif ($isOperandOrFunction && !$expectingOperator) { // do we now have a function/variable/number? + $expectingOperator = true; + $expectingOperand = false; + $val = $match[1]; + $length = strlen($val); +// echo 'Element with value '.$val.' is an Operand, Variable, Constant, String, Number, Cell Reference or Function
        '; + + if (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $val, $matches)) { + $val = preg_replace('/\s/','',$val); +// echo 'Element '.$val.' is a Function
        '; + if (isset(self::$_PHPExcelFunctions[strtoupper($matches[1])]) || isset(self::$_controlFunctions[strtoupper($matches[1])])) { // it's a function + $stack->push('Function', strtoupper($val)); + $ax = preg_match('/^\s*(\s*\))/i', substr($formula, $index+$length), $amatch); + if ($ax) { + $stack->push('Operand Count for Function '.strtoupper($val).')', 0); + $expectingOperator = true; + } else { + $stack->push('Operand Count for Function '.strtoupper($val).')', 1); + $expectingOperator = false; + } + $stack->push('Brace', '('); + } else { // it's a var w/ implicit multiplication + $output[] = array('type' => 'Value', 'value' => $matches[1], 'reference' => null); + } + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $val, $matches)) { +// echo 'Element '.$val.' is a Cell reference
        '; + // Watch for this case-change when modifying to allow cell references in different worksheets... + // Should only be applied to the actual cell column, not the worksheet name + + // If the last entry on the stack was a : operator, then we have a cell range reference + $testPrevOp = $stack->last(1); + if ($testPrevOp['value'] == ':') { + // If we have a worksheet reference, then we're playing with a 3D reference + if ($matches[2] == '') { + // Otherwise, we 'inherit' the worksheet reference from the start cell reference + // The start of the cell range reference should be the last entry in $output + $startCellRef = $output[count($output)-1]['value']; + preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $startCellRef, $startMatches); + if ($startMatches[2] > '') { + $val = $startMatches[2].'!'.$val; + } + } else { + return $this->_raiseFormulaError("3D Range references are not yet supported"); + } + } + + $output[] = array('type' => 'Cell Reference', 'value' => $val, 'reference' => $val); +// $expectingOperator = false; + } else { // it's a variable, constant, string, number or boolean +// echo 'Element is a Variable, Constant, String, Number or Boolean
        '; + // If the last entry on the stack was a : operator, then we may have a row or column range reference + $testPrevOp = $stack->last(1); + if ($testPrevOp['value'] == ':') { + $startRowColRef = $output[count($output)-1]['value']; + $rangeWS1 = ''; + if (strpos('!',$startRowColRef) !== false) { + list($rangeWS1,$startRowColRef) = explode('!',$startRowColRef); + } + if ($rangeWS1 != '') $rangeWS1 .= '!'; + $rangeWS2 = $rangeWS1; + if (strpos('!',$val) !== false) { + list($rangeWS2,$val) = explode('!',$val); + } + if ($rangeWS2 != '') $rangeWS2 .= '!'; + if ((is_integer($startRowColRef)) && (ctype_digit($val)) && + ($startRowColRef <= 1048576) && ($val <= 1048576)) { + // Row range + $endRowColRef = ($pCellParent !== NULL) ? $pCellParent->getHighestColumn() : 'XFD'; // Max 16,384 columns for Excel2007 + $output[count($output)-1]['value'] = $rangeWS1.'A'.$startRowColRef; + $val = $rangeWS2.$endRowColRef.$val; + } elseif ((ctype_alpha($startRowColRef)) && (ctype_alpha($val)) && + (strlen($startRowColRef) <= 3) && (strlen($val) <= 3)) { + // Column range + $endRowColRef = ($pCellParent !== NULL) ? $pCellParent->getHighestRow() : 1048576; // Max 1,048,576 rows for Excel2007 + $output[count($output)-1]['value'] = $rangeWS1.strtoupper($startRowColRef).'1'; + $val = $rangeWS2.$val.$endRowColRef; + } + } + + $localeConstant = false; + if ($opCharacter == '"') { +// echo 'Element is a String
        '; + // UnEscape any quotes within the string + $val = self::_wrapResult(str_replace('""','"',self::_unwrapResult($val))); + } elseif (is_numeric($val)) { +// echo 'Element is a Number
        '; + if ((strpos($val,'.') !== false) || (stripos($val,'e') !== false) || ($val > PHP_INT_MAX) || ($val < -PHP_INT_MAX)) { +// echo 'Casting '.$val.' to float
        '; + $val = (float) $val; + } else { +// echo 'Casting '.$val.' to integer
        '; + $val = (integer) $val; + } + } elseif (isset(self::$_ExcelConstants[trim(strtoupper($val))])) { + $excelConstant = trim(strtoupper($val)); +// echo 'Element '.$excelConstant.' is an Excel Constant
        '; + $val = self::$_ExcelConstants[$excelConstant]; + } elseif (($localeConstant = array_search(trim(strtoupper($val)), self::$_localeBoolean)) !== false) { +// echo 'Element '.$localeConstant.' is an Excel Constant
        '; + $val = self::$_ExcelConstants[$localeConstant]; + } + $details = array('type' => 'Value', 'value' => $val, 'reference' => null); + if ($localeConstant) { $details['localeValue'] = $localeConstant; } + $output[] = $details; + } + $index += $length; + + } elseif ($opCharacter == '$') { // absolute row or column range + ++$index; + } elseif ($opCharacter == ')') { // miscellaneous error checking + if ($expectingOperand) { + $output[] = array('type' => 'NULL Value', 'value' => self::$_ExcelConstants['NULL'], 'reference' => null); + $expectingOperand = false; + $expectingOperator = true; + } else { + return $this->_raiseFormulaError("Formula Error: Unexpected ')'"); + } + } elseif (isset(self::$_operators[$opCharacter]) && !$expectingOperator) { + return $this->_raiseFormulaError("Formula Error: Unexpected operator '$opCharacter'"); + } else { // I don't even want to know what you did to get here + return $this->_raiseFormulaError("Formula Error: An unexpected error occured"); + } + // Test for end of formula string + if ($index == strlen($formula)) { + // Did we end with an operator?. + // Only valid for the % unary operator + if ((isset(self::$_operators[$opCharacter])) && ($opCharacter != '%')) { + return $this->_raiseFormulaError("Formula Error: Operator '$opCharacter' has no operands"); + } else { + break; + } + } + // Ignore white space + while (($formula{$index} == "\n") || ($formula{$index} == "\r")) { + ++$index; + } + if ($formula{$index} == ' ') { + while ($formula{$index} == ' ') { + ++$index; + } + // If we're expecting an operator, but only have a space between the previous and next operands (and both are + // Cell References) then we have an INTERSECTION operator +// echo 'Possible Intersect Operator
        '; + if (($expectingOperator) && (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'.*/Ui', substr($formula, $index), $match)) && + ($output[count($output)-1]['type'] == 'Cell Reference')) { +// echo 'Element is an Intersect Operator
        '; + while($stack->count() > 0 && + ($o2 = $stack->last()) && + isset(self::$_operators[$o2['value']]) && + @($operatorAssociativity[$opCharacter] ? $operatorPrecedence[$opCharacter] < $operatorPrecedence[$o2['value']] : $operatorPrecedence[$opCharacter] <= $operatorPrecedence[$o2['value']])) { + $output[] = $stack->pop(); // Swap operands and higher precedence operators from the stack to the output + } + $stack->push('Binary Operator','|'); // Put an Intersect Operator on the stack + $expectingOperator = false; + } + } + } + + while (($op = $stack->pop()) !== NULL) { // pop everything off the stack and push onto output + if ((is_array($opCharacter) && $opCharacter['value'] == '(') || ($opCharacter === '(')) + return $this->_raiseFormulaError("Formula Error: Expecting ')'"); // if there are any opening braces on the stack, then braces were unbalanced + $output[] = $op; + } + return $output; + } // function _parseFormula() + + + private static function _dataTestReference(&$operandData) + { + $operand = $operandData['value']; + if (($operandData['reference'] === NULL) && (is_array($operand))) { + $rKeys = array_keys($operand); + $rowKey = array_shift($rKeys); + $cKeys = array_keys(array_keys($operand[$rowKey])); + $colKey = array_shift($cKeys); + if (ctype_upper($colKey)) { + $operandData['reference'] = $colKey.$rowKey; + } + } + return $operand; + } + + // evaluate postfix notation + private function _processTokenStack($tokens, $cellID = null, PHPExcel_Cell $pCell = null) { + if ($tokens == false) return false; + + // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet), + // so we store the parent worksheet so that we can re-attach it when necessary + $pCellParent = ($pCell !== NULL) ? $pCell->getParent() : null; + $stack = new PHPExcel_Calculation_Token_Stack; + + // Loop through each token in turn + foreach ($tokens as $tokenData) { +// print_r($tokenData); +// echo '
        '; + $token = $tokenData['value']; +// echo 'Token is '.$token.'
        '; + // if the token is a binary operator, pop the top two values off the stack, do the operation, and push the result back on the stack + if (isset(self::$_binaryOperators[$token])) { +// echo 'Token is a binary operator
        '; + // We must have two operands, error if we don't + if (($operand2Data = $stack->pop()) === NULL) return $this->_raiseFormulaError('Internal error - Operand value missing from stack'); + if (($operand1Data = $stack->pop()) === NULL) return $this->_raiseFormulaError('Internal error - Operand value missing from stack'); + + $operand1 = self::_dataTestReference($operand1Data); + $operand2 = self::_dataTestReference($operand2Data); + + // Log what we're doing + if ($token == ':') { + $this->_writeDebug('Evaluating Range '.$this->_showValue($operand1Data['reference']).$token.$this->_showValue($operand2Data['reference'])); + } else { + $this->_writeDebug('Evaluating '.$this->_showValue($operand1).' '.$token.' '.$this->_showValue($operand2)); + } + + // Process the operation in the appropriate manner + switch ($token) { + // Comparison (Boolean) Operators + case '>' : // Greater than + case '<' : // Less than + case '>=' : // Greater than or Equal to + case '<=' : // Less than or Equal to + case '=' : // Equality + case '<>' : // Inequality + $this->_executeBinaryComparisonOperation($cellID,$operand1,$operand2,$token,$stack); + break; + // Binary Operators + case ':' : // Range + $sheet1 = $sheet2 = ''; + if (strpos($operand1Data['reference'],'!') !== false) { + list($sheet1,$operand1Data['reference']) = explode('!',$operand1Data['reference']); + } else { + $sheet1 = ($pCellParent !== NULL) ? $pCellParent->getTitle() : ''; + } + if (strpos($operand2Data['reference'],'!') !== false) { + list($sheet2,$operand2Data['reference']) = explode('!',$operand2Data['reference']); + } else { + $sheet2 = $sheet1; + } + if ($sheet1 == $sheet2) { + if ($operand1Data['reference'] === NULL) { + if ((trim($operand1Data['value']) != '') && (is_numeric($operand1Data['value']))) { + $operand1Data['reference'] = $pCell->getColumn().$operand1Data['value']; + } elseif (trim($operand1Data['reference']) == '') { + $operand1Data['reference'] = $pCell->getCoordinate(); + } else { + $operand1Data['reference'] = $operand1Data['value'].$pCell->getRow(); + } + } + if ($operand2Data['reference'] === NULL) { + if ((trim($operand2Data['value']) != '') && (is_numeric($operand2Data['value']))) { + $operand2Data['reference'] = $pCell->getColumn().$operand2Data['value']; + } elseif (trim($operand2Data['reference']) == '') { + $operand2Data['reference'] = $pCell->getCoordinate(); + } else { + $operand2Data['reference'] = $operand2Data['value'].$pCell->getRow(); + } + } + + $oData = array_merge(explode(':',$operand1Data['reference']),explode(':',$operand2Data['reference'])); + $oCol = $oRow = array(); + foreach($oData as $oDatum) { + $oCR = PHPExcel_Cell::coordinateFromString($oDatum); + $oCol[] = PHPExcel_Cell::columnIndexFromString($oCR[0]) - 1; + $oRow[] = $oCR[1]; + } + $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow); + if ($pCellParent !== NULL) { + $cellValue = $this->extractCellRange($cellRef, $pCellParent->getParent()->getSheetByName($sheet1), false); + } else { + return $this->_raiseFormulaError('Unable to access Cell Reference'); + } + $stack->push('Cell Reference',$cellValue,$cellRef); + } else { + $stack->push('Error',PHPExcel_Calculation_Functions::REF(),null); + } + + break; + case '+' : // Addition + $this->_executeNumericBinaryOperation($cellID,$operand1,$operand2,$token,'plusEquals',$stack); + break; + case '-' : // Subtraction + $this->_executeNumericBinaryOperation($cellID,$operand1,$operand2,$token,'minusEquals',$stack); + break; + case '*' : // Multiplication + $this->_executeNumericBinaryOperation($cellID,$operand1,$operand2,$token,'arrayTimesEquals',$stack); + break; + case '/' : // Division + $this->_executeNumericBinaryOperation($cellID,$operand1,$operand2,$token,'arrayRightDivide',$stack); + break; + case '^' : // Exponential + $this->_executeNumericBinaryOperation($cellID,$operand1,$operand2,$token,'power',$stack); + break; + case '&' : // Concatenation + // If either of the operands is a matrix, we need to treat them both as matrices + // (converting the other operand to a matrix if need be); then perform the required + // matrix operation + if (is_bool($operand1)) { + $operand1 = ($operand1) ? self::$_localeBoolean['TRUE'] : self::$_localeBoolean['FALSE']; + } + if (is_bool($operand2)) { + $operand2 = ($operand2) ? self::$_localeBoolean['TRUE'] : self::$_localeBoolean['FALSE']; + } + if ((is_array($operand1)) || (is_array($operand2))) { + // Ensure that both operands are arrays/matrices + self::_checkMatrixOperands($operand1,$operand2,2); + try { + // Convert operand 1 from a PHP array to a matrix + $matrix = new PHPExcel_Shared_JAMA_Matrix($operand1); + // Perform the required operation against the operand 1 matrix, passing in operand 2 + $matrixResult = $matrix->concat($operand2); + $result = $matrixResult->getArray(); + } catch (Exception $ex) { + $this->_writeDebug('JAMA Matrix Exception: '.$ex->getMessage()); + $result = '#VALUE!'; + } + } else { + $result = '"'.str_replace('""','"',self::_unwrapResult($operand1,'"').self::_unwrapResult($operand2,'"')).'"'; + } + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result)); + $stack->push('Value',$result); + break; + case '|' : // Intersect + $rowIntersect = array_intersect_key($operand1,$operand2); + $cellIntersect = $oCol = $oRow = array(); + foreach(array_keys($rowIntersect) as $row) { + $oRow[] = $row; + foreach($rowIntersect[$row] as $col => $data) { + $oCol[] = PHPExcel_Cell::columnIndexFromString($col) - 1; + $cellIntersect[$row] = array_intersect_key($operand1[$row],$operand2[$row]); + } + } + $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow); + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($cellIntersect)); + $stack->push('Value',$cellIntersect,$cellRef); + break; + } + + // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on + } elseif (($token === '~') || ($token === '%')) { +// echo 'Token is a unary operator
        '; + if (($arg = $stack->pop()) === NULL) return $this->_raiseFormulaError('Internal error - Operand value missing from stack'); + $arg = $arg['value']; + if ($token === '~') { +// echo 'Token is a negation operator
        '; + $this->_writeDebug('Evaluating Negation of '.$this->_showValue($arg)); + $multiplier = -1; + } else { +// echo 'Token is a percentile operator
        '; + $this->_writeDebug('Evaluating Percentile of '.$this->_showValue($arg)); + $multiplier = 0.01; + } + if (is_array($arg)) { + self::_checkMatrixOperands($arg,$multiplier,2); + try { + $matrix1 = new PHPExcel_Shared_JAMA_Matrix($arg); + $matrixResult = $matrix1->arrayTimesEquals($multiplier); + $result = $matrixResult->getArray(); + } catch (Exception $ex) { + $this->_writeDebug('JAMA Matrix Exception: '.$ex->getMessage()); + $result = '#VALUE!'; + } + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result)); + $stack->push('Value',$result); + } else { + $this->_executeNumericBinaryOperation($cellID,$multiplier,$arg,'*','arrayTimesEquals',$stack); + } + + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $token, $matches)) { + $cellRef = null; +// echo 'Element '.$token.' is a Cell reference
        '; + if (isset($matches[8])) { +// echo 'Reference is a Range of cells
        '; + if ($pCell === NULL) { +// We can't access the range, so return a REF error + $cellValue = PHPExcel_Calculation_Functions::REF(); + } else { + $cellRef = $matches[6].$matches[7].':'.$matches[9].$matches[10]; + if ($matches[2] > '') { + $matches[2] = trim($matches[2],"\"'"); + if ((strpos($matches[2],'[') !== false) || (strpos($matches[2],']') !== false)) { + // It's a Reference to an external workbook (not currently supported) + return $this->_raiseFormulaError('Unable to access External Workbook'); + } + $matches[2] = trim($matches[2],"\"'"); +// echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'
        '; + $this->_writeDebug('Evaluating Cell Range '.$cellRef.' in worksheet '.$matches[2]); + if ($pCellParent !== NULL) { + $cellValue = $this->extractCellRange($cellRef, $pCellParent->getParent()->getSheetByName($matches[2]), false); + } else { + return $this->_raiseFormulaError('Unable to access Cell Reference'); + } + $this->_writeDebug('Evaluation Result for cells '.$cellRef.' in worksheet '.$matches[2].' is '.$this->_showTypeDetails($cellValue)); +// $cellRef = $matches[2].'!'.$cellRef; + } else { +// echo '$cellRef='.$cellRef.' in current worksheet
        '; + $this->_writeDebug('Evaluating Cell Range '.$cellRef.' in current worksheet'); + if ($pCellParent !== NULL) { + $cellValue = $this->extractCellRange($cellRef, $pCellParent, false); + } else { + return $this->_raiseFormulaError('Unable to access Cell Reference'); + } + $this->_writeDebug('Evaluation Result for cells '.$cellRef.' is '.$this->_showTypeDetails($cellValue)); + } + } + } else { +// echo 'Reference is a single Cell
        '; + if ($pCell === NULL) { +// We can't access the cell, so return a REF error + $cellValue = PHPExcel_Calculation_Functions::REF(); + } else { + $cellRef = $matches[6].$matches[7]; + if ($matches[2] > '') { + $matches[2] = trim($matches[2],"\"'"); + if ((strpos($matches[2],'[') !== false) || (strpos($matches[2],']') !== false)) { + // It's a Reference to an external workbook (not currently supported) + return $this->_raiseFormulaError('Unable to access External Workbook'); + } +// echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'
        '; + $this->_writeDebug('Evaluating Cell '.$cellRef.' in worksheet '.$matches[2]); + if ($pCellParent !== NULL) { + if ($pCellParent->getParent()->getSheetByName($matches[2])->cellExists($cellRef)) { + $cellValue = $this->extractCellRange($cellRef, $pCellParent->getParent()->getSheetByName($matches[2]), false); + $pCell->attach($pCellParent); + } else { + $cellValue = null; + } + } else { + return $this->_raiseFormulaError('Unable to access Cell Reference'); + } + $this->_writeDebug('Evaluation Result for cell '.$cellRef.' in worksheet '.$matches[2].' is '.$this->_showTypeDetails($cellValue)); +// $cellRef = $matches[2].'!'.$cellRef; + } else { +// echo '$cellRef='.$cellRef.' in current worksheet
        '; + $this->_writeDebug('Evaluating Cell '.$cellRef.' in current worksheet'); + if ($pCellParent->cellExists($cellRef)) { + $cellValue = $this->extractCellRange($cellRef, $pCellParent, false); + $pCell->attach($pCellParent); + } else { + $cellValue = null; + } + $this->_writeDebug('Evaluation Result for cell '.$cellRef.' is '.$this->_showTypeDetails($cellValue)); + } + } + } + $stack->push('Value',$cellValue,$cellRef); + + // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $token, $matches)) { +// echo 'Token is a function
        '; + $functionName = $matches[1]; + $argCount = $stack->pop(); + $argCount = $argCount['value']; + if ($functionName != 'MKMATRIX') { + $this->_writeDebug('Evaluating Function '.self::_localeFunc($functionName).'() with '.(($argCount == 0) ? 'no' : $argCount).' argument'.(($argCount == 1) ? '' : 's')); + } + if ((isset(self::$_PHPExcelFunctions[$functionName])) || (isset(self::$_controlFunctions[$functionName]))) { // function + if (isset(self::$_PHPExcelFunctions[$functionName])) { + $functionCall = self::$_PHPExcelFunctions[$functionName]['functionCall']; + $passByReference = isset(self::$_PHPExcelFunctions[$functionName]['passByReference']); + $passCellReference = isset(self::$_PHPExcelFunctions[$functionName]['passCellReference']); + } elseif (isset(self::$_controlFunctions[$functionName])) { + $functionCall = self::$_controlFunctions[$functionName]['functionCall']; + $passByReference = isset(self::$_controlFunctions[$functionName]['passByReference']); + $passCellReference = isset(self::$_controlFunctions[$functionName]['passCellReference']); + } + // get the arguments for this function +// echo 'Function '.$functionName.' expects '.$argCount.' arguments
        '; + $args = $argArrayVals = array(); + for ($i = 0; $i < $argCount; ++$i) { + $arg = $stack->pop(); + $a = $argCount - $i - 1; + if (($passByReference) && + (isset(self::$_PHPExcelFunctions[$functionName]['passByReference'][$a])) && + (self::$_PHPExcelFunctions[$functionName]['passByReference'][$a])) { + if ($arg['reference'] === NULL) { + $args[] = $cellID; + if ($functionName != 'MKMATRIX') { $argArrayVals[] = $this->_showValue($cellID); } + } else { + $args[] = $arg['reference']; + if ($functionName != 'MKMATRIX') { $argArrayVals[] = $this->_showValue($arg['reference']); } + } + } else { + $args[] = self::_unwrapResult($arg['value']); + if ($functionName != 'MKMATRIX') { $argArrayVals[] = $this->_showValue($arg['value']); } + } + } + // Reverse the order of the arguments + krsort($args); + if (($passByReference) && ($argCount == 0)) { + $args[] = $cellID; + $argArrayVals[] = $this->_showValue($cellID); + } +// echo 'Arguments are: '; +// print_r($args); +// echo '
        '; + if ($functionName != 'MKMATRIX') { + if ($this->writeDebugLog) { + krsort($argArrayVals); + $this->_writeDebug('Evaluating '. self::_localeFunc($functionName).'( '.implode(self::$_localeArgumentSeparator.' ',PHPExcel_Calculation_Functions::flattenArray($argArrayVals)).' )'); + } + } + // Process each argument in turn, building the return value as an array +// if (($argCount == 1) && (is_array($args[1])) && ($functionName != 'MKMATRIX')) { +// $operand1 = $args[1]; +// $this->_writeDebug('Argument is a matrix: '.$this->_showValue($operand1)); +// $result = array(); +// $row = 0; +// foreach($operand1 as $args) { +// if (is_array($args)) { +// foreach($args as $arg) { +// $this->_writeDebug('Evaluating '.self::_localeFunc($functionName).'( '.$this->_showValue($arg).' )'); +// $r = call_user_func_array($functionCall,$arg); +// $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.$this->_showTypeDetails($r)); +// $result[$row][] = $r; +// } +// ++$row; +// } else { +// $this->_writeDebug('Evaluating '.self::_localeFunc($functionName).'( '.$this->_showValue($args).' )'); +// $r = call_user_func_array($functionCall,$args); +// $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.$this->_showTypeDetails($r)); +// $result[] = $r; +// } +// } +// } else { + // Process the argument with the appropriate function call + if ($passCellReference) { + $args[] = $pCell; + } + if (strpos($functionCall,'::') !== false) { + $result = call_user_func_array(explode('::',$functionCall),$args); + } else { + foreach($args as &$arg) { + $arg = PHPExcel_Calculation_Functions::flattenSingleValue($arg); + } + unset($arg); + $result = call_user_func_array($functionCall,$args); + } +// } + if ($functionName != 'MKMATRIX') { + $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.$this->_showTypeDetails($result)); + } + $stack->push('Value',self::_wrapResult($result)); + } + + } else { + // if the token is a number, boolean, string or an Excel error, push it onto the stack + if (isset(self::$_ExcelConstants[strtoupper($token)])) { + $excelConstant = strtoupper($token); +// echo 'Token is a PHPExcel constant: '.$excelConstant.'
        '; + $stack->push('Constant Value',self::$_ExcelConstants[$excelConstant]); + $this->_writeDebug('Evaluating Constant '.$excelConstant.' as '.$this->_showTypeDetails(self::$_ExcelConstants[$excelConstant])); + } elseif ((is_numeric($token)) || ($token === NULL) || (is_bool($token)) || ($token == '') || ($token{0} == '"') || ($token{0} == '#')) { +// echo 'Token is a number, boolean, string, null or an Excel error
        '; + $stack->push('Value',$token); + // if the token is a named range, push the named range name onto the stack + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $token, $matches)) { +// echo 'Token is a named range
        '; + $namedRange = $matches[6]; +// echo 'Named Range is '.$namedRange.'
        '; + $this->_writeDebug('Evaluating Named Range '.$namedRange); + $cellValue = $this->extractNamedRange($namedRange, ((null !== $pCell) ? $pCellParent : null), false); + $pCell->attach($pCellParent); + $this->_writeDebug('Evaluation Result for named range '.$namedRange.' is '.$this->_showTypeDetails($cellValue)); + $stack->push('Named Range',$cellValue,$namedRange); + } else { + return $this->_raiseFormulaError("undefined variable '$token'"); + } + } + } + // when we're out of tokens, the stack should have a single element, the final result + if ($stack->count() != 1) return $this->_raiseFormulaError("internal error"); + $output = $stack->pop(); + $output = $output['value']; + +// if ((is_array($output)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { +// return array_shift(PHPExcel_Calculation_Functions::flattenArray($output)); +// } + return $output; + } // function _processTokenStack() + + + private function _validateBinaryOperand($cellID,&$operand,&$stack) { + // Numbers, matrices and booleans can pass straight through, as they're already valid + if (is_string($operand)) { + // We only need special validations for the operand if it is a string + // Start by stripping off the quotation marks we use to identify true excel string values internally + if ($operand > '' && $operand{0} == '"') { $operand = self::_unwrapResult($operand); } + // If the string is a numeric value, we treat it as a numeric, so no further testing + if (!is_numeric($operand)) { + // If not a numeric, test to see if the value is an Excel error, and so can't be used in normal binary operations + if ($operand > '' && $operand{0} == '#') { + $stack->push('Value', $operand); + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($operand)); + return false; + } elseif (!PHPExcel_Shared_String::convertToNumberIfFraction($operand)) { + // If not a numeric or a fraction, then it's a text string, and so can't be used in mathematical binary operations + $stack->push('Value', '#VALUE!'); + $this->_writeDebug('Evaluation Result is a '.$this->_showTypeDetails('#VALUE!')); + return false; + } + } + } + + // return a true if the value of the operand is one that we can use in normal binary operations + return true; + } // function _validateBinaryOperand() + + + private function _executeBinaryComparisonOperation($cellID,$operand1,$operand2,$operation,&$stack,$recursingArrays=false) { + // If we're dealing with matrix operations, we want a matrix result + if ((is_array($operand1)) || (is_array($operand2))) { + $result = array(); + if ((is_array($operand1)) && (!is_array($operand2))) { + foreach($operand1 as $x => $operandData) { + $this->_writeDebug('Evaluating Comparison '.$this->_showValue($operandData).' '.$operation.' '.$this->_showValue($operand2)); + $this->_executeBinaryComparisonOperation($cellID,$operandData,$operand2,$operation,$stack); + $r = $stack->pop(); + $result[$x] = $r['value']; + } + } elseif ((!is_array($operand1)) && (is_array($operand2))) { + foreach($operand2 as $x => $operandData) { + $this->_writeDebug('Evaluating Comparison '.$this->_showValue($operand1).' '.$operation.' '.$this->_showValue($operandData)); + $this->_executeBinaryComparisonOperation($cellID,$operand1,$operandData,$operation,$stack); + $r = $stack->pop(); + $result[$x] = $r['value']; + } + } else { + if (!$recursingArrays) { self::_checkMatrixOperands($operand1,$operand2,2); } + foreach($operand1 as $x => $operandData) { + $this->_writeDebug('Evaluating Comparison '.$this->_showValue($operandData).' '.$operation.' '.$this->_showValue($operand2[$x])); + $this->_executeBinaryComparisonOperation($cellID,$operandData,$operand2[$x],$operation,$stack,true); + $r = $stack->pop(); + $result[$x] = $r['value']; + } + } + // Log the result details + $this->_writeDebug('Comparison Evaluation Result is '.$this->_showTypeDetails($result)); + // And push the result onto the stack + $stack->push('Array',$result); + return true; + } + + // Simple validate the two operands if they are string values + if (is_string($operand1) && $operand1 > '' && $operand1{0} == '"') { $operand1 = self::_unwrapResult($operand1); } + if (is_string($operand2) && $operand2 > '' && $operand2{0} == '"') { $operand2 = self::_unwrapResult($operand2); } + + // execute the necessary operation + switch ($operation) { + // Greater than + case '>': + $result = ($operand1 > $operand2); + break; + // Less than + case '<': + $result = ($operand1 < $operand2); + break; + // Equality + case '=': + $result = ($operand1 == $operand2); + break; + // Greater than or equal + case '>=': + $result = ($operand1 >= $operand2); + break; + // Less than or equal + case '<=': + $result = ($operand1 <= $operand2); + break; + // Inequality + case '<>': + $result = ($operand1 != $operand2); + break; + } + + // Log the result details + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result)); + // And push the result onto the stack + $stack->push('Value',$result); + return true; + } // function _executeBinaryComparisonOperation() + + + private function _executeNumericBinaryOperation($cellID,$operand1,$operand2,$operation,$matrixFunction,&$stack) { + // Validate the two operands + if (!$this->_validateBinaryOperand($cellID,$operand1,$stack)) return false; + if (!$this->_validateBinaryOperand($cellID,$operand2,$stack)) return false; + + $executeMatrixOperation = false; + // If either of the operands is a matrix, we need to treat them both as matrices + // (converting the other operand to a matrix if need be); then perform the required + // matrix operation + if ((is_array($operand1)) || (is_array($operand2))) { + // Ensure that both operands are arrays/matrices + $executeMatrixOperation = true; + $mSize = array(); + list($mSize[],$mSize[],$mSize[],$mSize[]) = self::_checkMatrixOperands($operand1,$operand2,2); + + // But if they're both single cell matrices, then we can treat them as simple values + if (array_sum($mSize) == 4) { + $executeMatrixOperation = false; + $operand1 = $operand1[0][0]; + $operand2 = $operand2[0][0]; + } + } + + if ($executeMatrixOperation) { + try { + // Convert operand 1 from a PHP array to a matrix + $matrix = new PHPExcel_Shared_JAMA_Matrix($operand1); + // Perform the required operation against the operand 1 matrix, passing in operand 2 + $matrixResult = $matrix->$matrixFunction($operand2); + $result = $matrixResult->getArray(); + } catch (Exception $ex) { + $this->_writeDebug('JAMA Matrix Exception: '.$ex->getMessage()); + $result = '#VALUE!'; + } + } else { + if ((PHPExcel_Calculation_Functions::getCompatibilityMode() != PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) && + ((is_string($operand1) && !is_numeric($operand1)) || (is_string($operand2) && !is_numeric($operand2)))) { + $result = PHPExcel_Calculation_Functions::VALUE(); + } else { + // If we're dealing with non-matrix operations, execute the necessary operation + switch ($operation) { + // Addition + case '+': + $result = $operand1+$operand2; + break; + // Subtraction + case '-': + $result = $operand1-$operand2; + break; + // Multiplication + case '*': + $result = $operand1*$operand2; + break; + // Division + case '/': + if ($operand2 == 0) { + // Trap for Divide by Zero error + $stack->push('Value','#DIV/0!'); + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails('#DIV/0!')); + return false; + } else { + $result = $operand1/$operand2; + } + break; + // Power + case '^': + $result = pow($operand1,$operand2); + break; + } + } + } + + // Log the result details + $this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result)); + // And push the result onto the stack + $stack->push('Value',$result); + return true; + } // function _executeNumericBinaryOperation() + + + private function _writeDebug($message) { + // Only write the debug log if logging is enabled + if ($this->writeDebugLog) { + if ($this->echoDebugLog) { + echo implode(' -> ',$this->debugLogStack).' -> '.$message,'
        '; + } + $this->debugLog[] = implode(' -> ',$this->debugLogStack).' -> '.$message; + } + } // function _writeDebug() + + + // trigger an error, but nicely, if need be + protected function _raiseFormulaError($errorMessage) { + $this->formulaError = $errorMessage; + $this->debugLogStack = array(); + if (!$this->suppressFormulaErrors) throw new Exception($errorMessage); + trigger_error($errorMessage, E_USER_ERROR); + } // function _raiseFormulaError() + + + /** + * Extract range values + * + * @param string &$pRange String based range representation + * @param PHPExcel_Worksheet $pSheet Worksheet + * @return mixed Array of values in range if range contains more than one element. Otherwise, a single value is returned. + * @throws Exception + */ + public function extractCellRange(&$pRange = 'A1', PHPExcel_Worksheet $pSheet = null, $resetLog=true) { + // Return value + $returnValue = array (); + +// echo 'extractCellRange('.$pRange.')
        '; + if ($pSheet !== NULL) { +// echo 'Passed sheet name is '.$pSheet->getTitle().'
        '; +// echo 'Range reference is '.$pRange.'
        '; + if (strpos ($pRange, '!') !== false) { +// echo '$pRange reference includes sheet reference
        '; + $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pRange, true); + $pSheet = $pSheet->getParent()->getSheetByName($worksheetReference[0]); +// echo 'New sheet name is '.$pSheet->getTitle().'
        '; + $pRange = $worksheetReference[1]; +// echo 'Adjusted Range reference is '.$pRange.'
        '; + } + + // Extract range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange); + $pRange = $pSheet->getTitle().'!'.$pRange; + if (!isset($aReferences[1])) { + // Single cell in range + list($currentCol,$currentRow) = sscanf($aReferences[0],'%[A-Z]%d'); + if ($pSheet->cellExists($aReferences[0])) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } else { + // Extract cell data for all cells in the range + foreach ($aReferences as $reference) { + // Extract range + list($currentCol,$currentRow) = sscanf($reference,'%[A-Z]%d'); + + if ($pSheet->cellExists($reference)) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } + } + } + + // Return + return $returnValue; + } // function extractCellRange() + + + /** + * Extract range values + * + * @param string &$pRange String based range representation + * @param PHPExcel_Worksheet $pSheet Worksheet + * @return mixed Array of values in range if range contains more than one element. Otherwise, a single value is returned. + * @throws Exception + */ + public function extractNamedRange(&$pRange = 'A1', PHPExcel_Worksheet $pSheet = null, $resetLog=true) { + // Return value + $returnValue = array (); + +// echo 'extractNamedRange('.$pRange.')
        '; + if ($pSheet !== NULL) { +// echo 'Current sheet name is '.$pSheet->getTitle().'
        '; +// echo 'Range reference is '.$pRange.'
        '; + if (strpos ($pRange, '!') !== false) { +// echo '$pRange reference includes sheet reference
        '; + $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pRange, true); + $pSheet = $pSheet->getParent()->getSheetByName($worksheetReference[0]); +// echo 'New sheet name is '.$pSheet->getTitle().'
        '; + $pRange = $worksheetReference[1]; +// echo 'Adjusted Range reference is '.$pRange.'
        '; + } + + // Named range? + $namedRange = PHPExcel_NamedRange::resolveRange($pRange, $pSheet); + if ($namedRange !== NULL) { + $pSheet = $namedRange->getWorksheet(); +// echo 'Named Range '.$pRange.' ('; + $pRange = $namedRange->getRange(); + $splitRange = PHPExcel_Cell::splitRange($pRange); + // Convert row and column references + if (ctype_alpha($splitRange[0][0])) { + $pRange = $splitRange[0][0] . '1:' . $splitRange[0][1] . $namedRange->getWorksheet()->getHighestRow(); + } elseif(ctype_digit($splitRange[0][0])) { + $pRange = 'A' . $splitRange[0][0] . ':' . $namedRange->getWorksheet()->getHighestColumn() . $splitRange[0][1]; + } +// echo $pRange.') is in sheet '.$namedRange->getWorksheet()->getTitle().'
        '; + +// if ($pSheet->getTitle() != $namedRange->getWorksheet()->getTitle()) { +// if (!$namedRange->getLocalOnly()) { +// $pSheet = $namedRange->getWorksheet(); +// } else { +// return $returnValue; +// } +// } + } else { + return PHPExcel_Calculation_Functions::REF(); + } + + // Extract range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange); +// var_dump($aReferences); + if (!isset($aReferences[1])) { + // Single cell (or single column or row) in range + list($currentCol,$currentRow) = PHPExcel_Cell::coordinateFromString($aReferences[0]); + if ($pSheet->cellExists($aReferences[0])) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } else { + // Extract cell data for all cells in the range + foreach ($aReferences as $reference) { + // Extract range + list($currentCol,$currentRow) = PHPExcel_Cell::coordinateFromString($reference); +// echo 'NAMED RANGE: $currentCol='.$currentCol.' $currentRow='.$currentRow.'
        '; + if ($pSheet->cellExists($reference)) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } + } +// print_r($returnValue); +// echo '
        '; + } + + // Return + return $returnValue; + } // function extractNamedRange() + + + /** + * Is a specific function implemented? + * + * @param string $pFunction Function Name + * @return boolean + */ + public function isImplemented($pFunction = '') { + $pFunction = strtoupper ($pFunction); + if (isset(self::$_PHPExcelFunctions[$pFunction])) { + return (self::$_PHPExcelFunctions[$pFunction]['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY'); + } else { + return false; + } + } // function isImplemented() + + + /** + * Get a list of all implemented functions as an array of function objects + * + * @return array of PHPExcel_Calculation_Function + */ + public function listFunctions() { + // Return value + $returnValue = array(); + // Loop functions + foreach(self::$_PHPExcelFunctions as $functionName => $function) { + if ($function['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY') { + $returnValue[$functionName] = new PHPExcel_Calculation_Function($function['category'], + $functionName, + $function['functionCall'] + ); + } + } + + // Return + return $returnValue; + } // function listFunctions() + + + /** + * Get a list of all Excel function names + * + * @return array + */ + public function listAllFunctionNames() { + return array_keys(self::$_PHPExcelFunctions); + } // function listAllFunctionNames() + + /** + * Get a list of implemented Excel function names + * + * @return array + */ + public function listFunctionNames() { + // Return value + $returnValue = array(); + // Loop functions + foreach(self::$_PHPExcelFunctions as $functionName => $function) { + if ($function['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY') { + $returnValue[] = $functionName; + } + } + + // Return + return $returnValue; + } // function listFunctionNames() + +} // class PHPExcel_Calculation + diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Database.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Database.php new file mode 100644 index 000000000..4a6c8f72c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Database.php @@ -0,0 +1,725 @@ + $criteriaName) { + $testCondition = array(); + $testConditionCount = 0; + foreach($criteria as $row => $criterion) { + if ($criterion[$key] > '') { + $testCondition[] = '[:'.$criteriaName.']'.PHPExcel_Calculation_Functions::_ifCondition($criterion[$key]); + $testConditionCount++; + } + } + if ($testConditionCount > 1) { + $testConditions[] = 'OR('.implode(',',$testCondition).')'; + $testConditionsCount++; + } elseif($testConditionCount == 1) { + $testConditions[] = $testCondition[0]; + $testConditionsCount++; + } + } + + if ($testConditionsCount > 1) { + $testConditionSet = 'AND('.implode(',',$testConditions).')'; + } elseif($testConditionsCount == 1) { + $testConditionSet = $testConditions[0]; + } + + // Loop through each row of the database + foreach($database as $dataRow => $dataValues) { + // Substitute actual values from the database row for our [:placeholders] + $testConditionList = $testConditionSet; + foreach($criteriaNames as $key => $criteriaName) { + $k = array_search($criteriaName,$fieldNames); + if (isset($dataValues[$k])) { + $dataValue = $dataValues[$k]; + $dataValue = (is_string($dataValue)) ? PHPExcel_Calculation::_wrapResult(strtoupper($dataValue)) : $dataValue; + $testConditionList = str_replace('[:'.$criteriaName.']',$dataValue,$testConditionList); + } + } + // evaluate the criteria against the row data + $result = PHPExcel_Calculation::getInstance()->_calculateFormulaValue('='.$testConditionList); + // If the row failed to meet the criteria, remove it from the database + if (!$result) { + unset($database[$dataRow]); + } + } + + return $database; + } + + + /** + * DAVERAGE + * + * Averages the values in a column of a list or database that match conditions you specify. + * + * Excel Function: + * DAVERAGE(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DAVERAGE($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::AVERAGE($colData); + } // function DAVERAGE() + + + /** + * DCOUNT + * + * Counts the cells that contain numbers in a column of a list or database that match conditions + * that you specify. + * + * Excel Function: + * DCOUNT(database,[field],criteria) + * + * Excel Function: + * DAVERAGE(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return integer + * + * @TODO The field argument is optional. If field is omitted, DCOUNT counts all records in the + * database that match the criteria. + * + */ + public static function DCOUNT($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::COUNT($colData); + } // function DCOUNT() + + + /** + * DCOUNTA + * + * Counts the nonblank cells in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DCOUNTA(database,[field],criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return integer + * + * @TODO The field argument is optional. If field is omitted, DCOUNTA counts all records in the + * database that match the criteria. + * + */ + public static function DCOUNTA($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::COUNTA($colData); + } // function DCOUNTA() + + + /** + * DGET + * + * Extracts a single value from a column of a list or database that matches conditions that you + * specify. + * + * Excel Function: + * DGET(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return mixed + * + */ + public static function DGET($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + if (count($colData) > 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return $colData[0]; + } // function DGET() + + + /** + * DMAX + * + * Returns the largest number in a column of a list or database that matches conditions you that + * specify. + * + * Excel Function: + * DMAX(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DMAX($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::MAX($colData); + } // function DMAX() + + + /** + * DMIN + * + * Returns the smallest number in a column of a list or database that matches conditions you that + * specify. + * + * Excel Function: + * DMIN(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DMIN($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::MIN($colData); + } // function DMIN() + + + /** + * DPRODUCT + * + * Multiplies the values in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DPRODUCT(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DPRODUCT($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_MathTrig::PRODUCT($colData); + } // function DPRODUCT() + + + /** + * DSTDEV + * + * Estimates the standard deviation of a population based on a sample by using the numbers in a + * column of a list or database that match conditions that you specify. + * + * Excel Function: + * DSTDEV(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DSTDEV($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::STDEV($colData); + } // function DSTDEV() + + + /** + * DSTDEVP + * + * Calculates the standard deviation of a population based on the entire population by using the + * numbers in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DSTDEVP(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DSTDEVP($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::STDEVP($colData); + } // function DSTDEVP() + + + /** + * DSUM + * + * Adds the numbers in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DSUM(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DSUM($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_MathTrig::SUM($colData); + } // function DSUM() + + + /** + * DVAR + * + * Estimates the variance of a population based on a sample by using the numbers in a column + * of a list or database that match conditions that you specify. + * + * Excel Function: + * DVAR(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DVAR($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::VARFunc($colData); + } // function DVAR() + + + /** + * DVARP + * + * Calculates the variance of a population based on the entire population by using the numbers + * in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DVARP(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DVARP($database,$field,$criteria) { + $field = self::__fieldExtract($database,$field); + if (is_null($field)) { + return NULL; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::__filter($database,$criteria); + // extract an array of values for the requested column + $colData = array(); + foreach($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::VARP($colData); + } // function DVARP() + + +} // class PHPExcel_Calculation_Database diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/DateTime.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/DateTime.php new file mode 100644 index 000000000..3b5dc45aa --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/DateTime.php @@ -0,0 +1,1447 @@ +format('m'); + $oYear = (int) $PHPDateObject->format('Y'); + + $adjustmentMonthsString = (string) $adjustmentMonths; + if ($adjustmentMonths > 0) { + $adjustmentMonthsString = '+'.$adjustmentMonths; + } + if ($adjustmentMonths != 0) { + $PHPDateObject->modify($adjustmentMonthsString.' months'); + } + $nMonth = (int) $PHPDateObject->format('m'); + $nYear = (int) $PHPDateObject->format('Y'); + + $monthDiff = ($nMonth - $oMonth) + (($nYear - $oYear) * 12); + if ($monthDiff != $adjustmentMonths) { + $adjustDays = (int) $PHPDateObject->format('d'); + $adjustDaysString = '-'.$adjustDays.' days'; + $PHPDateObject->modify($adjustDaysString); + } + return $PHPDateObject; + } // function _adjustDateByMonths() + + + /** + * DATETIMENOW + * + * Returns the current date and time. + * The NOW function is useful when you need to display the current date and time on a worksheet or + * calculate a value based on the current date and time, and have that value updated each time you + * open the worksheet. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * and time format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * NOW() + * + * @access public + * @category Date/Time Functions + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATETIMENOW() { + $saveTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $retValue = False; + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + $retValue = (float) PHPExcel_Shared_Date::PHPToExcel(time()); + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + $retValue = (integer) time(); + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + $retValue = new DateTime(); + break; + } + date_default_timezone_set($saveTimeZone); + + return $retValue; + } // function DATETIMENOW() + + + /** + * DATENOW + * + * Returns the current date. + * The NOW function is useful when you need to display the current date and time on a worksheet or + * calculate a value based on the current date and time, and have that value updated each time you + * open the worksheet. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * and time format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * TODAY() + * + * @access public + * @category Date/Time Functions + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATENOW() { + $saveTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $retValue = False; + $excelDateTime = floor(PHPExcel_Shared_Date::PHPToExcel(time())); + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + $retValue = (float) $excelDateTime; + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + $retValue = (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateTime); + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + $retValue = PHPExcel_Shared_Date::ExcelToPHPObject($excelDateTime); + break; + } + date_default_timezone_set($saveTimeZone); + + return $retValue; + } // function DATENOW() + + + /** + * DATE + * + * The DATE function returns a value that represents a particular date. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * DATE(year,month,day) + * + * @access public + * @category Date/Time Functions + * @param integer $year The value of the year argument can include one to four digits. + * Excel interprets the year argument according to the configured + * date system: 1900 or 1904. + * If year is between 0 (zero) and 1899 (inclusive), Excel adds that + * value to 1900 to calculate the year. For example, DATE(108,1,2) + * returns January 2, 2008 (1900+108). + * If year is between 1900 and 9999 (inclusive), Excel uses that + * value as the year. For example, DATE(2008,1,2) returns January 2, + * 2008. + * If year is less than 0 or is 10000 or greater, Excel returns the + * #NUM! error value. + * @param integer $month A positive or negative integer representing the month of the year + * from 1 to 12 (January to December). + * If month is greater than 12, month adds that number of months to + * the first month in the year specified. For example, DATE(2008,14,2) + * returns the serial number representing February 2, 2009. + * If month is less than 1, month subtracts the magnitude of that + * number of months, plus 1, from the first month in the year + * specified. For example, DATE(2008,-3,2) returns the serial number + * representing September 2, 2007. + * @param integer $day A positive or negative integer representing the day of the month + * from 1 to 31. + * If day is greater than the number of days in the month specified, + * day adds that number of days to the first day in the month. For + * example, DATE(2008,1,35) returns the serial number representing + * February 4, 2008. + * If day is less than 1, day subtracts the magnitude that number of + * days, plus one, from the first day of the month specified. For + * example, DATE(2008,1,-15) returns the serial number representing + * December 16, 2007. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATE($year = 0, $month = 1, $day = 1) { + $year = PHPExcel_Calculation_Functions::flattenSingleValue($year); + $month = PHPExcel_Calculation_Functions::flattenSingleValue($month); + $day = PHPExcel_Calculation_Functions::flattenSingleValue($day); + + $year = ($year !== NULL) ? PHPExcel_Shared_String::testStringAsNumeric($year) : 0; + $month = ($month !== NULL) ? PHPExcel_Shared_String::testStringAsNumeric($month) : 0; + $day = ($day !== NULL) ? PHPExcel_Shared_String::testStringAsNumeric($day) : 0; + if ((!is_numeric($year)) || + (!is_numeric($month)) || + (!is_numeric($day))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $year = (integer) $year; + $month = (integer) $month; + $day = (integer) $day; + + $baseYear = PHPExcel_Shared_Date::getExcelCalendar(); + // Validate parameters + if ($year < ($baseYear-1900)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((($baseYear-1900) != 0) && ($year < $baseYear) && ($year >= 1900)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (($year < $baseYear) && ($year >= ($baseYear-1900))) { + $year += 1900; + } + + if ($month < 1) { + // Handle year/month adjustment if month < 1 + --$month; + $year += ceil($month / 12) - 1; + $month = 13 - abs($month % 12); + } elseif ($month > 12) { + // Handle year/month adjustment if month > 12 + $year += floor($month / 12); + $month = ($month % 12); + } + + // Re-validate the year parameter after adjustments + if (($year < $baseYear) || ($year >= 10000)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year, $month, $day); + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + return (float) $excelDateValue; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateValue); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + return PHPExcel_Shared_Date::ExcelToPHPObject($excelDateValue); + } + } // function DATE() + + + /** + * TIME + * + * The TIME function returns a value that represents a particular time. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * TIME(hour,minute,second) + * + * @access public + * @category Date/Time Functions + * @param integer $hour A number from 0 (zero) to 32767 representing the hour. + * Any value greater than 23 will be divided by 24 and the remainder + * will be treated as the hour value. For example, TIME(27,0,0) = + * TIME(3,0,0) = .125 or 3:00 AM. + * @param integer $minute A number from 0 to 32767 representing the minute. + * Any value greater than 59 will be converted to hours and minutes. + * For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM. + * @param integer $second A number from 0 to 32767 representing the second. + * Any value greater than 59 will be converted to hours, minutes, + * and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 + * or 12:33:20 AM + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function TIME($hour = 0, $minute = 0, $second = 0) { + $hour = PHPExcel_Calculation_Functions::flattenSingleValue($hour); + $minute = PHPExcel_Calculation_Functions::flattenSingleValue($minute); + $second = PHPExcel_Calculation_Functions::flattenSingleValue($second); + + if ($hour == '') { $hour = 0; } + if ($minute == '') { $minute = 0; } + if ($second == '') { $second = 0; } + + if ((!is_numeric($hour)) || (!is_numeric($minute)) || (!is_numeric($second))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $hour = (integer) $hour; + $minute = (integer) $minute; + $second = (integer) $second; + + if ($second < 0) { + $minute += floor($second / 60); + $second = 60 - abs($second % 60); + if ($second == 60) { $second = 0; } + } elseif ($second >= 60) { + $minute += floor($second / 60); + $second = $second % 60; + } + if ($minute < 0) { + $hour += floor($minute / 60); + $minute = 60 - abs($minute % 60); + if ($minute == 60) { $minute = 0; } + } elseif ($minute >= 60) { + $hour += floor($minute / 60); + $minute = $minute % 60; + } + + if ($hour > 23) { + $hour = $hour % 24; + } elseif ($hour < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + $date = 0; + $calendar = PHPExcel_Shared_Date::getExcelCalendar(); + if ($calendar != PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900) { + $date = 1; + } + return (float) PHPExcel_Shared_Date::FormattedPHPToExcel($calendar, 1, $date, $hour, $minute, $second); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::FormattedPHPToExcel(1970, 1, 1, $hour, $minute, $second)); // -2147468400; // -2147472000 + 3600 + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + $dayAdjust = 0; + if ($hour < 0) { + $dayAdjust = floor($hour / 24); + $hour = 24 - abs($hour % 24); + if ($hour == 24) { $hour = 0; } + } elseif ($hour >= 24) { + $dayAdjust = floor($hour / 24); + $hour = $hour % 24; + } + $phpDateObject = new DateTime('1900-01-01 '.$hour.':'.$minute.':'.$second); + if ($dayAdjust != 0) { + $phpDateObject->modify($dayAdjust.' days'); + } + return $phpDateObject; + } + } // function TIME() + + + /** + * DATEVALUE + * + * Returns a value that represents a particular date. + * Use DATEVALUE to convert a date represented by a text string to an Excel or PHP date/time stamp + * value. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * DATEVALUE(dateValue) + * + * @access public + * @category Date/Time Functions + * @param string $dateValue Text that represents a date in a Microsoft Excel date format. + * For example, "1/30/2008" or "30-Jan-2008" are text strings within + * quotation marks that represent dates. Using the default date + * system in Excel for Windows, date_text must represent a date from + * January 1, 1900, to December 31, 9999. Using the default date + * system in Excel for the Macintosh, date_text must represent a date + * from January 1, 1904, to December 31, 9999. DATEVALUE returns the + * #VALUE! error value if date_text is out of this range. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATEVALUE($dateValue = 1) { + $dateValue = trim(PHPExcel_Calculation_Functions::flattenSingleValue($dateValue),'"'); + // Strip any ordinals because they're allowed in Excel (English only) + $dateValue = preg_replace('/(\d)(st|nd|rd|th)([ -\/])/Ui','$1$3',$dateValue); + // Convert separators (/ . or space) to hyphens (should also handle dot used for ordinals in some countries, e.g. Denmark, Germany) + $dateValue = str_replace(array('/','.','-',' '),array(' ',' ',' ',' '),$dateValue); + + $yearFound = false; + $t1 = explode(' ',$dateValue); + foreach($t1 as &$t) { + if ((is_numeric($t)) && ($t > 31)) { + if ($yearFound) { + return PHPExcel_Calculation_Functions::VALUE(); + } else { + if ($t < 100) { $t += 1900; } + $yearFound = true; + } + } + } + if ((count($t1) == 1) && (strpos($t,':') != false)) { + // We've been fed a time value without any date + return 0.0; + } elseif (count($t1) == 2) { + // We only have two parts of the date: either day/month or month/year + if ($yearFound) { + array_unshift($t1,1); + } else { + array_push($t1,date('Y')); + } + } + unset($t); + $dateValue = implode(' ',$t1); + + $PHPDateArray = date_parse($dateValue); + if (($PHPDateArray === False) || ($PHPDateArray['error_count'] > 0)) { + $testVal1 = strtok($dateValue,'- '); + if ($testVal1 !== False) { + $testVal2 = strtok('- '); + if ($testVal2 !== False) { + $testVal3 = strtok('- '); + if ($testVal3 === False) { + $testVal3 = strftime('%Y'); + } + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $PHPDateArray = date_parse($testVal1.'-'.$testVal2.'-'.$testVal3); + if (($PHPDateArray === False) || ($PHPDateArray['error_count'] > 0)) { + $PHPDateArray = date_parse($testVal2.'-'.$testVal1.'-'.$testVal3); + if (($PHPDateArray === False) || ($PHPDateArray['error_count'] > 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + } + + if (($PHPDateArray !== False) && ($PHPDateArray['error_count'] == 0)) { + // Execute function + if ($PHPDateArray['year'] == '') { $PHPDateArray['year'] = strftime('%Y'); } + if ($PHPDateArray['year'] < 1900) + return PHPExcel_Calculation_Functions::VALUE(); + if ($PHPDateArray['month'] == '') { $PHPDateArray['month'] = strftime('%m'); } + if ($PHPDateArray['day'] == '') { $PHPDateArray['day'] = strftime('%d'); } + $excelDateValue = floor(PHPExcel_Shared_Date::FormattedPHPToExcel($PHPDateArray['year'],$PHPDateArray['month'],$PHPDateArray['day'],$PHPDateArray['hour'],$PHPDateArray['minute'],$PHPDateArray['second'])); + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + return (float) $excelDateValue; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateValue); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + return new DateTime($PHPDateArray['year'].'-'.$PHPDateArray['month'].'-'.$PHPDateArray['day'].' 00:00:00'); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function DATEVALUE() + + + /** + * TIMEVALUE + * + * Returns a value that represents a particular time. + * Use TIMEVALUE to convert a time represented by a text string to an Excel or PHP date/time stamp + * value. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * TIMEVALUE(timeValue) + * + * @access public + * @category Date/Time Functions + * @param string $timeValue A text string that represents a time in any one of the Microsoft + * Excel time formats; for example, "6:45 PM" and "18:45" text strings + * within quotation marks that represent time. + * Date information in time_text is ignored. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function TIMEVALUE($timeValue) { + $timeValue = trim(PHPExcel_Calculation_Functions::flattenSingleValue($timeValue),'"'); + $timeValue = str_replace(array('/','.'),array('-','-'),$timeValue); + + $PHPDateArray = date_parse($timeValue); + if (($PHPDateArray !== False) && ($PHPDateArray['error_count'] == 0)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel($PHPDateArray['year'],$PHPDateArray['month'],$PHPDateArray['day'],$PHPDateArray['hour'],$PHPDateArray['minute'],$PHPDateArray['second']); + } else { + $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel(1900,1,1,$PHPDateArray['hour'],$PHPDateArray['minute'],$PHPDateArray['second']) - 1; + } + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + return (float) $excelDateValue; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) $phpDateValue = PHPExcel_Shared_Date::ExcelToPHP($excelDateValue+25569) - 3600;; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + return new DateTime('1900-01-01 '.$PHPDateArray['hour'].':'.$PHPDateArray['minute'].':'.$PHPDateArray['second']); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function TIMEVALUE() + + + /** + * DATEDIF + * + * @param mixed $startDate Excel date serial value, PHP date/time stamp, PHP DateTime object + * or a standard date string + * @param mixed $endDate Excel date serial value, PHP date/time stamp, PHP DateTime object + * or a standard date string + * @param string $unit + * @return integer Interval between the dates + */ + public static function DATEDIF($startDate = 0, $endDate = 0, $unit = 'D') { + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + $unit = strtoupper(PHPExcel_Calculation_Functions::flattenSingleValue($unit)); + + if (is_string($startDate = self::_getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($endDate = self::_getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Validate parameters + if ($startDate >= $endDate) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $difference = $endDate - $startDate; + + $PHPStartDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($startDate); + $startDays = $PHPStartDateObject->format('j'); + $startMonths = $PHPStartDateObject->format('n'); + $startYears = $PHPStartDateObject->format('Y'); + + $PHPEndDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($endDate); + $endDays = $PHPEndDateObject->format('j'); + $endMonths = $PHPEndDateObject->format('n'); + $endYears = $PHPEndDateObject->format('Y'); + + $retVal = PHPExcel_Calculation_Functions::NaN(); + switch ($unit) { + case 'D': + $retVal = intval($difference); + break; + case 'M': + $retVal = intval($endMonths - $startMonths) + (intval($endYears - $startYears) * 12); + // We're only interested in full months + if ($endDays < $startDays) { + --$retVal; + } + break; + case 'Y': + $retVal = intval($endYears - $startYears); + // We're only interested in full months + if ($endMonths < $startMonths) { + --$retVal; + } elseif (($endMonths == $startMonths) && ($endDays < $startDays)) { + --$retVal; + } + break; + case 'MD': + if ($endDays < $startDays) { + $retVal = $endDays; + $PHPEndDateObject->modify('-'.$endDays.' days'); + $adjustDays = $PHPEndDateObject->format('j'); + if ($adjustDays > $startDays) { + $retVal += ($adjustDays - $startDays); + } + } else { + $retVal = $endDays - $startDays; + } + break; + case 'YM': + $retVal = intval($endMonths - $startMonths); + if ($retVal < 0) $retVal = 12 + $retVal; + // We're only interested in full months + if ($endDays < $startDays) { + --$retVal; + } + break; + case 'YD': + $retVal = intval($difference); + if ($endYears > $startYears) { + while ($endYears > $startYears) { + $PHPEndDateObject->modify('-1 year'); + $endYears = $PHPEndDateObject->format('Y'); + } + $retVal = $PHPEndDateObject->format('z') - $PHPStartDateObject->format('z'); + if ($retVal < 0) { $retVal += 365; } + } + break; + default: + $retVal = PHPExcel_Calculation_Functions::NaN(); + } + return $retVal; + } // function DATEDIF() + + + /** + * DAYS360 + * + * Returns the number of days between two dates based on a 360-day year (twelve 30-day months), + * which is used in some accounting calculations. Use this function to help compute payments if + * your accounting system is based on twelve 30-day months. + * + * Excel Function: + * DAYS360(startDate,endDate[,method]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param boolean $method US or European Method + * FALSE or omitted: U.S. (NASD) method. If the starting date is + * the last day of a month, it becomes equal to the 30th of the + * same month. If the ending date is the last day of a month and + * the starting date is earlier than the 30th of a month, the + * ending date becomes equal to the 1st of the next month; + * otherwise the ending date becomes equal to the 30th of the + * same month. + * TRUE: European method. Starting dates and ending dates that + * occur on the 31st of a month become equal to the 30th of the + * same month. + * @return integer Number of days between start date and end date + */ + public static function DAYS360($startDate = 0, $endDate = 0, $method = false) { + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + + if (is_string($startDate = self::_getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($endDate = self::_getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Execute function + $PHPStartDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($startDate); + $startDay = $PHPStartDateObject->format('j'); + $startMonth = $PHPStartDateObject->format('n'); + $startYear = $PHPStartDateObject->format('Y'); + + $PHPEndDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($endDate); + $endDay = $PHPEndDateObject->format('j'); + $endMonth = $PHPEndDateObject->format('n'); + $endYear = $PHPEndDateObject->format('Y'); + + return self::_dateDiff360($startDay, $startMonth, $startYear, $endDay, $endMonth, $endYear, !$method); + } // function DAYS360() + + + /** + * YEARFRAC + * + * Calculates the fraction of the year represented by the number of whole days between two dates + * (the start_date and the end_date). + * Use the YEARFRAC worksheet function to identify the proportion of a whole year's benefits or + * obligations to assign to a specific term. + * + * Excel Function: + * YEARFRAC(startDate,endDate[,method]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param integer $method Method used for the calculation + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float fraction of the year + */ + public static function YEARFRAC($startDate = 0, $endDate = 0, $method = 0) { + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + $method = PHPExcel_Calculation_Functions::flattenSingleValue($method); + + if (is_string($startDate = self::_getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($endDate = self::_getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (((is_numeric($method)) && (!is_string($method))) || ($method == '')) { + switch($method) { + case 0 : + return self::DAYS360($startDate,$endDate) / 360; + case 1 : + $days = self::DATEDIF($startDate,$endDate); + $startYear = self::YEAR($startDate); + $endYear = self::YEAR($endDate); + $years = $endYear - $startYear + 1; + $leapDays = 0; + if ($years == 1) { + if (self::_isLeapYear($endYear)) { + $startMonth = self::MONTHOFYEAR($startDate); + $endMonth = self::MONTHOFYEAR($endDate); + $endDay = self::DAYOFMONTH($endDate); + if (($startMonth < 3) || + (($endMonth * 100 + $endDay) >= (2 * 100 + 29))) { + $leapDays += 1; + } + } + } else { + for($year = $startYear; $year <= $endYear; ++$year) { + if ($year == $startYear) { + $startMonth = self::MONTHOFYEAR($startDate); + $startDay = self::DAYOFMONTH($startDate); + if ($startMonth < 3) { + $leapDays += (self::_isLeapYear($year)) ? 1 : 0; + } + } elseif($year == $endYear) { + $endMonth = self::MONTHOFYEAR($endDate); + $endDay = self::DAYOFMONTH($endDate); + if (($endMonth * 100 + $endDay) >= (2 * 100 + 29)) { + $leapDays += (self::_isLeapYear($year)) ? 1 : 0; + } + } else { + $leapDays += (self::_isLeapYear($year)) ? 1 : 0; + } + } + if ($years == 2) { + if (($leapDays == 0) && (self::_isLeapYear($startYear)) && ($days > 365)) { + $leapDays = 1; + } elseif ($days < 366) { + $years = 1; + } + } + $leapDays /= $years; + } + return $days / (365 + $leapDays); + case 2 : + return self::DATEDIF($startDate,$endDate) / 360; + case 3 : + return self::DATEDIF($startDate,$endDate) / 365; + case 4 : + return self::DAYS360($startDate,$endDate,True) / 360; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function YEARFRAC() + + + /** + * NETWORKDAYS + * + * Returns the number of whole working days between start_date and end_date. Working days + * exclude weekends and any dates identified in holidays. + * Use NETWORKDAYS to calculate employee benefits that accrue based on the number of days + * worked during a specific term. + * + * Excel Function: + * NETWORKDAYS(startDate,endDate[,holidays[,holiday[,...]]]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $holidays,... Optional series of Excel date serial value (float), PHP date + * timestamp (integer), PHP DateTime object, or a standard date + * strings that will be excluded from the working calendar, such + * as state and federal holidays and floating holidays. + * @return integer Interval between the dates + */ + public static function NETWORKDAYS($startDate,$endDate) { + // Retrieve the mandatory start and end date that are referenced in the function definition + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + // Flush the mandatory start and end date that are referenced in the function definition, and get the optional days + $dateArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + array_shift($dateArgs); + array_shift($dateArgs); + + // Validate the start and end dates + if (is_string($startDate = $sDate = self::_getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $startDate = (float) floor($startDate); + if (is_string($endDate = $eDate = self::_getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $endDate = (float) floor($endDate); + + if ($sDate > $eDate) { + $startDate = $eDate; + $endDate = $sDate; + } + + // Execute function + $startDoW = 6 - self::DAYOFWEEK($startDate,2); + if ($startDoW < 0) { $startDoW = 0; } + $endDoW = self::DAYOFWEEK($endDate,2); + if ($endDoW >= 6) { $endDoW = 0; } + + $wholeWeekDays = floor(($endDate - $startDate) / 7) * 5; + $partWeekDays = $endDoW + $startDoW; + if ($partWeekDays > 5) { + $partWeekDays -= 5; + } + + // Test any extra holiday parameters + $holidayCountedArray = array(); + foreach ($dateArgs as $holidayDate) { + if (is_string($holidayDate = self::_getDateValue($holidayDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { + if ((self::DAYOFWEEK($holidayDate,2) < 6) && (!in_array($holidayDate,$holidayCountedArray))) { + --$partWeekDays; + $holidayCountedArray[] = $holidayDate; + } + } + } + + if ($sDate > $eDate) { + return 0 - ($wholeWeekDays + $partWeekDays); + } + return $wholeWeekDays + $partWeekDays; + } // function NETWORKDAYS() + + + /** + * WORKDAY + * + * Returns the date that is the indicated number of working days before or after a date (the + * starting date). Working days exclude weekends and any dates identified as holidays. + * Use WORKDAY to exclude weekends or holidays when you calculate invoice due dates, expected + * delivery times, or the number of days of work performed. + * + * Excel Function: + * WORKDAY(startDate,endDays[,holidays[,holiday[,...]]]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param integer $endDays The number of nonweekend and nonholiday days before or after + * startDate. A positive value for days yields a future date; a + * negative value yields a past date. + * @param mixed $holidays,... Optional series of Excel date serial value (float), PHP date + * timestamp (integer), PHP DateTime object, or a standard date + * strings that will be excluded from the working calendar, such + * as state and federal holidays and floating holidays. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function WORKDAY($startDate,$endDays) { + // Retrieve the mandatory start date and days that are referenced in the function definition + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDays = PHPExcel_Calculation_Functions::flattenSingleValue($endDays); + // Flush the mandatory start date and days that are referenced in the function definition, and get the optional days + $dateArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + array_shift($dateArgs); + array_shift($dateArgs); + + if ((is_string($startDate = self::_getDateValue($startDate))) || (!is_numeric($endDays))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $startDate = (float) floor($startDate); + $endDays = (int) floor($endDays); + // If endDays is 0, we always return startDate + if ($endDays == 0) { return $startDate; } + + $decrementing = ($endDays < 0) ? True : False; + + // Adjust the start date if it falls over a weekend + + $startDoW = self::DAYOFWEEK($startDate,3); + if (self::DAYOFWEEK($startDate,3) >= 5) { + $startDate += ($decrementing) ? -$startDoW + 4: 7 - $startDoW; + ($decrementing) ? $endDays++ : $endDays--; + } + + // Add endDays + $endDate = (float) $startDate + (intval($endDays / 5) * 7) + ($endDays % 5); + + // Adjust the calculated end date if it falls over a weekend + $endDoW = self::DAYOFWEEK($endDate,3); + if ($endDoW >= 5) { + $endDate += ($decrementing) ? -$endDoW + 4: 7 - $endDoW; + } + + // Test any extra holiday parameters + if (!empty($dateArgs)) { + $holidayCountedArray = $holidayDates = array(); + foreach ($dateArgs as $holidayDate) { + if (($holidayDate !== NULL) && (trim($holidayDate) > '')) { + if (is_string($holidayDate = self::_getDateValue($holidayDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (self::DAYOFWEEK($holidayDate,3) < 5) { + $holidayDates[] = $holidayDate; + } + } + } + if ($decrementing) { + rsort($holidayDates, SORT_NUMERIC); + } else { + sort($holidayDates, SORT_NUMERIC); + } + foreach ($holidayDates as $holidayDate) { + if ($decrementing) { + if (($holidayDate <= $startDate) && ($holidayDate >= $endDate)) { + if (!in_array($holidayDate,$holidayCountedArray)) { + --$endDate; + $holidayCountedArray[] = $holidayDate; + } + } + } else { + if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { + if (!in_array($holidayDate,$holidayCountedArray)) { + ++$endDate; + $holidayCountedArray[] = $holidayDate; + } + } + } + // Adjust the calculated end date if it falls over a weekend + $endDoW = self::DAYOFWEEK($endDate,3); + if ($endDoW >= 5) { + $endDate += ($decrementing) ? -$endDoW + 4: 7 - $endDoW; + } + + } + } + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + return (float) $endDate; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) PHPExcel_Shared_Date::ExcelToPHP($endDate); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + return PHPExcel_Shared_Date::ExcelToPHPObject($endDate); + } + } // function WORKDAY() + + + /** + * DAYOFMONTH + * + * Returns the day of the month, for a specified date. The day is given as an integer + * ranging from 1 to 31. + * + * Excel Function: + * DAY(dateValue) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @return int Day of the month + */ + public static function DAYOFMONTH($dateValue = 1) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue == 0.0) { + return 0; + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + + return (int) $PHPDateObject->format('j'); + } // function DAYOFMONTH() + + + /** + * DAYOFWEEK + * + * Returns the day of the week for a specified date. The day is given as an integer + * ranging from 0 to 7 (dependent on the requested style). + * + * Excel Function: + * WEEKDAY(dateValue[,style]) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param int $style A number that determines the type of return value + * 1 or omitted Numbers 1 (Sunday) through 7 (Saturday). + * 2 Numbers 1 (Monday) through 7 (Sunday). + * 3 Numbers 0 (Monday) through 6 (Sunday). + * @return int Day of the week value + */ + public static function DAYOFWEEK($dateValue = 1, $style = 1) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $style = PHPExcel_Calculation_Functions::flattenSingleValue($style); + + if (!is_numeric($style)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif (($style < 1) || ($style > 3)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $style = floor($style); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + $DoW = $PHPDateObject->format('w'); + + $firstDay = 1; + switch ($style) { + case 1: ++$DoW; + break; + case 2: if ($DoW == 0) { $DoW = 7; } + break; + case 3: if ($DoW == 0) { $DoW = 7; } + $firstDay = 0; + --$DoW; + break; + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL) { + // Test for Excel's 1900 leap year, and introduce the error as required + if (($PHPDateObject->format('Y') == 1900) && ($PHPDateObject->format('n') <= 2)) { + --$DoW; + if ($DoW < $firstDay) { + $DoW += 7; + } + } + } + + return (int) $DoW; + } // function DAYOFWEEK() + + + /** + * WEEKOFYEAR + * + * Returns the week of the year for a specified date. + * The WEEKNUM function considers the week containing January 1 to be the first week of the year. + * However, there is a European standard that defines the first week as the one with the majority + * of days (four or more) falling in the new year. This means that for years in which there are + * three days or less in the first week of January, the WEEKNUM function returns week numbers + * that are incorrect according to the European standard. + * + * Excel Function: + * WEEKNUM(dateValue[,style]) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param boolean $method Week begins on Sunday or Monday + * 1 or omitted Week begins on Sunday. + * 2 Week begins on Monday. + * @return int Week Number + */ + public static function WEEKOFYEAR($dateValue = 1, $method = 1) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $method = PHPExcel_Calculation_Functions::flattenSingleValue($method); + + if (!is_numeric($method)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif (($method < 1) || ($method > 2)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $method = floor($method); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + $dayOfYear = $PHPDateObject->format('z'); + $dow = $PHPDateObject->format('w'); + $PHPDateObject->modify('-'.$dayOfYear.' days'); + $dow = $PHPDateObject->format('w'); + $daysInFirstWeek = 7 - (($dow + (2 - $method)) % 7); + $dayOfYear -= $daysInFirstWeek; + $weekOfYear = ceil($dayOfYear / 7) + 1; + + return (int) $weekOfYear; + } // function WEEKOFYEAR() + + + /** + * MONTHOFYEAR + * + * Returns the month of a date represented by a serial number. + * The month is given as an integer, ranging from 1 (January) to 12 (December). + * + * Excel Function: + * MONTH(dateValue) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @return int Month of the year + */ + public static function MONTHOFYEAR($dateValue = 1) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + + return (int) $PHPDateObject->format('n'); + } // function MONTHOFYEAR() + + + /** + * YEAR + * + * Returns the year corresponding to a date. + * The year is returned as an integer in the range 1900-9999. + * + * Excel Function: + * YEAR(dateValue) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @return int Year + */ + public static function YEAR($dateValue = 1) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + + return (int) $PHPDateObject->format('Y'); + } // function YEAR() + + + /** + * HOUROFDAY + * + * Returns the hour of a time value. + * The hour is given as an integer, ranging from 0 (12:00 A.M.) to 23 (11:00 P.M.). + * + * Excel Function: + * HOUR(timeValue) + * + * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard time string + * @return int Hour + */ + public static function HOUROFDAY($timeValue = 0) { + $timeValue = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue); + + if (!is_numeric($timeValue)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $testVal = strtok($timeValue,'/-: '); + if (strlen($testVal) < strlen($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $timeValue = self::_getTimeValue($timeValue); + if (is_string($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Execute function + if ($timeValue >= 1) { + $timeValue = fmod($timeValue,1); + } elseif ($timeValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue); + + return (int) gmdate('G',$timeValue); + } // function HOUROFDAY() + + + /** + * MINUTEOFHOUR + * + * Returns the minutes of a time value. + * The minute is given as an integer, ranging from 0 to 59. + * + * Excel Function: + * MINUTE(timeValue) + * + * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard time string + * @return int Minute + */ + public static function MINUTEOFHOUR($timeValue = 0) { + $timeValue = $timeTester = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue); + + if (!is_numeric($timeValue)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $testVal = strtok($timeValue,'/-: '); + if (strlen($testVal) < strlen($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $timeValue = self::_getTimeValue($timeValue); + if (is_string($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Execute function + if ($timeValue >= 1) { + $timeValue = fmod($timeValue,1); + } elseif ($timeValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue); + + return (int) gmdate('i',$timeValue); + } // function MINUTEOFHOUR() + + + /** + * SECONDOFMINUTE + * + * Returns the seconds of a time value. + * The second is given as an integer in the range 0 (zero) to 59. + * + * Excel Function: + * SECOND(timeValue) + * + * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard time string + * @return int Second + */ + public static function SECONDOFMINUTE($timeValue = 0) { + $timeValue = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue); + + if (!is_numeric($timeValue)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $testVal = strtok($timeValue,'/-: '); + if (strlen($testVal) < strlen($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $timeValue = self::_getTimeValue($timeValue); + if (is_string($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Execute function + if ($timeValue >= 1) { + $timeValue = fmod($timeValue,1); + } elseif ($timeValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue); + + return (int) gmdate('s',$timeValue); + } // function SECONDOFMINUTE() + + + /** + * EDATE + * + * Returns the serial number that represents the date that is the indicated number of months + * before or after a specified date (the start_date). + * Use EDATE to calculate maturity dates or due dates that fall on the same day of the month + * as the date of issue. + * + * Excel Function: + * EDATE(dateValue,adjustmentMonths) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param int $adjustmentMonths The number of months before or after start_date. + * A positive value for months yields a future date; + * a negative value yields a past date. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function EDATE($dateValue = 1, $adjustmentMonths = 0) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $adjustmentMonths = PHPExcel_Calculation_Functions::flattenSingleValue($adjustmentMonths); + + if (!is_numeric($adjustmentMonths)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $adjustmentMonths = floor($adjustmentMonths); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Execute function + $PHPDateObject = self::_adjustDateByMonths($dateValue,$adjustmentMonths); + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + return (float) PHPExcel_Shared_Date::PHPToExcel($PHPDateObject); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::PHPToExcel($PHPDateObject)); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + return $PHPDateObject; + } + } // function EDATE() + + + /** + * EOMONTH + * + * Returns the date value for the last day of the month that is the indicated number of months + * before or after start_date. + * Use EOMONTH to calculate maturity dates or due dates that fall on the last day of the month. + * + * Excel Function: + * EOMONTH(dateValue,adjustmentMonths) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param int $adjustmentMonths The number of months before or after start_date. + * A positive value for months yields a future date; + * a negative value yields a past date. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function EOMONTH($dateValue = 1, $adjustmentMonths = 0) { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $adjustmentMonths = PHPExcel_Calculation_Functions::flattenSingleValue($adjustmentMonths); + + if (!is_numeric($adjustmentMonths)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $adjustmentMonths = floor($adjustmentMonths); + + if (is_string($dateValue = self::_getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Execute function + $PHPDateObject = self::_adjustDateByMonths($dateValue,$adjustmentMonths+1); + $adjustDays = (int) $PHPDateObject->format('d'); + $adjustDaysString = '-'.$adjustDays.' days'; + $PHPDateObject->modify($adjustDaysString); + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL : + return (float) PHPExcel_Shared_Date::PHPToExcel($PHPDateObject); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC : + return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::PHPToExcel($PHPDateObject)); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT : + return $PHPDateObject; + } + } // function EOMONTH() + +} // class PHPExcel_Calculation_DateTime + diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Engineering.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Engineering.php new file mode 100644 index 000000000..cfaffafba --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Engineering.php @@ -0,0 +1,2502 @@ + array( 'Group' => 'Mass', 'Unit Name' => 'Gram', 'AllowPrefix' => True ), + 'sg' => array( 'Group' => 'Mass', 'Unit Name' => 'Slug', 'AllowPrefix' => False ), + 'lbm' => array( 'Group' => 'Mass', 'Unit Name' => 'Pound mass (avoirdupois)', 'AllowPrefix' => False ), + 'u' => array( 'Group' => 'Mass', 'Unit Name' => 'U (atomic mass unit)', 'AllowPrefix' => True ), + 'ozm' => array( 'Group' => 'Mass', 'Unit Name' => 'Ounce mass (avoirdupois)', 'AllowPrefix' => False ), + 'm' => array( 'Group' => 'Distance', 'Unit Name' => 'Meter', 'AllowPrefix' => True ), + 'mi' => array( 'Group' => 'Distance', 'Unit Name' => 'Statute mile', 'AllowPrefix' => False ), + 'Nmi' => array( 'Group' => 'Distance', 'Unit Name' => 'Nautical mile', 'AllowPrefix' => False ), + 'in' => array( 'Group' => 'Distance', 'Unit Name' => 'Inch', 'AllowPrefix' => False ), + 'ft' => array( 'Group' => 'Distance', 'Unit Name' => 'Foot', 'AllowPrefix' => False ), + 'yd' => array( 'Group' => 'Distance', 'Unit Name' => 'Yard', 'AllowPrefix' => False ), + 'ang' => array( 'Group' => 'Distance', 'Unit Name' => 'Angstrom', 'AllowPrefix' => True ), + 'Pica' => array( 'Group' => 'Distance', 'Unit Name' => 'Pica (1/72 in)', 'AllowPrefix' => False ), + 'yr' => array( 'Group' => 'Time', 'Unit Name' => 'Year', 'AllowPrefix' => False ), + 'day' => array( 'Group' => 'Time', 'Unit Name' => 'Day', 'AllowPrefix' => False ), + 'hr' => array( 'Group' => 'Time', 'Unit Name' => 'Hour', 'AllowPrefix' => False ), + 'mn' => array( 'Group' => 'Time', 'Unit Name' => 'Minute', 'AllowPrefix' => False ), + 'sec' => array( 'Group' => 'Time', 'Unit Name' => 'Second', 'AllowPrefix' => True ), + 'Pa' => array( 'Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => True ), + 'p' => array( 'Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => True ), + 'atm' => array( 'Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => True ), + 'at' => array( 'Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => True ), + 'mmHg' => array( 'Group' => 'Pressure', 'Unit Name' => 'mm of Mercury', 'AllowPrefix' => True ), + 'N' => array( 'Group' => 'Force', 'Unit Name' => 'Newton', 'AllowPrefix' => True ), + 'dyn' => array( 'Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => True ), + 'dy' => array( 'Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => True ), + 'lbf' => array( 'Group' => 'Force', 'Unit Name' => 'Pound force', 'AllowPrefix' => False ), + 'J' => array( 'Group' => 'Energy', 'Unit Name' => 'Joule', 'AllowPrefix' => True ), + 'e' => array( 'Group' => 'Energy', 'Unit Name' => 'Erg', 'AllowPrefix' => True ), + 'c' => array( 'Group' => 'Energy', 'Unit Name' => 'Thermodynamic calorie', 'AllowPrefix' => True ), + 'cal' => array( 'Group' => 'Energy', 'Unit Name' => 'IT calorie', 'AllowPrefix' => True ), + 'eV' => array( 'Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => True ), + 'ev' => array( 'Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => True ), + 'HPh' => array( 'Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => False ), + 'hh' => array( 'Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => False ), + 'Wh' => array( 'Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => True ), + 'wh' => array( 'Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => True ), + 'flb' => array( 'Group' => 'Energy', 'Unit Name' => 'Foot-pound', 'AllowPrefix' => False ), + 'BTU' => array( 'Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => False ), + 'btu' => array( 'Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => False ), + 'HP' => array( 'Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => False ), + 'h' => array( 'Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => False ), + 'W' => array( 'Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => True ), + 'w' => array( 'Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => True ), + 'T' => array( 'Group' => 'Magnetism', 'Unit Name' => 'Tesla', 'AllowPrefix' => True ), + 'ga' => array( 'Group' => 'Magnetism', 'Unit Name' => 'Gauss', 'AllowPrefix' => True ), + 'C' => array( 'Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => False ), + 'cel' => array( 'Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => False ), + 'F' => array( 'Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => False ), + 'fah' => array( 'Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => False ), + 'K' => array( 'Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => False ), + 'kel' => array( 'Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => False ), + 'tsp' => array( 'Group' => 'Liquid', 'Unit Name' => 'Teaspoon', 'AllowPrefix' => False ), + 'tbs' => array( 'Group' => 'Liquid', 'Unit Name' => 'Tablespoon', 'AllowPrefix' => False ), + 'oz' => array( 'Group' => 'Liquid', 'Unit Name' => 'Fluid Ounce', 'AllowPrefix' => False ), + 'cup' => array( 'Group' => 'Liquid', 'Unit Name' => 'Cup', 'AllowPrefix' => False ), + 'pt' => array( 'Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => False ), + 'us_pt' => array( 'Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => False ), + 'uk_pt' => array( 'Group' => 'Liquid', 'Unit Name' => 'U.K. Pint', 'AllowPrefix' => False ), + 'qt' => array( 'Group' => 'Liquid', 'Unit Name' => 'Quart', 'AllowPrefix' => False ), + 'gal' => array( 'Group' => 'Liquid', 'Unit Name' => 'Gallon', 'AllowPrefix' => False ), + 'l' => array( 'Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => True ), + 'lt' => array( 'Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => True ) + ); + + /** + * Details of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM() + * + * @var mixed[] + */ + private static $_conversionMultipliers = array( 'Y' => array( 'multiplier' => 1E24, 'name' => 'yotta' ), + 'Z' => array( 'multiplier' => 1E21, 'name' => 'zetta' ), + 'E' => array( 'multiplier' => 1E18, 'name' => 'exa' ), + 'P' => array( 'multiplier' => 1E15, 'name' => 'peta' ), + 'T' => array( 'multiplier' => 1E12, 'name' => 'tera' ), + 'G' => array( 'multiplier' => 1E9, 'name' => 'giga' ), + 'M' => array( 'multiplier' => 1E6, 'name' => 'mega' ), + 'k' => array( 'multiplier' => 1E3, 'name' => 'kilo' ), + 'h' => array( 'multiplier' => 1E2, 'name' => 'hecto' ), + 'e' => array( 'multiplier' => 1E1, 'name' => 'deka' ), + 'd' => array( 'multiplier' => 1E-1, 'name' => 'deci' ), + 'c' => array( 'multiplier' => 1E-2, 'name' => 'centi' ), + 'm' => array( 'multiplier' => 1E-3, 'name' => 'milli' ), + 'u' => array( 'multiplier' => 1E-6, 'name' => 'micro' ), + 'n' => array( 'multiplier' => 1E-9, 'name' => 'nano' ), + 'p' => array( 'multiplier' => 1E-12, 'name' => 'pico' ), + 'f' => array( 'multiplier' => 1E-15, 'name' => 'femto' ), + 'a' => array( 'multiplier' => 1E-18, 'name' => 'atto' ), + 'z' => array( 'multiplier' => 1E-21, 'name' => 'zepto' ), + 'y' => array( 'multiplier' => 1E-24, 'name' => 'yocto' ) + ); + + /** + * Details of the Units of measure conversion factors, organised by group + * + * @var mixed[] + */ + private static $_unitConversions = array( 'Mass' => array( 'g' => array( 'g' => 1.0, + 'sg' => 6.85220500053478E-05, + 'lbm' => 2.20462291469134E-03, + 'u' => 6.02217000000000E+23, + 'ozm' => 3.52739718003627E-02 + ), + 'sg' => array( 'g' => 1.45938424189287E+04, + 'sg' => 1.0, + 'lbm' => 3.21739194101647E+01, + 'u' => 8.78866000000000E+27, + 'ozm' => 5.14782785944229E+02 + ), + 'lbm' => array( 'g' => 4.5359230974881148E+02, + 'sg' => 3.10810749306493E-02, + 'lbm' => 1.0, + 'u' => 2.73161000000000E+26, + 'ozm' => 1.60000023429410E+01 + ), + 'u' => array( 'g' => 1.66053100460465E-24, + 'sg' => 1.13782988532950E-28, + 'lbm' => 3.66084470330684E-27, + 'u' => 1.0, + 'ozm' => 5.85735238300524E-26 + ), + 'ozm' => array( 'g' => 2.83495152079732E+01, + 'sg' => 1.94256689870811E-03, + 'lbm' => 6.24999908478882E-02, + 'u' => 1.70725600000000E+25, + 'ozm' => 1.0 + ) + ), + 'Distance' => array( 'm' => array( 'm' => 1.0, + 'mi' => 6.21371192237334E-04, + 'Nmi' => 5.39956803455724E-04, + 'in' => 3.93700787401575E+01, + 'ft' => 3.28083989501312E+00, + 'yd' => 1.09361329797891E+00, + 'ang' => 1.00000000000000E+10, + 'Pica' => 2.83464566929116E+03 + ), + 'mi' => array( 'm' => 1.60934400000000E+03, + 'mi' => 1.0, + 'Nmi' => 8.68976241900648E-01, + 'in' => 6.33600000000000E+04, + 'ft' => 5.28000000000000E+03, + 'yd' => 1.76000000000000E+03, + 'ang' => 1.60934400000000E+13, + 'Pica' => 4.56191999999971E+06 + ), + 'Nmi' => array( 'm' => 1.85200000000000E+03, + 'mi' => 1.15077944802354E+00, + 'Nmi' => 1.0, + 'in' => 7.29133858267717E+04, + 'ft' => 6.07611548556430E+03, + 'yd' => 2.02537182785694E+03, + 'ang' => 1.85200000000000E+13, + 'Pica' => 5.24976377952723E+06 + ), + 'in' => array( 'm' => 2.54000000000000E-02, + 'mi' => 1.57828282828283E-05, + 'Nmi' => 1.37149028077754E-05, + 'in' => 1.0, + 'ft' => 8.33333333333333E-02, + 'yd' => 2.77777777686643E-02, + 'ang' => 2.54000000000000E+08, + 'Pica' => 7.19999999999955E+01 + ), + 'ft' => array( 'm' => 3.04800000000000E-01, + 'mi' => 1.89393939393939E-04, + 'Nmi' => 1.64578833693305E-04, + 'in' => 1.20000000000000E+01, + 'ft' => 1.0, + 'yd' => 3.33333333223972E-01, + 'ang' => 3.04800000000000E+09, + 'Pica' => 8.63999999999946E+02 + ), + 'yd' => array( 'm' => 9.14400000300000E-01, + 'mi' => 5.68181818368230E-04, + 'Nmi' => 4.93736501241901E-04, + 'in' => 3.60000000118110E+01, + 'ft' => 3.00000000000000E+00, + 'yd' => 1.0, + 'ang' => 9.14400000300000E+09, + 'Pica' => 2.59200000085023E+03 + ), + 'ang' => array( 'm' => 1.00000000000000E-10, + 'mi' => 6.21371192237334E-14, + 'Nmi' => 5.39956803455724E-14, + 'in' => 3.93700787401575E-09, + 'ft' => 3.28083989501312E-10, + 'yd' => 1.09361329797891E-10, + 'ang' => 1.0, + 'Pica' => 2.83464566929116E-07 + ), + 'Pica' => array( 'm' => 3.52777777777800E-04, + 'mi' => 2.19205948372629E-07, + 'Nmi' => 1.90484761219114E-07, + 'in' => 1.38888888888898E-02, + 'ft' => 1.15740740740748E-03, + 'yd' => 3.85802469009251E-04, + 'ang' => 3.52777777777800E+06, + 'Pica' => 1.0 + ) + ), + 'Time' => array( 'yr' => array( 'yr' => 1.0, + 'day' => 365.25, + 'hr' => 8766.0, + 'mn' => 525960.0, + 'sec' => 31557600.0 + ), + 'day' => array( 'yr' => 2.73785078713210E-03, + 'day' => 1.0, + 'hr' => 24.0, + 'mn' => 1440.0, + 'sec' => 86400.0 + ), + 'hr' => array( 'yr' => 1.14077116130504E-04, + 'day' => 4.16666666666667E-02, + 'hr' => 1.0, + 'mn' => 60.0, + 'sec' => 3600.0 + ), + 'mn' => array( 'yr' => 1.90128526884174E-06, + 'day' => 6.94444444444444E-04, + 'hr' => 1.66666666666667E-02, + 'mn' => 1.0, + 'sec' => 60.0 + ), + 'sec' => array( 'yr' => 3.16880878140289E-08, + 'day' => 1.15740740740741E-05, + 'hr' => 2.77777777777778E-04, + 'mn' => 1.66666666666667E-02, + 'sec' => 1.0 + ) + ), + 'Pressure' => array( 'Pa' => array( 'Pa' => 1.0, + 'p' => 1.0, + 'atm' => 9.86923299998193E-06, + 'at' => 9.86923299998193E-06, + 'mmHg' => 7.50061707998627E-03 + ), + 'p' => array( 'Pa' => 1.0, + 'p' => 1.0, + 'atm' => 9.86923299998193E-06, + 'at' => 9.86923299998193E-06, + 'mmHg' => 7.50061707998627E-03 + ), + 'atm' => array( 'Pa' => 1.01324996583000E+05, + 'p' => 1.01324996583000E+05, + 'atm' => 1.0, + 'at' => 1.0, + 'mmHg' => 760.0 + ), + 'at' => array( 'Pa' => 1.01324996583000E+05, + 'p' => 1.01324996583000E+05, + 'atm' => 1.0, + 'at' => 1.0, + 'mmHg' => 760.0 + ), + 'mmHg' => array( 'Pa' => 1.33322363925000E+02, + 'p' => 1.33322363925000E+02, + 'atm' => 1.31578947368421E-03, + 'at' => 1.31578947368421E-03, + 'mmHg' => 1.0 + ) + ), + 'Force' => array( 'N' => array( 'N' => 1.0, + 'dyn' => 1.0E+5, + 'dy' => 1.0E+5, + 'lbf' => 2.24808923655339E-01 + ), + 'dyn' => array( 'N' => 1.0E-5, + 'dyn' => 1.0, + 'dy' => 1.0, + 'lbf' => 2.24808923655339E-06 + ), + 'dy' => array( 'N' => 1.0E-5, + 'dyn' => 1.0, + 'dy' => 1.0, + 'lbf' => 2.24808923655339E-06 + ), + 'lbf' => array( 'N' => 4.448222, + 'dyn' => 4.448222E+5, + 'dy' => 4.448222E+5, + 'lbf' => 1.0 + ) + ), + 'Energy' => array( 'J' => array( 'J' => 1.0, + 'e' => 9.99999519343231E+06, + 'c' => 2.39006249473467E-01, + 'cal' => 2.38846190642017E-01, + 'eV' => 6.24145700000000E+18, + 'ev' => 6.24145700000000E+18, + 'HPh' => 3.72506430801000E-07, + 'hh' => 3.72506430801000E-07, + 'Wh' => 2.77777916238711E-04, + 'wh' => 2.77777916238711E-04, + 'flb' => 2.37304222192651E+01, + 'BTU' => 9.47815067349015E-04, + 'btu' => 9.47815067349015E-04 + ), + 'e' => array( 'J' => 1.00000048065700E-07, + 'e' => 1.0, + 'c' => 2.39006364353494E-08, + 'cal' => 2.38846305445111E-08, + 'eV' => 6.24146000000000E+11, + 'ev' => 6.24146000000000E+11, + 'HPh' => 3.72506609848824E-14, + 'hh' => 3.72506609848824E-14, + 'Wh' => 2.77778049754611E-11, + 'wh' => 2.77778049754611E-11, + 'flb' => 2.37304336254586E-06, + 'BTU' => 9.47815522922962E-11, + 'btu' => 9.47815522922962E-11 + ), + 'c' => array( 'J' => 4.18399101363672E+00, + 'e' => 4.18398900257312E+07, + 'c' => 1.0, + 'cal' => 9.99330315287563E-01, + 'eV' => 2.61142000000000E+19, + 'ev' => 2.61142000000000E+19, + 'HPh' => 1.55856355899327E-06, + 'hh' => 1.55856355899327E-06, + 'Wh' => 1.16222030532950E-03, + 'wh' => 1.16222030532950E-03, + 'flb' => 9.92878733152102E+01, + 'BTU' => 3.96564972437776E-03, + 'btu' => 3.96564972437776E-03 + ), + 'cal' => array( 'J' => 4.18679484613929E+00, + 'e' => 4.18679283372801E+07, + 'c' => 1.00067013349059E+00, + 'cal' => 1.0, + 'eV' => 2.61317000000000E+19, + 'ev' => 2.61317000000000E+19, + 'HPh' => 1.55960800463137E-06, + 'hh' => 1.55960800463137E-06, + 'Wh' => 1.16299914807955E-03, + 'wh' => 1.16299914807955E-03, + 'flb' => 9.93544094443283E+01, + 'BTU' => 3.96830723907002E-03, + 'btu' => 3.96830723907002E-03 + ), + 'eV' => array( 'J' => 1.60219000146921E-19, + 'e' => 1.60218923136574E-12, + 'c' => 3.82933423195043E-20, + 'cal' => 3.82676978535648E-20, + 'eV' => 1.0, + 'ev' => 1.0, + 'HPh' => 5.96826078912344E-26, + 'hh' => 5.96826078912344E-26, + 'Wh' => 4.45053000026614E-23, + 'wh' => 4.45053000026614E-23, + 'flb' => 3.80206452103492E-18, + 'BTU' => 1.51857982414846E-22, + 'btu' => 1.51857982414846E-22 + ), + 'ev' => array( 'J' => 1.60219000146921E-19, + 'e' => 1.60218923136574E-12, + 'c' => 3.82933423195043E-20, + 'cal' => 3.82676978535648E-20, + 'eV' => 1.0, + 'ev' => 1.0, + 'HPh' => 5.96826078912344E-26, + 'hh' => 5.96826078912344E-26, + 'Wh' => 4.45053000026614E-23, + 'wh' => 4.45053000026614E-23, + 'flb' => 3.80206452103492E-18, + 'BTU' => 1.51857982414846E-22, + 'btu' => 1.51857982414846E-22 + ), + 'HPh' => array( 'J' => 2.68451741316170E+06, + 'e' => 2.68451612283024E+13, + 'c' => 6.41616438565991E+05, + 'cal' => 6.41186757845835E+05, + 'eV' => 1.67553000000000E+25, + 'ev' => 1.67553000000000E+25, + 'HPh' => 1.0, + 'hh' => 1.0, + 'Wh' => 7.45699653134593E+02, + 'wh' => 7.45699653134593E+02, + 'flb' => 6.37047316692964E+07, + 'BTU' => 2.54442605275546E+03, + 'btu' => 2.54442605275546E+03 + ), + 'hh' => array( 'J' => 2.68451741316170E+06, + 'e' => 2.68451612283024E+13, + 'c' => 6.41616438565991E+05, + 'cal' => 6.41186757845835E+05, + 'eV' => 1.67553000000000E+25, + 'ev' => 1.67553000000000E+25, + 'HPh' => 1.0, + 'hh' => 1.0, + 'Wh' => 7.45699653134593E+02, + 'wh' => 7.45699653134593E+02, + 'flb' => 6.37047316692964E+07, + 'BTU' => 2.54442605275546E+03, + 'btu' => 2.54442605275546E+03 + ), + 'Wh' => array( 'J' => 3.59999820554720E+03, + 'e' => 3.59999647518369E+10, + 'c' => 8.60422069219046E+02, + 'cal' => 8.59845857713046E+02, + 'eV' => 2.24692340000000E+22, + 'ev' => 2.24692340000000E+22, + 'HPh' => 1.34102248243839E-03, + 'hh' => 1.34102248243839E-03, + 'Wh' => 1.0, + 'wh' => 1.0, + 'flb' => 8.54294774062316E+04, + 'BTU' => 3.41213254164705E+00, + 'btu' => 3.41213254164705E+00 + ), + 'wh' => array( 'J' => 3.59999820554720E+03, + 'e' => 3.59999647518369E+10, + 'c' => 8.60422069219046E+02, + 'cal' => 8.59845857713046E+02, + 'eV' => 2.24692340000000E+22, + 'ev' => 2.24692340000000E+22, + 'HPh' => 1.34102248243839E-03, + 'hh' => 1.34102248243839E-03, + 'Wh' => 1.0, + 'wh' => 1.0, + 'flb' => 8.54294774062316E+04, + 'BTU' => 3.41213254164705E+00, + 'btu' => 3.41213254164705E+00 + ), + 'flb' => array( 'J' => 4.21400003236424E-02, + 'e' => 4.21399800687660E+05, + 'c' => 1.00717234301644E-02, + 'cal' => 1.00649785509554E-02, + 'eV' => 2.63015000000000E+17, + 'ev' => 2.63015000000000E+17, + 'HPh' => 1.56974211145130E-08, + 'hh' => 1.56974211145130E-08, + 'Wh' => 1.17055614802000E-05, + 'wh' => 1.17055614802000E-05, + 'flb' => 1.0, + 'BTU' => 3.99409272448406E-05, + 'btu' => 3.99409272448406E-05 + ), + 'BTU' => array( 'J' => 1.05505813786749E+03, + 'e' => 1.05505763074665E+10, + 'c' => 2.52165488508168E+02, + 'cal' => 2.51996617135510E+02, + 'eV' => 6.58510000000000E+21, + 'ev' => 6.58510000000000E+21, + 'HPh' => 3.93015941224568E-04, + 'hh' => 3.93015941224568E-04, + 'Wh' => 2.93071851047526E-01, + 'wh' => 2.93071851047526E-01, + 'flb' => 2.50369750774671E+04, + 'BTU' => 1.0, + 'btu' => 1.0, + ), + 'btu' => array( 'J' => 1.05505813786749E+03, + 'e' => 1.05505763074665E+10, + 'c' => 2.52165488508168E+02, + 'cal' => 2.51996617135510E+02, + 'eV' => 6.58510000000000E+21, + 'ev' => 6.58510000000000E+21, + 'HPh' => 3.93015941224568E-04, + 'hh' => 3.93015941224568E-04, + 'Wh' => 2.93071851047526E-01, + 'wh' => 2.93071851047526E-01, + 'flb' => 2.50369750774671E+04, + 'BTU' => 1.0, + 'btu' => 1.0, + ) + ), + 'Power' => array( 'HP' => array( 'HP' => 1.0, + 'h' => 1.0, + 'W' => 7.45701000000000E+02, + 'w' => 7.45701000000000E+02 + ), + 'h' => array( 'HP' => 1.0, + 'h' => 1.0, + 'W' => 7.45701000000000E+02, + 'w' => 7.45701000000000E+02 + ), + 'W' => array( 'HP' => 1.34102006031908E-03, + 'h' => 1.34102006031908E-03, + 'W' => 1.0, + 'w' => 1.0 + ), + 'w' => array( 'HP' => 1.34102006031908E-03, + 'h' => 1.34102006031908E-03, + 'W' => 1.0, + 'w' => 1.0 + ) + ), + 'Magnetism' => array( 'T' => array( 'T' => 1.0, + 'ga' => 10000.0 + ), + 'ga' => array( 'T' => 0.0001, + 'ga' => 1.0 + ) + ), + 'Liquid' => array( 'tsp' => array( 'tsp' => 1.0, + 'tbs' => 3.33333333333333E-01, + 'oz' => 1.66666666666667E-01, + 'cup' => 2.08333333333333E-02, + 'pt' => 1.04166666666667E-02, + 'us_pt' => 1.04166666666667E-02, + 'uk_pt' => 8.67558516821960E-03, + 'qt' => 5.20833333333333E-03, + 'gal' => 1.30208333333333E-03, + 'l' => 4.92999408400710E-03, + 'lt' => 4.92999408400710E-03 + ), + 'tbs' => array( 'tsp' => 3.00000000000000E+00, + 'tbs' => 1.0, + 'oz' => 5.00000000000000E-01, + 'cup' => 6.25000000000000E-02, + 'pt' => 3.12500000000000E-02, + 'us_pt' => 3.12500000000000E-02, + 'uk_pt' => 2.60267555046588E-02, + 'qt' => 1.56250000000000E-02, + 'gal' => 3.90625000000000E-03, + 'l' => 1.47899822520213E-02, + 'lt' => 1.47899822520213E-02 + ), + 'oz' => array( 'tsp' => 6.00000000000000E+00, + 'tbs' => 2.00000000000000E+00, + 'oz' => 1.0, + 'cup' => 1.25000000000000E-01, + 'pt' => 6.25000000000000E-02, + 'us_pt' => 6.25000000000000E-02, + 'uk_pt' => 5.20535110093176E-02, + 'qt' => 3.12500000000000E-02, + 'gal' => 7.81250000000000E-03, + 'l' => 2.95799645040426E-02, + 'lt' => 2.95799645040426E-02 + ), + 'cup' => array( 'tsp' => 4.80000000000000E+01, + 'tbs' => 1.60000000000000E+01, + 'oz' => 8.00000000000000E+00, + 'cup' => 1.0, + 'pt' => 5.00000000000000E-01, + 'us_pt' => 5.00000000000000E-01, + 'uk_pt' => 4.16428088074541E-01, + 'qt' => 2.50000000000000E-01, + 'gal' => 6.25000000000000E-02, + 'l' => 2.36639716032341E-01, + 'lt' => 2.36639716032341E-01 + ), + 'pt' => array( 'tsp' => 9.60000000000000E+01, + 'tbs' => 3.20000000000000E+01, + 'oz' => 1.60000000000000E+01, + 'cup' => 2.00000000000000E+00, + 'pt' => 1.0, + 'us_pt' => 1.0, + 'uk_pt' => 8.32856176149081E-01, + 'qt' => 5.00000000000000E-01, + 'gal' => 1.25000000000000E-01, + 'l' => 4.73279432064682E-01, + 'lt' => 4.73279432064682E-01 + ), + 'us_pt' => array( 'tsp' => 9.60000000000000E+01, + 'tbs' => 3.20000000000000E+01, + 'oz' => 1.60000000000000E+01, + 'cup' => 2.00000000000000E+00, + 'pt' => 1.0, + 'us_pt' => 1.0, + 'uk_pt' => 8.32856176149081E-01, + 'qt' => 5.00000000000000E-01, + 'gal' => 1.25000000000000E-01, + 'l' => 4.73279432064682E-01, + 'lt' => 4.73279432064682E-01 + ), + 'uk_pt' => array( 'tsp' => 1.15266000000000E+02, + 'tbs' => 3.84220000000000E+01, + 'oz' => 1.92110000000000E+01, + 'cup' => 2.40137500000000E+00, + 'pt' => 1.20068750000000E+00, + 'us_pt' => 1.20068750000000E+00, + 'uk_pt' => 1.0, + 'qt' => 6.00343750000000E-01, + 'gal' => 1.50085937500000E-01, + 'l' => 5.68260698087162E-01, + 'lt' => 5.68260698087162E-01 + ), + 'qt' => array( 'tsp' => 1.92000000000000E+02, + 'tbs' => 6.40000000000000E+01, + 'oz' => 3.20000000000000E+01, + 'cup' => 4.00000000000000E+00, + 'pt' => 2.00000000000000E+00, + 'us_pt' => 2.00000000000000E+00, + 'uk_pt' => 1.66571235229816E+00, + 'qt' => 1.0, + 'gal' => 2.50000000000000E-01, + 'l' => 9.46558864129363E-01, + 'lt' => 9.46558864129363E-01 + ), + 'gal' => array( 'tsp' => 7.68000000000000E+02, + 'tbs' => 2.56000000000000E+02, + 'oz' => 1.28000000000000E+02, + 'cup' => 1.60000000000000E+01, + 'pt' => 8.00000000000000E+00, + 'us_pt' => 8.00000000000000E+00, + 'uk_pt' => 6.66284940919265E+00, + 'qt' => 4.00000000000000E+00, + 'gal' => 1.0, + 'l' => 3.78623545651745E+00, + 'lt' => 3.78623545651745E+00 + ), + 'l' => array( 'tsp' => 2.02840000000000E+02, + 'tbs' => 6.76133333333333E+01, + 'oz' => 3.38066666666667E+01, + 'cup' => 4.22583333333333E+00, + 'pt' => 2.11291666666667E+00, + 'us_pt' => 2.11291666666667E+00, + 'uk_pt' => 1.75975569552166E+00, + 'qt' => 1.05645833333333E+00, + 'gal' => 2.64114583333333E-01, + 'l' => 1.0, + 'lt' => 1.0 + ), + 'lt' => array( 'tsp' => 2.02840000000000E+02, + 'tbs' => 6.76133333333333E+01, + 'oz' => 3.38066666666667E+01, + 'cup' => 4.22583333333333E+00, + 'pt' => 2.11291666666667E+00, + 'us_pt' => 2.11291666666667E+00, + 'uk_pt' => 1.75975569552166E+00, + 'qt' => 1.05645833333333E+00, + 'gal' => 2.64114583333333E-01, + 'l' => 1.0, + 'lt' => 1.0 + ) + ) + ); + + + /** + * _parseComplex + * + * Parses a complex number into its real and imaginary parts, and an I or J suffix + * + * @param string $complexNumber The complex number + * @return string[] Indexed on "real", "imaginary" and "suffix" + */ + public static function _parseComplex($complexNumber) { + $workString = (string) $complexNumber; + + $realNumber = $imaginary = 0; + // Extract the suffix, if there is one + $suffix = substr($workString,-1); + if (!is_numeric($suffix)) { + $workString = substr($workString,0,-1); + } else { + $suffix = ''; + } + + // Split the input into its Real and Imaginary components + $leadingSign = 0; + if (strlen($workString) > 0) { + $leadingSign = (($workString{0} == '+') || ($workString{0} == '-')) ? 1 : 0; + } + $power = ''; + $realNumber = strtok($workString, '+-'); + if (strtoupper(substr($realNumber,-1)) == 'E') { + $power = strtok('+-'); + ++$leadingSign; + } + + $realNumber = substr($workString,0,strlen($realNumber)+strlen($power)+$leadingSign); + + if ($suffix != '') { + $imaginary = substr($workString,strlen($realNumber)); + + if (($imaginary == '') && (($realNumber == '') || ($realNumber == '+') || ($realNumber == '-'))) { + $imaginary = $realNumber.'1'; + $realNumber = '0'; + } else if ($imaginary == '') { + $imaginary = $realNumber; + $realNumber = '0'; + } elseif (($imaginary == '+') || ($imaginary == '-')) { + $imaginary .= '1'; + } + } + + return array( 'real' => $realNumber, + 'imaginary' => $imaginary, + 'suffix' => $suffix + ); + } // function _parseComplex() + + + /** + * _cleanComplex + * + * Cleans the leading characters in a complex number string + * + * @param string $complexNumber The complex number to clean + * @return string The "cleaned" complex number + */ + private static function _cleanComplex($complexNumber) { + if ($complexNumber{0} == '+') $complexNumber = substr($complexNumber,1); + if ($complexNumber{0} == '0') $complexNumber = substr($complexNumber,1); + if ($complexNumber{0} == '.') $complexNumber = '0'.$complexNumber; + if ($complexNumber{0} == '+') $complexNumber = substr($complexNumber,1); + return $complexNumber; + } + + + private static function _nbrConversionFormat($xVal,$places) { + if (!is_null($places)) { + if (strlen($xVal) <= $places) { + return substr(str_pad($xVal,$places,'0',STR_PAD_LEFT),-10); + } else { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + return substr($xVal,-10); + } // function _nbrConversionFormat() + + + /** + * BESSELI + * + * Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated + * for purely imaginary arguments + * + * Excel Function: + * BESSELI(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELI returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. + * If ord is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELI returns the #VALUE! error value. + * If $ord < 0, BESSELI returns the #NUM! error value. + * @return float + * + */ + public static function BESSELI($x, $ord) { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + $ord = floor($ord); + if ($ord < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (abs($x) <= 30) { + $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord); + $ordK = 1; + $fSqrX = ($x * $x) / 4; + do { + $fTerm *= $fSqrX; + $fTerm /= ($ordK * ($ordK + $ord)); + $fResult += $fTerm; + } while ((abs($fTerm) > 1e-12) && (++$ordK < 100)); + } else { + $f_2_PI = 2 * M_PI; + + $fXAbs = abs($x); + $fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs); + if (($ord & 1) && ($x < 0)) { + $fResult = -$fResult; + } + } + return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BESSELI() + + + /** + * BESSELJ + * + * Returns the Bessel function + * + * Excel Function: + * BESSELJ(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELJ returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. If n is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELJ returns the #VALUE! error value. + * If $ord < 0, BESSELJ returns the #NUM! error value. + * @return float + * + */ + public static function BESSELJ($x, $ord) { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + $ord = floor($ord); + if ($ord < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $fResult = 0; + if (abs($x) <= 30) { + $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord); + $ordK = 1; + $fSqrX = ($x * $x) / -4; + do { + $fTerm *= $fSqrX; + $fTerm /= ($ordK * ($ordK + $ord)); + $fResult += $fTerm; + } while ((abs($fTerm) > 1e-12) && (++$ordK < 100)); + } else { + $f_PI_DIV_2 = M_PI / 2; + $f_PI_DIV_4 = M_PI / 4; + + $fXAbs = abs($x); + $fResult = sqrt(M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4); + if (($ord & 1) && ($x < 0)) { + $fResult = -$fResult; + } + } + return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BESSELJ() + + + private static function _Besselk0($fNum) { + if ($fNum <= 2) { + $fNum2 = $fNum * 0.5; + $y = ($fNum2 * $fNum2); + $fRet = -log($fNum2) * self::BESSELI($fNum, 0) + + (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y * + (0.10750e-3 + $y * 0.74e-5)))))); + } else { + $y = 2 / $fNum; + $fRet = exp(-$fNum) / sqrt($fNum) * + (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y * + (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3)))))); + } + return $fRet; + } // function _Besselk0() + + + private static function _Besselk1($fNum) { + if ($fNum <= 2) { + $fNum2 = $fNum * 0.5; + $y = ($fNum2 * $fNum2); + $fRet = log($fNum2) * self::BESSELI($fNum, 1) + + (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y * + (-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum; + } else { + $y = 2 / $fNum; + $fRet = exp(-$fNum) / sqrt($fNum) * + (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y * + (0.325614e-2 + $y * (-0.68245e-3))))))); + } + return $fRet; + } // function _Besselk1() + + + /** + * BESSELK + * + * Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated + * for purely imaginary arguments. + * + * Excel Function: + * BESSELK(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELK returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. If n is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. + * If $ord < 0, BESSELK returns the #NUM! error value. + * @return float + * + */ + public static function BESSELK($x, $ord) { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + if (($ord < 0) || ($x == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + switch(floor($ord)) { + case 0 : return self::_Besselk0($x); + break; + case 1 : return self::_Besselk1($x); + break; + default : $fTox = 2 / $x; + $fBkm = self::_Besselk0($x); + $fBk = self::_Besselk1($x); + for ($n = 1; $n < $ord; ++$n) { + $fBkp = $fBkm + $n * $fTox * $fBk; + $fBkm = $fBk; + $fBk = $fBkp; + } + } + return (is_nan($fBk)) ? PHPExcel_Calculation_Functions::NaN() : $fBk; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BESSELK() + + + private static function _Bessely0($fNum) { + if ($fNum < 8.0) { + $y = ($fNum * $fNum); + $f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733)))); + $f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y)))); + $fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum); + } else { + $z = 8.0 / $fNum; + $y = ($z * $z); + $xx = $fNum - 0.785398164; + $f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6))); + $f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7)))); + $fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2); + } + return $fRet; + } // function _Bessely0() + + + private static function _Bessely1($fNum) { + if ($fNum < 8.0) { + $y = ($fNum * $fNum); + $f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y * + (-0.4237922726e7 + $y * 0.8511937935e4))))); + $f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y * + (0.1020426050e6 + $y * (0.3549632885e3 + $y))))); + $fRet = $f1 / $f2 + 0.636619772 * ( self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum); + } else { + $fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491); + } + return $fRet; + } // function _Bessely1() + + + /** + * BESSELY + * + * Returns the Bessel function, which is also called the Weber function or the Neumann function. + * + * Excel Function: + * BESSELY(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELK returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. If n is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. + * If $ord < 0, BESSELK returns the #NUM! error value. + * + * @return float + */ + public static function BESSELY($x, $ord) { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + if (($ord < 0) || ($x == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + switch(floor($ord)) { + case 0 : return self::_Bessely0($x); + break; + case 1 : return self::_Bessely1($x); + break; + default: $fTox = 2 / $x; + $fBym = self::_Bessely0($x); + $fBy = self::_Bessely1($x); + for ($n = 1; $n < $ord; ++$n) { + $fByp = $n * $fTox * $fBy - $fBym; + $fBym = $fBy; + $fBy = $fByp; + } + } + return (is_nan($fBy)) ? PHPExcel_Calculation_Functions::NaN() : $fBy; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BESSELY() + + + /** + * BINTODEC + * + * Return a binary value as decimal. + * + * Excel Function: + * BIN2DEC(x) + * + * @access public + * @category Engineering Functions + * @param string $x The binary number (as a string) that you want to convert. The number + * cannot contain more than 10 characters (10 bits). The most significant + * bit of number is the sign bit. The remaining 9 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation. + * If number is not a valid binary number, or if number contains more than + * 10 characters (10 bits), BIN2DEC returns the #NUM! error value. + * @return string + */ + public static function BINTODEC($x) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $x = floor($x); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[01]/',$x,$out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (strlen($x) > 10) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (strlen($x) == 10) { + // Two's Complement + $x = substr($x,-9); + return '-'.(512-bindec($x)); + } + return bindec($x); + } // function BINTODEC() + + + /** + * BINTOHEX + * + * Return a binary value as hex. + * + * Excel Function: + * BIN2HEX(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The binary number (as a string) that you want to convert. The number + * cannot contain more than 10 characters (10 bits). The most significant + * bit of number is the sign bit. The remaining 9 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation. + * If number is not a valid binary number, or if number contains more than + * 10 characters (10 bits), BIN2HEX returns the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, BIN2HEX uses the + * minimum number of characters necessary. Places is useful for padding the + * return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, BIN2HEX returns the #VALUE! error value. + * If places is negative, BIN2HEX returns the #NUM! error value. + * @return string + */ + public static function BINTOHEX($x, $places=NULL) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $x = floor($x); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[01]/',$x,$out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (strlen($x) > 10) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (strlen($x) == 10) { + // Two's Complement + return str_repeat('F',8).substr(strtoupper(dechex(bindec(substr($x,-9)))),-2); + } + $hexVal = (string) strtoupper(dechex(bindec($x))); + + return self::_nbrConversionFormat($hexVal,$places); + } // function BINTOHEX() + + + /** + * BINTOOCT + * + * Return a binary value as octal. + * + * Excel Function: + * BIN2OCT(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The binary number (as a string) that you want to convert. The number + * cannot contain more than 10 characters (10 bits). The most significant + * bit of number is the sign bit. The remaining 9 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation. + * If number is not a valid binary number, or if number contains more than + * 10 characters (10 bits), BIN2OCT returns the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, BIN2OCT uses the + * minimum number of characters necessary. Places is useful for padding the + * return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, BIN2OCT returns the #VALUE! error value. + * If places is negative, BIN2OCT returns the #NUM! error value. + * @return string + */ + public static function BINTOOCT($x, $places=NULL) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $x = floor($x); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[01]/',$x,$out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (strlen($x) > 10) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (strlen($x) == 10) { + // Two's Complement + return str_repeat('7',7).substr(strtoupper(decoct(bindec(substr($x,-9)))),-3); + } + $octVal = (string) decoct(bindec($x)); + + return self::_nbrConversionFormat($octVal,$places); + } // function BINTOOCT() + + + /** + * DECTOBIN + * + * Return a decimal value as binary. + * + * Excel Function: + * DEC2BIN(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The decimal integer you want to convert. If number is negative, + * valid place values are ignored and DEC2BIN returns a 10-character + * (10-bit) binary number in which the most significant bit is the sign + * bit. The remaining 9 bits are magnitude bits. Negative numbers are + * represented using two's-complement notation. + * If number < -512 or if number > 511, DEC2BIN returns the #NUM! error + * value. + * If number is nonnumeric, DEC2BIN returns the #VALUE! error value. + * If DEC2BIN requires more than places characters, it returns the #NUM! + * error value. + * @param integer $places The number of characters to use. If places is omitted, DEC2BIN uses + * the minimum number of characters necessary. Places is useful for + * padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, DEC2BIN returns the #VALUE! error value. + * If places is zero or negative, DEC2BIN returns the #NUM! error value. + * @return string + */ + public static function DECTOBIN($x, $places=NULL) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[-0123456789.]/',$x,$out)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) floor($x); + $r = decbin($x); + if (strlen($r) == 32) { + // Two's Complement + $r = substr($r,-10); + } elseif (strlen($r) > 11) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return self::_nbrConversionFormat($r,$places); + } // function DECTOBIN() + + + /** + * DECTOHEX + * + * Return a decimal value as hex. + * + * Excel Function: + * DEC2HEX(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The decimal integer you want to convert. If number is negative, + * places is ignored and DEC2HEX returns a 10-character (40-bit) + * hexadecimal number in which the most significant bit is the sign + * bit. The remaining 39 bits are magnitude bits. Negative numbers + * are represented using two's-complement notation. + * If number < -549,755,813,888 or if number > 549,755,813,887, + * DEC2HEX returns the #NUM! error value. + * If number is nonnumeric, DEC2HEX returns the #VALUE! error value. + * If DEC2HEX requires more than places characters, it returns the + * #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, DEC2HEX uses + * the minimum number of characters necessary. Places is useful for + * padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, DEC2HEX returns the #VALUE! error value. + * If places is zero or negative, DEC2HEX returns the #NUM! error value. + * @return string + */ + public static function DECTOHEX($x, $places=null) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[-0123456789.]/',$x,$out)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) floor($x); + $r = strtoupper(dechex($x)); + if (strlen($r) == 8) { + // Two's Complement + $r = 'FF'.$r; + } + + return self::_nbrConversionFormat($r,$places); + } // function DECTOHEX() + + + /** + * DECTOOCT + * + * Return an decimal value as octal. + * + * Excel Function: + * DEC2OCT(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The decimal integer you want to convert. If number is negative, + * places is ignored and DEC2OCT returns a 10-character (30-bit) + * octal number in which the most significant bit is the sign bit. + * The remaining 29 bits are magnitude bits. Negative numbers are + * represented using two's-complement notation. + * If number < -536,870,912 or if number > 536,870,911, DEC2OCT + * returns the #NUM! error value. + * If number is nonnumeric, DEC2OCT returns the #VALUE! error value. + * If DEC2OCT requires more than places characters, it returns the + * #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, DEC2OCT uses + * the minimum number of characters necessary. Places is useful for + * padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, DEC2OCT returns the #VALUE! error value. + * If places is zero or negative, DEC2OCT returns the #NUM! error value. + * @return string + */ + public static function DECTOOCT($x, $places=null) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[-0123456789.]/',$x,$out)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) floor($x); + $r = decoct($x); + if (strlen($r) == 11) { + // Two's Complement + $r = substr($r,-10); + } + + return self::_nbrConversionFormat($r,$places); + } // function DECTOOCT() + + + /** + * HEXTOBIN + * + * Return a hex value as binary. + * + * Excel Function: + * HEX2BIN(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x the hexadecimal number you want to convert. Number cannot + * contain more than 10 characters. The most significant bit of + * number is the sign bit (40th bit from the right). The remaining + * 9 bits are magnitude bits. Negative numbers are represented + * using two's-complement notation. + * If number is negative, HEX2BIN ignores places and returns a + * 10-character binary number. + * If number is negative, it cannot be less than FFFFFFFE00, and + * if number is positive, it cannot be greater than 1FF. + * If number is not a valid hexadecimal number, HEX2BIN returns + * the #NUM! error value. + * If HEX2BIN requires more than places characters, it returns + * the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, + * HEX2BIN uses the minimum number of characters necessary. Places + * is useful for padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, HEX2BIN returns the #VALUE! error value. + * If places is negative, HEX2BIN returns the #NUM! error value. + * @return string + */ + public static function HEXTOBIN($x, $places=null) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/',strtoupper($x),$out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $binVal = decbin(hexdec($x)); + + return substr(self::_nbrConversionFormat($binVal,$places),-10); + } // function HEXTOBIN() + + + /** + * HEXTODEC + * + * Return a hex value as decimal. + * + * Excel Function: + * HEX2DEC(x) + * + * @access public + * @category Engineering Functions + * @param string $x The hexadecimal number you want to convert. This number cannot + * contain more than 10 characters (40 bits). The most significant + * bit of number is the sign bit. The remaining 39 bits are magnitude + * bits. Negative numbers are represented using two's-complement + * notation. + * If number is not a valid hexadecimal number, HEX2DEC returns the + * #NUM! error value. + * @return string + */ + public static function HEXTODEC($x) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/',strtoupper($x),$out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return hexdec($x); + } // function HEXTODEC() + + + /** + * HEXTOOCT + * + * Return a hex value as octal. + * + * Excel Function: + * HEX2OCT(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The hexadecimal number you want to convert. Number cannot + * contain more than 10 characters. The most significant bit of + * number is the sign bit. The remaining 39 bits are magnitude + * bits. Negative numbers are represented using two's-complement + * notation. + * If number is negative, HEX2OCT ignores places and returns a + * 10-character octal number. + * If number is negative, it cannot be less than FFE0000000, and + * if number is positive, it cannot be greater than 1FFFFFFF. + * If number is not a valid hexadecimal number, HEX2OCT returns + * the #NUM! error value. + * If HEX2OCT requires more than places characters, it returns + * the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, HEX2OCT + * uses the minimum number of characters necessary. Places is + * useful for padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, HEX2OCT returns the #VALUE! error + * value. + * If places is negative, HEX2OCT returns the #NUM! error value. + * @return string + */ + public static function HEXTOOCT($x, $places=null) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/',strtoupper($x),$out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $octVal = decoct(hexdec($x)); + + return self::_nbrConversionFormat($octVal,$places); + } // function HEXTOOCT() + + + /** + * OCTTOBIN + * + * Return an octal value as binary. + * + * Excel Function: + * OCT2BIN(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The octal number you want to convert. Number may not + * contain more than 10 characters. The most significant + * bit of number is the sign bit. The remaining 29 bits + * are magnitude bits. Negative numbers are represented + * using two's-complement notation. + * If number is negative, OCT2BIN ignores places and returns + * a 10-character binary number. + * If number is negative, it cannot be less than 7777777000, + * and if number is positive, it cannot be greater than 777. + * If number is not a valid octal number, OCT2BIN returns + * the #NUM! error value. + * If OCT2BIN requires more than places characters, it + * returns the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, + * OCT2BIN uses the minimum number of characters necessary. + * Places is useful for padding the return value with + * leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, OCT2BIN returns the #VALUE! + * error value. + * If places is negative, OCT2BIN returns the #NUM! error + * value. + * @return string + */ + public static function OCTTOBIN($x, $places=null) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (preg_match_all('/[01234567]/',$x,$out) != strlen($x)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $r = decbin(octdec($x)); + + return self::_nbrConversionFormat($r,$places); + } // function OCTTOBIN() + + + /** + * OCTTODEC + * + * Return an octal value as decimal. + * + * Excel Function: + * OCT2DEC(x) + * + * @access public + * @category Engineering Functions + * @param string $x The octal number you want to convert. Number may not contain + * more than 10 octal characters (30 bits). The most significant + * bit of number is the sign bit. The remaining 29 bits are + * magnitude bits. Negative numbers are represented using + * two's-complement notation. + * If number is not a valid octal number, OCT2DEC returns the + * #NUM! error value. + * @return string + */ + public static function OCTTODEC($x) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (preg_match_all('/[01234567]/',$x,$out) != strlen($x)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return octdec($x); + } // function OCTTODEC() + + + /** + * OCTTOHEX + * + * Return an octal value as hex. + * + * Excel Function: + * OCT2HEX(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The octal number you want to convert. Number may not contain + * more than 10 octal characters (30 bits). The most significant + * bit of number is the sign bit. The remaining 29 bits are + * magnitude bits. Negative numbers are represented using + * two's-complement notation. + * If number is negative, OCT2HEX ignores places and returns a + * 10-character hexadecimal number. + * If number is not a valid octal number, OCT2HEX returns the + * #NUM! error value. + * If OCT2HEX requires more than places characters, it returns + * the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, OCT2HEX + * uses the minimum number of characters necessary. Places is useful + * for padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, OCT2HEX returns the #VALUE! error value. + * If places is negative, OCT2HEX returns the #NUM! error value. + * @return string + */ + public static function OCTTOHEX($x, $places=null) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (preg_match_all('/[01234567]/',$x,$out) != strlen($x)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $hexVal = strtoupper(dechex(octdec($x))); + + return self::_nbrConversionFormat($hexVal,$places); + } // function OCTTOHEX() + + + /** + * COMPLEX + * + * Converts real and imaginary coefficients into a complex number of the form x + yi or x + yj. + * + * Excel Function: + * COMPLEX(realNumber,imaginary[,places]) + * + * @access public + * @category Engineering Functions + * @param float $realNumber The real coefficient of the complex number. + * @param float $imaginary The imaginary coefficient of the complex number. + * @param string $suffix The suffix for the imaginary component of the complex number. + * If omitted, the suffix is assumed to be "i". + * @return string + */ + public static function COMPLEX($realNumber=0.0, $imaginary=0.0, $suffix='i') { + $realNumber = (is_null($realNumber)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($realNumber); + $imaginary = (is_null($imaginary)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($imaginary); + $suffix = (is_null($suffix)) ? 'i' : PHPExcel_Calculation_Functions::flattenSingleValue($suffix); + + if (((is_numeric($realNumber)) && (is_numeric($imaginary))) && + (($suffix == 'i') || ($suffix == 'j') || ($suffix == ''))) { + $realNumber = (float) $realNumber; + $imaginary = (float) $imaginary; + + if ($suffix == '') $suffix = 'i'; + if ($realNumber == 0.0) { + if ($imaginary == 0.0) { + return (string) '0'; + } elseif ($imaginary == 1.0) { + return (string) $suffix; + } elseif ($imaginary == -1.0) { + return (string) '-'.$suffix; + } + return (string) $imaginary.$suffix; + } elseif ($imaginary == 0.0) { + return (string) $realNumber; + } elseif ($imaginary == 1.0) { + return (string) $realNumber.'+'.$suffix; + } elseif ($imaginary == -1.0) { + return (string) $realNumber.'-'.$suffix; + } + if ($imaginary > 0) { $imaginary = (string) '+'.$imaginary; } + return (string) $realNumber.$imaginary.$suffix; + } + + return PHPExcel_Calculation_Functions::VALUE(); + } // function COMPLEX() + + + /** + * IMAGINARY + * + * Returns the imaginary coefficient of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMAGINARY(complexNumber) + * + * @access public + * @category Engineering Functions + * @param string $complexNumber The complex number for which you want the imaginary + * coefficient. + * @return float + */ + public static function IMAGINARY($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + return $parsedComplex['imaginary']; + } // function IMAGINARY() + + + /** + * IMREAL + * + * Returns the real coefficient of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMREAL(complexNumber) + * + * @access public + * @category Engineering Functions + * @param string $complexNumber The complex number for which you want the real coefficient. + * @return float + */ + public static function IMREAL($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + return $parsedComplex['real']; + } // function IMREAL() + + + /** + * IMABS + * + * Returns the absolute value (modulus) of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMABS(complexNumber) + * + * @param string $complexNumber The complex number for which you want the absolute value. + * @return float + */ + public static function IMABS($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + return sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])); + } // function IMABS() + + + /** + * IMARGUMENT + * + * Returns the argument theta of a complex number, i.e. the angle in radians from the real + * axis to the representation of the number in polar coordinates. + * + * Excel Function: + * IMARGUMENT(complexNumber) + * + * @param string $complexNumber The complex number for which you want the argument theta. + * @return float + */ + public static function IMARGUMENT($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if ($parsedComplex['real'] == 0.0) { + if ($parsedComplex['imaginary'] == 0.0) { + return 0.0; + } elseif($parsedComplex['imaginary'] < 0.0) { + return M_PI / -2; + } else { + return M_PI / 2; + } + } elseif ($parsedComplex['real'] > 0.0) { + return atan($parsedComplex['imaginary'] / $parsedComplex['real']); + } elseif ($parsedComplex['imaginary'] < 0.0) { + return 0 - (M_PI - atan(abs($parsedComplex['imaginary']) / abs($parsedComplex['real']))); + } else { + return M_PI - atan($parsedComplex['imaginary'] / abs($parsedComplex['real'])); + } + } // function IMARGUMENT() + + + /** + * IMCONJUGATE + * + * Returns the complex conjugate of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMCONJUGATE(complexNumber) + * + * @param string $complexNumber The complex number for which you want the conjugate. + * @return string + */ + public static function IMCONJUGATE($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if ($parsedComplex['imaginary'] == 0.0) { + return $parsedComplex['real']; + } else { + return self::_cleanComplex( self::COMPLEX( $parsedComplex['real'], + 0 - $parsedComplex['imaginary'], + $parsedComplex['suffix'] + ) + ); + } + } // function IMCONJUGATE() + + + /** + * IMCOS + * + * Returns the cosine of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMCOS(complexNumber) + * + * @param string $complexNumber The complex number for which you want the cosine. + * @return string|float + */ + public static function IMCOS($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if ($parsedComplex['imaginary'] == 0.0) { + return cos($parsedComplex['real']); + } else { + return self::IMCONJUGATE(self::COMPLEX(cos($parsedComplex['real']) * cosh($parsedComplex['imaginary']),sin($parsedComplex['real']) * sinh($parsedComplex['imaginary']),$parsedComplex['suffix'])); + } + } // function IMCOS() + + + /** + * IMSIN + * + * Returns the sine of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMSIN(complexNumber) + * + * @param string $complexNumber The complex number for which you want the sine. + * @return string|float + */ + public static function IMSIN($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if ($parsedComplex['imaginary'] == 0.0) { + return sin($parsedComplex['real']); + } else { + return self::COMPLEX(sin($parsedComplex['real']) * cosh($parsedComplex['imaginary']),cos($parsedComplex['real']) * sinh($parsedComplex['imaginary']),$parsedComplex['suffix']); + } + } // function IMSIN() + + + /** + * IMSQRT + * + * Returns the square root of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMSQRT(complexNumber) + * + * @param string $complexNumber The complex number for which you want the square root. + * @return string + */ + public static function IMSQRT($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + $theta = self::IMARGUMENT($complexNumber); + $d1 = cos($theta / 2); + $d2 = sin($theta / 2); + $r = sqrt(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']))); + + if ($parsedComplex['suffix'] == '') { + return self::COMPLEX($d1 * $r,$d2 * $r); + } else { + return self::COMPLEX($d1 * $r,$d2 * $r,$parsedComplex['suffix']); + } + } // function IMSQRT() + + + /** + * IMLN + * + * Returns the natural logarithm of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMLN(complexNumber) + * + * @param string $complexNumber The complex number for which you want the natural logarithm. + * @return string + */ + public static function IMLN($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $logR = log(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']))); + $t = self::IMARGUMENT($complexNumber); + + if ($parsedComplex['suffix'] == '') { + return self::COMPLEX($logR,$t); + } else { + return self::COMPLEX($logR,$t,$parsedComplex['suffix']); + } + } // function IMLN() + + + /** + * IMLOG10 + * + * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMLOG10(complexNumber) + * + * @param string $complexNumber The complex number for which you want the common logarithm. + * @return string + */ + public static function IMLOG10($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return log10($parsedComplex['real']); + } + + return self::IMPRODUCT(log10(EULER),self::IMLN($complexNumber)); + } // function IMLOG10() + + + /** + * IMLOG2 + * + * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMLOG2(complexNumber) + * + * @param string $complexNumber The complex number for which you want the base-2 logarithm. + * @return string + */ + public static function IMLOG2($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return log($parsedComplex['real'],2); + } + + return self::IMPRODUCT(log(EULER,2),self::IMLN($complexNumber)); + } // function IMLOG2() + + + /** + * IMEXP + * + * Returns the exponential of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMEXP(complexNumber) + * + * @param string $complexNumber The complex number for which you want the exponential. + * @return string + */ + public static function IMEXP($complexNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::_parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return '1'; + } + + $e = exp($parsedComplex['real']); + $eX = $e * cos($parsedComplex['imaginary']); + $eY = $e * sin($parsedComplex['imaginary']); + + if ($parsedComplex['suffix'] == '') { + return self::COMPLEX($eX,$eY); + } else { + return self::COMPLEX($eX,$eY,$parsedComplex['suffix']); + } + } // function IMEXP() + + + /** + * IMPOWER + * + * Returns a complex number in x + yi or x + yj text format raised to a power. + * + * Excel Function: + * IMPOWER(complexNumber,realNumber) + * + * @param string $complexNumber The complex number you want to raise to a power. + * @param float $realNumber The power to which you want to raise the complex number. + * @return string + */ + public static function IMPOWER($complexNumber,$realNumber) { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + $realNumber = PHPExcel_Calculation_Functions::flattenSingleValue($realNumber); + + if (!is_numeric($realNumber)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $parsedComplex = self::_parseComplex($complexNumber); + + $r = sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])); + $rPower = pow($r,$realNumber); + $theta = self::IMARGUMENT($complexNumber) * $realNumber; + if ($theta == 0) { + return 1; + } elseif ($parsedComplex['imaginary'] == 0.0) { + return self::COMPLEX($rPower * cos($theta),$rPower * sin($theta),$parsedComplex['suffix']); + } else { + return self::COMPLEX($rPower * cos($theta),$rPower * sin($theta),$parsedComplex['suffix']); + } + } // function IMPOWER() + + + /** + * IMDIV + * + * Returns the quotient of two complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMDIV(complexDividend,complexDivisor) + * + * @param string $complexDividend The complex numerator or dividend. + * @param string $complexDivisor The complex denominator or divisor. + * @return string + */ + public static function IMDIV($complexDividend,$complexDivisor) { + $complexDividend = PHPExcel_Calculation_Functions::flattenSingleValue($complexDividend); + $complexDivisor = PHPExcel_Calculation_Functions::flattenSingleValue($complexDivisor); + + $parsedComplexDividend = self::_parseComplex($complexDividend); + $parsedComplexDivisor = self::_parseComplex($complexDivisor); + + if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] != '') && + ($parsedComplexDividend['suffix'] != $parsedComplexDivisor['suffix'])) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] == '')) { + $parsedComplexDivisor['suffix'] = $parsedComplexDividend['suffix']; + } + + $d1 = ($parsedComplexDividend['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['imaginary']); + $d2 = ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['real']) - ($parsedComplexDividend['real'] * $parsedComplexDivisor['imaginary']); + $d3 = ($parsedComplexDivisor['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDivisor['imaginary'] * $parsedComplexDivisor['imaginary']); + + $r = $d1/$d3; + $i = $d2/$d3; + + if ($i > 0.0) { + return self::_cleanComplex($r.'+'.$i.$parsedComplexDivisor['suffix']); + } elseif ($i < 0.0) { + return self::_cleanComplex($r.$i.$parsedComplexDivisor['suffix']); + } else { + return $r; + } + } // function IMDIV() + + + /** + * IMSUB + * + * Returns the difference of two complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMSUB(complexNumber1,complexNumber2) + * + * @param string $complexNumber1 The complex number from which to subtract complexNumber2. + * @param string $complexNumber2 The complex number to subtract from complexNumber1. + * @return string + */ + public static function IMSUB($complexNumber1,$complexNumber2) { + $complexNumber1 = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber1); + $complexNumber2 = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber2); + + $parsedComplex1 = self::_parseComplex($complexNumber1); + $parsedComplex2 = self::_parseComplex($complexNumber2); + + if ((($parsedComplex1['suffix'] != '') && ($parsedComplex2['suffix'] != '')) && + ($parsedComplex1['suffix'] != $parsedComplex2['suffix'])) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($parsedComplex1['suffix'] == '') && ($parsedComplex2['suffix'] != '')) { + $parsedComplex1['suffix'] = $parsedComplex2['suffix']; + } + + $d1 = $parsedComplex1['real'] - $parsedComplex2['real']; + $d2 = $parsedComplex1['imaginary'] - $parsedComplex2['imaginary']; + + return self::COMPLEX($d1,$d2,$parsedComplex1['suffix']); + } // function IMSUB() + + + /** + * IMSUM + * + * Returns the sum of two or more complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMSUM(complexNumber[,complexNumber[,...]]) + * + * @param string $complexNumber,... Series of complex numbers to add + * @return string + */ + public static function IMSUM() { + // Return value + $returnValue = self::_parseComplex('0'); + $activeSuffix = ''; + + // Loop through the arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + $parsedComplex = self::_parseComplex($arg); + + if ($activeSuffix == '') { + $activeSuffix = $parsedComplex['suffix']; + } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $returnValue['real'] += $parsedComplex['real']; + $returnValue['imaginary'] += $parsedComplex['imaginary']; + } + + if ($returnValue['imaginary'] == 0.0) { $activeSuffix = ''; } + return self::COMPLEX($returnValue['real'],$returnValue['imaginary'],$activeSuffix); + } // function IMSUM() + + + /** + * IMPRODUCT + * + * Returns the product of two or more complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMPRODUCT(complexNumber[,complexNumber[,...]]) + * + * @param string $complexNumber,... Series of complex numbers to multiply + * @return string + */ + public static function IMPRODUCT() { + // Return value + $returnValue = self::_parseComplex('1'); + $activeSuffix = ''; + + // Loop through the arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + $parsedComplex = self::_parseComplex($arg); + + $workValue = $returnValue; + if (($parsedComplex['suffix'] != '') && ($activeSuffix == '')) { + $activeSuffix = $parsedComplex['suffix']; + } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) { + return PHPExcel_Calculation_Functions::NaN(); + } + $returnValue['real'] = ($workValue['real'] * $parsedComplex['real']) - ($workValue['imaginary'] * $parsedComplex['imaginary']); + $returnValue['imaginary'] = ($workValue['real'] * $parsedComplex['imaginary']) + ($workValue['imaginary'] * $parsedComplex['real']); + } + + if ($returnValue['imaginary'] == 0.0) { $activeSuffix = ''; } + return self::COMPLEX($returnValue['real'],$returnValue['imaginary'],$activeSuffix); + } // function IMPRODUCT() + + + /** + * DELTA + * + * Tests whether two values are equal. Returns 1 if number1 = number2; returns 0 otherwise. + * Use this function to filter a set of values. For example, by summing several DELTA + * functions you calculate the count of equal pairs. This function is also known as the + * Kronecker Delta function. + * + * Excel Function: + * DELTA(a[,b]) + * + * @param float $a The first number. + * @param float $b The second number. If omitted, b is assumed to be zero. + * @return int + */ + public static function DELTA($a, $b=0) { + $a = PHPExcel_Calculation_Functions::flattenSingleValue($a); + $b = PHPExcel_Calculation_Functions::flattenSingleValue($b); + + return (int) ($a == $b); + } // function DELTA() + + + /** + * GESTEP + * + * Excel Function: + * GESTEP(number[,step]) + * + * Returns 1 if number >= step; returns 0 (zero) otherwise + * Use this function to filter a set of values. For example, by summing several GESTEP + * functions you calculate the count of values that exceed a threshold. + * + * @param float $number The value to test against step. + * @param float $step The threshold value. + * If you omit a value for step, GESTEP uses zero. + * @return int + */ + public static function GESTEP($number, $step=0) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $step = PHPExcel_Calculation_Functions::flattenSingleValue($step); + + return (int) ($number >= $step); + } // function GESTEP() + + + // + // Private method to calculate the erf value + // + private static $_two_sqrtpi = 1.128379167095512574; + + public static function _erfVal($x) { + if (abs($x) > 2.2) { + return 1 - self::_erfcVal($x); + } + $sum = $term = $x; + $xsqr = ($x * $x); + $j = 1; + do { + $term *= $xsqr / $j; + $sum -= $term / (2 * $j + 1); + ++$j; + $term *= $xsqr / $j; + $sum += $term / (2 * $j + 1); + ++$j; + if ($sum == 0.0) { + break; + } + } while (abs($term / $sum) > PRECISION); + return self::$_two_sqrtpi * $sum; + } // function _erfVal() + + + /** + * ERF + * + * Returns the error function integrated between the lower and upper bound arguments. + * + * Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments, + * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was + * improved, so that it can now calculate the function for both positive and negative ranges. + * PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments. + * + * Excel Function: + * ERF(lower[,upper]) + * + * @param float $lower lower bound for integrating ERF + * @param float $upper upper bound for integrating ERF. + * If omitted, ERF integrates between zero and lower_limit + * @return float + */ + public static function ERF($lower, $upper = NULL) { + $lower = PHPExcel_Calculation_Functions::flattenSingleValue($lower); + $upper = PHPExcel_Calculation_Functions::flattenSingleValue($upper); + + if (is_numeric($lower)) { + if (is_null($upper)) { + return self::_erfVal($lower); + } + if (is_numeric($upper)) { + return self::_erfVal($upper) - self::_erfVal($lower); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ERF() + + + // + // Private method to calculate the erfc value + // + private static $_one_sqrtpi = 0.564189583547756287; + + private static function _erfcVal($x) { + if (abs($x) < 2.2) { + return 1 - self::_erfVal($x); + } + if ($x < 0) { + return 2 - self::ERFC(-$x); + } + $a = $n = 1; + $b = $c = $x; + $d = ($x * $x) + 0.5; + $q1 = $q2 = $b / $d; + $t = 0; + do { + $t = $a * $n + $b * $x; + $a = $b; + $b = $t; + $t = $c * $n + $d * $x; + $c = $d; + $d = $t; + $n += 0.5; + $q1 = $q2; + $q2 = $b / $d; + } while ((abs($q1 - $q2) / $q2) > PRECISION); + return self::$_one_sqrtpi * exp(-$x * $x) * $q2; + } // function _erfcVal() + + + /** + * ERFC + * + * Returns the complementary ERF function integrated between x and infinity + * + * Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument, + * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was + * improved, so that it can now calculate the function for both positive and negative x values. + * PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments. + * + * Excel Function: + * ERFC(x) + * + * @param float $x The lower bound for integrating ERFC + * @return float + */ + public static function ERFC($x) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_numeric($x)) { + return self::_erfcVal($x); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ERFC() + + + /** + * getConversionGroups + * Returns a list of the different conversion groups for UOM conversions + * + * @return array + */ + public static function getConversionGroups() { + $conversionGroups = array(); + foreach(self::$_conversionUnits as $conversionUnit) { + $conversionGroups[] = $conversionUnit['Group']; + } + return array_merge(array_unique($conversionGroups)); + } // function getConversionGroups() + + + /** + * getConversionGroupUnits + * Returns an array of units of measure, for a specified conversion group, or for all groups + * + * @param string $group The group whose units of measure you want to retrieve + * + * @return array + */ + public static function getConversionGroupUnits($group = NULL) { + $conversionGroups = array(); + foreach(self::$_conversionUnits as $conversionUnit => $conversionGroup) { + if ((is_null($group)) || ($conversionGroup['Group'] == $group)) { + $conversionGroups[$conversionGroup['Group']][] = $conversionUnit; + } + } + return $conversionGroups; + } // function getConversionGroupUnits() + + + /** + * getConversionGroupUnitDetails + * + * @return array + */ + public static function getConversionGroupUnitDetails($group = NULL) { + $conversionGroups = array(); + foreach(self::$_conversionUnits as $conversionUnit => $conversionGroup) { + if ((is_null($group)) || ($conversionGroup['Group'] == $group)) { + $conversionGroups[$conversionGroup['Group']][] = array( 'unit' => $conversionUnit, + 'description' => $conversionGroup['Unit Name'] + ); + } + } + return $conversionGroups; + } // function getConversionGroupUnitDetails() + + + /** + * getConversionMultipliers + * Returns an array of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM() + * + * @return array of mixed + */ + public static function getConversionMultipliers() { + return self::$_conversionMultipliers; + } // function getConversionGroups() + + + /** + * CONVERTUOM + * + * Converts a number from one measurement system to another. + * For example, CONVERT can translate a table of distances in miles to a table of distances + * in kilometers. + * + * Excel Function: + * CONVERT(value,fromUOM,toUOM) + * + * @param float $value The value in fromUOM to convert. + * @param string $fromUOM The units for value. + * @param string $toUOM The units for the result. + * + * @return float + */ + public static function CONVERTUOM($value, $fromUOM, $toUOM) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $fromUOM = PHPExcel_Calculation_Functions::flattenSingleValue($fromUOM); + $toUOM = PHPExcel_Calculation_Functions::flattenSingleValue($toUOM); + + if (!is_numeric($value)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $fromMultiplier = 1.0; + if (isset(self::$_conversionUnits[$fromUOM])) { + $unitGroup1 = self::$_conversionUnits[$fromUOM]['Group']; + } else { + $fromMultiplier = substr($fromUOM,0,1); + $fromUOM = substr($fromUOM,1); + if (isset(self::$_conversionMultipliers[$fromMultiplier])) { + $fromMultiplier = self::$_conversionMultipliers[$fromMultiplier]['multiplier']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + if ((isset(self::$_conversionUnits[$fromUOM])) && (self::$_conversionUnits[$fromUOM]['AllowPrefix'])) { + $unitGroup1 = self::$_conversionUnits[$fromUOM]['Group']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + } + $value *= $fromMultiplier; + + $toMultiplier = 1.0; + if (isset(self::$_conversionUnits[$toUOM])) { + $unitGroup2 = self::$_conversionUnits[$toUOM]['Group']; + } else { + $toMultiplier = substr($toUOM,0,1); + $toUOM = substr($toUOM,1); + if (isset(self::$_conversionMultipliers[$toMultiplier])) { + $toMultiplier = self::$_conversionMultipliers[$toMultiplier]['multiplier']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + if ((isset(self::$_conversionUnits[$toUOM])) && (self::$_conversionUnits[$toUOM]['AllowPrefix'])) { + $unitGroup2 = self::$_conversionUnits[$toUOM]['Group']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + } + if ($unitGroup1 != $unitGroup2) { + return PHPExcel_Calculation_Functions::NA(); + } + + if (($fromUOM == $toUOM) && ($fromMultiplier == $toMultiplier)) { + // We've already factored $fromMultiplier into the value, so we need + // to reverse it again + return $value / $fromMultiplier; + } elseif ($unitGroup1 == 'Temperature') { + if (($fromUOM == 'F') || ($fromUOM == 'fah')) { + if (($toUOM == 'F') || ($toUOM == 'fah')) { + return $value; + } else { + $value = (($value - 32) / 1.8); + if (($toUOM == 'K') || ($toUOM == 'kel')) { + $value += 273.15; + } + return $value; + } + } elseif ((($fromUOM == 'K') || ($fromUOM == 'kel')) && + (($toUOM == 'K') || ($toUOM == 'kel'))) { + return $value; + } elseif ((($fromUOM == 'C') || ($fromUOM == 'cel')) && + (($toUOM == 'C') || ($toUOM == 'cel'))) { + return $value; + } + if (($toUOM == 'F') || ($toUOM == 'fah')) { + if (($fromUOM == 'K') || ($fromUOM == 'kel')) { + $value -= 273.15; + } + return ($value * 1.8) + 32; + } + if (($toUOM == 'C') || ($toUOM == 'cel')) { + return $value - 273.15; + } + return $value + 273.15; + } + return ($value * self::$_unitConversions[$unitGroup1][$fromUOM][$toUOM]) / $toMultiplier; + } // function CONVERTUOM() + +} // class PHPExcel_Calculation_Engineering diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Exception.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Exception.php new file mode 100644 index 000000000..31aa287a2 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Exception.php @@ -0,0 +1,52 @@ +line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/ExceptionHandler.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/ExceptionHandler.php new file mode 100644 index 000000000..8b89a8fd6 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/ExceptionHandler.php @@ -0,0 +1,49 @@ +format('d') == $testDate->format('t')); + } // function _lastDayOfMonth() + + + /** + * _firstDayOfMonth + * + * Returns a boolean TRUE/FALSE indicating if this date is the first date of the month + * + * @param DateTime $testDate The date for testing + * @return boolean + */ + private static function _firstDayOfMonth($testDate) + { + return ($testDate->format('d') == 1); + } // function _firstDayOfMonth() + + + private static function _coupFirstPeriodDate($settlement, $maturity, $frequency, $next) + { + $months = 12 / $frequency; + + $result = PHPExcel_Shared_Date::ExcelToPHPObject($maturity); + $eom = self::_lastDayOfMonth($result); + + while ($settlement < PHPExcel_Shared_Date::PHPToExcel($result)) { + $result->modify('-'.$months.' months'); + } + if ($next) { + $result->modify('+'.$months.' months'); + } + + if ($eom) { + $result->modify('-1 day'); + } + + return PHPExcel_Shared_Date::PHPToExcel($result); + } // function _coupFirstPeriodDate() + + + private static function _validFrequency($frequency) + { + if (($frequency == 1) || ($frequency == 2) || ($frequency == 4)) { + return true; + } + if ((PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) && + (($frequency == 6) || ($frequency == 12))) { + return true; + } + return false; + } // function _validFrequency() + + + /** + * _daysPerYear + * + * Returns the number of days in a specified year, as defined by the "basis" value + * + * @param integer $year The year against which we're testing + * @param integer $basis The type of day count: + * 0 or omitted US (NASD) 360 + * 1 Actual (365 or 366 in a leap year) + * 2 360 + * 3 365 + * 4 European 360 + * @return integer + */ + private static function _daysPerYear($year, $basis=0) + { + switch ($basis) { + case 0 : + case 2 : + case 4 : + $daysPerYear = 360; + break; + case 3 : + $daysPerYear = 365; + break; + case 1 : + $daysPerYear = (PHPExcel_Calculation_DateTime::_isLeapYear($year)) ? 366 : 365; + break; + default : + return PHPExcel_Calculation_Functions::NaN(); + } + return $daysPerYear; + } // function _daysPerYear() + + + private static function _interestAndPrincipal($rate=0, $per=0, $nper=0, $pv=0, $fv=0, $type=0) + { + $pmt = self::PMT($rate, $nper, $pv, $fv, $type); + $capital = $pv; + for ($i = 1; $i<= $per; ++$i) { + $interest = ($type && $i == 1) ? 0 : -$capital * $rate; + $principal = $pmt - $interest; + $capital += $principal; + } + return array($interest, $principal); + } // function _interestAndPrincipal() + + + /** + * ACCRINT + * + * Returns the accrued interest for a security that pays periodic interest. + * + * Excel Function: + * ACCRINT(issue,firstinterest,settlement,rate,par,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed $issue The security's issue date. + * @param mixed $firstinterest The security's first interest date. + * @param mixed $settlement The security's settlement date. + * The security settlement date is the date after the issue date + * when the security is traded to the buyer. + * @param float $rate The security's annual coupon rate. + * @param float $par The security's par value. + * If you omit par, ACCRINT uses $1,000. + * @param integer $frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer $basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function ACCRINT($issue, $firstinterest, $settlement, $rate, $par=1000, $frequency=1, $basis=0) + { + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $firstinterest = PHPExcel_Calculation_Functions::flattenSingleValue($firstinterest); + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $par = (is_null($par)) ? 1000 : PHPExcel_Calculation_Functions::flattenSingleValue($par); + $frequency = (is_null($frequency)) ? 1 : PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($rate)) && (is_numeric($par))) { + $rate = (float) $rate; + $par = (float) $par; + if (($rate <= 0) || ($par <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + + return $par * $rate * $daysBetweenIssueAndSettlement; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ACCRINT() + + + /** + * ACCRINTM + * + * Returns the accrued interest for a security that pays interest at maturity. + * + * Excel Function: + * ACCRINTM(issue,settlement,rate[,par[,basis]]) + * + * @access public + * @category Financial Functions + * @param mixed issue The security's issue date. + * @param mixed settlement The security's settlement (or maturity) date. + * @param float rate The security's annual coupon rate. + * @param float par The security's par value. + * If you omit par, ACCRINT uses $1,000. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function ACCRINTM($issue, $settlement, $rate, $par=1000, $basis=0) { + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $par = (is_null($par)) ? 1000 : PHPExcel_Calculation_Functions::flattenSingleValue($par); + $basis = (is_null($basis)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($rate)) && (is_numeric($par))) { + $rate = (float) $rate; + $par = (float) $par; + if (($rate <= 0) || ($par <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + return $par * $rate * $daysBetweenIssueAndSettlement; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ACCRINTM() + + + /** + * AMORDEGRC + * + * Returns the depreciation for each accounting period. + * This function is provided for the French accounting system. If an asset is purchased in + * the middle of the accounting period, the prorated depreciation is taken into account. + * The function is similar to AMORLINC, except that a depreciation coefficient is applied in + * the calculation depending on the life of the assets. + * This function will return the depreciation until the last period of the life of the assets + * or until the cumulated value of depreciation is greater than the cost of the assets minus + * the salvage value. + * + * Excel Function: + * AMORDEGRC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) + * + * @access public + * @category Financial Functions + * @param float cost The cost of the asset. + * @param mixed purchased Date of the purchase of the asset. + * @param mixed firstPeriod Date of the end of the first period. + * @param mixed salvage The salvage value at the end of the life of the asset. + * @param float period The period. + * @param float rate Rate of depreciation. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function AMORDEGRC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis=0) { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $purchased = PHPExcel_Calculation_Functions::flattenSingleValue($purchased); + $firstPeriod = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $period = floor(PHPExcel_Calculation_Functions::flattenSingleValue($period)); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // The depreciation coefficients are: + // Life of assets (1/rate) Depreciation coefficient + // Less than 3 years 1 + // Between 3 and 4 years 1.5 + // Between 5 and 6 years 2 + // More than 6 years 2.5 + $fUsePer = 1.0 / $rate; + if ($fUsePer < 3.0) { + $amortiseCoeff = 1.0; + } elseif ($fUsePer < 5.0) { + $amortiseCoeff = 1.5; + } elseif ($fUsePer <= 6.0) { + $amortiseCoeff = 2.0; + } else { + $amortiseCoeff = 2.5; + } + + $rate *= $amortiseCoeff; + $fNRate = round(PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis) * $rate * $cost,0); + $cost -= $fNRate; + $fRest = $cost - $salvage; + + for ($n = 0; $n < $period; ++$n) { + $fNRate = round($rate * $cost,0); + $fRest -= $fNRate; + + if ($fRest < 0.0) { + switch ($period - $n) { + case 0 : + case 1 : return round($cost * 0.5, 0); + break; + default : return 0.0; + break; + } + } + $cost -= $fNRate; + } + return $fNRate; + } // function AMORDEGRC() + + + /** + * AMORLINC + * + * Returns the depreciation for each accounting period. + * This function is provided for the French accounting system. If an asset is purchased in + * the middle of the accounting period, the prorated depreciation is taken into account. + * + * Excel Function: + * AMORLINC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) + * + * @access public + * @category Financial Functions + * @param float cost The cost of the asset. + * @param mixed purchased Date of the purchase of the asset. + * @param mixed firstPeriod Date of the end of the first period. + * @param mixed salvage The salvage value at the end of the life of the asset. + * @param float period The period. + * @param float rate Rate of depreciation. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function AMORLINC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis=0) { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $purchased = PHPExcel_Calculation_Functions::flattenSingleValue($purchased); + $firstPeriod = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + $fOneRate = $cost * $rate; + $fCostDelta = $cost - $salvage; + // Note, quirky variation for leap years on the YEARFRAC for this function + $purchasedYear = PHPExcel_Calculation_DateTime::YEAR($purchased); + $yearFrac = PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis); + + if (($basis == 1) && ($yearFrac < 1) && (PHPExcel_Calculation_DateTime::_isLeapYear($purchasedYear))) { + $yearFrac *= 365 / 366; + } + + $f0Rate = $yearFrac * $rate * $cost; + $nNumOfFullPeriods = intval(($cost - $salvage - $f0Rate) / $fOneRate); + + if ($period == 0) { + return $f0Rate; + } elseif ($period <= $nNumOfFullPeriods) { + return $fOneRate; + } elseif ($period == ($nNumOfFullPeriods + 1)) { + return ($fCostDelta - $fOneRate * $nNumOfFullPeriods - $f0Rate); + } else { + return 0.0; + } + } // function AMORLINC() + + + /** + * COUPDAYBS + * + * Returns the number of days from the beginning of the coupon period to the settlement date. + * + * Excel Function: + * COUPDAYBS(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function COUPDAYBS($settlement, $maturity, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $daysPerYear = self::_daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement),$basis); + $prev = self::_coupFirstPeriodDate($settlement, $maturity, $frequency, False); + + return PHPExcel_Calculation_DateTime::YEARFRAC($prev, $settlement, $basis) * $daysPerYear; + } // function COUPDAYBS() + + + /** + * COUPDAYS + * + * Returns the number of days in the coupon period that contains the settlement date. + * + * Excel Function: + * COUPDAYS(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function COUPDAYS($settlement, $maturity, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + switch ($basis) { + case 3: // Actual/365 + return 365 / $frequency; + case 1: // Actual/actual + if ($frequency == 1) { + $daysPerYear = self::_daysPerYear(PHPExcel_Calculation_DateTime::YEAR($maturity),$basis); + return ($daysPerYear / $frequency); + } else { + $prev = self::_coupFirstPeriodDate($settlement, $maturity, $frequency, False); + $next = self::_coupFirstPeriodDate($settlement, $maturity, $frequency, True); + return ($next - $prev); + } + default: // US (NASD) 30/360, Actual/360 or European 30/360 + return 360 / $frequency; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function COUPDAYS() + + + /** + * COUPDAYSNC + * + * Returns the number of days from the settlement date to the next coupon date. + * + * Excel Function: + * COUPDAYSNC(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function COUPDAYSNC($settlement, $maturity, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $daysPerYear = self::_daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement),$basis); + $next = self::_coupFirstPeriodDate($settlement, $maturity, $frequency, True); + + return PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $next, $basis) * $daysPerYear; + } // function COUPDAYSNC() + + + /** + * COUPNCD + * + * Returns the next coupon date after the settlement date. + * + * Excel Function: + * COUPNCD(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function COUPNCD($settlement, $maturity, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return self::_coupFirstPeriodDate($settlement, $maturity, $frequency, True); + } // function COUPNCD() + + + /** + * COUPNUM + * + * Returns the number of coupons payable between the settlement date and maturity date, + * rounded up to the nearest whole coupon. + * + * Excel Function: + * COUPNUM(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return integer + */ + public static function COUPNUM($settlement, $maturity, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $settlement = self::_coupFirstPeriodDate($settlement, $maturity, $frequency, True); + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis) * 365; + + switch ($frequency) { + case 1: // annual payments + return ceil($daysBetweenSettlementAndMaturity / 360); + case 2: // half-yearly + return ceil($daysBetweenSettlementAndMaturity / 180); + case 4: // quarterly + return ceil($daysBetweenSettlementAndMaturity / 90); + case 6: // bimonthly + return ceil($daysBetweenSettlementAndMaturity / 60); + case 12: // monthly + return ceil($daysBetweenSettlementAndMaturity / 30); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function COUPNUM() + + + /** + * COUPPCD + * + * Returns the previous coupon date before the settlement date. + * + * Excel Function: + * COUPPCD(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function COUPPCD($settlement, $maturity, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return self::_coupFirstPeriodDate($settlement, $maturity, $frequency, False); + } // function COUPPCD() + + + /** + * CUMIPMT + * + * Returns the cumulative interest paid on a loan between the start and end periods. + * + * Excel Function: + * CUMIPMT(rate,nper,pv,start,end[,type]) + * + * @access public + * @category Financial Functions + * @param float $rate The Interest rate + * @param integer $nper The total number of payment periods + * @param float $pv Present Value + * @param integer $start The first period in the calculation. + * Payment periods are numbered beginning with 1. + * @param integer $end The last period in the calculation. + * @param integer $type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @return float + */ + public static function CUMIPMT($rate, $nper, $pv, $start, $end, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $start = (int) PHPExcel_Calculation_Functions::flattenSingleValue($start); + $end = (int) PHPExcel_Calculation_Functions::flattenSingleValue($end); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($start < 1 || $start > $end) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $interest = 0; + for ($per = $start; $per <= $end; ++$per) { + $interest += self::IPMT($rate, $per, $nper, $pv, 0, $type); + } + + return $interest; + } // function CUMIPMT() + + + /** + * CUMPRINC + * + * Returns the cumulative principal paid on a loan between the start and end periods. + * + * Excel Function: + * CUMPRINC(rate,nper,pv,start,end[,type]) + * + * @access public + * @category Financial Functions + * @param float $rate The Interest rate + * @param integer $nper The total number of payment periods + * @param float $pv Present Value + * @param integer $start The first period in the calculation. + * Payment periods are numbered beginning with 1. + * @param integer $end The last period in the calculation. + * @param integer $type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @return float + */ + public static function CUMPRINC($rate, $nper, $pv, $start, $end, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $start = (int) PHPExcel_Calculation_Functions::flattenSingleValue($start); + $end = (int) PHPExcel_Calculation_Functions::flattenSingleValue($end); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($start < 1 || $start > $end) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $principal = 0; + for ($per = $start; $per <= $end; ++$per) { + $principal += self::PPMT($rate, $per, $nper, $pv, 0, $type); + } + + return $principal; + } // function CUMPRINC() + + + /** + * DB + * + * Returns the depreciation of an asset for a specified period using the + * fixed-declining balance method. + * This form of depreciation is used if you want to get a higher depreciation value + * at the beginning of the depreciation (as opposed to linear depreciation). The + * depreciation value is reduced with every depreciation period by the depreciation + * already deducted from the initial cost. + * + * Excel Function: + * DB(cost,salvage,life,period[,month]) + * + * @access public + * @category Financial Functions + * @param float cost Initial cost of the asset. + * @param float salvage Value at the end of the depreciation. + * (Sometimes called the salvage value of the asset) + * @param integer life Number of periods over which the asset is depreciated. + * (Sometimes called the useful life of the asset) + * @param integer period The period for which you want to calculate the + * depreciation. Period must use the same units as life. + * @param integer month Number of months in the first year. If month is omitted, + * it defaults to 12. + * @return float + */ + public static function DB($cost, $salvage, $life, $period, $month=12) { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + $month = PHPExcel_Calculation_Functions::flattenSingleValue($month); + + // Validate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($month))) { + $cost = (float) $cost; + $salvage = (float) $salvage; + $life = (int) $life; + $period = (int) $period; + $month = (int) $month; + if ($cost == 0) { + return 0.0; + } elseif (($cost < 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($month < 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + // Set Fixed Depreciation Rate + $fixedDepreciationRate = 1 - pow(($salvage / $cost), (1 / $life)); + $fixedDepreciationRate = round($fixedDepreciationRate, 3); + + // Loop through each period calculating the depreciation + $previousDepreciation = 0; + for ($per = 1; $per <= $period; ++$per) { + if ($per == 1) { + $depreciation = $cost * $fixedDepreciationRate * $month / 12; + } elseif ($per == ($life + 1)) { + $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate * (12 - $month) / 12; + } else { + $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate; + } + $previousDepreciation += $depreciation; + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $depreciation = round($depreciation,2); + } + return $depreciation; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function DB() + + + /** + * DDB + * + * Returns the depreciation of an asset for a specified period using the + * double-declining balance method or some other method you specify. + * + * Excel Function: + * DDB(cost,salvage,life,period[,factor]) + * + * @access public + * @category Financial Functions + * @param float cost Initial cost of the asset. + * @param float salvage Value at the end of the depreciation. + * (Sometimes called the salvage value of the asset) + * @param integer life Number of periods over which the asset is depreciated. + * (Sometimes called the useful life of the asset) + * @param integer period The period for which you want to calculate the + * depreciation. Period must use the same units as life. + * @param float factor The rate at which the balance declines. + * If factor is omitted, it is assumed to be 2 (the + * double-declining balance method). + * @return float + */ + public static function DDB($cost, $salvage, $life, $period, $factor=2.0) { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + $factor = PHPExcel_Calculation_Functions::flattenSingleValue($factor); + + // Validate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($factor))) { + $cost = (float) $cost; + $salvage = (float) $salvage; + $life = (int) $life; + $period = (int) $period; + $factor = (float) $factor; + if (($cost <= 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($factor <= 0.0) || ($period > $life)) { + return PHPExcel_Calculation_Functions::NaN(); + } + // Set Fixed Depreciation Rate + $fixedDepreciationRate = 1 - pow(($salvage / $cost), (1 / $life)); + $fixedDepreciationRate = round($fixedDepreciationRate, 3); + + // Loop through each period calculating the depreciation + $previousDepreciation = 0; + for ($per = 1; $per <= $period; ++$per) { + $depreciation = min( ($cost - $previousDepreciation) * ($factor / $life), ($cost - $salvage - $previousDepreciation) ); + $previousDepreciation += $depreciation; + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $depreciation = round($depreciation,2); + } + return $depreciation; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function DDB() + + + /** + * DISC + * + * Returns the discount rate for a security. + * + * Excel Function: + * DISC(settlement,maturity,price,redemption[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param integer price The security's price per $100 face value. + * @param integer redemption The security's redemption value per $100 face value. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function DISC($settlement, $maturity, $price, $redemption, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + $redemption = PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($price)) && (is_numeric($redemption)) && (is_numeric($basis))) { + $price = (float) $price; + $redemption = (float) $redemption; + $basis = (int) $basis; + if (($price <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return ((1 - $price / $redemption) / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function DISC() + + + /** + * DOLLARDE + * + * Converts a dollar price expressed as an integer part and a fraction + * part into a dollar price expressed as a decimal number. + * Fractional dollar numbers are sometimes used for security prices. + * + * Excel Function: + * DOLLARDE(fractional_dollar,fraction) + * + * @access public + * @category Financial Functions + * @param float $fractional_dollar Fractional Dollar + * @param integer $fraction Fraction + * @return float + */ + public static function DOLLARDE($fractional_dollar = Null, $fraction = 0) { + $fractional_dollar = PHPExcel_Calculation_Functions::flattenSingleValue($fractional_dollar); + $fraction = (int)PHPExcel_Calculation_Functions::flattenSingleValue($fraction); + + // Validate parameters + if (is_null($fractional_dollar) || $fraction < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($fraction == 0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $dollars = floor($fractional_dollar); + $cents = fmod($fractional_dollar,1); + $cents /= $fraction; + $cents *= pow(10,ceil(log10($fraction))); + return $dollars + $cents; + } // function DOLLARDE() + + + /** + * DOLLARFR + * + * Converts a dollar price expressed as a decimal number into a dollar price + * expressed as a fraction. + * Fractional dollar numbers are sometimes used for security prices. + * + * Excel Function: + * DOLLARFR(decimal_dollar,fraction) + * + * @access public + * @category Financial Functions + * @param float $decimal_dollar Decimal Dollar + * @param integer $fraction Fraction + * @return float + */ + public static function DOLLARFR($decimal_dollar = Null, $fraction = 0) { + $decimal_dollar = PHPExcel_Calculation_Functions::flattenSingleValue($decimal_dollar); + $fraction = (int)PHPExcel_Calculation_Functions::flattenSingleValue($fraction); + + // Validate parameters + if (is_null($decimal_dollar) || $fraction < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($fraction == 0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $dollars = floor($decimal_dollar); + $cents = fmod($decimal_dollar,1); + $cents *= $fraction; + $cents *= pow(10,-ceil(log10($fraction))); + return $dollars + $cents; + } // function DOLLARFR() + + + /** + * EFFECT + * + * Returns the effective interest rate given the nominal rate and the number of + * compounding payments per year. + * + * Excel Function: + * EFFECT(nominal_rate,npery) + * + * @access public + * @category Financial Functions + * @param float $nominal_rate Nominal interest rate + * @param integer $npery Number of compounding payments per year + * @return float + */ + public static function EFFECT($nominal_rate = 0, $npery = 0) { + $nominal_rate = PHPExcel_Calculation_Functions::flattenSingleValue($nominal_rate); + $npery = (int)PHPExcel_Calculation_Functions::flattenSingleValue($npery); + + // Validate parameters + if ($nominal_rate <= 0 || $npery < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return pow((1 + $nominal_rate / $npery), $npery) - 1; + } // function EFFECT() + + + /** + * FV + * + * Returns the Future Value of a cash flow with constant payments and interest rate (annuities). + * + * Excel Function: + * FV(rate,nper,pmt[,pv[,type]]) + * + * @access public + * @category Financial Functions + * @param float $rate The interest rate per period + * @param int $nper Total number of payment periods in an annuity + * @param float $pmt The payment made each period: it cannot change over the + * life of the annuity. Typically, pmt contains principal + * and interest but no other fees or taxes. + * @param float $pv Present Value, or the lump-sum amount that a series of + * future payments is worth right now. + * @param integer $type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @return float + */ + public static function FV($rate = 0, $nper = 0, $pmt = 0, $pv = 0, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + return -$pv * pow(1 + $rate, $nper) - $pmt * (1 + $rate * $type) * (pow(1 + $rate, $nper) - 1) / $rate; + } else { + return -$pv - $pmt * $nper; + } + } // function FV() + + + /** + * FVSCHEDULE + * + */ + public static function FVSCHEDULE($principal, $schedule) { + $principal = PHPExcel_Calculation_Functions::flattenSingleValue($principal); + $schedule = PHPExcel_Calculation_Functions::flattenArray($schedule); + + foreach($schedule as $n) { + $principal *= 1 + $n; + } + + return $principal; + } // function FVSCHEDULE() + + + /** + * INTRATE + * + * Returns the interest rate for a fully invested security. + * + * Excel Function: + * INTRATE(settlement,maturity,investment,redemption[,basis]) + * + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param integer investment The amount invested in the security. + * @param integer redemption The amount to be received at maturity. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function INTRATE($settlement, $maturity, $investment, $redemption, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $investment = PHPExcel_Calculation_Functions::flattenSingleValue($investment); + $redemption = PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($investment)) && (is_numeric($redemption)) && (is_numeric($basis))) { + $investment = (float) $investment; + $redemption = (float) $redemption; + $basis = (int) $basis; + if (($investment <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return (($redemption / $investment) - 1) / ($daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function INTRATE() + + + /** + * IPMT + * + * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate. + * + * @param float $rate Interest rate per period + * @param int $per Period for which we want to find the interest + * @param int $nper Number of periods + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function IPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $per = (int) PHPExcel_Calculation_Functions::flattenSingleValue($per); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($per <= 0 || $per > $nper) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $interestAndPrincipal = self::_interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type); + return $interestAndPrincipal[0]; + } // function IPMT() + + + public static function IRR($values, $guess = 0.1) { + if (!is_array($values)) return PHPExcel_Calculation_Functions::VALUE(); + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess); + + // create an initial range, with a root somewhere between 0 and guess + $x1 = 0.0; + $x2 = $guess; + $f1 = self::NPV($x1, $values); + $f2 = self::NPV($x2, $values); + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + if (($f1 * $f2) < 0.0) break; + if (abs($f1) < abs($f2)) { + $f1 = self::NPV($x1 += 1.6 * ($x1 - $x2), $values); + } else { + $f2 = self::NPV($x2 += 1.6 * ($x2 - $x1), $values); + } + } + if (($f1 * $f2) > 0.0) return PHPExcel_Calculation_Functions::VALUE(); + + $f = self::NPV($x1, $values); + if ($f < 0.0) { + $rtb = $x1; + $dx = $x2 - $x1; + } else { + $rtb = $x2; + $dx = $x1 - $x2; + } + + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + $dx *= 0.5; + $x_mid = $rtb + $dx; + $f_mid = self::NPV($x_mid, $values); + if ($f_mid <= 0.0) $rtb = $x_mid; + if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) return $x_mid; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function IRR() + + + /** + * ISPMT + * + * Returns the interest payment for an investment based on an interest rate and a constant payment schedule. + * + * Excel Function: + * =ISPMT(interest_rate, period, number_payments, PV) + * + * interest_rate is the interest rate for the investment + * + * period is the period to calculate the interest rate. It must be betweeen 1 and number_payments. + * + * number_payments is the number of payments for the annuity + * + * PV is the loan amount or present value of the payments + */ + public static function ISPMT() { + // Return value + $returnValue = 0; + + // Get the parameters + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $interestRate = array_shift($aArgs); + $period = array_shift($aArgs); + $numberPeriods = array_shift($aArgs); + $principleRemaining = array_shift($aArgs); + + // Calculate + $principlePayment = ($principleRemaining * 1.0) / ($numberPeriods * 1.0); + for($i=0; $i <= $period; ++$i) { + $returnValue = $interestRate * $principleRemaining * -1; + $principleRemaining -= $principlePayment; + // principle needs to be 0 after the last payment, don't let floating point screw it up + if($i == $numberPeriods) { + $returnValue = 0; + } + } + return($returnValue); + } // function ISPMT() + + + public static function MIRR($values, $finance_rate, $reinvestment_rate) { + if (!is_array($values)) return PHPExcel_Calculation_Functions::VALUE(); + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $finance_rate = PHPExcel_Calculation_Functions::flattenSingleValue($finance_rate); + $reinvestment_rate = PHPExcel_Calculation_Functions::flattenSingleValue($reinvestment_rate); + $n = count($values); + + $rr = 1.0 + $reinvestment_rate; + $fr = 1.0 + $finance_rate; + + $npv_pos = $npv_neg = 0.0; + foreach($values as $i => $v) { + if ($v >= 0) { + $npv_pos += $v / pow($rr, $i); + } else { + $npv_neg += $v / pow($fr, $i); + } + } + + if (($npv_neg == 0) || ($npv_pos == 0) || ($reinvestment_rate <= -1)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $mirr = pow((-$npv_pos * pow($rr, $n)) + / ($npv_neg * ($rr)), (1.0 / ($n - 1))) - 1.0; + + return (is_finite($mirr) ? $mirr : PHPExcel_Calculation_Functions::VALUE()); + } // function MIRR() + + + /** + * NOMINAL + * + * Returns the nominal interest rate given the effective rate and the number of compounding payments per year. + * + * @param float $effect_rate Effective interest rate + * @param int $npery Number of compounding payments per year + * @return float + */ + public static function NOMINAL($effect_rate = 0, $npery = 0) { + $effect_rate = PHPExcel_Calculation_Functions::flattenSingleValue($effect_rate); + $npery = (int)PHPExcel_Calculation_Functions::flattenSingleValue($npery); + + // Validate parameters + if ($effect_rate <= 0 || $npery < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + return $npery * (pow($effect_rate + 1, 1 / $npery) - 1); + } // function NOMINAL() + + + /** + * NPER + * + * Returns the number of periods for a cash flow with constant periodic payments (annuities), and interest rate. + * + * @param float $rate Interest rate per period + * @param int $pmt Periodic payment (annuity) + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function NPER($rate = 0, $pmt = 0, $pv = 0, $fv = 0, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + if ($pmt == 0 && $pv == 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return log(($pmt * (1 + $rate * $type) / $rate - $fv) / ($pv + $pmt * (1 + $rate * $type) / $rate)) / log(1 + $rate); + } else { + if ($pmt == 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return (-$pv -$fv) / $pmt; + } + } // function NPER() + + + /** + * NPV + * + * Returns the Net Present Value of a cash flow series given a discount rate. + * + * @param float Discount interest rate + * @param array Cash flow series + * @return float + */ + public static function NPV() { + // Return value + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $rate = array_shift($aArgs); + for ($i = 1; $i <= count($aArgs); ++$i) { + // Is it a numeric value? + if (is_numeric($aArgs[$i - 1])) { + $returnValue += $aArgs[$i - 1] / pow(1 + $rate, $i); + } + } + + // Return + return $returnValue; + } // function NPV() + + + /** + * PMT + * + * Returns the constant payment (annuity) for a cash flow with a constant interest rate. + * + * @param float $rate Interest rate per period + * @param int $nper Number of periods + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function PMT($rate = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + return (-$fv - $pv * pow(1 + $rate, $nper)) / (1 + $rate * $type) / ((pow(1 + $rate, $nper) - 1) / $rate); + } else { + return (-$pv - $fv) / $nper; + } + } // function PMT() + + + /** + * PPMT + * + * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate. + * + * @param float $rate Interest rate per period + * @param int $per Period for which we want to find the interest + * @param int $nper Number of periods + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function PPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $per = (int) PHPExcel_Calculation_Functions::flattenSingleValue($per); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($per <= 0 || $per > $nper) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $interestAndPrincipal = self::_interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type); + return $interestAndPrincipal[1]; + } // function PPMT() + + + public static function PRICE($settlement, $maturity, $rate, $yield, $redemption, $frequency, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $rate = (float) PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $yield = (float) PHPExcel_Calculation_Functions::flattenSingleValue($yield); + $redemption = (float) PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::_getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::_validFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $dsc = self::COUPDAYSNC($settlement, $maturity, $frequency, $basis); + $e = self::COUPDAYS($settlement, $maturity, $frequency, $basis); + $n = self::COUPNUM($settlement, $maturity, $frequency, $basis); + $a = self::COUPDAYBS($settlement, $maturity, $frequency, $basis); + + $baseYF = 1.0 + ($yield / $frequency); + $rfp = 100 * ($rate / $frequency); + $de = $dsc / $e; + + $result = $redemption / pow($baseYF, (--$n + $de)); + for($k = 0; $k <= $n; ++$k) { + $result += $rfp / (pow($baseYF, ($k + $de))); + } + $result -= $rfp * ($a / $e); + + return $result; + } // function PRICE() + + + /** + * PRICEDISC + * + * Returns the price per $100 face value of a discounted security. + * + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param int discount The security's discount rate. + * @param int redemption The security's redemption value per $100 face value. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function PRICEDISC($settlement, $maturity, $discount, $redemption, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $discount = (float) PHPExcel_Calculation_Functions::flattenSingleValue($discount); + $redemption = (float) PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($discount)) && (is_numeric($redemption)) && (is_numeric($basis))) { + if (($discount <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return $redemption * (1 - $discount * $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function PRICEDISC() + + + /** + * PRICEMAT + * + * Returns the price per $100 face value of a security that pays interest at maturity. + * + * @param mixed settlement The security's settlement date. + * The security's settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed issue The security's issue date. + * @param int rate The security's interest rate at date of issue. + * @param int yield The security's annual yield. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function PRICEMAT($settlement, $maturity, $issue, $rate, $yield, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $yield = PHPExcel_Calculation_Functions::flattenSingleValue($yield); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if (is_numeric($rate) && is_numeric($yield)) { + if (($rate <= 0) || ($yield <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysPerYear = self::_daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement),$basis); + if (!is_numeric($daysPerYear)) { + return $daysPerYear; + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + $daysBetweenIssueAndSettlement *= $daysPerYear; + $daysBetweenIssueAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $maturity, $basis); + if (!is_numeric($daysBetweenIssueAndMaturity)) { + // return date error + return $daysBetweenIssueAndMaturity; + } + $daysBetweenIssueAndMaturity *= $daysPerYear; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + $daysBetweenSettlementAndMaturity *= $daysPerYear; + + return ((100 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate * 100)) / + (1 + (($daysBetweenSettlementAndMaturity / $daysPerYear) * $yield)) - + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate * 100)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function PRICEMAT() + + + /** + * PV + * + * Returns the Present Value of a cash flow with constant payments and interest rate (annuities). + * + * @param float $rate Interest rate per period + * @param int $nper Number of periods + * @param float $pmt Periodic payment (annuity) + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function PV($rate = 0, $nper = 0, $pmt = 0, $fv = 0, $type = 0) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + return (-$pmt * (1 + $rate * $type) * ((pow(1 + $rate, $nper) - 1) / $rate) - $fv) / pow(1 + $rate, $nper); + } else { + return -$fv - $pmt * $nper; + } + } // function PV() + + + /** + * RATE + * + * Returns the interest rate per period of an annuity. + * RATE is calculated by iteration and can have zero or more solutions. + * If the successive results of RATE do not converge to within 0.0000001 after 20 iterations, + * RATE returns the #NUM! error value. + * + * Excel Function: + * RATE(nper,pmt,pv[,fv[,type[,guess]]]) + * + * @access public + * @category Financial Functions + * @param float nper The total number of payment periods in an annuity. + * @param float pmt The payment made each period and cannot change over the life + * of the annuity. + * Typically, pmt includes principal and interest but no other + * fees or taxes. + * @param float pv The present value - the total amount that a series of future + * payments is worth now. + * @param float fv The future value, or a cash balance you want to attain after + * the last payment is made. If fv is omitted, it is assumed + * to be 0 (the future value of a loan, for example, is 0). + * @param integer type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @param float guess Your guess for what the rate will be. + * If you omit guess, it is assumed to be 10 percent. + * @return float + **/ + public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) { + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = (is_null($fv)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = (is_null($type)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + $guess = (is_null($guess)) ? 0.1 : PHPExcel_Calculation_Functions::flattenSingleValue($guess); + + $rate = $guess; + if (abs($rate) < FINANCIAL_PRECISION) { + $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv; + } else { + $f = exp($nper * log(1 + $rate)); + $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; + } + $y0 = $pv + $pmt * $nper + $fv; + $y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; + + // find root by secant method + $i = $x0 = 0.0; + $x1 = $rate; + while ((abs($y0 - $y1) > FINANCIAL_PRECISION) && ($i < FINANCIAL_MAX_ITERATIONS)) { + $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0); + $x0 = $x1; + $x1 = $rate; + if (($nper * abs($pmt)) > ($pv - $fv)) + $x1 = abs($x1); + + if (abs($rate) < FINANCIAL_PRECISION) { + $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv; + } else { + $f = exp($nper * log(1 + $rate)); + $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; + } + + $y0 = $y1; + $y1 = $y; + ++$i; + } + return $rate; + } // function RATE() + + + /** + * RECEIVED + * + * Returns the price per $100 face value of a discounted security. + * + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param int investment The amount invested in the security. + * @param int discount The security's discount rate. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function RECEIVED($settlement, $maturity, $investment, $discount, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $investment = (float) PHPExcel_Calculation_Functions::flattenSingleValue($investment); + $discount = (float) PHPExcel_Calculation_Functions::flattenSingleValue($discount); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($investment)) && (is_numeric($discount)) && (is_numeric($basis))) { + if (($investment <= 0) || ($discount <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return $investment / ( 1 - ($discount * $daysBetweenSettlementAndMaturity)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function RECEIVED() + + + /** + * SLN + * + * Returns the straight-line depreciation of an asset for one period + * + * @param cost Initial cost of the asset + * @param salvage Value at the end of the depreciation + * @param life Number of periods over which the asset is depreciated + * @return float + */ + public static function SLN($cost, $salvage, $life) { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + + // Calculate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life))) { + if ($life < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return ($cost - $salvage) / $life; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SLN() + + + /** + * SYD + * + * Returns the sum-of-years' digits depreciation of an asset for a specified period. + * + * @param cost Initial cost of the asset + * @param salvage Value at the end of the depreciation + * @param life Number of periods over which the asset is depreciated + * @param period Period + * @return float + */ + public static function SYD($cost, $salvage, $life, $period) { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + + // Calculate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period))) { + if (($life < 1) || ($period > $life)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return (($cost - $salvage) * ($life - $period + 1) * 2) / ($life * ($life + 1)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SYD() + + + /** + * TBILLEQ + * + * Returns the bond-equivalent yield for a Treasury bill. + * + * @param mixed settlement The Treasury bill's settlement date. + * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. + * @param mixed maturity The Treasury bill's maturity date. + * The maturity date is the date when the Treasury bill expires. + * @param int discount The Treasury bill's discount rate. + * @return float + */ + public static function TBILLEQ($settlement, $maturity, $discount) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $discount = PHPExcel_Calculation_Functions::flattenSingleValue($discount); + + // Use TBILLPRICE for validation + $testValue = self::TBILLPRICE($settlement, $maturity, $discount); + if (is_string($testValue)) { + return $testValue; + } + + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + ++$maturity; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360; + } else { + $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::_getDateValue($maturity) - PHPExcel_Calculation_DateTime::_getDateValue($settlement)); + } + + return (365 * $discount) / (360 - $discount * $daysBetweenSettlementAndMaturity); + } // function TBILLEQ() + + + /** + * TBILLPRICE + * + * Returns the yield for a Treasury bill. + * + * @param mixed settlement The Treasury bill's settlement date. + * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. + * @param mixed maturity The Treasury bill's maturity date. + * The maturity date is the date when the Treasury bill expires. + * @param int discount The Treasury bill's discount rate. + * @return float + */ + public static function TBILLPRICE($settlement, $maturity, $discount) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $discount = PHPExcel_Calculation_Functions::flattenSingleValue($discount); + + if (is_string($maturity = PHPExcel_Calculation_DateTime::_getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Validate + if (is_numeric($discount)) { + if ($discount <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + ++$maturity; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360; + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + } else { + $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::_getDateValue($maturity) - PHPExcel_Calculation_DateTime::_getDateValue($settlement)); + } + + if ($daysBetweenSettlementAndMaturity > 360) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $price = 100 * (1 - (($discount * $daysBetweenSettlementAndMaturity) / 360)); + if ($price <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return $price; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function TBILLPRICE() + + + /** + * TBILLYIELD + * + * Returns the yield for a Treasury bill. + * + * @param mixed settlement The Treasury bill's settlement date. + * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. + * @param mixed maturity The Treasury bill's maturity date. + * The maturity date is the date when the Treasury bill expires. + * @param int price The Treasury bill's price per $100 face value. + * @return float + */ + public static function TBILLYIELD($settlement, $maturity, $price) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + + // Validate + if (is_numeric($price)) { + if ($price <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + ++$maturity; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360; + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + } else { + $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::_getDateValue($maturity) - PHPExcel_Calculation_DateTime::_getDateValue($settlement)); + } + + if ($daysBetweenSettlementAndMaturity > 360) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return ((100 - $price) / $price) * (360 / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function TBILLYIELD() + + + public static function XIRR($values, $dates, $guess = 0.1) { + if ((!is_array($values)) && (!is_array($dates))) return PHPExcel_Calculation_Functions::VALUE(); + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $dates = PHPExcel_Calculation_Functions::flattenArray($dates); + $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess); + if (count($values) != count($dates)) return PHPExcel_Calculation_Functions::NaN(); + + // create an initial range, with a root somewhere between 0 and guess + $x1 = 0.0; + $x2 = $guess; + $f1 = self::XNPV($x1, $values, $dates); + $f2 = self::XNPV($x2, $values, $dates); + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + if (($f1 * $f2) < 0.0) break; + if (abs($f1) < abs($f2)) { + $f1 = self::XNPV($x1 += 1.6 * ($x1 - $x2), $values, $dates); + } else { + $f2 = self::XNPV($x2 += 1.6 * ($x2 - $x1), $values, $dates); + } + } + if (($f1 * $f2) > 0.0) return PHPExcel_Calculation_Functions::VALUE(); + + $f = self::XNPV($x1, $values, $dates); + if ($f < 0.0) { + $rtb = $x1; + $dx = $x2 - $x1; + } else { + $rtb = $x2; + $dx = $x1 - $x2; + } + + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + $dx *= 0.5; + $x_mid = $rtb + $dx; + $f_mid = self::XNPV($x_mid, $values, $dates); + if ($f_mid <= 0.0) $rtb = $x_mid; + if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) return $x_mid; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * XNPV + * + * Returns the net present value for a schedule of cash flows that is not necessarily periodic. + * To calculate the net present value for a series of cash flows that is periodic, use the NPV function. + * + * Excel Function: + * =XNPV(rate,values,dates) + * + * @param float $rate The discount rate to apply to the cash flows. + * @param array of float $values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value. + * @param array of mixed $dates A schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they may occur in any order. + * @return float + */ + public static function XNPV($rate, $values, $dates) { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + if (!is_numeric($rate)) return PHPExcel_Calculation_Functions::VALUE(); + if ((!is_array($values)) || (!is_array($dates))) return PHPExcel_Calculation_Functions::VALUE(); + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $dates = PHPExcel_Calculation_Functions::flattenArray($dates); + $valCount = count($values); + if ($valCount != count($dates)) return PHPExcel_Calculation_Functions::NaN(); + if ((min($values) > 0) || (max($values) < 0)) return PHPExcel_Calculation_Functions::VALUE(); + + $xnpv = 0.0; + for ($i = 0; $i < $valCount; ++$i) { + if (!is_numeric($values[$i])) return PHPExcel_Calculation_Functions::VALUE(); + $xnpv += $values[$i] / pow(1 + $rate, PHPExcel_Calculation_DateTime::DATEDIF($dates[0],$dates[$i],'d') / 365); + } + return (is_finite($xnpv)) ? $xnpv : PHPExcel_Calculation_Functions::VALUE(); + } // function XNPV() + + + /** + * YIELDDISC + * + * Returns the annual yield of a security that pays interest at maturity. + * + * @param mixed settlement The security's settlement date. + * The security's settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param int price The security's price per $100 face value. + * @param int redemption The security's redemption value per $100 face value. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function YIELDDISC($settlement, $maturity, $price, $redemption, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + $redemption = PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if (is_numeric($price) && is_numeric($redemption)) { + if (($price <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysPerYear = self::_daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement),$basis); + if (!is_numeric($daysPerYear)) { + return $daysPerYear; + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity,$basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + $daysBetweenSettlementAndMaturity *= $daysPerYear; + + return (($redemption - $price) / $price) * ($daysPerYear / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function YIELDDISC() + + + /** + * YIELDMAT + * + * Returns the annual yield of a security that pays interest at maturity. + * + * @param mixed settlement The security's settlement date. + * The security's settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed issue The security's issue date. + * @param int rate The security's interest rate at date of issue. + * @param int price The security's price per $100 face value. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function YIELDMAT($settlement, $maturity, $issue, $rate, $price, $basis=0) { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if (is_numeric($rate) && is_numeric($price)) { + if (($rate <= 0) || ($price <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysPerYear = self::_daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement),$basis); + if (!is_numeric($daysPerYear)) { + return $daysPerYear; + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + $daysBetweenIssueAndSettlement *= $daysPerYear; + $daysBetweenIssueAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $maturity, $basis); + if (!is_numeric($daysBetweenIssueAndMaturity)) { + // return date error + return $daysBetweenIssueAndMaturity; + } + $daysBetweenIssueAndMaturity *= $daysPerYear; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + $daysBetweenSettlementAndMaturity *= $daysPerYear; + + return ((1 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate) - (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) / + (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) * + ($daysPerYear / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function YIELDMAT() + +} // class PHPExcel_Calculation_Financial diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/FormulaParser.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/FormulaParser.php new file mode 100644 index 000000000..7318a5b74 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/FormulaParser.php @@ -0,0 +1,614 @@ +<"; + const OPERATORS_POSTFIX = "%"; + + /** + * Formula + * + * @var string + */ + private $_formula; + + /** + * Tokens + * + * @var PHPExcel_Calculation_FormulaToken[] + */ + private $_tokens = array(); + + /** + * Create a new PHPExcel_Calculation_FormulaParser + * + * @param string $pFormula Formula to parse + * @throws Exception + */ + public function __construct($pFormula = '') + { + // Check parameters + if (is_null($pFormula)) { + throw new Exception("Invalid parameter passed: formula"); + } + + // Initialise values + $this->_formula = trim($pFormula); + // Parse! + $this->_parseToTokens(); + } + + /** + * Get Formula + * + * @return string + */ + public function getFormula() { + return $this->_formula; + } + + /** + * Get Token + * + * @param int $pId Token id + * @return string + * @throws Exception + */ + public function getToken($pId = 0) { + if (isset($this->_tokens[$pId])) { + return $this->_tokens[$pId]; + } else { + throw new Exception("Token with id $pId does not exist."); + } + } + + /** + * Get Token count + * + * @return string + */ + public function getTokenCount() { + return count($this->_tokens); + } + + /** + * Get Tokens + * + * @return PHPExcel_Calculation_FormulaToken[] + */ + public function getTokens() { + return $this->_tokens; + } + + /** + * Parse to tokens + */ + private function _parseToTokens() { + // No attempt is made to verify formulas; assumes formulas are derived from Excel, where + // they can only exist if valid; stack overflows/underflows sunk as nulls without exceptions. + + // Check if the formula has a valid starting = + $formulaLength = strlen($this->_formula); + if ($formulaLength < 2 || $this->_formula{0} != '=') return; + + // Helper variables + $tokens1 = $tokens2 = $stack = array(); + $inString = $inPath = $inRange = $inError = false; + $token = $previousToken = $nextToken = null; + + $index = 1; + $value = ''; + + $ERRORS = array("#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A"); + $COMPARATORS_MULTI = array(">=", "<=", "<>"); + + while ($index < $formulaLength) { + // state-dependent character evaluation (order is important) + + // double-quoted strings + // embeds are doubled + // end marks token + if ($inString) { + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) { + if ((($index + 2) <= $formulaLength) && ($this->_formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE)) { + $value .= PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE; + ++$index; + } else { + $inString = false; + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_TEXT); + $value = ""; + } + } else { + $value .= $this->_formula{$index}; + } + ++$index; + continue; + } + + // single-quoted strings (links) + // embeds are double + // end does not mark a token + if ($inPath) { + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) { + if ((($index + 2) <= $formulaLength) && ($this->_formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE)) { + $value .= PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE; + ++$index; + } else { + $inPath = false; + } + } else { + $value .= $this->_formula{$index}; + } + ++$index; + continue; + } + + // bracked strings (R1C1 range index or linked workbook name) + // no embeds (changed to "()" by Excel) + // end does not mark a token + if ($inRange) { + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_CLOSE) { + $inRange = false; + } + $value .= $this->_formula{$index}; + ++$index; + continue; + } + + // error values + // end marks a token, determined from absolute list of values + if ($inError) { + $value .= $this->_formula{$index}; + ++$index; + if (in_array($value, $ERRORS)) { + $inError = false; + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_ERROR); + $value = ""; + } + continue; + } + + // scientific notation check + if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_SN, $this->_formula{$index}) !== false) { + if (strlen($value) > 1) { + if (preg_match("/^[1-9]{1}(\.[0-9]+)?E{1}$/", $this->_formula{$index}) != 0) { + $value .= $this->_formula{$index}; + ++$index; + continue; + } + } + } + + // independent character evaluation (order not important) + + // establish state-dependent character evaluations + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) { + if (strlen($value > 0)) { // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + $inString = true; + ++$index; + continue; + } + + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) { + if (strlen($value) > 0) { // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + $inPath = true; + ++$index; + continue; + } + + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_OPEN) { + $inRange = true; + $value .= PHPExcel_Calculation_FormulaParser::BRACKET_OPEN; + ++$index; + continue; + } + + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::ERROR_START) { + if (strlen($value) > 0) { // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + $inError = true; + $value .= PHPExcel_Calculation_FormulaParser::ERROR_START; + ++$index; + continue; + } + + // mark start and end of arrays and array rows + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_OPEN) { + if (strlen($value) > 0) { // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + + $tmp = new PHPExcel_Calculation_FormulaToken("ARRAY", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + + $tmp = new PHPExcel_Calculation_FormulaToken("ARRAYROW", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + + ++$index; + continue; + } + + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::SEMICOLON) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + $tmp = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT); + $tokens1[] = $tmp; + + $tmp = new PHPExcel_Calculation_FormulaToken("ARRAYROW", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + + ++$index; + continue; + } + + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_CLOSE) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + ++$index; + continue; + } + + // trim white-space + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken("", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE); + ++$index; + while (($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) && ($index < $formulaLength)) { + ++$index; + } + continue; + } + + // multi-character comparators + if (($index + 2) <= $formulaLength) { + if (in_array(substr($this->_formula, $index, 2), $COMPARATORS_MULTI)) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken(substr($this->_formula, $index, 2), PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL); + $index += 2; + continue; + } + } + + // standard infix operators + if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_INFIX, $this->_formula{$index}) !== false) { + if (strlen($value) > 0) { + $tokens1[] =new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken($this->_formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX); + ++$index; + continue; + } + + // standard postfix operators (only one) + if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_POSTFIX, $this->_formula{$index}) !== false) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken($this->_formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX); + ++$index; + continue; + } + + // start subexpression or function + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_OPEN) { + if (strlen($value) > 0) { + $tmp = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + $value = ""; + } else { + $tmp = new PHPExcel_Calculation_FormulaToken("", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + } + ++$index; + continue; + } + + // function, subexpression, or array parameters, or operand unions + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::COMMA) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $stack[] = $tmp; + + if ($tmp->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_UNION); + } else { + $tokens1[] = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT); + } + ++$index; + continue; + } + + // stop subexpression + if ($this->_formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_CLOSE) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + ++$index; + continue; + } + + // token accumulation + $value .= $this->_formula{$index}; + ++$index; + } + + // dump remaining accumulation + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + } + + // move tokenList to new set, excluding unnecessary white-space tokens and converting necessary ones to intersections + $tokenCount = count($tokens1); + for ($i = 0; $i < $tokenCount; ++$i) { + $token = $tokens1[$i]; + if (isset($tokens1[$i - 1])) { + $previousToken = $tokens1[$i - 1]; + } else { + $previousToken = null; + } + if (isset($tokens1[$i + 1])) { + $nextToken = $tokens1[$i + 1]; + } else { + $nextToken = null; + } + + if (is_null($token)) { + continue; + } + + if ($token->getTokenType() != PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE) { + $tokens2[] = $token; + continue; + } + + if (is_null($previousToken)) { + continue; + } + + if (! ( + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND) + ) ) { + continue; + } + + if (is_null($nextToken)) { + continue; + } + + if (! ( + (($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) || + (($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) || + ($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND) + ) ) { + continue; + } + + $tokens2[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_INTERSECTION); + } + + // move tokens to final list, switching infix "-" operators to prefix when appropriate, switching infix "+" operators + // to noop when appropriate, identifying operand and infix-operator subtypes, and pulling "@" from function names + $this->_tokens = array(); + + $tokenCount = count($tokens2); + for ($i = 0; $i < $tokenCount; ++$i) { + $token = $tokens2[$i]; + if (isset($tokens2[$i - 1])) { + $previousToken = $tokens2[$i - 1]; + } else { + $previousToken = null; + } + if (isset($tokens2[$i + 1])) { + $nextToken = $tokens2[$i + 1]; + } else { + $nextToken = null; + } + + if (is_null($token)) { + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == "-") { + if ($i == 0) { + $token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX); + } else if ( + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND) + ) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH); + } else { + $token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX); + } + + $this->_tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == "+") { + if ($i == 0) { + continue; + } else if ( + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND) + ) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH); + } else { + continue; + } + + $this->_tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) { + if (strpos("<>=", substr($token->getValue(), 0, 1)) !== false) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL); + } else if ($token->getValue() == "&") { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_CONCATENATION); + } else { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH); + } + + $this->_tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND && $token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) { + if (!is_numeric($token->getValue())) { + if (strtoupper($token->getValue()) == "TRUE" || strtoupper($token->getValue() == "FALSE")) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL); + } else { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_RANGE); + } + } else { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NUMBER); + } + + $this->_tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) { + if (strlen($token->getValue() > 0)) { + if (substr($token->getValue(), 0, 1) == "@") { + $token->setValue(substr($token->getValue(), 1)); + } + } + } + + $this->_tokens[] = $token; + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/FormulaToken.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/FormulaToken.php new file mode 100644 index 000000000..b8a2571ae --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/FormulaToken.php @@ -0,0 +1,176 @@ +_value = $pValue; + $this->_tokenType = $pTokenType; + $this->_tokenSubType = $pTokenSubType; + } + + /** + * Get Value + * + * @return string + */ + public function getValue() { + return $this->_value; + } + + /** + * Set Value + * + * @param string $value + */ + public function setValue($value) { + $this->_value = $value; + } + + /** + * Get Token Type (represented by TOKEN_TYPE_*) + * + * @return string + */ + public function getTokenType() { + return $this->_tokenType; + } + + /** + * Set Token Type + * + * @param string $value + */ + public function setTokenType($value = PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN) { + $this->_tokenType = $value; + } + + /** + * Get Token SubType (represented by TOKEN_SUBTYPE_*) + * + * @return string + */ + public function getTokenSubType() { + return $this->_tokenSubType; + } + + /** + * Set Token SubType + * + * @param string $value + */ + public function setTokenSubType($value = PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) { + $this->_tokenSubType = $value; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Function.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Function.php new file mode 100644 index 000000000..88f8c3b54 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Function.php @@ -0,0 +1,149 @@ +_category = $pCategory; + $this->_excelName = $pExcelName; + $this->_phpExcelName = $pPHPExcelName; + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Get Category (represented by CATEGORY_*) + * + * @return string + */ + public function getCategory() { + return $this->_category; + } + + /** + * Set Category (represented by CATEGORY_*) + * + * @param string $value + * @throws Exception + */ + public function setCategory($value = null) { + if (!is_null($value)) { + $this->_category = $value; + } else { + throw new Exception("Invalid parameter passed."); + } + } + + /** + * Get Excel name + * + * @return string + */ + public function getExcelName() { + return $this->_excelName; + } + + /** + * Set Excel name + * + * @param string $value + */ + public function setExcelName($value) { + $this->_excelName = $value; + } + + /** + * Get PHPExcel name + * + * @return string + */ + public function getPHPExcelName() { + return $this->_phpExcelName; + } + + /** + * Set PHPExcel name + * + * @param string $value + */ + public function setPHPExcelName($value) { + $this->_phpExcelName = $value; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Functions.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Functions.php new file mode 100644 index 000000000..e0a562955 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Functions.php @@ -0,0 +1,813 @@ + '#NULL!', + 'divisionbyzero' => '#DIV/0!', + 'value' => '#VALUE!', + 'reference' => '#REF!', + 'name' => '#NAME?', + 'num' => '#NUM!', + 'na' => '#N/A', + 'gettingdata' => '#GETTING_DATA' + ); + + + /** + * Set the Compatibility Mode + * + * @access public + * @category Function Configuration + * @param string $compatibilityMode Compatibility Mode + * Permitted values are: + * PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL 'Excel' + * PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC 'Gnumeric' + * PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc' + * @return boolean (Success or Failure) + */ + public static function setCompatibilityMode($compatibilityMode) { + if (($compatibilityMode == self::COMPATIBILITY_EXCEL) || + ($compatibilityMode == self::COMPATIBILITY_GNUMERIC) || + ($compatibilityMode == self::COMPATIBILITY_OPENOFFICE)) { + self::$compatibilityMode = $compatibilityMode; + return True; + } + return False; + } // function setCompatibilityMode() + + + /** + * Return the current Compatibility Mode + * + * @access public + * @category Function Configuration + * @return string Compatibility Mode + * Possible Return values are: + * PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL 'Excel' + * PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC 'Gnumeric' + * PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc' + */ + public static function getCompatibilityMode() { + return self::$compatibilityMode; + } // function getCompatibilityMode() + + + /** + * Set the Return Date Format used by functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object) + * + * @access public + * @category Function Configuration + * @param string $returnDateType Return Date Format + * Permitted values are: + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC 'P' + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT 'O' + * PHPExcel_Calculation_Functions::RETURNDATE_EXCEL 'E' + * @return boolean Success or failure + */ + public static function setReturnDateType($returnDateType) { + if (($returnDateType == self::RETURNDATE_PHP_NUMERIC) || + ($returnDateType == self::RETURNDATE_PHP_OBJECT) || + ($returnDateType == self::RETURNDATE_EXCEL)) { + self::$ReturnDateType = $returnDateType; + return True; + } + return False; + } // function setReturnDateType() + + + /** + * Return the current Return Date Format for functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object) + * + * @access public + * @category Function Configuration + * @return string Return Date Format + * Possible Return values are: + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC 'P' + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT 'O' + * PHPExcel_Calculation_Functions::RETURNDATE_EXCEL 'E' + */ + public static function getReturnDateType() { + return self::$ReturnDateType; + } // function getReturnDateType() + + + /** + * DUMMY + * + * @access public + * @category Error Returns + * @return string #Not Yet Implemented + */ + public static function DUMMY() { + return '#Not Yet Implemented'; + } // function DUMMY() + + + /** + * DIV0 + * + * @access public + * @category Error Returns + * @return string #Not Yet Implemented + */ + public static function DIV0() { + return self::$_errorCodes['divisionbyzero']; + } // function DIV0() + + + /** + * NA + * + * Excel Function: + * =NA() + * + * Returns the error value #N/A + * #N/A is the error value that means "no value is available." + * + * @access public + * @category Logical Functions + * @return string #N/A! + */ + public static function NA() { + return self::$_errorCodes['na']; + } // function NA() + + + /** + * NaN + * + * Returns the error value #NUM! + * + * @access public + * @category Error Returns + * @return string #NUM! + */ + public static function NaN() { + return self::$_errorCodes['num']; + } // function NaN() + + + /** + * NAME + * + * Returns the error value #NAME? + * + * @access public + * @category Error Returns + * @return string #NAME? + */ + public static function NAME() { + return self::$_errorCodes['name']; + } // function NAME() + + + /** + * REF + * + * Returns the error value #REF! + * + * @access public + * @category Error Returns + * @return string #REF! + */ + public static function REF() { + return self::$_errorCodes['reference']; + } // function REF() + + + /** + * NULL + * + * Returns the error value #NULL! + * + * @access public + * @category Error Returns + * @return string #REF! + */ + public static function NULL() { + return self::$_errorCodes['null']; + } // function NULL() + + + /** + * VALUE + * + * Returns the error value #VALUE! + * + * @access public + * @category Error Returns + * @return string #VALUE! + */ + public static function VALUE() { + return self::$_errorCodes['value']; + } // function VALUE() + + + public static function isMatrixValue($idx) { + return ((substr_count($idx,'.') <= 1) || (preg_match('/\.[A-Z]/',$idx) > 0)); + } + + + public static function isValue($idx) { + return (substr_count($idx,'.') == 0); + } + + + public static function isCellValue($idx) { + return (substr_count($idx,'.') > 1); + } + + + public static function _ifCondition($condition) { + $condition = PHPExcel_Calculation_Functions::flattenSingleValue($condition); + if (!in_array($condition{0},array('>', '<', '='))) { + if (!is_numeric($condition)) { $condition = PHPExcel_Calculation::_wrapResult(strtoupper($condition)); } + return '='.$condition; + } else { + preg_match('/([<>=]+)(.*)/',$condition,$matches); + list(,$operator,$operand) = $matches; + if (!is_numeric($operand)) { $operand = PHPExcel_Calculation::_wrapResult(strtoupper($operand)); } + return $operator.$operand; + } + } // function _ifCondition() + + + /** + * ERROR_TYPE + * + * @param mixed $value Value to check + * @return boolean + */ + public static function ERROR_TYPE($value = '') { + $value = self::flattenSingleValue($value); + + $i = 1; + foreach(self::$_errorCodes as $errorCode) { + if ($value === $errorCode) { + return $i; + } + ++$i; + } + return self::NA(); + } // function ERROR_TYPE() + + + /** + * IS_BLANK + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_BLANK($value = NULL) { + if (!is_null($value)) { + $value = self::flattenSingleValue($value); + } + + return is_null($value); + } // function IS_BLANK() + + + /** + * IS_ERR + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_ERR($value = '') { + $value = self::flattenSingleValue($value); + + return self::IS_ERROR($value) && (!self::IS_NA($value)); + } // function IS_ERR() + + + /** + * IS_ERROR + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_ERROR($value = '') { + $value = self::flattenSingleValue($value); + + if (!is_string($value)) + return false; + return in_array($value, array_values(self::$_errorCodes)); + } // function IS_ERROR() + + + /** + * IS_NA + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_NA($value = '') { + $value = self::flattenSingleValue($value); + + return ($value === self::NA()); + } // function IS_NA() + + + /** + * IS_EVEN + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_EVEN($value = NULL) { + $value = self::flattenSingleValue($value); + + if ($value === NULL) + return self::NAME(); + if ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) + return self::VALUE(); + return ($value % 2 == 0); + } // function IS_EVEN() + + + /** + * IS_ODD + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_ODD($value = NULL) { + $value = self::flattenSingleValue($value); + + if ($value === NULL) + return self::NAME(); + if ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) + return self::VALUE(); + return (abs($value) % 2 == 1); + } // function IS_ODD() + + + /** + * IS_NUMBER + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_NUMBER($value = NULL) { + $value = self::flattenSingleValue($value); + + if (is_string($value)) { + return False; + } + return is_numeric($value); + } // function IS_NUMBER() + + + /** + * IS_LOGICAL + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_LOGICAL($value = NULL) { + $value = self::flattenSingleValue($value); + + return is_bool($value); + } // function IS_LOGICAL() + + + /** + * IS_TEXT + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_TEXT($value = NULL) { + $value = self::flattenSingleValue($value); + + return (is_string($value) && !self::IS_ERROR($value)); + } // function IS_TEXT() + + + /** + * IS_NONTEXT + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_NONTEXT($value = NULL) { + return !self::IS_TEXT($value); + } // function IS_NONTEXT() + + + /** + * VERSION + * + * @return string Version information + */ + public static function VERSION() { + return 'PHPExcel 1.7.8, 2012-10-12'; + } // function VERSION() + + + /** + * N + * + * Returns a value converted to a number + * + * @param value The value you want converted + * @return number N converts values listed in the following table + * If value is or refers to N returns + * A number That number + * A date The serial number of that date + * TRUE 1 + * FALSE 0 + * An error value The error value + * Anything else 0 + */ + public static function N($value = NULL) { + while (is_array($value)) { + $value = array_shift($value); + } + + switch (gettype($value)) { + case 'double' : + case 'float' : + case 'integer' : + return $value; + break; + case 'boolean' : + return (integer) $value; + break; + case 'string' : + // Errors + if ((strlen($value) > 0) && ($value{0} == '#')) { + return $value; + } + break; + } + return 0; + } // function N() + + + /** + * TYPE + * + * Returns a number that identifies the type of a value + * + * @param value The value you want tested + * @return number N converts values listed in the following table + * If value is or refers to N returns + * A number 1 + * Text 2 + * Logical Value 4 + * An error value 16 + * Array or Matrix 64 + */ + public static function TYPE($value = NULL) { + $value = self::flattenArrayIndexed($value); + if (is_array($value) && (count($value) > 1)) { + $a = array_keys($value); + $a = array_pop($a); + // Range of cells is an error + if (self::isCellValue($a)) { + return 16; + // Test for Matrix + } elseif (self::isMatrixValue($a)) { + return 64; + } + } elseif(empty($value)) { + // Empty Cell + return 1; + } + $value = self::flattenSingleValue($value); + + if (($value === NULL) || (is_float($value)) || (is_int($value))) { + return 1; + } elseif(is_bool($value)) { + return 4; + } elseif(is_array($value)) { + return 64; + break; + } elseif(is_string($value)) { + // Errors + if ((strlen($value) > 0) && ($value{0} == '#')) { + return 16; + } + return 2; + } + return 0; + } // function TYPE() + + + /** + * Convert a multi-dimensional array to a simple 1-dimensional array + * + * @param array $array Array to be flattened + * @return array Flattened array + */ + public static function flattenArray($array) { + if (!is_array($array)) { + return (array) $array; + } + + $arrayValues = array(); + foreach ($array as $value) { + if (is_array($value)) { + foreach ($value as $val) { + if (is_array($val)) { + foreach ($val as $v) { + $arrayValues[] = $v; + } + } else { + $arrayValues[] = $val; + } + } + } else { + $arrayValues[] = $value; + } + } + + return $arrayValues; + } // function flattenArray() + + + /** + * Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing + * + * @param array $array Array to be flattened + * @return array Flattened array + */ + public static function flattenArrayIndexed($array) { + if (!is_array($array)) { + return (array) $array; + } + + $arrayValues = array(); + foreach ($array as $k1 => $value) { + if (is_array($value)) { + foreach ($value as $k2 => $val) { + if (is_array($val)) { + foreach ($val as $k3 => $v) { + $arrayValues[$k1.'.'.$k2.'.'.$k3] = $v; + } + } else { + $arrayValues[$k1.'.'.$k2] = $val; + } + } + } else { + $arrayValues[$k1] = $value; + } + } + + return $arrayValues; + } // function flattenArrayIndexed() + + + /** + * Convert an array to a single scalar value by extracting the first element + * + * @param mixed $value Array or scalar value + * @return mixed + */ + public static function flattenSingleValue($value = '') { + while (is_array($value)) { + $value = array_pop($value); + } + + return $value; + } // function flattenSingleValue() + +} // class PHPExcel_Calculation_Functions + + +// +// There are a few mathematical functions that aren't available on all versions of PHP for all platforms +// These functions aren't available in Windows implementations of PHP prior to version 5.3.0 +// So we test if they do exist for this version of PHP/operating platform; and if not we create them +// +if (!function_exists('acosh')) { + function acosh($x) { + return 2 * log(sqrt(($x + 1) / 2) + sqrt(($x - 1) / 2)); + } // function acosh() +} + +if (!function_exists('asinh')) { + function asinh($x) { + return log($x + sqrt(1 + $x * $x)); + } // function asinh() +} + +if (!function_exists('atanh')) { + function atanh($x) { + return (log(1 + $x) - log(1 - $x)) / 2; + } // function atanh() +} + +if (!function_exists('money_format')) { + function money_format($format, $number) { + $regex = array( '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?(?:#([0-9]+))?', + '(?:\.([0-9]+))?([in%])/' + ); + $regex = implode('', $regex); + if (setlocale(LC_MONETARY, null) == '') { + setlocale(LC_MONETARY, ''); + } + $locale = localeconv(); + $number = floatval($number); + if (!preg_match($regex, $format, $fmatch)) { + trigger_error("No format specified or invalid format", E_USER_WARNING); + return $number; + } + $flags = array( 'fillchar' => preg_match('/\=(.)/', $fmatch[1], $match) ? $match[1] : ' ', + 'nogroup' => preg_match('/\^/', $fmatch[1]) > 0, + 'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ? $match[0] : '+', + 'nosimbol' => preg_match('/\!/', $fmatch[1]) > 0, + 'isleft' => preg_match('/\-/', $fmatch[1]) > 0 + ); + $width = trim($fmatch[2]) ? (int)$fmatch[2] : 0; + $left = trim($fmatch[3]) ? (int)$fmatch[3] : 0; + $right = trim($fmatch[4]) ? (int)$fmatch[4] : $locale['int_frac_digits']; + $conversion = $fmatch[5]; + $positive = true; + if ($number < 0) { + $positive = false; + $number *= -1; + } + $letter = $positive ? 'p' : 'n'; + $prefix = $suffix = $cprefix = $csuffix = $signal = ''; + if (!$positive) { + $signal = $locale['negative_sign']; + switch (true) { + case $locale['n_sign_posn'] == 0 || $flags['usesignal'] == '(': + $prefix = '('; + $suffix = ')'; + break; + case $locale['n_sign_posn'] == 1: + $prefix = $signal; + break; + case $locale['n_sign_posn'] == 2: + $suffix = $signal; + break; + case $locale['n_sign_posn'] == 3: + $cprefix = $signal; + break; + case $locale['n_sign_posn'] == 4: + $csuffix = $signal; + break; + } + } + if (!$flags['nosimbol']) { + $currency = $cprefix; + $currency .= ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']); + $currency .= $csuffix; + $currency = iconv('ISO-8859-1','UTF-8',$currency); + } else { + $currency = ''; + } + $space = $locale["{$letter}_sep_by_space"] ? ' ' : ''; + + if (!isset($locale['mon_decimal_point']) || empty($locale['mon_decimal_point'])) { + $locale['mon_decimal_point'] = (!isset($locale['decimal_point']) || empty($locale['decimal_point'])) ? + $locale['decimal_point'] : + '.'; + } + + $number = number_format($number, $right, $locale['mon_decimal_point'], $flags['nogroup'] ? '' : $locale['mon_thousands_sep'] ); + $number = explode($locale['mon_decimal_point'], $number); + + $n = strlen($prefix) + strlen($currency); + if ($left > 0 && $left > $n) { + if ($flags['isleft']) { + $number[0] .= str_repeat($flags['fillchar'], $left - $n); + } else { + $number[0] = str_repeat($flags['fillchar'], $left - $n) . $number[0]; + } + } + $number = implode($locale['mon_decimal_point'], $number); + if ($locale["{$letter}_cs_precedes"]) { + $number = $prefix . $currency . $space . $number . $suffix; + } else { + $number = $prefix . $number . $space . $currency . $suffix; + } + if ($width > 0) { + $number = str_pad($number, $width, $flags['fillchar'], $flags['isleft'] ? STR_PAD_RIGHT : STR_PAD_LEFT); + } + $format = str_replace($fmatch[0], $number, $format); + return $format; + } // function money_format() +} + + +// +// Strangely, PHP doesn't have a mb_str_replace multibyte function +// As we'll only ever use this function with UTF-8 characters, we can simply "hard-code" the character set +// +if ((!function_exists('mb_str_replace')) && + (function_exists('mb_substr')) && (function_exists('mb_strlen')) && (function_exists('mb_strpos'))) { + function mb_str_replace($search, $replace, $subject) { + if(is_array($subject)) { + $ret = array(); + foreach($subject as $key => $val) { + $ret[$key] = mb_str_replace($search, $replace, $val); + } + return $ret; + } + + foreach((array) $search as $key => $s) { + if($s == '') { + continue; + } + $r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : ''); + $pos = mb_strpos($subject, $s, 0, 'UTF-8'); + while($pos !== false) { + $subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8'); + $pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8'); + } + } + return $subject; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Logical.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Logical.php new file mode 100644 index 000000000..80f2a2650 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Logical.php @@ -0,0 +1,288 @@ + $arg) { + // Is it a boolean value? + if (is_bool($arg)) { + $returnValue = $returnValue && $arg; + } elseif ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue = $returnValue && ($arg != 0); + } elseif (is_string($arg)) { + $arg = strtoupper($arg); + if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) { + $arg = TRUE; + } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) { + $arg = FALSE; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $returnValue = $returnValue && ($arg != 0); + } + } + + // Return + if ($argCount < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + return $returnValue; + } // function LOGICAL_AND() + + + /** + * LOGICAL_OR + * + * Returns boolean TRUE if any argument is TRUE; returns FALSE if all arguments are FALSE. + * + * Excel Function: + * =OR(logical1[,logical2[, ...]]) + * + * The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays + * or references that contain logical values. + * + * Boolean arguments are treated as True or False as appropriate + * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False + * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds + * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value + * + * @access public + * @category Logical Functions + * @param mixed $arg,... Data values + * @return boolean The logical OR of the arguments. + */ + public static function LOGICAL_OR() { + // Return value + $returnValue = FALSE; + + // Loop through the arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $argCount = -1; + foreach ($aArgs as $argCount => $arg) { + // Is it a boolean value? + if (is_bool($arg)) { + $returnValue = $returnValue || $arg; + } elseif ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue = $returnValue || ($arg != 0); + } elseif (is_string($arg)) { + $arg = strtoupper($arg); + if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) { + $arg = TRUE; + } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) { + $arg = FALSE; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $returnValue = $returnValue || ($arg != 0); + } + } + + // Return + if ($argCount < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + return $returnValue; + } // function LOGICAL_OR() + + + /** + * NOT + * + * Returns the boolean inverse of the argument. + * + * Excel Function: + * =NOT(logical) + * + * The argument must evaluate to a logical value such as TRUE or FALSE + * + * Boolean arguments are treated as True or False as appropriate + * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False + * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds + * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value + * + * @access public + * @category Logical Functions + * @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE + * @return boolean The boolean inverse of the argument. + */ + public static function NOT($logical=FALSE) { + $logical = PHPExcel_Calculation_Functions::flattenSingleValue($logical); + if (is_string($logical)) { + $logical = strtoupper($logical); + if (($logical == 'TRUE') || ($logical == PHPExcel_Calculation::getTRUE())) { + return FALSE; + } elseif (($logical == 'FALSE') || ($logical == PHPExcel_Calculation::getFALSE())) { + return TRUE; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + return !$logical; + } // function NOT() + + /** + * STATEMENT_IF + * + * Returns one value if a condition you specify evaluates to TRUE and another value if it evaluates to FALSE. + * + * Excel Function: + * =IF(condition[,returnIfTrue[,returnIfFalse]]) + * + * Condition is any value or expression that can be evaluated to TRUE or FALSE. + * For example, A10=100 is a logical expression; if the value in cell A10 is equal to 100, + * the expression evaluates to TRUE. Otherwise, the expression evaluates to FALSE. + * This argument can use any comparison calculation operator. + * ReturnIfTrue is the value that is returned if condition evaluates to TRUE. + * For example, if this argument is the text string "Within budget" and the condition argument evaluates to TRUE, + * then the IF function returns the text "Within budget" + * If condition is TRUE and ReturnIfTrue is blank, this argument returns 0 (zero). To display the word TRUE, use + * the logical value TRUE for this argument. + * ReturnIfTrue can be another formula. + * ReturnIfFalse is the value that is returned if condition evaluates to FALSE. + * For example, if this argument is the text string "Over budget" and the condition argument evaluates to FALSE, + * then the IF function returns the text "Over budget". + * If condition is FALSE and ReturnIfFalse is omitted, then the logical value FALSE is returned. + * If condition is FALSE and ReturnIfFalse is blank, then the value 0 (zero) is returned. + * ReturnIfFalse can be another formula. + * + * @access public + * @category Logical Functions + * @param mixed $condition Condition to evaluate + * @param mixed $returnIfTrue Value to return when condition is true + * @param mixed $returnIfFalse Optional value to return when condition is false + * @return mixed The value of returnIfTrue or returnIfFalse determined by condition + */ + public static function STATEMENT_IF($condition = TRUE, $returnIfTrue = 0, $returnIfFalse = FALSE) { + $condition = (is_null($condition)) ? TRUE : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($condition); + $returnIfTrue = (is_null($returnIfTrue)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfTrue); + $returnIfFalse = (is_null($returnIfFalse)) ? FALSE : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfFalse); + + return ($condition) ? $returnIfTrue : $returnIfFalse; + } // function STATEMENT_IF() + + + /** + * IFERROR + * + * Excel Function: + * =IFERROR(testValue,errorpart) + * + * @access public + * @category Logical Functions + * @param mixed $testValue Value to check, is also the value returned when no error + * @param mixed $errorpart Value to return when testValue is an error condition + * @return mixed The value of errorpart or testValue determined by error condition + */ + public static function IFERROR($testValue = '', $errorpart = '') { + $testValue = (is_null($testValue)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($testValue); + $errorpart = (is_null($errorpart)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($errorpart); + + return self::STATEMENT_IF(PHPExcel_Calculation_Functions::IS_ERROR($testValue), $errorpart, $testValue); + } // function IFERROR() + +} // class PHPExcel_Calculation_Logical diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/LookupRef.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/LookupRef.php new file mode 100644 index 000000000..c8246903f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/LookupRef.php @@ -0,0 +1,808 @@ + '') { + if (strpos($sheetText,' ') !== False) { $sheetText = "'".$sheetText."'"; } + $sheetText .='!'; + } + if ((!is_bool($referenceStyle)) || $referenceStyle) { + $rowRelative = $columnRelative = '$'; + $column = PHPExcel_Cell::stringFromColumnIndex($column-1); + if (($relativity == 2) || ($relativity == 4)) { $columnRelative = ''; } + if (($relativity == 3) || ($relativity == 4)) { $rowRelative = ''; } + return $sheetText.$columnRelative.$column.$rowRelative.$row; + } else { + if (($relativity == 2) || ($relativity == 4)) { $column = '['.$column.']'; } + if (($relativity == 3) || ($relativity == 4)) { $row = '['.$row.']'; } + return $sheetText.'R'.$row.'C'.$column; + } + } // function CELL_ADDRESS() + + + /** + * COLUMN + * + * Returns the column number of the given cell reference + * If the cell reference is a range of cells, COLUMN returns the column numbers of each column in the reference as a horizontal array. + * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the + * reference of the cell in which the COLUMN function appears; otherwise this function returns 0. + * + * Excel Function: + * =COLUMN([cellAddress]) + * + * @param cellAddress A reference to a range of cells for which you want the column numbers + * @return integer or array of integer + */ + public static function COLUMN($cellAddress=Null) { + if (is_null($cellAddress) || trim($cellAddress) === '') { return 0; } + + if (is_array($cellAddress)) { + foreach($cellAddress as $columnKey => $value) { + $columnKey = preg_replace('/[^a-z]/i','',$columnKey); + return (integer) PHPExcel_Cell::columnIndexFromString($columnKey); + } + } else { + if (strpos($cellAddress,'!') !== false) { + list($sheet,$cellAddress) = explode('!',$cellAddress); + } + if (strpos($cellAddress,':') !== false) { + list($startAddress,$endAddress) = explode(':',$cellAddress); + $startAddress = preg_replace('/[^a-z]/i','',$startAddress); + $endAddress = preg_replace('/[^a-z]/i','',$endAddress); + $returnValue = array(); + do { + $returnValue[] = (integer) PHPExcel_Cell::columnIndexFromString($startAddress); + } while ($startAddress++ != $endAddress); + return $returnValue; + } else { + $cellAddress = preg_replace('/[^a-z]/i','',$cellAddress); + return (integer) PHPExcel_Cell::columnIndexFromString($cellAddress); + } + } + } // function COLUMN() + + + /** + * COLUMNS + * + * Returns the number of columns in an array or reference. + * + * Excel Function: + * =COLUMNS(cellAddress) + * + * @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of columns + * @return integer The number of columns in cellAddress + */ + public static function COLUMNS($cellAddress=Null) { + if (is_null($cellAddress) || $cellAddress === '') { + return 1; + } elseif (!is_array($cellAddress)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $x = array_keys($cellAddress); + $x = array_shift($x); + $isMatrix = (is_numeric($x)); + list($columns,$rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress); + + if ($isMatrix) { + return $rows; + } else { + return $columns; + } + } // function COLUMNS() + + + /** + * ROW + * + * Returns the row number of the given cell reference + * If the cell reference is a range of cells, ROW returns the row numbers of each row in the reference as a vertical array. + * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the + * reference of the cell in which the ROW function appears; otherwise this function returns 0. + * + * Excel Function: + * =ROW([cellAddress]) + * + * @param cellAddress A reference to a range of cells for which you want the row numbers + * @return integer or array of integer + */ + public static function ROW($cellAddress=Null) { + if (is_null($cellAddress) || trim($cellAddress) === '') { return 0; } + + if (is_array($cellAddress)) { + foreach($cellAddress as $columnKey => $rowValue) { + foreach($rowValue as $rowKey => $cellValue) { + return (integer) preg_replace('/[^0-9]/i','',$rowKey); + } + } + } else { + if (strpos($cellAddress,'!') !== false) { + list($sheet,$cellAddress) = explode('!',$cellAddress); + } + if (strpos($cellAddress,':') !== false) { + list($startAddress,$endAddress) = explode(':',$cellAddress); + $startAddress = preg_replace('/[^0-9]/','',$startAddress); + $endAddress = preg_replace('/[^0-9]/','',$endAddress); + $returnValue = array(); + do { + $returnValue[][] = (integer) $startAddress; + } while ($startAddress++ != $endAddress); + return $returnValue; + } else { + list($cellAddress) = explode(':',$cellAddress); + return (integer) preg_replace('/[^0-9]/','',$cellAddress); + } + } + } // function ROW() + + + /** + * ROWS + * + * Returns the number of rows in an array or reference. + * + * Excel Function: + * =ROWS(cellAddress) + * + * @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of rows + * @return integer The number of rows in cellAddress + */ + public static function ROWS($cellAddress=Null) { + if (is_null($cellAddress) || $cellAddress === '') { + return 1; + } elseif (!is_array($cellAddress)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $i = array_keys($cellAddress); + $isMatrix = (is_numeric(array_shift($i))); + list($columns,$rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress); + + if ($isMatrix) { + return $columns; + } else { + return $rows; + } + } // function ROWS() + + + /** + * HYPERLINK + * + * Excel Function: + * =HYPERLINK(linkURL,displayName) + * + * @access public + * @category Logical Functions + * @param string $linkURL Value to check, is also the value returned when no error + * @param string $displayName Value to return when testValue is an error condition + * @return mixed The value of $displayName (or $linkURL if $displayName was blank) + */ + public static function HYPERLINK($linkURL = '', $displayName = null, PHPExcel_Cell $pCell = null) { + $args = func_get_args(); + $pCell = array_pop($args); + + $linkURL = (is_null($linkURL)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($linkURL); + $displayName = (is_null($displayName)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($displayName); + + if ((!is_object($pCell)) || (trim($linkURL) == '')) { + return PHPExcel_Calculation_Functions::REF(); + } + + if ((is_object($displayName)) || trim($displayName) == '') { + $displayName = $linkURL; + } + + $pCell->getHyperlink()->setUrl($linkURL); + + return $displayName; + } // function HYPERLINK() + + + /** + * INDIRECT + * + * Returns the reference specified by a text string. + * References are immediately evaluated to display their contents. + * + * Excel Function: + * =INDIRECT(cellAddress) + * + * NOTE - INDIRECT() does not yet support the optional a1 parameter introduced in Excel 2010 + * + * @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of rows + * @return mixed The cells referenced by cellAddress + * + * @todo Support for the optional a1 parameter introduced in Excel 2010 + * + */ + public static function INDIRECT($cellAddress=Null, PHPExcel_Cell $pCell = null) { + $cellAddress = PHPExcel_Calculation_Functions::flattenSingleValue($cellAddress); + if (is_null($cellAddress) || $cellAddress === '') { + return PHPExcel_Calculation_Functions::REF(); + } + + $cellAddress1 = $cellAddress; + $cellAddress2 = NULL; + if (strpos($cellAddress,':') !== false) { + list($cellAddress1,$cellAddress2) = explode(':',$cellAddress); + } + + if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress1, $matches)) || + ((!is_null($cellAddress2)) && (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress2, $matches)))) { + + if (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $cellAddress1, $matches)) { + return PHPExcel_Calculation_Functions::REF(); + } + + if (strpos($cellAddress,'!') !== false) { + list($sheetName,$cellAddress) = explode('!',$cellAddress); + $pSheet = $pCell->getParent()->getParent()->getSheetByName($sheetName); + } else { + $pSheet = $pCell->getParent(); + } + + return PHPExcel_Calculation::getInstance()->extractNamedRange($cellAddress, $pSheet, False); + } + + if (strpos($cellAddress,'!') !== false) { + list($sheetName,$cellAddress) = explode('!',$cellAddress); + $pSheet = $pCell->getParent()->getParent()->getSheetByName($sheetName); + } else { + $pSheet = $pCell->getParent(); + } + + return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, False); + } // function INDIRECT() + + + /** + * OFFSET + * + * Returns a reference to a range that is a specified number of rows and columns from a cell or range of cells. + * The reference that is returned can be a single cell or a range of cells. You can specify the number of rows and + * the number of columns to be returned. + * + * Excel Function: + * =OFFSET(cellAddress, rows, cols, [height], [width]) + * + * @param cellAddress The reference from which you want to base the offset. Reference must refer to a cell or + * range of adjacent cells; otherwise, OFFSET returns the #VALUE! error value. + * @param rows The number of rows, up or down, that you want the upper-left cell to refer to. + * Using 5 as the rows argument specifies that the upper-left cell in the reference is + * five rows below reference. Rows can be positive (which means below the starting reference) + * or negative (which means above the starting reference). + * @param cols The number of columns, to the left or right, that you want the upper-left cell of the result + * to refer to. Using 5 as the cols argument specifies that the upper-left cell in the + * reference is five columns to the right of reference. Cols can be positive (which means + * to the right of the starting reference) or negative (which means to the left of the + * starting reference). + * @param height The height, in number of rows, that you want the returned reference to be. Height must be a positive number. + * @param width The width, in number of columns, that you want the returned reference to be. Width must be a positive number. + * @return string A reference to a cell or range of cells + */ + public static function OFFSET($cellAddress=Null,$rows=0,$columns=0,$height=null,$width=null) { + $rows = PHPExcel_Calculation_Functions::flattenSingleValue($rows); + $columns = PHPExcel_Calculation_Functions::flattenSingleValue($columns); + $height = PHPExcel_Calculation_Functions::flattenSingleValue($height); + $width = PHPExcel_Calculation_Functions::flattenSingleValue($width); + if ($cellAddress == Null) { + return 0; + } + + $args = func_get_args(); + $pCell = array_pop($args); + if (!is_object($pCell)) { + return PHPExcel_Calculation_Functions::REF(); + } + + $sheetName = null; + if (strpos($cellAddress,"!")) { + list($sheetName,$cellAddress) = explode("!",$cellAddress); + } + if (strpos($cellAddress,":")) { + list($startCell,$endCell) = explode(":",$cellAddress); + } else { + $startCell = $endCell = $cellAddress; + } + list($startCellColumn,$startCellRow) = PHPExcel_Cell::coordinateFromString($startCell); + list($endCellColumn,$endCellRow) = PHPExcel_Cell::coordinateFromString($endCell); + + $startCellRow += $rows; + $startCellColumn = PHPExcel_Cell::columnIndexFromString($startCellColumn) - 1; + $startCellColumn += $columns; + + if (($startCellRow <= 0) || ($startCellColumn < 0)) { + return PHPExcel_Calculation_Functions::REF(); + } + $endCellColumn = PHPExcel_Cell::columnIndexFromString($endCellColumn) - 1; + if (($width != null) && (!is_object($width))) { + $endCellColumn = $startCellColumn + $width - 1; + } else { + $endCellColumn += $columns; + } + $startCellColumn = PHPExcel_Cell::stringFromColumnIndex($startCellColumn); + + if (($height != null) && (!is_object($height))) { + $endCellRow = $startCellRow + $height - 1; + } else { + $endCellRow += $rows; + } + + if (($endCellRow <= 0) || ($endCellColumn < 0)) { + return PHPExcel_Calculation_Functions::REF(); + } + $endCellColumn = PHPExcel_Cell::stringFromColumnIndex($endCellColumn); + + $cellAddress = $startCellColumn.$startCellRow; + if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) { + $cellAddress .= ':'.$endCellColumn.$endCellRow; + } + + if ($sheetName !== null) { + $pSheet = $pCell->getParent()->getParent()->getSheetByName($sheetName); + } else { + $pSheet = $pCell->getParent(); + } + + return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, False); + } // function OFFSET() + + + /** + * CHOOSE + * + * Uses lookup_value to return a value from the list of value arguments. + * Use CHOOSE to select one of up to 254 values based on the lookup_value. + * + * Excel Function: + * =CHOOSE(index_num, value1, [value2], ...) + * + * @param index_num Specifies which value argument is selected. + * Index_num must be a number between 1 and 254, or a formula or reference to a cell containing a number + * between 1 and 254. + * @param value1... Value1 is required, subsequent values are optional. + * Between 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on + * index_num. The arguments can be numbers, cell references, defined names, formulas, functions, or + * text. + * @return mixed The selected value + */ + public static function CHOOSE() { + $chooseArgs = func_get_args(); + $chosenEntry = PHPExcel_Calculation_Functions::flattenArray(array_shift($chooseArgs)); + $entryCount = count($chooseArgs) - 1; + + if(is_array($chosenEntry)) { + $chosenEntry = array_shift($chosenEntry); + } + if ((is_numeric($chosenEntry)) && (!is_bool($chosenEntry))) { + --$chosenEntry; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $chosenEntry = floor($chosenEntry); + if (($chosenEntry <= 0) || ($chosenEntry > $entryCount)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_array($chooseArgs[$chosenEntry])) { + return PHPExcel_Calculation_Functions::flattenArray($chooseArgs[$chosenEntry]); + } else { + return $chooseArgs[$chosenEntry]; + } + } // function CHOOSE() + + + /** + * MATCH + * + * The MATCH function searches for a specified item in a range of cells + * + * Excel Function: + * =MATCH(lookup_value, lookup_array, [match_type]) + * + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_array The range of cells being searched + * @param match_type The number -1, 0, or 1. -1 means above, 0 means exact match, 1 means below. If match_type is 1 or -1, the list has to be ordered. + * @return integer The relative position of the found item + */ + public static function MATCH($lookup_value, $lookup_array, $match_type=1) { + $lookup_array = PHPExcel_Calculation_Functions::flattenArray($lookup_array); + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + $match_type = (is_null($match_type)) ? 1 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($match_type); + // MATCH is not case sensitive + $lookup_value = strtolower($lookup_value); + + // lookup_value type has to be number, text, or logical values + if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) { + return PHPExcel_Calculation_Functions::NA(); + } + + // match_type is 0, 1 or -1 + if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) { + return PHPExcel_Calculation_Functions::NA(); + } + + // lookup_array should not be empty + $lookupArraySize = count($lookup_array); + if ($lookupArraySize <= 0) { + return PHPExcel_Calculation_Functions::NA(); + } + + // lookup_array should contain only number, text, or logical values, or empty (null) cells + foreach($lookup_array as $i => $lookupArrayValue) { + // check the type of the value + if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) && + (!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) { + return PHPExcel_Calculation_Functions::NA(); + } + // convert strings to lowercase for case-insensitive testing + if (is_string($lookupArrayValue)) { + $lookup_array[$i] = strtolower($lookupArrayValue); + } + if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) { + $lookup_array = array_slice($lookup_array,0,$i-1); + } + } + + // if match_type is 1 or -1, the list has to be ordered + if ($match_type == 1) { + asort($lookup_array); + $keySet = array_keys($lookup_array); + } elseif($match_type == -1) { + arsort($lookup_array); + $keySet = array_keys($lookup_array); + } + + // ** + // find the match + // ** + // loop on the cells +// var_dump($lookup_array); +// echo '
        '; + foreach($lookup_array as $i => $lookupArrayValue) { + if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) { + // exact match + return ++$i; + } elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) { +// echo '$i = '.$i.' => '; +// var_dump($lookupArrayValue); +// echo '
        '; +// echo 'Keyset = '; +// var_dump($keySet); +// echo '
        '; + $i = array_search($i,$keySet); +// echo '$i='.$i.'
        '; + // if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value + if ($i < 1){ + // 1st cell was allready smaller than the lookup_value + break; + } else { + // the previous cell was the match + return $keySet[$i-1]+1; + } + } elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) { +// echo '$i = '.$i.' => '; +// var_dump($lookupArrayValue); +// echo '
        '; +// echo 'Keyset = '; +// var_dump($keySet); +// echo '
        '; + $i = array_search($i,$keySet); +// echo '$i='.$i.'
        '; + // if match_type is 1 <=> find the largest value that is less than or equal to lookup_value + if ($i < 1){ + // 1st cell was allready bigger than the lookup_value + break; + } else { + // the previous cell was the match + return $keySet[$i-1]+1; + } + } + } + + // unsuccessful in finding a match, return #N/A error value + return PHPExcel_Calculation_Functions::NA(); + } // function MATCH() + + + /** + * INDEX + * + * Uses an index to choose a value from a reference or array + * + * Excel Function: + * =INDEX(range_array, row_num, [column_num]) + * + * @param range_array A range of cells or an array constant + * @param row_num The row in array from which to return a value. If row_num is omitted, column_num is required. + * @param column_num The column in array from which to return a value. If column_num is omitted, row_num is required. + * @return mixed the value of a specified cell or array of cells + */ + public static function INDEX($arrayValues,$rowNum = 0,$columnNum = 0) { + + if (($rowNum < 0) || ($columnNum < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (!is_array($arrayValues)) { + return PHPExcel_Calculation_Functions::REF(); + } + + $rowKeys = array_keys($arrayValues); + $columnKeys = @array_keys($arrayValues[$rowKeys[0]]); + + if ($columnNum > count($columnKeys)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($columnNum == 0) { + if ($rowNum == 0) { + return $arrayValues; + } + $rowNum = $rowKeys[--$rowNum]; + $returnArray = array(); + foreach($arrayValues as $arrayColumn) { + if (is_array($arrayColumn)) { + if (isset($arrayColumn[$rowNum])) { + $returnArray[] = $arrayColumn[$rowNum]; + } else { + return $arrayValues[$rowNum]; + } + } else { + return $arrayValues[$rowNum]; + } + } + return $returnArray; + } + $columnNum = $columnKeys[--$columnNum]; + if ($rowNum > count($rowKeys)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($rowNum == 0) { + return $arrayValues[$columnNum]; + } + $rowNum = $rowKeys[--$rowNum]; + + return $arrayValues[$rowNum][$columnNum]; + } // function INDEX() + + + /** + * TRANSPOSE + * + * @param array $matrixData A matrix of values + * @return array + * + * Unlike the Excel TRANSPOSE function, which will only work on a single row or column, this function will transpose a full matrix. + */ + public static function TRANSPOSE($matrixData) { + $returnMatrix = array(); + if (!is_array($matrixData)) { $matrixData = array(array($matrixData)); } + + $column = 0; + foreach($matrixData as $matrixRow) { + $row = 0; + foreach($matrixRow as $matrixCell) { + $returnMatrix[$row][$column] = $matrixCell; + ++$row; + } + ++$column; + } + return $returnMatrix; + } // function TRANSPOSE() + + + private static function _vlookupSort($a,$b) { + $f = array_keys($a); + $firstColumn = array_shift($f); + if (strtolower($a[$firstColumn]) == strtolower($b[$firstColumn])) { + return 0; + } + return (strtolower($a[$firstColumn]) < strtolower($b[$firstColumn])) ? -1 : 1; + } // function _vlookupSort() + + + /** + * VLOOKUP + * The VLOOKUP function searches for value in the left-most column of lookup_array and returns the value in the same row based on the index_number. + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_array The range of cells being searched + * @param index_number The column number in table_array from which the matching value must be returned. The first column is 1. + * @param not_exact_match Determines if you are looking for an exact match based on lookup_value. + * @return mixed The value of the found cell + */ + public static function VLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match=true) { + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + $index_number = PHPExcel_Calculation_Functions::flattenSingleValue($index_number); + $not_exact_match = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match); + + // index_number must be greater than or equal to 1 + if ($index_number < 1) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // index_number must be less than or equal to the number of columns in lookup_array + if ((!is_array($lookup_array)) || (empty($lookup_array))) { + return PHPExcel_Calculation_Functions::REF(); + } else { + $f = array_keys($lookup_array); + $firstRow = array_pop($f); + if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) { + return PHPExcel_Calculation_Functions::REF(); + } else { + $columnKeys = array_keys($lookup_array[$firstRow]); + $returnColumn = $columnKeys[--$index_number]; + $firstColumn = array_shift($columnKeys); + } + } + + if (!$not_exact_match) { + uasort($lookup_array,array('self','_vlookupSort')); + } + + $rowNumber = $rowValue = False; + foreach($lookup_array as $rowKey => $rowData) { + if (strtolower($rowData[$firstColumn]) > strtolower($lookup_value)) { + break; + } + $rowNumber = $rowKey; + $rowValue = $rowData[$firstColumn]; + } + + if ($rowNumber !== false) { + if ((!$not_exact_match) && ($rowValue != $lookup_value)) { + // if an exact match is required, we have what we need to return an appropriate response + return PHPExcel_Calculation_Functions::NA(); + } else { + // otherwise return the appropriate value + return $lookup_array[$rowNumber][$returnColumn]; + } + } + + return PHPExcel_Calculation_Functions::NA(); + } // function VLOOKUP() + + + /** + * LOOKUP + * The LOOKUP function searches for value either from a one-row or one-column range or from an array. + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_vector The range of cells being searched + * @param result_vector The column from which the matching value must be returned + * @return mixed The value of the found cell + */ + public static function LOOKUP($lookup_value, $lookup_vector, $result_vector=null) { + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + + if (!is_array($lookup_vector)) { + return PHPExcel_Calculation_Functions::NA(); + } + $lookupRows = count($lookup_vector); + $l = array_keys($lookup_vector); + $l = array_shift($l); + $lookupColumns = count($lookup_vector[$l]); + if ((($lookupRows == 1) && ($lookupColumns > 1)) || (($lookupRows == 2) && ($lookupColumns != 2))) { + $lookup_vector = self::TRANSPOSE($lookup_vector); + $lookupRows = count($lookup_vector); + $l = array_keys($lookup_vector); + $lookupColumns = count($lookup_vector[array_shift($l)]); + } + + if (is_null($result_vector)) { + $result_vector = $lookup_vector; + } + $resultRows = count($result_vector); + $l = array_keys($result_vector); + $l = array_shift($l); + $resultColumns = count($result_vector[$l]); + if ((($resultRows == 1) && ($resultColumns > 1)) || (($resultRows == 2) && ($resultColumns != 2))) { + $result_vector = self::TRANSPOSE($result_vector); + $resultRows = count($result_vector); + $r = array_keys($result_vector); + $resultColumns = count($result_vector[array_shift($r)]); + } + + if ($lookupRows == 2) { + $result_vector = array_pop($lookup_vector); + $lookup_vector = array_shift($lookup_vector); + } + if ($lookupColumns != 2) { + foreach($lookup_vector as &$value) { + if (is_array($value)) { + $k = array_keys($value); + $key1 = $key2 = array_shift($k); + $key2++; + $dataValue1 = $value[$key1]; + } else { + $key1 = 0; + $key2 = 1; + $dataValue1 = $value; + } + $dataValue2 = array_shift($result_vector); + if (is_array($dataValue2)) { + $dataValue2 = array_shift($dataValue2); + } + $value = array($key1 => $dataValue1, $key2 => $dataValue2); + } + unset($value); + } + + return self::VLOOKUP($lookup_value,$lookup_vector,2); + } // function LOOKUP() + +} // class PHPExcel_Calculation_LookupRef diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/MathTrig.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/MathTrig.php new file mode 100644 index 000000000..79c573b27 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/MathTrig.php @@ -0,0 +1,1366 @@ + 1; --$i) { + if (($value % $i) == 0) { + $factorArray = array_merge($factorArray,self::_factors($value / $i)); + $factorArray = array_merge($factorArray,self::_factors($i)); + if ($i <= sqrt($value)) { + break; + } + } + } + if (!empty($factorArray)) { + rsort($factorArray); + return $factorArray; + } else { + return array((integer) $value); + } + } // function _factors() + + + private static function _romanCut($num, $n) { + return ($num - ($num % $n ) ) / $n; + } // function _romanCut() + + + /** + * ATAN2 + * + * This function calculates the arc tangent of the two variables x and y. It is similar to + * calculating the arc tangent of y ÷ x, except that the signs of both arguments are used + * to determine the quadrant of the result. + * The arctangent is the angle from the x-axis to a line containing the origin (0, 0) and a + * point with coordinates (xCoordinate, yCoordinate). The angle is given in radians between + * -pi and pi, excluding -pi. + * + * Note that the Excel ATAN2() function accepts its arguments in the reverse order to the standard + * PHP atan2() function, so we need to reverse them here before calling the PHP atan() function. + * + * Excel Function: + * ATAN2(xCoordinate,yCoordinate) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $xCoordinate The x-coordinate of the point. + * @param float $yCoordinate The y-coordinate of the point. + * @return float The inverse tangent of the specified x- and y-coordinates. + */ + public static function ATAN2($xCoordinate = NULL, $yCoordinate = NULL) { + $xCoordinate = PHPExcel_Calculation_Functions::flattenSingleValue($xCoordinate); + $yCoordinate = PHPExcel_Calculation_Functions::flattenSingleValue($yCoordinate); + + $xCoordinate = ($xCoordinate !== NULL) ? $xCoordinate : 0.0; + $yCoordinate = ($yCoordinate !== NULL) ? $yCoordinate : 0.0; + + if (((is_numeric($xCoordinate)) || (is_bool($xCoordinate))) && + ((is_numeric($yCoordinate))) || (is_bool($yCoordinate))) { + $xCoordinate = (float) $xCoordinate; + $yCoordinate = (float) $yCoordinate; + + if (($xCoordinate == 0) && ($yCoordinate == 0)) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + return atan2($yCoordinate, $xCoordinate); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ATAN2() + + + /** + * CEILING + * + * Returns number rounded up, away from zero, to the nearest multiple of significance. + * For example, if you want to avoid using pennies in your prices and your product is + * priced at $4.42, use the formula =CEILING(4.42,0.05) to round prices up to the + * nearest nickel. + * + * Excel Function: + * CEILING(number[,significance]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number The number you want to round. + * @param float $significance The multiple to which you want to round. + * @return float Rounded Number + */ + public static function CEILING($number, $significance = NULL) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $significance = PHPExcel_Calculation_Functions::flattenSingleValue($significance); + + if ((is_null($significance)) && + (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) { + $significance = $number/abs($number); + } + + if ((is_numeric($number)) && (is_numeric($significance))) { + if ($significance == 0.0) { + return 0.0; + } elseif (self::SIGN($number) == self::SIGN($significance)) { + return ceil($number / $significance) * $significance; + } else { + return PHPExcel_Calculation_Functions::NaN(); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function CEILING() + + + /** + * COMBIN + * + * Returns the number of combinations for a given number of items. Use COMBIN to + * determine the total possible number of groups for a given number of items. + * + * Excel Function: + * COMBIN(numObjs,numInSet) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param int $numObjs Number of different objects + * @param int $numInSet Number of objects in each combination + * @return int Number of combinations + */ + public static function COMBIN($numObjs, $numInSet) { + $numObjs = PHPExcel_Calculation_Functions::flattenSingleValue($numObjs); + $numInSet = PHPExcel_Calculation_Functions::flattenSingleValue($numInSet); + + if ((is_numeric($numObjs)) && (is_numeric($numInSet))) { + if ($numObjs < $numInSet) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif ($numInSet < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return round(self::FACT($numObjs) / self::FACT($numObjs - $numInSet)) / self::FACT($numInSet); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function COMBIN() + + + /** + * EVEN + * + * Returns number rounded up to the nearest even integer. + * You can use this function for processing items that come in twos. For example, + * a packing crate accepts rows of one or two items. The crate is full when + * the number of items, rounded up to the nearest two, matches the crate's + * capacity. + * + * Excel Function: + * EVEN(number) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number Number to round + * @return int Rounded Number + */ + public static function EVEN($number) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_null($number)) { + return 0; + } elseif (is_bool($number)) { + $number = (int) $number; + } + + if (is_numeric($number)) { + $significance = 2 * self::SIGN($number); + return (int) self::CEILING($number,$significance); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function EVEN() + + + /** + * FACT + * + * Returns the factorial of a number. + * The factorial of a number is equal to 1*2*3*...* number. + * + * Excel Function: + * FACT(factVal) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $factVal Factorial Value + * @return int Factorial + */ + public static function FACT($factVal) { + $factVal = PHPExcel_Calculation_Functions::flattenSingleValue($factVal); + + if (is_numeric($factVal)) { + if ($factVal < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $factLoop = floor($factVal); + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + if ($factVal > $factLoop) { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + $factorial = 1; + while ($factLoop > 1) { + $factorial *= $factLoop--; + } + return $factorial ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function FACT() + + + /** + * FACTDOUBLE + * + * Returns the double factorial of a number. + * + * Excel Function: + * FACTDOUBLE(factVal) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $factVal Factorial Value + * @return int Double Factorial + */ + public static function FACTDOUBLE($factVal) { + $factLoop = PHPExcel_Calculation_Functions::flattenSingleValue($factVal); + + if (is_numeric($factLoop)) { + $factLoop = floor($factLoop); + if ($factVal < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $factorial = 1; + while ($factLoop > 1) { + $factorial *= $factLoop--; + --$factLoop; + } + return $factorial ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function FACTDOUBLE() + + + /** + * FLOOR + * + * Rounds number down, toward zero, to the nearest multiple of significance. + * + * Excel Function: + * FLOOR(number[,significance]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number Number to round + * @param float $significance Significance + * @return float Rounded Number + */ + public static function FLOOR($number, $significance = NULL) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $significance = PHPExcel_Calculation_Functions::flattenSingleValue($significance); + + if ((is_null($significance)) && (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) { + $significance = $number/abs($number); + } + + if ((is_numeric($number)) && (is_numeric($significance))) { + if ((float) $significance == 0.0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + if (self::SIGN($number) == self::SIGN($significance)) { + return floor($number / $significance) * $significance; + } else { + return PHPExcel_Calculation_Functions::NaN(); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function FLOOR() + + + /** + * GCD + * + * Returns the greatest common divisor of a series of numbers. + * The greatest common divisor is the largest integer that divides both + * number1 and number2 without a remainder. + * + * Excel Function: + * GCD(number1[,number2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return integer Greatest Common Divisor + */ + public static function GCD() { + $returnValue = 1; + $allValuesFactors = array(); + // Loop through arguments + foreach(PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $value) { + if (!is_numeric($value)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($value == 0) { + continue; + } elseif($value < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $myFactors = self::_factors($value); + $myCountedFactors = array_count_values($myFactors); + $allValuesFactors[] = $myCountedFactors; + } + $allValuesCount = count($allValuesFactors); + if ($allValuesCount == 0) { + return 0; + } + + $mergedArray = $allValuesFactors[0]; + for ($i=1;$i < $allValuesCount; ++$i) { + $mergedArray = array_intersect_key($mergedArray,$allValuesFactors[$i]); + } + $mergedArrayValues = count($mergedArray); + if ($mergedArrayValues == 0) { + return $returnValue; + } elseif ($mergedArrayValues > 1) { + foreach($mergedArray as $mergedKey => $mergedValue) { + foreach($allValuesFactors as $highestPowerTest) { + foreach($highestPowerTest as $testKey => $testValue) { + if (($testKey == $mergedKey) && ($testValue < $mergedValue)) { + $mergedArray[$mergedKey] = $testValue; + $mergedValue = $testValue; + } + } + } + } + + $returnValue = 1; + foreach($mergedArray as $key => $value) { + $returnValue *= pow($key,$value); + } + return $returnValue; + } else { + $keys = array_keys($mergedArray); + $key = $keys[0]; + $value = $mergedArray[$key]; + foreach($allValuesFactors as $testValue) { + foreach($testValue as $mergedKey => $mergedValue) { + if (($mergedKey == $key) && ($mergedValue < $value)) { + $value = $mergedValue; + } + } + } + return pow($key,$value); + } + } // function GCD() + + + /** + * INT + * + * Casts a floating point value to an integer + * + * Excel Function: + * INT(number) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number Number to cast to an integer + * @return integer Integer value + */ + public static function INT($number) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_null($number)) { + return 0; + } elseif (is_bool($number)) { + return (int) $number; + } + if (is_numeric($number)) { + return (int) floor($number); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function INT() + + + /** + * LCM + * + * Returns the lowest common multiplier of a series of numbers + * The least common multiple is the smallest positive integer that is a multiple + * of all integer arguments number1, number2, and so on. Use LCM to add fractions + * with different denominators. + * + * Excel Function: + * LCM(number1[,number2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return int Lowest Common Multiplier + */ + public static function LCM() { + $returnValue = 1; + $allPoweredFactors = array(); + // Loop through arguments + foreach(PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $value) { + if (!is_numeric($value)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if ($value == 0) { + return 0; + } elseif ($value < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $myFactors = self::_factors(floor($value)); + $myCountedFactors = array_count_values($myFactors); + $myPoweredFactors = array(); + foreach($myCountedFactors as $myCountedFactor => $myCountedPower) { + $myPoweredFactors[$myCountedFactor] = pow($myCountedFactor,$myCountedPower); + } + foreach($myPoweredFactors as $myPoweredValue => $myPoweredFactor) { + if (array_key_exists($myPoweredValue,$allPoweredFactors)) { + if ($allPoweredFactors[$myPoweredValue] < $myPoweredFactor) { + $allPoweredFactors[$myPoweredValue] = $myPoweredFactor; + } + } else { + $allPoweredFactors[$myPoweredValue] = $myPoweredFactor; + } + } + } + foreach($allPoweredFactors as $allPoweredFactor) { + $returnValue *= (integer) $allPoweredFactor; + } + return $returnValue; + } // function LCM() + + + /** + * LOG_BASE + * + * Returns the logarithm of a number to a specified base. The default base is 10. + * + * Excel Function: + * LOG(number[,base]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $value The positive real number for which you want the logarithm + * @param float $base The base of the logarithm. If base is omitted, it is assumed to be 10. + * @return float + */ + public static function LOG_BASE($number = NULL, $base = 10) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $base = (is_null($base)) ? 10 : (float) PHPExcel_Calculation_Functions::flattenSingleValue($base); + + if ((!is_numeric($base)) || (!is_numeric($number))) + return PHPExcel_Calculation_Functions::VALUE(); + if (($base <= 0) || ($number <= 0)) + return PHPExcel_Calculation_Functions::NaN(); + return log($number, $base); + } // function LOG_BASE() + + + /** + * MDETERM + * + * Returns the matrix determinant of an array. + * + * Excel Function: + * MDETERM(array) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param array $matrixValues A matrix of values + * @return float + */ + public static function MDETERM($matrixValues) { + $matrixData = array(); + if (!is_array($matrixValues)) { $matrixValues = array(array($matrixValues)); } + + $row = $maxColumn = 0; + foreach($matrixValues as $matrixRow) { + if (!is_array($matrixRow)) { $matrixRow = array($matrixRow); } + $column = 0; + foreach($matrixRow as $matrixCell) { + if ((is_string($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixData[$column][$row] = $matrixCell; + ++$column; + } + if ($column > $maxColumn) { $maxColumn = $column; } + ++$row; + } + if ($row != $maxColumn) { return PHPExcel_Calculation_Functions::VALUE(); } + + try { + $matrix = new PHPExcel_Shared_JAMA_Matrix($matrixData); + return $matrix->det(); + } catch (Exception $ex) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } // function MDETERM() + + + /** + * MINVERSE + * + * Returns the inverse matrix for the matrix stored in an array. + * + * Excel Function: + * MINVERSE(array) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param array $matrixValues A matrix of values + * @return array + */ + public static function MINVERSE($matrixValues) { + $matrixData = array(); + if (!is_array($matrixValues)) { $matrixValues = array(array($matrixValues)); } + + $row = $maxColumn = 0; + foreach($matrixValues as $matrixRow) { + if (!is_array($matrixRow)) { $matrixRow = array($matrixRow); } + $column = 0; + foreach($matrixRow as $matrixCell) { + if ((is_string($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixData[$column][$row] = $matrixCell; + ++$column; + } + if ($column > $maxColumn) { $maxColumn = $column; } + ++$row; + } + if ($row != $maxColumn) { return PHPExcel_Calculation_Functions::VALUE(); } + + try { + $matrix = new PHPExcel_Shared_JAMA_Matrix($matrixData); + return $matrix->inverse()->getArray(); + } catch (Exception $ex) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } // function MINVERSE() + + + /** + * MMULT + * + * @param array $matrixData1 A matrix of values + * @param array $matrixData2 A matrix of values + * @return array + */ + public static function MMULT($matrixData1,$matrixData2) { + $matrixAData = $matrixBData = array(); + if (!is_array($matrixData1)) { $matrixData1 = array(array($matrixData1)); } + if (!is_array($matrixData2)) { $matrixData2 = array(array($matrixData2)); } + + $rowA = 0; + foreach($matrixData1 as $matrixRow) { + if (!is_array($matrixRow)) { $matrixRow = array($matrixRow); } + $columnA = 0; + foreach($matrixRow as $matrixCell) { + if ((is_string($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixAData[$rowA][$columnA] = $matrixCell; + ++$columnA; + } + ++$rowA; + } + try { + $matrixA = new PHPExcel_Shared_JAMA_Matrix($matrixAData); + $rowB = 0; + foreach($matrixData2 as $matrixRow) { + if (!is_array($matrixRow)) { $matrixRow = array($matrixRow); } + $columnB = 0; + foreach($matrixRow as $matrixCell) { + if ((is_string($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixBData[$rowB][$columnB] = $matrixCell; + ++$columnB; + } + ++$rowB; + } + $matrixB = new PHPExcel_Shared_JAMA_Matrix($matrixBData); + + if (($rowA != $columnB) || ($rowB != $columnA)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + return $matrixA->times($matrixB)->getArray(); + } catch (Exception $ex) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } // function MMULT() + + + /** + * MOD + * + * @param int $a Dividend + * @param int $b Divisor + * @return int Remainder + */ + public static function MOD($a = 1, $b = 1) { + $a = PHPExcel_Calculation_Functions::flattenSingleValue($a); + $b = PHPExcel_Calculation_Functions::flattenSingleValue($b); + + if ($b == 0.0) { + return PHPExcel_Calculation_Functions::DIV0(); + } elseif (($a < 0.0) && ($b > 0.0)) { + return $b - fmod(abs($a),$b); + } elseif (($a > 0.0) && ($b < 0.0)) { + return $b + fmod($a,abs($b)); + } + + return fmod($a,$b); + } // function MOD() + + + /** + * MROUND + * + * Rounds a number to the nearest multiple of a specified value + * + * @param float $number Number to round + * @param int $multiple Multiple to which you want to round $number + * @return float Rounded Number + */ + public static function MROUND($number,$multiple) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $multiple = PHPExcel_Calculation_Functions::flattenSingleValue($multiple); + + if ((is_numeric($number)) && (is_numeric($multiple))) { + if ($multiple == 0) { + return 0; + } + if ((self::SIGN($number)) == (self::SIGN($multiple))) { + $multiplier = 1 / $multiple; + return round($number * $multiplier) / $multiplier; + } + return PHPExcel_Calculation_Functions::NaN(); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function MROUND() + + + /** + * MULTINOMIAL + * + * Returns the ratio of the factorial of a sum of values to the product of factorials. + * + * @param array of mixed Data Series + * @return float + */ + public static function MULTINOMIAL() { + $summer = 0; + $divisor = 1; + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if (is_numeric($arg)) { + if ($arg < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + $summer += floor($arg); + $divisor *= self::FACT($arg); + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + // Return + if ($summer > 0) { + $summer = self::FACT($summer); + return $summer / $divisor; + } + return 0; + } // function MULTINOMIAL() + + + /** + * ODD + * + * Returns number rounded up to the nearest odd integer. + * + * @param float $number Number to round + * @return int Rounded Number + */ + public static function ODD($number) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_null($number)) { + return 1; + } elseif (is_bool($number)) { + $number = (int) $number; + } + + if (is_numeric($number)) { + $significance = self::SIGN($number); + if ($significance == 0) { + return 1; + } + + $result = self::CEILING($number,$significance); + if ($result == self::EVEN($result)) { + $result += $significance; + } + + return (int) $result; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ODD() + + + /** + * POWER + * + * Computes x raised to the power y. + * + * @param float $x + * @param float $y + * @return float + */ + public static function POWER($x = 0, $y = 2) { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $y = PHPExcel_Calculation_Functions::flattenSingleValue($y); + + // Validate parameters + if ($x == 0.0 && $y == 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif ($x == 0.0 && $y < 0.0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + // Return + $result = pow($x, $y); + return (!is_nan($result) && !is_infinite($result)) ? $result : PHPExcel_Calculation_Functions::NaN(); + } // function POWER() + + + /** + * PRODUCT + * + * PRODUCT returns the product of all the values and cells referenced in the argument list. + * + * Excel Function: + * PRODUCT(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function PRODUCT() { + // Return value + $returnValue = null; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = $arg; + } else { + $returnValue *= $arg; + } + } + } + + // Return + if (is_null($returnValue)) { + return 0; + } + return $returnValue; + } // function PRODUCT() + + + /** + * QUOTIENT + * + * QUOTIENT function returns the integer portion of a division. Numerator is the divided number + * and denominator is the divisor. + * + * Excel Function: + * QUOTIENT(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function QUOTIENT() { + // Return value + $returnValue = null; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = ($arg == 0) ? 0 : $arg; + } else { + if (($returnValue == 0) || ($arg == 0)) { + $returnValue = 0; + } else { + $returnValue /= $arg; + } + } + } + } + + // Return + return intval($returnValue); + } // function QUOTIENT() + + + /** + * RAND + * + * @param int $min Minimal value + * @param int $max Maximal value + * @return int Random number + */ + public static function RAND($min = 0, $max = 0) { + $min = PHPExcel_Calculation_Functions::flattenSingleValue($min); + $max = PHPExcel_Calculation_Functions::flattenSingleValue($max); + + if ($min == 0 && $max == 0) { + return (rand(0,10000000)) / 10000000; + } else { + return rand($min, $max); + } + } // function RAND() + + + public static function ROMAN($aValue, $style=0) { + $aValue = PHPExcel_Calculation_Functions::flattenSingleValue($aValue); + $style = (is_null($style)) ? 0 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($style); + if ((!is_numeric($aValue)) || ($aValue < 0) || ($aValue >= 4000)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $aValue = (integer) $aValue; + if ($aValue == 0) { + return ''; + } + + $mill = Array('', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM'); + $cent = Array('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'); + $tens = Array('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'); + $ones = Array('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'); + + $roman = ''; + while ($aValue > 5999) { + $roman .= 'M'; + $aValue -= 1000; + } + $m = self::_romanCut($aValue, 1000); $aValue %= 1000; + $c = self::_romanCut($aValue, 100); $aValue %= 100; + $t = self::_romanCut($aValue, 10); $aValue %= 10; + + return $roman.$mill[$m].$cent[$c].$tens[$t].$ones[$aValue]; + } // function ROMAN() + + + /** + * ROUNDUP + * + * Rounds a number up to a specified number of decimal places + * + * @param float $number Number to round + * @param int $digits Number of digits to which you want to round $number + * @return float Rounded Number + */ + public static function ROUNDUP($number,$digits) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $digits = PHPExcel_Calculation_Functions::flattenSingleValue($digits); + + if ((is_numeric($number)) && (is_numeric($digits))) { + $significance = pow(10,(int) $digits); + if ($number < 0.0) { + return floor($number * $significance) / $significance; + } else { + return ceil($number * $significance) / $significance; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ROUNDUP() + + + /** + * ROUNDDOWN + * + * Rounds a number down to a specified number of decimal places + * + * @param float $number Number to round + * @param int $digits Number of digits to which you want to round $number + * @return float Rounded Number + */ + public static function ROUNDDOWN($number,$digits) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $digits = PHPExcel_Calculation_Functions::flattenSingleValue($digits); + + if ((is_numeric($number)) && (is_numeric($digits))) { + $significance = pow(10,(int) $digits); + if ($number < 0.0) { + return ceil($number * $significance) / $significance; + } else { + return floor($number * $significance) / $significance; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function ROUNDDOWN() + + + /** + * SERIESSUM + * + * Returns the sum of a power series + * + * @param float $x Input value to the power series + * @param float $n Initial power to which you want to raise $x + * @param float $m Step by which to increase $n for each term in the series + * @param array of mixed Data Series + * @return float + */ + public static function SERIESSUM() { + // Return value + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + $x = array_shift($aArgs); + $n = array_shift($aArgs); + $m = array_shift($aArgs); + + if ((is_numeric($x)) && (is_numeric($n)) && (is_numeric($m))) { + // Calculate + $i = 0; + foreach($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue += $arg * pow($x,$n + ($m * $i++)); + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Return + return $returnValue; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SERIESSUM() + + + /** + * SIGN + * + * Determines the sign of a number. Returns 1 if the number is positive, zero (0) + * if the number is 0, and -1 if the number is negative. + * + * @param float $number Number to round + * @return int sign value + */ + public static function SIGN($number) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_bool($number)) + return (int) $number; + if (is_numeric($number)) { + if ($number == 0.0) { + return 0; + } + return $number / abs($number); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SIGN() + + + /** + * SQRTPI + * + * Returns the square root of (number * pi). + * + * @param float $number Number + * @return float Square Root of Number * Pi + */ + public static function SQRTPI($number) { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_numeric($number)) { + if ($number < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return sqrt($number * M_PI) ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SQRTPI() + + + /** + * SUBTOTAL + * + * Returns a subtotal in a list or database. + * + * @param int the number 1 to 11 that specifies which function to + * use in calculating subtotals within a list. + * @param array of mixed Data Series + * @return float + */ + public static function SUBTOTAL() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $subtotal = array_shift($aArgs); + + if ((is_numeric($subtotal)) && (!is_string($subtotal))) { + switch($subtotal) { + case 1 : + return PHPExcel_Calculation_Statistical::AVERAGE($aArgs); + break; + case 2 : + return PHPExcel_Calculation_Statistical::COUNT($aArgs); + break; + case 3 : + return PHPExcel_Calculation_Statistical::COUNTA($aArgs); + break; + case 4 : + return PHPExcel_Calculation_Statistical::MAX($aArgs); + break; + case 5 : + return PHPExcel_Calculation_Statistical::MIN($aArgs); + break; + case 6 : + return self::PRODUCT($aArgs); + break; + case 7 : + return PHPExcel_Calculation_Statistical::STDEV($aArgs); + break; + case 8 : + return PHPExcel_Calculation_Statistical::STDEVP($aArgs); + break; + case 9 : + return self::SUM($aArgs); + break; + case 10 : + return PHPExcel_Calculation_Statistical::VARFunc($aArgs); + break; + case 11 : + return PHPExcel_Calculation_Statistical::VARP($aArgs); + break; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SUBTOTAL() + + + /** + * SUM + * + * SUM computes the sum of all the values and cells referenced in the argument list. + * + * Excel Function: + * SUM(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function SUM() { + // Return value + $returnValue = 0; + + // Loop through the arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue += $arg; + } + } + + // Return + return $returnValue; + } // function SUM() + + + /** + * SUMIF + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * SUMIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be summed. + * @return float + */ + public static function SUMIF($aArgs,$condition,$sumArgs = array()) { + // Return value + $returnValue = 0; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs); + if (empty($sumArgs)) { + $sumArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::_ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { $arg = PHPExcel_Calculation::_wrapResult(strtoupper($arg)); } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is it a value within our criteria + $returnValue += $sumArgs[$key]; + } + } + + // Return + return $returnValue; + } // function SUMIF() + + + /** + * SUMPRODUCT + * + * Excel Function: + * SUMPRODUCT(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function SUMPRODUCT() { + $arrayList = func_get_args(); + + $wrkArray = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList)); + $wrkCellCount = count($wrkArray); + + for ($i=0; $i< $wrkCellCount; ++$i) { + if ((!is_numeric($wrkArray[$i])) || (is_string($wrkArray[$i]))) { + $wrkArray[$i] = 0; + } + } + + foreach($arrayList as $matrixData) { + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData); + $count = count($array2); + if ($wrkCellCount != $count) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + foreach ($array2 as $i => $val) { + if ((!is_numeric($val)) || (is_string($val))) { + $val = 0; + } + $wrkArray[$i] *= $val; + } + } + + return array_sum($wrkArray); + } // function SUMPRODUCT() + + + /** + * SUMSQ + * + * SUMSQ returns the sum of the squares of the arguments + * + * Excel Function: + * SUMSQ(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function SUMSQ() { + // Return value + $returnValue = 0; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue += ($arg * $arg); + } + } + + // Return + return $returnValue; + } // function SUMSQ() + + + /** + * SUMX2MY2 + * + * @param mixed $value Value to check + * @return float + */ + public static function SUMX2MY2($matrixData1,$matrixData2) { + $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1); + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2); + $count1 = count($array1); + $count2 = count($array2); + if ($count1 < $count2) { + $count = $count1; + } else { + $count = $count2; + } + + $result = 0; + for ($i = 0; $i < $count; ++$i) { + if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && + ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) { + $result += ($array1[$i] * $array1[$i]) - ($array2[$i] * $array2[$i]); + } + } + + return $result; + } // function SUMX2MY2() + + + /** + * SUMX2PY2 + * + * @param mixed $value Value to check + * @return float + */ + public static function SUMX2PY2($matrixData1,$matrixData2) { + $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1); + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2); + $count1 = count($array1); + $count2 = count($array2); + if ($count1 < $count2) { + $count = $count1; + } else { + $count = $count2; + } + + $result = 0; + for ($i = 0; $i < $count; ++$i) { + if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && + ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) { + $result += ($array1[$i] * $array1[$i]) + ($array2[$i] * $array2[$i]); + } + } + + return $result; + } // function SUMX2PY2() + + + /** + * SUMXMY2 + * + * @param mixed $value Value to check + * @return float + */ + public static function SUMXMY2($matrixData1,$matrixData2) { + $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1); + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2); + $count1 = count($array1); + $count2 = count($array2); + if ($count1 < $count2) { + $count = $count1; + } else { + $count = $count2; + } + + $result = 0; + for ($i = 0; $i < $count; ++$i) { + if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && + ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) { + $result += ($array1[$i] - $array2[$i]) * ($array1[$i] - $array2[$i]); + } + } + + return $result; + } // function SUMXMY2() + + + /** + * TRUNC + * + * Truncates value to the number of fractional digits by number_digits. + * + * @param float $value + * @param int $digits + * @return float Truncated value + */ + public static function TRUNC($value = 0, $digits = 0) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $digits = PHPExcel_Calculation_Functions::flattenSingleValue($digits); + + // Validate parameters + if ((!is_numeric($value)) || (!is_numeric($digits))) + return PHPExcel_Calculation_Functions::VALUE(); + $digits = floor($digits); + + // Truncate + $adjust = pow(10, $digits); + + if (($digits > 0) && (rtrim(intval((abs($value) - abs(intval($value))) * $adjust),'0') < $adjust/10)) + return $value; + + return (intval($value * $adjust)) / $adjust; + } // function TRUNC() + +} // class PHPExcel_Calculation_MathTrig diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Statistical.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Statistical.php new file mode 100644 index 000000000..2fbb163ef --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Statistical.php @@ -0,0 +1,3644 @@ + $value) { + if ((is_bool($value)) || (is_string($value)) || (is_null($value))) { + unset($array1[$key]); + unset($array2[$key]); + } + } + foreach($array2 as $key => $value) { + if ((is_bool($value)) || (is_string($value)) || (is_null($value))) { + unset($array1[$key]); + unset($array2[$key]); + } + } + $array1 = array_merge($array1); + $array2 = array_merge($array2); + + return True; + } // function _checkTrendArrays() + + + /** + * Beta function. + * + * @author Jaco van Kooten + * + * @param p require p>0 + * @param q require q>0 + * @return 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow + */ + private static function _beta($p, $q) { + if ($p <= 0.0 || $q <= 0.0 || ($p + $q) > LOG_GAMMA_X_MAX_VALUE) { + return 0.0; + } else { + return exp(self::_logBeta($p, $q)); + } + } // function _beta() + + + /** + * Incomplete beta function + * + * @author Jaco van Kooten + * @author Paul Meagher + * + * The computation is based on formulas from Numerical Recipes, Chapter 6.4 (W.H. Press et al, 1992). + * @param x require 0<=x<=1 + * @param p require p>0 + * @param q require q>0 + * @return 0 if x<0, p<=0, q<=0 or p+q>2.55E305 and 1 if x>1 to avoid errors and over/underflow + */ + private static function _incompleteBeta($x, $p, $q) { + if ($x <= 0.0) { + return 0.0; + } elseif ($x >= 1.0) { + return 1.0; + } elseif (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > LOG_GAMMA_X_MAX_VALUE)) { + return 0.0; + } + $beta_gam = exp((0 - self::_logBeta($p, $q)) + $p * log($x) + $q * log(1.0 - $x)); + if ($x < ($p + 1.0) / ($p + $q + 2.0)) { + return $beta_gam * self::_betaFraction($x, $p, $q) / $p; + } else { + return 1.0 - ($beta_gam * self::_betaFraction(1 - $x, $q, $p) / $q); + } + } // function _incompleteBeta() + + + // Function cache for _logBeta function + private static $_logBetaCache_p = 0.0; + private static $_logBetaCache_q = 0.0; + private static $_logBetaCache_result = 0.0; + + /** + * The natural logarithm of the beta function. + * + * @param p require p>0 + * @param q require q>0 + * @return 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow + * @author Jaco van Kooten + */ + private static function _logBeta($p, $q) { + if ($p != self::$_logBetaCache_p || $q != self::$_logBetaCache_q) { + self::$_logBetaCache_p = $p; + self::$_logBetaCache_q = $q; + if (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > LOG_GAMMA_X_MAX_VALUE)) { + self::$_logBetaCache_result = 0.0; + } else { + self::$_logBetaCache_result = self::_logGamma($p) + self::_logGamma($q) - self::_logGamma($p + $q); + } + } + return self::$_logBetaCache_result; + } // function _logBeta() + + + /** + * Evaluates of continued fraction part of incomplete beta function. + * Based on an idea from Numerical Recipes (W.H. Press et al, 1992). + * @author Jaco van Kooten + */ + private static function _betaFraction($x, $p, $q) { + $c = 1.0; + $sum_pq = $p + $q; + $p_plus = $p + 1.0; + $p_minus = $p - 1.0; + $h = 1.0 - $sum_pq * $x / $p_plus; + if (abs($h) < XMININ) { + $h = XMININ; + } + $h = 1.0 / $h; + $frac = $h; + $m = 1; + $delta = 0.0; + while ($m <= MAX_ITERATIONS && abs($delta-1.0) > PRECISION ) { + $m2 = 2 * $m; + // even index for d + $d = $m * ($q - $m) * $x / ( ($p_minus + $m2) * ($p + $m2)); + $h = 1.0 + $d * $h; + if (abs($h) < XMININ) { + $h = XMININ; + } + $h = 1.0 / $h; + $c = 1.0 + $d / $c; + if (abs($c) < XMININ) { + $c = XMININ; + } + $frac *= $h * $c; + // odd index for d + $d = -($p + $m) * ($sum_pq + $m) * $x / (($p + $m2) * ($p_plus + $m2)); + $h = 1.0 + $d * $h; + if (abs($h) < XMININ) { + $h = XMININ; + } + $h = 1.0 / $h; + $c = 1.0 + $d / $c; + if (abs($c) < XMININ) { + $c = XMININ; + } + $delta = $h * $c; + $frac *= $delta; + ++$m; + } + return $frac; + } // function _betaFraction() + + + /** + * logGamma function + * + * @version 1.1 + * @author Jaco van Kooten + * + * Original author was Jaco van Kooten. Ported to PHP by Paul Meagher. + * + * The natural logarithm of the gamma function.
        + * Based on public domain NETLIB (Fortran) code by W. J. Cody and L. Stoltz
        + * Applied Mathematics Division
        + * Argonne National Laboratory
        + * Argonne, IL 60439
        + *

        + * References: + *

          + *
        1. W. J. Cody and K. E. Hillstrom, 'Chebyshev Approximations for the Natural + * Logarithm of the Gamma Function,' Math. Comp. 21, 1967, pp. 198-203.
        2. + *
        3. K. E. Hillstrom, ANL/AMD Program ANLC366S, DGAMMA/DLGAMA, May, 1969.
        4. + *
        5. Hart, Et. Al., Computer Approximations, Wiley and sons, New York, 1968.
        6. + *
        + *

        + *

        + * From the original documentation: + *

        + *

        + * This routine calculates the LOG(GAMMA) function for a positive real argument X. + * Computation is based on an algorithm outlined in references 1 and 2. + * The program uses rational functions that theoretically approximate LOG(GAMMA) + * to at least 18 significant decimal digits. The approximation for X > 12 is from + * reference 3, while approximations for X < 12.0 are similar to those in reference + * 1, but are unpublished. The accuracy achieved depends on the arithmetic system, + * the compiler, the intrinsic functions, and proper selection of the + * machine-dependent constants. + *

        + *

        + * Error returns:
        + * The program returns the value XINF for X .LE. 0.0 or when overflow would occur. + * The computation is believed to be free of underflow and overflow. + *

        + * @return MAX_VALUE for x < 0.0 or when overflow would occur, i.e. x > 2.55E305 + */ + + // Function cache for logGamma + private static $_logGammaCache_result = 0.0; + private static $_logGammaCache_x = 0.0; + + private static function _logGamma($x) { + // Log Gamma related constants + static $lg_d1 = -0.5772156649015328605195174; + static $lg_d2 = 0.4227843350984671393993777; + static $lg_d4 = 1.791759469228055000094023; + + static $lg_p1 = array( 4.945235359296727046734888, + 201.8112620856775083915565, + 2290.838373831346393026739, + 11319.67205903380828685045, + 28557.24635671635335736389, + 38484.96228443793359990269, + 26377.48787624195437963534, + 7225.813979700288197698961 ); + static $lg_p2 = array( 4.974607845568932035012064, + 542.4138599891070494101986, + 15506.93864978364947665077, + 184793.2904445632425417223, + 1088204.76946882876749847, + 3338152.967987029735917223, + 5106661.678927352456275255, + 3074109.054850539556250927 ); + static $lg_p4 = array( 14745.02166059939948905062, + 2426813.369486704502836312, + 121475557.4045093227939592, + 2663432449.630976949898078, + 29403789566.34553899906876, + 170266573776.5398868392998, + 492612579337.743088758812, + 560625185622.3951465078242 ); + + static $lg_q1 = array( 67.48212550303777196073036, + 1113.332393857199323513008, + 7738.757056935398733233834, + 27639.87074403340708898585, + 54993.10206226157329794414, + 61611.22180066002127833352, + 36351.27591501940507276287, + 8785.536302431013170870835 ); + static $lg_q2 = array( 183.0328399370592604055942, + 7765.049321445005871323047, + 133190.3827966074194402448, + 1136705.821321969608938755, + 5267964.117437946917577538, + 13467014.54311101692290052, + 17827365.30353274213975932, + 9533095.591844353613395747 ); + static $lg_q4 = array( 2690.530175870899333379843, + 639388.5654300092398984238, + 41355999.30241388052042842, + 1120872109.61614794137657, + 14886137286.78813811542398, + 101680358627.2438228077304, + 341747634550.7377132798597, + 446315818741.9713286462081 ); + + static $lg_c = array( -0.001910444077728, + 8.4171387781295e-4, + -5.952379913043012e-4, + 7.93650793500350248e-4, + -0.002777777777777681622553, + 0.08333333333333333331554247, + 0.0057083835261 ); + + // Rough estimate of the fourth root of logGamma_xBig + static $lg_frtbig = 2.25e76; + static $pnt68 = 0.6796875; + + + if ($x == self::$_logGammaCache_x) { + return self::$_logGammaCache_result; + } + $y = $x; + if ($y > 0.0 && $y <= LOG_GAMMA_X_MAX_VALUE) { + if ($y <= EPS) { + $res = -log(y); + } elseif ($y <= 1.5) { + // --------------------- + // EPS .LT. X .LE. 1.5 + // --------------------- + if ($y < $pnt68) { + $corr = -log($y); + $xm1 = $y; + } else { + $corr = 0.0; + $xm1 = $y - 1.0; + } + if ($y <= 0.5 || $y >= $pnt68) { + $xden = 1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm1 + $lg_p1[$i]; + $xden = $xden * $xm1 + $lg_q1[$i]; + } + $res = $corr + $xm1 * ($lg_d1 + $xm1 * ($xnum / $xden)); + } else { + $xm2 = $y - 1.0; + $xden = 1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm2 + $lg_p2[$i]; + $xden = $xden * $xm2 + $lg_q2[$i]; + } + $res = $corr + $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden)); + } + } elseif ($y <= 4.0) { + // --------------------- + // 1.5 .LT. X .LE. 4.0 + // --------------------- + $xm2 = $y - 2.0; + $xden = 1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm2 + $lg_p2[$i]; + $xden = $xden * $xm2 + $lg_q2[$i]; + } + $res = $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden)); + } elseif ($y <= 12.0) { + // ---------------------- + // 4.0 .LT. X .LE. 12.0 + // ---------------------- + $xm4 = $y - 4.0; + $xden = -1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm4 + $lg_p4[$i]; + $xden = $xden * $xm4 + $lg_q4[$i]; + } + $res = $lg_d4 + $xm4 * ($xnum / $xden); + } else { + // --------------------------------- + // Evaluate for argument .GE. 12.0 + // --------------------------------- + $res = 0.0; + if ($y <= $lg_frtbig) { + $res = $lg_c[6]; + $ysq = $y * $y; + for ($i = 0; $i < 6; ++$i) + $res = $res / $ysq + $lg_c[$i]; + } + $res /= $y; + $corr = log($y); + $res = $res + log(SQRT2PI) - 0.5 * $corr; + $res += $y * ($corr - 1.0); + } + } else { + // -------------------------- + // Return for bad arguments + // -------------------------- + $res = MAX_VALUE; + } + // ------------------------------ + // Final adjustments and return + // ------------------------------ + self::$_logGammaCache_x = $x; + self::$_logGammaCache_result = $res; + return $res; + } // function _logGamma() + + + // + // Private implementation of the incomplete Gamma function + // + private static function _incompleteGamma($a,$x) { + static $max = 32; + $summer = 0; + for ($n=0; $n<=$max; ++$n) { + $divisor = $a; + for ($i=1; $i<=$n; ++$i) { + $divisor *= ($a + $i); + } + $summer += (pow($x,$n) / $divisor); + } + return pow($x,$a) * exp(0-$x) * $summer; + } // function _incompleteGamma() + + + // + // Private implementation of the Gamma function + // + private static function _gamma($data) { + if ($data == 0.0) return 0; + + static $p0 = 1.000000000190015; + static $p = array ( 1 => 76.18009172947146, + 2 => -86.50532032941677, + 3 => 24.01409824083091, + 4 => -1.231739572450155, + 5 => 1.208650973866179e-3, + 6 => -5.395239384953e-6 + ); + + $y = $x = $data; + $tmp = $x + 5.5; + $tmp -= ($x + 0.5) * log($tmp); + + $summer = $p0; + for ($j=1;$j<=6;++$j) { + $summer += ($p[$j] / ++$y); + } + return exp(0 - $tmp + log(SQRT2PI * $summer / $x)); + } // function _gamma() + + + /*************************************************************************** + * inverse_ncdf.php + * ------------------- + * begin : Friday, January 16, 2004 + * copyright : (C) 2004 Michael Nickerson + * email : nickersonm@yahoo.com + * + ***************************************************************************/ + private static function _inverse_ncdf($p) { + // Inverse ncdf approximation by Peter J. Acklam, implementation adapted to + // PHP by Michael Nickerson, using Dr. Thomas Ziegler's C implementation as + // a guide. http://home.online.no/~pjacklam/notes/invnorm/index.html + // I have not checked the accuracy of this implementation. Be aware that PHP + // will truncate the coeficcients to 14 digits. + + // You have permission to use and distribute this function freely for + // whatever purpose you want, but please show common courtesy and give credit + // where credit is due. + + // Input paramater is $p - probability - where 0 < p < 1. + + // Coefficients in rational approximations + static $a = array( 1 => -3.969683028665376e+01, + 2 => 2.209460984245205e+02, + 3 => -2.759285104469687e+02, + 4 => 1.383577518672690e+02, + 5 => -3.066479806614716e+01, + 6 => 2.506628277459239e+00 + ); + + static $b = array( 1 => -5.447609879822406e+01, + 2 => 1.615858368580409e+02, + 3 => -1.556989798598866e+02, + 4 => 6.680131188771972e+01, + 5 => -1.328068155288572e+01 + ); + + static $c = array( 1 => -7.784894002430293e-03, + 2 => -3.223964580411365e-01, + 3 => -2.400758277161838e+00, + 4 => -2.549732539343734e+00, + 5 => 4.374664141464968e+00, + 6 => 2.938163982698783e+00 + ); + + static $d = array( 1 => 7.784695709041462e-03, + 2 => 3.224671290700398e-01, + 3 => 2.445134137142996e+00, + 4 => 3.754408661907416e+00 + ); + + // Define lower and upper region break-points. + $p_low = 0.02425; //Use lower region approx. below this + $p_high = 1 - $p_low; //Use upper region approx. above this + + if (0 < $p && $p < $p_low) { + // Rational approximation for lower region. + $q = sqrt(-2 * log($p)); + return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / + (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); + } elseif ($p_low <= $p && $p <= $p_high) { + // Rational approximation for central region. + $q = $p - 0.5; + $r = $q * $q; + return ((((($a[1] * $r + $a[2]) * $r + $a[3]) * $r + $a[4]) * $r + $a[5]) * $r + $a[6]) * $q / + ((((($b[1] * $r + $b[2]) * $r + $b[3]) * $r + $b[4]) * $r + $b[5]) * $r + 1); + } elseif ($p_high < $p && $p < 1) { + // Rational approximation for upper region. + $q = sqrt(-2 * log(1 - $p)); + return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / + (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); + } + // If 0 < p < 1, return a null value + return PHPExcel_Calculation_Functions::NULL(); + } // function _inverse_ncdf() + + + private static function _inverse_ncdf2($prob) { + // Approximation of inverse standard normal CDF developed by + // B. Moro, "The Full Monte," Risk 8(2), Feb 1995, 57-58. + + $a1 = 2.50662823884; + $a2 = -18.61500062529; + $a3 = 41.39119773534; + $a4 = -25.44106049637; + + $b1 = -8.4735109309; + $b2 = 23.08336743743; + $b3 = -21.06224101826; + $b4 = 3.13082909833; + + $c1 = 0.337475482272615; + $c2 = 0.976169019091719; + $c3 = 0.160797971491821; + $c4 = 2.76438810333863E-02; + $c5 = 3.8405729373609E-03; + $c6 = 3.951896511919E-04; + $c7 = 3.21767881768E-05; + $c8 = 2.888167364E-07; + $c9 = 3.960315187E-07; + + $y = $prob - 0.5; + if (abs($y) < 0.42) { + $z = ($y * $y); + $z = $y * ((($a4 * $z + $a3) * $z + $a2) * $z + $a1) / (((($b4 * $z + $b3) * $z + $b2) * $z + $b1) * $z + 1); + } else { + if ($y > 0) { + $z = log(-log(1 - $prob)); + } else { + $z = log(-log($prob)); + } + $z = $c1 + $z * ($c2 + $z * ($c3 + $z * ($c4 + $z * ($c5 + $z * ($c6 + $z * ($c7 + $z * ($c8 + $z * $c9))))))); + if ($y < 0) { + $z = -$z; + } + } + return $z; + } // function _inverse_ncdf2() + + + private static function _inverse_ncdf3($p) { + // ALGORITHM AS241 APPL. STATIST. (1988) VOL. 37, NO. 3. + // Produces the normal deviate Z corresponding to a given lower + // tail area of P; Z is accurate to about 1 part in 10**16. + // + // This is a PHP version of the original FORTRAN code that can + // be found at http://lib.stat.cmu.edu/apstat/ + $split1 = 0.425; + $split2 = 5; + $const1 = 0.180625; + $const2 = 1.6; + + // coefficients for p close to 0.5 + $a0 = 3.3871328727963666080; + $a1 = 1.3314166789178437745E+2; + $a2 = 1.9715909503065514427E+3; + $a3 = 1.3731693765509461125E+4; + $a4 = 4.5921953931549871457E+4; + $a5 = 6.7265770927008700853E+4; + $a6 = 3.3430575583588128105E+4; + $a7 = 2.5090809287301226727E+3; + + $b1 = 4.2313330701600911252E+1; + $b2 = 6.8718700749205790830E+2; + $b3 = 5.3941960214247511077E+3; + $b4 = 2.1213794301586595867E+4; + $b5 = 3.9307895800092710610E+4; + $b6 = 2.8729085735721942674E+4; + $b7 = 5.2264952788528545610E+3; + + // coefficients for p not close to 0, 0.5 or 1. + $c0 = 1.42343711074968357734; + $c1 = 4.63033784615654529590; + $c2 = 5.76949722146069140550; + $c3 = 3.64784832476320460504; + $c4 = 1.27045825245236838258; + $c5 = 2.41780725177450611770E-1; + $c6 = 2.27238449892691845833E-2; + $c7 = 7.74545014278341407640E-4; + + $d1 = 2.05319162663775882187; + $d2 = 1.67638483018380384940; + $d3 = 6.89767334985100004550E-1; + $d4 = 1.48103976427480074590E-1; + $d5 = 1.51986665636164571966E-2; + $d6 = 5.47593808499534494600E-4; + $d7 = 1.05075007164441684324E-9; + + // coefficients for p near 0 or 1. + $e0 = 6.65790464350110377720; + $e1 = 5.46378491116411436990; + $e2 = 1.78482653991729133580; + $e3 = 2.96560571828504891230E-1; + $e4 = 2.65321895265761230930E-2; + $e5 = 1.24266094738807843860E-3; + $e6 = 2.71155556874348757815E-5; + $e7 = 2.01033439929228813265E-7; + + $f1 = 5.99832206555887937690E-1; + $f2 = 1.36929880922735805310E-1; + $f3 = 1.48753612908506148525E-2; + $f4 = 7.86869131145613259100E-4; + $f5 = 1.84631831751005468180E-5; + $f6 = 1.42151175831644588870E-7; + $f7 = 2.04426310338993978564E-15; + + $q = $p - 0.5; + + // computation for p close to 0.5 + if (abs($q) <= split1) { + $R = $const1 - $q * $q; + $z = $q * ((((((($a7 * $R + $a6) * $R + $a5) * $R + $a4) * $R + $a3) * $R + $a2) * $R + $a1) * $R + $a0) / + ((((((($b7 * $R + $b6) * $R + $b5) * $R + $b4) * $R + $b3) * $R + $b2) * $R + $b1) * $R + 1); + } else { + if ($q < 0) { + $R = $p; + } else { + $R = 1 - $p; + } + $R = pow(-log($R),2); + + // computation for p not close to 0, 0.5 or 1. + If ($R <= $split2) { + $R = $R - $const2; + $z = ((((((($c7 * $R + $c6) * $R + $c5) * $R + $c4) * $R + $c3) * $R + $c2) * $R + $c1) * $R + $c0) / + ((((((($d7 * $R + $d6) * $R + $d5) * $R + $d4) * $R + $d3) * $R + $d2) * $R + $d1) * $R + 1); + } else { + // computation for p near 0 or 1. + $R = $R - $split2; + $z = ((((((($e7 * $R + $e6) * $R + $e5) * $R + $e4) * $R + $e3) * $R + $e2) * $R + $e1) * $R + $e0) / + ((((((($f7 * $R + $f6) * $R + $f5) * $R + $f4) * $R + $f3) * $R + $f2) * $R + $f1) * $R + 1); + } + if ($q < 0) { + $z = -$z; + } + } + return $z; + } // function _inverse_ncdf3() + + + /** + * AVEDEV + * + * Returns the average of the absolute deviations of data points from their mean. + * AVEDEV is a measure of the variability in a data set. + * + * Excel Function: + * AVEDEV(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function AVEDEV() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if ($aMean != PHPExcel_Calculation_Functions::DIV0()) { + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = abs($arg - $aMean); + } else { + $returnValue += abs($arg - $aMean); + } + ++$aCount; + } + } + + // Return + if ($aCount == 0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + return $returnValue / $aCount; + } + return PHPExcel_Calculation_Functions::NaN(); + } // function AVEDEV() + + + /** + * AVERAGE + * + * Returns the average (arithmetic mean) of the arguments + * + * Excel Function: + * AVERAGE(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function AVERAGE() { + $returnValue = $aCount = 0; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()) as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = $arg; + } else { + $returnValue += $arg; + } + ++$aCount; + } + } + + // Return + if ($aCount > 0) { + return $returnValue / $aCount; + } else { + return PHPExcel_Calculation_Functions::DIV0(); + } + } // function AVERAGE() + + + /** + * AVERAGEA + * + * Returns the average of its arguments, including numbers, text, and logical values + * + * Excel Function: + * AVERAGEA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function AVERAGEA() { + // Return value + $returnValue = null; + + $aCount = 0; + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()) as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if (is_null($returnValue)) { + $returnValue = $arg; + } else { + $returnValue += $arg; + } + ++$aCount; + } + } + } + + // Return + if ($aCount > 0) { + return $returnValue / $aCount; + } else { + return PHPExcel_Calculation_Functions::DIV0(); + } + } // function AVERAGEA() + + + /** + * AVERAGEIF + * + * Returns the average value from a range of cells that contain numbers within the list of arguments + * + * Excel Function: + * AVERAGEIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be checked. + * @return float + */ + public static function AVERAGEIF($aArgs,$condition,$averageArgs = array()) { + // Return value + $returnValue = 0; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $averageArgs = PHPExcel_Calculation_Functions::flattenArray($averageArgs); + if (empty($averageArgs)) { + $averageArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::_ifCondition($condition); + // Loop through arguments + $aCount = 0; + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { $arg = PHPExcel_Calculation::_wrapResult(strtoupper($arg)); } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue += $arg; + ++$aCount; + } + } + } + + // Return + if ($aCount > 0) { + return $returnValue / $aCount; + } else { + return PHPExcel_Calculation_Functions::DIV0(); + } + } // function AVERAGEIF() + + + /** + * BETADIST + * + * Returns the beta distribution. + * + * @param float $value Value at which you want to evaluate the distribution + * @param float $alpha Parameter to the distribution + * @param float $beta Parameter to the distribution + * @param boolean $cumulative + * @return float + * + */ + public static function BETADIST($value,$alpha,$beta,$rMin=0,$rMax=1) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + $rMin = PHPExcel_Calculation_Functions::flattenSingleValue($rMin); + $rMax = PHPExcel_Calculation_Functions::flattenSingleValue($rMax); + + if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) { + if (($value < $rMin) || ($value > $rMax) || ($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($rMin > $rMax) { + $tmp = $rMin; + $rMin = $rMax; + $rMax = $tmp; + } + $value -= $rMin; + $value /= ($rMax - $rMin); + return self::_incompleteBeta($value,$alpha,$beta); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BETADIST() + + + /** + * BETAINV + * + * Returns the inverse of the beta distribution. + * + * @param float $probability Probability at which you want to evaluate the distribution + * @param float $alpha Parameter to the distribution + * @param float $beta Parameter to the distribution + * @param boolean $cumulative + * @return float + * + */ + public static function BETAINV($probability,$alpha,$beta,$rMin=0,$rMax=1) { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + $rMin = PHPExcel_Calculation_Functions::flattenSingleValue($rMin); + $rMax = PHPExcel_Calculation_Functions::flattenSingleValue($rMax); + + if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) { + if (($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax) || ($probability <= 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($rMin > $rMax) { + $tmp = $rMin; + $rMin = $rMax; + $rMax = $tmp; + } + $a = 0; + $b = 2; + + $i = 0; + while ((($b - $a) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + $guess = ($a + $b) / 2; + $result = self::BETADIST($guess, $alpha, $beta); + if (($result == $probability) || ($result == 0)) { + $b = $a; + } elseif ($result > $probability) { + $b = $guess; + } else { + $a = $guess; + } + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return round($rMin + $guess * ($rMax - $rMin),12); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BETAINV() + + + /** + * BINOMDIST + * + * Returns the individual term binomial distribution probability. Use BINOMDIST in problems with + * a fixed number of tests or trials, when the outcomes of any trial are only success or failure, + * when trials are independent, and when the probability of success is constant throughout the + * experiment. For example, BINOMDIST can calculate the probability that two of the next three + * babies born are male. + * + * @param float $value Number of successes in trials + * @param float $trials Number of trials + * @param float $probability Probability of success on each trial + * @param boolean $cumulative + * @return float + * + * @todo Cumulative distribution function + * + */ + public static function BINOMDIST($value, $trials, $probability, $cumulative) { + $value = floor(PHPExcel_Calculation_Functions::flattenSingleValue($value)); + $trials = floor(PHPExcel_Calculation_Functions::flattenSingleValue($trials)); + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + + if ((is_numeric($value)) && (is_numeric($trials)) && (is_numeric($probability))) { + if (($value < 0) || ($value > $trials)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + $summer = 0; + for ($i = 0; $i <= $value; ++$i) { + $summer += PHPExcel_Calculation_MathTrig::COMBIN($trials,$i) * pow($probability,$i) * pow(1 - $probability,$trials - $i); + } + return $summer; + } else { + return PHPExcel_Calculation_MathTrig::COMBIN($trials,$value) * pow($probability,$value) * pow(1 - $probability,$trials - $value) ; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function BINOMDIST() + + + /** + * CHIDIST + * + * Returns the one-tailed probability of the chi-squared distribution. + * + * @param float $value Value for the function + * @param float $degrees degrees of freedom + * @return float + */ + public static function CHIDIST($value, $degrees) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + + if ((is_numeric($value)) && (is_numeric($degrees))) { + if ($degrees < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($value < 0) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + return 1; + } + return PHPExcel_Calculation_Functions::NaN(); + } + return 1 - (self::_incompleteGamma($degrees/2,$value/2) / self::_gamma($degrees/2)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function CHIDIST() + + + /** + * CHIINV + * + * Returns the one-tailed probability of the chi-squared distribution. + * + * @param float $probability Probability for the function + * @param float $degrees degrees of freedom + * @return float + */ + public static function CHIINV($probability, $degrees) { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + + if ((is_numeric($probability)) && (is_numeric($degrees))) { + + $xLo = 100; + $xHi = 0; + + $x = $xNew = 1; + $dx = 1; + $i = 0; + + while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + // Apply Newton-Raphson step + $result = self::CHIDIST($x, $degrees); + $error = $result - $probability; + if ($error == 0.0) { + $dx = 0; + } elseif ($error < 0.0) { + $xLo = $x; + } else { + $xHi = $x; + } + // Avoid division by zero + if ($result != 0.0) { + $dx = $error / $result; + $xNew = $x - $dx; + } + // If the NR fails to converge (which for example may be the + // case if the initial guess is too rough) we apply a bisection + // step to determine a more narrow interval around the root. + if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) { + $xNew = ($xLo + $xHi) / 2; + $dx = $xNew - $x; + } + $x = $xNew; + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return round($x,12); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function CHIINV() + + + /** + * CONFIDENCE + * + * Returns the confidence interval for a population mean + * + * @param float $alpha + * @param float $stdDev Standard Deviation + * @param float $size + * @return float + * + */ + public static function CONFIDENCE($alpha,$stdDev,$size) { + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + $size = floor(PHPExcel_Calculation_Functions::flattenSingleValue($size)); + + if ((is_numeric($alpha)) && (is_numeric($stdDev)) && (is_numeric($size))) { + if (($alpha <= 0) || ($alpha >= 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($stdDev <= 0) || ($size < 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return self::NORMSINV(1 - $alpha / 2) * $stdDev / sqrt($size); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function CONFIDENCE() + + + /** + * CORREL + * + * Returns covariance, the average of the products of deviations for each data point pair. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function CORREL($yValues,$xValues=null) { + if ((is_null($xValues)) || (!is_array($yValues)) || (!is_array($xValues))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getCorrelation(); + } // function CORREL() + + + /** + * COUNT + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * COUNT(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return int + */ + public static function COUNT() { + // Return value + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + ++$returnValue; + } + } + + // Return + return $returnValue; + } // function COUNT() + + + /** + * COUNTA + * + * Counts the number of cells that are not empty within the list of arguments + * + * Excel Function: + * COUNTA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return int + */ + public static function COUNTA() { + // Return value + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric, boolean or string value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + ++$returnValue; + } + } + + // Return + return $returnValue; + } // function COUNTA() + + + /** + * COUNTBLANK + * + * Counts the number of empty cells within the list of arguments + * + * Excel Function: + * COUNTBLANK(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return int + */ + public static function COUNTBLANK() { + // Return value + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a blank cell? + if ((is_null($arg)) || ((is_string($arg)) && ($arg == ''))) { + ++$returnValue; + } + } + + // Return + return $returnValue; + } // function COUNTBLANK() + + + /** + * COUNTIF + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * COUNTIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be counted. + * @return int + */ + public static function COUNTIF($aArgs,$condition) { + // Return value + $returnValue = 0; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $condition = PHPExcel_Calculation_Functions::_ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $arg) { + if (!is_numeric($arg)) { $arg = PHPExcel_Calculation::_wrapResult(strtoupper($arg)); } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is it a value within our criteria + ++$returnValue; + } + } + + // Return + return $returnValue; + } // function COUNTIF() + + + /** + * COVAR + * + * Returns covariance, the average of the products of deviations for each data point pair. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function COVAR($yValues,$xValues) { + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getCovariance(); + } // function COVAR() + + + /** + * CRITBINOM + * + * Returns the smallest value for which the cumulative binomial distribution is greater + * than or equal to a criterion value + * + * See http://support.microsoft.com/kb/828117/ for details of the algorithm used + * + * @param float $trials number of Bernoulli trials + * @param float $probability probability of a success on each trial + * @param float $alpha criterion value + * @return int + * + * @todo Warning. This implementation differs from the algorithm detailed on the MS + * web site in that $CumPGuessMinus1 = $CumPGuess - 1 rather than $CumPGuess - $PGuess + * This eliminates a potential endless loop error, but may have an adverse affect on the + * accuracy of the function (although all my tests have so far returned correct results). + * + */ + public static function CRITBINOM($trials, $probability, $alpha) { + $trials = floor(PHPExcel_Calculation_Functions::flattenSingleValue($trials)); + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + + if ((is_numeric($trials)) && (is_numeric($probability)) && (is_numeric($alpha))) { + if ($trials < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($alpha < 0) || ($alpha > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($alpha <= 0.5) { + $t = sqrt(log(1 / ($alpha * $alpha))); + $trialsApprox = 0 - ($t + (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t)); + } else { + $t = sqrt(log(1 / pow(1 - $alpha,2))); + $trialsApprox = $t - (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t); + } + $Guess = floor($trials * $probability + $trialsApprox * sqrt($trials * $probability * (1 - $probability))); + if ($Guess < 0) { + $Guess = 0; + } elseif ($Guess > $trials) { + $Guess = $trials; + } + + $TotalUnscaledProbability = $UnscaledPGuess = $UnscaledCumPGuess = 0.0; + $EssentiallyZero = 10e-12; + + $m = floor($trials * $probability); + ++$TotalUnscaledProbability; + if ($m == $Guess) { ++$UnscaledPGuess; } + if ($m <= $Guess) { ++$UnscaledCumPGuess; } + + $PreviousValue = 1; + $Done = False; + $k = $m + 1; + while ((!$Done) && ($k <= $trials)) { + $CurrentValue = $PreviousValue * ($trials - $k + 1) * $probability / ($k * (1 - $probability)); + $TotalUnscaledProbability += $CurrentValue; + if ($k == $Guess) { $UnscaledPGuess += $CurrentValue; } + if ($k <= $Guess) { $UnscaledCumPGuess += $CurrentValue; } + if ($CurrentValue <= $EssentiallyZero) { $Done = True; } + $PreviousValue = $CurrentValue; + ++$k; + } + + $PreviousValue = 1; + $Done = False; + $k = $m - 1; + while ((!$Done) && ($k >= 0)) { + $CurrentValue = $PreviousValue * $k + 1 * (1 - $probability) / (($trials - $k) * $probability); + $TotalUnscaledProbability += $CurrentValue; + if ($k == $Guess) { $UnscaledPGuess += $CurrentValue; } + if ($k <= $Guess) { $UnscaledCumPGuess += $CurrentValue; } + if ($CurrentValue <= $EssentiallyZero) { $Done = True; } + $PreviousValue = $CurrentValue; + --$k; + } + + $PGuess = $UnscaledPGuess / $TotalUnscaledProbability; + $CumPGuess = $UnscaledCumPGuess / $TotalUnscaledProbability; + +// $CumPGuessMinus1 = $CumPGuess - $PGuess; + $CumPGuessMinus1 = $CumPGuess - 1; + + while (True) { + if (($CumPGuessMinus1 < $alpha) && ($CumPGuess >= $alpha)) { + return $Guess; + } elseif (($CumPGuessMinus1 < $alpha) && ($CumPGuess < $alpha)) { + $PGuessPlus1 = $PGuess * ($trials - $Guess) * $probability / $Guess / (1 - $probability); + $CumPGuessMinus1 = $CumPGuess; + $CumPGuess = $CumPGuess + $PGuessPlus1; + $PGuess = $PGuessPlus1; + ++$Guess; + } elseif (($CumPGuessMinus1 >= $alpha) && ($CumPGuess >= $alpha)) { + $PGuessMinus1 = $PGuess * $Guess * (1 - $probability) / ($trials - $Guess + 1) / $probability; + $CumPGuess = $CumPGuessMinus1; + $CumPGuessMinus1 = $CumPGuessMinus1 - $PGuess; + $PGuess = $PGuessMinus1; + --$Guess; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function CRITBINOM() + + + /** + * DEVSQ + * + * Returns the sum of squares of deviations of data points from their sample mean. + * + * Excel Function: + * DEVSQ(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function DEVSQ() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if ($aMean != PHPExcel_Calculation_Functions::DIV0()) { + $aCount = -1; + foreach ($aArgs as $k => $arg) { + // Is it a numeric value? + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean),2); + } else { + $returnValue += pow(($arg - $aMean),2); + } + ++$aCount; + } + } + + // Return + if (is_null($returnValue)) { + return PHPExcel_Calculation_Functions::NaN(); + } else { + return $returnValue; + } + } + return self::NA(); + } // function DEVSQ() + + + /** + * EXPONDIST + * + * Returns the exponential distribution. Use EXPONDIST to model the time between events, + * such as how long an automated bank teller takes to deliver cash. For example, you can + * use EXPONDIST to determine the probability that the process takes at most 1 minute. + * + * @param float $value Value of the function + * @param float $lambda The parameter value + * @param boolean $cumulative + * @return float + */ + public static function EXPONDIST($value, $lambda, $cumulative) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $lambda = PHPExcel_Calculation_Functions::flattenSingleValue($lambda); + $cumulative = PHPExcel_Calculation_Functions::flattenSingleValue($cumulative); + + if ((is_numeric($value)) && (is_numeric($lambda))) { + if (($value < 0) || ($lambda < 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return 1 - exp(0-$value*$lambda); + } else { + return $lambda * exp(0-$value*$lambda); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function EXPONDIST() + + + /** + * FISHER + * + * Returns the Fisher transformation at x. This transformation produces a function that + * is normally distributed rather than skewed. Use this function to perform hypothesis + * testing on the correlation coefficient. + * + * @param float $value + * @return float + */ + public static function FISHER($value) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_numeric($value)) { + if (($value <= -1) || ($value >= 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return 0.5 * log((1+$value)/(1-$value)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function FISHER() + + + /** + * FISHERINV + * + * Returns the inverse of the Fisher transformation. Use this transformation when + * analyzing correlations between ranges or arrays of data. If y = FISHER(x), then + * FISHERINV(y) = x. + * + * @param float $value + * @return float + */ + public static function FISHERINV($value) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_numeric($value)) { + return (exp(2 * $value) - 1) / (exp(2 * $value) + 1); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function FISHERINV() + + + /** + * FORECAST + * + * Calculates, or predicts, a future value by using existing values. The predicted value is a y-value for a given x-value. + * + * @param float Value of X for which we want to find Y + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function FORECAST($xValue,$yValues,$xValues) { + $xValue = PHPExcel_Calculation_Functions::flattenSingleValue($xValue); + if (!is_numeric($xValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getValueOfYForX($xValue); + } // function FORECAST() + + + /** + * GAMMADIST + * + * Returns the gamma distribution. + * + * @param float $value Value at which you want to evaluate the distribution + * @param float $a Parameter to the distribution + * @param float $b Parameter to the distribution + * @param boolean $cumulative + * @return float + * + */ + public static function GAMMADIST($value,$a,$b,$cumulative) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $a = PHPExcel_Calculation_Functions::flattenSingleValue($a); + $b = PHPExcel_Calculation_Functions::flattenSingleValue($b); + + if ((is_numeric($value)) && (is_numeric($a)) && (is_numeric($b))) { + if (($value < 0) || ($a <= 0) || ($b <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return self::_incompleteGamma($a,$value / $b) / self::_gamma($a); + } else { + return (1 / (pow($b,$a) * self::_gamma($a))) * pow($value,$a-1) * exp(0-($value / $b)); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function GAMMADIST() + + + /** + * GAMMAINV + * + * Returns the inverse of the beta distribution. + * + * @param float $probability Probability at which you want to evaluate the distribution + * @param float $alpha Parameter to the distribution + * @param float $beta Parameter to the distribution + * @return float + * + */ + public static function GAMMAINV($probability,$alpha,$beta) { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + + if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta))) { + if (($alpha <= 0) || ($beta <= 0) || ($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $xLo = 0; + $xHi = $alpha * $beta * 5; + + $x = $xNew = 1; + $error = $pdf = 0; + $dx = 1024; + $i = 0; + + while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + // Apply Newton-Raphson step + $error = self::GAMMADIST($x, $alpha, $beta, True) - $probability; + if ($error < 0.0) { + $xLo = $x; + } else { + $xHi = $x; + } + $pdf = self::GAMMADIST($x, $alpha, $beta, False); + // Avoid division by zero + if ($pdf != 0.0) { + $dx = $error / $pdf; + $xNew = $x - $dx; + } + // If the NR fails to converge (which for example may be the + // case if the initial guess is too rough) we apply a bisection + // step to determine a more narrow interval around the root. + if (($xNew < $xLo) || ($xNew > $xHi) || ($pdf == 0.0)) { + $xNew = ($xLo + $xHi) / 2; + $dx = $xNew - $x; + } + $x = $xNew; + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return $x; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function GAMMAINV() + + + /** + * GAMMALN + * + * Returns the natural logarithm of the gamma function. + * + * @param float $value + * @return float + */ + public static function GAMMALN($value) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_numeric($value)) { + if ($value <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return log(self::_gamma($value)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function GAMMALN() + + + /** + * GEOMEAN + * + * Returns the geometric mean of an array or range of positive data. For example, you + * can use GEOMEAN to calculate average growth rate given compound interest with + * variable rates. + * + * Excel Function: + * GEOMEAN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function GEOMEAN() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + $aMean = PHPExcel_Calculation_MathTrig::PRODUCT($aArgs); + if (is_numeric($aMean) && ($aMean > 0)) { + $aCount = self::COUNT($aArgs) ; + if (self::MIN($aArgs) > 0) { + return pow($aMean, (1 / $aCount)); + } + } + return PHPExcel_Calculation_Functions::NaN(); + } // GEOMEAN() + + + /** + * GROWTH + * + * Returns values along a predicted emponential trend + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param array of mixed Values of X for which we want to find Y + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @return array of float + */ + public static function GROWTH($yValues,$xValues=array(),$newValues=array(),$const=True) { + $yValues = PHPExcel_Calculation_Functions::flattenArray($yValues); + $xValues = PHPExcel_Calculation_Functions::flattenArray($xValues); + $newValues = PHPExcel_Calculation_Functions::flattenArray($newValues); + $const = (is_null($const)) ? True : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + + $bestFitExponential = trendClass::calculate(trendClass::TREND_EXPONENTIAL,$yValues,$xValues,$const); + if (empty($newValues)) { + $newValues = $bestFitExponential->getXValues(); + } + + $returnArray = array(); + foreach($newValues as $xValue) { + $returnArray[0][] = $bestFitExponential->getValueOfYForX($xValue); + } + + return $returnArray; + } // function GROWTH() + + + /** + * HARMEAN + * + * Returns the harmonic mean of a data set. The harmonic mean is the reciprocal of the + * arithmetic mean of reciprocals. + * + * Excel Function: + * HARMEAN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function HARMEAN() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::NA(); + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + if (self::MIN($aArgs) < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $aCount = 0; + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if ($arg <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (is_null($returnValue)) { + $returnValue = (1 / $arg); + } else { + $returnValue += (1 / $arg); + } + ++$aCount; + } + } + + // Return + if ($aCount > 0) { + return 1 / ($returnValue / $aCount); + } else { + return $returnValue; + } + } // function HARMEAN() + + + /** + * HYPGEOMDIST + * + * Returns the hypergeometric distribution. HYPGEOMDIST returns the probability of a given number of + * sample successes, given the sample size, population successes, and population size. + * + * @param float $sampleSuccesses Number of successes in the sample + * @param float $sampleNumber Size of the sample + * @param float $populationSuccesses Number of successes in the population + * @param float $populationNumber Population size + * @return float + * + */ + public static function HYPGEOMDIST($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber) { + $sampleSuccesses = floor(PHPExcel_Calculation_Functions::flattenSingleValue($sampleSuccesses)); + $sampleNumber = floor(PHPExcel_Calculation_Functions::flattenSingleValue($sampleNumber)); + $populationSuccesses = floor(PHPExcel_Calculation_Functions::flattenSingleValue($populationSuccesses)); + $populationNumber = floor(PHPExcel_Calculation_Functions::flattenSingleValue($populationNumber)); + + if ((is_numeric($sampleSuccesses)) && (is_numeric($sampleNumber)) && (is_numeric($populationSuccesses)) && (is_numeric($populationNumber))) { + if (($sampleSuccesses < 0) || ($sampleSuccesses > $sampleNumber) || ($sampleSuccesses > $populationSuccesses)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($sampleNumber <= 0) || ($sampleNumber > $populationNumber)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($populationSuccesses <= 0) || ($populationSuccesses > $populationNumber)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return PHPExcel_Calculation_MathTrig::COMBIN($populationSuccesses,$sampleSuccesses) * + PHPExcel_Calculation_MathTrig::COMBIN($populationNumber - $populationSuccesses,$sampleNumber - $sampleSuccesses) / + PHPExcel_Calculation_MathTrig::COMBIN($populationNumber,$sampleNumber); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function HYPGEOMDIST() + + + /** + * INTERCEPT + * + * Calculates the point at which a line will intersect the y-axis by using existing x-values and y-values. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function INTERCEPT($yValues,$xValues) { + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getIntersect(); + } // function INTERCEPT() + + + /** + * KURT + * + * Returns the kurtosis of a data set. Kurtosis characterizes the relative peakedness + * or flatness of a distribution compared with the normal distribution. Positive + * kurtosis indicates a relatively peaked distribution. Negative kurtosis indicates a + * relatively flat distribution. + * + * @param array Data Series + * @return float + */ + public static function KURT() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $mean = self::AVERAGE($aArgs); + $stdDev = self::STDEV($aArgs); + + if ($stdDev > 0) { + $count = $summer = 0; + // Loop through arguments + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summer += pow((($arg - $mean) / $stdDev),4) ; + ++$count; + } + } + } + + // Return + if ($count > 3) { + return $summer * ($count * ($count+1) / (($count-1) * ($count-2) * ($count-3))) - (3 * pow($count-1,2) / (($count-2) * ($count-3))); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } // function KURT() + + + /** + * LARGE + * + * Returns the nth largest value in a data set. You can use this function to + * select a value based on its relative standing. + * + * Excel Function: + * LARGE(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param int $entry Position (ordered from the largest) in the array or range of data to return + * @return float + * + */ + public static function LARGE() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = floor(array_pop($aArgs)); + + if ((is_numeric($entry)) && (!is_string($entry))) { + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $count = self::COUNT($mArgs); + $entry = floor(--$entry); + if (($entry < 0) || ($entry >= $count) || ($count == 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + rsort($mArgs); + return $mArgs[$entry]; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function LARGE() + + + /** + * LINEST + * + * Calculates the statistics for a line by using the "least squares" method to calculate a straight line that best fits your data, + * and then returns an array that describes the line. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @param boolean A logical value specifying whether to return additional regression statistics. + * @return array + */ + public static function LINEST($yValues,$xValues=null,$const=True,$stats=False) { + $const = (is_null($const)) ? True : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + $stats = (is_null($stats)) ? False : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($stats); + if (is_null($xValues)) $xValues = range(1,count(PHPExcel_Calculation_Functions::flattenArray($yValues))); + + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return 0; + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues,$const); + if ($stats) { + return array( array( $bestFitLinear->getSlope(), + $bestFitLinear->getSlopeSE(), + $bestFitLinear->getGoodnessOfFit(), + $bestFitLinear->getF(), + $bestFitLinear->getSSRegression(), + ), + array( $bestFitLinear->getIntersect(), + $bestFitLinear->getIntersectSE(), + $bestFitLinear->getStdevOfResiduals(), + $bestFitLinear->getDFResiduals(), + $bestFitLinear->getSSResiduals() + ) + ); + } else { + return array( $bestFitLinear->getSlope(), + $bestFitLinear->getIntersect() + ); + } + } // function LINEST() + + + /** + * LOGEST + * + * Calculates an exponential curve that best fits the X and Y data series, + * and then returns an array that describes the line. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @param boolean A logical value specifying whether to return additional regression statistics. + * @return array + */ + public static function LOGEST($yValues,$xValues=null,$const=True,$stats=False) { + $const = (is_null($const)) ? True : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + $stats = (is_null($stats)) ? False : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($stats); + if (is_null($xValues)) $xValues = range(1,count(PHPExcel_Calculation_Functions::flattenArray($yValues))); + + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + foreach($yValues as $value) { + if ($value <= 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return 1; + } + + $bestFitExponential = trendClass::calculate(trendClass::TREND_EXPONENTIAL,$yValues,$xValues,$const); + if ($stats) { + return array( array( $bestFitExponential->getSlope(), + $bestFitExponential->getSlopeSE(), + $bestFitExponential->getGoodnessOfFit(), + $bestFitExponential->getF(), + $bestFitExponential->getSSRegression(), + ), + array( $bestFitExponential->getIntersect(), + $bestFitExponential->getIntersectSE(), + $bestFitExponential->getStdevOfResiduals(), + $bestFitExponential->getDFResiduals(), + $bestFitExponential->getSSResiduals() + ) + ); + } else { + return array( $bestFitExponential->getSlope(), + $bestFitExponential->getIntersect() + ); + } + } // function LOGEST() + + + /** + * LOGINV + * + * Returns the inverse of the normal cumulative distribution + * + * @param float $value + * @return float + * + * @todo Try implementing P J Acklam's refinement algorithm for greater + * accuracy if I can get my head round the mathematics + * (as described at) http://home.online.no/~pjacklam/notes/invnorm/ + */ + public static function LOGINV($probability, $mean, $stdDev) { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if (($probability < 0) || ($probability > 1) || ($stdDev <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return exp($mean + $stdDev * self::NORMSINV($probability)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function LOGINV() + + + /** + * LOGNORMDIST + * + * Returns the cumulative lognormal distribution of x, where ln(x) is normally distributed + * with parameters mean and standard_dev. + * + * @param float $value + * @return float + */ + public static function LOGNORMDIST($value, $mean, $stdDev) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if (($value <= 0) || ($stdDev <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return self::NORMSDIST((log($value) - $mean) / $stdDev); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function LOGNORMDIST() + + + /** + * MAX + * + * MAX returns the value of the element of the values passed that has the highest value, + * with negative numbers considered smaller than positive numbers. + * + * Excel Function: + * MAX(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MAX() { + // Return value + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue = $arg; + } + } + } + + // Return + if(is_null($returnValue)) { + return 0; + } + return $returnValue; + } // function MAX() + + + /** + * MAXA + * + * Returns the greatest value in a list of arguments, including numbers, text, and logical values + * + * Excel Function: + * MAXA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MAXA() { + // Return value + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue = $arg; + } + } + } + + // Return + if(is_null($returnValue)) { + return 0; + } + return $returnValue; + } // function MAXA() + + + /** + * MAXIF + * + * Counts the maximum value within a range of cells that contain numbers within the list of arguments + * + * Excel Function: + * MAXIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be checked. + * @return float + */ + public static function MAXIF($aArgs,$condition,$sumArgs = array()) { + // Return value + $returnValue = null; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs); + if (empty($sumArgs)) { + $sumArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::_ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { $arg = PHPExcel_Calculation::_wrapResult(strtoupper($arg)); } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue = $arg; + } + } + } + + // Return + return $returnValue; + } // function MAXIF() + + + /** + * MEDIAN + * + * Returns the median of the given numbers. The median is the number in the middle of a set of numbers. + * + * Excel Function: + * MEDIAN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MEDIAN() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::NaN(); + + $mArgs = array(); + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + + $mValueCount = count($mArgs); + if ($mValueCount > 0) { + sort($mArgs,SORT_NUMERIC); + $mValueCount = $mValueCount / 2; + if ($mValueCount == floor($mValueCount)) { + $returnValue = ($mArgs[$mValueCount--] + $mArgs[$mValueCount]) / 2; + } else { + $mValueCount == floor($mValueCount); + $returnValue = $mArgs[$mValueCount]; + } + } + + // Return + return $returnValue; + } // function MEDIAN() + + + /** + * MIN + * + * MIN returns the value of the element of the values passed that has the smallest value, + * with negative numbers considered smaller than positive numbers. + * + * Excel Function: + * MIN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MIN() { + // Return value + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if ((is_null($returnValue)) || ($arg < $returnValue)) { + $returnValue = $arg; + } + } + } + + // Return + if(is_null($returnValue)) { + return 0; + } + return $returnValue; + } // function MIN() + + + /** + * MINA + * + * Returns the smallest value in a list of arguments, including numbers, text, and logical values + * + * Excel Function: + * MINA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MINA() { + // Return value + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if ((is_null($returnValue)) || ($arg < $returnValue)) { + $returnValue = $arg; + } + } + } + + // Return + if(is_null($returnValue)) { + return 0; + } + return $returnValue; + } // function MINA() + + + /** + * MINIF + * + * Returns the minimum value within a range of cells that contain numbers within the list of arguments + * + * Excel Function: + * MINIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be checked. + * @return float + */ + public static function MINIF($aArgs,$condition,$sumArgs = array()) { + // Return value + $returnValue = null; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs); + if (empty($sumArgs)) { + $sumArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::_ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { $arg = PHPExcel_Calculation::_wrapResult(strtoupper($arg)); } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + if ((is_null($returnValue)) || ($arg < $returnValue)) { + $returnValue = $arg; + } + } + } + + // Return + return $returnValue; + } // function MINIF() + + + // + // Special variant of array_count_values that isn't limited to strings and integers, + // but can work with floating point numbers as values + // + private static function _modeCalc($data) { + $frequencyArray = array(); + foreach($data as $datum) { + $found = False; + foreach($frequencyArray as $key => $value) { + if ((string) $value['value'] == (string) $datum) { + ++$frequencyArray[$key]['frequency']; + $found = True; + break; + } + } + if (!$found) { + $frequencyArray[] = array('value' => $datum, + 'frequency' => 1 ); + } + } + + foreach($frequencyArray as $key => $value) { + $frequencyList[$key] = $value['frequency']; + $valueList[$key] = $value['value']; + } + array_multisort($frequencyList, SORT_DESC, $valueList, SORT_ASC, SORT_NUMERIC, $frequencyArray); + + if ($frequencyArray[0]['frequency'] == 1) { + return PHPExcel_Calculation_Functions::NA(); + } + return $frequencyArray[0]['value']; + } // function _modeCalc() + + + /** + * MODE + * + * Returns the most frequently occurring, or repetitive, value in an array or range of data + * + * Excel Function: + * MODE(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MODE() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::NA(); + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + + if (!empty($mArgs)) { + return self::_modeCalc($mArgs); + } + + // Return + return $returnValue; + } // function MODE() + + + /** + * NEGBINOMDIST + * + * Returns the negative binomial distribution. NEGBINOMDIST returns the probability that + * there will be number_f failures before the number_s-th success, when the constant + * probability of a success is probability_s. This function is similar to the binomial + * distribution, except that the number of successes is fixed, and the number of trials is + * variable. Like the binomial, trials are assumed to be independent. + * + * @param float $failures Number of Failures + * @param float $successes Threshold number of Successes + * @param float $probability Probability of success on each trial + * @return float + * + */ + public static function NEGBINOMDIST($failures, $successes, $probability) { + $failures = floor(PHPExcel_Calculation_Functions::flattenSingleValue($failures)); + $successes = floor(PHPExcel_Calculation_Functions::flattenSingleValue($successes)); + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + + if ((is_numeric($failures)) && (is_numeric($successes)) && (is_numeric($probability))) { + if (($failures < 0) || ($successes < 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + if (($failures + $successes - 1) <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + } + return (PHPExcel_Calculation_MathTrig::COMBIN($failures + $successes - 1,$successes - 1)) * (pow($probability,$successes)) * (pow(1 - $probability,$failures)) ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function NEGBINOMDIST() + + + /** + * NORMDIST + * + * Returns the normal distribution for the specified mean and standard deviation. This + * function has a very wide range of applications in statistics, including hypothesis + * testing. + * + * @param float $value + * @param float $mean Mean Value + * @param float $stdDev Standard Deviation + * @param boolean $cumulative + * @return float + * + */ + public static function NORMDIST($value, $mean, $stdDev, $cumulative) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if ($stdDev < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return 0.5 * (1 + PHPExcel_Calculation_Engineering::_erfVal(($value - $mean) / ($stdDev * sqrt(2)))); + } else { + return (1 / (SQRT2PI * $stdDev)) * exp(0 - (pow($value - $mean,2) / (2 * ($stdDev * $stdDev)))); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function NORMDIST() + + + /** + * NORMINV + * + * Returns the inverse of the normal cumulative distribution for the specified mean and standard deviation. + * + * @param float $value + * @param float $mean Mean Value + * @param float $stdDev Standard Deviation + * @return float + * + */ + public static function NORMINV($probability,$mean,$stdDev) { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($stdDev < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return (self::_inverse_ncdf($probability) * $stdDev) + $mean; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function NORMINV() + + + /** + * NORMSDIST + * + * Returns the standard normal cumulative distribution function. The distribution has + * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a + * table of standard normal curve areas. + * + * @param float $value + * @return float + */ + public static function NORMSDIST($value) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + return self::NORMDIST($value, 0, 1, True); + } // function NORMSDIST() + + + /** + * NORMSINV + * + * Returns the inverse of the standard normal cumulative distribution + * + * @param float $value + * @return float + */ + public static function NORMSINV($value) { + return self::NORMINV($value, 0, 1); + } // function NORMSINV() + + + /** + * PERCENTILE + * + * Returns the nth percentile of values in a range.. + * + * Excel Function: + * PERCENTILE(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param float $entry Percentile value in the range 0..1, inclusive. + * @return float + */ + public static function PERCENTILE() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = array_pop($aArgs); + + if ((is_numeric($entry)) && (!is_string($entry))) { + if (($entry < 0) || ($entry > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $mValueCount = count($mArgs); + if ($mValueCount > 0) { + sort($mArgs); + $count = self::COUNT($mArgs); + $index = $entry * ($count-1); + $iBase = floor($index); + if ($index == $iBase) { + return $mArgs[$index]; + } else { + $iNext = $iBase + 1; + $iProportion = $index - $iBase; + return $mArgs[$iBase] + (($mArgs[$iNext] - $mArgs[$iBase]) * $iProportion) ; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function PERCENTILE() + + + /** + * PERCENTRANK + * + * Returns the rank of a value in a data set as a percentage of the data set. + * + * @param array of number An array of, or a reference to, a list of numbers. + * @param number The number whose rank you want to find. + * @param number The number of significant digits for the returned percentage value. + * @return float + */ + public static function PERCENTRANK($valueSet,$value,$significance=3) { + $valueSet = PHPExcel_Calculation_Functions::flattenArray($valueSet); + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $significance = (is_null($significance)) ? 3 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($significance); + + foreach($valueSet as $key => $valueEntry) { + if (!is_numeric($valueEntry)) { + unset($valueSet[$key]); + } + } + sort($valueSet,SORT_NUMERIC); + $valueCount = count($valueSet); + if ($valueCount == 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $valueAdjustor = $valueCount - 1; + if (($value < $valueSet[0]) || ($value > $valueSet[$valueAdjustor])) { + return PHPExcel_Calculation_Functions::NA(); + } + + $pos = array_search($value,$valueSet); + if ($pos === False) { + $pos = 0; + $testValue = $valueSet[0]; + while ($testValue < $value) { + $testValue = $valueSet[++$pos]; + } + --$pos; + $pos += (($value - $valueSet[$pos]) / ($testValue - $valueSet[$pos])); + } + + return round($pos / $valueAdjustor,$significance); + } // function PERCENTRANK() + + + /** + * PERMUT + * + * Returns the number of permutations for a given number of objects that can be + * selected from number objects. A permutation is any set or subset of objects or + * events where internal order is significant. Permutations are different from + * combinations, for which the internal order is not significant. Use this function + * for lottery-style probability calculations. + * + * @param int $numObjs Number of different objects + * @param int $numInSet Number of objects in each permutation + * @return int Number of permutations + */ + public static function PERMUT($numObjs,$numInSet) { + $numObjs = PHPExcel_Calculation_Functions::flattenSingleValue($numObjs); + $numInSet = PHPExcel_Calculation_Functions::flattenSingleValue($numInSet); + + if ((is_numeric($numObjs)) && (is_numeric($numInSet))) { + $numInSet = floor($numInSet); + if ($numObjs < $numInSet) { + return PHPExcel_Calculation_Functions::NaN(); + } + return round(PHPExcel_Calculation_MathTrig::FACT($numObjs) / PHPExcel_Calculation_MathTrig::FACT($numObjs - $numInSet)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function PERMUT() + + + /** + * POISSON + * + * Returns the Poisson distribution. A common application of the Poisson distribution + * is predicting the number of events over a specific time, such as the number of + * cars arriving at a toll plaza in 1 minute. + * + * @param float $value + * @param float $mean Mean Value + * @param boolean $cumulative + * @return float + * + */ + public static function POISSON($value, $mean, $cumulative) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + + if ((is_numeric($value)) && (is_numeric($mean))) { + if (($value <= 0) || ($mean <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + $summer = 0; + for ($i = 0; $i <= floor($value); ++$i) { + $summer += pow($mean,$i) / PHPExcel_Calculation_MathTrig::FACT($i); + } + return exp(0-$mean) * $summer; + } else { + return (exp(0-$mean) * pow($mean,$value)) / PHPExcel_Calculation_MathTrig::FACT($value); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function POISSON() + + + /** + * QUARTILE + * + * Returns the quartile of a data set. + * + * Excel Function: + * QUARTILE(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param int $entry Quartile value in the range 1..3, inclusive. + * @return float + */ + public static function QUARTILE() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = floor(array_pop($aArgs)); + + if ((is_numeric($entry)) && (!is_string($entry))) { + $entry /= 4; + if (($entry < 0) || ($entry > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return self::PERCENTILE($aArgs,$entry); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function QUARTILE() + + + /** + * RANK + * + * Returns the rank of a number in a list of numbers. + * + * @param number The number whose rank you want to find. + * @param array of number An array of, or a reference to, a list of numbers. + * @param mixed Order to sort the values in the value set + * @return float + */ + public static function RANK($value,$valueSet,$order=0) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $valueSet = PHPExcel_Calculation_Functions::flattenArray($valueSet); + $order = (is_null($order)) ? 0 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($order); + + foreach($valueSet as $key => $valueEntry) { + if (!is_numeric($valueEntry)) { + unset($valueSet[$key]); + } + } + + if ($order == 0) { + rsort($valueSet,SORT_NUMERIC); + } else { + sort($valueSet,SORT_NUMERIC); + } + $pos = array_search($value,$valueSet); + if ($pos === False) { + return PHPExcel_Calculation_Functions::NA(); + } + + return ++$pos; + } // function RANK() + + + /** + * RSQ + * + * Returns the square of the Pearson product moment correlation coefficient through data points in known_y's and known_x's. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function RSQ($yValues,$xValues) { + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getGoodnessOfFit(); + } // function RSQ() + + + /** + * SKEW + * + * Returns the skewness of a distribution. Skewness characterizes the degree of asymmetry + * of a distribution around its mean. Positive skewness indicates a distribution with an + * asymmetric tail extending toward more positive values. Negative skewness indicates a + * distribution with an asymmetric tail extending toward more negative values. + * + * @param array Data Series + * @return float + */ + public static function SKEW() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $mean = self::AVERAGE($aArgs); + $stdDev = self::STDEV($aArgs); + + $count = $summer = 0; + // Loop through arguments + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summer += pow((($arg - $mean) / $stdDev),3) ; + ++$count; + } + } + } + + // Return + if ($count > 2) { + return $summer * ($count / (($count-1) * ($count-2))); + } + return PHPExcel_Calculation_Functions::DIV0(); + } // function SKEW() + + + /** + * SLOPE + * + * Returns the slope of the linear regression line through data points in known_y's and known_x's. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function SLOPE($yValues,$xValues) { + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getSlope(); + } // function SLOPE() + + + /** + * SMALL + * + * Returns the nth smallest value in a data set. You can use this function to + * select a value based on its relative standing. + * + * Excel Function: + * SMALL(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param int $entry Position (ordered from the smallest) in the array or range of data to return + * @return float + */ + public static function SMALL() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = array_pop($aArgs); + + if ((is_numeric($entry)) && (!is_string($entry))) { + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $count = self::COUNT($mArgs); + $entry = floor(--$entry); + if (($entry < 0) || ($entry >= $count) || ($count == 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + sort($mArgs); + return $mArgs[$entry]; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SMALL() + + + /** + * STANDARDIZE + * + * Returns a normalized value from a distribution characterized by mean and standard_dev. + * + * @param float $value Value to normalize + * @param float $mean Mean Value + * @param float $stdDev Standard Deviation + * @return float Standardized value + */ + public static function STANDARDIZE($value,$mean,$stdDev) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if ($stdDev <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return ($value - $mean) / $stdDev ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function STANDARDIZE() + + + /** + * STDEV + * + * Estimates standard deviation based on a sample. The standard deviation is a measure of how + * widely values are dispersed from the average value (the mean). + * + * Excel Function: + * STDEV(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEV() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if (!is_null($aMean)) { + $aCount = -1; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean),2); + } else { + $returnValue += pow(($arg - $aMean),2); + } + ++$aCount; + } + } + + // Return + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } // function STDEV() + + + /** + * STDEVA + * + * Estimates standard deviation based on a sample, including numbers, text, and logical values + * + * Excel Function: + * STDEVA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEVA() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGEA($aArgs); + if (!is_null($aMean)) { + $aCount = -1; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean),2); + } else { + $returnValue += pow(($arg - $aMean),2); + } + ++$aCount; + } + } + } + + // Return + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } // function STDEVA() + + + /** + * STDEVP + * + * Calculates standard deviation based on the entire population + * + * Excel Function: + * STDEVP(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEVP() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if (!is_null($aMean)) { + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean),2); + } else { + $returnValue += pow(($arg - $aMean),2); + } + ++$aCount; + } + } + + // Return + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } // function STDEVP() + + + /** + * STDEVPA + * + * Calculates standard deviation based on the entire population, including numbers, text, and logical values + * + * Excel Function: + * STDEVPA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEVPA() { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGEA($aArgs); + if (!is_null($aMean)) { + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean),2); + } else { + $returnValue += pow(($arg - $aMean),2); + } + ++$aCount; + } + } + } + + // Return + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } // function STDEVPA() + + + /** + * STEYX + * + * Returns the standard error of the predicted y-value for each x in the regression. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function STEYX($yValues,$xValues) { + if (!self::_checkTrendArrays($yValues,$xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues); + return $bestFitLinear->getStdevOfResiduals(); + } // function STEYX() + + + /** + * TDIST + * + * Returns the probability of Student's T distribution. + * + * @param float $value Value for the function + * @param float $degrees degrees of freedom + * @param float $tails number of tails (1 or 2) + * @return float + */ + public static function TDIST($value, $degrees, $tails) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + $tails = floor(PHPExcel_Calculation_Functions::flattenSingleValue($tails)); + + if ((is_numeric($value)) && (is_numeric($degrees)) && (is_numeric($tails))) { + if (($value < 0) || ($degrees < 1) || ($tails < 1) || ($tails > 2)) { + return PHPExcel_Calculation_Functions::NaN(); + } + // tdist, which finds the probability that corresponds to a given value + // of t with k degrees of freedom. This algorithm is translated from a + // pascal function on p81 of "Statistical Computing in Pascal" by D + // Cooke, A H Craven & G M Clark (1985: Edward Arnold (Pubs.) Ltd: + // London). The above Pascal algorithm is itself a translation of the + // fortran algoritm "AS 3" by B E Cooper of the Atlas Computer + // Laboratory as reported in (among other places) "Applied Statistics + // Algorithms", editied by P Griffiths and I D Hill (1985; Ellis + // Horwood Ltd.; W. Sussex, England). + $tterm = $degrees; + $ttheta = atan2($value,sqrt($tterm)); + $tc = cos($ttheta); + $ts = sin($ttheta); + $tsum = 0; + + if (($degrees % 2) == 1) { + $ti = 3; + $tterm = $tc; + } else { + $ti = 2; + $tterm = 1; + } + + $tsum = $tterm; + while ($ti < $degrees) { + $tterm *= $tc * $tc * ($ti - 1) / $ti; + $tsum += $tterm; + $ti += 2; + } + $tsum *= $ts; + if (($degrees % 2) == 1) { $tsum = M_2DIVPI * ($tsum + $ttheta); } + $tValue = 0.5 * (1 + $tsum); + if ($tails == 1) { + return 1 - abs($tValue); + } else { + return 1 - abs((1 - $tValue) - $tValue); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function TDIST() + + + /** + * TINV + * + * Returns the one-tailed probability of the chi-squared distribution. + * + * @param float $probability Probability for the function + * @param float $degrees degrees of freedom + * @return float + */ + public static function TINV($probability, $degrees) { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + + if ((is_numeric($probability)) && (is_numeric($degrees))) { + $xLo = 100; + $xHi = 0; + + $x = $xNew = 1; + $dx = 1; + $i = 0; + + while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + // Apply Newton-Raphson step + $result = self::TDIST($x, $degrees, 2); + $error = $result - $probability; + if ($error == 0.0) { + $dx = 0; + } elseif ($error < 0.0) { + $xLo = $x; + } else { + $xHi = $x; + } + // Avoid division by zero + if ($result != 0.0) { + $dx = $error / $result; + $xNew = $x - $dx; + } + // If the NR fails to converge (which for example may be the + // case if the initial guess is too rough) we apply a bisection + // step to determine a more narrow interval around the root. + if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) { + $xNew = ($xLo + $xHi) / 2; + $dx = $xNew - $x; + } + $x = $xNew; + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return round($x,12); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function TINV() + + + /** + * TREND + * + * Returns values along a linear trend + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param array of mixed Values of X for which we want to find Y + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @return array of float + */ + public static function TREND($yValues,$xValues=array(),$newValues=array(),$const=True) { + $yValues = PHPExcel_Calculation_Functions::flattenArray($yValues); + $xValues = PHPExcel_Calculation_Functions::flattenArray($xValues); + $newValues = PHPExcel_Calculation_Functions::flattenArray($newValues); + $const = (is_null($const)) ? True : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR,$yValues,$xValues,$const); + if (empty($newValues)) { + $newValues = $bestFitLinear->getXValues(); + } + + $returnArray = array(); + foreach($newValues as $xValue) { + $returnArray[0][] = $bestFitLinear->getValueOfYForX($xValue); + } + + return $returnArray; + } // function TREND() + + + /** + * TRIMMEAN + * + * Returns the mean of the interior of a data set. TRIMMEAN calculates the mean + * taken by excluding a percentage of data points from the top and bottom tails + * of a data set. + * + * Excel Function: + * TRIMEAN(value1[,value2[, ...]],$discard) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param float $discard Percentage to discard + * @return float + */ + public static function TRIMMEAN() { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $percent = array_pop($aArgs); + + if ((is_numeric($percent)) && (!is_string($percent))) { + if (($percent < 0) || ($percent > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $discard = floor(self::COUNT($mArgs) * $percent / 2); + sort($mArgs); + for ($i=0; $i < $discard; ++$i) { + array_pop($mArgs); + array_shift($mArgs); + } + return self::AVERAGE($mArgs); + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function TRIMMEAN() + + + /** + * VARFunc + * + * Estimates variance based on a sample. + * + * Excel Function: + * VAR(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARFunc() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $aCount = 0; + foreach ($aArgs as $arg) { + if (is_bool($arg)) { $arg = (integer) $arg; } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + + // Return + if ($aCount > 1) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1)); + } + return $returnValue; + } // function VARFunc() + + + /** + * VARA + * + * Estimates variance based on a sample, including numbers, text, and logical values + * + * Excel Function: + * VARA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARA() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_string($arg)) && + (PHPExcel_Calculation_Functions::isValue($k))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ((is_string($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + } + + // Return + if ($aCount > 1) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1)); + } + return $returnValue; + } // function VARA() + + + /** + * VARP + * + * Calculates variance based on the entire population + * + * Excel Function: + * VARP(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARP() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $aCount = 0; + foreach ($aArgs as $arg) { + if (is_bool($arg)) { $arg = (integer) $arg; } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + + // Return + if ($aCount > 0) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * $aCount); + } + return $returnValue; + } // function VARP() + + + /** + * VARPA + * + * Calculates variance based on the entire population, including numbers, text, and logical values + * + * Excel Function: + * VARPA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARPA() { + // Return value + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_string($arg)) && + (PHPExcel_Calculation_Functions::isValue($k))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ((is_string($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + } + + // Return + if ($aCount > 0) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * $aCount); + } + return $returnValue; + } // function VARPA() + + + /** + * WEIBULL + * + * Returns the Weibull distribution. Use this distribution in reliability + * analysis, such as calculating a device's mean time to failure. + * + * @param float $value + * @param float $alpha Alpha Parameter + * @param float $beta Beta Parameter + * @param boolean $cumulative + * @return float + * + */ + public static function WEIBULL($value, $alpha, $beta, $cumulative) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + + if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta))) { + if (($value < 0) || ($alpha <= 0) || ($beta <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return 1 - exp(0 - pow($value / $beta,$alpha)); + } else { + return ($alpha / pow($beta,$alpha)) * pow($value,$alpha - 1) * exp(0 - pow($value / $beta,$alpha)); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function WEIBULL() + + + /** + * ZTEST + * + * Returns the Weibull distribution. Use this distribution in reliability + * analysis, such as calculating a device's mean time to failure. + * + * @param float $value + * @param float $alpha Alpha Parameter + * @param float $beta Beta Parameter + * @param boolean $cumulative + * @return float + * + */ + public static function ZTEST($dataSet, $m0, $sigma=null) { + $dataSet = PHPExcel_Calculation_Functions::flattenArrayIndexed($dataSet); + $m0 = PHPExcel_Calculation_Functions::flattenSingleValue($m0); + $sigma = PHPExcel_Calculation_Functions::flattenSingleValue($sigma); + + if (is_null($sigma)) { + $sigma = self::STDEV($dataSet); + } + $n = count($dataSet); + + return 1 - self::NORMSDIST((self::AVERAGE($dataSet) - $m0)/($sigma/SQRT($n))); + } // function ZTEST() + +} // class PHPExcel_Calculation_Statistical diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/TextData.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/TextData.php new file mode 100644 index 000000000..3289645f5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/TextData.php @@ -0,0 +1,598 @@ +=0 && ord($c{0}) <= 127) + return ord($c{0}); + if (ord($c{0}) >= 192 && ord($c{0}) <= 223) + return (ord($c{0})-192)*64 + (ord($c{1})-128); + if (ord($c{0}) >= 224 && ord($c{0}) <= 239) + return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128); + if (ord($c{0}) >= 240 && ord($c{0}) <= 247) + return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128); + if (ord($c{0}) >= 248 && ord($c{0}) <= 251) + return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128); + if (ord($c{0}) >= 252 && ord($c{0}) <= 253) + return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128); + if (ord($c{0}) >= 254 && ord($c{0}) <= 255) //error + return PHPExcel_Calculation_Functions::VALUE(); + return 0; + } // function _uniord() + + /** + * CHARACTER + * + * @param string $character Value + * @return int + */ + public static function CHARACTER($character) { + $character = PHPExcel_Calculation_Functions::flattenSingleValue($character); + + if ((!is_numeric($character)) || ($character < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (function_exists('mb_convert_encoding')) { + return mb_convert_encoding('&#'.intval($character).';', 'UTF-8', 'HTML-ENTITIES'); + } else { + return chr(intval($character)); + } + } + + + /** + * TRIMNONPRINTABLE + * + * @param mixed $value Value to check + * @return string + */ + public static function TRIMNONPRINTABLE($stringValue = '') { + $stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue); + + if (is_bool($stringValue)) { + return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (self::$_invalidChars == Null) { + self::$_invalidChars = range(chr(0),chr(31)); + } + + if (is_string($stringValue) || is_numeric($stringValue)) { + return str_replace(self::$_invalidChars,'',trim($stringValue,"\x00..\x1F")); + } + return NULL; + } // function TRIMNONPRINTABLE() + + + /** + * TRIMSPACES + * + * @param mixed $value Value to check + * @return string + */ + public static function TRIMSPACES($stringValue = '') { + $stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue); + + if (is_bool($stringValue)) { + return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (is_string($stringValue) || is_numeric($stringValue)) { + return trim(preg_replace('/ +/',' ',trim($stringValue,' '))); + } + return NULL; + } // function TRIMSPACES() + + + /** + * ASCIICODE + * + * @param string $character Value + * @return int + */ + public static function ASCIICODE($characters) { + if (($characters === NULL) || ($characters === '')) + return PHPExcel_Calculation_Functions::VALUE(); + $characters = PHPExcel_Calculation_Functions::flattenSingleValue($characters); + if (is_bool($characters)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $characters = (int) $characters; + } else { + $characters = ($characters) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + } + + $character = $characters; + if ((function_exists('mb_strlen')) && (function_exists('mb_substr'))) { + if (mb_strlen($characters, 'UTF-8') > 1) { $character = mb_substr($characters, 0, 1, 'UTF-8'); } + return self::_uniord($character); + } else { + if (strlen($characters) > 0) { $character = substr($characters, 0, 1); } + return ord($character); + } + } // function ASCIICODE() + + + /** + * CONCATENATE + * + * @return string + */ + public static function CONCATENATE() { + // Return value + $returnValue = ''; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + if (is_bool($arg)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $arg = (int) $arg; + } else { + $arg = ($arg) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + } + $returnValue .= $arg; + } + + // Return + return $returnValue; + } // function CONCATENATE() + + + /** + * DOLLAR + * + * This function converts a number to text using currency format, with the decimals rounded to the specified place. + * The format used is $#,##0.00_);($#,##0.00).. + * + * @param float $value The value to format + * @param int $decimals The number of digits to display to the right of the decimal point. + * If decimals is negative, number is rounded to the left of the decimal point. + * If you omit decimals, it is assumed to be 2 + * @return string + */ + public static function DOLLAR($value = 0, $decimals = 2) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $decimals = is_null($decimals) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($decimals); + + // Validate parameters + if (!is_numeric($value) || !is_numeric($decimals)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $decimals = floor($decimals); + + if ($decimals > 0) { + return money_format('%.'.$decimals.'n',$value); + } else { + $round = pow(10,abs($decimals)); + if ($value < 0) { $round = 0-$round; } + $value = PHPExcel_Calculation_MathTrig::MROUND($value,$round); + // The implementation of money_format used if the standard PHP function is not available can't handle decimal places of 0, + // so we display to 1 dp and chop off that character and the decimal separator using substr + return substr(money_format('%.1n',$value),0,-2); + } + } // function DOLLAR() + + + /** + * SEARCHSENSITIVE + * + * @param string $needle The string to look for + * @param string $haystack The string in which to look + * @param int $offset Offset within $haystack + * @return string + */ + public static function SEARCHSENSITIVE($needle,$haystack,$offset=1) { + $needle = PHPExcel_Calculation_Functions::flattenSingleValue($needle); + $haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack); + $offset = PHPExcel_Calculation_Functions::flattenSingleValue($offset); + + if (!is_bool($needle)) { + if (is_bool($haystack)) { + $haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) { + if (PHPExcel_Shared_String::CountCharacters($needle) == 0) { + return $offset; + } + if (function_exists('mb_strpos')) { + $pos = mb_strpos($haystack, $needle, --$offset, 'UTF-8'); + } else { + $pos = strpos($haystack, $needle, --$offset); + } + if ($pos !== false) { + return ++$pos; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SEARCHSENSITIVE() + + + /** + * SEARCHINSENSITIVE + * + * @param string $needle The string to look for + * @param string $haystack The string in which to look + * @param int $offset Offset within $haystack + * @return string + */ + public static function SEARCHINSENSITIVE($needle,$haystack,$offset=1) { + $needle = PHPExcel_Calculation_Functions::flattenSingleValue($needle); + $haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack); + $offset = PHPExcel_Calculation_Functions::flattenSingleValue($offset); + + if (!is_bool($needle)) { + if (is_bool($haystack)) { + $haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) { + if (PHPExcel_Shared_String::CountCharacters($needle) == 0) { + return $offset; + } + if (function_exists('mb_stripos')) { + $pos = mb_stripos($haystack, $needle, --$offset,'UTF-8'); + } else { + $pos = stripos($haystack, $needle, --$offset); + } + if ($pos !== false) { + return ++$pos; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } // function SEARCHINSENSITIVE() + + + /** + * FIXEDFORMAT + * + * @param mixed $value Value to check + * @return boolean + */ + public static function FIXEDFORMAT($value, $decimals = 2, $no_commas = FALSE) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $decimals = PHPExcel_Calculation_Functions::flattenSingleValue($decimals); + $no_commas = PHPExcel_Calculation_Functions::flattenSingleValue($no_commas); + + // Validate parameters + if (!is_numeric($value) || !is_numeric($decimals)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $decimals = floor($decimals); + + $valueResult = round($value,$decimals); + if ($decimals < 0) { $decimals = 0; } + if (!$no_commas) { + $valueResult = number_format($valueResult,$decimals); + } + + return (string) $valueResult; + } // function FIXEDFORMAT() + + + /** + * LEFT + * + * @param string $value Value + * @param int $chars Number of characters + * @return string + */ + public static function LEFT($value = '', $chars = 1) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + + if ($chars < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_substr')) { + return mb_substr($value, 0, $chars, 'UTF-8'); + } else { + return substr($value, 0, $chars); + } + } // function LEFT() + + + /** + * MID + * + * @param string $value Value + * @param int $start Start character + * @param int $chars Number of characters + * @return string + */ + public static function MID($value = '', $start = 1, $chars = null) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $start = PHPExcel_Calculation_Functions::flattenSingleValue($start); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + + if (($start < 1) || ($chars < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_substr')) { + return mb_substr($value, --$start, $chars, 'UTF-8'); + } else { + return substr($value, --$start, $chars); + } + } // function MID() + + + /** + * RIGHT + * + * @param string $value Value + * @param int $chars Number of characters + * @return string + */ + public static function RIGHT($value = '', $chars = 1) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + + if ($chars < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if ((function_exists('mb_substr')) && (function_exists('mb_strlen'))) { + return mb_substr($value, mb_strlen($value, 'UTF-8') - $chars, $chars, 'UTF-8'); + } else { + return substr($value, strlen($value) - $chars); + } + } // function RIGHT() + + + /** + * STRINGLENGTH + * + * @param string $value Value + * @param int $chars Number of characters + * @return string + */ + public static function STRINGLENGTH($value = '') { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_strlen')) { + return mb_strlen($value, 'UTF-8'); + } else { + return strlen($value); + } + } // function STRINGLENGTH() + + + /** + * LOWERCASE + * + * Converts a string value to upper case. + * + * @param string $mixedCaseString + * @return string + */ + public static function LOWERCASE($mixedCaseString) { + $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString); + + if (is_bool($mixedCaseString)) { + $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_convert_case')) { + return mb_convert_case($mixedCaseString, MB_CASE_LOWER, 'UTF-8'); + } else { + return strtoupper($mixedCaseString); + } + } // function LOWERCASE() + + + /** + * UPPERCASE + * + * Converts a string value to upper case. + * + * @param string $mixedCaseString + * @return string + */ + public static function UPPERCASE($mixedCaseString) { + $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString); + + if (is_bool($mixedCaseString)) { + $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_convert_case')) { + return mb_convert_case($mixedCaseString, MB_CASE_UPPER, 'UTF-8'); + } else { + return strtoupper($mixedCaseString); + } + } // function UPPERCASE() + + + /** + * PROPERCASE + * + * Converts a string value to upper case. + * + * @param string $mixedCaseString + * @return string + */ + public static function PROPERCASE($mixedCaseString) { + $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString); + + if (is_bool($mixedCaseString)) { + $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_convert_case')) { + return mb_convert_case($mixedCaseString, MB_CASE_TITLE, 'UTF-8'); + } else { + return ucwords($mixedCaseString); + } + } // function PROPERCASE() + + + /** + * REPLACE + * + * @param string $value Value + * @param int $start Start character + * @param int $chars Number of characters + * @return string + */ + public static function REPLACE($oldText = '', $start = 1, $chars = null, $newText) { + $oldText = PHPExcel_Calculation_Functions::flattenSingleValue($oldText); + $start = PHPExcel_Calculation_Functions::flattenSingleValue($start); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + $newText = PHPExcel_Calculation_Functions::flattenSingleValue($newText); + + $left = self::LEFT($oldText,$start-1); + $right = self::RIGHT($oldText,self::STRINGLENGTH($oldText)-($start+$chars)+1); + + return $left.$newText.$right; + } // function REPLACE() + + + /** + * SUBSTITUTE + * + * @param string $text Value + * @param string $fromText From Value + * @param string $toText To Value + * @param integer $instance Instance Number + * @return string + */ + public static function SUBSTITUTE($text = '', $fromText = '', $toText = '', $instance = 0) { + $text = PHPExcel_Calculation_Functions::flattenSingleValue($text); + $fromText = PHPExcel_Calculation_Functions::flattenSingleValue($fromText); + $toText = PHPExcel_Calculation_Functions::flattenSingleValue($toText); + $instance = floor(PHPExcel_Calculation_Functions::flattenSingleValue($instance)); + + if ($instance == 0) { + if(function_exists('mb_str_replace')) { + return mb_str_replace($fromText,$toText,$text); + } else { + return str_replace($fromText,$toText,$text); + } + } else { + $pos = -1; + while($instance > 0) { + if (function_exists('mb_strpos')) { + $pos = mb_strpos($text, $fromText, $pos+1, 'UTF-8'); + } else { + $pos = strpos($text, $fromText, $pos+1); + } + if ($pos === false) { + break; + } + --$instance; + } + if ($pos !== false) { + if (function_exists('mb_strlen')) { + return self::REPLACE($text,++$pos,mb_strlen($fromText, 'UTF-8'),$toText); + } else { + return self::REPLACE($text,++$pos,strlen($fromText),$toText); + } + } + } + + return $text; + } // function SUBSTITUTE() + + + /** + * RETURNSTRING + * + * @param mixed $value Value to check + * @return boolean + */ + public static function RETURNSTRING($testValue = '') { + $testValue = PHPExcel_Calculation_Functions::flattenSingleValue($testValue); + + if (is_string($testValue)) { + return $testValue; + } + return Null; + } // function RETURNSTRING() + + + /** + * TEXTFORMAT + * + * @param mixed $value Value to check + * @return boolean + */ + public static function TEXTFORMAT($value,$format) { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $format = PHPExcel_Calculation_Functions::flattenSingleValue($format); + + if ((is_string($value)) && (!is_numeric($value)) && PHPExcel_Shared_Date::isDateTimeFormatCode($format)) { + $value = PHPExcel_Calculation_DateTime::DATEVALUE($value); + } + + return (string) PHPExcel_Style_NumberFormat::toFormattedString($value,$format); + } // function TEXTFORMAT() + +} // class PHPExcel_Calculation_TextData diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Token/Stack.php b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Token/Stack.php new file mode 100644 index 000000000..ea7efa0c9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/Token/Stack.php @@ -0,0 +1,73 @@ +_count; + } // function count() + + + public function push($type,$value,$reference=null) { + $this->_stack[$this->_count++] = array('type' => $type, + 'value' => $value, + 'reference' => $reference + ); + if ($type == 'Function') { + $localeFunction = PHPExcel_Calculation::_localeFunc($value); + if ($localeFunction != $value) { + $this->_stack[($this->_count - 1)]['localeValue'] = $localeFunction; + } + } + } // function push() + + + public function pop() { + if ($this->_count > 0) { + return $this->_stack[--$this->_count]; + } + return null; + } // function pop() + + + public function last($n=1) { + if ($this->_count-$n < 0) { + return null; + } + return $this->_stack[$this->_count-$n]; + } // function last() + + + function __construct() { + } + +} // class PHPExcel_Calculation_Token_Stack diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/functionlist.txt b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/functionlist.txt new file mode 100644 index 000000000..67dbd49cf --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Calculation/functionlist.txt @@ -0,0 +1,351 @@ +ABS +ACCRINT +ACCRINTM +ACOS +ACOSH +ADDRESS +AMORDEGRC +AMORLINC +AND +AREAS +ASC +ASIN +ASINH +ATAN +ATAN2 +ATANH +AVEDEV +AVERAGE +AVERAGEA +AVERAGEIF +AVERAGEIFS +BAHTTEXT +BESSELI +BESSELJ +BESSELK +BESSELY +BETADIST +BETAINV +BIN2DEC +BIN2HEX +BIN2OCT +BINOMDIST +CEILING +CELL +CHAR +CHIDIST +CHIINV +CHITEST +CHOOSE +CLEAN +CODE +COLUMN +COLUMNS +COMBIN +COMPLEX +CONCATENATE +CONFIDENCE +CONVERT +CORREL +COS +COSH +COUNT +COUNTA +COUNTBLANK +COUNTIF +COUNTIFS +COUPDAYBS +COUPDAYBS +COUPDAYSNC +COUPNCD +COUPNUM +COUPPCD +COVAR +CRITBINOM +CUBEKPIMEMBER +CUBEMEMBER +CUBEMEMBERPROPERTY +CUBERANKEDMEMBER +CUBESET +CUBESETCOUNT +CUBEVALUE +CUMIPMT +CUMPRINC +DATE +DATEDIF +DATEVALUE +DAVERAGE +DAY +DAYS360 +DB +DCOUNT +DCOUNTA +DDB +DEC2BIN +DEC2HEX +DEC2OCT +DEGREES +DELTA +DEVSQ +DGET +DISC +DMAX +DMIN +DOLLAR +DOLLARDE +DOLLARFR +DPRODUCT +DSTDEV +DSTDEVP +DSUM +DURATION +DVAR +DVARP +EDATE +EFFECT +EOMONTH +ERF +ERFC +ERROR.TYPE +EVEN +EXACT +EXP +EXPONDIST +FACT +FACTDOUBLE +FALSE +FDIST +FIND +FINDB +FINV +FISHER +FISHERINV +FIXED +FLOOR +FORECAST +FREQUENCY +FTEST +FV +FVSCHEDULE +GAMAMDIST +GAMMAINV +GAMMALN +GCD +GEOMEAN +GESTEP +GETPIVOTDATA +GROWTH +HARMEAN +HEX2BIN +HEX2OCT +HLOOKUP +HOUR +HYPERLINK +HYPGEOMDIST +IF +IFERROR +IMABS +IMAGINARY +IMARGUMENT +IMCONJUGATE +IMCOS +IMEXP +IMLN +IMLOG10 +IMLOG2 +IMPOWER +IMPRODUCT +IMREAL +IMSIN +IMSQRT +IMSUB +IMSUM +INDEX +INDIRECT +INFO +INT +INTERCEPT +INTRATE +IPMT +IRR +ISBLANK +ISERR +ISERROR +ISEVEN +ISLOGICAL +ISNA +ISNONTEXT +ISNUMBER +ISODD +ISPMT +ISREF +ISTEXT +JIS +KURT +LARGE +LCM +LEFT +LEFTB +LEN +LENB +LINEST +LN +LOG +LOG10 +LOGEST +LOGINV +LOGNORMDIST +LOOKUP +LOWER +MATCH +MAX +MAXA +MDETERM +MDURATION +MEDIAN +MID +MIDB +MIN +MINA +MINUTE +MINVERSE +MIRR +MMULT +MOD +MODE +MONTH +MROUND +MULTINOMIAL +N +NA +NEGBINOMDIST +NETWORKDAYS +NOMINAL +NORMDIST +NORMINV +NORMSDIST +NORMSINV +NOT +NOW +NPER +NPV +OCT2BIN +OCT2DEC +OCT2HEX +ODD +ODDFPRICE +ODDFYIELD +ODDLPRICE +ODDLYIELD +OFFSET +OR +PEARSON +PERCENTILE +PERCENTRANK +PERMUT +PHONETIC +PI +PMT +POISSON +POWER +PPMT +PRICE +PRICEDISC +PRICEMAT +PROB +PRODUCT +PROPER +PV +QUARTILE +QUOTIENT +RADIANS +RAND +RANDBETWEEN +RANK +RATE +RECEIVED +REPLACE +REPLACEB +REPT +RIGHT +RIGHTB +ROMAN +ROUND +ROUNDDOWN +ROUNDUP +ROW +ROWS +RSQ +RTD +SEARCH +SEARCHB +SECOND +SERIESSUM +SIGN +SIN +SINH +SKEW +SLN +SLOPE +SMALL +SQRT +SQRTPI +STANDARDIZE +STDEV +STDEVA +STDEVP +STDEVPA +STEYX +SUBSTITUTE +SUBTOTAL +SUM +SUMIF +SUMIFS +SUMPRODUCT +SUMSQ +SUMX2MY2 +SUMX2PY2 +SUMXMY2 +SYD +T +TAN +TANH +TBILLEQ +TBILLPRICE +TBILLYIELD +TDIST +TEXT +TIME +TIMEVALUE +TINV +TODAY +TRANSPOSE +TREND +TRIM +TRIMMEAN +TRUE +TRUNC +TTEST +TYPE +UPPER +USDOLLAR +VALUE +VAR +VARA +VARP +VARPA +VDB +VERSION +VLOOKUP +WEEKDAY +WEEKNUM +WEIBULL +WORKDAY +XIRR +XNPV +YEAR +YEARFRAC +YIELD +YIELDDISC +YIELDMAT +ZTEST diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell.php new file mode 100644 index 000000000..75996f294 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell.php @@ -0,0 +1,972 @@ +_parent->getCellCacheController()->updateCacheData($this); + return $this; + } + + public function detach() { + $this->_parent = NULL; + } + + public function attach($parent) { + $this->_parent = $parent; + } + + + /** + * Create a new Cell + * + * @param string $pColumn + * @param int $pRow + * @param mixed $pValue + * @param string $pDataType + * @param PHPExcel_Worksheet $pSheet + * @throws PHPExcel_Exception + */ + public function __construct($pColumn = 'A', $pRow = 1, $pValue = NULL, $pDataType = NULL, PHPExcel_Worksheet $pSheet = NULL) + { + // Initialise cell coordinate + $this->_column = strtoupper($pColumn); + $this->_row = $pRow; + + // Initialise cell value + $this->_value = $pValue; + + // Set worksheet + $this->_parent = $pSheet; + + // Set datatype? + if ($pDataType !== NULL) { + if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2) + $pDataType = PHPExcel_Cell_DataType::TYPE_STRING; + $this->_dataType = $pDataType; + } else { + if (!self::getValueBinder()->bindValue($this, $pValue)) { + throw new PHPExcel_Exception("Value could not be bound to cell."); + } + } + + // set default index to cellXf + $this->_xfIndex = 0; + } + + /** + * Get cell coordinate column + * + * @return string + */ + public function getColumn() + { + return $this->_column; + } + + /** + * Get cell coordinate row + * + * @return int + */ + public function getRow() + { + return $this->_row; + } + + /** + * Get cell coordinate + * + * @return string + */ + public function getCoordinate() + { + return $this->_column . $this->_row; + } + + /** + * Get cell value + * + * @return mixed + */ + public function getValue() + { + return $this->_value; + } + + /** + * Get cell value with formatting + * + * @return string + */ + public function getFormattedValue() + { + return (string) PHPExcel_Style_NumberFormat::toFormattedString( + $this->getCalculatedValue(), + $this->_parent->getParent()->getCellXfByIndex($this->getXfIndex()) + ->getNumberFormat()->getFormatCode() + ); + } + + /** + * Set cell value + * + * Sets the value for a cell, automatically determining the datatype using the value binder + * + * @param mixed $pValue Value + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setValue($pValue = NULL) + { + if (!self::getValueBinder()->bindValue($this, $pValue)) { + throw new PHPExcel_Exception("Value could not be bound to cell."); + } + return $this; + } + + /** + * Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder) + * + * @param mixed $pValue Value + * @param string $pDataType Explicit data type + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setValueExplicit($pValue = NULL, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING) + { + // set the value according to data type + switch ($pDataType) { + case PHPExcel_Cell_DataType::TYPE_STRING2: + $pDataType = PHPExcel_Cell_DataType::TYPE_STRING; + case PHPExcel_Cell_DataType::TYPE_STRING: + case PHPExcel_Cell_DataType::TYPE_NULL: + case PHPExcel_Cell_DataType::TYPE_INLINE: + $this->_value = PHPExcel_Cell_DataType::checkString($pValue); + break; + case PHPExcel_Cell_DataType::TYPE_NUMERIC: + $this->_value = (float)$pValue; + break; + case PHPExcel_Cell_DataType::TYPE_FORMULA: + $this->_value = (string)$pValue; + break; + case PHPExcel_Cell_DataType::TYPE_BOOL: + $this->_value = (bool)$pValue; + break; + case PHPExcel_Cell_DataType::TYPE_ERROR: + $this->_value = PHPExcel_Cell_DataType::checkErrorCode($pValue); + break; + default: + throw new PHPExcel_Exception('Invalid datatype: ' . $pDataType); + break; + } + + // set the datatype + $this->_dataType = $pDataType; + + return $this->notifyCacheController(); + } + + /** + * Get calculated cell value + * + * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling + * + * @return mixed + * @throws PHPExcel_Exception + */ + public function getCalculatedValue($resetLog = TRUE) + { +// echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().'
        '; + if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) { + try { +// echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value
        '; + $result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog); +// echo $this->getCoordinate().' calculation result is '.$result.'
        '; + } catch ( Exception $ex ) { + if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->_calculatedValue !== NULL)) { +// echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'
        '; + return $this->_calculatedValue; // Fallback for calculations referencing external files. + } +// echo 'Calculation Exception: '.$ex->getMessage().'
        '; + $result = '#N/A'; + throw( + new PHPExcel_Exception( + $this->getParent()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage() + ) + ); + } + + if ($result === '#Not Yet Implemented') { +// echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'
        '; + return $this->_calculatedValue; // Fallback if calculation engine does not support the formula. + } +// echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'
        '; + return $result; + } + +// if ($this->_value === NULL) { +// echo 'Cell '.$this->getCoordinate().' has no value, formula or otherwise
        '; +// return NULL; +// } +// echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'
        '; + return $this->_value; + } + + /** + * Set old calculated value (cached) + * + * @param mixed $pValue Value + * @return PHPExcel_Cell + */ + public function setCalculatedValue($pValue = NULL) + { + if ($pValue !== NULL) { + $this->_calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue; + } + + return $this->notifyCacheController(); + } + + /** + * Get old calculated value (cached) + * This returns the value last calculated by MS Excel or whichever spreadsheet program was used to + * create the original spreadsheet file. + * Note that this value is not guaranteed to refelect the actual calculated value because it is + * possible that auto-calculation was disabled in the original spreadsheet, and underlying data + * values used by the formula have changed since it was last calculated. + * + * @return mixed + */ + public function getOldCalculatedValue() + { + return $this->_calculatedValue; + } + + /** + * Get cell data type + * + * @return string + */ + public function getDataType() + { + return $this->_dataType; + } + + /** + * Set cell data type + * + * @param string $pDataType + * @return PHPExcel_Cell + */ + public function setDataType($pDataType = PHPExcel_Cell_DataType::TYPE_STRING) + { + if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2) + $pDataType = PHPExcel_Cell_DataType::TYPE_STRING; + + $this->_dataType = $pDataType; + + return $this->notifyCacheController(); + } + + /** + * Does this cell contain Data validation rules? + * + * @return boolean + * @throws PHPExcel_Exception + */ + public function hasDataValidation() + { + if (!isset($this->_parent)) { + throw new PHPExcel_Exception('Cannot check for data validation when cell is not bound to a worksheet'); + } + + return $this->_parent->dataValidationExists($this->getCoordinate()); + } + + /** + * Get Data validation rules + * + * @return PHPExcel_Cell_DataValidation + * @throws PHPExcel_Exception + */ + public function getDataValidation() + { + if (!isset($this->_parent)) { + throw new PHPExcel_Exception('Cannot get data validation for cell that is not bound to a worksheet'); + } + + return $this->_parent->getDataValidation($this->getCoordinate()); + } + + /** + * Set Data validation rules + * + * @param PHPExcel_Cell_DataValidation $pDataValidation + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = NULL) + { + if (!isset($this->_parent)) { + throw new PHPExcel_Exception('Cannot set data validation for cell that is not bound to a worksheet'); + } + + $this->_parent->setDataValidation($this->getCoordinate(), $pDataValidation); + + return $this->notifyCacheController(); + } + + /** + * Does this cell contain a Hyperlink? + * + * @return boolean + * @throws PHPExcel_Exception + */ + public function hasHyperlink() + { + if (!isset($this->_parent)) { + throw new PHPExcel_Exception('Cannot check for hyperlink when cell is not bound to a worksheet'); + } + + return $this->_parent->hyperlinkExists($this->getCoordinate()); + } + + /** + * Get Hyperlink + * + * @return PHPExcel_Cell_Hyperlink + * @throws PHPExcel_Exception + */ + public function getHyperlink() + { + if (!isset($this->_parent)) { + throw new PHPExcel_Exception('Cannot get hyperlink for cell that is not bound to a worksheet'); + } + + return $this->_parent->getHyperlink($this->getCoordinate()); + } + + /** + * Set Hyperlink + * + * @param PHPExcel_Cell_Hyperlink $pHyperlink + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = NULL) + { + if (!isset($this->_parent)) { + throw new PHPExcel_Exception('Cannot set hyperlink for cell that is not bound to a worksheet'); + } + + $this->_parent->setHyperlink($this->getCoordinate(), $pHyperlink); + + return $this->notifyCacheController(); + } + + /** + * Get parent worksheet + * + * @return PHPExcel_Worksheet + */ + public function getParent() { + return $this->_parent; + } + + /** + * Re-bind parent + * + * @param PHPExcel_Worksheet $parent + * @return PHPExcel_Cell + */ + public function rebindParent(PHPExcel_Worksheet $parent) { + $this->_parent = $parent; + + return $this->notifyCacheController(); + } + + /** + * Is cell in a specific range? + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return boolean + */ + public function isInRange($pRange = 'A1:A1') + { + list($rangeStart,$rangeEnd) = self::rangeBoundaries($pRange); + + // Translate properties + $myColumn = self::columnIndexFromString($this->getColumn()); + $myRow = $this->getRow(); + + // Verify if cell is in range + return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) && + ($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow) + ); + } + + /** + * Coordinate from string + * + * @param string $pCoordinateString + * @return array Array containing column and row (indexes 0 and 1) + * @throws PHPExcel_Exception + */ + public static function coordinateFromString($pCoordinateString = 'A1') + { + if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,7})$/", $pCoordinateString, $matches)) { + return array($matches[1],$matches[2]); + } elseif ((strpos($pCoordinateString,':') !== FALSE) || (strpos($pCoordinateString,',') !== FALSE)) { + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells'); + } elseif ($pCoordinateString == '') { + throw new PHPExcel_Exception('Cell coordinate can not be zero-length string'); + } + + throw new PHPExcel_Exception('Invalid cell coordinate '.$pCoordinateString); + } + + /** + * Make string row, column or cell coordinate absolute + * + * @param string $pCoordinateString e.g. 'A' or '1' or 'A1' + * Note that this value can be a row or column reference as well as a cell reference + * @return string Absolute coordinate e.g. '$A' or '$1' or '$A$1' + * @throws PHPExcel_Exception + */ + public static function absoluteReference($pCoordinateString = 'A1') + { + if (strpos($pCoordinateString,':') === FALSE && strpos($pCoordinateString,',') === FALSE) { + // Split out any worksheet name from the reference + $worksheet = ''; + $cellAddress = explode('!',$pCoordinateString); + if (count($cellAddress) > 1) { + list($worksheet,$pCoordinateString) = $cellAddress; + } + if ($worksheet > '') $worksheet .= '!'; + + // Create absolute coordinate + if (ctype_digit($pCoordinateString)) { + return $worksheet . '$' . $pCoordinateString; + } elseif (ctype_alpha($pCoordinateString)) { + return $worksheet . '$' . strtoupper($pCoordinateString); + } + return $worksheet . self::absoluteCoordinate($pCoordinateString); + } + + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells'); + } + + /** + * Make string coordinate absolute + * + * @param string $pCoordinateString e.g. 'A1' + * @return string Absolute coordinate e.g. '$A$1' + * @throws PHPExcel_Exception + */ + public static function absoluteCoordinate($pCoordinateString = 'A1') + { + if (strpos($pCoordinateString,':') === FALSE && strpos($pCoordinateString,',') === FALSE) { + // Split out any worksheet name from the coordinate + $worksheet = ''; + $cellAddress = explode('!',$pCoordinateString); + if (count($cellAddress) > 1) { + list($worksheet,$pCoordinateString) = $cellAddress; + } + if ($worksheet > '') $worksheet .= '!'; + + // Create absolute coordinate + list($column, $row) = self::coordinateFromString($pCoordinateString); + $column = ltrim($column,'$'); + $row = ltrim($row,'$'); + return $worksheet . '$' . $column . '$' . $row; + } + + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells'); + } + + /** + * Split range into coordinate strings + * + * @param string $pRange e.g. 'B4:D9' or 'B4:D9,H2:O11' or 'B4' + * @return array Array containg one or more arrays containing one or two coordinate strings + * e.g. array('B4','D9') or array(array('B4','D9'),array('H2','O11')) + * or array('B4') + */ + public static function splitRange($pRange = 'A1:A1') + { + // Ensure $pRange is a valid range + if(empty($pRange)) { + $pRange = self::DEFAULT_RANGE; + } + + $exploded = explode(',', $pRange); + $counter = count($exploded); + for ($i = 0; $i < $counter; ++$i) { + $exploded[$i] = explode(':', $exploded[$i]); + } + return $exploded; + } + + /** + * Build range from coordinate strings + * + * @param array $pRange Array containg one or more arrays containing one or two coordinate strings + * @return string String representation of $pRange + * @throws PHPExcel_Exception + */ + public static function buildRange($pRange) + { + // Verify range + if (!is_array($pRange) || empty($pRange) || !is_array($pRange[0])) { + throw new PHPExcel_Exception('Range does not contain any information'); + } + + // Build range + $imploded = array(); + $counter = count($pRange); + for ($i = 0; $i < $counter; ++$i) { + $pRange[$i] = implode(':', $pRange[$i]); + } + $imploded = implode(',', $pRange); + + return $imploded; + } + + /** + * Calculate range boundaries + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range coordinates array(Start Cell, End Cell) + * where Start Cell and End Cell are arrays (Column Number, Row Number) + */ + public static function rangeBoundaries($pRange = 'A1:A1') + { + // Ensure $pRange is a valid range + if(empty($pRange)) { + $pRange = self::DEFAULT_RANGE; + } + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Extract range + if (strpos($pRange, ':') === FALSE) { + $rangeA = $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + // Calculate range outer borders + $rangeStart = self::coordinateFromString($rangeA); + $rangeEnd = self::coordinateFromString($rangeB); + + // Translate column into index + $rangeStart[0] = self::columnIndexFromString($rangeStart[0]); + $rangeEnd[0] = self::columnIndexFromString($rangeEnd[0]); + + return array($rangeStart, $rangeEnd); + } + + /** + * Calculate range dimension + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range dimension (width, height) + */ + public static function rangeDimension($pRange = 'A1:A1') + { + // Calculate range outer borders + list($rangeStart,$rangeEnd) = self::rangeBoundaries($pRange); + + return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) ); + } + + /** + * Calculate range boundaries + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range coordinates array(Start Cell, End Cell) + * where Start Cell and End Cell are arrays (Column ID, Row Number) + */ + public static function getRangeBoundaries($pRange = 'A1:A1') + { + // Ensure $pRange is a valid range + if(empty($pRange)) { + $pRange = self::DEFAULT_RANGE; + } + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Extract range + if (strpos($pRange, ':') === FALSE) { + $rangeA = $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB)); + } + + /** + * Column index from string + * + * @param string $pString + * @return int Column index (base 1 !!!) + * @throws Exception + */ + public static function columnIndexFromString($pString = 'A') + { + // Using a lookup cache adds a slight memory overhead, but boosts speed + // caching using a static within the method is faster than a class static, + // though it's additional memory overhead + static $_indexCache = array(); + + if (isset($_indexCache[$pString])) + return $_indexCache[$pString]; + + // It's surprising how costly the strtoupper() and ord() calls actually are, so we use a lookup array rather than use ord() + // and make it case insensitive to get rid of the strtoupper() as well. Because it's a static, there's no significant + // memory overhead either + static $_columnLookup = array( + 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 11, 'L' => 12, 'M' => 13, + 'N' => 14, 'O' => 15, 'P' => 16, 'Q' => 17, 'R' => 18, 'S' => 19, 'T' => 20, 'U' => 21, 'V' => 22, 'W' => 23, 'X' => 24, 'Y' => 25, 'Z' => 26, + 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10, 'k' => 11, 'l' => 12, 'm' => 13, + 'n' => 14, 'o' => 15, 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26 + ); + + // We also use the language construct isset() rather than the more costly strlen() function to match the length of $pString + // for improved performance + if (isset($pString{0})) { + if (!isset($pString{1})) { + $_indexCache[$pString] = $_columnLookup[$pString]; + return $_indexCache[$pString]; + } elseif(!isset($pString{2})) { + $_indexCache[$pString] = $_columnLookup[$pString{0}] * 26 + $_columnLookup[$pString{1}]; + return $_indexCache[$pString]; + } elseif(!isset($pString{3})) { + $_indexCache[$pString] = $_columnLookup[$pString{0}] * 676 + $_columnLookup[$pString{1}] * 26 + $_columnLookup[$pString{2}]; + return $_indexCache[$pString]; + } + } + throw new PHPExcel_Exception("Column string index can not be " . ((isset($pString{0})) ? "longer than 3 characters" : "empty")); + } + + /** + * String from columnindex + * + * @param int $pColumnIndex Column index (base 0 !!!) + * @return string + */ + public static function stringFromColumnIndex($pColumnIndex = 0) + { + // Using a lookup cache adds a slight memory overhead, but boosts speed + // caching using a static within the method is faster than a class static, + // though it's additional memory overhead + static $_indexCache = array(); + + if (!isset($_indexCache[$pColumnIndex])) { + // Determine column string + if ($pColumnIndex < 26) { + $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex); + } elseif ($pColumnIndex < 702) { + $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) . + chr(65 + $pColumnIndex % 26); + } else { + $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) . + chr(65 + ((($pColumnIndex - 26) % 676) / 26)) . + chr(65 + $pColumnIndex % 26); + } + } + return $_indexCache[$pColumnIndex]; + } + + /** + * Extract all cell references in range + * + * @param string $pRange Range (e.g. A1 or A1:C10 or A1:E10 A20:E25) + * @return array Array containing single cell references + */ + public static function extractAllCellReferencesInRange($pRange = 'A1') { + // Returnvalue + $returnValue = array(); + + // Explode spaces + $cellBlocks = explode(' ', str_replace('$', '', strtoupper($pRange))); + foreach ($cellBlocks as $cellBlock) { + // Single cell? + if (strpos($cellBlock,':') === FALSE && strpos($cellBlock,',') === FALSE) { + $returnValue[] = $cellBlock; + continue; + } + + // Range... + $ranges = self::splitRange($cellBlock); + foreach($ranges as $range) { + // Single cell? + if (!isset($range[1])) { + $returnValue[] = $range[0]; + continue; + } + + // Range... + list($rangeStart, $rangeEnd) = $range; + list($startCol, $startRow) = sscanf($rangeStart,'%[A-Z]%d'); + list($endCol, $endRow) = sscanf($rangeEnd,'%[A-Z]%d'); + $endCol++; + + // Current data + $currentCol = $startCol; + $currentRow = $startRow; + + // Loop cells + while ($currentCol != $endCol) { + while ($currentRow <= $endRow) { + $returnValue[] = $currentCol.$currentRow; + ++$currentRow; + } + ++$currentCol; + $currentRow = $startRow; + } + } + } + + // Sort the result by column and row + $sortKeys = array(); + foreach (array_unique($returnValue) as $coord) { + list($column,$row) = sscanf($coord,'%[A-Z]%d'); + $sortKeys[sprintf('%3s%09d',$column,$row)] = $coord; + } + ksort($sortKeys); + + // Return value + return array_values($sortKeys); + } + + /** + * Compare 2 cells + * + * @param PHPExcel_Cell $a Cell a + * @param PHPExcel_Cell $a Cell b + * @return int Result of comparison (always -1 or 1, never zero!) + */ + public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b) + { + if ($a->_row < $b->_row) { + return -1; + } elseif ($a->_row > $b->_row) { + return 1; + } elseif (self::columnIndexFromString($a->_column) < self::columnIndexFromString($b->_column)) { + return -1; + } else { + return 1; + } + } + + /** + * Get value binder to use + * + * @return PHPExcel_Cell_IValueBinder + */ + public static function getValueBinder() { + if (self::$_valueBinder === NULL) { + self::$_valueBinder = new PHPExcel_Cell_DefaultValueBinder(); + } + + return self::$_valueBinder; + } + + /** + * Set value binder to use + * + * @param PHPExcel_Cell_IValueBinder $binder + * @throws Exception + */ + public static function setValueBinder(PHPExcel_Cell_IValueBinder $binder = NULL) { + if ($binder === NULL) { + throw new Exception("A PHPExcel_Cell_IValueBinder is required for PHPExcel to function correctly."); + } + + self::$_valueBinder = $binder; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + + /** + * Get index to cellXf + * + * @return int + */ + public function getXfIndex() + { + return $this->_xfIndex; + } + + /** + * Set index to cellXf + * + * @param int $pValue + * @return PHPExcel_Cell + */ + public function setXfIndex($pValue = 0) + { + $this->_xfIndex = $pValue; + + return $this->notifyCacheController(); + } + + /** + * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling + */ + public function setFormulaAttributes($pAttributes) + { + $this->_formulaAttributes = $pAttributes; + return $this; + } + + /** + * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling + */ + public function getFormulaAttributes() + { + return $this->_formulaAttributes; + } + + /** + * Convert to string + * + * @return string + */ + public function __toString() + { + return (string) $this->getValue(); + } + +} + diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell/AdvancedValueBinder.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/AdvancedValueBinder.php new file mode 100644 index 000000000..3603f5ee6 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/AdvancedValueBinder.php @@ -0,0 +1,190 @@ +setValueExplicit( TRUE, PHPExcel_Cell_DataType::TYPE_BOOL); + return true; + } elseif($value == PHPExcel_Calculation::getFALSE()) { + $cell->setValueExplicit( FALSE, PHPExcel_Cell_DataType::TYPE_BOOL); + return true; + } + + // Check for number in scientific format + if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NUMBER.'$/', $value)) { + $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + return true; + } + + // Check for fraction + if (preg_match('/^([+-]?) *([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) { + // Convert value to number + $value = $matches[2] / $matches[3]; + if ($matches[1] == '-') $value = 0 - $value; + $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( '??/??' ); + return true; + } elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) { + // Convert value to number + $value = $matches[2] + ($matches[3] / $matches[4]); + if ($matches[1] == '-') $value = 0 - $value; + $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( '# ??/??' ); + return true; + } + + // Check for percentage + if (preg_match('/^\-?[0-9]*\.?[0-9]*\s?\%$/', $value)) { + // Convert value to number + $value = (float) str_replace('%', '', $value) / 100; + $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00 ); + return true; + } + + // Check for currency + $currencyCode = PHPExcel_Shared_String::getCurrencyCode(); + if (preg_match('/^'.preg_quote($currencyCode).' *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { + // Convert value to number + $value = (float) trim(str_replace(array($currencyCode,','), '', $value)); + $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( + str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE ) + ); + return true; + } elseif (preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { + // Convert value to number + $value = (float) trim(str_replace(array('$',','), '', $value)); + $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE ); + return true; + } + + // Check for time without seconds e.g. '9:45', '09:45' + if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) { + // Convert value to number + list($h, $m) = explode(':', $value); + $days = $h / 24 + $m / 1440; + $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3 ); + return true; + } + + // Check for time with seconds '9:45:59', '09:45:59' + if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) { + // Convert value to number + list($h, $m, $s) = explode(':', $value); + $days = $h / 24 + $m / 1440 + $s / 86400; + // Convert value to number + $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4 ); + return true; + } + + // Check for datetime, e.g. '2008-12-31', '2008-12-31 15:59', '2008-12-31 15:59:10' + if (($d = PHPExcel_Shared_Date::stringToExcel($value)) !== false) { + // Convert value to number + $cell->setValueExplicit($d, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Determine style. Either there is a time part or not. Look for ':' + if (strpos($value, ':') !== false) { + $formatCode = 'yyyy-mm-dd h:mm'; + } else { + $formatCode = 'yyyy-mm-dd'; + } + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getNumberFormat()->setFormatCode($formatCode); + return true; + } + + // Check for newline character "\n" + if (strpos($value, "\n") !== FALSE) { + $value = PHPExcel_Shared_String::SanitizeUTF8($value); + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); + // Set style + $cell->getParent()->getStyle( $cell->getCoordinate() ) + ->getAlignment()->setWrapText(TRUE); + return true; + } + } + + // Not bound yet? Use parent... + return parent::bindValue($cell, $value); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DataType.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DataType.php new file mode 100644 index 000000000..a833a5a44 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DataType.php @@ -0,0 +1,114 @@ + 0, '#DIV/0!' => 1, '#VALUE!' => 2, '#REF!' => 3, '#NAME?' => 4, '#NUM!' => 5, '#N/A' => 6); + + /** + * Get list of error codes + * + * @return array + */ + public static function getErrorCodes() { + return self::$_errorCodes; + } + + /** + * DataType for value + * + * @deprecated Replaced by PHPExcel_Cell_IValueBinder infrastructure + * @param mixed $pValue + * @return int + */ + public static function dataTypeForValue($pValue = null) { + return PHPExcel_Cell_DefaultValueBinder::dataTypeForValue($pValue); + } + + /** + * Check a string that it satisfies Excel requirements + * + * @param mixed Value to sanitize to an Excel string + * @return mixed Sanitized value + */ + public static function checkString($pValue = null) + { + if ($pValue instanceof PHPExcel_RichText) { + // TODO: Sanitize Rich-Text string (max. character count is 32,767) + return $pValue; + } + + // string must never be longer than 32,767 characters, truncate if necessary + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 32767); + + // we require that newline is represented as "\n" in core, not as "\r\n" or "\r" + $pValue = str_replace(array("\r\n", "\r"), "\n", $pValue); + + return $pValue; + } + + /** + * Check a value that it is a valid error code + * + * @param mixed Value to sanitize to an Excel error code + * @return string Sanitized value + */ + public static function checkErrorCode($pValue = null) + { + $pValue = (string)$pValue; + + if ( !array_key_exists($pValue, self::$_errorCodes) ) { + $pValue = '#NULL!'; + } + + return $pValue; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DataValidation.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DataValidation.php new file mode 100644 index 000000000..01b1edb7e --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DataValidation.php @@ -0,0 +1,474 @@ +_formula1 = ''; + $this->_formula2 = ''; + $this->_type = PHPExcel_Cell_DataValidation::TYPE_NONE; + $this->_errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP; + $this->_operator = ''; + $this->_allowBlank = false; + $this->_showDropDown = false; + $this->_showInputMessage = false; + $this->_showErrorMessage = false; + $this->_errorTitle = ''; + $this->_error = ''; + $this->_promptTitle = ''; + $this->_prompt = ''; + } + + /** + * Get Formula 1 + * + * @return string + */ + public function getFormula1() { + return $this->_formula1; + } + + /** + * Set Formula 1 + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setFormula1($value = '') { + $this->_formula1 = $value; + return $this; + } + + /** + * Get Formula 2 + * + * @return string + */ + public function getFormula2() { + return $this->_formula2; + } + + /** + * Set Formula 2 + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setFormula2($value = '') { + $this->_formula2 = $value; + return $this; + } + + /** + * Get Type + * + * @return string + */ + public function getType() { + return $this->_type; + } + + /** + * Set Type + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setType($value = PHPExcel_Cell_DataValidation::TYPE_NONE) { + $this->_type = $value; + return $this; + } + + /** + * Get Error style + * + * @return string + */ + public function getErrorStyle() { + return $this->_errorStyle; + } + + /** + * Set Error style + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setErrorStyle($value = PHPExcel_Cell_DataValidation::STYLE_STOP) { + $this->_errorStyle = $value; + return $this; + } + + /** + * Get Operator + * + * @return string + */ + public function getOperator() { + return $this->_operator; + } + + /** + * Set Operator + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setOperator($value = '') { + $this->_operator = $value; + return $this; + } + + /** + * Get Allow Blank + * + * @return boolean + */ + public function getAllowBlank() { + return $this->_allowBlank; + } + + /** + * Set Allow Blank + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setAllowBlank($value = false) { + $this->_allowBlank = $value; + return $this; + } + + /** + * Get Show DropDown + * + * @return boolean + */ + public function getShowDropDown() { + return $this->_showDropDown; + } + + /** + * Set Show DropDown + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setShowDropDown($value = false) { + $this->_showDropDown = $value; + return $this; + } + + /** + * Get Show InputMessage + * + * @return boolean + */ + public function getShowInputMessage() { + return $this->_showInputMessage; + } + + /** + * Set Show InputMessage + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setShowInputMessage($value = false) { + $this->_showInputMessage = $value; + return $this; + } + + /** + * Get Show ErrorMessage + * + * @return boolean + */ + public function getShowErrorMessage() { + return $this->_showErrorMessage; + } + + /** + * Set Show ErrorMessage + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setShowErrorMessage($value = false) { + $this->_showErrorMessage = $value; + return $this; + } + + /** + * Get Error title + * + * @return string + */ + public function getErrorTitle() { + return $this->_errorTitle; + } + + /** + * Set Error title + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setErrorTitle($value = '') { + $this->_errorTitle = $value; + return $this; + } + + /** + * Get Error + * + * @return string + */ + public function getError() { + return $this->_error; + } + + /** + * Set Error + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setError($value = '') { + $this->_error = $value; + return $this; + } + + /** + * Get Prompt title + * + * @return string + */ + public function getPromptTitle() { + return $this->_promptTitle; + } + + /** + * Set Prompt title + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setPromptTitle($value = '') { + $this->_promptTitle = $value; + return $this; + } + + /** + * Get Prompt + * + * @return string + */ + public function getPrompt() { + return $this->_prompt; + } + + /** + * Set Prompt + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setPrompt($value = '') { + $this->_prompt = $value; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_formula1 + . $this->_formula2 + . $this->_type = PHPExcel_Cell_DataValidation::TYPE_NONE + . $this->_errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP + . $this->_operator + . ($this->_allowBlank ? 't' : 'f') + . ($this->_showDropDown ? 't' : 'f') + . ($this->_showInputMessage ? 't' : 'f') + . ($this->_showErrorMessage ? 't' : 'f') + . $this->_errorTitle + . $this->_error + . $this->_promptTitle + . $this->_prompt + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DefaultValueBinder.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DefaultValueBinder.php new file mode 100644 index 000000000..f520cc5ed --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/DefaultValueBinder.php @@ -0,0 +1,106 @@ +setValueExplicit( $value, self::dataTypeForValue($value) ); + + // Done! + return true; + } + + /** + * DataType for value + * + * @param mixed $pValue + * @return int + */ + public static function dataTypeForValue($pValue = null) { + // Match the value against a few data types + if (is_null($pValue)) { + return PHPExcel_Cell_DataType::TYPE_NULL; + + } elseif ($pValue === '') { + return PHPExcel_Cell_DataType::TYPE_STRING; + + } elseif ($pValue instanceof PHPExcel_RichText) { + return PHPExcel_Cell_DataType::TYPE_INLINE; + + } elseif ($pValue{0} === '=' && strlen($pValue) > 1) { + return PHPExcel_Cell_DataType::TYPE_FORMULA; + + } elseif (is_bool($pValue)) { + return PHPExcel_Cell_DataType::TYPE_BOOL; + + } elseif (is_float($pValue) || is_int($pValue)) { + return PHPExcel_Cell_DataType::TYPE_NUMERIC; + + } elseif (preg_match('/^\-?([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)$/', $pValue)) { + return PHPExcel_Cell_DataType::TYPE_NUMERIC; + + } elseif (is_string($pValue) && array_key_exists($pValue, PHPExcel_Cell_DataType::getErrorCodes())) { + return PHPExcel_Cell_DataType::TYPE_ERROR; + + } else { + return PHPExcel_Cell_DataType::TYPE_STRING; + + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell/Hyperlink.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/Hyperlink.php new file mode 100644 index 000000000..9dc13042a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/Hyperlink.php @@ -0,0 +1,127 @@ +_url = $pUrl; + $this->_tooltip = $pTooltip; + } + + /** + * Get URL + * + * @return string + */ + public function getUrl() { + return $this->_url; + } + + /** + * Set URL + * + * @param string $value + * @return PHPExcel_Cell_Hyperlink + */ + public function setUrl($value = '') { + $this->_url = $value; + return $this; + } + + /** + * Get tooltip + * + * @return string + */ + public function getTooltip() { + return $this->_tooltip; + } + + /** + * Set tooltip + * + * @param string $value + * @return PHPExcel_Cell_Hyperlink + */ + public function setTooltip($value = '') { + $this->_tooltip = $value; + return $this; + } + + /** + * Is this hyperlink internal? (to another sheet) + * + * @return boolean + */ + public function isInternal() { + return strpos($this->_url, 'sheet://') !== false; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_url + . $this->_tooltip + . __CLASS__ + ); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Cell/IValueBinder.php b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/IValueBinder.php new file mode 100644 index 000000000..4070b674c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Cell/IValueBinder.php @@ -0,0 +1,46 @@ +_name = $name; + $this->_title = $title; + $this->_legend = $legend; + $this->_xAxisLabel = $xAxisLabel; + $this->_yAxisLabel = $yAxisLabel; + $this->_plotArea = $plotArea; + $this->_plotVisibleOnly = $plotVisibleOnly; + $this->_displayBlanksAs = $displayBlanksAs; + } + + /** + * Get Name + * + * @return string + */ + public function getName() { + return $this->_name; + } + + /** + * Get Worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() { + return $this->_worksheet; + } + + /** + * Set Worksheet + * + * @param PHPExcel_Worksheet $pValue + * @throws Exception + * @return PHPExcel_Chart + */ + public function setWorksheet(PHPExcel_Worksheet $pValue = null) { + $this->_worksheet = $pValue; + + return $this; + } + + /** + * Get Title + * + * @return PHPExcel_Chart_Title + */ + public function getTitle() { + return $this->_title; + } + + /** + * Set Title + * + * @param PHPExcel_Chart_Title $title + * @return PHPExcel_Chart + */ + public function setTitle(PHPExcel_Chart_Title $title) { + $this->_title = $title; + + return $this; + } + + /** + * Get Legend + * + * @return PHPExcel_Chart_Legend + */ + public function getLegend() { + return $this->_legend; + } + + /** + * Set Legend + * + * @param PHPExcel_Chart_Legend $legend + * @return PHPExcel_Chart + */ + public function setLegend(PHPExcel_Chart_Legend $legend) { + $this->_legend = $legend; + + return $this; + } + + /** + * Get X-Axis Label + * + * @return PHPExcel_Chart_Title + */ + public function getXAxisLabel() { + return $this->_xAxisLabel; + } + + /** + * Set X-Axis Label + * + * @param PHPExcel_Chart_Title $label + * @return PHPExcel_Chart + */ + public function setXAxisLabel(PHPExcel_Chart_Title $label) { + $this->_xAxisLabel = $label; + + return $this; + } + + /** + * Get Y-Axis Label + * + * @return PHPExcel_Chart_Title + */ + public function getYAxisLabel() { + return $this->_yAxisLabel; + } + + /** + * Set Y-Axis Label + * + * @param PHPExcel_Chart_Title $label + * @return PHPExcel_Chart + */ + public function setYAxisLabel(PHPExcel_Chart_Title $label) { + $this->_yAxisLabel = $label; + + return $this; + } + + /** + * Get Plot Area + * + * @return PHPExcel_Chart_PlotArea + */ + public function getPlotArea() { + return $this->_plotArea; + } + + /** + * Get Plot Visible Only + * + * @return boolean + */ + public function getPlotVisibleOnly() { + return $this->_plotVisibleOnly; + } + + /** + * Set Plot Visible Only + * + * @param boolean $plotVisibleOnly + * @return PHPExcel_Chart + */ + public function setPlotVisibleOnly($plotVisibleOnly = true) { + $this->_plotVisibleOnly = $plotVisibleOnly; + + return $this; + } + + /** + * Get Display Blanks as + * + * @return string + */ + public function getDisplayBlanksAs() { + return $this->_displayBlanksAs; + } + + /** + * Set Display Blanks as + * + * @param string $displayBlanksAs + * @return PHPExcel_Chart + */ + public function setDisplayBlanksAs($displayBlanksAs = '0') { + $this->_displayBlanksAs = $displayBlanksAs; + } + + + /** + * Set the Top Left position for the chart + * + * @param string $cell + * @param integer $xOffset + * @param integer $yOffset + * @return PHPExcel_Chart + */ + public function setTopLeftPosition($cell, $xOffset=null, $yOffset=null) { + $this->_topLeftCellRef = $cell; + if (!is_null($xOffset)) + $this->setTopLeftXOffset($xOffset); + if (!is_null($yOffset)) + $this->setTopLeftYOffset($yOffset); + + return $this; + } + + /** + * Get the top left position of the chart + * + * @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell + */ + public function getTopLeftPosition() { + return array( 'cell' => $this->_topLeftCellRef, + 'xOffset' => $this->_topLeftXOffset, + 'yOffset' => $this->_topLeftYOffset + ); + } + + /** + * Get the cell address where the top left of the chart is fixed + * + * @return string + */ + public function getTopLeftCell() { + return $this->_topLeftCellRef; + } + + /** + * Set the Top Left cell position for the chart + * + * @param string $cell + * @return PHPExcel_Chart + */ + public function setTopLeftCell($cell) { + $this->_topLeftCellRef = $cell; + + return $this; + } + + public function setTopLeftOffset($xOffset=null,$yOffset=null) { + if (!is_null($xOffset)) + $this->setTopLeftXOffset($xOffset); + if (!is_null($yOffset)) + $this->setTopLeftYOffset($yOffset); + + return $this; + } + + public function getTopLeftOffset() { + return array( 'X' => $this->_topLeftXOffset, + 'Y' => $this->_topLeftYOffset + ); + } + + public function setTopLeftXOffset($xOffset) { + $this->_topLeftXOffset = $xOffset; + + return $this; + } + + public function getTopLeftXOffset() { + return $this->_topLeftXOffset; + } + + public function setTopLeftYOffset($yOffset) { + $this->_topLeftYOffset = $yOffset; + + return $this; + } + + public function getTopLeftYOffset() { + return $this->_topLeftYOffset; + } + + /** + * Set the Bottom Right position of the chart + * + * @param string $cell + * @param integer $xOffset + * @param integer $yOffset + * @return PHPExcel_Chart + */ + public function setBottomRightPosition($cell, $xOffset=null, $yOffset=null) { + $this->_bottomRightCellRef = $cell; + if (!is_null($xOffset)) + $this->setBottomRightXOffset($xOffset); + if (!is_null($yOffset)) + $this->setBottomRightYOffset($yOffset); + + return $this; + } + + /** + * Get the bottom right position of the chart + * + * @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell + */ + public function getBottomRightPosition() { + return array( 'cell' => $this->_bottomRightCellRef, + 'xOffset' => $this->_bottomRightXOffset, + 'yOffset' => $this->_bottomRightYOffset + ); + } + + public function setBottomRightCell($cell) { + $this->_bottomRightCellRef = $cell; + + return $this; + } + + /** + * Get the cell address where the bottom right of the chart is fixed + * + * @return string + */ + public function getBottomRightCell() { + return $this->_bottomRightCellRef; + } + + public function setBottomRightOffset($xOffset=null,$yOffset=null) { + if (!is_null($xOffset)) + $this->setBottomRightXOffset($xOffset); + if (!is_null($yOffset)) + $this->setBottomRightYOffset($yOffset); + + return $this; + } + + public function getBottomRightOffset() { + return array( 'X' => $this->_bottomRightXOffset, + 'Y' => $this->_bottomRightYOffset + ); + } + + public function setBottomRightXOffset($xOffset) { + $this->_bottomRightXOffset = $xOffset; + + return $this; + } + + public function getBottomRightXOffset() { + return $this->_bottomRightXOffset; + } + + public function setBottomRightYOffset($yOffset) { + $this->_bottomRightYOffset = $yOffset; + + return $this; + } + + public function getBottomRightYOffset() { + return $this->_bottomRightYOffset; + } + + + public function refresh() { + if ($this->_worksheet !== NULL) { + $this->_plotArea->refresh($this->_worksheet); + } + } + + public function render($outputDestination = null) { + $libraryName = PHPExcel_Settings::getChartRendererName(); + if (is_null($libraryName)) { + return false; + } + // Ensure that data series values are up-to-date before we render + $this->refresh(); + + $libraryPath = PHPExcel_Settings::getChartRendererPath(); + $includePath = str_replace('\\','/',get_include_path()); + $rendererPath = str_replace('\\','/',$libraryPath); + if (strpos($rendererPath,$includePath) === false) { + set_include_path(get_include_path() . PATH_SEPARATOR . $libraryPath); + } + + $rendererName = 'PHPExcel_Chart_Renderer_'.$libraryName; + $renderer = new $rendererName($this); + + if ($outputDestination == 'php://output') { + $outputDestination = null; + } + return $renderer->render($outputDestination); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/DataSeries.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/DataSeries.php new file mode 100644 index 000000000..16e5e2319 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/DataSeries.php @@ -0,0 +1,354 @@ +_plotType = $plotType; + $this->_plotGrouping = $plotGrouping; + $this->_plotOrder = $plotOrder; + $keys = array_keys($plotValues); + $this->_plotValues = $plotValues; + if ((count($plotLabel) == 0) || (is_null($plotLabel[$keys[0]]))) { + $plotLabel[$keys[0]] = new PHPExcel_Chart_DataSeriesValues(); + } + + $this->_plotLabel = $plotLabel; + if ((count($plotCategory) == 0) || (is_null($plotCategory[$keys[0]]))) { + $plotCategory[$keys[0]] = new PHPExcel_Chart_DataSeriesValues(); + } + $this->_plotCategory = $plotCategory; + $this->_smoothLine = $smoothLine; + $this->_plotStyle = $plotStyle; + } + + /** + * Get Plot Type + * + * @return string + */ + public function getPlotType() { + return $this->_plotType; + } + + /** + * Set Plot Type + * + * @param string $plotType + */ + public function setPlotType($plotType = '') { + $this->_plotType = $plotType; + } + + /** + * Get Plot Grouping Type + * + * @return string + */ + public function getPlotGrouping() { + return $this->_plotGrouping; + } + + /** + * Set Plot Grouping Type + * + * @param string $groupingType + */ + public function setPlotGrouping($groupingType = null) { + $this->_plotGrouping = $groupingType; + } + + /** + * Get Plot Direction + * + * @return string + */ + public function getPlotDirection() { + return $this->_plotDirection; + } + + /** + * Set Plot Direction + * + * @param string $plotDirection + */ + public function setPlotDirection($plotDirection = null) { + $this->_plotDirection = $plotDirection; + } + + /** + * Get Plot Order + * + * @return string + */ + public function getPlotOrder() { + return $this->_plotOrder; + } + + /** + * Get Plot Labels + * + * @return array of PHPExcel_Chart_DataSeriesValues + */ + public function getPlotLabels() { + return $this->_plotLabel; + } + + /** + * Get Plot Label by Index + * + * @return PHPExcel_Chart_DataSeriesValues + */ + public function getPlotLabelByIndex($index) { + $keys = array_keys($this->_plotLabel); + if (in_array($index,$keys)) { + return $this->_plotLabel[$index]; + } elseif(isset($keys[$index])) { + return $this->_plotLabel[$keys[$index]]; + } + return false; + } + + /** + * Get Plot Categories + * + * @return array of PHPExcel_Chart_DataSeriesValues + */ + public function getPlotCategories() { + return $this->_plotCategory; + } + + /** + * Get Plot Category by Index + * + * @return PHPExcel_Chart_DataSeriesValues + */ + public function getPlotCategoryByIndex($index) { + $keys = array_keys($this->_plotCategory); + if (in_array($index,$keys)) { + return $this->_plotCategory[$index]; + } elseif(isset($keys[$index])) { + return $this->_plotCategory[$keys[$index]]; + } + return false; + } + + /** + * Get Plot Style + * + * @return string + */ + public function getPlotStyle() { + return $this->_plotStyle; + } + + /** + * Set Plot Style + * + * @param string $plotStyle + */ + public function setPlotStyle($plotStyle = null) { + $this->_plotStyle = $plotStyle; + } + + /** + * Get Plot Values + * + * @return array of PHPExcel_Chart_DataSeriesValues + */ + public function getPlotValues() { + return $this->_plotValues; + } + + /** + * Get Plot Values by Index + * + * @return PHPExcel_Chart_DataSeriesValues + */ + public function getPlotValuesByIndex($index) { + $keys = array_keys($this->_plotValues); + if (in_array($index,$keys)) { + return $this->_plotValues[$index]; + } elseif(isset($keys[$index])) { + return $this->_plotValues[$keys[$index]]; + } + return false; + } + + /** + * Get Number of Plot Series + * + * @return integer + */ + public function getPlotSeriesCount() { + return count($this->_plotValues); + } + + /** + * Get Smooth Line + * + * @return boolean + */ + public function getSmoothLine() { + return $this->_smoothLine; + } + + /** + * Set Smooth Line + * + * @param boolean $smoothLine + */ + public function setSmoothLine($smoothLine = TRUE) { + $this->_smoothLine = $smoothLine; + } + + public function refresh(PHPExcel_Worksheet $worksheet) { + foreach($this->_plotValues as $plotValues) { + if ($plotValues !== NULL) + $plotValues->refresh($worksheet, TRUE); + } + foreach($this->_plotLabel as $plotValues) { + if ($plotValues !== NULL) + $plotValues->refresh($worksheet, TRUE); + } + foreach($this->_plotCategory as $plotValues) { + if ($plotValues !== NULL) + $plotValues->refresh($worksheet, FALSE); + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/DataSeriesValues.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/DataSeriesValues.php new file mode 100644 index 000000000..e49d0c79a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/DataSeriesValues.php @@ -0,0 +1,321 @@ +setDataType($dataType); + $this->_dataSource = $dataSource; + $this->_formatCode = $formatCode; + $this->_pointCount = $pointCount; + $this->_dataValues = $dataValues; + $this->_marker = $marker; + } + + /** + * Get Series Data Type + * + * @return string + */ + public function getDataType() { + return $this->_dataType; + } + + /** + * Set Series Data Type + * + * @param string $dataType Datatype of this data series + * Typical values are: + * PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_STRING + * Normally used for axis point values + * PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_NUMBER + * Normally used for chart data values + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setDataType($dataType = self::DATASERIES_TYPE_NUMBER) { + if (!in_array($dataType, self::$_dataTypeValues)) { + throw new PHPExcel_Chart_Exception('Invalid datatype for chart data series values'); + } + $this->_dataType = $dataType; + + return $this; + } + + /** + * Get Series Data Source (formula) + * + * @return string + */ + public function getDataSource() { + return $this->_dataSource; + } + + /** + * Set Series Data Source (formula) + * + * @param string $dataSource + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setDataSource($dataSource = null, $refreshDataValues = true) { + $this->_dataSource = $dataSource; + + if ($refreshDataValues) { + // TO DO + } + + return $this; + } + + /** + * Get Point Marker + * + * @return string + */ + public function getPointMarker() { + return $this->_marker; + } + + /** + * Set Point Marker + * + * @param string $marker + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setPointMarker($marker = null) { + $this->_marker = $marker; + + return $this; + } + + /** + * Get Series Format Code + * + * @return string + */ + public function getFormatCode() { + return $this->_formatCode; + } + + /** + * Set Series Format Code + * + * @param string $formatCode + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setFormatCode($formatCode = null) { + $this->_formatCode = $formatCode; + + return $this; + } + + /** + * Get Series Point Count + * + * @return integer + */ + public function getPointCount() { + return $this->_pointCount; + } + + /** + * Identify if the Data Series is a multi-level or a simple series + * + * @return boolean + */ + public function isMultiLevelSeries() { + if (count($this->_dataValues) > 0) { + return is_array($this->_dataValues[0]); + } + return null; + } + + /** + * Return the level count of a multi-level Data Series + * + * @return boolean + */ + public function multiLevelCount() { + $levelCount = 0; + foreach($this->_dataValues as $dataValueSet) { + $levelCount = max($levelCount,count($dataValueSet)); + } + return $levelCount; + } + + /** + * Get Series Data Values + * + * @return array of mixed + */ + public function getDataValues() { + return $this->_dataValues; + } + + /** + * Get the first Series Data value + * + * @return mixed + */ + public function getDataValue() { + $count = count($this->_dataValues); + if ($count == 0) { + return null; + } elseif ($count == 1) { + return $this->_dataValues[0]; + } + return $this->_dataValues; + } + + /** + * Set Series Data Values + * + * @param array $dataValues + * @param boolean $refreshDataSource + * TRUE - refresh the value of _dataSource based on the values of $dataValues + * FALSE - don't change the value of _dataSource + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setDataValues($dataValues = array(), $refreshDataSource = TRUE) { + $this->_dataValues = PHPExcel_Calculation_Functions::flattenArray($dataValues); + $this->_pointCount = count($dataValues); + + if ($refreshDataSource) { + // TO DO + } + + return $this; + } + + private function _stripNulls($var) { + return $var !== NULL; + } + + public function refresh(PHPExcel_Worksheet $worksheet, $flatten = TRUE) { + if ($this->_dataSource !== NULL) { + $calcEngine = PHPExcel_Calculation::getInstance(); + $newDataValues = PHPExcel_Calculation::_unwrapResult( + $calcEngine->_calculateFormulaValue( + '='.$this->_dataSource, + NULL, + $worksheet->getCell('A1') + ) + ); + if ($flatten) { + $this->_dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues); + } else { + $cellRange = explode('!',$this->_dataSource); + if (count($cellRange) > 1) { + list(,$cellRange) = $cellRange; + } + + $dimensions = PHPExcel_Cell::rangeDimension(str_replace('$','',$cellRange)); + if (($dimensions[0] == 1) || ($dimensions[1] == 1)) { + $this->_dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues); + } else { + $newArray = array_values(array_shift($newDataValues)); + foreach($newArray as $i => $newDataSet) { + $newArray[$i] = array($newDataSet); + } + + foreach($newDataValues as $newDataSet) { + $i = 0; + foreach($newDataSet as $newDataVal) { + array_unshift($newArray[$i++],$newDataVal); + } + } + $this->_dataValues = $newArray; + } + } + $this->_pointCount = count($this->_dataValues); + } + + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Exception.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Exception.php new file mode 100644 index 000000000..984d5f91d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Exception.php @@ -0,0 +1,52 @@ +line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Layout.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Layout.php new file mode 100644 index 000000000..d128382c1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Layout.php @@ -0,0 +1,417 @@ +_layoutTarget = $layout['layoutTarget']; } + if (isset($layout['xMode'])) { $this->_xMode = $layout['xMode']; } + if (isset($layout['yMode'])) { $this->_yMode = $layout['yMode']; } + if (isset($layout['x'])) { $this->_xPos = (float) $layout['x']; } + if (isset($layout['y'])) { $this->_yPos = (float) $layout['y']; } + if (isset($layout['w'])) { $this->_width = (float) $layout['w']; } + if (isset($layout['h'])) { $this->_height = (float) $layout['h']; } + } + + /** + * Get Layout Target + * + * @return string + */ + public function getLayoutTarget() { + return $this->_layoutTarget; + } + + /** + * Set Layout Target + * + * @param Layout Target $value + */ + public function setLayoutTarget($value) { + $this->_layoutTarget = $value; + } + + /** + * Get X-Mode + * + * @return string + */ + public function getXMode() { + return $this->_xMode; + } + + /** + * Set X-Mode + * + * @param X-Mode $value + */ + public function setXMode($value) { + $this->_xMode = $value; + } + + /** + * Get Y-Mode + * + * @return string + */ + public function getYMode() { + return $this->_xMode; + } + + /** + * Set Y-Mode + * + * @param Y-Mode $value + */ + public function setYMode($value) { + $this->_xMode = $value; + } + + /** + * Get X-Position + * + * @return number + */ + public function getXPosition() { + return $this->_xPos; + } + + /** + * Set X-Position + * + * @param X-Position $value + */ + public function setXPosition($value) { + $this->_xPos = $value; + } + + /** + * Get Y-Position + * + * @return number + */ + public function getYPosition() { + return $this->_yPos; + } + + /** + * Set Y-Position + * + * @param Y-Position $value + */ + public function setYPosition($value) { + $this->_yPos = $value; + } + + /** + * Get Width + * + * @return number + */ + public function getWidth() { + return $this->_width; + } + + /** + * Set Width + * + * @param Width $value + */ + public function setWidth($value) { + $this->_width = $value; + } + + /** + * Get Height + * + * @return number + */ + public function getHeight() { + return $this->_height; + } + + /** + * Set Height + * + * @param Height $value + */ + public function setHeight($value) { + $this->_height = $value; + } + + + /** + * Get show legend key + * + * @return boolean + */ + public function getShowLegendKey() { + return $this->_showLegendKey; + } + + /** + * Set show legend key + * Specifies that legend keys should be shown in data labels. + * + * @param boolean $value Show legend key + */ + public function setShowLegendKey($value) { + $this->_showLegendKey = $value; + } + + /** + * Get show value + * + * @return boolean + */ + public function getShowVal() { + return $this->_showVal; + } + + /** + * Set show val + * Specifies that the value should be shown in data labels. + * + * @param boolean $value Show val + */ + public function setShowVal($value) { + $this->_showVal = $value; + } + + /** + * Get show category name + * + * @return boolean + */ + public function getShowCatName() { + return $this->_showCatName; + } + + /** + * Set show cat name + * Specifies that the category name should be shown in data labels. + * + * @param boolean $value Show cat name + */ + public function setShowCatName($value) { + $this->_showCatName = $value; + } + + /** + * Get show data series name + * + * @return boolean + */ + public function getShowSerName() { + return $this->_showSerName; + } + + /** + * Set show ser name + * Specifies that the series name should be shown in data labels. + * + * @param boolean $value Show ser name + */ + public function setShowSerName($value) { + $this->_showSerName = $value; + } + + /** + * Get show percentage + * + * @return boolean + */ + public function getShowPercent() { + return $this->_showPercent; + } + + /** + * Set show percentage + * Specifies that the percentage should be shown in data labels. + * + * @param boolean $value Show percentage + */ + public function setShowPercent($value) { + $this->_showPercent = $value; + } + + /** + * Get show bubble size + * + * @return boolean + */ + public function getShowBubbleSize() { + return $this->_showBubbleSize; + } + + /** + * Set show bubble size + * Specifies that the bubble size should be shown in data labels. + * + * @param boolean $value Show bubble size + */ + public function setShowBubbleSize($value) { + $this->_showBubbleSize = $value; + } + + /** + * Get show leader lines + * + * @return boolean + */ + public function getShowLeaderLines() { + return $this->_showLeaderLines; + } + + /** + * Set show leader lines + * Specifies that leader lines should be shown in data labels. + * + * @param boolean $value Show leader lines + */ + public function setShowLeaderLines($value) { + $this->_showLeaderLines = $value; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Legend.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Legend.php new file mode 100644 index 000000000..0ccd77e95 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Legend.php @@ -0,0 +1,171 @@ + self::POSITION_BOTTOM, + self::xlLegendPositionCorner => self::POSITION_TOPRIGHT, + self::xlLegendPositionCustom => '??', + self::xlLegendPositionLeft => self::POSITION_LEFT, + self::xlLegendPositionRight => self::POSITION_RIGHT, + self::xlLegendPositionTop => self::POSITION_TOP + ); + + /** + * Legend position + * + * @var string + */ + private $_position = self::POSITION_RIGHT; + + /** + * Allow overlay of other elements? + * + * @var boolean + */ + private $_overlay = TRUE; + + /** + * Legend Layout + * + * @var PHPExcel_Chart_Layout + */ + private $_layout = NULL; + + + /** + * Create a new PHPExcel_Chart_Legend + */ + public function __construct($position = self::POSITION_RIGHT, PHPExcel_Chart_Layout $layout = NULL, $overlay = FALSE) + { + $this->setPosition($position); + $this->_layout = $layout; + $this->setOverlay($overlay); + } + + /** + * Get legend position as an excel string value + * + * @return string + */ + public function getPosition() { + return $this->_position; + } + + /** + * Get legend position using an excel string value + * + * @param string $position + */ + public function setPosition($position = self::POSITION_RIGHT) { + if (!in_array($position,self::$_positionXLref)) { + return false; + } + + $this->_position = $position; + return true; + } + + /** + * Get legend position as an Excel internal numeric value + * + * @return number + */ + public function getPositionXL() { + return array_search($this->_position,self::$_positionXLref); + } + + /** + * Set legend position using an Excel internal numeric value + * + * @param number $positionXL + */ + public function setPositionXL($positionXL = self::xlLegendPositionRight) { + if (!array_key_exists($positionXL,self::$_positionXLref)) { + return false; + } + + $this->_position = self::$_positionXLref[$positionXL]; + return true; + } + + /** + * Get allow overlay of other elements? + * + * @return boolean + */ + public function getOverlay() { + return $this->_overlay; + } + + /** + * Set allow overlay of other elements? + * + * @param boolean $overlay + * @return boolean + */ + public function setOverlay($overlay = FALSE) { + if (!is_bool($overlay)) { + return false; + } + + $this->_overlay = $overlay; + return true; + } + + /** + * Get Layout + * + * @return PHPExcel_Chart_Layout + */ + public function getLayout() { + return $this->_layout; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/PlotArea.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/PlotArea.php new file mode 100644 index 000000000..134ee5955 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/PlotArea.php @@ -0,0 +1,125 @@ +_layout = $layout; + $this->_plotSeries = $plotSeries; + } + + /** + * Get Layout + * + * @return PHPExcel_Chart_Layout + */ + public function getLayout() { + return $this->_layout; + } + + /** + * Get Number of Plot Groups + * + * @return array of PHPExcel_Chart_DataSeries + */ + public function getPlotGroupCount() { + return count($this->_plotSeries); + } + + /** + * Get Number of Plot Series + * + * @return integer + */ + public function getPlotSeriesCount() { + $seriesCount = 0; + foreach($this->_plotSeries as $plot) { + $seriesCount += $plot->getPlotSeriesCount(); + } + return $seriesCount; + } + + /** + * Get Plot Series + * + * @return array of PHPExcel_Chart_DataSeries + */ + public function getPlotGroup() { + return $this->_plotSeries; + } + + /** + * Get Plot Series by Index + * + * @return PHPExcel_Chart_DataSeries + */ + public function getPlotGroupByIndex($index) { + return $this->_plotSeries[$index]; + } + + /** + * Set Plot Series + * + * @param array of PHPExcel_Chart_DataSeries + */ + public function setPlotSeries($plotSeries = array()) { + $this->_plotSeries = $plotSeries; + } + + public function refresh(PHPExcel_Worksheet $worksheet) { + foreach($this->_plotSeries as $plotSeries) { + $plotSeries->refresh($worksheet); + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt new file mode 100644 index 000000000..20a825885 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt @@ -0,0 +1,17 @@ +ChartDirector + http://www.advsofteng.com/cdphp.html + +GraPHPite + http://graphpite.sourceforge.net/ + +JpGraph + http://www.aditus.nu/jpgraph/ + +LibChart + http://naku.dohcrew.com/libchart/pages/introduction/ + +pChart + http://pchart.sourceforge.net/ + +TeeChart + http://www.steema.com/products/teechart/overview.html diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Renderer/jpgraph.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Renderer/jpgraph.php new file mode 100644 index 000000000..6fb3aadc1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Renderer/jpgraph.php @@ -0,0 +1,839 @@ + MARK_DIAMOND, + 'square' => MARK_SQUARE, + 'triangle' => MARK_UTRIANGLE, + 'x' => MARK_X, + 'star' => MARK_STAR, + 'dot' => MARK_FILLEDCIRCLE, + 'dash' => MARK_DTRIANGLE, + 'circle' => MARK_CIRCLE, + 'plus' => MARK_CROSS + ); + + + private $_chart = null; + + private $_graph = null; + + private static $_plotColour = 0; + + private static $_plotMark = 0; + + + private function _formatPointMarker($seriesPlot,$markerID) { + $plotMarkKeys = array_keys(self::$_markSet); + if (is_null($markerID)) { + // Use default plot marker (next marker in the series) + self::$_plotMark %= count(self::$_markSet); + $seriesPlot->mark->SetType(self::$_markSet[$plotMarkKeys[self::$_plotMark++]]); + } elseif ($markerID !== 'none') { + // Use specified plot marker (if it exists) + if (isset(self::$_markSet[$markerID])) { + $seriesPlot->mark->SetType(self::$_markSet[$markerID]); + } else { + // If the specified plot marker doesn't exist, use default plot marker (next marker in the series) + self::$_plotMark %= count(self::$_markSet); + $seriesPlot->mark->SetType(self::$_markSet[$plotMarkKeys[self::$_plotMark++]]); + } + } else { + // Hide plot marker + $seriesPlot->mark->Hide(); + } + $seriesPlot->mark->SetColor(self::$_colourSet[self::$_plotColour]); + $seriesPlot->mark->SetFillColor(self::$_colourSet[self::$_plotColour]); + $seriesPlot->SetColor(self::$_colourSet[self::$_plotColour++]); + + return $seriesPlot; + } // function _formatPointMarker() + + + private function _formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '') { + $datasetLabelFormatCode = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode(); + if (!is_null($datasetLabelFormatCode)) { + // Retrieve any label formatting code + $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode); + } + + $testCurrentIndex = 0; + foreach($datasetLabels as $i => $datasetLabel) { + array_reverse($datasetLabel); + + if (is_array($datasetLabel)) { + if ($rotation == 'bar') { + $datasetLabel = array_reverse($datasetLabel); + $datasetLabels[$i] = implode(" ",$datasetLabel); + } else { + $datasetLabels[$i] = implode("\n",$datasetLabel); + } + } else { + // Format labels according to any formatting code + if (!is_null($datasetLabelFormatCode)) { + $datasetLabels[$i] = PHPExcel_Style_NumberFormat::toFormattedString($datasetLabel,$datasetLabelFormatCode); + } + } + ++$testCurrentIndex; + } + + return $datasetLabels; + } // function _formatDataSetLabels() + + + private function _percentageSumCalculation($groupID,$seriesCount) { + // Adjust our values to a percentage value across all series in the group + for($i = 0; $i < $seriesCount; ++$i) { + if ($i == 0) { + $sumValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + } else { + $nextValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + foreach($nextValues as $k => $value) { + if (isset($sumValues[$k])) { + $sumValues[$k] += $value; + } else { + $sumValues[$k] = $value; + } + } + } + } + + return $sumValues; + } // function _percentageSumCalculation() + + + private function _percentageAdjustValues($dataValues,$sumValues) { + foreach($dataValues as $k => $dataValue) { + $dataValues[$k] = $dataValue / $sumValues[$k] * 100; + } + + return $dataValues; + } // function _percentageAdjustValues() + + + private function _getCaption($captionElement) { + // Read any caption + $caption = (!is_null($captionElement)) ? $captionElement->getCaption() : NULL; + // Test if we have a title caption to display + if (!is_null($caption)) { + // If we do, it could be a plain string or an array + if (is_array($caption)) { + // Implode an array to a plain string + $caption = implode('',$caption); + } + } + return $caption; + } // function _getCaption() + + + private function _renderTitle() { + $title = $this->_getCaption($this->_chart->getTitle()); + if (!is_null($title)) { + $this->_graph->title->Set($title); + } + } // function _renderTitle() + + + private function _renderLegend() { + $legend = $this->_chart->getLegend(); + if (!is_null($legend)) { + $legendPosition = $legend->getPosition(); + $legendOverlay = $legend->getOverlay(); + switch ($legendPosition) { + case 'r' : + $this->_graph->legend->SetPos(0.01,0.5,'right','center'); // right + $this->_graph->legend->SetColumns(1); + break; + case 'l' : + $this->_graph->legend->SetPos(0.01,0.5,'left','center'); // left + $this->_graph->legend->SetColumns(1); + break; + case 't' : + $this->_graph->legend->SetPos(0.5,0.01,'center','top'); // top + break; + case 'b' : + $this->_graph->legend->SetPos(0.5,0.99,'center','bottom'); // bottom + break; + default : + $this->_graph->legend->SetPos(0.01,0.01,'right','top'); // top-right + $this->_graph->legend->SetColumns(1); + break; + } + } else { + $this->_graph->legend->Hide(); + } + } // function _renderLegend() + + + private function _renderCartesianPlotArea($type='textlin') { + $this->_graph = new Graph(self::$_width,self::$_height); + $this->_graph->SetScale($type); + + $this->_renderTitle(); + + // Rotate for bar rather than column chart + $rotation = $this->_chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection(); + $reverse = ($rotation == 'bar') ? true : false; + + $xAxisLabel = $this->_chart->getXAxisLabel(); + if (!is_null($xAxisLabel)) { + $title = $this->_getCaption($xAxisLabel); + if (!is_null($title)) { + $this->_graph->xaxis->SetTitle($title,'center'); + $this->_graph->xaxis->title->SetMargin(35); + if ($reverse) { + $this->_graph->xaxis->title->SetAngle(90); + $this->_graph->xaxis->title->SetMargin(90); + } + } + } + + $yAxisLabel = $this->_chart->getYAxisLabel(); + if (!is_null($yAxisLabel)) { + $title = $this->_getCaption($yAxisLabel); + if (!is_null($title)) { + $this->_graph->yaxis->SetTitle($title,'center'); + if ($reverse) { + $this->_graph->yaxis->title->SetAngle(0); + $this->_graph->yaxis->title->SetMargin(-55); + } + } + } + } // function _renderCartesianPlotArea() + + + private function _renderPiePlotArea($doughnut = False) { + $this->_graph = new PieGraph(self::$_width,self::$_height); + + $this->_renderTitle(); + } // function _renderPiePlotArea() + + + private function _renderRadarPlotArea() { + $this->_graph = new RadarGraph(self::$_width,self::$_height); + $this->_graph->SetScale('lin'); + + $this->_renderTitle(); + } // function _renderRadarPlotArea() + + + private function _renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d') { + $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + + $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount); + $this->_graph->xaxis->SetTickLabels($datasetLabels); + } + + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + if ($grouping == 'percentStacked') { + $sumValues = $this->_percentageSumCalculation($groupID,$seriesCount); + } + + // Loop through each data series in turn + for($i = 0; $i < $seriesCount; ++$i) { + $dataValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + $marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); + + if ($grouping == 'percentStacked') { + $dataValues = $this->_percentageAdjustValues($dataValues,$sumValues); + } + + // Fill in any missing values in the $dataValues array + $testCurrentIndex = 0; + foreach($dataValues as $k => $dataValue) { + while($k != $testCurrentIndex) { + $dataValues[$testCurrentIndex] = null; + ++$testCurrentIndex; + } + ++$testCurrentIndex; + } + + $seriesPlot = new LinePlot($dataValues); + if ($combination) { + $seriesPlot->SetBarCenter(); + } + + if ($filled) { + $seriesPlot->SetFilled(true); + $seriesPlot->SetColor('black'); + $seriesPlot->SetFillColor(self::$_colourSet[self::$_plotColour++]); + } else { + // Set the appropriate plot marker + $this->_formatPointMarker($seriesPlot,$marker); + } + $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); + $seriesPlot->SetLegend($dataLabel); + + $seriesPlots[] = $seriesPlot; + } + + if ($grouping == 'standard') { + $groupPlot = $seriesPlots; + } else { + $groupPlot = new AccLinePlot($seriesPlots); + } + $this->_graph->Add($groupPlot); + } // function _renderPlotLine() + + + private function _renderPlotBar($groupID, $dimensions = '2d') { + $rotation = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection(); + // Rotate for bar rather than column chart + if (($groupID == 0) && ($rotation == 'bar')) { + $this->_graph->Set90AndMargin(); + } + $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + + $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation); + // Rotate for bar rather than column chart + if ($rotation == 'bar') { + $datasetLabels = array_reverse($datasetLabels); + $this->_graph->yaxis->SetPos('max'); + $this->_graph->yaxis->SetLabelAlign('center','top'); + $this->_graph->yaxis->SetLabelSide(SIDE_RIGHT); + } + $this->_graph->xaxis->SetTickLabels($datasetLabels); + } + + + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + if ($grouping == 'percentStacked') { + $sumValues = $this->_percentageSumCalculation($groupID,$seriesCount); + } + + // Loop through each data series in turn + for($j = 0; $j < $seriesCount; ++$j) { + $dataValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues(); + if ($grouping == 'percentStacked') { + $dataValues = $this->_percentageAdjustValues($dataValues,$sumValues); + } + + // Fill in any missing values in the $dataValues array + $testCurrentIndex = 0; + foreach($dataValues as $k => $dataValue) { + while($k != $testCurrentIndex) { + $dataValues[$testCurrentIndex] = null; + ++$testCurrentIndex; + } + ++$testCurrentIndex; + } + + // Reverse the $dataValues order for bar rather than column chart + if ($rotation == 'bar') { + $dataValues = array_reverse($dataValues); + } + $seriesPlot = new BarPlot($dataValues); + $seriesPlot->SetColor('black'); + $seriesPlot->SetFillColor(self::$_colourSet[self::$_plotColour++]); + if ($dimensions == '3d') { + $seriesPlot->SetShadow(); + } + if (!$this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) { + $dataLabel = ''; + } else { + $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue(); + } + $seriesPlot->SetLegend($dataLabel); + + $seriesPlots[] = $seriesPlot; + } + // Reverse the plot order for bar rather than column chart + if (($rotation == 'bar') && (!($grouping == 'percentStacked'))) { + $seriesPlots = array_reverse($seriesPlots); + } + + if ($grouping == 'clustered') { + $groupPlot = new GroupBarPlot($seriesPlots); + } elseif ($grouping == 'standard') { + $groupPlot = new GroupBarPlot($seriesPlots); + } else { + $groupPlot = new AccBarPlot($seriesPlots); + if ($dimensions == '3d') { + $groupPlot->SetShadow(); + } + } + + $this->_graph->Add($groupPlot); + } // function _renderPlotBar() + + + private function _renderPlotScatter($groupID,$bubble) { + $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + $scatterStyle = $bubbleSize = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + + // Loop through each data series in turn + for($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + + foreach($dataValuesY as $k => $dataValueY) { + $dataValuesY[$k] = $k; + } + + $seriesPlot = new ScatterPlot($dataValuesX,$dataValuesY); + if ($scatterStyle == 'lineMarker') { + $seriesPlot->SetLinkPoints(); + $seriesPlot->link->SetColor(self::$_colourSet[self::$_plotColour]); + } elseif ($scatterStyle == 'smoothMarker') { + $spline = new Spline($dataValuesY,$dataValuesX); + list($splineDataY,$splineDataX) = $spline->Get(count($dataValuesX) * self::$_width / 20); + $lplot = new LinePlot($splineDataX,$splineDataY); + $lplot->SetColor(self::$_colourSet[self::$_plotColour]); + + $this->_graph->Add($lplot); + } + + if ($bubble) { + $this->_formatPointMarker($seriesPlot,'dot'); + $seriesPlot->mark->SetColor('black'); + $seriesPlot->mark->SetSize($bubbleSize); + } else { + $marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); + $this->_formatPointMarker($seriesPlot,$marker); + } + $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); + $seriesPlot->SetLegend($dataLabel); + + $this->_graph->Add($seriesPlot); + } + } // function _renderPlotScatter() + + + private function _renderPlotRadar($groupID) { + $radarStyle = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + + // Loop through each data series in turn + for($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + $marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); + + $dataValues = array(); + foreach($dataValuesY as $k => $dataValueY) { + $dataValues[$k] = implode(' ',array_reverse($dataValueY)); + } + $tmp = array_shift($dataValues); + $dataValues[] = $tmp; + $tmp = array_shift($dataValuesX); + $dataValuesX[] = $tmp; + + $this->_graph->SetTitles(array_reverse($dataValues)); + + $seriesPlot = new RadarPlot(array_reverse($dataValuesX)); + + $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); + $seriesPlot->SetColor(self::$_colourSet[self::$_plotColour++]); + if ($radarStyle == 'filled') { + $seriesPlot->SetFillColor(self::$_colourSet[self::$_plotColour]); + } + $this->_formatPointMarker($seriesPlot,$marker); + $seriesPlot->SetLegend($dataLabel); + + $this->_graph->Add($seriesPlot); + } + } // function _renderPlotRadar() + + + private function _renderPlotContour($groupID) { + $contourStyle = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + + $dataValues = array(); + // Loop through each data series in turn + for($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + + $dataValues[$i] = $dataValuesX; + } + $seriesPlot = new ContourPlot($dataValues); + + $this->_graph->Add($seriesPlot); + } // function _renderPlotContour() + + + private function _renderPlotStock($groupID) { + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $plotOrder = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder(); + $seriesPlots = array(); + + $dataValues = array(); + // Loop through each data series in turn + for($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + + foreach($dataValuesX as $j => $dataValueX) + $dataValues[$j][$plotOrder[$i]] = $dataValueX; + } + + $seriesPlot = new StockPlot($dataValues); + + $this->_graph->Add($seriesPlot); + } // function _renderPlotStock() + + + private function _renderAreaChart($groupCount, $dimensions = '2d') { + require_once('jpgraph_line.php'); + + $this->_renderCartesianPlotArea(); + + for($i = 0; $i < $groupCount; ++$i) { + $this->_renderPlotLine($i,True,False,$dimensions); + } + } // function _renderAreaChart() + + + private function _renderLineChart($groupCount, $dimensions = '2d') { + require_once('jpgraph_line.php'); + + $this->_renderCartesianPlotArea(); + + for($i = 0; $i < $groupCount; ++$i) { + $this->_renderPlotLine($i,False,False,$dimensions); + } + } // function _renderLineChart() + + + private function _renderBarChart($groupCount, $dimensions = '2d') { + require_once('jpgraph_bar.php'); + + $this->_renderCartesianPlotArea(); + + for($i = 0; $i < $groupCount; ++$i) { + $this->_renderPlotBar($i,$dimensions); + } + } // function _renderBarChart() + + + private function _renderScatterChart($groupCount) { + require_once('jpgraph_scatter.php'); + require_once('jpgraph_regstat.php'); + require_once('jpgraph_line.php'); + + $this->_renderCartesianPlotArea('linlin'); + + for($i = 0; $i < $groupCount; ++$i) { + $this->_renderPlotScatter($i,false); + } + } // function _renderScatterChart() + + + private function _renderBubbleChart($groupCount) { + require_once('jpgraph_scatter.php'); + + $this->_renderCartesianPlotArea('linlin'); + + for($i = 0; $i < $groupCount; ++$i) { + $this->_renderPlotScatter($i,true); + } + } // function _renderBubbleChart() + + + private function _renderPieChart($groupCount, $dimensions = '2d', $doughnut = False, $multiplePlots = False) { + require_once('jpgraph_pie.php'); + if ($dimensions == '3d') { + require_once('jpgraph_pie3d.php'); + } + + $this->_renderPiePlotArea($doughnut); + + $iLimit = ($multiplePlots) ? $groupCount : 1; + for($groupID = 0; $groupID < $iLimit; ++$groupID) { + $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + $exploded = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + if ($groupID == 0) { + $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount); + } + } + + $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + // For pie charts, we only display the first series: doughnut charts generally display all series + $jLimit = ($multiplePlots) ? $seriesCount : 1; + // Loop through each data series in turn + for($j = 0; $j < $jLimit; ++$j) { + $dataValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues(); + + // Fill in any missing values in the $dataValues array + $testCurrentIndex = 0; + foreach($dataValues as $k => $dataValue) { + while($k != $testCurrentIndex) { + $dataValues[$testCurrentIndex] = null; + ++$testCurrentIndex; + } + ++$testCurrentIndex; + } + + if ($dimensions == '3d') { + $seriesPlot = new PiePlot3D($dataValues); + } else { + if ($doughnut) { + $seriesPlot = new PiePlotC($dataValues); + } else { + $seriesPlot = new PiePlot($dataValues); + } + } + + if ($multiplePlots) { + $seriesPlot->SetSize(($jLimit-$j) / ($jLimit * 4)); + } + + if ($doughnut) { + $seriesPlot->SetMidColor('white'); + } + + $seriesPlot->SetColor(self::$_colourSet[self::$_plotColour++]); + if (count($datasetLabels) > 0) + $seriesPlot->SetLabels(array_fill(0,count($datasetLabels),'')); + if ($dimensions != '3d') { + $seriesPlot->SetGuideLines(false); + } + if ($j == 0) { + if ($exploded) { + $seriesPlot->ExplodeAll(); + } + $seriesPlot->SetLegends($datasetLabels); + } + + $this->_graph->Add($seriesPlot); + } + } + } // function _renderPieChart() + + + private function _renderRadarChart($groupCount) { + require_once('jpgraph_radar.php'); + + $this->_renderRadarPlotArea(); + + for($groupID = 0; $groupID < $groupCount; ++$groupID) { + $this->_renderPlotRadar($groupID); + } + } // function _renderRadarChart() + + + private function _renderStockChart($groupCount) { + require_once('jpgraph_stock.php'); + + $this->_renderCartesianPlotArea(); + + for($groupID = 0; $groupID < $groupCount; ++$i) { + $this->_renderPlotStock($groupID); + } + } // function _renderStockChart() + + + private function _renderContourChart($groupCount,$dimensions) { + require_once('jpgraph_contour.php'); + + $this->_renderCartesianPlotArea('intint'); + + for($i = 0; $i < $groupCount; ++$i) { + $this->_renderPlotContour($i); + } + } // function _renderContourChart() + + + private function _renderCombinationChart($groupCount,$dimensions,$outputDestination) { + require_once('jpgraph_line.php'); + require_once('jpgraph_bar.php'); + require_once('jpgraph_scatter.php'); + require_once('jpgraph_regstat.php'); + require_once('jpgraph_line.php'); + + $this->_renderCartesianPlotArea(); + + for($i = 0; $i < $groupCount; ++$i) { + $dimensions = null; + $chartType = $this->_chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); + switch ($chartType) { + case 'area3DChart' : + $dimensions = '3d'; + case 'areaChart' : + $this->_renderPlotLine($i,True,True,$dimensions); + break; + case 'bar3DChart' : + $dimensions = '3d'; + case 'barChart' : + $this->_renderPlotBar($i,$dimensions); + break; + case 'line3DChart' : + $dimensions = '3d'; + case 'lineChart' : + $this->_renderPlotLine($i,False,True,$dimensions); + break; + case 'scatterChart' : + $this->_renderPlotScatter($i,false); + break; + case 'bubbleChart' : + $this->_renderPlotScatter($i,true); + break; + default : + $this->_graph = null; + return false; + } + } + + $this->_renderLegend(); + + $this->_graph->Stroke($outputDestination); + return true; + } // function _renderCombinationChart() + + + public function render($outputDestination) { + self::$_plotColour = 0; + + $groupCount = $this->_chart->getPlotArea()->getPlotGroupCount(); + + $dimensions = null; + if ($groupCount == 1) { + $chartType = $this->_chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); + } else { + $chartTypes = array(); + for($i = 0; $i < $groupCount; ++$i) { + $chartTypes[] = $this->_chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); + } + $chartTypes = array_unique($chartTypes); + if (count($chartTypes) == 1) { + $chartType = array_pop($chartTypes); + } elseif (count($chartTypes) == 0) { + echo 'Chart is not yet implemented
        '; + return false; + } else { + return $this->_renderCombinationChart($groupCount,$dimensions,$outputDestination); + } + } + + switch ($chartType) { + case 'area3DChart' : + $dimensions = '3d'; + case 'areaChart' : + $this->_renderAreaChart($groupCount,$dimensions); + break; + case 'bar3DChart' : + $dimensions = '3d'; + case 'barChart' : + $this->_renderBarChart($groupCount,$dimensions); + break; + case 'line3DChart' : + $dimensions = '3d'; + case 'lineChart' : + $this->_renderLineChart($groupCount,$dimensions); + break; + case 'pie3DChart' : + $dimensions = '3d'; + case 'pieChart' : + $this->_renderPieChart($groupCount,$dimensions,False,False); + break; + case 'doughnut3DChart' : + $dimensions = '3d'; + case 'doughnutChart' : + $this->_renderPieChart($groupCount,$dimensions,True,True); + break; + case 'scatterChart' : + $this->_renderScatterChart($groupCount); + break; + case 'bubbleChart' : + $this->_renderBubbleChart($groupCount); + break; + case 'radarChart' : + $this->_renderRadarChart($groupCount); + break; + case 'surface3DChart' : + $dimensions = '3d'; + case 'surfaceChart' : + $this->_renderContourChart($groupCount,$dimensions); + break; + case 'stockChart' : + $this->_renderStockChart($groupCount,$dimensions); + break; + default : + echo $chartType.' is not yet implemented
        '; + return false; + } + $this->_renderLegend(); + + $this->_graph->Stroke($outputDestination); + return true; + } // function render() + + + /** + * Create a new PHPExcel_Chart_Renderer_jpgraph + */ + public function __construct(PHPExcel_Chart $chart) + { + $this->_graph = null; + $this->_chart = $chart; + } // function __construct() + +} // PHPExcel_Chart_Renderer_jpgraph diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Title.php b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Title.php new file mode 100644 index 000000000..ef26f4658 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Chart/Title.php @@ -0,0 +1,89 @@ +_caption = $caption; + $this->_layout = $layout; + } + + /** + * Get caption + * + * @return string + */ + public function getCaption() { + return $this->_caption; + } + + /** + * Set caption + * + * @param string $caption + */ + public function setCaption($caption = null) { + $this->_caption = $caption; + } + + /** + * Get Layout + * + * @return PHPExcel_Chart_Layout + */ + public function getLayout() { + return $this->_layout; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Comment.php b/fannie/src/PHPExcel/Classes/PHPExcel/Comment.php new file mode 100644 index 000000000..4ba239f4b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Comment.php @@ -0,0 +1,317 @@ +_author = 'Author'; + $this->_text = new PHPExcel_RichText(); + $this->_fillColor = new PHPExcel_Style_Color('FFFFFFE1'); + $this->_alignment = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + } + + /** + * Get Author + * + * @return string + */ + public function getAuthor() { + return $this->_author; + } + + /** + * Set Author + * + * @param string $pValue + * @return PHPExcel_Comment + */ + public function setAuthor($pValue = '') { + $this->_author = $pValue; + return $this; + } + + /** + * Get Rich text comment + * + * @return PHPExcel_RichText + */ + public function getText() { + return $this->_text; + } + + /** + * Set Rich text comment + * + * @param PHPExcel_RichText $pValue + * @return PHPExcel_Comment + */ + public function setText(PHPExcel_RichText $pValue) { + $this->_text = $pValue; + return $this; + } + + /** + * Get comment width (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getWidth() { + return $this->_width; + } + + /** + * Set comment width (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setWidth($value = '96pt') { + $this->_width = $value; + return $this; + } + + /** + * Get comment height (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getHeight() { + return $this->_height; + } + + /** + * Set comment height (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setHeight($value = '55.5pt') { + $this->_height = $value; + return $this; + } + + /** + * Get left margin (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getMarginLeft() { + return $this->_marginLeft; + } + + /** + * Set left margin (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setMarginLeft($value = '59.25pt') { + $this->_marginLeft = $value; + return $this; + } + + /** + * Get top margin (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getMarginTop() { + return $this->_marginTop; + } + + /** + * Set top margin (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setMarginTop($value = '1.5pt') { + $this->_marginTop = $value; + return $this; + } + + /** + * Is the comment visible by default? + * + * @return boolean + */ + public function getVisible() { + return $this->_visible; + } + + /** + * Set comment default visibility + * + * @param boolean $value + * @return PHPExcel_Comment + */ + public function setVisible($value = false) { + $this->_visible = $value; + return $this; + } + + /** + * Get fill color + * + * @return PHPExcel_Style_Color + */ + public function getFillColor() { + return $this->_fillColor; + } + + /** + * Set Alignment + * + * @param string $pValue + * @return PHPExcel_Comment + */ + public function setAlignment($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL) { + $this->_alignment = $pValue; + return $this; + } + + /** + * Get Alignment + * + * @return string + */ + public function getAlignment() { + return $this->_alignment; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_author + . $this->_text->getHashCode() + . $this->_width + . $this->_height + . $this->_marginLeft + . $this->_marginTop + . ($this->_visible ? 1 : 0) + . $this->_fillColor->getHashCode() + . $this->_alignment + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/DocumentProperties.php b/fannie/src/PHPExcel/Classes/PHPExcel/DocumentProperties.php new file mode 100644 index 000000000..1f4cad247 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/DocumentProperties.php @@ -0,0 +1,588 @@ +_lastModifiedBy = $this->_creator; + $this->_created = time(); + $this->_modified = time(); + } + + /** + * Get Creator + * + * @return string + */ + public function getCreator() { + return $this->_creator; + } + + /** + * Set Creator + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCreator($pValue = '') { + $this->_creator = $pValue; + return $this; + } + + /** + * Get Last Modified By + * + * @return string + */ + public function getLastModifiedBy() { + return $this->_lastModifiedBy; + } + + /** + * Set Last Modified By + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setLastModifiedBy($pValue = '') { + $this->_lastModifiedBy = $pValue; + return $this; + } + + /** + * Get Created + * + * @return datetime + */ + public function getCreated() { + return $this->_created; + } + + /** + * Set Created + * + * @param datetime $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCreated($pValue = null) { + if ($pValue === NULL) { + $pValue = time(); + } elseif (is_string($pValue)) { + if (is_numeric($pValue)) { + $pValue = intval($pValue); + } else { + $pValue = strtotime($pValue); + } + } + + $this->_created = $pValue; + return $this; + } + + /** + * Get Modified + * + * @return datetime + */ + public function getModified() { + return $this->_modified; + } + + /** + * Set Modified + * + * @param datetime $pValue + * @return PHPExcel_DocumentProperties + */ + public function setModified($pValue = null) { + if ($pValue === NULL) { + $pValue = time(); + } elseif (is_string($pValue)) { + if (is_numeric($pValue)) { + $pValue = intval($pValue); + } else { + $pValue = strtotime($pValue); + } + } + + $this->_modified = $pValue; + return $this; + } + + /** + * Get Title + * + * @return string + */ + public function getTitle() { + return $this->_title; + } + + /** + * Set Title + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setTitle($pValue = '') { + $this->_title = $pValue; + return $this; + } + + /** + * Get Description + * + * @return string + */ + public function getDescription() { + return $this->_description; + } + + /** + * Set Description + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setDescription($pValue = '') { + $this->_description = $pValue; + return $this; + } + + /** + * Get Subject + * + * @return string + */ + public function getSubject() { + return $this->_subject; + } + + /** + * Set Subject + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setSubject($pValue = '') { + $this->_subject = $pValue; + return $this; + } + + /** + * Get Keywords + * + * @return string + */ + public function getKeywords() { + return $this->_keywords; + } + + /** + * Set Keywords + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setKeywords($pValue = '') { + $this->_keywords = $pValue; + return $this; + } + + /** + * Get Category + * + * @return string + */ + public function getCategory() { + return $this->_category; + } + + /** + * Set Category + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCategory($pValue = '') { + $this->_category = $pValue; + return $this; + } + + /** + * Get Company + * + * @return string + */ + public function getCompany() { + return $this->_company; + } + + /** + * Set Company + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCompany($pValue = '') { + $this->_company = $pValue; + return $this; + } + + /** + * Get Manager + * + * @return string + */ + public function getManager() { + return $this->_manager; + } + + /** + * Set Manager + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setManager($pValue = '') { + $this->_manager = $pValue; + return $this; + } + + /** + * Get a List of Custom Property Names + * + * @return array of string + */ + public function getCustomProperties() { + return array_keys($this->_customProperties); + } + + /** + * Check if a Custom Property is defined + * + * @param string $propertyName + * @return boolean + */ + public function isCustomPropertySet($propertyName) { + return isset($this->_customProperties[$propertyName]); + } + + /** + * Get a Custom Property Value + * + * @param string $propertyName + * @return string + */ + public function getCustomPropertyValue($propertyName) { + if (isset($this->_customProperties[$propertyName])) { + return $this->_customProperties[$propertyName]['value']; + } + + } + + /** + * Get a Custom Property Type + * + * @param string $propertyName + * @return string + */ + public function getCustomPropertyType($propertyName) { + if (isset($this->_customProperties[$propertyName])) { + return $this->_customProperties[$propertyName]['type']; + } + + } + + /** + * Set a Custom Property + * + * @param string $propertyName + * @param mixed $propertyValue + * @param string $propertyType + * 'i' : Integer + * 'f' : Floating Point + * 's' : String + * 'd' : Date/Time + * 'b' : Boolean + * @return PHPExcel_DocumentProperties + */ + public function setCustomProperty($propertyName,$propertyValue='',$propertyType=NULL) { + if (($propertyType === NULL) || (!in_array($propertyType,array(self::PROPERTY_TYPE_INTEGER, + self::PROPERTY_TYPE_FLOAT, + self::PROPERTY_TYPE_STRING, + self::PROPERTY_TYPE_DATE, + self::PROPERTY_TYPE_BOOLEAN)))) { + if ($propertyValue === NULL) { + $propertyType = self::PROPERTY_TYPE_STRING; + } elseif (is_float($propertyValue)) { + $propertyType = self::PROPERTY_TYPE_FLOAT; + } elseif(is_int($propertyValue)) { + $propertyType = self::PROPERTY_TYPE_INTEGER; + } elseif (is_bool($propertyValue)) { + $propertyType = self::PROPERTY_TYPE_BOOLEAN; + } else { + $propertyType = self::PROPERTY_TYPE_STRING; + } + } + + $this->_customProperties[$propertyName] = array('value' => $propertyValue, 'type' => $propertyType); + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + + public static function convertProperty($propertyValue,$propertyType) { + switch ($propertyType) { + case 'empty' : // Empty + return ''; + break; + case 'null' : // Null + return NULL; + break; + case 'i1' : // 1-Byte Signed Integer + case 'i2' : // 2-Byte Signed Integer + case 'i4' : // 4-Byte Signed Integer + case 'i8' : // 8-Byte Signed Integer + case 'int' : // Integer + return (int) $propertyValue; + break; + case 'ui1' : // 1-Byte Unsigned Integer + case 'ui2' : // 2-Byte Unsigned Integer + case 'ui4' : // 4-Byte Unsigned Integer + case 'ui8' : // 8-Byte Unsigned Integer + case 'uint' : // Unsigned Integer + return abs((int) $propertyValue); + break; + case 'r4' : // 4-Byte Real Number + case 'r8' : // 8-Byte Real Number + case 'decimal' : // Decimal + return (float) $propertyValue; + break; + case 'lpstr' : // LPSTR + case 'lpwstr' : // LPWSTR + case 'bstr' : // Basic String + return $propertyValue; + break; + case 'date' : // Date and Time + case 'filetime' : // File Time + return strtotime($propertyValue); + break; + case 'bool' : // Boolean + return ($propertyValue == 'true') ? True : False; + break; + case 'cy' : // Currency + case 'error' : // Error Status Code + case 'vector' : // Vector + case 'array' : // Array + case 'blob' : // Binary Blob + case 'oblob' : // Binary Blob Object + case 'stream' : // Binary Stream + case 'ostream' : // Binary Stream Object + case 'storage' : // Binary Storage + case 'ostorage' : // Binary Storage Object + case 'vstream' : // Binary Versioned Stream + case 'clsid' : // Class ID + case 'cf' : // Clipboard Data + return $propertyValue; + break; + } + return $propertyValue; + } + + public static function convertPropertyType($propertyType) { + switch ($propertyType) { + case 'i1' : // 1-Byte Signed Integer + case 'i2' : // 2-Byte Signed Integer + case 'i4' : // 4-Byte Signed Integer + case 'i8' : // 8-Byte Signed Integer + case 'int' : // Integer + case 'ui1' : // 1-Byte Unsigned Integer + case 'ui2' : // 2-Byte Unsigned Integer + case 'ui4' : // 4-Byte Unsigned Integer + case 'ui8' : // 8-Byte Unsigned Integer + case 'uint' : // Unsigned Integer + return self::PROPERTY_TYPE_INTEGER; + break; + case 'r4' : // 4-Byte Real Number + case 'r8' : // 8-Byte Real Number + case 'decimal' : // Decimal + return self::PROPERTY_TYPE_FLOAT; + break; + case 'empty' : // Empty + case 'null' : // Null + case 'lpstr' : // LPSTR + case 'lpwstr' : // LPWSTR + case 'bstr' : // Basic String + return self::PROPERTY_TYPE_STRING; + break; + case 'date' : // Date and Time + case 'filetime' : // File Time + return self::PROPERTY_TYPE_DATE; + break; + case 'bool' : // Boolean + return self::PROPERTY_TYPE_BOOLEAN; + break; + case 'cy' : // Currency + case 'error' : // Error Status Code + case 'vector' : // Vector + case 'array' : // Array + case 'blob' : // Binary Blob + case 'oblob' : // Binary Blob Object + case 'stream' : // Binary Stream + case 'ostream' : // Binary Stream Object + case 'storage' : // Binary Storage + case 'ostorage' : // Binary Storage Object + case 'vstream' : // Binary Versioned Stream + case 'clsid' : // Class ID + case 'cf' : // Clipboard Data + return self::PROPERTY_TYPE_UNKNOWN; + break; + } + return self::PROPERTY_TYPE_UNKNOWN; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/DocumentSecurity.php b/fannie/src/PHPExcel/Classes/PHPExcel/DocumentSecurity.php new file mode 100644 index 000000000..32bcb9303 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/DocumentSecurity.php @@ -0,0 +1,218 @@ +_lockRevision = false; + $this->_lockStructure = false; + $this->_lockWindows = false; + $this->_revisionsPassword = ''; + $this->_workbookPassword = ''; + } + + /** + * Is some sort of dcument security enabled? + * + * @return boolean + */ + function isSecurityEnabled() { + return $this->_lockRevision || + $this->_lockStructure || + $this->_lockWindows; + } + + /** + * Get LockRevision + * + * @return boolean + */ + function getLockRevision() { + return $this->_lockRevision; + } + + /** + * Set LockRevision + * + * @param boolean $pValue + * @return PHPExcel_DocumentSecurity + */ + function setLockRevision($pValue = false) { + $this->_lockRevision = $pValue; + return $this; + } + + /** + * Get LockStructure + * + * @return boolean + */ + function getLockStructure() { + return $this->_lockStructure; + } + + /** + * Set LockStructure + * + * @param boolean $pValue + * @return PHPExcel_DocumentSecurity + */ + function setLockStructure($pValue = false) { + $this->_lockStructure = $pValue; + return $this; + } + + /** + * Get LockWindows + * + * @return boolean + */ + function getLockWindows() { + return $this->_lockWindows; + } + + /** + * Set LockWindows + * + * @param boolean $pValue + * @return PHPExcel_DocumentSecurity + */ + function setLockWindows($pValue = false) { + $this->_lockWindows = $pValue; + return $this; + } + + /** + * Get RevisionsPassword (hashed) + * + * @return string + */ + function getRevisionsPassword() { + return $this->_revisionsPassword; + } + + /** + * Set RevisionsPassword + * + * @param string $pValue + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @return PHPExcel_DocumentSecurity + */ + function setRevisionsPassword($pValue = '', $pAlreadyHashed = false) { + if (!$pAlreadyHashed) { + $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); + } + $this->_revisionsPassword = $pValue; + return $this; + } + + /** + * Get WorkbookPassword (hashed) + * + * @return string + */ + function getWorkbookPassword() { + return $this->_workbookPassword; + } + + /** + * Set WorkbookPassword + * + * @param string $pValue + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @return PHPExcel_DocumentSecurity + */ + function setWorkbookPassword($pValue = '', $pAlreadyHashed = false) { + if (!$pAlreadyHashed) { + $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); + } + $this->_workbookPassword = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Exception.php b/fannie/src/PHPExcel/Classes/PHPExcel/Exception.php new file mode 100644 index 000000000..454eaaa21 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Exception.php @@ -0,0 +1,52 @@ +line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/HashTable.php b/fannie/src/PHPExcel/Classes/PHPExcel/HashTable.php new file mode 100644 index 000000000..ca15e6e7a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/HashTable.php @@ -0,0 +1,202 @@ +addFromSource($pSource); + } + } + + /** + * Add HashTable items from source + * + * @param PHPExcel_IComparable[] $pSource Source array to create HashTable from + * @throws Exception + */ + public function addFromSource($pSource = null) { + // Check if an array was passed + if ($pSource == null) { + return; + } else if (!is_array($pSource)) { + throw new Exception('Invalid array parameter passed.'); + } + + foreach ($pSource as $item) { + $this->add($item); + } + } + + /** + * Add HashTable item + * + * @param PHPExcel_IComparable $pSource Item to add + * @throws Exception + */ + public function add(PHPExcel_IComparable $pSource = null) { + $hash = $pSource->getHashCode(); + if (!isset($this->_items[$hash])) { + $this->_items[$hash] = $pSource; + $this->_keyMap[count($this->_items) - 1] = $hash; + } + } + + /** + * Remove HashTable item + * + * @param PHPExcel_IComparable $pSource Item to remove + * @throws Exception + */ + public function remove(PHPExcel_IComparable $pSource = null) { + $hash = $pSource->getHashCode(); + if (isset($this->_items[$hash])) { + unset($this->_items[$hash]); + + $deleteKey = -1; + foreach ($this->_keyMap as $key => $value) { + if ($deleteKey >= 0) { + $this->_keyMap[$key - 1] = $value; + } + + if ($value == $hash) { + $deleteKey = $key; + } + } + unset($this->_keyMap[count($this->_keyMap) - 1]); + } + } + + /** + * Clear HashTable + * + */ + public function clear() { + $this->_items = array(); + $this->_keyMap = array(); + } + + /** + * Count + * + * @return int + */ + public function count() { + return count($this->_items); + } + + /** + * Get index for hash code + * + * @param string $pHashCode + * @return int Index + */ + public function getIndexForHashCode($pHashCode = '') { + return array_search($pHashCode, $this->_keyMap); + } + + /** + * Get by index + * + * @param int $pIndex + * @return PHPExcel_IComparable + * + */ + public function getByIndex($pIndex = 0) { + if (isset($this->_keyMap[$pIndex])) { + return $this->getByHashCode( $this->_keyMap[$pIndex] ); + } + + return null; + } + + /** + * Get by hashcode + * + * @param string $pHashCode + * @return PHPExcel_IComparable + * + */ + public function getByHashCode($pHashCode = '') { + if (isset($this->_items[$pHashCode])) { + return $this->_items[$pHashCode]; + } + + return null; + } + + /** + * HashTable to array + * + * @return PHPExcel_IComparable[] + */ + public function toArray() { + return $this->_items; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/IComparable.php b/fannie/src/PHPExcel/Classes/PHPExcel/IComparable.php new file mode 100644 index 000000000..1c87f398c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/IComparable.php @@ -0,0 +1,43 @@ + 'IWriter', 'path' => 'PHPExcel/Writer/{0}.php', 'class' => 'PHPExcel_Writer_{0}' ), + array( 'type' => 'IReader', 'path' => 'PHPExcel/Reader/{0}.php', 'class' => 'PHPExcel_Reader_{0}' ) + ); + + /** + * Autoresolve classes + * + * @var array + * @access private + * @static + */ + private static $_autoResolveClasses = array( + 'Excel2007', + 'Excel5', + 'Excel2003XML', + 'OOCalc', + 'SYLK', + 'Gnumeric', + 'HTML', + 'CSV', + ); + + /** + * Private constructor for PHPExcel_IOFactory + */ + private function __construct() { } + + /** + * Get search locations + * + * @static + * @access public + * @return array + */ + public static function getSearchLocations() { + return self::$_searchLocations; + } // function getSearchLocations() + + /** + * Set search locations + * + * @static + * @access public + * @param array $value + * @throws Exception + */ + public static function setSearchLocations($value) { + if (is_array($value)) { + self::$_searchLocations = $value; + } else { + throw new Exception('Invalid parameter passed.'); + } + } // function setSearchLocations() + + /** + * Add search location + * + * @static + * @access public + * @param string $type Example: IWriter + * @param string $location Example: PHPExcel/Writer/{0}.php + * @param string $classname Example: PHPExcel_Writer_{0} + */ + public static function addSearchLocation($type = '', $location = '', $classname = '') { + self::$_searchLocations[] = array( 'type' => $type, 'path' => $location, 'class' => $classname ); + } // function addSearchLocation() + + /** + * Create PHPExcel_Writer_IWriter + * + * @static + * @access public + * @param PHPExcel $phpExcel + * @param string $writerType Example: Excel2007 + * @return PHPExcel_Writer_IWriter + * @throws Exception + */ + public static function createWriter(PHPExcel $phpExcel, $writerType = '') { + // Search type + $searchType = 'IWriter'; + + // Include class + foreach (self::$_searchLocations as $searchLocation) { + if ($searchLocation['type'] == $searchType) { + $className = str_replace('{0}', $writerType, $searchLocation['class']); + + $instance = new $className($phpExcel); + if ($instance !== NULL) { + return $instance; + } + } + } + + // Nothing found... + throw new Exception("No $searchType found for type $writerType"); + } // function createWriter() + + /** + * Create PHPExcel_Reader_IReader + * + * @static + * @access public + * @param string $readerType Example: Excel2007 + * @return PHPExcel_Reader_IReader + * @throws Exception + */ + public static function createReader($readerType = '') { + // Search type + $searchType = 'IReader'; + + // Include class + foreach (self::$_searchLocations as $searchLocation) { + if ($searchLocation['type'] == $searchType) { + $className = str_replace('{0}', $readerType, $searchLocation['class']); + + $instance = new $className(); + if ($instance !== NULL) { + return $instance; + } + } + } + + // Nothing found... + throw new Exception("No $searchType found for type $readerType"); + } // function createReader() + + /** + * Loads PHPExcel from file using automatic PHPExcel_Reader_IReader resolution + * + * @static + * @access public + * @param string $pFileName The name of the spreadsheet file + * @return PHPExcel + * @throws Exception + */ + public static function load($pFilename) { + $reader = self::createReaderForFile($pFilename); + return $reader->load($pFilename); + } // function load() + + /** + * Identify file type using automatic PHPExcel_Reader_IReader resolution + * + * @static + * @access public + * @param string $pFileName The name of the spreadsheet file to identify + * @return string + * @throws Exception + */ + public static function identify($pFilename) { + $reader = self::createReaderForFile($pFilename); + $className = get_class($reader); + $classType = explode('_',$className); + unset($reader); + return array_pop($classType); + } // function identify() + + /** + * Create PHPExcel_Reader_IReader for file using automatic PHPExcel_Reader_IReader resolution + * + * @static + * @access public + * @param string $pFileName The name of the spreadsheet file + * @return PHPExcel_Reader_IReader + * @throws Exception + */ + public static function createReaderForFile($pFilename) { + + // First, lucky guess by inspecting file extension + $pathinfo = pathinfo($pFilename); + + $extensionType = NULL; + if (isset($pathinfo['extension'])) { + switch (strtolower($pathinfo['extension'])) { + case 'xlsx': // Excel (OfficeOpenXML) Spreadsheet + case 'xlsm': // Excel (OfficeOpenXML) Macro Spreadsheet (macros will be discarded) + case 'xltx': // Excel (OfficeOpenXML) Template + case 'xltm': // Excel (OfficeOpenXML) Macro Template (macros will be discarded) + $extensionType = 'Excel2007'; + break; + case 'xls': // Excel (BIFF) Spreadsheet + case 'xlt': // Excel (BIFF) Template + $extensionType = 'Excel5'; + break; + case 'ods': // Open/Libre Offic Calc + case 'ots': // Open/Libre Offic Calc Template + $extensionType = 'OOCalc'; + break; + case 'slk': + $extensionType = 'SYLK'; + break; + case 'xml': // Excel 2003 SpreadSheetML + $extensionType = 'Excel2003XML'; + break; + case 'gnumeric': + $extensionType = 'Gnumeric'; + break; + case 'htm': + case 'html': + $extensionType = 'HTML'; + break; + case 'csv': + // Do nothing + // We must not try to use CSV reader since it loads + // all files including Excel files etc. + break; + default: + break; + } + + if ($extensionType !== NULL) { + $reader = self::createReader($extensionType); + // Let's see if we are lucky + if (isset($reader) && $reader->canRead($pFilename)) { + return $reader; + } + } + } + + // If we reach here then "lucky guess" didn't give any result + // Try walking through all the options in self::$_autoResolveClasses + foreach (self::$_autoResolveClasses as $autoResolveClass) { + // Ignore our original guess, we know that won't work + if ($autoResolveClass !== $extensionType) { + $reader = self::createReader($autoResolveClass); + if ($reader->canRead($pFilename)) { + return $reader; + } + } + } + + throw new Exception('Unable to identify a reader for this file'); + } // function createReaderForFile() +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/NamedRange.php b/fannie/src/PHPExcel/Classes/PHPExcel/NamedRange.php new file mode 100644 index 000000000..3debd41a1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/NamedRange.php @@ -0,0 +1,245 @@ +_worksheet) + * + * @var bool + */ + private $_localOnly; + + /** + * Scope + * + * @var PHPExcel_Worksheet + */ + private $_scope; + + /** + * Create a new NamedRange + * + * @param string $pName + * @param PHPExcel_Worksheet $pWorksheet + * @param string $pRange + * @param bool $pLocalOnly + * @param PHPExcel_Worksheet|null $pScope Scope. Only applies when $pLocalOnly = true. Null for global scope. + */ + public function __construct($pName = null, PHPExcel_Worksheet $pWorksheet, $pRange = 'A1', $pLocalOnly = false, $pScope = null) + { + // Validate data + if (($pName === NULL) || ($pWorksheet === NULL) || ($pRange === NULL)) { + throw new Exception('Parameters can not be null.'); + } + + // Set local members + $this->_name = $pName; + $this->_worksheet = $pWorksheet; + $this->_range = $pRange; + $this->_localOnly = $pLocalOnly; + $this->_scope = ($pLocalOnly == true) ? + (($pScope == null) ? $pWorksheet : $pScope) : null; + } + + /** + * Get name + * + * @return string + */ + public function getName() { + return $this->_name; + } + + /** + * Set name + * + * @param string $value + * @return PHPExcel_NamedRange + */ + public function setName($value = null) { + if ($value !== NULL) { + // Old title + $oldTitle = $this->_name; + + // Re-attach + if ($this->_worksheet !== NULL) { + $this->_worksheet->getParent()->removeNamedRange($this->_name,$this->_worksheet); + } + $this->_name = $value; + + if ($this->_worksheet !== NULL) { + $this->_worksheet->getParent()->addNamedRange($this); + } + + // New title + $newTitle = $this->_name; + PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->_worksheet->getParent(), $oldTitle, $newTitle); + } + return $this; + } + + /** + * Get worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() { + return $this->_worksheet; + } + + /** + * Set worksheet + * + * @param PHPExcel_Worksheet $value + * @return PHPExcel_NamedRange + */ + public function setWorksheet(PHPExcel_Worksheet $value = null) { + if ($value !== NULL) { + $this->_worksheet = $value; + } + return $this; + } + + /** + * Get range + * + * @return string + */ + public function getRange() { + return $this->_range; + } + + /** + * Set range + * + * @param string $value + * @return PHPExcel_NamedRange + */ + public function setRange($value = null) { + if ($value !== NULL) { + $this->_range = $value; + } + return $this; + } + + /** + * Get localOnly + * + * @return bool + */ + public function getLocalOnly() { + return $this->_localOnly; + } + + /** + * Set localOnly + * + * @param bool $value + * @return PHPExcel_NamedRange + */ + public function setLocalOnly($value = false) { + $this->_localOnly = $value; + $this->_scope = $value ? $this->_worksheet : null; + return $this; + } + + /** + * Get scope + * + * @return PHPExcel_Worksheet|null + */ + public function getScope() { + return $this->_scope; + } + + /** + * Set scope + * + * @param PHPExcel_Worksheet|null $value + * @return PHPExcel_NamedRange + */ + public function setScope(PHPExcel_Worksheet $value = null) { + $this->_scope = $value; + $this->_localOnly = ($value == null) ? false : true; + return $this; + } + + /** + * Resolve a named range to a regular cell range + * + * @param string $pNamedRange Named range + * @param PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope + * @return PHPExcel_NamedRange + */ + public static function resolveRange($pNamedRange = '', PHPExcel_Worksheet $pSheet) { + return $pSheet->getParent()->getNamedRange($pNamedRange, $pSheet); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/CSV.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/CSV.php new file mode 100644 index 000000000..2739e3c41 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/CSV.php @@ -0,0 +1,505 @@ +_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } // function __construct() + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @access public + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + return true; + } // function canRead() + + + /** + * Read filter + * + * @access public + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } // function getReadFilter() + + + /** + * Set read filter + * + * @access public + * @param PHPExcel_Reader_IReadFilter $pValue + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } // function setReadFilter() + + + /** + * Set input encoding + * + * @access public + * @param string $pValue Input encoding + */ + public function setInputEncoding($pValue = 'UTF-8') + { + $this->_inputEncoding = $pValue; + return $this; + } // function setInputEncoding() + + + /** + * Get input encoding + * + * @access public + * @return string + */ + public function getInputEncoding() + { + return $this->_inputEncoding; + } // function getInputEncoding() + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @access public + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Open file + $fileHandle = fopen($pFilename, 'r'); + if ($fileHandle === false) { + throw new Exception("Could not open file " . $pFilename . " for reading."); + } + + // Skip BOM, if any + switch ($this->_inputEncoding) { + case 'UTF-8': + fgets($fileHandle, 4) == "\xEF\xBB\xBF" ? + fseek($fileHandle, 3) : fseek($fileHandle, 0); + break; + case 'UTF-16LE': + fgets($fileHandle, 3) == "\xFF\xFE" ? + fseek($fileHandle, 2) : fseek($fileHandle, 0); + break; + case 'UTF-16BE': + fgets($fileHandle, 3) == "\xFE\xFF" ? + fseek($fileHandle, 2) : fseek($fileHandle, 0); + break; + case 'UTF-32LE': + fgets($fileHandle, 5) == "\xFF\xFE\x00\x00" ? + fseek($fileHandle, 4) : fseek($fileHandle, 0); + break; + case 'UTF-32BE': + fgets($fileHandle, 5) == "\x00\x00\xFE\xFF" ? + fseek($fileHandle, 4) : fseek($fileHandle, 0); + break; + default: + break; + } + + $escapeEnclosures = array( "\\" . $this->_enclosure, $this->_enclosure . $this->_enclosure ); + + $worksheetInfo = array(); + $worksheetInfo[0]['worksheetName'] = 'Worksheet'; + $worksheetInfo[0]['lastColumnLetter'] = 'A'; + $worksheetInfo[0]['lastColumnIndex'] = 0; + $worksheetInfo[0]['totalRows'] = 0; + $worksheetInfo[0]['totalColumns'] = 0; + + // Loop through each line of the file in turn + while (($rowData = fgetcsv($fileHandle, 0, $this->_delimiter, $this->_enclosure)) !== FALSE) { + $worksheetInfo[0]['totalRows']++; + $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1); + } + + $worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']); + $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; + + // Close file + fclose($fileHandle); + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file + * + * @access public + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } // function load() + + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @access public + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Create new PHPExcel + while ($objPHPExcel->getSheetCount() <= $this->_sheetIndex) { + $objPHPExcel->createSheet(); + } + $sheet = $objPHPExcel->setActiveSheetIndex( $this->_sheetIndex ); + + $lineEnding = ini_get('auto_detect_line_endings'); + ini_set('auto_detect_line_endings', true); + + // Open file + $fileHandle = fopen($pFilename, 'r'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for reading."); + } + + // Skip BOM, if any + switch ($this->_inputEncoding) { + case 'UTF-8': + fgets($fileHandle, 4) == "\xEF\xBB\xBF" ? + fseek($fileHandle, 3) : fseek($fileHandle, 0); + break; + case 'UTF-16LE': + fgets($fileHandle, 3) == "\xFF\xFE" ? + fseek($fileHandle, 2) : fseek($fileHandle, 0); + break; + case 'UTF-16BE': + fgets($fileHandle, 3) == "\xFE\xFF" ? + fseek($fileHandle, 2) : fseek($fileHandle, 0); + break; + case 'UTF-32LE': + fgets($fileHandle, 5) == "\xFF\xFE\x00\x00" ? + fseek($fileHandle, 4) : fseek($fileHandle, 0); + break; + case 'UTF-32BE': + fgets($fileHandle, 5) == "\x00\x00\xFE\xFF" ? + fseek($fileHandle, 4) : fseek($fileHandle, 0); + break; + default: + break; + } + + $escapeEnclosures = array( "\\" . $this->_enclosure, + $this->_enclosure . $this->_enclosure + ); + + // Set our starting row based on whether we're in contiguous mode or not + $currentRow = 1; + if ($this->_contiguous) { + $currentRow = ($this->_contiguousRow == -1) ? $sheet->getHighestRow(): $this->_contiguousRow; + } + + // Loop through each line of the file in turn + while (($rowData = fgetcsv($fileHandle, 0, $this->_delimiter, $this->_enclosure)) !== FALSE) { + $columnLetter = 'A'; + foreach($rowData as $rowDatum) { + if ($rowDatum != '' && $this->_readFilter->readCell($columnLetter, $currentRow)) { + // Unescape enclosures + $rowDatum = str_replace($escapeEnclosures, $this->_enclosure, $rowDatum); + + // Convert encoding if necessary + if ($this->_inputEncoding !== 'UTF-8') { + $rowDatum = PHPExcel_Shared_String::ConvertEncoding($rowDatum, 'UTF-8', $this->_inputEncoding); + } + + // Set cell value + $sheet->getCell($columnLetter . $currentRow)->setValue($rowDatum); + } + ++$columnLetter; + } + ++$currentRow; + } + + // Close file + fclose($fileHandle); + + if ($this->_contiguous) { + $this->_contiguousRow = $currentRow; + } + + ini_set('auto_detect_line_endings', $lineEnding); + + // Return + return $objPHPExcel; + } // function loadIntoExisting() + + + /** + * Get delimiter + * + * @access public + * @return string + */ + public function getDelimiter() { + return $this->_delimiter; + } // function getDelimiter() + + + /** + * Set delimiter + * + * @access public + * @param string $pValue Delimiter, defaults to , + * @return PHPExcel_Reader_CSV + */ + public function setDelimiter($pValue = ',') { + $this->_delimiter = $pValue; + return $this; + } // function setDelimiter() + + + /** + * Get enclosure + * + * @access public + * @return string + */ + public function getEnclosure() { + return $this->_enclosure; + } // function getEnclosure() + + + /** + * Set enclosure + * + * @access public + * @param string $pValue Enclosure, defaults to " + * @return PHPExcel_Reader_CSV + */ + public function setEnclosure($pValue = '"') { + if ($pValue == '') { + $pValue = '"'; + } + $this->_enclosure = $pValue; + return $this; + } // function setEnclosure() + + + /** + * Get line ending + * + * @access public + * @return string + */ + public function getLineEnding() { + return $this->_lineEnding; + } // function getLineEnding() + + + /** + * Set line ending + * + * @access public + * @param string $pValue Line ending, defaults to OS line ending (PHP_EOL) + * @return PHPExcel_Reader_CSV + */ + public function setLineEnding($pValue = PHP_EOL) { + $this->_lineEnding = $pValue; + return $this; + } // function setLineEnding() + + + /** + * Get sheet index + * + * @access public + * @return int + */ + public function getSheetIndex() { + return $this->_sheetIndex; + } // function getSheetIndex() + + + /** + * Set sheet index + * + * @access public + * @param int $pValue Sheet index + * @return PHPExcel_Reader_CSV + */ + public function setSheetIndex($pValue = 0) { + $this->_sheetIndex = $pValue; + return $this; + } // function setSheetIndex() + + + /** + * Set Contiguous + * + * @access public + * @param string $pValue Input encoding + */ + public function setContiguous($contiguous = false) + { + $this->_contiguous = (bool)$contiguous; + if (!$contiguous) { + $this->_contiguousRow = -1; + } + + return $this; + } // function setInputEncoding() + + + /** + * Get Contiguous + * + * @access public + * @return boolean + */ + public function getContiguous() { + return $this->_contiguous; + } // function getSheetIndex() + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/DefaultReadFilter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/DefaultReadFilter.php new file mode 100644 index 000000000..276b974ee --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/DefaultReadFilter.php @@ -0,0 +1,58 @@ +_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + + /** + * Read data only? + * + * @return boolean + */ + public function getReadDataOnly() { + return $this->_readDataOnly; + } + + + /** + * Set read data only + * + * @param boolean $pValue + * @return PHPExcel_Reader_Excel2003XML + */ + public function setReadDataOnly($pValue = false) { + $this->_readDataOnly = $pValue; + return $this; + } + + + /** + * Get which sheets to load + * + * @return mixed + */ + public function getLoadSheetsOnly() + { + return $this->_loadSheetsOnly; + } + + + /** + * Set which sheets to load + * + * @param mixed $value + * @return PHPExcel_Reader_Excel2003XML + */ + public function setLoadSheetsOnly($value = null) + { + $this->_loadSheetsOnly = is_array($value) ? + $value : array($value); + return $this; + } + + + /** + * Set all sheets to load + * + * @return PHPExcel_Reader_Excel2003XML + */ + public function setLoadAllSheets() + { + $this->_loadSheetsOnly = null; + return $this; + } + + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + * @return PHPExcel_Reader_Excel2003XML + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + + // Office xmlns:o="urn:schemas-microsoft-com:office:office" + // Excel xmlns:x="urn:schemas-microsoft-com:office:excel" + // XML Spreadsheet xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" + // Spreadsheet component xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" + // XML schema xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" + // XML data type xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" + // MS-persist recordset xmlns:rs="urn:schemas-microsoft-com:rowset" + // Rowset xmlns:z="#RowsetSchema" + // + + $signature = array( + '' + ); + + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Read sample data (first 2 KB will do) + $fh = fopen($pFilename, 'r'); + $data = fread($fh, 2048); + fclose($fh); + + $valid = true; + foreach($signature as $match) { + // every part of the signature must be present + if (strpos($data, $match) === false) { + $valid = false; + break; + } + } + + // Retrieve charset encoding + if(preg_match('//um',$data,$matches)) { + $this->_charSet = strtoupper($matches[1]); + } +// echo 'Character Set is ',$this->_charSet,'
        '; + + return $valid; + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + if (!$this->canRead($pFilename)) { + throw new Exception($pFilename . " is an Invalid Spreadsheet file."); + } + + $worksheetNames = array(); + + $xml = simplexml_load_file($pFilename); + $namespaces = $xml->getNamespaces(true); + + $xml_ss = $xml->children($namespaces['ss']); + foreach($xml_ss->Worksheet as $worksheet) { + $worksheet_ss = $worksheet->attributes($namespaces['ss']); + $worksheetNames[] = self::_convertStringEncoding((string) $worksheet_ss['Name'],$this->_charSet); + } + + return $worksheetNames; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + $xml = simplexml_load_file($pFilename); + $namespaces = $xml->getNamespaces(true); + + $worksheetID = 1; + $xml_ss = $xml->children($namespaces['ss']); + foreach($xml_ss->Worksheet as $worksheet) { + $worksheet_ss = $worksheet->attributes($namespaces['ss']); + + $tmpInfo = array(); + $tmpInfo['worksheetName'] = ''; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + if (isset($worksheet_ss['Name'])) { + $tmpInfo['worksheetName'] = (string) $worksheet_ss['Name']; + } else { + $tmpInfo['worksheetName'] = "Worksheet_{$worksheetID}"; + } + + if (isset($worksheet->Table->Row)) { + $rowIndex = 0; + + foreach($worksheet->Table->Row as $rowData) { + $columnIndex = 0; + $rowHasData = false; + + foreach($rowData->Cell as $cell) { + if (isset($cell->Data)) { + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + $rowHasData = true; + } + + ++$columnIndex; + } + + ++$rowIndex; + + if ($rowHasData) { + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + } + } + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + ++$worksheetID; + } + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + + private static function identifyFixedStyleValue($styleList,&$styleAttributeValue) { + $styleAttributeValue = strtolower($styleAttributeValue); + foreach($styleList as $style) { + if ($styleAttributeValue == strtolower($style)) { + $styleAttributeValue = $style; + return true; + } + } + return false; + } + + + /** + * pixel units to excel width units(units of 1/256th of a character width) + * @param pxs + * @return + */ + private static function _pixel2WidthUnits($pxs) { + $UNIT_OFFSET_MAP = array(0, 36, 73, 109, 146, 182, 219); + + $widthUnits = 256 * ($pxs / 7); + $widthUnits += $UNIT_OFFSET_MAP[($pxs % 7)]; + return $widthUnits; + } + + + /** + * excel width units(units of 1/256th of a character width) to pixel units + * @param widthUnits + * @return + */ + private static function _widthUnits2Pixel($widthUnits) { + $pixels = ($widthUnits / 256) * 7; + $offsetWidthUnits = $widthUnits % 256; + $pixels += round($offsetWidthUnits / (256 / 7)); + return $pixels; + } + + + private static function _hex2str($hex) { + return chr(hexdec($hex[1])); + } + + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + $fromFormats = array('\-', '\ '); + $toFormats = array('-', ' '); + + $underlineStyles = array ( + PHPExcel_Style_Font::UNDERLINE_NONE, + PHPExcel_Style_Font::UNDERLINE_DOUBLE, + PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING, + PHPExcel_Style_Font::UNDERLINE_SINGLE, + PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING + ); + $verticalAlignmentStyles = array ( + PHPExcel_Style_Alignment::VERTICAL_BOTTOM, + PHPExcel_Style_Alignment::VERTICAL_TOP, + PHPExcel_Style_Alignment::VERTICAL_CENTER, + PHPExcel_Style_Alignment::VERTICAL_JUSTIFY + ); + $horizontalAlignmentStyles = array ( + PHPExcel_Style_Alignment::HORIZONTAL_GENERAL, + PHPExcel_Style_Alignment::HORIZONTAL_LEFT, + PHPExcel_Style_Alignment::HORIZONTAL_RIGHT, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS, + PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY + ); + + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + + + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + if (!$this->canRead($pFilename)) { + throw new Exception($pFilename . " is an Invalid Spreadsheet file."); + } + + $xml = simplexml_load_file($pFilename); + $namespaces = $xml->getNamespaces(true); + + $docProps = $objPHPExcel->getProperties(); + if (isset($xml->DocumentProperties[0])) { + foreach($xml->DocumentProperties[0] as $propertyName => $propertyValue) { + switch ($propertyName) { + case 'Title' : + $docProps->setTitle(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Subject' : + $docProps->setSubject(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Author' : + $docProps->setCreator(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Created' : + $creationDate = strtotime($propertyValue); + $docProps->setCreated($creationDate); + break; + case 'LastAuthor' : + $docProps->setLastModifiedBy(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'LastSaved' : + $lastSaveDate = strtotime($propertyValue); + $docProps->setModified($lastSaveDate); + break; + case 'Company' : + $docProps->setCompany(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Category' : + $docProps->setCategory(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Manager' : + $docProps->setManager(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Keywords' : + $docProps->setKeywords(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + case 'Description' : + $docProps->setDescription(self::_convertStringEncoding($propertyValue,$this->_charSet)); + break; + } + } + } + if (isset($xml->CustomDocumentProperties)) { + foreach($xml->CustomDocumentProperties[0] as $propertyName => $propertyValue) { + $propertyAttributes = $propertyValue->attributes($namespaces['dt']); + $propertyName = preg_replace_callback('/_x([0-9a-z]{4})_/','PHPExcel_Reader_Excel2003XML::_hex2str',$propertyName); + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_UNKNOWN; + switch((string) $propertyAttributes) { + case 'string' : + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING; + $propertyValue = trim($propertyValue); + break; + case 'boolean' : + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN; + $propertyValue = (bool) $propertyValue; + break; + case 'integer' : + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_INTEGER; + $propertyValue = intval($propertyValue); + break; + case 'float' : + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT; + $propertyValue = floatval($propertyValue); + break; + case 'dateTime.tz' : + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE; + $propertyValue = strtotime(trim($propertyValue)); + break; + } + $docProps->setCustomProperty($propertyName,$propertyValue,$propertyType); + } + } + + foreach($xml->Styles[0] as $style) { + $style_ss = $style->attributes($namespaces['ss']); + $styleID = (string) $style_ss['ID']; +// echo 'Style ID = '.$styleID.'
        '; + if ($styleID == 'Default') { + $this->_styles['Default'] = array(); + } else { + $this->_styles[$styleID] = $this->_styles['Default']; + } + foreach ($style as $styleType => $styleData) { + $styleAttributes = $styleData->attributes($namespaces['ss']); +// echo $styleType.'
        '; + switch ($styleType) { + case 'Alignment' : + foreach($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
        '; + $styleAttributeValue = (string) $styleAttributeValue; + switch ($styleAttributeKey) { + case 'Vertical' : + if (self::identifyFixedStyleValue($verticalAlignmentStyles,$styleAttributeValue)) { + $this->_styles[$styleID]['alignment']['vertical'] = $styleAttributeValue; + } + break; + case 'Horizontal' : + if (self::identifyFixedStyleValue($horizontalAlignmentStyles,$styleAttributeValue)) { + $this->_styles[$styleID]['alignment']['horizontal'] = $styleAttributeValue; + } + break; + case 'WrapText' : + $this->_styles[$styleID]['alignment']['wrap'] = true; + break; + } + } + break; + case 'Borders' : + foreach($styleData->Border as $borderStyle) { + $borderAttributes = $borderStyle->attributes($namespaces['ss']); + $thisBorder = array(); + foreach($borderAttributes as $borderStyleKey => $borderStyleValue) { +// echo $borderStyleKey.' = '.$borderStyleValue.'
        '; + switch ($borderStyleKey) { + case 'LineStyle' : + $thisBorder['style'] = PHPExcel_Style_Border::BORDER_MEDIUM; +// $thisBorder['style'] = $borderStyleValue; + break; + case 'Weight' : +// $thisBorder['style'] = $borderStyleValue; + break; + case 'Position' : + $borderPosition = strtolower($borderStyleValue); + break; + case 'Color' : + $borderColour = substr($borderStyleValue,1); + $thisBorder['color']['rgb'] = $borderColour; + break; + } + } + if (!empty($thisBorder)) { + if (($borderPosition == 'left') || ($borderPosition == 'right') || ($borderPosition == 'top') || ($borderPosition == 'bottom')) { + $this->_styles[$styleID]['borders'][$borderPosition] = $thisBorder; + } + } + } + break; + case 'Font' : + foreach($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
        '; + $styleAttributeValue = (string) $styleAttributeValue; + switch ($styleAttributeKey) { + case 'FontName' : + $this->_styles[$styleID]['font']['name'] = $styleAttributeValue; + break; + case 'Size' : + $this->_styles[$styleID]['font']['size'] = $styleAttributeValue; + break; + case 'Color' : + $this->_styles[$styleID]['font']['color']['rgb'] = substr($styleAttributeValue,1); + break; + case 'Bold' : + $this->_styles[$styleID]['font']['bold'] = true; + break; + case 'Italic' : + $this->_styles[$styleID]['font']['italic'] = true; + break; + case 'Underline' : + if (self::identifyFixedStyleValue($underlineStyles,$styleAttributeValue)) { + $this->_styles[$styleID]['font']['underline'] = $styleAttributeValue; + } + break; + } + } + break; + case 'Interior' : + foreach($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
        '; + switch ($styleAttributeKey) { + case 'Color' : + $this->_styles[$styleID]['fill']['color']['rgb'] = substr($styleAttributeValue,1); + break; + } + } + break; + case 'NumberFormat' : + foreach($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
        '; + $styleAttributeValue = str_replace($fromFormats,$toFormats,$styleAttributeValue); + switch ($styleAttributeValue) { + case 'Short Date' : + $styleAttributeValue = 'dd/mm/yyyy'; + break; + } + if ($styleAttributeValue > '') { + $this->_styles[$styleID]['numberformat']['code'] = $styleAttributeValue; + } + } + break; + case 'Protection' : + foreach($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
        '; + } + break; + } + } +// print_r($this->_styles[$styleID]); +// echo '
        '; + } +// echo '
        '; + + $worksheetID = 0; + $xml_ss = $xml->children($namespaces['ss']); + + foreach($xml_ss->Worksheet as $worksheet) { + $worksheet_ss = $worksheet->attributes($namespaces['ss']); + + if ((isset($this->_loadSheetsOnly)) && (isset($worksheet_ss['Name'])) && + (!in_array($worksheet_ss['Name'], $this->_loadSheetsOnly))) { + continue; + } + +// echo '

        Worksheet: ',$worksheet_ss['Name'],'

        '; +// + // Create new Worksheet + $objPHPExcel->createSheet(); + $objPHPExcel->setActiveSheetIndex($worksheetID); + if (isset($worksheet_ss['Name'])) { + $worksheetName = self::_convertStringEncoding((string) $worksheet_ss['Name'],$this->_charSet); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in + // formula cells... during the load, all formulae should be correct, and we're simply bringing + // the worksheet name in line with the formula, not the reverse + $objPHPExcel->getActiveSheet()->setTitle($worksheetName,false); + } + + $columnID = 'A'; + if (isset($worksheet->Table->Column)) { + foreach($worksheet->Table->Column as $columnData) { + $columnData_ss = $columnData->attributes($namespaces['ss']); + if (isset($columnData_ss['Index'])) { + $columnID = PHPExcel_Cell::stringFromColumnIndex($columnData_ss['Index']-1); + } + if (isset($columnData_ss['Width'])) { + $columnWidth = $columnData_ss['Width']; +// echo 'Setting column width for '.$columnID.' to '.$columnWidth.'
        '; + $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth($columnWidth / 5.4); + } + ++$columnID; + } + } + + $rowID = 1; + if (isset($worksheet->Table->Row)) { + foreach($worksheet->Table->Row as $rowData) { + $rowHasData = false; + $row_ss = $rowData->attributes($namespaces['ss']); + if (isset($row_ss['Index'])) { + $rowID = (integer) $row_ss['Index']; + } +// echo 'Row '.$rowID.'
        '; + + $columnID = 'A'; + foreach($rowData->Cell as $cell) { + + $cell_ss = $cell->attributes($namespaces['ss']); + if (isset($cell_ss['Index'])) { + $columnID = PHPExcel_Cell::stringFromColumnIndex($cell_ss['Index']-1); + } + $cellRange = $columnID.$rowID; + + if ($this->getReadFilter() !== NULL) { + if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { + continue; + } + } + + if ((isset($cell_ss['MergeAcross'])) || (isset($cell_ss['MergeDown']))) { + $columnTo = $columnID; + if (isset($cell_ss['MergeAcross'])) { + $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cell_ss['MergeAcross'] -1); + } + $rowTo = $rowID; + if (isset($cell_ss['MergeDown'])) { + $rowTo = $rowTo + $cell_ss['MergeDown']; + } + $cellRange .= ':'.$columnTo.$rowTo; + $objPHPExcel->getActiveSheet()->mergeCells($cellRange); + } + + $cellIsSet = $hasCalculatedValue = false; + $cellDataFormula = ''; + if (isset($cell_ss['Formula'])) { + $cellDataFormula = $cell_ss['Formula']; + // added this as a check for array formulas + if (isset($cell_ss['ArrayRange'])) { + $cellDataCSEFormula = $cell_ss['ArrayRange']; +// echo "found an array formula at ".$columnID.$rowID."
        "; + } + $hasCalculatedValue = true; + } + if (isset($cell->Data)) { + $cellValue = $cellData = $cell->Data; + $type = PHPExcel_Cell_DataType::TYPE_NULL; + $cellData_ss = $cellData->attributes($namespaces['ss']); + if (isset($cellData_ss['Type'])) { + $cellDataType = $cellData_ss['Type']; + switch ($cellDataType) { + /* + const TYPE_STRING = 's'; + const TYPE_FORMULA = 'f'; + const TYPE_NUMERIC = 'n'; + const TYPE_BOOL = 'b'; + const TYPE_NULL = 'null'; + const TYPE_INLINE = 'inlineStr'; + const TYPE_ERROR = 'e'; + */ + case 'String' : + $cellValue = self::_convertStringEncoding($cellValue,$this->_charSet); + $type = PHPExcel_Cell_DataType::TYPE_STRING; + break; + case 'Number' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $cellValue = (float) $cellValue; + if (floor($cellValue) == $cellValue) { + $cellValue = (integer) $cellValue; + } + break; + case 'Boolean' : + $type = PHPExcel_Cell_DataType::TYPE_BOOL; + $cellValue = ($cellValue != 0); + break; + case 'DateTime' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $cellValue = PHPExcel_Shared_Date::PHPToExcel(strtotime($cellValue)); + break; + case 'Error' : + $type = PHPExcel_Cell_DataType::TYPE_ERROR; + break; + } + } + + if ($hasCalculatedValue) { +// echo 'FORMULA
        '; + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; + $columnNumber = PHPExcel_Cell::columnIndexFromString($columnID); + if (substr($cellDataFormula,0,3) == 'of:') { + $cellDataFormula = substr($cellDataFormula,3); +// echo 'Before: ',$cellDataFormula,'
        '; + $temp = explode('"',$cellDataFormula); + $key = false; + foreach($temp as &$value) { + // Only replace in alternate array entries (i.e. non-quoted blocks) + if ($key = !$key) { + $value = str_replace(array('[.','.',']'),'',$value); + } + } + } else { + // Convert R1C1 style references to A1 style references (but only when not quoted) +// echo 'Before: ',$cellDataFormula,'
        '; + $temp = explode('"',$cellDataFormula); + $key = false; + foreach($temp as &$value) { + // Only replace in alternate array entries (i.e. non-quoted blocks) + if ($key = !$key) { + preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/',$value, $cellReferences,PREG_SET_ORDER+PREG_OFFSET_CAPTURE); + // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way + // through the formula from left to right. Reversing means that we work right to left.through + // the formula + $cellReferences = array_reverse($cellReferences); + // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, + // then modify the formula to use that new reference + foreach($cellReferences as $cellReference) { + $rowReference = $cellReference[2][0]; + // Empty R reference is the current row + if ($rowReference == '') $rowReference = $rowID; + // Bracketed R references are relative to the current row + if ($rowReference{0} == '[') $rowReference = $rowID + trim($rowReference,'[]'); + $columnReference = $cellReference[4][0]; + // Empty C reference is the current column + if ($columnReference == '') $columnReference = $columnNumber; + // Bracketed C references are relative to the current column + if ($columnReference{0} == '[') $columnReference = $columnNumber + trim($columnReference,'[]'); + $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference; + $value = substr_replace($value,$A1CellReference,$cellReference[0][1],strlen($cellReference[0][0])); + } + } + } + } + unset($value); + // Then rebuild the formula string + $cellDataFormula = implode('"',$temp); +// echo 'After: ',$cellDataFormula,'
        '; + } + +// echo 'Cell '.$columnID.$rowID.' is a '.$type.' with a value of '.(($hasCalculatedValue) ? $cellDataFormula : $cellValue).'
        '; +// + $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $cellValue),$type); + if ($hasCalculatedValue) { +// echo 'Formula result is '.$cellValue.'
        '; + $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setCalculatedValue($cellValue); + } + $cellIsSet = $rowHasData = true; + } + + if (isset($cell->Comment)) { +// echo 'comment found
        '; + $commentAttributes = $cell->Comment->attributes($namespaces['ss']); + $author = 'unknown'; + if (isset($commentAttributes->Author)) { + $author = (string)$commentAttributes->Author; +// echo 'Author: ',$author,'
        '; + } + $node = $cell->Comment->Data->asXML(); +// $annotation = str_replace('html:','',substr($node,49,-10)); +// echo $annotation,'
        '; + $annotation = strip_tags($node); +// echo 'Annotation: ',$annotation,'
        '; + $objPHPExcel->getActiveSheet()->getComment( $columnID.$rowID ) + ->setAuthor(self::_convertStringEncoding($author ,$this->_charSet)) + ->setText($this->_parseRichText($annotation) ); + } + + if (($cellIsSet) && (isset($cell_ss['StyleID']))) { + $style = (string) $cell_ss['StyleID']; +// echo 'Cell style for '.$columnID.$rowID.' is '.$style.'
        '; + if ((isset($this->_styles[$style])) && (!empty($this->_styles[$style]))) { +// echo 'Cell '.$columnID.$rowID.'
        '; +// print_r($this->_styles[$style]); +// echo '
        '; + if (!$objPHPExcel->getActiveSheet()->cellExists($columnID.$rowID)) { + $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setValue(NULL); + } + $objPHPExcel->getActiveSheet()->getStyle($cellRange)->applyFromArray($this->_styles[$style]); + } + } + ++$columnID; + } + + if ($rowHasData) { + if (isset($row_ss['StyleID'])) { + $rowStyle = $row_ss['StyleID']; + } + if (isset($row_ss['Height'])) { + $rowHeight = $row_ss['Height']; +// echo 'Setting row height to '.$rowHeight.'
        '; + $objPHPExcel->getActiveSheet()->getRowDimension($rowID)->setRowHeight($rowHeight); + } + } + + ++$rowID; + } + } + ++$worksheetID; + } + + // Return + return $objPHPExcel; + } + + + private static function _convertStringEncoding($string,$charset) { + if ($charset != 'UTF-8') { + return PHPExcel_Shared_String::ConvertEncoding($string,'UTF-8',$charset); + } + return $string; + } + + + private function _parseRichText($is = '') { + $value = new PHPExcel_RichText(); + + $value->createText(self::_convertStringEncoding($is,$this->_charSet)); + + return $value; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007.php new file mode 100644 index 000000000..0a0ae35ee --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007.php @@ -0,0 +1,2112 @@ +_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + $this->_referenceHelper = PHPExcel_ReferenceHelper::getInstance(); + } + + + /** + * Read data only? + * If this is true, then the Reader will only read data values for cells, it will not read any formatting information. + * If false (the default) it will read data and formatting. + * + * @return boolean + */ + public function getReadDataOnly() { + return $this->_readDataOnly; + } + + + /** + * Set read data only + * Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information. + * Set to false (the default) to advise the Reader to read both data and formatting for cells. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_Excel2007 + */ + public function setReadDataOnly($pValue = FALSE) { + $this->_readDataOnly = $pValue; + return $this; + } + + + /** + * Read charts in workbook? + * If this is true, then the Reader will include any charts that exist in the workbook. + * Note that a ReadDataOnly value of false overrides, and charts won't be read regardless of the IncludeCharts value. + * If false (the default) it will ignore any charts defined in the workbook file. + * + * @return boolean + */ + public function getIncludeCharts() { + return $this->_includeCharts; + } + + + /** + * Set read charts in workbook + * Set to true, to advise the Reader to include any charts that exist in the workbook. + * Note that a ReadDataOnly value of false overrides, and charts won't be read regardless of the IncludeCharts value. + * Set to false (the default) to discard charts. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_Excel2007 + */ + public function setIncludeCharts($pValue = FALSE) { + $this->_includeCharts = (boolean) $pValue; + return $this; + } + + + /** + * Get which sheets to load + * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null + * indicating that all worksheets in the workbook should be loaded. + * + * @return mixed + */ + public function getLoadSheetsOnly() + { + return $this->_loadSheetsOnly; + } + + + /** + * Set which sheets to load + * + * @param mixed $value + * This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name. + * If NULL, then it tells the Reader to read all worksheets in the workbook + * + * @return PHPExcel_Reader_Excel2007 + */ + public function setLoadSheetsOnly($value = NULL) + { + $this->_loadSheetsOnly = is_array($value) ? + $value : array($value); + return $this; + } + + + /** + * Set all sheets to load + * Tells the Reader to load all worksheets from the workbook. + * + * @return PHPExcel_Reader_Excel2007 + */ + public function setLoadAllSheets() + { + $this->_loadSheetsOnly = NULL; + return $this; + } + + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + * @return PHPExcel_Reader_Excel2007 + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Check if zip class exists + if (!class_exists('ZipArchive',FALSE)) { + throw new Exception("ZipArchive library is not enabled"); + } + + $xl = false; + // Load file + $zip = new ZipArchive; + if ($zip->open($pFilename) === true) { + // check if it is an OOXML archive + $rels = simplexml_load_string($this->_getFromZipArchive($zip, "_rels/.rels")); + if ($rels !== false) { + foreach ($rels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": + if (basename($rel["Target"]) == 'workbook.xml') { + $xl = true; + } + break; + + } + } + } + $zip->close(); + } + + return $xl; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + $zip = new ZipArchive; + $zip->open($pFilename); + + $rels = simplexml_load_string($this->_getFromZipArchive($zip, "_rels/.rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($rels->Relationship as $rel) { + if ($rel["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument") { + $dir = dirname($rel["Target"]); + $relsWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $relsWorkbook->registerXPathNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships"); + + $worksheets = array(); + foreach ($relsWorkbook->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet") { + $worksheets[(string) $ele["Id"]] = $ele["Target"]; + } + } + + $xmlWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + if ($xmlWorkbook->sheets) { + $dir = dirname($rel["Target"]); + foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { + $tmpInfo = array(); + $tmpInfo['worksheetName'] = (string) $eleSheet["name"]; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + $fileWorksheet = $worksheets[(string) self::array_item($eleSheet->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")]; + $xmlSheet = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/$fileWorksheet")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + if ($xmlSheet && $xmlSheet->sheetData && $xmlSheet->sheetData->row) { + foreach ($xmlSheet->sheetData->row as $row) { + foreach ($row->c as $c) { + $r = (string) $c["r"]; + $coordinates = PHPExcel_Cell::coordinateFromString($r); + + $rowIndex = $coordinates[1]; + $columnIndex = PHPExcel_Cell::columnIndexFromString($coordinates[0]) - 1; + + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + } + } + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + } + } + } + } + + $zip->close(); + + return $worksheetInfo; + } + + + private static function _castToBool($c) { +// echo 'Initial Cast to Boolean
        '; + $value = isset($c->v) ? (string) $c->v : NULL; + if ($value == '0') { + return FALSE; + } elseif ($value == '1') { + return TRUE; + } else { + return (bool)$c->v; + } + return $value; + } // function _castToBool() + + + private static function _castToError($c) { +// echo 'Initial Cast to Error
        '; + return isset($c->v) ? (string) $c->v : NULL; + } // function _castToError() + + + private static function _castToString($c) { +// echo 'Initial Cast to String
        '; + return isset($c->v) ? (string) $c->v : NULL; + } // function _castToString() + + + private function _castToFormula($c,$r,&$cellDataType,&$value,&$calculatedValue,&$sharedFormulas,$castBaseType) { +// echo 'Formula
        '; +// echo '$c->f is '.$c->f.'
        '; + $cellDataType = 'f'; + $value = "={$c->f}"; + $calculatedValue = self::$castBaseType($c); + + // Shared formula? + if (isset($c->f['t']) && strtolower((string)$c->f['t']) == 'shared') { +// echo 'SHARED FORMULA
        '; + $instance = (string)$c->f['si']; + +// echo 'Instance ID = '.$instance.'
        '; +// +// echo 'Shared Formula Array:
        ';
        +//			print_r($sharedFormulas);
        +//			echo '
        '; + if (!isset($sharedFormulas[(string)$c->f['si']])) { +// echo 'SETTING NEW SHARED FORMULA
        '; +// echo 'Master is '.$r.'
        '; +// echo 'Formula is '.$value.'
        '; + $sharedFormulas[$instance] = array( 'master' => $r, + 'formula' => $value + ); +// echo 'New Shared Formula Array:
        ';
        +//				print_r($sharedFormulas);
        +//				echo '
        '; + } else { +// echo 'GETTING SHARED FORMULA
        '; +// echo 'Master is '.$sharedFormulas[$instance]['master'].'
        '; +// echo 'Formula is '.$sharedFormulas[$instance]['formula'].'
        '; + $master = PHPExcel_Cell::coordinateFromString($sharedFormulas[$instance]['master']); + $current = PHPExcel_Cell::coordinateFromString($r); + + $difference = array(0, 0); + $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]); + $difference[1] = $current[1] - $master[1]; + + $value = $this->_referenceHelper->updateFormulaReferences( $sharedFormulas[$instance]['formula'], + 'A1', + $difference[0], + $difference[1] + ); +// echo 'Adjusted Formula is '.$value.'
        '; + } + } + } + + + public function _getFromZipArchive(ZipArchive $archive, $fileName = '') + { + // Root-relative paths + if (strpos($fileName, '//') !== false) + { + $fileName = substr($fileName, strpos($fileName, '//') + 1); + } + $fileName = PHPExcel_Shared_File::realpath($fileName); + + // Apache POI fixes + $contents = $archive->getFromName($fileName); + if ($contents === false) + { + $contents = $archive->getFromName(substr($fileName, 1)); + } + + return $contents; + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetNames = array(); + + $zip = new ZipArchive; + $zip->open($pFilename); + + $rels = simplexml_load_string($this->_getFromZipArchive($zip, "_rels/.rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($rels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": + $xmlWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + if ($xmlWorkbook->sheets) { + foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { + // Check if sheet should be skipped + $worksheetNames[] = (string) $eleSheet["name"]; + } + } + } + } + + $zip->close(); + + return $worksheetNames; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @throws Exception + */ + public function load($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Initialisations + $excel = new PHPExcel; + $excel->removeSheetByIndex(0); + if (!$this->_readDataOnly) { + $excel->removeCellStyleXfByIndex(0); // remove the default style + $excel->removeCellXfByIndex(0); // remove the default style + } + $zip = new ZipArchive; + $zip->open($pFilename); + + // Read the theme first, because we need the colour scheme when reading the styles + $wbRels = simplexml_load_string($this->_getFromZipArchive($zip, "xl/_rels/workbook.xml.rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($wbRels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme": + $themeOrderArray = array('lt1','dk1','lt2','dk2'); + $themeOrderAdditional = count($themeOrderArray); + + $xmlTheme = simplexml_load_string($this->_getFromZipArchive($zip, "xl/{$rel['Target']}")); + if (is_object($xmlTheme)) { + $xmlThemeName = $xmlTheme->attributes(); + $xmlTheme = $xmlTheme->children("http://schemas.openxmlformats.org/drawingml/2006/main"); + $themeName = (string)$xmlThemeName['name']; + + $colourScheme = $xmlTheme->themeElements->clrScheme->attributes(); + $colourSchemeName = (string)$colourScheme['name']; + $colourScheme = $xmlTheme->themeElements->clrScheme->children("http://schemas.openxmlformats.org/drawingml/2006/main"); + + $themeColours = array(); + foreach ($colourScheme as $k => $xmlColour) { + $themePos = array_search($k,$themeOrderArray); + if ($themePos === false) { + $themePos = $themeOrderAdditional++; + } + if (isset($xmlColour->sysClr)) { + $xmlColourData = $xmlColour->sysClr->attributes(); + $themeColours[$themePos] = $xmlColourData['lastClr']; + } elseif (isset($xmlColour->srgbClr)) { + $xmlColourData = $xmlColour->srgbClr->attributes(); + $themeColours[$themePos] = $xmlColourData['val']; + } + } + self::$_theme = new PHPExcel_Reader_Excel2007_Theme($themeName,$colourSchemeName,$themeColours); + } + break; + } + } + + $rels = simplexml_load_string($this->_getFromZipArchive($zip, "_rels/.rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($rels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties": + $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); + if (is_object($xmlCore)) { + $xmlCore->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/"); + $xmlCore->registerXPathNamespace("dcterms", "http://purl.org/dc/terms/"); + $xmlCore->registerXPathNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"); + $docProps = $excel->getProperties(); + $docProps->setCreator((string) self::array_item($xmlCore->xpath("dc:creator"))); + $docProps->setLastModifiedBy((string) self::array_item($xmlCore->xpath("cp:lastModifiedBy"))); + $docProps->setCreated(strtotime(self::array_item($xmlCore->xpath("dcterms:created")))); //! respect xsi:type + $docProps->setModified(strtotime(self::array_item($xmlCore->xpath("dcterms:modified")))); //! respect xsi:type + $docProps->setTitle((string) self::array_item($xmlCore->xpath("dc:title"))); + $docProps->setDescription((string) self::array_item($xmlCore->xpath("dc:description"))); + $docProps->setSubject((string) self::array_item($xmlCore->xpath("dc:subject"))); + $docProps->setKeywords((string) self::array_item($xmlCore->xpath("cp:keywords"))); + $docProps->setCategory((string) self::array_item($xmlCore->xpath("cp:category"))); + } + break; + + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties": + $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); + if (is_object($xmlCore)) { + $docProps = $excel->getProperties(); + if (isset($xmlCore->Company)) + $docProps->setCompany((string) $xmlCore->Company); + if (isset($xmlCore->Manager)) + $docProps->setManager((string) $xmlCore->Manager); + } + break; + + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties": + $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); + if (is_object($xmlCore)) { + $docProps = $excel->getProperties(); + foreach ($xmlCore as $xmlProperty) { + $cellDataOfficeAttributes = $xmlProperty->attributes(); + if (isset($cellDataOfficeAttributes['name'])) { + $propertyName = (string) $cellDataOfficeAttributes['name']; + $cellDataOfficeChildren = $xmlProperty->children('http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + $attributeType = $cellDataOfficeChildren->getName(); + $attributeValue = (string) $cellDataOfficeChildren->{$attributeType}; + $attributeValue = PHPExcel_DocumentProperties::convertProperty($attributeValue,$attributeType); + $attributeType = PHPExcel_DocumentProperties::convertPropertyType($attributeType); + $docProps->setCustomProperty($propertyName,$attributeValue,$attributeType); + } + } + } + break; + + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": + $dir = dirname($rel["Target"]); + $relsWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $relsWorkbook->registerXPathNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships"); + + $sharedStrings = array(); + $xpath = self::array_item($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings']")); + $xmlStrings = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/$xpath[Target]")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + if (isset($xmlStrings) && isset($xmlStrings->si)) { + foreach ($xmlStrings->si as $val) { + if (isset($val->t)) { + $sharedStrings[] = PHPExcel_Shared_String::ControlCharacterOOXML2PHP( (string) $val->t ); + } elseif (isset($val->r)) { + $sharedStrings[] = $this->_parseRichText($val); + } + } + } + + $worksheets = array(); + foreach ($relsWorkbook->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet") { + $worksheets[(string) $ele["Id"]] = $ele["Target"]; + } + } + + $styles = array(); + $cellStyles = array(); + $xpath = self::array_item($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles']")); + $xmlStyles = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/$xpath[Target]")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + $numFmts = null; + if ($xmlStyles && $xmlStyles->numFmts[0]) { + $numFmts = $xmlStyles->numFmts[0]; + } + if (isset($numFmts) && ($numFmts !== NULL)) { + $numFmts->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + } + if (!$this->_readDataOnly && $xmlStyles) { + foreach ($xmlStyles->cellXfs->xf as $xf) { + $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + + if ($xf["numFmtId"]) { + if (isset($numFmts)) { + $tmpNumFmt = self::array_item($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]")); + + if (isset($tmpNumFmt["formatCode"])) { + $numFmt = (string) $tmpNumFmt["formatCode"]; + } + } + + if ((int)$xf["numFmtId"] < 164) { + $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf["numFmtId"]); + } + } + //$numFmt = str_replace('mm', 'i', $numFmt); + //$numFmt = str_replace('h', 'H', $numFmt); + + $style = (object) array( + "numFmt" => $numFmt, + "font" => $xmlStyles->fonts->font[intval($xf["fontId"])], + "fill" => $xmlStyles->fills->fill[intval($xf["fillId"])], + "border" => $xmlStyles->borders->border[intval($xf["borderId"])], + "alignment" => $xf->alignment, + "protection" => $xf->protection, + ); + $styles[] = $style; + + // add style to cellXf collection + $objStyle = new PHPExcel_Style; + self::_readStyle($objStyle, $style); + $excel->addCellXf($objStyle); + } + + foreach ($xmlStyles->cellStyleXfs->xf as $xf) { + $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + if ($numFmts && $xf["numFmtId"]) { + $tmpNumFmt = self::array_item($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]")); + if (isset($tmpNumFmt["formatCode"])) { + $numFmt = (string) $tmpNumFmt["formatCode"]; + } else if ((int)$xf["numFmtId"] < 165) { + $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf["numFmtId"]); + } + } + + $cellStyle = (object) array( + "numFmt" => $numFmt, + "font" => $xmlStyles->fonts->font[intval($xf["fontId"])], + "fill" => $xmlStyles->fills->fill[intval($xf["fillId"])], + "border" => $xmlStyles->borders->border[intval($xf["borderId"])], + "alignment" => $xf->alignment, + "protection" => $xf->protection, + ); + $cellStyles[] = $cellStyle; + + // add style to cellStyleXf collection + $objStyle = new PHPExcel_Style; + self::_readStyle($objStyle, $cellStyle); + $excel->addCellStyleXf($objStyle); + } + } + + $dxfs = array(); + if (!$this->_readDataOnly && $xmlStyles) { + // Conditional Styles + if ($xmlStyles->dxfs) { + foreach ($xmlStyles->dxfs->dxf as $dxf) { + $style = new PHPExcel_Style(FALSE, TRUE); + self::_readStyle($style, $dxf); + $dxfs[] = $style; + } + } + // Cell Styles + if ($xmlStyles->cellStyles) { + foreach ($xmlStyles->cellStyles->cellStyle as $cellStyle) { + if (intval($cellStyle['builtinId']) == 0) { + if (isset($cellStyles[intval($cellStyle['xfId'])])) { + // Set default style + $style = new PHPExcel_Style; + self::_readStyle($style, $cellStyles[intval($cellStyle['xfId'])]); + + // normal style, currently not using it for anything + } + } + } + } + } + + $xmlWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + // Set base date + if ($xmlWorkbook->workbookPr) { + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900); + if (isset($xmlWorkbook->workbookPr['date1904'])) { + $date1904 = (string)$xmlWorkbook->workbookPr['date1904']; + if ($date1904 == "true" || $date1904 == "1") { + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904); + } + } + } + + $sheetId = 0; // keep track of new sheet id in final workbook + $oldSheetId = -1; // keep track of old sheet id in final workbook + $countSkippedSheets = 0; // keep track of number of skipped sheets + $mapSheetId = array(); // mapping of sheet ids from old to new + + + $charts = $chartDetails = array(); + + if ($xmlWorkbook->sheets) { + foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { + ++$oldSheetId; + + // Check if sheet should be skipped + if (isset($this->_loadSheetsOnly) && !in_array((string) $eleSheet["name"], $this->_loadSheetsOnly)) { + ++$countSkippedSheets; + $mapSheetId[$oldSheetId] = null; + continue; + } + + // Map old sheet id in original workbook to new sheet id. + // They will differ if loadSheetsOnly() is being used + $mapSheetId[$oldSheetId] = $oldSheetId - $countSkippedSheets; + + // Load sheet + $docSheet = $excel->createSheet(); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet + // references in formula cells... during the load, all formulae should be correct, + // and we're simply bringing the worksheet name in line with the formula, not the + // reverse + $docSheet->setTitle((string) $eleSheet["name"],false); + $fileWorksheet = $worksheets[(string) self::array_item($eleSheet->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")]; + $xmlSheet = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/$fileWorksheet")); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + $sharedFormulas = array(); + + if (isset($eleSheet["state"]) && (string) $eleSheet["state"] != '') { + $docSheet->setSheetState( (string) $eleSheet["state"] ); + } + + if (isset($xmlSheet->sheetViews) && isset($xmlSheet->sheetViews->sheetView)) { + if (isset($xmlSheet->sheetViews->sheetView['zoomScale'])) { + $docSheet->getSheetView()->setZoomScale( intval($xmlSheet->sheetViews->sheetView['zoomScale']) ); + } + + if (isset($xmlSheet->sheetViews->sheetView['zoomScaleNormal'])) { + $docSheet->getSheetView()->setZoomScaleNormal( intval($xmlSheet->sheetViews->sheetView['zoomScaleNormal']) ); + } + + if (isset($xmlSheet->sheetViews->sheetView['view'])) { + $docSheet->getSheetView()->setView((string) $xmlSheet->sheetViews->sheetView['view']); + } + + if (isset($xmlSheet->sheetViews->sheetView['showGridLines'])) { + $docSheet->setShowGridLines((string)$xmlSheet->sheetViews->sheetView['showGridLines'] ? true : false); + } + + if (isset($xmlSheet->sheetViews->sheetView['showRowColHeaders'])) { + $docSheet->setShowRowColHeaders((string)$xmlSheet->sheetViews->sheetView['showRowColHeaders'] ? true : false); + } + + if (isset($xmlSheet->sheetViews->sheetView['rightToLeft'])) { + $docSheet->setRightToLeft((string)$xmlSheet->sheetViews->sheetView['rightToLeft'] ? true : false); + } + + if (isset($xmlSheet->sheetViews->sheetView->pane)) { + if (isset($xmlSheet->sheetViews->sheetView->pane['topLeftCell'])) { + $docSheet->freezePane( (string)$xmlSheet->sheetViews->sheetView->pane['topLeftCell'] ); + } else { + $xSplit = 0; + $ySplit = 0; + + if (isset($xmlSheet->sheetViews->sheetView->pane['xSplit'])) { + $xSplit = 1 + intval($xmlSheet->sheetViews->sheetView->pane['xSplit']); + } + + if (isset($xmlSheet->sheetViews->sheetView->pane['ySplit'])) { + $ySplit = 1 + intval($xmlSheet->sheetViews->sheetView->pane['ySplit']); + } + + $docSheet->freezePaneByColumnAndRow($xSplit, $ySplit); + } + } + + if (isset($xmlSheet->sheetViews->sheetView->selection)) { + if (isset($xmlSheet->sheetViews->sheetView->selection['sqref'])) { + $sqref = (string)$xmlSheet->sheetViews->sheetView->selection['sqref']; + $sqref = explode(' ', $sqref); + $sqref = $sqref[0]; + $docSheet->setSelectedCells($sqref); + } + } + + } + + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->tabColor)) { + if (isset($xmlSheet->sheetPr->tabColor['rgb'])) { + $docSheet->getTabColor()->setARGB( (string)$xmlSheet->sheetPr->tabColor['rgb'] ); + } + } + + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->outlinePr)) { + if (isset($xmlSheet->sheetPr->outlinePr['summaryRight']) && $xmlSheet->sheetPr->outlinePr['summaryRight'] == false) { + $docSheet->setShowSummaryRight(false); + } else { + $docSheet->setShowSummaryRight(true); + } + + if (isset($xmlSheet->sheetPr->outlinePr['summaryBelow']) && $xmlSheet->sheetPr->outlinePr['summaryBelow'] == false) { + $docSheet->setShowSummaryBelow(false); + } else { + $docSheet->setShowSummaryBelow(true); + } + } + + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->pageSetUpPr)) { + if (isset($xmlSheet->sheetPr->pageSetUpPr['fitToPage']) && $xmlSheet->sheetPr->pageSetUpPr['fitToPage'] == false) { + $docSheet->getPageSetup()->setFitToPage(false); + } else { + $docSheet->getPageSetup()->setFitToPage(true); + } + } + + if (isset($xmlSheet->sheetFormatPr)) { + if (isset($xmlSheet->sheetFormatPr['customHeight']) && ((string)$xmlSheet->sheetFormatPr['customHeight'] == '1' || strtolower((string)$xmlSheet->sheetFormatPr['customHeight']) == 'true') && isset($xmlSheet->sheetFormatPr['defaultRowHeight'])) { + $docSheet->getDefaultRowDimension()->setRowHeight( (float)$xmlSheet->sheetFormatPr['defaultRowHeight'] ); + } + if (isset($xmlSheet->sheetFormatPr['defaultColWidth'])) { + $docSheet->getDefaultColumnDimension()->setWidth( (float)$xmlSheet->sheetFormatPr['defaultColWidth'] ); + } + if (isset($xmlSheet->sheetFormatPr['zeroHeight']) && + ((string)$xmlSheet->sheetFormatPr['zeroHeight'] == '1')) { + $docSheet->getDefaultRowDimension()->setzeroHeight(true); + } + } + + if (isset($xmlSheet->cols) && !$this->_readDataOnly) { + foreach ($xmlSheet->cols->col as $col) { + for ($i = intval($col["min"]) - 1; $i < intval($col["max"]); ++$i) { + if ($col["style"] && !$this->_readDataOnly) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setXfIndex(intval($col["style"])); + } + if ($col["bestFit"]) { + //$docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setAutoSize(true); + } + if ($col["hidden"]) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setVisible(false); + } + if ($col["collapsed"]) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setCollapsed(true); + } + if ($col["outlineLevel"] > 0) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setOutlineLevel(intval($col["outlineLevel"])); + } + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setWidth(floatval($col["width"])); + + if (intval($col["max"]) == 16384) { + break; + } + } + } + } + + if (isset($xmlSheet->printOptions) && !$this->_readDataOnly) { + if ($xmlSheet->printOptions['gridLinesSet'] == 'true' && $xmlSheet->printOptions['gridLinesSet'] == '1') { + $docSheet->setShowGridlines(true); + } + + if ($xmlSheet->printOptions['gridLines'] == 'true' || $xmlSheet->printOptions['gridLines'] == '1') { + $docSheet->setPrintGridlines(true); + } + + if ($xmlSheet->printOptions['horizontalCentered']) { + $docSheet->getPageSetup()->setHorizontalCentered(true); + } + if ($xmlSheet->printOptions['verticalCentered']) { + $docSheet->getPageSetup()->setVerticalCentered(true); + } + } + + if ($xmlSheet && $xmlSheet->sheetData && $xmlSheet->sheetData->row) { + foreach ($xmlSheet->sheetData->row as $row) { + if ($row["ht"] && !$this->_readDataOnly) { + $docSheet->getRowDimension(intval($row["r"]))->setRowHeight(floatval($row["ht"])); + } + if ($row["hidden"] && !$this->_readDataOnly) { + $docSheet->getRowDimension(intval($row["r"]))->setVisible(false); + } + if ($row["collapsed"]) { + $docSheet->getRowDimension(intval($row["r"]))->setCollapsed(true); + } + if ($row["outlineLevel"] > 0) { + $docSheet->getRowDimension(intval($row["r"]))->setOutlineLevel(intval($row["outlineLevel"])); + } + if ($row["s"] && !$this->_readDataOnly) { + $docSheet->getRowDimension(intval($row["r"]))->setXfIndex(intval($row["s"])); + } + + foreach ($row->c as $c) { + $r = (string) $c["r"]; + $cellDataType = (string) $c["t"]; + $value = null; + $calculatedValue = null; + + // Read cell? + if ($this->getReadFilter() !== NULL) { + $coordinates = PHPExcel_Cell::coordinateFromString($r); + + if (!$this->getReadFilter()->readCell($coordinates[0], $coordinates[1], $docSheet->getTitle())) { + continue; + } + } + + // echo 'Reading cell '.$coordinates[0].$coordinates[1].'
        '; + // print_r($c); + // echo '
        '; + // echo 'Cell Data Type is '.$cellDataType.': '; + // + // Read cell! + switch ($cellDataType) { + case "s": + // echo 'String
        '; + if ((string)$c->v != '') { + $value = $sharedStrings[intval($c->v)]; + + if ($value instanceof PHPExcel_RichText) { + $value = clone $value; + } + } else { + $value = ''; + } + + break; + case "b": + // echo 'Boolean
        '; + if (!isset($c->f)) { + $value = self::_castToBool($c); + } else { + // Formula + $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToBool'); + if (isset($c->f['t'])) { + $att = array(); + $att = $c->f; + $docSheet->getCell($r)->setFormulaAttributes($att); + } + // echo '$calculatedValue = '.$calculatedValue.'
        '; + } + break; + case "inlineStr": + // echo 'Inline String
        '; + $value = $this->_parseRichText($c->is); + + break; + case "e": + // echo 'Error
        '; + if (!isset($c->f)) { + $value = self::_castToError($c); + } else { + // Formula + $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToError'); + // echo '$calculatedValue = '.$calculatedValue.'
        '; + } + + break; + + default: + // echo 'Default
        '; + if (!isset($c->f)) { + // echo 'Not a Formula
        '; + $value = self::_castToString($c); + } else { + // echo 'Treat as Formula
        '; + // Formula + $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToString'); + // echo '$calculatedValue = '.$calculatedValue.'
        '; + } + + break; + } + // echo 'Value is '.$value.'
        '; + + // Check for numeric values + if (is_numeric($value) && $cellDataType != 's') { + if ($value == (int)$value) $value = (int)$value; + elseif ($value == (float)$value) $value = (float)$value; + elseif ($value == (double)$value) $value = (double)$value; + } + + // Rich text? + if ($value instanceof PHPExcel_RichText && $this->_readDataOnly) { + $value = $value->getPlainText(); + } + + $cell = $docSheet->getCell($r); + // Assign value + if ($cellDataType != '') { + $cell->setValueExplicit($value, $cellDataType); + } else { + $cell->setValue($value); + } + if ($calculatedValue !== NULL) { + $cell->setCalculatedValue($calculatedValue); + } + + // Style information? + if ($c["s"] && !$this->_readDataOnly) { + // no style index means 0, it seems + $cell->setXfIndex(isset($styles[intval($c["s"])]) ? + intval($c["s"]) : 0); + } + } + } + } + + $conditionals = array(); + if (!$this->_readDataOnly && $xmlSheet && $xmlSheet->conditionalFormatting) { + foreach ($xmlSheet->conditionalFormatting as $conditional) { + foreach ($conditional->cfRule as $cfRule) { + if ( + ( + (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_NONE || + (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_CELLIS || + (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT || + (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_EXPRESSION + ) && isset($dxfs[intval($cfRule["dxfId"])]) + ) { + $conditionals[(string) $conditional["sqref"]][intval($cfRule["priority"])] = $cfRule; + } + } + } + + foreach ($conditionals as $ref => $cfRules) { + ksort($cfRules); + $conditionalStyles = array(); + foreach ($cfRules as $cfRule) { + $objConditional = new PHPExcel_Style_Conditional(); + $objConditional->setConditionType((string)$cfRule["type"]); + $objConditional->setOperatorType((string)$cfRule["operator"]); + + if ((string)$cfRule["text"] != '') { + $objConditional->setText((string)$cfRule["text"]); + } + + if (count($cfRule->formula) > 1) { + foreach ($cfRule->formula as $formula) { + $objConditional->addCondition((string)$formula); + } + } else { + $objConditional->addCondition((string)$cfRule->formula); + } + $objConditional->setStyle(clone $dxfs[intval($cfRule["dxfId"])]); + $conditionalStyles[] = $objConditional; + } + + // Extract all cell references in $ref + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($ref); + foreach ($aReferences as $reference) { + $docSheet->getStyle($reference)->setConditionalStyles($conditionalStyles); + } + } + } + + $aKeys = array("sheet", "objects", "scenarios", "formatCells", "formatColumns", "formatRows", "insertColumns", "insertRows", "insertHyperlinks", "deleteColumns", "deleteRows", "selectLockedCells", "sort", "autoFilter", "pivotTables", "selectUnlockedCells"); + if (!$this->_readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) { + foreach ($aKeys as $key) { + $method = "set" . ucfirst($key); + $docSheet->getProtection()->$method($xmlSheet->sheetProtection[$key] == "true"); + } + } + + if (!$this->_readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) { + $docSheet->getProtection()->setPassword((string) $xmlSheet->sheetProtection["password"], true); + if ($xmlSheet->protectedRanges->protectedRange) { + foreach ($xmlSheet->protectedRanges->protectedRange as $protectedRange) { + $docSheet->protectCells((string) $protectedRange["sqref"], (string) $protectedRange["password"], true); + } + } + } + + if ($xmlSheet && $xmlSheet->autoFilter && !$this->_readDataOnly) { + $autoFilter = $docSheet->getAutoFilter(); + $autoFilter->setRange((string) $xmlSheet->autoFilter["ref"]); + foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) { + $column = $autoFilter->getColumnByOffset((integer) $filterColumn["colId"]); + // Check for standard filters + if ($filterColumn->filters) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER); + $filters = $filterColumn->filters; + if ((isset($filters["blank"])) && ($filters["blank"] == 1)) { + $column->createRule()->setRule( + NULL, // Operator is undefined, but always treated as EQUAL + '' + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER); + } + // Standard filters are always an OR join, so no join rule needs to be set + // Entries can be either filter elements + foreach ($filters->filter as $filterRule) { + $column->createRule()->setRule( + NULL, // Operator is undefined, but always treated as EQUAL + (string) $filterRule["val"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER); + } + // Or Date Group elements + foreach ($filters->dateGroupItem as $dateGroupItem) { + $column->createRule()->setRule( + NULL, // Operator is undefined, but always treated as EQUAL + array( + 'year' => (string) $dateGroupItem["year"], + 'month' => (string) $dateGroupItem["month"], + 'day' => (string) $dateGroupItem["day"], + 'hour' => (string) $dateGroupItem["hour"], + 'minute' => (string) $dateGroupItem["minute"], + 'second' => (string) $dateGroupItem["second"], + ), + (string) $dateGroupItem["dateTimeGrouping"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP); + } + } + // Check for custom filters + if ($filterColumn->customFilters) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER); + $customFilters = $filterColumn->customFilters; + // Custom filters can an AND or an OR join; + // and there should only ever be one or two entries + if ((isset($customFilters["and"])) && ($customFilters["and"] == 1)) { + $column->setJoin(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND); + } + foreach ($customFilters->customFilter as $filterRule) { + $column->createRule()->setRule( + (string) $filterRule["operator"], + (string) $filterRule["val"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); + } + } + // Check for dynamic filters + if ($filterColumn->dynamicFilter) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER); + // We should only ever have one dynamic filter + foreach ($filterColumn->dynamicFilter as $filterRule) { + $column->createRule()->setRule( + NULL, // Operator is undefined, but always treated as EQUAL + (string) $filterRule["val"], + (string) $filterRule["type"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER); + if (isset($filterRule["val"])) { + $column->setAttribute('val',(string) $filterRule["val"]); + } + if (isset($filterRule["maxVal"])) { + $column->setAttribute('maxVal',(string) $filterRule["maxVal"]); + } + } + } + // Check for dynamic filters + if ($filterColumn->top10) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER); + // We should only ever have one top10 filter + foreach ($filterColumn->top10 as $filterRule) { + $column->createRule()->setRule( + (((isset($filterRule["percent"])) && ($filterRule["percent"] == 1)) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE + ), + (string) $filterRule["val"], + (((isset($filterRule["top"])) && ($filterRule["top"] == 1)) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM + ) + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER); + } + } + } + } + + if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->_readDataOnly) { + foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) { + $mergeRef = (string) $mergeCell["ref"]; + if (strpos($mergeRef,':') !== FALSE) { + $docSheet->mergeCells((string) $mergeCell["ref"]); + } + } + } + + if ($xmlSheet && $xmlSheet->pageMargins && !$this->_readDataOnly) { + $docPageMargins = $docSheet->getPageMargins(); + $docPageMargins->setLeft(floatval($xmlSheet->pageMargins["left"])); + $docPageMargins->setRight(floatval($xmlSheet->pageMargins["right"])); + $docPageMargins->setTop(floatval($xmlSheet->pageMargins["top"])); + $docPageMargins->setBottom(floatval($xmlSheet->pageMargins["bottom"])); + $docPageMargins->setHeader(floatval($xmlSheet->pageMargins["header"])); + $docPageMargins->setFooter(floatval($xmlSheet->pageMargins["footer"])); + } + + if ($xmlSheet && $xmlSheet->pageSetup && !$this->_readDataOnly) { + $docPageSetup = $docSheet->getPageSetup(); + + if (isset($xmlSheet->pageSetup["orientation"])) { + $docPageSetup->setOrientation((string) $xmlSheet->pageSetup["orientation"]); + } + if (isset($xmlSheet->pageSetup["paperSize"])) { + $docPageSetup->setPaperSize(intval($xmlSheet->pageSetup["paperSize"])); + } + if (isset($xmlSheet->pageSetup["scale"])) { + $docPageSetup->setScale(intval($xmlSheet->pageSetup["scale"]), false); + } + if (isset($xmlSheet->pageSetup["fitToHeight"]) && intval($xmlSheet->pageSetup["fitToHeight"]) >= 0) { + $docPageSetup->setFitToHeight(intval($xmlSheet->pageSetup["fitToHeight"]), false); + } + if (isset($xmlSheet->pageSetup["fitToWidth"]) && intval($xmlSheet->pageSetup["fitToWidth"]) >= 0) { + $docPageSetup->setFitToWidth(intval($xmlSheet->pageSetup["fitToWidth"]), false); + } + if (isset($xmlSheet->pageSetup["firstPageNumber"]) && isset($xmlSheet->pageSetup["useFirstPageNumber"]) && + ((string)$xmlSheet->pageSetup["useFirstPageNumber"] == 'true' || (string)$xmlSheet->pageSetup["useFirstPageNumber"] == '1')) { + $docPageSetup->setFirstPageNumber(intval($xmlSheet->pageSetup["firstPageNumber"])); + } + } + + if ($xmlSheet && $xmlSheet->headerFooter && !$this->_readDataOnly) { + $docHeaderFooter = $docSheet->getHeaderFooter(); + + if (isset($xmlSheet->headerFooter["differentOddEven"]) && + ((string)$xmlSheet->headerFooter["differentOddEven"] == 'true' || (string)$xmlSheet->headerFooter["differentOddEven"] == '1')) { + $docHeaderFooter->setDifferentOddEven(true); + } else { + $docHeaderFooter->setDifferentOddEven(false); + } + if (isset($xmlSheet->headerFooter["differentFirst"]) && + ((string)$xmlSheet->headerFooter["differentFirst"] == 'true' || (string)$xmlSheet->headerFooter["differentFirst"] == '1')) { + $docHeaderFooter->setDifferentFirst(true); + } else { + $docHeaderFooter->setDifferentFirst(false); + } + if (isset($xmlSheet->headerFooter["scaleWithDoc"]) && + ((string)$xmlSheet->headerFooter["scaleWithDoc"] == 'false' || (string)$xmlSheet->headerFooter["scaleWithDoc"] == '0')) { + $docHeaderFooter->setScaleWithDocument(false); + } else { + $docHeaderFooter->setScaleWithDocument(true); + } + if (isset($xmlSheet->headerFooter["alignWithMargins"]) && + ((string)$xmlSheet->headerFooter["alignWithMargins"] == 'false' || (string)$xmlSheet->headerFooter["alignWithMargins"] == '0')) { + $docHeaderFooter->setAlignWithMargins(false); + } else { + $docHeaderFooter->setAlignWithMargins(true); + } + + $docHeaderFooter->setOddHeader((string) $xmlSheet->headerFooter->oddHeader); + $docHeaderFooter->setOddFooter((string) $xmlSheet->headerFooter->oddFooter); + $docHeaderFooter->setEvenHeader((string) $xmlSheet->headerFooter->evenHeader); + $docHeaderFooter->setEvenFooter((string) $xmlSheet->headerFooter->evenFooter); + $docHeaderFooter->setFirstHeader((string) $xmlSheet->headerFooter->firstHeader); + $docHeaderFooter->setFirstFooter((string) $xmlSheet->headerFooter->firstFooter); + } + + if ($xmlSheet && $xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk && !$this->_readDataOnly) { + foreach ($xmlSheet->rowBreaks->brk as $brk) { + if ($brk["man"]) { + $docSheet->setBreak("A$brk[id]", PHPExcel_Worksheet::BREAK_ROW); + } + } + } + if ($xmlSheet && $xmlSheet->colBreaks && $xmlSheet->colBreaks->brk && !$this->_readDataOnly) { + foreach ($xmlSheet->colBreaks->brk as $brk) { + if ($brk["man"]) { + $docSheet->setBreak(PHPExcel_Cell::stringFromColumnIndex((string) $brk["id"]) . "1", PHPExcel_Worksheet::BREAK_COLUMN); + } + } + } + + if ($xmlSheet && $xmlSheet->dataValidations && !$this->_readDataOnly) { + foreach ($xmlSheet->dataValidations->dataValidation as $dataValidation) { + // Uppercase coordinate + $range = strtoupper($dataValidation["sqref"]); + $rangeSet = explode(' ',$range); + foreach($rangeSet as $range) { + $stRange = $docSheet->shrinkRangeToFit($range); + + // Extract all cell references in $range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($stRange); + foreach ($aReferences as $reference) { + // Create validation + $docValidation = $docSheet->getCell($reference)->getDataValidation(); + $docValidation->setType((string) $dataValidation["type"]); + $docValidation->setErrorStyle((string) $dataValidation["errorStyle"]); + $docValidation->setOperator((string) $dataValidation["operator"]); + $docValidation->setAllowBlank($dataValidation["allowBlank"] != 0); + $docValidation->setShowDropDown($dataValidation["showDropDown"] == 0); + $docValidation->setShowInputMessage($dataValidation["showInputMessage"] != 0); + $docValidation->setShowErrorMessage($dataValidation["showErrorMessage"] != 0); + $docValidation->setErrorTitle((string) $dataValidation["errorTitle"]); + $docValidation->setError((string) $dataValidation["error"]); + $docValidation->setPromptTitle((string) $dataValidation["promptTitle"]); + $docValidation->setPrompt((string) $dataValidation["prompt"]); + $docValidation->setFormula1((string) $dataValidation->formula1); + $docValidation->setFormula2((string) $dataValidation->formula2); + } + } + } + } + + // Add hyperlinks + $hyperlinks = array(); + if (!$this->_readDataOnly) { + // Locate hyperlink relations + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->_getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels") ); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink") { + $hyperlinks[(string)$ele["Id"]] = (string)$ele["Target"]; + } + } + } + + // Loop through hyperlinks + if ($xmlSheet && $xmlSheet->hyperlinks) { + foreach ($xmlSheet->hyperlinks->hyperlink as $hyperlink) { + // Link url + $linkRel = $hyperlink->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($hyperlink['ref']) as $cellReference) { + $cell = $docSheet->getCell( $cellReference ); + if (isset($linkRel['id'])) { + $cell->getHyperlink()->setUrl( $hyperlinks[ (string)$linkRel['id'] ] ); + } + if (isset($hyperlink['location'])) { + $cell->getHyperlink()->setUrl( 'sheet://' . (string)$hyperlink['location'] ); + } + + // Tooltip + if (isset($hyperlink['tooltip'])) { + $cell->getHyperlink()->setTooltip( (string)$hyperlink['tooltip'] ); + } + } + } + } + } + + // Add comments + $comments = array(); + $vmlComments = array(); + if (!$this->_readDataOnly) { + // Locate comment relations + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->_getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels") ); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments") { + $comments[(string)$ele["Id"]] = (string)$ele["Target"]; + } + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing") { + $vmlComments[(string)$ele["Id"]] = (string)$ele["Target"]; + } + } + } + + // Loop through comments + foreach ($comments as $relName => $relPath) { + // Load comments file + $relPath = PHPExcel_Shared_File::realpath(dirname("$dir/$fileWorksheet") . "/" . $relPath); + $commentsFile = simplexml_load_string($this->_getFromZipArchive($zip, $relPath) ); + + // Utility variables + $authors = array(); + + // Loop through authors + foreach ($commentsFile->authors->author as $author) { + $authors[] = (string)$author; + } + + // Loop through contents + foreach ($commentsFile->commentList->comment as $comment) { + $docSheet->getComment( (string)$comment['ref'] )->setAuthor( $authors[(string)$comment['authorId']] ); + $docSheet->getComment( (string)$comment['ref'] )->setText( $this->_parseRichText($comment->text) ); + } + } + + // Loop through VML comments + foreach ($vmlComments as $relName => $relPath) { + // Load VML comments file + $relPath = PHPExcel_Shared_File::realpath(dirname("$dir/$fileWorksheet") . "/" . $relPath); + $vmlCommentsFile = simplexml_load_string( $this->_getFromZipArchive($zip, $relPath) ); + $vmlCommentsFile->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + + $shapes = $vmlCommentsFile->xpath('//v:shape'); + foreach ($shapes as $shape) { + $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + + if (isset($shape['style'])) { + $style = (string)$shape['style']; + $fillColor = strtoupper( substr( (string)$shape['fillcolor'], 1 ) ); + $column = null; + $row = null; + + $clientData = $shape->xpath('.//x:ClientData'); + if (is_array($clientData) && !empty($clientData)) { + $clientData = $clientData[0]; + + if ( isset($clientData['ObjectType']) && (string)$clientData['ObjectType'] == 'Note' ) { + $temp = $clientData->xpath('.//x:Row'); + if (is_array($temp)) $row = $temp[0]; + + $temp = $clientData->xpath('.//x:Column'); + if (is_array($temp)) $column = $temp[0]; + } + } + + if (($column !== NULL) && ($row !== NULL)) { + // Set comment properties + $comment = $docSheet->getCommentByColumnAndRow((string) $column, $row + 1); + $comment->getFillColor()->setRGB( $fillColor ); + + // Parse style + $styleArray = explode(';', str_replace(' ', '', $style)); + foreach ($styleArray as $stylePair) { + $stylePair = explode(':', $stylePair); + + if ($stylePair[0] == 'margin-left') $comment->setMarginLeft($stylePair[1]); + if ($stylePair[0] == 'margin-top') $comment->setMarginTop($stylePair[1]); + if ($stylePair[0] == 'width') $comment->setWidth($stylePair[1]); + if ($stylePair[0] == 'height') $comment->setHeight($stylePair[1]); + if ($stylePair[0] == 'visibility') $comment->setVisible( $stylePair[1] == 'visible' ); + + } + } + } + } + } + + // Header/footer images + if ($xmlSheet && $xmlSheet->legacyDrawingHF && !$this->_readDataOnly) { + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->_getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels") ); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $vmlRelationship = ''; + + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing") { + $vmlRelationship = self::dir_add("$dir/$fileWorksheet", $ele["Target"]); + } + } + + if ($vmlRelationship != '') { + // Fetch linked images + $relsVML = simplexml_load_string($this->_getFromZipArchive($zip, dirname($vmlRelationship) . '/_rels/' . basename($vmlRelationship) . '.rels' )); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $drawings = array(); + foreach ($relsVML->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") { + $drawings[(string) $ele["Id"]] = self::dir_add($vmlRelationship, $ele["Target"]); + } + } + + // Fetch VML document + $vmlDrawing = simplexml_load_string($this->_getFromZipArchive($zip, $vmlRelationship)); + $vmlDrawing->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + + $hfImages = array(); + + $shapes = $vmlDrawing->xpath('//v:shape'); + foreach ($shapes as $shape) { + $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + $imageData = $shape->xpath('//v:imagedata'); + $imageData = $imageData[0]; + + $imageData = $imageData->attributes('urn:schemas-microsoft-com:office:office'); + $style = self::toCSSArray( (string)$shape['style'] ); + + $hfImages[ (string)$shape['id'] ] = new PHPExcel_Worksheet_HeaderFooterDrawing(); + if (isset($imageData['title'])) { + $hfImages[ (string)$shape['id'] ]->setName( (string)$imageData['title'] ); + } + + $hfImages[ (string)$shape['id'] ]->setPath("zip://$pFilename#" . $drawings[(string)$imageData['relid']], false); + $hfImages[ (string)$shape['id'] ]->setResizeProportional(false); + $hfImages[ (string)$shape['id'] ]->setWidth($style['width']); + $hfImages[ (string)$shape['id'] ]->setHeight($style['height']); + $hfImages[ (string)$shape['id'] ]->setOffsetX($style['margin-left']); + $hfImages[ (string)$shape['id'] ]->setOffsetY($style['margin-top']); + $hfImages[ (string)$shape['id'] ]->setResizeProportional(true); + } + + $docSheet->getHeaderFooter()->setImages($hfImages); + } + } + } + + } + +// TODO: Autoshapes from twoCellAnchors! + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->_getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels") ); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $drawings = array(); + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing") { + $drawings[(string) $ele["Id"]] = self::dir_add("$dir/$fileWorksheet", $ele["Target"]); + } + } + if ($xmlSheet->drawing && !$this->_readDataOnly) { + foreach ($xmlSheet->drawing as $drawing) { + $fileDrawing = $drawings[(string) self::array_item($drawing->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")]; + $relsDrawing = simplexml_load_string($this->_getFromZipArchive($zip, dirname($fileDrawing) . "/_rels/" . basename($fileDrawing) . ".rels") ); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $images = array(); + + if ($relsDrawing && $relsDrawing->Relationship) { + foreach ($relsDrawing->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") { + $images[(string) $ele["Id"]] = self::dir_add($fileDrawing, $ele["Target"]); + } elseif ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart") { + if ($this->_includeCharts) { + $charts[self::dir_add($fileDrawing, $ele["Target"])] = array('id' => (string) $ele["Id"], + 'sheet' => $docSheet->getTitle() + ); + } + } + } + } + $xmlDrawing = simplexml_load_string($this->_getFromZipArchive($zip, $fileDrawing))->children("http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"); + + if ($xmlDrawing->oneCellAnchor) { + foreach ($xmlDrawing->oneCellAnchor as $oneCellAnchor) { + if ($oneCellAnchor->pic->blipFill) { + $blip = $oneCellAnchor->pic->blipFill->children("http://schemas.openxmlformats.org/drawingml/2006/main")->blip; + $xfrm = $oneCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->xfrm; + $outerShdw = $oneCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->effectLst->outerShdw; + $objDrawing = new PHPExcel_Worksheet_Drawing; + $objDrawing->setName((string) self::array_item($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), "name")); + $objDrawing->setDescription((string) self::array_item($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), "descr")); + $objDrawing->setPath("zip://$pFilename#" . $images[(string) self::array_item($blip->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "embed")], false); + $objDrawing->setCoordinates(PHPExcel_Cell::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1)); + $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff)); + $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff)); + $objDrawing->setResizeProportional(false); + $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($oneCellAnchor->ext->attributes(), "cx"))); + $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($oneCellAnchor->ext->attributes(), "cy"))); + if ($xfrm) { + $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($xfrm->attributes(), "rot"))); + } + if ($outerShdw) { + $shadow = $objDrawing->getShadow(); + $shadow->setVisible(true); + $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "blurRad"))); + $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "dist"))); + $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($outerShdw->attributes(), "dir"))); + $shadow->setAlignment((string) self::array_item($outerShdw->attributes(), "algn")); + $shadow->getColor()->setRGB(self::array_item($outerShdw->srgbClr->attributes(), "val")); + $shadow->setAlpha(self::array_item($outerShdw->srgbClr->alpha->attributes(), "val") / 1000); + } + $objDrawing->setWorksheet($docSheet); + } else { + // ? Can charts be positioned with a oneCellAnchor ? + $coordinates = PHPExcel_Cell::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1); + $offsetX = PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff); + $offsetY = PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff); + $width = PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($oneCellAnchor->ext->attributes(), "cx")); + $height = PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($oneCellAnchor->ext->attributes(), "cy")); + } + } + } + if ($xmlDrawing->twoCellAnchor) { + foreach ($xmlDrawing->twoCellAnchor as $twoCellAnchor) { + if ($twoCellAnchor->pic->blipFill) { + $blip = $twoCellAnchor->pic->blipFill->children("http://schemas.openxmlformats.org/drawingml/2006/main")->blip; + $xfrm = $twoCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->xfrm; + $outerShdw = $twoCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->effectLst->outerShdw; + $objDrawing = new PHPExcel_Worksheet_Drawing; + $objDrawing->setName((string) self::array_item($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), "name")); + $objDrawing->setDescription((string) self::array_item($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), "descr")); + $objDrawing->setPath("zip://$pFilename#" . $images[(string) self::array_item($blip->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "embed")], false); + $objDrawing->setCoordinates(PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1)); + $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff)); + $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff)); + $objDrawing->setResizeProportional(false); + + $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($xfrm->ext->attributes(), "cx"))); + $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::array_item($xfrm->ext->attributes(), "cy"))); + + if ($xfrm) { + $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($xfrm->attributes(), "rot"))); + } + if ($outerShdw) { + $shadow = $objDrawing->getShadow(); + $shadow->setVisible(true); + $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "blurRad"))); + $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::array_item($outerShdw->attributes(), "dist"))); + $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::array_item($outerShdw->attributes(), "dir"))); + $shadow->setAlignment((string) self::array_item($outerShdw->attributes(), "algn")); + $shadow->getColor()->setRGB(self::array_item($outerShdw->srgbClr->attributes(), "val")); + $shadow->setAlpha(self::array_item($outerShdw->srgbClr->alpha->attributes(), "val") / 1000); + } + $objDrawing->setWorksheet($docSheet); + } elseif(($this->_includeCharts) && ($twoCellAnchor->graphicFrame)) { + $fromCoordinate = PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1); + $fromOffsetX = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff); + $fromOffsetY = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff); + $toCoordinate = PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->to->col) . ($twoCellAnchor->to->row + 1); + $toOffsetX = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->to->colOff); + $toOffsetY = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->to->rowOff); + $graphic = $twoCellAnchor->graphicFrame->children("http://schemas.openxmlformats.org/drawingml/2006/main")->graphic; + $chartRef = $graphic->graphicData->children("http://schemas.openxmlformats.org/drawingml/2006/chart")->chart; + $thisChart = (string) $chartRef->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + + $chartDetails[$docSheet->getTitle().'!'.$thisChart] = + array( 'fromCoordinate' => $fromCoordinate, + 'fromOffsetX' => $fromOffsetX, + 'fromOffsetY' => $fromOffsetY, + 'toCoordinate' => $toCoordinate, + 'toOffsetX' => $toOffsetX, + 'toOffsetY' => $toOffsetY, + 'worksheetTitle' => $docSheet->getTitle() + ); + } + } + } + + } + } + } + + // Loop through definedNames + if ($xmlWorkbook->definedNames) { + foreach ($xmlWorkbook->definedNames->definedName as $definedName) { + // Extract range + $extractedRange = (string)$definedName; + $extractedRange = preg_replace('/\'(\w+)\'\!/', '', $extractedRange); + if (($spos = strpos($extractedRange,'!')) !== false) { + $extractedRange = substr($extractedRange,0,$spos).str_replace('$', '', substr($extractedRange,$spos)); + } else { + $extractedRange = str_replace('$', '', $extractedRange); + } + + // Valid range? + if (stripos((string)$definedName, '#REF!') !== FALSE || $extractedRange == '') { + continue; + } + + // Some definedNames are only applicable if we are on the same sheet... + if ((string)$definedName['localSheetId'] != '' && (string)$definedName['localSheetId'] == $sheetId) { + // Switch on type + switch ((string)$definedName['name']) { + + case '_xlnm._FilterDatabase': + if ((string)$definedName['hidden'] !== '1') { + $docSheet->getAutoFilter()->setRange($extractedRange); + } + break; + + case '_xlnm.Print_Titles': + // Split $extractedRange + $extractedRange = explode(',', $extractedRange); + + // Set print titles + foreach ($extractedRange as $range) { + $matches = array(); + + // check for repeating columns, e g. 'A:A' or 'A:D' + if (preg_match('/^([A-Z]+)\:([A-Z]+)$/', $range, $matches)) { + $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($matches[1], $matches[2])); + } + // check for repeating rows, e.g. '1:1' or '1:5' + elseif (preg_match('/^(\d+)\:(\d+)$/', $range, $matches)) { + $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($matches[1], $matches[2])); + } + } + break; + + case '_xlnm.Print_Area': + $rangeSets = explode(',', $extractedRange); // FIXME: what if sheetname contains comma? + $newRangeSets = array(); + foreach($rangeSets as $rangeSet) { + $range = explode('!', $rangeSet); // FIXME: what if sheetname contains exclamation mark? + $rangeSet = isset($range[1]) ? $range[1] : $range[0]; + $newRangeSets[] = str_replace('$', '', $rangeSet); + } + $docSheet->getPageSetup()->setPrintArea(implode(',',$newRangeSets)); + break; + + default: + break; + } + } + } + } + + // Next sheet id + ++$sheetId; + } + + // Loop through definedNames + if ($xmlWorkbook->definedNames) { + foreach ($xmlWorkbook->definedNames->definedName as $definedName) { + // Extract range + $extractedRange = (string)$definedName; + $extractedRange = preg_replace('/\'(\w+)\'\!/', '', $extractedRange); + if (($spos = strpos($extractedRange,'!')) !== false) { + $extractedRange = substr($extractedRange,0,$spos).str_replace('$', '', substr($extractedRange,$spos)); + } else { + $extractedRange = str_replace('$', '', $extractedRange); + } + + // Valid range? + if (stripos((string)$definedName, '#REF!') !== false || $extractedRange == '') { + continue; + } + + // Some definedNames are only applicable if we are on the same sheet... + if ((string)$definedName['localSheetId'] != '') { + // Local defined name + // Switch on type + switch ((string)$definedName['name']) { + + case '_xlnm._FilterDatabase': + case '_xlnm.Print_Titles': + case '_xlnm.Print_Area': + break; + + default: + $range = explode('!', (string)$definedName); + if (count($range) == 2) { + $range[0] = str_replace("''", "'", $range[0]); + $range[0] = str_replace("'", "", $range[0]); + if ($worksheet = $docSheet->getParent()->getSheetByName($range[0])) { + $extractedRange = str_replace('$', '', $range[1]); + $scope = $docSheet->getParent()->getSheet((string)$definedName['localSheetId']); + + $excel->addNamedRange( new PHPExcel_NamedRange((string)$definedName['name'], $worksheet, $extractedRange, true, $scope) ); + } + } + break; + } + } else if (!isset($definedName['localSheetId'])) { + // "Global" definedNames + $locatedSheet = null; + $extractedSheetName = ''; + if (strpos( (string)$definedName, '!' ) !== false) { + // Extract sheet name + $extractedSheetName = PHPExcel_Worksheet::extractSheetTitle( (string)$definedName, true ); + $extractedSheetName = $extractedSheetName[0]; + + // Locate sheet + $locatedSheet = $excel->getSheetByName($extractedSheetName); + + // Modify range + $range = explode('!', $extractedRange); + $extractedRange = isset($range[1]) ? $range[1] : $range[0]; + } + + if ($locatedSheet !== NULL) { + $excel->addNamedRange( new PHPExcel_NamedRange((string)$definedName['name'], $locatedSheet, $extractedRange, false) ); + } + } + } + } + } + + if (!$this->_readDataOnly) { + // active sheet index + $activeTab = intval($xmlWorkbook->bookViews->workbookView["activeTab"]); // refers to old sheet index + + // keep active sheet index if sheet is still loaded, else first sheet is set as the active + if (isset($mapSheetId[$activeTab]) && $mapSheetId[$activeTab] !== null) { + $excel->setActiveSheetIndex($mapSheetId[$activeTab]); + } else { + if ($excel->getSheetCount() == 0) { + $excel->createSheet(); + } + $excel->setActiveSheetIndex(0); + } + } + break; + } + + } + + + if (!$this->_readDataOnly) { + $contentTypes = simplexml_load_string($this->_getFromZipArchive($zip, "[Content_Types].xml")); + foreach ($contentTypes->Override as $contentType) { + switch ($contentType["ContentType"]) { + case "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": + if ($this->_includeCharts) { + $chartEntryRef = ltrim($contentType['PartName'],'/'); + $chartElements = simplexml_load_string($this->_getFromZipArchive($zip, $chartEntryRef)); + $objChart = PHPExcel_Reader_Excel2007_Chart::readChart($chartElements,basename($chartEntryRef,'.xml')); + +// echo 'Chart ',$chartEntryRef,'
        '; +// var_dump($charts[$chartEntryRef]); +// + if (isset($charts[$chartEntryRef])) { + $chartPositionRef = $charts[$chartEntryRef]['sheet'].'!'.$charts[$chartEntryRef]['id']; +// echo 'Position Ref ',$chartPositionRef,'
        '; + if (isset($chartDetails[$chartPositionRef])) { +// var_dump($chartDetails[$chartPositionRef]); + + $excel->getSheetByName($charts[$chartEntryRef]['sheet'])->addChart($objChart); + $objChart->setWorksheet($excel->getSheetByName($charts[$chartEntryRef]['sheet'])); + $objChart->setTopLeftPosition( $chartDetails[$chartPositionRef]['fromCoordinate'], + $chartDetails[$chartPositionRef]['fromOffsetX'], + $chartDetails[$chartPositionRef]['fromOffsetY'] + ); + $objChart->setBottomRightPosition( $chartDetails[$chartPositionRef]['toCoordinate'], + $chartDetails[$chartPositionRef]['toOffsetX'], + $chartDetails[$chartPositionRef]['toOffsetY'] + ); + } + } + } + } + } + } + + $zip->close(); + + return $excel; + } + + + private static function _readColor($color, $background=FALSE) { + if (isset($color["rgb"])) { + return (string)$color["rgb"]; + } else if (isset($color["indexed"])) { + return PHPExcel_Style_Color::indexedColor($color["indexed"]-7,$background)->getARGB(); + } else if (isset($color["theme"])) { + if (self::$_theme !== NULL) { + $returnColour = self::$_theme->getColourByIndex((int)$color["theme"]); + if (isset($color["tint"])) { + $tintAdjust = (float) $color["tint"]; + $returnColour = PHPExcel_Style_Color::changeBrightness($returnColour, $tintAdjust); + } + return 'FF'.$returnColour; + } + } + + if ($background) { + return 'FFFFFFFF'; + } + return 'FF000000'; + } + + + private static function _readStyle($docStyle, $style) { + // format code +// if (isset($style->numFmt)) { +// if (isset($style->numFmt['formatCode'])) { +// $docStyle->getNumberFormat()->setFormatCode((string) $style->numFmt['formatCode']); +// } else { + $docStyle->getNumberFormat()->setFormatCode($style->numFmt); +// } +// } + + // font + if (isset($style->font)) { + $docStyle->getFont()->setName((string) $style->font->name["val"]); + $docStyle->getFont()->setSize((string) $style->font->sz["val"]); + if (isset($style->font->b)) { + $docStyle->getFont()->setBold(!isset($style->font->b["val"]) || $style->font->b["val"] == 'true' || $style->font->b["val"] == '1'); + } + if (isset($style->font->i)) { + $docStyle->getFont()->setItalic(!isset($style->font->i["val"]) || $style->font->i["val"] == 'true' || $style->font->i["val"] == '1'); + } + if (isset($style->font->strike)) { + $docStyle->getFont()->setStrikethrough(!isset($style->font->strike["val"]) || $style->font->strike["val"] == 'true' || $style->font->strike["val"] == '1'); + } + $docStyle->getFont()->getColor()->setARGB(self::_readColor($style->font->color)); + + if (isset($style->font->u) && !isset($style->font->u["val"])) { + $docStyle->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } else if (isset($style->font->u) && isset($style->font->u["val"])) { + $docStyle->getFont()->setUnderline((string)$style->font->u["val"]); + } + + if (isset($style->font->vertAlign) && isset($style->font->vertAlign["val"])) { + $vertAlign = strtolower((string)$style->font->vertAlign["val"]); + if ($vertAlign == 'superscript') { + $docStyle->getFont()->setSuperScript(true); + } + if ($vertAlign == 'subscript') { + $docStyle->getFont()->setSubScript(true); + } + } + } + + // fill + if (isset($style->fill)) { + if ($style->fill->gradientFill) { + $gradientFill = $style->fill->gradientFill[0]; + if(!empty($gradientFill["type"])) { + $docStyle->getFill()->setFillType((string) $gradientFill["type"]); + } + $docStyle->getFill()->setRotation(floatval($gradientFill["degree"])); + $gradientFill->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + $docStyle->getFill()->getStartColor()->setARGB(self::_readColor( self::array_item($gradientFill->xpath("sml:stop[@position=0]"))->color) ); + $docStyle->getFill()->getEndColor()->setARGB(self::_readColor( self::array_item($gradientFill->xpath("sml:stop[@position=1]"))->color) ); + } elseif ($style->fill->patternFill) { + $patternType = (string)$style->fill->patternFill["patternType"] != '' ? (string)$style->fill->patternFill["patternType"] : 'solid'; + $docStyle->getFill()->setFillType($patternType); + if ($style->fill->patternFill->fgColor) { + $docStyle->getFill()->getStartColor()->setARGB(self::_readColor($style->fill->patternFill->fgColor,true)); + } else { + $docStyle->getFill()->getStartColor()->setARGB('FF000000'); + } + if ($style->fill->patternFill->bgColor) { + $docStyle->getFill()->getEndColor()->setARGB(self::_readColor($style->fill->patternFill->bgColor,true)); + } + } + } + + // border + if (isset($style->border)) { + $diagonalUp = false; + $diagonalDown = false; + if ($style->border["diagonalUp"] == 'true' || $style->border["diagonalUp"] == 1) { + $diagonalUp = true; + } + if ($style->border["diagonalDown"] == 'true' || $style->border["diagonalDown"] == 1) { + $diagonalDown = true; + } + if ($diagonalUp == false && $diagonalDown == false) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_NONE); + } elseif ($diagonalUp == true && $diagonalDown == false) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_UP); + } elseif ($diagonalUp == false && $diagonalDown == true) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_DOWN); + } elseif ($diagonalUp == true && $diagonalDown == true) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_BOTH); + } + self::_readBorder($docStyle->getBorders()->getLeft(), $style->border->left); + self::_readBorder($docStyle->getBorders()->getRight(), $style->border->right); + self::_readBorder($docStyle->getBorders()->getTop(), $style->border->top); + self::_readBorder($docStyle->getBorders()->getBottom(), $style->border->bottom); + self::_readBorder($docStyle->getBorders()->getDiagonal(), $style->border->diagonal); + } + + // alignment + if (isset($style->alignment)) { + $docStyle->getAlignment()->setHorizontal((string) $style->alignment["horizontal"]); + $docStyle->getAlignment()->setVertical((string) $style->alignment["vertical"]); + + $textRotation = 0; + if ((int)$style->alignment["textRotation"] <= 90) { + $textRotation = (int)$style->alignment["textRotation"]; + } else if ((int)$style->alignment["textRotation"] > 90) { + $textRotation = 90 - (int)$style->alignment["textRotation"]; + } + + $docStyle->getAlignment()->setTextRotation(intval($textRotation)); + $docStyle->getAlignment()->setWrapText( (string)$style->alignment["wrapText"] == "true" || (string)$style->alignment["wrapText"] == "1" ); + $docStyle->getAlignment()->setShrinkToFit( (string)$style->alignment["shrinkToFit"] == "true" || (string)$style->alignment["shrinkToFit"] == "1" ); + $docStyle->getAlignment()->setIndent( intval((string)$style->alignment["indent"]) > 0 ? intval((string)$style->alignment["indent"]) : 0 ); + } + + // protection + if (isset($style->protection)) { + if (isset($style->protection['locked'])) { + if ((string)$style->protection['locked'] == 'true') { + $docStyle->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_PROTECTED); + } else { + $docStyle->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + } + } + + if (isset($style->protection['hidden'])) { + if ((string)$style->protection['hidden'] == 'true') { + $docStyle->getProtection()->setHidden(PHPExcel_Style_Protection::PROTECTION_PROTECTED); + } else { + $docStyle->getProtection()->setHidden(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + } + } + } + } + + + private static function _readBorder($docBorder, $eleBorder) { + if (isset($eleBorder["style"])) { + $docBorder->setBorderStyle((string) $eleBorder["style"]); + } + if (isset($eleBorder->color)) { + $docBorder->getColor()->setARGB(self::_readColor($eleBorder->color)); + } + } + + + private function _parseRichText($is = null) { + $value = new PHPExcel_RichText(); + + if (isset($is->t)) { + $value->createText( PHPExcel_Shared_String::ControlCharacterOOXML2PHP( (string) $is->t ) ); + } else { + foreach ($is->r as $run) { + if (!isset($run->rPr)) { + $objText = $value->createText( PHPExcel_Shared_String::ControlCharacterOOXML2PHP( (string) $run->t ) ); + + } else { + $objText = $value->createTextRun( PHPExcel_Shared_String::ControlCharacterOOXML2PHP( (string) $run->t ) ); + + if (isset($run->rPr->rFont["val"])) { + $objText->getFont()->setName((string) $run->rPr->rFont["val"]); + } + + if (isset($run->rPr->sz["val"])) { + $objText->getFont()->setSize((string) $run->rPr->sz["val"]); + } + + if (isset($run->rPr->color)) { + $objText->getFont()->setColor( new PHPExcel_Style_Color( self::_readColor($run->rPr->color) ) ); + } + + if ( (isset($run->rPr->b["val"]) && ((string) $run->rPr->b["val"] == 'true' || (string) $run->rPr->b["val"] == '1')) + || (isset($run->rPr->b) && !isset($run->rPr->b["val"])) ) { + $objText->getFont()->setBold(true); + } + + if ( (isset($run->rPr->i["val"]) && ((string) $run->rPr->i["val"] == 'true' || (string) $run->rPr->i["val"] == '1')) + || (isset($run->rPr->i) && !isset($run->rPr->i["val"])) ) { + $objText->getFont()->setItalic(true); + } + + if (isset($run->rPr->vertAlign) && isset($run->rPr->vertAlign["val"])) { + $vertAlign = strtolower((string)$run->rPr->vertAlign["val"]); + if ($vertAlign == 'superscript') { + $objText->getFont()->setSuperScript(true); + } + if ($vertAlign == 'subscript') { + $objText->getFont()->setSubScript(true); + } + } + + if (isset($run->rPr->u) && !isset($run->rPr->u["val"])) { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } else if (isset($run->rPr->u) && isset($run->rPr->u["val"])) { + $objText->getFont()->setUnderline((string)$run->rPr->u["val"]); + } + + if ( (isset($run->rPr->strike["val"]) && ((string) $run->rPr->strike["val"] == 'true' || (string) $run->rPr->strike["val"] == '1')) + || (isset($run->rPr->strike) && !isset($run->rPr->strike["val"])) ) { + $objText->getFont()->setStrikethrough(true); + } + } + } + } + + return $value; + } + + + private static function array_item($array, $key = 0) { + return (isset($array[$key]) ? $array[$key] : null); + } + + + private static function dir_add($base, $add) { + return preg_replace('~[^/]+/\.\./~', '', dirname($base) . "/$add"); + } + + + private static function toCSSArray($style) { + $style = str_replace(array("\r","\n"), "", $style); + + $temp = explode(';', $style); + $style = array(); + foreach ($temp as $item) { + $item = explode(':', $item); + + if (strpos($item[1], 'px') !== false) { + $item[1] = str_replace('px', '', $item[1]); + } + if (strpos($item[1], 'pt') !== false) { + $item[1] = str_replace('pt', '', $item[1]); + $item[1] = PHPExcel_Shared_Font::fontSizeToPixels($item[1]); + } + if (strpos($item[1], 'in') !== false) { + $item[1] = str_replace('in', '', $item[1]); + $item[1] = PHPExcel_Shared_Font::inchSizeToPixels($item[1]); + } + if (strpos($item[1], 'cm') !== false) { + $item[1] = str_replace('cm', '', $item[1]); + $item[1] = PHPExcel_Shared_Font::centimeterSizeToPixels($item[1]); + } + + $style[$item[0]] = $item[1]; + } + + return $style; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007/Chart.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007/Chart.php new file mode 100644 index 000000000..f4d38bdb4 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007/Chart.php @@ -0,0 +1,513 @@ +attributes(); + if (isset($attributes[$name])) { + if ($format == 'string') { + return (string) $attributes[$name]; + } elseif ($format == 'integer') { + return (integer) $attributes[$name]; + } elseif ($format == 'boolean') { + return (boolean) ($attributes[$name] == '0') ? false : true; + } else { + return (float) $attributes[$name]; + } + } + return null; + } // function _getAttribute() + + + private static function _readColor($color,$background=false) { + if (isset($color["rgb"])) { + return (string)$color["rgb"]; + } else if (isset($color["indexed"])) { + return PHPExcel_Style_Color::indexedColor($color["indexed"]-7,$background)->getARGB(); + } + } + + + public static function readChart($chartElements,$chartName) { + $namespacesChartMeta = $chartElements->getNamespaces(true); + $chartElementsC = $chartElements->children($namespacesChartMeta['c']); + + $XaxisLabel = $YaxisLabel = $legend = $title = NULL; + $dispBlanksAs = $plotVisOnly = NULL; + + foreach($chartElementsC as $chartElementKey => $chartElement) { + switch ($chartElementKey) { + case "chart": + foreach($chartElement as $chartDetailsKey => $chartDetails) { + $chartDetailsC = $chartDetails->children($namespacesChartMeta['c']); + switch ($chartDetailsKey) { + case "plotArea": + $plotAreaLayout = $XaxisLable = $YaxisLable = null; + $plotSeries = $plotAttributes = array(); + foreach($chartDetails as $chartDetailKey => $chartDetail) { + switch ($chartDetailKey) { + case "layout": + $plotAreaLayout = self::_chartLayoutDetails($chartDetail,$namespacesChartMeta,'plotArea'); + break; + case "catAx": + if (isset($chartDetail->title)) { + $XaxisLabel = self::_chartTitle($chartDetail->title->children($namespacesChartMeta['c']),$namespacesChartMeta,'cat'); + } + break; + case "dateAx": + if (isset($chartDetail->title)) { + $XaxisLabel = self::_chartTitle($chartDetail->title->children($namespacesChartMeta['c']),$namespacesChartMeta,'cat'); + } + break; + case "valAx": + if (isset($chartDetail->title)) { + $YaxisLabel = self::_chartTitle($chartDetail->title->children($namespacesChartMeta['c']),$namespacesChartMeta,'cat'); + } + break; + case "barChart": + case "bar3DChart": + $barDirection = self::_getAttribute($chartDetail->barDir, 'val', 'string'); + $plotSer = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotSer->setPlotDirection($barDirection); + $plotSeries[] = $plotSer; + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "lineChart": + case "line3DChart": + $plotSeries[] = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "areaChart": + case "area3DChart": + $plotSeries[] = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "doughnutChart": + case "pieChart": + case "pie3DChart": + $explosion = isset($chartDetail->ser->explosion); + $plotSer = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotSer->setPlotStyle($explosion); + $plotSeries[] = $plotSer; + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "scatterChart": + $scatterStyle = self::_getAttribute($chartDetail->scatterStyle, 'val', 'string'); + $plotSer = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotSer->setPlotStyle($scatterStyle); + $plotSeries[] = $plotSer; + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "bubbleChart": + $bubbleScale = self::_getAttribute($chartDetail->bubbleScale, 'val', 'integer'); + $plotSer = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotSer->setPlotStyle($bubbleScale); + $plotSeries[] = $plotSer; + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "radarChart": + $radarStyle = self::_getAttribute($chartDetail->radarStyle, 'val', 'string'); + $plotSer = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotSer->setPlotStyle($radarStyle); + $plotSeries[] = $plotSer; + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "surfaceChart": + case "surface3DChart": + $wireFrame = self::_getAttribute($chartDetail->wireframe, 'val', 'boolean'); + $plotSer = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotSer->setPlotStyle($wireFrame); + $plotSeries[] = $plotSer; + $plotAttributes = self::_readChartAttributes($chartDetail); + break; + case "stockChart": + $plotSeries[] = self::_chartDataSeries($chartDetail,$namespacesChartMeta,$chartDetailKey); + $plotAttributes = self::_readChartAttributes($plotAreaLayout); + break; + } + } + if ($plotAreaLayout == NULL) { + $plotAreaLayout = new PHPExcel_Chart_Layout(); + } + $plotArea = new PHPExcel_Chart_PlotArea($plotAreaLayout,$plotSeries); + self::_setChartAttributes($plotAreaLayout,$plotAttributes); + break; + case "plotVisOnly": + $plotVisOnly = self::_getAttribute($chartDetails, 'val', 'string'); + break; + case "dispBlanksAs": + $dispBlanksAs = self::_getAttribute($chartDetails, 'val', 'string'); + break; + case "title": + $title = self::_chartTitle($chartDetails,$namespacesChartMeta,'title'); + break; + case "legend": + $legendPos = 'r'; + $legendLayout = null; + $legendOverlay = false; + foreach($chartDetails as $chartDetailKey => $chartDetail) { + switch ($chartDetailKey) { + case "legendPos": + $legendPos = self::_getAttribute($chartDetail, 'val', 'string'); + break; + case "overlay": + $legendOverlay = self::_getAttribute($chartDetail, 'val', 'boolean'); + break; + case "layout": + $legendLayout = self::_chartLayoutDetails($chartDetail,$namespacesChartMeta,'legend'); + break; + } + } + $legend = new PHPExcel_Chart_Legend($legendPos, $legendLayout, $legendOverlay); + break; + } + } + } + } + $chart = new PHPExcel_Chart($chartName,$title,$legend,$plotArea,$plotVisOnly,$dispBlanksAs,$XaxisLabel,$YaxisLabel); + + return $chart; + } // function readChart() + + + private static function _chartTitle($titleDetails,$namespacesChartMeta,$type) { + $caption = array(); + $titleLayout = null; + foreach($titleDetails as $titleDetailKey => $chartDetail) { + switch ($titleDetailKey) { + case "tx": + $titleDetails = $chartDetail->rich->children($namespacesChartMeta['a']); + foreach($titleDetails as $titleKey => $titleDetail) { + switch ($titleKey) { + case "p": + $titleDetailPart = $titleDetail->children($namespacesChartMeta['a']); + $caption[] = self::_parseRichText($titleDetailPart); + } + } + break; + case "layout": + $titleLayout = self::_chartLayoutDetails($chartDetail,$namespacesChartMeta); + break; + } + } + + return new PHPExcel_Chart_Title($caption, $titleLayout); + } // function _chartTitle() + + + private static function _chartLayoutDetails($chartDetail,$namespacesChartMeta) { + if (!isset($chartDetail->manualLayout)) { + return null; + } + $details = $chartDetail->manualLayout->children($namespacesChartMeta['c']); + if (is_null($details)) { + return null; + } + $layout = array(); + foreach($details as $detailKey => $detail) { +// echo $detailKey,' => ',self::_getAttribute($detail, 'val', 'string'),PHP_EOL; + $layout[$detailKey] = self::_getAttribute($detail, 'val', 'string'); + } + return new PHPExcel_Chart_Layout($layout); + } // function _chartLayoutDetails() + + + private static function _chartDataSeries($chartDetail,$namespacesChartMeta,$plotType) { + $multiSeriesType = NULL; + $smoothLine = false; + $seriesLabel = $seriesCategory = $seriesValues = $plotOrder = array(); + + $seriesDetailSet = $chartDetail->children($namespacesChartMeta['c']); + foreach($seriesDetailSet as $seriesDetailKey => $seriesDetails) { + switch ($seriesDetailKey) { + case "grouping": + $multiSeriesType = self::_getAttribute($chartDetail->grouping, 'val', 'string'); + break; + case "ser": + $marker = NULL; + foreach($seriesDetails as $seriesKey => $seriesDetail) { + switch ($seriesKey) { + case "idx": + $seriesIndex = self::_getAttribute($seriesDetail, 'val', 'integer'); + break; + case "order": + $seriesOrder = self::_getAttribute($seriesDetail, 'val', 'integer'); + $plotOrder[$seriesIndex] = $seriesOrder; + break; + case "tx": + $seriesLabel[$seriesIndex] = self::_chartDataSeriesValueSet($seriesDetail,$namespacesChartMeta); + break; + case "marker": + $marker = self::_getAttribute($seriesDetail->symbol, 'val', 'string'); + break; + case "smooth": + $smoothLine = self::_getAttribute($seriesDetail, 'val', 'boolean'); + break; + case "cat": + $seriesCategory[$seriesIndex] = self::_chartDataSeriesValueSet($seriesDetail,$namespacesChartMeta); + break; + case "val": + $seriesValues[$seriesIndex] = self::_chartDataSeriesValueSet($seriesDetail,$namespacesChartMeta,$marker); + break; + case "xVal": + $seriesCategory[$seriesIndex] = self::_chartDataSeriesValueSet($seriesDetail,$namespacesChartMeta,$marker); + break; + case "yVal": + $seriesValues[$seriesIndex] = self::_chartDataSeriesValueSet($seriesDetail,$namespacesChartMeta,$marker); + break; + } + } + } + } + return new PHPExcel_Chart_DataSeries($plotType,$multiSeriesType,$plotOrder,$seriesLabel,$seriesCategory,$seriesValues,$smoothLine); + } // function _chartDataSeries() + + + private static function _chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker = null, $smoothLine = false) { + if (isset($seriesDetail->strRef)) { + $seriesSource = (string) $seriesDetail->strRef->f; + $seriesData = self::_chartDataSeriesValues($seriesDetail->strRef->strCache->children($namespacesChartMeta['c']),'s'); + + return new PHPExcel_Chart_DataSeriesValues('String',$seriesSource,$seriesData['formatCode'],$seriesData['pointCount'],$seriesData['dataValues'],$marker,$smoothLine); + } elseif (isset($seriesDetail->numRef)) { + $seriesSource = (string) $seriesDetail->numRef->f; + $seriesData = self::_chartDataSeriesValues($seriesDetail->numRef->numCache->children($namespacesChartMeta['c'])); + + return new PHPExcel_Chart_DataSeriesValues('Number',$seriesSource,$seriesData['formatCode'],$seriesData['pointCount'],$seriesData['dataValues'],$marker,$smoothLine); + } elseif (isset($seriesDetail->multiLvlStrRef)) { + $seriesSource = (string) $seriesDetail->multiLvlStrRef->f; + $seriesData = self::_chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlStrRef->multiLvlStrCache->children($namespacesChartMeta['c']),'s'); + $seriesData['pointCount'] = count($seriesData['dataValues']); + + return new PHPExcel_Chart_DataSeriesValues('String',$seriesSource,$seriesData['formatCode'],$seriesData['pointCount'],$seriesData['dataValues'],$marker,$smoothLine); + } elseif (isset($seriesDetail->multiLvlNumRef)) { + $seriesSource = (string) $seriesDetail->multiLvlNumRef->f; + $seriesData = self::_chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlNumRef->multiLvlNumCache->children($namespacesChartMeta['c']),'s'); + $seriesData['pointCount'] = count($seriesData['dataValues']); + + return new PHPExcel_Chart_DataSeriesValues('String',$seriesSource,$seriesData['formatCode'],$seriesData['pointCount'],$seriesData['dataValues'],$marker,$smoothLine); + } + return null; + } // function _chartDataSeriesValueSet() + + + private static function _chartDataSeriesValues($seriesValueSet,$dataType='n') { + $seriesVal = array(); + $formatCode = ''; + $pointCount = 0; + + foreach($seriesValueSet as $seriesValueIdx => $seriesValue) { + switch ($seriesValueIdx) { + case 'ptCount': + $pointCount = self::_getAttribute($seriesValue, 'val', 'integer'); + break; + case 'formatCode': + $formatCode = (string) $seriesValue; + break; + case 'pt': + $pointVal = self::_getAttribute($seriesValue, 'idx', 'integer'); + if ($dataType == 's') { + $seriesVal[$pointVal] = (string) $seriesValue->v; + } else { + $seriesVal[$pointVal] = (float) $seriesValue->v; + } + break; + } + } + + return array( 'formatCode' => $formatCode, + 'pointCount' => $pointCount, + 'dataValues' => $seriesVal + ); + } // function _chartDataSeriesValues() + + + private static function _chartDataSeriesValuesMultiLevel($seriesValueSet,$dataType='n') { + $seriesVal = array(); + $formatCode = ''; + $pointCount = 0; + + foreach($seriesValueSet->lvl as $seriesLevelIdx => $seriesLevel) { + foreach($seriesLevel as $seriesValueIdx => $seriesValue) { + switch ($seriesValueIdx) { + case 'ptCount': + $pointCount = self::_getAttribute($seriesValue, 'val', 'integer'); + break; + case 'formatCode': + $formatCode = (string) $seriesValue; + break; + case 'pt': + $pointVal = self::_getAttribute($seriesValue, 'idx', 'integer'); + if ($dataType == 's') { + $seriesVal[$pointVal][] = (string) $seriesValue->v; + } else { + $seriesVal[$pointVal][] = (float) $seriesValue->v; + } + break; + } + } + } + + return array( 'formatCode' => $formatCode, + 'pointCount' => $pointCount, + 'dataValues' => $seriesVal + ); + } // function _chartDataSeriesValuesMultiLevel() + + private static function _parseRichText($titleDetailPart = null) { + $value = new PHPExcel_RichText(); + + foreach($titleDetailPart as $titleDetailElementKey => $titleDetailElement) { + if (isset($titleDetailElement->t)) { + $objText = $value->createTextRun( (string) $titleDetailElement->t ); + } + if (isset($titleDetailElement->rPr)) { + if (isset($titleDetailElement->rPr->rFont["val"])) { + $objText->getFont()->setName((string) $titleDetailElement->rPr->rFont["val"]); + } + + $fontSize = (self::_getAttribute($titleDetailElement->rPr, 'sz', 'integer')); + if (!is_null($fontSize)) { + $objText->getFont()->setSize(floor($fontSize / 100)); + } + + $fontColor = (self::_getAttribute($titleDetailElement->rPr, 'color', 'string')); + if (!is_null($fontColor)) { + $objText->getFont()->setColor( new PHPExcel_Style_Color( self::_readColor($fontColor) ) ); + } + + $bold = self::_getAttribute($titleDetailElement->rPr, 'b', 'boolean'); + if (!is_null($bold)) { + $objText->getFont()->setBold($bold); + } + + $italic = self::_getAttribute($titleDetailElement->rPr, 'i', 'boolean'); + if (!is_null($italic)) { + $objText->getFont()->setItalic($italic); + } + + $baseline = self::_getAttribute($titleDetailElement->rPr, 'baseline', 'integer'); + if (!is_null($baseline)) { + if ($baseline > 0) { + $objText->getFont()->setSuperScript(true); + } elseif($baseline < 0) { + $objText->getFont()->setSubScript(true); + } + } + + $underscore = (self::_getAttribute($titleDetailElement->rPr, 'u', 'string')); + if (!is_null($underscore)) { + if ($underscore == 'sng') { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } elseif($underscore == 'dbl') { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE); + } else { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_NONE); + } + } + + $strikethrough = (self::_getAttribute($titleDetailElement->rPr, 's', 'string')); + if (!is_null($strikethrough)) { + if ($strikethrough == 'noStrike') { + $objText->getFont()->setStrikethrough(false); + } else { + $objText->getFont()->setStrikethrough(true); + } + } + } + } + + return $value; + } + + private static function _readChartAttributes($chartDetail) { + $plotAttributes = array(); + if (isset($chartDetail->dLbls)) { + if (isset($chartDetail->dLbls->howLegendKey)) { + $plotAttributes['showLegendKey'] = self::_getAttribute($chartDetail->dLbls->showLegendKey, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showVal)) { + $plotAttributes['showVal'] = self::_getAttribute($chartDetail->dLbls->showVal, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showCatName)) { + $plotAttributes['showCatName'] = self::_getAttribute($chartDetail->dLbls->showCatName, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showSerName)) { + $plotAttributes['showSerName'] = self::_getAttribute($chartDetail->dLbls->showSerName, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showPercent)) { + $plotAttributes['showPercent'] = self::_getAttribute($chartDetail->dLbls->showPercent, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showBubbleSize)) { + $plotAttributes['showBubbleSize'] = self::_getAttribute($chartDetail->dLbls->showBubbleSize, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showLeaderLines)) { + $plotAttributes['showLeaderLines'] = self::_getAttribute($chartDetail->dLbls->showLeaderLines, 'val', 'string'); + } + } + + return $plotAttributes; + } + + private static function _setChartAttributes($plotArea,$plotAttributes) + { + foreach($plotAttributes as $plotAttributeKey => $plotAttributeValue) { + switch($plotAttributeKey) { + case 'showLegendKey' : + $plotArea->setShowLegendKey($plotAttributeValue); + break; + case 'showVal' : + $plotArea->setShowVal($plotAttributeValue); + break; + case 'showCatName' : + $plotArea->setShowCatName($plotAttributeValue); + break; + case 'showSerName' : + $plotArea->setShowSerName($plotAttributeValue); + break; + case 'showPercent' : + $plotArea->setShowPercent($plotAttributeValue); + break; + case 'showBubbleSize' : + $plotArea->setShowBubbleSize($plotAttributeValue); + break; + case 'showLeaderLines' : + $plotArea->setShowLeaderLines($plotAttributeValue); + break; + } + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007/Theme.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007/Theme.php new file mode 100644 index 000000000..6b38fa79f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel2007/Theme.php @@ -0,0 +1,124 @@ +_themeName = $themeName; + $this->_colourSchemeName = $colourSchemeName; + $this->_colourMap = $colourMap; + } + + /** + * Get Theme Name + * + * @return string + */ + public function getThemeName() + { + return $this->_themeName; + } + + /** + * Get colour Scheme Name + * + * @return string + */ + public function getColourSchemeName() { + return $this->_colourSchemeName; + } + + /** + * Get colour Map Value by Position + * + * @return string + */ + public function getColourByIndex($index=0) { + if (isset($this->_colourMap[$index])) { + return $this->_colourMap[$index]; + } + return null; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel5.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel5.php new file mode 100644 index 000000000..238d17c73 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel5.php @@ -0,0 +1,6890 @@ +_data + * + * @var int + */ + private $_dataSize; + + /** + * Current position in stream + * + * @var integer + */ + private $_pos; + + /** + * Workbook to be returned by the reader. + * + * @var PHPExcel + */ + private $_phpExcel; + + /** + * Worksheet that is currently being built by the reader. + * + * @var PHPExcel_Worksheet + */ + private $_phpSheet; + + /** + * BIFF version + * + * @var int + */ + private $_version; + + /** + * Codepage set in the Excel file being read. Only important for BIFF5 (Excel 5.0 - Excel 95) + * For BIFF8 (Excel 97 - Excel 2003) this will always have the value 'UTF-16LE' + * + * @var string + */ + private $_codepage; + + /** + * Shared formats + * + * @var array + */ + private $_formats; + + /** + * Shared fonts + * + * @var array + */ + private $_objFonts; + + /** + * Color palette + * + * @var array + */ + private $_palette; + + /** + * Worksheets + * + * @var array + */ + private $_sheets; + + /** + * External books + * + * @var array + */ + private $_externalBooks; + + /** + * REF structures. Only applies to BIFF8. + * + * @var array + */ + private $_ref; + + /** + * External names + * + * @var array + */ + private $_externalNames; + + /** + * Defined names + * + * @var array + */ + private $_definedname; + + /** + * Shared strings. Only applies to BIFF8. + * + * @var array + */ + private $_sst; + + /** + * Panes are frozen? (in sheet currently being read). See WINDOW2 record. + * + * @var boolean + */ + private $_frozen; + + /** + * Fit printout to number of pages? (in sheet currently being read). See SHEETPR record. + * + * @var boolean + */ + private $_isFitToPages; + + /** + * Objects. One OBJ record contributes with one entry. + * + * @var array + */ + private $_objs; + + /** + * Text Objects. One TXO record corresponds with one entry. + * + * @var array + */ + private $_textObjects; + + /** + * Cell Annotations (BIFF8) + * + * @var array + */ + private $_cellNotes; + + /** + * The combined MSODRAWINGGROUP data + * + * @var string + */ + private $_drawingGroupData; + + /** + * The combined MSODRAWING data (per sheet) + * + * @var string + */ + private $_drawingData; + + /** + * Keep track of XF index + * + * @var int + */ + private $_xfIndex; + + /** + * Mapping of XF index (that is a cell XF) to final index in cellXf collection + * + * @var array + */ + private $_mapCellXfIndex; + + /** + * Mapping of XF index (that is a style XF) to final index in cellStyleXf collection + * + * @var array + */ + private $_mapCellStyleXfIndex; + + /** + * The shared formulas in a sheet. One SHAREDFMLA record contributes with one value. + * + * @var array + */ + private $_sharedFormulas; + + /** + * The shared formula parts in a sheet. One FORMULA record contributes with one value if it + * refers to a shared formula. + * + * @var array + */ + private $_sharedFormulaParts; + + + /** + * Create a new PHPExcel_Reader_Excel5 instance + */ + public function __construct() { + $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + + /** + * Read data only? + * If this is true, then the Reader will only read data values for cells, it will not read any formatting information. + * If false (the default) it will read data and formatting. + * + * @return boolean + */ + public function getReadDataOnly() + { + return $this->_readDataOnly; + } + + + /** + * Set read data only + * Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information. + * Set to false (the default) to advise the Reader to read both data and formatting for cells. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_Excel5 + */ + public function setReadDataOnly($pValue = false) + { + $this->_readDataOnly = $pValue; + return $this; + } + + + /** + * Get which sheets to load + * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null + * indicating that all worksheets in the workbook should be loaded. + * + * @return mixed + */ + public function getLoadSheetsOnly() + { + return $this->_loadSheetsOnly; + } + + + /** + * Set which sheets to load + * + * @param mixed $value + * This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name. + * If NULL, then it tells the Reader to read all worksheets in the workbook + * + * @return PHPExcel_Reader_Excel5 + */ + public function setLoadSheetsOnly($value = null) + { + $this->_loadSheetsOnly = is_array($value) ? + $value : array($value); + return $this; + } + + + /** + * Set all sheets to load + * Tells the Reader to load all worksheets from the workbook. + * + * @return PHPExcel_Reader_Excel5 + */ + public function setLoadAllSheets() + { + $this->_loadSheetsOnly = null; + return $this; + } + + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + * @return PHPExcel_Reader_Excel5 + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + try { + // Use ParseXL for the hard work. + $ole = new PHPExcel_Shared_OLERead(); + + // get excel data + $res = $ole->read($pFilename); + return true; + + } catch (Exception $e) { + return false; + } + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetNames = array(); + + // Read the OLE file + $this->_loadOLE($pFilename); + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->_dataSize = strlen($this->_data); + + $this->_pos = 0; + $this->_sheets = array(); + + // Parse Workbook Global Substream + while ($this->_pos < $this->_dataSize) { + $code = self::_GetInt2d($this->_data, $this->_pos); + + switch ($code) { + case self::XLS_Type_BOF: $this->_readBof(); break; + case self::XLS_Type_SHEET: $this->_readSheet(); break; + case self::XLS_Type_EOF: $this->_readDefault(); break 2; + default: $this->_readDefault(); break; + } + } + + foreach ($this->_sheets as $sheet) { + if ($sheet['sheetType'] != 0x00) { + // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module + continue; + } + + $worksheetNames[] = $sheet['name']; + } + + return $worksheetNames; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + // Read the OLE file + $this->_loadOLE($pFilename); + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->_dataSize = strlen($this->_data); + + // initialize + $this->_pos = 0; + $this->_sheets = array(); + + // Parse Workbook Global Substream + while ($this->_pos < $this->_dataSize) { + $code = self::_GetInt2d($this->_data, $this->_pos); + + switch ($code) { + case self::XLS_Type_BOF: $this->_readBof(); break; + case self::XLS_Type_SHEET: $this->_readSheet(); break; + case self::XLS_Type_EOF: $this->_readDefault(); break 2; + default: $this->_readDefault(); break; + } + } + + // Parse the individual sheets + foreach ($this->_sheets as $sheet) { + + if ($sheet['sheetType'] != 0x00) { + // 0x00: Worksheet + // 0x02: Chart + // 0x06: Visual Basic module + continue; + } + + $tmpInfo = array(); + $tmpInfo['worksheetName'] = $sheet['name']; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + $this->_pos = $sheet['offset']; + + while ($this->_pos <= $this->_dataSize - 4) { + $code = self::_GetInt2d($this->_data, $this->_pos); + + switch ($code) { + case self::XLS_Type_RK: + case self::XLS_Type_LABELSST: + case self::XLS_Type_NUMBER: + case self::XLS_Type_FORMULA: + case self::XLS_Type_BOOLERR: + case self::XLS_Type_LABEL: + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + $rowIndex = self::_GetInt2d($recordData, 0) + 1; + $columnIndex = self::_GetInt2d($recordData, 2); + + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + break; + case self::XLS_Type_BOF: $this->_readBof(); break; + case self::XLS_Type_EOF: $this->_readDefault(); break 2; + default: $this->_readDefault(); break; + } + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + } + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Read the OLE file + $this->_loadOLE($pFilename); + + // Initialisations + $this->_phpExcel = new PHPExcel; + $this->_phpExcel->removeSheetByIndex(0); // remove 1st sheet + if (!$this->_readDataOnly) { + $this->_phpExcel->removeCellStyleXfByIndex(0); // remove the default style + $this->_phpExcel->removeCellXfByIndex(0); // remove the default style + } + + // Read the summary information stream (containing meta data) + $this->_readSummaryInformation(); + + // Read the Additional document summary information stream (containing application-specific meta data) + $this->_readDocumentSummaryInformation(); + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->_dataSize = strlen($this->_data); + + // initialize + $this->_pos = 0; + $this->_codepage = 'CP1252'; + $this->_formats = array(); + $this->_objFonts = array(); + $this->_palette = array(); + $this->_sheets = array(); + $this->_externalBooks = array(); + $this->_ref = array(); + $this->_definedname = array(); + $this->_sst = array(); + $this->_drawingGroupData = ''; + $this->_xfIndex = ''; + $this->_mapCellXfIndex = array(); + $this->_mapCellStyleXfIndex = array(); + + // Parse Workbook Global Substream + while ($this->_pos < $this->_dataSize) { + $code = self::_GetInt2d($this->_data, $this->_pos); + + switch ($code) { + case self::XLS_Type_BOF: $this->_readBof(); break; + case self::XLS_Type_FILEPASS: $this->_readFilepass(); break; + case self::XLS_Type_CODEPAGE: $this->_readCodepage(); break; + case self::XLS_Type_DATEMODE: $this->_readDateMode(); break; + case self::XLS_Type_FONT: $this->_readFont(); break; + case self::XLS_Type_FORMAT: $this->_readFormat(); break; + case self::XLS_Type_XF: $this->_readXf(); break; + case self::XLS_Type_XFEXT: $this->_readXfExt(); break; + case self::XLS_Type_STYLE: $this->_readStyle(); break; + case self::XLS_Type_PALETTE: $this->_readPalette(); break; + case self::XLS_Type_SHEET: $this->_readSheet(); break; + case self::XLS_Type_EXTERNALBOOK: $this->_readExternalBook(); break; + case self::XLS_Type_EXTERNNAME: $this->_readExternName(); break; + case self::XLS_Type_EXTERNSHEET: $this->_readExternSheet(); break; + case self::XLS_Type_DEFINEDNAME: $this->_readDefinedName(); break; + case self::XLS_Type_MSODRAWINGGROUP: $this->_readMsoDrawingGroup(); break; + case self::XLS_Type_SST: $this->_readSst(); break; + case self::XLS_Type_EOF: $this->_readDefault(); break 2; + default: $this->_readDefault(); break; + } + } + + // Resolve indexed colors for font, fill, and border colors + // Cannot be resolved already in XF record, because PALETTE record comes afterwards + if (!$this->_readDataOnly) { + foreach ($this->_objFonts as $objFont) { + if (isset($objFont->colorIndex)) { + $color = self::_readColor($objFont->colorIndex,$this->_palette,$this->_version); + $objFont->getColor()->setRGB($color['rgb']); + } + } + + foreach ($this->_phpExcel->getCellXfCollection() as $objStyle) { + // fill start and end color + $fill = $objStyle->getFill(); + + if (isset($fill->startcolorIndex)) { + $startColor = self::_readColor($fill->startcolorIndex,$this->_palette,$this->_version); + $fill->getStartColor()->setRGB($startColor['rgb']); + } + + if (isset($fill->endcolorIndex)) { + $endColor = self::_readColor($fill->endcolorIndex,$this->_palette,$this->_version); + $fill->getEndColor()->setRGB($endColor['rgb']); + } + + // border colors + $top = $objStyle->getBorders()->getTop(); + $right = $objStyle->getBorders()->getRight(); + $bottom = $objStyle->getBorders()->getBottom(); + $left = $objStyle->getBorders()->getLeft(); + $diagonal = $objStyle->getBorders()->getDiagonal(); + + if (isset($top->colorIndex)) { + $borderTopColor = self::_readColor($top->colorIndex,$this->_palette,$this->_version); + $top->getColor()->setRGB($borderTopColor['rgb']); + } + + if (isset($right->colorIndex)) { + $borderRightColor = self::_readColor($right->colorIndex,$this->_palette,$this->_version); + $right->getColor()->setRGB($borderRightColor['rgb']); + } + + if (isset($bottom->colorIndex)) { + $borderBottomColor = self::_readColor($bottom->colorIndex,$this->_palette,$this->_version); + $bottom->getColor()->setRGB($borderBottomColor['rgb']); + } + + if (isset($left->colorIndex)) { + $borderLeftColor = self::_readColor($left->colorIndex,$this->_palette,$this->_version); + $left->getColor()->setRGB($borderLeftColor['rgb']); + } + + if (isset($diagonal->colorIndex)) { + $borderDiagonalColor = self::_readColor($diagonal->colorIndex,$this->_palette,$this->_version); + $diagonal->getColor()->setRGB($borderDiagonalColor['rgb']); + } + } + } + + // treat MSODRAWINGGROUP records, workbook-level Escher + if (!$this->_readDataOnly && $this->_drawingGroupData) { + $escherWorkbook = new PHPExcel_Shared_Escher(); + $reader = new PHPExcel_Reader_Excel5_Escher($escherWorkbook); + $escherWorkbook = $reader->load($this->_drawingGroupData); + + // debug Escher stream + //$debug = new Debug_Escher(new PHPExcel_Shared_Escher()); + //$debug->load($this->_drawingGroupData); + } + + // Parse the individual sheets + foreach ($this->_sheets as $sheet) { + + if ($sheet['sheetType'] != 0x00) { + // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module + continue; + } + + // check if sheet should be skipped + if (isset($this->_loadSheetsOnly) && !in_array($sheet['name'], $this->_loadSheetsOnly)) { + continue; + } + + // add sheet to PHPExcel object + $this->_phpSheet = $this->_phpExcel->createSheet(); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula + // cells... during the load, all formulae should be correct, and we're simply bringing the worksheet + // name in line with the formula, not the reverse + $this->_phpSheet->setTitle($sheet['name'],false); + $this->_phpSheet->setSheetState($sheet['sheetState']); + + $this->_pos = $sheet['offset']; + + // Initialize isFitToPages. May change after reading SHEETPR record. + $this->_isFitToPages = false; + + // Initialize drawingData + $this->_drawingData = ''; + + // Initialize objs + $this->_objs = array(); + + // Initialize shared formula parts + $this->_sharedFormulaParts = array(); + + // Initialize shared formulas + $this->_sharedFormulas = array(); + + // Initialize text objs + $this->_textObjects = array(); + + // Initialize cell annotations + $this->_cellNotes = array(); + $this->textObjRef = -1; + + while ($this->_pos <= $this->_dataSize - 4) { + $code = self::_GetInt2d($this->_data, $this->_pos); + + switch ($code) { + case self::XLS_Type_BOF: $this->_readBof(); break; + case self::XLS_Type_PRINTGRIDLINES: $this->_readPrintGridlines(); break; + case self::XLS_Type_DEFAULTROWHEIGHT: $this->_readDefaultRowHeight(); break; + case self::XLS_Type_SHEETPR: $this->_readSheetPr(); break; + case self::XLS_Type_HORIZONTALPAGEBREAKS: $this->_readHorizontalPageBreaks(); break; + case self::XLS_Type_VERTICALPAGEBREAKS: $this->_readVerticalPageBreaks(); break; + case self::XLS_Type_HEADER: $this->_readHeader(); break; + case self::XLS_Type_FOOTER: $this->_readFooter(); break; + case self::XLS_Type_HCENTER: $this->_readHcenter(); break; + case self::XLS_Type_VCENTER: $this->_readVcenter(); break; + case self::XLS_Type_LEFTMARGIN: $this->_readLeftMargin(); break; + case self::XLS_Type_RIGHTMARGIN: $this->_readRightMargin(); break; + case self::XLS_Type_TOPMARGIN: $this->_readTopMargin(); break; + case self::XLS_Type_BOTTOMMARGIN: $this->_readBottomMargin(); break; + case self::XLS_Type_PAGESETUP: $this->_readPageSetup(); break; + case self::XLS_Type_PROTECT: $this->_readProtect(); break; + case self::XLS_Type_SCENPROTECT: $this->_readScenProtect(); break; + case self::XLS_Type_OBJECTPROTECT: $this->_readObjectProtect(); break; + case self::XLS_Type_PASSWORD: $this->_readPassword(); break; + case self::XLS_Type_DEFCOLWIDTH: $this->_readDefColWidth(); break; + case self::XLS_Type_COLINFO: $this->_readColInfo(); break; + case self::XLS_Type_DIMENSION: $this->_readDefault(); break; + case self::XLS_Type_ROW: $this->_readRow(); break; + case self::XLS_Type_DBCELL: $this->_readDefault(); break; + case self::XLS_Type_RK: $this->_readRk(); break; + case self::XLS_Type_LABELSST: $this->_readLabelSst(); break; + case self::XLS_Type_MULRK: $this->_readMulRk(); break; + case self::XLS_Type_NUMBER: $this->_readNumber(); break; + case self::XLS_Type_FORMULA: $this->_readFormula(); break; + case self::XLS_Type_SHAREDFMLA: $this->_readSharedFmla(); break; + case self::XLS_Type_BOOLERR: $this->_readBoolErr(); break; + case self::XLS_Type_MULBLANK: $this->_readMulBlank(); break; + case self::XLS_Type_LABEL: $this->_readLabel(); break; + case self::XLS_Type_BLANK: $this->_readBlank(); break; + case self::XLS_Type_MSODRAWING: $this->_readMsoDrawing(); break; + case self::XLS_Type_OBJ: $this->_readObj(); break; + case self::XLS_Type_WINDOW2: $this->_readWindow2(); break; + case self::XLS_Type_SCL: $this->_readScl(); break; + case self::XLS_Type_PANE: $this->_readPane(); break; + case self::XLS_Type_SELECTION: $this->_readSelection(); break; + case self::XLS_Type_MERGEDCELLS: $this->_readMergedCells(); break; + case self::XLS_Type_HYPERLINK: $this->_readHyperLink(); break; + case self::XLS_Type_DATAVALIDATIONS: $this->_readDataValidations(); break; + case self::XLS_Type_DATAVALIDATION: $this->_readDataValidation(); break; + case self::XLS_Type_SHEETLAYOUT: $this->_readSheetLayout(); break; + case self::XLS_Type_SHEETPROTECTION: $this->_readSheetProtection(); break; + case self::XLS_Type_RANGEPROTECTION: $this->_readRangeProtection(); break; + case self::XLS_Type_NOTE: $this->_readNote(); break; + //case self::XLS_Type_IMDATA: $this->_readImData(); break; + case self::XLS_Type_TXO: $this->_readTextObject(); break; + case self::XLS_Type_CONTINUE: $this->_readContinue(); break; + case self::XLS_Type_EOF: $this->_readDefault(); break 2; + default: $this->_readDefault(); break; + } + + } + + // treat MSODRAWING records, sheet-level Escher + if (!$this->_readDataOnly && $this->_drawingData) { + $escherWorksheet = new PHPExcel_Shared_Escher(); + $reader = new PHPExcel_Reader_Excel5_Escher($escherWorksheet); + $escherWorksheet = $reader->load($this->_drawingData); + + // debug Escher stream + //$debug = new Debug_Escher(new PHPExcel_Shared_Escher()); + //$debug->load($this->_drawingData); + + // get all spContainers in one long array, so they can be mapped to OBJ records + $allSpContainers = $escherWorksheet->getDgContainer()->getSpgrContainer()->getAllSpContainers(); + } + + // treat OBJ records + foreach ($this->_objs as $n => $obj) { +// echo '
        Object reference is ',$n,'
        '; +// var_dump($obj); +// echo '
        '; + + // the first shape container never has a corresponding OBJ record, hence $n + 1 + if (isset($allSpContainers[$n + 1]) && is_object($allSpContainers[$n + 1])) { + $spContainer = $allSpContainers[$n + 1]; + + // we skip all spContainers that are a part of a group shape since we cannot yet handle those + if ($spContainer->getNestingLevel() > 1) { + continue; + } + + // calculate the width and height of the shape + list($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($spContainer->getStartCoordinates()); + list($endColumn, $endRow) = PHPExcel_Cell::coordinateFromString($spContainer->getEndCoordinates()); + + $startOffsetX = $spContainer->getStartOffsetX(); + $startOffsetY = $spContainer->getStartOffsetY(); + $endOffsetX = $spContainer->getEndOffsetX(); + $endOffsetY = $spContainer->getEndOffsetY(); + + $width = PHPExcel_Shared_Excel5::getDistanceX($this->_phpSheet, $startColumn, $startOffsetX, $endColumn, $endOffsetX); + $height = PHPExcel_Shared_Excel5::getDistanceY($this->_phpSheet, $startRow, $startOffsetY, $endRow, $endOffsetY); + + // calculate offsetX and offsetY of the shape + $offsetX = $startOffsetX * PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, $startColumn) / 1024; + $offsetY = $startOffsetY * PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $startRow) / 256; + + switch ($obj['otObjType']) { + case 0x19: + // Note +// echo 'Cell Annotation Object
        '; +// echo 'Object ID is ',$obj['idObjID'],'
        '; +// + if (isset($this->_cellNotes[$obj['idObjID']])) { + $cellNote = $this->_cellNotes[$obj['idObjID']]; + + if (isset($this->_textObjects[$obj['idObjID']])) { + $textObject = $this->_textObjects[$obj['idObjID']]; + $this->_cellNotes[$obj['idObjID']]['objTextData'] = $textObject; + } + } + break; + + case 0x08: +// echo 'Picture Object
        '; + // picture + + // get index to BSE entry (1-based) + $BSEindex = $spContainer->getOPT(0x0104); + $BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection(); + $BSE = $BSECollection[$BSEindex - 1]; + $blipType = $BSE->getBlipType(); + + // need check because some blip types are not supported by Escher reader such as EMF + if ($blip = $BSE->getBlip()) { + $ih = imagecreatefromstring($blip->getData()); + $drawing = new PHPExcel_Worksheet_MemoryDrawing(); + $drawing->setImageResource($ih); + + // width, height, offsetX, offsetY + $drawing->setResizeProportional(false); + $drawing->setWidth($width); + $drawing->setHeight($height); + $drawing->setOffsetX($offsetX); + $drawing->setOffsetY($offsetY); + + switch ($blipType) { + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG: + $drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG); + $drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_JPEG); + break; + + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG: + $drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG); + $drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_PNG); + break; + } + + $drawing->setWorksheet($this->_phpSheet); + $drawing->setCoordinates($spContainer->getStartCoordinates()); + } + + break; + + default: + // other object type + break; + + } + } + } + + // treat SHAREDFMLA records + if ($this->_version == self::XLS_BIFF8) { + foreach ($this->_sharedFormulaParts as $cell => $baseCell) { + list($column, $row) = PHPExcel_Cell::coordinateFromString($cell); + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($column, $row, $this->_phpSheet->getTitle()) ) { + $formula = $this->_getFormulaFromStructure($this->_sharedFormulas[$baseCell], $cell); + $this->_phpSheet->getCell($cell)->setValueExplicit('=' . $formula, PHPExcel_Cell_DataType::TYPE_FORMULA); + } + } + } + + if (!empty($this->_cellNotes)) { + foreach($this->_cellNotes as $note => $noteDetails) { + if (!isset($noteDetails['objTextData'])) { + if (isset($this->_textObjects[$note])) { + $textObject = $this->_textObjects[$note]; + $noteDetails['objTextData'] = $textObject; + } else { + $noteDetails['objTextData']['text'] = ''; + } + } +// echo 'Cell annotation ',$note,'
        '; +// var_dump($noteDetails); +// echo '
        '; + $cellAddress = str_replace('$','',$noteDetails['cellRef']); + $this->_phpSheet->getComment( $cellAddress ) + ->setAuthor( $noteDetails['author'] ) + ->setText($this->_parseRichText($noteDetails['objTextData']['text']) ); + } + } + } + + // add the named ranges (defined names) + foreach ($this->_definedname as $definedName) { + if ($definedName['isBuiltInName']) { + switch ($definedName['name']) { + + case pack('C', 0x06): + // print area + // in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2 + + $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? + + $extractedRanges = array(); + foreach ($ranges as $range) { + // $range should look like one of these + // Foo!$C$7:$J$66 + // Bar!$A$1:$IV$2 + + $explodes = explode('!', $range); // FIXME: what if sheetname contains exclamation mark? + $sheetName = $explodes[0]; + + if (count($explodes) == 2) { + $extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66 + } + } + if ($docSheet = $this->_phpExcel->getSheetByName($sheetName)) { + $docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2 + } + break; + + case pack('C', 0x07): + // print titles (repeating rows) + // Assuming BIFF8, there are 3 cases + // 1. repeating rows + // formula looks like this: Sheet!$A$1:$IV$2 + // rows 1-2 repeat + // 2. repeating columns + // formula looks like this: Sheet!$A$1:$B$65536 + // columns A-B repeat + // 3. both repeating rows and repeating columns + // formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2 + + $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? + + foreach ($ranges as $range) { + // $range should look like this one of these + // Sheet!$A$1:$B$65536 + // Sheet!$A$1:$IV$2 + + $explodes = explode('!', $range); + + if (count($explodes) == 2) { + if ($docSheet = $this->_phpExcel->getSheetByName($explodes[0])) { + + $extractedRange = $explodes[1]; + $extractedRange = str_replace('$', '', $extractedRange); + + $coordinateStrings = explode(':', $extractedRange); + if (count($coordinateStrings) == 2) { + list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[0]); + list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[1]); + + if ($firstColumn == 'A' and $lastColumn == 'IV') { + // then we have repeating rows + $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($firstRow, $lastRow)); + } elseif ($firstRow == 1 and $lastRow == 65536) { + // then we have repeating columns + $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($firstColumn, $lastColumn)); + } + } + } + } + } + break; + + } + } else { + // Extract range + $explodes = explode('!', $definedName['formula']); + + if (count($explodes) == 2) { + if (($docSheet = $this->_phpExcel->getSheetByName($explodes[0])) || + ($docSheet = $this->_phpExcel->getSheetByName(trim($explodes[0],"'")))) { + $extractedRange = $explodes[1]; + $extractedRange = str_replace('$', '', $extractedRange); + + $localOnly = ($definedName['scope'] == 0) ? false : true; + + $scope = ($definedName['scope'] == 0) ? + null : $this->_phpExcel->getSheetByName($this->_sheets[$definedName['scope'] - 1]['name']); + + $this->_phpExcel->addNamedRange( new PHPExcel_NamedRange((string)$definedName['name'], $docSheet, $extractedRange, $localOnly, $scope) ); + } + } else { + // Named Value + // TODO Provide support for named values + } + } + } + + return $this->_phpExcel; + } + + + /** + * Use OLE reader to extract the relevant data streams from the OLE file + * + * @param string $pFilename + */ + private function _loadOLE($pFilename) + { + // OLE reader + $ole = new PHPExcel_Shared_OLERead(); + + // get excel data, + $res = $ole->read($pFilename); + // Get workbook data: workbook stream + sheet streams + $this->_data = $ole->getStream($ole->wrkbook); + + // Get summary information data + $this->_summaryInformation = $ole->getStream($ole->summaryInformation); + + // Get additional document summary information data + $this->_documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); + + // Get user-defined property data +// $this->_userDefinedProperties = $ole->getUserDefinedProperties(); + } + + + /** + * Read summary information + */ + private function _readSummaryInformation() + { + if (!isset($this->_summaryInformation)) { + return; + } + + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + // offset: 2; size: 2; + // offset: 4; size: 2; OS version + // offset: 6; size: 2; OS indicator + // offset: 8; size: 16 + // offset: 24; size: 4; section count + $secCount = self::_GetInt4d($this->_summaryInformation, 24); + + // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 + // offset: 44; size: 4 + $secOffset = self::_GetInt4d($this->_summaryInformation, 44); + + // section header + // offset: $secOffset; size: 4; section length + $secLength = self::_GetInt4d($this->_summaryInformation, $secOffset); + + // offset: $secOffset+4; size: 4; property count + $countProperties = self::_GetInt4d($this->_summaryInformation, $secOffset+4); + + // initialize code page (used to resolve string values) + $codePage = 'CP1252'; + + // offset: ($secOffset+8); size: var + // loop through property decarations and properties + for ($i = 0; $i < $countProperties; ++$i) { + + // offset: ($secOffset+8) + (8 * $i); size: 4; property ID + $id = self::_GetInt4d($this->_summaryInformation, ($secOffset+8) + (8 * $i)); + + // Use value of property id as appropriate + // offset: ($secOffset+12) + (8 * $i); size: 4; offset from beginning of section (48) + $offset = self::_GetInt4d($this->_summaryInformation, ($secOffset+12) + (8 * $i)); + + $type = self::_GetInt4d($this->_summaryInformation, $secOffset + $offset); + + // initialize property value + $value = null; + + // extract property value based on property type + switch ($type) { + case 0x02: // 2 byte signed integer + $value = self::_GetInt2d($this->_summaryInformation, $secOffset + 4 + $offset); + break; + + case 0x03: // 4 byte signed integer + $value = self::_GetInt4d($this->_summaryInformation, $secOffset + 4 + $offset); + break; + + case 0x13: // 4 byte unsigned integer + // not needed yet, fix later if necessary + break; + + case 0x1E: // null-terminated string prepended by dword string length + $byteLength = self::_GetInt4d($this->_summaryInformation, $secOffset + 4 + $offset); + $value = substr($this->_summaryInformation, $secOffset + 8 + $offset, $byteLength); + $value = PHPExcel_Shared_String::ConvertEncoding($value, 'UTF-8', $codePage); + $value = rtrim($value); + break; + + case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + // PHP-time + $value = PHPExcel_Shared_OLE::OLE2LocalDate(substr($this->_summaryInformation, $secOffset + 4 + $offset, 8)); + break; + + case 0x47: // Clipboard format + // not needed yet, fix later if necessary + break; + } + + switch ($id) { + case 0x01: // Code Page + $codePage = PHPExcel_Shared_CodePage::NumberToName($value); + break; + + case 0x02: // Title + $this->_phpExcel->getProperties()->setTitle($value); + break; + + case 0x03: // Subject + $this->_phpExcel->getProperties()->setSubject($value); + break; + + case 0x04: // Author (Creator) + $this->_phpExcel->getProperties()->setCreator($value); + break; + + case 0x05: // Keywords + $this->_phpExcel->getProperties()->setKeywords($value); + break; + + case 0x06: // Comments (Description) + $this->_phpExcel->getProperties()->setDescription($value); + break; + + case 0x07: // Template + // Not supported by PHPExcel + break; + + case 0x08: // Last Saved By (LastModifiedBy) + $this->_phpExcel->getProperties()->setLastModifiedBy($value); + break; + + case 0x09: // Revision + // Not supported by PHPExcel + break; + + case 0x0A: // Total Editing Time + // Not supported by PHPExcel + break; + + case 0x0B: // Last Printed + // Not supported by PHPExcel + break; + + case 0x0C: // Created Date/Time + $this->_phpExcel->getProperties()->setCreated($value); + break; + + case 0x0D: // Modified Date/Time + $this->_phpExcel->getProperties()->setModified($value); + break; + + case 0x0E: // Number of Pages + // Not supported by PHPExcel + break; + + case 0x0F: // Number of Words + // Not supported by PHPExcel + break; + + case 0x10: // Number of Characters + // Not supported by PHPExcel + break; + + case 0x11: // Thumbnail + // Not supported by PHPExcel + break; + + case 0x12: // Name of creating application + // Not supported by PHPExcel + break; + + case 0x13: // Security + // Not supported by PHPExcel + break; + + } + } + } + + + /** + * Read additional document summary information + */ + private function _readDocumentSummaryInformation() + { + if (!isset($this->_documentSummaryInformation)) { + return; + } + + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + // offset: 2; size: 2; + // offset: 4; size: 2; OS version + // offset: 6; size: 2; OS indicator + // offset: 8; size: 16 + // offset: 24; size: 4; section count + $secCount = self::_GetInt4d($this->_documentSummaryInformation, 24); +// echo '$secCount = ',$secCount,'
        '; + + // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae + // offset: 44; size: 4; first section offset + $secOffset = self::_GetInt4d($this->_documentSummaryInformation, 44); +// echo '$secOffset = ',$secOffset,'
        '; + + // section header + // offset: $secOffset; size: 4; section length + $secLength = self::_GetInt4d($this->_documentSummaryInformation, $secOffset); +// echo '$secLength = ',$secLength,'
        '; + + // offset: $secOffset+4; size: 4; property count + $countProperties = self::_GetInt4d($this->_documentSummaryInformation, $secOffset+4); +// echo '$countProperties = ',$countProperties,'
        '; + + // initialize code page (used to resolve string values) + $codePage = 'CP1252'; + + // offset: ($secOffset+8); size: var + // loop through property decarations and properties + for ($i = 0; $i < $countProperties; ++$i) { +// echo 'Property ',$i,'
        '; + // offset: ($secOffset+8) + (8 * $i); size: 4; property ID + $id = self::_GetInt4d($this->_documentSummaryInformation, ($secOffset+8) + (8 * $i)); +// echo 'ID is ',$id,'
        '; + + // Use value of property id as appropriate + // offset: 60 + 8 * $i; size: 4; offset from beginning of section (48) + $offset = self::_GetInt4d($this->_documentSummaryInformation, ($secOffset+12) + (8 * $i)); + + $type = self::_GetInt4d($this->_documentSummaryInformation, $secOffset + $offset); +// echo 'Type is ',$type,', '; + + // initialize property value + $value = null; + + // extract property value based on property type + switch ($type) { + case 0x02: // 2 byte signed integer + $value = self::_GetInt2d($this->_documentSummaryInformation, $secOffset + 4 + $offset); + break; + + case 0x03: // 4 byte signed integer + $value = self::_GetInt4d($this->_documentSummaryInformation, $secOffset + 4 + $offset); + break; + + case 0x0B: // Boolean + $value = self::_GetInt2d($this->_documentSummaryInformation, $secOffset + 4 + $offset); + $value = ($value == 0 ? false : true); + break; + + case 0x13: // 4 byte unsigned integer + // not needed yet, fix later if necessary + break; + + case 0x1E: // null-terminated string prepended by dword string length + $byteLength = self::_GetInt4d($this->_documentSummaryInformation, $secOffset + 4 + $offset); + $value = substr($this->_documentSummaryInformation, $secOffset + 8 + $offset, $byteLength); + $value = PHPExcel_Shared_String::ConvertEncoding($value, 'UTF-8', $codePage); + $value = rtrim($value); + break; + + case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + // PHP-Time + $value = PHPExcel_Shared_OLE::OLE2LocalDate(substr($this->_documentSummaryInformation, $secOffset + 4 + $offset, 8)); + break; + + case 0x47: // Clipboard format + // not needed yet, fix later if necessary + break; + } + + switch ($id) { + case 0x01: // Code Page + $codePage = PHPExcel_Shared_CodePage::NumberToName($value); + break; + + case 0x02: // Category + $this->_phpExcel->getProperties()->setCategory($value); + break; + + case 0x03: // Presentation Target + // Not supported by PHPExcel + break; + + case 0x04: // Bytes + // Not supported by PHPExcel + break; + + case 0x05: // Lines + // Not supported by PHPExcel + break; + + case 0x06: // Paragraphs + // Not supported by PHPExcel + break; + + case 0x07: // Slides + // Not supported by PHPExcel + break; + + case 0x08: // Notes + // Not supported by PHPExcel + break; + + case 0x09: // Hidden Slides + // Not supported by PHPExcel + break; + + case 0x0A: // MM Clips + // Not supported by PHPExcel + break; + + case 0x0B: // Scale Crop + // Not supported by PHPExcel + break; + + case 0x0C: // Heading Pairs + // Not supported by PHPExcel + break; + + case 0x0D: // Titles of Parts + // Not supported by PHPExcel + break; + + case 0x0E: // Manager + $this->_phpExcel->getProperties()->setManager($value); + break; + + case 0x0F: // Company + $this->_phpExcel->getProperties()->setCompany($value); + break; + + case 0x10: // Links up-to-date + // Not supported by PHPExcel + break; + + } + } + } + + + /** + * Reads a general type of BIFF record. Does nothing except for moving stream pointer forward to next record. + */ + private function _readDefault() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); +// $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + } + + + /** + * The NOTE record specifies a comment associated with a particular cell. In Excel 95 (BIFF7) and earlier versions, + * this record stores a note (cell note). This feature was significantly enhanced in Excel 97. + */ + private function _readNote() + { +// echo 'Read Cell Annotation
        '; + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + $cellAddress = $this->_readBIFF8CellAddress(substr($recordData, 0, 4)); + if ($this->_version == self::XLS_BIFF8) { + $noteObjID = self::_GetInt2d($recordData, 6); + $noteAuthor = self::_readUnicodeStringLong(substr($recordData, 8)); + $noteAuthor = $noteAuthor['value']; +// echo 'Note Address=',$cellAddress,'
        '; +// echo 'Note Object ID=',$noteObjID,'
        '; +// echo 'Note Author=',$noteAuthor,'
        '; +// + $this->_cellNotes[$noteObjID] = array('cellRef' => $cellAddress, + 'objectID' => $noteObjID, + 'author' => $noteAuthor + ); + } else { + $extension = false; + if ($cellAddress == '$B$65536') { + // If the address row is -1 and the column is 0, (which translates as $B$65536) then this is a continuation + // note from the previous cell annotation. We're not yet handling this, so annotations longer than the + // max 2048 bytes will probably throw a wobbly. + $row = self::_GetInt2d($recordData, 0); + $extension = true; + $cellAddress = array_pop(array_keys($this->_phpSheet->getComments())); + } +// echo 'Note Address=',$cellAddress,'
        '; + + $cellAddress = str_replace('$','',$cellAddress); + $noteLength = self::_GetInt2d($recordData, 4); + $noteText = trim(substr($recordData, 6)); +// echo 'Note Length=',$noteLength,'
        '; +// echo 'Note Text=',$noteText,'
        '; + + if ($extension) { + // Concatenate this extension with the currently set comment for the cell + $comment = $this->_phpSheet->getComment( $cellAddress ); + $commentText = $comment->getText()->getPlainText(); + $comment->setText($this->_parseRichText($commentText.$noteText) ); + } else { + // Set comment for the cell + $this->_phpSheet->getComment( $cellAddress ) +// ->setAuthor( $author ) + ->setText($this->_parseRichText($noteText) ); + } + } + + } + + + /** + * The TEXT Object record contains the text associated with a cell annotation. + */ + private function _readTextObject() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + // recordData consists of an array of subrecords looking like this: + // grbit: 2 bytes; Option Flags + // rot: 2 bytes; rotation + // cchText: 2 bytes; length of the text (in the first continue record) + // cbRuns: 2 bytes; length of the formatting (in the second continue record) + // followed by the continuation records containing the actual text and formatting + $grbitOpts = self::_GetInt2d($recordData, 0); + $rot = self::_GetInt2d($recordData, 2); + $cchText = self::_GetInt2d($recordData, 10); + $cbRuns = self::_GetInt2d($recordData, 12); + $text = $this->_getSplicedRecordData(); + + $this->_textObjects[$this->textObjRef] = array( + 'text' => substr($text["recordData"],$text["spliceOffsets"][0]+1,$cchText), + 'format' => substr($text["recordData"],$text["spliceOffsets"][1],$cbRuns), + 'alignment' => $grbitOpts, + 'rotation' => $rot + ); + +// echo '_readTextObject()
        '; +// var_dump($this->_textObjects[$this->textObjRef]); +// echo '
        '; + } + + + /** + * Read BOF + */ + private function _readBof() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 2; size: 2; type of the following data + $substreamType = self::_GetInt2d($recordData, 2); + + switch ($substreamType) { + case self::XLS_WorkbookGlobals: + $version = self::_GetInt2d($recordData, 0); + if (($version != self::XLS_BIFF8) && ($version != self::XLS_BIFF7)) { + throw new Exception('Cannot read this Excel file. Version is too old.'); + } + $this->_version = $version; + break; + + case self::XLS_Worksheet: + // do not use this version information for anything + // it is unreliable (OpenOffice doc, 5.8), use only version information from the global stream + break; + + default: + // substream, e.g. chart + // just skip the entire substream + do { + $code = self::_GetInt2d($this->_data, $this->_pos); + $this->_readDefault(); + } while ($code != self::XLS_Type_EOF && $this->_pos < $this->_dataSize); + break; + } + } + + + /** + * FILEPASS + * + * This record is part of the File Protection Block. It + * contains information about the read/write password of the + * file. All record contents following this record will be + * encrypted. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readFilepass() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); +// $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + throw new Exception('Cannot read encrypted file'); + } + + + /** + * CODEPAGE + * + * This record stores the text encoding used to write byte + * strings, stored as MS Windows code page identifier. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readCodepage() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; code page identifier + $codepage = self::_GetInt2d($recordData, 0); + + $this->_codepage = PHPExcel_Shared_CodePage::NumberToName($codepage); + } + + + /** + * DATEMODE + * + * This record specifies the base date for displaying date + * values. All dates are stored as count of days past this + * base date. In BIFF2-BIFF4 this record is part of the + * Calculation Settings Block. In BIFF5-BIFF8 it is + * stored in the Workbook Globals Substream. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readDateMode() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; 0 = base 1900, 1 = base 1904 + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900); + if (ord($recordData{0}) == 1) { + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904); + } + } + + + /** + * Read a FONT record + */ + private function _readFont() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + $objFont = new PHPExcel_Style_Font(); + + // offset: 0; size: 2; height of the font (in twips = 1/20 of a point) + $size = self::_GetInt2d($recordData, 0); + $objFont->setSize($size / 20); + + // offset: 2; size: 2; option flags + // bit: 0; mask 0x0001; bold (redundant in BIFF5-BIFF8) + // bit: 1; mask 0x0002; italic + $isItalic = (0x0002 & self::_GetInt2d($recordData, 2)) >> 1; + if ($isItalic) $objFont->setItalic(true); + + // bit: 2; mask 0x0004; underlined (redundant in BIFF5-BIFF8) + // bit: 3; mask 0x0008; strike + $isStrike = (0x0008 & self::_GetInt2d($recordData, 2)) >> 3; + if ($isStrike) $objFont->setStrikethrough(true); + + // offset: 4; size: 2; colour index + $colorIndex = self::_GetInt2d($recordData, 4); + $objFont->colorIndex = $colorIndex; + + // offset: 6; size: 2; font weight + $weight = self::_GetInt2d($recordData, 6); + switch ($weight) { + case 0x02BC: + $objFont->setBold(true); + break; + } + + // offset: 8; size: 2; escapement type + $escapement = self::_GetInt2d($recordData, 8); + switch ($escapement) { + case 0x0001: + $objFont->setSuperScript(true); + break; + case 0x0002: + $objFont->setSubScript(true); + break; + } + + // offset: 10; size: 1; underline type + $underlineType = ord($recordData{10}); + switch ($underlineType) { + case 0x00: + break; // no underline + case 0x01: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + break; + case 0x02: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE); + break; + case 0x21: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING); + break; + case 0x22: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING); + break; + } + + // offset: 11; size: 1; font family + // offset: 12; size: 1; character set + // offset: 13; size: 1; not used + // offset: 14; size: var; font name + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringShort(substr($recordData, 14)); + } else { + $string = $this->_readByteStringShort(substr($recordData, 14)); + } + $objFont->setName($string['value']); + + $this->_objFonts[] = $objFont; + } + } + + + /** + * FORMAT + * + * This record contains information about a number format. + * All FORMAT records occur together in a sequential list. + * + * In BIFF2-BIFF4 other records referencing a FORMAT record + * contain a zero-based index into this list. From BIFF5 on + * the FORMAT record contains the index itself that will be + * used by other records. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readFormat() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + $indexCode = self::_GetInt2d($recordData, 0); + + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringLong(substr($recordData, 2)); + } else { + // BIFF7 + $string = $this->_readByteStringShort(substr($recordData, 2)); + } + + $formatString = $string['value']; + $this->_formats[$indexCode] = $formatString; + } + } + + + /** + * XF - Extended Format + * + * This record contains formatting information for cells, rows, columns or styles. + * According to http://support.microsoft.com/kb/147732 there are always at least 15 cell style XF + * and 1 cell XF. + * Inspection of Excel files generated by MS Office Excel shows that XF records 0-14 are cell style XF + * and XF record 15 is a cell XF + * We only read the first cell style XF and skip the remaining cell style XF records + * We read all cell XF records. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readXf() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + $objStyle = new PHPExcel_Style(); + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; Index to FONT record + if (self::_GetInt2d($recordData, 0) < 4) { + $fontIndex = self::_GetInt2d($recordData, 0); + } else { + // this has to do with that index 4 is omitted in all BIFF versions for some strange reason + // check the OpenOffice documentation of the FONT record + $fontIndex = self::_GetInt2d($recordData, 0) - 1; + } + $objStyle->setFont($this->_objFonts[$fontIndex]); + + // offset: 2; size: 2; Index to FORMAT record + $numberFormatIndex = self::_GetInt2d($recordData, 2); + if (isset($this->_formats[$numberFormatIndex])) { + // then we have user-defined format code + $numberformat = array('code' => $this->_formats[$numberFormatIndex]); + } elseif (($code = PHPExcel_Style_NumberFormat::builtInFormatCode($numberFormatIndex)) !== '') { + // then we have built-in format code + $numberformat = array('code' => $code); + } else { + // we set the general format code + $numberformat = array('code' => 'General'); + } + $objStyle->getNumberFormat()->setFormatCode($numberformat['code']); + + // offset: 4; size: 2; XF type, cell protection, and parent style XF + // bit 2-0; mask 0x0007; XF_TYPE_PROT + $xfTypeProt = self::_GetInt2d($recordData, 4); + // bit 0; mask 0x01; 1 = cell is locked + $isLocked = (0x01 & $xfTypeProt) >> 0; + $objStyle->getProtection()->setLocked($isLocked ? + PHPExcel_Style_Protection::PROTECTION_INHERIT : PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + + // bit 1; mask 0x02; 1 = Formula is hidden + $isHidden = (0x02 & $xfTypeProt) >> 1; + $objStyle->getProtection()->setHidden($isHidden ? + PHPExcel_Style_Protection::PROTECTION_PROTECTED : PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + + // bit 2; mask 0x04; 0 = Cell XF, 1 = Cell Style XF + $isCellStyleXf = (0x04 & $xfTypeProt) >> 2; + + // offset: 6; size: 1; Alignment and text break + // bit 2-0, mask 0x07; horizontal alignment + $horAlign = (0x07 & ord($recordData{6})) >> 0; + switch ($horAlign) { + case 0: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_GENERAL); + break; + case 1: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); + break; + case 2: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); + break; + case 3: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); + break; + case 5: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY); + break; + case 6: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS); + break; + } + // bit 3, mask 0x08; wrap text + $wrapText = (0x08 & ord($recordData{6})) >> 3; + switch ($wrapText) { + case 0: + $objStyle->getAlignment()->setWrapText(false); + break; + case 1: + $objStyle->getAlignment()->setWrapText(true); + break; + } + // bit 6-4, mask 0x70; vertical alignment + $vertAlign = (0x70 & ord($recordData{6})) >> 4; + switch ($vertAlign) { + case 0: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP); + break; + case 1: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); + break; + case 2: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_BOTTOM); + break; + case 3: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_JUSTIFY); + break; + } + + if ($this->_version == self::XLS_BIFF8) { + // offset: 7; size: 1; XF_ROTATION: Text rotation angle + $angle = ord($recordData{7}); + $rotation = 0; + if ($angle <= 90) { + $rotation = $angle; + } else if ($angle <= 180) { + $rotation = 90 - $angle; + } else if ($angle == 255) { + $rotation = -165; + } + $objStyle->getAlignment()->setTextRotation($rotation); + + // offset: 8; size: 1; Indentation, shrink to cell size, and text direction + // bit: 3-0; mask: 0x0F; indent level + $indent = (0x0F & ord($recordData{8})) >> 0; + $objStyle->getAlignment()->setIndent($indent); + + // bit: 4; mask: 0x10; 1 = shrink content to fit into cell + $shrinkToFit = (0x10 & ord($recordData{8})) >> 4; + switch ($shrinkToFit) { + case 0: + $objStyle->getAlignment()->setShrinkToFit(false); + break; + case 1: + $objStyle->getAlignment()->setShrinkToFit(true); + break; + } + + // offset: 9; size: 1; Flags used for attribute groups + + // offset: 10; size: 4; Cell border lines and background area + // bit: 3-0; mask: 0x0000000F; left style + if ($bordersLeftStyle = self::_mapBorderStyle((0x0000000F & self::_GetInt4d($recordData, 10)) >> 0)) { + $objStyle->getBorders()->getLeft()->setBorderStyle($bordersLeftStyle); + } + // bit: 7-4; mask: 0x000000F0; right style + if ($bordersRightStyle = self::_mapBorderStyle((0x000000F0 & self::_GetInt4d($recordData, 10)) >> 4)) { + $objStyle->getBorders()->getRight()->setBorderStyle($bordersRightStyle); + } + // bit: 11-8; mask: 0x00000F00; top style + if ($bordersTopStyle = self::_mapBorderStyle((0x00000F00 & self::_GetInt4d($recordData, 10)) >> 8)) { + $objStyle->getBorders()->getTop()->setBorderStyle($bordersTopStyle); + } + // bit: 15-12; mask: 0x0000F000; bottom style + if ($bordersBottomStyle = self::_mapBorderStyle((0x0000F000 & self::_GetInt4d($recordData, 10)) >> 12)) { + $objStyle->getBorders()->getBottom()->setBorderStyle($bordersBottomStyle); + } + // bit: 22-16; mask: 0x007F0000; left color + $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & self::_GetInt4d($recordData, 10)) >> 16; + + // bit: 29-23; mask: 0x3F800000; right color + $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & self::_GetInt4d($recordData, 10)) >> 23; + + // bit: 30; mask: 0x40000000; 1 = diagonal line from top left to right bottom + $diagonalDown = (0x40000000 & self::_GetInt4d($recordData, 10)) >> 30 ? + true : false; + + // bit: 31; mask: 0x80000000; 1 = diagonal line from bottom left to top right + $diagonalUp = (0x80000000 & self::_GetInt4d($recordData, 10)) >> 31 ? + true : false; + + if ($diagonalUp == false && $diagonalDown == false) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_NONE); + } elseif ($diagonalUp == true && $diagonalDown == false) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_UP); + } elseif ($diagonalUp == false && $diagonalDown == true) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_DOWN); + } elseif ($diagonalUp == true && $diagonalDown == true) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_BOTH); + } + + // offset: 14; size: 4; + // bit: 6-0; mask: 0x0000007F; top color + $objStyle->getBorders()->getTop()->colorIndex = (0x0000007F & self::_GetInt4d($recordData, 14)) >> 0; + + // bit: 13-7; mask: 0x00003F80; bottom color + $objStyle->getBorders()->getBottom()->colorIndex = (0x00003F80 & self::_GetInt4d($recordData, 14)) >> 7; + + // bit: 20-14; mask: 0x001FC000; diagonal color + $objStyle->getBorders()->getDiagonal()->colorIndex = (0x001FC000 & self::_GetInt4d($recordData, 14)) >> 14; + + // bit: 24-21; mask: 0x01E00000; diagonal style + if ($bordersDiagonalStyle = self::_mapBorderStyle((0x01E00000 & self::_GetInt4d($recordData, 14)) >> 21)) { + $objStyle->getBorders()->getDiagonal()->setBorderStyle($bordersDiagonalStyle); + } + + // bit: 31-26; mask: 0xFC000000 fill pattern + if ($fillType = self::_mapFillPattern((0xFC000000 & self::_GetInt4d($recordData, 14)) >> 26)) { + $objStyle->getFill()->setFillType($fillType); + } + // offset: 18; size: 2; pattern and background colour + // bit: 6-0; mask: 0x007F; color index for pattern color + $objStyle->getFill()->startcolorIndex = (0x007F & self::_GetInt2d($recordData, 18)) >> 0; + + // bit: 13-7; mask: 0x3F80; color index for pattern background + $objStyle->getFill()->endcolorIndex = (0x3F80 & self::_GetInt2d($recordData, 18)) >> 7; + } else { + // BIFF5 + + // offset: 7; size: 1; Text orientation and flags + $orientationAndFlags = ord($recordData{7}); + + // bit: 1-0; mask: 0x03; XF_ORIENTATION: Text orientation + $xfOrientation = (0x03 & $orientationAndFlags) >> 0; + switch ($xfOrientation) { + case 0: + $objStyle->getAlignment()->setTextRotation(0); + break; + case 1: + $objStyle->getAlignment()->setTextRotation(-165); + break; + case 2: + $objStyle->getAlignment()->setTextRotation(90); + break; + case 3: + $objStyle->getAlignment()->setTextRotation(-90); + break; + } + + // offset: 8; size: 4; cell border lines and background area + $borderAndBackground = self::_GetInt4d($recordData, 8); + + // bit: 6-0; mask: 0x0000007F; color index for pattern color + $objStyle->getFill()->startcolorIndex = (0x0000007F & $borderAndBackground) >> 0; + + // bit: 13-7; mask: 0x00003F80; color index for pattern background + $objStyle->getFill()->endcolorIndex = (0x00003F80 & $borderAndBackground) >> 7; + + // bit: 21-16; mask: 0x003F0000; fill pattern + $objStyle->getFill()->setFillType(self::_mapFillPattern((0x003F0000 & $borderAndBackground) >> 16)); + + // bit: 24-22; mask: 0x01C00000; bottom line style + $objStyle->getBorders()->getBottom()->setBorderStyle(self::_mapBorderStyle((0x01C00000 & $borderAndBackground) >> 22)); + + // bit: 31-25; mask: 0xFE000000; bottom line color + $objStyle->getBorders()->getBottom()->colorIndex = (0xFE000000 & $borderAndBackground) >> 25; + + // offset: 12; size: 4; cell border lines + $borderLines = self::_GetInt4d($recordData, 12); + + // bit: 2-0; mask: 0x00000007; top line style + $objStyle->getBorders()->getTop()->setBorderStyle(self::_mapBorderStyle((0x00000007 & $borderLines) >> 0)); + + // bit: 5-3; mask: 0x00000038; left line style + $objStyle->getBorders()->getLeft()->setBorderStyle(self::_mapBorderStyle((0x00000038 & $borderLines) >> 3)); + + // bit: 8-6; mask: 0x000001C0; right line style + $objStyle->getBorders()->getRight()->setBorderStyle(self::_mapBorderStyle((0x000001C0 & $borderLines) >> 6)); + + // bit: 15-9; mask: 0x0000FE00; top line color index + $objStyle->getBorders()->getTop()->colorIndex = (0x0000FE00 & $borderLines) >> 9; + + // bit: 22-16; mask: 0x007F0000; left line color index + $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & $borderLines) >> 16; + + // bit: 29-23; mask: 0x3F800000; right line color index + $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & $borderLines) >> 23; + } + + // add cellStyleXf or cellXf and update mapping + if ($isCellStyleXf) { + // we only read one style XF record which is always the first + if ($this->_xfIndex == 0) { + $this->_phpExcel->addCellStyleXf($objStyle); + $this->_mapCellStyleXfIndex[$this->_xfIndex] = 0; + } + } else { + // we read all cell XF records + $this->_phpExcel->addCellXf($objStyle); + $this->_mapCellXfIndex[$this->_xfIndex] = count($this->_phpExcel->getCellXfCollection()) - 1; + } + + // update XF index for when we read next record + ++$this->_xfIndex; + } + } + + + /** + * + */ + private function _readXfExt() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; 0x087D = repeated header + + // offset: 2; size: 2 + + // offset: 4; size: 8; not used + + // offset: 12; size: 2; record version + + // offset: 14; size: 2; index to XF record which this record modifies + $ixfe = self::_GetInt2d($recordData, 14); + + // offset: 16; size: 2; not used + + // offset: 18; size: 2; number of extension properties that follow + $cexts = self::_GetInt2d($recordData, 18); + + // start reading the actual extension data + $offset = 20; + while ($offset < $length) { + // extension type + $extType = self::_GetInt2d($recordData, $offset); + + // extension length + $cb = self::_GetInt2d($recordData, $offset + 2); + + // extension data + $extData = substr($recordData, $offset + 4, $cb); + + switch ($extType) { + case 4: // fill start color + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $fill = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getFill(); + $fill->getStartColor()->setRGB($rgb); + unset($fill->startcolorIndex); // normal color index does not apply, discard + } + } + break; + + case 5: // fill end color + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $fill = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getFill(); + $fill->getEndColor()->setRGB($rgb); + unset($fill->endcolorIndex); // normal color index does not apply, discard + } + } + break; + + case 7: // border color top + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $top = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getBorders()->getTop(); + $top->getColor()->setRGB($rgb); + unset($top->colorIndex); // normal color index does not apply, discard + } + } + break; + + case 8: // border color bottom + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $bottom = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getBorders()->getBottom(); + $bottom->getColor()->setRGB($rgb); + unset($bottom->colorIndex); // normal color index does not apply, discard + } + } + break; + + case 9: // border color left + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $left = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getBorders()->getLeft(); + $left->getColor()->setRGB($rgb); + unset($left->colorIndex); // normal color index does not apply, discard + } + } + break; + + case 10: // border color right + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $right = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getBorders()->getRight(); + $right->getColor()->setRGB($rgb); + unset($right->colorIndex); // normal color index does not apply, discard + } + } + break; + + case 11: // border color diagonal + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $diagonal = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getBorders()->getDiagonal(); + $diagonal->getColor()->setRGB($rgb); + unset($diagonal->colorIndex); // normal color index does not apply, discard + } + } + break; + + case 13: // font color + $xclfType = self::_GetInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if ( isset($this->_mapCellXfIndex[$ixfe]) ) { + $font = $this->_phpExcel->getCellXfByIndex($this->_mapCellXfIndex[$ixfe])->getFont(); + $font->getColor()->setRGB($rgb); + unset($font->colorIndex); // normal color index does not apply, discard + } + } + break; + } + + $offset += $cb; + } + } + + } + + + /** + * Read STYLE record + */ + private function _readStyle() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; index to XF record and flag for built-in style + $ixfe = self::_GetInt2d($recordData, 0); + + // bit: 11-0; mask 0x0FFF; index to XF record + $xfIndex = (0x0FFF & $ixfe) >> 0; + + // bit: 15; mask 0x8000; 0 = user-defined style, 1 = built-in style + $isBuiltIn = (bool) ((0x8000 & $ixfe) >> 15); + + if ($isBuiltIn) { + // offset: 2; size: 1; identifier for built-in style + $builtInId = ord($recordData{2}); + + switch ($builtInId) { + case 0x00: + // currently, we are not using this for anything + break; + + default: + break; + } + + } else { + // user-defined; not supported by PHPExcel + } + } + } + + + /** + * Read PALETTE record + */ + private function _readPalette() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; number of following colors + $nm = self::_GetInt2d($recordData, 0); + + // list of RGB colors + for ($i = 0; $i < $nm; ++$i) { + $rgb = substr($recordData, 2 + 4 * $i, 4); + $this->_palette[] = self::_readRGB($rgb); + } + } + } + + + /** + * SHEET + * + * This record is located in the Workbook Globals + * Substream and represents a sheet inside the workbook. + * One SHEET record is written for each sheet. It stores the + * sheet name and a stream offset to the BOF record of the + * respective Sheet Substream within the Workbook Stream. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readSheet() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 4; absolute stream position of the BOF record of the sheet + $rec_offset = self::_GetInt4d($recordData, 0); + + // offset: 4; size: 1; sheet state + switch (ord($recordData{4})) { + case 0x00: $sheetState = PHPExcel_Worksheet::SHEETSTATE_VISIBLE; break; + case 0x01: $sheetState = PHPExcel_Worksheet::SHEETSTATE_HIDDEN; break; + case 0x02: $sheetState = PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN; break; + default: $sheetState = PHPExcel_Worksheet::SHEETSTATE_VISIBLE; break; + } + + // offset: 5; size: 1; sheet type + $sheetType = ord($recordData{5}); + + // offset: 6; size: var; sheet name + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringShort(substr($recordData, 6)); + $rec_name = $string['value']; + } elseif ($this->_version == self::XLS_BIFF7) { + $string = $this->_readByteStringShort(substr($recordData, 6)); + $rec_name = $string['value']; + } + + $this->_sheets[] = array( + 'name' => $rec_name, + 'offset' => $rec_offset, + 'sheetState' => $sheetState, + 'sheetType' => $sheetType, + ); + } + + + /** + * Read EXTERNALBOOK record + */ + private function _readExternalBook() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset within record data + $offset = 0; + + // there are 4 types of records + if (strlen($recordData) > 4) { + // external reference + // offset: 0; size: 2; number of sheet names ($nm) + $nm = self::_GetInt2d($recordData, 0); + $offset += 2; + + // offset: 2; size: var; encoded URL without sheet name (Unicode string, 16-bit length) + $encodedUrlString = self::_readUnicodeStringLong(substr($recordData, 2)); + $offset += $encodedUrlString['size']; + + // offset: var; size: var; list of $nm sheet names (Unicode strings, 16-bit length) + $externalSheetNames = array(); + for ($i = 0; $i < $nm; ++$i) { + $externalSheetNameString = self::_readUnicodeStringLong(substr($recordData, $offset)); + $externalSheetNames[] = $externalSheetNameString['value']; + $offset += $externalSheetNameString['size']; + } + + // store the record data + $this->_externalBooks[] = array( + 'type' => 'external', + 'encodedUrl' => $encodedUrlString['value'], + 'externalSheetNames' => $externalSheetNames, + ); + + } elseif (substr($recordData, 2, 2) == pack('CC', 0x01, 0x04)) { + // internal reference + // offset: 0; size: 2; number of sheet in this document + // offset: 2; size: 2; 0x01 0x04 + $this->_externalBooks[] = array( + 'type' => 'internal', + ); + } elseif (substr($recordData, 0, 4) == pack('vCC', 0x0001, 0x01, 0x3A)) { + // add-in function + // offset: 0; size: 2; 0x0001 + $this->_externalBooks[] = array( + 'type' => 'addInFunction', + ); + } elseif (substr($recordData, 0, 2) == pack('v', 0x0000)) { + // DDE links, OLE links + // offset: 0; size: 2; 0x0000 + // offset: 2; size: var; encoded source document name + $this->_externalBooks[] = array( + 'type' => 'DDEorOLE', + ); + } + } + + + /** + * Read EXTERNNAME record. + */ + private function _readExternName() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // external sheet references provided for named cells + if ($this->_version == self::XLS_BIFF8) { + // offset: 0; size: 2; options + $options = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; + + // offset: 4; size: 2; not used + + // offset: 6; size: var + $nameString = self::_readUnicodeStringShort(substr($recordData, 6)); + + // offset: var; size: var; formula data + $offset = 6 + $nameString['size']; + $formula = $this->_getFormulaFromStructure(substr($recordData, $offset)); + + $this->_externalNames[] = array( + 'name' => $nameString['value'], + 'formula' => $formula, + ); + } + } + + + /** + * Read EXTERNSHEET record + */ + private function _readExternSheet() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // external sheet references provided for named cells + if ($this->_version == self::XLS_BIFF8) { + // offset: 0; size: 2; number of following ref structures + $nm = self::_GetInt2d($recordData, 0); + for ($i = 0; $i < $nm; ++$i) { + $this->_ref[] = array( + // offset: 2 + 6 * $i; index to EXTERNALBOOK record + 'externalBookIndex' => self::_GetInt2d($recordData, 2 + 6 * $i), + // offset: 4 + 6 * $i; index to first sheet in EXTERNALBOOK record + 'firstSheetIndex' => self::_GetInt2d($recordData, 4 + 6 * $i), + // offset: 6 + 6 * $i; index to last sheet in EXTERNALBOOK record + 'lastSheetIndex' => self::_GetInt2d($recordData, 6 + 6 * $i), + ); + } + } + } + + + /** + * DEFINEDNAME + * + * This record is part of a Link Table. It contains the name + * and the token array of an internal defined name. Token + * arrays of defined names contain tokens with aberrant + * token classes. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readDefinedName() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_version == self::XLS_BIFF8) { + // retrieves named cells + + // offset: 0; size: 2; option flags + $opts = self::_GetInt2d($recordData, 0); + + // bit: 5; mask: 0x0020; 0 = user-defined name, 1 = built-in-name + $isBuiltInName = (0x0020 & $opts) >> 5; + + // offset: 2; size: 1; keyboard shortcut + + // offset: 3; size: 1; length of the name (character count) + $nlen = ord($recordData{3}); + + // offset: 4; size: 2; size of the formula data (it can happen that this is zero) + // note: there can also be additional data, this is not included in $flen + $flen = self::_GetInt2d($recordData, 4); + + // offset: 8; size: 2; 0=Global name, otherwise index to sheet (1-based) + $scope = self::_GetInt2d($recordData, 8); + + // offset: 14; size: var; Name (Unicode string without length field) + $string = self::_readUnicodeString(substr($recordData, 14), $nlen); + + // offset: var; size: $flen; formula data + $offset = 14 + $string['size']; + $formulaStructure = pack('v', $flen) . substr($recordData, $offset); + + try { + $formula = $this->_getFormulaFromStructure($formulaStructure); + } catch (Exception $e) { + $formula = ''; + } + + $this->_definedname[] = array( + 'isBuiltInName' => $isBuiltInName, + 'name' => $string['value'], + 'formula' => $formula, + 'scope' => $scope, + ); + } + } + + + /** + * Read MSODRAWINGGROUP record + */ + private function _readMsoDrawingGroup() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + + // get spliced record data + $splicedRecordData = $this->_getSplicedRecordData(); + $recordData = $splicedRecordData['recordData']; + + $this->_drawingGroupData .= $recordData; + } + + + /** + * SST - Shared String Table + * + * This record contains a list of all strings used anywhere + * in the workbook. Each string occurs only once. The + * workbook uses indexes into the list to reference the + * strings. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + **/ + private function _readSst() + { + // offset within (spliced) record data + $pos = 0; + + // get spliced record data + $splicedRecordData = $this->_getSplicedRecordData(); + + $recordData = $splicedRecordData['recordData']; + $spliceOffsets = $splicedRecordData['spliceOffsets']; + + // offset: 0; size: 4; total number of strings in the workbook + $pos += 4; + + // offset: 4; size: 4; number of following strings ($nm) + $nm = self::_GetInt4d($recordData, 4); + $pos += 4; + + // loop through the Unicode strings (16-bit length) + for ($i = 0; $i < $nm; ++$i) { + + // number of characters in the Unicode string + $numChars = self::_GetInt2d($recordData, $pos); + $pos += 2; + + // option flags + $optionFlags = ord($recordData{$pos}); + ++$pos; + + // bit: 0; mask: 0x01; 0 = compressed; 1 = uncompressed + $isCompressed = (($optionFlags & 0x01) == 0) ; + + // bit: 2; mask: 0x02; 0 = ordinary; 1 = Asian phonetic + $hasAsian = (($optionFlags & 0x04) != 0); + + // bit: 3; mask: 0x03; 0 = ordinary; 1 = Rich-Text + $hasRichText = (($optionFlags & 0x08) != 0); + + if ($hasRichText) { + // number of Rich-Text formatting runs + $formattingRuns = self::_GetInt2d($recordData, $pos); + $pos += 2; + } + + if ($hasAsian) { + // size of Asian phonetic setting + $extendedRunLength = self::_GetInt4d($recordData, $pos); + $pos += 4; + } + + // expected byte length of character array if not split + $len = ($isCompressed) ? $numChars : $numChars * 2; + + // look up limit position + foreach ($spliceOffsets as $spliceOffset) { + // it can happen that the string is empty, therefore we need + // <= and not just < + if ($pos <= $spliceOffset) { + $limitpos = $spliceOffset; + break; + } + } + + if ($pos + $len <= $limitpos) { + // character array is not split between records + + $retstr = substr($recordData, $pos, $len); + $pos += $len; + + } else { + // character array is split between records + + // first part of character array + $retstr = substr($recordData, $pos, $limitpos - $pos); + + $bytesRead = $limitpos - $pos; + + // remaining characters in Unicode string + $charsLeft = $numChars - (($isCompressed) ? $bytesRead : ($bytesRead / 2)); + + $pos = $limitpos; + + // keep reading the characters + while ($charsLeft > 0) { + + // look up next limit position, in case the string span more than one continue record + foreach ($spliceOffsets as $spliceOffset) { + if ($pos < $spliceOffset) { + $limitpos = $spliceOffset; + break; + } + } + + // repeated option flags + // OpenOffice.org documentation 5.21 + $option = ord($recordData{$pos}); + ++$pos; + + if ($isCompressed && ($option == 0)) { + // 1st fragment compressed + // this fragment compressed + $len = min($charsLeft, $limitpos - $pos); + $retstr .= substr($recordData, $pos, $len); + $charsLeft -= $len; + $isCompressed = true; + + } elseif (!$isCompressed && ($option != 0)) { + // 1st fragment uncompressed + // this fragment uncompressed + $len = min($charsLeft * 2, $limitpos - $pos); + $retstr .= substr($recordData, $pos, $len); + $charsLeft -= $len / 2; + $isCompressed = false; + + } elseif (!$isCompressed && ($option == 0)) { + // 1st fragment uncompressed + // this fragment compressed + $len = min($charsLeft, $limitpos - $pos); + for ($j = 0; $j < $len; ++$j) { + $retstr .= $recordData{$pos + $j} . chr(0); + } + $charsLeft -= $len; + $isCompressed = false; + + } else { + // 1st fragment compressed + // this fragment uncompressed + $newstr = ''; + for ($j = 0; $j < strlen($retstr); ++$j) { + $newstr .= $retstr[$j] . chr(0); + } + $retstr = $newstr; + $len = min($charsLeft * 2, $limitpos - $pos); + $retstr .= substr($recordData, $pos, $len); + $charsLeft -= $len / 2; + $isCompressed = false; + } + + $pos += $len; + } + } + + // convert to UTF-8 + $retstr = self::_encodeUTF16($retstr, $isCompressed); + + // read additional Rich-Text information, if any + $fmtRuns = array(); + if ($hasRichText) { + // list of formatting runs + for ($j = 0; $j < $formattingRuns; ++$j) { + // first formatted character; zero-based + $charPos = self::_GetInt2d($recordData, $pos + $j * 4); + + // index to font record + $fontIndex = self::_GetInt2d($recordData, $pos + 2 + $j * 4); + + $fmtRuns[] = array( + 'charPos' => $charPos, + 'fontIndex' => $fontIndex, + ); + } + $pos += 4 * $formattingRuns; + } + + // read additional Asian phonetics information, if any + if ($hasAsian) { + // For Asian phonetic settings, we skip the extended string data + $pos += $extendedRunLength; + } + + // store the shared sting + $this->_sst[] = array( + 'value' => $retstr, + 'fmtRuns' => $fmtRuns, + ); + } + + // _getSplicedRecordData() takes care of moving current position in data stream + } + + + /** + * Read PRINTGRIDLINES record + */ + private function _readPrintGridlines() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_version == self::XLS_BIFF8 && !$this->_readDataOnly) { + // offset: 0; size: 2; 0 = do not print sheet grid lines; 1 = print sheet gridlines + $printGridlines = (bool) self::_GetInt2d($recordData, 0); + $this->_phpSheet->setPrintGridlines($printGridlines); + } + } + + + /** + * Read DEFAULTROWHEIGHT record + */ + private function _readDefaultRowHeight() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; option flags + // offset: 2; size: 2; default height for unused rows, (twips 1/20 point) + $height = self::_GetInt2d($recordData, 2); + $this->_phpSheet->getDefaultRowDimension()->setRowHeight($height / 20); + } + + + /** + * Read SHEETPR record + */ + private function _readSheetPr() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2 + + // bit: 6; mask: 0x0040; 0 = outline buttons above outline group + $isSummaryBelow = (0x0040 & self::_GetInt2d($recordData, 0)) >> 6; + $this->_phpSheet->setShowSummaryBelow($isSummaryBelow); + + // bit: 7; mask: 0x0080; 0 = outline buttons left of outline group + $isSummaryRight = (0x0080 & self::_GetInt2d($recordData, 0)) >> 7; + $this->_phpSheet->setShowSummaryRight($isSummaryRight); + + // bit: 8; mask: 0x100; 0 = scale printout in percent, 1 = fit printout to number of pages + // this corresponds to radio button setting in page setup dialog in Excel + $this->_isFitToPages = (bool) ((0x0100 & self::_GetInt2d($recordData, 0)) >> 8); + } + + + /** + * Read HORIZONTALPAGEBREAKS record + */ + private function _readHorizontalPageBreaks() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_version == self::XLS_BIFF8 && !$this->_readDataOnly) { + + // offset: 0; size: 2; number of the following row index structures + $nm = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 6 * $nm; list of $nm row index structures + for ($i = 0; $i < $nm; ++$i) { + $r = self::_GetInt2d($recordData, 2 + 6 * $i); + $cf = self::_GetInt2d($recordData, 2 + 6 * $i + 2); + $cl = self::_GetInt2d($recordData, 2 + 6 * $i + 4); + + // not sure why two column indexes are necessary? + $this->_phpSheet->setBreakByColumnAndRow($cf, $r, PHPExcel_Worksheet::BREAK_ROW); + } + } + } + + + /** + * Read VERTICALPAGEBREAKS record + */ + private function _readVerticalPageBreaks() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_version == self::XLS_BIFF8 && !$this->_readDataOnly) { + // offset: 0; size: 2; number of the following column index structures + $nm = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 6 * $nm; list of $nm row index structures + for ($i = 0; $i < $nm; ++$i) { + $c = self::_GetInt2d($recordData, 2 + 6 * $i); + $rf = self::_GetInt2d($recordData, 2 + 6 * $i + 2); + $rl = self::_GetInt2d($recordData, 2 + 6 * $i + 4); + + // not sure why two row indexes are necessary? + $this->_phpSheet->setBreakByColumnAndRow($c, $rf, PHPExcel_Worksheet::BREAK_COLUMN); + } + } + } + + + /** + * Read HEADER record + */ + private function _readHeader() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: var + // realized that $recordData can be empty even when record exists + if ($recordData) { + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringLong($recordData); + } else { + $string = $this->_readByteStringShort($recordData); + } + + $this->_phpSheet->getHeaderFooter()->setOddHeader($string['value']); + $this->_phpSheet->getHeaderFooter()->setEvenHeader($string['value']); + } + } + } + + + /** + * Read FOOTER record + */ + private function _readFooter() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: var + // realized that $recordData can be empty even when record exists + if ($recordData) { + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringLong($recordData); + } else { + $string = $this->_readByteStringShort($recordData); + } + $this->_phpSheet->getHeaderFooter()->setOddFooter($string['value']); + $this->_phpSheet->getHeaderFooter()->setEvenFooter($string['value']); + } + } + } + + + /** + * Read HCENTER record + */ + private function _readHcenter() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; 0 = print sheet left aligned, 1 = print sheet centered horizontally + $isHorizontalCentered = (bool) self::_GetInt2d($recordData, 0); + + $this->_phpSheet->getPageSetup()->setHorizontalCentered($isHorizontalCentered); + } + } + + + /** + * Read VCENTER record + */ + private function _readVcenter() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; 0 = print sheet aligned at top page border, 1 = print sheet vertically centered + $isVerticalCentered = (bool) self::_GetInt2d($recordData, 0); + + $this->_phpSheet->getPageSetup()->setVerticalCentered($isVerticalCentered); + } + } + + + /** + * Read LEFTMARGIN record + */ + private function _readLeftMargin() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 8 + $this->_phpSheet->getPageMargins()->setLeft(self::_extractNumber($recordData)); + } + } + + + /** + * Read RIGHTMARGIN record + */ + private function _readRightMargin() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 8 + $this->_phpSheet->getPageMargins()->setRight(self::_extractNumber($recordData)); + } + } + + + /** + * Read TOPMARGIN record + */ + private function _readTopMargin() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 8 + $this->_phpSheet->getPageMargins()->setTop(self::_extractNumber($recordData)); + } + } + + + /** + * Read BOTTOMMARGIN record + */ + private function _readBottomMargin() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 8 + $this->_phpSheet->getPageMargins()->setBottom(self::_extractNumber($recordData)); + } + } + + + /** + * Read PAGESETUP record + */ + private function _readPageSetup() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; paper size + $paperSize = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; scaling factor + $scale = self::_GetInt2d($recordData, 2); + + // offset: 6; size: 2; fit worksheet width to this number of pages, 0 = use as many as needed + $fitToWidth = self::_GetInt2d($recordData, 6); + + // offset: 8; size: 2; fit worksheet height to this number of pages, 0 = use as many as needed + $fitToHeight = self::_GetInt2d($recordData, 8); + + // offset: 10; size: 2; option flags + + // bit: 1; mask: 0x0002; 0=landscape, 1=portrait + $isPortrait = (0x0002 & self::_GetInt2d($recordData, 10)) >> 1; + + // bit: 2; mask: 0x0004; 1= paper size, scaling factor, paper orient. not init + // when this bit is set, do not use flags for those properties + $isNotInit = (0x0004 & self::_GetInt2d($recordData, 10)) >> 2; + + if (!$isNotInit) { + $this->_phpSheet->getPageSetup()->setPaperSize($paperSize); + switch ($isPortrait) { + case 0: $this->_phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); break; + case 1: $this->_phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT); break; + } + + $this->_phpSheet->getPageSetup()->setScale($scale, false); + $this->_phpSheet->getPageSetup()->setFitToPage((bool) $this->_isFitToPages); + $this->_phpSheet->getPageSetup()->setFitToWidth($fitToWidth, false); + $this->_phpSheet->getPageSetup()->setFitToHeight($fitToHeight, false); + } + + // offset: 16; size: 8; header margin (IEEE 754 floating-point value) + $marginHeader = self::_extractNumber(substr($recordData, 16, 8)); + $this->_phpSheet->getPageMargins()->setHeader($marginHeader); + + // offset: 24; size: 8; footer margin (IEEE 754 floating-point value) + $marginFooter = self::_extractNumber(substr($recordData, 24, 8)); + $this->_phpSheet->getPageMargins()->setFooter($marginFooter); + } + } + + + /** + * PROTECT - Sheet protection (BIFF2 through BIFF8) + * if this record is omitted, then it also means no sheet protection + */ + private function _readProtect() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + // offset: 0; size: 2; + + // bit 0, mask 0x01; 1 = sheet is protected + $bool = (0x01 & self::_GetInt2d($recordData, 0)) >> 0; + $this->_phpSheet->getProtection()->setSheet((bool)$bool); + } + + + /** + * SCENPROTECT + */ + private function _readScenProtect() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + // offset: 0; size: 2; + + // bit: 0, mask 0x01; 1 = scenarios are protected + $bool = (0x01 & self::_GetInt2d($recordData, 0)) >> 0; + + $this->_phpSheet->getProtection()->setScenarios((bool)$bool); + } + + + /** + * OBJECTPROTECT + */ + private function _readObjectProtect() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + // offset: 0; size: 2; + + // bit: 0, mask 0x01; 1 = objects are protected + $bool = (0x01 & self::_GetInt2d($recordData, 0)) >> 0; + + $this->_phpSheet->getProtection()->setObjects((bool)$bool); + } + + + /** + * PASSWORD - Sheet protection (hashed) password (BIFF2 through BIFF8) + */ + private function _readPassword() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; 16-bit hash value of password + $password = strtoupper(dechex(self::_GetInt2d($recordData, 0))); // the hashed password + $this->_phpSheet->getProtection()->setPassword($password, true); + } + } + + + /** + * Read DEFCOLWIDTH record + */ + private function _readDefColWidth() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; default column width + $width = self::_GetInt2d($recordData, 0); + if ($width != 8) { + $this->_phpSheet->getDefaultColumnDimension()->setWidth($width); + } + } + + + /** + * Read COLINFO record + */ + private function _readColInfo() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; index to first column in range + $fc = self::_GetInt2d($recordData, 0); // first column index + + // offset: 2; size: 2; index to last column in range + $lc = self::_GetInt2d($recordData, 2); // first column index + + // offset: 4; size: 2; width of the column in 1/256 of the width of the zero character + $width = self::_GetInt2d($recordData, 4); + + // offset: 6; size: 2; index to XF record for default column formatting + $xfIndex = self::_GetInt2d($recordData, 6); + + // offset: 8; size: 2; option flags + + // bit: 0; mask: 0x0001; 1= columns are hidden + $isHidden = (0x0001 & self::_GetInt2d($recordData, 8)) >> 0; + + // bit: 10-8; mask: 0x0700; outline level of the columns (0 = no outline) + $level = (0x0700 & self::_GetInt2d($recordData, 8)) >> 8; + + // bit: 12; mask: 0x1000; 1 = collapsed + $isCollapsed = (0x1000 & self::_GetInt2d($recordData, 8)) >> 12; + + // offset: 10; size: 2; not used + + for ($i = $fc; $i <= $lc; ++$i) { + if ($lc == 255 || $lc == 256) { + $this->_phpSheet->getDefaultColumnDimension()->setWidth($width / 256); + break; + } + $this->_phpSheet->getColumnDimensionByColumn($i)->setWidth($width / 256); + $this->_phpSheet->getColumnDimensionByColumn($i)->setVisible(!$isHidden); + $this->_phpSheet->getColumnDimensionByColumn($i)->setOutlineLevel($level); + $this->_phpSheet->getColumnDimensionByColumn($i)->setCollapsed($isCollapsed); + $this->_phpSheet->getColumnDimensionByColumn($i)->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * ROW + * + * This record contains the properties of a single row in a + * sheet. Rows and cells in a sheet are divided into blocks + * of 32 rows. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readRow() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; index of this row + $r = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; index to column of the first cell which is described by a cell record + + // offset: 4; size: 2; index to column of the last cell which is described by a cell record, increased by 1 + + // offset: 6; size: 2; + + // bit: 14-0; mask: 0x7FFF; height of the row, in twips = 1/20 of a point + $height = (0x7FFF & self::_GetInt2d($recordData, 6)) >> 0; + + // bit: 15: mask: 0x8000; 0 = row has custom height; 1= row has default height + $useDefaultHeight = (0x8000 & self::_GetInt2d($recordData, 6)) >> 15; + + if (!$useDefaultHeight) { + $this->_phpSheet->getRowDimension($r + 1)->setRowHeight($height / 20); + } + + // offset: 8; size: 2; not used + + // offset: 10; size: 2; not used in BIFF5-BIFF8 + + // offset: 12; size: 4; option flags and default row formatting + + // bit: 2-0: mask: 0x00000007; outline level of the row + $level = (0x00000007 & self::_GetInt4d($recordData, 12)) >> 0; + $this->_phpSheet->getRowDimension($r + 1)->setOutlineLevel($level); + + // bit: 4; mask: 0x00000010; 1 = outline group start or ends here... and is collapsed + $isCollapsed = (0x00000010 & self::_GetInt4d($recordData, 12)) >> 4; + $this->_phpSheet->getRowDimension($r + 1)->setCollapsed($isCollapsed); + + // bit: 5; mask: 0x00000020; 1 = row is hidden + $isHidden = (0x00000020 & self::_GetInt4d($recordData, 12)) >> 5; + $this->_phpSheet->getRowDimension($r + 1)->setVisible(!$isHidden); + + // bit: 7; mask: 0x00000080; 1 = row has explicit format + $hasExplicitFormat = (0x00000080 & self::_GetInt4d($recordData, 12)) >> 7; + + // bit: 27-16; mask: 0x0FFF0000; only applies when hasExplicitFormat = 1; index to XF record + $xfIndex = (0x0FFF0000 & self::_GetInt4d($recordData, 12)) >> 16; + + if ($hasExplicitFormat) { + $this->_phpSheet->getRowDimension($r + 1)->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read RK record + * This record represents a cell that contains an RK value + * (encoded integer or floating-point value). If a + * floating-point value cannot be encoded to an RK value, + * a NUMBER record will be written. This record replaces the + * record INTEGER written in BIFF2. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readRk() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; index to column + $column = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + // offset: 4; size: 2; index to XF record + $xfIndex = self::_GetInt2d($recordData, 4); + + // offset: 6; size: 4; RK value + $rknum = self::_GetInt4d($recordData, 6); + $numValue = self::_GetIEEE754($rknum); + + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + if (!$this->_readDataOnly) { + // add style information + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + + // add cell + $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC); + } + } + + + /** + * Read LABELSST record + * This record represents a cell that contains a string. It + * replaces the LABEL record and RSTRING record used in + * BIFF2-BIFF5. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readLabelSst() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; index to column + $column = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + // offset: 4; size: 2; index to XF record + $xfIndex = self::_GetInt2d($recordData, 4); + + // offset: 6; size: 4; index to SST record + $index = self::_GetInt4d($recordData, 6); + + // add cell + if (($fmtRuns = $this->_sst[$index]['fmtRuns']) && !$this->_readDataOnly) { + // then we should treat as rich text + $richText = new PHPExcel_RichText(); + $charPos = 0; + $sstCount = count($this->_sst[$index]['fmtRuns']); + for ($i = 0; $i <= $sstCount; ++$i) { + if (isset($fmtRuns[$i])) { + $text = PHPExcel_Shared_String::Substring($this->_sst[$index]['value'], $charPos, $fmtRuns[$i]['charPos'] - $charPos); + $charPos = $fmtRuns[$i]['charPos']; + } else { + $text = PHPExcel_Shared_String::Substring($this->_sst[$index]['value'], $charPos, PHPExcel_Shared_String::CountCharacters($this->_sst[$index]['value'])); + } + + if (PHPExcel_Shared_String::CountCharacters($text) > 0) { + if ($i == 0) { // first text run, no style + $richText->createText($text); + } else { + $textRun = $richText->createTextRun($text); + if (isset($fmtRuns[$i - 1])) { + if ($fmtRuns[$i - 1]['fontIndex'] < 4) { + $fontIndex = $fmtRuns[$i - 1]['fontIndex']; + } else { + // this has to do with that index 4 is omitted in all BIFF versions for some strange reason + // check the OpenOffice documentation of the FONT record + $fontIndex = $fmtRuns[$i - 1]['fontIndex'] - 1; + } + $textRun->setFont(clone $this->_objFonts[$fontIndex]); + } + } + } + } + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + $cell->setValueExplicit($richText, PHPExcel_Cell_DataType::TYPE_STRING); + } else { + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + $cell->setValueExplicit($this->_sst[$index]['value'], PHPExcel_Cell_DataType::TYPE_STRING); + } + + if (!$this->_readDataOnly) { + // add style information + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read MULRK record + * This record represents a cell range containing RK value + * cells. All cells are located in the same row. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readMulRk() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; index to first column + $colFirst = self::_GetInt2d($recordData, 2); + + // offset: var; size: 2; index to last column + $colLast = self::_GetInt2d($recordData, $length - 2); + $columns = $colLast - $colFirst + 1; + + // offset within record data + $offset = 4; + + for ($i = 0; $i < $columns; ++$i) { + $columnString = PHPExcel_Cell::stringFromColumnIndex($colFirst + $i); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + + // offset: var; size: 2; index to XF record + $xfIndex = self::_GetInt2d($recordData, $offset); + + // offset: var; size: 4; RK value + $numValue = self::_GetIEEE754(self::_GetInt4d($recordData, $offset + 2)); + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + if (!$this->_readDataOnly) { + // add style + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + + // add cell value + $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC); + } + + $offset += 6; + } + } + + + /** + * Read NUMBER record + * This record represents a cell that contains a + * floating-point value. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readNumber() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size 2; index to column + $column = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + // offset 4; size: 2; index to XF record + $xfIndex = self::_GetInt2d($recordData, 4); + + $numValue = self::_extractNumber(substr($recordData, 6, 8)); + + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + if (!$this->_readDataOnly) { + // add cell style + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + + // add cell value + $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC); + } + } + + + /** + * Read FORMULA record + perhaps a following STRING record if formula result is a string + * This record contains the token array and the result of a + * formula cell. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readFormula() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; row index + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; col index + $column = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // offset: 20: size: variable; formula structure + $formulaStructure = substr($recordData, 20); + + // offset: 14: size: 2; option flags, recalculate always, recalculate on open etc. + $options = self::_GetInt2d($recordData, 14); + + // bit: 0; mask: 0x0001; 1 = recalculate always + // bit: 1; mask: 0x0002; 1 = calculate on open + // bit: 2; mask: 0x0008; 1 = part of a shared formula + $isPartOfSharedFormula = (bool) (0x0008 & $options); + + // WARNING: + // We can apparently not rely on $isPartOfSharedFormula. Even when $isPartOfSharedFormula = true + // the formula data may be ordinary formula data, therefore we need to check + // explicitly for the tExp token (0x01) + $isPartOfSharedFormula = $isPartOfSharedFormula && ord($formulaStructure{2}) == 0x01; + + if ($isPartOfSharedFormula) { + // part of shared formula which means there will be a formula with a tExp token and nothing else + // get the base cell, grab tExp token + $baseRow = self::_GetInt2d($formulaStructure, 3); + $baseCol = self::_GetInt2d($formulaStructure, 5); + $this->_baseCell = PHPExcel_Cell::stringFromColumnIndex($baseCol). ($baseRow + 1); + } + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + + if ($isPartOfSharedFormula) { + // formula is added to this cell after the sheet has been read + $this->_sharedFormulaParts[$columnString . ($row + 1)] = $this->_baseCell; + } + + // offset: 16: size: 4; not used + + // offset: 4; size: 2; XF index + $xfIndex = self::_GetInt2d($recordData, 4); + + // offset: 6; size: 8; result of the formula + if ( (ord($recordData{6}) == 0) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255) ) { + + // String formula. Result follows in appended STRING record + $dataType = PHPExcel_Cell_DataType::TYPE_STRING; + + // read possible SHAREDFMLA record + $code = self::_GetInt2d($this->_data, $this->_pos); + if ($code == self::XLS_Type_SHAREDFMLA) { + $this->_readSharedFmla(); + } + + // read STRING record + $value = $this->_readString(); + + } elseif ((ord($recordData{6}) == 1) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255)) { + + // Boolean formula. Result is in +2; 0=false, 1=true + $dataType = PHPExcel_Cell_DataType::TYPE_BOOL; + $value = (bool) ord($recordData{8}); + + } elseif ((ord($recordData{6}) == 2) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255)) { + + // Error formula. Error code is in +2 + $dataType = PHPExcel_Cell_DataType::TYPE_ERROR; + $value = self::_mapErrorCode(ord($recordData{8})); + + } elseif ((ord($recordData{6}) == 3) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255)) { + + // Formula result is a null string + $dataType = PHPExcel_Cell_DataType::TYPE_NULL; + $value = ''; + + } else { + + // forumla result is a number, first 14 bytes like _NUMBER record + $dataType = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $value = self::_extractNumber(substr($recordData, 6, 8)); + + } + + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + if (!$this->_readDataOnly) { + // add cell style + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + + // store the formula + if (!$isPartOfSharedFormula) { + // not part of shared formula + // add cell value. If we can read formula, populate with formula, otherwise just used cached value + try { + if ($this->_version != self::XLS_BIFF8) { + throw new Exception('Not BIFF8. Can only read BIFF8 formulas'); + } + $formula = $this->_getFormulaFromStructure($formulaStructure); // get formula in human language + $cell->setValueExplicit('=' . $formula, PHPExcel_Cell_DataType::TYPE_FORMULA); + + } catch (Exception $e) { + $cell->setValueExplicit($value, $dataType); + } + } else { + if ($this->_version == self::XLS_BIFF8) { + // do nothing at this point, formula id added later in the code + } else { + $cell->setValueExplicit($value, $dataType); + } + } + + // store the cached calculated value + $cell->setCalculatedValue($value); + } + } + + + /** + * Read a SHAREDFMLA record. This function just stores the binary shared formula in the reader, + * which usually contains relative references. + * These will be used to construct the formula in each shared formula part after the sheet is read. + */ + private function _readSharedFmla() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0, size: 6; cell range address of the area used by the shared formula, not used for anything + $cellRange = substr($recordData, 0, 6); + $cellRange = $this->_readBIFF5CellRangeAddressFixed($cellRange); // note: even BIFF8 uses BIFF5 syntax + + // offset: 6, size: 1; not used + + // offset: 7, size: 1; number of existing FORMULA records for this shared formula + $no = ord($recordData{7}); + + // offset: 8, size: var; Binary token array of the shared formula + $formula = substr($recordData, 8); + + // at this point we only store the shared formula for later use + $this->_sharedFormulas[$this->_baseCell] = $formula; + + } + + + /** + * Read a STRING record from current stream position and advance the stream pointer to next record + * This record is used for storing result from FORMULA record when it is a string, and + * it occurs directly after the FORMULA record + * + * @return string The string contents as UTF-8 + */ + private function _readString() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringLong($recordData); + $value = $string['value']; + } else { + $string = $this->_readByteStringLong($recordData); + $value = $string['value']; + } + + return $value; + } + + + /** + * Read BOOLERR record + * This record represents a Boolean value or error value + * cell. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readBoolErr() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; row index + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; column index + $column = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + // offset: 4; size: 2; index to XF record + $xfIndex = self::_GetInt2d($recordData, 4); + + // offset: 6; size: 1; the boolean value or error value + $boolErr = ord($recordData{6}); + + // offset: 7; size: 1; 0=boolean; 1=error + $isError = ord($recordData{7}); + + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + switch ($isError) { + case 0: // boolean + $value = (bool) $boolErr; + + // add cell value + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_BOOL); + break; + + case 1: // error type + $value = self::_mapErrorCode($boolErr); + + // add cell value + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_ERROR); + break; + } + + if (!$this->_readDataOnly) { + // add cell style + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read MULBLANK record + * This record represents a cell range of empty cells. All + * cells are located in the same row + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readMulBlank() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; index to first column + $fc = self::_GetInt2d($recordData, 2); + + // offset: 4; size: 2 x nc; list of indexes to XF records + // add style information + if (!$this->_readDataOnly) { + for ($i = 0; $i < $length / 2 - 3; ++$i) { + $columnString = PHPExcel_Cell::stringFromColumnIndex($fc + $i); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + $xfIndex = self::_GetInt2d($recordData, 4 + 2 * $i); + $this->_phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + } + + // offset: 6; size 2; index to last column (not needed) + } + + + /** + * Read LABEL record + * This record represents a cell that contains a string. In + * BIFF8 it is usually replaced by the LABELSST record. + * Excel still uses this record, if it copies unformatted + * text cells to the clipboard. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readLabel() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; index to column + $column = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + // offset: 4; size: 2; XF index + $xfIndex = self::_GetInt2d($recordData, 4); + + // add cell value + // todo: what if string is very long? continue record + if ($this->_version == self::XLS_BIFF8) { + $string = self::_readUnicodeStringLong(substr($recordData, 6)); + $value = $string['value']; + } else { + $string = $this->_readByteStringLong(substr($recordData, 6)); + $value = $string['value']; + } + $cell = $this->_phpSheet->getCell($columnString . ($row + 1)); + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); + + if (!$this->_readDataOnly) { + // add cell style + $cell->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read BLANK record + */ + private function _readBlank() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; row index + $row = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; col index + $col = self::_GetInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($col); + + // Read cell? + if (($this->getReadFilter() !== NULL) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->_phpSheet->getTitle()) ) { + // offset: 4; size: 2; XF index + $xfIndex = self::_GetInt2d($recordData, 4); + + // add style information + if (!$this->_readDataOnly) { + $this->_phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->_mapCellXfIndex[$xfIndex]); + } + } + + } + + + /** + * Read MSODRAWING record + */ + private function _readMsoDrawing() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + + // get spliced record data + $splicedRecordData = $this->_getSplicedRecordData(); + $recordData = $splicedRecordData['recordData']; + + $this->_drawingData .= $recordData; + } + + + /** + * Read OBJ record + */ + private function _readObj() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly || $this->_version != self::XLS_BIFF8) { + return; + } + + // recordData consists of an array of subrecords looking like this: + // ft: 2 bytes; ftCmo type (0x15) + // cb: 2 bytes; size in bytes of ftCmo data + // ot: 2 bytes; Object Type + // id: 2 bytes; Object id number + // grbit: 2 bytes; Option Flags + // data: var; subrecord data + + // for now, we are just interested in the second subrecord containing the object type + $ftCmoType = self::_GetInt2d($recordData, 0); + $cbCmoSize = self::_GetInt2d($recordData, 2); + $otObjType = self::_GetInt2d($recordData, 4); + $idObjID = self::_GetInt2d($recordData, 6); + $grbitOpts = self::_GetInt2d($recordData, 6); + + $this->_objs[] = array( + 'ftCmoType' => $ftCmoType, + 'cbCmoSize' => $cbCmoSize, + 'otObjType' => $otObjType, + 'idObjID' => $idObjID, + 'grbitOpts' => $grbitOpts + ); + $this->textObjRef = $idObjID; + +// echo '_readObj()
        '; +// var_dump(end($this->_objs)); +// echo '
        '; + } + + + /** + * Read WINDOW2 record + */ + private function _readWindow2() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; option flags + $options = self::_GetInt2d($recordData, 0); + + // bit: 1; mask: 0x0002; 0 = do not show gridlines, 1 = show gridlines + $showGridlines = (bool) ((0x0002 & $options) >> 1); + $this->_phpSheet->setShowGridlines($showGridlines); + + // bit: 2; mask: 0x0004; 0 = do not show headers, 1 = show headers + $showRowColHeaders = (bool) ((0x0004 & $options) >> 2); + $this->_phpSheet->setShowRowColHeaders($showRowColHeaders); + + // bit: 3; mask: 0x0008; 0 = panes are not frozen, 1 = panes are frozen + $this->_frozen = (bool) ((0x0008 & $options) >> 3); + + // bit: 6; mask: 0x0040; 0 = columns from left to right, 1 = columns from right to left + $this->_phpSheet->setRightToLeft((bool)((0x0040 & $options) >> 6)); + + // bit: 10; mask: 0x0400; 0 = sheet not active, 1 = sheet active + $isActive = (bool) ((0x0400 & $options) >> 10); + if ($isActive) { + $this->_phpExcel->setActiveSheetIndex($this->_phpExcel->getIndex($this->_phpSheet)); + } + } + + + /** + * Read SCL record + */ + private function _readScl() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // offset: 0; size: 2; numerator of the view magnification + $numerator = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; numerator of the view magnification + $denumerator = self::_GetInt2d($recordData, 2); + + // set the zoom scale (in percent) + $this->_phpSheet->getSheetView()->setZoomScale($numerator * 100 / $denumerator); + } + + + /** + * Read PANE record + */ + private function _readPane() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; position of vertical split + $px = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; position of horizontal split + $py = self::_GetInt2d($recordData, 2); + + if ($this->_frozen) { + // frozen panes + $this->_phpSheet->freezePane(PHPExcel_Cell::stringFromColumnIndex($px) . ($py + 1)); + } else { + // unfrozen panes; split windows; not supported by PHPExcel core + } + } + } + + + /** + * Read SELECTION record. There is one such record for each pane in the sheet. + */ + private function _readSelection() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 1; pane identifier + $paneId = ord($recordData{0}); + + // offset: 1; size: 2; index to row of the active cell + $r = self::_GetInt2d($recordData, 1); + + // offset: 3; size: 2; index to column of the active cell + $c = self::_GetInt2d($recordData, 3); + + // offset: 5; size: 2; index into the following cell range list to the + // entry that contains the active cell + $index = self::_GetInt2d($recordData, 5); + + // offset: 7; size: var; cell range address list containing all selected cell ranges + $data = substr($recordData, 7); + $cellRangeAddressList = $this->_readBIFF5CellRangeAddressList($data); // note: also BIFF8 uses BIFF5 syntax + + $selectedCells = $cellRangeAddressList['cellRangeAddresses'][0]; + + // first row '1' + last row '16384' indicates that full column is selected (apparently also in BIFF8!) + if (preg_match('/^([A-Z]+1\:[A-Z]+)16384$/', $selectedCells)) { + $selectedCells = preg_replace('/^([A-Z]+1\:[A-Z]+)16384$/', '${1}1048576', $selectedCells); + } + + // first row '1' + last row '65536' indicates that full column is selected + if (preg_match('/^([A-Z]+1\:[A-Z]+)65536$/', $selectedCells)) { + $selectedCells = preg_replace('/^([A-Z]+1\:[A-Z]+)65536$/', '${1}1048576', $selectedCells); + } + + // first column 'A' + last column 'IV' indicates that full row is selected + if (preg_match('/^(A[0-9]+\:)IV([0-9]+)$/', $selectedCells)) { + $selectedCells = preg_replace('/^(A[0-9]+\:)IV([0-9]+)$/', '${1}XFD${2}', $selectedCells); + } + + $this->_phpSheet->setSelectedCells($selectedCells); + } + } + + + private function _includeCellRangeFiltered($cellRangeAddress) + { + $includeCellRange = true; + if ($this->getReadFilter() !== NULL) { + $includeCellRange = false; + $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($cellRangeAddress); + $rangeBoundaries[1][0]++; + for ($row = $rangeBoundaries[0][1]; $row <= $rangeBoundaries[1][1]; $row++) { + for ($column = $rangeBoundaries[0][0]; $column != $rangeBoundaries[1][0]; $column++) { + if ($this->getReadFilter()->readCell($column, $row, $this->_phpSheet->getTitle())) { + $includeCellRange = true; + break 2; + } + } + } + } + return $includeCellRange; + } + + + /** + * MERGEDCELLS + * + * This record contains the addresses of merged cell ranges + * in the current sheet. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function _readMergedCells() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_version == self::XLS_BIFF8 && !$this->_readDataOnly) { + $cellRangeAddressList = $this->_readBIFF8CellRangeAddressList($recordData); + foreach ($cellRangeAddressList['cellRangeAddresses'] as $cellRangeAddress) { + if ((strpos($cellRangeAddress,':') !== FALSE) && + ($this->_includeCellRangeFiltered($cellRangeAddress))) { + $this->_phpSheet->mergeCells($cellRangeAddress); + } + } + } + } + + + /** + * Read HYPERLINK record + */ + private function _readHyperLink() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer forward to next record + $this->_pos += 4 + $length; + + if (!$this->_readDataOnly) { + // offset: 0; size: 8; cell range address of all cells containing this hyperlink + try { + $cellRange = $this->_readBIFF8CellRangeAddressFixed($recordData, 0, 8); + } catch (Exception $e) { + return; + } + + // offset: 8, size: 16; GUID of StdLink + + // offset: 24, size: 4; unknown value + + // offset: 28, size: 4; option flags + + // bit: 0; mask: 0x00000001; 0 = no link or extant, 1 = file link or URL + $isFileLinkOrUrl = (0x00000001 & self::_GetInt2d($recordData, 28)) >> 0; + + // bit: 1; mask: 0x00000002; 0 = relative path, 1 = absolute path or URL + $isAbsPathOrUrl = (0x00000001 & self::_GetInt2d($recordData, 28)) >> 1; + + // bit: 2 (and 4); mask: 0x00000014; 0 = no description + $hasDesc = (0x00000014 & self::_GetInt2d($recordData, 28)) >> 2; + + // bit: 3; mask: 0x00000008; 0 = no text, 1 = has text + $hasText = (0x00000008 & self::_GetInt2d($recordData, 28)) >> 3; + + // bit: 7; mask: 0x00000080; 0 = no target frame, 1 = has target frame + $hasFrame = (0x00000080 & self::_GetInt2d($recordData, 28)) >> 7; + + // bit: 8; mask: 0x00000100; 0 = file link or URL, 1 = UNC path (inc. server name) + $isUNC = (0x00000100 & self::_GetInt2d($recordData, 28)) >> 8; + + // offset within record data + $offset = 32; + + if ($hasDesc) { + // offset: 32; size: var; character count of description text + $dl = self::_GetInt4d($recordData, 32); + // offset: 36; size: var; character array of description text, no Unicode string header, always 16-bit characters, zero terminated + $desc = self::_encodeUTF16(substr($recordData, 36, 2 * ($dl - 1)), false); + $offset += 4 + 2 * $dl; + } + if ($hasFrame) { + $fl = self::_GetInt4d($recordData, $offset); + $offset += 4 + 2 * $fl; + } + + // detect type of hyperlink (there are 4 types) + $hyperlinkType = null; + + if ($isUNC) { + $hyperlinkType = 'UNC'; + } else if (!$isFileLinkOrUrl) { + $hyperlinkType = 'workbook'; + } else if (ord($recordData{$offset}) == 0x03) { + $hyperlinkType = 'local'; + } else if (ord($recordData{$offset}) == 0xE0) { + $hyperlinkType = 'URL'; + } + + switch ($hyperlinkType) { + case 'URL': + // section 5.58.2: Hyperlink containing a URL + // e.g. http://example.org/index.php + + // offset: var; size: 16; GUID of URL Moniker + $offset += 16; + // offset: var; size: 4; size (in bytes) of character array of the URL including trailing zero word + $us = self::_GetInt4d($recordData, $offset); + $offset += 4; + // offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated + $url = self::_encodeUTF16(substr($recordData, $offset, $us - 2), false); + $url .= $hasText ? '#' : ''; + $offset += $us; + break; + + case 'local': + // section 5.58.3: Hyperlink to local file + // examples: + // mydoc.txt + // ../../somedoc.xls#Sheet!A1 + + // offset: var; size: 16; GUI of File Moniker + $offset += 16; + + // offset: var; size: 2; directory up-level count. + $upLevelCount = self::_GetInt2d($recordData, $offset); + $offset += 2; + + // offset: var; size: 4; character count of the shortened file path and name, including trailing zero word + $sl = self::_GetInt4d($recordData, $offset); + $offset += 4; + + // offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string) + $shortenedFilePath = substr($recordData, $offset, $sl); + $shortenedFilePath = self::_encodeUTF16($shortenedFilePath, true); + $shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero + + $offset += $sl; + + // offset: var; size: 24; unknown sequence + $offset += 24; + + // extended file path + // offset: var; size: 4; size of the following file link field including string lenth mark + $sz = self::_GetInt4d($recordData, $offset); + $offset += 4; + + // only present if $sz > 0 + if ($sz > 0) { + // offset: var; size: 4; size of the character array of the extended file path and name + $xl = self::_GetInt4d($recordData, $offset); + $offset += 4; + + // offset: var; size 2; unknown + $offset += 2; + + // offset: var; size $xl; character array of the extended file path and name. + $extendedFilePath = substr($recordData, $offset, $xl); + $extendedFilePath = self::_encodeUTF16($extendedFilePath, false); + $offset += $xl; + } + + // construct the path + $url = str_repeat('..\\', $upLevelCount); + $url .= ($sz > 0) ? + $extendedFilePath : $shortenedFilePath; // use extended path if available + $url .= $hasText ? '#' : ''; + + break; + + + case 'UNC': + // section 5.58.4: Hyperlink to a File with UNC (Universal Naming Convention) Path + // todo: implement + return; + + case 'workbook': + // section 5.58.5: Hyperlink to the Current Workbook + // e.g. Sheet2!B1:C2, stored in text mark field + $url = 'sheet://'; + break; + + default: + return; + + } + + if ($hasText) { + // offset: var; size: 4; character count of text mark including trailing zero word + $tl = self::_GetInt4d($recordData, $offset); + $offset += 4; + // offset: var; size: var; character array of the text mark without the # sign, no Unicode header, always 16-bit characters, zero-terminated + $text = self::_encodeUTF16(substr($recordData, $offset, 2 * ($tl - 1)), false); + $url .= $text; + } + + // apply the hyperlink to all the relevant cells + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cellRange) as $coordinate) { + $this->_phpSheet->getCell($coordinate)->getHyperLink()->setUrl($url); + } + } + } + + + /** + * Read DATAVALIDATIONS record + */ + private function _readDataValidations() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer forward to next record + $this->_pos += 4 + $length; + } + + + /** + * Read DATAVALIDATION record + */ + private function _readDataValidation() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer forward to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + // offset: 0; size: 4; Options + $options = self::_GetInt4d($recordData, 0); + + // bit: 0-3; mask: 0x0000000F; type + $type = (0x0000000F & $options) >> 0; + switch ($type) { + case 0x00: $type = PHPExcel_Cell_DataValidation::TYPE_NONE; break; + case 0x01: $type = PHPExcel_Cell_DataValidation::TYPE_WHOLE; break; + case 0x02: $type = PHPExcel_Cell_DataValidation::TYPE_DECIMAL; break; + case 0x03: $type = PHPExcel_Cell_DataValidation::TYPE_LIST; break; + case 0x04: $type = PHPExcel_Cell_DataValidation::TYPE_DATE; break; + case 0x05: $type = PHPExcel_Cell_DataValidation::TYPE_TIME; break; + case 0x06: $type = PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH; break; + case 0x07: $type = PHPExcel_Cell_DataValidation::TYPE_CUSTOM; break; + } + + // bit: 4-6; mask: 0x00000070; error type + $errorStyle = (0x00000070 & $options) >> 4; + switch ($errorStyle) { + case 0x00: $errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP; break; + case 0x01: $errorStyle = PHPExcel_Cell_DataValidation::STYLE_WARNING; break; + case 0x02: $errorStyle = PHPExcel_Cell_DataValidation::STYLE_INFORMATION; break; + } + + // bit: 7; mask: 0x00000080; 1= formula is explicit (only applies to list) + // I have only seen cases where this is 1 + $explicitFormula = (0x00000080 & $options) >> 7; + + // bit: 8; mask: 0x00000100; 1= empty cells allowed + $allowBlank = (0x00000100 & $options) >> 8; + + // bit: 9; mask: 0x00000200; 1= suppress drop down arrow in list type validity + $suppressDropDown = (0x00000200 & $options) >> 9; + + // bit: 18; mask: 0x00040000; 1= show prompt box if cell selected + $showInputMessage = (0x00040000 & $options) >> 18; + + // bit: 19; mask: 0x00080000; 1= show error box if invalid values entered + $showErrorMessage = (0x00080000 & $options) >> 19; + + // bit: 20-23; mask: 0x00F00000; condition operator + $operator = (0x00F00000 & $options) >> 20; + switch ($operator) { + case 0x00: $operator = PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN ; break; + case 0x01: $operator = PHPExcel_Cell_DataValidation::OPERATOR_NOTBETWEEN ; break; + case 0x02: $operator = PHPExcel_Cell_DataValidation::OPERATOR_EQUAL ; break; + case 0x03: $operator = PHPExcel_Cell_DataValidation::OPERATOR_NOTEQUAL ; break; + case 0x04: $operator = PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHAN ; break; + case 0x05: $operator = PHPExcel_Cell_DataValidation::OPERATOR_LESSTHAN ; break; + case 0x06: $operator = PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHANOREQUAL; break; + case 0x07: $operator = PHPExcel_Cell_DataValidation::OPERATOR_LESSTHANOREQUAL ; break; + } + + // offset: 4; size: var; title of the prompt box + $offset = 4; + $string = self::_readUnicodeStringLong(substr($recordData, $offset)); + $promptTitle = $string['value'] !== chr(0) ? + $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: var; title of the error box + $string = self::_readUnicodeStringLong(substr($recordData, $offset)); + $errorTitle = $string['value'] !== chr(0) ? + $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: var; text of the prompt box + $string = self::_readUnicodeStringLong(substr($recordData, $offset)); + $prompt = $string['value'] !== chr(0) ? + $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: var; text of the error box + $string = self::_readUnicodeStringLong(substr($recordData, $offset)); + $error = $string['value'] !== chr(0) ? + $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: 2; size of the formula data for the first condition + $sz1 = self::_GetInt2d($recordData, $offset); + $offset += 2; + + // offset: var; size: 2; not used + $offset += 2; + + // offset: var; size: $sz1; formula data for first condition (without size field) + $formula1 = substr($recordData, $offset, $sz1); + $formula1 = pack('v', $sz1) . $formula1; // prepend the length + try { + $formula1 = $this->_getFormulaFromStructure($formula1); + + // in list type validity, null characters are used as item separators + if ($type == PHPExcel_Cell_DataValidation::TYPE_LIST) { + $formula1 = str_replace(chr(0), ',', $formula1); + } + } catch (Exception $e) { + return; + } + $offset += $sz1; + + // offset: var; size: 2; size of the formula data for the first condition + $sz2 = self::_GetInt2d($recordData, $offset); + $offset += 2; + + // offset: var; size: 2; not used + $offset += 2; + + // offset: var; size: $sz2; formula data for second condition (without size field) + $formula2 = substr($recordData, $offset, $sz2); + $formula2 = pack('v', $sz2) . $formula2; // prepend the length + try { + $formula2 = $this->_getFormulaFromStructure($formula2); + } catch (Exception $e) { + return; + } + $offset += $sz2; + + // offset: var; size: var; cell range address list with + $cellRangeAddressList = $this->_readBIFF8CellRangeAddressList(substr($recordData, $offset)); + $cellRangeAddresses = $cellRangeAddressList['cellRangeAddresses']; + + foreach ($cellRangeAddresses as $cellRange) { + $stRange = $this->_phpSheet->shrinkRangeToFit($cellRange); + $stRange = PHPExcel_Cell::extractAllCellReferencesInRange($stRange); + foreach ($stRange as $coordinate) { + $objValidation = $this->_phpSheet->getCell($coordinate)->getDataValidation(); + $objValidation->setType($type); + $objValidation->setErrorStyle($errorStyle); + $objValidation->setAllowBlank((bool)$allowBlank); + $objValidation->setShowInputMessage((bool)$showInputMessage); + $objValidation->setShowErrorMessage((bool)$showErrorMessage); + $objValidation->setShowDropDown(!$suppressDropDown); + $objValidation->setOperator($operator); + $objValidation->setErrorTitle($errorTitle); + $objValidation->setError($error); + $objValidation->setPromptTitle($promptTitle); + $objValidation->setPrompt($prompt); + $objValidation->setFormula1($formula1); + $objValidation->setFormula2($formula2); + } + } + + } + + + /** + * Read SHEETLAYOUT record. Stores sheet tab color information. + */ + private function _readSheetLayout() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // local pointer in record data + $offset = 0; + + if (!$this->_readDataOnly) { + // offset: 0; size: 2; repeated record identifier 0x0862 + + // offset: 2; size: 10; not used + + // offset: 12; size: 4; size of record data + // Excel 2003 uses size of 0x14 (documented), Excel 2007 uses size of 0x28 (not documented?) + $sz = self::_GetInt4d($recordData, 12); + + switch ($sz) { + case 0x14: + // offset: 16; size: 2; color index for sheet tab + $colorIndex = self::_GetInt2d($recordData, 16); + $color = self::_readColor($colorIndex,$this->_palette,$this->_version); + $this->_phpSheet->getTabColor()->setRGB($color['rgb']); + break; + + case 0x28: + // TODO: Investigate structure for .xls SHEETLAYOUT record as saved by MS Office Excel 2007 + return; + break; + } + } + } + + + /** + * Read SHEETPROTECTION record (FEATHEADR) + */ + private function _readSheetProtection() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + if ($this->_readDataOnly) { + return; + } + + // offset: 0; size: 2; repeated record header + + // offset: 2; size: 2; FRT cell reference flag (=0 currently) + + // offset: 4; size: 8; Currently not used and set to 0 + + // offset: 12; size: 2; Shared feature type index (2=Enhanced Protetion, 4=SmartTag) + $isf = self::_GetInt2d($recordData, 12); + if ($isf != 2) { + return; + } + + // offset: 14; size: 1; =1 since this is a feat header + + // offset: 15; size: 4; size of rgbHdrSData + + // rgbHdrSData, assume "Enhanced Protection" + // offset: 19; size: 2; option flags + $options = self::_GetInt2d($recordData, 19); + + // bit: 0; mask 0x0001; 1 = user may edit objects, 0 = users must not edit objects + $bool = (0x0001 & $options) >> 0; + $this->_phpSheet->getProtection()->setObjects(!$bool); + + // bit: 1; mask 0x0002; edit scenarios + $bool = (0x0002 & $options) >> 1; + $this->_phpSheet->getProtection()->setScenarios(!$bool); + + // bit: 2; mask 0x0004; format cells + $bool = (0x0004 & $options) >> 2; + $this->_phpSheet->getProtection()->setFormatCells(!$bool); + + // bit: 3; mask 0x0008; format columns + $bool = (0x0008 & $options) >> 3; + $this->_phpSheet->getProtection()->setFormatColumns(!$bool); + + // bit: 4; mask 0x0010; format rows + $bool = (0x0010 & $options) >> 4; + $this->_phpSheet->getProtection()->setFormatRows(!$bool); + + // bit: 5; mask 0x0020; insert columns + $bool = (0x0020 & $options) >> 5; + $this->_phpSheet->getProtection()->setInsertColumns(!$bool); + + // bit: 6; mask 0x0040; insert rows + $bool = (0x0040 & $options) >> 6; + $this->_phpSheet->getProtection()->setInsertRows(!$bool); + + // bit: 7; mask 0x0080; insert hyperlinks + $bool = (0x0080 & $options) >> 7; + $this->_phpSheet->getProtection()->setInsertHyperlinks(!$bool); + + // bit: 8; mask 0x0100; delete columns + $bool = (0x0100 & $options) >> 8; + $this->_phpSheet->getProtection()->setDeleteColumns(!$bool); + + // bit: 9; mask 0x0200; delete rows + $bool = (0x0200 & $options) >> 9; + $this->_phpSheet->getProtection()->setDeleteRows(!$bool); + + // bit: 10; mask 0x0400; select locked cells + $bool = (0x0400 & $options) >> 10; + $this->_phpSheet->getProtection()->setSelectLockedCells(!$bool); + + // bit: 11; mask 0x0800; sort cell range + $bool = (0x0800 & $options) >> 11; + $this->_phpSheet->getProtection()->setSort(!$bool); + + // bit: 12; mask 0x1000; auto filter + $bool = (0x1000 & $options) >> 12; + $this->_phpSheet->getProtection()->setAutoFilter(!$bool); + + // bit: 13; mask 0x2000; pivot tables + $bool = (0x2000 & $options) >> 13; + $this->_phpSheet->getProtection()->setPivotTables(!$bool); + + // bit: 14; mask 0x4000; select unlocked cells + $bool = (0x4000 & $options) >> 14; + $this->_phpSheet->getProtection()->setSelectUnlockedCells(!$bool); + + // offset: 21; size: 2; not used + } + + + /** + * Read RANGEPROTECTION record + * Reading of this record is based on Microsoft Office Excel 97-2000 Binary File Format Specification, + * where it is referred to as FEAT record + */ + private function _readRangeProtection() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // move stream pointer to next record + $this->_pos += 4 + $length; + + // local pointer in record data + $offset = 0; + + if (!$this->_readDataOnly) { + $offset += 12; + + // offset: 12; size: 2; shared feature type, 2 = enhanced protection, 4 = smart tag + $isf = self::_GetInt2d($recordData, 12); + if ($isf != 2) { + // we only read FEAT records of type 2 + return; + } + $offset += 2; + + $offset += 5; + + // offset: 19; size: 2; count of ref ranges this feature is on + $cref = self::_GetInt2d($recordData, 19); + $offset += 2; + + $offset += 6; + + // offset: 27; size: 8 * $cref; list of cell ranges (like in hyperlink record) + $cellRanges = array(); + for ($i = 0; $i < $cref; ++$i) { + try { + $cellRange = $this->_readBIFF8CellRangeAddressFixed(substr($recordData, 27 + 8 * $i, 8)); + } catch (Exception $e) { + return; + } + $cellRanges[] = $cellRange; + $offset += 8; + } + + // offset: var; size: var; variable length of feature specific data + $rgbFeat = substr($recordData, $offset); + $offset += 4; + + // offset: var; size: 4; the encrypted password (only 16-bit although field is 32-bit) + $wPassword = self::_GetInt4d($recordData, $offset); + $offset += 4; + + // Apply range protection to sheet + if ($cellRanges) { + $this->_phpSheet->protectCells(implode(' ', $cellRanges), strtoupper(dechex($wPassword)), true); + } + } + } + + + /** + * Read IMDATA record + */ + private function _readImData() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + + // get spliced record data + $splicedRecordData = $this->_getSplicedRecordData(); + $recordData = $splicedRecordData['recordData']; + + // UNDER CONSTRUCTION + + // offset: 0; size: 2; image format + $cf = self::_GetInt2d($recordData, 0); + + // offset: 2; size: 2; environment from which the file was written + $env = self::_GetInt2d($recordData, 2); + + // offset: 4; size: 4; length of the image data + $lcb = self::_GetInt4d($recordData, 4); + + // offset: 8; size: var; image data + $iData = substr($recordData, 8); + + switch ($cf) { + case 0x09: // Windows bitmap format + // BITMAPCOREINFO + // 1. BITMAPCOREHEADER + // offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure + $bcSize = self::_GetInt4d($iData, 0); +// var_dump($bcSize); + + // offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels + $bcWidth = self::_GetInt2d($iData, 4); +// var_dump($bcWidth); + + // offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels. + $bcHeight = self::_GetInt2d($iData, 6); +// var_dump($bcHeight); + $ih = imagecreatetruecolor($bcWidth, $bcHeight); + + // offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1 + + // offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24 + $bcBitCount = self::_GetInt2d($iData, 10); +// var_dump($bcBitCount); + + $rgbString = substr($iData, 12); + $rgbTriples = array(); + while (strlen($rgbString) > 0) { + $rgbTriples[] = unpack('Cb/Cg/Cr', $rgbString); + $rgbString = substr($rgbString, 3); + } + $x = 0; + $y = 0; + foreach ($rgbTriples as $i => $rgbTriple) { + $color = imagecolorallocate($ih, $rgbTriple['r'], $rgbTriple['g'], $rgbTriple['b']); + imagesetpixel($ih, $x, $bcHeight - 1 - $y, $color); + $x = ($x + 1) % $bcWidth; + $y = $y + floor(($x + 1) / $bcWidth); + } + //imagepng($ih, 'image.png'); + + $drawing = new PHPExcel_Worksheet_Drawing(); + $drawing->setPath($filename); + $drawing->setWorksheet($this->_phpSheet); + + break; + + case 0x02: // Windows metafile or Macintosh PICT format + case 0x0e: // native format + default; + break; + + } + + // _getSplicedRecordData() takes care of moving current position in data stream + } + + + /** + * Read a free CONTINUE record. Free CONTINUE record may be a camouflaged MSODRAWING record + * When MSODRAWING data on a sheet exceeds 8224 bytes, CONTINUE records are used instead. Undocumented. + * In this case, we must treat the CONTINUE record as a MSODRAWING record + */ + private function _readContinue() + { + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $recordData = substr($this->_data, $this->_pos + 4, $length); + + // check if we are reading drawing data + // this is in case a free CONTINUE record occurs in other circumstances we are unaware of + if ($this->_drawingData == '') { + // move stream pointer to next record + $this->_pos += 4 + $length; + + return; + } + + // check if record data is at least 4 bytes long, otherwise there is no chance this is MSODRAWING data + if ($length < 4) { + // move stream pointer to next record + $this->_pos += 4 + $length; + + return; + } + + // dirty check to see if CONTINUE record could be a camouflaged MSODRAWING record + // look inside CONTINUE record to see if it looks like a part of an Escher stream + // we know that Escher stream may be split at least at + // 0xF003 MsofbtSpgrContainer + // 0xF004 MsofbtSpContainer + // 0xF00D MsofbtClientTextbox + $validSplitPoints = array(0xF003, 0xF004, 0xF00D); // add identifiers if we find more + + $splitPoint = self::_GetInt2d($recordData, 2); + if (in_array($splitPoint, $validSplitPoints)) { + // get spliced record data (and move pointer to next record) + $splicedRecordData = $this->_getSplicedRecordData(); + $this->_drawingData .= $splicedRecordData['recordData']; + + return; + } + + // move stream pointer to next record + $this->_pos += 4 + $length; + + } + + + /** + * Reads a record from current position in data stream and continues reading data as long as CONTINUE + * records are found. Splices the record data pieces and returns the combined string as if record data + * is in one piece. + * Moves to next current position in data stream to start of next record different from a CONtINUE record + * + * @return array + */ + private function _getSplicedRecordData() + { + $data = ''; + $spliceOffsets = array(); + + $i = 0; + $spliceOffsets[0] = 0; + + do { + ++$i; + + // offset: 0; size: 2; identifier + $identifier = self::_GetInt2d($this->_data, $this->_pos); + // offset: 2; size: 2; length + $length = self::_GetInt2d($this->_data, $this->_pos + 2); + $data .= substr($this->_data, $this->_pos + 4, $length); + + $spliceOffsets[$i] = $spliceOffsets[$i - 1] + $length; + + $this->_pos += 4 + $length; + $nextIdentifier = self::_GetInt2d($this->_data, $this->_pos); + } + while ($nextIdentifier == self::XLS_Type_CONTINUE); + + $splicedData = array( + 'recordData' => $data, + 'spliceOffsets' => $spliceOffsets, + ); + + return $splicedData; + + } + + + /** + * Convert formula structure into human readable Excel formula like 'A3+A5*5' + * + * @param string $formulaStructure The complete binary data for the formula + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string Human readable formula + */ + private function _getFormulaFromStructure($formulaStructure, $baseCell = 'A1') + { + // offset: 0; size: 2; size of the following formula data + $sz = self::_GetInt2d($formulaStructure, 0); + + // offset: 2; size: sz + $formulaData = substr($formulaStructure, 2, $sz); + + // for debug: dump the formula data + //echo ''; + //echo 'size: ' . $sz . "\n"; + //echo 'the entire formula data: '; + //Debug::dump($formulaData); + //echo "\n----\n"; + + // offset: 2 + sz; size: variable (optional) + if (strlen($formulaStructure) > 2 + $sz) { + $additionalData = substr($formulaStructure, 2 + $sz); + + // for debug: dump the additional data + //echo 'the entire additional data: '; + //Debug::dump($additionalData); + //echo "\n----\n"; + + } else { + $additionalData = ''; + } + + return $this->_getFormulaFromData($formulaData, $additionalData, $baseCell); + } + + + /** + * Take formula data and additional data for formula and return human readable formula + * + * @param string $formulaData The binary data for the formula itself + * @param string $additionalData Additional binary data going with the formula + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string Human readable formula + */ + private function _getFormulaFromData($formulaData, $additionalData = '', $baseCell = 'A1') + { + // start parsing the formula data + $tokens = array(); + + while (strlen($formulaData) > 0 and $token = $this->_getNextToken($formulaData, $baseCell)) { + $tokens[] = $token; + $formulaData = substr($formulaData, $token['size']); + + // for debug: dump the token + //var_dump($token); + } + + $formulaString = $this->_createFormulaFromTokens($tokens, $additionalData); + + return $formulaString; + } + + + /** + * Take array of tokens together with additional data for formula and return human readable formula + * + * @param array $tokens + * @param array $additionalData Additional binary data going with the formula + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string Human readable formula + */ + private function _createFormulaFromTokens($tokens, $additionalData) + { + // empty formula? + if (empty($tokens)) { + return ''; + } + + $formulaStrings = array(); + foreach ($tokens as $token) { + // initialize spaces + $space0 = isset($space0) ? $space0 : ''; // spaces before next token, not tParen + $space1 = isset($space1) ? $space1 : ''; // carriage returns before next token, not tParen + $space2 = isset($space2) ? $space2 : ''; // spaces before opening parenthesis + $space3 = isset($space3) ? $space3 : ''; // carriage returns before opening parenthesis + $space4 = isset($space4) ? $space4 : ''; // spaces before closing parenthesis + $space5 = isset($space5) ? $space5 : ''; // carriage returns before closing parenthesis + + switch ($token['name']) { + case 'tAdd': // addition + case 'tConcat': // addition + case 'tDiv': // division + case 'tEQ': // equality + case 'tGE': // greater than or equal + case 'tGT': // greater than + case 'tIsect': // intersection + case 'tLE': // less than or equal + case 'tList': // less than or equal + case 'tLT': // less than + case 'tMul': // multiplication + case 'tNE': // multiplication + case 'tPower': // power + case 'tRange': // range + case 'tSub': // subtraction + $op2 = array_pop($formulaStrings); + $op1 = array_pop($formulaStrings); + $formulaStrings[] = "$op1$space1$space0{$token['data']}$op2"; + unset($space0, $space1); + break; + case 'tUplus': // unary plus + case 'tUminus': // unary minus + $op = array_pop($formulaStrings); + $formulaStrings[] = "$space1$space0{$token['data']}$op"; + unset($space0, $space1); + break; + case 'tPercent': // percent sign + $op = array_pop($formulaStrings); + $formulaStrings[] = "$op$space1$space0{$token['data']}"; + unset($space0, $space1); + break; + case 'tAttrVolatile': // indicates volatile function + case 'tAttrIf': + case 'tAttrSkip': + case 'tAttrChoose': + // token is only important for Excel formula evaluator + // do nothing + break; + case 'tAttrSpace': // space / carriage return + // space will be used when next token arrives, do not alter formulaString stack + switch ($token['data']['spacetype']) { + case 'type0': + $space0 = str_repeat(' ', $token['data']['spacecount']); + break; + case 'type1': + $space1 = str_repeat("\n", $token['data']['spacecount']); + break; + case 'type2': + $space2 = str_repeat(' ', $token['data']['spacecount']); + break; + case 'type3': + $space3 = str_repeat("\n", $token['data']['spacecount']); + break; + case 'type4': + $space4 = str_repeat(' ', $token['data']['spacecount']); + break; + case 'type5': + $space5 = str_repeat("\n", $token['data']['spacecount']); + break; + } + break; + case 'tAttrSum': // SUM function with one parameter + $op = array_pop($formulaStrings); + $formulaStrings[] = "{$space1}{$space0}SUM($op)"; + unset($space0, $space1); + break; + case 'tFunc': // function with fixed number of arguments + case 'tFuncV': // function with variable number of arguments + if ($token['data']['function'] != '') { + // normal function + $ops = array(); // array of operators + for ($i = 0; $i < $token['data']['args']; ++$i) { + $ops[] = array_pop($formulaStrings); + } + $ops = array_reverse($ops); + $formulaStrings[] = "$space1$space0{$token['data']['function']}(" . implode(',', $ops) . ")"; + unset($space0, $space1); + } else { + // add-in function + $ops = array(); // array of operators + for ($i = 0; $i < $token['data']['args'] - 1; ++$i) { + $ops[] = array_pop($formulaStrings); + } + $ops = array_reverse($ops); + $function = array_pop($formulaStrings); + $formulaStrings[] = "$space1$space0$function(" . implode(',', $ops) . ")"; + unset($space0, $space1); + } + break; + case 'tParen': // parenthesis + $expression = array_pop($formulaStrings); + $formulaStrings[] = "$space3$space2($expression$space5$space4)"; + unset($space2, $space3, $space4, $space5); + break; + case 'tArray': // array constant + $constantArray = self::_readBIFF8ConstantArray($additionalData); + $formulaStrings[] = $space1 . $space0 . $constantArray['value']; + $additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data + unset($space0, $space1); + break; + case 'tMemArea': + // bite off chunk of additional data + $cellRangeAddressList = $this->_readBIFF8CellRangeAddressList($additionalData); + $additionalData = substr($additionalData, $cellRangeAddressList['size']); + $formulaStrings[] = "$space1$space0{$token['data']}"; + unset($space0, $space1); + break; + case 'tArea': // cell range address + case 'tBool': // boolean + case 'tErr': // error code + case 'tInt': // integer + case 'tMemErr': + case 'tMemFunc': + case 'tMissArg': + case 'tName': + case 'tNameX': + case 'tNum': // number + case 'tRef': // single cell reference + case 'tRef3d': // 3d cell reference + case 'tArea3d': // 3d cell range reference + case 'tRefN': + case 'tAreaN': + case 'tStr': // string + $formulaStrings[] = "$space1$space0{$token['data']}"; + unset($space0, $space1); + break; + } + } + $formulaString = $formulaStrings[0]; + + // for debug: dump the human readable formula + //echo '----' . "\n"; + //echo 'Formula: ' . $formulaString; + + return $formulaString; + } + + + /** + * Fetch next token from binary formula data + * + * @param string Formula data + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return array + * @throws Exception + */ + private function _getNextToken($formulaData, $baseCell = 'A1') + { + // offset: 0; size: 1; token id + $id = ord($formulaData[0]); // token id + $name = false; // initialize token name + + switch ($id) { + case 0x03: $name = 'tAdd'; $size = 1; $data = '+'; break; + case 0x04: $name = 'tSub'; $size = 1; $data = '-'; break; + case 0x05: $name = 'tMul'; $size = 1; $data = '*'; break; + case 0x06: $name = 'tDiv'; $size = 1; $data = '/'; break; + case 0x07: $name = 'tPower'; $size = 1; $data = '^'; break; + case 0x08: $name = 'tConcat'; $size = 1; $data = '&'; break; + case 0x09: $name = 'tLT'; $size = 1; $data = '<'; break; + case 0x0A: $name = 'tLE'; $size = 1; $data = '<='; break; + case 0x0B: $name = 'tEQ'; $size = 1; $data = '='; break; + case 0x0C: $name = 'tGE'; $size = 1; $data = '>='; break; + case 0x0D: $name = 'tGT'; $size = 1; $data = '>'; break; + case 0x0E: $name = 'tNE'; $size = 1; $data = '<>'; break; + case 0x0F: $name = 'tIsect'; $size = 1; $data = ' '; break; + case 0x10: $name = 'tList'; $size = 1; $data = ','; break; + case 0x11: $name = 'tRange'; $size = 1; $data = ':'; break; + case 0x12: $name = 'tUplus'; $size = 1; $data = '+'; break; + case 0x13: $name = 'tUminus'; $size = 1; $data = '-'; break; + case 0x14: $name = 'tPercent'; $size = 1; $data = '%'; break; + case 0x15: // parenthesis + $name = 'tParen'; + $size = 1; + $data = null; + break; + case 0x16: // missing argument + $name = 'tMissArg'; + $size = 1; + $data = ''; + break; + case 0x17: // string + $name = 'tStr'; + // offset: 1; size: var; Unicode string, 8-bit string length + $string = self::_readUnicodeStringShort(substr($formulaData, 1)); + $size = 1 + $string['size']; + $data = self::_UTF8toExcelDoubleQuoted($string['value']); + break; + case 0x19: // Special attribute + // offset: 1; size: 1; attribute type flags: + switch (ord($formulaData[1])) { + case 0x01: + $name = 'tAttrVolatile'; + $size = 4; + $data = null; + break; + case 0x02: + $name = 'tAttrIf'; + $size = 4; + $data = null; + break; + case 0x04: + $name = 'tAttrChoose'; + // offset: 2; size: 2; number of choices in the CHOOSE function ($nc, number of parameters decreased by 1) + $nc = self::_GetInt2d($formulaData, 2); + // offset: 4; size: 2 * $nc + // offset: 4 + 2 * $nc; size: 2 + $size = 2 * $nc + 6; + $data = null; + break; + case 0x08: + $name = 'tAttrSkip'; + $size = 4; + $data = null; + break; + case 0x10: + $name = 'tAttrSum'; + $size = 4; + $data = null; + break; + case 0x40: + case 0x41: + $name = 'tAttrSpace'; + $size = 4; + // offset: 2; size: 2; space type and position + switch (ord($formulaData[2])) { + case 0x00: + $spacetype = 'type0'; + break; + case 0x01: + $spacetype = 'type1'; + break; + case 0x02: + $spacetype = 'type2'; + break; + case 0x03: + $spacetype = 'type3'; + break; + case 0x04: + $spacetype = 'type4'; + break; + case 0x05: + $spacetype = 'type5'; + break; + default: + throw new Exception('Unrecognized space type in tAttrSpace token'); + break; + } + // offset: 3; size: 1; number of inserted spaces/carriage returns + $spacecount = ord($formulaData[3]); + + $data = array('spacetype' => $spacetype, 'spacecount' => $spacecount); + break; + default: + throw new Exception('Unrecognized attribute flag in tAttr token'); + break; + } + break; + case 0x1C: // error code + // offset: 1; size: 1; error code + $name = 'tErr'; + $size = 2; + $data = self::_mapErrorCode(ord($formulaData[1])); + break; + case 0x1D: // boolean + // offset: 1; size: 1; 0 = false, 1 = true; + $name = 'tBool'; + $size = 2; + $data = ord($formulaData[1]) ? 'TRUE' : 'FALSE'; + break; + case 0x1E: // integer + // offset: 1; size: 2; unsigned 16-bit integer + $name = 'tInt'; + $size = 3; + $data = self::_GetInt2d($formulaData, 1); + break; + case 0x1F: // number + // offset: 1; size: 8; + $name = 'tNum'; + $size = 9; + $data = self::_extractNumber(substr($formulaData, 1)); + $data = str_replace(',', '.', (string)$data); // in case non-English locale + break; + case 0x20: // array constant + case 0x40: + case 0x60: + // offset: 1; size: 7; not used + $name = 'tArray'; + $size = 8; + $data = null; + break; + case 0x21: // function with fixed number of arguments + case 0x41: + case 0x61: + $name = 'tFunc'; + $size = 3; + // offset: 1; size: 2; index to built-in sheet function + switch (self::_GetInt2d($formulaData, 1)) { + case 2: $function = 'ISNA'; $args = 1; break; + case 3: $function = 'ISERROR'; $args = 1; break; + case 10: $function = 'NA'; $args = 0; break; + case 15: $function = 'SIN'; $args = 1; break; + case 16: $function = 'COS'; $args = 1; break; + case 17: $function = 'TAN'; $args = 1; break; + case 18: $function = 'ATAN'; $args = 1; break; + case 19: $function = 'PI'; $args = 0; break; + case 20: $function = 'SQRT'; $args = 1; break; + case 21: $function = 'EXP'; $args = 1; break; + case 22: $function = 'LN'; $args = 1; break; + case 23: $function = 'LOG10'; $args = 1; break; + case 24: $function = 'ABS'; $args = 1; break; + case 25: $function = 'INT'; $args = 1; break; + case 26: $function = 'SIGN'; $args = 1; break; + case 27: $function = 'ROUND'; $args = 2; break; + case 30: $function = 'REPT'; $args = 2; break; + case 31: $function = 'MID'; $args = 3; break; + case 32: $function = 'LEN'; $args = 1; break; + case 33: $function = 'VALUE'; $args = 1; break; + case 34: $function = 'TRUE'; $args = 0; break; + case 35: $function = 'FALSE'; $args = 0; break; + case 38: $function = 'NOT'; $args = 1; break; + case 39: $function = 'MOD'; $args = 2; break; + case 40: $function = 'DCOUNT'; $args = 3; break; + case 41: $function = 'DSUM'; $args = 3; break; + case 42: $function = 'DAVERAGE'; $args = 3; break; + case 43: $function = 'DMIN'; $args = 3; break; + case 44: $function = 'DMAX'; $args = 3; break; + case 45: $function = 'DSTDEV'; $args = 3; break; + case 48: $function = 'TEXT'; $args = 2; break; + case 61: $function = 'MIRR'; $args = 3; break; + case 63: $function = 'RAND'; $args = 0; break; + case 65: $function = 'DATE'; $args = 3; break; + case 66: $function = 'TIME'; $args = 3; break; + case 67: $function = 'DAY'; $args = 1; break; + case 68: $function = 'MONTH'; $args = 1; break; + case 69: $function = 'YEAR'; $args = 1; break; + case 71: $function = 'HOUR'; $args = 1; break; + case 72: $function = 'MINUTE'; $args = 1; break; + case 73: $function = 'SECOND'; $args = 1; break; + case 74: $function = 'NOW'; $args = 0; break; + case 75: $function = 'AREAS'; $args = 1; break; + case 76: $function = 'ROWS'; $args = 1; break; + case 77: $function = 'COLUMNS'; $args = 1; break; + case 83: $function = 'TRANSPOSE'; $args = 1; break; + case 86: $function = 'TYPE'; $args = 1; break; + case 97: $function = 'ATAN2'; $args = 2; break; + case 98: $function = 'ASIN'; $args = 1; break; + case 99: $function = 'ACOS'; $args = 1; break; + case 105: $function = 'ISREF'; $args = 1; break; + case 111: $function = 'CHAR'; $args = 1; break; + case 112: $function = 'LOWER'; $args = 1; break; + case 113: $function = 'UPPER'; $args = 1; break; + case 114: $function = 'PROPER'; $args = 1; break; + case 117: $function = 'EXACT'; $args = 2; break; + case 118: $function = 'TRIM'; $args = 1; break; + case 119: $function = 'REPLACE'; $args = 4; break; + case 121: $function = 'CODE'; $args = 1; break; + case 126: $function = 'ISERR'; $args = 1; break; + case 127: $function = 'ISTEXT'; $args = 1; break; + case 128: $function = 'ISNUMBER'; $args = 1; break; + case 129: $function = 'ISBLANK'; $args = 1; break; + case 130: $function = 'T'; $args = 1; break; + case 131: $function = 'N'; $args = 1; break; + case 140: $function = 'DATEVALUE'; $args = 1; break; + case 141: $function = 'TIMEVALUE'; $args = 1; break; + case 142: $function = 'SLN'; $args = 3; break; + case 143: $function = 'SYD'; $args = 4; break; + case 162: $function = 'CLEAN'; $args = 1; break; + case 163: $function = 'MDETERM'; $args = 1; break; + case 164: $function = 'MINVERSE'; $args = 1; break; + case 165: $function = 'MMULT'; $args = 2; break; + case 184: $function = 'FACT'; $args = 1; break; + case 189: $function = 'DPRODUCT'; $args = 3; break; + case 190: $function = 'ISNONTEXT'; $args = 1; break; + case 195: $function = 'DSTDEVP'; $args = 3; break; + case 196: $function = 'DVARP'; $args = 3; break; + case 198: $function = 'ISLOGICAL'; $args = 1; break; + case 199: $function = 'DCOUNTA'; $args = 3; break; + case 207: $function = 'REPLACEB'; $args = 4; break; + case 210: $function = 'MIDB'; $args = 3; break; + case 211: $function = 'LENB'; $args = 1; break; + case 212: $function = 'ROUNDUP'; $args = 2; break; + case 213: $function = 'ROUNDDOWN'; $args = 2; break; + case 214: $function = 'ASC'; $args = 1; break; + case 215: $function = 'DBCS'; $args = 1; break; + case 221: $function = 'TODAY'; $args = 0; break; + case 229: $function = 'SINH'; $args = 1; break; + case 230: $function = 'COSH'; $args = 1; break; + case 231: $function = 'TANH'; $args = 1; break; + case 232: $function = 'ASINH'; $args = 1; break; + case 233: $function = 'ACOSH'; $args = 1; break; + case 234: $function = 'ATANH'; $args = 1; break; + case 235: $function = 'DGET'; $args = 3; break; + case 244: $function = 'INFO'; $args = 1; break; + case 252: $function = 'FREQUENCY'; $args = 2; break; + case 261: $function = 'ERROR.TYPE'; $args = 1; break; + case 271: $function = 'GAMMALN'; $args = 1; break; + case 273: $function = 'BINOMDIST'; $args = 4; break; + case 274: $function = 'CHIDIST'; $args = 2; break; + case 275: $function = 'CHIINV'; $args = 2; break; + case 276: $function = 'COMBIN'; $args = 2; break; + case 277: $function = 'CONFIDENCE'; $args = 3; break; + case 278: $function = 'CRITBINOM'; $args = 3; break; + case 279: $function = 'EVEN'; $args = 1; break; + case 280: $function = 'EXPONDIST'; $args = 3; break; + case 281: $function = 'FDIST'; $args = 3; break; + case 282: $function = 'FINV'; $args = 3; break; + case 283: $function = 'FISHER'; $args = 1; break; + case 284: $function = 'FISHERINV'; $args = 1; break; + case 285: $function = 'FLOOR'; $args = 2; break; + case 286: $function = 'GAMMADIST'; $args = 4; break; + case 287: $function = 'GAMMAINV'; $args = 3; break; + case 288: $function = 'CEILING'; $args = 2; break; + case 289: $function = 'HYPGEOMDIST'; $args = 4; break; + case 290: $function = 'LOGNORMDIST'; $args = 3; break; + case 291: $function = 'LOGINV'; $args = 3; break; + case 292: $function = 'NEGBINOMDIST'; $args = 3; break; + case 293: $function = 'NORMDIST'; $args = 4; break; + case 294: $function = 'NORMSDIST'; $args = 1; break; + case 295: $function = 'NORMINV'; $args = 3; break; + case 296: $function = 'NORMSINV'; $args = 1; break; + case 297: $function = 'STANDARDIZE'; $args = 3; break; + case 298: $function = 'ODD'; $args = 1; break; + case 299: $function = 'PERMUT'; $args = 2; break; + case 300: $function = 'POISSON'; $args = 3; break; + case 301: $function = 'TDIST'; $args = 3; break; + case 302: $function = 'WEIBULL'; $args = 4; break; + case 303: $function = 'SUMXMY2'; $args = 2; break; + case 304: $function = 'SUMX2MY2'; $args = 2; break; + case 305: $function = 'SUMX2PY2'; $args = 2; break; + case 306: $function = 'CHITEST'; $args = 2; break; + case 307: $function = 'CORREL'; $args = 2; break; + case 308: $function = 'COVAR'; $args = 2; break; + case 309: $function = 'FORECAST'; $args = 3; break; + case 310: $function = 'FTEST'; $args = 2; break; + case 311: $function = 'INTERCEPT'; $args = 2; break; + case 312: $function = 'PEARSON'; $args = 2; break; + case 313: $function = 'RSQ'; $args = 2; break; + case 314: $function = 'STEYX'; $args = 2; break; + case 315: $function = 'SLOPE'; $args = 2; break; + case 316: $function = 'TTEST'; $args = 4; break; + case 325: $function = 'LARGE'; $args = 2; break; + case 326: $function = 'SMALL'; $args = 2; break; + case 327: $function = 'QUARTILE'; $args = 2; break; + case 328: $function = 'PERCENTILE'; $args = 2; break; + case 331: $function = 'TRIMMEAN'; $args = 2; break; + case 332: $function = 'TINV'; $args = 2; break; + case 337: $function = 'POWER'; $args = 2; break; + case 342: $function = 'RADIANS'; $args = 1; break; + case 343: $function = 'DEGREES'; $args = 1; break; + case 346: $function = 'COUNTIF'; $args = 2; break; + case 347: $function = 'COUNTBLANK'; $args = 1; break; + case 350: $function = 'ISPMT'; $args = 4; break; + case 351: $function = 'DATEDIF'; $args = 3; break; + case 352: $function = 'DATESTRING'; $args = 1; break; + case 353: $function = 'NUMBERSTRING'; $args = 2; break; + case 360: $function = 'PHONETIC'; $args = 1; break; + case 368: $function = 'BAHTTEXT'; $args = 1; break; + default: + throw new Exception('Unrecognized function in formula'); + break; + } + $data = array('function' => $function, 'args' => $args); + break; + case 0x22: // function with variable number of arguments + case 0x42: + case 0x62: + $name = 'tFuncV'; + $size = 4; + // offset: 1; size: 1; number of arguments + $args = ord($formulaData[1]); + // offset: 2: size: 2; index to built-in sheet function + $index = self::_GetInt2d($formulaData, 2); + switch ($index) { + case 0: $function = 'COUNT'; break; + case 1: $function = 'IF'; break; + case 4: $function = 'SUM'; break; + case 5: $function = 'AVERAGE'; break; + case 6: $function = 'MIN'; break; + case 7: $function = 'MAX'; break; + case 8: $function = 'ROW'; break; + case 9: $function = 'COLUMN'; break; + case 11: $function = 'NPV'; break; + case 12: $function = 'STDEV'; break; + case 13: $function = 'DOLLAR'; break; + case 14: $function = 'FIXED'; break; + case 28: $function = 'LOOKUP'; break; + case 29: $function = 'INDEX'; break; + case 36: $function = 'AND'; break; + case 37: $function = 'OR'; break; + case 46: $function = 'VAR'; break; + case 49: $function = 'LINEST'; break; + case 50: $function = 'TREND'; break; + case 51: $function = 'LOGEST'; break; + case 52: $function = 'GROWTH'; break; + case 56: $function = 'PV'; break; + case 57: $function = 'FV'; break; + case 58: $function = 'NPER'; break; + case 59: $function = 'PMT'; break; + case 60: $function = 'RATE'; break; + case 62: $function = 'IRR'; break; + case 64: $function = 'MATCH'; break; + case 70: $function = 'WEEKDAY'; break; + case 78: $function = 'OFFSET'; break; + case 82: $function = 'SEARCH'; break; + case 100: $function = 'CHOOSE'; break; + case 101: $function = 'HLOOKUP'; break; + case 102: $function = 'VLOOKUP'; break; + case 109: $function = 'LOG'; break; + case 115: $function = 'LEFT'; break; + case 116: $function = 'RIGHT'; break; + case 120: $function = 'SUBSTITUTE'; break; + case 124: $function = 'FIND'; break; + case 125: $function = 'CELL'; break; + case 144: $function = 'DDB'; break; + case 148: $function = 'INDIRECT'; break; + case 167: $function = 'IPMT'; break; + case 168: $function = 'PPMT'; break; + case 169: $function = 'COUNTA'; break; + case 183: $function = 'PRODUCT'; break; + case 193: $function = 'STDEVP'; break; + case 194: $function = 'VARP'; break; + case 197: $function = 'TRUNC'; break; + case 204: $function = 'USDOLLAR'; break; + case 205: $function = 'FINDB'; break; + case 206: $function = 'SEARCHB'; break; + case 208: $function = 'LEFTB'; break; + case 209: $function = 'RIGHTB'; break; + case 216: $function = 'RANK'; break; + case 219: $function = 'ADDRESS'; break; + case 220: $function = 'DAYS360'; break; + case 222: $function = 'VDB'; break; + case 227: $function = 'MEDIAN'; break; + case 228: $function = 'SUMPRODUCT'; break; + case 247: $function = 'DB'; break; + case 255: $function = ''; break; + case 269: $function = 'AVEDEV'; break; + case 270: $function = 'BETADIST'; break; + case 272: $function = 'BETAINV'; break; + case 317: $function = 'PROB'; break; + case 318: $function = 'DEVSQ'; break; + case 319: $function = 'GEOMEAN'; break; + case 320: $function = 'HARMEAN'; break; + case 321: $function = 'SUMSQ'; break; + case 322: $function = 'KURT'; break; + case 323: $function = 'SKEW'; break; + case 324: $function = 'ZTEST'; break; + case 329: $function = 'PERCENTRANK'; break; + case 330: $function = 'MODE'; break; + case 336: $function = 'CONCATENATE'; break; + case 344: $function = 'SUBTOTAL'; break; + case 345: $function = 'SUMIF'; break; + case 354: $function = 'ROMAN'; break; + case 358: $function = 'GETPIVOTDATA'; break; + case 359: $function = 'HYPERLINK'; break; + case 361: $function = 'AVERAGEA'; break; + case 362: $function = 'MAXA'; break; + case 363: $function = 'MINA'; break; + case 364: $function = 'STDEVPA'; break; + case 365: $function = 'VARPA'; break; + case 366: $function = 'STDEVA'; break; + case 367: $function = 'VARA'; break; + default: + throw new Exception('Unrecognized function in formula'); + break; + } + $data = array('function' => $function, 'args' => $args); + break; + case 0x23: // index to defined name + case 0x43: + case 0x63: + $name = 'tName'; + $size = 5; + // offset: 1; size: 2; one-based index to definedname record + $definedNameIndex = self::_GetInt2d($formulaData, 1) - 1; + // offset: 2; size: 2; not used + $data = $this->_definedname[$definedNameIndex]['name']; + break; + case 0x24: // single cell reference e.g. A5 + case 0x44: + case 0x64: + $name = 'tRef'; + $size = 5; + $data = $this->_readBIFF8CellAddress(substr($formulaData, 1, 4)); + break; + case 0x25: // cell range reference to cells in the same sheet (2d) + case 0x45: + case 0x65: + $name = 'tArea'; + $size = 9; + $data = $this->_readBIFF8CellRangeAddress(substr($formulaData, 1, 8)); + break; + case 0x26: // Constant reference sub-expression + case 0x46: + case 0x66: + $name = 'tMemArea'; + // offset: 1; size: 4; not used + // offset: 5; size: 2; size of the following subexpression + $subSize = self::_GetInt2d($formulaData, 5); + $size = 7 + $subSize; + $data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize)); + break; + case 0x27: // Deleted constant reference sub-expression + case 0x47: + case 0x67: + $name = 'tMemErr'; + // offset: 1; size: 4; not used + // offset: 5; size: 2; size of the following subexpression + $subSize = self::_GetInt2d($formulaData, 5); + $size = 7 + $subSize; + $data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize)); + break; + case 0x29: // Variable reference sub-expression + case 0x49: + case 0x69: + $name = 'tMemFunc'; + // offset: 1; size: 2; size of the following sub-expression + $subSize = self::_GetInt2d($formulaData, 1); + $size = 3 + $subSize; + $data = $this->_getFormulaFromData(substr($formulaData, 3, $subSize)); + break; + + case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places + case 0x4C: + case 0x6C: + $name = 'tRefN'; + $size = 5; + $data = $this->_readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell); + break; + + case 0x2D: // Relative 2d range reference + case 0x4D: + case 0x6D: + $name = 'tAreaN'; + $size = 9; + $data = $this->_readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell); + break; + + case 0x39: // External name + case 0x59: + case 0x79: + $name = 'tNameX'; + $size = 7; + // offset: 1; size: 2; index to REF entry in EXTERNSHEET record + // offset: 3; size: 2; one-based index to DEFINEDNAME or EXTERNNAME record + $index = self::_GetInt2d($formulaData, 3); + // assume index is to EXTERNNAME record + $data = $this->_externalNames[$index - 1]['name']; + // offset: 5; size: 2; not used + break; + + case 0x3A: // 3d reference to cell + case 0x5A: + case 0x7A: + $name = 'tRef3d'; + $size = 7; + + try { + // offset: 1; size: 2; index to REF entry + $sheetRange = $this->_readSheetRangeByRefIndex(self::_GetInt2d($formulaData, 1)); + // offset: 3; size: 4; cell address + $cellAddress = $this->_readBIFF8CellAddress(substr($formulaData, 3, 4)); + + $data = "$sheetRange!$cellAddress"; + } catch (Exception $e) { + // deleted sheet reference + $data = '#REF!'; + } + + break; + case 0x3B: // 3d reference to cell range + case 0x5B: + case 0x7B: + $name = 'tArea3d'; + $size = 11; + + try { + // offset: 1; size: 2; index to REF entry + $sheetRange = $this->_readSheetRangeByRefIndex(self::_GetInt2d($formulaData, 1)); + // offset: 3; size: 8; cell address + $cellRangeAddress = $this->_readBIFF8CellRangeAddress(substr($formulaData, 3, 8)); + + $data = "$sheetRange!$cellRangeAddress"; + } catch (Exception $e) { + // deleted sheet reference + $data = '#REF!'; + } + + break; + // Unknown cases // don't know how to deal with + default: + throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula'); + break; + } + + return array( + 'id' => $id, + 'name' => $name, + 'size' => $size, + 'data' => $data, + ); + } + + + /** + * Reads a cell address in BIFF8 e.g. 'A2' or '$A$2' + * section 3.3.4 + * + * @param string $cellAddressStructure + * @return string + */ + private function _readBIFF8CellAddress($cellAddressStructure) + { + // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767)) + $row = self::_GetInt2d($cellAddressStructure, 0) + 1; + + // offset: 2; size: 2; index to column or column offset + relative flags + + // bit: 7-0; mask 0x00FF; column index + $column = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::_GetInt2d($cellAddressStructure, 2)); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::_GetInt2d($cellAddressStructure, 2))) { + $column = '$' . $column; + } + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::_GetInt2d($cellAddressStructure, 2))) { + $row = '$' . $row; + } + + return $column . $row; + } + + + /** + * Reads a cell address in BIFF8 for shared formulas. Uses positive and negative values for row and column + * to indicate offsets from a base cell + * section 3.3.4 + * + * @param string $cellAddressStructure + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string + */ + private function _readBIFF8CellAddressB($cellAddressStructure, $baseCell = 'A1') + { + list($baseCol, $baseRow) = PHPExcel_Cell::coordinateFromString($baseCell); + $baseCol = PHPExcel_Cell::columnIndexFromString($baseCol) - 1; + + // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767)) + $rowIndex = self::_GetInt2d($cellAddressStructure, 0); + $row = self::_GetInt2d($cellAddressStructure, 0) + 1; + + // offset: 2; size: 2; index to column or column offset + relative flags + + // bit: 7-0; mask 0x00FF; column index + $colIndex = 0x00FF & self::_GetInt2d($cellAddressStructure, 2); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::_GetInt2d($cellAddressStructure, 2))) { + $column = PHPExcel_Cell::stringFromColumnIndex($colIndex); + $column = '$' . $column; + } else { + $colIndex = ($colIndex <= 127) ? $colIndex : $colIndex - 256; + $column = PHPExcel_Cell::stringFromColumnIndex($baseCol + $colIndex); + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::_GetInt2d($cellAddressStructure, 2))) { + $row = '$' . $row; + } else { + $rowIndex = ($rowIndex <= 32767) ? $rowIndex : $rowIndex - 65536; + $row = $baseRow + $rowIndex; + } + + return $column . $row; + } + + + /** + * Reads a cell range address in BIFF5 e.g. 'A2:B6' or 'A1' + * always fixed range + * section 2.5.14 + * + * @param string $subData + * @return string + * @throws Exception + */ + private function _readBIFF5CellRangeAddressFixed($subData) + { + // offset: 0; size: 2; index to first row + $fr = self::_GetInt2d($subData, 0) + 1; + + // offset: 2; size: 2; index to last row + $lr = self::_GetInt2d($subData, 2) + 1; + + // offset: 4; size: 1; index to first column + $fc = ord($subData{4}); + + // offset: 5; size: 1; index to last column + $lc = ord($subData{5}); + + // check values + if ($fr > $lr || $fc > $lc) { + throw new Exception('Not a cell range address'); + } + + // column index to letter + $fc = PHPExcel_Cell::stringFromColumnIndex($fc); + $lc = PHPExcel_Cell::stringFromColumnIndex($lc); + + if ($fr == $lr and $fc == $lc) { + return "$fc$fr"; + } + return "$fc$fr:$lc$lr"; + } + + + /** + * Reads a cell range address in BIFF8 e.g. 'A2:B6' or 'A1' + * always fixed range + * section 2.5.14 + * + * @param string $subData + * @return string + * @throws Exception + */ + private function _readBIFF8CellRangeAddressFixed($subData) + { + // offset: 0; size: 2; index to first row + $fr = self::_GetInt2d($subData, 0) + 1; + + // offset: 2; size: 2; index to last row + $lr = self::_GetInt2d($subData, 2) + 1; + + // offset: 4; size: 2; index to first column + $fc = self::_GetInt2d($subData, 4); + + // offset: 6; size: 2; index to last column + $lc = self::_GetInt2d($subData, 6); + + // check values + if ($fr > $lr || $fc > $lc) { + throw new Exception('Not a cell range address'); + } + + // column index to letter + $fc = PHPExcel_Cell::stringFromColumnIndex($fc); + $lc = PHPExcel_Cell::stringFromColumnIndex($lc); + + if ($fr == $lr and $fc == $lc) { + return "$fc$fr"; + } + return "$fc$fr:$lc$lr"; + } + + + /** + * Reads a cell range address in BIFF8 e.g. 'A2:B6' or '$A$2:$B$6' + * there are flags indicating whether column/row index is relative + * section 3.3.4 + * + * @param string $subData + * @return string + */ + private function _readBIFF8CellRangeAddress($subData) + { + // todo: if cell range is just a single cell, should this funciton + // not just return e.g. 'A1' and not 'A1:A1' ? + + // offset: 0; size: 2; index to first row (0... 65535) (or offset (-32768... 32767)) + $fr = self::_GetInt2d($subData, 0) + 1; + + // offset: 2; size: 2; index to last row (0... 65535) (or offset (-32768... 32767)) + $lr = self::_GetInt2d($subData, 2) + 1; + + // offset: 4; size: 2; index to first column or column offset + relative flags + + // bit: 7-0; mask 0x00FF; column index + $fc = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::_GetInt2d($subData, 4)); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::_GetInt2d($subData, 4))) { + $fc = '$' . $fc; + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::_GetInt2d($subData, 4))) { + $fr = '$' . $fr; + } + + // offset: 6; size: 2; index to last column or column offset + relative flags + + // bit: 7-0; mask 0x00FF; column index + $lc = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::_GetInt2d($subData, 6)); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::_GetInt2d($subData, 6))) { + $lc = '$' . $lc; + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::_GetInt2d($subData, 6))) { + $lr = '$' . $lr; + } + + return "$fc$fr:$lc$lr"; + } + + + /** + * Reads a cell range address in BIFF8 for shared formulas. Uses positive and negative values for row and column + * to indicate offsets from a base cell + * section 3.3.4 + * + * @param string $subData + * @param string $baseCell Base cell + * @return string Cell range address + */ + private function _readBIFF8CellRangeAddressB($subData, $baseCell = 'A1') + { + list($baseCol, $baseRow) = PHPExcel_Cell::coordinateFromString($baseCell); + $baseCol = PHPExcel_Cell::columnIndexFromString($baseCol) - 1; + + // TODO: if cell range is just a single cell, should this funciton + // not just return e.g. 'A1' and not 'A1:A1' ? + + // offset: 0; size: 2; first row + $frIndex = self::_GetInt2d($subData, 0); // adjust below + + // offset: 2; size: 2; relative index to first row (0... 65535) should be treated as offset (-32768... 32767) + $lrIndex = self::_GetInt2d($subData, 2); // adjust below + + // offset: 4; size: 2; first column with relative/absolute flags + + // bit: 7-0; mask 0x00FF; column index + $fcIndex = 0x00FF & self::_GetInt2d($subData, 4); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::_GetInt2d($subData, 4))) { + // absolute column index + $fc = PHPExcel_Cell::stringFromColumnIndex($fcIndex); + $fc = '$' . $fc; + } else { + // column offset + $fcIndex = ($fcIndex <= 127) ? $fcIndex : $fcIndex - 256; + $fc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $fcIndex); + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::_GetInt2d($subData, 4))) { + // absolute row index + $fr = $frIndex + 1; + $fr = '$' . $fr; + } else { + // row offset + $frIndex = ($frIndex <= 32767) ? $frIndex : $frIndex - 65536; + $fr = $baseRow + $frIndex; + } + + // offset: 6; size: 2; last column with relative/absolute flags + + // bit: 7-0; mask 0x00FF; column index + $lcIndex = 0x00FF & self::_GetInt2d($subData, 6); + $lcIndex = ($lcIndex <= 127) ? $lcIndex : $lcIndex - 256; + $lc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $lcIndex); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::_GetInt2d($subData, 6))) { + // absolute column index + $lc = PHPExcel_Cell::stringFromColumnIndex($lcIndex); + $lc = '$' . $lc; + } else { + // column offset + $lcIndex = ($lcIndex <= 127) ? $lcIndex : $lcIndex - 256; + $lc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $lcIndex); + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::_GetInt2d($subData, 6))) { + // absolute row index + $lr = $lrIndex + 1; + $lr = '$' . $lr; + } else { + // row offset + $lrIndex = ($lrIndex <= 32767) ? $lrIndex : $lrIndex - 65536; + $lr = $baseRow + $lrIndex; + } + + return "$fc$fr:$lc$lr"; + } + + + /** + * Read BIFF8 cell range address list + * section 2.5.15 + * + * @param string $subData + * @return array + */ + private function _readBIFF8CellRangeAddressList($subData) + { + $cellRangeAddresses = array(); + + // offset: 0; size: 2; number of the following cell range addresses + $nm = self::_GetInt2d($subData, 0); + + $offset = 2; + // offset: 2; size: 8 * $nm; list of $nm (fixed) cell range addresses + for ($i = 0; $i < $nm; ++$i) { + $cellRangeAddresses[] = $this->_readBIFF8CellRangeAddressFixed(substr($subData, $offset, 8)); + $offset += 8; + } + + return array( + 'size' => 2 + 8 * $nm, + 'cellRangeAddresses' => $cellRangeAddresses, + ); + } + + + /** + * Read BIFF5 cell range address list + * section 2.5.15 + * + * @param string $subData + * @return array + */ + private function _readBIFF5CellRangeAddressList($subData) + { + $cellRangeAddresses = array(); + + // offset: 0; size: 2; number of the following cell range addresses + $nm = self::_GetInt2d($subData, 0); + + $offset = 2; + // offset: 2; size: 6 * $nm; list of $nm (fixed) cell range addresses + for ($i = 0; $i < $nm; ++$i) { + $cellRangeAddresses[] = $this->_readBIFF5CellRangeAddressFixed(substr($subData, $offset, 6)); + $offset += 6; + } + + return array( + 'size' => 2 + 6 * $nm, + 'cellRangeAddresses' => $cellRangeAddresses, + ); + } + + + /** + * Get a sheet range like Sheet1:Sheet3 from REF index + * Note: If there is only one sheet in the range, one gets e.g Sheet1 + * It can also happen that the REF structure uses the -1 (FFFF) code to indicate deleted sheets, + * in which case an exception is thrown + * + * @param int $index + * @return string|false + * @throws Exception + */ + private function _readSheetRangeByRefIndex($index) + { + if (isset($this->_ref[$index])) { + + $type = $this->_externalBooks[$this->_ref[$index]['externalBookIndex']]['type']; + + switch ($type) { + case 'internal': + // check if we have a deleted 3d reference + if ($this->_ref[$index]['firstSheetIndex'] == 0xFFFF or $this->_ref[$index]['lastSheetIndex'] == 0xFFFF) { + throw new Exception('Deleted sheet reference'); + } + + // we have normal sheet range (collapsed or uncollapsed) + $firstSheetName = $this->_sheets[$this->_ref[$index]['firstSheetIndex']]['name']; + $lastSheetName = $this->_sheets[$this->_ref[$index]['lastSheetIndex']]['name']; + + if ($firstSheetName == $lastSheetName) { + // collapsed sheet range + $sheetRange = $firstSheetName; + } else { + $sheetRange = "$firstSheetName:$lastSheetName"; + } + + // escape the single-quotes + $sheetRange = str_replace("'", "''", $sheetRange); + + // if there are special characters, we need to enclose the range in single-quotes + // todo: check if we have identified the whole set of special characters + // it seems that the following characters are not accepted for sheet names + // and we may assume that they are not present: []*/:\? + if (preg_match("/[ !\"@#£$%&{()}<>=+'|^,;-]/", $sheetRange)) { + $sheetRange = "'$sheetRange'"; + } + + return $sheetRange; + break; + + default: + // TODO: external sheet support + throw new Exception('Excel5 reader only supports internal sheets in fomulas'); + break; + } + } + return false; + } + + + /** + * read BIFF8 constant value array from array data + * returns e.g. array('value' => '{1,2;3,4}', 'size' => 40} + * section 2.5.8 + * + * @param string $arrayData + * @return array + */ + private static function _readBIFF8ConstantArray($arrayData) + { + // offset: 0; size: 1; number of columns decreased by 1 + $nc = ord($arrayData[0]); + + // offset: 1; size: 2; number of rows decreased by 1 + $nr = self::_GetInt2d($arrayData, 1); + $size = 3; // initialize + $arrayData = substr($arrayData, 3); + + // offset: 3; size: var; list of ($nc + 1) * ($nr + 1) constant values + $matrixChunks = array(); + for ($r = 1; $r <= $nr + 1; ++$r) { + $items = array(); + for ($c = 1; $c <= $nc + 1; ++$c) { + $constant = self::_readBIFF8Constant($arrayData); + $items[] = $constant['value']; + $arrayData = substr($arrayData, $constant['size']); + $size += $constant['size']; + } + $matrixChunks[] = implode(',', $items); // looks like e.g. '1,"hello"' + } + $matrix = '{' . implode(';', $matrixChunks) . '}'; + + return array( + 'value' => $matrix, + 'size' => $size, + ); + } + + + /** + * read BIFF8 constant value which may be 'Empty Value', 'Number', 'String Value', 'Boolean Value', 'Error Value' + * section 2.5.7 + * returns e.g. array('value' => '5', 'size' => 9) + * + * @param string $valueData + * @return array + */ + private static function _readBIFF8Constant($valueData) + { + // offset: 0; size: 1; identifier for type of constant + $identifier = ord($valueData[0]); + + switch ($identifier) { + case 0x00: // empty constant (what is this?) + $value = ''; + $size = 9; + break; + case 0x01: // number + // offset: 1; size: 8; IEEE 754 floating-point value + $value = self::_extractNumber(substr($valueData, 1, 8)); + $size = 9; + break; + case 0x02: // string value + // offset: 1; size: var; Unicode string, 16-bit string length + $string = self::_readUnicodeStringLong(substr($valueData, 1)); + $value = '"' . $string['value'] . '"'; + $size = 1 + $string['size']; + break; + case 0x04: // boolean + // offset: 1; size: 1; 0 = FALSE, 1 = TRUE + if (ord($valueData[1])) { + $value = 'TRUE'; + } else { + $value = 'FALSE'; + } + $size = 9; + break; + case 0x10: // error code + // offset: 1; size: 1; error code + $value = self::_mapErrorCode(ord($valueData[1])); + $size = 9; + break; + } + return array( + 'value' => $value, + 'size' => $size, + ); + } + + + /** + * Extract RGB color + * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.4 + * + * @param string $rgb Encoded RGB value (4 bytes) + * @return array + */ + private static function _readRGB($rgb) + { + // offset: 0; size 1; Red component + $r = ord($rgb{0}); + + // offset: 1; size: 1; Green component + $g = ord($rgb{1}); + + // offset: 2; size: 1; Blue component + $b = ord($rgb{2}); + + // HEX notation, e.g. 'FF00FC' + $rgb = sprintf('%02X%02X%02X', $r, $g, $b); + + return array('rgb' => $rgb); + } + + + /** + * Read byte string (8-bit string length) + * OpenOffice documentation: 2.5.2 + * + * @param string $subData + * @return array + */ + private function _readByteStringShort($subData) + { + // offset: 0; size: 1; length of the string (character count) + $ln = ord($subData[0]); + + // offset: 1: size: var; character array (8-bit characters) + $value = $this->_decodeCodepage(substr($subData, 1, $ln)); + + return array( + 'value' => $value, + 'size' => 1 + $ln, // size in bytes of data structure + ); + } + + + /** + * Read byte string (16-bit string length) + * OpenOffice documentation: 2.5.2 + * + * @param string $subData + * @return array + */ + private function _readByteStringLong($subData) + { + // offset: 0; size: 2; length of the string (character count) + $ln = self::_GetInt2d($subData, 0); + + // offset: 2: size: var; character array (8-bit characters) + $value = $this->_decodeCodepage(substr($subData, 2)); + + //return $string; + return array( + 'value' => $value, + 'size' => 2 + $ln, // size in bytes of data structure + ); + } + + + /** + * Extracts an Excel Unicode short string (8-bit string length) + * OpenOffice documentation: 2.5.3 + * function will automatically find out where the Unicode string ends. + * + * @param string $subData + * @return array + */ + private static function _readUnicodeStringShort($subData) + { + $value = ''; + + // offset: 0: size: 1; length of the string (character count) + $characterCount = ord($subData[0]); + + $string = self::_readUnicodeString(substr($subData, 1), $characterCount); + + // add 1 for the string length + $string['size'] += 1; + + return $string; + } + + + /** + * Extracts an Excel Unicode long string (16-bit string length) + * OpenOffice documentation: 2.5.3 + * this function is under construction, needs to support rich text, and Asian phonetic settings + * + * @param string $subData + * @return array + */ + private static function _readUnicodeStringLong($subData) + { + $value = ''; + + // offset: 0: size: 2; length of the string (character count) + $characterCount = self::_GetInt2d($subData, 0); + + $string = self::_readUnicodeString(substr($subData, 2), $characterCount); + + // add 2 for the string length + $string['size'] += 2; + + return $string; + } + + + /** + * Read Unicode string with no string length field, but with known character count + * this function is under construction, needs to support rich text, and Asian phonetic settings + * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.3 + * + * @param string $subData + * @param int $characterCount + * @return array + */ + private static function _readUnicodeString($subData, $characterCount) + { + $value = ''; + + // offset: 0: size: 1; option flags + + // bit: 0; mask: 0x01; character compression (0 = compressed 8-bit, 1 = uncompressed 16-bit) + $isCompressed = !((0x01 & ord($subData[0])) >> 0); + + // bit: 2; mask: 0x04; Asian phonetic settings + $hasAsian = (0x04) & ord($subData[0]) >> 2; + + // bit: 3; mask: 0x08; Rich-Text settings + $hasRichText = (0x08) & ord($subData[0]) >> 3; + + // offset: 1: size: var; character array + // this offset assumes richtext and Asian phonetic settings are off which is generally wrong + // needs to be fixed + $value = self::_encodeUTF16(substr($subData, 1, $isCompressed ? $characterCount : 2 * $characterCount), $isCompressed); + + return array( + 'value' => $value, + 'size' => $isCompressed ? 1 + $characterCount : 1 + 2 * $characterCount, // the size in bytes including the option flags + ); + } + + + /** + * Convert UTF-8 string to string surounded by double quotes. Used for explicit string tokens in formulas. + * Example: hello"world --> "hello""world" + * + * @param string $value UTF-8 encoded string + * @return string + */ + private static function _UTF8toExcelDoubleQuoted($value) + { + return '"' . str_replace('"', '""', $value) . '"'; + } + + + /** + * Reads first 8 bytes of a string and return IEEE 754 float + * + * @param string $data Binary string that is at least 8 bytes long + * @return float + */ + private static function _extractNumber($data) + { + $rknumhigh = self::_GetInt4d($data, 4); + $rknumlow = self::_GetInt4d($data, 0); + $sign = ($rknumhigh & 0x80000000) >> 31; + $exp = (($rknumhigh & 0x7ff00000) >> 20) - 1023; + $mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); + $mantissalow1 = ($rknumlow & 0x80000000) >> 31; + $mantissalow2 = ($rknumlow & 0x7fffffff); + $value = $mantissa / pow( 2 , (20 - $exp)); + + if ($mantissalow1 != 0) { + $value += 1 / pow (2 , (21 - $exp)); + } + + $value += $mantissalow2 / pow (2 , (52 - $exp)); + if ($sign) { + $value *= -1; + } + + return $value; + } + + + private static function _GetIEEE754($rknum) + { + if (($rknum & 0x02) != 0) { + $value = $rknum >> 2; + } else { + // changes by mmp, info on IEEE754 encoding from + // research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html + // The RK format calls for using only the most significant 30 bits + // of the 64 bit floating point value. The other 34 bits are assumed + // to be 0 so we use the upper 30 bits of $rknum as follows... + $sign = ($rknum & 0x80000000) >> 31; + $exp = ($rknum & 0x7ff00000) >> 20; + $mantissa = (0x100000 | ($rknum & 0x000ffffc)); + $value = $mantissa / pow( 2 , (20- ($exp - 1023))); + if ($sign) { + $value = -1 * $value; + } + //end of changes by mmp + } + if (($rknum & 0x01) != 0) { + $value /= 100; + } + return $value; + } + + + /** + * Get UTF-8 string from (compressed or uncompressed) UTF-16 string + * + * @param string $string + * @param bool $compressed + * @return string + */ + private static function _encodeUTF16($string, $compressed = '') + { + if ($compressed) { + $string = self::_uncompressByteString($string); + } + + return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', 'UTF-16LE'); + } + + + /** + * Convert UTF-16 string in compressed notation to uncompressed form. Only used for BIFF8. + * + * @param string $string + * @return string + */ + private static function _uncompressByteString($string) + { + $uncompressedString = ''; + $strLen = strlen($string); + for ($i = 0; $i < $strLen; ++$i) { + $uncompressedString .= $string[$i] . "\0"; + } + + return $uncompressedString; + } + + + /** + * Convert string to UTF-8. Only used for BIFF5. + * + * @param string $string + * @return string + */ + private function _decodeCodepage($string) + { + return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', $this->_codepage); + } + + + /** + * Read 16-bit unsigned integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt2d($data, $pos) + { + return ord($data[$pos]) | (ord($data[$pos+1]) << 8); + } + + + /** + * Read 32-bit signed integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24; + } + + + /** + * Read color + * + * @param int $color Indexed color + * @param array $palette Color palette + * @return array RGB color value, example: array('rgb' => 'FF0000') + */ + private static function _readColor($color,$palette,$version) + { + if ($color <= 0x07 || $color >= 0x40) { + // special built-in color + return self::_mapBuiltInColor($color); + } elseif (isset($palette) && isset($palette[$color - 8])) { + // palette color, color index 0x08 maps to pallete index 0 + return $palette[$color - 8]; + } else { + // default color table + if ($version == self::XLS_BIFF8) { + return self::_mapColor($color); + } else { + // BIFF5 + return self::_mapColorBIFF5($color); + } + } + + return $color; + } + + + /** + * Map border style + * OpenOffice documentation: 2.5.11 + * + * @param int $index + * @return string + */ + private static function _mapBorderStyle($index) + { + switch ($index) { + case 0x00: return PHPExcel_Style_Border::BORDER_NONE; + case 0x01: return PHPExcel_Style_Border::BORDER_THIN; + case 0x02: return PHPExcel_Style_Border::BORDER_MEDIUM; + case 0x03: return PHPExcel_Style_Border::BORDER_DASHED; + case 0x04: return PHPExcel_Style_Border::BORDER_DOTTED; + case 0x05: return PHPExcel_Style_Border::BORDER_THICK; + case 0x06: return PHPExcel_Style_Border::BORDER_DOUBLE; + case 0x07: return PHPExcel_Style_Border::BORDER_HAIR; + case 0x08: return PHPExcel_Style_Border::BORDER_MEDIUMDASHED; + case 0x09: return PHPExcel_Style_Border::BORDER_DASHDOT; + case 0x0A: return PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT; + case 0x0B: return PHPExcel_Style_Border::BORDER_DASHDOTDOT; + case 0x0C: return PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT; + case 0x0D: return PHPExcel_Style_Border::BORDER_SLANTDASHDOT; + default: return PHPExcel_Style_Border::BORDER_NONE; + } + } + + + /** + * Get fill pattern from index + * OpenOffice documentation: 2.5.12 + * + * @param int $index + * @return string + */ + private static function _mapFillPattern($index) + { + switch ($index) { + case 0x00: return PHPExcel_Style_Fill::FILL_NONE; + case 0x01: return PHPExcel_Style_Fill::FILL_SOLID; + case 0x02: return PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY; + case 0x03: return PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY; + case 0x04: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY; + case 0x05: return PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL; + case 0x06: return PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL; + case 0x07: return PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN; + case 0x08: return PHPExcel_Style_Fill::FILL_PATTERN_DARKUP; + case 0x09: return PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID; + case 0x0A: return PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS; + case 0x0B: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL; + case 0x0C: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL; + case 0x0D: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN; + case 0x0E: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP; + case 0x0F: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID; + case 0x10: return PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS; + case 0x11: return PHPExcel_Style_Fill::FILL_PATTERN_GRAY125; + case 0x12: return PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625; + default: return PHPExcel_Style_Fill::FILL_NONE; + } + } + + + /** + * Map error code, e.g. '#N/A' + * + * @param int $subData + * @return string + */ + private static function _mapErrorCode($subData) + { + switch ($subData) { + case 0x00: return '#NULL!'; break; + case 0x07: return '#DIV/0!'; break; + case 0x0F: return '#VALUE!'; break; + case 0x17: return '#REF!'; break; + case 0x1D: return '#NAME?'; break; + case 0x24: return '#NUM!'; break; + case 0x2A: return '#N/A'; break; + default: return false; + } + } + + + /** + * Map built-in color to RGB value + * + * @param int $color Indexed color + * @return array + */ + private static function _mapBuiltInColor($color) + { + switch ($color) { + case 0x00: return array('rgb' => '000000'); + case 0x01: return array('rgb' => 'FFFFFF'); + case 0x02: return array('rgb' => 'FF0000'); + case 0x03: return array('rgb' => '00FF00'); + case 0x04: return array('rgb' => '0000FF'); + case 0x05: return array('rgb' => 'FFFF00'); + case 0x06: return array('rgb' => 'FF00FF'); + case 0x07: return array('rgb' => '00FFFF'); + case 0x40: return array('rgb' => '000000'); // system window text color + case 0x41: return array('rgb' => 'FFFFFF'); // system window background color + default: return array('rgb' => '000000'); + } + } + + + /** + * Map color array from BIFF5 built-in color index + * + * @param int $subData + * @return array + */ + private static function _mapColorBIFF5($subData) + { + switch ($subData) { + case 0x08: return array('rgb' => '000000'); + case 0x09: return array('rgb' => 'FFFFFF'); + case 0x0A: return array('rgb' => 'FF0000'); + case 0x0B: return array('rgb' => '00FF00'); + case 0x0C: return array('rgb' => '0000FF'); + case 0x0D: return array('rgb' => 'FFFF00'); + case 0x0E: return array('rgb' => 'FF00FF'); + case 0x0F: return array('rgb' => '00FFFF'); + case 0x10: return array('rgb' => '800000'); + case 0x11: return array('rgb' => '008000'); + case 0x12: return array('rgb' => '000080'); + case 0x13: return array('rgb' => '808000'); + case 0x14: return array('rgb' => '800080'); + case 0x15: return array('rgb' => '008080'); + case 0x16: return array('rgb' => 'C0C0C0'); + case 0x17: return array('rgb' => '808080'); + case 0x18: return array('rgb' => '8080FF'); + case 0x19: return array('rgb' => '802060'); + case 0x1A: return array('rgb' => 'FFFFC0'); + case 0x1B: return array('rgb' => 'A0E0F0'); + case 0x1C: return array('rgb' => '600080'); + case 0x1D: return array('rgb' => 'FF8080'); + case 0x1E: return array('rgb' => '0080C0'); + case 0x1F: return array('rgb' => 'C0C0FF'); + case 0x20: return array('rgb' => '000080'); + case 0x21: return array('rgb' => 'FF00FF'); + case 0x22: return array('rgb' => 'FFFF00'); + case 0x23: return array('rgb' => '00FFFF'); + case 0x24: return array('rgb' => '800080'); + case 0x25: return array('rgb' => '800000'); + case 0x26: return array('rgb' => '008080'); + case 0x27: return array('rgb' => '0000FF'); + case 0x28: return array('rgb' => '00CFFF'); + case 0x29: return array('rgb' => '69FFFF'); + case 0x2A: return array('rgb' => 'E0FFE0'); + case 0x2B: return array('rgb' => 'FFFF80'); + case 0x2C: return array('rgb' => 'A6CAF0'); + case 0x2D: return array('rgb' => 'DD9CB3'); + case 0x2E: return array('rgb' => 'B38FEE'); + case 0x2F: return array('rgb' => 'E3E3E3'); + case 0x30: return array('rgb' => '2A6FF9'); + case 0x31: return array('rgb' => '3FB8CD'); + case 0x32: return array('rgb' => '488436'); + case 0x33: return array('rgb' => '958C41'); + case 0x34: return array('rgb' => '8E5E42'); + case 0x35: return array('rgb' => 'A0627A'); + case 0x36: return array('rgb' => '624FAC'); + case 0x37: return array('rgb' => '969696'); + case 0x38: return array('rgb' => '1D2FBE'); + case 0x39: return array('rgb' => '286676'); + case 0x3A: return array('rgb' => '004500'); + case 0x3B: return array('rgb' => '453E01'); + case 0x3C: return array('rgb' => '6A2813'); + case 0x3D: return array('rgb' => '85396A'); + case 0x3E: return array('rgb' => '4A3285'); + case 0x3F: return array('rgb' => '424242'); + default: return array('rgb' => '000000'); + } + } + + + /** + * Map color array from BIFF8 built-in color index + * + * @param int $subData + * @return array + */ + private static function _mapColor($subData) + { + switch ($subData) { + case 0x08: return array('rgb' => '000000'); + case 0x09: return array('rgb' => 'FFFFFF'); + case 0x0A: return array('rgb' => 'FF0000'); + case 0x0B: return array('rgb' => '00FF00'); + case 0x0C: return array('rgb' => '0000FF'); + case 0x0D: return array('rgb' => 'FFFF00'); + case 0x0E: return array('rgb' => 'FF00FF'); + case 0x0F: return array('rgb' => '00FFFF'); + case 0x10: return array('rgb' => '800000'); + case 0x11: return array('rgb' => '008000'); + case 0x12: return array('rgb' => '000080'); + case 0x13: return array('rgb' => '808000'); + case 0x14: return array('rgb' => '800080'); + case 0x15: return array('rgb' => '008080'); + case 0x16: return array('rgb' => 'C0C0C0'); + case 0x17: return array('rgb' => '808080'); + case 0x18: return array('rgb' => '9999FF'); + case 0x19: return array('rgb' => '993366'); + case 0x1A: return array('rgb' => 'FFFFCC'); + case 0x1B: return array('rgb' => 'CCFFFF'); + case 0x1C: return array('rgb' => '660066'); + case 0x1D: return array('rgb' => 'FF8080'); + case 0x1E: return array('rgb' => '0066CC'); + case 0x1F: return array('rgb' => 'CCCCFF'); + case 0x20: return array('rgb' => '000080'); + case 0x21: return array('rgb' => 'FF00FF'); + case 0x22: return array('rgb' => 'FFFF00'); + case 0x23: return array('rgb' => '00FFFF'); + case 0x24: return array('rgb' => '800080'); + case 0x25: return array('rgb' => '800000'); + case 0x26: return array('rgb' => '008080'); + case 0x27: return array('rgb' => '0000FF'); + case 0x28: return array('rgb' => '00CCFF'); + case 0x29: return array('rgb' => 'CCFFFF'); + case 0x2A: return array('rgb' => 'CCFFCC'); + case 0x2B: return array('rgb' => 'FFFF99'); + case 0x2C: return array('rgb' => '99CCFF'); + case 0x2D: return array('rgb' => 'FF99CC'); + case 0x2E: return array('rgb' => 'CC99FF'); + case 0x2F: return array('rgb' => 'FFCC99'); + case 0x30: return array('rgb' => '3366FF'); + case 0x31: return array('rgb' => '33CCCC'); + case 0x32: return array('rgb' => '99CC00'); + case 0x33: return array('rgb' => 'FFCC00'); + case 0x34: return array('rgb' => 'FF9900'); + case 0x35: return array('rgb' => 'FF6600'); + case 0x36: return array('rgb' => '666699'); + case 0x37: return array('rgb' => '969696'); + case 0x38: return array('rgb' => '003366'); + case 0x39: return array('rgb' => '339966'); + case 0x3A: return array('rgb' => '003300'); + case 0x3B: return array('rgb' => '333300'); + case 0x3C: return array('rgb' => '993300'); + case 0x3D: return array('rgb' => '993366'); + case 0x3E: return array('rgb' => '333399'); + case 0x3F: return array('rgb' => '333333'); + default: return array('rgb' => '000000'); + } + } + + + private function _parseRichText($is = '') { + $value = new PHPExcel_RichText(); + + $value->createText($is); + + return $value; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel5/Escher.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel5/Escher.php new file mode 100644 index 000000000..e167655ff --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Excel5/Escher.php @@ -0,0 +1,640 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Reader_Excel5_Escher + * + * @category PHPExcel + * @package PHPExcel_Reader_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Reader_Excel5_Escher +{ + const DGGCONTAINER = 0xF000; + const BSTORECONTAINER = 0xF001; + const DGCONTAINER = 0xF002; + const SPGRCONTAINER = 0xF003; + const SPCONTAINER = 0xF004; + const DGG = 0xF006; + const BSE = 0xF007; + const DG = 0xF008; + const SPGR = 0xF009; + const SP = 0xF00A; + const OPT = 0xF00B; + const CLIENTTEXTBOX = 0xF00D; + const CLIENTANCHOR = 0xF010; + const CLIENTDATA = 0xF011; + const BLIPJPEG = 0xF01D; + const BLIPPNG = 0xF01E; + const SPLITMENUCOLORS = 0xF11E; + const TERTIARYOPT = 0xF122; + + /** + * Escher stream data (binary) + * + * @var string + */ + private $_data; + + /** + * Size in bytes of the Escher stream data + * + * @var int + */ + private $_dataSize; + + /** + * Current position of stream pointer in Escher stream data + * + * @var int + */ + private $_pos; + + /** + * The object to be returned by the reader. Modified during load. + * + * @var mixed + */ + private $_object; + + /** + * Create a new PHPExcel_Reader_Excel5_Escher instance + * + * @param mixed $object + */ + public function __construct($object) + { + $this->_object = $object; + } + + /** + * Load Escher stream data. May be a partial Escher stream. + * + * @param string $data + */ + public function load($data) + { + $this->_data = $data; + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->_dataSize = strlen($this->_data); + + $this->_pos = 0; + + // Parse Escher stream + while ($this->_pos < $this->_dataSize) { + + // offset: 2; size: 2: Record Type + $fbt = PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos + 2); + + switch ($fbt) { + case self::DGGCONTAINER: $this->_readDggContainer(); break; + case self::DGG: $this->_readDgg(); break; + case self::BSTORECONTAINER: $this->_readBstoreContainer(); break; + case self::BSE: $this->_readBSE(); break; + case self::BLIPJPEG: $this->_readBlipJPEG(); break; + case self::BLIPPNG: $this->_readBlipPNG(); break; + case self::OPT: $this->_readOPT(); break; + case self::TERTIARYOPT: $this->_readTertiaryOPT(); break; + case self::SPLITMENUCOLORS: $this->_readSplitMenuColors(); break; + case self::DGCONTAINER: $this->_readDgContainer(); break; + case self::DG: $this->_readDg(); break; + case self::SPGRCONTAINER: $this->_readSpgrContainer(); break; + case self::SPCONTAINER: $this->_readSpContainer(); break; + case self::SPGR: $this->_readSpgr(); break; + case self::SP: $this->_readSp(); break; + case self::CLIENTTEXTBOX: $this->_readClientTextbox(); break; + case self::CLIENTANCHOR: $this->_readClientAnchor(); break; + case self::CLIENTDATA: $this->_readClientData(); break; + default: $this->_readDefault(); break; + } + } + + return $this->_object; + } + + /** + * Read a generic record + */ + private function _readDefault() + { + // offset 0; size: 2; recVer and recInstance + $verInstance = PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos); + + // offset: 2; size: 2: Record Type + $fbt = PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos + 2); + + // bit: 0-3; mask: 0x000F; recVer + $recVer = (0x000F & $verInstance) >> 0; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read DggContainer record (Drawing Group Container) + */ + private function _readDggContainer() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // record is a container, read contents + $dggContainer = new PHPExcel_Shared_Escher_DggContainer(); + $this->_object->setDggContainer($dggContainer); + $reader = new PHPExcel_Reader_Excel5_Escher($dggContainer); + $reader->load($recordData); + } + + /** + * Read Dgg record (Drawing Group) + */ + private function _readDgg() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read BstoreContainer record (Blip Store Container) + */ + private function _readBstoreContainer() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // record is a container, read contents + $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); + $this->_object->setBstoreContainer($bstoreContainer); + $reader = new PHPExcel_Reader_Excel5_Escher($bstoreContainer); + $reader->load($recordData); + } + + /** + * Read BSE record + */ + private function _readBSE() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // add BSE to BstoreContainer + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $this->_object->addBSE($BSE); + + $BSE->setBLIPType($recInstance); + + // offset: 0; size: 1; btWin32 (MSOBLIPTYPE) + $btWin32 = ord($recordData[0]); + + // offset: 1; size: 1; btWin32 (MSOBLIPTYPE) + $btMacOS = ord($recordData[1]); + + // offset: 2; size: 16; MD4 digest + $rgbUid = substr($recordData, 2, 16); + + // offset: 18; size: 2; tag + $tag = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 18); + + // offset: 20; size: 4; size of BLIP in bytes + $size = PHPExcel_Reader_Excel5::_GetInt4d($recordData, 20); + + // offset: 24; size: 4; number of references to this BLIP + $cRef = PHPExcel_Reader_Excel5::_GetInt4d($recordData, 24); + + // offset: 28; size: 4; MSOFO file offset + $foDelay = PHPExcel_Reader_Excel5::_GetInt4d($recordData, 28); + + // offset: 32; size: 1; unused1 + $unused1 = ord($recordData{32}); + + // offset: 33; size: 1; size of nameData in bytes (including null terminator) + $cbName = ord($recordData{33}); + + // offset: 34; size: 1; unused2 + $unused2 = ord($recordData{34}); + + // offset: 35; size: 1; unused3 + $unused3 = ord($recordData{35}); + + // offset: 36; size: $cbName; nameData + $nameData = substr($recordData, 36, $cbName); + + // offset: 36 + $cbName, size: var; the BLIP data + $blipData = substr($recordData, 36 + $cbName); + + // record is a container, read contents + $reader = new PHPExcel_Reader_Excel5_Escher($BSE); + $reader->load($blipData); + } + + /** + * Read BlipJPEG record. Holds raw JPEG image data + */ + private function _readBlipJPEG() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + $pos = 0; + + // offset: 0; size: 16; rgbUid1 (MD4 digest of) + $rgbUid1 = substr($recordData, 0, 16); + $pos += 16; + + // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 + if (in_array($recInstance, array(0x046B, 0x06E3))) { + $rgbUid2 = substr($recordData, 16, 16); + $pos += 16; + } + + // offset: var; size: 1; tag + $tag = ord($recordData{$pos}); + $pos += 1; + + // offset: var; size: var; the raw image data + $data = substr($recordData, $pos); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($data); + + $this->_object->setBlip($blip); + } + + /** + * Read BlipPNG record. Holds raw PNG image data + */ + private function _readBlipPNG() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + $pos = 0; + + // offset: 0; size: 16; rgbUid1 (MD4 digest of) + $rgbUid1 = substr($recordData, 0, 16); + $pos += 16; + + // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 + if ($recInstance == 0x06E1) { + $rgbUid2 = substr($recordData, 16, 16); + $pos += 16; + } + + // offset: var; size: 1; tag + $tag = ord($recordData{$pos}); + $pos += 1; + + // offset: var; size: var; the raw image data + $data = substr($recordData, $pos); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($data); + + $this->_object->setBlip($blip); + } + + /** + * Read OPT record. This record may occur within DggContainer record or SpContainer + */ + private function _readOPT() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + $this->_readOfficeArtRGFOPTE($recordData, $recInstance); + } + + /** + * Read TertiaryOPT record + */ + private function _readTertiaryOPT() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read SplitMenuColors record + */ + private function _readSplitMenuColors() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read DgContainer record (Drawing Container) + */ + private function _readDgContainer() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // record is a container, read contents + $dgContainer = new PHPExcel_Shared_Escher_DgContainer(); + $this->_object->setDgContainer($dgContainer); + $reader = new PHPExcel_Reader_Excel5_Escher($dgContainer); + $escher = $reader->load($recordData); + } + + /** + * Read Dg record (Drawing) + */ + private function _readDg() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read SpgrContainer record (Shape Group Container) + */ + private function _readSpgrContainer() + { + // context is either context DgContainer or SpgrContainer + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // record is a container, read contents + $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); + + if ($this->_object instanceof PHPExcel_Shared_Escher_DgContainer) { + // DgContainer + $this->_object->setSpgrContainer($spgrContainer); + } else { + // SpgrContainer + $this->_object->addChild($spgrContainer); + } + + $reader = new PHPExcel_Reader_Excel5_Escher($spgrContainer); + $escher = $reader->load($recordData); + } + + /** + * Read SpContainer record (Shape Container) + */ + private function _readSpContainer() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // add spContainer to spgrContainer + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + $this->_object->addChild($spContainer); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // record is a container, read contents + $reader = new PHPExcel_Reader_Excel5_Escher($spContainer); + $escher = $reader->load($recordData); + } + + /** + * Read Spgr record (Shape Group) + */ + private function _readSpgr() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read Sp record (Shape) + */ + private function _readSp() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read ClientTextbox record + */ + private function _readClientTextbox() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::_GetInt2d($this->_data, $this->_pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read ClientAnchor record. This record holds information about where the shape is anchored in worksheet + */ + private function _readClientAnchor() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + + // offset: 2; size: 2; upper-left corner column index (0-based) + $c1 = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 2); + + // offset: 4; size: 2; upper-left corner horizontal offset in 1/1024 of column width + $startOffsetX = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 4); + + // offset: 6; size: 2; upper-left corner row index (0-based) + $r1 = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 6); + + // offset: 8; size: 2; upper-left corner vertical offset in 1/256 of row height + $startOffsetY = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 8); + + // offset: 10; size: 2; bottom-right corner column index (0-based) + $c2 = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 10); + + // offset: 12; size: 2; bottom-right corner horizontal offset in 1/1024 of column width + $endOffsetX = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 12); + + // offset: 14; size: 2; bottom-right corner row index (0-based) + $r2 = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 14); + + // offset: 16; size: 2; bottom-right corner vertical offset in 1/256 of row height + $endOffsetY = PHPExcel_Reader_Excel5::_GetInt2d($recordData, 16); + + // set the start coordinates + $this->_object->setStartCoordinates(PHPExcel_Cell::stringFromColumnIndex($c1) . ($r1 + 1)); + + // set the start offsetX + $this->_object->setStartOffsetX($startOffsetX); + + // set the start offsetY + $this->_object->setStartOffsetY($startOffsetY); + + // set the end coordinates + $this->_object->setEndCoordinates(PHPExcel_Cell::stringFromColumnIndex($c2) . ($r2 + 1)); + + // set the end offsetX + $this->_object->setEndOffsetX($endOffsetX); + + // set the end offsetY + $this->_object->setEndOffsetY($endOffsetY); + } + + /** + * Read ClientData record + */ + private function _readClientData() + { + $length = PHPExcel_Reader_Excel5::_GetInt4d($this->_data, $this->_pos + 4); + $recordData = substr($this->_data, $this->_pos + 8, $length); + + // move stream pointer to next record + $this->_pos += 8 + $length; + } + + /** + * Read OfficeArtRGFOPTE table of property-value pairs + * + * @param string $data Binary data + * @param int $n Number of properties + */ + private function _readOfficeArtRGFOPTE($data, $n) { + + $splicedComplexData = substr($data, 6 * $n); + + // loop through property-value pairs + for ($i = 0; $i < $n; ++$i) { + // read 6 bytes at a time + $fopte = substr($data, 6 * $i, 6); + + // offset: 0; size: 2; opid + $opid = PHPExcel_Reader_Excel5::_GetInt2d($fopte, 0); + + // bit: 0-13; mask: 0x3FFF; opid.opid + $opidOpid = (0x3FFF & $opid) >> 0; + + // bit: 14; mask 0x4000; 1 = value in op field is BLIP identifier + $opidFBid = (0x4000 & $opid) >> 14; + + // bit: 15; mask 0x8000; 1 = this is a complex property, op field specifies size of complex data + $opidFComplex = (0x8000 & $opid) >> 15; + + // offset: 2; size: 4; the value for this property + $op = PHPExcel_Reader_Excel5::_GetInt4d($fopte, 2); + + if ($opidFComplex) { + $complexData = substr($splicedComplexData, 0, $op); + $splicedComplexData = substr($splicedComplexData, $op); + + // we store string value with complex data + $value = $complexData; + } else { + // we store integer value + $value = $op; + } + + $this->_object->setOPT($opidOpid, $value); + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Gnumeric.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Gnumeric.php new file mode 100644 index 000000000..5d82f2292 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/Gnumeric.php @@ -0,0 +1,982 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_Gnumeric + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Reader_Gnumeric implements PHPExcel_Reader_IReader +{ + /** + * Read data only? + * Identifies whether the Reader should only read data values for cells, and ignore any formatting information; + * or whether it should read both data and formatting + * + * @var boolean + */ + private $_readDataOnly = false; + + /** + * Restrict which sheets should be loaded? + * This property holds an array of worksheet names to be loaded. If null, then all worksheets will be loaded. + * + * @var array of string + */ + private $_loadSheetsOnly = null; + + /** + * Formats + * + * @var array + */ + private $_styles = array(); + + /** + * Shared Expressions + * + * @var array + */ + private $_expressions = array(); + + private $_referenceHelper = null; + + /** + * PHPExcel_Reader_IReadFilter instance + * + * @var PHPExcel_Reader_IReadFilter + */ + private $_readFilter = null; + + + /** + * Create a new PHPExcel_Reader_Gnumeric + */ + public function __construct() { + $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + $this->_referenceHelper = PHPExcel_ReferenceHelper::getInstance(); + } + + + /** + * Read data only? + * If this is true, then the Reader will only read data values for cells, it will not read any formatting information. + * If false (the default) it will read data and formatting. + * + * @return boolean + */ + public function getReadDataOnly() { + return $this->_readDataOnly; + } + + + /** + * Set read data only + * Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information. + * Set to false (the default) to advise the Reader to read both data and formatting for cells. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_Gnumeric + */ + public function setReadDataOnly($pValue = false) { + $this->_readDataOnly = $pValue; + return $this; + } + + + /** + * Get which sheets to load + * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null + * indicating that all worksheets in the workbook should be loaded. + * + * @return mixed + */ + public function getLoadSheetsOnly() + { + return $this->_loadSheetsOnly; + } + + + /** + * Set which sheets to load + * + * @param mixed $value + * This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name. + * If NULL, then it tells the Reader to read all worksheets in the workbook + * + * @return PHPExcel_Reader_Gnumeric + */ + public function setLoadSheetsOnly($value = null) + { + $this->_loadSheetsOnly = is_array($value) ? + $value : array($value); + return $this; + } + + + /** + * Set all sheets to load + * Tells the Reader to load all worksheets from the workbook. + * + * @return PHPExcel_Reader_Gnumeric + */ + public function setLoadAllSheets() + { + $this->_loadSheetsOnly = null; + return $this; + } + + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + * @return PHPExcel_Reader_Gnumeric + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Check if gzlib functions are available + if (!function_exists('gzread')) { + throw new Exception("gzlib library is not enabled"); + } + + // Read signature data (first 3 bytes) + $fh = fopen($pFilename, 'r'); + $data = fread($fh, 2); + fclose($fh); + + if ($data != chr(0x1F).chr(0x8B)) { + return false; + } + + return true; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $gFileData = $this->_gzfileGetContents($pFilename); + + $xml = simplexml_load_string($gFileData); + $namespacesMeta = $xml->getNamespaces(true); + + $gnmXML = $xml->children($namespacesMeta['gnm']); + + $worksheetInfo = array(); + + foreach ($gnmXML->Sheets->Sheet as $sheet) { + $tmpInfo = array(); + $tmpInfo['worksheetName'] = (string) $sheet->Name; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + foreach ($sheet->Cells->Cell as $cell) { + $cellAttributes = $cell->attributes(); + + $rowIndex = (int) $cellAttributes->Row + 1; + $columnIndex = (int) $cellAttributes->Col; + + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + } + + return $worksheetInfo; + } + + + private function _gzfileGetContents($filename) { + $file = @gzopen($filename, 'rb'); + if ($file !== false) { + $data = ''; + while (!gzeof($file)) { + $data .= gzread($file, 1024); + } + gzclose($file); + } + return $data; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $gFileData = $this->_gzfileGetContents($pFilename); + + $xml = simplexml_load_string($gFileData); + $namespacesMeta = $xml->getNamespaces(true); + + $gnmXML = $xml->children($namespacesMeta['gnm']); + + $worksheetNames = array(); + + foreach($gnmXML->Sheets->Sheet as $sheet) { + $worksheetNames[] = (string) $sheet->Name; + } + + return $worksheetNames; + } + + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + + $gFileData = $this->_gzfileGetContents($pFilename); + +// echo '<pre>'; +// echo htmlentities($gFileData,ENT_QUOTES,'UTF-8'); +// echo '</pre><hr />'; +// + $xml = simplexml_load_string($gFileData); + $namespacesMeta = $xml->getNamespaces(true); + +// var_dump($namespacesMeta); +// + $gnmXML = $xml->children($namespacesMeta['gnm']); + + $docProps = $objPHPExcel->getProperties(); + // Document Properties are held differently, depending on the version of Gnumeric + if (isset($namespacesMeta['office'])) { + $officeXML = $xml->children($namespacesMeta['office']); + $officeDocXML = $officeXML->{'document-meta'}; + $officeDocMetaXML = $officeDocXML->meta; + + foreach($officeDocMetaXML as $officePropertyData) { + + $officePropertyDC = array(); + if (isset($namespacesMeta['dc'])) { + $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']); + } + foreach($officePropertyDC as $propertyName => $propertyValue) { + $propertyValue = (string) $propertyValue; + switch ($propertyName) { + case 'title' : + $docProps->setTitle(trim($propertyValue)); + break; + case 'subject' : + $docProps->setSubject(trim($propertyValue)); + break; + case 'creator' : + $docProps->setCreator(trim($propertyValue)); + $docProps->setLastModifiedBy(trim($propertyValue)); + break; + case 'date' : + $creationDate = strtotime(trim($propertyValue)); + $docProps->setCreated($creationDate); + $docProps->setModified($creationDate); + break; + case 'description' : + $docProps->setDescription(trim($propertyValue)); + break; + } + } + $officePropertyMeta = array(); + if (isset($namespacesMeta['meta'])) { + $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); + } + foreach($officePropertyMeta as $propertyName => $propertyValue) { + $attributes = $propertyValue->attributes($namespacesMeta['meta']); + $propertyValue = (string) $propertyValue; + switch ($propertyName) { + case 'keyword' : + $docProps->setKeywords(trim($propertyValue)); + break; + case 'initial-creator' : + $docProps->setCreator(trim($propertyValue)); + $docProps->setLastModifiedBy(trim($propertyValue)); + break; + case 'creation-date' : + $creationDate = strtotime(trim($propertyValue)); + $docProps->setCreated($creationDate); + $docProps->setModified($creationDate); + break; + case 'user-defined' : + list(,$attrName) = explode(':',$attributes['name']); + switch ($attrName) { + case 'publisher' : + $docProps->setCompany(trim($propertyValue)); + break; + case 'category' : + $docProps->setCategory(trim($propertyValue)); + break; + case 'manager' : + $docProps->setManager(trim($propertyValue)); + break; + } + break; + } + } + } + } elseif (isset($gnmXML->Summary)) { + foreach($gnmXML->Summary->Item as $summaryItem) { + $propertyName = $summaryItem->name; + $propertyValue = $summaryItem->{'val-string'}; + switch ($propertyName) { + case 'title' : + $docProps->setTitle(trim($propertyValue)); + break; + case 'comments' : + $docProps->setDescription(trim($propertyValue)); + break; + case 'keywords' : + $docProps->setKeywords(trim($propertyValue)); + break; + case 'category' : + $docProps->setCategory(trim($propertyValue)); + break; + case 'manager' : + $docProps->setManager(trim($propertyValue)); + break; + case 'author' : + $docProps->setCreator(trim($propertyValue)); + $docProps->setLastModifiedBy(trim($propertyValue)); + break; + case 'company' : + $docProps->setCompany(trim($propertyValue)); + break; + } + } + } + + $worksheetID = 0; + foreach($gnmXML->Sheets->Sheet as $sheet) { + $worksheetName = (string) $sheet->Name; +// echo '<b>Worksheet: ',$worksheetName,'</b><br />'; + if ((isset($this->_loadSheetsOnly)) && (!in_array($worksheetName, $this->_loadSheetsOnly))) { + continue; + } + + $maxRow = $maxCol = 0; + + // Create new Worksheet + $objPHPExcel->createSheet(); + $objPHPExcel->setActiveSheetIndex($worksheetID); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula + // cells... during the load, all formulae should be correct, and we're simply bringing the worksheet + // name in line with the formula, not the reverse + $objPHPExcel->getActiveSheet()->setTitle($worksheetName,false); + + if ((!$this->_readDataOnly) && (isset($sheet->PrintInformation))) { + if (isset($sheet->PrintInformation->Margins)) { + foreach($sheet->PrintInformation->Margins->children('gnm',TRUE) as $key => $margin) { + $marginAttributes = $margin->attributes(); + $marginSize = 72 / 100; // Default + switch($marginAttributes['PrefUnit']) { + case 'mm' : + $marginSize = intval($marginAttributes['Points']) / 100; + break; + } + switch($key) { + case 'top' : + $objPHPExcel->getActiveSheet()->getPageMargins()->setTop($marginSize); + break; + case 'bottom' : + $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom($marginSize); + break; + case 'left' : + $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft($marginSize); + break; + case 'right' : + $objPHPExcel->getActiveSheet()->getPageMargins()->setRight($marginSize); + break; + case 'header' : + $objPHPExcel->getActiveSheet()->getPageMargins()->setHeader($marginSize); + break; + case 'footer' : + $objPHPExcel->getActiveSheet()->getPageMargins()->setFooter($marginSize); + break; + } + } + } + } + + foreach($sheet->Cells->Cell as $cell) { + $cellAttributes = $cell->attributes(); + $row = (int) $cellAttributes->Row + 1; + $column = (int) $cellAttributes->Col; + + if ($row > $maxRow) $maxRow = $row; + if ($column > $maxCol) $maxCol = $column; + + $column = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if ($this->getReadFilter() !== NULL) { + if (!$this->getReadFilter()->readCell($column, $row, $worksheetName)) { + continue; + } + } + + $ValueType = $cellAttributes->ValueType; + $ExprID = (string) $cellAttributes->ExprID; +// echo 'Cell ',$column,$row,'<br />'; +// echo 'Type is ',$ValueType,'<br />'; +// echo 'Value is ',$cell,'<br />'; + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; + if ($ExprID > '') { + if (((string) $cell) > '') { + + $this->_expressions[$ExprID] = array( 'column' => $cellAttributes->Col, + 'row' => $cellAttributes->Row, + 'formula' => (string) $cell + ); +// echo 'NEW EXPRESSION ',$ExprID,'<br />'; + } else { + $expression = $this->_expressions[$ExprID]; + + $cell = $this->_referenceHelper->updateFormulaReferences( $expression['formula'], + 'A1', + $cellAttributes->Col - $expression['column'], + $cellAttributes->Row - $expression['row'], + $worksheetName + ); +// echo 'SHARED EXPRESSION ',$ExprID,'<br />'; +// echo 'New Value is ',$cell,'<br />'; + } + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; + } else { + switch($ValueType) { + case '10' : // NULL + $type = PHPExcel_Cell_DataType::TYPE_NULL; + break; + case '20' : // Boolean + $type = PHPExcel_Cell_DataType::TYPE_BOOL; + $cell = ($cell == 'TRUE') ? True : False; + break; + case '30' : // Integer + $cell = intval($cell); + case '40' : // Float + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + break; + case '50' : // Error + $type = PHPExcel_Cell_DataType::TYPE_ERROR; + break; + case '60' : // String + $type = PHPExcel_Cell_DataType::TYPE_STRING; + break; + case '70' : // Cell Range + case '80' : // Array + } + } + $objPHPExcel->getActiveSheet()->getCell($column.$row)->setValueExplicit($cell,$type); + } + + if ((!$this->_readDataOnly) && (isset($sheet->Objects))) { + foreach($sheet->Objects->children('gnm',TRUE) as $key => $comment) { + $commentAttributes = $comment->attributes(); + // Only comment objects are handled at the moment + if ($commentAttributes->Text) { + $objPHPExcel->getActiveSheet()->getComment( (string)$commentAttributes->ObjectBound ) + ->setAuthor( (string)$commentAttributes->Author ) + ->setText($this->_parseRichText((string)$commentAttributes->Text) ); + } + } + } +// echo '$maxCol=',$maxCol,'; $maxRow=',$maxRow,'<br />'; +// + foreach($sheet->Styles->StyleRegion as $styleRegion) { + $styleAttributes = $styleRegion->attributes(); + if (($styleAttributes['startRow'] <= $maxRow) && + ($styleAttributes['startCol'] <= $maxCol)) { + + $startColumn = PHPExcel_Cell::stringFromColumnIndex((int) $styleAttributes['startCol']); + $startRow = $styleAttributes['startRow'] + 1; + + $endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol']; + $endColumn = PHPExcel_Cell::stringFromColumnIndex($endColumn); + $endRow = ($styleAttributes['endRow'] > $maxRow) ? $maxRow : $styleAttributes['endRow']; + $endRow += 1; + $cellRange = $startColumn.$startRow.':'.$endColumn.$endRow; +// echo $cellRange,'<br />'; + + $styleAttributes = $styleRegion->Style->attributes(); +// var_dump($styleAttributes); +// echo '<br />'; + + // We still set the number format mask for date/time values, even if _readDataOnly is true + if ((!$this->_readDataOnly) || + (PHPExcel_Shared_Date::isDateTimeFormatCode($styleArray['numberformat']['code']))) { + $styleArray = array(); + $styleArray['numberformat']['code'] = (string) $styleAttributes['Format']; + // If _readDataOnly is false, we set all formatting information + if (!$this->_readDataOnly) { + switch($styleAttributes['HAlign']) { + case '1' : + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + break; + case '2' : + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_LEFT; + break; + case '4' : + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_RIGHT; + break; + case '8' : + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_CENTER; + break; + case '16' : + case '64' : + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS; + break; + case '32' : + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY; + break; + } + + switch($styleAttributes['VAlign']) { + case '1' : + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_TOP; + break; + case '2' : + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_BOTTOM; + break; + case '4' : + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_CENTER; + break; + case '8' : + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_JUSTIFY; + break; + } + + $styleArray['alignment']['wrap'] = ($styleAttributes['WrapText'] == '1') ? True : False; + $styleArray['alignment']['shrinkToFit'] = ($styleAttributes['ShrinkToFit'] == '1') ? True : False; + $styleArray['alignment']['indent'] = (intval($styleAttributes["Indent"]) > 0) ? $styleAttributes["indent"] : 0; + + $RGB = self::_parseGnumericColour($styleAttributes["Fore"]); + $styleArray['font']['color']['rgb'] = $RGB; + $RGB = self::_parseGnumericColour($styleAttributes["Back"]); + $shade = $styleAttributes["Shade"]; + if (($RGB != '000000') || ($shade != '0')) { + $styleArray['fill']['color']['rgb'] = $styleArray['fill']['startcolor']['rgb'] = $RGB; + $RGB2 = self::_parseGnumericColour($styleAttributes["PatternColor"]); + $styleArray['fill']['endcolor']['rgb'] = $RGB2; + switch($shade) { + case '1' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_SOLID; + break; + case '2' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR; + break; + case '3' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_GRADIENT_PATH; + break; + case '4' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN; + break; + case '5' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY; + break; + case '6' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID; + break; + case '7' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL; + break; + case '8' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS; + break; + case '9' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKUP; + break; + case '10' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL; + break; + case '11' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625; + break; + case '12' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_GRAY125; + break; + case '13' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN; + break; + case '14' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY; + break; + case '15' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID; + break; + case '16' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL; + break; + case '17' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS; + break; + case '18' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP; + break; + case '19' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL; + break; + case '20' : + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY; + break; + } + } + + $fontAttributes = $styleRegion->Style->Font->attributes(); +// var_dump($fontAttributes); +// echo '<br />'; + $styleArray['font']['name'] = (string) $styleRegion->Style->Font; + $styleArray['font']['size'] = intval($fontAttributes['Unit']); + $styleArray['font']['bold'] = ($fontAttributes['Bold'] == '1') ? True : False; + $styleArray['font']['italic'] = ($fontAttributes['Italic'] == '1') ? True : False; + $styleArray['font']['strike'] = ($fontAttributes['StrikeThrough'] == '1') ? True : False; + switch($fontAttributes['Underline']) { + case '1' : + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_SINGLE; + break; + case '2' : + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_DOUBLE; + break; + case '3' : + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING; + break; + case '4' : + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING; + break; + default : + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_NONE; + break; + } + switch($fontAttributes['Script']) { + case '1' : + $styleArray['font']['superScript'] = True; + break; + case '-1' : + $styleArray['font']['subScript'] = True; + break; + } + + if (isset($styleRegion->Style->StyleBorder)) { + if (isset($styleRegion->Style->StyleBorder->Top)) { + $styleArray['borders']['top'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->Top->attributes()); + } + if (isset($styleRegion->Style->StyleBorder->Bottom)) { + $styleArray['borders']['bottom'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->Bottom->attributes()); + } + if (isset($styleRegion->Style->StyleBorder->Left)) { + $styleArray['borders']['left'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->Left->attributes()); + } + if (isset($styleRegion->Style->StyleBorder->Right)) { + $styleArray['borders']['right'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->Right->attributes()); + } + if ((isset($styleRegion->Style->StyleBorder->Diagonal)) && (isset($styleRegion->Style->StyleBorder->{'Rev-Diagonal'}))) { + $styleArray['borders']['diagonal'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->Diagonal->attributes()); + $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_BOTH; + } elseif (isset($styleRegion->Style->StyleBorder->Diagonal)) { + $styleArray['borders']['diagonal'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->Diagonal->attributes()); + $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_UP; + } elseif (isset($styleRegion->Style->StyleBorder->{'Rev-Diagonal'})) { + $styleArray['borders']['diagonal'] = self::_parseBorderAttributes($styleRegion->Style->StyleBorder->{'Rev-Diagonal'}->attributes()); + $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_DOWN; + } + } + if (isset($styleRegion->Style->HyperLink)) { + // TO DO + $hyperlink = $styleRegion->Style->HyperLink->attributes(); + } + } +// var_dump($styleArray); +// echo '<br />'; + $objPHPExcel->getActiveSheet()->getStyle($cellRange)->applyFromArray($styleArray); + } + } + } + + if ((!$this->_readDataOnly) && (isset($sheet->Cols))) { + // Column Widths + $columnAttributes = $sheet->Cols->attributes(); + $defaultWidth = $columnAttributes['DefaultSizePts'] / 5.4; + $c = 0; + foreach($sheet->Cols->ColInfo as $columnOverride) { + $columnAttributes = $columnOverride->attributes(); + $column = $columnAttributes['No']; + $columnWidth = $columnAttributes['Unit'] / 5.4; + $hidden = ((isset($columnAttributes['Hidden'])) && ($columnAttributes['Hidden'] == '1')) ? true : false; + $columnCount = (isset($columnAttributes['Count'])) ? $columnAttributes['Count'] : 1; + while ($c < $column) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($defaultWidth); + ++$c; + } + while (($c < ($column+$columnCount)) && ($c <= $maxCol)) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($columnWidth); + if ($hidden) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setVisible(false); + } + ++$c; + } + } + while ($c <= $maxCol) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($defaultWidth); + ++$c; + } + } + + if ((!$this->_readDataOnly) && (isset($sheet->Rows))) { + // Row Heights + $rowAttributes = $sheet->Rows->attributes(); + $defaultHeight = $rowAttributes['DefaultSizePts']; + $r = 0; + + foreach($sheet->Rows->RowInfo as $rowOverride) { + $rowAttributes = $rowOverride->attributes(); + $row = $rowAttributes['No']; + $rowHeight = $rowAttributes['Unit']; + $hidden = ((isset($rowAttributes['Hidden'])) && ($rowAttributes['Hidden'] == '1')) ? true : false; + $rowCount = (isset($rowAttributes['Count'])) ? $rowAttributes['Count'] : 1; + while ($r < $row) { + ++$r; + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight); + } + while (($r < ($row+$rowCount)) && ($r < $maxRow)) { + ++$r; + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($rowHeight); + if ($hidden) { + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setVisible(false); + } + } + } + while ($r < $maxRow) { + ++$r; + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight); + } + } + + // Handle Merged Cells in this worksheet + if (isset($sheet->MergedRegions)) { + foreach($sheet->MergedRegions->Merge as $mergeCells) { + if (strpos($mergeCells,':') !== FALSE) { + $objPHPExcel->getActiveSheet()->mergeCells($mergeCells); + } + } + } + + $worksheetID++; + } + + // Loop through definedNames (global named ranges) + if (isset($gnmXML->Names)) { + foreach($gnmXML->Names->Name as $namedRange) { + $name = (string) $namedRange->name; + $range = (string) $namedRange->value; + if (stripos($range, '#REF!') !== false) { + continue; + } + + $range = explode('!',$range); + $range[0] = trim($range[0],"'");; + if ($worksheet = $objPHPExcel->getSheetByName($range[0])) { + $extractedRange = str_replace('$', '', $range[1]); + $objPHPExcel->addNamedRange( new PHPExcel_NamedRange($name, $worksheet, $extractedRange) ); + } + } + } + + + // Return + return $objPHPExcel; + } + + + private static function _parseBorderAttributes($borderAttributes) + { + $styleArray = array(); + + if (isset($borderAttributes["Color"])) { + $RGB = self::_parseGnumericColour($borderAttributes["Color"]); + $styleArray['color']['rgb'] = $RGB; + } + + switch ($borderAttributes["Style"]) { + case '0' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_NONE; + break; + case '1' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case '2' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUM; + break; + case '4' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHED; + break; + case '5' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_THICK; + break; + case '6' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DOUBLE; + break; + case '7' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DOTTED; + break; + case '9' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHDOT; + break; + case '10' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT; + break; + case '11' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHDOTDOT; + break; + case '12' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT; + break; + case '13' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT; + break; + case '3' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_SLANTDASHDOT; + break; + case '8' : + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHED; + break; + } + return $styleArray; + } + + + private function _parseRichText($is = '') { + $value = new PHPExcel_RichText(); + + $value->createText($is); + + return $value; + } + + + private static function _parseGnumericColour($gnmColour) { + list($gnmR,$gnmG,$gnmB) = explode(':',$gnmColour); + $gnmR = substr(str_pad($gnmR,4,'0',STR_PAD_RIGHT),0,2); + $gnmG = substr(str_pad($gnmG,4,'0',STR_PAD_RIGHT),0,2); + $gnmB = substr(str_pad($gnmB,4,'0',STR_PAD_RIGHT),0,2); + $RGB = $gnmR.$gnmG.$gnmB; +// echo 'Excel Colour: ',$RGB,'<br />'; + return $RGB; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/HTML.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/HTML.php new file mode 100644 index 000000000..d6068eaa4 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/HTML.php @@ -0,0 +1,499 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_HTML + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Reader_HTML implements PHPExcel_Reader_IReader +{ + /** + * Input encoding + * + * @var string + */ + private $_inputEncoding = 'ANSI'; + + /** + * Sheet index to read + * + * @var int + */ + private $_sheetIndex = 0; + + /** + * Formats + * + * @var array + */ + private $_formats = array( 'h1' => array( 'font' => array( 'bold' => true, + 'size' => 24, + ), + ), // Bold, 24pt + 'h2' => array( 'font' => array( 'bold' => true, + 'size' => 18, + ), + ), // Bold, 18pt + 'h3' => array( 'font' => array( 'bold' => true, + 'size' => 13.5, + ), + ), // Bold, 13.5pt + 'h4' => array( 'font' => array( 'bold' => true, + 'size' => 12, + ), + ), // Bold, 12pt + 'h5' => array( 'font' => array( 'bold' => true, + 'size' => 10, + ), + ), // Bold, 10pt + 'h6' => array( 'font' => array( 'bold' => true, + 'size' => 7.5, + ), + ), // Bold, 7.5pt + 'a' => array( 'font' => array( 'underline' => true, + 'color' => array( 'argb' => PHPExcel_Style_Color::COLOR_BLUE, + ), + ), + ), // Blue underlined + 'hr' => array( 'borders' => array( 'bottom' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, + 'color' => array( PHPExcel_Style_Color::COLOR_BLACK, + ), + ), + ), + ), // Bottom border + ); + + /** + * PHPExcel_Reader_IReadFilter instance + * + * @var PHPExcel_Reader_IReadFilter + */ + private $_readFilter = null; + + + /** + * Create a new PHPExcel_Reader_HTML + */ + public function __construct() { + $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Read sample data (first 2 KB will do) + $fh = fopen($pFilename, 'r'); + $data = fread($fh, 2048); + fclose($fh); + + return true; + } + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + /** + * Set input encoding + * + * @param string $pValue Input encoding + */ + public function setInputEncoding($pValue = 'ANSI') + { + $this->_inputEncoding = $pValue; + return $this; + } + + /** + * Get input encoding + * + * @return string + */ + public function getInputEncoding() + { + return $this->_inputEncoding; + } + + // Data Array used for testing only, should write to PHPExcel object on completion of tests + private $_dataArray = array(); + + private $_tableLevel = 0; + private $_nestedColumn = array('A'); + + private function _setTableStartColumn($column) { + if ($this->_tableLevel == 0) + $column = 'A'; + ++$this->_tableLevel; + $this->_nestedColumn[$this->_tableLevel] = $column; + + return $this->_nestedColumn[$this->_tableLevel]; + } + + private function _getTableStartColumn() { + return $this->_nestedColumn[$this->_tableLevel]; + } + + private function _releaseTableStartColumn() { + --$this->_tableLevel; + return array_pop($this->_nestedColumn); + } + + private function _flushCell($sheet,$column,$row,&$cellContent) { + if (is_string($cellContent)) { + // Simple String content + if (trim($cellContent) > '') { + // Only actually write it if there's content in the string + echo 'FLUSH CELL: ' , $column , $row , ' => ' , $cellContent , '<br />'; + // Write to worksheet to be done here... + // ... we return the cell so we can mess about with styles more easily + $cell = $sheet->setCellValue($column.$row,$cellContent,true); + $this->_dataArray[$row][$column] = $cellContent; + } + } else { + // We have a Rich Text run + // TODO + $this->_dataArray[$row][$column] = 'RICH TEXT: ' . $cellContent; + } + $cellContent = (string) ''; + } + + private function _processDomElement(DOMNode $element, $sheet, &$row, &$column, &$cellContent){ + foreach($element->childNodes as $child){ + if ($child instanceOf DOMText) { + $domText = preg_replace('/\s+/',' ',trim($child->nodeValue)); + if (is_string($cellContent)) { + // simply append the text if the cell content is a plain text string + $cellContent .= $domText; + } else { + // but if we have a rich text run instead, we need to append it correctly + // TODO + } + } elseif($child instanceOf DOMElement) { + echo '<b>DOM ELEMENT: </b>' , strtoupper($child->nodeName) , '<br />'; + + $attributeArray = array(); + foreach($child->attributes as $attribute) { + echo '<b>ATTRIBUTE: </b>' , $attribute->name , ' => ' , $attribute->value , '<br />'; + $attributeArray[$attribute->name] = $attribute->value; + } + + switch($child->nodeName) { + case 'meta' : + foreach($attributeArray as $attributeName => $attributeValue) { + switch($attributeName) { + case 'content': + // TODO + // Extract character set, so we can convert to UTF-8 if required + break; + } + } + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + break; + case 'title' : + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + $sheet->setTitle($cellContent); + $cellContent = ''; + break; + case 'span' : + case 'div' : + case 'font' : + case 'i' : + case 'em' : + case 'strong': + case 'b' : + echo 'STYLING, SPAN OR DIV<br />'; + if ($cellContent > '') + $cellContent .= ' '; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + if ($cellContent > '') + $cellContent .= ' '; + echo 'END OF STYLING, SPAN OR DIV<br />'; + break; + case 'hr' : + $this->_flushCell($sheet,$column,$row,$cellContent); + ++$row; + if (isset($this->_formats[$child->nodeName])) { + $sheet->getStyle($column.$row)->applyFromArray($this->_formats[$child->nodeName]); + } else { + $cellContent = '----------'; + $this->_flushCell($sheet,$column,$row,$cellContent); + } + ++$row; + case 'br' : + if ($this->_tableLevel > 0) { + // If we're inside a table, replace with a \n + $cellContent .= "\n"; + } else { + // Otherwise flush our existing content and move the row cursor on + $this->_flushCell($sheet,$column,$row,$cellContent); + ++$row; + } + echo 'HARD LINE BREAK: ' , '<br />'; + break; + case 'a' : + echo 'START OF HYPERLINK: ' , '<br />'; + foreach($attributeArray as $attributeName => $attributeValue) { + switch($attributeName) { + case 'href': + echo 'Link to ' , $attributeValue , '<br />'; + $sheet->getCell($column.$row)->getHyperlink()->setUrl($attributeValue); + if (isset($this->_formats[$child->nodeName])) { + $sheet->getStyle($column.$row)->applyFromArray($this->_formats[$child->nodeName]); + } + break; + } + } + $cellContent .= ' '; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF HYPERLINK:' , '<br />'; + break; + case 'h1' : + case 'h2' : + case 'h3' : + case 'h4' : + case 'h5' : + case 'h6' : + case 'ol' : + case 'ul' : + case 'p' : + if ($this->_tableLevel > 0) { + // If we're inside a table, replace with a \n + $cellContent .= "\n"; + echo 'LIST ENTRY: ' , '<br />'; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF LIST ENTRY:' , '<br />'; + } else { + if ($cellContent > '') { + $this->_flushCell($sheet,$column,$row,$cellContent); + $row += 2; + } + echo 'START OF PARAGRAPH: ' , '<br />'; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF PARAGRAPH:' , '<br />'; + $this->_flushCell($sheet,$column,$row,$cellContent); + + if (isset($this->_formats[$child->nodeName])) { + $sheet->getStyle($column.$row)->applyFromArray($this->_formats[$child->nodeName]); + } + + $row += 2; + $column = 'A'; + } + break; + case 'li' : + if ($this->_tableLevel > 0) { + // If we're inside a table, replace with a \n + $cellContent .= "\n"; + echo 'LIST ENTRY: ' , '<br />'; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF LIST ENTRY:' , '<br />'; + } else { + if ($cellContent > '') { + $this->_flushCell($sheet,$column,$row,$cellContent); + } + ++$row; + echo 'LIST ENTRY: ' , '<br />'; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF LIST ENTRY:' , '<br />'; + $this->_flushCell($sheet,$column,$row,$cellContent); + $column = 'A'; + } + break; + case 'table' : + $this->_flushCell($sheet,$column,$row,$cellContent); + $column = $this->_setTableStartColumn($column); + echo 'START OF TABLE LEVEL ' , $this->_tableLevel , '<br />'; + if ($this->_tableLevel > 1) + --$row; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF TABLE LEVEL ' , $this->_tableLevel , '<br />'; + $column = $this->_releaseTableStartColumn(); + if ($this->_tableLevel > 1) { + ++$column; + } else { + ++$row; + } + break; + case 'thead' : + case 'tbody' : + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + break; + case 'tr' : + ++$row; + $column = $this->_getTableStartColumn(); + $cellContent = ''; + echo 'START OF TABLE ' , $this->_tableLevel , ' ROW<br />'; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF TABLE ' , $this->_tableLevel , ' ROW<br />'; + break; + case 'th' : + case 'td' : + echo 'START OF TABLE ' , $this->_tableLevel , ' CELL<br />'; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + echo 'END OF TABLE ' , $this->_tableLevel , ' CELL<br />'; + $this->_flushCell($sheet,$column,$row,$cellContent); + ++$column; + break; + case 'body' : + $row = 1; + $column = 'A'; + $content = ''; + $this->_tableLevel = 0; + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + break; + default: + $this->_processDomElement($child,$sheet,$row,$column,$cellContent); + } + } + } + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + if (!is_file($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! The given file is not a regular file."); + } + + // Create new PHPExcel + while ($objPHPExcel->getSheetCount() <= $this->_sheetIndex) { + $objPHPExcel->createSheet(); + } + $objPHPExcel->setActiveSheetIndex( $this->_sheetIndex ); + + // Create a new DOM object + $dom = new domDocument; + // Load the HTML file into the DOM object + $loaded = $dom->loadHTMLFile($pFilename); + if ($loaded === false) { + throw new Exception('Failed to load ',$pFilename,' as a DOM Document'); + } + + // Discard white space + $dom->preserveWhiteSpace = false; + + + $row = 0; + $column = 'A'; + $content = ''; + $this->_processDomElement($dom,$objPHPExcel->getActiveSheet(),$row,$column,$content); + + echo '<hr />'; + var_dump($this->_dataArray); + + // Return + return $objPHPExcel; + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() { + return $this->_sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Reader_HTML + */ + public function setSheetIndex($pValue = 0) { + $this->_sheetIndex = $pValue; + return $this; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/IReadFilter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/IReadFilter.php new file mode 100644 index 000000000..50e92c804 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/IReadFilter.php @@ -0,0 +1,47 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Reader_IReadFilter + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +interface PHPExcel_Reader_IReadFilter +{ + /** + * Should this cell be read? + * + * @param $column String column index + * @param $row Row index + * @param $worksheetName Optional worksheet name + * @return boolean + */ + public function readCell($column, $row, $worksheetName = ''); +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/IReader.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/IReader.php new file mode 100644 index 000000000..1c9884730 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/IReader.php @@ -0,0 +1,53 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Reader_IReader + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +interface PHPExcel_Reader_IReader +{ + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + */ + public function canRead($pFilename); + + /** + * Loads PHPExcel from file + * + * @param string $pFileName + * @throws Exception + */ + public function load($pFilename); +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/OOCalc.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/OOCalc.php new file mode 100644 index 000000000..22ad1173b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/OOCalc.php @@ -0,0 +1,733 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_OOCalc + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader +{ + /** + * Read data only? + * Identifies whether the Reader should only read data values for cells, and ignore any formatting information; + * or whether it should read both data and formatting + * + * @var boolean + */ + private $_readDataOnly = false; + + /** + * Restrict which sheets should be loaded? + * This property holds an array of worksheet names to be loaded. If null, then all worksheets will be loaded. + * + * @var array of string + */ + private $_loadSheetsOnly = null; + + /** + * Formats + * + * @var array + */ + private $_styles = array(); + + /** + * PHPExcel_Reader_IReadFilter instance + * + * @var PHPExcel_Reader_IReadFilter + */ + private $_readFilter = null; + + + /** + * Create a new PHPExcel_Reader_OOCalc + */ + public function __construct() { + $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + + /** + * Read data only? + * If this is true, then the Reader will only read data values for cells, it will not read any formatting information. + * If false (the default) it will read data and formatting. + * + * @return boolean + */ + public function getReadDataOnly() { + return $this->_readDataOnly; + } + + + /** + * Set read data only + * Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information. + * Set to false (the default) to advise the Reader to read both data and formatting for cells. + * + * @param boolean $pValue + * @return PHPExcel_Reader_OOCalc + */ + public function setReadDataOnly($pValue = false) { + $this->_readDataOnly = $pValue; + return $this; + } + + + /** + * Get which sheets to load + * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null + * indicating that all worksheets in the workbook should be loaded. + * + * @return mixed + */ + public function getLoadSheetsOnly() + { + return $this->_loadSheetsOnly; + } + + + /** + * Set which sheets to load + * + * @param mixed $value + * This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name. + * If NULL, then it tells the Reader to read all worksheets in the workbook + * + * @return PHPExcel_Reader_OOCalc + */ + public function setLoadSheetsOnly($value = null) + { + $this->_loadSheetsOnly = is_array($value) ? + $value : array($value); + return $this; + } + + + /** + * Set all sheets to load + * Tells the Reader to load all worksheets from the workbook. + * + * @return PHPExcel_Reader_OOCalc + */ + public function setLoadAllSheets() + { + $this->_loadSheetsOnly = null; + return $this; + } + + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + * @return PHPExcel_Reader_OOCalc + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Check if zip class exists + if (!class_exists('ZipArchive',FALSE)) { + throw new Exception("ZipArchive library is not enabled"); + } + + // Load file + $zip = new ZipArchive; + if ($zip->open($pFilename) === true) { + // check if it is an OOXML archive + $stat = $zip->statName('mimetype'); + if ($stat && ($stat['size'] <= 255)) { + $mimeType = $zip->getFromName($stat['name']); + } else { + $zip->close(); + return FALSE; + } + + $zip->close(); + + return ($mimeType === 'application/vnd.oasis.opendocument.spreadsheet'); + } + + return FALSE; + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetNames = array(); + + $zip = new ZipArchive; + if ($zip->open($pFilename) === true) { + + $xml = simplexml_load_string($zip->getFromName("content.xml")); + $namespacesContent = $xml->getNamespaces(true); + + $workbook = $xml->children($namespacesContent['office']); + foreach($workbook->body->spreadsheet as $workbookData) { + $workbookData = $workbookData->children($namespacesContent['table']); + foreach($workbookData->table as $worksheetDataSet) { + $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']); + + $worksheetNames[] = $worksheetDataAttributes['name']; + } + } + } + + return $worksheetNames; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + + private static function identifyFixedStyleValue($styleList,&$styleAttributeValue) { + $styleAttributeValue = strtolower($styleAttributeValue); + foreach($styleList as $style) { + if ($styleAttributeValue == strtolower($style)) { + $styleAttributeValue = $style; + return true; + } + } + return false; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + $zip = new ZipArchive; + if ($zip->open($pFilename) === true) { + + $xml = simplexml_load_string($zip->getFromName("content.xml")); + $namespacesContent = $xml->getNamespaces(true); + + $workbook = $xml->children($namespacesContent['office']); + foreach($workbook->body->spreadsheet as $workbookData) { + $workbookData = $workbookData->children($namespacesContent['table']); + foreach($workbookData->table as $worksheetDataSet) { + $worksheetData = $worksheetDataSet->children($namespacesContent['table']); + $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']); + + $tmpInfo = array(); + $tmpInfo['worksheetName'] = (string) $worksheetDataAttributes['name']; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + $rowIndex = 0; + foreach ($worksheetData as $key => $rowData) { + switch ($key) { + case 'table-row' : + $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']); + $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ? + $rowDataTableAttributes['number-rows-repeated'] : 1; + $columnIndex = 0; + + foreach ($rowData as $key => $cellData) { + $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']); + $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ? + $cellDataTableAttributes['number-columns-repeated'] : 1; + $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']); + if (isset($cellDataOfficeAttributes['value-type'])) { + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex + $colRepeats - 1); + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex + $rowRepeats); + } + $columnIndex += $colRepeats; + } + $rowIndex += $rowRepeats; + break; + } + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + } + } + } + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + + $zip = new ZipArchive; + if ($zip->open($pFilename) === true) { +// echo '<h1>Meta Information</h1>'; + $xml = simplexml_load_string($zip->getFromName("meta.xml")); + $namespacesMeta = $xml->getNamespaces(true); +// echo '<pre>'; +// print_r($namespacesMeta); +// echo '</pre><hr />'; + + $docProps = $objPHPExcel->getProperties(); + $officeProperty = $xml->children($namespacesMeta['office']); + foreach($officeProperty as $officePropertyData) { + $officePropertyDC = array(); + if (isset($namespacesMeta['dc'])) { + $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']); + } + foreach($officePropertyDC as $propertyName => $propertyValue) { + switch ($propertyName) { + case 'title' : + $docProps->setTitle($propertyValue); + break; + case 'subject' : + $docProps->setSubject($propertyValue); + break; + case 'creator' : + $docProps->setCreator($propertyValue); + $docProps->setLastModifiedBy($propertyValue); + break; + case 'date' : + $creationDate = strtotime($propertyValue); + $docProps->setCreated($creationDate); + $docProps->setModified($creationDate); + break; + case 'description' : + $docProps->setDescription($propertyValue); + break; + } + } + $officePropertyMeta = array(); + if (isset($namespacesMeta['dc'])) { + $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); + } + foreach($officePropertyMeta as $propertyName => $propertyValue) { + $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']); + switch ($propertyName) { + case 'initial-creator' : + $docProps->setCreator($propertyValue); + break; + case 'keyword' : + $docProps->setKeywords($propertyValue); + break; + case 'creation-date' : + $creationDate = strtotime($propertyValue); + $docProps->setCreated($creationDate); + break; + case 'user-defined' : + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING; + foreach ($propertyValueAttributes as $key => $value) { + if ($key == 'name') { + $propertyValueName = (string) $value; + } elseif($key == 'value-type') { + switch ($value) { + case 'date' : + $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'date'); + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE; + break; + case 'boolean' : + $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'bool'); + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN; + break; + case 'float' : + $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue,'r4'); + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT; + break; + default : + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING; + } + } + } + $docProps->setCustomProperty($propertyValueName,$propertyValue,$propertyValueType); + break; + } + } + } + + +// echo '<h1>Workbook Content</h1>'; + $xml = simplexml_load_string($zip->getFromName("content.xml")); + $namespacesContent = $xml->getNamespaces(true); +// echo '<pre>'; +// print_r($namespacesContent); +// echo '</pre><hr />'; + + $workbook = $xml->children($namespacesContent['office']); + foreach($workbook->body->spreadsheet as $workbookData) { + $workbookData = $workbookData->children($namespacesContent['table']); + $worksheetID = 0; + foreach($workbookData->table as $worksheetDataSet) { + $worksheetData = $worksheetDataSet->children($namespacesContent['table']); +// print_r($worksheetData); +// echo '<br />'; + $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']); +// print_r($worksheetDataAttributes); +// echo '<br />'; + if ((isset($this->_loadSheetsOnly)) && (isset($worksheetDataAttributes['name'])) && + (!in_array($worksheetDataAttributes['name'], $this->_loadSheetsOnly))) { + continue; + } + +// echo '<h2>Worksheet '.$worksheetDataAttributes['name'].'</h2>'; + // Create new Worksheet + $objPHPExcel->createSheet(); + $objPHPExcel->setActiveSheetIndex($worksheetID); + if (isset($worksheetDataAttributes['name'])) { + $worksheetName = (string) $worksheetDataAttributes['name']; + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in + // formula cells... during the load, all formulae should be correct, and we're simply + // bringing the worksheet name in line with the formula, not the reverse + $objPHPExcel->getActiveSheet()->setTitle($worksheetName,false); + } + + $rowID = 1; + foreach($worksheetData as $key => $rowData) { +// echo '<b>'.$key.'</b><br />'; + switch ($key) { + case 'table-header-rows': + foreach ($rowData as $key=>$cellData) { + $rowData = $cellData; + break; + } + case 'table-row' : + $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']); + $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ? + $rowDataTableAttributes['number-rows-repeated'] : 1; + $columnID = 'A'; + foreach($rowData as $key => $cellData) { + if ($this->getReadFilter() !== NULL) { + if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { + continue; + } + } + +// echo '<b>'.$columnID.$rowID.'</b><br />'; + $cellDataText = (isset($namespacesContent['text'])) ? + $cellData->children($namespacesContent['text']) : + ''; + $cellDataOffice = $cellData->children($namespacesContent['office']); + $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']); + $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']); + +// echo 'Office Attributes: '; +// print_r($cellDataOfficeAttributes); +// echo '<br />Table Attributes: '; +// print_r($cellDataTableAttributes); +// echo '<br />Cell Data Text'; +// print_r($cellDataText); +// echo '<br />'; +// + $type = $formatting = $hyperlink = null; + $hasCalculatedValue = false; + $cellDataFormula = ''; + if (isset($cellDataTableAttributes['formula'])) { + $cellDataFormula = $cellDataTableAttributes['formula']; + $hasCalculatedValue = true; + } + + if (isset($cellDataOffice->annotation)) { +// echo 'Cell has comment<br />'; + $annotationText = $cellDataOffice->annotation->children($namespacesContent['text']); + $textArray = array(); + foreach($annotationText as $t) { + foreach($t->span as $text) { + $textArray[] = (string)$text; + } + } + $text = implode("\n",$textArray); +// echo $text,'<br />'; + $objPHPExcel->getActiveSheet()->getComment( $columnID.$rowID ) +// ->setAuthor( $author ) + ->setText($this->_parseRichText($text) ); + } + + if (isset($cellDataText->p)) { + // Consolidate if there are multiple p records (maybe with spans as well) + $dataArray = array(); + // Text can have multiple text:p and within those, multiple text:span. + // text:p newlines, but text:span does not. + // Also, here we assume there is no text data is span fields are specified, since + // we have no way of knowing proper positioning anyway. + foreach ($cellDataText->p as $pData) { + if (isset($pData->span)) { + // span sections do not newline, so we just create one large string here + $spanSection = ""; + foreach ($pData->span as $spanData) { + $spanSection .= $spanData; + } + array_push($dataArray, $spanSection); + } else { + array_push($dataArray, $pData); + } + } + $allCellDataText = implode($dataArray, "\n"); + +// echo 'Value Type is '.$cellDataOfficeAttributes['value-type'].'<br />'; + switch ($cellDataOfficeAttributes['value-type']) { + case 'string' : + $type = PHPExcel_Cell_DataType::TYPE_STRING; + $dataValue = $allCellDataText; + if (isset($dataValue->a)) { + $dataValue = $dataValue->a; + $cellXLinkAttributes = $dataValue->attributes($namespacesContent['xlink']); + $hyperlink = $cellXLinkAttributes['href']; + } + break; + case 'boolean' : + $type = PHPExcel_Cell_DataType::TYPE_BOOL; + $dataValue = ($allCellDataText == 'TRUE') ? True : False; + break; + case 'percentage' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = (float) $cellDataOfficeAttributes['value']; + if (floor($dataValue) == $dataValue) { + $dataValue = (integer) $dataValue; + } + $formatting = PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00; + break; + case 'currency' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = (float) $cellDataOfficeAttributes['value']; + if (floor($dataValue) == $dataValue) { + $dataValue = (integer) $dataValue; + } + $formatting = PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE; + break; + case 'float' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = (float) $cellDataOfficeAttributes['value']; + if (floor($dataValue) == $dataValue) { + if ($dataValue = (integer) $dataValue) + $dataValue = (integer) $dataValue; + else + $dataValue = (float) $dataValue; + } + break; + case 'date' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT); + $dateObj->setTimeZone($timezoneObj); + list($year,$month,$day,$hour,$minute,$second) = explode(' ',$dateObj->format('Y m d H i s')); + $dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year,$month,$day,$hour,$minute,$second); + if ($dataValue != floor($dataValue)) { + $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15.' '.PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4; + } else { + $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15; + } + break; + case 'time' : + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = PHPExcel_Shared_Date::PHPToExcel(strtotime('01-01-1970 '.implode(':',sscanf($cellDataOfficeAttributes['time-value'],'PT%dH%dM%dS')))); + $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4; + break; + } +// echo 'Data value is '.$dataValue.'<br />'; +// if ($hyperlink !== NULL) { +// echo 'Hyperlink is '.$hyperlink.'<br />'; +// } + } else { + $type = PHPExcel_Cell_DataType::TYPE_NULL; + $dataValue = NULL; + } + + if ($hasCalculatedValue) { + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; +// echo 'Formula: '.$cellDataFormula.'<br />'; + $cellDataFormula = substr($cellDataFormula,strpos($cellDataFormula,':=')+1); + $temp = explode('"',$cellDataFormula); + $tKey = false; + foreach($temp as &$value) { + // Only replace in alternate array entries (i.e. non-quoted blocks) + if ($tKey = !$tKey) { + $value = preg_replace('/\[\.(.*):\.(.*)\]/Ui','$1:$2',$value); + $value = preg_replace('/\[\.(.*)\]/Ui','$1',$value); + $value = PHPExcel_Calculation::_translateSeparator(';',',',$value,$inBraces); + } + } + unset($value); + // Then rebuild the formula string + $cellDataFormula = implode('"',$temp); +// echo 'Adjusted Formula: '.$cellDataFormula.'<br />'; + } + + $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ? + $cellDataTableAttributes['number-columns-repeated'] : 1; + if ($type !== NULL) { + for ($i = 0; $i < $colRepeats; ++$i) { + if ($i > 0) { + ++$columnID; + } + if ($type !== PHPExcel_Cell_DataType::TYPE_NULL) { + for ($rowAdjust = 0; $rowAdjust < $rowRepeats; ++$rowAdjust) { + $rID = $rowID + $rowAdjust; + $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $dataValue),$type); + if ($hasCalculatedValue) { +// echo 'Forumla result is '.$dataValue.'<br />'; + $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setCalculatedValue($dataValue); + } + if ($formatting !== NULL) { + $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode($formatting); + } else { + $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_GENERAL); + } + if ($hyperlink !== NULL) { + $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->getHyperlink()->setUrl($hyperlink); + } + } + } + } + } + + // Merged cells + if ((isset($cellDataTableAttributes['number-columns-spanned'])) || (isset($cellDataTableAttributes['number-rows-spanned']))) { + if (($type !== PHPExcel_Cell_DataType::TYPE_NULL) || (!$this->_readDataOnly)) { + $columnTo = $columnID; + if (isset($cellDataTableAttributes['number-columns-spanned'])) { + $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cellDataTableAttributes['number-columns-spanned'] -2); + } + $rowTo = $rowID; + if (isset($cellDataTableAttributes['number-rows-spanned'])) { + $rowTo = $rowTo + $cellDataTableAttributes['number-rows-spanned'] - 1; + } + $cellRange = $columnID.$rowID.':'.$columnTo.$rowTo; + $objPHPExcel->getActiveSheet()->mergeCells($cellRange); + } + } + + ++$columnID; + } + $rowID += $rowRepeats; + break; + } + } + ++$worksheetID; + } + } + + } + + // Return + return $objPHPExcel; + } + + + private function _parseRichText($is = '') { + $value = new PHPExcel_RichText(); + + $value->createText($is); + + return $value; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Reader/SYLK.php b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/SYLK.php new file mode 100644 index 000000000..47d5703f5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Reader/SYLK.php @@ -0,0 +1,498 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_SYLK + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Reader_SYLK implements PHPExcel_Reader_IReader +{ + /** + * Input encoding + * + * @var string + */ + private $_inputEncoding = 'ANSI'; + + /** + * Sheet index to read + * + * @var int + */ + private $_sheetIndex = 0; + + /** + * Formats + * + * @var array + */ + private $_formats = array(); + + /** + * Format Count + * + * @var int + */ + private $_format = 0; + + /** + * PHPExcel_Reader_IReadFilter instance + * + * @var PHPExcel_Reader_IReadFilter + */ + private $_readFilter = null; + + + /** + * Create a new PHPExcel_Reader_SYLK + */ + public function __construct() { + $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFileName + * @return boolean + * @throws Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Read sample data (first 2 KB will do) + $fh = fopen($pFilename, 'r'); + $data = fread($fh, 2048); + fclose($fh); + + // Count delimiters in file + $delimiterCount = substr_count($data, ';'); + if ($delimiterCount < 1) { + return false; + } + + // Analyze first line looking for ID; signature + $lines = explode("\n", $data); + if (substr($lines[0],0,4) != 'ID;P') { + return false; + } + + return true; + } + + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() { + return $this->_readFilter; + } + + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) { + $this->_readFilter = $pValue; + return $this; + } + + + /** + * Set input encoding + * + * @param string $pValue Input encoding + */ + public function setInputEncoding($pValue = 'ANSI') + { + $this->_inputEncoding = $pValue; + return $this; + } + + + /** + * Get input encoding + * + * @return string + */ + public function getInputEncoding() + { + return $this->_inputEncoding; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Open file + $fileHandle = fopen($pFilename, 'r'); + if ($fileHandle === false) { + throw new Exception("Could not open file " . $pFilename . " for reading."); + } + + $worksheetInfo = array(); + $worksheetInfo[0]['worksheetName'] = 'Worksheet'; + $worksheetInfo[0]['lastColumnLetter'] = 'A'; + $worksheetInfo[0]['lastColumnIndex'] = 0; + $worksheetInfo[0]['totalRows'] = 0; + $worksheetInfo[0]['totalColumns'] = 0; + + // Loop through file + $rowData = array(); + + // loop through one row (line) at a time in the file + $rowIndex = 0; + while (($rowData = fgets($fileHandle)) !== FALSE) { + $columnIndex = 0; + + // convert SYLK encoded $rowData to UTF-8 + $rowData = PHPExcel_Shared_String::SYLKtoUTF8($rowData); + + // explode each row at semicolons while taking into account that literal semicolon (;) + // is escaped like this (;;) + $rowData = explode("\t",str_replace('?',';',str_replace(';',"\t",str_replace(';;','?',rtrim($rowData))))); + + $dataType = array_shift($rowData); + if ($dataType == 'C') { + // Read cell value data + foreach($rowData as $rowDatum) { + switch($rowDatum{0}) { + case 'C' : + case 'X' : + $columnIndex = substr($rowDatum,1) - 1; + break; + case 'R' : + case 'Y' : + $rowIndex = substr($rowDatum,1); + break; + } + + $worksheetInfo[0]['totalRows'] = max($worksheetInfo[0]['totalRows'], $rowIndex); + $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], $columnIndex); + } + } + } + + $worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']); + $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; + + // Close file + fclose($fileHandle); + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Create new PHPExcel + while ($objPHPExcel->getSheetCount() <= $this->_sheetIndex) { + $objPHPExcel->createSheet(); + } + $objPHPExcel->setActiveSheetIndex( $this->_sheetIndex ); + + $fromFormats = array('\-', '\ '); + $toFormats = array('-', ' '); + + // Open file + $fileHandle = fopen($pFilename, 'r'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for reading."); + } + + // Loop through file + $rowData = array(); + $column = $row = ''; + + // loop through one row (line) at a time in the file + while (($rowData = fgets($fileHandle)) !== FALSE) { + + // convert SYLK encoded $rowData to UTF-8 + $rowData = PHPExcel_Shared_String::SYLKtoUTF8($rowData); + + // explode each row at semicolons while taking into account that literal semicolon (;) + // is escaped like this (;;) + $rowData = explode("\t",str_replace('¤',';',str_replace(';',"\t",str_replace(';;','¤',rtrim($rowData))))); + + $dataType = array_shift($rowData); + // Read shared styles + if ($dataType == 'P') { + $formatArray = array(); + foreach($rowData as $rowDatum) { + switch($rowDatum{0}) { + case 'P' : $formatArray['numberformat']['code'] = str_replace($fromFormats,$toFormats,substr($rowDatum,1)); + break; + case 'E' : + case 'F' : $formatArray['font']['name'] = substr($rowDatum,1); + break; + case 'L' : $formatArray['font']['size'] = substr($rowDatum,1); + break; + case 'S' : $styleSettings = substr($rowDatum,1); + for ($i=0;$i<strlen($styleSettings);++$i) { + switch ($styleSettings{$i}) { + case 'I' : $formatArray['font']['italic'] = true; + break; + case 'D' : $formatArray['font']['bold'] = true; + break; + case 'T' : $formatArray['borders']['top']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'B' : $formatArray['borders']['bottom']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'L' : $formatArray['borders']['left']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'R' : $formatArray['borders']['right']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + } + } + break; + } + } + $this->_formats['P'.$this->_format++] = $formatArray; + // Read cell value data + } elseif ($dataType == 'C') { + $hasCalculatedValue = false; + $cellData = $cellDataFormula = ''; + foreach($rowData as $rowDatum) { + switch($rowDatum{0}) { + case 'C' : + case 'X' : $column = substr($rowDatum,1); + break; + case 'R' : + case 'Y' : $row = substr($rowDatum,1); + break; + case 'K' : $cellData = substr($rowDatum,1); + break; + case 'E' : $cellDataFormula = '='.substr($rowDatum,1); + // Convert R1C1 style references to A1 style references (but only when not quoted) + $temp = explode('"',$cellDataFormula); + $key = false; + foreach($temp as &$value) { + // Only count/replace in alternate array entries + if ($key = !$key) { + preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/',$value, $cellReferences,PREG_SET_ORDER+PREG_OFFSET_CAPTURE); + // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way + // through the formula from left to right. Reversing means that we work right to left.through + // the formula + $cellReferences = array_reverse($cellReferences); + // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, + // then modify the formula to use that new reference + foreach($cellReferences as $cellReference) { + $rowReference = $cellReference[2][0]; + // Empty R reference is the current row + if ($rowReference == '') $rowReference = $row; + // Bracketed R references are relative to the current row + if ($rowReference{0} == '[') $rowReference = $row + trim($rowReference,'[]'); + $columnReference = $cellReference[4][0]; + // Empty C reference is the current column + if ($columnReference == '') $columnReference = $column; + // Bracketed C references are relative to the current column + if ($columnReference{0} == '[') $columnReference = $column + trim($columnReference,'[]'); + $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference; + + $value = substr_replace($value,$A1CellReference,$cellReference[0][1],strlen($cellReference[0][0])); + } + } + } + unset($value); + // Then rebuild the formula string + $cellDataFormula = implode('"',$temp); + $hasCalculatedValue = true; + break; + } + } + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1); + $cellData = PHPExcel_Calculation::_unwrapResult($cellData); + + // Set cell value + $objPHPExcel->getActiveSheet()->getCell($columnLetter.$row)->setValue(($hasCalculatedValue) ? $cellDataFormula : $cellData); + if ($hasCalculatedValue) { + $cellData = PHPExcel_Calculation::_unwrapResult($cellData); + $objPHPExcel->getActiveSheet()->getCell($columnLetter.$row)->setCalculatedValue($cellData); + } + // Read cell formatting + } elseif ($dataType == 'F') { + $formatStyle = $columnWidth = $styleSettings = ''; + $styleData = array(); + foreach($rowData as $rowDatum) { + switch($rowDatum{0}) { + case 'C' : + case 'X' : $column = substr($rowDatum,1); + break; + case 'R' : + case 'Y' : $row = substr($rowDatum,1); + break; + case 'P' : $formatStyle = $rowDatum; + break; + case 'W' : list($startCol,$endCol,$columnWidth) = explode(' ',substr($rowDatum,1)); + break; + case 'S' : $styleSettings = substr($rowDatum,1); + for ($i=0;$i<strlen($styleSettings);++$i) { + switch ($styleSettings{$i}) { + case 'I' : $styleData['font']['italic'] = true; + break; + case 'D' : $styleData['font']['bold'] = true; + break; + case 'T' : $styleData['borders']['top']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'B' : $styleData['borders']['bottom']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'L' : $styleData['borders']['left']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'R' : $styleData['borders']['right']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + } + } + break; + } + } + if (($formatStyle > '') && ($column > '') && ($row > '')) { + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1); + $objPHPExcel->getActiveSheet()->getStyle($columnLetter.$row)->applyFromArray($this->_formats[$formatStyle]); + } + if ((!empty($styleData)) && ($column > '') && ($row > '')) { + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1); + $objPHPExcel->getActiveSheet()->getStyle($columnLetter.$row)->applyFromArray($styleData); + } + if ($columnWidth > '') { + if ($startCol == $endCol) { + $startCol = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $objPHPExcel->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth); + } else { + $startCol = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $endCol = PHPExcel_Cell::stringFromColumnIndex($endCol-1); + $objPHPExcel->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth); + do { + $objPHPExcel->getActiveSheet()->getColumnDimension(++$startCol)->setWidth($columnWidth); + } while ($startCol != $endCol); + } + } + } else { + foreach($rowData as $rowDatum) { + switch($rowDatum{0}) { + case 'C' : + case 'X' : $column = substr($rowDatum,1); + break; + case 'R' : + case 'Y' : $row = substr($rowDatum,1); + break; + } + } + } + } + + // Close file + fclose($fileHandle); + + // Return + return $objPHPExcel; + } + + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() { + return $this->_sheetIndex; + } + + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Reader_SYLK + */ + public function setSheetIndex($pValue = 0) { + $this->_sheetIndex = $pValue; + return $this; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/ReferenceHelper.php b/fannie/src/PHPExcel/Classes/PHPExcel/ReferenceHelper.php new file mode 100644 index 000000000..911359129 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/ReferenceHelper.php @@ -0,0 +1,685 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_ReferenceHelper (Singleton) + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_ReferenceHelper +{ + /** Constants */ + /** Regular Expressions */ + const REFHELPER_REGEXP_CELLREF = '((\w*|\'[^!]*\')!)?(?<![:a-z\$])(\$?[a-z]{1,3}\$?\d+)(?=[^:!\d\'])'; + const REFHELPER_REGEXP_CELLRANGE = '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}\$?\d+):(\$?[a-z]{1,3}\$?\d+)'; + const REFHELPER_REGEXP_ROWRANGE = '((\w*|\'[^!]*\')!)?(\$?\d+):(\$?\d+)'; + const REFHELPER_REGEXP_COLRANGE = '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}):(\$?[a-z]{1,3})'; + + /** + * Instance of this class + * + * @var PHPExcel_ReferenceHelper + */ + private static $_instance; + + /** + * Get an instance of this class + * + * @return PHPExcel_ReferenceHelper + */ + public static function getInstance() { + if (!isset(self::$_instance) || (self::$_instance === NULL)) { + self::$_instance = new PHPExcel_ReferenceHelper(); + } + + return self::$_instance; + } + + /** + * Create a new PHPExcel_ReferenceHelper + */ + protected function __construct() { + } + + /** + * Insert a new column, updating all possible related data + * + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to insert + * @param int $pNumRows Number of rows to insert + * @throws Exception + */ + public function insertNewBefore($pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, PHPExcel_Worksheet $pSheet = null) { + $aCellCollection = $pSheet->getCellCollection(); + + // Get coordinates of $pBefore + $beforeColumn = 'A'; + $beforeRow = 1; + list($beforeColumn, $beforeRow) = PHPExcel_Cell::coordinateFromString( $pBefore ); + + + // Clear cells if we are removing columns or rows + $highestColumn = $pSheet->getHighestColumn(); + $highestRow = $pSheet->getHighestRow(); + + // 1. Clear column strips if we are removing columns + if ($pNumCols < 0 && PHPExcel_Cell::columnIndexFromString($beforeColumn) - 2 + $pNumCols > 0) { + for ($i = 1; $i <= $highestRow - 1; ++$i) { + for ($j = PHPExcel_Cell::columnIndexFromString($beforeColumn) - 1 + $pNumCols; $j <= PHPExcel_Cell::columnIndexFromString($beforeColumn) - 2; ++$j) { + $coordinate = PHPExcel_Cell::stringFromColumnIndex($j) . $i; + $pSheet->removeConditionalStyles($coordinate); + if ($pSheet->cellExists($coordinate)) { + $pSheet->getCell($coordinate)->setValueExplicit('', PHPExcel_Cell_DataType::TYPE_NULL); + $pSheet->getCell($coordinate)->setXfIndex(0); + } + } + } + } + + // 2. Clear row strips if we are removing rows + if ($pNumRows < 0 && $beforeRow - 1 + $pNumRows > 0) { + for ($i = PHPExcel_Cell::columnIndexFromString($beforeColumn) - 1; $i <= PHPExcel_Cell::columnIndexFromString($highestColumn) - 1; ++$i) { + for ($j = $beforeRow + $pNumRows; $j <= $beforeRow - 1; ++$j) { + $coordinate = PHPExcel_Cell::stringFromColumnIndex($i) . $j; + $pSheet->removeConditionalStyles($coordinate); + if ($pSheet->cellExists($coordinate)) { + $pSheet->getCell($coordinate)->setValueExplicit('', PHPExcel_Cell_DataType::TYPE_NULL); + $pSheet->getCell($coordinate)->setXfIndex(0); + } + } + } + } + + + // Loop through cells, bottom-up, and change cell coordinates + while (($cellID = ($pNumCols < 0 || $pNumRows < 0) ? array_shift($aCellCollection) : array_pop($aCellCollection))) { + $cell = $pSheet->getCell($cellID); + + // New coordinates + $newCoordinates = PHPExcel_Cell::stringFromColumnIndex( PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1 + $pNumCols ) . ($cell->getRow() + $pNumRows); + + // Should the cell be updated? Move value and cellXf index from one cell to another. + if ((PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) && + ($cell->getRow() >= $beforeRow)) { + + // Update cell styles + $pSheet->getCell($newCoordinates)->setXfIndex($cell->getXfIndex()); + $cell->setXfIndex(0); + + // Insert this cell at its new location + if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) { + // Formula should be adjusted + $pSheet->getCell($newCoordinates) + ->setValue($this->updateFormulaReferences($cell->getValue(), + $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); + } else { + // Formula should not be adjusted + $pSheet->getCell($newCoordinates)->setValue($cell->getValue()); + } + + // Clear the original cell + $pSheet->getCell($cell->getCoordinate())->setValue(''); + + } else { + /* We don't need to update styles for rows/columns before our insertion position, + but we do still need to adjust any formulae in those cells */ + if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) { + // Formula should be adjusted + $cell->setValue($this->updateFormulaReferences($cell->getValue(), + $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); + } + + } + } + + + // Duplicate styles for the newly inserted cells + $highestColumn = $pSheet->getHighestColumn(); + $highestRow = $pSheet->getHighestRow(); + + if ($pNumCols > 0 && PHPExcel_Cell::columnIndexFromString($beforeColumn) - 2 > 0) { + for ($i = $beforeRow; $i <= $highestRow - 1; ++$i) { + + // Style + $coordinate = PHPExcel_Cell::stringFromColumnIndex( PHPExcel_Cell::columnIndexFromString($beforeColumn) - 2 ) . $i; + if ($pSheet->cellExists($coordinate)) { + $xfIndex = $pSheet->getCell($coordinate)->getXfIndex(); + $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ? + $pSheet->getConditionalStyles($coordinate) : false; + for ($j = PHPExcel_Cell::columnIndexFromString($beforeColumn) - 1; $j <= PHPExcel_Cell::columnIndexFromString($beforeColumn) - 2 + $pNumCols; ++$j) { + $pSheet->getCellByColumnAndRow($j, $i)->setXfIndex($xfIndex); + if ($conditionalStyles) { + $cloned = array(); + foreach ($conditionalStyles as $conditionalStyle) { + $cloned[] = clone $conditionalStyle; + } + $pSheet->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($j) . $i, $cloned); + } + } + } + + } + } + + if ($pNumRows > 0 && $beforeRow - 1 > 0) { + for ($i = PHPExcel_Cell::columnIndexFromString($beforeColumn) - 1; $i <= PHPExcel_Cell::columnIndexFromString($highestColumn) - 1; ++$i) { + + // Style + $coordinate = PHPExcel_Cell::stringFromColumnIndex($i) . ($beforeRow - 1); + if ($pSheet->cellExists($coordinate)) { + $xfIndex = $pSheet->getCell($coordinate)->getXfIndex(); + $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ? + $pSheet->getConditionalStyles($coordinate) : false; + for ($j = $beforeRow; $j <= $beforeRow - 1 + $pNumRows; ++$j) { + $pSheet->getCell(PHPExcel_Cell::stringFromColumnIndex($i) . $j)->setXfIndex($xfIndex); + if ($conditionalStyles) { + $cloned = array(); + foreach ($conditionalStyles as $conditionalStyle) { + $cloned[] = clone $conditionalStyle; + } + $pSheet->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($i) . $j, $cloned); + } + } + } + } + } + + + // Update worksheet: column dimensions + $aColumnDimensions = array_reverse($pSheet->getColumnDimensions(), true); + if (!empty($aColumnDimensions)) { + foreach ($aColumnDimensions as $objColumnDimension) { + $newReference = $this->updateCellReference($objColumnDimension->getColumnIndex() . '1', $pBefore, $pNumCols, $pNumRows); + list($newReference) = PHPExcel_Cell::coordinateFromString($newReference); + if ($objColumnDimension->getColumnIndex() != $newReference) { + $objColumnDimension->setColumnIndex($newReference); + } + } + $pSheet->refreshColumnDimensions(); + } + + + // Update worksheet: row dimensions + $aRowDimensions = array_reverse($pSheet->getRowDimensions(), true); + if (!empty($aRowDimensions)) { + foreach ($aRowDimensions as $objRowDimension) { + $newReference = $this->updateCellReference('A' . $objRowDimension->getRowIndex(), $pBefore, $pNumCols, $pNumRows); + list(, $newReference) = PHPExcel_Cell::coordinateFromString($newReference); + if ($objRowDimension->getRowIndex() != $newReference) { + $objRowDimension->setRowIndex($newReference); + } + } + $pSheet->refreshRowDimensions(); + + $copyDimension = $pSheet->getRowDimension($beforeRow - 1); + for ($i = $beforeRow; $i <= $beforeRow - 1 + $pNumRows; ++$i) { + $newDimension = $pSheet->getRowDimension($i); + $newDimension->setRowHeight($copyDimension->getRowHeight()); + $newDimension->setVisible($copyDimension->getVisible()); + $newDimension->setOutlineLevel($copyDimension->getOutlineLevel()); + $newDimension->setCollapsed($copyDimension->getCollapsed()); + } + } + + + // Update worksheet: breaks + $aBreaks = array_reverse($pSheet->getBreaks(), true); + foreach ($aBreaks as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->setBreak( $newReference, $value ); + $pSheet->setBreak( $key, PHPExcel_Worksheet::BREAK_NONE ); + } + } + + // Update worksheet: comments + $aComments = $pSheet->getComments(); + $aNewComments = array(); // the new array of all comments + foreach ($aComments as $key => &$value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + $aNewComments[$newReference] = $value; + } + $pSheet->setComments($aNewComments); // replace the comments array + + // Update worksheet: hyperlinks + $aHyperlinkCollection = array_reverse($pSheet->getHyperlinkCollection(), true); + foreach ($aHyperlinkCollection as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->setHyperlink( $newReference, $value ); + $pSheet->setHyperlink( $key, null ); + } + } + + + // Update worksheet: data validations + $aDataValidationCollection = array_reverse($pSheet->getDataValidationCollection(), true); + foreach ($aDataValidationCollection as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->setDataValidation( $newReference, $value ); + $pSheet->setDataValidation( $key, null ); + } + } + + + // Update worksheet: merge cells + $aMergeCells = $pSheet->getMergeCells(); + $aNewMergeCells = array(); // the new array of all merge cells + foreach ($aMergeCells as $key => &$value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + $aNewMergeCells[$newReference] = $newReference; + } + $pSheet->setMergeCells($aNewMergeCells); // replace the merge cells array + + + // Update worksheet: protected cells + $aProtectedCells = array_reverse($pSheet->getProtectedCells(), true); + foreach ($aProtectedCells as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->protectCells( $newReference, $value, true ); + $pSheet->unprotectCells( $key ); + } + } + + + // Update worksheet: autofilter + $autoFilter = $pSheet->getAutoFilter(); + $autoFilterRange = $autoFilter->getRange(); + if (!empty($autoFilterRange)) { + if ($pNumCols != 0) { + $autoFilterColumns = array_keys($autoFilter->getColumns()); + if (count($autoFilterColumns) > 0) { + list($column,$row) = sscanf($pBefore,'%[A-Z]%d'); + $columnIndex = PHPExcel_Cell::columnIndexFromString($column); + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($autoFilterRange); + if ($columnIndex <= $rangeEnd[0]) { + if ($pNumCols < 0) { + // If we're actually deleting any columns that fall within the autofilter range, + // then we delete any rules for those columns + $deleteColumn = $columnIndex + $pNumCols - 1; + $deleteCount = abs($pNumCols); + for ($i = 1; $i <= $deleteCount; ++$i) { + if (in_array(PHPExcel_Cell::stringFromColumnIndex($deleteColumn),$autoFilterColumns)) { + $autoFilter->clearColumn(PHPExcel_Cell::stringFromColumnIndex($deleteColumn)); + } + ++$deleteColumn; + } + } + $startCol = ($columnIndex > $rangeStart[0]) ? $columnIndex : $rangeStart[0]; + + // Shuffle columns in autofilter range + if ($pNumCols > 0) { + // For insert, we shuffle from end to beginning to avoid overwriting + $startColID = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $toColID = PHPExcel_Cell::stringFromColumnIndex($startCol+$pNumCols-1); + $endColID = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]); + + $startColRef = $startCol; + $endColRef = $rangeEnd[0]; + $toColRef = $rangeEnd[0]+$pNumCols; + + do { + $autoFilter->shiftColumn(PHPExcel_Cell::stringFromColumnIndex($endColRef-1),PHPExcel_Cell::stringFromColumnIndex($toColRef-1)); + --$endColRef; + --$toColRef; + } while ($startColRef <= $endColRef); + } else { + // For delete, we shuffle from beginning to end to avoid overwriting + $startColID = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $toColID = PHPExcel_Cell::stringFromColumnIndex($startCol+$pNumCols-1); + $endColID = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]); + do { + $autoFilter->shiftColumn($startColID,$toColID); + ++$startColID; + ++$toColID; + } while ($startColID != $endColID); + } + } + } + } + $pSheet->setAutoFilter( $this->updateCellReference($autoFilterRange, $pBefore, $pNumCols, $pNumRows) ); + } + + + // Update worksheet: freeze pane + if ($pSheet->getFreezePane() != '') { + $pSheet->freezePane( $this->updateCellReference($pSheet->getFreezePane(), $pBefore, $pNumCols, $pNumRows) ); + } + + + // Page setup + if ($pSheet->getPageSetup()->isPrintAreaSet()) { + $pSheet->getPageSetup()->setPrintArea( $this->updateCellReference($pSheet->getPageSetup()->getPrintArea(), $pBefore, $pNumCols, $pNumRows) ); + } + + + // Update worksheet: drawings + $aDrawings = $pSheet->getDrawingCollection(); + foreach ($aDrawings as $objDrawing) { + $newReference = $this->updateCellReference($objDrawing->getCoordinates(), $pBefore, $pNumCols, $pNumRows); + if ($objDrawing->getCoordinates() != $newReference) { + $objDrawing->setCoordinates($newReference); + } + } + + + // Update workbook: named ranges + if (count($pSheet->getParent()->getNamedRanges()) > 0) { + foreach ($pSheet->getParent()->getNamedRanges() as $namedRange) { + if ($namedRange->getWorksheet()->getHashCode() == $pSheet->getHashCode()) { + $namedRange->setRange( + $this->updateCellReference($namedRange->getRange(), $pBefore, $pNumCols, $pNumRows) + ); + } + } + } + + // Garbage collect + $pSheet->garbageCollect(); + } + + /** + * Update references within formulas + * + * @param string $pFormula Formula to update + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to insert + * @param int $pNumRows Number of rows to insert + * @return string Updated formula + * @throws Exception + */ + public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '') { + // Update cell references in the formula + $formulaBlocks = explode('"',$pFormula); + $i = false; + foreach($formulaBlocks as &$formulaBlock) { + // Ignore blocks that were enclosed in quotes (alternating entries in the $formulaBlocks array after the explode) + if ($i = !$i) { + $adjustCount = 0; + $newCellTokens = $cellTokens = array(); + // Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_ROWRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = substr($this->updateCellReference('$A'.$match[3],$pBefore,$pNumCols,$pNumRows),2); + $modified4 = substr($this->updateCellReference('$A'.$match[4],$pBefore,$pNumCols,$pNumRows),2); + + if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = 100000; + $row = 10000000+trim($match[3],'$'); + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<!\d)'.preg_quote($fromString).'(?!\d)/i'; + ++$adjustCount; + } + } + } + } + // Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_COLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = substr($this->updateCellReference($match[3].'$1',$pBefore,$pNumCols,$pNumRows),0,-2); + $modified4 = substr($this->updateCellReference($match[4].'$1',$pBefore,$pNumCols,$pNumRows),0,-2); + + if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($match[3],'$')) + 100000; + $row = 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?![A-Z])/i'; + ++$adjustCount; + } + } + } + } + // Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows); + $modified4 = $this->updateCellReference($match[4],$pBefore,$pNumCols,$pNumRows); + + if ($match[3].$match[4] !== $modified3.$modified4) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]); + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000; + $row = trim($row,'$') + 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i'; + ++$adjustCount; + } + } + } + } + // Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLREF.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3]; + $modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows); + + if ($match[3] !== $modified3) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3; + list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]); + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000; + $row = trim($row,'$') + 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i'; + ++$adjustCount; + } + } + } + } + if ($adjustCount > 0) { + krsort($cellTokens); + krsort($newCellTokens); + // Update cell references in the formula + $formulaBlock = str_replace('\\','',preg_replace($cellTokens,$newCellTokens,$formulaBlock)); + } + } + } + unset($formulaBlock); + + // Then rebuild the formula string + return implode('"',$formulaBlocks); + } + + /** + * Update cell reference + * + * @param string $pCellRange Cell range + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to increment + * @param int $pNumRows Number of rows to increment + * @return string Updated cell range + * @throws Exception + */ + public function updateCellReference($pCellRange = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) { + // Is it in another worksheet? Will not have to update anything. + if (strpos($pCellRange, "!") !== false) { + return $pCellRange; + // Is it a range or a single cell? + } elseif (strpos($pCellRange, ':') === false && strpos($pCellRange, ',') === false) { + // Single cell + return $this->_updateSingleCellReference($pCellRange, $pBefore, $pNumCols, $pNumRows); + } elseif (strpos($pCellRange, ':') !== false || strpos($pCellRange, ',') !== false) { + // Range + return $this->_updateCellRange($pCellRange, $pBefore, $pNumCols, $pNumRows); + } else { + // Return original + return $pCellRange; + } + } + + /** + * Update named formulas (i.e. containing worksheet references / named ranges) + * + * @param PHPExcel $pPhpExcel Object to update + * @param string $oldName Old name (name to replace) + * @param string $newName New name + */ + public function updateNamedFormulas(PHPExcel $pPhpExcel, $oldName = '', $newName = '') { + if ($oldName == '') { + return; + } + + foreach ($pPhpExcel->getWorksheetIterator() as $sheet) { + foreach ($sheet->getCellCollection(false) as $cellID) { + $cell = $sheet->getCell($cellID); + if (($cell !== NULL) && ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA)) { + $formula = $cell->getValue(); + if (strpos($formula, $oldName) !== false) { + $formula = str_replace("'" . $oldName . "'!", "'" . $newName . "'!", $formula); + $formula = str_replace($oldName . "!", $newName . "!", $formula); + $cell->setValueExplicit($formula, PHPExcel_Cell_DataType::TYPE_FORMULA); + } + } + } + } + } + + /** + * Update cell range + * + * @param string $pCellRange Cell range (e.g. 'B2:D4', 'B:C' or '2:3') + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to increment + * @param int $pNumRows Number of rows to increment + * @return string Updated cell range + * @throws Exception + */ + private function _updateCellRange($pCellRange = 'A1:A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) { + if (strpos($pCellRange,':') !== false || strpos($pCellRange, ',') !== false) { + // Update range + $range = PHPExcel_Cell::splitRange($pCellRange); + $ic = count($range); + for ($i = 0; $i < $ic; ++$i) { + $jc = count($range[$i]); + for ($j = 0; $j < $jc; ++$j) { + if (ctype_alpha($range[$i][$j])) { + $r = PHPExcel_Cell::coordinateFromString($this->_updateSingleCellReference($range[$i][$j].'1', $pBefore, $pNumCols, $pNumRows)); + $range[$i][$j] = $r[0]; + } elseif(ctype_digit($range[$i][$j])) { + $r = PHPExcel_Cell::coordinateFromString($this->_updateSingleCellReference('A'.$range[$i][$j], $pBefore, $pNumCols, $pNumRows)); + $range[$i][$j] = $r[1]; + } else { + $range[$i][$j] = $this->_updateSingleCellReference($range[$i][$j], $pBefore, $pNumCols, $pNumRows); + } + } + } + + // Recreate range string + return PHPExcel_Cell::buildRange($range); + } else { + throw new Exception("Only cell ranges may be passed to this method."); + } + } + + /** + * Update single cell reference + * + * @param string $pCellReference Single cell reference + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to increment + * @param int $pNumRows Number of rows to increment + * @return string Updated cell reference + * @throws Exception + */ + private function _updateSingleCellReference($pCellReference = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) { + if (strpos($pCellReference, ':') === false && strpos($pCellReference, ',') === false) { + // Get coordinates of $pBefore + list($beforeColumn, $beforeRow) = PHPExcel_Cell::coordinateFromString( $pBefore ); + + // Get coordinates of $pCellReference + list($newColumn, $newRow) = PHPExcel_Cell::coordinateFromString( $pCellReference ); + + // Verify which parts should be updated + $updateColumn = (($newColumn{0} != '$') && ($beforeColumn{0} != '$') && + PHPExcel_Cell::columnIndexFromString($newColumn) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)); + + $updateRow = (($newRow{0} != '$') && ($beforeRow{0} != '$') && + $newRow >= $beforeRow); + + // Create new column reference + if ($updateColumn) { + $newColumn = PHPExcel_Cell::stringFromColumnIndex( PHPExcel_Cell::columnIndexFromString($newColumn) - 1 + $pNumCols ); + } + + // Create new row reference + if ($updateRow) { + $newRow = $newRow + $pNumRows; + } + + // Return new reference + return $newColumn . $newRow; + } else { + throw new Exception("Only single cell references may be passed to this method."); + } + } + + /** + * __clone implementation. Cloning should not be allowed in a Singleton! + * + * @throws Exception + */ + public final function __clone() { + throw new Exception("Cloning a Singleton is not allowed!"); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/RichText.php b/fannie/src/PHPExcel/Classes/PHPExcel/RichText.php new file mode 100644 index 000000000..17af169cd --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/RichText.php @@ -0,0 +1,196 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_RichText + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_RichText implements PHPExcel_IComparable +{ + /** + * Rich text elements + * + * @var PHPExcel_RichText_ITextElement[] + */ + private $_richTextElements; + + /** + * Create a new PHPExcel_RichText instance + * + * @param PHPExcel_Cell $pParent + * @throws Exception + */ + public function __construct(PHPExcel_Cell $pCell = null) + { + // Initialise variables + $this->_richTextElements = array(); + + // Rich-Text string attached to cell? + if ($pCell !== NULL) { + // Add cell text and style + if ($pCell->getValue() != "") { + $objRun = new PHPExcel_RichText_Run($pCell->getValue()); + $objRun->setFont(clone $pCell->getParent()->getStyle($pCell->getCoordinate())->getFont()); + $this->addText($objRun); + } + + // Set parent value + $pCell->setValueExplicit($this, PHPExcel_Cell_DataType::TYPE_STRING); + } + } + + /** + * Add text + * + * @param PHPExcel_RichText_ITextElement $pText Rich text element + * @throws Exception + * @return PHPExcel_RichText + */ + public function addText(PHPExcel_RichText_ITextElement $pText = null) + { + $this->_richTextElements[] = $pText; + return $this; + } + + /** + * Create text + * + * @param string $pText Text + * @return PHPExcel_RichText_TextElement + * @throws Exception + */ + public function createText($pText = '') + { + $objText = new PHPExcel_RichText_TextElement($pText); + $this->addText($objText); + return $objText; + } + + /** + * Create text run + * + * @param string $pText Text + * @return PHPExcel_RichText_Run + * @throws Exception + */ + public function createTextRun($pText = '') + { + $objText = new PHPExcel_RichText_Run($pText); + $this->addText($objText); + return $objText; + } + + /** + * Get plain text + * + * @return string + */ + public function getPlainText() + { + // Return value + $returnValue = ''; + + // Loop through all PHPExcel_RichText_ITextElement + foreach ($this->_richTextElements as $text) { + $returnValue .= $text->getText(); + } + + // Return + return $returnValue; + } + + /** + * Convert to string + * + * @return string + */ + public function __toString() { + return $this->getPlainText(); + } + + /** + * Get Rich Text elements + * + * @return PHPExcel_RichText_ITextElement[] + */ + public function getRichTextElements() + { + return $this->_richTextElements; + } + + /** + * Set Rich Text elements + * + * @param PHPExcel_RichText_ITextElement[] $pElements Array of elements + * @throws Exception + * @return PHPExcel_RichText + */ + public function setRichTextElements($pElements = null) + { + if (is_array($pElements)) { + $this->_richTextElements = $pElements; + } else { + throw new Exception("Invalid PHPExcel_RichText_ITextElement[] array passed."); + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + $hashElements = ''; + foreach ($this->_richTextElements as $element) { + $hashElements .= $element->getHashCode(); + } + + return md5( + $hashElements + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/RichText/ITextElement.php b/fannie/src/PHPExcel/Classes/PHPExcel/RichText/ITextElement.php new file mode 100644 index 000000000..4c658637f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/RichText/ITextElement.php @@ -0,0 +1,64 @@ +<?php +/** + * PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_RichText_ITextElement + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +interface PHPExcel_RichText_ITextElement +{ + /** + * Get text + * + * @return string Text + */ + public function getText(); + + /** + * Set text + * + * @param $pText string Text + * @return PHPExcel_RichText_ITextElement + */ + public function setText($pText = ''); + + /** + * Get font + * + * @return PHPExcel_Style_Font + */ + public function getFont(); + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode(); +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/RichText/Run.php b/fannie/src/PHPExcel/Classes/PHPExcel/RichText/Run.php new file mode 100644 index 000000000..9e33786c1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/RichText/Run.php @@ -0,0 +1,102 @@ +<?php +/** + * PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_RichText_Run + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_RichText_Run extends PHPExcel_RichText_TextElement implements PHPExcel_RichText_ITextElement +{ + /** + * Font + * + * @var PHPExcel_Style_Font + */ + private $_font; + + /** + * Create a new PHPExcel_RichText_Run instance + * + * @param string $pText Text + */ + public function __construct($pText = '') + { + // Initialise variables + $this->setText($pText); + $this->_font = new PHPExcel_Style_Font(); + } + + /** + * Get font + * + * @return PHPExcel_Style_Font + */ + public function getFont() { + return $this->_font; + } + + /** + * Set font + * + * @param PHPExcel_Style_Font $pFont Font + * @throws Exception + * @return PHPExcel_RichText_ITextElement + */ + public function setFont(PHPExcel_Style_Font $pFont = null) { + $this->_font = $pFont; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->getText() + . $this->_font->getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/RichText/TextElement.php b/fannie/src/PHPExcel/Classes/PHPExcel/RichText/TextElement.php new file mode 100644 index 000000000..5b9edd07e --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/RichText/TextElement.php @@ -0,0 +1,108 @@ +<?php +/** + * PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_RichText_TextElement + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_RichText_TextElement implements PHPExcel_RichText_ITextElement +{ + /** + * Text + * + * @var string + */ + private $_text; + + /** + * Create a new PHPExcel_RichText_TextElement instance + * + * @param string $pText Text + */ + public function __construct($pText = '') + { + // Initialise variables + $this->_text = $pText; + } + + /** + * Get text + * + * @return string Text + */ + public function getText() { + return $this->_text; + } + + /** + * Set text + * + * @param $pText string Text + * @return PHPExcel_RichText_ITextElement + */ + public function setText($pText = '') { + $this->_text = $pText; + return $this; + } + + /** + * Get font + * + * @return PHPExcel_Style_Font + */ + public function getFont() { + return null; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_text + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Settings.php b/fannie/src/PHPExcel/Classes/PHPExcel/Settings.php new file mode 100644 index 000000000..6659b90e9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Settings.php @@ -0,0 +1,332 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Settings + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + + +class PHPExcel_Settings +{ + /** constants */ + /** Available Zip library classes */ + const PCLZIP = 'PHPExcel_Shared_ZipArchive'; + const ZIPARCHIVE = 'ZipArchive'; + + /** Optional Chart Rendering libraries */ + const CHART_RENDERER_JPGRAPH = 'jpgraph'; + + /** Optional PDF Rendering libraries */ + const PDF_RENDERER_TCPDF = 'tcPDF'; + const PDF_RENDERER_DOMPDF = 'DomPDF'; + const PDF_RENDERER_MPDF = 'mPDF'; + + + private static $_chartRenderers = array( + self::CHART_RENDERER_JPGRAPH, + ); + + private static $_pdfRenderers = array( + self::PDF_RENDERER_TCPDF, + self::PDF_RENDERER_DOMPDF, + self::PDF_RENDERER_MPDF, + ); + + + /** + * Name of the class used for Zip file management + * e.g. + * ZipArchive + * + * @var string + */ + private static $_zipClass = self::ZIPARCHIVE; + + + /** + * Name of the external Library used for rendering charts + * e.g. + * jpgraph + * + * @var string + */ + private static $_chartRendererName = NULL; + + /** + * Directory Path to the external Library used for rendering charts + * + * @var string + */ + private static $_chartRendererPath = NULL; + + + /** + * Name of the external Library used for rendering PDF files + * e.g. + * mPDF + * + * @var string + */ + private static $_pdfRendererName = NULL; + + /** + * Directory Path to the external Library used for rendering PDF files + * + * @var string + */ + private static $_pdfRendererPath = NULL; + + + /** + * Set the Zip handler Class that PHPExcel should use for Zip file management (PCLZip or ZipArchive) + * + * @param string $zipClass The Zip handler class that PHPExcel should use for Zip file management + * e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive + * @return boolean Success or failure + */ + public static function setZipClass($zipClass) { + if (($zipClass === self::PCLZIP) || + ($zipClass === self::ZIPARCHIVE)) { + self::$_zipClass = $zipClass; + return TRUE; + } + return FALSE; + } // function setZipClass() + + + /** + * Return the name of the Zip handler Class that PHPExcel is configured to use (PCLZip or ZipArchive) + * for Zip file management + * + * @return string Name of the Zip handler Class that PHPExcel is configured to use + * for Zip file management + * e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive + */ + public static function getZipClass() { + return self::$_zipClass; + } // function getZipClass() + + + /** + * Return the name of the method that is currently configured for cell cacheing + * + * @return string Name of the cacheing method + */ + public static function getCacheStorageMethod() { + return PHPExcel_CachedObjectStorageFactory::getCacheStorageMethod(); + } // function getCacheStorageMethod() + + + /** + * Return the name of the class that is currently being used for cell cacheing + * + * @return string Name of the class currently being used for cacheing + */ + public static function getCacheStorageClass() { + return PHPExcel_CachedObjectStorageFactory::getCacheStorageClass(); + } // function getCacheStorageClass() + + + /** + * Set the method that should be used for cell cacheing + * + * @param string $method Name of the cacheing method + * @param array $arguments Optional configuration arguments for the cacheing method + * @return boolean Success or failure + */ + public static function setCacheStorageMethod($method = PHPExcel_CachedObjectStorageFactory::cache_in_memory, + $arguments = array()) { + return PHPExcel_CachedObjectStorageFactory::initialize($method, $arguments); + } // function setCacheStorageMethod() + + + /** + * Set the locale code to use for formula translations and any special formatting + * + * @param string $locale The locale code to use (e.g. "fr" or "pt_br" or "en_uk") + * @return boolean Success or failure + */ + public static function setLocale($locale='en_us') { + return PHPExcel_Calculation::getInstance()->setLocale($locale); + } // function setLocale() + + + /** + * Set details of the external library that PHPExcel should use for rendering charts + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH + * @param string $libraryBaseDir Directory path to the library's base folder + * @return boolean Success or failure + */ + public static function setChartRenderer($libraryName, $libraryBaseDir) { + if (!self::setChartRendererName($libraryName)) + return FALSE; + return self::setChartRendererPath($libraryBaseDir); + } // function setChartRenderer() + + + /** + * Identify to PHPExcel the external library to use for rendering charts + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH + * @return boolean Success or failure + */ + public static function setChartRendererName($libraryName) { + if (!in_array($libraryName,self::$_chartRenderers)) { + return FALSE; + } + + self::$_chartRendererName = $libraryName; + + return TRUE; + } // function setChartRendererName() + + + /** + * Tell PHPExcel where to find the external library to use for rendering charts + * + * @param string $libraryBaseDir Directory path to the library's base folder + * @return boolean Success or failure + */ + public static function setChartRendererPath($libraryBaseDir) { + if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) { + return FALSE; + } + self::$_chartRendererPath = $libraryBaseDir; + + return TRUE; + } // function setChartRendererPath() + + + /** + * Return the Chart Rendering Library that PHPExcel is currently configured to use (e.g. jpgraph) + * + * @return string|NULL Internal reference name of the Chart Rendering Library that PHPExcel is + * currently configured to use + * e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH + */ + public static function getChartRendererName() { + return self::$_chartRendererName; + } // function getChartRendererName() + + + /** + * Return the directory path to the Chart Rendering Library that PHPExcel is currently configured to use + * + * @return string|NULL Directory Path to the Chart Rendering Library that PHPExcel is + * currently configured to use + */ + public static function getChartRendererPath() { + return self::$_chartRendererPath; + } // function getChartRendererPath() + + + /** + * Set details of the external library that PHPExcel should use for rendering PDF files + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF, + * PHPExcel_Settings::PDF_RENDERER_DOMPDF + * or PHPExcel_Settings::PDF_RENDERER_MPDF + * @param string $libraryBaseDir Directory path to the library's base folder + * @return boolean Success or failure + */ + public static function setPdfRenderer($libraryName, $libraryBaseDir) { + if (!self::setPdfRendererName($libraryName)) + return FALSE; + return self::setPdfRendererPath($libraryBaseDir); + } // function setPdfRenderer() + + + /** + * Identify to PHPExcel the external library to use for rendering PDF files + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF, + * PHPExcel_Settings::PDF_RENDERER_DOMPDF + * or PHPExcel_Settings::PDF_RENDERER_MPDF + * @return boolean Success or failure + */ + public static function setPdfRendererName($libraryName) { + if (!in_array($libraryName,self::$_pdfRenderers)) { + return FALSE; + } + + self::$_pdfRendererName = $libraryName; + + return TRUE; + } // function setPdfRendererName() + + + /** + * Tell PHPExcel where to find the external library to use for rendering PDF files + * + * @param string $libraryBaseDir Directory path to the library's base folder + * @return boolean Success or failure + */ + public static function setPdfRendererPath($libraryBaseDir) { + if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) { + return FALSE; + } + self::$_pdfRendererPath = $libraryBaseDir; + + return TRUE; + } // function setPdfRendererPath() + + + /** + * Return the PDF Rendering Library that PHPExcel is currently configured to use (e.g. dompdf) + * + * @return string|NULL Internal reference name of the PDF Rendering Library that PHPExcel is + * currently configured to use + * e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF, + * PHPExcel_Settings::PDF_RENDERER_DOMPDF + * or PHPExcel_Settings::PDF_RENDERER_MPDF + */ + public static function getPdfRendererName() { + return self::$_pdfRendererName; + } // function getPdfRendererName() + + + /** + * Return the directory path to the PDF Rendering Library that PHPExcel is currently configured to use + * + * @return string|NULL Directory Path to the PDF Rendering Library that PHPExcel is + * currently configured to use + */ + public static function getPdfRendererPath() { + return self::$_pdfRendererPath; + } // function getPdfRendererPath() + +} \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/CodePage.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/CodePage.php new file mode 100644 index 000000000..5660e116c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/CodePage.php @@ -0,0 +1,101 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_CodePage + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_CodePage +{ + /** + * Convert Microsoft Code Page Identifier to Code Page Name which iconv + * and mbstring understands + * + * @param int $number Microsoft Code Page Indentifier + * @return string Code Page Name + * @throws Exception + */ + public static function NumberToName($codePage = '1252') + { + switch ($codePage) { + case 367: return 'ASCII'; break; // ASCII + case 437: return 'CP437'; break; // OEM US + case 720: throw new Exception('Code page 720 not supported.'); + break; // OEM Arabic + case 737: return 'CP737'; break; // OEM Greek + case 775: return 'CP775'; break; // OEM Baltic + case 850: return 'CP850'; break; // OEM Latin I + case 852: return 'CP852'; break; // OEM Latin II (Central European) + case 855: return 'CP855'; break; // OEM Cyrillic + case 857: return 'CP857'; break; // OEM Turkish + case 858: return 'CP858'; break; // OEM Multilingual Latin I with Euro + case 860: return 'CP860'; break; // OEM Portugese + case 861: return 'CP861'; break; // OEM Icelandic + case 862: return 'CP862'; break; // OEM Hebrew + case 863: return 'CP863'; break; // OEM Canadian (French) + case 864: return 'CP864'; break; // OEM Arabic + case 865: return 'CP865'; break; // OEM Nordic + case 866: return 'CP866'; break; // OEM Cyrillic (Russian) + case 869: return 'CP869'; break; // OEM Greek (Modern) + case 874: return 'CP874'; break; // ANSI Thai + case 932: return 'CP932'; break; // ANSI Japanese Shift-JIS + case 936: return 'CP936'; break; // ANSI Chinese Simplified GBK + case 949: return 'CP949'; break; // ANSI Korean (Wansung) + case 950: return 'CP950'; break; // ANSI Chinese Traditional BIG5 + case 1200: return 'UTF-16LE'; break; // UTF-16 (BIFF8) + case 1250: return 'CP1250'; break; // ANSI Latin II (Central European) + case 1251: return 'CP1251'; break; // ANSI Cyrillic + case 0: // CodePage is not always correctly set when the xls file was saved by Apple's Numbers program + case 1252: return 'CP1252'; break; // ANSI Latin I (BIFF4-BIFF7) + case 1253: return 'CP1253'; break; // ANSI Greek + case 1254: return 'CP1254'; break; // ANSI Turkish + case 1255: return 'CP1255'; break; // ANSI Hebrew + case 1256: return 'CP1256'; break; // ANSI Arabic + case 1257: return 'CP1257'; break; // ANSI Baltic + case 1258: return 'CP1258'; break; // ANSI Vietnamese + case 1361: return 'CP1361'; break; // ANSI Korean (Johab) + case 10000: return 'MAC'; break; // Apple Roman + case 10006: return 'MACGREEK'; break; // Macintosh Greek + case 10007: return 'MACCYRILLIC'; break; // Macintosh Cyrillic + case 10029: return 'MACCENTRALEUROPE'; break; // Macintosh Central Europe + case 10079: return 'MACICELAND'; break; // Macintosh Icelandic + case 10081: return 'MACTURKISH'; break; // Macintosh Turkish + case 32768: return 'MAC'; break; // Apple Roman + case 32769: throw new Exception('Code page 32769 not supported.'); + break; // ANSI Latin I (BIFF2-BIFF3) + case 65000: return 'UTF-7'; break; // Unicode (UTF-7) + case 65001: return 'UTF-8'; break; // Unicode (UTF-8) + } + + throw new Exception('Unknown codepage: ' . $codePage); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Date.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Date.php new file mode 100644 index 000000000..2c1ab0088 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Date.php @@ -0,0 +1,356 @@ +<?php + +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_Date + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Date +{ + /** constants */ + const CALENDAR_WINDOWS_1900 = 1900; // Base date of 1st Jan 1900 = 1.0 + const CALENDAR_MAC_1904 = 1904; // Base date of 2nd Jan 1904 = 1.0 + + /* + * Names of the months of the year, indexed by shortname + * Planned usage for locale settings + * + * @public + * @var string[] + */ + public static $_monthNames = array( 'Jan' => 'January', + 'Feb' => 'February', + 'Mar' => 'March', + 'Apr' => 'April', + 'May' => 'May', + 'Jun' => 'June', + 'Jul' => 'July', + 'Aug' => 'August', + 'Sep' => 'September', + 'Oct' => 'October', + 'Nov' => 'November', + 'Dec' => 'December' + ); + + /* + * Base calendar year to use for calculations + * + * @private + * @var int + */ + private static $ExcelBaseDate = self::CALENDAR_WINDOWS_1900; + + /* + * Object type for PHP Date/Time values + * + * @private + * @var string + */ + public static $dateTimeObjectType = 'DateTime'; + + + /** + * Set the Excel calendar (Windows 1900 or Mac 1904) + * + * @param integer $baseDate Excel base date + * @return boolean Success or failure + */ + public static function setExcelCalendar($baseDate) { + if (($baseDate == self::CALENDAR_WINDOWS_1900) || + ($baseDate == self::CALENDAR_MAC_1904)) { + self::$ExcelBaseDate = $baseDate; + return TRUE; + } + return FALSE; + } // function setExcelCalendar() + + + /** + * Return the Excel calendar (Windows 1900 or Mac 1904) + * + * @return integer $baseDate Excel base date + */ + public static function getExcelCalendar() { + return self::$ExcelBaseDate; + } // function getExcelCalendar() + + + /** + * Convert a date from Excel to PHP + * + * @param long $dateValue Excel date/time value + * @return long PHP serialized date/time + */ + public static function ExcelToPHP($dateValue = 0) { + if (self::$ExcelBaseDate == self::CALENDAR_WINDOWS_1900) { + $myExcelBaseDate = 25569; + // Adjust for the spurious 29-Feb-1900 (Day 60) + if ($dateValue < 60) { + --$myExcelBaseDate; + } + } else { + $myExcelBaseDate = 24107; + } + + // Perform conversion + if ($dateValue >= 1) { + $utcDays = $dateValue - $myExcelBaseDate; + $returnValue = round($utcDays * 86400); + if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) { + $returnValue = (integer) $returnValue; + } + } else { + $hours = round($dateValue * 24); + $mins = round($dateValue * 1440) - round($hours * 60); + $secs = round($dateValue * 86400) - round($hours * 3600) - round($mins * 60); + $returnValue = (integer) gmmktime($hours, $mins, $secs); + } + + // Return + return $returnValue; + } // function ExcelToPHP() + + + /** + * Convert a date from Excel to a PHP Date/Time object + * + * @param long $dateValue Excel date/time value + * @return long PHP date/time object + */ + public static function ExcelToPHPObject($dateValue = 0) { + $dateTime = self::ExcelToPHP($dateValue); + $days = floor($dateTime / 86400); + $time = round((($dateTime / 86400) - $days) * 86400); + $hours = round($time / 3600); + $minutes = round($time / 60) - ($hours * 60); + $seconds = round($time) - ($hours * 3600) - ($minutes * 60); + + $dateObj = date_create('1-Jan-1970+'.$days.' days'); + $dateObj->setTime($hours,$minutes,$seconds); + + return $dateObj; + } // function ExcelToPHPObject() + + + /** + * Convert a date from PHP to Excel + * + * @param mixed $dateValue PHP serialized date/time or date object + * @return mixed Excel date/time value + * or boolean FALSE on failure + */ + public static function PHPToExcel($dateValue = 0) { + $saveTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $retValue = FALSE; + if ((is_object($dateValue)) && ($dateValue instanceof self::$dateTimeObjectType)) { + $retValue = self::FormattedPHPToExcel( $dateValue->format('Y'), $dateValue->format('m'), $dateValue->format('d'), + $dateValue->format('H'), $dateValue->format('i'), $dateValue->format('s') + ); + } elseif (is_numeric($dateValue)) { + $retValue = self::FormattedPHPToExcel( date('Y',$dateValue), date('m',$dateValue), date('d',$dateValue), + date('H',$dateValue), date('i',$dateValue), date('s',$dateValue) + ); + } + date_default_timezone_set($saveTimeZone); + + return $retValue; + } // function PHPToExcel() + + + /** + * FormattedPHPToExcel + * + * @param long $year + * @param long $month + * @param long $day + * @param long $hours + * @param long $minutes + * @param long $seconds + * @return long Excel date/time value + */ + public static function FormattedPHPToExcel($year, $month, $day, $hours=0, $minutes=0, $seconds=0) { + if (self::$ExcelBaseDate == self::CALENDAR_WINDOWS_1900) { + // + // Fudge factor for the erroneous fact that the year 1900 is treated as a Leap Year in MS Excel + // This affects every date following 28th February 1900 + // + $excel1900isLeapYear = TRUE; + if (($year == 1900) && ($month <= 2)) { $excel1900isLeapYear = FALSE; } + $myExcelBaseDate = 2415020; + } else { + $myExcelBaseDate = 2416481; + $excel1900isLeapYear = FALSE; + } + + // Julian base date Adjustment + if ($month > 2) { + $month -= 3; + } else { + $month += 9; + --$year; + } + + // Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0) + $century = substr($year,0,2); + $decade = substr($year,2,2); + $excelDate = floor((146097 * $century) / 4) + floor((1461 * $decade) / 4) + floor((153 * $month + 2) / 5) + $day + 1721119 - $myExcelBaseDate + $excel1900isLeapYear; + + $excelTime = (($hours * 3600) + ($minutes * 60) + $seconds) / 86400; + + return (float) $excelDate + $excelTime; + } // function FormattedPHPToExcel() + + + /** + * Is a given cell a date/time? + * + * @param PHPExcel_Cell $pCell + * @return boolean + */ + public static function isDateTime(PHPExcel_Cell $pCell) { + return self::isDateTimeFormat( + $pCell->getParent()->getStyle( + $pCell->getCoordinate() + )->getNumberFormat() + ); + } // function isDateTime() + + + /** + * Is a given number format a date/time? + * + * @param PHPExcel_Style_NumberFormat $pFormat + * @return boolean + */ + public static function isDateTimeFormat(PHPExcel_Style_NumberFormat $pFormat) { + return self::isDateTimeFormatCode($pFormat->getFormatCode()); + } // function isDateTimeFormat() + + + private static $possibleDateFormatCharacters = 'eymdHs'; + + /** + * Is a given number format code a date/time? + * + * @param string $pFormatCode + * @return boolean + */ + public static function isDateTimeFormatCode($pFormatCode = '') { + // Switch on formatcode + switch ($pFormatCode) { + // General contains an epoch letter 'e', so we trap for it explicitly here + case PHPExcel_Style_NumberFormat::FORMAT_GENERAL: + return FALSE; + // Explicitly defined date formats + case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYMINUS: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMMINUS: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_MYMINUS: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME1: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME2: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME5: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME6: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME7: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME8: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX16: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX17: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX22: + return TRUE; + } + + // Typically number, currency or accounting (or occasionally fraction) formats + if ((substr($pFormatCode,0,1) == '_') || (substr($pFormatCode,0,2) == '0 ')) { + return FALSE; + } + // Try checking for any of the date formatting characters that don't appear within square braces + if (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i',$pFormatCode)) { + // We might also have a format mask containing quoted strings... + // we don't want to test for any of our characters within the quoted blocks + if (strpos($pFormatCode,'"') !== FALSE) { + $i = FALSE; + foreach(explode('"',$pFormatCode) as $subVal) { + // Only test in alternate array entries (the non-quoted blocks) + if (($i = !$i) && (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i',$subVal))) { + return TRUE; + } + } + return FALSE; + } + return TRUE; + } + + // No date... + return FALSE; + } // function isDateTimeFormatCode() + + + /** + * Convert a date/time string to Excel time + * + * @param string $dateValue Examples: '2009-12-31', '2009-12-31 15:59', '2009-12-31 15:59:10' + * @return float|FALSE Excel date/time serial value + */ + public static function stringToExcel($dateValue = '') { + if (strlen($dateValue) < 2) + return FALSE; + if (!preg_match('/^(\d{1,4}[ \.\/\-][A-Z]{3,9}([ \.\/\-]\d{1,4})?|[A-Z]{3,9}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?|\d{1,4}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?)( \d{1,2}:\d{1,2}(:\d{1,2})?)?$/iu', $dateValue)) + return FALSE; + + $dateValueNew = PHPExcel_Calculation_DateTime::DATEVALUE($dateValue); + + if ($dateValueNew === PHPExcel_Calculation_Functions::VALUE()) { + return FALSE; + } else { + if (strpos($dateValue, ':') !== FALSE) { + $timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($dateValue); + if ($timeValue === PHPExcel_Calculation_Functions::VALUE()) { + return FALSE; + } + $dateValueNew += $timeValue; + } + return $dateValueNew; + } + + + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Drawing.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Drawing.php new file mode 100644 index 000000000..9401000dd --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Drawing.php @@ -0,0 +1,272 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_Drawing + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Drawing +{ + /** + * Convert pixels to EMU + * + * @param int $pValue Value in pixels + * @return int Value in EMU + */ + public static function pixelsToEMU($pValue = 0) { + return round($pValue * 9525); + } + + /** + * Convert EMU to pixels + * + * @param int $pValue Value in EMU + * @return int Value in pixels + */ + public static function EMUToPixels($pValue = 0) { + if ($pValue != 0) { + return round($pValue / 9525); + } else { + return 0; + } + } + + /** + * Convert pixels to column width. Exact algorithm not known. + * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875 + * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional. + * + * @param int $pValue Value in pixels + * @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook + * @return int Value in cell dimension + */ + public static function pixelsToCellDimension($pValue = 0, PHPExcel_Style_Font $pDefaultFont) { + // Font name and size + $name = $pDefaultFont->getName(); + $size = $pDefaultFont->getSize(); + + if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) { + // Exact width can be determined + $colWidth = $pValue + * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width'] + / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px']; + } else { + // We don't have data for this particular font and size, use approximation by + // extrapolating from Calibri 11 + $colWidth = $pValue * 11 + * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] + / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / $size; + } + + return $colWidth; + } + + /** + * Convert column width from (intrinsic) Excel units to pixels + * + * @param float $pValue Value in cell dimension + * @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook + * @return int Value in pixels + */ + public static function cellDimensionToPixels($pValue = 0, PHPExcel_Style_Font $pDefaultFont) { + // Font name and size + $name = $pDefaultFont->getName(); + $size = $pDefaultFont->getSize(); + + if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) { + // Exact width can be determined + $colWidth = $pValue + * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px'] + / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width']; + + } else { + // We don't have data for this particular font and size, use approximation by + // extrapolating from Calibri 11 + $colWidth = $pValue * $size + * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] + / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / 11; + } + + // Round pixels to closest integer + $colWidth = (int) round($colWidth); + + return $colWidth; + } + + /** + * Convert pixels to points + * + * @param int $pValue Value in pixels + * @return int Value in points + */ + public static function pixelsToPoints($pValue = 0) { + return $pValue * 0.67777777; + } + + /** + * Convert points to pixels + * + * @param int $pValue Value in points + * @return int Value in pixels + */ + public static function pointsToPixels($pValue = 0) { + if ($pValue != 0) { + return (int) ceil($pValue * 1.333333333); + } else { + return 0; + } + } + + /** + * Convert degrees to angle + * + * @param int $pValue Degrees + * @return int Angle + */ + public static function degreesToAngle($pValue = 0) { + return (int)round($pValue * 60000); + } + + /** + * Convert angle to degrees + * + * @param int $pValue Angle + * @return int Degrees + */ + public static function angleToDegrees($pValue = 0) { + if ($pValue != 0) { + return round($pValue / 60000); + } else { + return 0; + } + } + + /** + * Create a new image from file. By alexander at alexauto dot nl + * + * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214 + * @param string $filename Path to Windows DIB (BMP) image + * @return resource + */ + public static function imagecreatefrombmp($p_sFile) + { + // Load the image into a string + $file = fopen($p_sFile,"rb"); + $read = fread($file,10); + while(!feof($file)&&($read<>"")) + $read .= fread($file,1024); + + $temp = unpack("H*",$read); + $hex = $temp[1]; + $header = substr($hex,0,108); + + // Process the header + // Structure: http://www.fastgraph.com/help/bmp_header_format.html + if (substr($header,0,4)=="424d") + { + // Cut it in parts of 2 bytes + $header_parts = str_split($header,2); + + // Get the width 4 bytes + $width = hexdec($header_parts[19].$header_parts[18]); + + // Get the height 4 bytes + $height = hexdec($header_parts[23].$header_parts[22]); + + // Unset the header params + unset($header_parts); + } + + // Define starting X and Y + $x = 0; + $y = 1; + + // Create newimage + $image = imagecreatetruecolor($width,$height); + + // Grab the body from the image + $body = substr($hex,108); + + // Calculate if padding at the end-line is needed + // Divided by two to keep overview. + // 1 byte = 2 HEX-chars + $body_size = (strlen($body)/2); + $header_size = ($width*$height); + + // Use end-line padding? Only when needed + $usePadding = ($body_size>($header_size*3)+4); + + // Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption + // Calculate the next DWORD-position in the body + for ($i=0;$i<$body_size;$i+=3) + { + // Calculate line-ending and padding + if ($x>=$width) + { + // If padding needed, ignore image-padding + // Shift i to the ending of the current 32-bit-block + if ($usePadding) + $i += $width%4; + + // Reset horizontal position + $x = 0; + + // Raise the height-position (bottom-up) + $y++; + + // Reached the image-height? Break the for-loop + if ($y>$height) + break; + } + + // Calculation of the RGB-pixel (defined as BGR in image-data) + // Define $i_pos as absolute position in the body + $i_pos = $i*2; + $r = hexdec($body[$i_pos+4].$body[$i_pos+5]); + $g = hexdec($body[$i_pos+2].$body[$i_pos+3]); + $b = hexdec($body[$i_pos].$body[$i_pos+1]); + + // Calculate and draw the pixel + $color = imagecolorallocate($image,$r,$g,$b); + imagesetpixel($image,$x,$height-$y,$color); + + // Raise the horizontal position + $x++; + } + + // Unset the body / free the memory + unset($body); + + // Return image-object + return $image; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher.php new file mode 100644 index 000000000..ecd8216aa --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher.php @@ -0,0 +1,91 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher +{ + /** + * Drawing Group Container + * + * @var PHPExcel_Shared_Escher_DggContainer + */ + private $_dggContainer; + + /** + * Drawing Container + * + * @var PHPExcel_Shared_Escher_DgContainer + */ + private $_dgContainer; + + /** + * Get Drawing Group Container + * + * @return PHPExcel_Shared_Escher_DgContainer + */ + public function getDggContainer() + { + return $this->_dggContainer; + } + + /** + * Set Drawing Group Container + * + * @param PHPExcel_Shared_Escher_DggContainer $dggContainer + */ + public function setDggContainer($dggContainer) + { + return $this->_dggContainer = $dggContainer; + } + + /** + * Get Drawing Container + * + * @return PHPExcel_Shared_Escher_DgContainer + */ + public function getDgContainer() + { + return $this->_dgContainer; + } + + /** + * Set Drawing Container + * + * @param PHPExcel_Shared_Escher_DgContainer $dgContainer + */ + public function setDgContainer($dgContainer) + { + return $this->_dgContainer = $dgContainer; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer.php new file mode 100644 index 000000000..adbe429db --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer.php @@ -0,0 +1,83 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DgContainer + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DgContainer +{ + /** + * Drawing index, 1-based. + * + * @var int + */ + private $_dgId; + + /** + * Last shape index in this drawing + * + * @var int + */ + private $_lastSpId; + + private $_spgrContainer = null; + + public function getDgId() + { + return $this->_dgId; + } + + public function setDgId($value) + { + $this->_dgId = $value; + } + + public function getLastSpId() + { + return $this->_lastSpId; + } + + public function setLastSpId($value) + { + $this->_lastSpId = $value; + } + + public function getSpgrContainer() + { + return $this->_spgrContainer; + } + + public function setSpgrContainer($spgrContainer) + { + return $this->_spgrContainer = $spgrContainer; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php new file mode 100644 index 000000000..ea0235e8b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php @@ -0,0 +1,109 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DgContainer_SpgrContainer + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DgContainer_SpgrContainer +{ + /** + * Parent Shape Group Container + * + * @var PHPExcel_Shared_Escher_DgContainer_SpgrContainer + */ + private $_parent; + + /** + * Shape Container collection + * + * @var array + */ + private $_children = array(); + + /** + * Set parent Shape Group Container + * + * @param PHPExcel_Shared_Escher_DgContainer_SpgrContainer $parent + */ + public function setParent($parent) + { + $this->_parent = $parent; + } + + /** + * Get the parent Shape Group Container if any + * + * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer|null + */ + public function getParent() + { + return $this->_parent; + } + + /** + * Add a child. This will be either spgrContainer or spContainer + * + * @param mixed $child + */ + public function addChild($child) + { + $this->_children[] = $child; + $child->setParent($this); + } + + /** + * Get collection of Shape Containers + */ + public function getChildren() + { + return $this->_children; + } + + /** + * Recursively get all spContainers within this spgrContainer + * + * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer[] + */ + public function getAllSpContainers() + { + $allSpContainers = array(); + + foreach ($this->_children as $child) { + if ($child instanceof PHPExcel_Shared_Escher_DgContainer_SpgrContainer) { + $allSpContainers = array_merge($allSpContainers, $child->getAllSpContainers()); + } else { + $allSpContainers[] = $child; + } + } + + return $allSpContainers; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php new file mode 100644 index 000000000..cb4988c84 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php @@ -0,0 +1,395 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer +{ + /** + * Parent Shape Group Container + * + * @var PHPExcel_Shared_Escher_DgContainer_SpgrContainer + */ + private $_parent; + + /** + * Is this a group shape? + * + * @var boolean + */ + private $_spgr = false; + + /** + * Shape type + * + * @var int + */ + private $_spType; + + /** + * Shape flag + * + * @var int + */ + private $_spFlag; + + /** + * Shape index (usually group shape has index 0, and the rest: 1,2,3...) + * + * @var boolean + */ + private $_spId; + + /** + * Array of options + * + * @var array + */ + private $_OPT; + + /** + * Cell coordinates of upper-left corner of shape, e.g. 'A1' + * + * @var string + */ + private $_startCoordinates; + + /** + * Horizontal offset of upper-left corner of shape measured in 1/1024 of column width + * + * @var int + */ + private $_startOffsetX; + + /** + * Vertical offset of upper-left corner of shape measured in 1/256 of row height + * + * @var int + */ + private $_startOffsetY; + + /** + * Cell coordinates of bottom-right corner of shape, e.g. 'B2' + * + * @var string + */ + private $_endCoordinates; + + /** + * Horizontal offset of bottom-right corner of shape measured in 1/1024 of column width + * + * @var int + */ + private $_endOffsetX; + + /** + * Vertical offset of bottom-right corner of shape measured in 1/256 of row height + * + * @var int + */ + private $_endOffsetY; + + /** + * Set parent Shape Group Container + * + * @param PHPExcel_Shared_Escher_DgContainer_SpgrContainer $parent + */ + public function setParent($parent) + { + $this->_parent = $parent; + } + + /** + * Get the parent Shape Group Container + * + * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer + */ + public function getParent() + { + return $this->_parent; + } + + /** + * Set whether this is a group shape + * + * @param boolean $value + */ + public function setSpgr($value = false) + { + $this->_spgr = $value; + } + + /** + * Get whether this is a group shape + * + * @return boolean + */ + public function getSpgr() + { + return $this->_spgr; + } + + /** + * Set the shape type + * + * @param int $value + */ + public function setSpType($value) + { + $this->_spType = $value; + } + + /** + * Get the shape type + * + * @return int + */ + public function getSpType() + { + return $this->_spType; + } + + /** + * Set the shape flag + * + * @param int $value + */ + public function setSpFlag($value) + { + $this->_spFlag = $value; + } + + /** + * Get the shape flag + * + * @return int + */ + public function getSpFlag() + { + return $this->_spFlag; + } + + /** + * Set the shape index + * + * @param int $value + */ + public function setSpId($value) + { + $this->_spId = $value; + } + + /** + * Get the shape index + * + * @return int + */ + public function getSpId() + { + return $this->_spId; + } + + /** + * Set an option for the Shape Group Container + * + * @param int $property The number specifies the option + * @param mixed $value + */ + public function setOPT($property, $value) + { + $this->_OPT[$property] = $value; + } + + /** + * Get an option for the Shape Group Container + * + * @param int $property The number specifies the option + * @return mixed + */ + public function getOPT($property) + { + if (isset($this->_OPT[$property])) { + return $this->_OPT[$property]; + } + return null; + } + + /** + * Get the collection of options + * + * @return array + */ + public function getOPTCollection() + { + return $this->_OPT; + } + + /** + * Set cell coordinates of upper-left corner of shape + * + * @param string $value + */ + public function setStartCoordinates($value = 'A1') + { + $this->_startCoordinates = $value; + } + + /** + * Get cell coordinates of upper-left corner of shape + * + * @return string + */ + public function getStartCoordinates() + { + return $this->_startCoordinates; + } + + /** + * Set offset in x-direction of upper-left corner of shape measured in 1/1024 of column width + * + * @param int $startOffsetX + */ + public function setStartOffsetX($startOffsetX = 0) + { + $this->_startOffsetX = $startOffsetX; + } + + /** + * Get offset in x-direction of upper-left corner of shape measured in 1/1024 of column width + * + * @return int + */ + public function getStartOffsetX() + { + return $this->_startOffsetX; + } + + /** + * Set offset in y-direction of upper-left corner of shape measured in 1/256 of row height + * + * @param int $startOffsetY + */ + public function setStartOffsetY($startOffsetY = 0) + { + $this->_startOffsetY = $startOffsetY; + } + + /** + * Get offset in y-direction of upper-left corner of shape measured in 1/256 of row height + * + * @return int + */ + public function getStartOffsetY() + { + return $this->_startOffsetY; + } + + /** + * Set cell coordinates of bottom-right corner of shape + * + * @param string $value + */ + public function setEndCoordinates($value = 'A1') + { + $this->_endCoordinates = $value; + } + + /** + * Get cell coordinates of bottom-right corner of shape + * + * @return string + */ + public function getEndCoordinates() + { + return $this->_endCoordinates; + } + + /** + * Set offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width + * + * @param int $startOffsetX + */ + public function setEndOffsetX($endOffsetX = 0) + { + $this->_endOffsetX = $endOffsetX; + } + + /** + * Get offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width + * + * @return int + */ + public function getEndOffsetX() + { + return $this->_endOffsetX; + } + + /** + * Set offset in y-direction of bottom-right corner of shape measured in 1/256 of row height + * + * @param int $endOffsetY + */ + public function setEndOffsetY($endOffsetY = 0) + { + $this->_endOffsetY = $endOffsetY; + } + + /** + * Get offset in y-direction of bottom-right corner of shape measured in 1/256 of row height + * + * @return int + */ + public function getEndOffsetY() + { + return $this->_endOffsetY; + } + + /** + * Get the nesting level of this spContainer. This is the number of spgrContainers between this spContainer and + * the dgContainer. A value of 1 = immediately within first spgrContainer + * Higher nesting level occurs if and only if spContainer is part of a shape group + * + * @return int Nesting level + */ + public function getNestingLevel() + { + $nestingLevel = 0; + + $parent = $this->getParent(); + while ($parent instanceof PHPExcel_Shared_Escher_DgContainer_SpgrContainer) { + ++$nestingLevel; + $parent = $parent->getParent(); + } + + return $nestingLevel; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer.php new file mode 100644 index 000000000..4fddbdf3f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer.php @@ -0,0 +1,203 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DggContainer + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DggContainer +{ + /** + * Maximum shape index of all shapes in all drawings increased by one + * + * @var int + */ + private $_spIdMax; + + /** + * Total number of drawings saved + * + * @var int + */ + private $_cDgSaved; + + /** + * Total number of shapes saved (including group shapes) + * + * @var int + */ + private $_cSpSaved; + + /** + * BLIP Store Container + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer + */ + private $_bstoreContainer; + + /** + * Array of options for the drawing group + * + * @var array + */ + private $_OPT = array(); + + /** + * Array of identifier clusters containg information about the maximum shape identifiers + * + * @var array + */ + private $_IDCLs = array(); + + /** + * Get maximum shape index of all shapes in all drawings (plus one) + * + * @return int + */ + public function getSpIdMax() + { + return $this->_spIdMax; + } + + /** + * Set maximum shape index of all shapes in all drawings (plus one) + * + * @param int + */ + public function setSpIdMax($value) + { + $this->_spIdMax = $value; + } + + /** + * Get total number of drawings saved + * + * @return int + */ + public function getCDgSaved() + { + return $this->_cDgSaved; + } + + /** + * Set total number of drawings saved + * + * @param int + */ + public function setCDgSaved($value) + { + $this->_cDgSaved = $value; + } + + /** + * Get total number of shapes saved (including group shapes) + * + * @return int + */ + public function getCSpSaved() + { + return $this->_cSpSaved; + } + + /** + * Set total number of shapes saved (including group shapes) + * + * @param int + */ + public function setCSpSaved($value) + { + $this->_cSpSaved = $value; + } + + /** + * Get BLIP Store Container + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer + */ + public function getBstoreContainer() + { + return $this->_bstoreContainer; + } + + /** + * Set BLIP Store Container + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer $bstoreContainer + */ + public function setBstoreContainer($bstoreContainer) + { + $this->_bstoreContainer = $bstoreContainer; + } + + /** + * Set an option for the drawing group + * + * @param int $property The number specifies the option + * @param mixed $value + */ + public function setOPT($property, $value) + { + $this->_OPT[$property] = $value; + } + + /** + * Get an option for the drawing group + * + * @param int $property The number specifies the option + * @return mixed + */ + public function getOPT($property) + { + if (isset($this->_OPT[$property])) { + return $this->_OPT[$property]; + } + return null; + } + + /** + * Get identifier clusters + * + * @return array + */ + public function getIDCLs() + { + return $this->_IDCLs; + } + + /** + * Set identifier clusters. array(<drawingId> => <max shape id>, ...) + * + * @param array $pValue + */ + public function setIDCLs($pValue) + { + $this->_IDCLs = $pValue; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php new file mode 100644 index 000000000..428c76e6a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php @@ -0,0 +1,65 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DggContainer_BstoreContainer +{ + /** + * BLIP Store Entries. Each of them holds one BLIP (Big Large Image or Picture) + * + * @var array + */ + private $_BSECollection = array(); + + /** + * Add a BLIP Store Entry + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $BSE + */ + public function addBSE($BSE) + { + $this->_BSECollection[] = $BSE; + $BSE->setParent($this); + } + + /** + * Get the collection of BLIP Store Entries + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE[] + */ + public function getBSECollection() + { + return $this->_BSECollection; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php new file mode 100644 index 000000000..1f10ae176 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php @@ -0,0 +1,120 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE +{ + const BLIPTYPE_ERROR = 0x00; + const BLIPTYPE_UNKNOWN = 0x01; + const BLIPTYPE_EMF = 0x02; + const BLIPTYPE_WMF = 0x03; + const BLIPTYPE_PICT = 0x04; + const BLIPTYPE_JPEG = 0x05; + const BLIPTYPE_PNG = 0x06; + const BLIPTYPE_DIB = 0x07; + const BLIPTYPE_TIFF = 0x11; + const BLIPTYPE_CMYKJPEG = 0x12; + + /** + * The parent BLIP Store Entry Container + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer + */ + private $_parent; + + /** + * The BLIP (Big Large Image or Picture) + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip + */ + private $_blip; + + /** + * The BLIP type + * + * @var int + */ + private $_blipType; + + /** + * Set parent BLIP Store Entry Container + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer $parent + */ + public function setParent($parent) + { + $this->_parent = $parent; + } + + /** + * Get the BLIP + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip + */ + public function getBlip() + { + return $this->_blip; + } + + /** + * Set the BLIP + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip $blip + */ + public function setBlip($blip) + { + $this->_blip = $blip; + $blip->setParent($this); + } + + /** + * Get the BLIP type + * + * @return int + */ + public function getBlipType() + { + return $this->_blipType; + } + + /** + * Set the BLIP type + * + * @param int + */ + public function setBlipType($blipType) + { + $this->_blipType = $blipType; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php new file mode 100644 index 000000000..0d28a6bf5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php @@ -0,0 +1,91 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip +{ + /** + * The parent BSE + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE + */ + private $_parent; + + /** + * Raw image data + * + * @var string + */ + private $_data; + + /** + * Get the raw image data + * + * @return string + */ + public function getData() + { + return $this->_data; + } + + /** + * Set the raw image data + * + * @param string + */ + public function setData($data) + { + $this->_data = $data; + } + + /** + * Set parent BSE + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $parent + */ + public function setParent($parent) + { + $this->_parent = $parent; + } + + /** + * Get parent BSE + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $parent + */ + public function getParent() + { + return $this->_parent; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Excel5.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Excel5.php new file mode 100644 index 000000000..629f621c8 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Excel5.php @@ -0,0 +1,317 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_Excel5 + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Excel5 +{ + /** + * Get the width of a column in pixels. We use the relationship y = ceil(7x) where + * x is the width in intrinsic Excel units (measuring width in number of normal characters) + * This holds for Arial 10 + * + * @param PHPExcel_Worksheet $sheet The sheet + * @param integer $col The column + * @return integer The width in pixels + */ + public static function sizeCol($sheet, $col = 'A') + { + // default font of the workbook + $font = $sheet->getParent()->getDefaultStyle()->getFont(); + + $columnDimensions = $sheet->getColumnDimensions(); + + // first find the true column width in pixels (uncollapsed and unhidden) + if ( isset($columnDimensions[$col]) and $columnDimensions[$col]->getWidth() != -1 ) { + + // then we have column dimension with explicit width + $columnDimension = $columnDimensions[$col]; + $width = $columnDimension->getWidth(); + $pixelWidth = PHPExcel_Shared_Drawing::cellDimensionToPixels($width, $font); + + } else if ($sheet->getDefaultColumnDimension()->getWidth() != -1) { + + // then we have default column dimension with explicit width + $defaultColumnDimension = $sheet->getDefaultColumnDimension(); + $width = $defaultColumnDimension->getWidth(); + $pixelWidth = PHPExcel_Shared_Drawing::cellDimensionToPixels($width, $font); + + } else { + + // we don't even have any default column dimension. Width depends on default font + $pixelWidth = PHPExcel_Shared_Font::getDefaultColumnWidthByFont($font, true); + } + + // now find the effective column width in pixels + if (isset($columnDimensions[$col]) and !$columnDimensions[$col]->getVisible()) { + $effectivePixelWidth = 0; + } else { + $effectivePixelWidth = $pixelWidth; + } + + return $effectivePixelWidth; + } + + /** + * Convert the height of a cell from user's units to pixels. By interpolation + * the relationship is: y = 4/3x. If the height hasn't been set by the user we + * use the default value. If the row is hidden we use a value of zero. + * + * @param PHPExcel_Worksheet $sheet The sheet + * @param integer $row The row index (1-based) + * @return integer The width in pixels + */ + public static function sizeRow($sheet, $row = 1) + { + // default font of the workbook + $font = $sheet->getParent()->getDefaultStyle()->getFont(); + + $rowDimensions = $sheet->getRowDimensions(); + + // first find the true row height in pixels (uncollapsed and unhidden) + if ( isset($rowDimensions[$row]) and $rowDimensions[$row]->getRowHeight() != -1) { + + // then we have a row dimension + $rowDimension = $rowDimensions[$row]; + $rowHeight = $rowDimension->getRowHeight(); + $pixelRowHeight = (int) ceil(4 * $rowHeight / 3); // here we assume Arial 10 + + } else if ($sheet->getDefaultRowDimension()->getRowHeight() != -1) { + + // then we have a default row dimension with explicit height + $defaultRowDimension = $sheet->getDefaultRowDimension(); + $rowHeight = $defaultRowDimension->getRowHeight(); + $pixelRowHeight = PHPExcel_Shared_Drawing::pointsToPixels($rowHeight); + + } else { + + // we don't even have any default row dimension. Height depends on default font + $pointRowHeight = PHPExcel_Shared_Font::getDefaultRowHeightByFont($font); + $pixelRowHeight = PHPExcel_Shared_Font::fontSizeToPixels($pointRowHeight); + + } + + // now find the effective row height in pixels + if ( isset($rowDimensions[$row]) and !$rowDimensions[$row]->getVisible() ) { + $effectivePixelRowHeight = 0; + } else { + $effectivePixelRowHeight = $pixelRowHeight; + } + + return $effectivePixelRowHeight; + } + + /** + * Get the horizontal distance in pixels between two anchors + * The distanceX is found as sum of all the spanning columns widths minus correction for the two offsets + * + * @param PHPExcel_Worksheet $sheet + * @param string $startColumn + * @param integer $startOffset Offset within start cell measured in 1/1024 of the cell width + * @param string $endColumn + * @param integer $endOffset Offset within end cell measured in 1/1024 of the cell width + * @return integer Horizontal measured in pixels + */ + public static function getDistanceX(PHPExcel_Worksheet $sheet, $startColumn = 'A', $startOffsetX = 0, $endColumn = 'A', $endOffsetX = 0) + { + $distanceX = 0; + + // add the widths of the spanning columns + $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1; // 1-based + $endColumnIndex = PHPExcel_Cell::columnIndexFromString($endColumn) - 1; // 1-based + for ($i = $startColumnIndex; $i <= $endColumnIndex; ++$i) { + $distanceX += self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($i)); + } + + // correct for offsetX in startcell + $distanceX -= (int) floor(self::sizeCol($sheet, $startColumn) * $startOffsetX / 1024); + + // correct for offsetX in endcell + $distanceX -= (int) floor(self::sizeCol($sheet, $endColumn) * (1 - $endOffsetX / 1024)); + + return $distanceX; + } + + /** + * Get the vertical distance in pixels between two anchors + * The distanceY is found as sum of all the spanning rows minus two offsets + * + * @param PHPExcel_Worksheet $sheet + * @param string $startRow (1-based) + * @param integer $startOffset Offset within start cell measured in 1/256 of the cell height + * @param string $endRow (1-based) + * @param integer $endOffset Offset within end cell measured in 1/256 of the cell height + * @return integer Vertical distance measured in pixels + */ + public static function getDistanceY(PHPExcel_Worksheet $sheet, $startRow = 1, $startOffsetY = 0, $endRow = 1, $endOffsetY = 0) + { + $distanceY = 0; + + // add the widths of the spanning rows + for ($row = $startRow; $row <= $endRow; ++$row) { + $distanceY += self::sizeRow($sheet, $row); + } + + // correct for offsetX in startcell + $distanceY -= (int) floor(self::sizeRow($sheet, $startRow) * $startOffsetY / 256); + + // correct for offsetX in endcell + $distanceY -= (int) floor(self::sizeRow($sheet, $endRow) * (1 - $endOffsetY / 256)); + + return $distanceY; + } + + /** + * Convert 1-cell anchor coordinates to 2-cell anchor coordinates + * This function is ported from PEAR Spreadsheet_Writer_Excel with small modifications + * + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * + * @param PHPExcel_Worksheet $sheet + * @param string $coordinates E.g. 'A1' + * @param integer $offsetX Horizontal offset in pixels + * @param integer $offsetY Vertical offset in pixels + * @param integer $width Width in pixels + * @param integer $height Height in pixels + * @return array + */ + public static function oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height) + { + list($column, $row) = PHPExcel_Cell::coordinateFromString($coordinates); + $col_start = PHPExcel_Cell::columnIndexFromString($column) - 1; + $row_start = $row - 1; + + $x1 = $offsetX; + $y1 = $offsetY; + + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start))) { + $x1 = 0; + } + if ($y1 >= self::sizeRow($sheet, $row_start + 1)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end))) { + $width -= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end)); + ++$col_end; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= self::sizeRow($sheet, $row_end + 1)) { + $height -= self::sizeRow($sheet, $row_end + 1); + ++$row_end; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero height or width. + if (self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) == 0) { + return; + } + if (self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) == 0) { + return; + } + if (self::sizeRow($sheet, $row_start + 1) == 0) { + return; + } + if (self::sizeRow($sheet, $row_end + 1) == 0) { + return; + } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) * 1024; + $y1 = $y1 / self::sizeRow($sheet, $row_start + 1) * 256; + $x2 = ($width + 1) / self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) * 1024; // Distance to right side of object + $y2 = ($height + 1) / self::sizeRow($sheet, $row_end + 1) * 256; // Distance to bottom of object + + $startCoordinates = PHPExcel_Cell::stringFromColumnIndex($col_start) . ($row_start + 1); + $endCoordinates = PHPExcel_Cell::stringFromColumnIndex($col_end) . ($row_end + 1); + + $twoAnchor = array( + 'startCoordinates' => $startCoordinates, + 'startOffsetX' => $x1, + 'startOffsetY' => $y1, + 'endCoordinates' => $endCoordinates, + 'endOffsetX' => $x2, + 'endOffsetY' => $y2, + ); + + return $twoAnchor; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/File.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/File.php new file mode 100644 index 000000000..575ac3cd2 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/File.php @@ -0,0 +1,139 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_File + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_File +{ + /** + * Verify if a file exists + * + * @param string $pFilename Filename + * @return bool + */ + public static function file_exists($pFilename) { + // Sick construction, but it seems that + // file_exists returns strange values when + // doing the original file_exists on ZIP archives... + if ( strtolower(substr($pFilename, 0, 3)) == 'zip' ) { + // Open ZIP file and verify if the file exists + $zipFile = substr($pFilename, 6, strpos($pFilename, '#') - 6); + $archiveFile = substr($pFilename, strpos($pFilename, '#') + 1); + + $zip = new ZipArchive(); + if ($zip->open($zipFile) === true) { + $returnValue = ($zip->getFromName($archiveFile) !== false); + $zip->close(); + return $returnValue; + } else { + return false; + } + } else { + // Regular file_exists + return file_exists($pFilename); + } + } + + /** + * Returns canonicalized absolute pathname, also for ZIP archives + * + * @param string $pFilename + * @return string + */ + public static function realpath($pFilename) { + // Returnvalue + $returnValue = ''; + + // Try using realpath() + if (file_exists($pFilename)) { + $returnValue = realpath($pFilename); + } + + // Found something? + if ($returnValue == '' || ($returnValue === NULL)) { + $pathArray = explode('/' , $pFilename); + while(in_array('..', $pathArray) && $pathArray[0] != '..') { + for ($i = 0; $i < count($pathArray); ++$i) { + if ($pathArray[$i] == '..' && $i > 0) { + unset($pathArray[$i]); + unset($pathArray[$i - 1]); + break; + } + } + } + $returnValue = implode('/', $pathArray); + } + + // Return + return $returnValue; + } + + /** + * Get the systems temporary directory. + * + * @return string + */ + public static function sys_get_temp_dir() + { + // sys_get_temp_dir is only available since PHP 5.2.1 + // http://php.net/manual/en/function.sys-get-temp-dir.php#94119 + + if ( !function_exists('sys_get_temp_dir')) { + if ($temp = getenv('TMP') ) { + if ((!empty($temp)) && (file_exists($temp))) { return realpath($temp); } + } + if ($temp = getenv('TEMP') ) { + if ((!empty($temp)) && (file_exists($temp))) { return realpath($temp); } + } + if ($temp = getenv('TMPDIR') ) { + if ((!empty($temp)) && (file_exists($temp))) { return realpath($temp); } + } + + // trick for creating a file in system's temporary dir + // without knowing the path of the system's temporary dir + $temp = tempnam(__FILE__, ''); + if (file_exists($temp)) { + unlink($temp); + return realpath(dirname($temp)); + } + + return null; + } + + // use ordinary built-in PHP function + // There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only + // be called if we're running 5.2.1 or earlier + return realpath(sys_get_temp_dir()); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Font.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Font.php new file mode 100644 index 000000000..3d0662e88 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/Font.php @@ -0,0 +1,775 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_Font + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Font +{ + /* Methods for resolving autosize value */ + const AUTOSIZE_METHOD_APPROX = 'approx'; + const AUTOSIZE_METHOD_EXACT = 'exact'; + + private static $_autoSizeMethods = array( + self::AUTOSIZE_METHOD_APPROX, + self::AUTOSIZE_METHOD_EXACT, + ); + + /** Character set codes used by BIFF5-8 in Font records */ + const CHARSET_ANSI_LATIN = 0x00; + const CHARSET_SYSTEM_DEFAULT = 0x01; + const CHARSET_SYMBOL = 0x02; + const CHARSET_APPLE_ROMAN = 0x4D; + const CHARSET_ANSI_JAPANESE_SHIFTJIS = 0x80; + const CHARSET_ANSI_KOREAN_HANGUL = 0x81; + const CHARSET_ANSI_KOREAN_JOHAB = 0x82; + const CHARSET_ANSI_CHINESE_SIMIPLIFIED = 0x86; // gb2312 + const CHARSET_ANSI_CHINESE_TRADITIONAL = 0x88; // big5 + const CHARSET_ANSI_GREEK = 0xA1; + const CHARSET_ANSI_TURKISH = 0xA2; + const CHARSET_ANSI_VIETNAMESE = 0xA3; + const CHARSET_ANSI_HEBREW = 0xB1; + const CHARSET_ANSI_ARABIC = 0xB2; + const CHARSET_ANSI_BALTIC = 0xBA; + const CHARSET_ANSI_CYRILLIC = 0xCC; + const CHARSET_ANSI_THAI = 0xDD; + const CHARSET_ANSI_LATIN_II = 0xEE; + const CHARSET_OEM_LATIN_I = 0xFF; + + // XXX: Constants created! + /** Font filenames */ + const ARIAL = 'arial.ttf'; + const ARIAL_BOLD = 'arialbd.ttf'; + const ARIAL_ITALIC = 'ariali.ttf'; + const ARIAL_BOLD_ITALIC = 'arialbi.ttf'; + + const CALIBRI = 'CALIBRI.TTF'; + const CALIBRI_BOLD = 'CALIBRIB.TTF'; + const CALIBRI_ITALIC = 'CALIBRII.TTF'; + const CALIBRI_BOLD_ITALIC = 'CALIBRIZ.TTF'; + + const COMIC_SANS_MS = 'comic.ttf'; + const COMIC_SANS_MS_BOLD = 'comicbd.ttf'; + + const COURIER_NEW = 'cour.ttf'; + const COURIER_NEW_BOLD = 'courbd.ttf'; + const COURIER_NEW_ITALIC = 'couri.ttf'; + const COURIER_NEW_BOLD_ITALIC = 'courbi.ttf'; + + const GEORGIA = 'georgia.ttf'; + const GEORGIA_BOLD = 'georgiab.ttf'; + const GEORGIA_ITALIC = 'georgiai.ttf'; + const GEORGIA_BOLD_ITALIC = 'georgiaz.ttf'; + + const IMPACT = 'impact.ttf'; + + const LIBERATION_SANS = 'LiberationSans-Regular.ttf'; + const LIBERATION_SANS_BOLD = 'LiberationSans-Bold.ttf'; + const LIBERATION_SANS_ITALIC = 'LiberationSans-Italic.ttf'; + const LIBERATION_SANS_BOLD_ITALIC = 'LiberationSans-BoldItalic.ttf'; + + const LUCIDA_CONSOLE = 'lucon.ttf'; + const LUCIDA_SANS_UNICODE = 'l_10646.ttf'; + + const MICROSOFT_SANS_SERIF = 'micross.ttf'; + + const PALATINO_LINOTYPE = 'pala.ttf'; + const PALATINO_LINOTYPE_BOLD = 'palab.ttf'; + const PALATINO_LINOTYPE_ITALIC = 'palai.ttf'; + const PALATINO_LINOTYPE_BOLD_ITALIC = 'palabi.ttf'; + + const SYMBOL = 'symbol.ttf'; + + const TAHOMA = 'tahoma.ttf'; + const TAHOMA_BOLD = 'tahomabd.ttf'; + + const TIMES_NEW_ROMAN = 'times.ttf'; + const TIMES_NEW_ROMAN_BOLD = 'timesbd.ttf'; + const TIMES_NEW_ROMAN_ITALIC = 'timesi.ttf'; + const TIMES_NEW_ROMAN_BOLD_ITALIC = 'timesbi.ttf'; + + const TREBUCHET_MS = 'trebuc.ttf'; + const TREBUCHET_MS_BOLD = 'trebucbd.ttf'; + const TREBUCHET_MS_ITALIC = 'trebucit.ttf'; + const TREBUCHET_MS_BOLD_ITALIC = 'trebucbi.ttf'; + + const VERDANA = 'verdana.ttf'; + const VERDANA_BOLD = 'verdanab.ttf'; + const VERDANA_ITALIC = 'verdanai.ttf'; + const VERDANA_BOLD_ITALIC = 'verdanaz.ttf'; + + /** + * AutoSize method + * + * @var string + */ + private static $autoSizeMethod = self::AUTOSIZE_METHOD_APPROX; + + /** + * Path to folder containing TrueType font .ttf files + * + * @var string + */ + private static $trueTypeFontPath = null; + + /** + * How wide is a default column for a given default font and size? + * Empirical data found by inspecting real Excel files and reading off the pixel width + * in Microsoft Office Excel 2007. + * + * @var array + */ + public static $defaultColumnWidths = array( + 'Arial' => array( + 1 => array('px' => 24, 'width' => 12.00000000), + 2 => array('px' => 24, 'width' => 12.00000000), + 3 => array('px' => 32, 'width' => 10.66406250), + 4 => array('px' => 32, 'width' => 10.66406250), + 5 => array('px' => 40, 'width' => 10.00000000), + 6 => array('px' => 48, 'width' => 9.59765625), + 7 => array('px' => 48, 'width' => 9.59765625), + 8 => array('px' => 56, 'width' => 9.33203125), + 9 => array('px' => 64, 'width' => 9.14062500), + 10 => array('px' => 64, 'width' => 9.14062500), + ), + 'Calibri' => array( + 1 => array('px' => 24, 'width' => 12.00000000), + 2 => array('px' => 24, 'width' => 12.00000000), + 3 => array('px' => 32, 'width' => 10.66406250), + 4 => array('px' => 32, 'width' => 10.66406250), + 5 => array('px' => 40, 'width' => 10.00000000), + 6 => array('px' => 48, 'width' => 9.59765625), + 7 => array('px' => 48, 'width' => 9.59765625), + 8 => array('px' => 56, 'width' => 9.33203125), + 9 => array('px' => 56, 'width' => 9.33203125), + 10 => array('px' => 64, 'width' => 9.14062500), + 11 => array('px' => 64, 'width' => 9.14062500), + ), + 'Verdana' => array( + 1 => array('px' => 24, 'width' => 12.00000000), + 2 => array('px' => 24, 'width' => 12.00000000), + 3 => array('px' => 32, 'width' => 10.66406250), + 4 => array('px' => 32, 'width' => 10.66406250), + 5 => array('px' => 40, 'width' => 10.00000000), + 6 => array('px' => 48, 'width' => 9.59765625), + 7 => array('px' => 48, 'width' => 9.59765625), + 8 => array('px' => 64, 'width' => 9.14062500), + 9 => array('px' => 72, 'width' => 9.00000000), + 10 => array('px' => 72, 'width' => 9.00000000), + ), + ); + + /** + * Set autoSize method + * + * @param string $pValue + * @return boolean Success or failure + */ + public static function setAutoSizeMethod($pValue = self::AUTOSIZE_METHOD_APPROX) + { + if (!in_array($pValue,self::$_autoSizeMethods)) { + return FALSE; + } + + self::$autoSizeMethod = $pValue; + + return TRUE; + } + + /** + * Get autoSize method + * + * @return string + */ + public static function getAutoSizeMethod() + { + return self::$autoSizeMethod; + } + + /** + * Set the path to the folder containing .ttf files. There should be a trailing slash. + * Typical locations on variout some platforms: + * <ul> + * <li>C:/Windows/Fonts/</li> + * <li>/usr/share/fonts/truetype/</li> + * <li>~/.fonts/</li> + * </ul> + * + * @param string $pValue + */ + public static function setTrueTypeFontPath($pValue = '') + { + self::$trueTypeFontPath = $pValue; + } + + /** + * Get the path to the folder containing .ttf files. + * + * @return string + */ + public static function getTrueTypeFontPath() + { + return self::$trueTypeFontPath; + } + + /** + * Calculate an (approximate) OpenXML column width, based on font size and text contained + * + * @param int $fontSize Font size (in pixels or points) + * @param bool $fontSizeInPixels Is the font size specified in pixels (true) or in points (false) ? + * @param string $cellText Text to calculate width + * @param int $rotation Rotation angle + * @return int Column width + */ + public static function calculateColumnWidth(PHPExcel_Style_Font $font, $cellText = '', $rotation = 0, PHPExcel_Style_Font $defaultFont = null) { + + // If it is rich text, use plain text + if ($cellText instanceof PHPExcel_RichText) { + $cellText = $cellText->getPlainText(); + } + + // Special case if there are one or more newline characters ("\n") + if (strpos($cellText, "\n") !== false) { + $lineTexts = explode("\n", $cellText); + $lineWitdhs = array(); + foreach ($lineTexts as $lineText) { + $lineWidths[] = self::calculateColumnWidth($font, $lineText, $rotation = 0, $defaultFont); + } + return max($lineWidths); // width of longest line in cell + } + + // Try to get the exact text width in pixels + try { + // If autosize method is set to 'approx', use approximation + if (self::$autoSizeMethod == self::AUTOSIZE_METHOD_APPROX) { + throw new Exception('AutoSize method is set to approx'); + } + + // Width of text in pixels excl. padding + $columnWidth = self::getTextWidthPixelsExact($cellText, $font, $rotation); + + // Excel adds some padding, use 1.07 of the width of an 'n' glyph + $columnWidth += ceil(self::getTextWidthPixelsExact('0', $font, 0) * 1.07); // pixels incl. padding + + } catch (Exception $e) { + // Width of text in pixels excl. padding, approximation + $columnWidth = self::getTextWidthPixelsApprox($cellText, $font, $rotation); + + // Excel adds some padding, just use approx width of 'n' glyph + $columnWidth += self::getTextWidthPixelsApprox('n', $font, 0); + } + + // Convert from pixel width to column width + $columnWidth = PHPExcel_Shared_Drawing::pixelsToCellDimension($columnWidth, $defaultFont); + + // Return + return round($columnWidth, 6); + } + + /** + * Get GD text width in pixels for a string of text in a certain font at a certain rotation angle + * + * @param string $text + * @param PHPExcel_Style_Font + * @param int $rotation + * @return int + * @throws Exception + */ + public static function getTextWidthPixelsExact($text, PHPExcel_Style_Font $font, $rotation = 0) { + if (!function_exists('imagettfbbox')) { + throw new Exception('GD library needs to be enabled'); + } + + // font size should really be supplied in pixels in GD2, + // but since GD2 seems to assume 72dpi, pixels and points are the same + $fontFile = self::getTrueTypeFontFileFromFont($font); + $textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text); + + // Get corners positions + $lowerLeftCornerX = $textBox[0]; + $lowerLeftCornerY = $textBox[1]; + $lowerRightCornerX = $textBox[2]; + $lowerRightCornerY = $textBox[3]; + $upperRightCornerX = $textBox[4]; + $upperRightCornerY = $textBox[5]; + $upperLeftCornerX = $textBox[6]; + $upperLeftCornerY = $textBox[7]; + + // Consider the rotation when calculating the width + $textWidth = max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX); + + return $textWidth; + } + + /** + * Get approximate width in pixels for a string of text in a certain font at a certain rotation angle + * + * @param string $columnText + * @param PHPExcel_Style_Font $font + * @param int $rotation + * @return int Text width in pixels (no padding added) + */ + public static function getTextWidthPixelsApprox($columnText, PHPExcel_Style_Font $font = null, $rotation = 0) + { + $fontName = $font->getName(); + $fontSize = $font->getSize(); + + // Calculate column width in pixels. We assume fixed glyph width. Result varies with font name and size. + switch ($fontName) { + case 'Calibri': + // value 8.26 was found via interpolation by inspecting real Excel files with Calibri 11 font. + $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size + break; + + case 'Arial': + // value 7 was found via interpolation by inspecting real Excel files with Arial 10 font. + $columnWidth = (int) (7 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size + break; + + case 'Verdana': + // value 8 was found via interpolation by inspecting real Excel files with Verdana 10 font. + $columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size + break; + + default: + // just assume Calibri + $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size + break; + } + + // Calculate approximate rotated column width + if ($rotation !== 0) { + if ($rotation == -165) { + // stacked text + $columnWidth = 4; // approximation + } else { + // rotated text + $columnWidth = $columnWidth * cos(deg2rad($rotation)) + + $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation + } + } + + // pixel width is an integer + $columnWidth = (int) $columnWidth; + return $columnWidth; + } + + /** + * Calculate an (approximate) pixel size, based on a font points size + * + * @param int $fontSizeInPoints Font size (in points) + * @return int Font size (in pixels) + */ + public static function fontSizeToPixels($fontSizeInPoints = 11) { + return (int) ((4 / 3) * $fontSizeInPoints); + } + + /** + * Calculate an (approximate) pixel size, based on inch size + * + * @param int $sizeInInch Font size (in inch) + * @return int Size (in pixels) + */ + public static function inchSizeToPixels($sizeInInch = 1) { + return ($sizeInInch * 96); + } + + /** + * Calculate an (approximate) pixel size, based on centimeter size + * + * @param int $sizeInCm Font size (in centimeters) + * @return int Size (in pixels) + */ + public static function centimeterSizeToPixels($sizeInCm = 1) { + return ($sizeInCm * 37.795275591); + } + + /** + * Returns the font path given the font + * + * @param PHPExcel_Style_Font + * @return string Path to TrueType font file + */ + public static function getTrueTypeFontFileFromFont($font) { + if (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath)) { + throw new Exception('Valid directory to TrueType Font files not specified'); + } + + $name = $font->getName(); + $bold = $font->getBold(); + $italic = $font->getItalic(); + + // Check if we can map font to true type font file + switch ($name) { + case 'Arial': + $fontFile = ( + $bold ? ($italic ? self::ARIAL_BOLD_ITALIC : self::ARIAL_BOLD) + : ($italic ? self::ARIAL_ITALIC : self::ARIAL) + ); + break; + + case 'Calibri': + $fontFile = ( + $bold ? ($italic ? self::CALIBRI_BOLD_ITALIC : self::CALIBRI_BOLD) + : ($italic ? self::CALIBRI_ITALIC : self::CALIBRI) + ); + break; + + case 'Courier New': + $fontFile = ( + $bold ? ($italic ? self::COURIER_NEW_BOLD_ITALIC : self::COURIER_NEW_BOLD) + : ($italic ? self::COURIER_NEW_ITALIC : self::COURIER_NEW) + ); + break; + + case 'Comic Sans MS': + $fontFile = ( + $bold ? self::COMIC_SANS_MS_BOLD : self::COMIC_SANS_MS + ); + break; + + case 'Georgia': + $fontFile = ( + $bold ? ($italic ? self::GEORGIA_BOLD_ITALIC : self::GEORGIA_BOLD) + : ($italic ? self::GEORGIA_ITALIC : self::GEORGIA) + ); + break; + + case 'Impact': + $fontFile = self::IMPACT; + break; + + case 'Liberation Sans': + $fontFile = ( + $bold ? ($italic ? self::LIBERATION_SANS_BOLD_ITALIC : self::LIBERATION_SANS_BOLD) + : ($italic ? self::LIBERATION_SANS_ITALIC : self::LIBERATION_SANS) + ); + break; + + case 'Lucida Console': + $fontFile = self::LUCIDA_CONSOLE; + break; + + case 'Lucida Sans Unicode': + $fontFile = self::LUCIDA_SANS_UNICODE; + break; + + case 'Microsoft Sans Serif': + $fontFile = self::MICROSOFT_SANS_SERIF; + break; + + case 'Palatino Linotype': + $fontFile = ( + $bold ? ($italic ? self::PALATINO_LINOTYPE_BOLD_ITALIC : self::PALATINO_LINOTYPE_BOLD) + : ($italic ? self::PALATINO_LINOTYPE_ITALIC : self::PALATINO_LINOTYPE) + ); + break; + + case 'Symbol': + $fontFile = self::SYMBOL; + break; + + case 'Tahoma': + $fontFile = ( + $bold ? self::TAHOMA_BOLD : self::TAHOMA + ); + break; + + case 'Times New Roman': + $fontFile = ( + $bold ? ($italic ? self::TIMES_NEW_ROMAN_BOLD_ITALIC : self::TIMES_NEW_ROMAN_BOLD) + : ($italic ? self::TIMES_NEW_ROMAN_ITALIC : self::TIMES_NEW_ROMAN) + ); + break; + + case 'Trebuchet MS': + $fontFile = ( + $bold ? ($italic ? self::TREBUCHET_MS_BOLD_ITALIC : self::TREBUCHET_MS_BOLD) + : ($italic ? self::TREBUCHET_MS_ITALIC : self::TREBUCHET_MS) + ); + break; + + case 'Verdana': + $fontFile = ( + $bold ? ($italic ? self::VERDANA_BOLD_ITALIC : self::VERDANA_BOLD) + : ($italic ? self::VERDANA_ITALIC : self::VERDANA) + ); + break; + + default: + throw new Exception('Unknown font name "'. $name .'". Cannot map to TrueType font file'); + break; + } + + $fontFile = self::$trueTypeFontPath . $fontFile; + + // Check if file actually exists + if (!file_exists($fontFile)) { + throw New Exception('TrueType Font file not found'); + } + + return $fontFile; + } + + /** + * Returns the associated charset for the font name. + * + * @param string $name Font name + * @return int Character set code + */ + public static function getCharsetFromFontName($name) + { + switch ($name) { + // Add more cases. Check FONT records in real Excel files. + case 'EucrosiaUPC': return self::CHARSET_ANSI_THAI; + case 'Wingdings': return self::CHARSET_SYMBOL; + case 'Wingdings 2': return self::CHARSET_SYMBOL; + case 'Wingdings 3': return self::CHARSET_SYMBOL; + default: return self::CHARSET_ANSI_LATIN; + } + } + + /** + * Get the effective column width for columns without a column dimension or column with width -1 + * For example, for Calibri 11 this is 9.140625 (64 px) + * + * @param PHPExcel_Style_Font $font The workbooks default font + * @param boolean $pPixels true = return column width in pixels, false = return in OOXML units + * @return mixed Column width + */ + public static function getDefaultColumnWidthByFont(PHPExcel_Style_Font $font, $pPixels = false) + { + if (isset(self::$defaultColumnWidths[$font->getName()][$font->getSize()])) { + // Exact width can be determined + $columnWidth = $pPixels ? + self::$defaultColumnWidths[$font->getName()][$font->getSize()]['px'] + : self::$defaultColumnWidths[$font->getName()][$font->getSize()]['width']; + + } else { + // We don't have data for this particular font and size, use approximation by + // extrapolating from Calibri 11 + $columnWidth = $pPixels ? + self::$defaultColumnWidths['Calibri'][11]['px'] + : self::$defaultColumnWidths['Calibri'][11]['width']; + $columnWidth = $columnWidth * $font->getSize() / 11; + + // Round pixels to closest integer + if ($pPixels) { + $columnWidth = (int) round($columnWidth); + } + } + + return $columnWidth; + } + + /** + * Get the effective row height for rows without a row dimension or rows with height -1 + * For example, for Calibri 11 this is 15 points + * + * @param PHPExcel_Style_Font $font The workbooks default font + * @return float Row height in points + */ + public static function getDefaultRowHeightByFont(PHPExcel_Style_Font $font) + { + switch ($font->getName()) { + case 'Arial': + switch ($font->getSize()) { + case 10: + // inspection of Arial 10 workbook says 12.75pt ~17px + $rowHeight = 12.75; + break; + + case 9: + // inspection of Arial 9 workbook says 12.00pt ~16px + $rowHeight = 12; + break; + + case 8: + // inspection of Arial 8 workbook says 11.25pt ~15px + $rowHeight = 11.25; + break; + + case 7: + // inspection of Arial 7 workbook says 9.00pt ~12px + $rowHeight = 9; + break; + + case 6: + case 5: + // inspection of Arial 5,6 workbook says 8.25pt ~11px + $rowHeight = 8.25; + break; + + case 4: + // inspection of Arial 4 workbook says 6.75pt ~9px + $rowHeight = 6.75; + break; + + case 3: + // inspection of Arial 3 workbook says 6.00pt ~8px + $rowHeight = 6; + break; + + case 2: + case 1: + // inspection of Arial 1,2 workbook says 5.25pt ~7px + $rowHeight = 5.25; + break; + + default: + // use Arial 10 workbook as an approximation, extrapolation + $rowHeight = 12.75 * $font->getSize() / 10; + break; + } + break; + + case 'Calibri': + switch ($font->getSize()) { + case 11: + // inspection of Calibri 11 workbook says 15.00pt ~20px + $rowHeight = 15; + break; + + case 10: + // inspection of Calibri 10 workbook says 12.75pt ~17px + $rowHeight = 12.75; + break; + + case 9: + // inspection of Calibri 9 workbook says 12.00pt ~16px + $rowHeight = 12; + break; + + case 8: + // inspection of Calibri 8 workbook says 11.25pt ~15px + $rowHeight = 11.25; + break; + + case 7: + // inspection of Calibri 7 workbook says 9.00pt ~12px + $rowHeight = 9; + break; + + case 6: + case 5: + // inspection of Calibri 5,6 workbook says 8.25pt ~11px + $rowHeight = 8.25; + break; + + case 4: + // inspection of Calibri 4 workbook says 6.75pt ~9px + $rowHeight = 6.75; + break; + + case 3: + // inspection of Calibri 3 workbook says 6.00pt ~8px + $rowHeight = 6.00; + break; + + case 2: + case 1: + // inspection of Calibri 1,2 workbook says 5.25pt ~7px + $rowHeight = 5.25; + break; + + default: + // use Calibri 11 workbook as an approximation, extrapolation + $rowHeight = 15 * $font->getSize() / 11; + break; + } + break; + + case 'Verdana': + switch ($font->getSize()) { + case 10: + // inspection of Verdana 10 workbook says 12.75pt ~17px + $rowHeight = 12.75; + break; + + case 9: + // inspection of Verdana 9 workbook says 11.25pt ~15px + $rowHeight = 11.25; + break; + + case 8: + // inspection of Verdana 8 workbook says 10.50pt ~14px + $rowHeight = 10.50; + break; + + case 7: + // inspection of Verdana 7 workbook says 9.00pt ~12px + $rowHeight = 9.00; + break; + + case 6: + case 5: + // inspection of Verdana 5,6 workbook says 8.25pt ~11px + $rowHeight = 8.25; + break; + + case 4: + // inspection of Verdana 4 workbook says 6.75pt ~9px + $rowHeight = 6.75; + break; + + case 3: + // inspection of Verdana 3 workbook says 6.00pt ~8px + $rowHeight = 6; + break; + + case 2: + case 1: + // inspection of Verdana 1,2 workbook says 5.25pt ~7px + $rowHeight = 5.25; + break; + + default: + // use Verdana 10 workbook as an approximation, extrapolation + $rowHeight = 12.75 * $font->getSize() / 10; + break; + } + break; + + default: + // just use Calibri as an approximation + $rowHeight = 15 * $font->getSize() / 11; + break; + } + + return $rowHeight; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/CHANGELOG.TXT b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/CHANGELOG.TXT new file mode 100644 index 000000000..1c18a5da3 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/CHANGELOG.TXT @@ -0,0 +1,16 @@ +Mar 1, 2005 11:15 AST by PM + ++ For consistency, renamed Math.php to Maths.java, utils to util, + tests to test, docs to doc - + ++ Removed conditional logic from top of Matrix class. + ++ Switched to using hypo function in Maths.php for all php-hypot calls. + NOTE TO SELF: Need to make sure that all decompositions have been + switched over to using the bundled hypo. + +Feb 25, 2005 at 10:00 AST by PM + ++ Recommend using simpler Error.php instead of JAMA_Error.php but + can be persuaded otherwise. + diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/CholeskyDecomposition.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/CholeskyDecomposition.php new file mode 100644 index 000000000..9d064f9e6 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/CholeskyDecomposition.php @@ -0,0 +1,149 @@ +<?php +/** + * @package JAMA + * + * Cholesky decomposition class + * + * For a symmetric, positive definite matrix A, the Cholesky decomposition + * is an lower triangular matrix L so that A = L*L'. + * + * If the matrix is not symmetric or positive definite, the constructor + * returns a partial decomposition and sets an internal flag that may + * be queried by the isSPD() method. + * + * @author Paul Meagher + * @author Michael Bommarito + * @version 1.2 + */ +class CholeskyDecomposition { + + /** + * Decomposition storage + * @var array + * @access private + */ + private $L = array(); + + /** + * Matrix row and column dimension + * @var int + * @access private + */ + private $m; + + /** + * Symmetric positive definite flag + * @var boolean + * @access private + */ + private $isspd = true; + + + /** + * CholeskyDecomposition + * + * Class constructor - decomposes symmetric positive definite matrix + * @param mixed Matrix square symmetric positive definite matrix + */ + public function __construct($A = null) { + if ($A instanceof Matrix) { + $this->L = $A->getArray(); + $this->m = $A->getRowDimension(); + + for($i = 0; $i < $this->m; ++$i) { + for($j = $i; $j < $this->m; ++$j) { + for($sum = $this->L[$i][$j], $k = $i - 1; $k >= 0; --$k) { + $sum -= $this->L[$i][$k] * $this->L[$j][$k]; + } + if ($i == $j) { + if ($sum >= 0) { + $this->L[$i][$i] = sqrt($sum); + } else { + $this->isspd = false; + } + } else { + if ($this->L[$i][$i] != 0) { + $this->L[$j][$i] = $sum / $this->L[$i][$i]; + } + } + } + + for ($k = $i+1; $k < $this->m; ++$k) { + $this->L[$i][$k] = 0.0; + } + } + } else { + throw new Exception(JAMAError(ArgumentTypeException)); + } + } // function __construct() + + + /** + * Is the matrix symmetric and positive definite? + * + * @return boolean + */ + public function isSPD() { + return $this->isspd; + } // function isSPD() + + + /** + * getL + * + * Return triangular factor. + * @return Matrix Lower triangular matrix + */ + public function getL() { + return new Matrix($this->L); + } // function getL() + + + /** + * Solve A*X = B + * + * @param $B Row-equal matrix + * @return Matrix L * L' * X = B + */ + public function solve($B = null) { + if ($B instanceof Matrix) { + if ($B->getRowDimension() == $this->m) { + if ($this->isspd) { + $X = $B->getArrayCopy(); + $nx = $B->getColumnDimension(); + + for ($k = 0; $k < $this->m; ++$k) { + for ($i = $k + 1; $i < $this->m; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X[$i][$j] -= $X[$k][$j] * $this->L[$i][$k]; + } + } + for ($j = 0; $j < $nx; ++$j) { + $X[$k][$j] /= $this->L[$k][$k]; + } + } + + for ($k = $this->m - 1; $k >= 0; --$k) { + for ($j = 0; $j < $nx; ++$j) { + $X[$k][$j] /= $this->L[$k][$k]; + } + for ($i = 0; $i < $k; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X[$i][$j] -= $X[$k][$j] * $this->L[$k][$i]; + } + } + } + + return new Matrix($X, $this->m, $nx); + } else { + throw new Exception(JAMAError(MatrixSPDException)); + } + } else { + throw new Exception(JAMAError(MatrixDimensionException)); + } + } else { + throw new Exception(JAMAError(ArgumentTypeException)); + } + } // function solve() + +} // class CholeskyDecomposition diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php new file mode 100644 index 000000000..2a696d00f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php @@ -0,0 +1,862 @@ +<?php +/** + * @package JAMA + * + * Class to obtain eigenvalues and eigenvectors of a real matrix. + * + * If A is symmetric, then A = V*D*V' where the eigenvalue matrix D + * is diagonal and the eigenvector matrix V is orthogonal (i.e. + * A = V.times(D.times(V.transpose())) and V.times(V.transpose()) + * equals the identity matrix). + * + * If A is not symmetric, then the eigenvalue matrix D is block diagonal + * with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + * lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + * columns of V represent the eigenvectors in the sense that A*V = V*D, + * i.e. A.times(V) equals V.times(D). The matrix V may be badly + * conditioned, or even singular, so the validity of the equation + * A = V*D*inverse(V) depends upon V.cond(). + * + * @author Paul Meagher + * @license PHP v3.0 + * @version 1.1 + */ +class EigenvalueDecomposition { + + /** + * Row and column dimension (square matrix). + * @var int + */ + private $n; + + /** + * Internal symmetry flag. + * @var int + */ + private $issymmetric; + + /** + * Arrays for internal storage of eigenvalues. + * @var array + */ + private $d = array(); + private $e = array(); + + /** + * Array for internal storage of eigenvectors. + * @var array + */ + private $V = array(); + + /** + * Array for internal storage of nonsymmetric Hessenberg form. + * @var array + */ + private $H = array(); + + /** + * Working storage for nonsymmetric algorithm. + * @var array + */ + private $ort; + + /** + * Used for complex scalar division. + * @var float + */ + private $cdivr; + private $cdivi; + + + /** + * Symmetric Householder reduction to tridiagonal form. + * + * @access private + */ + private function tred2 () { + // This is derived from the Algol procedures tred2 by + // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + // Fortran subroutine in EISPACK. + $this->d = $this->V[$this->n-1]; + // Householder reduction to tridiagonal form. + for ($i = $this->n-1; $i > 0; --$i) { + $i_ = $i -1; + // Scale to avoid under/overflow. + $h = $scale = 0.0; + $scale += array_sum(array_map(abs, $this->d)); + if ($scale == 0.0) { + $this->e[$i] = $this->d[$i_]; + $this->d = array_slice($this->V[$i_], 0, $i_); + for ($j = 0; $j < $i; ++$j) { + $this->V[$j][$i] = $this->V[$i][$j] = 0.0; + } + } else { + // Generate Householder vector. + for ($k = 0; $k < $i; ++$k) { + $this->d[$k] /= $scale; + $h += pow($this->d[$k], 2); + } + $f = $this->d[$i_]; + $g = sqrt($h); + if ($f > 0) { + $g = -$g; + } + $this->e[$i] = $scale * $g; + $h = $h - $f * $g; + $this->d[$i_] = $f - $g; + for ($j = 0; $j < $i; ++$j) { + $this->e[$j] = 0.0; + } + // Apply similarity transformation to remaining columns. + for ($j = 0; $j < $i; ++$j) { + $f = $this->d[$j]; + $this->V[$j][$i] = $f; + $g = $this->e[$j] + $this->V[$j][$j] * $f; + for ($k = $j+1; $k <= $i_; ++$k) { + $g += $this->V[$k][$j] * $this->d[$k]; + $this->e[$k] += $this->V[$k][$j] * $f; + } + $this->e[$j] = $g; + } + $f = 0.0; + for ($j = 0; $j < $i; ++$j) { + $this->e[$j] /= $h; + $f += $this->e[$j] * $this->d[$j]; + } + $hh = $f / (2 * $h); + for ($j=0; $j < $i; ++$j) { + $this->e[$j] -= $hh * $this->d[$j]; + } + for ($j = 0; $j < $i; ++$j) { + $f = $this->d[$j]; + $g = $this->e[$j]; + for ($k = $j; $k <= $i_; ++$k) { + $this->V[$k][$j] -= ($f * $this->e[$k] + $g * $this->d[$k]); + } + $this->d[$j] = $this->V[$i-1][$j]; + $this->V[$i][$j] = 0.0; + } + } + $this->d[$i] = $h; + } + + // Accumulate transformations. + for ($i = 0; $i < $this->n-1; ++$i) { + $this->V[$this->n-1][$i] = $this->V[$i][$i]; + $this->V[$i][$i] = 1.0; + $h = $this->d[$i+1]; + if ($h != 0.0) { + for ($k = 0; $k <= $i; ++$k) { + $this->d[$k] = $this->V[$k][$i+1] / $h; + } + for ($j = 0; $j <= $i; ++$j) { + $g = 0.0; + for ($k = 0; $k <= $i; ++$k) { + $g += $this->V[$k][$i+1] * $this->V[$k][$j]; + } + for ($k = 0; $k <= $i; ++$k) { + $this->V[$k][$j] -= $g * $this->d[$k]; + } + } + } + for ($k = 0; $k <= $i; ++$k) { + $this->V[$k][$i+1] = 0.0; + } + } + + $this->d = $this->V[$this->n-1]; + $this->V[$this->n-1] = array_fill(0, $j, 0.0); + $this->V[$this->n-1][$this->n-1] = 1.0; + $this->e[0] = 0.0; + } + + + /** + * Symmetric tridiagonal QL algorithm. + * + * This is derived from the Algol procedures tql2, by + * Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + * Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + * Fortran subroutine in EISPACK. + * + * @access private + */ + private function tql2() { + for ($i = 1; $i < $this->n; ++$i) { + $this->e[$i-1] = $this->e[$i]; + } + $this->e[$this->n-1] = 0.0; + $f = 0.0; + $tst1 = 0.0; + $eps = pow(2.0,-52.0); + + for ($l = 0; $l < $this->n; ++$l) { + // Find small subdiagonal element + $tst1 = max($tst1, abs($this->d[$l]) + abs($this->e[$l])); + $m = $l; + while ($m < $this->n) { + if (abs($this->e[$m]) <= $eps * $tst1) + break; + ++$m; + } + // If m == l, $this->d[l] is an eigenvalue, + // otherwise, iterate. + if ($m > $l) { + $iter = 0; + do { + // Could check iteration count here. + $iter += 1; + // Compute implicit shift + $g = $this->d[$l]; + $p = ($this->d[$l+1] - $g) / (2.0 * $this->e[$l]); + $r = hypo($p, 1.0); + if ($p < 0) + $r *= -1; + $this->d[$l] = $this->e[$l] / ($p + $r); + $this->d[$l+1] = $this->e[$l] * ($p + $r); + $dl1 = $this->d[$l+1]; + $h = $g - $this->d[$l]; + for ($i = $l + 2; $i < $this->n; ++$i) + $this->d[$i] -= $h; + $f += $h; + // Implicit QL transformation. + $p = $this->d[$m]; + $c = 1.0; + $c2 = $c3 = $c; + $el1 = $this->e[$l + 1]; + $s = $s2 = 0.0; + for ($i = $m-1; $i >= $l; --$i) { + $c3 = $c2; + $c2 = $c; + $s2 = $s; + $g = $c * $this->e[$i]; + $h = $c * $p; + $r = hypo($p, $this->e[$i]); + $this->e[$i+1] = $s * $r; + $s = $this->e[$i] / $r; + $c = $p / $r; + $p = $c * $this->d[$i] - $s * $g; + $this->d[$i+1] = $h + $s * ($c * $g + $s * $this->d[$i]); + // Accumulate transformation. + for ($k = 0; $k < $this->n; ++$k) { + $h = $this->V[$k][$i+1]; + $this->V[$k][$i+1] = $s * $this->V[$k][$i] + $c * $h; + $this->V[$k][$i] = $c * $this->V[$k][$i] - $s * $h; + } + } + $p = -$s * $s2 * $c3 * $el1 * $this->e[$l] / $dl1; + $this->e[$l] = $s * $p; + $this->d[$l] = $c * $p; + // Check for convergence. + } while (abs($this->e[$l]) > $eps * $tst1); + } + $this->d[$l] = $this->d[$l] + $f; + $this->e[$l] = 0.0; + } + + // Sort eigenvalues and corresponding vectors. + for ($i = 0; $i < $this->n - 1; ++$i) { + $k = $i; + $p = $this->d[$i]; + for ($j = $i+1; $j < $this->n; ++$j) { + if ($this->d[$j] < $p) { + $k = $j; + $p = $this->d[$j]; + } + } + if ($k != $i) { + $this->d[$k] = $this->d[$i]; + $this->d[$i] = $p; + for ($j = 0; $j < $this->n; ++$j) { + $p = $this->V[$j][$i]; + $this->V[$j][$i] = $this->V[$j][$k]; + $this->V[$j][$k] = $p; + } + } + } + } + + + /** + * Nonsymmetric reduction to Hessenberg form. + * + * This is derived from the Algol procedures orthes and ortran, + * by Martin and Wilkinson, Handbook for Auto. Comp., + * Vol.ii-Linear Algebra, and the corresponding + * Fortran subroutines in EISPACK. + * + * @access private + */ + private function orthes () { + $low = 0; + $high = $this->n-1; + + for ($m = $low+1; $m <= $high-1; ++$m) { + // Scale column. + $scale = 0.0; + for ($i = $m; $i <= $high; ++$i) { + $scale = $scale + abs($this->H[$i][$m-1]); + } + if ($scale != 0.0) { + // Compute Householder transformation. + $h = 0.0; + for ($i = $high; $i >= $m; --$i) { + $this->ort[$i] = $this->H[$i][$m-1] / $scale; + $h += $this->ort[$i] * $this->ort[$i]; + } + $g = sqrt($h); + if ($this->ort[$m] > 0) { + $g *= -1; + } + $h -= $this->ort[$m] * $g; + $this->ort[$m] -= $g; + // Apply Householder similarity transformation + // H = (I -u * u' / h) * H * (I -u * u') / h) + for ($j = $m; $j < $this->n; ++$j) { + $f = 0.0; + for ($i = $high; $i >= $m; --$i) { + $f += $this->ort[$i] * $this->H[$i][$j]; + } + $f /= $h; + for ($i = $m; $i <= $high; ++$i) { + $this->H[$i][$j] -= $f * $this->ort[$i]; + } + } + for ($i = 0; $i <= $high; ++$i) { + $f = 0.0; + for ($j = $high; $j >= $m; --$j) { + $f += $this->ort[$j] * $this->H[$i][$j]; + } + $f = $f / $h; + for ($j = $m; $j <= $high; ++$j) { + $this->H[$i][$j] -= $f * $this->ort[$j]; + } + } + $this->ort[$m] = $scale * $this->ort[$m]; + $this->H[$m][$m-1] = $scale * $g; + } + } + + // Accumulate transformations (Algol's ortran). + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $this->V[$i][$j] = ($i == $j ? 1.0 : 0.0); + } + } + for ($m = $high-1; $m >= $low+1; --$m) { + if ($this->H[$m][$m-1] != 0.0) { + for ($i = $m+1; $i <= $high; ++$i) { + $this->ort[$i] = $this->H[$i][$m-1]; + } + for ($j = $m; $j <= $high; ++$j) { + $g = 0.0; + for ($i = $m; $i <= $high; ++$i) { + $g += $this->ort[$i] * $this->V[$i][$j]; + } + // Double division avoids possible underflow + $g = ($g / $this->ort[$m]) / $this->H[$m][$m-1]; + for ($i = $m; $i <= $high; ++$i) { + $this->V[$i][$j] += $g * $this->ort[$i]; + } + } + } + } + } + + + /** + * Performs complex division. + * + * @access private + */ + private function cdiv($xr, $xi, $yr, $yi) { + if (abs($yr) > abs($yi)) { + $r = $yi / $yr; + $d = $yr + $r * $yi; + $this->cdivr = ($xr + $r * $xi) / $d; + $this->cdivi = ($xi - $r * $xr) / $d; + } else { + $r = $yr / $yi; + $d = $yi + $r * $yr; + $this->cdivr = ($r * $xr + $xi) / $d; + $this->cdivi = ($r * $xi - $xr) / $d; + } + } + + + /** + * Nonsymmetric reduction from Hessenberg to real Schur form. + * + * Code is derived from the Algol procedure hqr2, + * by Martin and Wilkinson, Handbook for Auto. Comp., + * Vol.ii-Linear Algebra, and the corresponding + * Fortran subroutine in EISPACK. + * + * @access private + */ + private function hqr2 () { + // Initialize + $nn = $this->n; + $n = $nn - 1; + $low = 0; + $high = $nn - 1; + $eps = pow(2.0, -52.0); + $exshift = 0.0; + $p = $q = $r = $s = $z = 0; + // Store roots isolated by balanc and compute matrix norm + $norm = 0.0; + + for ($i = 0; $i < $nn; ++$i) { + if (($i < $low) OR ($i > $high)) { + $this->d[$i] = $this->H[$i][$i]; + $this->e[$i] = 0.0; + } + for ($j = max($i-1, 0); $j < $nn; ++$j) { + $norm = $norm + abs($this->H[$i][$j]); + } + } + + // Outer loop over eigenvalue index + $iter = 0; + while ($n >= $low) { + // Look for single small sub-diagonal element + $l = $n; + while ($l > $low) { + $s = abs($this->H[$l-1][$l-1]) + abs($this->H[$l][$l]); + if ($s == 0.0) { + $s = $norm; + } + if (abs($this->H[$l][$l-1]) < $eps * $s) { + break; + } + --$l; + } + // Check for convergence + // One root found + if ($l == $n) { + $this->H[$n][$n] = $this->H[$n][$n] + $exshift; + $this->d[$n] = $this->H[$n][$n]; + $this->e[$n] = 0.0; + --$n; + $iter = 0; + // Two roots found + } else if ($l == $n-1) { + $w = $this->H[$n][$n-1] * $this->H[$n-1][$n]; + $p = ($this->H[$n-1][$n-1] - $this->H[$n][$n]) / 2.0; + $q = $p * $p + $w; + $z = sqrt(abs($q)); + $this->H[$n][$n] = $this->H[$n][$n] + $exshift; + $this->H[$n-1][$n-1] = $this->H[$n-1][$n-1] + $exshift; + $x = $this->H[$n][$n]; + // Real pair + if ($q >= 0) { + if ($p >= 0) { + $z = $p + $z; + } else { + $z = $p - $z; + } + $this->d[$n-1] = $x + $z; + $this->d[$n] = $this->d[$n-1]; + if ($z != 0.0) { + $this->d[$n] = $x - $w / $z; + } + $this->e[$n-1] = 0.0; + $this->e[$n] = 0.0; + $x = $this->H[$n][$n-1]; + $s = abs($x) + abs($z); + $p = $x / $s; + $q = $z / $s; + $r = sqrt($p * $p + $q * $q); + $p = $p / $r; + $q = $q / $r; + // Row modification + for ($j = $n-1; $j < $nn; ++$j) { + $z = $this->H[$n-1][$j]; + $this->H[$n-1][$j] = $q * $z + $p * $this->H[$n][$j]; + $this->H[$n][$j] = $q * $this->H[$n][$j] - $p * $z; + } + // Column modification + for ($i = 0; $i <= n; ++$i) { + $z = $this->H[$i][$n-1]; + $this->H[$i][$n-1] = $q * $z + $p * $this->H[$i][$n]; + $this->H[$i][$n] = $q * $this->H[$i][$n] - $p * $z; + } + // Accumulate transformations + for ($i = $low; $i <= $high; ++$i) { + $z = $this->V[$i][$n-1]; + $this->V[$i][$n-1] = $q * $z + $p * $this->V[$i][$n]; + $this->V[$i][$n] = $q * $this->V[$i][$n] - $p * $z; + } + // Complex pair + } else { + $this->d[$n-1] = $x + $p; + $this->d[$n] = $x + $p; + $this->e[$n-1] = $z; + $this->e[$n] = -$z; + } + $n = $n - 2; + $iter = 0; + // No convergence yet + } else { + // Form shift + $x = $this->H[$n][$n]; + $y = 0.0; + $w = 0.0; + if ($l < $n) { + $y = $this->H[$n-1][$n-1]; + $w = $this->H[$n][$n-1] * $this->H[$n-1][$n]; + } + // Wilkinson's original ad hoc shift + if ($iter == 10) { + $exshift += $x; + for ($i = $low; $i <= $n; ++$i) { + $this->H[$i][$i] -= $x; + } + $s = abs($this->H[$n][$n-1]) + abs($this->H[$n-1][$n-2]); + $x = $y = 0.75 * $s; + $w = -0.4375 * $s * $s; + } + // MATLAB's new ad hoc shift + if ($iter == 30) { + $s = ($y - $x) / 2.0; + $s = $s * $s + $w; + if ($s > 0) { + $s = sqrt($s); + if ($y < $x) { + $s = -$s; + } + $s = $x - $w / (($y - $x) / 2.0 + $s); + for ($i = $low; $i <= $n; ++$i) { + $this->H[$i][$i] -= $s; + } + $exshift += $s; + $x = $y = $w = 0.964; + } + } + // Could check iteration count here. + $iter = $iter + 1; + // Look for two consecutive small sub-diagonal elements + $m = $n - 2; + while ($m >= $l) { + $z = $this->H[$m][$m]; + $r = $x - $z; + $s = $y - $z; + $p = ($r * $s - $w) / $this->H[$m+1][$m] + $this->H[$m][$m+1]; + $q = $this->H[$m+1][$m+1] - $z - $r - $s; + $r = $this->H[$m+2][$m+1]; + $s = abs($p) + abs($q) + abs($r); + $p = $p / $s; + $q = $q / $s; + $r = $r / $s; + if ($m == $l) { + break; + } + if (abs($this->H[$m][$m-1]) * (abs($q) + abs($r)) < + $eps * (abs($p) * (abs($this->H[$m-1][$m-1]) + abs($z) + abs($this->H[$m+1][$m+1])))) { + break; + } + --$m; + } + for ($i = $m + 2; $i <= $n; ++$i) { + $this->H[$i][$i-2] = 0.0; + if ($i > $m+2) { + $this->H[$i][$i-3] = 0.0; + } + } + // Double QR step involving rows l:n and columns m:n + for ($k = $m; $k <= $n-1; ++$k) { + $notlast = ($k != $n-1); + if ($k != $m) { + $p = $this->H[$k][$k-1]; + $q = $this->H[$k+1][$k-1]; + $r = ($notlast ? $this->H[$k+2][$k-1] : 0.0); + $x = abs($p) + abs($q) + abs($r); + if ($x != 0.0) { + $p = $p / $x; + $q = $q / $x; + $r = $r / $x; + } + } + if ($x == 0.0) { + break; + } + $s = sqrt($p * $p + $q * $q + $r * $r); + if ($p < 0) { + $s = -$s; + } + if ($s != 0) { + if ($k != $m) { + $this->H[$k][$k-1] = -$s * $x; + } elseif ($l != $m) { + $this->H[$k][$k-1] = -$this->H[$k][$k-1]; + } + $p = $p + $s; + $x = $p / $s; + $y = $q / $s; + $z = $r / $s; + $q = $q / $p; + $r = $r / $p; + // Row modification + for ($j = $k; $j < $nn; ++$j) { + $p = $this->H[$k][$j] + $q * $this->H[$k+1][$j]; + if ($notlast) { + $p = $p + $r * $this->H[$k+2][$j]; + $this->H[$k+2][$j] = $this->H[$k+2][$j] - $p * $z; + } + $this->H[$k][$j] = $this->H[$k][$j] - $p * $x; + $this->H[$k+1][$j] = $this->H[$k+1][$j] - $p * $y; + } + // Column modification + for ($i = 0; $i <= min($n, $k+3); ++$i) { + $p = $x * $this->H[$i][$k] + $y * $this->H[$i][$k+1]; + if ($notlast) { + $p = $p + $z * $this->H[$i][$k+2]; + $this->H[$i][$k+2] = $this->H[$i][$k+2] - $p * $r; + } + $this->H[$i][$k] = $this->H[$i][$k] - $p; + $this->H[$i][$k+1] = $this->H[$i][$k+1] - $p * $q; + } + // Accumulate transformations + for ($i = $low; $i <= $high; ++$i) { + $p = $x * $this->V[$i][$k] + $y * $this->V[$i][$k+1]; + if ($notlast) { + $p = $p + $z * $this->V[$i][$k+2]; + $this->V[$i][$k+2] = $this->V[$i][$k+2] - $p * $r; + } + $this->V[$i][$k] = $this->V[$i][$k] - $p; + $this->V[$i][$k+1] = $this->V[$i][$k+1] - $p * $q; + } + } // ($s != 0) + } // k loop + } // check convergence + } // while ($n >= $low) + + // Backsubstitute to find vectors of upper triangular form + if ($norm == 0.0) { + return; + } + + for ($n = $nn-1; $n >= 0; --$n) { + $p = $this->d[$n]; + $q = $this->e[$n]; + // Real vector + if ($q == 0) { + $l = $n; + $this->H[$n][$n] = 1.0; + for ($i = $n-1; $i >= 0; --$i) { + $w = $this->H[$i][$i] - $p; + $r = 0.0; + for ($j = $l; $j <= $n; ++$j) { + $r = $r + $this->H[$i][$j] * $this->H[$j][$n]; + } + if ($this->e[$i] < 0.0) { + $z = $w; + $s = $r; + } else { + $l = $i; + if ($this->e[$i] == 0.0) { + if ($w != 0.0) { + $this->H[$i][$n] = -$r / $w; + } else { + $this->H[$i][$n] = -$r / ($eps * $norm); + } + // Solve real equations + } else { + $x = $this->H[$i][$i+1]; + $y = $this->H[$i+1][$i]; + $q = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i]; + $t = ($x * $s - $z * $r) / $q; + $this->H[$i][$n] = $t; + if (abs($x) > abs($z)) { + $this->H[$i+1][$n] = (-$r - $w * $t) / $x; + } else { + $this->H[$i+1][$n] = (-$s - $y * $t) / $z; + } + } + // Overflow control + $t = abs($this->H[$i][$n]); + if (($eps * $t) * $t > 1) { + for ($j = $i; $j <= $n; ++$j) { + $this->H[$j][$n] = $this->H[$j][$n] / $t; + } + } + } + } + // Complex vector + } else if ($q < 0) { + $l = $n-1; + // Last vector component imaginary so matrix is triangular + if (abs($this->H[$n][$n-1]) > abs($this->H[$n-1][$n])) { + $this->H[$n-1][$n-1] = $q / $this->H[$n][$n-1]; + $this->H[$n-1][$n] = -($this->H[$n][$n] - $p) / $this->H[$n][$n-1]; + } else { + $this->cdiv(0.0, -$this->H[$n-1][$n], $this->H[$n-1][$n-1] - $p, $q); + $this->H[$n-1][$n-1] = $this->cdivr; + $this->H[$n-1][$n] = $this->cdivi; + } + $this->H[$n][$n-1] = 0.0; + $this->H[$n][$n] = 1.0; + for ($i = $n-2; $i >= 0; --$i) { + // double ra,sa,vr,vi; + $ra = 0.0; + $sa = 0.0; + for ($j = $l; $j <= $n; ++$j) { + $ra = $ra + $this->H[$i][$j] * $this->H[$j][$n-1]; + $sa = $sa + $this->H[$i][$j] * $this->H[$j][$n]; + } + $w = $this->H[$i][$i] - $p; + if ($this->e[$i] < 0.0) { + $z = $w; + $r = $ra; + $s = $sa; + } else { + $l = $i; + if ($this->e[$i] == 0) { + $this->cdiv(-$ra, -$sa, $w, $q); + $this->H[$i][$n-1] = $this->cdivr; + $this->H[$i][$n] = $this->cdivi; + } else { + // Solve complex equations + $x = $this->H[$i][$i+1]; + $y = $this->H[$i+1][$i]; + $vr = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i] - $q * $q; + $vi = ($this->d[$i] - $p) * 2.0 * $q; + if ($vr == 0.0 & $vi == 0.0) { + $vr = $eps * $norm * (abs($w) + abs($q) + abs($x) + abs($y) + abs($z)); + } + $this->cdiv($x * $r - $z * $ra + $q * $sa, $x * $s - $z * $sa - $q * $ra, $vr, $vi); + $this->H[$i][$n-1] = $this->cdivr; + $this->H[$i][$n] = $this->cdivi; + if (abs($x) > (abs($z) + abs($q))) { + $this->H[$i+1][$n-1] = (-$ra - $w * $this->H[$i][$n-1] + $q * $this->H[$i][$n]) / $x; + $this->H[$i+1][$n] = (-$sa - $w * $this->H[$i][$n] - $q * $this->H[$i][$n-1]) / $x; + } else { + $this->cdiv(-$r - $y * $this->H[$i][$n-1], -$s - $y * $this->H[$i][$n], $z, $q); + $this->H[$i+1][$n-1] = $this->cdivr; + $this->H[$i+1][$n] = $this->cdivi; + } + } + // Overflow control + $t = max(abs($this->H[$i][$n-1]),abs($this->H[$i][$n])); + if (($eps * $t) * $t > 1) { + for ($j = $i; $j <= $n; ++$j) { + $this->H[$j][$n-1] = $this->H[$j][$n-1] / $t; + $this->H[$j][$n] = $this->H[$j][$n] / $t; + } + } + } // end else + } // end for + } // end else for complex case + } // end for + + // Vectors of isolated roots + for ($i = 0; $i < $nn; ++$i) { + if ($i < $low | $i > $high) { + for ($j = $i; $j < $nn; ++$j) { + $this->V[$i][$j] = $this->H[$i][$j]; + } + } + } + + // Back transformation to get eigenvectors of original matrix + for ($j = $nn-1; $j >= $low; --$j) { + for ($i = $low; $i <= $high; ++$i) { + $z = 0.0; + for ($k = $low; $k <= min($j,$high); ++$k) { + $z = $z + $this->V[$i][$k] * $this->H[$k][$j]; + } + $this->V[$i][$j] = $z; + } + } + } // end hqr2 + + + /** + * Constructor: Check for symmetry, then construct the eigenvalue decomposition + * + * @access public + * @param A Square matrix + * @return Structure to access D and V. + */ + public function __construct($Arg) { + $this->A = $Arg->getArray(); + $this->n = $Arg->getColumnDimension(); + + $issymmetric = true; + for ($j = 0; ($j < $this->n) & $issymmetric; ++$j) { + for ($i = 0; ($i < $this->n) & $issymmetric; ++$i) { + $issymmetric = ($this->A[$i][$j] == $this->A[$j][$i]); + } + } + + if ($issymmetric) { + $this->V = $this->A; + // Tridiagonalize. + $this->tred2(); + // Diagonalize. + $this->tql2(); + } else { + $this->H = $this->A; + $this->ort = array(); + // Reduce to Hessenberg form. + $this->orthes(); + // Reduce Hessenberg to real Schur form. + $this->hqr2(); + } + } + + + /** + * Return the eigenvector matrix + * + * @access public + * @return V + */ + public function getV() { + return new Matrix($this->V, $this->n, $this->n); + } + + + /** + * Return the real parts of the eigenvalues + * + * @access public + * @return real(diag(D)) + */ + public function getRealEigenvalues() { + return $this->d; + } + + + /** + * Return the imaginary parts of the eigenvalues + * + * @access public + * @return imag(diag(D)) + */ + public function getImagEigenvalues() { + return $this->e; + } + + + /** + * Return the block diagonal eigenvalue matrix + * + * @access public + * @return D + */ + public function getD() { + for ($i = 0; $i < $this->n; ++$i) { + $D[$i] = array_fill(0, $this->n, 0.0); + $D[$i][$i] = $this->d[$i]; + if ($this->e[$i] == 0) { + continue; + } + $o = ($this->e[$i] > 0) ? $i + 1 : $i - 1; + $D[$i][$o] = $this->e[$i]; + } + return new Matrix($D); + } + +} // class EigenvalueDecomposition diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/LUDecomposition.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/LUDecomposition.php new file mode 100644 index 000000000..6c797a6ce --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/LUDecomposition.php @@ -0,0 +1,258 @@ +<?php +/** + * @package JAMA + * + * For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n + * unit lower triangular matrix L, an n-by-n upper triangular matrix U, + * and a permutation vector piv of length m so that A(piv,:) = L*U. + * If m < n, then L is m-by-m and U is m-by-n. + * + * The LU decompostion with pivoting always exists, even if the matrix is + * singular, so the constructor will never fail. The primary use of the + * LU decomposition is in the solution of square systems of simultaneous + * linear equations. This will fail if isNonsingular() returns false. + * + * @author Paul Meagher + * @author Bartosz Matosiuk + * @author Michael Bommarito + * @version 1.1 + * @license PHP v3.0 + */ +class PHPExcel_Shared_JAMA_LUDecomposition { + + const MatrixSingularException = "Can only perform operation on singular matrix."; + const MatrixSquareException = "Mismatched Row dimension"; + + /** + * Decomposition storage + * @var array + */ + private $LU = array(); + + /** + * Row dimension. + * @var int + */ + private $m; + + /** + * Column dimension. + * @var int + */ + private $n; + + /** + * Pivot sign. + * @var int + */ + private $pivsign; + + /** + * Internal storage of pivot vector. + * @var array + */ + private $piv = array(); + + + /** + * LU Decomposition constructor. + * + * @param $A Rectangular matrix + * @return Structure to access L, U and piv. + */ + public function __construct($A) { + if ($A instanceof PHPExcel_Shared_JAMA_Matrix) { + // Use a "left-looking", dot-product, Crout/Doolittle algorithm. + $this->LU = $A->getArray(); + $this->m = $A->getRowDimension(); + $this->n = $A->getColumnDimension(); + for ($i = 0; $i < $this->m; ++$i) { + $this->piv[$i] = $i; + } + $this->pivsign = 1; + $LUrowi = $LUcolj = array(); + + // Outer loop. + for ($j = 0; $j < $this->n; ++$j) { + // Make a copy of the j-th column to localize references. + for ($i = 0; $i < $this->m; ++$i) { + $LUcolj[$i] = &$this->LU[$i][$j]; + } + // Apply previous transformations. + for ($i = 0; $i < $this->m; ++$i) { + $LUrowi = $this->LU[$i]; + // Most of the time is spent in the following dot product. + $kmax = min($i,$j); + $s = 0.0; + for ($k = 0; $k < $kmax; ++$k) { + $s += $LUrowi[$k] * $LUcolj[$k]; + } + $LUrowi[$j] = $LUcolj[$i] -= $s; + } + // Find pivot and exchange if necessary. + $p = $j; + for ($i = $j+1; $i < $this->m; ++$i) { + if (abs($LUcolj[$i]) > abs($LUcolj[$p])) { + $p = $i; + } + } + if ($p != $j) { + for ($k = 0; $k < $this->n; ++$k) { + $t = $this->LU[$p][$k]; + $this->LU[$p][$k] = $this->LU[$j][$k]; + $this->LU[$j][$k] = $t; + } + $k = $this->piv[$p]; + $this->piv[$p] = $this->piv[$j]; + $this->piv[$j] = $k; + $this->pivsign = $this->pivsign * -1; + } + // Compute multipliers. + if (($j < $this->m) && ($this->LU[$j][$j] != 0.0)) { + for ($i = $j+1; $i < $this->m; ++$i) { + $this->LU[$i][$j] /= $this->LU[$j][$j]; + } + } + } + } else { + throw new Exception(PHPExcel_Shared_JAMA_Matrix::ArgumentTypeException); + } + } // function __construct() + + + /** + * Get lower triangular factor. + * + * @return array Lower triangular factor + */ + public function getL() { + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i > $j) { + $L[$i][$j] = $this->LU[$i][$j]; + } elseif ($i == $j) { + $L[$i][$j] = 1.0; + } else { + $L[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($L); + } // function getL() + + + /** + * Get upper triangular factor. + * + * @return array Upper triangular factor + */ + public function getU() { + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i <= $j) { + $U[$i][$j] = $this->LU[$i][$j]; + } else { + $U[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($U); + } // function getU() + + + /** + * Return pivot permutation vector. + * + * @return array Pivot vector + */ + public function getPivot() { + return $this->piv; + } // function getPivot() + + + /** + * Alias for getPivot + * + * @see getPivot + */ + public function getDoublePivot() { + return $this->getPivot(); + } // function getDoublePivot() + + + /** + * Is the matrix nonsingular? + * + * @return true if U, and hence A, is nonsingular. + */ + public function isNonsingular() { + for ($j = 0; $j < $this->n; ++$j) { + if ($this->LU[$j][$j] == 0) { + return false; + } + } + return true; + } // function isNonsingular() + + + /** + * Count determinants + * + * @return array d matrix deterninat + */ + public function det() { + if ($this->m == $this->n) { + $d = $this->pivsign; + for ($j = 0; $j < $this->n; ++$j) { + $d *= $this->LU[$j][$j]; + } + return $d; + } else { + throw new Exception(PHPExcel_Shared_JAMA_Matrix::MatrixDimensionException); + } + } // function det() + + + /** + * Solve A*X = B + * + * @param $B A Matrix with as many rows as A and any number of columns. + * @return X so that L*U*X = B(piv,:) + * @exception IllegalArgumentException Matrix row dimensions must agree. + * @exception RuntimeException Matrix is singular. + */ + public function solve($B) { + if ($B->getRowDimension() == $this->m) { + if ($this->isNonsingular()) { + // Copy right hand side with pivoting + $nx = $B->getColumnDimension(); + $X = $B->getMatrix($this->piv, 0, $nx-1); + // Solve L*Y = B(piv,:) + for ($k = 0; $k < $this->n; ++$k) { + for ($i = $k+1; $i < $this->n; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k]; + } + } + } + // Solve U*X = Y; + for ($k = $this->n-1; $k >= 0; --$k) { + for ($j = 0; $j < $nx; ++$j) { + $X->A[$k][$j] /= $this->LU[$k][$k]; + } + for ($i = 0; $i < $k; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k]; + } + } + } + return $X; + } else { + throw new Exception(self::MatrixSingularException); + } + } else { + throw new Exception(self::MatrixSquareException); + } + } // function solve() + +} // class PHPExcel_Shared_JAMA_LUDecomposition diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/Matrix.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/Matrix.php new file mode 100644 index 000000000..aae40e4c5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/Matrix.php @@ -0,0 +1,1059 @@ +<?php +/** + * @package JAMA + */ + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + + +/* + * Matrix class + * + * @author Paul Meagher + * @author Michael Bommarito + * @author Lukasz Karapuda + * @author Bartek Matosiuk + * @version 1.8 + * @license PHP v3.0 + * @see http://math.nist.gov/javanumerics/jama/ + */ +class PHPExcel_Shared_JAMA_Matrix { + + + const PolymorphicArgumentException = "Invalid argument pattern for polymorphic function."; + const ArgumentTypeException = "Invalid argument type."; + const ArgumentBoundsException = "Invalid argument range."; + const MatrixDimensionException = "Matrix dimensions are not equal."; + const ArrayLengthException = "Array length must be a multiple of m."; + + /** + * Matrix storage + * + * @var array + * @access public + */ + public $A = array(); + + /** + * Matrix row dimension + * + * @var int + * @access private + */ + private $m; + + /** + * Matrix column dimension + * + * @var int + * @access private + */ + private $n; + + + /** + * Polymorphic constructor + * + * As PHP has no support for polymorphic constructors, we hack our own sort of polymorphism using func_num_args, func_get_arg, and gettype. In essence, we're just implementing a simple RTTI filter and calling the appropriate constructor. + */ + public function __construct() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + //Rectangular matrix - m x n initialized from 2D array + case 'array': + $this->m = count($args[0]); + $this->n = count($args[0][0]); + $this->A = $args[0]; + break; + //Square matrix - n x n + case 'integer': + $this->m = $args[0]; + $this->n = $args[0]; + $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0)); + break; + //Rectangular matrix - m x n + case 'integer,integer': + $this->m = $args[0]; + $this->n = $args[1]; + $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0)); + break; + //Rectangular matrix - m x n initialized from packed array + case 'array,integer': + $this->m = $args[1]; + if ($this->m != 0) { + $this->n = count($args[0]) / $this->m; + } else { + $this->n = 0; + } + if (($this->m * $this->n) == count($args[0])) { + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = $args[0][$i + $j * $this->m]; + } + } + } else { + throw new Exception(self::ArrayLengthException); + } + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function __construct() + + + /** + * getArray + * + * @return array Matrix array + */ + public function getArray() { + return $this->A; + } // function getArray() + + + /** + * getRowDimension + * + * @return int Row dimension + */ + public function getRowDimension() { + return $this->m; + } // function getRowDimension() + + + /** + * getColumnDimension + * + * @return int Column dimension + */ + public function getColumnDimension() { + return $this->n; + } // function getColumnDimension() + + + /** + * get + * + * Get the i,j-th element of the matrix. + * @param int $i Row position + * @param int $j Column position + * @return mixed Element (int/float/double) + */ + public function get($i = null, $j = null) { + return $this->A[$i][$j]; + } // function get() + + + /** + * getMatrix + * + * Get a submatrix + * @param int $i0 Initial row index + * @param int $iF Final row index + * @param int $j0 Initial column index + * @param int $jF Final column index + * @return Matrix Submatrix + */ + public function getMatrix() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + //A($i0...; $j0...) + case 'integer,integer': + list($i0, $j0) = $args; + if ($i0 >= 0) { $m = $this->m - $i0; } else { throw new Exception(self::ArgumentBoundsException); } + if ($j0 >= 0) { $n = $this->n - $j0; } else { throw new Exception(self::ArgumentBoundsException); } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for($i = $i0; $i < $this->m; ++$i) { + for($j = $j0; $j < $this->n; ++$j) { + $R->set($i, $j, $this->A[$i][$j]); + } + } + return $R; + break; + //A($i0...$iF; $j0...$jF) + case 'integer,integer,integer,integer': + list($i0, $iF, $j0, $jF) = $args; + if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { $m = $iF - $i0; } else { throw new Exception(self::ArgumentBoundsException); } + if (($jF > $j0) && ($this->n >= $jF) && ($j0 >= 0)) { $n = $jF - $j0; } else { throw new Exception(self::ArgumentBoundsException); } + $R = new PHPExcel_Shared_JAMA_Matrix($m+1, $n+1); + for($i = $i0; $i <= $iF; ++$i) { + for($j = $j0; $j <= $jF; ++$j) { + $R->set($i - $i0, $j - $j0, $this->A[$i][$j]); + } + } + return $R; + break; + //$R = array of row indices; $C = array of column indices + case 'array,array': + list($RL, $CL) = $args; + if (count($RL) > 0) { $m = count($RL); } else { throw new Exception(self::ArgumentBoundsException); } + if (count($CL) > 0) { $n = count($CL); } else { throw new Exception(self::ArgumentBoundsException); } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for($i = 0; $i < $m; ++$i) { + for($j = 0; $j < $n; ++$j) { + $R->set($i - $i0, $j - $j0, $this->A[$RL[$i]][$CL[$j]]); + } + } + return $R; + break; + //$RL = array of row indices; $CL = array of column indices + case 'array,array': + list($RL, $CL) = $args; + if (count($RL) > 0) { $m = count($RL); } else { throw new Exception(self::ArgumentBoundsException); } + if (count($CL) > 0) { $n = count($CL); } else { throw new Exception(self::ArgumentBoundsException); } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for($i = 0; $i < $m; ++$i) { + for($j = 0; $j < $n; ++$j) { + $R->set($i, $j, $this->A[$RL[$i]][$CL[$j]]); + } + } + return $R; + break; + //A($i0...$iF); $CL = array of column indices + case 'integer,integer,array': + list($i0, $iF, $CL) = $args; + if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { $m = $iF - $i0; } else { throw new Exception(self::ArgumentBoundsException); } + if (count($CL) > 0) { $n = count($CL); } else { throw new Exception(self::ArgumentBoundsException); } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for($i = $i0; $i < $iF; ++$i) { + for($j = 0; $j < $n; ++$j) { + $R->set($i - $i0, $j, $this->A[$RL[$i]][$j]); + } + } + return $R; + break; + //$RL = array of row indices + case 'array,integer,integer': + list($RL, $j0, $jF) = $args; + if (count($RL) > 0) { $m = count($RL); } else { throw new Exception(self::ArgumentBoundsException); } + if (($jF >= $j0) && ($this->n >= $jF) && ($j0 >= 0)) { $n = $jF - $j0; } else { throw new Exception(self::ArgumentBoundsException); } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n+1); + for($i = 0; $i < $m; ++$i) { + for($j = $j0; $j <= $jF; ++$j) { + $R->set($i, $j - $j0, $this->A[$RL[$i]][$j]); + } + } + return $R; + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function getMatrix() + + + /** + * checkMatrixDimensions + * + * Is matrix B the same size? + * @param Matrix $B Matrix B + * @return boolean + */ + public function checkMatrixDimensions($B = null) { + if ($B instanceof PHPExcel_Shared_JAMA_Matrix) { + if (($this->m == $B->getRowDimension()) && ($this->n == $B->getColumnDimension())) { + return true; + } else { + throw new Exception(self::MatrixDimensionException); + } + } else { + throw new Exception(self::ArgumentTypeException); + } + } // function checkMatrixDimensions() + + + + /** + * set + * + * Set the i,j-th element of the matrix. + * @param int $i Row position + * @param int $j Column position + * @param mixed $c Int/float/double value + * @return mixed Element (int/float/double) + */ + public function set($i = null, $j = null, $c = null) { + // Optimized set version just has this + $this->A[$i][$j] = $c; + } // function set() + + + /** + * identity + * + * Generate an identity matrix. + * @param int $m Row dimension + * @param int $n Column dimension + * @return Matrix Identity matrix + */ + public function identity($m = null, $n = null) { + return $this->diagonal($m, $n, 1); + } // function identity() + + + /** + * diagonal + * + * Generate a diagonal matrix + * @param int $m Row dimension + * @param int $n Column dimension + * @param mixed $c Diagonal value + * @return Matrix Diagonal matrix + */ + public function diagonal($m = null, $n = null, $c = 1) { + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for($i = 0; $i < $m; ++$i) { + $R->set($i, $i, $c); + } + return $R; + } // function diagonal() + + + /** + * getMatrixByRow + * + * Get a submatrix by row index/range + * @param int $i0 Initial row index + * @param int $iF Final row index + * @return Matrix Submatrix + */ + public function getMatrixByRow($i0 = null, $iF = null) { + if (is_int($i0)) { + if (is_int($iF)) { + return $this->getMatrix($i0, 0, $iF + 1, $this->n); + } else { + return $this->getMatrix($i0, 0, $i0 + 1, $this->n); + } + } else { + throw new Exception(self::ArgumentTypeException); + } + } // function getMatrixByRow() + + + /** + * getMatrixByCol + * + * Get a submatrix by column index/range + * @param int $i0 Initial column index + * @param int $iF Final column index + * @return Matrix Submatrix + */ + public function getMatrixByCol($j0 = null, $jF = null) { + if (is_int($j0)) { + if (is_int($jF)) { + return $this->getMatrix(0, $j0, $this->m, $jF + 1); + } else { + return $this->getMatrix(0, $j0, $this->m, $j0 + 1); + } + } else { + throw new Exception(self::ArgumentTypeException); + } + } // function getMatrixByCol() + + + /** + * transpose + * + * Tranpose matrix + * @return Matrix Transposed matrix + */ + public function transpose() { + $R = new PHPExcel_Shared_JAMA_Matrix($this->n, $this->m); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $R->set($j, $i, $this->A[$i][$j]); + } + } + return $R; + } // function transpose() + + + /** + * trace + * + * Sum of diagonal elements + * @return float Sum of diagonal elements + */ + public function trace() { + $s = 0; + $n = min($this->m, $this->n); + for($i = 0; $i < $n; ++$i) { + $s += $this->A[$i][$i]; + } + return $s; + } // function trace() + + + /** + * uminus + * + * Unary minus matrix -A + * @return Matrix Unary minus matrix + */ + public function uminus() { + } // function uminus() + + + /** + * plus + * + * A + B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function plus() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) + $this->A[$i][$j]); + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function plus() + + + /** + * plusEquals + * + * A = A + B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function plusEquals() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $validValues = True; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j],'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value,'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] += $value; + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function plusEquals() + + + /** + * minus + * + * A - B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function minus() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) - $this->A[$i][$j]); + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function minus() + + + /** + * minusEquals + * + * A = A - B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function minusEquals() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $validValues = True; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j],'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value,'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] -= $value; + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function minusEquals() + + + /** + * arrayTimes + * + * Element-by-element multiplication + * Cij = Aij * Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Cij + */ + public function arrayTimes() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) * $this->A[$i][$j]); + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function arrayTimes() + + + /** + * arrayTimesEquals + * + * Element-by-element multiplication + * Aij = Aij * Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Aij + */ + public function arrayTimesEquals() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $validValues = True; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j],'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value,'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] *= $value; + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function arrayTimesEquals() + + + /** + * arrayRightDivide + * + * Element-by-element right division + * A / B + * @param Matrix $B Matrix B + * @return Matrix Division result + */ + public function arrayRightDivide() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $validValues = True; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j],'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value,'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + if ($value == 0) { + // Trap for Divide by Zero error + $M->set($i, $j, '#DIV/0!'); + } else { + $M->set($i, $j, $this->A[$i][$j] / $value); + } + } else { + $M->set($i, $j, PHPExcel_Calculation_Functions::NaN()); + } + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function arrayRightDivide() + + + /** + * arrayRightDivideEquals + * + * Element-by-element right division + * Aij = Aij / Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Aij + */ + public function arrayRightDivideEquals() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = $this->A[$i][$j] / $M->get($i, $j); + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function arrayRightDivideEquals() + + + /** + * arrayLeftDivide + * + * Element-by-element Left division + * A / B + * @param Matrix $B Matrix B + * @return Matrix Division result + */ + public function arrayLeftDivide() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) / $this->A[$i][$j]); + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function arrayLeftDivide() + + + /** + * arrayLeftDivideEquals + * + * Element-by-element Left division + * Aij = Aij / Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Aij + */ + public function arrayLeftDivideEquals() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = $M->get($i, $j) / $this->A[$i][$j]; + } + } + return $M; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function arrayLeftDivideEquals() + + + /** + * times + * + * Matrix multiplication + * @param mixed $n Matrix/Array/Scalar + * @return Matrix Product + */ + public function times() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $B = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + if ($this->n == $B->m) { + $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n); + for($j = 0; $j < $B->n; ++$j) { + for ($k = 0; $k < $this->n; ++$k) { + $Bcolj[$k] = $B->A[$k][$j]; + } + for($i = 0; $i < $this->m; ++$i) { + $Arowi = $this->A[$i]; + $s = 0; + for($k = 0; $k < $this->n; ++$k) { + $s += $Arowi[$k] * $Bcolj[$k]; + } + $C->A[$i][$j] = $s; + } + } + return $C; + } else { + throw new Exception(JAMAError(MatrixDimensionMismatch)); + } + break; + case 'array': + $B = new PHPExcel_Shared_JAMA_Matrix($args[0]); + if ($this->n == $B->m) { + $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n); + for($i = 0; $i < $C->m; ++$i) { + for($j = 0; $j < $C->n; ++$j) { + $s = "0"; + for($k = 0; $k < $C->n; ++$k) { + $s += $this->A[$i][$k] * $B->A[$k][$j]; + } + $C->A[$i][$j] = $s; + } + } + return $C; + } else { + throw new Exception(JAMAError(MatrixDimensionMismatch)); + } + return $M; + break; + case 'integer': + $C = new PHPExcel_Shared_JAMA_Matrix($this->A); + for($i = 0; $i < $C->m; ++$i) { + for($j = 0; $j < $C->n; ++$j) { + $C->A[$i][$j] *= $args[0]; + } + } + return $C; + break; + case 'double': + $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $this->n); + for($i = 0; $i < $C->m; ++$i) { + for($j = 0; $j < $C->n; ++$j) { + $C->A[$i][$j] = $args[0] * $this->A[$i][$j]; + } + } + return $C; + break; + case 'float': + $C = new PHPExcel_Shared_JAMA_Matrix($this->A); + for($i = 0; $i < $C->m; ++$i) { + for($j = 0; $j < $C->n; ++$j) { + $C->A[$i][$j] *= $args[0]; + } + } + return $C; + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function times() + + + /** + * power + * + * A = A ^ B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function power() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $validValues = True; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j],'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value,'"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] = pow($this->A[$i][$j],$value); + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function power() + + + /** + * concat + * + * A = A & B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function concat() { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new Exception(self::ArgumentTypeException); } + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new Exception(self::PolymorphicArgumentException); + break; + } + $this->checkMatrixDimensions($M); + for($i = 0; $i < $this->m; ++$i) { + for($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = trim($this->A[$i][$j],'"').trim($M->get($i, $j),'"'); + } + } + return $this; + } else { + throw new Exception(self::PolymorphicArgumentException); + } + } // function concat() + + + /** + * Solve A*X = B. + * + * @param Matrix $B Right hand side + * @return Matrix ... Solution if A is square, least squares solution otherwise + */ + public function solve($B) { + if ($this->m == $this->n) { + $LU = new PHPExcel_Shared_JAMA_LUDecomposition($this); + return $LU->solve($B); + } else { + $QR = new QRDecomposition($this); + return $QR->solve($B); + } + } // function solve() + + + /** + * Matrix inverse or pseudoinverse. + * + * @return Matrix ... Inverse(A) if A is square, pseudoinverse otherwise. + */ + public function inverse() { + return $this->solve($this->identity($this->m, $this->m)); + } // function inverse() + + + /** + * det + * + * Calculate determinant + * @return float Determinant + */ + public function det() { + $L = new PHPExcel_Shared_JAMA_LUDecomposition($this); + return $L->det(); + } // function det() + + +} // class PHPExcel_Shared_JAMA_Matrix diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/QRDecomposition.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/QRDecomposition.php new file mode 100644 index 000000000..49293d7ec --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/QRDecomposition.php @@ -0,0 +1,234 @@ +<?php +/** + * @package JAMA + * + * For an m-by-n matrix A with m >= n, the QR decomposition is an m-by-n + * orthogonal matrix Q and an n-by-n upper triangular matrix R so that + * A = Q*R. + * + * The QR decompostion always exists, even if the matrix does not have + * full rank, so the constructor will never fail. The primary use of the + * QR decomposition is in the least squares solution of nonsquare systems + * of simultaneous linear equations. This will fail if isFullRank() + * returns false. + * + * @author Paul Meagher + * @license PHP v3.0 + * @version 1.1 + */ +class PHPExcel_Shared_JAMA_QRDecomposition { + + const MatrixRankException = "Can only perform operation on full-rank matrix."; + + /** + * Array for internal storage of decomposition. + * @var array + */ + private $QR = array(); + + /** + * Row dimension. + * @var integer + */ + private $m; + + /** + * Column dimension. + * @var integer + */ + private $n; + + /** + * Array for internal storage of diagonal of R. + * @var array + */ + private $Rdiag = array(); + + + /** + * QR Decomposition computed by Householder reflections. + * + * @param matrix $A Rectangular matrix + * @return Structure to access R and the Householder vectors and compute Q. + */ + public function __construct($A) { + if($A instanceof PHPExcel_Shared_JAMA_Matrix) { + // Initialize. + $this->QR = $A->getArrayCopy(); + $this->m = $A->getRowDimension(); + $this->n = $A->getColumnDimension(); + // Main loop. + for ($k = 0; $k < $this->n; ++$k) { + // Compute 2-norm of k-th column without under/overflow. + $nrm = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $nrm = hypo($nrm, $this->QR[$i][$k]); + } + if ($nrm != 0.0) { + // Form k-th Householder vector. + if ($this->QR[$k][$k] < 0) { + $nrm = -$nrm; + } + for ($i = $k; $i < $this->m; ++$i) { + $this->QR[$i][$k] /= $nrm; + } + $this->QR[$k][$k] += 1.0; + // Apply transformation to remaining columns. + for ($j = $k+1; $j < $this->n; ++$j) { + $s = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $s += $this->QR[$i][$k] * $this->QR[$i][$j]; + } + $s = -$s/$this->QR[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $this->QR[$i][$j] += $s * $this->QR[$i][$k]; + } + } + } + $this->Rdiag[$k] = -$nrm; + } + } else { + throw new Exception(PHPExcel_Shared_JAMA_Matrix::ArgumentTypeException); + } + } // function __construct() + + + /** + * Is the matrix full rank? + * + * @return boolean true if R, and hence A, has full rank, else false. + */ + public function isFullRank() { + for ($j = 0; $j < $this->n; ++$j) { + if ($this->Rdiag[$j] == 0) { + return false; + } + } + return true; + } // function isFullRank() + + + /** + * Return the Householder vectors + * + * @return Matrix Lower trapezoidal matrix whose columns define the reflections + */ + public function getH() { + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i >= $j) { + $H[$i][$j] = $this->QR[$i][$j]; + } else { + $H[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($H); + } // function getH() + + + /** + * Return the upper triangular factor + * + * @return Matrix upper triangular factor + */ + public function getR() { + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i < $j) { + $R[$i][$j] = $this->QR[$i][$j]; + } elseif ($i == $j) { + $R[$i][$j] = $this->Rdiag[$i]; + } else { + $R[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($R); + } // function getR() + + + /** + * Generate and return the (economy-sized) orthogonal factor + * + * @return Matrix orthogonal factor + */ + public function getQ() { + for ($k = $this->n-1; $k >= 0; --$k) { + for ($i = 0; $i < $this->m; ++$i) { + $Q[$i][$k] = 0.0; + } + $Q[$k][$k] = 1.0; + for ($j = $k; $j < $this->n; ++$j) { + if ($this->QR[$k][$k] != 0) { + $s = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $s += $this->QR[$i][$k] * $Q[$i][$j]; + } + $s = -$s/$this->QR[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $Q[$i][$j] += $s * $this->QR[$i][$k]; + } + } + } + } + /* + for($i = 0; $i < count($Q); ++$i) { + for($j = 0; $j < count($Q); ++$j) { + if(! isset($Q[$i][$j]) ) { + $Q[$i][$j] = 0; + } + } + } + */ + return new PHPExcel_Shared_JAMA_Matrix($Q); + } // function getQ() + + + /** + * Least squares solution of A*X = B + * + * @param Matrix $B A Matrix with as many rows as A and any number of columns. + * @return Matrix Matrix that minimizes the two norm of Q*R*X-B. + */ + public function solve($B) { + if ($B->getRowDimension() == $this->m) { + if ($this->isFullRank()) { + // Copy right hand side + $nx = $B->getColumnDimension(); + $X = $B->getArrayCopy(); + // Compute Y = transpose(Q)*B + for ($k = 0; $k < $this->n; ++$k) { + for ($j = 0; $j < $nx; ++$j) { + $s = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $s += $this->QR[$i][$k] * $X[$i][$j]; + } + $s = -$s/$this->QR[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $X[$i][$j] += $s * $this->QR[$i][$k]; + } + } + } + // Solve R*X = Y; + for ($k = $this->n-1; $k >= 0; --$k) { + for ($j = 0; $j < $nx; ++$j) { + $X[$k][$j] /= $this->Rdiag[$k]; + } + for ($i = 0; $i < $k; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X[$i][$j] -= $X[$k][$j]* $this->QR[$i][$k]; + } + } + } + $X = new PHPExcel_Shared_JAMA_Matrix($X); + return ($X->getMatrix(0, $this->n-1, 0, $nx)); + } else { + throw new Exception(self::MatrixRankException); + } + } else { + throw new Exception(PHPExcel_Shared_JAMA_Matrix::MatrixDimensionException); + } + } // function solve() + +} // PHPExcel_Shared_JAMA_class QRDecomposition diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/SingularValueDecomposition.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/SingularValueDecomposition.php new file mode 100644 index 000000000..a4b096c59 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/SingularValueDecomposition.php @@ -0,0 +1,526 @@ +<?php +/** + * @package JAMA + * + * For an m-by-n matrix A with m >= n, the singular value decomposition is + * an m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, and + * an n-by-n orthogonal matrix V so that A = U*S*V'. + * + * The singular values, sigma[$k] = S[$k][$k], are ordered so that + * sigma[0] >= sigma[1] >= ... >= sigma[n-1]. + * + * The singular value decompostion always exists, so the constructor will + * never fail. The matrix condition number and the effective numerical + * rank can be computed from this decomposition. + * + * @author Paul Meagher + * @license PHP v3.0 + * @version 1.1 + */ +class SingularValueDecomposition { + + /** + * Internal storage of U. + * @var array + */ + private $U = array(); + + /** + * Internal storage of V. + * @var array + */ + private $V = array(); + + /** + * Internal storage of singular values. + * @var array + */ + private $s = array(); + + /** + * Row dimension. + * @var int + */ + private $m; + + /** + * Column dimension. + * @var int + */ + private $n; + + + /** + * Construct the singular value decomposition + * + * Derived from LINPACK code. + * + * @param $A Rectangular matrix + * @return Structure to access U, S and V. + */ + public function __construct($Arg) { + + // Initialize. + $A = $Arg->getArrayCopy(); + $this->m = $Arg->getRowDimension(); + $this->n = $Arg->getColumnDimension(); + $nu = min($this->m, $this->n); + $e = array(); + $work = array(); + $wantu = true; + $wantv = true; + $nct = min($this->m - 1, $this->n); + $nrt = max(0, min($this->n - 2, $this->m)); + + // Reduce A to bidiagonal form, storing the diagonal elements + // in s and the super-diagonal elements in e. + for ($k = 0; $k < max($nct,$nrt); ++$k) { + + if ($k < $nct) { + // Compute the transformation for the k-th column and + // place the k-th diagonal in s[$k]. + // Compute 2-norm of k-th column without under/overflow. + $this->s[$k] = 0; + for ($i = $k; $i < $this->m; ++$i) { + $this->s[$k] = hypo($this->s[$k], $A[$i][$k]); + } + if ($this->s[$k] != 0.0) { + if ($A[$k][$k] < 0.0) { + $this->s[$k] = -$this->s[$k]; + } + for ($i = $k; $i < $this->m; ++$i) { + $A[$i][$k] /= $this->s[$k]; + } + $A[$k][$k] += 1.0; + } + $this->s[$k] = -$this->s[$k]; + } + + for ($j = $k + 1; $j < $this->n; ++$j) { + if (($k < $nct) & ($this->s[$k] != 0.0)) { + // Apply the transformation. + $t = 0; + for ($i = $k; $i < $this->m; ++$i) { + $t += $A[$i][$k] * $A[$i][$j]; + } + $t = -$t / $A[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $A[$i][$j] += $t * $A[$i][$k]; + } + // Place the k-th row of A into e for the + // subsequent calculation of the row transformation. + $e[$j] = $A[$k][$j]; + } + } + + if ($wantu AND ($k < $nct)) { + // Place the transformation in U for subsequent back + // multiplication. + for ($i = $k; $i < $this->m; ++$i) { + $this->U[$i][$k] = $A[$i][$k]; + } + } + + if ($k < $nrt) { + // Compute the k-th row transformation and place the + // k-th super-diagonal in e[$k]. + // Compute 2-norm without under/overflow. + $e[$k] = 0; + for ($i = $k + 1; $i < $this->n; ++$i) { + $e[$k] = hypo($e[$k], $e[$i]); + } + if ($e[$k] != 0.0) { + if ($e[$k+1] < 0.0) { + $e[$k] = -$e[$k]; + } + for ($i = $k + 1; $i < $this->n; ++$i) { + $e[$i] /= $e[$k]; + } + $e[$k+1] += 1.0; + } + $e[$k] = -$e[$k]; + if (($k+1 < $this->m) AND ($e[$k] != 0.0)) { + // Apply the transformation. + for ($i = $k+1; $i < $this->m; ++$i) { + $work[$i] = 0.0; + } + for ($j = $k+1; $j < $this->n; ++$j) { + for ($i = $k+1; $i < $this->m; ++$i) { + $work[$i] += $e[$j] * $A[$i][$j]; + } + } + for ($j = $k + 1; $j < $this->n; ++$j) { + $t = -$e[$j] / $e[$k+1]; + for ($i = $k + 1; $i < $this->m; ++$i) { + $A[$i][$j] += $t * $work[$i]; + } + } + } + if ($wantv) { + // Place the transformation in V for subsequent + // back multiplication. + for ($i = $k + 1; $i < $this->n; ++$i) { + $this->V[$i][$k] = $e[$i]; + } + } + } + } + + // Set up the final bidiagonal matrix or order p. + $p = min($this->n, $this->m + 1); + if ($nct < $this->n) { + $this->s[$nct] = $A[$nct][$nct]; + } + if ($this->m < $p) { + $this->s[$p-1] = 0.0; + } + if ($nrt + 1 < $p) { + $e[$nrt] = $A[$nrt][$p-1]; + } + $e[$p-1] = 0.0; + // If required, generate U. + if ($wantu) { + for ($j = $nct; $j < $nu; ++$j) { + for ($i = 0; $i < $this->m; ++$i) { + $this->U[$i][$j] = 0.0; + } + $this->U[$j][$j] = 1.0; + } + for ($k = $nct - 1; $k >= 0; --$k) { + if ($this->s[$k] != 0.0) { + for ($j = $k + 1; $j < $nu; ++$j) { + $t = 0; + for ($i = $k; $i < $this->m; ++$i) { + $t += $this->U[$i][$k] * $this->U[$i][$j]; + } + $t = -$t / $this->U[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $this->U[$i][$j] += $t * $this->U[$i][$k]; + } + } + for ($i = $k; $i < $this->m; ++$i ) { + $this->U[$i][$k] = -$this->U[$i][$k]; + } + $this->U[$k][$k] = 1.0 + $this->U[$k][$k]; + for ($i = 0; $i < $k - 1; ++$i) { + $this->U[$i][$k] = 0.0; + } + } else { + for ($i = 0; $i < $this->m; ++$i) { + $this->U[$i][$k] = 0.0; + } + $this->U[$k][$k] = 1.0; + } + } + } + + // If required, generate V. + if ($wantv) { + for ($k = $this->n - 1; $k >= 0; --$k) { + if (($k < $nrt) AND ($e[$k] != 0.0)) { + for ($j = $k + 1; $j < $nu; ++$j) { + $t = 0; + for ($i = $k + 1; $i < $this->n; ++$i) { + $t += $this->V[$i][$k]* $this->V[$i][$j]; + } + $t = -$t / $this->V[$k+1][$k]; + for ($i = $k + 1; $i < $this->n; ++$i) { + $this->V[$i][$j] += $t * $this->V[$i][$k]; + } + } + } + for ($i = 0; $i < $this->n; ++$i) { + $this->V[$i][$k] = 0.0; + } + $this->V[$k][$k] = 1.0; + } + } + + // Main iteration loop for the singular values. + $pp = $p - 1; + $iter = 0; + $eps = pow(2.0, -52.0); + + while ($p > 0) { + // Here is where a test for too many iterations would go. + // This section of the program inspects for negligible + // elements in the s and e arrays. On completion the + // variables kase and k are set as follows: + // kase = 1 if s(p) and e[k-1] are negligible and k<p + // kase = 2 if s(k) is negligible and k<p + // kase = 3 if e[k-1] is negligible, k<p, and + // s(k), ..., s(p) are not negligible (qr step). + // kase = 4 if e(p-1) is negligible (convergence). + for ($k = $p - 2; $k >= -1; --$k) { + if ($k == -1) { + break; + } + if (abs($e[$k]) <= $eps * (abs($this->s[$k]) + abs($this->s[$k+1]))) { + $e[$k] = 0.0; + break; + } + } + if ($k == $p - 2) { + $kase = 4; + } else { + for ($ks = $p - 1; $ks >= $k; --$ks) { + if ($ks == $k) { + break; + } + $t = ($ks != $p ? abs($e[$ks]) : 0.) + ($ks != $k + 1 ? abs($e[$ks-1]) : 0.); + if (abs($this->s[$ks]) <= $eps * $t) { + $this->s[$ks] = 0.0; + break; + } + } + if ($ks == $k) { + $kase = 3; + } else if ($ks == $p-1) { + $kase = 1; + } else { + $kase = 2; + $k = $ks; + } + } + ++$k; + + // Perform the task indicated by kase. + switch ($kase) { + // Deflate negligible s(p). + case 1: + $f = $e[$p-2]; + $e[$p-2] = 0.0; + for ($j = $p - 2; $j >= $k; --$j) { + $t = hypo($this->s[$j],$f); + $cs = $this->s[$j] / $t; + $sn = $f / $t; + $this->s[$j] = $t; + if ($j != $k) { + $f = -$sn * $e[$j-1]; + $e[$j-1] = $cs * $e[$j-1]; + } + if ($wantv) { + for ($i = 0; $i < $this->n; ++$i) { + $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$p-1]; + $this->V[$i][$p-1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$p-1]; + $this->V[$i][$j] = $t; + } + } + } + break; + // Split at negligible s(k). + case 2: + $f = $e[$k-1]; + $e[$k-1] = 0.0; + for ($j = $k; $j < $p; ++$j) { + $t = hypo($this->s[$j], $f); + $cs = $this->s[$j] / $t; + $sn = $f / $t; + $this->s[$j] = $t; + $f = -$sn * $e[$j]; + $e[$j] = $cs * $e[$j]; + if ($wantu) { + for ($i = 0; $i < $this->m; ++$i) { + $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$k-1]; + $this->U[$i][$k-1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$k-1]; + $this->U[$i][$j] = $t; + } + } + } + break; + // Perform one qr step. + case 3: + // Calculate the shift. + $scale = max(max(max(max( + abs($this->s[$p-1]),abs($this->s[$p-2])),abs($e[$p-2])), + abs($this->s[$k])), abs($e[$k])); + $sp = $this->s[$p-1] / $scale; + $spm1 = $this->s[$p-2] / $scale; + $epm1 = $e[$p-2] / $scale; + $sk = $this->s[$k] / $scale; + $ek = $e[$k] / $scale; + $b = (($spm1 + $sp) * ($spm1 - $sp) + $epm1 * $epm1) / 2.0; + $c = ($sp * $epm1) * ($sp * $epm1); + $shift = 0.0; + if (($b != 0.0) || ($c != 0.0)) { + $shift = sqrt($b * $b + $c); + if ($b < 0.0) { + $shift = -$shift; + } + $shift = $c / ($b + $shift); + } + $f = ($sk + $sp) * ($sk - $sp) + $shift; + $g = $sk * $ek; + // Chase zeros. + for ($j = $k; $j < $p-1; ++$j) { + $t = hypo($f,$g); + $cs = $f/$t; + $sn = $g/$t; + if ($j != $k) { + $e[$j-1] = $t; + } + $f = $cs * $this->s[$j] + $sn * $e[$j]; + $e[$j] = $cs * $e[$j] - $sn * $this->s[$j]; + $g = $sn * $this->s[$j+1]; + $this->s[$j+1] = $cs * $this->s[$j+1]; + if ($wantv) { + for ($i = 0; $i < $this->n; ++$i) { + $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$j+1]; + $this->V[$i][$j+1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$j+1]; + $this->V[$i][$j] = $t; + } + } + $t = hypo($f,$g); + $cs = $f/$t; + $sn = $g/$t; + $this->s[$j] = $t; + $f = $cs * $e[$j] + $sn * $this->s[$j+1]; + $this->s[$j+1] = -$sn * $e[$j] + $cs * $this->s[$j+1]; + $g = $sn * $e[$j+1]; + $e[$j+1] = $cs * $e[$j+1]; + if ($wantu && ($j < $this->m - 1)) { + for ($i = 0; $i < $this->m; ++$i) { + $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$j+1]; + $this->U[$i][$j+1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$j+1]; + $this->U[$i][$j] = $t; + } + } + } + $e[$p-2] = $f; + $iter = $iter + 1; + break; + // Convergence. + case 4: + // Make the singular values positive. + if ($this->s[$k] <= 0.0) { + $this->s[$k] = ($this->s[$k] < 0.0 ? -$this->s[$k] : 0.0); + if ($wantv) { + for ($i = 0; $i <= $pp; ++$i) { + $this->V[$i][$k] = -$this->V[$i][$k]; + } + } + } + // Order the singular values. + while ($k < $pp) { + if ($this->s[$k] >= $this->s[$k+1]) { + break; + } + $t = $this->s[$k]; + $this->s[$k] = $this->s[$k+1]; + $this->s[$k+1] = $t; + if ($wantv AND ($k < $this->n - 1)) { + for ($i = 0; $i < $this->n; ++$i) { + $t = $this->V[$i][$k+1]; + $this->V[$i][$k+1] = $this->V[$i][$k]; + $this->V[$i][$k] = $t; + } + } + if ($wantu AND ($k < $this->m-1)) { + for ($i = 0; $i < $this->m; ++$i) { + $t = $this->U[$i][$k+1]; + $this->U[$i][$k+1] = $this->U[$i][$k]; + $this->U[$i][$k] = $t; + } + } + ++$k; + } + $iter = 0; + --$p; + break; + } // end switch + } // end while + + } // end constructor + + + /** + * Return the left singular vectors + * + * @access public + * @return U + */ + public function getU() { + return new Matrix($this->U, $this->m, min($this->m + 1, $this->n)); + } + + + /** + * Return the right singular vectors + * + * @access public + * @return V + */ + public function getV() { + return new Matrix($this->V); + } + + + /** + * Return the one-dimensional array of singular values + * + * @access public + * @return diagonal of S. + */ + public function getSingularValues() { + return $this->s; + } + + + /** + * Return the diagonal matrix of singular values + * + * @access public + * @return S + */ + public function getS() { + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $S[$i][$j] = 0.0; + } + $S[$i][$i] = $this->s[$i]; + } + return new Matrix($S); + } + + + /** + * Two norm + * + * @access public + * @return max(S) + */ + public function norm2() { + return $this->s[0]; + } + + + /** + * Two norm condition number + * + * @access public + * @return max(S)/min(S) + */ + public function cond() { + return $this->s[0] / $this->s[min($this->m, $this->n) - 1]; + } + + + /** + * Effective numerical matrix rank + * + * @access public + * @return Number of nonnegligible singular values. + */ + public function rank() { + $eps = pow(2.0, -52.0); + $tol = max($this->m, $this->n) * $this->s[0] * $eps; + $r = 0; + for ($i = 0; $i < count($this->s); ++$i) { + if ($this->s[$i] > $tol) { + ++$r; + } + } + return $r; + } + +} // class SingularValueDecomposition diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LMQuadTest.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LMQuadTest.php new file mode 100644 index 000000000..2f316de97 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LMQuadTest.php @@ -0,0 +1,116 @@ +<?php +/** + * quadratic (p-o)'S'S(p-o) + * solve for o, S + * S is a single scale factor + */ +class LMQuadTest { + + /** + * @param array[] $x + * @param array[] $a + */ + function val($x, $a) { + if (count($a) != 3) die ("Wrong number of elements in array a"); + if (count($x) != 2) die ("Wrong number of elements in array x"); + + $ox = $a[0]; + $oy = $a[1]; + $s = $a[2]; + + $sdx = $s * ($x[0] - $ox); + $sdy = $s * ($x[1] - $oy); + + return ($sdx * $sdx) + ($sdy * $sdy); + } // function val() + + + /** + * z = (p-o)'S'S(p-o) + * dz/dp = 2S'S(p-o) + * + * z = (s*(px-ox))^2 + (s*(py-oy))^2 + * dz/dox = -2(s*(px-ox))*s + * dz/ds = 2*s*[(px-ox)^2 + (py-oy)^2] + * + * z = (s*dx)^2 + (s*dy)^2 + * dz/ds = 2(s*dx)*dx + 2(s*dy)*dy + * + * @param array[] $x + * @param array[] $a + * @param int $a_k + * @param array[] $a + */ + function grad($x, $a, $a_k) { + if (count($a) != 3) die ("Wrong number of elements in array a"); + if (count($x) != 2) die ("Wrong number of elements in array x"); + if ($a_k < 3) die ("a_k=".$a_k); + + $ox = $a[0]; + $oy = $a[1]; + $s = $a[2]; + + $dx = ($x[0] - $ox); + $dy = ($x[1] - $oy); + + if ($a_k == 0) + return -2.*$s*$s*$dx; + elseif ($a_k == 1) + return -2.*$s*$s*$dy; + else + return 2.*$s*($dx*$dx + $dy*$dy); + } // function grad() + + + /** + * @return array[] $a + */ + function initial() { + $a[0] = 0.05; + $a[1] = 0.1; + $a[2] = 1.0; + + return $a; + } // function initial() + + + /** + * @return Object[] $a + */ + function testdata() { + $npts = 25; + + $a[0] = 0.; + $a[1] = 0.; + $a[2] = 0.9; + + $i = 0; + + for ($r = -2; $r <= 2; ++$r) { + for ($c = -2; $c <= 2; ++$c) { + $x[$i][0] = $c; + $x[$i][1] = $r; + $y[$i] = $this->val($x[$i], $a); + print("Quad ".$c.",".$r." -> ".$y[$i]."<br />"); + $s[$i] = 1.; + ++$i; + } + } + print("quad x= "); + + $qx = new Matrix($x); + $qx->print(10, 2); + + print("quad y= "); + $qy = new Matrix($y, $npts); + $qy->print(10, 2); + + $o[0] = $x; + $o[1] = $a; + $o[2] = $y; + $o[3] = $s; + + return $o; + } // function testdata() + +} // class LMQuadTest diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation.php new file mode 100644 index 000000000..5b7428613 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation.php @@ -0,0 +1,59 @@ +<?php + +require_once "../Matrix.php"; + +/** + * Given n points (x0,y0)...(xn-1,yn-1), the following methid computes + * the polynomial factors of the n-1't degree polynomial passing through + * the n points. + * + * Example: Passing in three points (2,3) (1,4) and (3,7) will produce + * the results [2.5, -8.5, 10] which means that the points are on the + * curve y = 2.5x² - 8.5x + 10. + * + * @see http://geosoft.no/software/lagrange/LagrangeInterpolation.java.html + * @author Jacob Dreyer + * @author Paul Meagher (port to PHP and minor changes) + * + * @param x[] float + * @param y[] float + */ +class LagrangeInterpolation { + + public function findPolynomialFactors($x, $y) { + $n = count($x); + + $data = array(); // double[n][n]; + $rhs = array(); // double[n]; + + for ($i = 0; $i < $n; ++$i) { + $v = 1; + for ($j = 0; $j < $n; ++$j) { + $data[$i][$n-$j-1] = $v; + $v *= $x[$i]; + } + $rhs[$i] = $y[$i]; + } + + // Solve m * s = b + $m = new Matrix($data); + $b = new Matrix($rhs, $n); + + $s = $m->solve($b); + + return $s->getRowPackedCopy(); + } // function findPolynomialFactors() + +} // class LagrangeInterpolation + + +$x = array(2.0, 1.0, 3.0); +$y = array(3.0, 4.0, 7.0); + +$li = new LagrangeInterpolation; +$f = $li->findPolynomialFactors($x, $y); + + +for ($i = 0; $i < 3; ++$i) { + echo $f[$i]."<br />"; +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation2.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation2.php new file mode 100644 index 000000000..e7529c5f1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation2.php @@ -0,0 +1,59 @@ +<?php + +require_once "../Matrix.php"; + +/** + * Given n points (x0,y0)...(xn-1,yn-1), the following method computes + * the polynomial factors of the n-1't degree polynomial passing through + * the n points. + * + * Example: Passing in three points (2,3) (1,4) and (3,7) will produce + * the results [2.5, -8.5, 10] which means that the points are on the + * curve y = 2.5x² - 8.5x + 10. + * + * @see http://geosoft.no/software/lagrange/LagrangeInterpolation.java.html + * @see http://source.freehep.org/jcvsweb/ilc/LCSIM/wdview/lcsim/src/org/lcsim/fit/polynomial/PolynomialFitter.java + * @author Jacob Dreyer + * @author Paul Meagher (port to PHP and minor changes) + * + * @param x[] float + * @param y[] float + */ +class LagrangeInterpolation { + + public function findPolynomialFactors($x, $y) { + $n = count($x); + + $data = array(); // double[n][n]; + $rhs = array(); // double[n]; + + for ($i = 0; $i < $n; ++$i) { + $v = 1; + for ($j = 0; $j < $n; ++$j) { + $data[$i][$n-$j-1] = $v; + $v *= $x[$i]; + } + $rhs[$i] = $y[$i]; + } + + // Solve m * s = b + $m = new Matrix($data); + $b = new Matrix($rhs, $n); + + $s = $m->solve($b); + + return $s->getRowPackedCopy(); + } // function findPolynomialFactors() + +} // class LagrangeInterpolation + + +$x = array(2.0, 1.0, 3.0); +$y = array(3.0, 4.0, 7.0); + +$li = new LagrangeInterpolation; +$f = $li->findPolynomialFactors($x, $y); + +for ($i = 0; $i < 3; ++$i) { + echo $f[$i]."<br />"; +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LevenbergMarquardt.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LevenbergMarquardt.php new file mode 100644 index 000000000..7cfd5f899 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/LevenbergMarquardt.php @@ -0,0 +1,185 @@ +<?php + +// Levenberg-Marquardt in PHP + +// http://www.idiom.com/~zilla/Computer/Javanumeric/LM.java + +class LevenbergMarquardt { + + /** + * Calculate the current sum-squared-error + * + * Chi-squared is the distribution of squared Gaussian errors, + * thus the name. + * + * @param double[][] $x + * @param double[] $a + * @param double[] $y, + * @param double[] $s, + * @param object $f + */ + function chiSquared($x, $a, $y, $s, $f) { + $npts = count($y); + $sum = 0.0; + + for ($i = 0; $i < $npts; ++$i) { + $d = $y[$i] - $f->val($x[$i], $a); + $d = $d / $s[$i]; + $sum = $sum + ($d*$d); + } + + return $sum; + } // function chiSquared() + + + /** + * Minimize E = sum {(y[k] - f(x[k],a)) / s[k]}^2 + * The individual errors are optionally scaled by s[k]. + * Note that LMfunc implements the value and gradient of f(x,a), + * NOT the value and gradient of E with respect to a! + * + * @param x array of domain points, each may be multidimensional + * @param y corresponding array of values + * @param a the parameters/state of the model + * @param vary false to indicate the corresponding a[k] is to be held fixed + * @param s2 sigma^2 for point i + * @param lambda blend between steepest descent (lambda high) and + * jump to bottom of quadratic (lambda zero). + * Start with 0.001. + * @param termepsilon termination accuracy (0.01) + * @param maxiter stop and return after this many iterations if not done + * @param verbose set to zero (no prints), 1, 2 + * + * @return the new lambda for future iterations. + * Can use this and maxiter to interleave the LM descent with some other + * task, setting maxiter to something small. + */ + function solve($x, $a, $y, $s, $vary, $f, $lambda, $termepsilon, $maxiter, $verbose) { + $npts = count($y); + $nparm = count($a); + + if ($verbose > 0) { + print("solve x[".count($x)."][".count($x[0])."]"); + print(" a[".count($a)."]"); + println(" y[".count(length)."]"); + } + + $e0 = $this->chiSquared($x, $a, $y, $s, $f); + + //double lambda = 0.001; + $done = false; + + // g = gradient, H = hessian, d = step to minimum + // H d = -g, solve for d + $H = array(); + $g = array(); + + //double[] d = new double[nparm]; + + $oos2 = array(); + + for($i = 0; $i < $npts; ++$i) { + $oos2[$i] = 1./($s[$i]*$s[$i]); + } + $iter = 0; + $term = 0; // termination count test + + do { + ++$iter; + + // hessian approximation + for( $r = 0; $r < $nparm; ++$r) { + for( $c = 0; $c < $nparm; ++$c) { + for( $i = 0; $i < $npts; ++$i) { + if ($i == 0) $H[$r][$c] = 0.; + $xi = $x[$i]; + $H[$r][$c] += ($oos2[$i] * $f->grad($xi, $a, $r) * $f->grad($xi, $a, $c)); + } //npts + } //c + } //r + + // boost diagonal towards gradient descent + for( $r = 0; $r < $nparm; ++$r) + $H[$r][$r] *= (1. + $lambda); + + // gradient + for( $r = 0; $r < $nparm; ++$r) { + for( $i = 0; $i < $npts; ++$i) { + if ($i == 0) $g[$r] = 0.; + $xi = $x[$i]; + $g[$r] += ($oos2[$i] * ($y[$i]-$f->val($xi,$a)) * $f->grad($xi, $a, $r)); + } + } //npts + + // scale (for consistency with NR, not necessary) + if ($false) { + for( $r = 0; $r < $nparm; ++$r) { + $g[$r] = -0.5 * $g[$r]; + for( $c = 0; $c < $nparm; ++$c) { + $H[$r][$c] *= 0.5; + } + } + } + + // solve H d = -g, evaluate error at new location + //double[] d = DoubleMatrix.solve(H, g); +// double[] d = (new Matrix(H)).lu().solve(new Matrix(g, nparm)).getRowPackedCopy(); + //double[] na = DoubleVector.add(a, d); +// double[] na = (new Matrix(a, nparm)).plus(new Matrix(d, nparm)).getRowPackedCopy(); +// double e1 = chiSquared(x, na, y, s, f); + +// if (verbose > 0) { +// System.out.println("\n\niteration "+iter+" lambda = "+lambda); +// System.out.print("a = "); +// (new Matrix(a, nparm)).print(10, 2); +// if (verbose > 1) { +// System.out.print("H = "); +// (new Matrix(H)).print(10, 2); +// System.out.print("g = "); +// (new Matrix(g, nparm)).print(10, 2); +// System.out.print("d = "); +// (new Matrix(d, nparm)).print(10, 2); +// } +// System.out.print("e0 = " + e0 + ": "); +// System.out.print("moved from "); +// (new Matrix(a, nparm)).print(10, 2); +// System.out.print("e1 = " + e1 + ": "); +// if (e1 < e0) { +// System.out.print("to "); +// (new Matrix(na, nparm)).print(10, 2); +// } else { +// System.out.println("move rejected"); +// } +// } + + // termination test (slightly different than NR) +// if (Math.abs(e1-e0) > termepsilon) { +// term = 0; +// } else { +// term++; +// if (term == 4) { +// System.out.println("terminating after " + iter + " iterations"); +// done = true; +// } +// } +// if (iter >= maxiter) done = true; + + // in the C++ version, found that changing this to e1 >= e0 + // was not a good idea. See comment there. + // +// if (e1 > e0 || Double.isNaN(e1)) { // new location worse than before +// lambda *= 10.; +// } else { // new location better, accept new parameters +// lambda *= 0.1; +// e0 = e1; +// // simply assigning a = na will not get results copied back to caller +// for( int i = 0; i < nparm; i++ ) { +// if (vary[i]) a[i] = na[i]; +// } +// } + } while(!$done); + + return $lambda; + } // function solve() + +} // class LevenbergMarquardt diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/MagicSquareExample.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/MagicSquareExample.php new file mode 100644 index 000000000..e6c93d05b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/MagicSquareExample.php @@ -0,0 +1,182 @@ +<?php +/** +* @package JAMA +*/ + +require_once "../Matrix.php"; + +/** +* Example of use of Matrix Class, featuring magic squares. +*/ +class MagicSquareExample { + + /** + * Generate magic square test matrix. + * @param int n dimension of matrix + */ + function magic($n) { + + // Odd order + + if (($n % 2) == 1) { + $a = ($n+1)/2; + $b = ($n+1); + for ($j = 0; $j < $n; ++$j) + for ($i = 0; $i < $n; ++$i) + $M[$i][$j] = $n*(($i+$j+$a) % $n) + (($i+2*$j+$b) % $n) + 1; + + // Doubly Even Order + + } else if (($n % 4) == 0) { + for ($j = 0; $j < $n; ++$j) { + for ($i = 0; $i < $n; ++$i) { + if ((($i+1)/2)%2 == (($j+1)/2)%2) + $M[$i][$j] = $n*$n-$n*$i-$j; + else + $M[$i][$j] = $n*$i+$j+1; + } + } + + // Singly Even Order + + } else { + + $p = $n/2; + $k = ($n-2)/4; + $A = $this->magic($p); + $M = array(); + for ($j = 0; $j < $p; ++$j) { + for ($i = 0; $i < $p; ++$i) { + $aij = $A->get($i,$j); + $M[$i][$j] = $aij; + $M[$i][$j+$p] = $aij + 2*$p*$p; + $M[$i+$p][$j] = $aij + 3*$p*$p; + $M[$i+$p][$j+$p] = $aij + $p*$p; + } + } + + for ($i = 0; $i < $p; ++$i) { + for ($j = 0; $j < $k; ++$j) { + $t = $M[$i][$j]; + $M[$i][$j] = $M[$i+$p][$j]; + $M[$i+$p][$j] = $t; + } + for ($j = $n-$k+1; $j < $n; ++$j) { + $t = $M[$i][$j]; + $M[$i][$j] = $M[$i+$p][$j]; + $M[$i+$p][$j] = $t; + } + } + + $t = $M[$k][0]; $M[$k][0] = $M[$k+$p][0]; $M[$k+$p][0] = $t; + $t = $M[$k][$k]; $M[$k][$k] = $M[$k+$p][$k]; $M[$k+$p][$k] = $t; + + } + + return new Matrix($M); + + } + + /** + * Simple function to replicate PHP 5 behaviour + */ + function microtime_float() { + list($usec, $sec) = explode(" ", microtime()); + return ((float)$usec + (float)$sec); + } + + /** + * Tests LU, QR, SVD and symmetric Eig decompositions. + * + * n = order of magic square. + * trace = diagonal sum, should be the magic sum, (n^3 + n)/2. + * max_eig = maximum eigenvalue of (A + A')/2, should equal trace. + * rank = linear algebraic rank, should equal n if n is odd, + * be less than n if n is even. + * cond = L_2 condition number, ratio of singular values. + * lu_res = test of LU factorization, norm1(L*U-A(p,:))/(n*eps). + * qr_res = test of QR factorization, norm1(Q*R-A)/(n*eps). + */ + function main() { + ?> + <p>Test of Matrix Class, using magic squares.</p> + <p>See MagicSquareExample.main() for an explanation.</p> + <table border='1' cellspacing='0' cellpadding='4'> + <tr> + <th>n</th> + <th>trace</th> + <th>max_eig</th> + <th>rank</th> + <th>cond</th> + <th>lu_res</th> + <th>qr_res</th> + </tr> + <?php + $start_time = $this->microtime_float(); + $eps = pow(2.0,-52.0); + for ($n = 3; $n <= 6; ++$n) { + echo "<tr>"; + + echo "<td align='right'>$n</td>"; + + $M = $this->magic($n); + $t = (int) $M->trace(); + + echo "<td align='right'>$t</td>"; + + $O = $M->plus($M->transpose()); + $E = new EigenvalueDecomposition($O->times(0.5)); + $d = $E->getRealEigenvalues(); + + echo "<td align='right'>".$d[$n-1]."</td>"; + + $r = $M->rank(); + + echo "<td align='right'>".$r."</td>"; + + $c = $M->cond(); + + if ($c < 1/$eps) + echo "<td align='right'>".sprintf("%.3f",$c)."</td>"; + else + echo "<td align='right'>Inf</td>"; + + $LU = new LUDecomposition($M); + $L = $LU->getL(); + $U = $LU->getU(); + $p = $LU->getPivot(); + // Java version: R = L.times(U).minus(M.getMatrix(p,0,n-1)); + $S = $L->times($U); + $R = $S->minus($M->getMatrix($p,0,$n-1)); + $res = $R->norm1()/($n*$eps); + + echo "<td align='right'>".sprintf("%.3f",$res)."</td>"; + + $QR = new QRDecomposition($M); + $Q = $QR->getQ(); + $R = $QR->getR(); + $S = $Q->times($R); + $R = $S->minus($M); + $res = $R->norm1()/($n*$eps); + + echo "<td align='right'>".sprintf("%.3f",$res)."</td>"; + + echo "</tr>"; + + } + echo "<table>"; + echo "<br />"; + + $stop_time = $this->microtime_float(); + $etime = $stop_time - $start_time; + + echo "<p>Elapsed time is ". sprintf("%.4f",$etime) ." seconds.</p>"; + + } + +} + +$magic = new MagicSquareExample(); +$magic->main(); + +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/Stats.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/Stats.php new file mode 100644 index 000000000..38bc4b7d8 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/Stats.php @@ -0,0 +1,1605 @@ +<?php +// +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2003 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.0 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Authors: Jesus M. Castagnetto <jmcastagnetto@php.net> | +// +----------------------------------------------------------------------+ +// +// $Id: Stats.php,v 1.15 2003/06/01 11:40:30 jmcastagnetto Exp $ +// + +include_once 'PEAR.php'; + +/** +* @package Math_Stats +*/ + +// Constants for defining the statistics to calculate /*{{{*/ +/** +* STATS_BASIC to generate the basic descriptive statistics +*/ +define('STATS_BASIC', 1); +/** +* STATS_FULL to generate also higher moments, mode, median, etc. +*/ +define('STATS_FULL', 2); +/*}}}*/ + +// Constants describing the data set format /*{{{*/ +/** +* STATS_DATA_SIMPLE for an array of numeric values. This is the default. +* e.g. $data = array(2,3,4,5,1,1,6); +*/ +define('STATS_DATA_SIMPLE', 0); +/** +* STATS_DATA_CUMMULATIVE for an associative array of frequency values, +* where in each array entry, the index is the data point and the +* value the count (frequency): +* e.g. $data = array(3=>4, 2.3=>5, 1.25=>6, 0.5=>3) +*/ +define('STATS_DATA_CUMMULATIVE', 1); +/*}}}*/ + +// Constants defining how to handle nulls /*{{{*/ +/** +* STATS_REJECT_NULL, reject data sets with null values. This is the default. +* Any non-numeric value is considered a null in this context. +*/ +define('STATS_REJECT_NULL', -1); +/** +* STATS_IGNORE_NULL, ignore null values and prune them from the data. +* Any non-numeric value is considered a null in this context. +*/ +define('STATS_IGNORE_NULL', -2); +/** +* STATS_USE_NULL_AS_ZERO, assign the value of 0 (zero) to null values. +* Any non-numeric value is considered a null in this context. +*/ +define('STATS_USE_NULL_AS_ZERO', -3); +/*}}}*/ + +/** +* A class to calculate descriptive statistics from a data set. +* Data sets can be simple arrays of data, or a cummulative hash. +* The second form is useful when passing large data set, +* for example the data set: +* +* <pre> +* $data1 = array (1,2,1,1,1,1,3,3,4.1,3,2,2,4.1,1,1,2,3,3,2,2,1,1,2,2); +* </pre> +* +* can be epxressed more compactly as: +* +* <pre> +* $data2 = array('1'=>9, '2'=>8, '3'=>5, '4.1'=>2); +* </pre> +* +* Example of use: +* +* <pre> +* include_once 'Math/Stats.php'; +* $s = new Math_Stats(); +* $s->setData($data1); +* // or +* // $s->setData($data2, STATS_DATA_CUMMULATIVE); +* $stats = $s->calcBasic(); +* echo 'Mean: '.$stats['mean'].' StDev: '.$stats['stdev'].' <br />\n'; +* +* // using data with nulls +* // first ignoring them: +* $data3 = array(1.2, 'foo', 2.4, 3.1, 4.2, 3.2, null, 5.1, 6.2); +* $s->setNullOption(STATS_IGNORE_NULL); +* $s->setData($data3); +* $stats3 = $s->calcFull(); +* +* // and then assuming nulls == 0 +* $s->setNullOption(STATS_USE_NULL_AS_ZERO); +* $s->setData($data3); +* $stats3 = $s->calcFull(); +* </pre> +* +* Originally this class was part of NumPHP (Numeric PHP package) +* +* @author Jesus M. Castagnetto <jmcastagnetto@php.net> +* @version 0.8 +* @access public +* @package Math_Stats +*/ +class Base {/*{{{*/ + // properties /*{{{*/ + + /** + * The simple or cummulative data set. + * Null by default. + * + * @access private + * @var array + */ + public $_data = null; + + /** + * Expanded data set. Only set when cummulative data + * is being used. Null by default. + * + * @access private + * @var array + */ + public $_dataExpanded = null; + + /** + * Flag for data type, one of STATS_DATA_SIMPLE or + * STATS_DATA_CUMMULATIVE. Null by default. + * + * @access private + * @var int + */ + public $_dataOption = null; + + /** + * Flag for null handling options. One of STATS_REJECT_NULL, + * STATS_IGNORE_NULL or STATS_USE_NULL_AS_ZERO + * + * @access private + * @var int + */ + public $_nullOption; + + /** + * Array for caching result values, should be reset + * when using setData() + * + * @access private + * @var array + */ + public $_calculatedValues = array(); + + /*}}}*/ + + /** + * Constructor for the class + * + * @access public + * @param optional int $nullOption how to handle null values + * @return object Math_Stats + */ + function Math_Stats($nullOption=STATS_REJECT_NULL) {/*{{{*/ + $this->_nullOption = $nullOption; + }/*}}}*/ + + /** + * Sets and verifies the data, checking for nulls and using + * the current null handling option + * + * @access public + * @param array $arr the data set + * @param optional int $opt data format: STATS_DATA_CUMMULATIVE or STATS_DATA_SIMPLE (default) + * @return mixed true on success, a PEAR_Error object otherwise + */ + function setData($arr, $opt=STATS_DATA_SIMPLE) {/*{{{*/ + if (!is_array($arr)) { + return PEAR::raiseError('invalid data, an array of numeric data was expected'); + } + $this->_data = null; + $this->_dataExpanded = null; + $this->_dataOption = null; + $this->_calculatedValues = array(); + if ($opt == STATS_DATA_SIMPLE) { + $this->_dataOption = $opt; + $this->_data = array_values($arr); + } else if ($opt == STATS_DATA_CUMMULATIVE) { + $this->_dataOption = $opt; + $this->_data = $arr; + $this->_dataExpanded = array(); + } + return $this->_validate(); + }/*}}}*/ + + /** + * Returns the data which might have been modified + * according to the current null handling options. + * + * @access public + * @param boolean $expanded whether to return a expanded list, default is false + * @return mixed array of data on success, a PEAR_Error object otherwise + * @see _validate() + */ + function getData($expanded=false) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if ($this->_dataOption == STATS_DATA_CUMMULATIVE && $expanded) { + return $this->_dataExpanded; + } else { + return $this->_data; + } + }/*}}}*/ + + /** + * Sets the null handling option. + * Must be called before assigning a new data set containing null values + * + * @access public + * @return mixed true on success, a PEAR_Error object otherwise + * @see _validate() + */ + function setNullOption($nullOption) {/*{{{*/ + if ($nullOption == STATS_REJECT_NULL + || $nullOption == STATS_IGNORE_NULL + || $nullOption == STATS_USE_NULL_AS_ZERO) { + $this->_nullOption = $nullOption; + return true; + } else { + return PEAR::raiseError('invalid null handling option expecting: '. + 'STATS_REJECT_NULL, STATS_IGNORE_NULL or STATS_USE_NULL_AS_ZERO'); + } + }/*}}}*/ + + /** + * Transforms the data by substracting each entry from the mean and + * dividing by its standard deviation. This will reset all pre-calculated + * values to their original (unset) defaults. + * + * @access public + * @return mixed true on success, a PEAR_Error object otherwise + * @see mean() + * @see stDev() + * @see setData() + */ + function studentize() {/*{{{*/ + $mean = $this->mean(); + if (PEAR::isError($mean)) { + return $mean; + } + $std = $this->stDev(); + if (PEAR::isError($std)) { + return $std; + } + if ($std == 0) { + return PEAR::raiseError('cannot studentize data, standard deviation is zero.'); + } + $arr = array(); + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach ($this->_data as $val=>$freq) { + $newval = ($val - $mean) / $std; + $arr["$newval"] = $freq; + } + } else { + foreach ($this->_data as $val) { + $newval = ($val - $mean) / $std; + $arr[] = $newval; + } + } + return $this->setData($arr, $this->_dataOption); + }/*}}}*/ + + /** + * Transforms the data by substracting each entry from the mean. + * This will reset all pre-calculated values to their original (unset) defaults. + * + * @access public + * @return mixed true on success, a PEAR_Error object otherwise + * @see mean() + * @see setData() + */ + function center() {/*{{{*/ + $mean = $this->mean(); + if (PEAR::isError($mean)) { + return $mean; + } + $arr = array(); + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach ($this->_data as $val=>$freq) { + $newval = $val - $mean; + $arr["$newval"] = $freq; + } + } else { + foreach ($this->_data as $val) { + $newval = $val - $mean; + $arr[] = $newval; + } + } + return $this->setData($arr, $this->_dataOption); + }/*}}}*/ + + /** + * Calculates the basic or full statistics for the data set + * + * @access public + * @param int $mode one of STATS_BASIC or STATS_FULL + * @param boolean $returnErrorObject whether the raw PEAR_Error (when true, default), + * or only the error message will be returned (when false), if an error happens. + * @return mixed an associative array of statistics on success, a PEAR_Error object otherwise + * @see calcBasic() + * @see calcFull() + */ + function calc($mode, $returnErrorObject=true) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if ($mode == STATS_BASIC) { + return $this->calcBasic($returnErrorObject); + } elseif ($mode == STATS_FULL) { + return $this->calcFull($returnErrorObject); + } else { + return PEAR::raiseError('incorrect mode, expected STATS_BASIC or STATS_FULL'); + } + }/*}}}*/ + + /** + * Calculates a basic set of statistics + * + * @access public + * @param boolean $returnErrorObject whether the raw PEAR_Error (when true, default), + * or only the error message will be returned (when false), if an error happens. + * @return mixed an associative array of statistics on success, a PEAR_Error object otherwise + * @see calc() + * @see calcFull() + */ + function calcBasic($returnErrorObject=true) {/*{{{*/ + return array ( + 'min' => $this->__format($this->min(), $returnErrorObject), + 'max' => $this->__format($this->max(), $returnErrorObject), + 'sum' => $this->__format($this->sum(), $returnErrorObject), + 'sum2' => $this->__format($this->sum2(), $returnErrorObject), + 'count' => $this->__format($this->count(), $returnErrorObject), + 'mean' => $this->__format($this->mean(), $returnErrorObject), + 'stdev' => $this->__format($this->stDev(), $returnErrorObject), + 'variance' => $this->__format($this->variance(), $returnErrorObject), + 'range' => $this->__format($this->range(), $returnErrorObject) + ); + }/*}}}*/ + + /** + * Calculates a full set of statistics + * + * @access public + * @param boolean $returnErrorObject whether the raw PEAR_Error (when true, default), + * or only the error message will be returned (when false), if an error happens. + * @return mixed an associative array of statistics on success, a PEAR_Error object otherwise + * @see calc() + * @see calcBasic() + */ + function calcFull($returnErrorObject=true) {/*{{{*/ + return array ( + 'min' => $this->__format($this->min(), $returnErrorObject), + 'max' => $this->__format($this->max(), $returnErrorObject), + 'sum' => $this->__format($this->sum(), $returnErrorObject), + 'sum2' => $this->__format($this->sum2(), $returnErrorObject), + 'count' => $this->__format($this->count(), $returnErrorObject), + 'mean' => $this->__format($this->mean(), $returnErrorObject), + 'median' => $this->__format($this->median(), $returnErrorObject), + 'mode' => $this->__format($this->mode(), $returnErrorObject), + 'midrange' => $this->__format($this->midrange(), $returnErrorObject), + 'geometric_mean' => $this->__format($this->geometricMean(), $returnErrorObject), + 'harmonic_mean' => $this->__format($this->harmonicMean(), $returnErrorObject), + 'stdev' => $this->__format($this->stDev(), $returnErrorObject), + 'absdev' => $this->__format($this->absDev(), $returnErrorObject), + 'variance' => $this->__format($this->variance(), $returnErrorObject), + 'range' => $this->__format($this->range(), $returnErrorObject), + 'std_error_of_mean' => $this->__format($this->stdErrorOfMean(), $returnErrorObject), + 'skewness' => $this->__format($this->skewness(), $returnErrorObject), + 'kurtosis' => $this->__format($this->kurtosis(), $returnErrorObject), + 'coeff_of_variation' => $this->__format($this->coeffOfVariation(), $returnErrorObject), + 'sample_central_moments' => array ( + 1 => $this->__format($this->sampleCentralMoment(1), $returnErrorObject), + 2 => $this->__format($this->sampleCentralMoment(2), $returnErrorObject), + 3 => $this->__format($this->sampleCentralMoment(3), $returnErrorObject), + 4 => $this->__format($this->sampleCentralMoment(4), $returnErrorObject), + 5 => $this->__format($this->sampleCentralMoment(5), $returnErrorObject) + ), + 'sample_raw_moments' => array ( + 1 => $this->__format($this->sampleRawMoment(1), $returnErrorObject), + 2 => $this->__format($this->sampleRawMoment(2), $returnErrorObject), + 3 => $this->__format($this->sampleRawMoment(3), $returnErrorObject), + 4 => $this->__format($this->sampleRawMoment(4), $returnErrorObject), + 5 => $this->__format($this->sampleRawMoment(5), $returnErrorObject) + ), + 'frequency' => $this->__format($this->frequency(), $returnErrorObject), + 'quartiles' => $this->__format($this->quartiles(), $returnErrorObject), + 'interquartile_range' => $this->__format($this->interquartileRange(), $returnErrorObject), + 'interquartile_mean' => $this->__format($this->interquartileMean(), $returnErrorObject), + 'quartile_deviation' => $this->__format($this->quartileDeviation(), $returnErrorObject), + 'quartile_variation_coefficient' => $this->__format($this->quartileVariationCoefficient(), $returnErrorObject), + 'quartile_skewness_coefficient' => $this->__format($this->quartileSkewnessCoefficient(), $returnErrorObject) + ); + }/*}}}*/ + + /** + * Calculates the minimum of a data set. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the minimum value on success, a PEAR_Error object otherwise + * @see calc() + * @see max() + */ + function min() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('min', $this->_calculatedValues)) { + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $min = min(array_keys($this->_data)); + } else { + $min = min($this->_data); + } + $this->_calculatedValues['min'] = $min; + } + return $this->_calculatedValues['min']; + }/*}}}*/ + + /** + * Calculates the maximum of a data set. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the maximum value on success, a PEAR_Error object otherwise + * @see calc() + * @see min() + */ + function max() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('max', $this->_calculatedValues)) { + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $max = max(array_keys($this->_data)); + } else { + $max = max($this->_data); + } + $this->_calculatedValues['max'] = $max; + } + return $this->_calculatedValues['max']; + }/*}}}*/ + + /** + * Calculates SUM { xi } + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the sum on success, a PEAR_Error object otherwise + * @see calc() + * @see sum2() + * @see sumN() + */ + function sum() {/*{{{*/ + if (!array_key_exists('sum', $this->_calculatedValues)) { + $sum = $this->sumN(1); + if (PEAR::isError($sum)) { + return $sum; + } else { + $this->_calculatedValues['sum'] = $sum; + } + } + return $this->_calculatedValues['sum']; + }/*}}}*/ + + /** + * Calculates SUM { (xi)^2 } + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the sum on success, a PEAR_Error object otherwise + * @see calc() + * @see sum() + * @see sumN() + */ + function sum2() {/*{{{*/ + if (!array_key_exists('sum2', $this->_calculatedValues)) { + $sum2 = $this->sumN(2); + if (PEAR::isError($sum2)) { + return $sum2; + } else { + $this->_calculatedValues['sum2'] = $sum2; + } + } + return $this->_calculatedValues['sum2']; + }/*}}}*/ + + /** + * Calculates SUM { (xi)^n } + * Handles cummulative data sets correctly + * + * @access public + * @param numeric $n the exponent + * @return mixed the sum on success, a PEAR_Error object otherwise + * @see calc() + * @see sum() + * @see sum2() + */ + function sumN($n) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + $sumN = 0; + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach($this->_data as $val=>$freq) { + $sumN += $freq * pow((double)$val, (double)$n); + } + } else { + foreach($this->_data as $val) { + $sumN += pow((double)$val, (double)$n); + } + } + return $sumN; + }/*}}}*/ + + /** + * Calculates PROD { (xi) }, (the product of all observations) + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the product on success, a PEAR_Error object otherwise + * @see productN() + */ + function product() {/*{{{*/ + if (!array_key_exists('product', $this->_calculatedValues)) { + $product = $this->productN(1); + if (PEAR::isError($product)) { + return $product; + } else { + $this->_calculatedValues['product'] = $product; + } + } + return $this->_calculatedValues['product']; + }/*}}}*/ + + /** + * Calculates PROD { (xi)^n }, which is the product of all observations + * Handles cummulative data sets correctly + * + * @access public + * @param numeric $n the exponent + * @return mixed the product on success, a PEAR_Error object otherwise + * @see product() + */ + function productN($n) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + $prodN = 1.0; + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach($this->_data as $val=>$freq) { + if ($val == 0) { + return 0.0; + } + $prodN *= $freq * pow((double)$val, (double)$n); + } + } else { + foreach($this->_data as $val) { + if ($val == 0) { + return 0.0; + } + $prodN *= pow((double)$val, (double)$n); + } + } + return $prodN; + + }/*}}}*/ + + /** + * Calculates the number of data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the count on success, a PEAR_Error object otherwise + * @see calc() + */ + function count() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('count', $this->_calculatedValues)) { + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $count = count($this->_dataExpanded); + } else { + $count = count($this->_data); + } + $this->_calculatedValues['count'] = $count; + } + return $this->_calculatedValues['count']; + }/*}}}*/ + + /** + * Calculates the mean (average) of the data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the mean value on success, a PEAR_Error object otherwise + * @see calc() + * @see sum() + * @see count() + */ + function mean() {/*{{{*/ + if (!array_key_exists('mean', $this->_calculatedValues)) { + $sum = $this->sum(); + if (PEAR::isError($sum)) { + return $sum; + } + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $this->_calculatedValues['mean'] = $sum / $count; + } + return $this->_calculatedValues['mean']; + }/*}}}*/ + + /** + * Calculates the range of the data set = max - min + * + * @access public + * @return mixed the value of the range on success, a PEAR_Error object otherwise. + */ + function range() {/*{{{*/ + if (!array_key_exists('range', $this->_calculatedValues)) { + $min = $this->min(); + if (PEAR::isError($min)) { + return $min; + } + $max = $this->max(); + if (PEAR::isError($max)) { + return $max; + } + $this->_calculatedValues['range'] = $max - $min; + } + return $this->_calculatedValues['range']; + + }/*}}}*/ + + /** + * Calculates the variance (unbiased) of the data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the variance value on success, a PEAR_Error object otherwise + * @see calc() + * @see __sumdiff() + * @see count() + */ + function variance() {/*{{{*/ + if (!array_key_exists('variance', $this->_calculatedValues)) { + $variance = $this->__calcVariance(); + if (PEAR::isError($variance)) { + return $variance; + } + $this->_calculatedValues['variance'] = $variance; + } + return $this->_calculatedValues['variance']; + }/*}}}*/ + + /** + * Calculates the standard deviation (unbiased) of the data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the standard deviation on success, a PEAR_Error object otherwise + * @see calc() + * @see variance() + */ + function stDev() {/*{{{*/ + if (!array_key_exists('stDev', $this->_calculatedValues)) { + $variance = $this->variance(); + if (PEAR::isError($variance)) { + return $variance; + } + $this->_calculatedValues['stDev'] = sqrt($variance); + } + return $this->_calculatedValues['stDev']; + }/*}}}*/ + + /** + * Calculates the variance (unbiased) of the data points in the set + * given a fixed mean (average) value. Not used in calcBasic(), calcFull() + * or calc(). + * Handles cummulative data sets correctly + * + * @access public + * @param numeric $mean the fixed mean value + * @return mixed the variance on success, a PEAR_Error object otherwise + * @see __sumdiff() + * @see count() + * @see variance() + */ + function varianceWithMean($mean) {/*{{{*/ + return $this->__calcVariance($mean); + }/*}}}*/ + + /** + * Calculates the standard deviation (unbiased) of the data points in the set + * given a fixed mean (average) value. Not used in calcBasic(), calcFull() + * or calc(). + * Handles cummulative data sets correctly + * + * @access public + * @param numeric $mean the fixed mean value + * @return mixed the standard deviation on success, a PEAR_Error object otherwise + * @see varianceWithMean() + * @see stDev() + */ + function stDevWithMean($mean) {/*{{{*/ + $varianceWM = $this->varianceWithMean($mean); + if (PEAR::isError($varianceWM)) { + return $varianceWM; + } + return sqrt($varianceWM); + }/*}}}*/ + + /** + * Calculates the absolute deviation of the data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the absolute deviation on success, a PEAR_Error object otherwise + * @see calc() + * @see __sumabsdev() + * @see count() + * @see absDevWithMean() + */ + function absDev() {/*{{{*/ + if (!array_key_exists('absDev', $this->_calculatedValues)) { + $absDev = $this->__calcAbsoluteDeviation(); + if (PEAR::isError($absdev)) { + return $absdev; + } + $this->_calculatedValues['absDev'] = $absDev; + } + return $this->_calculatedValues['absDev']; + }/*}}}*/ + + /** + * Calculates the absolute deviation of the data points in the set + * given a fixed mean (average) value. Not used in calcBasic(), calcFull() + * or calc(). + * Handles cummulative data sets correctly + * + * @access public + * @param numeric $mean the fixed mean value + * @return mixed the absolute deviation on success, a PEAR_Error object otherwise + * @see __sumabsdev() + * @see absDev() + */ + function absDevWithMean($mean) {/*{{{*/ + return $this->__calcAbsoluteDeviation($mean); + }/*}}}*/ + + /** + * Calculates the skewness of the data distribution in the set + * The skewness measures the degree of asymmetry of a distribution, + * and is related to the third central moment of a distribution. + * A normal distribution has a skewness = 0 + * A distribution with a tail off towards the high end of the scale + * (positive skew) has a skewness > 0 + * A distribution with a tail off towards the low end of the scale + * (negative skew) has a skewness < 0 + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the skewness value on success, a PEAR_Error object otherwise + * @see __sumdiff() + * @see count() + * @see stDev() + * @see calc() + */ + function skewness() {/*{{{*/ + if (!array_key_exists('skewness', $this->_calculatedValues)) { + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $stDev = $this->stDev(); + if (PEAR::isError($stDev)) { + return $stDev; + } + $sumdiff3 = $this->__sumdiff(3); + if (PEAR::isError($sumdiff3)) { + return $sumdiff3; + } + $this->_calculatedValues['skewness'] = ($sumdiff3 / ($count * pow($stDev, 3))); + } + return $this->_calculatedValues['skewness']; + }/*}}}*/ + + /** + * Calculates the kurtosis of the data distribution in the set + * The kurtosis measures the degrees of peakedness of a distribution. + * It is also called the "excess" or "excess coefficient", and is + * a normalized form of the fourth central moment of a distribution. + * A normal distributions has kurtosis = 0 + * A narrow and peaked (leptokurtic) distribution has a + * kurtosis > 0 + * A flat and wide (platykurtic) distribution has a kurtosis < 0 + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the kurtosis value on success, a PEAR_Error object otherwise + * @see __sumdiff() + * @see count() + * @see stDev() + * @see calc() + */ + function kurtosis() {/*{{{*/ + if (!array_key_exists('kurtosis', $this->_calculatedValues)) { + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $stDev = $this->stDev(); + if (PEAR::isError($stDev)) { + return $stDev; + } + $sumdiff4 = $this->__sumdiff(4); + if (PEAR::isError($sumdiff4)) { + return $sumdiff4; + } + $this->_calculatedValues['kurtosis'] = ($sumdiff4 / ($count * pow($stDev, 4))) - 3; + } + return $this->_calculatedValues['kurtosis']; + }/*}}}*/ + + /** + * Calculates the median of a data set. + * The median is the value such that half of the points are below it + * in a sorted data set. + * If the number of values is odd, it is the middle item. + * If the number of values is even, is the average of the two middle items. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the median value on success, a PEAR_Error object otherwise + * @see count() + * @see calc() + */ + function median() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('median', $this->_calculatedValues)) { + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $arr =& $this->_dataExpanded; + } else { + $arr =& $this->_data; + } + $n = $this->count(); + if (PEAR::isError($n)) { + return $n; + } + $h = intval($n / 2); + if ($n % 2 == 0) { + $median = ($arr[$h] + $arr[$h - 1]) / 2; + } else { + $median = $arr[$h + 1]; + } + $this->_calculatedValues['median'] = $median; + } + return $this->_calculatedValues['median']; + }/*}}}*/ + + /** + * Calculates the mode of a data set. + * The mode is the value with the highest frequency in the data set. + * There can be more than one mode. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed an array of mode value on success, a PEAR_Error object otherwise + * @see frequency() + * @see calc() + */ + function mode() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('mode', $this->_calculatedValues)) { + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $arr = $this->_data; + } else { + $arr = $this->frequency(); + } + arsort($arr); + $mcount = 1; + foreach ($arr as $val=>$freq) { + if ($mcount == 1) { + $mode = array($val); + $mfreq = $freq; + ++$mcount; + continue; + } + if ($mfreq == $freq) + $mode[] = $val; + if ($mfreq > $freq) + break; + } + $this->_calculatedValues['mode'] = $mode; + } + return $this->_calculatedValues['mode']; + }/*}}}*/ + + /** + * Calculates the midrange of a data set. + * The midrange is the average of the minimum and maximum of the data set. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the midrange value on success, a PEAR_Error object otherwise + * @see min() + * @see max() + * @see calc() + */ + function midrange() {/*{{{*/ + if (!array_key_exists('midrange', $this->_calculatedValues)) { + $min = $this->min(); + if (PEAR::isError($min)) { + return $min; + } + $max = $this->max(); + if (PEAR::isError($max)) { + return $max; + } + $this->_calculatedValues['midrange'] = (($max + $min) / 2); + } + return $this->_calculatedValues['midrange']; + }/*}}}*/ + + /** + * Calculates the geometrical mean of the data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the geometrical mean value on success, a PEAR_Error object otherwise + * @see calc() + * @see product() + * @see count() + */ + function geometricMean() {/*{{{*/ + if (!array_key_exists('geometricMean', $this->_calculatedValues)) { + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $prod = $this->product(); + if (PEAR::isError($prod)) { + return $prod; + } + if ($prod == 0.0) { + return 0.0; + } + if ($prod < 0) { + return PEAR::raiseError('The product of the data set is negative, geometric mean undefined.'); + } + $this->_calculatedValues['geometricMean'] = pow($prod , 1 / $count); + } + return $this->_calculatedValues['geometricMean']; + }/*}}}*/ + + /** + * Calculates the harmonic mean of the data points in the set + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the harmonic mean value on success, a PEAR_Error object otherwise + * @see calc() + * @see count() + */ + function harmonicMean() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('harmonicMean', $this->_calculatedValues)) { + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $invsum = 0.0; + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach($this->_data as $val=>$freq) { + if ($val == 0) { + return PEAR::raiseError('cannot calculate a '. + 'harmonic mean with data values of zero.'); + } + $invsum += $freq / $val; + } + } else { + foreach($this->_data as $val) { + if ($val == 0) { + return PEAR::raiseError('cannot calculate a '. + 'harmonic mean with data values of zero.'); + } + $invsum += 1 / $val; + } + } + $this->_calculatedValues['harmonicMean'] = $count / $invsum; + } + return $this->_calculatedValues['harmonicMean']; + }/*}}}*/ + + /** + * Calculates the nth central moment (m{n}) of a data set. + * + * The definition of a sample central moment is: + * + * m{n} = 1/N * SUM { (xi - avg)^n } + * + * where: N = sample size, avg = sample mean. + * + * @access public + * @param integer $n moment to calculate + * @return mixed the numeric value of the moment on success, PEAR_Error otherwise + */ + function sampleCentralMoment($n) {/*{{{*/ + if (!is_int($n) || $n < 1) { + return PEAR::isError('moment must be a positive integer >= 1.'); + } + + if ($n == 1) { + return 0; + } + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + if ($count == 0) { + return PEAR::raiseError("Cannot calculate {$n}th sample moment, ". + 'there are zero data entries'); + } + $sum = $this->__sumdiff($n); + if (PEAR::isError($sum)) { + return $sum; + } + return ($sum / $count); + }/*}}}*/ + + /** + * Calculates the nth raw moment (m{n}) of a data set. + * + * The definition of a sample central moment is: + * + * m{n} = 1/N * SUM { xi^n } + * + * where: N = sample size, avg = sample mean. + * + * @access public + * @param integer $n moment to calculate + * @return mixed the numeric value of the moment on success, PEAR_Error otherwise + */ + function sampleRawMoment($n) {/*{{{*/ + if (!is_int($n) || $n < 1) { + return PEAR::isError('moment must be a positive integer >= 1.'); + } + + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + if ($count == 0) { + return PEAR::raiseError("Cannot calculate {$n}th raw moment, ". + 'there are zero data entries.'); + } + $sum = $this->sumN($n); + if (PEAR::isError($sum)) { + return $sum; + } + return ($sum / $count); + }/*}}}*/ + + + /** + * Calculates the coefficient of variation of a data set. + * The coefficient of variation measures the spread of a set of data + * as a proportion of its mean. It is often expressed as a percentage. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed the coefficient of variation on success, a PEAR_Error object otherwise + * @see stDev() + * @see mean() + * @see calc() + */ + function coeffOfVariation() {/*{{{*/ + if (!array_key_exists('coeffOfVariation', $this->_calculatedValues)) { + $mean = $this->mean(); + if (PEAR::isError($mean)) { + return $mean; + } + if ($mean == 0.0) { + return PEAR::raiseError('cannot calculate the coefficient '. + 'of variation, mean of sample is zero'); + } + $stDev = $this->stDev(); + if (PEAR::isError($stDev)) { + return $stDev; + } + + $this->_calculatedValues['coeffOfVariation'] = $stDev / $mean; + } + return $this->_calculatedValues['coeffOfVariation']; + }/*}}}*/ + + /** + * Calculates the standard error of the mean. + * It is the standard deviation of the sampling distribution of + * the mean. The formula is: + * + * S.E. Mean = SD / (N)^(1/2) + * + * This formula does not assume a normal distribution, and shows + * that the size of the standard error of the mean is inversely + * proportional to the square root of the sample size. + * + * @access public + * @return mixed the standard error of the mean on success, a PEAR_Error object otherwise + * @see stDev() + * @see count() + * @see calc() + */ + function stdErrorOfMean() {/*{{{*/ + if (!array_key_exists('stdErrorOfMean', $this->_calculatedValues)) { + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $stDev = $this->stDev(); + if (PEAR::isError($stDev)) { + return $stDev; + } + $this->_calculatedValues['stdErrorOfMean'] = $stDev / sqrt($count); + } + return $this->_calculatedValues['stdErrorOfMean']; + }/*}}}*/ + + /** + * Calculates the value frequency table of a data set. + * Handles cummulative data sets correctly + * + * @access public + * @return mixed an associative array of value=>frequency items on success, a PEAR_Error object otherwise + * @see min() + * @see max() + * @see calc() + */ + function frequency() {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (!array_key_exists('frequency', $this->_calculatedValues)) { + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $freq = $this->_data; + } else { + $freq = array(); + foreach ($this->_data as $val) { + $freq["$val"]++; + } + ksort($freq); + } + $this->_calculatedValues['frequency'] = $freq; + } + return $this->_calculatedValues['frequency']; + }/*}}}*/ + + /** + * The quartiles are defined as the values that divide a sorted + * data set into four equal-sized subsets, and correspond to the + * 25th, 50th, and 75th percentiles. + * + * @access public + * @return mixed an associative array of quartiles on success, a PEAR_Error otherwise + * @see percentile() + */ + function quartiles() {/*{{{*/ + if (!array_key_exists('quartiles', $this->_calculatedValues)) { + $q1 = $this->percentile(25); + if (PEAR::isError($q1)) { + return $q1; + } + $q2 = $this->percentile(50); + if (PEAR::isError($q2)) { + return $q2; + } + $q3 = $this->percentile(75); + if (PEAR::isError($q3)) { + return $q3; + } + $this->_calculatedValues['quartiles'] = array ( + '25' => $q1, + '50' => $q2, + '75' => $q3 + ); + } + return $this->_calculatedValues['quartiles']; + }/*}}}*/ + + /** + * The interquartile mean is defined as the mean of the values left + * after discarding the lower 25% and top 25% ranked values, i.e.: + * + * interquart mean = mean(<P(25),P(75)>) + * + * where: P = percentile + * + * @todo need to double check the equation + * @access public + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see quartiles() + */ + function interquartileMean() {/*{{{*/ + if (!array_key_exists('interquartileMean', $this->_calculatedValues)) { + $quart = $this->quartiles(); + if (PEAR::isError($quart)) { + return $quart; + } + $q3 = $quart['75']; + $q1 = $quart['25']; + $sum = 0; + $n = 0; + foreach ($this->getData(true) as $val) { + if ($val >= $q1 && $val <= $q3) { + $sum += $val; + ++$n; + } + } + if ($n == 0) { + return PEAR::raiseError('error calculating interquartile mean, '. + 'empty interquartile range of values.'); + } + $this->_calculatedValues['interquartileMean'] = $sum / $n; + } + return $this->_calculatedValues['interquartileMean']; + }/*}}}*/ + + /** + * The interquartile range is the distance between the 75th and 25th + * percentiles. Basically the range of the middle 50% of the data set, + * and thus is not affected by outliers or extreme values. + * + * interquart range = P(75) - P(25) + * + * where: P = percentile + * + * @access public + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see quartiles() + */ + function interquartileRange() {/*{{{*/ + if (!array_key_exists('interquartileRange', $this->_calculatedValues)) { + $quart = $this->quartiles(); + if (PEAR::isError($quart)) { + return $quart; + } + $q3 = $quart['75']; + $q1 = $quart['25']; + $this->_calculatedValues['interquartileRange'] = $q3 - $q1; + } + return $this->_calculatedValues['interquartileRange']; + }/*}}}*/ + + /** + * The quartile deviation is half of the interquartile range value + * + * quart dev = (P(75) - P(25)) / 2 + * + * where: P = percentile + * + * @access public + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see quartiles() + * @see interquartileRange() + */ + function quartileDeviation() {/*{{{*/ + if (!array_key_exists('quartileDeviation', $this->_calculatedValues)) { + $iqr = $this->interquartileRange(); + if (PEAR::isError($iqr)) { + return $iqr; + } + $this->_calculatedValues['quartileDeviation'] = $iqr / 2; + } + return $this->_calculatedValues['quartileDeviation']; + }/*}}}*/ + + /** + * The quartile variation coefficient is defines as follows: + * + * quart var coeff = 100 * (P(75) - P(25)) / (P(75) + P(25)) + * + * where: P = percentile + * + * @todo need to double check the equation + * @access public + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see quartiles() + */ + function quartileVariationCoefficient() {/*{{{*/ + if (!array_key_exists('quartileVariationCoefficient', $this->_calculatedValues)) { + $quart = $this->quartiles(); + if (PEAR::isError($quart)) { + return $quart; + } + $q3 = $quart['75']; + $q1 = $quart['25']; + $d = $q3 - $q1; + $s = $q3 + $q1; + $this->_calculatedValues['quartileVariationCoefficient'] = 100 * $d / $s; + } + return $this->_calculatedValues['quartileVariationCoefficient']; + }/*}}}*/ + + /** + * The quartile skewness coefficient (also known as Bowley Skewness), + * is defined as follows: + * + * quart skewness coeff = (P(25) - 2*P(50) + P(75)) / (P(75) - P(25)) + * + * where: P = percentile + * + * @todo need to double check the equation + * @access public + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see quartiles() + */ + function quartileSkewnessCoefficient() {/*{{{*/ + if (!array_key_exists('quartileSkewnessCoefficient', $this->_calculatedValues)) { + $quart = $this->quartiles(); + if (PEAR::isError($quart)) { + return $quart; + } + $q3 = $quart['75']; + $q2 = $quart['50']; + $q1 = $quart['25']; + $d = $q3 - 2*$q2 + $q1; + $s = $q3 - $q1; + $this->_calculatedValues['quartileSkewnessCoefficient'] = $d / $s; + } + return $this->_calculatedValues['quartileSkewnessCoefficient']; + }/*}}}*/ + + /** + * The pth percentile is the value such that p% of the a sorted data set + * is smaller than it, and (100 - p)% of the data is larger. + * + * A quick algorithm to pick the appropriate value from a sorted data + * set is as follows: + * + * - Count the number of values: n + * - Calculate the position of the value in the data list: i = p * (n + 1) + * - if i is an integer, return the data at that position + * - if i < 1, return the minimum of the data set + * - if i > n, return the maximum of the data set + * - otherwise, average the entries at adjacent positions to i + * + * The median is the 50th percentile value. + * + * @todo need to double check generality of the algorithm + * + * @access public + * @param numeric $p the percentile to estimate, e.g. 25 for 25th percentile + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see quartiles() + * @see median() + */ + function percentile($p) {/*{{{*/ + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + $data =& $this->_dataExpanded; + } else { + $data =& $this->_data; + } + $obsidx = $p * ($count + 1) / 100; + if (intval($obsidx) == $obsidx) { + return $data[($obsidx - 1)]; + } elseif ($obsidx < 1) { + return $data[0]; + } elseif ($obsidx > $count) { + return $data[($count - 1)]; + } else { + $left = floor($obsidx - 1); + $right = ceil($obsidx - 1); + return ($data[$left] + $data[$right]) / 2; + } + }/*}}}*/ + + // private methods + + /** + * Utility function to calculate: SUM { (xi - mean)^n } + * + * @access private + * @param numeric $power the exponent + * @param optional double $mean the data set mean value + * @return mixed the sum on success, a PEAR_Error object otherwise + * + * @see stDev() + * @see variaceWithMean(); + * @see skewness(); + * @see kurtosis(); + */ + function __sumdiff($power, $mean=null) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (is_null($mean)) { + $mean = $this->mean(); + if (PEAR::isError($mean)) { + return $mean; + } + } + $sdiff = 0; + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach ($this->_data as $val=>$freq) { + $sdiff += $freq * pow((double)($val - $mean), (double)$power); + } + } else { + foreach ($this->_data as $val) + $sdiff += pow((double)($val - $mean), (double)$power); + } + return $sdiff; + }/*}}}*/ + + /** + * Utility function to calculate the variance with or without + * a fixed mean + * + * @access private + * @param $mean the fixed mean to use, null as default + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see variance() + * @see varianceWithMean() + */ + function __calcVariance($mean = null) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + $sumdiff2 = $this->__sumdiff(2, $mean); + if (PEAR::isError($sumdiff2)) { + return $sumdiff2; + } + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + if ($count == 1) { + return PEAR::raiseError('cannot calculate variance of a singe data point'); + } + return ($sumdiff2 / ($count - 1)); + }/*}}}*/ + + /** + * Utility function to calculate the absolute deviation with or without + * a fixed mean + * + * @access private + * @param $mean the fixed mean to use, null as default + * @return mixed a numeric value on success, a PEAR_Error otherwise + * @see absDev() + * @see absDevWithMean() + */ + function __calcAbsoluteDeviation($mean = null) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + $count = $this->count(); + if (PEAR::isError($count)) { + return $count; + } + $sumabsdev = $this->__sumabsdev($mean); + if (PEAR::isError($sumabsdev)) { + return $sumabsdev; + } + return $sumabsdev / $count; + }/*}}}*/ + + /** + * Utility function to calculate: SUM { | xi - mean | } + * + * @access private + * @param optional double $mean the mean value for the set or population + * @return mixed the sum on success, a PEAR_Error object otherwise + * + * @see absDev() + * @see absDevWithMean() + */ + function __sumabsdev($mean=null) {/*{{{*/ + if ($this->_data == null) { + return PEAR::raiseError('data has not been set'); + } + if (is_null($mean)) { + $mean = $this->mean(); + } + $sdev = 0; + if ($this->_dataOption == STATS_DATA_CUMMULATIVE) { + foreach ($this->_data as $val=>$freq) { + $sdev += $freq * abs($val - $mean); + } + } else { + foreach ($this->_data as $val) { + $sdev += abs($val - $mean); + } + } + return $sdev; + }/*}}}*/ + + /** + * Utility function to format a PEAR_Error to be used by calc(), + * calcBasic() and calcFull() + * + * @access private + * @param mixed $v value to be formatted + * @param boolean $returnErrorObject whether the raw PEAR_Error (when true, default), + * or only the error message will be returned (when false) + * @return mixed if the value is a PEAR_Error object, and $useErrorObject + * is false, then a string with the error message will be returned, + * otherwise the value will not be modified and returned as passed. + */ + function __format($v, $useErrorObject=true) {/*{{{*/ + if (PEAR::isError($v) && $useErrorObject == false) { + return $v->getMessage(); + } else { + return $v; + } + }/*}}}*/ + + /** + * Utility function to validate the data and modify it + * according to the current null handling option + * + * @access private + * @return mixed true on success, a PEAR_Error object otherwise + * + * @see setData() + */ + function _validate() {/*{{{*/ + $flag = ($this->_dataOption == STATS_DATA_CUMMULATIVE); + foreach ($this->_data as $key=>$value) { + $d = ($flag) ? $key : $value; + $v = ($flag) ? $value : $key; + if (!is_numeric($d)) { + switch ($this->_nullOption) { + case STATS_IGNORE_NULL : + unset($this->_data["$key"]); + break; + case STATS_USE_NULL_AS_ZERO: + if ($flag) { + unset($this->_data["$key"]); + $this->_data[0] += $v; + } else { + $this->_data[$key] = 0; + } + break; + case STATS_REJECT_NULL : + default: + return PEAR::raiseError('data rejected, contains NULL values'); + break; + } + } + } + if ($flag) { + ksort($this->_data); + $this->_dataExpanded = array(); + foreach ($this->_data as $val=>$freq) { + $this->_dataExpanded = array_pad($this->_dataExpanded, count($this->_dataExpanded) + $freq, $val); + } + sort($this->_dataExpanded); + } else { + sort($this->_data); + } + return true; + }/*}}}*/ + +}/*}}}*/ + +// vim: ts=4:sw=4:et: +// vim6: fdl=1: fdm=marker: + +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/benchmark.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/benchmark.php new file mode 100644 index 000000000..1b963b46b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/benchmark.php @@ -0,0 +1,263 @@ +<?php + +error_reporting(E_ALL); + +/** + * @package JAMA + */ + +require_once '../Matrix.php'; +require_once 'Stats.php'; + + +/** + * Example of use of Matrix Class, featuring magic squares. + */ +class Benchmark { + public $stat; + + + /** + * Simple function to replicate PHP 5 behaviour + */ + function microtime_float() { + list($usec, $sec) = explode(" ", microtime()); + + return ((float)$usec + (float)$sec); + } // function microtime_float() + + + function displayStats($times = null) { + $this->stat->setData($times); + $stats = $this->stat->calcFull(); + + echo '<table style="margin-left:32px;">'; + echo '<tr><td style="text-align:right;"><b>n:</b><td style="text-align:right;">' . $stats['count'] . ' </td></tr>'; + echo '<tr><td style="text-align:right;"><b>Mean:</b><td style="text-align:right;">' . $stats['mean'] . ' </td></tr>'; + echo '<tr><td style="text-align:right;"><b>Min.:</b><td style="text-align:right;">' . $stats['min'] . ' </td></tr>'; + echo '<tr><td style="text-align:right;"><b>Max.:</b><td style="text-align:right;">' . $stats['max'] . ' </td></tr>'; + echo '<tr><td style="text-align:right;"><b>&sigma;:</b><td style="text-align:right;">' . $stats['stdev'] . ' </td></tr>'; + echo '<tr><td style="text-align:right;"><b>Variance:</b><td style="text-align:right;">' . $stats['variance'] . ' </td></tr>'; + echo '<tr><td style="text-align:right;"><b>Range:</b><td style="text-align:right;">' . $stats['range'] . ' </td></tr>'; + echo '</table>'; + + return $stats; + } // function displayStats() + + + function runEig($n = 4, $t = 100) { + $times = array(); + + for ($i = 0; $i < $t; ++$i) { + $M = Matrix::random($n, $n); + $start_time = $this->microtime_float(); + $E = new EigenvalueDecomposition($M); + $stop_time = $this->microtime_float(); + $times[] = $stop_time - $start_time; + } + + return $times; + } // function runEig() + + + function runLU($n = 4, $t = 100) { + $times = array(); + + for ($i = 0; $i < $t; ++$i) { + $M = Matrix::random($n, $n); + $start_time = $this->microtime_float(); + $E = new LUDecomposition($M); + $stop_time = $this->microtime_float(); + $times[] = $stop_time - $start_time; + } + + return $times; + } // function runLU() + + + function runQR($n = 4, $t = 100) { + $times = array(); + + for ($i = 0; $i < $t; ++$i) { + $M = Matrix::random($n, $n); + $start_time = $this->microtime_float(); + $E = new QRDecomposition($M); + $stop_time = $this->microtime_float(); + $times[] = $stop_time - $start_time; + } + + return $times; + } // function runQR() + + + function runCholesky($n = 4, $t = 100) { + $times = array(); + + for ($i = 0; $i < $t; ++$i) { + $M = Matrix::random($n, $n); + $start_time = $this->microtime_float(); + $E = new CholeskyDecomposition($M); + $stop_time = $this->microtime_float(); + $times[] = $stop_time - $start_time; + } + + return $times; + } // function runCholesky() + + + function runSVD($n = 4, $t = 100) { + $times = array(); + + for ($i = 0; $i < $t; ++$i) { + $M = Matrix::random($n, $n); + $start_time = $this->microtime_float(); + $E = new SingularValueDecomposition($M); + $stop_time = $this->microtime_float(); + $times[] = $stop_time - $start_time; + } + + return $times; + } // function runSVD() + + + function run() { + $n = 8; + $t = 16; + $sum = 0; + echo "<b>Cholesky decomposition: $t random {$n}x{$n} matrices</b><br />"; + $r = $this->displayStats($this->runCholesky($n, $t)); + $sum += $r['mean'] * $n; + + echo '<hr />'; + + echo "<b>Eigenvalue decomposition: $t random {$n}x{$n} matrices</b><br />"; + $r = $this->displayStats($this->runEig($n, $t)); + $sum += $r['mean'] * $n; + + echo '<hr />'; + + echo "<b>LU decomposition: $t random {$n}x{$n} matrices</b><br />"; + $r = $this->displayStats($this->runLU($n, $t)); + $sum += $r['mean'] * $n; + + echo '<hr />'; + + echo "<b>QR decomposition: $t random {$n}x{$n} matrices</b><br />"; + $r = $this->displayStats($this->runQR($n, $t)); + $sum += $r['mean'] * $n; + + echo '<hr />'; + + echo "<b>Singular Value decomposition: $t random {$n}x{$n} matrices</b><br />"; + $r = $this->displayStats($this->runSVD($n, $t)); + $sum += $r['mean'] * $n; + + return $sum; + } // function run() + + + public function __construct() { + $this->stat = new Base(); + } // function Benchmark() + +} // class Benchmark (end MagicSquareExample) + + +$benchmark = new Benchmark(); + +switch($_REQUEST['decomposition']) { + case 'cholesky': + $m = array(); + for ($i = 2; $i <= 8; $i *= 2) { + $t = 32 / $i; + echo "<b>Cholesky decomposition: $t random {$i}x{$i} matrices</b><br />"; + $s = $benchmark->displayStats($benchmark->runCholesky($i, $t)); + $m[$i] = $s['mean']; + echo "<br />"; + } + echo '<pre>'; + foreach($m as $x => $y) { + echo "$x\t" . 1000*$y . "\n"; + } + echo '</pre>'; + break; + case 'eigenvalue': + $m = array(); + for ($i = 2; $i <= 8; $i *= 2) { + $t = 32 / $i; + echo "<b>Eigenvalue decomposition: $t random {$i}x{$i} matrices</b><br />"; + $s = $benchmark->displayStats($benchmark->runEig($i, $t)); + $m[$i] = $s['mean']; + echo "<br />"; + } + echo '<pre>'; + foreach($m as $x => $y) { + echo "$x\t" . 1000*$y . "\n"; + } + echo '</pre>'; + break; + case 'lu': + $m = array(); + for ($i = 2; $i <= 8; $i *= 2) { + $t = 32 / $i; + echo "<b>LU decomposition: $t random {$i}x{$i} matrices</b><br />"; + $s = $benchmark->displayStats($benchmark->runLU($i, $t)); + $m[$i] = $s['mean']; + echo "<br />"; + } + echo '<pre>'; + foreach($m as $x => $y) { + echo "$x\t" . 1000*$y . "\n"; + } + echo '</pre>'; + break; + case 'qr': + $m = array(); + for ($i = 2; $i <= 8; $i *= 2) { + $t = 32 / $i; + echo "<b>QR decomposition: $t random {$i}x{$i} matrices</b><br />"; + $s = $benchmark->displayStats($benchmark->runQR($i, $t)); + $m[$i] = $s['mean']; + echo "<br />"; + } + echo '<pre>'; + foreach($m as $x => $y) { + echo "$x\t" . 1000*$y . "\n"; + } + echo '</pre>'; + break; + case 'svd': + $m = array(); + for($i = 2; $i <= 8; $i *= 2) { + $t = 32 / $i; + echo "<b>Singular value decomposition: $t random {$i}x{$i} matrices</b><br />"; + $s = $benchmark->displayStats($benchmark->runSVD($i, $t)); + $m[$i] = $s['mean']; + echo "<br />"; + } + echo '<pre>'; + foreach($m as $x => $y) { + echo "$x\t" . 1000*$y . "\n"; + } + echo '</pre>'; + break; + case 'all': + $s = $benchmark->run(); + print("<br /><b>Total<b>: {$s}s<br />"); + break; + default: + ?> + <ul> + <li><a href="benchmark.php?decomposition=all">Complete Benchmark</a> + <ul> + <li><a href="benchmark.php?decomposition=cholesky">Cholesky</a></li> + <li><a href="benchmark.php?decomposition=eigenvalue">Eigenvalue</a></li> + <li><a href="benchmark.php?decomposition=lu">LU</a></li> + <li><a href="benchmark.php?decomposition=qr">QR</a></li> + <li><a href="benchmark.php?decomposition=svd">Singular Value</a></li> + </ul> + </li> + </ul> + <?php + break; +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/polyfit.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/polyfit.php new file mode 100644 index 000000000..bc02fd62e --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/polyfit.php @@ -0,0 +1,73 @@ +<?php +require_once "../Matrix.php"; +/* +* @package JAMA +* @author Michael Bommarito +* @author Paul Meagher +* @version 0.1 +* +* Function to fit an order n polynomial function through +* a series of x-y data points using least squares. +* +* @param $X array x values +* @param $Y array y values +* @param $n int order of polynomial to be used for fitting +* @returns array $coeffs of polynomial coefficients +* Pre-Conditions: the system is not underdetermined: sizeof($X) > $n+1 +*/ +function polyfit($X, $Y, $n) { + for ($i = 0; $i < sizeof($X); ++$i) + for ($j = 0; $j <= $n; ++$j) + $A[$i][$j] = pow($X[$i], $j); + for ($i=0; $i < sizeof($Y); ++$i) + $B[$i] = array($Y[$i]); + $matrixA = new Matrix($A); + $matrixB = new Matrix($B); + $C = $matrixA->solve($matrixB); + return $C->getMatrix(0, $n, 0, 1); +} + +function printpoly( $C = null ) { + for($i = $C->m - 1; $i >= 0; --$i) { + $r = $C->get($i, 0); + if ( abs($r) <= pow(10, -9) ) + $r = 0; + if ($i == $C->m - 1) + echo $r . "x<sup>$i</sup>"; + else if ($i < $C->m - 1) + echo " + " . $r . "x<sup>$i</sup>"; + else if ($i == 0) + echo " + " . $r; + } +} + +$X = array(0,1,2,3,4,5); +$Y = array(4,3,12,67,228, 579); +$points = new Matrix(array($X, $Y)); +$points->toHTML(); +printpoly(polyfit($X, $Y, 4)); + +echo '<hr />'; + +$X = array(0,1,2,3,4,5); +$Y = array(1,2,5,10,17, 26); +$points = new Matrix(array($X, $Y)); +$points->toHTML(); +printpoly(polyfit($X, $Y, 2)); + +echo '<hr />'; + +$X = array(0,1,2,3,4,5,6); +$Y = array(-90,-104,-178,-252,-26, 1160, 4446); +$points = new Matrix(array($X, $Y)); +$points->toHTML(); +printpoly(polyfit($X, $Y, 5)); + +echo '<hr />'; + +$X = array(0,1,2,3,4); +$Y = array(mt_rand(0, 10), mt_rand(40, 80), mt_rand(240, 400), mt_rand(1800, 2215), mt_rand(8000, 9000)); +$points = new Matrix(array($X, $Y)); +$points->toHTML(); +printpoly(polyfit($X, $Y, 3)); +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/tile.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/tile.php new file mode 100644 index 000000000..7a47ea57b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/examples/tile.php @@ -0,0 +1,78 @@ +<?php + +include "../Matrix.php"; + +/** +* Tiling of matrix X in [rowWise by colWise] dimension. Tiling +* creates a larger matrix than the original data X. Example, if +* X is to be tiled in a [3 x 4] manner, then: +* +* / \ +* | X X X X | +* C = | X X X X | +* | X X X X | +* \ / +* +* @param X Matrix +* @param rowWise int +* @param colWise int +* @return Matrix +*/ + +function tile(&$X, $rowWise, $colWise){ + + $xArray = $X->getArray(); + print_r($xArray); + + $countRow = 0; + $countColumn = 0; + + $m = $X->getRowDimension(); + $n = $X->getColumnDimension(); + + if( $rowWise<1 || $colWise<1 ){ + die("tile : Array index is out-of-bound."); + } + + $newRowDim = $m*$rowWise; + $newColDim = $n*$colWise; + + $result = array(); + + for($i=0 ; $i<$newRowDim; ++$i) { + + $holder = array(); + + for($j=0 ; $j<$newColDim ; ++$j) { + + $holder[$j] = $xArray[$countRow][$countColumn++]; + + // reset the column-index to zero to avoid reference to out-of-bound index in xArray[][] + + if($countColumn == $n) { $countColumn = 0; } + + } // end for + + ++$countRow; + + // reset the row-index to zero to avoid reference to out-of-bound index in xArray[][] + + if($countRow == $m) { $countRow = 0; } + + $result[$i] = $holder; + + } // end for + + return new Matrix($result); + +} + + +$X =array(1,2,3,4,5,6,7,8,9); +$nRow = 3; +$nCol = 3; +$tiled_matrix = tile(new Matrix($X), $nRow, $nCol); +echo "<pre>"; +print_r($tiled_matrix); +echo "</pre>"; +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/tests/TestMatrix.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/tests/TestMatrix.php new file mode 100644 index 000000000..5290ceb5a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/tests/TestMatrix.php @@ -0,0 +1,415 @@ +<?php + +require_once "../Matrix.php"; + +class TestMatrix { + + function TestMatrix() { + + // define test variables + + $errorCount = 0; + $warningCount = 0; + $columnwise = array(1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.); + $rowwise = array(1.,4.,7.,10.,2.,5.,8.,11.,3.,6.,9.,12.); + $avals = array(array(1.,4.,7.,10.),array(2.,5.,8.,11.),array(3.,6.,9.,12.)); + $rankdef = $avals; + $tvals = array(array(1.,2.,3.),array(4.,5.,6.),array(7.,8.,9.),array(10.,11.,12.)); + $subavals = array(array(5.,8.,11.),array(6.,9.,12.)); + $rvals = array(array(1.,4.,7.),array(2.,5.,8.,11.),array(3.,6.,9.,12.)); + $pvals = array(array(1.,1.,1.),array(1.,2.,3.),array(1.,3.,6.)); + $ivals = array(array(1.,0.,0.,0.),array(0.,1.,0.,0.),array(0.,0.,1.,0.)); + $evals = array(array(0.,1.,0.,0.),array(1.,0.,2.e-7,0.),array(0.,-2.e-7,0.,1.),array(0.,0.,1.,0.)); + $square = array(array(166.,188.,210.),array(188.,214.,240.),array(210.,240.,270.)); + $sqSolution = array(array(13.),array(15.)); + $condmat = array(array(1.,3.),array(7.,9.)); + $rows = 3; + $cols = 4; + $invalidID = 5; /* should trigger bad shape for construction with val */ + $raggedr = 0; /* (raggedr,raggedc) should be out of bounds in ragged array */ + $raggedc = 4; + $validID = 3; /* leading dimension of intended test Matrices */ + $nonconformld = 4; /* leading dimension which is valid, but nonconforming */ + $ib = 1; /* index ranges for sub Matrix */ + $ie = 2; + $jb = 1; + $je = 3; + $rowindexset = array(1,2); + $badrowindexset = array(1,3); + $columnindexset = array(1,2,3); + $badcolumnindexset = array(1,2,4); + $columnsummax = 33.; + $rowsummax = 30.; + $sumofdiagonals = 15; + $sumofsquares = 650; + + /** + * Test matrix methods + */ + + /** + * Constructors and constructor-like methods: + * + * Matrix(double[], int) + * Matrix(double[][]) + * Matrix(int, int) + * Matrix(int, int, double) + * Matrix(int, int, double[][]) + * constructWithCopy(double[][]) + * random(int,int) + * identity(int) + */ + echo "<p>Testing constructors and constructor-like methods...</p>"; + + $A = new Matrix($columnwise, 3); + if($A instanceof Matrix) { + $this->try_success("Column-packed constructor..."); + } else + $errorCount = $this->try_failure($errorCount, "Column-packed constructor...", "Unable to construct Matrix"); + + $T = new Matrix($tvals); + if($T instanceof Matrix) + $this->try_success("2D array constructor..."); + else + $errorCount = $this->try_failure($errorCount, "2D array constructor...", "Unable to construct Matrix"); + + $A = new Matrix($columnwise, $validID); + $B = new Matrix($avals); + $tmp = $B->get(0,0); + $avals[0][0] = 0.0; + $C = $B->minus($A); + $avals[0][0] = $tmp; + $B = Matrix::constructWithCopy($avals); + $tmp = $B->get(0,0); + $avals[0][0] = 0.0; + /** check that constructWithCopy behaves properly **/ + if ( ( $tmp - $B->get(0,0) ) != 0.0 ) + $errorCount = $this->try_failure($errorCount,"constructWithCopy... ","copy not effected... data visible outside"); + else + $this->try_success("constructWithCopy... ",""); + + $I = new Matrix($ivals); + if ( $this->checkMatrices($I,Matrix::identity(3,4)) ) + $this->try_success("identity... ",""); + else + $errorCount = $this->try_failure($errorCount,"identity... ","identity Matrix not successfully created"); + + /** + * Access Methods: + * + * getColumnDimension() + * getRowDimension() + * getArray() + * getArrayCopy() + * getColumnPackedCopy() + * getRowPackedCopy() + * get(int,int) + * getMatrix(int,int,int,int) + * getMatrix(int,int,int[]) + * getMatrix(int[],int,int) + * getMatrix(int[],int[]) + * set(int,int,double) + * setMatrix(int,int,int,int,Matrix) + * setMatrix(int,int,int[],Matrix) + * setMatrix(int[],int,int,Matrix) + * setMatrix(int[],int[],Matrix) + */ + print "<p>Testing access methods...</p>"; + + $B = new Matrix($avals); + if($B->getRowDimension() == $rows) + $this->try_success("getRowDimension..."); + else + $errorCount = $this->try_failure($errorCount, "getRowDimension..."); + + if($B->getColumnDimension() == $cols) + $this->try_success("getColumnDimension..."); + else + $errorCount = $this->try_failure($errorCount, "getColumnDimension..."); + + $barray = $B->getArray(); + if($this->checkArrays($barray, $avals)) + $this->try_success("getArray..."); + else + $errorCount = $this->try_failure($errorCount, "getArray..."); + + $bpacked = $B->getColumnPackedCopy(); + if($this->checkArrays($bpacked, $columnwise)) + $this->try_success("getColumnPackedCopy..."); + else + $errorCount = $this->try_failure($errorCount, "getColumnPackedCopy..."); + + $bpacked = $B->getRowPackedCopy(); + if($this->checkArrays($bpacked, $rowwise)) + $this->try_success("getRowPackedCopy..."); + else + $errorCount = $this->try_failure($errorCount, "getRowPackedCopy..."); + + /** + * Array-like methods: + * minus + * minusEquals + * plus + * plusEquals + * arrayLeftDivide + * arrayLeftDivideEquals + * arrayRightDivide + * arrayRightDivideEquals + * arrayTimes + * arrayTimesEquals + * uminus + */ + print "<p>Testing array-like methods...</p>"; + + /** + * I/O methods: + * read + * print + * serializable: + * writeObject + * readObject + */ + print "<p>Testing I/O methods...</p>"; + + /** + * Test linear algebra methods + */ + echo "<p>Testing linear algebra methods...<p>"; + + $A = new Matrix($columnwise, 3); + if( $this->checkMatrices($A->transpose(), $T) ) + $this->try_success("Transpose check..."); + else + $errorCount = $this->try_failure($errorCount, "Transpose check...", "Matrices are not equal"); + + if($this->checkScalars($A->norm1(), $columnsummax)) + $this->try_success("Maximum column sum..."); + else + $errorCount = $this->try_failure($errorCount, "Maximum column sum...", "Incorrect: " . $A->norm1() . " != " . $columnsummax); + + if($this->checkScalars($A->normInf(), $rowsummax)) + $this->try_success("Maximum row sum..."); + else + $errorCount = $this->try_failure($errorCount, "Maximum row sum...", "Incorrect: " . $A->normInf() . " != " . $rowsummax ); + + if($this->checkScalars($A->normF(), sqrt($sumofsquares))) + $this->try_success("Frobenius norm..."); + else + $errorCount = $this->try_failure($errorCount, "Frobenius norm...", "Incorrect:" . $A->normF() . " != " . sqrt($sumofsquares)); + + if($this->checkScalars($A->trace(), $sumofdiagonals)) + $this->try_success("Matrix trace..."); + else + $errorCount = $this->try_failure($errorCount, "Matrix trace...", "Incorrect: " . $A->trace() . " != " . $sumofdiagonals); + + $B = $A->getMatrix(0, $A->getRowDimension(), 0, $A->getRowDimension()); + if( $B->det() == 0 ) + $this->try_success("Matrix determinant..."); + else + $errorCount = $this->try_failure($errorCount, "Matrix determinant...", "Incorrect: " . $B->det() . " != " . 0); + + $A = new Matrix($columnwise,3); + $SQ = new Matrix($square); + if ($this->checkMatrices($SQ, $A->times($A->transpose()))) + $this->try_success("times(Matrix)..."); + else { + $errorCount = $this->try_failure($errorCount, "times(Matrix)...", "Unable to multiply matrices"); + $SQ->toHTML(); + $AT->toHTML(); + } + + $A = new Matrix($columnwise, 4); + + $QR = $A->qr(); + $R = $QR->getR(); + $Q = $QR->getQ(); + if($this->checkMatrices($A, $Q->times($R))) + $this->try_success("QRDecomposition...",""); + else + $errorCount = $this->try_failure($errorCount,"QRDecomposition...","incorrect qr decomposition calculation"); + + $A = new Matrix($columnwise, 4); + $SVD = $A->svd(); + $U = $SVD->getU(); + $S = $SVD->getS(); + $V = $SVD->getV(); + if ($this->checkMatrices($A, $U->times($S->times($V->transpose())))) + $this->try_success("SingularValueDecomposition...",""); + else + $errorCount = $this->try_failure($errorCount,"SingularValueDecomposition...","incorrect singular value decomposition calculation"); + + $n = $A->getColumnDimension(); + $A = $A->getMatrix(0,$n-1,0,$n-1); + $A->set(0,0,0.); + + $LU = $A->lu(); + $L = $LU->getL(); + if ( $this->checkMatrices($A->getMatrix($LU->getPivot(),0,$n-1), $L->times($LU->getU())) ) + $this->try_success("LUDecomposition...",""); + else + $errorCount = $this->try_failure($errorCount,"LUDecomposition...","incorrect LU decomposition calculation"); + + $X = $A->inverse(); + if ( $this->checkMatrices($A->times($X),Matrix::identity(3,3)) ) + $this->try_success("inverse()...",""); + else + $errorCount = $this->try_failure($errorCount, "inverse()...","incorrect inverse calculation"); + + $DEF = new Matrix($rankdef); + if($this->checkScalars($DEF->rank(), min($DEF->getRowDimension(), $DEF->getColumnDimension())-1)) + $this->try_success("Rank..."); + else + $this->try_failure("Rank...", "incorrect rank calculation"); + + $B = new Matrix($condmat); + $SVD = $B->svd(); + $singularvalues = $SVD->getSingularValues(); + if($this->checkScalars($B->cond(), $singularvalues[0]/$singularvalues[min($B->getRowDimension(), $B->getColumnDimension())-1])) + $this->try_success("Condition number..."); + else + $this->try_failure("Condition number...", "incorrect condition number calculation"); + + $SUB = new Matrix($subavals); + $O = new Matrix($SUB->getRowDimension(),1,1.0); + $SOL = new Matrix($sqSolution); + $SQ = $SUB->getMatrix(0,$SUB->getRowDimension()-1,0,$SUB->getRowDimension()-1); + if ( $this->checkMatrices($SQ->solve($SOL),$O) ) + $this->try_success("solve()...",""); + else + $errorCount = $this->try_failure($errorCount,"solve()...","incorrect lu solve calculation"); + + $A = new Matrix($pvals); + $Chol = $A->chol(); + $L = $Chol->getL(); + if ( $this->checkMatrices($A, $L->times($L->transpose())) ) + $this->try_success("CholeskyDecomposition...",""); + else + $errorCount = $this->try_failure($errorCount,"CholeskyDecomposition...","incorrect Cholesky decomposition calculation"); + + $X = $Chol->solve(Matrix::identity(3,3)); + if ( $this->checkMatrices($A->times($X), Matrix::identity(3,3)) ) + $this->try_success("CholeskyDecomposition solve()...",""); + else + $errorCount = $this->try_failure($errorCount,"CholeskyDecomposition solve()...","incorrect Choleskydecomposition solve calculation"); + + $Eig = $A->eig(); + $D = $Eig->getD(); + $V = $Eig->getV(); + if( $this->checkMatrices($A->times($V),$V->times($D)) ) + $this->try_success("EigenvalueDecomposition (symmetric)...",""); + else + $errorCount = $this->try_failure($errorCount,"EigenvalueDecomposition (symmetric)...","incorrect symmetric Eigenvalue decomposition calculation"); + + $A = new Matrix($evals); + $Eig = $A->eig(); + $D = $Eig->getD(); + $V = $Eig->getV(); + if ( $this->checkMatrices($A->times($V),$V->times($D)) ) + $this->try_success("EigenvalueDecomposition (nonsymmetric)...",""); + else + $errorCount = $this->try_failure($errorCount,"EigenvalueDecomposition (nonsymmetric)...","incorrect nonsymmetric Eigenvalue decomposition calculation"); + + print("<b>{$errorCount} total errors</b>."); + } + + /** + * Print appropriate messages for successful outcome try + * @param string $s + * @param string $e + */ + function try_success($s, $e = "") { + print "> ". $s ."success<br />"; + if ($e != "") + print "> Message: ". $e ."<br />"; + } + + /** + * Print appropriate messages for unsuccessful outcome try + * @param int $count + * @param string $s + * @param string $e + * @return int incremented counter + */ + function try_failure($count, $s, $e="") { + print "> ". $s ."*** failure ***<br />> Message: ". $e ."<br />"; + return ++$count; + } + + /** + * Print appropriate messages for unsuccessful outcome try + * @param int $count + * @param string $s + * @param string $e + * @return int incremented counter + */ + function try_warning($count, $s, $e="") { + print "> ". $s ."*** warning ***<br />> Message: ". $e ."<br />"; + return ++$count; + } + + /** + * Check magnitude of difference of "scalars". + * @param float $x + * @param float $y + */ + function checkScalars($x, $y) { + $eps = pow(2.0,-52.0); + if ($x == 0 & abs($y) < 10*$eps) return; + if ($y == 0 & abs($x) < 10*$eps) return; + if (abs($x-$y) > 10 * $eps * max(abs($x),abs($y))) + return false; + else + return true; + } + + /** + * Check norm of difference of "vectors". + * @param float $x[] + * @param float $y[] + */ + function checkVectors($x, $y) { + $nx = count($x); + $ny = count($y); + if ($nx == $ny) + for($i=0; $i < $nx; ++$i) + $this->checkScalars($x[$i],$y[$i]); + else + die("Attempt to compare vectors of different lengths"); + } + + /** + * Check norm of difference of "arrays". + * @param float $x[][] + * @param float $y[][] + */ + function checkArrays($x, $y) { + $A = new Matrix($x); + $B = new Matrix($y); + return $this->checkMatrices($A,$B); + } + + /** + * Check norm of difference of "matrices". + * @param matrix $X + * @param matrix $Y + */ + function checkMatrices($X = null, $Y = null) { + if( $X == null || $Y == null ) + return false; + + $eps = pow(2.0,-52.0); + if ($X->norm1() == 0. & $Y->norm1() < 10*$eps) return true; + if ($Y->norm1() == 0. & $X->norm1() < 10*$eps) return true; + + $A = $X->minus($Y); + + if ($A->norm1() > 1000 * $eps * max($X->norm1(),$Y->norm1())) + die("The norm of (X-Y) is too large: ".$A->norm1()); + else + return true; + } + +} + +$test = new TestMatrix; +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/utils/Error.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/utils/Error.php new file mode 100644 index 000000000..e73252b3d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/utils/Error.php @@ -0,0 +1,82 @@ +<?php +/** + * @package JAMA + * + * Error handling + * @author Michael Bommarito + * @version 01292005 + */ + +//Language constant +define('JAMALANG', 'EN'); + + +//All errors may be defined by the following format: +//define('ExceptionName', N); +//$error['lang'][ExceptionName] = 'Error message'; +$error = array(); + +/* +I've used Babelfish and a little poor knowledge of Romance/Germanic languages for the translations here. +Feel free to correct anything that looks amiss to you. +*/ + +define('PolymorphicArgumentException', -1); +$error['EN'][PolymorphicArgumentException] = "Invalid argument pattern for polymorphic function."; +$error['FR'][PolymorphicArgumentException] = "Modèle inadmissible d'argument pour la fonction polymorphe.". +$error['DE'][PolymorphicArgumentException] = "Unzulässiges Argumentmuster für polymorphe Funktion."; + +define('ArgumentTypeException', -2); +$error['EN'][ArgumentTypeException] = "Invalid argument type."; +$error['FR'][ArgumentTypeException] = "Type inadmissible d'argument."; +$error['DE'][ArgumentTypeException] = "Unzulässige Argumentart."; + +define('ArgumentBoundsException', -3); +$error['EN'][ArgumentBoundsException] = "Invalid argument range."; +$error['FR'][ArgumentBoundsException] = "Gamme inadmissible d'argument."; +$error['DE'][ArgumentBoundsException] = "Unzulässige Argumentstrecke."; + +define('MatrixDimensionException', -4); +$error['EN'][MatrixDimensionException] = "Matrix dimensions are not equal."; +$error['FR'][MatrixDimensionException] = "Les dimensions de Matrix ne sont pas égales."; +$error['DE'][MatrixDimensionException] = "Matrixmaße sind nicht gleich."; + +define('PrecisionLossException', -5); +$error['EN'][PrecisionLossException] = "Significant precision loss detected."; +$error['FR'][PrecisionLossException] = "Perte significative de précision détectée."; +$error['DE'][PrecisionLossException] = "Bedeutender Präzision Verlust ermittelte."; + +define('MatrixSPDException', -6); +$error['EN'][MatrixSPDException] = "Can only perform operation on symmetric positive definite matrix."; +$error['FR'][MatrixSPDException] = "Perte significative de précision détectée."; +$error['DE'][MatrixSPDException] = "Bedeutender Präzision Verlust ermittelte."; + +define('MatrixSingularException', -7); +$error['EN'][MatrixSingularException] = "Can only perform operation on singular matrix."; + +define('MatrixRankException', -8); +$error['EN'][MatrixRankException] = "Can only perform operation on full-rank matrix."; + +define('ArrayLengthException', -9); +$error['EN'][ArrayLengthException] = "Array length must be a multiple of m."; + +define('RowLengthException', -10); +$error['EN'][RowLengthException] = "All rows must have the same length."; + +/** + * Custom error handler + * @param int $num Error number + */ +function JAMAError($errorNumber = null) { + global $error; + + if (isset($errorNumber)) { + if (isset($error[JAMALANG][$errorNumber])) { + return $error[JAMALANG][$errorNumber]; + } else { + return $error['EN'][$errorNumber]; + } + } else { + return ("Invalid argument to JAMAError()"); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/utils/Maths.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/utils/Maths.php new file mode 100644 index 000000000..f5e2a3721 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/JAMA/utils/Maths.php @@ -0,0 +1,43 @@ +<?php +/** + * @package JAMA + * + * Pythagorean Theorem: + * + * a = 3 + * b = 4 + * r = sqrt(square(a) + square(b)) + * r = 5 + * + * r = sqrt(a^2 + b^2) without under/overflow. + */ +function hypo($a, $b) { + if (abs($a) > abs($b)) { + $r = $b / $a; + $r = abs($a) * sqrt(1 + $r * $r); + } elseif ($b != 0) { + $r = $a / $b; + $r = abs($b) * sqrt(1 + $r * $r); + } else { + $r = 0.0; + } + return $r; +} // function hypo() + + +/** + * Mike Bommarito's version. + * Compute n-dimensional hyotheneuse. + * +function hypot() { + $s = 0; + foreach (func_get_args() as $d) { + if (is_numeric($d)) { + $s += pow($d, 2); + } else { + throw new Exception(JAMAError(ArgumentTypeException)); + } + } + return sqrt($s); +} +*/ diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE.php new file mode 100644 index 000000000..a5c8dd1d0 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE.php @@ -0,0 +1,531 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: OLE.php,v 1.13 2007/03/07 14:38:25 schmidt Exp $ + + +/** +* Array for storing OLE instances that are accessed from +* OLE_ChainedBlockStream::stream_open(). +* @var array +*/ +$GLOBALS['_OLE_INSTANCES'] = array(); + +/** +* OLE package base class. +* +* @author Xavier Noguer <xnoguer@php.net> +* @author Christian Schmidt <schmidt@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE +{ + const OLE_PPS_TYPE_ROOT = 5; + const OLE_PPS_TYPE_DIR = 1; + const OLE_PPS_TYPE_FILE = 2; + const OLE_DATA_SIZE_SMALL = 0x1000; + const OLE_LONG_INT_SIZE = 4; + const OLE_PPS_SIZE = 0x80; + + /** + * The file handle for reading an OLE container + * @var resource + */ + public $_file_handle; + + /** + * Array of PPS's found on the OLE container + * @var array + */ + public $_list = array(); + + /** + * Root directory of OLE container + * @var OLE_PPS_Root + */ + public $root; + + /** + * Big Block Allocation Table + * @var array (blockId => nextBlockId) + */ + public $bbat; + + /** + * Short Block Allocation Table + * @var array (blockId => nextBlockId) + */ + public $sbat; + + /** + * Size of big blocks. This is usually 512. + * @var int number of octets per block. + */ + public $bigBlockSize; + + /** + * Size of small blocks. This is usually 64. + * @var int number of octets per block + */ + public $smallBlockSize; + + /** + * Reads an OLE container from the contents of the file given. + * + * @acces public + * @param string $file + * @return mixed true on success, PEAR_Error on failure + */ + public function read($file) + { + $fh = fopen($file, "r"); + if (!$fh) { + throw new Exception("Can't open file $file"); + } + $this->_file_handle = $fh; + + $signature = fread($fh, 8); + if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { + throw new Exception("File doesn't seem to be an OLE container."); + } + fseek($fh, 28); + if (fread($fh, 2) != "\xFE\xFF") { + // This shouldn't be a problem in practice + throw new Exception("Only Little-Endian encoding is supported."); + } + // Size of blocks and short blocks in bytes + $this->bigBlockSize = pow(2, self::_readInt2($fh)); + $this->smallBlockSize = pow(2, self::_readInt2($fh)); + + // Skip UID, revision number and version number + fseek($fh, 44); + // Number of blocks in Big Block Allocation Table + $bbatBlockCount = self::_readInt4($fh); + + // Root chain 1st block + $directoryFirstBlockId = self::_readInt4($fh); + + // Skip unused bytes + fseek($fh, 56); + // Streams shorter than this are stored using small blocks + $this->bigBlockThreshold = self::_readInt4($fh); + // Block id of first sector in Short Block Allocation Table + $sbatFirstBlockId = self::_readInt4($fh); + // Number of blocks in Short Block Allocation Table + $sbbatBlockCount = self::_readInt4($fh); + // Block id of first sector in Master Block Allocation Table + $mbatFirstBlockId = self::_readInt4($fh); + // Number of blocks in Master Block Allocation Table + $mbbatBlockCount = self::_readInt4($fh); + $this->bbat = array(); + + // Remaining 4 * 109 bytes of current block is beginning of Master + // Block Allocation Table + $mbatBlocks = array(); + for ($i = 0; $i < 109; ++$i) { + $mbatBlocks[] = self::_readInt4($fh); + } + + // Read rest of Master Block Allocation Table (if any is left) + $pos = $this->_getBlockOffset($mbatFirstBlockId); + for ($i = 0; $i < $mbbatBlockCount; ++$i) { + fseek($fh, $pos); + for ($j = 0; $j < $this->bigBlockSize / 4 - 1; ++$j) { + $mbatBlocks[] = self::_readInt4($fh); + } + // Last block id in each block points to next block + $pos = $this->_getBlockOffset(self::_readInt4($fh)); + } + + // Read Big Block Allocation Table according to chain specified by + // $mbatBlocks + for ($i = 0; $i < $bbatBlockCount; ++$i) { + $pos = $this->_getBlockOffset($mbatBlocks[$i]); + fseek($fh, $pos); + for ($j = 0 ; $j < $this->bigBlockSize / 4; ++$j) { + $this->bbat[] = self::_readInt4($fh); + } + } + + // Read short block allocation table (SBAT) + $this->sbat = array(); + $shortBlockCount = $sbbatBlockCount * $this->bigBlockSize / 4; + $sbatFh = $this->getStream($sbatFirstBlockId); + for ($blockId = 0; $blockId < $shortBlockCount; ++$blockId) { + $this->sbat[$blockId] = self::_readInt4($sbatFh); + } + fclose($sbatFh); + + $this->_readPpsWks($directoryFirstBlockId); + + return true; + } + + /** + * @param int block id + * @param int byte offset from beginning of file + * @access public + */ + public function _getBlockOffset($blockId) + { + return 512 + $blockId * $this->bigBlockSize; + } + + /** + * Returns a stream for use with fread() etc. External callers should + * use PHPExcel_Shared_OLE_PPS_File::getStream(). + * @param int|PPS block id or PPS + * @return resource read-only stream + */ + public function getStream($blockIdOrPps) + { + static $isRegistered = false; + if (!$isRegistered) { + stream_wrapper_register('ole-chainedblockstream', + 'PHPExcel_Shared_OLE_ChainedBlockStream'); + $isRegistered = true; + } + + // Store current instance in global array, so that it can be accessed + // in OLE_ChainedBlockStream::stream_open(). + // Object is removed from self::$instances in OLE_Stream::close(). + $GLOBALS['_OLE_INSTANCES'][] = $this; + $instanceId = end(array_keys($GLOBALS['_OLE_INSTANCES'])); + + $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId; + if ($blockIdOrPps instanceof PHPExcel_Shared_OLE_PPS) { + $path .= '&blockId=' . $blockIdOrPps->_StartBlock; + $path .= '&size=' . $blockIdOrPps->Size; + } else { + $path .= '&blockId=' . $blockIdOrPps; + } + return fopen($path, 'r'); + } + + /** + * Reads a signed char. + * @param resource file handle + * @return int + * @access public + */ + private static function _readInt1($fh) + { + list(, $tmp) = unpack("c", fread($fh, 1)); + return $tmp; + } + + /** + * Reads an unsigned short (2 octets). + * @param resource file handle + * @return int + * @access public + */ + private static function _readInt2($fh) + { + list(, $tmp) = unpack("v", fread($fh, 2)); + return $tmp; + } + + /** + * Reads an unsigned long (4 octets). + * @param resource file handle + * @return int + * @access public + */ + private static function _readInt4($fh) + { + list(, $tmp) = unpack("V", fread($fh, 4)); + return $tmp; + } + + /** + * Gets information about all PPS's on the OLE container from the PPS WK's + * creates an OLE_PPS object for each one. + * + * @access public + * @param integer the block id of the first block + * @return mixed true on success, PEAR_Error on failure + */ + public function _readPpsWks($blockId) + { + $fh = $this->getStream($blockId); + for ($pos = 0; ; $pos += 128) { + fseek($fh, $pos, SEEK_SET); + $nameUtf16 = fread($fh, 64); + $nameLength = self::_readInt2($fh); + $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2); + // Simple conversion from UTF-16LE to ISO-8859-1 + $name = str_replace("\x00", "", $nameUtf16); + $type = self::_readInt1($fh); + switch ($type) { + case self::OLE_PPS_TYPE_ROOT: + $pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array()); + $this->root = $pps; + break; + case self::OLE_PPS_TYPE_DIR: + $pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null, + null, null, null, null, array()); + break; + case self::OLE_PPS_TYPE_FILE: + $pps = new PHPExcel_Shared_OLE_PPS_File($name); + break; + default: + continue; + } + fseek($fh, 1, SEEK_CUR); + $pps->Type = $type; + $pps->Name = $name; + $pps->PrevPps = self::_readInt4($fh); + $pps->NextPps = self::_readInt4($fh); + $pps->DirPps = self::_readInt4($fh); + fseek($fh, 20, SEEK_CUR); + $pps->Time1st = self::OLE2LocalDate(fread($fh, 8)); + $pps->Time2nd = self::OLE2LocalDate(fread($fh, 8)); + $pps->_StartBlock = self::_readInt4($fh); + $pps->Size = self::_readInt4($fh); + $pps->No = count($this->_list); + $this->_list[] = $pps; + + // check if the PPS tree (starting from root) is complete + if (isset($this->root) && + $this->_ppsTreeComplete($this->root->No)) { + + break; + } + } + fclose($fh); + + // Initialize $pps->children on directories + foreach ($this->_list as $pps) { + if ($pps->Type == self::OLE_PPS_TYPE_DIR || $pps->Type == self::OLE_PPS_TYPE_ROOT) { + $nos = array($pps->DirPps); + $pps->children = array(); + while ($nos) { + $no = array_pop($nos); + if ($no != -1) { + $childPps = $this->_list[$no]; + $nos[] = $childPps->PrevPps; + $nos[] = $childPps->NextPps; + $pps->children[] = $childPps; + } + } + } + } + + return true; + } + + /** + * It checks whether the PPS tree is complete (all PPS's read) + * starting with the given PPS (not necessarily root) + * + * @access public + * @param integer $index The index of the PPS from which we are checking + * @return boolean Whether the PPS tree for the given PPS is complete + */ + public function _ppsTreeComplete($index) + { + return isset($this->_list[$index]) && + ($pps = $this->_list[$index]) && + ($pps->PrevPps == -1 || + $this->_ppsTreeComplete($pps->PrevPps)) && + ($pps->NextPps == -1 || + $this->_ppsTreeComplete($pps->NextPps)) && + ($pps->DirPps == -1 || + $this->_ppsTreeComplete($pps->DirPps)); + } + + /** + * Checks whether a PPS is a File PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS + * @return bool true if it's a File PPS, false otherwise + */ + public function isFile($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == self::OLE_PPS_TYPE_FILE); + } + return false; + } + + /** + * Checks whether a PPS is a Root PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS. + * @return bool true if it's a Root PPS, false otherwise + */ + public function isRoot($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == self::OLE_PPS_TYPE_ROOT); + } + return false; + } + + /** + * Gives the total number of PPS's found in the OLE container. + * + * @access public + * @return integer The total number of PPS's found in the OLE container + */ + public function ppsTotal() + { + return count($this->_list); + } + + /** + * Gets data from a PPS + * If there is no PPS for the index given, it will return an empty string. + * + * @access public + * @param integer $index The index for the PPS + * @param integer $position The position from which to start reading + * (relative to the PPS) + * @param integer $length The amount of bytes to read (at most) + * @return string The binary string containing the data requested + * @see OLE_PPS_File::getStream() + */ + public function getData($index, $position, $length) + { + // if position is not valid return empty string + if (!isset($this->_list[$index]) || ($position >= $this->_list[$index]->Size) || ($position < 0)) { + return ''; + } + $fh = $this->getStream($this->_list[$index]); + $data = stream_get_contents($fh, $length, $position); + fclose($fh); + return $data; + } + + /** + * Gets the data length from a PPS + * If there is no PPS for the index given, it will return 0. + * + * @access public + * @param integer $index The index for the PPS + * @return integer The amount of bytes in data the PPS has + */ + public function getDataLength($index) + { + if (isset($this->_list[$index])) { + return $this->_list[$index]->Size; + } + return 0; + } + + /** + * Utility function to transform ASCII text to Unicode + * + * @access public + * @static + * @param string $ascii The ASCII string to transform + * @return string The string in Unicode + */ + public static function Asc2Ucs($ascii) + { + $rawname = ''; + for ($i = 0; $i < strlen($ascii); ++$i) { + $rawname .= $ascii{$i} . "\x00"; + } + return $rawname; + } + + /** + * Utility function + * Returns a string for the OLE container with the date given + * + * @access public + * @static + * @param integer $date A timestamp + * @return string The string for the OLE container + */ + public static function LocalDate2OLE($date = null) + { + if (!isset($date)) { + return "\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2, 32); + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + // calculate seconds + $big_date = $days*24*3600 + gmmktime(date("H",$date),date("i",$date),date("s",$date), + date("m",$date),date("d",$date),date("Y",$date)); + // multiply just to make MS happy + $big_date *= 10000000; + + $high_part = floor($big_date / $factor); + // lower 4 bytes + $low_part = floor((($big_date / $factor) - $high_part) * $factor); + + // Make HEX string + $res = ''; + + for ($i = 0; $i < 4; ++$i) { + $hex = $low_part % 0x100; + $res .= pack('c', $hex); + $low_part /= 0x100; + } + for ($i = 0; $i < 4; ++$i) { + $hex = $high_part % 0x100; + $res .= pack('c', $hex); + $high_part /= 0x100; + } + return $res; + } + + /** + * Returns a timestamp from an OLE container's date + * + * @access public + * @static + * @param integer $string A binary string with the encoded date + * @return string The timestamp corresponding to the string + */ + public static function OLE2LocalDate($string) + { + if (strlen($string) != 8) { + return new PEAR_Error("Expecting 8 byte string"); + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2,32); + list(, $high_part) = unpack('V', substr($string, 4, 4)); + list(, $low_part) = unpack('V', substr($string, 0, 4)); + + $big_date = ($high_part * $factor) + $low_part; + // translate to seconds + $big_date /= 10000000; + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + + // translate to seconds from beggining of UNIX era + $big_date -= $days * 24 * 3600; + return floor($big_date); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/ChainedBlockStream.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/ChainedBlockStream.php new file mode 100644 index 000000000..4e233ad04 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/ChainedBlockStream.php @@ -0,0 +1,229 @@ +<?php +/** + * PHPExcel + * + * Copyright (C) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_OLE + * @copyright Copyright (c) 2006 - 2007 Christian Schmidt + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +/** + * PHPExcel_Shared_OLE_ChainedBlockStream + * + * Stream wrapper for reading data stored in an OLE file. Implements methods + * for PHP's stream_wrapper_register(). For creating streams using this + * wrapper, use PHPExcel_Shared_OLE_PPS_File::getStream(). + * + * @category PHPExcel + * @package PHPExcel_Shared_OLE + */ +class PHPExcel_Shared_OLE_ChainedBlockStream +{ + /** + * The OLE container of the file that is being read. + * @var OLE + */ + public $ole; + + /** + * Parameters specified by fopen(). + * @var array + */ + public $params; + + /** + * The binary data of the file. + * @var string + */ + public $data; + + /** + * The file pointer. + * @var int byte offset + */ + public $pos; + + /** + * Implements support for fopen(). + * For creating streams using this wrapper, use OLE_PPS_File::getStream(). + * + * @param string $path resource name including scheme, e.g. + * ole-chainedblockstream://oleInstanceId=1 + * @param string $mode only "r" is supported + * @param int $options mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH + * @param string &$openedPath absolute path of the opened stream (out parameter) + * @return bool true on success + */ + public function stream_open($path, $mode, $options, &$openedPath) + { + if ($mode != 'r') { + if ($options & STREAM_REPORT_ERRORS) { + trigger_error('Only reading is supported', E_USER_WARNING); + } + return false; + } + + // 25 is length of "ole-chainedblockstream://" + parse_str(substr($path, 25), $this->params); + if (!isset($this->params['oleInstanceId'], + $this->params['blockId'], + $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) { + + if ($options & STREAM_REPORT_ERRORS) { + trigger_error('OLE stream not found', E_USER_WARNING); + } + return false; + } + $this->ole = $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']]; + + $blockId = $this->params['blockId']; + $this->data = ''; + if (isset($this->params['size']) && + $this->params['size'] < $this->ole->bigBlockThreshold && + $blockId != $this->ole->root->_StartBlock) { + + // Block id refers to small blocks + $rootPos = $this->ole->_getBlockOffset($this->ole->root->_StartBlock); + while ($blockId != -2) { + $pos = $rootPos + $blockId * $this->ole->bigBlockSize; + $blockId = $this->ole->sbat[$blockId]; + fseek($this->ole->_file_handle, $pos); + $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + } + } else { + // Block id refers to big blocks + while ($blockId != -2) { + $pos = $this->ole->_getBlockOffset($blockId); + fseek($this->ole->_file_handle, $pos); + $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + $blockId = $this->ole->bbat[$blockId]; + } + } + if (isset($this->params['size'])) { + $this->data = substr($this->data, 0, $this->params['size']); + } + + if ($options & STREAM_USE_PATH) { + $openedPath = $path; + } + + return true; + } + + /** + * Implements support for fclose(). + * + */ + public function stream_close() + { + $this->ole = null; + unset($GLOBALS['_OLE_INSTANCES']); + } + + /** + * Implements support for fread(), fgets() etc. + * + * @param int $count maximum number of bytes to read + * @return string + */ + public function stream_read($count) + { + if ($this->stream_eof()) { + return false; + } + $s = substr($this->data, $this->pos, $count); + $this->pos += $count; + return $s; + } + + /** + * Implements support for feof(). + * + * @return bool TRUE if the file pointer is at EOF; otherwise FALSE + */ + public function stream_eof() + { + $eof = $this->pos >= strlen($this->data); + // Workaround for bug in PHP 5.0.x: http://bugs.php.net/27508 + if (version_compare(PHP_VERSION, '5.0', '>=') && + version_compare(PHP_VERSION, '5.1', '<')) { + + $eof = !$eof; + } + return $eof; + } + + /** + * Returns the position of the file pointer, i.e. its offset into the file + * stream. Implements support for ftell(). + * + * @return int + */ + public function stream_tell() + { + return $this->pos; + } + + /** + * Implements support for fseek(). + * + * @param int $offset byte offset + * @param int $whence SEEK_SET, SEEK_CUR or SEEK_END + * @return bool + */ + public function stream_seek($offset, $whence) + { + if ($whence == SEEK_SET && $offset >= 0) { + $this->pos = $offset; + } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) { + $this->pos += $offset; + } elseif ($whence == SEEK_END && -$offset <= sizeof($this->data)) { + $this->pos = strlen($this->data) + $offset; + } else { + return false; + } + return true; + } + + /** + * Implements support for fstat(). Currently the only supported field is + * "size". + * @return array + */ + public function stream_stat() + { + return array( + 'size' => strlen($this->data), + ); + } + + // Methods used by stream_wrapper_register() that are not implemented: + // bool stream_flush ( void ) + // int stream_write ( string data ) + // bool rename ( string path_from, string path_to ) + // bool mkdir ( string path, int mode, int options ) + // bool rmdir ( string path, int options ) + // bool dir_opendir ( string path, int options ) + // array url_stat ( string path, int flags ) + // string dir_readdir ( void ) + // bool dir_rewinddir ( void ) + // bool dir_closedir ( void ) +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS.php new file mode 100644 index 000000000..4db0ae4e2 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS.php @@ -0,0 +1,230 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: PPS.php,v 1.7 2007/02/13 21:00:42 schmidt Exp $ + + +/** +* Class for creating PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE_PPS +{ + /** + * The PPS index + * @var integer + */ + public $No; + + /** + * The PPS name (in Unicode) + * @var string + */ + public $Name; + + /** + * The PPS type. Dir, Root or File + * @var integer + */ + public $Type; + + /** + * The index of the previous PPS + * @var integer + */ + public $PrevPps; + + /** + * The index of the next PPS + * @var integer + */ + public $NextPps; + + /** + * The index of it's first child if this is a Dir or Root PPS + * @var integer + */ + public $DirPps; + + /** + * A timestamp + * @var integer + */ + public $Time1st; + + /** + * A timestamp + * @var integer + */ + public $Time2nd; + + /** + * Starting block (small or big) for this PPS's data inside the container + * @var integer + */ + public $_StartBlock; + + /** + * The size of the PPS's data (in bytes) + * @var integer + */ + public $Size; + + /** + * The PPS's data (only used if it's not using a temporary file) + * @var string + */ + public $_data; + + /** + * Array of child PPS's (only used by Root and Dir PPS's) + * @var array + */ + public $children = array(); + + /** + * Pointer to OLE container + * @var OLE + */ + public $ole; + + /** + * The constructor + * + * @access public + * @param integer $No The PPS index + * @param string $name The PPS name + * @param integer $type The PPS type. Dir, Root or File + * @param integer $prev The index of the previous PPS + * @param integer $next The index of the next PPS + * @param integer $dir The index of it's first child if this is a Dir or Root PPS + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + * @param string $data The (usually binary) source data of the PPS + * @param array $children Array containing children PPS for this PPS + */ + public function __construct($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) + { + $this->No = $No; + $this->Name = $name; + $this->Type = $type; + $this->PrevPps = $prev; + $this->NextPps = $next; + $this->DirPps = $dir; + $this->Time1st = $time_1st; + $this->Time2nd = $time_2nd; + $this->_data = $data; + $this->children = $children; + if ($data != '') { + $this->Size = strlen($data); + } else { + $this->Size = 0; + } + } + + /** + * Returns the amount of data saved for this PPS + * + * @access public + * @return integer The amount of data (in bytes) + */ + public function _DataLen() + { + if (!isset($this->_data)) { + return 0; + } + //if (isset($this->_PPS_FILE)) { + // fseek($this->_PPS_FILE, 0); + // $stats = fstat($this->_PPS_FILE); + // return $stats[7]; + //} else { + return strlen($this->_data); + //} + } + + /** + * Returns a string with the PPS's WK (What is a WK?) + * + * @access public + * @return string The binary string + */ + public function _getPpsWk() + { + $ret = str_pad($this->Name,64,"\x00"); + + $ret .= pack("v", strlen($this->Name) + 2) // 66 + . pack("c", $this->Type) // 67 + . pack("c", 0x00) //UK // 68 + . pack("V", $this->PrevPps) //Prev // 72 + . pack("V", $this->NextPps) //Next // 76 + . pack("V", $this->DirPps) //Dir // 80 + . "\x00\x09\x02\x00" // 84 + . "\x00\x00\x00\x00" // 88 + . "\xc0\x00\x00\x00" // 92 + . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root + . "\x00\x00\x00\x00" // 100 + . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time1st) // 108 + . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time2nd) // 116 + . pack("V", isset($this->_StartBlock)? + $this->_StartBlock:0) // 120 + . pack("V", $this->Size) // 124 + . pack("V", 0); // 128 + return $ret; + } + + /** + * Updates index and pointers to previous, next and children PPS's for this + * PPS. I don't think it'll work with Dir PPS's. + * + * @access public + * @param array &$raList Reference to the array of PPS's for the whole OLE + * container + * @return integer The index for this PPS + */ + public static function _savePpsSetPnt(&$raList, $to_save, $depth = 0) + { + if ( !is_array($to_save) || (empty($to_save)) ) { + return 0xFFFFFFFF; + } elseif( count($to_save) == 1 ) { + $cnt = count($raList); + // If the first entry, it's the root... Don't clone it! + $raList[$cnt] = ( $depth == 0 ) ? $to_save[0] : clone $to_save[0]; + $raList[$cnt]->No = $cnt; + $raList[$cnt]->PrevPps = 0xFFFFFFFF; + $raList[$cnt]->NextPps = 0xFFFFFFFF; + $raList[$cnt]->DirPps = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); + } else { + $iPos = floor(count($to_save) / 2); + $aPrev = array_slice($to_save, 0, $iPos); + $aNext = array_slice($to_save, $iPos + 1); + $cnt = count($raList); + // If the first entry, it's the root... Don't clone it! + $raList[$cnt] = ( $depth == 0 ) ? $to_save[$iPos] : clone $to_save[$iPos]; + $raList[$cnt]->No = $cnt; + $raList[$cnt]->PrevPps = self::_savePpsSetPnt($raList, $aPrev, $depth++); + $raList[$cnt]->NextPps = self::_savePpsSetPnt($raList, $aNext, $depth++); + $raList[$cnt]->DirPps = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); + + } + return $cnt; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS/File.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS/File.php new file mode 100644 index 000000000..f061f568c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS/File.php @@ -0,0 +1,84 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: File.php,v 1.11 2007/02/13 21:00:42 schmidt Exp $ + + +/** +* Class for creating File PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE_PPS_File extends PHPExcel_Shared_OLE_PPS + { + /** + * The constructor + * + * @access public + * @param string $name The name of the file (in Unicode) + * @see OLE::Asc2Ucs() + */ + public function __construct($name) + { + parent::__construct( + null, + $name, + PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE, + null, + null, + null, + null, + null, + '', + array()); + } + + /** + * Initialization method. Has to be called right after OLE_PPS_File(). + * + * @access public + * @return mixed true on success + */ + public function init() + { + return true; + } + + /** + * Append data to PPS + * + * @access public + * @param string $data The data to append + */ + public function append($data) + { + $this->_data .= $data; + } + + /** + * Returns a stream for reading this file using fread() etc. + * @return resource a read-only stream + */ + public function getStream() + { + $this->ole->getStream($this); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS/Root.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS/Root.php new file mode 100644 index 000000000..9a2141672 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLE/PPS/Root.php @@ -0,0 +1,467 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: Root.php,v 1.9 2005/04/23 21:53:49 dufuz Exp $ + + +/** +* Class for creating Root PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE_PPS_Root extends PHPExcel_Shared_OLE_PPS + { + + /** + * Directory for temporary files + * @var string + */ + protected $_tmp_dir = NULL; + + /** + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + */ + public function __construct($time_1st, $time_2nd, $raChild) + { + $this->_tempDir = PHPExcel_Shared_File::sys_get_temp_dir(); + + parent::__construct( + null, + PHPExcel_Shared_OLE::Asc2Ucs('Root Entry'), + PHPExcel_Shared_OLE::OLE_PPS_TYPE_ROOT, + null, + null, + null, + $time_1st, + $time_2nd, + null, + $raChild); + } + + /** + * Method for saving the whole OLE container (including files). + * In fact, if called with an empty argument (or '-'), it saves to a + * temporary file and then outputs it's contents to stdout. + * If a resource pointer to a stream created by fopen() is passed + * it will be used, but you have to close such stream by yourself. + * + * @param string|resource $filename The name of the file or stream where to save the OLE container. + * @access public + * @return mixed true on success + */ + public function save($filename) + { + // Initial Setting for saving + $this->_BIG_BLOCK_SIZE = pow(2, + ((isset($this->_BIG_BLOCK_SIZE))? self::_adjust2($this->_BIG_BLOCK_SIZE) : 9)); + $this->_SMALL_BLOCK_SIZE= pow(2, + ((isset($this->_SMALL_BLOCK_SIZE))? self::_adjust2($this->_SMALL_BLOCK_SIZE): 6)); + + if (is_resource($filename)) { + $this->_FILEH_ = $filename; + } else if ($filename == '-' || $filename == '') { + if ($this->_tmp_dir === NULL) + $this->_tmp_dir = PHPExcel_Shared_File::sys_get_temp_dir(); + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_Root"); + $this->_FILEH_ = fopen($this->_tmp_filename,"w+b"); + if ($this->_FILEH_ == false) { + throw new Exception("Can't create temporary file."); + } + } else { + $this->_FILEH_ = fopen($filename, "wb"); + } + if ($this->_FILEH_ == false) { + throw new Exception("Can't open $filename. It may be in use or protected."); + } + // Make an array of PPS's (for Save) + $aList = array(); + PHPExcel_Shared_OLE_PPS::_savePpsSetPnt($aList, array($this)); + // calculate values for header + list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo); + // Save Header + $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); + + // Make Small Data string (write SBD) + $this->_data = $this->_makeSmallData($aList); + + // Write BB + $this->_saveBigData($iSBDcnt, $aList); + // Write PPS + $this->_savePps($aList); + // Write Big Block Depot and BDList and Adding Header informations + $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); + + if (!is_resource($filename)) { + fclose($this->_FILEH_); + } + + return true; + } + + /** + * Calculate some numbers + * + * @access public + * @param array $raList Reference to an array of PPS's + * @return array The array of numbers + */ + public function _calcSize(&$raList) + { + // Calculate Basic Setting + list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0); + $iSmallLen = 0; + $iSBcnt = 0; + $iCount = count($raList); + for ($i = 0; $i < $iCount; ++$i) { + if ($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if ($raList[$i]->Size < PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) { + $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + } else { + $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + } + } + $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE; + $iSlCnt = floor($this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE); + $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0); + $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) + + (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0)); + $iCnt = count($raList); + $iBdCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_PPS_SIZE; + $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0)); + + return array($iSBDcnt, $iBBcnt, $iPPScnt); + } + + /** + * Helper function for caculating a magic value for block sizes + * + * @access public + * @param integer $i2 The argument + * @see save() + * @return integer + */ + private static function _adjust2($i2) + { + $iWk = log($i2)/log(2); + return ($iWk > floor($iWk))? floor($iWk)+1:$iWk; + } + + /** + * Save OLE header + * + * @access public + * @param integer $iSBDcnt + * @param integer $iBBcnt + * @param integer $iPPScnt + */ + public function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt) + { + $FILE = $this->_FILEH_; + + // Calculate Basic Setting + $iBlCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + + // Calculate BD count + if ($iBdCnt > $i1stBdL) { + while (1) { + ++$iBdExL; + ++$iAllW; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) { + break; + } + } + } + + // Save Header + fwrite($FILE, + "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("v", 0x3b) + . pack("v", 0x03) + . pack("v", -2) + . pack("v", 9) + . pack("v", 6) + . pack("v", 0) + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("V", $iBdCnt) + . pack("V", $iBBcnt+$iSBDcnt) //ROOT START + . pack("V", 0) + . pack("V", 0x1000) + . pack("V", $iSBDcnt ? 0 : -2) //Small Block Depot + . pack("V", $iSBDcnt) + ); + // Extra BDList Start, Count + if ($iBdCnt < $i1stBdL) { + fwrite($FILE, + pack("V", -2) // Extra BDList Start + . pack("V", 0) // Extra BDList Count + ); + } else { + fwrite($FILE, pack("V", $iAll+$iBdCnt) . pack("V", $iBdExL)); + } + + // BDList + for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; ++$i) { + fwrite($FILE, pack("V", $iAll+$i)); + } + if ($i < $i1stBdL) { + $jB = $i1stBdL - $i; + for ($j = 0; $j < $jB; ++$j) { + fwrite($FILE, (pack("V", -1))); + } + } + } + + /** + * Saving big data (PPS's with data bigger than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) + * + * @access public + * @param integer $iStBlk + * @param array &$raList Reference to array of PPS's + */ + public function _saveBigData($iStBlk, &$raList) + { + $FILE = $this->_FILEH_; + + // cycle through PPS's + $iCount = count($raList); + for ($i = 0; $i < $iCount; ++$i) { + if ($raList[$i]->Type != PHPExcel_Shared_OLE::OLE_PPS_TYPE_DIR) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if (($raList[$i]->Size >= PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) || + (($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_ROOT) && isset($raList[$i]->_data))) + { + // Write Data + //if (isset($raList[$i]->_PPS_FILE)) { + // $iLen = 0; + // fseek($raList[$i]->_PPS_FILE, 0); // To The Top + // while($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + // $iLen += strlen($sBuff); + // fwrite($FILE, $sBuff); + // } + //} else { + fwrite($FILE, $raList[$i]->_data); + //} + + if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) { + fwrite($FILE, str_repeat("\x00", $this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE))); + } + // Set For PPS + $raList[$i]->_StartBlock = $iStBlk; + $iStBlk += + (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + // Close file for each PPS, and unlink it + //if (isset($raList[$i]->_PPS_FILE)) { + // fclose($raList[$i]->_PPS_FILE); + // $raList[$i]->_PPS_FILE = null; + // unlink($raList[$i]->_tmp_filename); + //} + } + } + } + + /** + * get small data (PPS's with data smaller than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) + * + * @access public + * @param array &$raList Reference to array of PPS's + */ + public function _makeSmallData(&$raList) + { + $sRes = ''; + $FILE = $this->_FILEH_; + $iSmBlk = 0; + + $iCount = count($raList); + for ($i = 0; $i < $iCount; ++$i) { + // Make SBD, small data string + if ($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE) { + if ($raList[$i]->Size <= 0) { + continue; + } + if ($raList[$i]->Size < PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) { + $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + // Add to SBD + $jB = $iSmbCnt - 1; + for ($j = 0; $j < $jB; ++$j) { + fwrite($FILE, pack("V", $j+$iSmBlk+1)); + } + fwrite($FILE, pack("V", -2)); + + //// Add to Data String(this will be written for RootEntry) + //if ($raList[$i]->_PPS_FILE) { + // fseek($raList[$i]->_PPS_FILE, 0); // To The Top + // while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + // $sRes .= $sBuff; + // } + //} else { + $sRes .= $raList[$i]->_data; + //} + if ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) { + $sRes .= str_repeat("\x00",$this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); + } + // Set for PPS + $raList[$i]->_StartBlock = $iSmBlk; + $iSmBlk += $iSmbCnt; + } + } + } + $iSbCnt = floor($this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE); + if ($iSmBlk % $iSbCnt) { + $iB = $iSbCnt - ($iSmBlk % $iSbCnt); + for ($i = 0; $i < $iB; ++$i) { + fwrite($FILE, pack("V", -1)); + } + } + return $sRes; + } + + /** + * Saves all the PPS's WKs + * + * @access public + * @param array $raList Reference to an array with all PPS's + */ + public function _savePps(&$raList) + { + // Save each PPS WK + $iC = count($raList); + for ($i = 0; $i < $iC; ++$i) { + fwrite($this->_FILEH_, $raList[$i]->_getPpsWk()); + } + // Adjust for Block + $iCnt = count($raList); + $iBCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_PPS_SIZE; + if ($iCnt % $iBCnt) { + fwrite($this->_FILEH_, str_repeat("\x00",($iBCnt - ($iCnt % $iBCnt)) * PHPExcel_Shared_OLE::OLE_PPS_SIZE)); + } + } + + /** + * Saving Big Block Depot + * + * @access public + * @param integer $iSbdSize + * @param integer $iBsize + * @param integer $iPpsCnt + */ + public function _saveBbd($iSbdSize, $iBsize, $iPpsCnt) + { + $FILE = $this->_FILEH_; + // Calculate Basic Setting + $iBbCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBsize + $iPpsCnt + $iSbdSize; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + // Calculate BD count + if ($iBdCnt >$i1stBdL) { + while (1) { + ++$iBdExL; + ++$iAllW; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) { + break; + } + } + } + + // Making BD + // Set for SBD + if ($iSbdSize > 0) { + for ($i = 0; $i < ($iSbdSize - 1); ++$i) { + fwrite($FILE, pack("V", $i+1)); + } + fwrite($FILE, pack("V", -2)); + } + // Set for B + for ($i = 0; $i < ($iBsize - 1); ++$i) { + fwrite($FILE, pack("V", $i+$iSbdSize+1)); + } + fwrite($FILE, pack("V", -2)); + + // Set for PPS + for ($i = 0; $i < ($iPpsCnt - 1); ++$i) { + fwrite($FILE, pack("V", $i+$iSbdSize+$iBsize+1)); + } + fwrite($FILE, pack("V", -2)); + // Set for BBD itself ( 0xFFFFFFFD : BBD) + for ($i = 0; $i < $iBdCnt; ++$i) { + fwrite($FILE, pack("V", 0xFFFFFFFD)); + } + // Set for ExtraBDList + for ($i = 0; $i < $iBdExL; ++$i) { + fwrite($FILE, pack("V", 0xFFFFFFFC)); + } + // Adjust for Block + if (($iAllW + $iBdCnt) % $iBbCnt) { + $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); + for ($i = 0; $i < $iBlock; ++$i) { + fwrite($FILE, pack("V", -1)); + } + } + // Extra BDList + if ($iBdCnt > $i1stBdL) { + $iN=0; + $iNb=0; + for ($i = $i1stBdL;$i < $iBdCnt; $i++, ++$iN) { + if ($iN >= ($iBbCnt - 1)) { + $iN = 0; + ++$iNb; + fwrite($FILE, pack("V", $iAll+$iBdCnt+$iNb)); + } + fwrite($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i)); + } + if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) { + $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1)); + for ($i = 0; $i < $iB; ++$i) { + fwrite($FILE, pack("V", -1)); + } + } + fwrite($FILE, pack("V", -2)); + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLERead.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLERead.php new file mode 100644 index 000000000..2a5eb7d7a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/OLERead.php @@ -0,0 +1,317 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1)); + +class PHPExcel_Shared_OLERead { + private $data = ''; + + // OLE identifier + const IDENTIFIER_OLE = IDENTIFIER_OLE; + + // Size of a sector = 512 bytes + const BIG_BLOCK_SIZE = 0x200; + + // Size of a short sector = 64 bytes + const SMALL_BLOCK_SIZE = 0x40; + + // Size of a directory entry always = 128 bytes + const PROPERTY_STORAGE_BLOCK_SIZE = 0x80; + + // Minimum size of a standard stream = 4096 bytes, streams smaller than this are stored as short streams + const SMALL_BLOCK_THRESHOLD = 0x1000; + + // header offsets + const NUM_BIG_BLOCK_DEPOT_BLOCKS_POS = 0x2c; + const ROOT_START_BLOCK_POS = 0x30; + const SMALL_BLOCK_DEPOT_BLOCK_POS = 0x3c; + const EXTENSION_BLOCK_POS = 0x44; + const NUM_EXTENSION_BLOCK_POS = 0x48; + const BIG_BLOCK_DEPOT_BLOCKS_POS = 0x4c; + + // property storage offsets (directory offsets) + const SIZE_OF_NAME_POS = 0x40; + const TYPE_POS = 0x42; + const START_BLOCK_POS = 0x74; + const SIZE_POS = 0x78; + + + + public $wrkbook = null; + public $summaryInformation = null; + public $documentSummaryInformation = null; + + + /** + * Read the file + * + * @param $sFileName string Filename + * @throws Exception + */ + public function read($sFileName) + { + // Check if file exists and is readable + if(!is_readable($sFileName)) { + throw new Exception("Could not open " . $sFileName . " for reading! File does not exist, or it is not readable."); + } + + // Get the file data + $this->data = file_get_contents($sFileName); + + // Check OLE identifier + if (substr($this->data, 0, 8) != self::IDENTIFIER_OLE) { + throw new Exception('The filename ' . $sFileName . ' is not recognised as an OLE file'); + } + + // Total number of sectors used for the SAT + $this->numBigBlockDepotBlocks = self::_GetInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + + // SecID of the first sector of the directory stream + $this->rootStartBlock = self::_GetInt4d($this->data, self::ROOT_START_BLOCK_POS); + + // SecID of the first sector of the SSAT (or -2 if not extant) + $this->sbdStartBlock = self::_GetInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); + + // SecID of the first sector of the MSAT (or -2 if no additional sectors are used) + $this->extensionBlock = self::_GetInt4d($this->data, self::EXTENSION_BLOCK_POS); + + // Total number of sectors used by MSAT + $this->numExtensionBlocks = self::_GetInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); + + $bigBlockDepotBlocks = array(); + $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS; + + $bbdBlocks = $this->numBigBlockDepotBlocks; + + if ($this->numExtensionBlocks != 0) { + $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS)/4; + } + + for ($i = 0; $i < $bbdBlocks; ++$i) { + $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $pos += 4; + } + + for ($j = 0; $j < $this->numExtensionBlocks; ++$j) { + $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE; + $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); + + for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { + $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $pos += 4; + } + + $bbdBlocks += $blocksToRead; + if ($bbdBlocks < $this->numBigBlockDepotBlocks) { + $this->extensionBlock = self::_GetInt4d($this->data, $pos); + } + } + + $pos = $index = 0; + $this->bigBlockChain = array(); + + $bbs = self::BIG_BLOCK_SIZE / 4; + for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) { + $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; + + for ($j = 0 ; $j < $bbs; ++$j) { + $this->bigBlockChain[$index] = self::_GetInt4d($this->data, $pos); + $pos += 4 ; + ++$index; + } + } + + $pos = $index = 0; + $sbdBlock = $this->sbdStartBlock; + $this->smallBlockChain = array(); + + while ($sbdBlock != -2) { + $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; + + for ($j = 0; $j < $bbs; ++$j) { + $this->smallBlockChain[$index] = self::_GetInt4d($this->data, $pos); + $pos += 4; + ++$index; + } + + $sbdBlock = $this->bigBlockChain[$sbdBlock]; + } + + // read the directory stream + $block = $this->rootStartBlock; + $this->entry = $this->_readData($block); + + $this->_readPropertySets(); + } + + /** + * Extract binary stream data + * + * @return string + */ + public function getStream($stream) + { + if ($stream === NULL) { + return null; + } + + $streamData = ''; + + if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) { + $rootdata = $this->_readData($this->props[$this->rootentry]['startBlock']); + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = $block * self::SMALL_BLOCK_SIZE; + $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); + + $block = $this->smallBlockChain[$block]; + } + + return $streamData; + } else { + $numBlocks = $this->props[$stream]['size'] / self::BIG_BLOCK_SIZE; + if ($this->props[$stream]['size'] % self::BIG_BLOCK_SIZE != 0) { + ++$numBlocks; + } + + if ($numBlocks == 0) return ''; + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = $this->bigBlockChain[$block]; + } + + return $streamData; + } + } + + /** + * Read a standard stream (by joining sectors using information from SAT) + * + * @param int $bl Sector ID where the stream starts + * @return string Data for standard stream + */ + private function _readData($bl) + { + $block = $bl; + $data = ''; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = $this->bigBlockChain[$block]; + } + return $data; + } + + /** + * Read entries in the directory stream. + */ + private function _readPropertySets() { + $offset = 0; + + // loop through entires, each entry is 128 bytes + $entryLen = strlen($this->entry); + while ($offset < $entryLen) { + // entry data (128 bytes) + $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + + // size in bytes of name + $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS+1]) << 8); + + // type of entry + $type = ord($d[self::TYPE_POS]); + + // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) + // sectorID of first sector of the short-stream container stream, if this entry is root entry + $startBlock = self::_GetInt4d($d, self::START_BLOCK_POS); + + $size = self::_GetInt4d($d, self::SIZE_POS); + + $name = str_replace("\x00", "", substr($d,0,$nameSize)); + + $this->props[] = array ( + 'name' => $name, + 'type' => $type, + 'startBlock' => $startBlock, + 'size' => $size); + + // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook) + if (($name == 'Workbook') || ($name == 'Book') || ($name == 'WORKBOOK') || ($name == 'BOOK')) { + $this->wrkbook = count($this->props) - 1; + } + + // Root entry + if ($name == 'Root Entry' || $name == 'ROOT ENTRY' || $name == 'R') { + $this->rootentry = count($this->props) - 1; + } + + // Summary information + if ($name == chr(5) . 'SummaryInformation') { +// echo 'Summary Information<br />'; + $this->summaryInformation = count($this->props) - 1; + } + + // Additional Document Summary information + if ($name == chr(5) . 'DocumentSummaryInformation') { +// echo 'Document Summary Information<br />'; + $this->documentSummaryInformation = count($this->props) - 1; + } + + $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; + } + + } + + /** + * Read 4 bytes of data at specified position + * + * @param string $data + * @param int $pos + * @return int + */ + private static function _GetInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt new file mode 100644 index 000000000..cbee875ba --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/gnu-lgpl.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[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. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php new file mode 100644 index 000000000..4bf05a523 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/pclzip.lib.php @@ -0,0 +1,5694 @@ +<?php +// -------------------------------------------------------------------------------- +// PhpConcept Library - Zip Module 2.8.2 +// -------------------------------------------------------------------------------- +// License GNU/LGPL - Vincent Blavet - August 2009 +// http://www.phpconcept.net +// -------------------------------------------------------------------------------- +// +// Presentation : +// PclZip is a PHP library that manage ZIP archives. +// So far tests show that archives generated by PclZip are readable by +// WinZip application and other tools. +// +// Description : +// See readme.txt and http://www.phpconcept.net +// +// Warning : +// This library and the associated files are non commercial, non professional +// work. +// It should not have unexpected results. However if any damage is caused by +// this software the author can not be responsible. +// The use of this software is at the risk of the user. +// +// -------------------------------------------------------------------------------- +// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $ +// -------------------------------------------------------------------------------- + + // ----- Constants + if (!defined('PCLZIP_READ_BLOCK_SIZE')) { + define( 'PCLZIP_READ_BLOCK_SIZE', 2048 ); + } + + // ----- File list separator + // In version 1.x of PclZip, the separator for file list is a space + // (which is not a very smart choice, specifically for windows paths !). + // A better separator should be a comma (,). This constant gives you the + // abilty to change that. + // However notice that changing this value, may have impact on existing + // scripts, using space separated filenames. + // Recommanded values for compatibility with older versions : + //define( 'PCLZIP_SEPARATOR', ' ' ); + // Recommanded values for smart separation of filenames. + if (!defined('PCLZIP_SEPARATOR')) { + define( 'PCLZIP_SEPARATOR', ',' ); + } + + // ----- Error configuration + // 0 : PclZip Class integrated error handling + // 1 : PclError external library error handling. By enabling this + // you must ensure that you have included PclError library. + // [2,...] : reserved for futur use + if (!defined('PCLZIP_ERROR_EXTERNAL')) { + define( 'PCLZIP_ERROR_EXTERNAL', 0 ); + } + + // ----- Optional static temporary directory + // By default temporary files are generated in the script current + // path. + // If defined : + // - MUST BE terminated by a '/'. + // - MUST be a valid, already created directory + // Samples : + // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' ); + // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' ); + if (!defined('PCLZIP_TEMPORARY_DIR')) { + define( 'PCLZIP_TEMPORARY_DIR', '' ); + } + + // ----- Optional threshold ratio for use of temporary files + // Pclzip sense the size of the file to add/extract and decide to + // use or not temporary file. The algorythm is looking for + // memory_limit of PHP and apply a ratio. + // threshold = memory_limit * ratio. + // Recommended values are under 0.5. Default 0.47. + // Samples : + // define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 ); + if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) { + define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 ); + } + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED ***** +// -------------------------------------------------------------------------------- + + // ----- Global variables + $g_pclzip_version = "2.8.2"; + + // ----- Error codes + // -1 : Unable to open file in binary write mode + // -2 : Unable to open file in binary read mode + // -3 : Invalid parameters + // -4 : File does not exist + // -5 : Filename is too long (max. 255) + // -6 : Not a valid zip file + // -7 : Invalid extracted file size + // -8 : Unable to create directory + // -9 : Invalid archive extension + // -10 : Invalid archive format + // -11 : Unable to delete file (unlink) + // -12 : Unable to rename file (rename) + // -13 : Invalid header checksum + // -14 : Invalid archive size + define( 'PCLZIP_ERR_USER_ABORTED', 2 ); + define( 'PCLZIP_ERR_NO_ERROR', 0 ); + define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 ); + define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 ); + define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 ); + define( 'PCLZIP_ERR_MISSING_FILE', -4 ); + define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 ); + define( 'PCLZIP_ERR_INVALID_ZIP', -6 ); + define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 ); + define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 ); + define( 'PCLZIP_ERR_BAD_EXTENSION', -9 ); + define( 'PCLZIP_ERR_BAD_FORMAT', -10 ); + define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 ); + define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 ); + define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 ); + define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 ); + define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 ); + define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 ); + define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 ); + define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 ); + define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 ); + define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 ); + define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 ); + + // ----- Options values + define( 'PCLZIP_OPT_PATH', 77001 ); + define( 'PCLZIP_OPT_ADD_PATH', 77002 ); + define( 'PCLZIP_OPT_REMOVE_PATH', 77003 ); + define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 ); + define( 'PCLZIP_OPT_SET_CHMOD', 77005 ); + define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 ); + define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 ); + define( 'PCLZIP_OPT_BY_NAME', 77008 ); + define( 'PCLZIP_OPT_BY_INDEX', 77009 ); + define( 'PCLZIP_OPT_BY_EREG', 77010 ); + define( 'PCLZIP_OPT_BY_PREG', 77011 ); + define( 'PCLZIP_OPT_COMMENT', 77012 ); + define( 'PCLZIP_OPT_ADD_COMMENT', 77013 ); + define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 ); + define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 ); + define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 ); + define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 ); + // Having big trouble with crypt. Need to multiply 2 long int + // which is not correctly supported by PHP ... + //define( 'PCLZIP_OPT_CRYPT', 77018 ); + define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 ); + define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 ); + define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 ); // alias + define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 ); + define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); // alias + define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 ); + define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); // alias + + // ----- File description attributes + define( 'PCLZIP_ATT_FILE_NAME', 79001 ); + define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 ); + define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 ); + define( 'PCLZIP_ATT_FILE_MTIME', 79004 ); + define( 'PCLZIP_ATT_FILE_CONTENT', 79005 ); + define( 'PCLZIP_ATT_FILE_COMMENT', 79006 ); + + // ----- Call backs values + define( 'PCLZIP_CB_PRE_EXTRACT', 78001 ); + define( 'PCLZIP_CB_POST_EXTRACT', 78002 ); + define( 'PCLZIP_CB_PRE_ADD', 78003 ); + define( 'PCLZIP_CB_POST_ADD', 78004 ); + /* For futur use + define( 'PCLZIP_CB_PRE_LIST', 78005 ); + define( 'PCLZIP_CB_POST_LIST', 78006 ); + define( 'PCLZIP_CB_PRE_DELETE', 78007 ); + define( 'PCLZIP_CB_POST_DELETE', 78008 ); + */ + + // -------------------------------------------------------------------------------- + // Class : PclZip + // Description : + // PclZip is the class that represent a Zip archive. + // The public methods allow the manipulation of the archive. + // Attributes : + // Attributes must not be accessed directly. + // Methods : + // PclZip() : Object creator + // create() : Creates the Zip archive + // listContent() : List the content of the Zip archive + // extract() : Extract the content of the archive + // properties() : List the properties of the archive + // -------------------------------------------------------------------------------- + class PclZip + { + // ----- Filename of the zip file + var $zipname = ''; + + // ----- File descriptor of the zip file + var $zip_fd = 0; + + // ----- Internal error handling + var $error_code = 1; + var $error_string = ''; + + // ----- Current status of the magic_quotes_runtime + // This value store the php configuration for magic_quotes + // The class can then disable the magic_quotes and reset it after + var $magic_quotes_status; + + // -------------------------------------------------------------------------------- + // Function : PclZip() + // Description : + // Creates a PclZip object and set the name of the associated Zip archive + // filename. + // Note that no real action is taken, if the archive does not exist it is not + // created. Use create() for that. + // -------------------------------------------------------------------------------- + function PclZip($p_zipname) + { + + // ----- Tests the zlib + if (!function_exists('gzopen')) + { + die('Abort '.basename(__FILE__).' : Missing zlib extensions'); + } + + // ----- Set the attributes + $this->zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j<sizeof($v_work_list); $j++) { + // ----- Explode the item + $v_item_list = explode("-", $v_work_list[$j]); + $v_size_item_list = sizeof($v_item_list); + + // ----- TBC : Here we might check that each item is a + // real integer ... + + // ----- Look for single value + if ($v_size_item_list == 1) { + // ----- Set the option value + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0]; + } + elseif ($v_size_item_list == 2) { + // ----- Set the option value + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + + // ----- Look for list sort + if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) { + $v_sort_flag=true; + + // ----- TBC : An automatic sort should be writen ... + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start']; + } + + // ----- Sort the items + if ($v_sort_flag) { + // TBC : To Be Completed + } + + // ----- Next option + $i++; + break; + + // ----- Look for options that request no value + case PCLZIP_OPT_REMOVE_ALL_PATH : + case PCLZIP_OPT_EXTRACT_AS_STRING : + case PCLZIP_OPT_NO_COMPRESSION : + case PCLZIP_OPT_EXTRACT_IN_OUTPUT : + case PCLZIP_OPT_REPLACE_NEWER : + case PCLZIP_OPT_STOP_ON_ERROR : + $v_result_list[$p_options_list[$i]] = true; + break; + + // ----- Look for options that request an octal value + case PCLZIP_OPT_SET_CHMOD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + if($last == 'm') + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + if($last == 'k') + $v_memory_limit = $v_memory_limit*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $i<sizeof($p_filedescr_list); $i++) { + + // ----- Get filedescr + $v_descr = $p_filedescr_list[$i]; + + // ----- Reduce the filename + $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false); + $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']); + + // ----- Look for real file or folder + if (file_exists($v_descr['filename'])) { + if (@is_file($v_descr['filename'])) { + $v_descr['type'] = 'file'; + } + else if (@is_dir($v_descr['filename'])) { + $v_descr['type'] = 'folder'; + } + else if (@is_link($v_descr['filename'])) { + // skip + continue; + } + else { + // skip + continue; + } + } + + // ----- Look for string added as file + else if (isset($v_descr['content'])) { + $v_descr['type'] = 'virtual_file'; + } + + // ----- Missing file + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Calculate the stored filename + $this->privCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++) + { + // ----- Create the file header + if ($v_header_list[$i]['status'] == 'ok') { + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++) + { + // ----- Create the file header + if ($v_header_list[$i]['status'] == 'ok') { + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) { + // ----- Format the filename + $p_filedescr_list[$j]['filename'] + = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false); + + + // ----- Skip empty file names + // TBC : Can this be possible ? not checked in DescrParseAtt ? + if ($p_filedescr_list[$j]['filename'] == "") { + continue; + } + + // ----- Check the filename + if ( ($p_filedescr_list[$j]['type'] != 'virtual_file') + && (!file_exists($p_filedescr_list[$j]['filename']))) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist"); + return PclZip::errorCode(); + } + + // ----- Look if it is a file or a dir with no all path remove option + // or a dir with all its path removed +// if ( (is_file($p_filedescr_list[$j]['filename'])) +// || ( is_dir($p_filedescr_list[$j]['filename']) + if ( ($p_filedescr_list[$j]['type'] == 'file') + || ($p_filedescr_list[$j]['type'] == 'virtual_file') + || ( ($p_filedescr_list[$j]['type'] == 'folder') + && ( !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]) + || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) + ) { + + // ----- Add the file + $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) { + + // ----- Look for a directory + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { + + // ----- Look if the directory is in the filename path + if ( (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) { + + if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) { + + // ----- Look for a directory + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { + + // ----- Look if the directory is in the filename path + if ( (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) { + + if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $i<sizeof($v_header_list); $i++) { + + // ----- Calculate the position of the header + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $i<sizeof($v_header_list); $i++) { + // ----- Create the file header + if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + +?> diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/readme.txt b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/readme.txt new file mode 100644 index 000000000..6ed883947 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PCLZip/readme.txt @@ -0,0 +1,421 @@ +// -------------------------------------------------------------------------------- +// PclZip 2.8.2 - readme.txt +// -------------------------------------------------------------------------------- +// License GNU/LGPL - August 2009 +// Vincent Blavet - vincent@phpconcept.net +// http://www.phpconcept.net +// -------------------------------------------------------------------------------- +// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ +// -------------------------------------------------------------------------------- + + + +0 - Sommaire +============ + 1 - Introduction + 2 - What's new + 3 - Corrected bugs + 4 - Known bugs or limitations + 5 - License + 6 - Warning + 7 - Documentation + 8 - Author + 9 - Contribute + +1 - Introduction +================ + + PclZip is a library that allow you to manage a Zip archive. + + Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip + +2 - What's new +============== + + Version 2.8.2 : + - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with + extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string + can also be modified in the post-extract call back. + **Bugs correction : + - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly + - Remove use of eval() and do direct call to callback functions + - Correct support of 64bits systems (Thanks to WordPress team) + + Version 2.8.1 : + - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is + deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will + automatically replace it by PCLZIP_OPT_BY_PREG. + + Version 2.8 : + - Improve extraction of zip archive for large files by using temporary files + This feature is working like the one defined in r2.7. + Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, + PCLZIP_OPT_TEMP_FILE_THRESHOLD + - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto + sense of temporary file use. + - Bug correction : Reduce filepath in returned file list to remove ennoying + './/' preambule in file path. + + Version 2.7 : + - Improve creation of zip archive for large files : + PclZip will now autosense the configured memory and use temporary files + when large file is suspected. + This feature can also ne triggered by manual options in create() and add() + methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, + 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, + 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size + threshold to use temporary files. + Using "temporary files" rather than "memory" might take more time, but + might give the ability to zip very large files : + Tested on my win laptop with a 88Mo file : + Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) + Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) + - Replace use of mktime() by time() to limit the E_STRICT error messages. + - Bug correction : When adding files with full windows path (drive letter) + PclZip is now working. Before, if the drive letter is not the default + path, PclZip was not able to add the file. + + Version 2.6 : + - Code optimisation + - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to + add a comment for a specific file. (Don't really know if this is usefull) + - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string + as a file. + - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with + a file. + - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted + with current time + - Add CRC value in the informations returned back for each file after an + action. + - Add missing closedir() statement. + - When adding a folder, and removing the path of this folder, files were + incorrectly added with a '/' at the beginning. Which means files are + related to root in unix systems. Corrected. + - Add conditional if before constant definition. This will allow users + to redefine constants without changing the file, and then improve + upgrade of pclzip code for new versions. + + Version 2.5 : + - Introduce the ability to add file/folder with individual properties (file descriptor). + This gives for example the ability to change the filename of a zipped file. + . Able to add files individually + . Able to change full name + . Able to change short name + . Compatible with global options + - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME + - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE + - Add a security control feature. PclZip can extract any file in any folder + of a system. People may use this to upload a zip file and try to override + a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the + ability to forgive any directory transversal behavior. + - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path + - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION + - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend + by current path (getcwd()) + + Version 2.4 : + - Code improvment : try to speed up the code by removing unusefull call to pack() + - Correct bug in delete() : delete() should be called with no argument. This was not + the case in 2.3. This is corrected in 2.4. + - Correct a bug in path_inclusion function. When the path has several '../../', the + result was bad. + - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will + disable it while working and det it back to its original value. + This resolve a lots of bad formated archive errors. + - Bug correction : PclZip now correctly unzip file in some specific situation, + when compressed content has same size as uncompressed content. + - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', + directories are not any more created. + - Code improvment : correct unclosed opendir(), better handling of . and .. in + loops. + + + Version 2.3 : + - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not + give the same result in PHP4 and PHP5 .... + + Version 2.2 : + - Try development of PCLZIP_OPT_CRYPT ..... + However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, + the result (greater than a long) is not supported by PHP. Even the use of bcmath + functions does not help. I did not find yet a solution ...; + - Add missing '/' at end of directory entries + - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or + error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. + - Corrected : Bad "version need to extract" field in local file header + - Add private method privCheckFileHeaders() in order to check local and central + file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives + the ability to have a local file header without size, compressed size and crc filled. + - Add a generic status 'error' for file status + - Add control of compression type. PclZip only support deflate compression method. + Before v2.2, PclZip does not check the compression method used in an archive while + extracting. With v2.2 PclZip returns a new error status for a file using an unsupported + compression method. New status is "unsupported_compression". New error code is + PCLZIP_ERR_UNSUPPORTED_COMPRESSION. + - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files + when errors like 'a folder with same name exists' or 'a newer file exists' or + 'a write protected file' exists, rather than set a status for the concerning file + and resume the extract of the zip. + - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the + replacement of the file, even if a newer version of the file exists. + Note that today if a file with the same name already exists but is older it will be + replaced by the extracted one. + - Improve PclZipUtilOption() + - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central + directory structure is the last data in the archive. Crypt encryption/decryption of + zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. + + Version 2.1 : + - Add the ability to abort the extraction by using a user callback function. + The user can now return the value '2' in its callback which indicates to stop the + extraction. For a pre call-back extract is stopped before the extration of the current + file. For a post call back, the extraction is stopped after. + - Add the ability to extract a file (or several files) directly in the standard output. + This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). + - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, + PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments + in the zip archive. + - When merging two archives, the comments are not any more lost, but merged, with a + blank space separator. + - Corrected bug : Files are not deleted when all files are asked to be deleted. + - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. + + + Version 2.0 : + ***** Warning : Some new features may break the backward compatibility for your scripts. + Please carefully read the readme file. + - Add the ability to delete by Index, name and regular expression. This feature is + performed by the method delete(), which uses the optional parameters + PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. + - Add the ability to extract by regular expression. To extract by regexp you must use the method + extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG + (depending if you want to use ereg() or preg_match() syntax) followed by the + regular expression pattern. + - Add the ability to extract by index, directly with the extract() method. This is a + code improvment of the extractByIndex() method. + - Add the ability to extract by name. To extract by name you must use the method + extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to + extract or an array of filenames to extract. To extract all a folder, use the folder + name rather than the filename with a '/' at the end. + - Add the ability to add files without compression. This is done with a new attribute + which is PCLZIP_OPT_NO_COMPRESSION. + - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly + in a string without using any file (or temporary file). + - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. + The default separator is now a comma (,) and not any more a blank space. + THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with + your script. + - Improve algorythm performance by removing the use of temporary files when adding or + extracting files in an archive. + - Add (correct) detection of empty filename zipping. This can occurs when the removed + path is the same + as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. + - Add better support for windows paths (thanks for help from manus@manusfreedom.com). + - Corrected bug : When the archive file already exists with size=0, the add() method + fails. Corrected in 2.0. + - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. + - Control the order of index ranges in extract by index feature. + - Change the internal management of folders (better handling of internal flag). + + + Version 1.3 : + - Removing the double include check. This is now done by include_once() and require_once() + PHP directives. + - Changing the error handling mecanism : Remove the use of an external error library. + The former PclError...() functions are replaced by internal equivalent methods. + By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. + Introducing the use of constants for error codes rather than integer values. This will help + in futur improvment. + Introduction of error handling functions like errorCode(), errorName() and errorInfo(). + - Remove the deprecated use of calling function with arguments passed by reference. + - Add the calling of extract(), extractByIndex(), create() and add() functions + with variable options rather than fixed arguments. + - Add the ability to remove all the file path while extracting or adding, + without any need to specify the path to remove. + This is available for extract(), extractByIndex(), create() and add() functionS by using + the new variable options parameters : + - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. + - Ability to change the mode of a file after the extraction (chmod()). + This is available for extract() and extractByIndex() functionS by using + the new variable options parameters. + - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. + - Ability to definition call-back options. These call-back will be called during the adding, + or the extracting of file (extract(), extractByIndex(), create() and add() functions) : + - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user + can trigerred the change the filename of the extracted file. The user can triggered the + skip of the extraction. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. + Nothing can be triggered from that point. + - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user + can trigerred the change the stored filename of the added file. The user can triggered the + skip of the add. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_ADD : will be called after each add of a file. + Nothing can be triggered from that point. + - Two status are added in the file list returned as function result : skipped & filename_too_long + 'skipped' is used when a call-back function ask for skipping the file. + 'filename_too_long' is used while adding a file with a too long filename to archive (the file is + not added) + - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into + a directory. + - Add a check of the presence of the archive file before some actions (like list, ...) + - Add the initialisation of field "index" in header array. This means that by + default index will be -1 when not explicitly set by the methods. + + Version 1.2 : + - Adding a duplicate function. + - Adding a merge function. The merge function is a "quick merge" function, + it just append the content of an archive at the end of the first one. There + is no check for duplicate files or more recent files. + - Improve the search of the central directory end. + + Version 1.1.2 : + + - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license + (see License section). + - Adding the optional support of a static temporary directory. You will need to configure + the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. + - Improving the rename() function. In some cases rename() does not work (different + Filesystems), so it will be replaced by a copy() + unlink() functions. + + Version 1.1.1 : + + - Maintenance release, no new feature. + + Version 1.1 : + + - New method Add() : adding files in the archive + - New method ExtractByIndex() : partial extract of the archive, files are identified by + their index in the archive + - New method DeleteByIndex() : delete some files/folder entries from the archive, + files are identified by their index in the archive. + - Adding a test of the zlib extension presence. If not present abort the script. + + Version 1.0.1 : + + - No new feature + + +3 - Corrected bugs +================== + + Corrected in Version 2.0 : + - Corrected : During an extraction, if a call-back fucntion is used and try to skip + a file, all the extraction process is stopped. + + Corrected in Version 1.3 : + - Corrected : Support of static synopsis for method extract() is broken. + - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). + - Corrected : When an extract is done with a remove_path parameter, the entry for + the directory with exactly the same path is not skipped/filtered. + - Corrected : extractByIndex() and deleteByIndex() were not managing index in the + right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This + is due to a sort of the index resulting table that puts 11 before 3-5 (sort on + string and not interger). The sort is temporarilly removed, this means that + you must provide a sorted list of index ranges. + + Corrected in Version 1.2 : + + - Nothing. + + Corrected in Version 1.1.2 : + + - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. + + Corrected in Version 1.1.1 : + + - Corrected : When archived file is not compressed (0% compression), the + extract method fails. + + Corrected in Version 1.1 : + + - Corrected : Adding a complete tree of folder may result in a bad archive + creation. + + Corrected in Version 1.0.1 : + + - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + + +4 - Known bugs or limitations +============================= + + Please publish bugs reports in SourceForge : + http://sourceforge.net/tracker/?group_id=40254&atid=427564 + + In Version 2.x : + - PclZip does only support file uncompressed or compressed with deflate (compression method 8) + - PclZip does not support password protected zip archive + - Some concern were seen when changing mtime of a file while archiving. + Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). + + In Version 1.2 : + + - merge() methods does not check for duplicate files or last date of modifications. + + In Version 1.1 : + + - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. + - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to + add a file in a PclZip created archive. (Corrected in v.1.2) + + In Version 1.0.1 : + + - Adding a complete tree of folder may result in a bad archive + creation. (Corrected in V.1.1). + - Path given to methods must be in the unix format (/) and not the Windows format (\). + Workaround : Use only / directory separators. + - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz + added suffix. Files with these names may already exist and may be overwritten. + Workaround : none. + - PclZip does not check if the zlib extension is present. If it is absent, the zip + file is not created and the lib abort without warning. + Workaround : enable the zlib extension on the php install + + In Version 1.0 : + + - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + (Corrected in v.1.0.1) + - Limitation : Multi-disk zip archive are not supported. + + +5 - License +=========== + + Since version 1.1.2, PclZip Library is released under GNU/LGPL license. + This library is free, so you can use it at no cost. + + HOWEVER, if you release a script, an application, a library or any kind of + code using PclZip library (or a part of it), YOU MUST : + - Indicate in the documentation (or a readme file), that your work + uses PclZip Library, and make a reference to the author and the web site + http://www.phpconcept.net + - Gives the ability to the final user to update the PclZip libary. + + I will also appreciate that you send me a mail (vincent@phpconcept.net), just to + be aware that someone is using PclZip. + + For more information about GNU/LGPL license : http://www.gnu.org + +6 - Warning +================= + + This library and the associated files are non commercial, non professional work. + It should not have unexpected results. However if any damage is caused by this software + the author can not be responsible. + The use of this software is at the risk of the user. + +7 - Documentation +================= + PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php + A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ + +8 - Author +========== + + This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. + +9 - Contribute +============== + If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. + If you can help in financing PhpConcept hosting service, please go to + http://www.phpconcept.net/soutien.php diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PasswordHasher.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PasswordHasher.php new file mode 100644 index 000000000..65317d55b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/PasswordHasher.php @@ -0,0 +1,67 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_PasswordHasher + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_PasswordHasher +{ + /** + * Create a password hash from a given string. + * + * This method is based on the algorithm provided by + * Daniel Rentz of OpenOffice and the PEAR package + * Spreadsheet_Excel_Writer by Xavier Noguer <xnoguer@rezebra.com>. + * + * @param string $pPassword Password to hash + * @return string Hashed password + */ + public static function hashPassword($pPassword = '') { + $password = 0x0000; + $i = 1; // char position + + // split the plain text password in its component characters + $chars = preg_split('//', $pPassword, -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $char) { + $value = ord($char) << $i; // shifted ASCII value + $rotated_bits = $value >> 15; // rotated bits beyond bit 15 + $value &= 0x7fff; // first 15 bits + $password ^= ($value | $rotated_bits); + ++$i; + } + + $password ^= strlen($pPassword); + $password ^= 0xCE4B; + + return(strtoupper(dechex($password))); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/String.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/String.php new file mode 100644 index 000000000..a62a68166 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/String.php @@ -0,0 +1,730 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_String + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_String +{ + /** Constants */ + /** Regular Expressions */ + // Fraction + const STRING_REGEXP_FRACTION = '(-?)(\d+)\s+(\d+\/\d+)'; + + + /** + * Control characters array + * + * @var string[] + */ + private static $_controlCharacters = array(); + + /** + * SYLK Characters array + * + * $var array + */ + private static $_SYLKCharacters = array(); + + /** + * Decimal separator + * + * @var string + */ + private static $_decimalSeparator; + + /** + * Thousands separator + * + * @var string + */ + private static $_thousandsSeparator; + + /** + * Currency code + * + * @var string + */ + private static $_currencyCode; + + /** + * Is mbstring extension avalable? + * + * @var boolean + */ + private static $_isMbstringEnabled; + + /** + * Is iconv extension avalable? + * + * @var boolean + */ + private static $_isIconvEnabled; + + /** + * Build control characters array + */ + private static function _buildControlCharacters() { + for ($i = 0; $i <= 31; ++$i) { + if ($i != 9 && $i != 10 && $i != 13) { + $find = '_x' . sprintf('%04s' , strtoupper(dechex($i))) . '_'; + $replace = chr($i); + self::$_controlCharacters[$find] = $replace; + } + } + } + + /** + * Build SYLK characters array + */ + private static function _buildSYLKCharacters() + { + self::$_SYLKCharacters = array( + "\x1B 0" => chr(0), + "\x1B 1" => chr(1), + "\x1B 2" => chr(2), + "\x1B 3" => chr(3), + "\x1B 4" => chr(4), + "\x1B 5" => chr(5), + "\x1B 6" => chr(6), + "\x1B 7" => chr(7), + "\x1B 8" => chr(8), + "\x1B 9" => chr(9), + "\x1B :" => chr(10), + "\x1B ;" => chr(11), + "\x1B <" => chr(12), + "\x1B :" => chr(13), + "\x1B >" => chr(14), + "\x1B ?" => chr(15), + "\x1B!0" => chr(16), + "\x1B!1" => chr(17), + "\x1B!2" => chr(18), + "\x1B!3" => chr(19), + "\x1B!4" => chr(20), + "\x1B!5" => chr(21), + "\x1B!6" => chr(22), + "\x1B!7" => chr(23), + "\x1B!8" => chr(24), + "\x1B!9" => chr(25), + "\x1B!:" => chr(26), + "\x1B!;" => chr(27), + "\x1B!<" => chr(28), + "\x1B!=" => chr(29), + "\x1B!>" => chr(30), + "\x1B!?" => chr(31), + "\x1B'?" => chr(127), + "\x1B(0" => '€', // 128 in CP1252 + "\x1B(2" => '‚', // 130 in CP1252 + "\x1B(3" => 'Æ’', // 131 in CP1252 + "\x1B(4" => '„', // 132 in CP1252 + "\x1B(5" => '…', // 133 in CP1252 + "\x1B(6" => '†', // 134 in CP1252 + "\x1B(7" => '‡', // 135 in CP1252 + "\x1B(8" => 'ˆ', // 136 in CP1252 + "\x1B(9" => '‰', // 137 in CP1252 + "\x1B(:" => 'Å ', // 138 in CP1252 + "\x1B(;" => '‹', // 139 in CP1252 + "\x1BNj" => 'Å’', // 140 in CP1252 + "\x1B(>" => 'Ž', // 142 in CP1252 + "\x1B)1" => '‘', // 145 in CP1252 + "\x1B)2" => '’', // 146 in CP1252 + "\x1B)3" => '“', // 147 in CP1252 + "\x1B)4" => 'â€', // 148 in CP1252 + "\x1B)5" => '•', // 149 in CP1252 + "\x1B)6" => '–', // 150 in CP1252 + "\x1B)7" => '—', // 151 in CP1252 + "\x1B)8" => 'Ëœ', // 152 in CP1252 + "\x1B)9" => 'â„¢', // 153 in CP1252 + "\x1B):" => 'Å¡', // 154 in CP1252 + "\x1B);" => '›', // 155 in CP1252 + "\x1BNz" => 'Å“', // 156 in CP1252 + "\x1B)>" => 'ž', // 158 in CP1252 + "\x1B)?" => 'Ÿ', // 159 in CP1252 + "\x1B*0" => ' ', // 160 in CP1252 + "\x1BN!" => '¡', // 161 in CP1252 + "\x1BN\"" => '¢', // 162 in CP1252 + "\x1BN#" => '£', // 163 in CP1252 + "\x1BN(" => '¤', // 164 in CP1252 + "\x1BN%" => 'Â¥', // 165 in CP1252 + "\x1B*6" => '¦', // 166 in CP1252 + "\x1BN'" => '§', // 167 in CP1252 + "\x1BNH " => '¨', // 168 in CP1252 + "\x1BNS" => '©', // 169 in CP1252 + "\x1BNc" => 'ª', // 170 in CP1252 + "\x1BN+" => '«', // 171 in CP1252 + "\x1B*<" => '¬', // 172 in CP1252 + "\x1B*=" => '­', // 173 in CP1252 + "\x1BNR" => '®', // 174 in CP1252 + "\x1B*?" => '¯', // 175 in CP1252 + "\x1BN0" => '°', // 176 in CP1252 + "\x1BN1" => '±', // 177 in CP1252 + "\x1BN2" => '²', // 178 in CP1252 + "\x1BN3" => '³', // 179 in CP1252 + "\x1BNB " => '´', // 180 in CP1252 + "\x1BN5" => 'µ', // 181 in CP1252 + "\x1BN6" => '¶', // 182 in CP1252 + "\x1BN7" => '·', // 183 in CP1252 + "\x1B+8" => '¸', // 184 in CP1252 + "\x1BNQ" => '¹', // 185 in CP1252 + "\x1BNk" => 'º', // 186 in CP1252 + "\x1BN;" => '»', // 187 in CP1252 + "\x1BN<" => '¼', // 188 in CP1252 + "\x1BN=" => '½', // 189 in CP1252 + "\x1BN>" => '¾', // 190 in CP1252 + "\x1BN?" => '¿', // 191 in CP1252 + "\x1BNAA" => 'À', // 192 in CP1252 + "\x1BNBA" => 'Ã', // 193 in CP1252 + "\x1BNCA" => 'Â', // 194 in CP1252 + "\x1BNDA" => 'Ã', // 195 in CP1252 + "\x1BNHA" => 'Ä', // 196 in CP1252 + "\x1BNJA" => 'Ã…', // 197 in CP1252 + "\x1BNa" => 'Æ', // 198 in CP1252 + "\x1BNKC" => 'Ç', // 199 in CP1252 + "\x1BNAE" => 'È', // 200 in CP1252 + "\x1BNBE" => 'É', // 201 in CP1252 + "\x1BNCE" => 'Ê', // 202 in CP1252 + "\x1BNHE" => 'Ë', // 203 in CP1252 + "\x1BNAI" => 'ÃŒ', // 204 in CP1252 + "\x1BNBI" => 'Ã', // 205 in CP1252 + "\x1BNCI" => 'ÃŽ', // 206 in CP1252 + "\x1BNHI" => 'Ã', // 207 in CP1252 + "\x1BNb" => 'Ã', // 208 in CP1252 + "\x1BNDN" => 'Ñ', // 209 in CP1252 + "\x1BNAO" => 'Ã’', // 210 in CP1252 + "\x1BNBO" => 'Ó', // 211 in CP1252 + "\x1BNCO" => 'Ô', // 212 in CP1252 + "\x1BNDO" => 'Õ', // 213 in CP1252 + "\x1BNHO" => 'Ö', // 214 in CP1252 + "\x1B-7" => '×', // 215 in CP1252 + "\x1BNi" => 'Ø', // 216 in CP1252 + "\x1BNAU" => 'Ù', // 217 in CP1252 + "\x1BNBU" => 'Ú', // 218 in CP1252 + "\x1BNCU" => 'Û', // 219 in CP1252 + "\x1BNHU" => 'Ü', // 220 in CP1252 + "\x1B-=" => 'Ã', // 221 in CP1252 + "\x1BNl" => 'Þ', // 222 in CP1252 + "\x1BN{" => 'ß', // 223 in CP1252 + "\x1BNAa" => 'à', // 224 in CP1252 + "\x1BNBa" => 'á', // 225 in CP1252 + "\x1BNCa" => 'â', // 226 in CP1252 + "\x1BNDa" => 'ã', // 227 in CP1252 + "\x1BNHa" => 'ä', // 228 in CP1252 + "\x1BNJa" => 'Ã¥', // 229 in CP1252 + "\x1BNq" => 'æ', // 230 in CP1252 + "\x1BNKc" => 'ç', // 231 in CP1252 + "\x1BNAe" => 'è', // 232 in CP1252 + "\x1BNBe" => 'é', // 233 in CP1252 + "\x1BNCe" => 'ê', // 234 in CP1252 + "\x1BNHe" => 'ë', // 235 in CP1252 + "\x1BNAi" => 'ì', // 236 in CP1252 + "\x1BNBi" => 'í', // 237 in CP1252 + "\x1BNCi" => 'î', // 238 in CP1252 + "\x1BNHi" => 'ï', // 239 in CP1252 + "\x1BNs" => 'ð', // 240 in CP1252 + "\x1BNDn" => 'ñ', // 241 in CP1252 + "\x1BNAo" => 'ò', // 242 in CP1252 + "\x1BNBo" => 'ó', // 243 in CP1252 + "\x1BNCo" => 'ô', // 244 in CP1252 + "\x1BNDo" => 'õ', // 245 in CP1252 + "\x1BNHo" => 'ö', // 246 in CP1252 + "\x1B/7" => '÷', // 247 in CP1252 + "\x1BNy" => 'ø', // 248 in CP1252 + "\x1BNAu" => 'ù', // 249 in CP1252 + "\x1BNBu" => 'ú', // 250 in CP1252 + "\x1BNCu" => 'û', // 251 in CP1252 + "\x1BNHu" => 'ü', // 252 in CP1252 + "\x1B/=" => 'ý', // 253 in CP1252 + "\x1BN|" => 'þ', // 254 in CP1252 + "\x1BNHy" => 'ÿ', // 255 in CP1252 + ); + } + + /** + * Get whether mbstring extension is available + * + * @return boolean + */ + public static function getIsMbstringEnabled() + { + if (isset(self::$_isMbstringEnabled)) { + return self::$_isMbstringEnabled; + } + + self::$_isMbstringEnabled = function_exists('mb_convert_encoding') ? + true : false; + + return self::$_isMbstringEnabled; + } + + /** + * Get whether iconv extension is available + * + * @return boolean + */ + public static function getIsIconvEnabled() + { + if (isset(self::$_isIconvEnabled)) { + return self::$_isIconvEnabled; + } + + // Fail if iconv doesn't exist + if (!function_exists('iconv')) { + self::$_isIconvEnabled = false; + return false; + } + + // Sometimes iconv is not working, and e.g. iconv('UTF-8', 'UTF-16LE', 'x') just returns false, + if (!@iconv('UTF-8', 'UTF-16LE', 'x')) { + self::$_isIconvEnabled = false; + return false; + } + + // Sometimes iconv_substr('A', 0, 1, 'UTF-8') just returns false in PHP 5.2.0 + // we cannot use iconv in that case either (http://bugs.php.net/bug.php?id=37773) + if (!@iconv_substr('A', 0, 1, 'UTF-8')) { + self::$_isIconvEnabled = false; + return false; + } + + // CUSTOM: IBM AIX iconv() does not work + if ( defined('PHP_OS') && @stristr(PHP_OS, 'AIX') + && defined('ICONV_IMPL') && (@strcasecmp(ICONV_IMPL, 'unknown') == 0) + && defined('ICONV_VERSION') && (@strcasecmp(ICONV_VERSION, 'unknown') == 0) ) + { + self::$_isIconvEnabled = false; + return false; + } + + // If we reach here no problems were detected with iconv + self::$_isIconvEnabled = true; + return true; + } + + public static function buildCharacterSets() { + if(empty(self::$_controlCharacters)) { + self::_buildControlCharacters(); + } + if(empty(self::$_SYLKCharacters)) { + self::_buildSYLKCharacters(); + } + } + + /** + * Convert from OpenXML escaped control character to PHP control character + * + * Excel 2007 team: + * ---------------- + * That's correct, control characters are stored directly in the shared-strings table. + * We do encode characters that cannot be represented in XML using the following escape sequence: + * _xHHHH_ where H represents a hexadecimal character in the character's value... + * So you could end up with something like _x0008_ in a string (either in a cell value (<v>) + * element or in the shared string <t> element. + * + * @param string $value Value to unescape + * @return string + */ + public static function ControlCharacterOOXML2PHP($value = '') { + return str_replace( array_keys(self::$_controlCharacters), array_values(self::$_controlCharacters), $value ); + } + + /** + * Convert from PHP control character to OpenXML escaped control character + * + * Excel 2007 team: + * ---------------- + * That's correct, control characters are stored directly in the shared-strings table. + * We do encode characters that cannot be represented in XML using the following escape sequence: + * _xHHHH_ where H represents a hexadecimal character in the character's value... + * So you could end up with something like _x0008_ in a string (either in a cell value (<v>) + * element or in the shared string <t> element. + * + * @param string $value Value to escape + * @return string + */ + public static function ControlCharacterPHP2OOXML($value = '') { + return str_replace( array_values(self::$_controlCharacters), array_keys(self::$_controlCharacters), $value ); + } + + /** + * Try to sanitize UTF8, stripping invalid byte sequences. Not perfect. Does not surrogate characters. + * + * @param string $value + * @return string + */ + public static function SanitizeUTF8($value) + { + if (self::getIsIconvEnabled()) { + $value = @iconv('UTF-8', 'UTF-8', $value); + return $value; + } + + if (self::getIsMbstringEnabled()) { + $value = mb_convert_encoding($value, 'UTF-8', 'UTF-8'); + return $value; + } + + // else, no conversion + return $value; + } + + /** + * Check if a string contains UTF8 data + * + * @param string $value + * @return boolean + */ + public static function IsUTF8($value = '') { + return utf8_encode(utf8_decode($value)) === $value; + } + + /** + * Formats a numeric value as a string for output in various output writers forcing + * point as decimal separator in case locale is other than English. + * + * @param mixed $value + * @return string + */ + public static function FormatNumber($value) { + if (is_float($value)) { + return str_replace(',', '.', $value); + } + return (string) $value; + } + + /** + * Converts a UTF-8 string into BIFF8 Unicode string data (8-bit string length) + * Writes the string using uncompressed notation, no rich text, no Asian phonetics + * If mbstring extension is not available, ASCII is assumed, and compressed notation is used + * although this will give wrong results for non-ASCII strings + * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3 + * + * @param string $value UTF-8 encoded string + * @return string + */ + public static function UTF8toBIFF8UnicodeShort($value, $arrcRuns = array()) + { + // character count + $ln = self::CountCharacters($value, 'UTF-8'); + + // option flags + if(empty($arrcRuns)){ + $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ? + 0x0001 : 0x0000; + $data = pack('CC', $ln, $opt); + // characters + $data .= self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + } + else { + $data = pack('vC', $ln, 0x08); + $data .= pack('v', count($arrcRuns)); + // characters + $data .= $value; + foreach ($arrcRuns as $cRun){ + $data .= pack('v', $cRun['strlen']); + $data .= pack('v', $cRun['fontidx']); + } + } + return $data; + } + + /** + * Converts a UTF-8 string into BIFF8 Unicode string data (16-bit string length) + * Writes the string using uncompressed notation, no rich text, no Asian phonetics + * If mbstring extension is not available, ASCII is assumed, and compressed notation is used + * although this will give wrong results for non-ASCII strings + * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3 + * + * @param string $value UTF-8 encoded string + * @return string + */ + public static function UTF8toBIFF8UnicodeLong($value) + { + // character count + $ln = self::CountCharacters($value, 'UTF-8'); + + // option flags + $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ? + 0x0001 : 0x0000; + + // characters + $chars = self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + + $data = pack('vC', $ln, $opt) . $chars; + return $data; + } + + /** + * Convert string from one encoding to another. First try iconv, then mbstring, or no convertion + * + * @param string $value + * @param string $to Encoding to convert to, e.g. 'UTF-8' + * @param string $from Encoding to convert from, e.g. 'UTF-16LE' + * @return string + */ + public static function ConvertEncoding($value, $to, $from) + { + if (self::getIsIconvEnabled()) { + $value = iconv($from, $to, $value); + return $value; + } + + if (self::getIsMbstringEnabled()) { + $value = mb_convert_encoding($value, $to, $from); + return $value; + } + if($from == 'UTF-16LE'){ + return self::utf16_decode($value, false); + }else if($from == 'UTF-16BE'){ + return self::utf16_decode($value); + } + // else, no conversion + return $value; + } + + /** + * Decode UTF-16 encoded strings. + * + * Can handle both BOM'ed data and un-BOM'ed data. + * Assumes Big-Endian byte order if no BOM is available. + * This function was taken from http://php.net/manual/en/function.utf8-decode.php + * and $bom_be parameter added. + * + * @param string $str UTF-16 encoded data to decode. + * @return string UTF-8 / ISO encoded data. + * @access public + * @version 0.2 / 2010-05-13 + * @author Rasmus Andersson {@link http://rasmusandersson.se/} + * @author vadik56 + */ + public static function utf16_decode( $str, $bom_be=true ) { + if( strlen($str) < 2 ) return $str; + $c0 = ord($str{0}); + $c1 = ord($str{1}); + if( $c0 == 0xfe && $c1 == 0xff ) { $str = substr($str,2); } + elseif( $c0 == 0xff && $c1 == 0xfe ) { $str = substr($str,2); $bom_be = false; } + $len = strlen($str); + $newstr = ''; + for($i=0;$i<$len;$i+=2) { + if( $bom_be ) { $val = ord($str{$i}) << 4; $val += ord($str{$i+1}); } + else { $val = ord($str{$i+1}) << 4; $val += ord($str{$i}); } + $newstr .= ($val == 0x228) ? "\n" : chr($val); + } + return $newstr; + } + + /** + * Get character count. First try mbstring, then iconv, finally strlen + * + * @param string $value + * @param string $enc Encoding + * @return int Character count + */ + public static function CountCharacters($value, $enc = 'UTF-8') + { + if (self::getIsIconvEnabled()) { + return iconv_strlen($value, $enc); + } + + if (self::getIsMbstringEnabled()) { + return mb_strlen($value, $enc); + } + + // else strlen + return strlen($value); + } + + /** + * Get a substring of a UTF-8 encoded string + * + * @param string $pValue UTF-8 encoded string + * @param int $start Start offset + * @param int $length Maximum number of characters in substring + * @return string + */ + public static function Substring($pValue = '', $pStart = 0, $pLength = 0) + { + if (self::getIsIconvEnabled()) { + return iconv_substr($pValue, $pStart, $pLength, 'UTF-8'); + } + + if (self::getIsMbstringEnabled()) { + return mb_substr($pValue, $pStart, $pLength, 'UTF-8'); + } + + // else substr + return substr($pValue, $pStart, $pLength); + } + + + /** + * Identify whether a string contains a fractional numeric value, + * and convert it to a numeric if it is + * + * @param string &$operand string value to test + * @return boolean + */ + public static function convertToNumberIfFraction(&$operand) { + if (preg_match('/^'.self::STRING_REGEXP_FRACTION.'$/i', $operand, $match)) { + $sign = ($match[1] == '-') ? '-' : '+'; + $fractionFormula = '='.$sign.$match[2].$sign.$match[3]; + $operand = PHPExcel_Calculation::getInstance()->_calculateFormulaValue($fractionFormula); + return true; + } + return false; + } // function convertToNumberIfFraction() + + /** + * Get the decimal separator. If it has not yet been set explicitly, try to obtain number + * formatting information from locale. + * + * @return string + */ + public static function getDecimalSeparator() + { + if (!isset(self::$_decimalSeparator)) { + $localeconv = localeconv(); + self::$_decimalSeparator = ($localeconv['decimal_point'] != '') + ? $localeconv['decimal_point'] : $localeconv['mon_decimal_point']; + + if (self::$_decimalSeparator == '') { + // Default to . + self::$_decimalSeparator = '.'; + } + } + return self::$_decimalSeparator; + } + + /** + * Set the decimal separator. Only used by PHPExcel_Style_NumberFormat::toFormattedString() + * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF + * + * @param string $pValue Character for decimal separator + */ + public static function setDecimalSeparator($pValue = '.') + { + self::$_decimalSeparator = $pValue; + } + + /** + * Get the thousands separator. If it has not yet been set explicitly, try to obtain number + * formatting information from locale. + * + * @return string + */ + public static function getThousandsSeparator() + { + if (!isset(self::$_thousandsSeparator)) { + $localeconv = localeconv(); + self::$_thousandsSeparator = ($localeconv['thousands_sep'] != '') + ? $localeconv['thousands_sep'] : $localeconv['mon_thousands_sep']; + } + return self::$_thousandsSeparator; + } + + /** + * Set the thousands separator. Only used by PHPExcel_Style_NumberFormat::toFormattedString() + * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF + * + * @param string $pValue Character for thousands separator + */ + public static function setThousandsSeparator($pValue = ',') + { + self::$_thousandsSeparator = $pValue; + } + + /** + * Get the currency code. If it has not yet been set explicitly, try to obtain the + * symbol information from locale. + * + * @return string + */ + public static function getCurrencyCode() + { + if (!isset(self::$_currencyCode)) { + $localeconv = localeconv(); + self::$_currencyCode = ($localeconv['currency_symbol'] != '') + ? $localeconv['currency_symbol'] : $localeconv['int_curr_symbol']; + + if (self::$_currencyCode == '') { + // Default to $ + self::$_currencyCode = '$'; + } + } + return self::$_currencyCode; + } + + /** + * Set the currency code. Only used by PHPExcel_Style_NumberFormat::toFormattedString() + * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF + * + * @param string $pValue Character for currency code + */ + public static function setCurrencyCode($pValue = '$') + { + self::$_currencyCode = $pValue; + } + + /** + * Convert SYLK encoded string to UTF-8 + * + * @param string $pValue + * @return string UTF-8 encoded string + */ + public static function SYLKtoUTF8($pValue = '') + { + // If there is no escape character in the string there is nothing to do + if (strpos($pValue, '') === false) { + return $pValue; + } + + foreach (self::$_SYLKCharacters as $k => $v) { + $pValue = str_replace($k, $v, $pValue); + } + + return $pValue; + } + + /** + * Retrieve any leading numeric part of a string, or return the full string if no leading numeric + * (handles basic integer or float, but not exponent or non decimal) + * + * @param string $value + * @return mixed string or only the leading numeric part of the string + */ + public static function testStringAsNumeric($value) + { + if (is_numeric($value)) + return $value; + $v = floatval($value); + return (is_numeric(substr($value,0,strlen($v)))) ? $v : $value; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/XMLWriter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/XMLWriter.php new file mode 100644 index 000000000..403c0996a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/XMLWriter.php @@ -0,0 +1,127 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +if (!defined('DATE_W3C')) { + define('DATE_W3C', 'Y-m-d\TH:i:sP'); +} + +if (!defined('DEBUGMODE_ENABLED')) { + define('DEBUGMODE_ENABLED', false); +} + + +/** + * PHPExcel_Shared_XMLWriter + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_XMLWriter extends XMLWriter { + /** Temporary storage method */ + const STORAGE_MEMORY = 1; + const STORAGE_DISK = 2; + + /** + * Temporary filename + * + * @var string + */ + private $_tempFileName = ''; + + /** + * Create a new PHPExcel_Shared_XMLWriter instance + * + * @param int $pTemporaryStorage Temporary storage location + * @param string $pTemporaryStorageFolder Temporary storage folder + */ + public function __construct($pTemporaryStorage = self::STORAGE_MEMORY, $pTemporaryStorageFolder = NULL) { + // Open temporary storage + if ($pTemporaryStorage == self::STORAGE_MEMORY) { + $this->openMemory(); + } else { + // Create temporary filename + if ($pTemporaryStorageFolder === NULL) + $pTemporaryStorageFolder = PHPExcel_Shared_File::sys_get_temp_dir(); + $this->_tempFileName = @tempnam($pTemporaryStorageFolder, 'xml'); + + // Open storage + if ($this->openUri($this->_tempFileName) === false) { + // Fallback to memory... + $this->openMemory(); + } + } + + // Set default values + if (DEBUGMODE_ENABLED) { + $this->setIndent(true); + } + } + + /** + * Destructor + */ + public function __destruct() { + // Unlink temporary files + if ($this->_tempFileName != '') { + @unlink($this->_tempFileName); + } + } + + /** + * Get written data + * + * @return $data + */ + public function getData() { + if ($this->_tempFileName == '') { + return $this->outputMemory(true); + } else { + $this->flush(); + return file_get_contents($this->_tempFileName); + } + } + + /** + * Fallback method for writeRaw, introduced in PHP 5.2 + * + * @param string $text + * @return string + */ + public function writeRawData($text) + { + if (is_array($text)) { + $text = implode("\n",$text); + } + + if (method_exists($this, 'writeRaw')) { + return $this->writeRaw(htmlspecialchars($text)); + } + + return $this->text($text); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/ZipArchive.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/ZipArchive.php new file mode 100644 index 000000000..56d7c3918 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/ZipArchive.php @@ -0,0 +1,114 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_ZipArchive + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +if (!defined('PCLZIP_TEMPORARY_DIR')) { + define('PCLZIP_TEMPORARY_DIR', PHPExcel_Shared_File::sys_get_temp_dir()); +} +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/PCLZip/pclzip.lib.php'; + + +/** + * PHPExcel_Shared_ZipArchive + * + * @category PHPExcel + * @package PHPExcel_Shared_ZipArchive + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_ZipArchive +{ + + /** constants */ + const OVERWRITE = 'OVERWRITE'; + const CREATE = 'CREATE'; + + + /** + * Temporary storage directory + * + * @var string + */ + private $_tempDir; + + /** + * Zip Archive Stream Handle + * + * @var string + */ + private $_zip; + + + /** + * Open a new zip archive + * + * @param string $fileName Filename for the zip archive + * @return boolean + */ + public function open($fileName) + { + $this->_tempDir = PHPExcel_Shared_File::sys_get_temp_dir(); + + $this->_zip = new PclZip($fileName); + + return true; + } + + + /** + * Close this zip archive + * + */ + public function close() + { + } + + + /** + * Add a new file to the zip archive from a string of raw data. + * + * @param string $localname Directory/Name of the file to add to the zip archive + * @param string $contents String of data to add to the zip archive + */ + public function addFromString($localname, $contents) + { + $filenameParts = pathinfo($localname); + + $handle = fopen($this->_tempDir.'/'.$filenameParts["basename"], "wb"); + fwrite($handle, $contents); + fclose($handle); + + $res = $this->_zip->add($this->_tempDir.'/'.$filenameParts["basename"], + PCLZIP_OPT_REMOVE_PATH, $this->_tempDir, + PCLZIP_OPT_ADD_PATH, $filenameParts["dirname"] + ); + if ($res == 0) { + throw new Exception("Error zipping files : " . $this->_zip->errorInfo(true)); + } + + unlink($this->_tempDir.'/'.$filenameParts["basename"]); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/ZipStreamWrapper.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/ZipStreamWrapper.php new file mode 100644 index 000000000..58d7e020a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/ZipStreamWrapper.php @@ -0,0 +1,183 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_ZipStreamWrapper + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_ZipStreamWrapper { + /** + * Internal ZipAcrhive + * + * @var ZipAcrhive + */ + private $_archive; + + /** + * Filename in ZipAcrhive + * + * @var string + */ + private $_fileNameInArchive = ''; + + /** + * Position in file + * + * @var int + */ + private $_position = 0; + + /** + * Data + * + * @var mixed + */ + private $_data = ''; + + /** + * Register wrapper + */ + public static function register() { + @stream_wrapper_unregister("zip"); + @stream_wrapper_register("zip", __CLASS__); + } + + /** + * Implements support for fopen(). + * + * @param string $path resource name including scheme, e.g. + * @param string $mode only "r" is supported + * @param int $options mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH + * @param string &$openedPath absolute path of the opened stream (out parameter) + * @return bool true on success + */ + public function stream_open($path, $mode, $options, &$opened_path) { + // Check for mode + if ($mode{0} != 'r') { + throw new Exception('Mode ' . $mode . ' is not supported. Only read mode is supported.'); + } + + $pos = strrpos($path, '#'); + $url['host'] = substr($path, 6, $pos - 6); // 6: strlen('zip://') + $url['fragment'] = substr($path, $pos + 1); + + // Open archive + $this->_archive = new ZipArchive(); + $this->_archive->open($url['host']); + + $this->_fileNameInArchive = $url['fragment']; + $this->_position = 0; + $this->_data = $this->_archive->getFromName( $this->_fileNameInArchive ); + + return true; + } + + /** + * Implements support for fstat(). + * + * @return boolean + */ + public function stream_stat() { + return $this->_archive->statName( $this->_fileNameInArchive ); + } + + /** + * Implements support for fread(), fgets() etc. + * + * @param int $count maximum number of bytes to read + * @return string + */ + function stream_read($count) { + $ret = substr($this->_data, $this->_position, $count); + $this->_position += strlen($ret); + return $ret; + } + + /** + * Returns the position of the file pointer, i.e. its offset into the file + * stream. Implements support for ftell(). + * + * @return int + */ + public function stream_tell() { + return $this->_position; + } + + /** + * EOF stream + * + * @return bool + */ + public function stream_eof() { + return $this->_position >= strlen($this->_data); + } + + /** + * Seek stream + * + * @param int $offset byte offset + * @param int $whence SEEK_SET, SEEK_CUR or SEEK_END + * @return bool + */ + public function stream_seek($offset, $whence) { + switch ($whence) { + case SEEK_SET: + if ($offset < strlen($this->_data) && $offset >= 0) { + $this->_position = $offset; + return true; + } else { + return false; + } + break; + + case SEEK_CUR: + if ($offset >= 0) { + $this->_position += $offset; + return true; + } else { + return false; + } + break; + + case SEEK_END: + if (strlen($this->_data) + $offset >= 0) { + $this->_position = strlen($this->_data) + $offset; + return true; + } else { + return false; + } + break; + + default: + return false; + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/bestFitClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/bestFitClass.php new file mode 100644 index 000000000..d86424f1a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/bestFitClass.php @@ -0,0 +1,432 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Best_Fit + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Best_Fit +{ + /** + * Indicator flag for a calculation error + * + * @var boolean + **/ + protected $_error = False; + + /** + * Algorithm type to use for best-fit + * + * @var string + **/ + protected $_bestFitType = 'undetermined'; + + /** + * Number of entries in the sets of x- and y-value arrays + * + * @var int + **/ + protected $_valueCount = 0; + + /** + * X-value dataseries of values + * + * @var float[] + **/ + protected $_xValues = array(); + + /** + * Y-value dataseries of values + * + * @var float[] + **/ + protected $_yValues = array(); + + /** + * Flag indicating whether values should be adjusted to Y=0 + * + * @var boolean + **/ + protected $_adjustToZero = False; + + /** + * Y-value series of best-fit values + * + * @var float[] + **/ + protected $_yBestFitValues = array(); + + protected $_goodnessOfFit = 1; + + protected $_stdevOfResiduals = 0; + + protected $_covariance = 0; + + protected $_correlation = 0; + + protected $_SSRegression = 0; + + protected $_SSResiduals = 0; + + protected $_DFResiduals = 0; + + protected $_F = 0; + + protected $_slope = 0; + + protected $_slopeSE = 0; + + protected $_intersect = 0; + + protected $_intersectSE = 0; + + protected $_Xoffset = 0; + + protected $_Yoffset = 0; + + + public function getError() { + return $this->_error; + } // function getBestFitType() + + + public function getBestFitType() { + return $this->_bestFitType; + } // function getBestFitType() + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + */ + public function getValueOfYForX($xValue) { + return False; + } // function getValueOfYForX() + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + */ + public function getValueOfXForY($yValue) { + return False; + } // function getValueOfXForY() + + + /** + * Return the original set of X-Values + * + * @return float[] X-Values + */ + public function getXValues() { + return $this->_xValues; + } // function getValueOfXForY() + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getEquation($dp=0) { + return False; + } // function getEquation() + + + /** + * Return the Slope of the line + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getSlope($dp=0) { + if ($dp != 0) { + return round($this->_slope,$dp); + } + return $this->_slope; + } // function getSlope() + + + /** + * Return the standard error of the Slope + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getSlopeSE($dp=0) { + if ($dp != 0) { + return round($this->_slopeSE,$dp); + } + return $this->_slopeSE; + } // function getSlopeSE() + + + /** + * Return the Value of X where it intersects Y = 0 + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getIntersect($dp=0) { + if ($dp != 0) { + return round($this->_intersect,$dp); + } + return $this->_intersect; + } // function getIntersect() + + + /** + * Return the standard error of the Intersect + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getIntersectSE($dp=0) { + if ($dp != 0) { + return round($this->_intersectSE,$dp); + } + return $this->_intersectSE; + } // function getIntersectSE() + + + /** + * Return the goodness of fit for this regression + * + * @param int $dp Number of places of decimal precision to return + * @return float + */ + public function getGoodnessOfFit($dp=0) { + if ($dp != 0) { + return round($this->_goodnessOfFit,$dp); + } + return $this->_goodnessOfFit; + } // function getGoodnessOfFit() + + + public function getGoodnessOfFitPercent($dp=0) { + if ($dp != 0) { + return round($this->_goodnessOfFit * 100,$dp); + } + return $this->_goodnessOfFit * 100; + } // function getGoodnessOfFitPercent() + + + /** + * Return the standard deviation of the residuals for this regression + * + * @param int $dp Number of places of decimal precision to return + * @return float + */ + public function getStdevOfResiduals($dp=0) { + if ($dp != 0) { + return round($this->_stdevOfResiduals,$dp); + } + return $this->_stdevOfResiduals; + } // function getStdevOfResiduals() + + + public function getSSRegression($dp=0) { + if ($dp != 0) { + return round($this->_SSRegression,$dp); + } + return $this->_SSRegression; + } // function getSSRegression() + + + public function getSSResiduals($dp=0) { + if ($dp != 0) { + return round($this->_SSResiduals,$dp); + } + return $this->_SSResiduals; + } // function getSSResiduals() + + + public function getDFResiduals($dp=0) { + if ($dp != 0) { + return round($this->_DFResiduals,$dp); + } + return $this->_DFResiduals; + } // function getDFResiduals() + + + public function getF($dp=0) { + if ($dp != 0) { + return round($this->_F,$dp); + } + return $this->_F; + } // function getF() + + + public function getCovariance($dp=0) { + if ($dp != 0) { + return round($this->_covariance,$dp); + } + return $this->_covariance; + } // function getCovariance() + + + public function getCorrelation($dp=0) { + if ($dp != 0) { + return round($this->_correlation,$dp); + } + return $this->_correlation; + } // function getCorrelation() + + + public function getYBestFitValues() { + return $this->_yBestFitValues; + } // function getYBestFitValues() + + + protected function _calculateGoodnessOfFit($sumX,$sumY,$sumX2,$sumY2,$sumXY,$meanX,$meanY, $const) { + $SSres = $SScov = $SScor = $SStot = $SSsex = 0.0; + foreach($this->_xValues as $xKey => $xValue) { + $bestFitY = $this->_yBestFitValues[$xKey] = $this->getValueOfYForX($xValue); + + $SSres += ($this->_yValues[$xKey] - $bestFitY) * ($this->_yValues[$xKey] - $bestFitY); + if ($const) { + $SStot += ($this->_yValues[$xKey] - $meanY) * ($this->_yValues[$xKey] - $meanY); + } else { + $SStot += $this->_yValues[$xKey] * $this->_yValues[$xKey]; + } + $SScov += ($this->_xValues[$xKey] - $meanX) * ($this->_yValues[$xKey] - $meanY); + if ($const) { + $SSsex += ($this->_xValues[$xKey] - $meanX) * ($this->_xValues[$xKey] - $meanX); + } else { + $SSsex += $this->_xValues[$xKey] * $this->_xValues[$xKey]; + } + } + + $this->_SSResiduals = $SSres; + $this->_DFResiduals = $this->_valueCount - 1 - $const; + + if ($this->_DFResiduals == 0.0) { + $this->_stdevOfResiduals = 0.0; + } else { + $this->_stdevOfResiduals = sqrt($SSres / $this->_DFResiduals); + } + if (($SStot == 0.0) || ($SSres == $SStot)) { + $this->_goodnessOfFit = 1; + } else { + $this->_goodnessOfFit = 1 - ($SSres / $SStot); + } + + $this->_SSRegression = $this->_goodnessOfFit * $SStot; + $this->_covariance = $SScov / $this->_valueCount; + $this->_correlation = ($this->_valueCount * $sumXY - $sumX * $sumY) / sqrt(($this->_valueCount * $sumX2 - pow($sumX,2)) * ($this->_valueCount * $sumY2 - pow($sumY,2))); + $this->_slopeSE = $this->_stdevOfResiduals / sqrt($SSsex); + $this->_intersectSE = $this->_stdevOfResiduals * sqrt(1 / ($this->_valueCount - ($sumX * $sumX) / $sumX2)); + if ($this->_SSResiduals != 0.0) { + if ($this->_DFResiduals == 0.0) { + $this->_F = 0.0; + } else { + $this->_F = $this->_SSRegression / ($this->_SSResiduals / $this->_DFResiduals); + } + } else { + if ($this->_DFResiduals == 0.0) { + $this->_F = 0.0; + } else { + $this->_F = $this->_SSRegression / $this->_DFResiduals; + } + } + } // function _calculateGoodnessOfFit() + + + protected function _leastSquareFit($yValues, $xValues, $const) { + // calculate sums + $x_sum = array_sum($xValues); + $y_sum = array_sum($yValues); + $meanX = $x_sum / $this->_valueCount; + $meanY = $y_sum / $this->_valueCount; + $mBase = $mDivisor = $xx_sum = $xy_sum = $yy_sum = 0.0; + for($i = 0; $i < $this->_valueCount; ++$i) { + $xy_sum += $xValues[$i] * $yValues[$i]; + $xx_sum += $xValues[$i] * $xValues[$i]; + $yy_sum += $yValues[$i] * $yValues[$i]; + + if ($const) { + $mBase += ($xValues[$i] - $meanX) * ($yValues[$i] - $meanY); + $mDivisor += ($xValues[$i] - $meanX) * ($xValues[$i] - $meanX); + } else { + $mBase += $xValues[$i] * $yValues[$i]; + $mDivisor += $xValues[$i] * $xValues[$i]; + } + } + + // calculate slope +// $this->_slope = (($this->_valueCount * $xy_sum) - ($x_sum * $y_sum)) / (($this->_valueCount * $xx_sum) - ($x_sum * $x_sum)); + $this->_slope = $mBase / $mDivisor; + + // calculate intersect +// $this->_intersect = ($y_sum - ($this->_slope * $x_sum)) / $this->_valueCount; + if ($const) { + $this->_intersect = $meanY - ($this->_slope * $meanX); + } else { + $this->_intersect = 0; + } + + $this->_calculateGoodnessOfFit($x_sum,$y_sum,$xx_sum,$yy_sum,$xy_sum,$meanX,$meanY,$const); + } // function _leastSquareFit() + + + /** + * Define the regression + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + function __construct($yValues, $xValues=array(), $const=True) { + // Calculate number of points + $nY = count($yValues); + $nX = count($xValues); + + // Define X Values if necessary + if ($nX == 0) { + $xValues = range(1,$nY); + $nX = $nY; + } elseif ($nY != $nX) { + // Ensure both arrays of points are the same size + $this->_error = True; + return False; + } + + $this->_valueCount = $nY; + $this->_xValues = $xValues; + $this->_yValues = $yValues; + } // function __construct() + +} // class bestFit diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/exponentialBestFitClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/exponentialBestFitClass.php new file mode 100644 index 000000000..cc44678be --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/exponentialBestFitClass.php @@ -0,0 +1,148 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +require_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'); + + +/** + * PHPExcel_Exponential_Best_Fit + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Exponential_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $_bestFitType = 'exponential'; + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) { + return $this->getIntersect() * pow($this->getSlope(),($xValue - $this->_Xoffset)); + } // function getValueOfYForX() + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) { + return log(($yValue + $this->_Yoffset) / $this->getIntersect()) / log($this->getSlope()); + } // function getValueOfXForY() + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp=0) { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = '.$intersect.' * '.$slope.'^X'; + } // function getEquation() + + + /** + * Return the Slope of the line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getSlope($dp=0) { + if ($dp != 0) { + return round(exp($this->_slope),$dp); + } + return exp($this->_slope); + } // function getSlope() + + + /** + * Return the Value of X where it intersects Y = 0 + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getIntersect($dp=0) { + if ($dp != 0) { + return round(exp($this->_intersect),$dp); + } + return exp($this->_intersect); + } // function getIntersect() + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function _exponential_regression($yValues, $xValues, $const) { + foreach($yValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + + $this->_leastSquareFit($yValues, $xValues, $const); + } // function _exponential_regression() + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + function __construct($yValues, $xValues=array(), $const=True) { + if (parent::__construct($yValues, $xValues) !== False) { + $this->_exponential_regression($yValues, $xValues, $const); + } + } // function __construct() + +} // class exponentialBestFit \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/linearBestFitClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/linearBestFitClass.php new file mode 100644 index 000000000..9aa44fec2 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/linearBestFitClass.php @@ -0,0 +1,111 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +require_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'); + + +/** + * PHPExcel_Linear_Best_Fit + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Linear_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $_bestFitType = 'linear'; + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) { + return $this->getIntersect() + $this->getSlope() * $xValue; + } // function getValueOfYForX() + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) { + return ($yValue - $this->getIntersect()) / $this->getSlope(); + } // function getValueOfXForY() + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp=0) { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = '.$intersect.' + '.$slope.' * X'; + } // function getEquation() + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function _linear_regression($yValues, $xValues, $const) { + $this->_leastSquareFit($yValues, $xValues,$const); + } // function _linear_regression() + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + function __construct($yValues, $xValues=array(), $const=True) { + if (parent::__construct($yValues, $xValues) !== False) { + $this->_linear_regression($yValues, $xValues, $const); + } + } // function __construct() + +} // class linearBestFit \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/logarithmicBestFitClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/logarithmicBestFitClass.php new file mode 100644 index 000000000..38aaa8803 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/logarithmicBestFitClass.php @@ -0,0 +1,120 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +require_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'); + + +/** + * PHPExcel_Logarithmic_Best_Fit + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Logarithmic_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $_bestFitType = 'logarithmic'; + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) { + return $this->getIntersect() + $this->getSlope() * log($xValue - $this->_Xoffset); + } // function getValueOfYForX() + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) { + return exp(($yValue - $this->getIntersect()) / $this->getSlope()); + } // function getValueOfXForY() + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp=0) { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = '.$intersect.' + '.$slope.' * log(X)'; + } // function getEquation() + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function _logarithmic_regression($yValues, $xValues, $const) { + foreach($xValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + + $this->_leastSquareFit($yValues, $xValues, $const); + } // function _logarithmic_regression() + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + function __construct($yValues, $xValues=array(), $const=True) { + if (parent::__construct($yValues, $xValues) !== False) { + $this->_logarithmic_regression($yValues, $xValues, $const); + } + } // function __construct() + +} // class logarithmicBestFit \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/polynomialBestFitClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/polynomialBestFitClass.php new file mode 100644 index 000000000..7c05faf61 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/polynomialBestFitClass.php @@ -0,0 +1,224 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/JAMA/Matrix.php'; + + +/** + * PHPExcel_Polynomial_Best_Fit + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Polynomial_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $_bestFitType = 'polynomial'; + + /** + * Polynomial order + * + * @protected + * @var int + **/ + protected $_order = 0; + + + /** + * Return the order of this polynomial + * + * @return int + **/ + public function getOrder() { + return $this->_order; + } // function getOrder() + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) { + $retVal = $this->getIntersect(); + $slope = $this->getSlope(); + foreach($slope as $key => $value) { + if ($value != 0.0) { + $retVal += $value * pow($xValue, $key + 1); + } + } + return $retVal; + } // function getValueOfYForX() + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) { + return ($yValue - $this->getIntersect()) / $this->getSlope(); + } // function getValueOfXForY() + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp=0) { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + $equation = 'Y = '.$intersect; + foreach($slope as $key => $value) { + if ($value != 0.0) { + $equation .= ' + '.$value.' * X'; + if ($key > 0) { + $equation .= '^'.($key + 1); + } + } + } + return $equation; + } // function getEquation() + + + /** + * Return the Slope of the line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getSlope($dp=0) { + if ($dp != 0) { + $coefficients = array(); + foreach($this->_slope as $coefficient) { + $coefficients[] = round($coefficient,$dp); + } + return $coefficients; + } + return $this->_slope; + } // function getSlope() + + + public function getCoefficients($dp=0) { + return array_merge(array($this->getIntersect($dp)),$this->getSlope($dp)); + } // function getCoefficients() + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param int $order Order of Polynomial for this regression + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function _polynomial_regression($order, $yValues, $xValues, $const) { + // calculate sums + $x_sum = array_sum($xValues); + $y_sum = array_sum($yValues); + $xx_sum = $xy_sum = 0; + for($i = 0; $i < $this->_valueCount; ++$i) { + $xy_sum += $xValues[$i] * $yValues[$i]; + $xx_sum += $xValues[$i] * $xValues[$i]; + $yy_sum += $yValues[$i] * $yValues[$i]; + } + /* + * This routine uses logic from the PHP port of polyfit version 0.1 + * written by Michael Bommarito and Paul Meagher + * + * The function fits a polynomial function of order $order through + * a series of x-y data points using least squares. + * + */ + for ($i = 0; $i < $this->_valueCount; ++$i) { + for ($j = 0; $j <= $order; ++$j) { + $A[$i][$j] = pow($xValues[$i], $j); + } + } + for ($i=0; $i < $this->_valueCount; ++$i) { + $B[$i] = array($yValues[$i]); + } + $matrixA = new Matrix($A); + $matrixB = new Matrix($B); + $C = $matrixA->solve($matrixB); + + $coefficients = array(); + for($i = 0; $i < $C->m; ++$i) { + $r = $C->get($i, 0); + if (abs($r) <= pow(10, -9)) { + $r = 0; + } + $coefficients[] = $r; + } + + $this->_intersect = array_shift($coefficients); + $this->_slope = $coefficients; + + $this->_calculateGoodnessOfFit($x_sum,$y_sum,$xx_sum,$yy_sum,$xy_sum); + foreach($this->_xValues as $xKey => $xValue) { + $this->_yBestFitValues[$xKey] = $this->getValueOfYForX($xValue); + } + } // function _polynomial_regression() + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param int $order Order of Polynomial for this regression + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + function __construct($order, $yValues, $xValues=array(), $const=True) { + if (parent::__construct($yValues, $xValues) !== False) { + if ($order < $this->_valueCount) { + $this->_bestFitType .= '_'.$order; + $this->_order = $order; + $this->_polynomial_regression($order, $yValues, $xValues, $const); + if (($this->getGoodnessOfFit() < 0.0) || ($this->getGoodnessOfFit() > 1.0)) { + $this->_error = True; + } + } else { + $this->_error = True; + } + } + } // function __construct() + +} // class polynomialBestFit \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/powerBestFitClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/powerBestFitClass.php new file mode 100644 index 000000000..20b36741e --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/powerBestFitClass.php @@ -0,0 +1,142 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'; + + +/** + * PHPExcel_Power_Best_Fit + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Power_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $_bestFitType = 'power'; + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) { + return $this->getIntersect() * pow(($xValue - $this->_Xoffset),$this->getSlope()); + } // function getValueOfYForX() + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) { + return pow((($yValue + $this->_Yoffset) / $this->getIntersect()),(1 / $this->getSlope())); + } // function getValueOfXForY() + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp=0) { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = '.$intersect.' * X^'.$slope; + } // function getEquation() + + + /** + * Return the Value of X where it intersects Y = 0 + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getIntersect($dp=0) { + if ($dp != 0) { + return round(exp($this->_intersect),$dp); + } + return exp($this->_intersect); + } // function getIntersect() + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function _power_regression($yValues, $xValues, $const) { + foreach($xValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + foreach($yValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + + $this->_leastSquareFit($yValues, $xValues, $const); + } // function _power_regression() + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + function __construct($yValues, $xValues=array(), $const=True) { + if (parent::__construct($yValues, $xValues) !== False) { + $this->_power_regression($yValues, $xValues, $const); + } + } // function __construct() + +} // class powerBestFit \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/trendClass.php b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/trendClass.php new file mode 100644 index 000000000..63ccc04c3 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Shared/trend/trendClass.php @@ -0,0 +1,156 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/polynomialBestFitClass.php'; + + +/** + * PHPExcel_trendClass + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class trendClass +{ + const TREND_LINEAR = 'Linear'; + const TREND_LOGARITHMIC = 'Logarithmic'; + const TREND_EXPONENTIAL = 'Exponential'; + const TREND_POWER = 'Power'; + const TREND_POLYNOMIAL_2 = 'Polynomial_2'; + const TREND_POLYNOMIAL_3 = 'Polynomial_3'; + const TREND_POLYNOMIAL_4 = 'Polynomial_4'; + const TREND_POLYNOMIAL_5 = 'Polynomial_5'; + const TREND_POLYNOMIAL_6 = 'Polynomial_6'; + const TREND_BEST_FIT = 'Bestfit'; + const TREND_BEST_FIT_NO_POLY = 'Bestfit_no_Polynomials'; + + /** + * Names of the best-fit trend analysis methods + * + * @var string[] + **/ + private static $_trendTypes = array( self::TREND_LINEAR, + self::TREND_LOGARITHMIC, + self::TREND_EXPONENTIAL, + self::TREND_POWER + ); + /** + * Names of the best-fit trend polynomial orders + * + * @var string[] + **/ + private static $_trendTypePolyOrders = array( self::TREND_POLYNOMIAL_2, + self::TREND_POLYNOMIAL_3, + self::TREND_POLYNOMIAL_4, + self::TREND_POLYNOMIAL_5, + self::TREND_POLYNOMIAL_6 + ); + + /** + * Cached results for each method when trying to identify which provides the best fit + * + * @var PHPExcel_Best_Fit[] + **/ + private static $_trendCache = array(); + + + public static function calculate($trendType=self::TREND_BEST_FIT, $yValues, $xValues=array(), $const=True) { + // Calculate number of points in each dataset + $nY = count($yValues); + $nX = count($xValues); + + // Define X Values if necessary + if ($nX == 0) { + $xValues = range(1,$nY); + $nX = $nY; + } elseif ($nY != $nX) { + // Ensure both arrays of points are the same size + trigger_error("trend(): Number of elements in coordinate arrays do not match.", E_USER_ERROR); + } + + $key = md5($trendType.$const.serialize($yValues).serialize($xValues)); + // Determine which trend method has been requested + switch ($trendType) { + // Instantiate and return the class for the requested trend method + case self::TREND_LINEAR : + case self::TREND_LOGARITHMIC : + case self::TREND_EXPONENTIAL : + case self::TREND_POWER : + if (!isset(self::$_trendCache[$key])) { + $className = 'PHPExcel_'.$trendType.'_Best_Fit'; + self::$_trendCache[$key] = new $className($yValues,$xValues,$const); + } + return self::$_trendCache[$key]; + break; + case self::TREND_POLYNOMIAL_2 : + case self::TREND_POLYNOMIAL_3 : + case self::TREND_POLYNOMIAL_4 : + case self::TREND_POLYNOMIAL_5 : + case self::TREND_POLYNOMIAL_6 : + if (!isset(self::$_trendCache[$key])) { + $order = substr($trendType,-1); + self::$_trendCache[$key] = new PHPExcel_Polynomial_Best_Fit($order,$yValues,$xValues,$const); + } + return self::$_trendCache[$key]; + break; + case self::TREND_BEST_FIT : + case self::TREND_BEST_FIT_NO_POLY : + // If the request is to determine the best fit regression, then we test each trend line in turn + // Start by generating an instance of each available trend method + foreach(self::$_trendTypes as $trendMethod) { + $className = 'PHPExcel_'.$trendMethod.'BestFit'; + $bestFit[$trendMethod] = new $className($yValues,$xValues,$const); + $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit(); + } + if ($trendType != self::TREND_BEST_FIT_NO_POLY) { + foreach(self::$_trendTypePolyOrders as $trendMethod) { + $order = substr($trendMethod,-1); + $bestFit[$trendMethod] = new PHPExcel_Polynomial_Best_Fit($order,$yValues,$xValues,$const); + if ($bestFit[$trendMethod]->getError()) { + unset($bestFit[$trendMethod]); + } else { + $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit(); + } + } + } + // Determine which of our trend lines is the best fit, and then we return the instance of that trend class + arsort($bestFitValue); + $bestFitType = key($bestFitValue); + return $bestFit[$bestFitType]; + break; + default : + return false; + } + } // function calculate() + +} // class trendClass \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style.php new file mode 100644 index 000000000..2fdef0e4c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style.php @@ -0,0 +1,684 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style implements PHPExcel_IComparable +{ + /** + * Font + * + * @var PHPExcel_Style_Font + */ + private $_font; + + /** + * Fill + * + * @var PHPExcel_Style_Fill + */ + private $_fill; + + /** + * Borders + * + * @var PHPExcel_Style_Borders + */ + private $_borders; + + /** + * Alignment + * + * @var PHPExcel_Style_Alignment + */ + private $_alignment; + + /** + * Number Format + * + * @var PHPExcel_Style_NumberFormat + */ + private $_numberFormat; + + /** + * Conditional styles + * + * @var PHPExcel_Style_Conditional[] + */ + private $_conditionalStyles; + + /** + * Protection + * + * @var PHPExcel_Style_Protection + */ + private $_protection; + + /** + * Style supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for style supervisor + * + * @var PHPExcel + */ + private $_parent; + + /** + * Index of style in collection. Only used for real style. + * + * @var int + */ + private $_index; + + /** + * Create a new PHPExcel_Style + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + $this->_conditionalStyles = array(); + $this->_font = new PHPExcel_Style_Font($isSupervisor, $isConditional); + $this->_fill = new PHPExcel_Style_Fill($isSupervisor, $isConditional); + $this->_borders = new PHPExcel_Style_Borders($isSupervisor, $isConditional); + $this->_alignment = new PHPExcel_Style_Alignment($isSupervisor, $isConditional); + $this->_numberFormat = new PHPExcel_Style_NumberFormat($isSupervisor, $isConditional); + $this->_protection = new PHPExcel_Style_Protection($isSupervisor, $isConditional); + + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->_font->bindParent($this); + $this->_fill->bindParent($this); + $this->_borders->bindParent($this); + $this->_alignment->bindParent($this); + $this->_numberFormat->bindParent($this); + $this->_protection->bindParent($this); + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel $parent + * @return PHPExcel_Style + */ + public function bindParent($parent) + { + $this->_parent = $parent; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style + */ + public function getSharedComponent() + { + $activeSheet = $this->getActiveSheet(); + $selectedCell = $this->getActiveCell(); // e.g. 'A1' + + if ($activeSheet->cellExists($selectedCell)) { + $xfIndex = $activeSheet->getCell($selectedCell)->getXfIndex(); + } else { + $xfIndex = 0; + } + + return $this->_parent->getCellXfByIndex($xfIndex); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->_parent->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->_parent->getActiveSheet()->getActiveCell(); + } + + /** + * Get parent. Only used for style supervisor + * + * @return PHPExcel + */ + public function getParent() + { + return $this->_parent; + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->applyFromArray( + * array( + * 'font' => array( + * 'name' => 'Arial', + * 'bold' => true, + * 'italic' => false, + * 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, + * 'strike' => false, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ), + * 'borders' => array( + * 'bottom' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ), + * 'top' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @param boolean $pAdvanced Advanced mode for setting borders. + * @throws Exception + * @return PHPExcel_Style + */ + public function applyFromArray($pStyles = null, $pAdvanced = true) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + + $pRange = $this->getSelectedCells(); + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Is it a cell range or a single cell? + if (strpos($pRange, ':') === false) { + $rangeA = $pRange; + $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + // Calculate range outer borders + $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); + $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); + + // Translate column into index + $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1; + $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1; + + // Make sure we can loop upwards on rows and columns + if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { + $tmp = $rangeStart; + $rangeStart = $rangeEnd; + $rangeEnd = $tmp; + } + + // ADVANCED MODE: + + if ($pAdvanced && isset($pStyles['borders'])) { + + // 'allborders' is a shorthand property for 'outline' and 'inside' and + // it applies to components that have not been set explicitly + if (isset($pStyles['borders']['allborders'])) { + foreach (array('outline', 'inside') as $component) { + if (!isset($pStyles['borders'][$component])) { + $pStyles['borders'][$component] = $pStyles['borders']['allborders']; + } + } + unset($pStyles['borders']['allborders']); // not needed any more + } + + // 'outline' is a shorthand property for 'top', 'right', 'bottom', 'left' + // it applies to components that have not been set explicitly + if (isset($pStyles['borders']['outline'])) { + foreach (array('top', 'right', 'bottom', 'left') as $component) { + if (!isset($pStyles['borders'][$component])) { + $pStyles['borders'][$component] = $pStyles['borders']['outline']; + } + } + unset($pStyles['borders']['outline']); // not needed any more + } + + // 'inside' is a shorthand property for 'vertical' and 'horizontal' + // it applies to components that have not been set explicitly + if (isset($pStyles['borders']['inside'])) { + foreach (array('vertical', 'horizontal') as $component) { + if (!isset($pStyles['borders'][$component])) { + $pStyles['borders'][$component] = $pStyles['borders']['inside']; + } + } + unset($pStyles['borders']['inside']); // not needed any more + } + + // width and height characteristics of selection, 1, 2, or 3 (for 3 or more) + $xMax = min($rangeEnd[0] - $rangeStart[0] + 1, 3); + $yMax = min($rangeEnd[1] - $rangeStart[1] + 1, 3); + + // loop through up to 3 x 3 = 9 regions + for ($x = 1; $x <= $xMax; ++$x) { + // start column index for region + $colStart = ($x == 3) ? + PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]) + : PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $x - 1); + + // end column index for region + $colEnd = ($x == 1) ? + PHPExcel_Cell::stringFromColumnIndex($rangeStart[0]) + : PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] - $xMax + $x); + + for ($y = 1; $y <= $yMax; ++$y) { + + // which edges are touching the region + $edges = array(); + + // are we at left edge + if ($x == 1) { + $edges[] = 'left'; + } + + // are we at right edge + if ($x == $xMax) { + $edges[] = 'right'; + } + + // are we at top edge? + if ($y == 1) { + $edges[] = 'top'; + } + + // are we at bottom edge? + if ($y == $yMax) { + $edges[] = 'bottom'; + } + + // start row index for region + $rowStart = ($y == 3) ? + $rangeEnd[1] : $rangeStart[1] + $y - 1; + + // end row index for region + $rowEnd = ($y == 1) ? + $rangeStart[1] : $rangeEnd[1] - $yMax + $y; + + // build range for region + $range = $colStart . $rowStart . ':' . $colEnd . $rowEnd; + + // retrieve relevant style array for region + $regionStyles = $pStyles; + unset($regionStyles['borders']['inside']); + + // what are the inner edges of the region when looking at the selection + $innerEdges = array_diff( array('top', 'right', 'bottom', 'left'), $edges ); + + // inner edges that are not touching the region should take the 'inside' border properties if they have been set + foreach ($innerEdges as $innerEdge) { + switch ($innerEdge) { + case 'top': + case 'bottom': + // should pick up 'horizontal' border property if set + if (isset($pStyles['borders']['horizontal'])) { + $regionStyles['borders'][$innerEdge] = $pStyles['borders']['horizontal']; + } else { + unset($regionStyles['borders'][$innerEdge]); + } + break; + case 'left': + case 'right': + // should pick up 'vertical' border property if set + if (isset($pStyles['borders']['vertical'])) { + $regionStyles['borders'][$innerEdge] = $pStyles['borders']['vertical']; + } else { + unset($regionStyles['borders'][$innerEdge]); + } + break; + } + } + + // apply region style to region by calling applyFromArray() in simple mode + $this->getActiveSheet()->getStyle($range)->applyFromArray($regionStyles, false); + } + } + return $this; + } + + // SIMPLE MODE: + + // Selection type, inspect + if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) { + $selectionType = 'COLUMN'; + } else if (preg_match('/^A[0-9]+:XFD[0-9]+$/', $pRange)) { + $selectionType = 'ROW'; + } else { + $selectionType = 'CELL'; + } + + // First loop through columns, rows, or cells to find out which styles are affected by this operation + switch ($selectionType) { + case 'COLUMN': + $oldXfIndexes = array(); + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + $oldXfIndexes[$this->getActiveSheet()->getColumnDimensionByColumn($col)->getXfIndex()] = true; + } + break; + + case 'ROW': + $oldXfIndexes = array(); + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + if ($this->getActiveSheet()->getRowDimension($row)->getXfIndex() == null) { + $oldXfIndexes[0] = true; // row without explicit style should be formatted based on default style + } else { + $oldXfIndexes[$this->getActiveSheet()->getRowDimension($row)->getXfIndex()] = true; + } + } + break; + + case 'CELL': + $oldXfIndexes = array(); + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $oldXfIndexes[$this->getActiveSheet()->getCellByColumnAndRow($col, $row)->getXfIndex()] = true; + } + } + break; + } + + // clone each of the affected styles, apply the style arrray, and add the new styles to the workbook + $workbook = $this->getActiveSheet()->getParent(); + foreach ($oldXfIndexes as $oldXfIndex => $dummy) { + $style = $workbook->getCellXfByIndex($oldXfIndex); + $newStyle = clone $style; + $newStyle->applyFromArray($pStyles); + + if ($existingStyle = $workbook->getCellXfByHashCode($newStyle->getHashCode())) { + // there is already such cell Xf in our collection + $newXfIndexes[$oldXfIndex] = $existingStyle->getIndex(); + } else { + // we don't have such a cell Xf, need to add + $workbook->addCellXf($newStyle); + $newXfIndexes[$oldXfIndex] = $newStyle->getIndex(); + } + } + + // Loop through columns, rows, or cells again and update the XF index + switch ($selectionType) { + case 'COLUMN': + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + $columnDimension = $this->getActiveSheet()->getColumnDimensionByColumn($col); + $oldXfIndex = $columnDimension->getXfIndex(); + $columnDimension->setXfIndex($newXfIndexes[$oldXfIndex]); + } + break; + + case 'ROW': + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $rowDimension = $this->getActiveSheet()->getRowDimension($row); + $oldXfIndex = $rowDimension->getXfIndex() === null ? + 0 : $rowDimension->getXfIndex(); // row without explicit style should be formatted based on default style + $rowDimension->setXfIndex($newXfIndexes[$oldXfIndex]); + } + break; + + case 'CELL': + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $cell = $this->getActiveSheet()->getCellByColumnAndRow($col, $row); + $oldXfIndex = $cell->getXfIndex(); + $cell->setXfIndex($newXfIndexes[$oldXfIndex]); + } + } + break; + } + + } else { + // not a supervisor, just apply the style array directly on style object + if (array_key_exists('fill', $pStyles)) { + $this->getFill()->applyFromArray($pStyles['fill']); + } + if (array_key_exists('font', $pStyles)) { + $this->getFont()->applyFromArray($pStyles['font']); + } + if (array_key_exists('borders', $pStyles)) { + $this->getBorders()->applyFromArray($pStyles['borders']); + } + if (array_key_exists('alignment', $pStyles)) { + $this->getAlignment()->applyFromArray($pStyles['alignment']); + } + if (array_key_exists('numberformat', $pStyles)) { + $this->getNumberFormat()->applyFromArray($pStyles['numberformat']); + } + if (array_key_exists('protection', $pStyles)) { + $this->getProtection()->applyFromArray($pStyles['protection']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Fill + * + * @return PHPExcel_Style_Fill + */ + public function getFill() { + return $this->_fill; + } + + /** + * Get Font + * + * @return PHPExcel_Style_Font + */ + public function getFont() { + return $this->_font; + } + + /** + * Set font + * + * @param PHPExcel_Style_Font $font + * @return PHPExcel_Style + */ + public function setFont(PHPExcel_Style_Font $font) + { + $this->_font = $font; + return $this; + } + + /** + * Get Borders + * + * @return PHPExcel_Style_Borders + */ + public function getBorders() { + return $this->_borders; + } + + /** + * Get Alignment + * + * @return PHPExcel_Style_Alignment + */ + public function getAlignment() { + return $this->_alignment; + } + + /** + * Get Number Format + * + * @return PHPExcel_Style_NumberFormat + */ + public function getNumberFormat() { + return $this->_numberFormat; + } + + /** + * Get Conditional Styles. Only used on supervisor. + * + * @return PHPExcel_Style_Conditional[] + */ + public function getConditionalStyles() { + return $this->getActiveSheet()->getConditionalStyles($this->getActiveCell()); + } + + /** + * Set Conditional Styles. Only used on supervisor. + * + * @param PHPExcel_Style_Conditional[] $pValue Array of condtional styles + * @return PHPExcel_Style + */ + public function setConditionalStyles($pValue = null) { + if (is_array($pValue)) { + $this->getActiveSheet()->setConditionalStyles($this->getSelectedCells(), $pValue); + } + return $this; + } + + /** + * Get Protection + * + * @return PHPExcel_Style_Protection + */ + public function getProtection() { + return $this->_protection; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + $hashConditionals = ''; + foreach ($this->_conditionalStyles as $conditional) { + $hashConditionals .= $conditional->getHashCode(); + } + + return md5( + $this->_fill->getHashCode() + . $this->_font->getHashCode() + . $this->_borders->getHashCode() + . $this->_alignment->getHashCode() + . $this->_numberFormat->getHashCode() + . $hashConditionals + . $this->_protection->getHashCode() + . __CLASS__ + ); + } + + /** + * Get own index in style collection + * + * @return int + */ + public function getIndex() + { + return $this->_index; + } + + /** + * Set own index in style collection + * + * @param int $pValue + */ + public function setIndex($pValue) + { + $this->_index = $pValue; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Alignment.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Alignment.php new file mode 100644 index 000000000..81ca387c5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Alignment.php @@ -0,0 +1,494 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Alignment + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Alignment implements PHPExcel_IComparable +{ + /* Horizontal alignment styles */ + const HORIZONTAL_GENERAL = 'general'; + const HORIZONTAL_LEFT = 'left'; + const HORIZONTAL_RIGHT = 'right'; + const HORIZONTAL_CENTER = 'center'; + const HORIZONTAL_CENTER_CONTINUOUS = 'centerContinuous'; + const HORIZONTAL_JUSTIFY = 'justify'; + + /* Vertical alignment styles */ + const VERTICAL_BOTTOM = 'bottom'; + const VERTICAL_TOP = 'top'; + const VERTICAL_CENTER = 'center'; + const VERTICAL_JUSTIFY = 'justify'; + + /** + * Horizontal + * + * @var string + */ + private $_horizontal = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + + /** + * Vertical + * + * @var string + */ + private $_vertical = PHPExcel_Style_Alignment::VERTICAL_BOTTOM; + + /** + * Text rotation + * + * @var int + */ + private $_textRotation = 0; + + /** + * Wrap text + * + * @var boolean + */ + private $_wrapText = false; + + /** + * Shrink to fit + * + * @var boolean + */ + private $_shrinkToFit = false; + + /** + * Indent - only possible with horizontal alignment left and right + * + * @var int + */ + private $_indent = 0; + + /** + * Parent Borders + * + * @var _parentPropertyName string + */ + private $_parentPropertyName; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + private $_parent; + + /** + * Create a new PHPExcel_Style_Alignment + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + if ($isConditional) { + $this->_horizontal = NULL; + $this->_vertical = NULL; + $this->_textRotation = NULL; + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel $parent + * @return PHPExcel_Style_Alignment + */ + public function bindParent($parent) + { + $this->_parent = $parent; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Alignment + */ + public function getSharedComponent() + { + return $this->_parent->getSharedComponent()->getAlignment(); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('alignment' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray( + * array( + * 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER, + * 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER, + * 'rotation' => 0, + * 'wrap' => true + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Alignment + */ + public function applyFromArray($pStyles = null) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('horizontal', $pStyles)) { + $this->setHorizontal($pStyles['horizontal']); + } + if (array_key_exists('vertical', $pStyles)) { + $this->setVertical($pStyles['vertical']); + } + if (array_key_exists('rotation', $pStyles)) { + $this->setTextRotation($pStyles['rotation']); + } + if (array_key_exists('wrap', $pStyles)) { + $this->setWrapText($pStyles['wrap']); + } + if (array_key_exists('shrinkToFit', $pStyles)) { + $this->setShrinkToFit($pStyles['shrinkToFit']); + } + if (array_key_exists('indent', $pStyles)) { + $this->setIndent($pStyles['indent']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Horizontal + * + * @return string + */ + public function getHorizontal() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHorizontal(); + } + return $this->_horizontal; + } + + /** + * Set Horizontal + * + * @param string $pValue + * @return PHPExcel_Style_Alignment + */ + public function setHorizontal($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL) { + if ($pValue == '') { + $pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + } + + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('horizontal' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } + else { + $this->_horizontal = $pValue; + } + return $this; + } + + /** + * Get Vertical + * + * @return string + */ + public function getVertical() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getVertical(); + } + return $this->_vertical; + } + + /** + * Set Vertical + * + * @param string $pValue + * @return PHPExcel_Style_Alignment + */ + public function setVertical($pValue = PHPExcel_Style_Alignment::VERTICAL_BOTTOM) { + if ($pValue == '') { + $pValue = PHPExcel_Style_Alignment::VERTICAL_BOTTOM; + } + + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('vertical' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_vertical = $pValue; + } + return $this; + } + + /** + * Get TextRotation + * + * @return int + */ + public function getTextRotation() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getTextRotation(); + } + return $this->_textRotation; + } + + /** + * Set TextRotation + * + * @param int $pValue + * @throws Exception + * @return PHPExcel_Style_Alignment + */ + public function setTextRotation($pValue = 0) { + // Excel2007 value 255 => PHPExcel value -165 + if ($pValue == 255) { + $pValue = -165; + } + + // Set rotation + if ( ($pValue >= -90 && $pValue <= 90) || $pValue == -165 ) { + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('rotation' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_textRotation = $pValue; + } + } else { + throw new Exception("Text rotation should be a value between -90 and 90."); + } + + return $this; + } + + /** + * Get Wrap Text + * + * @return boolean + */ + public function getWrapText() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getWrapText(); + } + return $this->_wrapText; + } + + /** + * Set Wrap Text + * + * @param boolean $pValue + * @return PHPExcel_Style_Alignment + */ + public function setWrapText($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('wrap' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_wrapText = $pValue; + } + return $this; + } + + /** + * Get Shrink to fit + * + * @return boolean + */ + public function getShrinkToFit() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getShrinkToFit(); + } + return $this->_shrinkToFit; + } + + /** + * Set Shrink to fit + * + * @param boolean $pValue + * @return PHPExcel_Style_Alignment + */ + public function setShrinkToFit($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('shrinkToFit' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_shrinkToFit = $pValue; + } + return $this; + } + + /** + * Get indent + * + * @return int + */ + public function getIndent() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getIndent(); + } + return $this->_indent; + } + + /** + * Set indent + * + * @param int $pValue + * @return PHPExcel_Style_Alignment + */ + public function setIndent($pValue = 0) { + if ($pValue > 0) { + if ($this->getHorizontal() != self::HORIZONTAL_GENERAL && $this->getHorizontal() != self::HORIZONTAL_LEFT && $this->getHorizontal() != self::HORIZONTAL_RIGHT) { + $pValue = 0; // indent not supported + } + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('indent' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_indent = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->_horizontal + . $this->_vertical + . $this->_textRotation + . ($this->_wrapText ? 't' : 'f') + . ($this->_shrinkToFit ? 't' : 'f') + . $this->_indent + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Border.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Border.php new file mode 100644 index 000000000..6f8767fb2 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Border.php @@ -0,0 +1,388 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Border + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Border implements PHPExcel_IComparable +{ + /* Border style */ + const BORDER_NONE = 'none'; + const BORDER_DASHDOT = 'dashDot'; + const BORDER_DASHDOTDOT = 'dashDotDot'; + const BORDER_DASHED = 'dashed'; + const BORDER_DOTTED = 'dotted'; + const BORDER_DOUBLE = 'double'; + const BORDER_HAIR = 'hair'; + const BORDER_MEDIUM = 'medium'; + const BORDER_MEDIUMDASHDOT = 'mediumDashDot'; + const BORDER_MEDIUMDASHDOTDOT = 'mediumDashDotDot'; + const BORDER_MEDIUMDASHED = 'mediumDashed'; + const BORDER_SLANTDASHDOT = 'slantDashDot'; + const BORDER_THICK = 'thick'; + const BORDER_THIN = 'thin'; + + /** + * Border style + * + * @var string + */ + private $_borderStyle = PHPExcel_Style_Border::BORDER_NONE; + + /** + * Border color + * + * @var PHPExcel_Style_Color + */ + private $_color; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style_Borders + */ + private $_parent; + + /** + * Parent property name + * + * @var string + */ + private $_parentPropertyName; + + /** + * Create a new PHPExcel_Style_Border + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + $this->_color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor); + + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->_color->bindParent($this, '_color'); + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style_Borders $parent + * @param string $parentPropertyName + * @return PHPExcel_Style_Border + */ + public function bindParent($parent, $parentPropertyName) + { + $this->_parent = $parent; + $this->_parentPropertyName = $parentPropertyName; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Border + * @throws Exception + */ + public function getSharedComponent() + { + switch ($this->_parentPropertyName) { + case '_allBorders': + case '_horizontal': + case '_inside': + case '_outline': + case '_vertical': + throw new Exception('Cannot get shared component for a pseudo-border.'); + break; + + case '_bottom': + return $this->_parent->getSharedComponent()->getBottom(); + break; + + case '_diagonal': + return $this->_parent->getSharedComponent()->getDiagonal(); + break; + + case '_left': + return $this->_parent->getSharedComponent()->getLeft(); + break; + + case '_right': + return $this->_parent->getSharedComponent()->getRight(); + break; + + case '_top': + return $this->_parent->getSharedComponent()->getTop(); + break; + + } + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + switch ($this->_parentPropertyName) { + case '_allBorders': + $key = 'allborders'; + break; + + case '_bottom': + $key = 'bottom'; + break; + + case '_diagonal': + $key = 'diagonal'; + break; + + case '_horizontal': + $key = 'horizontal'; + break; + + case '_inside': + $key = 'inside'; + break; + + case '_left': + $key = 'left'; + break; + + case '_outline': + $key = 'outline'; + break; + + case '_right': + $key = 'right'; + break; + + case '_top': + $key = 'top'; + break; + + case '_vertical': + $key = 'vertical'; + break; + } + return $this->_parent->getStyleArray(array($key => $array)); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getTop()->applyFromArray( + * array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Border + */ + public function applyFromArray($pStyles = null) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('style', $pStyles)) { + $this->setBorderStyle($pStyles['style']); + } + if (array_key_exists('color', $pStyles)) { + $this->getColor()->applyFromArray($pStyles['color']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Border style + * + * @return string + */ + public function getBorderStyle() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getBorderStyle(); + } + return $this->_borderStyle; + } + + /** + * Set Border style + * + * @param string $pValue + * @return PHPExcel_Style_Border + */ + public function setBorderStyle($pValue = PHPExcel_Style_Border::BORDER_NONE) { + + if ($pValue == '') { + $pValue = PHPExcel_Style_Border::BORDER_NONE; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('style' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_borderStyle = $pValue; + } + return $this; + } + + /** + * Get Border Color + * + * @return PHPExcel_Style_Color + */ + public function getColor() { + return $this->_color; + } + + /** + * Set Border Color + * + * @param PHPExcel_Style_Color $pValue + * @throws Exception + * @return PHPExcel_Style_Border + */ + public function setColor(PHPExcel_Style_Color $pValue = null) { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->_isSupervisor) { + $styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_color = $color; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->_borderStyle + . $this->_color->getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Borders.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Borders.php new file mode 100644 index 000000000..d8a3196e3 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Borders.php @@ -0,0 +1,512 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Borders + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Borders implements PHPExcel_IComparable +{ + /* Diagonal directions */ + const DIAGONAL_NONE = 0; + const DIAGONAL_UP = 1; + const DIAGONAL_DOWN = 2; + const DIAGONAL_BOTH = 3; + + /** + * Left + * + * @var PHPExcel_Style_Border + */ + private $_left; + + /** + * Right + * + * @var PHPExcel_Style_Border + */ + private $_right; + + /** + * Top + * + * @var PHPExcel_Style_Border + */ + private $_top; + + /** + * Bottom + * + * @var PHPExcel_Style_Border + */ + private $_bottom; + + /** + * Diagonal + * + * @var PHPExcel_Style_Border + */ + private $_diagonal; + + /** + * DiagonalDirection + * + * @var int + */ + private $_diagonalDirection; + + /** + * All borders psedo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + private $_allBorders; + + /** + * Outline psedo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + private $_outline; + + /** + * Inside psedo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + private $_inside; + + /** + * Vertical pseudo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + private $_vertical; + + /** + * Horizontal pseudo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + private $_horizontal; + + /** + * Parent Borders + * + * @var _parentPropertyName string + */ + private $_parentPropertyName; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + private $_parent; + + /** + * Create a new PHPExcel_Style_Borders + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + $this->_left = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->_right = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->_top = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->_bottom = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->_diagonal = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->_diagonalDirection = PHPExcel_Style_Borders::DIAGONAL_NONE; + + // Specially for supervisor + if ($isSupervisor) { + // Initialize pseudo-borders + $this->_allBorders = new PHPExcel_Style_Border(true); + $this->_outline = new PHPExcel_Style_Border(true); + $this->_inside = new PHPExcel_Style_Border(true); + $this->_vertical = new PHPExcel_Style_Border(true); + $this->_horizontal = new PHPExcel_Style_Border(true); + + // bind parent if we are a supervisor + $this->_left->bindParent($this, '_left'); + $this->_right->bindParent($this, '_right'); + $this->_top->bindParent($this, '_top'); + $this->_bottom->bindParent($this, '_bottom'); + $this->_diagonal->bindParent($this, '_diagonal'); + $this->_allBorders->bindParent($this, '_allBorders'); + $this->_outline->bindParent($this, '_outline'); + $this->_inside->bindParent($this, '_inside'); + $this->_vertical->bindParent($this, '_vertical'); + $this->_horizontal->bindParent($this, '_horizontal'); + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style $parent + * @return PHPExcel_Style_Borders + */ + public function bindParent($parent) + { + $this->_parent = $parent; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Borders + */ + public function getSharedComponent() + { + return $this->_parent->getSharedComponent()->getBorders(); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('borders' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( + * array( + * 'bottom' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ), + * 'top' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ) + * ); + * </code> + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( + * array( + * 'allborders' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Borders + */ + public function applyFromArray($pStyles = null) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('left', $pStyles)) { + $this->getLeft()->applyFromArray($pStyles['left']); + } + if (array_key_exists('right', $pStyles)) { + $this->getRight()->applyFromArray($pStyles['right']); + } + if (array_key_exists('top', $pStyles)) { + $this->getTop()->applyFromArray($pStyles['top']); + } + if (array_key_exists('bottom', $pStyles)) { + $this->getBottom()->applyFromArray($pStyles['bottom']); + } + if (array_key_exists('diagonal', $pStyles)) { + $this->getDiagonal()->applyFromArray($pStyles['diagonal']); + } + if (array_key_exists('diagonaldirection', $pStyles)) { + $this->setDiagonalDirection($pStyles['diagonaldirection']); + } + if (array_key_exists('allborders', $pStyles)) { + $this->getLeft()->applyFromArray($pStyles['allborders']); + $this->getRight()->applyFromArray($pStyles['allborders']); + $this->getTop()->applyFromArray($pStyles['allborders']); + $this->getBottom()->applyFromArray($pStyles['allborders']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Left + * + * @return PHPExcel_Style_Border + */ + public function getLeft() { + return $this->_left; + } + + /** + * Get Right + * + * @return PHPExcel_Style_Border + */ + public function getRight() { + return $this->_right; + } + + /** + * Get Top + * + * @return PHPExcel_Style_Border + */ + public function getTop() { + return $this->_top; + } + + /** + * Get Bottom + * + * @return PHPExcel_Style_Border + */ + public function getBottom() { + return $this->_bottom; + } + + /** + * Get Diagonal + * + * @return PHPExcel_Style_Border + */ + public function getDiagonal() { + return $this->_diagonal; + } + + /** + * Get AllBorders (pseudo-border). Only applies to supervisor. + * + * @return PHPExcel_Style_Border + * @throws Exception + */ + public function getAllBorders() { + if (!$this->_isSupervisor) { + throw new Exception('Can only get pseudo-border for supervisor.'); + } + return $this->_allBorders; + } + + /** + * Get Outline (pseudo-border). Only applies to supervisor. + * + * @return boolean + * @throws Exception + */ + public function getOutline() { + if (!$this->_isSupervisor) { + throw new Exception('Can only get pseudo-border for supervisor.'); + } + return $this->_outline; + } + + /** + * Get Inside (pseudo-border). Only applies to supervisor. + * + * @return boolean + * @throws Exception + */ + public function getInside() { + if (!$this->_isSupervisor) { + throw new Exception('Can only get pseudo-border for supervisor.'); + } + return $this->_inside; + } + + /** + * Get Vertical (pseudo-border). Only applies to supervisor. + * + * @return PHPExcel_Style_Border + * @throws Exception + */ + public function getVertical() { + if (!$this->_isSupervisor) { + throw new Exception('Can only get pseudo-border for supervisor.'); + } + return $this->_vertical; + } + + /** + * Get Horizontal (pseudo-border). Only applies to supervisor. + * + * @return PHPExcel_Style_Border + * @throws Exception + */ + public function getHorizontal() { + if (!$this->_isSupervisor) { + throw new Exception('Can only get pseudo-border for supervisor.'); + } + return $this->_horizontal; + } + + /** + * Get DiagonalDirection + * + * @return int + */ + public function getDiagonalDirection() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getDiagonalDirection(); + } + return $this->_diagonalDirection; + } + + /** + * Set DiagonalDirection + * + * @param int $pValue + * @return PHPExcel_Style_Borders + */ + public function setDiagonalDirection($pValue = PHPExcel_Style_Borders::DIAGONAL_NONE) { + if ($pValue == '') { + $pValue = PHPExcel_Style_Borders::DIAGONAL_NONE; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('diagonaldirection' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_diagonalDirection = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashcode(); + } + return md5( + $this->getLeft()->getHashCode() + . $this->getRight()->getHashCode() + . $this->getTop()->getHashCode() + . $this->getBottom()->getHashCode() + . $this->getDiagonal()->getHashCode() + . $this->getDiagonalDirection() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Color.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Color.php new file mode 100644 index 000000000..1c0f3f680 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Color.php @@ -0,0 +1,510 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Color + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Color implements PHPExcel_IComparable +{ + /* Colors */ + const COLOR_BLACK = 'FF000000'; + const COLOR_WHITE = 'FFFFFFFF'; + const COLOR_RED = 'FFFF0000'; + const COLOR_DARKRED = 'FF800000'; + const COLOR_BLUE = 'FF0000FF'; + const COLOR_DARKBLUE = 'FF000080'; + const COLOR_GREEN = 'FF00FF00'; + const COLOR_DARKGREEN = 'FF008000'; + const COLOR_YELLOW = 'FFFFFF00'; + const COLOR_DARKYELLOW = 'FF808000'; + + /** + * Indexed colors array + * + * @var array + */ + private static $_indexedColors; + + /** + * ARGB - Alpha RGB + * + * @var string + */ + private $_argb = NULL; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var mixed + */ + private $_parent; + + /** + * Parent property name + * + * @var string + */ + private $_parentPropertyName; + + + /** + * Create a new PHPExcel_Style_Color + * + * @param string $pARGB ARGB value for the colour + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($pARGB = PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + if (!$isConditional) { + $this->_argb = $pARGB; + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param mixed $parent + * @param string $parentPropertyName + * @return PHPExcel_Style_Color + */ + public function bindParent($parent, $parentPropertyName) + { + $this->_parent = $parent; + $this->_parentPropertyName = $parentPropertyName; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Color + */ + public function getSharedComponent() + { + switch ($this->_parentPropertyName) { + case '_endColor': + return $this->_parent->getSharedComponent()->getEndColor(); break; + case '_color': + return $this->_parent->getSharedComponent()->getColor(); break; + case '_startColor': + return $this->_parent->getSharedComponent()->getStartColor(); break; + } + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + switch ($this->_parentPropertyName) { + case '_endColor': + $key = 'endcolor'; + break; + case '_color': + $key = 'color'; + break; + case '_startColor': + $key = 'startcolor'; + break; + + } + return $this->_parent->getStyleArray(array($key => $array)); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->getColor()->applyFromArray( array('rgb' => '808080') ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Color + */ + public function applyFromArray($pStyles = NULL) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('rgb', $pStyles)) { + $this->setRGB($pStyles['rgb']); + } + if (array_key_exists('argb', $pStyles)) { + $this->setARGB($pStyles['argb']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get ARGB + * + * @return string + */ + public function getARGB() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getARGB(); + } + return $this->_argb; + } + + /** + * Set ARGB + * + * @param string $pValue + * @return PHPExcel_Style_Color + */ + public function setARGB($pValue = PHPExcel_Style_Color::COLOR_BLACK) { + if ($pValue == '') { + $pValue = PHPExcel_Style_Color::COLOR_BLACK; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('argb' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_argb = $pValue; + } + return $this; + } + + /** + * Get RGB + * + * @return string + */ + public function getRGB() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getRGB(); + } + return substr($this->_argb, 2); + } + + /** + * Set RGB + * + * @param string $pValue RGB value + * @return PHPExcel_Style_Color + */ + public function setRGB($pValue = '000000') { + if ($pValue == '') { + $pValue = '000000'; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('argb' => 'FF' . $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_argb = 'FF' . $pValue; + } + return $this; + } + + /** + * Get a specified colour component of an RGB value + * + * @private + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param int $offset Position within the RGB value to extract + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The extracted colour component + */ + private static function _getColourComponent($RGB,$offset,$hex=TRUE) { + $colour = substr($RGB, $offset, 2); + if (!$hex) + $colour = hexdec($colour); + return $colour; + } + + /** + * Get the red colour component of an RGB value + * + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The red colour component + */ + public static function getRed($RGB,$hex=TRUE) { + if (strlen($RGB) == 8) { + return self::_getColourComponent($RGB, 2, $hex); + } elseif (strlen($RGB) == 6) { + return self::_getColourComponent($RGB, 0, $hex); + } + } + + /** + * Get the green colour component of an RGB value + * + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The green colour component + */ + public static function getGreen($RGB,$hex=TRUE) { + if (strlen($RGB) == 8) { + return self::_getColourComponent($RGB, 4, $hex); + } elseif (strlen($RGB) == 6) { + return self::_getColourComponent($RGB, 2, $hex); + } + } + + /** + * Get the blue colour component of an RGB value + * + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The blue colour component + */ + public static function getBlue($RGB,$hex=TRUE) { + if (strlen($RGB) == 8) { + return self::_getColourComponent($RGB, 6, $hex); + } elseif (strlen($RGB) == 6) { + return self::_getColourComponent($RGB, 4, $hex); + } + } + + /** + * Adjust the brightness of a color + * + * @param string $hex The colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE) + * @param float $adjustPercentage The percentage by which to adjust the colour as a float from -1 to 1 + * @return string The adjusted colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE) + */ + public static function changeBrightness($hex, $adjustPercentage) { + $rgba = (strlen($hex) == 8); + + $red = self::getRed($hex, FALSE); + $green = self::getGreen($hex, FALSE); + $blue = self::getBlue($hex, FALSE); + if ($adjustPercentage > 0) { + $red += (255 - $red) * $adjustPercentage; + $green += (255 - $green) * $adjustPercentage; + $blue += (255 - $blue) * $adjustPercentage; + } else { + $red += $red * $adjustPercentage; + $green += $green * $adjustPercentage; + $blue += $blue * $adjustPercentage; + } + + if ($red < 0) $red = 0; + elseif ($red > 255) $red = 255; + if ($green < 0) $green = 0; + elseif ($green > 255) $green = 255; + if ($blue < 0) $blue = 0; + elseif ($blue > 255) $blue = 255; + + $rgb = strtoupper( str_pad(dechex($red), 2, '0', 0) . + str_pad(dechex($green), 2, '0', 0) . + str_pad(dechex($blue), 2, '0', 0) + ); + return (($rgba) ? 'FF' : '') . $rgb; + } + + /** + * Get indexed color + * + * @param int $pIndex Index entry point into the colour array + * @param boolean $background Flag to indicate whether default background or foreground colour + * should be returned if the indexed colour doesn't exist + * @return PHPExcel_Style_Color + */ + public static function indexedColor($pIndex, $background=FALSE) { + // Clean parameter + $pIndex = intval($pIndex); + + // Indexed colors + if (is_null(self::$_indexedColors)) { + self::$_indexedColors = array( + 1 => 'FF000000', // System Colour #1 - Black + 2 => 'FFFFFFFF', // System Colour #2 - White + 3 => 'FFFF0000', // System Colour #3 - Red + 4 => 'FF00FF00', // System Colour #4 - Green + 5 => 'FF0000FF', // System Colour #5 - Blue + 6 => 'FFFFFF00', // System Colour #6 - Yellow + 7 => 'FFFF00FF', // System Colour #7- Magenta + 8 => 'FF00FFFF', // System Colour #8- Cyan + 9 => 'FF800000', // Standard Colour #9 + 10 => 'FF008000', // Standard Colour #10 + 11 => 'FF000080', // Standard Colour #11 + 12 => 'FF808000', // Standard Colour #12 + 13 => 'FF800080', // Standard Colour #13 + 14 => 'FF008080', // Standard Colour #14 + 15 => 'FFC0C0C0', // Standard Colour #15 + 16 => 'FF808080', // Standard Colour #16 + 17 => 'FF9999FF', // Chart Fill Colour #17 + 18 => 'FF993366', // Chart Fill Colour #18 + 19 => 'FFFFFFCC', // Chart Fill Colour #19 + 20 => 'FFCCFFFF', // Chart Fill Colour #20 + 21 => 'FF660066', // Chart Fill Colour #21 + 22 => 'FFFF8080', // Chart Fill Colour #22 + 23 => 'FF0066CC', // Chart Fill Colour #23 + 24 => 'FFCCCCFF', // Chart Fill Colour #24 + 25 => 'FF000080', // Chart Line Colour #25 + 26 => 'FFFF00FF', // Chart Line Colour #26 + 27 => 'FFFFFF00', // Chart Line Colour #27 + 28 => 'FF00FFFF', // Chart Line Colour #28 + 29 => 'FF800080', // Chart Line Colour #29 + 30 => 'FF800000', // Chart Line Colour #30 + 31 => 'FF008080', // Chart Line Colour #31 + 32 => 'FF0000FF', // Chart Line Colour #32 + 33 => 'FF00CCFF', // Standard Colour #33 + 34 => 'FFCCFFFF', // Standard Colour #34 + 35 => 'FFCCFFCC', // Standard Colour #35 + 36 => 'FFFFFF99', // Standard Colour #36 + 37 => 'FF99CCFF', // Standard Colour #37 + 38 => 'FFFF99CC', // Standard Colour #38 + 39 => 'FFCC99FF', // Standard Colour #39 + 40 => 'FFFFCC99', // Standard Colour #40 + 41 => 'FF3366FF', // Standard Colour #41 + 42 => 'FF33CCCC', // Standard Colour #42 + 43 => 'FF99CC00', // Standard Colour #43 + 44 => 'FFFFCC00', // Standard Colour #44 + 45 => 'FFFF9900', // Standard Colour #45 + 46 => 'FFFF6600', // Standard Colour #46 + 47 => 'FF666699', // Standard Colour #47 + 48 => 'FF969696', // Standard Colour #48 + 49 => 'FF003366', // Standard Colour #49 + 50 => 'FF339966', // Standard Colour #50 + 51 => 'FF003300', // Standard Colour #51 + 52 => 'FF333300', // Standard Colour #52 + 53 => 'FF993300', // Standard Colour #53 + 54 => 'FF993366', // Standard Colour #54 + 55 => 'FF333399', // Standard Colour #55 + 56 => 'FF333333' // Standard Colour #56 + ); + } + + if (array_key_exists($pIndex, self::$_indexedColors)) { + return new PHPExcel_Style_Color(self::$_indexedColors[$pIndex]); + } + + if ($background) { + return new PHPExcel_Style_Color('FFFFFFFF'); + } + return new PHPExcel_Style_Color('FF000000'); + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->_argb + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Conditional.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Conditional.php new file mode 100644 index 000000000..d9f7dd4cf --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Conditional.php @@ -0,0 +1,277 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Conditional + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Conditional implements PHPExcel_IComparable +{ + /* Condition types */ + const CONDITION_NONE = 'none'; + const CONDITION_CELLIS = 'cellIs'; + const CONDITION_CONTAINSTEXT = 'containsText'; + const CONDITION_EXPRESSION = 'expression'; + + /* Operator types */ + const OPERATOR_NONE = ''; + const OPERATOR_BEGINSWITH = 'beginsWith'; + const OPERATOR_ENDSWITH = 'endsWith'; + const OPERATOR_EQUAL = 'equal'; + const OPERATOR_GREATERTHAN = 'greaterThan'; + const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual'; + const OPERATOR_LESSTHAN = 'lessThan'; + const OPERATOR_LESSTHANOREQUAL = 'lessThanOrEqual'; + const OPERATOR_NOTEQUAL = 'notEqual'; + const OPERATOR_CONTAINSTEXT = 'containsText'; + const OPERATOR_NOTCONTAINS = 'notContains'; + const OPERATOR_BETWEEN = 'between'; + + /** + * Condition type + * + * @var int + */ + private $_conditionType; + + /** + * Operator type + * + * @var int + */ + private $_operatorType; + + /** + * Text + * + * @var string + */ + private $_text; + + /** + * Condition + * + * @var string[] + */ + private $_condition = array(); + + /** + * Style + * + * @var PHPExcel_Style + */ + private $_style; + + /** + * Create a new PHPExcel_Style_Conditional + */ + public function __construct() + { + // Initialise values + $this->_conditionType = PHPExcel_Style_Conditional::CONDITION_NONE; + $this->_operatorType = PHPExcel_Style_Conditional::OPERATOR_NONE; + $this->_text = null; + $this->_condition = array(); + $this->_style = new PHPExcel_Style(FALSE, TRUE); + } + + /** + * Get Condition type + * + * @return string + */ + public function getConditionType() { + return $this->_conditionType; + } + + /** + * Set Condition type + * + * @param string $pValue PHPExcel_Style_Conditional condition type + * @return PHPExcel_Style_Conditional + */ + public function setConditionType($pValue = PHPExcel_Style_Conditional::CONDITION_NONE) { + $this->_conditionType = $pValue; + return $this; + } + + /** + * Get Operator type + * + * @return string + */ + public function getOperatorType() { + return $this->_operatorType; + } + + /** + * Set Operator type + * + * @param string $pValue PHPExcel_Style_Conditional operator type + * @return PHPExcel_Style_Conditional + */ + public function setOperatorType($pValue = PHPExcel_Style_Conditional::OPERATOR_NONE) { + $this->_operatorType = $pValue; + return $this; + } + + /** + * Get text + * + * @return string + */ + public function getText() { + return $this->_text; + } + + /** + * Set text + * + * @param string $value + * @return PHPExcel_Style_Conditional + */ + public function setText($value = null) { + $this->_text = $value; + return $this; + } + + /** + * Get Condition + * + * @deprecated Deprecated, use getConditions instead + * @return string + */ + public function getCondition() { + if (isset($this->_condition[0])) { + return $this->_condition[0]; + } + + return ''; + } + + /** + * Set Condition + * + * @deprecated Deprecated, use setConditions instead + * @param string $pValue Condition + * @return PHPExcel_Style_Conditional + */ + public function setCondition($pValue = '') { + if (!is_array($pValue)) + $pValue = array($pValue); + + return $this->setConditions($pValue); + } + + /** + * Get Conditions + * + * @return string[] + */ + public function getConditions() { + return $this->_condition; + } + + /** + * Set Conditions + * + * @param string[] $pValue Condition + * @return PHPExcel_Style_Conditional + */ + public function setConditions($pValue) { + if (!is_array($pValue)) + $pValue = array($pValue); + + $this->_condition = $pValue; + return $this; + } + + /** + * Add Condition + * + * @param string $pValue Condition + * @return PHPExcel_Style_Conditional + */ + public function addCondition($pValue = '') { + $this->_condition[] = $pValue; + return $this; + } + + /** + * Get Style + * + * @return PHPExcel_Style + */ + public function getStyle() { + return $this->_style; + } + + /** + * Set Style + * + * @param PHPExcel_Style $pValue + * @throws Exception + * @return PHPExcel_Style_Conditional + */ + public function setStyle(PHPExcel_Style $pValue = null) { + $this->_style = $pValue; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_conditionType + . $this->_operatorType + . implode(';', $this->_condition) + . $this->_style->getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Fill.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Fill.php new file mode 100644 index 000000000..afede653c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Fill.php @@ -0,0 +1,409 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Fill + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Fill implements PHPExcel_IComparable +{ + /* Fill types */ + const FILL_NONE = 'none'; + const FILL_SOLID = 'solid'; + const FILL_GRADIENT_LINEAR = 'linear'; + const FILL_GRADIENT_PATH = 'path'; + const FILL_PATTERN_DARKDOWN = 'darkDown'; + const FILL_PATTERN_DARKGRAY = 'darkGray'; + const FILL_PATTERN_DARKGRID = 'darkGrid'; + const FILL_PATTERN_DARKHORIZONTAL = 'darkHorizontal'; + const FILL_PATTERN_DARKTRELLIS = 'darkTrellis'; + const FILL_PATTERN_DARKUP = 'darkUp'; + const FILL_PATTERN_DARKVERTICAL = 'darkVertical'; + const FILL_PATTERN_GRAY0625 = 'gray0625'; + const FILL_PATTERN_GRAY125 = 'gray125'; + const FILL_PATTERN_LIGHTDOWN = 'lightDown'; + const FILL_PATTERN_LIGHTGRAY = 'lightGray'; + const FILL_PATTERN_LIGHTGRID = 'lightGrid'; + const FILL_PATTERN_LIGHTHORIZONTAL = 'lightHorizontal'; + const FILL_PATTERN_LIGHTTRELLIS = 'lightTrellis'; + const FILL_PATTERN_LIGHTUP = 'lightUp'; + const FILL_PATTERN_LIGHTVERTICAL = 'lightVertical'; + const FILL_PATTERN_MEDIUMGRAY = 'mediumGray'; + + /** + * Fill type + * + * @var string + */ + private $_fillType = PHPExcel_Style_Fill::FILL_NONE; + + /** + * Rotation + * + * @var double + */ + private $_rotation = 0; + + /** + * Start color + * + * @var PHPExcel_Style_Color + */ + private $_startColor; + + /** + * End color + * + * @var PHPExcel_Style_Color + */ + private $_endColor; + + /** + * Parent Borders + * + * @var _parentPropertyName string + */ + private $_parentPropertyName; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + private $_parent; + + /** + * Create a new PHPExcel_Style_Fill + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + if ($isConditional) { + $this->_fillType = NULL; + } + $this->_startColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_WHITE, $isSupervisor, $isConditional); + $this->_endColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional); + + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->_startColor->bindParent($this, '_startColor'); + $this->_endColor->bindParent($this, '_endColor'); + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style $parent + * @return PHPExcel_Style_Fill + */ + public function bindParent($parent) + { + $this->_parent = $parent; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Fill + */ + public function getSharedComponent() + { + return $this->_parent->getSharedComponent()->getFill(); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('fill' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFill()->applyFromArray( + * array( + * 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, + * 'rotation' => 0, + * 'startcolor' => array( + * 'rgb' => '000000' + * ), + * 'endcolor' => array( + * 'argb' => 'FFFFFFFF' + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Fill + */ + public function applyFromArray($pStyles = null) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('type', $pStyles)) { + $this->setFillType($pStyles['type']); + } + if (array_key_exists('rotation', $pStyles)) { + $this->setRotation($pStyles['rotation']); + } + if (array_key_exists('startcolor', $pStyles)) { + $this->getStartColor()->applyFromArray($pStyles['startcolor']); + } + if (array_key_exists('endcolor', $pStyles)) { + $this->getEndColor()->applyFromArray($pStyles['endcolor']); + } + if (array_key_exists('color', $pStyles)) { + $this->getStartColor()->applyFromArray($pStyles['color']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Fill Type + * + * @return string + */ + public function getFillType() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getFillType(); + } + return $this->_fillType; + } + + /** + * Set Fill Type + * + * @param string $pValue PHPExcel_Style_Fill fill type + * @return PHPExcel_Style_Fill + */ + public function setFillType($pValue = PHPExcel_Style_Fill::FILL_NONE) { + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('type' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_fillType = $pValue; + } + return $this; + } + + /** + * Get Rotation + * + * @return double + */ + public function getRotation() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getRotation(); + } + return $this->_rotation; + } + + /** + * Set Rotation + * + * @param double $pValue + * @return PHPExcel_Style_Fill + */ + public function setRotation($pValue = 0) { + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('rotation' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_rotation = $pValue; + } + return $this; + } + + /** + * Get Start Color + * + * @return PHPExcel_Style_Color + */ + public function getStartColor() { + return $this->_startColor; + } + + /** + * Set Start Color + * + * @param PHPExcel_Style_Color $pValue + * @throws Exception + * @return PHPExcel_Style_Fill + */ + public function setStartColor(PHPExcel_Style_Color $pValue = null) { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->_isSupervisor) { + $styleArray = $this->getStartColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_startColor = $color; + } + return $this; + } + + /** + * Get End Color + * + * @return PHPExcel_Style_Color + */ + public function getEndColor() { + return $this->_endColor; + } + + /** + * Set End Color + * + * @param PHPExcel_Style_Color $pValue + * @throws Exception + * @return PHPExcel_Style_Fill + */ + public function setEndColor(PHPExcel_Style_Color $pValue = null) { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->_isSupervisor) { + $styleArray = $this->getEndColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_endColor = $color; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->getFillType() + . $this->getRotation() + . $this->getStartColor()->getHashCode() + . $this->getEndColor()->getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Font.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Font.php new file mode 100644 index 000000000..59ae77309 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Font.php @@ -0,0 +1,640 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_Font + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Font implements PHPExcel_IComparable +{ + /* Underline types */ + const UNDERLINE_NONE = 'none'; + const UNDERLINE_DOUBLE = 'double'; + const UNDERLINE_DOUBLEACCOUNTING = 'doubleAccounting'; + const UNDERLINE_SINGLE = 'single'; + const UNDERLINE_SINGLEACCOUNTING = 'singleAccounting'; + + /** + * Font Name + * + * @var string + */ + private $_name = 'Calibri'; + + /** + * Font Size + * + * @var float + */ + private $_size = 11; + + /** + * Bold + * + * @var boolean + */ + private $_bold = false; + + /** + * Italic + * + * @var boolean + */ + private $_italic = false; + + /** + * Superscript + * + * @var boolean + */ + private $_superScript = false; + + /** + * Subscript + * + * @var boolean + */ + private $_subScript = false; + + /** + * Underline + * + * @var string + */ + private $_underline = self::UNDERLINE_NONE; + + /** + * Strikethrough + * + * @var boolean + */ + private $_strikethrough = false; + + /** + * Foreground color + * + * @var PHPExcel_Style_Color + */ + private $_color; + + /** + * Parent Borders + * + * @var _parentPropertyName string + */ + private $_parentPropertyName; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + private $_parent; + + /** + * Create a new PHPExcel_Style_Font + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + if ($isConditional) { + $this->_name = NULL; + $this->_size = NULL; + $this->_bold = NULL; + $this->_italic = NULL; + $this->_superScript = NULL; + $this->_subScript = NULL; + $this->_underline = NULL; + $this->_strikethrough = NULL; + $this->_color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional); + } else { + $this->_color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor); + } + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->_color->bindParent($this, '_color'); + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style $parent + * @return PHPExcel_Style_Font + */ + public function bindParent($parent) + { + $this->_parent = $parent; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Font + */ + public function getSharedComponent() + { + return $this->_parent->getSharedComponent()->getFont(); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('font' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->applyFromArray( + * array( + * 'name' => 'Arial', + * 'bold' => true, + * 'italic' => false, + * 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, + * 'strike' => false, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Font + */ + public function applyFromArray($pStyles = null) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('name', $pStyles)) { + $this->setName($pStyles['name']); + } + if (array_key_exists('bold', $pStyles)) { + $this->setBold($pStyles['bold']); + } + if (array_key_exists('italic', $pStyles)) { + $this->setItalic($pStyles['italic']); + } + if (array_key_exists('superScript', $pStyles)) { + $this->setSuperScript($pStyles['superScript']); + } + if (array_key_exists('subScript', $pStyles)) { + $this->setSubScript($pStyles['subScript']); + } + if (array_key_exists('underline', $pStyles)) { + $this->setUnderline($pStyles['underline']); + } + if (array_key_exists('strike', $pStyles)) { + $this->setStrikethrough($pStyles['strike']); + } + if (array_key_exists('color', $pStyles)) { + $this->getColor()->applyFromArray($pStyles['color']); + } + if (array_key_exists('size', $pStyles)) { + $this->setSize($pStyles['size']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Name + * + * @return string + */ + public function getName() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getName(); + } + return $this->_name; + } + + /** + * Set Name + * + * @param string $pValue + * @return PHPExcel_Style_Font + */ + public function setName($pValue = 'Calibri') { + if ($pValue == '') { + $pValue = 'Calibri'; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('name' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_name = $pValue; + } + return $this; + } + + /** + * Get Size + * + * @return double + */ + public function getSize() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getSize(); + } + return $this->_size; + } + + /** + * Set Size + * + * @param double $pValue + * @return PHPExcel_Style_Font + */ + public function setSize($pValue = 10) { + if ($pValue == '') { + $pValue = 10; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('size' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_size = $pValue; + } + return $this; + } + + /** + * Get Bold + * + * @return boolean + */ + public function getBold() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getBold(); + } + return $this->_bold; + } + + /** + * Set Bold + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setBold($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('bold' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_bold = $pValue; + } + return $this; + } + + /** + * Get Italic + * + * @return boolean + */ + public function getItalic() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getItalic(); + } + return $this->_italic; + } + + /** + * Set Italic + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setItalic($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('italic' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_italic = $pValue; + } + return $this; + } + + /** + * Get SuperScript + * + * @return boolean + */ + public function getSuperScript() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getSuperScript(); + } + return $this->_superScript; + } + + /** + * Set SuperScript + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setSuperScript($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('superScript' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_superScript = $pValue; + $this->_subScript = !$pValue; + } + return $this; + } + + /** + * Get SubScript + * + * @return boolean + */ + public function getSubScript() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getSubScript(); + } + return $this->_subScript; + } + + /** + * Set SubScript + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setSubScript($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('subScript' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_subScript = $pValue; + $this->_superScript = !$pValue; + } + return $this; + } + + /** + * Get Underline + * + * @return string + */ + public function getUnderline() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getUnderline(); + } + return $this->_underline; + } + + /** + * Set Underline + * + * @param string|boolean $pValue PHPExcel_Style_Font underline type + * If a boolean is passed, then true equates to UNDERLINE_SINGLE, + * false equates to UNDERLINE_NONE + * @return PHPExcel_Style_Font + */ + public function setUnderline($pValue = self::UNDERLINE_NONE) { + if (is_bool($pValue)) { + $pValue = ($pValue) ? self::UNDERLINE_SINGLE : self::UNDERLINE_NONE; + } elseif ($pValue == '') { + $pValue = self::UNDERLINE_NONE; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('underline' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_underline = $pValue; + } + return $this; + } + + /** + * Get Striketrough + * + * @deprecated Use getStrikethrough() instead. + * @return boolean + */ + public function getStriketrough() { + return $this->getStrikethrough(); + } + + /** + * Set Striketrough + * + * @deprecated Use setStrikethrough() instead. + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setStriketrough($pValue = false) { + return $this->setStrikethrough($pValue); + } + + /** + * Get Strikethrough + * + * @return boolean + */ + public function getStrikethrough() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getStrikethrough(); + } + return $this->_strikethrough; + } + + /** + * Set Strikethrough + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setStrikethrough($pValue = false) { + if ($pValue == '') { + $pValue = false; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('strike' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_strikethrough = $pValue; + } + return $this; + } + + /** + * Get Color + * + * @return PHPExcel_Style_Color + */ + public function getColor() { + return $this->_color; + } + + /** + * Set Color + * + * @param PHPExcel_Style_Color $pValue + * @throws Exception + * @return PHPExcel_Style_Font + */ + public function setColor(PHPExcel_Style_Color $pValue = null) { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->_isSupervisor) { + $styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_color = $color; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->_name + . $this->_size + . ($this->_bold ? 't' : 'f') + . ($this->_italic ? 't' : 'f') + . ($this->_superScript ? 't' : 'f') + . ($this->_subScript ? 't' : 'f') + . $this->_underline + . ($this->_strikethrough ? 't' : 'f') + . $this->_color->getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/NumberFormat.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/NumberFormat.php new file mode 100644 index 000000000..19e064e4d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/NumberFormat.php @@ -0,0 +1,741 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Style_NumberFormat + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_NumberFormat implements PHPExcel_IComparable +{ + /* Pre-defined formats */ + const FORMAT_GENERAL = 'General'; + + const FORMAT_TEXT = '@'; + + const FORMAT_NUMBER = '0'; + const FORMAT_NUMBER_00 = '0.00'; + const FORMAT_NUMBER_COMMA_SEPARATED1 = '#,##0.00'; + const FORMAT_NUMBER_COMMA_SEPARATED2 = '#,##0.00_-'; + + const FORMAT_PERCENTAGE = '0%'; + const FORMAT_PERCENTAGE_00 = '0.00%'; + + const FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd'; + const FORMAT_DATE_YYYYMMDD = 'yy-mm-dd'; + const FORMAT_DATE_DDMMYYYY = 'dd/mm/yy'; + const FORMAT_DATE_DMYSLASH = 'd/m/y'; + const FORMAT_DATE_DMYMINUS = 'd-m-y'; + const FORMAT_DATE_DMMINUS = 'd-m'; + const FORMAT_DATE_MYMINUS = 'm-y'; + const FORMAT_DATE_XLSX14 = 'mm-dd-yy'; + const FORMAT_DATE_XLSX15 = 'd-mmm-yy'; + const FORMAT_DATE_XLSX16 = 'd-mmm'; + const FORMAT_DATE_XLSX17 = 'mmm-yy'; + const FORMAT_DATE_XLSX22 = 'm/d/yy h:mm'; + const FORMAT_DATE_DATETIME = 'd/m/y h:mm'; + const FORMAT_DATE_TIME1 = 'h:mm AM/PM'; + const FORMAT_DATE_TIME2 = 'h:mm:ss AM/PM'; + const FORMAT_DATE_TIME3 = 'h:mm'; + const FORMAT_DATE_TIME4 = 'h:mm:ss'; + const FORMAT_DATE_TIME5 = 'mm:ss'; + const FORMAT_DATE_TIME6 = 'h:mm:ss'; + const FORMAT_DATE_TIME7 = 'i:s.S'; + const FORMAT_DATE_TIME8 = 'h:mm:ss;@'; + const FORMAT_DATE_YYYYMMDDSLASH = 'yy/mm/dd;@'; + + const FORMAT_CURRENCY_USD_SIMPLE = '"$"#,##0.00_-'; + const FORMAT_CURRENCY_USD = '$#,##0_-'; + const FORMAT_CURRENCY_EUR_SIMPLE = '[$EUR ]#,##0.00_-'; + + /** + * Excel built-in number formats + * + * @var array + */ + private static $_builtInFormats; + + /** + * Excel built-in number formats (flipped, for faster lookups) + * + * @var array + */ + private static $_flippedBuiltInFormats; + + /** + * Format Code + * + * @var string + */ + private $_formatCode = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + + /** + * Built-in format Code + * + * @var string + */ + private $_builtInFormatCode = 0; + + /** + * Parent Borders + * + * @var _parentPropertyName string + */ + private $_parentPropertyName; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + private $_parent; + + /** + * Create a new PHPExcel_Style_NumberFormat + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + if ($isConditional) { + $this->_formatCode = NULL; + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style $parent + * @return PHPExcel_Style_NumberFormat + */ + public function bindParent($parent) + { + $this->_parent = $parent; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_NumberFormat + */ + public function getSharedComponent() + { + return $this->_parent->getSharedComponent()->getNumberFormat(); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('numberformat' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getNumberFormat()->applyFromArray( + * array( + * 'code' => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_NumberFormat + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('code', $pStyles)) { + $this->setFormatCode($pStyles['code']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Format Code + * + * @return string + */ + public function getFormatCode() + { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getFormatCode(); + } + if ($this->_builtInFormatCode !== false) + { + return self::builtInFormatCode($this->_builtInFormatCode); + } + return $this->_formatCode; + } + + /** + * Set Format Code + * + * @param string $pValue + * @return PHPExcel_Style_NumberFormat + */ + public function setFormatCode($pValue = PHPExcel_Style_NumberFormat::FORMAT_GENERAL) + { + if ($pValue == '') { + $pValue = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + } + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('code' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_formatCode = $pValue; + $this->_builtInFormatCode = self::builtInFormatCodeIndex($pValue); + } + return $this; + } + + /** + * Get Built-In Format Code + * + * @return int + */ + public function getBuiltInFormatCode() + { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getBuiltInFormatCode(); + } + return $this->_builtInFormatCode; + } + + /** + * Set Built-In Format Code + * + * @param int $pValue + * @return PHPExcel_Style_NumberFormat + */ + public function setBuiltInFormatCode($pValue = 0) + { + + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('code' => self::builtInFormatCode($pValue))); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_builtInFormatCode = $pValue; + $this->_formatCode = self::builtInFormatCode($pValue); + } + return $this; + } + + /** + * Fill built-in format codes + */ + private static function fillBuiltInFormatCodes() + { + // Built-in format codes + if (is_null(self::$_builtInFormats)) { + self::$_builtInFormats = array(); + + // General + self::$_builtInFormats[0] = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + self::$_builtInFormats[1] = '0'; + self::$_builtInFormats[2] = '0.00'; + self::$_builtInFormats[3] = '#,##0'; + self::$_builtInFormats[4] = '#,##0.00'; + + self::$_builtInFormats[9] = '0%'; + self::$_builtInFormats[10] = '0.00%'; + self::$_builtInFormats[11] = '0.00E+00'; + self::$_builtInFormats[12] = '# ?/?'; + self::$_builtInFormats[13] = '# ??/??'; + self::$_builtInFormats[14] = 'mm-dd-yy'; + self::$_builtInFormats[15] = 'd-mmm-yy'; + self::$_builtInFormats[16] = 'd-mmm'; + self::$_builtInFormats[17] = 'mmm-yy'; + self::$_builtInFormats[18] = 'h:mm AM/PM'; + self::$_builtInFormats[19] = 'h:mm:ss AM/PM'; + self::$_builtInFormats[20] = 'h:mm'; + self::$_builtInFormats[21] = 'h:mm:ss'; + self::$_builtInFormats[22] = 'm/d/yy h:mm'; + + self::$_builtInFormats[37] = '#,##0 ;(#,##0)'; + self::$_builtInFormats[38] = '#,##0 ;[Red](#,##0)'; + self::$_builtInFormats[39] = '#,##0.00;(#,##0.00)'; + self::$_builtInFormats[40] = '#,##0.00;[Red](#,##0.00)'; + + self::$_builtInFormats[44] = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)'; + self::$_builtInFormats[45] = 'mm:ss'; + self::$_builtInFormats[46] = '[h]:mm:ss'; + self::$_builtInFormats[47] = 'mmss.0'; + self::$_builtInFormats[48] = '##0.0E+0'; + self::$_builtInFormats[49] = '@'; + + // CHT + self::$_builtInFormats[27] = '[$-404]e/m/d'; + self::$_builtInFormats[30] = 'm/d/yy'; + self::$_builtInFormats[36] = '[$-404]e/m/d'; + self::$_builtInFormats[50] = '[$-404]e/m/d'; + self::$_builtInFormats[57] = '[$-404]e/m/d'; + + // THA + self::$_builtInFormats[59] = 't0'; + self::$_builtInFormats[60] = 't0.00'; + self::$_builtInFormats[61] = 't#,##0'; + self::$_builtInFormats[62] = 't#,##0.00'; + self::$_builtInFormats[67] = 't0%'; + self::$_builtInFormats[68] = 't0.00%'; + self::$_builtInFormats[69] = 't# ?/?'; + self::$_builtInFormats[70] = 't# ??/??'; + + // Flip array (for faster lookups) + self::$_flippedBuiltInFormats = array_flip(self::$_builtInFormats); + } + } + + /** + * Get built-in format code + * + * @param int $pIndex + * @return string + */ + public static function builtInFormatCode($pIndex) + { + // Clean parameter + $pIndex = intval($pIndex); + + // Ensure built-in format codes are available + self::fillBuiltInFormatCodes(); + + // Lookup format code + if (isset(self::$_builtInFormats[$pIndex])) { + return self::$_builtInFormats[$pIndex]; + } + + return ''; + } + + /** + * Get built-in format code index + * + * @param string $formatCode + * @return int|boolean + */ + public static function builtInFormatCodeIndex($formatCode) + { + // Ensure built-in format codes are available + self::fillBuiltInFormatCodes(); + + // Lookup format code + if (isset(self::$_flippedBuiltInFormats[$formatCode])) { + return self::$_flippedBuiltInFormats[$formatCode]; + } + + return false; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->_formatCode + . $this->_builtInFormatCode + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + + /** + * Search/replace values to convert Excel date/time format masks to PHP format masks + * + * @var array + */ + private static $_dateFormatReplacements = array( + // first remove escapes related to non-format characters + '\\' => '', + // 12-hour suffix + 'am/pm' => 'A', + // 4-digit year + 'e' => 'Y', + 'yyyy' => 'Y', + // 2-digit year + 'yy' => 'y', + // first letter of month - no php equivalent + 'mmmmm' => 'M', + // full month name + 'mmmm' => 'F', + // short month name + 'mmm' => 'M', + // mm is minutes if time or month w/leading zero + ':mm' => ':i', + // month leading zero + 'mm' => 'm', + // month no leading zero + 'm' => 'n', + // full day of week name + 'dddd' => 'l', + // short day of week name + 'ddd' => 'D', + // days leading zero + 'dd' => 'd', + // days no leading zero + 'd' => 'j', + // seconds + 'ss' => 's', + // fractional seconds - no php equivalent + '.s' => '' + ); + /** + * Search/replace values to convert Excel date/time format masks hours to PHP format masks (24 hr clock) + * + * @var array + */ + private static $_dateFormatReplacements24 = array( + 'hh' => 'H', + 'h' => 'G' + ); + /** + * Search/replace values to convert Excel date/time format masks hours to PHP format masks (12 hr clock) + * + * @var array + */ + private static $_dateFormatReplacements12 = array( + 'hh' => 'h', + 'h' => 'g' + ); + + /** + * Convert a value in a pre-defined format to a PHP string + * + * @param mixed $value Value to format + * @param string $format Format code + * @param array $callBack Callback function for additional formatting of string + * @return string Formatted string + */ + public static function toFormattedString($value = '', $format = '', $callBack = null) + { + // For now we do not treat strings although section 4 of a format code affects strings + if (!is_numeric($value)) return $value; + + // For 'General' format code, we just pass the value although this is not entirely the way Excel does it, + // it seems to round numbers to a total of 10 digits. + if (($format === PHPExcel_Style_NumberFormat::FORMAT_GENERAL) || ($format === PHPExcel_Style_NumberFormat::FORMAT_TEXT)) { + return $value; + } + + // Get the sections, there can be up to four sections + $sections = explode(';', $format); + + // Fetch the relevant section depending on whether number is positive, negative, or zero? + // Text not supported yet. + // Here is how the sections apply to various values in Excel: + // 1 section: [POSITIVE/NEGATIVE/ZERO/TEXT] + // 2 sections: [POSITIVE/ZERO/TEXT] [NEGATIVE] + // 3 sections: [POSITIVE/TEXT] [NEGATIVE] [ZERO] + // 4 sections: [POSITIVE] [NEGATIVE] [ZERO] [TEXT] + switch (count($sections)) { + case 1: + $format = $sections[0]; + break; + + case 2: + $format = ($value >= 0) ? $sections[0] : $sections[1]; + $value = abs($value); // Use the absolute value + break; + + case 3: + $format = ($value > 0) ? + $sections[0] : ( ($value < 0) ? + $sections[1] : $sections[2]); + $value = abs($value); // Use the absolute value + break; + + case 4: + $format = ($value > 0) ? + $sections[0] : ( ($value < 0) ? + $sections[1] : $sections[2]); + $value = abs($value); // Use the absolute value + break; + + default: + // something is wrong, just use first section + $format = $sections[0]; + break; + } + + // Save format with color information for later use below + $formatColor = $format; + + // Strip color information + $color_regex = '/^\\[[a-zA-Z]+\\]/'; + $format = preg_replace($color_regex, '', $format); + + // Let's begin inspecting the format and converting the value to a formatted string + if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $format)) { // datetime format + // dvc: convert Excel formats to PHP date formats + + // strip off first part containing e.g. [$-F800] or [$USD-409] + // general syntax: [$<Currency string>-<language info>] + // language info is in hexadecimal + $format = preg_replace('/^(\[\$[A-Z]*-[0-9A-F]*\])/i', '', $format); + + // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case + $format = strtolower($format); + + $format = strtr($format,self::$_dateFormatReplacements); + if (!strpos($format,'A')) { // 24-hour time format + $format = strtr($format,self::$_dateFormatReplacements24); + } else { // 12-hour time format + $format = strtr($format,self::$_dateFormatReplacements12); + } + + $dateObj = PHPExcel_Shared_Date::ExcelToPHPObject($value); + $value = $dateObj->format($format); + + } else if (preg_match('/%$/', $format)) { // % number format + if ($format === self::FORMAT_PERCENTAGE) { + $value = round( (100 * $value), 0) . '%'; + } else { + if (preg_match('/\.[#0]+/i', $format, $m)) { + $s = substr($m[0], 0, 1) . (strlen($m[0]) - 1); + $format = str_replace($m[0], $s, $format); + } + if (preg_match('/^[#0]+/', $format, $m)) { + $format = str_replace($m[0], strlen($m[0]), $format); + } + $format = '%' . str_replace('%', 'f%%', $format); + + $value = sprintf($format, 100 * $value); + } + + } else { + if ($format === self::FORMAT_CURRENCY_EUR_SIMPLE) { + $value = 'EUR ' . sprintf('%1.2f', $value); + + } else { + // In Excel formats, "_" is used to add spacing, which we can't do in HTML + $format = preg_replace('/_./', '', $format); + + // Some non-number characters are escaped with \, which we don't need + $format = preg_replace("/\\\\/", '', $format); + + // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols + $format = str_replace(array('"','*'), '', $format); + + // Find out if we need thousands separator + // This is indicated by a comma enclosed by a digit placeholder: + // #,# or 0,0 + $useThousands = preg_match('/(#,#|0,0)/', $format); + if ($useThousands) { + $format = preg_replace('/0,0/', '00', $format); + $format = preg_replace('/#,#/', '##', $format); + } + + // Scale thousands, millions,... + // This is indicated by a number of commas after a digit placeholder: + // #, or 0.0,, + $scale = 1; // same as no scale + $matches = array(); + if (preg_match('/(#|0)(,+)/', $format, $matches)) { + $scale = pow(1000, strlen($matches[2])); + + // strip the commas + $format = preg_replace('/0,+/', '0', $format); + $format = preg_replace('/#,+/', '#', $format); + } + + if (preg_match('/#?.*\?\/\?/', $format, $m)) { + //echo 'Format mask is fractional '.$format.' <br />'; + if ($value != (int)$value) { + $sign = ($value < 0) ? '-' : ''; + + $integerPart = floor(abs($value)); + $decimalPart = trim(fmod(abs($value),1),'0.'); + $decimalLength = strlen($decimalPart); + $decimalDivisor = pow(10,$decimalLength); + + $GCD = PHPExcel_Calculation_MathTrig::GCD($decimalPart,$decimalDivisor); + + $adjustedDecimalPart = $decimalPart/$GCD; + $adjustedDecimalDivisor = $decimalDivisor/$GCD; + + if ((strpos($format,'0') !== false) || (strpos($format,'#') !== false) || (substr($format,0,3) == '? ?')) { + if ($integerPart == 0) { $integerPart = ''; } + $value = "$sign$integerPart $adjustedDecimalPart/$adjustedDecimalDivisor"; + } else { + $adjustedDecimalPart += $integerPart * $adjustedDecimalDivisor; + $value = "$sign$adjustedDecimalPart/$adjustedDecimalDivisor"; + } + } + + } else { + // Handle the number itself + + // scale number + $value = $value / $scale; + + // Strip # + $format = preg_replace('/\\#/', '', $format); + + $n = "/\[[^\]]+\]/"; + $m = preg_replace($n, '', $format); + $number_regex = "/(0+)(\.?)(0*)/"; + if (preg_match($number_regex, $m, $matches)) { + $left = $matches[1]; + $dec = $matches[2]; + $right = $matches[3]; + + // minimun width of formatted number (including dot) + $minWidth = strlen($left) + strlen($dec) + strlen($right); + + if ($useThousands) { + $value = number_format( + $value + , strlen($right) + , PHPExcel_Shared_String::getDecimalSeparator() + , PHPExcel_Shared_String::getThousandsSeparator() + ); + } else { + $sprintf_pattern = "%0$minWidth." . strlen($right) . "f"; + $value = sprintf($sprintf_pattern, $value); + } + + $value = preg_replace($number_regex, $value, $format); + } + } + if (preg_match('/\[\$(.*)\]/u', $format, $m)) { + // Currency or Accounting + $currencyFormat = $m[0]; + $currencyCode = $m[1]; + list($currencyCode) = explode('-',$currencyCode); + if ($currencyCode == '') { + $currencyCode = PHPExcel_Shared_String::getCurrencyCode(); + } + $value = preg_replace('/\[\$([^\]]*)\]/u',$currencyCode,$value); + } + } + } + + // Additional formatting provided by callback function + if ($callBack !== null) { + list($writerInstance, $function) = $callBack; + $value = $writerInstance->$function($value, $formatColor); + } + + return $value; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Style/Protection.php b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Protection.php new file mode 100644 index 000000000..477742bd3 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Style/Protection.php @@ -0,0 +1,290 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.4.5, 2007-08-23 + */ + + +/** + * PHPExcel_Style_Protection + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Protection implements PHPExcel_IComparable +{ + /** Protection styles */ + const PROTECTION_INHERIT = 'inherit'; + const PROTECTION_PROTECTED = 'protected'; + const PROTECTION_UNPROTECTED = 'unprotected'; + + /** + * Locked + * + * @var string + */ + private $_locked; + + /** + * Hidden + * + * @var string + */ + private $_hidden; + + /** + * Parent Borders + * + * @var _parentPropertyName string + */ + private $_parentPropertyName; + + /** + * Supervisor? + * + * @var boolean + */ + private $_isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + private $_parent; + + /** + * Create a new PHPExcel_Style_Protection + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->_isSupervisor = $isSupervisor; + + // Initialise values + if (!$isConditional) { + $this->_locked = self::PROTECTION_INHERIT; + $this->_hidden = self::PROTECTION_INHERIT; + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style $parent + * @return PHPExcel_Style_Protection + */ + public function bindParent($parent) + { + $this->_parent = $parent; + return $this; + } + + /** + * Is this a supervisor or a real style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->_isSupervisor; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Protection + */ + public function getSharedComponent() + { + return $this->_parent->getSharedComponent()->getProtection(); + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->_parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('protection' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getLocked()->applyFromArray( array('locked' => true, 'hidden' => false) ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws Exception + * @return PHPExcel_Style_Protection + */ + public function applyFromArray($pStyles = null) { + if (is_array($pStyles)) { + if ($this->_isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('locked', $pStyles)) { + $this->setLocked($pStyles['locked']); + } + if (array_key_exists('hidden', $pStyles)) { + $this->setHidden($pStyles['hidden']); + } + } + } else { + throw new Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get locked + * + * @return string + */ + public function getLocked() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getLocked(); + } + return $this->_locked; + } + + /** + * Set locked + * + * @param string $pValue + * @return PHPExcel_Style_Protection + */ + public function setLocked($pValue = self::PROTECTION_INHERIT) { + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('locked' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_locked = $pValue; + } + return $this; + } + + /** + * Get hidden + * + * @return string + */ + public function getHidden() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHidden(); + } + return $this->_hidden; + } + + /** + * Set hidden + * + * @param string $pValue + * @return PHPExcel_Style_Protection + */ + public function setHidden($pValue = self::PROTECTION_INHERIT) { + if ($this->_isSupervisor) { + $styleArray = $this->getStyleArray(array('hidden' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->_hidden = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->_locked + . $this->_hidden + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet.php new file mode 100644 index 000000000..17ed5da96 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet.php @@ -0,0 +1,2795 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet implements PHPExcel_IComparable +{ + /* Break types */ + const BREAK_NONE = 0; + const BREAK_ROW = 1; + const BREAK_COLUMN = 2; + + /* Sheet state */ + const SHEETSTATE_VISIBLE = 'visible'; + const SHEETSTATE_HIDDEN = 'hidden'; + const SHEETSTATE_VERYHIDDEN = 'veryHidden'; + + /** + * Invalid characters in sheet title + * + * @var array + */ + private static $_invalidCharacters = array('*', ':', '/', '\\', '?', '[', ']'); + + /** + * Parent spreadsheet + * + * @var PHPExcel + */ + private $_parent; + + /** + * Cacheable collection of cells + * + * @var PHPExcel_CachedObjectStorage_xxx + */ + private $_cellCollection = null; + + /** + * Collection of row dimensions + * + * @var PHPExcel_Worksheet_RowDimension[] + */ + private $_rowDimensions = array(); + + /** + * Default row dimension + * + * @var PHPExcel_Worksheet_RowDimension + */ + private $_defaultRowDimension = null; + + /** + * Collection of column dimensions + * + * @var PHPExcel_Worksheet_ColumnDimension[] + */ + private $_columnDimensions = array(); + + /** + * Default column dimension + * + * @var PHPExcel_Worksheet_ColumnDimension + */ + private $_defaultColumnDimension = null; + + /** + * Collection of drawings + * + * @var PHPExcel_Worksheet_BaseDrawing[] + */ + private $_drawingCollection = null; + + /** + * Collection of Chart objects + * + * @var PHPExcel_Chart[] + */ + private $_chartCollection = array(); + + /** + * Worksheet title + * + * @var string + */ + private $_title; + + /** + * Sheet state + * + * @var string + */ + private $_sheetState; + + /** + * Page setup + * + * @var PHPExcel_Worksheet_PageSetup + */ + private $_pageSetup; + + /** + * Page margins + * + * @var PHPExcel_Worksheet_PageMargins + */ + private $_pageMargins; + + /** + * Page header/footer + * + * @var PHPExcel_Worksheet_HeaderFooter + */ + private $_headerFooter; + + /** + * Sheet view + * + * @var PHPExcel_Worksheet_SheetView + */ + private $_sheetView; + + /** + * Protection + * + * @var PHPExcel_Worksheet_Protection + */ + private $_protection; + + /** + * Collection of styles + * + * @var PHPExcel_Style[] + */ + private $_styles = array(); + + /** + * Conditional styles. Indexed by cell coordinate, e.g. 'A1' + * + * @var array + */ + private $_conditionalStylesCollection = array(); + + /** + * Is the current cell collection sorted already? + * + * @var boolean + */ + private $_cellCollectionIsSorted = false; + + /** + * Collection of breaks + * + * @var array + */ + private $_breaks = array(); + + /** + * Collection of merged cell ranges + * + * @var array + */ + private $_mergeCells = array(); + + /** + * Collection of protected cell ranges + * + * @var array + */ + private $_protectedCells = array(); + + /** + * Autofilter Range and selection + * + * @var PHPExcel_Worksheet_AutoFilter + */ + private $_autoFilter = NULL; + + /** + * Freeze pane + * + * @var string + */ + private $_freezePane = ''; + + /** + * Show gridlines? + * + * @var boolean + */ + private $_showGridlines = true; + + /** + * Print gridlines? + * + * @var boolean + */ + private $_printGridlines = false; + + /** + * Show row and column headers? + * + * @var boolean + */ + private $_showRowColHeaders = true; + + /** + * Show summary below? (Row/Column outline) + * + * @var boolean + */ + private $_showSummaryBelow = true; + + /** + * Show summary right? (Row/Column outline) + * + * @var boolean + */ + private $_showSummaryRight = true; + + /** + * Collection of comments + * + * @var PHPExcel_Comment[] + */ + private $_comments = array(); + + /** + * Active cell. (Only one!) + * + * @var string + */ + private $_activeCell = 'A1'; + + /** + * Selected cells + * + * @var string + */ + private $_selectedCells = 'A1'; + + /** + * Cached highest column + * + * @var string + */ + private $_cachedHighestColumn = 'A'; + + /** + * Cached highest row + * + * @var int + */ + private $_cachedHighestRow = 1; + + /** + * Right-to-left? + * + * @var boolean + */ + private $_rightToLeft = false; + + /** + * Hyperlinks. Indexed by cell coordinate, e.g. 'A1' + * + * @var array + */ + private $_hyperlinkCollection = array(); + + /** + * Data validation objects. Indexed by cell coordinate, e.g. 'A1' + * + * @var array + */ + private $_dataValidationCollection = array(); + + /** + * Tab color + * + * @var PHPExcel_Style_Color + */ + private $_tabColor; + + /** + * Dirty flag + * + * @var boolean + */ + private $_dirty = true; + + /** + * Hash + * + * @var string + */ + private $_hash = null; + + /** + * Create a new worksheet + * + * @param PHPExcel $pParent + * @param string $pTitle + */ + public function __construct(PHPExcel $pParent = null, $pTitle = 'Worksheet') + { + // Set parent and title + $this->_parent = $pParent; + $this->setTitle($pTitle, FALSE); + $this->setSheetState(PHPExcel_Worksheet::SHEETSTATE_VISIBLE); + + $this->_cellCollection = PHPExcel_CachedObjectStorageFactory::getInstance($this); + + // Set page setup + $this->_pageSetup = new PHPExcel_Worksheet_PageSetup(); + + // Set page margins + $this->_pageMargins = new PHPExcel_Worksheet_PageMargins(); + + // Set page header/footer + $this->_headerFooter = new PHPExcel_Worksheet_HeaderFooter(); + + // Set sheet view + $this->_sheetView = new PHPExcel_Worksheet_SheetView(); + + // Drawing collection + $this->_drawingCollection = new ArrayObject(); + + // Chart collection + $this->_chartCollection = new ArrayObject(); + + // Protection + $this->_protection = new PHPExcel_Worksheet_Protection(); + + // Default row dimension + $this->_defaultRowDimension = new PHPExcel_Worksheet_RowDimension(NULL); + + // Default column dimension + $this->_defaultColumnDimension = new PHPExcel_Worksheet_ColumnDimension(NULL); + + $this->_autoFilter = new PHPExcel_Worksheet_AutoFilter(NULL, $this); + } + + + /** + * Disconnect all cells from this PHPExcel_Worksheet object, + * typically so that the worksheet object can be unset + * + */ + public function disconnectCells() { + $this->_cellCollection->unsetWorksheetCells(); + $this->_cellCollection = null; + + // detach ourself from the workbook, so that it can then delete this worksheet successfully + $this->_parent = null; + } + + /** + * Return the cache controller for the cell collection + * + * @return PHPExcel_CachedObjectStorage_xxx + */ + public function getCellCacheController() { + return $this->_cellCollection; + } // function getCellCacheController() + + + /** + * Get array of invalid characters for sheet title + * + * @return array + */ + public static function getInvalidCharacters() + { + return self::$_invalidCharacters; + } + + /** + * Check sheet title for valid Excel syntax + * + * @param string $pValue The string to check + * @return string The valid string + * @throws Exception + */ + private static function _checkSheetTitle($pValue) + { + // Some of the printable ASCII characters are invalid: * : / \ ? [ ] + if (str_replace(self::$_invalidCharacters, '', $pValue) !== $pValue) { + throw new Exception('Invalid character found in sheet title'); + } + + // Maximum 31 characters allowed for sheet title + if (PHPExcel_Shared_String::CountCharacters($pValue) > 31) { + throw new Exception('Maximum 31 characters allowed in sheet title.'); + } + + return $pValue; + } + + /** + * Get collection of cells + * + * @param boolean $pSorted Also sort the cell collection? + * @return PHPExcel_Cell[] + */ + public function getCellCollection($pSorted = true) + { + if ($pSorted) { + // Re-order cell collection + return $this->sortCellCollection(); + } + if ($this->_cellCollection !== NULL) { + return $this->_cellCollection->getCellList(); + } + return array(); + } + + /** + * Sort collection of cells + * + * @return PHPExcel_Worksheet + */ + public function sortCellCollection() + { + if ($this->_cellCollection !== NULL) { + return $this->_cellCollection->getSortedCellList(); + } + return array(); + } + + /** + * Get collection of row dimensions + * + * @return PHPExcel_Worksheet_RowDimension[] + */ + public function getRowDimensions() + { + return $this->_rowDimensions; + } + + /** + * Get default row dimension + * + * @return PHPExcel_Worksheet_RowDimension + */ + public function getDefaultRowDimension() + { + return $this->_defaultRowDimension; + } + + /** + * Get collection of column dimensions + * + * @return PHPExcel_Worksheet_ColumnDimension[] + */ + public function getColumnDimensions() + { + return $this->_columnDimensions; + } + + /** + * Get default column dimension + * + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function getDefaultColumnDimension() + { + return $this->_defaultColumnDimension; + } + + /** + * Get collection of drawings + * + * @return PHPExcel_Worksheet_BaseDrawing[] + */ + public function getDrawingCollection() + { + return $this->_drawingCollection; + } + + /** + * Get collection of charts + * + * @return PHPExcel_Chart[] + */ + public function getChartCollection() + { + return $this->_chartCollection; + } + + /** + * Add chart + * + * @param PHPExcel_Chart $pChart + * @param int|null $iChartIndex Index where chart should go (0,1,..., or null for last) + * @return PHPExcel_Chart + * @throws Exception + */ + public function addChart(PHPExcel_Chart $pChart = null, $iChartIndex = null) + { + $pChart->setWorksheet($this); + if (is_null($iChartIndex)) { + $this->_chartCollection[] = $pChart; + } else { + // Insert the chart at the requested index + array_splice($this->_chartCollection, $iChartIndex, 0, array($pChart)); + } + + return $pChart; + } + + /** + * Return the count of charts on this worksheet + * + * @return int The number of charts + * @throws Exception + */ + public function getChartCount() + { + return count($this->_chartCollection); + } + + /** + * Get a chart by its index position + * + * @param string $index Chart index position + * @return false|PHPExcel_Chart + * @throws Exception + */ + public function getChartByIndex($index = null) + { + $chartCount = count($this->_chartCollection); + if ($chartCount == 0) { + return false; + } + if (is_null($index)) { + $index = --$chartCount; + } + if (!isset($this->_chartCollection[$index])) { + return false; + } + + return $this->_chartCollection[$index]; + } + + /** + * Return an array of the names of charts on this worksheet + * + * @return string[] The names of charts + * @throws Exception + */ + public function getChartNames() + { + $chartNames = array(); + foreach($this->_chartCollection as $chart) { + $chartNames[] = $chart->getName(); + } + return $chartNames; + } + + /** + * Get a chart by name + * + * @param string $chartName Chart name + * @return false|PHPExcel_Chart + * @throws Exception + */ + public function getChartByName($chartName = '') + { + $chartCount = count($this->_chartCollection); + if ($chartCount == 0) { + return false; + } + foreach($this->_chartCollection as $index => $chart) { + if ($chart->getName() == $chartName) { + return $this->_chartCollection[$index]; + } + } + return false; + } + + /** + * Refresh column dimensions + * + * @return PHPExcel_Worksheet + */ + public function refreshColumnDimensions() + { + $currentColumnDimensions = $this->getColumnDimensions(); + $newColumnDimensions = array(); + + foreach ($currentColumnDimensions as $objColumnDimension) { + $newColumnDimensions[$objColumnDimension->getColumnIndex()] = $objColumnDimension; + } + + $this->_columnDimensions = $newColumnDimensions; + + return $this; + } + + /** + * Refresh row dimensions + * + * @return PHPExcel_Worksheet + */ + public function refreshRowDimensions() + { + $currentRowDimensions = $this->getRowDimensions(); + $newRowDimensions = array(); + + foreach ($currentRowDimensions as $objRowDimension) { + $newRowDimensions[$objRowDimension->getRowIndex()] = $objRowDimension; + } + + $this->_rowDimensions = $newRowDimensions; + + return $this; + } + + /** + * Calculate worksheet dimension + * + * @return string String containing the dimension of this worksheet + */ + public function calculateWorksheetDimension() + { + // Return + return 'A1' . ':' . $this->getHighestColumn() . $this->getHighestRow(); + } + + /** + * Calculate worksheet data dimension + * + * @return string String containing the dimension of this worksheet that actually contain data + */ + public function calculateWorksheetDataDimension() + { + // Return + return 'A1' . ':' . $this->getHighestDataColumn() . $this->getHighestDataRow(); + } + + /** + * Calculate widths for auto-size columns + * + * @param boolean $calculateMergeCells Calculate merge cell width + * @return PHPExcel_Worksheet; + */ + public function calculateColumnWidths($calculateMergeCells = false) + { + // initialize $autoSizes array + $autoSizes = array(); + foreach ($this->getColumnDimensions() as $colDimension) { + if ($colDimension->getAutoSize()) { + $autoSizes[$colDimension->getColumnIndex()] = -1; + } + } + + // There is only something to do if there are some auto-size columns + if (!empty($autoSizes)) { + + // build list of cells references that participate in a merge + $isMergeCell = array(); + foreach ($this->getMergeCells() as $cells) { + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cells) as $cellReference) { + $isMergeCell[$cellReference] = true; + } + } + + // loop through all cells in the worksheet + foreach ($this->getCellCollection(false) as $cellID) { + $cell = $this->getCell($cellID); + if (isset($autoSizes[$cell->getColumn()])) { + // Determine width if cell does not participate in a merge + if (!isset($isMergeCell[$cell->getCoordinate()])) { + // Calculated value + $cellValue = $cell->getCalculatedValue(); + + // To formatted string + $cellValue = PHPExcel_Style_NumberFormat::toFormattedString($cellValue, $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode()); + + $autoSizes[$cell->getColumn()] = max( + (float)$autoSizes[$cell->getColumn()], + (float)PHPExcel_Shared_Font::calculateColumnWidth( + $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(), + $cellValue, + $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(), + $this->getDefaultStyle()->getFont() + ) + ); + } + } + } + + // adjust column widths + foreach ($autoSizes as $columnIndex => $width) { + if ($width == -1) $width = $this->getDefaultColumnDimension()->getWidth(); + $this->getColumnDimension($columnIndex)->setWidth($width); + } + } + + return $this; + } + + /** + * Get parent + * + * @return PHPExcel + */ + public function getParent() { + return $this->_parent; + } + + /** + * Re-bind parent + * + * @param PHPExcel $parent + * @return PHPExcel_Worksheet + */ + public function rebindParent(PHPExcel $parent) { + $namedRanges = $this->_parent->getNamedRanges(); + foreach ($namedRanges as $namedRange) { + $parent->addNamedRange($namedRange); + } + + $this->_parent->removeSheetByIndex( + $this->_parent->getIndex($this) + ); + $this->_parent = $parent; + + return $this; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Set title + * + * @param string $pValue String containing the dimension of this worksheet + * @param string $updateFormulaCellReferences boolean Flag indicating whether cell references in formulae should + * be updated to reflect the new sheet name. + * This should be left as the default true, unless you are + * certain that no formula cells on any worksheet contain + * references to this worksheet + * @return PHPExcel_Worksheet + */ + public function setTitle($pValue = 'Worksheet', $updateFormulaCellReferences = true) + { + // Is this a 'rename' or not? + if ($this->getTitle() == $pValue) { + return $this; + } + + // Syntax check + self::_checkSheetTitle($pValue); + + // Old title + $oldTitle = $this->getTitle(); + + if ($this->getParent()) { + // Is there already such sheet name? + if ($this->getParent()->sheetNameExists($pValue)) { + // Use name, but append with lowest possible integer + + if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) { + $pValue = PHPExcel_Shared_String::Substring($pValue,0,29); + } + $i = 1; + while ($this->getParent()->sheetNameExists($pValue . ' ' . $i)) { + ++$i; + if ($i == 10) { + if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) { + $pValue = PHPExcel_Shared_String::Substring($pValue,0,28); + } + } elseif ($i == 100) { + if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) { + $pValue = PHPExcel_Shared_String::Substring($pValue,0,27); + } + } + } + + $altTitle = $pValue . ' ' . $i; + return $this->setTitle($altTitle,$updateFormulaCellReferences); + } + } + + // Set title + $this->_title = $pValue; + $this->_dirty = true; + + if ($this->getParent()) { + // New title + $newTitle = $this->getTitle(); + if ($updateFormulaCellReferences) + PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->getParent(), $oldTitle, $newTitle); + } + + return $this; + } + + /** + * Get sheet state + * + * @return string Sheet state (visible, hidden, veryHidden) + */ + public function getSheetState() { + return $this->_sheetState; + } + + /** + * Set sheet state + * + * @param string $value Sheet state (visible, hidden, veryHidden) + * @return PHPExcel_Worksheet + */ + public function setSheetState($value = PHPExcel_Worksheet::SHEETSTATE_VISIBLE) { + $this->_sheetState = $value; + return $this; + } + + /** + * Get page setup + * + * @return PHPExcel_Worksheet_PageSetup + */ + public function getPageSetup() + { + return $this->_pageSetup; + } + + /** + * Set page setup + * + * @param PHPExcel_Worksheet_PageSetup $pValue + * @return PHPExcel_Worksheet + */ + public function setPageSetup(PHPExcel_Worksheet_PageSetup $pValue) + { + $this->_pageSetup = $pValue; + return $this; + } + + /** + * Get page margins + * + * @return PHPExcel_Worksheet_PageMargins + */ + public function getPageMargins() + { + return $this->_pageMargins; + } + + /** + * Set page margins + * + * @param PHPExcel_Worksheet_PageMargins $pValue + * @return PHPExcel_Worksheet + */ + public function setPageMargins(PHPExcel_Worksheet_PageMargins $pValue) + { + $this->_pageMargins = $pValue; + return $this; + } + + /** + * Get page header/footer + * + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function getHeaderFooter() + { + return $this->_headerFooter; + } + + /** + * Set page header/footer + * + * @param PHPExcel_Worksheet_HeaderFooter $pValue + * @return PHPExcel_Worksheet + */ + public function setHeaderFooter(PHPExcel_Worksheet_HeaderFooter $pValue) + { + $this->_headerFooter = $pValue; + return $this; + } + + /** + * Get sheet view + * + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function getSheetView() + { + return $this->_sheetView; + } + + /** + * Set sheet view + * + * @param PHPExcel_Worksheet_SheetView $pValue + * @return PHPExcel_Worksheet + */ + public function setSheetView(PHPExcel_Worksheet_SheetView $pValue) + { + $this->_sheetView = $pValue; + return $this; + } + + /** + * Get Protection + * + * @return PHPExcel_Worksheet_Protection + */ + public function getProtection() + { + return $this->_protection; + } + + /** + * Set Protection + * + * @param PHPExcel_Worksheet_Protection $pValue + * @return PHPExcel_Worksheet + */ + public function setProtection(PHPExcel_Worksheet_Protection $pValue) + { + $this->_protection = $pValue; + $this->_dirty = true; + + return $this; + } + + /** + * Get highest worksheet column + * + * @return string Highest column name + */ + public function getHighestColumn() + { + return $this->_cachedHighestColumn; + } + + /** + * Get highest worksheet column that contains data + * + * @return string Highest column name that contains data + */ + public function getHighestDataColumn() + { + return $this->_cellCollection->getHighestColumn(); + } + + /** + * Get highest worksheet row + * + * @return int Highest row number + */ + public function getHighestRow() + { + return $this->_cachedHighestRow; + } + + /** + * Get highest worksheet row that contains data + * + * @return string Highest row number that contains data + */ + public function getHighestDataRow() + { + return $this->_cellCollection->getHighestRow(); + } + + /** + * Get highest worksheet column and highest row that have cell records + * + * @return array Highest column name and highest row number + */ + public function getHighestRowAndColumn() + { + return $this->_cellCollection->getHighestRowAndColumn(); + } + + /** + * Set a cell value + * + * @param string $pCoordinate Coordinate of the cell + * @param mixed $pValue Value of the cell + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValue($pCoordinate = 'A1', $pValue = null, $returnCell = false) + { + $cell = $this->getCell($pCoordinate)->setValue($pValue); + return ($returnCell) ? $cell : $this; + } + + /** + * Set a cell value by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell + * @param string $pRow Numeric row coordinate of the cell + * @param mixed $pValue Value of the cell + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValueByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $returnCell = false) + { + $cell = $this->getCell(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow)->setValue($pValue); + return ($returnCell) ? $cell : $this; + } + + /** + * Set a cell value + * + * @param string $pCoordinate Coordinate of the cell + * @param mixed $pValue Value of the cell + * @param string $pDataType Explicit data type + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValueExplicit($pCoordinate = 'A1', $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false) + { + // Set value + $cell = $this->getCell($pCoordinate)->setValueExplicit($pValue, $pDataType); + return ($returnCell) ? $cell : $this; + } + + /** + * Set a cell value by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell + * @param string $pRow Numeric row coordinate of the cell + * @param mixed $pValue Value of the cell + * @param string $pDataType Explicit data type + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValueExplicitByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false) + { + $cell = $this->getCell(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow)->setValueExplicit($pValue, $pDataType); + return ($returnCell) ? $cell : $this; + } + + /** + * Get cell at a specific coordinate + * + * @param string $pCoordinate Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found + */ + public function getCell($pCoordinate = 'A1') + { + // Check cell collection + if ($this->_cellCollection->isDataSet($pCoordinate)) { + return $this->_cellCollection->getCacheData($pCoordinate); + } + + // Worksheet reference? + if (strpos($pCoordinate, '!') !== false) { + $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true); + return $this->getParent()->getSheetByName($worksheetReference[0])->getCell($worksheetReference[1]); + } + + // Named range? + if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) && + (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) { + $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this); + if ($namedRange !== NULL) { + $pCoordinate = $namedRange->getRange(); + return $namedRange->getWorksheet()->getCell($pCoordinate); + } + } + + // Uppercase coordinate + $pCoordinate = strtoupper($pCoordinate); + + if (strpos($pCoordinate,':') !== false || strpos($pCoordinate,',') !== false) { + throw new Exception('Cell coordinate can not be a range of cells.'); + } elseif (strpos($pCoordinate,'$') !== false) { + throw new Exception('Cell coordinate must not be absolute.'); + } else { + // Create new cell object + + // Coordinates + $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate); + + $cell = $this->_cellCollection->addCacheData($pCoordinate,new PHPExcel_Cell($aCoordinates[0], $aCoordinates[1], null, PHPExcel_Cell_DataType::TYPE_NULL, $this)); + $this->_cellCollectionIsSorted = false; + + if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($aCoordinates[0])) + $this->_cachedHighestColumn = $aCoordinates[0]; + + $this->_cachedHighestRow = max($this->_cachedHighestRow,$aCoordinates[1]); + + // Cell needs appropriate xfIndex + $rowDimensions = $this->getRowDimensions(); + $columnDimensions = $this->getColumnDimensions(); + + if ( isset($rowDimensions[$aCoordinates[1]]) && $rowDimensions[$aCoordinates[1]]->getXfIndex() !== null ) { + // then there is a row dimension with explicit style, assign it to the cell + $cell->setXfIndex($rowDimensions[$aCoordinates[1]]->getXfIndex()); + } else if ( isset($columnDimensions[$aCoordinates[0]]) ) { + // then there is a column dimension, assign it to the cell + $cell->setXfIndex($columnDimensions[$aCoordinates[0]]->getXfIndex()); + } else { + // set to default index + $cell->setXfIndex(0); + } + + return $cell; + } + } + + /** + * Get cell at a specific coordinate by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell + * @param string $pRow Numeric row coordinate of the cell + * @return PHPExcel_Cell Cell that was found + */ + public function getCellByColumnAndRow($pColumn = 0, $pRow = 1) + { + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($pColumn); + $coordinate = $columnLetter . $pRow; + + if (!$this->_cellCollection->isDataSet($coordinate)) { + $cell = $this->_cellCollection->addCacheData($coordinate, new PHPExcel_Cell($columnLetter, $pRow, null, PHPExcel_Cell_DataType::TYPE_NULL, $this)); + $this->_cellCollectionIsSorted = false; + + if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < $pColumn) + $this->_cachedHighestColumn = $columnLetter; + + $this->_cachedHighestRow = max($this->_cachedHighestRow,$pRow); + + return $cell; + } + + return $this->_cellCollection->getCacheData($coordinate); + } + + /** + * Cell at a specific coordinate exists? + * + * @param string $pCoordinate Coordinate of the cell + * @throws Exception + * @return boolean + */ + public function cellExists($pCoordinate = 'A1') + { + // Worksheet reference? + if (strpos($pCoordinate, '!') !== false) { + $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true); + return $this->getParent()->getSheetByName($worksheetReference[0])->cellExists($worksheetReference[1]); + } + + // Named range? + if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) && + (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) { + $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this); + if ($namedRange !== NULL) { + $pCoordinate = $namedRange->getRange(); + if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) { + if (!$namedRange->getLocalOnly()) { + return $namedRange->getWorksheet()->cellExists($pCoordinate); + } else { + throw new Exception('Named range ' . $namedRange->getName() . ' is not accessible from within sheet ' . $this->getTitle()); + } + } + } + } + + // Uppercase coordinate + $pCoordinate = strtoupper($pCoordinate); + + if (strpos($pCoordinate,':') !== false || strpos($pCoordinate,',') !== false) { + throw new Exception('Cell coordinate can not be a range of cells.'); + } elseif (strpos($pCoordinate,'$') !== false) { + throw new Exception('Cell coordinate must not be absolute.'); + } else { + // Coordinates + $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate); + + // Cell exists? + return $this->_cellCollection->isDataSet($pCoordinate); + } + } + + /** + * Cell at a specific coordinate by using numeric cell coordinates exists? + * + * @param string $pColumn Numeric column coordinate of the cell + * @param string $pRow Numeric row coordinate of the cell + * @return boolean + */ + public function cellExistsByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->cellExists(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Get row dimension at a specific row + * + * @param int $pRow Numeric index of the row + * @return PHPExcel_Worksheet_RowDimension + */ + public function getRowDimension($pRow = 1) + { + // Found + $found = null; + + // Get row dimension + if (!isset($this->_rowDimensions[$pRow])) { + $this->_rowDimensions[$pRow] = new PHPExcel_Worksheet_RowDimension($pRow); + + $this->_cachedHighestRow = max($this->_cachedHighestRow,$pRow); + } + return $this->_rowDimensions[$pRow]; + } + + /** + * Get column dimension at a specific column + * + * @param string $pColumn String index of the column + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function getColumnDimension($pColumn = 'A') + { + // Uppercase coordinate + $pColumn = strtoupper($pColumn); + + // Fetch dimensions + if (!isset($this->_columnDimensions[$pColumn])) { + $this->_columnDimensions[$pColumn] = new PHPExcel_Worksheet_ColumnDimension($pColumn); + + if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($pColumn)) + $this->_cachedHighestColumn = $pColumn; + } + return $this->_columnDimensions[$pColumn]; + } + + /** + * Get column dimension at a specific column by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function getColumnDimensionByColumn($pColumn = 0) + { + return $this->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($pColumn)); + } + + /** + * Get styles + * + * @return PHPExcel_Style[] + */ + public function getStyles() + { + return $this->_styles; + } + + /** + * Get default style of workbork. + * + * @deprecated + * @return PHPExcel_Style + * @throws Exception + */ + public function getDefaultStyle() + { + return $this->_parent->getDefaultStyle(); + } + + /** + * Set default style - should only be used by PHPExcel_IReader implementations! + * + * @deprecated + * @param PHPExcel_Style $pValue + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setDefaultStyle(PHPExcel_Style $pValue) + { + $this->_parent->getDefaultStyle()->applyFromArray(array( + 'font' => array( + 'name' => $pValue->getFont()->getName(), + 'size' => $pValue->getFont()->getSize(), + ), + )); + return $this; + } + + /** + * Get style for cell + * + * @param string $pCellCoordinate Cell coordinate to get style for + * @return PHPExcel_Style + * @throws Exception + */ + public function getStyle($pCellCoordinate = 'A1') + { + // set this sheet as active + $this->_parent->setActiveSheetIndex($this->_parent->getIndex($this)); + + // set cell coordinate as active + $this->setSelectedCells($pCellCoordinate); + + return $this->_parent->getCellXfSupervisor(); + } + + /** + * Get conditional styles for a cell + * + * @param string $pCoordinate + * @return PHPExcel_Style_Conditional[] + */ + public function getConditionalStyles($pCoordinate = 'A1') + { + if (!isset($this->_conditionalStylesCollection[$pCoordinate])) { + $this->_conditionalStylesCollection[$pCoordinate] = array(); + } + return $this->_conditionalStylesCollection[$pCoordinate]; + } + + /** + * Do conditional styles exist for this cell? + * + * @param string $pCoordinate + * @return boolean + */ + public function conditionalStylesExists($pCoordinate = 'A1') + { + if (isset($this->_conditionalStylesCollection[$pCoordinate])) { + return true; + } + return false; + } + + /** + * Removes conditional styles for a cell + * + * @param string $pCoordinate + * @return PHPExcel_Worksheet + */ + public function removeConditionalStyles($pCoordinate = 'A1') + { + unset($this->_conditionalStylesCollection[$pCoordinate]); + return $this; + } + + /** + * Get collection of conditional styles + * + * @return array + */ + public function getConditionalStylesCollection() + { + return $this->_conditionalStylesCollection; + } + + /** + * Set conditional styles + * + * @param $pCoordinate string E.g. 'A1' + * @param $pValue PHPExcel_Style_Conditional[] + * @return PHPExcel_Worksheet + */ + public function setConditionalStyles($pCoordinate = 'A1', $pValue) + { + $this->_conditionalStylesCollection[$pCoordinate] = $pValue; + return $this; + } + + /** + * Get style for cell by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @return PHPExcel_Style + */ + public function getStyleByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->getStyle(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Set shared cell style to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range! + * + * @deprecated + * @param PHPExcel_Style $pSharedCellStyle Cell style to share + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setSharedStyle(PHPExcel_Style $pSharedCellStyle = null, $pRange = '') + { + $this->duplicateStyle($pSharedCellStyle, $pRange); + return $this; + } + + /** + * Duplicate cell style to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range! + * + * @param PHPExcel_Style $pCellStyle Cell style to duplicate + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function duplicateStyle(PHPExcel_Style $pCellStyle = null, $pRange = '') + { + // make sure we have a real style and not supervisor + $style = $pCellStyle->getIsSupervisor() ? $pCellStyle->getSharedComponent() : $pCellStyle; + + // Add the style to the workbook if necessary + $workbook = $this->_parent; + if ($existingStyle = $this->_parent->getCellXfByHashCode($pCellStyle->getHashCode())) { + // there is already such cell Xf in our collection + $xfIndex = $existingStyle->getIndex(); + } else { + // we don't have such a cell Xf, need to add + $workbook->addCellXf($pCellStyle); + $xfIndex = $pCellStyle->getIndex(); + } + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Is it a cell range or a single cell? + $rangeA = ''; + $rangeB = ''; + if (strpos($pRange, ':') === false) { + $rangeA = $pRange; + $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + // Calculate range outer borders + $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); + $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); + + // Translate column into index + $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1; + $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1; + + // Make sure we can loop upwards on rows and columns + if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { + $tmp = $rangeStart; + $rangeStart = $rangeEnd; + $rangeEnd = $tmp; + } + + // Loop through cells and apply styles + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $this->getCell(PHPExcel_Cell::stringFromColumnIndex($col) . $row)->setXfIndex($xfIndex); + } + } + + return $this; + } + + /** + * Duplicate conditional style to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range! + * + * @param array of PHPExcel_Style_Conditional $pCellStyle Cell style to duplicate + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function duplicateConditionalStyle(array $pCellStyle = null, $pRange = '') + { + foreach($pCellStyle as $cellStyle) { + if (!is_a($cellStyle,'PHPExcel_Style_Conditional')) { + throw new Exception('Style is not a conditional style'); + } + } + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Is it a cell range or a single cell? + $rangeA = ''; + $rangeB = ''; + if (strpos($pRange, ':') === false) { + $rangeA = $pRange; + $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + // Calculate range outer borders + $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); + $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); + + // Translate column into index + $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1; + $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1; + + // Make sure we can loop upwards on rows and columns + if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { + $tmp = $rangeStart; + $rangeStart = $rangeEnd; + $rangeEnd = $tmp; + } + + // Loop through cells and apply styles + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $this->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($col) . $row, $pCellStyle); + } + } + + return $this; + } + + /** + * Duplicate cell style array to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range, + * if they are in the styles array. For example, if you decide to set a range of + * cells to font bold, only include font bold in the styles array. + * + * @deprecated + * @param array $pStyles Array containing style information + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @param boolean $pAdvanced Advanced mode for setting borders. + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function duplicateStyleArray($pStyles = null, $pRange = '', $pAdvanced = true) + { + $this->getStyle($pRange)->applyFromArray($pStyles, $pAdvanced); + return $this; + } + + /** + * Set break on a cell + * + * @param string $pCell Cell coordinate (e.g. A1) + * @param int $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setBreak($pCell = 'A1', $pBreak = PHPExcel_Worksheet::BREAK_NONE) + { + // Uppercase coordinate + $pCell = strtoupper($pCell); + + if ($pCell != '') { + $this->_breaks[$pCell] = $pBreak; + } else { + throw new Exception('No cell coordinate specified.'); + } + + return $this; + } + + /** + * Set break on a cell by using numeric cell coordinates + * + * @param integer $pColumn Numeric column coordinate of the cell + * @param integer $pRow Numeric row coordinate of the cell + * @param integer $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setBreakByColumnAndRow($pColumn = 0, $pRow = 1, $pBreak = PHPExcel_Worksheet::BREAK_NONE) + { + return $this->setBreak(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow, $pBreak); + } + + /** + * Get breaks + * + * @return array[] + */ + public function getBreaks() + { + return $this->_breaks; + } + + /** + * Set merge on a cell range + * + * @param string $pRange Cell range (e.g. A1:E1) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function mergeCells($pRange = 'A1:A1') + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (strpos($pRange,':') !== false) { + $this->_mergeCells[$pRange] = $pRange; + + // make sure cells are created + + // get the cells in the range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange); + + // create upper left cell if it does not already exist + $upperLeft = $aReferences[0]; + if (!$this->cellExists($upperLeft)) { + $this->getCell($upperLeft)->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL); + } + + // create or blank out the rest of the cells in the range + $count = count($aReferences); + for ($i = 1; $i < $count; $i++) { + $this->getCell($aReferences[$i])->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL); + } + + } else { + throw new Exception('Merge must be set on a range of cells.'); + } + + return $this; + } + + /** + * Set merge on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function mergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->mergeCells($cellRange); + } + + /** + * Remove merge on a cell range + * + * @param string $pRange Cell range (e.g. A1:E1) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function unmergeCells($pRange = 'A1:A1') + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (strpos($pRange,':') !== false) { + if (isset($this->_mergeCells[$pRange])) { + unset($this->_mergeCells[$pRange]); + } else { + throw new Exception('Cell range ' . $pRange . ' not known as merged.'); + } + } else { + throw new Exception('Merge can only be removed from a range of cells.'); + } + + return $this; + } + + /** + * Remove merge on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function unmergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->unmergeCells($cellRange); + } + + /** + * Get merge cells array. + * + * @return array[] + */ + public function getMergeCells() + { + return $this->_mergeCells; + } + + /** + * Set merge cells array for the entire sheet. Use instead mergeCells() to merge + * a single cell range. + * + * @param array + */ + public function setMergeCells($pValue = array()) + { + $this->_mergeCells = $pValue; + + return $this; + } + + /** + * Set protection on a cell range + * + * @param string $pRange Cell (e.g. A1) or cell range (e.g. A1:E1) + * @param string $pPassword Password to unlock the protection + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function protectCells($pRange = 'A1', $pPassword = '', $pAlreadyHashed = false) + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (!$pAlreadyHashed) { + $pPassword = PHPExcel_Shared_PasswordHasher::hashPassword($pPassword); + } + $this->_protectedCells[$pRange] = $pPassword; + + return $this; + } + + /** + * Set protection on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @param string $pPassword Password to unlock the protection + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function protectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->protectCells($cellRange, $pPassword, $pAlreadyHashed); + } + + /** + * Remove protection on a cell range + * + * @param string $pRange Cell (e.g. A1) or cell range (e.g. A1:E1) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function unprotectCells($pRange = 'A1') + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (isset($this->_protectedCells[$pRange])) { + unset($this->_protectedCells[$pRange]); + } else { + throw new Exception('Cell range ' . $pRange . ' not known as protected.'); + } + return $this; + } + + /** + * Remove protection on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @param string $pPassword Password to unlock the protection + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function unprotectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->unprotectCells($cellRange, $pPassword, $pAlreadyHashed); + } + + /** + * Get protected cells + * + * @return array[] + */ + public function getProtectedCells() + { + return $this->_protectedCells; + } + + /** + * Get Autofilter + * + * @return PHPExcel_Worksheet_AutoFilter + */ + public function getAutoFilter() + { + return $this->_autoFilter; + } + + /** + * Set AutoFilter + * + * @param PHPExcel_Worksheet_AutoFilter|string $pValue + * A simple string containing a Cell range like 'A1:E10' is permitted for backward compatibility + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setAutoFilter($pValue) + { + if (is_string($pValue)) { + $this->_autoFilter->setRange($pValue); + } elseif(is_object($pValue) && ($pValue instanceof PHPExcel_Worksheet_AutoFilter)) { + $this->_autoFilter = $pValue; + } + return $this; + } + + /** + * Set Autofilter Range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the second cell + * @param int $pRow2 Numeric row coordinate of the second cell + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setAutoFilterByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1) + { + return $this->setAutoFilter( + PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 + . ':' . + PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2 + ); + } + + /** + * Remove autofilter + * + * @return PHPExcel_Worksheet + */ + public function removeAutoFilter() + { + $this->_autoFilter->setRange(NULL); + return $this; + } + + /** + * Get Freeze Pane + * + * @return string + */ + public function getFreezePane() + { + return $this->_freezePane; + } + + /** + * Freeze Pane + * + * @param string $pCell Cell (i.e. A2) + * Examples: + * A2 will freeze the rows above cell A2 (i.e row 1) + * B1 will freeze the columns to the left of cell B1 (i.e column A) + * B2 will freeze the rows above and to the left of cell A2 + * (i.e row 1 and column A) + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function freezePane($pCell = '') + { + // Uppercase coordinate + $pCell = strtoupper($pCell); + + if (strpos($pCell,':') === false && strpos($pCell,',') === false) { + $this->_freezePane = $pCell; + } else { + throw new Exception('Freeze pane can not be set on a range of cells.'); + } + return $this; + } + + /** + * Freeze Pane by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function freezePaneByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->freezePane(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Unfreeze Pane + * + * @return PHPExcel_Worksheet + */ + public function unfreezePane() + { + return $this->freezePane(''); + } + + /** + * Insert a new row, updating all possible related data + * + * @param int $pBefore Insert before this one + * @param int $pNumRows Number of rows to insert + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function insertNewRowBefore($pBefore = 1, $pNumRows = 1) { + if ($pBefore >= 1) { + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore('A' . $pBefore, 0, $pNumRows, $this); + } else { + throw new Exception("Rows can only be inserted before at least row 1."); + } + return $this; + } + + /** + * Insert a new column, updating all possible related data + * + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to insert + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function insertNewColumnBefore($pBefore = 'A', $pNumCols = 1) { + if (!is_numeric($pBefore)) { + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore($pBefore . '1', $pNumCols, 0, $this); + } else { + throw new Exception("Column references should not be numeric."); + } + return $this; + } + + /** + * Insert a new column, updating all possible related data + * + * @param int $pBefore Insert before this one (numeric column coordinate of the cell) + * @param int $pNumCols Number of columns to insert + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function insertNewColumnBeforeByIndex($pBefore = 0, $pNumCols = 1) { + if ($pBefore >= 0) { + return $this->insertNewColumnBefore(PHPExcel_Cell::stringFromColumnIndex($pBefore), $pNumCols); + } else { + throw new Exception("Columns can only be inserted before at least column A (0)."); + } + } + + /** + * Delete a row, updating all possible related data + * + * @param int $pRow Remove starting with this one + * @param int $pNumRows Number of rows to remove + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function removeRow($pRow = 1, $pNumRows = 1) { + if ($pRow >= 1) { + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore('A' . ($pRow + $pNumRows), 0, -$pNumRows, $this); + } else { + throw new Exception("Rows to be deleted should at least start from row 1."); + } + return $this; + } + + /** + * Remove a column, updating all possible related data + * + * @param int $pColumn Remove starting with this one + * @param int $pNumCols Number of columns to remove + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function removeColumn($pColumn = 'A', $pNumCols = 1) { + if (!is_numeric($pColumn)) { + $pColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($pColumn) - 1 + $pNumCols); + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this); + } else { + throw new Exception("Column references should not be numeric."); + } + return $this; + } + + /** + * Remove a column, updating all possible related data + * + * @param int $pColumn Remove starting with this one (numeric column coordinate of the cell) + * @param int $pNumCols Number of columns to remove + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function removeColumnByIndex($pColumn = 0, $pNumCols = 1) { + if ($pColumn >= 0) { + return $this->removeColumn(PHPExcel_Cell::stringFromColumnIndex($pColumn), $pNumCols); + } else { + throw new Exception("Columns to be deleted should at least start from column 0"); + } + } + + /** + * Show gridlines? + * + * @return boolean + */ + public function getShowGridlines() { + return $this->_showGridlines; + } + + /** + * Set show gridlines + * + * @param boolean $pValue Show gridlines (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowGridlines($pValue = false) { + $this->_showGridlines = $pValue; + return $this; + } + + /** + * Print gridlines? + * + * @return boolean + */ + public function getPrintGridlines() { + return $this->_printGridlines; + } + + /** + * Set print gridlines + * + * @param boolean $pValue Print gridlines (true/false) + * @return PHPExcel_Worksheet + */ + public function setPrintGridlines($pValue = false) { + $this->_printGridlines = $pValue; + return $this; + } + + /** + * Show row and column headers? + * + * @return boolean + */ + public function getShowRowColHeaders() { + return $this->_showRowColHeaders; + } + + /** + * Set show row and column headers + * + * @param boolean $pValue Show row and column headers (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowRowColHeaders($pValue = false) { + $this->_showRowColHeaders = $pValue; + return $this; + } + + /** + * Show summary below? (Row/Column outlining) + * + * @return boolean + */ + public function getShowSummaryBelow() { + return $this->_showSummaryBelow; + } + + /** + * Set show summary below + * + * @param boolean $pValue Show summary below (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowSummaryBelow($pValue = true) { + $this->_showSummaryBelow = $pValue; + return $this; + } + + /** + * Show summary right? (Row/Column outlining) + * + * @return boolean + */ + public function getShowSummaryRight() { + return $this->_showSummaryRight; + } + + /** + * Set show summary right + * + * @param boolean $pValue Show summary right (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowSummaryRight($pValue = true) { + $this->_showSummaryRight = $pValue; + return $this; + } + + /** + * Get comments + * + * @return PHPExcel_Comment[] + */ + public function getComments() + { + return $this->_comments; + } + + /** + * Set comments array for the entire sheet. + * + * @param array of PHPExcel_Comment + * @return PHPExcel_Worksheet + */ + public function setComments($pValue = array()) + { + $this->_comments = $pValue; + + return $this; + } + + /** + * Get comment for cell + * + * @param string $pCellCoordinate Cell coordinate to get comment for + * @return PHPExcel_Comment + * @throws Exception + */ + public function getComment($pCellCoordinate = 'A1') + { + // Uppercase coordinate + $pCellCoordinate = strtoupper($pCellCoordinate); + + if (strpos($pCellCoordinate,':') !== false || strpos($pCellCoordinate,',') !== false) { + throw new Exception('Cell coordinate string can not be a range of cells.'); + } else if (strpos($pCellCoordinate,'$') !== false) { + throw new Exception('Cell coordinate string must not be absolute.'); + } else if ($pCellCoordinate == '') { + throw new Exception('Cell coordinate can not be zero-length string.'); + } else { + // Check if we already have a comment for this cell. + // If not, create a new comment. + if (isset($this->_comments[$pCellCoordinate])) { + return $this->_comments[$pCellCoordinate]; + } else { + $newComment = new PHPExcel_Comment(); + $this->_comments[$pCellCoordinate] = $newComment; + return $newComment; + } + } + } + + /** + * Get comment for cell by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @return PHPExcel_Comment + */ + public function getCommentByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->getComment(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Get selected cell + * + * @deprecated + * @return string + */ + public function getSelectedCell() + { + return $this->getSelectedCells(); + } + + /** + * Get active cell + * + * @return string Example: 'A1' + */ + public function getActiveCell() + { + return $this->_activeCell; + } + + /** + * Get selected cells + * + * @return string + */ + public function getSelectedCells() + { + return $this->_selectedCells; + } + + /** + * Selected cell + * + * @param string $pCoordinate Cell (i.e. A1) + * @return PHPExcel_Worksheet + */ + public function setSelectedCell($pCoordinate = 'A1') + { + return $this->setSelectedCells($pCoordinate); + } + + /** + * Select a range of cells. + * + * @param string $pCoordinate Cell range, examples: 'A1', 'B2:G5', 'A:C', '3:6' + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setSelectedCells($pCoordinate = 'A1') + { + // Uppercase coordinate + $pCoordinate = strtoupper($pCoordinate); + + // Convert 'A' to 'A:A' + $pCoordinate = preg_replace('/^([A-Z]+)$/', '${1}:${1}', $pCoordinate); + + // Convert '1' to '1:1' + $pCoordinate = preg_replace('/^([0-9]+)$/', '${1}:${1}', $pCoordinate); + + // Convert 'A:C' to 'A1:C1048576' + $pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $pCoordinate); + + // Convert '1:3' to 'A1:XFD3' + $pCoordinate = preg_replace('/^([0-9]+):([0-9]+)$/', 'A${1}:XFD${2}', $pCoordinate); + + if (strpos($pCoordinate,':') !== false || strpos($pCoordinate,',') !== false) { + list($first, ) = PHPExcel_Cell::splitRange($pCoordinate); + $this->_activeCell = $first[0]; + } else { + $this->_activeCell = $pCoordinate; + } + $this->_selectedCells = $pCoordinate; + return $this; + } + + /** + * Selected cell by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function setSelectedCellByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->setSelectedCells(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Get right-to-left + * + * @return boolean + */ + public function getRightToLeft() { + return $this->_rightToLeft; + } + + /** + * Set right-to-left + * + * @param boolean $value Right-to-left true/false + * @return PHPExcel_Worksheet + */ + public function setRightToLeft($value = false) { + $this->_rightToLeft = $value; + return $this; + } + + /** + * Fill worksheet from values in array + * + * @param array $source Source array + * @param mixed $nullValue Value in source array that stands for blank cell + * @param string $startCell Insert array starting from this cell address as the top left coordinate + * @param boolean $strictNullComparison Apply strict comparison when testing for null values in the array + * @throws Exception + * @return PHPExcel_Worksheet + */ + public function fromArray($source = null, $nullValue = null, $startCell = 'A1', $strictNullComparison = false) { + if (is_array($source)) { + // Convert a 1-D array to 2-D (for ease of looping) + if (!is_array(end($source))) { + $source = array($source); + } + + // start coordinate + list ($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($startCell); + + // Loop through $source + foreach ($source as $rowData) { + $currentColumn = $startColumn; + foreach($rowData as $cellValue) { + if ($strictNullComparison) { + if ($cellValue !== $nullValue) { + // Set cell value + $this->getCell($currentColumn . $startRow)->setValue($cellValue); + } + } else { + if ($cellValue != $nullValue) { + // Set cell value + $this->getCell($currentColumn . $startRow)->setValue($cellValue); + } + } + ++$currentColumn; + } + ++$startRow; + } + } else { + throw new Exception("Parameter \$source should be an array."); + } + return $this; + } + + /** + * Create array from a range of cells + * + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist + * @param boolean $calculateFormulas Should formulas be calculated? + * @param boolean $formatData Should formatting be applied to cell values? + * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero + * True - Return rows and columns indexed by their actual row and column IDs + * @return array + */ + public function rangeToArray($pRange = 'A1', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) { + // Returnvalue + $returnValue = array(); + + // Identify the range that we need to extract from the worksheet + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange); + $minCol = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] -1); + $minRow = $rangeStart[1]; + $maxCol = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] -1); + $maxRow = $rangeEnd[1]; + + $maxCol++; + + // Loop through rows + $r = -1; + for ($row = $minRow; $row <= $maxRow; ++$row) { + $rRef = ($returnCellRef) ? $row : ++$r; + $c = -1; + // Loop through columns in the current row + for ($col = $minCol; $col != $maxCol; ++$col) { + $cRef = ($returnCellRef) ? $col : ++$c; + // Using getCell() will create a new cell if it doesn't already exist. We don't want that to happen + // so we test and retrieve directly against _cellCollection + if ($this->_cellCollection->isDataSet($col.$row)) { + // Cell exists + $cell = $this->_cellCollection->getCacheData($col.$row); + if ($cell->getValue() !== null) { + if ($cell->getValue() instanceof PHPExcel_RichText) { + $returnValue[$rRef][$cRef] = $cell->getValue()->getPlainText(); + } else { + if ($calculateFormulas) { + $returnValue[$rRef][$cRef] = $cell->getCalculatedValue(); + } else { + $returnValue[$rRef][$cRef] = $cell->getValue(); + } + } + + if ($formatData) { + $style = $this->_parent->getCellXfByIndex($cell->getXfIndex()); + $returnValue[$rRef][$cRef] = PHPExcel_Style_NumberFormat::toFormattedString($returnValue[$rRef][$cRef], $style->getNumberFormat()->getFormatCode()); + } + } else { + // Cell holds a NULL + $returnValue[$rRef][$cRef] = $nullValue; + } + } else { + // Cell doesn't exist + $returnValue[$rRef][$cRef] = $nullValue; + } + } + } + + // Return + return $returnValue; + } + + + /** + * Create array from a range of cells + * + * @param string $pNamedRange Name of the Named Range + * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist + * @param boolean $calculateFormulas Should formulas be calculated? + * @param boolean $formatData Should formatting be applied to cell values? + * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero + * True - Return rows and columns indexed by their actual row and column IDs + * @return array + * @throws Exception + */ + public function namedRangeToArray($pNamedRange = '', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) { + $namedRange = PHPExcel_NamedRange::resolveRange($pNamedRange, $this); + if ($namedRange !== NULL) { + $pWorkSheet = $namedRange->getWorksheet(); + $pCellRange = $namedRange->getRange(); + + return $pWorkSheet->rangeToArray( $pCellRange, + $nullValue, $calculateFormulas, $formatData, $returnCellRef); + } + + throw new Exception('Named Range '.$pNamedRange.' does not exist.'); + } + + + /** + * Create array from worksheet + * + * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist + * @param boolean $calculateFormulas Should formulas be calculated? + * @param boolean $formatData Should formatting be applied to cell values? + * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero + * True - Return rows and columns indexed by their actual row and column IDs + * @return array + */ + public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) { + // Garbage collect... + $this->garbageCollect(); + + // Identify the range that we need to extract from the worksheet + $maxCol = $this->getHighestColumn(); + $maxRow = $this->getHighestRow(); + // Return + return $this->rangeToArray( 'A1:'.$maxCol.$maxRow, + $nullValue, $calculateFormulas, $formatData, $returnCellRef); + } + + /** + * Get row iterator + * + * @param integer $startRow The row number at which to start iterating + * @return PHPExcel_Worksheet_RowIterator + */ + public function getRowIterator($startRow = 1) { + return new PHPExcel_Worksheet_RowIterator($this,$startRow); + } + + /** + * Run PHPExcel garabage collector. + * + * @return PHPExcel_Worksheet + */ + public function garbageCollect() { + // Build a reference table from images +// $imageCoordinates = array(); +// $iterator = $this->getDrawingCollection()->getIterator(); +// while ($iterator->valid()) { +// $imageCoordinates[$iterator->current()->getCoordinates()] = true; +// +// $iterator->next(); +// } +// + // Lookup highest column and highest row if cells are cleaned + $colRow = $this->_cellCollection->getHighestRowAndColumn(); + $highestRow = $colRow['row']; + $highestColumn = PHPExcel_Cell::columnIndexFromString($colRow['column']); + + // Loop through column dimensions + foreach ($this->_columnDimensions as $dimension) { + $highestColumn = max($highestColumn,PHPExcel_Cell::columnIndexFromString($dimension->getColumnIndex())); + } + + // Loop through row dimensions + foreach ($this->_rowDimensions as $dimension) { + $highestRow = max($highestRow,$dimension->getRowIndex()); + } + + // Cache values + if ($highestColumn < 0) { + $this->_cachedHighestColumn = 'A'; + } else { + $this->_cachedHighestColumn = PHPExcel_Cell::stringFromColumnIndex(--$highestColumn); + } + $this->_cachedHighestRow = $highestRow; + + // Return + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + if ($this->_dirty) { + $this->_hash = md5( $this->_title . + $this->_autoFilter . + ($this->_protection->isProtectionEnabled() ? 't' : 'f') . + __CLASS__ + ); + $this->_dirty = false; + } + return $this->_hash; + } + + /** + * Extract worksheet title from range. + * + * Example: extractSheetTitle("testSheet!A1") ==> 'A1' + * Example: extractSheetTitle("'testSheet 1'!A1", true) ==> array('testSheet 1', 'A1'); + * + * @param string $pRange Range to extract title from + * @param bool $returnRange Return range? (see example) + * @return mixed + */ + public static function extractSheetTitle($pRange, $returnRange = false) { + // Sheet title included? + if (($sep = strpos($pRange, '!')) === false) { + return ''; + } + + if ($returnRange) { + return array( trim(substr($pRange, 0, $sep),"'"), + substr($pRange, $sep + 1) + ); + } + + return substr($pRange, $sep + 1); + } + + /** + * Get hyperlink + * + * @param string $pCellCoordinate Cell coordinate to get hyperlink for + */ + public function getHyperlink($pCellCoordinate = 'A1') + { + // return hyperlink if we already have one + if (isset($this->_hyperlinkCollection[$pCellCoordinate])) { + return $this->_hyperlinkCollection[$pCellCoordinate]; + } + + // else create hyperlink + $this->_hyperlinkCollection[$pCellCoordinate] = new PHPExcel_Cell_Hyperlink(); + return $this->_hyperlinkCollection[$pCellCoordinate]; + } + + /** + * Set hyperlnk + * + * @param string $pCellCoordinate Cell coordinate to insert hyperlink + * @param PHPExcel_Cell_Hyperlink $pHyperlink + * @return PHPExcel_Worksheet + */ + public function setHyperlink($pCellCoordinate = 'A1', PHPExcel_Cell_Hyperlink $pHyperlink = null) + { + if ($pHyperlink === null) { + unset($this->_hyperlinkCollection[$pCellCoordinate]); + } else { + $this->_hyperlinkCollection[$pCellCoordinate] = $pHyperlink; + } + return $this; + } + + /** + * Hyperlink at a specific coordinate exists? + * + * @param string $pCoordinate + * @return boolean + */ + public function hyperlinkExists($pCoordinate = 'A1') + { + return isset($this->_hyperlinkCollection[$pCoordinate]); + } + + /** + * Get collection of hyperlinks + * + * @return PHPExcel_Cell_Hyperlink[] + */ + public function getHyperlinkCollection() + { + return $this->_hyperlinkCollection; + } + + /** + * Get data validation + * + * @param string $pCellCoordinate Cell coordinate to get data validation for + */ + public function getDataValidation($pCellCoordinate = 'A1') + { + // return data validation if we already have one + if (isset($this->_dataValidationCollection[$pCellCoordinate])) { + return $this->_dataValidationCollection[$pCellCoordinate]; + } + + // else create data validation + $this->_dataValidationCollection[$pCellCoordinate] = new PHPExcel_Cell_DataValidation(); + return $this->_dataValidationCollection[$pCellCoordinate]; + } + + /** + * Set data validation + * + * @param string $pCellCoordinate Cell coordinate to insert data validation + * @param PHPExcel_Cell_DataValidation $pDataValidation + * @return PHPExcel_Worksheet + */ + public function setDataValidation($pCellCoordinate = 'A1', PHPExcel_Cell_DataValidation $pDataValidation = null) + { + if ($pDataValidation === null) { + unset($this->_dataValidationCollection[$pCellCoordinate]); + } else { + $this->_dataValidationCollection[$pCellCoordinate] = $pDataValidation; + } + return $this; + } + + /** + * Data validation at a specific coordinate exists? + * + * @param string $pCoordinate + * @return boolean + */ + public function dataValidationExists($pCoordinate = 'A1') + { + return isset($this->_dataValidationCollection[$pCoordinate]); + } + + /** + * Get collection of data validations + * + * @return PHPExcel_Cell_DataValidation[] + */ + public function getDataValidationCollection() + { + return $this->_dataValidationCollection; + } + + /** + * Accepts a range, returning it as a range that falls within the current highest row and column of the worksheet + * + * @param string $range + * @return string Adjusted range value + */ + public function shrinkRangeToFit($range) { + $maxCol = $this->getHighestColumn(); + $maxRow = $this->getHighestRow(); + $maxCol = PHPExcel_Cell::columnIndexFromString($maxCol); + + $rangeBlocks = explode(' ',$range); + foreach ($rangeBlocks as &$rangeSet) { + $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($rangeSet); + + if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[0][0]) > $maxCol) { $rangeBoundaries[0][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol); } + if ($rangeBoundaries[0][1] > $maxRow) { $rangeBoundaries[0][1] = $maxRow; } + if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[1][0]) > $maxCol) { $rangeBoundaries[1][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol); } + if ($rangeBoundaries[1][1] > $maxRow) { $rangeBoundaries[1][1] = $maxRow; } + $rangeSet = $rangeBoundaries[0][0].$rangeBoundaries[0][1].':'.$rangeBoundaries[1][0].$rangeBoundaries[1][1]; + } + unset($rangeSet); + $stRange = implode(' ',$rangeBlocks); + + return $stRange; + } + + + /** + * Get tab color + * + * @return PHPExcel_Style_Color + */ + public function getTabColor() + { + if ($this->_tabColor === NULL) + $this->_tabColor = new PHPExcel_Style_Color(); + + return $this->_tabColor; + } + + /** + * Reset tab color + * + * @return PHPExcel_Worksheet + */ + public function resetTabColor() + { + $this->_tabColor = null; + unset($this->_tabColor); + + return $this; + } + + /** + * Tab color set? + * + * @return boolean + */ + public function isTabColorSet() + { + return ($this->_tabColor !== NULL); + } + + /** + * Copy worksheet (!= clone!) + * + * @return PHPExcel_Worksheet + */ + public function copy() { + $copied = clone $this; + + return $copied; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + foreach ($this as $key => $val) { + if ($key == '_parent') { + continue; + } + + if (is_object($val) || (is_array($val))) { + if ($key == '_cellCollection') { + $newCollection = clone $this->_cellCollection; + $newCollection->copyCellCollection($this); + $this->_cellCollection = $newCollection; + } elseif ($key == '_drawingCollection') { + $newCollection = clone $this->_drawingCollection; + $this->_drawingCollection = $newCollection; + } elseif (($key == '_autoFilter') && (is_a($this->_autoFilter,'PHPExcel_Worksheet_AutoFilter'))) { + $newAutoFilter = clone $this->_autoFilter; + $this->_autoFilter = $newAutoFilter; + $this->_autoFilter->setParent($this); + } else { + $this->{$key} = unserialize(serialize($val)); + } + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter.php new file mode 100644 index 000000000..e6ea6f207 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter.php @@ -0,0 +1,855 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_AutoFilter + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_AutoFilter +{ + /** + * Autofilter Worksheet + * + * @var PHPExcel_Worksheet + */ + private $_workSheet = NULL; + + + /** + * Autofilter Range + * + * @var string + */ + private $_range = ''; + + + /** + * Autofilter Column Ruleset + * + * @var array of PHPExcel_Worksheet_AutoFilter_Column + */ + private $_columns = array(); + + + /** + * Create a new PHPExcel_Worksheet_AutoFilter + */ + public function __construct($pRange = '', PHPExcel_Worksheet $pSheet = NULL) + { + $this->_range = $pRange; + $this->_workSheet = $pSheet; + } + + /** + * Get AutoFilter Parent Worksheet + * + * @return PHPExcel_Worksheet + */ + public function getParent() { + return $this->_workSheet; + } + + /** + * Set AutoFilter Parent Worksheet + * + * @param PHPExcel_Worksheet + * @return PHPExcel_Worksheet_AutoFilter + */ + public function setParent(PHPExcel_Worksheet $pSheet = NULL) { + $this->_workSheet = $pSheet; + + return $this; + } + + /** + * Get AutoFilter Range + * + * @return string + */ + public function getRange() { + return $this->_range; + } + + /** + * Set AutoFilter Range + * + * @param string $pRange Cell range (i.e. A1:E10) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function setRange($pRange = '') { + // Uppercase coordinate + $cellAddress = explode('!',strtoupper($pRange)); + if (count($cellAddress) > 1) { + list($worksheet,$pRange) = $cellAddress; + } + + if (strpos($pRange,':') !== FALSE) { + $this->_range = $pRange; + } elseif(empty($pRange)) { + $this->_range = ''; + } else { + throw new PHPExcel_Exception('Autofilter must be set on a range of cells.'); + } + + if (empty($pRange)) { + // Discard all column rules + $this->_columns = array(); + } else { + // Discard any column rules that are no longer valid within this range + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range); + foreach($this->_columns as $key => $value) { + $colIndex = PHPExcel_Cell::columnIndexFromString($key); + if (($rangeStart[0] > $colIndex) || ($rangeEnd[0] < $colIndex)) { + unset($this->_columns[$key]); + } + } + } + + return $this; + } + + /** + * Get all AutoFilter Columns + * + * @throws PHPExcel_Exception + * @return array of PHPExcel_Worksheet_AutoFilter_Column + */ + public function getColumns() { + return $this->_columns; + } + + /** + * Validate that the specified column is in the AutoFilter range + * + * @param string $column Column name (e.g. A) + * @throws PHPExcel_Exception + * @return integer The column offset within the autofilter range + */ + public function testColumnInRange($column) { + if (empty($this->_range)) { + throw new PHPExcel_Exception("No autofilter range is defined."); + } + + $columnIndex = PHPExcel_Cell::columnIndexFromString($column); + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range); + if (($rangeStart[0] > $columnIndex) || ($rangeEnd[0] < $columnIndex)) { + throw new PHPExcel_Exception("Column is outside of current autofilter range."); + } + + return $columnIndex - $rangeStart[0]; + } + + /** + * Get a specified AutoFilter Column Offset within the defined AutoFilter range + * + * @param string $pColumn Column name (e.g. A) + * @throws PHPExcel_Exception + * @return integer The offset of the specified column within the autofilter range + */ + public function getColumnOffset($pColumn) { + return $this->testColumnInRange($pColumn); + } + + /** + * Get a specified AutoFilter Column + * + * @param string $pColumn Column name (e.g. A) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function getColumn($pColumn) { + $this->testColumnInRange($pColumn); + + if (!isset($this->_columns[$pColumn])) { + $this->_columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this); + } + + return $this->_columns[$pColumn]; + } + + /** + * Get a specified AutoFilter Column by it's offset + * + * @param integer $pColumnOffset Column offset within range (starting from 0) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function getColumnByOffset($pColumnOffset = 0) { + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range); + $pColumn = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $pColumnOffset - 1); + + return $this->getColumn($pColumn); + } + + /** + * Set AutoFilter + * + * @param PHPExcel_Worksheet_AutoFilter_Column|string $pColumn + * A simple string containing a Column ID like 'A' is permitted + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function setColumn($pColumn) + { + if ((is_string($pColumn)) && (!empty($pColumn))) { + $column = $pColumn; + } elseif(is_object($pColumn) && ($pColumn instanceof PHPExcel_Worksheet_AutoFilter_Column)) { + $column = $pColumn->getColumnIndex(); + } else { + throw new PHPExcel_Exception("Column is not within the autofilter range."); + } + $this->testColumnInRange($column); + + if (is_string($pColumn)) { + $this->_columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this); + } elseif(is_object($pColumn) && ($pColumn instanceof PHPExcel_Worksheet_AutoFilter_Column)) { + $pColumn->setParent($this); + $this->_columns[$column] = $pColumn; + } + ksort($this->_columns); + + return $this; + } + + /** + * Clear a specified AutoFilter Column + * + * @param string $pColumn Column name (e.g. A) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function clearColumn($pColumn) { + $this->testColumnInRange($pColumn); + + if (isset($this->_columns[$pColumn])) { + unset($this->_columns[$pColumn]); + } + + return $this; + } + + /** + * Shift an AutoFilter Column Rule to a different column + * + * Note: This method bypasses validation of the destination column to ensure it is within this AutoFilter range. + * Nor does it verify whether any column rule already exists at $toColumn, but will simply overrideany existing value. + * Use with caution. + * + * @param string $fromColumn Column name (e.g. A) + * @param string $toColumn Column name (e.g. B) + * @return PHPExcel_Worksheet_AutoFilter + */ + public function shiftColumn($fromColumn=NULL,$toColumn=NULL) { + $fromColumn = strtoupper($fromColumn); + $toColumn = strtoupper($toColumn); + + if (($fromColumn !== NULL) && (isset($this->_columns[$fromColumn])) && ($toColumn !== NULL)) { + $this->_columns[$fromColumn]->setParent(); + $this->_columns[$fromColumn]->setColumnIndex($toColumn); + $this->_columns[$toColumn] = $this->_columns[$fromColumn]; + $this->_columns[$toColumn]->setParent($this); + unset($this->_columns[$fromColumn]); + + ksort($this->_columns); + } + + return $this; + } + + + /** + * Test if cell value is in the defined set of values + * + * @param mixed $cellValue + * @param mixed[] $dataSet + * @return boolean + */ + private static function _filterTestInSimpleDataSet($cellValue,$dataSet) + { + $dataSetValues = $dataSet['filterValues']; + $blanks = $dataSet['blanks']; + if (($cellValue == '') || ($cellValue === NULL)) { + return $blanks; + } + return in_array($cellValue,$dataSetValues); + } + + /** + * Test if cell value is in the defined set of Excel date values + * + * @param mixed $cellValue + * @param mixed[] $dataSet + * @return boolean + */ + private static function _filterTestInDateGroupSet($cellValue,$dataSet) + { + $dateSet = $dataSet['filterValues']; + $blanks = $dataSet['blanks']; + if (($cellValue == '') || ($cellValue === NULL)) { + return $blanks; + } + + if (is_numeric($cellValue)) { + $dateValue = PHPExcel_Shared_Date::ExcelToPHP($cellValue); + if ($cellValue < 1) { + // Just the time part + $dtVal = date('His',$dateValue); + $dateSet = $dateSet['time']; + } elseif($cellValue == floor($cellValue)) { + // Just the date part + $dtVal = date('Ymd',$dateValue); + $dateSet = $dateSet['date']; + } else { + // date and time parts + $dtVal = date('YmdHis',$dateValue); + $dateSet = $dateSet['dateTime']; + } + foreach($dateSet as $dateValue) { + // Use of substr to extract value at the appropriate group level + if (substr($dtVal,0,strlen($dateValue)) == $dateValue) + return TRUE; + } + } + + return FALSE; + } + + /** + * Test if cell value is within a set of values defined by a ruleset + * + * @param mixed $cellValue + * @param mixed[] $dataSet + * @return boolean + */ + private static function _filterTestInCustomDataSet($cellValue,$ruleSet) + { + $dataSet = $ruleSet['filterRules']; + $join = $ruleSet['join']; + $customRuleForBlanks = isset($ruleSet['customRuleForBlanks']) ? $ruleSet['customRuleForBlanks'] : FALSE; + + if (!$customRuleForBlanks) { + // Blank cells are always ignored, so return a FALSE + if (($cellValue == '') || ($cellValue === NULL)) { + return FALSE; + } + } + $returnVal = ($join == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND); + foreach($dataSet as $rule) { + if (is_numeric($rule['value'])) { + // Numeric values are tested using the appropriate operator + switch ($rule['operator']) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL : + $retVal = ($cellValue == $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL : + $retVal = ($cellValue != $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN : + $retVal = ($cellValue > $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL : + $retVal = ($cellValue >= $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN : + $retVal = ($cellValue < $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL : + $retVal = ($cellValue <= $rule['value']); + break; + } + } elseif($rule['value'] == '') { + switch ($rule['operator']) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL : + $retVal = (($cellValue == '') || ($cellValue === NULL)); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL : + $retVal = (($cellValue != '') && ($cellValue !== NULL)); + break; + default : + $retVal = TRUE; + break; + } + } else { + // String values are always tested for equality, factoring in for wildcards (hence a regexp test) + $retVal = preg_match('/^'.$rule['value'].'$/i',$cellValue); + } + // If there are multiple conditions, then we need to test both using the appropriate join operator + switch ($join) { + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR : + $returnVal = $returnVal || $retVal; + // Break as soon as we have a TRUE match for OR joins, + // to avoid unnecessary additional code execution + if ($returnVal) + return $returnVal; + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND : + $returnVal = $returnVal && $retVal; + break; + } + } + + return $returnVal; + } + + /** + * Test if cell date value is matches a set of values defined by a set of months + * + * @param mixed $cellValue + * @param mixed[] $dataSet + * @return boolean + */ + private static function _filterTestInPeriodDateSet($cellValue,$monthSet) + { + // Blank cells are always ignored, so return a FALSE + if (($cellValue == '') || ($cellValue === NULL)) { + return FALSE; + } + + if (is_numeric($cellValue)) { + $dateValue = date('m',PHPExcel_Shared_Date::ExcelToPHP($cellValue)); + if (in_array($dateValue,$monthSet)) { + return TRUE; + } + } + + return FALSE; + } + + /** + * Search/Replace arrays to convert Excel wildcard syntax to a regexp syntax for preg_matching + * + * @var array + */ + private static $_fromReplace = array('\*', '\?', '~~', '~.*', '~.?'); + private static $_toReplace = array('.*', '.', '~', '\*', '\?'); + + + /** + * Convert a dynamic rule daterange to a custom filter range expression for ease of calculation + * + * @param string $dynamicRuleType + * @param PHPExcel_Worksheet_AutoFilter_Column $filterColumn + * @return mixed[] + */ + private function _dynamicFilterDateRange($dynamicRuleType, &$filterColumn) + { + $rDateType = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC); + $val = $maxVal = NULL; + + $ruleValues = array(); + $baseDate = PHPExcel_Calculation_DateTime::DATENOW(); + // Calculate start/end dates for the required date range based on current date + switch ($dynamicRuleType) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK : + $baseDate = strtotime('-7 days',$baseDate); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK : + $baseDate = strtotime('-7 days',$baseDate); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH : + $baseDate = strtotime('-1 month',gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH : + $baseDate = strtotime('+1 month',gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER : + $baseDate = strtotime('-3 month',gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER : + $baseDate = strtotime('+3 month',gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR : + $baseDate = strtotime('-1 year',gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR : + $baseDate = strtotime('+1 year',gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + } + + switch ($dynamicRuleType) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TODAY : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW : + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(strtotime('+1 day',$baseDate)); + $val = (int) PHPExcel_Shared_Date::PHPToExcel($baseDate); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE : + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(strtotime('+1 day',$baseDate)); + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0,0,0,1,1,date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR : + $maxVal = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0,0,0,31,12,date('Y',$baseDate))); + ++$maxVal; + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0,0,0,1,1,date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER : + $thisMonth = date('m',$baseDate); + $thisQuarter = floor(--$thisMonth / 3); + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(gmmktime(0,0,0,date('t',$baseDate),(1+$thisQuarter)*3,date('Y',$baseDate))); + ++$maxVal; + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0,0,0,1,1+$thisQuarter*3,date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH : + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(gmmktime(0,0,0,date('t',$baseDate),date('m',$baseDate),date('Y',$baseDate))); + ++$maxVal; + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0,0,0,1,date('m',$baseDate),date('Y',$baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK : + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK : + $dayOfWeek = date('w',$baseDate); + $val = (int) PHPExcel_Shared_Date::PHPToExcel($baseDate) - $dayOfWeek; + $maxVal = $val + 7; + break; + } + + switch ($dynamicRuleType) { + // Adjust Today dates for Yesterday and Tomorrow + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY : + --$maxVal; + --$val; + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW : + ++$maxVal; + ++$val; + break; + } + + // Set the filter column rule attributes ready for writing + $filterColumn->setAttributes(array( 'val' => $val, + 'maxVal' => $maxVal + ) + ); + + // Set the rules for identifying rows for hide/show + $ruleValues[] = array( 'operator' => PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, + 'value' => $val + ); + $ruleValues[] = array( 'operator' => PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN, + 'value' => $maxVal + ); + PHPExcel_Calculation_Functions::setReturnDateType($rDateType); + + return array( + 'method' => '_filterTestInCustomDataSet', + 'arguments' => array( 'filterRules' => $ruleValues, + 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND + ) + ); + } + + private function _calculateTopTenValue($columnID,$startRow,$endRow,$ruleType,$ruleValue) { + $range = $columnID.$startRow.':'.$columnID.$endRow; + $dataValues = PHPExcel_Calculation_Functions::flattenArray( + $this->_workSheet->rangeToArray($range,NULL,TRUE,FALSE) + ); + + $dataValues = array_filter($dataValues); + if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) { + rsort($dataValues); + } else { + sort($dataValues); + } + + return array_pop(array_slice($dataValues,0,$ruleValue)); + } + + /** + * Apply the AutoFilter rules to the AutoFilter Range + * + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function showHideRows() + { + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range); + + // The heading row should always be visible +// echo 'AutoFilter Heading Row ',$rangeStart[1],' is always SHOWN',PHP_EOL; + $this->_workSheet->getRowDimension($rangeStart[1])->setVisible(TRUE); + + $columnFilterTests = array(); + foreach($this->_columns as $columnID => $filterColumn) { + $rules = $filterColumn->getRules(); + switch ($filterColumn->getFilterType()) { + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER : + $ruleValues = array(); + // Build a list of the filter value selections + foreach($rules as $rule) { + $ruleType = $rule->getRuleType(); + $ruleValues[] = $rule->getValue(); + } + // Test if we want to include blanks in our filter criteria + $blanks = FALSE; + $ruleDataSet = array_filter($ruleValues); + if (count($ruleValues) != count($ruleDataSet)) + $blanks = TRUE; + if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER) { + // Filter on absolute values + $columnFilterTests[$columnID] = array( + 'method' => '_filterTestInSimpleDataSet', + 'arguments' => array( 'filterValues' => $ruleDataSet, + 'blanks' => $blanks + ) + ); + } else { + // Filter on date group values + $arguments = array(); + foreach($ruleDataSet as $ruleValue) { + $date = $time = ''; + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR] !== '')) + $date .= sprintf('%04d',$ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]); + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH] != '')) + $date .= sprintf('%02d',$ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]); + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY] !== '')) + $date .= sprintf('%02d',$ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]); + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR] !== '')) + $time .= sprintf('%02d',$ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]); + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE] !== '')) + $time .= sprintf('%02d',$ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]); + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND] !== '')) + $time .= sprintf('%02d',$ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]); + $dateTime = $date . $time; + $arguments['date'][] = $date; + $arguments['time'][] = $time; + $arguments['dateTime'][] = $dateTime; + } + // Remove empty elements + $arguments['date'] = array_filter($arguments['date']); + $arguments['time'] = array_filter($arguments['time']); + $arguments['dateTime'] = array_filter($arguments['dateTime']); + $columnFilterTests[$columnID] = array( + 'method' => '_filterTestInDateGroupSet', + 'arguments' => array( 'filterValues' => $arguments, + 'blanks' => $blanks + ) + ); + } + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER : + $customRuleForBlanks = FALSE; + $ruleValues = array(); + // Build a list of the filter value selections + foreach($rules as $rule) { + $ruleType = $rule->getRuleType(); + $ruleValue = $rule->getValue(); + if (!is_numeric($ruleValue)) { + // Convert to a regexp allowing for regexp reserved characters, wildcards and escaped wildcards + $ruleValue = preg_quote($ruleValue); + $ruleValue = str_replace(self::$_fromReplace,self::$_toReplace,$ruleValue); + if (trim($ruleValue) == '') { + $customRuleForBlanks = TRUE; + $ruleValue = trim($ruleValue); + } + } + $ruleValues[] = array( 'operator' => $rule->getOperator(), + 'value' => $ruleValue + ); + } + $join = $filterColumn->getJoin(); + $columnFilterTests[$columnID] = array( + 'method' => '_filterTestInCustomDataSet', + 'arguments' => array( 'filterRules' => $ruleValues, + 'join' => $join, + 'customRuleForBlanks' => $customRuleForBlanks + ) + ); + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER : + $ruleValues = array(); + foreach($rules as $rule) { + // We should only ever have one Dynamic Filter Rule anyway + $dynamicRuleType = $rule->getGrouping(); + if (($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) || + ($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE)) { + // Number (Average) based + // Calculate the average + $averageFormula = '=AVERAGE('.$columnID.($rangeStart[1]+1).':'.$columnID.$rangeEnd[1].')'; + $average = PHPExcel_Calculation::getInstance()->calculateFormula($averageFormula,NULL,$this->_workSheet->getCell('A1')); + // Set above/below rule based on greaterThan or LessTan + $operator = ($dynamicRuleType === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN; + $ruleValues[] = array( 'operator' => $operator, + 'value' => $average + ); + $columnFilterTests[$columnID] = array( + 'method' => '_filterTestInCustomDataSet', + 'arguments' => array( 'filterRules' => $ruleValues, + 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR + ) + ); + } else { + // Date based + if ($dynamicRuleType{0} == 'M' || $dynamicRuleType{0} == 'Q') { + // Month or Quarter + list($periodType,$period) = sscanf($dynamicRuleType,'%[A-Z]%d'); + if ($periodType == 'M') { + $ruleValues = array($period); + } else { + --$period; + $periodEnd = (1+$period)*3; + $periodStart = 1+$period*3; + $ruleValues = range($periodStart,periodEnd); + } + $columnFilterTests[$columnID] = array( + 'method' => '_filterTestInPeriodDateSet', + 'arguments' => $ruleValues + ); + $filterColumn->setAttributes(array()); + } else { + // Date Range + $columnFilterTests[$columnID] = $this->_dynamicFilterDateRange($dynamicRuleType, $filterColumn); + break; + } + } + } + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER : + $ruleValues = array(); + $dataRowCount = $rangeEnd[1] - $rangeStart[1]; + foreach($rules as $rule) { + // We should only ever have one Dynamic Filter Rule anyway + $toptenRuleType = $rule->getGrouping(); + $ruleValue = $rule->getValue(); + $ruleOperator = $rule->getOperator(); + } + if ($ruleOperator === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) { + $ruleValue = floor($ruleValue * ($dataRowCount / 100)); + } + if ($ruleValue < 1) $ruleValue = 1; + if ($ruleValue > 500) $ruleValue = 500; + + $maxVal = $this->_calculateTopTenValue($columnID,$rangeStart[1]+1,$rangeEnd[1],$toptenRuleType,$ruleValue); + + $operator = ($toptenRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL; + $ruleValues[] = array( 'operator' => $operator, + 'value' => $maxVal + ); + $columnFilterTests[$columnID] = array( + 'method' => '_filterTestInCustomDataSet', + 'arguments' => array( 'filterRules' => $ruleValues, + 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR + ) + ); + $filterColumn->setAttributes( + array('maxVal' => $maxVal) + ); + break; + } + } + +// echo 'Column Filter Test CRITERIA',PHP_EOL; +// var_dump($columnFilterTests); +// + // Execute the column tests for each row in the autoFilter range to determine show/hide, + for ($row = $rangeStart[1]+1; $row <= $rangeEnd[1]; ++$row) { +// echo 'Testing Row = ',$row,PHP_EOL; + $result = TRUE; + foreach($columnFilterTests as $columnID => $columnFilterTest) { +// echo 'Testing cell ',$columnID.$row,PHP_EOL; + $cellValue = $this->_workSheet->getCell($columnID.$row)->getCalculatedValue(); +// echo 'Value is ',$cellValue,PHP_EOL; + // Execute the filter test + $result = $result && + call_user_func_array( + array('PHPExcel_Worksheet_AutoFilter',$columnFilterTest['method']), + array( + $cellValue, + $columnFilterTest['arguments'] + ) + ); +// echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL; + // If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests + if (!$result) + break; + } + // Set show/hide for the row based on the result of the autoFilter result +// echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL; + $this->_workSheet->getRowDimension($row)->setVisible($result); + } + + return $this; + } + + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + if ($key == '_workSheet') { + // Detach from worksheet + $this->$key = NULL; + } else { + $this->$key = clone $value; + } + } elseif ((is_array($value)) && ($key == '_columns')) { + // The columns array of PHPExcel_Worksheet_AutoFilter objects + $this->$key = array(); + foreach ($value as $k => $v) { + $this->$key[$k] = clone $v; + // attach the new cloned Column to this new cloned Autofilter object + $this->$key[$k]->setParent($this); + } + } else { + $this->$key = $value; + } + } + } + + /** + * toString method replicates previous behavior by returning the range if object is + * referenced as a property of its parent. + */ + public function __toString() { + return (string) $this->_range; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter/Column.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter/Column.php new file mode 100644 index 000000000..bb70ec672 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter/Column.php @@ -0,0 +1,381 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_AutoFilter_Column + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_AutoFilter_Column +{ + const AUTOFILTER_FILTERTYPE_FILTER = 'filters'; + const AUTOFILTER_FILTERTYPE_CUSTOMFILTER = 'customFilters'; + // Supports no more than 2 rules, with an And/Or join criteria + // if more than 1 rule is defined + const AUTOFILTER_FILTERTYPE_DYNAMICFILTER = 'dynamicFilter'; + // Even though the filter rule is constant, the filtered data can vary + // e.g. filtered by date = TODAY + const AUTOFILTER_FILTERTYPE_TOPTENFILTER = 'top10'; + + private static $_filterTypes = array( + // Currently we're not handling + // colorFilter + // extLst + // iconFilter + self::AUTOFILTER_FILTERTYPE_FILTER, + self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER, + self::AUTOFILTER_FILTERTYPE_DYNAMICFILTER, + self::AUTOFILTER_FILTERTYPE_TOPTENFILTER, + ); + + /* Multiple Rule Connections */ + const AUTOFILTER_COLUMN_JOIN_AND = 'and'; + const AUTOFILTER_COLUMN_JOIN_OR = 'or'; + + private static $_ruleJoins = array( + self::AUTOFILTER_COLUMN_JOIN_AND, + self::AUTOFILTER_COLUMN_JOIN_OR, + ); + + /** + * Autofilter + * + * @var PHPExcel_Worksheet_AutoFilter + */ + private $_parent = NULL; + + + /** + * Autofilter Column Index + * + * @var string + */ + private $_columnIndex = ''; + + + /** + * Autofilter Column Filter Type + * + * @var string + */ + private $_filterType = self::AUTOFILTER_FILTERTYPE_FILTER; + + + /** + * Autofilter Multiple Rules And/Or + * + * @var string + */ + private $_join = self::AUTOFILTER_COLUMN_JOIN_OR; + + + /** + * Autofilter Column Rules + * + * @var array of PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + private $_ruleset = array(); + + + /** + * Autofilter Column Dynamic Attributes + * + * @var array of mixed + */ + private $_attributes = array(); + + + /** + * Create a new PHPExcel_Worksheet_AutoFilter_Column + */ + public function __construct($pColumn, PHPExcel_Worksheet_AutoFilter $pParent = NULL) + { + $this->_columnIndex = $pColumn; + $this->_parent = $pParent; + } + + /** + * Get AutoFilter Column Index + * + * @return string + */ + public function getColumnIndex() { + return $this->_columnIndex; + } + + /** + * Set AutoFilter Column Index + * + * @param string $pColumn Column (e.g. A) + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setColumnIndex($pColumn) { + // Uppercase coordinate + $pColumn = strtoupper($pColumn); + if ($this->_parent !== NULL) { + $this->_parent->testColumnInRange($pColumn); + } + + $this->_columnIndex = $pColumn; + + return $this; + } + + /** + * Get this Column's AutoFilter Parent + * + * @return PHPExcel_Worksheet_AutoFilter + */ + public function getParent() { + return $this->_parent; + } + + /** + * Set this Column's AutoFilter Parent + * + * @param PHPExcel_Worksheet_AutoFilter + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setParent(PHPExcel_Worksheet_AutoFilter $pParent = NULL) { + $this->_parent = $pParent; + + return $this; + } + + /** + * Get AutoFilter Type + * + * @return string + */ + public function getFilterType() { + return $this->_filterType; + } + + /** + * Set AutoFilter Type + * + * @param string $pFilterType + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setFilterType($pFilterType = self::AUTOFILTER_FILTERTYPE_FILTER) { + if (!in_array($pFilterType,self::$_filterTypes)) { + throw new PHPExcel_Exception('Invalid filter type for column AutoFilter.'); + } + + $this->_filterType = $pFilterType; + + return $this; + } + + /** + * Get AutoFilter Multiple Rules And/Or Join + * + * @return string + */ + public function getJoin() { + return $this->_join; + } + + /** + * Set AutoFilter Multiple Rules And/Or + * + * @param string $pJoin And/Or + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setJoin($pJoin = self::AUTOFILTER_COLUMN_JOIN_OR) { + // Lowercase And/Or + $pJoin = strtolower($pJoin); + if (!in_array($pJoin,self::$_ruleJoins)) { + throw new PHPExcel_Exception('Invalid rule connection for column AutoFilter.'); + } + + $this->_join = $pJoin; + + return $this; + } + + /** + * Set AutoFilter Attributes + * + * @param string[] $pAttributes + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setAttributes($pAttributes = array()) { + $this->_attributes = $pAttributes; + + return $this; + } + + /** + * Set An AutoFilter Attribute + * + * @param string $pName Attribute Name + * @param string $pValue Attribute Value + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setAttribute($pName, $pValue) { + $this->_attributes[$pName] = $pValue; + + return $this; + } + + /** + * Get AutoFilter Column Attributes + * + * @return string + */ + public function getAttributes() { + return $this->_attributes; + } + + /** + * Get specific AutoFilter Column Attribute + * + * @param string $pName Attribute Name + * @return string + */ + public function getAttribute($pName) { + if (isset($this->_attributes[$pName])) + return $this->_attributes[$pName]; + return NULL; + } + + /** + * Get all AutoFilter Column Rules + * + * @throws PHPExcel_Exception + * @return array of PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function getRules() { + return $this->_ruleset; + } + + /** + * Get a specified AutoFilter Column Rule + * + * @param integer $pIndex Rule index in the ruleset array + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function getRule($pIndex) { + if (!isset($this->_ruleset[$pIndex])) { + $this->_ruleset[$pIndex] = new PHPExcel_Worksheet_AutoFilter_Column_Rule($this); + } + return $this->_ruleset[$pIndex]; + } + + /** + * Create a new AutoFilter Column Rule in the ruleset + * + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function createRule() { + $this->_ruleset[] = new PHPExcel_Worksheet_AutoFilter_Column_Rule($this); + + return end($this->_ruleset); + } + + /** + * Add a new AutoFilter Column Rule to the ruleset + * + * @param PHPExcel_Worksheet_AutoFilter_Column_Rule $pRule + * @param boolean $returnRule Flag indicating whether the rule object or the column object should be returned + * @return PHPExcel_Worksheet_AutoFilter_Column|PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function addRule(PHPExcel_Worksheet_AutoFilter_Column_Rule $pRule, $returnRule=TRUE) { + $pRule->setParent($this); + $this->_ruleset[] = $pRule; + + return ($returnRule) ? $pRule : $this; + } + + /** + * Delete a specified AutoFilter Column Rule + * If the number of rules is reduced to 1, then we reset And/Or logic to Or + * + * @param integer $pIndex Rule index in the ruleset array + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function deleteRule($pIndex) { + if (isset($this->_ruleset[$pIndex])) { + unset($this->_ruleset[$pIndex]); + // If we've just deleted down to a single rule, then reset And/Or joining to Or + if (count($this->_ruleset) <= 1) { + $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); + } + } + + return $this; + } + + /** + * Delete all AutoFilter Column Rules + * + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function clearRules() { + $this->_ruleset = array(); + $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); + + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + if ($key == '_parent') { + // Detach from autofilter parent + $this->$key = NULL; + } else { + $this->$key = clone $value; + } + } elseif ((is_array($value)) && ($key == '_ruleset')) { + // The columns array of PHPExcel_Worksheet_AutoFilter objects + $this->$key = array(); + foreach ($value as $k => $v) { + $this->$key[$k] = clone $v; + // attach the new cloned Rule to this new cloned Autofilter Cloned object + $this->$key[$k]->setParent($this); + } + } else { + $this->$key = $value; + } + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php new file mode 100644 index 000000000..209012ce1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php @@ -0,0 +1,462 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_AutoFilter_Column_Rule + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_AutoFilter_Column_Rule +{ + const AUTOFILTER_RULETYPE_FILTER = 'filter'; + const AUTOFILTER_RULETYPE_DATEGROUP = 'dateGroupItem'; + const AUTOFILTER_RULETYPE_CUSTOMFILTER = 'customFilter'; + const AUTOFILTER_RULETYPE_DYNAMICFILTER = 'dynamicFilter'; + const AUTOFILTER_RULETYPE_TOPTENFILTER = 'top10Filter'; + + private static $_ruleTypes = array( + // Currently we're not handling + // colorFilter + // extLst + // iconFilter + self::AUTOFILTER_RULETYPE_FILTER, + self::AUTOFILTER_RULETYPE_DATEGROUP, + self::AUTOFILTER_RULETYPE_CUSTOMFILTER, + self::AUTOFILTER_RULETYPE_DYNAMICFILTER, + self::AUTOFILTER_RULETYPE_TOPTENFILTER, + ); + + const AUTOFILTER_RULETYPE_DATEGROUP_YEAR = 'year'; + const AUTOFILTER_RULETYPE_DATEGROUP_MONTH = 'month'; + const AUTOFILTER_RULETYPE_DATEGROUP_DAY = 'day'; + const AUTOFILTER_RULETYPE_DATEGROUP_HOUR = 'hour'; + const AUTOFILTER_RULETYPE_DATEGROUP_MINUTE = 'minute'; + const AUTOFILTER_RULETYPE_DATEGROUP_SECOND = 'second'; + + private static $_dateTimeGroups = array( + self::AUTOFILTER_RULETYPE_DATEGROUP_YEAR, + self::AUTOFILTER_RULETYPE_DATEGROUP_MONTH, + self::AUTOFILTER_RULETYPE_DATEGROUP_DAY, + self::AUTOFILTER_RULETYPE_DATEGROUP_HOUR, + self::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE, + self::AUTOFILTER_RULETYPE_DATEGROUP_SECOND, + ); + + const AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY = 'yesterday'; + const AUTOFILTER_RULETYPE_DYNAMIC_TODAY = 'today'; + const AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW = 'tomorrow'; + const AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE = 'yearToDate'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR = 'thisYear'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER = 'thisQuarter'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH = 'thisMonth'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK = 'thisWeek'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR = 'lastYear'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER = 'lastQuarter'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH = 'lastMonth'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK = 'lastWeek'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR = 'nextYear'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER = 'nextQuarter'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH = 'nextMonth'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK = 'nextWeek'; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1 = 'M1'; + const AUTOFILTER_RULETYPE_DYNAMIC_JANUARY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2 = 'M2'; + const AUTOFILTER_RULETYPE_DYNAMIC_FEBRUARY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3 = 'M3'; + const AUTOFILTER_RULETYPE_DYNAMIC_MARCH = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4 = 'M4'; + const AUTOFILTER_RULETYPE_DYNAMIC_APRIL = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5 = 'M5'; + const AUTOFILTER_RULETYPE_DYNAMIC_MAY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6 = 'M6'; + const AUTOFILTER_RULETYPE_DYNAMIC_JUNE = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7 = 'M7'; + const AUTOFILTER_RULETYPE_DYNAMIC_JULY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8 = 'M8'; + const AUTOFILTER_RULETYPE_DYNAMIC_AUGUST = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9 = 'M9'; + const AUTOFILTER_RULETYPE_DYNAMIC_SEPTEMBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10 = 'M10'; + const AUTOFILTER_RULETYPE_DYNAMIC_OCTOBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11 = 'M11'; + const AUTOFILTER_RULETYPE_DYNAMIC_NOVEMBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12 = 'M12'; + const AUTOFILTER_RULETYPE_DYNAMIC_DECEMBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1 = 'Q1'; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2 = 'Q2'; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3 = 'Q3'; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4 = 'Q4'; + const AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE = 'aboveAverage'; + const AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE = 'belowAverage'; + + private static $_dynamicTypes = array( + self::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY, + self::AUTOFILTER_RULETYPE_DYNAMIC_TODAY, + self::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW, + self::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4, + self::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE, + self::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE, + ); + + /* + * The only valid filter rule operators for filter and customFilter types are: + * <xsd:enumeration value="equal"/> + * <xsd:enumeration value="lessThan"/> + * <xsd:enumeration value="lessThanOrEqual"/> + * <xsd:enumeration value="notEqual"/> + * <xsd:enumeration value="greaterThanOrEqual"/> + * <xsd:enumeration value="greaterThan"/> + */ + const AUTOFILTER_COLUMN_RULE_EQUAL = 'equal'; + const AUTOFILTER_COLUMN_RULE_NOTEQUAL = 'notEqual'; + const AUTOFILTER_COLUMN_RULE_GREATERTHAN = 'greaterThan'; + const AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL = 'greaterThanOrEqual'; + const AUTOFILTER_COLUMN_RULE_LESSTHAN = 'lessThan'; + const AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL = 'lessThanOrEqual'; + + private static $_operators = array( + self::AUTOFILTER_COLUMN_RULE_EQUAL, + self::AUTOFILTER_COLUMN_RULE_NOTEQUAL, + self::AUTOFILTER_COLUMN_RULE_GREATERTHAN, + self::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, + self::AUTOFILTER_COLUMN_RULE_LESSTHAN, + self::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL, + ); + + const AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE = 'byValue'; + const AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT = 'byPercent'; + + private static $_topTenValue = array( + self::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE, + self::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT, + ); + + const AUTOFILTER_COLUMN_RULE_TOPTEN_TOP = 'top'; + const AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM = 'bottom'; + + private static $_topTenType = array( + self::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP, + self::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM, + ); + + + /* Rule Operators (Numeric, Boolean etc) */ +// const AUTOFILTER_COLUMN_RULE_BETWEEN = 'between'; // greaterThanOrEqual 1 && lessThanOrEqual 2 + /* Rule Operators (Numeric Special) which are translated to standard numeric operators with calculated values */ +// const AUTOFILTER_COLUMN_RULE_TOPTEN = 'topTen'; // greaterThan calculated value +// const AUTOFILTER_COLUMN_RULE_TOPTENPERCENT = 'topTenPercent'; // greaterThan calculated value +// const AUTOFILTER_COLUMN_RULE_ABOVEAVERAGE = 'aboveAverage'; // Value is calculated as the average +// const AUTOFILTER_COLUMN_RULE_BELOWAVERAGE = 'belowAverage'; // Value is calculated as the average + /* Rule Operators (String) which are set as wild-carded values */ +// const AUTOFILTER_COLUMN_RULE_BEGINSWITH = 'beginsWith'; // A* +// const AUTOFILTER_COLUMN_RULE_ENDSWITH = 'endsWith'; // *Z +// const AUTOFILTER_COLUMN_RULE_CONTAINS = 'contains'; // *B* +// const AUTOFILTER_COLUMN_RULE_DOESNTCONTAIN = 'notEqual'; // notEqual *B* + /* Rule Operators (Date Special) which are translated to standard numeric operators with calculated values */ +// const AUTOFILTER_COLUMN_RULE_BEFORE = 'lessThan'; +// const AUTOFILTER_COLUMN_RULE_AFTER = 'greaterThan'; +// const AUTOFILTER_COLUMN_RULE_YESTERDAY = 'yesterday'; +// const AUTOFILTER_COLUMN_RULE_TODAY = 'today'; +// const AUTOFILTER_COLUMN_RULE_TOMORROW = 'tomorrow'; +// const AUTOFILTER_COLUMN_RULE_LASTWEEK = 'lastWeek'; +// const AUTOFILTER_COLUMN_RULE_THISWEEK = 'thisWeek'; +// const AUTOFILTER_COLUMN_RULE_NEXTWEEK = 'nextWeek'; +// const AUTOFILTER_COLUMN_RULE_LASTMONTH = 'lastMonth'; +// const AUTOFILTER_COLUMN_RULE_THISMONTH = 'thisMonth'; +// const AUTOFILTER_COLUMN_RULE_NEXTMONTH = 'nextMonth'; +// const AUTOFILTER_COLUMN_RULE_LASTQUARTER = 'lastQuarter'; +// const AUTOFILTER_COLUMN_RULE_THISQUARTER = 'thisQuarter'; +// const AUTOFILTER_COLUMN_RULE_NEXTQUARTER = 'nextQuarter'; +// const AUTOFILTER_COLUMN_RULE_LASTYEAR = 'lastYear'; +// const AUTOFILTER_COLUMN_RULE_THISYEAR = 'thisYear'; +// const AUTOFILTER_COLUMN_RULE_NEXTYEAR = 'nextYear'; +// const AUTOFILTER_COLUMN_RULE_YEARTODATE = 'yearToDate'; // <dynamicFilter val="40909" type="yearToDate" maxVal="41113"/> +// const AUTOFILTER_COLUMN_RULE_ALLDATESINMONTH = 'allDatesInMonth'; // <dynamicFilter type="M2"/> for Month/February +// const AUTOFILTER_COLUMN_RULE_ALLDATESINQUARTER = 'allDatesInQuarter'; // <dynamicFilter type="Q2"/> for Quarter 2 + + /** + * Autofilter Column + * + * @var PHPExcel_Worksheet_AutoFilter_Column + */ + private $_parent = NULL; + + + /** + * Autofilter Rule Type + * + * @var string + */ + private $_ruleType = self::AUTOFILTER_RULETYPE_FILTER; + + + /** + * Autofilter Rule Value + * + * @var string + */ + private $_value = ''; + + /** + * Autofilter Rule Operator + * + * @var string + */ + private $_operator = ''; + + /** + * DateTimeGrouping Group Value + * + * @var string + */ + private $_grouping = ''; + + + /** + * Create a new PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function __construct(PHPExcel_Worksheet_AutoFilter_Column $pParent = NULL) + { + $this->_parent = $pParent; + } + + /** + * Get AutoFilter Rule Type + * + * @return string + */ + public function getRuleType() { + return $this->_ruleType; + } + + /** + * Set AutoFilter Rule Type + * + * @param string $pRuleType + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setRuleType($pRuleType = self::AUTOFILTER_RULETYPE_FILTER) { + if (!in_array($pRuleType,self::$_ruleTypes)) { + throw new PHPExcel_Exception('Invalid rule type for column AutoFilter Rule.'); + } + + $this->_ruleType = $pRuleType; + + return $this; + } + + /** + * Get AutoFilter Rule Value + * + * @return string + */ + public function getValue() { + return $this->_value; + } + + /** + * Set AutoFilter Rule Value + * + * @param string|string[] $pValue + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setValue($pValue = '') { + if (is_array($pValue)) { + $grouping = -1; + foreach($pValue as $key => $value) { + // Validate array entries + if (!in_array($key,self::$_dateTimeGroups)) { + // Remove any invalid entries from the value array + unset($pValue[$key]); + } else { + // Work out what the dateTime grouping will be + $grouping = max($grouping,array_search($key,self::$_dateTimeGroups)); + } + } + if (count($pValue) == 0) { + throw new PHPExcel_Exception('Invalid rule value for column AutoFilter Rule.'); + } + // Set the dateTime grouping that we've anticipated + $this->setGrouping(self::$_dateTimeGroups[$grouping]); + } + $this->_value = $pValue; + + return $this; + } + + /** + * Get AutoFilter Rule Operator + * + * @return string + */ + public function getOperator() { + return $this->_operator; + } + + /** + * Set AutoFilter Rule Operator + * + * @param string $pOperator + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setOperator($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL) { + if (empty($pOperator)) + $pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL; + if ((!in_array($pOperator,self::$_operators)) && + (!in_array($pOperator,self::$_topTenValue))) { + throw new PHPExcel_Exception('Invalid operator for column AutoFilter Rule.'); + } + $this->_operator = $pOperator; + + return $this; + } + + /** + * Get AutoFilter Rule Grouping + * + * @return string + */ + public function getGrouping() { + return $this->_grouping; + } + + /** + * Set AutoFilter Rule Grouping + * + * @param string $pGrouping + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setGrouping($pGrouping = NULL) { + if (($pGrouping !== NULL) && + (!in_array($pGrouping,self::$_dateTimeGroups)) && + (!in_array($pGrouping,self::$_dynamicTypes)) && + (!in_array($pGrouping,self::$_topTenType))) { + throw new PHPExcel_Exception('Invalid rule type for column AutoFilter Rule.'); + } + + $this->_grouping = $pGrouping; + + return $this; + } + + /** + * Set AutoFilter Rule + * + * @param string $pOperator + * @param string|string[] $pValue + * @param string $pGrouping + * @throws Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setRule($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL, $pValue = '', $pGrouping = NULL) { + $this->setOperator($pOperator); + $this->setValue($pValue); + // Only set grouping if it's been passed in as a user-supplied argument, + // otherwise we're calculating it when we setValue() and don't want to overwrite that + // If the user supplies an argumnet for grouping, then on their own head be it + if ($pGrouping !== NULL) + $this->setGrouping($pGrouping); + + return $this; + } + + /** + * Get this Rule's AutoFilter Column Parent + * + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function getParent() { + return $this->_parent; + } + + /** + * Set this Rule's AutoFilter Column Parent + * + * @param PHPExcel_Worksheet_AutoFilter_Column + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setParent(PHPExcel_Worksheet_AutoFilter_Column $pParent = NULL) { + $this->_parent = $pParent; + + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + if ($key == '_parent') { + // Detach from autofilter column parent + $this->$key = NULL; + } else { + $this->$key = clone $value; + } + } else { + $this->$key = $value; + } + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/BaseDrawing.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/BaseDrawing.php new file mode 100644 index 000000000..1e6725a38 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/BaseDrawing.php @@ -0,0 +1,485 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_BaseDrawing + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable +{ + /** + * Image counter + * + * @var int + */ + private static $_imageCounter = 0; + + /** + * Image index + * + * @var int + */ + private $_imageIndex = 0; + + /** + * Name + * + * @var string + */ + protected $_name; + + /** + * Description + * + * @var string + */ + protected $_description; + + /** + * Worksheet + * + * @var PHPExcel_Worksheet + */ + protected $_worksheet; + + /** + * Coordinates + * + * @var string + */ + protected $_coordinates; + + /** + * Offset X + * + * @var int + */ + protected $_offsetX; + + /** + * Offset Y + * + * @var int + */ + protected $_offsetY; + + /** + * Width + * + * @var int + */ + protected $_width; + + /** + * Height + * + * @var int + */ + protected $_height; + + /** + * Proportional resize + * + * @var boolean + */ + protected $_resizeProportional; + + /** + * Rotation + * + * @var int + */ + protected $_rotation; + + /** + * Shadow + * + * @var PHPExcel_Worksheet_Drawing_Shadow + */ + protected $_shadow; + + /** + * Create a new PHPExcel_Worksheet_BaseDrawing + */ + public function __construct() + { + // Initialise values + $this->_name = ''; + $this->_description = ''; + $this->_worksheet = null; + $this->_coordinates = 'A1'; + $this->_offsetX = 0; + $this->_offsetY = 0; + $this->_width = 0; + $this->_height = 0; + $this->_resizeProportional = true; + $this->_rotation = 0; + $this->_shadow = new PHPExcel_Worksheet_Drawing_Shadow(); + + // Set image index + self::$_imageCounter++; + $this->_imageIndex = self::$_imageCounter; + } + + /** + * Get image index + * + * @return int + */ + public function getImageIndex() { + return $this->_imageIndex; + } + + /** + * Get Name + * + * @return string + */ + public function getName() { + return $this->_name; + } + + /** + * Set Name + * + * @param string $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setName($pValue = '') { + $this->_name = $pValue; + return $this; + } + + /** + * Get Description + * + * @return string + */ + public function getDescription() { + return $this->_description; + } + + /** + * Set Description + * + * @param string $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setDescription($pValue = '') { + $this->_description = $pValue; + return $this; + } + + /** + * Get Worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() { + return $this->_worksheet; + } + + /** + * Set Worksheet + * + * @param PHPExcel_Worksheet $pValue + * @param bool $pOverrideOld If a Worksheet has already been assigned, overwrite it and remove image from old Worksheet? + * @throws Exception + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setWorksheet(PHPExcel_Worksheet $pValue = null, $pOverrideOld = false) { + if (is_null($this->_worksheet)) { + // Add drawing to PHPExcel_Worksheet + $this->_worksheet = $pValue; + $this->_worksheet->getCell($this->_coordinates); + $this->_worksheet->getDrawingCollection()->append($this); + } else { + if ($pOverrideOld) { + // Remove drawing from old PHPExcel_Worksheet + $iterator = $this->_worksheet->getDrawingCollection()->getIterator(); + + while ($iterator->valid()) { + if ($iterator->current()->getHashCode() == $this->getHashCode()) { + $this->_worksheet->getDrawingCollection()->offsetUnset( $iterator->key() ); + $this->_worksheet = null; + break; + } + } + + // Set new PHPExcel_Worksheet + $this->setWorksheet($pValue); + } else { + throw new Exception("A PHPExcel_Worksheet has already been assigned. Drawings can only exist on one PHPExcel_Worksheet."); + } + } + return $this; + } + + /** + * Get Coordinates + * + * @return string + */ + public function getCoordinates() { + return $this->_coordinates; + } + + /** + * Set Coordinates + * + * @param string $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setCoordinates($pValue = 'A1') { + $this->_coordinates = $pValue; + return $this; + } + + /** + * Get OffsetX + * + * @return int + */ + public function getOffsetX() { + return $this->_offsetX; + } + + /** + * Set OffsetX + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setOffsetX($pValue = 0) { + $this->_offsetX = $pValue; + return $this; + } + + /** + * Get OffsetY + * + * @return int + */ + public function getOffsetY() { + return $this->_offsetY; + } + + /** + * Set OffsetY + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setOffsetY($pValue = 0) { + $this->_offsetY = $pValue; + return $this; + } + + /** + * Get Width + * + * @return int + */ + public function getWidth() { + return $this->_width; + } + + /** + * Set Width + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setWidth($pValue = 0) { + // Resize proportional? + if ($this->_resizeProportional && $pValue != 0) { + $ratio = $this->_height / $this->_width; + $this->_height = round($ratio * $pValue); + } + + // Set width + $this->_width = $pValue; + + return $this; + } + + /** + * Get Height + * + * @return int + */ + public function getHeight() { + return $this->_height; + } + + /** + * Set Height + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setHeight($pValue = 0) { + // Resize proportional? + if ($this->_resizeProportional && $pValue != 0) { + $ratio = $this->_width / $this->_height; + $this->_width = round($ratio * $pValue); + } + + // Set height + $this->_height = $pValue; + + return $this; + } + + /** + * Set width and height with proportional resize + * Example: + * <code> + * $objDrawing->setResizeProportional(true); + * $objDrawing->setWidthAndHeight(160,120); + * </code> + * + * @author Vincent@luo MSN:kele_100@hotmail.com + * @param int $width + * @param int $height + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setWidthAndHeight($width = 0, $height = 0) { + $xratio = $width / $this->_width; + $yratio = $height / $this->_height; + if ($this->_resizeProportional && !($width == 0 || $height == 0)) { + if (($xratio * $this->_height) < $height) { + $this->_height = ceil($xratio * $this->_height); + $this->_width = $width; + } else { + $this->_width = ceil($yratio * $this->_width); + $this->_height = $height; + } + } + return $this; + } + + /** + * Get ResizeProportional + * + * @return boolean + */ + public function getResizeProportional() { + return $this->_resizeProportional; + } + + /** + * Set ResizeProportional + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setResizeProportional($pValue = true) { + $this->_resizeProportional = $pValue; + return $this; + } + + /** + * Get Rotation + * + * @return int + */ + public function getRotation() { + return $this->_rotation; + } + + /** + * Set Rotation + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setRotation($pValue = 0) { + $this->_rotation = $pValue; + return $this; + } + + /** + * Get Shadow + * + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function getShadow() { + return $this->_shadow; + } + + /** + * Set Shadow + * + * @param PHPExcel_Worksheet_Drawing_Shadow $pValue + * @throws Exception + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setShadow(PHPExcel_Worksheet_Drawing_Shadow $pValue = null) { + $this->_shadow = $pValue; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_name + . $this->_description + . $this->_worksheet->getHashCode() + . $this->_coordinates + . $this->_offsetX + . $this->_offsetY + . $this->_width + . $this->_height + . $this->_rotation + . $this->_shadow->getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/CellIterator.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/CellIterator.php new file mode 100644 index 000000000..a612d550c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/CellIterator.php @@ -0,0 +1,161 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_CellIterator + * + * Used to iterate rows in a PHPExcel_Worksheet + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_CellIterator implements Iterator +{ + /** + * PHPExcel_Worksheet to iterate + * + * @var PHPExcel_Worksheet + */ + private $_subject; + + /** + * Row index + * + * @var int + */ + private $_rowIndex; + + /** + * Current iterator position + * + * @var int + */ + private $_position = 0; + + /** + * Loop only existing cells + * + * @var boolean + */ + private $_onlyExistingCells = true; + + /** + * Create a new cell iterator + * + * @param PHPExcel_Worksheet $subject + * @param int $rowIndex + */ + public function __construct(PHPExcel_Worksheet $subject = null, $rowIndex = 1) { + // Set subject and row index + $this->_subject = $subject; + $this->_rowIndex = $rowIndex; + } + + /** + * Destructor + */ + public function __destruct() { + unset($this->_subject); + } + + /** + * Rewind iterator + */ + public function rewind() { + $this->_position = 0; + } + + /** + * Current PHPExcel_Cell + * + * @return PHPExcel_Cell + */ + public function current() { + return $this->_subject->getCellByColumnAndRow($this->_position, $this->_rowIndex); + } + + /** + * Current key + * + * @return int + */ + public function key() { + return $this->_position; + } + + /** + * Next value + */ + public function next() { + ++$this->_position; + } + + /** + * Are there any more PHPExcel_Cell instances available? + * + * @return boolean + */ + public function valid() { + // columnIndexFromString() returns an index based at one, + // treat it as a count when comparing it to the base zero + // position. + $columnCount = PHPExcel_Cell::columnIndexFromString($this->_subject->getHighestColumn()); + + if ($this->_onlyExistingCells) { + // If we aren't looking at an existing cell, either + // because the first column doesn't exist or next() has + // been called onto a nonexistent cell, then loop until we + // find one, or pass the last column. + while ($this->_position < $columnCount && + !$this->_subject->cellExistsByColumnAndRow($this->_position, $this->_rowIndex)) { + ++$this->_position; + } + } + + return $this->_position < $columnCount; + } + + /** + * Get loop only existing cells + * + * @return boolean + */ + public function getIterateOnlyExistingCells() { + return $this->_onlyExistingCells; + } + + /** + * Set the iterator to loop only existing cells + * + * @param boolean $value + */ + public function setIterateOnlyExistingCells($value = true) { + $this->_onlyExistingCells = $value; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/ColumnDimension.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/ColumnDimension.php new file mode 100644 index 000000000..0915a3599 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/ColumnDimension.php @@ -0,0 +1,266 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_ColumnDimension + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_ColumnDimension +{ + /** + * Column index + * + * @var int + */ + private $_columnIndex; + + /** + * Column width + * + * When this is set to a negative value, the column width should be ignored by IWriter + * + * @var double + */ + private $_width = -1; + + /** + * Auto size? + * + * @var bool + */ + private $_autoSize = false; + + /** + * Visible? + * + * @var bool + */ + private $_visible = true; + + /** + * Outline level + * + * @var int + */ + private $_outlineLevel = 0; + + /** + * Collapsed + * + * @var bool + */ + private $_collapsed = false; + + /** + * Index to cellXf + * + * @var int + */ + private $_xfIndex; + + /** + * Create a new PHPExcel_Worksheet_ColumnDimension + * + * @param string $pIndex Character column index + */ + public function __construct($pIndex = 'A') + { + // Initialise values + $this->_columnIndex = $pIndex; + + // set default index to cellXf + $this->_xfIndex = 0; + } + + /** + * Get ColumnIndex + * + * @return string + */ + public function getColumnIndex() { + return $this->_columnIndex; + } + + /** + * Set ColumnIndex + * + * @param string $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setColumnIndex($pValue) { + $this->_columnIndex = $pValue; + return $this; + } + + /** + * Get Width + * + * @return double + */ + public function getWidth() { + return $this->_width; + } + + /** + * Set Width + * + * @param double $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setWidth($pValue = -1) { + $this->_width = $pValue; + return $this; + } + + /** + * Get Auto Size + * + * @return bool + */ + public function getAutoSize() { + return $this->_autoSize; + } + + /** + * Set Auto Size + * + * @param bool $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setAutoSize($pValue = false) { + $this->_autoSize = $pValue; + return $this; + } + + /** + * Get Visible + * + * @return bool + */ + public function getVisible() { + return $this->_visible; + } + + /** + * Set Visible + * + * @param bool $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setVisible($pValue = true) { + $this->_visible = $pValue; + return $this; + } + + /** + * Get Outline Level + * + * @return int + */ + public function getOutlineLevel() { + return $this->_outlineLevel; + } + + /** + * Set Outline Level + * + * Value must be between 0 and 7 + * + * @param int $pValue + * @throws Exception + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setOutlineLevel($pValue) { + if ($pValue < 0 || $pValue > 7) { + throw new Exception("Outline level must range between 0 and 7."); + } + + $this->_outlineLevel = $pValue; + return $this; + } + + /** + * Get Collapsed + * + * @return bool + */ + public function getCollapsed() { + return $this->_collapsed; + } + + /** + * Set Collapsed + * + * @param bool $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setCollapsed($pValue = true) { + $this->_collapsed = $pValue; + return $this; + } + + /** + * Get index to cellXf + * + * @return int + */ + public function getXfIndex() + { + return $this->_xfIndex; + } + + /** + * Set index to cellXf + * + * @param int $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setXfIndex($pValue = 0) + { + $this->_xfIndex = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Drawing.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Drawing.php new file mode 100644 index 000000000..1d4e4b53f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Drawing.php @@ -0,0 +1,148 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet_Drawing + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_Drawing + * + * @category PHPExcel + * @package PHPExcel_Worksheet_Drawing + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_Drawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable +{ + /** + * Path + * + * @var string + */ + private $_path; + + /** + * Create a new PHPExcel_Worksheet_Drawing + */ + public function __construct() + { + // Initialise values + $this->_path = ''; + + // Initialize parent + parent::__construct(); + } + + /** + * Get Filename + * + * @return string + */ + public function getFilename() { + return basename($this->_path); + } + + /** + * Get indexed filename (using image index) + * + * @return string + */ + public function getIndexedFilename() { + $fileName = $this->getFilename(); + $fileName = str_replace(' ', '_', $fileName); + return str_replace('.' . $this->getExtension(), '', $fileName) . $this->getImageIndex() . '.' . $this->getExtension(); + } + + /** + * Get Extension + * + * @return string + */ + public function getExtension() { + $exploded = explode(".", basename($this->_path)); + return $exploded[count($exploded) - 1]; + } + + /** + * Get Path + * + * @return string + */ + public function getPath() { + return $this->_path; + } + + /** + * Set Path + * + * @param string $pValue File path + * @param boolean $pVerifyFile Verify file + * @throws Exception + * @return PHPExcel_Worksheet_Drawing + */ + public function setPath($pValue = '', $pVerifyFile = true) { + if ($pVerifyFile) { + if (file_exists($pValue)) { + $this->_path = $pValue; + + if ($this->_width == 0 && $this->_height == 0) { + // Get width/height + list($this->_width, $this->_height) = getimagesize($pValue); + } + } else { + throw new Exception("File $pValue not found!"); + } + } else { + $this->_path = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_path + . parent::getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Drawing/Shadow.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Drawing/Shadow.php new file mode 100644 index 000000000..d4a53733d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Drawing/Shadow.php @@ -0,0 +1,288 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet_Drawing + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_Drawing_Shadow + * + * @category PHPExcel + * @package PHPExcel_Worksheet_Drawing + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_Drawing_Shadow implements PHPExcel_IComparable +{ + /* Shadow alignment */ + const SHADOW_BOTTOM = 'b'; + const SHADOW_BOTTOM_LEFT = 'bl'; + const SHADOW_BOTTOM_RIGHT = 'br'; + const SHADOW_CENTER = 'ctr'; + const SHADOW_LEFT = 'l'; + const SHADOW_TOP = 't'; + const SHADOW_TOP_LEFT = 'tl'; + const SHADOW_TOP_RIGHT = 'tr'; + + /** + * Visible + * + * @var boolean + */ + private $_visible; + + /** + * Blur radius + * + * Defaults to 6 + * + * @var int + */ + private $_blurRadius; + + /** + * Shadow distance + * + * Defaults to 2 + * + * @var int + */ + private $_distance; + + /** + * Shadow direction (in degrees) + * + * @var int + */ + private $_direction; + + /** + * Shadow alignment + * + * @var int + */ + private $_alignment; + + /** + * Color + * + * @var PHPExcel_Style_Color + */ + private $_color; + + /** + * Alpha + * + * @var int + */ + private $_alpha; + + /** + * Create a new PHPExcel_Worksheet_Drawing_Shadow + */ + public function __construct() + { + // Initialise values + $this->_visible = false; + $this->_blurRadius = 6; + $this->_distance = 2; + $this->_direction = 0; + $this->_alignment = PHPExcel_Worksheet_Drawing_Shadow::SHADOW_BOTTOM_RIGHT; + $this->_color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK); + $this->_alpha = 50; + } + + /** + * Get Visible + * + * @return boolean + */ + public function getVisible() { + return $this->_visible; + } + + /** + * Set Visible + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setVisible($pValue = false) { + $this->_visible = $pValue; + return $this; + } + + /** + * Get Blur radius + * + * @return int + */ + public function getBlurRadius() { + return $this->_blurRadius; + } + + /** + * Set Blur radius + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setBlurRadius($pValue = 6) { + $this->_blurRadius = $pValue; + return $this; + } + + /** + * Get Shadow distance + * + * @return int + */ + public function getDistance() { + return $this->_distance; + } + + /** + * Set Shadow distance + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setDistance($pValue = 2) { + $this->_distance = $pValue; + return $this; + } + + /** + * Get Shadow direction (in degrees) + * + * @return int + */ + public function getDirection() { + return $this->_direction; + } + + /** + * Set Shadow direction (in degrees) + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setDirection($pValue = 0) { + $this->_direction = $pValue; + return $this; + } + + /** + * Get Shadow alignment + * + * @return int + */ + public function getAlignment() { + return $this->_alignment; + } + + /** + * Set Shadow alignment + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setAlignment($pValue = 0) { + $this->_alignment = $pValue; + return $this; + } + + /** + * Get Color + * + * @return PHPExcel_Style_Color + */ + public function getColor() { + return $this->_color; + } + + /** + * Set Color + * + * @param PHPExcel_Style_Color $pValue + * @throws Exception + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setColor(PHPExcel_Style_Color $pValue = null) { + $this->_color = $pValue; + return $this; + } + + /** + * Get Alpha + * + * @return int + */ + public function getAlpha() { + return $this->_alpha; + } + + /** + * Set Alpha + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setAlpha($pValue = 0) { + $this->_alpha = $pValue; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + ($this->_visible ? 't' : 'f') + . $this->_blurRadius + . $this->_distance + . $this->_direction + . $this->_alignment + . $this->_color->getHashCode() + . $this->_alpha + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/HeaderFooter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/HeaderFooter.php new file mode 100644 index 000000000..e2524e1f9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/HeaderFooter.php @@ -0,0 +1,465 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_HeaderFooter + * + * <code> + * Header/Footer Formatting Syntax taken from Office Open XML Part 4 - Markup Language Reference, page 1970: + * + * There are a number of formatting codes that can be written inline with the actual header / footer text, which + * affect the formatting in the header or footer. + * + * Example: This example shows the text "Center Bold Header" on the first line (center section), and the date on + * the second line (center section). + * &CCenter &"-,Bold"Bold&"-,Regular"Header_x000A_&D + * + * General Rules: + * There is no required order in which these codes must appear. + * + * The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again: + * - strikethrough + * - superscript + * - subscript + * Superscript and subscript cannot both be ON at same time. Whichever comes first wins and the other is ignored, + * while the first is ON. + * &L - code for "left section" (there are three header / footer locations, "left", "center", and "right"). When + * two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the + * order of appearance, and placed into the left section. + * &P - code for "current page #" + * &N - code for "total pages" + * &font size - code for "text font size", where font size is a font size in points. + * &K - code for "text font color" + * RGB Color is specified as RRGGBB + * Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade + * value, NN is the tint/shade value. + * &S - code for "text strikethrough" on / off + * &X - code for "text super script" on / off + * &Y - code for "text subscript" on / off + * &C - code for "center section". When two or more occurrences of this section marker exist, the contents + * from all markers are concatenated, in the order of appearance, and placed into the center section. + * + * &D - code for "date" + * &T - code for "time" + * &G - code for "picture as background" + * &U - code for "text single underline" + * &E - code for "double underline" + * &R - code for "right section". When two or more occurrences of this section marker exist, the contents + * from all markers are concatenated, in the order of appearance, and placed into the right section. + * &Z - code for "this workbook's file path" + * &F - code for "this workbook's file name" + * &A - code for "sheet tab name" + * &+ - code for add to page #. + * &- - code for subtract from page #. + * &"font name,font type" - code for "text font name" and "text font type", where font name and font type + * are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font + * name, it means "none specified". Both of font name and font type can be localized values. + * &"-,Bold" - code for "bold font style" + * &B - also means "bold font style". + * &"-,Regular" - code for "regular font style" + * &"-,Italic" - code for "italic font style" + * &I - also means "italic font style" + * &"-,Bold Italic" code for "bold italic font style" + * &O - code for "outline style" + * &H - code for "shadow style" + * </code> + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_HeaderFooter +{ + /* Header/footer image location */ + const IMAGE_HEADER_LEFT = 'LH'; + const IMAGE_HEADER_CENTER = 'CH'; + const IMAGE_HEADER_RIGHT = 'RH'; + const IMAGE_FOOTER_LEFT = 'LF'; + const IMAGE_FOOTER_CENTER = 'CF'; + const IMAGE_FOOTER_RIGHT = 'RF'; + + /** + * OddHeader + * + * @var string + */ + private $_oddHeader = ''; + + /** + * OddFooter + * + * @var string + */ + private $_oddFooter = ''; + + /** + * EvenHeader + * + * @var string + */ + private $_evenHeader = ''; + + /** + * EvenFooter + * + * @var string + */ + private $_evenFooter = ''; + + /** + * FirstHeader + * + * @var string + */ + private $_firstHeader = ''; + + /** + * FirstFooter + * + * @var string + */ + private $_firstFooter = ''; + + /** + * Different header for Odd/Even, defaults to false + * + * @var boolean + */ + private $_differentOddEven = false; + + /** + * Different header for first page, defaults to false + * + * @var boolean + */ + private $_differentFirst = false; + + /** + * Scale with document, defaults to true + * + * @var boolean + */ + private $_scaleWithDocument = true; + + /** + * Align with margins, defaults to true + * + * @var boolean + */ + private $_alignWithMargins = true; + + /** + * Header/footer images + * + * @var PHPExcel_Worksheet_HeaderFooterDrawing[] + */ + private $_headerFooterImages = array(); + + /** + * Create a new PHPExcel_Worksheet_HeaderFooter + */ + public function __construct() + { + } + + /** + * Get OddHeader + * + * @return string + */ + public function getOddHeader() { + return $this->_oddHeader; + } + + /** + * Set OddHeader + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setOddHeader($pValue) { + $this->_oddHeader = $pValue; + return $this; + } + + /** + * Get OddFooter + * + * @return string + */ + public function getOddFooter() { + return $this->_oddFooter; + } + + /** + * Set OddFooter + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setOddFooter($pValue) { + $this->_oddFooter = $pValue; + return $this; + } + + /** + * Get EvenHeader + * + * @return string + */ + public function getEvenHeader() { + return $this->_evenHeader; + } + + /** + * Set EvenHeader + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setEvenHeader($pValue) { + $this->_evenHeader = $pValue; + return $this; + } + + /** + * Get EvenFooter + * + * @return string + */ + public function getEvenFooter() { + return $this->_evenFooter; + } + + /** + * Set EvenFooter + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setEvenFooter($pValue) { + $this->_evenFooter = $pValue; + return $this; + } + + /** + * Get FirstHeader + * + * @return string + */ + public function getFirstHeader() { + return $this->_firstHeader; + } + + /** + * Set FirstHeader + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setFirstHeader($pValue) { + $this->_firstHeader = $pValue; + return $this; + } + + /** + * Get FirstFooter + * + * @return string + */ + public function getFirstFooter() { + return $this->_firstFooter; + } + + /** + * Set FirstFooter + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setFirstFooter($pValue) { + $this->_firstFooter = $pValue; + return $this; + } + + /** + * Get DifferentOddEven + * + * @return boolean + */ + public function getDifferentOddEven() { + return $this->_differentOddEven; + } + + /** + * Set DifferentOddEven + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setDifferentOddEven($pValue = false) { + $this->_differentOddEven = $pValue; + return $this; + } + + /** + * Get DifferentFirst + * + * @return boolean + */ + public function getDifferentFirst() { + return $this->_differentFirst; + } + + /** + * Set DifferentFirst + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setDifferentFirst($pValue = false) { + $this->_differentFirst = $pValue; + return $this; + } + + /** + * Get ScaleWithDocument + * + * @return boolean + */ + public function getScaleWithDocument() { + return $this->_scaleWithDocument; + } + + /** + * Set ScaleWithDocument + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setScaleWithDocument($pValue = true) { + $this->_scaleWithDocument = $pValue; + return $this; + } + + /** + * Get AlignWithMargins + * + * @return boolean + */ + public function getAlignWithMargins() { + return $this->_alignWithMargins; + } + + /** + * Set AlignWithMargins + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setAlignWithMargins($pValue = true) { + $this->_alignWithMargins = $pValue; + return $this; + } + + /** + * Add header/footer image + * + * @param PHPExcel_Worksheet_HeaderFooterDrawing $image + * @param string $location + * @throws Exception + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function addImage(PHPExcel_Worksheet_HeaderFooterDrawing $image = null, $location = self::IMAGE_HEADER_LEFT) { + $this->_headerFooterImages[$location] = $image; + return $this; + } + + /** + * Remove header/footer image + * + * @param string $location + * @throws Exception + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function removeImage($location = self::IMAGE_HEADER_LEFT) { + if (isset($this->_headerFooterImages[$location])) { + unset($this->_headerFooterImages[$location]); + } + return $this; + } + + /** + * Set header/footer images + * + * @param PHPExcel_Worksheet_HeaderFooterDrawing[] $images + * @throws Exception + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setImages($images) { + if (!is_array($images)) { + throw new Exception('Invalid parameter!'); + } + + $this->_headerFooterImages = $images; + return $this; + } + + /** + * Get header/footer images + * + * @return PHPExcel_Worksheet_HeaderFooterDrawing[] + */ + public function getImages() { + // Sort array + $images = array(); + if (isset($this->_headerFooterImages[self::IMAGE_HEADER_LEFT])) $images[self::IMAGE_HEADER_LEFT] = $this->_headerFooterImages[self::IMAGE_HEADER_LEFT]; + if (isset($this->_headerFooterImages[self::IMAGE_HEADER_CENTER])) $images[self::IMAGE_HEADER_CENTER] = $this->_headerFooterImages[self::IMAGE_HEADER_CENTER]; + if (isset($this->_headerFooterImages[self::IMAGE_HEADER_RIGHT])) $images[self::IMAGE_HEADER_RIGHT] = $this->_headerFooterImages[self::IMAGE_HEADER_RIGHT]; + if (isset($this->_headerFooterImages[self::IMAGE_FOOTER_LEFT])) $images[self::IMAGE_FOOTER_LEFT] = $this->_headerFooterImages[self::IMAGE_FOOTER_LEFT]; + if (isset($this->_headerFooterImages[self::IMAGE_FOOTER_CENTER])) $images[self::IMAGE_FOOTER_CENTER] = $this->_headerFooterImages[self::IMAGE_FOOTER_CENTER]; + if (isset($this->_headerFooterImages[self::IMAGE_FOOTER_RIGHT])) $images[self::IMAGE_FOOTER_RIGHT] = $this->_headerFooterImages[self::IMAGE_FOOTER_RIGHT]; + $this->_headerFooterImages = $images; + + return $this->_headerFooterImages; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/HeaderFooterDrawing.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/HeaderFooterDrawing.php new file mode 100644 index 000000000..94672da47 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/HeaderFooterDrawing.php @@ -0,0 +1,350 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_HeaderFooterDrawing + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_HeaderFooterDrawing extends PHPExcel_Worksheet_Drawing implements PHPExcel_IComparable +{ + /** + * Path + * + * @var string + */ + private $_path; + + /** + * Name + * + * @var string + */ + protected $_name; + + /** + * Offset X + * + * @var int + */ + protected $_offsetX; + + /** + * Offset Y + * + * @var int + */ + protected $_offsetY; + + /** + * Width + * + * @var int + */ + protected $_width; + + /** + * Height + * + * @var int + */ + protected $_height; + + /** + * Proportional resize + * + * @var boolean + */ + protected $_resizeProportional; + + /** + * Create a new PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function __construct() + { + // Initialise values + $this->_path = ''; + $this->_name = ''; + $this->_offsetX = 0; + $this->_offsetY = 0; + $this->_width = 0; + $this->_height = 0; + $this->_resizeProportional = true; + } + + /** + * Get Name + * + * @return string + */ + public function getName() { + return $this->_name; + } + + /** + * Set Name + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setName($pValue = '') { + $this->_name = $pValue; + return $this; + } + + /** + * Get OffsetX + * + * @return int + */ + public function getOffsetX() { + return $this->_offsetX; + } + + /** + * Set OffsetX + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setOffsetX($pValue = 0) { + $this->_offsetX = $pValue; + return $this; + } + + /** + * Get OffsetY + * + * @return int + */ + public function getOffsetY() { + return $this->_offsetY; + } + + /** + * Set OffsetY + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setOffsetY($pValue = 0) { + $this->_offsetY = $pValue; + return $this; + } + + /** + * Get Width + * + * @return int + */ + public function getWidth() { + return $this->_width; + } + + /** + * Set Width + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setWidth($pValue = 0) { + // Resize proportional? + if ($this->_resizeProportional && $pValue != 0) { + $ratio = $this->_width / $this->_height; + $this->_height = round($ratio * $pValue); + } + + // Set width + $this->_width = $pValue; + + return $this; + } + + /** + * Get Height + * + * @return int + */ + public function getHeight() { + return $this->_height; + } + + /** + * Set Height + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setHeight($pValue = 0) { + // Resize proportional? + if ($this->_resizeProportional && $pValue != 0) { + $ratio = $this->_width / $this->_height; + $this->_width = round($ratio * $pValue); + } + + // Set height + $this->_height = $pValue; + + return $this; + } + + /** + * Set width and height with proportional resize + * Example: + * <code> + * $objDrawing->setResizeProportional(true); + * $objDrawing->setWidthAndHeight(160,120); + * </code> + * + * @author Vincent@luo MSN:kele_100@hotmail.com + * @param int $width + * @param int $height + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setWidthAndHeight($width = 0, $height = 0) { + $xratio = $width / $this->_width; + $yratio = $height / $this->_height; + if ($this->_resizeProportional && !($width == 0 || $height == 0)) { + if (($xratio * $this->_height) < $height) { + $this->_height = ceil($xratio * $this->_height); + $this->_width = $width; + } else { + $this->_width = ceil($yratio * $this->_width); + $this->_height = $height; + } + } + return $this; + } + + /** + * Get ResizeProportional + * + * @return boolean + */ + public function getResizeProportional() { + return $this->_resizeProportional; + } + + /** + * Set ResizeProportional + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setResizeProportional($pValue = true) { + $this->_resizeProportional = $pValue; + return $this; + } + + /** + * Get Filename + * + * @return string + */ + public function getFilename() { + return basename($this->_path); + } + + /** + * Get Extension + * + * @return string + */ + public function getExtension() { + $parts = explode(".", basename($this->_path)); + return end($parts); + } + + /** + * Get Path + * + * @return string + */ + public function getPath() { + return $this->_path; + } + + /** + * Set Path + * + * @param string $pValue File path + * @param boolean $pVerifyFile Verify file + * @throws Exception + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setPath($pValue = '', $pVerifyFile = true) { + if ($pVerifyFile) { + if (file_exists($pValue)) { + $this->_path = $pValue; + + if ($this->_width == 0 && $this->_height == 0) { + // Get width/height + list($this->_width, $this->_height) = getimagesize($pValue); + } + } else { + throw new Exception("File $pValue not found!"); + } + } else { + $this->_path = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_path + . $this->_name + . $this->_offsetX + . $this->_offsetY + . $this->_width + . $this->_height + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/MemoryDrawing.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/MemoryDrawing.php new file mode 100644 index 000000000..223a29f06 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/MemoryDrawing.php @@ -0,0 +1,200 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_MemoryDrawing + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_MemoryDrawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable +{ + /* Rendering functions */ + const RENDERING_DEFAULT = 'imagepng'; + const RENDERING_PNG = 'imagepng'; + const RENDERING_GIF = 'imagegif'; + const RENDERING_JPEG = 'imagejpeg'; + + /* MIME types */ + const MIMETYPE_DEFAULT = 'image/png'; + const MIMETYPE_PNG = 'image/png'; + const MIMETYPE_GIF = 'image/gif'; + const MIMETYPE_JPEG = 'image/jpeg'; + + /** + * Image resource + * + * @var resource + */ + private $_imageResource; + + /** + * Rendering function + * + * @var string + */ + private $_renderingFunction; + + /** + * Mime type + * + * @var string + */ + private $_mimeType; + + /** + * Unique name + * + * @var string + */ + private $_uniqueName; + + /** + * Create a new PHPExcel_Worksheet_MemoryDrawing + */ + public function __construct() + { + // Initialise values + $this->_imageResource = null; + $this->_renderingFunction = self::RENDERING_DEFAULT; + $this->_mimeType = self::MIMETYPE_DEFAULT; + $this->_uniqueName = md5(rand(0, 9999). time() . rand(0, 9999)); + + // Initialize parent + parent::__construct(); + } + + /** + * Get image resource + * + * @return resource + */ + public function getImageResource() { + return $this->_imageResource; + } + + /** + * Set image resource + * + * @param $value resource + * @return PHPExcel_Worksheet_MemoryDrawing + */ + public function setImageResource($value = null) { + $this->_imageResource = $value; + + if (!is_null($this->_imageResource)) { + // Get width/height + $this->_width = imagesx($this->_imageResource); + $this->_height = imagesy($this->_imageResource); + } + return $this; + } + + /** + * Get rendering function + * + * @return string + */ + public function getRenderingFunction() { + return $this->_renderingFunction; + } + + /** + * Set rendering function + * + * @param string $value + * @return PHPExcel_Worksheet_MemoryDrawing + */ + public function setRenderingFunction($value = PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT) { + $this->_renderingFunction = $value; + return $this; + } + + /** + * Get mime type + * + * @return string + */ + public function getMimeType() { + return $this->_mimeType; + } + + /** + * Set mime type + * + * @param string $value + * @return PHPExcel_Worksheet_MemoryDrawing + */ + public function setMimeType($value = PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT) { + $this->_mimeType = $value; + return $this; + } + + /** + * Get indexed filename (using image index) + * + * @return string + */ + public function getIndexedFilename() { + $extension = strtolower($this->getMimeType()); + $extension = explode('/', $extension); + $extension = $extension[1]; + + return $this->_uniqueName . $this->getImageIndex() . '.' . $extension; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() { + return md5( + $this->_renderingFunction + . $this->_mimeType + . $this->_uniqueName + . parent::getHashCode() + . __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/PageMargins.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/PageMargins.php new file mode 100644 index 000000000..7d31a5f62 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/PageMargins.php @@ -0,0 +1,220 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_PageMargins + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_PageMargins +{ + /** + * Left + * + * @var double + */ + private $_left = 0.7; + + /** + * Right + * + * @var double + */ + private $_right = 0.7; + + /** + * Top + * + * @var double + */ + private $_top = 0.75; + + /** + * Bottom + * + * @var double + */ + private $_bottom = 0.75; + + /** + * Header + * + * @var double + */ + private $_header = 0.3; + + /** + * Footer + * + * @var double + */ + private $_footer = 0.3; + + /** + * Create a new PHPExcel_Worksheet_PageMargins + */ + public function __construct() + { + } + + /** + * Get Left + * + * @return double + */ + public function getLeft() { + return $this->_left; + } + + /** + * Set Left + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setLeft($pValue) { + $this->_left = $pValue; + return $this; + } + + /** + * Get Right + * + * @return double + */ + public function getRight() { + return $this->_right; + } + + /** + * Set Right + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setRight($pValue) { + $this->_right = $pValue; + return $this; + } + + /** + * Get Top + * + * @return double + */ + public function getTop() { + return $this->_top; + } + + /** + * Set Top + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setTop($pValue) { + $this->_top = $pValue; + return $this; + } + + /** + * Get Bottom + * + * @return double + */ + public function getBottom() { + return $this->_bottom; + } + + /** + * Set Bottom + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setBottom($pValue) { + $this->_bottom = $pValue; + return $this; + } + + /** + * Get Header + * + * @return double + */ + public function getHeader() { + return $this->_header; + } + + /** + * Set Header + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setHeader($pValue) { + $this->_header = $pValue; + return $this; + } + + /** + * Get Footer + * + * @return double + */ + public function getFooter() { + return $this->_footer; + } + + /** + * Set Footer + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setFooter($pValue) { + $this->_footer = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/PageSetup.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/PageSetup.php new file mode 100644 index 000000000..693f1c6a8 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/PageSetup.php @@ -0,0 +1,798 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_PageSetup + * + * <code> + * Paper size taken from Office Open XML Part 4 - Markup Language Reference, page 1988: + * + * 1 = Letter paper (8.5 in. by 11 in.) + * 2 = Letter small paper (8.5 in. by 11 in.) + * 3 = Tabloid paper (11 in. by 17 in.) + * 4 = Ledger paper (17 in. by 11 in.) + * 5 = Legal paper (8.5 in. by 14 in.) + * 6 = Statement paper (5.5 in. by 8.5 in.) + * 7 = Executive paper (7.25 in. by 10.5 in.) + * 8 = A3 paper (297 mm by 420 mm) + * 9 = A4 paper (210 mm by 297 mm) + * 10 = A4 small paper (210 mm by 297 mm) + * 11 = A5 paper (148 mm by 210 mm) + * 12 = B4 paper (250 mm by 353 mm) + * 13 = B5 paper (176 mm by 250 mm) + * 14 = Folio paper (8.5 in. by 13 in.) + * 15 = Quarto paper (215 mm by 275 mm) + * 16 = Standard paper (10 in. by 14 in.) + * 17 = Standard paper (11 in. by 17 in.) + * 18 = Note paper (8.5 in. by 11 in.) + * 19 = #9 envelope (3.875 in. by 8.875 in.) + * 20 = #10 envelope (4.125 in. by 9.5 in.) + * 21 = #11 envelope (4.5 in. by 10.375 in.) + * 22 = #12 envelope (4.75 in. by 11 in.) + * 23 = #14 envelope (5 in. by 11.5 in.) + * 24 = C paper (17 in. by 22 in.) + * 25 = D paper (22 in. by 34 in.) + * 26 = E paper (34 in. by 44 in.) + * 27 = DL envelope (110 mm by 220 mm) + * 28 = C5 envelope (162 mm by 229 mm) + * 29 = C3 envelope (324 mm by 458 mm) + * 30 = C4 envelope (229 mm by 324 mm) + * 31 = C6 envelope (114 mm by 162 mm) + * 32 = C65 envelope (114 mm by 229 mm) + * 33 = B4 envelope (250 mm by 353 mm) + * 34 = B5 envelope (176 mm by 250 mm) + * 35 = B6 envelope (176 mm by 125 mm) + * 36 = Italy envelope (110 mm by 230 mm) + * 37 = Monarch envelope (3.875 in. by 7.5 in.). + * 38 = 6 3/4 envelope (3.625 in. by 6.5 in.) + * 39 = US standard fanfold (14.875 in. by 11 in.) + * 40 = German standard fanfold (8.5 in. by 12 in.) + * 41 = German legal fanfold (8.5 in. by 13 in.) + * 42 = ISO B4 (250 mm by 353 mm) + * 43 = Japanese double postcard (200 mm by 148 mm) + * 44 = Standard paper (9 in. by 11 in.) + * 45 = Standard paper (10 in. by 11 in.) + * 46 = Standard paper (15 in. by 11 in.) + * 47 = Invite envelope (220 mm by 220 mm) + * 50 = Letter extra paper (9.275 in. by 12 in.) + * 51 = Legal extra paper (9.275 in. by 15 in.) + * 52 = Tabloid extra paper (11.69 in. by 18 in.) + * 53 = A4 extra paper (236 mm by 322 mm) + * 54 = Letter transverse paper (8.275 in. by 11 in.) + * 55 = A4 transverse paper (210 mm by 297 mm) + * 56 = Letter extra transverse paper (9.275 in. by 12 in.) + * 57 = SuperA/SuperA/A4 paper (227 mm by 356 mm) + * 58 = SuperB/SuperB/A3 paper (305 mm by 487 mm) + * 59 = Letter plus paper (8.5 in. by 12.69 in.) + * 60 = A4 plus paper (210 mm by 330 mm) + * 61 = A5 transverse paper (148 mm by 210 mm) + * 62 = JIS B5 transverse paper (182 mm by 257 mm) + * 63 = A3 extra paper (322 mm by 445 mm) + * 64 = A5 extra paper (174 mm by 235 mm) + * 65 = ISO B5 extra paper (201 mm by 276 mm) + * 66 = A2 paper (420 mm by 594 mm) + * 67 = A3 transverse paper (297 mm by 420 mm) + * 68 = A3 extra transverse paper (322 mm by 445 mm) + * </code> + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_PageSetup +{ + /* Paper size */ + const PAPERSIZE_LETTER = 1; + const PAPERSIZE_LETTER_SMALL = 2; + const PAPERSIZE_TABLOID = 3; + const PAPERSIZE_LEDGER = 4; + const PAPERSIZE_LEGAL = 5; + const PAPERSIZE_STATEMENT = 6; + const PAPERSIZE_EXECUTIVE = 7; + const PAPERSIZE_A3 = 8; + const PAPERSIZE_A4 = 9; + const PAPERSIZE_A4_SMALL = 10; + const PAPERSIZE_A5 = 11; + const PAPERSIZE_B4 = 12; + const PAPERSIZE_B5 = 13; + const PAPERSIZE_FOLIO = 14; + const PAPERSIZE_QUARTO = 15; + const PAPERSIZE_STANDARD_1 = 16; + const PAPERSIZE_STANDARD_2 = 17; + const PAPERSIZE_NOTE = 18; + const PAPERSIZE_NO9_ENVELOPE = 19; + const PAPERSIZE_NO10_ENVELOPE = 20; + const PAPERSIZE_NO11_ENVELOPE = 21; + const PAPERSIZE_NO12_ENVELOPE = 22; + const PAPERSIZE_NO14_ENVELOPE = 23; + const PAPERSIZE_C = 24; + const PAPERSIZE_D = 25; + const PAPERSIZE_E = 26; + const PAPERSIZE_DL_ENVELOPE = 27; + const PAPERSIZE_C5_ENVELOPE = 28; + const PAPERSIZE_C3_ENVELOPE = 29; + const PAPERSIZE_C4_ENVELOPE = 30; + const PAPERSIZE_C6_ENVELOPE = 31; + const PAPERSIZE_C65_ENVELOPE = 32; + const PAPERSIZE_B4_ENVELOPE = 33; + const PAPERSIZE_B5_ENVELOPE = 34; + const PAPERSIZE_B6_ENVELOPE = 35; + const PAPERSIZE_ITALY_ENVELOPE = 36; + const PAPERSIZE_MONARCH_ENVELOPE = 37; + const PAPERSIZE_6_3_4_ENVELOPE = 38; + const PAPERSIZE_US_STANDARD_FANFOLD = 39; + const PAPERSIZE_GERMAN_STANDARD_FANFOLD = 40; + const PAPERSIZE_GERMAN_LEGAL_FANFOLD = 41; + const PAPERSIZE_ISO_B4 = 42; + const PAPERSIZE_JAPANESE_DOUBLE_POSTCARD = 43; + const PAPERSIZE_STANDARD_PAPER_1 = 44; + const PAPERSIZE_STANDARD_PAPER_2 = 45; + const PAPERSIZE_STANDARD_PAPER_3 = 46; + const PAPERSIZE_INVITE_ENVELOPE = 47; + const PAPERSIZE_LETTER_EXTRA_PAPER = 48; + const PAPERSIZE_LEGAL_EXTRA_PAPER = 49; + const PAPERSIZE_TABLOID_EXTRA_PAPER = 50; + const PAPERSIZE_A4_EXTRA_PAPER = 51; + const PAPERSIZE_LETTER_TRANSVERSE_PAPER = 52; + const PAPERSIZE_A4_TRANSVERSE_PAPER = 53; + const PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER = 54; + const PAPERSIZE_SUPERA_SUPERA_A4_PAPER = 55; + const PAPERSIZE_SUPERB_SUPERB_A3_PAPER = 56; + const PAPERSIZE_LETTER_PLUS_PAPER = 57; + const PAPERSIZE_A4_PLUS_PAPER = 58; + const PAPERSIZE_A5_TRANSVERSE_PAPER = 59; + const PAPERSIZE_JIS_B5_TRANSVERSE_PAPER = 60; + const PAPERSIZE_A3_EXTRA_PAPER = 61; + const PAPERSIZE_A5_EXTRA_PAPER = 62; + const PAPERSIZE_ISO_B5_EXTRA_PAPER = 63; + const PAPERSIZE_A2_PAPER = 64; + const PAPERSIZE_A3_TRANSVERSE_PAPER = 65; + const PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER = 66; + + /* Page orientation */ + const ORIENTATION_DEFAULT = 'default'; + const ORIENTATION_LANDSCAPE = 'landscape'; + const ORIENTATION_PORTRAIT = 'portrait'; + + /* Print Range Set Method */ + const SETPRINTRANGE_OVERWRITE = 'O'; + const SETPRINTRANGE_INSERT = 'I'; + + + /** + * Paper size + * + * @var int + */ + private $_paperSize = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER; + + /** + * Orientation + * + * @var string + */ + private $_orientation = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT; + + /** + * Scale (Print Scale) + * + * Print scaling. Valid values range from 10 to 400 + * This setting is overridden when fitToWidth and/or fitToHeight are in use + * + * @var int? + */ + private $_scale = 100; + + /** + * Fit To Page + * Whether scale or fitToWith / fitToHeight applies + * + * @var boolean + */ + private $_fitToPage = FALSE; + + /** + * Fit To Height + * Number of vertical pages to fit on + * + * @var int? + */ + private $_fitToHeight = 1; + + /** + * Fit To Width + * Number of horizontal pages to fit on + * + * @var int? + */ + private $_fitToWidth = 1; + + /** + * Columns to repeat at left + * + * @var array Containing start column and end column, empty array if option unset + */ + private $_columnsToRepeatAtLeft = array('', ''); + + /** + * Rows to repeat at top + * + * @var array Containing start row number and end row number, empty array if option unset + */ + private $_rowsToRepeatAtTop = array(0, 0); + + /** + * Center page horizontally + * + * @var boolean + */ + private $_horizontalCentered = FALSE; + + /** + * Center page vertically + * + * @var boolean + */ + private $_verticalCentered = FALSE; + + /** + * Print area + * + * @var string + */ + private $_printArea = NULL; + + /** + * First page number + * + * @var int + */ + private $_firstPageNumber = NULL; + + /** + * Create a new PHPExcel_Worksheet_PageSetup + */ + public function __construct() + { + } + + /** + * Get Paper Size + * + * @return int + */ + public function getPaperSize() { + return $this->_paperSize; + } + + /** + * Set Paper Size + * + * @param int $pValue + * @return PHPExcel_Worksheet_PageSetup + */ + public function setPaperSize($pValue = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER) { + $this->_paperSize = $pValue; + return $this; + } + + /** + * Get Orientation + * + * @return string + */ + public function getOrientation() { + return $this->_orientation; + } + + /** + * Set Orientation + * + * @param string $pValue + * @return PHPExcel_Worksheet_PageSetup + */ + public function setOrientation($pValue = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) { + $this->_orientation = $pValue; + return $this; + } + + /** + * Get Scale + * + * @return int? + */ + public function getScale() { + return $this->_scale; + } + + /** + * Set Scale + * + * Print scaling. Valid values range from 10 to 400 + * This setting is overridden when fitToWidth and/or fitToHeight are in use + * + * @param int? $pValue + * @param boolean $pUpdate Update fitToPage so scaling applies rather than fitToHeight / fitToWidth + * @return PHPExcel_Worksheet_PageSetup + * @throws Exception + */ + public function setScale($pValue = 100, $pUpdate = true) { + // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface, + // but it is apparently still able to handle any scale >= 0, where 0 results in 100 + if (($pValue >= 0) || is_null($pValue)) { + $this->_scale = $pValue; + if ($pUpdate) { + $this->_fitToPage = false; + } + } else { + throw new Exception("Scale must not be negative"); + } + return $this; + } + + /** + * Get Fit To Page + * + * @return boolean + */ + public function getFitToPage() { + return $this->_fitToPage; + } + + /** + * Set Fit To Page + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_PageSetup + */ + public function setFitToPage($pValue = TRUE) { + $this->_fitToPage = $pValue; + return $this; + } + + /** + * Get Fit To Height + * + * @return int? + */ + public function getFitToHeight() { + return $this->_fitToHeight; + } + + /** + * Set Fit To Height + * + * @param int? $pValue + * @param boolean $pUpdate Update fitToPage so it applies rather than scaling + * @return PHPExcel_Worksheet_PageSetup + */ + public function setFitToHeight($pValue = 1, $pUpdate = TRUE) { + $this->_fitToHeight = $pValue; + if ($pUpdate) { + $this->_fitToPage = TRUE; + } + return $this; + } + + /** + * Get Fit To Width + * + * @return int? + */ + public function getFitToWidth() { + return $this->_fitToWidth; + } + + /** + * Set Fit To Width + * + * @param int? $pValue + * @param boolean $pUpdate Update fitToPage so it applies rather than scaling + * @return PHPExcel_Worksheet_PageSetup + */ + public function setFitToWidth($pValue = 1, $pUpdate = TRUE) { + $this->_fitToWidth = $pValue; + if ($pUpdate) { + $this->_fitToPage = TRUE; + } + return $this; + } + + /** + * Is Columns to repeat at left set? + * + * @return boolean + */ + public function isColumnsToRepeatAtLeftSet() { + if (is_array($this->_columnsToRepeatAtLeft)) { + if ($this->_columnsToRepeatAtLeft[0] != '' && $this->_columnsToRepeatAtLeft[1] != '') { + return true; + } + } + + return false; + } + + /** + * Get Columns to repeat at left + * + * @return array Containing start column and end column, empty array if option unset + */ + public function getColumnsToRepeatAtLeft() { + return $this->_columnsToRepeatAtLeft; + } + + /** + * Set Columns to repeat at left + * + * @param array $pValue Containing start column and end column, empty array if option unset + * @return PHPExcel_Worksheet_PageSetup + */ + public function setColumnsToRepeatAtLeft($pValue = null) { + if (is_array($pValue)) { + $this->_columnsToRepeatAtLeft = $pValue; + } + return $this; + } + + /** + * Set Columns to repeat at left by start and end + * + * @param string $pStart + * @param string $pEnd + * @return PHPExcel_Worksheet_PageSetup + */ + public function setColumnsToRepeatAtLeftByStartAndEnd($pStart = 'A', $pEnd = 'A') { + $this->_columnsToRepeatAtLeft = array($pStart, $pEnd); + return $this; + } + + /** + * Is Rows to repeat at top set? + * + * @return boolean + */ + public function isRowsToRepeatAtTopSet() { + if (is_array($this->_rowsToRepeatAtTop)) { + if ($this->_rowsToRepeatAtTop[0] != 0 && $this->_rowsToRepeatAtTop[1] != 0) { + return true; + } + } + + return false; + } + + /** + * Get Rows to repeat at top + * + * @return array Containing start column and end column, empty array if option unset + */ + public function getRowsToRepeatAtTop() { + return $this->_rowsToRepeatAtTop; + } + + /** + * Set Rows to repeat at top + * + * @param array $pValue Containing start column and end column, empty array if option unset + * @return PHPExcel_Worksheet_PageSetup + */ + public function setRowsToRepeatAtTop($pValue = null) { + if (is_array($pValue)) { + $this->_rowsToRepeatAtTop = $pValue; + } + return $this; + } + + /** + * Set Rows to repeat at top by start and end + * + * @param int $pStart + * @param int $pEnd + * @return PHPExcel_Worksheet_PageSetup + */ + public function setRowsToRepeatAtTopByStartAndEnd($pStart = 1, $pEnd = 1) { + $this->_rowsToRepeatAtTop = array($pStart, $pEnd); + return $this; + } + + /** + * Get center page horizontally + * + * @return bool + */ + public function getHorizontalCentered() { + return $this->_horizontalCentered; + } + + /** + * Set center page horizontally + * + * @param bool $value + * @return PHPExcel_Worksheet_PageSetup + */ + public function setHorizontalCentered($value = false) { + $this->_horizontalCentered = $value; + return $this; + } + + /** + * Get center page vertically + * + * @return bool + */ + public function getVerticalCentered() { + return $this->_verticalCentered; + } + + /** + * Set center page vertically + * + * @param bool $value + * @return PHPExcel_Worksheet_PageSetup + */ + public function setVerticalCentered($value = false) { + $this->_verticalCentered = $value; + return $this; + } + + /** + * Get print area + * + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or a index value of 0, will return all ranges as a comma-separated string + * Otherwise, the specific range identified by the value of $index will be returned + * Print areas are numbered from 1 + * @throws Exception + * @return string + */ + public function getPrintArea($index = 0) { + if ($index == 0) { + return $this->_printArea; + } + $printAreas = explode(',',$this->_printArea); + if (isset($printAreas[$index-1])) { + return $printAreas[$index-1]; + } + throw new Exception("Requested Print Area does not exist"); + } + + /** + * Is print area set? + * + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or an index value of 0, will identify whether any print range is set + * Otherwise, existence of the range identified by the value of $index will be returned + * Print areas are numbered from 1 + * @return boolean + */ + public function isPrintAreaSet($index = 0) { + if ($index == 0) { + return !is_null($this->_printArea); + } + $printAreas = explode(',',$this->_printArea); + return isset($printAreas[$index-1]); + } + + /** + * Clear a print area + * + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or an index value of 0, will clear all print ranges that are set + * Otherwise, the range identified by the value of $index will be removed from the series + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup + */ + public function clearPrintArea($index = 0) { + if ($index == 0) { + $this->_printArea = NULL; + } else { + $printAreas = explode(',',$this->_printArea); + if (isset($printAreas[$index-1])) { + unset($printAreas[$index-1]); + $this->_printArea = implode(',',$printAreas); + } + } + + return $this; + } + + /** + * Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20' + * + * @param string $value + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * When the method is "O"verwrite, then a positive integer index will overwrite that indexed + * entry in the print areas list; a negative index value will identify which entry to + * overwrite working bacward through the print area to the list, with the last entry as -1. + * Specifying an index value of 0, will overwrite <b>all</b> existing print ranges. + * When the method is "I"nsert, then a positive index will insert after that indexed entry in + * the print areas list, while a negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @param string $method Determines the method used when setting multiple print areas + * Default behaviour, or the "O" method, overwrites existing print area + * The "I" method, inserts the new print area before any specified index, or at the end of the list + * @return PHPExcel_Worksheet_PageSetup + * @throws Exception + */ + public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) { + if (strpos($value,'!') !== false) { + throw new Exception('Cell coordinate must not specify a worksheet.'); + } elseif (strpos($value,':') === false) { + throw new Exception('Cell coordinate must be a range of cells.'); + } elseif (strpos($value,'$') !== false) { + throw new Exception('Cell coordinate must not be absolute.'); + } + $value = strtoupper($value); + + if ($method == self::SETPRINTRANGE_OVERWRITE) { + if ($index == 0) { + $this->_printArea = $value; + } else { + $printAreas = explode(',',$this->_printArea); + if($index < 0) { + $index = count($printAreas) - abs($index) + 1; + } + if (($index <= 0) || ($index > count($printAreas))) { + throw new Exception('Invalid index for setting print range.'); + } + $printAreas[$index-1] = $value; + $this->_printArea = implode(',',$printAreas); + } + } elseif($method == self::SETPRINTRANGE_INSERT) { + if ($index == 0) { + $this->_printArea .= ($this->_printArea == '') ? $value : ','.$value; + } else { + $printAreas = explode(',',$this->_printArea); + if($index < 0) { + $index = abs($index) - 1; + } + if ($index > count($printAreas)) { + throw new Exception('Invalid index for setting print range.'); + } + $printAreas = array_merge(array_slice($printAreas,0,$index),array($value),array_slice($printAreas,$index)); + $this->_printArea = implode(',',$printAreas); + } + } else { + throw new Exception('Invalid method for setting print range.'); + } + + return $this; + } + + /** + * Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas + * + * @param string $value + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * A positive index will insert after that indexed entry in the print areas list, while a + * negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup + * @throws Exception + */ + public function addPrintArea($value, $index = -1) { + return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT); + } + + /** + * Set print area + * + * @param int $column1 Column 1 + * @param int $row1 Row 1 + * @param int $column2 Column 2 + * @param int $row2 Row 2 + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * When the method is "O"verwrite, then a positive integer index will overwrite that indexed + * entry in the print areas list; a negative index value will identify which entry to + * overwrite working bacward through the print area to the list, with the last entry as -1. + * Specifying an index value of 0, will overwrite <b>all</b> existing print ranges. + * When the method is "I"nsert, then a positive index will insert after that indexed entry in + * the print areas list, while a negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @param string $method Determines the method used when setting multiple print areas + * Default behaviour, or the "O" method, overwrites existing print area + * The "I" method, inserts the new print area before any specified index, or at the end of the list + * @return PHPExcel_Worksheet_PageSetup + * @throws Exception + */ + public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) + { + return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, $method); + } + + /** + * Add a new print area to the list of print areas + * + * @param int $column1 Start Column for the print area + * @param int $row1 Start Row for the print area + * @param int $column2 End Column for the print area + * @param int $row2 End Row for the print area + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * A positive index will insert after that indexed entry in the print areas list, while a + * negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup + * @throws Exception + */ + public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1) + { + return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, self::SETPRINTRANGE_INSERT); + } + + /** + * Get first page number + * + * @return int + */ + public function getFirstPageNumber() { + return $this->_firstPageNumber; + } + + /** + * Set first page number + * + * @param int $value + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setFirstPageNumber($value = null) { + $this->_firstPageNumber = $value; + return $this; + } + + /** + * Reset first page number + * + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function resetFirstPageNumber() { + return $this->setFirstPageNumber(null); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Protection.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Protection.php new file mode 100644 index 000000000..e7c3436f1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Protection.php @@ -0,0 +1,545 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_Protection + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_Protection +{ + /** + * Sheet + * + * @var boolean + */ + private $_sheet = false; + + /** + * Objects + * + * @var boolean + */ + private $_objects = false; + + /** + * Scenarios + * + * @var boolean + */ + private $_scenarios = false; + + /** + * Format cells + * + * @var boolean + */ + private $_formatCells = false; + + /** + * Format columns + * + * @var boolean + */ + private $_formatColumns = false; + + /** + * Format rows + * + * @var boolean + */ + private $_formatRows = false; + + /** + * Insert columns + * + * @var boolean + */ + private $_insertColumns = false; + + /** + * Insert rows + * + * @var boolean + */ + private $_insertRows = false; + + /** + * Insert hyperlinks + * + * @var boolean + */ + private $_insertHyperlinks = false; + + /** + * Delete columns + * + * @var boolean + */ + private $_deleteColumns = false; + + /** + * Delete rows + * + * @var boolean + */ + private $_deleteRows = false; + + /** + * Select locked cells + * + * @var boolean + */ + private $_selectLockedCells = false; + + /** + * Sort + * + * @var boolean + */ + private $_sort = false; + + /** + * AutoFilter + * + * @var boolean + */ + private $_autoFilter = false; + + /** + * Pivot tables + * + * @var boolean + */ + private $_pivotTables = false; + + /** + * Select unlocked cells + * + * @var boolean + */ + private $_selectUnlockedCells = false; + + /** + * Password + * + * @var string + */ + private $_password = ''; + + /** + * Create a new PHPExcel_Worksheet_Protection + */ + public function __construct() + { + } + + /** + * Is some sort of protection enabled? + * + * @return boolean + */ + function isProtectionEnabled() { + return $this->_sheet || + $this->_objects || + $this->_scenarios || + $this->_formatCells || + $this->_formatColumns || + $this->_formatRows || + $this->_insertColumns || + $this->_insertRows || + $this->_insertHyperlinks || + $this->_deleteColumns || + $this->_deleteRows || + $this->_selectLockedCells || + $this->_sort || + $this->_autoFilter || + $this->_pivotTables || + $this->_selectUnlockedCells; + } + + /** + * Get Sheet + * + * @return boolean + */ + function getSheet() { + return $this->_sheet; + } + + /** + * Set Sheet + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setSheet($pValue = false) { + $this->_sheet = $pValue; + return $this; + } + + /** + * Get Objects + * + * @return boolean + */ + function getObjects() { + return $this->_objects; + } + + /** + * Set Objects + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setObjects($pValue = false) { + $this->_objects = $pValue; + return $this; + } + + /** + * Get Scenarios + * + * @return boolean + */ + function getScenarios() { + return $this->_scenarios; + } + + /** + * Set Scenarios + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setScenarios($pValue = false) { + $this->_scenarios = $pValue; + return $this; + } + + /** + * Get FormatCells + * + * @return boolean + */ + function getFormatCells() { + return $this->_formatCells; + } + + /** + * Set FormatCells + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setFormatCells($pValue = false) { + $this->_formatCells = $pValue; + return $this; + } + + /** + * Get FormatColumns + * + * @return boolean + */ + function getFormatColumns() { + return $this->_formatColumns; + } + + /** + * Set FormatColumns + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setFormatColumns($pValue = false) { + $this->_formatColumns = $pValue; + return $this; + } + + /** + * Get FormatRows + * + * @return boolean + */ + function getFormatRows() { + return $this->_formatRows; + } + + /** + * Set FormatRows + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setFormatRows($pValue = false) { + $this->_formatRows = $pValue; + return $this; + } + + /** + * Get InsertColumns + * + * @return boolean + */ + function getInsertColumns() { + return $this->_insertColumns; + } + + /** + * Set InsertColumns + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setInsertColumns($pValue = false) { + $this->_insertColumns = $pValue; + return $this; + } + + /** + * Get InsertRows + * + * @return boolean + */ + function getInsertRows() { + return $this->_insertRows; + } + + /** + * Set InsertRows + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setInsertRows($pValue = false) { + $this->_insertRows = $pValue; + return $this; + } + + /** + * Get InsertHyperlinks + * + * @return boolean + */ + function getInsertHyperlinks() { + return $this->_insertHyperlinks; + } + + /** + * Set InsertHyperlinks + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setInsertHyperlinks($pValue = false) { + $this->_insertHyperlinks = $pValue; + return $this; + } + + /** + * Get DeleteColumns + * + * @return boolean + */ + function getDeleteColumns() { + return $this->_deleteColumns; + } + + /** + * Set DeleteColumns + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setDeleteColumns($pValue = false) { + $this->_deleteColumns = $pValue; + return $this; + } + + /** + * Get DeleteRows + * + * @return boolean + */ + function getDeleteRows() { + return $this->_deleteRows; + } + + /** + * Set DeleteRows + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setDeleteRows($pValue = false) { + $this->_deleteRows = $pValue; + return $this; + } + + /** + * Get SelectLockedCells + * + * @return boolean + */ + function getSelectLockedCells() { + return $this->_selectLockedCells; + } + + /** + * Set SelectLockedCells + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setSelectLockedCells($pValue = false) { + $this->_selectLockedCells = $pValue; + return $this; + } + + /** + * Get Sort + * + * @return boolean + */ + function getSort() { + return $this->_sort; + } + + /** + * Set Sort + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setSort($pValue = false) { + $this->_sort = $pValue; + return $this; + } + + /** + * Get AutoFilter + * + * @return boolean + */ + function getAutoFilter() { + return $this->_autoFilter; + } + + /** + * Set AutoFilter + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setAutoFilter($pValue = false) { + $this->_autoFilter = $pValue; + return $this; + } + + /** + * Get PivotTables + * + * @return boolean + */ + function getPivotTables() { + return $this->_pivotTables; + } + + /** + * Set PivotTables + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setPivotTables($pValue = false) { + $this->_pivotTables = $pValue; + return $this; + } + + /** + * Get SelectUnlockedCells + * + * @return boolean + */ + function getSelectUnlockedCells() { + return $this->_selectUnlockedCells; + } + + /** + * Set SelectUnlockedCells + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + function setSelectUnlockedCells($pValue = false) { + $this->_selectUnlockedCells = $pValue; + return $this; + } + + /** + * Get Password (hashed) + * + * @return string + */ + function getPassword() { + return $this->_password; + } + + /** + * Set Password + * + * @param string $pValue + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @return PHPExcel_Worksheet_Protection + */ + function setPassword($pValue = '', $pAlreadyHashed = false) { + if (!$pAlreadyHashed) { + $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); + } + $this->_password = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Row.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Row.php new file mode 100644 index 000000000..ba9d8530b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/Row.php @@ -0,0 +1,90 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_Row + * + * Represents a row in PHPExcel_Worksheet, used by PHPExcel_Worksheet_RowIterator + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_Row +{ + /** + * PHPExcel_Worksheet + * + * @var PHPExcel_Worksheet + */ + private $_parent; + + /** + * Row index + * + * @var int + */ + private $_rowIndex = 0; + + /** + * Create a new row + * + * @param PHPExcel_Worksheet $parent + * @param int $rowIndex + */ + public function __construct(PHPExcel_Worksheet $parent = null, $rowIndex = 1) { + // Set parent and row index + $this->_parent = $parent; + $this->_rowIndex = $rowIndex; + } + + /** + * Destructor + */ + public function __destruct() { + unset($this->_parent); + } + + /** + * Get row index + * + * @return int + */ + public function getRowIndex() { + return $this->_rowIndex; + } + + /** + * Get cell iterator + * + * @return PHPExcel_Worksheet_CellIterator + */ + public function getCellIterator() { + return new PHPExcel_Worksheet_CellIterator($this->_parent, $this->_rowIndex); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/RowDimension.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/RowDimension.php new file mode 100644 index 000000000..7bacabd23 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/RowDimension.php @@ -0,0 +1,265 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_RowDimension + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_RowDimension +{ + /** + * Row index + * + * @var int + */ + private $_rowIndex; + + /** + * Row height (in pt) + * + * When this is set to a negative value, the row height should be ignored by IWriter + * + * @var double + */ + private $_rowHeight = -1; + + /** + * ZeroHeight for Row? + * + * @var bool + */ + private $_zeroHeight = false; + + /** + * Visible? + * + * @var bool + */ + private $_visible = true; + + /** + * Outline level + * + * @var int + */ + private $_outlineLevel = 0; + + /** + * Collapsed + * + * @var bool + */ + private $_collapsed = false; + + /** + * Index to cellXf. Null value means row has no explicit cellXf format. + * + * @var int|null + */ + private $_xfIndex; + + /** + * Create a new PHPExcel_Worksheet_RowDimension + * + * @param int $pIndex Numeric row index + */ + public function __construct($pIndex = 0) + { + // Initialise values + $this->_rowIndex = $pIndex; + + // set row dimension as unformatted by default + $this->_xfIndex = null; + } + + /** + * Get Row Index + * + * @return int + */ + public function getRowIndex() { + return $this->_rowIndex; + } + + /** + * Set Row Index + * + * @param int $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setRowIndex($pValue) { + $this->_rowIndex = $pValue; + return $this; + } + + /** + * Get Row Height + * + * @return double + */ + public function getRowHeight() { + return $this->_rowHeight; + } + + /** + * Set Row Height + * + * @param double $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setRowHeight($pValue = -1) { + $this->_rowHeight = $pValue; + return $this; + } + + /** + * Get ZeroHeight + * + * @return bool + */ + public function getzeroHeight() { + return $this->_zeroHeight; + } + + /** + * Set ZeroHeight + * + * @param bool $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setzeroHeight($pValue = false) { + $this->_zeroHeight = $pValue; + return $this; + } + + /** + * Get Visible + * + * @return bool + */ + public function getVisible() { + return $this->_visible; + } + + /** + * Set Visible + * + * @param bool $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setVisible($pValue = true) { + $this->_visible = $pValue; + return $this; + } + + /** + * Get Outline Level + * + * @return int + */ + public function getOutlineLevel() { + return $this->_outlineLevel; + } + + /** + * Set Outline Level + * + * Value must be between 0 and 7 + * + * @param int $pValue + * @throws Exception + * @return PHPExcel_Worksheet_RowDimension + */ + public function setOutlineLevel($pValue) { + if ($pValue < 0 || $pValue > 7) { + throw new Exception("Outline level must range between 0 and 7."); + } + + $this->_outlineLevel = $pValue; + return $this; + } + + /** + * Get Collapsed + * + * @return bool + */ + public function getCollapsed() { + return $this->_collapsed; + } + + /** + * Set Collapsed + * + * @param bool $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setCollapsed($pValue = true) { + $this->_collapsed = $pValue; + return $this; + } + + /** + * Get index to cellXf + * + * @return int + */ + public function getXfIndex() + { + return $this->_xfIndex; + } + + /** + * Set index to cellXf + * + * @param int $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setXfIndex($pValue = 0) + { + $this->_xfIndex = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/RowIterator.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/RowIterator.php new file mode 100644 index 000000000..c8e832ed7 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/RowIterator.php @@ -0,0 +1,148 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_RowIterator + * + * Used to iterate rows in a PHPExcel_Worksheet + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_RowIterator implements Iterator +{ + /** + * PHPExcel_Worksheet to iterate + * + * @var PHPExcel_Worksheet + */ + private $_subject; + + /** + * Current iterator position + * + * @var int + */ + private $_position = 1; + + /** + * Start position + * + * @var int + */ + private $_startRow = 1; + + + /** + * Create a new row iterator + * + * @param PHPExcel_Worksheet $subject The worksheet to iterate over + * @param integer $startRow The row number at which to start iterating + */ + public function __construct(PHPExcel_Worksheet $subject = null, $startRow = 1) { + // Set subject + $this->_subject = $subject; + $this->resetStart($startRow); + } + + /** + * Destructor + */ + public function __destruct() { + unset($this->_subject); + } + + /** + * (Re)Set the start row and the current row pointer + * + * @param integer $startRow The row number at which to start iterating + */ + public function resetStart($startRow = 1) { + $this->_startRow = $startRow; + $this->seek($startRow); + } + + /** + * Set the row pointer to the selected row + * + * @param integer $row The row number to set the current pointer at + */ + public function seek($row = 1) { + $this->_position = $row; + } + + /** + * Rewind the iterator to the starting row + */ + public function rewind() { + $this->_position = $this->_startRow; + } + + /** + * Return the current row in this worksheet + * + * @return PHPExcel_Worksheet_Row + */ + public function current() { + return new PHPExcel_Worksheet_Row($this->_subject, $this->_position); + } + + /** + * Return the current iterator key + * + * @return int + */ + public function key() { + return $this->_position; + } + + /** + * Set the iterator to its next value + */ + public function next() { + ++$this->_position; + } + + /** + * Set the iterator to its previous value + */ + public function prev() { + if ($this->_position > 1) + --$this->_position; + } + + /** + * Indicate if more rows exist in the worksheet + * + * @return boolean + */ + public function valid() { + return $this->_position <= $this->_subject->getHighestRow(); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/SheetView.php b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/SheetView.php new file mode 100644 index 000000000..bdaf323b2 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Worksheet/SheetView.php @@ -0,0 +1,188 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Worksheet_SheetView + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_SheetView +{ + + /* Sheet View types */ + const SHEETVIEW_NORMAL = 'normal'; + const SHEETVIEW_PAGE_LAYOUT = 'pageLayout'; + const SHEETVIEW_PAGE_BREAK_PREVIEW = 'pageBreakPreview'; + + private static $_sheetViewTypes = array( + self::SHEETVIEW_NORMAL, + self::SHEETVIEW_PAGE_LAYOUT, + self::SHEETVIEW_PAGE_BREAK_PREVIEW, + ); + + /** + * ZoomScale + * + * Valid values range from 10 to 400. + * + * @var int + */ + private $_zoomScale = 100; + + /** + * ZoomScaleNormal + * + * Valid values range from 10 to 400. + * + * @var int + */ + private $_zoomScaleNormal = 100; + + /** + * View + * + * Valid values range from 10 to 400. + * + * @var string + */ + private $_sheetviewType = self::SHEETVIEW_NORMAL; + + /** + * Create a new PHPExcel_Worksheet_SheetView + */ + public function __construct() + { + } + + /** + * Get ZoomScale + * + * @return int + */ + public function getZoomScale() { + return $this->_zoomScale; + } + + /** + * Set ZoomScale + * + * Valid values range from 10 to 400. + * + * @param int $pValue + * @throws Exception + * @return PHPExcel_Worksheet_SheetView + */ + public function setZoomScale($pValue = 100) { + // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface, + // but it is apparently still able to handle any scale >= 1 + if (($pValue >= 1) || is_null($pValue)) { + $this->_zoomScale = $pValue; + } else { + throw new Exception("Scale must be greater than or equal to 1."); + } + return $this; + } + + /** + * Get ZoomScaleNormal + * + * @return int + */ + public function getZoomScaleNormal() { + return $this->_zoomScaleNormal; + } + + /** + * Set ZoomScale + * + * Valid values range from 10 to 400. + * + * @param int $pValue + * @throws Exception + * @return PHPExcel_Worksheet_SheetView + */ + public function setZoomScaleNormal($pValue = 100) { + if (($pValue >= 1) || is_null($pValue)) { + $this->_zoomScaleNormal = $pValue; + } else { + throw new Exception("Scale must be greater than or equal to 1."); + } + return $this; + } + + /** + * Get View + * + * @return string + */ + public function getView() { + return $this->_sheetviewType; + } + + /** + * Set View + * + * Valid values are + * 'normal' self::SHEETVIEW_NORMAL + * 'pageLayout' self::SHEETVIEW_PAGE_LAYOUT + * 'pageBreakPreview' self::SHEETVIEW_PAGE_BREAK_PREVIEW + * + * @param string $pValue + * @throws Exception + * @return PHPExcel_Worksheet_SheetView + */ + public function setView($pValue = NULL) { + // MS Excel 2007 allows setting the view to 'normal', 'pageLayout' or 'pageBreakPreview' + // via the user interface + if ($pValue === NULL) + $pValue = self::SHEETVIEW_NORMAL; + if (in_array($pValue, self::$_sheetViewTypes)) { + $this->_sheetviewType = $pValue; + } else { + throw new Exception("Invalid sheetview layout type."); + } + + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/WorksheetIterator.php b/fannie/src/PHPExcel/Classes/PHPExcel/WorksheetIterator.php new file mode 100644 index 000000000..9eff5382d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/WorksheetIterator.php @@ -0,0 +1,111 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_WorksheetIterator + * + * Used to iterate worksheets in PHPExcel + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_WorksheetIterator implements Iterator +{ + /** + * Spreadsheet to iterate + * + * @var PHPExcel + */ + private $_subject; + + /** + * Current iterator position + * + * @var int + */ + private $_position = 0; + + /** + * Create a new worksheet iterator + * + * @param PHPExcel $subject + */ + public function __construct(PHPExcel $subject = null) { + // Set subject + $this->_subject = $subject; + } + + /** + * Destructor + */ + public function __destruct() { + unset($this->_subject); + } + + /** + * Rewind iterator + */ + public function rewind() { + $this->_position = 0; + } + + /** + * Current PHPExcel_Worksheet + * + * @return PHPExcel_Worksheet + */ + public function current() { + return $this->_subject->getSheet($this->_position); + } + + /** + * Current key + * + * @return int + */ + public function key() { + return $this->_position; + } + + /** + * Next value + */ + public function next() { + ++$this->_position; + } + + /** + * More PHPExcel_Worksheet instances available? + * + * @return boolean + */ + public function valid() { + return $this->_position < $this->_subject->getSheetCount(); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/CSV.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/CSV.php new file mode 100644 index 000000000..11a399e3b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/CSV.php @@ -0,0 +1,339 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_CSV + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter { + /** + * PHPExcel object + * + * @var PHPExcel + */ + private $_phpExcel; + + /** + * Delimiter + * + * @var string + */ + private $_delimiter = ','; + + /** + * Enclosure + * + * @var string + */ + private $_enclosure = '"'; + + /** + * Line ending + * + * @var string + */ + private $_lineEnding = PHP_EOL; + + /** + * Sheet index to write + * + * @var int + */ + private $_sheetIndex = 0; + + /** + * Pre-calculate formulas + * + * @var boolean + */ + private $_preCalculateFormulas = true; + + /** + * Whether to write a BOM (for UTF8). + * + * @var boolean + */ + private $_useBOM = false; + + /** + * Whether to write a fully Excel compatible CSV file. + * + * @var boolean + */ + private $_excelCompatibility = false; + + /** + * Create a new PHPExcel_Writer_CSV + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + $this->_phpExcel = $phpExcel; + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws Exception + */ + public function save($pFilename = null) { + // Fetch sheet + $sheet = $this->_phpExcel->getSheet($this->_sheetIndex); + + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'wb+'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for writing."); + } + + if ($this->_excelCompatibility) { + // Write the UTF-16LE BOM code + fwrite($fileHandle, "\xFF\xFE"); // Excel uses UTF-16LE encoding + $this->setEnclosure(); // Default enclosure is " + $this->setDelimiter("\t"); // Excel delimiter is a TAB + } elseif ($this->_useBOM) { + // Write the UTF-8 BOM code + fwrite($fileHandle, "\xEF\xBB\xBF"); + } + + // Identify the range that we need to extract from the worksheet + $maxCol = $sheet->getHighestColumn(); + $maxRow = $sheet->getHighestRow(); + + // Write rows to file + for($row = 1; $row <= $maxRow; ++$row) { + // Convert the row to an array... + $cellsArray = $sheet->rangeToArray('A'.$row.':'.$maxCol.$row,'', $this->_preCalculateFormulas); + // ... and write to the file + $this->_writeLine($fileHandle, $cellsArray[0]); + } + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; + } + + /** + * Get delimiter + * + * @return string + */ + public function getDelimiter() { + return $this->_delimiter; + } + + /** + * Set delimiter + * + * @param string $pValue Delimiter, defaults to , + * @return PHPExcel_Writer_CSV + */ + public function setDelimiter($pValue = ',') { + $this->_delimiter = $pValue; + return $this; + } + + /** + * Get enclosure + * + * @return string + */ + public function getEnclosure() { + return $this->_enclosure; + } + + /** + * Set enclosure + * + * @param string $pValue Enclosure, defaults to " + * @return PHPExcel_Writer_CSV + */ + public function setEnclosure($pValue = '"') { + if ($pValue == '') { + $pValue = null; + } + $this->_enclosure = $pValue; + return $this; + } + + /** + * Get line ending + * + * @return string + */ + public function getLineEnding() { + return $this->_lineEnding; + } + + /** + * Set line ending + * + * @param string $pValue Line ending, defaults to OS line ending (PHP_EOL) + * @return PHPExcel_Writer_CSV + */ + public function setLineEnding($pValue = PHP_EOL) { + $this->_lineEnding = $pValue; + return $this; + } + + /** + * Get whether BOM should be used + * + * @return boolean + */ + public function getUseBOM() { + return $this->_useBOM; + } + + /** + * Set whether BOM should be used + * + * @param boolean $pValue Use UTF-8 byte-order mark? Defaults to false + * @return PHPExcel_Writer_CSV + */ + public function setUseBOM($pValue = false) { + $this->_useBOM = $pValue; + return $this; + } + + /** + * Get whether the file should be saved with full Excel Compatibility + * + * @return boolean + */ + public function getExcelCompatibility() { + return $this->_excelCompatibility; + } + + /** + * Set whether the file should be saved with full Excel Compatibility + * + * @param boolean $pValue Set the file to be written as a fully Excel compatible csv file + * Note that this overrides other settings such as useBOM, enclosure and delimiter + * @return PHPExcel_Writer_CSV + */ + public function setExcelCompatibility($pValue = false) { + $this->_excelCompatibility = $pValue; + return $this; + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() { + return $this->_sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Writer_CSV + */ + public function setSheetIndex($pValue = 0) { + $this->_sheetIndex = $pValue; + return $this; + } + + /** + * Write line to CSV file + * + * @param mixed $pFileHandle PHP filehandle + * @param array $pValues Array containing values in a row + * @throws Exception + */ + private function _writeLine($pFileHandle = null, $pValues = null) { + if (is_array($pValues)) { + // No leading delimiter + $writeDelimiter = false; + + // Build the line + $line = ''; + + foreach ($pValues as $element) { + // Escape enclosures + $element = str_replace($this->_enclosure, $this->_enclosure . $this->_enclosure, $element); + + // Add delimiter + if ($writeDelimiter) { + $line .= $this->_delimiter; + } else { + $writeDelimiter = true; + } + + // Add enclosed string + $line .= $this->_enclosure . $element . $this->_enclosure; + } + + // Add line ending + $line .= $this->_lineEnding; + + // Write to file + if ($this->_excelCompatibility) { + fwrite($pFileHandle, mb_convert_encoding($line,"UTF-16LE","UTF-8")); + } else { + fwrite($pFileHandle, $line); + } + } else { + throw new Exception("Invalid data row passed to CSV writer."); + } + } + + /** + * Get Pre-Calculate Formulas + * + * @return boolean + */ + public function getPreCalculateFormulas() { + return $this->_preCalculateFormulas; + } + + /** + * Set Pre-Calculate Formulas + * + * @param boolean $pValue Pre-Calculate Formulas? + * @return PHPExcel_Writer_CSV + */ + public function setPreCalculateFormulas($pValue = true) { + $this->_preCalculateFormulas = $pValue; + return $this; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php new file mode 100644 index 000000000..6a1b9887d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php @@ -0,0 +1,583 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007 + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter +{ + /** + * Write charts that are defined in the workbook? + * Identifies whether the Writer should write definitions for any charts that exist in the PHPExcel object; + * + * @var boolean + */ + private $_includeCharts = false; + + /** + * Pre-calculate formulas + * + * @var boolean + */ + private $_preCalculateFormulas = true; + + /** + * Office2003 compatibility + * + * @var boolean + */ + private $_office2003compatibility = false; + + /** + * Private writer parts + * + * @var PHPExcel_Writer_Excel2007_WriterPart[] + */ + private $_writerParts = array(); + + /** + * Private PHPExcel + * + * @var PHPExcel + */ + private $_spreadSheet; + + /** + * Private string table + * + * @var string[] + */ + private $_stringTable = array(); + + /** + * Private unique PHPExcel_Style_Conditional HashTable + * + * @var PHPExcel_HashTable + */ + private $_stylesConditionalHashTable; + + /** + * Private unique PHPExcel_Style_Fill HashTable + * + * @var PHPExcel_HashTable + */ + private $_fillHashTable; + + /** + * Private unique PHPExcel_Style_Font HashTable + * + * @var PHPExcel_HashTable + */ + private $_fontHashTable; + + /** + * Private unique PHPExcel_Style_Borders HashTable + * + * @var PHPExcel_HashTable + */ + private $_bordersHashTable ; + + /** + * Private unique PHPExcel_Style_NumberFormat HashTable + * + * @var PHPExcel_HashTable + */ + private $_numFmtHashTable; + + /** + * Private unique PHPExcel_Worksheet_BaseDrawing HashTable + * + * @var PHPExcel_HashTable + */ + private $_drawingHashTable; + + /** + * Use disk caching where possible? + * + * @var boolean + */ + private $_useDiskCaching = false; + + /** + * Disk caching directory + * + * @var string + */ + private $_diskCachingDirectory = './'; + + /** + * Create a new PHPExcel_Writer_Excel2007 + * + * @param PHPExcel $pPHPExcel + */ + public function __construct(PHPExcel $pPHPExcel = null) + { + // Assign PHPExcel + $this->setPHPExcel($pPHPExcel); + + $writerPartsArray = array( 'stringtable' => 'PHPExcel_Writer_Excel2007_StringTable', + 'contenttypes' => 'PHPExcel_Writer_Excel2007_ContentTypes', + 'docprops' => 'PHPExcel_Writer_Excel2007_DocProps', + 'rels' => 'PHPExcel_Writer_Excel2007_Rels', + 'theme' => 'PHPExcel_Writer_Excel2007_Theme', + 'style' => 'PHPExcel_Writer_Excel2007_Style', + 'workbook' => 'PHPExcel_Writer_Excel2007_Workbook', + 'worksheet' => 'PHPExcel_Writer_Excel2007_Worksheet', + 'drawing' => 'PHPExcel_Writer_Excel2007_Drawing', + 'comments' => 'PHPExcel_Writer_Excel2007_Comments', + 'chart' => 'PHPExcel_Writer_Excel2007_Chart', + ); + + // Initialise writer parts + // and Assign their parent IWriters + foreach ($writerPartsArray as $writer => $class) { + $this->_writerParts[$writer] = new $class($this); + } + + $hashTablesArray = array( '_stylesConditionalHashTable', '_fillHashTable', '_fontHashTable', + '_bordersHashTable', '_numFmtHashTable', '_drawingHashTable' + ); + + // Set HashTable variables + foreach ($hashTablesArray as $tableName) { + $this->$tableName = new PHPExcel_HashTable(); + } + } + + /** + * Get writer part + * + * @param string $pPartName Writer part name + * @return PHPExcel_Writer_Excel2007_WriterPart + */ + public function getWriterPart($pPartName = '') { + if ($pPartName != '' && isset($this->_writerParts[strtolower($pPartName)])) { + return $this->_writerParts[strtolower($pPartName)]; + } else { + return null; + } + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws Exception + */ + public function save($pFilename = null) + { + if ($this->_spreadSheet !== NULL) { + // garbage collect + $this->_spreadSheet->garbageCollect(); + + // If $pFilename is php://output or php://stdout, make it a temporary file... + $originalFilename = $pFilename; + if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { + $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); + if ($pFilename == '') { + $pFilename = $originalFilename; + } + } + + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; + $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); + + // Create string lookup table + $this->_stringTable = array(); + for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { + $this->_stringTable = $this->getWriterPart('StringTable')->createStringTable($this->_spreadSheet->getSheet($i), $this->_stringTable); + } + + // Create styles dictionaries + $this->_stylesConditionalHashTable->addFromSource( $this->getWriterPart('Style')->allConditionalStyles($this->_spreadSheet) ); + $this->_fillHashTable->addFromSource( $this->getWriterPart('Style')->allFills($this->_spreadSheet) ); + $this->_fontHashTable->addFromSource( $this->getWriterPart('Style')->allFonts($this->_spreadSheet) ); + $this->_bordersHashTable->addFromSource( $this->getWriterPart('Style')->allBorders($this->_spreadSheet) ); + $this->_numFmtHashTable->addFromSource( $this->getWriterPart('Style')->allNumberFormats($this->_spreadSheet) ); + + // Create drawing dictionary + $this->_drawingHashTable->addFromSource( $this->getWriterPart('Drawing')->allDrawings($this->_spreadSheet) ); + + // Create new ZIP file and open it for writing + $zipClass = PHPExcel_Settings::getZipClass(); + $objZip = new $zipClass(); + + // Retrieve OVERWRITE and CREATE constants from the instantiated zip class + // This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP + $ro = new ReflectionObject($objZip); + $zipOverWrite = $ro->getConstant('OVERWRITE'); + $zipCreate = $ro->getConstant('CREATE'); + + if (file_exists($pFilename)) { + unlink($pFilename); + } + // Try opening the ZIP file + if ($objZip->open($pFilename, $zipOverWrite) !== true) { + if ($objZip->open($pFilename, $zipCreate) !== true) { + throw new Exception("Could not open " . $pFilename . " for writing."); + } + } + + // Add [Content_Types].xml to ZIP file + $objZip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->_spreadSheet, $this->_includeCharts)); + + // Add relationships to ZIP file + $objZip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->_spreadSheet)); + $objZip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->_spreadSheet)); + + // Add document properties to ZIP file + $objZip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->_spreadSheet)); + $objZip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->_spreadSheet)); + $customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->_spreadSheet); + if ($customPropertiesPart !== NULL) { + $objZip->addFromString('docProps/custom.xml', $customPropertiesPart); + } + + // Add theme to ZIP file + $objZip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->_spreadSheet)); + + // Add string table to ZIP file + $objZip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->_stringTable)); + + // Add styles to ZIP file + $objZip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->_spreadSheet)); + + // Add workbook to ZIP file + $objZip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->_spreadSheet, $this->_preCalculateFormulas)); + + $chartCount = 0; + // Add worksheets + for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { + $objZip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->_spreadSheet->getSheet($i), $this->_stringTable, $this->_includeCharts)); + if ($this->_includeCharts) { + $charts = $this->_spreadSheet->getSheet($i)->getChartCollection(); + if (count($charts) > 0) { + foreach($charts as $chart) { + $objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart)); + $chartCount++; + } + } + } + } + + $chartRef1 = $chartRef2 = 0; + // Add worksheet relationships (drawings, ...) + for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { + + // Add relationships + $objZip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->_spreadSheet->getSheet($i), ($i + 1), $this->_includeCharts)); + + $drawings = $this->_spreadSheet->getSheet($i)->getDrawingCollection(); + $drawingCount = count($drawings); + if ($this->_includeCharts) { + $chartCount = $this->_spreadSheet->getSheet($i)->getChartCount(); + } + + // Add drawing and image relationship parts + if (($drawingCount > 0) || ($chartCount > 0)) { + // Drawing relationships + $objZip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->_spreadSheet->getSheet($i),$chartRef1, $this->_includeCharts)); + + // Drawings + $objZip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->_spreadSheet->getSheet($i),$chartRef2,$this->_includeCharts)); + } + + // Add comment relationship parts + if (count($this->_spreadSheet->getSheet($i)->getComments()) > 0) { + // VML Comments + $objZip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->_spreadSheet->getSheet($i))); + + // Comments + $objZip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->_spreadSheet->getSheet($i))); + } + + // Add header/footer relationship parts + if (count($this->_spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) { + // VML Drawings + $objZip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->_spreadSheet->getSheet($i))); + + // VML Drawing relationships + $objZip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->_spreadSheet->getSheet($i))); + + // Media + foreach ($this->_spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) { + $objZip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath())); + } + } + } + + // Add media + for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) { + if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { + $imageContents = null; + $imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath(); + + if (strpos($imagePath, 'zip://') !== false) { + $imagePath = substr($imagePath, 6); + $imagePathSplitted = explode('#', $imagePath); + + $imageZip = new ZipArchive(); + $imageZip->open($imagePathSplitted[0]); + $imageContents = $imageZip->getFromName($imagePathSplitted[1]); + $imageZip->close(); + unset($imageZip); + } else { + $imageContents = file_get_contents($imagePath); + } + + $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); + } else if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { + ob_start(); + call_user_func( + $this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(), + $this->getDrawingHashTable()->getByIndex($i)->getImageResource() + ); + $imageContents = ob_get_contents(); + ob_end_clean(); + + $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); + } + } + + PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; + + // Close file + if ($objZip->close() === false) { + throw new Exception("Could not close zip file $pFilename."); + } + + // If a temporary file was used, copy it to the correct file stream + if ($originalFilename != $pFilename) { + if (copy($pFilename, $originalFilename) === false) { + throw new Exception("Could not copy temporary zip file $pFilename to $originalFilename."); + } + @unlink($pFilename); + } + } else { + throw new Exception("PHPExcel object unassigned."); + } + } + + /** + * Get PHPExcel object + * + * @return PHPExcel + * @throws Exception + */ + public function getPHPExcel() { + if ($this->_spreadSheet !== null) { + return $this->_spreadSheet; + } else { + throw new Exception("No PHPExcel assigned."); + } + } + + /** + * Set PHPExcel object + * + * @param PHPExcel $pPHPExcel PHPExcel object + * @throws Exception + * @return PHPExcel_Writer_Excel2007 + */ + public function setPHPExcel(PHPExcel $pPHPExcel = null) { + $this->_spreadSheet = $pPHPExcel; + return $this; + } + + /** + * Get string table + * + * @return string[] + */ + public function getStringTable() { + return $this->_stringTable; + } + + /** + * Get PHPExcel_Style_Conditional HashTable + * + * @return PHPExcel_HashTable + */ + public function getStylesConditionalHashTable() { + return $this->_stylesConditionalHashTable; + } + + /** + * Get PHPExcel_Style_Fill HashTable + * + * @return PHPExcel_HashTable + */ + public function getFillHashTable() { + return $this->_fillHashTable; + } + + /** + * Get PHPExcel_Style_Font HashTable + * + * @return PHPExcel_HashTable + */ + public function getFontHashTable() { + return $this->_fontHashTable; + } + + /** + * Get PHPExcel_Style_Borders HashTable + * + * @return PHPExcel_HashTable + */ + public function getBordersHashTable() { + return $this->_bordersHashTable; + } + + /** + * Get PHPExcel_Style_NumberFormat HashTable + * + * @return PHPExcel_HashTable + */ + public function getNumFmtHashTable() { + return $this->_numFmtHashTable; + } + + /** + * Get PHPExcel_Worksheet_BaseDrawing HashTable + * + * @return PHPExcel_HashTable + */ + public function getDrawingHashTable() { + return $this->_drawingHashTable; + } + + /** + * Write charts in workbook? + * If this is true, then the Writer will write definitions for any charts that exist in the PHPExcel object. + * If false (the default) it will ignore any charts defined in the PHPExcel object. + * + * @return boolean + */ + public function getIncludeCharts() { + return $this->_includeCharts; + } + + /** + * Set write charts in workbook + * Set to true, to advise the Writer to include any charts that exist in the PHPExcel object. + * Set to false (the default) to ignore charts. + * + * @param boolean $pValue + * + * @return PHPExcel_Writer_Excel2007 + */ + public function setIncludeCharts($pValue = false) { + $this->_includeCharts = (boolean) $pValue; + return $this; + } + + /** + * Get Pre-Calculate Formulas + * + * @return boolean + */ + public function getPreCalculateFormulas() { + return $this->_preCalculateFormulas; + } + + /** + * Set Pre-Calculate Formulas + * + * @param boolean $pValue Pre-Calculate Formulas? + */ + public function setPreCalculateFormulas($pValue = true) { + $this->_preCalculateFormulas = $pValue; + } + + /** + * Get Office2003 compatibility + * + * @return boolean + */ + public function getOffice2003Compatibility() { + return $this->_office2003compatibility; + } + + /** + * Set Pre-Calculate Formulas + * + * @param boolean $pValue Office2003 compatibility? + * @return PHPExcel_Writer_Excel2007 + */ + public function setOffice2003Compatibility($pValue = false) { + $this->_office2003compatibility = $pValue; + return $this; + } + + /** + * Get use disk caching where possible? + * + * @return boolean + */ + public function getUseDiskCaching() { + return $this->_useDiskCaching; + } + + /** + * Set use disk caching where possible? + * + * @param boolean $pValue + * @param string $pDirectory Disk caching directory + * @throws Exception Exception when directory does not exist + * @return PHPExcel_Writer_Excel2007 + */ + public function setUseDiskCaching($pValue = false, $pDirectory = null) { + $this->_useDiskCaching = $pValue; + + if ($pDirectory !== NULL) { + if (is_dir($pDirectory)) { + $this->_diskCachingDirectory = $pDirectory; + } else { + throw new Exception("Directory does not exist: $pDirectory"); + } + } + return $this; + } + + /** + * Get disk caching directory + * + * @return string + */ + public function getDiskCachingDirectory() { + return $this->_diskCachingDirectory; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Chart.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Chart.php new file mode 100644 index 000000000..d181d517b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Chart.php @@ -0,0 +1,1181 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Chart + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write charts to XML format + * + * @param PHPExcel_Chart $pChart + * @return string XML Output + * @throws Exception + */ + public function writeChart(PHPExcel_Chart $pChart = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + // Ensure that data series values are up-to-date before we save + $pChart->refresh(); + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // c:chartSpace + $objWriter->startElement('c:chartSpace'); + $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); + $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + $objWriter->startElement('c:date1904'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + $objWriter->startElement('c:lang'); + $objWriter->writeAttribute('val', "en-GB"); + $objWriter->endElement(); + $objWriter->startElement('c:roundedCorners'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $this->_writeAlternateContent($objWriter); + + $objWriter->startElement('c:chart'); + + $this->_writeTitle($pChart->getTitle(), $objWriter); + + $objWriter->startElement('c:autoTitleDeleted'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $this->_writePlotArea($pChart->getPlotArea(), + $pChart->getXAxisLabel(), + $pChart->getYAxisLabel(), + $objWriter, + $pChart->getWorksheet() + ); + + $this->_writeLegend($pChart->getLegend(), $objWriter); + + + $objWriter->startElement('c:plotVisOnly'); + $objWriter->writeAttribute('val', 1); + $objWriter->endElement(); + + $objWriter->startElement('c:dispBlanksAs'); + $objWriter->writeAttribute('val', "gap"); + $objWriter->endElement(); + + $objWriter->startElement('c:showDLblsOverMax'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + + $this->_writePrintSettings($objWriter); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write Chart Title + * + * @param PHPExcel_Chart_Title $title + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeTitle(PHPExcel_Chart_Title $title = null, $objWriter) + { + if (is_null($title)) { + return; + } + + $objWriter->startElement('c:title'); + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:rich'); + + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + + $caption = $title->getCaption(); + if ((is_array($caption)) && (count($caption) > 0)) + $caption = $caption[0]; + $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a'); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $layout = $title->getLayout(); + $this->_writeLayout($layout, $objWriter); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Chart Legend + * + * @param PHPExcel_Chart_Legend $legend + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter) + { + if (is_null($legend)) { + return; + } + + $objWriter->startElement('c:legend'); + + $objWriter->startElement('c:legendPos'); + $objWriter->writeAttribute('val', $legend->getPosition()); + $objWriter->endElement(); + + $layout = $legend->getLayout(); + $this->_writeLayout($layout, $objWriter); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0'); + $objWriter->endElement(); + + $objWriter->startElement('c:txPr'); + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + $objWriter->startElement('a:pPr'); + $objWriter->writeAttribute('rtl', 0); + + $objWriter->startElement('a:defRPr'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('a:endParaRPr'); + $objWriter->writeAttribute('lang', "en-US"); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Chart Plot Area + * + * @param PHPExcel_Chart_PlotArea $plotArea + * @param PHPExcel_Chart_Title $xAxisLabel + * @param PHPExcel_Chart_Title $yAxisLabel + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writePlotArea(PHPExcel_Chart_PlotArea $plotArea, + PHPExcel_Chart_Title $xAxisLabel = NULL, + PHPExcel_Chart_Title $yAxisLabel = NULL, + $objWriter, + PHPExcel_Worksheet $pSheet) + { + if (is_null($plotArea)) { + return; + } + + $id1 = $id2 = 0; + $objWriter->startElement('c:plotArea'); + + $layout = $plotArea->getLayout(); + + $this->_writeLayout($layout, $objWriter); + + $chartTypes = self::_getChartType($plotArea); + $catIsMultiLevelSeries = $valIsMultiLevelSeries = FALSE; + $plotGroupingType = ''; + foreach($chartTypes as $chartType) { + $objWriter->startElement('c:'.$chartType); + + $groupCount = $plotArea->getPlotGroupCount(); + for($i = 0; $i < $groupCount; ++$i) { + $plotGroup = $plotArea->getPlotGroupByIndex($i); + $groupType = $plotGroup->getPlotType(); + if ($groupType == $chartType) { + + $plotStyle = $plotGroup->getPlotStyle(); + if ($groupType === PHPExcel_Chart_DataSeries::TYPE_RADARCHART) { + $objWriter->startElement('c:radarStyle'); + $objWriter->writeAttribute('val', $plotStyle ); + $objWriter->endElement(); + } elseif ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART) { + $objWriter->startElement('c:scatterStyle'); + $objWriter->writeAttribute('val', $plotStyle ); + $objWriter->endElement(); + } + + $this->_writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType, $pSheet); + } + } + + $this->_writeDataLbls($objWriter, $layout); + + if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) { + // Line only, Line3D can't be smoothed + + $objWriter->startElement('c:smooth'); + $objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine() ); + $objWriter->endElement(); + } elseif (($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || + ($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) { + + $objWriter->startElement('c:gapWidth'); + $objWriter->writeAttribute('val', 150 ); + $objWriter->endElement(); + + if ($plotGroupingType == 'percentStacked' || + $plotGroupingType == 'stacked') { + + $objWriter->startElement('c:overlap'); + $objWriter->writeAttribute('val', 100 ); + $objWriter->endElement(); + } + } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + + $objWriter->startElement('c:bubbleScale'); + $objWriter->writeAttribute('val', 25 ); + $objWriter->endElement(); + + $objWriter->startElement('c:showNegBubbles'); + $objWriter->writeAttribute('val', 0 ); + $objWriter->endElement(); + } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) { + + $objWriter->startElement('c:hiLowLines'); + $objWriter->endElement(); + } + + // Generate 2 unique numbers to use for axId values +// $id1 = $id2 = rand(10000000,99999999); +// do { +// $id2 = rand(10000000,99999999); +// } while ($id1 == $id2); + $id1 = '75091328'; + $id2 = '75089408'; + + if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && + ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && + ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id1 ); + $objWriter->endElement(); + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id2 ); + $objWriter->endElement(); + } else { + $objWriter->startElement('c:firstSliceAng'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) { + + $objWriter->startElement('c:holeSize'); + $objWriter->writeAttribute('val', 50); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && + ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && + ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + + if ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $this->_writeValAx($objWriter,$plotArea,$xAxisLabel,$chartType,$id1,$id2,$catIsMultiLevelSeries); + } else { + $this->_writeCatAx($objWriter,$plotArea,$xAxisLabel,$chartType,$id1,$id2,$catIsMultiLevelSeries); + } + + $this->_writeValAx($objWriter,$plotArea,$yAxisLabel,$chartType,$id1,$id2,$valIsMultiLevelSeries); + } + + $objWriter->endElement(); + } + + /** + * Write Data Labels + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart_Layout $chartLayout Chart layout + * @throws Exception + */ + private function _writeDataLbls($objWriter, $chartLayout) + { + $objWriter->startElement('c:dLbls'); + + $objWriter->startElement('c:showLegendKey'); + $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey(); + $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1) ); + $objWriter->endElement(); + + + $objWriter->startElement('c:showVal'); + $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal(); + $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1) ); + $objWriter->endElement(); + + $objWriter->startElement('c:showCatName'); + $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName(); + $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1) ); + $objWriter->endElement(); + + $objWriter->startElement('c:showSerName'); + $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName(); + $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1) ); + $objWriter->endElement(); + + $objWriter->startElement('c:showPercent'); + $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent(); + $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1) ); + $objWriter->endElement(); + + $objWriter->startElement('c:showBubbleSize'); + $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize(); + $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1) ); + $objWriter->endElement(); + + $objWriter->startElement('c:showLeaderLines'); + $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines(); + $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1) ); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Category Axis + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart_PlotArea $plotArea + * @param PHPExcel_Chart_Title $xAxisLabel + * @param string $groupType Chart type + * @param string $id1 + * @param string $id2 + * @param boolean $isMultiLevelSeries + * @throws Exception + */ + private function _writeCatAx($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries) + { + $objWriter->startElement('c:catAx'); + + if ($id1 > 0) { + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id1); + $objWriter->endElement(); + } + + $objWriter->startElement('c:scaling'); + $objWriter->startElement('c:orientation'); + $objWriter->writeAttribute('val', "minMax"); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:delete'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->startElement('c:axPos'); + $objWriter->writeAttribute('val', "b"); + $objWriter->endElement(); + + if (!is_null($xAxisLabel)) { + $objWriter->startElement('c:title'); + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:rich'); + + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + $objWriter->startElement('a:r'); + + $caption = $xAxisLabel->getCaption(); + if (is_array($caption)) + $caption = $caption[0]; + $objWriter->startElement('a:t'); +// $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $caption )); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $layout = $xAxisLabel->getLayout(); + $this->_writeLayout($layout, $objWriter); + + $objWriter->endElement(); + + } + + $objWriter->startElement('c:numFmt'); + $objWriter->writeAttribute('formatCode', "General"); + $objWriter->writeAttribute('sourceLinked', 1); + $objWriter->endElement(); + + $objWriter->startElement('c:majorTickMark'); + $objWriter->writeAttribute('val', "out"); + $objWriter->endElement(); + + $objWriter->startElement('c:minorTickMark'); + $objWriter->writeAttribute('val', "none"); + $objWriter->endElement(); + + $objWriter->startElement('c:tickLblPos'); + $objWriter->writeAttribute('val', "nextTo"); + $objWriter->endElement(); + + if ($id2 > 0) { + $objWriter->startElement('c:crossAx'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + + $objWriter->startElement('c:crosses'); + $objWriter->writeAttribute('val', "autoZero"); + $objWriter->endElement(); + } + + $objWriter->startElement('c:auto'); + $objWriter->writeAttribute('val', 1); + $objWriter->endElement(); + + $objWriter->startElement('c:lblAlgn'); + $objWriter->writeAttribute('val', "ctr"); + $objWriter->endElement(); + + $objWriter->startElement('c:lblOffset'); + $objWriter->writeAttribute('val', 100); + $objWriter->endElement(); + + if ($isMultiLevelSeries) { + $objWriter->startElement('c:noMultiLvlLbl'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + $objWriter->endElement(); + + } + + + /** + * Write Value Axis + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart_PlotArea $plotArea + * @param PHPExcel_Chart_Title $yAxisLabel + * @param string $groupType Chart type + * @param string $id1 + * @param string $id2 + * @param boolean $isMultiLevelSeries + * @throws Exception + */ + private function _writeValAx($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries) + { + $objWriter->startElement('c:valAx'); + + if ($id2 > 0) { + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + } + + $objWriter->startElement('c:scaling'); + $objWriter->startElement('c:orientation'); + $objWriter->writeAttribute('val', "minMax"); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:delete'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->startElement('c:axPos'); + $objWriter->writeAttribute('val', "l"); + $objWriter->endElement(); + + $objWriter->startElement('c:majorGridlines'); + $objWriter->endElement(); + + if (!is_null($yAxisLabel)) { + $objWriter->startElement('c:title'); + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:rich'); + + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + $objWriter->startElement('a:r'); + + $caption = $yAxisLabel->getCaption(); + if (is_array($caption)) + $caption = $caption[0]; + $objWriter->startElement('a:t'); +// $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $caption )); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $layout = $yAxisLabel->getLayout(); + $this->_writeLayout($layout, $objWriter); + } + + $objWriter->endElement(); + } + + $objWriter->startElement('c:numFmt'); + $objWriter->writeAttribute('formatCode', "General"); + $objWriter->writeAttribute('sourceLinked', 1); + $objWriter->endElement(); + + $objWriter->startElement('c:majorTickMark'); + $objWriter->writeAttribute('val', "out"); + $objWriter->endElement(); + + $objWriter->startElement('c:minorTickMark'); + $objWriter->writeAttribute('val', "none"); + $objWriter->endElement(); + + $objWriter->startElement('c:tickLblPos'); + $objWriter->writeAttribute('val', "nextTo"); + $objWriter->endElement(); + + if ($id1 > 0) { + $objWriter->startElement('c:crossAx'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + + $objWriter->startElement('c:crosses'); + $objWriter->writeAttribute('val', "autoZero"); + $objWriter->endElement(); + + $objWriter->startElement('c:crossBetween'); + $objWriter->writeAttribute('val', "midCat"); + $objWriter->endElement(); + } + + if ($isMultiLevelSeries) { + if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $objWriter->startElement('c:noMultiLvlLbl'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + } + $objWriter->endElement(); + + } + + + /** + * Get the data series type(s) for a chart plot series + * + * @param PHPExcel_Chart_PlotArea $plotArea + * @return string|array + * @throws Exception + */ + private static function _getChartType($plotArea) + { + $groupCount = $plotArea->getPlotGroupCount(); + + if ($groupCount == 1) { + $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType()); + } else { + $chartTypes = array(); + for($i = 0; $i < $groupCount; ++$i) { + $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType(); + } + $chartType = array_unique($chartTypes); + if (count($chartTypes) == 0) { + throw new Exception('Chart is not yet implemented'); + } + } + + return $chartType; + } + + /** + * Write Plot Group (series of related plots) + * + * @param PHPExcel_Chart_DataSeries $plotGroup + * @param string $groupType Type of plot for dataseries + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param boolean &$catIsMultiLevelSeries Is category a multi-series category + * @param boolean &$valIsMultiLevelSeries Is value set a multi-series set + * @param string &$plotGroupingType Type of grouping for multi-series values + * @param PHPExcel_Worksheet $pSheet + * @throws Exception + */ + private function _writePlotGroup( $plotGroup, + $groupType, + $objWriter, + &$catIsMultiLevelSeries, + &$valIsMultiLevelSeries, + &$plotGroupingType, + PHPExcel_Worksheet $pSheet + ) + { + if (is_null($plotGroup)) { + return; + } + + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) { + $objWriter->startElement('c:barDir'); + $objWriter->writeAttribute('val', $plotGroup->getPlotDirection()); + $objWriter->endElement(); + } + + if (!is_null($plotGroup->getPlotGrouping())) { + $plotGroupingType = $plotGroup->getPlotGrouping(); + $objWriter->startElement('c:grouping'); + $objWriter->writeAttribute('val', $plotGroupingType); + $objWriter->endElement(); + } + + // Get these details before the loop, because we can use the count to check for varyColors + $plotSeriesOrder = $plotGroup->getPlotOrder(); + $plotSeriesCount = count($plotSeriesOrder); + + if (($groupType !== PHPExcel_Chart_DataSeries::TYPE_RADARCHART) && + ($groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) { + + if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART) { + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) || + ($plotSeriesCount > 1)) { + $objWriter->startElement('c:varyColors'); + $objWriter->writeAttribute('val', 1); + $objWriter->endElement(); + } else { + $objWriter->startElement('c:varyColors'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + } + } + + foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) { + $objWriter->startElement('c:ser'); + + $objWriter->startElement('c:idx'); + $objWriter->writeAttribute('val', $plotSeriesIdx); + $objWriter->endElement(); + + $objWriter->startElement('c:order'); + $objWriter->writeAttribute('val', $plotSeriesRef); + $objWriter->endElement(); + + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + + $objWriter->startElement('c:dPt'); + $objWriter->startElement('c:idx'); + $objWriter->writeAttribute('val', 3); + $objWriter->endElement(); + + $objWriter->startElement('c:bubble3D'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->startElement('c:spPr'); + $objWriter->startElement('a:solidFill'); + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', 'FF9900'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } + + // Labels + $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef); + if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) { + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:strRef'); + $this->_writePlotSeriesLabel($plotSeriesLabel, $objWriter); + $objWriter->endElement(); + $objWriter->endElement(); + } + + // Formatting for the points + if ($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) { + $objWriter->startElement('c:spPr'); + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', 12700); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); + if ($plotSeriesValues) { + $plotSeriesMarker = $plotSeriesValues->getPointMarker(); + if ($plotSeriesMarker) { + $objWriter->startElement('c:marker'); + $objWriter->startElement('c:symbol'); + $objWriter->writeAttribute('val', $plotSeriesMarker); + $objWriter->endElement(); + + if ($plotSeriesMarker !== 'none') { + $objWriter->startElement('c:size'); + $objWriter->writeAttribute('val', 3); + $objWriter->endElement(); + } + $objWriter->endElement(); + } + } + + if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || + ($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D) || + ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART)) { + + $objWriter->startElement('c:invertIfNegative'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + + // Category Labels + $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef); + if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) { + $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries(); + + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || + ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + + if (!is_null($plotGroup->getPlotStyle())) { + $plotStyle = $plotGroup->getPlotStyle(); + if ($plotStyle) { + $objWriter->startElement('c:explosion'); + $objWriter->writeAttribute('val', 25); + $objWriter->endElement(); + } + } + } + + if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || + ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) { + $objWriter->startElement('c:xVal'); + } else { + $objWriter->startElement('c:cat'); + } + + $this->_writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str', $pSheet); + $objWriter->endElement(); + } + + // Values + if ($plotSeriesValues) { + $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries(); + + if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || + ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) { + $objWriter->startElement('c:yVal'); + } else { + $objWriter->startElement('c:val'); + } + + $this->_writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num', $pSheet); + $objWriter->endElement(); + } + + if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $this->_writeBubbles($plotSeriesValues, $objWriter, $pSheet); + } + + $objWriter->endElement(); + + } + } + + /** + * Write Plot Series Label + * + * @param PHPExcel_Chart_DataSeriesValues $plotSeriesLabel + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writePlotSeriesLabel($plotSeriesLabel, $objWriter) + { + if (is_null($plotSeriesLabel)) { + return; + } + + $objWriter->startElement('c:f'); + $objWriter->writeRawData($plotSeriesLabel->getDataSource()); + $objWriter->endElement(); + + $objWriter->startElement('c:strCache'); + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount() ); + $objWriter->endElement(); + + foreach($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotLabelKey ); + + $objWriter->startElement('c:v'); + $objWriter->writeRawData( $plotLabelValue ); + $objWriter->endElement(); + $objWriter->endElement(); + } + $objWriter->endElement(); + + } + + /** + * Write Plot Series Values + * + * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $groupType Type of plot for dataseries + * @param string $dataType Datatype of series values + * @param PHPExcel_Worksheet $pSheet + * @throws Exception + */ + private function _writePlotSeriesValues( $plotSeriesValues, + $objWriter, + $groupType, + $dataType='str', + PHPExcel_Worksheet $pSheet + ) + { + if (is_null($plotSeriesValues)) { + return; + } + + if ($plotSeriesValues->isMultiLevelSeries()) { + $levelCount = $plotSeriesValues->multiLevelCount(); + + $objWriter->startElement('c:multiLvlStrRef'); + + $objWriter->startElement('c:f'); + $objWriter->writeRawData( $plotSeriesValues->getDataSource() ); + $objWriter->endElement(); + + $objWriter->startElement('c:multiLvlStrCache'); + + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() ); + $objWriter->endElement(); + + for ($level = 0; $level < $levelCount; ++$level) { + $objWriter->startElement('c:lvl'); + + foreach($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) { + if (isset($plotSeriesValue[$level])) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotSeriesKey ); + + $objWriter->startElement('c:v'); + $objWriter->writeRawData( $plotSeriesValue[$level] ); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } else { + $objWriter->startElement('c:'.$dataType.'Ref'); + + $objWriter->startElement('c:f'); + $objWriter->writeRawData( $plotSeriesValues->getDataSource() ); + $objWriter->endElement(); + + $objWriter->startElement('c:'.$dataType.'Cache'); + + if (($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART) && + ($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && + ($groupType != PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + + if (($plotSeriesValues->getFormatCode() !== NULL) && + ($plotSeriesValues->getFormatCode() !== '')) { + $objWriter->startElement('c:formatCode'); + $objWriter->writeRawData( $plotSeriesValues->getFormatCode() ); + $objWriter->endElement(); + } + } + + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() ); + $objWriter->endElement(); + + $dataValues = $plotSeriesValues->getDataValues(); + if (!empty($dataValues)) { + if (is_array($dataValues)) { + foreach($dataValues as $plotSeriesKey => $plotSeriesValue) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotSeriesKey ); + + $objWriter->startElement('c:v'); + $objWriter->writeRawData( $plotSeriesValue ); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Write Bubble Chart Details + * + * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeBubbles($plotSeriesValues, $objWriter, PHPExcel_Worksheet $pSheet) + { + if (is_null($plotSeriesValues)) { + return; + } + + $objWriter->startElement('c:bubbleSize'); + $objWriter->startElement('c:numLit'); + + $objWriter->startElement('c:formatCode'); + $objWriter->writeRawData( 'General' ); + $objWriter->endElement(); + + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() ); + $objWriter->endElement(); + + $dataValues = $plotSeriesValues->getDataValues(); + if (!empty($dataValues)) { + if (is_array($dataValues)) { + foreach($dataValues as $plotSeriesKey => $plotSeriesValue) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotSeriesKey ); + $objWriter->startElement('c:v'); + $objWriter->writeRawData( 1 ); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + } + + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:bubble3D'); + $objWriter->writeAttribute('val', 0 ); + $objWriter->endElement(); + } + + /** + * Write Layout + * + * @param PHPExcel_Chart_Layout $layout + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeLayout(PHPExcel_Chart_Layout $layout = NULL, $objWriter) + { + $objWriter->startElement('c:layout'); + + if (!is_null($layout)) { + $objWriter->startElement('c:manualLayout'); + + $layoutTarget = $layout->getLayoutTarget(); + if (!is_null($layoutTarget)) { + $objWriter->startElement('c:layoutTarget'); + $objWriter->writeAttribute('val', $layoutTarget); + $objWriter->endElement(); + } + + $xMode = $layout->getXMode(); + if (!is_null($xMode)) { + $objWriter->startElement('c:xMode'); + $objWriter->writeAttribute('val', $xMode); + $objWriter->endElement(); + } + + $yMode = $layout->getYMode(); + if (!is_null($yMode)) { + $objWriter->startElement('c:yMode'); + $objWriter->writeAttribute('val', $yMode); + $objWriter->endElement(); + } + + $x = $layout->getXPosition(); + if (!is_null($x)) { + $objWriter->startElement('c:x'); + $objWriter->writeAttribute('val', $x); + $objWriter->endElement(); + } + + $y = $layout->getYPosition(); + if (!is_null($y)) { + $objWriter->startElement('c:y'); + $objWriter->writeAttribute('val', $y); + $objWriter->endElement(); + } + + $w = $layout->getWidth(); + if (!is_null($w)) { + $objWriter->startElement('c:w'); + $objWriter->writeAttribute('val', $w); + $objWriter->endElement(); + } + + $h = $layout->getHeight(); + if (!is_null($h)) { + $objWriter->startElement('c:h'); + $objWriter->writeAttribute('val', $h); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Alternate Content block + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeAlternateContent($objWriter) + { + $objWriter->startElement('mc:AlternateContent'); + $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); + + $objWriter->startElement('mc:Choice'); + $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'); + $objWriter->writeAttribute('Requires', 'c14'); + + $objWriter->startElement('c14:style'); + $objWriter->writeAttribute('val', '102'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('mc:Fallback'); + $objWriter->startElement('c:style'); + $objWriter->writeAttribute('val', '2'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Printer Settings + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writePrintSettings($objWriter) + { + $objWriter->startElement('c:printSettings'); + + $objWriter->startElement('c:headerFooter'); + $objWriter->endElement(); + + $objWriter->startElement('c:pageMargins'); + $objWriter->writeAttribute('footer', 0.3); + $objWriter->writeAttribute('header', 0.3); + $objWriter->writeAttribute('r', 0.7); + $objWriter->writeAttribute('l', 0.7); + $objWriter->writeAttribute('t', 0.75); + $objWriter->writeAttribute('b', 0.75); + $objWriter->endElement(); + + $objWriter->startElement('c:pageSetup'); + $objWriter->writeAttribute('orientation', "portrait"); + $objWriter->endElement(); + + $objWriter->endElement(); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Comments.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Comments.php new file mode 100644 index 000000000..ec8a27042 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Comments.php @@ -0,0 +1,268 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Comments + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Comments extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write comments to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws Exception + */ + public function writeComments(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Comments cache + $comments = $pWorksheet->getComments(); + + // Authors cache + $authors = array(); + $authorId = 0; + foreach ($comments as $comment) { + if (!isset($authors[$comment->getAuthor()])) { + $authors[$comment->getAuthor()] = $authorId++; + } + } + + // comments + $objWriter->startElement('comments'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + + // Loop through authors + $objWriter->startElement('authors'); + foreach ($authors as $author => $index) { + $objWriter->writeElement('author', $author); + } + $objWriter->endElement(); + + // Loop through comments + $objWriter->startElement('commentList'); + foreach ($comments as $key => $value) { + $this->_writeComment($objWriter, $key, $value, $authors); + } + $objWriter->endElement(); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write comment to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pCellReference Cell reference + * @param PHPExcel_Comment $pComment Comment + * @param array $pAuthors Array of authors + * @throws Exception + */ + public function _writeComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null, $pAuthors = null) + { + // comment + $objWriter->startElement('comment'); + $objWriter->writeAttribute('ref', $pCellReference); + $objWriter->writeAttribute('authorId', $pAuthors[$pComment->getAuthor()]); + + // text + $objWriter->startElement('text'); + $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $pComment->getText()); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write VML comments to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws Exception + */ + public function writeVMLComments(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Comments cache + $comments = $pWorksheet->getComments(); + + // xml + $objWriter->startElement('xml'); + $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); + + // o:shapelayout + $objWriter->startElement('o:shapelayout'); + $objWriter->writeAttribute('v:ext', 'edit'); + + // o:idmap + $objWriter->startElement('o:idmap'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('data', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // v:shapetype + $objWriter->startElement('v:shapetype'); + $objWriter->writeAttribute('id', '_x0000_t202'); + $objWriter->writeAttribute('coordsize', '21600,21600'); + $objWriter->writeAttribute('o:spt', '202'); + $objWriter->writeAttribute('path', 'm,l,21600r21600,l21600,xe'); + + // v:stroke + $objWriter->startElement('v:stroke'); + $objWriter->writeAttribute('joinstyle', 'miter'); + $objWriter->endElement(); + + // v:path + $objWriter->startElement('v:path'); + $objWriter->writeAttribute('gradientshapeok', 't'); + $objWriter->writeAttribute('o:connecttype', 'rect'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // Loop through comments + foreach ($comments as $key => $value) { + $this->_writeVMLComment($objWriter, $key, $value); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write VML comment to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pCellReference Cell reference + * @param PHPExcel_Comment $pComment Comment + * @throws Exception + */ + public function _writeVMLComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null) + { + // Metadata + list($column, $row) = PHPExcel_Cell::coordinateFromString($pCellReference); + $column = PHPExcel_Cell::columnIndexFromString($column); + $id = 1024 + $column + $row; + $id = substr($id, 0, 4); + + // v:shape + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('id', '_x0000_s' . $id); + $objWriter->writeAttribute('type', '#_x0000_t202'); + $objWriter->writeAttribute('style', 'position:absolute;margin-left:' . $pComment->getMarginLeft() . ';margin-top:' . $pComment->getMarginTop() . ';width:' . $pComment->getWidth() . ';height:' . $pComment->getHeight() . ';z-index:1;visibility:' . ($pComment->getVisible() ? 'visible' : 'hidden')); + $objWriter->writeAttribute('fillcolor', '#' . $pComment->getFillColor()->getRGB()); + $objWriter->writeAttribute('o:insetmode', 'auto'); + + // v:fill + $objWriter->startElement('v:fill'); + $objWriter->writeAttribute('color2', '#' . $pComment->getFillColor()->getRGB()); + $objWriter->endElement(); + + // v:shadow + $objWriter->startElement('v:shadow'); + $objWriter->writeAttribute('on', 't'); + $objWriter->writeAttribute('color', 'black'); + $objWriter->writeAttribute('obscured', 't'); + $objWriter->endElement(); + + // v:path + $objWriter->startElement('v:path'); + $objWriter->writeAttribute('o:connecttype', 'none'); + $objWriter->endElement(); + + // v:textbox + $objWriter->startElement('v:textbox'); + $objWriter->writeAttribute('style', 'mso-direction-alt:auto'); + + // div + $objWriter->startElement('div'); + $objWriter->writeAttribute('style', 'text-align:left'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // x:ClientData + $objWriter->startElement('x:ClientData'); + $objWriter->writeAttribute('ObjectType', 'Note'); + + // x:MoveWithCells + $objWriter->writeElement('x:MoveWithCells', ''); + + // x:SizeWithCells + $objWriter->writeElement('x:SizeWithCells', ''); + + // x:Anchor + //$objWriter->writeElement('x:Anchor', $column . ', 15, ' . ($row - 2) . ', 10, ' . ($column + 4) . ', 15, ' . ($row + 5) . ', 18'); + + // x:AutoFill + $objWriter->writeElement('x:AutoFill', 'False'); + + // x:Row + $objWriter->writeElement('x:Row', ($row - 1)); + + // x:Column + $objWriter->writeElement('x:Column', ($column - 1)); + + $objWriter->endElement(); + + $objWriter->endElement(); + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/ContentTypes.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/ContentTypes.php new file mode 100644 index 000000000..a6ee53c6d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/ContentTypes.php @@ -0,0 +1,261 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_ContentTypes + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_ContentTypes extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write content types to XML format + * + * @param PHPExcel $pPHPExcel + * @param boolean $includeCharts Flag indicating if we should include drawing details for charts + * @return string XML Output + * @throws Exception + */ + public function writeContentTypes(PHPExcel $pPHPExcel = null, $includeCharts = FALSE) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Types + $objWriter->startElement('Types'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types'); + + // Theme + $this->_writeOverrideContentType( + $objWriter, '/xl/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml' + ); + + // Styles + $this->_writeOverrideContentType( + $objWriter, '/xl/styles.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml' + ); + + // Rels + $this->_writeDefaultContentType( + $objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml' + ); + + // XML + $this->_writeDefaultContentType( + $objWriter, 'xml', 'application/xml' + ); + + // VML + $this->_writeDefaultContentType( + $objWriter, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing' + ); + + // Workbook + $this->_writeOverrideContentType( + $objWriter, '/xl/workbook.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml' + ); + + // DocProps + $this->_writeOverrideContentType( + $objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml' + ); + + $this->_writeOverrideContentType( + $objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml' + ); + + $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); + if (!empty($customPropertyList)) { + $this->_writeOverrideContentType( + $objWriter, '/docProps/custom.xml', 'application/vnd.openxmlformats-officedocument.custom-properties+xml' + ); + } + + // Worksheets + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + $this->_writeOverrideContentType( + $objWriter, '/xl/worksheets/sheet' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml' + ); + } + + // Shared strings + $this->_writeOverrideContentType( + $objWriter, '/xl/sharedStrings.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml' + ); + + // Add worksheet relationship content types + $chart = 1; + for ($i = 0; $i < $sheetCount; ++$i) { + $drawings = $pPHPExcel->getSheet($i)->getDrawingCollection(); + $drawingCount = count($drawings); + $chartCount = ($includeCharts) ? $pPHPExcel->getSheet($i)->getChartCount() : 0; + + // We need a drawing relationship for the worksheet if we have either drawings or charts + if (($drawingCount > 0) || ($chartCount > 0)) { + $this->_writeOverrideContentType( + $objWriter, '/xl/drawings/drawing' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.drawing+xml' + ); + } + + // If we have charts, then we need a chart relationship for every individual chart + if ($chartCount > 0) { + for ($c = 0; $c < $chartCount; ++$c) { + $this->_writeOverrideContentType( + $objWriter, '/xl/charts/chart' . $chart++ . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml' + ); + } + } + } + + // Comments + for ($i = 0; $i < $sheetCount; ++$i) { + if (count($pPHPExcel->getSheet($i)->getComments()) > 0) { + $this->_writeOverrideContentType( + $objWriter, '/xl/comments' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml' + ); + } + } + + // Add media content-types + $aMediaContentTypes = array(); + $mediaCount = $this->getParentWriter()->getDrawingHashTable()->count(); + for ($i = 0; $i < $mediaCount; ++$i) { + $extension = ''; + $mimeType = ''; + + if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { + $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getExtension()); + $mimeType = $this->_getImageMimeType( $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getPath() ); + } else if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { + $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType()); + $extension = explode('/', $extension); + $extension = $extension[1]; + + $mimeType = $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType(); + } + + if (!isset( $aMediaContentTypes[$extension]) ) { + $aMediaContentTypes[$extension] = $mimeType; + + $this->_writeDefaultContentType( + $objWriter, $extension, $mimeType + ); + } + } + + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + if (count($pPHPExcel->getSheet()->getHeaderFooter()->getImages()) > 0) { + foreach ($pPHPExcel->getSheet()->getHeaderFooter()->getImages() as $image) { + if (!isset( $aMediaContentTypes[strtolower($image->getExtension())]) ) { + $aMediaContentTypes[strtolower($image->getExtension())] = $this->_getImageMimeType( $image->getPath() ); + + $this->_writeDefaultContentType( + $objWriter, strtolower($image->getExtension()), $aMediaContentTypes[strtolower($image->getExtension())] + ); + } + } + } + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Get image mime type + * + * @param string $pFile Filename + * @return string Mime Type + * @throws Exception + */ + private function _getImageMimeType($pFile = '') + { + if (PHPExcel_Shared_File::file_exists($pFile)) { + $image = getimagesize($pFile); + return image_type_to_mime_type($image[2]); + } else { + throw new Exception("File $pFile does not exist"); + } + } + + /** + * Write Default content type + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type + * @throws Exception + */ + private function _writeDefaultContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') + { + if ($pPartname != '' && $pContentType != '') { + // Write content type + $objWriter->startElement('Default'); + $objWriter->writeAttribute('Extension', $pPartname); + $objWriter->writeAttribute('ContentType', $pContentType); + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Write Override content type + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type + * @throws Exception + */ + private function _writeOverrideContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') + { + if ($pPartname != '' && $pContentType != '') { + // Write content type + $objWriter->startElement('Override'); + $objWriter->writeAttribute('PartName', $pPartname); + $objWriter->writeAttribute('ContentType', $pContentType); + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/DocProps.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/DocProps.php new file mode 100644 index 000000000..84dd06bc1 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/DocProps.php @@ -0,0 +1,272 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_DocProps + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_DocProps extends PHPExcel_Writer_Excel2007_WriterPart +{ +/** + * Write docProps/app.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeDocPropsApp(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Properties + $objWriter->startElement('Properties'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'); + $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + + // Application + $objWriter->writeElement('Application', 'Microsoft Excel'); + + // DocSecurity + $objWriter->writeElement('DocSecurity', '0'); + + // ScaleCrop + $objWriter->writeElement('ScaleCrop', 'false'); + + // HeadingPairs + $objWriter->startElement('HeadingPairs'); + + // Vector + $objWriter->startElement('vt:vector'); + $objWriter->writeAttribute('size', '2'); + $objWriter->writeAttribute('baseType', 'variant'); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:lpstr', 'Worksheets'); + $objWriter->endElement(); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:i4', $pPHPExcel->getSheetCount()); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // TitlesOfParts + $objWriter->startElement('TitlesOfParts'); + + // Vector + $objWriter->startElement('vt:vector'); + $objWriter->writeAttribute('size', $pPHPExcel->getSheetCount()); + $objWriter->writeAttribute('baseType', 'lpstr'); + + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + $objWriter->writeElement('vt:lpstr', $pPHPExcel->getSheet($i)->getTitle()); + } + + $objWriter->endElement(); + + $objWriter->endElement(); + + // Company + $objWriter->writeElement('Company', $pPHPExcel->getProperties()->getCompany()); + + // Company + $objWriter->writeElement('Manager', $pPHPExcel->getProperties()->getManager()); + + // LinksUpToDate + $objWriter->writeElement('LinksUpToDate', 'false'); + + // SharedDoc + $objWriter->writeElement('SharedDoc', 'false'); + + // HyperlinksChanged + $objWriter->writeElement('HyperlinksChanged', 'false'); + + // AppVersion + $objWriter->writeElement('AppVersion', '12.0000'); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write docProps/core.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeDocPropsCore(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // cp:coreProperties + $objWriter->startElement('cp:coreProperties'); + $objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); + $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); + $objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); + $objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); + $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + + // dc:creator + $objWriter->writeElement('dc:creator', $pPHPExcel->getProperties()->getCreator()); + + // cp:lastModifiedBy + $objWriter->writeElement('cp:lastModifiedBy', $pPHPExcel->getProperties()->getLastModifiedBy()); + + // dcterms:created + $objWriter->startElement('dcterms:created'); + $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); + $objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getCreated())); + $objWriter->endElement(); + + // dcterms:modified + $objWriter->startElement('dcterms:modified'); + $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); + $objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getModified())); + $objWriter->endElement(); + + // dc:title + $objWriter->writeElement('dc:title', $pPHPExcel->getProperties()->getTitle()); + + // dc:description + $objWriter->writeElement('dc:description', $pPHPExcel->getProperties()->getDescription()); + + // dc:subject + $objWriter->writeElement('dc:subject', $pPHPExcel->getProperties()->getSubject()); + + // cp:keywords + $objWriter->writeElement('cp:keywords', $pPHPExcel->getProperties()->getKeywords()); + + // cp:category + $objWriter->writeElement('cp:category', $pPHPExcel->getProperties()->getCategory()); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write docProps/custom.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeDocPropsCustom(PHPExcel $pPHPExcel = null) + { + $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); + if (empty($customPropertyList)) { + return; + } + + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // cp:coreProperties + $objWriter->startElement('Properties'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties'); + $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + + + foreach($customPropertyList as $key => $customProperty) { + $propertyValue = $pPHPExcel->getProperties()->getCustomPropertyValue($customProperty); + $propertyType = $pPHPExcel->getProperties()->getCustomPropertyType($customProperty); + + $objWriter->startElement('property'); + $objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}'); + $objWriter->writeAttribute('pid', $key+2); + $objWriter->writeAttribute('name', $customProperty); + + switch($propertyType) { + case 'i' : + $objWriter->writeElement('vt:i4', $propertyValue); + break; + case 'f' : + $objWriter->writeElement('vt:r8', $propertyValue); + break; + case 'b' : + $objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false'); + break; + case 'd' : + $objWriter->startElement('vt:filetime'); + $objWriter->writeRawData(date(DATE_W3C, $propertyValue)); + $objWriter->endElement(); + break; + default : + $objWriter->writeElement('vt:lpwstr', $propertyValue); + break; + } + + $objWriter->endElement(); + } + + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Drawing.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Drawing.php new file mode 100644 index 000000000..9b618c563 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Drawing.php @@ -0,0 +1,598 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Drawing + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Drawing extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write drawings to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @param int &$chartRef Chart ID + * @param boolean $includeCharts Flag indicating if we should include drawing details for charts + * @return string XML Output + * @throws Exception + */ + public function writeDrawings(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = FALSE) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // xdr:wsDr + $objWriter->startElement('xdr:wsDr'); + $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'); + $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); + + // Loop through images and write drawings + $i = 1; + $iterator = $pWorksheet->getDrawingCollection()->getIterator(); + while ($iterator->valid()) { + $this->_writeDrawing($objWriter, $iterator->current(), $i); + + $iterator->next(); + ++$i; + } + + if ($includeCharts) { + $chartCount = $pWorksheet->getChartCount(); + // Loop through charts and write the chart position + if ($chartCount > 0) { + for ($c = 0; $c < $chartCount; ++$c) { + $this->_writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c+$i); + } + } + } + + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write drawings to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart $pChart + * @param int $pRelationId + * @throws Exception + */ + public function _writeChart(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Chart $pChart = null, $pRelationId = -1) + { + $tl = $pChart->getTopLeftPosition(); + $tl['colRow'] = PHPExcel_Cell::coordinateFromString($tl['cell']); + $br = $pChart->getBottomRightPosition(); + $br['colRow'] = PHPExcel_Cell::coordinateFromString($br['cell']); + + $objWriter->startElement('xdr:twoCellAnchor'); + + $objWriter->startElement('xdr:from'); + $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($tl['colRow'][0]) - 1); + $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['xOffset'])); + $objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1); + $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['yOffset'])); + $objWriter->endElement(); + $objWriter->startElement('xdr:to'); + $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($br['colRow'][0]) - 1); + $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['xOffset'])); + $objWriter->writeElement('xdr:row', $br['colRow'][1] - 1); + $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['yOffset'])); + $objWriter->endElement(); + + $objWriter->startElement('xdr:graphicFrame'); + $objWriter->writeAttribute('macro', ''); + $objWriter->startElement('xdr:nvGraphicFramePr'); + $objWriter->startElement('xdr:cNvPr'); + $objWriter->writeAttribute('name', 'Chart '.$pRelationId); + $objWriter->writeAttribute('id', 1025 * $pRelationId); + $objWriter->endElement(); + $objWriter->startElement('xdr:cNvGraphicFramePr'); + $objWriter->startElement('a:graphicFrameLocks'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('xdr:xfrm'); + $objWriter->startElement('a:off'); + $objWriter->writeAttribute('x', '0'); + $objWriter->writeAttribute('y', '0'); + $objWriter->endElement(); + $objWriter->startElement('a:ext'); + $objWriter->writeAttribute('cx', '0'); + $objWriter->writeAttribute('cy', '0'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('a:graphic'); + $objWriter->startElement('a:graphicData'); + $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); + $objWriter->startElement('c:chart'); + $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('r:id', 'rId'.$pRelationId); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('xdr:clientData'); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write drawings to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet_BaseDrawing $pDrawing + * @param int $pRelationId + * @throws Exception + */ + public function _writeDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet_BaseDrawing $pDrawing = null, $pRelationId = -1) + { + if ($pRelationId >= 0) { + // xdr:oneCellAnchor + $objWriter->startElement('xdr:oneCellAnchor'); + // Image location + $aCoordinates = PHPExcel_Cell::coordinateFromString($pDrawing->getCoordinates()); + $aCoordinates[0] = PHPExcel_Cell::columnIndexFromString($aCoordinates[0]); + + // xdr:from + $objWriter->startElement('xdr:from'); + $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1); + $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX())); + $objWriter->writeElement('xdr:row', $aCoordinates[1] - 1); + $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY())); + $objWriter->endElement(); + + // xdr:ext + $objWriter->startElement('xdr:ext'); + $objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth())); + $objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight())); + $objWriter->endElement(); + + // xdr:pic + $objWriter->startElement('xdr:pic'); + + // xdr:nvPicPr + $objWriter->startElement('xdr:nvPicPr'); + + // xdr:cNvPr + $objWriter->startElement('xdr:cNvPr'); + $objWriter->writeAttribute('id', $pRelationId); + $objWriter->writeAttribute('name', $pDrawing->getName()); + $objWriter->writeAttribute('descr', $pDrawing->getDescription()); + $objWriter->endElement(); + + // xdr:cNvPicPr + $objWriter->startElement('xdr:cNvPicPr'); + + // a:picLocks + $objWriter->startElement('a:picLocks'); + $objWriter->writeAttribute('noChangeAspect', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // xdr:blipFill + $objWriter->startElement('xdr:blipFill'); + + // a:blip + $objWriter->startElement('a:blip'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('r:embed', 'rId' . $pRelationId); + $objWriter->endElement(); + + // a:stretch + $objWriter->startElement('a:stretch'); + $objWriter->writeElement('a:fillRect', null); + $objWriter->endElement(); + + $objWriter->endElement(); + + // xdr:spPr + $objWriter->startElement('xdr:spPr'); + + // a:xfrm + $objWriter->startElement('a:xfrm'); + $objWriter->writeAttribute('rot', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getRotation())); + $objWriter->endElement(); + + // a:prstGeom + $objWriter->startElement('a:prstGeom'); + $objWriter->writeAttribute('prst', 'rect'); + + // a:avLst + $objWriter->writeElement('a:avLst', null); + + $objWriter->endElement(); + +// // a:solidFill +// $objWriter->startElement('a:solidFill'); + +// // a:srgbClr +// $objWriter->startElement('a:srgbClr'); +// $objWriter->writeAttribute('val', 'FFFFFF'); + +///* SHADE +// // a:shade +// $objWriter->startElement('a:shade'); +// $objWriter->writeAttribute('val', '85000'); +// $objWriter->endElement(); +//*/ + +// $objWriter->endElement(); + +// $objWriter->endElement(); +/* + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '88900'); + $objWriter->writeAttribute('cap', 'sq'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', 'FFFFFF'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:miter + $objWriter->startElement('a:miter'); + $objWriter->writeAttribute('lim', '800000'); + $objWriter->endElement(); + + $objWriter->endElement(); +*/ + + if ($pDrawing->getShadow()->getVisible()) { + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius())); + $objWriter->writeAttribute('dist', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance())); + $objWriter->writeAttribute('dir', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getShadow()->getDirection())); + $objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment()); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB()); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } +/* + + // a:scene3d + $objWriter->startElement('a:scene3d'); + + // a:camera + $objWriter->startElement('a:camera'); + $objWriter->writeAttribute('prst', 'orthographicFront'); + $objWriter->endElement(); + + // a:lightRig + $objWriter->startElement('a:lightRig'); + $objWriter->writeAttribute('rig', 'twoPt'); + $objWriter->writeAttribute('dir', 't'); + + // a:rot + $objWriter->startElement('a:rot'); + $objWriter->writeAttribute('lat', '0'); + $objWriter->writeAttribute('lon', '0'); + $objWriter->writeAttribute('rev', '0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); +*/ +/* + // a:sp3d + $objWriter->startElement('a:sp3d'); + + // a:bevelT + $objWriter->startElement('a:bevelT'); + $objWriter->writeAttribute('w', '25400'); + $objWriter->writeAttribute('h', '19050'); + $objWriter->endElement(); + + // a:contourClr + $objWriter->startElement('a:contourClr'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', 'FFFFFF'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); +*/ + $objWriter->endElement(); + + $objWriter->endElement(); + + // xdr:clientData + $objWriter->writeElement('xdr:clientData', null); + + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Write VML header/footer images to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws Exception + */ + public function writeVMLHeaderFooterImages(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Header/footer images + $images = $pWorksheet->getHeaderFooter()->getImages(); + + // xml + $objWriter->startElement('xml'); + $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); + + // o:shapelayout + $objWriter->startElement('o:shapelayout'); + $objWriter->writeAttribute('v:ext', 'edit'); + + // o:idmap + $objWriter->startElement('o:idmap'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('data', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // v:shapetype + $objWriter->startElement('v:shapetype'); + $objWriter->writeAttribute('id', '_x0000_t75'); + $objWriter->writeAttribute('coordsize', '21600,21600'); + $objWriter->writeAttribute('o:spt', '75'); + $objWriter->writeAttribute('o:preferrelative', 't'); + $objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe'); + $objWriter->writeAttribute('filled', 'f'); + $objWriter->writeAttribute('stroked', 'f'); + + // v:stroke + $objWriter->startElement('v:stroke'); + $objWriter->writeAttribute('joinstyle', 'miter'); + $objWriter->endElement(); + + // v:formulas + $objWriter->startElement('v:formulas'); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @0 1 0'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum 0 0 @1'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @2 1 2'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @0 0 1'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @6 1 2'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @8 21600 0'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @10 21600 0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // v:path + $objWriter->startElement('v:path'); + $objWriter->writeAttribute('o:extrusionok', 'f'); + $objWriter->writeAttribute('gradientshapeok', 't'); + $objWriter->writeAttribute('o:connecttype', 'rect'); + $objWriter->endElement(); + + // o:lock + $objWriter->startElement('o:lock'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('aspectratio', 't'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // Loop through images + foreach ($images as $key => $value) { + $this->_writeVMLHeaderFooterImage($objWriter, $key, $value); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write VML comment to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pReference Reference + * @param PHPExcel_Worksheet_HeaderFooterDrawing $pImage Image + * @throws Exception + */ + public function _writeVMLHeaderFooterImage(PHPExcel_Shared_XMLWriter $objWriter = null, $pReference = '', PHPExcel_Worksheet_HeaderFooterDrawing $pImage = null) + { + // Calculate object id + preg_match('{(\d+)}', md5($pReference), $m); + $id = 1500 + (substr($m[1], 0, 2) * 1); + + // Calculate offset + $width = $pImage->getWidth(); + $height = $pImage->getHeight(); + $marginLeft = $pImage->getOffsetX(); + $marginTop = $pImage->getOffsetY(); + + // v:shape + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('id', $pReference); + $objWriter->writeAttribute('o:spid', '_x0000_s' . $id); + $objWriter->writeAttribute('type', '#_x0000_t75'); + $objWriter->writeAttribute('style', "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1"); + + // v:imagedata + $objWriter->startElement('v:imagedata'); + $objWriter->writeAttribute('o:relid', 'rId' . $pReference); + $objWriter->writeAttribute('o:title', $pImage->getName()); + $objWriter->endElement(); + + // o:lock + $objWriter->startElement('o:lock'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('rotation', 't'); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + + /** + * Get an array of all drawings + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Worksheet_Drawing[] All drawings in PHPExcel + * @throws Exception + */ + public function allDrawings(PHPExcel $pPHPExcel = null) + { + // Get an array of all drawings + $aDrawings = array(); + + // Loop through PHPExcel + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + // Loop through images and add to array + $iterator = $pPHPExcel->getSheet($i)->getDrawingCollection()->getIterator(); + while ($iterator->valid()) { + $aDrawings[] = $iterator->current(); + + $iterator->next(); + } + } + + return $aDrawings; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Rels.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Rels.php new file mode 100644 index 000000000..ff550a673 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Rels.php @@ -0,0 +1,417 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Rels + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Rels extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write relationships to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeRelationships(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); + if (!empty($customPropertyList)) { + // Relationship docProps/app.xml + $this->_writeRelationship( + $objWriter, + 4, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties', + 'docProps/custom.xml' + ); + + } + + // Relationship docProps/app.xml + $this->_writeRelationship( + $objWriter, + 3, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + 'docProps/app.xml' + ); + + // Relationship docProps/core.xml + $this->_writeRelationship( + $objWriter, + 2, + 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + 'docProps/core.xml' + ); + + // Relationship xl/workbook.xml + $this->_writeRelationship( + $objWriter, + 1, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + 'xl/workbook.xml' + ); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write workbook relationships to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeWorkbookRelationships(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Relationship styles.xml + $this->_writeRelationship( + $objWriter, + 1, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + 'styles.xml' + ); + + // Relationship theme/theme1.xml + $this->_writeRelationship( + $objWriter, + 2, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + 'theme/theme1.xml' + ); + + // Relationship sharedStrings.xml + $this->_writeRelationship( + $objWriter, + 3, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + 'sharedStrings.xml' + ); + + // Relationships with sheets + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + $this->_writeRelationship( + $objWriter, + ($i + 1 + 3), + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + 'worksheets/sheet' . ($i + 1) . '.xml' + ); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write worksheet relationships to XML format + * + * Numbering is as follows: + * rId1 - Drawings + * rId_hyperlink_x - Hyperlinks + * + * @param PHPExcel_Worksheet $pWorksheet + * @param int $pWorksheetId + * @param boolean $includeCharts Flag indicating if we should write charts + * @return string XML Output + * @throws Exception + */ + public function writeWorksheetRelationships(PHPExcel_Worksheet $pWorksheet = null, $pWorksheetId = 1, $includeCharts = FALSE) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Write drawing relationships? + $d = 0; + if ($includeCharts) { + $charts = $pWorksheet->getChartCollection(); + } else { + $charts = array(); + } + if (($pWorksheet->getDrawingCollection()->count() > 0) || + (count($charts) > 0)) { + $this->_writeRelationship( + $objWriter, + ++$d, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', + '../drawings/drawing' . $pWorksheetId . '.xml' + ); + } + + // Write chart relationships? +// $chartCount = 0; +// $charts = $pWorksheet->getChartCollection(); +// echo 'Chart Rels: ' , count($charts) , '<br />'; +// if (count($charts) > 0) { +// foreach($charts as $chart) { +// $this->_writeRelationship( +// $objWriter, +// ++$d, +// 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', +// '../charts/chart' . ++$chartCount . '.xml' +// ); +// } +// } +// + // Write hyperlink relationships? + $i = 1; + foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) { + if (!$hyperlink->isInternal()) { + $this->_writeRelationship( + $objWriter, + '_hyperlink_' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', + $hyperlink->getUrl(), + 'External' + ); + + ++$i; + } + } + + // Write comments relationship? + $i = 1; + if (count($pWorksheet->getComments()) > 0) { + $this->_writeRelationship( + $objWriter, + '_comments_vml' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', + '../drawings/vmlDrawing' . $pWorksheetId . '.vml' + ); + + $this->_writeRelationship( + $objWriter, + '_comments' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', + '../comments' . $pWorksheetId . '.xml' + ); + } + + // Write header/footer relationship? + $i = 1; + if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) { + $this->_writeRelationship( + $objWriter, + '_headerfooter_vml' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', + '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml' + ); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write drawing relationships to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @param int &$chartRef Chart ID + * @param boolean $includeCharts Flag indicating if we should write charts + * @return string XML Output + * @throws Exception + */ + public function writeDrawingRelationships(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = FALSE) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Loop through images and write relationships + $i = 1; + $iterator = $pWorksheet->getDrawingCollection()->getIterator(); + while ($iterator->valid()) { + if ($iterator->current() instanceof PHPExcel_Worksheet_Drawing + || $iterator->current() instanceof PHPExcel_Worksheet_MemoryDrawing) { + // Write relationship for image drawing + $this->_writeRelationship( + $objWriter, + $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', + '../media/' . str_replace(' ', '', $iterator->current()->getIndexedFilename()) + ); + } + + $iterator->next(); + ++$i; + } + + if ($includeCharts) { + // Loop through charts and write relationships + $chartCount = $pWorksheet->getChartCount(); + if ($chartCount > 0) { + for ($c = 0; $c < $chartCount; ++$c) { + $this->_writeRelationship( + $objWriter, + $i++, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', + '../charts/chart' . ++$chartRef . '.xml' + ); + } + } + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write header/footer drawing relationships to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws Exception + */ + public function writeHeaderFooterDrawingRelationships(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Loop through images and write relationships + foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) { + // Write relationship for image drawing + $this->_writeRelationship( + $objWriter, + $key, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', + '../media/' . $value->getIndexedFilename() + ); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write Override content type + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param int $pId Relationship ID. rId will be prepended! + * @param string $pType Relationship type + * @param string $pTarget Relationship target + * @param string $pTargetMode Relationship target mode + * @throws Exception + */ + private function _writeRelationship(PHPExcel_Shared_XMLWriter $objWriter = null, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '') + { + if ($pType != '' && $pTarget != '') { + // Write relationship + $objWriter->startElement('Relationship'); + $objWriter->writeAttribute('Id', 'rId' . $pId); + $objWriter->writeAttribute('Type', $pType); + $objWriter->writeAttribute('Target', $pTarget); + + if ($pTargetMode != '') { + $objWriter->writeAttribute('TargetMode', $pTargetMode); + } + + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/StringTable.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/StringTable.php new file mode 100644 index 000000000..e9fb6600c --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/StringTable.php @@ -0,0 +1,319 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_StringTable + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_StringTable extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Create worksheet stringtable + * + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param string[] $pExistingTable Existing table to eventually merge with + * @return string[] String table for worksheet + * @throws Exception + */ + public function createStringTable($pSheet = null, $pExistingTable = null) + { + if ($pSheet !== NULL) { + // Create string lookup table + $aStringTable = array(); + $cellCollection = null; + $aFlippedStringTable = null; // For faster lookup + + // Is an existing table given? + if (($pExistingTable !== NULL) && is_array($pExistingTable)) { + $aStringTable = $pExistingTable; + } + + // Fill index array + $aFlippedStringTable = $this->flipStringTable($aStringTable); + + // Loop through cells + foreach ($pSheet->getCellCollection() as $cellID) { + $cell = $pSheet->getCell($cellID); + $cellValue = $cell->getValue(); + if (!is_object($cellValue) && + ($cellValue !== NULL) && + $cellValue !== '' && + !isset($aFlippedStringTable[$cellValue]) && + ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING2 || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_NULL)) { + $aStringTable[] = $cellValue; + $aFlippedStringTable[$cellValue] = true; + } elseif ($cellValue instanceof PHPExcel_RichText && + ($cellValue !== NULL) && + !isset($aFlippedStringTable[$cellValue->getHashCode()])) { + $aStringTable[] = $cellValue; + $aFlippedStringTable[$cellValue->getHashCode()] = true; + } + } + + // Return + return $aStringTable; + } else { + throw new Exception("Invalid PHPExcel_Worksheet object passed."); + } + } + + /** + * Write string table to XML format + * + * @param string[] $pStringTable + * @return string XML Output + * @throws Exception + */ + public function writeStringTable($pStringTable = null) + { + if ($pStringTable !== NULL) { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // String table + $objWriter->startElement('sst'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + $objWriter->writeAttribute('uniqueCount', count($pStringTable)); + + // Loop through string table + foreach ($pStringTable as $textElement) { + $objWriter->startElement('si'); + + if (! $textElement instanceof PHPExcel_RichText) { + $textToWrite = PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $textElement ); + $objWriter->startElement('t'); + if ($textToWrite !== trim($textToWrite)) { + $objWriter->writeAttribute('xml:space', 'preserve'); + } + $objWriter->writeRawData($textToWrite); + $objWriter->endElement(); + } else if ($textElement instanceof PHPExcel_RichText) { + $this->writeRichText($objWriter, $textElement); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } else { + throw new Exception("Invalid string table array passed."); + } + } + + /** + * Write Rich Text + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_RichText $pRichText Rich text + * @param string $prefix Optional Namespace prefix + * @throws Exception + */ + public function writeRichText(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_RichText $pRichText = null, $prefix=NULL) + { + if ($prefix !== NULL) + $prefix .= ':'; + // Loop through rich text elements + $elements = $pRichText->getRichTextElements(); + foreach ($elements as $element) { + // r + $objWriter->startElement($prefix.'r'); + + // rPr + if ($element instanceof PHPExcel_RichText_Run) { + // rPr + $objWriter->startElement($prefix.'rPr'); + + // rFont + $objWriter->startElement($prefix.'rFont'); + $objWriter->writeAttribute('val', $element->getFont()->getName()); + $objWriter->endElement(); + + // Bold + $objWriter->startElement($prefix.'b'); + $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false')); + $objWriter->endElement(); + + // Italic + $objWriter->startElement($prefix.'i'); + $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false')); + $objWriter->endElement(); + + // Superscript / subscript + if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) { + $objWriter->startElement($prefix.'vertAlign'); + if ($element->getFont()->getSuperScript()) { + $objWriter->writeAttribute('val', 'superscript'); + } else if ($element->getFont()->getSubScript()) { + $objWriter->writeAttribute('val', 'subscript'); + } + $objWriter->endElement(); + } + + // Strikethrough + $objWriter->startElement($prefix.'strike'); + $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false')); + $objWriter->endElement(); + + // Color + $objWriter->startElement($prefix.'color'); + $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB()); + $objWriter->endElement(); + + // Size + $objWriter->startElement($prefix.'sz'); + $objWriter->writeAttribute('val', $element->getFont()->getSize()); + $objWriter->endElement(); + + // Underline + $objWriter->startElement($prefix.'u'); + $objWriter->writeAttribute('val', $element->getFont()->getUnderline()); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + // t + $objWriter->startElement($prefix.'t'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $element->getText() )); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Write Rich Text + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string|PHPExcel_RichText $pRichText text string or Rich text + * @param string $prefix Optional Namespace prefix + * @throws Exception + */ + public function writeRichTextForCharts(PHPExcel_Shared_XMLWriter $objWriter = null, $pRichText = null, $prefix=NULL) + { + if (!$pRichText instanceof PHPExcel_RichText) { + $textRun = $pRichText; + $pRichText = new PHPExcel_RichText(); + $pRichText->createTextRun($textRun); + } + + if ($prefix !== NULL) + $prefix .= ':'; + // Loop through rich text elements + $elements = $pRichText->getRichTextElements(); + foreach ($elements as $element) { + // r + $objWriter->startElement($prefix.'r'); + + // rPr + $objWriter->startElement($prefix.'rPr'); + + // Bold + $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0)); + // Italic + $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0)); + // Underline + $underlineType = $element->getFont()->getUnderline(); + switch($underlineType) { + case 'single' : + $underlineType = 'sng'; + break; + case 'double' : + $underlineType = 'dbl'; + break; + } + $objWriter->writeAttribute('u', $underlineType); + // Strikethrough + $objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike')); + + // rFont + $objWriter->startElement($prefix.'latin'); + $objWriter->writeAttribute('typeface', $element->getFont()->getName()); + $objWriter->endElement(); + + // Superscript / subscript +// if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) { +// $objWriter->startElement($prefix.'vertAlign'); +// if ($element->getFont()->getSuperScript()) { +// $objWriter->writeAttribute('val', 'superscript'); +// } else if ($element->getFont()->getSubScript()) { +// $objWriter->writeAttribute('val', 'subscript'); +// } +// $objWriter->endElement(); +// } +// + $objWriter->endElement(); + + // t + $objWriter->startElement($prefix.'t'); +// $objWriter->writeAttribute('xml:space', 'preserve'); // Excel2010 accepts, Excel2007 complains + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $element->getText() )); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Flip string table (for index searching) + * + * @param array $stringTable Stringtable + * @return array + */ + public function flipStringTable($stringTable = array()) { + // Return value + $returnValue = array(); + + // Loop through stringtable and add flipped items to $returnValue + foreach ($stringTable as $key => $value) { + if (! $value instanceof PHPExcel_RichText) { + $returnValue[$value] = $key; + } else if ($value instanceof PHPExcel_RichText) { + $returnValue[$value->getHashCode()] = $key; + } + } + + // Return + return $returnValue; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Style.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Style.php new file mode 100644 index 000000000..b24deba9a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Style.php @@ -0,0 +1,701 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Style + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Style extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write styles to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeStyles(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // styleSheet + $objWriter->startElement('styleSheet'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + + // numFmts + $objWriter->startElement('numFmts'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count()); + + // numFmt + for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) { + $this->_writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i); + } + + $objWriter->endElement(); + + // fonts + $objWriter->startElement('fonts'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count()); + + // font + for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) { + $this->_writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i)); + } + + $objWriter->endElement(); + + // fills + $objWriter->startElement('fills'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count()); + + // fill + for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) { + $this->_writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i)); + } + + $objWriter->endElement(); + + // borders + $objWriter->startElement('borders'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count()); + + // border + for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) { + $this->_writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i)); + } + + $objWriter->endElement(); + + // cellStyleXfs + $objWriter->startElement('cellStyleXfs'); + $objWriter->writeAttribute('count', 1); + + // xf + $objWriter->startElement('xf'); + $objWriter->writeAttribute('numFmtId', 0); + $objWriter->writeAttribute('fontId', 0); + $objWriter->writeAttribute('fillId', 0); + $objWriter->writeAttribute('borderId', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + + // cellXfs + $objWriter->startElement('cellXfs'); + $objWriter->writeAttribute('count', count($pPHPExcel->getCellXfCollection())); + + // xf + foreach ($pPHPExcel->getCellXfCollection() as $cellXf) { + $this->_writeCellStyleXf($objWriter, $cellXf, $pPHPExcel); + } + + $objWriter->endElement(); + + // cellStyles + $objWriter->startElement('cellStyles'); + $objWriter->writeAttribute('count', 1); + + // cellStyle + $objWriter->startElement('cellStyle'); + $objWriter->writeAttribute('name', 'Normal'); + $objWriter->writeAttribute('xfId', 0); + $objWriter->writeAttribute('builtinId', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + + // dxfs + $objWriter->startElement('dxfs'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count()); + + // dxf + for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) { + $this->_writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle()); + } + + $objWriter->endElement(); + + // tableStyles + $objWriter->startElement('tableStyles'); + $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9'); + $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write Fill + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Fill $pFill Fill style + * @throws Exception + */ + private function _writeFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) + { + // Check if this is a pattern type or gradient type + if ($pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR || + $pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_PATH) { + // Gradient fill + $this->_writeGradientFill($objWriter, $pFill); + } elseif($pFill->getFillType() !== NULL) { + // Pattern fill + $this->_writePatternFill($objWriter, $pFill); + } + } + + /** + * Write Gradient Fill + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Fill $pFill Fill style + * @throws Exception + */ + private function _writeGradientFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) + { + // fill + $objWriter->startElement('fill'); + + // gradientFill + $objWriter->startElement('gradientFill'); + $objWriter->writeAttribute('type', $pFill->getFillType()); + $objWriter->writeAttribute('degree', $pFill->getRotation()); + + // stop + $objWriter->startElement('stop'); + $objWriter->writeAttribute('position', '0'); + + // color + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB()); + $objWriter->endElement(); + + $objWriter->endElement(); + + // stop + $objWriter->startElement('stop'); + $objWriter->writeAttribute('position', '1'); + + // color + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB()); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Pattern Fill + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Fill $pFill Fill style + * @throws Exception + */ + private function _writePatternFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) + { + // fill + $objWriter->startElement('fill'); + + // patternFill + $objWriter->startElement('patternFill'); + $objWriter->writeAttribute('patternType', $pFill->getFillType()); + + if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) { + // fgColor + if ($pFill->getStartColor()->getARGB()) { + $objWriter->startElement('fgColor'); + $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB()); + $objWriter->endElement(); + } + } + if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) { + // bgColor + if ($pFill->getEndColor()->getARGB()) { + $objWriter->startElement('bgColor'); + $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB()); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Font + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Font $pFont Font style + * @throws Exception + */ + private function _writeFont(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Font $pFont = null) + { + // font + $objWriter->startElement('font'); + // Weird! The order of these elements actually makes a difference when opening Excel2007 + // files in Excel2003 with the compatibility pack. It's not documented behaviour, + // and makes for a real WTF! + + // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does + // for conditional formatting). Otherwise it will apparently not be picked up in conditional + // formatting style dialog + if ($pFont->getBold() !== NULL) { + $objWriter->startElement('b'); + $objWriter->writeAttribute('val', $pFont->getBold() ? '1' : '0'); + $objWriter->endElement(); + } + + // Italic + if ($pFont->getItalic() !== NULL) { + $objWriter->startElement('i'); + $objWriter->writeAttribute('val', $pFont->getItalic() ? '1' : '0'); + $objWriter->endElement(); + } + + // Strikethrough + if ($pFont->getStrikethrough() !== NULL) { + $objWriter->startElement('strike'); + $objWriter->writeAttribute('val', $pFont->getStrikethrough() ? '1' : '0'); + $objWriter->endElement(); + } + + // Underline + if ($pFont->getUnderline() !== NULL) { + $objWriter->startElement('u'); + $objWriter->writeAttribute('val', $pFont->getUnderline()); + $objWriter->endElement(); + } + + // Superscript / subscript + if ($pFont->getSuperScript() === TRUE || $pFont->getSubScript() === TRUE) { + $objWriter->startElement('vertAlign'); + if ($pFont->getSuperScript() === TRUE) { + $objWriter->writeAttribute('val', 'superscript'); + } else if ($pFont->getSubScript() === TRUE) { + $objWriter->writeAttribute('val', 'subscript'); + } + $objWriter->endElement(); + } + + // Size + if ($pFont->getSize() !== NULL) { + $objWriter->startElement('sz'); + $objWriter->writeAttribute('val', $pFont->getSize()); + $objWriter->endElement(); + } + + // Foreground color + if ($pFont->getColor()->getARGB() !== NULL) { + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pFont->getColor()->getARGB()); + $objWriter->endElement(); + } + + // Name + if ($pFont->getName() !== NULL) { + $objWriter->startElement('name'); + $objWriter->writeAttribute('val', $pFont->getName()); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Border + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Borders $pBorders Borders style + * @throws Exception + */ + private function _writeBorder(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Borders $pBorders = null) + { + // Write border + $objWriter->startElement('border'); + // Diagonal? + switch ($pBorders->getDiagonalDirection()) { + case PHPExcel_Style_Borders::DIAGONAL_UP: + $objWriter->writeAttribute('diagonalUp', 'true'); + $objWriter->writeAttribute('diagonalDown', 'false'); + break; + case PHPExcel_Style_Borders::DIAGONAL_DOWN: + $objWriter->writeAttribute('diagonalUp', 'false'); + $objWriter->writeAttribute('diagonalDown', 'true'); + break; + case PHPExcel_Style_Borders::DIAGONAL_BOTH: + $objWriter->writeAttribute('diagonalUp', 'true'); + $objWriter->writeAttribute('diagonalDown', 'true'); + break; + } + + // BorderPr + $this->_writeBorderPr($objWriter, 'left', $pBorders->getLeft()); + $this->_writeBorderPr($objWriter, 'right', $pBorders->getRight()); + $this->_writeBorderPr($objWriter, 'top', $pBorders->getTop()); + $this->_writeBorderPr($objWriter, 'bottom', $pBorders->getBottom()); + $this->_writeBorderPr($objWriter, 'diagonal', $pBorders->getDiagonal()); + $objWriter->endElement(); + } + + /** + * Write Cell Style Xf + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style $pStyle Style + * @param PHPExcel $pPHPExcel Workbook + * @throws Exception + */ + private function _writeCellStyleXf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null, PHPExcel $pPHPExcel = null) + { + // xf + $objWriter->startElement('xf'); + $objWriter->writeAttribute('xfId', 0); + $objWriter->writeAttribute('fontId', (int)$this->getParentWriter()->getFontHashTable()->getIndexForHashCode($pStyle->getFont()->getHashCode())); + + if ($pStyle->getNumberFormat()->getBuiltInFormatCode() === false) { + $objWriter->writeAttribute('numFmtId', (int)($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($pStyle->getNumberFormat()->getHashCode()) + 164) ); + } else { + $objWriter->writeAttribute('numFmtId', (int)$pStyle->getNumberFormat()->getBuiltInFormatCode()); + } + + $objWriter->writeAttribute('fillId', (int)$this->getParentWriter()->getFillHashTable()->getIndexForHashCode($pStyle->getFill()->getHashCode())); + $objWriter->writeAttribute('borderId', (int)$this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($pStyle->getBorders()->getHashCode())); + + // Apply styles? + $objWriter->writeAttribute('applyFont', ($pPHPExcel->getDefaultStyle()->getFont()->getHashCode() != $pStyle->getFont()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyNumberFormat', ($pPHPExcel->getDefaultStyle()->getNumberFormat()->getHashCode() != $pStyle->getNumberFormat()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyFill', ($pPHPExcel->getDefaultStyle()->getFill()->getHashCode() != $pStyle->getFill()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyBorder', ($pPHPExcel->getDefaultStyle()->getBorders()->getHashCode() != $pStyle->getBorders()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyAlignment', ($pPHPExcel->getDefaultStyle()->getAlignment()->getHashCode() != $pStyle->getAlignment()->getHashCode()) ? '1' : '0'); + if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->writeAttribute('applyProtection', 'true'); + } + + // alignment + $objWriter->startElement('alignment'); + $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal()); + $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical()); + + $textRotation = 0; + if ($pStyle->getAlignment()->getTextRotation() >= 0) { + $textRotation = $pStyle->getAlignment()->getTextRotation(); + } else if ($pStyle->getAlignment()->getTextRotation() < 0) { + $textRotation = 90 - $pStyle->getAlignment()->getTextRotation(); + } + $objWriter->writeAttribute('textRotation', $textRotation); + + $objWriter->writeAttribute('wrapText', ($pStyle->getAlignment()->getWrapText() ? 'true' : 'false')); + $objWriter->writeAttribute('shrinkToFit', ($pStyle->getAlignment()->getShrinkToFit() ? 'true' : 'false')); + + if ($pStyle->getAlignment()->getIndent() > 0) { + $objWriter->writeAttribute('indent', $pStyle->getAlignment()->getIndent()); + } + $objWriter->endElement(); + + // protection + if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->startElement('protection'); + if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + if ($pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Cell Style Dxf + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style $pStyle Style + * @throws Exception + */ + private function _writeCellStyleDxf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null) + { + // dxf + $objWriter->startElement('dxf'); + + // font + $this->_writeFont($objWriter, $pStyle->getFont()); + + // numFmt + $this->_writeNumFmt($objWriter, $pStyle->getNumberFormat()); + + // fill + $this->_writeFill($objWriter, $pStyle->getFill()); + + // alignment + $objWriter->startElement('alignment'); + if ($pStyle->getAlignment()->getHorizontal() !== NULL) { + $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal()); + } + if ($pStyle->getAlignment()->getVertical() !== NULL) { + $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical()); + } + + if ($pStyle->getAlignment()->getTextRotation() !== NULL) { + $textRotation = 0; + if ($pStyle->getAlignment()->getTextRotation() >= 0) { + $textRotation = $pStyle->getAlignment()->getTextRotation(); + } else if ($pStyle->getAlignment()->getTextRotation() < 0) { + $textRotation = 90 - $pStyle->getAlignment()->getTextRotation(); + } + $objWriter->writeAttribute('textRotation', $textRotation); + } + $objWriter->endElement(); + + // border + $this->_writeBorder($objWriter, $pStyle->getBorders()); + + // protection + if (($pStyle->getProtection()->getLocked() !== NULL) || + ($pStyle->getProtection()->getHidden() !== NULL)) { + if ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT || + $pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->startElement('protection'); + if (($pStyle->getProtection()->getLocked() !== NULL) && + ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) { + $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + if (($pStyle->getProtection()->getHidden() !== NULL) && + ($pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) { + $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + /** + * Write BorderPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pName Element name + * @param PHPExcel_Style_Border $pBorder Border style + * @throws Exception + */ + private function _writeBorderPr(PHPExcel_Shared_XMLWriter $objWriter = null, $pName = 'left', PHPExcel_Style_Border $pBorder = null) + { + // Write BorderPr + if ($pBorder->getBorderStyle() != PHPExcel_Style_Border::BORDER_NONE) { + $objWriter->startElement($pName); + $objWriter->writeAttribute('style', $pBorder->getBorderStyle()); + + // color + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pBorder->getColor()->getARGB()); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Write NumberFormat + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_NumberFormat $pNumberFormat Number Format + * @param int $pId Number Format identifier + * @throws Exception + */ + private function _writeNumFmt(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_NumberFormat $pNumberFormat = null, $pId = 0) + { + // Translate formatcode + $formatCode = $pNumberFormat->getFormatCode(); + + // numFmt + if ($formatCode !== NULL) { + $objWriter->startElement('numFmt'); + $objWriter->writeAttribute('numFmtId', ($pId + 164)); + $objWriter->writeAttribute('formatCode', $formatCode); + $objWriter->endElement(); + } + } + + /** + * Get an array of all styles + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style[] All styles in PHPExcel + * @throws Exception + */ + public function allStyles(PHPExcel $pPHPExcel = null) + { + $aStyles = $pPHPExcel->getCellXfCollection(); + + return $aStyles; + } + + /** + * Get an array of all conditional styles + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Conditional[] All conditional styles in PHPExcel + * @throws Exception + */ + public function allConditionalStyles(PHPExcel $pPHPExcel = null) + { + // Get an array of all styles + $aStyles = array(); + + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + foreach ($pPHPExcel->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) { + foreach ($conditionalStyles as $conditionalStyle) { + $aStyles[] = $conditionalStyle; + } + } + } + + return $aStyles; + } + + /** + * Get an array of all fills + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Fill[] All fills in PHPExcel + * @throws Exception + */ + public function allFills(PHPExcel $pPHPExcel = null) + { + // Get an array of unique fills + $aFills = array(); + + // Two first fills are predefined + $fill0 = new PHPExcel_Style_Fill(); + $fill0->setFillType(PHPExcel_Style_Fill::FILL_NONE); + $aFills[] = $fill0; + + $fill1 = new PHPExcel_Style_Fill(); + $fill1->setFillType(PHPExcel_Style_Fill::FILL_PATTERN_GRAY125); + $aFills[] = $fill1; + // The remaining fills + $aStyles = $this->allStyles($pPHPExcel); + foreach ($aStyles as $style) { + if (!array_key_exists($style->getFill()->getHashCode(), $aFills)) { + $aFills[ $style->getFill()->getHashCode() ] = $style->getFill(); + } + } + + return $aFills; + } + + /** + * Get an array of all fonts + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Font[] All fonts in PHPExcel + * @throws Exception + */ + public function allFonts(PHPExcel $pPHPExcel = null) + { + // Get an array of unique fonts + $aFonts = array(); + $aStyles = $this->allStyles($pPHPExcel); + + foreach ($aStyles as $style) { + if (!array_key_exists($style->getFont()->getHashCode(), $aFonts)) { + $aFonts[ $style->getFont()->getHashCode() ] = $style->getFont(); + } + } + + return $aFonts; + } + + /** + * Get an array of all borders + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Borders[] All borders in PHPExcel + * @throws Exception + */ + public function allBorders(PHPExcel $pPHPExcel = null) + { + // Get an array of unique borders + $aBorders = array(); + $aStyles = $this->allStyles($pPHPExcel); + + foreach ($aStyles as $style) { + if (!array_key_exists($style->getBorders()->getHashCode(), $aBorders)) { + $aBorders[ $style->getBorders()->getHashCode() ] = $style->getBorders(); + } + } + + return $aBorders; + } + + /** + * Get an array of all number formats + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_NumberFormat[] All number formats in PHPExcel + * @throws Exception + */ + public function allNumberFormats(PHPExcel $pPHPExcel = null) + { + // Get an array of unique number formats + $aNumFmts = array(); + $aStyles = $this->allStyles($pPHPExcel); + + foreach ($aStyles as $style) { + if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !array_key_exists($style->getNumberFormat()->getHashCode(), $aNumFmts)) { + $aNumFmts[ $style->getNumberFormat()->getHashCode() ] = $style->getNumberFormat(); + } + } + + return $aNumFmts; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Theme.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Theme.php new file mode 100644 index 000000000..e067efe35 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Theme.php @@ -0,0 +1,871 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_DocProps + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Theme extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Map of Major fonts to write + * @static array of string + * + */ + private static $_majorFonts = array( + 'Jpan' => 'ï¼­ï¼³ Pゴシック', + 'Hang' => 'ë§‘ì€ ê³ ë”•', + 'Hans' => '宋体', + 'Hant' => '新細明體', + 'Arab' => 'Times New Roman', + 'Hebr' => 'Times New Roman', + 'Thai' => 'Tahoma', + 'Ethi' => 'Nyala', + 'Beng' => 'Vrinda', + 'Gujr' => 'Shruti', + 'Khmr' => 'MoolBoran', + 'Knda' => 'Tunga', + 'Guru' => 'Raavi', + 'Cans' => 'Euphemia', + 'Cher' => 'Plantagenet Cherokee', + 'Yiii' => 'Microsoft Yi Baiti', + 'Tibt' => 'Microsoft Himalaya', + 'Thaa' => 'MV Boli', + 'Deva' => 'Mangal', + 'Telu' => 'Gautami', + 'Taml' => 'Latha', + 'Syrc' => 'Estrangelo Edessa', + 'Orya' => 'Kalinga', + 'Mlym' => 'Kartika', + 'Laoo' => 'DokChampa', + 'Sinh' => 'Iskoola Pota', + 'Mong' => 'Mongolian Baiti', + 'Viet' => 'Times New Roman', + 'Uigh' => 'Microsoft Uighur', + 'Geor' => 'Sylfaen', + ); + + /** + * Map of Minor fonts to write + * @static array of string + * + */ + private static $_minorFonts = array( + 'Jpan' => 'ï¼­ï¼³ Pゴシック', + 'Hang' => 'ë§‘ì€ ê³ ë”•', + 'Hans' => '宋体', + 'Hant' => '新細明體', + 'Arab' => 'Arial', + 'Hebr' => 'Arial', + 'Thai' => 'Tahoma', + 'Ethi' => 'Nyala', + 'Beng' => 'Vrinda', + 'Gujr' => 'Shruti', + 'Khmr' => 'DaunPenh', + 'Knda' => 'Tunga', + 'Guru' => 'Raavi', + 'Cans' => 'Euphemia', + 'Cher' => 'Plantagenet Cherokee', + 'Yiii' => 'Microsoft Yi Baiti', + 'Tibt' => 'Microsoft Himalaya', + 'Thaa' => 'MV Boli', + 'Deva' => 'Mangal', + 'Telu' => 'Gautami', + 'Taml' => 'Latha', + 'Syrc' => 'Estrangelo Edessa', + 'Orya' => 'Kalinga', + 'Mlym' => 'Kartika', + 'Laoo' => 'DokChampa', + 'Sinh' => 'Iskoola Pota', + 'Mong' => 'Mongolian Baiti', + 'Viet' => 'Arial', + 'Uigh' => 'Microsoft Uighur', + 'Geor' => 'Sylfaen', + ); + + /** + * Map of core colours + * @static array of string + * + */ + private static $_colourScheme = array( + 'dk2' => '1F497D', + 'lt2' => 'EEECE1', + 'accent1' => '4F81BD', + 'accent2' => 'C0504D', + 'accent3' => '9BBB59', + 'accent4' => '8064A2', + 'accent5' => '4BACC6', + 'accent6' => 'F79646', + 'hlink' => '0000FF', + 'folHlink' => '800080', + ); + + /** + * Write theme to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws Exception + */ + public function writeTheme(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // a:theme + $objWriter->startElement('a:theme'); + $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); + $objWriter->writeAttribute('name', 'Office Theme'); + + // a:themeElements + $objWriter->startElement('a:themeElements'); + + // a:clrScheme + $objWriter->startElement('a:clrScheme'); + $objWriter->writeAttribute('name', 'Office'); + + // a:dk1 + $objWriter->startElement('a:dk1'); + + // a:sysClr + $objWriter->startElement('a:sysClr'); + $objWriter->writeAttribute('val', 'windowText'); + $objWriter->writeAttribute('lastClr', '000000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lt1 + $objWriter->startElement('a:lt1'); + + // a:sysClr + $objWriter->startElement('a:sysClr'); + $objWriter->writeAttribute('val', 'window'); + $objWriter->writeAttribute('lastClr', 'FFFFFF'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:dk2 + $this->_writeColourScheme($objWriter); + + $objWriter->endElement(); + + // a:fontScheme + $objWriter->startElement('a:fontScheme'); + $objWriter->writeAttribute('name', 'Office'); + + // a:majorFont + $objWriter->startElement('a:majorFont'); + $this->_writeFonts($objWriter, 'Cambria', self::$_majorFonts); + $objWriter->endElement(); + + // a:minorFont + $objWriter->startElement('a:minorFont'); + $this->_writeFonts($objWriter, 'Calibri', self::$_minorFonts); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:fmtScheme + $objWriter->startElement('a:fmtScheme'); + $objWriter->writeAttribute('name', 'Office'); + + // a:fillStyleLst + $objWriter->startElement('a:fillStyleLst'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '50000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '300000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '35000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '37000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '300000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '15000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '350000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lin + $objWriter->startElement('a:lin'); + $objWriter->writeAttribute('ang', '16200000'); + $objWriter->writeAttribute('scaled', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '51000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '130000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '80000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '93000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '130000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '94000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '135000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lin + $objWriter->startElement('a:lin'); + $objWriter->writeAttribute('ang', '16200000'); + $objWriter->writeAttribute('scaled', '0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lnStyleLst + $objWriter->startElement('a:lnStyleLst'); + + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '9525'); + $objWriter->writeAttribute('cap', 'flat'); + $objWriter->writeAttribute('cmpd', 'sng'); + $objWriter->writeAttribute('algn', 'ctr'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '95000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '105000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:prstDash + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', 'solid'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '25400'); + $objWriter->writeAttribute('cap', 'flat'); + $objWriter->writeAttribute('cmpd', 'sng'); + $objWriter->writeAttribute('algn', 'ctr'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:prstDash + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', 'solid'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '38100'); + $objWriter->writeAttribute('cap', 'flat'); + $objWriter->writeAttribute('cmpd', 'sng'); + $objWriter->writeAttribute('algn', 'ctr'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:prstDash + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', 'solid'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + + + // a:effectStyleLst + $objWriter->startElement('a:effectStyleLst'); + + // a:effectStyle + $objWriter->startElement('a:effectStyle'); + + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', '40000'); + $objWriter->writeAttribute('dist', '20000'); + $objWriter->writeAttribute('dir', '5400000'); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', '000000'); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', '38000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:effectStyle + $objWriter->startElement('a:effectStyle'); + + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', '40000'); + $objWriter->writeAttribute('dist', '23000'); + $objWriter->writeAttribute('dir', '5400000'); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', '000000'); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', '35000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:effectStyle + $objWriter->startElement('a:effectStyle'); + + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', '40000'); + $objWriter->writeAttribute('dist', '23000'); + $objWriter->writeAttribute('dir', '5400000'); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', '000000'); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', '35000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:scene3d + $objWriter->startElement('a:scene3d'); + + // a:camera + $objWriter->startElement('a:camera'); + $objWriter->writeAttribute('prst', 'orthographicFront'); + + // a:rot + $objWriter->startElement('a:rot'); + $objWriter->writeAttribute('lat', '0'); + $objWriter->writeAttribute('lon', '0'); + $objWriter->writeAttribute('rev', '0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lightRig + $objWriter->startElement('a:lightRig'); + $objWriter->writeAttribute('rig', 'threePt'); + $objWriter->writeAttribute('dir', 't'); + + // a:rot + $objWriter->startElement('a:rot'); + $objWriter->writeAttribute('lat', '0'); + $objWriter->writeAttribute('lon', '0'); + $objWriter->writeAttribute('rev', '1200000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:sp3d + $objWriter->startElement('a:sp3d'); + + // a:bevelT + $objWriter->startElement('a:bevelT'); + $objWriter->writeAttribute('w', '63500'); + $objWriter->writeAttribute('h', '25400'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:bgFillStyleLst + $objWriter->startElement('a:bgFillStyleLst'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '40000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '350000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '40000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '45000'); + $objWriter->endElement(); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '99000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '350000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '20000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '255000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:path + $objWriter->startElement('a:path'); + $objWriter->writeAttribute('path', 'circle'); + + // a:fillToRect + $objWriter->startElement('a:fillToRect'); + $objWriter->writeAttribute('l', '50000'); + $objWriter->writeAttribute('t', '-80000'); + $objWriter->writeAttribute('r', '50000'); + $objWriter->writeAttribute('b', '180000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '80000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '300000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '30000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '200000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:path + $objWriter->startElement('a:path'); + $objWriter->writeAttribute('path', 'circle'); + + // a:fillToRect + $objWriter->startElement('a:fillToRect'); + $objWriter->writeAttribute('l', '50000'); + $objWriter->writeAttribute('t', '50000'); + $objWriter->writeAttribute('r', '50000'); + $objWriter->writeAttribute('b', '50000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:objectDefaults + $objWriter->writeElement('a:objectDefaults', null); + + // a:extraClrSchemeLst + $objWriter->writeElement('a:extraClrSchemeLst', null); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write fonts to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @param string $latinFont + * @param array of string $fontSet + * @return string XML Output + * @throws Exception + */ + private function _writeFonts($objWriter, $latinFont, $fontSet) + { + // a:latin + $objWriter->startElement('a:latin'); + $objWriter->writeAttribute('typeface', $latinFont); + $objWriter->endElement(); + + // a:ea + $objWriter->startElement('a:ea'); + $objWriter->writeAttribute('typeface', ''); + $objWriter->endElement(); + + // a:cs + $objWriter->startElement('a:cs'); + $objWriter->writeAttribute('typeface', ''); + $objWriter->endElement(); + + foreach($fontSet as $fontScript => $typeface) { + $objWriter->startElement('a:font'); + $objWriter->writeAttribute('script', $fontScript); + $objWriter->writeAttribute('typeface', $typeface); + $objWriter->endElement(); + } + + } + + /** + * Write colour scheme to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @return string XML Output + * @throws Exception + */ + private function _writeColourScheme($objWriter) + { + foreach(self::$_colourScheme as $colourName => $colourValue) { + $objWriter->startElement('a:'.$colourName); + + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', $colourValue); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Workbook.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Workbook.php new file mode 100644 index 000000000..bbd2f927e --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Workbook.php @@ -0,0 +1,452 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Workbook + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Workbook extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write workbook to XML format + * + * @param PHPExcel $pPHPExcel + * @param boolean $recalcRequired Indicate whether formulas should be recalculated before writing + * @return string XML Output + * @throws Exception + */ + public function writeWorkbook(PHPExcel $pPHPExcel = null, $recalcRequired = FALSE) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // workbook + $objWriter->startElement('workbook'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + // fileVersion + $this->_writeFileVersion($objWriter); + + // workbookPr + $this->_writeWorkbookPr($objWriter); + + // workbookProtection + $this->_writeWorkbookProtection($objWriter, $pPHPExcel); + + // bookViews + if ($this->getParentWriter()->getOffice2003Compatibility() === false) { + $this->_writeBookViews($objWriter, $pPHPExcel); + } + + // sheets + $this->_writeSheets($objWriter, $pPHPExcel); + + // definedNames + $this->_writeDefinedNames($objWriter, $pPHPExcel); + + // calcPr + $this->_writeCalcPr($objWriter,$recalcRequired); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write file version + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeFileVersion(PHPExcel_Shared_XMLWriter $objWriter = null) + { + $objWriter->startElement('fileVersion'); + $objWriter->writeAttribute('appName', 'xl'); + $objWriter->writeAttribute('lastEdited', '4'); + $objWriter->writeAttribute('lowestEdited', '4'); + $objWriter->writeAttribute('rupBuild', '4505'); + $objWriter->endElement(); + } + + /** + * Write WorkbookPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws Exception + */ + private function _writeWorkbookPr(PHPExcel_Shared_XMLWriter $objWriter = null) + { + $objWriter->startElement('workbookPr'); + + if (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904) { + $objWriter->writeAttribute('date1904', '1'); + } + + $objWriter->writeAttribute('codeName', 'ThisWorkbook'); + + $objWriter->endElement(); + } + + /** + * Write BookViews + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws Exception + */ + private function _writeBookViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + // bookViews + $objWriter->startElement('bookViews'); + + // workbookView + $objWriter->startElement('workbookView'); + + $objWriter->writeAttribute('activeTab', $pPHPExcel->getActiveSheetIndex()); + $objWriter->writeAttribute('autoFilterDateGrouping', '1'); + $objWriter->writeAttribute('firstSheet', '0'); + $objWriter->writeAttribute('minimized', '0'); + $objWriter->writeAttribute('showHorizontalScroll', '1'); + $objWriter->writeAttribute('showSheetTabs', '1'); + $objWriter->writeAttribute('showVerticalScroll', '1'); + $objWriter->writeAttribute('tabRatio', '600'); + $objWriter->writeAttribute('visibility', 'visible'); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write WorkbookProtection + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws Exception + */ + private function _writeWorkbookProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + if ($pPHPExcel->getSecurity()->isSecurityEnabled()) { + $objWriter->startElement('workbookProtection'); + $objWriter->writeAttribute('lockRevision', ($pPHPExcel->getSecurity()->getLockRevision() ? 'true' : 'false')); + $objWriter->writeAttribute('lockStructure', ($pPHPExcel->getSecurity()->getLockStructure() ? 'true' : 'false')); + $objWriter->writeAttribute('lockWindows', ($pPHPExcel->getSecurity()->getLockWindows() ? 'true' : 'false')); + + if ($pPHPExcel->getSecurity()->getRevisionsPassword() != '') { + $objWriter->writeAttribute('revisionsPassword', $pPHPExcel->getSecurity()->getRevisionsPassword()); + } + + if ($pPHPExcel->getSecurity()->getWorkbookPassword() != '') { + $objWriter->writeAttribute('workbookPassword', $pPHPExcel->getSecurity()->getWorkbookPassword()); + } + + $objWriter->endElement(); + } + } + + /** + * Write calcPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param boolean $recalcRequired Indicate whether formulas should be recalculated before writing + * @throws Exception + */ + private function _writeCalcPr(PHPExcel_Shared_XMLWriter $objWriter = null, $recalcRequired = TRUE) + { + $objWriter->startElement('calcPr'); + + $objWriter->writeAttribute('calcId', '124519'); + $objWriter->writeAttribute('calcMode', 'auto'); + // fullCalcOnLoad isn't needed if we've recalculating for the save + $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? '0' : '1'); + + $objWriter->endElement(); + } + + /** + * Write sheets + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws Exception + */ + private function _writeSheets(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + // Write sheets + $objWriter->startElement('sheets'); + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + // sheet + $this->_writeSheet( + $objWriter, + $pPHPExcel->getSheet($i)->getTitle(), + ($i + 1), + ($i + 1 + 3), + $pPHPExcel->getSheet($i)->getSheetState() + ); + } + + $objWriter->endElement(); + } + + /** + * Write sheet + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pSheetname Sheet name + * @param int $pSheetId Sheet id + * @param int $pRelId Relationship ID + * @param string $sheetState Sheet state (visible, hidden, veryHidden) + * @throws Exception + */ + private function _writeSheet(PHPExcel_Shared_XMLWriter $objWriter = null, $pSheetname = '', $pSheetId = 1, $pRelId = 1, $sheetState = 'visible') + { + if ($pSheetname != '') { + // Write sheet + $objWriter->startElement('sheet'); + $objWriter->writeAttribute('name', $pSheetname); + $objWriter->writeAttribute('sheetId', $pSheetId); + if ($sheetState != 'visible' && $sheetState != '') { + $objWriter->writeAttribute('state', $sheetState); + } + $objWriter->writeAttribute('r:id', 'rId' . $pRelId); + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Write Defined Names + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws Exception + */ + private function _writeDefinedNames(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + // Write defined names + $objWriter->startElement('definedNames'); + + // Named ranges + if (count($pPHPExcel->getNamedRanges()) > 0) { + // Named ranges + $this->_writeNamedRanges($objWriter, $pPHPExcel); + } + + // Other defined names + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + // definedName for autoFilter + $this->_writeDefinedNameForAutofilter($objWriter, $pPHPExcel->getSheet($i), $i); + + // definedName for Print_Titles + $this->_writeDefinedNameForPrintTitles($objWriter, $pPHPExcel->getSheet($i), $i); + + // definedName for Print_Area + $this->_writeDefinedNameForPrintArea($objWriter, $pPHPExcel->getSheet($i), $i); + } + + $objWriter->endElement(); + } + + /** + * Write named ranges + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws Exception + */ + private function _writeNamedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel) + { + // Loop named ranges + $namedRanges = $pPHPExcel->getNamedRanges(); + foreach ($namedRanges as $namedRange) { + $this->_writeDefinedNameForNamedRange($objWriter, $namedRange); + } + } + + /** + * Write Defined Name for named range + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_NamedRange $pNamedRange + * @throws Exception + */ + private function _writeDefinedNameForNamedRange(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_NamedRange $pNamedRange) + { + // definedName for named range + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', $pNamedRange->getName()); + if ($pNamedRange->getLocalOnly()) { + $objWriter->writeAttribute('localSheetId', $pNamedRange->getScope()->getParent()->getIndex($pNamedRange->getScope())); + } + + // Create absolute coordinate and write as raw text + $range = PHPExcel_Cell::splitRange($pNamedRange->getRange()); + for ($i = 0; $i < count($range); $i++) { + $range[$i][0] = '\'' . str_replace("'", "''", $pNamedRange->getWorksheet()->getTitle()) . '\'!' . PHPExcel_Cell::absoluteReference($range[$i][0]); + if (isset($range[$i][1])) { + $range[$i][1] = PHPExcel_Cell::absoluteReference($range[$i][1]); + } + } + $range = PHPExcel_Cell::buildRange($range); + + $objWriter->writeRawData($range); + + $objWriter->endElement(); + } + + /** + * Write Defined Name for autoFilter + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet + * @param int $pSheetId + * @throws Exception + */ + private function _writeDefinedNameForAutofilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0) + { + // definedName for autoFilter + $autoFilterRange = $pSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', '_xlnm._FilterDatabase'); + $objWriter->writeAttribute('localSheetId', $pSheetId); + $objWriter->writeAttribute('hidden', '1'); + + // Create absolute coordinate and write as raw text + $range = PHPExcel_Cell::splitRange($autoFilterRange); + $range = $range[0]; + // Strip any worksheet ref so we can make the cell ref absolute + if (strpos($range[0],'!') !== false) { + list($ws,$range[0]) = explode('!',$range[0]); + } + + $range[0] = PHPExcel_Cell::absoluteCoordinate($range[0]); + $range[1] = PHPExcel_Cell::absoluteCoordinate($range[1]); + $range = implode(':', $range); + + $objWriter->writeRawData('\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . $range); + + $objWriter->endElement(); + } + } + + /** + * Write Defined Name for PrintTitles + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet + * @param int $pSheetId + * @throws Exception + */ + private function _writeDefinedNameForPrintTitles(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0) + { + // definedName for PrintTitles + if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet() || $pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) { + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', '_xlnm.Print_Titles'); + $objWriter->writeAttribute('localSheetId', $pSheetId); + + // Setting string + $settingString = ''; + + // Columns to repeat + if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) { + $repeat = $pSheet->getPageSetup()->getColumnsToRepeatAtLeft(); + + $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1]; + } + + // Rows to repeat + if ($pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) { + if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) { + $settingString .= ','; + } + + $repeat = $pSheet->getPageSetup()->getRowsToRepeatAtTop(); + + $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1]; + } + + $objWriter->writeRawData($settingString); + + $objWriter->endElement(); + } + } + + /** + * Write Defined Name for PrintTitles + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet + * @param int $pSheetId + * @throws Exception + */ + private function _writeDefinedNameForPrintArea(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0) + { + // definedName for PrintArea + if ($pSheet->getPageSetup()->isPrintAreaSet()) { + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', '_xlnm.Print_Area'); + $objWriter->writeAttribute('localSheetId', $pSheetId); + + // Setting string + $settingString = ''; + + // Print area + $printArea = PHPExcel_Cell::splitRange($pSheet->getPageSetup()->getPrintArea()); + + $chunks = array(); + foreach ($printArea as $printAreaRect) { + $printAreaRect[0] = PHPExcel_Cell::absoluteReference($printAreaRect[0]); + $printAreaRect[1] = PHPExcel_Cell::absoluteReference($printAreaRect[1]); + $chunks[] = '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . implode(':', $printAreaRect); + } + + $objWriter->writeRawData(implode(',', $chunks)); + + $objWriter->endElement(); + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Worksheet.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Worksheet.php new file mode 100644 index 000000000..f720af338 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/Worksheet.php @@ -0,0 +1,1215 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_Worksheet + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write worksheet to XML format + * + * @param PHPExcel_Worksheet $pSheet + * @param string[] $pStringTable + * @param boolean $includeCharts Flag indicating if we should write charts + * @return string XML Output + * @throws Exception + */ + public function writeWorksheet($pSheet = null, $pStringTable = null, $includeCharts = FALSE) + { + if (!is_null($pSheet)) { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Worksheet + $objWriter->startElement('worksheet'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + // sheetPr + $this->_writeSheetPr($objWriter, $pSheet); + + // Dimension + $this->_writeDimension($objWriter, $pSheet); + + // sheetViews + $this->_writeSheetViews($objWriter, $pSheet); + + // sheetFormatPr + $this->_writeSheetFormatPr($objWriter, $pSheet); + + // cols + $this->_writeCols($objWriter, $pSheet); + + // sheetData + $this->_writeSheetData($objWriter, $pSheet, $pStringTable); + + // sheetProtection + $this->_writeSheetProtection($objWriter, $pSheet); + + // protectedRanges + $this->_writeProtectedRanges($objWriter, $pSheet); + + // autoFilter + $this->_writeAutoFilter($objWriter, $pSheet); + + // mergeCells + $this->_writeMergeCells($objWriter, $pSheet); + + // conditionalFormatting + $this->_writeConditionalFormatting($objWriter, $pSheet); + + // dataValidations + $this->_writeDataValidations($objWriter, $pSheet); + + // hyperlinks + $this->_writeHyperlinks($objWriter, $pSheet); + + // Print options + $this->_writePrintOptions($objWriter, $pSheet); + + // Page margins + $this->_writePageMargins($objWriter, $pSheet); + + // Page setup + $this->_writePageSetup($objWriter, $pSheet); + + // Header / footer + $this->_writeHeaderFooter($objWriter, $pSheet); + + // Breaks + $this->_writeBreaks($objWriter, $pSheet); + + // Drawings and/or Charts + $this->_writeDrawings($objWriter, $pSheet, $includeCharts); + + // LegacyDrawing + $this->_writeLegacyDrawing($objWriter, $pSheet); + + // LegacyDrawingHF + $this->_writeLegacyDrawingHF($objWriter, $pSheet); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } else { + throw new Exception("Invalid PHPExcel_Worksheet object passed."); + } + } + + /** + * Write SheetPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeSheetPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetPr + $objWriter->startElement('sheetPr'); + //$objWriter->writeAttribute('codeName', $pSheet->getTitle()); + $autoFilterRange = $pSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + $objWriter->writeAttribute('filterMode', 1); + $pSheet->getAutoFilter()->showHideRows(); + } + + // tabColor + if ($pSheet->isTabColorSet()) { + $objWriter->startElement('tabColor'); + $objWriter->writeAttribute('rgb', $pSheet->getTabColor()->getARGB()); + $objWriter->endElement(); + } + + // outlinePr + $objWriter->startElement('outlinePr'); + $objWriter->writeAttribute('summaryBelow', ($pSheet->getShowSummaryBelow() ? '1' : '0')); + $objWriter->writeAttribute('summaryRight', ($pSheet->getShowSummaryRight() ? '1' : '0')); + $objWriter->endElement(); + + // pageSetUpPr + if ($pSheet->getPageSetup()->getFitToPage()) { + $objWriter->startElement('pageSetUpPr'); + $objWriter->writeAttribute('fitToPage', '1'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Dimension + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeDimension(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // dimension + $objWriter->startElement('dimension'); + $objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension()); + $objWriter->endElement(); + } + + /** + * Write SheetViews + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeSheetViews(PHPExcel_Shared_XMLWriter $objWriter = NULL, PHPExcel_Worksheet $pSheet = NULL) + { + // sheetViews + $objWriter->startElement('sheetViews'); + + // Sheet selected? + $sheetSelected = false; + if ($this->getParentWriter()->getPHPExcel()->getIndex($pSheet) == $this->getParentWriter()->getPHPExcel()->getActiveSheetIndex()) + $sheetSelected = true; + + + // sheetView + $objWriter->startElement('sheetView'); + $objWriter->writeAttribute('tabSelected', $sheetSelected ? '1' : '0'); + $objWriter->writeAttribute('workbookViewId', '0'); + + // Zoom scales + if ($pSheet->getSheetView()->getZoomScale() != 100) { + $objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale()); + } + if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) { + $objWriter->writeAttribute('zoomScaleNormal', $pSheet->getSheetView()->getZoomScaleNormal()); + } + + // View Layout Type + if ($pSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL) { + $objWriter->writeAttribute('view', $pSheet->getSheetView()->getView()); + } + + // Gridlines + if ($pSheet->getShowGridlines()) { + $objWriter->writeAttribute('showGridLines', 'true'); + } else { + $objWriter->writeAttribute('showGridLines', 'false'); + } + + // Row and column headers + if ($pSheet->getShowRowColHeaders()) { + $objWriter->writeAttribute('showRowColHeaders', '1'); + } else { + $objWriter->writeAttribute('showRowColHeaders', '0'); + } + + // Right-to-left + if ($pSheet->getRightToLeft()) { + $objWriter->writeAttribute('rightToLeft', 'true'); + } + + $activeCell = $pSheet->getActiveCell(); + + // Pane + $pane = ''; + $topLeftCell = $pSheet->getFreezePane(); + if (($topLeftCell != '') && ($topLeftCell != 'A1')) { + $activeCell = $topLeftCell; + // Calculate freeze coordinates + $xSplit = $ySplit = 0; + + list($xSplit, $ySplit) = PHPExcel_Cell::coordinateFromString($topLeftCell); + $xSplit = PHPExcel_Cell::columnIndexFromString($xSplit); + + // pane + $pane = 'topRight'; + $objWriter->startElement('pane'); + if ($xSplit > 1) + $objWriter->writeAttribute('xSplit', $xSplit - 1); + if ($ySplit > 1) { + $objWriter->writeAttribute('ySplit', $ySplit - 1); + $pane = ($xSplit > 1) ? 'bottomRight' : 'bottomLeft'; + } + $objWriter->writeAttribute('topLeftCell', $topLeftCell); + $objWriter->writeAttribute('activePane', $pane); + $objWriter->writeAttribute('state', 'frozen'); + $objWriter->endElement(); + + if (($xSplit > 1) && ($ySplit > 1)) { + // Write additional selections if more than two panes (ie both an X and a Y split) + $objWriter->startElement('selection'); $objWriter->writeAttribute('pane', 'topRight'); $objWriter->endElement(); + $objWriter->startElement('selection'); $objWriter->writeAttribute('pane', 'bottomLeft'); $objWriter->endElement(); + } + } + + // Selection +// if ($pane != '') { + // Only need to write selection element if we have a split pane + // We cheat a little by over-riding the active cell selection, setting it to the split cell + $objWriter->startElement('selection'); + if ($pane != '') { + $objWriter->writeAttribute('pane', $pane); + } + $objWriter->writeAttribute('activeCell', $activeCell); + $objWriter->writeAttribute('sqref', $activeCell); + $objWriter->endElement(); +// } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write SheetFormatPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeSheetFormatPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetFormatPr + $objWriter->startElement('sheetFormatPr'); + + // Default row height + if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) { + $objWriter->writeAttribute('customHeight', 'true'); + $objWriter->writeAttribute('defaultRowHeight', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultRowDimension()->getRowHeight())); + } else { + $objWriter->writeAttribute('defaultRowHeight', '14.4'); + } + + // Set Zero Height row + if ((string)$pSheet->getDefaultRowDimension()->getzeroHeight() == '1' || + strtolower((string)$pSheet->getDefaultRowDimension()->getzeroHeight()) == 'true' ) { + $objWriter->writeAttribute('zeroHeight', '1'); + } + + // Default column width + if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) { + $objWriter->writeAttribute('defaultColWidth', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultColumnDimension()->getWidth())); + } + + // Outline level - row + $outlineLevelRow = 0; + foreach ($pSheet->getRowDimensions() as $dimension) { + if ($dimension->getOutlineLevel() > $outlineLevelRow) { + $outlineLevelRow = $dimension->getOutlineLevel(); + } + } + $objWriter->writeAttribute('outlineLevelRow', (int)$outlineLevelRow); + + // Outline level - column + $outlineLevelCol = 0; + foreach ($pSheet->getColumnDimensions() as $dimension) { + if ($dimension->getOutlineLevel() > $outlineLevelCol) { + $outlineLevelCol = $dimension->getOutlineLevel(); + } + } + $objWriter->writeAttribute('outlineLevelCol', (int)$outlineLevelCol); + + $objWriter->endElement(); + } + + /** + * Write Cols + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeCols(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // cols + if (count($pSheet->getColumnDimensions()) > 0) { + $objWriter->startElement('cols'); + + $pSheet->calculateColumnWidths(); + + // Loop through column dimensions + foreach ($pSheet->getColumnDimensions() as $colDimension) { + // col + $objWriter->startElement('col'); + $objWriter->writeAttribute('min', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex())); + $objWriter->writeAttribute('max', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex())); + + if ($colDimension->getWidth() < 0) { + // No width set, apply default of 10 + $objWriter->writeAttribute('width', '9.10'); + } else { + // Width set + $objWriter->writeAttribute('width', PHPExcel_Shared_String::FormatNumber($colDimension->getWidth())); + } + + // Column visibility + if ($colDimension->getVisible() == false) { + $objWriter->writeAttribute('hidden', 'true'); + } + + // Auto size? + if ($colDimension->getAutoSize()) { + $objWriter->writeAttribute('bestFit', 'true'); + } + + // Custom width? + if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) { + $objWriter->writeAttribute('customWidth', 'true'); + } + + // Collapsed + if ($colDimension->getCollapsed() == true) { + $objWriter->writeAttribute('collapsed', 'true'); + } + + // Outline level + if ($colDimension->getOutlineLevel() > 0) { + $objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel()); + } + + // Style + $objWriter->writeAttribute('style', $colDimension->getXfIndex()); + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write SheetProtection + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeSheetProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetProtection + $objWriter->startElement('sheetProtection'); + + if ($pSheet->getProtection()->getPassword() != '') { + $objWriter->writeAttribute('password', $pSheet->getProtection()->getPassword()); + } + + $objWriter->writeAttribute('sheet', ($pSheet->getProtection()->getSheet() ? 'true' : 'false')); + $objWriter->writeAttribute('objects', ($pSheet->getProtection()->getObjects() ? 'true' : 'false')); + $objWriter->writeAttribute('scenarios', ($pSheet->getProtection()->getScenarios() ? 'true' : 'false')); + $objWriter->writeAttribute('formatCells', ($pSheet->getProtection()->getFormatCells() ? 'true' : 'false')); + $objWriter->writeAttribute('formatColumns', ($pSheet->getProtection()->getFormatColumns() ? 'true' : 'false')); + $objWriter->writeAttribute('formatRows', ($pSheet->getProtection()->getFormatRows() ? 'true' : 'false')); + $objWriter->writeAttribute('insertColumns', ($pSheet->getProtection()->getInsertColumns() ? 'true' : 'false')); + $objWriter->writeAttribute('insertRows', ($pSheet->getProtection()->getInsertRows() ? 'true' : 'false')); + $objWriter->writeAttribute('insertHyperlinks', ($pSheet->getProtection()->getInsertHyperlinks() ? 'true' : 'false')); + $objWriter->writeAttribute('deleteColumns', ($pSheet->getProtection()->getDeleteColumns() ? 'true' : 'false')); + $objWriter->writeAttribute('deleteRows', ($pSheet->getProtection()->getDeleteRows() ? 'true' : 'false')); + $objWriter->writeAttribute('selectLockedCells', ($pSheet->getProtection()->getSelectLockedCells() ? 'true' : 'false')); + $objWriter->writeAttribute('sort', ($pSheet->getProtection()->getSort() ? 'true' : 'false')); + $objWriter->writeAttribute('autoFilter', ($pSheet->getProtection()->getAutoFilter() ? 'true' : 'false')); + $objWriter->writeAttribute('pivotTables', ($pSheet->getProtection()->getPivotTables() ? 'true' : 'false')); + $objWriter->writeAttribute('selectUnlockedCells', ($pSheet->getProtection()->getSelectUnlockedCells() ? 'true' : 'false')); + $objWriter->endElement(); + } + + /** + * Write ConditionalFormatting + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeConditionalFormatting(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Conditional id + $id = 1; + + // Loop through styles in the current worksheet + foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) { + foreach ($conditionalStyles as $conditional) { + // WHY was this again? + // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ) == '') { + // continue; + // } + if ($conditional->getConditionType() != PHPExcel_Style_Conditional::CONDITION_NONE) { + // conditionalFormatting + $objWriter->startElement('conditionalFormatting'); + $objWriter->writeAttribute('sqref', $cellCoordinate); + + // cfRule + $objWriter->startElement('cfRule'); + $objWriter->writeAttribute('type', $conditional->getConditionType()); + $objWriter->writeAttribute('dxfId', $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() )); + $objWriter->writeAttribute('priority', $id++); + + if (($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS + || + $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT) + && $conditional->getOperatorType() != PHPExcel_Style_Conditional::OPERATOR_NONE) { + $objWriter->writeAttribute('operator', $conditional->getOperatorType()); + } + + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && !is_null($conditional->getText())) { + $objWriter->writeAttribute('text', $conditional->getText()); + } + + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . ')))'); + } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BEGINSWITH + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"'); + } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_ENDSWITH + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"'); + } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_NOTCONTAINS + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . '))'); + } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS + || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) { + foreach ($conditional->getConditions() as $formula) { + // Formula + $objWriter->writeElement('formula', $formula); + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + } + } + + /** + * Write DataValidations + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeDataValidations(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Datavalidation collection + $dataValidationCollection = $pSheet->getDataValidationCollection(); + + // Write data validations? + if (!empty($dataValidationCollection)) { + $objWriter->startElement('dataValidations'); + $objWriter->writeAttribute('count', count($dataValidationCollection)); + + foreach ($dataValidationCollection as $coordinate => $dv) { + $objWriter->startElement('dataValidation'); + + if ($dv->getType() != '') { + $objWriter->writeAttribute('type', $dv->getType()); + } + + if ($dv->getErrorStyle() != '') { + $objWriter->writeAttribute('errorStyle', $dv->getErrorStyle()); + } + + if ($dv->getOperator() != '') { + $objWriter->writeAttribute('operator', $dv->getOperator()); + } + + $objWriter->writeAttribute('allowBlank', ($dv->getAllowBlank() ? '1' : '0')); + $objWriter->writeAttribute('showDropDown', (!$dv->getShowDropDown() ? '1' : '0')); + $objWriter->writeAttribute('showInputMessage', ($dv->getShowInputMessage() ? '1' : '0')); + $objWriter->writeAttribute('showErrorMessage', ($dv->getShowErrorMessage() ? '1' : '0')); + + if ($dv->getErrorTitle() !== '') { + $objWriter->writeAttribute('errorTitle', $dv->getErrorTitle()); + } + if ($dv->getError() !== '') { + $objWriter->writeAttribute('error', $dv->getError()); + } + if ($dv->getPromptTitle() !== '') { + $objWriter->writeAttribute('promptTitle', $dv->getPromptTitle()); + } + if ($dv->getPrompt() !== '') { + $objWriter->writeAttribute('prompt', $dv->getPrompt()); + } + + $objWriter->writeAttribute('sqref', $coordinate); + + if ($dv->getFormula1() !== '') { + $objWriter->writeElement('formula1', $dv->getFormula1()); + } + if ($dv->getFormula2() !== '') { + $objWriter->writeElement('formula2', $dv->getFormula2()); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write Hyperlinks + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeHyperlinks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Hyperlink collection + $hyperlinkCollection = $pSheet->getHyperlinkCollection(); + + // Relation ID + $relationId = 1; + + // Write hyperlinks? + if (!empty($hyperlinkCollection)) { + $objWriter->startElement('hyperlinks'); + + foreach ($hyperlinkCollection as $coordinate => $hyperlink) { + $objWriter->startElement('hyperlink'); + + $objWriter->writeAttribute('ref', $coordinate); + if (!$hyperlink->isInternal()) { + $objWriter->writeAttribute('r:id', 'rId_hyperlink_' . $relationId); + ++$relationId; + } else { + $objWriter->writeAttribute('location', str_replace('sheet://', '', $hyperlink->getUrl())); + } + + if ($hyperlink->getTooltip() != '') { + $objWriter->writeAttribute('tooltip', $hyperlink->getTooltip()); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write ProtectedRanges + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeProtectedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + if (count($pSheet->getProtectedCells()) > 0) { + // protectedRanges + $objWriter->startElement('protectedRanges'); + + // Loop protectedRanges + foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) { + // protectedRange + $objWriter->startElement('protectedRange'); + $objWriter->writeAttribute('name', 'p' . md5($protectedCell)); + $objWriter->writeAttribute('sqref', $protectedCell); + $objWriter->writeAttribute('password', $passwordHash); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write MergeCells + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeMergeCells(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + if (count($pSheet->getMergeCells()) > 0) { + // mergeCells + $objWriter->startElement('mergeCells'); + + // Loop mergeCells + foreach ($pSheet->getMergeCells() as $mergeCell) { + // mergeCell + $objWriter->startElement('mergeCell'); + $objWriter->writeAttribute('ref', $mergeCell); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write PrintOptions + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writePrintOptions(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // printOptions + $objWriter->startElement('printOptions'); + + $objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true': 'false')); + $objWriter->writeAttribute('gridLinesSet', 'true'); + + if ($pSheet->getPageSetup()->getHorizontalCentered()) { + $objWriter->writeAttribute('horizontalCentered', 'true'); + } + + if ($pSheet->getPageSetup()->getVerticalCentered()) { + $objWriter->writeAttribute('verticalCentered', 'true'); + } + + $objWriter->endElement(); + } + + /** + * Write PageMargins + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writePageMargins(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // pageMargins + $objWriter->startElement('pageMargins'); + $objWriter->writeAttribute('left', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft())); + $objWriter->writeAttribute('right', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight())); + $objWriter->writeAttribute('top', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop())); + $objWriter->writeAttribute('bottom', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom())); + $objWriter->writeAttribute('header', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getHeader())); + $objWriter->writeAttribute('footer', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getFooter())); + $objWriter->endElement(); + } + + /** + * Write AutoFilter + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeAutoFilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + $autoFilterRange = $pSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + // autoFilter + $objWriter->startElement('autoFilter'); + + // Strip any worksheet reference from the filter coordinates + $range = PHPExcel_Cell::splitRange($autoFilterRange); + $range = $range[0]; + // Strip any worksheet ref + if (strpos($range[0],'!') !== false) { + list($ws,$range[0]) = explode('!',$range[0]); + } + $range = implode(':', $range); + + $objWriter->writeAttribute('ref', str_replace('$','',$range)); + + $columns = $pSheet->getAutoFilter()->getColumns(); + if (count($columns > 0)) { + foreach($columns as $columnID => $column) { + $rules = $column->getRules(); + if (count($rules > 0)) { + $objWriter->startElement('filterColumn'); + $objWriter->writeAttribute('colId', $pSheet->getAutoFilter()->getColumnOffset($columnID)); + + $objWriter->startElement( $column->getFilterType()); + if ($column->getJoin() == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND) { + $objWriter->writeAttribute('and', 1); + } + + foreach ($rules as $rule) { + if (($column->getFilterType() === PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) && + ($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) && + ($rule->getValue() === '')) { + // Filter rule for Blanks + $objWriter->writeAttribute('blank', 1); + } elseif($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) { + // Dynamic Filter Rule + $objWriter->writeAttribute('type', $rule->getGrouping()); + $val = $column->getAttribute('val'); + if ($val !== NULL) { + $objWriter->writeAttribute('val', $val); + } + $maxVal = $column->getAttribute('maxVal'); + if ($maxVal !== NULL) { + $objWriter->writeAttribute('maxVal', $maxVal); + } + } elseif($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) { + // Top 10 Filter Rule + $objWriter->writeAttribute('val', $rule->getValue()); + $objWriter->writeAttribute('percent', (($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0')); + $objWriter->writeAttribute('top', (($rule->getGrouping() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1': '0')); + } else { + // Filter, DateGroupItem or CustomFilter + $objWriter->startElement($rule->getRuleType()); + + if ($rule->getOperator() !== PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) { + $objWriter->writeAttribute('operator', $rule->getOperator()); + } + if ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP) { + // Date Group filters + foreach($rule->getValue() as $key => $value) { + if ($value > '') $objWriter->writeAttribute($key, $value); + } + $objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping()); + } else { + $objWriter->writeAttribute('val', $rule->getValue()); + } + + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + } + + $objWriter->endElement(); + } + } + + /** + * Write PageSetup + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writePageSetup(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // pageSetup + $objWriter->startElement('pageSetup'); + $objWriter->writeAttribute('paperSize', $pSheet->getPageSetup()->getPaperSize()); + $objWriter->writeAttribute('orientation', $pSheet->getPageSetup()->getOrientation()); + + if (!is_null($pSheet->getPageSetup()->getScale())) { + $objWriter->writeAttribute('scale', $pSheet->getPageSetup()->getScale()); + } + if (!is_null($pSheet->getPageSetup()->getFitToHeight())) { + $objWriter->writeAttribute('fitToHeight', $pSheet->getPageSetup()->getFitToHeight()); + } else { + $objWriter->writeAttribute('fitToHeight', '0'); + } + if (!is_null($pSheet->getPageSetup()->getFitToWidth())) { + $objWriter->writeAttribute('fitToWidth', $pSheet->getPageSetup()->getFitToWidth()); + } else { + $objWriter->writeAttribute('fitToWidth', '0'); + } + if (!is_null($pSheet->getPageSetup()->getFirstPageNumber())) { + $objWriter->writeAttribute('firstPageNumber', $pSheet->getPageSetup()->getFirstPageNumber()); + $objWriter->writeAttribute('useFirstPageNumber', '1'); + } + + $objWriter->endElement(); + } + + /** + * Write Header / Footer + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeHeaderFooter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // headerFooter + $objWriter->startElement('headerFooter'); + $objWriter->writeAttribute('differentOddEven', ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false')); + $objWriter->writeAttribute('differentFirst', ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false')); + $objWriter->writeAttribute('scaleWithDoc', ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false')); + $objWriter->writeAttribute('alignWithMargins', ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false')); + + $objWriter->writeElement('oddHeader', $pSheet->getHeaderFooter()->getOddHeader()); + $objWriter->writeElement('oddFooter', $pSheet->getHeaderFooter()->getOddFooter()); + $objWriter->writeElement('evenHeader', $pSheet->getHeaderFooter()->getEvenHeader()); + $objWriter->writeElement('evenFooter', $pSheet->getHeaderFooter()->getEvenFooter()); + $objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader()); + $objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter()); + $objWriter->endElement(); + } + + /** + * Write Breaks + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeBreaks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Get row and column breaks + $aRowBreaks = array(); + $aColumnBreaks = array(); + foreach ($pSheet->getBreaks() as $cell => $breakType) { + if ($breakType == PHPExcel_Worksheet::BREAK_ROW) { + $aRowBreaks[] = $cell; + } else if ($breakType == PHPExcel_Worksheet::BREAK_COLUMN) { + $aColumnBreaks[] = $cell; + } + } + + // rowBreaks + if (!empty($aRowBreaks)) { + $objWriter->startElement('rowBreaks'); + $objWriter->writeAttribute('count', count($aRowBreaks)); + $objWriter->writeAttribute('manualBreakCount', count($aRowBreaks)); + + foreach ($aRowBreaks as $cell) { + $coords = PHPExcel_Cell::coordinateFromString($cell); + + $objWriter->startElement('brk'); + $objWriter->writeAttribute('id', $coords[1]); + $objWriter->writeAttribute('man', '1'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + // Second, write column breaks + if (!empty($aColumnBreaks)) { + $objWriter->startElement('colBreaks'); + $objWriter->writeAttribute('count', count($aColumnBreaks)); + $objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks)); + + foreach ($aColumnBreaks as $cell) { + $coords = PHPExcel_Cell::coordinateFromString($cell); + + $objWriter->startElement('brk'); + $objWriter->writeAttribute('id', PHPExcel_Cell::columnIndexFromString($coords[0]) - 1); + $objWriter->writeAttribute('man', '1'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write SheetData + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param string[] $pStringTable String table + * @throws Exception + */ + private function _writeSheetData(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pStringTable = null) + { + if (is_array($pStringTable)) { + // Flipped stringtable, for faster index searching + $aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable); + + // sheetData + $objWriter->startElement('sheetData'); + + // Get column count + $colCount = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn()); + + // Highest row number + $highestRow = $pSheet->getHighestRow(); + + // Loop through cells + $cellsByRow = array(); + foreach ($pSheet->getCellCollection() as $cellID) { + $cellAddress = PHPExcel_Cell::coordinateFromString($cellID); + $cellsByRow[$cellAddress[1]][] = $cellID; + } + + $currentRow = 0; + while($currentRow++ < $highestRow) { + // Get row dimension + $rowDimension = $pSheet->getRowDimension($currentRow); + + // Write current row? + $writeCurrentRow = isset($cellsByRow[$currentRow]) || + $rowDimension->getRowHeight() >= 0 || + $rowDimension->getVisible() == false || + $rowDimension->getCollapsed() == true || + $rowDimension->getOutlineLevel() > 0 || + $rowDimension->getXfIndex() !== null; + + if ($writeCurrentRow) { + // Start a new row + $objWriter->startElement('row'); + $objWriter->writeAttribute('r', $currentRow); + $objWriter->writeAttribute('spans', '1:' . $colCount); + + // Row dimensions + if ($rowDimension->getRowHeight() >= 0) { + $objWriter->writeAttribute('customHeight', '1'); + $objWriter->writeAttribute('ht', PHPExcel_Shared_String::FormatNumber($rowDimension->getRowHeight())); + } + + // Row visibility + if ($rowDimension->getVisible() == false) { + $objWriter->writeAttribute('hidden', 'true'); + } + + // Collapsed + if ($rowDimension->getCollapsed() == true) { + $objWriter->writeAttribute('collapsed', 'true'); + } + + // Outline level + if ($rowDimension->getOutlineLevel() > 0) { + $objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel()); + } + + // Style + if ($rowDimension->getXfIndex() !== null) { + $objWriter->writeAttribute('s', $rowDimension->getXfIndex()); + $objWriter->writeAttribute('customFormat', '1'); + } + + // Write cells + if (isset($cellsByRow[$currentRow])) { + foreach($cellsByRow[$currentRow] as $cellAddress) { + // Write cell + $this->_writeCell($objWriter, $pSheet, $cellAddress, $pStringTable, $aFlippedStringTable); + } + } + + // End row + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Write Cell + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param PHPExcel_Cell $pCellAddress Cell Address + * @param string[] $pStringTable String table + * @param string[] $pFlippedStringTable String table (flipped), for faster index searching + * @throws Exception + */ + private function _writeCell(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pCellAddress = null, $pStringTable = null, $pFlippedStringTable = null) + { + if (is_array($pStringTable) && is_array($pFlippedStringTable)) { + // Cell + $pCell = $pSheet->getCell($pCellAddress); + $objWriter->startElement('c'); + $objWriter->writeAttribute('r', $pCellAddress); + + // Sheet styles + if ($pCell->getXfIndex() != '') { + $objWriter->writeAttribute('s', $pCell->getXfIndex()); + } + + // If cell value is supplied, write cell value + $cellValue = $pCell->getValue(); + if (is_object($cellValue) || $cellValue !== '') { + // Map type + $mappedType = $pCell->getDataType(); + + // Write data type depending on its type + switch (strtolower($mappedType)) { + case 'inlinestr': // Inline string + case 's': // String + case 'b': // Boolean + $objWriter->writeAttribute('t', $mappedType); + break; + case 'f': // Formula + $calculatedValue = null; + if ($this->getParentWriter()->getPreCalculateFormulas()) { + $calculatedValue = $pCell->getCalculatedValue(); + } else { + $calculatedValue = $cellValue; + } + if (is_string($calculatedValue)) { + $objWriter->writeAttribute('t', 'str'); + } + break; + case 'e': // Error + $objWriter->writeAttribute('t', $mappedType); + } + + // Write data depending on its type + switch (strtolower($mappedType)) { + case 'inlinestr': // Inline string + if (! $cellValue instanceof PHPExcel_RichText) { + $objWriter->writeElement('t', PHPExcel_Shared_String::ControlCharacterPHP2OOXML( htmlspecialchars($cellValue) ) ); + } else if ($cellValue instanceof PHPExcel_RichText) { + $objWriter->startElement('is'); + $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue); + $objWriter->endElement(); + } + + break; + case 's': // String + if (! $cellValue instanceof PHPExcel_RichText) { + if (isset($pFlippedStringTable[$cellValue])) { + $objWriter->writeElement('v', $pFlippedStringTable[$cellValue]); + } + } else if ($cellValue instanceof PHPExcel_RichText) { + $objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]); + } + + break; + case 'f': // Formula + $attributes = $pCell->getFormulaAttributes(); + if($attributes['t'] == 'array') { + $objWriter->startElement('f'); + $objWriter->writeAttribute('t', 'array'); + $objWriter->writeAttribute('ref', $pCellAddress); + $objWriter->writeAttribute('aca', '1'); + $objWriter->writeAttribute('ca', '1'); + $objWriter->text(substr($cellValue, 1)); + $objWriter->endElement(); + } else { + $objWriter->writeElement('f', substr($cellValue, 1)); + } + if ($this->getParentWriter()->getOffice2003Compatibility() === false) { + if ($this->getParentWriter()->getPreCalculateFormulas()) { + $calculatedValue = $pCell->getCalculatedValue(); + if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') { + $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue)); + } else { + $objWriter->writeElement('v', '0'); + } + } else { + $objWriter->writeElement('v', '0'); + } + } + break; + case 'n': // Numeric + // force point as decimal separator in case current locale uses comma + $objWriter->writeElement('v', str_replace(',', '.', $cellValue)); + break; + case 'b': // Boolean + $objWriter->writeElement('v', ($cellValue ? '1' : '0')); + break; + case 'e': // Error + if (substr($cellValue, 0, 1) == '=') { + $objWriter->writeElement('f', substr($cellValue, 1)); + $objWriter->writeElement('v', substr($cellValue, 1)); + } else { + $objWriter->writeElement('v', $cellValue); + } + + break; + } + } + + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Write Drawings + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param boolean $includeCharts Flag indicating if we should include drawing details for charts + * @throws Exception + */ + private function _writeDrawings(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $includeCharts = FALSE) + { + $chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0; + // If sheet contains drawings, add the relationships + if (($pSheet->getDrawingCollection()->count() > 0) || + ($chartCount > 0)) { + $objWriter->startElement('drawing'); + $objWriter->writeAttribute('r:id', 'rId1'); + $objWriter->endElement(); + } + } + + /** + * Write LegacyDrawing + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeLegacyDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // If sheet contains comments, add the relationships + if (count($pSheet->getComments()) > 0) { + $objWriter->startElement('legacyDrawing'); + $objWriter->writeAttribute('r:id', 'rId_comments_vml1'); + $objWriter->endElement(); + } + } + + /** + * Write LegacyDrawingHF + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws Exception + */ + private function _writeLegacyDrawingHF(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // If sheet contains images, add the relationships + if (count($pSheet->getHeaderFooter()->getImages()) > 0) { + $objWriter->startElement('legacyDrawingHF'); + $objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1'); + $objWriter->endElement(); + } + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/WriterPart.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/WriterPart.php new file mode 100644 index 000000000..3f5069182 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel2007/WriterPart.php @@ -0,0 +1,81 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel2007_WriterPart + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +abstract class PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Parent IWriter object + * + * @var PHPExcel_Writer_IWriter + */ + private $_parentWriter; + + /** + * Set parent IWriter object + * + * @param PHPExcel_Writer_IWriter $pWriter + * @throws Exception + */ + public function setParentWriter(PHPExcel_Writer_IWriter $pWriter = null) { + $this->_parentWriter = $pWriter; + } + + /** + * Get parent IWriter object + * + * @return PHPExcel_Writer_IWriter + * @throws Exception + */ + public function getParentWriter() { + if (!is_null($this->_parentWriter)) { + return $this->_parentWriter; + } else { + throw new Exception("No parent PHPExcel_Writer_IWriter assigned."); + } + } + + /** + * Set parent IWriter object + * + * @param PHPExcel_Writer_IWriter $pWriter + * @throws Exception + */ + public function __construct(PHPExcel_Writer_IWriter $pWriter = null) { + if (!is_null($pWriter)) { + $this->_parentWriter = $pWriter; + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5.php new file mode 100644 index 000000000..9297c78ba --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5.php @@ -0,0 +1,961 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel5 + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter +{ + /** + * Pre-calculate formulas + * + * @var boolean + */ + private $_preCalculateFormulas = true; + + /** + * PHPExcel object + * + * @var PHPExcel + */ + private $_phpExcel; + + /** + * Total number of shared strings in workbook + * + * @var int + */ + private $_str_total = 0; + + /** + * Number of unique shared strings in workbook + * + * @var int + */ + private $_str_unique = 0; + + /** + * Array of unique shared strings in workbook + * + * @var array + */ + private $_str_table = array(); + + /** + * Color cache. Mapping between RGB value and color index. + * + * @var array + */ + private $_colors; + + /** + * Formula parser + * + * @var PHPExcel_Writer_Excel5_Parser + */ + private $_parser; + + /** + * Identifier clusters for drawings. Used in MSODRAWINGGROUP record. + * + * @var array + */ + private $_IDCLs; + + /** + * Basic OLE object summary information + * + * @var array + */ + private $_summaryInformation; + + /** + * Extended OLE object document summary information + * + * @var array + */ + private $_documentSummaryInformation; + + /** + * Create a new PHPExcel_Writer_Excel5 + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + $this->_phpExcel = $phpExcel; + + $this->_parser = new PHPExcel_Writer_Excel5_Parser(); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws Exception + */ + public function save($pFilename = null) { + + // garbage collect + $this->_phpExcel->garbageCollect(); + + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; + $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); + + // initialize colors array + $this->_colors = array(); + + // Initialise workbook writer + $this->_writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->_phpExcel, + $this->_str_total, $this->_str_unique, $this->_str_table, + $this->_colors, $this->_parser); + + // Initialise worksheet writers + $countSheets = $this->_phpExcel->getSheetCount(); + for ($i = 0; $i < $countSheets; ++$i) { + $this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_str_total, $this->_str_unique, + $this->_str_table, $this->_colors, + $this->_parser, + $this->_preCalculateFormulas, + $this->_phpExcel->getSheet($i)); + } + + // build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook. + $this->_buildWorksheetEschers(); + $this->_buildWorkbookEscher(); + + // add 15 identical cell style Xfs + // for now, we use the first cellXf instead of cellStyleXf + $cellXfCollection = $this->_phpExcel->getCellXfCollection(); + for ($i = 0; $i < 15; ++$i) { + $this->_writerWorkbook->addXfWriter($cellXfCollection[0], true); + } + + // add all the cell Xfs + foreach ($this->_phpExcel->getCellXfCollection() as $style) { + $this->_writerWorkbook->addXfWriter($style, false); + } + + // add fonts from rich text eleemnts + for ($i = 0; $i < $countSheets; ++$i) { + foreach ($this->_writerWorksheets[$i]->_phpSheet->getCellCollection() as $cellID) { + $cell = $this->_writerWorksheets[$i]->_phpSheet->getCell($cellID); + $cVal = $cell->getValue(); + if ($cVal instanceof PHPExcel_RichText) { + $elements = $cVal->getRichTextElements(); + foreach ($elements as $element) { + if ($element instanceof PHPExcel_RichText_Run) { + $font = $element->getFont(); + $this->_writerWorksheets[$i]->_fntHashIndex[$font->getHashCode()] = $this->_writerWorkbook->_addFont($font); + } + } + } + } + } + + // initialize OLE file + $workbookStreamName = 'Workbook'; + $OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName)); + + // Write the worksheet streams before the global workbook stream, + // because the byte sizes of these are needed in the global workbook stream + $worksheetSizes = array(); + for ($i = 0; $i < $countSheets; ++$i) { + $this->_writerWorksheets[$i]->close(); + $worksheetSizes[] = $this->_writerWorksheets[$i]->_datasize; + } + + // add binary data for global workbook stream + $OLE->append( $this->_writerWorkbook->writeWorkbook($worksheetSizes) ); + + // add binary data for sheet streams + for ($i = 0; $i < $countSheets; ++$i) { + $OLE->append($this->_writerWorksheets[$i]->getData()); + } + + $this->_documentSummaryInformation = $this->_writeDocumentSummaryInformation(); + // initialize OLE Document Summary Information + if(isset($this->_documentSummaryInformation) && !empty($this->_documentSummaryInformation)){ + $OLE_DocumentSummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'DocumentSummaryInformation')); + $OLE_DocumentSummaryInformation->append($this->_documentSummaryInformation); + } + + $this->_summaryInformation = $this->_writeSummaryInformation(); + // initialize OLE Summary Information + if(isset($this->_summaryInformation) && !empty($this->_summaryInformation)){ + $OLE_SummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'SummaryInformation')); + $OLE_SummaryInformation->append($this->_summaryInformation); + } + + // define OLE Parts + $arrRootData = array($OLE); + // initialize OLE Properties file + if(isset($OLE_SummaryInformation)){ + $arrRootData[] = $OLE_SummaryInformation; + } + // initialize OLE Extended Properties file + if(isset($OLE_DocumentSummaryInformation)){ + $arrRootData[] = $OLE_DocumentSummaryInformation; + } + + $root = new PHPExcel_Shared_OLE_PPS_Root(time(), time(), $arrRootData); + // save the OLE file + $res = $root->save($pFilename); + + PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; + } + + /** + * Set temporary storage directory + * + * @deprecated + * @param string $pValue Temporary storage directory + * @throws Exception Exception when directory does not exist + * @return PHPExcel_Writer_Excel5 + */ + public function setTempDir($pValue = '') { + return $this; + } + + /** + * Get Pre-Calculate Formulas + * + * @return boolean + */ + public function getPreCalculateFormulas() { + return $this->_preCalculateFormulas; + } + + /** + * Set Pre-Calculate Formulas + * + * @param boolean $pValue Pre-Calculate Formulas? + */ + public function setPreCalculateFormulas($pValue = true) { + $this->_preCalculateFormulas = $pValue; + } + + /** + * Build the Worksheet Escher objects + * + */ + private function _buildWorksheetEschers() + { + // 1-based index to BstoreContainer + $blipIndex = 0; + $lastReducedSpId = 0; + $lastSpId = 0; + + foreach ($this->_phpExcel->getAllsheets() as $sheet) { + // sheet index + $sheetIndex = $sheet->getParent()->getIndex($sheet); + + $escher = null; + + // check if there are any shapes for this sheet + $filterRange = $sheet->getAutoFilter()->getRange(); + if (count($sheet->getDrawingCollection()) == 0 && empty($filterRange)) { + continue; + } + + // create intermediate Escher object + $escher = new PHPExcel_Shared_Escher(); + + // dgContainer + $dgContainer = new PHPExcel_Shared_Escher_DgContainer(); + + // set the drawing index (we use sheet index + 1) + $dgId = $sheet->getParent()->getIndex($sheet) + 1; + $dgContainer->setDgId($dgId); + $escher->setDgContainer($dgContainer); + + // spgrContainer + $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); + $dgContainer->setSpgrContainer($spgrContainer); + + // add one shape which is the group shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + $spContainer->setSpgr(true); + $spContainer->setSpType(0); + $spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10); + $spgrContainer->addChild($spContainer); + + // add the shapes + + $countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet + + foreach ($sheet->getDrawingCollection() as $drawing) { + ++$blipIndex; + + ++$countShapes[$sheetIndex]; + + // add the shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + + // set the shape type + $spContainer->setSpType(0x004B); + // set the shape flag + $spContainer->setSpFlag(0x02); + + // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) + $reducedSpId = $countShapes[$sheetIndex]; + $spId = $reducedSpId + | ($sheet->getParent()->getIndex($sheet) + 1) << 10; + $spContainer->setSpId($spId); + + // keep track of last reducedSpId + $lastReducedSpId = $reducedSpId; + + // keep track of last spId + $lastSpId = $spId; + + // set the BLIP index + $spContainer->setOPT(0x4104, $blipIndex); + + // set coordinates and offsets, client anchor + $coordinates = $drawing->getCoordinates(); + $offsetX = $drawing->getOffsetX(); + $offsetY = $drawing->getOffsetY(); + $width = $drawing->getWidth(); + $height = $drawing->getHeight(); + + $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height); + + $spContainer->setStartCoordinates($twoAnchor['startCoordinates']); + $spContainer->setStartOffsetX($twoAnchor['startOffsetX']); + $spContainer->setStartOffsetY($twoAnchor['startOffsetY']); + $spContainer->setEndCoordinates($twoAnchor['endCoordinates']); + $spContainer->setEndOffsetX($twoAnchor['endOffsetX']); + $spContainer->setEndOffsetY($twoAnchor['endOffsetY']); + + $spgrContainer->addChild($spContainer); + } + + // AutoFilters + if(!empty($filterRange)){ + $rangeBounds = PHPExcel_Cell::rangeBoundaries($filterRange); + $iNumColStart = $rangeBounds[0][0]; + $iNumColEnd = $rangeBounds[1][0]; + + $iInc = $iNumColStart; + while($iInc <= $iNumColEnd){ + ++$countShapes[$sheetIndex]; + + // create an Drawing Object for the dropdown + $oDrawing = new PHPExcel_Worksheet_BaseDrawing(); + // get the coordinates of drawing + $cDrawing = PHPExcel_Cell::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1]; + $oDrawing->setCoordinates($cDrawing); + $oDrawing->setWorksheet($sheet); + + // add the shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + // set the shape type + $spContainer->setSpType(0x00C9); + // set the shape flag + $spContainer->setSpFlag(0x01); + + // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) + $reducedSpId = $countShapes[$sheetIndex]; + $spId = $reducedSpId + | ($sheet->getParent()->getIndex($sheet) + 1) << 10; + $spContainer->setSpId($spId); + + // keep track of last reducedSpId + $lastReducedSpId = $reducedSpId; + + // keep track of last spId + $lastSpId = $spId; + + $spContainer->setOPT(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping + $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape + $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest + $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash + $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint + + // set coordinates and offsets, client anchor + $endCoordinates = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::stringFromColumnIndex($iInc - 1)); + $endCoordinates .= $rangeBounds[0][1] + 1; + + $spContainer->setStartCoordinates($cDrawing); + $spContainer->setStartOffsetX(0); + $spContainer->setStartOffsetY(0); + $spContainer->setEndCoordinates($endCoordinates); + $spContainer->setEndOffsetX(0); + $spContainer->setEndOffsetY(0); + + $spgrContainer->addChild($spContainer); + $iInc++; + } + } + + // identifier clusters, used for workbook Escher object + $this->_IDCLs[$dgId] = $lastReducedSpId; + + // set last shape index + $dgContainer->setLastSpId($lastSpId); + + // set the Escher object + $this->_writerWorksheets[$sheetIndex]->setEscher($escher); + } + } + + /** + * Build the Escher object corresponding to the MSODRAWINGGROUP record + */ + private function _buildWorkbookEscher() + { + $escher = null; + + // any drawings in this workbook? + $found = false; + foreach ($this->_phpExcel->getAllSheets() as $sheet) { + if (count($sheet->getDrawingCollection()) > 0) { + $found = true; + break; + } + } + + // nothing to do if there are no drawings + if (!$found) { + return; + } + + // if we reach here, then there are drawings in the workbook + $escher = new PHPExcel_Shared_Escher(); + + // dggContainer + $dggContainer = new PHPExcel_Shared_Escher_DggContainer(); + $escher->setDggContainer($dggContainer); + + // set IDCLs (identifier clusters) + $dggContainer->setIDCLs($this->_IDCLs); + + // this loop is for determining maximum shape identifier of all drawing + $spIdMax = 0; + $totalCountShapes = 0; + $countDrawings = 0; + + foreach ($this->_phpExcel->getAllsheets() as $sheet) { + $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet + + if (count($sheet->getDrawingCollection()) > 0) { + ++$countDrawings; + + foreach ($sheet->getDrawingCollection() as $drawing) { + ++$sheetCountShapes; + ++$totalCountShapes; + + $spId = $sheetCountShapes + | ($this->_phpExcel->getIndex($sheet) + 1) << 10; + $spIdMax = max($spId, $spIdMax); + } + } + } + + $dggContainer->setSpIdMax($spIdMax + 1); + $dggContainer->setCDgSaved($countDrawings); + $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing + + // bstoreContainer + $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); + $dggContainer->setBstoreContainer($bstoreContainer); + + // the BSE's (all the images) + foreach ($this->_phpExcel->getAllsheets() as $sheet) { + foreach ($sheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + + $filename = $drawing->getPath(); + + list($imagesx, $imagesy, $imageFormat) = getimagesize($filename); + + switch ($imageFormat) { + + case 1: // GIF, not supported by BIFF8, we convert to PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + ob_start(); + imagepng(imagecreatefromgif($filename)); + $blipData = ob_get_contents(); + ob_end_clean(); + break; + + case 2: // JPEG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; + $blipData = file_get_contents($filename); + break; + + case 3: // PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $blipData = file_get_contents($filename); + break; + + case 6: // Windows DIB (BMP), we convert to PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + ob_start(); + imagepng(PHPExcel_Shared_Drawing::imagecreatefrombmp($filename)); + $blipData = ob_get_contents(); + ob_end_clean(); + break; + + default: continue 2; + + } + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($blipData); + + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $BSE->setBlipType($blipType); + $BSE->setBlip($blip); + + $bstoreContainer->addBSE($BSE); + + } else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { + + switch ($drawing->getRenderingFunction()) { + + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG: + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; + $renderingFunction = 'imagejpeg'; + break; + + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF: + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG: + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT: + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $renderingFunction = 'imagepng'; + break; + + } + + ob_start(); + call_user_func($renderingFunction, $drawing->getImageResource()); + $blipData = ob_get_contents(); + ob_end_clean(); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($blipData); + + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $BSE->setBlipType($blipType); + $BSE->setBlip($blip); + + $bstoreContainer->addBSE($BSE); + } + } + } + + // Set the Escher object + $this->_writerWorkbook->setEscher($escher); + } + + /** + * Build the OLE Part for DocumentSummary Information + * @return string + */ + private function _writeDocumentSummaryInformation(){ + + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + $data = pack('v', 0xFFFE); + // offset: 2; size: 2; + $data .= pack('v', 0x0000); + // offset: 4; size: 2; OS version + $data .= pack('v', 0x0106); + // offset: 6; size: 2; OS indicator + $data .= pack('v', 0x0002); + // offset: 8; size: 16 + $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); + // offset: 24; size: 4; section count + $data .= pack('V', 0x0001); + + // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae + $data .= pack('vvvvvvvv', 0xD502, 0xD5CD, 0x2E9C, 0x101B, 0x9793, 0x0008, 0x2C2B, 0xAEF9); + // offset: 44; size: 4; offset of the start + $data .= pack('V', 0x30); + + // SECTION + $dataSection = array(); + $dataSection_NumProps = 0; + $dataSection_Summary = ''; + $dataSection_Content = ''; + + // GKPIDDSI_CODEPAGE: CodePage + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer + 'data' => array('data' => 1252)); + $dataSection_NumProps++; + + // GKPIDDSI_CATEGORY : Category + if($this->_phpExcel->getProperties()->getCategory()){ + $dataProp = $this->_phpExcel->getProperties()->getCategory(); + $dataProp = 'Test result file'; + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // GKPIDDSI_VERSION :Version of the application that wrote the property storage + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x17), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x03), + 'data' => array('pack' => 'V', 'data' => 0x000C0000)); + $dataSection_NumProps++; + // GKPIDDSI_SCALE : FALSE + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0B), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + // GKPIDDSI_LINKSDIRTY : True if any of the values for the linked properties have changed outside of the application + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x10), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + // GKPIDDSI_SHAREDOC : FALSE + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + // GKPIDDSI_HYPERLINKSCHANGED : True if any of the values for the _PID_LINKS (hyperlink text) have changed outside of the application + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x16), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + + // GKPIDDSI_DOCSPARTS + // MS-OSHARED p75 (2.3.3.2.2.1) + // Structure is VtVecUnalignedLpstrValue (2.3.3.1.9) + // cElements + $dataProp = pack('v', 0x0001); + $dataProp .= pack('v', 0x0000); + // array of UnalignedLpstr + // cch + $dataProp .= pack('v', 0x000A); + $dataProp .= pack('v', 0x0000); + // value + $dataProp .= 'Worksheet'.chr(0); + + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x101E), + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + + // GKPIDDSI_HEADINGPAIR + // VtVecHeadingPairValue + // cElements + $dataProp = pack('v', 0x0002); + $dataProp .= pack('v', 0x0000); + // Array of vtHeadingPair + // vtUnalignedString - headingString + // stringType + $dataProp .= pack('v', 0x001E); + // padding + $dataProp .= pack('v', 0x0000); + // UnalignedLpstr + // cch + $dataProp .= pack('v', 0x0013); + $dataProp .= pack('v', 0x0000); + // value + $dataProp .= 'Feuilles de calcul'; + // vtUnalignedString - headingParts + // wType : 0x0003 = 32 bit signed integer + $dataProp .= pack('v', 0x0300); + // padding + $dataProp .= pack('v', 0x0000); + // value + $dataProp .= pack('v', 0x0100); + $dataProp .= pack('v', 0x0000); + $dataProp .= pack('v', 0x0000); + $dataProp .= pack('v', 0x0000); + + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x100C), + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + + // 4 Section Length + // 4 Property count + // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) + $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; + foreach ($dataSection as $dataProp){ + // Summary + $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); + // Offset + $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); + // DataType + $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); + // Data + if($dataProp['type']['data'] == 0x02){ // 2 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } + elseif($dataProp['type']['data'] == 0x03){ // 4 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } + elseif($dataProp['type']['data'] == 0x0B){ // Boolean + if($dataProp['data']['data'] == false){ + $dataSection_Content .= pack('V', 0x0000); + } else { + $dataSection_Content .= pack('V', 0x0001); + } + $dataSection_Content_Offset += 4 + 4; + } + elseif($dataProp['type']['data'] == 0x1E){ // null-terminated string prepended by dword string length + // Null-terminated string + $dataProp['data']['data'] .= chr(0); + $dataProp['data']['length'] += 1; + // Complete the string with null string for being a %4 + $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4)); + $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); + + $dataSection_Content .= pack('V', $dataProp['data']['length']); + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); + } + elseif($dataProp['type']['data'] == 0x40){ // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 8; + } + else { + // Data Type Not Used at the moment + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + $dataProp['data']['length']; + } + } + // Now $dataSection_Content_Offset contains the size of the content + + // section header + // offset: $secOffset; size: 4; section length + // + x Size of the content (summary + content) + $data .= pack('V', $dataSection_Content_Offset); + // offset: $secOffset+4; size: 4; property count + $data .= pack('V', $dataSection_NumProps); + // Section Summary + $data .= $dataSection_Summary; + // Section Content + $data .= $dataSection_Content; + + return $data; + } + + /** + * Build the OLE Part for Summary Information + * @return string + */ + private function _writeSummaryInformation(){ + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + $data = pack('v', 0xFFFE); + // offset: 2; size: 2; + $data .= pack('v', 0x0000); + // offset: 4; size: 2; OS version + $data .= pack('v', 0x0106); + // offset: 6; size: 2; OS indicator + $data .= pack('v', 0x0002); + // offset: 8; size: 16 + $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); + // offset: 24; size: 4; section count + $data .= pack('V', 0x0001); + + // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 + $data .= pack('vvvvvvvv', 0x85E0, 0xF29F, 0x4FF9, 0x1068, 0x91AB, 0x0008, 0x272B, 0xD9B3); + // offset: 44; size: 4; offset of the start + $data .= pack('V', 0x30); + + // SECTION + $dataSection = array(); + $dataSection_NumProps = 0; + $dataSection_Summary = ''; + $dataSection_Content = ''; + + // CodePage : CP-1252 + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer + 'data' => array('data' => 1252)); + $dataSection_NumProps++; + + // Title + if($this->_phpExcel->getProperties()->getTitle()){ + $dataProp = $this->_phpExcel->getProperties()->getTitle(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Subject + if($this->_phpExcel->getProperties()->getSubject()){ + $dataProp = $this->_phpExcel->getProperties()->getSubject(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x03), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Author (Creator) + if($this->_phpExcel->getProperties()->getCreator()){ + $dataProp = $this->_phpExcel->getProperties()->getCreator(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x04), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Keywords + if($this->_phpExcel->getProperties()->getKeywords()){ + $dataProp = $this->_phpExcel->getProperties()->getKeywords(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x05), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Comments (Description) + if($this->_phpExcel->getProperties()->getDescription()){ + $dataProp = $this->_phpExcel->getProperties()->getDescription(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x06), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Last Saved By (LastModifiedBy) + if($this->_phpExcel->getProperties()->getLastModifiedBy()){ + $dataProp = $this->_phpExcel->getProperties()->getLastModifiedBy(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x08), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Created Date/Time + if($this->_phpExcel->getProperties()->getCreated()){ + $dataProp = $this->_phpExcel->getProperties()->getCreated(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + 'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp))); + $dataSection_NumProps++; + } + // Modified Date/Time + if($this->_phpExcel->getProperties()->getModified()){ + $dataProp = $this->_phpExcel->getProperties()->getModified(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + 'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp))); + $dataSection_NumProps++; + } + // Security + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x03), // 4 byte signed integer + 'data' => array('data' => 0x00)); + $dataSection_NumProps++; + + + // 4 Section Length + // 4 Property count + // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) + $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; + foreach ($dataSection as $dataProp){ + // Summary + $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); + // Offset + $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); + // DataType + $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); + // Data + if($dataProp['type']['data'] == 0x02){ // 2 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } + elseif($dataProp['type']['data'] == 0x03){ // 4 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } + elseif($dataProp['type']['data'] == 0x1E){ // null-terminated string prepended by dword string length + // Null-terminated string + $dataProp['data']['data'] .= chr(0); + $dataProp['data']['length'] += 1; + // Complete the string with null string for being a %4 + $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4)); + $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); + + $dataSection_Content .= pack('V', $dataProp['data']['length']); + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); + } + elseif($dataProp['type']['data'] == 0x40){ // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 8; + } + else { + // Data Type Not Used at the moment + } + } + // Now $dataSection_Content_Offset contains the size of the content + + // section header + // offset: $secOffset; size: 4; section length + // + x Size of the content (summary + content) + $data .= pack('V', $dataSection_Content_Offset); + // offset: $secOffset+4; size: 4; property count + $data .= pack('V', $dataSection_NumProps); + // Section Summary + $data .= $dataSection_Summary; + // Section Content + $data .= $dataSection_Content; + + return $data; + } +} \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/BIFFwriter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/BIFFwriter.php new file mode 100644 index 000000000..b67822550 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/BIFFwriter.php @@ -0,0 +1,255 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_BIFFwriter (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ + + +/** + * PHPExcel_Writer_Excel5_BIFFwriter + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_BIFFwriter +{ + /** + * The byte order of this architecture. 0 => little endian, 1 => big endian + * @var integer + */ + private static $_byte_order; + + /** + * The string containing the data of the BIFF stream + * @var string + */ + public $_data; + + /** + * The size of the data in bytes. Should be the same as strlen($this->_data) + * @var integer + */ + public $_datasize; + + /** + * The maximum length for a BIFF record (excluding record header and length field). See _addContinue() + * @var integer + * @see _addContinue() + */ + public $_limit = 8224; + + /** + * Constructor + */ + public function __construct() + { + $this->_data = ''; + $this->_datasize = 0; +// $this->_limit = 8224; + } + + /** + * Determine the byte order and store it as class data to avoid + * recalculating it for each call to new(). + * + * @return int + */ + public static function getByteOrder() + { + if (!isset(self::$_byte_order)) { + // Check if "pack" gives the required IEEE 64bit float + $teststr = pack("d", 1.2345); + $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); + if ($number == $teststr) { + $byte_order = 0; // Little Endian + } elseif ($number == strrev($teststr)){ + $byte_order = 1; // Big Endian + } else { + // Give up. I'll fix this in a later version. + throw new Exception("Required floating point format not supported on this platform."); + } + self::$_byte_order = $byte_order; + } + + return self::$_byte_order; + } + + /** + * General storage function + * + * @param string $data binary data to append + * @access private + */ + function _append($data) + { + if (strlen($data) - 4 > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data .= $data; + $this->_datasize += strlen($data); + } + + /** + * General storage function like _append, but returns string instead of modifying $this->_data + * + * @param string $data binary data to write + * @return string + */ + public function writeData($data) + { + if (strlen($data) - 4 > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_datasize += strlen($data); + + return $data; + } + + /** + * Writes Excel BOF record to indicate the beginning of a stream or + * sub-stream in the BIFF file. + * + * @param integer $type Type of BIFF file to write: 0x0005 Workbook, + * 0x0010 Worksheet. + * @access private + */ + function _storeBof($type) + { + $record = 0x0809; // Record identifier (BIFF5-BIFF8) + $length = 0x0010; + + // by inspection of real files, MS Office Excel 2007 writes the following + $unknown = pack("VV", 0x000100D1, 0x00000406); + + $build = 0x0DBB; // Excel 97 + $year = 0x07CC; // Excel 97 + + $version = 0x0600; // BIFF8 + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $version, $type, $build, $year); + $this->_append($header . $data . $unknown); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + function _storeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $this->_append($header); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + public function writeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + $header = pack("vv", $record, $length); + return $this->writeData($header); + } + + /** + * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In + * Excel 97 the limit is 8228 bytes. Records that are longer than these limits + * must be split up into CONTINUE blocks. + * + * This function takes a long BIFF record and inserts CONTINUE records as + * necessary. + * + * @param string $data The original binary data to be written + * @return string A very convenient string of continue blocks + * @access private + */ + function _addContinue($data) + { + $limit = $this->_limit; + $record = 0x003C; // Record identifier + + // The first 2080/8224 bytes remain intact. However, we have to change + // the length field of the record. + $tmp = substr($data, 0, 2) . pack("v", $limit) . substr($data, 4, $limit); + + $header = pack("vv", $record, $limit); // Headers for continue records + + // Retrieve chunks of 2080/8224 bytes +4 for the header. + $data_length = strlen($data); + for ($i = $limit + 4; $i < ($data_length - $limit); $i += $limit) { + $tmp .= $header; + $tmp .= substr($data, $i, $limit); + } + + // Retrieve the last chunk of data + $header = pack("vv", $record, strlen($data) - $i); + $tmp .= $header; + $tmp .= substr($data, $i, strlen($data) - $i); + + return $tmp; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Escher.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Escher.php new file mode 100644 index 000000000..94b769ab9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Escher.php @@ -0,0 +1,537 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Escher +{ + /** + * The object we are writing + */ + private $_object; + + /** + * The written binary data + */ + private $_data; + + /** + * Shape offsets. Positions in binary stream where a new shape record begins + * + * @var array + */ + private $_spOffsets; + + /** + * Shape types. + * + * @var array + */ + private $_spTypes; + + /** + * Constructor + * + * @param mixed + */ + public function __construct($object) + { + $this->_object = $object; + } + + /** + * Process the object to be written + */ + public function close() + { + // initialize + $this->_data = ''; + + switch (get_class($this->_object)) { + + case 'PHPExcel_Shared_Escher': + if ($dggContainer = $this->_object->getDggContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($dggContainer); + $this->_data = $writer->close(); + } else if ($dgContainer = $this->_object->getDgContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($dgContainer); + $this->_data = $writer->close(); + $this->_spOffsets = $writer->getSpOffsets(); + $this->_spTypes = $writer->getSpTypes(); + } + break; + + case 'PHPExcel_Shared_Escher_DggContainer': + // this is a container record + + // initialize + $innerData = ''; + + // write the dgg + $recVer = 0x0; + $recInstance = 0x0000; + $recType = 0xF006; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + // dgg data + $dggData = + pack('VVVV' + , $this->_object->getSpIdMax() // maximum shape identifier increased by one + , $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one + , $this->_object->getCSpSaved() + , $this->_object->getCDgSaved() // count total number of drawings saved + ); + + // add file identifier clusters (one per drawing) + $IDCLs = $this->_object->getIDCLs(); + + foreach ($IDCLs as $dgId => $maxReducedSpId) { + $dggData .= pack('VV', $dgId, $maxReducedSpId + 1); + } + + $header = pack('vvV', $recVerInstance, $recType, strlen($dggData)); + $innerData .= $header . $dggData; + + // write the bstoreContainer + if ($bstoreContainer = $this->_object->getBstoreContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer); + $innerData .= $writer->close(); + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF000; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header . $innerData; + break; + + case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer': + // this is a container record + + // initialize + $innerData = ''; + + // treat the inner data + if ($BSECollection = $this->_object->getBSECollection()) { + foreach ($BSECollection as $BSE) { + $writer = new PHPExcel_Writer_Excel5_Escher($BSE); + $innerData .= $writer->close(); + } + } + + // write the record + $recVer = 0xF; + $recInstance = count($this->_object->getBSECollection()); + $recType = 0xF001; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header . $innerData; + break; + + case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE': + // this is a semi-container record + + // initialize + $innerData = ''; + + // here we treat the inner data + if ($blip = $this->_object->getBlip()) { + $writer = new PHPExcel_Writer_Excel5_Escher($blip); + $innerData .= $writer->close(); + } + + // initialize + $data = ''; + + $btWin32 = $this->_object->getBlipType(); + $btMacOS = $this->_object->getBlipType(); + $data .= pack('CC', $btWin32, $btMacOS); + + $rgbUid = pack('VVVV', 0,0,0,0); // todo + $data .= $rgbUid; + + $tag = 0; + $size = strlen($innerData); + $cRef = 1; + $foDelay = 0; //todo + $unused1 = 0x0; + $cbName = 0x0; + $unused2 = 0x0; + $unused3 = 0x0; + $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3); + + $data .= $innerData; + + // write the record + $recVer = 0x2; + $recInstance = $this->_object->getBlipType(); + $recType = 0xF007; + $length = strlen($data); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header; + + $this->_data .= $data; + break; + + case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip': + // this is an atom record + + // write the record + switch ($this->_object->getParent()->getBlipType()) { + + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG: + // initialize + $innerData = ''; + + $rgbUid1 = pack('VVVV', 0,0,0,0); // todo + $innerData .= $rgbUid1; + + $tag = 0xFF; // todo + $innerData .= pack('C', $tag); + + $innerData .= $this->_object->getData(); + + $recVer = 0x0; + $recInstance = 0x46A; + $recType = 0xF01D; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header; + + $this->_data .= $innerData; + break; + + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG: + // initialize + $innerData = ''; + + $rgbUid1 = pack('VVVV', 0,0,0,0); // todo + $innerData .= $rgbUid1; + + $tag = 0xFF; // todo + $innerData .= pack('C', $tag); + + $innerData .= $this->_object->getData(); + + $recVer = 0x0; + $recInstance = 0x6E0; + $recType = 0xF01E; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header; + + $this->_data .= $innerData; + break; + + } + break; + + case 'PHPExcel_Shared_Escher_DgContainer': + // this is a container record + + // initialize + $innerData = ''; + + // write the dg + $recVer = 0x0; + $recInstance = $this->_object->getDgId(); + $recType = 0xF008; + $length = 8; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + // number of shapes in this drawing (including group shape) + $countShapes = count($this->_object->getSpgrContainer()->getChildren()); + $innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId()); + //$innerData .= $header . pack('VV', 0, 0); + + // write the spgrContainer + if ($spgrContainer = $this->_object->getSpgrContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer); + $innerData .= $writer->close(); + + // get the shape offsets relative to the spgrContainer record + $spOffsets = $writer->getSpOffsets(); + $spTypes = $writer->getSpTypes(); + + // save the shape offsets relative to dgContainer + foreach ($spOffsets as & $spOffset) { + $spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes) + } + + $this->_spOffsets = $spOffsets; + $this->_spTypes = $spTypes; + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF002; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header . $innerData; + break; + + case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer': + // this is a container record + + // initialize + $innerData = ''; + + // initialize spape offsets + $totalSize = 8; + $spOffsets = array(); + $spTypes = array(); + + // treat the inner data + foreach ($this->_object->getChildren() as $spContainer) { + $writer = new PHPExcel_Writer_Excel5_Escher($spContainer); + $spData = $writer->close(); + $innerData .= $spData; + + // save the shape offsets (where new shape records begin) + $totalSize += strlen($spData); + $spOffsets[] = $totalSize; + + $spTypes = array_merge($spTypes, $writer->getSpTypes()); + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF003; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header . $innerData; + $this->_spOffsets = $spOffsets; + $this->_spTypes = $spTypes; + break; + + case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer': + // initialize + $data = ''; + + // build the data + + // write group shape record, if necessary? + if ($this->_object->getSpgr()) { + $recVer = 0x1; + $recInstance = 0x0000; + $recType = 0xF009; + $length = 0x00000010; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $data .= $header . pack('VVVV', 0,0,0,0); + } + $this->_spTypes[] = ($this->_object->getSpType()); + + // write the shape record + $recVer = 0x2; + $recInstance = $this->_object->getSpType(); // shape type + $recType = 0xF00A; + $length = 0x00000008; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0x0A00); + + + // the options + if ($this->_object->getOPTCollection()) { + $optData = ''; + + $recVer = 0x3; + $recInstance = count($this->_object->getOPTCollection()); + $recType = 0xF00B; + foreach ($this->_object->getOPTCollection() as $property => $value) { + $optData .= pack('vV', $property, $value); + } + $length = strlen($optData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + $data .= $header . $optData; + } + + // the client anchor + if ($this->_object->getStartCoordinates()) { + $clientAnchorData = ''; + + $recVer = 0x0; + $recInstance = 0x0; + $recType = 0xF010; + + // start coordinates + list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates()); + $c1 = PHPExcel_Cell::columnIndexFromString($column) - 1; + $r1 = $row - 1; + + // start offsetX + $startOffsetX = $this->_object->getStartOffsetX(); + + // start offsetY + $startOffsetY = $this->_object->getStartOffsetY(); + + // end coordinates + list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates()); + $c2 = PHPExcel_Cell::columnIndexFromString($column) - 1; + $r2 = $row - 1; + + // end offsetX + $endOffsetX = $this->_object->getEndOffsetX(); + + // end offsetY + $endOffsetY = $this->_object->getEndOffsetY(); + + $clientAnchorData = pack('vvvvvvvvv', $this->_object->getSpFlag(), + $c1, $startOffsetX, $r1, $startOffsetY, + $c2, $endOffsetX, $r2, $endOffsetY); + + $length = strlen($clientAnchorData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + $data .= $header . $clientAnchorData; + } + + // the client data, just empty for now + if (!$this->_object->getSpgr()) { + $clientDataData = ''; + + $recVer = 0x0; + $recInstance = 0x0; + $recType = 0xF011; + + $length = strlen($clientDataData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + $data .= $header . $clientDataData; + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF004; + $length = strlen($data); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->_data = $header . $data; + break; + + } + + return $this->_data; + } + + /** + * Gets the shape offsets + * + * @return array + */ + public function getSpOffsets() + { + return $this->_spOffsets; + } + + /** + * Gets the shape types + * + * @return array + */ + public function getSpTypes() + { + return $this->_spTypes; + } + + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Font.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Font.php new file mode 100644 index 000000000..f67dd11f0 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Font.php @@ -0,0 +1,165 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_Excel5_Font + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Font +{ + /** + * Color index + * + * @var int + */ + private $_colorIndex; + + /** + * Font + * + * @var PHPExcel_Style_Font + */ + private $_font; + + /** + * Constructor + * + * @param PHPExcel_Style_Font $font + */ + public function __construct(PHPExcel_Style_Font $font = null) + { + $this->_colorIndex = 0x7FFF; + $this->_font = $font; + } + + /** + * Set the color index + * + * @param int $colorIndex + */ + public function setColorIndex($colorIndex) + { + $this->_colorIndex = $colorIndex; + } + + /** + * Get font record data + * + * @return string + */ + public function writeFont() + { + $font_outline = 0; + $font_shadow = 0; + + $icv = $this->_colorIndex; // Index to color palette + if ($this->_font->getSuperScript()) { + $sss = 1; + } else if ($this->_font->getSubScript()) { + $sss = 2; + } else { + $sss = 0; + } + $bFamily = 0; // Font family + $bCharSet = PHPExcel_Shared_Font::getCharsetFromFontName($this->_font->getName()); // Character set + + $record = 0x31; // Record identifier + $reserved = 0x00; // Reserved + $grbit = 0x00; // Font attributes + if ($this->_font->getItalic()) { + $grbit |= 0x02; + } + if ($this->_font->getStrikethrough()) { + $grbit |= 0x08; + } + if ($font_outline) { + $grbit |= 0x10; + } + if ($font_shadow) { + $grbit |= 0x20; + } + + $data = pack("vvvvvCCCC", + $this->_font->getSize() * 20, // Fontsize (in twips) + $grbit, + $icv, // Colour + self::_mapBold($this->_font->getBold()), // Font weight + $sss, // Superscript/Subscript + self::_mapUnderline($this->_font->getUnderline()), + $bFamily, + $bCharSet, + $reserved + ); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($this->_font->getName()); + + $length = strlen($data); + $header = pack("vv", $record, $length); + + return($header . $data); + } + + /** + * Map to BIFF5-BIFF8 codes for bold + * + * @param boolean $bold + * @return int + */ + private static function _mapBold($bold) { + if ($bold) { + return 0x2BC; // 700 = Bold font weight + } + return 0x190; // 400 = Normal font weight + } + + /** + * Map of BIFF2-BIFF8 codes for underline styles + * @static array of int + * + */ + private static $_mapUnderline = array( PHPExcel_Style_Font::UNDERLINE_NONE => 0x00, + PHPExcel_Style_Font::UNDERLINE_SINGLE => 0x01, + PHPExcel_Style_Font::UNDERLINE_DOUBLE => 0x02, + PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING => 0x21, + PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING => 0x22, + ); + /** + * Map underline + * + * @param string + * @return int + */ + private static function _mapUnderline($underline) { + if (isset(self::$_mapUnderline[$underline])) + return self::$_mapUnderline[$underline]; + return 0x00; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Parser.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Parser.php new file mode 100644 index 000000000..88b777e00 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Parser.php @@ -0,0 +1,1583 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Parser (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// * Class for parsing Excel formulas +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ + + +/** + * PHPExcel_Writer_Excel5_Parser + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Parser +{ + /** Constants */ + // Sheet title in unquoted form + // Invalid sheet title characters cannot occur in the sheet title: + // *:/\?[] + // Moreover, there are valid sheet title characters that cannot occur in unquoted form (there may be more?) + // +-% '^&<>=,;#()"{} + const REGEX_SHEET_TITLE_UNQUOTED = '[^\*\:\/\\\\\?\[\]\+\-\% \\\'\^\&\<\>\=\,\;\#\(\)\"\{\}]+'; + + // Sheet title in quoted form (without surrounding quotes) + // Invalid sheet title characters cannot occur in the sheet title: + // *:/\?[] (usual invalid sheet title characters) + // Single quote is represented as a pair '' + const REGEX_SHEET_TITLE_QUOTED = '(([^\*\:\/\\\\\?\[\]\\\'])+|(\\\'\\\')+)+'; + + /** + * The index of the character we are currently looking at + * @var integer + */ + public $_current_char; + + /** + * The token we are working on. + * @var string + */ + public $_current_token; + + /** + * The formula to parse + * @var string + */ + public $_formula; + + /** + * The character ahead of the current char + * @var string + */ + public $_lookahead; + + /** + * The parse tree to be generated + * @var string + */ + public $_parse_tree; + + /** + * Array of external sheets + * @var array + */ + public $_ext_sheets; + + /** + * Array of sheet references in the form of REF structures + * @var array + */ + public $_references; + + /** + * The class constructor + * + */ + public function __construct() + { + $this->_current_char = 0; + $this->_current_token = ''; // The token we are working on. + $this->_formula = ''; // The formula to parse. + $this->_lookahead = ''; // The character ahead of the current char. + $this->_parse_tree = ''; // The parse tree to be generated. + $this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's + $this->_ext_sheets = array(); + $this->_references = array(); + } + + /** + * Initialize the ptg and function hashes. + * + * @access private + */ + function _initializeHashes() + { + // The Excel ptg indices + $this->ptg = array( + 'ptgExp' => 0x01, + 'ptgTbl' => 0x02, + 'ptgAdd' => 0x03, + 'ptgSub' => 0x04, + 'ptgMul' => 0x05, + 'ptgDiv' => 0x06, + 'ptgPower' => 0x07, + 'ptgConcat' => 0x08, + 'ptgLT' => 0x09, + 'ptgLE' => 0x0A, + 'ptgEQ' => 0x0B, + 'ptgGE' => 0x0C, + 'ptgGT' => 0x0D, + 'ptgNE' => 0x0E, + 'ptgIsect' => 0x0F, + 'ptgUnion' => 0x10, + 'ptgRange' => 0x11, + 'ptgUplus' => 0x12, + 'ptgUminus' => 0x13, + 'ptgPercent' => 0x14, + 'ptgParen' => 0x15, + 'ptgMissArg' => 0x16, + 'ptgStr' => 0x17, + 'ptgAttr' => 0x19, + 'ptgSheet' => 0x1A, + 'ptgEndSheet' => 0x1B, + 'ptgErr' => 0x1C, + 'ptgBool' => 0x1D, + 'ptgInt' => 0x1E, + 'ptgNum' => 0x1F, + 'ptgArray' => 0x20, + 'ptgFunc' => 0x21, + 'ptgFuncVar' => 0x22, + 'ptgName' => 0x23, + 'ptgRef' => 0x24, + 'ptgArea' => 0x25, + 'ptgMemArea' => 0x26, + 'ptgMemErr' => 0x27, + 'ptgMemNoMem' => 0x28, + 'ptgMemFunc' => 0x29, + 'ptgRefErr' => 0x2A, + 'ptgAreaErr' => 0x2B, + 'ptgRefN' => 0x2C, + 'ptgAreaN' => 0x2D, + 'ptgMemAreaN' => 0x2E, + 'ptgMemNoMemN' => 0x2F, + 'ptgNameX' => 0x39, + 'ptgRef3d' => 0x3A, + 'ptgArea3d' => 0x3B, + 'ptgRefErr3d' => 0x3C, + 'ptgAreaErr3d' => 0x3D, + 'ptgArrayV' => 0x40, + 'ptgFuncV' => 0x41, + 'ptgFuncVarV' => 0x42, + 'ptgNameV' => 0x43, + 'ptgRefV' => 0x44, + 'ptgAreaV' => 0x45, + 'ptgMemAreaV' => 0x46, + 'ptgMemErrV' => 0x47, + 'ptgMemNoMemV' => 0x48, + 'ptgMemFuncV' => 0x49, + 'ptgRefErrV' => 0x4A, + 'ptgAreaErrV' => 0x4B, + 'ptgRefNV' => 0x4C, + 'ptgAreaNV' => 0x4D, + 'ptgMemAreaNV' => 0x4E, + 'ptgMemNoMemN' => 0x4F, + 'ptgFuncCEV' => 0x58, + 'ptgNameXV' => 0x59, + 'ptgRef3dV' => 0x5A, + 'ptgArea3dV' => 0x5B, + 'ptgRefErr3dV' => 0x5C, + 'ptgAreaErr3d' => 0x5D, + 'ptgArrayA' => 0x60, + 'ptgFuncA' => 0x61, + 'ptgFuncVarA' => 0x62, + 'ptgNameA' => 0x63, + 'ptgRefA' => 0x64, + 'ptgAreaA' => 0x65, + 'ptgMemAreaA' => 0x66, + 'ptgMemErrA' => 0x67, + 'ptgMemNoMemA' => 0x68, + 'ptgMemFuncA' => 0x69, + 'ptgRefErrA' => 0x6A, + 'ptgAreaErrA' => 0x6B, + 'ptgRefNA' => 0x6C, + 'ptgAreaNA' => 0x6D, + 'ptgMemAreaNA' => 0x6E, + 'ptgMemNoMemN' => 0x6F, + 'ptgFuncCEA' => 0x78, + 'ptgNameXA' => 0x79, + 'ptgRef3dA' => 0x7A, + 'ptgArea3dA' => 0x7B, + 'ptgRefErr3dA' => 0x7C, + 'ptgAreaErr3d' => 0x7D + ); + + // Thanks to Michael Meeks and Gnumeric for the initial arg values. + // + // The following hash was generated by "function_locale.pl" in the distro. + // Refer to function_locale.pl for non-English function names. + // + // The array elements are as follow: + // ptg: The Excel function ptg code. + // args: The number of arguments that the function takes: + // >=0 is a fixed number of arguments. + // -1 is a variable number of arguments. + // class: The reference, value or array class of the function args. + // vol: The function is volatile. + // + $this->_functions = array( + // function ptg args class vol + 'COUNT' => array( 0, -1, 0, 0 ), + 'IF' => array( 1, -1, 1, 0 ), + 'ISNA' => array( 2, 1, 1, 0 ), + 'ISERROR' => array( 3, 1, 1, 0 ), + 'SUM' => array( 4, -1, 0, 0 ), + 'AVERAGE' => array( 5, -1, 0, 0 ), + 'MIN' => array( 6, -1, 0, 0 ), + 'MAX' => array( 7, -1, 0, 0 ), + 'ROW' => array( 8, -1, 0, 0 ), + 'COLUMN' => array( 9, -1, 0, 0 ), + 'NA' => array( 10, 0, 0, 0 ), + 'NPV' => array( 11, -1, 1, 0 ), + 'STDEV' => array( 12, -1, 0, 0 ), + 'DOLLAR' => array( 13, -1, 1, 0 ), + 'FIXED' => array( 14, -1, 1, 0 ), + 'SIN' => array( 15, 1, 1, 0 ), + 'COS' => array( 16, 1, 1, 0 ), + 'TAN' => array( 17, 1, 1, 0 ), + 'ATAN' => array( 18, 1, 1, 0 ), + 'PI' => array( 19, 0, 1, 0 ), + 'SQRT' => array( 20, 1, 1, 0 ), + 'EXP' => array( 21, 1, 1, 0 ), + 'LN' => array( 22, 1, 1, 0 ), + 'LOG10' => array( 23, 1, 1, 0 ), + 'ABS' => array( 24, 1, 1, 0 ), + 'INT' => array( 25, 1, 1, 0 ), + 'SIGN' => array( 26, 1, 1, 0 ), + 'ROUND' => array( 27, 2, 1, 0 ), + 'LOOKUP' => array( 28, -1, 0, 0 ), + 'INDEX' => array( 29, -1, 0, 1 ), + 'REPT' => array( 30, 2, 1, 0 ), + 'MID' => array( 31, 3, 1, 0 ), + 'LEN' => array( 32, 1, 1, 0 ), + 'VALUE' => array( 33, 1, 1, 0 ), + 'TRUE' => array( 34, 0, 1, 0 ), + 'FALSE' => array( 35, 0, 1, 0 ), + 'AND' => array( 36, -1, 0, 0 ), + 'OR' => array( 37, -1, 0, 0 ), + 'NOT' => array( 38, 1, 1, 0 ), + 'MOD' => array( 39, 2, 1, 0 ), + 'DCOUNT' => array( 40, 3, 0, 0 ), + 'DSUM' => array( 41, 3, 0, 0 ), + 'DAVERAGE' => array( 42, 3, 0, 0 ), + 'DMIN' => array( 43, 3, 0, 0 ), + 'DMAX' => array( 44, 3, 0, 0 ), + 'DSTDEV' => array( 45, 3, 0, 0 ), + 'VAR' => array( 46, -1, 0, 0 ), + 'DVAR' => array( 47, 3, 0, 0 ), + 'TEXT' => array( 48, 2, 1, 0 ), + 'LINEST' => array( 49, -1, 0, 0 ), + 'TREND' => array( 50, -1, 0, 0 ), + 'LOGEST' => array( 51, -1, 0, 0 ), + 'GROWTH' => array( 52, -1, 0, 0 ), + 'PV' => array( 56, -1, 1, 0 ), + 'FV' => array( 57, -1, 1, 0 ), + 'NPER' => array( 58, -1, 1, 0 ), + 'PMT' => array( 59, -1, 1, 0 ), + 'RATE' => array( 60, -1, 1, 0 ), + 'MIRR' => array( 61, 3, 0, 0 ), + 'IRR' => array( 62, -1, 0, 0 ), + 'RAND' => array( 63, 0, 1, 1 ), + 'MATCH' => array( 64, -1, 0, 0 ), + 'DATE' => array( 65, 3, 1, 0 ), + 'TIME' => array( 66, 3, 1, 0 ), + 'DAY' => array( 67, 1, 1, 0 ), + 'MONTH' => array( 68, 1, 1, 0 ), + 'YEAR' => array( 69, 1, 1, 0 ), + 'WEEKDAY' => array( 70, -1, 1, 0 ), + 'HOUR' => array( 71, 1, 1, 0 ), + 'MINUTE' => array( 72, 1, 1, 0 ), + 'SECOND' => array( 73, 1, 1, 0 ), + 'NOW' => array( 74, 0, 1, 1 ), + 'AREAS' => array( 75, 1, 0, 1 ), + 'ROWS' => array( 76, 1, 0, 1 ), + 'COLUMNS' => array( 77, 1, 0, 1 ), + 'OFFSET' => array( 78, -1, 0, 1 ), + 'SEARCH' => array( 82, -1, 1, 0 ), + 'TRANSPOSE' => array( 83, 1, 1, 0 ), + 'TYPE' => array( 86, 1, 1, 0 ), + 'ATAN2' => array( 97, 2, 1, 0 ), + 'ASIN' => array( 98, 1, 1, 0 ), + 'ACOS' => array( 99, 1, 1, 0 ), + 'CHOOSE' => array( 100, -1, 1, 0 ), + 'HLOOKUP' => array( 101, -1, 0, 0 ), + 'VLOOKUP' => array( 102, -1, 0, 0 ), + 'ISREF' => array( 105, 1, 0, 0 ), + 'LOG' => array( 109, -1, 1, 0 ), + 'CHAR' => array( 111, 1, 1, 0 ), + 'LOWER' => array( 112, 1, 1, 0 ), + 'UPPER' => array( 113, 1, 1, 0 ), + 'PROPER' => array( 114, 1, 1, 0 ), + 'LEFT' => array( 115, -1, 1, 0 ), + 'RIGHT' => array( 116, -1, 1, 0 ), + 'EXACT' => array( 117, 2, 1, 0 ), + 'TRIM' => array( 118, 1, 1, 0 ), + 'REPLACE' => array( 119, 4, 1, 0 ), + 'SUBSTITUTE' => array( 120, -1, 1, 0 ), + 'CODE' => array( 121, 1, 1, 0 ), + 'FIND' => array( 124, -1, 1, 0 ), + 'CELL' => array( 125, -1, 0, 1 ), + 'ISERR' => array( 126, 1, 1, 0 ), + 'ISTEXT' => array( 127, 1, 1, 0 ), + 'ISNUMBER' => array( 128, 1, 1, 0 ), + 'ISBLANK' => array( 129, 1, 1, 0 ), + 'T' => array( 130, 1, 0, 0 ), + 'N' => array( 131, 1, 0, 0 ), + 'DATEVALUE' => array( 140, 1, 1, 0 ), + 'TIMEVALUE' => array( 141, 1, 1, 0 ), + 'SLN' => array( 142, 3, 1, 0 ), + 'SYD' => array( 143, 4, 1, 0 ), + 'DDB' => array( 144, -1, 1, 0 ), + 'INDIRECT' => array( 148, -1, 1, 1 ), + 'CALL' => array( 150, -1, 1, 0 ), + 'CLEAN' => array( 162, 1, 1, 0 ), + 'MDETERM' => array( 163, 1, 2, 0 ), + 'MINVERSE' => array( 164, 1, 2, 0 ), + 'MMULT' => array( 165, 2, 2, 0 ), + 'IPMT' => array( 167, -1, 1, 0 ), + 'PPMT' => array( 168, -1, 1, 0 ), + 'COUNTA' => array( 169, -1, 0, 0 ), + 'PRODUCT' => array( 183, -1, 0, 0 ), + 'FACT' => array( 184, 1, 1, 0 ), + 'DPRODUCT' => array( 189, 3, 0, 0 ), + 'ISNONTEXT' => array( 190, 1, 1, 0 ), + 'STDEVP' => array( 193, -1, 0, 0 ), + 'VARP' => array( 194, -1, 0, 0 ), + 'DSTDEVP' => array( 195, 3, 0, 0 ), + 'DVARP' => array( 196, 3, 0, 0 ), + 'TRUNC' => array( 197, -1, 1, 0 ), + 'ISLOGICAL' => array( 198, 1, 1, 0 ), + 'DCOUNTA' => array( 199, 3, 0, 0 ), + 'USDOLLAR' => array( 204, -1, 1, 0 ), + 'FINDB' => array( 205, -1, 1, 0 ), + 'SEARCHB' => array( 206, -1, 1, 0 ), + 'REPLACEB' => array( 207, 4, 1, 0 ), + 'LEFTB' => array( 208, -1, 1, 0 ), + 'RIGHTB' => array( 209, -1, 1, 0 ), + 'MIDB' => array( 210, 3, 1, 0 ), + 'LENB' => array( 211, 1, 1, 0 ), + 'ROUNDUP' => array( 212, 2, 1, 0 ), + 'ROUNDDOWN' => array( 213, 2, 1, 0 ), + 'ASC' => array( 214, 1, 1, 0 ), + 'DBCS' => array( 215, 1, 1, 0 ), + 'RANK' => array( 216, -1, 0, 0 ), + 'ADDRESS' => array( 219, -1, 1, 0 ), + 'DAYS360' => array( 220, -1, 1, 0 ), + 'TODAY' => array( 221, 0, 1, 1 ), + 'VDB' => array( 222, -1, 1, 0 ), + 'MEDIAN' => array( 227, -1, 0, 0 ), + 'SUMPRODUCT' => array( 228, -1, 2, 0 ), + 'SINH' => array( 229, 1, 1, 0 ), + 'COSH' => array( 230, 1, 1, 0 ), + 'TANH' => array( 231, 1, 1, 0 ), + 'ASINH' => array( 232, 1, 1, 0 ), + 'ACOSH' => array( 233, 1, 1, 0 ), + 'ATANH' => array( 234, 1, 1, 0 ), + 'DGET' => array( 235, 3, 0, 0 ), + 'INFO' => array( 244, 1, 1, 1 ), + 'DB' => array( 247, -1, 1, 0 ), + 'FREQUENCY' => array( 252, 2, 0, 0 ), + 'ERROR.TYPE' => array( 261, 1, 1, 0 ), + 'REGISTER.ID' => array( 267, -1, 1, 0 ), + 'AVEDEV' => array( 269, -1, 0, 0 ), + 'BETADIST' => array( 270, -1, 1, 0 ), + 'GAMMALN' => array( 271, 1, 1, 0 ), + 'BETAINV' => array( 272, -1, 1, 0 ), + 'BINOMDIST' => array( 273, 4, 1, 0 ), + 'CHIDIST' => array( 274, 2, 1, 0 ), + 'CHIINV' => array( 275, 2, 1, 0 ), + 'COMBIN' => array( 276, 2, 1, 0 ), + 'CONFIDENCE' => array( 277, 3, 1, 0 ), + 'CRITBINOM' => array( 278, 3, 1, 0 ), + 'EVEN' => array( 279, 1, 1, 0 ), + 'EXPONDIST' => array( 280, 3, 1, 0 ), + 'FDIST' => array( 281, 3, 1, 0 ), + 'FINV' => array( 282, 3, 1, 0 ), + 'FISHER' => array( 283, 1, 1, 0 ), + 'FISHERINV' => array( 284, 1, 1, 0 ), + 'FLOOR' => array( 285, 2, 1, 0 ), + 'GAMMADIST' => array( 286, 4, 1, 0 ), + 'GAMMAINV' => array( 287, 3, 1, 0 ), + 'CEILING' => array( 288, 2, 1, 0 ), + 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), + 'LOGNORMDIST' => array( 290, 3, 1, 0 ), + 'LOGINV' => array( 291, 3, 1, 0 ), + 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), + 'NORMDIST' => array( 293, 4, 1, 0 ), + 'NORMSDIST' => array( 294, 1, 1, 0 ), + 'NORMINV' => array( 295, 3, 1, 0 ), + 'NORMSINV' => array( 296, 1, 1, 0 ), + 'STANDARDIZE' => array( 297, 3, 1, 0 ), + 'ODD' => array( 298, 1, 1, 0 ), + 'PERMUT' => array( 299, 2, 1, 0 ), + 'POISSON' => array( 300, 3, 1, 0 ), + 'TDIST' => array( 301, 3, 1, 0 ), + 'WEIBULL' => array( 302, 4, 1, 0 ), + 'SUMXMY2' => array( 303, 2, 2, 0 ), + 'SUMX2MY2' => array( 304, 2, 2, 0 ), + 'SUMX2PY2' => array( 305, 2, 2, 0 ), + 'CHITEST' => array( 306, 2, 2, 0 ), + 'CORREL' => array( 307, 2, 2, 0 ), + 'COVAR' => array( 308, 2, 2, 0 ), + 'FORECAST' => array( 309, 3, 2, 0 ), + 'FTEST' => array( 310, 2, 2, 0 ), + 'INTERCEPT' => array( 311, 2, 2, 0 ), + 'PEARSON' => array( 312, 2, 2, 0 ), + 'RSQ' => array( 313, 2, 2, 0 ), + 'STEYX' => array( 314, 2, 2, 0 ), + 'SLOPE' => array( 315, 2, 2, 0 ), + 'TTEST' => array( 316, 4, 2, 0 ), + 'PROB' => array( 317, -1, 2, 0 ), + 'DEVSQ' => array( 318, -1, 0, 0 ), + 'GEOMEAN' => array( 319, -1, 0, 0 ), + 'HARMEAN' => array( 320, -1, 0, 0 ), + 'SUMSQ' => array( 321, -1, 0, 0 ), + 'KURT' => array( 322, -1, 0, 0 ), + 'SKEW' => array( 323, -1, 0, 0 ), + 'ZTEST' => array( 324, -1, 0, 0 ), + 'LARGE' => array( 325, 2, 0, 0 ), + 'SMALL' => array( 326, 2, 0, 0 ), + 'QUARTILE' => array( 327, 2, 0, 0 ), + 'PERCENTILE' => array( 328, 2, 0, 0 ), + 'PERCENTRANK' => array( 329, -1, 0, 0 ), + 'MODE' => array( 330, -1, 2, 0 ), + 'TRIMMEAN' => array( 331, 2, 0, 0 ), + 'TINV' => array( 332, 2, 1, 0 ), + 'CONCATENATE' => array( 336, -1, 1, 0 ), + 'POWER' => array( 337, 2, 1, 0 ), + 'RADIANS' => array( 342, 1, 1, 0 ), + 'DEGREES' => array( 343, 1, 1, 0 ), + 'SUBTOTAL' => array( 344, -1, 0, 0 ), + 'SUMIF' => array( 345, -1, 0, 0 ), + 'COUNTIF' => array( 346, 2, 0, 0 ), + 'COUNTBLANK' => array( 347, 1, 0, 0 ), + 'ISPMT' => array( 350, 4, 1, 0 ), + 'DATEDIF' => array( 351, 3, 1, 0 ), + 'DATESTRING' => array( 352, 1, 1, 0 ), + 'NUMBERSTRING' => array( 353, 2, 1, 0 ), + 'ROMAN' => array( 354, -1, 1, 0 ), + 'GETPIVOTDATA' => array( 358, -1, 0, 0 ), + 'HYPERLINK' => array( 359, -1, 1, 0 ), + 'PHONETIC' => array( 360, 1, 0, 0 ), + 'AVERAGEA' => array( 361, -1, 0, 0 ), + 'MAXA' => array( 362, -1, 0, 0 ), + 'MINA' => array( 363, -1, 0, 0 ), + 'STDEVPA' => array( 364, -1, 0, 0 ), + 'VARPA' => array( 365, -1, 0, 0 ), + 'STDEVA' => array( 366, -1, 0, 0 ), + 'VARA' => array( 367, -1, 0, 0 ), + 'BAHTTEXT' => array( 368, 1, 0, 0 ), + ); + } + + /** + * Convert a token to the proper ptg value. + * + * @access private + * @param mixed $token The token to convert. + * @return mixed the converted token on success + */ + function _convert($token) + { + if (preg_match("/\"([^\"]|\"\"){0,255}\"/", $token)) { + return $this->_convertString($token); + + } elseif (is_numeric($token)) { + return $this->_convertNumber($token); + + // match references like A1 or $A$1 + } elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$token)) { + return $this->_convertRef2d($token); + + // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1 + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?(\d+)$/u",$token)) { + return $this->_convertRef3d($token); + + // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1 + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?(\d+)$/u",$token)) { + return $this->_convertRef3d($token); + + // match ranges like A1:B2 or $A$1:$B$2 + } elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/', $token)) { + return $this->_convertRange2d($token); + + // match external ranges like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)\:\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)$/u",$token)) { + return $this->_convertRange3d($token); + + // match external ranges like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)\:\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)$/u",$token)) { + return $this->_convertRange3d($token); + + // operators (including parentheses) + } elseif (isset($this->ptg[$token])) { + return pack("C", $this->ptg[$token]); + + // match error codes + } elseif (preg_match("/^#[A-Z0\/]{3,5}[!?]{1}$/", $token) or $token == '#N/A') { + return $this->_convertError($token); + + // commented so argument number can be processed correctly. See toReversePolish(). + /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token)) + { + return($this->_convertFunction($token,$this->_func_args)); + }*/ + + // if it's an argument, ignore the token (the argument remains) + } elseif ($token == 'arg') { + return ''; + } + + // TODO: use real error codes + throw new Exception("Unknown token $token"); + } + + /** + * Convert a number token to ptgInt or ptgNum + * + * @access private + * @param mixed $num an integer or double for conversion to its ptg value + */ + function _convertNumber($num) + { + // Integer in the range 0..2**16-1 + if ((preg_match("/^\d+$/", $num)) and ($num <= 65535)) { + return pack("Cv", $this->ptg['ptgInt'], $num); + } else { // A float + if (PHPExcel_Writer_Excel5_BIFFwriter::getByteOrder()) { // if it's Big Endian + $num = strrev($num); + } + return pack("Cd", $this->ptg['ptgNum'], $num); + } + } + + /** + * Convert a string token to ptgStr + * + * @access private + * @param string $string A string for conversion to its ptg value. + * @return mixed the converted token on success + */ + function _convertString($string) + { + // chop away beggining and ending quotes + $string = substr($string, 1, strlen($string) - 2); + if (strlen($string) > 255) { + throw new Exception("String is too long"); + } + + return pack('C', $this->ptg['ptgStr']) . PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($string); + } + + /** + * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of + * args that it takes. + * + * @access private + * @param string $token The name of the function for convertion to ptg value. + * @param integer $num_args The number of arguments the function receives. + * @return string The packed ptg for the function + */ + function _convertFunction($token, $num_args) + { + $args = $this->_functions[$token][1]; +// $volatile = $this->_functions[$token][3]; + + // Fixed number of args eg. TIME($i,$j,$k). + if ($args >= 0) { + return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); + } + // Variable number of args eg. SUM($i,$j,$k, ..). + if ($args == -1) { + return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); + } + } + + /** + * Convert an Excel range such as A1:D4 to a ptgRefV. + * + * @access private + * @param string $range An Excel range in the A1:A2 + * @param int $class + */ + function _convertRange2d($range, $class=0) + { + + // TODO: possible class value 0,1,2 check Formula.pm + // Split the range into 2 cell refs + if (preg_match('/^(\$)?([A-Ia-i]?[A-Za-z])(\$)?(\d+)\:(\$)?([A-Ia-i]?[A-Za-z])(\$)?(\d+)$/', $range)) { + list($cell1, $cell2) = explode(':', $range); + } else { + // TODO: use real error codes + throw new Exception("Unknown range separator"); + } + + // Convert the cell references + list($row1, $col1) = $this->_cellToPackedRowcol($cell1); + list($row2, $col2) = $this->_cellToPackedRowcol($cell2); + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea']); + } elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgAreaV']); + } elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgAreaA']); + } else { + // TODO: use real error codes + throw new Exception("Unknown class $class"); + } + return $ptgArea . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to + * a ptgArea3d. + * + * @access private + * @param string $token An Excel range in the Sheet1!A1:A2 format. + * @return mixed The packed ptgArea3d token on success. + */ + function _convertRange3d($token) + { +// $class = 0; // formulas like Sheet1!$A$1:$A$2 in list type data validation need this class (0x3B) + + // Split the ref at the ! symbol + list($ext_ref, $range) = explode('!', $token); + + // Convert the external reference part (different for BIFF8) + $ext_ref = $this->_getRefIndex($ext_ref); + + // Split the range into 2 cell refs + list($cell1, $cell2) = explode(':', $range); + + // Convert the cell references + if (preg_match("/^(\\$)?[A-Ia-i]?[A-Za-z](\\$)?(\d+)$/", $cell1)) { + list($row1, $col1) = $this->_cellToPackedRowcol($cell1); + list($row2, $col2) = $this->_cellToPackedRowcol($cell2); + } else { // It's a rows range (like 26:27) + list($row1, $col1, $row2, $col2) = $this->_rangeToPackedRange($cell1.':'.$cell2); + } + + // The ptg value depends on the class of the ptg. +// if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea3d']); +// } elseif ($class == 1) { +// $ptgArea = pack("C", $this->ptg['ptgArea3dV']); +// } elseif ($class == 2) { +// $ptgArea = pack("C", $this->ptg['ptgArea3dA']); +// } else { +// throw new Exception("Unknown class $class"); +// } + + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. + * + * @access private + * @param string $cell An Excel cell reference + * @return string The cell in packed() format with the corresponding ptg + */ + function _convertRef2d($cell) + { +// $class = 2; // as far as I know, this is magick. + + // Convert the cell reference + $cell_array = $this->_cellToPackedRowcol($cell); + list($row, $col) = $cell_array; + + // The ptg value depends on the class of the ptg. +// if ($class == 0) { +// $ptgRef = pack("C", $this->ptg['ptgRef']); +// } elseif ($class == 1) { +// $ptgRef = pack("C", $this->ptg['ptgRefV']); +// } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRefA']); +// } else { +// // TODO: use real error codes +// throw new Exception("Unknown class $class"); +// } + return $ptgRef.$row.$col; + } + + /** + * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a + * ptgRef3d. + * + * @access private + * @param string $cell An Excel cell reference + * @return mixed The packed ptgRef3d token on success. + */ + function _convertRef3d($cell) + { +// $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $cell) = explode('!', $cell); + + // Convert the external reference part (different for BIFF8) + $ext_ref = $this->_getRefIndex($ext_ref); + + // Convert the cell reference part + list($row, $col) = $this->_cellToPackedRowcol($cell); + + // The ptg value depends on the class of the ptg. +// if ($class == 0) { +// $ptgRef = pack("C", $this->ptg['ptgRef3d']); +// } elseif ($class == 1) { +// $ptgRef = pack("C", $this->ptg['ptgRef3dV']); +// } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRef3dA']); +// } else { +// throw new Exception("Unknown class $class"); +// } + + return $ptgRef . $ext_ref. $row . $col; + } + + /** + * Convert an error code to a ptgErr + * + * @access private + * @param string $errorCode The error code for conversion to its ptg value + * @return string The error code ptgErr + */ + function _convertError($errorCode) + { + switch ($errorCode) { + case '#NULL!': return pack("C", 0x00); + case '#DIV/0!': return pack("C", 0x07); + case '#VALUE!': return pack("C", 0x0F); + case '#REF!': return pack("C", 0x17); + case '#NAME?': return pack("C", 0x1D); + case '#NUM!': return pack("C", 0x24); + case '#N/A': return pack("C", 0x2A); + } + return pack("C", 0xFF); + } + + /** + * Convert the sheet name part of an external reference, for example "Sheet1" or + * "Sheet1:Sheet2", to a packed structure. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return string The reference index in packed() format + */ + function _packExtRef($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = explode(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + throw new Exception("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + throw new Exception("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + throw new Exception("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // References are stored relative to 0xFFFF. + $offset = -1 - $sheet1; + + return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); + } + + /** + * Look up the REF index that corresponds to an external sheet name + * (or range). If it doesn't exist yet add it to the workbook's references + * array. It assumes all sheet names given must exist. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return mixed The reference index in packed() format on success + */ + function _getRefIndex($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + $ext_ref = str_replace('\'\'', '\'', $ext_ref); // Replace escaped '' with ' + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = explode(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + throw new Exception("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + throw new Exception("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + throw new Exception("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // assume all references belong to this document + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); + $total_references = count($this->_references); + $index = -1; + for ($i = 0; $i < $total_references; ++$i) { + if ($ref == $this->_references[$i]) { + $index = $i; + break; + } + } + // if REF was not found add it to references array + if ($index == -1) { + $this->_references[$total_references] = $ref; + $index = $total_references; + } + + return pack('v', $index); + } + + /** + * Look up the index that corresponds to an external sheet name. The hash of + * sheet names is updated by the addworksheet() method of the + * PHPExcel_Writer_Excel5_Workbook class. + * + * @access private + * @param string $sheet_name Sheet name + * @return integer The sheet index, -1 if the sheet was not found + */ + function _getSheetIndex($sheet_name) + { + if (!isset($this->_ext_sheets[$sheet_name])) { + return -1; + } else { + return $this->_ext_sheets[$sheet_name]; + } + } + + /** + * This method is used to update the array of sheet names. It is + * called by the addWorksheet() method of the + * PHPExcel_Writer_Excel5_Workbook class. + * + * @access public + * @see PHPExcel_Writer_Excel5_Workbook::addWorksheet() + * @param string $name The name of the worksheet being added + * @param integer $index The index of the worksheet being added + */ + function setExtSheet($name, $index) + { + $this->_ext_sheets[$name] = $index; + } + + /** + * pack() row and column into the required 3 or 4 byte format. + * + * @access private + * @param string $cell The Excel cell reference to be packed + * @return array Array containing the row and column in packed() format + */ + function _cellToPackedRowcol($cell) + { + $cell = strtoupper($cell); + list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); + if ($col >= 256) { + throw new Exception("Column in: $cell greater than 255"); + } + // FIXME: change for BIFF8 + if ($row >= 16384) { + throw new Exception("Row in: $cell greater than 16384 "); + } + + // Set the high bits to indicate if row or col are relative. + $col |= $col_rel << 14; + $col |= $row_rel << 15; + $col = pack('v', $col); + + $row = pack('v', $row); + + return array($row, $col); + } + + /** + * pack() row range into the required 3 or 4 byte format. + * Just using maximum col/rows, which is probably not the correct solution + * + * @access private + * @param string $range The Excel range to be packed + * @return array Array containing (row1,col1,row2,col2) in packed() format + */ + function _rangeToPackedRange($range) + { + preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); + // return absolute rows if there is a $ in the ref + $row1_rel = empty($match[1]) ? 1 : 0; + $row1 = $match[2]; + $row2_rel = empty($match[3]) ? 1 : 0; + $row2 = $match[4]; + // Convert 1-index to zero-index + --$row1; + --$row2; + // Trick poor inocent Excel + $col1 = 0; + $col2 = 16383; // FIXME: maximum possible value for Excel 5 (change this!!!) + + // FIXME: this changes for BIFF8 + if (($row1 >= 16384) or ($row2 >= 16384)) { + throw new Exception("Row in: $range greater than 16384 "); + } + + // Set the high bits to indicate if rows are relative. + $col1 |= $row1_rel << 15; + $col2 |= $row2_rel << 15; + $col1 = pack('v', $col1); + $col2 = pack('v', $col2); + + $row1 = pack('v', $row1); + $row2 = pack('v', $row2); + + return array($row1, $col1, $row2, $col2); + } + + /** + * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero + * indexed row and column number. Also returns two (0,1) values to indicate + * whether the row or column are relative references. + * + * @access private + * @param string $cell The Excel cell reference in A1 format. + * @return array + */ + function _cellToRowcol($cell) + { + preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match); + // return absolute column if there is a $ in the ref + $col_rel = empty($match[1]) ? 1 : 0; + $col_ref = $match[2]; + $row_rel = empty($match[3]) ? 1 : 0; + $row = $match[4]; + + // Convert base26 column string to a number. + $expn = strlen($col_ref) - 1; + $col = 0; + $col_ref_length = strlen($col_ref); + for ($i = 0; $i < $col_ref_length; ++$i) { + $col += (ord($col_ref{$i}) - 64) * pow(26, $expn); + --$expn; + } + + // Convert 1-index to zero-index + --$row; + --$col; + + return array($row, $col, $row_rel, $col_rel); + } + + /** + * Advance to the next valid token. + * + * @access private + */ + function _advance() + { + $i = $this->_current_char; + $formula_length = strlen($this->_formula); + // eat up white spaces + if ($i < $formula_length) { + while ($this->_formula{$i} == " ") { + ++$i; + } + + if ($i < ($formula_length - 1)) { + $this->_lookahead = $this->_formula{$i+1}; + } + $token = ''; + } + + while ($i < $formula_length) { + $token .= $this->_formula{$i}; + + if ($i < ($formula_length - 1)) { + $this->_lookahead = $this->_formula{$i+1}; + } else { + $this->_lookahead = ''; + } + + if ($this->_match($token) != '') { + //if ($i < strlen($this->_formula) - 1) { + // $this->_lookahead = $this->_formula{$i+1}; + //} + $this->_current_char = $i + 1; + $this->_current_token = $token; + return 1; + } + + if ($i < ($formula_length - 2)) { + $this->_lookahead = $this->_formula{$i+2}; + } else { // if we run out of characters _lookahead becomes empty + $this->_lookahead = ''; + } + ++$i; + } + //die("Lexical error ".$this->_current_char); + } + + /** + * Checks if it's a valid token. + * + * @access private + * @param mixed $token The token to check. + * @return mixed The checked token or false on failure + */ + function _match($token) + { + switch($token) { + case "+": + case "-": + case "*": + case "/": + case "(": + case ")": + case ",": + case ";": + case ">=": + case "<=": + case "=": + case "<>": + case "^": + case "&": + case "%": + return $token; + break; + case ">": + if ($this->_lookahead == '=') { // it's a GE token + break; + } + return $token; + break; + case "<": + // it's a LE or a NE token + if (($this->_lookahead == '=') or ($this->_lookahead == '>')) { + break; + } + return $token; + break; + default: + // if it's a reference A1 or $A$1 or $A1 or A$1 + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.') and + ($this->_lookahead != '!')) + { + return $token; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) + elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) + elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // if it's a range A1:A2 or $A$1:$A$2 + elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's an external range like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 + elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 + elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's a number (check that it's not a sheet name or range) + elseif (is_numeric($token) and + (!is_numeric($token.$this->_lookahead) or ($this->_lookahead == '')) and + ($this->_lookahead != '!') and ($this->_lookahead != ':')) + { + return $token; + } + // If it's a string (of maximum 255 characters) + elseif (preg_match("/\"([^\"]|\"\"){0,255}\"/",$token) and $this->_lookahead != '"' and (substr_count($token, '"')%2 == 0)) + { + return $token; + } + // If it's an error code + elseif (preg_match("/^#[A-Z0\/]{3,5}[!?]{1}$/", $token) or $token == '#N/A') + { + return $token; + } + // if it's a function call + elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$token) and ($this->_lookahead == "(")) + { + return $token; + } + // It's an argument of some description (e.g. a named range), + // precise nature yet to be determined + elseif(substr($token,-1) == ')') { + return $token; + } + return ''; + } + } + + /** + * The parsing method. It parses a formula. + * + * @access public + * @param string $formula The formula to parse, without the initial equal + * sign (=). + * @return mixed true on success + */ + function parse($formula) + { + $this->_current_char = 0; + $this->_formula = $formula; + $this->_lookahead = isset($formula{1}) ? $formula{1} : ''; + $this->_advance(); + $this->_parse_tree = $this->_condition(); + return true; + } + + /** + * It parses a condition. It assumes the following rule: + * Cond -> Expr [(">" | "<") Expr] + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + function _condition() + { + $result = $this->_expression(); + if ($this->_current_token == "<") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgLT', $result, $result2); + } elseif ($this->_current_token == ">") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgGT', $result, $result2); + } elseif ($this->_current_token == "<=") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgLE', $result, $result2); + } elseif ($this->_current_token == ">=") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgGE', $result, $result2); + } elseif ($this->_current_token == "=") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgEQ', $result, $result2); + } elseif ($this->_current_token == "<>") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgNE', $result, $result2); + } elseif ($this->_current_token == "&") { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgConcat', $result, $result2); + } + return $result; + } + + /** + * It parses a expression. It assumes the following rule: + * Expr -> Term [("+" | "-") Term] + * -> "string" + * -> "-" Term : Negative value + * -> "+" Term : Positive value + * -> Error code + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + function _expression() + { + // If it's a string return a string node + if (preg_match("/\"([^\"]|\"\"){0,255}\"/", $this->_current_token)) { + $tmp = str_replace('""', '"', $this->_current_token); + if (($tmp == '"') || ($tmp == '')) $tmp = '""'; // Trap for "" that has been used for an empty string + $result = $this->_createTree($tmp, '', ''); + $this->_advance(); + return $result; + // If it's an error code + } elseif (preg_match("/^#[A-Z0\/]{3,5}[!?]{1}$/", $this->_current_token) or $this->_current_token == '#N/A'){ + $result = $this->_createTree($this->_current_token, 'ptgErr', ''); + $this->_advance(); + return $result; + // If it's a negative value + } elseif ($this->_current_token == "-") { + // catch "-" Term + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgUminus', $result2, ''); + return $result; + // If it's a positive value + } elseif ($this->_current_token == "+") { + // catch "+" Term + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgUplus', $result2, ''); + return $result; + } + $result = $this->_term(); + while (($this->_current_token == "+") or + ($this->_current_token == "-") or + ($this->_current_token == "^")) { + /**/ + if ($this->_current_token == "+") { + $this->_advance(); + $result2 = $this->_term(); + $result = $this->_createTree('ptgAdd', $result, $result2); + } elseif ($this->_current_token == "-") { + $this->_advance(); + $result2 = $this->_term(); + $result = $this->_createTree('ptgSub', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_term(); + $result = $this->_createTree('ptgPower', $result, $result2); + } + } + return $result; + } + + /** + * This function just introduces a ptgParen element in the tree, so that Excel + * doesn't get confused when working with a parenthesized formula afterwards. + * + * @access private + * @see _fact() + * @return array The parsed ptg'd tree + */ + function _parenthesizedExpression() + { + $result = $this->_createTree('ptgParen', $this->_expression(), ''); + return $result; + } + + /** + * It parses a term. It assumes the following rule: + * Term -> Fact [("*" | "/") Fact] + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + function _term() + { + $result = $this->_fact(); + while (($this->_current_token == "*") or + ($this->_current_token == "/")) { + /**/ + if ($this->_current_token == "*") { + $this->_advance(); + $result2 = $this->_fact(); + $result = $this->_createTree('ptgMul', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_fact(); + $result = $this->_createTree('ptgDiv', $result, $result2); + } + } + return $result; + } + + /** + * It parses a factor. It assumes the following rule: + * Fact -> ( Expr ) + * | CellRef + * | CellRange + * | Number + * | Function + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + function _fact() + { + if ($this->_current_token == "(") { + $this->_advance(); // eat the "(" + $result = $this->_parenthesizedExpression(); + if ($this->_current_token != ")") { + throw new Exception("')' token expected."); + } + $this->_advance(); // eat the ")" + return $result; + } + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) + elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) + elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a range A1:B2 or $A$1:$B$2 + elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/',$this->_current_token) or + preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/',$this->_current_token)) + { + // must be an error? + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external range (Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2) + elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u",$this->_current_token)) + { + // must be an error? + //$result = $this->_current_token; + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external range ('Sheet1'!A1:B2 or 'Sheet1'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1'!$A$1:$B$2) + elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u",$this->_current_token)) + { + // must be an error? + //$result = $this->_current_token; + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's a number or a percent + elseif (is_numeric($this->_current_token)) + { + if($this->_lookahead == '%'){ + $result = $this->_createTree('ptgPercent', $this->_current_token, ''); + } else { + $result = $this->_createTree($this->_current_token, '', ''); + } + $this->_advance(); + return $result; + } + // if it's a function call + elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$this->_current_token)) + { + $result = $this->_func(); + return $result; + } + throw new Exception("Syntax error: ".$this->_current_token. + ", lookahead: ".$this->_lookahead. + ", current char: ".$this->_current_char); + } + + /** + * It parses a function call. It assumes the following rule: + * Func -> ( Expr [,Expr]* ) + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + function _func() + { + $num_args = 0; // number of arguments received + $function = strtoupper($this->_current_token); + $result = ''; // initialize result + $this->_advance(); + $this->_advance(); // eat the "(" + while ($this->_current_token != ')') { + /**/ + if ($num_args > 0) { + if ($this->_current_token == "," or + $this->_current_token == ";") + { + $this->_advance(); // eat the "," or ";" + } else { + throw new Exception("Syntax error: comma expected in ". + "function $function, arg #{$num_args}"); + } + $result2 = $this->_condition(); + $result = $this->_createTree('arg', $result, $result2); + } else { // first argument + $result2 = $this->_condition(); + $result = $this->_createTree('arg', '', $result2); + } + ++$num_args; + } + if (!isset($this->_functions[$function])) { + throw new Exception("Function $function() doesn't exist"); + } + $args = $this->_functions[$function][1]; + // If fixed number of args eg. TIME($i,$j,$k). Check that the number of args is valid. + if (($args >= 0) and ($args != $num_args)) { + throw new Exception("Incorrect number of arguments in function $function() "); + } + + $result = $this->_createTree($function, $result, $num_args); + $this->_advance(); // eat the ")" + return $result; + } + + /** + * Creates a tree. In fact an array which may have one or two arrays (sub-trees) + * as elements. + * + * @access private + * @param mixed $value The value of this node. + * @param mixed $left The left array (sub-tree) or a final node. + * @param mixed $right The right array (sub-tree) or a final node. + * @return array A tree + */ + function _createTree($value, $left, $right) + { + return array('value' => $value, 'left' => $left, 'right' => $right); + } + + /** + * Builds a string containing the tree in reverse polish notation (What you + * would use in a HP calculator stack). + * The following tree: + * + * + + * / \ + * 2 3 + * + * produces: "23+" + * + * The following tree: + * + * + + * / \ + * 3 * + * / \ + * 6 A1 + * + * produces: "36A1*+" + * + * In fact all operands, functions, references, etc... are written as ptg's + * + * @access public + * @param array $tree The optional tree to convert. + * @return string The tree in reverse polish notation + */ + function toReversePolish($tree = array()) + { + $polish = ""; // the string we are going to return + if (empty($tree)) { // If it's the first call use _parse_tree + $tree = $this->_parse_tree; + } + + if (is_array($tree['left'])) { + $converted_tree = $this->toReversePolish($tree['left']); + $polish .= $converted_tree; + } elseif ($tree['left'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['left']); + $polish .= $converted_tree; + } + if (is_array($tree['right'])) { + $converted_tree = $this->toReversePolish($tree['right']); + $polish .= $converted_tree; + } elseif ($tree['right'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['right']); + $polish .= $converted_tree; + } + // if it's a function convert it here (so we can set it's arguments) + if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and + !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and + !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and + !is_numeric($tree['value']) and + !isset($this->ptg[$tree['value']])) + { + // left subtree for a function is always an array. + if ($tree['left'] != '') { + $left_tree = $this->toReversePolish($tree['left']); + } else { + $left_tree = ''; + } + // add it's left subtree and return. + return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); + } else { + $converted_tree = $this->_convert($tree['value']); + } + $polish .= $converted_tree; + return $polish; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Workbook.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Workbook.php new file mode 100644 index 000000000..2e177ceff --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Workbook.php @@ -0,0 +1,1450 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Workbook (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// /* +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ + + +/** + * PHPExcel_Writer_Excel5_Workbook + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter +{ + /** + * Formula parser + * + * @var PHPExcel_Writer_Excel5_Parser + */ + private $_parser; + + /** + * The BIFF file size for the workbook. + * @var integer + * @see _calcSheetOffsets() + */ + public $_biffsize; + + /** + * XF Writers + * @var PHPExcel_Writer_Excel5_Xf[] + */ + private $_xfWriters = array(); + + /** + * Array containing the colour palette + * @var array + */ + public $_palette; + + /** + * The codepage indicates the text encoding used for strings + * @var integer + */ + public $_codepage; + + /** + * The country code used for localization + * @var integer + */ + public $_country_code; + + /** + * Workbook + * @var PHPExcel + */ + private $_phpExcel; + + /** + * Fonts writers + * + * @var PHPExcel_Writer_Excel5_Font[] + */ + private $_fontWriters = array(); + + /** + * Added fonts. Maps from font's hash => index in workbook + * + * @var array + */ + private $_addedFonts = array(); + + /** + * Shared number formats + * + * @var array + */ + private $_numberFormats = array(); + + /** + * Added number formats. Maps from numberFormat's hash => index in workbook + * + * @var array + */ + private $_addedNumberFormats = array(); + + /** + * Sizes of the binary worksheet streams + * + * @var array + */ + private $_worksheetSizes = array(); + + /** + * Offsets of the binary worksheet streams relative to the start of the global workbook stream + * + * @var array + */ + private $_worksheetOffsets = array(); + + /** + * Total number of shared strings in workbook + * + * @var int + */ + private $_str_total; + + /** + * Number of unique shared strings in workbook + * + * @var int + */ + private $_str_unique; + + /** + * Array of unique shared strings in workbook + * + * @var array + */ + private $_str_table; + + /** + * Color cache + */ + private $_colors; + + /** + * Escher object corresponding to MSODRAWINGGROUP + * + * @var PHPExcel_Shared_Escher + */ + private $_escher; + + + /** + * Class constructor + * + * @param PHPExcel $phpExcel The Workbook + * @param int &$str_total Total number of strings + * @param int &$str_unique Total number of unique strings + * @param array &$str_table String Table + * @param array &$colors Colour Table + * @param mixed $parser The formula parser created for the Workbook + */ + public function __construct(PHPExcel $phpExcel = null, + &$str_total, &$str_unique, &$str_table, &$colors, + $parser ) + { + // It needs to call its parent's constructor explicitly + parent::__construct(); + + $this->_parser = $parser; + $this->_biffsize = 0; + $this->_palette = array(); + $this->_country_code = -1; + + $this->_str_total = &$str_total; + $this->_str_unique = &$str_unique; + $this->_str_table = &$str_table; + $this->_colors = &$colors; + $this->_setPaletteXl97(); + + $this->_phpExcel = $phpExcel; + + // set BIFFwriter limit for CONTINUE records + // $this->_limit = 8224; + $this->_codepage = 0x04B0; + + // Add empty sheets and Build color cache + $countSheets = $phpExcel->getSheetCount(); + for ($i = 0; $i < $countSheets; ++$i) { + $phpSheet = $phpExcel->getSheet($i); + + $this->_parser->setExtSheet($phpSheet->getTitle(), $i); // Register worksheet name with parser + + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $i, $i); + $this->_parser->_references[] = $ref; // Register reference with parser + + // Sheet tab colors? + if ($phpSheet->isTabColorSet()) { + $this->_addColor($phpSheet->getTabColor()->getRGB()); + } + } + + } + + /** + * Add a new XF writer + * + * @param PHPExcel_Style + * @param boolean Is it a style XF? + * @return int Index to XF record + */ + public function addXfWriter($style, $isStyleXf = false) + { + $xfWriter = new PHPExcel_Writer_Excel5_Xf($style); + $xfWriter->setIsStyleXf($isStyleXf); + + // Add the font if not already added + $fontIndex = $this->_addFont($style->getFont()); + + // Assign the font index to the xf record + $xfWriter->setFontIndex($fontIndex); + + // Background colors, best to treat these after the font so black will come after white in custom palette + $xfWriter->setFgColor($this->_addColor($style->getFill()->getStartColor()->getRGB())); + $xfWriter->setBgColor($this->_addColor($style->getFill()->getEndColor()->getRGB())); + $xfWriter->setBottomColor($this->_addColor($style->getBorders()->getBottom()->getColor()->getRGB())); + $xfWriter->setTopColor($this->_addColor($style->getBorders()->getTop()->getColor()->getRGB())); + $xfWriter->setRightColor($this->_addColor($style->getBorders()->getRight()->getColor()->getRGB())); + $xfWriter->setLeftColor($this->_addColor($style->getBorders()->getLeft()->getColor()->getRGB())); + $xfWriter->setDiagColor($this->_addColor($style->getBorders()->getDiagonal()->getColor()->getRGB())); + + // Add the number format if it is not a built-in one and not already added + if ($style->getNumberFormat()->getBuiltInFormatCode() === false) { + $numberFormatHashCode = $style->getNumberFormat()->getHashCode(); + + if (isset($this->_addedNumberFormats[$numberFormatHashCode])) { + $numberFormatIndex = $this->_addedNumberFormats[$numberFormatHashCode]; + } else { + $numberFormatIndex = 164 + count($this->_numberFormats); + $this->_numberFormats[$numberFormatIndex] = $style->getNumberFormat(); + $this->_addedNumberFormats[$numberFormatHashCode] = $numberFormatIndex; + } + } else { + $numberFormatIndex = (int) $style->getNumberFormat()->getBuiltInFormatCode(); + } + + // Assign the number format index to xf record + $xfWriter->setNumberFormatIndex($numberFormatIndex); + + $this->_xfWriters[] = $xfWriter; + + $xfIndex = count($this->_xfWriters) - 1; + return $xfIndex; + } + + /** + * Add a font to added fonts + * + * @param PHPExcel_Style_Font $font + * @return int Index to FONT record + */ + public function _addFont(PHPExcel_Style_Font $font) + { + $fontHashCode = $font->getHashCode(); + if(isset($this->_addedFonts[$fontHashCode])){ + $fontIndex = $this->_addedFonts[$fontHashCode]; + } else { + $countFonts = count($this->_fontWriters); + $fontIndex = ($countFonts < 4) ? $countFonts : $countFonts + 1; + + $fontWriter = new PHPExcel_Writer_Excel5_Font($font); + $fontWriter->setColorIndex($this->_addColor($font->getColor()->getRGB())); + $this->_fontWriters[] = $fontWriter; + + $this->_addedFonts[$fontHashCode] = $fontIndex; + } + return $fontIndex; + } + /** + * Alter color palette adding a custom color + * + * @param string $rgb E.g. 'FF00AA' + * @return int Color index + */ + private function _addColor($rgb) { + if (!isset($this->_colors[$rgb])) { + if (count($this->_colors) < 57) { + // then we add a custom color altering the palette + $colorIndex = 8 + count($this->_colors); + $this->_palette[$colorIndex] = + array( + hexdec(substr($rgb, 0, 2)), + hexdec(substr($rgb, 2, 2)), + hexdec(substr($rgb, 4)), + 0 + ); + $this->_colors[$rgb] = $colorIndex; + } else { + // no room for more custom colors, just map to black + $colorIndex = 0; + } + } else { + // fetch already added custom color + $colorIndex = $this->_colors[$rgb]; + } + + return $colorIndex; + } + + /** + * Sets the colour palette to the Excel 97+ default. + * + * @access private + */ + function _setPaletteXl97() + { + $this->_palette = array( + 0x08 => array(0x00, 0x00, 0x00, 0x00), + 0x09 => array(0xff, 0xff, 0xff, 0x00), + 0x0A => array(0xff, 0x00, 0x00, 0x00), + 0x0B => array(0x00, 0xff, 0x00, 0x00), + 0x0C => array(0x00, 0x00, 0xff, 0x00), + 0x0D => array(0xff, 0xff, 0x00, 0x00), + 0x0E => array(0xff, 0x00, 0xff, 0x00), + 0x0F => array(0x00, 0xff, 0xff, 0x00), + 0x10 => array(0x80, 0x00, 0x00, 0x00), + 0x11 => array(0x00, 0x80, 0x00, 0x00), + 0x12 => array(0x00, 0x00, 0x80, 0x00), + 0x13 => array(0x80, 0x80, 0x00, 0x00), + 0x14 => array(0x80, 0x00, 0x80, 0x00), + 0x15 => array(0x00, 0x80, 0x80, 0x00), + 0x16 => array(0xc0, 0xc0, 0xc0, 0x00), + 0x17 => array(0x80, 0x80, 0x80, 0x00), + 0x18 => array(0x99, 0x99, 0xff, 0x00), + 0x19 => array(0x99, 0x33, 0x66, 0x00), + 0x1A => array(0xff, 0xff, 0xcc, 0x00), + 0x1B => array(0xcc, 0xff, 0xff, 0x00), + 0x1C => array(0x66, 0x00, 0x66, 0x00), + 0x1D => array(0xff, 0x80, 0x80, 0x00), + 0x1E => array(0x00, 0x66, 0xcc, 0x00), + 0x1F => array(0xcc, 0xcc, 0xff, 0x00), + 0x20 => array(0x00, 0x00, 0x80, 0x00), + 0x21 => array(0xff, 0x00, 0xff, 0x00), + 0x22 => array(0xff, 0xff, 0x00, 0x00), + 0x23 => array(0x00, 0xff, 0xff, 0x00), + 0x24 => array(0x80, 0x00, 0x80, 0x00), + 0x25 => array(0x80, 0x00, 0x00, 0x00), + 0x26 => array(0x00, 0x80, 0x80, 0x00), + 0x27 => array(0x00, 0x00, 0xff, 0x00), + 0x28 => array(0x00, 0xcc, 0xff, 0x00), + 0x29 => array(0xcc, 0xff, 0xff, 0x00), + 0x2A => array(0xcc, 0xff, 0xcc, 0x00), + 0x2B => array(0xff, 0xff, 0x99, 0x00), + 0x2C => array(0x99, 0xcc, 0xff, 0x00), + 0x2D => array(0xff, 0x99, 0xcc, 0x00), + 0x2E => array(0xcc, 0x99, 0xff, 0x00), + 0x2F => array(0xff, 0xcc, 0x99, 0x00), + 0x30 => array(0x33, 0x66, 0xff, 0x00), + 0x31 => array(0x33, 0xcc, 0xcc, 0x00), + 0x32 => array(0x99, 0xcc, 0x00, 0x00), + 0x33 => array(0xff, 0xcc, 0x00, 0x00), + 0x34 => array(0xff, 0x99, 0x00, 0x00), + 0x35 => array(0xff, 0x66, 0x00, 0x00), + 0x36 => array(0x66, 0x66, 0x99, 0x00), + 0x37 => array(0x96, 0x96, 0x96, 0x00), + 0x38 => array(0x00, 0x33, 0x66, 0x00), + 0x39 => array(0x33, 0x99, 0x66, 0x00), + 0x3A => array(0x00, 0x33, 0x00, 0x00), + 0x3B => array(0x33, 0x33, 0x00, 0x00), + 0x3C => array(0x99, 0x33, 0x00, 0x00), + 0x3D => array(0x99, 0x33, 0x66, 0x00), + 0x3E => array(0x33, 0x33, 0x99, 0x00), + 0x3F => array(0x33, 0x33, 0x33, 0x00), + ); + } + + /** + * Assemble worksheets into a workbook and send the BIFF data to an OLE + * storage. + * + * @param array $pWorksheetSizes The sizes in bytes of the binary worksheet streams + * @return string Binary data for workbook stream + */ + public function writeWorkbook($pWorksheetSizes = null) + { + $this->_worksheetSizes = $pWorksheetSizes; + + // Calculate the number of selected worksheet tabs and call the finalization + // methods for each worksheet + $total_worksheets = $this->_phpExcel->getSheetCount(); + + // Add part 1 of the Workbook globals, what goes before the SHEET records + $this->_storeBof(0x0005); + $this->_writeCodepage(); + $this->_writeWindow1(); + + $this->_writeDatemode(); + $this->_writeAllFonts(); + $this->_writeAllNumFormats(); + $this->_writeAllXfs(); + $this->_writeAllStyles(); + $this->_writePalette(); + + // Prepare part 3 of the workbook global stream, what goes after the SHEET records + $part3 = ''; + if ($this->_country_code != -1) { + $part3 .= $this->_writeCountry(); + } + $part3 .= $this->_writeRecalcId(); + + $part3 .= $this->_writeSupbookInternal(); + /* TODO: store external SUPBOOK records and XCT and CRN records + in case of external references for BIFF8 */ + $part3 .= $this->_writeExternsheetBiff8(); + $part3 .= $this->_writeAllDefinedNamesBiff8(); + $part3 .= $this->_writeMsoDrawingGroup(); + $part3 .= $this->_writeSharedStringsTable(); + + $part3 .= $this->writeEof(); + + // Add part 2 of the Workbook globals, the SHEET records + $this->_calcSheetOffsets(); + for ($i = 0; $i < $total_worksheets; ++$i) { + $this->_writeBoundsheet($this->_phpExcel->getSheet($i), $this->_worksheetOffsets[$i]); + } + + // Add part 3 of the Workbook globals + $this->_data .= $part3; + + return $this->_data; + } + + /** + * Calculate offsets for Worksheet BOF records. + * + * @access private + */ + function _calcSheetOffsets() + { + $boundsheet_length = 10; // fixed length for a BOUNDSHEET record + + // size of Workbook globals part 1 + 3 + $offset = $this->_datasize; + + // add size of Workbook globals part 2, the length of the SHEET records + $total_worksheets = count($this->_phpExcel->getAllSheets()); + foreach ($this->_phpExcel->getWorksheetIterator() as $sheet) { + $offset += $boundsheet_length + strlen(PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($sheet->getTitle())); + } + + // add the sizes of each of the Sheet substreams, respectively + for ($i = 0; $i < $total_worksheets; ++$i) { + $this->_worksheetOffsets[$i] = $offset; + $offset += $this->_worksheetSizes[$i]; + } + $this->_biffsize = $offset; + } + + /** + * Store the Excel FONT records. + */ + private function _writeAllFonts() + { + foreach ($this->_fontWriters as $fontWriter) { + $this->_append($fontWriter->writeFont()); + } + } + + /** + * Store user defined numerical formats i.e. FORMAT records + */ + private function _writeAllNumFormats() + { + foreach ($this->_numberFormats as $numberFormatIndex => $numberFormat) { + $this->_writeNumFormat($numberFormat->getFormatCode(), $numberFormatIndex); + } + } + + /** + * Write all XF records. + */ + private function _writeAllXfs() + { + foreach ($this->_xfWriters as $xfWriter) { + $this->_append($xfWriter->writeXf()); + } + } + + /** + * Write all STYLE records. + */ + private function _writeAllStyles() + { + $this->_writeStyle(); + } + + /** + * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for + * the NAME records. + */ + private function _writeExterns() + { + $countSheets = $this->_phpExcel->getSheetCount(); + // Create EXTERNCOUNT with number of worksheets + $this->_writeExterncount($countSheets); + + // Create EXTERNSHEET for each worksheet + for ($i = 0; $i < $countSheets; ++$i) { + $this->_writeExternsheet($this->_phpExcel->getSheet($i)->getTitle()); + } + } + + /** + * Write the NAME record to define the print area and the repeat rows and cols. + */ + private function _writeNames() + { + // total number of sheets + $total_worksheets = $this->_phpExcel->getSheetCount(); + + // Create the print area NAME records + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->_phpExcel->getSheet($i)->getPageSetup(); + // Write a Name record if the print area has been defined + if ($sheetSetup->isPrintAreaSet()) { + // Print area + $printArea = PHPExcel_Cell::splitRange($sheetSetup->getPrintArea()); + $printArea = $printArea[0]; + $printArea[0] = PHPExcel_Cell::coordinateFromString($printArea[0]); + $printArea[1] = PHPExcel_Cell::coordinateFromString($printArea[1]); + + $print_rowmin = $printArea[0][1] - 1; + $print_rowmax = $printArea[1][1] - 1; + $print_colmin = PHPExcel_Cell::columnIndexFromString($printArea[0][0]) - 1; + $print_colmax = PHPExcel_Cell::columnIndexFromString($printArea[1][0]) - 1; + + $this->_writeNameShort( + $i, // sheet index + 0x06, // NAME type + $print_rowmin, + $print_rowmax, + $print_colmin, + $print_colmax + ); + } + } + + // Create the print title NAME records + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->_phpExcel->getSheet($i)->getPageSetup(); + + // simultaneous repeatColumns repeatRows + if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + + $this->_writeNameLong( + $i, // sheet index + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + + // (exclusive) either repeatColumns or repeatRows + } else if ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) { + + // Columns to repeat + if ($sheetSetup->isColumnsToRepeatAtLeftSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + } else { + $colmin = 0; + $colmax = 255; + } + + // Rows to repeat + if ($sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + } else { + $rowmin = 0; + $rowmax = 16383; + } + + $this->_writeNameShort( + $i, // sheet index + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } + } + } + + /** + * Writes all the DEFINEDNAME records (BIFF8). + * So far this is only used for repeating rows/columns (print titles) and print areas + */ + private function _writeAllDefinedNamesBiff8() + { + $chunk = ''; + + // Named ranges + if (count($this->_phpExcel->getNamedRanges()) > 0) { + // Loop named ranges + $namedRanges = $this->_phpExcel->getNamedRanges(); + foreach ($namedRanges as $namedRange) { + + // Create absolute coordinate + $range = PHPExcel_Cell::splitRange($namedRange->getRange()); + for ($i = 0; $i < count($range); $i++) { + $range[$i][0] = '\'' . str_replace("'", "''", $namedRange->getWorksheet()->getTitle()) . '\'!' . PHPExcel_Cell::absoluteCoordinate($range[$i][0]); + if (isset($range[$i][1])) { + $range[$i][1] = PHPExcel_Cell::absoluteCoordinate($range[$i][1]); + } + } + $range = PHPExcel_Cell::buildRange($range); // e.g. Sheet1!$A$1:$B$2 + + // parse formula + try { + $error = $this->_parser->parse($range); + $formulaData = $this->_parser->toReversePolish(); + + // make sure tRef3d is of type tRef3dR (0x3A) + if (isset($formulaData{0}) and ($formulaData{0} == "\x7A" or $formulaData{0} == "\x5A")) { + $formulaData = "\x3A" . substr($formulaData, 1); + } + + if ($namedRange->getLocalOnly()) { + // local scope + $scope = $this->_phpExcel->getIndex($namedRange->getScope()) + 1; + } else { + // global scope + $scope = 0; + } + $chunk .= $this->writeData($this->_writeDefinedNameBiff8($namedRange->getName(), $formulaData, $scope, false)); + + } catch(Exception $e) { + // do nothing + } + } + } + + // total number of sheets + $total_worksheets = $this->_phpExcel->getSheetCount(); + + // write the print titles (repeating rows, columns), if any + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->_phpExcel->getSheet($i)->getPageSetup(); + // simultaneous repeatColumns repeatRows + if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + + // construct formula data manually + $formulaData = pack('Cv', 0x29, 0x17); // tMemFunc + $formulaData .= pack('Cvvvvv', 0x3B, $i, 0, 65535, $colmin, $colmax); // tArea3d + $formulaData .= pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, 0, 255); // tArea3d + $formulaData .= pack('C', 0x10); // tList + + // store the DEFINEDNAME record + $chunk .= $this->writeData($this->_writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true)); + + // (exclusive) either repeatColumns or repeatRows + } else if ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) { + + // Columns to repeat + if ($sheetSetup->isColumnsToRepeatAtLeftSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + } else { + $colmin = 0; + $colmax = 255; + } + // Rows to repeat + if ($sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + } else { + $rowmin = 0; + $rowmax = 65535; + } + + // construct formula data manually because parser does not recognize absolute 3d cell references + $formulaData = pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, $colmin, $colmax); + + // store the DEFINEDNAME record + $chunk .= $this->writeData($this->_writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true)); + } + } + + // write the print areas, if any + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->_phpExcel->getSheet($i)->getPageSetup(); + if ($sheetSetup->isPrintAreaSet()) { + // Print area, e.g. A3:J6,H1:X20 + $printArea = PHPExcel_Cell::splitRange($sheetSetup->getPrintArea()); + $countPrintArea = count($printArea); + + $formulaData = ''; + for ($j = 0; $j < $countPrintArea; ++$j) { + $printAreaRect = $printArea[$j]; // e.g. A3:J6 + $printAreaRect[0] = PHPExcel_Cell::coordinateFromString($printAreaRect[0]); + $printAreaRect[1] = PHPExcel_Cell::coordinateFromString($printAreaRect[1]); + + $print_rowmin = $printAreaRect[0][1] - 1; + $print_rowmax = $printAreaRect[1][1] - 1; + $print_colmin = PHPExcel_Cell::columnIndexFromString($printAreaRect[0][0]) - 1; + $print_colmax = PHPExcel_Cell::columnIndexFromString($printAreaRect[1][0]) - 1; + + // construct formula data manually because parser does not recognize absolute 3d cell references + $formulaData .= pack('Cvvvvv', 0x3B, $i, $print_rowmin, $print_rowmax, $print_colmin, $print_colmax); + + if ($j > 0) { + $formulaData .= pack('C', 0x10); // list operator token ',' + } + } + + // store the DEFINEDNAME record + $chunk .= $this->writeData($this->_writeDefinedNameBiff8(pack('C', 0x06), $formulaData, $i + 1, true)); + } + } + + // write autofilters, if any + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetAutoFilter = $this->_phpExcel->getSheet($i)->getAutoFilter(); + $autoFilterRange = $sheetAutoFilter->getRange(); + if(!empty($autoFilterRange)) { + $rangeBounds = PHPExcel_Cell::rangeBoundaries($autoFilterRange); + + //Autofilter built in name + $name = pack('C', 0x0D); + + $chunk .= $this->writeData($this->_writeShortNameBiff8($name, $i + 1, $rangeBounds, true)); + } + } + + return $chunk; + } + + /** + * Write a DEFINEDNAME record for BIFF8 using explicit binary formula data + * + * @param string $name The name in UTF-8 + * @param string $formulaData The binary formula data + * @param string $sheetIndex 1-based sheet index the defined name applies to. 0 = global + * @param boolean $isBuiltIn Built-in name? + * @return string Complete binary record data + */ + private function _writeDefinedNameBiff8($name, $formulaData, $sheetIndex = 0, $isBuiltIn = false) + { + $record = 0x0018; + + // option flags + $options = $isBuiltIn ? 0x20 : 0x00; + + // length of the name, character count + $nlen = PHPExcel_Shared_String::CountCharacters($name); + + // name with stripped length field + $name = substr(PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($name), 2); + + // size of the formula (in bytes) + $sz = strlen($formulaData); + + // combine the parts + $data = pack('vCCvvvCCCC', $options, 0, $nlen, $sz, 0, $sheetIndex, 0, 0, 0, 0) + . $name . $formulaData; + $length = strlen($data); + + $header = pack('vv', $record, $length); + + return $header . $data; + } + + /** + * Write a short NAME record + * + * @param string $name + * @param string $sheetIndex 1-based sheet index the defined name applies to. 0 = global + * @param int[][] $range rangeboundaries + * @param bool $isHidden + * @return string Complete binary record data + * */ + private function _writeShortNameBiff8($name, $sheetIndex = 0, $rangeBounds, $isHidden = false){ + $record = 0x0018; + + // option flags + $options = ($isHidden ? 0x21 : 0x00); + + $extra = pack('Cvvvvv', + 0x3B, + $sheetIndex - 1, + $rangeBounds[0][1] - 1, + $rangeBounds[1][1] - 1, + $rangeBounds[0][0] - 1, + $rangeBounds[1][0] - 1); + + // size of the formula (in bytes) + $sz = strlen($extra); + + // combine the parts + $data = pack('vCCvvvCCCCC', $options, 0, 1, $sz, 0, $sheetIndex, 0, 0, 0, 0, 0) + . $name . $extra; + $length = strlen($data); + + $header = pack('vv', $record, $length); + + return $header . $data; + } + + /** + * Stores the CODEPAGE biff record. + */ + private function _writeCodepage() + { + $record = 0x0042; // Record identifier + $length = 0x0002; // Number of bytes to follow + $cv = $this->_codepage; // The code page + + $header = pack('vv', $record, $length); + $data = pack('v', $cv); + + $this->_append($header . $data); + } + + /** + * Write Excel BIFF WINDOW1 record. + */ + private function _writeWindow1() + { + $record = 0x003D; // Record identifier + $length = 0x0012; // Number of bytes to follow + + $xWn = 0x0000; // Horizontal position of window + $yWn = 0x0000; // Vertical position of window + $dxWn = 0x25BC; // Width of window + $dyWn = 0x1572; // Height of window + + $grbit = 0x0038; // Option flags + + // not supported by PHPExcel, so there is only one selected sheet, the active + $ctabsel = 1; // Number of workbook tabs selected + + $wTabRatio = 0x0258; // Tab to scrollbar ratio + + // not supported by PHPExcel, set to 0 + $itabFirst = 0; // 1st displayed worksheet + $itabCur = $this->_phpExcel->getActiveSheetIndex(); // Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, + $grbit, + $itabCur, $itabFirst, + $ctabsel, $wTabRatio); + $this->_append($header . $data); + } + + /** + * Writes Excel BIFF BOUNDSHEET record. + * + * @param PHPExcel_Worksheet $sheet Worksheet name + * @param integer $offset Location of worksheet BOF + */ + private function _writeBoundsheet($sheet, $offset) + { + $sheetname = $sheet->getTitle(); + $record = 0x0085; // Record identifier + + // sheet state + switch ($sheet->getSheetState()) { + case PHPExcel_Worksheet::SHEETSTATE_VISIBLE: $ss = 0x00; break; + case PHPExcel_Worksheet::SHEETSTATE_HIDDEN: $ss = 0x01; break; + case PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN: $ss = 0x02; break; + default: $ss = 0x00; break; + } + + // sheet type + $st = 0x00; + + $grbit = 0x0000; // Visibility and sheet type + + $data = pack("VCC", $offset, $ss, $st); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($sheetname); + + $length = strlen($data); + $header = pack("vv", $record, $length); + $this->_append($header . $data); + } + + /** + * Write Internal SUPBOOK record + */ + private function _writeSupbookInternal() + { + $record = 0x01AE; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->_phpExcel->getSheetCount(), 0x0401); + return $this->writeData($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. + * + */ + private function _writeExternsheetBiff8() + { + $total_references = count($this->_parser->_references); + $record = 0x0017; // Record identifier + $length = 2 + 6 * $total_references; // Number of bytes to follow + + $supbook_index = 0; // FIXME: only using internal SUPBOOK record + $header = pack("vv", $record, $length); + $data = pack('v', $total_references); + for ($i = 0; $i < $total_references; ++$i) { + $data .= $this->_parser->_references[$i]; + } + return $this->writeData($header . $data); + } + + /** + * Write Excel BIFF STYLE records. + */ + private function _writeStyle() + { + $record = 0x0293; // Record identifier + $length = 0x0004; // Bytes to follow + + $ixfe = 0x8000; // Index to cell style XF + $BuiltIn = 0x00; // Built-in style + $iLevel = 0xff; // Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + $this->_append($header . $data); + } + + /** + * Writes Excel FORMAT record for non "built-in" numerical formats. + * + * @param string $format Custom format string + * @param integer $ifmt Format index code + */ + private function _writeNumFormat($format, $ifmt) + { + $record = 0x041E; // Record identifier + + $numberFormatString = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($format); + $length = 2 + strlen($numberFormatString); // Number of bytes to follow + + + $header = pack("vv", $record, $length); + $data = pack("v", $ifmt) . $numberFormatString; + $this->_append($header . $data); + } + + /** + * Write DATEMODE record to indicate the date system in use (1904 or 1900). + */ + private function _writeDatemode() + { + $record = 0x0022; // Record identifier + $length = 0x0002; // Bytes to follow + + $f1904 = (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904) ? + 1 : 0; // Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + $this->_append($header . $data); + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in the workbook. + * + * Excel only stores references to external sheets that are used in NAME. + * The workbook NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param integer $cxals Number of external references + */ + private function _writeExterncount($cxals) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + $this->_append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param string $sheetname Worksheet name + */ + private function _writeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + $length = 0x02 + strlen($sheetname); // Number of bytes to follow + + $cch = strlen($sheetname); // Length of sheet name + $rgch = 0x03; // Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_append($header . $data . $sheetname); + } + + /** + * Store the NAME record in the short format that is used for storing the print + * area, repeat rows only and repeat columns only. + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + */ + private function _writeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x0024; // Number of bytes to follow + + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x0015; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + $this->_append($header . $data); + } + + /** + * Store the NAME record in the long format that is used for storing the repeat + * rows and columns when both are specified. This shares a lot of code with + * _writeNameShort() but we use a separate method to keep the code clean. + * Code abstraction for reuse can be carried too far, and I should know. ;-) + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + */ + private function _writeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x003d; // Number of bytes to follow + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x002e; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + // Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + // Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + // End of data + $data .= pack("C", 0x10); + $this->_append($header . $data); + } + + /** + * Stores the COUNTRY record for localization + * + * @return string + */ + private function _writeCountry() + { + $record = 0x008C; // Record identifier + $length = 4; // Number of bytes to follow + + $header = pack('vv', $record, $length); + /* using the same country code always for simplicity */ + $data = pack('vv', $this->_country_code, $this->_country_code); + //$this->_append($header . $data); + return $this->writeData($header . $data); + } + + /** + * Write the RECALCID record + * + * @return string + */ + private function _writeRecalcId() + { + $record = 0x01C1; // Record identifier + $length = 8; // Number of bytes to follow + + $header = pack('vv', $record, $length); + + // by inspection of real Excel files, MS Office Excel 2007 writes this + $data = pack('VV', 0x000001C1, 0x00001E667); + + return $this->writeData($header . $data); + } + + /** + * Stores the PALETTE biff record. + */ + private function _writePalette() + { + $aref = $this->_palette; + + $record = 0x0092; // Record identifier + $length = 2 + 4 * count($aref); // Number of bytes to follow + $ccv = count($aref); // Number of RGB values to follow + $data = ''; // The RGB data + + // Pack the RGB data + foreach ($aref as $color) { + foreach ($color as $byte) { + $data .= pack("C",$byte); + } + } + + $header = pack("vvv", $record, $length, $ccv); + $this->_append($header . $data); + } + + /** + * Handling of the SST continue blocks is complicated by the need to include an + * additional continuation byte depending on whether the string is split between + * blocks or whether it starts at the beginning of the block. (There are also + * additional complications that will arise later when/if Rich Strings are + * supported). + * + * The Excel documentation says that the SST record should be followed by an + * EXTSST record. The EXTSST record is a hash table that is used to optimise + * access to SST. However, despite the documentation it doesn't seem to be + * required so we will ignore it. + * + * @return string Binary data + */ + private function _writeSharedStringsTable() + { + // maximum size of record data (excluding record header) + $continue_limit = 8224; + + // initialize array of record data blocks + $recordDatas = array(); + + // start SST record data block with total number of strings, total number of unique strings + $recordData = pack("VV", $this->_str_total, $this->_str_unique); + + // loop through all (unique) strings in shared strings table + foreach (array_keys($this->_str_table) as $string) { + + // here $string is a BIFF8 encoded string + + // length = character count + $headerinfo = unpack("vlength/Cencoding", $string); + + // currently, this is always 1 = uncompressed + $encoding = $headerinfo["encoding"]; + + // initialize finished writing current $string + $finished = false; + + while ($finished === false) { + + // normally, there will be only one cycle, but if string cannot immediately be written as is + // there will be need for more than one cylcle, if string longer than one record data block, there + // may be need for even more cycles + + if (strlen($recordData) + strlen($string) <= $continue_limit) { + // then we can write the string (or remainder of string) without any problems + $recordData .= $string; + + if (strlen($recordData) + strlen($string) == $continue_limit) { + // we close the record data block, and initialize a new one + $recordDatas[] = $recordData; + $recordData = ''; + } + + // we are finished writing this string + $finished = true; + } else { + // special treatment writing the string (or remainder of the string) + // If the string is very long it may need to be written in more than one CONTINUE record. + + // check how many bytes more there is room for in the current record + $space_remaining = $continue_limit - strlen($recordData); + + // minimum space needed + // uncompressed: 2 byte string length length field + 1 byte option flags + 2 byte character + // compressed: 2 byte string length length field + 1 byte option flags + 1 byte character + $min_space_needed = ($encoding == 1) ? 5 : 4; + + // We have two cases + // 1. space remaining is less than minimum space needed + // here we must waste the space remaining and move to next record data block + // 2. space remaining is greater than or equal to minimum space needed + // here we write as much as we can in the current block, then move to next record data block + + // 1. space remaining is less than minimum space needed + if ($space_remaining < $min_space_needed) { + // we close the block, store the block data + $recordDatas[] = $recordData; + + // and start new record data block where we start writing the string + $recordData = ''; + + // 2. space remaining is greater than or equal to minimum space needed + } else { + // initialize effective remaining space, for Unicode strings this may need to be reduced by 1, see below + $effective_space_remaining = $space_remaining; + + // for uncompressed strings, sometimes effective space remaining is reduced by 1 + if ( $encoding == 1 && (strlen($string) - $space_remaining) % 2 == 1 ) { + --$effective_space_remaining; + } + + // one block fininshed, store the block data + $recordData .= substr($string, 0, $effective_space_remaining); + + $string = substr($string, $effective_space_remaining); // for next cycle in while loop + $recordDatas[] = $recordData; + + // start new record data block with the repeated option flags + $recordData = pack('C', $encoding); + } + } + } + } + + // Store the last record data block unless it is empty + // if there was no need for any continue records, this will be the for SST record data block itself + if (strlen($recordData) > 0) { + $recordDatas[] = $recordData; + } + + // combine into one chunk with all the blocks SST, CONTINUE,... + $chunk = ''; + foreach ($recordDatas as $i => $recordData) { + // first block should have the SST record header, remaing should have CONTINUE header + $record = ($i == 0) ? 0x00FC : 0x003C; + + $header = pack("vv", $record, strlen($recordData)); + $data = $header . $recordData; + + $chunk .= $this->writeData($data); + } + + return $chunk; + } + + /** + * Writes the MSODRAWINGGROUP record if needed. Possibly split using CONTINUE records. + */ + private function _writeMsoDrawingGroup() + { + // write the Escher stream if necessary + if (isset($this->_escher)) { + $writer = new PHPExcel_Writer_Excel5_Escher($this->_escher); + $data = $writer->close(); + + $record = 0x00EB; + $length = strlen($data); + $header = pack("vv", $record, $length); + + return $this->writeData($header . $data); + + } else { + return ''; + } + } + + /** + * Get Escher object + * + * @return PHPExcel_Shared_Escher + */ + public function getEscher() + { + return $this->_escher; + } + + /** + * Set Escher object + * + * @param PHPExcel_Shared_Escher $pValue + */ + public function setEscher(PHPExcel_Shared_Escher $pValue = null) + { + $this->_escher = $pValue; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Worksheet.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Worksheet.php new file mode 100644 index 000000000..9aa5083d9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Worksheet.php @@ -0,0 +1,2954 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Worksheet (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// /* +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ + + +/** + * PHPExcel_Writer_Excel5_Worksheet + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter +{ + /** + * Formula parser + * + * @var PHPExcel_Writer_Excel5_Parser + */ + private $_parser; + + /** + * Maximum number of characters for a string (LABEL record in BIFF5) + * @var integer + */ + public $_xls_strmax; + + /** + * Array containing format information for columns + * @var array + */ + public $_colinfo; + + /** + * Array containing the selected area for the worksheet + * @var array + */ + public $_selection; + + /** + * The active pane for the worksheet + * @var integer + */ + public $_active_pane; + + /** + * Whether to use outline. + * @var integer + */ + public $_outline_on; + + /** + * Auto outline styles. + * @var bool + */ + public $_outline_style; + + /** + * Whether to have outline summary below. + * @var bool + */ + public $_outline_below; + + /** + * Whether to have outline summary at the right. + * @var bool + */ + public $_outline_right; + + /** + * Reference to the total number of strings in the workbook + * @var integer + */ + public $_str_total; + + /** + * Reference to the number of unique strings in the workbook + * @var integer + */ + public $_str_unique; + + /** + * Reference to the array containing all the unique strings in the workbook + * @var array + */ + public $_str_table; + + /** + * Color cache + */ + private $_colors; + + /** + * Index of first used row (at least 0) + * @var int + */ + private $_firstRowIndex; + + /** + * Index of last used row. (no used rows means -1) + * @var int + */ + private $_lastRowIndex; + + /** + * Index of first used column (at least 0) + * @var int + */ + private $_firstColumnIndex; + + /** + * Index of last used column (no used columns means -1) + * @var int + */ + private $_lastColumnIndex; + + /** + * Sheet object + * @var PHPExcel_Worksheet + */ + public $_phpSheet; + + /** + * Count cell style Xfs + * + * @var int + */ + private $_countCellStyleXfs; + + /** + * Escher object corresponding to MSODRAWING + * + * @var PHPExcel_Shared_Escher + */ + private $_escher; + + /** + * Array of font hashes associated to FONT records index + * + * @var array + */ + public $_fntHashIndex; + + /** + * Constructor + * + * @param int &$str_total Total number of strings + * @param int &$str_unique Total number of unique strings + * @param array &$str_table String Table + * @param array &$colors Colour Table + * @param mixed $parser The formula parser created for the Workbook + * @param boolean $preCalculateFormulas Flag indicating whether formulas should be calculated or just written + * @param string $phpSheet The worksheet to write + * @param PHPExcel_Worksheet $phpSheet + */ + public function __construct(&$str_total, &$str_unique, &$str_table, &$colors, + $parser, $preCalculateFormulas, $phpSheet) + { + // It needs to call its parent's constructor explicitly + parent::__construct(); + + // change BIFFwriter limit for CONTINUE records +// $this->_limit = 8224; + + + $this->_preCalculateFormulas = $preCalculateFormulas; + $this->_str_total = &$str_total; + $this->_str_unique = &$str_unique; + $this->_str_table = &$str_table; + $this->_colors = &$colors; + $this->_parser = $parser; + + $this->_phpSheet = $phpSheet; + + //$this->ext_sheets = array(); + //$this->offset = 0; + $this->_xls_strmax = 255; + $this->_colinfo = array(); + $this->_selection = array(0,0,0,0); + $this->_active_pane = 3; + + $this->_print_headers = 0; + + $this->_outline_style = 0; + $this->_outline_below = 1; + $this->_outline_right = 1; + $this->_outline_on = 1; + + $this->_fntHashIndex = array(); + + // calculate values for DIMENSIONS record + $minR = 1; + $minC = 'A'; + + $maxR = $this->_phpSheet->getHighestRow(); + $maxC = $this->_phpSheet->getHighestColumn(); + + // Determine lowest and highest column and row +// $this->_firstRowIndex = ($minR > 65535) ? 65535 : $minR; + $this->_lastRowIndex = ($maxR > 65535) ? 65535 : $maxR ; + + $this->_firstColumnIndex = PHPExcel_Cell::columnIndexFromString($minC); + $this->_lastColumnIndex = PHPExcel_Cell::columnIndexFromString($maxC); + +// if ($this->_firstColumnIndex > 255) $this->_firstColumnIndex = 255; + if ($this->_lastColumnIndex > 255) $this->_lastColumnIndex = 255; + + $this->_countCellStyleXfs = count($phpSheet->getParent()->getCellStyleXfCollection()); + } + + /** + * Add data to the beginning of the workbook (note the reverse order) + * and to the end of the workbook. + * + * @access public + * @see PHPExcel_Writer_Excel5_Workbook::storeWorkbook() + */ + function close() + { + $_phpSheet = $this->_phpSheet; + + $num_sheets = $_phpSheet->getParent()->getSheetCount(); + + // Write BOF record + $this->_storeBof(0x0010); + + // Write PRINTHEADERS + $this->_writePrintHeaders(); + + // Write PRINTGRIDLINES + $this->_writePrintGridlines(); + + // Write GRIDSET + $this->_writeGridset(); + + // Calculate column widths + $_phpSheet->calculateColumnWidths(); + + // Column dimensions + if (($defaultWidth = $_phpSheet->getDefaultColumnDimension()->getWidth()) < 0) { + $defaultWidth = PHPExcel_Shared_Font::getDefaultColumnWidthByFont($_phpSheet->getParent()->getDefaultStyle()->getFont()); + } + + $columnDimensions = $_phpSheet->getColumnDimensions(); + $maxCol = $this->_lastColumnIndex -1; + for ($i = 0; $i <= $maxCol; ++$i) { + $hidden = 0; + $level = 0; + $xfIndex = 15; // there are 15 cell style Xfs + + $width = $defaultWidth; + + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($i); + if (isset($columnDimensions[$columnLetter])) { + $columnDimension = $columnDimensions[$columnLetter]; + if ($columnDimension->getWidth() >= 0) { + $width = $columnDimension->getWidth(); + } + $hidden = $columnDimension->getVisible() ? 0 : 1; + $level = $columnDimension->getOutlineLevel(); + $xfIndex = $columnDimension->getXfIndex() + 15; // there are 15 cell style Xfs + } + + // Components of _colinfo: + // $firstcol first column on the range + // $lastcol last column on the range + // $width width to set + // $xfIndex The optional cell style Xf index to apply to the columns + // $hidden The optional hidden atribute + // $level The optional outline level + $this->_colinfo[] = array($i, $i, $width, $xfIndex, $hidden, $level); + } + + // Write GUTS + $this->_writeGuts(); + + // Write DEFAULTROWHEIGHT + $this->_writeDefaultRowHeight(); + + // Write WSBOOL + $this->_writeWsbool(); + + // Write horizontal and vertical page breaks + $this->_writeBreaks(); + + // Write page header + $this->_writeHeader(); + + // Write page footer + $this->_writeFooter(); + + // Write page horizontal centering + $this->_writeHcenter(); + + // Write page vertical centering + $this->_writeVcenter(); + + // Write left margin + $this->_writeMarginLeft(); + + // Write right margin + $this->_writeMarginRight(); + + // Write top margin + $this->_writeMarginTop(); + + // Write bottom margin + $this->_writeMarginBottom(); + + // Write page setup + $this->_writeSetup(); + + // Write sheet protection + $this->_writeProtect(); + + // Write SCENPROTECT + $this->_writeScenProtect(); + + // Write OBJECTPROTECT + $this->_writeObjectProtect(); + + // Write sheet password + $this->_writePassword(); + + // Write DEFCOLWIDTH record + $this->_writeDefcol(); + + // Write the COLINFO records if they exist + if (!empty($this->_colinfo)) { + $colcount = count($this->_colinfo); + for ($i = 0; $i < $colcount; ++$i) { + $this->_writeColinfo($this->_colinfo[$i]); + } + } + $autoFilterRange = $_phpSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + // Write AUTOFILTERINFO + $this->_writeAutoFilterInfo(); + } + + // Write sheet dimensions + $this->_writeDimensions(); + + // Row dimensions + foreach ($_phpSheet->getRowDimensions() as $rowDimension) { + $xfIndex = $rowDimension->getXfIndex() + 15; // there are 15 cellXfs + $this->_writeRow( $rowDimension->getRowIndex() - 1, $rowDimension->getRowHeight(), $xfIndex, ($rowDimension->getVisible() ? '0' : '1'), $rowDimension->getOutlineLevel() ); + } + + // Write Cells + foreach ($_phpSheet->getCellCollection() as $cellID) { + $cell = $_phpSheet->getCell($cellID); + $row = $cell->getRow() - 1; + $column = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1; + + // Don't break Excel! +// if ($row + 1 > 65536 or $column + 1 > 256) { + if ($row > 65535 || $column > 255) { + break; + } + + // Write cell value + $xfIndex = $cell->getXfIndex() + 15; // there are 15 cell style Xfs + + $cVal = $cell->getValue(); + if ($cVal instanceof PHPExcel_RichText) { + // $this->_writeString($row, $column, $cVal->getPlainText(), $xfIndex); + $arrcRun = array(); + $str_len = strlen($cVal->getPlainText()); + $str_pos = 0; + $elements = $cVal->getRichTextElements(); + foreach ($elements as $element) { + // FONT Index + if ($element instanceof PHPExcel_RichText_Run) { + $str_fontidx = $this->_fntHashIndex[$element->getFont()->getHashCode()]; + } + else { + $str_fontidx = 0; + } + $arrcRun[] = array('strlen' => $str_pos, 'fontidx' => $str_fontidx); + // Position FROM + $str_pos += strlen($element->getText()); + } + $this->_writeRichTextString($row, $column, $cVal->getPlainText(), $xfIndex, $arrcRun); + } else { + switch ($cell->getDatatype()) { + case PHPExcel_Cell_DataType::TYPE_STRING: + case PHPExcel_Cell_DataType::TYPE_NULL: + if ($cVal === '' || $cVal === null) { + $this->_writeBlank($row, $column, $xfIndex); + } else { + $this->_writeString($row, $column, $cVal, $xfIndex); + } + break; + + case PHPExcel_Cell_DataType::TYPE_NUMERIC: + $this->_writeNumber($row, $column, $cVal, $xfIndex); + break; + + case PHPExcel_Cell_DataType::TYPE_FORMULA: + $calculatedValue = $this->_preCalculateFormulas ? + $cell->getCalculatedValue() : null; + $this->_writeFormula($row, $column, $cVal, $xfIndex, $calculatedValue); + break; + + case PHPExcel_Cell_DataType::TYPE_BOOL: + $this->_writeBoolErr($row, $column, $cVal, 0, $xfIndex); + break; + + case PHPExcel_Cell_DataType::TYPE_ERROR: + $this->_writeBoolErr($row, $column, self::_mapErrorCode($cVal), 1, $xfIndex); + break; + + } + } + } + + // Append + $this->_writeMsoDrawing(); + + $this->_writeWindow2(); + $this->_writeZoom(); + if ($_phpSheet->getFreezePane()) { + $this->_writePanes(); + } + $this->_writeSelection(); + $this->_writeMergedCells(); + + // Hyperlinks + foreach ($_phpSheet->getHyperLinkCollection() as $coordinate => $hyperlink) { + list($column, $row) = PHPExcel_Cell::coordinateFromString($coordinate); + + $url = $hyperlink->getUrl(); + + if ( strpos($url, 'sheet://') !== false ) { + // internal to current workbook + $url = str_replace('sheet://', 'internal:', $url); + + } else if ( preg_match('/^(http:|https:|ftp:|mailto:)/', $url) ) { + // URL + // $url = $url; + + } else { + // external (local file) + $url = 'external:' . $url; + } + + $this->_writeUrl($row - 1, PHPExcel_Cell::columnIndexFromString($column) - 1, $url); + } + + $this->_writeDataValidity(); + $this->_writeSheetLayout(); + $this->_writeSheetProtection(); + $this->_writeRangeProtection(); + + $this->_storeEof(); + } + + /** + * Write a cell range address in BIFF8 + * always fixed range + * See section 2.5.14 in OpenOffice.org's Documentation of the Microsoft Excel File Format + * + * @param string $range E.g. 'A1' or 'A1:B6' + * @return string Binary data + */ + private function _writeBIFF8CellRangeAddressFixed($range = 'A1') + { + $explodes = explode(':', $range); + + // extract first cell, e.g. 'A1' + $firstCell = $explodes[0]; + + // extract last cell, e.g. 'B6' + if (count($explodes) == 1) { + $lastCell = $firstCell; + } else { + $lastCell = $explodes[1]; + } + + $firstCellCoordinates = PHPExcel_Cell::coordinateFromString($firstCell); // e.g. array(0, 1) + $lastCellCoordinates = PHPExcel_Cell::coordinateFromString($lastCell); // e.g. array(1, 6) + + return(pack('vvvv', + $firstCellCoordinates[1] - 1, + $lastCellCoordinates[1] - 1, + PHPExcel_Cell::columnIndexFromString($firstCellCoordinates[0]) - 1, + PHPExcel_Cell::columnIndexFromString($lastCellCoordinates[0]) - 1 + )); + } + + /** + * Retrieves data from memory in one chunk, or from disk in $buffer + * sized chunks. + * + * @return string The data + */ + function getData() + { + $buffer = 4096; + + // Return data stored in memory + if (isset($this->_data)) { + $tmp = $this->_data; + unset($this->_data); + return $tmp; + } + // No data to return + return false; + } + + /** + * Set the option to print the row and column headers on the printed page. + * + * @access public + * @param integer $print Whether to print the headers or not. Defaults to 1 (print). + */ + function printRowColHeaders($print = 1) + { + $this->_print_headers = $print; + } + + /** + * This method sets the properties for outlining and grouping. The defaults + * correspond to Excel's defaults. + * + * @param bool $visible + * @param bool $symbols_below + * @param bool $symbols_right + * @param bool $auto_style + */ + function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false) + { + $this->_outline_on = $visible; + $this->_outline_below = $symbols_below; + $this->_outline_right = $symbols_right; + $this->_outline_style = $auto_style; + + // Ensure this is a boolean vale for Window2 + if ($this->_outline_on) { + $this->_outline_on = 1; + } + } + + /** + * Write a double to the specified row and column (zero indexed). + * An integer can be written as a double. Excel will display an + * integer. $format is optional. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param float $num The number to write + * @param mixed $xfIndex The optional XF format + * @return integer + */ + private function _writeNumber($row, $col, $num, $xfIndex) + { + $record = 0x0203; // Record identifier + $length = 0x000E; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xfIndex); + $xl_double = pack("d", $num); + if (self::getByteOrder()) { // if it's Big Endian + $xl_double = strrev($xl_double); + } + + $this->_append($header.$data.$xl_double); + return(0); + } + + /** + * Write a LABELSST record or a LABEL record. Which one depends on BIFF version + * + * @param int $row Row index (0-based) + * @param int $col Column index (0-based) + * @param string $str The string + * @param int $xfIndex Index to XF record + */ + private function _writeString($row, $col, $str, $xfIndex) + { + $this->_writeLabelSst($row, $col, $str, $xfIndex); + } + /** + * Write a LABELSST record or a LABEL record. Which one depends on BIFF version + * It differs from _writeString by the writing of rich text strings. + * @param int $row Row index (0-based) + * @param int $col Column index (0-based) + * @param string $str The string + * @param mixed $xfIndex The XF format index for the cell + * @param array $arrcRun Index to Font record and characters beginning + */ + private function _writeRichTextString($row, $col, $str, $xfIndex, $arrcRun){ + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + + $str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($str, $arrcRun); + + /* check if string is already present */ + if (!isset($this->_str_table[$str])) { + $this->_str_table[$str] = $this->_str_unique++; + } + $this->_str_total++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xfIndex, $this->_str_table[$str]); + $this->_append($header.$data); + } + + /** + * Write a string to the specified row and column (zero indexed). + * NOTE: there is an Excel 5 defined limit of 255 characters. + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $xfIndex The XF format index for the cell + * @return integer + */ + private function _writeLabel($row, $col, $str, $xfIndex) + { + $strlen = strlen($str); + $record = 0x0204; // Record identifier + $length = 0x0008 + $strlen; // Bytes to follow + + $str_error = 0; + + if ($strlen > $this->_xls_strmax) { // LABEL must be < 255 chars + $str = substr($str, 0, $this->_xls_strmax); + $length = 0x0008 + $this->_xls_strmax; + $strlen = $this->_xls_strmax; + $str_error = -3; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row, $col, $xfIndex, $strlen); + $this->_append($header . $data . $str); + return($str_error); + } + + /** + * Write a string to the specified row and column (zero indexed). + * This is the BIFF8 version (no 255 chars limit). + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $xfIndex The XF format index for the cell + * @return integer + */ + private function _writeLabelSst($row, $col, $str, $xfIndex) + { + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + + $str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($str); + + /* check if string is already present */ + if (!isset($this->_str_table[$str])) { + $this->_str_table[$str] = $this->_str_unique++; + } + $this->_str_total++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xfIndex, $this->_str_table[$str]); + $this->_append($header.$data); + } + + /** + * Writes a note associated with the cell given by the row and column. + * NOTE records don't have a length limit. + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $note The note to write + */ + private function _writeNote($row, $col, $note) + { + $note_length = strlen($note); + $record = 0x001C; // Record identifier + $max_length = 2048; // Maximun length for a NOTE record + + // Length for this record is no more than 2048 + 6 + $length = 0x0006 + min($note_length, 2048); + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $note_length); + $this->_append($header . $data . substr($note, 0, 2048)); + + for ($i = $max_length; $i < $note_length; $i += $max_length) { + $chunk = substr($note, $i, $max_length); + $length = 0x0006 + strlen($chunk); + $header = pack("vv", $record, $length); + $data = pack("vvv", -1, 0, strlen($chunk)); + $this->_append($header.$data.$chunk); + } + return(0); + } + + /** + * Write a blank cell to the specified row and column (zero indexed). + * A blank cell is used to specify formatting without adding a string + * or a number. + * + * A blank cell without a format serves no purpose. Therefore, we don't write + * a BLANK record unless a format is specified. + * + * Returns 0 : normal termination (including no format) + * -1 : insufficient number of arguments + * -2 : row or column out of range + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param mixed $xfIndex The XF format index + */ + function _writeBlank($row, $col, $xfIndex) + { + $record = 0x0201; // Record identifier + $length = 0x0006; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xfIndex); + $this->_append($header . $data); + return 0; + } + + /** + * Write a boolean or an error type to the specified row and column (zero indexed) + * + * @param int $row Row index (0-based) + * @param int $col Column index (0-based) + * @param int $value + * @param boolean $isError Error or Boolean? + * @param int $xfIndex + */ + private function _writeBoolErr($row, $col, $value, $isError, $xfIndex) + { + $record = 0x0205; + $length = 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvCC", $row, $col, $xfIndex, $value, $isError); + $this->_append($header . $data); + return 0; + } + + /** + * Write a formula to the specified row and column (zero indexed). + * The textual representation of the formula is passed to the parser in + * Parser.php which returns a packed binary string. + * + * Returns 0 : normal termination + * -1 : formula errors (bad formula) + * -2 : row or column out of range + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $formula The formula text string + * @param mixed $xfIndex The XF format index + * @param mixed $calculatedValue Calculated value + * @return integer + */ + private function _writeFormula($row, $col, $formula, $xfIndex, $calculatedValue) + { + $record = 0x0006; // Record identifier + + // Initialize possible additional value for STRING record that should be written after the FORMULA record? + $stringValue = null; + + // calculated value + if (isset($calculatedValue)) { + // Since we can't yet get the data type of the calculated value, + // we use best effort to determine data type + if (is_bool($calculatedValue)) { + // Boolean value + $num = pack('CCCvCv', 0x01, 0x00, (int)$calculatedValue, 0x00, 0x00, 0xFFFF); + } elseif (is_int($calculatedValue) || is_float($calculatedValue)) { + // Numeric value + $num = pack('d', $calculatedValue); + } elseif (is_string($calculatedValue)) { + if (array_key_exists($calculatedValue, PHPExcel_Cell_DataType::getErrorCodes())) { + // Error value + $num = pack('CCCvCv', 0x02, 0x00, self::_mapErrorCode($calculatedValue), 0x00, 0x00, 0xFFFF); + } elseif ($calculatedValue === '') { + // Empty string (and BIFF8) + $num = pack('CCCvCv', 0x03, 0x00, 0x00, 0x00, 0x00, 0xFFFF); + } else { + // Non-empty string value (or empty string BIFF5) + $stringValue = $calculatedValue; + $num = pack('CCCvCv', 0x00, 0x00, 0x00, 0x00, 0x00, 0xFFFF); + } + } else { + // We are really not supposed to reach here + $num = pack('d', 0x00); + } + } else { + $num = pack('d', 0x00); + } + + $grbit = 0x03; // Option flags + $unknown = 0x0000; // Must be zero + + // Strip the '=' or '@' sign at the beginning of the formula string + if ($formula{0} == '=') { + $formula = substr($formula,1); + } else { + // Error handling + $this->_writeString($row, $col, 'Unrecognised character for formula'); + return -1; + } + + // Parse the formula using the parser in Parser.php + try { + $error = $this->_parser->parse($formula); + $formula = $this->_parser->toReversePolish(); + + $formlen = strlen($formula); // Length of the binary string + $length = 0x16 + $formlen; // Length of the record data + + $header = pack("vv", $record, $length); + + $data = pack("vvv", $row, $col, $xfIndex) + . $num + . pack("vVv", $grbit, $unknown, $formlen); + $this->_append($header . $data . $formula); + + // Append also a STRING record if necessary + if ($stringValue !== null) { + $this->_writeStringRecord($stringValue); + } + + return 0; + + } catch (Exception $e) { + // do nothing + } + + } + + /** + * Write a STRING record. This + * + * @param string $stringValue + */ + private function _writeStringRecord($stringValue) + { + $record = 0x0207; // Record identifier + $data = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($stringValue); + + $length = strlen($data); + $header = pack('vv', $record, $length); + + $this->_append($header . $data); + } + + /** + * Write a hyperlink. + * This is comprised of two elements: the visible label and + * the invisible link. The visible label is the same as the link unless an + * alternative string is specified. The label is written using the + * _writeString() method. Therefore the 255 characters string limit applies. + * $string and $format are optional. + * + * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external + * directory url. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @param integer $row Row + * @param integer $col Column + * @param string $url URL string + * @return integer + */ + private function _writeUrl($row, $col, $url) + { + // Add start row and col to arg list + return($this->_writeUrlRange($row, $col, $row, $col, $url)); + } + + /** + * This is the more general form of _writeUrl(). It allows a hyperlink to be + * written to a range of cells. This function also decides the type of hyperlink + * to be written. These are either, Web (http, ftp, mailto), Internal + * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). + * + * @access private + * @see _writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + function _writeUrlRange($row1, $col1, $row2, $col2, $url) + { + // Check for internal/external sheet links or default to web link + if (preg_match('[^internal:]', $url)) { + return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url)); + } + if (preg_match('[^external:]', $url)) { + return($this->_writeUrlExternal($row1, $col1, $row2, $col2, $url)); + } + return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url)); + } + + /** + * Used to write http, ftp and mailto hyperlinks. + * The link type ($options) is 0x03 is the same as absolute dir ref without + * sheet. However it is differentiated by the $unknown2 data stream. + * + * @access private + * @see _writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + function _writeUrlWeb($row1, $col1, $row2, $col2, $url) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); + + // Pack the option flags + $options = pack("V", 0x03); + + // Convert URL to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL + $url_len = pack("V", strlen($url)); + + // Calculate the data length + $length = 0x34 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header . $data . + $unknown1 . $options . + $unknown2 . $url_len . $url); + return 0; + } + + /** + * Used to write internal reference hyperlinks such as "Sheet1!A1". + * + * @access private + * @see _writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + function _writeUrlInternal($row1, $col1, $row2, $col2, $url) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + // Strip URL type + $url = preg_replace('/^internal:/', '', $url); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + + // Pack the option flags + $options = pack("V", 0x08); + + // Convert the URL type and to a null terminated wchar string + $url .= "\0"; + + // character count + $url_len = PHPExcel_Shared_String::CountCharacters($url); + $url_len = pack('V', $url_len); + + $url = PHPExcel_Shared_String::ConvertEncoding($url, 'UTF-16LE', 'UTF-8'); + + // Calculate the data length + $length = 0x24 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header . $data . + $unknown1 . $options . + $url_len . $url); + return 0; + } + + /** + * Write links to external directory names such as 'c:\foo.xls', + * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. + * + * Note: Excel writes some relative links with the $dir_long string. We ignore + * these cases for the sake of simpler code. + * + * @access private + * @see _writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + function _writeUrlExternal($row1, $col1, $row2, $col2, $url) + { + // Network drives are different. We will handle them separately + // MS/Novell network drives and shares start with \\ + if (preg_match('[^external:\\\\]', $url)) { + return; //($this->_writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); + } + + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + // Strip URL type and change Unix dir separator to Dos style (if needed) + // + $url = preg_replace('/^external:/', '', $url); + $url = preg_replace('/\//', "\\", $url); + + // Determine if the link is relative or absolute: + // relative if link contains no dir separator, "somefile.xls" + // relative if link starts with up-dir, "..\..\somefile.xls" + // otherwise, absolute + + $absolute = 0x00; // relative path + if ( preg_match('/^[A-Z]:/', $url) ) { + $absolute = 0x02; // absolute path on Windows, e.g. C:\... + } + $link_type = 0x01 | $absolute; + + // Determine if the link contains a sheet reference and change some of the + // parameters accordingly. + // Split the dir name and sheet name (if it exists) + $dir_long = $url; + if (preg_match("/\#/", $url)) { + $link_type |= 0x08; + } + + + // Pack the link type + $link_type = pack("V", $link_type); + + // Calculate the up-level dir count e.g.. (..\..\..\ == 3) + $up_count = preg_match_all("/\.\.\\\/", $dir_long, $useless); + $up_count = pack("v", $up_count); + + // Store the short dos dir name (null terminated) + $dir_short = preg_replace("/\.\.\\\/", '', $dir_long) . "\0"; + + // Store the long dir name as a wchar string (non-null terminated) + $dir_long = $dir_long . "\0"; + + // Pack the lengths of the dir strings + $dir_short_len = pack("V", strlen($dir_short) ); + $dir_long_len = pack("V", strlen($dir_long) ); + $stream_len = pack("V", 0);//strlen($dir_long) + 0x06); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); + $unknown2 = pack("H*",'0303000000000000C000000000000046' ); + $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000'); + $unknown4 = pack("v", 0x03 ); + + // Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $unknown2 . + $up_count . + $dir_short_len. + $dir_short . + $unknown3 . + $stream_len ;/*. + $dir_long_len . + $unknown4 . + $dir_long . + $sheet_len . + $sheet ;*/ + + // Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + // Write the packed data + $this->_append($header. $data); + return 0; + } + + /** + * This method is used to set the height and format for a row. + * + * @param integer $row The row to set + * @param integer $height Height we are giving to the row. + * Use null to set XF without setting height + * @param integer $xfIndex The optional cell style Xf index to apply to the columns + * @param bool $hidden The optional hidden attribute + * @param integer $level The optional outline level for row, in range [0,7] + */ + private function _writeRow($row, $height, $xfIndex, $hidden = false, $level = 0) + { + $record = 0x0208; // Record identifier + $length = 0x0010; // Number of bytes to follow + + $colMic = 0x0000; // First defined column + $colMac = 0x0000; // Last defined column + $irwMac = 0x0000; // Used by Excel to optimise loading + $reserved = 0x0000; // Reserved + $grbit = 0x0000; // Option flags + $ixfe = $xfIndex; + + if ( $height < 0 ){ + $height = null; + } + + // Use _writeRow($row, null, $XF) to set XF format without setting height + if ($height != null) { + $miyRw = $height * 20; // row height + } else { + $miyRw = 0xff; // default row height is 256 + } + + // Set the options flags. fUnsynced is used to show that the font and row + // heights are not compatible. This is usually the case for WriteExcel. + // The collapsed flag 0x10 doesn't seem to be used to indicate that a row + // is collapsed. Instead it is used to indicate that the previous row is + // collapsed. The zero height flag, 0x20, is used to collapse a row. + + $grbit |= $level; + if ($hidden) { + $grbit |= 0x0020; + } + if ($height !== null) { + $grbit |= 0x0040; // fUnsynced + } + if ($xfIndex !== 0xF) { + $grbit |= 0x0080; + } + $grbit |= 0x0100; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $row, $colMic, $colMac, $miyRw, + $irwMac,$reserved, $grbit, $ixfe); + $this->_append($header.$data); + } + + /** + * Writes Excel DIMENSIONS to define the area in which there is data. + */ + private function _writeDimensions() + { + $record = 0x0200; // Record identifier + + $length = 0x000E; + $data = pack('VVvvv' + , $this->_firstRowIndex + , $this->_lastRowIndex + 1 + , $this->_firstColumnIndex + , $this->_lastColumnIndex + 1 + , 0x0000 // reserved + ); + + $header = pack("vv", $record, $length); + $this->_append($header.$data); + } + + /** + * Write BIFF record Window2. + */ + private function _writeWindow2() + { + $record = 0x023E; // Record identifier + $length = 0x0012; + + $grbit = 0x00B6; // Option flags + $rwTop = 0x0000; // Top row visible in window + $colLeft = 0x0000; // Leftmost column visible in window + + + // The options flags that comprise $grbit + $fDspFmla = 0; // 0 - bit + $fDspGrid = $this->_phpSheet->getShowGridlines() ? 1 : 0; // 1 + $fDspRwCol = $this->_phpSheet->getShowRowColHeaders() ? 1 : 0; // 2 + $fFrozen = $this->_phpSheet->getFreezePane() ? 1 : 0; // 3 + $fDspZeros = 1; // 4 + $fDefaultHdr = 1; // 5 + $fArabic = $this->_phpSheet->getRightToLeft() ? 1 : 0; // 6 + $fDspGuts = $this->_outline_on; // 7 + $fFrozenNoSplit = 0; // 0 - bit + // no support in PHPExcel for selected sheet, therefore sheet is only selected if it is the active sheet + $fSelected = ($this->_phpSheet === $this->_phpSheet->getParent()->getActiveSheet()) ? 1 : 0; + $fPaged = 1; // 2 + + $grbit = $fDspFmla; + $grbit |= $fDspGrid << 1; + $grbit |= $fDspRwCol << 2; + $grbit |= $fFrozen << 3; + $grbit |= $fDspZeros << 4; + $grbit |= $fDefaultHdr << 5; + $grbit |= $fArabic << 6; + $grbit |= $fDspGuts << 7; + $grbit |= $fFrozenNoSplit << 8; + $grbit |= $fSelected << 9; + $grbit |= $fPaged << 10; + + $header = pack("vv", $record, $length); + $data = pack("vvv", $grbit, $rwTop, $colLeft); + + // FIXME !!! + $rgbHdr = 0x0040; // Row/column heading and gridline color index + $zoom_factor_page_break = 0x0000; + $zoom_factor_normal = 0x0000; + $data .= pack("vvvvV", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); + + $this->_append($header.$data); + } + + /** + * Write BIFF record DEFAULTROWHEIGHT. + */ + private function _writeDefaultRowHeight() + { + $defaultRowHeight = $this->_phpSheet->getDefaultRowDimension()->getRowHeight(); + + if ($defaultRowHeight < 0) { + return; + } + + // convert to twips + $defaultRowHeight = (int) 20 * $defaultRowHeight; + + $record = 0x0225; // Record identifier + $length = 0x0004; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", 1, $defaultRowHeight); + $this->_append($header . $data); + } + + /** + * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. + */ + private function _writeDefcol() + { + $defaultColWidth = 8; + + $record = 0x0055; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $defaultColWidth); + $this->_append($header . $data); + } + + /** + * Write BIFF record COLINFO to define column widths + * + * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C + * length record. + * + * @param array $col_array This is the only parameter received and is composed of the following: + * 0 => First formatted column, + * 1 => Last formatted column, + * 2 => Col width (8.43 is Excel default), + * 3 => The optional XF format of the column, + * 4 => Option flags. + * 5 => Optional outline level + */ + private function _writeColinfo($col_array) + { + if (isset($col_array[0])) { + $colFirst = $col_array[0]; + } + if (isset($col_array[1])) { + $colLast = $col_array[1]; + } + if (isset($col_array[2])) { + $coldx = $col_array[2]; + } else { + $coldx = 8.43; + } + if (isset($col_array[3])) { + $xfIndex = $col_array[3]; + } else { + $xfIndex = 15; + } + if (isset($col_array[4])) { + $grbit = $col_array[4]; + } else { + $grbit = 0; + } + if (isset($col_array[5])) { + $level = $col_array[5]; + } else { + $level = 0; + } + $record = 0x007D; // Record identifier + $length = 0x000C; // Number of bytes to follow + + $coldx *= 256; // Convert to units of 1/256 of a char + + $ixfe = $xfIndex; + $reserved = 0x0000; // Reserved + + $level = max(0, min($level, 7)); + $grbit |= $level << 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvv", $colFirst, $colLast, $coldx, + $ixfe, $grbit, $reserved); + $this->_append($header.$data); + } + + /** + * Write BIFF record SELECTION. + */ + private function _writeSelection() + { + // look up the selected cell range + $selectedCells = $this->_phpSheet->getSelectedCells(); + $selectedCells = PHPExcel_Cell::splitRange($this->_phpSheet->getSelectedCells()); + $selectedCells = $selectedCells[0]; + if (count($selectedCells) == 2) { + list($first, $last) = $selectedCells; + } else { + $first = $selectedCells[0]; + $last = $selectedCells[0]; + } + + list($colFirst, $rwFirst) = PHPExcel_Cell::coordinateFromString($first); + $colFirst = PHPExcel_Cell::columnIndexFromString($colFirst) - 1; // base 0 column index + --$rwFirst; // base 0 row index + + list($colLast, $rwLast) = PHPExcel_Cell::coordinateFromString($last); + $colLast = PHPExcel_Cell::columnIndexFromString($colLast) - 1; // base 0 column index + --$rwLast; // base 0 row index + + // make sure we are not out of bounds + $colFirst = min($colFirst, 255); + $colLast = min($colLast, 255); + + $rwFirst = min($rwFirst, 65535); + $rwLast = min($rwLast, 65535); + + $record = 0x001D; // Record identifier + $length = 0x000F; // Number of bytes to follow + + $pnn = $this->_active_pane; // Pane position + $rwAct = $rwFirst; // Active row + $colAct = $colFirst; // Active column + $irefAct = 0; // Active cell ref + $cref = 1; // Number of refs + + if (!isset($rwLast)) { + $rwLast = $rwFirst; // Last row in reference + } + if (!isset($colLast)) { + $colLast = $colFirst; // Last col in reference + } + + // Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, + $irefAct, $cref, + $rwFirst, $rwLast, + $colFirst, $colLast); + $this->_append($header . $data); + } + + /** + * Store the MERGEDCELLS records for all ranges of merged cells + */ + private function _writeMergedCells() + { + $mergeCells = $this->_phpSheet->getMergeCells(); + $countMergeCells = count($mergeCells); + + if ($countMergeCells == 0) { + return; + } + + // maximum allowed number of merged cells per record + $maxCountMergeCellsPerRecord = 1027; + + // record identifier + $record = 0x00E5; + + // counter for total number of merged cells treated so far by the writer + $i = 0; + + // counter for number of merged cells written in record currently being written + $j = 0; + + // initialize record data + $recordData = ''; + + // loop through the merged cells + foreach ($mergeCells as $mergeCell) { + ++$i; + ++$j; + + // extract the row and column indexes + $range = PHPExcel_Cell::splitRange($mergeCell); + list($first, $last) = $range[0]; + list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($first); + list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($last); + + $recordData .= pack('vvvv', $firstRow - 1, $lastRow - 1, PHPExcel_Cell::columnIndexFromString($firstColumn) - 1, PHPExcel_Cell::columnIndexFromString($lastColumn) - 1); + + // flush record if we have reached limit for number of merged cells, or reached final merged cell + if ($j == $maxCountMergeCellsPerRecord or $i == $countMergeCells) { + $recordData = pack('v', $j) . $recordData; + $length = strlen($recordData); + $header = pack('vv', $record, $length); + $this->_append($header . $recordData); + + // initialize for next record, if any + $recordData = ''; + $j = 0; + } + } + } + + /** + * Write SHEETLAYOUT record + */ + private function _writeSheetLayout() + { + if (!$this->_phpSheet->isTabColorSet()) { + return; + } + + $recordData = pack( + 'vvVVVvv' + , 0x0862 + , 0x0000 // unused + , 0x00000000 // unused + , 0x00000000 // unused + , 0x00000014 // size of record data + , $this->_colors[$this->_phpSheet->getTabColor()->getRGB()] // color index + , 0x0000 // unused + ); + + $length = strlen($recordData); + + $record = 0x0862; // Record identifier + $header = pack('vv', $record, $length); + $this->_append($header . $recordData); + } + + /** + * Write SHEETPROTECTION + */ + private function _writeSheetProtection() + { + // record identifier + $record = 0x0867; + + // prepare options + $options = (int) !$this->_phpSheet->getProtection()->getObjects() + | (int) !$this->_phpSheet->getProtection()->getScenarios() << 1 + | (int) !$this->_phpSheet->getProtection()->getFormatCells() << 2 + | (int) !$this->_phpSheet->getProtection()->getFormatColumns() << 3 + | (int) !$this->_phpSheet->getProtection()->getFormatRows() << 4 + | (int) !$this->_phpSheet->getProtection()->getInsertColumns() << 5 + | (int) !$this->_phpSheet->getProtection()->getInsertRows() << 6 + | (int) !$this->_phpSheet->getProtection()->getInsertHyperlinks() << 7 + | (int) !$this->_phpSheet->getProtection()->getDeleteColumns() << 8 + | (int) !$this->_phpSheet->getProtection()->getDeleteRows() << 9 + | (int) !$this->_phpSheet->getProtection()->getSelectLockedCells() << 10 + | (int) !$this->_phpSheet->getProtection()->getSort() << 11 + | (int) !$this->_phpSheet->getProtection()->getAutoFilter() << 12 + | (int) !$this->_phpSheet->getProtection()->getPivotTables() << 13 + | (int) !$this->_phpSheet->getProtection()->getSelectUnlockedCells() << 14 ; + + // record data + $recordData = pack( + 'vVVCVVvv' + , 0x0867 // repeated record identifier + , 0x0000 // not used + , 0x0000 // not used + , 0x00 // not used + , 0x01000200 // unknown data + , 0xFFFFFFFF // unknown data + , $options // options + , 0x0000 // not used + ); + + $length = strlen($recordData); + $header = pack('vv', $record, $length); + + $this->_append($header . $recordData); + } + + /** + * Write BIFF record RANGEPROTECTION + * + * Openoffice.org's Documentaion of the Microsoft Excel File Format uses term RANGEPROTECTION for these records + * Microsoft Office Excel 97-2007 Binary File Format Specification uses term FEAT for these records + */ + private function _writeRangeProtection() + { + foreach ($this->_phpSheet->getProtectedCells() as $range => $password) { + // number of ranges, e.g. 'A1:B3 C20:D25' + $cellRanges = explode(' ', $range); + $cref = count($cellRanges); + + $recordData = pack( + 'vvVVvCVvVv', + 0x0868, + 0x00, + 0x0000, + 0x0000, + 0x02, + 0x0, + 0x0000, + $cref, + 0x0000, + 0x00 + ); + + foreach ($cellRanges as $cellRange) { + $recordData .= $this->_writeBIFF8CellRangeAddressFixed($cellRange); + } + + // the rgbFeat structure + $recordData .= pack( + 'VV', + 0x0000, + hexdec($password) + ); + + $recordData .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong('p' . md5($recordData)); + + $length = strlen($recordData); + + $record = 0x0868; // Record identifier + $header = pack("vv", $record, $length); + $this->_append($header . $recordData); + } + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in a worksheet. + * + * Excel only stores references to external sheets that are used in formulas. + * For simplicity we store references to all the sheets in the workbook + * regardless of whether they are used or not. This reduces the overall + * complexity and eliminates the need for a two way dialogue between the formula + * parser the worksheet objects. + * + * @param integer $count The number of external sheet references in this worksheet + */ + private function _writeExterncount($count) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $count); + $this->_append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. A formula references a sheet name via an index. Since we store a + * reference to all of the external worksheets the EXTERNSHEET index is the same + * as the worksheet index. + * + * @param string $sheetname The name of a external worksheet + */ + private function _writeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + + // References to the current sheet are encoded differently to references to + // external sheets. + // + if ($this->_phpSheet->getTitle() == $sheetname) { + $sheetname = ''; + $length = 0x02; // The following 2 bytes + $cch = 1; // The following byte + $rgch = 0x02; // Self reference + } else { + $length = 0x02 + strlen($sheetname); + $cch = strlen($sheetname); + $rgch = 0x03; // Reference to a sheet in the current workbook + } + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_append($header . $data . $sheetname); + } + + /** + * Writes the Excel BIFF PANE record. + * The panes can either be frozen or thawed (unfrozen). + * Frozen panes are specified in terms of an integer number of rows and columns. + * Thawed panes are specified in terms of Excel's units for rows and columns. + */ + private function _writePanes() + { + $panes = array(); + if ($freezePane = $this->_phpSheet->getFreezePane()) { + list($column, $row) = PHPExcel_Cell::coordinateFromString($freezePane); + $panes[0] = $row - 1; + $panes[1] = PHPExcel_Cell::columnIndexFromString($column) - 1; + } else { + // thaw panes + return; + } + + $y = isset($panes[0]) ? $panes[0] : null; + $x = isset($panes[1]) ? $panes[1] : null; + $rwTop = isset($panes[2]) ? $panes[2] : null; + $colLeft = isset($panes[3]) ? $panes[3] : null; + if (count($panes) > 4) { // if Active pane was received + $pnnAct = $panes[4]; + } else { + $pnnAct = null; + } + $record = 0x0041; // Record identifier + $length = 0x000A; // Number of bytes to follow + + // Code specific to frozen or thawed panes. + if ($this->_phpSheet->getFreezePane()) { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = $y; + } + if (!isset($colLeft)) { + $colLeft = $x; + } + } else { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = 0; + } + if (!isset($colLeft)) { + $colLeft = 0; + } + + // Convert Excel's row and column units to the internal units. + // The default row height is 12.75 + // The default column width is 8.43 + // The following slope and intersection values were interpolated. + // + $y = 20*$y + 255; + $x = 113.879*$x + 390; + } + + + // Determine which pane should be active. There is also the undocumented + // option to override this should it be necessary: may be removed later. + // + if (!isset($pnnAct)) { + if ($x != 0 && $y != 0) { + $pnnAct = 0; // Bottom right + } + if ($x != 0 && $y == 0) { + $pnnAct = 1; // Top right + } + if ($x == 0 && $y != 0) { + $pnnAct = 2; // Bottom left + } + if ($x == 0 && $y == 0) { + $pnnAct = 3; // Top left + } + } + + $this->_active_pane = $pnnAct; // Used in _writeSelection + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); + $this->_append($header . $data); + } + + /** + * Store the page setup SETUP BIFF record. + */ + private function _writeSetup() + { + $record = 0x00A1; // Record identifier + $length = 0x0022; // Number of bytes to follow + + $iPaperSize = $this->_phpSheet->getPageSetup()->getPaperSize(); // Paper size + + $iScale = $this->_phpSheet->getPageSetup()->getScale() ? + $this->_phpSheet->getPageSetup()->getScale() : 100; // Print scaling factor + + $iPageStart = 0x01; // Starting page number + $iFitWidth = (int) $this->_phpSheet->getPageSetup()->getFitToWidth(); // Fit to number of pages wide + $iFitHeight = (int) $this->_phpSheet->getPageSetup()->getFitToHeight(); // Fit to number of pages high + $grbit = 0x00; // Option flags + $iRes = 0x0258; // Print resolution + $iVRes = 0x0258; // Vertical print resolution + + $numHdr = $this->_phpSheet->getPageMargins()->getHeader(); // Header Margin + + $numFtr = $this->_phpSheet->getPageMargins()->getFooter(); // Footer Margin + $iCopies = 0x01; // Number of copies + + $fLeftToRight = 0x0; // Print over then down + + // Page orientation + $fLandscape = ($this->_phpSheet->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? + 0x0 : 0x1; + + $fNoPls = 0x0; // Setup not read from printer + $fNoColor = 0x0; // Print black and white + $fDraft = 0x0; // Print draft quality + $fNotes = 0x0; // Print notes + $fNoOrient = 0x0; // Orientation not set + $fUsePage = 0x0; // Use custom starting page + + $grbit = $fLeftToRight; + $grbit |= $fLandscape << 1; + $grbit |= $fNoPls << 2; + $grbit |= $fNoColor << 3; + $grbit |= $fDraft << 4; + $grbit |= $fNotes << 5; + $grbit |= $fNoOrient << 6; + $grbit |= $fUsePage << 7; + + $numHdr = pack("d", $numHdr); + $numFtr = pack("d", $numFtr); + if (self::getByteOrder()) { // if it's Big Endian + $numHdr = strrev($numHdr); + $numFtr = strrev($numFtr); + } + + $header = pack("vv", $record, $length); + $data1 = pack("vvvvvvvv", $iPaperSize, + $iScale, + $iPageStart, + $iFitWidth, + $iFitHeight, + $grbit, + $iRes, + $iVRes); + $data2 = $numHdr.$numFtr; + $data3 = pack("v", $iCopies); + $this->_append($header . $data1 . $data2 . $data3); + } + + /** + * Store the header caption BIFF record. + */ + private function _writeHeader() + { + $record = 0x0014; // Record identifier + + /* removing for now + // need to fix character count (multibyte!) + if (strlen($this->_phpSheet->getHeaderFooter()->getOddHeader()) <= 255) { + $str = $this->_phpSheet->getHeaderFooter()->getOddHeader(); // header string + } else { + $str = ''; + } + */ + + $recordData = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($this->_phpSheet->getHeaderFooter()->getOddHeader()); + $length = strlen($recordData); + + $header = pack("vv", $record, $length); + + $this->_append($header . $recordData); + } + + /** + * Store the footer caption BIFF record. + */ + private function _writeFooter() + { + $record = 0x0015; // Record identifier + + /* removing for now + // need to fix character count (multibyte!) + if (strlen($this->_phpSheet->getHeaderFooter()->getOddFooter()) <= 255) { + $str = $this->_phpSheet->getHeaderFooter()->getOddFooter(); + } else { + $str = ''; + } + */ + + $recordData = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($this->_phpSheet->getHeaderFooter()->getOddFooter()); + $length = strlen($recordData); + + $header = pack("vv", $record, $length); + + $this->_append($header . $recordData); + } + + /** + * Store the horizontal centering HCENTER BIFF record. + * + * @access private + */ + private function _writeHcenter() + { + $record = 0x0083; // Record identifier + $length = 0x0002; // Bytes to follow + + $fHCenter = $this->_phpSheet->getPageSetup()->getHorizontalCentered() ? 1 : 0; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fHCenter); + + $this->_append($header.$data); + } + + /** + * Store the vertical centering VCENTER BIFF record. + */ + private function _writeVcenter() + { + $record = 0x0084; // Record identifier + $length = 0x0002; // Bytes to follow + + $fVCenter = $this->_phpSheet->getPageSetup()->getVerticalCentered() ? 1 : 0; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fVCenter); + $this->_append($header . $data); + } + + /** + * Store the LEFTMARGIN BIFF record. + */ + private function _writeMarginLeft() + { + $record = 0x0026; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_phpSheet->getPageMargins()->getLeft(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /** + * Store the RIGHTMARGIN BIFF record. + */ + private function _writeMarginRight() + { + $record = 0x0027; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_phpSheet->getPageMargins()->getRight(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /** + * Store the TOPMARGIN BIFF record. + */ + private function _writeMarginTop() + { + $record = 0x0028; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_phpSheet->getPageMargins()->getTop(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /** + * Store the BOTTOMMARGIN BIFF record. + */ + private function _writeMarginBottom() + { + $record = 0x0029; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_phpSheet->getPageMargins()->getBottom(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /** + * Write the PRINTHEADERS BIFF record. + */ + private function _writePrintHeaders() + { + $record = 0x002a; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintRwCol = $this->_print_headers; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintRwCol); + $this->_append($header . $data); + } + + /** + * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the + * GRIDSET record. + */ + private function _writePrintGridlines() + { + $record = 0x002b; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintGrid = $this->_phpSheet->getPrintGridlines() ? 1 : 0; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintGrid); + $this->_append($header . $data); + } + + /** + * Write the GRIDSET BIFF record. Must be used in conjunction with the + * PRINTGRIDLINES record. + */ + private function _writeGridset() + { + $record = 0x0082; // Record identifier + $length = 0x0002; // Bytes to follow + + $fGridSet = !$this->_phpSheet->getPrintGridlines(); // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fGridSet); + $this->_append($header . $data); + } + + /** + * Write the AUTOFILTERINFO BIFF record. This is used to configure the number of autofilter select used in the sheet. + */ + private function _writeAutoFilterInfo(){ + $record = 0x009D; // Record identifier + $length = 0x0002; // Bytes to follow + + $rangeBounds = PHPExcel_Cell::rangeBoundaries($this->_phpSheet->getAutoFilter()->getRange()); + $iNumFilters = 1 + $rangeBounds[1][0] - $rangeBounds[0][0]; + + $header = pack("vv", $record, $length); + $data = pack("v", $iNumFilters); + $this->_append($header . $data); + } + + /** + * Write the GUTS BIFF record. This is used to configure the gutter margins + * where Excel outline symbols are displayed. The visibility of the gutters is + * controlled by a flag in WSBOOL. + * + * @see _writeWsbool() + */ + private function _writeGuts() + { + $record = 0x0080; // Record identifier + $length = 0x0008; // Bytes to follow + + $dxRwGut = 0x0000; // Size of row gutter + $dxColGut = 0x0000; // Size of col gutter + + // determine maximum row outline level + $maxRowOutlineLevel = 0; + foreach ($this->_phpSheet->getRowDimensions() as $rowDimension) { + $maxRowOutlineLevel = max($maxRowOutlineLevel, $rowDimension->getOutlineLevel()); + } + + $col_level = 0; + + // Calculate the maximum column outline level. The equivalent calculation + // for the row outline level is carried out in _writeRow(). + $colcount = count($this->_colinfo); + for ($i = 0; $i < $colcount; ++$i) { + $col_level = max($this->_colinfo[$i][5], $col_level); + } + + // Set the limits for the outline levels (0 <= x <= 7). + $col_level = max(0, min($col_level, 7)); + + // The displayed level is one greater than the max outline levels + if ($maxRowOutlineLevel) { + ++$maxRowOutlineLevel; + } + if ($col_level) { + ++$col_level; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $dxRwGut, $dxColGut, $maxRowOutlineLevel, $col_level); + + $this->_append($header.$data); + } + + /** + * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction + * with the SETUP record. + */ + private function _writeWsbool() + { + $record = 0x0081; // Record identifier + $length = 0x0002; // Bytes to follow + $grbit = 0x0000; + + // The only option that is of interest is the flag for fit to page. So we + // set all the options in one go. + // + // Set the option flags + $grbit |= 0x0001; // Auto page breaks visible + if ($this->_outline_style) { + $grbit |= 0x0020; // Auto outline styles + } + if ($this->_phpSheet->getShowSummaryBelow()) { + $grbit |= 0x0040; // Outline summary below + } + if ($this->_phpSheet->getShowSummaryRight()) { + $grbit |= 0x0080; // Outline summary right + } + if ($this->_phpSheet->getPageSetup()->getFitToPage()) { + $grbit |= 0x0100; // Page setup fit to page + } + if ($this->_outline_on) { + $grbit |= 0x0400; // Outline symbols displayed + } + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $this->_append($header . $data); + } + + /** + * Write the HORIZONTALPAGEBREAKS and VERTICALPAGEBREAKS BIFF records. + */ + private function _writeBreaks() + { + // initialize + $vbreaks = array(); + $hbreaks = array(); + + foreach ($this->_phpSheet->getBreaks() as $cell => $breakType) { + // Fetch coordinates + $coordinates = PHPExcel_Cell::coordinateFromString($cell); + + // Decide what to do by the type of break + switch ($breakType) { + case PHPExcel_Worksheet::BREAK_COLUMN: + // Add to list of vertical breaks + $vbreaks[] = PHPExcel_Cell::columnIndexFromString($coordinates[0]) - 1; + break; + + case PHPExcel_Worksheet::BREAK_ROW: + // Add to list of horizontal breaks + $hbreaks[] = $coordinates[1]; + break; + + case PHPExcel_Worksheet::BREAK_NONE: + default: + // Nothing to do + break; + } + } + + //horizontal page breaks + if (!empty($hbreaks)) { + + // Sort and filter array of page breaks + sort($hbreaks, SORT_NUMERIC); + if ($hbreaks[0] == 0) { // don't use first break if it's 0 + array_shift($hbreaks); + } + + $record = 0x001b; // Record identifier + $cbrk = count($hbreaks); // Number of page breaks + $length = 2 + 6 * $cbrk; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($hbreaks as $hbreak) { + $data .= pack("vvv", $hbreak, 0x0000, 0x00ff); + } + + $this->_append($header . $data); + } + + // vertical page breaks + if (!empty($vbreaks)) { + + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. + // It is slightly higher in Excel 97/200, approx. 1026 + $vbreaks = array_slice($vbreaks, 0, 1000); + + // Sort and filter array of page breaks + sort($vbreaks, SORT_NUMERIC); + if ($vbreaks[0] == 0) { // don't use first break if it's 0 + array_shift($vbreaks); + } + + $record = 0x001a; // Record identifier + $cbrk = count($vbreaks); // Number of page breaks + $length = 2 + 6 * $cbrk; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($vbreaks as $vbreak) { + $data .= pack("vvv", $vbreak, 0x0000, 0xffff); + } + + $this->_append($header . $data); + } + } + + /** + * Set the Biff PROTECT record to indicate that the worksheet is protected. + */ + private function _writeProtect() + { + // Exit unless sheet protection has been specified + if (!$this->_phpSheet->getProtection()->getSheet()) { + return; + } + + $record = 0x0012; // Record identifier + $length = 0x0002; // Bytes to follow + + $fLock = 1; // Worksheet is protected + + $header = pack("vv", $record, $length); + $data = pack("v", $fLock); + + $this->_append($header.$data); + } + + /** + * Write SCENPROTECT + */ + private function _writeScenProtect() + { + // Exit if sheet protection is not active + if (!$this->_phpSheet->getProtection()->getSheet()) { + return; + } + + // Exit if scenarios are not protected + if (!$this->_phpSheet->getProtection()->getScenarios()) { + return; + } + + $record = 0x00DD; // Record identifier + $length = 0x0002; // Bytes to follow + + $header = pack('vv', $record, $length); + $data = pack('v', 1); + + $this->_append($header . $data); + } + + /** + * Write OBJECTPROTECT + */ + private function _writeObjectProtect() + { + // Exit if sheet protection is not active + if (!$this->_phpSheet->getProtection()->getSheet()) { + return; + } + + // Exit if objects are not protected + if (!$this->_phpSheet->getProtection()->getObjects()) { + return; + } + + $record = 0x0063; // Record identifier + $length = 0x0002; // Bytes to follow + + $header = pack('vv', $record, $length); + $data = pack('v', 1); + + $this->_append($header . $data); + } + + /** + * Write the worksheet PASSWORD record. + */ + private function _writePassword() + { + // Exit unless sheet protection and password have been specified + if (!$this->_phpSheet->getProtection()->getSheet() || !$this->_phpSheet->getProtection()->getPassword()) { + return; + } + + $record = 0x0013; // Record identifier + $length = 0x0002; // Bytes to follow + + $wPassword = hexdec($this->_phpSheet->getProtection()->getPassword()); // Encoded password + + $header = pack("vv", $record, $length); + $data = pack("v", $wPassword); + + $this->_append($header . $data); + } + + /** + * Insert a 24bit bitmap image in a worksheet. + * + * @access public + * @param integer $row The row we are going to insert the bitmap into + * @param integer $col The column we are going to insert the bitmap into + * @param mixed $bitmap The bitmap filename or GD-image resource + * @param integer $x The horizontal position (offset) of the image inside the cell. + * @param integer $y The vertical position (offset) of the image inside the cell. + * @param float $scale_x The horizontal scale + * @param float $scale_y The vertical scale + */ + function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1) + { + $bitmap_array = (is_resource($bitmap) ? $this->_processBitmapGd($bitmap) : $this->_processBitmap($bitmap)); + list($width, $height, $size, $data) = $bitmap_array; //$this->_processBitmap($bitmap); + + // Scale the frame of the image. + $width *= $scale_x; + $height *= $scale_y; + + // Calculate the vertices of the image and write the OBJ record + $this->_positionImage($col, $row, $x, $y, $width, $height); + + // Write the IMDATA record to store the bitmap data + $record = 0x007f; + $length = 8 + $size; + $cf = 0x09; + $env = 0x01; + $lcb = $size; + + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); + $this->_append($header.$data); + } + + /** + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * The SDK incorrectly states that the height should be expressed as a + * percentage of 1024. + * + * @access private + * @param integer $col_start Col containing upper left corner of object + * @param integer $row_start Row containing top left corner of object + * @param integer $x1 Distance to left side of object + * @param integer $y1 Distance to top of object + * @param integer $width Width of image frame + * @param integer $height Height of image frame + */ + function _positionImage($col_start, $row_start, $x1, $y1, $width, $height) + { + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start))) { + $x1 = 0; + } + if ($y1 >= PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_start + 1)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end))) { + $width -= PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end)); + ++$col_end; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_end + 1)) { + $height -= PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_end + 1); + ++$row_end; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero eight or width. + // + if (PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) == 0) { + return; + } + if (PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) == 0) { + return; + } + if (PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_start + 1) == 0) { + return; + } + if (PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_end + 1) == 0) { + return; + } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) * 1024; + $y1 = $y1 / PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_start + 1) * 256; + $x2 = $width / PHPExcel_Shared_Excel5::sizeCol($this->_phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) * 1024; // Distance to right side of object + $y2 = $height / PHPExcel_Shared_Excel5::sizeRow($this->_phpSheet, $row_end + 1) * 256; // Distance to bottom of object + + $this->_writeObjPicture($col_start, $x1, + $row_start, $y1, + $col_end, $x2, + $row_end, $y2); + } + + /** + * Store the OBJ record that precedes an IMDATA record. This could be generalise + * to support other Excel objects. + * + * @param integer $colL Column containing upper left corner of object + * @param integer $dxL Distance from left side of cell + * @param integer $rwT Row containing top left corner of object + * @param integer $dyT Distance from top of cell + * @param integer $colR Column containing lower right corner of object + * @param integer $dxR Distance from right of cell + * @param integer $rwB Row containing bottom right corner of object + * @param integer $dyB Distance from bottom of cell + */ + private function _writeObjPicture($colL,$dxL,$rwT,$dyT,$colR,$dxR,$rwB,$dyB) + { + $record = 0x005d; // Record identifier + $length = 0x003c; // Bytes to follow + + $cObj = 0x0001; // Count of objects in file (set to 1) + $OT = 0x0008; // Object type. 8 = Picture + $id = 0x0001; // Object ID + $grbit = 0x0614; // Option flags + + $cbMacro = 0x0000; // Length of FMLA structure + $Reserved1 = 0x0000; // Reserved + $Reserved2 = 0x0000; // Reserved + + $icvBack = 0x09; // Background colour + $icvFore = 0x09; // Foreground colour + $fls = 0x00; // Fill pattern + $fAuto = 0x00; // Automatic fill + $icv = 0x08; // Line colour + $lns = 0xff; // Line style + $lnw = 0x01; // Line weight + $fAutoB = 0x00; // Automatic border + $frs = 0x0000; // Frame style + $cf = 0x0009; // Image format, 9 = bitmap + $Reserved3 = 0x0000; // Reserved + $cbPictFmla = 0x0000; // Length of FMLA structure + $Reserved4 = 0x0000; // Reserved + $grbit2 = 0x0001; // Option flags + $Reserved5 = 0x0000; // Reserved + + + $header = pack("vv", $record, $length); + $data = pack("V", $cObj); + $data .= pack("v", $OT); + $data .= pack("v", $id); + $data .= pack("v", $grbit); + $data .= pack("v", $colL); + $data .= pack("v", $dxL); + $data .= pack("v", $rwT); + $data .= pack("v", $dyT); + $data .= pack("v", $colR); + $data .= pack("v", $dxR); + $data .= pack("v", $rwB); + $data .= pack("v", $dyB); + $data .= pack("v", $cbMacro); + $data .= pack("V", $Reserved1); + $data .= pack("v", $Reserved2); + $data .= pack("C", $icvBack); + $data .= pack("C", $icvFore); + $data .= pack("C", $fls); + $data .= pack("C", $fAuto); + $data .= pack("C", $icv); + $data .= pack("C", $lns); + $data .= pack("C", $lnw); + $data .= pack("C", $fAutoB); + $data .= pack("v", $frs); + $data .= pack("V", $cf); + $data .= pack("v", $Reserved3); + $data .= pack("v", $cbPictFmla); + $data .= pack("v", $Reserved4); + $data .= pack("v", $grbit2); + $data .= pack("V", $Reserved5); + + $this->_append($header . $data); + } + + /** + * Convert a GD-image into the internal format. + * + * @access private + * @param resource $image The image to process + * @return array Array with data and properties of the bitmap + */ + function _processBitmapGd($image) { + $width = imagesx($image); + $height = imagesy($image); + + $data = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + for ($j=$height; $j--; ) { + for ($i=0; $i < $width; ++$i) { + $color = imagecolorsforindex($image, imagecolorat($image, $i, $j)); + foreach (array("red", "green", "blue") as $key) { + $color[$key] = $color[$key] + round((255 - $color[$key]) * $color["alpha"] / 127); + } + $data .= chr($color["blue"]) . chr($color["green"]) . chr($color["red"]); + } + if (3*$width % 4) { + $data .= str_repeat("\x00", 4 - 3*$width % 4); + } + } + + return array($width, $height, strlen($data), $data); + } + + /** + * Convert a 24 bit bitmap into the modified internal format used by Windows. + * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the + * MSDN library. + * + * @access private + * @param string $bitmap The bitmap to process + * @return array Array with data and properties of the bitmap + */ + function _processBitmap($bitmap) + { + // Open file. + $bmp_fd = @fopen($bitmap,"rb"); + if (!$bmp_fd) { + throw new Exception("Couldn't import $bitmap"); + } + + // Slurp the file into a string. + $data = fread($bmp_fd, filesize($bitmap)); + + // Check that the file is big enough to be a bitmap. + if (strlen($data) <= 0x36) { + throw new Exception("$bitmap doesn't contain enough data.\n"); + } + + // The first 2 bytes are used to identify the bitmap. + $identity = unpack("A2ident", $data); + if ($identity['ident'] != "BM") { + throw new Exception("$bitmap doesn't appear to be a valid bitmap image.\n"); + } + + // Remove bitmap data: ID. + $data = substr($data, 2); + + // Read and remove the bitmap size. This is more reliable than reading + // the data size at offset 0x22. + // + $size_array = unpack("Vsa", substr($data, 0, 4)); + $size = $size_array['sa']; + $data = substr($data, 4); + $size -= 0x36; // Subtract size of bitmap header. + $size += 0x0C; // Add size of BIFF header. + + // Remove bitmap data: reserved, offset, header length. + $data = substr($data, 12); + + // Read and remove the bitmap width and height. Verify the sizes. + $width_and_height = unpack("V2", substr($data, 0, 8)); + $width = $width_and_height[1]; + $height = $width_and_height[2]; + $data = substr($data, 8); + if ($width > 0xFFFF) { + throw new Exception("$bitmap: largest image width supported is 65k.\n"); + } + if ($height > 0xFFFF) { + throw new Exception("$bitmap: largest image height supported is 65k.\n"); + } + + // Read and remove the bitmap planes and bpp data. Verify them. + $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); + $data = substr($data, 4); + if ($planes_and_bitcount[2] != 24) { // Bitcount + throw new Exception("$bitmap isn't a 24bit true color bitmap.\n"); + } + if ($planes_and_bitcount[1] != 1) { + throw new Exception("$bitmap: only 1 plane supported in bitmap image.\n"); + } + + // Read and remove the bitmap compression. Verify compression. + $compression = unpack("Vcomp", substr($data, 0, 4)); + $data = substr($data, 4); + + //$compression = 0; + if ($compression['comp'] != 0) { + throw new Exception("$bitmap: compression not supported in bitmap image.\n"); + } + + // Remove bitmap data: data size, hres, vres, colours, imp. colours. + $data = substr($data, 20); + + // Add the BITMAPCOREHEADER data + $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + $data = $header . $data; + + return (array($width, $height, $size, $data)); + } + + /** + * Store the window zoom factor. This should be a reduced fraction but for + * simplicity we will store all fractions with a numerator of 100. + */ + private function _writeZoom() + { + // If scale is 100 we don't need to write a record + if ($this->_phpSheet->getSheetView()->getZoomScale() == 100) { + return; + } + + $record = 0x00A0; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->_phpSheet->getSheetView()->getZoomScale(), 100); + $this->_append($header . $data); + } + + /** + * Get Escher object + * + * @return PHPExcel_Shared_Escher + */ + public function getEscher() + { + return $this->_escher; + } + + /** + * Set Escher object + * + * @param PHPExcel_Shared_Escher $pValue + */ + public function setEscher(PHPExcel_Shared_Escher $pValue = null) + { + $this->_escher = $pValue; + } + + /** + * Write MSODRAWING record + */ + private function _writeMsoDrawing() + { + // write the Escher stream if necessary + if (isset($this->_escher)) { + $writer = new PHPExcel_Writer_Excel5_Escher($this->_escher); + $data = $writer->close(); + $spOffsets = $writer->getSpOffsets(); + $spTypes = $writer->getSpTypes(); + // write the neccesary MSODRAWING, OBJ records + + // split the Escher stream + $spOffsets[0] = 0; + $nm = count($spOffsets) - 1; // number of shapes excluding first shape + for ($i = 1; $i <= $nm; ++$i) { + // MSODRAWING record + $record = 0x00EC; // Record identifier + + // chunk of Escher stream for one shape + $dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]); + + $length = strlen($dataChunk); + $header = pack("vv", $record, $length); + + $this->_append($header . $dataChunk); + + // OBJ record + $record = 0x005D; // record identifier + $objData = ''; + + // ftCmo + if($spTypes[$i] == 0x00C9){ + // Add ftCmo (common object data) subobject + $objData .= + pack('vvvvvVVV' + , 0x0015 // 0x0015 = ftCmo + , 0x0012 // length of ftCmo data + , 0x0014 // object type, 0x0014 = filter + , $i // object id number, Excel seems to use 1-based index, local for the sheet + , 0x2101 // option flags, 0x2001 is what OpenOffice.org uses + , 0 // reserved + , 0 // reserved + , 0 // reserved + ); + + // Add ftSbs Scroll bar subobject + $objData .= pack('vv', 0x00C, 0x0014); + $objData .= pack('H*', '0000000000000000640001000A00000010000100'); + // Add ftLbsData (List box data) subobject + $objData .= pack('vv', 0x0013, 0x1FEE); + $objData .= pack('H*', '00000000010001030000020008005700'); + } + else { + // Add ftCmo (common object data) subobject + $objData .= + pack('vvvvvVVV' + , 0x0015 // 0x0015 = ftCmo + , 0x0012 // length of ftCmo data + , 0x0008 // object type, 0x0008 = picture + , $i // object id number, Excel seems to use 1-based index, local for the sheet + , 0x6011 // option flags, 0x6011 is what OpenOffice.org uses + , 0 // reserved + , 0 // reserved + , 0 // reserved + ); + } + + // ftEnd + $objData .= + pack('vv' + , 0x0000 // 0x0000 = ftEnd + , 0x0000 // length of ftEnd data + ); + + $length = strlen($objData); + $header = pack('vv', $record, $length); + $this->_append($header . $objData); + } + } + } + + /** + * Store the DATAVALIDATIONS and DATAVALIDATION records. + */ + private function _writeDataValidity() + { + // Datavalidation collection + $dataValidationCollection = $this->_phpSheet->getDataValidationCollection(); + + // Write data validations? + if (!empty($dataValidationCollection)) { + + // DATAVALIDATIONS record + $record = 0x01B2; // Record identifier + $length = 0x0012; // Bytes to follow + + $grbit = 0x0000; // Prompt box at cell, no cached validity data at DV records + $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position + $verPos = 0x00000000; // Vertical position of prompt box, if fixed position + $objId = 0xFFFFFFFF; // Object identifier of drop down arrow object, or -1 if not visible + + $header = pack('vv', $record, $length); + $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, + count($dataValidationCollection)); + $this->_append($header.$data); + + // DATAVALIDATION records + $record = 0x01BE; // Record identifier + + foreach ($dataValidationCollection as $cellCoordinate => $dataValidation) { + // initialize record data + $data = ''; + + // options + $options = 0x00000000; + + // data type + $type = $dataValidation->getType(); + switch ($type) { + case PHPExcel_Cell_DataValidation::TYPE_NONE: $type = 0x00; break; + case PHPExcel_Cell_DataValidation::TYPE_WHOLE: $type = 0x01; break; + case PHPExcel_Cell_DataValidation::TYPE_DECIMAL: $type = 0x02; break; + case PHPExcel_Cell_DataValidation::TYPE_LIST: $type = 0x03; break; + case PHPExcel_Cell_DataValidation::TYPE_DATE: $type = 0x04; break; + case PHPExcel_Cell_DataValidation::TYPE_TIME: $type = 0x05; break; + case PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH: $type = 0x06; break; + case PHPExcel_Cell_DataValidation::TYPE_CUSTOM: $type = 0x07; break; + } + $options |= $type << 0; + + // error style + $errorStyle = $dataValidation->getType(); + switch ($errorStyle) { + case PHPExcel_Cell_DataValidation::STYLE_STOP: $errorStyle = 0x00; break; + case PHPExcel_Cell_DataValidation::STYLE_WARNING: $errorStyle = 0x01; break; + case PHPExcel_Cell_DataValidation::STYLE_INFORMATION: $errorStyle = 0x02; break; + } + $options |= $errorStyle << 4; + + // explicit formula? + if ($type == 0x03 && preg_match('/^\".*\"$/', $dataValidation->getFormula1())) { + $options |= 0x01 << 7; + } + + // empty cells allowed + $options |= $dataValidation->getAllowBlank() << 8; + + // show drop down + $options |= (!$dataValidation->getShowDropDown()) << 9; + + // show input message + $options |= $dataValidation->getShowInputMessage() << 18; + + // show error message + $options |= $dataValidation->getShowErrorMessage() << 19; + + // condition operator + $operator = $dataValidation->getOperator(); + switch ($operator) { + case PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN: $operator = 0x00 ; break; + case PHPExcel_Cell_DataValidation::OPERATOR_NOTBETWEEN: $operator = 0x01 ; break; + case PHPExcel_Cell_DataValidation::OPERATOR_EQUAL: $operator = 0x02 ; break; + case PHPExcel_Cell_DataValidation::OPERATOR_NOTEQUAL: $operator = 0x03 ; break; + case PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHAN: $operator = 0x04 ; break; + case PHPExcel_Cell_DataValidation::OPERATOR_LESSTHAN: $operator = 0x05 ; break; + case PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHANOREQUAL: $operator = 0x06; break; + case PHPExcel_Cell_DataValidation::OPERATOR_LESSTHANOREQUAL: $operator = 0x07 ; break; + } + $options |= $operator << 20; + + $data = pack('V', $options); + + // prompt title + $promptTitle = $dataValidation->getPromptTitle() !== '' ? + $dataValidation->getPromptTitle() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($promptTitle); + + // error title + $errorTitle = $dataValidation->getErrorTitle() !== '' ? + $dataValidation->getErrorTitle() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($errorTitle); + + // prompt text + $prompt = $dataValidation->getPrompt() !== '' ? + $dataValidation->getPrompt() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($prompt); + + // error text + $error = $dataValidation->getError() !== '' ? + $dataValidation->getError() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($error); + + // formula 1 + try { + $formula1 = $dataValidation->getFormula1(); + if ($type == 0x03) { // list type + $formula1 = str_replace(',', chr(0), $formula1); + } + $this->_parser->parse($formula1); + $formula1 = $this->_parser->toReversePolish(); + $sz1 = strlen($formula1); + + } catch(Exception $e) { + $sz1 = 0; + $formula1 = ''; + } + $data .= pack('vv', $sz1, 0x0000); + $data .= $formula1; + + // formula 2 + try { + $formula2 = $dataValidation->getFormula2(); + if ($formula2 === '') { + throw new Exception('No formula2'); + } + $this->_parser->parse($formula2); + $formula2 = $this->_parser->toReversePolish(); + $sz2 = strlen($formula2); + + } catch(Exception $e) { + $sz2 = 0; + $formula2 = ''; + } + $data .= pack('vv', $sz2, 0x0000); + $data .= $formula2; + + // cell range address list + $data .= pack('v', 0x0001); + $data .= $this->_writeBIFF8CellRangeAddressFixed($cellCoordinate); + + $length = strlen($data); + $header = pack("vv", $record, $length); + + $this->_append($header . $data); + } + } + } + + /** + * Map Error code + * + * @param string $errorCode + * @return int + */ + private static function _mapErrorCode($errorCode) { + switch ($errorCode) { + case '#NULL!': return 0x00; + case '#DIV/0!': return 0x07; + case '#VALUE!': return 0x0F; + case '#REF!': return 0x17; + case '#NAME?': return 0x1D; + case '#NUM!': return 0x24; + case '#N/A': return 0x2A; + } + + return 0; + } + +} \ No newline at end of file diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Xf.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Xf.php new file mode 100644 index 000000000..06fb1d9d8 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/Excel5/Xf.php @@ -0,0 +1,546 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Format (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// /* +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ + + +/** + * PHPExcel_Writer_Excel5_Xf + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Xf +{ + /** + * Style XF or a cell XF ? + * + * @var boolean + */ + private $_isStyleXf; + + /** + * Index to the FONT record. Index 4 does not exist + * @var integer + */ + private $_fontIndex; + + /** + * An index (2 bytes) to a FORMAT record (number format). + * @var integer + */ + public $_numberFormatIndex; + + /** + * 1 bit, apparently not used. + * @var integer + */ + public $_text_justlast; + + /** + * The cell's foreground color. + * @var integer + */ + public $_fg_color; + + /** + * The cell's background color. + * @var integer + */ + public $_bg_color; + + /** + * Color of the bottom border of the cell. + * @var integer + */ + public $_bottom_color; + + /** + * Color of the top border of the cell. + * @var integer + */ + public $_top_color; + + /** + * Color of the left border of the cell. + * @var integer + */ + public $_left_color; + + /** + * Color of the right border of the cell. + * @var integer + */ + public $_right_color; + + /** + * Constructor + * + * @access public + * @param PHPExcel_Style The XF format + */ + public function __construct(PHPExcel_Style $style = null) + { + $this->_isStyleXf = false; + $this->_fontIndex = 0; + + $this->_numberFormatIndex = 0; + + $this->_text_justlast = 0; + + $this->_fg_color = 0x40; + $this->_bg_color = 0x41; + + $this->_diag = 0; + + $this->_bottom_color = 0x40; + $this->_top_color = 0x40; + $this->_left_color = 0x40; + $this->_right_color = 0x40; + $this->_diag_color = 0x40; + $this->_style = $style; + + } + + + /** + * Generate an Excel BIFF XF record (style or cell). + * + * @return string The XF record + */ + function writeXf() + { + // Set the type of the XF record and some of the attributes. + if ($this->_isStyleXf) { + $style = 0xFFF5; + } else { + $style = self::_mapLocked($this->_style->getProtection()->getLocked()); + $style |= self::_mapHidden($this->_style->getProtection()->getHidden()) << 1; + } + + // Flags to indicate if attributes have been set. + $atr_num = ($this->_numberFormatIndex != 0)?1:0; + $atr_fnt = ($this->_fontIndex != 0)?1:0; + $atr_alc = ((int) $this->_style->getAlignment()->getWrapText())?1:0; + $atr_bdr = (self::_mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) || + self::_mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) || + self::_mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) || + self::_mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()))?1:0; + $atr_pat = (($this->_fg_color != 0x40) || + ($this->_bg_color != 0x41) || + self::_mapFillType($this->_style->getFill()->getFillType()))?1:0; + $atr_prot = self::_mapLocked($this->_style->getProtection()->getLocked()) + | self::_mapHidden($this->_style->getProtection()->getHidden()); + + // Zero the default border colour if the border has not been set. + if (self::_mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) == 0) { + $this->_bottom_color = 0; + } + if (self::_mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) == 0) { + $this->_top_color = 0; + } + if (self::_mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) == 0) { + $this->_right_color = 0; + } + if (self::_mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) == 0) { + $this->_left_color = 0; + } + if (self::_mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) == 0) { + $this->_diag_color = 0; + } + + $record = 0x00E0; // Record identifier + $length = 0x0014; // Number of bytes to follow + + $ifnt = $this->_fontIndex; // Index to FONT record + $ifmt = $this->_numberFormatIndex; // Index to FORMAT record + + $align = $this->_mapHAlign($this->_style->getAlignment()->getHorizontal()); // Alignment + $align |= (int) $this->_style->getAlignment()->getWrapText() << 3; + $align |= self::_mapVAlign($this->_style->getAlignment()->getVertical()) << 4; + $align |= $this->_text_justlast << 7; + + $used_attrib = $atr_num << 2; + $used_attrib |= $atr_fnt << 3; + $used_attrib |= $atr_alc << 4; + $used_attrib |= $atr_bdr << 5; + $used_attrib |= $atr_pat << 6; + $used_attrib |= $atr_prot << 7; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $border1 = self::_mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()); // Border line style and color + $border1 |= self::_mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) << 4; + $border1 |= self::_mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) << 8; + $border1 |= self::_mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) << 12; + $border1 |= $this->_left_color << 16; + $border1 |= $this->_right_color << 23; + + $diagonalDirection = $this->_style->getBorders()->getDiagonalDirection(); + $diag_tl_to_rb = $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_BOTH + || $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_DOWN; + $diag_tr_to_lb = $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_BOTH + || $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_UP; + $border1 |= $diag_tl_to_rb << 30; + $border1 |= $diag_tr_to_lb << 31; + + $border2 = $this->_top_color; // Border color + $border2 |= $this->_bottom_color << 7; + $border2 |= $this->_diag_color << 14; + $border2 |= self::_mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) << 21; + $border2 |= self::_mapFillType($this->_style->getFill()->getFillType()) << 26; + + $header = pack("vv", $record, $length); + + //BIFF8 options: identation, shrinkToFit and text direction + $biff8_options = $this->_style->getAlignment()->getIndent(); + $biff8_options |= (int) $this->_style->getAlignment()->getShrinkToFit() << 4; + + $data = pack("vvvC", $ifnt, $ifmt, $style, $align); + $data .= pack("CCC" + , self::_mapTextRotation($this->_style->getAlignment()->getTextRotation()) + , $biff8_options + , $used_attrib + ); + $data .= pack("VVv", $border1, $border2, $icv); + + return($header . $data); + } + + /** + * Is this a style XF ? + * + * @param boolean $value + */ + public function setIsStyleXf($value) + { + $this->_isStyleXf = $value; + } + + /** + * Sets the cell's bottom border color + * + * @access public + * @param int $colorIndex Color index + */ + function setBottomColor($colorIndex) + { + $this->_bottom_color = $colorIndex; + } + + /** + * Sets the cell's top border color + * + * @access public + * @param int $colorIndex Color index + */ + function setTopColor($colorIndex) + { + $this->_top_color = $colorIndex; + } + + /** + * Sets the cell's left border color + * + * @access public + * @param int $colorIndex Color index + */ + function setLeftColor($colorIndex) + { + $this->_left_color = $colorIndex; + } + + /** + * Sets the cell's right border color + * + * @access public + * @param int $colorIndex Color index + */ + function setRightColor($colorIndex) + { + $this->_right_color = $colorIndex; + } + + /** + * Sets the cell's diagonal border color + * + * @access public + * @param int $colorIndex Color index + */ + function setDiagColor($colorIndex) + { + $this->_diag_color = $colorIndex; + } + + + /** + * Sets the cell's foreground color + * + * @access public + * @param int $colorIndex Color index + */ + function setFgColor($colorIndex) + { + $this->_fg_color = $colorIndex; + } + + /** + * Sets the cell's background color + * + * @access public + * @param int $colorIndex Color index + */ + function setBgColor($colorIndex) + { + $this->_bg_color = $colorIndex; + } + + /** + * Sets the index to the number format record + * It can be date, time, currency, etc... + * + * @access public + * @param integer $numberFormatIndex Index to format record + */ + function setNumberFormatIndex($numberFormatIndex) + { + $this->_numberFormatIndex = $numberFormatIndex; + } + + /** + * Set the font index. + * + * @param int $value Font index, note that value 4 does not exist + */ + public function setFontIndex($value) + { + $this->_fontIndex = $value; + } + + /** + * Map of BIFF2-BIFF8 codes for border styles + * @static array of int + * + */ + private static $_mapBorderStyle = array ( PHPExcel_Style_Border::BORDER_NONE => 0x00, + PHPExcel_Style_Border::BORDER_THIN => 0x01, + PHPExcel_Style_Border::BORDER_MEDIUM => 0x02, + PHPExcel_Style_Border::BORDER_DASHED => 0x03, + PHPExcel_Style_Border::BORDER_DOTTED => 0x04, + PHPExcel_Style_Border::BORDER_THICK => 0x05, + PHPExcel_Style_Border::BORDER_DOUBLE => 0x06, + PHPExcel_Style_Border::BORDER_HAIR => 0x07, + PHPExcel_Style_Border::BORDER_MEDIUMDASHED => 0x08, + PHPExcel_Style_Border::BORDER_DASHDOT => 0x09, + PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT => 0x0A, + PHPExcel_Style_Border::BORDER_DASHDOTDOT => 0x0B, + PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT => 0x0C, + PHPExcel_Style_Border::BORDER_SLANTDASHDOT => 0x0D, + ); + + /** + * Map border style + * + * @param string $borderStyle + * @return int + */ + private static function _mapBorderStyle($borderStyle) { + if (isset(self::$_mapBorderStyle[$borderStyle])) + return self::$_mapBorderStyle[$borderStyle]; + return 0x00; + } + + /** + * Map of BIFF2-BIFF8 codes for fill types + * @static array of int + * + */ + private static $_mapFillType = array( PHPExcel_Style_Fill::FILL_NONE => 0x00, + PHPExcel_Style_Fill::FILL_SOLID => 0x01, + PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY => 0x02, + PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY => 0x03, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY => 0x04, + PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL => 0x05, + PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL => 0x06, + PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN => 0x07, + PHPExcel_Style_Fill::FILL_PATTERN_DARKUP => 0x08, + PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID => 0x09, + PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS => 0x0A, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL => 0x0B, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL => 0x0C, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN => 0x0D, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP => 0x0E, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID => 0x0F, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS => 0x10, + PHPExcel_Style_Fill::FILL_PATTERN_GRAY125 => 0x11, + PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625 => 0x12, + PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR => 0x00, // does not exist in BIFF8 + PHPExcel_Style_Fill::FILL_GRADIENT_PATH => 0x00, // does not exist in BIFF8 + ); + /** + * Map fill type + * + * @param string $fillType + * @return int + */ + private static function _mapFillType($fillType) { + if (isset(self::$_mapFillType[$fillType])) + return self::$_mapFillType[$fillType]; + return 0x00; + } + + /** + * Map of BIFF2-BIFF8 codes for horizontal alignment + * @static array of int + * + */ + private static $_mapHAlign = array( PHPExcel_Style_Alignment::HORIZONTAL_GENERAL => 0, + PHPExcel_Style_Alignment::HORIZONTAL_LEFT => 1, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER => 2, + PHPExcel_Style_Alignment::HORIZONTAL_RIGHT => 3, + PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY => 5, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS => 6, + ); + /** + * Map to BIFF2-BIFF8 codes for horizontal alignment + * + * @param string $hAlign + * @return int + */ + private function _mapHAlign($hAlign) + { + if (isset(self::$_mapHAlign[$hAlign])) + return self::$_mapHAlign[$hAlign]; + return 0; + } + + /** + * Map of BIFF2-BIFF8 codes for vertical alignment + * @static array of int + * + */ + private static $_mapVAlign = array( PHPExcel_Style_Alignment::VERTICAL_TOP => 0, + PHPExcel_Style_Alignment::VERTICAL_CENTER => 1, + PHPExcel_Style_Alignment::VERTICAL_BOTTOM => 2, + PHPExcel_Style_Alignment::VERTICAL_JUSTIFY => 3, + ); + /** + * Map to BIFF2-BIFF8 codes for vertical alignment + * + * @param string $vAlign + * @return int + */ + private static function _mapVAlign($vAlign) { + if (isset(self::$_mapVAlign[$vAlign])) + return self::$_mapVAlign[$vAlign]; + return 2; + } + + /** + * Map to BIFF8 codes for text rotation angle + * + * @param int $textRotation + * @return int + */ + private static function _mapTextRotation($textRotation) { + if ($textRotation >= 0) { + return $textRotation; + } + if ($textRotation == -165) { + return 255; + } + if ($textRotation < 0) { + return 90 - $textRotation; + } + } + + /** + * Map locked + * + * @param string + * @return int + */ + private static function _mapLocked($locked) { + switch ($locked) { + case PHPExcel_Style_Protection::PROTECTION_INHERIT: return 1; + case PHPExcel_Style_Protection::PROTECTION_PROTECTED: return 1; + case PHPExcel_Style_Protection::PROTECTION_UNPROTECTED: return 0; + default: return 1; + } + } + + /** + * Map hidden + * + * @param string + * @return int + */ + private static function _mapHidden($hidden) { + switch ($hidden) { + case PHPExcel_Style_Protection::PROTECTION_INHERIT: return 0; + case PHPExcel_Style_Protection::PROTECTION_PROTECTED: return 1; + case PHPExcel_Style_Protection::PROTECTION_UNPROTECTED: return 0; + default: return 0; + } + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/HTML.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/HTML.php new file mode 100644 index 000000000..f0aafafed --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/HTML.php @@ -0,0 +1,1377 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_HTML + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter { + /** + * PHPExcel object + * + * @var PHPExcel + */ + protected $_phpExcel; + + /** + * Sheet index to write + * + * @var int + */ + private $_sheetIndex = 0; + + /** + * Pre-calculate formulas + * + * @var boolean + */ + private $_preCalculateFormulas = true; + + /** + * Images root + * + * @var string + */ + private $_imagesRoot = '.'; + + /** + * Use inline CSS? + * + * @var boolean + */ + private $_useInlineCss = false; + + /** + * Array of CSS styles + * + * @var array + */ + private $_cssStyles = null; + + /** + * Array of column widths in points + * + * @var array + */ + private $_columnWidths = null; + + /** + * Default font + * + * @var PHPExcel_Style_Font + */ + private $_defaultFont; + + /** + * Flag whether spans have been calculated + * + * @var boolean + */ + private $_spansAreCalculated = false; + + /** + * Excel cells that should not be written as HTML cells + * + * @var array + */ + private $_isSpannedCell = array(); + + /** + * Excel cells that are upper-left corner in a cell merge + * + * @var array + */ + private $_isBaseCell = array(); + + /** + * Excel rows that should not be written as HTML rows + * + * @var array + */ + private $_isSpannedRow = array(); + + /** + * Is the current writer creating PDF? + * + * @var boolean + */ + protected $_isPdf = false; + + /** + * Generate the Navigation block + * + * @var boolean + */ + private $_generateSheetNavigationBlock = true; + + /** + * Create a new PHPExcel_Writer_HTML + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + $this->_phpExcel = $phpExcel; + $this->_defaultFont = $this->_phpExcel->getDefaultStyle()->getFont(); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws Exception + */ + public function save($pFilename = null) { + // garbage collect + $this->_phpExcel->garbageCollect(); + + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Build CSS + $this->buildCSS(!$this->_useInlineCss); + + // Open file + $fileHandle = fopen($pFilename, 'wb+'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for writing."); + } + + // Write headers + fwrite($fileHandle, $this->generateHTMLHeader(!$this->_useInlineCss)); + + // Write navigation (tabs) + if ((!$this->_isPdf) && ($this->_generateSheetNavigationBlock)) { + fwrite($fileHandle, $this->generateNavigation()); + } + + // Write data + fwrite($fileHandle, $this->generateSheetData()); + + // Write footer + fwrite($fileHandle, $this->generateHTMLFooter()); + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; + } + + /** + * Map VAlign + * + * @param string $vAlign Vertical alignment + * @return string + */ + private function _mapVAlign($vAlign) { + switch ($vAlign) { + case PHPExcel_Style_Alignment::VERTICAL_BOTTOM: return 'bottom'; + case PHPExcel_Style_Alignment::VERTICAL_TOP: return 'top'; + case PHPExcel_Style_Alignment::VERTICAL_CENTER: + case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY: return 'middle'; + default: return 'baseline'; + } + } + + /** + * Map HAlign + * + * @param string $hAlign Horizontal alignment + * @return string|false + */ + private function _mapHAlign($hAlign) { + switch ($hAlign) { + case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL: return false; + case PHPExcel_Style_Alignment::HORIZONTAL_LEFT: return 'left'; + case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT: return 'right'; + case PHPExcel_Style_Alignment::HORIZONTAL_CENTER: + case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS: return 'center'; + case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY: return 'justify'; + default: return false; + } + } + + /** + * Map border style + * + * @param int $borderStyle Sheet index + * @return string + */ + private function _mapBorderStyle($borderStyle) { + switch ($borderStyle) { + case PHPExcel_Style_Border::BORDER_NONE: return 'none'; + case PHPExcel_Style_Border::BORDER_DASHDOT: return '1px dashed'; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: return '1px dotted'; + case PHPExcel_Style_Border::BORDER_DASHED: return '1px dashed'; + case PHPExcel_Style_Border::BORDER_DOTTED: return '1px dotted'; + case PHPExcel_Style_Border::BORDER_DOUBLE: return '3px double'; + case PHPExcel_Style_Border::BORDER_HAIR: return '1px solid'; + case PHPExcel_Style_Border::BORDER_MEDIUM: return '2px solid'; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: return '2px dashed'; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: return '2px dotted'; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: return '2px dashed'; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: return '2px dashed'; + case PHPExcel_Style_Border::BORDER_THICK: return '3px solid'; + case PHPExcel_Style_Border::BORDER_THIN: return '1px solid'; + default: return '1px solid'; // map others to thin + } + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() { + return $this->_sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Writer_HTML + */ + public function setSheetIndex($pValue = 0) { + $this->_sheetIndex = $pValue; + return $this; + } + + /** + * Get sheet index + * + * @return boolean + */ + public function getGenerateSheetNavigationBlock() { + return $this->_generateSheetNavigationBlock; + } + + /** + * Set sheet index + * + * @param boolean $pValue Flag indicating whether the sheet navigation block should be generated or not + * @return PHPExcel_Writer_HTML + */ + public function setGenerateSheetNavigationBlock($pValue = true) { + $this->_generateSheetNavigationBlock = (bool) $pValue; + return $this; + } + + /** + * Write all sheets (resets sheetIndex to NULL) + */ + public function writeAllSheets() { + $this->_sheetIndex = null; + return $this; + } + + /** + * Generate HTML header + * + * @param boolean $pIncludeStyles Include styles? + * @return string + * @throws Exception + */ + public function generateHTMLHeader($pIncludeStyles = false) { + // PHPExcel object known? + if (is_null($this->_phpExcel)) { + throw new Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Construct HTML + $properties = $this->_phpExcel->getProperties(); + $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' . PHP_EOL; + $html .= '<!-- Generated by PHPExcel - http://www.phpexcel.net -->' . PHP_EOL; + $html .= '<html>' . PHP_EOL; + $html .= ' <head>' . PHP_EOL; + $html .= ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . PHP_EOL; + if ($properties->getTitle() > '') + $html .= ' <title>' . htmlspecialchars($properties->getTitle()) . '</title>' . PHP_EOL; + + if ($properties->getCreator() > '') + $html .= ' <meta name="author" content="' . htmlspecialchars($properties->getCreator()) . '" />' . PHP_EOL; + if ($properties->getTitle() > '') + $html .= ' <meta name="title" content="' . htmlspecialchars($properties->getTitle()) . '" />' . PHP_EOL; + if ($properties->getDescription() > '') + $html .= ' <meta name="description" content="' . htmlspecialchars($properties->getDescription()) . '" />' . PHP_EOL; + if ($properties->getSubject() > '') + $html .= ' <meta name="subject" content="' . htmlspecialchars($properties->getSubject()) . '" />' . PHP_EOL; + if ($properties->getKeywords() > '') + $html .= ' <meta name="keywords" content="' . htmlspecialchars($properties->getKeywords()) . '" />' . PHP_EOL; + if ($properties->getCategory() > '') + $html .= ' <meta name="category" content="' . htmlspecialchars($properties->getCategory()) . '" />' . PHP_EOL; + if ($properties->getCompany() > '') + $html .= ' <meta name="company" content="' . htmlspecialchars($properties->getCompany()) . '" />' . PHP_EOL; + if ($properties->getManager() > '') + $html .= ' <meta name="manager" content="' . htmlspecialchars($properties->getManager()) . '" />' . PHP_EOL; + + if ($pIncludeStyles) { + $html .= $this->generateStyles(true); + } + + $html .= ' </head>' . PHP_EOL; + $html .= '' . PHP_EOL; + $html .= ' <body>' . PHP_EOL; + + // Return + return $html; + } + + /** + * Generate sheet data + * + * @return string + * @throws Exception + */ + public function generateSheetData() { + // PHPExcel object known? + if (is_null($this->_phpExcel)) { + throw new Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Ensure that Spans have been calculated? + if (!$this->_spansAreCalculated) { + $this->_calculateSpans(); + } + + // Fetch sheets + $sheets = array(); + if (is_null($this->_sheetIndex)) { + $sheets = $this->_phpExcel->getAllSheets(); + } else { + $sheets[] = $this->_phpExcel->getSheet($this->_sheetIndex); + } + + // Construct HTML + $html = ''; + + // Loop all sheets + $sheetId = 0; + foreach ($sheets as $sheet) { + // Write table header + $html .= $this->_generateTableHeader($sheet); + + // Get worksheet dimension + $dimension = explode(':', $sheet->calculateWorksheetDimension()); + $dimension[0] = PHPExcel_Cell::coordinateFromString($dimension[0]); + $dimension[0][0] = PHPExcel_Cell::columnIndexFromString($dimension[0][0]) - 1; + $dimension[1] = PHPExcel_Cell::coordinateFromString($dimension[1]); + $dimension[1][0] = PHPExcel_Cell::columnIndexFromString($dimension[1][0]) - 1; + + // row min,max + $rowMin = $dimension[0][1]; + $rowMax = $dimension[1][1]; + + // calculate start of <tbody>, <thead> + $tbodyStart = $rowMin; + $tbodyEnd = $rowMax; + $theadStart = $theadEnd = 0; // default: no <thead> no </thead> + if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) { + $rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop(); + + // we can only support repeating rows that start at top row + if ($rowsToRepeatAtTop[0] == 1) { + $theadStart = $rowsToRepeatAtTop[0]; + $theadEnd = $rowsToRepeatAtTop[1]; + $tbodyStart = $rowsToRepeatAtTop[1] + 1; + } + } + + // Loop through cells + $row = $rowMin-1; + while($row++ < $rowMax) { + // <thead> ? + if ($row == $theadStart) { + $html .= ' <thead>' . PHP_EOL; + } + + // <tbody> ? + if ($row == $tbodyStart) { + $html .= ' <tbody>' . PHP_EOL; + } + + // Write row if there are HTML table cells in it + if ( !isset($this->_isSpannedRow[$sheet->getParent()->getIndex($sheet)][$row]) ) { + // Start a new rowData + $rowData = array(); + // Loop through columns + $column = $dimension[0][0] - 1; + while($column++ < $dimension[1][0]) { + // Cell exists? + if ($sheet->cellExistsByColumnAndRow($column, $row)) { + $rowData[$column] = $sheet->getCellByColumnAndRow($column, $row); + } else { + $rowData[$column] = ''; + } + } + $html .= $this->_generateRow($sheet, $rowData, $row - 1); + } + + // </thead> ? + if ($row == $theadEnd) { + $html .= ' </thead>' . PHP_EOL; + } + + // </tbody> ? + if ($row == $tbodyEnd) { + $html .= ' </tbody>' . PHP_EOL; + } + } + + // Write table footer + $html .= $this->_generateTableFooter(); + + // Writing PDF? + if ($this->_isPdf) { + if (is_null($this->_sheetIndex) && $sheetId + 1 < $this->_phpExcel->getSheetCount()) { + $html .= '<div style="page-break-before:always" />'; + } + } + + // Next sheet + ++$sheetId; + } + + // Return + return $html; + } + + /** + * Generate sheet tabs + * + * @return string + * @throws Exception + */ + public function generateNavigation() + { + // PHPExcel object known? + if (is_null($this->_phpExcel)) { + throw new Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Fetch sheets + $sheets = array(); + if (is_null($this->_sheetIndex)) { + $sheets = $this->_phpExcel->getAllSheets(); + } else { + $sheets[] = $this->_phpExcel->getSheet($this->_sheetIndex); + } + + // Construct HTML + $html = ''; + + // Only if there are more than 1 sheets + if (count($sheets) > 1) { + // Loop all sheets + $sheetId = 0; + + $html .= '<ul class="navigation">' . PHP_EOL; + + foreach ($sheets as $sheet) { + $html .= ' <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . $sheet->getTitle() . '</a></li>' . PHP_EOL; + ++$sheetId; + } + + $html .= '</ul>' . PHP_EOL; + } + + return $html; + } + + /** + * Generate image tag in cell + * + * @param PHPExcel_Worksheet $pSheet PHPExcel_Worksheet + * @param string $coordinates Cell coordinates + * @return string + * @throws Exception + */ + private function _writeImageTagInCell(PHPExcel_Worksheet $pSheet, $coordinates) { + // Construct HTML + $html = ''; + + // Write images + foreach ($pSheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + if ($drawing->getCoordinates() == $coordinates) { + $filename = $drawing->getPath(); + + // Strip off eventual '.' + if (substr($filename, 0, 1) == '.') { + $filename = substr($filename, 1); + } + + // Prepend images root + $filename = $this->getImagesRoot() . $filename; + + // Strip off eventual '.' + if (substr($filename, 0, 1) == '.' && substr($filename, 0, 2) != './') { + $filename = substr($filename, 1); + } + + // Convert UTF8 data to PCDATA + $filename = htmlspecialchars($filename); + + $html .= PHP_EOL; + $html .= ' <img style="position: relative; left: ' . $drawing->getOffsetX() . 'px; top: ' . $drawing->getOffsetY() . 'px; width: ' . $drawing->getWidth() . 'px; height: ' . $drawing->getHeight() . 'px;" src="' . $filename . '" border="0" width="' . $drawing->getWidth() . '" height="' . $drawing->getHeight() . '" />' . PHP_EOL; + } + } + } + + // Return + return $html; + } + + /** + * Generate CSS styles + * + * @param boolean $generateSurroundingHTML Generate surrounding HTML tags? (<style> and </style>) + * @return string + * @throws Exception + */ + public function generateStyles($generateSurroundingHTML = true) { + // PHPExcel object known? + if (is_null($this->_phpExcel)) { + throw new Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Build CSS + $css = $this->buildCSS($generateSurroundingHTML); + + // Construct HTML + $html = ''; + + // Start styles + if ($generateSurroundingHTML) { + $html .= ' <style type="text/css">' . PHP_EOL; + $html .= ' html { ' . $this->_assembleCSS($css['html']) . ' }' . PHP_EOL; + } + + // Write all other styles + foreach ($css as $styleName => $styleDefinition) { + if ($styleName != 'html') { + $html .= ' ' . $styleName . ' { ' . $this->_assembleCSS($styleDefinition) . ' }' . PHP_EOL; + } + } + + // End styles + if ($generateSurroundingHTML) { + $html .= ' </style>' . PHP_EOL; + } + + // Return + return $html; + } + + /** + * Build CSS styles + * + * @param boolean $generateSurroundingHTML Generate surrounding HTML style? (html { }) + * @return array + * @throws Exception + */ + public function buildCSS($generateSurroundingHTML = true) { + // PHPExcel object known? + if (is_null($this->_phpExcel)) { + throw new Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Cached? + if (!is_null($this->_cssStyles)) { + return $this->_cssStyles; + } + + // Ensure that spans have been calculated + if (!$this->_spansAreCalculated) { + $this->_calculateSpans(); + } + + // Construct CSS + $css = array(); + + // Start styles + if ($generateSurroundingHTML) { + // html { } + $css['html']['font-family'] = 'Calibri, Arial, Helvetica, sans-serif'; + $css['html']['font-size'] = '11pt'; + $css['html']['background-color'] = 'white'; + } + + + // table { } + $css['table']['border-collapse'] = 'collapse'; + if (!$this->_isPdf) { + $css['table']['page-break-after'] = 'always'; + } + + // .gridlines td { } + $css['.gridlines td']['border'] = '1px dotted black'; + + // .b {} + $css['.b']['text-align'] = 'center'; // BOOL + + // .e {} + $css['.e']['text-align'] = 'center'; // ERROR + + // .f {} + $css['.f']['text-align'] = 'right'; // FORMULA + + // .inlineStr {} + $css['.inlineStr']['text-align'] = 'left'; // INLINE + + // .n {} + $css['.n']['text-align'] = 'right'; // NUMERIC + + // .s {} + $css['.s']['text-align'] = 'left'; // STRING + + // Calculate cell style hashes + foreach ($this->_phpExcel->getCellXfCollection() as $index => $style) { + $css['td.style' . $index] = $this->_createCSSStyle( $style ); + } + + // Fetch sheets + $sheets = array(); + if (is_null($this->_sheetIndex)) { + $sheets = $this->_phpExcel->getAllSheets(); + } else { + $sheets[] = $this->_phpExcel->getSheet($this->_sheetIndex); + } + + // Build styles per sheet + foreach ($sheets as $sheet) { + // Calculate hash code + $sheetIndex = $sheet->getParent()->getIndex($sheet); + + // Build styles + // Calculate column widths + $sheet->calculateColumnWidths(); + + // col elements, initialize + $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) - 1; + $column = -1; + while($column++ < $highestColumnIndex) { + $this->_columnWidths[$sheetIndex][$column] = 42; // approximation + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = '42pt'; + } + + // col elements, loop through columnDimensions and set width + foreach ($sheet->getColumnDimensions() as $columnDimension) { + if (($width = PHPExcel_Shared_Drawing::cellDimensionToPixels($columnDimension->getWidth(), $this->_defaultFont)) >= 0) { + $width = PHPExcel_Shared_Drawing::pixelsToPoints($width); + $column = PHPExcel_Cell::columnIndexFromString($columnDimension->getColumnIndex()) - 1; + $this->_columnWidths[$sheetIndex][$column] = $width; + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = $width . 'pt'; + + if ($columnDimension->getVisible() === false) { + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['visibility'] = 'collapse'; + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['*display'] = 'none'; // target IE6+7 + } + } + } + + // Default row height + $rowDimension = $sheet->getDefaultRowDimension(); + + // table.sheetN tr { } + $css['table.sheet' . $sheetIndex . ' tr'] = array(); + + if ($rowDimension->getRowHeight() == -1) { + $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->_phpExcel->getDefaultStyle()->getFont()); + } else { + $pt_height = $rowDimension->getRowHeight(); + } + $css['table.sheet' . $sheetIndex . ' tr']['height'] = $pt_height . 'pt'; + if ($rowDimension->getVisible() === false) { + $css['table.sheet' . $sheetIndex . ' tr']['display'] = 'none'; + $css['table.sheet' . $sheetIndex . ' tr']['visibility'] = 'hidden'; + } + + // Calculate row heights + foreach ($sheet->getRowDimensions() as $rowDimension) { + $row = $rowDimension->getRowIndex() - 1; + + // table.sheetN tr.rowYYYYYY { } + $css['table.sheet' . $sheetIndex . ' tr.row' . $row] = array(); + + if ($rowDimension->getRowHeight() == -1) { + $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->_phpExcel->getDefaultStyle()->getFont()); + } else { + $pt_height = $rowDimension->getRowHeight(); + } + $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['height'] = $pt_height . 'pt'; + if ($rowDimension->getVisible() === false) { + $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['display'] = 'none'; + $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['visibility'] = 'hidden'; + } + } + } + + // Cache + if (is_null($this->_cssStyles)) { + $this->_cssStyles = $css; + } + + // Return + return $css; + } + + /** + * Create CSS style + * + * @param PHPExcel_Style $pStyle PHPExcel_Style + * @return array + */ + private function _createCSSStyle(PHPExcel_Style $pStyle) { + // Construct CSS + $css = ''; + + // Create CSS + $css = array_merge( + $this->_createCSSStyleAlignment($pStyle->getAlignment()) + , $this->_createCSSStyleBorders($pStyle->getBorders()) + , $this->_createCSSStyleFont($pStyle->getFont()) + , $this->_createCSSStyleFill($pStyle->getFill()) + ); + + // Return + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Alignment) + * + * @param PHPExcel_Style_Alignment $pStyle PHPExcel_Style_Alignment + * @return array + */ + private function _createCSSStyleAlignment(PHPExcel_Style_Alignment $pStyle) { + // Construct CSS + $css = array(); + + // Create CSS + $css['vertical-align'] = $this->_mapVAlign($pStyle->getVertical()); + if ($textAlign = $this->_mapHAlign($pStyle->getHorizontal())) { + $css['text-align'] = $textAlign; + if(in_array($textAlign,array('left','right'))) + $css['padding-'.$textAlign] = (string)((int)$pStyle->getIndent() * 9).'px'; + } + + // Return + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Font) + * + * @param PHPExcel_Style_Font $pStyle PHPExcel_Style_Font + * @return array + */ + private function _createCSSStyleFont(PHPExcel_Style_Font $pStyle) { + // Construct CSS + $css = array(); + + // Create CSS + if ($pStyle->getBold()) { + $css['font-weight'] = 'bold'; + } + if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE && $pStyle->getStrikethrough()) { + $css['text-decoration'] = 'underline line-through'; + } else if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE) { + $css['text-decoration'] = 'underline'; + } else if ($pStyle->getStrikethrough()) { + $css['text-decoration'] = 'line-through'; + } + if ($pStyle->getItalic()) { + $css['font-style'] = 'italic'; + } + + $css['color'] = '#' . $pStyle->getColor()->getRGB(); + $css['font-family'] = '\'' . $pStyle->getName() . '\''; + $css['font-size'] = $pStyle->getSize() . 'pt'; + + // Return + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Borders) + * + * @param PHPExcel_Style_Borders $pStyle PHPExcel_Style_Borders + * @return array + */ + private function _createCSSStyleBorders(PHPExcel_Style_Borders $pStyle) { + // Construct CSS + $css = array(); + + // Create CSS + $css['border-bottom'] = $this->_createCSSStyleBorder($pStyle->getBottom()); + $css['border-top'] = $this->_createCSSStyleBorder($pStyle->getTop()); + $css['border-left'] = $this->_createCSSStyleBorder($pStyle->getLeft()); + $css['border-right'] = $this->_createCSSStyleBorder($pStyle->getRight()); + + // Return + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Border) + * + * @param PHPExcel_Style_Border $pStyle PHPExcel_Style_Border + * @return string + */ + private function _createCSSStyleBorder(PHPExcel_Style_Border $pStyle) { + // Create CSS + $css = $this->_mapBorderStyle($pStyle->getBorderStyle()) . ' #' . $pStyle->getColor()->getRGB(); + + // Return + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Fill) + * + * @param PHPExcel_Style_Fill $pStyle PHPExcel_Style_Fill + * @return array + */ + private function _createCSSStyleFill(PHPExcel_Style_Fill $pStyle) { + // Construct HTML + $css = array(); + + // Create CSS + $value = $pStyle->getFillType() == PHPExcel_Style_Fill::FILL_NONE ? + 'white' : '#' . $pStyle->getStartColor()->getRGB(); + $css['background-color'] = $value; + + // Return + return $css; + } + + /** + * Generate HTML footer + */ + public function generateHTMLFooter() { + // Construct HTML + $html = ''; + $html .= ' </body>' . PHP_EOL; + $html .= '</html>' . PHP_EOL; + + // Return + return $html; + } + + /** + * Generate table header + * + * @param PHPExcel_Worksheet $pSheet The worksheet for the table we are writing + * @return string + * @throws Exception + */ + private function _generateTableHeader($pSheet) { + $sheetIndex = $pSheet->getParent()->getIndex($pSheet); + + // Construct HTML + $html = ''; + + if (!$this->_useInlineCss) { + $gridlines = $pSheet->getShowGridLines() ? ' gridlines' : ''; + $html .= ' <table border="0" cellpadding="0" cellspacing="0" id="sheet' . $sheetIndex . '" class="sheet' . $sheetIndex . $gridlines . '">' . PHP_EOL; + } else { + $style = isset($this->_cssStyles['table']) ? + $this->_assembleCSS($this->_cssStyles['table']) : ''; + + if ($this->_isPdf && $pSheet->getShowGridLines()) { + $html .= ' <table border="1" cellpadding="1" id="sheet' . $sheetIndex . '" cellspacing="4" style="' . $style . '">' . PHP_EOL; + } else { + $html .= ' <table border="0" cellpadding="1" id="sheet' . $sheetIndex . '" cellspacing="4" style="' . $style . '">' . PHP_EOL; + } + } + + // Write <col> elements + $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn()) - 1; + $i = -1; + while($i++ < $highestColumnIndex) { + if (!$this->_isPdf) { + if (!$this->_useInlineCss) { + $html .= ' <col class="col' . $i . '">' . PHP_EOL; + } else { + $style = isset($this->_cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) ? + $this->_assembleCSS($this->_cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) : ''; + $html .= ' <col style="' . $style . '">' . PHP_EOL; + } + } + } + + // Return + return $html; + } + + /** + * Generate table footer + * + * @throws Exception + */ + private function _generateTableFooter() { + // Construct HTML + $html = ''; + $html .= ' </table>' . PHP_EOL; + + // Return + return $html; + } + + /** + * Generate row + * + * @param PHPExcel_Worksheet $pSheet PHPExcel_Worksheet + * @param array $pValues Array containing cells in a row + * @param int $pRow Row number (0-based) + * @return string + * @throws Exception + */ + private function _generateRow(PHPExcel_Worksheet $pSheet, $pValues = null, $pRow = 0) { + if (is_array($pValues)) { + // Construct HTML + $html = ''; + + // Sheet index + $sheetIndex = $pSheet->getParent()->getIndex($pSheet); + + // DomPDF and breaks + if ($this->_isPdf && count($pSheet->getBreaks()) > 0) { + $breaks = $pSheet->getBreaks(); + + // check if a break is needed before this row + if (isset($breaks['A' . $pRow])) { + // close table: </table> + $html .= $this->_generateTableFooter(); + + // insert page break + $html .= '<div style="page-break-before:always" />'; + + // open table again: <table> + <col> etc. + $html .= $this->_generateTableHeader($pSheet); + } + } + + // Write row start + if (!$this->_useInlineCss) { + $html .= ' <tr class="row' . $pRow . '">' . PHP_EOL; + } else { + $style = isset($this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) + ? $this->_assembleCSS($this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) : ''; + + $html .= ' <tr style="' . $style . '">' . PHP_EOL; + } + + // Write cells + $colNum = 0; + foreach ($pValues as $cell) { + $coordinate = PHPExcel_Cell::stringFromColumnIndex($colNum) . ($pRow + 1); + + if (!$this->_useInlineCss) { + $cssClass = ''; + $cssClass = 'column' . $colNum; + } else { + $cssClass = array(); + if (isset($this->_cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum])) { + $this->_cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum]; + } + } + $colSpan = 1; + $rowSpan = 1; + + // initialize + $cellData = ''; + + // PHPExcel_Cell + if ($cell instanceof PHPExcel_Cell) { + if (is_null($cell->getParent())) { + $cell->attach($pSheet); + } + // Value + if ($cell->getValue() instanceof PHPExcel_RichText) { + // Loop through rich text elements + $elements = $cell->getValue()->getRichTextElements(); + foreach ($elements as $element) { + // Rich text start? + if ($element instanceof PHPExcel_RichText_Run) { + $cellData .= '<span style="' . $this->_assembleCSS($this->_createCSSStyleFont($element->getFont())) . '">'; + + if ($element->getFont()->getSuperScript()) { + $cellData .= '<sup>'; + } else if ($element->getFont()->getSubScript()) { + $cellData .= '<sub>'; + } + } + + // Convert UTF8 data to PCDATA + $cellText = $element->getText(); + $cellData .= htmlspecialchars($cellText); + + if ($element instanceof PHPExcel_RichText_Run) { + if ($element->getFont()->getSuperScript()) { + $cellData .= '</sup>'; + } else if ($element->getFont()->getSubScript()) { + $cellData .= '</sub>'; + } + + $cellData .= '</span>'; + } + } + } else { + if ($this->_preCalculateFormulas) { + $cellData = PHPExcel_Style_NumberFormat::toFormattedString( + $cell->getCalculatedValue(), + $pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getNumberFormat()->getFormatCode(), + array($this, 'formatColor') + ); + } else { + $cellData = PHPExcel_Style_NumberFormat::ToFormattedString( + $cell->getValue(), + $pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getNumberFormat()->getFormatCode(), + array($this, 'formatColor') + ); + } + $cellData = htmlspecialchars($cellData); + if ($pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getFont()->getSuperScript()) { + $cellData = '<sup>'.$cellData.'</sup>'; + } elseif ($pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() )->getFont()->getSubScript()) { + $cellData = '<sub>'.$cellData.'</sub>'; + } + } + + // Converts the cell content so that spaces occuring at beginning of each new line are replaced by &nbsp; + // Example: " Hello\n to the world" is converted to "&nbsp;&nbsp;Hello\n&nbsp;to the world" + $cellData = preg_replace("/(?m)(?:^|\\G) /", '&nbsp;', $cellData); + + // convert newline "\n" to '<br>' + $cellData = nl2br($cellData); + + // Extend CSS class? + if (!$this->_useInlineCss) { + $cssClass .= ' style' . $cell->getXfIndex(); + $cssClass .= ' ' . $cell->getDataType(); + } else { + if (isset($this->_cssStyles['td.style' . $cell->getXfIndex()])) { + $cssClass = array_merge($cssClass, $this->_cssStyles['td.style' . $cell->getXfIndex()]); + } + + // General horizontal alignment: Actual horizontal alignment depends on dataType + $sharedStyle = $pSheet->getParent()->getCellXfByIndex( $cell->getXfIndex() ); + if ($sharedStyle->getAlignment()->getHorizontal() == PHPExcel_Style_Alignment::HORIZONTAL_GENERAL + && isset($this->_cssStyles['.' . $cell->getDataType()]['text-align'])) + { + $cssClass['text-align'] = $this->_cssStyles['.' . $cell->getDataType()]['text-align']; + } + } + } + + // Hyperlink? + if ($pSheet->hyperlinkExists($coordinate) && !$pSheet->getHyperlink($coordinate)->isInternal()) { + $cellData = '<a href="' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getUrl()) . '" title="' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getTooltip()) . '">' . $cellData . '</a>'; + } + + // Should the cell be written or is it swallowed by a rowspan or colspan? + $writeCell = ! ( isset($this->_isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]) + && $this->_isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum] ); + + // Colspan and Rowspan + $colspan = 1; + $rowspan = 1; + if (isset($this->_isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])) { + $spans = $this->_isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]; + $rowSpan = $spans['rowspan']; + $colSpan = $spans['colspan']; + } + + // Write + if ($writeCell) { + // Column start + $html .= ' <td'; + if (!$this->_useInlineCss) { + $html .= ' class="' . $cssClass . '"'; + } else { + //** Necessary redundant code for the sake of PHPExcel_Writer_PDF ** + // We must explicitly write the width of the <td> element because TCPDF + // does not recognize e.g. <col style="width:42pt"> + $width = 0; + $i = $colNum - 1; + $e = $colNum + $colSpan - 1; + while($i++ < $e) { + if (isset($this->_columnWidths[$sheetIndex][$i])) { + $width += $this->_columnWidths[$sheetIndex][$i]; + } + } + $cssClass['width'] = $width . 'pt'; + + // We must also explicitly write the height of the <td> element because TCPDF + // does not recognize e.g. <tr style="height:50pt"> + if (isset($this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'])) { + $height = $this->_cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height']; + $cssClass['height'] = $height; + } + //** end of redundant code ** + + $html .= ' style="' . $this->_assembleCSS($cssClass) . '"'; + } + if ($colSpan > 1) { + $html .= ' colspan="' . $colSpan . '"'; + } + if ($rowSpan > 1) { + $html .= ' rowspan="' . $rowSpan . '"'; + } + $html .= '>'; + + // Image? + $html .= $this->_writeImageTagInCell($pSheet, $coordinate); + + // Cell data + $html .= $cellData; + + // Column end + $html .= '</td>' . PHP_EOL; + } + + // Next column + ++$colNum; + } + + // Write row end + $html .= ' </tr>' . PHP_EOL; + + // Return + return $html; + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Takes array where of CSS properties / values and converts to CSS string + * + * @param array + * @return string + */ + private function _assembleCSS($pValue = array()) + { + $pairs = array(); + foreach ($pValue as $property => $value) { + $pairs[] = $property . ':' . $value; + } + $string = implode('; ', $pairs); + + return $string; + } + + /** + * Get Pre-Calculate Formulas + * + * @return boolean + */ + public function getPreCalculateFormulas() { + return $this->_preCalculateFormulas; + } + + /** + * Set Pre-Calculate Formulas + * + * @param boolean $pValue Pre-Calculate Formulas? + * @return PHPExcel_Writer_HTML + */ + public function setPreCalculateFormulas($pValue = true) { + $this->_preCalculateFormulas = $pValue; + return $this; + } + + /** + * Get images root + * + * @return string + */ + public function getImagesRoot() { + return $this->_imagesRoot; + } + + /** + * Set images root + * + * @param string $pValue + * @return PHPExcel_Writer_HTML + */ + public function setImagesRoot($pValue = '.') { + $this->_imagesRoot = $pValue; + return $this; + } + + /** + * Get use inline CSS? + * + * @return boolean + */ + public function getUseInlineCss() { + return $this->_useInlineCss; + } + + /** + * Set use inline CSS? + * + * @param boolean $pValue + * @return PHPExcel_Writer_HTML + */ + public function setUseInlineCss($pValue = false) { + $this->_useInlineCss = $pValue; + return $this; + } + + /** + * Add color to formatted string as inline style + * + * @param string $pValue Plain formatted value without color + * @param string $pFormat Format code + * @return string + */ + public function formatColor($pValue, $pFormat) + { + // Color information, e.g. [Red] is always at the beginning + $color = null; // initialize + $matches = array(); + + $color_regex = '/^\\[[a-zA-Z]+\\]/'; + if (preg_match($color_regex, $pFormat, $matches)) { + $color = str_replace('[', '', $matches[0]); + $color = str_replace(']', '', $color); + $color = strtolower($color); + } + + // convert to PCDATA + $value = htmlspecialchars($pValue); + + // color span tag + if ($color !== null) { + $value = '<span style="color:' . $color . '">' . $value . '</span>'; + } + + return $value; + } + + /** + * Calculate information about HTML colspan and rowspan which is not always the same as Excel's + */ + private function _calculateSpans() + { + // Identify all cells that should be omitted in HTML due to cell merge. + // In HTML only the upper-left cell should be written and it should have + // appropriate rowspan / colspan attribute + $sheetIndexes = $this->_sheetIndex !== null ? + array($this->_sheetIndex) : range(0, $this->_phpExcel->getSheetCount() - 1); + + foreach ($sheetIndexes as $sheetIndex) { + $sheet = $this->_phpExcel->getSheet($sheetIndex); + + $candidateSpannedRow = array(); + + // loop through all Excel merged cells + foreach ($sheet->getMergeCells() as $cells) { + list($cells, ) = PHPExcel_Cell::splitRange($cells); + $first = $cells[0]; + $last = $cells[1]; + + list($fc, $fr) = PHPExcel_Cell::coordinateFromString($first); + $fc = PHPExcel_Cell::columnIndexFromString($fc) - 1; + + list($lc, $lr) = PHPExcel_Cell::coordinateFromString($last); + $lc = PHPExcel_Cell::columnIndexFromString($lc) - 1; + + // loop through the individual cells in the individual merge + $r = $fr - 1; + while($r++ < $lr) { + // also, flag this row as a HTML row that is candidate to be omitted + $candidateSpannedRow[$r] = $r; + + $c = $fc - 1; + while($c++ < $lc) { + if ( !($c == $fc && $r == $fr) ) { + // not the upper-left cell (should not be written in HTML) + $this->_isSpannedCell[$sheetIndex][$r][$c] = array( + 'baseCell' => array($fr, $fc), + ); + } else { + // upper-left is the base cell that should hold the colspan/rowspan attribute + $this->_isBaseCell[$sheetIndex][$r][$c] = array( + 'xlrowspan' => $lr - $fr + 1, // Excel rowspan + 'rowspan' => $lr - $fr + 1, // HTML rowspan, value may change + 'xlcolspan' => $lc - $fc + 1, // Excel colspan + 'colspan' => $lc - $fc + 1, // HTML colspan, value may change + ); + } + } + } + } + + // Identify which rows should be omitted in HTML. These are the rows where all the cells + // participate in a merge and the where base cells are somewhere above. + $countColumns = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()); + foreach ($candidateSpannedRow as $rowIndex) { + if (isset($this->_isSpannedCell[$sheetIndex][$rowIndex])) { + if (count($this->_isSpannedCell[$sheetIndex][$rowIndex]) == $countColumns) { + $this->_isSpannedRow[$sheetIndex][$rowIndex] = $rowIndex; + }; + } + } + + // For each of the omitted rows we found above, the affected rowspans should be subtracted by 1 + if ( isset($this->_isSpannedRow[$sheetIndex]) ) { + foreach ($this->_isSpannedRow[$sheetIndex] as $rowIndex) { + $adjustedBaseCells = array(); + $c = -1; + $e = $countColumns - 1; + while($c++ < $e) { + $baseCell = $this->_isSpannedCell[$sheetIndex][$rowIndex][$c]['baseCell']; + + if ( !in_array($baseCell, $adjustedBaseCells) ) { + // subtract rowspan by 1 + --$this->_isBaseCell[$sheetIndex][ $baseCell[0] ][ $baseCell[1] ]['rowspan']; + $adjustedBaseCells[] = $baseCell; + } + } + } + } + + // TODO: Same for columns + } + + // We have calculated the spans + $this->_spansAreCalculated = true; + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/IWriter.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/IWriter.php new file mode 100644 index 000000000..af97f0778 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/IWriter.php @@ -0,0 +1,45 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_IWriter + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +interface PHPExcel_Writer_IWriter +{ + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws Exception + */ + public function save($pFilename = null); +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF.php new file mode 100644 index 000000000..7c10445d7 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF.php @@ -0,0 +1,76 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_PDF + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_PDF { + + private $_renderer = NULL; + + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + + $pdfLibraryName = PHPExcel_Settings::getPdfRendererName(); + if (is_null($pdfLibraryName)) { + throw new Exception("PDF Rendering library has not been defined."); + } + + $pdfLibraryPath = PHPExcel_Settings::getPdfRendererPath(); + if (is_null($pdfLibraryName)) { + throw new Exception("PDF Rendering library path has not been defined."); + } + $includePath = str_replace('\\','/',get_include_path()); + $rendererPath = str_replace('\\','/',$pdfLibraryPath); + if (strpos($rendererPath,$includePath) === false) { + set_include_path(get_include_path() . PATH_SEPARATOR . $pdfLibraryPath); + } + + $rendererName = 'PHPExcel_Writer_PDF_'.$pdfLibraryName; + $this->_renderer = new $rendererName($phpExcel); + } + + + public function __call($name, $arguments) + { + if ($this->_renderer === NULL) { + throw new Exception("PDF Renderer has not been defined."); + } + + return call_user_func_array(array($this->_renderer,$name),$arguments); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/Core.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/Core.php new file mode 100644 index 000000000..b9154ac6b --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/Core.php @@ -0,0 +1,239 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** + * PHPExcel_Writer_PDF_Core + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +abstract class PHPExcel_Writer_PDF_Core extends PHPExcel_Writer_HTML { + /** + * Temporary storage directory + * + * @var string + */ + private $_tempDir = ''; + + /** + * Font + * + * @var string + */ + private $_font = 'freesans'; + + /** + * Orientation (Over-ride) + * + * @var string + */ + private $_orientation = null; + + /** + * Paper size (Over-ride) + * + * @var int + */ + private $_paperSize = null; + + + /** + * Paper Sizes xRef List + * + * @var array + */ + protected static $_paperSizes = array( + // Excel Paper Size TCPDF Paper Size + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER => 'LETTER', // (8.5 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_SMALL => 'LETTER', // (8.5 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_TABLOID => array(792.00,1224.00), // (11 in. by 17 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEDGER => array(1224.00,792.00), // (17 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL => 'LEGAL', // (8.5 in. by 14 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STATEMENT => array(396.00,612.00), // (5.5 in. by 8.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_EXECUTIVE => 'EXECUTIVE', // (7.25 in. by 10.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3 => 'A3', // (297 mm by 420 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4 => 'A4', // (210 mm by 297 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_SMALL => 'A4', // (210 mm by 297 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5 => 'A5', // (148 mm by 210 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B4 => 'B4', // (250 mm by 353 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B5 => 'B5', // (176 mm by 250 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_FOLIO => 'FOLIO', // (8.5 in. by 13 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_QUARTO => array(609.45,779.53), // (215 mm by 275 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_1 => array(720.00,1008.00), // (10 in. by 14 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_2 => array(792.00,1224.00), // (11 in. by 17 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NOTE => 'LETTER', // (8.5 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO9_ENVELOPE => array(279.00,639.00), // (3.875 in. by 8.875 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO10_ENVELOPE => array(297.00,684.00), // (4.125 in. by 9.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO11_ENVELOPE => array(324.00,747.00), // (4.5 in. by 10.375 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO12_ENVELOPE => array(342.00,792.00), // (4.75 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO14_ENVELOPE => array(360.00,828.00), // (5 in. by 11.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C => array(1224.00,1584.00), // (17 in. by 22 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_D => array(1584.00,2448.00), // (22 in. by 34 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_E => array(2448.00,3168.00), // (34 in. by 44 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_DL_ENVELOPE => array(311.81,623.62), // (110 mm by 220 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C5_ENVELOPE => 'C5', // (162 mm by 229 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C3_ENVELOPE => 'C3', // (324 mm by 458 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C4_ENVELOPE => 'C4', // (229 mm by 324 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C6_ENVELOPE => 'C6', // (114 mm by 162 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C65_ENVELOPE => array(323.15,649.13), // (114 mm by 229 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B4_ENVELOPE => 'B4', // (250 mm by 353 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B5_ENVELOPE => 'B5', // (176 mm by 250 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B6_ENVELOPE => array(498.90,354.33), // (176 mm by 125 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_ITALY_ENVELOPE => array(311.81,651.97), // (110 mm by 230 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_MONARCH_ENVELOPE => array(279.00,540.00), // (3.875 in. by 7.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_6_3_4_ENVELOPE => array(261.00,468.00), // (3.625 in. by 6.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_US_STANDARD_FANFOLD => array(1071.00,792.00), // (14.875 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_GERMAN_STANDARD_FANFOLD => array(612.00,864.00), // (8.5 in. by 12 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_GERMAN_LEGAL_FANFOLD => 'FOLIO', // (8.5 in. by 13 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_ISO_B4 => 'B4', // (250 mm by 353 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_JAPANESE_DOUBLE_POSTCARD => array(566.93,419.53), // (200 mm by 148 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_1 => array(648.00,792.00), // (9 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_2 => array(720.00,792.00), // (10 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_3 => array(1080.00,792.00), // (15 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_INVITE_ENVELOPE => array(623.62,623.62), // (220 mm by 220 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_EXTRA_PAPER => array(667.80,864.00), // (9.275 in. by 12 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL_EXTRA_PAPER => array(667.80,1080.00), // (9.275 in. by 15 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_TABLOID_EXTRA_PAPER => array(841.68,1296.00), // (11.69 in. by 18 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_EXTRA_PAPER => array(668.98,912.76), // (236 mm by 322 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_TRANSVERSE_PAPER => array(595.80,792.00), // (8.275 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_TRANSVERSE_PAPER => 'A4', // (210 mm by 297 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER => array(667.80,864.00), // (9.275 in. by 12 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_SUPERA_SUPERA_A4_PAPER => array(643.46,1009.13), // (227 mm by 356 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_SUPERB_SUPERB_A3_PAPER => array(864.57,1380.47), // (305 mm by 487 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_PLUS_PAPER => array(612.00,913.68), // (8.5 in. by 12.69 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_PLUS_PAPER => array(595.28,935.43), // (210 mm by 330 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5_TRANSVERSE_PAPER => 'A5', // (148 mm by 210 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_JIS_B5_TRANSVERSE_PAPER => array(515.91,728.50), // (182 mm by 257 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_EXTRA_PAPER => array(912.76,1261.42), // (322 mm by 445 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5_EXTRA_PAPER => array(493.23,666.14), // (174 mm by 235 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_ISO_B5_EXTRA_PAPER => array(569.76,782.36), // (201 mm by 276 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER => 'A2', // (420 mm by 594 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_TRANSVERSE_PAPER => 'A3', // (297 mm by 420 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER => array(912.76,1261.42) // (322 mm by 445 mm) + ); + + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + parent::__construct($phpExcel); + $this->setUseInlineCss(true); + $this->_tempDir = PHPExcel_Shared_File::sys_get_temp_dir(); + } + + /** + * Get Font + * + * @return string + */ + public function getFont() { + return $this->_font; + } + + /** + * Set font. Examples: + * 'arialunicid0-chinese-simplified' + * 'arialunicid0-chinese-traditional' + * 'arialunicid0-korean' + * 'arialunicid0-japanese' + * + * @param string $fontName + */ + public function setFont($fontName) { + $this->_font = $fontName; + return $this; + } + + /** + * Get Paper Size + * + * @return int + */ + public function getPaperSize() { + return $this->_paperSize; + } + + /** + * Set Paper Size + * + * @param int $pValue + * @return PHPExcel_Writer_PDF + */ + public function setPaperSize($pValue = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER) { + $this->_paperSize = $pValue; + return $this; + } + + /** + * Get Orientation + * + * @return string + */ + public function getOrientation() { + return $this->_orientation; + } + + /** + * Set Orientation + * + * @param string $pValue + * @return PHPExcel_Writer_PDF + */ + public function setOrientation($pValue = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) { + $this->_orientation = $pValue; + return $this; + } + + /** + * Get temporary storage directory + * + * @return string + */ + public function getTempDir() { + return $this->_tempDir; + } + + /** + * Set temporary storage directory + * + * @param string $pValue Temporary storage directory + * @throws Exception Exception when directory does not exist + * @return PHPExcel_Writer_PDF + */ + public function setTempDir($pValue = '') { + if (is_dir($pValue)) { + $this->_tempDir = $pValue; + } else { + throw new Exception("Directory does not exist: $pValue"); + } + return $this; + } +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/DomPDF.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/DomPDF.php new file mode 100644 index 000000000..a8ab4efd9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/DomPDF.php @@ -0,0 +1,128 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** Require DomPDF library */ +$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/dompdf_config.inc.php'; +if (file_exists($pdfRendererClassFile)) { + require_once $pdfRendererClassFile; +} else { + throw new Exception('Unable to load PDF Rendering library'); +} + +/** + * PHPExcel_Writer_PDF_DomPDF + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_PDF_DomPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter { + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + parent::__construct($phpExcel); + } + + /** + * Save PHPExcel to file + * + * @param string $pFileName + * @throws Exception + */ + public function save($pFilename = null) { + // garbage collect + $this->_phpExcel->garbageCollect(); + + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'w'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for writing."); + } + + // Set PDF + $this->_isPdf = true; + // Build CSS + $this->buildCSS(true); + + // Default PDF paper size + $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) + + // Check for paper size and page orientation + if (is_null($this->getSheetIndex())) { + $orientation = ($this->_phpExcel->getSheet(0)->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->_phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); + $printMargins = $this->_phpExcel->getSheet(0)->getPageMargins(); + } else { + $orientation = ($this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); + $printMargins = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); + } + + // Override Page Orientation + if (!is_null($this->getOrientation())) { + $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) ? + PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT : $this->getOrientation(); + } + // Override Paper Size + if (!is_null($this->getPaperSize())) { + $printPaperSize = $this->getPaperSize(); + } + + if (isset(self::$_paperSizes[$printPaperSize])) { + $paperSize = self::$_paperSizes[$printPaperSize]; + } + + $orientation = ($orientation == 'L') ? 'landscape' : 'portrait'; + + // Create PDF + $pdf = new DOMPDF(); + $pdf->set_paper(strtolower($paperSize), $orientation); + + $pdf->load_html( + $this->generateHTMLHeader(false) . + $this->generateSheetData() . + $this->generateHTMLFooter() + ); + $pdf->render(); + + // Write to file + fwrite($fileHandle, $pdf->output()); + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/mPDF.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/mPDF.php new file mode 100644 index 000000000..5f9f2a350 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/mPDF.php @@ -0,0 +1,135 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** Require mPDF library */ +$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/mpdf.php'; +if (file_exists($pdfRendererClassFile)) { + require_once $pdfRendererClassFile; +} else { + throw new Exception('Unable to load PDF Rendering library'); +} + +/** + * PHPExcel_Writer_PDF_mPDF + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_PDF_mPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter { + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + parent::__construct($phpExcel); + } + + /** + * Save PHPExcel to file + * + * @param string $pFileName + * @throws Exception + */ + public function save($pFilename = null) { + // garbage collect + $this->_phpExcel->garbageCollect(); + + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'w'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for writing."); + } + + // Set PDF + $this->_isPdf = true; + // Build CSS + $this->buildCSS(true); + + // Default PDF paper size + $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) + + // Check for paper size and page orientation + if (is_null($this->getSheetIndex())) { + $orientation = ($this->_phpExcel->getSheet(0)->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->_phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); + $printMargins = $this->_phpExcel->getSheet(0)->getPageMargins(); + } else { + $orientation = ($this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); + $printMargins = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); + } + $this->setOrientation($orientation); + + // Override Page Orientation + if (!is_null($this->getOrientation())) { + $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) ? + PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT : $this->getOrientation(); + } + $orientation = strtoupper($orientation); + + // Override Paper Size + if (!is_null($this->getPaperSize())) { + $printPaperSize = $this->getPaperSize(); + } + + if (isset(self::$_paperSizes[$printPaperSize])) { + $paperSize = self::$_paperSizes[$printPaperSize]; + } + + // Create PDF + $pdf = new mpdf(); + $pdf->_setPageSize(strtoupper($paperSize), $orientation); + $pdf->DefOrientation = $orientation; + // Document info + $pdf->SetTitle($this->_phpExcel->getProperties()->getTitle()); + $pdf->SetAuthor($this->_phpExcel->getProperties()->getCreator()); + $pdf->SetSubject($this->_phpExcel->getProperties()->getSubject()); + $pdf->SetKeywords($this->_phpExcel->getProperties()->getKeywords()); + $pdf->SetCreator($this->_phpExcel->getProperties()->getCreator()); + + $pdf->WriteHTML( + $this->generateHTMLHeader(false) . + $this->generateSheetData() . + $this->generateHTMLFooter() + ); + + // Write to file + fwrite($fileHandle, $pdf->Output('','S')); + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/tcPDF.php b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/tcPDF.php new file mode 100644 index 000000000..d77ab91a9 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/Writer/PDF/tcPDF.php @@ -0,0 +1,147 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2012 PHPExcel + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version 1.7.8, 2012-10-12 + */ + + +/** Require tcPDF library */ +$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/tcpdf.php'; +if (file_exists($pdfRendererClassFile)) { + $k_path_url = PHPExcel_Settings::getPdfRendererPath(); + require_once $pdfRendererClassFile; +} else { + throw new Exception('Unable to load PDF Rendering library'); +} + +/** + * PHPExcel_Writer_PDF_tcPDF + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_PDF_tcPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter { + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) { + parent::__construct($phpExcel); + } + + /** + * Save PHPExcel to file + * + * @param string $pFileName + * @throws Exception + */ + public function save($pFilename = null) { + // garbage collect + $this->_phpExcel->garbageCollect(); + + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'w'); + if ($fileHandle === false) { + throw new Exception("Could not open file $pFilename for writing."); + } + + // Set PDF + $this->_isPdf = true; + // Build CSS + $this->buildCSS(true); + + // Default PDF paper size + $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) + + // Check for paper size and page orientation + if (is_null($this->getSheetIndex())) { + $orientation = ($this->_phpExcel->getSheet(0)->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->_phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); + $printMargins = $this->_phpExcel->getSheet(0)->getPageMargins(); + } else { + $orientation = ($this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); + $printMargins = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); + } + + // Override Page Orientation + if (!is_null($this->getOrientation())) { + $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? + 'L' : 'P'; + } + // Override Paper Size + if (!is_null($this->getPaperSize())) { + $printPaperSize = $this->getPaperSize(); + } + + + if (isset(self::$_paperSizes[$printPaperSize])) { + $paperSize = self::$_paperSizes[$printPaperSize]; + } + + + // Create PDF + $pdf = new TCPDF($orientation, 'pt', $paperSize); + $pdf->setFontSubsetting(false); + // Set margins, converting inches to points (using 72 dpi) + $pdf->SetMargins($printMargins->getLeft() * 72,$printMargins->getTop() * 72,$printMargins->getRight() * 72); + $pdf->SetAutoPageBreak(true,$printMargins->getBottom() * 72); +// $pdf->setHeaderMargin($printMargins->getHeader() * 72); +// $pdf->setFooterMargin($printMargins->getFooter() * 72); + + $pdf->setPrintHeader(false); + $pdf->setPrintFooter(false); + + $pdf->AddPage(); + + // Set the appropriate font + $pdf->SetFont($this->getFont()); + $pdf->writeHTML( + $this->generateHTMLHeader(false) . + $this->generateSheetData() . + $this->generateHTMLFooter() + ); + + // Document info + $pdf->SetTitle($this->_phpExcel->getProperties()->getTitle()); + $pdf->SetAuthor($this->_phpExcel->getProperties()->getCreator()); + $pdf->SetSubject($this->_phpExcel->getProperties()->getSubject()); + $pdf->SetKeywords($this->_phpExcel->getProperties()->getKeywords()); + $pdf->SetCreator($this->_phpExcel->getProperties()->getCreator()); + + // Write to file + fwrite($fileHandle, $pdf->output($pFilename, 'S')); + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + } + +} diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/cs/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/cs/config new file mode 100644 index 000000000..38a44128e --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/cs/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = KÄ + + +## +## Excel Error Codes (For future use) +## +NULL = #NULL! +DIV0 = #DIV/0! +VALUE = #HODNOTA! +REF = #REF! +NAME = #NÃZEV? +NUM = #NUM! +NA = #N/A diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/cs/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/cs/functions new file mode 100644 index 000000000..992dc3753 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/cs/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funkce doplňků a automatizace +## +GETPIVOTDATA = ZÃSKATKONTDATA ## Vrátí data uložená v kontingenÄní tabulce. Pomocí funkce ZÃSKATKONTDATA můžete naÄíst souhrnná data z kontingenÄní tabulky, pokud jsou tato data v kontingenÄní sestavÄ› zobrazena. + + +## +## Cube functions Funkce pro práci s krychlemi +## +CUBEKPIMEMBER = CUBEKPIMEMBER ## Vrátí název, vlastnost a velikost klíÄového ukazatele výkonu (KUV) a zobrazí v buňce název a vlastnost. KlíÄový ukazatel výkonu je kvantifikovatelná veliÄina, například hrubý mÄ›síÄní zisk nebo Ätvrtletní obrat na zamÄ›stnance, která se používá pro sledování výkonnosti organizace. +CUBEMEMBER = CUBEMEMBER ## Vrátí Älen nebo n-tici v hierarchii krychle. Slouží k ověření, zda v krychli existuje Älen nebo n-tice. +CUBEMEMBERPROPERTY = CUBEMEMBERPROPERTY ## Vrátí hodnotu vlastnosti Älena v krychli. Slouží k ověření, zda v krychli existuje Älen s daným názvem, a k vrácení konkrétní vlastnosti tohoto Älena. +CUBERANKEDMEMBER = CUBERANKEDMEMBER ## Vrátí n-tý nebo poÅ™adový Älen sady. Použijte ji pro vrácení jednoho nebo více prvků sady, například obchodníka s nejvyšším obratem nebo deseti nejlepších studentů. +CUBESET = CUBESET ## Definuje vypoÄtenou sadu Älenů nebo n-tic odesláním výrazu sady do krychle na serveru, který vytvoří sadu a potom ji vrátí do aplikace Microsoft Office Excel. +CUBESETCOUNT = CUBESETCOUNT ## Vrátí poÄet položek v množinÄ› +CUBEVALUE = CUBEVALUE ## Vrátí úhrnnou hodnotu z krychle. + + +## +## Database functions Funkce databáze +## +DAVERAGE = DPRÅ®MÄšR ## Vrátí průmÄ›r vybraných položek databáze. +DCOUNT = DPOÄŒET ## SpoÄítá buňky databáze obsahující Äísla. +DCOUNTA = DPOÄŒET2 ## SpoÄítá buňky databáze, které nejsou prázdné. +DGET = DZÃSKAT ## Extrahuje z databáze jeden záznam splňující zadaná kritéria. +DMAX = DMAX ## Vrátí maximální hodnotu z vybraných položek databáze. +DMIN = DMIN ## Vrátí minimální hodnotu z vybraných položek databáze. +DPRODUCT = DSOUÄŒIN ## Vynásobí hodnoty urÄitého pole záznamů v databázi, které splňují daná kritéria. +DSTDEV = DSMODCH.VÃBÄšR ## Odhadne smÄ›rodatnou odchylku výbÄ›ru vybraných položek databáze. +DSTDEVP = DSMODCH ## VypoÄte smÄ›rodatnou odchylku základního souboru vybraných položek databáze. +DSUM = DSUMA ## SeÄte Äísla ve sloupcovém poli záznamů databáze, která splňují daná kritéria. +DVAR = DVAR.VÃBÄšR ## Odhadne rozptyl výbÄ›ru vybraných položek databáze. +DVARP = DVAR ## VypoÄte rozptyl základního souboru vybraných položek databáze. + + +## +## Date and time functions Funkce data a Äasu +## +DATE = DATUM ## Vrátí poÅ™adové Äíslo urÄitého data. +DATEVALUE = DATUMHODN ## PÅ™evede datum ve formÄ› textu na poÅ™adové Äíslo. +DAY = DEN ## PÅ™evede poÅ™adové Äíslo na den v mÄ›síci. +DAYS360 = ROK360 ## Vrátí poÄet dní mezi dvÄ›ma daty na základÄ› roku s 360 dny. +EDATE = EDATE ## Vrátí poÅ™adové Äíslo data, které oznaÄuje urÄený poÄet mÄ›síců pÅ™ed nebo po poÄáteÄním datu. +EOMONTH = EOMONTH ## Vrátí poÅ™adové Äíslo posledního dne mÄ›síce pÅ™ed nebo po zadaném poÄtu mÄ›síců. +HOUR = HODINA ## PÅ™evede poÅ™adové Äíslo na hodinu. +MINUTE = MINUTA ## PÅ™evede poÅ™adové Äíslo na minutu. +MONTH = MÄšSÃC ## PÅ™evede poÅ™adové Äíslo na mÄ›síc. +NETWORKDAYS = NETWORKDAYS ## Vrátí poÄet celých pracovních dní mezi dvÄ›ma daty. +NOW = NYNà ## Vrátí poÅ™adové Äíslo aktuálního data a Äasu. +SECOND = SEKUNDA ## PÅ™evede poÅ™adové Äíslo na sekundu. +TIME = ÄŒAS ## Vrátí poÅ™adové Äíslo urÄitého Äasu. +TIMEVALUE = ÄŒASHODN ## PÅ™evede Äas ve formÄ› textu na poÅ™adové Äíslo. +TODAY = DNES ## Vrátí poÅ™adové Äíslo dneÅ¡ního data. +WEEKDAY = DENTÃDNE ## PÅ™evede poÅ™adové Äíslo na den v týdnu. +WEEKNUM = WEEKNUM ## PÅ™evede poÅ™adové Äíslo na Äíslo pÅ™edstavující Äíselnou pozici týdne v roce. +WORKDAY = WORKDAY ## Vrátí poÅ™adové Äíslo data pÅ™ed nebo po zadaném poÄtu pracovních dní. +YEAR = ROK ## PÅ™evede poÅ™adové Äíslo na rok. +YEARFRAC = YEARFRAC ## Vrátí Äást roku vyjádÅ™enou zlomkem a pÅ™edstavující poÄet celých dní mezi poÄáteÄním a koncovým datem. + + +## +## Engineering functions Inženýrské funkce (Technické funkce) +## +BESSELI = BESSELI ## Vrátí modifikovanou Besselovu funkci In(x). +BESSELJ = BESSELJ ## Vrátí modifikovanou Besselovu funkci Jn(x). +BESSELK = BESSELK ## Vrátí modifikovanou Besselovu funkci Kn(x). +BESSELY = BESSELY ## Vrátí Besselovu funkci Yn(x). +BIN2DEC = BIN2DEC ## PÅ™evede binární Äíslo na desítkové. +BIN2HEX = BIN2HEX ## PÅ™evede binární Äíslo na Å¡estnáctkové. +BIN2OCT = BIN2OCT ## PÅ™evede binární Äíslo na osmiÄkové. +COMPLEX = COMPLEX ## PÅ™evede reálnou a imaginární Äást na komplexní Äíslo. +CONVERT = CONVERT ## PÅ™evede Äíslo do jiného jednotkového mÄ›rného systému. +DEC2BIN = DEC2BIN ## PÅ™evede desítkového Äísla na dvojkové +DEC2HEX = DEC2HEX ## PÅ™evede desítkové Äíslo na Å¡estnáctkové. +DEC2OCT = DEC2OCT ## PÅ™evede desítkové Äíslo na osmiÄkové. +DELTA = DELTA ## Testuje rovnost dvou hodnot. +ERF = ERF ## Vrátí chybovou funkci. +ERFC = ERFC ## Vrátí doplňkovou chybovou funkci. +GESTEP = GESTEP ## Testuje, zda je Äíslo vÄ›tší než mezní hodnota. +HEX2BIN = HEX2BIN ## PÅ™evede Å¡estnáctkové Äíslo na binární. +HEX2DEC = HEX2DEC ## PÅ™evede Å¡estnáctkové Äíslo na desítkové. +HEX2OCT = HEX2OCT ## PÅ™evede Å¡estnáctkové Äíslo na osmiÄkové. +IMABS = IMABS ## Vrátí absolutní hodnotu (modul) komplexního Äísla. +IMAGINARY = IMAGINARY ## Vrátí imaginární Äást komplexního Äísla. +IMARGUMENT = IMARGUMENT ## Vrátí argument théta, úhel vyjádÅ™ený v radiánech. +IMCONJUGATE = IMCONJUGATE ## Vrátí komplexnÄ› sdružené Äíslo ke komplexnímu Äíslu. +IMCOS = IMCOS ## Vrátí kosinus komplexního Äísla. +IMDIV = IMDIV ## Vrátí podíl dvou komplexních Äísel. +IMEXP = IMEXP ## Vrátí exponenciální tvar komplexního Äísla. +IMLN = IMLN ## Vrátí pÅ™irozený logaritmus komplexního Äísla. +IMLOG10 = IMLOG10 ## Vrátí dekadický logaritmus komplexního Äísla. +IMLOG2 = IMLOG2 ## Vrátí logaritmus komplexního Äísla pÅ™i základu 2. +IMPOWER = IMPOWER ## Vrátí komplexní Äíslo umocnÄ›né na celé Äíslo. +IMPRODUCT = IMPRODUCT ## Vrátí souÄin komplexních Äísel. +IMREAL = IMREAL ## Vrátí reálnou Äást komplexního Äísla. +IMSIN = IMSIN ## Vrátí sinus komplexního Äísla. +IMSQRT = IMSQRT ## Vrátí druhou odmocninu komplexního Äísla. +IMSUB = IMSUB ## Vrátí rozdíl mezi dvÄ›ma komplexními Äísly. +IMSUM = IMSUM ## Vrátí souÄet dvou komplexních Äísel. +OCT2BIN = OCT2BIN ## PÅ™evede osmiÄkové Äíslo na binární. +OCT2DEC = OCT2DEC ## PÅ™evede osmiÄkové Äíslo na desítkové. +OCT2HEX = OCT2HEX ## PÅ™evede osmiÄkové Äíslo na Å¡estnáctkové. + + +## +## Financial functions FinanÄní funkce +## +ACCRINT = ACCRINT ## Vrátí nahromadÄ›ný úrok z cenného papíru, ze kterého je úrok placen v pravidelných termínech. +ACCRINTM = ACCRINTM ## Vrátí nahromadÄ›ný úrok z cenného papíru, ze kterého je úrok placen k datu splatnosti. +AMORDEGRC = AMORDEGRC ## Vrátí lineární amortizaci v každém úÄetním období pomocí koeficientu amortizace. +AMORLINC = AMORLINC ## Vrátí lineární amortizaci v každém úÄetním období. +COUPDAYBS = COUPDAYBS ## Vrátí poÄet dnů od zaÄátku období placení kupónů do data splatnosti. +COUPDAYS = COUPDAYS ## Vrátí poÄet dnů v období placení kupónů, které obsahuje den zúÄtování. +COUPDAYSNC = COUPDAYSNC ## Vrátí poÄet dnů od data zúÄtování do následujícího data placení kupónu. +COUPNCD = COUPNCD ## Vrátí následující datum placení kupónu po datu zúÄtování. +COUPNUM = COUPNUM ## Vrátí poÄet kupónů splatných mezi datem zúÄtování a datem splatnosti. +COUPPCD = COUPPCD ## Vrátí pÅ™edchozí datum placení kupónu pÅ™ed datem zúÄtování. +CUMIPMT = CUMIPMT ## Vrátí kumulativní úrok splacený mezi dvÄ›ma obdobími. +CUMPRINC = CUMPRINC ## Vrátí kumulativní jistinu splacenou mezi dvÄ›ma obdobími půjÄky. +DB = ODPIS.ZRYCH ## Vrátí odpis aktiva za urÄité období pomocí degresivní metody odpisu s pevným zůstatkem. +DDB = ODPIS.ZRYCH2 ## Vrátí odpis aktiva za urÄité období pomocí dvojité degresivní metody odpisu nebo jiné metody, kterou zadáte. +DISC = DISC ## Vrátí diskontní sazbu cenného papíru. +DOLLARDE = DOLLARDE ## PÅ™evede Äástku v korunách vyjádÅ™enou zlomkem na Äástku v korunách vyjádÅ™enou desetinným Äíslem. +DOLLARFR = DOLLARFR ## PÅ™evede Äástku v korunách vyjádÅ™enou desetinným Äíslem na Äástku v korunách vyjádÅ™enou zlomkem. +DURATION = DURATION ## Vrátí roÄní dobu cenného papíru s pravidelnými úrokovými sazbami. +EFFECT = EFFECT ## Vrátí efektivní roÄní úrokovou sazbu. +FV = BUDHODNOTA ## Vrátí budoucí hodnotu investice. +FVSCHEDULE = FVSCHEDULE ## Vrátí budoucí hodnotu poÄáteÄní jistiny po použití série sazeb složitého úroku. +INTRATE = INTRATE ## Vrátí úrokovou sazbu plnÄ› investovaného cenného papíru. +IPMT = PLATBA.ÚROK ## Vrátí výšku úroku investice za dané období. +IRR = MÃRA.VÃNOSNOSTI ## Vrátí vnitÅ™ní výnosové procento série peněžních toků. +ISPMT = ISPMT ## VypoÄte výši úroku z investice zaplaceného bÄ›hem urÄitého období. +MDURATION = MDURATION ## Vrátí Macauleyho modifikovanou dobu cenného papíru o nominální hodnotÄ› 100 KÄ. +MIRR = MOD.MÃRA.VÃNOSNOSTI ## Vrátí vnitÅ™ní sazbu výnosu, pÅ™iÄemž kladné a záporné hodnoty peněžních prostÅ™edků jsou financovány podle různých sazeb. +NOMINAL = NOMINAL ## Vrátí nominální roÄní úrokovou sazbu. +NPER = POÄŒET.OBDOBà ## Vrátí poÄet období pro investici. +NPV = ÄŒISTÃ.SOUÄŒHODNOTA ## Vrátí Äistou souÄasnou hodnotu investice vypoÄítanou na základÄ› série pravidelných peněžních toků a diskontní sazby. +ODDFPRICE = ODDFPRICE ## Vrátí cenu cenného papíru o nominální hodnotÄ› 100 KÄ s odliÅ¡ným prvním obdobím. +ODDFYIELD = ODDFYIELD ## Vrátí výnos cenného papíru s odliÅ¡ným prvním obdobím. +ODDLPRICE = ODDLPRICE ## Vrátí cenu cenného papíru o nominální hodnotÄ› 100 KÄ s odliÅ¡ným posledním obdobím. +ODDLYIELD = ODDLYIELD ## Vrátí výnos cenného papíru s odliÅ¡ným posledním obdobím. +PMT = PLATBA ## Vrátí hodnotu pravidelné splátky anuity. +PPMT = PLATBA.ZÃKLAD ## Vrátí hodnotu splátky jistiny pro zadanou investici za dané období. +PRICE = PRICE ## Vrátí cenu cenného papíru o nominální hodnotÄ› 100 KÄ, ze kterého je úrok placen v pravidelných termínech. +PRICEDISC = PRICEDISC ## Vrátí cenu diskontního cenného papíru o nominální hodnotÄ› 100 KÄ. +PRICEMAT = PRICEMAT ## Vrátí cenu cenného papíru o nominální hodnotÄ› 100 KÄ, ze kterého je úrok placen k datu splatnosti. +PV = SOUÄŒHODNOTA ## Vrátí souÄasnou hodnotu investice. +RATE = ÚROKOVÃ.MÃRA ## Vrátí úrokovou sazbu vztaženou na období anuity. +RECEIVED = RECEIVED ## Vrátí Äástku obdrženou k datu splatnosti plnÄ› investovaného cenného papíru. +SLN = ODPIS.LIN ## Vrátí přímé odpisy aktiva pro jedno období. +SYD = ODPIS.NELIN ## Vrátí smÄ›rné Äíslo roÄních odpisů aktiva pro zadané období. +TBILLEQ = TBILLEQ ## Vrátí výnos smÄ›nky státní pokladny ekvivalentní výnosu obligace. +TBILLPRICE = TBILLPRICE ## Vrátí cenu smÄ›nky státní pokladny o nominální hodnotÄ› 100 KÄ. +TBILLYIELD = TBILLYIELD ## Vrátí výnos smÄ›nky státní pokladny. +VDB = ODPIS.ZA.INT ## Vrátí odpis aktiva pro urÄité období nebo Äást období pomocí degresivní metody odpisu. +XIRR = XIRR ## Vrátí vnitÅ™ní výnosnost pro harmonogram peněžních toků, který nemusí být nutnÄ› periodický. +XNPV = XNPV ## Vrátí Äistou souÄasnou hodnotu pro harmonogram peněžních toků, který nemusí být nutnÄ› periodický. +YIELD = YIELD ## Vrátí výnos cenného papíru, ze kterého je úrok placen v pravidelných termínech. +YIELDDISC = YIELDDISC ## Vrátí roÄní výnos diskontního cenného papíru, například smÄ›nky státní pokladny. +YIELDMAT = YIELDMAT ## Vrátí roÄní výnos cenného papíru, ze kterého je úrok placen k datu splatnosti. + + +## +## Information functions InformaÄní funkce +## +CELL = POLÃÄŒKO ## Vrátí informace o formátování, umístÄ›ní nebo obsahu buňky. +ERROR.TYPE = CHYBA.TYP ## Vrátí Äíslo odpovídající typu chyby. +INFO = O.PROSTŘEDà ## Vrátí informace o aktuálním pracovním prostÅ™edí. +ISBLANK = JE.PRÃZDNÉ ## Vrátí hodnotu PRAVDA, pokud se argument hodnota odkazuje na prázdnou buňku. +ISERR = JE.CHYBA ## Vrátí hodnotu PRAVDA, pokud je argument hodnota libovolná chybová hodnota (kromÄ› #N/A). +ISERROR = JE.CHYBHODN ## Vrátí hodnotu PRAVDA, pokud je argument hodnota libovolná chybová hodnota. +ISEVEN = ISEVEN ## Vrátí hodnotu PRAVDA, pokud je Äíslo sudé. +ISLOGICAL = JE.LOGHODN ## Vrátí hodnotu PRAVDA, pokud je argument hodnota logická hodnota. +ISNA = JE.NEDEF ## Vrátí hodnotu PRAVDA, pokud je argument hodnota chybová hodnota #N/A. +ISNONTEXT = JE.NETEXT ## Vrátí hodnotu PRAVDA, pokud argument hodnota není text. +ISNUMBER = JE.ÄŒÃSLO ## Vrátí hodnotu PRAVDA, pokud je argument hodnota Äíslo. +ISODD = ISODD ## Vrátí hodnotu PRAVDA, pokud je Äíslo liché. +ISREF = JE.ODKAZ ## Vrátí hodnotu PRAVDA, pokud je argument hodnota odkaz. +ISTEXT = JE.TEXT ## Vrátí hodnotu PRAVDA, pokud je argument hodnota text. +N = N ## Vrátí hodnotu pÅ™evedenou na Äíslo. +NA = NEDEF ## Vrátí chybovou hodnotu #N/A. +TYPE = TYP ## Vrátí Äíslo oznaÄující datový typ hodnoty. + + +## +## Logical functions Logické funkce +## +AND = A ## Vrátí hodnotu PRAVDA, mají-li vÅ¡echny argumenty hodnotu PRAVDA. +FALSE = NEPRAVDA ## Vrátí logickou hodnotu NEPRAVDA. +IF = KDYŽ ## UrÄí, který logický test má probÄ›hnout. +IFERROR = IFERROR ## Pokud je vzorec vyhodnocen jako chyba, vrátí zadanou hodnotu. V opaÄném případÄ› vrátí výsledek vzorce. +NOT = NE ## Provede logickou negaci argumentu funkce. +OR = NEBO ## Vrátí hodnotu PRAVDA, je-li alespoň jeden argument roven hodnotÄ› PRAVDA. +TRUE = PRAVDA ## Vrátí logickou hodnotu PRAVDA. + + +## +## Lookup and reference functions Vyhledávací funkce +## +ADDRESS = ODKAZ ## Vrátí textový odkaz na jednu buňku listu. +AREAS = POÄŒET.BLOKÅ® ## Vrátí poÄet oblastí v odkazu. +CHOOSE = ZVOLIT ## Zvolí hodnotu ze seznamu hodnot. +COLUMN = SLOUPEC ## Vrátí Äíslo sloupce odkazu. +COLUMNS = SLOUPCE ## Vrátí poÄet sloupců v odkazu. +HLOOKUP = VVYHLEDAT ## Prohledá horní řádek matice a vrátí hodnotu urÄené buňky. +HYPERLINK = HYPERTEXTOVÃ.ODKAZ ## Vytvoří zástupce nebo odkaz, který otevÅ™e dokument uložený na síťovém serveru, v síti intranet nebo Internet. +INDEX = INDEX ## Pomocí rejstříku zvolí hodnotu z odkazu nebo matice. +INDIRECT = NEPŘÃMÃ.ODKAZ ## Vrátí odkaz urÄený textovou hodnotou. +LOOKUP = VYHLEDAT ## Vyhledá hodnoty ve vektoru nebo matici. +MATCH = POZVYHLEDAT ## Vyhledá hodnoty v odkazu nebo matici. +OFFSET = POSUN ## Vrátí posun odkazu od zadaného odkazu. +ROW = ŘÃDEK ## Vrátí Äíslo řádku odkazu. +ROWS = ŘÃDKY ## Vrátí poÄet řádků v odkazu. +RTD = RTD ## NaÄte data reálného Äasu z programu, který podporuje automatizaci modelu COM (Automatizace: Způsob práce s objekty urÄité aplikace z jiné aplikace nebo nástroje pro vývoj. Automatizace (dříve nazývaná automatizace OLE) je poÄítaÄovým standardem a je funkcí modelu COM (Component Object Model).). +TRANSPOSE = TRANSPOZICE ## Vrátí transponovanou matici. +VLOOKUP = SVYHLEDAT ## Prohledá první sloupec matice, pÅ™esune kurzor v řádku a vrátí hodnotu buňky. + + +## +## Math and trigonometry functions Matematické a trigonometrické funkce +## +ABS = ABS ## Vrátí absolutní hodnotu Äísla. +ACOS = ARCCOS ## Vrátí arkuskosinus Äísla. +ACOSH = ARCCOSH ## Vrátí hyperbolický arkuskosinus Äísla. +ASIN = ARCSIN ## Vrátí arkussinus Äísla. +ASINH = ARCSINH ## Vrátí hyperbolický arkussinus Äísla. +ATAN = ARCTG ## Vrátí arkustangens Äísla. +ATAN2 = ARCTG2 ## Vrátí arkustangens x-ové a y-ové souÅ™adnice. +ATANH = ARCTGH ## Vrátí hyperbolický arkustangens Äísla. +CEILING = ZAOKR.NAHORU ## Zaokrouhlí Äíslo na nejbližší celé Äíslo nebo na nejbližší násobek zadané hodnoty. +COMBIN = KOMBINACE ## Vrátí poÄet kombinací pro daný poÄet položek. +COS = COS ## Vrátí kosinus Äísla. +COSH = COSH ## Vrátí hyperbolický kosinus Äísla. +DEGREES = DEGREES ## PÅ™evede radiány na stupnÄ›. +EVEN = ZAOKROUHLIT.NA.SUDÉ ## Zaokrouhlí Äíslo nahoru na nejbližší celé sudé Äíslo. +EXP = EXP ## Vrátí základ pÅ™irozeného logaritmu e umocnÄ›ný na zadané Äíslo. +FACT = FAKTORIÃL ## Vrátí faktoriál Äísla. +FACTDOUBLE = FACTDOUBLE ## Vrátí dvojitý faktoriál Äísla. +FLOOR = ZAOKR.DOLÅ® ## Zaokrouhlí Äíslo dolů, smÄ›rem k nule. +GCD = GCD ## Vrátí nejvÄ›tší spoleÄný dÄ›litel. +INT = CELÃ.ÄŒÃST ## Zaokrouhlí Äíslo dolů na nejbližší celé Äíslo. +LCM = LCM ## Vrátí nejmenší spoleÄný násobek. +LN = LN ## Vrátí pÅ™irozený logaritmus Äísla. +LOG = LOGZ ## Vrátí logaritmus Äísla pÅ™i zadaném základu. +LOG10 = LOG ## Vrátí dekadický logaritmus Äísla. +MDETERM = DETERMINANT ## Vrátí determinant matice. +MINVERSE = INVERZE ## Vrátí inverzní matici. +MMULT = SOUÄŒIN.MATIC ## Vrátí souÄin dvou matic. +MOD = MOD ## Vrátí zbytek po dÄ›lení. +MROUND = MROUND ## Vrátí Äíslo zaokrouhlené na požadovaný násobek. +MULTINOMIAL = MULTINOMIAL ## Vrátí mnohoÄlen z množiny Äísel. +ODD = ZAOKROUHLIT.NA.LICHÉ ## Zaokrouhlí Äíslo nahoru na nejbližší celé liché Äíslo. +PI = PI ## Vrátí hodnotu Äísla pí. +POWER = POWER ## Umocní Äíslo na zadanou mocninu. +PRODUCT = SOUÄŒIN ## Vynásobí argumenty funkce. +QUOTIENT = QUOTIENT ## Vrátí celou Äást dÄ›lení. +RADIANS = RADIANS ## PÅ™evede stupnÄ› na radiány. +RAND = NÃHÄŒÃSLO ## Vrátí náhodné Äíslo mezi 0 a 1. +RANDBETWEEN = RANDBETWEEN ## Vrátí náhodné Äíslo mezi zadanými Äísly. +ROMAN = ROMAN ## PÅ™evede arabskou Äíslici na římskou ve formátu textu. +ROUND = ZAOKROUHLIT ## Zaokrouhlí Äíslo na zadaný poÄet Äíslic. +ROUNDDOWN = ROUNDDOWN ## Zaokrouhlí Äíslo dolů, smÄ›rem k nule. +ROUNDUP = ROUNDUP ## Zaokrouhlí Äíslo nahoru, smÄ›rem od nuly. +SERIESSUM = SERIESSUM ## Vrátí souÄet mocninné Å™ady urÄené podle vzorce. +SIGN = SIGN ## Vrátí znaménko Äísla. +SIN = SIN ## Vrátí sinus daného úhlu. +SINH = SINH ## Vrátí hyperbolický sinus Äísla. +SQRT = ODMOCNINA ## Vrátí kladnou druhou odmocninu. +SQRTPI = SQRTPI ## Vrátí druhou odmocninu výrazu (Äíslo * pí). +SUBTOTAL = SUBTOTAL ## Vrátí souhrn v seznamu nebo databázi. +SUM = SUMA ## SeÄte argumenty funkce. +SUMIF = SUMIF ## SeÄte buňky vybrané podle zadaných kritérií. +SUMIFS = SUMIFS ## SeÄte buňky urÄené více zadanými podmínkami. +SUMPRODUCT = SOUÄŒIN.SKALÃRNà ## Vrátí souÄet souÄinů odpovídajících prvků matic. +SUMSQ = SUMA.ÄŒTVERCÅ® ## Vrátí souÄet Ätverců argumentů. +SUMX2MY2 = SUMX2MY2 ## Vrátí souÄet rozdílu Ätverců odpovídajících hodnot ve dvou maticích. +SUMX2PY2 = SUMX2PY2 ## Vrátí souÄet souÄtu Ätverců odpovídajících hodnot ve dvou maticích. +SUMXMY2 = SUMXMY2 ## Vrátí souÄet Ätverců rozdílů odpovídajících hodnot ve dvou maticích. +TAN = TGTG ## Vrátí tangens Äísla. +TANH = TGH ## Vrátí hyperbolický tangens Äísla. +TRUNC = USEKNOUT ## Zkrátí Äíslo na celé Äíslo. + + +## +## Statistical functions Statistické funkce +## +AVEDEV = PRÅ®MODCHYLKA ## Vrátí průmÄ›rnou hodnotu absolutních odchylek datových bodů od jejich stÅ™ední hodnoty. +AVERAGE = PRÅ®MÄšR ## Vrátí průmÄ›rnou hodnotu argumentů. +AVERAGEA = AVERAGEA ## Vrátí průmÄ›rnou hodnotu argumentů vÄetnÄ› Äísel, textu a logických hodnot. +AVERAGEIF = AVERAGEIF ## Vrátí průmÄ›rnou hodnotu (aritmetický průmÄ›r) vÅ¡ech bunÄ›k v oblasti, které vyhovují přísluÅ¡né podmínce. +AVERAGEIFS = AVERAGEIFS ## Vrátí průmÄ›rnou hodnotu (aritmetický průmÄ›r) vÅ¡ech bunÄ›k vyhovujících nÄ›kolika podmínkám. +BETADIST = BETADIST ## Vrátí hodnotu souÄtového rozdÄ›lení beta. +BETAINV = BETAINV ## Vrátí inverzní hodnotu souÄtového rozdÄ›lení pro zadané rozdÄ›lení beta. +BINOMDIST = BINOMDIST ## Vrátí hodnotu binomického rozdÄ›lení pravdÄ›podobnosti jednotlivých veliÄin. +CHIDIST = CHIDIST ## Vrátí jednostrannou pravdÄ›podobnost rozdÄ›lení chí-kvadrát. +CHIINV = CHIINV ## Vrátí hodnotu funkce inverzní k distribuÄní funkci jednostranné pravdÄ›podobnosti rozdÄ›lení chí-kvadrát. +CHITEST = CHITEST ## Vrátí test nezávislosti. +CONFIDENCE = CONFIDENCE ## Vrátí interval spolehlivosti pro stÅ™ední hodnotu základního souboru. +CORREL = CORREL ## Vrátí korelaÄní koeficient mezi dvÄ›ma množinami dat. +COUNT = POÄŒET ## Vrátí poÄet Äísel v seznamu argumentů. +COUNTA = POÄŒET2 ## Vrátí poÄet hodnot v seznamu argumentů. +COUNTBLANK = COUNTBLANK ## SpoÄítá poÄet prázdných bunÄ›k v oblasti. +COUNTIF = COUNTIF ## SpoÄítá buňky v oblasti, které odpovídají zadaným kritériím. +COUNTIFS = COUNTIFS ## SpoÄítá buňky v oblasti, které odpovídají více kritériím. +COVAR = COVAR ## Vrátí hodnotu kovariance, průmÄ›rnou hodnotu souÄinů párových odchylek +CRITBINOM = CRITBINOM ## Vrátí nejmenší hodnotu, pro kterou má souÄtové binomické rozdÄ›lení hodnotu vÄ›tší nebo rovnu hodnotÄ› kritéria. +DEVSQ = DEVSQ ## Vrátí souÄet Ätverců odchylek. +EXPONDIST = EXPONDIST ## Vrátí hodnotu exponenciálního rozdÄ›lení. +FDIST = FDIST ## Vrátí hodnotu rozdÄ›lení pravdÄ›podobnosti F. +FINV = FINV ## Vrátí hodnotu inverzní funkce k distribuÄní funkci rozdÄ›lení F. +FISHER = FISHER ## Vrátí hodnotu Fisherovy transformace. +FISHERINV = FISHERINV ## Vrátí hodnotu inverzní funkce k FisherovÄ› transformaci. +FORECAST = FORECAST ## Vrátí hodnotu lineárního trendu. +FREQUENCY = ÄŒETNOSTI ## Vrátí Äetnost rozdÄ›lení jako svislou matici. +FTEST = FTEST ## Vrátí výsledek F-testu. +GAMMADIST = GAMMADIST ## Vrátí hodnotu rozdÄ›lení gama. +GAMMAINV = GAMMAINV ## Vrátí hodnotu inverzní funkce k distribuÄní funkci souÄtového rozdÄ›lení gama. +GAMMALN = GAMMALN ## Vrátí pÅ™irozený logaritmus funkce gama, Γ(x). +GEOMEAN = GEOMEAN ## Vrátí geometrický průmÄ›r. +GROWTH = LOGLINTREND ## Vrátí hodnoty exponenciálního trendu. +HARMEAN = HARMEAN ## Vrátí harmonický průmÄ›r. +HYPGEOMDIST = HYPGEOMDIST ## Vrátí hodnotu hypergeometrického rozdÄ›lení. +INTERCEPT = INTERCEPT ## Vrátí úsek lineární regresní Äáry. +KURT = KURT ## Vrátí hodnotu excesu množiny dat. +LARGE = LARGE ## Vrátí k-tou nejvÄ›tší hodnotu množiny dat. +LINEST = LINREGRESE ## Vrátí parametry lineárního trendu. +LOGEST = LOGLINREGRESE ## Vrátí parametry exponenciálního trendu. +LOGINV = LOGINV ## Vrátí inverzní funkci k distribuÄní funkci logaritmicko-normálního rozdÄ›lení. +LOGNORMDIST = LOGNORMDIST ## Vrátí hodnotu souÄtového logaritmicko-normálního rozdÄ›lení. +MAX = MAX ## Vrátí maximální hodnotu seznamu argumentů. +MAXA = MAXA ## Vrátí maximální hodnotu seznamu argumentů vÄetnÄ› Äísel, textu a logických hodnot. +MEDIAN = MEDIAN ## Vrátí stÅ™ední hodnotu zadaných Äísel. +MIN = MIN ## Vrátí minimální hodnotu seznamu argumentů. +MINA = MINA ## Vrátí nejmenší hodnotu v seznamu argumentů vÄetnÄ› Äísel, textu a logických hodnot. +MODE = MODE ## Vrátí hodnotu, která se v množinÄ› dat vyskytuje nejÄastÄ›ji. +NEGBINOMDIST = NEGBINOMDIST ## Vrátí hodnotu negativního binomického rozdÄ›lení. +NORMDIST = NORMDIST ## Vrátí hodnotu normálního souÄtového rozdÄ›lení. +NORMINV = NORMINV ## Vrátí inverzní funkci k funkci normálního souÄtového rozdÄ›lení. +NORMSDIST = NORMSDIST ## Vrátí hodnotu standardního normálního souÄtového rozdÄ›lení. +NORMSINV = NORMSINV ## Vrátí inverzní funkci k funkci standardního normálního souÄtového rozdÄ›lení. +PEARSON = PEARSON ## Vrátí Pearsonův výsledný momentový korelaÄní koeficient. +PERCENTILE = PERCENTIL ## Vrátí hodnotu k-tého percentilu hodnot v oblasti. +PERCENTRANK = PERCENTRANK ## Vrátí poÅ™adí hodnoty v množinÄ› dat vyjádÅ™ené procentuální Äástí množiny dat. +PERMUT = PERMUTACE ## Vrátí poÄet permutací pro zadaný poÄet objektů. +POISSON = POISSON ## Vrátí hodnotu distribuÄní funkce Poissonova rozdÄ›lení. +PROB = PROB ## Vrátí pravdÄ›podobnost výskytu hodnot v oblasti mezi dvÄ›ma mezními hodnotami. +QUARTILE = QUARTIL ## Vrátí hodnotu kvartilu množiny dat. +RANK = RANK ## Vrátí poÅ™adí Äísla v seznamu Äísel. +RSQ = RKQ ## Vrátí druhou mocninu Pearsonova výsledného momentového korelaÄního koeficientu. +SKEW = SKEW ## Vrátí zeÅ¡ikmení rozdÄ›lení. +SLOPE = SLOPE ## Vrátí smÄ›rnici lineární regresní Äáry. +SMALL = SMALL ## Vrátí k-tou nejmenší hodnotu množiny dat. +STANDARDIZE = STANDARDIZE ## Vrátí normalizovanou hodnotu. +STDEV = SMODCH.VÃBÄšR ## VypoÄte smÄ›rodatnou odchylku výbÄ›ru. +STDEVA = STDEVA ## VypoÄte smÄ›rodatnou odchylku výbÄ›ru vÄetnÄ› Äísel, textu a logických hodnot. +STDEVP = SMODCH ## VypoÄte smÄ›rodatnou odchylku základního souboru. +STDEVPA = STDEVPA ## VypoÄte smÄ›rodatnou odchylku základního souboru vÄetnÄ› Äísel, textu a logických hodnot. +STEYX = STEYX ## Vrátí standardní chybu pÅ™edpovÄ›zené hodnoty y pro každou hodnotu x v regresi. +TDIST = TDIST ## Vrátí hodnotu Studentova t-rozdÄ›lení. +TINV = TINV ## Vrátí inverzní funkci k distribuÄní funkci Studentova t-rozdÄ›lení. +TREND = LINTREND ## Vrátí hodnoty lineárního trendu. +TRIMMEAN = TRIMMEAN ## Vrátí stÅ™ední hodnotu vnitÅ™ní Äásti množiny dat. +TTEST = TTEST ## Vrátí pravdÄ›podobnost spojenou se Studentovým t-testem. +VAR = VAR.VÃBÄšR ## VypoÄte rozptyl výbÄ›ru. +VARA = VARA ## VypoÄte rozptyl výbÄ›ru vÄetnÄ› Äísel, textu a logických hodnot. +VARP = VAR ## VypoÄte rozptyl základního souboru. +VARPA = VARPA ## VypoÄte rozptyl základního souboru vÄetnÄ› Äísel, textu a logických hodnot. +WEIBULL = WEIBULL ## Vrátí hodnotu Weibullova rozdÄ›lení. +ZTEST = ZTEST ## Vrátí jednostrannou P-hodnotu z-testu. + + +## +## Text functions Textové funkce +## +ASC = ASC ## ZmÄ›ní znaky s plnou šířkou (dvoubajtové)v Å™etÄ›zci znaků na znaky s poloviÄní šířkou (jednobajtové). +BAHTTEXT = BAHTTEXT ## PÅ™evede Äíslo na text ve formátu, mÄ›ny ß (baht). +CHAR = ZNAK ## Vrátí znak urÄený Äíslem kódu. +CLEAN = VYÄŒISTIT ## Odebere z textu vÅ¡echny netisknutelné znaky. +CODE = KÓD ## Vrátí Äíselný kód prvního znaku zadaného textového Å™etÄ›zce. +CONCATENATE = CONCATENATE ## Spojí nÄ›kolik textových položek do jedné. +DOLLAR = KÄŒ ## PÅ™evede Äíslo na text ve formátu mÄ›ny KÄ (Äeská koruna). +EXACT = STEJNÉ ## Zkontroluje, zda jsou dvÄ› textové hodnoty shodné. +FIND = NAJÃT ## Nalezne textovou hodnotu uvnitÅ™ jiné (rozliÅ¡uje malá a velká písmena). +FINDB = FINDB ## Nalezne textovou hodnotu uvnitÅ™ jiné (rozliÅ¡uje malá a velká písmena). +FIXED = ZAOKROUHLIT.NA.TEXT ## Zformátuje Äíslo jako text s pevným poÄtem desetinných míst. +JIS = JIS ## ZmÄ›ní znaky s poloviÄní šířkou (jednobajtové) v Å™etÄ›zci znaků na znaky s plnou šířkou (dvoubajtové). +LEFT = ZLEVA ## Vrátí první znaky textové hodnoty umístÄ›né nejvíce vlevo. +LEFTB = LEFTB ## Vrátí první znaky textové hodnoty umístÄ›né nejvíce vlevo. +LEN = DÉLKA ## Vrátí poÄet znaků textového Å™etÄ›zce. +LENB = LENB ## Vrátí poÄet znaků textového Å™etÄ›zce. +LOWER = MALà ## PÅ™evede text na malá písmena. +MID = ÄŒÃST ## Vrátí urÄitý poÄet znaků textového Å™etÄ›zce poÄínaje zadaným místem. +MIDB = MIDB ## Vrátí urÄitý poÄet znaků textového Å™etÄ›zce poÄínaje zadaným místem. +PHONETIC = ZVUKOVÉ ## Extrahuje fonetické znaky (furigana) z textového Å™etÄ›zce. +PROPER = VELKÃ2 ## PÅ™evede první písmeno každého slova textové hodnoty na velké. +REPLACE = NAHRADIT ## Nahradí znaky uvnitÅ™ textu. +REPLACEB = NAHRADITB ## Nahradí znaky uvnitÅ™ textu. +REPT = OPAKOVAT ## Zopakuje text podle zadaného poÄtu opakování. +RIGHT = ZPRAVA ## Vrátí první znaky textové hodnoty umístÄ›né nejvíce vpravo. +RIGHTB = RIGHTB ## Vrátí první znaky textové hodnoty umístÄ›né nejvíce vpravo. +SEARCH = HLEDAT ## Nalezne textovou hodnotu uvnitÅ™ jiné (malá a velká písmena nejsou rozliÅ¡ována). +SEARCHB = SEARCHB ## Nalezne textovou hodnotu uvnitÅ™ jiné (malá a velká písmena nejsou rozliÅ¡ována). +SUBSTITUTE = DOSADIT ## V textovém Å™etÄ›zci nahradí starý text novým. +T = T ## PÅ™evede argumenty na text. +TEXT = HODNOTA.NA.TEXT ## Zformátuje Äíslo a pÅ™evede ho na text. +TRIM = PROÄŒISTIT ## Odstraní z textu mezery. +UPPER = VELKà ## PÅ™evede text na velká písmena. +VALUE = HODNOTA ## PÅ™evede textový argument na Äíslo. diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/da/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/da/config new file mode 100644 index 000000000..49292f1cf --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/da/config @@ -0,0 +1,48 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = kr + + + +## +## Excel Error Codes (For future use) +## +NULL = #NUL! +DIV0 = #DIVISION/0! +VALUE = #VÆRDI! +REF = #REFERENCE! +NAME = #NAVN? +NUM = #NUM! +NA = #I/T diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/da/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/da/functions new file mode 100644 index 000000000..affc19a1a --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/da/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Tilføjelsesprogram- og automatiseringsfunktioner +## +GETPIVOTDATA = HENTPIVOTDATA ## Returnerer data, der er lagret i en pivottabelrapport + + +## +## Cube functions Kubefunktioner +## +CUBEKPIMEMBER = KUBE.KPI.MEDLEM ## Returnerer navn, egenskab og mÃ¥l for en KPI-indikator og viser navnet og egenskaben i cellen. En KPI-indikator er en mÃ¥lbar størrelse, f.eks. bruttooverskud pr. mÃ¥ned eller personaleudskiftning pr. kvartal, der bruges til at overvÃ¥ge en organisations præstationer. +CUBEMEMBER = KUBE.MEDLEM ## Returnerer et medlem eller en tupel fra kubehierarkiet. Bruges til at validere, om et medlem eller en tupel findes i kuben. +CUBEMEMBERPROPERTY = KUBEMEDLEM.EGENSKAB ## Returnerer værdien af en egenskab for et medlem i kuben. Bruges til at validere, om et medlemsnavn findes i kuben, og returnere den angivne egenskab for medlemmet. +CUBERANKEDMEMBER = KUBEMEDLEM.RANG ## Returnerer det n'te eller rangordnede medlem i et sæt. Bruges til at returnere et eller flere elementer i et sæt, f.eks. topsælgere eller de 10 bedste elever. +CUBESET = KUBESÆT ## Definerer et beregnet sæt medlemmer eller tupler ved at sende et sætudtryk til kuben pÃ¥ serveren, som opretter sættet og returnerer det til Microsoft Office Excel. +CUBESETCOUNT = KUBESÆT.TÆL ## Returnerer antallet af elementer i et sæt. +CUBEVALUE = KUBEVÆRDI ## Returnerer en sammenlagt (aggregeret) værdi fra en kube. + + +## +## Database functions Databasefunktioner +## +DAVERAGE = DMIDDEL ## Returnerer gennemsnittet af markerede databaseposter +DCOUNT = DTÆL ## Tæller de celler, der indeholder tal, i en database +DCOUNTA = DTÆLV ## Tæller udfyldte celler i en database +DGET = DHENT ## Uddrager en enkelt post, der opfylder de angivne kriterier, fra en database +DMAX = DMAKS ## Returnerer den største værdi blandt markerede databaseposter +DMIN = DMIN ## Returnerer den mindste værdi blandt markerede databaseposter +DPRODUCT = DPRODUKT ## Ganger værdierne i et bestemt felt med poster, der opfylder kriterierne i en database +DSTDEV = DSTDAFV ## Beregner et skøn over standardafvigelsen baseret pÃ¥ en stikprøve af markerede databaseposter +DSTDEVP = DSTDAFVP ## Beregner standardafvigelsen baseret pÃ¥ hele populationen af markerede databaseposter +DSUM = DSUM ## Sammenlægger de tal i feltkolonnen i databasen, der opfylder kriterierne +DVAR = DVARIANS ## Beregner varians baseret pÃ¥ en stikprøve af markerede databaseposter +DVARP = DVARIANSP ## Beregner varians baseret pÃ¥ hele populationen af markerede databaseposter + + +## +## Date and time functions Dato- og klokkeslætsfunktioner +## +DATE = DATO ## Returnerer serienummeret for en bestemt dato +DATEVALUE = DATOVÆRDI ## Konverterer en dato i form af tekst til et serienummer +DAY = DAG ## Konverterer et serienummer til en dag i mÃ¥neden +DAYS360 = DAGE360 ## Beregner antallet af dage mellem to datoer pÃ¥ grundlag af et Ã¥r med 360 dage +EDATE = EDATO ## Returnerer serienummeret for den dato, der ligger det angivne antal mÃ¥neder før eller efter startdatoen +EOMONTH = SLUT.PÃ….MÃ…NED ## Returnerer serienummeret pÃ¥ den sidste dag i mÃ¥neden før eller efter et angivet antal mÃ¥neder +HOUR = TIME ## Konverterer et serienummer til en time +MINUTE = MINUT ## Konverterer et serienummer til et minut +MONTH = MÃ…NED ## Konverterer et serienummer til en mÃ¥ned +NETWORKDAYS = ANTAL.ARBEJDSDAGE ## Returnerer antallet af hele arbejdsdage mellem to datoer +NOW = NU ## Returnerer serienummeret for den aktuelle dato eller det aktuelle klokkeslæt +SECOND = SEKUND ## Konverterer et serienummer til et sekund +TIME = KLOKKESLÆT ## Returnerer serienummeret for et bestemt klokkeslæt +TIMEVALUE = TIDSVÆRDI ## Konverterer et klokkeslæt i form af tekst til et serienummer +TODAY = IDAG ## Returnerer serienummeret for dags dato +WEEKDAY = UGEDAG ## Konverterer et serienummer til en ugedag +WEEKNUM = UGE.NR ## Konverterer et serienummer til et tal, der angiver ugenummeret i Ã¥ret +WORKDAY = ARBEJDSDAG ## Returnerer serienummeret for dagen før eller efter det angivne antal arbejdsdage +YEAR = Ã…R ## Konverterer et serienummer til et Ã¥r +YEARFRAC = Ã…R.BRØK ## Returnerer Ã¥rsbrøken, der repræsenterer antallet af hele dage mellem startdato og slutdato + + +## +## Engineering functions Tekniske funktioner +## +BESSELI = BESSELI ## Returnerer den modificerede Bessel-funktion In(x) +BESSELJ = BESSELJ ## Returnerer Bessel-funktionen Jn(x) +BESSELK = BESSELK ## Returnerer den modificerede Bessel-funktion Kn(x) +BESSELY = BESSELY ## Returnerer Bessel-funktionen Yn(x) +BIN2DEC = BIN.TIL.DEC ## Konverterer et binært tal til et decimaltal +BIN2HEX = BIN.TIL.HEX ## Konverterer et binært tal til et heksadecimalt tal +BIN2OCT = BIN.TIL.OKT ## Konverterer et binært tal til et oktaltal. +COMPLEX = KOMPLEKS ## Konverterer reelle og imaginære koefficienter til et komplekst tal +CONVERT = KONVERTER ## Konverterer et tal fra én mÃ¥leenhed til en anden +DEC2BIN = DEC.TIL.BIN ## Konverterer et decimaltal til et binært tal +DEC2HEX = DEC.TIL.HEX ## Konverterer et decimaltal til et heksadecimalt tal +DEC2OCT = DEC.TIL.OKT ## Konverterer et decimaltal til et oktaltal +DELTA = DELTA ## Tester, om to værdier er ens +ERF = FEJLFUNK ## Returner fejlfunktionen +ERFC = FEJLFUNK.KOMP ## Returnerer den komplementære fejlfunktion +GESTEP = GETRIN ## Tester, om et tal er større end en grænseværdi +HEX2BIN = HEX.TIL.BIN ## Konverterer et heksadecimalt tal til et binært tal +HEX2DEC = HEX.TIL.DEC ## Konverterer et decimaltal til et heksadecimalt tal +HEX2OCT = HEX.TIL.OKT ## Konverterer et heksadecimalt tal til et oktaltal +IMABS = IMAGABS ## Returnerer den absolutte værdi (modulus) for et komplekst tal +IMAGINARY = IMAGINÆR ## Returnerer den imaginære koefficient for et komplekst tal +IMARGUMENT = IMAGARGUMENT ## Returnerer argumentet theta, en vinkel udtrykt i radianer +IMCONJUGATE = IMAGKONJUGERE ## Returnerer den komplekse konjugation af et komplekst tal +IMCOS = IMAGCOS ## Returnerer et komplekst tals cosinus +IMDIV = IMAGDIV ## Returnerer kvotienten for to komplekse tal +IMEXP = IMAGEKSP ## Returnerer et komplekst tals eksponentialfunktion +IMLN = IMAGLN ## Returnerer et komplekst tals naturlige logaritme +IMLOG10 = IMAGLOG10 ## Returnerer et komplekst tals sædvanlige logaritme (titalslogaritme) +IMLOG2 = IMAGLOG2 ## Returnerer et komplekst tals sædvanlige logaritme (totalslogaritme) +IMPOWER = IMAGPOTENS ## Returnerer et komplekst tal opløftet i en heltalspotens +IMPRODUCT = IMAGPRODUKT ## Returnerer produktet af komplekse tal +IMREAL = IMAGREELT ## Returnerer den reelle koefficient for et komplekst tal +IMSIN = IMAGSIN ## Returnerer et komplekst tals sinus +IMSQRT = IMAGKVROD ## Returnerer et komplekst tals kvadratrod +IMSUB = IMAGSUB ## Returnerer forskellen mellem to komplekse tal +IMSUM = IMAGSUM ## Returnerer summen af komplekse tal +OCT2BIN = OKT.TIL.BIN ## Konverterer et oktaltal til et binært tal +OCT2DEC = OKT.TIL.DEC ## Konverterer et oktaltal til et decimaltal +OCT2HEX = OKT.TIL.HEX ## Konverterer et oktaltal til et heksadecimalt tal + + +## +## Financial functions Finansielle funktioner +## +ACCRINT = PÃ…LØBRENTE ## Returnerer den pÃ¥løbne rente for et værdipapir med periodiske renteudbetalinger +ACCRINTM = PÃ…LØBRENTE.UDLØB ## Returnerer den pÃ¥løbne rente for et værdipapir, hvor renteudbetalingen finder sted ved papirets udløb +AMORDEGRC = AMORDEGRC ## Returnerer afskrivningsbeløbet for hver regnskabsperiode ved hjælp af en afskrivningskoefficient +AMORLINC = AMORLINC ## Returnerer afskrivningsbeløbet for hver regnskabsperiode +COUPDAYBS = KUPONDAGE.SA ## Returnerer antallet af dage fra starten af kuponperioden til afregningsdatoen +COUPDAYS = KUPONDAGE.A ## Returnerer antallet af dage fra begyndelsen af kuponperioden til afregningsdatoen +COUPDAYSNC = KUPONDAGE.ANK ## Returnerer antallet af dage i den kuponperiode, der indeholder afregningsdatoen +COUPNCD = KUPONDAG.NÆSTE ## Returnerer den næste kupondato efter afregningsdatoen +COUPNUM = KUPONBETALINGER ## Returnerer antallet af kuponudbetalinger mellem afregnings- og udløbsdatoen +COUPPCD = KUPONDAG.FORRIGE ## Returnerer den forrige kupondato før afregningsdatoen +CUMIPMT = AKKUM.RENTE ## Returnerer den akkumulerede rente, der betales pÃ¥ et lÃ¥n mellem to perioder +CUMPRINC = AKKUM.HOVEDSTOL ## Returnerer den akkumulerede nedbringelse af hovedstol mellem to perioder +DB = DB ## Returnerer afskrivningen pÃ¥ et aktiv i en angivet periode ved anvendelse af saldometoden +DDB = DSA ## Returnerer afskrivningsbeløbet for et aktiv over en bestemt periode ved anvendelse af dobbeltsaldometoden eller en anden afskrivningsmetode, som du angiver +DISC = DISKONTO ## Returnerer et værdipapirs diskonto +DOLLARDE = KR.DECIMAL ## Konverterer en kronepris udtrykt som brøk til en kronepris udtrykt som decimaltal +DOLLARFR = KR.BRØK ## Konverterer en kronepris udtrykt som decimaltal til en kronepris udtrykt som brøk +DURATION = VARIGHED ## Returnerer den Ã¥rlige løbetid for et værdipapir med periodiske renteudbetalinger +EFFECT = EFFEKTIV.RENTE ## Returnerer den Ã¥rlige effektive rente +FV = FV ## Returnerer fremtidsværdien af en investering +FVSCHEDULE = FVTABEL ## Returnerer den fremtidige værdi af en hovedstol, nÃ¥r der er tilskrevet rente og rentes rente efter forskellige rentesatser +INTRATE = RENTEFOD ## Returnerer renten pÃ¥ et fuldt ud investeret værdipapir +IPMT = R.YDELSE ## Returnerer renten fra en investering for en given periode +IRR = IA ## Returnerer den interne rente for en række pengestrømme +ISPMT = ISPMT ## Beregner den betalte rente i løbet af en bestemt investeringsperiode +MDURATION = MVARIGHED ## Returnerer Macauleys modificerede løbetid for et værdipapir med en formodet pari pÃ¥ kr. 100 +MIRR = MIA ## Returnerer den interne forrentning, hvor positive og negative pengestrømme finansieres til forskellig rente +NOMINAL = NOMINEL ## Returnerer den Ã¥rlige nominelle rente +NPER = NPER ## Returnerer antallet af perioder for en investering +NPV = NUTIDSVÆRDI ## Returnerer nettonutidsværdien for en investering baseret pÃ¥ en række periodiske pengestrømme og en diskonteringssats +ODDFPRICE = ULIGE.KURS.PÃ…LYDENDE ## Returnerer kursen pr. kr. 100 nominel værdi for et værdipapir med en ulige (kort eller lang) første periode +ODDFYIELD = ULIGE.FØRSTE.AFKAST ## Returnerer afkastet for et værdipapir med ulige første periode +ODDLPRICE = ULIGE.SIDSTE.KURS ## Returnerer kursen pr. kr. 100 nominel værdi for et værdipapir med ulige sidste periode +ODDLYIELD = ULIGE.SIDSTE.AFKAST ## Returnerer afkastet for et værdipapir med ulige sidste periode +PMT = YDELSE ## Returnerer renten fra en investering for en given periode +PPMT = H.YDELSE ## Returnerer ydelsen pÃ¥ hovedstolen for en investering i en given periode +PRICE = KURS ## Returnerer kursen pr. kr 100 nominel værdi for et værdipapir med periodiske renteudbetalinger +PRICEDISC = KURS.DISKONTO ## Returnerer kursen pr. kr 100 nominel værdi for et diskonteret værdipapir +PRICEMAT = KURS.UDLØB ## Returnerer kursen pr. kr 100 nominel værdi for et værdipapir, hvor renten udbetales ved papirets udløb +PV = NV ## Returnerer den nuværende værdi af en investering +RATE = RENTE ## Returnerer renten i hver periode for en annuitet +RECEIVED = MODTAGET.VED.UDLØB ## Returnerer det beløb, der modtages ved udløbet af et fuldt ud investeret værdipapir +SLN = LA ## Returnerer den lineære afskrivning for et aktiv i en enkelt periode +SYD = Ã…RSAFSKRIVNING ## Returnerer den Ã¥rlige afskrivning pÃ¥ et aktiv i en bestemt periode +TBILLEQ = STATSOBLIGATION ## Returnerer det obligationsækvivalente afkast for en statsobligation +TBILLPRICE = STATSOBLIGATION.KURS ## Returnerer kursen pr. kr 100 nominel værdi for en statsobligation +TBILLYIELD = STATSOBLIGATION.AFKAST ## Returnerer en afkastet pÃ¥ en statsobligation +VDB = VSA ## Returnerer afskrivningen pÃ¥ et aktiv i en angivet periode, herunder delperioder, ved brug af dobbeltsaldometoden +XIRR = INTERN.RENTE ## Returnerer den interne rente for en plan over pengestrømme, der ikke behøver at være periodiske +XNPV = NETTO.NUTIDSVÆRDI ## Returnerer nutidsværdien for en plan over pengestrømme, der ikke behøver at være periodiske +YIELD = AFKAST ## Returnerer afkastet for et værdipapir med periodiske renteudbetalinger +YIELDDISC = AFKAST.DISKONTO ## Returnerer det Ã¥rlige afkast for et diskonteret værdipapir, f.eks. en statsobligation +YIELDMAT = AFKAST.UDLØBSDATO ## Returnerer det Ã¥rlige afkast for et værdipapir, hvor renten udbetales ved papirets udløb + + +## +## Information functions Informationsfunktioner +## +CELL = CELLE ## Returnerer oplysninger om formatering, placering eller indhold af en celle +ERROR.TYPE = FEJLTYPE ## Returnerer et tal, der svarer til en fejltype +INFO = INFO ## Returnerer oplysninger om det aktuelle operativmiljø +ISBLANK = ER.TOM ## Returnerer SAND, hvis værdien er tom +ISERR = ER.FJL ## Returnerer SAND, hvis værdien er en fejlværdi undtagen #I/T +ISERROR = ER.FEJL ## Returnerer SAND, hvis værdien er en fejlværdi +ISEVEN = ER.LIGE ## Returnerer SAND, hvis tallet er lige +ISLOGICAL = ER.LOGISK ## Returnerer SAND, hvis værdien er en logisk værdi +ISNA = ER.IKKE.TILGÆNGELIG ## Returnerer SAND, hvis værdien er fejlværdien #I/T +ISNONTEXT = ER.IKKE.TEKST ## Returnerer SAND, hvis værdien ikke er tekst +ISNUMBER = ER.TAL ## Returnerer SAND, hvis værdien er et tal +ISODD = ER.ULIGE ## Returnerer SAND, hvis tallet er ulige +ISREF = ER.REFERENCE ## Returnerer SAND, hvis værdien er en reference +ISTEXT = ER.TEKST ## Returnerer SAND, hvis værdien er tekst +N = TAL ## Returnerer en værdi konverteret til et tal +NA = IKKE.TILGÆNGELIG ## Returnerer fejlværdien #I/T +TYPE = VÆRDITYPE ## Returnerer et tal, der angiver datatypen for en værdi + + +## +## Logical functions Logiske funktioner +## +AND = OG ## Returnerer SAND, hvis alle argumenterne er sande +FALSE = FALSK ## Returnerer den logiske værdi FALSK +IF = HVIS ## Angiver en logisk test, der skal udføres +IFERROR = HVIS.FEJL ## Returnerer en værdi, du angiver, hvis en formel evauleres som en fejl. Returnerer i modsat fald resultatet af formlen +NOT = IKKE ## Vender argumentets logik om +OR = ELLER ## Returneret værdien SAND, hvis mindst ét argument er sandt +TRUE = SAND ## Returnerer den logiske værdi SAND + + +## +## Lookup and reference functions Opslags- og referencefunktioner +## +ADDRESS = ADRESSE ## Returnerer en reference som tekst til en enkelt celle i et regneark +AREAS = OMRÃ…DER ## Returnerer antallet af omrÃ¥der i en reference +CHOOSE = VÆLG ## Vælger en værdi pÃ¥ en liste med værdier +COLUMN = KOLONNE ## Returnerer kolonnenummeret i en reference +COLUMNS = KOLONNER ## Returnerer antallet af kolonner i en reference +HLOOKUP = VOPSLAG ## Søger i den øverste række af en matrix og returnerer værdien af den angivne celle +HYPERLINK = HYPERLINK ## Opretter en genvej kaldet et hyperlink, der Ã¥bner et dokument, som er lagret pÃ¥ en netværksserver, pÃ¥ et intranet eller pÃ¥ internettet +INDEX = INDEKS ## Anvender et indeks til at vælge en værdi fra en reference eller en matrix +INDIRECT = INDIREKTE ## Returnerer en reference, der er angivet af en tekstværdi +LOOKUP = SLÃ….OP ## Søger værdier i en vektor eller en matrix +MATCH = SAMMENLIGN ## Søger værdier i en reference eller en matrix +OFFSET = FORSKYDNING ## Returnerer en reference forskudt i forhold til en given reference +ROW = RÆKKE ## Returnerer rækkenummeret for en reference +ROWS = RÆKKER ## Returnerer antallet af rækker i en reference +RTD = RTD ## Henter realtidsdata fra et program, der understøtter COM-automatisering (Automation: En metode til at arbejde med objekter fra et andet program eller udviklingsværktøj. Automation, som tidligere blev kaldt OLE Automation, er en industristandard og en funktion i COM (Component Object Model).) +TRANSPOSE = TRANSPONER ## Returnerer en transponeret matrix +VLOOKUP = LOPSLAG ## Søger i øverste række af en matrix og flytter pÃ¥ tværs af rækken for at returnere en celleværdi + + +## +## Math and trigonometry functions Matematiske og trigonometriske funktioner +## +ABS = ABS ## Returnerer den absolutte værdi af et tal +ACOS = ARCCOS ## Returnerer et tals arcus cosinus +ACOSH = ARCCOSH ## Returnerer den inverse hyperbolske cosinus af tal +ASIN = ARCSIN ## Returnerer et tals arcus sinus +ASINH = ARCSINH ## Returnerer den inverse hyperbolske sinus for tal +ATAN = ARCTAN ## Returnerer et tals arcus tangens +ATAN2 = ARCTAN2 ## Returnerer de angivne x- og y-koordinaters arcus tangens +ATANH = ARCTANH ## Returnerer et tals inverse hyperbolske tangens +CEILING = AFRUND.LOFT ## Afrunder et tal til nærmeste heltal eller til nærmeste multiplum af betydning +COMBIN = KOMBIN ## Returnerer antallet af kombinationer for et givet antal objekter +COS = COS ## Returnerer et tals cosinus +COSH = COSH ## Returnerer den inverse hyperbolske cosinus af et tal +DEGREES = GRADER ## Konverterer radianer til grader +EVEN = LIGE ## Runder et tal op til nærmeste lige heltal +EXP = EKSP ## Returnerer e opløftet til en potens af et angivet tal +FACT = FAKULTET ## Returnerer et tals fakultet +FACTDOUBLE = DOBBELT.FAKULTET ## Returnerer et tals dobbelte fakultet +FLOOR = AFRUND.GULV ## Runder et tal ned mod nul +GCD = STØRSTE.FÆLLES.DIVISOR ## Returnerer den største fælles divisor +INT = HELTAL ## Nedrunder et tal til det nærmeste heltal +LCM = MINDSTE.FÆLLES.MULTIPLUM ## Returnerer det mindste fælles multiplum +LN = LN ## Returnerer et tals naturlige logaritme +LOG = LOG ## Returnerer logaritmen for et tal pÃ¥ grundlag af et angivet grundtal +LOG10 = LOG10 ## Returnerer titalslogaritmen af et tal +MDETERM = MDETERM ## Returnerer determinanten for en matrix +MINVERSE = MINVERT ## Returnerer den inverse matrix for en matrix +MMULT = MPRODUKT ## Returnerer matrixproduktet af to matrixer +MOD = REST ## Returnerer restværdien fra division +MROUND = MAFRUND ## Returnerer et tal afrundet til det ønskede multiplum +MULTINOMIAL = MULTINOMIAL ## Returnerer et multinomialt talsæt +ODD = ULIGE ## Runder et tal op til nærmeste ulige heltal +PI = PI ## Returnerer værdien af pi +POWER = POTENS ## Returnerer resultatet af et tal opløftet til en potens +PRODUCT = PRODUKT ## Multiplicerer argumenterne +QUOTIENT = KVOTIENT ## Returnerer heltalsdelen ved division +RADIANS = RADIANER ## Konverterer grader til radianer +RAND = SLUMP ## Returnerer et tilfældigt tal mellem 0 og 1 +RANDBETWEEN = SLUMP.MELLEM ## Returnerer et tilfældigt tal mellem de tal, der angives +ROMAN = ROMERTAL ## Konverterer et arabertal til romertal som tekst +ROUND = AFRUND ## Afrunder et tal til et angivet antal decimaler +ROUNDDOWN = RUND.NED ## Runder et tal ned mod nul +ROUNDUP = RUND.OP ## Runder et tal op, væk fra 0 (nul) +SERIESSUM = SERIESUM ## Returnerer summen af en potensserie baseret pÃ¥ en formel +SIGN = FORTEGN ## Returnerer et tals fortegn +SIN = SIN ## Returnerer en given vinkels sinusværdi +SINH = SINH ## Returnerer den hyperbolske sinus af et tal +SQRT = KVROD ## Returnerer en positiv kvadratrod +SQRTPI = KVRODPI ## Returnerer kvadratroden af (tal * pi;) +SUBTOTAL = SUBTOTAL ## Returnerer en subtotal pÃ¥ en liste eller i en database +SUM = SUM ## Lægger argumenterne sammen +SUMIF = SUM.HVIS ## Lægger de celler sammen, der er specificeret af et givet kriterium. +SUMIFS = SUM.HVISER ## Lægger de celler i et omrÃ¥de sammen, der opfylder flere kriterier. +SUMPRODUCT = SUMPRODUKT ## Returnerer summen af produkter af ens matrixkomponenter +SUMSQ = SUMKV ## Returnerer summen af argumenternes kvadrater +SUMX2MY2 = SUMX2MY2 ## Returnerer summen af differensen mellem kvadrater af ens værdier i to matrixer +SUMX2PY2 = SUMX2PY2 ## Returnerer summen af summen af kvadrater af tilsvarende værdier i to matrixer +SUMXMY2 = SUMXMY2 ## Returnerer summen af kvadrater af differenser mellem ens værdier i to matrixer +TAN = TAN ## Returnerer et tals tangens +TANH = TANH ## Returnerer et tals hyperbolske tangens +TRUNC = AFKORT ## Afkorter et tal til et heltal + + +## +## Statistical functions Statistiske funktioner +## +AVEDEV = MAD ## Returnerer den gennemsnitlige numeriske afvigelse fra stikprøvens middelværdi +AVERAGE = MIDDEL ## Returnerer middelværdien af argumenterne +AVERAGEA = MIDDELV ## Returnerer middelværdien af argumenterne og medtager tal, tekst og logiske værdier +AVERAGEIF = MIDDEL.HVIS ## Returnerer gennemsnittet (den aritmetiske middelværdi) af alle de celler, der opfylder et givet kriterium, i et omrÃ¥de +AVERAGEIFS = MIDDEL.HVISER ## Returnerer gennemsnittet (den aritmetiske middelværdi) af alle de celler, der opfylder flere kriterier. +BETADIST = BETAFORDELING ## Returnerer den kumulative betafordelingsfunktion +BETAINV = BETAINV ## Returnerer den inverse kumulative fordelingsfunktion for en angivet betafordeling +BINOMDIST = BINOMIALFORDELING ## Returnerer punktsandsynligheden for binomialfordelingen +CHIDIST = CHIFORDELING ## Returnerer fraktilsandsynligheden for en chi2-fordeling +CHIINV = CHIINV ## Returnerer den inverse fraktilsandsynlighed for en chi2-fordeling +CHITEST = CHITEST ## Foretager en test for uafhængighed +CONFIDENCE = KONFIDENSINTERVAL ## Returnerer et konfidensinterval for en population +CORREL = KORRELATION ## Returnerer korrelationskoefficienten mellem to datasæt +COUNT = TÆL ## Tæller antallet af tal pÃ¥ en liste med argumenter +COUNTA = TÆLV ## Tæller antallet af værdier pÃ¥ en liste med argumenter +COUNTBLANK = ANTAL.BLANKE ## Tæller antallet af tomme celler i et omrÃ¥de +COUNTIF = TÆLHVIS ## Tæller antallet af celler, som opfylder de givne kriterier, i et omrÃ¥de +COUNTIFS = TÆL.HVISER ## Tæller antallet af de celler, som opfylder flere kriterier, i et omrÃ¥de +COVAR = KOVARIANS ## Beregner kovariansen mellem to stokastiske variabler +CRITBINOM = KRITBINOM ## Returnerer den mindste værdi for x, for hvilken det gælder, at fordelingsfunktionen er mindre end eller lig med kriterieværdien. +DEVSQ = SAK ## Returnerer summen af de kvadrerede afvigelser fra middelværdien +EXPONDIST = EKSPFORDELING ## Returnerer eksponentialfordelingen +FDIST = FFORDELING ## Returnerer fraktilsandsynligheden for F-fordelingen +FINV = FINV ## Returnerer den inverse fraktilsandsynlighed for F-fordelingen +FISHER = FISHER ## Returnerer Fisher-transformationen +FISHERINV = FISHERINV ## Returnerer den inverse Fisher-transformation +FORECAST = PROGNOSE ## Returnerer en prognoseværdi baseret pÃ¥ lineær tendens +FREQUENCY = FREKVENS ## Returnerer en frekvensfordeling i en søjlevektor +FTEST = FTEST ## Returnerer resultatet af en F-test til sammenligning af varians +GAMMADIST = GAMMAFORDELING ## Returnerer fordelingsfunktionen for gammafordelingen +GAMMAINV = GAMMAINV ## Returnerer den inverse fordelingsfunktion for gammafordelingen +GAMMALN = GAMMALN ## Returnerer den naturlige logaritme til gammafordelingen, G(x) +GEOMEAN = GEOMIDDELVÆRDI ## Returnerer det geometriske gennemsnit +GROWTH = FORØGELSE ## Returnerer værdier langs en eksponentiel tendens +HARMEAN = HARMIDDELVÆRDI ## Returnerer det harmoniske gennemsnit +HYPGEOMDIST = HYPGEOFORDELING ## Returnerer punktsandsynligheden i en hypergeometrisk fordeling +INTERCEPT = SKÆRING ## Returnerer afskæringsværdien pÃ¥ y-aksen i en lineær regression +KURT = TOPSTEJL ## Returnerer kurtosisværdien for en stokastisk variabel +LARGE = STOR ## Returnerer den k'te største værdi i et datasæt +LINEST = LINREGR ## Returnerer parameterestimaterne for en lineær tendens +LOGEST = LOGREGR ## Returnerer parameterestimaterne for en eksponentiel tendens +LOGINV = LOGINV ## Returnerer den inverse fordelingsfunktion for lognormalfordelingen +LOGNORMDIST = LOGNORMFORDELING ## Returnerer fordelingsfunktionen for lognormalfordelingen +MAX = MAKS ## Returnerer den maksimale værdi pÃ¥ en liste med argumenter. +MAXA = MAKSV ## Returnerer den maksimale værdi pÃ¥ en liste med argumenter og medtager tal, tekst og logiske værdier +MEDIAN = MEDIAN ## Returnerer medianen for de angivne tal +MIN = MIN ## Returnerer den mindste værdi pÃ¥ en liste med argumenter. +MINA = MINV ## Returnerer den mindste værdi pÃ¥ en liste med argumenter og medtager tal, tekst og logiske værdier +MODE = HYPPIGST ## Returnerer den hyppigste værdi i et datasæt +NEGBINOMDIST = NEGBINOMFORDELING ## Returnerer den negative binomialfordeling +NORMDIST = NORMFORDELING ## Returnerer fordelingsfunktionen for normalfordelingen +NORMINV = NORMINV ## Returnerer den inverse fordelingsfunktion for normalfordelingen +NORMSDIST = STANDARDNORMFORDELING ## Returnerer fordelingsfunktionen for standardnormalfordelingen +NORMSINV = STANDARDNORMINV ## Returnerer den inverse fordelingsfunktion for standardnormalfordelingen +PEARSON = PEARSON ## Returnerer Pearsons korrelationskoefficient +PERCENTILE = FRAKTIL ## Returnerer den k'te fraktil for datasættet +PERCENTRANK = PROCENTPLADS ## Returnerer den procentuelle rang for en given værdi i et datasæt +PERMUT = PERMUT ## Returnerer antallet af permutationer for et givet sæt objekter +POISSON = POISSON ## Returnerer fordelingsfunktionen for en Poisson-fordeling +PROB = SANDSYNLIGHED ## Returnerer intervalsandsynligheden +QUARTILE = KVARTIL ## Returnerer kvartilen i et givet datasæt +RANK = PLADS ## Returnerer rangen for et tal pÃ¥ en liste med tal +RSQ = FORKLARINGSGRAD ## Returnerer R2-værdien fra en simpel lineær regression +SKEW = SKÆVHED ## Returnerer skævheden for en stokastisk variabel +SLOPE = HÆLDNING ## Returnerer estimatet pÃ¥ hældningen fra en simpel lineær regression +SMALL = MINDSTE ## Returnerer den k'te mindste værdi i datasættet +STANDARDIZE = STANDARDISER ## Returnerer en standardiseret værdi +STDEV = STDAFV ## Estimerer standardafvigelsen pÃ¥ basis af en stikprøve +STDEVA = STDAFVV ## Beregner standardafvigelsen pÃ¥ basis af en prøve og medtager tal, tekst og logiske værdier +STDEVP = STDAFVP ## Beregner standardafvigelsen pÃ¥ basis af en hel population +STDEVPA = STDAFVPV ## Beregner standardafvigelsen pÃ¥ basis af en hel population og medtager tal, tekst og logiske værdier +STEYX = STFYX ## Returnerer standardafvigelsen for de estimerede y-værdier i den simple lineære regression +TDIST = TFORDELING ## Returnerer fordelingsfunktionen for Student's t-fordeling +TINV = TINV ## Returnerer den inverse fordelingsfunktion for Student's t-fordeling +TREND = TENDENS ## Returnerer værdi under antagelse af en lineær tendens +TRIMMEAN = TRIMMIDDELVÆRDI ## Returnerer den trimmede middelværdi for datasættet +TTEST = TTEST ## Returnerer den sandsynlighed, der er forbundet med Student's t-test +VAR = VARIANS ## Beregner variansen pÃ¥ basis af en prøve +VARA = VARIANSV ## Beregner variansen pÃ¥ basis af en prøve og medtager tal, tekst og logiske værdier +VARP = VARIANSP ## Beregner variansen pÃ¥ basis af hele populationen +VARPA = VARIANSPV ## Beregner variansen pÃ¥ basis af hele populationen og medtager tal, tekst og logiske værdier +WEIBULL = WEIBULL ## Returnerer fordelingsfunktionen for Weibull-fordelingen +ZTEST = ZTEST ## Returnerer sandsynlighedsværdien ved en en-sidet z-test + + +## +## Text functions Tekstfunktioner +## +ASC = ASC ## Ændrer engelske tegn i fuld bredde (dobbelt-byte) eller katakana i en tegnstreng til tegn i halv bredde (enkelt-byte) +BAHTTEXT = BAHTTEKST ## Konverterer et tal til tekst ved hjælp af valutaformatet ß (baht) +CHAR = TEGN ## Returnerer det tegn, der svarer til kodenummeret +CLEAN = RENS ## Fjerner alle tegn, der ikke kan udskrives, fra tekst +CODE = KODE ## Returnerer en numerisk kode for det første tegn i en tekststreng +CONCATENATE = SAMMENKÆDNING ## Sammenkæder adskillige tekstelementer til ét tekstelement +DOLLAR = KR ## Konverterer et tal til tekst ved hjælp af valutaformatet kr. (kroner) +EXACT = EKSAKT ## Kontrollerer, om to tekstværdier er identiske +FIND = FIND ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes mellem store og smÃ¥ bogstaver) +FINDB = FINDB ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes mellem store og smÃ¥ bogstaver) +FIXED = FAST ## Formaterer et tal som tekst med et fast antal decimaler +JIS = JIS ## Ændrer engelske tegn i halv bredde (enkelt-byte) eller katakana i en tegnstreng til tegn i fuld bredde (dobbelt-byte) +LEFT = VENSTRE ## Returnerer tegnet længst til venstre i en tekstværdi +LEFTB = VENSTREB ## Returnerer tegnet længst til venstre i en tekstværdi +LEN = LÆNGDE ## Returnerer antallet af tegn i en tekststreng +LENB = LÆNGDEB ## Returnerer antallet af tegn i en tekststreng +LOWER = SMÃ….BOGSTAVER ## Konverterer tekst til smÃ¥ bogstaver +MID = MIDT ## Returnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition +MIDB = MIDTB ## Returnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition +PHONETIC = FONETISK ## Uddrager de fonetiske (furigana) tegn fra en tekststreng +PROPER = STORT.FORBOGSTAV ## Konverterer første bogstav i hvert ord i teksten til stort bogstav +REPLACE = ERSTAT ## Erstatter tegn i tekst +REPLACEB = ERSTATB ## Erstatter tegn i tekst +REPT = GENTAG ## Gentager tekst et givet antal gange +RIGHT = HØJRE ## Returnerer tegnet længste til højre i en tekstværdi +RIGHTB = HØJREB ## Returnerer tegnet længste til højre i en tekstværdi +SEARCH = SØG ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes ikke mellem store og smÃ¥ bogstaver) +SEARCHB = SØGB ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes ikke mellem store og smÃ¥ bogstaver) +SUBSTITUTE = UDSKIFT ## Udskifter gammel tekst med ny tekst i en tekststreng +T = T ## Konverterer argumenterne til tekst +TEXT = TEKST ## Formaterer et tal og konverterer det til tekst +TRIM = FJERN.OVERFLØDIGE.BLANKE ## Fjerner mellemrum fra tekst +UPPER = STORE.BOGSTAVER ## Konverterer tekst til store bogstaver +VALUE = VÆRDI ## Konverterer et tekstargument til et tal diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/de/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/de/config new file mode 100644 index 000000000..95193498f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/de/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NULL! +DIV0 = #DIV/0! +VALUE = #WERT! +REF = #BEZUG! +NAME = #NAME? +NUM = #ZAHL! +NA = #NV diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/de/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/de/functions new file mode 100644 index 000000000..1c19c5b22 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/de/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Add-In- und Automatisierungsfunktionen +## +GETPIVOTDATA = PIVOTDATENZUORDNEN ## In einem PivotTable-Bericht gespeicherte Daten werden zurückgegeben. + + +## +## Cube functions Cubefunktionen +## +CUBEKPIMEMBER = CUBEKPIELEMENT ## Gibt Name, Eigenschaft und Measure eines Key Performance Indicators (KPI) zurück und zeigt den Namen und die Eigenschaft in der Zelle an. Ein KPI ist ein quantifizierbares Maß, wie z. B. der monatliche Bruttogewinn oder die vierteljährliche Mitarbeiterfluktuation, mit dessen Hilfe das Leistungsverhalten eines Unternehmens überwacht werden kann. +CUBEMEMBER = CUBEELEMENT ## Gibt ein Element oder ein Tuple in einer Cubehierarchie zurück. Wird verwendet, um zu überprüfen, ob das Element oder Tuple im Cube vorhanden ist. +CUBEMEMBERPROPERTY = CUBEELEMENTEIGENSCHAFT ## Gibt den Wert einer Elementeigenschaft im Cube zurück. Wird verwendet, um zu überprüfen, ob ein Elementname im Cube vorhanden ist, und um die für dieses Element angegebene Eigenschaft zurückzugeben. +CUBERANKEDMEMBER = CUBERANGELEMENT ## Gibt das n-te oder n-rangige Element in einer Menge zurück. Wird verwendet, um mindestens ein Element in einer Menge zurückzugeben, wie z. B. bester Vertriebsmitarbeiter oder 10 beste Kursteilnehmer. +CUBESET = CUBEMENGE ## Definiert eine berechnete Menge Elemente oder Tuples durch Senden eines Mengenausdrucks an den Cube auf dem Server, der die Menge erstellt und an Microsoft Office Excel zurückgibt. +CUBESETCOUNT = CUBEMENGENANZAHL ## Gibt die Anzahl der Elemente in einer Menge zurück. +CUBEVALUE = CUBEWERT ## Gibt einen Aggregatwert aus einem Cube zurück. + + +## +## Database functions Datenbankfunktionen +## +DAVERAGE = DBMITTELWERT ## Gibt den Mittelwert der ausgewählten Datenbankeinträge zurück +DCOUNT = DBANZAHL ## Zählt die Zellen mit Zahlen in einer Datenbank +DCOUNTA = DBANZAHL2 ## Zählt nicht leere Zellen in einer Datenbank +DGET = DBAUSZUG ## Extrahiert aus einer Datenbank einen einzelnen Datensatz, der den angegebenen Kriterien entspricht +DMAX = DBMAX ## Gibt den größten Wert aus ausgewählten Datenbankeinträgen zurück +DMIN = DBMIN ## Gibt den kleinsten Wert aus ausgewählten Datenbankeinträgen zurück +DPRODUCT = DBPRODUKT ## Multipliziert die Werte in einem bestimmten Feld mit Datensätzen, die den Kriterien in einer Datenbank entsprechen +DSTDEV = DBSTDABW ## Schätzt die Standardabweichung auf der Grundlage einer Stichprobe aus ausgewählten Datenbankeinträgen +DSTDEVP = DBSTDABWN ## Berechnet die Standardabweichung auf der Grundlage der Grundgesamtheit ausgewählter Datenbankeinträge +DSUM = DBSUMME ## Addiert die Zahlen in der Feldspalte mit Datensätzen in der Datenbank, die den Kriterien entsprechen +DVAR = DBVARIANZ ## Schätzt die Varianz auf der Grundlage ausgewählter Datenbankeinträge +DVARP = DBVARIANZEN ## Berechnet die Varianz auf der Grundlage der Grundgesamtheit ausgewählter Datenbankeinträge + + +## +## Date and time functions Datums- und Zeitfunktionen +## +DATE = DATUM ## Gibt die fortlaufende Zahl eines bestimmten Datums zurück +DATEVALUE = DATWERT ## Wandelt ein Datum in Form von Text in eine fortlaufende Zahl um +DAY = TAG ## Wandelt eine fortlaufende Zahl in den Tag des Monats um +DAYS360 = TAGE360 ## Berechnet die Anzahl der Tage zwischen zwei Datumsangaben ausgehend von einem Jahr, das 360 Tage hat +EDATE = EDATUM ## Gibt die fortlaufende Zahl des Datums zurück, bei dem es sich um die angegebene Anzahl von Monaten vor oder nach dem Anfangstermin handelt +EOMONTH = MONATSENDE ## Gibt die fortlaufende Zahl des letzten Tags des Monats vor oder nach einer festgelegten Anzahl von Monaten zurück +HOUR = STUNDE ## Wandelt eine fortlaufende Zahl in eine Stunde um +MINUTE = MINUTE ## Wandelt eine fortlaufende Zahl in eine Minute um +MONTH = MONAT ## Wandelt eine fortlaufende Zahl in einen Monat um +NETWORKDAYS = NETTOARBEITSTAGE ## Gibt die Anzahl von ganzen Arbeitstagen zwischen zwei Datumswerten zurück +NOW = JETZT ## Gibt die fortlaufende Zahl des aktuellen Datums und der aktuellen Uhrzeit zurück +SECOND = SEKUNDE ## Wandelt eine fortlaufende Zahl in eine Sekunde um +TIME = ZEIT ## Gibt die fortlaufende Zahl einer bestimmten Uhrzeit zurück +TIMEVALUE = ZEITWERT ## Wandelt eine Uhrzeit in Form von Text in eine fortlaufende Zahl um +TODAY = HEUTE ## Gibt die fortlaufende Zahl des heutigen Datums zurück +WEEKDAY = WOCHENTAG ## Wandelt eine fortlaufende Zahl in den Wochentag um +WEEKNUM = KALENDERWOCHE ## Wandelt eine fortlaufende Zahl in eine Zahl um, die angibt, in welche Woche eines Jahres das angegebene Datum fällt +WORKDAY = ARBEITSTAG ## Gibt die fortlaufende Zahl des Datums vor oder nach einer bestimmten Anzahl von Arbeitstagen zurück +YEAR = JAHR ## Wandelt eine fortlaufende Zahl in ein Jahr um +YEARFRAC = BRTEILJAHRE ## Gibt die Anzahl der ganzen Tage zwischen Ausgangsdatum und Enddatum in Bruchteilen von Jahren zurück + + +## +## Engineering functions Konstruktionsfunktionen +## +BESSELI = BESSELI ## Gibt die geänderte Besselfunktion In(x) zurück +BESSELJ = BESSELJ ## Gibt die Besselfunktion Jn(x) zurück +BESSELK = BESSELK ## Gibt die geänderte Besselfunktion Kn(x) zurück +BESSELY = BESSELY ## Gibt die Besselfunktion Yn(x) zurück +BIN2DEC = BININDEZ ## Wandelt eine binäre Zahl (Dualzahl) in eine dezimale Zahl um +BIN2HEX = BININHEX ## Wandelt eine binäre Zahl (Dualzahl) in eine hexadezimale Zahl um +BIN2OCT = BININOKT ## Wandelt eine binäre Zahl (Dualzahl) in eine oktale Zahl um +COMPLEX = KOMPLEXE ## Wandelt den Real- und Imaginärteil in eine komplexe Zahl um +CONVERT = UMWANDELN ## Wandelt eine Zahl von einem Maßsystem in ein anderes um +DEC2BIN = DEZINBIN ## Wandelt eine dezimale Zahl in eine binäre Zahl (Dualzahl) um +DEC2HEX = DEZINHEX ## Wandelt eine dezimale Zahl in eine hexadezimale Zahl um +DEC2OCT = DEZINOKT ## Wandelt eine dezimale Zahl in eine oktale Zahl um +DELTA = DELTA ## Überprüft, ob zwei Werte gleich sind +ERF = GAUSSFEHLER ## Gibt die Gauss'sche Fehlerfunktion zurück +ERFC = GAUSSFKOMPL ## Gibt das Komplement zur Gauss'schen Fehlerfunktion zurück +GESTEP = GGANZZAHL ## Überprüft, ob eine Zahl größer als ein gegebener Schwellenwert ist +HEX2BIN = HEXINBIN ## Wandelt eine hexadezimale Zahl in eine Binärzahl um +HEX2DEC = HEXINDEZ ## Wandelt eine hexadezimale Zahl in eine dezimale Zahl um +HEX2OCT = HEXINOKT ## Wandelt eine hexadezimale Zahl in eine Oktalzahl um +IMABS = IMABS ## Gibt den Absolutbetrag (Modulo) einer komplexen Zahl zurück +IMAGINARY = IMAGINÄRTEIL ## Gibt den Imaginärteil einer komplexen Zahl zurück +IMARGUMENT = IMARGUMENT ## Gibt das Argument Theta zurück, einen Winkel, der als Bogenmaß ausgedrückt wird +IMCONJUGATE = IMKONJUGIERTE ## Gibt die konjugierte komplexe Zahl zu einer komplexen Zahl zurück +IMCOS = IMCOS ## Gibt den Kosinus einer komplexen Zahl zurück +IMDIV = IMDIV ## Gibt den Quotienten zweier komplexer Zahlen zurück +IMEXP = IMEXP ## Gibt die algebraische Form einer in exponentieller Schreibweise vorliegenden komplexen Zahl zurück +IMLN = IMLN ## Gibt den natürlichen Logarithmus einer komplexen Zahl zurück +IMLOG10 = IMLOG10 ## Gibt den Logarithmus einer komplexen Zahl zur Basis 10 zurück +IMLOG2 = IMLOG2 ## Gibt den Logarithmus einer komplexen Zahl zur Basis 2 zurück +IMPOWER = IMAPOTENZ ## Potenziert eine komplexe Zahl mit einer ganzen Zahl +IMPRODUCT = IMPRODUKT ## Gibt das Produkt von komplexen Zahlen zurück +IMREAL = IMREALTEIL ## Gibt den Realteil einer komplexen Zahl zurück +IMSIN = IMSIN ## Gibt den Sinus einer komplexen Zahl zurück +IMSQRT = IMWURZEL ## Gibt die Quadratwurzel einer komplexen Zahl zurück +IMSUB = IMSUB ## Gibt die Differenz zwischen zwei komplexen Zahlen zurück +IMSUM = IMSUMME ## Gibt die Summe von komplexen Zahlen zurück +OCT2BIN = OKTINBIN ## Wandelt eine oktale Zahl in eine binäre Zahl (Dualzahl) um +OCT2DEC = OKTINDEZ ## Wandelt eine oktale Zahl in eine dezimale Zahl um +OCT2HEX = OKTINHEX ## Wandelt eine oktale Zahl in eine hexadezimale Zahl um + + +## +## Financial functions Finanzmathematische Funktionen +## +ACCRINT = AUFGELZINS ## Gibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers mit periodischen Zinszahlungen zurück +ACCRINTM = AUFGELZINSF ## Gibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers zurück, die bei Fälligkeit ausgezahlt werden +AMORDEGRC = AMORDEGRK ## Gibt die Abschreibung für die einzelnen Abschreibungszeiträume mithilfe eines Abschreibungskoeffizienten zurück +AMORLINC = AMORLINEARK ## Gibt die Abschreibung für die einzelnen Abschreibungszeiträume zurück +COUPDAYBS = ZINSTERMTAGVA ## Gibt die Anzahl der Tage vom Anfang des Zinstermins bis zum Abrechnungstermin zurück +COUPDAYS = ZINSTERMTAGE ## Gibt die Anzahl der Tage der Zinsperiode zurück, die den Abrechnungstermin einschließt +COUPDAYSNC = ZINSTERMTAGNZ ## Gibt die Anzahl der Tage vom Abrechnungstermin bis zum nächsten Zinstermin zurück +COUPNCD = ZINSTERMNZ ## Gibt das Datum des ersten Zinstermins nach dem Abrechnungstermin zurück +COUPNUM = ZINSTERMZAHL ## Gibt die Anzahl der Zinstermine zwischen Abrechnungs- und Fälligkeitsdatum zurück +COUPPCD = ZINSTERMVZ ## Gibt das Datum des letzten Zinstermins vor dem Abrechnungstermin zurück +CUMIPMT = KUMZINSZ ## Berechnet die kumulierten Zinsen, die zwischen zwei Perioden zu zahlen sind +CUMPRINC = KUMKAPITAL ## Berechnet die aufgelaufene Tilgung eines Darlehens, die zwischen zwei Perioden zu zahlen ist +DB = GDA2 ## Gibt die geometrisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück +DDB = GDA ## Gibt die Abschreibung eines Anlageguts für einen angegebenen Zeitraum unter Verwendung der degressiven Doppelraten-Abschreibung oder eines anderen von Ihnen angegebenen Abschreibungsverfahrens zurück +DISC = DISAGIO ## Gibt den in Prozent ausgedrückten Abzinsungssatz eines Wertpapiers zurück +DOLLARDE = NOTIERUNGDEZ ## Wandelt eine Notierung, die als Dezimalbruch ausgedrückt wurde, in eine Dezimalzahl um +DOLLARFR = NOTIERUNGBRU ## Wandelt eine Notierung, die als Dezimalzahl ausgedrückt wurde, in einen Dezimalbruch um +DURATION = DURATION ## Gibt die jährliche Duration eines Wertpapiers mit periodischen Zinszahlungen zurück +EFFECT = EFFEKTIV ## Gibt die jährliche Effektivverzinsung zurück +FV = ZW ## Gibt den zukünftigen Wert (Endwert) einer Investition zurück +FVSCHEDULE = ZW2 ## Gibt den aufgezinsten Wert des Anfangskapitals für eine Reihe periodisch unterschiedlicher Zinssätze zurück +INTRATE = ZINSSATZ ## Gibt den Zinssatz eines voll investierten Wertpapiers zurück +IPMT = ZINSZ ## Gibt die Zinszahlung einer Investition für die angegebene Periode zurück +IRR = IKV ## Gibt den internen Zinsfuß einer Investition ohne Finanzierungskosten oder Reinvestitionsgewinne zurück +ISPMT = ISPMT ## Berechnet die während eines bestimmten Zeitraums für eine Investition gezahlten Zinsen +MDURATION = MDURATION ## Gibt die geänderte Dauer für ein Wertpapier mit einem angenommenen Nennwert von 100 € zurück +MIRR = QIKV ## Gibt den internen Zinsfuß zurück, wobei positive und negative Zahlungen zu unterschiedlichen Sätzen finanziert werden +NOMINAL = NOMINAL ## Gibt die jährliche Nominalverzinsung zurück +NPER = ZZR ## Gibt die Anzahl der Zahlungsperioden einer Investition zurück +NPV = NBW ## Gibt den Nettobarwert einer Investition auf Basis periodisch anfallender Zahlungen und eines Abzinsungsfaktors zurück +ODDFPRICE = UNREGER.KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück +ODDFYIELD = UNREGER.REND ## Gibt die Rendite eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück +ODDLPRICE = UNREGLE.KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück +ODDLYIELD = UNREGLE.REND ## Gibt die Rendite eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück +PMT = RMZ ## Gibt die periodische Zahlung für eine Annuität zurück +PPMT = KAPZ ## Gibt die Kapitalrückzahlung einer Investition für eine angegebene Periode zurück +PRICE = KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das periodisch Zinsen auszahlt +PRICEDISC = KURSDISAGIO ## Gibt den Kurs pro 100 € Nennwert eines unverzinslichen Wertpapiers zurück +PRICEMAT = KURSFÄLLIG ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das Zinsen am Fälligkeitsdatum auszahlt +PV = BW ## Gibt den Barwert einer Investition zurück +RATE = ZINS ## Gibt den Zinssatz pro Zeitraum einer Annuität zurück +RECEIVED = AUSZAHLUNG ## Gibt den Auszahlungsbetrag eines voll investierten Wertpapiers am Fälligkeitstermin zurück +SLN = LIA ## Gibt die lineare Abschreibung eines Wirtschaftsguts pro Periode zurück +SYD = DIA ## Gibt die arithmetisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück +TBILLEQ = TBILLÄQUIV ## Gibt die Rendite für ein Wertpapier zurück +TBILLPRICE = TBILLKURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück +TBILLYIELD = TBILLRENDITE ## Gibt die Rendite für ein Wertpapier zurück +VDB = VDB ## Gibt die degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode oder Teilperiode zurück +XIRR = XINTZINSFUSS ## Gibt den internen Zinsfuß einer Reihe nicht periodisch anfallender Zahlungen zurück +XNPV = XKAPITALWERT ## Gibt den Nettobarwert (Kapitalwert) einer Reihe nicht periodisch anfallender Zahlungen zurück +YIELD = RENDITE ## Gibt die Rendite eines Wertpapiers zurück, das periodisch Zinsen auszahlt +YIELDDISC = RENDITEDIS ## Gibt die jährliche Rendite eines unverzinslichen Wertpapiers zurück +YIELDMAT = RENDITEFÄLL ## Gibt die jährliche Rendite eines Wertpapiers zurück, das Zinsen am Fälligkeitsdatum auszahlt + + +## +## Information functions Informationsfunktionen +## +CELL = ZELLE ## Gibt Informationen zu Formatierung, Position oder Inhalt einer Zelle zurück +ERROR.TYPE = FEHLER.TYP ## Gibt eine Zahl zurück, die einem Fehlertyp entspricht +INFO = INFO ## Gibt Informationen zur aktuellen Betriebssystemumgebung zurück +ISBLANK = ISTLEER ## Gibt WAHR zurück, wenn der Wert leer ist +ISERR = ISTFEHL ## Gibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert außer #N/V ist +ISERROR = ISTFEHLER ## Gibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert ist +ISEVEN = ISTGERADE ## Gibt WAHR zurück, wenn es sich um eine gerade Zahl handelt +ISLOGICAL = ISTLOG ## Gibt WAHR zurück, wenn der Wert ein Wahrheitswert ist +ISNA = ISTNV ## Gibt WAHR zurück, wenn der Wert der Fehlerwert #N/V ist +ISNONTEXT = ISTKTEXT ## Gibt WAHR zurück, wenn der Wert ein Element ist, das keinen Text enthält +ISNUMBER = ISTZAHL ## Gibt WAHR zurück, wenn der Wert eine Zahl ist +ISODD = ISTUNGERADE ## Gibt WAHR zurück, wenn es sich um eine ungerade Zahl handelt +ISREF = ISTBEZUG ## Gibt WAHR zurück, wenn der Wert ein Bezug ist +ISTEXT = ISTTEXT ## Gibt WAHR zurück, wenn der Wert ein Element ist, das Text enthält +N = N ## Gibt den in eine Zahl umgewandelten Wert zurück +NA = NV ## Gibt den Fehlerwert #NV zurück +TYPE = TYP ## Gibt eine Zahl zurück, die den Datentyp des angegebenen Werts anzeigt + + +## +## Logical functions Logische Funktionen +## +AND = UND ## Gibt WAHR zurück, wenn alle zugehörigen Argumente WAHR sind +FALSE = FALSCH ## Gibt den Wahrheitswert FALSCH zurück +IF = WENN ## Gibt einen logischen Test zum Ausführen an +IFERROR = WENNFEHLER ## Gibt einen von Ihnen festgelegten Wert zurück, wenn die Auswertung der Formel zu einem Fehler führt; andernfalls wird das Ergebnis der Formel zurückgegeben +NOT = NICHT ## Kehrt den Wahrheitswert der zugehörigen Argumente um +OR = ODER ## Gibt WAHR zurück, wenn ein Argument WAHR ist +TRUE = WAHR ## Gibt den Wahrheitswert WAHR zurück + + +## +## Lookup and reference functions Nachschlage- und Verweisfunktionen +## +ADDRESS = ADRESSE ## Gibt einen Bezug auf eine einzelne Zelle in einem Tabellenblatt als Text zurück +AREAS = BEREICHE ## Gibt die Anzahl der innerhalb eines Bezugs aufgeführten Bereiche zurück +CHOOSE = WAHL ## Wählt einen Wert aus eine Liste mit Werten aus +COLUMN = SPALTE ## Gibt die Spaltennummer eines Bezugs zurück +COLUMNS = SPALTEN ## Gibt die Anzahl der Spalten in einem Bezug zurück +HLOOKUP = HVERWEIS ## Sucht in der obersten Zeile einer Matrix und gibt den Wert der angegebenen Zelle zurück +HYPERLINK = HYPERLINK ## Erstellt eine Verknüpfung, über die ein auf einem Netzwerkserver, in einem Intranet oder im Internet gespeichertes Dokument geöffnet wird +INDEX = INDEX ## Verwendet einen Index, um einen Wert aus einem Bezug oder einer Matrix auszuwählen +INDIRECT = INDIREKT ## Gibt einen Bezug zurück, der von einem Textwert angegeben wird +LOOKUP = LOOKUP ## Sucht Werte in einem Vektor oder einer Matrix +MATCH = VERGLEICH ## Sucht Werte in einem Bezug oder einer Matrix +OFFSET = BEREICH.VERSCHIEBEN ## Gibt einen Bezugoffset aus einem gegebenen Bezug zurück +ROW = ZEILE ## Gibt die Zeilennummer eines Bezugs zurück +ROWS = ZEILEN ## Gibt die Anzahl der Zeilen in einem Bezug zurück +RTD = RTD ## Ruft Echtzeitdaten von einem Programm ab, das die COM-Automatisierung (Automatisierung: Ein Verfahren, bei dem aus einer Anwendung oder einem Entwicklungstool heraus mit den Objekten einer anderen Anwendung gearbeitet wird. Die früher als OLE-Automatisierung bezeichnete Automatisierung ist ein Industriestandard und eine Funktion von COM (Component Object Model).) unterstützt +TRANSPOSE = MTRANS ## Gibt die transponierte Matrix einer Matrix zurück +VLOOKUP = SVERWEIS ## Sucht in der ersten Spalte einer Matrix und arbeitet sich durch die Zeile, um den Wert einer Zelle zurückzugeben + + +## +## Math and trigonometry functions Mathematische und trigonometrische Funktionen +## +ABS = ABS ## Gibt den Absolutwert einer Zahl zurück +ACOS = ARCCOS ## Gibt den Arkuskosinus einer Zahl zurück +ACOSH = ARCCOSHYP ## Gibt den umgekehrten hyperbolischen Kosinus einer Zahl zurück +ASIN = ARCSIN ## Gibt den Arkussinus einer Zahl zurück +ASINH = ARCSINHYP ## Gibt den umgekehrten hyperbolischen Sinus einer Zahl zurück +ATAN = ARCTAN ## Gibt den Arkustangens einer Zahl zurück +ATAN2 = ARCTAN2 ## Gibt den Arkustangens einer x- und einer y-Koordinate zurück +ATANH = ARCTANHYP ## Gibt den umgekehrten hyperbolischen Tangens einer Zahl zurück +CEILING = OBERGRENZE ## Rundet eine Zahl auf die nächste ganze Zahl oder das nächste Vielfache von Schritt +COMBIN = KOMBINATIONEN ## Gibt die Anzahl der Kombinationen für eine bestimmte Anzahl von Objekten zurück +COS = COS ## Gibt den Kosinus einer Zahl zurück +COSH = COSHYP ## Gibt den hyperbolischen Kosinus einer Zahl zurück +DEGREES = GRAD ## Wandelt Bogenmaß (Radiant) in Grad um +EVEN = GERADE ## Rundet eine Zahl auf die nächste gerade ganze Zahl auf +EXP = EXP ## Potenziert die Basis e mit der als Argument angegebenen Zahl +FACT = FAKULTÄT ## Gibt die Fakultät einer Zahl zurück +FACTDOUBLE = ZWEIFAKULTÄT ## Gibt die Fakultät zu Zahl mit Schrittlänge 2 zurück +FLOOR = UNTERGRENZE ## Rundet die Zahl auf Anzahl_Stellen ab +GCD = GGT ## Gibt den größten gemeinsamen Teiler zurück +INT = GANZZAHL ## Rundet eine Zahl auf die nächstkleinere ganze Zahl ab +LCM = KGV ## Gibt das kleinste gemeinsame Vielfache zurück +LN = LN ## Gibt den natürlichen Logarithmus einer Zahl zurück +LOG = LOG ## Gibt den Logarithmus einer Zahl zu der angegebenen Basis zurück +LOG10 = LOG10 ## Gibt den Logarithmus einer Zahl zur Basis 10 zurück +MDETERM = MDET ## Gibt die Determinante einer Matrix zurück +MINVERSE = MINV ## Gibt die inverse Matrix einer Matrix zurück +MMULT = MMULT ## Gibt das Produkt zweier Matrizen zurück +MOD = REST ## Gibt den Rest einer Division zurück +MROUND = VRUNDEN ## Gibt eine auf das gewünschte Vielfache gerundete Zahl zurück +MULTINOMIAL = POLYNOMIAL ## Gibt den Polynomialkoeffizienten einer Gruppe von Zahlen zurück +ODD = UNGERADE ## Rundet eine Zahl auf die nächste ungerade ganze Zahl auf +PI = PI ## Gibt den Wert Pi zurück +POWER = POTENZ ## Gibt als Ergebnis eine potenzierte Zahl zurück +PRODUCT = PRODUKT ## Multipliziert die zugehörigen Argumente +QUOTIENT = QUOTIENT ## Gibt den ganzzahligen Anteil einer Division zurück +RADIANS = BOGENMASS ## Wandelt Grad in Bogenmaß (Radiant) um +RAND = ZUFALLSZAHL ## Gibt eine Zufallszahl zwischen 0 und 1 zurück +RANDBETWEEN = ZUFALLSBEREICH ## Gibt eine Zufallszahl aus dem festgelegten Bereich zurück +ROMAN = RÖMISCH ## Wandelt eine arabische Zahl in eine römische Zahl als Text um +ROUND = RUNDEN ## Rundet eine Zahl auf eine bestimmte Anzahl von Dezimalstellen +ROUNDDOWN = ABRUNDEN ## Rundet die Zahl auf Anzahl_Stellen ab +ROUNDUP = AUFRUNDEN ## Rundet die Zahl auf Anzahl_Stellen auf +SERIESSUM = POTENZREIHE ## Gibt die Summe von Potenzen (zur Berechnung von Potenzreihen und dichotomen Wahrscheinlichkeiten) zurück +SIGN = VORZEICHEN ## Gibt das Vorzeichen einer Zahl zurück +SIN = SIN ## Gibt den Sinus einer Zahl zurück +SINH = SINHYP ## Gibt den hyperbolischen Sinus einer Zahl zurück +SQRT = WURZEL ## Gibt die Quadratwurzel einer Zahl zurück +SQRTPI = WURZELPI ## Gibt die Wurzel aus der mit Pi (pi) multiplizierten Zahl zurück +SUBTOTAL = TEILERGEBNIS ## Gibt ein Teilergebnis in einer Liste oder Datenbank zurück +SUM = SUMME ## Addiert die zugehörigen Argumente +SUMIF = SUMMEWENN ## Addiert Zahlen, die mit den Suchkriterien übereinstimmen +SUMIFS = SUMMEWENNS ## Die Zellen, die mehrere Kriterien erfüllen, werden in einem Bereich hinzugefügt +SUMPRODUCT = SUMMENPRODUKT ## Gibt die Summe der Produkte zusammengehöriger Matrixkomponenten zurück +SUMSQ = QUADRATESUMME ## Gibt die Summe der quadrierten Argumente zurück +SUMX2MY2 = SUMMEX2MY2 ## Gibt die Summe der Differenzen der Quadrate für zusammengehörige Komponenten zweier Matrizen zurück +SUMX2PY2 = SUMMEX2PY2 ## Gibt die Summe der Quadrate für zusammengehörige Komponenten zweier Matrizen zurück +SUMXMY2 = SUMMEXMY2 ## Gibt die Summe der quadrierten Differenzen für zusammengehörige Komponenten zweier Matrizen zurück +TAN = TAN ## Gibt den Tangens einer Zahl zurück +TANH = TANHYP ## Gibt den hyperbolischen Tangens einer Zahl zurück +TRUNC = KÜRZEN ## Schneidet die Kommastellen einer Zahl ab und gibt als Ergebnis eine ganze Zahl zurück + + +## +## Statistical functions Statistische Funktionen +## +AVEDEV = MITTELABW ## Gibt die durchschnittliche absolute Abweichung einer Reihe von Merkmalsausprägungen und ihrem Mittelwert zurück +AVERAGE = MITTELWERT ## Gibt den Mittelwert der zugehörigen Argumente zurück +AVERAGEA = MITTELWERTA ## Gibt den Mittelwert der zugehörigen Argumente, die Zahlen, Text und Wahrheitswerte enthalten, zurück +AVERAGEIF = MITTELWERTWENN ## Der Durchschnittswert (arithmetisches Mittel) für alle Zellen in einem Bereich, die einem angegebenen Kriterium entsprechen, wird zurückgegeben +AVERAGEIFS = MITTELWERTWENNS ## Gibt den Durchschnittswert (arithmetisches Mittel) aller Zellen zurück, die mehreren Kriterien entsprechen +BETADIST = BETAVERT ## Gibt die Werte der kumulierten Betaverteilungsfunktion zurück +BETAINV = BETAINV ## Gibt das Quantil der angegebenen Betaverteilung zurück +BINOMDIST = BINOMVERT ## Gibt Wahrscheinlichkeiten einer binomialverteilten Zufallsvariablen zurück +CHIDIST = CHIVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer Chi-Quadrat-verteilten Zufallsgröße zurück +CHIINV = CHIINV ## Gibt Quantile der Verteilungsfunktion (1-Alpha) der Chi-Quadrat-Verteilung zurück +CHITEST = CHITEST ## Gibt die Teststatistik eines Unabhängigkeitstests zurück +CONFIDENCE = KONFIDENZ ## Ermöglicht die Berechnung des 1-Alpha Konfidenzintervalls für den Erwartungswert einer Zufallsvariablen +CORREL = KORREL ## Gibt den Korrelationskoeffizienten zweier Reihen von Merkmalsausprägungen zurück +COUNT = ANZAHL ## Gibt die Anzahl der Zahlen in der Liste mit Argumenten an +COUNTA = ANZAHL2 ## Gibt die Anzahl der Werte in der Liste mit Argumenten an +COUNTBLANK = ANZAHLLEEREZELLEN ## Gibt die Anzahl der leeren Zellen in einem Bereich an +COUNTIF = ZÄHLENWENN ## Gibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit den Suchkriterien übereinstimmen +COUNTIFS = ZÄHLENWENNS ## Gibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit mehreren Suchkriterien übereinstimmen +COVAR = KOVAR ## Gibt die Kovarianz zurück, den Mittelwert der für alle Datenpunktpaare gebildeten Produkte der Abweichungen +CRITBINOM = KRITBINOM ## Gibt den kleinsten Wert zurück, für den die kumulierten Wahrscheinlichkeiten der Binomialverteilung kleiner oder gleich einer Grenzwahrscheinlichkeit sind +DEVSQ = SUMQUADABW ## Gibt die Summe der quadrierten Abweichungen der Datenpunkte von ihrem Stichprobenmittelwert zurück +EXPONDIST = EXPONVERT ## Gibt Wahrscheinlichkeiten einer exponential verteilten Zufallsvariablen zurück +FDIST = FVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer F-verteilten Zufallsvariablen zurück +FINV = FINV ## Gibt Quantile der F-Verteilung zurück +FISHER = FISHER ## Gibt die Fisher-Transformation zurück +FISHERINV = FISHERINV ## Gibt die Umkehrung der Fisher-Transformation zurück +FORECAST = PROGNOSE ## Gibt einen Wert zurück, der sich aus einem linearen Trend ergibt +FREQUENCY = HÄUFIGKEIT ## Gibt eine Häufigkeitsverteilung als vertikale Matrix zurück +FTEST = FTEST ## Gibt die Teststatistik eines F-Tests zurück +GAMMADIST = GAMMAVERT ## Gibt Wahrscheinlichkeiten einer gammaverteilten Zufallsvariablen zurück +GAMMAINV = GAMMAINV ## Gibt Quantile der Gammaverteilung zurück +GAMMALN = GAMMALN ## Gibt den natürlichen Logarithmus der Gammafunktion zurück, Γ(x) +GEOMEAN = GEOMITTEL ## Gibt das geometrische Mittel zurück +GROWTH = VARIATION ## Gibt Werte zurück, die sich aus einem exponentiellen Trend ergeben +HARMEAN = HARMITTEL ## Gibt das harmonische Mittel zurück +HYPGEOMDIST = HYPGEOMVERT ## Gibt Wahrscheinlichkeiten einer hypergeometrisch-verteilten Zufallsvariablen zurück +INTERCEPT = ACHSENABSCHNITT ## Gibt den Schnittpunkt der Regressionsgeraden zurück +KURT = KURT ## Gibt die Kurtosis (Exzess) einer Datengruppe zurück +LARGE = KGRÖSSTE ## Gibt den k-größten Wert einer Datengruppe zurück +LINEST = RGP ## Gibt die Parameter eines linearen Trends zurück +LOGEST = RKP ## Gibt die Parameter eines exponentiellen Trends zurück +LOGINV = LOGINV ## Gibt Quantile der Lognormalverteilung zurück +LOGNORMDIST = LOGNORMVERT ## Gibt Werte der Verteilungsfunktion einer lognormalverteilten Zufallsvariablen zurück +MAX = MAX ## Gibt den Maximalwert einer Liste mit Argumenten zurück +MAXA = MAXA ## Gibt den Maximalwert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten +MEDIAN = MEDIAN ## Gibt den Median der angegebenen Zahlen zurück +MIN = MIN ## Gibt den Minimalwert einer Liste mit Argumenten zurück +MINA = MINA ## Gibt den kleinsten Wert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten +MODE = MODALWERT ## Gibt den am häufigsten vorkommenden Wert in einer Datengruppe zurück +NEGBINOMDIST = NEGBINOMVERT ## Gibt Wahrscheinlichkeiten einer negativen, binominal verteilten Zufallsvariablen zurück +NORMDIST = NORMVERT ## Gibt Wahrscheinlichkeiten einer normal verteilten Zufallsvariablen zurück +NORMINV = NORMINV ## Gibt Quantile der Normalverteilung zurück +NORMSDIST = STANDNORMVERT ## Gibt Werte der Verteilungsfunktion einer standardnormalverteilten Zufallsvariablen zurück +NORMSINV = STANDNORMINV ## Gibt Quantile der Standardnormalverteilung zurück +PEARSON = PEARSON ## Gibt den Pearsonschen Korrelationskoeffizienten zurück +PERCENTILE = QUANTIL ## Gibt das Alpha-Quantil einer Gruppe von Daten zurück +PERCENTRANK = QUANTILSRANG ## Gibt den prozentualen Rang (Alpha) eines Werts in einer Datengruppe zurück +PERMUT = VARIATIONEN ## Gibt die Anzahl der Möglichkeiten zurück, um k Elemente aus einer Menge von n Elementen ohne Zurücklegen zu ziehen +POISSON = POISSON ## Gibt Wahrscheinlichkeiten einer poissonverteilten Zufallsvariablen zurück +PROB = WAHRSCHBEREICH ## Gibt die Wahrscheinlichkeit für ein von zwei Werten eingeschlossenes Intervall zurück +QUARTILE = QUARTILE ## Gibt die Quartile der Datengruppe zurück +RANK = RANG ## Gibt den Rang zurück, den eine Zahl innerhalb einer Liste von Zahlen einnimmt +RSQ = BESTIMMTHEITSMASS ## Gibt das Quadrat des Pearsonschen Korrelationskoeffizienten zurück +SKEW = SCHIEFE ## Gibt die Schiefe einer Verteilung zurück +SLOPE = STEIGUNG ## Gibt die Steigung der Regressionsgeraden zurück +SMALL = KKLEINSTE ## Gibt den k-kleinsten Wert einer Datengruppe zurück +STANDARDIZE = STANDARDISIERUNG ## Gibt den standardisierten Wert zurück +STDEV = STABW ## Schätzt die Standardabweichung ausgehend von einer Stichprobe +STDEVA = STABWA ## Schätzt die Standardabweichung ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthält +STDEVP = STABWN ## Berechnet die Standardabweichung ausgehend von der Grundgesamtheit +STDEVPA = STABWNA ## Berechnet die Standardabweichung ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthält +STEYX = STFEHLERYX ## Gibt den Standardfehler der geschätzten y-Werte für alle x-Werte der Regression zurück +TDIST = TVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer (Student) t-verteilten Zufallsvariablen zurück +TINV = TINV ## Gibt Quantile der t-Verteilung zurück +TREND = TREND ## Gibt Werte zurück, die sich aus einem linearen Trend ergeben +TRIMMEAN = GESTUTZTMITTEL ## Gibt den Mittelwert einer Datengruppe zurück, ohne die Randwerte zu berücksichtigen +TTEST = TTEST ## Gibt die Teststatistik eines Student'schen t-Tests zurück +VAR = VARIANZ ## Schätzt die Varianz ausgehend von einer Stichprobe +VARA = VARIANZA ## Schätzt die Varianz ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthält +VARP = VARIANZEN ## Berechnet die Varianz ausgehend von der Grundgesamtheit +VARPA = VARIANZENA ## Berechnet die Varianz ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthält +WEIBULL = WEIBULL ## Gibt Wahrscheinlichkeiten einer weibullverteilten Zufallsvariablen zurück +ZTEST = GTEST ## Gibt den einseitigen Wahrscheinlichkeitswert für einen Gausstest (Normalverteilung) zurück + + +## +## Text functions Textfunktionen +## +ASC = ASC ## Konvertiert DB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in SB-Text +BAHTTEXT = BAHTTEXT ## Wandelt eine Zahl in Text im Währungsformat ß (Baht) um +CHAR = ZEICHEN ## Gibt das der Codezahl entsprechende Zeichen zurück +CLEAN = SÄUBERN ## Löscht alle nicht druckbaren Zeichen aus einem Text +CODE = CODE ## Gibt die Codezahl des ersten Zeichens in einem Text zurück +CONCATENATE = VERKETTEN ## Verknüpft mehrere Textelemente zu einem Textelement +DOLLAR = DM ## Wandelt eine Zahl in Text im Währungsformat € (Euro) um +EXACT = IDENTISCH ## Prüft, ob zwei Textwerte identisch sind +FIND = FINDEN ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden) +FINDB = FINDENB ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden) +FIXED = FEST ## Formatiert eine Zahl als Text mit einer festen Anzahl von Dezimalstellen +JIS = JIS ## Konvertiert SB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in DB-Text +LEFT = LINKS ## Gibt die Zeichen ganz links in einem Textwert zurück +LEFTB = LINKSB ## Gibt die Zeichen ganz links in einem Textwert zurück +LEN = LÄNGE ## Gibt die Anzahl der Zeichen in einer Zeichenfolge zurück +LENB = LÄNGEB ## Gibt die Anzahl der Zeichen in einer Zeichenfolge zurück +LOWER = KLEIN ## Wandelt Text in Kleinbuchstaben um +MID = TEIL ## Gibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück +MIDB = TEILB ## Gibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück +PHONETIC = PHONETIC ## Extrahiert die phonetischen (Furigana-)Zeichen aus einer Textzeichenfolge +PROPER = GROSS2 ## Wandelt den ersten Buchstaben aller Wörter eines Textwerts in Großbuchstaben um +REPLACE = ERSETZEN ## Ersetzt Zeichen in Text +REPLACEB = ERSETZENB ## Ersetzt Zeichen in Text +REPT = WIEDERHOLEN ## Wiederholt einen Text so oft wie angegeben +RIGHT = RECHTS ## Gibt die Zeichen ganz rechts in einem Textwert zurück +RIGHTB = RECHTSB ## Gibt die Zeichen ganz rechts in einem Textwert zurück +SEARCH = SUCHEN ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden) +SEARCHB = SUCHENB ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden) +SUBSTITUTE = WECHSELN ## Ersetzt in einer Zeichenfolge neuen Text gegen alten +T = T ## Wandelt die zugehörigen Argumente in Text um +TEXT = TEXT ## Formatiert eine Zahl und wandelt sie in Text um +TRIM = GLÄTTEN ## Entfernt Leerzeichen aus Text +UPPER = GROSS ## Wandelt Text in Großbuchstaben um +VALUE = WERT ## Wandelt ein Textargument in eine Zahl um diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/en/uk/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/en/uk/config new file mode 100644 index 000000000..1bcfcb2b7 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/en/uk/config @@ -0,0 +1,32 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +## +## (For future use) +## +currencySymbol = £ diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/es/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/es/config new file mode 100644 index 000000000..039f5b8c8 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/es/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = $ ## I'm surprised that the Excel Documentation suggests $ rather than € + + +## +## Excel Error Codes (For future use) +## +NULL = #¡NULO! +DIV0 = #¡DIV/0! +VALUE = #¡VALOR! +REF = #¡REF! +NAME = #¿NOMBRE? +NUM = #¡NÚM! +NA = #N/A diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/es/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/es/functions new file mode 100644 index 000000000..9d47f0e49 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/es/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funciones de complementos y automatización +## +GETPIVOTDATA = IMPORTARDATOSDINAMICOS ## Devuelve los datos almacenados en un informe de tabla dinámica. + + +## +## Cube functions Funciones de cubo +## +CUBEKPIMEMBER = MIEMBROKPICUBO ## Devuelve un nombre, propiedad y medida de indicador de rendimiento clave (KPI) y muestra el nombre y la propiedad en la celda. Un KPI es una medida cuantificable, como los beneficios brutos mensuales o la facturación trimestral por empleado, que se usa para supervisar el rendimiento de una organización. +CUBEMEMBER = MIEMBROCUBO ## Devuelve un miembro o tupla en una jerarquía de cubo. Se usa para validar la existencia del miembro o la tupla en el cubo. +CUBEMEMBERPROPERTY = PROPIEDADMIEMBROCUBO ## Devuelve el valor de una propiedad de miembro del cubo Se usa para validar la existencia de un nombre de miembro en el cubo y para devolver la propiedad especificada para este miembro. +CUBERANKEDMEMBER = MIEMBRORANGOCUBO ## Devuelve el miembro n, o clasificado, de un conjunto. Se usa para devolver uno o más elementos de un conjunto, por ejemplo, el representante con mejores ventas o los diez mejores alumnos. +CUBESET = CONJUNTOCUBO ## Define un conjunto calculado de miembros o tuplas mediante el envío de una expresión de conjunto al cubo en el servidor, lo que crea el conjunto y, después, devuelve dicho conjunto a Microsoft Office Excel. +CUBESETCOUNT = RECUENTOCONJUNTOCUBO ## Devuelve el número de elementos de un conjunto. +CUBEVALUE = VALORCUBO ## Devuelve un valor agregado de un cubo. + + +## +## Database functions Funciones de base de datos +## +DAVERAGE = BDPROMEDIO ## Devuelve el promedio de las entradas seleccionadas en la base de datos. +DCOUNT = BDCONTAR ## Cuenta el número de celdas que contienen números en una base de datos. +DCOUNTA = BDCONTARA ## Cuenta el número de celdas no vacías en una base de datos. +DGET = BDEXTRAER ## Extrae de una base de datos un único registro que cumple los criterios especificados. +DMAX = BDMAX ## Devuelve el valor máximo de las entradas seleccionadas de la base de datos. +DMIN = BDMIN ## Devuelve el valor mínimo de las entradas seleccionadas de la base de datos. +DPRODUCT = BDPRODUCTO ## Multiplica los valores de un campo concreto de registros de una base de datos que cumplen los criterios especificados. +DSTDEV = BDDESVEST ## Calcula la desviación estándar a partir de una muestra de entradas seleccionadas en la base de datos. +DSTDEVP = BDDESVESTP ## Calcula la desviación estándar en función de la población total de las entradas seleccionadas de la base de datos. +DSUM = BDSUMA ## Suma los números de la columna de campo de los registros de la base de datos que cumplen los criterios. +DVAR = BDVAR ## Calcula la varianza a partir de una muestra de entradas seleccionadas de la base de datos. +DVARP = BDVARP ## Calcula la varianza a partir de la población total de entradas seleccionadas de la base de datos. + + +## +## Date and time functions Funciones de fecha y hora +## +DATE = FECHA ## Devuelve el número de serie correspondiente a una fecha determinada. +DATEVALUE = FECHANUMERO ## Convierte una fecha con formato de texto en un valor de número de serie. +DAY = DIA ## Convierte un número de serie en un valor de día del mes. +DAYS360 = DIAS360 ## Calcula el número de días entre dos fechas a partir de un año de 360 días. +EDATE = FECHA.MES ## Devuelve el número de serie de la fecha equivalente al número indicado de meses anteriores o posteriores a la fecha inicial. +EOMONTH = FIN.MES ## Devuelve el número de serie correspondiente al último día del mes anterior o posterior a un número de meses especificado. +HOUR = HORA ## Convierte un número de serie en un valor de hora. +MINUTE = MINUTO ## Convierte un número de serie en un valor de minuto. +MONTH = MES ## Convierte un número de serie en un valor de mes. +NETWORKDAYS = DIAS.LAB ## Devuelve el número de todos los días laborables existentes entre dos fechas. +NOW = AHORA ## Devuelve el número de serie correspondiente a la fecha y hora actuales. +SECOND = SEGUNDO ## Convierte un número de serie en un valor de segundo. +TIME = HORA ## Devuelve el número de serie correspondiente a una hora determinada. +TIMEVALUE = HORANUMERO ## Convierte una hora con formato de texto en un valor de número de serie. +TODAY = HOY ## Devuelve el número de serie correspondiente al día actual. +WEEKDAY = DIASEM ## Convierte un número de serie en un valor de día de la semana. +WEEKNUM = NUM.DE.SEMANA ## Convierte un número de serie en un número que representa el lugar numérico correspondiente a una semana de un año. +WORKDAY = DIA.LAB ## Devuelve el número de serie de la fecha que tiene lugar antes o después de un número determinado de días laborables. +YEAR = AÑO ## Convierte un número de serie en un valor de año. +YEARFRAC = FRAC.AÑO ## Devuelve la fracción de año que representa el número total de días existentes entre el valor de fecha_inicial y el de fecha_final. + + +## +## Engineering functions Funciones de ingeniería +## +BESSELI = BESSELI ## Devuelve la función Bessel In(x) modificada. +BESSELJ = BESSELJ ## Devuelve la función Bessel Jn(x). +BESSELK = BESSELK ## Devuelve la función Bessel Kn(x) modificada. +BESSELY = BESSELY ## Devuelve la función Bessel Yn(x). +BIN2DEC = BIN.A.DEC ## Convierte un número binario en decimal. +BIN2HEX = BIN.A.HEX ## Convierte un número binario en hexadecimal. +BIN2OCT = BIN.A.OCT ## Convierte un número binario en octal. +COMPLEX = COMPLEJO ## Convierte coeficientes reales e imaginarios en un número complejo. +CONVERT = CONVERTIR ## Convierte un número de un sistema de medida a otro. +DEC2BIN = DEC.A.BIN ## Convierte un número decimal en binario. +DEC2HEX = DEC.A.HEX ## Convierte un número decimal en hexadecimal. +DEC2OCT = DEC.A.OCT ## Convierte un número decimal en octal. +DELTA = DELTA ## Comprueba si dos valores son iguales. +ERF = FUN.ERROR ## Devuelve la función de error. +ERFC = FUN.ERROR.COMPL ## Devuelve la función de error complementario. +GESTEP = MAYOR.O.IGUAL ## Comprueba si un número es mayor que un valor de umbral. +HEX2BIN = HEX.A.BIN ## Convierte un número hexadecimal en binario. +HEX2DEC = HEX.A.DEC ## Convierte un número hexadecimal en decimal. +HEX2OCT = HEX.A.OCT ## Convierte un número hexadecimal en octal. +IMABS = IM.ABS ## Devuelve el valor absoluto (módulo) de un número complejo. +IMAGINARY = IMAGINARIO ## Devuelve el coeficiente imaginario de un número complejo. +IMARGUMENT = IM.ANGULO ## Devuelve el argumento theta, un ángulo expresado en radianes. +IMCONJUGATE = IM.CONJUGADA ## Devuelve la conjugada compleja de un número complejo. +IMCOS = IM.COS ## Devuelve el coseno de un número complejo. +IMDIV = IM.DIV ## Devuelve el cociente de dos números complejos. +IMEXP = IM.EXP ## Devuelve el valor exponencial de un número complejo. +IMLN = IM.LN ## Devuelve el logaritmo natural (neperiano) de un número complejo. +IMLOG10 = IM.LOG10 ## Devuelve el logaritmo en base 10 de un número complejo. +IMLOG2 = IM.LOG2 ## Devuelve el logaritmo en base 2 de un número complejo. +IMPOWER = IM.POT ## Devuelve un número complejo elevado a una potencia entera. +IMPRODUCT = IM.PRODUCT ## Devuelve el producto de números complejos. +IMREAL = IM.REAL ## Devuelve el coeficiente real de un número complejo. +IMSIN = IM.SENO ## Devuelve el seno de un número complejo. +IMSQRT = IM.RAIZ2 ## Devuelve la raíz cuadrada de un número complejo. +IMSUB = IM.SUSTR ## Devuelve la diferencia entre dos números complejos. +IMSUM = IM.SUM ## Devuelve la suma de números complejos. +OCT2BIN = OCT.A.BIN ## Convierte un número octal en binario. +OCT2DEC = OCT.A.DEC ## Convierte un número octal en decimal. +OCT2HEX = OCT.A.HEX ## Convierte un número octal en hexadecimal. + + +## +## Financial functions Funciones financieras +## +ACCRINT = INT.ACUM ## Devuelve el interés acumulado de un valor bursátil con pagos de interés periódicos. +ACCRINTM = INT.ACUM.V ## Devuelve el interés acumulado de un valor bursátil con pagos de interés al vencimiento. +AMORDEGRC = AMORTIZ.PROGRE ## Devuelve la amortización de cada período contable mediante el uso de un coeficiente de amortización. +AMORLINC = AMORTIZ.LIN ## Devuelve la amortización de cada uno de los períodos contables. +COUPDAYBS = CUPON.DIAS.L1 ## Devuelve el número de días desde el principio del período de un cupón hasta la fecha de liquidación. +COUPDAYS = CUPON.DIAS ## Devuelve el número de días del período (entre dos cupones) donde se encuentra la fecha de liquidación. +COUPDAYSNC = CUPON.DIAS.L2 ## Devuelve el número de días desde la fecha de liquidación hasta la fecha del próximo cupón. +COUPNCD = CUPON.FECHA.L2 ## Devuelve la fecha del próximo cupón después de la fecha de liquidación. +COUPNUM = CUPON.NUM ## Devuelve el número de pagos de cupón entre la fecha de liquidación y la fecha de vencimiento. +COUPPCD = CUPON.FECHA.L1 ## Devuelve la fecha de cupón anterior a la fecha de liquidación. +CUMIPMT = PAGO.INT.ENTRE ## Devuelve el interés acumulado pagado entre dos períodos. +CUMPRINC = PAGO.PRINC.ENTRE ## Devuelve el capital acumulado pagado de un préstamo entre dos períodos. +DB = DB ## Devuelve la amortización de un bien durante un período específico a través del método de amortización de saldo fijo. +DDB = DDB ## Devuelve la amortización de un bien durante un período específico a través del método de amortización por doble disminución de saldo u otro método que se especifique. +DISC = TASA.DESC ## Devuelve la tasa de descuento de un valor bursátil. +DOLLARDE = MONEDA.DEC ## Convierte una cotización de un valor bursátil expresada en forma fraccionaria en una cotización de un valor bursátil expresada en forma decimal. +DOLLARFR = MONEDA.FRAC ## Convierte una cotización de un valor bursátil expresada en forma decimal en una cotización de un valor bursátil expresada en forma fraccionaria. +DURATION = DURACION ## Devuelve la duración anual de un valor bursátil con pagos de interés periódico. +EFFECT = INT.EFECTIVO ## Devuelve la tasa de interés anual efectiva. +FV = VF ## Devuelve el valor futuro de una inversión. +FVSCHEDULE = VF.PLAN ## Devuelve el valor futuro de un capital inicial después de aplicar una serie de tasas de interés compuesto. +INTRATE = TASA.INT ## Devuelve la tasa de interés para la inversión total de un valor bursátil. +IPMT = PAGOINT ## Devuelve el pago de intereses de una inversión durante un período determinado. +IRR = TIR ## Devuelve la tasa interna de retorno para una serie de flujos de efectivo periódicos. +ISPMT = INT.PAGO.DIR ## Calcula el interés pagado durante un período específico de una inversión. +MDURATION = DURACION.MODIF ## Devuelve la duración de Macauley modificada de un valor bursátil con un valor nominal supuesto de 100 $. +MIRR = TIRM ## Devuelve la tasa interna de retorno donde se financian flujos de efectivo positivos y negativos a tasas diferentes. +NOMINAL = TASA.NOMINAL ## Devuelve la tasa nominal de interés anual. +NPER = NPER ## Devuelve el número de períodos de una inversión. +NPV = VNA ## Devuelve el valor neto actual de una inversión en función de una serie de flujos periódicos de efectivo y una tasa de descuento. +ODDFPRICE = PRECIO.PER.IRREGULAR.1 ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil con un primer período impar. +ODDFYIELD = RENDTO.PER.IRREGULAR.1 ## Devuelve el rendimiento de un valor bursátil con un primer período impar. +ODDLPRICE = PRECIO.PER.IRREGULAR.2 ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil con un último período impar. +ODDLYIELD = RENDTO.PER.IRREGULAR.2 ## Devuelve el rendimiento de un valor bursátil con un último período impar. +PMT = PAGO ## Devuelve el pago periódico de una anualidad. +PPMT = PAGOPRIN ## Devuelve el pago de capital de una inversión durante un período determinado. +PRICE = PRECIO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil que paga una tasa de interés periódico. +PRICEDISC = PRECIO.DESCUENTO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil con descuento. +PRICEMAT = PRECIO.VENCIMIENTO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil que paga interés a su vencimiento. +PV = VALACT ## Devuelve el valor actual de una inversión. +RATE = TASA ## Devuelve la tasa de interés por período de una anualidad. +RECEIVED = CANTIDAD.RECIBIDA ## Devuelve la cantidad recibida al vencimiento de un valor bursátil completamente invertido. +SLN = SLN ## Devuelve la amortización por método directo de un bien en un período dado. +SYD = SYD ## Devuelve la amortización por suma de dígitos de los años de un bien durante un período especificado. +TBILLEQ = LETRA.DE.TES.EQV.A.BONO ## Devuelve el rendimiento de un bono equivalente a una letra del Tesoro (de EE.UU.) +TBILLPRICE = LETRA.DE.TES.PRECIO ## Devuelve el precio por un valor nominal de 100 $ de una letra del Tesoro (de EE.UU.) +TBILLYIELD = LETRA.DE.TES.RENDTO ## Devuelve el rendimiento de una letra del Tesoro (de EE.UU.) +VDB = DVS ## Devuelve la amortización de un bien durante un período específico o parcial a través del método de cálculo del saldo en disminución. +XIRR = TIR.NO.PER ## Devuelve la tasa interna de retorno para un flujo de efectivo que no es necesariamente periódico. +XNPV = VNA.NO.PER ## Devuelve el valor neto actual para un flujo de efectivo que no es necesariamente periódico. +YIELD = RENDTO ## Devuelve el rendimiento de un valor bursátil que paga intereses periódicos. +YIELDDISC = RENDTO.DESC ## Devuelve el rendimiento anual de un valor bursátil con descuento; por ejemplo, una letra del Tesoro (de EE.UU.) +YIELDMAT = RENDTO.VENCTO ## Devuelve el rendimiento anual de un valor bursátil que paga intereses al vencimiento. + + +## +## Information functions Funciones de información +## +CELL = CELDA ## Devuelve información acerca del formato, la ubicación o el contenido de una celda. +ERROR.TYPE = TIPO.DE.ERROR ## Devuelve un número que corresponde a un tipo de error. +INFO = INFO ## Devuelve información acerca del entorno operativo en uso. +ISBLANK = ESBLANCO ## Devuelve VERDADERO si el valor está en blanco. +ISERR = ESERR ## Devuelve VERDADERO si el valor es cualquier valor de error excepto #N/A. +ISERROR = ESERROR ## Devuelve VERDADERO si el valor es cualquier valor de error. +ISEVEN = ES.PAR ## Devuelve VERDADERO si el número es par. +ISLOGICAL = ESLOGICO ## Devuelve VERDADERO si el valor es un valor lógico. +ISNA = ESNOD ## Devuelve VERDADERO si el valor es el valor de error #N/A. +ISNONTEXT = ESNOTEXTO ## Devuelve VERDADERO si el valor no es texto. +ISNUMBER = ESNUMERO ## Devuelve VERDADERO si el valor es un número. +ISODD = ES.IMPAR ## Devuelve VERDADERO si el número es impar. +ISREF = ESREF ## Devuelve VERDADERO si el valor es una referencia. +ISTEXT = ESTEXTO ## Devuelve VERDADERO si el valor es texto. +N = N ## Devuelve un valor convertido en un número. +NA = ND ## Devuelve el valor de error #N/A. +TYPE = TIPO ## Devuelve un número que indica el tipo de datos de un valor. + + +## +## Logical functions Funciones lógicas +## +AND = Y ## Devuelve VERDADERO si todos sus argumentos son VERDADERO. +FALSE = FALSO ## Devuelve el valor lógico FALSO. +IF = SI ## Especifica una prueba lógica que realizar. +IFERROR = SI.ERROR ## Devuelve un valor que se especifica si una fórmula lo evalúa como un error; de lo contrario, devuelve el resultado de la fórmula. +NOT = NO ## Invierte el valor lógico del argumento. +OR = O ## Devuelve VERDADERO si cualquier argumento es VERDADERO. +TRUE = VERDADERO ## Devuelve el valor lógico VERDADERO. + + +## +## Lookup and reference functions Funciones de búsqueda y referencia +## +ADDRESS = DIRECCION ## Devuelve una referencia como texto a una sola celda de una hoja de cálculo. +AREAS = AREAS ## Devuelve el número de áreas de una referencia. +CHOOSE = ELEGIR ## Elige un valor de una lista de valores. +COLUMN = COLUMNA ## Devuelve el número de columna de una referencia. +COLUMNS = COLUMNAS ## Devuelve el número de columnas de una referencia. +HLOOKUP = BUSCARH ## Busca en la fila superior de una matriz y devuelve el valor de la celda indicada. +HYPERLINK = HIPERVINCULO ## Crea un acceso directo o un salto que abre un documento almacenado en un servidor de red, en una intranet o en Internet. +INDEX = INDICE ## Usa un índice para elegir un valor de una referencia o matriz. +INDIRECT = INDIRECTO ## Devuelve una referencia indicada por un valor de texto. +LOOKUP = BUSCAR ## Busca valores de un vector o una matriz. +MATCH = COINCIDIR ## Busca valores de una referencia o matriz. +OFFSET = DESREF ## Devuelve un desplazamiento de referencia respecto a una referencia dada. +ROW = FILA ## Devuelve el número de fila de una referencia. +ROWS = FILAS ## Devuelve el número de filas de una referencia. +RTD = RDTR ## Recupera datos en tiempo real desde un programa compatible con la automatización COM (automatización: modo de trabajar con los objetos de una aplicación desde otra aplicación o herramienta de entorno. La automatización, antes denominada automatización OLE, es un estándar de la industria y una función del Modelo de objetos componentes (COM).). +TRANSPOSE = TRANSPONER ## Devuelve la transposición de una matriz. +VLOOKUP = BUSCARV ## Busca en la primera columna de una matriz y se mueve en horizontal por la fila para devolver el valor de una celda. + + +## +## Math and trigonometry functions Funciones matemáticas y trigonométricas +## +ABS = ABS ## Devuelve el valor absoluto de un número. +ACOS = ACOS ## Devuelve el arcocoseno de un número. +ACOSH = ACOSH ## Devuelve el coseno hiperbólico inverso de un número. +ASIN = ASENO ## Devuelve el arcoseno de un número. +ASINH = ASENOH ## Devuelve el seno hiperbólico inverso de un número. +ATAN = ATAN ## Devuelve la arcotangente de un número. +ATAN2 = ATAN2 ## Devuelve la arcotangente de las coordenadas "x" e "y". +ATANH = ATANH ## Devuelve la tangente hiperbólica inversa de un número. +CEILING = MULTIPLO.SUPERIOR ## Redondea un número al entero más próximo o al múltiplo significativo más cercano. +COMBIN = COMBINAT ## Devuelve el número de combinaciones para un número determinado de objetos. +COS = COS ## Devuelve el coseno de un número. +COSH = COSH ## Devuelve el coseno hiperbólico de un número. +DEGREES = GRADOS ## Convierte radianes en grados. +EVEN = REDONDEA.PAR ## Redondea un número hasta el entero par más próximo. +EXP = EXP ## Devuelve e elevado a la potencia de un número dado. +FACT = FACT ## Devuelve el factorial de un número. +FACTDOUBLE = FACT.DOBLE ## Devuelve el factorial doble de un número. +FLOOR = MULTIPLO.INFERIOR ## Redondea un número hacia abajo, en dirección hacia cero. +GCD = M.C.D ## Devuelve el máximo común divisor. +INT = ENTERO ## Redondea un número hacia abajo hasta el entero más próximo. +LCM = M.C.M ## Devuelve el mínimo común múltiplo. +LN = LN ## Devuelve el logaritmo natural (neperiano) de un número. +LOG = LOG ## Devuelve el logaritmo de un número en una base especificada. +LOG10 = LOG10 ## Devuelve el logaritmo en base 10 de un número. +MDETERM = MDETERM ## Devuelve la determinante matricial de una matriz. +MINVERSE = MINVERSA ## Devuelve la matriz inversa de una matriz. +MMULT = MMULT ## Devuelve el producto de matriz de dos matrices. +MOD = RESIDUO ## Devuelve el resto de la división. +MROUND = REDOND.MULT ## Devuelve un número redondeado al múltiplo deseado. +MULTINOMIAL = MULTINOMIAL ## Devuelve el polinomio de un conjunto de números. +ODD = REDONDEA.IMPAR ## Redondea un número hacia arriba hasta el entero impar más próximo. +PI = PI ## Devuelve el valor de pi. +POWER = POTENCIA ## Devuelve el resultado de elevar un número a una potencia. +PRODUCT = PRODUCTO ## Multiplica sus argumentos. +QUOTIENT = COCIENTE ## Devuelve la parte entera de una división. +RADIANS = RADIANES ## Convierte grados en radianes. +RAND = ALEATORIO ## Devuelve un número aleatorio entre 0 y 1. +RANDBETWEEN = ALEATORIO.ENTRE ## Devuelve un número aleatorio entre los números que especifique. +ROMAN = NUMERO.ROMANO ## Convierte un número arábigo en número romano, con formato de texto. +ROUND = REDONDEAR ## Redondea un número al número de decimales especificado. +ROUNDDOWN = REDONDEAR.MENOS ## Redondea un número hacia abajo, en dirección hacia cero. +ROUNDUP = REDONDEAR.MAS ## Redondea un número hacia arriba, en dirección contraria a cero. +SERIESSUM = SUMA.SERIES ## Devuelve la suma de una serie de potencias en función de la fórmula. +SIGN = SIGNO ## Devuelve el signo de un número. +SIN = SENO ## Devuelve el seno de un ángulo determinado. +SINH = SENOH ## Devuelve el seno hiperbólico de un número. +SQRT = RAIZ ## Devuelve la raíz cuadrada positiva de un número. +SQRTPI = RAIZ2PI ## Devuelve la raíz cuadrada de un número multiplicado por PI (número * pi). +SUBTOTAL = SUBTOTALES ## Devuelve un subtotal en una lista o base de datos. +SUM = SUMA ## Suma sus argumentos. +SUMIF = SUMAR.SI ## Suma las celdas especificadas que cumplen unos criterios determinados. +SUMIFS = SUMAR.SI.CONJUNTO ## Suma las celdas de un rango que cumplen varios criterios. +SUMPRODUCT = SUMAPRODUCTO ## Devuelve la suma de los productos de los correspondientes componentes de matriz. +SUMSQ = SUMA.CUADRADOS ## Devuelve la suma de los cuadrados de los argumentos. +SUMX2MY2 = SUMAX2MENOSY2 ## Devuelve la suma de la diferencia de los cuadrados de los valores correspondientes de dos matrices. +SUMX2PY2 = SUMAX2MASY2 ## Devuelve la suma de la suma de los cuadrados de los valores correspondientes de dos matrices. +SUMXMY2 = SUMAXMENOSY2 ## Devuelve la suma de los cuadrados de las diferencias de los valores correspondientes de dos matrices. +TAN = TAN ## Devuelve la tangente de un número. +TANH = TANH ## Devuelve la tangente hiperbólica de un número. +TRUNC = TRUNCAR ## Trunca un número a un entero. + + +## +## Statistical functions Funciones estadísticas +## +AVEDEV = DESVPROM ## Devuelve el promedio de las desviaciones absolutas de la media de los puntos de datos. +AVERAGE = PROMEDIO ## Devuelve el promedio de sus argumentos. +AVERAGEA = PROMEDIOA ## Devuelve el promedio de sus argumentos, incluidos números, texto y valores lógicos. +AVERAGEIF = PROMEDIO.SI ## Devuelve el promedio (media aritmética) de todas las celdas de un rango que cumplen unos criterios determinados. +AVERAGEIFS = PROMEDIO.SI.CONJUNTO ## Devuelve el promedio (media aritmética) de todas las celdas que cumplen múltiples criterios. +BETADIST = DISTR.BETA ## Devuelve la función de distribución beta acumulativa. +BETAINV = DISTR.BETA.INV ## Devuelve la función inversa de la función de distribución acumulativa de una distribución beta especificada. +BINOMDIST = DISTR.BINOM ## Devuelve la probabilidad de una variable aleatoria discreta siguiendo una distribución binomial. +CHIDIST = DISTR.CHI ## Devuelve la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola. +CHIINV = PRUEBA.CHI.INV ## Devuelve la función inversa de la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola. +CHITEST = PRUEBA.CHI ## Devuelve la prueba de independencia. +CONFIDENCE = INTERVALO.CONFIANZA ## Devuelve el intervalo de confianza de la media de una población. +CORREL = COEF.DE.CORREL ## Devuelve el coeficiente de correlación entre dos conjuntos de datos. +COUNT = CONTAR ## Cuenta cuántos números hay en la lista de argumentos. +COUNTA = CONTARA ## Cuenta cuántos valores hay en la lista de argumentos. +COUNTBLANK = CONTAR.BLANCO ## Cuenta el número de celdas en blanco de un rango. +COUNTIF = CONTAR.SI ## Cuenta el número de celdas, dentro del rango, que cumplen el criterio especificado. +COUNTIFS = CONTAR.SI.CONJUNTO ## Cuenta el número de celdas, dentro del rango, que cumplen varios criterios. +COVAR = COVAR ## Devuelve la covarianza, que es el promedio de los productos de las desviaciones para cada pareja de puntos de datos. +CRITBINOM = BINOM.CRIT ## Devuelve el menor valor cuya distribución binomial acumulativa es menor o igual a un valor de criterio. +DEVSQ = DESVIA2 ## Devuelve la suma de los cuadrados de las desviaciones. +EXPONDIST = DISTR.EXP ## Devuelve la distribución exponencial. +FDIST = DISTR.F ## Devuelve la distribución de probabilidad F. +FINV = DISTR.F.INV ## Devuelve la función inversa de la distribución de probabilidad F. +FISHER = FISHER ## Devuelve la transformación Fisher. +FISHERINV = PRUEBA.FISHER.INV ## Devuelve la función inversa de la transformación Fisher. +FORECAST = PRONOSTICO ## Devuelve un valor en una tendencia lineal. +FREQUENCY = FRECUENCIA ## Devuelve una distribución de frecuencia como una matriz vertical. +FTEST = PRUEBA.F ## Devuelve el resultado de una prueba F. +GAMMADIST = DISTR.GAMMA ## Devuelve la distribución gamma. +GAMMAINV = DISTR.GAMMA.INV ## Devuelve la función inversa de la distribución gamma acumulativa. +GAMMALN = GAMMA.LN ## Devuelve el logaritmo natural de la función gamma, G(x). +GEOMEAN = MEDIA.GEOM ## Devuelve la media geométrica. +GROWTH = CRECIMIENTO ## Devuelve valores en una tendencia exponencial. +HARMEAN = MEDIA.ARMO ## Devuelve la media armónica. +HYPGEOMDIST = DISTR.HIPERGEOM ## Devuelve la distribución hipergeométrica. +INTERCEPT = INTERSECCION.EJE ## Devuelve la intersección de la línea de regresión lineal. +KURT = CURTOSIS ## Devuelve la curtosis de un conjunto de datos. +LARGE = K.ESIMO.MAYOR ## Devuelve el k-ésimo mayor valor de un conjunto de datos. +LINEST = ESTIMACION.LINEAL ## Devuelve los parámetros de una tendencia lineal. +LOGEST = ESTIMACION.LOGARITMICA ## Devuelve los parámetros de una tendencia exponencial. +LOGINV = DISTR.LOG.INV ## Devuelve la función inversa de la distribución logarítmico-normal. +LOGNORMDIST = DISTR.LOG.NORM ## Devuelve la distribución logarítmico-normal acumulativa. +MAX = MAX ## Devuelve el valor máximo de una lista de argumentos. +MAXA = MAXA ## Devuelve el valor máximo de una lista de argumentos, incluidos números, texto y valores lógicos. +MEDIAN = MEDIANA ## Devuelve la mediana de los números dados. +MIN = MIN ## Devuelve el valor mínimo de una lista de argumentos. +MINA = MINA ## Devuelve el valor mínimo de una lista de argumentos, incluidos números, texto y valores lógicos. +MODE = MODA ## Devuelve el valor más común de un conjunto de datos. +NEGBINOMDIST = NEGBINOMDIST ## Devuelve la distribución binomial negativa. +NORMDIST = DISTR.NORM ## Devuelve la distribución normal acumulativa. +NORMINV = DISTR.NORM.INV ## Devuelve la función inversa de la distribución normal acumulativa. +NORMSDIST = DISTR.NORM.ESTAND ## Devuelve la distribución normal estándar acumulativa. +NORMSINV = DISTR.NORM.ESTAND.INV ## Devuelve la función inversa de la distribución normal estándar acumulativa. +PEARSON = PEARSON ## Devuelve el coeficiente de momento de correlación de producto Pearson. +PERCENTILE = PERCENTIL ## Devuelve el k-ésimo percentil de los valores de un rango. +PERCENTRANK = RANGO.PERCENTIL ## Devuelve el rango porcentual de un valor de un conjunto de datos. +PERMUT = PERMUTACIONES ## Devuelve el número de permutaciones de un número determinado de objetos. +POISSON = POISSON ## Devuelve la distribución de Poisson. +PROB = PROBABILIDAD ## Devuelve la probabilidad de que los valores de un rango se encuentren entre dos límites. +QUARTILE = CUARTIL ## Devuelve el cuartil de un conjunto de datos. +RANK = JERARQUIA ## Devuelve la jerarquía de un número en una lista de números. +RSQ = COEFICIENTE.R2 ## Devuelve el cuadrado del coeficiente de momento de correlación de producto Pearson. +SKEW = COEFICIENTE.ASIMETRIA ## Devuelve la asimetría de una distribución. +SLOPE = PENDIENTE ## Devuelve la pendiente de la línea de regresión lineal. +SMALL = K.ESIMO.MENOR ## Devuelve el k-ésimo menor valor de un conjunto de datos. +STANDARDIZE = NORMALIZACION ## Devuelve un valor normalizado. +STDEV = DESVEST ## Calcula la desviación estándar a partir de una muestra. +STDEVA = DESVESTA ## Calcula la desviación estándar a partir de una muestra, incluidos números, texto y valores lógicos. +STDEVP = DESVESTP ## Calcula la desviación estándar en función de toda la población. +STDEVPA = DESVESTPA ## Calcula la desviación estándar en función de toda la población, incluidos números, texto y valores lógicos. +STEYX = ERROR.TIPICO.XY ## Devuelve el error estándar del valor de "y" previsto para cada "x" de la regresión. +TDIST = DISTR.T ## Devuelve la distribución de t de Student. +TINV = DISTR.T.INV ## Devuelve la función inversa de la distribución de t de Student. +TREND = TENDENCIA ## Devuelve valores en una tendencia lineal. +TRIMMEAN = MEDIA.ACOTADA ## Devuelve la media del interior de un conjunto de datos. +TTEST = PRUEBA.T ## Devuelve la probabilidad asociada a una prueba t de Student. +VAR = VAR ## Calcula la varianza en función de una muestra. +VARA = VARA ## Calcula la varianza en función de una muestra, incluidos números, texto y valores lógicos. +VARP = VARP ## Calcula la varianza en función de toda la población. +VARPA = VARPA ## Calcula la varianza en función de toda la población, incluidos números, texto y valores lógicos. +WEIBULL = DIST.WEIBULL ## Devuelve la distribución de Weibull. +ZTEST = PRUEBA.Z ## Devuelve el valor de una probabilidad de una cola de una prueba z. + + +## +## Text functions Funciones de texto +## +ASC = ASC ## Convierte las letras inglesas o katakana de ancho completo (de dos bytes) dentro de una cadena de caracteres en caracteres de ancho medio (de un byte). +BAHTTEXT = TEXTOBAHT ## Convierte un número en texto, con el formato de moneda ß (Baht). +CHAR = CARACTER ## Devuelve el carácter especificado por el número de código. +CLEAN = LIMPIAR ## Quita del texto todos los caracteres no imprimibles. +CODE = CODIGO ## Devuelve un código numérico del primer carácter de una cadena de texto. +CONCATENATE = CONCATENAR ## Concatena varios elementos de texto en uno solo. +DOLLAR = MONEDA ## Convierte un número en texto, con el formato de moneda $ (dólar). +EXACT = IGUAL ## Comprueba si dos valores de texto son idénticos. +FIND = ENCONTRAR ## Busca un valor de texto dentro de otro (distingue mayúsculas de minúsculas). +FINDB = ENCONTRARB ## Busca un valor de texto dentro de otro (distingue mayúsculas de minúsculas). +FIXED = DECIMAL ## Da formato a un número como texto con un número fijo de decimales. +JIS = JIS ## Convierte las letras inglesas o katakana de ancho medio (de un byte) dentro de una cadena de caracteres en caracteres de ancho completo (de dos bytes). +LEFT = IZQUIERDA ## Devuelve los caracteres del lado izquierdo de un valor de texto. +LEFTB = IZQUIERDAB ## Devuelve los caracteres del lado izquierdo de un valor de texto. +LEN = LARGO ## Devuelve el número de caracteres de una cadena de texto. +LENB = LARGOB ## Devuelve el número de caracteres de una cadena de texto. +LOWER = MINUSC ## Pone el texto en minúsculas. +MID = EXTRAE ## Devuelve un número específico de caracteres de una cadena de texto que comienza en la posición que se especifique. +MIDB = EXTRAEB ## Devuelve un número específico de caracteres de una cadena de texto que comienza en la posición que se especifique. +PHONETIC = FONETICO ## Extrae los caracteres fonéticos (furigana) de una cadena de texto. +PROPER = NOMPROPIO ## Pone en mayúscula la primera letra de cada palabra de un valor de texto. +REPLACE = REEMPLAZAR ## Reemplaza caracteres de texto. +REPLACEB = REEMPLAZARB ## Reemplaza caracteres de texto. +REPT = REPETIR ## Repite el texto un número determinado de veces. +RIGHT = DERECHA ## Devuelve los caracteres del lado derecho de un valor de texto. +RIGHTB = DERECHAB ## Devuelve los caracteres del lado derecho de un valor de texto. +SEARCH = HALLAR ## Busca un valor de texto dentro de otro (no distingue mayúsculas de minúsculas). +SEARCHB = HALLARB ## Busca un valor de texto dentro de otro (no distingue mayúsculas de minúsculas). +SUBSTITUTE = SUSTITUIR ## Sustituye texto nuevo por texto antiguo en una cadena de texto. +T = T ## Convierte sus argumentos a texto. +TEXT = TEXTO ## Da formato a un número y lo convierte en texto. +TRIM = ESPACIOS ## Quita los espacios del texto. +UPPER = MAYUSC ## Pone el texto en mayúsculas. +VALUE = VALOR ## Convierte un argumento de texto en un número. diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/fi/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fi/config new file mode 100644 index 000000000..ba274e1d5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fi/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = $ # Symbol not known, should it be a € (Euro)? + + +## +## Excel Error Codes (For future use) +## +NULL = #TYHJÄ! +DIV0 = #JAKO/0! +VALUE = #ARVO! +REF = #VIITTAUS! +NAME = #NIMI? +NUM = #LUKU! +NA = #PUUTTUU diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/fi/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fi/functions new file mode 100644 index 000000000..25e08eacd --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fi/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Apuohjelma- ja automaatiofunktiot +## +GETPIVOTDATA = NOUDA.PIVOT.TIEDOT ## Palauttaa pivot-taulukkoraporttiin tallennettuja tietoja. + + +## +## Cube functions Kuutiofunktiot +## +CUBEKPIMEMBER = KUUTIOKPIJÄSEN ## Palauttaa suorituskykyilmaisimen (KPI) nimen, ominaisuuden sekä mitan ja näyttää nimen sekä ominaisuuden solussa. KPI on mitattavissa oleva suure, kuten kuukauden bruttotuotto tai vuosineljänneksen työntekijäkohtainen liikevaihto, joiden avulla tarkkaillaan organisaation suorituskykyä. +CUBEMEMBER = KUUTIONJÄSEN ## Palauttaa kuutiohierarkian jäsenen tai monikon. Tällä funktiolla voit tarkistaa, että jäsen tai monikko on olemassa kuutiossa. +CUBEMEMBERPROPERTY = KUUTIONJÄSENENOMINAISUUS ## Palauttaa kuution jäsenominaisuuden arvon. Tällä funktiolla voit tarkistaa, että nimi on olemassa kuutiossa, ja palauttaa tämän jäsenen määritetyn ominaisuuden. +CUBERANKEDMEMBER = KUUTIONLUOKITELTUJÄSEN ## Palauttaa joukon n:nnen jäsenen. Tällä funktiolla voit palauttaa joukosta elementtejä, kuten parhaan myyjän tai 10 parasta opiskelijaa. +CUBESET = KUUTIOJOUKKO ## Määrittää lasketun jäsen- tai monikkojoukon lähettämällä joukon lausekkeita palvelimessa olevalle kuutiolle. Palvelin luo joukon ja palauttaa sen Microsoft Office Excelille. +CUBESETCOUNT = KUUTIOJOUKKOJENMÄÄRÄ ## Palauttaa joukon kohteiden määrän. +CUBEVALUE = KUUTIONARVO ## Palauttaa koostetun arvon kuutiosta. + + +## +## Database functions Tietokantafunktiot +## +DAVERAGE = TKESKIARVO ## Palauttaa valittujen tietokantamerkintöjen keskiarvon. +DCOUNT = TLASKE ## Laskee tietokannan lukuja sisältävien solujen määrän. +DCOUNTA = TLASKEA ## Laskee tietokannan tietoja sisältävien solujen määrän. +DGET = TNOUDA ## Hakee määritettyjä ehtoja vastaavan tietueen tietokannasta. +DMAX = TMAKS ## Palauttaa suurimman arvon tietokannasta valittujen arvojen joukosta. +DMIN = TMIN ## Palauttaa pienimmän arvon tietokannasta valittujen arvojen joukosta. +DPRODUCT = TTULO ## Kertoo määritetyn ehdon täyttävien tietokannan tietueiden tietyssä kentässä olevat arvot. +DSTDEV = TKESKIHAJONTA ## Laskee keskihajonnan tietokannasta valituista arvoista muodostuvan otoksen perusteella. +DSTDEVP = TKESKIHAJONTAP ## Laskee keskihajonnan tietokannasta valittujen arvojen koko populaation perusteella. +DSUM = TSUMMA ## Lisää luvut määritetyn ehdon täyttävien tietokannan tietueiden kenttäsarakkeeseen. +DVAR = TVARIANSSI ## Laskee varianssin tietokannasta valittujen arvojen otoksen perusteella. +DVARP = TVARIANSSIP ## Laskee varianssin tietokannasta valittujen arvojen koko populaation perusteella. + + +## +## Date and time functions Päivämäärä- ja aikafunktiot +## +DATE = PÄIVÄYS ## Palauttaa annetun päivämäärän järjestysluvun. +DATEVALUE = PÄIVÄYSARVO ## Muuntaa tekstimuodossa olevan päivämäärän järjestysluvuksi. +DAY = PÄIVÄ ## Muuntaa järjestysluvun kuukauden päiväksi. +DAYS360 = PÄIVÄT360 ## Laskee kahden päivämäärän välisten päivien määrän käyttäen perustana 360-päiväistä vuotta. +EDATE = PÄIVÄ.KUUKAUSI ## Palauttaa järjestyslukuna päivämäärän, joka poikkeaa aloituspäivän päivämäärästä annetun kuukausimäärän verran joko eteen- tai taaksepäin. +EOMONTH = KUUKAUSI.LOPPU ## Palauttaa järjestyslukuna sen kuukauden viimeisen päivämäärän, joka poikkeaa annetun kuukausimäärän verran eteen- tai taaksepäin. +HOUR = TUNNIT ## Muuntaa järjestysluvun tunneiksi. +MINUTE = MINUUTIT ## Muuntaa järjestysluvun minuuteiksi. +MONTH = KUUKAUSI ## Muuntaa järjestysluvun kuukausiksi. +NETWORKDAYS = TYÖPÄIVÄT ## Palauttaa kahden päivämäärän välissä olevien täysien työpäivien määrän. +NOW = NYT ## Palauttaa kuluvan päivämäärän ja ajan järjestysnumeron. +SECOND = SEKUNNIT ## Muuntaa järjestysluvun sekunneiksi. +TIME = AIKA ## Palauttaa annetun kellonajan järjestysluvun. +TIMEVALUE = AIKA_ARVO ## Muuntaa tekstimuodossa olevan kellonajan järjestysluvuksi. +TODAY = TÄMÄ.PÄIVÄ ## Palauttaa kuluvan päivän päivämäärän järjestysluvun. +WEEKDAY = VIIKONPÄIVÄ ## Muuntaa järjestysluvun viikonpäiväksi. +WEEKNUM = VIIKKO.NRO ## Muuntaa järjestysluvun luvuksi, joka ilmaisee viikon järjestysluvun vuoden alusta laskettuna. +WORKDAY = TYÖPÄIVÄ ## Palauttaa järjestysluvun päivämäärälle, joka sijaitsee annettujen työpäivien verran eteen tai taaksepäin. +YEAR = VUOSI ## Muuntaa järjestysluvun vuosiksi. +YEARFRAC = VUOSI.OSA ## Palauttaa määritettyjen päivämäärien (aloituspäivä ja lopetuspäivä) välisen osan vuodesta. + + +## +## Engineering functions Tekniset funktiot +## +BESSELI = BESSELI ## Palauttaa muunnetun Bessel-funktion In(x). +BESSELJ = BESSELJ ## Palauttaa Bessel-funktion Jn(x). +BESSELK = BESSELK ## Palauttaa muunnetun Bessel-funktion Kn(x). +BESSELY = BESSELY ## Palauttaa Bessel-funktion Yn(x). +BIN2DEC = BINDES ## Muuntaa binaariluvun desimaaliluvuksi. +BIN2HEX = BINHEKSA ## Muuntaa binaariluvun heksadesimaaliluvuksi. +BIN2OCT = BINOKT ## Muuntaa binaariluvun oktaaliluvuksi. +COMPLEX = KOMPLEKSI ## Muuntaa reaali- ja imaginaariosien kertoimet kompleksiluvuksi. +CONVERT = MUUNNA ## Muuntaa luvun toisen mittajärjestelmän mukaiseksi. +DEC2BIN = DESBIN ## Muuntaa desimaaliluvun binaariluvuksi. +DEC2HEX = DESHEKSA ## Muuntaa kymmenjärjestelmän luvun heksadesimaaliluvuksi. +DEC2OCT = DESOKT ## Muuntaa kymmenjärjestelmän luvun oktaaliluvuksi. +DELTA = SAMA.ARVO ## Tarkistaa, ovatko kaksi arvoa yhtä suuria. +ERF = VIRHEFUNKTIO ## Palauttaa virhefunktion. +ERFC = VIRHEFUNKTIO.KOMPLEMENTTI ## Palauttaa komplementtivirhefunktion. +GESTEP = RAJA ## Testaa, onko luku suurempi kuin kynnysarvo. +HEX2BIN = HEKSABIN ## Muuntaa heksadesimaaliluvun binaariluvuksi. +HEX2DEC = HEKSADES ## Muuntaa heksadesimaaliluvun desimaaliluvuksi. +HEX2OCT = HEKSAOKT ## Muuntaa heksadesimaaliluvun oktaaliluvuksi. +IMABS = KOMPLEKSI.ITSEISARVO ## Palauttaa kompleksiluvun itseisarvon (moduluksen). +IMAGINARY = KOMPLEKSI.IMAG ## Palauttaa kompleksiluvun imaginaariosan kertoimen. +IMARGUMENT = KOMPLEKSI.ARG ## Palauttaa theeta-argumentin, joka on radiaaneina annettu kulma. +IMCONJUGATE = KOMPLEKSI.KONJ ## Palauttaa kompleksiluvun konjugaattiluvun. +IMCOS = KOMPLEKSI.COS ## Palauttaa kompleksiluvun kosinin. +IMDIV = KOMPLEKSI.OSAM ## Palauttaa kahden kompleksiluvun osamäärän. +IMEXP = KOMPLEKSI.EKSP ## Palauttaa kompleksiluvun eksponentin. +IMLN = KOMPLEKSI.LN ## Palauttaa kompleksiluvun luonnollisen logaritmin. +IMLOG10 = KOMPLEKSI.LOG10 ## Palauttaa kompleksiluvun kymmenkantaisen logaritmin. +IMLOG2 = KOMPLEKSI.LOG2 ## Palauttaa kompleksiluvun kaksikantaisen logaritmin. +IMPOWER = KOMPLEKSI.POT ## Palauttaa kokonaislukupotenssiin korotetun kompleksiluvun. +IMPRODUCT = KOMPLEKSI.TULO ## Palauttaa kompleksilukujen tulon. +IMREAL = KOMPLEKSI.REAALI ## Palauttaa kompleksiluvun reaaliosan kertoimen. +IMSIN = KOMPLEKSI.SIN ## Palauttaa kompleksiluvun sinin. +IMSQRT = KOMPLEKSI.NELIÖJ ## Palauttaa kompleksiluvun neliöjuuren. +IMSUB = KOMPLEKSI.EROTUS ## Palauttaa kahden kompleksiluvun erotuksen. +IMSUM = KOMPLEKSI.SUM ## Palauttaa kompleksilukujen summan. +OCT2BIN = OKTBIN ## Muuntaa oktaaliluvun binaariluvuksi. +OCT2DEC = OKTDES ## Muuntaa oktaaliluvun desimaaliluvuksi. +OCT2HEX = OKTHEKSA ## Muuntaa oktaaliluvun heksadesimaaliluvuksi. + + +## +## Financial functions Rahoitusfunktiot +## +ACCRINT = KERTYNYT.KORKO ## Laskee arvopaperille kertyneen koron, kun korko kertyy säännöllisin väliajoin. +ACCRINTM = KERTYNYT.KORKO.LOPUSSA ## Laskee arvopaperille kertyneen koron, kun korko maksetaan eräpäivänä. +AMORDEGRC = AMORDEGRC ## Laskee kunkin laskentakauden poiston poistokerrointa käyttämällä. +AMORLINC = AMORLINC ## Palauttaa kunkin laskentakauden poiston. +COUPDAYBS = KORKOPÄIVÄT.ALUSTA ## Palauttaa koronmaksukauden aloituspäivän ja tilityspäivän välisen ajanjakson päivien määrän. +COUPDAYS = KORKOPÄIVÄT ## Palauttaa päivien määrän koronmaksukaudelta, johon tilityspäivä kuuluu. +COUPDAYSNC = KORKOPÄIVÄT.SEURAAVA ## Palauttaa tilityspäivän ja seuraavan koronmaksupäivän välisen ajanjakson päivien määrän. +COUPNCD = KORKOMAKSU.SEURAAVA ## Palauttaa tilityspäivän jälkeisen seuraavan koronmaksupäivän. +COUPNUM = KORKOPÄIVÄJAKSOT ## Palauttaa arvopaperin ostopäivän ja erääntymispäivän välisten koronmaksupäivien määrän. +COUPPCD = KORKOPÄIVÄ.EDELLINEN ## Palauttaa tilityspäivää edeltävän koronmaksupäivän. +CUMIPMT = MAKSETTU.KORKO ## Palauttaa kahden jakson välisenä aikana kertyneen koron. +CUMPRINC = MAKSETTU.LYHENNYS ## Palauttaa lainalle kahden jakson välisenä aikana kertyneen lyhennyksen. +DB = DB ## Palauttaa kauden kirjanpidollisen poiston amerikkalaisen DB-menetelmän (Fixed-declining balance) mukaan. +DDB = DDB ## Palauttaa kauden kirjanpidollisen poiston amerikkalaisen DDB-menetelmän (Double-Declining Balance) tai jonkin muun määrittämäsi menetelmän mukaan. +DISC = DISKONTTOKORKO ## Palauttaa arvopaperin diskonttokoron. +DOLLARDE = VALUUTTA.DES ## Muuntaa murtolukuna ilmoitetun valuuttamäärän desimaaliluvuksi. +DOLLARFR = VALUUTTA.MURTO ## Muuntaa desimaalilukuna ilmaistun valuuttamäärän murtoluvuksi. +DURATION = KESTO ## Palauttaa keston arvopaperille, jonka koronmaksu tapahtuu säännöllisesti. +EFFECT = KORKO.EFEKT ## Palauttaa todellisen vuosikoron. +FV = TULEVA.ARVO ## Palauttaa sijoituksen tulevan arvon. +FVSCHEDULE = TULEVA.ARVO.ERIKORKO ## Palauttaa pääoman tulevan arvon, kun pääomalle on kertynyt korkoa vaihtelevasti. +INTRATE = KORKO.ARVOPAPERI ## Palauttaa arvopaperin korkokannan täysin sijoitetulle arvopaperille. +IPMT = IPMT ## Laskee sijoitukselle tai lainalle tiettynä ajanjaksona kertyvän koron. +IRR = SISÄINEN.KORKO ## Laskee sisäisen korkokannan kassavirrasta muodostuvalle sarjalle. +ISPMT = ONMAKSU ## Laskee sijoituksen maksetun koron tietyllä jaksolla. +MDURATION = KESTO.MUUNN ## Palauttaa muunnetun Macauley-keston arvopaperille, jonka oletettu nimellisarvo on 100 euroa. +MIRR = MSISÄINEN ## Palauttaa sisäisen korkokannan, kun positiivisten ja negatiivisten kassavirtojen rahoituskorko on erilainen. +NOMINAL = KORKO.VUOSI ## Palauttaa vuosittaisen nimelliskoron. +NPER = NJAKSO ## Palauttaa sijoituksen jaksojen määrän. +NPV = NNA ## Palauttaa sijoituksen nykyarvon toistuvista kassavirroista muodostuvan sarjan ja diskonttokoron perusteella. +ODDFPRICE = PARITON.ENS.NIMELLISARVO ## Palauttaa arvopaperin hinnan tilanteessa, jossa ensimmäinen jakso on pariton. +ODDFYIELD = PARITON.ENS.TUOTTO ## Palauttaa arvopaperin tuoton tilanteessa, jossa ensimmäinen jakso on pariton. +ODDLPRICE = PARITON.VIIM.NIMELLISARVO ## Palauttaa arvopaperin hinnan tilanteessa, jossa viimeinen jakso on pariton. +ODDLYIELD = PARITON.VIIM.TUOTTO ## Palauttaa arvopaperin tuoton tilanteessa, jossa viimeinen jakso on pariton. +PMT = MAKSU ## Palauttaa annuiteetin kausittaisen maksuerän. +PPMT = PPMT ## Laskee sijoitukselle tai lainalle tiettynä ajanjaksona maksettavan lyhennyksen. +PRICE = HINTA ## Palauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan säännöllisin väliajoin. +PRICEDISC = HINTA.DISK ## Palauttaa diskontatun arvopaperin hinnan 100 euron nimellisarvoa kohden. +PRICEMAT = HINTA.LUNASTUS ## Palauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan erääntymispäivänä. +PV = NA ## Palauttaa sijoituksen nykyarvon. +RATE = KORKO ## Palauttaa annuiteetin kausittaisen korkokannan. +RECEIVED = SAATU.HINTA ## Palauttaa arvopaperin tuoton erääntymispäivänä kokonaan maksetulle sijoitukselle. +SLN = STP ## Palauttaa sijoituksen tasapoiston yhdeltä jaksolta. +SYD = VUOSIPOISTO ## Palauttaa sijoituksen vuosipoiston annettuna kautena amerikkalaisen SYD-menetelmän (Sum-of-Year's Digits) avulla. +TBILLEQ = OBLIG.TUOTTOPROS ## Palauttaa valtion obligaation tuoton vastaavana joukkovelkakirjan tuottona. +TBILLPRICE = OBLIG.HINTA ## Palauttaa obligaation hinnan 100 euron nimellisarvoa kohden. +TBILLYIELD = OBLIG.TUOTTO ## Palauttaa obligaation tuoton. +VDB = VDB ## Palauttaa annetun kauden tai kauden osan kirjanpidollisen poiston amerikkalaisen DB-menetelmän (Fixed-declining balance) mukaan. +XIRR = SISÄINEN.KORKO.JAKSOTON ## Palauttaa sisäisen korkokannan kassavirtojen sarjoille, jotka eivät välttämättä ole säännöllisiä. +XNPV = NNA.JAKSOTON ## Palauttaa nettonykyarvon kassavirtasarjalle, joka ei välttämättä ole kausittainen. +YIELD = TUOTTO ## Palauttaa tuoton arvopaperille, jonka korko maksetaan säännöllisin väliajoin. +YIELDDISC = TUOTTO.DISK ## Palauttaa diskontatun arvopaperin, kuten obligaation, vuosittaisen tuoton. +YIELDMAT = TUOTTO.ERÄP ## Palauttaa erääntymispäivänään korkoa tuottavan arvopaperin vuosittaisen tuoton. + + +## +## Information functions Erikoisfunktiot +## +CELL = SOLU ## Palauttaa tietoja solun muotoilusta, sijainnista ja sisällöstä. +ERROR.TYPE = VIRHEEN.LAJI ## Palauttaa virhetyyppiä vastaavan luvun. +INFO = KUVAUS ## Palauttaa tietoja nykyisestä käyttöympäristöstä. +ISBLANK = ONTYHJÄ ## Palauttaa arvon TOSI, jos arvo on tyhjä. +ISERR = ONVIRH ## Palauttaa arvon TOSI, jos arvo on mikä tahansa virhearvo paitsi arvo #PUUTTUU!. +ISERROR = ONVIRHE ## Palauttaa arvon TOSI, jos arvo on mikä tahansa virhearvo. +ISEVEN = ONPARILLINEN ## Palauttaa arvon TOSI, jos arvo on parillinen. +ISLOGICAL = ONTOTUUS ## Palauttaa arvon TOSI, jos arvo on mikä tahansa looginen arvo. +ISNA = ONPUUTTUU ## Palauttaa arvon TOSI, jos virhearvo on #PUUTTUU!. +ISNONTEXT = ONEI_TEKSTI ## Palauttaa arvon TOSI, jos arvo ei ole teksti. +ISNUMBER = ONLUKU ## Palauttaa arvon TOSI, jos arvo on luku. +ISODD = ONPARITON ## Palauttaa arvon TOSI, jos arvo on pariton. +ISREF = ONVIITT ## Palauttaa arvon TOSI, jos arvo on viittaus. +ISTEXT = ONTEKSTI ## Palauttaa arvon TOSI, jos arvo on teksti. +N = N ## Palauttaa arvon luvuksi muunnettuna. +NA = PUUTTUU ## Palauttaa virhearvon #PUUTTUU!. +TYPE = TYYPPI ## Palauttaa luvun, joka ilmaisee arvon tietotyypin. + + +## +## Logical functions Loogiset funktiot +## +AND = JA ## Palauttaa arvon TOSI, jos kaikkien argumenttien arvo on TOSI. +FALSE = EPÄTOSI ## Palauttaa totuusarvon EPÄTOSI. +IF = JOS ## Määrittää suoritettavan loogisen testin. +IFERROR = JOSVIRHE ## Palauttaa määrittämäsi arvon, jos kaavan tulos on virhe; muussa tapauksessa palauttaa kaavan tuloksen. +NOT = EI ## Kääntää argumentin loogisen arvon. +OR = TAI ## Palauttaa arvon TOSI, jos minkä tahansa argumentin arvo on TOSI. +TRUE = TOSI ## Palauttaa totuusarvon TOSI. + + +## +## Lookup and reference functions Haku- ja viitefunktiot +## +ADDRESS = OSOITE ## Palauttaa laskentataulukon soluun osoittavan viittauksen tekstinä. +AREAS = ALUEET ## Palauttaa viittauksessa olevien alueiden määrän. +CHOOSE = VALITSE.INDEKSI ## Valitsee arvon arvoluettelosta. +COLUMN = SARAKE ## Palauttaa viittauksen sarakenumeron. +COLUMNS = SARAKKEET ## Palauttaa viittauksessa olevien sarakkeiden määrän. +HLOOKUP = VHAKU ## Suorittaa haun matriisin ylimmältä riviltä ja palauttaa määritetyn solun arvon. +HYPERLINK = HYPERLINKKI ## Luo pikakuvakkeen tai tekstin, joka avaa verkkopalvelimeen, intranetiin tai Internetiin tallennetun tiedoston. +INDEX = INDEKSI ## Valitsee arvon viittauksesta tai matriisista indeksin mukaan. +INDIRECT = EPÄSUORA ## Palauttaa tekstiarvona ilmaistun viittauksen. +LOOKUP = HAKU ## Etsii arvoja vektorista tai matriisista. +MATCH = VASTINE ## Etsii arvoja viittauksesta tai matriisista. +OFFSET = SIIRTYMÄ ## Palauttaa annetun viittauksen siirtymän. +ROW = RIVI ## Palauttaa viittauksen rivinumeron. +ROWS = RIVIT ## Palauttaa viittauksessa olevien rivien määrän. +RTD = RTD ## Noutaa COM-automaatiota (automaatio: Tapa käsitellä sovelluksen objekteja toisesta sovelluksesta tai kehitystyökalusta. Automaatio, jota aiemmin kutsuttiin OLE-automaatioksi, on teollisuusstandardi ja COM-mallin (Component Object Model) ominaisuus.) tukevasta ohjelmasta reaaliaikaisia tietoja. +TRANSPOSE = TRANSPONOI ## Palauttaa matriisin käänteismatriisin. +VLOOKUP = PHAKU ## Suorittaa haun matriisin ensimmäisestä sarakkeesta ja palauttaa rivillä olevan solun arvon. + + +## +## Math and trigonometry functions Matemaattiset ja trigonometriset funktiot +## +ABS = ITSEISARVO ## Palauttaa luvun itseisarvon. +ACOS = ACOS ## Palauttaa luvun arkuskosinin. +ACOSH = ACOSH ## Palauttaa luvun käänteisen hyperbolisen kosinin. +ASIN = ASIN ## Palauttaa luvun arkussinin. +ASINH = ASINH ## Palauttaa luvun käänteisen hyperbolisen sinin. +ATAN = ATAN ## Palauttaa luvun arkustangentin. +ATAN2 = ATAN2 ## Palauttaa arkustangentin x- ja y-koordinaatin perusteella. +ATANH = ATANH ## Palauttaa luvun käänteisen hyperbolisen tangentin. +CEILING = PYÖRISTÄ.KERR.YLÖS ## Pyöristää luvun lähimpään kokonaislukuun tai tarkkuusargumentin lähimpään kerrannaiseen. +COMBIN = KOMBINAATIO ## Palauttaa mahdollisten kombinaatioiden määrän annetulle objektien määrälle. +COS = COS ## Palauttaa luvun kosinin. +COSH = COSH ## Palauttaa luvun hyperbolisen kosinin. +DEGREES = ASTEET ## Muuntaa radiaanit asteiksi. +EVEN = PARILLINEN ## Pyöristää luvun ylöspäin lähimpään parilliseen kokonaislukuun. +EXP = EKSPONENTTI ## Palauttaa e:n korotettuna annetun luvun osoittamaan potenssiin. +FACT = KERTOMA ## Palauttaa luvun kertoman. +FACTDOUBLE = KERTOMA.OSA ## Palauttaa luvun osakertoman. +FLOOR = PYÖRISTÄ.KERR.ALAS ## Pyöristää luvun alaspäin (nollaa kohti). +GCD = SUURIN.YHT.TEKIJÄ ## Palauttaa suurimman yhteisen tekijän. +INT = KOKONAISLUKU ## Pyöristää luvun alaspäin lähimpään kokonaislukuun. +LCM = PIENIN.YHT.JAETTAVA ## Palauttaa pienimmän yhteisen tekijän. +LN = LUONNLOG ## Palauttaa luvun luonnollisen logaritmin. +LOG = LOG ## Laskee luvun logaritmin käyttämällä annettua kantalukua. +LOG10 = LOG10 ## Palauttaa luvun kymmenkantaisen logaritmin. +MDETERM = MDETERM ## Palauttaa matriisin matriisideterminantin. +MINVERSE = MKÄÄNTEINEN ## Palauttaa matriisin käänteismatriisin. +MMULT = MKERRO ## Palauttaa kahden matriisin tulon. +MOD = JAKOJ ## Palauttaa jakolaskun jäännöksen. +MROUND = PYÖRISTÄ.KERR ## Palauttaa luvun pyöristettynä annetun luvun kerrannaiseen. +MULTINOMIAL = MULTINOMI ## Palauttaa lukujoukon multinomin. +ODD = PARITON ## Pyöristää luvun ylöspäin lähimpään parittomaan kokonaislukuun. +PI = PII ## Palauttaa piin arvon. +POWER = POTENSSI ## Palauttaa luvun korotettuna haluttuun potenssiin. +PRODUCT = TULO ## Kertoo annetut argumentit. +QUOTIENT = OSAMÄÄRÄ ## Palauttaa osamäärän kokonaislukuosan. +RADIANS = RADIAANIT ## Muuntaa asteet radiaaneiksi. +RAND = SATUNNAISLUKU ## Palauttaa satunnaisluvun väliltä 0–1. +RANDBETWEEN = SATUNNAISLUKU.VÄLILTÄ ## Palauttaa satunnaisluvun määritettyjen lukujen väliltä. +ROMAN = ROMAN ## Muuntaa arabialaisen numeron tekstimuotoiseksi roomalaiseksi numeroksi. +ROUND = PYÖRISTÄ ## Pyöristää luvun annettuun määrään desimaaleja. +ROUNDDOWN = PYÖRISTÄ.DES.ALAS ## Pyöristää luvun alaspäin (nollaa kohti). +ROUNDUP = PYÖRISTÄ.DES.YLÖS ## Pyöristää luvun ylöspäin (poispäin nollasta). +SERIESSUM = SARJA.SUMMA ## Palauttaa kaavaan perustuvan potenssisarjan arvon. +SIGN = ETUMERKKI ## Palauttaa luvun etumerkin. +SIN = SIN ## Palauttaa annetun kulman sinin. +SINH = SINH ## Palauttaa luvun hyperbolisen sinin. +SQRT = NELIÖJUURI ## Palauttaa positiivisen neliöjuuren. +SQRTPI = NELIÖJUURI.PII ## Palauttaa tulon (luku * pii) neliöjuuren. +SUBTOTAL = VÄLISUMMA ## Palauttaa luettelon tai tietokannan välisumman. +SUM = SUMMA ## Laskee yhteen annetut argumentit. +SUMIF = SUMMA.JOS ## Laskee ehdot täyttävien solujen summan. +SUMIFS = SUMMA.JOS.JOUKKO ## Laskee yhteen solualueen useita ehtoja vastaavat solut. +SUMPRODUCT = TULOJEN.SUMMA ## Palauttaa matriisin toisiaan vastaavien osien tulojen summan. +SUMSQ = NELIÖSUMMA ## Palauttaa argumenttien neliöiden summan. +SUMX2MY2 = NELIÖSUMMIEN.EROTUS ## Palauttaa kahden matriisin toisiaan vastaavien arvojen laskettujen neliösummien erotuksen. +SUMX2PY2 = NELIÖSUMMIEN.SUMMA ## Palauttaa kahden matriisin toisiaan vastaavien arvojen neliösummien summan. +SUMXMY2 = EROTUSTEN.NELIÖSUMMA ## Palauttaa kahden matriisin toisiaan vastaavien arvojen erotusten neliösumman. +TAN = TAN ## Palauttaa luvun tangentin. +TANH = TANH ## Palauttaa luvun hyperbolisen tangentin. +TRUNC = KATKAISE ## Katkaisee luvun kokonaisluvuksi. + + +## +## Statistical functions Tilastolliset funktiot +## +AVEDEV = KESKIPOIKKEAMA ## Palauttaa hajontojen itseisarvojen keskiarvon. +AVERAGE = KESKIARVO ## Palauttaa argumenttien keskiarvon. +AVERAGEA = KESKIARVOA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, keskiarvon. +AVERAGEIF = KESKIARVO.JOS ## Palauttaa alueen niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka täyttävät annetut ehdot. +AVERAGEIFS = KESKIARVO.JOS.JOUKKO ## Palauttaa niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka vastaavat useita ehtoja. +BETADIST = BEETAJAKAUMA ## Palauttaa kumulatiivisen beetajakaumafunktion arvon. +BETAINV = BEETAJAKAUMA.KÄÄNT ## Palauttaa määritetyn beetajakauman käänteisen kumulatiivisen jakaumafunktion arvon. +BINOMDIST = BINOMIJAKAUMA ## Palauttaa yksittäisen termin binomijakaumatodennäköisyyden. +CHIDIST = CHIJAKAUMA ## Palauttaa yksisuuntaisen chi-neliön jakauman todennäköisyyden. +CHIINV = CHIJAKAUMA.KÄÄNT ## Palauttaa yksisuuntaisen chi-neliön jakauman todennäköisyyden käänteisarvon. +CHITEST = CHITESTI ## Palauttaa riippumattomuustestin tuloksen. +CONFIDENCE = LUOTTAMUSVÄLI ## Palauttaa luottamusvälin populaation keskiarvolle. +CORREL = KORRELAATIO ## Palauttaa kahden arvojoukon korrelaatiokertoimen. +COUNT = LASKE ## Laskee argumenttiluettelossa olevien lukujen määrän. +COUNTA = LASKE.A ## Laskee argumenttiluettelossa olevien arvojen määrän. +COUNTBLANK = LASKE.TYHJÄT ## Laskee alueella olevien tyhjien solujen määrän. +COUNTIF = LASKE.JOS ## Laskee alueella olevien sellaisten solujen määrän, joiden sisältö vastaa annettuja ehtoja. +COUNTIFS = LASKE.JOS.JOUKKO ## Laskee alueella olevien sellaisten solujen määrän, joiden sisältö vastaa useita ehtoja. +COVAR = KOVARIANSSI ## Palauttaa kovarianssin, joka on keskiarvo havaintoaineiston kunkin pisteparin poikkeamien tuloista. +CRITBINOM = BINOMIJAKAUMA.KRIT ## Palauttaa pienimmän arvon, jossa binomijakauman kertymäfunktion arvo on pienempi tai yhtä suuri kuin vertailuarvo. +DEVSQ = OIKAISTU.NELIÖSUMMA ## Palauttaa keskipoikkeamien neliösumman. +EXPONDIST = EKSPONENTIAALIJAKAUMA ## Palauttaa eksponentiaalijakauman. +FDIST = FJAKAUMA ## Palauttaa F-todennäköisyysjakauman. +FINV = FJAKAUMA.KÄÄNT ## Palauttaa F-todennäköisyysjakauman käänteisfunktion. +FISHER = FISHER ## Palauttaa Fisher-muunnoksen. +FISHERINV = FISHER.KÄÄNT ## Palauttaa käänteisen Fisher-muunnoksen. +FORECAST = ENNUSTE ## Palauttaa lineaarisen trendin arvon. +FREQUENCY = TAAJUUS ## Palauttaa frekvenssijakautuman pystysuuntaisena matriisina. +FTEST = FTESTI ## Palauttaa F-testin tuloksen. +GAMMADIST = GAMMAJAKAUMA ## Palauttaa gammajakauman. +GAMMAINV = GAMMAJAKAUMA.KÄÄNT ## Palauttaa käänteisen gammajakauman kertymäfunktion. +GAMMALN = GAMMALN ## Palauttaa gammafunktion luonnollisen logaritmin G(x). +GEOMEAN = KESKIARVO.GEOM ## Palauttaa geometrisen keskiarvon. +GROWTH = KASVU ## Palauttaa eksponentiaalisen trendin arvon. +HARMEAN = KESKIARVO.HARM ## Palauttaa harmonisen keskiarvon. +HYPGEOMDIST = HYPERGEOM.JAKAUMA ## Palauttaa hypergeometrisen jakauman. +INTERCEPT = LEIKKAUSPISTE ## Palauttaa lineaarisen regressiosuoran leikkauspisteen. +KURT = KURT ## Palauttaa tietoalueen vinous-arvon eli huipukkuuden. +LARGE = SUURI ## Palauttaa tietojoukon k:nneksi suurimman arvon. +LINEST = LINREGR ## Palauttaa lineaarisen trendin parametrit. +LOGEST = LOGREGR ## Palauttaa eksponentiaalisen trendin parametrit. +LOGINV = LOGNORM.JAKAUMA.KÄÄNT ## Palauttaa lognormeeratun jakauman käänteisfunktion. +LOGNORMDIST = LOGNORM.JAKAUMA ## Palauttaa lognormaalisen jakauman kertymäfunktion. +MAX = MAKS ## Palauttaa suurimman arvon argumenttiluettelosta. +MAXA = MAKSA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, suurimman arvon. +MEDIAN = MEDIAANI ## Palauttaa annettujen lukujen mediaanin. +MIN = MIN ## Palauttaa pienimmän arvon argumenttiluettelosta. +MINA = MINA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, pienimmän arvon. +MODE = MOODI ## Palauttaa tietojoukossa useimmin esiintyvän arvon. +NEGBINOMDIST = BINOMIJAKAUMA.NEG ## Palauttaa negatiivisen binomijakauman. +NORMDIST = NORM.JAKAUMA ## Palauttaa normaalijakauman kertymäfunktion. +NORMINV = NORM.JAKAUMA.KÄÄNT ## Palauttaa käänteisen normaalijakauman kertymäfunktion. +NORMSDIST = NORM.JAKAUMA.NORMIT ## Palauttaa normitetun normaalijakauman kertymäfunktion. +NORMSINV = NORM.JAKAUMA.NORMIT.KÄÄNT ## Palauttaa normitetun normaalijakauman kertymäfunktion käänteisarvon. +PEARSON = PEARSON ## Palauttaa Pearsonin tulomomenttikorrelaatiokertoimen. +PERCENTILE = PROSENTTIPISTE ## Palauttaa alueen arvojen k:nnen prosenttipisteen. +PERCENTRANK = PROSENTTIJÄRJESTYS ## Palauttaa tietojoukon arvon prosentuaalisen järjestysluvun. +PERMUT = PERMUTAATIO ## Palauttaa mahdollisten permutaatioiden määrän annetulle objektien määrälle. +POISSON = POISSON ## Palauttaa Poissonin todennäköisyysjakauman. +PROB = TODENNÄKÖISYYS ## Palauttaa todennäköisyyden sille, että arvot ovat tietyltä väliltä. +QUARTILE = NELJÄNNES ## Palauttaa tietoalueen neljänneksen. +RANK = ARVON.MUKAAN ## Palauttaa luvun paikan lukuarvoluettelossa. +RSQ = PEARSON.NELIÖ ## Palauttaa Pearsonin tulomomenttikorrelaatiokertoimen neliön. +SKEW = JAKAUMAN.VINOUS ## Palauttaa jakauman vinouden. +SLOPE = KULMAKERROIN ## Palauttaa lineaarisen regressiosuoran kulmakertoimen. +SMALL = PIENI ## Palauttaa tietojoukon k:nneksi pienimmän arvon. +STANDARDIZE = NORMITA ## Palauttaa normitetun arvon. +STDEV = KESKIHAJONTA ## Laskee populaation keskihajonnan otoksen perusteella. +STDEVA = KESKIHAJONTAA ## Laskee populaation keskihajonnan otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot. +STDEVP = KESKIHAJONTAP ## Laskee normaalijakautuman koko populaation perusteella. +STDEVPA = KESKIHAJONTAPA ## Laskee populaation keskihajonnan koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot. +STEYX = KESKIVIRHE ## Palauttaa regression kutakin x-arvoa vastaavan ennustetun y-arvon keskivirheen. +TDIST = TJAKAUMA ## Palauttaa t-jakautuman. +TINV = TJAKAUMA.KÄÄNT ## Palauttaa käänteisen t-jakauman. +TREND = SUUNTAUS ## Palauttaa lineaarisen trendin arvoja. +TRIMMEAN = KESKIARVO.TASATTU ## Palauttaa tietojoukon tasatun keskiarvon. +TTEST = TTESTI ## Palauttaa t-testiin liittyvän todennäköisyyden. +VAR = VAR ## Arvioi populaation varianssia otoksen perusteella. +VARA = VARA ## Laskee populaation varianssin otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot. +VARP = VARP ## Laskee varianssin koko populaation perusteella. +VARPA = VARPA ## Laskee populaation varianssin koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot. +WEIBULL = WEIBULL ## Palauttaa Weibullin jakauman. +ZTEST = ZTESTI ## Palauttaa z-testin yksisuuntaisen todennäköisyysarvon. + + +## +## Text functions Tekstifunktiot +## +ASC = ASC ## Muuntaa merkkijonossa olevat englanninkieliset DBCS- tai katakana-merkit SBCS-merkeiksi. +BAHTTEXT = BAHTTEKSTI ## Muuntaa luvun tekstiksi ß (baht) -valuuttamuotoa käyttämällä. +CHAR = MERKKI ## Palauttaa koodin lukua vastaavan merkin. +CLEAN = SIIVOA ## Poistaa tekstistä kaikki tulostumattomat merkit. +CODE = KOODI ## Palauttaa tekstimerkkijonon ensimmäisen merkin numerokoodin. +CONCATENATE = KETJUTA ## Yhdistää useat merkkijonot yhdeksi merkkijonoksi. +DOLLAR = VALUUTTA ## Muuntaa luvun tekstiksi $ (dollari) -valuuttamuotoa käyttämällä. +EXACT = VERTAA ## Tarkistaa, ovatko kaksi tekstiarvoa samanlaiset. +FIND = ETSI ## Etsii tekstiarvon toisen tekstin sisältä (tunnistaa isot ja pienet kirjaimet). +FINDB = ETSIB ## Etsii tekstiarvon toisen tekstin sisältä (tunnistaa isot ja pienet kirjaimet). +FIXED = KIINTEÄ ## Muotoilee luvun tekstiksi, jossa on kiinteä määrä desimaaleja. +JIS = JIS ## Muuntaa merkkijonossa olevat englanninkieliset SBCS- tai katakana-merkit DBCS-merkeiksi. +LEFT = VASEN ## Palauttaa tekstiarvon vasemmanpuoliset merkit. +LEFTB = VASENB ## Palauttaa tekstiarvon vasemmanpuoliset merkit. +LEN = PITUUS ## Palauttaa tekstimerkkijonon merkkien määrän. +LENB = PITUUSB ## Palauttaa tekstimerkkijonon merkkien määrän. +LOWER = PIENET ## Muuntaa tekstin pieniksi kirjaimiksi. +MID = POIMI.TEKSTI ## Palauttaa määritetyn määrän merkkejä merkkijonosta alkaen annetusta kohdasta. +MIDB = POIMI.TEKSTIB ## Palauttaa määritetyn määrän merkkejä merkkijonosta alkaen annetusta kohdasta. +PHONETIC = FONEETTINEN ## Hakee foneettiset (furigana) merkit merkkijonosta. +PROPER = ERISNIMI ## Muuttaa merkkijonon kunkin sanan ensimmäisen kirjaimen isoksi. +REPLACE = KORVAA ## Korvaa tekstissä olevat merkit. +REPLACEB = KORVAAB ## Korvaa tekstissä olevat merkit. +REPT = TOISTA ## Toistaa tekstin annetun määrän kertoja. +RIGHT = OIKEA ## Palauttaa tekstiarvon oikeanpuoliset merkit. +RIGHTB = OIKEAB ## Palauttaa tekstiarvon oikeanpuoliset merkit. +SEARCH = KÄY.LÄPI ## Etsii tekstiarvon toisen tekstin sisältä (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi). +SEARCHB = KÄY.LÄPIB ## Etsii tekstiarvon toisen tekstin sisältä (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi). +SUBSTITUTE = VAIHDA ## Korvaa merkkijonossa olevan tekstin toisella. +T = T ## Muuntaa argumentit tekstiksi. +TEXT = TEKSTI ## Muotoilee luvun ja muuntaa sen tekstiksi. +TRIM = POISTA.VÄLIT ## Poistaa välilyönnit tekstistä. +UPPER = ISOT ## Muuntaa tekstin isoiksi kirjaimiksi. +VALUE = ARVO ## Muuntaa tekstiargumentin luvuksi. diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/fr/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fr/config new file mode 100644 index 000000000..8ae183a69 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fr/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NUL! +DIV0 = #DIV/0! +VALUE = #VALEUR! +REF = #REF! +NAME = #NOM? +NUM = #NOMBRE! +NA = #N/A diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/fr/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fr/functions new file mode 100644 index 000000000..ebb8339b6 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/fr/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Fonctions de complément et d’automatisation +## +GETPIVOTDATA = LIREDONNEESTABCROISDYNAMIQUE ## Renvoie les données stockées dans un rapport de tableau croisé dynamique. + + +## +## Cube functions Fonctions Cube +## +CUBEKPIMEMBER = MEMBREKPICUBE ## Renvoie un nom, une propriété et une mesure d’indicateur de performance clé et affiche le nom et la propriété dans la cellule. Un indicateur de performance clé est une mesure quantifiable, telle que la marge bénéficiaire brute mensuelle ou la rotation trimestrielle du personnel, utilisée pour évaluer les performances d’une entreprise. +CUBEMEMBER = MEMBRECUBE ## Renvoie un membre ou un uplet dans une hiérarchie de cubes. Utilisez cette fonction pour valider l’existence du membre ou de l’uplet dans le cube. +CUBEMEMBERPROPERTY = PROPRIETEMEMBRECUBE ## Renvoie la valeur d’une propriété de membre du cube. Utilisez cette fonction pour valider l’existence d’un nom de membre dans le cube et pour renvoyer la propriété spécifiée pour ce membre. +CUBERANKEDMEMBER = RANGMEMBRECUBE ## Renvoie le nième membre ou le membre placé à un certain rang dans un ensemble. Utilisez cette fonction pour renvoyer un ou plusieurs éléments d’un ensemble, tels que les meilleurs vendeurs ou les 10 meilleurs étudiants. +CUBESET = JEUCUBE ## Définit un ensemble calculé de membres ou d’uplets en envoyant une expression définie au cube sur le serveur qui crée l’ensemble et le renvoie à Microsoft Office Excel. +CUBESETCOUNT = NBJEUCUBE ## Renvoie le nombre d’éléments dans un jeu. +CUBEVALUE = VALEURCUBE ## Renvoie une valeur d’agrégation issue d’un cube. + + +## +## Database functions Fonctions de base de données +## +DAVERAGE = BDMOYENNE ## Renvoie la moyenne des entrées de base de données sélectionnées. +DCOUNT = BCOMPTE ## Compte le nombre de cellules d’une base de données qui contiennent des nombres. +DCOUNTA = BDNBVAL ## Compte les cellules non vides d’une base de données. +DGET = BDLIRE ## Extrait d’une base de données un enregistrement unique répondant aux critères spécifiés. +DMAX = BDMAX ## Renvoie la valeur maximale des entrées de base de données sélectionnées. +DMIN = BDMIN ## Renvoie la valeur minimale des entrées de base de données sélectionnées. +DPRODUCT = BDPRODUIT ## Multiplie les valeurs d’un champ particulier des enregistrements d’une base de données, qui répondent aux critères spécifiés. +DSTDEV = BDECARTYPE ## Calcule l’écart type pour un échantillon d’entrées de base de données sélectionnées. +DSTDEVP = BDECARTYPEP ## Calcule l’écart type pour l’ensemble d’une population d’entrées de base de données sélectionnées. +DSUM = BDSOMME ## Ajoute les nombres dans la colonne de champ des enregistrements de la base de données, qui répondent aux critères. +DVAR = BDVAR ## Calcule la variance pour un échantillon d’entrées de base de données sélectionnées. +DVARP = BDVARP ## Calcule la variance pour l’ensemble d’une population d’entrées de base de données sélectionnées. + + +## +## Date and time functions Fonctions de date et d’heure +## +DATE = DATE ## Renvoie le numéro de série d’une date précise. +DATEVALUE = DATEVAL ## Convertit une date représentée sous forme de texte en numéro de série. +DAY = JOUR ## Convertit un numéro de série en jour du mois. +DAYS360 = JOURS360 ## Calcule le nombre de jours qui séparent deux dates sur la base d’une année de 360 jours. +EDATE = MOIS.DECALER ## Renvoie le numéro séquentiel de la date qui représente une date spécifiée (l’argument date_départ), corrigée en plus ou en moins du nombre de mois indiqué. +EOMONTH = FIN.MOIS ## Renvoie le numéro séquentiel de la date du dernier jour du mois précédant ou suivant la date_départ du nombre de mois indiqué. +HOUR = HEURE ## Convertit un numéro de série en heure. +MINUTE = MINUTE ## Convertit un numéro de série en minute. +MONTH = MOIS ## Convertit un numéro de série en mois. +NETWORKDAYS = NB.JOURS.OUVRES ## Renvoie le nombre de jours ouvrés entiers compris entre deux dates. +NOW = MAINTENANT ## Renvoie le numéro de série de la date et de l’heure du jour. +SECOND = SECONDE ## Convertit un numéro de série en seconde. +TIME = TEMPS ## Renvoie le numéro de série d’une heure précise. +TIMEVALUE = TEMPSVAL ## Convertit une date représentée sous forme de texte en numéro de série. +TODAY = AUJOURDHUI ## Renvoie le numéro de série de la date du jour. +WEEKDAY = JOURSEM ## Convertit un numéro de série en jour de la semaine. +WEEKNUM = NO.SEMAINE ## Convertit un numéro de série en un numéro représentant l’ordre de la semaine dans l’année. +WORKDAY = SERIE.JOUR.OUVRE ## Renvoie le numéro de série de la date avant ou après le nombre de jours ouvrés spécifiés. +YEAR = ANNEE ## Convertit un numéro de série en année. +YEARFRAC = FRACTION.ANNEE ## Renvoie la fraction de l’année représentant le nombre de jours entre la date de début et la date de fin. + + +## +## Engineering functions Fonctions d’ingénierie +## +BESSELI = BESSELI ## Renvoie la fonction Bessel modifiée In(x). +BESSELJ = BESSELJ ## Renvoie la fonction Bessel Jn(x). +BESSELK = BESSELK ## Renvoie la fonction Bessel modifiée Kn(x). +BESSELY = BESSELY ## Renvoie la fonction Bessel Yn(x). +BIN2DEC = BINDEC ## Convertit un nombre binaire en nombre décimal. +BIN2HEX = BINHEX ## Convertit un nombre binaire en nombre hexadécimal. +BIN2OCT = BINOCT ## Convertit un nombre binaire en nombre octal. +COMPLEX = COMPLEXE ## Convertit des coefficients réel et imaginaire en un nombre complexe. +CONVERT = CONVERT ## Convertit un nombre d’une unité de mesure à une autre. +DEC2BIN = DECBIN ## Convertit un nombre décimal en nombre binaire. +DEC2HEX = DECHEX ## Convertit un nombre décimal en nombre hexadécimal. +DEC2OCT = DECOCT ## Convertit un nombre décimal en nombre octal. +DELTA = DELTA ## Teste l’égalité de deux nombres. +ERF = ERF ## Renvoie la valeur de la fonction d’erreur. +ERFC = ERFC ## Renvoie la valeur de la fonction d’erreur complémentaire. +GESTEP = SUP.SEUIL ## Teste si un nombre est supérieur à une valeur de seuil. +HEX2BIN = HEXBIN ## Convertit un nombre hexadécimal en nombre binaire. +HEX2DEC = HEXDEC ## Convertit un nombre hexadécimal en nombre décimal. +HEX2OCT = HEXOCT ## Convertit un nombre hexadécimal en nombre octal. +IMABS = COMPLEXE.MODULE ## Renvoie la valeur absolue (module) d’un nombre complexe. +IMAGINARY = COMPLEXE.IMAGINAIRE ## Renvoie le coefficient imaginaire d’un nombre complexe. +IMARGUMENT = COMPLEXE.ARGUMENT ## Renvoie l’argument thêta, un angle exprimé en radians. +IMCONJUGATE = COMPLEXE.CONJUGUE ## Renvoie le nombre complexe conjugué d’un nombre complexe. +IMCOS = IMCOS ## Renvoie le cosinus d’un nombre complexe. +IMDIV = COMPLEXE.DIV ## Renvoie le quotient de deux nombres complexes. +IMEXP = COMPLEXE.EXP ## Renvoie la fonction exponentielle d’un nombre complexe. +IMLN = COMPLEXE.LN ## Renvoie le logarithme népérien d’un nombre complexe. +IMLOG10 = COMPLEXE.LOG10 ## Calcule le logarithme en base 10 d’un nombre complexe. +IMLOG2 = COMPLEXE.LOG2 ## Calcule le logarithme en base 2 d’un nombre complexe. +IMPOWER = COMPLEXE.PUISSANCE ## Renvoie un nombre complexe élevé à une puissance entière. +IMPRODUCT = COMPLEXE.PRODUIT ## Renvoie le produit de plusieurs nombres complexes. +IMREAL = COMPLEXE.REEL ## Renvoie le coefficient réel d’un nombre complexe. +IMSIN = COMPLEXE.SIN ## Renvoie le sinus d’un nombre complexe. +IMSQRT = COMPLEXE.RACINE ## Renvoie la racine carrée d’un nombre complexe. +IMSUB = COMPLEXE.DIFFERENCE ## Renvoie la différence entre deux nombres complexes. +IMSUM = COMPLEXE.SOMME ## Renvoie la somme de plusieurs nombres complexes. +OCT2BIN = OCTBIN ## Convertit un nombre octal en nombre binaire. +OCT2DEC = OCTDEC ## Convertit un nombre octal en nombre décimal. +OCT2HEX = OCTHEX ## Convertit un nombre octal en nombre hexadécimal. + + +## +## Financial functions Fonctions financières +## +ACCRINT = INTERET.ACC ## Renvoie l’intérêt couru non échu d’un titre dont l’intérêt est perçu périodiquement. +ACCRINTM = INTERET.ACC.MAT ## Renvoie l’intérêt couru non échu d’un titre dont l’intérêt est perçu à l’échéance. +AMORDEGRC = AMORDEGRC ## Renvoie l’amortissement correspondant à chaque période comptable en utilisant un coefficient d’amortissement. +AMORLINC = AMORLINC ## Renvoie l’amortissement d’un bien à la fin d’une période fiscale donnée. +COUPDAYBS = NB.JOURS.COUPON.PREC ## Renvoie le nombre de jours entre le début de la période de coupon et la date de liquidation. +COUPDAYS = NB.JOURS.COUPONS ## Renvoie le nombre de jours pour la période du coupon contenant la date de liquidation. +COUPDAYSNC = NB.JOURS.COUPON.SUIV ## Renvoie le nombre de jours entre la date de liquidation et la date du coupon suivant la date de liquidation. +COUPNCD = DATE.COUPON.SUIV ## Renvoie la première date de coupon ultérieure à la date de règlement. +COUPNUM = NB.COUPONS ## Renvoie le nombre de coupons dus entre la date de règlement et la date d’échéance. +COUPPCD = DATE.COUPON.PREC ## Renvoie la date de coupon précédant la date de règlement. +CUMIPMT = CUMUL.INTER ## Renvoie l’intérêt cumulé payé sur un emprunt entre deux périodes. +CUMPRINC = CUMUL.PRINCPER ## Renvoie le montant cumulé des remboursements du capital d’un emprunt effectués entre deux périodes. +DB = DB ## Renvoie l’amortissement d’un bien pour une période spécifiée en utilisant la méthode de l’amortissement dégressif à taux fixe. +DDB = DDB ## Renvoie l’amortissement d’un bien pour toute période spécifiée, en utilisant la méthode de l’amortissement dégressif à taux double ou selon un coefficient à spécifier. +DISC = TAUX.ESCOMPTE ## Calcule le taux d’escompte d’une transaction. +DOLLARDE = PRIX.DEC ## Convertit un prix en euros, exprimé sous forme de fraction, en un prix en euros exprimé sous forme de nombre décimal. +DOLLARFR = PRIX.FRAC ## Convertit un prix en euros, exprimé sous forme de nombre décimal, en un prix en euros exprimé sous forme de fraction. +DURATION = DUREE ## Renvoie la durée, en années, d’un titre dont l’intérêt est perçu périodiquement. +EFFECT = TAUX.EFFECTIF ## Renvoie le taux d’intérêt annuel effectif. +FV = VC ## Renvoie la valeur future d’un investissement. +FVSCHEDULE = VC.PAIEMENTS ## Calcule la valeur future d’un investissement en appliquant une série de taux d’intérêt composites. +INTRATE = TAUX.INTERET ## Affiche le taux d’intérêt d’un titre totalement investi. +IPMT = INTPER ## Calcule le montant des intérêts d’un investissement pour une période donnée. +IRR = TRI ## Calcule le taux de rentabilité interne d’un investissement pour une succession de trésoreries. +ISPMT = ISPMT ## Calcule le montant des intérêts d’un investissement pour une période donnée. +MDURATION = DUREE.MODIFIEE ## Renvoie la durée de Macauley modifiée pour un titre ayant une valeur nominale hypothétique de 100_euros. +MIRR = TRIM ## Calcule le taux de rentabilité interne lorsque les paiements positifs et négatifs sont financés à des taux différents. +NOMINAL = TAUX.NOMINAL ## Calcule le taux d’intérêt nominal annuel. +NPER = NPM ## Renvoie le nombre de versements nécessaires pour rembourser un emprunt. +NPV = VAN ## Calcule la valeur actuelle nette d’un investissement basé sur une série de décaissements et un taux d’escompte. +ODDFPRICE = PRIX.PCOUPON.IRREG ## Renvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la première période de coupon est irrégulière. +ODDFYIELD = REND.PCOUPON.IRREG ## Renvoie le taux de rendement d’un titre dont la première période de coupon est irrégulière. +ODDLPRICE = PRIX.DCOUPON.IRREG ## Renvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la première période de coupon est irrégulière. +ODDLYIELD = REND.DCOUPON.IRREG ## Renvoie le taux de rendement d’un titre dont la dernière période de coupon est irrégulière. +PMT = VPM ## Calcule le paiement périodique d’un investissement donné. +PPMT = PRINCPER ## Calcule, pour une période donnée, la part de remboursement du principal d’un investissement. +PRICE = PRIX.TITRE ## Renvoie le prix d’un titre rapportant des intérêts périodiques, pour une valeur nominale de 100 euros. +PRICEDISC = VALEUR.ENCAISSEMENT ## Renvoie la valeur d’encaissement d’un escompte commercial, pour une valeur nominale de 100 euros. +PRICEMAT = PRIX.TITRE.ECHEANCE ## Renvoie le prix d’un titre dont la valeur nominale est 100 euros et qui rapporte des intérêts à l’échéance. +PV = PV ## Calcule la valeur actuelle d’un investissement. +RATE = TAUX ## Calcule le taux d’intérêt par période pour une annuité. +RECEIVED = VALEUR.NOMINALE ## Renvoie la valeur nominale à échéance d’un effet de commerce. +SLN = AMORLIN ## Calcule l’amortissement linéaire d’un bien pour une période donnée. +SYD = SYD ## Calcule l’amortissement d’un bien pour une période donnée sur la base de la méthode américaine Sum-of-Years Digits (amortissement dégressif à taux décroissant appliqué à une valeur constante). +TBILLEQ = TAUX.ESCOMPTE.R ## Renvoie le taux d’escompte rationnel d’un bon du Trésor. +TBILLPRICE = PRIX.BON.TRESOR ## Renvoie le prix d’un bon du Trésor d’une valeur nominale de 100 euros. +TBILLYIELD = RENDEMENT.BON.TRESOR ## Calcule le taux de rendement d’un bon du Trésor. +VDB = VDB ## Renvoie l’amortissement d’un bien pour une période spécifiée ou partielle en utilisant une méthode de l’amortissement dégressif à taux fixe. +XIRR = TRI.PAIEMENTS ## Calcule le taux de rentabilité interne d’un ensemble de paiements non périodiques. +XNPV = VAN.PAIEMENTS ## Renvoie la valeur actuelle nette d’un ensemble de paiements non périodiques. +YIELD = RENDEMENT.TITRE ## Calcule le rendement d’un titre rapportant des intérêts périodiquement. +YIELDDISC = RENDEMENT.SIMPLE ## Calcule le taux de rendement d’un emprunt à intérêt simple (par exemple, un bon du Trésor). +YIELDMAT = RENDEMENT.TITRE.ECHEANCE ## Renvoie le rendement annuel d’un titre qui rapporte des intérêts à l’échéance. + + +## +## Information functions Fonctions d’information +## +CELL = CELLULE ## Renvoie des informations sur la mise en forme, l’emplacement et le contenu d’une cellule. +ERROR.TYPE = TYPE.ERREUR ## Renvoie un nombre correspondant à un type d’erreur. +INFO = INFORMATIONS ## Renvoie des informations sur l’environnement d’exploitation actuel. +ISBLANK = ESTVIDE ## Renvoie VRAI si l’argument valeur est vide. +ISERR = ESTERR ## Renvoie VRAI si l’argument valeur fait référence à une valeur d’erreur, sauf #N/A. +ISERROR = ESTERREUR ## Renvoie VRAI si l’argument valeur fait référence à une valeur d’erreur. +ISEVEN = EST.PAIR ## Renvoie VRAI si le chiffre est pair. +ISLOGICAL = ESTLOGIQUE ## Renvoie VRAI si l’argument valeur fait référence à une valeur logique. +ISNA = ESTNA ## Renvoie VRAI si l’argument valeur fait référence à la valeur d’erreur #N/A. +ISNONTEXT = ESTNONTEXTE ## Renvoie VRAI si l’argument valeur ne se présente pas sous forme de texte. +ISNUMBER = ESTNUM ## Renvoie VRAI si l’argument valeur représente un nombre. +ISODD = EST.IMPAIR ## Renvoie VRAI si le chiffre est impair. +ISREF = ESTREF ## Renvoie VRAI si l’argument valeur est une référence. +ISTEXT = ESTTEXTE ## Renvoie VRAI si l’argument valeur se présente sous forme de texte. +N = N ## Renvoie une valeur convertie en nombre. +NA = NA ## Renvoie la valeur d’erreur #N/A. +TYPE = TYPE ## Renvoie un nombre indiquant le type de données d’une valeur. + + +## +## Logical functions Fonctions logiques +## +AND = ET ## Renvoie VRAI si tous ses arguments sont VRAI. +FALSE = FAUX ## Renvoie la valeur logique FAUX. +IF = SI ## Spécifie un test logique à effectuer. +IFERROR = SIERREUR ## Renvoie une valeur que vous spécifiez si une formule génère une erreur ; sinon, elle renvoie le résultat de la formule. +NOT = NON ## Inverse la logique de cet argument. +OR = OU ## Renvoie VRAI si un des arguments est VRAI. +TRUE = VRAI ## Renvoie la valeur logique VRAI. + + +## +## Lookup and reference functions Fonctions de recherche et de référence +## +ADDRESS = ADRESSE ## Renvoie une référence sous forme de texte à une seule cellule d’une feuille de calcul. +AREAS = ZONES ## Renvoie le nombre de zones dans une référence. +CHOOSE = CHOISIR ## Choisit une valeur dans une liste. +COLUMN = COLONNE ## Renvoie le numéro de colonne d’une référence. +COLUMNS = COLONNES ## Renvoie le nombre de colonnes dans une référence. +HLOOKUP = RECHERCHEH ## Effectue une recherche dans la première ligne d’une matrice et renvoie la valeur de la cellule indiquée. +HYPERLINK = LIEN_HYPERTEXTE ## Crée un raccourci ou un renvoi qui ouvre un document stocké sur un serveur réseau, sur un réseau Intranet ou sur Internet. +INDEX = INDEX ## Utilise un index pour choisir une valeur provenant d’une référence ou d’une matrice. +INDIRECT = INDIRECT ## Renvoie une référence indiquée par une valeur de texte. +LOOKUP = RECHERCHE ## Recherche des valeurs dans un vecteur ou une matrice. +MATCH = EQUIV ## Recherche des valeurs dans une référence ou une matrice. +OFFSET = DECALER ## Renvoie une référence décalée par rapport à une référence donnée. +ROW = LIGNE ## Renvoie le numéro de ligne d’une référence. +ROWS = LIGNES ## Renvoie le nombre de lignes dans une référence. +RTD = RTD ## Extrait les données en temps réel à partir d’un programme prenant en charge l’automation COM (Automation : utilisation des objets d'une application à partir d'une autre application ou d'un autre outil de développement. Autrefois appelée OLE Automation, Automation est une norme industrielle et une fonctionnalité du modèle d'objet COM (Component Object Model).). +TRANSPOSE = TRANSPOSE ## Renvoie la transposition d’une matrice. +VLOOKUP = RECHERCHEV ## Effectue une recherche dans la première colonne d’une matrice et se déplace sur la ligne pour renvoyer la valeur d’une cellule. + + +## +## Math and trigonometry functions Fonctions mathématiques et trigonométriques +## +ABS = ABS ## Renvoie la valeur absolue d’un nombre. +ACOS = ACOS ## Renvoie l’arccosinus d’un nombre. +ACOSH = ACOSH ## Renvoie le cosinus hyperbolique inverse d’un nombre. +ASIN = ASIN ## Renvoie l’arcsinus d’un nombre. +ASINH = ASINH ## Renvoie le sinus hyperbolique inverse d’un nombre. +ATAN = ATAN ## Renvoie l’arctangente d’un nombre. +ATAN2 = ATAN2 ## Renvoie l’arctangente des coordonnées x et y. +ATANH = ATANH ## Renvoie la tangente hyperbolique inverse d’un nombre. +CEILING = PLAFOND ## Arrondit un nombre au nombre entier le plus proche ou au multiple le plus proche de l’argument précision en s’éloignant de zéro. +COMBIN = COMBIN ## Renvoie le nombre de combinaisons que l’on peut former avec un nombre donné d’objets. +COS = COS ## Renvoie le cosinus d’un nombre. +COSH = COSH ## Renvoie le cosinus hyperbolique d’un nombre. +DEGREES = DEGRES ## Convertit des radians en degrés. +EVEN = PAIR ## Arrondit un nombre au nombre entier pair le plus proche en s’éloignant de zéro. +EXP = EXP ## Renvoie e élevé à la puissance d’un nombre donné. +FACT = FACT ## Renvoie la factorielle d’un nombre. +FACTDOUBLE = FACTDOUBLE ## Renvoie la factorielle double d’un nombre. +FLOOR = PLANCHER ## Arrondit un nombre en tendant vers 0 (zéro). +GCD = PGCD ## Renvoie le plus grand commun diviseur. +INT = ENT ## Arrondit un nombre à l’entier immédiatement inférieur. +LCM = PPCM ## Renvoie le plus petit commun multiple. +LN = LN ## Renvoie le logarithme népérien d’un nombre. +LOG = LOG ## Renvoie le logarithme d’un nombre dans la base spécifiée. +LOG10 = LOG10 ## Calcule le logarithme en base 10 d’un nombre. +MDETERM = DETERMAT ## Renvoie le déterminant d’une matrice. +MINVERSE = INVERSEMAT ## Renvoie la matrice inverse d’une matrice. +MMULT = PRODUITMAT ## Renvoie le produit de deux matrices. +MOD = MOD ## Renvoie le reste d’une division. +MROUND = ARRONDI.AU.MULTIPLE ## Donne l’arrondi d’un nombre au multiple spécifié. +MULTINOMIAL = MULTINOMIALE ## Calcule la multinomiale d’un ensemble de nombres. +ODD = IMPAIR ## Renvoie le nombre, arrondi à la valeur du nombre entier impair le plus proche en s’éloignant de zéro. +PI = PI ## Renvoie la valeur de pi. +POWER = PUISSANCE ## Renvoie la valeur du nombre élevé à une puissance. +PRODUCT = PRODUIT ## Multiplie ses arguments. +QUOTIENT = QUOTIENT ## Renvoie la partie entière du résultat d’une division. +RADIANS = RADIANS ## Convertit des degrés en radians. +RAND = ALEA ## Renvoie un nombre aléatoire compris entre 0 et 1. +RANDBETWEEN = ALEA.ENTRE.BORNES ## Renvoie un nombre aléatoire entre les nombres que vous spécifiez. +ROMAN = ROMAIN ## Convertit des chiffres arabes en chiffres romains, sous forme de texte. +ROUND = ARRONDI ## Arrondit un nombre au nombre de chiffres indiqué. +ROUNDDOWN = ARRONDI.INF ## Arrondit un nombre en tendant vers 0 (zéro). +ROUNDUP = ARRONDI.SUP ## Arrondit un nombre à l’entier supérieur, en s’éloignant de zéro. +SERIESSUM = SOMME.SERIES ## Renvoie la somme d’une série géométrique en s’appuyant sur la formule suivante : +SIGN = SIGNE ## Renvoie le signe d’un nombre. +SIN = SIN ## Renvoie le sinus d’un angle donné. +SINH = SINH ## Renvoie le sinus hyperbolique d’un nombre. +SQRT = RACINE ## Renvoie la racine carrée d’un nombre. +SQRTPI = RACINE.PI ## Renvoie la racine carrée de (nombre * pi). +SUBTOTAL = SOUS.TOTAL ## Renvoie un sous-total dans une liste ou une base de données. +SUM = SOMME ## Calcule la somme de ses arguments. +SUMIF = SOMME.SI ## Additionne les cellules spécifiées si elles répondent à un critère donné. +SUMIFS = SOMME.SI.ENS ## Ajoute les cellules d’une plage qui répondent à plusieurs critères. +SUMPRODUCT = SOMMEPROD ## Multiplie les valeurs correspondantes des matrices spécifiées et calcule la somme de ces produits. +SUMSQ = SOMME.CARRES ## Renvoie la somme des carrés des arguments. +SUMX2MY2 = SOMME.X2MY2 ## Renvoie la somme de la différence des carrés des valeurs correspondantes de deux matrices. +SUMX2PY2 = SOMME.X2PY2 ## Renvoie la somme de la somme des carrés des valeurs correspondantes de deux matrices. +SUMXMY2 = SOMME.XMY2 ## Renvoie la somme des carrés des différences entre les valeurs correspondantes de deux matrices. +TAN = TAN ## Renvoie la tangente d’un nombre. +TANH = TANH ## Renvoie la tangente hyperbolique d’un nombre. +TRUNC = TRONQUE ## Renvoie la partie entière d’un nombre. + + +## +## Statistical functions Fonctions statistiques +## +AVEDEV = ECART.MOYEN ## Renvoie la moyenne des écarts absolus observés dans la moyenne des points de données. +AVERAGE = MOYENNE ## Renvoie la moyenne de ses arguments. +AVERAGEA = AVERAGEA ## Renvoie la moyenne de ses arguments, nombres, texte et valeurs logiques inclus. +AVERAGEIF = MOYENNE.SI ## Renvoie la moyenne (arithmétique) de toutes les cellules d’une plage qui répondent à des critères donnés. +AVERAGEIFS = MOYENNE.SI.ENS ## Renvoie la moyenne (arithmétique) de toutes les cellules qui répondent à plusieurs critères. +BETADIST = LOI.BETA ## Renvoie la fonction de distribution cumulée. +BETAINV = BETA.INVERSE ## Renvoie l’inverse de la fonction de distribution cumulée pour une distribution bêta spécifiée. +BINOMDIST = LOI.BINOMIALE ## Renvoie la probabilité d’une variable aléatoire discrète suivant la loi binomiale. +CHIDIST = LOI.KHIDEUX ## Renvoie la probabilité unilatérale de la distribution khi-deux. +CHIINV = KHIDEUX.INVERSE ## Renvoie l’inverse de la probabilité unilatérale de la distribution khi-deux. +CHITEST = TEST.KHIDEUX ## Renvoie le test d’indépendance. +CONFIDENCE = INTERVALLE.CONFIANCE ## Renvoie l’intervalle de confiance pour une moyenne de population. +CORREL = COEFFICIENT.CORRELATION ## Renvoie le coefficient de corrélation entre deux séries de données. +COUNT = NB ## Détermine les nombres compris dans la liste des arguments. +COUNTA = NBVAL ## Détermine le nombre de valeurs comprises dans la liste des arguments. +COUNTBLANK = NB.VIDE ## Compte le nombre de cellules vides dans une plage. +COUNTIF = NB.SI ## Compte le nombre de cellules qui répondent à un critère donné dans une plage. +COUNTIFS = NB.SI.ENS ## Compte le nombre de cellules à l’intérieur d’une plage qui répondent à plusieurs critères. +COVAR = COVARIANCE ## Renvoie la covariance, moyenne des produits des écarts pour chaque série d’observations. +CRITBINOM = CRITERE.LOI.BINOMIALE ## Renvoie la plus petite valeur pour laquelle la distribution binomiale cumulée est inférieure ou égale à une valeur de critère. +DEVSQ = SOMME.CARRES.ECARTS ## Renvoie la somme des carrés des écarts. +EXPONDIST = LOI.EXPONENTIELLE ## Renvoie la distribution exponentielle. +FDIST = LOI.F ## Renvoie la distribution de probabilité F. +FINV = INVERSE.LOI.F ## Renvoie l’inverse de la distribution de probabilité F. +FISHER = FISHER ## Renvoie la transformation de Fisher. +FISHERINV = FISHER.INVERSE ## Renvoie l’inverse de la transformation de Fisher. +FORECAST = PREVISION ## Calcule une valeur par rapport à une tendance linéaire. +FREQUENCY = FREQUENCE ## Calcule la fréquence d’apparition des valeurs dans une plage de valeurs, puis renvoie des nombres sous forme de matrice verticale. +FTEST = TEST.F ## Renvoie le résultat d’un test F. +GAMMADIST = LOI.GAMMA ## Renvoie la probabilité d’une variable aléatoire suivant une loi Gamma. +GAMMAINV = LOI.GAMMA.INVERSE ## Renvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi Gamma. +GAMMALN = LNGAMMA ## Renvoie le logarithme népérien de la fonction Gamma, G(x) +GEOMEAN = MOYENNE.GEOMETRIQUE ## Renvoie la moyenne géométrique. +GROWTH = CROISSANCE ## Calcule des valeurs par rapport à une tendance exponentielle. +HARMEAN = MOYENNE.HARMONIQUE ## Renvoie la moyenne harmonique. +HYPGEOMDIST = LOI.HYPERGEOMETRIQUE ## Renvoie la probabilité d’une variable aléatoire discrète suivant une loi hypergéométrique. +INTERCEPT = ORDONNEE.ORIGINE ## Renvoie l’ordonnée à l’origine d’une droite de régression linéaire. +KURT = KURTOSIS ## Renvoie le kurtosis d’une série de données. +LARGE = GRANDE.VALEUR ## Renvoie la k-ième plus grande valeur d’une série de données. +LINEST = DROITEREG ## Renvoie les paramètres d’une tendance linéaire. +LOGEST = LOGREG ## Renvoie les paramètres d’une tendance exponentielle. +LOGINV = LOI.LOGNORMALE.INVERSE ## Renvoie l’inverse de la probabilité pour une variable aléatoire suivant la loi lognormale. +LOGNORMDIST = LOI.LOGNORMALE ## Renvoie la probabilité d’une variable aléatoire continue suivant une loi lognormale. +MAX = MAX ## Renvoie la valeur maximale contenue dans une liste d’arguments. +MAXA = MAXA ## Renvoie la valeur maximale d’une liste d’arguments, nombres, texte et valeurs logiques inclus. +MEDIAN = MEDIANE ## Renvoie la valeur médiane des nombres donnés. +MIN = MIN ## Renvoie la valeur minimale contenue dans une liste d’arguments. +MINA = MINA ## Renvoie la plus petite valeur d’une liste d’arguments, nombres, texte et valeurs logiques inclus. +MODE = MODE ## Renvoie la valeur la plus courante d’une série de données. +NEGBINOMDIST = LOI.BINOMIALE.NEG ## Renvoie la probabilité d’une variable aléatoire discrète suivant une loi binomiale négative. +NORMDIST = LOI.NORMALE ## Renvoie la probabilité d’une variable aléatoire continue suivant une loi normale. +NORMINV = LOI.NORMALE.INVERSE ## Renvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi normale standard. +NORMSDIST = LOI.NORMALE.STANDARD ## Renvoie la probabilité d’une variable aléatoire continue suivant une loi normale standard. +NORMSINV = LOI.NORMALE.STANDARD.INVERSE ## Renvoie l’inverse de la distribution cumulée normale standard. +PEARSON = PEARSON ## Renvoie le coefficient de corrélation d’échantillonnage de Pearson. +PERCENTILE = CENTILE ## Renvoie le k-ième centile des valeurs d’une plage. +PERCENTRANK = RANG.POURCENTAGE ## Renvoie le rang en pourcentage d’une valeur d’une série de données. +PERMUT = PERMUTATION ## Renvoie le nombre de permutations pour un nombre donné d’objets. +POISSON = LOI.POISSON ## Renvoie la probabilité d’une variable aléatoire suivant une loi de Poisson. +PROB = PROBABILITE ## Renvoie la probabilité que des valeurs d’une plage soient comprises entre deux limites. +QUARTILE = QUARTILE ## Renvoie le quartile d’une série de données. +RANK = RANG ## Renvoie le rang d’un nombre contenu dans une liste. +RSQ = COEFFICIENT.DETERMINATION ## Renvoie la valeur du coefficient de détermination R^2 d’une régression linéaire. +SKEW = COEFFICIENT.ASYMETRIE ## Renvoie l’asymétrie d’une distribution. +SLOPE = PENTE ## Renvoie la pente d’une droite de régression linéaire. +SMALL = PETITE.VALEUR ## Renvoie la k-ième plus petite valeur d’une série de données. +STANDARDIZE = CENTREE.REDUITE ## Renvoie une valeur centrée réduite. +STDEV = ECARTYPE ## Évalue l’écart type d’une population en se basant sur un échantillon de cette population. +STDEVA = STDEVA ## Évalue l’écart type d’une population en se basant sur un échantillon de cette population, nombres, texte et valeurs logiques inclus. +STDEVP = ECARTYPEP ## Calcule l’écart type d’une population à partir de la population entière. +STDEVPA = STDEVPA ## Calcule l’écart type d’une population à partir de l’ensemble de la population, nombres, texte et valeurs logiques inclus. +STEYX = ERREUR.TYPE.XY ## Renvoie l’erreur type de la valeur y prévue pour chaque x de la régression. +TDIST = LOI.STUDENT ## Renvoie la probabilité d’une variable aléatoire suivant une loi T de Student. +TINV = LOI.STUDENT.INVERSE ## Renvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi T de Student. +TREND = TENDANCE ## Renvoie des valeurs par rapport à une tendance linéaire. +TRIMMEAN = MOYENNE.REDUITE ## Renvoie la moyenne de l’intérieur d’une série de données. +TTEST = TEST.STUDENT ## Renvoie la probabilité associée à un test T de Student. +VAR = VAR ## Calcule la variance sur la base d’un échantillon. +VARA = VARA ## Estime la variance d’une population en se basant sur un échantillon de cette population, nombres, texte et valeurs logiques incluses. +VARP = VAR.P ## Calcule la variance sur la base de l’ensemble de la population. +VARPA = VARPA ## Calcule la variance d’une population en se basant sur la population entière, nombres, texte et valeurs logiques inclus. +WEIBULL = LOI.WEIBULL ## Renvoie la probabilité d’une variable aléatoire suivant une loi de Weibull. +ZTEST = TEST.Z ## Renvoie la valeur de probabilité unilatérale d’un test z. + + +## +## Text functions Fonctions de texte +## +ASC = ASC ## Change les caractères anglais ou katakana à pleine chasse (codés sur deux octets) à l’intérieur d’une chaîne de caractères en caractères à demi-chasse (codés sur un octet). +BAHTTEXT = BAHTTEXT ## Convertit un nombre en texte en utilisant le format monétaire ß (baht). +CHAR = CAR ## Renvoie le caractère spécifié par le code numérique. +CLEAN = EPURAGE ## Supprime tous les caractères de contrôle du texte. +CODE = CODE ## Renvoie le numéro de code du premier caractère du texte. +CONCATENATE = CONCATENER ## Assemble plusieurs éléments textuels de façon à n’en former qu’un seul. +DOLLAR = EURO ## Convertit un nombre en texte en utilisant le format monétaire € (euro). +EXACT = EXACT ## Vérifie si deux valeurs de texte sont identiques. +FIND = TROUVE ## Trouve un valeur textuelle dans une autre, en respectant la casse. +FINDB = TROUVERB ## Trouve un valeur textuelle dans une autre, en respectant la casse. +FIXED = CTXT ## Convertit un nombre au format texte avec un nombre de décimales spécifié. +JIS = JIS ## Change les caractères anglais ou katakana à demi-chasse (codés sur un octet) à l’intérieur d’une chaîne de caractères en caractères à à pleine chasse (codés sur deux octets). +LEFT = GAUCHE ## Renvoie des caractères situés à l’extrême gauche d’une chaîne de caractères. +LEFTB = GAUCHEB ## Renvoie des caractères situés à l’extrême gauche d’une chaîne de caractères. +LEN = NBCAR ## Renvoie le nombre de caractères contenus dans une chaîne de texte. +LENB = LENB ## Renvoie le nombre de caractères contenus dans une chaîne de texte. +LOWER = MINUSCULE ## Convertit le texte en minuscules. +MID = STXT ## Renvoie un nombre déterminé de caractères d’une chaîne de texte à partir de la position que vous indiquez. +MIDB = STXTB ## Renvoie un nombre déterminé de caractères d’une chaîne de texte à partir de la position que vous indiquez. +PHONETIC = PHONETIQUE ## Extrait les caractères phonétiques (furigana) d’une chaîne de texte. +PROPER = NOMPROPRE ## Met en majuscules la première lettre de chaque mot dans une chaîne textuelle. +REPLACE = REMPLACER ## Remplace des caractères dans un texte. +REPLACEB = REMPLACERB ## Remplace des caractères dans un texte. +REPT = REPT ## Répète un texte un certain nombre de fois. +RIGHT = DROITE ## Renvoie des caractères situés à l’extrême droite d’une chaîne de caractères. +RIGHTB = DROITEB ## Renvoie des caractères situés à l’extrême droite d’une chaîne de caractères. +SEARCH = CHERCHE ## Trouve un texte dans un autre texte (sans respecter la casse). +SEARCHB = CHERCHERB ## Trouve un texte dans un autre texte (sans respecter la casse). +SUBSTITUTE = SUBSTITUE ## Remplace l’ancien texte d’une chaîne de caractères par un nouveau. +T = T ## Convertit ses arguments en texte. +TEXT = TEXTE ## Convertit un nombre au format texte. +TRIM = SUPPRESPACE ## Supprime les espaces du texte. +UPPER = MAJUSCULE ## Convertit le texte en majuscules. +VALUE = CNUM ## Convertit un argument textuel en nombre diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/hu/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/hu/config new file mode 100644 index 000000000..725b5698f --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/hu/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = Ft + + +## +## Excel Error Codes (For future use) +## +NULL = #NULLA! +DIV0 = #ZÉRÓOSZTÓ! +VALUE = #ÉRTÉK! +REF = #HIV! +NAME = #NÉV? +NUM = #SZÃM! +NA = #HIÃNYZIK diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/hu/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/hu/functions new file mode 100644 index 000000000..a3855c066 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/hu/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions BÅ‘vítmények és automatizálási függvények +## +GETPIVOTDATA = KIMUTATÃSADATOT.VESZ ## A kimutatásokban tárolt adatok visszaadására használható. + + +## +## Cube functions Kockafüggvények +## +CUBEKPIMEMBER = KOCKA.FÅTELJMUT ## Egy fÅ‘ teljesítménymutató (KPI) nevét, tulajdonságát és mértékegységét adja eredményül, a nevet és a tulajdonságot megjeleníti a cellában. A KPI-k számszerűsíthetÅ‘ mérési lehetÅ‘séget jelentenek – ilyen mutató például a havi bruttó nyereség vagy az egy alkalmazottra jutó negyedéves forgalom –, egy szervezet teljesítményének nyomonkövetésére használhatók. +CUBEMEMBER = KOCKA.TAG ## Kockahierachia tagját vagy rekordját adja eredményül. EllenÅ‘rizhetÅ‘ vele, hogy szerepel-e a kockában az adott tag vagy rekord. +CUBEMEMBERPROPERTY = KOCKA.TAG.TUL ## A kocka egyik tagtulajdonságának értékét adja eredményül. Használatával ellenÅ‘rizhetÅ‘, hogy szerepel-e egy tagnév a kockában, eredménye pedig az erre a tagra vonatkozó, megadott tulajdonság. +CUBERANKEDMEMBER = KOCKA.HALM.ELEM ## Egy halmaz rangsor szerinti n-edik tagját adja eredményül. Használatával egy halmaz egy vagy több elemét kaphatja meg, például a legnagyobb teljesítményű üzletkötÅ‘t vagy a 10 legjobb tanulót. +CUBESET = KOCKA.HALM ## Számított tagok vagy rekordok halmazát adja eredményül, ehhez egy beállított kifejezést elküld a kiszolgálón található kockának, majd ezt a halmazt adja vissza a Microsoft Office Excel alkalmazásnak. +CUBESETCOUNT = KOCKA.HALM.DB ## Egy halmaz elemszámát adja eredményül. +CUBEVALUE = KOCKA.ÉRTÉK ## Kockából összesített értéket ad eredményül. + + +## +## Database functions Adatbázis-kezelÅ‘ függvények +## +DAVERAGE = AB.ÃTLAG ## A kijelölt adatbáziselemek átlagát számítja ki. +DCOUNT = AB.DARAB ## Megszámolja, hogy az adatbázisban hány cella tartalmaz számokat. +DCOUNTA = AB.DARAB2 ## Megszámolja az adatbázisban lévÅ‘ nem üres cellákat. +DGET = AB.MEZÅ ## Egy adatbázisból egyetlen olyan rekordot ad vissza, amely megfelel a megadott feltételeknek. +DMAX = AB.MAX ## A kiválasztott adatbáziselemek közül a legnagyobb értéket adja eredményül. +DMIN = AB.MIN ## A kijelölt adatbáziselemek közül a legkisebb értéket adja eredményül. +DPRODUCT = AB.SZORZAT ## Az adatbázis megadott feltételeknek eleget tevÅ‘ rekordjaira összeszorozza a megadott mezÅ‘ben található számértékeket, és eredményül ezt a szorzatot adja. +DSTDEV = AB.SZÓRÃS ## A kijelölt adatbáziselemek egy mintája alapján megbecsüli a szórást. +DSTDEVP = AB.SZÓRÃS2 ## A kijelölt adatbáziselemek teljes sokasága alapján kiszámítja a szórást. +DSUM = AB.SZUM ## Összeadja a feltételnek megfelelÅ‘ adatbázisrekordok mezÅ‘oszlopában a számokat. +DVAR = AB.VAR ## A kijelölt adatbáziselemek mintája alapján becslést ad a szórásnégyzetre. +DVARP = AB.VAR2 ## A kijelölt adatbáziselemek teljes sokasága alapján kiszámítja a szórásnégyzetet. + + +## +## Date and time functions Dátumfüggvények +## +DATE = DÃTUM ## Adott dátum dátumértékét adja eredményül. +DATEVALUE = DÃTUMÉRTÉK ## Szövegként megadott dátumot dátumértékké alakít át. +DAY = NAP ## Dátumértéket a hónap egy napjává (0-31) alakít. +DAYS360 = NAP360 ## Két dátum közé esÅ‘ napok számát számítja ki a 360 napos év alapján. +EDATE = EDATE ## Adott dátumnál adott számú hónappal korábbi vagy késÅ‘bbi dátum dátumértékét adja eredményül. +EOMONTH = EOMONTH ## Adott dátumnál adott számú hónappal korábbi vagy késÅ‘bbi hónap utolsó napjának dátumértékét adja eredményül. +HOUR = ÓRA ## Időértéket órákká alakít. +MINUTE = PERC ## Időértéket percekké alakít. +MONTH = HÓNAP ## Időértéket hónapokká alakít. +NETWORKDAYS = NETWORKDAYS ## Két dátum között a teljes munkanapok számát adja meg. +NOW = MOST ## A napi dátum dátumértékét és a pontos idÅ‘ időértékét adja eredményül. +SECOND = MPERC ## Időértéket másodpercekké alakít át. +TIME = IDÅ ## Adott idÅ‘pont időértékét adja meg. +TIMEVALUE = IDÅÉRTÉK ## Szövegként megadott idÅ‘pontot időértékké alakít át. +TODAY = MA ## A napi dátum dátumértékét adja eredményül. +WEEKDAY = HÉT.NAPJA ## Dátumértéket a hét napjává alakítja át. +WEEKNUM = WEEKNUM ## Visszatérési értéke egy szám, amely azt mutatja meg, hogy a megadott dátum az év hányadik hetére esik. +WORKDAY = WORKDAY ## Adott dátumnál adott munkanappal korábbi vagy késÅ‘bbi dátum dátumértékét adja eredményül. +YEAR = ÉV ## Sorszámot évvé alakít át. +YEARFRAC = YEARFRAC ## Az adott dátumok közötti teljes napok számát törtévként adja meg. + + +## +## Engineering functions Mérnöki függvények +## +BESSELI = BESSELI ## Az In(x) módosított Bessel-függvény értékét adja eredményül. +BESSELJ = BESSELJ ## A Jn(x) Bessel-függvény értékét adja eredményül. +BESSELK = BESSELK ## A Kn(x) módosított Bessel-függvény értékét adja eredményül. +BESSELY = BESSELY ## Az Yn(x) módosított Bessel-függvény értékét adja eredményül. +BIN2DEC = BIN2DEC ## Bináris számot decimálissá alakít át. +BIN2HEX = BIN2HEX ## Bináris számot hexadecimálissá alakít át. +BIN2OCT = BIN2OCT ## Bináris számot oktálissá alakít át. +COMPLEX = COMPLEX ## Valós és képzetes részbÅ‘l komplex számot képez. +CONVERT = CONVERT ## Mértékegységeket vált át. +DEC2BIN = DEC2BIN ## Decimális számot binárissá alakít át. +DEC2HEX = DEC2HEX ## Decimális számot hexadecimálissá alakít át. +DEC2OCT = DEC2OCT ## Decimális számot oktálissá alakít át. +DELTA = DELTA ## Azt vizsgálja, hogy két érték egyenlÅ‘-e. +ERF = ERF ## A hibafüggvény értékét adja eredményül. +ERFC = ERFC ## A kiegészített hibafüggvény értékét adja eredményül. +GESTEP = GESTEP ## Azt vizsgálja, hogy egy szám nagyobb-e adott küszöbértéknél. +HEX2BIN = HEX2BIN ## Hexadecimális számot binárissá alakít át. +HEX2DEC = HEX2DEC ## Hexadecimális számot decimálissá alakít át. +HEX2OCT = HEX2OCT ## Hexadecimális számot oktálissá alakít át. +IMABS = IMABS ## Komplex szám abszolút értékét (modulusát) adja eredményül. +IMAGINARY = IMAGINARY ## Komplex szám képzetes részét adja eredményül. +IMARGUMENT = IMARGUMENT ## A komplex szám radiánban kifejezett théta argumentumát adja eredményül. +IMCONJUGATE = IMCONJUGATE ## Komplex szám komplex konjugáltját adja eredményül. +IMCOS = IMCOS ## Komplex szám koszinuszát adja eredményül. +IMDIV = IMDIV ## Két komplex szám hányadosát adja eredményül. +IMEXP = IMEXP ## Az e szám komplex kitevÅ‘jű hatványát adja eredményül. +IMLN = IMLN ## Komplex szám természetes logaritmusát adja eredményül. +IMLOG10 = IMLOG10 ## Komplex szám tízes alapú logaritmusát adja eredményül. +IMLOG2 = IMLOG2 ## Komplex szám kettes alapú logaritmusát adja eredményül. +IMPOWER = IMPOWER ## Komplex szám hatványát adja eredményül. +IMPRODUCT = IMPRODUCT ## Komplex számok szorzatát adja eredményül. +IMREAL = IMREAL ## Komplex szám valós részét adja eredményül. +IMSIN = IMSIN ## Komplex szám szinuszát adja eredményül. +IMSQRT = IMSQRT ## Komplex szám négyzetgyökét adja eredményül. +IMSUB = IMSUB ## Két komplex szám különbségét adja eredményül. +IMSUM = IMSUM ## Komplex számok összegét adja eredményül. +OCT2BIN = OCT2BIN ## Oktális számot binárissá alakít át. +OCT2DEC = OCT2DEC ## Oktális számot decimálissá alakít át. +OCT2HEX = OCT2HEX ## Oktális számot hexadecimálissá alakít át. + + +## +## Financial functions Pénzügyi függvények +## +ACCRINT = ACCRINT ## Periodikusan kamatozó értékpapír felszaporodott kamatát adja eredményül. +ACCRINTM = ACCRINTM ## Lejáratkor kamatozó értékpapír felszaporodott kamatát adja eredményül. +AMORDEGRC = AMORDEGRC ## Ãllóeszköz lineáris értékcsökkenését adja meg az egyes könyvelési idÅ‘szakokra vonatkozóan. +AMORLINC = AMORLINC ## Az egyes könyvelési idÅ‘szakokban az értékcsökkenést adja meg. +COUPDAYBS = COUPDAYBS ## A szelvényidÅ‘szak kezdetétÅ‘l a kifizetés idÅ‘pontjáig eltelt napokat adja vissza. +COUPDAYS = COUPDAYS ## A kifizetés idÅ‘pontját magában foglaló szelvényperiódus hosszát adja meg napokban. +COUPDAYSNC = COUPDAYSNC ## A kifizetés idÅ‘pontja és a legközelebbi szelvénydátum közötti napok számát adja meg. +COUPNCD = COUPNCD ## A kifizetést követÅ‘ legelsÅ‘ szelvénydátumot adja eredményül. +COUPNUM = COUPNUM ## A kifizetés és a lejárat idÅ‘pontja között kifizetendÅ‘ szelvények számát adja eredményül. +COUPPCD = COUPPCD ## A kifizetés elÅ‘tti utolsó szelvénydátumot adja eredményül. +CUMIPMT = CUMIPMT ## Két fizetési idÅ‘szak között kifizetett kamat halmozott értékét adja eredményül. +CUMPRINC = CUMPRINC ## Két fizetési idÅ‘szak között kifizetett részletek halmozott (kamatot nem tartalmazó) értékét adja eredményül. +DB = KCS2 ## Eszköz adott idÅ‘szak alatti értékcsökkenését számítja ki a lineáris leírási modell alkalmazásával. +DDB = KCSA ## Eszköz értékcsökkenését számítja ki adott idÅ‘szakra vonatkozóan a progresszív vagy egyéb megadott leírási modell alkalmazásával. +DISC = DISC ## Értékpapír leszámítolási kamatlábát adja eredményül. +DOLLARDE = DOLLARDE ## Egy közönséges törtként megadott számot tizedes törtté alakít át. +DOLLARFR = DOLLARFR ## Tizedes törtként megadott számot közönséges törtté alakít át. +DURATION = DURATION ## Periodikus kamatfizetésű értékpapír éves kamatérzékenységét adja eredményül. +EFFECT = EFFECT ## Az éves tényleges kamatláb értékét adja eredményül. +FV = JBÉ ## Befektetés jövÅ‘beli értékét számítja ki. +FVSCHEDULE = FVSCHEDULE ## A kezdÅ‘tÅ‘ke adott kamatlábak szerint megnövelt jövÅ‘beli értékét adja eredményül. +INTRATE = INTRATE ## A lejáratig teljesen lekötött értékpapír kamatrátáját adja eredményül. +IPMT = RRÉSZLET ## Hiteltörlesztésen belül a tÅ‘ketörlesztés nagyságát számítja ki adott idÅ‘szakra. +IRR = BMR ## A befektetés belsÅ‘ megtérülési rátáját számítja ki pénzáramláshoz. +ISPMT = LRÉSZLETKAMAT ## A befektetés adott idÅ‘szakára fizetett kamatot számítja ki. +MDURATION = MDURATION ## Egy 100 Ft névértékű értékpapír Macauley-féle módosított kamatérzékenységét adja eredményül. +MIRR = MEGTÉRÜLÉS ## A befektetés belsÅ‘ megtérülési rátáját számítja ki a költségek és a bevételek különbözÅ‘ kamatlába mellett. +NOMINAL = NOMINAL ## Az éves névleges kamatláb értékét adja eredményül. +NPER = PER.SZÃM ## A törlesztési idÅ‘szakok számát adja meg. +NPV = NMÉ ## Befektetéshez kapcsolódó pénzáramlás nettó jelenértékét számítja ki ismert pénzáramlás és kamatláb mellett. +ODDFPRICE = ODDFPRICE ## Egy 100 Ft névértékű, a futamidÅ‘ elején töredék-idÅ‘szakos értékpapír árát adja eredményül. +ODDFYIELD = ODDFYIELD ## A futamidÅ‘ elején töredék-idÅ‘szakos értékpapír hozamát adja eredményül. +ODDLPRICE = ODDLPRICE ## Egy 100 Ft névértékű, a futamidÅ‘ végén töredék-idÅ‘szakos értékpapír árát adja eredményül. +ODDLYIELD = ODDLYIELD ## A futamidÅ‘ végén töredék-idÅ‘szakos értékpapír hozamát adja eredményül. +PMT = RÉSZLET ## A törlesztési idÅ‘szakra vonatkozó törlesztési összeget számítja ki. +PPMT = PRÉSZLET ## Hiteltörlesztésen belül a tÅ‘ketörlesztés nagyságát számítja ki adott idÅ‘szakra. +PRICE = PRICE ## Egy 100 Ft névértékű, periodikusan kamatozó értékpapír árát adja eredményül. +PRICEDISC = PRICEDISC ## Egy 100 Ft névértékű leszámítolt értékpapír árát adja eredményül. +PRICEMAT = PRICEMAT ## Egy 100 Ft névértékű, a lejáratkor kamatozó értékpapír árát adja eredményül. +PV = MÉ ## Befektetés jelenlegi értékét számítja ki. +RATE = RÃTA ## Egy törlesztési idÅ‘szakban az egy idÅ‘szakra esÅ‘ kamatláb nagyságát számítja ki. +RECEIVED = RECEIVED ## A lejáratig teljesen lekötött értékpapír lejáratakor kapott összegét adja eredményül. +SLN = LCSA ## Tárgyi eszköz egy idÅ‘szakra esÅ‘ amortizációját adja meg bruttó érték szerinti lineáris leírási kulcsot alkalmazva. +SYD = SYD ## Tárgyi eszköz értékcsökkenését számítja ki adott idÅ‘szakra az évek számjegyösszegével dolgozó módszer alapján. +TBILLEQ = TBILLEQ ## Kincstárjegy kötvény-egyenértékű hozamát adja eredményül. +TBILLPRICE = TBILLPRICE ## Egy 100 Ft névértékű kincstárjegy árát adja eredményül. +TBILLYIELD = TBILLYIELD ## Kincstárjegy hozamát adja eredményül. +VDB = ÉCSRI ## Tárgyi eszköz amortizációját számítja ki megadott vagy részidÅ‘szakra a csökkenÅ‘ egyenleg módszerének alkalmazásával. +XIRR = XIRR ## Ütemezett készpénzforgalom (cash flow) belsÅ‘ megtérülési kamatrátáját adja eredményül. +XNPV = XNPV ## Ütemezett készpénzforgalom (cash flow) nettó jelenlegi értékét adja eredményül. +YIELD = YIELD ## Periodikusan kamatozó értékpapír hozamát adja eredményül. +YIELDDISC = YIELDDISC ## Leszámítolt értékpapír (például kincstárjegy) éves hozamát adja eredményül. +YIELDMAT = YIELDMAT ## Lejáratkor kamatozó értékpapír éves hozamát adja eredményül. + + +## +## Information functions Információs függvények +## +CELL = CELLA ## Egy cella formátumára, elhelyezkedésére vagy tartalmára vonatkozó adatokat ad eredményül. +ERROR.TYPE = HIBA.TÃPUS ## Egy hibatípushoz tartozó számot ad eredményül. +INFO = INFÓ ## A rendszer- és munkakörnyezet pillanatnyi állapotáról ad felvilágosítást. +ISBLANK = ÜRES ## Eredménye IGAZ, ha az érték üres. +ISERR = HIBA ## Eredménye IGAZ, ha az érték valamelyik hibaérték a #HIÃNYZIK kivételével. +ISERROR = HIBÃS ## Eredménye IGAZ, ha az érték valamelyik hibaérték. +ISEVEN = ISEVEN ## Eredménye IGAZ, ha argumentuma páros szám. +ISLOGICAL = LOGIKAI ## Eredménye IGAZ, ha az érték logikai érték. +ISNA = NINCS ## Eredménye IGAZ, ha az érték a #HIÃNYZIK hibaérték. +ISNONTEXT = NEM.SZÖVEG ## Eredménye IGAZ, ha az érték nem szöveg. +ISNUMBER = SZÃM ## Eredménye IGAZ, ha az érték szám. +ISODD = ISODD ## Eredménye IGAZ, ha argumentuma páratlan szám. +ISREF = HIVATKOZÃS ## Eredménye IGAZ, ha az érték hivatkozás. +ISTEXT = SZÖVEG.E ## Eredménye IGAZ, ha az érték szöveg. +N = N ## Argumentumának értékét számmá alakítja. +NA = HIÃNYZIK ## Eredménye a #HIÃNYZIK hibaérték. +TYPE = TÃPUS ## Érték adattípusának azonosítószámát adja eredményül. + + +## +## Logical functions Logikai függvények +## +AND = ÉS ## Eredménye IGAZ, ha minden argumentuma IGAZ. +FALSE = HAMIS ## A HAMIS logikai értéket adja eredményül. +IF = HA ## Logikai vizsgálatot hajt végre. +IFERROR = HAHIBA ## A megadott értéket adja vissza, ha egy képlet hibához vezet; más esetben a képlet értékét adja eredményül. +NOT = NEM ## Argumentuma értékének ellentettjét adja eredményül. +OR = VAGY ## Eredménye IGAZ, ha bármely argumentuma IGAZ. +TRUE = IGAZ ## Az IGAZ logikai értéket adja eredményül. + + +## +## Lookup and reference functions Keresési és hivatkozási függvények +## +ADDRESS = CÃM ## A munkalap egy cellájára való hivatkozást adja szövegként eredményül. +AREAS = TERÜLET ## Hivatkozásban a területek számát adja eredményül. +CHOOSE = VÃLASZT ## Értékek listájából választ ki egy elemet. +COLUMN = OSZLOP ## Egy hivatkozás oszlopszámát adja eredményül. +COLUMNS = OSZLOPOK ## A hivatkozásban található oszlopok számát adja eredményül. +HLOOKUP = VKERES ## A megadott tömb felsÅ‘ sorában adott értékű elemet keres, és a megtalált elem oszlopából adott sorban elhelyezkedÅ‘ értékkel tér vissza. +HYPERLINK = HIPERHIVATKOZÃS ## Hálózati kiszolgálón, intraneten vagy az interneten tárolt dokumentumot megnyitó parancsikont vagy hivatkozást hoz létre. +INDEX = INDEX ## Tömb- vagy hivatkozás indexszel megadott értékét adja vissza. +INDIRECT = INDIREKT ## Szöveg megadott hivatkozást ad eredményül. +LOOKUP = KERES ## Vektorban vagy tömbben keres meg értékeket. +MATCH = HOL.VAN ## Hivatkozásban vagy tömbben értékeket keres. +OFFSET = OFSZET ## Hivatkozás egy másik hivatkozástól számított távolságát adja meg. +ROW = SOR ## Egy hivatkozás sorának számát adja meg. +ROWS = SOROK ## Egy hivatkozás sorainak számát adja meg. +RTD = RTD ## Valós idejű adatokat keres vissza a COM automatizmust (automatizálás: Egy alkalmazás objektumaival való munka másik alkalmazásból vagy fejlesztÅ‘eszközbÅ‘l. A korábban OLE automatizmusnak nevezett automatizálás iparági szabvány, a Component Object Model (COM) szolgáltatása.) támogató programból. +TRANSPOSE = TRANSZPONÃLÃS ## Egy tömb transzponáltját adja eredményül. +VLOOKUP = FKERES ## A megadott tömb bal szélsÅ‘ oszlopában megkeres egy értéket, majd annak sora és a megadott oszlop metszéspontjában levÅ‘ értéked adja eredményül. + + +## +## Math and trigonometry functions Matematikai és trigonometrikus függvények +## +ABS = ABS ## Egy szám abszolút értékét adja eredményül. +ACOS = ARCCOS ## Egy szám arkusz koszinuszát számítja ki. +ACOSH = ACOSH ## Egy szám inverz koszinusz hiperbolikuszát számítja ki. +ASIN = ARCSIN ## Egy szám arkusz szinuszát számítja ki. +ASINH = ASINH ## Egy szám inverz szinusz hiperbolikuszát számítja ki. +ATAN = ARCTAN ## Egy szám arkusz tangensét számítja ki. +ATAN2 = ARCTAN2 ## X és y koordináták alapján számítja ki az arkusz tangens értéket. +ATANH = ATANH ## A szám inverz tangens hiperbolikuszát számítja ki. +CEILING = PLAFON ## Egy számot a legközelebbi egészre vagy a pontosságként megadott érték legközelebb esÅ‘ többszörösére kerekít. +COMBIN = KOMBINÃCIÓK ## Adott számú objektum összes lehetséges kombinációinak számát számítja ki. +COS = COS ## Egy szám koszinuszát számítja ki. +COSH = COSH ## Egy szám koszinusz hiperbolikuszát számítja ki. +DEGREES = FOK ## Radiánt fokká alakít át. +EVEN = PÃROS ## Egy számot a legközelebbi páros egész számra kerekít. +EXP = KITEVÅ ## Az e adott kitevÅ‘jű hatványát adja eredményül. +FACT = FAKT ## Egy szám faktoriálisát számítja ki. +FACTDOUBLE = FACTDOUBLE ## Egy szám dupla faktoriálisát adja eredményül. +FLOOR = PADLÓ ## Egy számot lefelé, a nulla felé kerekít. +GCD = GCD ## A legnagyobb közös osztót adja eredményül. +INT = INT ## Egy számot lefelé kerekít a legközelebbi egészre. +LCM = LCM ## A legkisebb közös többszöröst adja eredményül. +LN = LN ## Egy szám természetes logaritmusát számítja ki. +LOG = LOG ## Egy szám adott alapú logaritmusát számítja ki. +LOG10 = LOG10 ## Egy szám 10-es alapú logaritmusát számítja ki. +MDETERM = MDETERM ## Egy tömb mátrix-determinánsát számítja ki. +MINVERSE = INVERZ.MÃTRIX ## Egy tömb mátrix inverzét adja eredményül. +MMULT = MSZORZAT ## Két tömb mátrix-szorzatát adja meg. +MOD = MARADÉK ## Egy szám osztási maradékát adja eredményül. +MROUND = MROUND ## A kívánt többszörösére kerekített értéket ad eredményül. +MULTINOMIAL = MULTINOMIAL ## Számhalmaz multinomiálisát adja eredményül. +ODD = PÃRATLAN ## Egy számot a legközelebbi páratlan számra kerekít. +PI = PI ## A pi matematikai állandót adja vissza. +POWER = HATVÃNY ## Egy szám adott kitevÅ‘jű hatványát számítja ki. +PRODUCT = SZORZAT ## Argumentumai szorzatát számítja ki. +QUOTIENT = QUOTIENT ## Egy hányados egész részét adja eredményül. +RADIANS = RADIÃN ## Fokot radiánná alakít át. +RAND = VÉL ## Egy 0 és 1 közötti véletlen számot ad eredményül. +RANDBETWEEN = RANDBETWEEN ## Megadott számok közé esÅ‘ véletlen számot állít elÅ‘. +ROMAN = RÓMAI ## Egy számot római számokkal kifejezve szövegként ad eredményül. +ROUND = KEREKÃTÉS ## Egy számot adott számú számjegyre kerekít. +ROUNDDOWN = KEREKÃTÉS.LE ## Egy számot lefelé, a nulla felé kerekít. +ROUNDUP = KEREKÃTÉS.FEL ## Egy számot felfelé, a nullától távolabbra kerekít. +SERIESSUM = SERIESSUM ## Hatványsor összegét adja eredményül. +SIGN = ELÅJEL ## Egy szám elÅ‘jelét adja meg. +SIN = SIN ## Egy szög szinuszát számítja ki. +SINH = SINH ## Egy szám szinusz hiperbolikuszát számítja ki. +SQRT = GYÖK ## Egy szám pozitív négyzetgyökét számítja ki. +SQRTPI = SQRTPI ## A (szám*pi) négyzetgyökét adja eredményül. +SUBTOTAL = RÉSZÖSSZEG ## Lista vagy adatbázis részösszegét adja eredményül. +SUM = SZUM ## Összeadja az argumentumlistájában lévÅ‘ számokat. +SUMIF = SZUMHA ## A megadott feltételeknek eleget tevÅ‘ cellákban található értékeket adja össze. +SUMIFS = SZUMHATÖBB ## Több megadott feltételnek eleget tévÅ‘ tartománycellák összegét adja eredményül. +SUMPRODUCT = SZORZATÖSSZEG ## A megfelelÅ‘ tömbelemek szorzatának összegét számítja ki. +SUMSQ = NÉGYZETÖSSZEG ## Argumentumai négyzetének összegét számítja ki. +SUMX2MY2 = SZUMX2BÅLY2 ## Két tömb megfelelÅ‘ elemei négyzetének különbségét összegzi. +SUMX2PY2 = SZUMX2MEGY2 ## Két tömb megfelelÅ‘ elemei négyzetének összegét összegzi. +SUMXMY2 = SZUMXBÅLY2 ## Két tömb megfelelÅ‘ elemei különbségének négyzetösszegét számítja ki. +TAN = TAN ## Egy szám tangensét számítja ki. +TANH = TANH ## Egy szám tangens hiperbolikuszát számítja ki. +TRUNC = CSONK ## Egy számot egésszé csonkít. + + +## +## Statistical functions Statisztikai függvények +## +AVEDEV = ÃTL.ELTÉRÉS ## Az adatpontoknak átlaguktól való átlagos abszolút eltérését számítja ki. +AVERAGE = ÃTLAG ## Argumentumai átlagát számítja ki. +AVERAGEA = ÃTLAGA ## Argumentumai átlagát számítja ki (beleértve a számokat, szöveget és logikai értékeket). +AVERAGEIF = ÃTLAGHA ## A megadott feltételnek eleget tévÅ‘ tartomány celláinak átlagát (számtani közepét) adja eredményül. +AVERAGEIFS = ÃTLAGHATÖBB ## A megadott feltételeknek eleget tévÅ‘ cellák átlagát (számtani közepét) adja eredményül. +BETADIST = BÉTA.ELOSZLÃS ## A béta-eloszlás függvényt számítja ki. +BETAINV = INVERZ.BÉTA ## Adott béta-eloszláshoz kiszámítja a béta eloszlásfüggvény inverzét. +BINOMDIST = BINOM.ELOSZLÃS ## A diszkrét binomiális eloszlás valószínűségértékét számítja ki. +CHIDIST = KHI.ELOSZLÃS ## A khi-négyzet-eloszlás egyszélű valószínűségértékét számítja ki. +CHIINV = INVERZ.KHI ## A khi-négyzet-eloszlás egyszélű valószínűségértékének inverzét számítja ki. +CHITEST = KHI.PRÓBA ## Függetlenségvizsgálatot hajt végre. +CONFIDENCE = MEGBÃZHATÓSÃG ## Egy statisztikai sokaság várható értékének megbízhatósági intervallumát adja eredményül. +CORREL = KORREL ## Két adathalmaz korrelációs együtthatóját számítja ki. +COUNT = DARAB ## Megszámolja, hogy argumentumlistájában hány szám található. +COUNTA = DARAB2 ## Megszámolja, hogy argumentumlistájában hány érték található. +COUNTBLANK = DARABÜRES ## Egy tartományban összeszámolja az üres cellákat. +COUNTIF = DARABTELI ## Egy tartományban összeszámolja azokat a cellákat, amelyek eleget tesznek a megadott feltételnek. +COUNTIFS = DARABHATÖBB ## Egy tartományban összeszámolja azokat a cellákat, amelyek eleget tesznek több feltételnek. +COVAR = KOVAR ## A kovarianciát, azaz a páronkénti eltérések szorzatának átlagát számítja ki. +CRITBINOM = KRITBINOM ## Azt a legkisebb számot adja eredményül, amelyre a binomiális eloszlásfüggvény értéke nem kisebb egy adott határértéknél. +DEVSQ = SQ ## Az átlagtól való eltérések négyzetének összegét számítja ki. +EXPONDIST = EXP.ELOSZLÃS ## Az exponenciális eloszlás értékét számítja ki. +FDIST = F.ELOSZLÃS ## Az F-eloszlás értékét számítja ki. +FINV = INVERZ.F ## Az F-eloszlás inverzének értékét számítja ki. +FISHER = FISHER ## Fisher-transzformációt hajt végre. +FISHERINV = INVERZ.FISHER ## A Fisher-transzformáció inverzét hajtja végre. +FORECAST = ELÅREJELZÉS ## Az ismert értékek alapján lineáris regresszióval becsült értéket ad eredményül. +FREQUENCY = GYAKORISÃG ## A gyakorisági vagy empirikus eloszlás értékét függÅ‘leges tömbként adja eredményül. +FTEST = F.PRÓBA ## Az F-próba értékét adja eredményül. +GAMMADIST = GAMMA.ELOSZLÃS ## A gamma-eloszlás értékét számítja ki. +GAMMAINV = INVERZ.GAMMA ## A gamma-eloszlás eloszlásfüggvénye inverzének értékét számítja ki. +GAMMALN = GAMMALN ## A gamma-függvény természetes logaritmusát számítja ki. +GEOMEAN = MÉRTANI.KÖZÉP ## Argumentumai mértani középértékét számítja ki. +GROWTH = NÖV ## Exponenciális regresszió alapján ad becslést. +HARMEAN = HARM.KÖZÉP ## Argumentumai harmonikus átlagát számítja ki. +HYPGEOMDIST = HIPERGEOM.ELOSZLÃS ## A hipergeometriai eloszlás értékét számítja ki. +INTERCEPT = METSZ ## A regressziós egyenes y tengellyel való metszéspontját határozza meg. +KURT = CSÚCSOSSÃG ## Egy adathalmaz csúcsosságát számítja ki. +LARGE = NAGY ## Egy adathalmaz k-adik legnagyobb elemét adja eredményül. +LINEST = LIN.ILL ## A legkisebb négyzetek módszerével az adatokra illesztett egyenes paramétereit határozza meg. +LOGEST = LOG.ILL ## Az adatokra illesztett exponenciális görbe paramétereit határozza meg. +LOGINV = INVERZ.LOG.ELOSZLÃS ## A lognormális eloszlás inverzét számítja ki. +LOGNORMDIST = LOG.ELOSZLÃS ## A lognormális eloszlásfüggvény értékét számítja ki. +MAX = MAX ## Az argumentumai között szereplÅ‘ legnagyobb számot adja meg. +MAXA = MAX2 ## Az argumentumai között szereplÅ‘ legnagyobb számot adja meg (beleértve a számokat, szöveget és logikai értékeket). +MEDIAN = MEDIÃN ## Adott számhalmaz mediánját számítja ki. +MIN = MIN ## Az argumentumai között szereplÅ‘ legkisebb számot adja meg. +MINA = MIN2 ## Az argumentumai között szereplÅ‘ legkisebb számot adja meg, beleértve a számokat, szöveget és logikai értékeket. +MODE = MÓDUSZ ## Egy adathalmazból kiválasztja a leggyakrabban elÅ‘forduló számot. +NEGBINOMDIST = NEGBINOM.ELOSZL ## A negatív binomiális eloszlás értékét számítja ki. +NORMDIST = NORM.ELOSZL ## A normális eloszlás értékét számítja ki. +NORMINV = INVERZ.NORM ## A normális eloszlás eloszlásfüggvénye inverzének értékét számítja ki. +NORMSDIST = STNORMELOSZL ## A standard normális eloszlás eloszlásfüggvényének értékét számítja ki. +NORMSINV = INVERZ.STNORM ## A standard normális eloszlás eloszlásfüggvénye inverzének értékét számítja ki. +PEARSON = PEARSON ## A Pearson-féle korrelációs együtthatót számítja ki. +PERCENTILE = PERCENTILIS ## Egy tartományban található értékek k-adik percentilisét, azaz százalékosztályát adja eredményül. +PERCENTRANK = SZÃZALÉKRANG ## Egy értéknek egy adathalmazon belül vett százalékos rangját (elhelyezkedését) számítja ki. +PERMUT = VARIÃCIÓK ## Adott számú objektum k-ad osztályú ismétlés nélküli variációinak számát számítja ki. +POISSON = POISSON ## A Poisson-eloszlás értékét számítja ki. +PROB = VALÓSZÃNŰSÉG ## Annak valószínűségét számítja ki, hogy adott értékek két határérték közé esnek. +QUARTILE = KVARTILIS ## Egy adathalmaz kvartilisét (negyedszintjét) számítja ki. +RANK = SORSZÃM ## Kiszámítja, hogy egy szám hányadik egy számsorozatban. +RSQ = RNÉGYZET ## Kiszámítja a Pearson-féle szorzatmomentum korrelációs együtthatójának négyzetét. +SKEW = FERDESÉG ## Egy eloszlás ferdeségét határozza meg. +SLOPE = MEREDEKSÉG ## Egy lineáris regressziós egyenes meredekségét számítja ki. +SMALL = KICSI ## Egy adathalmaz k-adik legkisebb elemét adja meg. +STANDARDIZE = NORMALIZÃLÃS ## Normalizált értéket ad eredményül. +STDEV = SZÓRÃS ## Egy statisztikai sokaság mintájából kiszámítja annak szórását. +STDEVA = SZÓRÃSA ## Egy statisztikai sokaság mintájából kiszámítja annak szórását (beleértve a számokat, szöveget és logikai értékeket). +STDEVP = SZÓRÃSP ## Egy statisztikai sokaság egészébÅ‘l kiszámítja annak szórását. +STDEVPA = SZÓRÃSPA ## Egy statisztikai sokaság egészébÅ‘l kiszámítja annak szórását (beleértve számokat, szöveget és logikai értékeket). +STEYX = STHIBAYX ## Egy regresszió esetén az egyes x-értékek alapján meghatározott y-értékek standard hibáját számítja ki. +TDIST = T.ELOSZLÃS ## A Student-féle t-eloszlás értékét számítja ki. +TINV = INVERZ.T ## A Student-féle t-eloszlás inverzét számítja ki. +TREND = TREND ## Lineáris trend értékeit számítja ki. +TRIMMEAN = RÉSZÃTLAG ## Egy adathalmaz középsÅ‘ részének átlagát számítja ki. +TTEST = T.PRÓBA ## A Student-féle t-próbához tartozó valószínűséget számítja ki. +VAR = VAR ## Minta alapján becslést ad a varianciára. +VARA = VARA ## Minta alapján becslést ad a varianciára (beleértve számokat, szöveget és logikai értékeket). +VARP = VARP ## Egy statisztikai sokaság varianciáját számítja ki. +VARPA = VARPA ## Egy statisztikai sokaság varianciáját számítja ki (beleértve számokat, szöveget és logikai értékeket). +WEIBULL = WEIBULL ## A Weibull-féle eloszlás értékét számítja ki. +ZTEST = Z.PRÓBA ## Az egyszélű z-próbával kapott valószínűségértéket számítja ki. + + +## +## Text functions Szövegműveletekhez használható függvények +## +ASC = ASC ## Szöveg teljes szélességű (kétbájtos) latin és katakana karaktereit félszélességű (egybájtos) karakterekké alakítja. +BAHTTEXT = BAHTSZÖVEG ## Számot szöveggé alakít a ß (baht) pénznemformátum használatával. +CHAR = KARAKTER ## A kódszámmal meghatározott karaktert adja eredményül. +CLEAN = TISZTÃT ## A szövegbÅ‘l eltávolítja az összes nem nyomtatható karaktert. +CODE = KÓD ## Karaktersorozat elsÅ‘ karakterének numerikus kódját adja eredményül. +CONCATENATE = ÖSSZEFŰZ ## Több szövegelemet egyetlen szöveges elemmé fűz össze. +DOLLAR = FORINT ## Számot pénznem formátumú szöveggé alakít át. +EXACT = AZONOS ## Megvizsgálja, hogy két érték azonos-e. +FIND = SZÖVEG.TALÃL ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk megkülönböztetésével). +FINDB = SZÖVEG.TALÃL2 ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk megkülönböztetésével). +FIXED = FIX ## Számot szöveges formátumúra alakít adott számú tizedesjegyre kerekítve. +JIS = JIS ## A félszélességű (egybájtos) latin és a katakana karaktereket teljes szélességű (kétbájtos) karakterekké alakítja. +LEFT = BAL ## Szöveg bal szélsÅ‘ karaktereit adja eredményül. +LEFTB = BAL2 ## Szöveg bal szélsÅ‘ karaktereit adja eredményül. +LEN = HOSSZ ## Szöveg karakterekben mért hosszát adja eredményül. +LENB = HOSSZ2 ## Szöveg karakterekben mért hosszát adja eredményül. +LOWER = KISBETŰ ## Szöveget kisbetűssé alakít át. +MID = KÖZÉP ## A szöveg adott pozíciójától kezdve megadott számú karaktert ad vissza eredményként. +MIDB = KÖZÉP2 ## A szöveg adott pozíciójától kezdve megadott számú karaktert ad vissza eredményként. +PHONETIC = PHONETIC ## Szöveg furigana (fonetikus) karaktereit adja vissza. +PROPER = TNÉV ## Szöveg minden szavának kezdÅ‘betűjét nagybetűsre cseréli. +REPLACE = CSERE ## A szövegen belül karaktereket cserél. +REPLACEB = CSERE2 ## A szövegen belül karaktereket cserél. +REPT = SOKSZOR ## Megadott számú alkalommal megismétel egy szövegrészt. +RIGHT = JOBB ## Szövegrész jobb szélsÅ‘ karaktereit adja eredményül. +RIGHTB = JOBB2 ## Szövegrész jobb szélsÅ‘ karaktereit adja eredményül. +SEARCH = SZÖVEG.KERES ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk között nem tesz különbséget). +SEARCHB = SZÖVEG.KERES2 ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk között nem tesz különbséget). +SUBSTITUTE = HELYETTE ## Szövegben adott karaktereket másikra cserél. +T = T ## Argumentumát szöveggé alakítja át. +TEXT = SZÖVEG ## Számértéket alakít át adott számformátumú szöveggé. +TRIM = TRIM ## A szövegbÅ‘l eltávolítja a szóközöket. +UPPER = NAGYBETŰS ## Szöveget nagybetűssé alakít át. +VALUE = ÉRTÉK ## Szöveget számmá alakít át. diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/it/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/it/config new file mode 100644 index 000000000..5baad5378 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/it/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NULLO! +DIV0 = #DIV/0! +VALUE = #VALORE! +REF = #RIF! +NAME = #NOME? +NUM = #NUM! +NA = #N/D diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/it/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/it/functions new file mode 100644 index 000000000..3d0920481 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/it/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funzioni di automazione e dei componenti aggiuntivi +## +GETPIVOTDATA = INFO.DATI.TAB.PIVOT ## Restituisce i dati memorizzati in un rapporto di tabella pivot + + +## +## Cube functions Funzioni cubo +## +CUBEKPIMEMBER = MEMBRO.KPI.CUBO ## Restituisce il nome, la proprietà e la misura di un indicatore di prestazioni chiave (KPI) e visualizza il nome e la proprietà nella cella. Un KPI è una misura quantificabile, ad esempio l'utile lordo mensile o il fatturato trimestrale dei dipendenti, utilizzata per il monitoraggio delle prestazioni di un'organizzazione. +CUBEMEMBER = MEMBRO.CUBO ## Restituisce un membro o una tupla in una gerarchia di cubi. Consente di verificare l'esistenza del membro o della tupla nel cubo. +CUBEMEMBERPROPERTY = PROPRIETÀ.MEMBRO.CUBO ## Restituisce il valore di una proprietà di un membro del cubo. Consente di verificare l'esistenza di un nome di membro all'interno del cubo e di restituire la proprietà specificata per tale membro. +CUBERANKEDMEMBER = MEMBRO.CUBO.CON.RANGO ## Restituisce l'n-esimo membro o il membro ordinato di un insieme. Consente di restituire uno o più elementi in un insieme, ad esempio l'agente di vendita migliore o i primi 10 studenti. +CUBESET = SET.CUBO ## Definisce un insieme di tuple o membri calcolati mediante l'invio di un'espressione di insieme al cubo sul server. In questo modo l'insieme viene creato e restituito a Microsoft Office Excel. +CUBESETCOUNT = CONTA.SET.CUBO ## Restituisce il numero di elementi di un insieme. +CUBEVALUE = VALORE.CUBO ## Restituisce un valore aggregato da un cubo. + + +## +## Database functions Funzioni di database +## +DAVERAGE = DB.MEDIA ## Restituisce la media di voci del database selezionate +DCOUNT = DB.CONTA.NUMERI ## Conta le celle di un database contenenti numeri +DCOUNTA = DB.CONTA.VALORI ## Conta le celle non vuote in un database +DGET = DB.VALORI ## Estrae da un database un singolo record che soddisfa i criteri specificati +DMAX = DB.MAX ## Restituisce il valore massimo dalle voci selezionate in un database +DMIN = DB.MIN ## Restituisce il valore minimo dalle voci di un database selezionate +DPRODUCT = DB.PRODOTTO ## Moltiplica i valori in un determinato campo di record che soddisfano i criteri del database +DSTDEV = DB.DEV.ST ## Restituisce una stima della deviazione standard sulla base di un campione di voci di un database selezionate +DSTDEVP = DB.DEV.ST.POP ## Calcola la deviazione standard sulla base di tutte le voci di un database selezionate +DSUM = DB.SOMMA ## Aggiunge i numeri nel campo colonna di record del database che soddisfa determinati criteri +DVAR = DB.VAR ## Restituisce una stima della varianza sulla base di un campione da voci di un database selezionate +DVARP = DB.VAR.POP ## Calcola la varianza sulla base di tutte le voci di un database selezionate + + +## +## Date and time functions Funzioni data e ora +## +DATE = DATA ## Restituisce il numero seriale di una determinata data +DATEVALUE = DATA.VALORE ## Converte una data sotto forma di testo in un numero seriale +DAY = GIORNO ## Converte un numero seriale in un giorno del mese +DAYS360 = GIORNO360 ## Calcola il numero di giorni compreso tra due date basandosi su un anno di 360 giorni +EDATE = DATA.MESE ## Restituisce il numero seriale della data che rappresenta il numero di mesi prima o dopo la data di inizio +EOMONTH = FINE.MESE ## Restituisce il numero seriale dell'ultimo giorno del mese, prima o dopo un determinato numero di mesi +HOUR = ORA ## Converte un numero seriale in un'ora +MINUTE = MINUTO ## Converte un numero seriale in un minuto +MONTH = MESE ## Converte un numero seriale in un mese +NETWORKDAYS = GIORNI.LAVORATIVI.TOT ## Restituisce il numero di tutti i giorni lavorativi compresi fra due date +NOW = ADESSO ## Restituisce il numero seriale della data e dell'ora corrente +SECOND = SECONDO ## Converte un numero seriale in un secondo +TIME = ORARIO ## Restituisce il numero seriale di una determinata ora +TIMEVALUE = ORARIO.VALORE ## Converte un orario in forma di testo in un numero seriale +TODAY = OGGI ## Restituisce il numero seriale relativo alla data odierna +WEEKDAY = GIORNO.SETTIMANA ## Converte un numero seriale in un giorno della settimana +WEEKNUM = NUM.SETTIMANA ## Converte un numero seriale in un numero che rappresenta la posizione numerica di una settimana nell'anno +WORKDAY = GIORNO.LAVORATIVO ## Restituisce il numero della data prima o dopo un determinato numero di giorni lavorativi +YEAR = ANNO ## Converte un numero seriale in un anno +YEARFRAC = FRAZIONE.ANNO ## Restituisce la frazione dell'anno che rappresenta il numero dei giorni compresi tra una data_ iniziale e una data_finale + + +## +## Engineering functions Funzioni ingegneristiche +## +BESSELI = BESSEL.I ## Restituisce la funzione di Bessel modificata In(x) +BESSELJ = BESSEL.J ## Restituisce la funzione di Bessel Jn(x) +BESSELK = BESSEL.K ## Restituisce la funzione di Bessel modificata Kn(x) +BESSELY = BESSEL.Y ## Restituisce la funzione di Bessel Yn(x) +BIN2DEC = BINARIO.DECIMALE ## Converte un numero binario in decimale +BIN2HEX = BINARIO.HEX ## Converte un numero binario in esadecimale +BIN2OCT = BINARIO.OCT ## Converte un numero binario in ottale +COMPLEX = COMPLESSO ## Converte i coefficienti reali e immaginari in numeri complessi +CONVERT = CONVERTI ## Converte un numero da un sistema di misura in un altro +DEC2BIN = DECIMALE.BINARIO ## Converte un numero decimale in binario +DEC2HEX = DECIMALE.HEX ## Converte un numero decimale in esadecimale +DEC2OCT = DECIMALE.OCT ## Converte un numero decimale in ottale +DELTA = DELTA ## Verifica se due valori sono uguali +ERF = FUNZ.ERRORE ## Restituisce la funzione di errore +ERFC = FUNZ.ERRORE.COMP ## Restituisce la funzione di errore complementare +GESTEP = SOGLIA ## Verifica se un numero è maggiore del valore di soglia +HEX2BIN = HEX.BINARIO ## Converte un numero esadecimale in binario +HEX2DEC = HEX.DECIMALE ## Converte un numero esadecimale in decimale +HEX2OCT = HEX.OCT ## Converte un numero esadecimale in ottale +IMABS = COMP.MODULO ## Restituisce il valore assoluto (modulo) di un numero complesso +IMAGINARY = COMP.IMMAGINARIO ## Restituisce il coefficiente immaginario di un numero complesso +IMARGUMENT = COMP.ARGOMENTO ## Restituisce l'argomento theta, un angolo espresso in radianti +IMCONJUGATE = COMP.CONIUGATO ## Restituisce il complesso coniugato del numero complesso +IMCOS = COMP.COS ## Restituisce il coseno di un numero complesso +IMDIV = COMP.DIV ## Restituisce il quoziente di due numeri complessi +IMEXP = COMP.EXP ## Restituisce il valore esponenziale di un numero complesso +IMLN = COMP.LN ## Restituisce il logaritmo naturale di un numero complesso +IMLOG10 = COMP.LOG10 ## Restituisce il logaritmo in base 10 di un numero complesso +IMLOG2 = COMP.LOG2 ## Restituisce un logaritmo in base 2 di un numero complesso +IMPOWER = COMP.POTENZA ## Restituisce il numero complesso elevato a una potenza intera +IMPRODUCT = COMP.PRODOTTO ## Restituisce il prodotto di numeri complessi compresi tra 2 e 29 +IMREAL = COMP.PARTE.REALE ## Restituisce il coefficiente reale di un numero complesso +IMSIN = COMP.SEN ## Restituisce il seno di un numero complesso +IMSQRT = COMP.RADQ ## Restituisce la radice quadrata di un numero complesso +IMSUB = COMP.DIFF ## Restituisce la differenza fra due numeri complessi +IMSUM = COMP.SOMMA ## Restituisce la somma di numeri complessi +OCT2BIN = OCT.BINARIO ## Converte un numero ottale in binario +OCT2DEC = OCT.DECIMALE ## Converte un numero ottale in decimale +OCT2HEX = OCT.HEX ## Converte un numero ottale in esadecimale + + +## +## Financial functions Funzioni finanziarie +## +ACCRINT = INT.MATURATO.PER ## Restituisce l'interesse maturato di un titolo che paga interessi periodici +ACCRINTM = INT.MATURATO.SCAD ## Restituisce l'interesse maturato di un titolo che paga interessi alla scadenza +AMORDEGRC = AMMORT.DEGR ## Restituisce l'ammortamento per ogni periodo contabile utilizzando un coefficiente di ammortamento +AMORLINC = AMMORT.PER ## Restituisce l'ammortamento per ogni periodo contabile +COUPDAYBS = GIORNI.CED.INIZ.LIQ ## Restituisce il numero dei giorni che vanno dall'inizio del periodo di durata della cedola alla data di liquidazione +COUPDAYS = GIORNI.CED ## Restituisce il numero dei giorni relativi al periodo della cedola che contiene la data di liquidazione +COUPDAYSNC = GIORNI.CED.NUOVA ## Restituisce il numero di giorni che vanno dalla data di liquidazione alla data della cedola successiva +COUPNCD = DATA.CED.SUCC ## Restituisce un numero che rappresenta la data della cedola successiva alla data di liquidazione +COUPNUM = NUM.CED ## Restituisce il numero di cedole pagabili fra la data di liquidazione e la data di scadenza +COUPPCD = DATA.CED.PREC ## Restituisce un numero che rappresenta la data della cedola precedente alla data di liquidazione +CUMIPMT = INT.CUMUL ## Restituisce l'interesse cumulativo pagato fra due periodi +CUMPRINC = CAP.CUM ## Restituisce il capitale cumulativo pagato per estinguere un debito fra due periodi +DB = DB ## Restituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a quote fisse decrescenti +DDB = AMMORT ## Restituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a doppie quote decrescenti o altri metodi specificati +DISC = TASSO.SCONTO ## Restituisce il tasso di sconto per un titolo +DOLLARDE = VALUTA.DEC ## Converte un prezzo valuta, espresso come frazione, in prezzo valuta, espresso come numero decimale +DOLLARFR = VALUTA.FRAZ ## Converte un prezzo valuta, espresso come numero decimale, in prezzo valuta, espresso come frazione +DURATION = DURATA ## Restituisce la durata annuale di un titolo con i pagamenti di interesse periodico +EFFECT = EFFETTIVO ## Restituisce l'effettivo tasso di interesse annuo +FV = VAL.FUT ## Restituisce il valore futuro di un investimento +FVSCHEDULE = VAL.FUT.CAPITALE ## Restituisce il valore futuro di un capitale iniziale dopo aver applicato una serie di tassi di interesse composti +INTRATE = TASSO.INT ## Restituisce il tasso di interesse per un titolo interamente investito +IPMT = INTERESSI ## Restituisce il valore degli interessi per un investimento relativo a un periodo specifico +IRR = TIR.COST ## Restituisce il tasso di rendimento interno per una serie di flussi di cassa +ISPMT = INTERESSE.RATA ## Calcola l'interesse di un investimento pagato durante un periodo specifico +MDURATION = DURATA.M ## Restituisce la durata Macauley modificata per un titolo con un valore presunto di € 100 +MIRR = TIR.VAR ## Restituisce il tasso di rendimento interno in cui i flussi di cassa positivi e negativi sono finanziati a tassi differenti +NOMINAL = NOMINALE ## Restituisce il tasso di interesse nominale annuale +NPER = NUM.RATE ## Restituisce un numero di periodi relativi a un investimento +NPV = VAN ## Restituisce il valore attuale netto di un investimento basato su una serie di flussi di cassa periodici e sul tasso di sconto +ODDFPRICE = PREZZO.PRIMO.IRR ## Restituisce il prezzo di un titolo dal valore nominale di € 100 avente il primo periodo di durata irregolare +ODDFYIELD = REND.PRIMO.IRR ## Restituisce il rendimento di un titolo avente il primo periodo di durata irregolare +ODDLPRICE = PREZZO.ULTIMO.IRR ## Restituisce il prezzo di un titolo dal valore nominale di € 100 avente l'ultimo periodo di durata irregolare +ODDLYIELD = REND.ULTIMO.IRR ## Restituisce il rendimento di un titolo avente l'ultimo periodo di durata irregolare +PMT = RATA ## Restituisce il pagamento periodico di una rendita annua +PPMT = P.RATA ## Restituisce il pagamento sul capitale di un investimento per un dato periodo +PRICE = PREZZO ## Restituisce il prezzo di un titolo dal valore nominale di € 100 che paga interessi periodici +PRICEDISC = PREZZO.SCONT ## Restituisce il prezzo di un titolo scontato dal valore nominale di € 100 +PRICEMAT = PREZZO.SCAD ## Restituisce il prezzo di un titolo dal valore nominale di € 100 che paga gli interessi alla scadenza +PV = VA ## Restituisce il valore attuale di un investimento +RATE = TASSO ## Restituisce il tasso di interesse per un periodo di un'annualità +RECEIVED = RICEV.SCAD ## Restituisce l'ammontare ricevuto alla scadenza di un titolo interamente investito +SLN = AMMORT.COST ## Restituisce l'ammortamento a quote costanti di un bene per un singolo periodo +SYD = AMMORT.ANNUO ## Restituisce l'ammortamento a somma degli anni di un bene per un periodo specificato +TBILLEQ = BOT.EQUIV ## Restituisce il rendimento equivalente ad un'obbligazione per un Buono ordinario del Tesoro +TBILLPRICE = BOT.PREZZO ## Restituisce il prezzo di un Buono del Tesoro dal valore nominale di € 100 +TBILLYIELD = BOT.REND ## Restituisce il rendimento di un Buono del Tesoro +VDB = AMMORT.VAR ## Restituisce l'ammortamento di un bene per un periodo specificato o parziale utilizzando il metodo a doppie quote proporzionali ai valori residui +XIRR = TIR.X ## Restituisce il tasso di rendimento interno di un impiego di flussi di cassa +XNPV = VAN.X ## Restituisce il valore attuale netto di un impiego di flussi di cassa non necessariamente periodici +YIELD = REND ## Restituisce il rendimento di un titolo che frutta interessi periodici +YIELDDISC = REND.TITOLI.SCONT ## Restituisce il rendimento annuale di un titolo scontato, ad esempio un Buono del Tesoro +YIELDMAT = REND.SCAD ## Restituisce il rendimento annuo di un titolo che paga interessi alla scadenza + + +## +## Information functions Funzioni relative alle informazioni +## +CELL = CELLA ## Restituisce le informazioni sulla formattazione, la posizione o i contenuti di una cella +ERROR.TYPE = ERRORE.TIPO ## Restituisce un numero che corrisponde a un tipo di errore +INFO = INFO ## Restituisce le informazioni sull'ambiente operativo corrente +ISBLANK = VAL.VUOTO ## Restituisce VERO se il valore è vuoto +ISERR = VAL.ERR ## Restituisce VERO se il valore è un valore di errore qualsiasi tranne #N/D +ISERROR = VAL.ERRORE ## Restituisce VERO se il valore è un valore di errore qualsiasi +ISEVEN = VAL.PARI ## Restituisce VERO se il numero è pari +ISLOGICAL = VAL.LOGICO ## Restituisce VERO se il valore è un valore logico +ISNA = VAL.NON.DISP ## Restituisce VERO se il valore è un valore di errore #N/D +ISNONTEXT = VAL.NON.TESTO ## Restituisce VERO se il valore non è in formato testo +ISNUMBER = VAL.NUMERO ## Restituisce VERO se il valore è un numero +ISODD = VAL.DISPARI ## Restituisce VERO se il numero è dispari +ISREF = VAL.RIF ## Restituisce VERO se il valore è un riferimento +ISTEXT = VAL.TESTO ## Restituisce VERO se il valore è in formato testo +N = NUM ## Restituisce un valore convertito in numero +NA = NON.DISP ## Restituisce il valore di errore #N/D +TYPE = TIPO ## Restituisce un numero che indica il tipo di dati relativi a un valore + + +## +## Logical functions Funzioni logiche +## +AND = E ## Restituisce VERO se tutti gli argomenti sono VERO +FALSE = FALSO ## Restituisce il valore logico FALSO +IF = SE ## Specifica un test logico da eseguire +IFERROR = SE.ERRORE ## Restituisce un valore specificato se una formula fornisce un errore come risultato; in caso contrario, restituisce il risultato della formula +NOT = NON ## Inverte la logica degli argomenti +OR = O ## Restituisce VERO se un argomento qualsiasi è VERO +TRUE = VERO ## Restituisce il valore logico VERO + + +## +## Lookup and reference functions Funzioni di ricerca e di riferimento +## +ADDRESS = INDIRIZZO ## Restituisce un riferimento come testo in una singola cella di un foglio di lavoro +AREAS = AREE ## Restituisce il numero di aree in un riferimento +CHOOSE = SCEGLI ## Sceglie un valore da un elenco di valori +COLUMN = RIF.COLONNA ## Restituisce il numero di colonna di un riferimento +COLUMNS = COLONNE ## Restituisce il numero di colonne in un riferimento +HLOOKUP = CERCA.ORIZZ ## Effettua una ricerca nella riga superiore di una matrice e restituisce il valore della cella specificata +HYPERLINK = COLLEG.IPERTESTUALE ## Crea un collegamento che apre un documento memorizzato in un server di rete, una rete Intranet o Internet +INDEX = INDICE ## Utilizza un indice per scegliere un valore da un riferimento o da una matrice +INDIRECT = INDIRETTO ## Restituisce un riferimento specificato da un valore testo +LOOKUP = CERCA ## Ricerca i valori in un vettore o in una matrice +MATCH = CONFRONTA ## Ricerca i valori in un riferimento o in una matrice +OFFSET = SCARTO ## Restituisce uno scarto di riferimento da un riferimento dato +ROW = RIF.RIGA ## Restituisce il numero di riga di un riferimento +ROWS = RIGHE ## Restituisce il numero delle righe in un riferimento +RTD = DATITEMPOREALE ## Recupera dati in tempo reale da un programma che supporta l'automazione COM (automazione: Metodo per utilizzare gli oggetti di un'applicazione da un'altra applicazione o da un altro strumento di sviluppo. Precedentemente nota come automazione OLE, l'automazione è uno standard del settore e una caratteristica del modello COM (Component Object Model).) +TRANSPOSE = MATR.TRASPOSTA ## Restituisce la trasposizione di una matrice +VLOOKUP = CERCA.VERT ## Effettua una ricerca nella prima colonna di una matrice e si sposta attraverso la riga per restituire il valore di una cella + + +## +## Math and trigonometry functions Funzioni matematiche e trigonometriche +## +ABS = ASS ## Restituisce il valore assoluto di un numero. +ACOS = ARCCOS ## Restituisce l'arcocoseno di un numero +ACOSH = ARCCOSH ## Restituisce l'inverso del coseno iperbolico di un numero +ASIN = ARCSEN ## Restituisce l'arcoseno di un numero +ASINH = ARCSENH ## Restituisce l'inverso del seno iperbolico di un numero +ATAN = ARCTAN ## Restituisce l'arcotangente di un numero +ATAN2 = ARCTAN.2 ## Restituisce l'arcotangente delle coordinate x e y specificate +ATANH = ARCTANH ## Restituisce l'inverso della tangente iperbolica di un numero +CEILING = ARROTONDA.ECCESSO ## Arrotonda un numero per eccesso all'intero più vicino o al multiplo più vicino a peso +COMBIN = COMBINAZIONE ## Restituisce il numero di combinazioni possibili per un numero assegnato di elementi +COS = COS ## Restituisce il coseno dell'angolo specificato +COSH = COSH ## Restituisce il coseno iperbolico di un numero +DEGREES = GRADI ## Converte i radianti in gradi +EVEN = PARI ## Arrotonda il valore assoluto di un numero per eccesso al più vicino intero pari +EXP = ESP ## Restituisce il numero e elevato alla potenza di num +FACT = FATTORIALE ## Restituisce il fattoriale di un numero +FACTDOUBLE = FATT.DOPPIO ## Restituisce il fattoriale doppio di un numero +FLOOR = ARROTONDA.DIFETTO ## Arrotonda un numero per difetto al multiplo più vicino a zero +GCD = MCD ## Restituisce il massimo comune divisore +INT = INT ## Arrotonda un numero per difetto al numero intero più vicino +LCM = MCM ## Restituisce il minimo comune multiplo +LN = LN ## Restituisce il logaritmo naturale di un numero +LOG = LOG ## Restituisce il logaritmo di un numero in una specificata base +LOG10 = LOG10 ## Restituisce il logaritmo in base 10 di un numero +MDETERM = MATR.DETERM ## Restituisce il determinante di una matrice +MINVERSE = MATR.INVERSA ## Restituisce l'inverso di una matrice +MMULT = MATR.PRODOTTO ## Restituisce il prodotto di due matrici +MOD = RESTO ## Restituisce il resto della divisione +MROUND = ARROTONDA.MULTIPLO ## Restituisce un numero arrotondato al multiplo desiderato +MULTINOMIAL = MULTINOMIALE ## Restituisce il multinomiale di un insieme di numeri +ODD = DISPARI ## Arrotonda un numero per eccesso al più vicino intero dispari +PI = PI.GRECO ## Restituisce il valore di pi greco +POWER = POTENZA ## Restituisce il risultato di un numero elevato a potenza +PRODUCT = PRODOTTO ## Moltiplica i suoi argomenti +QUOTIENT = QUOZIENTE ## Restituisce la parte intera di una divisione +RADIANS = RADIANTI ## Converte i gradi in radianti +RAND = CASUALE ## Restituisce un numero casuale compreso tra 0 e 1 +RANDBETWEEN = CASUALE.TRA ## Restituisce un numero casuale compreso tra i numeri specificati +ROMAN = ROMANO ## Restituisce il numero come numero romano sotto forma di testo +ROUND = ARROTONDA ## Arrotonda il numero al numero di cifre specificato +ROUNDDOWN = ARROTONDA.PER.DIF ## Arrotonda il valore assoluto di un numero per difetto +ROUNDUP = ARROTONDA.PER.ECC ## Arrotonda il valore assoluto di un numero per eccesso +SERIESSUM = SOMMA.SERIE ## Restituisce la somma di una serie di potenze in base alla formula +SIGN = SEGNO ## Restituisce il segno di un numero +SIN = SEN ## Restituisce il seno di un dato angolo +SINH = SENH ## Restituisce il seno iperbolico di un numero +SQRT = RADQ ## Restituisce una radice quadrata +SQRTPI = RADQ.PI.GRECO ## Restituisce la radice quadrata di un numero (numero * pi greco) +SUBTOTAL = SUBTOTALE ## Restituisce un subtotale in un elenco o in un database +SUM = SOMMA ## Somma i suoi argomenti +SUMIF = SOMMA.SE ## Somma le celle specificate da un dato criterio +SUMIFS = SOMMA.PIÙ.SE ## Somma le celle in un intervallo che soddisfano più criteri +SUMPRODUCT = MATR.SOMMA.PRODOTTO ## Restituisce la somma dei prodotti dei componenti corrispondenti della matrice +SUMSQ = SOMMA.Q ## Restituisce la somma dei quadrati degli argomenti +SUMX2MY2 = SOMMA.DIFF.Q ## Restituisce la somma della differenza dei quadrati dei corrispondenti elementi in due matrici +SUMX2PY2 = SOMMA.SOMMA.Q ## Restituisce la somma della somma dei quadrati dei corrispondenti elementi in due matrici +SUMXMY2 = SOMMA.Q.DIFF ## Restituisce la somma dei quadrati delle differenze dei corrispondenti elementi in due matrici +TAN = TAN ## Restituisce la tangente di un numero +TANH = TANH ## Restituisce la tangente iperbolica di un numero +TRUNC = TRONCA ## Tronca la parte decimale di un numero + + +## +## Statistical functions Funzioni statistiche +## +AVEDEV = MEDIA.DEV ## Restituisce la media delle deviazioni assolute delle coordinate rispetto alla loro media +AVERAGE = MEDIA ## Restituisce la media degli argomenti +AVERAGEA = MEDIA.VALORI ## Restituisce la media degli argomenti, inclusi i numeri, il testo e i valori logici +AVERAGEIF = MEDIA.SE ## Restituisce la media aritmetica di tutte le celle in un intervallo che soddisfano un determinato criterio +AVERAGEIFS = MEDIA.PIÙ.SE ## Restituisce la media aritmetica di tutte le celle che soddisfano più criteri +BETADIST = DISTRIB.BETA ## Restituisce la funzione di distribuzione cumulativa beta +BETAINV = INV.BETA ## Restituisce l'inverso della funzione di distribuzione cumulativa per una distribuzione beta specificata +BINOMDIST = DISTRIB.BINOM ## Restituisce la distribuzione binomiale per il termine individuale +CHIDIST = DISTRIB.CHI ## Restituisce la probabilità a una coda per la distribuzione del chi quadrato +CHIINV = INV.CHI ## Restituisce l'inverso della probabilità ad una coda per la distribuzione del chi quadrato +CHITEST = TEST.CHI ## Restituisce il test per l'indipendenza +CONFIDENCE = CONFIDENZA ## Restituisce l'intervallo di confidenza per una popolazione +CORREL = CORRELAZIONE ## Restituisce il coefficiente di correlazione tra due insiemi di dati +COUNT = CONTA.NUMERI ## Conta la quantità di numeri nell'elenco di argomenti +COUNTA = CONTA.VALORI ## Conta il numero di valori nell'elenco di argomenti +COUNTBLANK = CONTA.VUOTE ## Conta il numero di celle vuote all'interno di un intervallo +COUNTIF = CONTA.SE ## Conta il numero di celle all'interno di un intervallo che soddisfa i criteri specificati +COUNTIFS = CONTA.PIÙ.SE ## Conta il numero di celle in un intervallo che soddisfano più criteri. +COVAR = COVARIANZA ## Calcola la covarianza, la media dei prodotti delle deviazioni accoppiate +CRITBINOM = CRIT.BINOM ## Restituisce il più piccolo valore per il quale la distribuzione cumulativa binomiale risulta maggiore o uguale ad un valore di criterio +DEVSQ = DEV.Q ## Restituisce la somma dei quadrati delle deviazioni +EXPONDIST = DISTRIB.EXP ## Restituisce la distribuzione esponenziale +FDIST = DISTRIB.F ## Restituisce la distribuzione di probabilità F +FINV = INV.F ## Restituisce l'inverso della distribuzione della probabilità F +FISHER = FISHER ## Restituisce la trasformazione di Fisher +FISHERINV = INV.FISHER ## Restituisce l'inverso della trasformazione di Fisher +FORECAST = PREVISIONE ## Restituisce i valori lungo una tendenza lineare +FREQUENCY = FREQUENZA ## Restituisce la distribuzione di frequenza come matrice verticale +FTEST = TEST.F ## Restituisce il risultato di un test F +GAMMADIST = DISTRIB.GAMMA ## Restituisce la distribuzione gamma +GAMMAINV = INV.GAMMA ## Restituisce l'inverso della distribuzione cumulativa gamma +GAMMALN = LN.GAMMA ## Restituisce il logaritmo naturale della funzione gamma, G(x) +GEOMEAN = MEDIA.GEOMETRICA ## Restituisce la media geometrica +GROWTH = CRESCITA ## Restituisce i valori lungo una linea di tendenza esponenziale +HARMEAN = MEDIA.ARMONICA ## Restituisce la media armonica +HYPGEOMDIST = DISTRIB.IPERGEOM ## Restituisce la distribuzione ipergeometrica +INTERCEPT = INTERCETTA ## Restituisce l'intercetta della retta di regressione lineare +KURT = CURTOSI ## Restituisce la curtosi di un insieme di dati +LARGE = GRANDE ## Restituisce il k-esimo valore più grande in un insieme di dati +LINEST = REGR.LIN ## Restituisce i parametri di una tendenza lineare +LOGEST = REGR.LOG ## Restituisce i parametri di una linea di tendenza esponenziale +LOGINV = INV.LOGNORM ## Restituisce l'inverso di una distribuzione lognormale +LOGNORMDIST = DISTRIB.LOGNORM ## Restituisce la distribuzione lognormale cumulativa +MAX = MAX ## Restituisce il valore massimo in un elenco di argomenti +MAXA = MAX.VALORI ## Restituisce il valore massimo in un elenco di argomenti, inclusi i numeri, il testo e i valori logici +MEDIAN = MEDIANA ## Restituisce la mediana dei numeri specificati +MIN = MIN ## Restituisce il valore minimo in un elenco di argomenti +MINA = MIN.VALORI ## Restituisce il più piccolo valore in un elenco di argomenti, inclusi i numeri, il testo e i valori logici +MODE = MODA ## Restituisce il valore più comune in un insieme di dati +NEGBINOMDIST = DISTRIB.BINOM.NEG ## Restituisce la distribuzione binomiale negativa +NORMDIST = DISTRIB.NORM ## Restituisce la distribuzione cumulativa normale +NORMINV = INV.NORM ## Restituisce l'inverso della distribuzione cumulativa normale standard +NORMSDIST = DISTRIB.NORM.ST ## Restituisce la distribuzione cumulativa normale standard +NORMSINV = INV.NORM.ST ## Restituisce l'inverso della distribuzione cumulativa normale +PEARSON = PEARSON ## Restituisce il coefficiente del momento di correlazione di Pearson +PERCENTILE = PERCENTILE ## Restituisce il k-esimo dato percentile di valori in un intervallo +PERCENTRANK = PERCENT.RANGO ## Restituisce il rango di un valore in un insieme di dati come percentuale +PERMUT = PERMUTAZIONE ## Restituisce il numero delle permutazioni per un determinato numero di oggetti +POISSON = POISSON ## Restituisce la distribuzione di Poisson +PROB = PROBABILITÀ ## Calcola la probabilità che dei valori in un intervallo siano compresi tra due limiti +QUARTILE = QUARTILE ## Restituisce il quartile di un insieme di dati +RANK = RANGO ## Restituisce il rango di un numero in un elenco di numeri +RSQ = RQ ## Restituisce la radice quadrata del coefficiente di momento di correlazione di Pearson +SKEW = ASIMMETRIA ## Restituisce il grado di asimmetria di una distribuzione +SLOPE = PENDENZA ## Restituisce la pendenza di una retta di regressione lineare +SMALL = PICCOLO ## Restituisce il k-esimo valore più piccolo in un insieme di dati +STANDARDIZE = NORMALIZZA ## Restituisce un valore normalizzato +STDEV = DEV.ST ## Restituisce una stima della deviazione standard sulla base di un campione +STDEVA = DEV.ST.VALORI ## Restituisce una stima della deviazione standard sulla base di un campione, inclusi i numeri, il testo e i valori logici +STDEVP = DEV.ST.POP ## Calcola la deviazione standard sulla base di un'intera popolazione +STDEVPA = DEV.ST.POP.VALORI ## Calcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici +STEYX = ERR.STD.YX ## Restituisce l'errore standard del valore previsto per y per ogni valore x nella regressione +TDIST = DISTRIB.T ## Restituisce la distribuzione t di Student +TINV = INV.T ## Restituisce l'inversa della distribuzione t di Student +TREND = TENDENZA ## Restituisce i valori lungo una linea di tendenza lineare +TRIMMEAN = MEDIA.TRONCATA ## Restituisce la media della parte interna di un insieme di dati +TTEST = TEST.T ## Restituisce la probabilità associata ad un test t di Student +VAR = VAR ## Stima la varianza sulla base di un campione +VARA = VAR.VALORI ## Stima la varianza sulla base di un campione, inclusi i numeri, il testo e i valori logici +VARP = VAR.POP ## Calcola la varianza sulla base dell'intera popolazione +VARPA = VAR.POP.VALORI ## Calcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici +WEIBULL = WEIBULL ## Restituisce la distribuzione di Weibull +ZTEST = TEST.Z ## Restituisce il valore di probabilità a una coda per un test z + + +## +## Text functions Funzioni di testo +## +ASC = ASC ## Modifica le lettere inglesi o il katakana a doppio byte all'interno di una stringa di caratteri in caratteri a singolo byte +BAHTTEXT = BAHTTESTO ## Converte un numero in testo, utilizzando il formato valuta ß (baht) +CHAR = CODICE.CARATT ## Restituisce il carattere specificato dal numero di codice +CLEAN = LIBERA ## Elimina dal testo tutti i caratteri che non è possibile stampare +CODE = CODICE ## Restituisce il codice numerico del primo carattere di una stringa di testo +CONCATENATE = CONCATENA ## Unisce diversi elementi di testo in un unico elemento di testo +DOLLAR = VALUTA ## Converte un numero in testo, utilizzando il formato valuta € (euro) +EXACT = IDENTICO ## Verifica se due valori di testo sono uguali +FIND = TROVA ## Rileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole) +FINDB = TROVA.B ## Rileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole) +FIXED = FISSO ## Formatta un numero come testo con un numero fisso di decimali +JIS = ORDINAMENTO.JIS ## Modifica le lettere inglesi o i caratteri katakana a byte singolo all'interno di una stringa di caratteri in caratteri a byte doppio. +LEFT = SINISTRA ## Restituisce il carattere più a sinistra di un valore di testo +LEFTB = SINISTRA.B ## Restituisce il carattere più a sinistra di un valore di testo +LEN = LUNGHEZZA ## Restituisce il numero di caratteri di una stringa di testo +LENB = LUNB ## Restituisce il numero di caratteri di una stringa di testo +LOWER = MINUSC ## Converte il testo in lettere minuscole +MID = MEDIA ## Restituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata +MIDB = MEDIA.B ## Restituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata +PHONETIC = FURIGANA ## Estrae i caratteri fonetici (furigana) da una stringa di testo. +PROPER = MAIUSC.INIZ ## Converte in maiuscolo la prima lettera di ogni parola di un valore di testo +REPLACE = RIMPIAZZA ## Sostituisce i caratteri all'interno di un testo +REPLACEB = SOSTITUISCI.B ## Sostituisce i caratteri all'interno di un testo +REPT = RIPETI ## Ripete un testo per un dato numero di volte +RIGHT = DESTRA ## Restituisce il carattere più a destra di un valore di testo +RIGHTB = DESTRA.B ## Restituisce il carattere più a destra di un valore di testo +SEARCH = RICERCA ## Rileva un valore di testo all'interno di un altro (non è sensibile alle maiuscole e minuscole) +SEARCHB = CERCA.B ## Rileva un valore di testo all'interno di un altro (non è sensibile alle maiuscole e minuscole) +SUBSTITUTE = SOSTITUISCI ## Sostituisce il nuovo testo al testo contenuto in una stringa +T = T ## Converte gli argomenti in testo +TEXT = TESTO ## Formatta un numero e lo converte in testo +TRIM = ANNULLA.SPAZI ## Elimina gli spazi dal testo +UPPER = MAIUSC ## Converte il testo in lettere maiuscole +VALUE = VALORE ## Converte un argomento di testo in numero diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/nl/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/nl/config new file mode 100644 index 000000000..d56b38fdb --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/nl/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #LEEG! +DIV0 = #DEEL/0! +VALUE = #WAARDE! +REF = #VERW! +NAME = #NAAM? +NUM = #GETAL! +NA = #N/B diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/nl/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/nl/functions new file mode 100644 index 000000000..6e941216d --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/nl/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Automatiseringsfuncties en functies in invoegtoepassingen +## +GETPIVOTDATA = DRAAITABEL.OPHALEN ## Geeft gegevens uit een draaitabelrapport als resultaat + + +## +## Cube functions Kubusfuncties +## +CUBEKPIMEMBER = KUBUSKPILID ## Retourneert de naam, eigenschap en waarde van een KPI (prestatie-indicator) en geeft de naam en de eigenschap in de cel weer. Een KPI is een meetbare waarde, zoals de maandelijkse brutowinst of de omzet per kwartaal per werknemer, die wordt gebruikt om de prestaties van een organisatie te bewaken +CUBEMEMBER = KUBUSLID ## Retourneert een lid of tupel in een kubushiërarchie. Wordt gebruikt om te controleren of het lid of de tupel in de kubus aanwezig is +CUBEMEMBERPROPERTY = KUBUSLIDEIGENSCHAP ## Retourneert de waarde van een lideigenschap in de kubus. Wordt gebruikt om te controleren of de lidnaam in de kubus bestaat en retourneert de opgegeven eigenschap voor dit lid +CUBERANKEDMEMBER = KUBUSGERANGCHIKTLID ## Retourneert het zoveelste, gerangschikte lid in een set. Wordt gebruikt om een of meer elementen in een set te retourneren, zoals de tien beste verkopers of de tien beste studenten +CUBESET = KUBUSSET ## Definieert een berekende set leden of tupels door een ingestelde expressie naar de kubus op de server te sturen, alwaar de set wordt gemaakt en vervolgens wordt geretourneerd naar Microsoft Office Excel +CUBESETCOUNT = KUBUSSETAANTAL ## Retourneert het aantal onderdelen in een set +CUBEVALUE = KUBUSWAARDE ## Retourneert een samengestelde waarde van een kubus + + +## +## Database functions Databasefuncties +## +DAVERAGE = DBGEMIDDELDE ## Berekent de gemiddelde waarde in geselecteerde databasegegevens +DCOUNT = DBAANTAL ## Telt de cellen met getallen in een database +DCOUNTA = DBAANTALC ## Telt de niet-lege cellen in een database +DGET = DBLEZEN ## Retourneert één record dat voldoet aan de opgegeven criteria uit een database +DMAX = DBMAX ## Retourneert de maximumwaarde in de geselecteerde databasegegevens +DMIN = DBMIN ## Retourneert de minimumwaarde in de geselecteerde databasegegevens +DPRODUCT = DBPRODUCT ## Vermenigvuldigt de waarden in een bepaald veld van de records die voldoen aan de criteria in een database +DSTDEV = DBSTDEV ## Maakt een schatting van de standaarddeviatie op basis van een steekproef uit geselecteerde databasegegevens +DSTDEVP = DBSTDEVP ## Berekent de standaarddeviatie op basis van de volledige populatie van geselecteerde databasegegevens +DSUM = DBSOM ## Telt de getallen uit een kolom records in de database op die voldoen aan de criteria +DVAR = DBVAR ## Maakt een schatting van de variantie op basis van een steekproef uit geselecteerde databasegegevens +DVARP = DBVARP ## Berekent de variantie op basis van de volledige populatie van geselecteerde databasegegevens + + +## +## Date and time functions Datum- en tijdfuncties +## +DATE = DATUM ## Geeft als resultaat het seriële getal van een opgegeven datum +DATEVALUE = DATUMWAARDE ## Converteert een datum in de vorm van tekst naar een serieel getal +DAY = DAG ## Converteert een serieel getal naar een dag van de maand +DAYS360 = DAGEN360 ## Berekent het aantal dagen tussen twee datums op basis van een jaar met 360 dagen +EDATE = ZELFDE.DAG ## Geeft als resultaat het seriële getal van een datum die het opgegeven aantal maanden voor of na de begindatum ligt +EOMONTH = LAATSTE.DAG ## Geeft als resultaat het seriële getal van de laatste dag van de maand voor of na het opgegeven aantal maanden +HOUR = UUR ## Converteert een serieel getal naar uren +MINUTE = MINUUT ## Converteert een serieel naar getal minuten +MONTH = MAAND ## Converteert een serieel getal naar een maand +NETWORKDAYS = NETTO.WERKDAGEN ## Geeft als resultaat het aantal hele werkdagen tussen twee datums +NOW = NU ## Geeft als resultaat het seriële getal van de huidige datum en tijd +SECOND = SECONDE ## Converteert een serieel getal naar seconden +TIME = TIJD ## Geeft als resultaat het seriële getal van een bepaald tijdstip +TIMEVALUE = TIJDWAARDE ## Converteert de tijd in de vorm van tekst naar een serieel getal +TODAY = VANDAAG ## Geeft als resultaat het seriële getal van de huidige datum +WEEKDAY = WEEKDAG ## Converteert een serieel getal naar een weekdag +WEEKNUM = WEEKNUMMER ## Converteert een serieel getal naar een weeknummer +WORKDAY = WERKDAG ## Geeft als resultaat het seriële getal van de datum voor of na een bepaald aantal werkdagen +YEAR = JAAR ## Converteert een serieel getal naar een jaar +YEARFRAC = JAAR.DEEL ## Geeft als resultaat het gedeelte van het jaar, uitgedrukt in het aantal hele dagen tussen begindatum en einddatum + + +## +## Engineering functions Technische functies +## +BESSELI = BESSEL.Y ## Geeft als resultaat de gewijzigde Bessel-functie In(x) +BESSELJ = BESSEL.J ## Geeft als resultaat de Bessel-functie Jn(x) +BESSELK = BESSEL.K ## Geeft als resultaat de gewijzigde Bessel-functie Kn(x) +BESSELY = BESSEL.Y ## Geeft als resultaat de gewijzigde Bessel-functie Yn(x) +BIN2DEC = BIN.N.DEC ## Converteert een binair getal naar een decimaal getal +BIN2HEX = BIN.N.HEX ## Converteert een binair getal naar een hexadecimaal getal +BIN2OCT = BIN.N.OCT ## Converteert een binair getal naar een octaal getal +COMPLEX = COMPLEX ## Converteert reële en imaginaire coëfficiënten naar een complex getal +CONVERT = CONVERTEREN ## Converteert een getal in de ene maateenheid naar een getal in een andere maateenheid +DEC2BIN = DEC.N.BIN ## Converteert een decimaal getal naar een binair getal +DEC2HEX = DEC.N.HEX ## Converteert een decimaal getal naar een hexadecimaal getal +DEC2OCT = DEC.N.OCT ## Converteert een decimaal getal naar een octaal getal +DELTA = DELTA ## Test of twee waarden gelijk zijn +ERF = FOUTFUNCTIE ## Geeft als resultaat de foutfunctie +ERFC = FOUT.COMPLEMENT ## Geeft als resultaat de complementaire foutfunctie +GESTEP = GROTER.DAN ## Test of een getal groter is dan de drempelwaarde +HEX2BIN = HEX.N.BIN ## Converteert een hexadecimaal getal naar een binair getal +HEX2DEC = HEX.N.DEC ## Converteert een hexadecimaal getal naar een decimaal getal +HEX2OCT = HEX.N.OCT ## Converteert een hexadecimaal getal naar een octaal getal +IMABS = C.ABS ## Geeft als resultaat de absolute waarde (modulus) van een complex getal +IMAGINARY = C.IM.DEEL ## Geeft als resultaat de imaginaire coëfficiënt van een complex getal +IMARGUMENT = C.ARGUMENT ## Geeft als resultaat het argument thèta, een hoek uitgedrukt in radialen +IMCONJUGATE = C.TOEGEVOEGD ## Geeft als resultaat het complexe toegevoegde getal van een complex getal +IMCOS = C.COS ## Geeft als resultaat de cosinus van een complex getal +IMDIV = C.QUOTIENT ## Geeft als resultaat het quotiënt van twee complexe getallen +IMEXP = C.EXP ## Geeft als resultaat de exponent van een complex getal +IMLN = C.LN ## Geeft als resultaat de natuurlijke logaritme van een complex getal +IMLOG10 = C.LOG10 ## Geeft als resultaat de logaritme met grondtal 10 van een complex getal +IMLOG2 = C.LOG2 ## Geeft als resultaat de logaritme met grondtal 2 van een complex getal +IMPOWER = C.MACHT ## Geeft als resultaat een complex getal dat is verheven tot de macht van een geheel getal +IMPRODUCT = C.PRODUCT ## Geeft als resultaat het product van complexe getallen +IMREAL = C.REEEL.DEEL ## Geeft als resultaat de reële coëfficiënt van een complex getal +IMSIN = C.SIN ## Geeft als resultaat de sinus van een complex getal +IMSQRT = C.WORTEL ## Geeft als resultaat de vierkantswortel van een complex getal +IMSUB = C.VERSCHIL ## Geeft als resultaat het verschil tussen twee complexe getallen +IMSUM = C.SOM ## Geeft als resultaat de som van complexe getallen +OCT2BIN = OCT.N.BIN ## Converteert een octaal getal naar een binair getal +OCT2DEC = OCT.N.DEC ## Converteert een octaal getal naar een decimaal getal +OCT2HEX = OCT.N.HEX ## Converteert een octaal getal naar een hexadecimaal getal + + +## +## Financial functions Financiële functies +## +ACCRINT = SAMENG.RENTE ## Berekent de opgelopen rente voor een waardepapier waarvan de rente periodiek wordt uitgekeerd +ACCRINTM = SAMENG.RENTE.V ## Berekent de opgelopen rente voor een waardepapier waarvan de rente op de vervaldatum wordt uitgekeerd +AMORDEGRC = AMORDEGRC ## Geeft als resultaat de afschrijving voor elke boekingsperiode door een afschrijvingscoëfficiënt toe te passen +AMORLINC = AMORLINC ## Berekent de afschrijving voor elke boekingsperiode +COUPDAYBS = COUP.DAGEN.BB ## Berekent het aantal dagen vanaf het begin van de coupontermijn tot de stortingsdatum +COUPDAYS = COUP.DAGEN ## Geeft als resultaat het aantal dagen in de coupontermijn waarin de stortingsdatum valt +COUPDAYSNC = COUP.DAGEN.VV ## Geeft als resultaat het aantal dagen vanaf de stortingsdatum tot de volgende couponvervaldatum +COUPNCD = COUP.DATUM.NB ## Geeft als resultaat de volgende coupondatum na de stortingsdatum +COUPNUM = COUP.AANTAL ## Geeft als resultaat het aantal coupons dat nog moet worden uitbetaald tussen de stortingsdatum en de vervaldatum +COUPPCD = COUP.DATUM.VB ## Geeft als resultaat de vorige couponvervaldatum vóór de stortingsdatum +CUMIPMT = CUM.RENTE ## Geeft als resultaat de cumulatieve rente die tussen twee termijnen is uitgekeerd +CUMPRINC = CUM.HOOFDSOM ## Geeft als resultaat de cumulatieve hoofdsom van een lening die tussen twee termijnen is terugbetaald +DB = DB ## Geeft als resultaat de afschrijving van activa voor een bepaalde periode met behulp van de 'fixed declining balance'-methode +DDB = DDB ## Geeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'double declining balance'-methode of een andere methode die u opgeeft +DISC = DISCONTO ## Geeft als resultaat het discontopercentage voor een waardepapier +DOLLARDE = EURO.DE ## Converteert een prijs in euro's, uitgedrukt in een breuk, naar een prijs in euro's, uitgedrukt in een decimaal getal +DOLLARFR = EURO.BR ## Converteert een prijs in euro's, uitgedrukt in een decimaal getal, naar een prijs in euro's, uitgedrukt in een breuk +DURATION = DUUR ## Geeft als resultaat de gewogen gemiddelde looptijd voor een waardepapier met periodieke rentebetalingen +EFFECT = EFFECT.RENTE ## Geeft als resultaat het effectieve jaarlijkse rentepercentage +FV = TW ## Geeft als resultaat de toekomstige waarde van een investering +FVSCHEDULE = TOEK.WAARDE2 ## Geeft als resultaat de toekomstige waarde van een bepaalde hoofdsom na het toepassen van een reeks samengestelde rentepercentages +INTRATE = RENTEPERCENTAGE ## Geeft als resultaat het rentepercentage voor een volgestort waardepapier +IPMT = IBET ## Geeft als resultaat de te betalen rente voor een investering over een bepaalde termijn +IRR = IR ## Geeft als resultaat de interne rentabiliteit voor een reeks cashflows +ISPMT = ISBET ## Geeft als resultaat de rente die is betaald tijdens een bepaalde termijn van een investering +MDURATION = AANG.DUUR ## Geeft als resultaat de aangepaste Macauley-looptijd voor een waardepapier, aangenomen dat de nominale waarde € 100 bedraagt +MIRR = GIR ## Geeft als resultaat de interne rentabiliteit voor een serie cashflows, waarbij voor betalingen een ander rentepercentage geldt dan voor inkomsten +NOMINAL = NOMINALE.RENTE ## Geeft als resultaat het nominale jaarlijkse rentepercentage +NPER = NPER ## Geeft als resultaat het aantal termijnen van een investering +NPV = NHW ## Geeft als resultaat de netto huidige waarde van een investering op basis van een reeks periodieke cashflows en een discontopercentage +ODDFPRICE = AFW.ET.PRIJS ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende eerste termijn +ODDFYIELD = AFW.ET.REND ## Geeft als resultaat het rendement voor een waardepapier met een afwijkende eerste termijn +ODDLPRICE = AFW.LT.PRIJS ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende laatste termijn +ODDLYIELD = AFW.LT.REND ## Geeft als resultaat het rendement voor een waardepapier met een afwijkende laatste termijn +PMT = BET ## Geeft als resultaat de periodieke betaling voor een annuïteit +PPMT = PBET ## Geeft als resultaat de afbetaling op de hoofdsom voor een bepaalde termijn +PRICE = PRIJS.NOM ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente periodiek wordt uitgekeerd +PRICEDISC = PRIJS.DISCONTO ## Geeft als resultaat de prijs per € 100 nominale waarde voor een verdisconteerd waardepapier +PRICEMAT = PRIJS.VERVALDAG ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum +PV = HW ## Geeft als resultaat de huidige waarde van een investering +RATE = RENTE ## Geeft als resultaat het periodieke rentepercentage voor een annuïteit +RECEIVED = OPBRENGST ## Geeft als resultaat het bedrag dat op de vervaldatum wordt uitgekeerd voor een volgestort waardepapier +SLN = LIN.AFSCHR ## Geeft als resultaat de lineaire afschrijving van activa over één termijn +SYD = SYD ## Geeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'Sum-Of-Years-Digits'-methode +TBILLEQ = SCHATK.OBL ## Geeft als resultaat het rendement op schatkistpapier, dat op dezelfde manier wordt berekend als het rendement op obligaties +TBILLPRICE = SCHATK.PRIJS ## Bepaalt de prijs per € 100 nominale waarde voor schatkistpapier +TBILLYIELD = SCHATK.REND ## Berekent het rendement voor schatkistpapier +VDB = VDB ## Geeft als resultaat de afschrijving van activa over een gehele of gedeeltelijke termijn met behulp van de 'declining balance'-methode +XIRR = IR.SCHEMA ## Berekent de interne rentabiliteit voor een betalingsschema van cashflows +XNPV = NHW2 ## Berekent de huidige nettowaarde voor een betalingsschema van cashflows +YIELD = RENDEMENT ## Geeft als resultaat het rendement voor een waardepapier waarvan de rente periodiek wordt uitgekeerd +YIELDDISC = REND.DISCONTO ## Geeft als resultaat het jaarlijkse rendement voor een verdisconteerd waardepapier, bijvoorbeeld schatkistpapier +YIELDMAT = REND.VERVAL ## Geeft als resultaat het jaarlijkse rendement voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum + + +## +## Information functions Informatiefuncties +## +CELL = CEL ## Geeft als resultaat informatie over de opmaak, locatie of inhoud van een cel +ERROR.TYPE = TYPE.FOUT ## Geeft als resultaat een getal dat overeenkomt met een van de foutwaarden van Microsoft Excel +INFO = INFO ## Geeft als resultaat informatie over de huidige besturingsomgeving +ISBLANK = ISLEEG ## Geeft als resultaat WAAR als de waarde leeg is +ISERR = ISFOUT2 ## Geeft als resultaat WAAR als de waarde een foutwaarde is, met uitzondering van #N/B +ISERROR = ISFOUT ## Geeft als resultaat WAAR als de waarde een foutwaarde is +ISEVEN = IS.EVEN ## Geeft als resultaat WAAR als het getal even is +ISLOGICAL = ISLOGISCH ## Geeft als resultaat WAAR als de waarde een logische waarde is +ISNA = ISNB ## Geeft als resultaat WAAR als de waarde de foutwaarde #N/B is +ISNONTEXT = ISGEENTEKST ## Geeft als resultaat WAAR als de waarde geen tekst is +ISNUMBER = ISGETAL ## Geeft als resultaat WAAR als de waarde een getal is +ISODD = IS.ONEVEN ## Geeft als resultaat WAAR als het getal oneven is +ISREF = ISVERWIJZING ## Geeft als resultaat WAAR als de waarde een verwijzing is +ISTEXT = ISTEKST ## Geeft als resultaat WAAR als de waarde tekst is +N = N ## Geeft als resultaat een waarde die is geconverteerd naar een getal +NA = NB ## Geeft als resultaat de foutwaarde #N/B +TYPE = TYPE ## Geeft als resultaat een getal dat het gegevenstype van een waarde aangeeft + + +## +## Logical functions Logische functies +## +AND = EN ## Geeft als resultaat WAAR als alle argumenten WAAR zijn +FALSE = ONWAAR ## Geeft als resultaat de logische waarde ONWAAR +IF = ALS ## Geeft een logische test aan +IFERROR = ALS.FOUT ## Retourneert een waarde die u opgeeft als een formule een fout oplevert, anders wordt het resultaat van de formule geretourneerd +NOT = NIET ## Keert de logische waarde van het argument om +OR = OF ## Geeft als resultaat WAAR als minimaal een van de argumenten WAAR is +TRUE = WAAR ## Geeft als resultaat de logische waarde WAAR + + +## +## Lookup and reference functions Zoek- en verwijzingsfuncties +## +ADDRESS = ADRES ## Geeft als resultaat een verwijzing, in de vorm van tekst, naar één bepaalde cel in een werkblad +AREAS = BEREIKEN ## Geeft als resultaat het aantal bereiken in een verwijzing +CHOOSE = KIEZEN ## Kiest een waarde uit een lijst met waarden +COLUMN = KOLOM ## Geeft als resultaat het kolomnummer van een verwijzing +COLUMNS = KOLOMMEN ## Geeft als resultaat het aantal kolommen in een verwijzing +HLOOKUP = HORIZ.ZOEKEN ## Zoekt in de bovenste rij van een matrix naar een bepaalde waarde en geeft als resultaat de gevonden waarde in de opgegeven cel +HYPERLINK = HYPERLINK ## Maakt een snelkoppeling of een sprong waarmee een document wordt geopend dat is opgeslagen op een netwerkserver, een intranet of op internet +INDEX = INDEX ## Kiest met een index een waarde uit een verwijzing of een matrix +INDIRECT = INDIRECT ## Geeft als resultaat een verwijzing die wordt aangegeven met een tekstwaarde +LOOKUP = ZOEKEN ## Zoekt naar bepaalde waarden in een vector of een matrix +MATCH = VERGELIJKEN ## Zoekt naar bepaalde waarden in een verwijzing of een matrix +OFFSET = VERSCHUIVING ## Geeft als resultaat een nieuwe verwijzing die is verschoven ten opzichte van een bepaalde verwijzing +ROW = RIJ ## Geeft als resultaat het rijnummer van een verwijzing +ROWS = RIJEN ## Geeft als resultaat het aantal rijen in een verwijzing +RTD = RTG ## Haalt realtimegegevens op uit een programma dat COM-automatisering (automatisering: een methode waarmee de ene toepassing objecten van een andere toepassing of ontwikkelprogramma kan besturen. Automatisering werd vroeger OLE-automatisering genoemd. Automatisering is een industrienorm die deel uitmaakt van het Component Object Model (COM).) ondersteunt +TRANSPOSE = TRANSPONEREN ## Geeft als resultaat de getransponeerde van een matrix +VLOOKUP = VERT.ZOEKEN ## Zoekt in de meest linkse kolom van een matrix naar een bepaalde waarde en geeft als resultaat de waarde in de opgegeven cel + + +## +## Math and trigonometry functions Wiskundige en trigonometrische functies +## +ABS = ABS ## Geeft als resultaat de absolute waarde van een getal +ACOS = BOOGCOS ## Geeft als resultaat de boogcosinus van een getal +ACOSH = BOOGCOSH ## Geeft als resultaat de inverse cosinus hyperbolicus van een getal +ASIN = BOOGSIN ## Geeft als resultaat de boogsinus van een getal +ASINH = BOOGSINH ## Geeft als resultaat de inverse sinus hyperbolicus van een getal +ATAN = BOOGTAN ## Geeft als resultaat de boogtangens van een getal +ATAN2 = BOOGTAN2 ## Geeft als resultaat de boogtangens van de x- en y-coördinaten +ATANH = BOOGTANH ## Geeft als resultaat de inverse tangens hyperbolicus van een getal +CEILING = AFRONDEN.BOVEN ## Rondt de absolute waarde van een getal naar boven af op het dichtstbijzijnde gehele getal of het dichtstbijzijnde significante veelvoud +COMBIN = COMBINATIES ## Geeft als resultaat het aantal combinaties voor een bepaald aantal objecten +COS = COS ## Geeft als resultaat de cosinus van een getal +COSH = COSH ## Geeft als resultaat de cosinus hyperbolicus van een getal +DEGREES = GRADEN ## Converteert radialen naar graden +EVEN = EVEN ## Rondt het getal af op het dichtstbijzijnde gehele even getal +EXP = EXP ## Verheft e tot de macht van een bepaald getal +FACT = FACULTEIT ## Geeft als resultaat de faculteit van een getal +FACTDOUBLE = DUBBELE.FACULTEIT ## Geeft als resultaat de dubbele faculteit van een getal +FLOOR = AFRONDEN.BENEDEN ## Rondt de absolute waarde van een getal naar beneden af +GCD = GGD ## Geeft als resultaat de grootste gemene deler +INT = INTEGER ## Rondt een getal naar beneden af op het dichtstbijzijnde gehele getal +LCM = KGV ## Geeft als resultaat het kleinste gemene veelvoud +LN = LN ## Geeft als resultaat de natuurlijke logaritme van een getal +LOG = LOG ## Geeft als resultaat de logaritme met het opgegeven grondtal van een getal +LOG10 = LOG10 ## Geeft als resultaat de logaritme met grondtal 10 van een getal +MDETERM = DETERMINANTMAT ## Geeft als resultaat de determinant van een matrix +MINVERSE = INVERSEMAT ## Geeft als resultaat de inverse van een matrix +MMULT = PRODUCTMAT ## Geeft als resultaat het product van twee matrices +MOD = REST ## Geeft als resultaat het restgetal van een deling +MROUND = AFRONDEN.N.VEELVOUD ## Geeft als resultaat een getal afgerond op het gewenste veelvoud +MULTINOMIAL = MULTINOMIAAL ## Geeft als resultaat de multinomiaalcoëfficiënt van een reeks getallen +ODD = ONEVEN ## Rondt de absolute waarde van het getal naar boven af op het dichtstbijzijnde gehele oneven getal +PI = PI ## Geeft als resultaat de waarde van pi +POWER = MACHT ## Verheft een getal tot een macht +PRODUCT = PRODUCT ## Vermenigvuldigt de argumenten met elkaar +QUOTIENT = QUOTIENT ## Geeft als resultaat de uitkomst van een deling als geheel getal +RADIANS = RADIALEN ## Converteert graden naar radialen +RAND = ASELECT ## Geeft als resultaat een willekeurig getal tussen 0 en 1 +RANDBETWEEN = ASELECTTUSSEN ## Geeft een willekeurig getal tussen de getallen die u hebt opgegeven +ROMAN = ROMEINS ## Converteert een Arabisch getal naar een Romeins getal en geeft het resultaat weer in de vorm van tekst +ROUND = AFRONDEN ## Rondt een getal af op het opgegeven aantal decimalen +ROUNDDOWN = AFRONDEN.NAAR.BENEDEN ## Rondt de absolute waarde van een getal naar beneden af +ROUNDUP = AFRONDEN.NAAR.BOVEN ## Rondt de absolute waarde van een getal naar boven af +SERIESSUM = SOM.MACHTREEKS ## Geeft als resultaat de som van een machtreeks die is gebaseerd op de formule +SIGN = POS.NEG ## Geeft als resultaat het teken van een getal +SIN = SIN ## Geeft als resultaat de sinus van de opgegeven hoek +SINH = SINH ## Geeft als resultaat de sinus hyperbolicus van een getal +SQRT = WORTEL ## Geeft als resultaat de positieve vierkantswortel van een getal +SQRTPI = WORTEL.PI ## Geeft als resultaat de vierkantswortel van (getal * pi) +SUBTOTAL = SUBTOTAAL ## Geeft als resultaat een subtotaal voor een bereik +SUM = SOM ## Telt de argumenten op +SUMIF = SOM.ALS ## Telt de getallen bij elkaar op die voldoen aan een bepaald criterium +SUMIFS = SOMMEN.ALS ## Telt de cellen in een bereik op die aan meerdere criteria voldoen +SUMPRODUCT = SOMPRODUCT ## Geeft als resultaat de som van de producten van de corresponderende matrixelementen +SUMSQ = KWADRATENSOM ## Geeft als resultaat de som van de kwadraten van de argumenten +SUMX2MY2 = SOM.X2MINY2 ## Geeft als resultaat de som van het verschil tussen de kwadraten van corresponderende waarden in twee matrices +SUMX2PY2 = SOM.X2PLUSY2 ## Geeft als resultaat de som van de kwadratensom van corresponderende waarden in twee matrices +SUMXMY2 = SOM.XMINY.2 ## Geeft als resultaat de som van de kwadraten van de verschillen tussen de corresponderende waarden in twee matrices +TAN = TAN ## Geeft als resultaat de tangens van een getal +TANH = TANH ## Geeft als resultaat de tangens hyperbolicus van een getal +TRUNC = GEHEEL ## Kapt een getal af tot een geheel getal + + +## +## Statistical functions Statistische functies +## +AVEDEV = GEM.DEVIATIE ## Geeft als resultaat het gemiddelde van de absolute deviaties van gegevenspunten ten opzichte van hun gemiddelde waarde +AVERAGE = GEMIDDELDE ## Geeft als resultaat het gemiddelde van de argumenten +AVERAGEA = GEMIDDELDEA ## Geeft als resultaat het gemiddelde van de argumenten, inclusief getallen, tekst en logische waarden +AVERAGEIF = GEMIDDELDE.ALS ## Geeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen in een bereik die voldoen aan de opgegeven criteria +AVERAGEIFS = GEMIDDELDEN.ALS ## Geeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen die aan meerdere criteria voldoen +BETADIST = BETA.VERD ## Geeft als resultaat de cumulatieve bèta-verdelingsfunctie +BETAINV = BETA.INV ## Geeft als resultaat de inverse van de cumulatieve verdelingsfunctie voor een gegeven bèta-verdeling +BINOMDIST = BINOMIALE.VERD ## Geeft als resultaat de binomiale verdeling +CHIDIST = CHI.KWADRAAT ## Geeft als resultaat de eenzijdige kans van de chi-kwadraatverdeling +CHIINV = CHI.KWADRAAT.INV ## Geeft als resultaat de inverse van een eenzijdige kans van de chi-kwadraatverdeling +CHITEST = CHI.TOETS ## Geeft als resultaat de onafhankelijkheidstoets +CONFIDENCE = BETROUWBAARHEID ## Geeft als resultaat het betrouwbaarheidsinterval van een gemiddelde waarde voor de elementen van een populatie +CORREL = CORRELATIE ## Geeft als resultaat de correlatiecoëfficiënt van twee gegevensverzamelingen +COUNT = AANTAL ## Telt het aantal getallen in de argumentenlijst +COUNTA = AANTALARG ## Telt het aantal waarden in de argumentenlijst +COUNTBLANK = AANTAL.LEGE.CELLEN ## Telt het aantal lege cellen in een bereik +COUNTIF = AANTAL.ALS ## Telt in een bereik het aantal cellen die voldoen aan een bepaald criterium +COUNTIFS = AANTALLEN.ALS ## Telt in een bereik het aantal cellen die voldoen aan meerdere criteria +COVAR = COVARIANTIE ## Geeft als resultaat de covariantie, het gemiddelde van de producten van de gepaarde deviaties +CRITBINOM = CRIT.BINOM ## Geeft als resultaat de kleinste waarde waarvoor de binomiale verdeling kleiner is dan of gelijk is aan het criterium +DEVSQ = DEV.KWAD ## Geeft als resultaat de som van de deviaties in het kwadraat +EXPONDIST = EXPON.VERD ## Geeft als resultaat de exponentiële verdeling +FDIST = F.VERDELING ## Geeft als resultaat de F-verdeling +FINV = F.INVERSE ## Geeft als resultaat de inverse van de F-verdeling +FISHER = FISHER ## Geeft als resultaat de Fisher-transformatie +FISHERINV = FISHER.INV ## Geeft als resultaat de inverse van de Fisher-transformatie +FORECAST = VOORSPELLEN ## Geeft als resultaat een waarde op basis van een lineaire trend +FREQUENCY = FREQUENTIE ## Geeft als resultaat een frequentieverdeling in de vorm van een verticale matrix +FTEST = F.TOETS ## Geeft als resultaat een F-toets +GAMMADIST = GAMMA.VERD ## Geeft als resultaat de gamma-verdeling +GAMMAINV = GAMMA.INV ## Geeft als resultaat de inverse van de cumulatieve gamma-verdeling +GAMMALN = GAMMA.LN ## Geeft als resultaat de natuurlijke logaritme van de gamma-functie, G(x) +GEOMEAN = MEETK.GEM ## Geeft als resultaat het meetkundige gemiddelde +GROWTH = GROEI ## Geeft als resultaat de waarden voor een exponentiële trend +HARMEAN = HARM.GEM ## Geeft als resultaat het harmonische gemiddelde +HYPGEOMDIST = HYPERGEO.VERD ## Geeft als resultaat de hypergeometrische verdeling +INTERCEPT = SNIJPUNT ## Geeft als resultaat het snijpunt van de lineaire regressielijn met de y-as +KURT = KURTOSIS ## Geeft als resultaat de kurtosis van een gegevensverzameling +LARGE = GROOTSTE ## Geeft als resultaat de op k-1 na grootste waarde in een gegevensverzameling +LINEST = LIJNSCH ## Geeft als resultaat de parameters van een lineaire trend +LOGEST = LOGSCH ## Geeft als resultaat de parameters van een exponentiële trend +LOGINV = LOG.NORM.INV ## Geeft als resultaat de inverse van de logaritmische normale verdeling +LOGNORMDIST = LOG.NORM.VERD ## Geeft als resultaat de cumulatieve logaritmische normale verdeling +MAX = MAX ## Geeft als resultaat de maximumwaarde in een lijst met argumenten +MAXA = MAXA ## Geeft als resultaat de maximumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden +MEDIAN = MEDIAAN ## Geeft als resultaat de mediaan van de opgegeven getallen +MIN = MIN ## Geeft als resultaat de minimumwaarde in een lijst met argumenten +MINA = MINA ## Geeft als resultaat de minimumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden +MODE = MODUS ## Geeft als resultaat de meest voorkomende waarde in een gegevensverzameling +NEGBINOMDIST = NEG.BINOM.VERD ## Geeft als resultaat de negatieve binomiaalverdeling +NORMDIST = NORM.VERD ## Geeft als resultaat de cumulatieve normale verdeling +NORMINV = NORM.INV ## Geeft als resultaat de inverse van de cumulatieve standaardnormale verdeling +NORMSDIST = STAND.NORM.VERD ## Geeft als resultaat de cumulatieve standaardnormale verdeling +NORMSINV = STAND.NORM.INV ## Geeft als resultaat de inverse van de cumulatieve normale verdeling +PEARSON = PEARSON ## Geeft als resultaat de correlatiecoëfficiënt van Pearson +PERCENTILE = PERCENTIEL ## Geeft als resultaat het k-de percentiel van waarden in een bereik +PERCENTRANK = PERCENT.RANG ## Geeft als resultaat de positie, in procenten uitgedrukt, van een waarde in de rangorde van een gegevensverzameling +PERMUT = PERMUTATIES ## Geeft als resultaat het aantal permutaties voor een gegeven aantal objecten +POISSON = POISSON ## Geeft als resultaat de Poisson-verdeling +PROB = KANS ## Geeft als resultaat de kans dat waarden zich tussen twee grenzen bevinden +QUARTILE = KWARTIEL ## Geeft als resultaat het kwartiel van een gegevensverzameling +RANK = RANG ## Geeft als resultaat het rangnummer van een getal in een lijst getallen +RSQ = R.KWADRAAT ## Geeft als resultaat het kwadraat van de Pearson-correlatiecoëfficiënt +SKEW = SCHEEFHEID ## Geeft als resultaat de mate van asymmetrie van een verdeling +SLOPE = RICHTING ## Geeft als resultaat de richtingscoëfficiënt van een lineaire regressielijn +SMALL = KLEINSTE ## Geeft als resultaat de op k-1 na kleinste waarde in een gegevensverzameling +STANDARDIZE = NORMALISEREN ## Geeft als resultaat een genormaliseerde waarde +STDEV = STDEV ## Maakt een schatting van de standaarddeviatie op basis van een steekproef +STDEVA = STDEVA ## Maakt een schatting van de standaarddeviatie op basis van een steekproef, inclusief getallen, tekst en logische waarden +STDEVP = STDEVP ## Berekent de standaarddeviatie op basis van de volledige populatie +STDEVPA = STDEVPA ## Berekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden +STEYX = STAND.FOUT.YX ## Geeft als resultaat de standaardfout in de voorspelde y-waarde voor elke x in een regressie +TDIST = T.VERD ## Geeft als resultaat de Student T-verdeling +TINV = T.INV ## Geeft als resultaat de inverse van de Student T-verdeling +TREND = TREND ## Geeft als resultaat de waarden voor een lineaire trend +TRIMMEAN = GETRIMD.GEM ## Geeft als resultaat het gemiddelde van waarden in een gegevensverzameling +TTEST = T.TOETS ## Geeft als resultaat de kans met behulp van de Student T-toets +VAR = VAR ## Maakt een schatting van de variantie op basis van een steekproef +VARA = VARA ## Maakt een schatting van de variantie op basis van een steekproef, inclusief getallen, tekst en logische waarden +VARP = VARP ## Berekent de variantie op basis van de volledige populatie +VARPA = VARPA ## Berekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden +WEIBULL = WEIBULL ## Geeft als resultaat de Weibull-verdeling +ZTEST = Z.TOETS ## Geeft als resultaat de eenzijdige kanswaarde van een Z-toets + + +## +## Text functions Tekstfuncties +## +ASC = ASC ## Wijzigt Nederlandse letters of katakanatekens over de volle breedte (dubbel-bytetekens) binnen een tekenreeks in tekens over de halve breedte (enkel-bytetekens) +BAHTTEXT = BAHT.TEKST ## Converteert een getal naar tekst met de valutanotatie ß (baht) +CHAR = TEKEN ## Geeft als resultaat het teken dat hoort bij de opgegeven code +CLEAN = WISSEN.CONTROL ## Verwijdert alle niet-afdrukbare tekens uit een tekst +CODE = CODE ## Geeft als resultaat de numerieke code voor het eerste teken in een tekenreeks +CONCATENATE = TEKST.SAMENVOEGEN ## Voegt verschillende tekstfragmenten samen tot één tekstfragment +DOLLAR = EURO ## Converteert een getal naar tekst met de valutanotatie € (euro) +EXACT = GELIJK ## Controleert of twee tekenreeksen identiek zijn +FIND = VIND.ALLES ## Zoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +FINDB = VIND.ALLES.B ## Zoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +FIXED = VAST ## Maakt een getal als tekst met een vast aantal decimalen op +JIS = JIS ## Wijzigt Nederlandse letters of katakanatekens over de halve breedte (enkel-bytetekens) binnen een tekenreeks in tekens over de volle breedte (dubbel-bytetekens) +LEFT = LINKS ## Geeft als resultaat de meest linkse tekens in een tekenreeks +LEFTB = LINKSB ## Geeft als resultaat de meest linkse tekens in een tekenreeks +LEN = LENGTE ## Geeft als resultaat het aantal tekens in een tekenreeks +LENB = LENGTEB ## Geeft als resultaat het aantal tekens in een tekenreeks +LOWER = KLEINE.LETTERS ## Zet tekst om in kleine letters +MID = MIDDEN ## Geeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft +MIDB = DEELB ## Geeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft +PHONETIC = FONETISCH ## Haalt de fonetische tekens (furigana) uit een tekenreeks op +PROPER = BEGINLETTERS ## Zet de eerste letter van elk woord in een tekst om in een hoofdletter +REPLACE = VERVANG ## Vervangt tekens binnen een tekst +REPLACEB = VERVANGENB ## Vervangt tekens binnen een tekst +REPT = HERHALING ## Herhaalt een tekst een aantal malen +RIGHT = RECHTS ## Geeft als resultaat de meest rechtse tekens in een tekenreeks +RIGHTB = RECHTSB ## Geeft als resultaat de meest rechtse tekens in een tekenreeks +SEARCH = VIND.SPEC ## Zoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +SEARCHB = VIND.SPEC.B ## Zoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +SUBSTITUTE = SUBSTITUEREN ## Vervangt oude tekst door nieuwe tekst in een tekenreeks +T = T ## Converteert de argumenten naar tekst +TEXT = TEKST ## Maakt een getal op en converteert het getal naar tekst +TRIM = SPATIES.WISSEN ## Verwijdert de spaties uit een tekst +UPPER = HOOFDLETTERS ## Zet tekst om in hoofdletters +VALUE = WAARDE ## Converteert tekst naar een getal diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/no/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/no/config new file mode 100644 index 000000000..482e4bc44 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/no/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = kr + + +## +## Excel Error Codes (For future use) +## +NULL = #NULL! +DIV0 = #DIV/0! +VALUE = #VERDI! +REF = #REF! +NAME = #NAVN? +NUM = #NUM! +NA = #I/T diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/no/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/no/functions new file mode 100644 index 000000000..eb5ae02dd --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/no/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funksjonene Tillegg og Automatisering +## +GETPIVOTDATA = HENTPIVOTDATA ## Returnerer data som er lagret i en pivottabellrapport + + +## +## Cube functions Kubefunksjoner +## +CUBEKPIMEMBER = KUBEKPIMEDLEM ## Returnerer navnet, egenskapen og mÃ¥let for en viktig ytelsesindikator (KPI), og viser navnet og egenskapen i cellen. En KPI er en mÃ¥lbar enhet, for eksempel mÃ¥nedlig bruttoinntjening eller kvartalsvis inntjening per ansatt, og brukes til Ã¥ overvÃ¥ke ytelsen i en organisasjon. +CUBEMEMBER = KUBEMEDLEM ## Returnerer et medlem eller en tuppel i et kubehierarki. Brukes til Ã¥ validere at medlemmet eller tuppelen finnes i kuben. +CUBEMEMBERPROPERTY = KUBEMEDLEMEGENSKAP ## Returnerer verdien til en medlemsegenskap i kuben. Brukes til Ã¥ validere at et medlemsnavn finnes i kuben, og til Ã¥ returnere den angitte egenskapen for dette medlemmet. +CUBERANKEDMEMBER = KUBERANGERTMEDLEM ## Returnerer det n-te, eller rangerte, medlemmet i et sett. Brukes til Ã¥ returnere ett eller flere elementer i et sett, for eksempel de 10 beste studentene. +CUBESET = KUBESETT ## Definerer et beregnet sett av medlemmer eller tuppeler ved Ã¥ sende et settuttrykk til kuben pÃ¥ serveren, noe som oppretter settet og deretter returnerer dette settet til Microsoft Office Excel. +CUBESETCOUNT = KUBESETTANTALL ## Returnerer antallet elementer i et sett. +CUBEVALUE = KUBEVERDI ## Returnerer en aggregert verdi fra en kube. + + +## +## Database functions Databasefunksjoner +## +DAVERAGE = DGJENNOMSNITT ## Returnerer gjennomsnittet av merkede databaseposter +DCOUNT = DANTALL ## Teller celler som inneholder tall i en database +DCOUNTA = DANTALLA ## Teller celler som ikke er tomme i en database +DGET = DHENT ## Trekker ut fra en database en post som oppfyller angitte vilkÃ¥r +DMAX = DMAKS ## Returnerer maksimumsverdien fra merkede databaseposter +DMIN = DMIN ## Returnerer minimumsverdien fra merkede databaseposter +DPRODUCT = DPRODUKT ## Multipliserer verdiene i et bestemt felt med poster som oppfyller vilkÃ¥rene i en database +DSTDEV = DSTDAV ## Estimerer standardavviket basert pÃ¥ et utvalg av merkede databaseposter +DSTDEVP = DSTAVP ## Beregner standardavviket basert pÃ¥ at merkede databaseposter utgjør hele populasjonen +DSUM = DSUMMER ## Legger til tallene i feltkolonnen med poster, i databasen som oppfyller vilkÃ¥rene +DVAR = DVARIANS ## Estimerer variansen basert pÃ¥ et utvalg av merkede databaseposter +DVARP = DVARIANSP ## Beregner variansen basert pÃ¥ at merkede databaseposter utgjør hele populasjonen + + +## +## Date and time functions Dato- og tidsfunksjoner +## +DATE = DATO ## Returnerer serienummeret som svarer til en bestemt dato +DATEVALUE = DATOVERDI ## Konverterer en dato med tekstformat til et serienummer +DAY = DAG ## Konverterer et serienummer til en dag i mÃ¥neden +DAYS360 = DAGER360 ## Beregner antall dager mellom to datoer basert pÃ¥ et Ã¥r med 360 dager +EDATE = DAG.ETTER ## Returnerer serienummeret som svarer til datoen som er det indikerte antall mÃ¥neder før eller etter startdatoen +EOMONTH = MÃ…NEDSSLUTT ## Returnerer serienummeret som svarer til siste dag i mÃ¥neden, før eller etter et angitt antall mÃ¥neder +HOUR = TIME ## Konverterer et serienummer til en time +MINUTE = MINUTT ## Konverterer et serienummer til et minutt +MONTH = MÃ…NED ## Konverterer et serienummer til en mÃ¥ned +NETWORKDAYS = NETT.ARBEIDSDAGER ## Returnerer antall hele arbeidsdager mellom to datoer +NOW = NÃ… ## Returnerer serienummeret som svarer til gjeldende dato og klokkeslett +SECOND = SEKUND ## Konverterer et serienummer til et sekund +TIME = TID ## Returnerer serienummeret som svarer til et bestemt klokkeslett +TIMEVALUE = TIDSVERDI ## Konverterer et klokkeslett i tekstformat til et serienummer +TODAY = IDAG ## Returnerer serienummeret som svarer til dagens dato +WEEKDAY = UKEDAG ## Konverterer et serienummer til en ukedag +WEEKNUM = UKENR ## Konverterer et serienummer til et tall som representerer hvilket nummer uken har i et Ã¥r +WORKDAY = ARBEIDSDAG ## Returnerer serienummeret som svarer til datoen før eller etter et angitt antall arbeidsdager +YEAR = Ã…R ## Konverterer et serienummer til et Ã¥r +YEARFRAC = Ã…RDEL ## Returnerer brøkdelen for Ã¥ret, som svarer til antall hele dager mellom startdato og sluttdato + + +## +## Engineering functions Tekniske funksjoner +## +BESSELI = BESSELI ## Returnerer den endrede Bessel-funksjonen In(x) +BESSELJ = BESSELJ ## Returnerer Bessel-funksjonen Jn(x) +BESSELK = BESSELK ## Returnerer den endrede Bessel-funksjonen Kn(x) +BESSELY = BESSELY ## Returnerer Bessel-funksjonen Yn(x) +BIN2DEC = BINTILDES ## Konverterer et binært tall til et desimaltall +BIN2HEX = BINTILHEKS ## Konverterer et binært tall til et heksadesimaltall +BIN2OCT = BINTILOKT ## Konverterer et binært tall til et oktaltall +COMPLEX = KOMPLEKS ## Konverterer reelle og imaginære koeffisienter til et komplekst tall +CONVERT = KONVERTER ## Konverterer et tall fra ett mÃ¥lsystem til et annet +DEC2BIN = DESTILBIN ## Konverterer et desimaltall til et binærtall +DEC2HEX = DESTILHEKS ## Konverterer et heltall i 10-tallsystemet til et heksadesimalt tall +DEC2OCT = DESTILOKT ## Konverterer et heltall i 10-tallsystemet til et oktaltall +DELTA = DELTA ## Undersøker om to verdier er like +ERF = FEILF ## Returnerer feilfunksjonen +ERFC = FEILFK ## Returnerer den komplementære feilfunksjonen +GESTEP = GRENSEVERDI ## Tester om et tall er større enn en terskelverdi +HEX2BIN = HEKSTILBIN ## Konverterer et heksadesimaltall til et binært tall +HEX2DEC = HEKSTILDES ## Konverterer et heksadesimalt tall til et heltall i 10-tallsystemet +HEX2OCT = HEKSTILOKT ## Konverterer et heksadesimalt tall til et oktaltall +IMABS = IMABS ## Returnerer absoluttverdien (koeffisienten) til et komplekst tall +IMAGINARY = IMAGINÆR ## Returnerer den imaginære koeffisienten til et komplekst tall +IMARGUMENT = IMARGUMENT ## Returnerer argumentet theta, som er en vinkel uttrykt i radianer +IMCONJUGATE = IMKONJUGERT ## Returnerer den komplekse konjugaten til et komplekst tall +IMCOS = IMCOS ## Returnerer cosinus til et komplekst tall +IMDIV = IMDIV ## Returnerer kvotienten til to komplekse tall +IMEXP = IMEKSP ## Returnerer eksponenten til et komplekst tall +IMLN = IMLN ## Returnerer den naturlige logaritmen for et komplekst tall +IMLOG10 = IMLOG10 ## Returnerer logaritmen med grunntall 10 for et komplekst tall +IMLOG2 = IMLOG2 ## Returnerer logaritmen med grunntall 2 for et komplekst tall +IMPOWER = IMOPPHØY ## Returnerer et komplekst tall opphøyd til en heltallspotens +IMPRODUCT = IMPRODUKT ## Returnerer produktet av komplekse tall +IMREAL = IMREELL ## Returnerer den reelle koeffisienten til et komplekst tall +IMSIN = IMSIN ## Returnerer sinus til et komplekst tall +IMSQRT = IMROT ## Returnerer kvadratroten av et komplekst tall +IMSUB = IMSUB ## Returnerer differansen mellom to komplekse tall +IMSUM = IMSUMMER ## Returnerer summen av komplekse tall +OCT2BIN = OKTTILBIN ## Konverterer et oktaltall til et binært tall +OCT2DEC = OKTTILDES ## Konverterer et oktaltall til et desimaltall +OCT2HEX = OKTTILHEKS ## Konverterer et oktaltall til et heksadesimaltall + + +## +## Financial functions Økonomiske funksjoner +## +ACCRINT = PÃ…LØPT.PERIODISK.RENTE ## Returnerer pÃ¥løpte renter for et verdipapir som betaler periodisk rente +ACCRINTM = PÃ…LØPT.FORFALLSRENTE ## Returnerer den pÃ¥løpte renten for et verdipapir som betaler rente ved forfall +AMORDEGRC = AMORDEGRC ## Returnerer avskrivningen for hver regnskapsperiode ved hjelp av en avskrivingskoeffisient +AMORLINC = AMORLINC ## Returnerer avskrivingen for hver regnskapsperiode +COUPDAYBS = OBLIG.DAGER.FF ## Returnerer antall dager fra begynnelsen av den rentebærende perioden til innløsningsdatoen +COUPDAYS = OBLIG.DAGER ## Returnerer antall dager i den rentebærende perioden som inneholder innløsningsdatoen +COUPDAYSNC = OBLIG.DAGER.NF ## Returnerer antall dager fra betalingsdato til neste renteinnbetalingsdato +COUPNCD = OBLIG.DAGER.EF ## Returnerer obligasjonsdatoen som kommer etter oppgjørsdatoen +COUPNUM = OBLIG.ANTALL ## Returnerer antall obligasjoner som skal betales mellom oppgjørsdatoen og forfallsdatoen +COUPPCD = OBLIG.DAG.FORRIGE ## Returnerer obligasjonsdatoen som kommer før oppgjørsdatoen +CUMIPMT = SAMLET.RENTE ## Returnerer den kumulative renten som er betalt mellom to perioder +CUMPRINC = SAMLET.HOVEDSTOL ## Returnerer den kumulative hovedstolen som er betalt for et lÃ¥n mellom to perioder +DB = DAVSKR ## Returnerer avskrivningen for et aktivum i en angitt periode, foretatt med fast degressiv avskrivning +DDB = DEGRAVS ## Returnerer avskrivningen for et aktivum for en gitt periode, ved hjelp av dobbel degressiv avskrivning eller en metode som du selv angir +DISC = DISKONTERT ## Returnerer diskonteringsraten for et verdipapir +DOLLARDE = DOLLARDE ## Konverterer en valutapris uttrykt som en brøk, til en valutapris uttrykt som et desimaltall +DOLLARFR = DOLLARBR ## Konverterer en valutapris uttrykt som et desimaltall, til en valutapris uttrykt som en brøk +DURATION = VARIGHET ## Returnerer Ã¥rlig varighet for et verdipapir med renter som betales periodisk +EFFECT = EFFEKTIV.RENTE ## Returnerer den effektive Ã¥rlige rentesatsen +FV = SLUTTVERDI ## Returnerer fremtidig verdi for en investering +FVSCHEDULE = SVPLAN ## Returnerer den fremtidige verdien av en inngÃ¥ende hovedstol etter Ã¥ ha anvendt en serie med sammensatte rentesatser +INTRATE = RENTESATS ## Returnerer rentefoten av et fullfinansiert verdipapir +IPMT = RAVDRAG ## Returnerer betalte renter pÃ¥ en investering for en gitt periode +IRR = IR ## Returnerer internrenten for en serie kontantstrømmer +ISPMT = ER.AVDRAG ## Beregner renten som er betalt for en investering i løpet av en bestemt periode +MDURATION = MVARIGHET ## Returnerer Macauleys modifiserte varighet for et verdipapir med en antatt pÃ¥lydende verdi pÃ¥ kr 100,00 +MIRR = MODIR ## Returnerer internrenten der positive og negative kontantstrømmer finansieres med forskjellige satser +NOMINAL = NOMINELL ## Returnerer Ã¥rlig nominell rentesats +NPER = PERIODER ## Returnerer antall perioder for en investering +NPV = NNV ## Returnerer netto nÃ¥verdi for en investering, basert pÃ¥ en serie periodiske kontantstrømmer og en rentesats +ODDFPRICE = AVVIKFP.PRIS ## Returnerer pris pÃ¥lydende kr 100 for et verdipapir med en odde første periode +ODDFYIELD = AVVIKFP.AVKASTNING ## Returnerer avkastingen for et verdipapir med en odde første periode +ODDLPRICE = AVVIKSP.PRIS ## Returnerer pris pÃ¥lydende kr 100 for et verdipapir med en odde siste periode +ODDLYIELD = AVVIKSP.AVKASTNING ## Returnerer avkastingen for et verdipapir med en odde siste periode +PMT = AVDRAG ## Returnerer periodisk betaling for en annuitet +PPMT = AMORT ## Returnerer betalingen pÃ¥ hovedstolen for en investering i en gitt periode +PRICE = PRIS ## Returnerer prisen per pÃ¥lydende kr 100 for et verdipapir som gir periodisk avkastning +PRICEDISC = PRIS.DISKONTERT ## Returnerer prisen per pÃ¥lydende kr 100 for et diskontert verdipapir +PRICEMAT = PRIS.FORFALL ## Returnerer prisen per pÃ¥lydende kr 100 av et verdipapir som betaler rente ved forfall +PV = NÃ…VERDI ## Returnerer nÃ¥verdien av en investering +RATE = RENTE ## Returnerer rentesatsen per periode for en annuitet +RECEIVED = MOTTATT.AVKAST ## Returnerer summen som mottas ved forfallsdato for et fullinvestert verdipapir +SLN = LINAVS ## Returnerer den lineære avskrivningen for et aktivum i én periode +SYD = Ã…RSAVS ## Returnerer Ã¥rsavskrivningen for et aktivum i en angitt periode +TBILLEQ = TBILLEKV ## Returnerer den obligasjonsekvivalente avkastningen for en statsobligasjon +TBILLPRICE = TBILLPRIS ## Returnerer prisen per pÃ¥lydende kr 100 for en statsobligasjon +TBILLYIELD = TBILLAVKASTNING ## Returnerer avkastningen til en statsobligasjon +VDB = VERDIAVS ## Returnerer avskrivningen for et aktivum i en angitt periode eller delperiode, ved hjelp av degressiv avskrivning +XIRR = XIR ## Returnerer internrenten for en serie kontantstrømmer som ikke nødvendigvis er periodiske +XNPV = XNNV ## Returnerer netto nÃ¥verdi for en serie kontantstrømmer som ikke nødvendigvis er periodiske +YIELD = AVKAST ## Returnerer avkastningen pÃ¥ et verdipapir som betaler periodisk rente +YIELDDISC = AVKAST.DISKONTERT ## Returnerer Ã¥rlig avkastning for et diskontert verdipapir, for eksempel en statskasseveksel +YIELDMAT = AVKAST.FORFALL ## Returnerer den Ã¥rlige avkastningen for et verdipapir som betaler rente ved forfallsdato + + +## +## Information functions Informasjonsfunksjoner +## +CELL = CELLE ## Returnerer informasjon om formatering, plassering eller innholdet til en celle +ERROR.TYPE = FEIL.TYPE ## Returnerer et tall som svarer til en feiltype +INFO = INFO ## Returnerer informasjon om gjeldende operativmiljø +ISBLANK = ERTOM ## Returnerer SANN hvis verdien er tom +ISERR = ERFEIL ## Returnerer SANN hvis verdien er en hvilken som helst annen feilverdi enn #I/T +ISERROR = ERFEIL ## Returnerer SANN hvis verdien er en hvilken som helst feilverdi +ISEVEN = ERPARTALL ## Returnerer SANN hvis tallet er et partall +ISLOGICAL = ERLOGISK ## Returnerer SANN hvis verdien er en logisk verdi +ISNA = ERIT ## Returnerer SANN hvis verdien er feilverdien #I/T +ISNONTEXT = ERIKKETEKST ## Returnerer SANN hvis verdien ikke er tekst +ISNUMBER = ERTALL ## Returnerer SANN hvis verdien er et tall +ISODD = ERODDETALL ## Returnerer SANN hvis tallet er et oddetall +ISREF = ERREF ## Returnerer SANN hvis verdien er en referanse +ISTEXT = ERTEKST ## Returnerer SANN hvis verdien er tekst +N = N ## Returnerer en verdi som er konvertert til et tall +NA = IT ## Returnerer feilverdien #I/T +TYPE = VERDITYPE ## Returnerer et tall som indikerer datatypen til en verdi + + +## +## Logical functions Logiske funksjoner +## +AND = OG ## Returnerer SANN hvis alle argumentene er lik SANN +FALSE = USANN ## Returnerer den logiske verdien USANN +IF = HVIS ## Angir en logisk test som skal utføres +IFERROR = HVISFEIL ## Returnerer en verdi du angir hvis en formel evaluerer til en feil. Ellers returnerer den resultatet av formelen. +NOT = IKKE ## Reverserer logikken til argumentet +OR = ELLER ## Returnerer SANN hvis ett eller flere argumenter er lik SANN +TRUE = SANN ## Returnerer den logiske verdien SANN + + +## +## Lookup and reference functions Oppslag- og referansefunksjoner +## +ADDRESS = ADRESSE ## Returnerer en referanse som tekst til en enkelt celle i et regneark +AREAS = OMRÃ…DER ## Returnerer antall omrÃ¥der i en referanse +CHOOSE = VELG ## Velger en verdi fra en liste med verdier +COLUMN = KOLONNE ## Returnerer kolonnenummeret for en referanse +COLUMNS = KOLONNER ## Returnerer antall kolonner i en referanse +HLOOKUP = FINN.KOLONNE ## Leter i den øverste raden i en matrise og returnerer verdien for den angitte cellen +HYPERLINK = HYPERKOBLING ## Oppretter en snarvei eller et hopp som Ã¥pner et dokument som er lagret pÃ¥ en nettverksserver, et intranett eller Internett +INDEX = INDEKS ## Bruker en indeks til Ã¥ velge en verdi fra en referanse eller matrise +INDIRECT = INDIREKTE ## Returnerer en referanse angitt av en tekstverdi +LOOKUP = SLÃ….OPP ## SlÃ¥r opp verdier i en vektor eller matrise +MATCH = SAMMENLIGNE ## SlÃ¥r opp verdier i en referanse eller matrise +OFFSET = FORSKYVNING ## Returnerer en referanseforskyvning fra en gitt referanse +ROW = RAD ## Returnerer radnummeret for en referanse +ROWS = RADER ## Returnerer antall rader i en referanse +RTD = RTD ## Henter sanntidsdata fra et program som støtter COM-automatisering (automatisering: En mÃ¥te Ã¥ arbeide pÃ¥ med programobjekter fra et annet program- eller utviklingsverktøy. Tidligere kalt OLE-automatisering. Automatisering er en bransjestandard og en funksjon i Component Object Model (COM).) +TRANSPOSE = TRANSPONER ## Returnerer transponeringen av en matrise +VLOOKUP = FINN.RAD ## Leter i den første kolonnen i en matrise og flytter bortover raden for Ã¥ returnere verdien til en celle + + +## +## Math and trigonometry functions Matematikk- og trigonometrifunksjoner +## +ABS = ABS ## Returnerer absoluttverdien til et tall +ACOS = ARCCOS ## Returnerer arcus cosinus til et tall +ACOSH = ARCCOSH ## Returnerer den inverse hyperbolske cosinus til et tall +ASIN = ARCSIN ## Returnerer arcus sinus til et tall +ASINH = ARCSINH ## Returnerer den inverse hyperbolske sinus til et tall +ATAN = ARCTAN ## Returnerer arcus tangens til et tall +ATAN2 = ARCTAN2 ## Returnerer arcus tangens fra x- og y-koordinater +ATANH = ARCTANH ## Returnerer den inverse hyperbolske tangens til et tall +CEILING = AVRUND.GJELDENDE.MULTIPLUM ## Runder av et tall til nærmeste heltall eller til nærmeste signifikante multiplum +COMBIN = KOMBINASJON ## Returnerer antall kombinasjoner for ett gitt antall objekter +COS = COS ## Returnerer cosinus til et tall +COSH = COSH ## Returnerer den hyperbolske cosinus til et tall +DEGREES = GRADER ## Konverterer radianer til grader +EVEN = AVRUND.TIL.PARTALL ## Runder av et tall oppover til nærmeste heltall som er et partall +EXP = EKSP ## Returnerer e opphøyd i en angitt potens +FACT = FAKULTET ## Returnerer fakultet til et tall +FACTDOUBLE = DOBBELFAKT ## Returnerer et talls doble fakultet +FLOOR = AVRUND.GJELDENDE.MULTIPLUM.NED ## Avrunder et tall nedover, mot null +GCD = SFF ## Returnerer høyeste felles divisor +INT = HELTALL ## Avrunder et tall nedover til nærmeste heltall +LCM = MFM ## Returnerer minste felles multiplum +LN = LN ## Returnerer den naturlige logaritmen til et tall +LOG = LOG ## Returnerer logaritmen for et tall til et angitt grunntall +LOG10 = LOG10 ## Returnerer logaritmen med grunntall 10 for et tall +MDETERM = MDETERM ## Returnerer matrisedeterminanten til en matrise +MINVERSE = MINVERS ## Returnerer den inverse matrisen til en matrise +MMULT = MMULT ## Returnerer matriseproduktet av to matriser +MOD = REST ## Returnerer resten fra en divisjon +MROUND = MRUND ## Returnerer et tall avrundet til det ønskede multiplum +MULTINOMIAL = MULTINOMINELL ## Returnerer det multinominelle for et sett med tall +ODD = AVRUND.TIL.ODDETALL ## Runder av et tall oppover til nærmeste heltall som er et oddetall +PI = PI ## Returnerer verdien av pi +POWER = OPPHØYD.I ## Returnerer resultatet av et tall opphøyd i en potens +PRODUCT = PRODUKT ## Multipliserer argumentene +QUOTIENT = KVOTIENT ## Returnerer heltallsdelen av en divisjon +RADIANS = RADIANER ## Konverterer grader til radianer +RAND = TILFELDIG ## Returnerer et tilfeldig tall mellom 0 og 1 +RANDBETWEEN = TILFELDIGMELLOM ## Returnerer et tilfeldig tall innenfor et angitt omrÃ¥de +ROMAN = ROMERTALL ## Konverterer vanlige tall til romertall, som tekst +ROUND = AVRUND ## Avrunder et tall til et angitt antall sifre +ROUNDDOWN = AVRUND.NED ## Avrunder et tall nedover, mot null +ROUNDUP = AVRUND.OPP ## Runder av et tall oppover, bort fra null +SERIESSUM = SUMMER.REKKE ## Returnerer summen av en geometrisk rekke, basert pÃ¥ formelen +SIGN = FORTEGN ## Returnerer fortegnet for et tall +SIN = SIN ## Returnerer sinus til en gitt vinkel +SINH = SINH ## Returnerer den hyperbolske sinus til et tall +SQRT = ROT ## Returnerer en positiv kvadratrot +SQRTPI = ROTPI ## Returnerer kvadratroten av (tall * pi) +SUBTOTAL = DELSUM ## Returnerer en delsum i en liste eller database +SUM = SUMMER ## Legger sammen argumentene +SUMIF = SUMMERHVIS ## Legger sammen cellene angitt ved et gitt vilkÃ¥r +SUMIFS = SUMMER.HVIS.SETT ## Legger sammen cellene i et omrÃ¥de som oppfyller flere vilkÃ¥r +SUMPRODUCT = SUMMERPRODUKT ## Returnerer summen av produktene av tilsvarende matrisekomponenter +SUMSQ = SUMMERKVADRAT ## Returnerer kvadratsummen av argumentene +SUMX2MY2 = SUMMERX2MY2 ## Returnerer summen av differansen av kvadratene for tilsvarende verdier i to matriser +SUMX2PY2 = SUMMERX2PY2 ## Returnerer summen av kvadratsummene for tilsvarende verdier i to matriser +SUMXMY2 = SUMMERXMY2 ## Returnerer summen av kvadratene av differansen for tilsvarende verdier i to matriser +TAN = TAN ## Returnerer tangens for et tall +TANH = TANH ## Returnerer den hyperbolske tangens for et tall +TRUNC = AVKORT ## Korter av et tall til et heltall + + +## +## Statistical functions Statistiske funksjoner +## +AVEDEV = GJENNOMSNITTSAVVIK ## Returnerer datapunktenes gjennomsnittlige absoluttavvik fra middelverdien +AVERAGE = GJENNOMSNITT ## Returnerer gjennomsnittet for argumentene +AVERAGEA = GJENNOMSNITTA ## Returnerer gjennomsnittet for argumentene, inkludert tall, tekst og logiske verdier +AVERAGEIF = GJENNOMSNITTHVIS ## Returnerer gjennomsnittet (aritmetisk gjennomsnitt) av alle cellene i et omrÃ¥de som oppfyller et bestemt vilkÃ¥r +AVERAGEIFS = GJENNOMSNITT.HVIS.SETT ## Returnerer gjennomsnittet (aritmetisk middelverdi) av alle celler som oppfyller flere vilkÃ¥r. +BETADIST = BETA.FORDELING ## Returnerer den kumulative betafordelingsfunksjonen +BETAINV = INVERS.BETA.FORDELING ## Returnerer den inverse verdien til fordelingsfunksjonen for en angitt betafordeling +BINOMDIST = BINOM.FORDELING ## Returnerer den individuelle binomiske sannsynlighetsfordelingen +CHIDIST = KJI.FORDELING ## Returnerer den ensidige sannsynligheten for en kjikvadrert fordeling +CHIINV = INVERS.KJI.FORDELING ## Returnerer den inverse av den ensidige sannsynligheten for den kjikvadrerte fordelingen +CHITEST = KJI.TEST ## Utfører testen for uavhengighet +CONFIDENCE = KONFIDENS ## Returnerer konfidensintervallet til gjennomsnittet for en populasjon +CORREL = KORRELASJON ## Returnerer korrelasjonskoeffisienten mellom to datasett +COUNT = ANTALL ## Teller hvor mange tall som er i argumentlisten +COUNTA = ANTALLA ## Teller hvor mange verdier som er i argumentlisten +COUNTBLANK = TELLBLANKE ## Teller antall tomme celler i et omrÃ¥de. +COUNTIF = ANTALL.HVIS ## Teller antall celler i et omrÃ¥de som oppfyller gitte vilkÃ¥r +COUNTIFS = ANTALL.HVIS.SETT ## Teller antallet ikke-tomme celler i et omrÃ¥de som oppfyller flere vilkÃ¥r +COVAR = KOVARIANS ## Returnerer kovariansen, gjennomsnittet av produktene av parvise avvik +CRITBINOM = GRENSE.BINOM ## Returnerer den minste verdien der den kumulative binomiske fordelingen er mindre enn eller lik en vilkÃ¥rsverdi +DEVSQ = AVVIK.KVADRERT ## Returnerer summen av kvadrerte avvik +EXPONDIST = EKSP.FORDELING ## Returnerer eksponentialfordelingen +FDIST = FFORDELING ## Returnerer F-sannsynlighetsfordelingen +FINV = FFORDELING.INVERS ## Returnerer den inverse av den sannsynlige F-fordelingen +FISHER = FISHER ## Returnerer Fisher-transformasjonen +FISHERINV = FISHERINV ## Returnerer den inverse av Fisher-transformasjonen +FORECAST = PROGNOSE ## Returnerer en verdi langs en lineær trend +FREQUENCY = FREKVENS ## Returnerer en frekvensdistribusjon som en loddrett matrise +FTEST = FTEST ## Returnerer resultatet av en F-test +GAMMADIST = GAMMAFORDELING ## Returnerer gammafordelingen +GAMMAINV = GAMMAINV ## Returnerer den inverse av den gammakumulative fordelingen +GAMMALN = GAMMALN ## Returnerer den naturlige logaritmen til gammafunksjonen G(x) +GEOMEAN = GJENNOMSNITT.GEOMETRISK ## Returnerer den geometriske middelverdien +GROWTH = VEKST ## Returnerer verdier langs en eksponentiell trend +HARMEAN = GJENNOMSNITT.HARMONISK ## Returnerer den harmoniske middelverdien +HYPGEOMDIST = HYPGEOM.FORDELING ## Returnerer den hypergeometriske fordelingen +INTERCEPT = SKJÆRINGSPUNKT ## Returnerer skjæringspunktet til den lineære regresjonslinjen +KURT = KURT ## Returnerer kurtosen til et datasett +LARGE = N.STØRST ## Returnerer den n-te største verdien i et datasett +LINEST = RETTLINJE ## Returnerer parameterne til en lineær trend +LOGEST = KURVE ## Returnerer parameterne til en eksponentiell trend +LOGINV = LOGINV ## Returnerer den inverse lognormale fordelingen +LOGNORMDIST = LOGNORMFORD ## Returnerer den kumulative lognormale fordelingen +MAX = STØRST ## Returnerer maksimumsverdien i en argumentliste +MAXA = MAKSA ## Returnerer maksimumsverdien i en argumentliste, inkludert tall, tekst og logiske verdier +MEDIAN = MEDIAN ## Returnerer medianen til tallene som er gitt +MIN = MIN ## Returnerer minimumsverdien i en argumentliste +MINA = MINA ## Returnerer den minste verdien i en argumentliste, inkludert tall, tekst og logiske verdier +MODE = MODUS ## Returnerer den vanligste verdien i et datasett +NEGBINOMDIST = NEGBINOM.FORDELING ## Returnerer den negative binomiske fordelingen +NORMDIST = NORMALFORDELING ## Returnerer den kumulative normalfordelingen +NORMINV = NORMINV ## Returnerer den inverse kumulative normalfordelingen +NORMSDIST = NORMSFORDELING ## Returnerer standard kumulativ normalfordeling +NORMSINV = NORMSINV ## Returnerer den inverse av den den kumulative standard normalfordelingen +PEARSON = PEARSON ## Returnerer produktmomentkorrelasjonskoeffisienten, Pearson +PERCENTILE = PERSENTIL ## Returnerer den n-te persentil av verdiene i et omrÃ¥de +PERCENTRANK = PROSENTDEL ## Returnerer prosentrangeringen av en verdi i et datasett +PERMUT = PERMUTER ## Returnerer antall permutasjoner for et gitt antall objekter +POISSON = POISSON ## Returnerer Poissons sannsynlighetsfordeling +PROB = SANNSYNLIG ## Returnerer sannsynligheten for at verdier i et omrÃ¥de ligger mellom to grenser +QUARTILE = KVARTIL ## Returnerer kvartilen til et datasett +RANK = RANG ## Returnerer rangeringen av et tall, eller plassen tallet har i en rekke +RSQ = RKVADRAT ## Returnerer kvadratet av produktmomentkorrelasjonskoeffisienten (Pearsons r) +SKEW = SKJEVFORDELING ## Returnerer skjevheten i en fordeling +SLOPE = STIGNINGSTALL ## Returnerer stigningtallet for den lineære regresjonslinjen +SMALL = N.MINST ## Returnerer den n-te minste verdien i et datasett +STANDARDIZE = NORMALISER ## Returnerer en normalisert verdi +STDEV = STDAV ## Estimere standardavvik pÃ¥ grunnlag av et utvalg +STDEVA = STDAVVIKA ## Estimerer standardavvik basert pÃ¥ et utvalg, inkludert tall, tekst og logiske verdier +STDEVP = STDAVP ## Beregner standardavvik basert pÃ¥ hele populasjonen +STDEVPA = STDAVVIKPA ## Beregner standardavvik basert pÃ¥ hele populasjonen, inkludert tall, tekst og logiske verdier +STEYX = STANDARDFEIL ## Returnerer standardfeilen for den predikerte y-verdien for hver x i regresjonen +TDIST = TFORDELING ## Returnerer en Student t-fordeling +TINV = TINV ## Returnerer den inverse Student t-fordelingen +TREND = TREND ## Returnerer verdier langs en lineær trend +TRIMMEAN = TRIMMET.GJENNOMSNITT ## Returnerer den interne middelverdien til et datasett +TTEST = TTEST ## Returnerer sannsynligheten assosiert med en Student t-test +VAR = VARIANS ## Estimerer varians basert pÃ¥ et utvalg +VARA = VARIANSA ## Estimerer varians basert pÃ¥ et utvalg, inkludert tall, tekst og logiske verdier +VARP = VARIANSP ## Beregner varians basert pÃ¥ hele populasjonen +VARPA = VARIANSPA ## Beregner varians basert pÃ¥ hele populasjonen, inkludert tall, tekst og logiske verdier +WEIBULL = WEIBULL.FORDELING ## Returnerer Weibull-fordelingen +ZTEST = ZTEST ## Returnerer den ensidige sannsynlighetsverdien for en z-test + + +## +## Text functions Tekstfunksjoner +## +ASC = STIGENDE ## Endrer fullbreddes (dobbeltbyte) engelske bokstaver eller katakana i en tegnstreng, til halvbreddes (enkeltbyte) tegn +BAHTTEXT = BAHTTEKST ## Konverterer et tall til tekst, og bruker valutaformatet ß (baht) +CHAR = TEGNKODE ## Returnerer tegnet som svarer til kodenummeret +CLEAN = RENSK ## Fjerner alle tegn som ikke kan skrives ut, fra teksten +CODE = KODE ## Returnerer en numerisk kode for det første tegnet i en tekststreng +CONCATENATE = KJEDE.SAMMEN ## SlÃ¥r sammen flere tekstelementer til ett tekstelement +DOLLAR = VALUTA ## Konverterer et tall til tekst, og bruker valutaformatet $ (dollar) +EXACT = EKSAKT ## Kontrollerer om to tekstverdier er like +FIND = FINN ## Finner en tekstverdi inne i en annen (skiller mellom store og smÃ¥ bokstaver) +FINDB = FINNB ## Finner en tekstverdi inne i en annen (skiller mellom store og smÃ¥ bokstaver) +FIXED = FASTSATT ## Formaterer et tall som tekst med et bestemt antall desimaler +JIS = JIS ## Endrer halvbreddes (enkeltbyte) engelske bokstaver eller katakana i en tegnstreng, til fullbreddes (dobbeltbyte) tegn +LEFT = VENSTRE ## Returnerer tegnene lengst til venstre i en tekstverdi +LEFTB = VENSTREB ## Returnerer tegnene lengst til venstre i en tekstverdi +LEN = LENGDE ## Returnerer antall tegn i en tekststreng +LENB = LENGDEB ## Returnerer antall tegn i en tekststreng +LOWER = SMÃ… ## Konverterer tekst til smÃ¥ bokstaver +MID = DELTEKST ## Returnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir +MIDB = DELTEKSTB ## Returnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir +PHONETIC = FURIGANA ## Trekker ut fonetiske tegn (furigana) fra en tekststreng +PROPER = STOR.FORBOKSTAV ## Gir den første bokstaven i hvert ord i en tekstverdi stor forbokstav +REPLACE = ERSTATT ## Erstatter tegn i en tekst +REPLACEB = ERSTATTB ## Erstatter tegn i en tekst +REPT = GJENTA ## Gjentar tekst et gitt antall ganger +RIGHT = HØYRE ## Returnerer tegnene lengst til høyre i en tekstverdi +RIGHTB = HØYREB ## Returnerer tegnene lengst til høyre i en tekstverdi +SEARCH = SØK ## Finner en tekstverdi inne i en annen (skiller ikke mellom store og smÃ¥ bokstaver) +SEARCHB = SØKB ## Finner en tekstverdi inne i en annen (skiller ikke mellom store og smÃ¥ bokstaver) +SUBSTITUTE = BYTT.UT ## Bytter ut gammel tekst med ny tekst i en tekststreng +T = T ## Konverterer argumentene til tekst +TEXT = TEKST ## Formaterer et tall og konverterer det til tekst +TRIM = TRIMME ## Fjerner mellomrom fra tekst +UPPER = STORE ## Konverterer tekst til store bokstaver +VALUE = VERDI ## Konverterer et tekstargument til et tall diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/pl/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pl/config new file mode 100644 index 000000000..6823761e0 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pl/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = zÅ‚ + + +## +## Excel Error Codes (For future use) +## +NULL = #ZERO! +DIV0 = #DZIEL/0! +VALUE = #ARG! +REF = #ADR! +NAME = #NAZWA? +NUM = #LICZBA! +NA = #N/D! diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/pl/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pl/functions new file mode 100644 index 000000000..148584337 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pl/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funkcje dodatków i automatyzacji +## +GETPIVOTDATA = WEŹDANETABELI ## Zwraca dane przechowywane w raporcie tabeli przestawnej. + + +## +## Cube functions Funkcje modułów +## +CUBEKPIMEMBER = ELEMENT.KPI.MODUÅU ## Zwraca nazwÄ™, wÅ‚aÅ›ciwość i miarÄ™ kluczowego wskaźnika wydajnoÅ›ci (KPI) oraz wyÅ›wietla nazwÄ™ i wÅ‚aÅ›ciwość w komórce. Wskaźnik KPI jest miarÄ… iloÅ›ciowÄ…, takÄ… jak miesiÄ™czny zysk brutto lub kwartalna fluktuacja pracowników, używanÄ… do monitorowania wydajnoÅ›ci organizacji. +CUBEMEMBER = ELEMENT.MODUÅU ## Zwraca element lub krotkÄ™ z hierarchii moduÅ‚u. SÅ‚uży do sprawdzania, czy element lub krotka istnieje w module. +CUBEMEMBERPROPERTY = WÅAÅšCIWOŚĆ.ELEMENTU.MODUÅU ## Zwraca wartość wÅ‚aÅ›ciwoÅ›ci elementu w module. SÅ‚uży do sprawdzania, czy nazwa elementu istnieje w module, i zwracania okreÅ›lonej wÅ‚aÅ›ciwoÅ›ci dla tego elementu. +CUBERANKEDMEMBER = USZEREGOWANY.ELEMENT.MODUÅU ## Zwraca n-ty (albo uszeregowany) element zestawu. SÅ‚uży do zwracania elementu lub elementów zestawu, na przykÅ‚ad najlepszego sprzedawcy lub 10 najlepszych studentów. +CUBESET = ZESTAW.MODUÅÓW ## Definiuje obliczony zestaw elementów lub krotek, wysyÅ‚ajÄ…c wyrażenie zestawu do serwera moduÅ‚u, który tworzy zestaw i zwraca go do programu Microsoft Office Excel. +CUBESETCOUNT = LICZNIK.MODUÅÓW.ZESTAWU ## Zwraca liczbÄ™ elementów zestawu. +CUBEVALUE = WARTOŚĆ.MODUÅU ## Zwraca zagregowanÄ… wartość z moduÅ‚u. + + +## +## Database functions Funkcje baz danych +## +DAVERAGE = BD.ÅšREDNIA ## Zwraca wartość Å›redniej wybranych wpisów bazy danych. +DCOUNT = BD.ILE.REKORDÓW ## Zlicza komórki zawierajÄ…ce liczby w bazie danych. +DCOUNTA = BD.ILE.REKORDÓW.A ## Zlicza niepuste komórki w bazie danych. +DGET = BD.POLE ## WyodrÄ™bnia z bazy danych jeden rekord speÅ‚niajÄ…cy okreÅ›lone kryteria. +DMAX = BD.MAX ## Zwraca wartość maksymalnÄ… z wybranych wpisów bazy danych. +DMIN = BD.MIN ## Zwraca wartość minimalnÄ… z wybranych wpisów bazy danych. +DPRODUCT = BD.ILOCZYN ## Mnoży wartoÅ›ci w konkretnym, speÅ‚niajÄ…cym kryteria polu rekordów bazy danych. +DSTDEV = BD.ODCH.STANDARD ## Szacuje odchylenie standardowe na podstawie próbki z wybranych wpisów bazy danych. +DSTDEVP = BD.ODCH.STANDARD.POPUL ## Oblicza odchylenie standardowe na podstawie caÅ‚ej populacji wybranych wpisów bazy danych. +DSUM = BD.SUMA ## Dodaje liczby w kolumnie pól rekordów bazy danych, które speÅ‚niajÄ… kryteria. +DVAR = BD.WARIANCJA ## Szacuje wariancjÄ™ na podstawie próbki z wybranych wpisów bazy danych. +DVARP = BD.WARIANCJA.POPUL ## Oblicza wariancjÄ™ na podstawie caÅ‚ej populacji wybranych wpisów bazy danych. + + +## +## Date and time functions Funkcje dat, godzin i czasu +## +DATE = DATA ## Zwraca liczbÄ™ seryjnÄ… dla wybranej daty. +DATEVALUE = DATA.WARTOŚĆ ## Konwertuje datÄ™ w formie tekstu na liczbÄ™ seryjnÄ…. +DAY = DZIEŃ ## Konwertuje liczbÄ™ seryjnÄ… na dzieÅ„ miesiÄ…ca. +DAYS360 = DNI.360 ## Oblicza liczbÄ™ dni miÄ™dzy dwiema datami na podstawie roku 360-dniowego. +EDATE = UPÅDNI ## Zwraca liczbÄ™ seryjnÄ… daty jako wskazanÄ… liczbÄ™ miesiÄ™cy przed okreÅ›lonÄ… datÄ… poczÄ…tkowÄ… lub po niej. +EOMONTH = EOMONTH ## Zwraca liczbÄ™ seryjnÄ… ostatniego dnia miesiÄ…ca przed okreÅ›lonÄ… liczbÄ… miesiÄ™cy lub po niej. +HOUR = GODZINA ## Konwertuje liczbÄ™ seryjnÄ… na godzinÄ™. +MINUTE = MINUTA ## Konwertuje liczbÄ™ seryjnÄ… na minutÄ™. +MONTH = MIESIÄ„C ## Konwertuje liczbÄ™ seryjnÄ… na miesiÄ…c. +NETWORKDAYS = NETWORKDAYS ## Zwraca liczbÄ™ peÅ‚nych dni roboczych miÄ™dzy dwiema datami. +NOW = TERAZ ## Zwraca liczbÄ™ seryjnÄ… bieżącej daty i godziny. +SECOND = SEKUNDA ## Konwertuje liczbÄ™ seryjnÄ… na sekundÄ™. +TIME = CZAS ## Zwraca liczbÄ™ seryjnÄ… okreÅ›lonego czasu. +TIMEVALUE = CZAS.WARTOŚĆ ## Konwertuje czas w formie tekstu na liczbÄ™ seryjnÄ…. +TODAY = DZIÅš ## Zwraca liczbÄ™ seryjnÄ… dla daty bieżącej. +WEEKDAY = DZIEŃ.TYG ## Konwertuje liczbÄ™ seryjnÄ… na dzieÅ„ tygodnia. +WEEKNUM = WEEKNUM ## Konwertuje liczbÄ™ seryjnÄ… na liczbÄ™ reprezentujÄ…cÄ… numer tygodnia w roku. +WORKDAY = WORKDAY ## Zwraca liczbÄ™ seryjnÄ… dla daty przed okreÅ›lonÄ… liczbÄ… dni roboczych lub po niej. +YEAR = ROK ## Konwertuje liczbÄ™ seryjnÄ… na rok. +YEARFRAC = YEARFRAC ## Zwraca część roku reprezentowanÄ… przez peÅ‚nÄ… liczbÄ™ dni miÄ™dzy datÄ… poczÄ…tkowÄ… a datÄ… koÅ„cowÄ…. + + +## +## Engineering functions Funkcje inżynierskie +## +BESSELI = BESSELI ## Zwraca wartość zmodyfikowanej funkcji Bessela In(x). +BESSELJ = BESSELJ ## Zwraca wartość funkcji Bessela Jn(x). +BESSELK = BESSELK ## Zwraca wartość zmodyfikowanej funkcji Bessela Kn(x). +BESSELY = BESSELY ## Zwraca wartość funkcji Bessela Yn(x). +BIN2DEC = BIN2DEC ## Konwertuje liczbÄ™ w postaci dwójkowej na liczbÄ™ w postaci dziesiÄ™tnej. +BIN2HEX = BIN2HEX ## Konwertuje liczbÄ™ w postaci dwójkowej na liczbÄ™ w postaci szesnastkowej. +BIN2OCT = BIN2OCT ## Konwertuje liczbÄ™ w postaci dwójkowej na liczbÄ™ w postaci ósemkowej. +COMPLEX = COMPLEX ## Konwertuje część rzeczywistÄ… i urojonÄ… na liczbÄ™ zespolonÄ…. +CONVERT = CONVERT ## Konwertuje liczbÄ™ z jednego systemu miar na inny. +DEC2BIN = DEC2BIN ## Konwertuje liczbÄ™ w postaci dziesiÄ™tnej na postać dwójkowÄ…. +DEC2HEX = DEC2HEX ## Konwertuje liczbÄ™ w postaci dziesiÄ™tnej na liczbÄ™ w postaci szesnastkowej. +DEC2OCT = DEC2OCT ## Konwertuje liczbÄ™ w postaci dziesiÄ™tnej na liczbÄ™ w postaci ósemkowej. +DELTA = DELTA ## Sprawdza, czy dwie wartoÅ›ci sÄ… równe. +ERF = ERF ## Zwraca wartość funkcji błędu. +ERFC = ERFC ## Zwraca wartość komplementarnej funkcji błędu. +GESTEP = GESTEP ## Sprawdza, czy liczba jest wiÄ™ksza niż wartość progowa. +HEX2BIN = HEX2BIN ## Konwertuje liczbÄ™ w postaci szesnastkowej na liczbÄ™ w postaci dwójkowej. +HEX2DEC = HEX2DEC ## Konwertuje liczbÄ™ w postaci szesnastkowej na liczbÄ™ w postaci dziesiÄ™tnej. +HEX2OCT = HEX2OCT ## Konwertuje liczbÄ™ w postaci szesnastkowej na liczbÄ™ w postaci ósemkowej. +IMABS = IMABS ## Zwraca wartość bezwzglÄ™dnÄ… (moduÅ‚) liczby zespolonej. +IMAGINARY = IMAGINARY ## Zwraca wartość części urojonej liczby zespolonej. +IMARGUMENT = IMARGUMENT ## Zwraca wartość argumentu liczby zespolonej, przy czym kÄ…t wyrażony jest w radianach. +IMCONJUGATE = IMCONJUGATE ## Zwraca wartość liczby sprzężonej danej liczby zespolonej. +IMCOS = IMCOS ## Zwraca wartość cosinusa liczby zespolonej. +IMDIV = IMDIV ## Zwraca wartość ilorazu dwóch liczb zespolonych. +IMEXP = IMEXP ## Zwraca postać wykÅ‚adniczÄ… liczby zespolonej. +IMLN = IMLN ## Zwraca wartość logarytmu naturalnego liczby zespolonej. +IMLOG10 = IMLOG10 ## Zwraca wartość logarytmu dziesiÄ™tnego liczby zespolonej. +IMLOG2 = IMLOG2 ## Zwraca wartość logarytmu liczby zespolonej przy podstawie 2. +IMPOWER = IMPOWER ## Zwraca wartość liczby zespolonej podniesionej do potÄ™gi caÅ‚kowitej. +IMPRODUCT = IMPRODUCT ## Zwraca wartość iloczynu liczb zespolonych. +IMREAL = IMREAL ## Zwraca wartość części rzeczywistej liczby zespolonej. +IMSIN = IMSIN ## Zwraca wartość sinusa liczby zespolonej. +IMSQRT = IMSQRT ## Zwraca wartość pierwiastka kwadratowego z liczby zespolonej. +IMSUB = IMSUB ## Zwraca wartość różnicy dwóch liczb zespolonych. +IMSUM = IMSUM ## Zwraca wartość sumy liczb zespolonych. +OCT2BIN = OCT2BIN ## Konwertuje liczbÄ™ w postaci ósemkowej na liczbÄ™ w postaci dwójkowej. +OCT2DEC = OCT2DEC ## Konwertuje liczbÄ™ w postaci ósemkowej na liczbÄ™ w postaci dziesiÄ™tnej. +OCT2HEX = OCT2HEX ## Konwertuje liczbÄ™ w postaci ósemkowej na liczbÄ™ w postaci szesnastkowej. + + +## +## Financial functions Funkcje finansowe +## +ACCRINT = ACCRINT ## Zwraca narosÅ‚e odsetki dla papieru wartoÅ›ciowego z oprocentowaniem okresowym. +ACCRINTM = ACCRINTM ## Zwraca narosÅ‚e odsetki dla papieru wartoÅ›ciowego z oprocentowaniem w terminie wykupu. +AMORDEGRC = AMORDEGRC ## Zwraca amortyzacjÄ™ dla każdego okresu rozliczeniowego z wykorzystaniem współczynnika amortyzacji. +AMORLINC = AMORLINC ## Zwraca amortyzacjÄ™ dla każdego okresu rozliczeniowego. +COUPDAYBS = COUPDAYBS ## Zwraca liczbÄ™ dni od poczÄ…tku okresu dywidendy do dnia rozliczeniowego. +COUPDAYS = COUPDAYS ## Zwraca liczbÄ™ dni w okresie dywidendy, z uwzglÄ™dnieniem dnia rozliczeniowego. +COUPDAYSNC = COUPDAYSNC ## Zwraca liczbÄ™ dni od dnia rozliczeniowego do daty nastÄ™pnego dnia dywidendy. +COUPNCD = COUPNCD ## Zwraca dzieÅ„ nastÄ™pnej dywidendy po dniu rozliczeniowym. +COUPNUM = COUPNUM ## Zwraca liczbÄ™ dywidend pÅ‚atnych miÄ™dzy dniem rozliczeniowym a dniem wykupu. +COUPPCD = COUPPCD ## Zwraca dzieÅ„ poprzedniej dywidendy przed dniem rozliczeniowym. +CUMIPMT = CUMIPMT ## Zwraca wartość procentu skÅ‚adanego pÅ‚atnego miÄ™dzy dwoma okresami. +CUMPRINC = CUMPRINC ## Zwraca wartość kapitaÅ‚u skumulowanego spÅ‚aty pożyczki miÄ™dzy dwoma okresami. +DB = DB ## Zwraca amortyzacjÄ™ Å›rodka trwaÅ‚ego w danym okresie metodÄ… degresywnÄ… z zastosowaniem staÅ‚ej bazowej. +DDB = DDB ## Zwraca amortyzacjÄ™ Å›rodka trwaÅ‚ego za podany okres metodÄ… degresywnÄ… z zastosowaniem podwójnej bazowej lub metodÄ… okreÅ›lonÄ… przez użytkownika. +DISC = DISC ## Zwraca wartość stopy dyskontowej papieru wartoÅ›ciowego. +DOLLARDE = DOLLARDE ## Konwertuje cenÄ™ w postaci uÅ‚amkowej na cenÄ™ wyrażonÄ… w postaci dziesiÄ™tnej. +DOLLARFR = DOLLARFR ## Konwertuje cenÄ™ wyrażonÄ… w postaci dziesiÄ™tnej na cenÄ™ wyrażonÄ… w postaci uÅ‚amkowej. +DURATION = DURATION ## Zwraca wartość rocznego przychodu z papieru wartoÅ›ciowego o okresowych wypÅ‚atach oprocentowania. +EFFECT = EFFECT ## Zwraca wartość efektywnej rocznej stopy procentowej. +FV = FV ## Zwraca przyszłą wartość lokaty. +FVSCHEDULE = FVSCHEDULE ## Zwraca przyszłą wartość kapitaÅ‚u poczÄ…tkowego wraz z szeregiem procentów skÅ‚adanych. +INTRATE = INTRATE ## Zwraca wartość stopy procentowej papieru wartoÅ›ciowego caÅ‚kowicie ulokowanego. +IPMT = IPMT ## Zwraca wysokość spÅ‚aty oprocentowania lokaty za dany okres. +IRR = IRR ## Zwraca wartość wewnÄ™trznej stopy zwrotu dla serii przepÅ‚ywów gotówkowych. +ISPMT = ISPMT ## Oblicza wysokość spÅ‚aty oprocentowania za dany okres lokaty. +MDURATION = MDURATION ## Zwraca wartość zmodyfikowanego okresu Macauleya dla papieru wartoÅ›ciowego o zaÅ‚ożonej wartoÅ›ci nominalnej 100 zÅ‚. +MIRR = MIRR ## Zwraca wartość wewnÄ™trznej stopy zwrotu dla przypadku, gdy dodatnie i ujemne przepÅ‚ywy gotówkowe majÄ… różne stopy. +NOMINAL = NOMINAL ## Zwraca wysokość nominalnej rocznej stopy procentowej. +NPER = NPER ## Zwraca liczbÄ™ okresów dla lokaty. +NPV = NPV ## Zwraca wartość bieżącÄ… netto lokaty na podstawie szeregu okresowych przepÅ‚ywów gotówkowych i stopy dyskontowej. +ODDFPRICE = ODDFPRICE ## Zwraca cenÄ™ za 100 zÅ‚ wartoÅ›ci nominalnej papieru wartoÅ›ciowego z nietypowym pierwszym okresem. +ODDFYIELD = ODDFYIELD ## Zwraca rentowność papieru wartoÅ›ciowego z nietypowym pierwszym okresem. +ODDLPRICE = ODDLPRICE ## Zwraca cenÄ™ za 100 zÅ‚ wartoÅ›ci nominalnej papieru wartoÅ›ciowego z nietypowym ostatnim okresem. +ODDLYIELD = ODDLYIELD ## Zwraca rentowność papieru wartoÅ›ciowego z nietypowym ostatnim okresem. +PMT = PMT ## Zwraca wartość okresowej pÅ‚atnoÅ›ci raty rocznej. +PPMT = PPMT ## Zwraca wysokość spÅ‚aty kapitaÅ‚u w przypadku lokaty dla danego okresu. +PRICE = PRICE ## Zwraca cenÄ™ za 100 zÅ‚ wartoÅ›ci nominalnej papieru wartoÅ›ciowego z oprocentowaniem okresowym. +PRICEDISC = PRICEDISC ## Zwraca cenÄ™ za 100 zÅ‚ wartoÅ›ci nominalnej papieru wartoÅ›ciowego zdyskontowanego. +PRICEMAT = PRICEMAT ## Zwraca cenÄ™ za 100 zÅ‚ wartoÅ›ci nominalnej papieru wartoÅ›ciowego z oprocentowaniem w terminie wykupu. +PV = PV ## Zwraca wartość bieżącÄ… lokaty. +RATE = RATE ## Zwraca wysokość stopy procentowej w okresie raty rocznej. +RECEIVED = RECEIVED ## Zwraca wartość kapitaÅ‚u otrzymanego przy wykupie papieru wartoÅ›ciowego caÅ‚kowicie ulokowanego. +SLN = SLN ## Zwraca amortyzacjÄ™ Å›rodka trwaÅ‚ego za jeden okres metodÄ… liniowÄ…. +SYD = SYD ## Zwraca amortyzacjÄ™ Å›rodka trwaÅ‚ego za dany okres metodÄ… sumy cyfr lat amortyzacji. +TBILLEQ = TBILLEQ ## Zwraca rentowność ekwiwalentu obligacji dla bonu skarbowego. +TBILLPRICE = TBILLPRICE ## Zwraca cenÄ™ za 100 zÅ‚ wartoÅ›ci nominalnej bonu skarbowego. +TBILLYIELD = TBILLYIELD ## Zwraca rentowność bonu skarbowego. +VDB = VDB ## Oblicza amortyzacjÄ™ Å›rodka trwaÅ‚ego w danym okresie lub jego części metodÄ… degresywnÄ…. +XIRR = XIRR ## Zwraca wartość wewnÄ™trznej stopy zwrotu dla serii rozÅ‚ożonych w czasie przepÅ‚ywów gotówkowych, niekoniecznie okresowych. +XNPV = XNPV ## Zwraca wartość bieżącÄ… netto dla serii rozÅ‚ożonych w czasie przepÅ‚ywów gotówkowych, niekoniecznie okresowych. +YIELD = YIELD ## Zwraca rentowność papieru wartoÅ›ciowego z oprocentowaniem okresowym. +YIELDDISC = YIELDDISC ## Zwraca rocznÄ… rentowność zdyskontowanego papieru wartoÅ›ciowego, na przykÅ‚ad bonu skarbowego. +YIELDMAT = YIELDMAT ## Zwraca rocznÄ… rentowność papieru wartoÅ›ciowego oprocentowanego przy wykupie. + + +## +## Information functions Funkcje informacyjne +## +CELL = KOMÓRKA ## Zwraca informacje o formacie, poÅ‚ożeniu lub zawartoÅ›ci komórki. +ERROR.TYPE = NR.BÅĘDU ## Zwraca liczbÄ™ odpowiadajÄ…cÄ… typowi błędu. +INFO = INFO ## Zwraca informacjÄ™ o aktualnym Å›rodowisku pracy. +ISBLANK = CZY.PUSTA ## Zwraca wartość PRAWDA, jeÅ›li wartość jest pusta. +ISERR = CZY.BÅ ## Zwraca wartość PRAWDA, jeÅ›li wartość jest dowolnÄ… wartoÅ›ciÄ… błędu, z wyjÄ…tkiem #N/D!. +ISERROR = CZY.BÅÄ„D ## Zwraca wartość PRAWDA, jeÅ›li wartość jest dowolnÄ… wartoÅ›ciÄ… błędu. +ISEVEN = ISEVEN ## Zwraca wartość PRAWDA, jeÅ›li liczba jest parzysta. +ISLOGICAL = CZY.LOGICZNA ## Zwraca wartość PRAWDA, jeÅ›li wartość jest wartoÅ›ciÄ… logicznÄ…. +ISNA = CZY.BRAK ## Zwraca wartość PRAWDA, jeÅ›li wartość jest wartoÅ›ciÄ… błędu #N/D!. +ISNONTEXT = CZY.NIE.TEKST ## Zwraca wartość PRAWDA, jeÅ›li wartość nie jest tekstem. +ISNUMBER = CZY.LICZBA ## Zwraca wartość PRAWDA, jeÅ›li wartość jest liczbÄ…. +ISODD = ISODD ## Zwraca wartość PRAWDA, jeÅ›li liczba jest nieparzysta. +ISREF = CZY.ADR ## Zwraca wartość PRAWDA, jeÅ›li wartość jest odwoÅ‚aniem. +ISTEXT = CZY.TEKST ## Zwraca wartość PRAWDA, jeÅ›li wartość jest tekstem. +N = L ## Zwraca wartość przekonwertowanÄ… na postać liczbowÄ…. +NA = BRAK ## Zwraca wartość błędu #N/D!. +TYPE = TYP ## Zwraca liczbÄ™ wskazujÄ…cÄ… typ danych wartoÅ›ci. + + +## +## Logical functions Funkcje logiczne +## +AND = ORAZ ## Zwraca wartość PRAWDA, jeÅ›li wszystkie argumenty majÄ… wartość PRAWDA. +FALSE = FAÅSZ ## Zwraca wartość logicznÄ… FAÅSZ. +IF = JEÅ»ELI ## OkreÅ›la warunek logiczny do sprawdzenia. +IFERROR = JEÅ»ELI.BÅÄ„D ## Zwraca okreÅ›lonÄ… wartość, jeÅ›li wynikiem obliczenia formuÅ‚y jest błąd; w przeciwnym przypadku zwraca wynik formuÅ‚y. +NOT = NIE ## Odwraca wartość logicznÄ… argumentu. +OR = LUB ## Zwraca wartość PRAWDA, jeÅ›li co najmniej jeden z argumentów ma wartość PRAWDA. +TRUE = PRAWDA ## Zwraca wartość logicznÄ… PRAWDA. + + +## +## Lookup and reference functions Funkcje wyszukiwania i odwoÅ‚aÅ„ +## +ADDRESS = ADRES ## Zwraca odwoÅ‚anie do jednej komórki w arkuszu jako wartość tekstowÄ…. +AREAS = OBSZARY ## Zwraca liczbÄ™ obszarów wystÄ™pujÄ…cych w odwoÅ‚aniu. +CHOOSE = WYBIERZ ## Wybiera wartość z listy wartoÅ›ci. +COLUMN = NR.KOLUMNY ## Zwraca numer kolumny z odwoÅ‚ania. +COLUMNS = LICZBA.KOLUMN ## Zwraca liczbÄ™ kolumn dla danego odwoÅ‚ania. +HLOOKUP = WYSZUKAJ.POZIOMO ## PrzeglÄ…da górny wiersz tablicy i zwraca wartość wskazanej komórki. +HYPERLINK = HIPERÅÄ„CZE ## Tworzy skrót lub skok, który pozwala otwierać dokument przechowywany na serwerze sieciowym, w sieci intranet lub w Internecie. +INDEX = INDEKS ## Używa indeksu do wybierania wartoÅ›ci z odwoÅ‚ania lub tablicy. +INDIRECT = ADR.POÅšR ## Zwraca odwoÅ‚anie okreÅ›lone przez wartość tekstowÄ…. +LOOKUP = WYSZUKAJ ## Wyszukuje wartoÅ›ci w wektorze lub tablicy. +MATCH = PODAJ.POZYCJĘ ## Wyszukuje wartoÅ›ci w odwoÅ‚aniu lub w tablicy. +OFFSET = PRZESUNIĘCIE ## Zwraca adres przesuniÄ™ty od danego odwoÅ‚ania. +ROW = WIERSZ ## Zwraca numer wiersza odwoÅ‚ania. +ROWS = ILE.WIERSZY ## Zwraca liczbÄ™ wierszy dla danego odwoÅ‚ania. +RTD = RTD ## Pobiera dane w czasie rzeczywistym z programu obsÅ‚ugujÄ…cego automatyzacjÄ™ COM (Automatyzacja: Sposób pracy z obiektami aplikacji pochodzÄ…cymi z innej aplikacji lub narzÄ™dzia projektowania. Nazywana wczeÅ›niej AutomatyzacjÄ… OLE, Automatyzacja jest standardem przemysÅ‚owym i funkcjÄ… obiektowego modelu skÅ‚adników (COM, Component Object Model).). +TRANSPOSE = TRANSPONUJ ## Zwraca transponowanÄ… tablicÄ™. +VLOOKUP = WYSZUKAJ.PIONOWO ## Przeszukuje pierwszÄ… kolumnÄ™ tablicy i przechodzi wzdÅ‚uż wiersza, aby zwrócić wartość komórki. + + +## +## Math and trigonometry functions Funkcje matematyczne i trygonometryczne +## +ABS = MODUÅ.LICZBY ## Zwraca wartość absolutnÄ… liczby. +ACOS = ACOS ## Zwraca arcus cosinus liczby. +ACOSH = ACOSH ## Zwraca arcus cosinus hiperboliczny liczby. +ASIN = ASIN ## Zwraca arcus sinus liczby. +ASINH = ASINH ## Zwraca arcus sinus hiperboliczny liczby. +ATAN = ATAN ## Zwraca arcus tangens liczby. +ATAN2 = ATAN2 ## Zwraca arcus tangens liczby na podstawie współrzÄ™dnych x i y. +ATANH = ATANH ## Zwraca arcus tangens hiperboliczny liczby. +CEILING = ZAOKR.W.GÓRĘ ## ZaokrÄ…gla liczbÄ™ do najbliższej liczby caÅ‚kowitej lub do najbliższej wielokrotnoÅ›ci dokÅ‚adnoÅ›ci. +COMBIN = KOMBINACJE ## Zwraca liczbÄ™ kombinacji dla danej liczby obiektów. +COS = COS ## Zwraca cosinus liczby. +COSH = COSH ## Zwraca cosinus hiperboliczny liczby. +DEGREES = STOPNIE ## Konwertuje radiany na stopnie. +EVEN = ZAOKR.DO.PARZ ## ZaokrÄ…gla liczbÄ™ w górÄ™ do najbliższej liczby parzystej. +EXP = EXP ## Zwraca wartość liczby e podniesionej do potÄ™gi okreÅ›lonej przez podanÄ… liczbÄ™. +FACT = SILNIA ## Zwraca silniÄ™ liczby. +FACTDOUBLE = FACTDOUBLE ## Zwraca podwójnÄ… silniÄ™ liczby. +FLOOR = ZAOKR.W.DÓŠ## ZaokrÄ…gla liczbÄ™ w dół, w kierunku zera. +GCD = GCD ## Zwraca najwiÄ™kszy wspólny dzielnik. +INT = ZAOKR.DO.CAÅK ## ZaokrÄ…gla liczbÄ™ w dół do najbliższej liczby caÅ‚kowitej. +LCM = LCM ## Zwraca najmniejszÄ… wspólnÄ… wielokrotność. +LN = LN ## Zwraca logarytm naturalny podanej liczby. +LOG = LOG ## Zwraca logarytm danej liczby przy zadanej podstawie. +LOG10 = LOG10 ## Zwraca logarytm dziesiÄ™tny liczby. +MDETERM = WYZNACZNIK.MACIERZY ## Zwraca wyznacznik macierzy tablicy. +MINVERSE = MACIERZ.ODW ## Zwraca odwrotność macierzy tablicy. +MMULT = MACIERZ.ILOCZYN ## Zwraca iloczyn macierzy dwóch tablic. +MOD = MOD ## Zwraca resztÄ™ z dzielenia. +MROUND = MROUND ## Zwraca liczbÄ™ zaokrÄ…glonÄ… do żądanej wielokrotnoÅ›ci. +MULTINOMIAL = MULTINOMIAL ## Zwraca wielomian dla zbioru liczb. +ODD = ZAOKR.DO.NPARZ ## ZaokrÄ…gla liczbÄ™ w górÄ™ do najbliższej liczby nieparzystej. +PI = PI ## Zwraca wartość liczby Pi. +POWER = POTĘGA ## Zwraca liczbÄ™ podniesionÄ… do potÄ™gi. +PRODUCT = ILOCZYN ## Mnoży argumenty. +QUOTIENT = QUOTIENT ## Zwraca iloraz (caÅ‚kowity). +RADIANS = RADIANY ## Konwertuje stopnie na radiany. +RAND = LOS ## Zwraca liczbÄ™ pseudolosowÄ… z zakresu od 0 do 1. +RANDBETWEEN = RANDBETWEEN ## Zwraca liczbÄ™ pseudolosowÄ… z zakresu okreÅ›lonego przez podane argumenty. +ROMAN = RZYMSKIE ## Konwertuje liczbÄ™ arabskÄ… na rzymskÄ… jako tekst. +ROUND = ZAOKR ## ZaokrÄ…gla liczbÄ™ do okreÅ›lonej liczby cyfr. +ROUNDDOWN = ZAOKR.DÓŠ## ZaokrÄ…gla liczbÄ™ w dół, w kierunku zera. +ROUNDUP = ZAOKR.GÓRA ## ZaokrÄ…gla liczbÄ™ w górÄ™, w kierunku od zera. +SERIESSUM = SERIESSUM ## Zwraca sumÄ™ szeregu potÄ™gowego na podstawie wzoru. +SIGN = ZNAK.LICZBY ## Zwraca znak liczby. +SIN = SIN ## Zwraca sinus danego kÄ…ta. +SINH = SINH ## Zwraca sinus hiperboliczny liczby. +SQRT = PIERWIASTEK ## Zwraca dodatni pierwiastek kwadratowy. +SQRTPI = SQRTPI ## Zwraca pierwiastek kwadratowy iloczynu (liczba * Pi). +SUBTOTAL = SUMY.POÅšREDNIE ## Zwraca sumÄ™ częściowÄ… listy lub bazy danych. +SUM = SUMA ## Dodaje argumenty. +SUMIF = SUMA.JEÅ»ELI ## Dodaje komórki okreÅ›lone przez podane kryterium. +SUMIFS = SUMA.WARUNKÓW ## Dodaje komórki w zakresie, które speÅ‚niajÄ… wiele kryteriów. +SUMPRODUCT = SUMA.ILOCZYNÓW ## Zwraca sumÄ™ iloczynów odpowiednich elementów tablicy. +SUMSQ = SUMA.KWADRATÓW ## Zwraca sumÄ™ kwadratów argumentów. +SUMX2MY2 = SUMA.X2.M.Y2 ## Zwraca sumÄ™ różnic kwadratów odpowiednich wartoÅ›ci w dwóch tablicach. +SUMX2PY2 = SUMA.X2.P.Y2 ## Zwraca sumÄ™ sum kwadratów odpowiednich wartoÅ›ci w dwóch tablicach. +SUMXMY2 = SUMA.XMY.2 ## Zwraca sumÄ™ kwadratów różnic odpowiednich wartoÅ›ci w dwóch tablicach. +TAN = TAN ## Zwraca tangens liczby. +TANH = TANH ## Zwraca tangens hiperboliczny liczby. +TRUNC = LICZBA.CAÅK ## Przycina liczbÄ™ do wartoÅ›ci caÅ‚kowitej. + + +## +## Statistical functions Funkcje statystyczne +## +AVEDEV = ODCH.ÅšREDNIE ## Zwraca Å›redniÄ… wartość odchyleÅ„ absolutnych punktów danych od ich wartoÅ›ci Å›redniej. +AVERAGE = ÅšREDNIA ## Zwraca wartość Å›redniÄ… argumentów. +AVERAGEA = ÅšREDNIA.A ## Zwraca wartość Å›redniÄ… argumentów, z uwzglÄ™dnieniem liczb, tekstów i wartoÅ›ci logicznych. +AVERAGEIF = ÅšREDNIA.JEÅ»ELI ## Zwraca Å›redniÄ… (Å›redniÄ… arytmetycznÄ…) wszystkich komórek w zakresie, które speÅ‚niajÄ… podane kryteria. +AVERAGEIFS = ÅšREDNIA.WARUNKÓW ## Zwraca Å›redniÄ… (Å›redniÄ… arytmetycznÄ…) wszystkich komórek, które speÅ‚niajÄ… jedno lub wiÄ™cej kryteriów. +BETADIST = ROZKÅAD.BETA ## Zwraca skumulowanÄ… funkcjÄ™ gÄ™stoÅ›ci prawdopodobieÅ„stwa beta. +BETAINV = ROZKÅAD.BETA.ODW ## Zwraca odwrotność skumulowanej funkcji gÄ™stoÅ›ci prawdopodobieÅ„stwa beta. +BINOMDIST = ROZKÅAD.DWUM ## Zwraca pojedynczy skÅ‚adnik dwumianowego rozkÅ‚adu prawdopodobieÅ„stwa. +CHIDIST = ROZKÅAD.CHI ## Zwraca wartość jednostronnego prawdopodobieÅ„stwa rozkÅ‚adu chi-kwadrat. +CHIINV = ROZKÅAD.CHI.ODW ## Zwraca odwrotność wartoÅ›ci jednostronnego prawdopodobieÅ„stwa rozkÅ‚adu chi-kwadrat. +CHITEST = TEST.CHI ## Zwraca test niezależnoÅ›ci. +CONFIDENCE = UFNOŚĆ ## Zwraca interwaÅ‚ ufnoÅ›ci dla Å›redniej populacji. +CORREL = WSP.KORELACJI ## Zwraca współczynnik korelacji dwóch zbiorów danych. +COUNT = ILE.LICZB ## Zlicza liczby znajdujÄ…ce siÄ™ na liÅ›cie argumentów. +COUNTA = ILE.NIEPUSTYCH ## Zlicza wartoÅ›ci znajdujÄ…ce siÄ™ na liÅ›cie argumentów. +COUNTBLANK = LICZ.PUSTE ## Zwraca liczbÄ™ pustych komórek w pewnym zakresie. +COUNTIF = LICZ.JEÅ»ELI ## Zlicza komórki wewnÄ…trz zakresu, które speÅ‚niajÄ… podane kryteria. +COUNTIFS = LICZ.WARUNKI ## Zlicza komórki wewnÄ…trz zakresu, które speÅ‚niajÄ… wiele kryteriów. +COVAR = KOWARIANCJA ## Zwraca kowariancjÄ™, czyli Å›redniÄ… wartość iloczynów odpowiednich odchyleÅ„. +CRITBINOM = PRÓG.ROZKÅAD.DWUM ## Zwraca najmniejszÄ… wartość, dla której skumulowany rozkÅ‚ad dwumianowy jest mniejszy niż wartość kryterium lub równy jej. +DEVSQ = ODCH.KWADRATOWE ## Zwraca sumÄ™ kwadratów odchyleÅ„. +EXPONDIST = ROZKÅAD.EXP ## Zwraca rozkÅ‚ad wykÅ‚adniczy. +FDIST = ROZKÅAD.F ## Zwraca rozkÅ‚ad prawdopodobieÅ„stwa F. +FINV = ROZKÅAD.F.ODW ## Zwraca odwrotność rozkÅ‚adu prawdopodobieÅ„stwa F. +FISHER = ROZKÅAD.FISHER ## Zwraca transformacjÄ™ Fishera. +FISHERINV = ROZKÅAD.FISHER.ODW ## Zwraca odwrotność transformacji Fishera. +FORECAST = REGLINX ## Zwraca wartość trendu liniowego. +FREQUENCY = CZĘSTOŚĆ ## Zwraca rozkÅ‚ad czÄ™stotliwoÅ›ci jako tablicÄ™ pionowÄ…. +FTEST = TEST.F ## Zwraca wynik testu F. +GAMMADIST = ROZKÅAD.GAMMA ## Zwraca rozkÅ‚ad gamma. +GAMMAINV = ROZKÅAD.GAMMA.ODW ## Zwraca odwrotność skumulowanego rozkÅ‚adu gamma. +GAMMALN = ROZKÅAD.LIN.GAMMA ## Zwraca logarytm naturalny funkcji gamma, Γ(x). +GEOMEAN = ÅšREDNIA.GEOMETRYCZNA ## Zwraca Å›redniÄ… geometrycznÄ…. +GROWTH = REGEXPW ## Zwraca wartoÅ›ci trendu wykÅ‚adniczego. +HARMEAN = ÅšREDNIA.HARMONICZNA ## Zwraca Å›redniÄ… harmonicznÄ…. +HYPGEOMDIST = ROZKÅAD.HIPERGEOM ## Zwraca rozkÅ‚ad hipergeometryczny. +INTERCEPT = ODCIĘTA ## Zwraca punkt przeciÄ™cia osi pionowej z liniÄ… regresji liniowej. +KURT = KURTOZA ## Zwraca kurtozÄ™ zbioru danych. +LARGE = MAX.K ## Zwraca k-tÄ… najwiÄ™kszÄ… wartość ze zbioru danych. +LINEST = REGLINP ## Zwraca parametry trendu liniowego. +LOGEST = REGEXPP ## Zwraca parametry trendu wykÅ‚adniczego. +LOGINV = ROZKÅAD.LOG.ODW ## Zwraca odwrotność rozkÅ‚adu logarytmu naturalnego. +LOGNORMDIST = ROZKÅAD.LOG ## Zwraca skumulowany rozkÅ‚ad logarytmu naturalnego. +MAX = MAX ## Zwraca maksymalnÄ… wartość listy argumentów. +MAXA = MAX.A ## Zwraca maksymalnÄ… wartość listy argumentów, z uwzglÄ™dnieniem liczb, tekstów i wartoÅ›ci logicznych. +MEDIAN = MEDIANA ## Zwraca medianÄ™ podanych liczb. +MIN = MIN ## Zwraca minimalnÄ… wartość listy argumentów. +MINA = MIN.A ## Zwraca najmniejszÄ… wartość listy argumentów, z uwzglÄ™dnieniem liczb, tekstów i wartoÅ›ci logicznych. +MODE = WYST.NAJCZĘŚCIEJ ## Zwraca wartość najczęściej wystÄ™pujÄ…cÄ… w zbiorze danych. +NEGBINOMDIST = ROZKÅAD.DWUM.PRZEC ## Zwraca ujemny rozkÅ‚ad dwumianowy. +NORMDIST = ROZKÅAD.NORMALNY ## Zwraca rozkÅ‚ad normalny skumulowany. +NORMINV = ROZKÅAD.NORMALNY.ODW ## Zwraca odwrotność rozkÅ‚adu normalnego skumulowanego. +NORMSDIST = ROZKÅAD.NORMALNY.S ## Zwraca standardowy rozkÅ‚ad normalny skumulowany. +NORMSINV = ROZKÅAD.NORMALNY.S.ODW ## Zwraca odwrotność standardowego rozkÅ‚adu normalnego skumulowanego. +PEARSON = PEARSON ## Zwraca współczynnik korelacji momentu iloczynu Pearsona. +PERCENTILE = PERCENTYL ## Wyznacza k-ty percentyl wartoÅ›ci w zakresie. +PERCENTRANK = PROCENT.POZYCJA ## Zwraca procentowÄ… pozycjÄ™ wartoÅ›ci w zbiorze danych. +PERMUT = PERMUTACJE ## Zwraca liczbÄ™ permutacji dla danej liczby obiektów. +POISSON = ROZKÅAD.POISSON ## Zwraca rozkÅ‚ad Poissona. +PROB = PRAWDPD ## Zwraca prawdopodobieÅ„stwo, że wartoÅ›ci w zakresie leżą pomiÄ™dzy dwiema granicami. +QUARTILE = KWARTYL ## Wyznacza kwartyl zbioru danych. +RANK = POZYCJA ## Zwraca pozycjÄ™ liczby na liÅ›cie liczb. +RSQ = R.KWADRAT ## Zwraca kwadrat współczynnika korelacji momentu iloczynu Pearsona. +SKEW = SKOÅšNOŚĆ ## Zwraca skoÅ›ność rozkÅ‚adu. +SLOPE = NACHYLENIE ## Zwraca nachylenie linii regresji liniowej. +SMALL = MIN.K ## Zwraca k-tÄ… najmniejszÄ… wartość ze zbioru danych. +STANDARDIZE = NORMALIZUJ ## Zwraca wartość znormalizowanÄ…. +STDEV = ODCH.STANDARDOWE ## Szacuje odchylenie standardowe na podstawie próbki. +STDEVA = ODCH.STANDARDOWE.A ## Szacuje odchylenie standardowe na podstawie próbki, z uwzglÄ™dnieniem liczb, tekstów i wartoÅ›ci logicznych. +STDEVP = ODCH.STANDARD.POPUL ## Oblicza odchylenie standardowe na podstawie caÅ‚ej populacji. +STDEVPA = ODCH.STANDARD.POPUL.A ## Oblicza odchylenie standardowe na podstawie caÅ‚ej populacji, z uwzglÄ™dnieniem liczb, teksów i wartoÅ›ci logicznych. +STEYX = REGBÅSTD ## Zwraca błąd standardowy przewidzianej wartoÅ›ci y dla każdej wartoÅ›ci x w regresji. +TDIST = ROZKÅAD.T ## Zwraca rozkÅ‚ad t-Studenta. +TINV = ROZKÅAD.T.ODW ## Zwraca odwrotność rozkÅ‚adu t-Studenta. +TREND = REGLINW ## Zwraca wartoÅ›ci trendu liniowego. +TRIMMEAN = ÅšREDNIA.WEWN ## Zwraca Å›redniÄ… wartość dla wnÄ™trza zbioru danych. +TTEST = TEST.T ## Zwraca prawdopodobieÅ„stwo zwiÄ…zane z testem t-Studenta. +VAR = WARIANCJA ## Szacuje wariancjÄ™ na podstawie próbki. +VARA = WARIANCJA.A ## Szacuje wariancjÄ™ na podstawie próbki, z uwzglÄ™dnieniem liczb, tekstów i wartoÅ›ci logicznych. +VARP = WARIANCJA.POPUL ## Oblicza wariancjÄ™ na podstawie caÅ‚ej populacji. +VARPA = WARIANCJA.POPUL.A ## Oblicza wariancjÄ™ na podstawie caÅ‚ej populacji, z uwzglÄ™dnieniem liczb, tekstów i wartoÅ›ci logicznych. +WEIBULL = ROZKÅAD.WEIBULL ## Zwraca rozkÅ‚ad Weibulla. +ZTEST = TEST.Z ## Zwraca wartość jednostronnego prawdopodobieÅ„stwa testu z. + + +## +## Text functions Funkcje tekstowe +## +ASC = ASC ## Zamienia litery angielskie lub katakana o peÅ‚nej szerokoÅ›ci (dwubajtowe) w ciÄ…gu znaków na znaki o szerokoÅ›ci połówkowej (jednobajtowe). +BAHTTEXT = BAHTTEXT ## Konwertuje liczbÄ™ na tekst, stosujÄ…c format walutowy ß (baht). +CHAR = ZNAK ## Zwraca znak o podanym numerze kodu. +CLEAN = OCZYŚĆ ## Usuwa z tekstu wszystkie znaki, które nie mogÄ… być drukowane. +CODE = KOD ## Zwraca kod numeryczny pierwszego znaku w ciÄ…gu tekstowym. +CONCATENATE = ZÅÄ„CZ.TEKSTY ## ÅÄ…czy kilka oddzielnych tekstów w jeden tekst. +DOLLAR = KWOTA ## Konwertuje liczbÄ™ na tekst, stosujÄ…c format walutowy $ (dolar). +EXACT = PORÓWNAJ ## Sprawdza identyczność dwóch wartoÅ›ci tekstowych. +FIND = ZNAJDŹ ## Znajduje jednÄ… wartość tekstowÄ… wewnÄ…trz innej (z uwzglÄ™dnieniem wielkich i maÅ‚ych liter). +FINDB = ZNAJDŹB ## Znajduje jednÄ… wartość tekstowÄ… wewnÄ…trz innej (z uwzglÄ™dnieniem wielkich i maÅ‚ych liter). +FIXED = ZAOKR.DO.TEKST ## Formatuje liczbÄ™ jako tekst przy staÅ‚ej liczbie miejsc dziesiÄ™tnych. +JIS = JIS ## Zmienia litery angielskie lub katakana o szerokoÅ›ci połówkowej (jednobajtowe) w ciÄ…gu znaków na znaki o peÅ‚nej szerokoÅ›ci (dwubajtowe). +LEFT = LEWY ## Zwraca skrajne lewe znaki z wartoÅ›ci tekstowej. +LEFTB = LEWYB ## Zwraca skrajne lewe znaki z wartoÅ›ci tekstowej. +LEN = DÅ ## Zwraca liczbÄ™ znaków ciÄ…gu tekstowego. +LENB = DÅ.B ## Zwraca liczbÄ™ znaków ciÄ…gu tekstowego. +LOWER = LITERY.MAÅE ## Konwertuje wielkie litery tekstu na maÅ‚e litery. +MID = FRAGMENT.TEKSTU ## Zwraca okreÅ›lonÄ… liczbÄ™ znaków z ciÄ…gu tekstowego, zaczynajÄ…c od zadanej pozycji. +MIDB = FRAGMENT.TEKSTU.B ## Zwraca okreÅ›lonÄ… liczbÄ™ znaków z ciÄ…gu tekstowego, zaczynajÄ…c od zadanej pozycji. +PHONETIC = PHONETIC ## Wybiera znaki fonetyczne (furigana) z ciÄ…gu tekstowego. +PROPER = Z.WIELKIEJ.LITERY ## ZastÄ™puje pierwszÄ… literÄ™ każdego wyrazu tekstu wielkÄ… literÄ…. +REPLACE = ZASTÄ„P ## ZastÄ™puje znaki w tekÅ›cie. +REPLACEB = ZASTÄ„P.B ## ZastÄ™puje znaki w tekÅ›cie. +REPT = POWT ## Powiela tekst danÄ… liczbÄ™ razy. +RIGHT = PRAWY ## Zwraca skrajne prawe znaki z wartoÅ›ci tekstowej. +RIGHTB = PRAWYB ## Zwraca skrajne prawe znaki z wartoÅ›ci tekstowej. +SEARCH = SZUKAJ.TEKST ## Wyszukuje jednÄ… wartość tekstowÄ… wewnÄ…trz innej (bez uwzglÄ™dniania wielkoÅ›ci liter). +SEARCHB = SZUKAJ.TEKST.B ## Wyszukuje jednÄ… wartość tekstowÄ… wewnÄ…trz innej (bez uwzglÄ™dniania wielkoÅ›ci liter). +SUBSTITUTE = PODSTAW ## Podstawia nowy tekst w miejsce poprzedniego tekstu w ciÄ…gu tekstowym. +T = T ## Konwertuje argumenty na tekst. +TEXT = TEKST ## Formatuje liczbÄ™ i konwertuje jÄ… na tekst. +TRIM = USUŃ.ZBĘDNE.ODSTĘPY ## Usuwa spacje z tekstu. +UPPER = LITERY.WIELKIE ## Konwertuje znaki tekstu na wielkie litery. +VALUE = WARTOŚĆ ## Konwertuje argument tekstowy na liczbÄ™. diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/br/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/br/config new file mode 100644 index 000000000..b8e696454 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/br/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = R$ + + +## +## Excel Error Codes (For future use) +## +NULL = #NULO! +DIV0 = #DIV/0! +VALUE = #VALOR! +REF = #REF! +NAME = #NOME? +NUM = #NÚM! +NA = #N/D diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/br/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/br/functions new file mode 100644 index 000000000..c53e4c9a6 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/br/functions @@ -0,0 +1,408 @@ +## +## Add-in and Automation functions Funções Suplemento e Automação +## +GETPIVOTDATA = INFODADOSTABELADINÂMICA ## Retorna os dados armazenados em um relatório de tabela dinâmica + + +## +## Cube functions Funções de Cubo +## +CUBEKPIMEMBER = MEMBROKPICUBO ## Retorna o nome de um KPI (indicador de desempenho-chave), uma propriedade e uma medida e exibe o nome e a propriedade na célula. Um KPI é uma medida quantificável, como o lucro bruto mensal ou a rotatividade trimestral dos funcionários, usada para monitorar o desempenho de uma organização. +CUBEMEMBER = MEMBROCUBO ## Retorna um membro ou tupla em uma hierarquia de cubo. Use para validar se o membro ou tupla existe no cubo. +CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Retorna o valor da propriedade de um membro no cubo. Usada para validar a existência do nome do membro no cubo e para retornar a propriedade especificada para esse membro. +CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Retorna o enésimo membro, ou o membro ordenado, em um conjunto. Use para retornar um ou mais elementos em um conjunto, assim como o melhor vendedor ou os dez melhores alunos. +CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou tuplas enviando uma expressão do conjunto para o cubo no servidor, que cria o conjunto e o retorna para o Microsoft Office Excel. +CUBESETCOUNT = CONTAGEMCONJUNTOCUBO ## Retorna o número de itens em um conjunto. +CUBEVALUE = VALORCUBO ## Retorna um valor agregado de um cubo. + + +## +## Database functions Funções de banco de dados +## +DAVERAGE = BDMÉDIA ## Retorna a média das entradas selecionadas de um banco de dados +DCOUNT = BDCONTAR ## Conta as células que contêm números em um banco de dados +DCOUNTA = BDCONTARA ## Conta células não vazias em um banco de dados +DGET = BDEXTRAIR ## Extrai de um banco de dados um único registro que corresponde a um critério específico +DMAX = BDMÃX ## Retorna o valor máximo de entradas selecionadas de um banco de dados +DMIN = BDMÃN ## Retorna o valor mínimo de entradas selecionadas de um banco de dados +DPRODUCT = BDMULTIPL ## Multiplica os valores em um campo específico de registros que correspondem ao critério em um banco de dados +DSTDEV = BDEST ## Estima o desvio padrão com base em uma amostra de entradas selecionadas de um banco de dados +DSTDEVP = BDDESVPA ## Calcula o desvio padrão com base na população inteira de entradas selecionadas de um banco de dados +DSUM = BDSOMA ## Adiciona os números à coluna de campos de registros do banco de dados que correspondem ao critério +DVAR = BDVAREST ## Estima a variância com base em uma amostra de entradas selecionadas de um banco de dados +DVARP = BDVARP ## Calcula a variância com base na população inteira de entradas selecionadas de um banco de dados + + +## +## Date and time functions Funções de data e hora +## +DATE = DATA ## Retorna o número de série de uma data específica +DATEVALUE = DATA.VALOR ## Converte uma data na forma de texto para um número de série +DAY = DIA ## Converte um número de série em um dia do mês +DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base em um ano de 360 dias +EDATE = DATAM ## Retorna o número de série da data que é o número indicado de meses antes ou depois da data inicial +EOMONTH = FIMMÊS ## Retorna o número de série do último dia do mês antes ou depois de um número especificado de meses +HOUR = HORA ## Converte um número de série em uma hora +MINUTE = MINUTO ## Converte um número de série em um minuto +MONTH = MÊS ## Converte um número de série em um mês +NETWORKDAYS = DIATRABALHOTOTAL ## Retorna o número de dias úteis inteiros entre duas datas +NOW = AGORA ## Retorna o número de série seqüencial da data e hora atuais +SECOND = SEGUNDO ## Converte um número de série em um segundo +TIME = HORA ## Retorna o número de série de uma hora específica +TIMEVALUE = VALOR.TEMPO ## Converte um horário na forma de texto para um número de série +TODAY = HOJE ## Retorna o número de série da data de hoje +WEEKDAY = DIA.DA.SEMANA ## Converte um número de série em um dia da semana +WEEKNUM = NÚMSEMANA ## Converte um número de série em um número que representa onde a semana cai numericamente em um ano +WORKDAY = DIATRABALHO ## Retorna o número de série da data antes ou depois de um número específico de dias úteis +YEAR = ANO ## Converte um número de série em um ano +YEARFRAC = FRAÇÃOANO ## Retorna a fração do ano que representa o número de dias entre data_inicial e data_final + + +## +## Engineering functions Funções de engenharia +## +BESSELI = BESSELI ## Retorna a função de Bessel In(x) modificada +BESSELJ = BESSELJ ## Retorna a função de Bessel Jn(x) +BESSELK = BESSELK ## Retorna a função de Bessel Kn(x) modificada +BESSELY = BESSELY ## Retorna a função de Bessel Yn(x) +BIN2DEC = BIN2DEC ## Converte um número binário em decimal +BIN2HEX = BIN2HEX ## Converte um número binário em hexadecimal +BIN2OCT = BIN2OCT ## Converte um número binário em octal +COMPLEX = COMPLEX ## Converte coeficientes reais e imaginários e um número complexo +CONVERT = CONVERTER ## Converte um número de um sistema de medida para outro +DEC2BIN = DECABIN ## Converte um número decimal em binário +DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal +DEC2OCT = DECAOCT ## Converte um número decimal em octal +DELTA = DELTA ## Testa se dois valores são iguais +ERF = FUNERRO ## Retorna a função de erro +ERFC = FUNERROCOMPL ## Retorna a função de erro complementar +GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite +HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário +HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal +HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal +IMABS = IMABS ## Retorna o valor absoluto (módulo) de um número complexo +IMAGINARY = IMAGINÃRIO ## Retorna o coeficiente imaginário de um número complexo +IMARGUMENT = IMARG ## Retorna o argumento teta, um ângulo expresso em radianos +IMCONJUGATE = IMCONJ ## Retorna o conjugado complexo de um número complexo +IMCOS = IMCOS ## Retorna o cosseno de um número complexo +IMDIV = IMDIV ## Retorna o quociente de dois números complexos +IMEXP = IMEXP ## Retorna o exponencial de um número complexo +IMLN = IMLN ## Retorna o logaritmo natural de um número complexo +IMLOG10 = IMLOG10 ## Retorna o logaritmo de base 10 de um número complexo +IMLOG2 = IMLOG2 ## Retorna o logaritmo de base 2 de um número complexo +IMPOWER = IMPOT ## Retorna um número complexo elevado a uma potência inteira +IMPRODUCT = IMPROD ## Retorna o produto de números complexos +IMREAL = IMREAL ## Retorna o coeficiente real de um número complexo +IMSIN = IMSENO ## Retorna o seno de um número complexo +IMSQRT = IMRAIZ ## Retorna a raiz quadrada de um número complexo +IMSUB = IMSUBTR ## Retorna a diferença entre dois números complexos +IMSUM = IMSOMA ## Retorna a soma de números complexos +OCT2BIN = OCTABIN ## Converte um número octal em binário +OCT2DEC = OCTADEC ## Converte um número octal em decimal +OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal + + +## +## Financial functions Funções financeiras +## +ACCRINT = JUROSACUM ## Retorna a taxa de juros acumulados de um título que paga uma taxa periódica de juros +ACCRINTM = JUROSACUMV ## Retorna os juros acumulados de um título que paga juros no vencimento +AMORDEGRC = AMORDEGRC ## Retorna a depreciação para cada período contábil usando o coeficiente de depreciação +AMORLINC = AMORLINC ## Retorna a depreciação para cada período contábil +COUPDAYBS = CUPDIASINLIQ ## Retorna o número de dias do início do período de cupom até a data de liquidação +COUPDAYS = CUPDIAS ## Retorna o número de dias no período de cupom que contém a data de quitação +COUPDAYSNC = CUPDIASPRÓX ## Retorna o número de dias da data de liquidação até a data do próximo cupom +COUPNCD = CUPDATAPRÓX ## Retorna a próxima data de cupom após a data de quitação +COUPNUM = CUPNÚM ## Retorna o número de cupons pagáveis entre as datas de quitação e vencimento +COUPPCD = CUPDATAANT ## Retorna a data de cupom anterior à data de quitação +CUMIPMT = PGTOJURACUM ## Retorna os juros acumulados pagos entre dois períodos +CUMPRINC = PGTOCAPACUM ## Retorna o capital acumulado pago sobre um empréstimo entre dois períodos +DB = BD ## Retorna a depreciação de um ativo para um período especificado, usando o método de balanço de declínio fixo +DDB = BDD ## Retorna a depreciação de um ativo com relação a um período especificado usando o método de saldos decrescentes duplos ou qualquer outro método especificado por você +DISC = DESC ## Retorna a taxa de desconto de um título +DOLLARDE = MOEDADEC ## Converte um preço em formato de moeda, na forma fracionária, em um preço na forma decimal +DOLLARFR = MOEDAFRA ## Converte um preço, apresentado na forma decimal, em um preço apresentado na forma fracionária +DURATION = DURAÇÃO ## Retorna a duração anual de um título com pagamentos de juros periódicos +EFFECT = EFETIVA ## Retorna a taxa de juros anual efetiva +FV = VF ## Retorna o valor futuro de um investimento +FVSCHEDULE = VFPLANO ## Retorna o valor futuro de um capital inicial após a aplicação de uma série de taxas de juros compostas +INTRATE = TAXAJUROS ## Retorna a taxa de juros de um título totalmente investido +IPMT = IPGTO ## Retorna o pagamento de juros para um investimento em um determinado período +IRR = TIR ## Retorna a taxa interna de retorno de uma série de fluxos de caixa +ISPMT = ÉPGTO ## Calcula os juros pagos durante um período específico de um investimento +MDURATION = MDURAÇÃO ## Retorna a duração de Macauley modificada para um título com um valor de paridade equivalente a R$ 100 +MIRR = MTIR ## Calcula a taxa interna de retorno em que fluxos de caixa positivos e negativos são financiados com diferentes taxas +NOMINAL = NOMINAL ## Retorna a taxa de juros nominal anual +NPER = NPER ## Retorna o número de períodos de um investimento +NPV = VPL ## Retorna o valor líquido atual de um investimento com base em uma série de fluxos de caixa periódicos e em uma taxa de desconto +ODDFPRICE = PREÇOPRIMINC ## Retorna o preço por R$ 100 de valor nominal de um título com um primeiro período indefinido +ODDFYIELD = LUCROPRIMINC ## Retorna o rendimento de um título com um primeiro período indefinido +ODDLPRICE = PREÇOÚLTINC ## Retorna o preço por R$ 100 de valor nominal de um título com um último período de cupom indefinido +ODDLYIELD = LUCROÚLTINC ## Retorna o rendimento de um título com um último período indefinido +PMT = PGTO ## Retorna o pagamento periódico de uma anuidade +PPMT = PPGTO ## Retorna o pagamento de capital para determinado período de investimento +PRICE = PREÇO ## Retorna a preço por R$ 100,00 de valor nominal de um título que paga juros periódicos +PRICEDISC = PREÇODESC ## Retorna o preço por R$ 100,00 de valor nominal de um título descontado +PRICEMAT = PREÇOVENC ## Retorna o preço por R$ 100,00 de valor nominal de um título que paga juros no vencimento +PV = VP ## Retorna o valor presente de um investimento +RATE = TAXA ## Retorna a taxa de juros por período de uma anuidade +RECEIVED = RECEBER ## Retorna a quantia recebida no vencimento de um título totalmente investido +SLN = DPD ## Retorna a depreciação em linha reta de um ativo durante um período +SYD = SDA ## Retorna a depreciação dos dígitos da soma dos anos de um ativo para um período especificado +TBILLEQ = OTN ## Retorna o rendimento de um título equivalente a uma obrigação do Tesouro +TBILLPRICE = OTNVALOR ## Retorna o preço por R$ 100,00 de valor nominal de uma obrigação do Tesouro +TBILLYIELD = OTNLUCRO ## Retorna o rendimento de uma obrigação do Tesouro +VDB = BDV ## Retorna a depreciação de um ativo para um período especificado ou parcial usando um método de balanço declinante +XIRR = XTIR ## Fornece a taxa interna de retorno para um programa de fluxos de caixa que não é necessariamente periódico +XNPV = XVPL ## Retorna o valor presente líquido de um programa de fluxos de caixa que não é necessariamente periódico +YIELD = LUCRO ## Retorna o lucro de um título que paga juros periódicos +YIELDDISC = LUCRODESC ## Retorna o rendimento anual de um título descontado. Por exemplo, uma obrigação do Tesouro +YIELDMAT = LUCROVENC ## Retorna o lucro anual de um título que paga juros no vencimento + + +## +## Information functions Funções de informação +## +CELL = CÉL ## Retorna informações sobre formatação, localização ou conteúdo de uma célula +ERROR.TYPE = TIPO.ERRO ## Retorna um número correspondente a um tipo de erro +INFO = INFORMAÇÃO ## Retorna informações sobre o ambiente operacional atual +ISBLANK = ÉCÉL.VAZIA ## Retorna VERDADEIRO se o valor for vazio +ISERR = ÉERRO ## Retorna VERDADEIRO se o valor for um valor de erro diferente de #N/D +ISERROR = ÉERROS ## Retorna VERDADEIRO se o valor for um valor de erro +ISEVEN = ÉPAR ## Retorna VERDADEIRO se o número for par +ISLOGICAL = ÉLÓGICO ## Retorna VERDADEIRO se o valor for um valor lógico +ISNA = É.NÃO.DISP ## Retorna VERDADEIRO se o valor for o valor de erro #N/D +ISNONTEXT = É.NÃO.TEXTO ## Retorna VERDADEIRO se o valor for diferente de texto +ISNUMBER = ÉNÚM ## Retorna VERDADEIRO se o valor for um número +ISODD = ÉIMPAR ## Retorna VERDADEIRO se o número for ímpar +ISREF = ÉREF ## Retorna VERDADEIRO se o valor for uma referência +ISTEXT = ÉTEXTO ## Retorna VERDADEIRO se o valor for texto +N = N ## Retorna um valor convertido em um número +NA = NÃO.DISP ## Retorna o valor de erro #N/D +TYPE = TIPO ## Retorna um número indicando o tipo de dados de um valor + + +## +## Logical functions Funções lógicas +## +AND = E ## Retorna VERDADEIRO se todos os seus argumentos forem VERDADEIROS +FALSE = FALSO ## Retorna o valor lógico FALSO +IF = SE ## Especifica um teste lógico a ser executado +IFERROR = SEERRO ## Retornará um valor que você especifica se uma fórmula for avaliada para um erro; do contrário, retornará o resultado da fórmula +NOT = NÃO ## Inverte o valor lógico do argumento +OR = OU ## Retorna VERDADEIRO se um dos argumentos for VERDADEIRO +TRUE = VERDADEIRO ## Retorna o valor lógico VERDADEIRO + + +## +## Lookup and reference functions Funções de pesquisa e referência +## +ADDRESS = ENDEREÇO ## Retorna uma referência como texto para uma única célula em uma planilha +AREAS = ÃREAS ## Retorna o número de áreas em uma referência +CHOOSE = ESCOLHER ## Escolhe um valor a partir de uma lista de valores +COLUMN = COL ## Retorna o número da coluna de uma referência +COLUMNS = COLS ## Retorna o número de colunas em uma referência +HLOOKUP = PROCH ## Procura na linha superior de uma matriz e retorna o valor da célula especificada +HYPERLINK = HYPERLINK ## Cria um atalho ou salto que abre um documento armazenado em um servidor de rede, uma intranet ou na Internet +INDEX = ÃNDICE ## Usa um índice para escolher um valor de uma referência ou matriz +INDIRECT = INDIRETO ## Retorna uma referência indicada por um valor de texto +LOOKUP = PROC ## Procura valores em um vetor ou em uma matriz +MATCH = CORRESP ## Procura valores em uma referência ou em uma matriz +OFFSET = DESLOC ## Retorna um deslocamento de referência com base em uma determinada referência +ROW = LIN ## Retorna o número da linha de uma referência +ROWS = LINS ## Retorna o número de linhas em uma referência +RTD = RTD ## Recupera dados em tempo real de um programa que ofereça suporte a automação COM (automação: uma forma de trabalhar com objetos de um aplicativo a partir de outro aplicativo ou ferramenta de desenvolvimento. Chamada inicialmente de automação OLE, a automação é um padrão industrial e um recurso do modelo de objeto componente (COM).) +TRANSPOSE = TRANSPOR ## Retorna a transposição de uma matriz +VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e move ao longo da linha para retornar o valor de uma célula + + +## +## Math and trigonometry functions Funções matemáticas e trigonométricas +## +ABS = ABS ## Retorna o valor absoluto de um número +ACOS = ACOS ## Retorna o arco cosseno de um número +ACOSH = ACOSH ## Retorna o cosseno hiperbólico inverso de um número +ASIN = ASEN ## Retorna o arco seno de um número +ASINH = ASENH ## Retorna o seno hiperbólico inverso de um número +ATAN = ATAN ## Retorna o arco tangente de um número +ATAN2 = ATAN2 ## Retorna o arco tangente das coordenadas x e y especificadas +ATANH = ATANH ## Retorna a tangente hiperbólica inversa de um número +CEILING = TETO ## Arredonda um número para o inteiro mais próximo ou para o múltiplo mais próximo de significância +COMBIN = COMBIN ## Retorna o número de combinações de um determinado número de objetos +COS = COS ## Retorna o cosseno de um número +COSH = COSH ## Retorna o cosseno hiperbólico de um número +DEGREES = GRAUS ## Converte radianos em graus +EVEN = PAR ## Arredonda um número para cima até o inteiro par mais próximo +EXP = EXP ## Retorna e elevado à potência de um número especificado +FACT = FATORIAL ## Retorna o fatorial de um número +FACTDOUBLE = FATDUPLO ## Retorna o fatorial duplo de um número +FLOOR = ARREDMULTB ## Arredonda um número para baixo até zero +GCD = MDC ## Retorna o máximo divisor comum +INT = INT ## Arredonda um número para baixo até o número inteiro mais próximo +LCM = MMC ## Retorna o mínimo múltiplo comum +LN = LN ## Retorna o logaritmo natural de um número +LOG = LOG ## Retorna o logaritmo de um número de uma base especificada +LOG10 = LOG10 ## Retorna o logaritmo de base 10 de um número +MDETERM = MATRIZ.DETERM ## Retorna o determinante de uma matriz de uma variável do tipo matriz +MINVERSE = MATRIZ.INVERSO ## Retorna a matriz inversa de uma matriz +MMULT = MATRIZ.MULT ## Retorna o produto de duas matrizes +MOD = RESTO ## Retorna o resto da divisão +MROUND = MARRED ## Retorna um número arredondado ao múltiplo desejado +MULTINOMIAL = MULTINOMIAL ## Retorna o multinomial de um conjunto de números +ODD = ÃMPAR ## Arredonda um número para cima até o inteiro ímpar mais próximo +PI = PI ## Retorna o valor de Pi +POWER = POTÊNCIA ## Fornece o resultado de um número elevado a uma potência +PRODUCT = MULT ## Multiplica seus argumentos +QUOTIENT = QUOCIENTE ## Retorna a parte inteira de uma divisão +RADIANS = RADIANOS ## Converte graus em radianos +RAND = ALEATÓRIO ## Retorna um número aleatório entre 0 e 1 +RANDBETWEEN = ALEATÓRIOENTRE ## Retorna um número aleatório entre os números especificados +ROMAN = ROMANO ## Converte um algarismo arábico em romano, como texto +ROUND = ARRED ## Arredonda um número até uma quantidade especificada de dígitos +ROUNDDOWN = ARREDONDAR.PARA.BAIXO ## Arredonda um número para baixo até zero +ROUNDUP = ARREDONDAR.PARA.CIMA ## Arredonda um número para cima, afastando-o de zero +SERIESSUM = SOMASEQÜÊNCIA ## Retorna a soma de uma série polinomial baseada na fórmula +SIGN = SINAL ## Retorna o sinal de um número +SIN = SEN ## Retorna o seno de um ângulo dado +SINH = SENH ## Retorna o seno hiperbólico de um número +SQRT = RAIZ ## Retorna uma raiz quadrada positiva +SQRTPI = RAIZPI ## Retorna a raiz quadrada de (núm* pi) +SUBTOTAL = SUBTOTAL ## Retorna um subtotal em uma lista ou em um banco de dados +SUM = SOMA ## Soma seus argumentos +SUMIF = SOMASE ## Adiciona as células especificadas por um determinado critério +SUMIFS = SOMASE ## Adiciona as células em um intervalo que atende a vários critérios +SUMPRODUCT = SOMARPRODUTO ## Retorna a soma dos produtos de componentes correspondentes de matrizes +SUMSQ = SOMAQUAD ## Retorna a soma dos quadrados dos argumentos +SUMX2MY2 = SOMAX2DY2 ## Retorna a soma da diferença dos quadrados dos valores correspondentes em duas matrizes +SUMX2PY2 = SOMAX2SY2 ## Retorna a soma da soma dos quadrados dos valores correspondentes em duas matrizes +SUMXMY2 = SOMAXMY2 ## Retorna a soma dos quadrados das diferenças dos valores correspondentes em duas matrizes +TAN = TAN ## Retorna a tangente de um número +TANH = TANH ## Retorna a tangente hiperbólica de um número +TRUNC = TRUNCAR ## Trunca um número para um inteiro + + +## +## Statistical functions Funções estatísticas +## +AVEDEV = DESV.MÉDIO ## Retorna a média aritmética dos desvios médios dos pontos de dados a partir de sua média +AVERAGE = MÉDIA ## Retorna a média dos argumentos +AVERAGEA = MÉDIAA ## Retorna a média dos argumentos, inclusive números, texto e valores lógicos +AVERAGEIF = MÉDIASE ## Retorna a média (média aritmética) de todas as células em um intervalo que atendem a um determinado critério +AVERAGEIFS = MÉDIASES ## Retorna a média (média aritmética) de todas as células que atendem a múltiplos critérios. +BETADIST = DISTBETA ## Retorna a função de distribuição cumulativa beta +BETAINV = BETA.ACUM.INV ## Retorna o inverso da função de distribuição cumulativa para uma distribuição beta especificada +BINOMDIST = DISTRBINOM ## Retorna a probabilidade de distribuição binomial do termo individual +CHIDIST = DIST.QUI ## Retorna a probabilidade unicaudal da distribuição qui-quadrada +CHIINV = INV.QUI ## Retorna o inverso da probabilidade uni-caudal da distribuição qui-quadrada +CHITEST = TESTE.QUI ## Retorna o teste para independência +CONFIDENCE = INT.CONFIANÇA ## Retorna o intervalo de confiança para uma média da população +CORREL = CORREL ## Retorna o coeficiente de correlação entre dois conjuntos de dados +COUNT = CONT.NÚM ## Calcula quantos números há na lista de argumentos +COUNTA = CONT.VALORES ## Calcula quantos valores há na lista de argumentos +COUNTBLANK = CONTAR.VAZIO ## Conta o número de células vazias no intervalo especificado +COUNTIF = CONT.SE ## Calcula o número de células não vazias em um intervalo que corresponde a determinados critérios +COUNTIFS = CONT.SES ## Conta o número de células dentro de um intervalo que atende a múltiplos critérios +COVAR = COVAR ## Retorna a covariância, a média dos produtos dos desvios pares +CRITBINOM = CRIT.BINOM ## Retorna o menor valor para o qual a distribuição binomial cumulativa é menor ou igual ao valor padrão +DEVSQ = DESVQ ## Retorna a soma dos quadrados dos desvios +EXPONDIST = DISTEXPON ## Retorna a distribuição exponencial +FDIST = DISTF ## Retorna a distribuição de probabilidade F +FINV = INVF ## Retorna o inverso da distribuição de probabilidades F +FISHER = FISHER ## Retorna a transformação Fisher +FISHERINV = FISHERINV ## Retorna o inverso da transformação Fisher +FORECAST = PREVISÃO ## Retorna um valor ao longo de uma linha reta +FREQUENCY = FREQÜÊNCIA ## Retorna uma distribuição de freqüência como uma matriz vertical +FTEST = TESTEF ## Retorna o resultado de um teste F +GAMMADIST = DISTGAMA ## Retorna a distribuição gama +GAMMAINV = INVGAMA ## Retorna o inverso da distribuição cumulativa gama +GAMMALN = LNGAMA ## Retorna o logaritmo natural da função gama, G(x) +GEOMEAN = MÉDIA.GEOMÉTRICA ## Retorna a média geométrica +GROWTH = CRESCIMENTO ## Retorna valores ao longo de uma tendência exponencial +HARMEAN = MÉDIA.HARMÔNICA ## Retorna a média harmônica +HYPGEOMDIST = DIST.HIPERGEOM ## Retorna a distribuição hipergeométrica +INTERCEPT = INTERCEPÇÃO ## Retorna a intercepção da linha de regressão linear +KURT = CURT ## Retorna a curtose de um conjunto de dados +LARGE = MAIOR ## Retorna o maior valor k-ésimo de um conjunto de dados +LINEST = PROJ.LIN ## Retorna os parâmetros de uma tendência linear +LOGEST = PROJ.LOG ## Retorna os parâmetros de uma tendência exponencial +LOGINV = INVLOG ## Retorna o inverso da distribuição lognormal +LOGNORMDIST = DIST.LOGNORMAL ## Retorna a distribuição lognormal cumulativa +MAX = MÃXIMO ## Retorna o valor máximo em uma lista de argumentos +MAXA = MÃXIMOA ## Retorna o maior valor em uma lista de argumentos, inclusive números, texto e valores lógicos +MEDIAN = MED ## Retorna a mediana dos números indicados +MIN = MÃNIMO ## Retorna o valor mínimo em uma lista de argumentos +MINA = MÃNIMOA ## Retorna o menor valor em uma lista de argumentos, inclusive números, texto e valores lógicos +MODE = MODO ## Retorna o valor mais comum em um conjunto de dados +NEGBINOMDIST = DIST.BIN.NEG ## Retorna a distribuição binomial negativa +NORMDIST = DIST.NORM ## Retorna a distribuição cumulativa normal +NORMINV = INV.NORM ## Retorna o inverso da distribuição cumulativa normal +NORMSDIST = DIST.NORMP ## Retorna a distribuição cumulativa normal padrão +NORMSINV = INV.NORMP ## Retorna o inverso da distribuição cumulativa normal padrão +PEARSON = PEARSON ## Retorna o coeficiente de correlação do momento do produto Pearson +PERCENTILE = PERCENTIL ## Retorna o k-ésimo percentil de valores em um intervalo +PERCENTRANK = ORDEM.PORCENTUAL ## Retorna a ordem percentual de um valor em um conjunto de dados +PERMUT = PERMUT ## Retorna o número de permutações de um determinado número de objetos +POISSON = POISSON ## Retorna a distribuição Poisson +PROB = PROB ## Retorna a probabilidade de valores em um intervalo estarem entre dois limites +QUARTILE = QUARTIL ## Retorna o quartil do conjunto de dados +RANK = ORDEM ## Retorna a posição de um número em uma lista de números +RSQ = RQUAD ## Retorna o quadrado do coeficiente de correlação do momento do produto de Pearson +SKEW = DISTORÇÃO ## Retorna a distorção de uma distribuição +SLOPE = INCLINAÇÃO ## Retorna a inclinação da linha de regressão linear +SMALL = MENOR ## Retorna o menor valor k-ésimo do conjunto de dados +STANDARDIZE = PADRONIZAR ## Retorna um valor normalizado +STDEV = DESVPAD ## Estima o desvio padrão com base em uma amostra +STDEVA = DESVPADA ## Estima o desvio padrão com base em uma amostra, inclusive números, texto e valores lógicos +STDEVP = DESVPADP ## Calcula o desvio padrão com base na população total +STDEVPA = DESVPADPA ## Calcula o desvio padrão com base na população total, inclusive números, texto e valores lógicos +STEYX = EPADYX ## Retorna o erro padrão do valor-y previsto para cada x da regressão +TDIST = DISTT ## Retorna a distribuição t de Student +TINV = INVT ## Retorna o inverso da distribuição t de Student +TREND = TENDÊNCIA ## Retorna valores ao longo de uma tendência linear +TRIMMEAN = MÉDIA.INTERNA ## Retorna a média do interior de um conjunto de dados +TTEST = TESTET ## Retorna a probabilidade associada ao teste t de Student +VAR = VAR ## Estima a variância com base em uma amostra +VARA = VARA ## Estima a variância com base em uma amostra, inclusive números, texto e valores lógicos +VARP = VARP ## Calcula a variância com base na população inteira +VARPA = VARPA ## Calcula a variância com base na população total, inclusive números, texto e valores lógicos +WEIBULL = WEIBULL ## Retorna a distribuição Weibull +ZTEST = TESTEZ ## Retorna o valor de probabilidade uni-caudal de um teste-z + + +## +## Text functions Funções de texto +## +ASC = ASC ## Altera letras do inglês ou katakana de largura total (bytes duplos) dentro de uma seqüência de caracteres para caracteres de meia largura (byte único) +BAHTTEXT = BAHTTEXT ## Converte um número em um texto, usando o formato de moeda ß (baht) +CHAR = CARACT ## Retorna o caractere especificado pelo número de código +CLEAN = TIRAR ## Remove todos os caracteres do texto que não podem ser impressos +CODE = CÓDIGO ## Retorna um código numérico para o primeiro caractere de uma seqüência de caracteres de texto +CONCATENATE = CONCATENAR ## Agrupa vários itens de texto em um único item de texto +DOLLAR = MOEDA ## Converte um número em texto, usando o formato de moeda $ (dólar) +EXACT = EXATO ## Verifica se dois valores de texto são idênticos +FIND = PROCURAR ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) +FINDB = PROCURARB ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) +FIXED = DEF.NÚM.DEC ## Formata um número como texto com um número fixo de decimais +JIS = JIS ## Altera letras do inglês ou katakana de meia largura (byte único) dentro de uma seqüência de caracteres para caracteres de largura total (bytes duplos) +LEFT = ESQUERDA ## Retorna os caracteres mais à esquerda de um valor de texto +LEFTB = ESQUERDAB ## Retorna os caracteres mais à esquerda de um valor de texto +LEN = NÚM.CARACT ## Retorna o número de caracteres em uma seqüência de texto +LENB = NÚM.CARACTB ## Retorna o número de caracteres em uma seqüência de texto +LOWER = MINÚSCULA ## Converte texto para minúsculas +MID = EXT.TEXTO ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada +MIDB = EXT.TEXTOB ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada +PHONETIC = FONÉTICA ## Extrai os caracteres fonéticos (furigana) de uma seqüência de caracteres de texto +PROPER = PRI.MAIÚSCULA ## Coloca a primeira letra de cada palavra em maiúscula em um valor de texto +REPLACE = MUDAR ## Muda os caracteres dentro do texto +REPLACEB = MUDARB ## Muda os caracteres dentro do texto +REPT = REPT ## Repete o texto um determinado número de vezes +RIGHT = DIREITA ## Retorna os caracteres mais à direita de um valor de texto +RIGHTB = DIREITAB ## Retorna os caracteres mais à direita de um valor de texto +SEARCH = LOCALIZAR ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) +SEARCHB = LOCALIZARB ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) +SUBSTITUTE = SUBSTITUIR ## Substitui um novo texto por um texto antigo em uma seqüência de texto +T = T ## Converte os argumentos em texto +TEXT = TEXTO ## Formata um número e o converte em texto +TRIM = ARRUMAR ## Remove espaços do texto +UPPER = MAIÚSCULA ## Converte o texto em maiúsculas +VALUE = VALOR ## Converte um argumento de texto em um número diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/config new file mode 100644 index 000000000..595ee9683 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NULO! +DIV0 = #DIV/0! +VALUE = #VALOR! +REF = #REF! +NAME = #NOME? +NUM = #NÚM! +NA = #N/D diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/functions new file mode 100644 index 000000000..d8e9082f5 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/pt/functions @@ -0,0 +1,408 @@ +## +## Add-in and Automation functions Funções de Suplemento e Automatização +## +GETPIVOTDATA = OBTERDADOSDIN ## Devolve dados armazenados num relatório de Tabela Dinâmica + + +## +## Cube functions Funções de cubo +## +CUBEKPIMEMBER = MEMBROKPICUBO ## Devolve o nome, propriedade e medição de um KPI (key performance indicator) e apresenta o nome e a propriedade na célula. Um KPI é uma medida quantificável, como, por exemplo, o lucro mensal bruto ou a rotatividade trimestral de pessoal, utilizada para monitorizar o desempenho de uma organização. +CUBEMEMBER = MEMBROCUBO ## Devolve um membro ou cadeia de identificação numa hierarquia de cubo. Utilizada para validar a existência do membro ou cadeia de identificação no cubo. +CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Devolve o valor de uma propriedade de membro no cubo. Utilizada para validar a existência de um nome de membro no cubo e para devolver a propriedade especificada para esse membro. +CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Devolve o enésimo ou a classificação mais alta num conjunto. Utilizada para devolver um ou mais elementos num conjunto, tal como o melhor vendedor ou os 10 melhores alunos. +CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou cadeias de identificação enviando uma expressão de conjunto para o cubo no servidor, que cria o conjunto e, em seguida, devolve o conjunto ao Microsoft Office Excel. +CUBESETCOUNT = CONTARCONJUNTOCUBO ## Devolve o número de itens num conjunto. +CUBEVALUE = VALORCUBO ## Devolve um valor agregado do cubo. + + +## +## Database functions Funções de base de dados +## +DAVERAGE = BDMÉDIA ## Devolve a média das entradas da base de dados seleccionadas +DCOUNT = BDCONTAR ## Conta as células que contêm números numa base de dados +DCOUNTA = BDCONTAR.VAL ## Conta as células que não estejam em branco numa base de dados +DGET = BDOBTER ## Extrai de uma base de dados um único registo que corresponde aos critérios especificados +DMAX = BDMÃX ## Devolve o valor máximo das entradas da base de dados seleccionadas +DMIN = BDMÃN ## Devolve o valor mínimo das entradas da base de dados seleccionadas +DPRODUCT = BDMULTIPL ## Multiplica os valores de um determinado campo de registos que correspondem aos critérios numa base de dados +DSTDEV = BDDESVPAD ## Calcula o desvio-padrão com base numa amostra de entradas da base de dados seleccionadas +DSTDEVP = BDDESVPADP ## Calcula o desvio-padrão com base na população total das entradas da base de dados seleccionadas +DSUM = BDSOMA ## Adiciona os números na coluna de campo dos registos de base de dados que correspondem aos critérios +DVAR = BDVAR ## Calcula a variância com base numa amostra das entradas de base de dados seleccionadas +DVARP = BDVARP ## Calcula a variância com base na população total das entradas de base de dados seleccionadas + + +## +## Date and time functions Funções de data e hora +## +DATE = DATA ## Devolve o número de série de uma determinada data +DATEVALUE = DATA.VALOR ## Converte uma data em forma de texto num número de série +DAY = DIA ## Converte um número de série num dia do mês +DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base num ano com 360 dias +EDATE = DATAM ## Devolve um número de série de data que corresponde ao número de meses indicado antes ou depois da data de início +EOMONTH = FIMMÊS ## Devolve o número de série do último dia do mês antes ou depois de um número de meses especificado +HOUR = HORA ## Converte um número de série numa hora +MINUTE = MINUTO ## Converte um número de série num minuto +MONTH = MÊS ## Converte um número de série num mês +NETWORKDAYS = DIATRABALHOTOTAL ## Devolve o número total de dias úteis entre duas datas +NOW = AGORA ## Devolve o número de série da data e hora actuais +SECOND = SEGUNDO ## Converte um número de série num segundo +TIME = TEMPO ## Devolve o número de série de um determinado tempo +TIMEVALUE = VALOR.TEMPO ## Converte um tempo em forma de texto num número de série +TODAY = HOJE ## Devolve o número de série da data actual +WEEKDAY = DIA.SEMANA ## Converte um número de série num dia da semana +WEEKNUM = NÚMSEMANA ## Converte um número de série num número que representa o número da semana num determinado ano +WORKDAY = DIA.TRABALHO ## Devolve o número de série da data antes ou depois de um número de dias úteis especificado +YEAR = ANO ## Converte um número de série num ano +YEARFRAC = FRACÇÃOANO ## Devolve a fracção de ano que representa o número de dias inteiros entre a data_de_início e a data_de_fim + + +## +## Engineering functions Funções de engenharia +## +BESSELI = BESSELI ## Devolve a função de Bessel modificada In(x) +BESSELJ = BESSELJ ## Devolve a função de Bessel Jn(x) +BESSELK = BESSELK ## Devolve a função de Bessel modificada Kn(x) +BESSELY = BESSELY ## Devolve a função de Bessel Yn(x) +BIN2DEC = BINADEC ## Converte um número binário em decimal +BIN2HEX = BINAHEX ## Converte um número binário em hexadecimal +BIN2OCT = BINAOCT ## Converte um número binário em octal +COMPLEX = COMPLEXO ## Converte coeficientes reais e imaginários num número complexo +CONVERT = CONVERTER ## Converte um número de um sistema de medida noutro +DEC2BIN = DECABIN ## Converte um número decimal em binário +DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal +DEC2OCT = DECAOCT ## Converte um número decimal em octal +DELTA = DELTA ## Testa se dois valores são iguais +ERF = FUNCERRO ## Devolve a função de erro +ERFC = FUNCERROCOMPL ## Devolve a função de erro complementar +GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite +HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário +HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal +HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal +IMABS = IMABS ## Devolve o valor absoluto (módulo) de um número complexo +IMAGINARY = IMAGINÃRIO ## Devolve o coeficiente imaginário de um número complexo +IMARGUMENT = IMARG ## Devolve o argumento Teta, um ângulo expresso em radianos +IMCONJUGATE = IMCONJ ## Devolve o conjugado complexo de um número complexo +IMCOS = IMCOS ## Devolve o co-seno de um número complexo +IMDIV = IMDIV ## Devolve o quociente de dois números complexos +IMEXP = IMEXP ## Devolve o exponencial de um número complexo +IMLN = IMLN ## Devolve o logaritmo natural de um número complexo +IMLOG10 = IMLOG10 ## Devolve o logaritmo de base 10 de um número complexo +IMLOG2 = IMLOG2 ## Devolve o logaritmo de base 2 de um número complexo +IMPOWER = IMPOT ## Devolve um número complexo elevado a uma potência inteira +IMPRODUCT = IMPROD ## Devolve o produto de números complexos +IMREAL = IMREAL ## Devolve o coeficiente real de um número complexo +IMSIN = IMSENO ## Devolve o seno de um número complexo +IMSQRT = IMRAIZ ## Devolve a raiz quadrada de um número complexo +IMSUB = IMSUBTR ## Devolve a diferença entre dois números complexos +IMSUM = IMSOMA ## Devolve a soma de números complexos +OCT2BIN = OCTABIN ## Converte um número octal em binário +OCT2DEC = OCTADEC ## Converte um número octal em decimal +OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal + + +## +## Financial functions Funções financeiras +## +ACCRINT = JUROSACUM ## Devolve os juros acumulados de um título que paga juros periódicos +ACCRINTM = JUROSACUMV ## Devolve os juros acumulados de um título que paga juros no vencimento +AMORDEGRC = AMORDEGRC ## Devolve a depreciação correspondente a cada período contabilístico utilizando um coeficiente de depreciação +AMORLINC = AMORLINC ## Devolve a depreciação correspondente a cada período contabilístico +COUPDAYBS = CUPDIASINLIQ ## Devolve o número de dias entre o início do período do cupão e a data de regularização +COUPDAYS = CUPDIAS ## Devolve o número de dias no período do cupão que contém a data de regularização +COUPDAYSNC = CUPDIASPRÓX ## Devolve o número de dias entre a data de regularização e a data do cupão seguinte +COUPNCD = CUPDATAPRÓX ## Devolve a data do cupão seguinte após a data de regularização +COUPNUM = CUPNÚM ## Devolve o número de cupões a serem pagos entre a data de regularização e a data de vencimento +COUPPCD = CUPDATAANT ## Devolve a data do cupão anterior antes da data de regularização +CUMIPMT = PGTOJURACUM ## Devolve os juros cumulativos pagos entre dois períodos +CUMPRINC = PGTOCAPACUM ## Devolve o capital cumulativo pago a título de empréstimo entre dois períodos +DB = BD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas fixas +DDB = BDD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas duplas ou qualquer outro método especificado +DISC = DESC ## Devolve a taxa de desconto de um título +DOLLARDE = MOEDADEC ## Converte um preço em unidade monetária, expresso como uma fracção, num preço em unidade monetária, expresso como um número decimal +DOLLARFR = MOEDAFRA ## Converte um preço em unidade monetária, expresso como um número decimal, num preço em unidade monetária, expresso como uma fracção +DURATION = DURAÇÃO ## Devolve a duração anual de um título com pagamentos de juros periódicos +EFFECT = EFECTIVA ## Devolve a taxa de juros anual efectiva +FV = VF ## Devolve o valor futuro de um investimento +FVSCHEDULE = VFPLANO ## Devolve o valor futuro de um capital inicial após a aplicação de uma série de taxas de juro compostas +INTRATE = TAXAJUROS ## Devolve a taxa de juros de um título investido na totalidade +IPMT = IPGTO ## Devolve o pagamento dos juros de um investimento durante um determinado período +IRR = TIR ## Devolve a taxa de rentabilidade interna para uma série de fluxos monetários +ISPMT = É.PGTO ## Calcula os juros pagos durante um período específico de um investimento +MDURATION = MDURAÇÃO ## Devolve a duração modificada de Macauley de um título com um valor de paridade equivalente a € 100 +MIRR = MTIR ## Devolve a taxa interna de rentabilidade em que os fluxos monetários positivos e negativos são financiados com taxas diferentes +NOMINAL = NOMINAL ## Devolve a taxa de juros nominal anual +NPER = NPER ## Devolve o número de períodos de um investimento +NPV = VAL ## Devolve o valor actual líquido de um investimento com base numa série de fluxos monetários periódicos e numa taxa de desconto +ODDFPRICE = PREÇOPRIMINC ## Devolve o preço por € 100 do valor nominal de um título com um período inicial incompleto +ODDFYIELD = LUCROPRIMINC ## Devolve o lucro de um título com um período inicial incompleto +ODDLPRICE = PREÇOÚLTINC ## Devolve o preço por € 100 do valor nominal de um título com um período final incompleto +ODDLYIELD = LUCROÚLTINC ## Devolve o lucro de um título com um período final incompleto +PMT = PGTO ## Devolve o pagamento periódico de uma anuidade +PPMT = PPGTO ## Devolve o pagamento sobre o capital de um investimento num determinado período +PRICE = PREÇO ## Devolve o preço por € 100 do valor nominal de um título que paga juros periódicos +PRICEDISC = PREÇODESC ## Devolve o preço por € 100 do valor nominal de um título descontado +PRICEMAT = PREÇOVENC ## Devolve o preço por € 100 do valor nominal de um título que paga juros no vencimento +PV = VA ## Devolve o valor actual de um investimento +RATE = TAXA ## Devolve a taxa de juros por período de uma anuidade +RECEIVED = RECEBER ## Devolve o montante recebido no vencimento de um título investido na totalidade +SLN = AMORT ## Devolve uma depreciação linear de um activo durante um período +SYD = AMORTD ## Devolve a depreciação por algarismos da soma dos anos de um activo durante um período especificado +TBILLEQ = OTN ## Devolve o lucro de um título equivalente a uma Obrigação do Tesouro +TBILLPRICE = OTNVALOR ## Devolve o preço por € 100 de valor nominal de uma Obrigação do Tesouro +TBILLYIELD = OTNLUCRO ## Devolve o lucro de uma Obrigação do Tesouro +VDB = BDV ## Devolve a depreciação de um activo relativo a um período específico ou parcial utilizando um método de quotas degressivas +XIRR = XTIR ## Devolve a taxa interna de rentabilidade de um plano de fluxos monetários que não seja necessariamente periódica +XNPV = XVAL ## Devolve o valor actual líquido de um plano de fluxos monetários que não seja necessariamente periódico +YIELD = LUCRO ## Devolve o lucro de um título que paga juros periódicos +YIELDDISC = LUCRODESC ## Devolve o lucro anual de um título emitido abaixo do valor nominal, por exemplo, uma Obrigação do Tesouro +YIELDMAT = LUCROVENC ## Devolve o lucro anual de um título que paga juros na data de vencimento + + +## +## Information functions Funções de informação +## +CELL = CÉL ## Devolve informações sobre a formatação, localização ou conteúdo de uma célula +ERROR.TYPE = TIPO.ERRO ## Devolve um número correspondente a um tipo de erro +INFO = INFORMAÇÃO ## Devolve informações sobre o ambiente de funcionamento actual +ISBLANK = É.CÉL.VAZIA ## Devolve VERDADEIRO se o valor estiver em branco +ISERR = É.ERROS ## Devolve VERDADEIRO se o valor for um valor de erro diferente de #N/D +ISERROR = É.ERRO ## Devolve VERDADEIRO se o valor for um valor de erro +ISEVEN = ÉPAR ## Devolve VERDADEIRO se o número for par +ISLOGICAL = É.LÓGICO ## Devolve VERDADEIRO se o valor for lógico +ISNA = É.NÃO.DISP ## Devolve VERDADEIRO se o valor for o valor de erro #N/D +ISNONTEXT = É.NÃO.TEXTO ## Devolve VERDADEIRO se o valor não for texto +ISNUMBER = É.NÚM ## Devolve VERDADEIRO se o valor for um número +ISODD = ÉÃMPAR ## Devolve VERDADEIRO se o número for ímpar +ISREF = É.REF ## Devolve VERDADEIRO se o valor for uma referência +ISTEXT = É.TEXTO ## Devolve VERDADEIRO se o valor for texto +N = N ## Devolve um valor convertido num número +NA = NÃO.DISP ## Devolve o valor de erro #N/D +TYPE = TIPO ## Devolve um número que indica o tipo de dados de um valor + + +## +## Logical functions Funções lógicas +## +AND = E ## Devolve VERDADEIRO se todos os respectivos argumentos corresponderem a VERDADEIRO +FALSE = FALSO ## Devolve o valor lógico FALSO +IF = SE ## Especifica um teste lógico a ser executado +IFERROR = SE.ERRO ## Devolve um valor definido pelo utilizador se ocorrer um erro na fórmula, e devolve o resultado da fórmula se não ocorrer nenhum erro +NOT = NÃO ## Inverte a lógica do respectivo argumento +OR = OU ## Devolve VERDADEIRO se qualquer argumento for VERDADEIRO +TRUE = VERDADEIRO ## Devolve o valor lógico VERDADEIRO + + +## +## Lookup and reference functions Funções de pesquisa e referência +## +ADDRESS = ENDEREÇO ## Devolve uma referência a uma única célula numa folha de cálculo como texto +AREAS = ÃREAS ## Devolve o número de áreas numa referência +CHOOSE = SELECCIONAR ## Selecciona um valor a partir de uma lista de valores +COLUMN = COL ## Devolve o número da coluna de uma referência +COLUMNS = COLS ## Devolve o número de colunas numa referência +HLOOKUP = PROCH ## Procura na linha superior de uma matriz e devolve o valor da célula indicada +HYPERLINK = HIPERLIGAÇÃO ## Cria um atalho ou hiperligação que abre um documento armazenado num servidor de rede, numa intranet ou na Internet +INDEX = ÃNDICE ## Utiliza um índice para escolher um valor de uma referência ou de uma matriz +INDIRECT = INDIRECTO ## Devolve uma referência indicada por um valor de texto +LOOKUP = PROC ## Procura valores num vector ou numa matriz +MATCH = CORRESP ## Procura valores numa referência ou numa matriz +OFFSET = DESLOCAMENTO ## Devolve o deslocamento de referência de uma determinada referência +ROW = LIN ## Devolve o número da linha de uma referência +ROWS = LINS ## Devolve o número de linhas numa referência +RTD = RTD ## Obtém dados em tempo real a partir de um programa que suporte automatização COM (automatização: modo de trabalhar com objectos de uma aplicação a partir de outra aplicação ou ferramenta de desenvolvimento. Anteriormente conhecida como automatização OLE, a automatização é uma norma da indústria de software e uma funcionalidade COM (Component Object Model).) +TRANSPOSE = TRANSPOR ## Devolve a transposição de uma matriz +VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e percorre a linha para devolver o valor de uma célula + + +## +## Math and trigonometry functions Funções matemáticas e trigonométricas +## +ABS = ABS ## Devolve o valor absoluto de um número +ACOS = ACOS ## Devolve o arco de co-seno de um número +ACOSH = ACOSH ## Devolve o co-seno hiperbólico inverso de um número +ASIN = ASEN ## Devolve o arco de seno de um número +ASINH = ASENH ## Devolve o seno hiperbólico inverso de um número +ATAN = ATAN ## Devolve o arco de tangente de um número +ATAN2 = ATAN2 ## Devolve o arco de tangente das coordenadas x e y +ATANH = ATANH ## Devolve a tangente hiperbólica inversa de um número +CEILING = ARRED.EXCESSO ## Arredonda um número para o número inteiro mais próximo ou para o múltiplo de significância mais próximo +COMBIN = COMBIN ## Devolve o número de combinações de um determinado número de objectos +COS = COS ## Devolve o co-seno de um número +COSH = COSH ## Devolve o co-seno hiperbólico de um número +DEGREES = GRAUS ## Converte radianos em graus +EVEN = PAR ## Arredonda um número por excesso para o número inteiro mais próximo +EXP = EXP ## Devolve e elevado à potência de um determinado número +FACT = FACTORIAL ## Devolve o factorial de um número +FACTDOUBLE = FACTDUPLO ## Devolve o factorial duplo de um número +FLOOR = ARRED.DEFEITO ## Arredonda um número por defeito até zero +GCD = MDC ## Devolve o maior divisor comum +INT = INT ## Arredonda um número por defeito para o número inteiro mais próximo +LCM = MMC ## Devolve o mínimo múltiplo comum +LN = LN ## Devolve o logaritmo natural de um número +LOG = LOG ## Devolve o logaritmo de um número com uma base especificada +LOG10 = LOG10 ## Devolve o logaritmo de base 10 de um número +MDETERM = MATRIZ.DETERM ## Devolve o determinante matricial de uma matriz +MINVERSE = MATRIZ.INVERSA ## Devolve o inverso matricial de uma matriz +MMULT = MATRIZ.MULT ## Devolve o produto matricial de duas matrizes +MOD = RESTO ## Devolve o resto da divisão +MROUND = MARRED ## Devolve um número arredondado para o múltiplo pretendido +MULTINOMIAL = POLINOMIAL ## Devolve o polinomial de um conjunto de números +ODD = ÃMPAR ## Arredonda por excesso um número para o número inteiro ímpar mais próximo +PI = PI ## Devolve o valor de pi +POWER = POTÊNCIA ## Devolve o resultado de um número elevado a uma potência +PRODUCT = PRODUTO ## Multiplica os respectivos argumentos +QUOTIENT = QUOCIENTE ## Devolve a parte inteira de uma divisão +RADIANS = RADIANOS ## Converte graus em radianos +RAND = ALEATÓRIO ## Devolve um número aleatório entre 0 e 1 +RANDBETWEEN = ALEATÓRIOENTRE ## Devolve um número aleatório entre os números especificados +ROMAN = ROMANO ## Converte um número árabe em romano, como texto +ROUND = ARRED ## Arredonda um número para um número de dígitos especificado +ROUNDDOWN = ARRED.PARA.BAIXO ## Arredonda um número por defeito até zero +ROUNDUP = ARRED.PARA.CIMA ## Arredonda um número por excesso, afastando-o de zero +SERIESSUM = SOMASÉRIE ## Devolve a soma de uma série de potências baseada na fórmula +SIGN = SINAL ## Devolve o sinal de um número +SIN = SEN ## Devolve o seno de um determinado ângulo +SINH = SENH ## Devolve o seno hiperbólico de um número +SQRT = RAIZQ ## Devolve uma raiz quadrada positiva +SQRTPI = RAIZPI ## Devolve a raiz quadrada de (núm * pi) +SUBTOTAL = SUBTOTAL ## Devolve um subtotal numa lista ou base de dados +SUM = SOMA ## Adiciona os respectivos argumentos +SUMIF = SOMA.SE ## Adiciona as células especificadas por um determinado critério +SUMIFS = SOMA.SE.S ## Adiciona as células num intervalo que cumpre vários critérios +SUMPRODUCT = SOMARPRODUTO ## Devolve a soma dos produtos de componentes de matrizes correspondentes +SUMSQ = SOMARQUAD ## Devolve a soma dos quadrados dos argumentos +SUMX2MY2 = SOMAX2DY2 ## Devolve a soma da diferença dos quadrados dos valores correspondentes em duas matrizes +SUMX2PY2 = SOMAX2SY2 ## Devolve a soma da soma dos quadrados dos valores correspondentes em duas matrizes +SUMXMY2 = SOMAXMY2 ## Devolve a soma dos quadrados da diferença dos valores correspondentes em duas matrizes +TAN = TAN ## Devolve a tangente de um número +TANH = TANH ## Devolve a tangente hiperbólica de um número +TRUNC = TRUNCAR ## Trunca um número para um número inteiro + + +## +## Statistical functions Funções estatísticas +## +AVEDEV = DESV.MÉDIO ## Devolve a média aritmética dos desvios absolutos à média dos pontos de dados +AVERAGE = MÉDIA ## Devolve a média dos respectivos argumentos +AVERAGEA = MÉDIAA ## Devolve uma média dos respectivos argumentos, incluindo números, texto e valores lógicos +AVERAGEIF = MÉDIA.SE ## Devolve a média aritmética de todas as células num intervalo que cumprem determinado critério +AVERAGEIFS = MÉDIA.SE.S ## Devolve a média aritmética de todas as células que cumprem múltiplos critérios +BETADIST = DISTBETA ## Devolve a função de distribuição cumulativa beta +BETAINV = BETA.ACUM.INV ## Devolve o inverso da função de distribuição cumulativa relativamente a uma distribuição beta específica +BINOMDIST = DISTRBINOM ## Devolve a probabilidade de distribuição binomial de termo individual +CHIDIST = DIST.CHI ## Devolve a probabilidade unicaudal da distribuição qui-quadrada +CHIINV = INV.CHI ## Devolve o inverso da probabilidade unicaudal da distribuição qui-quadrada +CHITEST = TESTE.CHI ## Devolve o teste para independência +CONFIDENCE = INT.CONFIANÇA ## Devolve o intervalo de confiança correspondente a uma média de população +CORREL = CORREL ## Devolve o coeficiente de correlação entre dois conjuntos de dados +COUNT = CONTAR ## Conta os números que existem na lista de argumentos +COUNTA = CONTAR.VAL ## Conta os valores que existem na lista de argumentos +COUNTBLANK = CONTAR.VAZIO ## Conta o número de células em branco num intervalo +COUNTIF = CONTAR.SE ## Calcula o número de células num intervalo que corresponde aos critérios determinados +COUNTIFS = CONTAR.SE.S ## Conta o número de células num intervalo que cumprem múltiplos critérios +COVAR = COVAR ## Devolve a covariância, que é a média dos produtos de desvios de pares +CRITBINOM = CRIT.BINOM ## Devolve o menor valor em que a distribuição binomial cumulativa é inferior ou igual a um valor de critério +DEVSQ = DESVQ ## Devolve a soma dos quadrados dos desvios +EXPONDIST = DISTEXPON ## Devolve a distribuição exponencial +FDIST = DISTF ## Devolve a distribuição da probabilidade F +FINV = INVF ## Devolve o inverso da distribuição da probabilidade F +FISHER = FISHER ## Devolve a transformação Fisher +FISHERINV = FISHERINV ## Devolve o inverso da transformação Fisher +FORECAST = PREVISÃO ## Devolve um valor ao longo de uma tendência linear +FREQUENCY = FREQUÊNCIA ## Devolve uma distribuição de frequência como uma matriz vertical +FTEST = TESTEF ## Devolve o resultado de um teste F +GAMMADIST = DISTGAMA ## Devolve a distribuição gama +GAMMAINV = INVGAMA ## Devolve o inverso da distribuição gama cumulativa +GAMMALN = LNGAMA ## Devolve o logaritmo natural da função gama, Γ(x) +GEOMEAN = MÉDIA.GEOMÉTRICA ## Devolve a média geométrica +GROWTH = CRESCIMENTO ## Devolve valores ao longo de uma tendência exponencial +HARMEAN = MÉDIA.HARMÓNICA ## Devolve a média harmónica +HYPGEOMDIST = DIST.HIPERGEOM ## Devolve a distribuição hipergeométrica +INTERCEPT = INTERCEPTAR ## Devolve a intercepção da linha de regressão linear +KURT = CURT ## Devolve a curtose de um conjunto de dados +LARGE = MAIOR ## Devolve o maior valor k-ésimo de um conjunto de dados +LINEST = PROJ.LIN ## Devolve os parâmetros de uma tendência linear +LOGEST = PROJ.LOG ## Devolve os parâmetros de uma tendência exponencial +LOGINV = INVLOG ## Devolve o inverso da distribuição normal logarítmica +LOGNORMDIST = DIST.NORMALLOG ## Devolve a distribuição normal logarítmica cumulativa +MAX = MÃXIMO ## Devolve o valor máximo numa lista de argumentos +MAXA = MÃXIMOA ## Devolve o valor máximo numa lista de argumentos, incluindo números, texto e valores lógicos +MEDIAN = MED ## Devolve a mediana dos números indicados +MIN = MÃNIMO ## Devolve o valor mínimo numa lista de argumentos +MINA = MÃNIMOA ## Devolve o valor mínimo numa lista de argumentos, incluindo números, texto e valores lógicos +MODE = MODA ## Devolve o valor mais comum num conjunto de dados +NEGBINOMDIST = DIST.BIN.NEG ## Devolve a distribuição binominal negativa +NORMDIST = DIST.NORM ## Devolve a distribuição cumulativa normal +NORMINV = INV.NORM ## Devolve o inverso da distribuição cumulativa normal +NORMSDIST = DIST.NORMP ## Devolve a distribuição cumulativa normal padrão +NORMSINV = INV.NORMP ## Devolve o inverso da distribuição cumulativa normal padrão +PEARSON = PEARSON ## Devolve o coeficiente de correlação momento/produto de Pearson +PERCENTILE = PERCENTIL ## Devolve o k-ésimo percentil de valores num intervalo +PERCENTRANK = ORDEM.PERCENTUAL ## Devolve a ordem percentual de um valor num conjunto de dados +PERMUT = PERMUTAR ## Devolve o número de permutações de um determinado número de objectos +POISSON = POISSON ## Devolve a distribuição de Poisson +PROB = PROB ## Devolve a probabilidade dos valores num intervalo se encontrarem entre dois limites +QUARTILE = QUARTIL ## Devolve o quartil de um conjunto de dados +RANK = ORDEM ## Devolve a ordem de um número numa lista numérica +RSQ = RQUAD ## Devolve o quadrado do coeficiente de correlação momento/produto de Pearson +SKEW = DISTORÇÃO ## Devolve a distorção de uma distribuição +SLOPE = DECLIVE ## Devolve o declive da linha de regressão linear +SMALL = MENOR ## Devolve o menor valor de k-ésimo de um conjunto de dados +STANDARDIZE = NORMALIZAR ## Devolve um valor normalizado +STDEV = DESVPAD ## Calcula o desvio-padrão com base numa amostra +STDEVA = DESVPADA ## Calcula o desvio-padrão com base numa amostra, incluindo números, texto e valores lógicos +STDEVP = DESVPADP ## Calcula o desvio-padrão com base na população total +STDEVPA = DESVPADPA ## Calcula o desvio-padrão com base na população total, incluindo números, texto e valores lógicos +STEYX = EPADYX ## Devolve o erro-padrão do valor de y previsto para cada x na regressão +TDIST = DISTT ## Devolve a distribuição t de Student +TINV = INVT ## Devolve o inverso da distribuição t de Student +TREND = TENDÊNCIA ## Devolve valores ao longo de uma tendência linear +TRIMMEAN = MÉDIA.INTERNA ## Devolve a média do interior de um conjunto de dados +TTEST = TESTET ## Devolve a probabilidade associada ao teste t de Student +VAR = VAR ## Calcula a variância com base numa amostra +VARA = VARA ## Calcula a variância com base numa amostra, incluindo números, texto e valores lógicos +VARP = VARP ## Calcula a variância com base na população total +VARPA = VARPA ## Calcula a variância com base na população total, incluindo números, texto e valores lógicos +WEIBULL = WEIBULL ## Devolve a distribuição Weibull +ZTEST = TESTEZ ## Devolve o valor de probabilidade unicaudal de um teste-z + + +## +## Text functions Funções de texto +## +ASC = ASC ## Altera letras ou katakana de largura total (byte duplo) numa cadeia de caracteres para caracteres de largura média (byte único) +BAHTTEXT = TEXTO.BAHT ## Converte um número em texto, utilizando o formato monetário ß (baht) +CHAR = CARÃCT ## Devolve o carácter especificado pelo número de código +CLEAN = LIMPAR ## Remove do texto todos os caracteres não imprimíveis +CODE = CÓDIGO ## Devolve um código numérico correspondente ao primeiro carácter numa cadeia de texto +CONCATENATE = CONCATENAR ## Agrupa vários itens de texto num único item de texto +DOLLAR = MOEDA ## Converte um número em texto, utilizando o formato monetário € (Euro) +EXACT = EXACTO ## Verifica se dois valores de texto são idênticos +FIND = LOCALIZAR ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) +FINDB = LOCALIZARB ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) +FIXED = FIXA ## Formata um número como texto com um número fixo de decimais +JIS = JIS ## Altera letras ou katakana de largura média (byte único) numa cadeia de caracteres para caracteres de largura total (byte duplo) +LEFT = ESQUERDA ## Devolve os caracteres mais à esquerda de um valor de texto +LEFTB = ESQUERDAB ## Devolve os caracteres mais à esquerda de um valor de texto +LEN = NÚM.CARACT ## Devolve o número de caracteres de uma cadeia de texto +LENB = NÚM.CARACTB ## Devolve o número de caracteres de uma cadeia de texto +LOWER = MINÚSCULAS ## Converte o texto em minúsculas +MID = SEG.TEXTO ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada +MIDB = SEG.TEXTOB ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada +PHONETIC = FONÉTICA ## Retira os caracteres fonéticos (furigana) de uma cadeia de texto +PROPER = INICIAL.MAIÚSCULA ## Coloca em maiúsculas a primeira letra de cada palavra de um valor de texto +REPLACE = SUBSTITUIR ## Substitui caracteres no texto +REPLACEB = SUBSTITUIRB ## Substitui caracteres no texto +REPT = REPETIR ## Repete texto um determinado número de vezes +RIGHT = DIREITA ## Devolve os caracteres mais à direita de um valor de texto +RIGHTB = DIREITAB ## Devolve os caracteres mais à direita de um valor de texto +SEARCH = PROCURAR ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) +SEARCHB = PROCURARB ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) +SUBSTITUTE = SUBST ## Substitui texto novo por texto antigo numa cadeia de texto +T = T ## Converte os respectivos argumentos em texto +TEXT = TEXTO ## Formata um número e converte-o em texto +TRIM = COMPACTAR ## Remove espaços do texto +UPPER = MAIÚSCULAS ## Converte texto em maiúsculas +VALUE = VALOR ## Converte um argumento de texto num número diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/ru/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/ru/config new file mode 100644 index 000000000..aa7e68578 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/ru/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = Ñ€ + + +## +## Excel Error Codes (For future use) +## +NULL = #ПУСТО! +DIV0 = #ДЕЛ/0! +VALUE = #ЗÐÐЧ! +REF = #ССЫЛ! +NAME = #ИМЯ? +NUM = #ЧИСЛО! +NA = #Ð/Д diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/ru/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/ru/functions new file mode 100644 index 000000000..f37afc249 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/ru/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from information provided by web-junior (http://www.web-junior.net/) +## +## + + +## +## Add-in and Automation functions Функции надÑтроек и автоматизации +## +GETPIVOTDATA = ПОЛУЧИТЬ.ДÐÐÐЫЕ.СВОДÐОЙ.ТÐБЛИЦЫ ## Возвращает данные, хранÑщиеÑÑ Ð² отчете Ñводной таблицы. + + +## +## Cube functions Функции Куб +## +CUBEKPIMEMBER = КУБЭЛЕМЕÐТКИП ## Возвращает ÑвойÑтво ключевого индикатора производительноÑти «(КИП)» и отображает Ð¸Ð¼Ñ Â«ÐšÐ˜ÐŸÂ» в Ñчейке. «КИП» предÑтавлÑет Ñобой количеÑтвенную величину, такую как ежемеÑÑÑ‡Ð½Ð°Ñ Ð²Ð°Ð»Ð¾Ð²Ð°Ñ Ð¿Ñ€Ð¸Ð±Ñ‹Ð»ÑŒ или ÐµÐ¶ÐµÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚ÐµÐºÑƒÑ‡ÐµÑть кадров, иÑпользуемой Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑффективноÑти работы организации. +CUBEMEMBER = КУБЭЛЕМЕÐТ ## Возвращает Ñлемент или кортеж из куба. ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлемента или кортежа в кубе. +CUBEMEMBERPROPERTY = КУБСВОЙСТВОЭЛЕМЕÐТР## Возвращает значение ÑвойÑтва Ñлемента из куба. ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñлемента в кубе и возвращает указанное ÑвойÑтво Ð´Ð»Ñ Ñтого Ñлемента. +CUBERANKEDMEMBER = КУБПОРЭЛЕМЕÐТ ## Возвращает n-ый или ранжированный Ñлемент в множеÑтво. ИÑпользуетÑÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких Ñлементов в множеÑтво, например, лучшего продавца или 10 лучших Ñтудентов. +CUBESET = КУБМÐОЖ ## ОпределÑет вычиÑлительное множеÑтво Ñлементов или кортежей, отправлÑÑ Ð½Ð° Ñервер выражение, которое Ñоздает множеÑтво, а затем возвращает его в Microsoft Office Excel. +CUBESETCOUNT = КУБЧИСЛОЭЛМÐОЖ ## Возвращает чиÑло Ñлементов множеÑтва. +CUBEVALUE = КУБЗÐÐЧЕÐИЕ ## Возвращает обобщенное значение из куба. + + +## +## Database functions Функции Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ данных +## +DAVERAGE = ДСРЗÐÐЧ ## Возвращает Ñреднее значение выбранных запиÑей базы данных. +DCOUNT = БСЧÐТ ## ПодÑчитывает количеÑтво чиÑловых Ñчеек в базе данных. +DCOUNTA = БСЧÐТР## ПодÑчитывает количеÑтво непуÑтых Ñчеек в базе данных. +DGET = БИЗВЛЕЧЬ ## Извлекает из базы данных одну запиÑÑŒ, удовлетворÑющую заданному уÑловию. +DMAX = ДМÐКС ## Возвращает макÑимальное значение Ñреди выделенных запиÑей базы данных. +DMIN = ДМИР## Возвращает минимальное значение Ñреди выделенных запиÑей базы данных. +DPRODUCT = БДПРОИЗВЕД ## Перемножает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ Ð² запиÑÑÑ… базы данных, удовлетворÑющих уÑловию. +DSTDEV = ДСТÐÐДОТКЛ ## Оценивает Ñтандартное отклонение по выборке Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… запиÑей базы данных. +DSTDEVP = ДСТÐÐДОТКЛП ## ВычиÑлÑет Ñтандартное отклонение по генеральной ÑовокупноÑти Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… запиÑей базы данных +DSUM = БДСУММ ## Суммирует чиÑла в поле Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñей базы данных, удовлетворÑющих уÑловию. +DVAR = БДДИСП ## Оценивает диÑперÑию по выборке из выделенных запиÑей базы данных +DVARP = БДДИСПП ## ВычиÑлÑет диÑперÑию по генеральной ÑовокупноÑти Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… запиÑей базы данных + + +## +## Date and time functions Функции даты и времени +## +DATE = ДÐТР## Возвращает заданную дату в чиÑловом формате. +DATEVALUE = ДÐТÐЗÐÐЧ ## Преобразует дату из текÑтового формата в чиÑловой формат. +DAY = ДЕÐЬ ## Преобразует дату в чиÑловом формате в день меÑÑца. +DAYS360 = ДÐЕЙ360 ## ВычиÑлÑет количеÑтво дней между Ð´Ð²ÑƒÐ¼Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸ на оÑнове 360-дневного года. +EDATE = ДÐТÐМЕС ## Возвращает дату в чиÑловом формате, отÑтоÑщую на заданное чиÑло меÑÑцев вперед или назад от начальной даты. +EOMONTH = КОÐМЕСЯЦР## Возвращает дату в чиÑловом формате Ð´Ð»Ñ Ð¿Ð¾Ñледнего Ð´Ð½Ñ Ð¼ÐµÑÑца, отÑтоÑщего вперед или назад на заданное чиÑло меÑÑцев. +HOUR = ЧÐС ## Преобразует дату в чиÑловом формате в чаÑÑ‹. +MINUTE = МИÐУТЫ ## Преобразует дату в чиÑловом формате в минуты. +MONTH = МЕСЯЦ ## Преобразует дату в чиÑловом формате в меÑÑцы. +NETWORKDAYS = ЧИСТРÐБДÐИ ## Возвращает количеÑтво рабочих дней между Ð´Ð²ÑƒÐ¼Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸. +NOW = ТДÐТР## Возвращает текущую дату и Ð²Ñ€ÐµÐ¼Ñ Ð² чиÑловом формате. +SECOND = СЕКУÐДЫ ## Преобразует дату в чиÑловом формате в Ñекунды. +TIME = ВРЕМЯ ## Возвращает заданное Ð²Ñ€ÐµÐ¼Ñ Ð² чиÑловом формате. +TIMEVALUE = ВРЕМЗÐÐЧ ## Преобразует Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð· текÑтового формата в чиÑловой формат. +TODAY = СЕГОДÐЯ ## Возвращает текущую дату в чиÑловом формате. +WEEKDAY = ДЕÐЬÐЕД ## Преобразует дату в чиÑловом формате в день недели. +WEEKNUM = ÐОМÐЕДЕЛИ ## Преобразует чиÑловое предÑтавление в чиÑло, которое указывает, на какую неделю года приходитÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°. +WORKDAY = РÐБДЕÐЬ ## Возвращает дату в чиÑловом формате, отÑтоÑщую вперед или назад на заданное количеÑтво рабочих дней. +YEAR = ГОД ## Преобразует дату в чиÑловом формате в год. +YEARFRAC = ДОЛЯГОДР## Возвращает долю года, которую ÑоÑтавлÑет количеÑтво дней между начальной и конечной датами. + + +## +## Engineering functions Инженерные функции +## +BESSELI = БЕССЕЛЬ.I ## Возвращает модифицированную функцию БеÑÑÐµÐ»Ñ In(x). +BESSELJ = БЕССЕЛЬ.J ## Возвращает функцию БеÑÑÐµÐ»Ñ Jn(x). +BESSELK = БЕССЕЛЬ.K ## Возвращает модифицированную функцию БеÑÑÐµÐ»Ñ Kn(x). +BESSELY = БЕССЕЛЬ.Y ## Возвращает функцию БеÑÑÐµÐ»Ñ Yn(x). +BIN2DEC = ДВ.Ð’.ДЕС ## Преобразует двоичное чиÑло в деÑÑтичное. +BIN2HEX = ДВ.Ð’.ШЕСТР## Преобразует двоичное чиÑло в шеÑтнадцатеричное. +BIN2OCT = ДВ.Ð’.ВОСЬМ ## Преобразует двоичное чиÑло в воÑьмеричное. +COMPLEX = КОМПЛЕКСР## Преобразует коÑффициенты при вещеÑтвенной и мнимой чаÑÑ‚ÑÑ… комплекÑного чиÑла в комплекÑное чиÑло. +CONVERT = ПРЕОБР ## Преобразует чиÑло из одной ÑиÑтемы единиц Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð² другую. +DEC2BIN = ДЕС.Ð’.ДВ ## Преобразует деÑÑтичное чиÑло в двоичное. +DEC2HEX = ДЕС.Ð’.ШЕСТР## Преобразует деÑÑтичное чиÑло в шеÑтнадцатеричное. +DEC2OCT = ДЕС.Ð’.ВОСЬМ ## Преобразует деÑÑтичное чиÑло в воÑьмеричное. +DELTA = ДЕЛЬТР## ПроверÑет равенÑтво двух значений. +ERF = ФОШ ## Возвращает функцию ошибки. +ERFC = ДФОШ ## Возвращает дополнительную функцию ошибки. +GESTEP = ПОРОГ ## ПроверÑет, не превышает ли данное чиÑло порогового значениÑ. +HEX2BIN = ШЕСТÐ.Ð’.ДВ ## Преобразует шеÑтнадцатеричное чиÑло в двоичное. +HEX2DEC = ШЕСТÐ.Ð’.ДЕС ## Преобразует шеÑтнадцатеричное чиÑло в деÑÑтичное. +HEX2OCT = ШЕСТÐ.Ð’.ВОСЬМ ## Преобразует шеÑтнадцатеричное чиÑло в воÑьмеричное. +IMABS = МÐИМ.ABS ## Возвращает абÑолютную величину (модуль) комплекÑного чиÑла. +IMAGINARY = МÐИМ.ЧÐСТЬ ## Возвращает коÑффициент при мнимой чаÑти комплекÑного чиÑла. +IMARGUMENT = МÐИМ.ÐРГУМЕÐТ ## Возвращает значение аргумента комплекÑного чиÑла (тета) — угол, выраженный в радианах. +IMCONJUGATE = МÐИМ.СОПРЯЖ ## Возвращает комплекÑно-ÑопрÑженное комплекÑное чиÑло. +IMCOS = МÐИМ.COS ## Возвращает коÑÐ¸Ð½ÑƒÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑного чиÑла. +IMDIV = МÐИМ.ДЕЛ ## Возвращает чаÑтное от Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð²ÑƒÑ… комплекÑных чиÑел. +IMEXP = МÐИМ.EXP ## Возвращает ÑкÑпоненту комплекÑного чиÑла. +IMLN = МÐИМ.LN ## Возвращает натуральный логарифм комплекÑного чиÑла. +IMLOG10 = МÐИМ.LOG10 ## Возвращает обычный (деÑÑтичный) логарифм комплекÑного чиÑла. +IMLOG2 = МÐИМ.LOG2 ## Возвращает двоичный логарифм комплекÑного чиÑла. +IMPOWER = МÐИМ.СТЕПЕÐЬ ## Возвращает комплекÑное чиÑло, возведенное в целую Ñтепень. +IMPRODUCT = МÐИМ.ПРОИЗВЕД ## Возвращает произведение от 2 до 29 комплекÑных чиÑел. +IMREAL = МÐИМ.ВЕЩ ## Возвращает коÑффициент при вещеÑтвенной чаÑти комплекÑного чиÑла. +IMSIN = МÐИМ.SIN ## Возвращает ÑÐ¸Ð½ÑƒÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑного чиÑла. +IMSQRT = МÐИМ.КОРЕÐЬ ## Возвращает значение квадратного ÐºÐ¾Ñ€Ð½Ñ Ð¸Ð· комплекÑного чиÑла. +IMSUB = МÐИМ.РÐЗР## Возвращает разноÑть двух комплекÑных чиÑел. +IMSUM = МÐИМ.СУММ ## Возвращает Ñумму комплекÑных чиÑел. +OCT2BIN = ВОСЬМ.Ð’.ДВ ## Преобразует воÑьмеричное чиÑло в двоичное. +OCT2DEC = ВОСЬМ.Ð’.ДЕС ## Преобразует воÑьмеричное чиÑло в деÑÑтичное. +OCT2HEX = ВОСЬМ.Ð’.ШЕСТР## Преобразует воÑьмеричное чиÑло в шеÑтнадцатеричное. + + +## +## Financial functions ФинанÑовые функции +## +ACCRINT = ÐÐКОПДОХОД ## Возвращает накопленный процент по ценным бумагам Ñ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑкой выплатой процентов. +ACCRINTM = ÐÐКОПДОХОДПОГÐШ ## Возвращает накопленный процент по ценным бумагам, проценты по которым выплачиваютÑÑ Ð² Ñрок погашениÑ. +AMORDEGRC = ÐМОРУМ ## Возвращает величину амортизации Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ периода, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ñффициент амортизации. +AMORLINC = ÐМОРУВ ## Возвращает величину амортизации Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ периода. +COUPDAYBS = ДÐЕЙКУПОÐДО ## Возвращает количеÑтво дней от начала дейÑÑ‚Ð²Ð¸Ñ ÐºÑƒÐ¿Ð¾Ð½Ð° до даты ÑоглашениÑ. +COUPDAYS = ДÐЕЙКУПОР## Возвращает чиÑло дней в периоде купона, Ñодержащем дату ÑоглашениÑ. +COUPDAYSNC = ДÐЕЙКУПОÐПОСЛЕ ## Возвращает чиÑло дней от даты ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾ Ñрока Ñледующего купона. +COUPNCD = ДÐТÐКУПОÐПОСЛЕ ## Возвращает Ñледующую дату купона поÑле даты ÑоглашениÑ. +COUPNUM = ЧИСЛКУПОР## Возвращает количеÑтво купонов, которые могут быть оплачены между датой ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¸ Ñроком вÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð² Ñилу. +COUPPCD = ДÐТÐКУПОÐДО ## Возвращает предыдущую дату купона перед датой ÑоглашениÑ. +CUMIPMT = ОБЩПЛÐТ ## Возвращает общую выплату, произведенную между Ð´Ð²ÑƒÐ¼Ñ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑкими выплатами. +CUMPRINC = ОБЩДОХОД ## Возвращает общую выплату по займу между Ð´Ð²ÑƒÐ¼Ñ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð¼Ð¸. +DB = ФУО ## Возвращает величину амортизации актива Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ периода, раÑÑчитанную методом фикÑированного ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¾Ñтатка. +DDB = ДДОБ ## Возвращает величину амортизации актива за данный период, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼ÐµÑ‚Ð¾Ð´ двойного ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¾Ñтатка или иной Ñвно указанный метод. +DISC = СКИДКР## Возвращает норму Ñкидки Ð´Ð»Ñ Ñ†ÐµÐ½Ð½Ñ‹Ñ… бумаг. +DOLLARDE = РУБЛЬ.ДЕС ## Преобразует цену в рублÑÑ…, выраженную в виде дроби, в цену в рублÑÑ…, выраженную деÑÑтичным чиÑлом. +DOLLARFR = РУБЛЬ.ДРОБЬ ## Преобразует цену в рублÑÑ…, выраженную деÑÑтичным чиÑлом, в цену в рублÑÑ…, выраженную в виде дроби. +DURATION = ДЛИТ ## Возвращает ежегодную продолжительноÑть дейÑÑ‚Ð²Ð¸Ñ Ñ†ÐµÐ½Ð½Ñ‹Ñ… бумаг Ñ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑкими выплатами по процентам. +EFFECT = ЭФФЕКТ ## Возвращает дейÑтвующие ежегодные процентные Ñтавки. +FV = БС ## Возвращает будущую ÑтоимоÑть инвеÑтиции. +FVSCHEDULE = БЗРÐСПИС ## Возвращает будущую ÑтоимоÑть первоначальной оÑновной Ñуммы поÑле начиÑÐ»ÐµÐ½Ð¸Ñ Ñ€Ñда Ñложных процентов. +INTRATE = ИÐОРМР## Возвращает процентную Ñтавку Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью инвеÑтированных ценных бумаг. +IPMT = ПРПЛТ ## Возвращает величину выплаты прибыли на Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° данный период. +IRR = ВСД ## Возвращает внутреннюю Ñтавку доходноÑти Ð´Ð»Ñ Ñ€Ñда потоков денежных ÑредÑтв. +ISPMT = ПРОЦПЛÐТ ## ВычиÑлÑет выплаты за указанный период инвеÑтиции. +MDURATION = МДЛИТ ## Возвращает модифицированную длительноÑть ÐœÐ°ÐºÐ¾Ð»ÐµÑ Ð´Ð»Ñ Ñ†ÐµÐ½Ð½Ñ‹Ñ… бумаг Ñ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÐ¼Ð¾Ð¹ номинальной ÑтоимоÑтью 100 рублей. +MIRR = МВСД ## Возвращает внутреннюю Ñтавку доходноÑти, при которой положительные и отрицательные денежные потоки имеют разные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтавки. +NOMINAL = ÐОМИÐÐЛ ## Возвращает номинальную годовую процентную Ñтавку. +NPER = КПЕР ## Возвращает общее количеÑтво периодов выплаты Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ вклада. +NPV = ЧПС ## Возвращает чиÑтую приведенную ÑтоимоÑть инвеÑтиции, оÑнованной на Ñерии периодичеÑких денежных потоков и Ñтавке диÑконтированиÑ. +ODDFPRICE = ЦЕÐÐПЕРВÐЕРЕГ ## Возвращает цену за 100 рублей нарицательной ÑтоимоÑти ценных бумаг Ñ Ð½ÐµÑ€ÐµÐ³ÑƒÐ»Ñрным первым периодом. +ODDFYIELD = ДОХОДПЕРВÐЕРЕГ ## Возвращает доход по ценным бумагам Ñ Ð½ÐµÑ€ÐµÐ³ÑƒÐ»Ñрным первым периодом. +ODDLPRICE = ЦЕÐÐПОСЛÐЕРЕГ ## Возвращает цену за 100 рублей нарицательной ÑтоимоÑти ценных бумаг Ñ Ð½ÐµÑ€ÐµÐ³ÑƒÐ»Ñрным поÑледним периодом. +ODDLYIELD = ДОХОДПОСЛÐЕРЕГ ## Возвращает доход по ценным бумагам Ñ Ð½ÐµÑ€ÐµÐ³ÑƒÐ»Ñрным поÑледним периодом. +PMT = ПЛТ ## Возвращает величину выплаты за один период аннуитета. +PPMT = ОСПЛТ ## Возвращает величину выплат в погашение оÑновной Ñуммы по инвеÑтиции за заданный период. +PRICE = ЦЕÐÐ ## Возвращает цену за 100 рублей нарицательной ÑтоимоÑти ценных бумаг, по которым производитÑÑ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð²Ñ‹Ð¿Ð»Ð°Ñ‚Ð° процентов. +PRICEDISC = ЦЕÐÐСКИДКР## Возвращает цену за 100 рублей номинальной ÑтоимоÑти ценных бумаг, на которые Ñделана Ñкидка. +PRICEMAT = ЦЕÐÐПОГÐШ ## Возвращает цену за 100 рублей номинальной ÑтоимоÑти ценных бумаг, проценты по которым выплачиваютÑÑ Ð² Ñрок погашениÑ. +PV = ПС ## Возвращает приведенную (к текущему моменту) ÑтоимоÑть инвеÑтиции. +RATE = СТÐВКР## Возвращает процентную Ñтавку по аннуитету за один период. +RECEIVED = ПОЛУЧЕÐО ## Возвращает Ñумму, полученную к Ñроку Ð¿Ð¾Ð³Ð°ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью обеÑпеченных ценных бумаг. +SLN = ÐПЛ ## Возвращает величину линейной амортизации актива за один период. +SYD = ÐСЧ ## Возвращает величину амортизации актива за данный период, раÑÑчитанную методом Ñуммы годовых чиÑел. +TBILLEQ = РÐÐ’ÐОКЧЕК ## Возвращает Ñквивалентный облигации доход по казначейÑкому чеку. +TBILLPRICE = ЦЕÐÐКЧЕК ## Возвращает цену за 100 рублей нарицательной ÑтоимоÑти Ð´Ð»Ñ ÐºÐ°Ð·Ð½Ð°Ñ‡ÐµÐ¹Ñкого чека. +TBILLYIELD = ДОХОДКЧЕК ## Возвращает доход по казначейÑкому чеку. +VDB = ПУО ## Возвращает величину амортизации актива Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ или чаÑтичного периода при иÑпользовании метода ÑокращающегоÑÑ Ð±Ð°Ð»Ð°Ð½Ñа. +XIRR = ЧИСТВÐДОХ ## Возвращает внутреннюю Ñтавку доходноÑти Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ð¸ÐºÐ° денежных потоков, которые не обÑзательно ноÑÑÑ‚ периодичеÑкий характер. +XNPV = ЧИСТÐЗ ## Возвращает чиÑтую приведенную ÑтоимоÑть Ð´Ð»Ñ Ð´ÐµÐ½ÐµÐ¶Ð½Ñ‹Ñ… потоков, которые не обÑзательно ÑвлÑÑŽÑ‚ÑÑ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑкими. +YIELD = ДОХОД ## Возвращает доход от ценных бумаг, по которым производÑÑ‚ÑÑ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑкие выплаты процентов. +YIELDDISC = ДОХОДСКИДКР## Возвращает годовой доход по ценным бумагам, на которые Ñделана Ñкидка (пример — казначейÑкие чеки). +YIELDMAT = ДОХОДПОГÐШ ## Возвращает годовой доход от ценных бумаг, проценты по которым выплачиваютÑÑ Ð² Ñрок погашениÑ. + + +## +## Information functions Информационные функции +## +CELL = ЯЧЕЙКР## Возвращает информацию о формате, раÑположении или Ñодержимом Ñчейки. +ERROR.TYPE = ТИП.ОШИБКИ ## Возвращает чиÑловой код, ÑоответÑтвующий типу ошибки. +INFO = ИÐФОРМ ## Возвращает информацию о текущей операционной Ñреде. +ISBLANK = ЕПУСТО ## Возвращает значение ИСТИÐÐ, еÑли аргумент ÑвлÑетÑÑ ÑÑылкой на пуÑтую Ñчейку. +ISERR = ЕОШ ## Возвращает значение ИСТИÐÐ, еÑли аргумент ÑÑылаетÑÑ Ð½Ð° любое значение ошибки, кроме #Ð/Д. +ISERROR = ЕОШИБКР## Возвращает значение ИСТИÐÐ, еÑли аргумент ÑÑылаетÑÑ Ð½Ð° любое значение ошибки. +ISEVEN = ЕЧÐТР## Возвращает значение ИСТИÐÐ, еÑли значение аргумента ÑвлÑетÑÑ Ñ‡ÐµÑ‚Ð½Ñ‹Ð¼ чиÑлом. +ISLOGICAL = ЕЛОГИЧ ## Возвращает значение ИСТИÐÐ, еÑли аргумент ÑÑылаетÑÑ Ð½Ð° логичеÑкое значение. +ISNA = ЕÐД ## Возвращает значение ИСТИÐÐ, еÑли аргумент ÑÑылаетÑÑ Ð½Ð° значение ошибки #Ð/Д. +ISNONTEXT = ЕÐЕТЕКСТ ## Возвращает значение ИСТИÐÐ, еÑли значение аргумента не ÑвлÑетÑÑ Ñ‚ÐµÐºÑтом. +ISNUMBER = ЕЧИСЛО ## Возвращает значение ИСТИÐÐ, еÑли аргумент ÑÑылаетÑÑ Ð½Ð° чиÑло. +ISODD = ЕÐЕЧÐТ ## Возвращает значение ИСТИÐÐ, еÑли значение аргумента ÑвлÑетÑÑ Ð½ÐµÑ‡ÐµÑ‚Ð½Ñ‹Ð¼ чиÑлом. +ISREF = ЕССЫЛКР## Возвращает значение ИСТИÐÐ, еÑли значение аргумента ÑвлÑетÑÑ ÑÑылкой. +ISTEXT = ЕТЕКСТ ## Возвращает значение ИСТИÐÐ, еÑли значение аргумента ÑвлÑетÑÑ Ñ‚ÐµÐºÑтом. +N = Ч ## Возвращает значение, преобразованное в чиÑло. +NA = ÐД ## Возвращает значение ошибки #Ð/Д. +TYPE = ТИП ## Возвращает чиÑло, обозначающее тип данных значениÑ. + + +## +## Logical functions ЛогичеÑкие функции +## +AND = И ## Renvoie VRAI si tous ses arguments sont VRAI. +FALSE = ЛОЖЬ ## Возвращает логичеÑкое значение ЛОЖЬ. +IF = ЕСЛИ ## ВыполнÑет проверку уÑловиÑ. +IFERROR = ЕСЛИОШИБКР## Возвращает введённое значение, еÑли вычиÑление по формуле вызывает ошибку; в противном Ñлучае Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ результат вычиÑлениÑ. +NOT = ÐЕ ## МенÑет логичеÑкое значение Ñвоего аргумента на противоположное. +OR = ИЛИ ## Возвращает значение ИСТИÐÐ, еÑли Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один аргумент имеет значение ИСТИÐÐ. +TRUE = ИСТИÐÐ ## Возвращает логичеÑкое значение ИСТИÐÐ. + + +## +## Lookup and reference functions Функции ÑÑылки и поиÑка +## +ADDRESS = ÐДРЕС ## Возвращает ÑÑылку на отдельную Ñчейку лиÑта в виде текÑта. +AREAS = ОБЛÐСТИ ## Возвращает количеÑтво облаÑтей в ÑÑылке. +CHOOSE = ВЫБОР ## Выбирает значение из ÑпиÑка значений по индекÑу. +COLUMN = СТОЛБЕЦ ## Возвращает номер Ñтолбца, на который указывает ÑÑылка. +COLUMNS = ЧИСЛСТОЛБ ## Возвращает количеÑтво Ñтолбцов в ÑÑылке. +HLOOKUP = ГПР ## Ищет в первой Ñтроке маÑÑива и возвращает значение отмеченной Ñчейки +HYPERLINK = ГИПЕРССЫЛКР## Создает ÑÑылку, открывающую документ, который находитÑÑ Ð½Ð° Ñервере Ñети, в интраÑети или в Интернете. +INDEX = ИÐДЕКС ## ИÑпользует Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑылки или маÑÑива. +INDIRECT = ДВССЫЛ ## Возвращает ÑÑылку, заданную текÑтовым значением. +LOOKUP = ПРОСМОТР ## Ищет Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² векторе или маÑÑиве. +MATCH = ПОИСКПОЗ ## Ищет Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² ÑÑылке или маÑÑиве. +OFFSET = СМЕЩ ## Возвращает Ñмещение ÑÑылки отноÑительно заданной ÑÑылки. +ROW = СТРОКР## Возвращает номер Ñтроки, определÑемой ÑÑылкой. +ROWS = ЧСТРОК ## Возвращает количеÑтво Ñтрок в ÑÑылке. +RTD = ДРВ ## Извлекает данные реального времени из программ, поддерживающих автоматизацию COM (Программирование объектов. Стандартное ÑредÑтво Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸ некоторого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· другого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑредÑтва разработки. Программирование объектов (ранее называемое программированием OLE) ÑвлÑетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ модели COM (Component Object Model, модель компонентных объектов).). +TRANSPOSE = ТРÐÐСП ## Возвращает транÑпонированный маÑÑив. +VLOOKUP = ВПР ## Ищет значение в первом Ñтолбце маÑÑива и возвращает значение из Ñчейки в найденной Ñтроке и указанном Ñтолбце. + + +## +## Math and trigonometry functions МатематичеÑкие и тригонометричеÑкие функции +## +ABS = ABS ## Возвращает модуль (абÑолютную величину) чиÑла. +ACOS = ACOS ## Возвращает арккоÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +ACOSH = ACOSH ## Возвращает гиперболичеÑкий арккоÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +ASIN = ASIN ## Возвращает аркÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +ASINH = ASINH ## Возвращает гиперболичеÑкий аркÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +ATAN = ATAN ## Возвращает Ð°Ñ€ÐºÑ‚Ð°Ð½Ð³ÐµÐ½Ñ Ñ‡Ð¸Ñла. +ATAN2 = ATAN2 ## Возвращает Ð°Ñ€ÐºÑ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… координат x и y. +ATANH = ATANH ## Возвращает гиперболичеÑкий Ð°Ñ€ÐºÑ‚Ð°Ð½Ð³ÐµÐ½Ñ Ñ‡Ð¸Ñла. +CEILING = ОКРВВЕРХ ## ОкруглÑет чиÑло до ближайшего целого или до ближайшего кратного указанному значению. +COMBIN = ЧИСЛКОМБ ## Возвращает количеÑтво комбинаций Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ чиÑла объектов. +COS = COS ## Возвращает коÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +COSH = COSH ## Возвращает гиперболичеÑкий коÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +DEGREES = ГРÐДУСЫ ## Преобразует радианы в градуÑÑ‹. +EVEN = ЧÐТР## ОкруглÑет чиÑло до ближайшего четного целого. +EXP = EXP ## Возвращает чиÑло e, возведенное в указанную Ñтепень. +FACT = ФÐКТР ## Возвращает факториал чиÑла. +FACTDOUBLE = ДВФÐКТР ## Возвращает двойной факториал чиÑла. +FLOOR = ОКРВÐИЗ ## ОкруглÑет чиÑло до ближайшего меньшего по модулю значениÑ. +GCD = ÐОД ## Возвращает наибольший общий делитель. +INT = ЦЕЛОЕ ## ОкруглÑет чиÑло до ближайшего меньшего целого. +LCM = ÐОК ## Возвращает наименьшее общее кратное. +LN = LN ## Возвращает натуральный логарифм чиÑла. +LOG = LOG ## Возвращает логарифм чиÑла по заданному оÑнованию. +LOG10 = LOG10 ## Возвращает деÑÑтичный логарифм чиÑла. +MDETERM = МОПРЕД ## Возвращает определитель матрицы маÑÑива. +MINVERSE = МОБР ## Возвращает обратную матрицу маÑÑива. +MMULT = МУМÐОЖ ## Возвращает произведение матриц двух маÑÑивов. +MOD = ОСТÐТ ## Возвращает оÑтаток от делениÑ. +MROUND = ОКРУГЛТ ## Возвращает чиÑло, округленное Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð¾Ð¹ точноÑтью. +MULTINOMIAL = МУЛЬТИÐОМ ## Возвращает мультиномиальный коÑффициент множеÑтва чиÑел. +ODD = ÐЕЧÐТ ## ОкруглÑет чиÑло до ближайшего нечетного целого. +PI = ПИ ## Возвращает чиÑло пи. +POWER = СТЕПЕÐЬ ## Возвращает результат Ð²Ð¾Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ‡Ð¸Ñла в Ñтепень. +PRODUCT = ПРОИЗВЕД ## Возвращает произведение аргументов. +QUOTIENT = ЧÐСТÐОЕ ## Возвращает целую чаÑть чаÑтного при делении. +RADIANS = РÐДИÐÐЫ ## Преобразует градуÑÑ‹ в радианы. +RAND = СЛЧИС ## Возвращает Ñлучайное чиÑло в интервале от 0 до 1. +RANDBETWEEN = СЛУЧМЕЖДУ ## Возвращает Ñлучайное чиÑло в интервале между Ð´Ð²ÑƒÐ¼Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ чиÑлами. +ROMAN = РИМСКОЕ ## Преобразует арабÑкие цифры в римÑкие в виде текÑта. +ROUND = ОКРУГЛ ## ОкруглÑет чиÑло до указанного количеÑтва деÑÑтичных разрÑдов. +ROUNDDOWN = ОКРУГЛВÐИЗ ## ОкруглÑет чиÑло до ближайшего меньшего по модулю значениÑ. +ROUNDUP = ОКРУГЛВВЕРХ ## ОкруглÑет чиÑло до ближайшего большего по модулю значениÑ. +SERIESSUM = РЯД.СУММ ## Возвращает Ñумму Ñтепенного Ñ€Ñда, вычиÑленную по формуле. +SIGN = ЗÐÐК ## Возвращает знак чиÑла. +SIN = SIN ## Возвращает ÑÐ¸Ð½ÑƒÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ угла. +SINH = SINH ## Возвращает гиперболичеÑкий ÑÐ¸Ð½ÑƒÑ Ñ‡Ð¸Ñла. +SQRT = КОРЕÐЬ ## Возвращает положительное значение квадратного корнÑ. +SQRTPI = КОРЕÐЬПИ ## Возвращает квадратный корень из Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (чиÑло * ПИ). +SUBTOTAL = ПРОМЕЖУТОЧÐЫЕ.ИТОГИ ## Возвращает промежуточный итог в ÑпиÑке или базе данных. +SUM = СУММ ## Суммирует аргументы. +SUMIF = СУММЕСЛИ ## Суммирует Ñчейки, удовлетворÑющие заданному уÑловию. +SUMIFS = СУММЕСЛИМР## Суммирует диапазон Ñчеек, удовлетворÑющих неÑкольким уÑловиÑм. +SUMPRODUCT = СУММПРОИЗВ ## Возвращает Ñумму произведений ÑоответÑтвующих Ñлементов маÑÑивов. +SUMSQ = СУММКВ ## Возвращает Ñумму квадратов аргументов. +SUMX2MY2 = СУММРÐЗÐКВ ## Возвращает Ñумму разноÑтей квадратов ÑоответÑтвующих значений в двух маÑÑивах. +SUMX2PY2 = СУММСУММКВ ## Возвращает Ñумму Ñумм квадратов ÑоответÑтвующих Ñлементов двух маÑÑивов. +SUMXMY2 = СУММКВРÐЗР## Возвращает Ñумму квадратов разноÑтей ÑоответÑтвующих значений в двух маÑÑивах. +TAN = TAN ## Возвращает Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ñ‡Ð¸Ñла. +TANH = TANH ## Возвращает гиперболичеÑкий Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ñ‡Ð¸Ñла. +TRUNC = ОТБР ## ОтбраÑывает дробную чаÑть чиÑла. + + +## +## Statistical functions СтатиÑтичеÑкие функции +## +AVEDEV = СРОТКЛ ## Возвращает Ñреднее арифметичеÑкое абÑолютных значений отклонений точек данных от Ñреднего. +AVERAGE = СРЗÐÐЧ ## Возвращает Ñреднее арифметичеÑкое аргументов. +AVERAGEA = СРЗÐÐЧР## Возвращает Ñреднее арифметичеÑкое аргументов, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +AVERAGEIF = СРЗÐÐЧЕСЛИ ## Возвращает Ñреднее значение (Ñреднее арифметичеÑкое) вÑех Ñчеек в диапазоне, которые удовлетворÑÑŽÑ‚ данному уÑловию. +AVERAGEIFS = СРЗÐÐЧЕСЛИМР## Возвращает Ñреднее значение (Ñреднее арифметичеÑкое) вÑех Ñчеек, которые удовлетворÑÑŽÑ‚ неÑкольким уÑловиÑм. +BETADIST = БЕТÐРÐСП ## Возвращает интегральную функцию бета-раÑпределениÑ. +BETAINV = БЕТÐОБР ## Возвращает обратную интегральную функцию указанного бета-раÑпределениÑ. +BINOMDIST = БИÐОМРÐСП ## Возвращает отдельное значение биномиального раÑпределениÑ. +CHIDIST = ХИ2РÐСП ## Возвращает одноÑтороннюю вероÑтноÑть раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ…Ð¸-квадрат. +CHIINV = ХИ2ОБР ## Возвращает обратное значение одноÑторонней вероÑтноÑти раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ…Ð¸-квадрат. +CHITEST = ХИ2ТЕСТ ## Возвращает теÑÑ‚ на незавиÑимоÑть. +CONFIDENCE = ДОВЕРИТ ## Возвращает доверительный интервал Ð´Ð»Ñ Ñреднего Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ генеральной ÑовокупноÑти. +CORREL = КОРРЕЛ ## Возвращает коÑффициент коррелÑции между Ð´Ð²ÑƒÐ¼Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтвами данных. +COUNT = СЧÐТ ## ПодÑчитывает количеÑтво чиÑел в ÑпиÑке аргументов. +COUNTA = СЧÐТЗ ## ПодÑчитывает количеÑтво значений в ÑпиÑке аргументов. +COUNTBLANK = СЧИТÐТЬПУСТОТЫ ## ПодÑчитывает количеÑтво пуÑтых Ñчеек в диапазоне +COUNTIF = СЧÐТЕСЛИ ## ПодÑчитывает количеÑтво Ñчеек в диапазоне, удовлетворÑющих заданному уÑловию +COUNTIFS = СЧÐТЕСЛИМР## ПодÑчитывает количеÑтво Ñчеек внутри диапазона, удовлетворÑющих неÑкольким уÑловиÑм. +COVAR = КОВÐР ## Возвращает ковариацию, Ñреднее произведений парных отклонений +CRITBINOM = КРИТБИÐОМ ## Возвращает наименьшее значение, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ интегральное биномиальное раÑпределение меньше или равно заданному критерию. +DEVSQ = КВÐДРОТКЛ ## Возвращает Ñумму квадратов отклонений. +EXPONDIST = ЭКСПРÐСП ## Возвращает ÑкÑпоненциальное раÑпределение. +FDIST = FРÐСП ## Возвращает F-раÑпределение вероÑтноÑти. +FINV = FРÐСПОБР ## Возвращает обратное значение Ð´Ð»Ñ F-раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ð¾ÑтноÑти. +FISHER = ФИШЕР ## Возвращает преобразование Фишера. +FISHERINV = ФИШЕРОБР ## Возвращает обратное преобразование Фишера. +FORECAST = ПРЕДСКÐЗ ## Возвращает значение линейного тренда. +FREQUENCY = ЧÐСТОТР## Возвращает раÑпределение чаÑтот в виде вертикального маÑÑива. +FTEST = ФТЕСТ ## Возвращает результат F-теÑта. +GAMMADIST = ГÐММÐРÐСП ## Возвращает гамма-раÑпределение. +GAMMAINV = ГÐММÐОБР ## Возвращает обратное гамма-раÑпределение. +GAMMALN = ГÐММÐÐЛОГ ## Возвращает натуральный логарифм гамма функции, Γ(x). +GEOMEAN = СРГЕОМ ## Возвращает Ñреднее геометричеÑкое. +GROWTH = РОСТ ## Возвращает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² ÑоответÑтвии Ñ ÑкÑпоненциальным трендом. +HARMEAN = СРГÐРМ ## Возвращает Ñреднее гармоничеÑкое. +HYPGEOMDIST = ГИПЕРГЕОМЕТ ## Возвращает гипергеометричеÑкое раÑпределение. +INTERCEPT = ОТРЕЗОК ## Возвращает отрезок, отÑекаемый на оÑи линией линейной регреÑÑии. +KURT = ЭКСЦЕСС ## Возвращает ÑкÑцеÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑтва данных. +LARGE = ÐÐИБОЛЬШИЙ ## Возвращает k-ое наибольшее значение в множеÑтве данных. +LINEST = ЛИÐЕЙР## Возвращает параметры линейного тренда. +LOGEST = ЛГРФПРИБЛ ## Возвращает параметры ÑкÑпоненциального тренда. +LOGINV = ЛОГÐОРМОБР ## Возвращает обратное логарифмичеÑкое нормальное раÑпределение. +LOGNORMDIST = ЛОГÐОРМРÐСП ## Возвращает интегральное логарифмичеÑкое нормальное раÑпределение. +MAX = МÐКС ## Возвращает наибольшее значение в ÑпиÑке аргументов. +MAXA = МÐКСР## Возвращает наибольшее значение в ÑпиÑке аргументов, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +MEDIAN = МЕДИÐÐÐ ## Возвращает медиану заданных чиÑел. +MIN = МИР## Возвращает наименьшее значение в ÑпиÑке аргументов. +MINA = МИÐÐ ## Возвращает наименьшее значение в ÑпиÑке аргументов, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +MODE = МОДР## Возвращает значение моды множеÑтва данных. +NEGBINOMDIST = ОТРБИÐОМРÐСП ## Возвращает отрицательное биномиальное раÑпределение. +NORMDIST = ÐОРМРÐСП ## Возвращает нормальную функцию раÑпределениÑ. +NORMINV = ÐОРМОБР ## Возвращает обратное нормальное раÑпределение. +NORMSDIST = ÐОРМСТРÐСП ## Возвращает Ñтандартное нормальное интегральное раÑпределение. +NORMSINV = ÐОРМСТОБР ## Возвращает обратное значение Ñтандартного нормального раÑпределениÑ. +PEARSON = ПИРСОР## Возвращает коÑффициент коррелÑции ПирÑона. +PERCENTILE = ПЕРСЕÐТИЛЬ ## Возвращает k-ую перÑентиль Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ диапазона. +PERCENTRANK = ПРОЦЕÐТРÐÐГ ## Возвращает процентную норму Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² множеÑтве данных. +PERMUT = ПЕРЕСТ ## Возвращает количеÑтво переÑтановок Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ чиÑла объектов. +POISSON = ПУÐССОР## Возвращает раÑпределение ПуаÑÑона. +PROB = ВЕРОЯТÐОСТЬ ## Возвращает вероÑтноÑть того, что значение из диапазона находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ заданных пределов. +QUARTILE = КВÐРТИЛЬ ## Возвращает квартиль множеÑтва данных. +RANK = РÐÐГ ## Возвращает ранг чиÑла в ÑпиÑке чиÑел. +RSQ = КВПИРСОР## Возвращает квадрат коÑффициента коррелÑции ПирÑона. +SKEW = СКОС ## Возвращает аÑимметрию раÑпределениÑ. +SLOPE = ÐÐКЛОР## Возвращает наклон линии линейной регреÑÑии. +SMALL = ÐÐИМЕÐЬШИЙ ## Возвращает k-ое наименьшее значение в множеÑтве данных. +STANDARDIZE = ÐОРМÐЛИЗÐЦИЯ ## Возвращает нормализованное значение. +STDEV = СТÐÐДОТКЛОР## Оценивает Ñтандартное отклонение по выборке. +STDEVA = СТÐÐДОТКЛОÐÐ ## Оценивает Ñтандартное отклонение по выборке, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +STDEVP = СТÐÐДОТКЛОÐП ## ВычиÑлÑет Ñтандартное отклонение по генеральной ÑовокупноÑти. +STDEVPA = СТÐÐДОТКЛОÐПР## ВычиÑлÑет Ñтандартное отклонение по генеральной ÑовокупноÑти, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +STEYX = СТОШYX ## Возвращает Ñтандартную ошибку предÑказанных значений y Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ x в регреÑÑии. +TDIST = СТЬЮДРÐСП ## Возвращает t-раÑпределение Стьюдента. +TINV = СТЬЮДРÐСПОБР ## Возвращает обратное t-раÑпределение Стьюдента. +TREND = ТЕÐДЕÐЦИЯ ## Возвращает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² ÑоответÑтвии Ñ Ð»Ð¸Ð½ÐµÐ¹Ð½Ñ‹Ð¼ трендом. +TRIMMEAN = УРЕЗСРЕДÐЕЕ ## Возвращает Ñреднее внутренноÑти множеÑтва данных. +TTEST = ТТЕСТ ## Возвращает вероÑтноÑть, ÑоответÑтвующую критерию Стьюдента. +VAR = ДИСП ## Оценивает диÑперÑию по выборке. +VARA = ДИСПР## Оценивает диÑперÑию по выборке, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +VARP = ДИСПР ## ВычиÑлÑет диÑперÑию Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ð»ÑŒÐ½Ð¾Ð¹ ÑовокупноÑти. +VARPA = ДИСПРР## ВычиÑлÑет диÑперÑию Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ð»ÑŒÐ½Ð¾Ð¹ ÑовокупноÑти, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð¸Ñла, текÑÑ‚ и логичеÑкие значениÑ. +WEIBULL = ВЕЙБУЛЛ ## Возвращает раÑпределение Вейбулла. +ZTEST = ZТЕСТ ## Возвращает двуÑтороннее P-значение z-теÑта. + + +## +## Text functions ТекÑтовые функции +## +ASC = ASC ## Ð”Ð»Ñ Ñзыков Ñ Ð´Ð²ÑƒÑ…Ð±Ð°Ð¹Ñ‚Ð¾Ð²Ñ‹Ð¼Ð¸ наборами знаков (например, катакана) преобразует полноширинные (двухбайтовые) знаки в полуширинные (однобайтовые). +BAHTTEXT = БÐТТЕКСТ ## Преобразует чиÑло в текÑÑ‚, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð´ÐµÐ½ÐµÐ¶Ð½Ñ‹Ð¹ формат ß (БÐТ). +CHAR = СИМВОЛ ## Возвращает знак Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ кодом. +CLEAN = ПЕЧСИМВ ## УдалÑет вÑе непечатаемые знаки из текÑта. +CODE = КОДСИМВ ## Возвращает чиÑловой код первого знака в текÑтовой Ñтроке. +CONCATENATE = СЦЕПИТЬ ## ОбъединÑет неÑколько текÑтовых Ñлементов в один. +DOLLAR = РУБЛЬ ## Преобразует чиÑло в текÑÑ‚, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð´ÐµÐ½ÐµÐ¶Ð½Ñ‹Ð¹ формат. +EXACT = СОВПÐД ## ПроверÑет идентичноÑть двух текÑтовых значений. +FIND = ÐÐЙТИ ## Ищет Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ текÑтового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² другом (Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра). +FINDB = ÐÐЙТИБ ## Ищет Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ текÑтового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² другом (Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра). +FIXED = ФИКСИРОВÐÐÐЫЙ ## Форматирует чиÑло и преобразует его в текÑÑ‚ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ чиÑлом деÑÑтичных знаков. +JIS = JIS ## Ð”Ð»Ñ Ñзыков Ñ Ð´Ð²ÑƒÑ…Ð±Ð°Ð¹Ñ‚Ð¾Ð²Ñ‹Ð¼Ð¸ наборами знаков (например, катакана) преобразует полуширинные (однобайтовые) знаки в текÑтовой Ñтроке в полноширинные (двухбайтовые). +LEFT = ЛЕВСИМВ ## Возвращает крайние Ñлева знаки текÑтового значениÑ. +LEFTB = ЛЕВБ ## Возвращает крайние Ñлева знаки текÑтового значениÑ. +LEN = ДЛСТР ## Возвращает количеÑтво знаков в текÑтовой Ñтроке. +LENB = ДЛИÐБ ## Возвращает количеÑтво знаков в текÑтовой Ñтроке. +LOWER = СТРОЧР## Преобразует вÑе буквы текÑта в Ñтрочные. +MID = ПСТР ## Возвращает заданное чиÑло знаков из Ñтроки текÑта, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ позиции. +MIDB = ПСТРБ ## Возвращает заданное чиÑло знаков из Ñтроки текÑта, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ позиции. +PHONETIC = PHONETIC ## Извлекает фонетичеÑкие (фуригана) знаки из текÑтовой Ñтроки. +PROPER = ПРОПÐÐЧ ## Преобразует первую букву в каждом Ñлове текÑта в пропиÑную. +REPLACE = ЗÐМЕÐИТЬ ## ЗаменÑет знаки в текÑте. +REPLACEB = ЗÐМЕÐИТЬБ ## ЗаменÑет знаки в текÑте. +REPT = ПОВТОР ## ПовторÑет текÑÑ‚ заданное чиÑло раз. +RIGHT = ПРÐВСИМВ ## Возвращает крайние Ñправа знаки текÑтовой Ñтроки. +RIGHTB = ПРÐВБ ## Возвращает крайние Ñправа знаки текÑтовой Ñтроки. +SEARCH = ПОИСК ## Ищет Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ текÑтового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² другом (без учета региÑтра). +SEARCHB = ПОИСКБ ## Ищет Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ текÑтового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² другом (без учета региÑтра). +SUBSTITUTE = ПОДСТÐВИТЬ ## ЗаменÑет в текÑтовой Ñтроке Ñтарый текÑÑ‚ новым. +T = Т ## Преобразует аргументы в текÑÑ‚. +TEXT = ТЕКСТ ## Форматирует чиÑло и преобразует его в текÑÑ‚. +TRIM = СЖПРОБЕЛЫ ## УдалÑет из текÑта пробелы. +UPPER = ПРОПИСР## Преобразует вÑе буквы текÑта в пропиÑные. +VALUE = ЗÐÐЧЕР## Преобразует текÑтовый аргумент в чиÑло. diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/sv/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/sv/config new file mode 100644 index 000000000..6a5977816 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/sv/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = kr + + +## +## Excel Error Codes (For future use) +## +NULL = #Skärning! +DIV0 = #Division/0! +VALUE = #Värdefel! +REF = #Referens! +NAME = #Namn? +NUM = #Ogiltigt! +NA = #Saknas! diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/sv/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/sv/functions new file mode 100644 index 000000000..b1dd99522 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/sv/functions @@ -0,0 +1,408 @@ +## +## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner +## +GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport + + +## +## Cube functions Kubfunktioner +## +CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mÃ¥tt för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mÃ¥tt, t.ex. mÃ¥natlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat. +CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben. +CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen. +CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna. +CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben pÃ¥ servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel. +CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning. +CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde frÃ¥n en kub. + + +## +## Database functions Databasfunktioner +## +DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna +DCOUNT = DANTAL ## Räknar antalet celler som innehÃ¥ller tal i en databas +DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas +DGET = DHÄMTA ## Hämtar en enstaka post frÃ¥n en databas som uppfyller de angivna villkoren +DMAX = DMAX ## Returnerar det största värdet frÃ¥n databasposterna +DMIN = DMIN ## Returnerar det minsta värdet frÃ¥n databasposterna +DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret +DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat pÃ¥ ett urval av databasposterna +DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrÃ¥n hela populationen av valda databasposter +DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret +DVAR = DVARIANS ## Uppskattar variansen baserat pÃ¥ ett urval av databasposterna +DVARP = DVARIANSP ## Beräknar variansen utifrÃ¥n hela populationen av valda databasposter + + +## +## Date and time functions Tid- och datumfunktioner +## +DATE = DATUM ## Returnerar ett serienummer för ett visst datum +DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer +DAY = DAG ## Konverterar ett serienummer till dag i mÃ¥naden +DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan tvÃ¥ datum baserat pÃ¥ ett 360-dagarsÃ¥r +EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal mÃ¥nader före eller efter startdatumet +EOMONTH = SLUTMÃ…NAD ## Returnerar serienumret för sista dagen i mÃ¥naden ett visst antal mÃ¥nader tidigare eller senare +HOUR = TIMME ## Konverterar ett serienummer till en timme +MINUTE = MINUT ## Konverterar ett serienummer till en minut +MONTH = MÃ…NAD ## Konverterar ett serienummer till en mÃ¥nad +NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan tvÃ¥ datum +NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid +SECOND = SEKUND ## Konverterar ett serienummer till en sekund +TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid +TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer +TODAY = IDAG ## Returnerar serienumret för dagens datum +WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan +WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer +WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare +YEAR = Ã…R ## Konverterar ett serienummer till ett Ã¥r +YEARFRAC = Ã…RDEL ## Returnerar en del av ett Ã¥r som representerar antalet hela dagar mellan start- och slutdatum + + +## +## Engineering functions Tekniska funktioner +## +BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x) +BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x) +BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x) +BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x) +BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt +BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt +BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt +COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal +CONVERT = KONVERTERA ## Omvandlar ett tal frÃ¥n ett mÃ¥ttsystem till ett annat +DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt +DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt +DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt +DELTA = DELTA ## Testar om tvÃ¥ värden är lika +ERF = FELF ## Returnerar felfunktionen +ERFC = FELFK ## Returnerar den komplementära felfunktionen +GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde +HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt +HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt +HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt +IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal +IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal +IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer +IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat +IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal +IMDIV = IMDIV ## Returnerar kvoten för tvÃ¥ komplexa tal +IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal +IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal +IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal +IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal +IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent +IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal +IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal +IMSIN = IMSIN ## Returnerar sinus för ett komplext tal +IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal +IMSUB = IMDIFF ## Returnerar differensen mellan tvÃ¥ komplexa tal +IMSUM = IMSUM ## Returnerar summan av komplexa tal +OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt +OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt +OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt + + +## +## Financial functions Finansiella funktioner +## +ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta +ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning pÃ¥ förfallodagen +AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient +AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod +COUPDAYBS = KUPDAGBB ## Returnerar antal dagar frÃ¥n början av kupongperioden till likviddagen +COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehÃ¥ller betalningsdatumet +COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar frÃ¥n betalningsdatumet till nästa kupongdatum +COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen +COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen +COUPPCD = KUPFKD ## Returnerar föregÃ¥ende kupongdatum före likviddagen +CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan tvÃ¥ perioder +CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats pÃ¥ ett lÃ¥n mellan tvÃ¥ perioder +DB = DB ## Returnerar avskrivningen för en tillgÃ¥ng under en angiven tid enligt metoden för fast degressiv avskrivning +DDB = DEGAVSKR ## Returnerar en tillgÃ¥ngs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller nÃ¥gon annan metod som du anger +DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper +DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett brÃ¥k till ett decimaltal +DOLLARFR = BRÃ…K ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett brÃ¥k +DURATION = LÖPTID ## Returnerar den Ã¥rliga löptiden för en säkerhet med periodiska räntebetalningar +EFFECT = EFFRÄNTA ## Returnerar den Ã¥rliga effektiva räntesatsen +FV = SLUTVÄRDE ## Returnerar det framtida värdet pÃ¥ en investering +FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat pÃ¥ olika räntenivÃ¥er +INTRATE = Ã…RSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper +IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period +IRR = IR ## Returnerar internräntan för en serie betalningar +ISPMT = RALÃ…N ## Beräknar räntan som har betalats under en specifik betalningsperiod +MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr +MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor +NOMINAL = NOMRÄNTA ## Returnerar den Ã¥rliga nominella räntesatsen +NPER = PERIODER ## Returnerar antalet perioder för en investering +NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta +ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period +ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period +ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period +ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period +PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet +PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period +PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta +PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper +PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta pÃ¥ förfallodagen +PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar +RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet +RECEIVED = BELOPP ## Returnerar beloppet som utdelas pÃ¥ förfallodagen för ett betalat värdepapper +SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgÃ¥ng under en period +SYD = Ã…RSAVSKR ## Returnerar den Ã¥rliga avskrivningssumman för en tillgÃ¥ng under en angiven period +TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel +TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel +TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel +VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgÃ¥ng under en angiven period (med degressiv avskrivning) +XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska +XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska +YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta +YIELDDISC = NOMAVKDISK ## Returnerar den Ã¥rliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel +YIELDMAT = NOMAVKFÖRF ## Returnerar den Ã¥rliga avkastningen för ett värdepapper som ger ränta pÃ¥ förfallodagen + + +## +## Information functions Informationsfunktioner +## +CELL = CELL ## Returnerar information om formatering, plats och innehÃ¥ll i en cell +ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde +INFO = INFO ## Returnerar information om operativsystemet +ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt +ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS! +ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde +ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt +ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde +ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS! +ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text +ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal +ISODD = ÄRUDDA ## Returnerar SANT om talet är udda +ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens +ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text +N = N ## Returnerar ett värde omvandlat till ett tal +NA = SAKNAS ## Returnerar felvärdet #SAKNAS! +TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp + + +## +## Logical functions Logiska funktioner +## +AND = OCH ## Returnerar SANT om alla argument är sanna +FALSE = FALSKT ## Returnerar det logiska värdet FALSKT +IF = OM ## Anger vilket logiskt test som ska utföras +IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln +NOT = ICKE ## Inverterar logiken för argumenten +OR = ELLER ## Returnerar SANT om nÃ¥got argument är SANT +TRUE = SANT ## Returnerar det logiska värdet SANT + + +## +## Lookup and reference functions Sök- och referensfunktioner +## +ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad +AREAS = OMRÃ…DEN ## Returnerar antalet omrÃ¥den i en referens +CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden +COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens +COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens +HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell +HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller pÃ¥ Internet +INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris +INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde +LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris +MATCH = PASSA ## Letar upp värden i en referens eller matris +OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhÃ¥llande till en given referens +ROW = RAD ## Returnerar radnumret för en referens +ROWS = RADER ## Returnerar antalet rader i en referens +RTD = RTD ## Hämtar realtidsdata frÃ¥n ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt frÃ¥n ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingÃ¥r i Component Object Model (COM).) +TRANSPOSE = TRANSPONERA ## Transponerar en matris +VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell + + +## +## Math and trigonometry functions Matematiska och trigonometriska funktioner +## +ABS = ABS ## Returnerar absolutvärdet av ett tal +ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal +ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal +ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal +ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal +ATAN = ARCTAN ## Returnerar arcus tangens för ett tal +ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat +ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal +CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel +COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt +COS = COS ## Returnerar cosinus för ett tal +COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal +DEGREES = GRADER ## Omvandlar radianer till grader +EVEN = JÄMN ## Avrundar ett tal uppÃ¥t till närmaste heltal +EXP = EXP ## Returnerar e upphöjt till ett givet tal +FACT = FAKULTET ## Returnerar fakulteten för ett tal +FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal +FLOOR = RUNDA.NED ## Avrundar ett tal nedÃ¥t mot noll +GCD = SGD ## Returnerar den största gemensamma nämnaren +INT = HELTAL ## Avrundar ett tal nedÃ¥t till närmaste heltal +LCM = MGM ## Returnerar den minsta gemensamma multipeln +LN = LN ## Returnerar den naturliga logaritmen för ett tal +LOG = LOG ## Returnerar logaritmen för ett tal för en given bas +LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal +MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris +MINVERSE = MINVERT ## Returnerar matrisinversen av en matris +MMULT = MMULT ## Returnerar matrisprodukten av tvÃ¥ matriser +MOD = REST ## Returnerar resten vid en division +MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel +MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal +ODD = UDDA ## Avrundar ett tal uppÃ¥t till närmaste udda heltal +PI = PI ## Returnerar värdet pi +POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent +PRODUCT = PRODUKT ## Multiplicerar argumenten +QUOTIENT = KVOT ## Returnerar heltalsdelen av en division +RADIANS = RADIANER ## Omvandlar grader till radianer +RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1 +RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger +ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text +ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror +ROUNDDOWN = AVRUNDA.NEDÃ…T ## Avrundar ett tal nedÃ¥t mot noll +ROUNDUP = AVRUNDA.UPPÃ…T ## Avrundar ett tal uppÃ¥t, frÃ¥n noll +SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat pÃ¥ formeln +SIGN = TECKEN ## Returnerar tecknet för ett tal +SIN = SIN ## Returnerar sinus för en given vinkel +SINH = SINH ## Returnerar hyperbolisk sinus för ett tal +SQRT = ROT ## Returnerar den positiva kvadratroten +SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi) +SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas +SUM = SUMMA ## Summerar argumenten +SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor +SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett omrÃ¥de som uppfyller flera kriterier +SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter +SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater +SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i tvÃ¥ matriser +SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i tvÃ¥ matriser +SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i tvÃ¥ matriser +TAN = TAN ## Returnerar tangens för ett tal +TANH = TANH ## Returnerar hyperbolisk tangens för ett tal +TRUNC = AVKORTA ## Avkortar ett tal till ett heltal + + +## +## Statistical functions Statistiska funktioner +## +AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse frÃ¥n deras medelvärde +AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten +AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden +AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett omrÃ¥de som uppfyller ett givet kriterium +AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor. +BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen +BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning +BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen +CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen +CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen +CHITEST = CHI2TEST ## Returnerar oberoendetesten +CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde +CORREL = KORREL ## Returnerar korrelationskoefficienten mellan tvÃ¥ datamängder +COUNT = ANTAL ## Räknar hur mÃ¥nga tal som finns bland argumenten +COUNTA = ANTALV ## Räknar hur mÃ¥nga värden som finns bland argumenten +COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett omrÃ¥de +COUNTIF = ANTAL.OM ## Räknar antalet celler i ett omrÃ¥de som uppfyller angivna villkor. +COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett omrÃ¥de som uppfyller flera villkor. +COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser +CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde +DEVSQ = KVADAVV ## Returnerar summan av kvadrater pÃ¥ avvikelser +EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen +FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen +FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen +FISHER = FISHER ## Returnerar Fisher-transformationen +FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen +FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje +FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris +FTEST = FTEST ## Returnerar resultatet av en F-test +GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen +GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen +GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x) +GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet +GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend +HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet +HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen +INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje +KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data +LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data +LINEST = REGR ## Returnerar parametrar till en linjär trendlinje +LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend +LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen +LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen +MAX = MAX ## Returnerar det största värdet i en lista av argument +MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden +MEDIAN = MEDIAN ## Returnerar medianen för angivna tal +MIN = MIN ## Returnerar det minsta värdet i en lista med argument +MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden +MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd +NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen +NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen +NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen +NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen +NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen +PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt +PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett omrÃ¥de +PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd +PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt +POISSON = POISSON ## Returnerar Poisson-fördelningen +PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett omrÃ¥de ligger mellan tvÃ¥ gränser +QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data +RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal +RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient +SKEW = SNEDHET ## Returnerar snedheten för en fördelning +SLOPE = LUTNING ## Returnerar lutningen pÃ¥ en linjär regressionslinje +SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data +STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde +STDEV = STDAV ## Uppskattar standardavvikelsen baserat pÃ¥ ett urval +STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat pÃ¥ ett urval, inklusive tal, text och logiska värden +STDEVP = STDAVP ## Beräknar standardavvikelsen baserat pÃ¥ hela populationen +STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat pÃ¥ hela populationen, inklusive tal, text och logiska värden +STEYX = STDFELYX ## Returnerar standardfelet för ett förutspÃ¥tt y-värde för varje x-värde i regressionen +TDIST = TFÖRD ## Returnerar Students t-fördelning +TINV = TINV ## Returnerar inversen till Students t-fördelning +TREND = TREND ## Returnerar värden längs en linjär trend +TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd +TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test +VAR = VARIANS ## Uppskattar variansen baserat pÃ¥ ett urval +VARA = VARA ## Uppskattar variansen baserat pÃ¥ ett urval, inklusive tal, text och logiska värden +VARP = VARIANSP ## Beräknar variansen baserat pÃ¥ hela populationen +VARPA = VARPA ## Beräknar variansen baserat pÃ¥ hela populationen, inklusive tal, text och logiska värden +WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen +ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test + + +## +## Text functions Textfunktioner +## +ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte) +BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht) +CHAR = TECKENKOD ## Returnerar tecknet som anges av kod +CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text +CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng +CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng +DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat +EXACT = EXAKT ## Kontrollerar om tvÃ¥ textvärden är identiska +FIND = HITTA ## Hittar en text i en annan (skiljer pÃ¥ gemener och versaler) +FINDB = HITTAB ## Hittar en text i en annan (skiljer pÃ¥ gemener och versaler) +FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler +JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte) +LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng +LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng +LEN = LÄNGD ## Returnerar antalet tecken i en textsträng +LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng +LOWER = GEMENER ## Omvandlar text till gemener +MID = EXTEXT ## Returnerar angivet antal tecken frÃ¥n en text med början vid den position som du anger +MIDB = EXTEXTB ## Returnerar angivet antal tecken frÃ¥n en text med början vid den position som du anger +PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng +PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal +REPLACE = ERSÄTT ## Ersätter tecken i text +REPLACEB = ERSÄTTB ## Ersätter tecken i text +REPT = REP ## Upprepar en text ett bestämt antal gÃ¥nger +RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng +RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng +SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte pÃ¥ gemener och versaler) +SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte pÃ¥ gemener och versaler) +SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng +T = T ## Omvandlar argumenten till text +TEXT = TEXT ## Formaterar ett tal och omvandlar det till text +TRIM = RENSA ## Tar bort blanksteg frÃ¥n text +UPPER = VERSALER ## Omvandlar text till versaler +VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/tr/config b/fannie/src/PHPExcel/Classes/PHPExcel/locale/tr/config new file mode 100644 index 000000000..bd75af628 --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/tr/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = YTL + + +## +## Excel Error Codes (For future use) +## +NULL = #BOÅž! +DIV0 = #SAYI/0! +VALUE = #DEÄžER! +REF = #BAÅžV! +NAME = #AD? +NUM = #SAYI! +NA = #YOK diff --git a/fannie/src/PHPExcel/Classes/PHPExcel/locale/tr/functions b/fannie/src/PHPExcel/Classes/PHPExcel/locale/tr/functions new file mode 100644 index 000000000..f8cd30fbd --- /dev/null +++ b/fannie/src/PHPExcel/Classes/PHPExcel/locale/tr/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2011 PHPExcel +## +## 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version 1.7.8, 2012-10-12 +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Eklenti ve Otomasyon fonksiyonları +## +GETPIVOTDATA = ÖZETVERİAL ## Bir Özet Tablo raporunda saklanan verileri verir. + + +## +## Cube functions Küp iÅŸlevleri +## +CUBEKPIMEMBER = KÜPKPIÜYE ## Kilit performans göstergesi (KPI-Key Performance Indicator) adını, özelliÄŸini ve ölçüsünü verir ve hücredeki ad ve özelliÄŸi gösterir. KPI, bir kurumun performansını izlemek için kullanılan aylık brüt kâr ya da üç aylık çalışan giriÅŸ çıkışları gibi ölçülebilen bir birimdir. +CUBEMEMBER = KÜPÜYE ## Bir küp hiyerarÅŸisinde bir üyeyi veya kaydı verir. Üye veya kaydın küpte varolduÄŸunu doÄŸrulamak için kullanılır. +CUBEMEMBERPROPERTY = KÜPÜYEÖZELLİĞİ ## Bir küpte bir üyenin özelliÄŸinin deÄŸerini verir. Küp içinde üye adının varlığını doÄŸrulamak ve bu üyenin belli özelliklerini getirmek için kullanılır. +CUBERANKEDMEMBER = KÜPÜYESIRASI ## Bir küme içindeki üyenin derecesini veya kaçıncı olduÄŸunu verir. En iyi satış elemanı, veya en iyi on öğrenci gibi bir kümedeki bir veya daha fazla öğeyi getirmek için kullanılır. +CUBESET = KÜPKÜME ## Kümeyi oluÅŸturan ve ardından bu kümeyi Microsoft Office Excel'e getiren sunucudaki küpe küme ifadelerini göndererek hesaplanan üye veya kayıt kümesini tanımlar. +CUBESETCOUNT = KÜPKÜMESAY ## Bir kümedeki öğelerin sayısını getirir. +CUBEVALUE = KÜPDEÄžER ## Bir küpten toplam deÄŸeri getirir. + + +## +## Database functions Veritabanı iÅŸlevleri +## +DAVERAGE = VSEÇORT ## Seçili veritabanı girdilerinin ortalamasını verir. +DCOUNT = VSEÇSAY ## Veritabanında sayı içeren hücre sayısını hesaplar. +DCOUNTA = VSEÇSAYDOLU ## Veritabanındaki boÅŸ olmayan hücreleri sayar. +DGET = VAL ## Veritabanından, belirtilen ölçütlerle eÅŸleÅŸen tek bir rapor çıkarır. +DMAX = VSEÇMAK ## Seçili veritabanı giriÅŸlerinin en yüksek deÄŸerini verir. +DMIN = VSEÇMİN ## Seçili veritabanı giriÅŸlerinin en düşük deÄŸerini verir. +DPRODUCT = VSEÇÇARP ## Kayıtların belli bir alanında bulunan, bir veritabanındaki ölçütlerle eÅŸleÅŸen deÄŸerleri çarpar. +DSTDEV = VSEÇSTDSAPMA ## Seçili veritabanı giriÅŸlerinden oluÅŸan bir örneÄŸe dayanarak, standart sapmayı tahmin eder. +DSTDEVP = VSEÇSTDSAPMAS ## Standart sapmayı, seçili veritabanı giriÅŸlerinin tüm popülasyonunu esas alarak hesaplar. +DSUM = VSEÇTOPLA ## Kayıtların alan sütununda bulunan, ölçütle eÅŸleÅŸen sayıları toplar. +DVAR = VSEÇVAR ## Seçili veritabanı giriÅŸlerinden oluÅŸan bir örneÄŸi esas alarak farkı tahmin eder. +DVARP = VSEÇVARS ## Seçili veritabanı giriÅŸlerinin tüm popülasyonunu esas alarak farkı hesaplar. + + +## +## Date and time functions Tarih ve saat iÅŸlevleri +## +DATE = TARİH ## Belirli bir tarihin seri numarasını verir. +DATEVALUE = TARİHSAYISI ## Metin biçimindeki bir tarihi seri numarasına dönüştürür. +DAY = GÜN ## Seri numarasını, ayın bir gününe dönüştürür. +DAYS360 = GÜN360 ## İki tarih arasındaki gün sayısını, 360 günlük yılı esas alarak hesaplar. +EDATE = SERİTARİH ## BaÅŸlangıç tarihinden itibaren, belirtilen ay sayısından önce veya sonraki tarihin seri numarasını verir. +EOMONTH = SERİAY ## Belirtilen sayıda ay önce veya sonraki ayın son gününün seri numarasını verir. +HOUR = SAAT ## Bir seri numarasını saate dönüştürür. +MINUTE = DAKİKA ## Bir seri numarasını dakikaya dönüştürür. +MONTH = AY ## Bir seri numarasını aya dönüştürür. +NETWORKDAYS = TAMİŞGÜNÜ ## İki tarih arasındaki tam çalışma günlerinin sayısını verir. +NOW = ŞİMDİ ## Geçerli tarihin ve saatin seri numarasını verir. +SECOND = SANİYE ## Bir seri numarasını saniyeye dönüştürür. +TIME = ZAMAN ## Belirli bir zamanın seri numarasını verir. +TIMEVALUE = ZAMANSAYISI ## Metin biçimindeki zamanı seri numarasına dönüştürür. +TODAY = BUGÜN ## Bugünün tarihini seri numarasına dönüştürür. +WEEKDAY = HAFTANINGÜNÜ ## Bir seri numarasını, haftanın gününe dönüştürür. +WEEKNUM = HAFTASAY ## Dizisel deÄŸerini, haftanın yıl içinde bulunduÄŸu konumu sayısal olarak gösteren sayıya dönüştürür. +WORKDAY = İŞGÜNÜ ## Belirtilen sayıda çalışma günü öncesinin ya da sonrasının tarihinin seri numarasını verir. +YEAR = YIL ## Bir seri numarasını yıla dönüştürür. +YEARFRAC = YILORAN ## BaÅŸlangıç_tarihi ve bitiÅŸ_tarihi arasındaki tam günleri gösteren yıl kesrini verir. + + +## +## Engineering functions Mühendislik iÅŸlevleri +## +BESSELI = BESSELI ## DeÄŸiÅŸtirilmiÅŸ Bessel fonksiyonu In(x)'i verir. +BESSELJ = BESSELJ ## Bessel fonksiyonu Jn(x)'i verir. +BESSELK = BESSELK ## DeÄŸiÅŸtirilmiÅŸ Bessel fonksiyonu Kn(x)'i verir. +BESSELY = BESSELY ## Bessel fonksiyonu Yn(x)'i verir. +BIN2DEC = BIN2DEC ## İkili bir sayıyı, ondalık sayıya dönüştürür. +BIN2HEX = BIN2HEX ## İkili bir sayıyı, onaltılıya dönüştürür. +BIN2OCT = BIN2OCT ## İkili bir sayıyı, sekizliye dönüştürür. +COMPLEX = KARMAÅžIK ## Gerçek ve sanal katsayıları, karmaşık sayıya dönüştürür. +CONVERT = ÇEVİR ## Bir sayıyı, bir ölçüm sisteminden bir baÅŸka ölçüm sistemine dönüştürür. +DEC2BIN = DEC2BIN ## Ondalık bir sayıyı, ikiliye dönüştürür. +DEC2HEX = DEC2HEX ## Ondalık bir sayıyı, onaltılıya dönüştürür. +DEC2OCT = DEC2OCT ## Ondalık bir sayıyı sekizliÄŸe dönüştürür. +DELTA = DELTA ## İki deÄŸerin eÅŸit olup olmadığını sınar. +ERF = HATAİŞLEV ## Hata iÅŸlevini verir. +ERFC = TÜMHATAİŞLEV ## Tümleyici hata iÅŸlevini verir. +GESTEP = BESINIR ## Bir sayının eÅŸik deÄŸerinden büyük olup olmadığını sınar. +HEX2BIN = HEX2BIN ## Onaltılı bir sayıyı ikiliye dönüştürür. +HEX2DEC = HEX2DEC ## Onaltılı bir sayıyı ondalığa dönüştürür. +HEX2OCT = HEX2OCT ## Onaltılı bir sayıyı sekizliÄŸe dönüştürür. +IMABS = SANMUTLAK ## Karmaşık bir sayının mutlak deÄŸerini (modül) verir. +IMAGINARY = SANAL ## Karmaşık bir sayının sanal katsayısını verir. +IMARGUMENT = SANBAÄž_DEĞİŞKEN ## Radyanlarla belirtilen bir açı olan teta bağımsız deÄŸiÅŸkenini verir. +IMCONJUGATE = SANEÅžLENEK ## Karmaşık bir sayının karmaşık eÅŸleniÄŸini verir. +IMCOS = SANCOS ## Karmaşık bir sayının kosinüsünü verir. +IMDIV = SANBÖL ## İki karmaşık sayının bölümünü verir. +IMEXP = SANÜS ## Karmaşık bir sayının üssünü verir. +IMLN = SANLN ## Karmaşık bir sayının doÄŸal logaritmasını verir. +IMLOG10 = SANLOG10 ## Karmaşık bir sayının, 10 tabanında logaritmasını verir. +IMLOG2 = SANLOG2 ## Karmaşık bir sayının 2 tabanında logaritmasını verir. +IMPOWER = SANÜSSÜ ## Karmaşık bir sayıyı, bir tamsayı üssüne yükseltilmiÅŸ olarak verir. +IMPRODUCT = SANÇARP ## Karmaşık sayıların çarpımını verir. +IMREAL = SANGERÇEK ## Karmaşık bir sayının, gerçek katsayısını verir. +IMSIN = SANSIN ## Karmaşık bir sayının sinüsünü verir. +IMSQRT = SANKAREKÖK ## Karmaşık bir sayının karekökünü verir. +IMSUB = SANÇIKAR ## İki karmaşık sayının farkını verir. +IMSUM = SANTOPLA ## Karmaşık sayıların toplamını verir. +OCT2BIN = OCT2BIN ## Sekizli bir sayıyı ikiliye dönüştürür. +OCT2DEC = OCT2DEC ## Sekizli bir sayıyı ondalığa dönüştürür. +OCT2HEX = OCT2HEX ## Sekizli bir sayıyı onaltılıya dönüştürür. + + +## +## Financial functions Finansal fonksiyonlar +## +ACCRINT = GERÇEKFAİZ ## Dönemsel faiz ödeyen hisse senedine iliÅŸkin tahakkuk eden faizi getirir. +ACCRINTM = GERÇEKFAİZV ## Vadesinde ödeme yapan bir tahvilin tahakkuk etmiÅŸ faizini verir. +AMORDEGRC = AMORDEGRC ## Yıpranma katsayısı kullanarak her hesap döneminin deÄŸer kaybını verir. +AMORLINC = AMORLINC ## Her hesap dönemi içindeki yıpranmayı verir. +COUPDAYBS = KUPONGÜNBD ## Kupon süresinin baÅŸlangıcından alış tarihine kadar olan süredeki gün sayısını verir. +COUPDAYS = KUPONGÜN ## Kupon süresindeki, gün sayısını, alış tarihini de içermek üzere, verir. +COUPDAYSNC = KUPONGÜNDSK ## Alış tarihinden bir sonraki kupon tarihine kadar olan gün sayısını verir. +COUPNCD = KUPONGÜNSKT ## Alış tarihinden bir sonraki kupon tarihini verir. +COUPNUM = KUPONSAYI ## Alış tarihiyle vade tarihi arasında ödenecek kuponların sayısını verir. +COUPPCD = KUPONGÜNÖKT ## Alış tarihinden bir önceki kupon tarihini verir. +CUMIPMT = AİÇVERİMORANI ## İki dönem arasında ödenen kümülatif faizi verir. +CUMPRINC = ANA_PARA_ÖDEMESİ ## İki dönem arasında bir borç üzerine ödenen birikimli temeli verir. +DB = AZALANBAKİYE ## Bir malın belirtilen bir süre içindeki yıpranmasını, sabit azalan bakiye yöntemini kullanarak verir. +DDB = ÇİFTAZALANBAKİYE ## Bir malın belirtilen bir süre içindeki yıpranmasını, çift azalan bakiye yöntemi ya da sizin belirttiÄŸiniz baÅŸka bir yöntemi kullanarak verir. +DISC = İNDİRİM ## Bir tahvilin indirim oranını verir. +DOLLARDE = LİRAON ## Kesir olarak tanımlanmış lira fiyatını, ondalık sayı olarak tanımlanmış lira fiyatına dönüştürür. +DOLLARFR = LİRAKES ## Ondalık sayı olarak tanımlanmış lira fiyatını, kesir olarak tanımlanmış lira fiyatına dönüştürür. +DURATION = SÜRE ## Belli aralıklarla faiz ödemesi yapan bir tahvilin yıllık süresini verir. +EFFECT = ETKİN ## Efektif yıllık faiz oranını verir. +FV = ANBD ## Bir yatırımın gelecekteki deÄŸerini verir. +FVSCHEDULE = GDPROGRAM ## Bir seri birleÅŸik faiz oranı uyguladıktan sonra, bir baÅŸlangıçtaki anaparanın gelecekteki deÄŸerini verir. +INTRATE = FAİZORANI ## Tam olarak yatırım yapılmış bir tahvilin faiz oranını verir. +IPMT = FAİZTUTARI ## Bir yatırımın verilen bir süre için faiz ödemesini verir. +IRR = İÇ_VERİM_ORANI ## Bir para akışı serisi için, iç verim oranını verir. +ISPMT = ISPMT ## Yatırımın belirli bir dönemi boyunca ödenen faizi hesaplar. +MDURATION = MSÜRE ## Varsayılan par deÄŸeri 10.000.000 lira olan bir tahvil için Macauley deÄŸiÅŸtirilmiÅŸ süreyi verir. +MIRR = D_İÇ_VERİM_ORANI ## Pozitif ve negatif para akışlarının farklı oranlarda finanse edildiÄŸi durumlarda, iç verim oranını verir. +NOMINAL = NOMİNAL ## Yıllık nominal faiz oranını verir. +NPER = DÖNEM_SAYISI ## Bir yatırımın dönem sayısını verir. +NPV = NBD ## Bir yatırımın bugünkü net deÄŸerini, bir dönemsel para akışları serisine ve bir indirim oranına baÄŸlı olarak verir. +ODDFPRICE = TEKYDEÄžER ## Tek bir ilk dönemi olan bir tahvilin deÄŸerini, her 100.000.000 lirada bir verir. +ODDFYIELD = TEKYÖDEME ## Tek bir ilk dönemi olan bir tahvilin ödemesini verir. +ODDLPRICE = TEKSDEÄžER ## Tek bir son dönemi olan bir tahvilin fiyatını her 10.000.000 lirada bir verir. +ODDLYIELD = TEKSÖDEME ## Tek bir son dönemi olan bir tahvilin ödemesini verir. +PMT = DEVRESEL_ÖDEME ## Bir yıllık dönemsel ödemeyi verir. +PPMT = ANA_PARA_ÖDEMESİ ## Verilen bir süre için, bir yatırımın anaparasına dayanan ödemeyi verir. +PRICE = DEÄžER ## Dönemsel faiz ödeyen bir tahvilin fiyatını 10.000.00 liralık deÄŸer başına verir. +PRICEDISC = DEÄžERİND ## İndirimli bir tahvilin fiyatını 10.000.000 liralık nominal deÄŸer başına verir. +PRICEMAT = DEÄžERVADE ## Faizini vade sonunda ödeyen bir tahvilin fiyatını 10.000.000 nominal deÄŸer başına verir. +PV = BD ## Bir yatırımın bugünkü deÄŸerini verir. +RATE = FAİZ_ORANI ## Bir yıllık dönem başına düşen faiz oranını verir. +RECEIVED = GETİRİ ## Tam olarak yatırılmış bir tahvilin vadesinin bitiminde alınan miktarı verir. +SLN = DA ## Bir malın bir dönem içindeki doÄŸrusal yıpranmasını verir. +SYD = YAT ## Bir malın belirli bir dönem için olan amortismanını verir. +TBILLEQ = HTAHEÅž ## Bir Hazine bonosunun bono eÅŸdeÄŸeri ödemesini verir. +TBILLPRICE = HTAHDEÄžER ## Bir Hazine bonosunun deÄŸerini, 10.000.000 liralık nominal deÄŸer başına verir. +TBILLYIELD = HTAHÖDEME ## Bir Hazine bonosunun ödemesini verir. +VDB = DAB ## Bir malın amortismanını, belirlenmiÅŸ ya da kısmi bir dönem için, bir azalan bakiye yöntemi kullanarak verir. +XIRR = AİÇVERİMORANI ## Dönemsel olması gerekmeyen bir para akışları programı için, iç verim oranını verir. +XNPV = ANBD ## Dönemsel olması gerekmeyen bir para akışları programı için, bugünkü net deÄŸeri verir. +YIELD = ÖDEME ## Belirli aralıklarla faiz ödeyen bir tahvilin ödemesini verir. +YIELDDISC = ÖDEMEİND ## İndirimli bir tahvilin yıllık ödemesini verir; örneÄŸin, bir Hazine bonosunun. +YIELDMAT = ÖDEMEVADE ## Vadesinin bitiminde faiz ödeyen bir tahvilin yıllık ödemesini verir. + + +## +## Information functions Bilgi fonksiyonları +## +CELL = HÜCRE ## Bir hücrenin biçimlendirmesi, konumu ya da içeriÄŸi hakkında bilgi verir. +ERROR.TYPE = HATA.TİPİ ## Bir hata türüne iliÅŸkin sayıları verir. +INFO = BİLGİ ## Geçerli iÅŸletim ortamı hakkında bilgi verir. +ISBLANK = EBOÅžSA ## DeÄŸer boÅŸsa, DOÄžRU verir. +ISERR = EHATA ## DeÄŸer, #YOK dışındaki bir hata deÄŸeriyse, DOÄžRU verir. +ISERROR = EHATALIYSA ## DeÄŸer, herhangi bir hata deÄŸeriyse, DOÄžRU verir. +ISEVEN = ÇİFTTİR ## Sayı çiftse, DOÄžRU verir. +ISLOGICAL = EMANTIKSALSA ## DeÄŸer, mantıksal bir deÄŸerse, DOÄžRU verir. +ISNA = EYOKSA ## DeÄŸer, #YOK hata deÄŸeriyse, DOÄžRU verir. +ISNONTEXT = EMETİNDEĞİLSE ## DeÄŸer, metin deÄŸilse, DOÄžRU verir. +ISNUMBER = ESAYIYSA ## DeÄŸer, bir sayıysa, DOÄžRU verir. +ISODD = TEKTİR ## Sayı tekse, DOÄžRU verir. +ISREF = EREFSE ## DeÄŸer bir baÅŸvuruysa, DOÄžRU verir. +ISTEXT = EMETİNSE ## DeÄŸer bir metinse DOÄžRU verir. +N = N ## Sayıya dönüştürülmüş bir deÄŸer verir. +NA = YOKSAY ## #YOK hata deÄŸerini verir. +TYPE = TİP ## Bir deÄŸerin veri türünü belirten bir sayı verir. + + +## +## Logical functions Mantıksal fonksiyonlar +## +AND = VE ## Bütün bağımsız deÄŸiÅŸkenleri DOÄžRU ise, DOÄžRU verir. +FALSE = YANLIÅž ## YANLIÅž mantıksal deÄŸerini verir. +IF = EÄžER ## GerçekleÅŸtirilecek bir mantıksal sınama belirtir. +IFERROR = EÄžERHATA ## Formül hatalıysa belirttiÄŸiniz deÄŸeri verir; bunun dışındaki durumlarda formülün sonucunu verir. +NOT = DEĞİL ## Bağımsız deÄŸiÅŸkeninin mantığını tersine çevirir. +OR = YADA ## Bağımsız deÄŸiÅŸkenlerden herhangi birisi DOÄžRU ise, DOÄžRU verir. +TRUE = DOÄžRU ## DOÄžRU mantıksal deÄŸerini verir. + + +## +## Lookup and reference functions Arama ve BaÅŸvuru fonksiyonları +## +ADDRESS = ADRES ## Bir baÅŸvuruyu, çalışma sayfasındaki tek bir hücreye metin olarak verir. +AREAS = ALANSAY ## Renvoie le nombre de zones dans une référence. +CHOOSE = ELEMAN ## DeÄŸerler listesinden bir deÄŸer seçer. +COLUMN = SÜTUN ## Bir baÅŸvurunun sütun sayısını verir. +COLUMNS = SÜTUNSAY ## Bir baÅŸvurudaki sütunların sayısını verir. +HLOOKUP = YATAYARA ## Bir dizinin en üst satırına bakar ve belirtilen hücrenin deÄŸerini verir. +HYPERLINK = KÖPRÜ ## Bir aÄŸ sunucusunda, bir intranette ya da Internet'te depolanan bir belgeyi açan bir kısayol ya da atlama oluÅŸturur. +INDEX = İNDİS ## BaÅŸvurudan veya diziden bir deÄŸer seçmek için, bir dizin kullanır. +INDIRECT = DOLAYLI ## Metin deÄŸeriyle belirtilen bir baÅŸvuru verir. +LOOKUP = ARA ## Bir vektördeki veya dizideki deÄŸerleri arar. +MATCH = KAÇINCI ## Bir baÅŸvurudaki veya dizideki deÄŸerleri arar. +OFFSET = KAYDIR ## Verilen bir baÅŸvurudan, bir baÅŸvuru kaydırmayı verir. +ROW = SATIR ## Bir baÅŸvurunun satır sayısını verir. +ROWS = SATIRSAY ## Bir baÅŸvurudaki satırların sayısını verir. +RTD = RTD ## COM otomasyonunu destekleyen programdan gerçek zaman verileri alır. +TRANSPOSE = DEVRİK_DÖNÜŞÜM ## Bir dizinin devrik dönüşümünü verir. +VLOOKUP = DÜŞEYARA ## Bir dizinin ilk sütununa bakar ve bir hücrenin deÄŸerini vermek için satır boyunca hareket eder. + + +## +## Math and trigonometry functions Matematik ve trigonometri fonksiyonları +## +ABS = MUTLAK ## Bir sayının mutlak deÄŸerini verir. +ACOS = ACOS ## Bir sayının ark kosinüsünü verir. +ACOSH = ACOSH ## Bir sayının ters hiperbolik kosinüsünü verir. +ASIN = ASİN ## Bir sayının ark sinüsünü verir. +ASINH = ASİNH ## Bir sayının ters hiperbolik sinüsünü verir. +ATAN = ATAN ## Bir sayının ark tanjantını verir. +ATAN2 = ATAN2 ## Ark tanjantı, x- ve y- koordinatlarından verir. +ATANH = ATANH ## Bir sayının ters hiperbolik tanjantını verir. +CEILING = TAVANAYUVARLA ## Bir sayıyı, en yakın tamsayıya ya da en yakın katına yuvarlar. +COMBIN = KOMBİNASYON ## Verilen sayıda öğenin kombinasyon sayısını verir. +COS = COS ## Bir sayının kosinüsünü verir. +COSH = COSH ## Bir sayının hiperbolik kosinüsünü verir. +DEGREES = DERECE ## Radyanları dereceye dönüştürür. +EVEN = ÇİFT ## Bir sayıyı, en yakın daha büyük çift tamsayıya yuvarlar. +EXP = ÜS ## e'yi, verilen bir sayının üssüne yükseltilmiÅŸ olarak verir. +FACT = ÇARPINIM ## Bir sayının faktörünü verir. +FACTDOUBLE = ÇİFTFAKTÖR ## Bir sayının çift çarpınımını verir. +FLOOR = TABANAYUVARLA ## Bir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar. +GCD = OBEB ## En büyük ortak böleni verir. +INT = TAMSAYI ## Bir sayıyı aÅŸağıya doÄŸru en yakın tamsayıya yuvarlar. +LCM = OKEK ## En küçük ortak katı verir. +LN = LN ## Bir sayının doÄŸal logaritmasını verir. +LOG = LOG ## Bir sayının, belirtilen bir tabandaki logaritmasını verir. +LOG10 = LOG10 ## Bir sayının 10 tabanında logaritmasını verir. +MDETERM = DETERMİNANT ## Bir dizinin dizey determinantını verir. +MINVERSE = DİZEY_TERS ## Bir dizinin dizey tersini verir. +MMULT = DÇARP ## İki dizinin dizey çarpımını verir. +MOD = MODÜLO ## Bölmeden kalanı verir. +MROUND = KYUVARLA ## İstenen kata yuvarlanmış bir sayı verir. +MULTINOMIAL = ÇOKTERİMLİ ## Bir sayılar kümesinin çok terimlisini verir. +ODD = TEK ## Bir sayıyı en yakın daha büyük tek sayıya yuvarlar. +PI = Pİ ## Pi deÄŸerini verir. +POWER = KUVVET ## Bir üsse yükseltilmiÅŸ sayının sonucunu verir. +PRODUCT = ÇARPIM ## Bağımsız deÄŸiÅŸkenlerini çarpar. +QUOTIENT = BÖLÜM ## Bir bölme iÅŸleminin tamsayı kısmını verir. +RADIANS = RADYAN ## Dereceleri radyanlara dönüştürür. +RAND = S_SAYI_ÜRET ## 0 ile 1 arasında rastgele bir sayı verir. +RANDBETWEEN = RASTGELEARALIK ## BelirttiÄŸiniz sayılar arasında rastgele bir sayı verir. +ROMAN = ROMEN ## Bir normal rakamı, metin olarak, romen rakamına çevirir. +ROUND = YUVARLA ## Bir sayıyı, belirtilen basamak sayısına yuvarlar. +ROUNDDOWN = AÅžAÄžIYUVARLA ## Bir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar. +ROUNDUP = YUKARIYUVARLA ## Bir sayıyı daha büyük sayıya, sıfırdan ıraksayarak yuvarlar. +SERIESSUM = SERİTOPLA ## Bir üs serisinin toplamını, formüle baÄŸlı olarak verir. +SIGN = İŞARET ## Bir sayının iÅŸaretini verir. +SIN = SİN ## Verilen bir açının sinüsünü verir. +SINH = SİNH ## Bir sayının hiperbolik sinüsünü verir. +SQRT = KAREKÖK ## Pozitif bir karekök verir. +SQRTPI = KAREKÖKPİ ## (* Pi sayısının) kare kökünü verir. +SUBTOTAL = ALTTOPLAM ## Bir listedeki ya da veritabanındaki bir alt toplamı verir. +SUM = TOPLA ## Bağımsız deÄŸiÅŸkenlerini toplar. +SUMIF = ETOPLA ## Verilen ölçütle belirlenen hücreleri toplar. +SUMIFS = SUMIFS ## Bir aralıktaki, birden fazla ölçüte uyan hücreleri ekler. +SUMPRODUCT = TOPLA.ÇARPIM ## İliÅŸkili dizi bileÅŸenlerinin çarpımlarının toplamını verir. +SUMSQ = TOPKARE ## Bağımsız deÄŸiÅŸkenlerin karelerinin toplamını verir. +SUMX2MY2 = TOPX2EY2 ## İki dizideki iliÅŸkili deÄŸerlerin farkının toplamını verir. +SUMX2PY2 = TOPX2AY2 ## İki dizideki iliÅŸkili deÄŸerlerin karelerinin toplamının toplamını verir. +SUMXMY2 = TOPXEY2 ## İki dizideki iliÅŸkili deÄŸerlerin farklarının karelerinin toplamını verir. +TAN = TAN ## Bir sayının tanjantını verir. +TANH = TANH ## Bir sayının hiperbolik tanjantını verir. +TRUNC = NSAT ## Bir sayının, tamsayı durumuna gelecek ÅŸekilde, fazlalıklarını atar. + + +## +## Statistical functions İstatistiksel fonksiyonlar +## +AVEDEV = ORTSAP ## Veri noktalarının ortalamalarından mutlak sapmalarının ortalamasını verir. +AVERAGE = ORTALAMA ## Bağımsız deÄŸiÅŸkenlerinin ortalamasını verir. +AVERAGEA = ORTALAMAA ## Bağımsız deÄŸiÅŸkenlerinin, sayılar, metin ve mantıksal deÄŸerleri içermek üzere ortalamasını verir. +AVERAGEIF = EÄžERORTALAMA ## Verili ölçütü karşılayan bir aralıktaki bütün hücrelerin ortalamasını (aritmetik ortalama) hesaplar. +AVERAGEIFS = EÄžERLERORTALAMA ## Birden çok ölçüte uyan tüm hücrelerin ortalamasını (aritmetik ortalama) hesaplar. +BETADIST = BETADAÄž ## Beta birikimli dağılım fonksiyonunu verir. +BETAINV = BETATERS ## Belirli bir beta dağılımı için birikimli dağılım fonksiyonunun tersini verir. +BINOMDIST = BİNOMDAÄž ## Tek terimli binom dağılımı olasılığını verir. +CHIDIST = KİKAREDAÄž ## Kikare dağılımın tek kuyruklu olasılığını verir. +CHIINV = KİKARETERS ## Kikare dağılımın kuyruklu olasılığının tersini verir. +CHITEST = KİKARETEST ## Bağımsızlık sınamalarını verir. +CONFIDENCE = GÜVENİRLİK ## Bir popülasyon ortalaması için güvenirlik aralığını verir. +CORREL = KORELASYON ## İki veri kümesi arasındaki baÄŸlantı katsayısını verir. +COUNT = BAÄž_DEÄž_SAY ## Bağımsız deÄŸiÅŸkenler listesinde kaç tane sayı bulunduÄŸunu sayar. +COUNTA = BAÄž_DEÄž_DOLU_SAY ## Bağımsız deÄŸiÅŸkenler listesinde kaç tane deÄŸer bulunduÄŸunu sayar. +COUNTBLANK = BOÅžLUKSAY ## Aralıktaki boÅŸ hücre sayısını hesaplar. +COUNTIF = EÄžERSAY ## Verilen ölçütlere uyan bir aralık içindeki hücreleri sayar. +COUNTIFS = ÇOKEÄžERSAY ## Birden çok ölçüte uyan bir aralık içindeki hücreleri sayar. +COVAR = KOVARYANS ## EÅŸleÅŸtirilmiÅŸ sapmaların ortalaması olan kovaryansı verir. +CRITBINOM = KRİTİKBİNOM ## Birikimli binom dağılımının bir ölçüt deÄŸerinden küçük veya ölçüt deÄŸerine eÅŸit olduÄŸu en küçük deÄŸeri verir. +DEVSQ = SAPKARE ## Sapmaların karelerinin toplamını verir. +EXPONDIST = ÜSTELDAÄž ## Üstel dağılımı verir. +FDIST = FDAÄž ## F olasılık dağılımını verir. +FINV = FTERS ## F olasılık dağılımının tersini verir. +FISHER = FISHER ## Fisher dönüşümünü verir. +FISHERINV = FISHERTERS ## Fisher dönüşümünün tersini verir. +FORECAST = TAHMİN ## Bir doÄŸrusal eÄŸilim boyunca bir deÄŸer verir. +FREQUENCY = SIKLIK ## Bir sıklık dağılımını, dikey bir dizi olarak verir. +FTEST = FTEST ## Bir F-test'in sonucunu verir. +GAMMADIST = GAMADAÄž ## Gama dağılımını verir. +GAMMAINV = GAMATERS ## Gama kümülatif dağılımının tersini verir. +GAMMALN = GAMALN ## Gama fonksiyonunun (?(x)) doÄŸal logaritmasını verir. +GEOMEAN = GEOORT ## Geometrik ortayı verir. +GROWTH = BÜYÜME ## Üstel bir eÄŸilim boyunca deÄŸerler verir. +HARMEAN = HARORT ## Harmonik ortayı verir. +HYPGEOMDIST = HİPERGEOMDAÄž ## Hipergeometrik dağılımı verir. +INTERCEPT = KESMENOKTASI ## DoÄŸrusal çakıştırma çizgisinin kesiÅŸme noktasını verir. +KURT = BASIKLIK ## Bir veri kümesinin basıklığını verir. +LARGE = BÜYÜK ## Bir veri kümesinde k. en büyük deÄŸeri verir. +LINEST = DOT ## DoÄŸrusal bir eÄŸilimin parametrelerini verir. +LOGEST = LOT ## Üstel bir eÄŸilimin parametrelerini verir. +LOGINV = LOGTERS ## Bir lognormal dağılımının tersini verir. +LOGNORMDIST = LOGNORMDAÄž ## Birikimli lognormal dağılımını verir. +MAX = MAK ## Bir bağımsız deÄŸiÅŸkenler listesindeki en büyük deÄŸeri verir. +MAXA = MAKA ## Bir bağımsız deÄŸiÅŸkenler listesindeki, sayılar, metin ve mantıksal deÄŸerleri içermek üzere, en büyük deÄŸeri verir. +MEDIAN = ORTANCA ## Belirtilen sayıların orta deÄŸerini verir. +MIN = MİN ## Bir bağımsız deÄŸiÅŸkenler listesindeki en küçük deÄŸeri verir. +MINA = MİNA ## Bir bağımsız deÄŸiÅŸkenler listesindeki, sayılar, metin ve mantıksal deÄŸerleri de içermek üzere, en küçük deÄŸeri verir. +MODE = ENÇOK_OLAN ## Bir veri kümesindeki en sık rastlanan deÄŸeri verir. +NEGBINOMDIST = NEGBİNOMDAÄž ## Negatif binom dağılımını verir. +NORMDIST = NORMDAÄž ## Normal birikimli dağılımı verir. +NORMINV = NORMTERS ## Normal kümülatif dağılımın tersini verir. +NORMSDIST = NORMSDAÄž ## Standart normal birikimli dağılımı verir. +NORMSINV = NORMSTERS ## Standart normal birikimli dağılımın tersini verir. +PEARSON = PEARSON ## Pearson çarpım moment korelasyon katsayısını verir. +PERCENTILE = YÜZDEBİRLİK ## Bir aralık içerisinde bulunan deÄŸerlerin k. frekans toplamını verir. +PERCENTRANK = YÜZDERANK ## Bir veri kümesindeki bir deÄŸerin yüzde mertebesini verir. +PERMUT = PERMÜTASYON ## Verilen sayıda nesne için permütasyon sayısını verir. +POISSON = POISSON ## Poisson dağılımını verir. +PROB = OLASILIK ## Bir aralıktaki deÄŸerlerin iki sınır arasında olması olasılığını verir. +QUARTILE = DÖRTTEBİRLİK ## Bir veri kümesinin dörtte birliÄŸini verir. +RANK = RANK ## Bir sayılar listesinde bir sayının mertebesini verir. +RSQ = RKARE ## Pearson çarpım moment korelasyon katsayısının karesini verir. +SKEW = ÇARPIKLIK ## Bir dağılımın çarpıklığını verir. +SLOPE = EĞİM ## DoÄŸrusal çakışma çizgisinin eÄŸimini verir. +SMALL = KÜÇÜK ## Bir veri kümesinde k. en küçük deÄŸeri verir. +STANDARDIZE = STANDARTLAÅžTIRMA ## NormalleÅŸtirilmiÅŸ bir deÄŸer verir. +STDEV = STDSAPMA ## Bir örneÄŸe dayanarak standart sapmayı tahmin eder. +STDEVA = STDSAPMAA ## Standart sapmayı, sayılar, metin ve mantıksal deÄŸerleri içermek üzere, bir örneÄŸe baÄŸlı olarak tahmin eder. +STDEVP = STDSAPMAS ## Standart sapmayı, tüm popülasyona baÄŸlı olarak hesaplar. +STDEVPA = STDSAPMASA ## Standart sapmayı, sayılar, metin ve mantıksal deÄŸerleri içermek üzere, tüm popülasyona baÄŸlı olarak hesaplar. +STEYX = STHYX ## Regresyondaki her x için tahmini y deÄŸerinin standart hatasını verir. +TDIST = TDAÄž ## T-dağılımını verir. +TINV = TTERS ## T-dağılımının tersini verir. +TREND = EĞİLİM ## DoÄŸrusal bir eÄŸilim boyunca deÄŸerler verir. +TRIMMEAN = KIRPORTALAMA ## Bir veri kümesinin içinin ortalamasını verir. +TTEST = TTEST ## T-test'le iliÅŸkilendirilmiÅŸ olasılığı verir. +VAR = VAR ## Varyansı, bir örneÄŸe baÄŸlı olarak tahmin eder. +VARA = VARA ## Varyansı, sayılar, metin ve mantıksal deÄŸerleri içermek üzere, bir örneÄŸe baÄŸlı olarak tahmin eder. +VARP = VARS ## Varyansı, tüm popülasyona dayanarak hesaplar. +VARPA = VARSA ## Varyansı, sayılar, metin ve mantıksal deÄŸerleri içermek üzere, tüm popülasyona baÄŸlı olarak hesaplar. +WEIBULL = WEIBULL ## Weibull dağılımını hesaplar. +ZTEST = ZTEST ## Z-testinin tek kuyruklu olasılık deÄŸerini hesaplar. + + +## +## Text functions Metin fonksiyonları +## +ASC = ASC ## Bir karakter dizesindeki çift enli (iki bayt) İngilizce harfleri veya katakanayı yarım enli (tek bayt) karakterlerle deÄŸiÅŸtirir. +BAHTTEXT = BAHTTEXT ## Sayıyı, ß (baht) para birimi biçimini kullanarak metne dönüştürür. +CHAR = DAMGA ## Kod sayısıyla belirtilen karakteri verir. +CLEAN = TEMİZ ## Metindeki bütün yazdırılamaz karakterleri kaldırır. +CODE = KOD ## Bir metin dizesindeki ilk karakter için sayısal bir kod verir. +CONCATENATE = BİRLEÅžTİR ## Pek çok metin öğesini bir metin öğesi olarak birleÅŸtirir. +DOLLAR = LİRA ## Bir sayıyı YTL (yeni Türk lirası) para birimi biçimini kullanarak metne dönüştürür. +EXACT = ÖZDEÅž ## İki metin deÄŸerinin özdeÅŸ olup olmadığını anlamak için, deÄŸerleri denetler. +FIND = BUL ## Bir metin deÄŸerini, bir baÅŸkasının içinde bulur (büyük küçük harf duyarlıdır). +FINDB = BULB ## Bir metin deÄŸerini, bir baÅŸkasının içinde bulur (büyük küçük harf duyarlıdır). +FIXED = SAYIDÜZENLE ## Bir sayıyı, sabit sayıda ondalıkla, metin olarak biçimlendirir. +JIS = JIS ## Bir karakter dizesindeki tek enli (tek bayt) İngilizce harfleri veya katakanayı çift enli (iki bayt) karakterlerle deÄŸiÅŸtirir. +LEFT = SOL ## Bir metin deÄŸerinden en soldaki karakterleri verir. +LEFTB = SOLB ## Bir metin deÄŸerinden en soldaki karakterleri verir. +LEN = UZUNLUK ## Bir metin dizesindeki karakter sayısını verir. +LENB = UZUNLUKB ## Bir metin dizesindeki karakter sayısını verir. +LOWER = KÜÇÜKHARF ## Metni küçük harfe çevirir. +MID = ORTA ## Bir metin dizesinden belirli sayıda karakteri, belirttiÄŸiniz konumdan baÅŸlamak üzere verir. +MIDB = ORTAB ## Bir metin dizesinden belirli sayıda karakteri, belirttiÄŸiniz konumdan baÅŸlamak üzere verir. +PHONETIC = SES ## Metin dizesinden ses (furigana) karakterlerini ayıklar. +PROPER = YAZIM.DÜZENİ ## Bir metin deÄŸerinin her bir sözcüğünün ilk harfini büyük harfe çevirir. +REPLACE = DEĞİŞTİR ## Metnin içindeki karakterleri deÄŸiÅŸtirir. +REPLACEB = DEĞİŞTİRB ## Metnin içindeki karakterleri deÄŸiÅŸtirir. +REPT = YİNELE ## Metni belirtilen sayıda yineler. +RIGHT = SAÄž ## Bir metin deÄŸerinden en saÄŸdaki karakterleri verir. +RIGHTB = SAÄžB ## Bir metin deÄŸerinden en saÄŸdaki karakterleri verir. +SEARCH = BUL ## Bir metin deÄŸerini, bir baÅŸkasının içinde bulur (büyük küçük harf duyarlı deÄŸildir). +SEARCHB = BULB ## Bir metin deÄŸerini, bir baÅŸkasının içinde bulur (büyük küçük harf duyarlı deÄŸildir). +SUBSTITUTE = YERİNEKOY ## Bir metin dizesinde, eski metnin yerine yeni metin koyar. +T = M ## Bağımsız deÄŸerlerini metne dönüştürür. +TEXT = METNEÇEVİR ## Bir sayıyı biçimlendirir ve metne dönüştürür. +TRIM = KIRP ## Metindeki boÅŸlukları kaldırır. +UPPER = BÜYÜKHARF ## Metni büyük harfe çevirir. +VALUE = SAYIYAÇEVİR ## Bir metin bağımsız deÄŸiÅŸkenini sayıya dönüştürür. diff --git a/fannie/src/PHPExcel/changelog.txt b/fannie/src/PHPExcel/changelog.txt new file mode 100644 index 000000000..3040d3438 --- /dev/null +++ b/fannie/src/PHPExcel/changelog.txt @@ -0,0 +1,1355 @@ +************************************************************************************** +* PHPExcel +* +* Copyright (c) 2006 - 2012 PHPExcel +* +* 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.7.8, 2012-10-12 +************************************************************************************** + + +-------------------------------------------------------------------------------- +BREAKING CHANGE! As part of the planned changes for handling array formulae in +workbooks, there are some changes that will affect the PHPExcel_Cell object +methods. + +The following methods are now deprecated, and will be removed in version 1.7.9: + getCalculatedValue() The getValue() method will return calculated + values for cells containing formulae instead. + setCalculatedValue() The cell value will always contain the result of a + any formula calculation. + setFormulaAttributes() Will now be determined by the arguments to the + setFormula() method. + getFormulaAttributes() This will be replaced by the getArrayFormulaRange() + method. + +The following methods will be added in version 1.7.9 + getFormula() Use to retrieve a cell formula, will return the cell + value if the cell doesn't contain a formula, or + is not part of an array formula range. + setFormula() Use to set a cell formula. It will still be possible + to set formulae using the setValue() and + setValueExplicit() methods. + calculate() Use to execute a formula calculation to update the + cell value. + isFormula() Use to determine if a cell contains a formula, or is + part of an array formula range or not. + isArrayFormula() Use to determine if a cell contains an array formula, + or is part of an array formula range or not. + getArrayFormulaRange() Use to retrieve an array formula range. + +The following methods will be changed in version 1.7.9 + setValue() The logic behind this will be modified to store + formula values in the new cell property structure, + but it will still perform the same function. + setValueExplicit() The logic behind this will be modified to store + formula values in the new cell property structure, + but it will still perform the same function. + getValue() Will no longer return a formula if the cell contains + a formula, but will return the calculated value + instead. For cells that don't contain a formula, + it will still return the stored value. + getDataType() Will return the datatype of the calculated value for + cells that contain formulae. + setDataType() Error handling will be added to prevent setting a + cell datatype to an inappropriate value. +-------------------------------------------------------------------------------- + + +Fixed in develop branch: +- Special: (kkamkou) Phar builder script to add phar file as a distribution option +- Feature: (MBaker) Refactor PDF Writer to allow use with a choice of PDF Rendering library + rather than restricting to tcPDF + Current options are tcPDF, mPDF, DomPDF + tcPDF Library has now been removed from the deployment bundle +- Feature: (MBaker) Initial version of HTML Reader +- Feature: (Progi1984) & (blazzy) Work items 9605 - Implement support for AutoFilter in PHPExcel_Writer_Excel5 +- Feature: (MBaker) Modified ERF and ERFC Engineering functions to accept Excel 2010's modified acceptance of negative arguments +- Feature: (k1LoW) Support SheetView `view` attribute (Excel2007) +- Feature: (MBaker) Excel compatibility option added for writing CSV files + While Excel 2010 can read CSV files with a simple UTF-8 BOM, Excel2007 and earlier require UTF-16LE encoded tab-separated files. + The new setExcelCompatibility(TRUE) option for the CSV Writer will generate files with this formatting for easy import into Excel2007 and below. +- Feature: (MBaker) Language implementations for Turkish (tr) +- Feature: (MBaker) Added fraction tests to advanced value binder +- Feature: (MBaker) Allow call to font setUnderline() for underline format to specify a simple boolean for UNDERLINE_NONE or UNDERLINE_SINGLE +- General: (alexgann) Add Currency detection to the Advanced Value Binder +- General: (MBaker) Work item 18404 - setCellValueExplicitByColumnAndRow() do not return PHPExcel_Worksheet +- General: (MBaker) Work item 18324 - Reader factory doesn't read anymore XLTX and XLT files +- General: (MBaker) Magic __toString() method added to Cell object to return raw data value as a string +- General: (alexgann) Add cell indent to html rendering +- General: (Raghav1981) ZeroHeight for rows in sheet format +- Bugfix: (cyberconte) Patch 12318 - OOCalc cells containing <text:span> inside the <text:p> tag +- Bugfix: (schir1964) Fix to listWorksheetInfo() method for OOCalc Reader +- Bugfix: (MBaker) Support for "e" (epoch) date format mask + Rendered as a 4-digit CE year in non-Excel outputs +- Bugfix: (MBaker) Work items 15799 and 18278 - Background color cell is always black when editing cell +- Bugfix: (MBaker) Work items 15905 and 18183 - Allow "no impact" to formats on Conditional Formatting +- Bugfix: (wackonline) OOCalc Reader fix for NULL cells +- Bugfix: (seltzlab) Fix to excel2007 Chart Writer when a $plotSeriesValues is empty +- Bugfix: (MBaker) Various fixes to Chart handling +- Bugfix: (MBaker) Work item 18370 - Error loading xlsx file with column breaks +- Bugfix: (MBaker) OOCalc Reader now handles percentage and currency data types +- Bugfix: (MBaker) Work Item 18415 - mb_stripos empty delimiter +- Bugfix: (takaakik) Work Item 15455 - getNestingLevel() Error on Excel5 Read +- Bugfix: (MBaker) Fix to Excel5 Reader when cell annotations are defined before their referenced text objects +- Bugfix: (MBaker) OOCalc Reader modified to process number-rows-repeated +- Bugfix: (MBaker) Work item 18377 - Chart Title compatibility on Excel 2007 +- Bugfix: (MBaker) Work item 18146 - Chart Refresh returning cell reference rather than values +- Bugfix: (MBaker) Work item 18145 - Autoshape being identified in twoCellAnchor when includeCharts is TRUE triggering load error +- Bugfix: (MBaker) Work item 18325 - v-type texts for series labels now recognised and parsed correctly +- Bugfix: (wolf5x) Work item 18492 - load file failed if the file has no extensionType +- Bugfix: (dverspui) Pattern fill colours in Excel2007 Style Writer +- Bugfix: (MBaker) Excel2007 Writer order of font style elements to conform with Excel2003 using compatibility pack +- Bugfix: (MBaker) Work item 18425 - Problems with $_activeSheetIndex when decreased below 0. +- Bugfix: (MBaker) Work item 18597 - PHPExcel_CachedObjectStorage_SQLite3::cacheMethodIsAvailable() uses class_exists - autoloader throws error +- Bugfix: (MBaker) Work item 18598 - Cannot access private property PHPExcel_CachedObjectStorageFactory::$_cacheStorageMethod +- Bugfix: (MBaker) Work item 18397 - Data titles for charts + PHPExcel_Chart_Layout now has methods for getting/setting switches for displaying/hiding chart data labels +- Bugfix: (MBaker) Discard single cell merge ranges when reading (stupid that Excel allows them in the first place) +- Bugfix: (MBaker) Discard hidden autoFilter named ranges + + +2012-05-19 (v1.7.7): +- Bugfix: (Progi1984) Work item 8916 - Support for Rich-Text in PHPExcel_Writer_Excel5 +- Bugfix: (cyberconte) Work item 17471 - OOCalc cells contain same data bug? +- Feature: (schir1964) listWorksheetInfo() method added to Readers... courtesy of Christopher Mullins +- Feature: (MBaker) Options for cell caching using Igbinary and SQLite/SQlite3. +- Feature: (MBaker) Additional row iterator options: allow a start row to be defined in the constructor; seek(), and prev() methods added. +- Feature: (Progi1984) Work item 9759 - Implement document properties in Excel5 writer +- Feature: (MBaker) Work item 16 - Implement chart functionality (EXPERIMENTAL) + Initial definition of chart objects. + Reading Chart definitions through the Excel2007 Reader + Facility to render charts to images using the 3rd-party jpgraph library + Writing Charts using the Excel2007 Writer +- General: (MBaker) Fix to build to ensure that Examples are included with the documentation +- General: (MBaker) Reduce cell caching overhead using dirty flag to ensure that cells are only rewritten to the cache if they have actually been changed +- General: (MBaker) Improved memory usage in CSV Writer +- General: (MBaker) Improved speed and memory usage in Excel5 Writer +- General: (MBaker) Experimental - + Added getHighestDataColumn(), getHighestDataRow(), getHighestRowAndColumn() and calculateWorksheetDataDimension() methods for the worksheet that return the highest row and column that have cell records +- General: (MBaker) Change iterators to implement Iterator rather than extend CachingIterator, as a fix for PHP 5.4. changes in SPL +- Bugfix: (MBaker) Work item 15459 - Invalid cell coordinate in Autofilter for Excel2007 Writer +- Bugfix: (MBaker) Work item 15518 - PCLZip library issue +- Bugfix: (MBaker) Work item 15537 - Excel2007 Reader canRead function bug +- Bugfix: (MBaker) Support for Excel functions whose return can be used as either a value or as a cell reference depending on its context within a formula +- Bugfix: (gilles06) Work item 15707 - ini_set() call in Calculation class destructor +- Bugfix: (MBaker) Work item 15786 - RangeToArray strange array keys +- Bugfix: (MBaker) Work item 15762 - INDIRECT() function doesn't work with named ranges +- Bugfix: (MBaker) Locale-specific fix to text functions when passing a boolean argument instead of a string +- Bugfix: (MBaker) Work item 16246 - reader/CSV fails on this file + auto_detect_line_endings now set in CSV reader +- Bugfix: (MBaker) Work item 16212 - $arguments improperly used in CachedObjectStorage/PHPTemp.php +- Bugfix: (MBaker) Work item 16643 - Bug In Cache System (cell reference when throwing caching errors) +- Bugfix: (MBaker) Work item 16895 - PHP Invalid index notice on writing excel file when active sheet has been deleted +- Bugfix: (MBaker) Work item 16956 - External links in Excel2010 files cause Fatal error +- Bugfix: (MBaker) Work item 16960 - Previous calculation engine error conditions trigger cyclic reference errors +- Bugfix: (mkopinsky) Work item 16266 - PHPExcel_Style::applyFromArray() returns null rather than style object in advanced mode +- Bugfix: (fauvel) Work item 16958 - Cell::getFormattedValue returns RichText object instead of string +- Bugfix: (MBaker) Work item 17166 - Indexed colors do not refer to Excel's indexed colors? +- Bugfix: (MBaker) Work item 17199 - Indexed colors should be consistent with Excel and start from 1 (current index starts at 0) +- Bugfix: (MBaker) Work item 17262 - Named Range definition in .xls when sheet reeference is quote wrapped +- Bugfix: (MBaker) Work item 17403 - duplicateStyle() method doesn't duplicate conditional formats + Added an equivalent duplicateConditionalStyle() method for duplicating conditional styles +- Bugfix: (bnr) Work item 17501 - =sumproduct(A,B) <> =sumproduct(B,A) in xlsx +- Bugfix: (Progi1984) Work item 8916 - Support for Rich-Text in PHPExcel_Writer_Excel5 +- General: (MBaker) Work item 15405 - Two easy to fix Issues concerning PHPExcel_Token_Stack (l10n/UC) +- General: (MBaker) Work item 15461 - Locale file paths not fit for windows +- General: (MBaker) Work item 16643 - Add file directory as a cache option for cache_to_discISAM +- General: (MBaker) Work item 16923 - Datatype.php & constant TYPE_NULL +- General: (MBaker) Ensure use of system temp directory for all temporary work files, unless explicitly specified +- General: (char101) Work item 16359 - [Patch] faster stringFromColumnIndex() +- General: (whit1206) Work item 16028 - Fix for projects that still use old autoloaders +- General: (atz) Work item 17024 - Unknown codepage: 10007 + Additional Mac codepages + + +2011-02-27 (v1.7.6): +- Feature: (MBaker) Provide option to use PCLZip as an alternative to ZipArchive. + This allows the writing of Excel2007 files, even without ZipArchive enabled (it does require zlib), or when php_zip is one of the buggy PHP 5.2.6 or 5.2.8 versions + It can be enabled using PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP); + Note that it is not yet implemented as an alternative to ZipArchive for those Readers that are extracting from zips +- Feature: (MBaker) Work item 14979 - Added listWorksheetNames() method to Readers that support multiple worksheets in a workbook, allowing a user to extract a list of all the worksheet names from a file without parsing/loading the whole file. +- Feature: (MBaker) Speed boost and memory reduction in the Worksheet toArray() method. +- Feature: (MBaker) Added new rangeToArray() and namedRangeToArray() methods to the PHPExcel_Worksheet object. + Functionally, these are identical to the toArray() method, except that they take an additional first parameter of a Range (e.g. 'B2:C3') or a Named Range name. + Modified the toArray() method so that it actually uses rangeToArray(). +- Feature: (MBaker) Added support for cell comments in the OOCalc, Gnumeric and Excel2003XML Readers, and in the Excel5 Reader +- Feature: (MBaker) Improved toFormattedString() handling for Currency and Accounting formats to render currency symbols +- Feature: (MBaker) Work Item 2346 - Implement more Excel calculation functions + Implemented the DAVERAGE(), DCOUNT(), DCOUNTA(), DGET(), DMAX(), DMIN(), DPRODUCT(), DSTDEV(), DSTDEVP(), DSUM(), DVAR() and DVARP() Database functions +- Bugfix: (MBaker) Work item 14888 - Simple =IF() formula disappears +- Bugfix: (MBaker) Work item 14898 - PHP Warning: preg_match(): Compilation failed: PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X +- Bugfix: (MBaker) Work item 14901 - VLOOKUP choking on parameters in PHPExcel.1.7.5/PHPExcel_Writer_Excel2007 +- Bugfix: (MBaker) Work item 14973 - PHPExcel_Cell::isInRange() incorrect results - offset by one column +- Bugfix: (MBaker) Treat CodePage of 0 as CP1251 (for .xls files written by applications that don't set the CodePage correctly, such as Apple Numbers) +- Bugfix: (MB) Work item 11583 - Need method for removing autoFilter +- Bugfix: (MBaker) Work item 15029 - coordinateFromString throws exception for rows greater than 99,999 +- Bugfix: (MBaker) Work item 14999 - PHPExcel Excel2007 Reader colour problems with solidfill +- Bugfix: (MBaker) Work item 13215 - Formatting get lost and edit a template XLSX file +- Bugfix: (MBaker) Work item 14029 - Excel 2007 Reader /writer lost fontcolor +- Bugfix: (MBaker) Work item 13374 - file that makes cells go black +- Bugfix: (MBaker) Minor patchfix for Excel2003XML Reader when XML is defined with a charset attribute +- Bugfix: (MBaker) Work item 15089 - PHPExcel_Worksheet->toArray() index problem +- Bugfix: (MBaker) Work item 15094 - Merge cells 'un-merge' when using an existing spreadsheet +- Bugfix: (MBaker) Work item 15129 - Worksheet fromArray() only working with 2-D arrays +- Bugfix: (xkeshav) Work item 15172 - rangeToarray function modified for non-existent cells +- Bugfix: (MBaker) Work item 14980 - Images not getting copyied with the ->clone function +- Bugfix: (MBaker) Work item 11576 - AdvancedValueBinder.php: String sometimes becomes a date when it shouldn't +- Bugfix: (MBaker) Fix Excel5 Writer so that it only writes column dimensions for columns that are actually used rather than the full range (A to IV) +- Bugfix: (MBaker) Work item 15198 - FreezePane causing damaged or modified error + The freezePaneByColumnAndRow() method row argument should default to 1 rather than 0. + Default row argument for all __ByColumnAndRow() methods should be 1 +- Bugfix: (MBaker) Work item 15121 - Column reference rather than cell reference in Print Area definition + Fix Excel2007 Writer to handle print areas that are defined as row or column ranges rather than just as cell ranges +- Bugfix: (MBaker) Reduced false positives from isDateTimeFormatCode() method by suppressing testing within quoted strings +- Bugfix: (MBaker) Work item 15312 - Caching and tmp partition exhaustion +- Bugfix: (MBaker) Work item 15308 - Writing to Variable No Longer Works. $_tmp_dir Missing in PHPExcel\PHPExcel\Shared\OLE\PPS\Root.php +- Bugfix: (MBaker) Work item 15379 - Named ranges with dot don't get parsed properly +- Bugfix: (MBaker) Work item 15096 - insertNewRowBefore fails to consistently update references +- Bugfix: (MBaker) "i" is not a valid character for Excel date format masks (in isDateTimeFormatCode() method) +- Bugfix: (MKunert) Work item 15421 - PHPExcel_ReferenceHelper::insertNewBefore() is missing an 'Update worksheet: comments' section +- Bugfix: (MBaker) Work item 15409 - Full column/row references in named ranges not supported by updateCellReference() +- General: (MBaker) Improved performance (speed), for building the Shared Strings table in the Excel2007 Writer. +- General: (MBaker) Improved performance (speed), for PHP to Excel date conversions +- General: (MBaker) Enhanced SheetViews element structures in the Excel2007 Writer for frozen panes. +- General: (MBaker) Removed Serialized Reader/Writer as these no longer work. + + +2010-12-10 (v1.7.5): +- Feature: (MBaker) Work item 8769 - Implement Gnumeric File Format + Initial work on Gnumeric Reader (Worksheet Data, Document Properties and basic Formatting) +- Feature: (MBaker) (incorporating part of Workitem 9759) - Support for Extended Workbook Properties in Excel2007, Excel5 and OOCalc Readers; support for User-defined Workbook Properties in Excel2007 and OOCalc Readers +- Feature: (MBaker) Support for Extended and User-defined Workbook Properties in Excel2007 Writer +- Feature: (MBaker) Provided a setGenerateSheetNavigationBlock(false); option to suppress generation of the sheet navigation block when writing multiple worksheets to HTML +- Feature: (MBaker) Advanced Value Binder now recognises TRUE/FALSE strings (locale-specific) and converts to boolean +- Feature: (MBaker) Work item 14301 - PHPExcel_Worksheet->toArray() is returning truncated values +- Feature: (MBaker) Configure PDF Writer margins based on Excel Worksheet Margin Settings value +- Feature: (MBaker) Added Contiguous flag for the CSV Reader, when working with Read Filters +- Feature: (MBaker) Added getFormattedValue() method for cell object +- Feature: (MBaker) Added strictNullComparison argument to the worksheet fromArray() method +- Feature: (MBaker) Fix to toFormattedString() method in PHPExcel_Style_NumberFormat to handle fractions with a # code for the integer part +- Bugfix: (MB) Work item 14143 - NA() doesn't propagate in matrix calc - quick fix in JAMA/Matrix.php +- Bugfix: (Progi1984) Work item 7895 - Excel5 : Formula : String constant containing double quotation mark +- Bugfix: (Progi1984) Work item 7895 - Excel5 : Formula : Percent +- Bugfix: (Progi1984) Work item 7895 - Excel5 : Formula : Error constant +- Bugfix: (Progi1984) Work item 7895 - Excel5 : Formula : Concatenation operator +- Bugfix: (MBaker) Work item 14146 - Worksheet clone broken for CachedObjectStorage_Memory +- Bugfix: (MBaker) Work item 12998 - PHPExcel_Reader_Excel2007 fails when gradient fill without type is present in a file +- Bugfix: (MBaker) Work item 14176 - @ format for numeric strings in XLSX to CSV conversion +- Bugfix: (MBaker) Work item 14223 - Advanced Value Binder Not Working? +- Bugfix: (MBaker) Work item 14226 - unassigned object variable in PHPExcel->removeCellXfByIndex +- Bugfix: (MBaker) Work item 14236 - problem with getting cell values from another worksheet... (if cell doesn't exist) +- Bugfix: (MBaker) Work items 14260 & 14233 - Setting cell values to one char strings & Trouble reading one character string (thanks gorfou) +- Bugfix: (MBaker) Work item 14256 - Worksheet title exception when duplicate worksheet is being renamed but exceeds the 31 character limit +- Bugfix: (MBaker) Work item 14086 - Named range with sheet name that contains the $ throws exception when getting the cell +- Bugfix: (MBaker) Added autoloader to DefaultValueBinder and AdvancedValueBinder +- Bugfix: (MBaker) Modified PHPExcel_Shared_Date::isDateTimeFormatCode() to return false if format code begins with "_" or with "0 " to prevent false positives + These leading characters are most commonly associated with number, currency or accounting (or occasionally fraction) formats +- Bugfix: (MBaker) Work item 14374 - BUG : Excel5 and setReadFilter ? +- Bugfix: (MBaker) Work item 14425 - Wrong exception message while deleting column +- Bugfix: (MBaker) Work item 14679 - Formula evaluation fails with Japanese sheet refs +- Bugfix: (MBaker) Work item 13559 - PHPExcel_Writer_PDF does not handle cell borders correctly +- Bugfix: (MBaker) Work item 14831 - Style : applyFromArray() for 'allborders' not working +- Bugfix: (MBaker) Work item 14837 - Using $this when not in object context in Excel5 Reader +- General: (MBaker) Applied patch 6609 - Removes a unnecessary loop through each cell when applying conditional formatting to a range. +- General: (MBaker) Applied patch 7169 - Removed spurious PHP end tags (?>) +- General: (MBaker) Improved performance (speed) and reduced memory overheads, particularly for the Writers, but across the whole library. + + +2010-08-26 (v1.7.4): +- Bugfix: (Progi1984) Work item 7895 - Excel5 : Formula : Power +- Bugfix: (Progi1984) Work item 7895 - Excel5 : Formula : Unary plus +- Bugfix: (Progi1984) Excel5 : Just write the Escher stream if necessary in Worksheet +- Bugfix: (MBaker) Work item 13433 - Syntax errors in memcache.php 1.7.3c +- Bugfix: (MBaker) Work item 13450 - Standard Deviation functions returning DIV/0 Error when Standard Deviation is zero +- Feature: (MBaker) Support for print area with several ranges in the Excel2007 reader, and improved features for editing print area with several ranges +- Feature: (MBaker) Work item 13769 - Improved Cell Exception Reporting +- Feature: (MBaker) Support for row or column ranges in the calculation engine, e.g. =SUM(C:C) or =SUM(1:2) + Also support in the calculation engine for absolute row or column ranges e.g. =SUM($C:$E) or =SUM($3:5) +- Bugfix: (ET) Work item 13455 - Picture problem with Excel 2003 +- Bugfix: (MBaker) Work item 13484 - Wrong variable used in addExternalSheet in PHPExcel.php +- Bugfix: (MBaker) Work item 13515 - "Invalid cell coordinate" error when formula access data from an other sheet +- Bugfix: (MBaker) (related to Work item 13515) Calculation engine confusing cell range worksheet when referencing cells in a different worksheet to the formula +- Bugfix: (MBaker) Work item 13752 - Wrong var naming in Worksheet->garbageCollect() +- Bugfix: (MBaker) Work item 13764 - PHPExcel_Style_*::__clone() methods cause cloning loops? +- Bugfix: (MBaker) Work item 11488 - Recent builds causing problems loading xlsx files? (ZipArchive issue?) +- Bugfix: (MBaker) Work item 13856 - cache_to_apc causes fatal error when processing large data sets +- Bugfix: (MBaker) Work item 13880 - OOCalc reader misses first line if it's a 'table-header-row' +- Bugfix: (MBaker) Work item 14011 - using cache with copy or clone bug? + Fixed $worksheet->copy() or clone $worksheet when using cache_in_memory, cache_in_memory_gzip, cache_in_memory_serialized, cache_to_discISAM, cache_to_phpTemp, cache_to_apc and cache_to_memcache; + Fixed but untested when using cache_to_wincache. +- Bugfix: (MBaker) Fixed problems with reading Excel2007 Properties +- General: (MB) Applied patch 6324 - PHP Strict Standards: Non-static method PHPExcel_Shared_String::utf16_decode() should not be called statically +- General: (MBaker) Applied patch 6360 - Array functions were ignored when loading an existing file containing them, and as a result, they would lose their 'cse' status. +- General: (MBaker) Minor memory tweaks to Excel2007 Writer +- General: (MBaker) Modified ReferenceHelper updateFormulaReferences() method to handle updates to row and column cell ranges (including absolute references e.g. =SUM(A:$E) or =SUM($5:5), and range/cell references that reference a worksheet by name), and to provide both performance and memory improvements. +- General: (MBaker) Modified Excel2007 Reader so that ReferenceHelper class is instantiated only once rather than for every shared formula in a workbook. +- General: (MBaker) Correct handling for additional (synonym) formula tokens in Excel5 Reader +- General: (MBaker) Additional reading of some Excel2007 Extended Properties (Company, Manager) + + +2010-06-01 (v1.7.3c): +- Bugfix: (MB) Work item 13012 - Fatal error: Class 'ZipArchive' not found... ...Reader/Excel2007.php on line 217 +- Bugfix: (MBaker) Work item 13398 - PHPExcel_Writer_Excel2007 error after 1.7.3b + + +2010-05-31 (v1.7.3b): +- Bugfix: (MBaker) Work item 12903 - Infinite loop when reading +- Bugfix: (MB) Work item 13381 - Wrong method chaining on PHPExcel_Worksheet class + + +2010-05-17 (v1.7.3): +- General: (ET) Applied patch 4990 (modified) +- General: (MB) Applied patch 5568 (modified) +- General: (MB) Applied patch 5943 +- General: (MB) Work item 13042 - Upgrade build script to use Phing +- General: (ET) Work item 11586 - Replacing var with public/private +- General: (MBaker) Applied Anthony's Sterling's Class Autoloader to reduce memory overhead by "Lazy Loading" of classes +- General: (MBaker) Modification to functions that accept a date parameter to support string values containing ordinals as per Excel (English language only) +- General: (MBaker) Modify PHPExcel_Style_NumberFormat::toFormattedString() to handle dates that fall outside of PHP's 32-bit date range +- General: (MBaker) Applied patch 5207 +- General: (ET) Work item 11970 - PHPExcel developer documentation: Set page margins +- Feature: (ET) Work item 11038 - Special characters and accents in SYLK reader +- Feature: (MBaker) Work Item 2346 - Implement more Excel calculation functions + - Implemented the COUPDAYS(), COUPDAYBS(), COUPDAYSNC(), COUPNCD(), COUPPCD() and PRICE() Financial functions + - Implemented the N() and TYPE() Information functions + - Implemented the HYPERLINK() Lookup and Reference function +- Feature: (ET) Work item 11526 - Horizontal page break support in PHPExcel_Writer_PDF +- Feature: (ET) Work item 11529 - Introduce method setActiveSheetIndexByName() +- Feature: (ET) Work item 11550 - AdvancedValueBinder.php: Automatically wrap text when there is new line in string (ALT+"Enter") +- Feature: (ET) Work item 10300 - Data validation support in PHPExcel_Reader_Excel5 and PHPExcel_Writer_Excel5 +- Feature: (MB) Work item 11616 - Improve autosize calculation +- Feature: (MBaker) Methods to translate locale-specific function names in formulae + - Language implementations for Czech (cs), Danish (da), German (de), English (uk), Spanish (es), Finnish (fi), French (fr), Hungarian (hu), Italian (it), Dutch (nl), Norwegian (no), Polish (pl), Portuguese (pt), Brazilian Portuguese (pt_br), Russian (ru) and Swedish (sv) +- Feature: (ET) Work item 9759 - Implement document properties in Excel5 reader/writer + - Fixed so far for PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 11849 - Show/hide row and column headers in worksheet +- Feature: (ET) Work item 11919 - Can't set font on writing PDF (by key) +- Feature: (ET) Work item 12096 - Thousands scale (1000^n) support in PHPExcel_Style_NumberFormat::toFormattedString +- Feature: (ET) Work item 6911 - Implement repeating rows in PDF and HTML writer +- Feature: (ET) Work item 12289 - Sheet tabs in PHPExcel_Writer_HTML +- Feature: (MB) Work item 13041 - Add Wincache CachedObjectProvider +- Feature: (MBaker) Configure PDF Writer paper size based on Excel Page Settings value, and provided methods to override paper size and page orientation with the writer + - Note PHPExcel defaults to Letter size, while the previous PDF writer enforced A4 size, so PDF writer will now default to Letter +- Feature: (MBaker) Initial implementation of cell caching: allowing larger workbooks to be managed, but at a cost in speed +- Feature: (MBaker) Added an identify() method to the IO Factory that identifies the reader which will be used to load a particular file without actually loading it. +- Bugfix: (MBaker) Work item 10979 - Warning messages with INDEX function having 2 arguments +- Bugfix: (ET) Work item 11473 - setValue('=') should result in string instead of formula +- Bugfix: (MBaker) Work item 11471 - method _raiseFormulaError should no be private +- Bugfix: (ET) Work item 11485 - Fatal error: Call to undefined function mb_substr() in ...Classes\PHPExcel\Reader\Excel5.php on line 2903 +- Bugfix: (ET) Work item 11487 - getBold(), getItallic(), getStrikeThrough() not always working with PHPExcel_Reader_Excel2007 +- Bugfix: (ET) Work item 11492 - AdvancedValueBinder.php not working correctly for $cell->setValue('hh:mm:ss') +- Bugfix: (MBaker) Fixed leap year handling for the YEARFRAC() Date/Time function when basis ia 1 (Actual/actual) +- Bugfix: (MBaker) Work item 11490 - Warning messages + - Calculation Engine code modified to enforce strict standards for pass by reference +- Bugfix: (ET) Work item 11483 - PHPExcel_Cell_AdvancedValueBinder doesnt work for dates in far future +- Bugfix: (ET) Work item 11528 - MSODRAWING bug with long CONTINUE record in PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 11571 - PHPExcel_Reader_Excel2007 reads print titles as named range when there is more than one sheet +- Bugfix: (ET) Work item 11561 - missing @return in phpdocblock in reader classes +- Bugfix: (ET) Work item 11576 - AdvancedValueBinder.php: String sometimes becomes a date when it shouldn't +- Bugfix: (ET) Work item 11588 - Small numbers escape treatment in PHPExcel_Style_NumberFormat::toFormattedString() +- Bugfix: (ET) Work item 11590 - Blank styled cells are not blank in output by HTML writer due to &nbsp; +- Bugfix: (MBaker) Work item 11587 - Calculation engine bug: Existing, blank cell + number gives #NUM +- Bugfix: (ET) Work item 11608 - AutoSize only measures length of first line in cell with multiple lines (ALT+Enter) +- Bugfix: (ET) Work item 11608 - Fatal error running Tests/12serializedfileformat.php (PHPExcel 1.7.2) +- Bugfix: (MBaker) Fixed various errors in the WORKDAY() and NETWORKDAYS() Date/Time functions (particularly related to holidays) +- Bugfix: (ET) Work item 11660 - Uncaught exception 'Exception' with message 'Valid scale is between 10 and 400.' in Classes/PHPExcel/Worksheet/SheetView.php:115 +- Bugfix: (ET) Work item 11551 - "Unrecognized token 39 in formula" with PHPExcel_Reader_Excel5 (occuring with add-in functions) +- Bugfix: (ET) Work item 11668 - Excel2007 reader not reading PHPExcel_Style_Conditional::CONDITION_EXPRESSION +- Bugfix: (MBaker) Fix to the BESSELI(), BESSELJ(), BESSELK(), BESSELY() and COMPLEX() Engineering functions to use correct default values for parameters +- Bugfix: (MBaker) Work item 11525 - DATEVALUE function not working for pure time values + allow DATEVALUE() function to handle partial dates (e.g. "1-Jun" or "12/2010") +- Bugfix: (MBaker) Fix for empty quoted strings in formulae +- Bugfix: (MBaker) Trap for division by zero in Bessel functions +- Bugfix: (MBaker) Fix to OOCalc Reader to convert semi-colon (;) argument separator in formulae to a comma (,) +- Bugfix: (ET) Work item 11693 - PHPExcel_Writer_Excel5_Parser cannot parse formula like =SUM(C$5:C5) +- Bugfix: (MBaker) Fix to OOCalc Reader to handle dates that fall outside 32-bit PHP's date range +- Bugfix: (ET) Work item 11692 - File->sys_get_temp_dir() can fail in safe mode +- Bugfix: (ET) Work item 11727 - Sheet references in Excel5 writer do not work when referenced sheet title contains non-Latin symbols +- Bugfix: (ET) Work item 11743 - Bug in HTML writer can result in missing rows in output +- Bugfix: (ET) Work item 11674 - setShowGridLines(true) not working with PHPExcel_Writer_PDF +- Bugfix: (ET) Work item 11836 - PHPExcel_Worksheet_RowIterator initial position incorrect +- Bugfix: (ET) Work item 11835 - PHPExcel_Worksheet_HeaderFooterDrawing Strict Exception thrown (by jshaw86) +- Bugfix: (ET) Work item 11850 - Parts of worksheet lost when there are embedded charts (Excel5 reader) +- Bugfix: (MBaker) VLOOKUP() function error when lookup value is passed as a cell reference rather than an absolute value +- Bugfix: (ET) Work item 12041 - First segment of Rich-Text not read correctly by PHPExcel_Reader_Excel2007 +- Bugfix: (MBaker) Work item 12048 - Fatal Error with getCell('name') when name matches the pattern for a cell reference +- Bugfix: (ET) Work item 12039 - excel5 writer appears to be swapping image locations +- Bugfix: (ET) Work item 11954 - Undefined index: host in ZipStreamWrapper.php, line 94 and line 101 +- Bugfix: (ET) Work item 11672 - BIFF8 File Format problem (too short COLINFO record) +- Bugfix: (ET) Work item 12121 - Column width sometimes changed after read/write with Excel2007 reader/writer +- Bugfix: (ET) Work item 11964 - Worksheet.php throws a fatal error when styling is turned off via setReadDataOnly on the reader +- Bugfix: (MBaker) Work item 11851 - Checking for Circular References in Formulae + - Calculation Engine code now traps for cyclic references, raising an error or throwing an exception, or allows 1 or more iterations through cyclic references, based on a configuration setting +- Bugfix: (ET) Work item 12244 - PNG transparency using Excel2007 writer +- Bugfix: (ET) Work item 12221 - Custom readfilter error when cell formulas reference excluded cells (Excel5 reader) +- Bugfix: (ET) Work item 12288 - Protection problem in XLS +- Bugfix: (ET) Work item 12300 - getColumnDimension()->setAutoSize() incorrect on cells with Number Formatting +- Bugfix: (ET) Work item 12378 - Notices reading Excel file with Add-in funcitons (PHPExcel_Reader_Excel5) +- Bugfix: (ET) Work item 12380 - Excel5 reader not reading formulas with deleted sheet references +- Bugfix: (ET) Work item 12404 - Named range (defined name) scope problems for in PHPExcel +- Bugfix: (ET) Work item 12423 - PHP Parse error: syntax error, unexpected T_PUBLIC in PHPExcel/Calculation.php on line 3482 +- Bugfix: (ET) Work item 12505 - Named ranges don't appear in name box using Excel5 writer +- Bugfix: (ET) Work item 12509 - Many merged cells + autoSize column -> slows down the writer +- Bugfix: (ET) Work item 12539 - Incorrect fallback order comment in Shared/Strings.php ConvertEncoding() +- Bugfix: (ET) Work item 12538 - IBM AIX iconv() will not work, should revert to mbstring etc. instead +- Bugfix: (ET) Work item 12568 - Excel5 writer and mbstring functions overload +- Bugfix: (MBaker) Work item 12672 - OFFSET needs to flattenSingleValue the $rows and $columns args +- Bugfix: (MBaker) Work item 12546 - Formula with DMAX(): Notice: Undefined offset: 2 in ...\PHPExcel\Calculation.php on line 2365 + - Note that the Database functions have not yet been implemented +- Bugfix: (MBaker) Work item 12839 - Call to a member function getParent() on a non-object in Classes\\PHPExcel\\Calculation.php Title is required +- Bugfix: (MBaker) Work item 12935 - Cyclic Reference in Formula +- Bugfix: (MBaker) Work item 13025 - Memory error...data validation? + + +2010/01/11 (v1.7.2): +- General: (ET) Applied patch 4362 +- General: (ET) Applied patch 4363 (modified) +- General: (MBaker) Work item 10874 - 1.7.1 Extremely Slow - Refactored PHPExcel_Calculation_Functions::flattenArray() method and set calculation cache timer default to 2.5 seconds +- General: (MBaker) Allow formulae to contain line breaks +- General: (ET) Work item 10910 - split() function deprecated in PHP 5.3.0 +- General: (ET) sys_get_temp_dir() requires PHP 5.2.1, not PHP 5.2 [provide fallback function for PHP 5.2.0] +- General: (MBaker) Applied patch 4640 - Implementation of the ISPMT() Financial function by Matt Groves +- General: (MBaker) Work item 11052 - Put the example of formula with more arguments in documentation +- General: (MBaker) Improved accuracy for the GAMMAINV() Statistical Function +- Feature: (ET) Work item 10409 - XFEXT record support to fix colors change from Excel5 reader, and copy/paste color change with Excel5 writer + - Excel5 reader reads RGB color information in XFEXT records for borders, font color and fill color +- Feature: (MBaker) Work Item 2346 - Implement more Excel calculation functions + - Implemented the FVSCHEDULE(), XNPV(), IRR(), MIRR(), XIRR() and RATE() Financial functions + - Implemented the SUMPRODUCT() Mathematical function + - Implemented the ZTEST() Statistical Function +- Feature: (ET) Work item 10919 - Multiple print areas in one sheet +- Feature: (ET) Work item 10930 - Store calculated values in output by PHPExcel_Writer_Excel5 +- Feature: (ET) Work item 10939 - Sheet protection options in Excel5 reader/writer +- Feature: (MBaker) Modification of the COUNT(), AVERAGE(), AVERAGEA(), DEVSQ, AVEDEV(), STDEV(), STDEVA(), STDEVP(), STDEVPA(), VARA() and VARPA() SKEW() and KURT() functions to correctly handle boolean values depending on whether they're passed in as values, values within a matrix or values within a range of cells. +- Feature: (ET) Work item 9932 - Cell range selection +- Feature: (MB) Work item 10266 - Root-relative path handling +- Feature: (ET) Work item 11315 - Named Ranges not working with PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 11206 - Excel2007 Reader fails to load Apache POI generated Excel +- Bugfix: (MB) Work item 11154 - Number format is broken when system's thousands separator is empty +- Bugfix: (MB) Work item 11401 - ReferenceHelper::updateNamedFormulas throws errors if oldName is empty +- Bugfix: (MB) Work item 11296 - parse_url() fails to parse path to an image in xlsx +- Bugfix: (ET) Work item 10876 - Workaround for iconv_substr() bug in PHP 5.2.0 +- Bugfix: (ET) Work item 10877 - 1 pixel error for image width and height with PHPExcel_Writer_Excel5 +- Bugfix: (MBaker) Fix to GEOMEAN() Statistical function +- Bugfix: (ET) Work item 10884 - setValue('-') and setValue('.') sets numeric 0 instead of 1-character string +- Bugfix: (ET) Work item 10885 - Row height sometimes much too low after read with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10888 - Diagonal border. Miscellaneous missing support. + - Constant PHPExcel_Style_Borders::DIAGONAL_BOTH added to support double-diagonal (cross) + - PHPExcel_Reader_Excel2007 not always reading diagonal borders (only recognizes 'true' and not '1') + - PHPExcel_Reader_Excel5 support for diagonal borders + - PHPExcel_Writer_Excel5 support for diagonal borders +- Bugfix: (ET) Work item 10894 - Session bug: Fatal error: Call to a member function bindValue() on a non-object in ...\Classes\PHPExcel\Cell.php on line 217 +- Bugfix: (ET) Work item 10896 - Colors messed up saving twice with same instance of PHPExcel_Writer_Excel5 (regression since 1.7.0) +- Bugfix: (ET) Work item 10917 - Method PHPExcel_Worksheet::setDefaultStyle is not working +- Bugfix: (ET) Work item 10897 - PHPExcel_Reader_CSV::canRead() sometimes says false when it shouldn't +- Bugfix: (ET) Work item 10922 - Changes in workbook not picked up between two saves with PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 10913 - Decimal and thousands separators missing in HTML and PDF output +- Bugfix: (ET) Work item 10936 - Notices with PHPExcel_Reader_Excel5 and named array constants +- Bugfix: (MBaker) Work item 10938 - Calculation engine limitation on 32-bit platform with integers > 2147483647 +- Bugfix: (ET) Work item 10959 - Shared(?) formulae containing absolute cell references not read correctly using Excel5 Reader +- Bugfix: (MBaker) Work item 10962 - Warning messages with intersection operator involving single cell +- Bugfix: (ET) Work item 10980 - Infinite loop in Excel5 reader caused by zero-length string in SST +- Bugfix: (ET) Work item 10983 - Remove unnecessary cell sorting to improve speed by approx. 18% in HTML and PDF writers +- Bugfix: (MBaker) Work item 10977 - Cannot read A1 cell content - OO_Reader +- Bugfix: (ET) Work item 11000 - Transliteration failed, invalid encoding + + +2009/11/02 (v1.7.1): +- General: (ET) Work item 10687 - ereg() function deprecated in PHP 5.3.0 +- General: (MB) Work item 10739 - Writer Interface Inconsequence - setTempDir and setUseDiskCaching +- General: (ET) Upgrade to TCPDF 4.8.009 +- Feature: (ET) Work item 7333 - Support for row and column styles (feature request) + - Basic implementation for Excel2007/Excel5 reader/writer +- Feature: (ET) Work item 10459 - Hyperlink to local file in Excel5 reader/writer +- Feature: (MB) Work item 10472 - Color Tab (Color Sheet's name) +- Feature: (ET) Work item 10488 - Border style "double" support in PHPExcel_Writer_HTML +- Feature: (ET) Work item 10492 - Multi-section number format support in HTML/PDF/CSV writers +- Feature: (MBaker) - Some additional performance tweaks in the calculation engine +- Feature: (MBaker) - Fix result of DB() and DDB() Financial functions to 2dp when in Gnumeric Compatibility mode +- Feature: (MBaker) - Added AMORDEGRC(), AMORLINC() and COUPNUM() Financial function (no validation of parameters yet) +- Feature: (MBaker) - Improved accuracy of TBILLEQ(), TBILLPRICE() and TBILLYIELD() Financial functions when in Excel or Gnumeric mode +- Feature: (MBaker) - Added INDIRECT() Lookup/Reference function (only supports full addresses at the moment) +- Feature: (MB) Work item 10498 - PHPExcel_Reader_CSV::canRead() improvements +- Feature: (ET) Work item 10500 - Input encoding option for PHPExcel_Reader_CSV +- Feature: (ET) Work item 10493 - Colored number format support, e.g. [Red], in HTML/PDF output +- Feature: (ET) Work item 10559 - Color Tab (Color Sheet's name) [Excel5 reader/writer support] +- Feature: (MBaker) Initial version of SYLK (slk) and Excel 2003 XML Readers (Cell data and basic cell formatting) +- Feature: (MBaker) Initial version of Open Office Calc (ods) Reader (Cell data only) +- Feature: (MBaker) Initial use of "pass by reference" in the calculation engine for ROW() and COLUMN() Lookup/Reference functions +- Feature: (MBaker) Work item 2346 - COLUMNS() and ROWS() Lookup/Reference functions, and SUBSTITUTE() Text function +- Feature: (ET) Work item 10502 - AdvancedValueBinder(): Re-enable zero-padded string-to-number conversion, e.g '0004' -> 4 +- Feature: (ET) Work item 10600 - Make PHP type match Excel datatype +- Feature: (MB) Work item 10630 - Change first page number on header +- Feature: (MB) Applied patch 3941 +- Feature: (MB,ET) Work item 10745 - Hidden sheets +- Feature: (ET) Work item 10761 - mbstring fallback when iconv is broken +- Feature: (MBaker) Added support for matrix/value comparisons (e.g. ={1,2;3,4}>=3 or 2<>{1,2;3,4}) - Note, can't yet handle comparison of two matrices +- Feature: (MBaker) Improved handling for validation and error trapping in a number of functions +- Feature: (MBaker) Improved support for fraction number formatting +- Feature: (ET) Work item 10455 - Support Reading CSV with Byte Order Mark (BOM) +- Feature: (ET) Work item 10860 - addExternalSheet() at specified index +- Bugfix: (MBaker) Work item 10684 - Named range can no longer be passed to worksheet->getCell() +- Bugfix: (ET) Work item 10455 - RichText HTML entities no longer working in PHPExcel 1.7.0 +- Bugfix: (ET) Work item 7610 - Fit-to-width value of 1 is lost after read/write of Excel2007 spreadsheet [+ support for simultaneous scale/fitToPage] +- Bugfix: (MB) Work item 10469 - Performance issue identified by profiling +- Bugfix: (ET) Work item 10473 - setSelectedCell is wrong +- Bugfix: (ET) Work item 10481 - Images get squeezed/stretched with (Mac) Verdana 10 Excel files using Excel5 reader/writer +- Bugfix: (MBaker) Work item 10482 - Error in argument count for DATEDIF() function +- Bugfix: (MBaker) Work item 10452 - updateFormulaReferences is buggy +- Bugfix: (MB) Work item 10485 - CellIterator returns null Cell if onlyExistingCells is set and key() is in use +- Bugfix: (MBaker) Work item 10453 - Wrong RegEx for parsing cell references in formulas +- Bugfix: (MB) Work item 10486 - Optimisation subverted to devastating effect if IterateOnlyExistingCells is clear +- Bugfix: (ET) Work item 10494 - Fatal error: Uncaught exception 'Exception' with message 'Unrecognized token 6C in formula'... with PHPExcel_Reader_Excel5 +- Bugfix: (MBaker) Work item 10490 - Fractions stored as text are not treated as numbers by PHPExcel's calculation engine +- Bugfix: (ET) Work item 10503 - AutoFit (autosize) row height not working in PHPExcel_Writer_Excel5 +- Bugfix: (MBaker) Fixed problem with null values breaking the calculation stack +- Bugfix: (ET) Work item 10524 - Date number formats sometimes fail with PHPExcel_Style_NumberFormat::toFormattedString, e.g. [$-40047]mmmm d yyyy +- Bugfix: (MBaker) Fixed minor problem with DATEDIFF YM calculation +- Bugfix: (MB) Applied patch 3695 +- Bugfix: (ET) Work item 10536 - setAutosize() and Date cells not working properly +- Bugfix: (ET) Work item 10556 - Time value hour offset in output by HTML/PDF/CSV writers (system timezone problem) +- Bugfix: (ET) Work item 10558 - Control characters 0x14-0x1F are not treated by PHPExcel +- Bugfix: (ET) Work item 10560 - PHPExcel_Writer_Excel5 not working when open_basedir restriction is in effect +- Bugfix: (MBaker) Work item 10563 - IF formula calculation problem in PHPExcel 1.7.0 (string comparisons) +- Bugfix: (MBaker) Improved CODE() Text function result for UTF-8 characters +- Bugfix: (ET) Work item 10568 - Empty rows are collapsed with HTML/PDF writer +- Bugfix: (ET) Work item 10569 - Gaps between rows in output by PHPExcel_Writer_PDF (Upgrading to TCPDF 4.7.003) +- Bugfix: (ET) Work item 10575 - Problem reading formulas (Excel5 reader problem with "fake" shared formulas) +- Bugfix: (MBaker) Work item 10588 - Error type in formula: "_raiseFormulaError message is Formula Error: An unexpected error occured" +- Bugfix: (ET) Work item 10599 - Miscellaneous column width problems in Excel5/Excel2007 writer +- Bugfix: (ET) Work item 10615 - Reader/Excel5 'Unrecognized token 2D in formula' in latest version +- Bugfix: (ET) Work item 10623 - on php 5.3 PHPExcel 1.7 Excel 5 reader fails in _getNextToken, token = 2C, throws exception +- Bugfix: (ET) Work item 10617 - Fatal error when altering styles after workbook has been saved +- Bugfix: (ET) Work item 10661 - Images vertically stretched or squeezed when default font size is changed (PHPExcel_Writer_Excel5) +- Bugfix: (ET) Work item 10676 - Styles not read in "manipulated" Excel2007 workbook +- Bugfix: (ET) Work item 10059 - Windows 7 says corrupt file by PHPExcel_Writer_Excel5 when opening in Excel +- Bugfix: (MBaker) Work item 10708 - Calculations sometimes not working with cell references to other sheets +- Bugfix: (ET) Work item 10706 - Problem with merged cells after insertNewRowBefore() +- Bugfix: (MBaker) Applied patch 4023 +- Bugfix: (MBaker) Fix to SUMIF() and COUNTIF() Statistical functions for when condition is a match against a string value +- Bugfix: (ET) Work item 10721 - PHPExcel_Cell::coordinateFromString should throw exception for bad string parameter +- Bugfix: (ET) Work item 10723 - EucrosiaUPC (Thai font) not working with PHPExcel_Writer_Excel5 +- Bugfix: (MBaker) Improved the return of calculated results when the result value is an array +- Bugfix: (MBaker) Allow calculation engine to support Functions prefixed with @ within formulae +- Bugfix: (MBaker) Work item 10632 - Intersection operator (space operator) fatal error with calculation engine +- Bugfix: (ET) Work item 10742 - Chinese, Japanese, Korean characters show as squares in PDF +- Bugfix: (ET) Work item 10756 - sheet title allows invalid characters +- Bugfix: (ET) Work item 10757 - Sheet!$A$1 as function argument in formula causes infinite loop in Excel5 writer +- Bugfix: (MBaker) Work item 10740 - Cell range involving name not working with calculation engine - Modified calculation parser to handle range operator (:), but doesn't currently handle worksheet references with spaces or other non-alphameric characters, or trap erroneous references +- Bugfix: (MBaker) Work item 10798 - DATE function problem with calculation engine (says too few arguments given) +- Bugfix: (MBaker) Work item 10799 - Blank cell can cause wrong calculated value +- Bugfix: (MBaker) Modified ROW() and COLUMN() Lookup/Reference Functions to return an array when passed a cell range, plus some additional work on INDEX() +- Bugfix: (ET) Work item 10817 - Images not showing in Excel 97 using PHPExcel_Writer_Excel5 (patch by Jordi Gutiérrez Hermoso) +- Bugfix: (ET) Work item 10785 - When figures are contained in the excel sheet, Reader was stopped +- Bugfix: (MBaker) Work item 10818 - Formulas changed after insertNewRowBefore() +- Bugfix: (ET) Work item 10825 - Cell range row offset problem with shared formulas using PHPExcel_Reader_Excel5 +- Bugfix: (MBaker) Work item 10832 - Warning: Call-time pass-by-reference has been deprecated +- Bugfix: (ET) Work item 10849 - Image should "Move but don't size with cells" instead of "Move and size with cells" with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 10856 - Opening a Excel5 generated XLS in Excel 2007 results in header/footer entry not showing on input +- Bugfix: (ET) Work item 10859 - addExternalSheet() not returning worksheet +- Bugfix: (MBaker) Work item 10629 - Invalid results in formulas with named ranges + + +2009/08/10 (v1.7.0): +- General: (ET) Work item 9893 - Expand documentation: Number formats +- General: (ET) Work item 9941 - Class 'PHPExcel_Cell_AdvancedValueBinder' not found +- General: (MB) Work item 9960 - Change return type of date functions to PHPExcel_Calculation_Functions::RETURNDATE_EXCEL +- Feature: (MBaker) - New RPN and stack-based calculation engine for improved performance of formula calculation + - Faster (anything between 2 and 12 times faster than the old parser, depending on the complexity and nature of the formula) + - Significantly more memory efficient when formulae reference cells across worksheets + - Correct behaviour when referencing Named Ranges that exist on several worksheets + - Support for Excel ^ (Exponential) and % (Percentage) operators + - Support for matrices within basic arithmetic formulae (e.g. ={1,2,3;4,5,6;7,8,9}/2) + - Better trapping/handling of NaN and infinity results (return #NUM! error) + - Improved handling of empty parameters for Excel functions + - Optional logging of calculation steps +- Feature: (MBaker) - New calculation engine can be accessed independently of workbooks (for use as a standalone calculator) +- Feature: (MBaker) Work Item 2346 - Implement more Excel calculation functions + - Initial implementation of the COUNTIF() and SUMIF() Statistical functions + - Added ACCRINT() Financial function +- Feature: (MBaker) - Modifications to number format handling for dddd and ddd masks in dates, use of thousand separators even when locale only implements it for money, and basic fraction masks (0 ?/? and ?/?) +- Feature: (ET) Work item 9794 - Support arbitrary fixed number of decimals in PHPExcel_Style_NumberFormat::toFormattedString() +- Feature: (ET) Work item 6857 - Improving performance and memory on data dumps + - Various style optimizations (merging from branch wi6857-memory) + - Moving hyperlink and dataValidation properties from cell to worksheet for lower PHP memory usage +- Feature: (MB) Work item 9869 - Provide fluent interfaces where possible +- Feature: (ET) Work item 9899 - Make easy way to apply a border to a rectangular selection +- Feature: (ET) Work item 9906 - Support for system window colors in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 9911 - Horizontal center across selection +- Feature: (ET) Work item 9919 - Merged cells record, write to full record size in PHPExcel_Writer_Excel5 +- Feature: (MB) Work item 9895 - Add page break between sheets in exported PDF +- Feature: (ET) Work item 9902 - Sanitization of UTF-8 input for cell values +- Feature: (ET) Work item 9930 - Read cached calculated value with PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 9896 - Miscellaneous CSS improvements for PHPExcel_Writer_HTML +- Feature: (ET) Work item 9947 - getProperties: setCompany feature request +- Feature: (MB) Patch 2981 - Insert worksheet at a specified index +- Feature: (MB) Patch 3018 - Change worksheet index +- Feature: (MB) Patch 3039 - Readfilter for CSV reader +- Feature: (ET) Work item 10172 - Check value of mbstring.func_overload when saving with PHPExcel_Writer_Excel5 +- Feature: (ET) Work item 10251 - Eliminate dependency of an include path pointing to class directory +- Feature: (ET) Work item 10292 - Method for getting the correct reader for a certain file (contribution) +- Feature: (ET) Work item 10287 - Choosing specific row in fromArray method +- Feature: (ET) Work item 10319 - Shared formula support in PHPExcel_Reader_Excel5 +- Feature: (MB,ET) Work item 10345 - Right-to-left column direction in worksheet +- Bugfix: (ET) Work item 9824 - PHPExcel_Reader_Excel5 not reading PHPExcel_Style_NumberFormat::FORMAT_NUMBER ('0') +- Bugfix: (ET) Work item 9858 - Fractional row height in locale other than English results in corrupt output using PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 9846 - Fractional (decimal) numbers not inserted correctly when locale is other than English +- Bugfix: (ET) Work item 9863 - Fractional calculated value in locale other than English results in corrupt output using PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 9830 - Locale aware decimal and thousands separator in exported formats HTML, CSV, PDF +- Bugfix: (MB) Work item 9819 - Cannot Add Image with Space on its Name +- Bugfix: (ET) Work item 9884 - Black line at top of every page in output by PHPExcel_Writer_PDF +- Bugfix: (ET) Work item 9885 - Border styles and border colors not showing in HTML output (regression since 1.6.4) +- Bugfix: (ET) Work item 9888 - Hidden screen gridlines setting in worksheet not read by PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 9913 - Some valid sheet names causes corrupt output using PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 9934 - More than 32,767 characters in a cell gives corrupt Excel file +- Bugfix: (ET) Work item 9937 - Images not getting copyied with the ->copy() function +- Bugfix: (ET) Work item 9940 - Bad calculation of column width setAutoSize(true) function +- Bugfix: (ET) Work item 9968 - Dates are sometimes offset by 1 day in output by HTML and PDF writers depending on system timezone setting +- Bugfix: (ET) Work item 10003 - Wingdings symbol fonts not working with PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 10010 - White space string prefix stripped by PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 10023 - The name of the Workbook stream MUST be "Workbook", not "Book" +- Bugfix: (ET) Work item 10030 - Avoid message "Microsoft Excel recalculates formulas..." when closing xls file from Excel +- Bugfix: (ET) Work item 10031 - Non-unique newline representation causes problems with LEN formula +- Bugfix: (ET) Work item 10033 - Newline in cell not showing with PHPExcel_Writer_HTML and PHPExcel_Writer_PDF +- Bugfix: (ET) Work item 10046 - Rich-Text strings get prefixed by &nbsp; when output by HTML writer +- Bugfix: (ET) Work item 10052 - Leading spaces do not appear in output by HTML/PDF writers +- Bugfix: (MB) Work item 10061 - Empty Apache POI-generated file can not be read +- Bugfix: (ET) Work item 10068 - Column width not scaling correctly with font size in HTML and PDF writers +- Bugfix: (ET) Work item 10069 - Inaccurate row heights with HTML writer +- Bugfix: (MB) Patch 2992 - Reference helper +- Bugfix: (MBaker) - Excel 5 Named ranges should not be local to the worksheet, but accessible from all worksheets +- Bugfix: (ET) Work item 10088 - Row heights are ignored by PHPExcel_Writer_PDF +- Bugfix: (MB) Patch 3003 - Write raw XML +- Bugfix: (ET) Work item 10098 - removeRow(), removeColumn() not always clearing cell values +- Bugfix: (ET) Work item 10142 - Problem reading certain hyperlink records with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10143 - Hyperlink cell range read failure with PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 10149 - 'Column string index can not be empty.' +- Bugfix: (ET) Work item 10204 - getHighestColumn() sometimes says there are 256 columns with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10220 - extractSheetTitle fails when sheet title contains exclamation mark (!) +- Bugfix: (ET) Work item 10221 - setTitle() sometimes erroneously appends integer to sheet name +- Bugfix: (ET) Work item 10229 - Mac BIFF5 Excel file read failure (missing support for Mac OS Roman character set) +- Bugfix: (ET) Work item 10230 - BIFF5 header and footer incorrectly read by PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10259 - iconv notices when reading hyperlinks with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10252 - Excel5 reader OLE read failure with small Mac BIFF5 Excel files +- Bugfix: (ET) Work item 10272 - Problem in reading formula : IF( IF ) with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10274 - Error reading formulas referencing external sheets with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10291 - Image horizontally stretched when default font size is increased (PHPExcel_Writer_Excel5) +- Bugfix: (ET) Work item 10333 - Undefined offset in Reader\Excel5.php on line 3572 +- Bugfix: (MB) Work item 10340 - PDF output different then XLS (copied data) +- Bugfix: (ET) Work item 10352 - Internal hyperlinks with UTF-8 sheet names not working in PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 10361 - String shared formula result read error with PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 10363 - Uncaught exception 'Exception' with message 'Valid scale is between 10 and 400.' in Classes/PHPExcel/Worksheet/PageSetup.php:338 +- Bugfix: (ET) Work item 10355 - Using setLoadSheetsOnly fails if you do not use setReadDataOnly(true) and sheet is not the first sheet +- Bugfix: (MB) Work item 10362 - getCalculatedValue() sometimes incorrect with IF formula and 0-values +- Bugfix: (MBaker) Work Item 10198 - Excel Reader 2007 problem with "shared" formulae when "master" is an error +- Bugfix: (MBaker) Work Item 10106 - Named Range Bug, using the same range name on different worksheets +- Bugfix: (MBaker) Work Item 10004 - Java code in JAMA classes +- Bugfix: (MBaker) Work Item 9659 - getCalculatedValue() not working with some formulas involving error types +- Bugfix: (MBaker) Work Item 9447 - evaluation of both return values in an IF() statement returning an error if either result was an error, irrespective of the IF evaluation +- Bugfix: (MBaker) Work Item 6203 - Power in formulas: new calculation engine no longer treats ^ as a bitwise XOR operator +- Bugfix: (MBaker) - Bugfixes and improvements to many of the Excel functions in PHPExcel + - Added optional "places" parameter in the BIN2HEX(), BIN2OCT, DEC2BIN(), DEC2OCT(), DEC2HEX(), HEX2BIN(), HEX2OCT(), OCT2BIN() and OCT2HEX() Engineering Functions + - Trap for unbalanced matrix sizes in MDETERM() and MINVERSE() Mathematic and Trigonometric functions + - Fix for default characters parameter value for LEFT() and RIGHT() Text functions + - Fix for GCD() and LCB() Mathematical functions when the parameters include a zero (0) value + - Fix for BIN2OCT() Engineering Function for 2s complement values (which were returning hex values) + - Fix for BESSELK() and BESSELY() Engineering functions + - Fix for IMDIV() Engineering Function when result imaginary component is positive (wasn't setting the sign) + - Fix for ERF() Engineering Function when called with an upper limit value for the integration + - Fix to DATE() Date/Time Function for year value of 0 + - Set ISPMT() function as category FINANCIAL + - Fix for DOLLARDE() and DOLLARFR() Financial functions + - Fix to EFFECT() Financial function (treating $nominal_rate value as a variable name rather than a value) + - Fix to CRITBINOM() Statistical function (CurrentValue and EssentiallyZero treated as constants rather than variables) + Note that an Error in the function logic can still lead to a permanent loop + - Fix to MOD() Mathematical function to work with floating point results + - Fix for QUOTIENT() Mathematical function + - Fix to HOUR(), MINUTE() and SECOND() Date/Time functions to return an error when passing in a floating point value of 1.0 or greater, or less than 0 + - LOG() Function now correctly returns base-10 log when called with only one parameter, rather than the natural log as the default base + - Modified text functions to handle multibyte character set (UTF-8). + + +2009/04/22 (v1.6.7): +- General: (MB) Work item 9416 - Deprecate misspelled setStriketrough() and getStriketrough() methods +- General: (MB) Work item 9526 - Performance improvement when saving file +- Feature: (MB) Work item 9598 - Check that sheet title has maximum 31 characters +- Feature: (MB, ET) Work item 9631 - True support for Excel built-in number format codes +- Feature: (ET) Work item 9683 - Ability to read defect BIFF5 Excel file without CODEPAGE record +- Feature: (MB) Work item 9701 - Auto-detect which reader to invoke +- Feature: (ET) Work item 9214 - Deprecate insertion of dates using PHP-time (Unix time) [request for removal of feature] +- Feature: (ET) Work item 9747 - Support for entering time values like '9:45', '09:45' using AdvancedValueBinder +- Feature: (ET) Work item 9797 - DataType dependent horizontal alignment in HTML and PDF writer +- Bugfix: (MB) Work item 9375 - Cloning data validation object causes script to stop +- Bugfix: (ET) Work item 9400 - Simultaneous repeating rows and repeating columns not working with PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 9399 - Simultaneous repeating rows and repeating columns not working with PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 9437 - Row outline level not working with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 9452 - Occasional notices with PHPExcel_Reader_Excel5 when Excel file contains drawing elements +- Bugfix: (ET) Work item 9453 - PHPExcel_Reader_Excel5 fails as a whole when workbook contains images other than JPEG/PNG +- Bugfix: (ET) Work item 9444 - Excel5 writer checks for iconv but does not necessarily use it +- Bugfix: (ET) Work item 9463 - Altering a style on copied worksheet alters also the original +- Bugfix: (MB) Work item 9480 - Formulas are incorrectly updated when a sheet is renamed +- Bugfix: (MB) Work item 9513 - PHPExcel_Worksheet::extractSheetTitle not treating single quotes correctly +- Bugfix: (MB) Work item 9477 - PHP Warning raised in function array_key_exists +- Bugfix: (MB) Work item 9599 - getAlignWithMargins() gives wrong value when using PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 9600 - getScaleWithDocument() gives wrong value when using PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 9630 - PHPExcel_Reader_Excel2007 not reading the first user-defined number format +- Bugfix: (MB) Work item 9647 - Print area converted to uppercase after read with PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 9661 - Incorrect reading of scope for named range using PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 9690 - Error with pattern (getFillType) and rbg (getRGB) +- Bugfix: (ET) Work item 9712 - AdvancedValueBinder affected by system timezone setting when inserting date values +- Bugfix: (ET) Work item 9743 - PHPExcel_Reader_Excel2007 not reading value of active sheet index +- Bugfix: (ET) Work item 9742 - getARGB() sometimes returns SimpleXMLElement object instead of string with PHPExcel_Reader_Excel2007 +- Bugfix: (ET) Work item 9731 - Negative image offset causes defects in 14excel5.xls and 20readexcel5.xlsx +- Bugfix: (ET) Work item 9758 - HTML & PDF Writer not working with mergeCells (regression since 1.6.5) +- Bugfix: (ET) Work item 9774 - Too wide columns with HTML and PDF writer +- Bugfix: (MB) Work item 9775 - PDF and cyrillic fonts +- Bugfix: (ET) Work item 9793 - Percentages not working correctly with HTML and PDF writers (shows 0.25% instead of 25%) +- Bugfix: (ET) Work item 9791 - PHPExcel_Writer_HTML creates extra borders around cell contents using setUseInlineCss(true) +- Bugfix: (ET) Work item 9784 - Problem with text wrap + merged cells in HTML and PDF writer +- Bugfix: (ET) Work item 9814 - Adjacent path separators in include_path causing IOFactory to violate open_basedir restriction + + +-------------------------------------------------------------------------------- +BREAKING CHANGE! In previous versions of PHPExcel up to and including 1.6.6, +when a cell had a date-like number format code, it was possible to enter a date +directly using an integer PHP-time without converting to Excel date format. + +Starting with PHPExcel 1.6.7 this is no longer supported. Refer to the developer +documentation for more information on entering dates into a cell. +-------------------------------------------------------------------------------- + + +2009/03/02 (v1.6.6): +- General: (MB) Work item 9102 - Improve support for built-in number formats in PHPExcel_Reader_Excel2007 +- General: (ET) Work item 9281 - Source files are in both UNIX and DOS formats - changed to UNIX +- General: (MB) Work item 9338 - Update documentation: Which language to write formulas in? +- Feature: (ET) Work item 8817 - Ignore DEFCOLWIDTH records with value 8 in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 8847 - Support for width, height, offsetX, offsetY for images in PHPExcel_Reader_Excel5 +- Feature: (MB) Work item 8870 - Disk Caching in specific folder +- Feature: (MBaker) Work item 2346 - Added SUMX2MY2, SUMX2PY2, SUMXMY2, MDETERM and MINVERSE Mathematical and Trigonometric Functions +- Feature: (MBaker) Work item 2346 - Added CONVERT Engineering Function +- Feature: (MBaker) Work item 2346 - Added DB, DDB, DISC, DOLLARDE, DOLLARFR, INTRATE, IPMT, PPMT, PRICEDISC, PRICEMAT and RECEIVED Financial Functions +- Feature: (MBaker) Work item 2346 - Added ACCRINTM, CUMIPMT, CUMPRINC, TBILLEQ, TBILLPRICE, TBILLYIELD, YIELDDISC and YIELDMAT Financial Functions +- Feature: (MBaker) Work item 2346 - Added DOLLAR Text Function +- Feature: (MBaker) Work item 2346 - Added CORREL, COVAR, FORECAST, INTERCEPT, RSQ, SLOPE and STEYX Statistical Functions +- Feature: (MBaker) Work item 2346 - Added PEARSON Statistical Functions as a synonym for CORREL +- Feature: (MBaker) Work item 2346 - Added LINEST, LOGEST (currently only valid for stats = false), TREND and GROWTH Statistical Functions +- Feature: (MBaker) Work item 2346 - Added RANK and PERCENTRANK Statistical Functions +- Feature: (MBaker) Work item 2346 - Added ROMAN Mathematical Function (Classic form only) +- Feature: (MB) Work item 8931 - Update documentation to show example of getCellByColumnAndRow($col, $row) +- Feature: (MB) Work item 8770 - Implement worksheet, row and cell iterators +- Feature: (MB) Work item 9001 - Support for arbitrary defined names (named range) +- Feature: (MB, ET) Work item 9016 - Update formulas when sheet title / named range title changes +- Feature: (MB) Work item 9103 - Ability to read cached calculated value +- Feature: (MBaker, ET) Work item 8483 - Support for Excel 1904 calendar date mode (Mac) +- Feature: (ET) Work item 9194 - PHPExcel_Writer_Excel5 improvements writing shared strings table +- Feature: (ET) Work item 9248 - PHPExcel_Writer_Excel5 iconv fallback when mbstring extension is not enabled +- Feature: (ET) Work item 9253 - UTF-8 support in font names in PHPExcel_Writer_Excel5 +- Feature: (MB) Work item 9215 - Implement value binding architecture +- Feature: (MB) Work item 6742 - PDF writer not working with UTF-8 +- Feature: (ET) Work item 9355 - Eliminate duplicate style entries in multisheet workbook written by PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8810 - Redirect to client browser fails due to trailing white space in class definitions +- Bugfix: (MB) Work item 8816 - Spurious column dimension element introduced in blank worksheet after using PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 8830 - Image gets slightly narrower than expected when using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8831 - Image laid over non-visible row gets squeezed in height when using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8860 - PHPExcel_Reader_Excel5 fails when there are 10 or more images in the workbook +- Bugfix: (MB) Work item 8909 - Different header/footer images in different sheets not working with PHPExcel_Writer_Excel2007 +- Bugfix: (MB, ET) Work item 8924 - Fractional seconds disappear when using PHPExcel_Reader_Excel2007 and PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 7994 - Images not showing in OpenOffice when using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 9047 - Images not showing on print using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 9085 - PHPExcel_Writer_Excel5 maximum allowed record size 4 bytes too short +- Bugfix: (MB) Work item 9119 - Not numeric strings are formatted as dates and numbers using worksheet's toArray method +- Bugfix: (ET) Work item 9132 - Excel5 simple formula parsing error +- Bugfix: (ET) Work item 9206 - Problems writing dates with CSV +- Bugfix: (ET) Work item 9203 - PHPExcel_Reader_Excel5 reader fails with fatal error when reading group shapes +- Bugfix: (ET) Work item 9231 - PHPExcel_Writer_Excel5 fails completely when workbook contains more than 57 colors +- Bugfix: (ET) Work item 9244 - PHPExcel_Writer_PDF not compatible with autoload +- Bugfix: (ET) Work item 9250 - Fatal error: Call to a member function getNestingLevel() on a non-object in PHPExcel/Reader/Excel5.php on line 690 +- Bugfix: (MB) Work item 9246 - Notices when running test 04printing.php on PHP 5.2.8 +- Bugfix: (MB) Work item 9294 - insertColumn() spawns creation of spurious RowDimension +- BugFix: (MBaker) Work item 9296 - Fix declarations for methods in extended Trend classes +- Bugfix: (MBaker) Work item 2346 - Fix to parameters for the FORECAST Statistical Function +- Bugfix: (MB) Work item 7083 - PDF writer problems with cell height and text wrapping +- Bugfix: (MBaker) Work Item 9337 - Fix test for calculated value in case the returned result is an array +- Bugfix: (ET) Work Item 9354 - Column greater than 256 results in corrupt Excel file using PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 9351 - Excel Numberformat 0.00 results in non internal decimal places values in toArray() Method +- Bugfix: (MB,ET) Work item 9356 - setAutoSize not taking into account text rotation +- Bugfix: (ET) Work item 9372 - Call to undefined method PHPExcel_Worksheet_MemoryDrawing::getPath() in PHPExcel/Writer/HTML.php + + +2009/01/05 (v1.6.5): +- General: (MB) Applied patch 2063 +- General: (MB) Applied patch from work item 8073 - Optimise Shared Strings +- General: (MB) Applied patch from work item 8074 - Optimise Cell Sorting +- General: (MB) Applied patch from work item 8075 - Optimise Style Hashing +- General: (ET) Applied patch from work item 8245 - UTF-8 enhancements +- General: (ET) Applied patch from work item 8283 - PHPExcel_Writer_HTML validation errors against strict HTML 4.01 / CSS 2.1 +- General: (MB) Documented work items 6203 and 8110 in manual +- General: (ET) Restructure package hierachy so classes can be found more easily in auto-generated API (from work item 8468) +- General: (MB) Work item 8806 - Redirect output to a client's browser: Update recommendation in documentation +- Feature: (ET) Work item 7897 - PHPExcel_Reader_Excel5 support for print gridlines +- Feature: (ET) Work item 7899 - Screen gridlines support in Excel5 reader/writer +- Feature: (MB, ET) Work item 7552 - Option for adding image to spreadsheet from image resource in memory +- Feature: (ET) Work item 7862 - PHPExcel_Reader_Excel5 style support for BIFF5 files (Excel 5.0 - Excel 95) +- Feature: (ET) Work item 7918 - PHPExcel_Reader_Excel5 support for user-defined colors and special built-in colors +- Feature: (ET) Work item 7992 - Support for freeze panes in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 7996 - Support for header and footer margins in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 7997 - Support for active sheet index in Excel5 reader/writer +- Feature: (MB) Work item 7991 - Freeze panes not read by PHPExcel_Reader_Excel2007 +- Feature: (MB, ET) Work item 7993 - Support for screen zoom level (feature request) +- Feature: (ET) Work item 8012 - Support for default style in PHPExcel_Reader_Excel5 +- Feature: (MB) Work item 8094 - Apple iWork / Numbers.app incompatibility +- Feature: (MB) Work item 7931 - Support "between rule" in conditional formatting +- Feature: (MB) Work item 8308 - Comment size, width and height control (feature request) +- Feature: (ET) Work item 8418 - Improve method for storing MERGEDCELLS records in PHPExcel_Writer_Excel5 +- Feature: (ET) Work item 8435 - Support for protectCells() in Excel5 reader/writer +- Feature: (ET) Work item 8472 - Support for fitToWidth and fitToHeight pagesetup properties in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 8489 - Support for setShowSummaryBelow() and setShowSummaryRight() in PHPExcel_Writer_Excel5 +- Feature: (MB) Work item 8483 - Support for Excel 1904 calendar date mode (Mac) +- Feature: (ET) Work item 7538 - Excel5 reader: Support for reading images (bitmaps) +- Feature: (ET) Work item 8787 - Support for default style in PHPExcel_Writer_Excel5 +- Feature: (MBaker) Modified calculate() method to return either an array or the first value from the array for those functions that return arrays rather than single values (e.g the MMULT and TRANSPOSE function). This performance can be modified based on the $returnArrayAsType which can be set/retrieved by calling the setArrayReturnType() and getArrayReturnType() methods of the PHPExcel_Calculation class. +- Feature: (MBaker) Work item 2346 - Added ERROR.TYPE Information Function, MMULT Mathematical and Trigonometry Function, and TRANSPOSE Lookup and Reference Function +- Bugfix: (ET) Work item 7896 - setPrintGridlines(true) not working with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7907 - Incorrect mapping of fill patterns in PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 7898 - setShowGridlines(false) not working with PHPExcel_Writer_Excel2007 +- Bugfix: (MB) Work item 7905 - getShowGridlines() gives inverted value when reading sheet with PHPExcel_Reader_Excel2007 +- Bugfix: (ET) Work item 7944 - User-defined column width becomes slightly larger after read/write with Excel5 +- Bugfix: (ET) Work item 7949 - Incomplete border style support in PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 7928 - Conditional formatting "containsText" read/write results in MS Office Excel 2007 crash +- Bugfix: (MB) Work item 7995 - All sheets are always selected in output when using PHPExcel_Writer_Excel2007 +- Bugfix: (MB) Work item 8013 - COLUMN function warning message during plain read/write +- Bugfix: (MB) Work item 8155 - setValue(0) results in string data type '0' +- Bugfix: (MB) Work item 8226 - Styles not removed when removing rows from sheet +- Bugfix: (MB) Work item 8301 - =IF formula causes fatal error during $objWriter->save() in Excel2007 format +- Bugfix: (ET) Work item 8333 - Exception thrown reading valid xls file: "Excel file is corrupt. Didn't find CONTINUE record while reading shared strings" +- Bugfix: (ET) Work item 8320 - MS Outlook corrupts files generated by PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 8351 - Undefined method PHPExcel_Worksheet::setFreezePane() in ReferenceHelper.php on line 271 +- Bugfix: (MB) Work item 8401 - Ampersands (&), left and right angles (<, >) in Rich-Text strings leads to corrupt output using PHPExcel_Writer_Excel2007 +- Bugfix: (ET) Work item 8408 - Print header and footer not supporting UTF-8 in PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8463 - Vertical page breaks not working with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8476 - Missing support for accounting underline types in PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8482 - Infinite loops when reading corrupt xls file using PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 8566 - Sheet protection password not working with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8596 - PHPExcel_Style_NumberFormat::FORMAT_NUMBER ignored by PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8781 - PHPExcel_Reader_Excel5 fails a whole when workbook contains a chart +- Bugfix: (ET) Work item 8788 - Occasional loss of column widths using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 8795 - Notices while reading formulas with deleted sheet references using PHPExcel_Reader_Excel5 +- Bugfix: (MB) Work item 8807 - Default style not read by PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 9341 - Blank rows occupy too much space in file generated by PHPExcel_Writer_Excel2007 + + +2008/10/27 (v1.6.4): +- General: (ET) Work item 7882 - RK record number error in MS developer documentation: 0x007E should be 0x027E +- Feature: (MBaker) Work item 7878 - getHighestColumn() returning "@" for blank worksheet causes corrupt output +- Feature: (MBaker) Work item 2346 - Implement ROW and COLUMN Lookup/Reference Functions (when specified with a parameter) +- Feature: (MBaker) Work item 2346 - Implement initial work on OFFSET Lookup/Reference Function (returning address rather than value at address) +- Feature: (ET) Work item 7416 - Excel5 reader: Page margins +- Feature: (ET) Work item 7417 - Excel5 reader: Header & Footer +- Feature: (ET) Work item 7449 - Excel5 reader support for page setup (paper size etc.) +- Feature: (MB) Work item 7445 - Improve speed and memory consumption of PHPExcel_Writer_CSV +- Feature: (MB) Work item 7432 - Better recognition of number format in HTML, CSV, and PDF writer +- Feature: (MB) Work item 7485 - Font support: Superscript and Subscript +- Feature: (ET) Work item 7509 - Excel5 reader font support: Super- and subscript +- Feature: (ET) Work item 7521 - Excel5 reader style support: Text rotation and stacked text +- Feature: (ET) Work item 7530 - Excel5 reader: Support for hyperlinks +- Feature: (MB, ET) Work item 7557 - Import sheet by request +- Feature: (ET) Work item 7607 - PHPExcel_Reader_Excel5 support for page breaks +- Feature: (ET) Work item 7622 - PHPExcel_Reader_Excel5 support for shrink-to-fit +- Feature: (MB, ET) Work item 7675 - Support for error types +- Feature: (ET) Work item 7388 - Excel5 reader true formula support +- Feature: (ET) Work item 7701 - Support for named ranges (defined names) in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 7781 - Support for repeating rows and repeating columns (print titles) in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 7783 - Support for print area in PHPExcel_Reader_Excel5 +- Feature: (ET) Work item 7795 - Excel5 reader and writer support for horizontal and vertical centering of page +- Feature: (MB) Applied patch 1962 +- Feature: (ET) Work item 7866 - Excel5 reader and writer support for hidden cells (formulas) +- Feature: (MB, ET) Work item 7612 - Support for indentation in cells (feature request) +- Feature: (MB, ET) Work item 7828 - Option for reading only specified interval of rows in a sheet +- Bugfix: (MBaker) Work item 7367 - PHPExcel_Calculation_Functions::DATETIMENOW() and PHPExcel_Calculation_Functions::DATENOW() to force UTC +- Bugfix: (MBaker) Work item 7395 - Modified PHPExcel_Shared_Date::FormattedPHPToExcel() and PHPExcel_Shared_Date::ExcelToPHP to force datatype for return values +- Bugfix: (ET) Work item 7450 - Excel5 reader not producing UTF-8 strings with BIFF5 files +- Bugfix: (MB) Work item 7470 - Array constant in formula gives run-time notice with Excel2007 writer +- Bugfix: (MB) Work item 7494 - PHPExcel_Reader_Excel2007 setReadDataOnly(true) returns Rich-Text +- Bugfix: (ET) Work item 7496 - PHPExcel_Reader_Excel5 setReadDataOnly(true) returns Rich-Text +- Bugfix: (MB) Work item 7497 - Characters before superscript or subscript losing style +- Bugfix: (MB) Work item 7507 - Subscript not working with HTML writer +- Bugfix: (MB) Work item 7508 - DefaultColumnDimension not working on first column (A) +- Bugfix: (MB) Work item 7527 - Negative numbers are stored as text in PHPExcel_Writer_2007 +- Bugfix: (ET) Work item 7531 - Text rotation and stacked text not working with PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 7536 - PHPExcel_Shared_Date::isDateTimeFormatCode erroneously says true +- Bugfix: (MB) Work item 7559 - Different images with same filename in separate directories become duplicates +- Bugfix: (ET) Work item 7568 - PHPExcel_Reader_Excel5 not returning sheet names as UTF-8 using for Excel 95 files +- Bugfix: (MB) Work item 7575 - setAutoSize(true) on empty column gives column width of 10 using PHPExcel_Writer_Excel2007 +- Bugfix: (MB, ET) Work item 7573 - setAutoSize(true) on empty column gives column width of 255 using PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 7514 - Worksheet_Drawing bug +- Bugfix: (MB) Work item 7593 - getCalculatedValue() with REPT function causes script to stop +- Bugfix: (MB) Work item 7594 - getCalculatedValue() with LEN function causes script to stop +- Bugfix: (MB) Work item 7600 - Explicit fit-to-width (page setup) results in fit-to-height becoming 1 +- Bugfix: (MB) Work item 7610 - Fit-to-width value of 1 is lost after read/write of Excel2007 spreadsheet +- Bugfix: (MB) Work item 7516 - Conditional styles not read properly using PHPExcel_Reader_Excel2007 +- Bugfix: (MB) Work item 7611 - PHPExcel_Writer_2007: Default worksheet style works only for first sheet +- Bugfix: (ET) Work item 6940 - Cannot Lock Cells using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7621 - Incorrect cell protection values found when using Excel5 reader +- Bugfix: (ET) Work item 7623 - Default row height not working above highest row using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7637 - Default column width does not get applied when using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7642 - Broken support for UTF-8 string formula results in PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 7643 - UTF-8 sheet names not working with PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 7631 - getCalculatedValue() with ISNONTEXT function causes script to stop +- Bugfix: (ET) Work item 7652 - Missing BIFF3 functions in PHPExcel_Writer_Excel5: USDOLLAR (YEN), FINDB, SEARCHB, REPLACEB, LEFTB, RIGHTB, MIDB, LENB, ASC, DBCS (JIS) +- Bugfix: (ET) Work item 7663 - Excel5 reader doesn't read numbers correctly in 64-bit systems +- Bugfix: (ET) Work item 7667 - Missing BIFF5 functions in PHPExcel_Writer_Excel5: ISPMT, DATEDIF, DATESTRING, NUMBERSTRING +- Bugfix: (ET) Work item 7668 - Missing BIFF8 functions in PHPExcel_Writer_Excel5: GETPIVOTDATA, HYPERLINK, PHONETIC, AVERAGEA, MAXA, MINA, STDEVPA, VARPA, STDEVA, VARA +- Bugfix: (MB) Work item 7657 - Wrong host value in PHPExcel_Shared_ZipStreamWrapper::stream_open() +- Bugfix: (ET) Work item 7676 - PHPExcel_Reader_Excel5 not reading explicitly entered error types in cells +- Bugfix: (ET) Work item 7678 - Boolean and error data types not preserved for formula results in PHPExcel_Reader_Excel5 +- Bugfix: (MB) Work item 7695 - PHPExcel_Reader_Excel2007 ignores cell data type +- Bugfix: (ET) Work item 7712 - PHPExcel_Reader_Excel5 ignores cell data type +- Bugfix: (ET) Work item 7587 - PHPExcel_Writer_Excel5 not aware of data type +- Bugfix: (ET) Work item 7713 - Long strings sometimes truncated when using PHPExcel_Reader_Excel5 +- Bugfix: (ET) Work item 7727 - Direct entry of boolean or error type in cell not supported by PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 7714 - PHPExcel_Reader_Excel2007: Error reading cell with data type string, date number format, and numeric-like cell value +- Bugfix: (ET) Work item 7735 - Row and column outlines (group indent level) not showing after using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7737 - Missing UTF-8 support in number format codes for PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7750 - Missing UTF-8 support with PHPExcel_Writer_Excel5 for explicit string in formula +- Bugfix: (MB) Work item 7726 - Problem with class constants in PHPExcel_Style_NumberFormat +- Bugfix: (ET) Work item 7758 - Sometimes errors with PHPExcel_Reader_Excel5 reading hyperlinks +- Bugfix: (ET) Work item 7759 - Hyperlink in cell always results in string data type when using PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7771 - Excel file with blank sheet seen as broken in MS Office Excel 2007 when created by PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7785 - PHPExcel_Reader_Excel5: Incorrect reading of formula with explicit string containing (escaped) double-quote +- Bugfix: (MB) Work item 7787 - getCalculatedValue() fails on formula with sheet name containing (escaped) single-quote +- Bugfix: (MB) Work item 7786 - getCalculatedValue() fails on formula with explicit string containing (escaped) double-quote +- Bugfix: (MB) Work item 7780 - Problems with simultaneous repeatRowsAtTop and repeatColumnsAtLeft using Excel2007 reader and writer +- Bugfix: (ET) Work item 7802 - PHPExcel_Reader_Excel5: Error reading formulas with sheet reference containing special characters +- Bugfix: (ET) Work item 7831 - Off-sheet references sheet!A1 not working with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7834 - Repeating rows/columns (print titles), print area not working with PHPExcel_Writer_Excel5 +- Bugfix: (ET) Work item 7849 - Formula having datetime number format shows as text when using PHPExcel_Writer_Excel5 +- Bugfix: (MBaker) Work item 7863 - Cannot set formula to hidden using applyFromArray() +- Bugfix: (MBaker) Work item 7805 - HTML/PDF Writers limited to 26 columns by calculateWorksheetDimension (erroneous comparison in getHighestColumn() method) +- Bugfix: (MB) Work item 7873 - Formula returning error type is lost when read by PHPExcel_Reader_Excel2007 +- Bugfix: (ET) Work item 7883 - PHPExcel_Reader_Excel5: Cell style lost for last column in group of blank cells +- Bugfix: (MB) Work item 7886 - Column width sometimes collapses to auto size using Excel2007 reader/writer +- Bugfix: (MB) Work item 9343 - Data Validation Formula = 0 crashes Excel + + +2008/08/25 (v1.6.3): +- Bugfix: (MBaker) Work item 7367 - Modified PHPExcel_Shared_Date::PHPToExcel() to force UTC +- General: (MB) Applied patch 1629 +- General: (MB) Applied patch 1644 +- General: (MB) Work item 6485 - Implement repeatRow and repeatColumn in Excel5 writer +- General: (MB) Work item 6838 - Remove scene3d filter in Excel2007 drawing +- Feature: (MBaker) Work item 2346 - Implement CHOOSE and INDEX Lookup/Reference Functions +- Feature: (MBaker) Work item 2346 - Implement CLEAN Text Functions +- Feature: (MBaker) Work item 2346 - Implement YEARFRAC Date/Time Functions +- Feature: (MB) Work item 6508 - Implement 2 options for print/show gridlines +- Feature: (MB) Work item 7270 - Add VLOOKUP function (contribution) +- Feature: (MB) Work item 7182 - Implemented: ShrinkToFit +- Feature: (MB) Work item 7218 - Row heights not updated correctly when inserting new rows +- Feature: (MB) Work item 7157 - Copy worksheets within the same workbook +- Feature: (ET) Work item 7290 - Excel5 reader style support: horizontal and vertical alignment plus text wrap +- Feature: (ET) Work item 7294 - Excel5 reader support for merged cells +- Feature: (ET) Work item 7296 - Excel5 reader: Sheet Protection +- Feature: (ET) Work item 7297 - Excel5 reader: Password for sheet protection +- Feature: (ET) Work item 7299 - Excel5 reader: Column width +- Feature: (ET) Work item 7301 - Excel5 reader: Row height +- Feature: (ET) Work item 7304 - Excel5 reader: Font support +- Feature: (ET) Work item 7324 - Excel5 reader: support for locked cells +- Feature: (ET) Work item 7330 - Excel5 reader style support: Fill (background colors and patterns) +- Feature: (ET) Work item 7332 - Excel5 reader style support: Borders (style and color) +- Feature: (ET) Work item 7346 - Excel5 reader: Rich-Text support +- Feature: (MB) Work item 7313 - Read Excel built-in number formats with Excel 2007 reader +- Feature: (ET) Work item 7317 - Excel5 reader: Number format support +- Feature: (MB) Work item 7362 - Creating a copy of PHPExcel object +- Feature: (ET) Work item 7373 - Excel5 reader: support for row / column outline (group) +- Feature: (MB) Work item 7380 - Implement default row/column sizes +- Feature: (MB) Work item 7364 - Writer HTML - option to return styles and table separately +- Feature: (ET) Work item 7393 - Excel5 reader: Support for remaining built-in number formats +- Bugfix: (MBaker) Fixed rounding in HOUR MINUTE and SECOND Time functions, and improved performance for these +- Bugfix: (MBaker) Fix to TRIM function +- Bugfix: (MBaker) Fixed range validation in TIME Functions.php +- Bugfix: (MBaker) EDATE and EOMONTH functions now return date values based on the returnDateType flag +- Bugfix: (MBaker) Write date values that are the result of a calculation function correctly as Excel serialized dates rather than PHP serialized date values +- Bugfix: (MB) Work item 6690 - Excel2007 reader not always reading boolean correctly +- Bugfix: (MB) Work item 6275 - Columns above IZ +- Bugfix: (MB) Work item 6853 - Other locale than English causes Excel2007 writer to produce broken xlsx +- Bugfix: (MB) Work item 7061 - Typo: Number_fromat in NumberFormat.php +- Bugfix: (MB) Work item 6865 - Bug in Worksheet_BaseDrawing setWidth() +- Bugfix: (MB) Work item 6891 - PDF writer collapses column width for merged cells +- Bugfix: (MB) Work item 6867 - Issues with drawings filenames +- Bugfix: (MB) Work item 7073 - fromArray() local variable isn't defined +- Bugfix: (MB) Work item 7276 - PHPExcel_Writer_Excel5->setTempDir() not passed to all classes involved in writing to a file +- Bugfix: (MB) Work item 7277 - Excel5 reader not handling UTF-8 properly +- Bugfix: (MB) Work item 7327 - If you write a 0 value in cell, cell shows as empty +- Bugfix: (MB) Work item 7302 - Excel2007 writer: Row height ignored for empty rows +- Bugfix: (MB) Work item 7281 - Excel2007 (comments related error) +- Bugfix: (MB) Work item 7345 - Column width in other locale +- Bugfix: (MB) Work item 7347 - Excel2007 reader not reading underlined Rich-Text +- Bugfix: (ET) Work item 7357 - Excel5 reader converting booleans to strings +- Bugfix: (MB) Work item 7365 - Recursive Object Memory Leak +- Bugfix: (MB) Work item 7372 - Excel2007 writer ignoring row dimensions without cells +- Bugfix: (ET) Work item 7382 - Excel5 reader is converting formatted numbers / dates to strings + + +2008/06/23 (v1.6.2): +- General: (MB) Work item 6088 - Document style array values +- General: (MB) Applied patch 1195 +- General: (MB) Work item 6178 - Redirecting output to a client’s web browser - http headers +- General: (MB) Work item 6187 - Improve worksheet garbage collection +- General: (MBaker) Functions that return date values can now be configured to return as Excel serialized date/time, PHP serialized date/time, or a PHP date/time object. +- General: (MBaker) Functions that explicitly accept dates as parameters now permit values as Excel serialized date/time, PHP serialized date/time, a valid date string, or a PHP date/time object. +- General: (MBaker) Implement ACOSH, ASINH and ATANH functions for those operating platforms/PHP versions that don't include these functions +- General: (MBaker) Implement ATAN2 logic reversing the arguments as per Excel +- General: (MBaker) Additional validation of parameters for COMBIN +- General: (MBaker) Fixed validation for CEILING and FLOOR when the value and significance parameters have different signs; and allowed default value of 1 or -1 for significance when in GNUMERIC compatibility mode +- Feature: (MBaker) Work item 2346 - Implement ADDRESS, ISLOGICAL, ISTEXT and ISNONTEXT functions +- Feature: (MBaker) Work item 2346 - Implement COMPLEX, IMAGINARY, IMREAL, IMARGUMENT, IMCONJUGATE, IMABS, IMSUB, IMDIV, IMSUM, IMPRODUCT, IMSQRT, IMEXP, IMLN, IMLOG10, IMLOG2, IMPOWER IMCOS and IMSIN Engineering functions +- Feature: (MBaker) Work item 2346 - Implement NETWORKDAYS and WORKDAY Date/Time functions +- Feature: (MB) Work item 6100 - Make cell column AAA available +- Feature: (MB) Work item 6095 - Mark particular cell as selected when opening Excel +- Feature: (MB) Work item 6120 - Multiple sheets in PDF and HTML +- Feature: (MB) Work item 6227 - Implement PHPExcel_ReaderFactory and PHPExcel_WriterFactory +- Feature: (MB) Work item 6249 - Set image root of PHPExcel_Writer_HTML +- Feature: (MB) Work item 6264 - Enable/disable calculation cache +- Feature: (MB) Work item 6259 - PDF writer and multi-line text +- Feature: (MB) Work item 6350 - Feature request - setCacheExpirationTime() +- Feature: (JB) Work item 6370 - Implement late-binding mechanisms to reduce memory footprint +- Feature: (JB) Work item 6430 - Implement shared styles +- Feature: (MB) Work item 6391 - Copy sheet from external Workbook to active Workbook +- Feature: (MB) Work item 6428 - Functions in Conditional Formatting +- Bugfix: (MB) Work item 6096 - Default Style in Excel5 +- Bugfix: (MB) Work item 6150 - Numbers starting with '+' cause Excel 2007 errors +- Bugfix: (MB) Work item 6092 - ExcelWriter5 is not PHP5 compatible, using it with E_STRICT results in a bunch of errors (applied patches) +- Bugfix: (MB) Work item 6179 - Error Reader Excel2007 line 653 foreach ($relsDrawing->Relationship as $ele) +- Bugfix: (MB) Work item 6229 - Worksheet toArray() screws up DATE +- Bugfix: (MB) Work item 6253 - References to a Richtext cell in a formula +- Bugfix: (MB) Work item 6285 - insertNewColumnBefore Bug +- Bugfix: (MB) Work item 6319 - Error reading Excel2007 file with shapes +- Bugfix: (MBaker) Work item 6302 - Determine whether date values need conversion from PHP dates to Excel dates before writing to file, based on the data type (float or integer) +- Bugfix: (MBaker) Fixes to DATE function when it is given negative input parameters +- Bugfix: (MB) Work item 6347 - PHPExcel handles empty cells other than Excel +- Bugfix: (MB) Work item 6348 - PHPExcel handles 0 and "" as being the same +- Bugfix: (MB) Work item 6357 - Problem Using Excel2007 Reader for Spreadsheets containing images +- Bugfix: (MB) Work item 6359 - ShowGridLines ignored when reading/writing Excel 2007 +- Bugfix: (MB) Work item 6426 - Bug With Word Wrap in Excel 2007 Reader + + +2008/04/28 (v1.6.1): +- General: (MB) Work item 5532 - Fix documentation printing +- General: (MB) Work item 5586 - Memory usage improvements +- General: (MB) Applied patch 990 +- General: (MB) Applied patch 991 +- Feature: (BM) Work item 2841 - Implement PHPExcel_Reader_Excel5 +- Feature: (MB) Work item 5564 - Implement "toArray" and "fromArray" method +- Feature: (MB) Work item 5665 - Read shared formula +- Feature: (MB) Work item 5681 - Read image twoCellAnchor +- Feature: (MB) Work item 4446 - &G Image as bg for headerfooter +- Feature: (MB) Work item 5834 - Implement page layout functionality for Excel5 format +- Feature: (MB) Work item 6039 - Feature request: PHPExcel_Writer_PDF +- Bugfix: (MB) Work item 5517 - DefinedNames null check +- Bugfix: (MB) Work item 5463 - Hyperlinks should not always have trailing slash +- Bugfix: (MB) Work item 5592 - Saving Error - Uncaught exception (#REF! named range) +- Bugfix: (MB) Work item 5634 - Error when creating Zip file on Linux System (Not Windows) +- Bugfix: (MB) Work item 5876 - Time incorrecly formated +- Bugfix: (MB) Work item 5914 - Conditional formatting - second rule not applied +- Bugfix: (MB) Work item 5978 - PHPExcel_Reader_Excel2007 cannot load PHPExcel_Shared_File +- Bugfix: (MB) Work item 6020 - Output redirection to web browser + + +2008/02/14 (v1.6.0): +- General: (MB) Work item 3156 - Use PHPExcel datatypes in formula calculation +- Feature: (MB) Work item 5019 - Center on page when printing +- Feature: (MB) Work item 5099 - Hyperlink to other spreadsheet +- Feature: (MB) Work item 5104 - Set the print area of a worksheet +- Feature: (MB) Work item 5118 - Read "definedNames" property of worksheet +- Feature: (MB) Work item 5338 - Set default style for all cells +- Feature: (MB) Work item 4216 - Named Ranges +- Feature: (MB) Work item 5398 - Implement worksheet references (Sheet1!A1) +- Bugfix: (MB) Work item 4967 - Redirect output to a client's web browser +- Bugfix: (MB) Work item 5008 - "File Error: data may have been lost." seen in Excel 2007 and Excel 2003 SP3 when opening XLS file +- Bugfix: (MB) Work item 5165 - Bug in style's getHashCode() +- Bugfix: (MB) Work item 5165 - PHPExcel_Reader not correctly reading numeric values +- Bugfix: (MB) Work item 5324 - Text rotation is read incorrectly +- Bugfix: (MB) Work item 5326 - Enclosure " and data " result a bad data : \" instead of "" +- Bugfix: (MB) Work item 5332 - Formula parser - IF statement returning array instead of scalar +- Bugfix: (MB) Work item 5351 - setFitToWidth(nbpage) & setFitToWidth(nbpage) work partially +- Bugfix: (MB) Work item 5361 - Worksheet::setTitle() causes unwanted renaming +- Bugfix: (MB) Work item 5407 - Hyperlinks not working. Results in broken xlsx file. + + +2007/12/24 (v1.5.5): +- General: (MB) Work item 4135 - Grouping Rows +- General: (MB) Work item 4427 - Semi-nightly builds +- Feature: (MB) Work item 3155 - Implement "date" datatype +- Feature: (MB) Work item 4150 - Date format not honored in CSV writer +- Feature: (MB) Work item 4199 - RichText and sharedStrings +- Feature: (MB) Work item 2346 - Implement more Excel calculation functions + - Addition of DATE, DATEDIF, DATEVALUE, DAY, DAYS360 +- Feature: (MBaker) Work item 2346 - Implement more Excel calculation functions + - Addition of AVEDEV, HARMEAN and GEOMEAN + - Addition of the BINOMDIST (Non-cumulative only), COUNTBLANK, EXPONDIST, FISHER, FISHERINV, NORMDIST, NORMSDIST, PERMUT, POISSON (Non-cumulative only) and STANDARDIZE Statistical Functions + - Addition of the CEILING, COMBIN, EVEN, FACT, FACTDOUBLE, FLOOR, MULTINOMIAL, ODD, ROUNDDOWN, ROUNDUP, SIGN, SQRTPI and SUMSQ Mathematical Functions + - Addition of the NORMINV, NORMSINV, CONFIDENCE and SKEW Statistical Functions + - Addition of the CRITBINOM, HYPGEOMDIST, KURT, LOGINV, LOGNORMDIST, NEGBINOMDIST and WEIBULL Statistical Functions + - Addition of the LARGE, PERCENTILE, QUARTILE, SMALL and TRIMMEAN Statistical Functions + - Addition of the BIN2HEX, BIN2OCT, DELTA, ERF, ERFC, GESTEP, HEX2BIN, HEX2DEC, HEX2OCT, OCT2BIN and OCT2HEX Engineering Functions + - Addition of the CHIDIST, GAMMADIST and GAMMALN Statistical Functions + - Addition of the GCD, LCM, MROUND and SUBTOTAL Mathematical Functions + - Addition of the LOWER, PROPER and UPPER Text Functions + - Addition of the BETADIST and BETAINV Statistical Functions + - Addition of the CHIINV and GAMMAINV Statistical Functions + - Addition of the SERIESSUM Mathematical Function + - Addition of the CHAR, CODE, FIND, LEN, REPT, SEARCH, T, TRIM Text Functions + - Addition of the FALSE and TRUE Boolean Functions + - Addition of the TDIST and TINV Statistical Functions + - Addition of the EDATE, EOMONTH, YEAR, MONTH, TIME, TIMEVALUE, HOUR, MINUTE, SECOND, WEEKDAY, WEEKNUM, NOW, TODAY and Date/Time Function + - Addition of the BESSELI, BESSELJ, BESSELK and BESSELY Engineering Functions + - Addition of the SLN and SYD Financial Functions + - reworked MODE calculation to handle floating point numbers + - Improved error trapping for invalid input values + - Fix to SMALL, LARGE, PERCENTILE and TRIMMEAN to eliminate non-numeric values + - Added CDF to BINOMDIST and POISSON + - Fix to a potential endless loop in CRITBINOM, together with other bugfixes to the algorithm + - Fix to SQRTPI so that it will work with a real value parameter rather than just integers + - Trap for passing negative values to FACT + - Improved accuracy of the NORMDIST cumulative function, and of the ERF and ERFC functions + - Replicated Excel data-type and error handling for BIN, DEC, OCT and HEX conversion functions + - Replicated Excel data-type and error handling for AND and OR Boolean functions + - Bugfix to MROUND + - Rework of the DATE, DATEVALUE, DAY, DAYS360 and DATEDIF date/Time functions to use Excel dates rather than straight PHP dates + - Rework of the AND, OR Boolean functions to ignore string values + - Rework of the BIN2DEC, BIN2HEX, BIN2OCT, DEC2BIN, DEC2HEX, DEC2OCT Engineering functions to handle two's complement + - Excel, Gnumeric and OpenOffice Calc compatibility flag for functions + Note, not all functions have yet been written to work with the Gnumeric and OpenOffice Calc compatibility flags + - 1900 or 1904 Calendar flag for date functions + - Reworked ExcelToPHP date method to handle the Excel 1900 leap year + Note that this will not correctly return values prior to 13-Dec-1901 20:45:52 as this is the minimum value that PHP date serial values can handle. If you need to work with dates prior to this, then an ExcelToPHPObject method has been added which will work correctly with values between Excel's 1900 calendar base date of 1-Jan-1900, and 13-Dec-1901 + - Addition of ExcelToPHPObject date method to return a PHP DateTime object from an Excel date serial value + - PHPToExcel method modified to accept either PHP date serial numbers or PHP DateTime objects + - Addition of FormattedPHPToExcel which will accept a date and time broken to into year, month, day, hour, minute, second and return an Excel date serial value +- Feature: (MB) Work item 4485 - Control characters in Excel 2007 +- Feature: (MB) Work item 4796 - BaseDrawing::setWidthAndHeight method request +- Feature: (MB) Work item 4798 - Page Setup -> Print Titles -> Sheet -> 'Rows to repeat at top' +- Feature: (MB) Work item 4433 - Comment functionality +- Bugfix: (MB) Work item 4124 - Undefined variable in PHPExcel_Writer_Serialized +- Bugfix: (MB) Work item 4125 - Notice: Object of class PHPExcel_RichText could not be converted to int +- Bugfix: (MB) Work item 4126 - Excel5Writer: utf8 string not converted to utf16 +- Bugfix: (MB) Work item 4180 - PHPExcel_RichText and autosize +- Bugfix: (MB) Work item 4574 - Excel5Writer produces broken xls files after change mentioned in work item 4126 +- Bugfix: (MB) Work item 4797 - Small bug in PHPExcel_Reader_Excel2007 function _readStyle + + +2007/10/23 (v 1.5.0): +- General: (MB) Work item 3265 - Refactor PHPExcel Drawing +- Feature: (CS) Work item 3079 - Update Shared/OLE.php to latest version from PEAR +- Feature: (MB) Work item 3217 - Excel2007 vs Excel2003 compatibility pack +- Feature: (MB) Work item 3234 - Cell protection (lock/unlock) +- Feature: (MB) Work item 3543 - Create clickable links (hyperlinks) +- Feature: (MB) Work item 3241 - Additional page setup parameters +- Feature: (MB) Work item 3300 - Make temporary file path configurable (Excel5) +- Feature: (MB) Work item 3306 - Small addition to applyFromArray for font +- Feature: (MB) Work item 3373 - Better feedback when save of file is not possible +- Bugfix: (MB) Work item 3181 - Text Rotation +- Bugfix: (MB) Work item 3237 - Small bug in Page Orientation +- Bugfix: (MB) Work item 3812 - insertNewColumnBeforeByColumn undefined +- Bugfix: (MB) Work item 3893 - Sheet references not working in formula (Excel5 Writer) + + +2007/08/23 (v 1.4.5): +- General: (MB) Work item 3003 - Class file endings +- General: (MB) Work item 3081 - Different calculation engine improvements +- General: (MB) Work item 3082 - Different improvements in PHPExcel_Reader_Excel2007 +- General: (MB) Work item 3146 - Set XML indentation in PHPExcel_Writer_Excel2007 +- Feature: (MB) Work item 3159 - Optionally store temporary Excel2007 writer data in file instead of memory +- Feature: (MB) Work item 3063 - Implement show/hide gridlines +- Feature: (MB) Work item 3064 - Implement option to read only data +- Feature: (MB) Work item 3080 - Optionally disable formula precalculation +- Feature: (MB) Work item 3154 - Explicitly set cell datatype +- Feature: (MBaker) Work item 2346 - Implement more Excel calculation functions + - Addition of MINA, MAXA, COUNTA, AVERAGEA, MEDIAN, MODE, DEVSQ, STDEV, STDEVA, STDEVP, STDEVPA, VAR, VARA, VARP and VARPA Excel Functions + - Fix to SUM, PRODUCT, QUOTIENT, MIN, MAX, COUNT and AVERAGE functions when cell contains a numeric value in a string datatype, bringing it in line with MS Excel behaviour +- Bugfix: (MB) Work item 2881 - File_exists on ZIP fails on some installations +- Bugfix: (MB) Work item 2879 - Argument in textRotation should be -90..90 +- Bugfix: (MB) Work item 2883 - Excel2007 reader/writer not implementing OpenXML/SpreadsheetML styles 100% correct +- Bugfix: (MB) Work item 2513 - Active sheet index not read/saved +- Bugfix: (MB) Work item 2935 - Print and print preview of generated XLSX causes Excel2007 to crash +- Bugfix: (MB) Work item 2952 - Error in Calculations - COUNT() function +- Bugfix: (MB) Work item 3002 - HTML and CSV writer not writing last row +- Bugfix: (MB) Work item 3017 - Memory leak in Excel5 writer +- Bugfix: (MB) Work item 3044 - Printing (PHPExcel_Writer_Excel5) +- Bugfix: (MB) Work item 3046 - Problems reading zip:// +- Bugfix: (MB) Work item 3047 - Error reading conditional formatting +- Bugfix: (MB) Work item 3067 - Bug in Excel5 writer (storePanes) +- Bugfix: (MB) Work item 3077 - Memory leak in PHPExcel_Style_Color + + +2007/07/23 (v 1.4.0): +- General: (MB) Work item 2687 - Coding convention / code cleanup +- General: (MB) Work item 2717 - Use set_include_path in tests +- General: (MB) Work item 2812 - Move PHPExcel_Writer_Excel5 OLE to PHPExcel_Shared_OLE +- Feature: (MB) Work item 2679 - Hide/Unhide Column or Row +- Feature: (MB) Work item 2271 - Implement multi-cell styling +- Feature: (MB) Work item 2720 - Implement CSV file format (reader/writer) +- Feature: (MB) Work item 2845 - Implement HTML file format +- Bugfix: (MB) Work item 2513 - Active sheet index not read/saved +- Bugfix: (MB) Work item 2678 - Freeze Panes with PHPExcel_Writer_Excel5 +- Bugfix: (MB) Work item 2680 - OLE.php +- Bugfix: (MB) Work item 2736 - Copy and pasting multiple drop-down list cells breaks reader +- Bugfix: (MB) Work item 2775 - Function setAutoFilterByColumnAndRow takes wrong arguments +- Bugfix: (MB) Work item 2858 - Simplexml_load_file fails on ZipArchive + + +2007/06/27 (v 1.3.5): +- General: (MB) Work item 15 - Documentation +- Feature: (JV) PHPExcel_Writer_Excel5 +- Feature: (JV) PHPExcel_Reader_Excel2007: Image shadows +- Feature: (MB) Work item 2385 - Data validation +- Feature: (MB) Work item 187 - Implement richtext strings +- Bugfix: (MB) Work item 2443 - Empty relations when adding image to any sheet but the first one +- Bugfix: (MB) Work item 2536 - Excel2007 crashes on print preview + + +2007/06/05 (v 1.3.0): +- General: (MB) Work item 1942 - Create PEAR package +- General: (MB) Work item 2331 - Replace *->duplicate() by __clone() +- Feature: (JV) PHPExcel_Reader_Excel2007: Column auto-size, Protection, Merged cells, Wrap text, Page breaks, Auto filter, Images +- Feature: (MB) Work item 245 - Implement "freezing" panes +- Feature: (MB) Work item 2273 - Cell addressing alternative +- Feature: (MB) Work item 2270 - Implement cell word-wrap attribute +- Feature: (MB) Work item 2282 - Auto-size column +- Feature: (MB) Work item 241 - Implement formula calculation +- Feature: (MB) Work item 2375 - Insert/remove row/column +- Bugfix: (MB) Work item 1931 - PHPExcel_Worksheet::getCell() should not accept absolute coordinates +- Bugfix: (MB) Work item 2272 - Cell reference without row number +- Bugfix: (MB) Work item 2276 - Styles with same coordinate but different worksheet +- Bugfix: (MB) Work item 2290 - PHPExcel_Worksheet->getCellCollection() usort error +- Bugfix: (SS) Work item 2353 - Bug in PHPExcel_Cell::stringFromColumnIndex +- Bugfix: (JV) Work item 2353 - Reader: numFmts can be missing, use cellStyleXfs instead of cellXfs in styles + + +2007/04/26 (v 1.2.0): +- General: (MB) Stringtable attribute "count" not necessary, provides wrong info to Excel sometimes... +- General: (MB) Updated tests to address more document properties +- General: (MB) Some refactoring in PHPExcel_Writer_Excel2007_Workbook +- General: (MB) New package: PHPExcel_Shared +- General: (MB) Password hashing algorithm implemented in PHPExcel_Shared_PasswordHasher +- General: (MB) Moved pixel conversion functions to PHPExcel_Shared_Drawing +- General: (MB) Work item 244 - Switch over to LGPL license +- General: (MB) Work item 5 - Include PHPExcel version in file headers +- Feature: (MB) Work item 6 - Autofilter +- Feature: (MB) Work item 7 - Extra document property: keywords +- Feature: (MB) Work item 8 - Extra document property: category +- Feature: (MB) Work item 9 - Document security +- Feature: (MB) Work item 10 - PHPExcel_Writer_Serialized and PHPExcel_Reader_Serialized +- Feature: (MB) Work item 11 - Alternative syntax: Addressing a cell +- Feature: (MB) Work item 12 - Merge cells +- Feature: (MB) Work item 13 - Protect ranges of cells with a password +- Bugfix: (JV) Work item 14 - (style/fill/patternFill/fgColor or bgColor can be empty) + + +2007/03/26 (v 1.1.1): +- Bugfix: (MB) Work item 1250 - Syntax error in "Classes/PHPExcel/Writer/Excel2007.php" on line 243 +- General: (MB) Work item 1282 - Reader should check if file exists and throws an exception when it doesn't + + +2007/03/22 (v 1.1.0): +- Changed filenames of tests +- Bugfix: (MB) Work item 836 - Style information lost after passing trough Excel2007_Reader +- Bugfix: (MB) Work item 913 - Number of columns > AZ fails fixed in PHPExcel_Cell::columnIndexFromString +- General: (MB) Added a brief file with installation instructions +- Feature: (MB) Page breaks (horizontal and vertical) +- Feature: (MB) Image shadows + + + +2007/02/22 (v 1.0.0): +- Changelog now includes developer initials +- Bugfix: (JV) PHPExcel->removeSheetByIndex now re-orders sheets after deletion, so no array indexes are lost +- Bugfix: (JV) PHPExcel_Writer_Excel2007_Worksheet::_writeCols() used direct assignment to $pSheet->getColumnDimension('A')->Width instead of $pSheet->getColumnDimension('A')->setWidth() +- Bugfix: (JV) DocumentProperties used $this->LastModifiedBy instead of $this->_lastModifiedBy. +- Bugfix: (JV) Only first = should be removed when writing formula in PHPExcel_Writer_Excel2007_Worksheet. +- General: (JV) Consistency of method names to camelCase +- General: (JV) Updated tests to match consistency changes +- General: (JV) Detection of mime-types now with image_type_to_mime_type() +- General: (JV) Constants now hold string value used in Excel 2007 +- General: (MB) Fixed folder name case (WorkSheet -> Worksheet) +- Feature: (MB) PHPExcel classes (not the Writer classes) can be duplicated, using a duplicate() method. +- Feature: (MB) Cell styles can now be duplicated to a range of cells using PHPExcel_Worksheet->duplicateStyle() +- Feature: (MB) Conditional formatting +- Feature: (JV) Reader for Excel 2007 (not supporting full specification yet!) + + + +2007/01/31 (v 1.0.0 RC): +- Project name has been changed to PHPExcel +- Project homepage is now http://www.codeplex.com/PHPExcel +- Started versioning at number: PHPExcel 1.0.0 RC + + + +2007/01/22: +- Fixed some performance issues on large-scale worksheets (mainly loops vs. indexed arrays) +- Performance on creating StringTable has been increased +- Performance on writing Excel2007 worksheet has been increased + + + +2007/01/18: +- Images can now be rotated +- Fixed bug: When drawings have full path specified, no mime type can be deducted +- Fixed bug: Only one drawing can be added to a worksheet + + + +2007/01/12: +- Refactoring of some classes to use ArrayObject instead of array() +- Cell style now has support for number format (i.e. #,##0) +- Implemented embedding images + + + +2007/01/02: +- Cell style now has support for fills, including gradient fills +- Cell style now has support for fonts +- Cell style now has support for border colors +- Cell style now has support for font colors +- Cell style now has support for alignment + + + +2006/12/21: +- Support for cell style borders +- Support for cell styles +- Refactoring of Excel2007 Writer into multiple classes in package SpreadSheet_Writer_Excel2007 +- Refactoring of all classes, changed public members to public properties using getter/setter +- Worksheet names are now unique. On duplicate worksheet names, a number is appended. +- Worksheet now has parent SpreadSheet object +- Worksheet now has support for page header and footer +- Worksheet now has support for page margins +- Worksheet now has support for page setup (only Paper size and Orientation) +- Worksheet properties now accessible by using getProperties() +- Worksheet now has support for row and column dimensions (height / width) +- Exceptions thrown have a more clear description + + + +Initial version: +- Create a Spreadsheet object +- Add one or more Worksheet objects +- Add cells to Worksheet objects +- Export Spreadsheet object to Excel 2007 OpenXML format +- Each cell supports the following data formats: string, number, formula, boolean. \ No newline at end of file diff --git a/fannie/src/PHPExcel/install.txt b/fannie/src/PHPExcel/install.txt new file mode 100644 index 000000000..e52bcda8e --- /dev/null +++ b/fannie/src/PHPExcel/install.txt @@ -0,0 +1,75 @@ +************************************************************************************** +* PHPExcel +* +* Copyright (c) 2006 - 2011 PHPExcel +* +* 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 Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) +* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +* @version 1.7.8, 2012-10-12 +************************************************************************************** + +Requirements +------------ + +The following requirements should be met prior to using PHPExcel: +* PHP version 5.2.0 or higher +* PHP extension php_zip enabled *) +* PHP extension php_xml enabled +* PHP extension php_gd2 enabled (if not compiled in) + +*) php_zip is only needed by PHPExcel_Reader_Excel2007, PHPExcel_Writer_Excel2007, + PHPExcel_Reader_OOCalc. In other words, if you need PHPExcel to handle .xlsx or .ods + files you will need the zip extension, but otherwise not. + + + +Installation instructions +------------------------- + +Installation is quite easy: copy the contents of the Classes folder to any location +in your application required. + +Example: + +If your web root folder is /var/www/ you may want to create a subfolder called +/var/www/Classes/ and copy the files into that folder so you end up with files: + +/var/www/Classes/PHPExcel.php +/var/www/Classes/PHPExcel/Calculation.php +/var/www/Classes/PHPExcel/Cell.php +... + + + +Getting started +--------------- + +A good way to get started is to run some of the tests included in the download. +Copy the "Tests" folder next to your "Classes" folder from above so you end up with: + +/var/www/Tests/01simple.php +/var/www/Tests/02types.php +... + +Start running the test by pointing your browser to the test scripts: + +http://example.com/Tests/01simple.php +http://example.com/Tests/02types.php +... + +Note: It may be necessary to modify the include/require statements at the beginning of +each of the test scripts if your "Classes" folder from above is named differently. diff --git a/fannie/src/PHPExcel/license.txt b/fannie/src/PHPExcel/license.txt new file mode 100644 index 000000000..57b74d4c7 --- /dev/null +++ b/fannie/src/PHPExcel/license.txt @@ -0,0 +1,345 @@ +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 \ No newline at end of file diff --git a/fannie/src/ReportConvert/ArrayToCsv.php b/fannie/src/ReportConvert/ArrayToCsv.php new file mode 100644 index 000000000..c602be114 --- /dev/null +++ b/fannie/src/ReportConvert/ArrayToCsv.php @@ -0,0 +1,22 @@ +<?php + +function ArrayToCsv($array){ + $ret = ""; + + foreach($array as $row){ + foreach($row as $col){ + $r = "\""; + if ( ($pos = strpos($col,chr(0))) !== False){ + $col = substr($col,0,$pos); + } + $r .= str_replace("\"","",$col); + $r .= "\","; + $ret .= $r; + } + $ret = rtrim($ret,",")."\r\n"; + } + + return $ret; +} + +?> diff --git a/fannie/src/ReportConvert/ArrayToXls.php b/fannie/src/ReportConvert/ArrayToXls.php new file mode 100644 index 000000000..f790f7f50 --- /dev/null +++ b/fannie/src/ReportConvert/ArrayToXls.php @@ -0,0 +1,75 @@ +<?php + +function ArrayToXls($array){ + global $FANNIE_ROOT; + + include_once($FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer.php'); + include_once($FANNIE_ROOT.'src/tmp_dir.php'); + + $fn = tempnam(sys_get_temp_dir(),"xlstemp"); + $workbook = new Spreadsheet_Excel_Writer($fn); + $worksheet =& $workbook->addWorksheet(); + + $format_bold =& $workbook->addFormat(); + $format_bold->setBold(); + + for($i=0;$i<count($array);$i++){ + for($j=0;$j<count($array[$i]);$j++){ + if ( ($pos = strpos($array[$i][$j],chr(0))) !== False){ + $val = substr($array[$i][$j],0,$pos); + $worksheet->write($i,$j,$val,$format_bold); + } + else + $worksheet->write($i,$j,$array[$i][$j]); + } + } + + $workbook->close(); + + $ret = file_get_contents($fn); + unlink($fn); + return $ret; +} + +function ArrayToXls2($array){ + $ret = xlsBOF(); + $rownum = 1; + foreach($array as $row){ + $colnum = 0; + foreach($row as $col){ + if (is_numeric($col)) + $ret .= xlsWriteNumber($rownum,$colnum,$col); + elseif(!empty($col)) + $ret .= xlsWriteLabel($rownum,$colnum,$col); + $colnum++; + } + $rownum++; + } + $ret .= xlsEOF(); + + return $ret; +} + +/* additional functions from example @ + http://www.appservnetwork.com/modules.php?name=News&file=article&sid=8 +*/ +function xlsBOF() { + return pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); +} + +function xlsEOF() { + return pack("ss", 0x0A, 0x00); +} + +function xlsWriteNumber($Row, $Col, $Value) { + return pack("sssss", 0x203, 14, $Row, $Col, 0x0) + . pack("d", $Value); +} + +function xlsWriteLabel($Row, $Col, $Value ) { + $L = strlen($Value); + return pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x2bc, $L) + . $Value; +} + +?> diff --git a/fannie/src/ReportConvert/HtmlToArray.php b/fannie/src/ReportConvert/HtmlToArray.php new file mode 100644 index 000000000..cfd3a7b34 --- /dev/null +++ b/fannie/src/ReportConvert/HtmlToArray.php @@ -0,0 +1,44 @@ +<?php + +function HtmlToArray($str){ + + $dom = new DOMDocument(); + @$dom->loadHTML($str); // ignore warning on [my] poorly formed html + + $tables = $dom->getElementsByTagName("table"); + $rows = $tables->item(0)->getElementsByTagName('tr'); + + /* convert tables to 2-d array */ + $ret = array(); + $i = 0; + foreach($rows as $row){ + $ret[$i] = array(); + foreach($row->childNodes as $node){ + if (!property_exists($node,'tagName')) continue; + $val = trim($node->nodeValue,chr(160).chr(194)); + if ($node->tagName=="th") $val .= chr(0).'bold'; + + if ($node->tagName=="th" || $node->tagName=="td") + $ret[$i][] = $val; + } + $i++; + } + + /* prepend any other lines to the array */ + $str = preg_replace("/<table.*?>.*<\/table>/s","",$str); + $str = preg_replace("/<head.*?>.*<\/head>/s","",$str); + $str = preg_replace("/<body.*?>/s","",$str); + $str = str_replace("</body>","",$str); + $str = str_replace("<html>","",$str); + $str = str_replace("</html>","",$str); + + $extra = preg_split("/<br.*?>/s",$str); + foreach(array_reverse($extra) as $e){ + if (!empty($e)) + array_unshift($ret,array($e)); + } + + return $ret; +} + +?> diff --git a/fannie/src/SQLManager.php b/fannie/src/SQLManager.php new file mode 100644 index 000000000..c8243ef92 --- /dev/null +++ b/fannie/src/SQLManager.php @@ -0,0 +1,1019 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SQLManager + @brief A SQL abstraction layer + + Custom SQL abstraction based on ADOdb. + Provides some limited functionality for queries + across two servers that are useful for lane-server + communication +*/ +if (!function_exists("ADONewConnection")) include(dirname(__FILE__).'/../adodb5/adodb.inc.php'); + +class SQLManager { + + private $QUERY_LOG; + + /** Array of connections **/ + var $connections; + /** Default database connection */ + var $default_db; + + /** Constructor + @param $server Database server host + @param $type Database type. Most supported are + 'mysql' and 'mssql' but anything ADOdb supports + will kind of work + @param $database Database name + @param $username Database username + @param $password Database password + @param $persistent Make persistent connection. + */ + function SQLManager($server,$type,$database,$username,$password='',$persistent=False){ + $this->QUERY_LOG = dirname(__FILE__)."/../logs/queries.log"; + $this->connections=array(); + $this->default_db = $database; + $this->add_connection($server,$type,$database,$username,$password,$persistent); + } + + /** Add another connection + @param $server Database server host + @param $type Database type. Most supported are + 'mysql' and 'mssql' but anything ADOdb supports + will kind of work + @param $database Database name + @param $username Database username + @param $password Database password + @param $persistent Make persistent connection. + + When dealing with multiple connections, user the + database name to distinguish which is to be used + */ + function add_connection($server,$type,$database,$username,$password='',$persistent=False){ + $conn = ADONewConnection($type); + $conn->SetFetchMode(ADODB_FETCH_BOTH); + $ok = False; + if (isset($this->connections[$database])){ + $ok = $conn->NConnect($server,$username,$password,$database); + } + else { + if ($persistent) + $ok = $conn->PConnect($server,$username,$password,$database); + else + $ok = $conn->Connect($server,$username,$password,$database); + } + $this->connections[$database] = $conn; + + if (!$ok){ + $conn = ADONewConnection($type); + $conn->SetFetchMode(ADODB_FETCH_BOTH); + $ok = $conn->Connect($server,$username,$password); + if ($ok){ + $stillok = $conn->Execute("CREATE DATABASE $database"); + if (!$stillok){ + $this->connections[$database] = False; + return False; + } + $conn->Execute("USE $database"); + $this->connections[$database] = $conn; + } + else { + $this->connections[$database] = False; + return False; + } + } + return True; + } + + /** + Close a database connection + @param $which_connection + If there are multiple connections, this is + the database name for the connection you want to close + */ + function close($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + unset($this->connections[$which_connection]); + + return $con->Close(); + } + + /** + Execute a query + @param $query_text The query + @param which_connection see method close + @return A result object on success, False on failure + */ + function query($query_text,$which_connection='',$params=False){ + $ql = $this->QUERY_LOG; + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + + $ok = (!is_object($con)) ? False : $con->Execute($query_text,$params); + if (!$ok && is_writable($ql)){ + $fp = fopen($ql,'a'); + if (is_array($query_text)) + $query_text = $query_text[0]; + fputs($fp,$_SERVER['PHP_SELF'].": ".date('r').': '.$query_text."\n"); + fputs($fp,$this->error()."\n\n"); + fclose($fp); + } + else if (!$ok){ + if (is_array($query_text)) + $query_text = $query_text[0]; + echo "Bad query: {$_SERVER['PHP_SELF']}: $query_text<br />"; + echo $this->error($which_connection)."<br />"; + } + return $ok; + } + + /** + Execute a query on all connected databases + @param $query_text The query + @return An array keyed by database name. Entries + will be result objects where queries succeeded + and False where they failed + */ + function query_all($query_text){ + $ret = array(); + foreach($this->connections as $db_name => $con){ + $ret[$db_name] = $this->query($query_text,$db_name); + } + return $ret; + } + + /** + Escape a string for SQL-safety + @param $query_text The string to escape + @param $which_connection see method close() + @return The escaped string + + Note that the return value will include start and + end single quotes + */ + function escape($query_text,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $this->connections[$which_connection]->qstr($query_text); + } + + function identifier_escape($str,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return '`'.$str.'`'; + case 'mssql': + return '['.$str.']'; + } + return $str; + } + + /** + Get number of rows in a result set + @param $result_object A result set + @param $which_connection see method close() + @return Integer number or False if there's an error + */ + function num_rows($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $result_object->RecordCount(); + } + + /** + Move result cursor to specified record + @param $result_object A result set + @param $rownum The record index + @param $which_connection see method close() + @return True on success, False on failure + */ + function data_seek($result_object,$rownum,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $result_object->Move((int)$rownum); + } + + /** + Get number of fields in a result set + @param $result_object A result set + @param $which_connection see method close() + @return Integer number or False if there's an error + */ + function num_fields($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $result_object->FieldCount(); + } + + /** + Get next record from a result set + @param $result_object A result set + @param $which_connection see method close() + @return An array of values + */ + function fetch_array($result_object,$which_connection=''){ + if (is_null($result_object)) return false; + if ($result_object === false) return false; + + if ($which_connection == '') + $which_connection = $this->default_db; + $ret = $result_object->fields; + if ($result_object) + $result_object->MoveNext(); + return $ret; + } + + /** + Get next record from a result set but as an object + @param $result_object A result set + @param $which_connection see method close() + @return An object with member containing values + */ + function fetch_object($result_object,$which_connection=''){ + return $result_object->FetchNextObject(False); + } + + /** + An alias for the method fetch_array() + */ + function fetch_row($result_object,$which_connection=''){ + return $this->fetch_array($result_object,$which_connection); + } + + /** + Get the database's function for present time + @param $which_connection see method close() + @return The appropriate function + + For example, with MySQL this will return the + string 'NOW()'. + */ + function now($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $this->connections[$which_connection]->sysTimeStamp; + } + + /** + Get the database's date difference function + @param $date1 First date + @param $date2 Second date + @param $which_connection see method close() + @return The appropriate function + + Arguments are inverted for some databases to + ensure consistent results. If $date1 is today + and $date2 is yesterday, this method returns + a SQL function that evaluates to 1. + */ + function datediff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "datediff($date1,$date2)"; + case 'mssql': + return "datediff(dd,$date2,$date1)"; + } + } + + /** + Get the databases' month difference function + @param $date1 First date + @param $date2 Second date + @param $which_connection see method close() + @return The SQL expression + + Arguments are inverted for some databases to + ensure consistent results. If $date1 is this month + and $date2 is last month, this method returns + a SQL expression that evaluates to 1. + */ + + function monthdiff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "period_diff(date_format($date1, '%Y%m'), date_format($date2, '%Y%m'))"; + case 'mssql': + return "datediff(mm,$date2,$date1)"; + } + } + + /** + Get the difference between two dates in seconds + @param $date1 First date (or datetime) + @param $date2 Second date (or datetime) + @param $which_connection see method close() + @return The SQL expression + + This method currently only suport MySQL and MSSQL + */ + function seconddiff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "TIMESTAMPDIFF(SECOND,$date1,$date2)"; + case 'mssql': + return "datediff(ss,$date2,$date1)"; + } + } + + /** + Get a date formatted YYYYMMDD + @param $date1 The date (or datetime) + @param $which_connection see method close() + @return The SQL expression + + This method currently only supports MySQL and MSSQL + */ + function dateymd($date1,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "DATE_FORMAT($date1,'%Y%m%d')"; + case 'mssql': + return "CONVERT(CHAR(11),$date1,112)"; + } + } + + /** + Get a SQL convert function + @param $expr An SQL expression + @param $type Convert to this SQL type + @param $which_connection see method close() + @return The SQL expression + + This method currently only supports MySQL and MSSQL + + */ + function convert($expr,$type,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + if(strtoupper($type)=='INT') + $type='SIGNED'; + return "CONVERT($expr,$type)"; + case 'mssql': + return "CONVERT($type,$expr)"; + } + return ""; + } + + /** + Find index of a substring within a larger string + @param $substr Search string (needle) + @param $str Target string (haystack) + @param $which_connection see method close() + @return The SQL expression + + This method currently only supports MySQL and MSSQL + */ + function locate($substr,$str,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "LOCATE($substr,$str)"; + case 'mssql': + return "CHARINDEX($substr,$str)"; + } + return ""; + } + + /** + Concatenate strings + @param Arbitrary; see below + @return The SQL expression + + This function takes an arbitrary number of arguments + and concatenates them. The last argument is the + standard $which_connection but in this case it is + not optional. You may pass the empty string to use + the default database though. + + This method currently only supports MySQL and MSSQL + */ + function concat(){ + $args = func_get_args(); + $ret = ""; + $which_connection = $args[count($args)-1]; + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + $ret .= "CONCAT("; + for($i=0;$i<count($args)-1;$i++) + $ret .= $args[$i].","; + $ret = rtrim($ret,",").")"; + break; + case 'mssql': + for($i=0;$i<count($args)-1;$i++) + $ret .= $args[$i]."+"; + $ret = rtrim($ret,"+"); + break; + } + return $ret; + } + + /** + Get the differnces between two dates in weeks + @param $date1 First date + @param $date2 Second date + @param $which_connection see method close() + @return The SQL expression + + This method currently only supports MySQL and MSSQL + */ + function weekdiff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "week($date1) - week($date2)"; + case 'mssql': + return "datediff(wk,$date2,$date1)"; + } + } + + /** + Get a column name by index + @param $result_object A result set + @param $index Integer index + @param $which_connection see method close() + @return The column name + */ + function fetch_field($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + return $result_object->FetchField($index); + } + + /** + Copy a table from one database to another, not necessarily on + the same server or format. + + @param $source_db The database name of the source + @param $select_query The query that will get the data + @param $dest_db The database name of the destination + @param $insert_query The beginning of the query that will add the + data to the destination (specify everything before VALUES) + @return False if any record cannot be transfered, True otherwise + */ + function transfer($source_db,$select_query,$dest_db,$insert_query){ + $result = $this->query($select_query,$source_db); + if (!$result) return False; + + $num_fields = $this->num_fields($result,$source_db); + + $unquoted = array("money"=>1,"real"=>1,"numeric"=>1, + "float4"=>1,"float8"=>1,"bit"=>1); + $strings = array("varchar"=>1,"nvarchar"=>1,"string"=>1, + "char"=>1); + $dates = array("datetime"=>1); + $queries = array(); + + while($row = $this->fetch_array($result,$source_db)){ + $full_query = $insert_query." VALUES ("; + for ($i=0; $i<$num_fields; $i++){ + $type = $this->field_type($result,$i,$source_db); + if ($row[$i] == "" && strstr(strtoupper($type),"INT")) + $row[$i] = 0; + elseif ($row[$i] == "" && isset($unquoted[$type])) + $row[$i] = 0; + if (isset($dates[$type])) + $row[$i] = $this->cleanDateTime($row[$i]); + elseif (isset($strings[$type])) + $row[$i] = str_replace("'","''",$row[$i]); + if (isset($unquoted[$type])) + $full_query .= $row[$i].","; + else + $full_query .= "'".$row[$i]."',"; + } + $full_query = substr($full_query,0,strlen($full_query)-1).")"; + array_push($queries,$full_query); + } + + $ret = True; + foreach ($queries as $q){ + if(!$this->query($q,$dest_db)) $ret = False; + } + + return $ret; + } + + /** + Get column type + @param $result_object A result set + @param $index Integer index + @param $which_connection see method close() + @return The column type + */ + function field_type($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + $fld = $result_object->FetchField($index); + return $fld->type; + } + + /** + Alias of method fetch_field() + */ + function field_name($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + $fld = $result_object->FetchField($index); + return $fld->name; + } + + /** + Get day of week number + @param $field A date expression + @param $which_connection see method close() + @return The SQL expression + + This method currently only suport MySQL and MSSQL + */ + function dayofweek($field,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + // ado is inconsistent + //$conn = $this->connections[$which_connection]; + //return $conn->SQLDate("w",$field); + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "DATE_FORMAT($field,'%w')+1"; + case 'mssql': + return "DATEPART(dw,$field)"; + } + return false; + } + + /** + Get the hour from a datetime + @param $field A datetime expression + @param $which_connection see method close() + @return The SQL expression + */ + function hour($field,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + $conn = $this->connections[$which_connection]; + return $conn->SQLDate("H",$field); + } + + + /** + Reformat a datetime to YYYY-MM-DD HH:MM:SS + @param $str A datetime string + @return The reformatted string + + This is a utility method to support transfer() + */ + function cleanDateTime($str){ + $stdFmt = "/(\d\d\d\d)-(\d\d)-(\d\d) (\d+?):(\d\d):(\d\d)/"; + if (preg_match($stdFmt,$str,$group)) + return $str; + + $msqlFmt = "/(\w\w\w) (\d\d) (\d\d\d\d) (\d+?):(\d\d)(\w)M/"; + + $months = array( + "jan"=>"01", + "feb"=>"02", + "mar"=>"03", + "apr"=>"04", + "may"=>"05", + "jun"=>"06", + "jul"=>"07", + "aug"=>"08", + "sep"=>"09", + "oct"=>"10", + "nov"=>"11", + "dec"=>"12" + ); + + $info = array( + "month" => 1, + "day" => 1, + "year" => 1900, + "hour" => 0, + "min" => 0 + ); + + if (preg_match($msqlFmt,$str,$group)){ + $info["month"] = $months[strtolower($group[1])]; + $info["day"] = $group[2]; + $info["year"] = $group[3]; + $info["hour"] = $group[4]; + $info["min"] = $group[5]; + if ($group[6] == "P") + $info["hour"] = ($info["hour"] + 12) % 24; + } + + $ret = $info["year"]."-"; + $ret .= str_pad($info["month"],2,"0",STR_PAD_LEFT)."-"; + $ret .= str_pad($info["day"],2,"0",STR_PAD_LEFT)." "; + $ret .= str_pad($info["hour"],2,"0",STR_PAD_LEFT).":"; + $ret .= str_pad($info["min"],2,"0",STR_PAD_LEFT); + return $ret; + } + + /** + Check whether the given table exists + @param $table_name The table's name + @param which_connection see method close + @return + - True The table exists + - False The table doesn't exist + - -1 Operation not supported for this database type + */ + function table_exists($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $conn = $this->connections[$which_connection]; + $cols = $conn->MetaColumns($table_name); + if ($cols === False) return False; + return True; + } + + /** + Get the table's definition + @param $table_name The table's name + @param which_connection see method close + @return + - Array of (column name, column type) table found + - False No such table + - -1 Operation not supported for this database type + */ + function table_definition($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $conn = $this->connections[$which_connection]; + $cols = $conn->MetaColumns($table_name); + + $return = array(); + if (is_array($cols)){ + foreach($cols as $c) + $return[$c->name] = $c->type; + return $return; + } + return False; + } + + /** + Get list of tables/views + @param which_connection see method close + */ + function get_tables($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $conn = $this->connections[$which_connection]; + return $conn->MetaTables(); + } + + /** + Get database's currency type + @param which_connection see method close + @return The SQL type + */ + function currency($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return 'decimal(10,2)'; + case 'mssql': + return 'money'; + } + return 'decimal(10,2)'; + } + + /** + Add row limit to a select query + @param $query The select query + @param $int_limit Max rows + @param which_connection see method close + + This method currently only suport MySQL and MSSQL + */ + function add_select_limit($query,$int_limit,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return sprintf("%s LIMIT %d",$query,$int_limit); + case 'mssql': + return str_ireplace("SELECT ","SELECT TOP $int_limit ",$query); + } + } + + /** + Get database scope separator + @param which_connection see method close + @return String separator + */ + function sep($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->connections[$which_connection]->databaseType){ + case 'mysql': + case 'mysqli': + case 'pdo': + return "."; + case 'mssql': + return ".dbo."; + } + return "."; + } + + /** + Get name of database driver + @param which_connection see method close + @return String name + */ + function dbms_name($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + return $this->connections[$which_connection]->databaseType; + } + + /** + Get last error message + @param which_connection see method close + @return The message + */ + function error($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + return $con->ErrorMsg(); + } + + /** + Get auto incremented ID from last insert + @param which_connection see method close + @return The new ID value + */ + function insert_id($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + return $con->Insert_ID(); + } + + /** + Check how many rows the last query affected + @param which_connection see method close + @returns Number of rows + */ + function affected_rows($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + return $con->Affected_Rows(); + } + + /** + Insert as much data as possible + @param $table_name Table to insert into + @param $values An array of column name => column value + @param which_connection see method close + @return Same as INSERT via query() method + + This method polls the table to see which columns actually + exist then inserts those values + */ + function smart_insert($table_name,$values,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + + $exists = $this->table_exists($table_name,$which_connection); + + if (!$exists) return False; + if ($exists === -1) return -1; + + $t_def = $this->table_definition($table_name,$which_connection); + + $cols = "("; + $vals = "("; + foreach($values as $k=>$v){ + if (isset($t_def[$k])){ + $vals .= $v.","; + $col_name = $k; + if($this->connections[$which_connection]->databaseType == 'mssql') + $cols .= $col_name.","; + else + $cols .= "`".$col_name."`,"; + } + else { + echo "No column - $k"; + // implication: column isn't in the table + } + } + $cols = substr($cols,0,strlen($cols)-1).")"; + $vals = substr($vals,0,strlen($vals)-1).")"; + $insertQ = "INSERT INTO $table_name $cols VALUES $vals"; + + //echo $insertQ; + $ret = $this->query($insertQ,$which_connection); + + return $ret; + } + + /** + Update as much data as possible + @param $table_name The table to update + @param $values An array of column name => column value + @param $where_clause The query WHERE clause + @param which_connection see method close + @return Same as an UPDATE via query() method + + This method checks which columns actually exist then + updates those values + + Caveat: There are a couple places this could break down + - If your WHERE clause requires a column that doesn't exist, + the query will fail. No way around it. Auto-modifying + WHERE clauses seems like a terrible idea + - This only works with a single table. Updates involving joins + are rare in the code base though. + */ + function smart_update($table_name,$values,$where_clause,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + + $exists = $this->table_exists($table_name,$which_connection); + + if (!$exists) return False; + if ($exists === -1) return -1; + + $t_def = $this->table_definition($table_name,$which_connection); + + $sets = ""; + foreach($values as $k=>$v){ + if (isset($t_def[$k])){ + $col_name = $k; + if($this->connections[$which_connection]->databaseType == 'mssql') + $sets .= $col_name; + else + $sets .= "`".$col_name."`"; + $sets .= "=".$v.","; + } + else { + echo "No column - $k"; + // implication: column isn't in the table + } + } + $sets = rtrim($sets,","); + $upQ = "UPDATE $table_name SET $sets WHERE $where_clause"; + + $ret = $this->query($upQ,$which_connection); + + return $ret; + } + + /** + Create a prepared statement + @param $sql SQL expression + @param which_connection see method close + @return + - If ADOdb supports prepared statements, an + array of (input string $sql, statement object) + - If ADOdb does not supported prepared statements, + then just the input string $sql + + The return value of this function should be handed + to SQLManager::exec_statement for execution + */ + function prepare_statement($sql,$which_connection=""){ + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + return $con->Prepare($sql); + } + + /** + Execute a prepared statement with the given + set of parameters + @param $sql a value from SQLManager::prepare_statement + @param $input_array an array of values + @param which_connection see method close + @return same as SQLManager::query + + This is essentially a helper function to flip the + parameter order on SQLManager::query so existing code + works as expected + */ + function exec_statement($sql, $input_array=array(), $which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + if (!is_array($input_array)) $input_array = array($input_array); + return $this->query($sql,$which_connection,$input_array); + } + + /** + See if a datetime is on a given date using BETWEEN + @param $col datetime expression + @param $dateStr String date + @return SQL BETWEEN comparision + + Which MySQL partitioning by date this is MUCH + faster than using datediff($col,$dateStr)==0 + */ + function date_equals($col,$dateStr){ + $dateStr = trim($dateStr,"'"); + $seconds = strtotime($dateStr); + if ($seconds === False) $seconds = time(); + $base = date("Y-m-d",$seconds); + + return sprintf("(%s BETWEEN '%s 00:00:00' AND '%s 23:59:59')", + $col,$base,$base); + } + + /* compat layer; mimic functions of Brad's mysql class */ + function get_result($host,$user,$pass,$data_base,$query){ + return $this->query($query); + } + + function aff_rows($result){ + return $this->affected_rows($result); + } + + /** + Log a string to the query log. + @param $str The string + @return A True on success, False on failure + */ + function logger($str){ + $ql = $this->QUERY_LOG; + if (is_writable($ql)){ + $fp = fopen($ql,'a'); + fputs($fp,$_SERVER['PHP_SELF'].": ".date('r').': '.$str."\n"); + fclose($fp); + return True; + } + else { + return False; + } + } + + // skipping fetch_cell on purpose; generic-db way would be slow as heck + + /* end compat Brad's class */ +} + +?> diff --git a/fannie/src/SQLManager.php.bak b/fannie/src/SQLManager.php.bak new file mode 100644 index 000000000..77aab4f2b --- /dev/null +++ b/fannie/src/SQLManager.php.bak @@ -0,0 +1,534 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************** +CLASS INTERFACE + +Properties: +TYPE_MYSQL - type for MySQL (static) +TYPE_MSSQL - type for Microsoft SQL Server (static) + +Methods: +SQLManager(server, type, database, username, password[default: ''], persistent[default: False]) + Constructor. Creates the object and adds an initial connection to use as the + default. Future references to this connection can be made using the $database string. + Type should be one of the static database types, e.g. TYPE_MYSQL + +add_connection(server, type, database, username, password[d: ''], persistent[d: False]) + Same as above, but this is not the default connection. + +select_db(database_name, connection_identifier) + Selects the given database, using the default connection if no identifier is provided. + +query(query_string, connection_identifier) + Issues the query and returns the result, using the default connection is no identifier + is provided. + +fetch_array(result_object, connection_identifer) + Returns the row array, using the default connection if no identifier is provided. + +**************************************************/ +$TYPE_MYSQL = 'MYSQL'; +$TYPE_MSSQL = 'MSSQL'; +$TYPE_PGSQL = 'PGSQL'; +$QUERY_LOG = "/tmp/queries.log"; + +class SQLManager { + + var $connections; + var $db_types; + var $default_db; + + var $TYPE_MYSQL = 'MYSQL'; + var $TYPE_MSSQL = 'MSSQL'; + var $TYPE_PGSQL = 'PGSQL'; + + function SQLManager($server,$type,$database,$username,$password='',$persistent=False){ + $type = strtoupper($type); + $this->connections=array(); + $this->db_types=array(); + $this->default_db = $database; + $this->add_connection($server,$type,$database,$username,$password,$persistent,$database); + } + + function add_connection($server,$type,$database,$username,$password='',$persistent=False){ + if (isset($this->connections[$database])){ + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,False); + } + else { + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,True); + + } + if (!$this->connections[$database]) return False; + $this->db_types[$database] = $type; + $gotdb = $this->select_db($database,$database); + if (!$gotdb){ + if ($this->query("CREATE DATABASE $database")){ + $this->select_db($database,$database); + } + else { + unset($this->db_types[$database]); + $this->connections[$database] = False; + } + } + return True; + } + + function connect($server,$type,$username,$password,$persistent=False,$newlink=False){ + switch($type){ + case $this->TYPE_MYSQL: + if(!function_exists('mysql_connect')) return False; + if ($persistent) + return mysql_pconnect($server,$username,$password,$newlink); + else + return mysql_connect($server,$username,$password,$newlink); + case $this->TYPE_MSSQL: + if(!function_exists('mssql_connect')) return False; + if ($persistent) + return mssql_pconnect($server,$username,$password,$newlink); + else + return mssql_connect($server,$username,$password,$newlink); + case $this->TYPE_PGSQL: + $conStr = "host=".$server." user=".$username." password=".$password; + if(!function_exists('pg_connect')) return False; + if ($persistent) + return pg_pconnect($conStr); + else + return pg_connect($conStr); + } + return -1; + } + + function select_db($db_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return True; + } + return -1; + } + + function close($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + $con = $this->connections[$which_connection]; + $type = $this->db_types[$which_connection]; + unset($this->connections[$which_connection]); + unset($this->db_types[$which_connection]); + switch($type){ + case $this->TYPE_MYSQL: + return mysql_close($con); + case $this->TYPE_MSSQL: + return mssql_close($con); + case $this->TYPE_PGSQL: + return pg_close($con); + } + return -1; + } + + function query($query_text,$which_connection=''){ + global $QUERY_LOG; + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $ret = mysql_query($query_text,$this->connections[$which_connection]); + if (!$ret && !empty($QUERY_LOG)){ + $fp = fopen($QUERY_LOG,"a"); + fputs($fp,$query_text."\n"); + fclose($fp); + } + return $ret; + case $this->TYPE_MSSQL: + $ret = mssql_query($query_text,$this->connections[$which_connection]); + if (!$ret && !empty($QUERY_LOG)){ + $fp = fopen($QUERY_LOG,"a"); + fputs($fp,$query_text."\n"); + fclose($fp); + } + return $ret; + case $this->TYPE_PGSQL: + return pg_query($this->connections[$which_connection],$query_text); + } + return -1; + } + + function escape($query_text,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + if (function_exists("mysql_real_escape_string")) + return mysql_real_escape_string($query_text, + $this->connections[$which_connection]); + else + return mysql_escape_string($query_text); + case $this->TYPE_MSSQL: + return str_replace("'","''",$query_text); + case $this->TYPE_PGSQL: + return pg_escape_string($query_text); + } + } + + function num_rows($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_rows($result_object); + case $this->TYPE_MSSQL: + return mssql_num_rows($result_object); + case $this->TYPE_PGSQL: + return pg_num_rows($result_object); + } + return -1; + } + + function num_fields($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_fields($result_object); + case $this->TYPE_MSSQL: + return mssql_num_fields($result_object); + case $this->TYPE_PGSQL: + return pg_num_fields($result_object); + } + return -1; + } + + function fetch_array($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_array($result_object); + case $this->TYPE_MSSQL: + return mssql_fetch_array($result_object); + case $this->TYPE_PGSQL: + return pg_fetch_array($result_object); + } + return False; + } + + /* compatibility */ + function fetch_row($result_object,$which_connection=''){ + return $this->fetch_array($result_object,$which_connection); + } + + function now($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "now()"; + case $this->TYPE_MSSQL: + return "getdate()"; + case $this->TYPE_PGSQL: + return "now()"; + } + } + + function datediff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "datediff($date1,$date2)"; + case $this->TYPE_MSSQL: + return "datediff(dd,$date2,$date1)"; + } + } + + function monthdiff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "period_diff(date_format($date1, '%Y%m'), date_format($date2, '%Y%m'))"; + case $this->TYPE_MSSQL: + return "datediff(mm,$date2,$date1)"; + } + } + + function weekdiff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "week($date1) - week($date2)"; + case $this->TYPE_MSSQL: + return "datediff(wk,$date2,$date1)"; + } + } + + function fetch_object($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_object($result_object); + case $this->TYPE_MSSQL: + return mssql_fetch_object($result_object); + case $this->TYPE_PGSQL: + return pg_fetch_object($result_object); + } + return False; + } + + function fetch_field($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_field($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_fetch_field($result_object,$index); + } + return -1; + } + + /* copy a table from one database to another, not necessarily on + the same server or format + + $source_db is the database name of the source + $select_query is the query that will get the data + $dest_db is the database name of the destination + $insert_query is the beginning of the query that will add the + data to the destination (specify everything up to VALUES) + */ + function transfer($source_db,$select_query,$dest_db,$insert_query){ + $result = $this->query($select_query,$source_db); + if (!$result) return False; + + $num_fields = $this->num_fields($result,$source_db); + + $unquoted = array("money"=>1,"real"=>1,"numeric"=>1, + "float4"=>1,"float8"=>1,"bit"=>1); + $strings = array("varchar"=>1,"nvarchar"=>1,"string"=>1, + "char"=>1); + $dates = array("datetime"=>1); + $queries = array(); + + while($row = $this->fetch_array($result,$source_db)){ + $full_query = $insert_query." VALUES ("; + for ($i=0; $i<$num_fields; $i++){ + $type = $this->field_type($result,$i,$source_db); + if ($row[$i] == "" && strstr(strtoupper($type),"INT")) + $row[$i] = 0; + elseif ($row[$i] == "" && isset($unquoted[$type])) + $row[$i] = 0; + if (isset($dates[$type])) + $row[$i] = $this->cleanDateTime($row[$i]); + elseif (isset($strings[$type])) + $row[$i] = str_replace("'","''",$row[$i]); + if (isset($unquoted[$type])) + $full_query .= $row[$i].","; + else + $full_query .= "'".$row[$i]."',"; + } + $full_query = substr($full_query,0,strlen($full_query)-1).")"; + array_push($queries,$full_query); + } + + $ret = True; + foreach ($queries as $q){ + if(!$this->query($q,$dest_db)) $ret = False; + } + + return $ret; + } + + function field_type($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_field_type($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_field_type($result_object,$index); + case $this->TYPE_PGSQL: + return pg_field_type($result_object,$index); + } + return -1; + } + + function field_name($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_field_name($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_field_name($result_object,$index); + case $this->TYPE_PGSQL: + return pg_field_name($result_object,$index); + } + return -1; + } + + function dayofweek($field,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "dayofweek($field)"; + case $this->TYPE_MSSQL: + return "datepart(dw,$field)"; + case $this->TYPE_PGSQL: + return ''; + } + return -1; + } + + function hour($field,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "hour($field)"; + case $this->TYPE_MSSQL: + return "datepart(hh,$field)"; + case $this->TYPE_PGSQL: + return ''; + } + return -1; + } + + + function cleanDateTime($str){ + $stdFmt = "/(\d\d\d\d)-(\d\d)-(\d\d) (\d+?):(\d\d):(\d\d)/"; + if (preg_match($stdFmt,$str,$group)) + return $str; + + $msqlFmt = "/(\w\w\w) (\d\d) (\d\d\d\d) (\d+?):(\d\d)(\w)M/"; + + $months = array( + "jan"=>"01", + "feb"=>"02", + "mar"=>"03", + "apr"=>"04", + "may"=>"05", + "jun"=>"06", + "jul"=>"07", + "aug"=>"08", + "sep"=>"09", + "oct"=>"10", + "nov"=>"11", + "dec"=>"12" + ); + + $info = array( + "month" => 1, + "day" => 1, + "year" => 1900, + "hour" => 0, + "min" => 0 + ); + + if (preg_match($msqlFmt,$str,$group)){ + $info["month"] = $months[strtolower($group[1])]; + $info["day"] = $group[2]; + $info["year"] = $group[3]; + $info["hour"] = $group[4]; + $info["min"] = $group[5]; + if ($group[6] == "P") + $info["hour"] = ($info["hour"] + 12) % 24; + } + + $ret = $info["year"]."-"; + $ret .= str_pad($info["month"],2,"0",STR_PAD_LEFT)."-"; + $ret .= str_pad($info["day"],2,"0",STR_PAD_LEFT)." "; + $ret .= str_pad($info["hour"],2,"0",STR_PAD_LEFT).":"; + $ret .= str_pad($info["min"],2,"0",STR_PAD_LEFT); + return $ret; + } + + /* check whether the given table exists + Return values: + True => table exists + False => table doesn't exist + -1 => Operation not supported for this database type + */ + function table_exists($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $result = $this->query("SHOW TABLES FROM $which_connection LIKE '$table_name'",$which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + case $this->TYPE_MSSQL: + $result = $this->query("SELECT name FROM sysobjects WHERE name LIKE '$table_name'",$which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + } + return -1; + } + + /* return the table's definition + Return values: + array of (column name, column type) => table found + False => no such table + -1 => Operation not supported for this database type + */ + function table_definition($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $return = array(); + $result = $this->query("SHOW COLUMNS FROM $table_name",$which_connection); + while($row = $this->fetch_row($result)) + array_push($return,array($row[0],$row[1])); + if (count($return) == 0) return False; + else return $return; + case $this->TYPE_MSSQL: + $return = array(); + $result = $this->query("SELECT c.name,t.name,c.length + FROM syscolumns AS c + LEFT JOIN sysobjects AS o + ON c.id=o.id + LEFT JOIN systypes AS t + ON c.xtype=t.xtype + WHERE o.name='$table_name'",$which_connection); + while($row = $this->fetch_row($result)) + array_push($return,array($row[0],$row[1]."(".$row[2].")")); + if (count($return) == 0) return False; + else return $return; + } + return -1; + } +} + +?> diff --git a/fannie/src/ajax/prodByDesc.php b/fannie/src/ajax/prodByDesc.php new file mode 100644 index 000000000..fa348b67d --- /dev/null +++ b/fannie/src/ajax/prodByDesc.php @@ -0,0 +1,35 @@ +<?php + +include('../../config.php'); +include($FANNIE_ROOT.'src/mysql_connect.php'); +include($FANNIE_ROOT.'src/JsonLib.php'); +$ret = array(); + +$search = isset($_REQUEST['term']) ? $_REQUEST['term'] : ''; +if (strlen($search) > 2){ + $sd = isset($_REQUEST['super']) ? (int)$_REQUEST['super'] : 0; + $search = $dbc->escape("%".$search."%"); + $q = "SELECT MIN(p.upc), + CASE WHEN u.description IS NULL THEN p.description ELSE u.description END as goodDesc + FROM products AS p LEFT JOIN productUser AS u ON p.upc=u.upc "; + if ($sd != 0) + $q .= "LEFT JOIN superdepts AS s ON p.department=s.dept_ID "; + $q .= "WHERE (u.description LIKE ? OR + (u.description IS NULL and p.description LIKE ?)) "; + $args = array('%'.$search.'%','%'.$search.'%'); + if ($sd != 0){ + $q .= "AND s.superID=? "; + $args[] = $sd; + } + $q .= "GROUP BY goodDesc + ORDER BY goodDesc"; + $p = $dbc->prepare_statement($q); + $r = $dbc->exec_statement($p,$args); + while($w = $dbc->fetch_row($r)){ + $ret[] = array('label'=>$w[1],'value'=>$w[0]); + } +} + +echo JsonLib::array_to_json($ret); + +?> diff --git a/fannie/src/barcodepdf.php b/fannie/src/barcodepdf.php new file mode 100644 index 000000000..34ec69b96 --- /dev/null +++ b/fannie/src/barcodepdf.php @@ -0,0 +1,117 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class WFC_Standard_PDF extends FPDF +{ + function EAN13($x,$y,$barcode,$h=16,$w=.35) + { + $this->Barcode($x,$y,$barcode,$h,$w,13); + } + + function UPC_A($x,$y,$barcode,$h=16,$w=.35) + { + $this->Barcode($x,$y,$barcode,$h,$w,12); + } + + function GetCheckDigit($barcode) + { + //Compute the check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*(isset($barcode[$i])?$barcode[$i]:0); + for($i=0;$i<=10;$i+=2) + $sum+=(isset($barcode[$i])?$barcode[$i]:0); + $r=$sum%10; + if($r>0) + $r=10-$r; + return $r; + } + + function TestCheckDigit($barcode) + { + //Test validity of check digit + $sum=0; + for($i=1;$i<=11;$i+=2) + $sum+=3*$barcode{$i}; + for($i=0;$i<=10;$i+=2) + $sum+=$barcode{$i}; + return ($sum+$barcode{12})%10==0; + } + + function Barcode($x,$y,$barcode,$h,$w,$len) + { + //Padding + $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT); + if($len==12) + $barcode='0'.$barcode; + //Add or control the check digit + if(strlen($barcode)==12) + $barcode.=$this->GetCheckDigit($barcode); + elseif(!$this->TestCheckDigit($barcode)){ + $this->Error('This is an Incorrect check digit' . $barcode); + //echo $x.$y.$barcode."\n"; + } + //Convert digits to bars + $codes=array( + 'A'=>array( + '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011', + '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'), + 'B'=>array( + '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101', + '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'), + 'C'=>array( + '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100', + '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100') + ); + $parities=array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $code='101'; + $p=$parities[$barcode{0}]; + for($i=1;$i<=6;$i++) + $code.=$codes[$p[$i-1]][$barcode{$i}]; + $code.='01010'; + for($i=7;$i<=12;$i++) + $code.=$codes['C'][$barcode{$i}]; + $code.='101'; + //Draw bars + for($i=0;$i<strlen($code);$i++) + { + if($code{$i}=='1') + $this->Rect($x+$i*$w,$y,$w,$h,'F'); + } + //Print text uder barcode + $this->SetFont('Arial','',9); + $this->Text($x+(15*$w),$y+$h+11/$this->k,substr($barcode,-$len)); + } +} +?> diff --git a/fannie/src/chainedSelectors.php b/fannie/src/chainedSelectors.php new file mode 100644 index 000000000..be585bfc7 --- /dev/null +++ b/fannie/src/chainedSelectors.php @@ -0,0 +1,224 @@ +<?php + + + /* + ** Class: chainedSelectors + ** Description: This class allows you to create two selectors. Selections + ** made in the first selector cause the second selector to be updated. + ** PHP is used to dynamically create the necessary JavaScript. + */ + + //These constants make the code a bit more readable. They should be + //used in in the creation of the input data arrays, too. + define("CS_FORM", 0); + define("CS_FIRST_SELECTOR", 1); + define("CS_SECOND_SELECTOR", 2); + + define("CS_SOURCE_ID", 0); + define("CS_SOURCE_LABEL", 1); + define("CS_TARGET_ID", 2); + define("CS_TARGET_LABEL", 3); + + class chainedSelectors + { + /* + ** Properties + */ + + //Array of names for the form and the two selectors. + //Should take the form of array("myForm", "Selector1", "Selector2") + var $names; + + //Array of data used to fill the two selectors + var $data; + + //Unique set of choices for the first selector, generated on init + var $uniqueChoices; + + //Calculated counts + var $maxTargetChoices; + var $longestTargetChoice; + + + /* + ** Methods + */ + + //constructor + function chainedSelectors($names, $data) + { + /* + **copy parameters into properties + */ + $this->names = $names; + $this->data = $data; + + /* + ** traverse data, create uniqueChoices, get limits + */ + foreach($data as $row) + { + //create list of unique choices for first selector + $this->uniqueChoices[($row[CS_SOURCE_ID])] = $row[CS_SOURCE_LABEL]; + + //find the maximum choices for target selector + //added @ before var to fix maxPerChoice var error - jb + @$maxPerChoice[($row[CS_SOURCE_ID])]++; + + //find longest value for target selector + if(strlen($row[CS_TARGET_LABEL]) > $this->longestTargetChoice) + { + $this->longestTargetChoice=strlen($row[CS_TARGET_LABEL]); + } + } + + $this->maxTargetChoices = max($maxPerChoice); + } + + //prints the JavaScript function to update second selector + function printUpdateFunction($selected_item) + { + /* + ** Create some variables to make the code + ** more readable. + */ + + $selected_index = 0; + + $sourceSelector = "document." . $this->names[CS_FORM] . "." . + $this->names[CS_FIRST_SELECTOR]; + $targetSelector = "document." . $this->names[CS_FORM] . "." . + $this->names[CS_SECOND_SELECTOR]; + + /* + ** Start the function + */ + print("function update" .$this->names[CS_SECOND_SELECTOR] . "()\n"); + + print("{\n"); + + /* + ** Add code to clear out next selector + */ + print("\t//clear " . $this->names[CS_SECOND_SELECTOR] . "\n"); + print("\tfor(index=0; index < $this->maxTargetChoices; index++)\n"); + print("\t{\n"); + print("\t\t" . $targetSelector . ".options[index].text = '';\n"); + print("\t\t" . $targetSelector . ".options[index].value = '';\n"); + print("\t}\n\n"); + print("\t" . $targetSelector . ".options[" . $selected_index . "].selected = true;\n\n"); + + /* + ** Add code to find which was selected + */ + print("whichSelected = " . $sourceSelector . ".selectedIndex;\n"); + + /* + ** Add giant "if" tree that puts values into target selector + ** based on which selection was made in source selector + */ + + //loop over each value of this selector + foreach($this->uniqueChoices as $sourceValue=>$sourceLabel) + { + if($sourceValue == $selected_item[12]) { // [12] = Department number + $selected_index = $selected_item[28]; // [28] = subdept. # + $selected_index = $selected_index - ($sourceValue * 100); // the index of the subdept just happens to be preceded by the dept_no + } else { + $selected_index = 0; + } + + print("\tif(" . $sourceSelector . + ".options[whichSelected].value == " . + "'$sourceValue')\n"); + print("\t{\n"); + + $count=0; + foreach($this->data as $row) + { + if($row[0] == $sourceValue) + { + $optionValue = $row[CS_TARGET_ID]; + $optionLabel = $row[CS_TARGET_LABEL]; + + print("\t\t" . $targetSelector . + ".options[$count].value = '$optionValue';\n"); + print("\t\t" . $targetSelector . + ".options[$count].text = '$optionLabel';\n\n"); + if($count + 1 == $selected_index){ + print("\t\t" . $targetSelector . + ".options[$count].selected = true;\n"); + } + $count++; + } + } + + print("\t}\n\n"); + } + + print("\tif(window.cscallback){\n"); + print("\t\tcscallback();\n"); + print("\t}\n"); + print("\treturn true;\n"); + print("}\n\n"); + + } + + //print the two selectors + function printSelectors($item_selected) + { + /* + **create prefilled first selector + */ + $selected=FALSE; + print("<select name=\"" . $this->names[CS_FIRST_SELECTOR] . "\" " . + "id=\"" .$this->names[CS_FIRST_SELECTOR] . "\" " . + "onChange=\"update".$this->names[CS_SECOND_SELECTOR]."();\">\n"); + foreach($this->uniqueChoices as $key=>$value) + { + print("\t<option value=\"$key\""); + if($key == $item_selected[12]) // [12] = department + { + print(" selected=\"selected\""); + $selected=FALSE; + } + print(">$value</option>\n"); + } + print("</select>\n"); + + /* + **create empty target selector + */ + $dummyData = str_repeat("X", $this->longestTargetChoice); + + print("<select name=\"".$this->names[CS_SECOND_SELECTOR]."\">\n"); + for($i=0; $i < $this->maxTargetChoices; $i++) + { + print("\t<option value=\"\">$dummyData</option>\n"); + } + print("</select>\n"); + + } + + //prints a call to the update function + function initialize() + { + print("update" .$this->names[CS_SECOND_SELECTOR] . "();\n"); + } + } + +// +// PHP INPUT DEBUG SCRIPT -- very useful! +// + +/* +function debug_p($var, $title) +{ + print "<h4>$title</h4><pre>"; + print_r($var); + print "</pre>"; +} + +debug_p($_REQUEST, "all the data coming in"); +*/ +?> diff --git a/fannie/src/cron_msg.php b/fannie/src/cron_msg.php new file mode 100644 index 000000000..0a07ca94e --- /dev/null +++ b/fannie/src/cron_msg.php @@ -0,0 +1,26 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +function cron_msg($str){ + return date('r').': '.$_SERVER['SCRIPT_FILENAME'].': '.$str."\n"; +} +?> diff --git a/fannie/src/css/install.css b/fannie/src/css/install.css new file mode 100644 index 000000000..50434c190 --- /dev/null +++ b/fannie/src/css/install.css @@ -0,0 +1,96 @@ +/* installTab* are for install-page taskbar links */ +body { + line-height: 1.5em; + color:#444444; + bgcolor:#FFFFFF; +} +h1.install { + font-family: Arial; + font-size: 1.8em; + line-height: 2.0em; + color:#330066; +} +h2.install { + font-family: Arial; + font-size: 1.6em; + line-height: 1.8em; + color:#330066; +} +h3.install { + font-family: Arial; + font-size: 1.4em; + line-height: 1.4em; + /*letter-spacing: 0.2em;*/ + letter-spacing: 0.0em; + color:#330066; + } +h4.install { + font-family: Arial; + font-size: 1.2em; + font-weight: bolder; + line-height: 0.8em; + letter-spacing: 0.0em; + margin:1.2em 0.0em 1.0em 0.0em; + color:#330066; +} + +ul.installTabList { + list-style-type:none; + /* IE */ + margin-left:0.0em; + /* FF */ + padding-left:0.0em; +} + +ul.installTabList2 { + list-style-type:none; + /* IE - not tested */ + margin-top:0.0em; + margin-left:1.0em; + /* FF */ + padding-top:0.0em; + padding-left:1.0em; +} + +li.installTab { + float:left; + color:#000000; + border:1px solid #ADADAD; + border-bottom-style:none; + margin: 0.2em 0.2em 0.2em 0.2em; + padding: 0.2em 0.5em 0.0em 0.5em; +} + +/* 2nd level deep */ +li.installTab2 { + float:left; + color:#000000; + border:1px dashed #ADADAD; + border-bottom-style:none; + margin: 0.2em 0.2em 0.2em 0.2em; + padding: 0.2em 0.5em 0.0em 0.5em; +} + +/* A piece of configuration */ +p.ichunk { + font-family: Arial; + color: black; + margin: 0.5em 0.0em 0.5em 0.0em; +} + +/* A piece of configuration + * Used where there is a label and a control usually on the same line. + * The label is bolded inline. +*/ +p.ichunk2 { + font-family: Arial; + color: black; + margin: 0.0em 0em 0.4em 0em; +} + +/* A comment under a heading. + * Used in addition to ichunk2 +*/ +p.ichunk3 { + margin: 0.0em 0em 1.0em 1.0em; +} diff --git a/fannie/src/css/reports.css b/fannie/src/css/reports.css new file mode 100644 index 000000000..8e643c2c8 --- /dev/null +++ b/fannie/src/css/reports.css @@ -0,0 +1,10 @@ +/* Included by some fannie/reports */ +td.number, th.number { + text-align:right; +} +td.footer { + font-weight:bold; +} +table.fancytable { + margin-bottom:2.0em; +} diff --git a/fannie/src/css/toggle-switch.css b/fannie/src/css/toggle-switch.css new file mode 100755 index 000000000..891b0add2 --- /dev/null +++ b/fannie/src/css/toggle-switch.css @@ -0,0 +1,283 @@ +/* ------------------------------------------ +CSS TOGGLE SWITCHES (IonuÈ› Colceriu) +Licensed under Unlicense +https://github.com/ghinda/css-toggle-switch +------------------------------------------ */ + +/* Toggle Switches */ +@media only screen { + + /* Checkbox + */ + .toggle { + position: relative; + left:-43%; + display: block; + width: 58%; + + padding: 0; + margin: 0; + + font-family: sans-serif; + font-weight: bold; +/* font-size: 12px;*/ +/* color: #fff;*/ + +/* text-shadow: 1px 1px 1px #191b1e;*/ + } + + /* Position the label over all the elements, except the toggle-button + * Clicking anywhere on the label will change the switch-state + */ + .toggle label { + position: relative; + z-index: 3; + + display: block; + width: 100%; + padding: 3px 0; + cursor: pointer; + } + + /* Don't hide the input from screen-readers and keyboard access + */ + .toggle input { + position: absolute; + opacity: 0; + z-index: 5; + } + + /* Outline the toggle when the input is focused */ + .toggle input:focus ~ .toggle-button { + outline: 1px dotted #fff; + } + + /* Track */ + .toggle label:after { + content: ''; + position: absolute; + top: 0; + right: 0; + z-index: 0; + display: block; + width: 80px; + height: 18px; + padding: 2px 0; + + background-color: #dd7e6d; + border: 1px solid #b15b4d; + border-radius: 2px; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.17), 0 1px 0px rgba(255, 255, 255, 0.9); + + /* Text labels */ + content: "off \a on"; + white-space: pre; + + color: #8f5247; + font-weight: bold; + text-align: center; + text-shadow: 0 1px 0px rgba(255, 255, 255, 0.4); + + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; + -webkit-column-gap: 0; + -moz-column-gap: 0; + column-gap: 0; + } + + /* We could use label:after to create the toggle button + * But we won't be able to use transitions on it, except in Firefox + */ + .toggle span { + display: block; + position: absolute; + right: -1px; + top: -2px; + z-index: 4; + width: 40px; + height: 26px; + + border: 1px solid #bbbbbb; + + background-color: #f7f7f7; + background-image: -webkit-linear-gradient(top, #f7f7f7, #ececec); + background-image: -moz-linear-gradient(top, #f7f7f7, #ececec); + background-image: -ms-linear-gradient(top, #f7f7f7, #ececec); + background-image: -o-linear-gradient(top, #f7f7f7, #ececec); + background-image: linear-gradient(top, #f7f7f7, #ececec); + + box-shadow: inset 0 1px 2px rgba(255, 255, 255, 1), 0 1px 1px rgba(0, 0, 0, 0.12); + border-radius: 2px; + + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; + } + + .toggle input:checked ~ span { + right: 45px; + } + + .toggle input:checked + label:after { + background-color: #a0c66b; + border-color: #87aa5b; + + color: #60783f; + } + + /* Radio Switch + */ + .switch { + position: relative; + left:-43%; + border: 0; + padding: 0; + width: 58%; + + font-family: sans-serif; + font-weight: bold; +/* font-size: 12px;*/ +/* color: #fff;*/ + +/* text-shadow: 1px 1px 1px #191b1e;*/ + + } + + .switch legend { + float: left; + width: 40%; + padding: 7px 10% 3px 0; + + text-align: right; + } + + .switch input { + position: absolute; + opacity: 0; + } + + .switch legend:after { + content: ''; + + position: absolute; + top: 0; + left: 50%; + z-index: 0; + + width: 50%; + height: 100%; + + padding: 2px; + background-color: #2d3035; + + border-radius: 3px; + + box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.3), 0 1px 0px rgba(255, 255, 255, 0.2); + } + + .switch label { + position: relative; + z-index: 2; + + float: left; + width: 25%; + margin-top: 2px; + + padding: 5px 0 3px 0; + text-align: center; + + color: #64676b; + text-shadow: 0 1px 0 #000; + } + + + .switch input:checked + label { + color: #2d592a; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + } + + .switch input:focus + label { + outline: 1px dotted #fff; + } + + .switch .switch-button { + clear: both; + position: absolute; + top: 0; + left: 50%; + z-index: 1; + + width: 25%; + height: 100%; + + margin: 2px; + + background-color: #70c66b; + + background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: -ms-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), inset 0 1px 1px rgba(255, 255, 255, 0.45); + + border-radius: 3px; + + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; + } + .switch input:last-of-type:checked ~ .switch-button { + left: 75%; + } + + /* Treo Switch */ + .switch.switch-treo label { + width: 16.6%; + } + .switch.switch-treo .switch-button { + width: 16.6%; + } + .switch.switch-treo input:checked:nth-of-type(2) ~ .switch-button { + left: 66.6%; + } + .switch.switch-treo input:checked:last-of-type ~ .switch-button { + left: 83.26%; + } + /* Switch Themes/Colors */ + .switch.blue input:checked + label { + color: #15475d; + } + .switch.blue .switch-button { + background-color: #38a3d4; + } + .switch.yellow .switch-button { + background-color: #ccc165; + } + .switch.yellow input:checked + label { + color: #494525; + } + /* Bugfix for older Webkit, including mobile Webkit. Adapted from: + * http://css-tricks.com/webkit-sibling-bug/ + */ + .switch, .toggle { + -webkit-animation: bugfix infinite 1s; + } + + @-webkit-keyframes bugfix { from { position: relative; } to { position: relative; } } + +} + +/* Default form styles */ +fieldset { + margin: 0 0 2em 0; + border: 0; +} + +fieldset legend { +/* color: #fff;*/ +} diff --git a/fannie/src/csv_parser.php b/fannie/src/csv_parser.php new file mode 100644 index 000000000..62c70ef27 --- /dev/null +++ b/fannie/src/csv_parser.php @@ -0,0 +1,104 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 4Sep12 Eric Lee Add Functions fix_text_for_db, fix_money_for_db +*/ + +// takes a csv formated string and returns its elements as an array +// optional args are quote character and separator character +// you don't want them +function csv_parser($input,$q="\"",$s=","){ + $QUOTE_CHAR = $q; + $SEPARATOR = $s; + + // break string into array so PHP's foreach can handle it + $input = preg_split('//', $input, -1, PREG_SPLIT_NO_EMPTY); + + $ret = array(); + $cur = 0; + $ret[$cur] = ""; + $quoted = false; + foreach ($input as $x){ + if ($x == "\r" || $x == "\n") continue; + if ($x == $QUOTE_CHAR) + $quoted = !$quoted; + else if ($x == $SEPARATOR && !$quoted){ + $cur++; + $ret[$cur] = ""; + } + else + $ret[$cur] .= $x; + } + return $ret; +} + +function sanitize_xls_money($val){ + $val = str_replace('$','',$val); + $val = str_replace(',','',$val); + $val = trim($val); + if ($val=='-') $val = 0; + return $val; +} + +/* Prepare text for writing to the database. + Another approach is VALUES ($dbc->escape($foo), ... ) +*/ +function fix_text_for_db ($str) { + + // Remove apostrophes. It may be better to double, i.e. escape, them. + $str = preg_replace("/\'/","",$str); + // Double, i.e. escape apostrophes + //$str = preg_replace("/\'/","''",$str); + + return $str; + +//fix_text_for_db +} + +/* May be redundant with: csv_parser.sanitize_xls_money($val) +*/ +function fix_money_for_db ($str) { + + $str = trim($str); + $str = preg_replace("/\\\$/","",$str); + $str = str_replace('$','',$str); + $str = str_replace(",","",$str); + if ($str == '-') $str = 0; + + return $str; + +//fix_money_for_db +} + + +// testing +/* +$test = "asdf,1.0,\"asdf\",\"a,s,d,f\",5"; +echo "INPUT<br />"; +echo $test."<br /><br />"; +echo "OUTPUT<br />"; +var_dump(csv_parser($test)); +*/ + +?> diff --git a/fannie/src/datediff.php b/fannie/src/datediff.php new file mode 100644 index 000000000..cc70faf19 --- /dev/null +++ b/fannie/src/datediff.php @@ -0,0 +1,109 @@ +<? +function datediff($interval, $datefrom, $dateto, $using_timestamps = false) { +/* +    $interval can be: +    yyyy - Number of full years +    q - Number of full quarters +    m - Number of full months +    y - Difference between day numbers +      (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".) +    d - Number of full days +    w - Number of full weekdays +    ww - Number of full weeks +    h - Number of full hours +    n - Number of full minutes +    s - Number of full seconds (default) + */ + +if (!$using_timestamps) { +$datefrom = strtotime($datefrom, 0); +$dateto = strtotime($dateto, 0); +} +$difference = $dateto - $datefrom; // Difference in seconds + +switch($interval) { + +case 'yyyy': // Number of full years + +$years_difference = floor($difference / 31536000); +if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) { +$years_difference--; +} +if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) { +$years_difference++; +} +$datediff = $years_difference; +break; + +case "q": // Number of full quarters + +$quarters_difference = floor($difference / 8035200); +while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) { +$months_difference++; +} +$quarters_difference--; +$datediff = $quarters_difference; +break; + +case "m": // Number of full months + +$months_difference = floor($difference / 2678400); +while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) { +$months_difference++; +} +$months_difference--; +$datediff = $months_difference; +break; + +case 'y': // Difference between day numbers + +$datediff = date("z", $dateto) - date("z", $datefrom); +break; + +case "d": // Number of full days + +$datediff = floor($difference / 86400); +break; + +case "w": // Number of full weekdays + +$days_difference = floor($difference / 86400); +$weeks_difference = floor($days_difference / 7); // Complete weeks +$first_day = date("w", $datefrom); +$days_remainder = floor($days_difference % 7); +$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder? +if ($odd_days > 7) { // Sunday +$days_remainder--; +} +if ($odd_days > 6) { // Saturday +$days_remainder--; +} +$datediff = ($weeks_difference * 5) + $days_remainder; +break; + +case "ww": // Number of full weeks + +$datediff = floor($difference / 604800); +break; + +case "h": // Number of full hours + +$datediff = floor($difference / 3600); +break; + +case "n": // Number of full minutes + +$datediff = floor($difference / 60); +break; + +default: // Number of full seconds (default) + +$datediff = $difference; +break; +} + +return $datediff; + +} + +?> diff --git a/fannie/src/defaultmenu.php b/fannie/src/defaultmenu.php new file mode 100644 index 000000000..414232d7f --- /dev/null +++ b/fannie/src/defaultmenu.php @@ -0,0 +1,180 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + This file contains the default menu if the user has not defined one. + + A menu entry is an array. Every menu entry should contain two keys: + 'label' is the text to display + 'url' is where the menu item goes + + Optionally, a menu entry may contain a 'submenu' which is simply an + array of more menu entries. + + If the URL does not start with / or http://, $FANNIE_URL is automatically + prepended. + + Top level menu entries may also contain a 'subheading'. This text goes + below the label in Fannie's left-hand menu. The 'subheading' value will + be ignored in deeper layers of the menu. +*/ + +$FANNIE_MENU = array( +array('label'=>'Item Maintenance','url'=>'item/ItemEditorPage.php','subheading'=>'Manage our product DB', +'submenu'=>array( + array('label'=>'Manage Products >>','url'=>'item/ItemEditorPage.php', + 'submenu'=>array( + array('label'=>'By UPC/SKU or Brand Prefix','url'=>'item/ItemEditorPage.php'), + array('label'=>'Product List and Tool','url'=>'item/ProductListPage.php'), + array('label'=>'Product Flags','url'=>'item/ItemFlags.php') + ) + ), + array('label'=>'Import Products >>','url'=>'item/import/', + 'submenu'=>array( + array('label'=>'Products','url'=>'item/import/ProductImportPage.php'), + array('label'=>'Upload a file','url'=>'item/import/UploadAnyFile.php') + ) + ), + array('label'=>'Manage Departments >>','url'=>'item/departments/', + 'submenu'=>array( + array('label'=>'Super Departments','url'=>'item/departments/SuperDeptEditor.php'), + array('label'=>'Departments','url'=>'item/departments/DepartmentEditor.php'), + array('label'=>'Sub Departments','url'=>'item/departments/SubDeptEditor.php') + ) + ), + array('label'=>'Import Departments >>','url'=>'item/import/', + 'submenu'=>array( + array('label'=>'Departments','url'=>'item/import/DepartmentImportPage.php'), + array('label'=>'Sub Departments','url'=>'item/import/SubdeptImportPage.php'), + array('label'=>'Upload a file','url'=>'item/import/UploadAnyFile.php') + ) + ), + array('label'=>'Manage Likcodes','url'=>'item/likecodes/'), + array('label'=>'Manage Vendors','url'=>'item/vendors/') + ) +), +array('label'=>'Sales Batches','url'=>'batches/','subheading'=>'Create automated sales & price changes', +'submenu'=>array( + array('label'=>'Sales Batches','url'=>'batches/newbatch.oo/'), + array('label'=>'Upload Batch','url'=>'batches/xlsbatch/'), + array('label'=>'Manage Batch Types','url'=>'batches/BatchTypeEditor.php'), + array('label'=>'Co+op Deals Sales','url'=>'batches/CAP/'), + array('label'=>'Vendor Pricing','url'=>'batches/UNFI/') + ) +), +array('label'=>'Reports','url'=>'reports/','subheading'=>'Custom reporting tools', +'submenu'=>array( + array('label'=>'Movement >>','url'=>'reports/', + 'submenu'=>array( + array('label'=>'Department Movement','url'=>'reports/DepartmentMovement/'), + array('label'=>'Manufacturer Movement','url'=>'reports/ManufacturerMovement/'), + array('label'=>'Item Movement','url'=>'reports/ProductMovement/'), + array('label'=>'Correlated Movement','url'=>'reports/Correlated/'), + array('label'=>'Non Movement','url'=>'reports/NonMovement/'), + array('label'=>'Trends','url'=>'reports/Trends/'), + array('label'=>'Monthly Movement','url'=>'reports/MonthOverMonth/'), + array('label'=>'Movement By Price','url'=>'reports/PriceMovement/') + ) + ), + array('label'=>'Sales >>','url'=>'reports/', + 'submenu'=>array( + array('label'=>'General Sales Report','url'=>'reports/GeneralSales/'), + array('label'=>'General Cost Report','url'=>'reports/GeneralCost/'), + array('label'=>'Sales Today','url'=>'reports/SalesToday/'), + array('label'=>'Store Hourly Sales','url'=>'reports/HourlySales/'), + array('label'=>'Department Hourly Sales','url'=>'reports/HourlySales/hourlySalesDept.php') + ) + ), + array('label'=>'Product List and Tool','url'=>'item/ProductListPage.php'), + array('label'=>'Price History Report','url'=>'reports/PriceHistory/'), + array('label'=>'Department Settings','url'=>'reports/DepartmentSettings/'), + array('label'=>'Open Rings','url'=>'reports/OpenRings/'), + array('label'=>'Batch Report','url'=>'reports/BatchReport/'), + array('label'=>'Customer Count','url'=>'reports/CustomerCount/') + ) +), +array('label'=>'Dayend Polling','url'=>'cron/management/','subheading'=>'Scheduled tasks', +'submenu'=>array( + array('label'=>'Scheduled Tasks','url'=>'cron/management/'), + array('label'=>'View Logs','url'=>'logs/'), + ) +), +array('label'=>'Synchronize','url'=>'sync/','subheading'=>'Update cash registers', +'submenu'=>array( + array('label'=>'Products','url'=>'sync/TableSyncPage.php?tablename=products'), + array('label'=>'ProductUser','url'=>'sync/TableSyncPage.php?tablename=productUser'), + array('label'=>'Membership','url'=>'sync/TableSyncPage.php?tablename=custdata'), + array('label'=>'Member Cards','url'=>'sync/TableSyncPage.php?tablename=memberCards'), + array('label'=>'Employees','url'=>'sync/TableSyncPage.php?tablename=employees'), + array('label'=>'Departments','url'=>'sync/TableSyncPage.php?tablename=departments'), + array('label'=>'Sub Departments','url'=>'sync/TableSyncPage.php?tablename=subdepts') + ) +), +array('label'=>'Admin','url'=>'admin/','subheading'=>'Administrative functions, etc.', +'submenu'=>array( + array('label'=>'Cashier Management >>','url'=>'admin/Cashiers/', + 'submenu'=>array( + array('label'=>'Add a new Cashier','url'=>'admin/Cashiers/AddCashierPage.php'), + array('label'=>'View/edit Cashiers','url'=>'admin/Cashiers/ViewCashiersPage.php'), + array('label'=>'Cashier performance report','url'=>'reports/cash_report/') + ) + ), + array('label'=>'Member Management >>','url'=>'mem/', + 'submenu'=>array( + array('label'=>'View/edit Members','url'=>'mem/MemberSearchPage.php'), + array('label'=>'Manage Member Types','url'=>'mem/MemberTypeEditor.php'), + array('label'=>'Create New Members','url'=>'mem/NewMemberTool.php'), + array('label'=>'Print Member Stickers','url'=>'mem/numbers/'), + array('label'=>'Import Member Information >>','url'=>'mem/import/', + 'submenu'=>array( + array('label'=>'Names & Numbers','url'=>'mem/import/MemNameNumImportPage.php'), + array('label'=>'Contact Information','url'=>'mem/import/MemContactImportPage.php'), + array('label'=>'Existing Equity','url'=>'mem/import/EquityHistoryImportPage.php') + ) + ) + ) + ), + array('label'=>'Email Statements >>','url'=>'mem/statements/', + 'submenu'=>array( + array('label'=>'AR (Member)','url'=>'mem/statements/indvAR.php'), + array('label'=>'AR (Business EOM)','url'=>'mem/statements/busAR.php'), + array('label'=>'AR (Business Any Balance)','url'=>'mem/statements/busAR.php'), + array('label'=>'Equity','url'=>'mem/statements/equity.php'), + array('label'=>'Sent E-mail History','url'=>'mem/statements/history.php') + ) + ), + array('label'=>'Tenders','url'=>'admin/Tenders/'), + array('label'=>'Special Orders >>','url'=>'ordering/', + 'submenu'=>array( + array('label'=>'Create Order','url'=>'ordering/view.php'), + array('label'=>'Review Active Orders','url'=>'ordering/clearinghouse.php'), + array('label'=>'Review Old Orders','url'=>'ordering/historical.php'), + array('label'=>'Receiving Report','url'=>'ordering/receivingReport.php'), + array('label'=>'Muzak','url'=>'ordering/muzak.php') + ) + ), + array('label'=>'Print Shelftags','url'=>'admin/labels/'), + array('label'=>'Transaction Lookup','url'=>'admin/LookupReceipt/'), + ) +) +); diff --git a/fannie/src/fetchLib.php b/fannie/src/fetchLib.php new file mode 100644 index 000000000..60c5529dd --- /dev/null +++ b/fannie/src/fetchLib.php @@ -0,0 +1,107 @@ +<?php +require_once($FANNIE_ROOT.'src/Credentials/GoE.wfc.php'); + +function getFailedTrans($dateStr,$hour){ + global $sql; + + $trans_stack = array(); + $query = $sql->prepare_statement("SELECT q.refNum FROM efsnetRequest as q + LEFT JOIN efsnetResponse as r ON q.date=r.date + and q.cashierNo=r.cashierNo and q.laneNo=r.laneNo + and q.transNo=r.transNo and q.transID=r.transID + WHERE ". + $sql->datediff('q.datetime','?')."=0 + AND ".$sql->hour('q.datetime')."=? + AND r.httpCode <> 200 + AND (r.refNum like '%%-%%' OR r.refNum='')"); + $response = $sql->exec_statement($query,array($dateStr,$hour)); + while($row = $sql->fetch_row($response)) + $trans_stack[] = $row['refNum']; + + return $trans_stack; +} + +/* query all transactions for a given date and type + return cached results, if any, otherwise query + processor and cache results +*/ +function doquery($dateStr,$refNum){ + global $GOEMERCH_ID,$GOEMERCH_GATEWAY_ID; + + echo 'issuing query...'."\n"; + $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; + $xml .= "<TRANSACTION>"; + $xml .= "<FIELDS>"; + $xml .= "<FIELD KEY=\"merchant\">$GOEMERCH_ID</FIELD>"; + $xml .= "<FIELD KEY=\"gateway_id\">$GOEMERCH_GATEWAY_ID</FIELD>"; + $xml .= "<FIELD KEY=\"operation_type\">query</FIELD>"; + $xml .= "<FIELD KEY=\"trans_type\">SALE</FIELD>"; + $xml .= "<FIELD KEY=\"begin_date\">$dateStr</FIELD>"; + $xml .= "<FIELD KEY=\"begin_time\">0001AM</FIELD>"; + $xml .= "<FIELD KEY=\"end_date\">$dateStr</FIELD>"; + $xml .= "<FIELD KEY=\"end_time\">1159PM</FIELD>"; + $xml .= "<FIELD KEY=\"order_id\">$refNum</FIELD>"; + $xml .= "</FIELDS>"; + $xml .= "</TRANSACTION>"; + + $result = docurl($xml); + fwrite(STDERR,$result['response']."\n"); + $p = new xmlData($result['response']); + if ($p->get_first("RECORDS_FOUND") != 0) + return $p->get_first("REFERENCE_NUMBER1"); + else + return False; +} + +function dovoid($refs){ + global $GOEMERCH_ID,$GOEMERCH_GATEWAY_ID; + + echo 'performing void...'."\n"; + $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; + $xml .= "<TRANSACTION>"; + $xml .= "<FIELDS>"; + $xml .= "<FIELD KEY=\"merchant\">$GOEMERCH_ID</FIELD>"; + $xml .= "<FIELD KEY=\"gateway_id\">$GOEMERCH_GATEWAY_ID</FIELD>"; + $xml .= "<FIELD KEY=\"operation_type\">void</FIELD>"; + $xml .= "<FIELD KEY=\"total_number_transactions\">".count($refs)."</FIELD>"; + for($i=0;$i<count($refs);$i++){ + $xml .= "<FIELD KEY=\"reference_number".($i+1)."\">".$refs[$i]."</FIELD>"; + } + $xml .= "</FIELDS>"; + $xml .= "</TRANSACTION>"; + + $result = docurl($xml); + fwrite(STDERR,$result['response']."\n"); +} + +function docurl($xml){ + $curl_handle = curl_init("https://secure.goemerchant.com/secure/gateway/xmlgateway.aspx"); + + curl_setopt($curl_handle, CURLOPT_HEADER, 0); + curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,15); + curl_setopt($curl_handle, CURLOPT_FAILONERROR,false); + curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,false); + curl_setopt($curl_handle, CURLOPT_TIMEOUT,30); + curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array("Content-type: text/xml")); + curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $xml); + + set_time_limit(300); + + $response = curl_exec($curl_handle); + + $result = array( + 'curlErr' => curl_errno($curl_handle), + 'curlErrText' => curl_error($curl_handle), + 'curlTime' => curl_getinfo($curl_handle, + CURLINFO_TOTAL_TIME), + 'curlHTTP' => curl_getinfo($curl_handle, + CURLINFO_HTTP_CODE), + 'response' => $response + ); + + return $result; +} + +?> diff --git a/fannie/src/footer.html b/fannie/src/footer.html new file mode 100644 index 000000000..2b73fb11d --- /dev/null +++ b/fannie/src/footer.html @@ -0,0 +1,35 @@ + </div> + <span style="font-size:6px"><br></span> + </div> + </td> +</tr> +<tr> + <td colspan="2" style="border-top:1px #ccc solid;margin-top:10px;padding-top:5px;background:#fff;"> + <div style="float:right;"> + <!--Copyleft &#0169; 2009, <a href="http://www.designslife.com" style="font-size:12px;color:AAAAAA">designslife</a>. All Rights Reserved.--> + </div> + <div style="float:left; margin-right: 50px;"> +<?php +if($FANNIE_AUTH_ENABLED){ + if (!function_exists("checkLogin")) include($FANNIE_ROOT.'auth/login.php'); + $name = checkLogin(); + if (!$name){ + echo "You are not logged in."; + echo "&nbsp;&nbsp;&nbsp;&nbsp;"; + echo "[<a href=\"{$FANNIE_URL}auth/ui/loginform.php?redirect={$_SERVER['PHP_SELF']}\">"; + echo "Login</a>]"; + } + else { + echo "You are logged in as <b>$name</b>."; + echo "&nbsp;&nbsp;&nbsp;&nbsp;"; + echo "[<a href=\"{$FANNIE_URL}auth/ui/loginform.php?logout=yes\">Logout</a>]"; + } +} +?> + </div> + </td> +</tr> +</table> +</div> +</body> +</html> diff --git a/fannie/src/footer_install.html b/fannie/src/footer_install.html new file mode 100644 index 000000000..de42197b4 --- /dev/null +++ b/fannie/src/footer_install.html @@ -0,0 +1,28 @@ +<?php +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * 16Apr2013 Eric Lee Extracted from header.html for a "plain" page + * extending InstallPage which extends FanniePage + * that uses authentication, e.g. fannie/install pages. +*/ +?> + <div style="margin-top:1.0em;"> +<?php +if($FANNIE_AUTH_ENABLED){ + if (!function_exists("checkLogin")) include($FANNIE_ROOT.'auth/login.php'); + $name = checkLogin(); + if (!$name){ + echo "You are not logged in."; + echo "&nbsp;&nbsp;&nbsp;&nbsp;"; + echo "[<a href={$FANNIE_URL}auth/ui/loginform.php?redirect={$_SERVER['PHP_SELF']}>"; + echo "Login</a>]"; + } + else { + echo "You are logged in as <b>$name</b>."; + echo "&nbsp;&nbsp;&nbsp;&nbsp;"; + echo "[<a href={$FANNIE_URL}auth/ui/loginform.php?logout=yes>Logout</a>]"; + } +} +?> +</div> +</body> +</html> diff --git a/fannie/src/fpdf/FAQ.htm b/fannie/src/fpdf/FAQ.htm new file mode 100644 index 000000000..6ab9424be --- /dev/null +++ b/fannie/src/fpdf/FAQ.htm @@ -0,0 +1,291 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<HTML> +<HEAD> +<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> +<TITLE>FAQ</TITLE> +<LINK TYPE="text/css" REL="stylesheet" HREF="fpdf.css"> +</HEAD> +<BODY> +<H2>FAQ</H2> +<UL STYLE="list-style-type:none; margin-left:0; padding-left:0; margin-bottom:2.2em"> +<LI><B>1.</B> <A HREF='#1'>What's exactly the license of FPDF? Are there any usage restrictions?</A> +<LI><B>2.</B> <A HREF='#2'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</A> +<LI><B>3.</B> <A HREF='#3'>I try to generate a PDF and IE displays a blank page. What happens?</A> +<LI><B>4.</B> <A HREF='#4'>I send parameters using the POST method and the values don't appear in the PDF.</A> +<LI><B>5.</B> <A HREF='#5'>When I use a PHP session, IE doesn't display my PDF any more but asks me to download it.</A> +<LI><B>6.</B> <A HREF='#6'>When I'm on SSL, IE can't open the PDF.</A> +<LI><B>7.</B> <A HREF='#7'>When I execute a script I get the message "FPDF error: Don't alter the locale before including class file".</A> +<LI><B>8.</B> <A HREF='#8'>I try to put a PNG and Acrobat says "There was an error processing a page. A drawing error occurred".</A> +<LI><B>9.</B> <A HREF='#9'>I encounter the following error when I try to generate a PDF: Warning: Cannot add header information - headers already sent by (output started at script.php:X)</A> +<LI><B>10.</B> <A HREF='#10'>I try to display a variable in the Header method but nothing prints.</A> +<LI><B>11.</B> <A HREF='#11'>I defined the Header and Footer methods in my PDF class but nothing appears.</A> +<LI><B>12.</B> <A HREF='#12'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</A> +<LI><B>13.</B> <A HREF='#13'>I try to put the euro symbol but it doesn't work.</A> +<LI><B>14.</B> <A HREF='#14'>I draw a frame with very precise dimensions, but when printed I notice some differences.</A> +<LI><B>15.</B> <A HREF='#15'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</A> +<LI><B>16.</B> <A HREF='#16'>What's the limit of the file sizes I can generate with FPDF?</A> +<LI><B>17.</B> <A HREF='#17'>Can I modify a PDF with FPDF?</A> +<LI><B>18.</B> <A HREF='#18'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</A> +<LI><B>19.</B> <A HREF='#19'>Can I convert an HTML page to PDF with FPDF?</A> +<LI><B>20.</B> <A HREF='#20'>Can I concatenate PDF files with FPDF?</A> +</UL> +<P><A NAME='1'><B>1.</B></A> <SPAN CLASS='st'>What's exactly the license of FPDF? Are there any usage restrictions?</SPAN></P> +FPDF is Freeware (it is stated at the beginning of the source file). There is no usage +restriction. You may embed it freely in your application (commercial or not), with or +without modification. You may redistribute it, too. +<P><A NAME='2'><B>2.</B></A> <SPAN CLASS='st'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</SPAN></P> +These "weird" characters are in fact the actual content of your PDF. This behaviour is a bug of +IE. When it first receives an HTML page, then a PDF from the same URL, it displays it directly +without launching Acrobat. This happens frequently during the development stage: on the least +script error, an HTML page is sent, and after correction, the PDF arrives. +<BR> +To solve the problem, simply quit and restart IE. You can also go to another URL and come +back. +<BR> +To avoid this kind of inconvenience during the development, you can generate the PDF directly +to a file and open it through the explorer. +<P><A NAME='3'><B>3.</B></A> <SPAN CLASS='st'>I try to generate a PDF and IE displays a blank page. What happens?</SPAN></P> +First of all, check that you send nothing to the browser after the PDF (not even a space or a +carriage return). You can put an exit statement just after the call to the Output() method to +be sure. +<BR> +If it still doesn't work, it means you're a victim of the "blank page syndrome". IE used in +conjunction with the Acrobat plug-in suffers from numerous bugs, in all versions. You should +test your application with as many IE versions as possible (at least if you're on the Internet). +The problem occurs mostly with the POST method, so it is strongly advised to avoid it (all the +more that it causes other problems, see the next question). The GET works better but may fail +when the URL becomes too long: don't use a query string with more than 45 characters. However, a +tip exists to exceed this limit: end the URL with .pdf, which tricks IE. If you use a form, you +can add a hidden field at the last position: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +&lt;INPUT TYPE=&quot;HIDDEN&quot; NAME=&quot;ext&quot; VALUE=&quot;.pdf&quot;&gt; +</TT> +</TD></TR></TABLE><BR> +The usage of PHP sessions also often causes trouble (avoid using HTTP headers preventing caching). +See question 5 for a workaround. +<BR> +<BR> +To avoid all these problems in a reliable manner, two main techniques exist: +<BR> +<BR> +- Disable the plug-in and use Acrobat as a helper application. To do this, launch Acrobat; in +the File menu, Preferences, General, uncheck the option "Web Browser Integration" (for Acrobat +5: Edit, Preferences, Options, "Display PDF in Browser"). Then, the next time you load a PDF in +IE, it displays the dialog box "Open it" or "Save it to disk". Uncheck the option "Always ask +before opening this type of file" and choose Open. From now on, PDF files will open +automatically in an external Acrobat window. +<BR> +The drawback of the method is that you need to alter the client configuration, which you can do +in an intranet environment but not for the Internet. +<BR> +<BR> +- Use a redirection technique. It consists in generating the PDF in a temporary file on the +server and redirect the client on it (by using JavaScript, not the Location HTTP header which +also causes trouble). For instance, at the end of the script, you can put the following: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +//Determine a temporary file name in the current directory<BR> +$file=basename(tempnam(getcwd(),'tmp'));<BR> +//Save PDF to file<BR> +$pdf-&gt;Output($file);<BR> +//JavaScript redirection<BR> +echo &quot;&lt;HTML&gt;&lt;SCRIPT&gt;document.location='getpdf.php?f=$file';&lt;/SCRIPT&gt;&lt;/HTML&gt;&quot;; +</TT> +</TD></TR></TABLE><BR> +Then create the getpdf.php file with this: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +&lt;?php<BR> +$f=$HTTP_GET_VARS['f'];<BR> +//Check file (don't skip it!)<BR> +if(substr($f,0,3)!='tmp' or strpos($f,'/') or strpos($f,'\\'))<BR> +&nbsp;&nbsp;&nbsp;&nbsp;die('Incorrect file name');<BR> +if(!file_exists($f))<BR> +&nbsp;&nbsp;&nbsp;&nbsp;die('File does not exist');<BR> +//Handle special IE request if needed<BR> +if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype')<BR> +{<BR> +&nbsp;&nbsp;&nbsp;&nbsp;Header('Content-Type: application/pdf');<BR> +&nbsp;&nbsp;&nbsp;&nbsp;exit;<BR> +}<BR> +//Output PDF<BR> +Header('Content-Type: application/pdf');<BR> +Header('Content-Length: '.filesize($f));<BR> +readfile($f);<BR> +//Remove file<BR> +unlink($f);<BR> +exit;<BR> +?&gt; +</TT> +</TD></TR></TABLE><BR> +This method works in most cases but IE6 can still experience trouble. The "ultimate" method +consists in redirecting directly to the temporary file. The file name must therefore end with .pdf: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +//Determine a temporary file name in the current directory<BR> +$file=basename(tempnam(getcwd(),'tmp'));<BR> +rename($file,$file.'.pdf');<BR> +$file.='.pdf';<BR> +//Save PDF to file<BR> +$pdf-&gt;Output($file);<BR> +//JavaScript redirection<BR> +echo &quot;&lt;HTML&gt;&lt;SCRIPT&gt;document.location='$file';&lt;/SCRIPT&gt;&lt;/HTML&gt;&quot;; +</TT> +</TD></TR></TABLE><BR> +This method turns the dynamic PDF into a static one and avoids all troubles. But you have to do +some cleaning in order to delete the temporary files. For instance: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +function CleanFiles($dir)<BR> +{<BR> +&nbsp;&nbsp;&nbsp;&nbsp;//Delete temporary files<BR> +&nbsp;&nbsp;&nbsp;&nbsp;$t=time();<BR> +&nbsp;&nbsp;&nbsp;&nbsp;$h=opendir($dir);<BR> +&nbsp;&nbsp;&nbsp;&nbsp;while($file=readdir($h))<BR> +&nbsp;&nbsp;&nbsp;&nbsp;{<BR> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(substr($file,0,3)=='tmp' and substr($file,-4)=='.pdf')<BR> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$path=$dir.'/'.$file;<BR> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($t-filemtime($path)&gt;3600)<BR> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@unlink($path);<BR> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR> +&nbsp;&nbsp;&nbsp;&nbsp;}<BR> +&nbsp;&nbsp;&nbsp;&nbsp;closedir($h);<BR> +} +</TT> +</TD></TR></TABLE><BR> +This function deletes all files of the form tmp*.pdf older than an hour in the specified +directory. You may call it where you want, for instance in the script which generates the PDF. +<BR> +<BR> +Remark: it is necessary to open the PDF in a new window, as you can't go backwards due to the +redirection. +<P><A NAME='4'><B>4.</B></A> <SPAN CLASS='st'>I send parameters using the POST method and the values don't appear in the PDF.</SPAN></P> +It's a problem affecting some versions of IE (especially the first 5.5). See the previous +question for the ways to work around it. +<P><A NAME='5'><B>5.</B></A> <SPAN CLASS='st'>When I use a PHP session, IE doesn't display my PDF any more but asks me to download it.</SPAN></P> +It's a problem affecting some versions of IE. To work around it, add the following line before +session_start(): +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +session_cache_limiter('private'); +</TT> +</TD></TR></TABLE><BR> +or do a redirection as explained in question 3. +<P><A NAME='6'><B>6.</B></A> <SPAN CLASS='st'>When I'm on SSL, IE can't open the PDF.</SPAN></P> +The problem may be fixed by adding this line:<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +Header('Pragma: public'); +</TT> +</TD></TR></TABLE><BR> + +<P><A NAME='7'><B>7.</B></A> <SPAN CLASS='st'>When I execute a script I get the message "FPDF error: Don't alter the locale before including class file".</SPAN></P> +When the decimal separator is configured as a comma before including a file, there is a +<A HREF="http://bugs.php.net/bug.php?id=17105" TARGET="_blank">bug</A> in some PHP versions and decimal +numbers get truncated. Therefore you shouldn't make a call to setlocale() before including the class. +On Unix, you shouldn't set the LC_ALL environment variable neither, for it is equivalent to a +setlocale() call. +<P><A NAME='8'><B>8.</B></A> <SPAN CLASS='st'>I try to put a PNG and Acrobat says "There was an error processing a page. A drawing error occurred".</SPAN></P> +Acrobat 5 has a bug and is unable to display transparent monochrome images (i.e. with 1 bit per +pixel). Remove transparency or save your image in 16 colors (4 bits per pixel) or more. +<P><A NAME='9'><B>9.</B></A> <SPAN CLASS='st'>I encounter the following error when I try to generate a PDF: Warning: Cannot add header information - headers already sent by (output started at script.php:X)</SPAN></P> +You must send nothing to the browser except the PDF itself: no HTML, no space, no carriage return, +neither before nor after. The script outputs something at line X. +<P><A NAME='10'><B>10.</B></A> <SPAN CLASS='st'>I try to display a variable in the Header method but nothing prints.</SPAN></P> +You have to use the <TT>global</TT> keyword, for instance: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +function Header()<BR> +{<BR> +&nbsp;&nbsp;&nbsp;&nbsp;global $title;<BR> +<BR> +&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;SetFont('Arial','B',15);<BR> +&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Cell(0,10,$title,1,1,'C');<BR> +} +</TT> +</TD></TR></TABLE><BR> + +<P><A NAME='11'><B>11.</B></A> <SPAN CLASS='st'>I defined the Header and Footer methods in my PDF class but nothing appears.</SPAN></P> +You have to create an object from the PDF class, not FPDF:<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +$pdf=new PDF(); +</TT> +</TD></TR></TABLE><BR> + +<P><A NAME='12'><B>12.</B></A> <SPAN CLASS='st'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</SPAN></P> +You have to enclose your string with double quotes, not single ones. +<P><A NAME='13'><B>13.</B></A> <SPAN CLASS='st'>I try to put the euro symbol but it doesn't work.</SPAN></P> +The standard fonts have the euro character at position 128. You can define a constant like this +for convenience: +<BR> +<BR> +<TABLE WIDTH="100%" BGCOLOR="#E0E0E0"><TR><TD> +<TT> +define('EURO',chr(128)); +</TT> +</TD></TR></TABLE><BR> +Note: Acrobat 4 or higher is required to display euro. +<P><A NAME='14'><B>14.</B></A> <SPAN CLASS='st'>I draw a frame with very precise dimensions, but when printed I notice some differences.</SPAN></P> +To respect dimensions, you have to uncheck the option "Fit to page" in the print dialog box. +<P><A NAME='15'><B>15.</B></A> <SPAN CLASS='st'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</SPAN></P> +All printers have physical margins (different depending on the model), it is therefore impossible +to remove them and print on the totality of the paper. +<P><A NAME='16'><B>16.</B></A> <SPAN CLASS='st'>What's the limit of the file sizes I can generate with FPDF?</SPAN></P> +There is no particular limit. There are some constraints however: +<BR> +<BR> +- The maximum memory size allocated to PHP scripts defaults to 8MB. For very big documents, +especially with images, this limit may be reached (the file being built into memory). The +parameter is configured in the php.ini file. +<BR> +<BR> +- The maximum execution time allocated defaults to 30 seconds. This limit can of course be easily +reached. It is configured in php.ini and may be altered dynamically with set_time_limit(). +<BR> +<BR> +- Browsers generally have a 5 minute time-out. If you send the PDF directly to the browser and +reach the limit, it will be lost. It is therefore advised for very big documents to +generate them in a file, and to send some data to the browser from time to time (for instance +page 1, page 2... with flush() to force the output). When the document is finished, you can send +a redirection on it with JavaScript or create a link. +<BR> +Remark: even when the browser goes in time-out, the script may continue to run on the server. +<P><A NAME='17'><B>17.</B></A> <SPAN CLASS='st'>Can I modify a PDF with FPDF?</SPAN></P> +You can import an existing PDF document thanks to the FPDI extension:<BR> +<BR> +<A HREF="http://fpdi.setasign.de" TARGET="_blank">http://fpdi.setasign.de</A> +<P><A NAME='18'><B>18.</B></A> <SPAN CLASS='st'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</SPAN></P> +No. But a GPL C utility does exist, pdftotext, which is able to extract the textual content from +a PDF. It is provided with the Xpdf package:<BR> +<BR> +<A HREF="http://www.foolabs.com/xpdf/" TARGET="_blank">http://www.foolabs.com/xpdf/</A> +<P><A NAME='19'><B>19.</B></A> <SPAN CLASS='st'>Can I convert an HTML page to PDF with FPDF?</SPAN></P> +Not real-world pages. But a GPL C utility does exist, htmldoc, which allows to do it and gives good results:<BR> +<BR> +<A HREF="http://www.htmldoc.org" TARGET="_blank">http://www.htmldoc.org</A> +<P><A NAME='20'><B>20.</B></A> <SPAN CLASS='st'>Can I concatenate PDF files with FPDF?</SPAN></P> +No. But some free tools exist to perform this task:<BR> +<BR> +<A HREF="http://thierry.schmit.free.fr/dev/mbtPdfAsm/enMbtPdfAsm2.html" TARGET="_blank">http://thierry.schmit.free.fr/dev/mbtPdfAsm/enMbtPdfAsm2.html</A><BR> +<A HREF="http://www.accesspdf.com/pdftk/">http://www.accesspdf.com/pdftk/</A> +</BODY> +</HTML> diff --git a/fannie/src/fpdf/font/Scala-Bold.php b/fannie/src/fpdf/font/Scala-Bold.php new file mode 100644 index 000000000..4abe95710 --- /dev/null +++ b/fannie/src/fpdf/font/Scala-Bold.php @@ -0,0 +1,25 @@ +<?php +$type='Type1'; +$name='Scala-Bold'; +$desc=array('Ascent'=>745,'Descent'=>-255,'CapHeight'=>700,'Flags'=>32,'FontBBox'=>'[-62 -256 1199 892]','ItalicAngle'=>0,'StemV'=>117); +$up=-166; +$ut=42; +$cw=array( + chr(0)=>600,chr(1)=>600,chr(2)=>600,chr(3)=>600,chr(4)=>600,chr(5)=>600,chr(6)=>600,chr(7)=>600,chr(8)=>600,chr(9)=>600,chr(10)=>600,chr(11)=>600,chr(12)=>600,chr(13)=>600,chr(14)=>600,chr(15)=>600,chr(16)=>600,chr(17)=>600,chr(18)=>600,chr(19)=>600,chr(20)=>600,chr(21)=>600, + chr(22)=>600,chr(23)=>600,chr(24)=>600,chr(25)=>600,chr(26)=>600,chr(27)=>600,chr(28)=>600,chr(29)=>600,chr(30)=>600,chr(31)=>600,' '=>250,'!'=>264,'"'=>409,'#'=>550,'$'=>543,'%'=>850,'&'=>703,'\''=>250,'('=>309,')'=>309,'*'=>500,'+'=>550, + ','=>250,'-'=>275,'.'=>250,'/'=>409,'0'=>603,'1'=>387,'2'=>528,'3'=>431,'4'=>549,'5'=>432,'6'=>610,'7'=>489,'8'=>550,'9'=>610,':'=>250,';'=>250,'<'=>550,'='=>550,'>'=>550,'?'=>409,'@'=>1000,'A'=>672, + 'B'=>635,'C'=>667,'D'=>740,'E'=>581,'F'=>571,'G'=>745,'H'=>835,'I'=>372,'J'=>364,'K'=>653,'L'=>531,'M'=>901,'N'=>737,'O'=>743,'P'=>600,'Q'=>759,'R'=>654,'S'=>562,'T'=>600,'U'=>780,'V'=>661,'W'=>942, + 'X'=>660,'Y'=>612,'Z'=>668,'['=>250,'\\'=>409,']'=>250,'^'=>522,'_'=>500,'`'=>258,'a'=>457,'b'=>526,'c'=>430,'d'=>532,'e'=>461,'f'=>326,'g'=>507,'h'=>568,'i'=>282,'j'=>275,'k'=>508,'l'=>267,'m'=>883, + 'n'=>581,'o'=>505,'p'=>538,'q'=>521,'r'=>377,'s'=>421,'t'=>299,'u'=>570,'v'=>442,'w'=>706,'x'=>437,'y'=>443,'z'=>469,'{'=>409,'|'=>250,'}'=>409,'~'=>544,chr(127)=>600,chr(128)=>517,chr(129)=>600,chr(130)=>250,chr(131)=>578, + chr(132)=>409,chr(133)=>750,chr(134)=>573,chr(135)=>573,chr(136)=>338,chr(137)=>1234,chr(138)=>562,chr(139)=>333,chr(140)=>952,chr(141)=>600,chr(142)=>668,chr(143)=>600,chr(144)=>600,chr(145)=>250,chr(146)=>250,chr(147)=>409,chr(148)=>409,chr(149)=>352,chr(150)=>500,chr(151)=>1000,chr(152)=>454,chr(153)=>1000, + chr(154)=>421,chr(155)=>333,chr(156)=>778,chr(157)=>600,chr(158)=>469,chr(159)=>612,chr(160)=>250,chr(161)=>264,chr(162)=>443,chr(163)=>576,chr(164)=>400,chr(165)=>615,chr(166)=>200,chr(167)=>396,chr(168)=>406,chr(169)=>1000,chr(170)=>353,chr(171)=>500,chr(172)=>550,chr(173)=>275,chr(174)=>1000,chr(175)=>406, + chr(176)=>333,chr(177)=>550,chr(178)=>370,chr(179)=>302,chr(180)=>333,chr(181)=>570,chr(182)=>644,chr(183)=>474,chr(184)=>356,chr(185)=>271,chr(186)=>353,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>409,chr(192)=>672,chr(193)=>672,chr(194)=>672,chr(195)=>672,chr(196)=>672,chr(197)=>672, + chr(198)=>882,chr(199)=>667,chr(200)=>581,chr(201)=>581,chr(202)=>581,chr(203)=>581,chr(204)=>372,chr(205)=>372,chr(206)=>372,chr(207)=>372,chr(208)=>740,chr(209)=>737,chr(210)=>743,chr(211)=>743,chr(212)=>743,chr(213)=>743,chr(214)=>743,chr(215)=>522,chr(216)=>747,chr(217)=>780,chr(218)=>780,chr(219)=>780, + chr(220)=>780,chr(221)=>612,chr(222)=>600,chr(223)=>605,chr(224)=>457,chr(225)=>457,chr(226)=>457,chr(227)=>457,chr(228)=>457,chr(229)=>457,chr(230)=>702,chr(231)=>430,chr(232)=>461,chr(233)=>461,chr(234)=>461,chr(235)=>461,chr(236)=>282,chr(237)=>282,chr(238)=>282,chr(239)=>282,chr(240)=>486,chr(241)=>581, + chr(242)=>505,chr(243)=>505,chr(244)=>505,chr(245)=>505,chr(246)=>505,chr(247)=>550,chr(248)=>507,chr(249)=>570,chr(250)=>570,chr(251)=>570,chr(252)=>570,chr(253)=>443,chr(254)=>538,chr(255)=>443); +$enc='cp1252'; +$diff=''; +$file='Scala-Bold.z'; +$size1=746; +$size2=36150; +?> diff --git a/fannie/src/fpdf/font/Scala-Bold.z b/fannie/src/fpdf/font/Scala-Bold.z new file mode 100644 index 000000000..3636180d2 Binary files /dev/null and b/fannie/src/fpdf/font/Scala-Bold.z differ diff --git a/fannie/src/fpdf/font/Scala-Italic.php b/fannie/src/fpdf/font/Scala-Italic.php new file mode 100644 index 000000000..fce14bdea --- /dev/null +++ b/fannie/src/fpdf/font/Scala-Italic.php @@ -0,0 +1,25 @@ +<?php +$type='Type1'; +$name='Scala-Italic'; +$desc=array('Ascent'=>745,'Descent'=>-255,'CapHeight'=>700,'Flags'=>32,'FontBBox'=>'[-174 -256 1200 843]','ItalicAngle'=>0,'StemV'=>77); +$up=-166; +$ut=37; +$cw=array( + chr(0)=>600,chr(1)=>600,chr(2)=>600,chr(3)=>600,chr(4)=>600,chr(5)=>600,chr(6)=>600,chr(7)=>600,chr(8)=>600,chr(9)=>600,chr(10)=>600,chr(11)=>600,chr(12)=>600,chr(13)=>600,chr(14)=>600,chr(15)=>600,chr(16)=>600,chr(17)=>600,chr(18)=>600,chr(19)=>600,chr(20)=>600,chr(21)=>600, + chr(22)=>600,chr(23)=>600,chr(24)=>600,chr(25)=>600,chr(26)=>600,chr(27)=>600,chr(28)=>600,chr(29)=>600,chr(30)=>600,chr(31)=>600,' '=>250,'!'=>282,'"'=>409,'#'=>650,'$'=>543,'%'=>850,'&'=>589,'\''=>250,'('=>409,')'=>409,'*'=>500,'+'=>550, + ','=>250,'-'=>275,'.'=>250,'/'=>409,'0'=>528,'1'=>365,'2'=>429,'3'=>403,'4'=>473,'5'=>417,'6'=>551,'7'=>489,'8'=>510,'9'=>551,':'=>250,';'=>250,'<'=>550,'='=>550,'>'=>550,'?'=>479,'@'=>1000,'A'=>671, + 'B'=>635,'C'=>667,'D'=>740,'E'=>581,'F'=>571,'G'=>745,'H'=>835,'I'=>388,'J'=>382,'K'=>653,'L'=>531,'M'=>901,'N'=>737,'O'=>752,'P'=>600,'Q'=>752,'R'=>654,'S'=>562,'T'=>600,'U'=>780,'V'=>661,'W'=>942, + 'X'=>623,'Y'=>612,'Z'=>668,'['=>250,'\\'=>409,']'=>250,'^'=>522,'_'=>500,'`'=>258,'a'=>500,'b'=>466,'c'=>377,'d'=>488,'e'=>380,'f'=>256,'g'=>419,'h'=>520,'i'=>281,'j'=>245,'k'=>461,'l'=>243,'m'=>796, + 'n'=>540,'o'=>446,'p'=>484,'q'=>451,'r'=>353,'s'=>328,'t'=>292,'u'=>545,'v'=>420,'w'=>652,'x'=>514,'y'=>425,'z'=>488,'{'=>409,'|'=>250,'}'=>409,'~'=>522,chr(127)=>600,chr(128)=>492,chr(129)=>600,chr(130)=>250,chr(131)=>576, + chr(132)=>409,chr(133)=>750,chr(134)=>573,chr(135)=>573,chr(136)=>338,chr(137)=>1234,chr(138)=>562,chr(139)=>333,chr(140)=>926,chr(141)=>600,chr(142)=>668,chr(143)=>600,chr(144)=>600,chr(145)=>250,chr(146)=>250,chr(147)=>409,chr(148)=>409,chr(149)=>352,chr(150)=>500,chr(151)=>1000,chr(152)=>454,chr(153)=>1000, + chr(154)=>328,chr(155)=>333,chr(156)=>666,chr(157)=>600,chr(158)=>488,chr(159)=>612,chr(160)=>250,chr(161)=>282,chr(162)=>443,chr(163)=>576,chr(164)=>400,chr(165)=>615,chr(166)=>200,chr(167)=>345,chr(168)=>406,chr(169)=>1000,chr(170)=>350,chr(171)=>500,chr(172)=>550,chr(173)=>275,chr(174)=>1000,chr(175)=>406, + chr(176)=>333,chr(177)=>550,chr(178)=>300,chr(179)=>282,chr(180)=>333,chr(181)=>545,chr(182)=>644,chr(183)=>333,chr(184)=>417,chr(185)=>255,chr(186)=>350,chr(187)=>500,chr(188)=>769,chr(189)=>769,chr(190)=>769,chr(191)=>479,chr(192)=>672,chr(193)=>672,chr(194)=>672,chr(195)=>672,chr(196)=>672,chr(197)=>672, + chr(198)=>871,chr(199)=>667,chr(200)=>581,chr(201)=>581,chr(202)=>581,chr(203)=>581,chr(204)=>372,chr(205)=>372,chr(206)=>372,chr(207)=>372,chr(208)=>740,chr(209)=>737,chr(210)=>752,chr(211)=>752,chr(212)=>752,chr(213)=>752,chr(214)=>752,chr(215)=>522,chr(216)=>749,chr(217)=>780,chr(218)=>780,chr(219)=>780, + chr(220)=>780,chr(221)=>612,chr(222)=>600,chr(223)=>550,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>657,chr(231)=>377,chr(232)=>380,chr(233)=>380,chr(234)=>380,chr(235)=>380,chr(236)=>281,chr(237)=>281,chr(238)=>281,chr(239)=>281,chr(240)=>470,chr(241)=>540, + chr(242)=>446,chr(243)=>446,chr(244)=>446,chr(245)=>446,chr(246)=>446,chr(247)=>550,chr(248)=>443,chr(249)=>545,chr(250)=>545,chr(251)=>545,chr(252)=>545,chr(253)=>425,chr(254)=>484,chr(255)=>425); +$enc='cp1252'; +$diff=''; +$file='Scala-Italic.z'; +$size1=755; +$size2=36738; +?> diff --git a/fannie/src/fpdf/font/Scala-Italic.z b/fannie/src/fpdf/font/Scala-Italic.z new file mode 100644 index 000000000..b4fa4bc5a Binary files /dev/null and b/fannie/src/fpdf/font/Scala-Italic.z differ diff --git a/fannie/src/fpdf/font/Scala.php b/fannie/src/fpdf/font/Scala.php new file mode 100644 index 000000000..a80139e2b --- /dev/null +++ b/fannie/src/fpdf/font/Scala.php @@ -0,0 +1,25 @@ +<?php +$type='Type1'; +$name='Scala-Regular'; +$desc=array('Ascent'=>745,'Descent'=>-255,'CapHeight'=>700,'Flags'=>32,'FontBBox'=>'[-64 -256 1200 870]','ItalicAngle'=>0,'StemV'=>88); +$up=-166; +$ut=37; +$cw=array( + chr(0)=>600,chr(1)=>600,chr(2)=>600,chr(3)=>600,chr(4)=>600,chr(5)=>600,chr(6)=>600,chr(7)=>600,chr(8)=>600,chr(9)=>600,chr(10)=>600,chr(11)=>600,chr(12)=>600,chr(13)=>600,chr(14)=>600,chr(15)=>600,chr(16)=>600,chr(17)=>600,chr(18)=>600,chr(19)=>600,chr(20)=>600,chr(21)=>600, + chr(22)=>600,chr(23)=>600,chr(24)=>600,chr(25)=>600,chr(26)=>600,chr(27)=>600,chr(28)=>600,chr(29)=>600,chr(30)=>600,chr(31)=>600,' '=>250,'!'=>265,'"'=>409,'#'=>550,'$'=>543,'%'=>850,'&'=>703,'\''=>250,'('=>309,')'=>309,'*'=>500,'+'=>550, + ','=>250,'-'=>275,'.'=>250,'/'=>409,'0'=>603,'1'=>387,'2'=>528,'3'=>431,'4'=>549,'5'=>432,'6'=>610,'7'=>489,'8'=>550,'9'=>610,':'=>250,';'=>250,'<'=>550,'='=>550,'>'=>550,'?'=>409,'@'=>1000,'A'=>672, + 'B'=>635,'C'=>667,'D'=>740,'E'=>581,'F'=>571,'G'=>745,'H'=>838,'I'=>372,'J'=>364,'K'=>653,'L'=>531,'M'=>901,'N'=>737,'O'=>743,'P'=>600,'Q'=>759,'R'=>654,'S'=>562,'T'=>600,'U'=>780,'V'=>661,'W'=>942, + 'X'=>660,'Y'=>612,'Z'=>668,'['=>250,'\\'=>409,']'=>250,'^'=>522,'_'=>500,'`'=>258,'a'=>457,'b'=>526,'c'=>430,'d'=>532,'e'=>461,'f'=>323,'g'=>507,'h'=>568,'i'=>282,'j'=>274,'k'=>508,'l'=>267,'m'=>883, + 'n'=>581,'o'=>505,'p'=>538,'q'=>521,'r'=>377,'s'=>421,'t'=>299,'u'=>570,'v'=>442,'w'=>706,'x'=>437,'y'=>443,'z'=>469,'{'=>409,'|'=>250,'}'=>409,'~'=>522,chr(127)=>600,chr(128)=>492,chr(129)=>600,chr(130)=>250,chr(131)=>576, + chr(132)=>409,chr(133)=>750,chr(134)=>573,chr(135)=>573,chr(136)=>338,chr(137)=>1234,chr(138)=>562,chr(139)=>333,chr(140)=>926,chr(141)=>600,chr(142)=>668,chr(143)=>600,chr(144)=>600,chr(145)=>250,chr(146)=>250,chr(147)=>409,chr(148)=>409,chr(149)=>352,chr(150)=>500,chr(151)=>1000,chr(152)=>454,chr(153)=>1000, + chr(154)=>421,chr(155)=>333,chr(156)=>856,chr(157)=>600,chr(158)=>469,chr(159)=>612,chr(160)=>250,chr(161)=>265,chr(162)=>443,chr(163)=>576,chr(164)=>400,chr(165)=>615,chr(166)=>200,chr(167)=>396,chr(168)=>406,chr(169)=>1000,chr(170)=>353,chr(171)=>500,chr(172)=>550,chr(173)=>275,chr(174)=>1000,chr(175)=>406, + chr(176)=>333,chr(177)=>550,chr(178)=>370,chr(179)=>302,chr(180)=>333,chr(181)=>570,chr(182)=>644,chr(183)=>474,chr(184)=>417,chr(185)=>271,chr(186)=>353,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>409,chr(192)=>672,chr(193)=>672,chr(194)=>672,chr(195)=>672,chr(196)=>672,chr(197)=>672, + chr(198)=>867,chr(199)=>667,chr(200)=>581,chr(201)=>581,chr(202)=>581,chr(203)=>581,chr(204)=>372,chr(205)=>372,chr(206)=>372,chr(207)=>372,chr(208)=>740,chr(209)=>737,chr(210)=>743,chr(211)=>743,chr(212)=>743,chr(213)=>743,chr(214)=>743,chr(215)=>522,chr(216)=>749,chr(217)=>780,chr(218)=>780,chr(219)=>780, + chr(220)=>780,chr(221)=>612,chr(222)=>600,chr(223)=>605,chr(224)=>457,chr(225)=>457,chr(226)=>457,chr(227)=>457,chr(228)=>457,chr(229)=>457,chr(230)=>702,chr(231)=>430,chr(232)=>461,chr(233)=>461,chr(234)=>461,chr(235)=>461,chr(236)=>282,chr(237)=>282,chr(238)=>282,chr(239)=>282,chr(240)=>470,chr(241)=>581, + chr(242)=>505,chr(243)=>505,chr(244)=>505,chr(245)=>505,chr(246)=>505,chr(247)=>550,chr(248)=>486,chr(249)=>570,chr(250)=>570,chr(251)=>570,chr(252)=>570,chr(253)=>443,chr(254)=>538,chr(255)=>443); +$enc='cp1252'; +$diff=''; +$file='Scala.z'; +$size1=758; +$size2=36463; +?> diff --git a/fannie/src/fpdf/font/Scala.z b/fannie/src/fpdf/font/Scala.z new file mode 100644 index 000000000..ea2fa9773 Binary files /dev/null and b/fannie/src/fpdf/font/Scala.z differ diff --git a/fannie/src/fpdf/font/ScalaSans-Bold.php b/fannie/src/fpdf/font/ScalaSans-Bold.php new file mode 100644 index 000000000..c293762cb --- /dev/null +++ b/fannie/src/fpdf/font/ScalaSans-Bold.php @@ -0,0 +1,25 @@ +<?php +$type='Type1'; +$name='ScalaSans-Bold'; +$desc=array('Ascent'=>745,'Descent'=>-255,'CapHeight'=>700,'Flags'=>32,'FontBBox'=>'[-143 -266 1199 863]','ItalicAngle'=>0,'StemV'=>120); +$up=-166; +$ut=42; +$cw=array( + chr(0)=>600,chr(1)=>600,chr(2)=>600,chr(3)=>600,chr(4)=>600,chr(5)=>600,chr(6)=>600,chr(7)=>600,chr(8)=>600,chr(9)=>600,chr(10)=>600,chr(11)=>600,chr(12)=>600,chr(13)=>600,chr(14)=>600,chr(15)=>600,chr(16)=>600,chr(17)=>600,chr(18)=>600,chr(19)=>600,chr(20)=>600,chr(21)=>600, + chr(22)=>600,chr(23)=>600,chr(24)=>600,chr(25)=>600,chr(26)=>600,chr(27)=>600,chr(28)=>600,chr(29)=>600,chr(30)=>600,chr(31)=>600,' '=>250,'!'=>264,'"'=>412,'#'=>550,'$'=>543,'%'=>850,'&'=>701,'\''=>251,'('=>309,')'=>309,'*'=>500,'+'=>550, + ','=>251,'-'=>276,'.'=>251,'/'=>409,'0'=>570,'1'=>390,'2'=>494,'3'=>430,'4'=>526,'5'=>413,'6'=>544,'7'=>465,'8'=>499,'9'=>544,':'=>251,';'=>251,'<'=>550,'='=>550,'>'=>550,'?'=>418,'@'=>1000,'A'=>595, + 'B'=>591,'C'=>605,'D'=>711,'E'=>539,'F'=>522,'G'=>708,'H'=>771,'I'=>300,'J'=>300,'K'=>571,'L'=>495,'M'=>878,'N'=>759,'O'=>763,'P'=>556,'Q'=>763,'R'=>584,'S'=>534,'T'=>539,'U'=>700,'V'=>583,'W'=>864, + 'X'=>572,'Y'=>550,'Z'=>595,'['=>250,'\\'=>409,']'=>250,'^'=>522,'_'=>500,'`'=>383,'a'=>476,'b'=>518,'c'=>444,'d'=>531,'e'=>468,'f'=>288,'g'=>507,'h'=>545,'i'=>247,'j'=>245,'k'=>467,'l'=>239,'m'=>832, + 'n'=>545,'o'=>516,'p'=>538,'q'=>514,'r'=>337,'s'=>447,'t'=>309,'u'=>545,'v'=>464,'w'=>701,'x'=>456,'y'=>433,'z'=>431,'{'=>409,'|'=>250,'}'=>409,'~'=>544,chr(127)=>600,chr(128)=>530,chr(129)=>600,chr(130)=>251,chr(131)=>576, + chr(132)=>437,chr(133)=>750,chr(134)=>573,chr(135)=>573,chr(136)=>384,chr(137)=>1234,chr(138)=>534,chr(139)=>321,chr(140)=>918,chr(141)=>600,chr(142)=>595,chr(143)=>600,chr(144)=>600,chr(145)=>251,chr(146)=>251,chr(147)=>437,chr(148)=>437,chr(149)=>352,chr(150)=>500,chr(151)=>1000,chr(152)=>454,chr(153)=>863, + chr(154)=>447,chr(155)=>321,chr(156)=>835,chr(157)=>600,chr(158)=>431,chr(159)=>550,chr(160)=>250,chr(161)=>264,chr(162)=>444,chr(163)=>576,chr(164)=>400,chr(165)=>550,chr(166)=>250,chr(167)=>519,chr(168)=>416,chr(169)=>1009,chr(170)=>361,chr(171)=>560,chr(172)=>550,chr(173)=>276,chr(174)=>979,chr(175)=>406, + chr(176)=>333,chr(177)=>550,chr(178)=>346,chr(179)=>301,chr(180)=>383,chr(181)=>545,chr(182)=>644,chr(183)=>250,chr(184)=>444,chr(185)=>273,chr(186)=>361,chr(187)=>560,chr(188)=>850,chr(189)=>850,chr(190)=>850,chr(191)=>418,chr(192)=>595,chr(193)=>595,chr(194)=>595,chr(195)=>595,chr(196)=>595,chr(197)=>595, + chr(198)=>794,chr(199)=>605,chr(200)=>539,chr(201)=>539,chr(202)=>539,chr(203)=>539,chr(204)=>300,chr(205)=>300,chr(206)=>300,chr(207)=>300,chr(208)=>711,chr(209)=>759,chr(210)=>763,chr(211)=>763,chr(212)=>763,chr(213)=>763,chr(214)=>763,chr(215)=>550,chr(216)=>763,chr(217)=>700,chr(218)=>700,chr(219)=>700, + chr(220)=>700,chr(221)=>550,chr(222)=>556,chr(223)=>576,chr(224)=>476,chr(225)=>476,chr(226)=>476,chr(227)=>476,chr(228)=>476,chr(229)=>476,chr(230)=>739,chr(231)=>444,chr(232)=>468,chr(233)=>468,chr(234)=>468,chr(235)=>468,chr(236)=>247,chr(237)=>247,chr(238)=>247,chr(239)=>247,chr(240)=>544,chr(241)=>545, + chr(242)=>516,chr(243)=>516,chr(244)=>516,chr(245)=>516,chr(246)=>516,chr(247)=>550,chr(248)=>533,chr(249)=>545,chr(250)=>545,chr(251)=>545,chr(252)=>545,chr(253)=>433,chr(254)=>538,chr(255)=>433); +$enc='cp1252'; +$diff=''; +$file='ScalaSans-Bold.z'; +$size1=763; +$size2=33408; +?> diff --git a/fannie/src/fpdf/font/ScalaSans-Bold.z b/fannie/src/fpdf/font/ScalaSans-Bold.z new file mode 100644 index 000000000..7464cb0dc Binary files /dev/null and b/fannie/src/fpdf/font/ScalaSans-Bold.z differ diff --git a/fannie/src/fpdf/font/ScalaSans-Italic.php b/fannie/src/fpdf/font/ScalaSans-Italic.php new file mode 100644 index 000000000..11e8a4649 --- /dev/null +++ b/fannie/src/fpdf/font/ScalaSans-Italic.php @@ -0,0 +1,25 @@ +<?php +$type='Type1'; +$name='ScalaSans-Italic'; +$desc=array('Ascent'=>745,'Descent'=>-255,'CapHeight'=>700,'Flags'=>32,'FontBBox'=>'[-188 -255 1200 869]','ItalicAngle'=>0,'StemV'=>82); +$up=-166; +$ut=37; +$cw=array( + chr(0)=>600,chr(1)=>600,chr(2)=>600,chr(3)=>600,chr(4)=>600,chr(5)=>600,chr(6)=>600,chr(7)=>600,chr(8)=>600,chr(9)=>600,chr(10)=>600,chr(11)=>600,chr(12)=>600,chr(13)=>600,chr(14)=>600,chr(15)=>600,chr(16)=>600,chr(17)=>600,chr(18)=>600,chr(19)=>600,chr(20)=>600,chr(21)=>600, + chr(22)=>600,chr(23)=>600,chr(24)=>600,chr(25)=>600,chr(26)=>600,chr(27)=>600,chr(28)=>600,chr(29)=>600,chr(30)=>600,chr(31)=>600,' '=>250,'!'=>282,'"'=>412,'#'=>650,'$'=>534,'%'=>850,'&'=>596,'\''=>251,'('=>363,')'=>363,'*'=>500,'+'=>550, + ','=>252,'-'=>276,'.'=>251,'/'=>409,'0'=>528,'1'=>365,'2'=>429,'3'=>410,'4'=>465,'5'=>402,'6'=>550,'7'=>420,'8'=>507,'9'=>535,':'=>251,';'=>251,'<'=>550,'='=>550,'>'=>550,'?'=>479,'@'=>1000,'A'=>595, + 'B'=>591,'C'=>605,'D'=>711,'E'=>539,'F'=>522,'G'=>708,'H'=>771,'I'=>300,'J'=>300,'K'=>571,'L'=>495,'M'=>878,'N'=>759,'O'=>763,'P'=>556,'Q'=>763,'R'=>584,'S'=>534,'T'=>539,'U'=>700,'V'=>583,'W'=>864, + 'X'=>572,'Y'=>550,'Z'=>595,'['=>250,'\\'=>409,']'=>250,'^'=>522,'_'=>500,'`'=>383,'a'=>494,'b'=>496,'c'=>394,'d'=>492,'e'=>424,'f'=>256,'g'=>453,'h'=>514,'i'=>232,'j'=>217,'k'=>440,'l'=>231,'m'=>821, + 'n'=>514,'o'=>478,'p'=>492,'q'=>496,'r'=>311,'s'=>337,'t'=>317,'u'=>514,'v'=>413,'w'=>656,'x'=>383,'y'=>405,'z'=>419,'{'=>409,'|'=>250,'}'=>409,'~'=>544,chr(127)=>600,chr(128)=>497,chr(129)=>600,chr(130)=>252,chr(131)=>576, + chr(132)=>437,chr(133)=>750,chr(134)=>573,chr(135)=>573,chr(136)=>338,chr(137)=>1234,chr(138)=>534,chr(139)=>321,chr(140)=>906,chr(141)=>600,chr(142)=>595,chr(143)=>600,chr(144)=>600,chr(145)=>252,chr(146)=>252,chr(147)=>437,chr(148)=>437,chr(149)=>352,chr(150)=>500,chr(151)=>1000,chr(152)=>454,chr(153)=>863, + chr(154)=>337,chr(155)=>321,chr(156)=>729,chr(157)=>600,chr(158)=>419,chr(159)=>550,chr(160)=>250,chr(161)=>282,chr(162)=>394,chr(163)=>576,chr(164)=>400,chr(165)=>550,chr(166)=>220,chr(167)=>396,chr(168)=>406,chr(169)=>1009,chr(170)=>346,chr(171)=>560,chr(172)=>550,chr(173)=>276,chr(174)=>979,chr(175)=>406, + chr(176)=>333,chr(177)=>550,chr(178)=>300,chr(179)=>287,chr(180)=>383,chr(181)=>514,chr(182)=>644,chr(183)=>251,chr(184)=>444,chr(185)=>255,chr(186)=>346,chr(187)=>560,chr(188)=>652,chr(189)=>652,chr(190)=>791,chr(191)=>479,chr(192)=>595,chr(193)=>595,chr(194)=>595,chr(195)=>595,chr(196)=>595,chr(197)=>595, + chr(198)=>831,chr(199)=>605,chr(200)=>539,chr(201)=>539,chr(202)=>539,chr(203)=>539,chr(204)=>300,chr(205)=>300,chr(206)=>300,chr(207)=>300,chr(208)=>711,chr(209)=>759,chr(210)=>763,chr(211)=>763,chr(212)=>763,chr(213)=>763,chr(214)=>763,chr(215)=>550,chr(216)=>763,chr(217)=>700,chr(218)=>700,chr(219)=>700, + chr(220)=>700,chr(221)=>550,chr(222)=>556,chr(223)=>521,chr(224)=>494,chr(225)=>494,chr(226)=>494,chr(227)=>494,chr(228)=>494,chr(229)=>494,chr(230)=>701,chr(231)=>394,chr(232)=>424,chr(233)=>424,chr(234)=>424,chr(235)=>424,chr(236)=>232,chr(237)=>232,chr(238)=>232,chr(239)=>232,chr(240)=>544,chr(241)=>514, + chr(242)=>478,chr(243)=>478,chr(244)=>478,chr(245)=>478,chr(246)=>478,chr(247)=>550,chr(248)=>488,chr(249)=>514,chr(250)=>514,chr(251)=>514,chr(252)=>514,chr(253)=>405,chr(254)=>492,chr(255)=>405); +$enc='cp1252'; +$diff=''; +$file='ScalaSans-Italic.z'; +$size1=771; +$size2=32145; +?> diff --git a/fannie/src/fpdf/font/ScalaSans-Italic.z b/fannie/src/fpdf/font/ScalaSans-Italic.z new file mode 100644 index 000000000..b843352a0 Binary files /dev/null and b/fannie/src/fpdf/font/ScalaSans-Italic.z differ diff --git a/fannie/src/fpdf/font/ScalaSans.php b/fannie/src/fpdf/font/ScalaSans.php new file mode 100644 index 000000000..3f684c5ce --- /dev/null +++ b/fannie/src/fpdf/font/ScalaSans.php @@ -0,0 +1,25 @@ +<?php +$type='Type1'; +$name='ScalaSans-Regular'; +$desc=array('Ascent'=>745,'Descent'=>-255,'CapHeight'=>700,'Flags'=>32,'FontBBox'=>'[-124 -256 1200 868]','ItalicAngle'=>0,'StemV'=>75); +$up=-166; +$ut=37; +$cw=array( + chr(0)=>600,chr(1)=>600,chr(2)=>600,chr(3)=>600,chr(4)=>600,chr(5)=>600,chr(6)=>600,chr(7)=>600,chr(8)=>600,chr(9)=>600,chr(10)=>600,chr(11)=>600,chr(12)=>600,chr(13)=>600,chr(14)=>600,chr(15)=>600,chr(16)=>600,chr(17)=>600,chr(18)=>600,chr(19)=>600,chr(20)=>600,chr(21)=>600, + chr(22)=>600,chr(23)=>600,chr(24)=>600,chr(25)=>600,chr(26)=>600,chr(27)=>600,chr(28)=>600,chr(29)=>600,chr(30)=>600,chr(31)=>600,' '=>250,'!'=>264,'"'=>412,'#'=>650,'$'=>534,'%'=>850,'&'=>701,'\''=>251,'('=>363,')'=>363,'*'=>500,'+'=>550, + ','=>252,'-'=>276,'.'=>251,'/'=>409,'0'=>570,'1'=>390,'2'=>494,'3'=>430,'4'=>526,'5'=>413,'6'=>544,'7'=>465,'8'=>499,'9'=>544,':'=>251,';'=>251,'<'=>550,'='=>550,'>'=>550,'?'=>418,'@'=>1000,'A'=>595, + 'B'=>591,'C'=>605,'D'=>711,'E'=>539,'F'=>522,'G'=>708,'H'=>771,'I'=>300,'J'=>300,'K'=>571,'L'=>495,'M'=>878,'N'=>759,'O'=>763,'P'=>556,'Q'=>763,'R'=>584,'S'=>534,'T'=>539,'U'=>700,'V'=>583,'W'=>864, + 'X'=>572,'Y'=>550,'Z'=>595,'['=>250,'\\'=>409,']'=>250,'^'=>522,'_'=>500,'`'=>383,'a'=>476,'b'=>527,'c'=>444,'d'=>539,'e'=>469,'f'=>282,'g'=>507,'h'=>536,'i'=>247,'j'=>245,'k'=>454,'l'=>239,'m'=>847, + 'n'=>545,'o'=>533,'p'=>543,'q'=>520,'r'=>337,'s'=>447,'t'=>309,'u'=>541,'v'=>447,'w'=>668,'x'=>402,'y'=>405,'z'=>460,'{'=>409,'|'=>250,'}'=>409,'~'=>544,chr(127)=>600,chr(128)=>497,chr(129)=>600,chr(130)=>252,chr(131)=>576, + chr(132)=>437,chr(133)=>750,chr(134)=>573,chr(135)=>573,chr(136)=>338,chr(137)=>1234,chr(138)=>534,chr(139)=>321,chr(140)=>918,chr(141)=>600,chr(142)=>595,chr(143)=>600,chr(144)=>600,chr(145)=>252,chr(146)=>252,chr(147)=>437,chr(148)=>437,chr(149)=>352,chr(150)=>500,chr(151)=>1000,chr(152)=>454,chr(153)=>863, + chr(154)=>447,chr(155)=>321,chr(156)=>835,chr(157)=>600,chr(158)=>460,chr(159)=>550,chr(160)=>250,chr(161)=>264,chr(162)=>444,chr(163)=>576,chr(164)=>400,chr(165)=>550,chr(166)=>220,chr(167)=>396,chr(168)=>541,chr(169)=>1009,chr(170)=>373,chr(171)=>560,chr(172)=>550,chr(173)=>276,chr(174)=>979,chr(175)=>406, + chr(176)=>333,chr(177)=>550,chr(178)=>346,chr(179)=>301,chr(180)=>383,chr(181)=>541,chr(182)=>644,chr(183)=>251,chr(184)=>444,chr(185)=>273,chr(186)=>373,chr(187)=>560,chr(188)=>757,chr(189)=>757,chr(190)=>757,chr(191)=>418,chr(192)=>595,chr(193)=>595,chr(194)=>595,chr(195)=>595,chr(196)=>595,chr(197)=>595, + chr(198)=>794,chr(199)=>605,chr(200)=>539,chr(201)=>539,chr(202)=>539,chr(203)=>539,chr(204)=>300,chr(205)=>300,chr(206)=>300,chr(207)=>300,chr(208)=>711,chr(209)=>759,chr(210)=>763,chr(211)=>763,chr(212)=>763,chr(213)=>763,chr(214)=>763,chr(215)=>550,chr(216)=>768,chr(217)=>700,chr(218)=>700,chr(219)=>700, + chr(220)=>700,chr(221)=>550,chr(222)=>556,chr(223)=>576,chr(224)=>476,chr(225)=>476,chr(226)=>476,chr(227)=>476,chr(228)=>476,chr(229)=>476,chr(230)=>739,chr(231)=>444,chr(232)=>469,chr(233)=>469,chr(234)=>469,chr(235)=>469,chr(236)=>247,chr(237)=>247,chr(238)=>247,chr(239)=>247,chr(240)=>544,chr(241)=>545, + chr(242)=>533,chr(243)=>533,chr(244)=>533,chr(245)=>533,chr(246)=>533,chr(247)=>550,chr(248)=>533,chr(249)=>541,chr(250)=>541,chr(251)=>541,chr(252)=>541,chr(253)=>405,chr(254)=>543,chr(255)=>405); +$enc='cp1252'; +$diff=''; +$file='ScalaSans.z'; +$size1=775; +$size2=33059; +?> diff --git a/fannie/src/fpdf/font/ScalaSans.z b/fannie/src/fpdf/font/ScalaSans.z new file mode 100644 index 000000000..8162a2c4a Binary files /dev/null and b/fannie/src/fpdf/font/ScalaSans.z differ diff --git a/fannie/src/fpdf/font/helvetica.php b/fannie/src/fpdf/font/helvetica.php new file mode 100644 index 000000000..ca94cdf21 --- /dev/null +++ b/fannie/src/fpdf/font/helvetica.php @@ -0,0 +1,15 @@ +<?php +$fpdf_charwidths['helvetica']=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/fannie/src/fpdf/font/helveticab.php b/fannie/src/fpdf/font/helveticab.php new file mode 100644 index 000000000..276cfa8cb --- /dev/null +++ b/fannie/src/fpdf/font/helveticab.php @@ -0,0 +1,15 @@ +<?php +$fpdf_charwidths['helveticaB']=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/fannie/src/fpdf/fpdf.css b/fannie/src/fpdf/fpdf.css new file mode 100644 index 000000000..045a32e37 --- /dev/null +++ b/fannie/src/fpdf/fpdf.css @@ -0,0 +1,11 @@ +BODY {font-family:times new roman,serif} +H2 {color:#4000A0} +P.demo {text-align:center; margin-top:-10px} +A.demo {text-decoration:none; font-weight:bold; color:#0000CC} +A.demo:link {text-decoration:none; font-weight:bold; color:#0000CC} +A.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF} +A.demo:active {text-decoration:none; font-weight:bold; color:#0000FF} +.st {font-weight:bold; color:#900000} +.kw {color:#000080; font-weight:bold} +.str {color:#CC0000} +.cmt {color:#008000} diff --git a/fannie/src/fpdf/fpdf.php b/fannie/src/fpdf/fpdf.php new file mode 100644 index 000000000..f0a3e45ef --- /dev/null +++ b/fannie/src/fpdf/fpdf.php @@ -0,0 +1,1647 @@ +<?php +/******************************************************************************* +* Software: FPDF * +* Version: 1.53 * +* Date: 2004-12-31 * +* Author: Olivier PLATHEY * +* License: Freeware * +* * +* You may use, modify and redistribute this software as you wish. * +*******************************************************************************/ + +if(!class_exists('FPDF')) +{ +define('FPDF_VERSION','1.53'); + +class FPDF +{ +//Private properties +var $page; //current page number +var $n; //current object number +var $offsets; //array of object offsets +var $buffer; //buffer holding in-memory PDF +var $pages; //array containing pages +var $state; //current document state +var $compress; //compression flag +var $DefOrientation; //default orientation +var $CurOrientation; //current orientation +var $OrientationChanges; //array indicating orientation changes +var $k; //scale factor (number of points in user unit) +var $fwPt,$fhPt; //dimensions of page format in points +var $fw,$fh; //dimensions of page format in user unit +var $wPt,$hPt; //current dimensions of page in points +var $w,$h; //current dimensions of page in user unit +var $lMargin; //left margin +var $tMargin; //top margin +var $rMargin; //right margin +var $bMargin; //page break margin +var $cMargin; //cell margin +var $x,$y; //current position in user unit for cell positioning +var $lasth; //height of last cell printed +var $LineWidth; //line width in user unit +var $CoreFonts; //array of standard font names +var $fonts; //array of used fonts +var $FontFiles; //array of font files +var $diffs; //array of encoding differences +var $images; //array of used images +var $PageLinks; //array of links in pages +var $links; //array of internal links +var $FontFamily; //current font family +var $FontStyle; //current font style +var $underline; //underlining flag +var $CurrentFont; //current font info +var $FontSizePt; //current font size in points +var $FontSize; //current font size in user unit +var $DrawColor; //commands for drawing color +var $FillColor; //commands for filling color +var $TextColor; //commands for text color +var $ColorFlag; //indicates whether fill and text colors are different +var $ws; //word spacing +var $AutoPageBreak; //automatic page breaking +var $PageBreakTrigger; //threshold used to trigger page breaks +var $InFooter; //flag set when processing footer +var $ZoomMode; //zoom display mode +var $LayoutMode; //layout display mode +var $title; //title +var $subject; //subject +var $author; //author +var $keywords; //keywords +var $creator; //creator +var $AliasNbPages; //alias for total number of pages +var $PDFVersion; //PDF version number + +/******************************************************************************* +* * +* Public methods * +* * +*******************************************************************************/ +function FPDF($orientation='P',$unit='mm',$format='A4') +{ + //Some checks + $this->_dochecks(); + //Initialization of properties + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->pages=array(); + $this->OrientationChanges=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->diffs=array(); + $this->images=array(); + $this->links=array(); + $this->InFooter=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=12; + $this->underline=false; + $this->DrawColor='0 G'; + $this->FillColor='0 g'; + $this->TextColor='0 g'; + $this->ColorFlag=false; + $this->ws=0; + //Standard fonts + $this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol','zapfdingbats'=>'ZapfDingbats'); + //Scale factor + if($unit=='pt') + $this->k=1; + elseif($unit=='mm') + $this->k=72/25.4; + elseif($unit=='cm') + $this->k=72/2.54; + elseif($unit=='in') + $this->k=72; + else + $this->Error('Incorrect unit: '.$unit); + //Page format + if(is_string($format)) + { + $format=strtolower($format); + if($format=='a3') + $format=array(841.89,1190.55); + elseif($format=='a4') + $format=array(595.28,841.89); + elseif($format=='a5') + $format=array(420.94,595.28); + elseif($format=='letter') + $format=array(612,792); + elseif($format=='legal') + $format=array(612,1008); + else + $this->Error('Unknown page format: '.$format); + $this->fwPt=$format[0]; + $this->fhPt=$format[1]; + } + else + { + $this->fwPt=$format[0]*$this->k; + $this->fhPt=$format[1]*$this->k; + } + $this->fw=$this->fwPt/$this->k; + $this->fh=$this->fhPt/$this->k; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation='P'; + $this->wPt=$this->fwPt; + $this->hPt=$this->fhPt; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation='L'; + $this->wPt=$this->fhPt; + $this->hPt=$this->fwPt; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$this->DefOrientation; + $this->w=$this->wPt/$this->k; + $this->h=$this->hPt/$this->k; + //Page margins (1 cm) + $margin=28.35/$this->k; + $this->SetMargins($margin,$margin); + //Interior cell margin (1 mm) + $this->cMargin=$margin/10; + //Line width (0.2 mm) + $this->LineWidth=.567/$this->k; + //Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + //Full width display mode + $this->SetDisplayMode('fullwidth'); + //Enable compression + $this->SetCompression(true); + //Set default PDF version number + $this->PDFVersion='1.3'; +} + +function SetMargins($left,$top,$right=-1) +{ + //Set left, top and right margins + $this->lMargin=$left; + $this->tMargin=$top; + if($right==-1) + $right=$left; + $this->rMargin=$right; +} + +function SetLeftMargin($margin) +{ + //Set left margin + $this->lMargin=$margin; + if($this->page>0 && $this->x<$margin) + $this->x=$margin; +} + +function SetTopMargin($margin) +{ + //Set top margin + $this->tMargin=$margin; +} + +function SetRightMargin($margin) +{ + //Set right margin + $this->rMargin=$margin; +} + +function SetAutoPageBreak($auto,$margin=0) +{ + //Set auto page break mode and triggering margin + $this->AutoPageBreak=$auto; + $this->bMargin=$margin; + $this->PageBreakTrigger=$this->h-$margin; +} + +function SetDisplayMode($zoom,$layout='continuous') +{ + //Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode=$layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + //Set page compression + if(function_exists('gzcompress')) + $this->compress=$compress; + else + $this->compress=false; +} + +function SetTitle($title) +{ + //Title of document + $this->title=$title; +} + +function SetSubject($subject) +{ + //Subject of document + $this->subject=$subject; +} + +function SetAuthor($author) +{ + //Author of document + $this->author=$author; +} + +function SetKeywords($keywords) +{ + //Keywords of document + $this->keywords=$keywords; +} + +function SetCreator($creator) +{ + //Creator of document + $this->creator=$creator; +} + +function AliasNbPages($alias='{nb}') +{ + //Define an alias for total number of pages + $this->AliasNbPages=$alias; +} + +function Error($msg) +{ + //Fatal error + die('<B>FPDF error: </B>'.$msg); +} + +function Open() +{ + //Begin document + $this->state=1; +} + +function Close() +{ + //Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + //Close document + $this->_enddoc(); +} + +function AddPage($orientation='') +{ + //Start a new page + if($this->state==0) + $this->Open(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->underline ? 'U' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + if($this->page>0) + { + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + } + //Start new page + $this->_beginpage($orientation); + //Set line cap style to square + $this->_out('2 J'); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.2f w',$lw*$this->k)); + //Set font + if($family) + $this->SetFont($family,$style,$size); + //Set colors + $this->DrawColor=$dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor=$fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + //Page header + $this->Header(); + //Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth=$lw; + $this->_out(sprintf('%.2f w',$lw*$this->k)); + } + //Restore font + if($family) + $this->SetFont($family,$style,$size); + //Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor=$dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor=$fc; + $this->_out($fc); + } + $this->TextColor=$tc; + $this->ColorFlag=$cf; +} + +function Header() +{ + //To be implemented in your own inherited class +} + +function Footer() +{ + //To be implemented in your own inherited class +} + +function PageNo() +{ + //Get current page number + return $this->page; +} + +function SetDrawColor($r,$g=-1,$b=-1) +{ + //Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g==-1) + $this->DrawColor=sprintf('%.3f G',$r/255); + else + $this->DrawColor=sprintf('%.3f %.3f %.3f RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r,$g=-1,$b=-1) +{ + //Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g==-1) + $this->FillColor=sprintf('%.3f g',$r/255); + else + $this->FillColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r,$g=-1,$b=-1) +{ + //Set color for text + if(($r==0 && $g==0 && $b==0) || $g==-1) + $this->TextColor=sprintf('%.3f g',$r/255); + else + $this->TextColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + //Get width of a string in the current font + $s=(string)$s; + $cw=&$this->CurrentFont['cw']; + $w=0; + $l=strlen($s); + for($i=0;$i<$l;$i++) + $w+=$cw[$s{$i}]; + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + //Set line width + $this->LineWidth=$width; + if($this->page>0) + $this->_out(sprintf('%.2f w',$width*$this->k)); +} + +function Line($x1,$y1,$x2,$y2) +{ + //Draw a line + $this->_out(sprintf('%.2f %.2f m %.2f %.2f l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x,$y,$w,$h,$style='') +{ + //Draw a rectangle + if($style=='F') + $op='f'; + elseif($style=='FD' || $style=='DF') + $op='B'; + else + $op='S'; + $this->_out(sprintf('%.2f %.2f %.2f %.2f re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family,$style='',$file='') +{ + //Add a TrueType or Type1 font + $family=strtolower($family); + if($file=='') + $file=str_replace(' ','',$family).strtolower($style).'.php'; + if($family=='arial') + $family='helvetica'; + $style=strtoupper($style); + if($style=='IB') + $style='BI'; + $fontkey=$family.$style; + if(isset($this->fonts[$fontkey])) + $this->Error('Font already added: '.$family.' '.$style); + include($this->_getfontpath().$file); + if(!isset($name)) + $this->Error('Could not include font definition file'); + $i=count($this->fonts)+1; + $this->fonts[$fontkey]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file); + if($diff) + { + //Search existing encodings + $d=0; + $nb=count($this->diffs); + for($i=1;$i<=$nb;$i++) + { + if($this->diffs[$i]==$diff) + { + $d=$i; + break; + } + } + if($d==0) + { + $d=$nb+1; + $this->diffs[$d]=$diff; + } + $this->fonts[$fontkey]['diff']=$d; + } + if($file) + { + if($type=='TrueType') + $this->FontFiles[$file]=array('length1'=>$originalsize); + else + $this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2); + } +} + +function SetFont($family,$style='',$size=0) +{ + //Select a font; size given in points + global $fpdf_charwidths; + + $family=strtolower($family); + if($family=='') + $family=$this->FontFamily; + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + $style=strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline=true; + $style=str_replace('U','',$style); + } + else + $this->underline=false; + if($style=='IB') + $style='BI'; + if($size==0) + $size=$this->FontSizePt; + //Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + //Test if used for the first time + $fontkey=$family.$style; + if(!isset($this->fonts[$fontkey])) + { + //Check if one of the standard fonts + if(isset($this->CoreFonts[$fontkey])) + { + if(!isset($fpdf_charwidths[$fontkey])) + { + //Load metric file + $file=$family; + if($family=='times' || $family=='helvetica') + $file.=strtolower($style); + include($this->_getfontpath().$file.'.php'); + if(!isset($fpdf_charwidths[$fontkey])) + $this->Error('Could not include font metric file'); + } + $i=count($this->fonts)+1; + $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + $this->CurrentFont=&$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + //Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + //Create a new internal link + $n=count($this->links)+1; + $this->links[$n]=array(0,0); + return $n; +} + +function SetLink($link,$y=0,$page=-1) +{ + //Set destination of internal link + if($y==-1) + $y=$this->y; + if($page==-1) + $page=$this->page; + $this->links[$link]=array($page,$y); +} + +function Link($x,$y,$w,$h,$link) +{ + //Put a link on the page + $this->PageLinks[$this->page][]=array($x*$this->k,$this->hPt-$y*$this->k,$w*$this->k,$h*$this->k,$link); +} + +function Text($x,$y,$txt) +{ + //Output a string + $s=sprintf('BT %.2f %.2f Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s.=' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s='q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + //Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='') +{ + //Output a cell + $k=$this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x=$this->x; + $ws=$this->ws; + if($ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation); + $this->x=$x; + if($ws>0) + { + $this->ws=$ws; + $this->_out(sprintf('%.3f Tw',$ws*$k)); + } + } + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $s=''; + if($fill==1 || $border==1) + { + if($fill==1) + $op=($border==1) ? 'B' : 'f'; + else + $op='S'; + $s=sprintf('%.2f %.2f %.2f %.2f re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x=$this->x; + $y=$this->y; + if(strpos($border,'L')!==false) + $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if($align=='R') + $dx=$w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx=($w-$this->GetStringWidth($txt))/2; + else + $dx=$this->cMargin; + if($this->ColorFlag) + $s.='q '.$this->TextColor.' '; + $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); + $s.=sprintf('BT %.2f %.2f Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + if($this->underline) + $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s.=' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth=$h; + if($ln>0) + { + //Go to next line + $this->y+=$h; + if($ln==1) + $this->x=$this->lMargin; + } + else + $this->x+=$w; +} + +function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=0) +{ + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b=0; + if($border) + { + if($border==1) + { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else + { + $b2=''; + if(strpos($border,'L')!==false) + $b2.='L'; + if(strpos($border,'R')!==false) + $b2.='R'; + $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s{$i}; + if($c=="\n") + { + //Explicit line break + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + continue; + } + if($c==' ') + { + $sep=$i; + $ls=$l; + $ns++; + } + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3f Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + } + else + $i++; + } + //Last chunk + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b.='B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x=$this->lMargin; +} + +function Write($h,$txt,$link='') +{ + //Output text in flowing mode + $cw=&$this->CurrentFont['cw']; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + $sep=-1; + $i=0; + $j=0; + $l=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s{$i}; + if($c=="\n") + { + //Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep=$i; + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + //Move to next line + $this->x=$this->lMargin; + $this->y+=$h; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + //Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); +} + +function Image($file,$x,$y,$w=0,$h=0,$type='',$link='') +{ + //Put an image on the page + if(!isset($this->images[$file])) + { + //First use of image, get info + if($type=='') + { + $pos=strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type=substr($file,$pos+1); + } + $type=strtolower($type); + $mqr=get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + if($type=='jpg' || $type=='jpeg') + $info=$this->_parsejpg($file); + elseif($type=='png') + $info=$this->_parsepng($file); + else + { + //Allow for additional formats + $mtd='_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info=$this->$mtd($file); + } + set_magic_quotes_runtime($mqr); + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + else + $info=$this->images[$file]; + //Automatic width and height calculation if needed + if($w==0 && $h==0) + { + //Put image at 72 dpi + $w=$info['w']/$this->k; + $h=$info['h']/$this->k; + } + if($w==0) + $w=$h*$info['w']/$info['h']; + if($h==0) + $h=$w*$info['h']/$info['w']; + $this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function Ln($h='') +{ + //Line feed; default value is last cell height + $this->x=$this->lMargin; + if(is_string($h)) + $this->y+=$this->lasth; + else + $this->y+=$h; +} + +function GetX() +{ + //Get x position + return $this->x; +} + +function SetX($x) +{ + //Set x position + if($x>=0) + $this->x=$x; + else + $this->x=$this->w+$x; +} + +function GetY() +{ + //Get y position + return $this->y; +} + +function SetY($y) +{ + //Set y position and reset x + $this->x=$this->lMargin; + if($y>=0) + $this->y=$y; + else + $this->y=$this->h+$y; +} + +function SetXY($x,$y) +{ + //Set x and y positions + $this->SetY($y); + $this->SetX($x); +} + +function Output($name='',$dest='') +{ + //Output PDF to some destination + //Finish document if necessary + if($this->state<3) + $this->Close(); + //Normalize parameters + if(is_bool($dest)) + $dest=$dest ? 'D' : 'F'; + $dest=strtoupper($dest); + if($dest=='') + { + if($name=='') + { + $name='doc.pdf'; + $dest='I'; + } + else + $dest='F'; + } + switch($dest) + { + case 'I': + //Send to standard output + if(ob_get_contents()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if(php_sapi_name()!='cli') + { + //We send to a browser + header('Content-Type: application/pdf'); + if(headers_sent()) + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-disposition: inline; filename="'.$name.'"'); + } + echo $this->buffer; + break; + case 'D': + //Download file + if(ob_get_contents()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) + header('Content-Type: application/force-download'); + else + header('Content-Type: application/octet-stream'); + if(headers_sent()) + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-disposition: attachment; filename="'.$name.'"'); + echo $this->buffer; + break; + case 'F': + //Save to local file + $f=fopen($name,'wb'); + if(!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + //Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* * +* Protected methods * +* * +*******************************************************************************/ +function _dochecks() +{ + //Check for locale-related bug + if(1.1==1) + $this->Error('Don\'t alter the locale before including class file'); + //Check for decimal separator + if(sprintf('%.1f',1.0)!='1.0') + setlocale(LC_NUMERIC,'C'); +} + +function _getfontpath() +{ + if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) + define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); + return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; +} + +function _putpages() +{ + $nb=$this->page; + if(!empty($this->AliasNbPages)) + { + //Replace number of pages + for($n=1;$n<=$nb;$n++) + $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); + } + if($this->DefOrientation=='P') + { + $wPt=$this->fwPt; + $hPt=$this->fhPt; + } + else + { + $wPt=$this->fhPt; + $hPt=$this->fwPt; + } + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + for($n=1;$n<=$nb;$n++) + { + //Page + $this->_newobj(); + $this->_out('<</Type /Page'); + $this->_out('/Parent 1 0 R'); + if(isset($this->OrientationChanges[$n])) + $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$hPt,$wPt)); + $this->_out('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + //Links + $annots='/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect=sprintf('%.2f %.2f %.2f %.2f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] '; + if(is_string($pl[4])) + $annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>'; + else + { + $l=$this->links[$pl[4]]; + $h=isset($this->OrientationChanges[$l[0]]) ? $wPt : $hPt; + $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>',1+2*$l[0],$h-$l[1]*$this->k); + } + } + $this->_out($annots.']'); + } + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + //Page content + $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<</Type /Pages'); + $kids='/Kids ['; + for($i=0;$i<$nb;$i++) + $kids.=(3+2*$i).' 0 R '; + $this->_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$wPt,$hPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putfonts() +{ + $nf=$this->n; + foreach($this->diffs as $diff) + { + //Encodings + $this->_newobj(); + $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>'); + $this->_out('endobj'); + } + $mqr=get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + foreach($this->FontFiles as $file=>$info) + { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n']=$this->n; + $font=''; + $f=fopen($this->_getfontpath().$file,'rb',1); + if(!$f) + $this->Error('Font file not found'); + while(!feof($f)) + $font.=fread($f,8192); + fclose($f); + $compressed=(substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + { + $header=(ord($font{0})==128); + if($header) + { + //Strip first binary header + $font=substr($font,6); + } + if($header && ord($font{$info['length1']})==128) + { + //Strip second binary header + $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); + } + } + $this->_out('<</Length '.strlen($font)); + if($compressed) + $this->_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + set_magic_quotes_runtime($mqr); + foreach($this->fonts as $k=>$font) + { + //Font objects + $this->fonts[$k]['n']=$this->n+1; + $type=$font['type']; + $name=$font['name']; + if($type=='core') + { + //Standard font + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + if($font['enc']) + { + if(isset($font['diff'])) + $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + //Widths + $this->_newobj(); + $cw=&$font['cw']; + $s='['; + for($i=32;$i<=255;$i++) + $s.=$cw[chr($i)].' '; + $this->_out($s.']'); + $this->_out('endobj'); + //Descriptor + $this->_newobj(); + $s='<</Type /FontDescriptor /FontName /'.$name; + foreach($font['desc'] as $k=>$v) + $s.=' /'.$k.' '.$v; + $file=$font['file']; + if($file) + $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } + else + { + //Allow for additional types + $mtd='_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +function _putimages() +{ + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + while(list($file,$info)=each($this->images)) + { + $this->_newobj(); + $this->images[$file]['n']=$this->n; + $this->_out('<</Type /XObject'); + $this->_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if(isset($info['parms'])) + $this->_out($info['parms']); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns=''; + for($i=0;$i<count($info['trns']);$i++) + $trns.=$info['trns'][$i].' '.$info['trns'][$i].' '; + $this->_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + unset($this->images[$file]['data']); + $this->_out('endobj'); + //Palette + if($info['cs']=='Indexed') + { + $this->_newobj(); + $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } +} + +function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +function _putresourcedict() +{ + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); +} + +function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putinfo() +{ + $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.date('YmdHis'))); +} + +function _putcatalog() +{ + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_out('/PageLayout /TwoColumnLeft'); +} + +function _putheader() +{ + $this->_out('%PDF-'.$this->PDFVersion); +} + +function _puttrailer() +{ + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n-1).' 0 R'); +} + +function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + //Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + //Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + //Cross-ref + $o=strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + //Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state=3; +} + +function _beginpage($orientation) +{ + $this->page++; + $this->pages[$this->page]=''; + $this->state=2; + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + //Page orientation + if(!$orientation) + $orientation=$this->DefOrientation; + else + { + $orientation=strtoupper($orientation{0}); + if($orientation!=$this->DefOrientation) + $this->OrientationChanges[$this->page]=true; + } + if($orientation!=$this->CurOrientation) + { + //Change orientation + if($orientation=='P') + { + $this->wPt=$this->fwPt; + $this->hPt=$this->fhPt; + $this->w=$this->fw; + $this->h=$this->fh; + } + else + { + $this->wPt=$this->fhPt; + $this->hPt=$this->fwPt; + $this->w=$this->fh; + $this->h=$this->fw; + } + $this->PageBreakTrigger=$this->h-$this->bMargin; + $this->CurOrientation=$orientation; + } +} + +function _endpage() +{ + //End of page contents + $this->state=1; +} + +function _newobj() +{ + //Begin a new object + $this->n++; + $this->offsets[$this->n]=strlen($this->buffer); + $this->_out($this->n.' 0 obj'); +} + +function _dounderline($x,$y,$txt) +{ + //Underline text + $up=$this->CurrentFont['up']; + $ut=$this->CurrentFont['ut']; + $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2f %.2f %.2f %.2f re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +function _parsejpg($file) +{ + //Extract info from a JPEG file + $a=GetImageSize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace='DeviceRGB'; + elseif($a['channels']==4) + $colspace='DeviceCMYK'; + else + $colspace='DeviceGray'; + $bpc=isset($a['bits']) ? $a['bits'] : 8; + //Read whole file + $f=fopen($file,'rb'); + $data=''; + while(!feof($f)) + $data.=fread($f,4096); + fclose($f); + return array('w'=>$a[0],'h'=>$a[1],'cs'=>$colspace,'bpc'=>$bpc,'f'=>'DCTDecode','data'=>$data); +} + +function _parsepng($file) +{ + //Extract info from a PNG file + $f=fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + //Check signature + if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + //Read header chunk + fread($f,4); + if(fread($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w=$this->_freadint($f); + $h=$this->_freadint($f); + $bpc=ord(fread($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct=ord(fread($f,1)); + if($ct==0) + $colspace='DeviceGray'; + elseif($ct==2) + $colspace='DeviceRGB'; + elseif($ct==3) + $colspace='Indexed'; + else + $this->Error('Alpha channel not supported: '.$file); + if(ord(fread($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord(fread($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord(fread($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + fread($f,4); + $parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $data=''; + do + { + $n=$this->_freadint($f); + $type=fread($f,4); + if($type=='PLTE') + { + //Read palette + $pal=fread($f,$n); + fread($f,4); + } + elseif($type=='tRNS') + { + //Read transparency info + $t=fread($f,$n); + if($ct==0) + $trns=array(ord(substr($t,1,1))); + elseif($ct==2) + $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); + else + { + $pos=strpos($t,chr(0)); + if($pos!==false) + $trns=array($pos); + } + fread($f,4); + } + elseif($type=='IDAT') + { + //Read image data block + $data.=fread($f,$n); + fread($f,4); + } + elseif($type=='IEND') + break; + else + fread($f,$n+4); + } + while($n); + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + fclose($f); + return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data); +} + +function _freadint($f) +{ + //Read a 4-byte integer from file + $a=unpack('Ni',fread($f,4)); + return $a['i']; +} + +function _textstring($s) +{ + //Format a text string + return '('.$this->_escape($s).')'; +} + +function _escape($s) +{ + //Add \ before \, ( and ) + return str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$s))); +} + +function _putstream($s) +{ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + +function _out($s) +{ + //Add a line to the document + if($this->state==2) + $this->pages[$this->page].=$s."\n"; + else + $this->buffer.=$s."\n"; +} +//End of class +} + +//Handle special IE contype request +if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype') +{ + header('Content-Type: application/pdf'); + exit; +} + +} +?> diff --git a/fannie/src/fpdf/histo.htm b/fannie/src/fpdf/histo.htm new file mode 100644 index 000000000..77c2f0c67 --- /dev/null +++ b/fannie/src/fpdf/histo.htm @@ -0,0 +1,111 @@ +<HTML> +<HEAD> +<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> +<TITLE>History</TITLE> +<LINK TYPE="text/css" REL="stylesheet" HREF="fpdf.css"> +</HEAD> +<BODY> +<H2>History</H2> +<B>v1.53</B> (2004-12-31) +<BLOCKQUOTE> +- When the font subdirectory is in the same directory as fpdf.php, it is no longer necessary to define the FPDF_FONTPATH constant.<BR> +- The array $HTTP_SERVER_VARS is no longer used. It could cause trouble on PHP5-based configurations with the register_long_arrays option disabled.<BR> +- Fixed a problem related to Type1 font embedding which caused trouble to some PDF processors.<BR> +- The file name sent to the browser could not contain a space character.<BR> +- The Cell() method could not print the number 0 (you had to pass the string '0').<BR> +</BLOCKQUOTE> +<B>v1.52</B> (2003-12-30) +<BLOCKQUOTE> +- Image() now displays the image at 72 dpi if no dimension is given.<BR> +- Output() takes a string as second parameter to indicate destination.<BR> +- Open() is now called automatically by AddPage().<BR> +- Inserting remote JPEG images doesn't generate an error any longer.<BR> +- Decimal separator is forced to dot in the constructor.<BR> +- Added several encodings (Turkish, Thai, Hebrew, Ukrainian and Vietnamese).<BR> +- The last line of a right-aligned MultiCell() was not correctly aligned if it was terminated by a carriage return.<BR> +- No more error message about already sent headers when outputting the PDF to the standard output from the command line.<BR> +- The underlining was going too far for text containing characters \, ( or ).<BR> +- $HTTP_ENV_VARS has been replaced by $HTTP_SERVER_VARS.<BR> +</BLOCKQUOTE> +<B>v1.51</B> (2002-08-03) +<BLOCKQUOTE> +- Type1 font support.<BR> +- Added Baltic encoding.<BR> +- The class now works internally in points with the origin at the bottom in order to avoid two bugs occurring with Acrobat 5 :<BR>&nbsp;&nbsp;* The line thickness was too large when printed under Windows 98 SE and ME.<BR>&nbsp;&nbsp;* TrueType fonts didn't appear immediately inside the plug-in (a substitution font was used), one had to cause a window refresh to make them show up.<BR> +- It is no longer necessary to set the decimal separator as dot to produce valid documents.<BR> +- The clickable area in a cell was always on the left independently from the text alignment.<BR> +- JPEG images in CMYK mode appeared in inverted colors.<BR> +- Transparent PNG images in grayscale or true color mode were incorrectly handled.<BR> +- Adding new fonts now works correctly even with the magic_quotes_runtime option set to on.<BR> +</BLOCKQUOTE> +<B>v1.5</B> (2002-05-28) +<BLOCKQUOTE> +- TrueType font (AddFont()) and encoding support (Western and Eastern Europe, Cyrillic and Greek).<BR> +- Added Write() method.<BR> +- Added underlined style.<BR> +- Internal and external link support (AddLink(), SetLink(), Link()).<BR> +- Added right margin management and methods SetRightMargin(), SetTopMargin().<BR> +- Modification of SetDisplayMode() to select page layout.<BR> +- The border parameter of MultiCell() now lets choose borders to draw as Cell().<BR> +- When a document contains no page, Close() now calls AddPage() instead of causing a fatal error.<BR> +</BLOCKQUOTE> +<B>v1.41</B> (2002-03-13) +<BLOCKQUOTE> +- Fixed SetDisplayMode() which no longer worked (the PDF viewer used its default display).<BR> +</BLOCKQUOTE> +<B>v1.4</B> (2002-03-02) +<BLOCKQUOTE> +- PHP3 is no longer supported.<BR> +- Page compression (SetCompression()).<BR> +- Choice of page format and possibility to change orientation inside document.<BR> +- Added AcceptPageBreak() method.<BR> +- Ability to print the total number of pages (AliasNbPages()).<BR> +- Choice of cell borders to draw.<BR> +- New mode for Cell(): the current position can now move under the cell.<BR> +- Ability to include an image by specifying height only (width is calculated automatically).<BR> +- Fixed a bug: when a justified line triggered a page break, the footer inherited the corresponding word spacing.<BR> +</BLOCKQUOTE> +<B>v1.31</B> (2002-01-12) +<BLOCKQUOTE> +- Fixed a bug in drawing frame with MultiCell(): the last line always started from the left margin.<BR> +- Removed Expires HTTP header (gives trouble in some situations).<BR> +- Added Content-disposition HTTP header (seems to help in some situations).<BR> +</BLOCKQUOTE> +<B>v1.3</B> (2001-12-03) +<BLOCKQUOTE> +- Line break and text justification support (MultiCell()).<BR> +- Color support (SetDrawColor(), SetFillColor(), SetTextColor()). Possibility to draw filled rectangles and paint cell background.<BR> +- A cell whose width is declared null extends up to the right margin of the page.<BR> +- Line width is now retained from page to page and defaults to 0.2 mm.<BR> +- Added SetXY() method.<BR> +- Fixed a passing by reference done in a deprecated manner for PHP4.<BR> +</BLOCKQUOTE> +<B>v1.2</B> (2001-11-11) +<BLOCKQUOTE> +- Added font metric files and GetStringWidth() method.<BR> +- Centering and right-aligning text in cells.<BR> +- Display mode control (SetDisplayMode()).<BR> +- Added methods to set document properties (SetAuthor(), SetCreator(), SetKeywords(), SetSubject(), SetTitle()).<BR> +- Possibility to force PDF download by browser.<BR> +- Added SetX() and GetX() methods.<BR> +- During automatic page break, current abscissa is now retained.<BR> +</BLOCKQUOTE> +<B>v1.11</B> (2001-10-20) +<BLOCKQUOTE> +- PNG support doesn't require PHP4/Zlib any more. Data are now put directly into PDF without any decompression/recompression stage.<BR> +- Image insertion now works correctly even with magic_quotes_runtime option set to on.<BR> +</BLOCKQUOTE> +<B>v1.1</B> (2001-10-07) +<BLOCKQUOTE> +- JPEG and PNG image support.<BR> +</BLOCKQUOTE> +<B>v1.01</B> (2001-10-03) +<BLOCKQUOTE> +- Fixed a bug involving page break: in case when Header() doesn't specify a font, the one from previous page was not restored and produced an incorrect document.<BR> +</BLOCKQUOTE> +<B>v1.0</B> (2001-09-17) +<BLOCKQUOTE> +- First version.<BR> +</BLOCKQUOTE> +</BODY> +</HTML> diff --git a/fannie/src/fpdf/install.txt b/fannie/src/fpdf/install.txt new file mode 100644 index 000000000..18d9b1d2f --- /dev/null +++ b/fannie/src/fpdf/install.txt @@ -0,0 +1,26 @@ +The FPDF library is made up of the following elements: + +- the main file, fpdf.php, which contains the class +- the font metric files (located in the font directory of this archive) + +The metric files are necessary as soon as you want to output some text in a document. +They can be accessed from three different locations: + +- the directory defined by the FPDF_FONTPATH constant (if this constant is defined) +- the font directory located in the directory containing fpdf.php (as it is the case in this archive) +- the directories accessible through include() + +Here is an example defining FPDF_FONTPATH (note the mandatory final slash): + +define('FPDF_FONTPATH','/src/fpdf/font/'); +require('fpdf.php'); + +If the files are not accessible, the SetFont() method will produce the following error: + +FPDF error: Could not include font metric file + + +Remarks: + +- Only the files corresponding to the fonts actually used are necessary +- The tutorials provided in this package are ready to be executed diff --git a/fannie/src/fpdf/makefont/cp1250.map b/fannie/src/fpdf/makefont/cp1250.map new file mode 100755 index 000000000..ec110af06 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1250.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 space +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/fannie/src/fpdf/makefont/cp1251.map b/fannie/src/fpdf/makefont/cp1251.map new file mode 100755 index 000000000..de6a198d9 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1251.map @@ -0,0 +1,255 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/fannie/src/fpdf/makefont/cp1252.map b/fannie/src/fpdf/makefont/cp1252.map new file mode 100755 index 000000000..dd490e596 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1252.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/cp1253.map b/fannie/src/fpdf/makefont/cp1253.map new file mode 100755 index 000000000..4bd826fb2 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1253.map @@ -0,0 +1,239 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/fannie/src/fpdf/makefont/cp1254.map b/fannie/src/fpdf/makefont/cp1254.map new file mode 100755 index 000000000..829473b28 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1254.map @@ -0,0 +1,249 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/cp1255.map b/fannie/src/fpdf/makefont/cp1255.map new file mode 100755 index 000000000..079e10c61 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1255.map @@ -0,0 +1,233 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/fannie/src/fpdf/makefont/cp1257.map b/fannie/src/fpdf/makefont/cp1257.map new file mode 100755 index 000000000..2f2ecfa21 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1257.map @@ -0,0 +1,244 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/fannie/src/fpdf/makefont/cp1258.map b/fannie/src/fpdf/makefont/cp1258.map new file mode 100755 index 000000000..fed915f71 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp1258.map @@ -0,0 +1,247 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/cp874.map b/fannie/src/fpdf/makefont/cp874.map new file mode 100755 index 000000000..1006e6b17 --- /dev/null +++ b/fannie/src/fpdf/makefont/cp874.map @@ -0,0 +1,225 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/fannie/src/fpdf/makefont/iso-8859-1.map b/fannie/src/fpdf/makefont/iso-8859-1.map new file mode 100755 index 000000000..61740a38f --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-1.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/iso-8859-11.map b/fannie/src/fpdf/makefont/iso-8859-11.map new file mode 100755 index 000000000..916881206 --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-11.map @@ -0,0 +1,248 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/fannie/src/fpdf/makefont/iso-8859-15.map b/fannie/src/fpdf/makefont/iso-8859-15.map new file mode 100755 index 000000000..6c2b57127 --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-15.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/iso-8859-16.map b/fannie/src/fpdf/makefont/iso-8859-16.map new file mode 100755 index 000000000..202c8fe59 --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-16.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/iso-8859-2.map b/fannie/src/fpdf/makefont/iso-8859-2.map new file mode 100755 index 000000000..65ae09f95 --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-2.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/fannie/src/fpdf/makefont/iso-8859-4.map b/fannie/src/fpdf/makefont/iso-8859-4.map new file mode 100755 index 000000000..a7d87bf3e --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-4.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/fannie/src/fpdf/makefont/iso-8859-5.map b/fannie/src/fpdf/makefont/iso-8859-5.map new file mode 100755 index 000000000..f9cd4edcf --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-5.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/fannie/src/fpdf/makefont/iso-8859-7.map b/fannie/src/fpdf/makefont/iso-8859-7.map new file mode 100755 index 000000000..e163796b1 --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-7.map @@ -0,0 +1,250 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/fannie/src/fpdf/makefont/iso-8859-9.map b/fannie/src/fpdf/makefont/iso-8859-9.map new file mode 100755 index 000000000..48c123ae6 --- /dev/null +++ b/fannie/src/fpdf/makefont/iso-8859-9.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/fannie/src/fpdf/makefont/koi8-r.map b/fannie/src/fpdf/makefont/koi8-r.map new file mode 100755 index 000000000..6ad5d05d0 --- /dev/null +++ b/fannie/src/fpdf/makefont/koi8-r.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/fannie/src/fpdf/makefont/koi8-u.map b/fannie/src/fpdf/makefont/koi8-u.map new file mode 100755 index 000000000..40a7e4fd7 --- /dev/null +++ b/fannie/src/fpdf/makefont/koi8-u.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/fannie/src/fpdf/makefont/makefont.php b/fannie/src/fpdf/makefont/makefont.php new file mode 100755 index 000000000..178e9e239 --- /dev/null +++ b/fannie/src/fpdf/makefont/makefont.php @@ -0,0 +1,416 @@ +<?php +/******************************************************************************* +* Utility to generate font definition files * +* Version: 1.13 * +* Date: 2004-12-31 * +*******************************************************************************/ + +function ReadMap($enc) +{ + //Read a map file + $file=dirname(__FILE__).'/'.strtolower($enc).'.map'; + $a=file($file); + if(empty($a)) + die('<B>Error:</B> encoding not found: '.$enc); + $cc2gn=array(); + foreach($a as $l) + { + if($l{0}=='!') + { + $e=preg_split('/[ \\t]+/',rtrim($l)); + $cc=hexdec(substr($e[0],1)); + $gn=$e[2]; + $cc2gn[$cc]=$gn; + } + } + for($i=0;$i<=255;$i++) + { + if(!isset($cc2gn[$i])) + $cc2gn[$i]='.notdef'; + } + return $cc2gn; +} + +function ReadAFM($file,&$map) +{ + //Read a font metric file + $a=file($file); + if(empty($a)) + die('File not found'); + $widths=array(); + $fm=array(); + $fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent', + 'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut', + 'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent', + 'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent', + 'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent', + 'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat', + 'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb', + 'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong'); + foreach($a as $l) + { + $e=explode(' ',rtrim($l)); + if(count($e)<2) + continue; + $code=$e[0]; + $param=$e[1]; + if($code=='C') + { + //Character metrics + $cc=(int)$e[1]; + $w=$e[4]; + $gn=$e[7]; + if(substr($gn,-4)=='20AC') + $gn='Euro'; + if(isset($fix[$gn])) + { + //Fix incorrect glyph name + foreach($map as $c=>$n) + { + if($n==$fix[$gn]) + $map[$c]=$gn; + } + } + if(empty($map)) + { + //Symbolic font: use built-in encoding + $widths[$cc]=$w; + } + else + { + $widths[$gn]=$w; + if($gn=='X') + $fm['CapXHeight']=$e[13]; + } + if($gn=='.notdef') + $fm['MissingWidth']=$w; + } + elseif($code=='FontName') + $fm['FontName']=$param; + elseif($code=='Weight') + $fm['Weight']=$param; + elseif($code=='ItalicAngle') + $fm['ItalicAngle']=(double)$param; + elseif($code=='Ascender') + $fm['Ascender']=(int)$param; + elseif($code=='Descender') + $fm['Descender']=(int)$param; + elseif($code=='UnderlineThickness') + $fm['UnderlineThickness']=(int)$param; + elseif($code=='UnderlinePosition') + $fm['UnderlinePosition']=(int)$param; + elseif($code=='IsFixedPitch') + $fm['IsFixedPitch']=($param=='true'); + elseif($code=='FontBBox') + $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); + elseif($code=='CapHeight') + $fm['CapHeight']=(int)$param; + elseif($code=='StdVW') + $fm['StdVW']=(int)$param; + } + if(!isset($fm['FontName'])) + die('FontName not found'); + if(!empty($map)) + { + if(!isset($widths['.notdef'])) + $widths['.notdef']=600; + if(!isset($widths['Delta']) and isset($widths['increment'])) + $widths['Delta']=$widths['increment']; + //Order widths according to map + for($i=0;$i<=255;$i++) + { + if(!isset($widths[$map[$i]])) + { + echo '<B>Warning:</B> character '.$map[$i].' is missing<BR>'; + $widths[$i]=$widths['.notdef']; + } + else + $widths[$i]=$widths[$map[$i]]; + } + } + $fm['Widths']=$widths; + return $fm; +} + +function MakeFontDescriptor($fm,$symbolic) +{ + //Ascent + $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd="array('Ascent'=>".$asc; + //Descent + $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd.=",'Descent'=>".$desc; + //CapHeight + if(isset($fm['CapHeight'])) + $ch=$fm['CapHeight']; + elseif(isset($fm['CapXHeight'])) + $ch=$fm['CapXHeight']; + else + $ch=$asc; + $fd.=",'CapHeight'=>".$ch; + //Flags + $flags=0; + if(isset($fm['IsFixedPitch']) and $fm['IsFixedPitch']) + $flags+=1<<0; + if($symbolic) + $flags+=1<<2; + if(!$symbolic) + $flags+=1<<5; + if(isset($fm['ItalicAngle']) and $fm['ItalicAngle']!=0) + $flags+=1<<6; + $fd.=",'Flags'=>".$flags; + //FontBBox + if(isset($fm['FontBBox'])) + $fbb=$fm['FontBBox']; + else + $fbb=array(0,$des-100,1000,$asc+100); + $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd.=",'ItalicAngle'=>".$ia; + //StemV + if(isset($fm['StdVW'])) + $stemv=$fm['StdVW']; + elseif(isset($fm['Weight']) and eregi('(bold|black)',$fm['Weight'])) + $stemv=120; + else + $stemv=70; + $fd.=",'StemV'=>".$stemv; + //MissingWidth + if(isset($fm['MissingWidth'])) + $fd.=",'MissingWidth'=>".$fm['MissingWidth']; + $fd.=')'; + return $fd; +} + +function MakeWidthArray($fm) +{ + //Make character width array + $s="array(\n\t"; + $cw=$fm['Widths']; + for($i=0;$i<=255;$i++) + { + if(chr($i)=="'") + $s.="'\\''"; + elseif(chr($i)=="\\") + $s.="'\\\\'"; + elseif($i>=32 and $i<=126) + $s.="'".chr($i)."'"; + else + $s.="chr($i)"; + $s.='=>'.$fm['Widths'][$i]; + if($i<255) + $s.=','; + if(($i+1)%22==0) + $s.="\n\t"; + } + $s.=')'; + return $s; +} + +function MakeFontEncoding($map) +{ + //Build differences from reference encoding + $ref=ReadMap('cp1252'); + $s=''; + $last=0; + for($i=32;$i<=255;$i++) + { + if($map[$i]!=$ref[$i]) + { + if($i!=$last+1) + $s.=$i.' '; + $last=$i; + $s.='/'.$map[$i].' '; + } + } + return rtrim($s); +} + +function SaveToFile($file,$s,$mode='t') +{ + $f=fopen($file,'w'.$mode); + if(!$f) + die('Can\'t write to file '.$file); + fwrite($f,$s,strlen($s)); + fclose($f); +} + +function ReadShort($f) +{ + $a=unpack('n1n',fread($f,2)); + return $a['n']; +} + +function ReadLong($f) +{ + $a=unpack('N1N',fread($f,4)); + return $a['N']; +} + +function CheckTTF($file) +{ + //Check if font license allows embedding + $f=fopen($file,'rb'); + if(!$f) + die('<B>Error:</B> Can\'t open '.$file); + //Extract number of tables + fseek($f,4,SEEK_CUR); + $nb=ReadShort($f); + fseek($f,6,SEEK_CUR); + //Seek OS/2 table + $found=false; + for($i=0;$i<$nb;$i++) + { + if(fread($f,4)=='OS/2') + { + $found=true; + break; + } + fseek($f,12,SEEK_CUR); + } + if(!$found) + { + fclose($f); + return; + } + fseek($f,4,SEEK_CUR); + $offset=ReadLong($f); + fseek($f,$offset,SEEK_SET); + //Extract fsType flags + fseek($f,8,SEEK_CUR); + $fsType=ReadShort($f); + $rl=($fsType & 0x02)!=0; + $pp=($fsType & 0x04)!=0; + $e=($fsType & 0x08)!=0; + fclose($f); + if($rl and !$pp and !$e) + echo '<B>Warning:</B> font license does not allow embedding'; +} + +/******************************************************************************* +* $fontfile : chemin du fichier TTF (ou chaîne vide si pas d'incorporation) * +* $afmfile : chemin du fichier AFM * +* $enc : encodage (ou chaîne vide si la police est symbolique) * +* $patch : patch optionnel pour l'encodage * +* $type : type de la police si $fontfile est vide * +*******************************************************************************/ +function MakeFont($fontfile,$afmfile,$enc='cp1252',$patch=array(),$type='TrueType') +{ + //Generate a font definition file + set_magic_quotes_runtime(0); + ini_set('auto_detect_line_endings','1'); + if($enc) + { + $map=ReadMap($enc); + foreach($patch as $cc=>$gn) + $map[$cc]=$gn; + } + else + $map=array(); + if(!file_exists($afmfile)) + die('<B>Error:</B> AFM file not found: '.$afmfile); + $fm=ReadAFM($afmfile,$map); + if($enc) + $diff=MakeFontEncoding($map); + else + $diff=''; + $fd=MakeFontDescriptor($fm,empty($map)); + //Find font type + if($fontfile) + { + $ext=strtolower(substr($fontfile,-3)); + if($ext=='ttf') + $type='TrueType'; + elseif($ext=='pfb') + $type='Type1'; + else + die('<B>Error:</B> unrecognized font file extension: '.$ext); + } + else + { + if($type!='TrueType' and $type!='Type1') + die('<B>Error:</B> incorrect font type: '.$type); + } + //Start generation + $s='<?php'."\n"; + $s.='$type=\''.$type."';\n"; + $s.='$name=\''.$fm['FontName']."';\n"; + $s.='$desc='.$fd.";\n"; + if(!isset($fm['UnderlinePosition'])) + $fm['UnderlinePosition']=-100; + if(!isset($fm['UnderlineThickness'])) + $fm['UnderlineThickness']=50; + $s.='$up='.$fm['UnderlinePosition'].";\n"; + $s.='$ut='.$fm['UnderlineThickness'].";\n"; + $w=MakeWidthArray($fm); + $s.='$cw='.$w.";\n"; + $s.='$enc=\''.$enc."';\n"; + $s.='$diff=\''.$diff."';\n"; + $basename=substr(basename($afmfile),0,-4); + if($fontfile) + { + //Embedded font + if(!file_exists($fontfile)) + die('<B>Error:</B> font file not found: '.$fontfile); + if($type=='TrueType') + CheckTTF($fontfile); + $f=fopen($fontfile,'rb'); + if(!$f) + die('<B>Error:</B> Can\'t open '.$fontfile); + $file=fread($f,filesize($fontfile)); + fclose($f); + if($type=='Type1') + { + //Find first two sections and discard third one + $header=(ord($file{0})==128); + if($header) + { + //Strip first binary header + $file=substr($file,6); + } + $pos=strpos($file,'eexec'); + if(!$pos) + die('<B>Error:</B> font file does not seem to be valid Type1'); + $size1=$pos+6; + if($header and ord($file{$size1})==128) + { + //Strip second binary header + $file=substr($file,0,$size1).substr($file,$size1+6); + } + $pos=strpos($file,'00000000'); + if(!$pos) + die('<B>Error:</B> font file does not seem to be valid Type1'); + $size2=$pos-$size1; + $file=substr($file,0,$size1+$size2); + } + if(function_exists('gzcompress')) + { + $cmp=$basename.'.z'; + SaveToFile($cmp,gzcompress($file),'b'); + $s.='$file=\''.$cmp."';\n"; + echo 'Font file compressed ('.$cmp.')<BR>'; + } + else + { + $s.='$file=\''.basename($fontfile)."';\n"; + echo '<B>Notice:</B> font file could not be compressed (zlib extension not available)<BR>'; + } + if($type=='Type1') + { + $s.='$size1='.$size1.";\n"; + $s.='$size2='.$size2.";\n"; + } + else + $s.='$originalsize='.filesize($fontfile).";\n"; + } + else + { + //Not embedded font + $s.='$file='."'';\n"; + } + $s.="?>\n"; + SaveToFile($basename.'.php',$s); + echo 'Font definition file generated ('.$basename.'.php'.')<BR>'; +} +?> diff --git a/fannie/src/functions.php b/fannie/src/functions.php new file mode 100644 index 000000000..8d9c2ea62 --- /dev/null +++ b/fannie/src/functions.php @@ -0,0 +1,258 @@ +<?php +/******************************************************************************* + + Copyright 2007 People's Food Co-op, Portland, Oregon. + + This file is part of Fannie. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 20Jan2013 Eric Lee In receipt_to_table() support per-coop header text + * hopefully pending use of CORE_LOCAL[receiptHeader*] + * via $FANNIE/install/lane_config/ini.php and table core_trans.lane_config + +*/ + +require_once('mysql_connect.php'); + +// ----------------------------------------------------------------- + + +// $db =$dbc->connect('localhost',$_SESSION["mUser"],$_SESSION["mPass"]); +// $dbc->select_db('is4c_op',$db); + +function select_to_table($query,$args,$border,$bgcolor) +{ + global $dbc; + $prep = $dbc->prepare_statement($query); + $results = $dbc->exec_statement($prep,$args); + $number_cols = $dbc->num_fields($results); + //display query + //echo "<b>query: $query</b>"; + //layout table header + echo "<font size = 2>"; + echo "<table border = $border bgcolor=$bgcolor cellspacing=0 cellpadding=3>\n"; + /* + echo "<tr align left>\n"; + for($i=0; $i<$number_cols; $i++) + { + echo "<th><font size =2>" . $dbc->field_name($results,$i). "</font></th>\n"; + } + echo "</tr>\n"; //end table header + */ + //layout table body + while($row = $dbc->fetch_row($results)) + { + echo "<tr align left>\n"; + for ($i=0;$i<$number_cols; $i++) { + echo "<td width="; + if(is_numeric($row[$i]) || !isset($row[$i])) { echo "89";} else { echo "170";} + echo " align="; + if(is_numeric($row[$i]) || !isset($row[$i])) { echo "right";} else { echo "left";} + echo "><font size = 2>"; + if(!isset($row[$i])) {//test for null value + echo "0.00"; + }elseif (is_numeric($row[$i]) && strstr($row[$i],".")){ + printf("%.2f",$row[$i]); + }else{ + echo $row[$i]; + } + echo "</font></td>\n"; + } echo "</tr>\n"; + } echo "</table>\n"; + echo "</font>"; +} + +/* -------------------------------end select_to_table-------------------*/ + +function select_to_table2($query,$args,$border,$bgcolor,$width="120",$spacing="0",$padding="0",$headers=array(),$nostart=False) +{ + global $dbc; + $prep = $dbc->prepare_statement($query); + $results = $dbc->exec_statement($prep,$args); + $number_cols = $dbc->num_fields($results); + $num_rows = $dbc->num_rows($results); + $backgrounds = array('#ffffff',$bgcolor); + $b = 0; + //display query + //echo "<b>query: $query</b>"; + //layout table header + echo "<font size = 2>"; + if (!$nostart){ + if($num_rows !=0){ + echo "<table border = $border cellpadding=$padding cellspacing=$spacing>\n"; + }else{ + echo "<table border=0 bgcolor=$bgcolor>\n"; + } + } + echo "<tr align left>\n"; + if($num_rows == 0){ + echo "There are no results to report"; + }else{ + + if (count($headers) > 0){ + echo "<tr>\n"; + foreach ($headers as $h) + echo "<th width=$width bgcolor=$backgrounds[$b]><font size=2>".$h."</font></th>\n"; + echo "</tr>"; + $b = 1; + } + while($row = $dbc->fetch_array($results)) + { + echo "<tr align left>\n"; + for ($i=0;$i<$number_cols; $i++) + { + echo "<td width = $width bgcolor=$backgrounds[$b]><font size = 2>"; + if(!isset($row[$i])) //test for null value + { + echo "NULL"; + }else{ + echo $row[$i]; + } + echo "</font></td>\n"; + } echo "</tr>\n"; + $b = ($b+1)%2; + } } echo "</table>\n"; + echo "</font>"; +} + +function receipt_to_table($query,$args,$query2,$args2,$border,$bgcolor) +{ + global $dbc, $FANNIE_COOP_ID; + $prep = $dbc->prepare_statement($query); + $results = $dbc->exec_statement($prep,$args); + $number_cols = $dbc->num_fields($results); + $rows = array(); + while($row = $dbc->fetch_row($results)) + $rows[] = $row; + $row2 = $rows[0]; + $emp_no = $row2['emp_no']; + $trans_num = $row2['emp_no']."-".$row2['register_no']."-".$row2['trans_no']; + + /* 20Jan13 EL The way I would like to do this. + * Or perhaps get from core_trans.lane_config + if ( $CORE_LOCAL->get("receiptHeaderCount") > 0 ) { + $receiptHeader = ""; + $c = $CORE_LOCAL->get("receiptHeaderCount"); + for ( $i=1; $i <= $c; $i++ ) { + $h = "receiptHeader$i"; + $receiptHeader .= ("<tr><td align=center colspan=4>" . $CORE_LOCAL->get("$h") . "</td></tr>\n"); + } + } + */ + + $receiptHeader = ""; + + if ( isset($FANNIE_COOP_ID) ) { + switch ($FANNIE_COOP_ID) { + + case "WEFC_Toronto": + $receiptHeader .= ("<tr><td align=center colspan=4>" . "W E S T &nbsp; E N D &nbsp; F O O D &nbsp; C O - O P" . "</td></tr>\n"); + $receiptHeader .= ("<tr><td align=center colspan=4>" . "416-533-6363" . "</td></tr>\n"); + $receiptHeader .= ("<tr><td align=center colspan=4>" . "Local food for local tastes" . "</td></tr>\n"); + break; + + case "WFC_Duluth": + $receiptHeader .= ("<tr><td align=center colspan=4>" . "W H O L E &nbsp; F O O D S &nbsp; C O - O P" . "</td></tr>\n"); + $receiptHeader .= ("<tr><td align=center colspan=4>" . "218-728-0884" . "</td></tr>\n"); + $receiptHeader .= ("<tr><td align=center colspan=4>" . "MEMBER OWNED SINCE 1970" . "</td></tr>\n"); + break; + + default: + $receiptHeader .= ("<tr><td align=center colspan=4>" . "FANNIE_COOP_ID >{$FANNIE_COOP_ID}<" . "</td></tr>\n"); + } + } + + echo "<table border = $border bgcolor=$bgcolor>\n"; + echo "{$receiptHeader}\n"; + echo "<tr><td align=center colspan=4>{$row2['datetime']} &nbsp; &nbsp; $trans_num</td></tr>"; + echo "<tr><td align=center colspan=4>Cashier:&nbsp;$emp_no</td></tr>"; + echo "<tr><td colspan=4>&nbsp;</td></tr>"; + echo "<tr align left>\n"; + /*for($i=0; $i<5; $i++) + { + echo "<th>" . $dbc->field_name($results,$i). "</th>\n"; + } + echo "</tr>\n"; *///end table header + //layout table body + foreach($rows as $row){ + echo "<tr><td align=left>"; + echo $row["description"]; + echo "</td>"; + echo "<td align=right>"; + echo $row["comment"]; + echo "</td><td align=right>"; + echo $row["total"]; + echo "</td><td align=right>"; + echo $row["Status"]; + echo "</td></tr>"; + } + + echo "<tr><td colspan=4>&nbsp;</td></tr>"; + echo "<tr><td colspan=4 align=center>--------------------------------------------------------</td></tr>"; + echo "<tr><td colspan=4 align=center>Reprinted Transaction</td></tr>"; + echo "<tr><td colspan=4 align=center>--------------------------------------------------------</td></tr>"; + echo "<tr><td colspan=4 align=center>Member #: {$row2['memberID']}</td</tr>"; + echo "</table>\n"; + +} + +/* pads upc with zeroes to make $upc into IT CORE compliant upc*/ + +function str_pad_upc($upc){ + $strUPC = str_pad($upc,13,"0",STR_PAD_LEFT); + return $strUPC; +} + +function test_upc($upc){ + if(is_numeric($upc)){ + $upc=str_pad_upc($upc); + }else{ + echo "not a number"; + } +} + +/* create an array from the results of a POSTed form */ + +function get_post_data($int){ + foreach ($_POST AS $key => $value) { + $$key = $value; + if($int == 1){ + echo $key .": " . $$key . "<br>"; + } + } +} + +/* create an array from the results of GETed information */ + +function get_get_data($int){ + foreach ($_GET AS $key => $value) { + $$key = $value; + if($int == 1){ + echo $key .": " . $$key . "<br>"; + } + } +} + +/* rounding function to create 'non-stupid' pricing */ + + + +?> diff --git a/fannie/src/head.php b/fannie/src/head.php new file mode 100644 index 000000000..b7d7cd6e2 --- /dev/null +++ b/fannie/src/head.php @@ -0,0 +1,89 @@ +<?php +include ('../define.conf'); +?> +<!-- INSERT JAVASCRIPT HEAD TAGS HERE --> +<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js" type="text/javascript"></script> + +<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> --> +<script src="<?php echo SRCROOT; ?>/js/tablesort.js" type="text/javascript"></script> +<script src="<?php echo SRCROOT; ?>/js/picnet.table.filter.min.js" type="text/javascript"></script> +<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js" type="text/javascript"></script> +<script src="<?php echo SRCROOT; ?>/js/ZeroClipboard.js" type="text/javascript"></script> +<!-- <script src="<?php //echo SRCROOT; ?>/js/jquery-ui.js" type="text/javascript"></script> --> +<script type="text/javascript" charset="utf-8"> +<!-- Begin + function putFocus(formInst, elementInst) { + if (document.forms.length > 0) { + document.forms[formInst].elements[elementInst].focus(); + } + } +// The second number in the "onLoad" command in the body +// tag determines the forms focus. +// End --> +</script> +<script type="text/javascript" charset="utf-8"> +$(document).ready(function() { + var options = { + clearFiltersControls: [$('#cleanfilters')], + }; + $('#output').tableFilter(options); +}); +</script> + +<script type="text/javascript" charset="utf-8"> +$(function() { + $('.opener').click(function(e) { + e.preventDefault(); + var $this = $(this); + var horizontalPadding = 30; + var verticalPadding = 30; + $('<div id="outerdiv"><iframe id="externalSite" class="externalSite" src="' + this.href + '" />').dialog({ + title: ($this.attr('title')) ? $this.attr('title') : 'Instant Item Editor', + autoOpen: true, + width: 560, + height: 700, + modal: true, + resizable: true, + autoResize: true, + overlay: { + opacity: 0.5, + background: "black" + } + }).width(560 - horizontalPadding).height(700 - verticalPadding); + }); +}); + +$(function() { + $('.loginbox').click(function(e) { + e.preventDefault(); + var $this = $(this); + var horizontalPadding = 0; + var verticalPadding = 0; + $('<div id="outerdiv2"><iframe id="externalSite2" class="externalSite2" src="' + this.href + '" />').dialog({ + title: ($this.attr('title')) ? $this.attr('title') : 'Instant Item Editor', + autoOpen: true, + width: 500, + height: 300, + modal: true, + resizable: true, + autoResize: true, + overlay: { + opacity: 0.5, + background: "black" + } + }).width(500 - horizontalPadding).height(300 - verticalPadding); + }); +}); +</script> +<script> +function goBack(){ + window.history.back() +} +</script> + + + +<!-- INSERT CSS HEAD TAGS HERE --> +<link rel="stylesheet" href="<?php echo SRCROOT; ?>/style.css" type="text/css" /> +<!-- ><link rel="stylesheet" href="<?php //echo SRCROOT; ?>/tablesort.css" type="text/css" /> --> +<link rel="stylesheet" href="<?php echo SRCROOT; ?>/js/jquery-ui.css" type="text/css" /> \ No newline at end of file diff --git a/fannie/src/header.html b/fannie/src/header.html new file mode 100644 index 000000000..93292d399 --- /dev/null +++ b/fannie/src/header.html @@ -0,0 +1,65 @@ +<?php +/* try to deal with relative paths for includes */ +$path = ""; +$found = False; +$uri = $_SERVER['REQUEST_URI']; +$tmp = explode("?",$uri); +if (count($tmp) > 1) $uri = $tmp[0]; +foreach(explode("/",$uri) as $x){ + if (strpos($x,".php") === False + && strlen($x) != 0){ + $path .= "../"; + } + if (!$found && stripos($x,"fannie") !== False){ + $found = True; + $path = ""; + } +} +?> +<!DOCTYPE html> +<html lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title><?php echo $page_title; ?></title> +<link rel="STYLESHEET" href="<?php echo $path; ?>src/style.css" type="text/css"> +<link rel="STYLESHEET" href="<?php echo $path; ?>src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css" type="text/css"> +<script type="text/javascript" src="<?php echo $path; ?>src/jquery/js/jquery.js"> +</script> +<script type="text/javascript" src="<?php echo $path; ?>src/jquery/js/jquery-ui-1.8.1.custom.min.js"> +</script> +</head> +<body> +<div style="width:90%;margin-left:auto;margin-right:auto;"> +<table style="width:90%;"> +<tr> + <td colspan="2" style="width:100%;border-bottom:solid 1px #ccc;margin-bottom:10px;padding-bottom:15px;"> + <div style="font-size:28px;color:#330066"> + Fannie + </div> + <div style="font-size:20px;color:#666666"> + IT CORE maintenance & reporting + </div> + </td> +</tr> +<tr> + <td style="width:170px;background:#fff;vertical-align:top;border-right:solid 1px #ccc;"> + <div style="width:170px;margin-left:auto;margin-right:auto;"> + <?php + global $FANNIE_DYNAMIC_MENU; + if (isset($FANNIE_DYNAMIC_MENU) && $FANNIE_DYNAMIC_MENU===True) + include($path.'src/navbar.dynamic.php'); + else + include($path.'src/navbar.html'); + ?> + <span style="font-size:6px"><br></span> + </div> + </td> + <td style="width:100%;vertical-align:top;border-right:solid 1px #ccc;"> + <span style="font-size:6px"><br></span> + <div style="width:579;margin-left:auto;margin-right:auto;"> + <div style="width:95%;height:27px;background:#f9f9f9; + color:#330066;font-size:15px;border-top:1px #ccc solid; + border-bottom:1px #ccc solid;padding-top:3px;"> + &nbsp;&nbsp;<?php echo $header; ?> + </div> + <div style="width:95%;color:#444;line-height:1.6em;margin-left:7px;"> diff --git a/fannie/src/header.php b/fannie/src/header.php new file mode 100644 index 000000000..f3856ea9e --- /dev/null +++ b/fannie/src/header.php @@ -0,0 +1,95 @@ +<?php require_once('../define.conf'); ?> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title><?php echo $page_title; ?></title> +<?php include_once('../src/head.php'); ?> +</head> +<body bgcolor="FFFFFF"> +<!--<div id="banner"> + development area +</div>--> +<div align="center"> +<table width="750" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td colspan="3" width="750"> + <table width="750" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td width="750" colspan="3"> + <span style="font-size:28px;color:330066"> + Fannie + </span> + </td> + </tr> + <tr> + <td width="330"> + <span style="font-size:20px;color:666666"> + IS4C maintenance & reporting + </span> + </td> + <td width="400" align="right"> + <table width="400" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td align="right" height="20"> + </td> + </tr> + </table> + </td> + <td width="20"></td> + </tr> + </table> + </td> + </tr> + <tr> + <td colspan="3" height="15" bgcolor="FFFFFF"></td> + </tr> + <tr> + <td colspan="3" height="1" bgcolor="CCCCCC"></td> + </tr> + <tr> + <td colspan="3" height="10" bgcolor="FFFFFF"></td> + </tr> + <tr> + <td width="170" bgcolor="FFFFFF" valign="top"> + <span style="font-size:6px"><br></span> + <div align="center"> + <?php + include_once('../src/navbar.html'); + ?> + <span style="font-size:6px"><br></span> + </div> + </td> + <td width="1" bgcolor="CCCCCC"></td> + <td width="579" valign="top"> + <span style="font-size:6px"><br></span> + <div align="center"> + <table width="549" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td colspan="4" height="1" bgcolor="AAAAAA"></td> + <td width="5" height="1" bgcolor="FFFFFF"></td> + </tr> + <tr> + <td width="1" bgcolor="AAAAAA"></td> + <td rowspan="2" colspan="2" width="542" height="27" bgcolor="F9F9F9" style="color:330066;font-size:15px">&nbsp;&nbsp;<?php echo $header; ?></td> + <td width="1" bgcolor="AAAAAA"></td> + <td width="5" height="4" bgcolor="FFFFFF"></td> + </tr> + <tr> + <td width="1" bgcolor="AAAAAA"></td> + <td width="1" bgcolor="AAAAAA"></td> + <td width="5" bgcolor="F0F0F0" height="23"></td> + </tr> + <tr> + <td width="1" bgcolor="AAAAAA"></td> + <td colspan="2" height="1" bgcolor="AAAAAA"></td> + <td width="1" bgcolor="AAAAAA"></td> + <td width="5" bgcolor="F0F0F0"></td> + </tr> + <tr> + <td width="1" bgcolor="AAAAAA"></td> + <td colspan="2" bgcolor="FFFFFF"> + <table width="542" border="0" cellpadding="17" cellspacing="0"> + <tr> + <td style="color:999999;line-height:1.6em"> + <div align="justify"> diff --git a/fannie/src/header_install.html b/fannie/src/header_install.html new file mode 100644 index 000000000..200ab696d --- /dev/null +++ b/fannie/src/header_install.html @@ -0,0 +1,41 @@ +<?php +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * 16Apr13 EL + Use FanniePage functions to get JS and CSS. + * 16Apr2013 Eric Lee Extracted from header.html for a "plain" page + * extending InstallPage which extends FanniePage + * that uses authentication, e.g. fannie/install pages. +*/ +?> +<?php +/* try to deal with relative paths for includes */ +/* EL Could this code itself be included? */ +/* EL FanniePage-based pages may make this unnecessary. */ +$path = ""; +$found = False; +$uri = $_SERVER['REQUEST_URI']; +$tmp = explode("?",$uri); +if (count($tmp) > 1) $uri = $tmp[0]; +foreach(explode("/",$uri) as $x){ + if (strpos($x,".php") === False + && strlen($x) != 0){ + $path .= "../"; + } + if (!$found && stripos($x,"fannie") !== False){ + $found = True; + $path = ""; + } +} +?> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html lang="en"> +<head> +<title><?php echo $page_title; ?></title> +</head> +<body> +<!-- See about generating tabs and page heading here. +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<link rel="STYLESHEET" href="<?php echo $path; ?>src/style.css" type="text/css"> +<link rel="STYLESHEET" href="<?php echo $path; ?>src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css" type="text/css"> +<script type="text/javascript" src="<?php echo $path; ?>src/jquery/js/jquery.js"></script> +<script type="text/javascript" src="<?php echo $path; ?>src/jquery/js/jquery-ui-1.8.1.custom.min.js"></script> +--> diff --git a/fannie/src/host_up.php b/fannie/src/host_up.php new file mode 100644 index 000000000..bc42045f5 --- /dev/null +++ b/fannie/src/host_up.php @@ -0,0 +1,38 @@ +<?php + +function check_db_host($host,$dbms){ + if (!function_exists("socket_create")) + return True; // test not possible + + $port = 0; + switch(strtoupper($dbms)){ + case 'MYSQL': + case 'MYSQLI': + case 'PDO_MYSQL': + $port = 3306; + break; + case 'MSSQL': + $port = 1433; + break; + case 'PGSQL': + $port = 5432; + break; + } + + if (strstr($host,":")) + list($host,$port) = explode(":",$host); + + $test = False; + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0)); + socket_set_block($sock); + try { + $test = @socket_connect($sock,$host,$port); + } + catch(Exception $ex) {} + socket_close($sock); + + return ($test ? True : False); +} + +?> diff --git a/fannie/src/htmlparts.php b/fannie/src/htmlparts.php new file mode 100644 index 000000000..068a4f626 --- /dev/null +++ b/fannie/src/htmlparts.php @@ -0,0 +1,31 @@ +<?php + function head() { + global $FANNIE_URL; + return ' + <link href="'.$FANNIE_URL.'src/screen.css" media="screen" rel="stylesheet" type="text/css"/>'; + } + + function body() { + global $FANNIE_URL; + return ' + <div id="page_top"><a class="a_unstyled" href="'.$FANNIE_URL.'">IT CORE Maintenance &amp; Reporting</a></div> + <div id="page_nav"> + <ul> + <li><a href="'.$FANNIE_URL.'item">Item Maintenance</a></li> + <li><a href="'.$FANNIE_URL.'batch">Sale Batches</a></li> + <li><a href="'.$FANNIE_URL.'label">Label Maker</a></li> + <li>Reports</li> + <li>Dayend Balancing</li> + <li><a href="'.$FANNIE_URL.'sync">Synchronization</a></li> + <li><a href="'.$FANNIE_URL.'admin">Admin</a></li> + </ul> + </div>'; + } + + function foot() { + return ' + <div id="page_foot"> + <p class="p_status">'.$_SERVER['REMOTE_ADDR'].'</p> + </div>'; + } +?> diff --git a/fannie/src/images/store.png b/fannie/src/images/store.png new file mode 100644 index 000000000..f7b52f314 Binary files /dev/null and b/fannie/src/images/store.png differ diff --git a/fannie/src/img/GREENDOT.GIF b/fannie/src/img/GREENDOT.GIF new file mode 100644 index 000000000..7982829ab Binary files /dev/null and b/fannie/src/img/GREENDOT.GIF differ diff --git a/fannie/src/img/REDDOT.GIF b/fannie/src/img/REDDOT.GIF new file mode 100644 index 000000000..507f175f7 Binary files /dev/null and b/fannie/src/img/REDDOT.GIF differ diff --git a/fannie/src/img/buttons/action_print.gif b/fannie/src/img/buttons/action_print.gif new file mode 100644 index 000000000..92e7e0a1a Binary files /dev/null and b/fannie/src/img/buttons/action_print.gif differ diff --git a/fannie/src/img/buttons/arrow_down.gif b/fannie/src/img/buttons/arrow_down.gif new file mode 100644 index 000000000..f0bb6a4ea Binary files /dev/null and b/fannie/src/img/buttons/arrow_down.gif differ diff --git a/fannie/src/img/buttons/arrow_up.gif b/fannie/src/img/buttons/arrow_up.gif new file mode 100644 index 000000000..e8234178e Binary files /dev/null and b/fannie/src/img/buttons/arrow_up.gif differ diff --git a/fannie/src/img/buttons/b_drop.png b/fannie/src/img/buttons/b_drop.png new file mode 100644 index 000000000..6fc4d3b20 Binary files /dev/null and b/fannie/src/img/buttons/b_drop.png differ diff --git a/fannie/src/img/buttons/b_edit.png b/fannie/src/img/buttons/b_edit.png new file mode 100644 index 000000000..05711a094 Binary files /dev/null and b/fannie/src/img/buttons/b_edit.png differ diff --git a/fannie/src/img/buttons/b_save.png b/fannie/src/img/buttons/b_save.png new file mode 100644 index 000000000..b89b1c0e6 Binary files /dev/null and b/fannie/src/img/buttons/b_save.png differ diff --git a/fannie/src/img/buttons/trash.png b/fannie/src/img/buttons/trash.png new file mode 100644 index 000000000..d21645a31 Binary files /dev/null and b/fannie/src/img/buttons/trash.png differ diff --git a/fannie/src/jquery-1.2.6.min.js b/fannie/src/jquery-1.2.6.min.js new file mode 100644 index 000000000..82b98e1d7 --- /dev/null +++ b/fannie/src/jquery-1.2.6.min.js @@ -0,0 +1,32 @@ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ +(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else +return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else +return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else +selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else +return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else +this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else +return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else +script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else +for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else +for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else +jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else +ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else +while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else +while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else +jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else +xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else +jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else +s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_arrows_leftright.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_arrows_leftright.gif new file mode 100644 index 000000000..b26780a3b Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_arrows_leftright.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_arrows_updown.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_arrows_updown.gif new file mode 100644 index 000000000..69eb0770a Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_arrows_updown.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_doc.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_doc.gif new file mode 100644 index 000000000..26db4340c Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_doc.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_minus.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_minus.gif new file mode 100644 index 000000000..6851f3981 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_minus.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_plus.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_plus.gif new file mode 100644 index 000000000..74ac5cb91 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_plus.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_resize_se.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_resize_se.gif new file mode 100644 index 000000000..251dc1628 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_11x11_icon_resize_se.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_down.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_down.gif new file mode 100644 index 000000000..29c6c706d Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_down.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_left.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_left.gif new file mode 100644 index 000000000..9f95efae6 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_left.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_right.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_right.gif new file mode 100644 index 000000000..bc0205073 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_right.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_up.gif b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_up.gif new file mode 100644 index 000000000..28169eb91 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/222222_7x7_arrow_up.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_arrows_leftright.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_arrows_leftright.gif new file mode 100644 index 000000000..136e6266b Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_arrows_leftright.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_arrows_updown.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_arrows_updown.gif new file mode 100644 index 000000000..4f0063520 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_arrows_updown.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_close.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_close.gif new file mode 100644 index 000000000..390a75978 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_close.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_doc.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_doc.gif new file mode 100644 index 000000000..e91c73334 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_doc.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_folder_closed.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_folder_closed.gif new file mode 100644 index 000000000..85f0e0b5c Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_folder_closed.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_folder_open.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_folder_open.gif new file mode 100644 index 000000000..f6414c778 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_folder_open.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_minus.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_minus.gif new file mode 100644 index 000000000..25b3e17c0 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_minus.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_plus.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_plus.gif new file mode 100644 index 000000000..41d953440 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_11x11_icon_plus.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_down.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_down.gif new file mode 100644 index 000000000..92fdfe0a7 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_down.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_left.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_left.gif new file mode 100644 index 000000000..cf01ff32e Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_left.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_right.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_right.gif new file mode 100644 index 000000000..3190e7a1c Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_right.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_up.gif b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_up.gif new file mode 100644 index 000000000..7ae34bfec Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/454545_7x7_arrow_up.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_arrows_leftright.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_arrows_leftright.gif new file mode 100644 index 000000000..19f9d6b21 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_arrows_leftright.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_arrows_updown.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_arrows_updown.gif new file mode 100644 index 000000000..c10451f64 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_arrows_updown.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_close.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_close.gif new file mode 100644 index 000000000..326d01533 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_close.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_doc.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_doc.gif new file mode 100644 index 000000000..7d1b5cb57 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_doc.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_folder_closed.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_folder_closed.gif new file mode 100644 index 000000000..71bff0583 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_folder_closed.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_folder_open.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_folder_open.gif new file mode 100644 index 000000000..33a20b851 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_folder_open.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_minus.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_minus.gif new file mode 100644 index 000000000..777c3288f Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_minus.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_plus.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_plus.gif new file mode 100644 index 000000000..43531fff3 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_11x11_icon_plus.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_down.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_down.gif new file mode 100644 index 000000000..c91731de5 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_down.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_left.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_left.gif new file mode 100644 index 000000000..d6c523b2b Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_left.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_right.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_right.gif new file mode 100644 index 000000000..d65b2ed1a Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_right.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_up.gif b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_up.gif new file mode 100644 index 000000000..165666af0 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/888888_7x7_arrow_up.gif differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/dadada_40x100_textures_02_glass_75.png b/fannie/src/jquery-ui/css/smoothness/images/dadada_40x100_textures_02_glass_75.png new file mode 100644 index 000000000..d98d153b3 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/dadada_40x100_textures_02_glass_75.png differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png b/fannie/src/jquery-ui/css/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png new file mode 100644 index 000000000..a8b7ba3c5 Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/ffffff_40x100_textures_01_flat_75.png b/fannie/src/jquery-ui/css/smoothness/images/ffffff_40x100_textures_01_flat_75.png new file mode 100644 index 000000000..ac8b229af Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/ffffff_40x100_textures_01_flat_75.png differ diff --git a/fannie/src/jquery-ui/css/smoothness/images/ffffff_40x100_textures_02_glass_65.png b/fannie/src/jquery-ui/css/smoothness/images/ffffff_40x100_textures_02_glass_65.png new file mode 100644 index 000000000..2c16183ff Binary files /dev/null and b/fannie/src/jquery-ui/css/smoothness/images/ffffff_40x100_textures_02_glass_65.png differ diff --git a/fannie/src/jquery-ui/css/smoothness/ui.all.css b/fannie/src/jquery-ui/css/smoothness/ui.all.css new file mode 100644 index 000000000..e327feb32 --- /dev/null +++ b/fannie/src/jquery-ui/css/smoothness/ui.all.css @@ -0,0 +1,610 @@ +/* + * jQuery UI screen structure and presentation + * This CSS file was generated by ThemeRoller, a Filament Group Project for jQuery UI + * Author: Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com + * Visit ThemeRoller.com +*/ + +/* + * Note: If your ThemeRoller settings have a font size set in ems, your components will scale according to their parent element's font size. + * As a rule of thumb, set your body's font size to 62.5% to make 1em = 10px. + * body {font-size: 62.5%;} +*/ + + + +/*UI accordion*/ +.ui-accordion { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + border-bottom: 1px solid #d3d3d3; +} +.ui-accordion-group { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + border: 1px solid #d3d3d3; + border-bottom: none; +} +.ui-accordion-header { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + cursor: pointer; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-accordion-header a { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + display: block; + font-size: 1em; + font-weight: normal; + text-decoration: none; + padding: .5em .5em .5em 1.7em; + color: #555555; + background: url(images/888888_7x7_arrow_right.gif) .5em 50% no-repeat; +} +.ui-accordion-header a:hover { + background: url(images/454545_7x7_arrow_right.gif) .5em 50% no-repeat; + color: #212121; +} +.ui-accordion-header:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + color: #212121; +} +.selected .ui-accordion-header, .selected .ui-accordion-header:hover { + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; +} +.selected .ui-accordion-header a, .selected .ui-accordion-header a:hover { + color: #212121; + background: url(images/454545_7x7_arrow_down.gif) .5em 50% no-repeat; +} +.ui-accordion-content { + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; + font-size: 1em; +} +.ui-accordion-content p { + padding: 1em 1.7em 0.6em; +} + + + + + + +/*UI tabs*/ +.ui-tabs-nav { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + float: left; + position: relative; + z-index: 1; + border-right: 1px solid #d3d3d3; + bottom: -1px; +} +.ui-tabs-nav ul { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; +} +.ui-tabs-nav li { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + float: left; + border: 1px solid #d3d3d3; + border-right: none; +} +.ui-tabs-nav li a { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + float: left; + font-size: 1em; + font-weight: normal; + text-decoration: none; + padding: .5em 1.7em; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-tabs-nav li a:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + color: #212121; +} +.ui-tabs-nav li.ui-tabs-selected { + border-bottom-color: #ffffff; +} +.ui-tabs-nav li.ui-tabs-selected a, .ui-tabs-nav li.ui-tabs-selected a:hover { + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + color: #212121; +} +.ui-tabs-panel { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + clear:left; + border: 1px solid #d3d3d3; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; + padding: 1.5em 1.7em; + font-size: 1.1em; +} +.ui-tabs-hide { + display: none;/* for accessible hiding: position: absolute; left: -99999999px*/; +} + + + + + +/*slider*/ +.ui-slider { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + border: 1px solid #aaaaaa; + height: .8em; + position: relative; +} +.ui-slider-handle { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + position: absolute; + z-index: 2; + top: -3px; + width: 1.2em; + height: 1.2em; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border: 1px solid #d3d3d3; +} +.ui-slider-handle:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border: 1px solid #999999; +} +.ui-slider-handle-active, .ui-slider-handle-active:hover { + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + border: 1px solid #aaaaaa; +} +.ui-slider-range { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + height: .8em; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + position: absolute; + border: 1px solid #d3d3d3; + border-left: 0; + border-right: 0; + top: -1px; + z-index: 1; + opacity:.7; + filter:Alpha(Opacity=70); +} + + + + + + +/*dialog*/ +.ui-dialog { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; + border: 4px solid #aaaaaa; + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + z-index: 99999; +} +.ui-resizable .ui-resizable-handle { + display: block; +} +body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */ +body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */ +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0px; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0px; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 13px; + height: 13px; + right: 0px; + bottom: 0px; + background: url(images/222222_11x11_icon_resize_se.gif) no-repeat 0 0; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: 0px; + bottom: 0px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: 0px; + top: 0px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: 0px; + top: 0px; +} +.ui-dialog-titlebar { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + padding: .5em 1.5em .5em 1em; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border-bottom: 1px solid #d3d3d3; + font-size: 1em; + font-weight: normal; + position: relative; +} +.ui-dialog-title {} +.ui-dialog-titlebar-close { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + background: url(images/888888_11x11_icon_close.gif) 0 0 no-repeat; + position: absolute; + right: 8px; + top: .7em; + width: 11px; + height: 11px; + z-index: 100; +} +.ui-dialog-titlebar-close-hover, .ui-dialog-titlebar-close:hover { + background: url(images/454545_11x11_icon_close.gif) 0 0 no-repeat; +} +.ui-dialog-titlebar-close:active { + background: url(images/454545_11x11_icon_close.gif) 0 0 no-repeat; +} +.ui-dialog-titlebar-close span { + display: none; +} +.ui-dialog-content { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + color: #222222; + padding: 1.5em 1.7em; +} +.ui-dialog-buttonpane { + position: absolute; + bottom: 0; + width: 100%; + text-align: left; + border-top: 1px solid #aaaaaa; + background: #ffffff; +} +.ui-dialog-buttonpane button { + margin: .5em 0 .5em 8px; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + font-size: 1em; + border: 1px solid #d3d3d3; + cursor: pointer; + padding: .2em .6em .3em .6em; + line-height: 1.4em; +} +.ui-dialog-buttonpane button:hover { + color: #212121; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border: 1px solid #999999; +} +.ui-dialog-buttonpane button:active { + color: #212121; + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + border: 1px solid #aaaaaa; +} +/* This file skins dialog */ +.ui-dialog.ui-draggable .ui-dialog-titlebar, +.ui-dialog.ui-draggable .ui-dialog-titlebar { + cursor: move; +} + + + + + + + +/*datepicker*/ +/* Main Style Sheet for jQuery UI date picker */ +.ui-datepicker-div, .ui-datepicker-inline, #ui-datepicker-div { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + font-size: 1.1em; + border: 4px solid #aaaaaa; + width: 15.5em; + padding: 2.5em .5em .5em .5em; + position: relative; +} +.ui-datepicker-div, #ui-datepicker-div { + z-index: 9999; /*must have*/ + display: none; +} +.ui-datepicker-inline { + float: left; + display: block; +} +.ui-datepicker-control { + display: none; +} +.ui-datepicker-current { + display: none; +} +.ui-datepicker-next, .ui-datepicker-prev { + position: absolute; + left: .5em; + top: .5em; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-datepicker-next { + left: 14.6em; +} +.ui-datepicker-next:hover, .ui-datepicker-prev:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-datepicker-next a, .ui-datepicker-prev a { + text-indent: -999999px; + width: 1.3em; + height: 1.4em; + display: block; + font-size: 1em; + background: url(images/888888_7x7_arrow_left.gif) 50% 50% no-repeat; + border: 1px solid #d3d3d3; + cursor: pointer; +} +.ui-datepicker-next a { + background: url(images/888888_7x7_arrow_right.gif) 50% 50% no-repeat; +} +.ui-datepicker-prev a:hover { + background: url(images/454545_7x7_arrow_left.gif) 50% 50% no-repeat; +} +.ui-datepicker-next a:hover { + background: url(images/454545_7x7_arrow_right.gif) 50% 50% no-repeat; +} +.ui-datepicker-prev a:active { + background: url(images/454545_7x7_arrow_left.gif) 50% 50% no-repeat; +} +.ui-datepicker-next a:active { + background: url(images/454545_7x7_arrow_right.gif) 50% 50% no-repeat; +} +.ui-datepicker-header select { + border: 1px solid #d3d3d3; + color: #555555; + background: #e6e6e6; + font-size: 1em; + line-height: 1.4em; + position: absolute; + top: .5em; + margin: 0 !important; +} +.ui-datepicker-header option:focus, .ui-datepicker-header option:hover { + background: #dadada; +} +.ui-datepicker-header select.ui-datepicker-new-month { + width: 7em; + left: 2.2em; +} +.ui-datepicker-header select.ui-datepicker-new-year { + width: 5em; + left: 9.4em; +} +table.ui-datepicker { + width: 15.5em; + text-align: right; +} +table.ui-datepicker td a { + padding: .1em .3em .1em 0; + display: block; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + cursor: pointer; + border: 1px solid #ffffff; +} +table.ui-datepicker td a:hover { + border: 1px solid #999999; + color: #212121; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +table.ui-datepicker td a:active { + border: 1px solid #aaaaaa; + color: #212121; + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; +} +table.ui-datepicker .ui-datepicker-title-row td { + padding: .3em 0; + text-align: center; + font-size: .9em; + color: #222222; + text-transform: uppercase; +} +table.ui-datepicker .ui-datepicker-title-row td a { + color: #222222; +} +.ui-datepicker-cover { + display: none; + display/**/: block; + position: absolute; + z-index: -1; + filter: mask(); + top: -4px; + left: -4px; + width: 193px; + height: 200px; +} + + + + + + + + + + + + + + +/* +Generic ThemeRoller Classes +>> Make your jQuery Components ThemeRoller-Compatible! +*/ + +/*component global class*/ +.ui-component { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +/*component content styles*/ +.ui-component-content { + border: 1px solid #aaaaaa; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; +} +.ui-component-content a { + color: #222222; + text-decoration: underline; +} +/*component states*/ +.ui-default-state { + border: 1px solid #d3d3d3; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + font-weight: normal; + color: #555555 !important; +} +.ui-default-state a { + color: #555555; +} +.ui-default-state:hover, .ui-hover-state { + border: 1px solid #999999; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + font-weight: normal; + color: #212121 !important; +} +.ui-hover-state a { + color: #212121; +} +.ui-default-state:active, .ui-active-state { + border: 1px solid #aaaaaa; + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + font-weight: normal; + color: #212121 !important; + outline: none; +} +.ui-active-state a { + color: #212121; + outline: none; +} +/*icons*/ +.ui-arrow-right-default {background: url(images/888888_7x7_arrow_right.gif) no-repeat 50% 50%;} +.ui-arrow-right-default:hover, .ui-arrow-right-hover {background: url(images/454545_7x7_arrow_right.gif) no-repeat 50% 50%;} +.ui-arrow-right-default:active, .ui-arrow-right-active {background: url(images/454545_7x7_arrow_right.gif) no-repeat 50% 50%;} +.ui-arrow-right-content {background: url(images/222222_7x7_arrow_right.gif) no-repeat 50% 50%;} + +.ui-arrow-left-default {background: url(images/888888_7x7_arrow_left.gif) no-repeat 50% 50%;} +.ui-arrow-left-default:hover, .ui-arrow-left-hover {background: url(images/454545_7x7_arrow_left.gif) no-repeat 50% 50%;} +.ui-arrow-left-default:active, .ui-arrow-left-active {background: url(images/454545_7x7_arrow_left.gif) no-repeat 50% 50%;} +.ui-arrow-left-content {background: url(images/222222_7x7_arrow_left.gif) no-repeat 50% 50%;} + +.ui-arrow-down-default {background: url(images/888888_7x7_arrow_down.gif) no-repeat 50% 50%;} +.ui-arrow-down-default:hover, .ui-arrow-down-hover {background: url(images/454545_7x7_arrow_down.gif) no-repeat 50% 50%;} +.ui-arrow-down-default:active, .ui-arrow-down-active {background: url(images/454545_7x7_arrow_down.gif) no-repeat 50% 50%;} +.ui-arrow-down-content {background: url(images/222222_7x7_arrow_down.gif) no-repeat 50% 50%;} + +.ui-arrow-up-default {background: url(images/888888_7x7_arrow_up.gif) no-repeat 50% 50%;} +.ui-arrow-up-default:hover, .ui-arrow-up-hover {background: url(images/454545_7x7_arrow_up.gif) no-repeat 50% 50%;} +.ui-arrow-up-default:active, .ui-arrow-up-active {background: url(images/454545_7x7_arrow_up.gif) no-repeat 50% 50%;} +.ui-arrow-up-content {background: url(images/222222_7x7_arrow_up.gif) no-repeat 50% 50%;} + +.ui-close-default {background: url(images/888888_11x11_icon_close.gif) no-repeat 50% 50%;} +.ui-close-default:hover, .ui-close-hover {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;} +.ui-close-default:active, .ui-close-active {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;} +.ui-close-content {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;} + +.ui-folder-closed-default {background: url(images/888888_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} +.ui-folder-closed-default:hover, .ui-folder-closed-hover {background: url(images/454545_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} +.ui-folder-closed-default:active, .ui-folder-closed-active {background: url(images/454545_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} +.ui-folder-closed-content {background: url(images/888888_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} + +.ui-folder-open-default {background: url(images/888888_11x11_icon_folder_open.gif) no-repeat 50% 50%;} +.ui-folder-open-default:hover, .ui-folder-open-hover {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;} +.ui-folder-open-default:active, .ui-folder-open-active {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;} +.ui-folder-open-content {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;} + +.ui-doc-default {background: url(images/888888_11x11_icon_doc.gif) no-repeat 50% 50%;} +.ui-doc-default:hover, .ui-doc-hover {background: url(images/454545_11x11_icon_doc.gif) no-repeat 50% 50%;} +.ui-doc-default:active, .ui-doc-active {background: url(images/454545_11x11_icon_doc.gif) no-repeat 50% 50%;} +.ui-doc-content {background: url(images/222222_11x11_icon_doc.gif) no-repeat 50% 50%;} + +.ui-arrows-leftright-default {background: url(images/888888_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} +.ui-arrows-leftright-default:hover, .ui-arrows-leftright-hover {background: url(images/454545_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} +.ui-arrows-leftright-default:active, .ui-arrows-leftright-active {background: url(images/454545_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} +.ui-arrows-leftright-content {background: url(images/222222_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} + +.ui-arrows-updown-default {background: url(images/888888_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} +.ui-arrows-updown-default:hover, .ui-arrows-updown-hover {background: url(images/454545_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} +.ui-arrows-updown-default:active, .ui-arrows-updown-active {background: url(images/454545_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} +.ui-arrows-updown-content {background: url(images/222222_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} + +.ui-minus-default {background: url(images/888888_11x11_icon_minus.gif) no-repeat 50% 50%;} +.ui-minus-default:hover, .ui-minus-hover {background: url(images/454545_11x11_icon_minus.gif) no-repeat 50% 50%;} +.ui-minus-default:active, .ui-minus-active {background: url(images/454545_11x11_icon_minus.gif) no-repeat 50% 50%;} +.ui-minus-content {background: url(images/222222_11x11_icon_minus.gif) no-repeat 50% 50%;} + +.ui-plus-default {background: url(images/888888_11x11_icon_plus.gif) no-repeat 50% 50%;} +.ui-plus-default:hover, .ui-plus-hover {background: url(images/454545_11x11_icon_plus.gif) no-repeat 50% 50%;} +.ui-plus-default:active, .ui-plus-active {background: url(images/454545_11x11_icon_plus.gif) no-repeat 50% 50%;} +.ui-plus-content {background: url(images/222222_11x11_icon_plus.gif) no-repeat 50% 50%;} + +/*hidden elements*/ +.ui-hidden { + display: none;/* for accessible hiding: position: absolute; left: -99999999px*/; +} +.ui-accessible-hidden { + position: absolute; left: -99999999px; +} +/*reset styles*/ +.ui-reset { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; +} +/*clearfix class*/ +.ui-clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +.ui-clearfix {display: inline-block;} +/* Hides from IE-mac \*/ +* html .ui-clearfix {height: 1%;} +.ui-clearfix {display: block;} +/* End hide from IE-mac */ + +/* Note: for resizable styles, use the styles listed above in the dialog section */ + + diff --git a/fannie/src/jquery-ui/development-bundle/GPL-LICENSE.txt b/fannie/src/jquery-ui/development-bundle/GPL-LICENSE.txt new file mode 100644 index 000000000..11dddd00e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/GPL-LICENSE.txt @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, 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. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/fannie/src/jquery-ui/development-bundle/MIT-LICENSE.txt b/fannie/src/jquery-ui/development-bundle/MIT-LICENSE.txt new file mode 100644 index 000000000..965a83130 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2007 John Resig, http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/fannie/src/jquery-ui/development-bundle/jquery-1.2.6.js b/fannie/src/jquery-ui/development-bundle/jquery-1.2.6.js new file mode 100644 index 000000000..88e661eec --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/jquery-1.2.6.js @@ -0,0 +1,3549 @@ +(function(){ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ + +// Map over jQuery in case of overwrite +var _jQuery = window.jQuery, +// Map over the $ in case of overwrite + _$ = window.$; + +var jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); +}; + +// A simple way to check for HTML strings or ID strings +// (both of which we optimize for) +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, + +// Is it a simple selector + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + return this; + } + // Handle HTML strings + if ( typeof selector == "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Make sure an element was located + if ( elem ){ + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + return jQuery( elem ); + } + selector = []; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); + + return this.setArray(jQuery.makeArray(selector)); + }, + + // The current version of jQuery being used + jquery: "1.2.6", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // The number of elements contained in the matched element set + length: 0, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + var ret = -1; + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( name.constructor == String ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text != "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) + // The elements to wrap the target around + jQuery( html, this[0].ownerDocument ) + .clone() + .insertBefore( this[0] ) + .map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }) + .append(this); + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, false, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, true, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + find: function( selector ) { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? + jQuery.unique( elems ) : + elems ); + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] != undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, this ) ); + }, + + not: function( selector ) { + if ( selector.constructor == String ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector == 'string' ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return this.is( "." + selector ); + }, + + val: function( value ) { + if ( value == undefined ) { + + if ( this.length ) { + var elem = this[0]; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + + // Everything else, we just grab the value + } else + return (this[0].value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if( value.constructor == Number ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value == undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + + domManip: function( args, table, reverse, callback ) { + var clone = this.length > 1, elems; + + return this.each(function(){ + if ( !elems ) { + elems = jQuery.clean( args, this.ownerDocument ); + + if ( reverse ) + elems.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); + + var scripts = jQuery( [] ); + + jQuery.each(elems, function(){ + var elem = clone ? + jQuery( this ).clone( true )[0] : + this; + + // execute all scripts after the elements have been injected + if ( jQuery.nodeName( elem, "script" ) ) + scripts = scripts.add( elem ); + else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document + callback.call( obj, elem ); + } + }); + + scripts.each( evalScript ); + }); + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target != "object" && typeof target != "function" ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy == "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +var expando = "jQuery" + now(), uuid = 0, windowData = {}, + // exclude the following css properties to add px + exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning this function. + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.browser.msie ) + script.text = data; + else + script.appendChild( document.createTextNode( data ) ); + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length == undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length == undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames != undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // A helper method for determining if an element's values are broken + function color( elem ) { + if ( !jQuery.browser.safari ) + return false; + + // defaultView is cached + var ret = defaultView.getComputedStyle( elem, null ); + return !ret || ret.getPropertyValue("color") == ""; + } + + // We need to handle opacity special in IE + if ( name == "opacity" && jQuery.browser.msie ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + // Opera sometimes will give the wrong display answer, this fixes it, see #2037 + if ( jQuery.browser.opera && name == "display" ) { + var save = style.outline; + style.outline = "0 solid black"; + style.outline = save; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + var swap = [], stack = [], a = elem, i = 0; + + // Locate all of the parent display: none elements + for ( ; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( ; i < stack.length; i++ ) + if ( color( stack[ i ] ) ) { + swap[ i ] = stack[ i ].style.display; + stack[ i ].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = name == "display" && swap[ stack.length - 1 ] != null ? + "none" : + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; + + // Finally, revert the display styles back + for ( i = 0; i < swap.length; i++ ) + if ( swap[ i ] != null ) + stack[ i ].style.display = swap[ i ]; + } + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context ) { + var ret = []; + context = context || document; + // !context.createElement fails in IE with an error but returns typeof 'object' + if (typeof context.createElement == 'undefined') + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + jQuery.each(elems, function(i, elem){ + if ( !elem ) + return; + + if ( elem.constructor == Number ) + elem += ''; + + // Convert html string into DOM nodes + if ( typeof elem == "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + "></" + tag + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); + + var wrap = + // option or optgroup + !tags.indexOf("<opt") && + [ 1, "<select multiple='multiple'>", "</select>" ] || + + !tags.indexOf("<leg") && + [ 1, "<fieldset>", "</fieldset>" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "<table>", "</table>" ] || + + !tags.indexOf("<tr") && + [ 2, "<table><tbody>", "</tbody></table>" ] || + + // <thead> matched above + (!tags.indexOf("<td") || !tags.indexOf("<th")) && + [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || + + !tags.indexOf("<col") && + [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || + + // IE can't serialize <link> and <script> tags normally + jQuery.browser.msie && + [ 1, "div<div>", "</div>" ] || + + [ 0, "", "" ]; + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( wrap[0]-- ) + div = div.lastChild; + + // Remove IE's autoinserted <tbody> from table fragments + if ( jQuery.browser.msie ) { + + // String was a <table>, *may* have spurious <tbody> + var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ? + div.childNodes : + []; + + for ( var j = tbody.length - 1; j >= 0 ; --j ) + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + + // IE completely kills leading whitespace when innerHTML is used + if ( /^\s/.test( elem ) ) + div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); + + } + + elem = jQuery.makeArray( div.childNodes ); + } + + if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) ) + return; + + if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options ) + ret.push( elem ); + + else + ret = jQuery.merge( ret, elem ); + + }); + + return ret; + }, + + attr: function( elem, name, value ) { + // don't set attributes on text and comment nodes + if (!elem || elem.nodeType == 3 || elem.nodeType == 8) + return undefined; + + var notxml = !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined, + msie = jQuery.browser.msie; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + // IE elem.getAttribute passes even for style + if ( elem.tagName ) { + + // These attributes require special treatment + var special = /href|src|style/.test( name ); + + // Safari mis-reports the default selected property of a hidden option + // Accessing the parent's selectedIndex property fixes it + if ( name == "selected" && jQuery.browser.safari ) + elem.parentNode.selectedIndex; + + // If applicable, access the attribute via the DOM 0 way + if ( name in elem && notxml && !special ) { + if ( set ){ + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) + throw "type property can't be changed"; + + elem[ name ] = value; + } + + // browsers index elements by id/name on forms, give priority to attributes. + if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) + return elem.getAttributeNode( name ).nodeValue; + + return elem[ name ]; + } + + if ( msie && notxml && name == "style" ) + return jQuery.attr( elem.style, "cssText", value ); + + if ( set ) + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + + var attr = msie && notxml && special + // Some attributes require a special call on IE + ? elem.getAttribute( name, 2 ) + : elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + + // elem is actually elem.style ... set the style + + // IE uses filters for opacity + if ( msie && name == "opacity" ) { + if ( set ) { + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + elem.zoom = 1; + + // Set the alpha filter to set the opacity + elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + + (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); + } + + return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? + (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': + ""; + } + + name = name.replace(/-([a-z])/ig, function(all, letter){ + return letter.toUpperCase(); + }); + + if ( set ) + elem[ name ] = value; + + return elem[ name ]; + }, + + trim: function( text ) { + return (text || "").replace( /^\s+|\s+$/g, "" ); + }, + + makeArray: function( array ) { + var ret = []; + + if( array != null ){ + var i = array.length; + //the window, strings and functions also have 'length' + if( i == null || array.split || array.setInterval || array.call ) + ret[0] = array; + else + while( i ) + ret[--i] = array[i]; + } + + return ret; + }, + + inArray: function( elem, array ) { + for ( var i = 0, length = array.length; i < length; i++ ) + // Use === because on IE, window == document + if ( array[ i ] === elem ) + return i; + + return -1; + }, + + merge: function( first, second ) { + // We have to loop this way because IE & Opera overwrite the length + // expando of getElementsByTagName + var i = 0, elem, pos = first.length; + // Also, we need to make sure that the correct elements are being returned + // (IE returns comment nodes in a '*' query) + if ( jQuery.browser.msie ) { + while ( elem = second[ i++ ] ) + if ( elem.nodeType != 8 ) + first[ pos++ ] = elem; + + } else + while ( elem = second[ i++ ] ) + first[ pos++ ] = elem; + + return first; + }, + + unique: function( array ) { + var ret = [], done = {}; + + try { + + for ( var i = 0, length = array.length; i < length; i++ ) { + var id = jQuery.data( array[ i ] ); + + if ( !done[ id ] ) { + done[ id ] = true; + ret.push( array[ i ] ); + } + } + + } catch( e ) { + ret = array; + } + + return ret; + }, + + grep: function( elems, callback, inv ) { + var ret = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) + if ( !inv != !callback( elems[ i ], i ) ) + ret.push( elems[ i ] ); + + return ret; + }, + + map: function( elems, callback ) { + var ret = []; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + var value = callback( elems[ i ], i ); + + if ( value != null ) + ret[ ret.length ] = value; + } + + return ret.concat.apply( [], ret ); + } +}); + +var userAgent = navigator.userAgent.toLowerCase(); + +// Figure out what browser is being used +jQuery.browser = { + version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1], + safari: /webkit/.test( userAgent ), + opera: /opera/.test( userAgent ), + msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), + mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) +}; + +var styleFloat = jQuery.browser.msie ? + "styleFloat" : + "cssFloat"; + +jQuery.extend({ + // Check to see if the W3C box model is being used + boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat", + + props: { + "for": "htmlFor", + "class": "className", + "float": styleFloat, + cssFloat: styleFloat, + styleFloat: styleFloat, + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing" + } +}); + +jQuery.each({ + parent: function(elem){return elem.parentNode;}, + parents: function(elem){return jQuery.dir(elem,"parentNode");}, + next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, + prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, + nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, + prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, + siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, + children: function(elem){return jQuery.sibling(elem.firstChild);}, + contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} +}, function(name, fn){ + jQuery.fn[ name ] = function( selector ) { + var ret = jQuery.map( this, fn ); + + if ( selector && typeof selector == "string" ) + ret = jQuery.multiFilter( selector, ret ); + + return this.pushStack( jQuery.unique( ret ) ); + }; +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function(name, original){ + jQuery.fn[ name ] = function() { + var args = arguments; + + return this.each(function(){ + for ( var i = 0, length = args.length; i < length; i++ ) + jQuery( args[ i ] )[ original ]( this ); + }); + }; +}); + +jQuery.each({ + removeAttr: function( name ) { + jQuery.attr( this, name, "" ); + if (this.nodeType == 1) + this.removeAttribute( name ); + }, + + addClass: function( classNames ) { + jQuery.className.add( this, classNames ); + }, + + removeClass: function( classNames ) { + jQuery.className.remove( this, classNames ); + }, + + toggleClass: function( classNames ) { + jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames ); + }, + + remove: function( selector ) { + if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) { + // Prevent memory leaks + jQuery( "*", this ).add(this).each(function(){ + jQuery.event.remove(this); + jQuery.removeData(this); + }); + if (this.parentNode) + this.parentNode.removeChild( this ); + } + }, + + empty: function() { + // Remove element nodes and prevent memory leaks + jQuery( ">*", this ).remove(); + + // Remove any remaining nodes + while ( this.firstChild ) + this.removeChild( this.firstChild ); + } +}, function(name, fn){ + jQuery.fn[ name ] = function(){ + return this.each( fn, arguments ); + }; +}); + +jQuery.each([ "Height", "Width" ], function(i, name){ + var type = name.toLowerCase(); + + jQuery.fn[ type ] = function( size ) { + // Get window width or height + return this[0] == window ? + // Opera reports document.body.client[Width/Height] properly in both quirks and standards + jQuery.browser.opera && document.body[ "client" + name ] || + + // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths) + jQuery.browser.safari && window[ "inner" + name ] || + + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode + document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] : + + // Get document width or height + this[0] == document ? + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + Math.max( + Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]), + Math.max(document.body["offset" + name], document.documentElement["offset" + name]) + ) : + + // Get or set width or height on the element + size == undefined ? + // Get width or height on the element + (this.length ? jQuery.css( this[0], type ) : null) : + + // Set the width or height on the element (default to pixels if value is unitless) + this.css( type, size.constructor == String ? size : size + "px" ); + }; +}); + +// Helper function used by the dimensions and offset modules +function num(elem, prop) { + return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; +}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? + "(?:[\\w*_-]|\\\\.)" : + "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", + quickChild = new RegExp("^>\\s*(" + chars + "+)"), + quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), + quickClass = new RegExp("^([#.]?)(" + chars + "*)"); + +jQuery.extend({ + expr: { + "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);}, + "#": function(a,i,m){return a.getAttribute("id")==m[2];}, + ":": { + // Position Checks + lt: function(a,i,m){return i<m[3]-0;}, + gt: function(a,i,m){return i>m[3]-0;}, + nth: function(a,i,m){return m[3]-0==i;}, + eq: function(a,i,m){return m[3]-0==i;}, + first: function(a,i){return i==0;}, + last: function(a,i,m,r){return i==r.length-1;}, + even: function(a,i){return i%2==0;}, + odd: function(a,i){return i%2;}, + + // Child Checks + "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;}, + "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;}, + "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");}, + + // Parent Checks + parent: function(a){return a.firstChild;}, + empty: function(a){return !a.firstChild;}, + + // Text Check + contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;}, + + // Visibility + visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";}, + hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";}, + + // Form attributes + enabled: function(a){return !a.disabled;}, + disabled: function(a){return a.disabled;}, + checked: function(a){return a.checked;}, + selected: function(a){return a.selected||jQuery.attr(a,"selected");}, + + // Form elements + text: function(a){return "text"==a.type;}, + radio: function(a){return "radio"==a.type;}, + checkbox: function(a){return "checkbox"==a.type;}, + file: function(a){return "file"==a.type;}, + password: function(a){return "password"==a.type;}, + submit: function(a){return "submit"==a.type;}, + image: function(a){return "image"==a.type;}, + reset: function(a){return "reset"==a.type;}, + button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");}, + input: function(a){return /input|select|textarea|button/i.test(a.nodeName);}, + + // :has() + has: function(a,i,m){return jQuery.find(m[3],a).length;}, + + // :header + header: function(a){return /h\d/i.test(a.nodeName);}, + + // :animated + animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;} + } + }, + + // The regular expressions that power the parsing engine + parse: [ + // Match: [@value='test'], [@foo] + /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, + + // Match: :contains('foo') + /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, + + // Match: :even, :last-child, #id, .class + new RegExp("^([:.#]*)(" + chars + "+)") + ], + + multiFilter: function( expr, elems, not ) { + var old, cur = []; + + while ( expr && expr != old ) { + old = expr; + var f = jQuery.filter( expr, elems, not ); + expr = f.t.replace(/^\s*,\s*/, "" ); + cur = not ? elems = f.r : jQuery.merge( cur, f.r ); + } + + return cur; + }, + + find: function( t, context ) { + // Quickly handle non-string expressions + if ( typeof t != "string" ) + return [ t ]; + + // check to make sure context is a DOM element or a document + if ( context && context.nodeType != 1 && context.nodeType != 9) + return [ ]; + + // Set the correct context (if none is provided) + context = context || document; + + // Initialize the search + var ret = [context], done = [], last, nodeName; + + // Continue while a selector expression exists, and while + // we're no longer looping upon ourselves + while ( t && last != t ) { + var r = []; + last = t; + + t = jQuery.trim(t); + + var foundToken = false, + + // An attempt at speeding up child selectors that + // point to a specific element tag + re = quickChild, + + m = re.exec(t); + + if ( m ) { + nodeName = m[1].toUpperCase(); + + // Perform our own iteration and filter + for ( var i = 0; ret[i]; i++ ) + for ( var c = ret[i].firstChild; c; c = c.nextSibling ) + if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) ) + r.push( c ); + + ret = r; + t = t.replace( re, "" ); + if ( t.indexOf(" ") == 0 ) continue; + foundToken = true; + } else { + re = /^([>+~])\s*(\w*)/i; + + if ( (m = re.exec(t)) != null ) { + r = []; + + var merge = {}; + nodeName = m[2].toUpperCase(); + m = m[1]; + + for ( var j = 0, rl = ret.length; j < rl; j++ ) { + var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild; + for ( ; n; n = n.nextSibling ) + if ( n.nodeType == 1 ) { + var id = jQuery.data(n); + + if ( m == "~" && merge[id] ) break; + + if (!nodeName || n.nodeName.toUpperCase() == nodeName ) { + if ( m == "~" ) merge[id] = true; + r.push( n ); + } + + if ( m == "+" ) break; + } + } + + ret = r; + + // And remove the token + t = jQuery.trim( t.replace( re, "" ) ); + foundToken = true; + } + } + + // See if there's still an expression, and that we haven't already + // matched a token + if ( t && !foundToken ) { + // Handle multiple expressions + if ( !t.indexOf(",") ) { + // Clean the result set + if ( context == ret[0] ) ret.shift(); + + // Merge the result sets + done = jQuery.merge( done, ret ); + + // Reset the context + r = ret = [context]; + + // Touch up the selector string + t = " " + t.substr(1,t.length); + + } else { + // Optimize for the case nodeName#idName + var re2 = quickID; + var m = re2.exec(t); + + // Re-organize the results, so that they're consistent + if ( m ) { + m = [ 0, m[2], m[3], m[1] ]; + + } else { + // Otherwise, do a traditional filter check for + // ID, class, and element selectors + re2 = quickClass; + m = re2.exec(t); + } + + m[2] = m[2].replace(/\\/g, ""); + + var elem = ret[ret.length-1]; + + // Try to do a global search by ID, where we can + if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { + // Optimization for HTML document case + var oid = elem.getElementById(m[2]); + + // Do a quick check for the existence of the actual ID attribute + // to avoid selecting by the name attribute in IE + // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form + if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] ) + oid = jQuery('[@id="'+m[2]+'"]', elem)[0]; + + // Do a quick check for node name (where applicable) so + // that div#foo searches will be really fast + ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; + } else { + // We need to find all descendant elements + for ( var i = 0; ret[i]; i++ ) { + // Grab the tag name being searched for + var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2]; + + // Handle IE7 being really dumb about <object>s + if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) + tag = "param"; + + r = jQuery.merge( r, ret[i].getElementsByTagName( tag )); + } + + // It's faster to filter by class and be done with it + if ( m[1] == "." ) + r = jQuery.classFilter( r, m[2] ); + + // Same with ID filtering + if ( m[1] == "#" ) { + var tmp = []; + + // Try to find the element with the ID + for ( var i = 0; r[i]; i++ ) + if ( r[i].getAttribute("id") == m[2] ) { + tmp = [ r[i] ]; + break; + } + + r = tmp; + } + + ret = r; + } + + t = t.replace( re2, "" ); + } + + } + + // If a selector string still exists + if ( t ) { + // Attempt to filter it + var val = jQuery.filter(t,r); + ret = r = val.r; + t = jQuery.trim(val.t); + } + } + + // An error occurred with the selector; + // just return an empty set instead + if ( t ) + ret = []; + + // Remove the root context + if ( ret && context == ret[0] ) + ret.shift(); + + // And combine the results + done = jQuery.merge( done, ret ); + + return done; + }, + + classFilter: function(r,m,not){ + m = " " + m + " "; + var tmp = []; + for ( var i = 0; r[i]; i++ ) { + var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; + if ( !not && pass || not && !pass ) + tmp.push( r[i] ); + } + return tmp; + }, + + filter: function(t,r,not) { + var last; + + // Look for common filter expressions + while ( t && t != last ) { + last = t; + + var p = jQuery.parse, m; + + for ( var i = 0; p[i]; i++ ) { + m = p[i].exec( t ); + + if ( m ) { + // Remove what we just matched + t = t.substring( m[0].length ); + + m[2] = m[2].replace(/\\/g, ""); + break; + } + } + + if ( !m ) + break; + + // :not() is a special case that can be optimized by + // keeping it out of the expression list + if ( m[1] == ":" && m[2] == "not" ) + // optimize if only one selector found (most common case) + r = isSimple.test( m[3] ) ? + jQuery.filter(m[3], r, true).r : + jQuery( r ).not( m[3] ); + + // We can get a big speed boost by filtering by class here + else if ( m[1] == "." ) + r = jQuery.classFilter(r, m[2], not); + + else if ( m[1] == "[" ) { + var tmp = [], type = m[3]; + + for ( var i = 0, rl = r.length; i < rl; i++ ) { + var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; + + if ( z == null || /href|src|selected/.test(m[2]) ) + z = jQuery.attr(a,m[2]) || ''; + + if ( (type == "" && !!z || + type == "=" && z == m[5] || + type == "!=" && z != m[5] || + type == "^=" && z && !z.indexOf(m[5]) || + type == "$=" && z.substr(z.length - m[5].length) == m[5] || + (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not ) + tmp.push( a ); + } + + r = tmp; + + // We can get a speed boost by handling nth-child here + } else if ( m[1] == ":" && m[2] == "nth-child" ) { + var merge = {}, tmp = [], + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || + !/\D/.test(m[3]) && "0n+" + m[3] || m[3]), + // calculate the numbers (first)n+(last) including if they are negative + first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0; + + // loop through all the elements left in the jQuery object + for ( var i = 0, rl = r.length; i < rl; i++ ) { + var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode); + + if ( !merge[id] ) { + var c = 1; + + for ( var n = parentNode.firstChild; n; n = n.nextSibling ) + if ( n.nodeType == 1 ) + n.nodeIndex = c++; + + merge[id] = true; + } + + var add = false; + + if ( first == 0 ) { + if ( node.nodeIndex == last ) + add = true; + } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 ) + add = true; + + if ( add ^ not ) + tmp.push( node ); + } + + r = tmp; + + // Otherwise, find the expression to execute + } else { + var fn = jQuery.expr[ m[1] ]; + if ( typeof fn == "object" ) + fn = fn[ m[2] ]; + + if ( typeof fn == "string" ) + fn = eval("false||function(a,i){return " + fn + ";}"); + + // Execute it against the current filter + r = jQuery.grep( r, function(elem, i){ + return fn(elem, i, m, r); + }, not ); + } + } + + // Return an array of filtered elements (r) + // and the modified expression string (t) + return { r: r, t: t }; + }, + + dir: function( elem, dir ){ + var matched = [], + cur = elem[dir]; + while ( cur && cur != document ) { + if ( cur.nodeType == 1 ) + matched.push( cur ); + cur = cur[dir]; + } + return matched; + }, + + nth: function(cur,result,dir,elem){ + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) + if ( cur.nodeType == 1 && ++num == result ) + break; + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType == 1 && n != elem ) + r.push( n ); + } + + return r; + } +}); +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code orignated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function(elem, types, handler, data) { + if ( elem.nodeType == 3 || elem.nodeType == 8 ) + return; + + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.browser.msie && elem.setInterval ) + elem = window; + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) + handler.guid = this.guid++; + + // if data is passed, bind to handler + if( data != undefined ) { + // Create temporary function pointer to original handler + var fn = handler; + + // Create unique handler function, wrapped around original handler + handler = this.proxy( fn, function() { + // Pass arguments and context to original handler + return fn.apply(this, arguments); + }); + + // Store data in unique handler + handler.data = data; + } + + // Init the element's event structure + var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), + handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + if ( typeof jQuery != "undefined" && !jQuery.event.triggered ) + return jQuery.event.handle.apply(arguments.callee.elem, arguments); + }); + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native + // event in IE. + handle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + jQuery.each(types.split(/\s+/), function(index, type) { + // Namespaced event handlers + var parts = type.split("."); + type = parts[0]; + handler.type = parts[1]; + + // Get the current list of functions bound to this event + var handlers = events[type]; + + // Init the event handler queue + if (!handlers) { + handlers = events[type] = {}; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) { + // Bind the global event handler to the element + if (elem.addEventListener) + elem.addEventListener(type, handle, false); + else if (elem.attachEvent) + elem.attachEvent("on" + type, handle); + } + } + + // Add the function to the element's handler list + handlers[handler.guid] = handler; + + // Keep track of which events have been used, for global triggering + jQuery.event.global[type] = true; + }); + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + guid: 1, + global: {}, + + // Detach an event or set of events from an element + remove: function(elem, types, handler) { + // don't do events on text and comment nodes + if ( elem.nodeType == 3 || elem.nodeType == 8 ) + return; + + var events = jQuery.data(elem, "events"), ret, index; + + if ( events ) { + // Unbind all events for the element + if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") ) + for ( var type in events ) + this.remove( elem, type + (types || "") ); + else { + // types is actually an event object here + if ( types.type ) { + handler = types.handler; + types = types.type; + } + + // Handle multiple events seperated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + jQuery.each(types.split(/\s+/), function(index, type){ + // Namespaced event handlers + var parts = type.split("."); + type = parts[0]; + + if ( events[type] ) { + // remove the given handler for the given type + if ( handler ) + delete events[type][handler.guid]; + + // remove all handlers for the given type + else + for ( handler in events[type] ) + // Handle the removal of namespaced events + if ( !parts[1] || events[type][handler].type == parts[1] ) + delete events[type][handler]; + + // remove generic event handler if no more handlers exist + for ( ret in events[type] ) break; + if ( !ret ) { + if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) { + if (elem.removeEventListener) + elem.removeEventListener(type, jQuery.data(elem, "handle"), false); + else if (elem.detachEvent) + elem.detachEvent("on" + type, jQuery.data(elem, "handle")); + } + ret = null; + delete events[type]; + } + } + }); + } + + // Remove the expando if it's no longer used + for ( ret in events ) break; + if ( !ret ) { + var handle = jQuery.data( elem, "handle" ); + if ( handle ) handle.elem = null; + jQuery.removeData( elem, "events" ); + jQuery.removeData( elem, "handle" ); + } + } + }, + + trigger: function(type, data, elem, donative, extra) { + // Clone the incoming data, if any + data = jQuery.makeArray(data); + + if ( type.indexOf("!") >= 0 ) { + type = type.slice(0, -1); + var exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Only trigger if we've ever bound an event for it + if ( this.global[type] ) + jQuery("*").add([window, document]).trigger(type, data); + + // Handle triggering a single element + } else { + // don't do events on text and comment nodes + if ( elem.nodeType == 3 || elem.nodeType == 8 ) + return undefined; + + var val, ret, fn = jQuery.isFunction( elem[ type ] || null ), + // Check to see if we need to provide a fake event, or not + event = !data[0] || !data[0].preventDefault; + + // Pass along a fake event + if ( event ) { + data.unshift({ + type: type, + target: elem, + preventDefault: function(){}, + stopPropagation: function(){}, + timeStamp: now() + }); + data[0][expando] = true; // no need to fix fake event + } + + // Enforce the right trigger type + data[0].type = type; + if ( exclusive ) + data[0].exclusive = true; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery.data(elem, "handle"); + if ( handle ) + val = handle.apply( elem, data ); + + // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) + if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) + val = false; + + // Extra functions don't get the custom event object + if ( event ) + data.shift(); + + // Handle triggering of extra function + if ( extra && jQuery.isFunction( extra ) ) { + // call the extra function and tack the current return value on the end for possible inspection + ret = extra.apply( elem, val == null ? data : data.concat( val ) ); + // if anything is returned, give it precedence and have it overwrite the previous value + if (ret !== undefined) + val = ret; + } + + // Trigger the native events (except for clicks on links) + if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) { + this.triggered = true; + try { + elem[ type ](); + // prevent IE from throwing an error for some hidden elements + } catch (e) {} + } + + this.triggered = false; + } + + return val; + }, + + handle: function(event) { + // returned undefined or false + var val, ret, namespace, all, handlers; + + event = arguments[0] = jQuery.event.fix( event || window.event ); + + // Namespaced event handlers + namespace = event.type.split("."); + event.type = namespace[0]; + namespace = namespace[1]; + // Cache this now, all = true means, any handler + all = !namespace && !event.exclusive; + + handlers = ( jQuery.data(this, "events") || {} )[event.type]; + + for ( var j in handlers ) { + var handler = handlers[j]; + + // Filter the functions by class + if ( all || handler.type == namespace ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handler; + event.data = handler.data; + + ret = handler.apply( this, arguments ); + + if ( val !== false ) + val = ret; + + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + + return val; + }, + + fix: function(event) { + if ( event[expando] == true ) + return event; + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = { originalEvent: originalEvent }; + var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" "); + for ( var i=props.length; i; i-- ) + event[ props[i] ] = originalEvent[ props[i] ]; + + // Mark it as fixed + event[expando] = true; + + // add preventDefault and stopPropagation since + // they will not work on the clone + event.preventDefault = function() { + // if preventDefault exists run it on the original event + if (originalEvent.preventDefault) + originalEvent.preventDefault(); + // otherwise set the returnValue property of the original event to false (IE) + originalEvent.returnValue = false; + }; + event.stopPropagation = function() { + // if stopPropagation exists run it on the original event + if (originalEvent.stopPropagation) + originalEvent.stopPropagation(); + // otherwise set the cancelBubble property of the original event to true (IE) + originalEvent.cancelBubble = true; + }; + + // Fix timeStamp + event.timeStamp = event.timeStamp || now(); + + // Fix target property, if necessary + if ( !event.target ) + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either + + // check if target is a textnode (safari) + if ( event.target.nodeType == 3 ) + event.target = event.target.parentNode; + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) + event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, body = document.body; + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); + } + + // Add which for key events + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) + event.which = event.charCode || event.keyCode; + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) + event.metaKey = event.ctrlKey; + + // Add which for click: 1 == left; 2 == middle; 3 == right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button ) + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + + return event; + }, + + proxy: function( fn, proxy ){ + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; + // So proxy can be declared as an argument + return proxy; + }, + + special: { + ready: { + setup: function() { + // Make sure the ready event is setup + bindReady(); + return; + }, + + teardown: function() { return; } + }, + + mouseenter: { + setup: function() { + if ( jQuery.browser.msie ) return false; + jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler); + return true; + }, + + teardown: function() { + if ( jQuery.browser.msie ) return false; + jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler); + return true; + }, + + handler: function(event) { + // If we actually just moused on to a sub-element, ignore it + if ( withinElement(event, this) ) return true; + // Execute the right handlers by setting the event type to mouseenter + event.type = "mouseenter"; + return jQuery.event.handle.apply(this, arguments); + } + }, + + mouseleave: { + setup: function() { + if ( jQuery.browser.msie ) return false; + jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler); + return true; + }, + + teardown: function() { + if ( jQuery.browser.msie ) return false; + jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler); + return true; + }, + + handler: function(event) { + // If we actually just moused on to a sub-element, ignore it + if ( withinElement(event, this) ) return true; + // Execute the right handlers by setting the event type to mouseleave + event.type = "mouseleave"; + return jQuery.event.handle.apply(this, arguments); + } + } + } +}; + +jQuery.fn.extend({ + bind: function( type, data, fn ) { + return type == "unload" ? this.one(type, data, fn) : this.each(function(){ + jQuery.event.add( this, type, fn || data, fn && data ); + }); + }, + + one: function( type, data, fn ) { + var one = jQuery.event.proxy( fn || data, function(event) { + jQuery(this).unbind(event, one); + return (fn || data).apply( this, arguments ); + }); + return this.each(function(){ + jQuery.event.add( this, type, one, fn && data); + }); + }, + + unbind: function( type, fn ) { + return this.each(function(){ + jQuery.event.remove( this, type, fn ); + }); + }, + + trigger: function( type, data, fn ) { + return this.each(function(){ + jQuery.event.trigger( type, data, this, true, fn ); + }); + }, + + triggerHandler: function( type, data, fn ) { + return this[0] && jQuery.event.trigger( type, data, this[0], false, fn ); + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, i = 1; + + // link all the functions, so any of them can unbind this click handler + while( i < args.length ) + jQuery.event.proxy( fn, args[i++] ); + + return this.click( jQuery.event.proxy( fn, function(event) { + // Figure out which function to execute + this.lastToggle = ( this.lastToggle || 0 ) % i; + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ this.lastToggle++ ].apply( this, arguments ) || false; + })); + }, + + hover: function(fnOver, fnOut) { + return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut); + }, + + ready: function(fn) { + // Attach the listeners + bindReady(); + + // If the DOM is already ready + if ( jQuery.isReady ) + // Execute the function immediately + fn.call( document, jQuery ); + + // Otherwise, remember the function for later + else + // Add the function to the wait list + jQuery.readyList.push( function() { return fn.call(this, jQuery); } ); + + return this; + } +}); + +jQuery.extend({ + isReady: false, + readyList: [], + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( jQuery.readyList ) { + // Execute all of them + jQuery.each( jQuery.readyList, function(){ + this.call( document ); + }); + + // Reset the list of functions + jQuery.readyList = null; + } + + // Trigger any bound ready events + jQuery(document).triggerHandler("ready"); + } + } +}); + +var readyBound = false; + +function bindReady(){ + if ( readyBound ) return; + readyBound = true; + + // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event + if ( document.addEventListener && !jQuery.browser.opera) + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); + + // If IE is used and is not in a frame + // Continually check to see if the document is ready + if ( jQuery.browser.msie && window == top ) (function(){ + if (jQuery.isReady) return; + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch( error ) { + setTimeout( arguments.callee, 0 ); + return; + } + // and execute any waiting functions + jQuery.ready(); + })(); + + if ( jQuery.browser.opera ) + document.addEventListener( "DOMContentLoaded", function () { + if (jQuery.isReady) return; + for (var i = 0; i < document.styleSheets.length; i++) + if (document.styleSheets[i].disabled) { + setTimeout( arguments.callee, 0 ); + return; + } + // and execute any waiting functions + jQuery.ready(); + }, false); + + if ( jQuery.browser.safari ) { + var numStyles; + (function(){ + if (jQuery.isReady) return; + if ( document.readyState != "loaded" && document.readyState != "complete" ) { + setTimeout( arguments.callee, 0 ); + return; + } + if ( numStyles === undefined ) + numStyles = jQuery("style, link[rel=stylesheet]").length; + if ( document.styleSheets.length != numStyles ) { + setTimeout( arguments.callee, 0 ); + return; + } + // and execute any waiting functions + jQuery.ready(); + })(); + } + + // A fallback to window.onload, that will always work + jQuery.event.add( window, "load", jQuery.ready ); +} + +jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + + "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + + "submit,keydown,keypress,keyup,error").split(","), function(i, name){ + + // Handle event binding + jQuery.fn[name] = function(fn){ + return fn ? this.bind(name, fn) : this.trigger(name); + }; +}); + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function(event, elem) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + // Traverse up the tree + while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; } + // Return true if we actually just moused on to a sub-element + return parent == elem; +}; + +// Prevent memory leaks in IE +// And prevent errors on refresh with events like mouseover in other browsers +// Window isn't included so as not to unbind existing unload events +jQuery(window).bind("unload", function() { + jQuery("*").add(document).unbind(); +}); +jQuery.fn.extend({ + // Keep a copy of the old load + _load: jQuery.fn.load, + + load: function( url, params, callback ) { + if ( typeof url != 'string' ) + return this._load( url ); + + var off = url.indexOf(" "); + if ( off >= 0 ) { + var selector = url.slice(off, url.length); + url = url.slice(0, off); + } + + callback = callback || function(){}; + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = null; + + // Otherwise, build a param string + } else { + params = jQuery.param( params ); + type = "POST"; + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + complete: function(res, status){ + // If successful, inject the HTML into all the matched elements + if ( status == "success" || status == "notmodified" ) + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div/>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + res.responseText ); + + self.each( callback, [res.responseText, status, res] ); + } + }); + return this; + }, + + serialize: function() { + return jQuery.param(this.serializeArray()); + }, + serializeArray: function() { + return this.map(function(){ + return jQuery.nodeName(this, "form") ? + jQuery.makeArray(this.elements) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + (this.checked || /select|textarea/i.test(this.nodeName) || + /text|hidden|password/i.test(this.type)); + }) + .map(function(i, elem){ + var val = jQuery(this).val(); + return val == null ? null : + val.constructor == Array ? + jQuery.map( val, function(val, i){ + return {name: elem.name, value: val}; + }) : + {name: elem.name, value: val}; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ + jQuery.fn[o] = function(f){ + return this.bind(o, f); + }; +}); + +var jsc = now(); + +jQuery.extend({ + get: function( url, data, callback, type ) { + // shift arguments if data argument was ommited + if ( jQuery.isFunction( data ) ) { + callback = data; + data = null; + } + + return jQuery.ajax({ + type: "GET", + url: url, + data: data, + success: callback, + dataType: type + }); + }, + + getScript: function( url, callback ) { + return jQuery.get(url, null, callback, "script"); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get(url, data, callback, "json"); + }, + + post: function( url, data, callback, type ) { + if ( jQuery.isFunction( data ) ) { + callback = data; + data = {}; + } + + return jQuery.ajax({ + type: "POST", + url: url, + data: data, + success: callback, + dataType: type + }); + }, + + ajaxSetup: function( settings ) { + jQuery.extend( jQuery.ajaxSettings, settings ); + }, + + ajaxSettings: { + url: location.href, + global: true, + type: "GET", + timeout: 0, + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + data: null, + username: null, + password: null, + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + script: "text/javascript, application/javascript", + json: "application/json, text/javascript", + text: "text/plain", + _default: "*/*" + } + }, + + // Last-Modified header cache for next request + lastModified: {}, + + ajax: function( s ) { + // Extend the settings, but re-extend 's' so that it can be + // checked again later (in the test suite, specifically) + s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); + + var jsonp, jsre = /=\?(&|$)/g, status, data, + type = s.type.toUpperCase(); + + // convert data if not already a string + if ( s.data && s.processData && typeof s.data != "string" ) + s.data = jQuery.param(s.data); + + // Handle JSONP Parameter Callbacks + if ( s.dataType == "jsonp" ) { + if ( type == "GET" ) { + if ( !s.url.match(jsre) ) + s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; + } else if ( !s.data || !s.data.match(jsre) ) + s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; + s.dataType = "json"; + } + + // Build temporary JSONP function + if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { + jsonp = "jsonp" + jsc++; + + // Replace the =? sequence both in the query string and the data + if ( s.data ) + s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); + s.url = s.url.replace(jsre, "=" + jsonp + "$1"); + + // We need to make sure + // that a JSONP style response is executed properly + s.dataType = "script"; + + // Handle JSONP-style loading + window[ jsonp ] = function(tmp){ + data = tmp; + success(); + complete(); + // Garbage collect + window[ jsonp ] = undefined; + try{ delete window[ jsonp ]; } catch(e){} + if ( head ) + head.removeChild( script ); + }; + } + + if ( s.dataType == "script" && s.cache == null ) + s.cache = false; + + if ( s.cache === false && type == "GET" ) { + var ts = now(); + // try replacing _= if it is there + var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); + // if nothing was replaced, add timestamp to the end + s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); + } + + // If data is available, append data to url for get requests + if ( s.data && type == "GET" ) { + s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; + + // IE likes to send both get and post data, prevent this + s.data = null; + } + + // Watch for a new set of requests + if ( s.global && ! jQuery.active++ ) + jQuery.event.trigger( "ajaxStart" ); + + // Matches an absolute URL, and saves the domain + var remote = /^(?:\w+:)?\/\/([^\/?#]+)/; + + // If we're requesting a remote document + // and trying to load JSON or Script with a GET + if ( s.dataType == "script" && type == "GET" + && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement("script"); + script.src = s.url; + if (s.scriptCharset) + script.charset = s.scriptCharset; + + // Handle Script loading + if ( !jsonp ) { + var done = false; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function(){ + if ( !done && (!this.readyState || + this.readyState == "loaded" || this.readyState == "complete") ) { + done = true; + success(); + complete(); + head.removeChild( script ); + } + }; + } + + head.appendChild(script); + + // We handle everything using the script element injection + return undefined; + } + + var requestDone = false; + + // Create the request object; Microsoft failed to properly + // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available + var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if( s.username ) + xhr.open(type, s.url, s.async, s.username, s.password); + else + xhr.open(type, s.url, s.async); + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + // Set the correct header, if data is being sent + if ( s.data ) + xhr.setRequestHeader("Content-Type", s.contentType); + + // Set the If-Modified-Since header, if ifModified mode. + if ( s.ifModified ) + xhr.setRequestHeader("If-Modified-Since", + jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); + + // Set header so the called script knows that it's an XMLHttpRequest + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + // Set the Accepts header for the server, depending on the dataType + xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? + s.accepts[ s.dataType ] + ", */*" : + s.accepts._default ); + } catch(e){} + + // Allow custom headers/mimetypes + if ( s.beforeSend && s.beforeSend(xhr, s) === false ) { + // cleanup active request counter + s.global && jQuery.active--; + // close opended socket + xhr.abort(); + return false; + } + + if ( s.global ) + jQuery.event.trigger("ajaxSend", [xhr, s]); + + // Wait for a response to come back + var onreadystatechange = function(isTimeout){ + // The transfer is complete and the data is available, or the request timed out + if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) { + requestDone = true; + + // clear poll interval + if (ival) { + clearInterval(ival); + ival = null; + } + + status = isTimeout == "timeout" && "timeout" || + !jQuery.httpSuccess( xhr ) && "error" || + s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" || + "success"; + + if ( status == "success" ) { + // Watch for, and catch, XML document parse errors + try { + // process the data (runs the xml through httpData regardless of callback) + data = jQuery.httpData( xhr, s.dataType, s.dataFilter ); + } catch(e) { + status = "parsererror"; + } + } + + // Make sure that the request was successful or notmodified + if ( status == "success" ) { + // Cache Last-Modified header, if ifModified mode. + var modRes; + try { + modRes = xhr.getResponseHeader("Last-Modified"); + } catch(e) {} // swallow exception thrown by FF if header is not available + + if ( s.ifModified && modRes ) + jQuery.lastModified[s.url] = modRes; + + // JSONP handles its own success callback + if ( !jsonp ) + success(); + } else + jQuery.handleError(s, xhr, status); + + // Fire the complete handlers + complete(); + + // Stop memory leaks + if ( s.async ) + xhr = null; + } + }; + + if ( s.async ) { + // don't attach the handler to the request, just poll it instead + var ival = setInterval(onreadystatechange, 13); + + // Timeout checker + if ( s.timeout > 0 ) + setTimeout(function(){ + // Check to see if the request is still happening + if ( xhr ) { + // Cancel the request + xhr.abort(); + + if( !requestDone ) + onreadystatechange( "timeout" ); + } + }, s.timeout); + } + + // Send the data + try { + xhr.send(s.data); + } catch(e) { + jQuery.handleError(s, xhr, null, e); + } + + // firefox 1.5 doesn't fire statechange for sync requests + if ( !s.async ) + onreadystatechange(); + + function success(){ + // If a local callback was specified, fire it and pass it the data + if ( s.success ) + s.success( data, status ); + + // Fire the global callback + if ( s.global ) + jQuery.event.trigger( "ajaxSuccess", [xhr, s] ); + } + + function complete(){ + // Process result + if ( s.complete ) + s.complete(xhr, status); + + // The request was completed + if ( s.global ) + jQuery.event.trigger( "ajaxComplete", [xhr, s] ); + + // Handle the global AJAX counter + if ( s.global && ! --jQuery.active ) + jQuery.event.trigger( "ajaxStop" ); + } + + // return XMLHttpRequest to allow aborting the request etc. + return xhr; + }, + + handleError: function( s, xhr, status, e ) { + // If a local callback was specified, fire it + if ( s.error ) s.error( xhr, status, e ); + + // Fire the global callback + if ( s.global ) + jQuery.event.trigger( "ajaxError", [xhr, s, e] ); + }, + + // Counter for holding the number of active queries + active: 0, + + // Determines if an XMLHttpRequest was successful or not + httpSuccess: function( xhr ) { + try { + // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 + return !xhr.status && location.protocol == "file:" || + ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 || + jQuery.browser.safari && xhr.status == undefined; + } catch(e){} + return false; + }, + + // Determines if an XMLHttpRequest returns NotModified + httpNotModified: function( xhr, url ) { + try { + var xhrRes = xhr.getResponseHeader("Last-Modified"); + + // Firefox always returns 200. check Last-Modified date + return xhr.status == 304 || xhrRes == jQuery.lastModified[url] || + jQuery.browser.safari && xhr.status == undefined; + } catch(e){} + return false; + }, + + httpData: function( xhr, type, filter ) { + var ct = xhr.getResponseHeader("content-type"), + xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, + data = xml ? xhr.responseXML : xhr.responseText; + + if ( xml && data.documentElement.tagName == "parsererror" ) + throw "parsererror"; + + // Allow a pre-filtering function to sanitize the response + if( filter ) + data = filter( data, type ); + + // If the type is "script", eval it in global context + if ( type == "script" ) + jQuery.globalEval( data ); + + // Get the JavaScript object, if JSON is used. + if ( type == "json" ) + data = eval("(" + data + ")"); + + return data; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a ) { + var s = []; + + // If an array was passed in, assume that it is an array + // of form elements + if ( a.constructor == Array || a.jquery ) + // Serialize the form elements + jQuery.each( a, function(){ + s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); + }); + + // Otherwise, assume that it's an object of key/value pairs + else + // Serialize the key/values + for ( var j in a ) + // If the value is an array then the key names need to be repeated + if ( a[j] && a[j].constructor == Array ) + jQuery.each( a[j], function(){ + s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) ); + }); + else + s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) ); + + // Return the resulting serialization + return s.join("&").replace(/%20/g, "+"); + } + +}); +jQuery.fn.extend({ + show: function(speed,callback){ + return speed ? + this.animate({ + height: "show", width: "show", opacity: "show" + }, speed, callback) : + + this.filter(":hidden").each(function(){ + this.style.display = this.oldblock || ""; + if ( jQuery.css(this,"display") == "none" ) { + var elem = jQuery("<" + this.tagName + " />").appendTo("body"); + this.style.display = elem.css("display"); + // handle an edge condition where css is - div { display:none; } or similar + if (this.style.display == "none") + this.style.display = "block"; + elem.remove(); + } + }).end(); + }, + + hide: function(speed,callback){ + return speed ? + this.animate({ + height: "hide", width: "hide", opacity: "hide" + }, speed, callback) : + + this.filter(":visible").each(function(){ + this.oldblock = this.oldblock || jQuery.css(this,"display"); + this.style.display = "none"; + }).end(); + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2 ){ + return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? + this._toggle.apply( this, arguments ) : + fn ? + this.animate({ + height: "toggle", width: "toggle", opacity: "toggle" + }, fn, fn2) : + this.each(function(){ + jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); + }); + }, + + slideDown: function(speed,callback){ + return this.animate({height: "show"}, speed, callback); + }, + + slideUp: function(speed,callback){ + return this.animate({height: "hide"}, speed, callback); + }, + + slideToggle: function(speed, callback){ + return this.animate({height: "toggle"}, speed, callback); + }, + + fadeIn: function(speed, callback){ + return this.animate({opacity: "show"}, speed, callback); + }, + + fadeOut: function(speed, callback){ + return this.animate({opacity: "hide"}, speed, callback); + }, + + fadeTo: function(speed,to,callback){ + return this.animate({opacity: to}, speed, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed(speed, easing, callback); + + return this[ optall.queue === false ? "each" : "queue" ](function(){ + if ( this.nodeType != 1) + return false; + + var opt = jQuery.extend({}, optall), p, + hidden = jQuery(this).is(":hidden"), self = this; + + for ( p in prop ) { + if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) + return opt.complete.call(this); + + if ( p == "height" || p == "width" ) { + // Store display property + opt.display = jQuery.css(this, "display"); + + // Make sure that nothing sneaks out + opt.overflow = this.style.overflow; + } + } + + if ( opt.overflow != null ) + this.style.overflow = "hidden"; + + opt.curAnim = jQuery.extend({}, prop); + + jQuery.each( prop, function(name, val){ + var e = new jQuery.fx( self, opt, name ); + + if ( /toggle|show|hide/.test(val) ) + e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); + else { + var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), + start = e.cur(true) || 0; + + if ( parts ) { + var end = parseFloat(parts[2]), + unit = parts[3] || "px"; + + // We need to compute starting value + if ( unit != "px" ) { + self.style[ name ] = (end || 1) + unit; + start = ((end || 1) / e.cur(true)) * start; + self.style[ name ] = start + unit; + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) + end = ((parts[1] == "-=" ? -1 : 1) * end) + start; + + e.custom( start, end, unit ); + } else + e.custom( start, val, "" ); + } + }); + + // For JS strict compliance + return true; + }); + }, + + queue: function(type, fn){ + if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) { + fn = type; + type = "fx"; + } + + if ( !type || (typeof type == "string" && !fn) ) + return queue( this[0], type ); + + return this.each(function(){ + if ( fn.constructor == Array ) + queue(this, type, fn); + else { + queue(this, type).push( fn ); + + if ( queue(this, type).length == 1 ) + fn.call(this); + } + }); + }, + + stop: function(clearQueue, gotoEnd){ + var timers = jQuery.timers; + + if (clearQueue) + this.queue([]); + + this.each(function(){ + // go in reverse order so anything added to the queue during the loop is ignored + for ( var i = timers.length - 1; i >= 0; i-- ) + if ( timers[i].elem == this ) { + if (gotoEnd) + // force the next step to be the last + timers[i](true); + timers.splice(i, 1); + } + }); + + // start the next in the queue if the last step wasn't forced + if (!gotoEnd) + this.dequeue(); + + return this; + } + +}); + +var queue = function( elem, type, array ) { + if ( elem ){ + + type = type || "fx"; + + var q = jQuery.data( elem, type + "queue" ); + + if ( !q || array ) + q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) ); + + } + return q; +}; + +jQuery.fn.dequeue = function(type){ + type = type || "fx"; + + return this.each(function(){ + var q = queue(this, type); + + q.shift(); + + if ( q.length ) + q[0].call( this ); + }); +}; + +jQuery.extend({ + + speed: function(speed, easing, fn) { + var opt = speed && speed.constructor == Object ? speed : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && easing.constructor != Function && easing + }; + + opt.duration = (opt.duration && opt.duration.constructor == Number ? + opt.duration : + jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def; + + // Queueing + opt.old = opt.complete; + opt.complete = function(){ + if ( opt.queue !== false ) + jQuery(this).dequeue(); + if ( jQuery.isFunction( opt.old ) ) + opt.old.call( this ); + }; + + return opt; + }, + + easing: { + linear: function( p, n, firstNum, diff ) { + return firstNum + diff * p; + }, + swing: function( p, n, firstNum, diff ) { + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; + } + }, + + timers: [], + timerId: null, + + fx: function( elem, options, prop ){ + this.options = options; + this.elem = elem; + this.prop = prop; + + if ( !options.orig ) + options.orig = {}; + } + +}); + +jQuery.fx.prototype = { + + // Simple function for setting a style value + update: function(){ + if ( this.options.step ) + this.options.step.call( this.elem, this.now, this ); + + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); + + // Set display property to block for height/width animations + if ( this.prop == "height" || this.prop == "width" ) + this.elem.style.display = "block"; + }, + + // Get the current size + cur: function(force){ + if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null ) + return this.elem[ this.prop ]; + + var r = parseFloat(jQuery.css(this.elem, this.prop, force)); + return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; + }, + + // Start an animation from one number to another + custom: function(from, to, unit){ + this.startTime = now(); + this.start = from; + this.end = to; + this.unit = unit || this.unit || "px"; + this.now = this.start; + this.pos = this.state = 0; + this.update(); + + var self = this; + function t(gotoEnd){ + return self.step(gotoEnd); + } + + t.elem = this.elem; + + jQuery.timers.push(t); + + if ( jQuery.timerId == null ) { + jQuery.timerId = setInterval(function(){ + var timers = jQuery.timers; + + for ( var i = 0; i < timers.length; i++ ) + if ( !timers[i]() ) + timers.splice(i--, 1); + + if ( !timers.length ) { + clearInterval( jQuery.timerId ); + jQuery.timerId = null; + } + }, 13); + } + }, + + // Simple 'show' function + show: function(){ + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); + this.options.show = true; + + // Begin the animation + this.custom(0, this.cur()); + + // Make sure that we start at a small width/height to avoid any + // flash of content + if ( this.prop == "width" || this.prop == "height" ) + this.elem.style[this.prop] = "1px"; + + // Start by showing the element + jQuery(this.elem).show(); + }, + + // Simple 'hide' function + hide: function(){ + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom(this.cur(), 0); + }, + + // Each step of an animation + step: function(gotoEnd){ + var t = now(); + + if ( gotoEnd || t > this.options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + this.options.curAnim[ this.prop ] = true; + + var done = true; + for ( var i in this.options.curAnim ) + if ( this.options.curAnim[i] !== true ) + done = false; + + if ( done ) { + if ( this.options.display != null ) { + // Reset the overflow + this.elem.style.overflow = this.options.overflow; + + // Reset the display + this.elem.style.display = this.options.display; + if ( jQuery.css(this.elem, "display") == "none" ) + this.elem.style.display = "block"; + } + + // Hide the element if the "hide" operation was done + if ( this.options.hide ) + this.elem.style.display = "none"; + + // Reset the properties, if the item has been hidden or shown + if ( this.options.hide || this.options.show ) + for ( var p in this.options.curAnim ) + jQuery.attr(this.elem.style, p, this.options.orig[p]); + } + + if ( done ) + // Execute the complete function + this.options.complete.call( this.elem ); + + return false; + } else { + var n = t - this.startTime; + this.state = n / this.options.duration; + + // Perform the easing function, defaults to swing + this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); + this.now = this.start + ((this.end - this.start) * this.pos); + + // Perform the next step of the animation + this.update(); + } + + return true; + } + +}; + +jQuery.extend( jQuery.fx, { + speeds:{ + slow: 600, + fast: 200, + // Default speed + def: 400 + }, + step: { + scrollLeft: function(fx){ + fx.elem.scrollLeft = fx.now; + }, + + scrollTop: function(fx){ + fx.elem.scrollTop = fx.now; + }, + + opacity: function(fx){ + jQuery.attr(fx.elem.style, "opacity", fx.now); + }, + + _default: function(fx){ + fx.elem.style[ fx.prop ] = fx.now + fx.unit; + } + } +}); +// The Offset Method +// Originally By Brandon Aaron, part of the Dimension Plugin +// http://jquery.com/plugins/project/dimensions +jQuery.fn.offset = function() { + var left = 0, top = 0, elem = this[0], results; + + if ( elem ) with ( jQuery.browser ) { + var parent = elem.parentNode, + offsetChild = elem, + offsetParent = elem.offsetParent, + doc = elem.ownerDocument, + safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent), + css = jQuery.curCSS, + fixed = css(elem, "position") == "fixed"; + + // Use getBoundingClientRect if available + if ( elem.getBoundingClientRect ) { + var box = elem.getBoundingClientRect(); + + // Add the document scroll offsets + add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), + box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); + + // IE adds the HTML element's border, by default it is medium which is 2px + // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; } + // IE 7 standards mode, the border is always 2px + // This border/offset is typically represented by the clientLeft and clientTop properties + // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS + // Therefore this method will be off by 2px in IE while in quirksmode + add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop ); + + // Otherwise loop through the offsetParents and parentNodes + } else { + + // Initial element offsets + add( elem.offsetLeft, elem.offsetTop ); + + // Get parent offsets + while ( offsetParent ) { + // Add offsetParent offsets + add( offsetParent.offsetLeft, offsetParent.offsetTop ); + + // Mozilla and Safari > 2 does not include the border on offset parents + // However Mozilla adds the border for table or table cells + if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 ) + border( offsetParent ); + + // Add the document scroll offsets if position is fixed on any offsetParent + if ( !fixed && css(offsetParent, "position") == "fixed" ) + fixed = true; + + // Set offsetChild to previous offsetParent unless it is the body element + offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent; + // Get next offsetParent + offsetParent = offsetParent.offsetParent; + } + + // Get parent scroll offsets + while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) { + // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug + if ( !/^inline|table.*$/i.test(css(parent, "display")) ) + // Subtract parent scroll offsets + add( -parent.scrollLeft, -parent.scrollTop ); + + // Mozilla does not add the border for a parent that has overflow != visible + if ( mozilla && css(parent, "overflow") != "visible" ) + border( parent ); + + // Get next parent + parent = parent.parentNode; + } + + // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild + // Mozilla doubles body offsets with a non-absolutely positioned offsetChild + if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) || + (mozilla && css(offsetChild, "position") != "absolute") ) + add( -doc.body.offsetLeft, -doc.body.offsetTop ); + + // Add the document scroll offsets if position is fixed + if ( fixed ) + add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)); + } + + // Return an object with top and left properties + results = { top: top, left: left }; + } + + function border(elem) { + add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) ); + } + + function add(l, t) { + left += parseInt(l, 10) || 0; + top += parseInt(t, 10) || 0; + } + + return results; +}; + + +jQuery.fn.extend({ + position: function() { + var left = 0, top = 0, results; + + if ( this[0] ) { + // Get *real* offsetParent + var offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= num( this, 'marginTop' ); + offset.left -= num( this, 'marginLeft' ); + + // Add offsetParent borders + parentOffset.top += num( offsetParent, 'borderTopWidth' ); + parentOffset.left += num( offsetParent, 'borderLeftWidth' ); + + // Subtract the two offsets + results = { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + } + + return results; + }, + + offsetParent: function() { + var offsetParent = this[0].offsetParent; + while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ) + offsetParent = offsetParent.offsetParent; + return jQuery(offsetParent); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( ['Left', 'Top'], function(i, name) { + var method = 'scroll' + name; + + jQuery.fn[ method ] = function(val) { + if (!this[0]) return; + + return val != undefined ? + + // Set the scroll offset + this.each(function() { + this == window || this == document ? + window.scrollTo( + !i ? val : jQuery(window).scrollLeft(), + i ? val : jQuery(window).scrollTop() + ) : + this[ method ] = val; + }) : + + // Return the scroll offset + this[0] == window || this[0] == document ? + self[ i ? 'pageYOffset' : 'pageXOffset' ] || + jQuery.boxModel && document.documentElement[ method ] || + document.body[ method ] : + this[0][ method ]; + }; +}); +// Create innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each([ "Height", "Width" ], function(i, name){ + + var tl = i ? "Left" : "Top", // top or left + br = i ? "Right" : "Bottom"; // bottom or right + + // innerHeight and innerWidth + jQuery.fn["inner" + name] = function(){ + return this[ name.toLowerCase() ]() + + num(this, "padding" + tl) + + num(this, "padding" + br); + }; + + // outerHeight and outerWidth + jQuery.fn["outer" + name] = function(margin) { + return this["inner" + name]() + + num(this, "border" + tl + "Width") + + num(this, "border" + br + "Width") + + (margin ? + num(this, "margin" + tl) + num(this, "margin" + br) : 0); + }; + +});})(); diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_arrows_leftright.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_arrows_leftright.gif new file mode 100644 index 000000000..b26780a3b Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_arrows_leftright.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_arrows_updown.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_arrows_updown.gif new file mode 100644 index 000000000..69eb0770a Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_arrows_updown.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_doc.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_doc.gif new file mode 100644 index 000000000..26db4340c Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_doc.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_minus.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_minus.gif new file mode 100644 index 000000000..6851f3981 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_minus.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_plus.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_plus.gif new file mode 100644 index 000000000..74ac5cb91 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_plus.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_resize_se.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_resize_se.gif new file mode 100644 index 000000000..251dc1628 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_11x11_icon_resize_se.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_down.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_down.gif new file mode 100644 index 000000000..29c6c706d Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_down.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_left.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_left.gif new file mode 100644 index 000000000..9f95efae6 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_left.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_right.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_right.gif new file mode 100644 index 000000000..bc0205073 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_right.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_up.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_up.gif new file mode 100644 index 000000000..28169eb91 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/222222_7x7_arrow_up.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_arrows_leftright.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_arrows_leftright.gif new file mode 100644 index 000000000..136e6266b Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_arrows_leftright.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_arrows_updown.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_arrows_updown.gif new file mode 100644 index 000000000..4f0063520 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_arrows_updown.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_close.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_close.gif new file mode 100644 index 000000000..390a75978 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_close.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_doc.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_doc.gif new file mode 100644 index 000000000..e91c73334 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_doc.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_folder_closed.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_folder_closed.gif new file mode 100644 index 000000000..85f0e0b5c Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_folder_closed.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_folder_open.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_folder_open.gif new file mode 100644 index 000000000..f6414c778 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_folder_open.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_minus.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_minus.gif new file mode 100644 index 000000000..25b3e17c0 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_minus.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_plus.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_plus.gif new file mode 100644 index 000000000..41d953440 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_11x11_icon_plus.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_down.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_down.gif new file mode 100644 index 000000000..92fdfe0a7 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_down.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_left.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_left.gif new file mode 100644 index 000000000..cf01ff32e Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_left.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_right.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_right.gif new file mode 100644 index 000000000..3190e7a1c Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_right.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_up.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_up.gif new file mode 100644 index 000000000..7ae34bfec Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/454545_7x7_arrow_up.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_arrows_leftright.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_arrows_leftright.gif new file mode 100644 index 000000000..19f9d6b21 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_arrows_leftright.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_arrows_updown.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_arrows_updown.gif new file mode 100644 index 000000000..c10451f64 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_arrows_updown.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_close.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_close.gif new file mode 100644 index 000000000..326d01533 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_close.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_doc.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_doc.gif new file mode 100644 index 000000000..7d1b5cb57 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_doc.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_folder_closed.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_folder_closed.gif new file mode 100644 index 000000000..71bff0583 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_folder_closed.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_folder_open.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_folder_open.gif new file mode 100644 index 000000000..33a20b851 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_folder_open.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_minus.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_minus.gif new file mode 100644 index 000000000..777c3288f Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_minus.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_plus.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_plus.gif new file mode 100644 index 000000000..43531fff3 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_11x11_icon_plus.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_down.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_down.gif new file mode 100644 index 000000000..c91731de5 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_down.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_left.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_left.gif new file mode 100644 index 000000000..d6c523b2b Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_left.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_right.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_right.gif new file mode 100644 index 000000000..d65b2ed1a Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_right.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_up.gif b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_up.gif new file mode 100644 index 000000000..165666af0 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/888888_7x7_arrow_up.gif differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/dadada_40x100_textures_02_glass_75.png b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/dadada_40x100_textures_02_glass_75.png new file mode 100644 index 000000000..d98d153b3 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/dadada_40x100_textures_02_glass_75.png differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png new file mode 100644 index 000000000..a8b7ba3c5 Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/ffffff_40x100_textures_01_flat_75.png b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/ffffff_40x100_textures_01_flat_75.png new file mode 100644 index 000000000..ac8b229af Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/ffffff_40x100_textures_01_flat_75.png differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/ffffff_40x100_textures_02_glass_65.png b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/ffffff_40x100_textures_02_glass_65.png new file mode 100644 index 000000000..2c16183ff Binary files /dev/null and b/fannie/src/jquery-ui/development-bundle/themes/smoothness/images/ffffff_40x100_textures_02_glass_65.png differ diff --git a/fannie/src/jquery-ui/development-bundle/themes/smoothness/ui.all.css b/fannie/src/jquery-ui/development-bundle/themes/smoothness/ui.all.css new file mode 100644 index 000000000..e327feb32 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/themes/smoothness/ui.all.css @@ -0,0 +1,610 @@ +/* + * jQuery UI screen structure and presentation + * This CSS file was generated by ThemeRoller, a Filament Group Project for jQuery UI + * Author: Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com + * Visit ThemeRoller.com +*/ + +/* + * Note: If your ThemeRoller settings have a font size set in ems, your components will scale according to their parent element's font size. + * As a rule of thumb, set your body's font size to 62.5% to make 1em = 10px. + * body {font-size: 62.5%;} +*/ + + + +/*UI accordion*/ +.ui-accordion { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + border-bottom: 1px solid #d3d3d3; +} +.ui-accordion-group { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + border: 1px solid #d3d3d3; + border-bottom: none; +} +.ui-accordion-header { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + cursor: pointer; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-accordion-header a { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + display: block; + font-size: 1em; + font-weight: normal; + text-decoration: none; + padding: .5em .5em .5em 1.7em; + color: #555555; + background: url(images/888888_7x7_arrow_right.gif) .5em 50% no-repeat; +} +.ui-accordion-header a:hover { + background: url(images/454545_7x7_arrow_right.gif) .5em 50% no-repeat; + color: #212121; +} +.ui-accordion-header:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + color: #212121; +} +.selected .ui-accordion-header, .selected .ui-accordion-header:hover { + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; +} +.selected .ui-accordion-header a, .selected .ui-accordion-header a:hover { + color: #212121; + background: url(images/454545_7x7_arrow_down.gif) .5em 50% no-repeat; +} +.ui-accordion-content { + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; + font-size: 1em; +} +.ui-accordion-content p { + padding: 1em 1.7em 0.6em; +} + + + + + + +/*UI tabs*/ +.ui-tabs-nav { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + float: left; + position: relative; + z-index: 1; + border-right: 1px solid #d3d3d3; + bottom: -1px; +} +.ui-tabs-nav ul { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; +} +.ui-tabs-nav li { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + float: left; + border: 1px solid #d3d3d3; + border-right: none; +} +.ui-tabs-nav li a { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + float: left; + font-size: 1em; + font-weight: normal; + text-decoration: none; + padding: .5em 1.7em; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-tabs-nav li a:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + color: #212121; +} +.ui-tabs-nav li.ui-tabs-selected { + border-bottom-color: #ffffff; +} +.ui-tabs-nav li.ui-tabs-selected a, .ui-tabs-nav li.ui-tabs-selected a:hover { + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + color: #212121; +} +.ui-tabs-panel { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + clear:left; + border: 1px solid #d3d3d3; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; + padding: 1.5em 1.7em; + font-size: 1.1em; +} +.ui-tabs-hide { + display: none;/* for accessible hiding: position: absolute; left: -99999999px*/; +} + + + + + +/*slider*/ +.ui-slider { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + border: 1px solid #aaaaaa; + height: .8em; + position: relative; +} +.ui-slider-handle { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + position: absolute; + z-index: 2; + top: -3px; + width: 1.2em; + height: 1.2em; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border: 1px solid #d3d3d3; +} +.ui-slider-handle:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border: 1px solid #999999; +} +.ui-slider-handle-active, .ui-slider-handle-active:hover { + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + border: 1px solid #aaaaaa; +} +.ui-slider-range { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + height: .8em; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + position: absolute; + border: 1px solid #d3d3d3; + border-left: 0; + border-right: 0; + top: -1px; + z-index: 1; + opacity:.7; + filter:Alpha(Opacity=70); +} + + + + + + +/*dialog*/ +.ui-dialog { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; + border: 4px solid #aaaaaa; + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + z-index: 99999; +} +.ui-resizable .ui-resizable-handle { + display: block; +} +body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */ +body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */ +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0px; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0px; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0px; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 13px; + height: 13px; + right: 0px; + bottom: 0px; + background: url(images/222222_11x11_icon_resize_se.gif) no-repeat 0 0; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: 0px; + bottom: 0px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: 0px; + top: 0px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: 0px; + top: 0px; +} +.ui-dialog-titlebar { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + padding: .5em 1.5em .5em 1em; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border-bottom: 1px solid #d3d3d3; + font-size: 1em; + font-weight: normal; + position: relative; +} +.ui-dialog-title {} +.ui-dialog-titlebar-close { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + background: url(images/888888_11x11_icon_close.gif) 0 0 no-repeat; + position: absolute; + right: 8px; + top: .7em; + width: 11px; + height: 11px; + z-index: 100; +} +.ui-dialog-titlebar-close-hover, .ui-dialog-titlebar-close:hover { + background: url(images/454545_11x11_icon_close.gif) 0 0 no-repeat; +} +.ui-dialog-titlebar-close:active { + background: url(images/454545_11x11_icon_close.gif) 0 0 no-repeat; +} +.ui-dialog-titlebar-close span { + display: none; +} +.ui-dialog-content { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + color: #222222; + padding: 1.5em 1.7em; +} +.ui-dialog-buttonpane { + position: absolute; + bottom: 0; + width: 100%; + text-align: left; + border-top: 1px solid #aaaaaa; + background: #ffffff; +} +.ui-dialog-buttonpane button { + margin: .5em 0 .5em 8px; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + font-size: 1em; + border: 1px solid #d3d3d3; + cursor: pointer; + padding: .2em .6em .3em .6em; + line-height: 1.4em; +} +.ui-dialog-buttonpane button:hover { + color: #212121; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + border: 1px solid #999999; +} +.ui-dialog-buttonpane button:active { + color: #212121; + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + border: 1px solid #aaaaaa; +} +/* This file skins dialog */ +.ui-dialog.ui-draggable .ui-dialog-titlebar, +.ui-dialog.ui-draggable .ui-dialog-titlebar { + cursor: move; +} + + + + + + + +/*datepicker*/ +/* Main Style Sheet for jQuery UI date picker */ +.ui-datepicker-div, .ui-datepicker-inline, #ui-datepicker-div { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + font-size: 1.1em; + border: 4px solid #aaaaaa; + width: 15.5em; + padding: 2.5em .5em .5em .5em; + position: relative; +} +.ui-datepicker-div, #ui-datepicker-div { + z-index: 9999; /*must have*/ + display: none; +} +.ui-datepicker-inline { + float: left; + display: block; +} +.ui-datepicker-control { + display: none; +} +.ui-datepicker-current { + display: none; +} +.ui-datepicker-next, .ui-datepicker-prev { + position: absolute; + left: .5em; + top: .5em; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-datepicker-next { + left: 14.6em; +} +.ui-datepicker-next:hover, .ui-datepicker-prev:hover { + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +.ui-datepicker-next a, .ui-datepicker-prev a { + text-indent: -999999px; + width: 1.3em; + height: 1.4em; + display: block; + font-size: 1em; + background: url(images/888888_7x7_arrow_left.gif) 50% 50% no-repeat; + border: 1px solid #d3d3d3; + cursor: pointer; +} +.ui-datepicker-next a { + background: url(images/888888_7x7_arrow_right.gif) 50% 50% no-repeat; +} +.ui-datepicker-prev a:hover { + background: url(images/454545_7x7_arrow_left.gif) 50% 50% no-repeat; +} +.ui-datepicker-next a:hover { + background: url(images/454545_7x7_arrow_right.gif) 50% 50% no-repeat; +} +.ui-datepicker-prev a:active { + background: url(images/454545_7x7_arrow_left.gif) 50% 50% no-repeat; +} +.ui-datepicker-next a:active { + background: url(images/454545_7x7_arrow_right.gif) 50% 50% no-repeat; +} +.ui-datepicker-header select { + border: 1px solid #d3d3d3; + color: #555555; + background: #e6e6e6; + font-size: 1em; + line-height: 1.4em; + position: absolute; + top: .5em; + margin: 0 !important; +} +.ui-datepicker-header option:focus, .ui-datepicker-header option:hover { + background: #dadada; +} +.ui-datepicker-header select.ui-datepicker-new-month { + width: 7em; + left: 2.2em; +} +.ui-datepicker-header select.ui-datepicker-new-year { + width: 5em; + left: 9.4em; +} +table.ui-datepicker { + width: 15.5em; + text-align: right; +} +table.ui-datepicker td a { + padding: .1em .3em .1em 0; + display: block; + color: #555555; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + cursor: pointer; + border: 1px solid #ffffff; +} +table.ui-datepicker td a:hover { + border: 1px solid #999999; + color: #212121; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; +} +table.ui-datepicker td a:active { + border: 1px solid #aaaaaa; + color: #212121; + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; +} +table.ui-datepicker .ui-datepicker-title-row td { + padding: .3em 0; + text-align: center; + font-size: .9em; + color: #222222; + text-transform: uppercase; +} +table.ui-datepicker .ui-datepicker-title-row td a { + color: #222222; +} +.ui-datepicker-cover { + display: none; + display/**/: block; + position: absolute; + z-index: -1; + filter: mask(); + top: -4px; + left: -4px; + width: 193px; + height: 200px; +} + + + + + + + + + + + + + + +/* +Generic ThemeRoller Classes +>> Make your jQuery Components ThemeRoller-Compatible! +*/ + +/*component global class*/ +.ui-component { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +/*component content styles*/ +.ui-component-content { + border: 1px solid #aaaaaa; + background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x; + color: #222222; +} +.ui-component-content a { + color: #222222; + text-decoration: underline; +} +/*component states*/ +.ui-default-state { + border: 1px solid #d3d3d3; + background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x; + font-weight: normal; + color: #555555 !important; +} +.ui-default-state a { + color: #555555; +} +.ui-default-state:hover, .ui-hover-state { + border: 1px solid #999999; + background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x; + font-weight: normal; + color: #212121 !important; +} +.ui-hover-state a { + color: #212121; +} +.ui-default-state:active, .ui-active-state { + border: 1px solid #aaaaaa; + background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x; + font-weight: normal; + color: #212121 !important; + outline: none; +} +.ui-active-state a { + color: #212121; + outline: none; +} +/*icons*/ +.ui-arrow-right-default {background: url(images/888888_7x7_arrow_right.gif) no-repeat 50% 50%;} +.ui-arrow-right-default:hover, .ui-arrow-right-hover {background: url(images/454545_7x7_arrow_right.gif) no-repeat 50% 50%;} +.ui-arrow-right-default:active, .ui-arrow-right-active {background: url(images/454545_7x7_arrow_right.gif) no-repeat 50% 50%;} +.ui-arrow-right-content {background: url(images/222222_7x7_arrow_right.gif) no-repeat 50% 50%;} + +.ui-arrow-left-default {background: url(images/888888_7x7_arrow_left.gif) no-repeat 50% 50%;} +.ui-arrow-left-default:hover, .ui-arrow-left-hover {background: url(images/454545_7x7_arrow_left.gif) no-repeat 50% 50%;} +.ui-arrow-left-default:active, .ui-arrow-left-active {background: url(images/454545_7x7_arrow_left.gif) no-repeat 50% 50%;} +.ui-arrow-left-content {background: url(images/222222_7x7_arrow_left.gif) no-repeat 50% 50%;} + +.ui-arrow-down-default {background: url(images/888888_7x7_arrow_down.gif) no-repeat 50% 50%;} +.ui-arrow-down-default:hover, .ui-arrow-down-hover {background: url(images/454545_7x7_arrow_down.gif) no-repeat 50% 50%;} +.ui-arrow-down-default:active, .ui-arrow-down-active {background: url(images/454545_7x7_arrow_down.gif) no-repeat 50% 50%;} +.ui-arrow-down-content {background: url(images/222222_7x7_arrow_down.gif) no-repeat 50% 50%;} + +.ui-arrow-up-default {background: url(images/888888_7x7_arrow_up.gif) no-repeat 50% 50%;} +.ui-arrow-up-default:hover, .ui-arrow-up-hover {background: url(images/454545_7x7_arrow_up.gif) no-repeat 50% 50%;} +.ui-arrow-up-default:active, .ui-arrow-up-active {background: url(images/454545_7x7_arrow_up.gif) no-repeat 50% 50%;} +.ui-arrow-up-content {background: url(images/222222_7x7_arrow_up.gif) no-repeat 50% 50%;} + +.ui-close-default {background: url(images/888888_11x11_icon_close.gif) no-repeat 50% 50%;} +.ui-close-default:hover, .ui-close-hover {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;} +.ui-close-default:active, .ui-close-active {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;} +.ui-close-content {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;} + +.ui-folder-closed-default {background: url(images/888888_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} +.ui-folder-closed-default:hover, .ui-folder-closed-hover {background: url(images/454545_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} +.ui-folder-closed-default:active, .ui-folder-closed-active {background: url(images/454545_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} +.ui-folder-closed-content {background: url(images/888888_11x11_icon_folder_closed.gif) no-repeat 50% 50%;} + +.ui-folder-open-default {background: url(images/888888_11x11_icon_folder_open.gif) no-repeat 50% 50%;} +.ui-folder-open-default:hover, .ui-folder-open-hover {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;} +.ui-folder-open-default:active, .ui-folder-open-active {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;} +.ui-folder-open-content {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;} + +.ui-doc-default {background: url(images/888888_11x11_icon_doc.gif) no-repeat 50% 50%;} +.ui-doc-default:hover, .ui-doc-hover {background: url(images/454545_11x11_icon_doc.gif) no-repeat 50% 50%;} +.ui-doc-default:active, .ui-doc-active {background: url(images/454545_11x11_icon_doc.gif) no-repeat 50% 50%;} +.ui-doc-content {background: url(images/222222_11x11_icon_doc.gif) no-repeat 50% 50%;} + +.ui-arrows-leftright-default {background: url(images/888888_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} +.ui-arrows-leftright-default:hover, .ui-arrows-leftright-hover {background: url(images/454545_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} +.ui-arrows-leftright-default:active, .ui-arrows-leftright-active {background: url(images/454545_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} +.ui-arrows-leftright-content {background: url(images/222222_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;} + +.ui-arrows-updown-default {background: url(images/888888_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} +.ui-arrows-updown-default:hover, .ui-arrows-updown-hover {background: url(images/454545_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} +.ui-arrows-updown-default:active, .ui-arrows-updown-active {background: url(images/454545_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} +.ui-arrows-updown-content {background: url(images/222222_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;} + +.ui-minus-default {background: url(images/888888_11x11_icon_minus.gif) no-repeat 50% 50%;} +.ui-minus-default:hover, .ui-minus-hover {background: url(images/454545_11x11_icon_minus.gif) no-repeat 50% 50%;} +.ui-minus-default:active, .ui-minus-active {background: url(images/454545_11x11_icon_minus.gif) no-repeat 50% 50%;} +.ui-minus-content {background: url(images/222222_11x11_icon_minus.gif) no-repeat 50% 50%;} + +.ui-plus-default {background: url(images/888888_11x11_icon_plus.gif) no-repeat 50% 50%;} +.ui-plus-default:hover, .ui-plus-hover {background: url(images/454545_11x11_icon_plus.gif) no-repeat 50% 50%;} +.ui-plus-default:active, .ui-plus-active {background: url(images/454545_11x11_icon_plus.gif) no-repeat 50% 50%;} +.ui-plus-content {background: url(images/222222_11x11_icon_plus.gif) no-repeat 50% 50%;} + +/*hidden elements*/ +.ui-hidden { + display: none;/* for accessible hiding: position: absolute; left: -99999999px*/; +} +.ui-accessible-hidden { + position: absolute; left: -99999999px; +} +/*reset styles*/ +.ui-reset { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; +} +/*clearfix class*/ +.ui-clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +.ui-clearfix {display: inline-block;} +/* Hides from IE-mac \*/ +* html .ui-clearfix {height: 1%;} +.ui-clearfix {display: block;} +/* End hide from IE-mac */ + +/* Note: for resizable styles, use the styles listed above in the dialog section */ + + diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.blind.js b/fannie/src/jquery-ui/development-bundle/ui/effects.blind.js new file mode 100644 index 000000000..269fe30d6 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.blind.js @@ -0,0 +1,49 @@ +/* + * jQuery UI Effects Blind + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.blind = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'vertical') ? 'height' : 'width'; + var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width(); + if(mode == 'show') wrapper.css(ref, 0); // Shift + + // Animation + var animation = {}; + animation[ref] = mode == 'show' ? distance : 0; + + // Animate + wrapper.animate(animation, o.duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.bounce.js b/fannie/src/jquery-ui/development-bundle/ui/effects.bounce.js new file mode 100644 index 000000000..4bb489d7f --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.bounce.js @@ -0,0 +1,78 @@ +/* + * jQuery UI Effects Bounce + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.bounce = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'up'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 5; // Default # of times + var speed = o.duration || 250; // Default speed per bounce + if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + if (mode == 'hide') distance = distance / (times * 2); + if (mode != 'hide') times--; + + // Animate + if (mode == 'show') { // Show Bounce + var animation = {opacity: 1}; + animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation, speed / 2, o.options.easing); + distance = distance / 2; + times--; + }; + for (var i = 0; i < times; i++) { // Bounces + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing); + distance = (mode == 'hide') ? distance * 2 : distance / 2; + }; + if (mode == 'hide') { // Last Bounce + var animation = {opacity: 0}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + el.animate(animation, speed / 2, o.options.easing, function(){ + el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){ + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.clip.js b/fannie/src/jquery-ui/development-bundle/ui/effects.clip.js new file mode 100644 index 000000000..21f90f3f2 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.clip.js @@ -0,0 +1,54 @@ +/* + * jQuery UI Effects Clip + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.clip = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','height','width']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var animate = el[0].tagName == 'IMG' ? wrapper : el; + var ref = { + size: (direction == 'vertical') ? 'height' : 'width', + position: (direction == 'vertical') ? 'top' : 'left' + }; + var distance = (direction == 'vertical') ? animate.height() : animate.width(); + if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift + + // Animation + var animation = {}; + animation[ref.size] = mode == 'show' ? distance : 0; + animation[ref.position] = mode == 'show' ? 0 : distance / 2; + + // Animate + animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.core.js b/fannie/src/jquery-ui/development-bundle/ui/effects.core.js new file mode 100644 index 000000000..8c91fe4e0 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.core.js @@ -0,0 +1,509 @@ +/* + * jQuery UI Effects 1.5.3 + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +;(function($) { + +$.effects = $.effects || {}; //Add the 'effects' scope + +$.extend($.effects, { + save: function(el, set) { + for(var i=0;i<set.length;i++) { + if(set[i] !== null) $.data(el[0], "ec.storage."+set[i], el[0].style[set[i]]); + } + }, + restore: function(el, set) { + for(var i=0;i<set.length;i++) { + if(set[i] !== null) el.css(set[i], $.data(el[0], "ec.storage."+set[i])); + } + }, + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + createWrapper: function(el) { + if (el.parent().attr('id') == 'fxWrapper') + return el; + var props = {width: el.outerWidth({margin:true}), height: el.outerHeight({margin:true}), 'float': el.css('float')}; + el.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>'); + var wrapper = el.parent(); + if (el.css('position') == 'static'){ + wrapper.css({position: 'relative'}); + el.css({position: 'relative'}); + } else { + var top = el.css('top'); if(isNaN(parseInt(top))) top = 'auto'; + var left = el.css('left'); if(isNaN(parseInt(left))) left = 'auto'; + wrapper.css({ position: el.css('position'), top: top, left: left, zIndex: el.css('z-index') }).show(); + el.css({position: 'relative', top:0, left:0}); + } + wrapper.css(props); + return wrapper; + }, + removeWrapper: function(el) { + if (el.parent().attr('id') == 'fxWrapper') + return el.parent().replaceWith(el); + return el; + }, + setTransition: function(el, list, factor, val) { + val = val || {}; + $.each(list,function(i, x){ + unit = el.cssUnit(x); + if (unit[0] > 0) val[x] = unit[0] * factor + unit[1]; + }); + return val; + }, + animateClass: function(value, duration, easing, callback) { + + var cb = (typeof easing == "function" ? easing : (callback ? callback : null)); + var ea = (typeof easing == "object" ? easing : null); + + return this.each(function() { + + var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || ''; + if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */ + if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; } + + //Let's get a style offset + var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle)); + if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove); + var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle)); + if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove); + + // The main function to form the object for animation + for(var n in newStyle) { + if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */ + && n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */ + && newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */ + && (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */ + && (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */ + ) offset[n] = newStyle[n]; + } + + that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object + // Change style attribute back to original. For stupid IE, we need to clear the damn object. + if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr); + if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove); + if(cb) cb.apply(this, arguments); + }); + + }); + } +}); + +//Extend the methods of jQuery +$.fn.extend({ + //Save old methods + _show: $.fn.show, + _hide: $.fn.hide, + __toggle: $.fn.toggle, + _addClass: $.fn.addClass, + _removeClass: $.fn.removeClass, + _toggleClass: $.fn.toggleClass, + // New ec methods + effect: function(fx,o,speed,callback) { + return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: o || {}, duration: speed, callback: callback }) : null; + }, + show: function() { + if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0]))) + return this._show.apply(this, arguments); + else { + var o = arguments[1] || {}; o['mode'] = 'show'; + return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]); + } + }, + hide: function() { + if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0]))) + return this._hide.apply(this, arguments); + else { + var o = arguments[1] || {}; o['mode'] = 'hide'; + return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]); + } + }, + toggle: function(){ + if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function)) + return this.__toggle.apply(this, arguments); + else { + var o = arguments[1] || {}; o['mode'] = 'toggle'; + return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]); + } + }, + addClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + toggleClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames); + }, + morph: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + }, + switchClass: function() { + return this.morph.apply(this, arguments); + }, + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + +/* + * jQuery Color Animations + * Copyright 2007 John Resig + * Released under the MIT and GPL licenses. + */ + +// We override the animation for all of these color styles +jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){ + jQuery.fx.step[attr] = function(fx){ + if ( fx.state == 0 ) { + fx.start = getColor( fx.elem, attr ); + fx.end = getRGB( fx.end ); + } + + fx.elem.style[attr] = "rgb(" + [ + Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0) + ].join(",") + ")"; + } +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent'] + + // Otherwise, we're most likely dealing with a named color + return colors[jQuery.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = jQuery.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] +}; + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +jQuery.easing['jswing'] = jQuery.easing['swing']; + +jQuery.extend( jQuery.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright © 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.drop.js b/fannie/src/jquery-ui/development-bundle/ui/effects.drop.js new file mode 100644 index 000000000..62762d4ef --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.drop.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Drop + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.drop = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {opacity: mode == 'show' ? 1 : 0}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.explode.js b/fannie/src/jquery-ui/development-bundle/ui/effects.explode.js new file mode 100644 index 000000000..b6d9ae48a --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.explode.js @@ -0,0 +1,79 @@ +/* + * jQuery UI Effects Explode + * + * Copyright (c) 2008 Paul Bakaus (ui.jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.explode = function(o) { + + return this.queue(function() { + + var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + + o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode; + var el = $(this).show().css('visibility', 'hidden'); + var offset = el.offset(); + + //Substract the margins - not fixing the problem yet. + offset.top -= parseInt(el.css("marginTop")) || 0; + offset.left -= parseInt(el.css("marginLeft")) || 0; + + var width = el.outerWidth(true); + var height = el.outerHeight(true); + + for(var i=0;i<rows;i++) { // = + for(var j=0;j<cells;j++) { // || + el + .clone() + .appendTo('body') + .wrap('<div></div>') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j*(width/cells), + top: -i*(height/rows) + }) + .parent() + .addClass('effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width/cells, + height: height/rows, + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0), + opacity: o.options.mode == 'show' ? 0 : 1 + }).animate({ + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)), + opacity: o.options.mode == 'show' ? 1 : 0 + }, o.duration || 500); + } + } + + // Set a timeout, to call the callback approx. when the other animations have finished + setTimeout(function() { + + o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide(); + if(o.callback) o.callback.apply(el[0]); // Callback + el.dequeue(); + + $('.effects-explode').remove(); + + }, o.duration || 500); + + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.fold.js b/fannie/src/jquery-ui/development-bundle/ui/effects.fold.js new file mode 100644 index 000000000..9fa1e661e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.fold.js @@ -0,0 +1,55 @@ +/* + * jQuery UI Effects Fold + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.fold = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var size = o.options.size || 15; // Default fold size + var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var widthFirst = ((mode == 'show') != horizFirst); + var ref = widthFirst ? ['width', 'height'] : ['height', 'width']; + var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()]; + var percent = /([0-9]+)%/.exec(size); + if(percent) size = parseInt(percent[1]) / 100 * distance[mode == 'hide' ? 0 : 1]; + if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift + + // Animation + var animation1 = {}, animation2 = {}; + animation1[ref[0]] = mode == 'show' ? distance[0] : size; + animation2[ref[1]] = mode == 'show' ? distance[1] : 0; + + // Animate + wrapper.animate(animation1, o.duration / 2, o.options.easing) + .animate(animation2, o.duration / 2, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.highlight.js b/fannie/src/jquery-ui/development-bundle/ui/effects.highlight.js new file mode 100644 index 000000000..cc69f4d48 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.highlight.js @@ -0,0 +1,48 @@ +/* + * jQuery UI Effects Highlight + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * effects.core.js + */ +;(function($) { + +$.effects.highlight = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['backgroundImage','backgroundColor','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var color = o.options.color || "#ffff99"; // Default highlight color + var oldColor = el.css("backgroundColor"); + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + el.css({backgroundImage: 'none', backgroundColor: color}); // Shift + + // Animation + var animation = {backgroundColor: oldColor }; + if (mode == "hide") animation['opacity'] = 0; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == "hide") el.hide(); + $.effects.restore(el, props); + if (mode == "show" && jQuery.browser.msie) this.style.removeAttribute('filter'); + if(o.callback) o.callback.apply(this, arguments); + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.pulsate.js b/fannie/src/jquery-ui/development-bundle/ui/effects.pulsate.js new file mode 100644 index 000000000..6f89f7127 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.pulsate.js @@ -0,0 +1,55 @@ +/* + * jQuery UI Effects Pulsate + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.pulsate = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var times = o.options.times || 5; // Default # of times + + // Adjust + if (mode == 'hide') times--; + if (el.is(':hidden')) { // Show fadeIn + el.css('opacity', 0); + el.show(); // Show + el.animate({opacity: 1}, o.duration / 2, o.options.easing); + times = times-2; + } + + // Animate + for (var i = 0; i < times; i++) { // Pulsate + el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing); + }; + if (mode == 'hide') { // Last Pulse + el.animate({opacity: 0}, o.duration / 2, o.options.easing, function(){ + el.hide(); // Hide + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing, function(){ + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.scale.js b/fannie/src/jquery-ui/development-bundle/ui/effects.scale.js new file mode 100644 index 000000000..216b0172e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.scale.js @@ -0,0 +1,180 @@ +/* + * jQuery UI Effects Scale + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.puff = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var percent = parseInt(o.options.percent) || 150; // Set default puff percent + options.fade = true; // It's not a puff if it doesn't fade! :) + var original = {height: el.height(), width: el.width()}; // Save original + + // Adjust + var factor = percent / 100; + el.from = (mode == 'hide') ? original : {height: original.height * factor, width: original.width * factor}; + + // Animation + options.from = el.from; + options.percent = (mode == 'hide') ? percent : 100; + options.mode = mode; + + // Animate + el.effect('scale', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.scale = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var percent = parseInt(o.options.percent) || (parseInt(o.options.percent) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent + var direction = o.options.direction || 'both'; // Set default axis + var origin = o.options.origin; // The origin of the scaling + if (mode != 'effect') { // Set default origin and restore for show/hide + options.origin = origin || ['middle','center']; + options.restore = true; + } + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state + + // Adjust + var factor = { // Set scaling factor + y: direction != 'horizontal' ? (percent / 100) : 1, + x: direction != 'vertical' ? (percent / 100) : 1 + }; + el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state + + if (o.options.fade) { // Fade option to support puff + if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;}; + if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;}; + }; + + // Animation + options.from = el.from; options.to = el.to; options.mode = mode; + + // Animate + el.effect('size', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.size = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','width','height','overflow','opacity']; + var props1 = ['position','top','left','overflow','opacity']; // Always restore + var props2 = ['width','height','overflow']; // Copy for children + var cProps = ['fontSize']; + var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom']; + var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var restore = o.options.restore || false; // Default restore + var scale = o.options.scale || 'both'; // Default scale mode + var origin = o.options.origin; // The origin of the sizing + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || original; // Default from state + el.to = o.options.to || original; // Default to state + // Adjust + if (origin) { // Calculate baseline shifts + var baseline = $.effects.getBaseline(origin, original); + el.from.top = (original.height - el.from.height) * baseline.y; + el.from.left = (original.width - el.from.width) * baseline.x; + el.to.top = (original.height - el.to.height) * baseline.y; + el.to.left = (original.width - el.to.width) * baseline.x; + }; + var factor = { // Set scaling factor + from: {y: el.from.height / original.height, x: el.from.width / original.width}, + to: {y: el.to.height / original.height, x: el.to.width / original.width} + }; + if (scale == 'box' || scale == 'both') { // Scale the css box + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(vProps); + el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + props = props.concat(hProps); + el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from); + el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to); + }; + }; + if (scale == 'content' || scale == 'both') { // Scale the content + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(cProps); + el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to); + }; + }; + $.effects.save(el, restore ? props : props1); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + el.css('overflow','hidden').css(el.from); // Shift + + // Animate + if (scale == 'content' || scale == 'both') { // Scale the children + vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size + hProps = hProps.concat(['marginLeft','marginRight']); // Add margins + props2 = props.concat(vProps).concat(hProps); // Concat + el.find("*[width]").each(function(){ + child = $(this); + if (restore) $.effects.save(child, props2); + var c_original = {height: child.height(), width: child.width()}; // Save original + child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x}; + child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x}; + if (factor.from.y != factor.to.y) { // Vertical props scaling + child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from); + child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from); + child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to); + }; + child.css(child.from); // Shift children + child.animate(child.to, o.duration, o.options.easing, function(){ + if (restore) $.effects.restore(child, props2); // Restore children + }); // Animate children + }); + }; + + // Animate + el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.shake.js b/fannie/src/jquery-ui/development-bundle/ui/effects.shake.js new file mode 100644 index 000000000..e07366548 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.shake.js @@ -0,0 +1,57 @@ +/* + * jQuery UI Effects Shake + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.shake = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'left'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 3; // Default # of times + var speed = o.duration || o.options.duration || 140; // Default speed per shake + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + + // Animation + var animation = {}, animation1 = {}, animation2 = {}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2; + animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2; + + // Animate + el.animate(animation, speed, o.options.easing); + for (var i = 1; i < times; i++) { // Shakes + el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing); + }; + el.animate(animation1, speed, o.options.easing). + animate(animation, speed / 2, o.options.easing, function(){ // Last shake + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.slide.js b/fannie/src/jquery-ui/development-bundle/ui/effects.slide.js new file mode 100644 index 000000000..357133701 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.slide.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Slide + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.slide = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true})); + if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/effects.transfer.js b/fannie/src/jquery-ui/development-bundle/ui/effects.transfer.js new file mode 100644 index 000000000..9f08f67f9 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/effects.transfer.js @@ -0,0 +1,59 @@ +/* + * jQuery UI Effects Transfer + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.transfer = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var target = $(o.options.to); // Find Target + var position = el.offset(); + var transfer = $('<div class="ui-effects-transfer"></div>').appendTo(document.body); + if(o.options.className) transfer.addClass(o.options.className); + + // Set target css + transfer.addClass(o.options.className); + transfer.css({ + top: position.top, + left: position.left, + height: el.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')), + width: el.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth')), + position: 'absolute' + }); + + // Animation + position = target.offset(); + animation = { + top: position.top, + left: position.left, + height: target.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')), + width: target.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth')) + }; + + // Animate + transfer.animate(animation, o.duration, o.options.easing, function() { + transfer.remove(); // Remove div + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ar.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ar.js new file mode 100644 index 000000000..62478819c --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ar.js @@ -0,0 +1,23 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Al Horani -- koko.dw@gmail.com */ +/* خالد الحوراني -- koko.dw@gmail.com */ +/* NOTE: monthNames are the original months names and thez are the Arabic names, not the new months name ÙØ¨Ø±Ø§ÙŠØ± - يناير and there isnät any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + clearText: 'مسح', clearStatus: 'امسح التاريخ الحالي', + closeText: 'إغلاق', closeStatus: 'إغلاق بدون Ø­ÙØ¸', + prevText: '<السابق', prevStatus: 'عرض الشهر السابق', + nextText: 'التالي>', nextStatus: 'عرض الشهر القادم', + currentText: 'اليوم', currentStatus: 'عرض الشهر الحالي', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + monthStatus: 'عرض شهر آخر', yearStatus: 'عرض سنة آخرى', + weekHeader: 'أسبوع', weekStatus: 'أسبوع السنة', + dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], + dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayStatus: 'اختر DD لليوم الأول من الأسبوع', dateStatus: 'اختر D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'اختر يوم', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-bg.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-bg.js new file mode 100644 index 000000000..59589671e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-bg.js @@ -0,0 +1,22 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = {clearText: 'изчиÑти', clearStatus: 'изчиÑти актуалната дата', + closeText: 'затвори', closeStatus: 'затвори без промени', + prevText: '&#x3c;назад', prevStatus: 'покажи поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¼ÐµÑец', + nextText: 'напред&#x3e;', nextStatus: 'покажи ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð¼ÐµÑец', + currentText: 'днеÑ', currentStatus: '', + monthNames: ['Януари','Февруари','Март','Ðприл','Май','Юни', + 'Юли','ÐвгуÑÑ‚','Септември','Октомври','Ðоември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Ðпр','Май','Юни', + 'Юли','Ðвг','Сеп','Окт','Ðов','Дек'], + monthStatus: 'покажи друг меÑец', yearStatus: 'покажи друга година', + weekHeader: 'Wk', weekStatus: 'Ñедмица от меÑеца', + dayNames: ['ÐеделÑ','Понеделник','Вторник','СрÑда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Ðед','Пон','Вто','СрÑ','Чет','Пет','Съб'], + dayNamesMin: ['Ðе','По','Ð’Ñ‚','Ср','Че','Пе','Съ'], + dayStatus: 'Сложи DD като първи ден от Ñедмицата', dateStatus: 'Избери D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Избери дата', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ca.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ca.js new file mode 100644 index 000000000..46147a497 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ca.js @@ -0,0 +1,22 @@ +/* Inicialització en català per a l'extenció 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = {clearText: 'Netejar', clearStatus: '', + closeText: 'Tancar', closeStatus: '', + prevText: '&lt;Ant', prevStatus: '', + nextText: 'Seg&gt;', nextStatus: '', + currentText: 'Avui', currentStatus: '', + monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'mm/dd/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-cs.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-cs.js new file mode 100644 index 000000000..e195deb43 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-cs.js @@ -0,0 +1,22 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = {clearText: 'Vymazat', clearStatus: 'Vymaže zadané datum', + closeText: 'Zavřít', closeStatus: 'ZavÅ™e kalendář beze zmÄ›ny', + prevText: '&#x3c;Dříve', prevStatus: 'PÅ™ejít na pÅ™edchozí mÄ›sí', + nextText: 'PozdÄ›ji&#x3e;', nextStatus: 'PÅ™ejít na další mÄ›síc', + currentText: 'Nyní', currentStatus: 'PÅ™ejde na aktuální mÄ›síc', + monthNames: ['leden','únor','bÅ™ezen','duben','kvÄ›ten','Äerven', + 'Äervenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bÅ™e','dub','kvÄ›','Äer', + 'Ävc','srp','zář','říj','lis','pro'], + monthStatus: 'PÅ™ejít na jiný mÄ›síc', yearStatus: 'PÅ™ejít na jiný rok', + weekHeader: 'Týd', weekStatus: 'Týden v roce', + dayNames: ['nedÄ›le', 'pondÄ›lí', 'úterý', 'stÅ™eda', 'Ätvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'Ät', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','Ät','pá','so'], + dayStatus: 'Nastavit DD jako první den v týdnu', dateStatus: '\'Vyber\' DD, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Vyberte datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-da.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-da.js new file mode 100644 index 000000000..794f6ef44 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-da.js @@ -0,0 +1,22 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = {clearText: 'Nulstil', clearStatus: 'Nulstil den aktuelle dato', + closeText: 'Luk', closeStatus: 'Luk uden ændringer', + prevText: '&#x3c;Forrige', prevStatus: 'Vis forrige mÃ¥ned', + nextText: 'Næste&#x3e;', nextStatus: 'Vis næste mÃ¥ned', + currentText: 'Idag', currentStatus: 'Vis aktuel mÃ¥ned', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: 'Vis en anden mÃ¥ned', yearStatus: 'Vis et andet Ã¥r', + weekHeader: 'Uge', weekStatus: 'Ã…rets uge', + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + dayStatus: 'Sæt DD som første ugedag', dateStatus: 'Vælg D, M d', + dateFormat: 'dd-mm-yy', firstDay: 0, + initStatus: 'Vælg en dato', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-de.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-de.js new file mode 100644 index 000000000..d31af3a1b --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-de.js @@ -0,0 +1,22 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = {clearText: 'löschen', clearStatus: 'aktuelles Datum löschen', + closeText: 'schließen', closeStatus: 'ohne Änderungen schließen', + prevText: '&#x3c;zurück', prevStatus: 'letzten Monat zeigen', + nextText: 'Vor&#x3e;', nextStatus: 'nächsten Monat zeigen', + currentText: 'heute', currentStatus: '', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + monthStatus: 'anderen Monat anzeigen', yearStatus: 'anderes Jahr anzeigen', + weekHeader: 'Wo', weekStatus: 'Woche des Monats', + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Wähle ein Datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-es.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-es.js new file mode 100644 index 000000000..c5fdd719d --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-es.js @@ -0,0 +1,22 @@ +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = {clearText: 'Limpiar', clearStatus: '', + closeText: 'Cerrar', closeStatus: '', + prevText: '&lt;Ant', prevStatus: '', + nextText: 'Sig&gt;', nextStatus: '', + currentText: 'Hoy', currentStatus: '', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;dabo'], + dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['es']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fi.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fi.js new file mode 100644 index 000000000..550a980aa --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fi.js @@ -0,0 +1,24 @@ +/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpiö (harrikilpio@gmail.com). */ + +$(document).ready(function(){ + $.datepicker.regional['fi'] = { + clearText: 'Tyhjenn&auml;', clearStatus: '', + closeText: 'Sulje', closeStatus: '', + prevText: '&laquo;Edellinen', prevStatus: '', + nextText: 'Seuraava&raquo;', nextStatus: '', + currentText: 'T&auml;n&auml;&auml;n', currentStatus: '', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu', + 'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;', + 'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'], + monthStatus: '', yearStatus: '', + weekHeader: 'Vk', weekStatus: '', + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fr.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fr.js new file mode 100644 index 000000000..936cb8afe --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fr.js @@ -0,0 +1,22 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood@virginbroadband.com.au) and Stéphane Nahmani (sholby@sholby.net). */ +jQuery(function($){ + $.datepicker.regional['fr'] = {clearText: 'Effacer', clearStatus: '', + closeText: 'Fermer', closeStatus: 'Fermer sans modifier', + prevText: '&lt;Préc', prevStatus: 'Voir le mois précédent', + nextText: 'Suiv&gt;', nextStatus: 'Voir le mois suivant', + currentText: 'Courant', currentStatus: 'Voir le mois courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + monthStatus: 'Voir un autre mois', yearStatus: 'Voir un autre année', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + dayStatus: 'Utiliser DD comme premier jour de la semaine', dateStatus: 'Choisir le DD, MM d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'Choisir la date', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-he.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-he.js new file mode 100644 index 000000000..87f55f729 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-he.js @@ -0,0 +1,22 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(document).ready(function(){ + jQuery.datepicker.regional['he'] = {clearText: '× ×§×”', clearStatus: '', + closeText: 'סגור', closeStatus: '', + prevText: '&#x3c;הקוד×', prevStatus: '', + nextText: 'הב×&#x3e;', nextStatus: '', + currentText: 'היו×', currentStatus: '', + monthNames: ['ינו×ר','פברו×ר','מרץ','×פריל','מ××™','יוני', + 'יולי','×וגוסט','ספטמבר','×וקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['ר×שון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + dayNamesMin: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + dayStatus: 'DD', dateStatus: 'DD, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: true}; + jQuery.datepicker.setDefaults($.datepicker.regional['he']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hu.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hu.js new file mode 100644 index 000000000..1d71a3ddf --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hu.js @@ -0,0 +1,22 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquerycalendar@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = {clearText: 'törlés', clearStatus: '', + closeText: 'bezárás', closeStatus: '', + prevText: '&laquo;&nbsp;vissza', prevStatus: '', + nextText: 'elÅ‘re&nbsp;&raquo;', nextStatus: '', + currentText: 'ma', currentStatus: '', + monthNames: ['Január', 'Február', 'Március', 'Ãprilis', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ãpr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Hé', weekStatus: '', + dayNames: ['Vasámap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hy.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hy.js new file mode 100644 index 000000000..aed9f3574 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hy.js @@ -0,0 +1,22 @@ +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = {clearText: 'Õ„Õ¡Ö„Ö€Õ¥Õ¬', clearStatus: '', + closeText: 'Õ“Õ¡Õ¯Õ¥Õ¬', closeStatus: '', + prevText: '&lt;Õ†Õ¡Õ­.', prevStatus: '', + nextText: 'Õ€Õ¡Õ».&gt;', nextStatus: '', + currentText: 'Ô±ÕµÕ½Ö…Ö€', currentStatus: '', + monthNames: ['Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€','Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€Õ«Õ¬','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬Õ«Õ½','Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½','ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€','Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'], + monthNamesShort: ['Õ€Õ¸Ö‚Õ¶Õ¾','Õ“Õ¥Õ¿Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬','Õ•Õ£Õ½','ÕÕ¥Õº','Õ€Õ¸Õ¯','Õ†Õ¸Õµ','Ô´Õ¥Õ¯'], + monthStatus: '', yearStatus: '', + weekHeader: 'Õ‡Ô²Õ', weekStatus: '', + dayNames: ['Õ¯Õ«Ö€Õ¡Õ¯Õ«','Õ¥Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«','Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','Õ¸Ö‚Ö€Õ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'], + dayNamesShort: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + dayNamesMin: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-id.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-id.js new file mode 100644 index 000000000..f8a417a2e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-id.js @@ -0,0 +1,22 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = {clearText: 'kosongkan', clearStatus: 'bersihkan tanggal yang sekarang', + closeText: 'Tutup', closeStatus: 'Tutup tanpa mengubah', + prevText: '&lt;mundur', prevStatus: 'Tampilkan bulan sebelumnya', + nextText: 'maju&gt;', nextStatus: 'Tampilkan bulan berikutnya', + currentText: 'hari ini', currentStatus: 'Tampilkan bulan sekarang', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + monthStatus: 'Tampilkan bulan yang berbeda', yearStatus: 'Tampilkan tahun yang berbeda', + weekHeader: 'Mg', weekStatus: 'Minggu dalam tahun', + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + dayStatus: 'gunakan DD sebagai awal hari dalam minggu', dateStatus: 'pilih le DD, MM d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'Pilih Tanggal', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['id']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-is.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-is.js new file mode 100644 index 000000000..65316eed0 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-is.js @@ -0,0 +1,22 @@ +/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = {clearText: 'Hreinsa', clearStatus: '', + closeText: 'Loka', closeStatus: '', + prevText: '< Fyrri', prevStatus: '', + nextText: 'N&aelig;sti >', nextStatus: '', + currentText: '&Iacute; dag', currentStatus: '', + monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;', + 'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n', + 'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Vika', weekStatus: '', + dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'], + dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'], + dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['is']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-it.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-it.js new file mode 100644 index 000000000..a1ee89599 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-it.js @@ -0,0 +1,22 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Apaella (apaella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = {clearText: 'Svuota', clearStatus: '', + closeText: 'Chiudi', closeStatus: '', + prevText: '&lt;Prec', prevStatus: '', + nextText: 'Succ&gt;', nextStatus: '', + currentText: 'Oggi', currentStatus: '', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gio','Ve','Sa'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ja.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ja.js new file mode 100644 index 000000000..e33909fe5 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ja.js @@ -0,0 +1,22 @@ +/* Japanese (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Milly. */ +jQuery(function($){ + $.datepicker.regional['ja'] = {clearText: '&#21066;&#38500;', clearStatus: '', + closeText: '&#38281;&#12376;&#12427;', closeStatus: '', + prevText: '&lt;&#21069;&#26376;', prevStatus: '', + nextText: '&#27425;&#26376;&gt;', nextStatus: '', + currentText: '&#20170;&#26085;', currentStatus: '', + monthNames: ['1&#26376;','2&#26376;','3&#26376;','4&#26376;','5&#26376;','6&#26376;', + '7&#26376;','8&#26376;','9&#26376;','10&#26376;','11&#26376;','12&#26376;'], + monthNamesShort: ['1&#26376;','2&#26376;','3&#26376;','4&#26376;','5&#26376;','6&#26376;', + '7&#26376;','8&#26376;','9&#26376;','10&#26376;','11&#26376;','12&#26376;'], + monthStatus: '', yearStatus: '', + weekHeader: 'Wk', weekStatus: '', + dayNames: ['&#26085;','&#26376;','&#28779;','&#27700;','&#26408;','&#37329;','&#22303;'], + dayNamesShort: ['&#26085;','&#26376;','&#28779;','&#27700;','&#26408;','&#37329;','&#22303;'], + dayNamesMin: ['&#26085;','&#26376;','&#28779;','&#27700;','&#26408;','&#37329;','&#22303;'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy/mm/dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ko.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ko.js new file mode 100644 index 000000000..1381e66b7 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ko.js @@ -0,0 +1,22 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = {clearText: '지우기', clearStatus: '', + closeText: '닫기', closeStatus: '', + prevText: 'ì´ì „달', prevStatus: '', + nextText: '다ìŒë‹¬', nextStatus: '', + currentText: '오늘', currentStatus: '', + monthNames: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + monthNamesShort: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + monthStatus: '', yearStatus: '', + weekHeader: 'Wk', weekStatus: '', + dayNames: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesShort: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesMin: ['ì¼','ì›”','í™”','수','목','금','토'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lt.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lt.js new file mode 100644 index 000000000..120e82b2f --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lt.js @@ -0,0 +1,25 @@ +/** + * Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. + * + * @author Arturas Paleicikas <arturas@avalon.lt> + */ +jQuery(function($){ + $.datepicker.regional['lt'] = {clearText: 'IÅ¡valyti', clearStatus: '', + closeText: 'Uždaryti', closeStatus: '', + prevText: '&lt;Atgal', prevStatus: '', + nextText: 'Pirmyn&gt;', nextStatus: '', + currentText: 'Å iandien', currentStatus: '', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','RugpjÅ«tis','RugsÄ—jis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + monthStatus: '', yearStatus: '', + weekHeader: '', weekStatus: '', + dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','Å¡eÅ¡'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lv.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lv.js new file mode 100644 index 000000000..0a386ec60 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lv.js @@ -0,0 +1,25 @@ +/** + * Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. + * @author Arturas Paleicikas <arturas.paleicikas@metasite.net> + */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + clearText: 'NotÄ«rÄ«t', clearStatus: '', + closeText: 'AizvÄ“rt', closeStatus: '', + prevText: 'Iepr', prevStatus: '', + nextText: 'NÄka', nextStatus: '', + currentText: 'Å odien', currentStatus: '', + monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs', + 'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n', + 'JÅ«l','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Nav', weekStatus: '', + dayNames: ['svÄ“tdiena','pirmdiena','otrdiena','treÅ¡diena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd-mm-yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-nl.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-nl.js new file mode 100644 index 000000000..0d52d6f33 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-nl.js @@ -0,0 +1,21 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +jQuery(function($){ + $.datepicker.regional['nl'] = {clearText: 'Wissen', clearStatus: 'Wis de huidige datum', + closeText: 'Sluiten', closeStatus: 'Sluit zonder verandering', + prevText: '&lt;Terug', prevStatus: 'Laat de voorgaande maand zien', + nextText: 'Volgende&gt;', nextStatus: 'Laat de volgende maand zien', + currentText: 'Vandaag', currentStatus: 'Laat de huidige maand zien', + monthNames: ['Januari','Februari','Maart','April','Mei','Juni', + 'Juli','Augustus','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mrt','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: 'Laat een andere maand zien', yearStatus: 'Laat een ander jaar zien', + weekHeader: 'Wk', weekStatus: 'Week van het jaar', + dayNames: ['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'], + dayNamesShort: ['Zon','Maa','Din','Woe','Don','Vri','Zat'], + dayNamesMin: ['Zo','Ma','Di','Wo','Do','Vr','Za'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Kies een datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['nl']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-no.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-no.js new file mode 100644 index 000000000..42932b0f9 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-no.js @@ -0,0 +1,23 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +$(document).ready(function(){ + $.datepicker.regional['no'] = {clearText: 'Tøm', clearStatus: '', + closeText: 'Lukk', closeStatus: '', + prevText: '&laquo;Forrige', prevStatus: '', + nextText: 'Neste&raquo;', nextStatus: '', + currentText: 'I dag', currentStatus: '', + monthNames: ['Januar','Februar','Mars','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Uke', weekStatus: '', + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pl.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pl.js new file mode 100644 index 000000000..bb3112d96 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pl.js @@ -0,0 +1,22 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = {clearText: 'Wyczyść', clearStatus: 'Wyczyść obecnÄ… datÄ™', + closeText: 'Zamknij', closeStatus: 'Zamknij bez zapisywania', + prevText: '&#x3c;Poprzedni', prevStatus: 'Pokaż poprzedni miesiÄ…c', + nextText: 'NastÄ™pny&#x3e;', nextStatus: 'Pokaż nastÄ™pny miesiÄ…c', + currentText: 'DziÅ›', currentStatus: 'Pokaż aktualny miesiÄ…c', + monthNames: ['StyczeÅ„','Luty','Marzec','KwiecieÅ„','Maj','Czerwiec', + 'Lipiec','SierpieÅ„','WrzesieÅ„','Październik','Listopad','GrudzieÅ„'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + monthStatus: 'Pokaż inny miesiÄ…c', yearStatus: 'Pokaż inny rok', + weekHeader: 'Tydz', weekStatus: 'TydzieÅ„ roku', + dayNames: ['Niedziela','Poniedzialek','Wtorek','Åšroda','Czwartek','PiÄ…tek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Åšr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Åšr','Cz','Pt','So'], + dayStatus: 'Ustaw DD jako pierwszy dzieÅ„ tygodnia', dateStatus: 'Wybierz D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: 'Wybierz datÄ™', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pt-BR.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pt-BR.js new file mode 100644 index 000000000..457341983 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pt-BR.js @@ -0,0 +1,22 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = {clearText: 'Limpar', clearStatus: '', + closeText: 'Fechar', closeStatus: '', + prevText: '&lt;Anterior', prevStatus: '', + nextText: 'Pr&oacute;ximo&gt;', nextStatus: '', + currentText: 'Hoje', currentStatus: '', + monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ro.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ro.js new file mode 100644 index 000000000..5902596af --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ro.js @@ -0,0 +1,22 @@ +/* Romanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Edmond L. (ll_edmond@walla.com). */ +jQuery(function($){ + $.datepicker.regional['ro'] = {clearText: 'Curat', clearStatus: 'Sterge data curenta', + closeText: 'Inchide', closeStatus: 'Inchide fara schimbare', + prevText: '&#x3c;Anterior', prevStatus: 'Arata luna trecuta', + nextText: 'Urmator&#x3e;', nextStatus: 'Arata luna urmatoare', + currentText: 'Azi', currentStatus: 'Arata luna curenta', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Junie', + 'Julie','August','Septembrie','Octobrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Noi', 'Dec'], + monthStatus: 'Arata o luna diferita', yearStatus: 'Arat un an diferit', + weekHeader: 'Sapt', weekStatus: 'Saptamana anului', + dayNames: ['Duminica', 'Luni', 'Marti', 'Miercuri', 'Joi', 'Vineri', 'Sambata'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sam'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sa'], + dayStatus: 'Seteaza DD ca prima saptamana zi', dateStatus: 'Selecteaza D, M d', + dateFormat: 'mm/dd/yy', firstDay: 0, + initStatus: 'Selecteaza o data', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ru.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ru.js new file mode 100644 index 000000000..1b6518c50 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ru.js @@ -0,0 +1,22 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = {clearText: 'ОчиÑтить', clearStatus: '', + closeText: 'Закрыть', closeStatus: '', + prevText: '&lt;Пред', prevStatus: '', + nextText: 'След&gt;', nextStatus: '', + currentText: 'СегоднÑ', currentStatus: '', + monthNames: ['Январь','Февраль','Март','Ðпрель','Май','Июнь', + 'Июль','ÐвгуÑÑ‚','СентÑбрь','ОктÑбрь','ÐоÑбрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Ðпр','Май','Июн', + 'Июл','Ðвг','Сен','Окт','ÐоÑ','Дек'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ðе', weekStatus: '', + dayNames: ['воÑкреÑенье','понедельник','вторник','Ñреда','четверг','пÑтница','Ñуббота'], + dayNamesShort: ['вÑк','пнд','втр','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ð’Ñ','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sk.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sk.js new file mode 100644 index 000000000..c486fd7bb --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sk.js @@ -0,0 +1,22 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = {clearText: 'ZmazaÅ¥', clearStatus: '', + closeText: 'ZavrieÅ¥', closeStatus: '', + prevText: '&lt;Predchádzajúci', prevStatus: '', + nextText: 'Nasledujúci&gt;', nextStatus: '', + currentText: 'Dnes', currentStatus: '', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ty', weekStatus: '', + dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sv.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sv.js new file mode 100644 index 000000000..7842a63cc --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sv.js @@ -0,0 +1,22 @@ +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = {clearText: 'Rensa', clearStatus: '', + closeText: 'Stäng', closeStatus: '', + prevText: '&laquo;Förra', prevStatus: '', + nextText: 'Nästa&raquo;', nextStatus: '', + currentText: 'Idag', currentStatus: '', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ve', weekStatus: '', + dayNamesShort: ['Sön','MÃ¥n','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','MÃ¥ndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','MÃ¥','Ti','On','To','Fr','Lö'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-th.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-th.js new file mode 100644 index 000000000..cfbf0ccc7 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-th.js @@ -0,0 +1,22 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = {clearText: 'ลบ', clearStatus: '', + closeText: 'ปิด', closeStatus: '', + prevText: '&laquo;&nbsp;ย้อน', prevStatus: '', + nextText: 'ถัดไป&nbsp;&raquo;', nextStatus: '', + currentText: 'วันนี้', currentStatus: '', + monthNames: ['มà¸à¸£à¸²à¸„ม','à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'à¸à¸£à¸à¸à¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'], + monthNamesShort: ['ม.ค.','à¸.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'à¸.ค.','ส.ค.','à¸.ย.','ต.ค.','พ.ย.','ธ.ค.'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุà¸à¸£à¹Œ','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['th']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-tr.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-tr.js new file mode 100644 index 000000000..80670d14b --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-tr.js @@ -0,0 +1,22 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = {clearText: 'temizle', clearStatus: 'geçerli tarihi temizler', + closeText: 'kapat', closeStatus: 'sadece göstergeyi kapat', + prevText: '&#x3c;geri', prevStatus: 'önceki ayı göster', + nextText: 'ileri&#x3e', nextStatus: 'sonraki ayı göster', + currentText: 'bugün', currentStatus: '', + monthNames: ['Ocak','Åžubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','AÄŸustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Åžub','Mar','Nis','May','Haz', + 'Tem','AÄŸu','Eyl','Eki','Kas','Ara'], + monthStatus: 'baÅŸka ay', yearStatus: 'baÅŸka yıl', + weekHeader: 'Hf', weekStatus: 'Ayın haftaları', + dayNames: ['Pazar','Pazartesi','Salı','ÇarÅŸamba','PerÅŸembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayStatus: 'Haftanın ilk gününü belirleyin', dateStatus: 'D, M d seçiniz', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Bir tarih seçiniz', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-uk.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-uk.js new file mode 100644 index 000000000..d65e5d35d --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-uk.js @@ -0,0 +1,22 @@ +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = {clearText: 'ОчиÑтити', clearStatus: '', + closeText: 'Закрити', closeStatus: '', + prevText: '&lt;&lt;', prevStatus: '', + nextText: '&gt;&gt;', nextStatus: '', + currentText: 'Сьогодні', currentStatus: '', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','ВереÑень','Жовтень','ЛиÑтопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','ЛиÑ','Гру'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ðе', weekStatus: '', + dayNames: ['неділÑ','понеділок','вівторок','Ñереда','четвер','пÑтницÑ','Ñуббота'], + dayNamesShort: ['нед','пнд','вів','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ðд','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +}); \ No newline at end of file diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-CN.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-CN.js new file mode 100644 index 000000000..05dad7244 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-CN.js @@ -0,0 +1,22 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = {clearText: '清除', clearStatus: '清除已选日期', + closeText: '关闭', closeStatus: '䏿”¹å˜å½“å‰é€‰æ‹©', + prevText: '&lt;上月', prevStatus: '显示上月', + nextText: '下月&gt;', nextStatus: '显示下月', + currentText: '今天', currentStatus: '显示本月', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + monthStatus: '选择月份', yearStatus: '选择年份', + weekHeader: '周', weekStatus: '年内周次', + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + dayStatus: '设置 DD 为一周起始', dateStatus: '选择 m月 dæ—¥, DD', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '请选择日期', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-TW.js b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-TW.js new file mode 100644 index 000000000..d1bca8d04 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-TW.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + clearText: '清除', clearStatus: 'æ¸…é™¤å·²é¸æ—¥æœŸ', + closeText: '關閉', closeStatus: '䏿”¹è®Šç›®å‰çš„鏿“‡', + prevText: '&lt;上月', prevStatus: '顯示上月', + nextText: '下月&gt;', nextStatus: '顯示下月', + currentText: '今天', currentStatus: '顯示本月', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + monthStatus: '鏿“‡æœˆä»½', yearStatus: '鏿“‡å¹´ä»½', + weekHeader: '周', weekStatus: '年內周次', + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + dayStatus: '設定 DD 為一周起始', dateStatus: '鏿“‡ m月 dæ—¥, DD', + dateFormat: 'yy/mm/dd', firstDay: 1, + initStatus: 'è«‹é¸æ“‡æ—¥æœŸ', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/fannie/src/jquery-ui/development-bundle/ui/jquery-ui-1.5.3.custom.js b/fannie/src/jquery-ui/development-bundle/ui/jquery-ui-1.5.3.custom.js new file mode 100644 index 000000000..7be8f4d15 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/jquery-ui-1.5.3.custom.js @@ -0,0 +1,7616 @@ +/* + * jQuery UI 1.5.3 + * + * Copyright (c) 2008 Paul Bakaus (ui.jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +;(function($) { + +$.ui = { + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + cssCache: {}, + css: function(name) { + if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; } + var tmp = $('<div class="ui-gen">').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body'); + + //if (!$.browser.safari) + //tmp.appendTo('body'); + + //Opera and Safari set width and height to 0px instead of auto + //Safari returns rgba(0,0,0,0) when bgcolor is not set + $.ui.cssCache[name] = !!( + (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || + !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))) + ); + try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){} + return $.ui.cssCache[name]; + }, + disableSelection: function(el) { + $(el).attr('unselectable', 'on').css('MozUserSelect', 'none'); + }, + enableSelection: function(el) { + $(el).attr('unselectable', 'off').css('MozUserSelect', ''); + }, + hasScroll: function(e, a) { + var scroll = /top/.test(a||"top") ? 'scrollTop' : 'scrollLeft', has = false; + if (e[scroll] > 0) return true; e[scroll] = 1; + has = e[scroll] > 0 ? true : false; e[scroll] = 0; + return has; + } +}; + + +/** jQuery core modifications and additions **/ + +var _remove = $.fn.remove; +$.fn.remove = function() { + $("*", this).add(this).triggerHandler("remove"); + return _remove.apply(this, arguments ); +}; + +// $.widget is a factory to create jQuery plugins +// taking some boilerplate code out of the plugin code +// created by Scott González and Jörn Zaefferer +function getter(namespace, plugin, method) { + var methods = $[namespace][plugin].getter || []; + methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods); + return ($.inArray(method, methods) != -1); +} + +$.widget = function(name, prototype) { + var namespace = name.split(".")[0]; + name = name.split(".")[1]; + + // create plugin method + $.fn[name] = function(options) { + var isMethodCall = (typeof options == 'string'), + args = Array.prototype.slice.call(arguments, 1); + + if (isMethodCall && getter(namespace, name, options)) { + var instance = $.data(this[0], name); + return (instance ? instance[options].apply(instance, args) + : undefined); + } + + return this.each(function() { + var instance = $.data(this, name); + if (isMethodCall && instance && $.isFunction(instance[options])) { + instance[options].apply(instance, args); + } else if (!isMethodCall) { + $.data(this, name, new $[namespace][name](this, options)); + } + }); + }; + + // create widget constructor + $[namespace][name] = function(element, options) { + var self = this; + + this.widgetName = name; + this.widgetBaseClass = namespace + '-' + name; + + this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, options); + this.element = $(element) + .bind('setData.' + name, function(e, key, value) { + return self.setData(key, value); + }) + .bind('getData.' + name, function(e, key) { + return self.getData(key); + }) + .bind('remove', function() { + return self.destroy(); + }); + this.init(); + }; + + // add widget prototype + $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); +}; + +$.widget.prototype = { + init: function() {}, + destroy: function() { + this.element.removeData(this.widgetName); + }, + + getData: function(key) { + return this.options[key]; + }, + setData: function(key, value) { + this.options[key] = value; + + if (key == 'disabled') { + this.element[value ? 'addClass' : 'removeClass']( + this.widgetBaseClass + '-disabled'); + } + }, + + enable: function() { + this.setData('disabled', false); + }, + disable: function() { + this.setData('disabled', true); + } +}; + +$.widget.defaults = { + disabled: false +}; + + +/** Mouse Interaction Plugin **/ + +$.ui.mouse = { + mouseInit: function() { + var self = this; + + this.element.bind('mousedown.'+this.widgetName, function(e) { + return self.mouseDown(e); + }); + + // Prevent text selection in IE + if ($.browser.msie) { + this._mouseUnselectable = this.element.attr('unselectable'); + this.element.attr('unselectable', 'on'); + } + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + + // Restore text selection in IE + ($.browser.msie + && this.element.attr('unselectable', this._mouseUnselectable)); + }, + + mouseDown: function(e) { + // we may have missed mouseup (out of window) + (this._mouseStarted && this.mouseUp(e)); + + this._mouseDownEvent = e; + + var self = this, + btnIsLeft = (e.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).parents().add(e.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) { + return true; + } + + this._mouseDelayMet = !this.options.delay; + if (!this._mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self._mouseDelayMet = true; + }, this.options.delay); + } + + if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) { + this._mouseStarted = (this.mouseStart(e) !== false); + if (!this._mouseStarted) { + e.preventDefault(); + return true; + } + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(e) { + return self.mouseMove(e); + }; + this._mouseUpDelegate = function(e) { + return self.mouseUp(e); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + return false; + }, + + mouseMove: function(e) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !e.button) { + return this.mouseUp(e); + } + + if (this._mouseStarted) { + this.mouseDrag(e); + return false; + } + + if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) { + this._mouseStarted = + (this.mouseStart(this._mouseDownEvent, e) !== false); + (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e)); + } + + return !this._mouseStarted; + }, + + mouseUp: function(e) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + this.mouseStop(e); + } + + return false; + }, + + mouseDistanceMet: function(e) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - e.pageX), + Math.abs(this._mouseDownEvent.pageY - e.pageY) + ) >= this.options.distance + ); + }, + + mouseDelayMet: function(e) { + return this._mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + mouseStart: function(e) {}, + mouseDrag: function(e) {}, + mouseStop: function(e) {}, + mouseCapture: function(e) { return true; } +}; + +$.ui.mouse.defaults = { + cancel: null, + distance: 1, + delay: 0 +}; + +})(jQuery); +/* + * jQuery UI Draggable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.draggable", $.extend({}, $.ui.mouse, { + init: function() { + + //Initialize needed constants + var o = this.options; + + //Position the node + if (o.helper == 'original' && !(/(relative|absolute|fixed)/).test(this.element.css('position'))) + this.element.css('position', 'relative'); + + this.element.addClass('ui-draggable'); + (o.disabled && this.element.addClass('ui-draggable-disabled')); + + this.mouseInit(); + + }, + mouseStart: function(e) { + var o = this.options; + + if (this.helper || o.disabled || $(e.target).is('.ui-resizable-handle')) return false; + + var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; + + + $(this.options.handle, this.element).find("*").andSelf().each(function() { + if(this == e.target) handle = true; + }); + if (!handle) return false; + + if($.ui.ddmanager) $.ui.ddmanager.current = this; + + //Create and append the visible helper + this.helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [e])) : (o.helper == 'clone' ? this.element.clone() : this.element); + if(!this.helper.parents('body').length) this.helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); + if(this.helper[0] != this.element[0] && !(/(fixed|absolute)/).test(this.helper.css("position"))) this.helper.css("position", "absolute"); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + this.margins = { //Cache the margins + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0) + }; + + this.cssPosition = this.helper.css("position"); //Store the helper's css position + this.offset = this.element.offset(); //The element's absolute position on the page + this.offset = { //Substract the margins from the element's absolute offset + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + this.offset.click = { //Where the click happened, relative to the element + left: e.pageX - this.offset.left, + top: e.pageY - this.offset.top + }; + + this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); //Get the offsetParent and cache its position + if(this.offsetParent[0] == document.body && $.browser.mozilla) po = { top: 0, left: 0 }; //Ugly FF3 fix + this.offset.parent = { //Store its position plus border + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + var p = this.element.position(); //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helpers + this.offset.relative = this.cssPosition == "relative" ? { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.offsetParent[0].scrollTop, + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.offsetParent[0].scrollLeft + } : { top: 0, left: 0 }; + + this.originalPosition = this.generatePosition(e); //Generate the original position + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size + + if(o.cursorAt) { + if(o.cursorAt.left != undefined) this.offset.click.left = o.cursorAt.left + this.margins.left; + if(o.cursorAt.right != undefined) this.offset.click.left = this.helperProportions.width - o.cursorAt.right + this.margins.left; + if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top + this.margins.top; + if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom + this.margins.top; + } + + + /* + * - Position constraining - + * Here we prepare position constraining like grid and containment. + */ + + if(o.containment) { + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top, + co.left+Math.max(ce.scrollWidth,ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), + co.top+Math.max(ce.scrollHeight,ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) + ]; + } + } + + //Call plugins and callbacks + this.propagate("start", e); + + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Recache the helper size + if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e); + + this.helper.addClass("ui-draggable-dragging"); + this.mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + }, + convertPositionTo: function(d, pos) { + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + return { + top: ( + pos.top // the calculated relative position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollTop) * mod // The offsetParent's scroll position, not if the element is fixed + + (this.cssPosition == "fixed" ? $(document).scrollTop() : 0) * mod + + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods) + ), + left: ( + pos.left // the calculated relative position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollLeft) * mod // The offsetParent's scroll position, not if the element is fixed + + (this.cssPosition == "fixed" ? $(document).scrollLeft() : 0) * mod + + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods) + ) + }; + }, + generatePosition: function(e) { + + var o = this.options; + var position = { + top: ( + e.pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollTop) // The offsetParent's scroll position, not if the element is fixed + - (this.cssPosition == "fixed" ? $(document).scrollTop() : 0) + ), + left: ( + e.pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollLeft) // The offsetParent's scroll position, not if the element is fixed + - (this.cssPosition == "fixed" ? $(document).scrollLeft() : 0) + ) + }; + + if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + if(this.containment) { + if(position.left < this.containment[0]) position.left = this.containment[0]; + if(position.top < this.containment[1]) position.top = this.containment[1]; + if(position.left > this.containment[2]) position.left = this.containment[2]; + if(position.top > this.containment[3]) position.top = this.containment[3]; + } + + if(o.grid) { + var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1]; + position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0]; + position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + return position; + }, + mouseDrag: function(e) { + + //Compute the helpers position + this.position = this.generatePosition(e); + this.positionAbs = this.convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + this.position = this.propagate("drag", e) || this.position; + + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + if($.ui.ddmanager) $.ui.ddmanager.drag(this, e); + + return false; + }, + mouseStop: function(e) { + + //If we are using droppables, inform the manager about the drop + var dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) + var dropped = $.ui.ddmanager.drop(this, e); + + if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true) { + var self = this; + $(this.helper).animate(this.originalPosition, parseInt(this.options.revert, 10) || 500, function() { + self.propagate("stop", e); + self.clear(); + }); + } else { + this.propagate("stop", e); + this.clear(); + } + + return false; + }, + clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.options.helper != 'original' && !this.cancelHelperRemoval) this.helper.remove(); + //if($.ui.ddmanager) $.ui.ddmanager.current = null; + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + plugins: {}, + uiHash: function(e) { + return { + helper: this.helper, + position: this.position, + absolutePosition: this.positionAbs, + options: this.options + }; + }, + propagate: function(n,e) { + $.ui.plugin.call(this, n, [e, this.uiHash()]); + if(n == "drag") this.positionAbs = this.convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins + return this.element.triggerHandler(n == "drag" ? n : "drag"+n, [e, this.uiHash()], this.options[n]); + }, + destroy: function() { + if(!this.element.data('draggable')) return; + this.element.removeData("draggable").unbind(".draggable").removeClass('ui-draggable'); + this.mouseDestroy(); + } +})); + +$.extend($.ui.draggable, { + defaults: { + appendTo: "parent", + axis: false, + cancel: ":input", + delay: 0, + distance: 1, + helper: "original" + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function(e, ui) { + var t = $('body'); + if (t.css("cursor")) ui.options._cursor = t.css("cursor"); + t.css("cursor", ui.options.cursor); + }, + stop: function(e, ui) { + if (ui.options._cursor) $('body').css("cursor", ui.options._cursor); + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(e, ui) { + var t = $(ui.helper); + if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex"); + t.css('zIndex', ui.options.zIndex); + }, + stop: function(e, ui) { + if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex); + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(e, ui) { + var t = $(ui.helper); + if(t.css("opacity")) ui.options._opacity = t.css("opacity"); + t.css('opacity', ui.options.opacity); + }, + stop: function(e, ui) { + if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity); + } +}); + +$.ui.plugin.add("draggable", "iframeFix", { + start: function(e, ui) { + $(ui.options.iframeFix === true ? "iframe" : ui.options.iframeFix).each(function() { + $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>') + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + }, + stop: function(e, ui) { + $("div.DragDropIframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function(e, ui) { + var o = ui.options; + var i = $(this).data("draggable"); + o.scrollSensitivity = o.scrollSensitivity || 20; + o.scrollSpeed = o.scrollSpeed || 20; + + i.overflowY = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(this); + i.overflowX = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(this); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') i.overflowYOffset = i.overflowY.offset(); + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') i.overflowXOffset = i.overflowX.offset(); + + }, + drag: function(e, ui) { + + var o = ui.options; + var i = $(this).data("draggable"); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') { + if((i.overflowYOffset.top + i.overflowY[0].offsetHeight) - e.pageY < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed; + if(e.pageY - i.overflowYOffset.top < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed; + + } else { + if(e.pageY - $(document).scrollTop() < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') { + if((i.overflowXOffset.left + i.overflowX[0].offsetWidth) - e.pageX < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed; + if(e.pageX - i.overflowXOffset.left < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed; + } else { + if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function(e, ui) { + + var inst = $(this).data("draggable"); + inst.snapElements = []; + $(ui.options.snap === true ? '.ui-draggable' : ui.options.snap).each(function() { + var $t = $(this); var $o = $t.offset(); + if(this != inst.element[0]) inst.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + }); + + }, + drag: function(e, ui) { + + var inst = $(this).data("draggable"); + var d = ui.options.snapTolerance || 20; + var x1 = ui.absolutePosition.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.absolutePosition.top, y2 = y1 + inst.helperProportions.height; + + for (var i = inst.snapElements.length - 1; i >= 0; i--){ + + var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, + t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; + + //Yes, I know, this is insane ;) + if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) continue; + + if(ui.options.snapMode != 'inner') { + var ts = Math.abs(t - y2) <= 20; + var bs = Math.abs(b - y1) <= 20; + var ls = Math.abs(l - x2) <= 20; + var rs = Math.abs(r - x1) <= 20; + if(ts) ui.position.top = inst.convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top; + if(bs) ui.position.top = inst.convertPositionTo("relative", { top: b, left: 0 }).top; + if(ls) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left; + if(rs) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: r }).left; + } + + if(ui.options.snapMode != 'outer') { + var ts = Math.abs(t - y1) <= 20; + var bs = Math.abs(b - y2) <= 20; + var ls = Math.abs(l - x1) <= 20; + var rs = Math.abs(r - x2) <= 20; + if(ts) ui.position.top = inst.convertPositionTo("relative", { top: t, left: 0 }).top; + if(bs) ui.position.top = inst.convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top; + if(ls) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: l }).left; + if(rs) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left; + } + + }; + } +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(e,ui) { + + var inst = $(this).data("draggable"); + inst.sortables = []; + $(ui.options.connectToSortable).each(function() { + if($.data(this, 'sortable')) { + var sortable = $.data(this, 'sortable'); + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable.refreshItems(); //Do a one-time refresh at start to refresh the containerCache + sortable.propagate("activate", e, inst); + } + }); + + }, + stop: function(e,ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("draggable"); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + this.instance.isOver = 0; + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + if(this.shouldRevert) this.instance.options.revert = true; //revert here + this.instance.mouseStop(e); + + //Also propagate receive event, since the sortable is actually receiving a element + this.instance.element.triggerHandler("sortreceive", [e, $.extend(this.instance.ui(), { sender: inst.element })], this.instance.options["receive"]); + + this.instance.options.helper = this.instance.options._helper; + } else { + this.instance.propagate("deactivate", e, inst); + } + + }); + + }, + drag: function(e,ui) { + + var inst = $(this).data("draggable"), self = this; + + var checkPos = function(o) { + + var l = o.left, r = l + o.width, + t = o.top, b = t + o.height; + + return (l < (this.positionAbs.left + this.offset.click.left) && (this.positionAbs.left + this.offset.click.left) < r + && t < (this.positionAbs.top + this.offset.click.top) && (this.positionAbs.top + this.offset.click.top) < b); + }; + + $.each(inst.sortables, function(i) { + + if(checkPos.call(inst, this.instance.containerCache)) { + + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + this.instance.isOver = 1; + + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + e.target = this.instance.currentItem[0]; + this.instance.mouseCapture(e, true); + this.instance.mouseStart(e, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst.propagate("toSortable", e); + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) this.instance.mouseDrag(e); + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + this.instance.options.revert = false; //No revert here + this.instance.mouseStop(e, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) this.instance.placeholder.remove(); + + inst.propagate("fromSortable", e); + } + + }; + + }); + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function(e,ui) { + var group = $.makeArray($(ui.options.stack.group)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || ui.options.stack.min) - (parseInt($(b).css("zIndex"),10) || ui.options.stack.min); + }); + + $(group).each(function(i) { + this.style.zIndex = ui.options.stack.min + i; + }); + + this[0].style.zIndex = ui.options.stack.min + group.length; + } +}); + +})(jQuery); +/* + * jQuery UI Droppable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * ui.core.js + * ui.draggable.js + */ +(function($) { + +$.widget("ui.droppable", { + init: function() { + + this.element.addClass("ui-droppable"); + this.isover = 0; this.isout = 1; + + //Prepare the passed options + var o = this.options, accept = o.accept; + o = $.extend(o, { + accept: o.accept && o.accept.constructor == Function ? o.accept : function(d) { + return $(d).is(accept); + } + }); + + //Store the droppable's proportions + this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables.push(this); + + }, + plugins: {}, + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + absolutePosition: c.positionAbs, + options: this.options, + element: this.element + }; + }, + destroy: function() { + var drop = $.ui.ddmanager.droppables; + for ( var i = 0; i < drop.length; i++ ) + if ( drop[i] == this ) + drop.splice(i, 1); + + this.element + .removeClass("ui-droppable ui-droppable-disabled") + .removeData("droppable") + .unbind(".droppable"); + }, + over: function(e) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + $.ui.plugin.call(this, 'over', [e, this.ui(draggable)]); + this.element.triggerHandler("dropover", [e, this.ui(draggable)], this.options.over); + } + + }, + out: function(e) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + $.ui.plugin.call(this, 'out', [e, this.ui(draggable)]); + this.element.triggerHandler("dropout", [e, this.ui(draggable)], this.options.out); + } + + }, + drop: function(e,custom) { + + var draggable = custom || $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element + + var childrenIntersection = false; + this.element.find(".ui-droppable").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, 'droppable'); + if(inst.options.greedy && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)) { + childrenIntersection = true; return false; + } + }); + if(childrenIntersection) return false; + + if(this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + $.ui.plugin.call(this, 'drop', [e, this.ui(draggable)]); + this.element.triggerHandler("drop", [e, this.ui(draggable)], this.options.drop); + return true; + } + + return false; + + }, + activate: function(e) { + + var draggable = $.ui.ddmanager.current; + $.ui.plugin.call(this, 'activate', [e, this.ui(draggable)]); + if(draggable) this.element.triggerHandler("dropactivate", [e, this.ui(draggable)], this.options.activate); + + }, + deactivate: function(e) { + + var draggable = $.ui.ddmanager.current; + $.ui.plugin.call(this, 'deactivate', [e, this.ui(draggable)]); + if(draggable) this.element.triggerHandler("dropdeactivate", [e, this.ui(draggable)], this.options.deactivate); + + } +}); + +$.extend($.ui.droppable, { + defaults: { + disabled: false, + tolerance: 'intersect' + } +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) return false; + + var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, + y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height; + var l = droppable.offset.left, r = l + droppable.proportions.width, + t = droppable.offset.top, b = t + droppable.proportions.height; + + switch (toleranceMode) { + case 'fit': + return (l < x1 && x2 < r + && t < y1 && y2 < b); + break; + case 'intersect': + return (l < x1 + (draggable.helperProportions.width / 2) // Right Half + && x2 - (draggable.helperProportions.width / 2) < r // Left Half + && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half + && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + break; + case 'pointer': + return (l < ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left) && ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left) < r + && t < ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top) && ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top) < b); + break; + case 'touch': + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + break; + default: + return false; + break; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: [], + prepareOffsets: function(t, e) { + + var m = $.ui.ddmanager.droppables; + var type = e ? e.type : null; // workaround for #2317 + + for (var i = 0; i < m.length; i++) { + if(m[i].options.disabled || (t && !m[i].options.accept.call(m[i].element,(t.currentItem || t.element)))) continue; + m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue + m[i].offset = m[i].element.offset(); + m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; + + if(type == "dragstart" || type == "sortactivate") m[i].activate.call(m[i], e); //Activate the droppable if used directly from draggables + } + + }, + drop: function(draggable, e) { + + var dropped = false; + $.each($.ui.ddmanager.droppables, function() { + + if(!this.options) return; + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) + dropped = this.drop.call(this, e); + + if (!this.options.disabled && this.visible && this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + this.isout = 1; this.isover = 0; + this.deactivate.call(this, e); + } + + }); + return dropped; + + }, + drag: function(draggable, e) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, e); + + //Run through all droppables and check their positions based on specific tolerance options + + $.each($.ui.ddmanager.droppables, function() { + + if(this.options.disabled || this.greedyChild || !this.visible) return; + var intersects = $.ui.intersect(draggable, this, this.options.tolerance); + + var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null); + if(!c) return; + + var parentInstance; + if (this.options.greedy) { + var parent = this.element.parents('.ui-droppable:eq(0)'); + if (parent.length) { + parentInstance = $.data(parent[0], 'droppable'); + parentInstance.greedyChild = (c == 'isover' ? 1 : 0); + } + } + + // we just moved into a greedy child + if (parentInstance && c == 'isover') { + parentInstance['isover'] = 0; + parentInstance['isout'] = 1; + parentInstance.out.call(parentInstance, e); + } + + this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0; + this[c == "isover" ? "over" : "out"].call(this, e); + + // we just moved out of a greedy child + if (parentInstance && c == 'isout') { + parentInstance['isout'] = 0; + parentInstance['isover'] = 1; + parentInstance.over.call(parentInstance, e); + } + }); + + } +}; + +/* + * Droppable Extensions + */ + +$.ui.plugin.add("droppable", "activeClass", { + activate: function(e, ui) { + $(this).addClass(ui.options.activeClass); + }, + deactivate: function(e, ui) { + $(this).removeClass(ui.options.activeClass); + }, + drop: function(e, ui) { + $(this).removeClass(ui.options.activeClass); + } +}); + +$.ui.plugin.add("droppable", "hoverClass", { + over: function(e, ui) { + $(this).addClass(ui.options.hoverClass); + }, + out: function(e, ui) { + $(this).removeClass(ui.options.hoverClass); + }, + drop: function(e, ui) { + $(this).removeClass(ui.options.hoverClass); + } +}); + +})(jQuery); +/* + * jQuery UI Resizable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.resizable", $.extend({}, $.ui.mouse, { + init: function() { + + var self = this, o = this.options; + + var elpos = this.element.css('position'); + + this.originalElement = this.element; + + // simulate .ui-resizable { position: relative; } + this.element.addClass("ui-resizable").css({ position: /static/.test(elpos) ? 'relative' : elpos }); + + $.extend(o, { + _aspectRatio: !!(o.aspectRatio), + helper: o.helper || o.ghost || o.animate ? o.helper || 'proxy' : null, + knobHandles: o.knobHandles === true ? 'ui-resizable-knob-handle' : o.knobHandles + }); + + //Default Theme + var aBorder = '1px solid #DEDEDE'; + + o.defaultTheme = { + 'ui-resizable': { display: 'block' }, + 'ui-resizable-handle': { position: 'absolute', background: '#F2F2F2', fontSize: '0.1px' }, + 'ui-resizable-n': { cursor: 'n-resize', height: '4px', left: '0px', right: '0px', borderTop: aBorder }, + 'ui-resizable-s': { cursor: 's-resize', height: '4px', left: '0px', right: '0px', borderBottom: aBorder }, + 'ui-resizable-e': { cursor: 'e-resize', width: '4px', top: '0px', bottom: '0px', borderRight: aBorder }, + 'ui-resizable-w': { cursor: 'w-resize', width: '4px', top: '0px', bottom: '0px', borderLeft: aBorder }, + 'ui-resizable-se': { cursor: 'se-resize', width: '4px', height: '4px', borderRight: aBorder, borderBottom: aBorder }, + 'ui-resizable-sw': { cursor: 'sw-resize', width: '4px', height: '4px', borderBottom: aBorder, borderLeft: aBorder }, + 'ui-resizable-ne': { cursor: 'ne-resize', width: '4px', height: '4px', borderRight: aBorder, borderTop: aBorder }, + 'ui-resizable-nw': { cursor: 'nw-resize', width: '4px', height: '4px', borderLeft: aBorder, borderTop: aBorder } + }; + + o.knobTheme = { + 'ui-resizable-handle': { background: '#F2F2F2', border: '1px solid #808080', height: '8px', width: '8px' }, + 'ui-resizable-n': { cursor: 'n-resize', top: '0px', left: '45%' }, + 'ui-resizable-s': { cursor: 's-resize', bottom: '0px', left: '45%' }, + 'ui-resizable-e': { cursor: 'e-resize', right: '0px', top: '45%' }, + 'ui-resizable-w': { cursor: 'w-resize', left: '0px', top: '45%' }, + 'ui-resizable-se': { cursor: 'se-resize', right: '0px', bottom: '0px' }, + 'ui-resizable-sw': { cursor: 'sw-resize', left: '0px', bottom: '0px' }, + 'ui-resizable-nw': { cursor: 'nw-resize', left: '0px', top: '0px' }, + 'ui-resizable-ne': { cursor: 'ne-resize', right: '0px', top: '0px' } + }; + + o._nodeName = this.element[0].nodeName; + + //Wrap the element if it cannot hold child nodes + if(o._nodeName.match(/canvas|textarea|input|select|button|img/i)) { + var el = this.element; + + //Opera fixing relative position + if (/relative/.test(el.css('position')) && $.browser.opera) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + el.wrap( + $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css( { + position: el.css('position'), + width: el.outerWidth(), + height: el.outerHeight(), + top: el.css('top'), + left: el.css('left') + }) + ); + + var oel = this.element; this.element = this.element.parent(); + + // store instance on wrapper + this.element.data('resizable', this); + + //Move margins to the wrapper + this.element.css({ marginLeft: oel.css("marginLeft"), marginTop: oel.css("marginTop"), + marginRight: oel.css("marginRight"), marginBottom: oel.css("marginBottom") + }); + + oel.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + if ($.browser.safari && o.preventDefault) oel.css('resize', 'none'); + + o.proportionallyResize = oel.css({ position: 'static', zoom: 1, display: 'block' }); + + // avoid IE jump + this.element.css({ margin: oel.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + } + + if(!o.handles) o.handles = !$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }; + if(o.handles.constructor == String) { + + o.zIndex = o.zIndex || 1000; + + if(o.handles == 'all') o.handles = 'n,e,s,w,se,sw,ne,nw'; + + var n = o.handles.split(","); o.handles = {}; + + // insertions are applied when don't have theme loaded + var insertionsDefault = { + handle: 'position: absolute; display: none; overflow:hidden;', + n: 'top: 0pt; width:100%;', + e: 'right: 0pt; height:100%;', + s: 'bottom: 0pt; width:100%;', + w: 'left: 0pt; height:100%;', + se: 'bottom: 0pt; right: 0px;', + sw: 'bottom: 0pt; left: 0px;', + ne: 'top: 0pt; right: 0px;', + nw: 'top: 0pt; left: 0px;' + }; + + for(var i = 0; i < n.length; i++) { + var handle = $.trim(n[i]), dt = o.defaultTheme, hname = 'ui-resizable-'+handle, loadDefault = !$.ui.css(hname) && !o.knobHandles, userKnobClass = $.ui.css('ui-resizable-knob-handle'), + allDefTheme = $.extend(dt[hname], dt['ui-resizable-handle']), allKnobTheme = $.extend(o.knobTheme[hname], !userKnobClass ? o.knobTheme['ui-resizable-handle'] : {}); + + // increase zIndex of sw, se, ne, nw axis + var applyZIndex = /sw|se|ne|nw/.test(handle) ? { zIndex: ++o.zIndex } : {}; + + var defCss = (loadDefault ? insertionsDefault[handle] : ''), + axis = $(['<div class="ui-resizable-handle ', hname, '" style="', defCss, insertionsDefault.handle, '"></div>'].join('')).css( applyZIndex ); + o.handles[handle] = '.ui-resizable-'+handle; + + this.element.append( + //Theme detection, if not loaded, load o.defaultTheme + axis.css( loadDefault ? allDefTheme : {} ) + // Load the knobHandle css, fix width, height, top, left... + .css( o.knobHandles ? allKnobTheme : {} ).addClass(o.knobHandles ? 'ui-resizable-knob-handle' : '').addClass(o.knobHandles) + ); + } + + if (o.knobHandles) this.element.addClass('ui-resizable-knob').css( !$.ui.css('ui-resizable-knob') ? { /*border: '1px #fff dashed'*/ } : {} ); + } + + this._renderAxis = function(target) { + target = target || this.element; + + for(var i in o.handles) { + if(o.handles[i].constructor == String) + o.handles[i] = $(o.handles[i], this.element).show(); + + if (o.transparent) + o.handles[i].css({opacity:0}); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.element.is('.ui-wrapper') && + o._nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(o.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + if (!o.transparent) + target.css(padPos, padWrapper); + + this._proportionallyResize(); + } + if(!$(o.handles[i]).length) continue; + } + }; + + this._renderAxis(this.element); + o._handles = $('.ui-resizable-handle', self.element); + + if (o.disableSelection) + o._handles.each(function(i, e) { $.ui.disableSelection(e); }); + + //Matching axis name + o._handles.mouseover(function() { + if (!o.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = o.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + o._handles.hide(); + $(self.element).addClass("ui-resizable-autohide").hover(function() { + $(this).removeClass("ui-resizable-autohide"); + o._handles.show(); + }, + function(){ + if (!o.resizing) { + $(this).addClass("ui-resizable-autohide"); + o._handles.hide(); + } + }); + } + + this.mouseInit(); + }, + plugins: {}, + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + options: this.options, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + }, + propagate: function(n,e) { + $.ui.plugin.call(this, n, [e, this.ui()]); + if (n != "resize") this.element.triggerHandler(["resize", n].join(""), [e, this.ui()], this.options[n]); + }, + destroy: function() { + var el = this.element, wrapped = el.children(".ui-resizable").get(0); + + this.mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + _destroy(el); + + if (el.is('.ui-wrapper') && wrapped) { + el.parent().append( + $(wrapped).css({ + position: el.css('position'), + width: el.outerWidth(), + height: el.outerHeight(), + top: el.css('top'), + left: el.css('left') + }) + ).end().remove(); + + _destroy(wrapped); + } + }, + mouseStart: function(e) { + if(this.options.disabled) return false; + + var handle = false; + for(var i in this.options.handles) { + if($(this.options.handles[i])[0] == e.target) handle = true; + } + if (!handle) return false; + + var o = this.options, iniPos = this.element.position(), el = this.element, + num = function(v) { return parseInt(v, 10) || 0; }, ie6 = $.browser.msie && $.browser.version < 7; + o.resizing = true; + o.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix #1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + + // sOffset decides if document scrollOffset will be added to the top/left of the resizable element + var sOffset = $.browser.msie && !o.containment && (/absolute/).test(el.css('position')) && !(/relative/).test(el.parent().css('position')); + var dscrollt = sOffset ? o.documentScroll.top : 0, dscrolll = sOffset ? o.documentScroll.left : 0; + + el.css({ position: 'absolute', top: (iniPos.top + dscrollt), left: (iniPos.left + dscrolll) }); + } + + //Opera fixing relative position + if ($.browser.opera && /relative/.test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft()||0; + curtop += $(o.containment).scrollTop()||0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: e.pageX, top: e.pageY }; + + //Aspect Ratio + o.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.height / this.originalSize.width)||1); + + if (o.preserveCursor) + $('body').css('cursor', this.axis + '-resize'); + + this.propagate("start", e); + return true; + }, + mouseDrag: function(e) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (e.pageX-smp.left)||0, dy = (e.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [e, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (o._aspectRatio || e.shiftKey) + data = this._updateRatio(data, e); + + data = this._respectSize(data, e); + + // plugins callbacks need to be called first + this.propagate("resize", e); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!o.helper && o.proportionallyResize) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this.element.triggerHandler("resize", [e, this.ui()], this.options["resize"]); + + return false; + }, + mouseStop: function(e) { + + this.options.resizing = false; + var o = this.options, num = function(v) { return parseInt(v, 10) || 0; }, self = this; + + if(o.helper) { + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + if (o.helper && !o.animate) this._proportionallyResize(); + } + + if (o.preserveCursor) + $('body').css('cursor', 'auto'); + + this.propagate("stop", e); + + if (o.helper) this.helper.remove(); + + return false; + }, + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (data.left) this.position.left = data.left; + if (data.top) this.position.top = data.top; + if (data.height) this.size.height = data.height; + if (data.width) this.size.width = data.width; + }, + _updateRatio: function(data, e) { + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height / o.aspectRatio); + else if (data.width) data.height = (csize.width * o.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + _respectSize: function(data, e) { + + var el = this.helper, o = this.options, pRatio = o._aspectRatio || e.shiftKey, a = this.axis, + ismaxw = data.width && o.maxWidth && o.maxWidth < data.width, ismaxh = data.height && o.maxHeight && o.maxHeight < data.height, + isminw = data.width && o.minWidth && o.minWidth > data.width, isminh = data.height && o.minHeight && o.minHeight > data.height; + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + _proportionallyResize: function() { + var o = this.options; + if (!o.proportionallyResize) return; + var prel = o.proportionallyResize, el = this.helper || this.element; + + if (!o.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + o.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + prel.css({ + height: (el.height() - o.borderDif[0] - o.borderDif[2]) + "px", + width: (el.width() - o.borderDif[1] - o.borderDif[3]) + "px" + }); + }, + _renderProxy: function() { + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(o.helper) { + this.helper = this.helper || $('<div style="overflow:hidden;"></div>'); + + // fix ie6 offset + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(o.helper).css({ + width: el.outerWidth() + pxyoffset, + height: el.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex + }); + + this.helper.appendTo("body"); + + if (o.disableSelection) + $.ui.disableSelection(this.helper.get(0)); + + } else { + this.helper = el; + } + }, + _change: { + e: function(e, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(e, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(e, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(e, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(e, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [e, dx, dy])); + }, + sw: function(e, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [e, dx, dy])); + }, + ne: function(e, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [e, dx, dy])); + }, + nw: function(e, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [e, dx, dy])); + } + } +})); + +$.extend($.ui.resizable, { + defaults: { + cancel: ":input", + distance: 1, + delay: 0, + preventDefault: true, + transparent: false, + minWidth: 10, + minHeight: 10, + aspectRatio: false, + disableSelection: true, + preserveCursor: true, + autoHide: false, + knobHandles: false + } +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "containment", { + + start: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + + // i'm a node, so compute top, left, right, bottom + else{ + self.containerOffset = $(ce).offset(); + self.containerPosition = $(ce).position(); + self.containerSize = { height: $(ce).innerHeight(), width: $(ce).innerWidth() }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = o._aspectRatio || e.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && /static/.test(ce.css('position'))) + cop = self.containerPosition; + + if (cp.left < (o.helper ? co.left : cop.left)) { + self.size.width = self.size.width + (o.helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width * o.aspectRatio; + self.position.left = o.helper ? co.left : cop.left; + } + + if (cp.top < (o.helper ? co.top : 0)) { + self.size.height = self.size.height + (o.helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height / o.aspectRatio; + self.position.top = o.helper ? co.top : 0; + } + + var woset = (o.helper ? self.offset.left - co.left : (self.position.left - cop.left)) + self.sizeDiff.width, + hoset = (o.helper ? self.offset.top - co.top : self.position.top) + self.sizeDiff.height; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width * o.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height / o.aspectRatio; + } + }, + + stop: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.innerWidth(), h = helper.innerHeight(); + + + if (o.helper && !o.animate && /relative/.test(ce.css('position'))) + $(this).css({ left: (ho.left - co.left), top: (ho.top - co.top), width: w, height: h }); + + if (o.helper && !o.animate && /static/.test(ce.css('position'))) + $(this).css({ left: cop.left + (ho.left - co.left), top: cop.top + (ho.top - co.top), width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || e.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"); + + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration || "slow", easing: o.animateEasing || "swing", + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr) pr.css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self.propagate("animate", e); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize, cs = self.size; + + if (!pr) self.ghost = self.element.clone(); + else self.ghost = pr.clone(); + + self.ghost.css( + { opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 } + ) + .addClass('ui-resizable-ghost').addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize; + + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + + }, + + stop: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), + + _store = function(exp) { + $(exp).each(function() { + $(this).data("resizable-alsoresize", { + width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), + left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object') { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function(exp, c) { + $(exp).each(function() { + var start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; + + $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + $(this).css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object') { + $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function(e, ui){ + $(this).removeData("resizable-alsoresize-start"); + } +}); + +})(jQuery); +/* + * jQuery UI Selectable + * + * Copyright (c) 2008 Richard D. Worth (rdworth.org) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.selectable", $.extend({}, $.ui.mouse, { + init: function() { + var self = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + var selectees; + this.refresh = function() { + selectees = $(self.options.filter, self.element[0]); + selectees.each(function() { + var $this = $(this); + var pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.width(), + bottom: pos.top + $this.height(), + startselected: false, + selected: $this.hasClass('ui-selected'), + selecting: $this.hasClass('ui-selecting'), + unselecting: $this.hasClass('ui-unselecting') + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this.mouseInit(); + + this.helper = $(document.createElement('div')).css({border:'1px dotted black'}); + }, + toggle: function() { + if(this.options.disabled){ + this.enable(); + } else { + this.disable(); + } + }, + destroy: function() { + this.element + .removeClass("ui-selectable ui-selectable-disabled") + .removeData("selectable") + .unbind(".selectable"); + this.mouseDestroy(); + }, + mouseStart: function(e) { + var self = this; + + this.opos = [e.pageX, e.pageY]; + + if (this.options.disabled) + return; + + var options = this.options; + + this.selectees = $(options.filter, this.element[0]); + + // selectable START callback + this.element.triggerHandler("selectablestart", [e, { + "selectable": this.element[0], + "options": options + }], options.start); + + $('body').append(this.helper); + // position helper (lasso) + this.helper.css({ + "z-index": 100, + "position": "absolute", + "left": e.clientX, + "top": e.clientY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter('.ui-selected').each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!e.ctrlKey) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self.element.triggerHandler("selectableunselecting", [e, { + selectable: self.element[0], + unselecting: selectee.element, + options: options + }], options.unselecting); + } + }); + + var isSelectee = false; + $(e.target).parents().andSelf().each(function() { + if($.data(this, "selectable-item")) isSelectee = true; + }); + return this.options.keyboard ? !isSelectee : true; + }, + mouseDrag: function(e) { + var self = this; + this.dragged = true; + + if (this.options.disabled) + return; + + var options = this.options; + + var x1 = this.opos[0], y1 = this.opos[1], x2 = e.pageX, y2 = e.pageY; + if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"); + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element == self.element[0]) + return; + var hit = false; + if (options.tolerance == 'touch') { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance == 'fit') { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass('ui-selecting'); + selectee.selecting = true; + // selectable SELECTING callback + self.element.triggerHandler("selectableselecting", [e, { + selectable: self.element[0], + selecting: selectee.element, + options: options + }], options.selecting); + } + } else { + // UNSELECT + if (selectee.selecting) { + if (e.ctrlKey && selectee.startselected) { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + selectee.$element.addClass('ui-selected'); + selectee.selected = true; + } else { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + self.element.triggerHandler("selectableunselecting", [e, { + selectable: self.element[0], + unselecting: selectee.element, + options: options + }], options.unselecting); + } + } + if (selectee.selected) { + if (!e.ctrlKey && !selectee.startselected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self.element.triggerHandler("selectableunselecting", [e, { + selectable: self.element[0], + unselecting: selectee.element, + options: options + }], options.unselecting); + } + } + } + }); + + return false; + }, + mouseStop: function(e) { + var self = this; + + this.dragged = false; + + var options = this.options; + + $('.ui-unselecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + selectee.startselected = false; + self.element.triggerHandler("selectableunselected", [e, { + selectable: self.element[0], + unselected: selectee.element, + options: options + }], options.unselected); + }); + $('.ui-selecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-selecting').addClass('ui-selected'); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + self.element.triggerHandler("selectableselected", [e, { + selectable: self.element[0], + selected: selectee.element, + options: options + }], options.selected); + }); + this.element.triggerHandler("selectablestop", [e, { + selectable: self.element[0], + options: this.options + }], this.options.stop); + + this.helper.remove(); + + return false; + } +})); + +$.extend($.ui.selectable, { + defaults: { + distance: 1, + delay: 0, + cancel: ":input", + appendTo: 'body', + autoRefresh: true, + filter: '*', + tolerance: 'touch' + } +}); + +})(jQuery); +/* + * jQuery UI Sortable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * ui.core.js + */ +(function($) { + +function contains(a, b) { + var safari2 = $.browser.safari && $.browser.version < 522; + if (a.contains && !safari2) { + return a.contains(b); + } + if (a.compareDocumentPosition) + return !!(a.compareDocumentPosition(b) & 16); + while (b = b.parentNode) + if (b == a) return true; + return false; +}; + +$.widget("ui.sortable", $.extend({}, $.ui.mouse, { + init: function() { + + var o = this.options; + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine if the items are floating + this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false; + + //Let's determine the parent's offset + if(!(/(relative|absolute|fixed)/).test(this.element.css('position'))) this.element.css('position', 'relative'); + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this.mouseInit(); + + }, + plugins: {}, + ui: function(inst) { + return { + helper: (inst || this)["helper"], + placeholder: (inst || this)["placeholder"] || $([]), + position: (inst || this)["position"], + absolutePosition: (inst || this)["positionAbs"], + options: this.options, + element: this.element, + item: (inst || this)["currentItem"], + sender: inst ? inst.element : null + }; + }, + propagate: function(n,e,inst, noPropagation) { + $.ui.plugin.call(this, n, [e, this.ui(inst)]); + if(!noPropagation) this.element.triggerHandler(n == "sort" ? n : "sort"+n, [e, this.ui(inst)], this.options[n]); + }, + serialize: function(o) { + + var items = ($.isFunction(this.options.items) ? this.options.items.call(this.element) : $(this.options.items, this.element)).not('.ui-sortable-helper'); //Only the items of the sortable itself + var str = []; o = o || {}; + + items.each(function() { + var res = ($(this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/)); + if(res) str.push((o.key || res[1])+'[]='+(o.key && o.expression ? res[1] : res[2])); + }); + + return str.join('&'); + + }, + toArray: function(attr) { + + var items = ($.isFunction(this.options.items) ? this.options.items.call(this.element) : $(this.options.items, this.element)).not('.ui-sortable-helper'); //Only the items of the sortable itself + var ret = []; + + items.each(function() { ret.push($(this).attr(attr || 'id')); }); + return ret; + + }, + /* Be careful with the following core functions */ + intersectsWith: function(item) { + + var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height; + var l = item.left, r = l + item.width, + t = item.top, b = t + item.height; + + if(this.options.tolerance == "pointer" || this.options.forcePointerForContainers || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) { + return (y1 + this.offset.click.top > t && y1 + this.offset.click.top < b && x1 + this.offset.click.left > l && x1 + this.offset.click.left < r); + } else { + + return (l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + + }, + intersectsWithEdge: function(item) { + var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height; + var l = item.left, r = l + item.width, + t = item.top, b = t + item.height; + + if(this.options.tolerance == "pointer" || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) { + + if(!(y1 + this.offset.click.top > t && y1 + this.offset.click.top < b && x1 + this.offset.click.left > l && x1 + this.offset.click.left < r)) return false; + + if(this.floating) { + if(x1 + this.offset.click.left > l && x1 + this.offset.click.left < l + item.width/2) return 2; + if(x1 + this.offset.click.left > l+item.width/2 && x1 + this.offset.click.left < r) return 1; + } else { + if(y1 + this.offset.click.top > t && y1 + this.offset.click.top < t + item.height/2) return 2; + if(y1 + this.offset.click.top > t+item.height/2 && y1 + this.offset.click.top < b) return 1; + } + + } else { + + if (!(l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b )) return false; // Top Half + + if(this.floating) { + if(x2 > l && x1 < l) return 2; //Crosses left edge + if(x1 < r && x2 > r) return 1; //Crosses right edge + } else { + if(y2 > t && y1 < t) return 1; //Crosses top edge + if(y1 < b && y2 > b) return 2; //Crosses bottom edge + } + + } + + return false; + + }, + refresh: function() { + this.refreshItems(); + this.refreshPositions(); + }, + refreshItems: function() { + + this.items = []; + this.containers = [this]; + var items = this.items; + var self = this; + var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element), this]]; + + if(this.options.connectWith) { + for (var i = this.options.connectWith.length - 1; i >= 0; i--){ + var cur = $(this.options.connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + }; + }; + } + + for (var i = queries.length - 1; i >= 0; i--){ + queries[i][0].each(function() { + $.data(this, 'sortable-item', queries[i][1]); // Data for target checking (mouse manager) + items.push({ + item: $(this), + instance: queries[i][1], + width: 0, height: 0, + left: 0, top: 0 + }); + }); + }; + + }, + refreshPositions: function(fast) { + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent) { + var po = this.offsetParent.offset(); + this.offset.parent = { top: po.top + this.offsetParentBorders.top, left: po.left + this.offsetParentBorders.left }; + } + + for (var i = this.items.length - 1; i >= 0; i--){ + + //We ignore calculating positions of all connected containers when we're not over them + if(this.items[i].instance != this.currentContainer && this.currentContainer && this.items[i].item[0] != this.currentItem[0]) + continue; + + var t = this.options.toleranceElement ? $(this.options.toleranceElement, this.items[i].item) : this.items[i].item; + + if(!fast) { + this.items[i].width = t[0].offsetWidth; + this.items[i].height = t[0].offsetHeight; + } + + var p = t.offset(); + this.items[i].left = p.left; + this.items[i].top = p.top; + + }; + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (var i = this.containers.length - 1; i >= 0; i--){ + var p =this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + }; + } + + }, + destroy: function() { + this.element + .removeClass("ui-sortable ui-sortable-disabled") + .removeData("sortable") + .unbind(".sortable"); + this.mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) + this.items[i].item.removeData("sortable-item"); + }, + createPlaceholder: function(that) { + + var self = that || this, o = self.options; + + if(o.placeholder.constructor == String) { + var className = o.placeholder; + o.placeholder = { + element: function() { + return $('<div></div>').addClass(className)[0]; + }, + update: function(i, p) { + p.css(i.offset()).css({ width: i.outerWidth(), height: i.outerHeight() }); + } + }; + } + + self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)).appendTo('body').css({ position: 'absolute' }); + o.placeholder.update.call(self.element, self.currentItem, self.placeholder); + }, + contactContainers: function(e) { + for (var i = this.containers.length - 1; i >= 0; i--){ + + if(this.intersectsWith(this.containers[i].containerCache)) { + if(!this.containers[i].containerCache.over) { + + + if(this.currentContainer != this.containers[i]) { + + //When entering a new container, we will find the item with the least distance and append our item near it + var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top']; + for (var j = this.items.length - 1; j >= 0; j--) { + if(!contains(this.containers[i].element[0], this.items[j].item[0])) continue; + var cur = this.items[j][this.containers[i].floating ? 'left' : 'top']; + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + } + } + + if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled + continue; + + //We also need to exchange the placeholder + if(this.placeholder) this.placeholder.remove(); + if(this.containers[i].options.placeholder) { + this.containers[i].createPlaceholder(this); + } else { + this.placeholder = null;; + } + + this.currentContainer = this.containers[i]; + itemWithLeastDistance ? this.rearrange(e, itemWithLeastDistance, null, true) : this.rearrange(e, null, this.containers[i].element, true); + this.propagate("change", e); //Call plugins and callbacks + this.containers[i].propagate("change", e, this); //Call plugins and callbacks + + } + + this.containers[i].propagate("over", e, this); + this.containers[i].containerCache.over = 1; + } + } else { + if(this.containers[i].containerCache.over) { + this.containers[i].propagate("out", e, this); + this.containers[i].containerCache.over = 0; + } + } + + }; + }, + mouseCapture: function(e, overrideHandle) { + + if(this.options.disabled || this.options.type == 'static') return false; + + //We have to refresh the items data once first + this.refreshItems(); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + var currentItem = null, self = this, nodes = $(e.target).parents().each(function() { + if($.data(this, 'sortable-item') == self) { + currentItem = $(this); + return false; + } + }); + if($.data(e.target, 'sortable-item') == self) currentItem = $(e.target); + + if(!currentItem) return false; + if(this.options.handle && !overrideHandle) { + var validHandle = false; + + $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == e.target) validHandle = true; }); + if(!validHandle) return false; + } + + this.currentItem = currentItem; + return true; + + }, + mouseStart: function(e, overrideHandle, noActivation) { + + var o = this.options; + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = typeof o.helper == 'function' ? $(o.helper.apply(this.element[0], [e, this.currentItem])) : this.currentItem.clone(); + if (!this.helper.parents('body').length) $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(this.helper[0]); //Add the helper to the DOM if that didn't happen already + this.helper.css({ position: 'absolute', clear: 'both' }).addClass('ui-sortable-helper'); //Position it absolutely and add a helper class + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + this.margins = { //Cache the margins + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + + this.offset = this.currentItem.offset(); //The element's absolute position on the page + this.offset = { //Substract the margins from the element's absolute offset + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + this.offset.click = { //Where the click happened, relative to the element + left: e.pageX - this.offset.left, + top: e.pageY - this.offset.top + }; + + this.offsetParent = this.helper.offsetParent(); //Get the offsetParent and cache its position + var po = this.offsetParent.offset(); + + this.offsetParentBorders = { + top: (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + this.offset.parent = { //Store its position plus border + top: po.top + this.offsetParentBorders.top, + left: po.left + this.offsetParentBorders.left + }; + + this.originalPosition = this.generatePosition(e); //Generate the original position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; //Cache the former DOM position + + //If o.placeholder is used, create a new element at the given position with the class + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size + if(o.placeholder) this.createPlaceholder(); + + //Call plugins and callbacks + this.propagate("start", e); + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Recache the helper size + + if(o.cursorAt) { + if(o.cursorAt.left != undefined) this.offset.click.left = o.cursorAt.left; + if(o.cursorAt.right != undefined) this.offset.click.left = this.helperProportions.width - o.cursorAt.right; + if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top; + if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom; + } + + /* + * - Position constraining - + * Here we prepare position constraining like grid and containment. + */ + + if(o.containment) { + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.parent.left, + 0 - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.parent.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.parent.top, + co.left+Math.max(ce.scrollWidth,ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.currentItem.css("marginRight"),10) || 0), + co.top+Math.max(ce.scrollHeight,ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.currentItem.css("marginBottom"),10) || 0) + ]; + } + } + + //Set the original element visibility to hidden to still fill out the white space + if(this.options.placeholder != 'clone') + this.currentItem.css('visibility', 'hidden'); + + //Post 'activate' events to possible containers + if(!noActivation) { + for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i].propagate("activate", e, this); } + } + + //Prepare possible droppables + if($.ui.ddmanager) $.ui.ddmanager.current = this; + if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e); + + this.dragging = true; + + this.mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + + }, + convertPositionTo: function(d, pos) { + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + return { + top: ( + pos.top // the calculated relative position + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) * mod // The offsetParent's scroll position + + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods) + ), + left: ( + pos.left // the calculated relative position + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft) * mod // The offsetParent's scroll position + + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods) + ) + }; + }, + generatePosition: function(e) { + + var o = this.options; + var position = { + top: ( + e.pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) // The offsetParent's scroll position, not if the element is fixed + ), + left: ( + e.pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft) // The offsetParent's scroll position, not if the element is fixed + ) + }; + + if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + if(this.containment) { + if(position.left < this.containment[0]) position.left = this.containment[0]; + if(position.top < this.containment[1]) position.top = this.containment[1]; + if(position.left > this.containment[2]) position.left = this.containment[2]; + if(position.top > this.containment[3]) position.top = this.containment[3]; + } + + if(o.grid) { + var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1]; + position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0]; + position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + return position; + }, + mouseDrag: function(e) { + + //Compute the helpers position + this.position = this.generatePosition(e); + this.positionAbs = this.convertPositionTo("absolute"); + + //Call the internal plugins + $.ui.plugin.call(this, "sort", [e, this.ui()]); + + //Regenerate the absolute position used for position checks + this.positionAbs = this.convertPositionTo("absolute"); + + //Set the helper's position + this.helper[0].style.left = this.position.left+'px'; + this.helper[0].style.top = this.position.top+'px'; + + //Rearrange + for (var i = this.items.length - 1; i >= 0; i--) { + var intersection = this.intersectsWithEdge(this.items[i]); + if(!intersection) continue; + + if(this.items[i].item[0] != this.currentItem[0] //cannot intersect with itself + && this.currentItem[intersection == 1 ? "next" : "prev"]()[0] != this.items[i].item[0] //no useless actions that have been done before + && !contains(this.currentItem[0], this.items[i].item[0]) //no action if the item moved is the parent of the item checked + && (this.options.type == 'semi-dynamic' ? !contains(this.element[0], this.items[i].item[0]) : true) + ) { + + this.direction = intersection == 1 ? "down" : "up"; + this.rearrange(e, this.items[i]); + this.propagate("change", e); //Call plugins and callbacks + break; + } + } + + //Post events to containers + this.contactContainers(e); + + //Interconnect with droppables + if($.ui.ddmanager) $.ui.ddmanager.drag(this, e); + + //Call callbacks + this.element.triggerHandler("sort", [e, this.ui()], this.options["sort"]); + + return false; + + }, + rearrange: function(e, i, a, hardRefresh) { + a ? a[0].appendChild(this.currentItem[0]) : i.item[0].parentNode.insertBefore(this.currentItem[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var self = this, counter = this.counter; + + window.setTimeout(function() { + if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + },0); + + if(this.options.placeholder) + this.options.placeholder.update.call(this.element, this.currentItem, this.placeholder); + }, + mouseStop: function(e, noPropagation) { + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) + $.ui.ddmanager.drop(this, e); + + if(this.options.revert) { + var self = this; + var cur = self.currentItem.offset(); + + //Also animate the placeholder if we have one + if(self.placeholder) self.placeholder.animate({ opacity: 'hide' }, (parseInt(this.options.revert, 10) || 500)-50); + + $(this.helper).animate({ + left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), + top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) + }, parseInt(this.options.revert, 10) || 500, function() { + self.clear(e); + }); + } else { + this.clear(e, noPropagation); + } + + return false; + + }, + clear: function(e, noPropagation) { + + if(this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) this.propagate("update", e, null, noPropagation); //Trigger update callback if the DOM position has changed + if(!contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element + this.propagate("remove", e, null, noPropagation); + for (var i = this.containers.length - 1; i >= 0; i--){ + if(contains(this.containers[i].element[0], this.currentItem[0])) { + this.containers[i].propagate("update", e, this, noPropagation); + this.containers[i].propagate("receive", e, this, noPropagation); + } + }; + }; + + //Post events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i].propagate("deactivate", e, this, noPropagation); + if(this.containers[i].containerCache.over) { + this.containers[i].propagate("out", e, this); + this.containers[i].containerCache.over = 0; + } + } + + this.dragging = false; + if(this.cancelHelperRemoval) { + this.propagate("stop", e, null, noPropagation); + return false; + } + + $(this.currentItem).css('visibility', ''); + if(this.placeholder) this.placeholder.remove(); + this.helper.remove(); this.helper = null; + this.propagate("stop", e, null, noPropagation); + + return true; + + } +})); + +$.extend($.ui.sortable, { + getter: "serialize toArray", + defaults: { + helper: "clone", + tolerance: "guess", + distance: 1, + delay: 0, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + cancel: ":input", + items: '> *', + zIndex: 1000, + dropOnEmpty: true, + appendTo: "parent" + } +}); + +/* + * Sortable Extensions + */ + +$.ui.plugin.add("sortable", "cursor", { + start: function(e, ui) { + var t = $('body'); + if (t.css("cursor")) ui.options._cursor = t.css("cursor"); + t.css("cursor", ui.options.cursor); + }, + stop: function(e, ui) { + if (ui.options._cursor) $('body').css("cursor", ui.options._cursor); + } +}); + +$.ui.plugin.add("sortable", "zIndex", { + start: function(e, ui) { + var t = ui.helper; + if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex"); + t.css('zIndex', ui.options.zIndex); + }, + stop: function(e, ui) { + if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex); + } +}); + +$.ui.plugin.add("sortable", "opacity", { + start: function(e, ui) { + var t = ui.helper; + if(t.css("opacity")) ui.options._opacity = t.css("opacity"); + t.css('opacity', ui.options.opacity); + }, + stop: function(e, ui) { + if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity); + } +}); + +$.ui.plugin.add("sortable", "scroll", { + start: function(e, ui) { + var o = ui.options; + var i = $(this).data("sortable"); + + i.overflowY = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(i.currentItem); + i.overflowX = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(i.currentItem); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') i.overflowYOffset = i.overflowY.offset(); + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') i.overflowXOffset = i.overflowX.offset(); + + }, + sort: function(e, ui) { + + var o = ui.options; + var i = $(this).data("sortable"); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') { + if((i.overflowYOffset.top + i.overflowY[0].offsetHeight) - e.pageY < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed; + if(e.pageY - i.overflowYOffset.top < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed; + } else { + if(e.pageY - $(document).scrollTop() < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') { + if((i.overflowXOffset.left + i.overflowX[0].offsetWidth) - e.pageX < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed; + if(e.pageX - i.overflowXOffset.left < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed; + } else { + if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } +}); + +$.ui.plugin.add("sortable", "axis", { + sort: function(e, ui) { + + var i = $(this).data("sortable"); + + if(ui.options.axis == "y") i.position.left = i.originalPosition.left; + if(ui.options.axis == "x") i.position.top = i.originalPosition.top; + + } +}); + +})(jQuery); +/* + * jQuery UI Accordion + * + * Copyright (c) 2007, 2008 Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.accordion", { + init: function() { + var options = this.options; + + if ( options.navigation ) { + var current = this.element.find("a").filter(options.navigationFilter); + if ( current.length ) { + if ( current.filter(options.header).length ) { + options.active = current; + } else { + options.active = current.parent().parent().prev(); + current.addClass("current"); + } + } + } + + // calculate active if not specified, using the first header + options.headers = this.element.find(options.header); + options.active = findActive(options.headers, options.active); + + // IE7-/Win - Extra vertical space in Lists fixed + if ($.browser.msie) { + this.element.find('a').css('zoom', '1'); + } + + if (!this.element.hasClass("ui-accordion")) { + this.element.addClass("ui-accordion"); + $("<span class='ui-accordion-left'/>").insertBefore(options.headers); + $("<span class='ui-accordion-right'/>").appendTo(options.headers); + options.headers.addClass("ui-accordion-header").attr("tabindex", "0"); + } + + var maxHeight; + if ( options.fillSpace ) { + maxHeight = this.element.parent().height(); + options.headers.each(function() { + maxHeight -= $(this).outerHeight(); + }); + var maxPadding = 0; + options.headers.next().each(function() { + maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height()); + }).height(maxHeight - maxPadding); + } else if ( options.autoHeight ) { + maxHeight = 0; + options.headers.next().each(function() { + maxHeight = Math.max(maxHeight, $(this).outerHeight()); + }).height(maxHeight); + } + + options.headers + .not(options.active || "") + .next() + .hide(); + options.active.parent().andSelf().addClass(options.selectedClass); + + if (options.event) { + this.element.bind((options.event) + ".accordion", clickHandler); + } + }, + activate: function(index) { + // call clickHandler with custom event + clickHandler.call(this.element[0], { + target: findActive( this.options.headers, index )[0] + }); + }, + destroy: function() { + this.options.headers.next().css("display", ""); + if ( this.options.fillSpace || this.options.autoHeight ) { + this.options.headers.next().css("height", ""); + } + $.removeData(this.element[0], "accordion"); + this.element.removeClass("ui-accordion").unbind(".accordion"); + } +}); + +function scopeCallback(callback, scope) { + return function() { + return callback.apply(scope, arguments); + }; +}; + +function completed(cancel) { + // if removed while animated data can be empty + if (!$.data(this, "accordion")) { + return; + } + + var instance = $.data(this, "accordion"); + var options = instance.options; + options.running = cancel ? 0 : --options.running; + if ( options.running ) { + return; + } + if ( options.clearStyle ) { + options.toShow.add(options.toHide).css({ + height: "", + overflow: "" + }); + } + $(this).triggerHandler("accordionchange", [$.event.fix({type: 'accordionchange', target: instance.element[0]}), options.data], options.change); +} + +function toggle(toShow, toHide, data, clickedActive, down) { + var options = $.data(this, "accordion").options; + options.toShow = toShow; + options.toHide = toHide; + options.data = data; + var complete = scopeCallback(completed, this); + + // count elements to animate + options.running = toHide.size() === 0 ? toShow.size() : toHide.size(); + + if ( options.animated ) { + if ( !options.alwaysOpen && clickedActive ) { + $.ui.accordion.animations[options.animated]({ + toShow: jQuery([]), + toHide: toHide, + complete: complete, + down: down, + autoHeight: options.autoHeight + }); + } else { + $.ui.accordion.animations[options.animated]({ + toShow: toShow, + toHide: toHide, + complete: complete, + down: down, + autoHeight: options.autoHeight + }); + } + } else { + if ( !options.alwaysOpen && clickedActive ) { + toShow.toggle(); + } else { + toHide.hide(); + toShow.show(); + } + complete(true); + } +} + +function clickHandler(event) { + var options = $.data(this, "accordion").options; + if (options.disabled) { + return false; + } + + // called only when using activate(false) to close all parts programmatically + if ( !event.target && !options.alwaysOpen ) { + options.active.parent().andSelf().toggleClass(options.selectedClass); + var toHide = options.active.next(), + data = { + options: options, + newHeader: jQuery([]), + oldHeader: options.active, + newContent: jQuery([]), + oldContent: toHide + }, + toShow = (options.active = $([])); + toggle.call(this, toShow, toHide, data ); + return false; + } + // get the click target + var clicked = $(event.target); + + // due to the event delegation model, we have to check if one + // of the parent elements is our actual header, and find that + // otherwise stick with the initial target + clicked = $( clicked.parents(options.header)[0] || clicked ); + + var clickedActive = clicked[0] == options.active[0]; + + // if animations are still active, or the active header is the target, ignore click + if (options.running || (options.alwaysOpen && clickedActive)) { + return false; + } + if (!clicked.is(options.header)) { + return; + } + + // switch classes + options.active.parent().andSelf().toggleClass(options.selectedClass); + if ( !clickedActive ) { + clicked.parent().andSelf().addClass(options.selectedClass); + } + + // find elements to show and hide + var toShow = clicked.next(), + toHide = options.active.next(), + //data = [clicked, options.active, toShow, toHide], + data = { + options: options, + newHeader: clicked, + oldHeader: options.active, + newContent: toShow, + oldContent: toHide + }, + down = options.headers.index( options.active[0] ) > options.headers.index( clicked[0] ); + + options.active = clickedActive ? $([]) : clicked; + toggle.call(this, toShow, toHide, data, clickedActive, down ); + + return false; +}; + +function findActive(headers, selector) { + return selector != undefined + ? typeof selector == "number" + ? headers.filter(":eq(" + selector + ")") + : headers.not(headers.not(selector)) + : selector === false + ? $([]) + : headers.filter(":eq(0)"); +} + +$.extend($.ui.accordion, { + defaults: { + selectedClass: "selected", + alwaysOpen: true, + animated: 'slide', + event: "click", + header: "a", + autoHeight: true, + running: 0, + navigationFilter: function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + } + }, + animations: { + slide: function(options, additions) { + options = $.extend({ + easing: "swing", + duration: 300 + }, options, additions); + if ( !options.toHide.size() ) { + options.toShow.animate({height: "show"}, options); + return; + } + var hideHeight = options.toHide.height(), + showHeight = options.toShow.height(), + difference = showHeight / hideHeight; + options.toShow.css({ height: 0, overflow: 'hidden' }).show(); + options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate({height:"hide"},{ + step: function(now) { + var current = (hideHeight - now) * difference; + if ($.browser.msie || $.browser.opera) { + current = Math.ceil(current); + } + options.toShow.height( current ); + }, + duration: options.duration, + easing: options.easing, + complete: function() { + if ( !options.autoHeight ) { + options.toShow.css("height", "auto"); + } + options.complete(); + } + }); + }, + bounceslide: function(options) { + this.slide(options, { + easing: options.down ? "bounceout" : "swing", + duration: options.down ? 1000 : 200 + }); + }, + easeslide: function(options) { + this.slide(options, { + easing: "easeinout", + duration: 700 + }); + } + } +}); + +// deprecated, use accordion("activate", index) instead +$.fn.activate = function(index) { + return this.accordion("activate", index); +}; + +})(jQuery); +/* + * jQuery UI Dialog + * + * Copyright (c) 2008 Richard D. Worth (rdworth.org) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * ui.core.js + * ui.draggable.js + * ui.resizable.js + */ +(function($) { + +var setDataSwitch = { + dragStart: "start.draggable", + drag: "drag.draggable", + dragStop: "stop.draggable", + maxHeight: "maxHeight.resizable", + minHeight: "minHeight.resizable", + maxWidth: "maxWidth.resizable", + minWidth: "minWidth.resizable", + resizeStart: "start.resizable", + resize: "drag.resizable", + resizeStop: "stop.resizable" +}; + +$.widget("ui.dialog", { + init: function() { + var self = this, + options = this.options, + resizeHandles = typeof options.resizable == 'string' + ? options.resizable + : 'n,e,s,w,se,sw,ne,nw', + + uiDialogContent = this.element + .addClass('ui-dialog-content') + .wrap('<div/>') + .wrap('<div/>'), + + uiDialogContainer = (this.uiDialogContainer = uiDialogContent.parent() + .addClass('ui-dialog-container') + .css({position: 'relative', width: '100%', height: '100%'})), + + title = options.title || uiDialogContent.attr('title') || '', + uiDialogTitlebar = (this.uiDialogTitlebar = + $('<div class="ui-dialog-titlebar"/>')) + .append('<span class="ui-dialog-title">' + title + '</span>') + .append('<a href="#" class="ui-dialog-titlebar-close"><span>X</span></a>') + .prependTo(uiDialogContainer), + + uiDialog = (this.uiDialog = uiDialogContainer.parent()) + .appendTo(document.body) + .hide() + .addClass('ui-dialog') + .addClass(options.dialogClass) + // add content classes to dialog + // to inherit theme at top level of element + .addClass(uiDialogContent.attr('className')) + .removeClass('ui-dialog-content') + .css({ + position: 'absolute', + width: options.width, + height: options.height, + overflow: 'hidden', + zIndex: options.zIndex + }) + // setting tabIndex makes the div focusable + // setting outline to 0 prevents a border on focus in Mozilla + .attr('tabIndex', -1).css('outline', 0).keydown(function(ev) { + if (options.closeOnEscape) { + var ESC = 27; + (ev.keyCode && ev.keyCode == ESC && self.close()); + } + }) + .mousedown(function() { + self.moveToTop(); + }), + + uiDialogButtonPane = (this.uiDialogButtonPane = $('<div/>')) + .addClass('ui-dialog-buttonpane').css({ position: 'absolute', bottom: 0 }) + .appendTo(uiDialog); + + this.uiDialogTitlebarClose = $('.ui-dialog-titlebar-close', uiDialogTitlebar) + .hover( + function() { + $(this).addClass('ui-dialog-titlebar-close-hover'); + }, + function() { + $(this).removeClass('ui-dialog-titlebar-close-hover'); + } + ) + .mousedown(function(ev) { + ev.stopPropagation(); + }) + .click(function() { + self.close(); + return false; + }); + + this.uiDialogTitlebar.find("*").add(this.uiDialogTitlebar).each(function() { + $.ui.disableSelection(this); + }); + + if ($.fn.draggable) { + uiDialog.draggable({ + cancel: '.ui-dialog-content', + helper: options.dragHelper, + handle: '.ui-dialog-titlebar', + start: function(e, ui) { + self.moveToTop(); + (options.dragStart && options.dragStart.apply(self.element[0], arguments)); + }, + drag: function(e, ui) { + (options.drag && options.drag.apply(self.element[0], arguments)); + }, + stop: function(e, ui) { + (options.dragStop && options.dragStop.apply(self.element[0], arguments)); + $.ui.dialog.overlay.resize(); + } + }); + (options.draggable || uiDialog.draggable('disable')); + } + + if ($.fn.resizable) { + uiDialog.resizable({ + cancel: '.ui-dialog-content', + helper: options.resizeHelper, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: options.minHeight, + start: function() { + (options.resizeStart && options.resizeStart.apply(self.element[0], arguments)); + }, + resize: function(e, ui) { + (options.autoResize && self.size.apply(self)); + (options.resize && options.resize.apply(self.element[0], arguments)); + }, + handles: resizeHandles, + stop: function(e, ui) { + (options.autoResize && self.size.apply(self)); + (options.resizeStop && options.resizeStop.apply(self.element[0], arguments)); + $.ui.dialog.overlay.resize(); + } + }); + (options.resizable || uiDialog.resizable('disable')); + } + + this.createButtons(options.buttons); + this.isOpen = false; + + (options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe()); + (options.autoOpen && this.open()); + }, + + setData: function(key, value){ + (setDataSwitch[key] && this.uiDialog.data(setDataSwitch[key], value)); + switch (key) { + case "buttons": + this.createButtons(value); + break; + case "draggable": + this.uiDialog.draggable(value ? 'enable' : 'disable'); + break; + case "height": + this.uiDialog.height(value); + break; + case "position": + this.position(value); + break; + case "resizable": + (typeof value == 'string' && this.uiDialog.data('handles.resizable', value)); + this.uiDialog.resizable(value ? 'enable' : 'disable'); + break; + case "title": + $(".ui-dialog-title", this.uiDialogTitlebar).text(value); + break; + case "width": + this.uiDialog.width(value); + break; + } + + $.widget.prototype.setData.apply(this, arguments); + }, + + position: function(pos) { + var wnd = $(window), doc = $(document), + pTop = doc.scrollTop(), pLeft = doc.scrollLeft(), + minTop = pTop; + + if ($.inArray(pos, ['center','top','right','bottom','left']) >= 0) { + pos = [ + pos == 'right' || pos == 'left' ? pos : 'center', + pos == 'top' || pos == 'bottom' ? pos : 'middle' + ]; + } + if (pos.constructor != Array) { + pos = ['center', 'middle']; + } + if (pos[0].constructor == Number) { + pLeft += pos[0]; + } else { + switch (pos[0]) { + case 'left': + pLeft += 0; + break; + case 'right': + pLeft += wnd.width() - this.uiDialog.width(); + break; + default: + case 'center': + pLeft += (wnd.width() - this.uiDialog.width()) / 2; + } + } + if (pos[1].constructor == Number) { + pTop += pos[1]; + } else { + switch (pos[1]) { + case 'top': + pTop += 0; + break; + case 'bottom': + pTop += wnd.height() - this.uiDialog.height(); + break; + default: + case 'middle': + pTop += (wnd.height() - this.uiDialog.height()) / 2; + } + } + + // prevent the dialog from being too high (make sure the titlebar + // is accessible) + pTop = Math.max(pTop, minTop); + this.uiDialog.css({top: pTop, left: pLeft}); + }, + + size: function() { + var container = this.uiDialogContainer, + titlebar = this.uiDialogTitlebar, + content = this.element, + tbMargin = parseInt(content.css('margin-top'),10) + parseInt(content.css('margin-bottom'),10), + lrMargin = parseInt(content.css('margin-left'),10) + parseInt(content.css('margin-right'),10); + content.height(container.height() - titlebar.outerHeight() - tbMargin); + content.width(container.width() - lrMargin); + }, + + open: function() { + if (this.isOpen) { return; } + + this.overlay = this.options.modal ? new $.ui.dialog.overlay(this) : null; + (this.uiDialog.next().length > 0) && this.uiDialog.appendTo('body'); + this.position(this.options.position); + this.uiDialog.show(this.options.show); + this.options.autoResize && this.size(); + this.moveToTop(true); + + // CALLBACK: open + var openEV = null; + var openUI = { + options: this.options + }; + this.uiDialogTitlebarClose.focus(); + this.element.triggerHandler("dialogopen", [openEV, openUI], this.options.open); + + this.isOpen = true; + }, + + // the force parameter allows us to move modal dialogs to their correct + // position on open + moveToTop: function(force) { + if ((this.options.modal && !force) + || (!this.options.stack && !this.options.modal)) { return this.element.triggerHandler("dialogfocus", [null, { options: this.options }], this.options.focus); } + + var maxZ = this.options.zIndex, options = this.options; + $('.ui-dialog:visible').each(function() { + maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10) || options.zIndex); + }); + (this.overlay && this.overlay.$el.css('z-index', ++maxZ)); + this.uiDialog.css('z-index', ++maxZ); + + this.element.triggerHandler("dialogfocus", [null, { options: this.options }], this.options.focus); + }, + + close: function() { + (this.overlay && this.overlay.destroy()); + this.uiDialog.hide(this.options.hide); + + // CALLBACK: close + var closeEV = null; + var closeUI = { + options: this.options + }; + this.element.triggerHandler("dialogclose", [closeEV, closeUI], this.options.close); + $.ui.dialog.overlay.resize(); + + this.isOpen = false; + }, + + destroy: function() { + (this.overlay && this.overlay.destroy()); + this.uiDialog.hide(); + this.element + .unbind('.dialog') + .removeData('dialog') + .removeClass('ui-dialog-content') + .hide().appendTo('body'); + this.uiDialog.remove(); + }, + + createButtons: function(buttons) { + var self = this, + hasButtons = false, + uiDialogButtonPane = this.uiDialogButtonPane; + + // remove any existing buttons + uiDialogButtonPane.empty().hide(); + + $.each(buttons, function() { return !(hasButtons = true); }); + if (hasButtons) { + uiDialogButtonPane.show(); + $.each(buttons, function(name, fn) { + $('<button/>') + .text(name) + .click(function() { fn.apply(self.element[0], arguments); }) + .appendTo(uiDialogButtonPane); + }); + } + } +}); + +$.extend($.ui.dialog, { + defaults: { + autoOpen: true, + autoResize: true, + bgiframe: false, + buttons: {}, + closeOnEscape: true, + draggable: true, + height: 200, + minHeight: 100, + minWidth: 150, + modal: false, + overlay: {}, + position: 'center', + resizable: true, + stack: true, + width: 300, + zIndex: 1000 + }, + + overlay: function(dialog) { + this.$el = $.ui.dialog.overlay.create(dialog); + } +}); + +$.extend($.ui.dialog.overlay, { + instances: [], + events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), + function(e) { return e + '.dialog-overlay'; }).join(' '), + create: function(dialog) { + if (this.instances.length === 0) { + // prevent use of anchors and inputs + // we use a setTimeout in case the overlay is created from an + // event that we're going to be cancelling (see #2804) + setTimeout(function() { + $('a, :input').bind($.ui.dialog.overlay.events, function() { + // allow use of the element if inside a dialog and + // - there are no modal dialogs + // - there are modal dialogs, but we are in front of the topmost modal + var allow = false; + var $dialog = $(this).parents('.ui-dialog'); + if ($dialog.length) { + var $overlays = $('.ui-dialog-overlay'); + if ($overlays.length) { + var maxZ = parseInt($overlays.css('z-index'), 10); + $overlays.each(function() { + maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10)); + }); + allow = parseInt($dialog.css('z-index'), 10) > maxZ; + } else { + allow = true; + } + } + return allow; + }); + }, 1); + + // allow closing by pressing the escape key + $(document).bind('keydown.dialog-overlay', function(e) { + var ESC = 27; + (e.keyCode && e.keyCode == ESC && dialog.close()); + }); + + // handle window resize + $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); + } + + var $el = $('<div/>').appendTo(document.body) + .addClass('ui-dialog-overlay').css($.extend({ + borderWidth: 0, margin: 0, padding: 0, + position: 'absolute', top: 0, left: 0, + width: this.width(), + height: this.height() + }, dialog.options.overlay)); + + (dialog.options.bgiframe && $.fn.bgiframe && $el.bgiframe()); + + this.instances.push($el); + return $el; + }, + + destroy: function($el) { + this.instances.splice($.inArray(this.instances, $el), 1); + + if (this.instances.length === 0) { + $('a, :input').add([document, window]).unbind('.dialog-overlay'); + } + + $el.remove(); + }, + + height: function() { + if ($.browser.msie && $.browser.version < 7) { + var scrollHeight = Math.max( + document.documentElement.scrollHeight, + document.body.scrollHeight + ); + var offsetHeight = Math.max( + document.documentElement.offsetHeight, + document.body.offsetHeight + ); + + if (scrollHeight < offsetHeight) { + return $(window).height() + 'px'; + } else { + return scrollHeight + 'px'; + } + } else { + return $(document).height() + 'px'; + } + }, + + width: function() { + if ($.browser.msie && $.browser.version < 7) { + var scrollWidth = Math.max( + document.documentElement.scrollWidth, + document.body.scrollWidth + ); + var offsetWidth = Math.max( + document.documentElement.offsetWidth, + document.body.offsetWidth + ); + + if (scrollWidth < offsetWidth) { + return $(window).width() + 'px'; + } else { + return scrollWidth + 'px'; + } + } else { + return $(document).width() + 'px'; + } + }, + + resize: function() { + /* If the dialog is draggable and the user drags it past the + * right edge of the window, the document becomes wider so we + * need to stretch the overlay. If the user then drags the + * dialog back to the left, the document will become narrower, + * so we need to shrink the overlay to the appropriate size. + * This is handled by shrinking the overlay before setting it + * to the full document size. + */ + var $overlays = $([]); + $.each($.ui.dialog.overlay.instances, function() { + $overlays = $overlays.add(this); + }); + + $overlays.css({ + width: 0, + height: 0 + }).css({ + width: $.ui.dialog.overlay.width(), + height: $.ui.dialog.overlay.height() + }); + } +}); + +$.extend($.ui.dialog.overlay.prototype, { + destroy: function() { + $.ui.dialog.overlay.destroy(this.$el); + } +}); + +})(jQuery); +/* + * jQuery UI Slider + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * ui.core.js + */ +(function($) { + +$.fn.unwrap = $.fn.unwrap || function(expr) { + return this.each(function(){ + $(this).parents(expr).eq(0).after(this).remove(); + }); +}; + +$.widget("ui.slider", { + plugins: {}, + ui: function(e) { + return { + options: this.options, + handle: this.currentHandle, + value: this.options.axis != "both" || !this.options.axis ? Math.round(this.value(null,this.options.axis == "vertical" ? "y" : "x")) : { + x: Math.round(this.value(null,"x")), + y: Math.round(this.value(null,"y")) + }, + range: this.getRange() + }; + }, + propagate: function(n,e) { + $.ui.plugin.call(this, n, [e, this.ui()]); + this.element.triggerHandler(n == "slide" ? n : "slide"+n, [e, this.ui()], this.options[n]); + }, + destroy: function() { + + this.element + .removeClass("ui-slider ui-slider-disabled") + .removeData("slider") + .unbind(".slider"); + + if(this.handle && this.handle.length) { + this.handle + .unwrap("a"); + this.handle.each(function() { + $(this).data("mouse").mouseDestroy(); + }); + } + + this.generated && this.generated.remove(); + + }, + setData: function(key, value) { + $.widget.prototype.setData.apply(this, arguments); + if (/min|max|steps/.test(key)) { + this.initBoundaries(); + } + + if(key == "range") { + value ? this.handle.length == 2 && this.createRange() : this.removeRange(); + } + + }, + + init: function() { + + var self = this; + this.element.addClass("ui-slider"); + this.initBoundaries(); + + // Initialize mouse and key events for interaction + this.handle = $(this.options.handle, this.element); + if (!this.handle.length) { + self.handle = self.generated = $(self.options.handles || [0]).map(function() { + var handle = $("<div/>").addClass("ui-slider-handle").appendTo(self.element); + if (this.id) + handle.attr("id", this.id); + return handle[0]; + }); + } + + + var handleclass = function(el) { + this.element = $(el); + this.element.data("mouse", this); + this.options = self.options; + + this.element.bind("mousedown", function() { + if(self.currentHandle) this.blur(self.currentHandle); + self.focus(this,1); + }); + + this.mouseInit(); + }; + + $.extend(handleclass.prototype, $.ui.mouse, { + mouseStart: function(e) { return self.start.call(self, e, this.element[0]); }, + mouseStop: function(e) { return self.stop.call(self, e, this.element[0]); }, + mouseDrag: function(e) { return self.drag.call(self, e, this.element[0]); }, + mouseCapture: function() { return true; }, + trigger: function(e) { this.mouseDown(e); } + }); + + + $(this.handle) + .each(function() { + new handleclass(this); + }) + .wrap('<a href="javascript:void(0)" style="outline:none;border:none;"></a>') + .parent() + .bind('focus', function(e) { self.focus(this.firstChild); }) + .bind('blur', function(e) { self.blur(this.firstChild); }) + .bind('keydown', function(e) { if(!self.options.noKeyboard) self.keydown(e.keyCode, this.firstChild); }) + ; + + // Bind the click to the slider itself + this.element.bind('mousedown.slider', function(e) { + self.click.apply(self, [e]); + self.currentHandle.data("mouse").trigger(e); + self.firstValue = self.firstValue + 1; //This is for always triggering the change event + }); + + // Move the first handle to the startValue + $.each(this.options.handles || [], function(index, handle) { + self.moveTo(handle.start, index, true); + }); + if (!isNaN(this.options.startValue)) + this.moveTo(this.options.startValue, 0, true); + + this.previousHandle = $(this.handle[0]); //set the previous handle to the first to allow clicking before selecting the handle + if(this.handle.length == 2 && this.options.range) this.createRange(); + }, + initBoundaries: function() { + + var element = this.element[0], o = this.options; + this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() }; + + $.extend(o, { + axis: o.axis || (element.offsetWidth < element.offsetHeight ? 'vertical' : 'horizontal'), + max: !isNaN(parseInt(o.max,10)) ? { x: parseInt(o.max, 10), y: parseInt(o.max, 10) } : ({ x: o.max && o.max.x || 100, y: o.max && o.max.y || 100 }), + min: !isNaN(parseInt(o.min,10)) ? { x: parseInt(o.min, 10), y: parseInt(o.min, 10) } : ({ x: o.min && o.min.x || 0, y: o.min && o.min.y || 0 }) + }); + //Prepare the real maxValue + o.realMax = { + x: o.max.x - o.min.x, + y: o.max.y - o.min.y + }; + //Calculate stepping based on steps + o.stepping = { + x: o.stepping && o.stepping.x || parseInt(o.stepping, 10) || (o.steps ? o.realMax.x/(o.steps.x || parseInt(o.steps, 10) || o.realMax.x) : 0), + y: o.stepping && o.stepping.y || parseInt(o.stepping, 10) || (o.steps ? o.realMax.y/(o.steps.y || parseInt(o.steps, 10) || o.realMax.y) : 0) + }; + }, + + + keydown: function(keyCode, handle) { + if(/(37|38|39|40)/.test(keyCode)) { + this.moveTo({ + x: /(37|39)/.test(keyCode) ? (keyCode == 37 ? '-' : '+') + '=' + this.oneStep("x") : 0, + y: /(38|40)/.test(keyCode) ? (keyCode == 38 ? '-' : '+') + '=' + this.oneStep("y") : 0 + }, handle); + } + }, + focus: function(handle,hard) { + this.currentHandle = $(handle).addClass('ui-slider-handle-active'); + if (hard) + this.currentHandle.parent()[0].focus(); + }, + blur: function(handle) { + $(handle).removeClass('ui-slider-handle-active'); + if(this.currentHandle && this.currentHandle[0] == handle) { this.previousHandle = this.currentHandle; this.currentHandle = null; }; + }, + click: function(e) { + // This method is only used if: + // - The user didn't click a handle + // - The Slider is not disabled + // - There is a current, or previous selected handle (otherwise we wouldn't know which one to move) + + var pointer = [e.pageX,e.pageY]; + + var clickedHandle = false; + this.handle.each(function() { + if(this == e.target) + clickedHandle = true; + }); + if (clickedHandle || this.options.disabled || !(this.currentHandle || this.previousHandle)) + return; + + // If a previous handle was focussed, focus it again + if (!this.currentHandle && this.previousHandle) + this.focus(this.previousHandle, true); + + // propagate only for distance > 0, otherwise propagation is done my drag + this.offset = this.element.offset(); + + this.moveTo({ + y: this.convertValue(e.pageY - this.offset.top - this.currentHandle[0].offsetHeight/2, "y"), + x: this.convertValue(e.pageX - this.offset.left - this.currentHandle[0].offsetWidth/2, "x") + }, null, !this.options.distance); + }, + + + + createRange: function() { + if(this.rangeElement) return; + this.rangeElement = $('<div></div>') + .addClass('ui-slider-range') + .css({ position: 'absolute' }) + .appendTo(this.element); + this.updateRange(); + }, + removeRange: function() { + this.rangeElement.remove(); + this.rangeElement = null; + }, + updateRange: function() { + var prop = this.options.axis == "vertical" ? "top" : "left"; + var size = this.options.axis == "vertical" ? "height" : "width"; + this.rangeElement.css(prop, (parseInt($(this.handle[0]).css(prop),10) || 0) + this.handleSize(0, this.options.axis == "vertical" ? "y" : "x")/2); + this.rangeElement.css(size, (parseInt($(this.handle[1]).css(prop),10) || 0) - (parseInt($(this.handle[0]).css(prop),10) || 0)); + }, + getRange: function() { + return this.rangeElement ? this.convertValue(parseInt(this.rangeElement.css(this.options.axis == "vertical" ? "height" : "width"),10), this.options.axis == "vertical" ? "y" : "x") : null; + }, + + handleIndex: function() { + return this.handle.index(this.currentHandle[0]); + }, + value: function(handle, axis) { + if(this.handle.length == 1) this.currentHandle = this.handle; + if(!axis) axis = this.options.axis == "vertical" ? "y" : "x"; + + var curHandle = $(handle != undefined && handle !== null ? this.handle[handle] || handle : this.currentHandle); + + if(curHandle.data("mouse").sliderValue) { + return parseInt(curHandle.data("mouse").sliderValue[axis],10); + } else { + return parseInt(((parseInt(curHandle.css(axis == "x" ? "left" : "top"),10) / (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(handle,axis))) * this.options.realMax[axis]) + this.options.min[axis],10); + } + + }, + convertValue: function(value,axis) { + return this.options.min[axis] + (value / (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis))) * this.options.realMax[axis]; + }, + + translateValue: function(value,axis) { + return ((value - this.options.min[axis]) / this.options.realMax[axis]) * (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis)); + }, + translateRange: function(value,axis) { + if (this.rangeElement) { + if (this.currentHandle[0] == this.handle[0] && value >= this.translateValue(this.value(1),axis)) + value = this.translateValue(this.value(1,axis) - this.oneStep(axis), axis); + if (this.currentHandle[0] == this.handle[1] && value <= this.translateValue(this.value(0),axis)) + value = this.translateValue(this.value(0,axis) + this.oneStep(axis), axis); + } + if (this.options.handles) { + var handle = this.options.handles[this.handleIndex()]; + if (value < this.translateValue(handle.min,axis)) { + value = this.translateValue(handle.min,axis); + } else if (value > this.translateValue(handle.max,axis)) { + value = this.translateValue(handle.max,axis); + } + } + return value; + }, + translateLimits: function(value,axis) { + if (value >= this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis)) + value = this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis); + if (value <= 0) + value = 0; + return value; + }, + handleSize: function(handle,axis) { + return $(handle != undefined && handle !== null ? this.handle[handle] : this.currentHandle)[0]["offset"+(axis == "x" ? "Width" : "Height")]; + }, + oneStep: function(axis) { + return this.options.stepping[axis] || 1; + }, + + + start: function(e, handle) { + + var o = this.options; + if(o.disabled) return false; + + // Prepare the outer size + this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() }; + + // This is a especially ugly fix for strange blur events happening on mousemove events + if (!this.currentHandle) + this.focus(this.previousHandle, true); + + this.offset = this.element.offset(); + + this.handleOffset = this.currentHandle.offset(); + this.clickOffset = { top: e.pageY - this.handleOffset.top, left: e.pageX - this.handleOffset.left }; + + this.firstValue = this.value(); + + this.propagate('start', e); + this.drag(e, handle); + return true; + + }, + stop: function(e) { + this.propagate('stop', e); + if (this.firstValue != this.value()) + this.propagate('change', e); + // This is a especially ugly fix for strange blur events happening on mousemove events + this.focus(this.currentHandle, true); + return false; + }, + drag: function(e, handle) { + + var o = this.options; + var position = { top: e.pageY - this.offset.top - this.clickOffset.top, left: e.pageX - this.offset.left - this.clickOffset.left}; + if(!this.currentHandle) this.focus(this.previousHandle, true); //This is a especially ugly fix for strange blur events happening on mousemove events + + position.left = this.translateLimits(position.left, "x"); + position.top = this.translateLimits(position.top, "y"); + + if (o.stepping.x) { + var value = this.convertValue(position.left, "x"); + value = Math.round(value / o.stepping.x) * o.stepping.x; + position.left = this.translateValue(value, "x"); + } + if (o.stepping.y) { + var value = this.convertValue(position.top, "y"); + value = Math.round(value / o.stepping.y) * o.stepping.y; + position.top = this.translateValue(value, "y"); + } + + position.left = this.translateRange(position.left, "x"); + position.top = this.translateRange(position.top, "y"); + + if(o.axis != "vertical") this.currentHandle.css({ left: position.left }); + if(o.axis != "horizontal") this.currentHandle.css({ top: position.top }); + + //Store the slider's value + this.currentHandle.data("mouse").sliderValue = { + x: Math.round(this.convertValue(position.left, "x")) || 0, + y: Math.round(this.convertValue(position.top, "y")) || 0 + }; + + if (this.rangeElement) + this.updateRange(); + this.propagate('slide', e); + return false; + }, + + moveTo: function(value, handle, noPropagation) { + + var o = this.options; + + // Prepare the outer size + this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() }; + + //If no handle has been passed, no current handle is available and we have multiple handles, return false + if (handle == undefined && !this.currentHandle && this.handle.length != 1) + return false; + + //If only one handle is available, use it + if (handle == undefined && !this.currentHandle) + handle = 0; + + if (handle != undefined) + this.currentHandle = this.previousHandle = $(this.handle[handle] || handle); + + + if(value.x !== undefined && value.y !== undefined) { + var x = value.x, y = value.y; + } else { + var x = value, y = value; + } + + if(x !== undefined && x.constructor != Number) { + var me = /^\-\=/.test(x), pe = /^\+\=/.test(x); + if(me || pe) { + x = this.value(null, "x") + parseInt(x.replace(me ? '=' : '+=', ''), 10); + } else { + x = isNaN(parseInt(x, 10)) ? undefined : parseInt(x, 10); + } + } + + if(y !== undefined && y.constructor != Number) { + var me = /^\-\=/.test(y), pe = /^\+\=/.test(y); + if(me || pe) { + y = this.value(null, "y") + parseInt(y.replace(me ? '=' : '+=', ''), 10); + } else { + y = isNaN(parseInt(y, 10)) ? undefined : parseInt(y, 10); + } + } + + if(o.axis != "vertical" && x !== undefined) { + if(o.stepping.x) x = Math.round(x / o.stepping.x) * o.stepping.x; + x = this.translateValue(x, "x"); + x = this.translateLimits(x, "x"); + x = this.translateRange(x, "x"); + + o.animate ? this.currentHandle.stop().animate({ left: x }, (Math.abs(parseInt(this.currentHandle.css("left")) - x)) * (!isNaN(parseInt(o.animate)) ? o.animate : 5)) : this.currentHandle.css({ left: x }); + } + + if(o.axis != "horizontal" && y !== undefined) { + if(o.stepping.y) y = Math.round(y / o.stepping.y) * o.stepping.y; + y = this.translateValue(y, "y"); + y = this.translateLimits(y, "y"); + y = this.translateRange(y, "y"); + o.animate ? this.currentHandle.stop().animate({ top: y }, (Math.abs(parseInt(this.currentHandle.css("top")) - y)) * (!isNaN(parseInt(o.animate)) ? o.animate : 5)) : this.currentHandle.css({ top: y }); + } + + if (this.rangeElement) + this.updateRange(); + + //Store the slider's value + this.currentHandle.data("mouse").sliderValue = { + x: Math.round(this.convertValue(x, "x")) || 0, + y: Math.round(this.convertValue(y, "y")) || 0 + }; + + if (!noPropagation) { + this.propagate('start', null); + this.propagate('stop', null); + this.propagate('change', null); + this.propagate("slide", null); + } + } +}); + +$.ui.slider.getter = "value"; + +$.ui.slider.defaults = { + handle: ".ui-slider-handle", + distance: 1, + animate: false +}; + +})(jQuery); +/* + * jQuery UI Tabs + * + * Copyright (c) 2007, 2008 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.tabs", { + init: function() { + this.options.event += '.tabs'; // namespace event + + // create tabs + this.tabify(true); + }, + setData: function(key, value) { + if ((/^selected/).test(key)) + this.select(value); + else { + this.options[key] = value; + this.tabify(); + } + }, + length: function() { + return this.$tabs.length; + }, + tabId: function(a) { + return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') + || this.options.idPrefix + $.data(a); + }, + ui: function(tab, panel) { + return { + options: this.options, + tab: tab, + panel: panel, + index: this.$tabs.index(tab) + }; + }, + tabify: function(init) { + + this.$lis = $('li:has(a[href])', this.element); + this.$tabs = this.$lis.map(function() { return $('a', this)[0]; }); + this.$panels = $([]); + + var self = this, o = this.options; + + this.$tabs.each(function(i, a) { + // inline tab + if (a.hash && a.hash.replace('#', '')) // Safari 2 reports '#' for an empty hash + self.$panels = self.$panels.add(a.hash); + // remote tab + else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#" + $.data(a, 'href.tabs', a.href); // required for restore on destroy + $.data(a, 'load.tabs', a.href); // mutable + var id = self.tabId(a); + a.href = '#' + id; + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id).addClass(o.panelClass) + .insertAfter( self.$panels[i - 1] || self.element ); + $panel.data('destroy.tabs', true); + } + self.$panels = self.$panels.add( $panel ); + } + // invalid tab href + else + o.disabled.push(i + 1); + }); + + if (init) { + + // attach necessary classes for styling if not present + this.element.addClass(o.navClass); + this.$panels.each(function() { + var $this = $(this); + $this.addClass(o.panelClass); + }); + + // Selected tab + // use "selected" option or try to retrieve: + // 1. from fragment identifier in url + // 2. from cookie + // 3. from selected class attribute on <li> + if (o.selected === undefined) { + if (location.hash) { + this.$tabs.each(function(i, a) { + if (a.hash == location.hash) { + o.selected = i; + // prevent page scroll to fragment + if ($.browser.msie || $.browser.opera) { // && !o.remote + var $toShow = $(location.hash), toShowId = $toShow.attr('id'); + $toShow.attr('id', ''); + setTimeout(function() { + $toShow.attr('id', toShowId); // restore id + }, 500); + } + scrollTo(0, 0); + return false; // break + } + }); + } + else if (o.cookie) { + var index = parseInt($.cookie('ui-tabs' + $.data(self.element)),10); + if (index && self.$tabs[index]) + o.selected = index; + } + else if (self.$lis.filter('.' + o.selectedClass).length) + o.selected = self.$lis.index( self.$lis.filter('.' + o.selectedClass)[0] ); + } + o.selected = o.selected === null || o.selected !== undefined ? o.selected : 0; // first tab selected by default + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + // A selected tab cannot become disabled. + o.disabled = $.unique(o.disabled.concat( + $.map(this.$lis.filter('.' + o.disabledClass), + function(n, i) { return self.$lis.index(n); } ) + )).sort(); + if ($.inArray(o.selected, o.disabled) != -1) + o.disabled.splice($.inArray(o.selected, o.disabled), 1); + + // highlight selected tab + this.$panels.addClass(o.hideClass); + this.$lis.removeClass(o.selectedClass); + if (o.selected !== null) { + this.$panels.eq(o.selected).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before + this.$lis.eq(o.selected).addClass(o.selectedClass); + + // seems to be expected behavior that the show callback is fired + var onShow = function() { + $(self.element).triggerHandler('tabsshow', + [self.fakeEvent('tabsshow'), self.ui(self.$tabs[o.selected], self.$panels[o.selected])], o.show); + }; + + // load if remote tab + if ($.data(this.$tabs[o.selected], 'load.tabs')) + this.load(o.selected, onShow); + // just trigger show event + else + onShow(); + + } + + // clean up to avoid memory leaks in certain versions of IE 6 + $(window).bind('unload', function() { + self.$tabs.unbind('.tabs'); + self.$lis = self.$tabs = self.$panels = null; + }); + + } + + // disable tabs + for (var i = 0, li; li = this.$lis[i]; i++) + $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass); + + // reset cache if switching from cached to not cached + if (o.cache === false) + this.$tabs.removeData('cache.tabs'); + + // set up animations + var hideFx, showFx, baseFx = { 'min-width': 0, duration: 1 }, baseDuration = 'normal'; + if (o.fx && o.fx.constructor == Array) + hideFx = o.fx[0] || baseFx, showFx = o.fx[1] || baseFx; + else + hideFx = showFx = o.fx || baseFx; + + // reset some styles to maintain print style sheets etc. + var resetCSS = { display: '', overflow: '', height: '' }; + if (!$.browser.msie) // not in IE to prevent ClearType font issue + resetCSS.opacity = ''; + + // Hide a tab, animation prevents browser scrolling to fragment, + // $show is optional. + function hideTab(clicked, $hide, $show) { + $hide.animate(hideFx, hideFx.duration || baseDuration, function() { // + $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie && hideFx.opacity) + $hide[0].style.filter = ''; + if ($show) + showTab(clicked, $show, $hide); + }); + } + + // Show a tab, animation prevents browser scrolling to fragment, + // $hide is optional. + function showTab(clicked, $show, $hide) { + if (showFx === baseFx) + $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels + $show.animate(showFx, showFx.duration || baseDuration, function() { + $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie && showFx.opacity) + $show[0].style.filter = ''; + + // callback + $(self.element).triggerHandler('tabsshow', + [self.fakeEvent('tabsshow'), self.ui(clicked, $show[0])], o.show); + + }); + } + + // switch a tab + function switchTab(clicked, $li, $hide, $show) { + /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click + $.ajaxHistory.update(clicked.hash); + }*/ + $li.addClass(o.selectedClass) + .siblings().removeClass(o.selectedClass); + hideTab(clicked, $hide, $show); + } + + // attach tab event handler, unbind to avoid duplicates from former tabifying... + this.$tabs.unbind('.tabs').bind(o.event, function() { + + //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click + var $li = $(this).parents('li:eq(0)'), + $hide = self.$panels.filter(':visible'), + $show = $(this.hash); + + // If tab is already selected and not unselectable or tab disabled or + // or is already loading or click callback returns false stop here. + // Check if click handler returns false last so that it is not executed + // for a disabled or loading tab! + if (($li.hasClass(o.selectedClass) && !o.unselect) + || $li.hasClass(o.disabledClass) + || $(this).hasClass(o.loadingClass) + || $(self.element).triggerHandler('tabsselect', [self.fakeEvent('tabsselect'), self.ui(this, $show[0])], o.select) === false + ) { + this.blur(); + return false; + } + + self.options.selected = self.$tabs.index(this); + + // if tab may be closed + if (o.unselect) { + if ($li.hasClass(o.selectedClass)) { + self.options.selected = null; + $li.removeClass(o.selectedClass); + self.$panels.stop(); + hideTab(this, $hide); + this.blur(); + return false; + } else if (!$hide.length) { + self.$panels.stop(); + var a = this; + self.load(self.$tabs.index(this), function() { + $li.addClass(o.selectedClass).addClass(o.unselectClass); + showTab(a, $show); + }); + this.blur(); + return false; + } + } + + if (o.cookie) + $.cookie('ui-tabs' + $.data(self.element), self.options.selected, o.cookie); + + // stop possibly running animations + self.$panels.stop(); + + // show new tab + if ($show.length) { + + // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled + /*if ($.browser.msie && o.bookmarkable) { + var showId = this.hash.replace('#', ''); + $show.attr('id', ''); + setTimeout(function() { + $show.attr('id', showId); // restore id + }, 0); + }*/ + + var a = this; + self.load(self.$tabs.index(this), $hide.length ? + function() { + switchTab(a, $li, $hide, $show); + } : + function() { + $li.addClass(o.selectedClass); + showTab(a, $show); + } + ); + + // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash + /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0; + setTimeout(function() { + scrollTo(scrollX, scrollY); + }, 0);*/ + + } else + throw 'jQuery UI Tabs: Mismatching fragment identifier.'; + + // Prevent IE from keeping other link focussed when using the back button + // and remove dotted border from clicked link. This is controlled in modern + // browsers via CSS, also blur removes focus from address bar in Firefox + // which can become a usability and annoying problem with tabsRotate. + if ($.browser.msie) + this.blur(); + + //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE + return false; + + }); + + // disable click if event is configured to something else + if (!(/^click/).test(o.event)) + this.$tabs.bind('click.tabs', function() { return false; }); + + }, + add: function(url, label, index) { + if (index == undefined) + index = this.$tabs.length; // append by default + + var o = this.options; + var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)); + $li.data('destroy.tabs', true); + + var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] ); + + // try to find an existing element before creating a new one + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id) + .addClass(o.hideClass) + .data('destroy.tabs', true); + } + $panel.addClass(o.panelClass); + if (index >= this.$lis.length) { + $li.appendTo(this.element); + $panel.appendTo(this.element[0].parentNode); + } else { + $li.insertBefore(this.$lis[index]); + $panel.insertBefore(this.$panels[index]); + } + + o.disabled = $.map(o.disabled, + function(n, i) { return n >= index ? ++n : n }); + + this.tabify(); + + if (this.$tabs.length == 1) { + $li.addClass(o.selectedClass); + $panel.removeClass(o.hideClass); + var href = $.data(this.$tabs[0], 'load.tabs'); + if (href) + this.load(index, href); + } + + // callback + this.element.triggerHandler('tabsadd', + [this.fakeEvent('tabsadd'), this.ui(this.$tabs[index], this.$panels[index])], o.add + ); + }, + remove: function(index) { + var o = this.options, $li = this.$lis.eq(index).remove(), + $panel = this.$panels.eq(index).remove(); + + // If selected tab was removed focus tab to the right or + // in case the last tab was removed the tab to the left. + if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) + this.select(index + (index + 1 < this.$tabs.length ? 1 : -1)); + + o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), + function(n, i) { return n >= index ? --n : n }); + + this.tabify(); + + // callback + this.element.triggerHandler('tabsremove', + [this.fakeEvent('tabsremove'), this.ui($li.find('a')[0], $panel[0])], o.remove + ); + }, + enable: function(index) { + var o = this.options; + if ($.inArray(index, o.disabled) == -1) + return; + + var $li = this.$lis.eq(index).removeClass(o.disabledClass); + if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... + $li.css('display', 'inline-block'); + setTimeout(function() { + $li.css('display', 'block'); + }, 0); + } + + o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); + + // callback + this.element.triggerHandler('tabsenable', + [this.fakeEvent('tabsenable'), this.ui(this.$tabs[index], this.$panels[index])], o.enable + ); + + }, + disable: function(index) { + var self = this, o = this.options; + if (index != o.selected) { // cannot disable already selected tab + this.$lis.eq(index).addClass(o.disabledClass); + + o.disabled.push(index); + o.disabled.sort(); + + // callback + this.element.triggerHandler('tabsdisable', + [this.fakeEvent('tabsdisable'), this.ui(this.$tabs[index], this.$panels[index])], o.disable + ); + } + }, + select: function(index) { + if (typeof index == 'string') + index = this.$tabs.index( this.$tabs.filter('[href$=' + index + ']')[0] ); + this.$tabs.eq(index).trigger(this.options.event); + }, + load: function(index, callback) { // callback is for internal usage only + + var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0], + bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs'); + + callback = callback || function() {}; + + // no remote or from cache - just finish with callback + if (!url || !bypassCache && $.data(a, 'cache.tabs')) { + callback(); + return; + } + + // load remote from here on + + var inner = function(parent) { + var $parent = $(parent), $inner = $parent.find('*:last'); + return $inner.length && $inner.is(':not(img)') && $inner || $parent; + }; + var cleanup = function() { + self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass) + .each(function() { + if (o.spinner) + inner(this).parent().html(inner(this).data('label.tabs')); + }); + self.xhr = null; + }; + + if (o.spinner) { + var label = inner(a).html(); + inner(a).wrapInner('<em></em>') + .find('em').data('label.tabs', label).html(o.spinner); + } + + var ajaxOptions = $.extend({}, o.ajaxOptions, { + url: url, + success: function(r, s) { + $(a.hash).html(r); + cleanup(); + + if (o.cache) + $.data(a, 'cache.tabs', true); // if loaded once do not load them again + + // callbacks + $(self.element).triggerHandler('tabsload', + [self.fakeEvent('tabsload'), self.ui(self.$tabs[index], self.$panels[index])], o.load + ); + o.ajaxOptions.success && o.ajaxOptions.success(r, s); + + // This callback is required because the switch has to take + // place after loading has completed. Call last in order to + // fire load before show callback... + callback(); + } + }); + if (this.xhr) { + // terminate pending requests from other tabs and restore tab label + this.xhr.abort(); + cleanup(); + } + $a.addClass(o.loadingClass); + setTimeout(function() { // timeout is again required in IE, "wait" for id being restored + self.xhr = $.ajax(ajaxOptions); + }, 0); + + }, + url: function(index, url) { + this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url); + }, + destroy: function() { + var o = this.options; + this.element.unbind('.tabs') + .removeClass(o.navClass).removeData('tabs'); + this.$tabs.each(function() { + var href = $.data(this, 'href.tabs'); + if (href) + this.href = href; + var $this = $(this).unbind('.tabs'); + $.each(['href', 'load', 'cache'], function(i, prefix) { + $this.removeData(prefix + '.tabs'); + }); + }); + this.$lis.add(this.$panels).each(function() { + if ($.data(this, 'destroy.tabs')) + $(this).remove(); + else + $(this).removeClass([o.selectedClass, o.unselectClass, + o.disabledClass, o.panelClass, o.hideClass].join(' ')); + }); + }, + fakeEvent: function(type) { + return $.event.fix({ + type: type, + target: this.element[0] + }); + } +}); + +$.ui.tabs.defaults = { + // basic setup + unselect: false, + event: 'click', + disabled: [], + cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } + // TODO history: false, + + // Ajax + spinner: 'Loading&#8230;', + cache: false, + idPrefix: 'ui-tabs-', + ajaxOptions: {}, + + // animations + fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } + + // templates + tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>', + panelTemplate: '<div></div>', + + // CSS classes + navClass: 'ui-tabs-nav', + selectedClass: 'ui-tabs-selected', + unselectClass: 'ui-tabs-unselect', + disabledClass: 'ui-tabs-disabled', + panelClass: 'ui-tabs-panel', + hideClass: 'ui-tabs-hide', + loadingClass: 'ui-tabs-loading' +}; + +$.ui.tabs.getter = "length"; + +/* + * Tabs Extensions + */ + +/* + * Rotate + */ +$.extend($.ui.tabs.prototype, { + rotation: null, + rotate: function(ms, continuing) { + + continuing = continuing || false; + + var self = this, t = this.options.selected; + + function start() { + self.rotation = setInterval(function() { + t = ++t < self.$tabs.length ? t : 0; + self.select(t); + }, ms); + } + + function stop(e) { + if (!e || e.clientX) { // only in case of a true click + clearInterval(self.rotation); + } + } + + // start interval + if (ms) { + start(); + if (!continuing) + this.$tabs.bind(this.options.event, stop); + else + this.$tabs.bind(this.options.event, function() { + stop(); + t = self.options.selected; + start(); + }); + } + // stop interval + else { + stop(); + this.$tabs.unbind(this.options.event, stop); + } + } +}); + +})(jQuery); +/* + * jQuery UI Datepicker + * + * Copyright (c) 2006, 2007, 2008 Marc Grabanski + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * ui.core.js + * + * Marc Grabanski (m@marcgrabanski.com) and Keith Wood (kbwood@virginbroadband.com.au). + */ + +(function($) { // hide the namespace + +var PROP_NAME = 'datepicker'; + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._promptClass = 'ui-datepicker-prompt'; // The name of the dialog prompt marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + clearText: 'Clear', // Display text for clear link + clearStatus: 'Erase the current date', // Status text for clear link + closeText: 'Close', // Display text for close link + closeStatus: 'Close without change', // Status text for close link + prevText: '&#x3c;Prev', // Display text for previous month link + prevStatus: 'Show the previous month', // Status text for previous month link + nextText: 'Next&#x3e;', // Display text for next month link + nextStatus: 'Show the next month', // Status text for next month link + currentText: 'Today', // Display text for current month link + currentStatus: 'Show the current month', // Status text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + monthStatus: 'Show a different month', // Status text for selecting a month + yearStatus: 'Show a different year', // Status text for selecting a year + weekHeader: 'Wk', // Header for the week of the year column + weekStatus: 'Week of the year', // Status text for the week of the year column + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + dayStatus: 'Set DD as first week day', // Status text for the day of the week selection + dateStatus: 'Select DD, M d', // Status text for the date selection + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + initStatus: 'Select a date', // Initial Status text on opening + isRTL: false // True if right-to-left language, false if left-to-right + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'show', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + closeAtTop: true, // True to have the clear/close at the top, + // false to have them at the bottom + mandatory: false, // True to hide the Clear link, false to include it + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: true, // True if month can be selected directly, false if only prev/next + changeYear: true, // True if year can be selected directly, false if only prev/next + yearRange: '-10:+10', // Range of years to display in drop-down, + // either relative to current year (-nn:+nn) or absolute (nnnn:nnnn) + changeFirstDay: true, // True to click on day name to change, false to remain as set + highlightWeek: false, // True to highlight the selected week + showOtherMonths: false, // True to show dates in other months, false to leave blank + showWeeks: false, // True to show week of the year, false to omit + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + showStatus: false, // True to show status bar at bottom, false to not show it + statusForDate: this.dateStatus, // Function to provide status text for a date - + // takes date and instance as parameters, returns display text + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: 'normal', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + stepMonths: 1, // Number of months to step back/forward + rangeSelect: false, // Allows for selecting a date range on one date picker + rangeSeparator: ' - ', // Text between two dates in a range + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '' // The date format to use for the alternate field + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = $('<div id="' + this._mainDivId + '" style="display: none;"></div>'); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + var inlineSettings = null; + for (attrName in this._defaults) { + var attrValue = target.getAttribute('date:' + attrName); + if (attrValue) { + inlineSettings = inlineSettings || {}; + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + var nodeName = target.nodeName.toLowerCase(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) + target.id = 'dp' + new Date().getTime(); + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + return {id: target[0].id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + $('<div class="ui-datepicker-inline"></div>'))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + if (input.hasClass(this.markerClassName)) + return; + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (appendText) + input[isRTL ? 'before' : 'after']('<span class="' + this._appendClass + '">' + appendText + '</span>'); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + var trigger = $(this._get(inst, 'buttonImageOnly') ? + $('<img/>').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('<button type="button"></button>').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('<img/>').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](trigger); + trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(target); + return false; + }); + } + input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var input = $(target); + if (input.hasClass(this.markerClassName)) + return; + input.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst)); + this._updateDatepicker(inst); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param dateText string - the initial date to display (in the current format) + @param onSelect function - the function(dateText) to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, dateText, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + var id = 'dp' + new Date().getTime(); + this._dialogInput = $('<input type="text" id="' + id + + '" size="1" style="position: absolute; top: -100px;"/>'); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + this._dialogInput.val(dateText); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; + var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var nodeName = target.nodeName.toLowerCase(); + var $target = $(target); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + $target.siblings('.' + this._appendClass).remove().end(). + siblings('.' + this._triggerClass).remove().end(). + removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + target.disabled = false; + $(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = false; }).end(). + siblings('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''}); + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + target.disabled = true; + $(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = true; }).end(). + siblings('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'}); + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) + return false; + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Update the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or + @param value any - the new value for the setting (omit if above is an object) */ + _changeDatepicker: function(target, name, value) { + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst = $.data(target, PROP_NAME)) { + extendRemove(inst.settings, settings); + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date + @param endDate Date - the new end date for a range (optional) */ + _setDateDatepicker: function(target, date, endDate) { + var inst = $.data(target, PROP_NAME); + if (inst) { + this._setDate(inst, date, endDate); + this._updateDatepicker(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @return Date - the current date or + Date[2] - the current dates for a range */ + _getDateDatepicker: function(target) { + var inst = $.data(target, PROP_NAME); + if (inst) + this._setDateFromField(inst); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(e) { + var inst = $.data(e.target, PROP_NAME); + var handled = true; + if ($.datepicker._datepickerShowing) + switch (e.keyCode) { + case 9: $.datepicker._hideDatepicker(null, ''); + break; // hide on tab out + case 13: $.datepicker._selectDay(e.target, inst.selectedMonth, inst.selectedYear, + $('td.ui-datepicker-days-cell-over', inst.dpDiv)[0]); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration')); + break; // hide on escape + case 33: $.datepicker._adjustDate(e.target, (e.ctrlKey ? -1 : + -$.datepicker._get(inst, 'stepMonths')), (e.ctrlKey ? 'Y' : 'M')); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(e.target, (e.ctrlKey ? +1 : + +$.datepicker._get(inst, 'stepMonths')), (e.ctrlKey ? 'Y' : 'M')); + break; // next month/year on page down/+ ctrl + case 35: if (e.ctrlKey) $.datepicker._clearDate(e.target); + break; // clear on ctrl+end + case 36: if (e.ctrlKey) $.datepicker._gotoToday(e.target); + break; // current on ctrl+home + case 37: if (e.ctrlKey) $.datepicker._adjustDate(e.target, -1, 'D'); + break; // -1 day on ctrl+left + case 38: if (e.ctrlKey) $.datepicker._adjustDate(e.target, -7, 'D'); + break; // -1 week on ctrl+up + case 39: if (e.ctrlKey) $.datepicker._adjustDate(e.target, +1, 'D'); + break; // +1 day on ctrl+right + case 40: if (e.ctrlKey) $.datepicker._adjustDate(e.target, +7, 'D'); + break; // +1 week on ctrl+down + default: handled = false; + } + else if (e.keyCode == 36 && e.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else + handled = false; + if (handled) { + e.preventDefault(); + e.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(e) { + var inst = $.data(e.target, PROP_NAME); + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode : e.charCode); + return e.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.data(input, PROP_NAME); + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + $.datepicker._hideDatepicker(null, ''); + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + inst.rangeStart = null; + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1] * + $('.ui-datepicker', inst.dpDiv[0])[0].offsetWidth); + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim') || 'show'; + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._datepickerShowing = true; + if ($.browser.msie && parseInt($.browser.version) < 7) // fix IE < 7 select problems + $('iframe.ui-datepicker-cover').css({width: inst.dpDiv.width() + 4, + height: inst.dpDiv.height() + 4}); + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim](duration, postProcess); + if (duration == '') + postProcess(); + if (inst.input[0].type != 'hidden') + inst.input[0].focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var dims = {width: inst.dpDiv.width() + 4, + height: inst.dpDiv.height() + 4}; + inst.dpDiv.empty().append(this._generateDatepicker(inst)). + find('iframe.ui-datepicker-cover'). + css({width: dims.width, height: dims.height}); + var numMonths = this._getNumberOfMonths(inst); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst.input && inst.input[0].type != 'hidden') + $(inst.input[0]).focus(); + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var pos = inst.input ? this._findPos(inst.input[0]) : null; + var browserWidth = window.innerWidth || document.documentElement.clientWidth; + var browserHeight = window.innerHeight || document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + // reposition date picker horizontally if outside the browser window + if (this._get(inst, 'isRTL') || (offset.left + inst.dpDiv.width() - scrollX) > browserWidth) + offset.left = Math.max((isFixed ? 0 : scrollX), + pos[0] + (inst.input ? inst.input.width() : 0) - (isFixed ? scrollX : 0) - inst.dpDiv.width() - + (isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0)); + else + offset.left -= (isFixed ? scrollX : 0); + // reposition date picker vertically if outside the browser window + if ((offset.top + inst.dpDiv.height() - scrollY) > browserHeight) + offset.top = Math.max((isFixed ? 0 : scrollY), + pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst.dpDiv.height()) - + (isFixed && $.browser.opera ? document.documentElement.scrollTop : 0)); + else + offset.top -= (isFixed ? scrollY : 0); + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) { + obj = obj.nextSibling; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker + @param duration string - the duration over which to close the date picker */ + _hideDatepicker: function(input, duration) { + var inst = this._curInst; + if (!inst) + return; + var rangeSelect = this._get(inst, 'rangeSelect'); + if (rangeSelect && this._stayOpen) + this._selectDate('#' + inst.id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + this._stayOpen = false; + if (this._datepickerShowing) { + duration = (duration != null ? duration : this._get(inst, 'duration')); + var showAnim = this._get(inst, 'showAnim'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + }; + if (duration != '' && $.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), + duration, postProcess); + else + inst.dpDiv[(duration == '' ? 'hide' : (showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide')))](duration, postProcess); + if (duration == '') + this._tidyDialog(inst); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [this._getDate(inst), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + inst.settings.prompt = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + this._curInst = null; + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker'); + $('.' + this._promptClass, inst.dpDiv).remove(); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if (($target.parents('#' + $.datepicker._mainDivId).length == 0) && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(null, ''); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + this._adjustInstDate(inst, offset, period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._adjustDate(target); + this._notifyChange(inst); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + inst._selectingMonthYear = false; + inst[period == 'M' ? 'drawMonth' : 'drawYear'] = + select.options[select.selectedIndex].value - 0; + this._adjustDate(target); + this._notifyChange(inst); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + if (inst.input && inst._selectingMonthYear && !$.browser.msie) + inst.input[0].focus(); + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for changing the first week day. */ + _changeFirstDay: function(id, day) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + inst.settings.firstDay = day; + this._updateDatepicker(inst); + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + if ($(td).hasClass(this._unselectableClass)) + return; + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + var rangeSelect = this._get(inst, 'rangeSelect'); + if (rangeSelect) { + this._stayOpen = !this._stayOpen; + if (this._stayOpen) { + $('.ui-datepicker td').removeClass(this._currentClass); + $(td).addClass(this._currentClass); + } + } + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + if (this._stayOpen) { + inst.endDay = inst.endMonth = inst.endYear = null; + } + else if (rangeSelect) { + inst.endDay = inst.currentDay; + inst.endMonth = inst.currentMonth; + inst.endYear = inst.currentYear; + } + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + if (this._stayOpen) { + inst.rangeStart = this._daylightSavingAdjust( + new Date(inst.currentYear, inst.currentMonth, inst.currentDay)); + this._updateDatepicker(inst); + } + else if (rangeSelect) { + inst.selectedDay = inst.currentDay = inst.rangeStart.getDate(); + inst.selectedMonth = inst.currentMonth = inst.rangeStart.getMonth(); + inst.selectedYear = inst.currentYear = inst.rangeStart.getFullYear(); + inst.rangeStart = null; + if (inst.inline) + this._updateDatepicker(inst); + } + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + if (this._get(inst, 'mandatory')) + return; + this._stayOpen = false; + inst.endDay = inst.endMonth = inst.endYear = inst.rangeStart = null; + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (this._get(inst, 'rangeSelect') && dateStr) + dateStr = (inst.rangeStart ? this._formatDate(inst, inst.rangeStart) : + dateStr) + this._get(inst, 'rangeSeparator') + dateStr; + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else if (!this._stayOpen) { + this._hideDatepicker(null, this._get(inst, 'duration')); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input[0].focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat'); + var date = this._getDate(inst); + dateStr = (isArray(date) ? (!date[0] && !date[1] ? '' : + this.formatDate(altFormat, date[0], this._getFormatConfig(inst)) + + this._get(inst, 'rangeSeparator') + this.formatDate( + altFormat, date[1] || date[0], this._getFormatConfig(inst))) : + this.formatDate(altFormat, date, this._getFormatConfig(inst))); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); + var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First week always contains 4 Jan + var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun = 7 + firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday + if (firstDay < 4 && checkDate < firstMon) { // Adjust first three days in year if necessary + checkDate.setDate(checkDate.getDate() - 3); // Generate for previous year + return $.datepicker.iso8601Week(checkDate); + } else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) { // Check last three days in year + firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7; + if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) { // Adjust if necessary + checkDate.setDate(checkDate.getDate() + 3); // Generate for next year + return $.datepicker.iso8601Week(checkDate); + } + } + return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1; // Weeks to given date + }, + + /* Provide status text for a particular date. + @param date the date to get the status for + @param inst the current datepicker instance + @return the status display text for this date */ + dateStatus: function(date, inst) { + return $.datepicker.formatDate($.datepicker._get(inst, 'dateStatus'), + date, $.datepicker._getFormatConfig(inst)); + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + lookAhead(match); + var origSize = (match == '@' ? 14 : (match == 'y' ? 4 : 2)); + var size = origSize; + var num = 0; + while (size > 0 && iValue < value.length && + value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') { + num = num * 10 + (value.charAt(iValue++) - 0); + size--; + } + if (size == origSize) + throw 'Missing number at position ' + iValue; + return num; + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = (lookAhead(match) ? longNames : shortNames); + var size = 0; + for (var j = 0; j < names.length; j++) + size = Math.max(size, names[j].length); + var name = ''; + var iInit = iValue; + while (size > 0 && iValue < value.length) { + name += value.charAt(iValue++); + for (var i = 0; i < names.length; i++) + if (name == names[i]) + return i + 1; + size--; + } + throw 'Unknown name at position ' + iInit; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/* + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + COOKIE: 'D, dd M yy', + ISO_8601: 'yy-mm-dd', + RFC_822: 'D, d M y', + RFC_850: 'DD, dd-M-y', + RFC_1036: 'D, d M y', + RFC_1123: 'D, d M yy', + RFC_2822: 'D, d M yy', + RSS: 'D, d M y', // RFC 822 + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value) { + return (lookAhead(match) && value < 10 ? '0' : '') + value; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate()); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst) { + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.input ? inst.input.val().split(this._get(inst, 'rangeSeparator')) : null; + inst.endDay = inst.endMonth = inst.endYear = null; + var date = defaultDate = this._getDefaultDate(inst); + if (dates.length > 0) { + var settings = this._getFormatConfig(inst); + if (dates.length > 1) { + date = this.parseDate(dateFormat, dates[1], settings) || defaultDate; + inst.endDay = date.getDate(); + inst.endMonth = date.getMonth(); + inst.endYear = date.getFullYear(); + } + try { + date = this.parseDate(dateFormat, dates[0], settings) || defaultDate; + } catch (e) { + this.log(e); + date = defaultDate; + } + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates[0] ? date.getDate() : 0); + inst.currentMonth = (dates[0] ? date.getMonth() : 0); + inst.currentYear = (dates[0] ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + var date = this._determineDate(this._get(inst, 'defaultDate'), new Date()); + var minDate = this._getMinMaxDate(inst, 'min', true); + var maxDate = this._getMinMaxDate(inst, 'max'); + date = (minDate && date < minDate ? minDate : date); + date = (maxDate && date > maxDate ? maxDate : date); + return date; + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset, getDaysInMonth) { + var date = new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += (matches[1] - 0); break; + case 'w' : case 'W' : + day += (matches[1] * 7); break; + case 'm' : case 'M' : + month += (matches[1] - 0); + day = Math.min(day, getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += (matches[1] - 0); + day = Math.min(day, getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + date = (date == null ? defaultDate : + (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date))); + date = (date && date.toString() == 'Invalid Date' ? defaultDate : date); + if (date) { + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + } + return this._daylightSavingAdjust(date); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, endDate) { + var clear = !(date); + date = this._determineDate(date, new Date()); + inst.selectedDay = inst.currentDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear(); + if (this._get(inst, 'rangeSelect')) { + if (endDate) { + endDate = this._determineDate(endDate, null); + inst.endDay = endDate.getDate(); + inst.endMonth = endDate.getMonth(); + inst.endYear = endDate.getFullYear(); + } else { + inst.endDay = inst.currentDay; + inst.endMonth = inst.currentMonth; + inst.endYear = inst.currentYear; + } + } + this._adjustInstDate(inst); + if (inst.input) + inst.input.val(clear ? '' : this._formatDate(inst) + + (!this._get(inst, 'rangeSelect') ? '' : this._get(inst, 'rangeSeparator') + + this._formatDate(inst, inst.endDay, inst.endMonth, inst.endYear))); + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + if (this._get(inst, 'rangeSelect')) { + return [inst.rangeStart || startDate, + (!inst.endYear ? inst.rangeStart || startDate : + this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth, inst.endDay)))]; + } else + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateDatepicker: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var showStatus = this._get(inst, 'showStatus'); + var isRTL = this._get(inst, 'isRTL'); + // build the date picker HTML + var clear = (this._get(inst, 'mandatory') ? '' : + '<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'clearStatus') || '&#xa0;') : '') + '>' + + this._get(inst, 'clearText') + '</a></div>'); + var controls = '<div class="ui-datepicker-control">' + (isRTL ? '' : clear) + + '<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'closeStatus') || '&#xa0;') : '') + '>' + + this._get(inst, 'closeText') + '</a></div>' + (isRTL ? clear : '') + '</div>'; + var prompt = this._get(inst, 'prompt'); + var closeAtTop = this._get(inst, 'closeAtTop'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min', true); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth; + var drawYear = inst.drawYear; + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + // controls and links + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = '<div class="ui-datepicker-prev">' + (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'prevStatus') || '&#xa0;') : '') + '>' + prevText + '</a>' : + (hideIfNoPrevNext ? '' : '<label>' + prevText + '</label>')) + '</div>'; + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = '<div class="ui-datepicker-next">' + (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'nextStatus') || '&#xa0;') : '') + '>' + nextText + '</a>' : + (hideIfNoPrevNext ? '' : '<label>' + nextText + '</label>')) + '</div>'; + var currentText = this._get(inst, 'currentText'); + currentText = (!navigationAsDateFormat ? currentText: this.formatDate( + currentText, today, this._getFormatConfig(inst))); + var html = (prompt ? '<div class="' + this._promptClass + '">' + prompt + '</div>' : '') + + (closeAtTop && !inst.inline ? controls : '') + + '<div class="ui-datepicker-links">' + (isRTL ? next : prev) + + (this._isInRange(inst, (this._get(inst, 'gotoCurrent') && inst.currentDay ? + currentDate : today)) ? '<div class="ui-datepicker-current">' + + '<a onclick="jQuery.datepicker._gotoToday(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'currentStatus') || '&#xa0;') : '') + '>' + + currentText + '</a></div>' : '') + (isRTL ? prev : next) + '</div>'; + var firstDay = this._get(inst, 'firstDay'); + var changeFirstDay = this._get(inst, 'changeFirstDay'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var highlightWeek = this._get(inst, 'highlightWeek'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var showWeeks = this._get(inst, 'showWeeks'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var status = (showStatus ? this._get(inst, 'dayStatus') || '&#xa0;' : ''); + var dateStatus = this._get(inst, 'statusForDate') || this.dateStatus; + var endDate = inst.endDay ? this._daylightSavingAdjust( + new Date(inst.endYear, inst.endMonth, inst.endDay)) : currentDate; + for (var row = 0; row < numMonths[0]; row++) + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + html += '<div class="ui-datepicker-one-month' + (col == 0 ? ' ui-datepicker-new-row' : '') + '">' + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + selectedDate, row > 0 || col > 0, showStatus, monthNames) + // draw month headers + '<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>' + + '<tr class="ui-datepicker-title-row">' + + (showWeeks ? '<td>' + this._get(inst, 'weekHeader') + '</td>' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + var dayStatus = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) : + status.replace(/D/, dayNamesShort[day])); + html += '<td' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"' : '') + '>' + + (!changeFirstDay ? '<span' : + '<a onclick="jQuery.datepicker._changeFirstDay(\'#' + inst.id + '\', ' + day + ');"') + + (showStatus ? this._addStatus(inst, dayStatus) : '') + ' title="' + dayNames[day] + '">' + + dayNamesMin[day] + (changeFirstDay ? '</a>' : '</span>') + '</td>'; + } + html += '</tr></thead><tbody>'; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + html += '<tr class="ui-datepicker-days-row">' + + (showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + '</td>' : ''); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = otherMonth || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + html += '<td class="ui-datepicker-days-cell' + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end-cell' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-otherMonth' : '') + // highlight days from other months + (printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth ? + ' ui-datepicker-days-cell-over' : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass : '') + // highlight unselectable days + (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates + (printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? // in current range + ' ' + this._currentClass : '') + // highlight selected day + (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title + (unselectable ? (highlightWeek ? ' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"' + // highlight selection week + ' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"' : '') : // unhighlight selection week + ' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')' + // highlight selection + (highlightWeek ? '.parent().addClass(\'ui-datepicker-week-over\')' : '') + ';' + // highlight selection week + (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' + + inst.id + '\').html(\'' + (dateStatus.apply((inst.input ? inst.input[0] : null), + [printDate, inst]) || '&#xa0;') +'\');') + '"' + + ' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')' + // unhighlight selection + (highlightWeek ? '.parent().removeClass(\'ui-datepicker-week-over\')' : '') + ';' + // unhighlight selection week + (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' + + inst.id + '\').html(\'&#xa0;\');') + '" onclick="jQuery.datepicker._selectDay(\'#' + + inst.id + '\',' + drawMonth + ',' + drawYear + ', this);"') + '>' + // actions + (otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : // display for other months + (unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; // display for this month + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + html += '</tr>'; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + html += '</tbody></table></div>'; + } + html += (showStatus ? '<div style="clear: both;"></div><div id="ui-datepicker-status-' + inst.id + + '" class="ui-datepicker-status">' + (this._get(inst, 'initStatus') || '&#xa0;') + '</div>' : '') + + (!closeAtTop && !inst.inline ? controls : '') + + '<div style="clear: both;"></div>' + + ($.browser.msie && parseInt($.browser.version) < 7 && !inst.inline ? + '<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>' : ''); + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + selectedDate, secondary, showStatus, monthNames) { + minDate = (inst.rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate); + var html = '<div class="ui-datepicker-header">'; + // month selection + if (secondary || !this._get(inst, 'changeMonth')) + html += monthNames[drawMonth] + '&#xa0;'; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + html += '<select class="ui-datepicker-new-month" ' + + 'onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + + 'onclick="jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'monthStatus') || '&#xa0;') : '') + '>'; + for (var month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth())) + html += '<option value="' + month + '"' + + (month == drawMonth ? ' selected="selected"' : '') + + '>' + monthNames[month] + '</option>'; + } + html += '</select>'; + } + // year selection + if (secondary || !this._get(inst, 'changeYear')) + html += drawYear; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var year = 0; + var endYear = 0; + if (years.length != 2) { + year = drawYear - 10; + endYear = drawYear + 10; + } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') { + year = endYear = new Date().getFullYear(); + year += parseInt(years[0], 10); + endYear += parseInt(years[1], 10); + } else { + year = parseInt(years[0], 10); + endYear = parseInt(years[1], 10); + } + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + html += '<select class="ui-datepicker-new-year" ' + + 'onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + + 'onclick="jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'yearStatus') || '&#xa0;') : '') + '>'; + for (; year <= endYear; year++) { + html += '<option value="' + year + '"' + + (year == drawYear ? ' selected="selected"' : '') + + '>' + year + '</option>'; + } + html += '</select>'; + } + html += '</div>'; // Close datepicker_header + return html; + }, + + /* Provide code to set and clear the status panel. */ + _addStatus: function(inst, text) { + return ' onmouseover="jQuery(\'#ui-datepicker-status-' + inst.id + '\').html(\'' + text + '\');" ' + + 'onmouseout="jQuery(\'#ui-datepicker-status-' + inst.id + '\').html(\'&#xa0;\');"'; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._daylightSavingAdjust(new Date(year, month, day)); + // ensure it is within the bounds set + var minDate = this._getMinMaxDate(inst, 'min', true); + var maxDate = this._getMinMaxDate(inst, 'max'); + date = (minDate && date < minDate ? minDate : date); + date = (maxDate && date > maxDate ? maxDate : date); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [new Date(inst.selectedYear, inst.selectedMonth, 1), inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set - may be overridden for a range. */ + _getMinMaxDate: function(inst, minMax, checkRange) { + var date = this._determineDate(this._get(inst, minMax + 'Date'), null); + return (!checkRange || !inst.rangeStart ? date : + (!date || inst.rangeStart > date ? inst.rangeStart : date)); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - new Date(year, month, 32).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date( + curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + // during range selection, use minimum of selected date and range start + var newMinDate = (!inst.rangeStart ? null : this._daylightSavingAdjust( + new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay))); + newMinDate = (newMinDate && inst.rangeStart < newMinDate ? inst.rangeStart : newMinDate); + var minDate = newMinDate || this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate)); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance + +/* Initialise the date picker. */ +$(document).ready(function() { + $(document.body).append($.datepicker.dpDiv). + mousedown($.datepicker._checkExternalClick); +}); + +})(jQuery); +/* + * jQuery UI Effects 1.5.3 + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +;(function($) { + +$.effects = $.effects || {}; //Add the 'effects' scope + +$.extend($.effects, { + save: function(el, set) { + for(var i=0;i<set.length;i++) { + if(set[i] !== null) $.data(el[0], "ec.storage."+set[i], el[0].style[set[i]]); + } + }, + restore: function(el, set) { + for(var i=0;i<set.length;i++) { + if(set[i] !== null) el.css(set[i], $.data(el[0], "ec.storage."+set[i])); + } + }, + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + createWrapper: function(el) { + if (el.parent().attr('id') == 'fxWrapper') + return el; + var props = {width: el.outerWidth({margin:true}), height: el.outerHeight({margin:true}), 'float': el.css('float')}; + el.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>'); + var wrapper = el.parent(); + if (el.css('position') == 'static'){ + wrapper.css({position: 'relative'}); + el.css({position: 'relative'}); + } else { + var top = el.css('top'); if(isNaN(parseInt(top))) top = 'auto'; + var left = el.css('left'); if(isNaN(parseInt(left))) left = 'auto'; + wrapper.css({ position: el.css('position'), top: top, left: left, zIndex: el.css('z-index') }).show(); + el.css({position: 'relative', top:0, left:0}); + } + wrapper.css(props); + return wrapper; + }, + removeWrapper: function(el) { + if (el.parent().attr('id') == 'fxWrapper') + return el.parent().replaceWith(el); + return el; + }, + setTransition: function(el, list, factor, val) { + val = val || {}; + $.each(list,function(i, x){ + unit = el.cssUnit(x); + if (unit[0] > 0) val[x] = unit[0] * factor + unit[1]; + }); + return val; + }, + animateClass: function(value, duration, easing, callback) { + + var cb = (typeof easing == "function" ? easing : (callback ? callback : null)); + var ea = (typeof easing == "object" ? easing : null); + + return this.each(function() { + + var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || ''; + if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */ + if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; } + + //Let's get a style offset + var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle)); + if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove); + var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle)); + if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove); + + // The main function to form the object for animation + for(var n in newStyle) { + if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */ + && n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */ + && newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */ + && (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */ + && (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */ + ) offset[n] = newStyle[n]; + } + + that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object + // Change style attribute back to original. For stupid IE, we need to clear the damn object. + if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr); + if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove); + if(cb) cb.apply(this, arguments); + }); + + }); + } +}); + +//Extend the methods of jQuery +$.fn.extend({ + //Save old methods + _show: $.fn.show, + _hide: $.fn.hide, + __toggle: $.fn.toggle, + _addClass: $.fn.addClass, + _removeClass: $.fn.removeClass, + _toggleClass: $.fn.toggleClass, + // New ec methods + effect: function(fx,o,speed,callback) { + return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: o || {}, duration: speed, callback: callback }) : null; + }, + show: function() { + if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0]))) + return this._show.apply(this, arguments); + else { + var o = arguments[1] || {}; o['mode'] = 'show'; + return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]); + } + }, + hide: function() { + if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0]))) + return this._hide.apply(this, arguments); + else { + var o = arguments[1] || {}; o['mode'] = 'hide'; + return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]); + } + }, + toggle: function(){ + if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function)) + return this.__toggle.apply(this, arguments); + else { + var o = arguments[1] || {}; o['mode'] = 'toggle'; + return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]); + } + }, + addClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + toggleClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames); + }, + morph: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + }, + switchClass: function() { + return this.morph.apply(this, arguments); + }, + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + +/* + * jQuery Color Animations + * Copyright 2007 John Resig + * Released under the MIT and GPL licenses. + */ + +// We override the animation for all of these color styles +jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){ + jQuery.fx.step[attr] = function(fx){ + if ( fx.state == 0 ) { + fx.start = getColor( fx.elem, attr ); + fx.end = getRGB( fx.end ); + } + + fx.elem.style[attr] = "rgb(" + [ + Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0) + ].join(",") + ")"; + } +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent'] + + // Otherwise, we're most likely dealing with a named color + return colors[jQuery.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = jQuery.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] +}; + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +jQuery.easing['jswing'] = jQuery.easing['swing']; + +jQuery.extend( jQuery.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright © 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); +/* + * jQuery UI Effects Blind + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.blind = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'vertical') ? 'height' : 'width'; + var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width(); + if(mode == 'show') wrapper.css(ref, 0); // Shift + + // Animation + var animation = {}; + animation[ref] = mode == 'show' ? distance : 0; + + // Animate + wrapper.animate(animation, o.duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Bounce + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.bounce = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'up'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 5; // Default # of times + var speed = o.duration || 250; // Default speed per bounce + if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + if (mode == 'hide') distance = distance / (times * 2); + if (mode != 'hide') times--; + + // Animate + if (mode == 'show') { // Show Bounce + var animation = {opacity: 1}; + animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation, speed / 2, o.options.easing); + distance = distance / 2; + times--; + }; + for (var i = 0; i < times; i++) { // Bounces + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing); + distance = (mode == 'hide') ? distance * 2 : distance / 2; + }; + if (mode == 'hide') { // Last Bounce + var animation = {opacity: 0}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + el.animate(animation, speed / 2, o.options.easing, function(){ + el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){ + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Clip + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.clip = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','height','width']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var animate = el[0].tagName == 'IMG' ? wrapper : el; + var ref = { + size: (direction == 'vertical') ? 'height' : 'width', + position: (direction == 'vertical') ? 'top' : 'left' + }; + var distance = (direction == 'vertical') ? animate.height() : animate.width(); + if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift + + // Animation + var animation = {}; + animation[ref.size] = mode == 'show' ? distance : 0; + animation[ref.position] = mode == 'show' ? 0 : distance / 2; + + // Animate + animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Drop + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.drop = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {opacity: mode == 'show' ? 1 : 0}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Explode + * + * Copyright (c) 2008 Paul Bakaus (ui.jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.explode = function(o) { + + return this.queue(function() { + + var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + + o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode; + var el = $(this).show().css('visibility', 'hidden'); + var offset = el.offset(); + + //Substract the margins - not fixing the problem yet. + offset.top -= parseInt(el.css("marginTop")) || 0; + offset.left -= parseInt(el.css("marginLeft")) || 0; + + var width = el.outerWidth(true); + var height = el.outerHeight(true); + + for(var i=0;i<rows;i++) { // = + for(var j=0;j<cells;j++) { // || + el + .clone() + .appendTo('body') + .wrap('<div></div>') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j*(width/cells), + top: -i*(height/rows) + }) + .parent() + .addClass('effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width/cells, + height: height/rows, + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0), + opacity: o.options.mode == 'show' ? 0 : 1 + }).animate({ + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)), + opacity: o.options.mode == 'show' ? 1 : 0 + }, o.duration || 500); + } + } + + // Set a timeout, to call the callback approx. when the other animations have finished + setTimeout(function() { + + o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide(); + if(o.callback) o.callback.apply(el[0]); // Callback + el.dequeue(); + + $('.effects-explode').remove(); + + }, o.duration || 500); + + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Fold + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.fold = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var size = o.options.size || 15; // Default fold size + var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var widthFirst = ((mode == 'show') != horizFirst); + var ref = widthFirst ? ['width', 'height'] : ['height', 'width']; + var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()]; + var percent = /([0-9]+)%/.exec(size); + if(percent) size = parseInt(percent[1]) / 100 * distance[mode == 'hide' ? 0 : 1]; + if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift + + // Animation + var animation1 = {}, animation2 = {}; + animation1[ref[0]] = mode == 'show' ? distance[0] : size; + animation2[ref[1]] = mode == 'show' ? distance[1] : 0; + + // Animate + wrapper.animate(animation1, o.duration / 2, o.options.easing) + .animate(animation2, o.duration / 2, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Highlight + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * effects.core.js + */ +;(function($) { + +$.effects.highlight = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['backgroundImage','backgroundColor','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var color = o.options.color || "#ffff99"; // Default highlight color + var oldColor = el.css("backgroundColor"); + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + el.css({backgroundImage: 'none', backgroundColor: color}); // Shift + + // Animation + var animation = {backgroundColor: oldColor }; + if (mode == "hide") animation['opacity'] = 0; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == "hide") el.hide(); + $.effects.restore(el, props); + if (mode == "show" && jQuery.browser.msie) this.style.removeAttribute('filter'); + if(o.callback) o.callback.apply(this, arguments); + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Pulsate + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.pulsate = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var times = o.options.times || 5; // Default # of times + + // Adjust + if (mode == 'hide') times--; + if (el.is(':hidden')) { // Show fadeIn + el.css('opacity', 0); + el.show(); // Show + el.animate({opacity: 1}, o.duration / 2, o.options.easing); + times = times-2; + } + + // Animate + for (var i = 0; i < times; i++) { // Pulsate + el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing); + }; + if (mode == 'hide') { // Last Pulse + el.animate({opacity: 0}, o.duration / 2, o.options.easing, function(){ + el.hide(); // Hide + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing, function(){ + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Scale + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.puff = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var percent = parseInt(o.options.percent) || 150; // Set default puff percent + options.fade = true; // It's not a puff if it doesn't fade! :) + var original = {height: el.height(), width: el.width()}; // Save original + + // Adjust + var factor = percent / 100; + el.from = (mode == 'hide') ? original : {height: original.height * factor, width: original.width * factor}; + + // Animation + options.from = el.from; + options.percent = (mode == 'hide') ? percent : 100; + options.mode = mode; + + // Animate + el.effect('scale', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.scale = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var percent = parseInt(o.options.percent) || (parseInt(o.options.percent) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent + var direction = o.options.direction || 'both'; // Set default axis + var origin = o.options.origin; // The origin of the scaling + if (mode != 'effect') { // Set default origin and restore for show/hide + options.origin = origin || ['middle','center']; + options.restore = true; + } + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state + + // Adjust + var factor = { // Set scaling factor + y: direction != 'horizontal' ? (percent / 100) : 1, + x: direction != 'vertical' ? (percent / 100) : 1 + }; + el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state + + if (o.options.fade) { // Fade option to support puff + if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;}; + if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;}; + }; + + // Animation + options.from = el.from; options.to = el.to; options.mode = mode; + + // Animate + el.effect('size', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.size = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','width','height','overflow','opacity']; + var props1 = ['position','top','left','overflow','opacity']; // Always restore + var props2 = ['width','height','overflow']; // Copy for children + var cProps = ['fontSize']; + var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom']; + var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var restore = o.options.restore || false; // Default restore + var scale = o.options.scale || 'both'; // Default scale mode + var origin = o.options.origin; // The origin of the sizing + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || original; // Default from state + el.to = o.options.to || original; // Default to state + // Adjust + if (origin) { // Calculate baseline shifts + var baseline = $.effects.getBaseline(origin, original); + el.from.top = (original.height - el.from.height) * baseline.y; + el.from.left = (original.width - el.from.width) * baseline.x; + el.to.top = (original.height - el.to.height) * baseline.y; + el.to.left = (original.width - el.to.width) * baseline.x; + }; + var factor = { // Set scaling factor + from: {y: el.from.height / original.height, x: el.from.width / original.width}, + to: {y: el.to.height / original.height, x: el.to.width / original.width} + }; + if (scale == 'box' || scale == 'both') { // Scale the css box + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(vProps); + el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + props = props.concat(hProps); + el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from); + el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to); + }; + }; + if (scale == 'content' || scale == 'both') { // Scale the content + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(cProps); + el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to); + }; + }; + $.effects.save(el, restore ? props : props1); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + el.css('overflow','hidden').css(el.from); // Shift + + // Animate + if (scale == 'content' || scale == 'both') { // Scale the children + vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size + hProps = hProps.concat(['marginLeft','marginRight']); // Add margins + props2 = props.concat(vProps).concat(hProps); // Concat + el.find("*[width]").each(function(){ + child = $(this); + if (restore) $.effects.save(child, props2); + var c_original = {height: child.height(), width: child.width()}; // Save original + child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x}; + child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x}; + if (factor.from.y != factor.to.y) { // Vertical props scaling + child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from); + child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from); + child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to); + }; + child.css(child.from); // Shift children + child.animate(child.to, o.duration, o.options.easing, function(){ + if (restore) $.effects.restore(child, props2); // Restore children + }); // Animate children + }); + }; + + // Animate + el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Shake + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.shake = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'left'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 3; // Default # of times + var speed = o.duration || o.options.duration || 140; // Default speed per shake + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + + // Animation + var animation = {}, animation1 = {}, animation2 = {}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2; + animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2; + + // Animate + el.animate(animation, speed, o.options.easing); + for (var i = 1; i < times; i++) { // Shakes + el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing); + }; + el.animate(animation1, speed, o.options.easing). + animate(animation, speed / 2, o.options.easing, function(){ // Last shake + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Slide + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.slide = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true})); + if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Transfer + * + * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * effects.core.js + */ +(function($) { + +$.effects.transfer = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var target = $(o.options.to); // Find Target + var position = el.offset(); + var transfer = $('<div class="ui-effects-transfer"></div>').appendTo(document.body); + if(o.options.className) transfer.addClass(o.options.className); + + // Set target css + transfer.addClass(o.options.className); + transfer.css({ + top: position.top, + left: position.left, + height: el.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')), + width: el.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth')), + position: 'absolute' + }); + + // Animation + position = target.offset(); + animation = { + top: position.top, + left: position.left, + height: target.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')), + width: target.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth')) + }; + + // Animate + transfer.animate(animation, o.duration, o.options.easing, function() { + transfer.remove(); // Remove div + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.accordion.js b/fannie/src/jquery-ui/development-bundle/ui/ui.accordion.js new file mode 100644 index 000000000..2cf014b8e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.accordion.js @@ -0,0 +1,295 @@ +/* + * jQuery UI Accordion + * + * Copyright (c) 2007, 2008 Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.accordion", { + init: function() { + var options = this.options; + + if ( options.navigation ) { + var current = this.element.find("a").filter(options.navigationFilter); + if ( current.length ) { + if ( current.filter(options.header).length ) { + options.active = current; + } else { + options.active = current.parent().parent().prev(); + current.addClass("current"); + } + } + } + + // calculate active if not specified, using the first header + options.headers = this.element.find(options.header); + options.active = findActive(options.headers, options.active); + + // IE7-/Win - Extra vertical space in Lists fixed + if ($.browser.msie) { + this.element.find('a').css('zoom', '1'); + } + + if (!this.element.hasClass("ui-accordion")) { + this.element.addClass("ui-accordion"); + $("<span class='ui-accordion-left'/>").insertBefore(options.headers); + $("<span class='ui-accordion-right'/>").appendTo(options.headers); + options.headers.addClass("ui-accordion-header").attr("tabindex", "0"); + } + + var maxHeight; + if ( options.fillSpace ) { + maxHeight = this.element.parent().height(); + options.headers.each(function() { + maxHeight -= $(this).outerHeight(); + }); + var maxPadding = 0; + options.headers.next().each(function() { + maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height()); + }).height(maxHeight - maxPadding); + } else if ( options.autoHeight ) { + maxHeight = 0; + options.headers.next().each(function() { + maxHeight = Math.max(maxHeight, $(this).outerHeight()); + }).height(maxHeight); + } + + options.headers + .not(options.active || "") + .next() + .hide(); + options.active.parent().andSelf().addClass(options.selectedClass); + + if (options.event) { + this.element.bind((options.event) + ".accordion", clickHandler); + } + }, + activate: function(index) { + // call clickHandler with custom event + clickHandler.call(this.element[0], { + target: findActive( this.options.headers, index )[0] + }); + }, + destroy: function() { + this.options.headers.next().css("display", ""); + if ( this.options.fillSpace || this.options.autoHeight ) { + this.options.headers.next().css("height", ""); + } + $.removeData(this.element[0], "accordion"); + this.element.removeClass("ui-accordion").unbind(".accordion"); + } +}); + +function scopeCallback(callback, scope) { + return function() { + return callback.apply(scope, arguments); + }; +}; + +function completed(cancel) { + // if removed while animated data can be empty + if (!$.data(this, "accordion")) { + return; + } + + var instance = $.data(this, "accordion"); + var options = instance.options; + options.running = cancel ? 0 : --options.running; + if ( options.running ) { + return; + } + if ( options.clearStyle ) { + options.toShow.add(options.toHide).css({ + height: "", + overflow: "" + }); + } + $(this).triggerHandler("accordionchange", [$.event.fix({type: 'accordionchange', target: instance.element[0]}), options.data], options.change); +} + +function toggle(toShow, toHide, data, clickedActive, down) { + var options = $.data(this, "accordion").options; + options.toShow = toShow; + options.toHide = toHide; + options.data = data; + var complete = scopeCallback(completed, this); + + // count elements to animate + options.running = toHide.size() === 0 ? toShow.size() : toHide.size(); + + if ( options.animated ) { + if ( !options.alwaysOpen && clickedActive ) { + $.ui.accordion.animations[options.animated]({ + toShow: jQuery([]), + toHide: toHide, + complete: complete, + down: down, + autoHeight: options.autoHeight + }); + } else { + $.ui.accordion.animations[options.animated]({ + toShow: toShow, + toHide: toHide, + complete: complete, + down: down, + autoHeight: options.autoHeight + }); + } + } else { + if ( !options.alwaysOpen && clickedActive ) { + toShow.toggle(); + } else { + toHide.hide(); + toShow.show(); + } + complete(true); + } +} + +function clickHandler(event) { + var options = $.data(this, "accordion").options; + if (options.disabled) { + return false; + } + + // called only when using activate(false) to close all parts programmatically + if ( !event.target && !options.alwaysOpen ) { + options.active.parent().andSelf().toggleClass(options.selectedClass); + var toHide = options.active.next(), + data = { + options: options, + newHeader: jQuery([]), + oldHeader: options.active, + newContent: jQuery([]), + oldContent: toHide + }, + toShow = (options.active = $([])); + toggle.call(this, toShow, toHide, data ); + return false; + } + // get the click target + var clicked = $(event.target); + + // due to the event delegation model, we have to check if one + // of the parent elements is our actual header, and find that + // otherwise stick with the initial target + clicked = $( clicked.parents(options.header)[0] || clicked ); + + var clickedActive = clicked[0] == options.active[0]; + + // if animations are still active, or the active header is the target, ignore click + if (options.running || (options.alwaysOpen && clickedActive)) { + return false; + } + if (!clicked.is(options.header)) { + return; + } + + // switch classes + options.active.parent().andSelf().toggleClass(options.selectedClass); + if ( !clickedActive ) { + clicked.parent().andSelf().addClass(options.selectedClass); + } + + // find elements to show and hide + var toShow = clicked.next(), + toHide = options.active.next(), + //data = [clicked, options.active, toShow, toHide], + data = { + options: options, + newHeader: clicked, + oldHeader: options.active, + newContent: toShow, + oldContent: toHide + }, + down = options.headers.index( options.active[0] ) > options.headers.index( clicked[0] ); + + options.active = clickedActive ? $([]) : clicked; + toggle.call(this, toShow, toHide, data, clickedActive, down ); + + return false; +}; + +function findActive(headers, selector) { + return selector != undefined + ? typeof selector == "number" + ? headers.filter(":eq(" + selector + ")") + : headers.not(headers.not(selector)) + : selector === false + ? $([]) + : headers.filter(":eq(0)"); +} + +$.extend($.ui.accordion, { + defaults: { + selectedClass: "selected", + alwaysOpen: true, + animated: 'slide', + event: "click", + header: "a", + autoHeight: true, + running: 0, + navigationFilter: function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + } + }, + animations: { + slide: function(options, additions) { + options = $.extend({ + easing: "swing", + duration: 300 + }, options, additions); + if ( !options.toHide.size() ) { + options.toShow.animate({height: "show"}, options); + return; + } + var hideHeight = options.toHide.height(), + showHeight = options.toShow.height(), + difference = showHeight / hideHeight; + options.toShow.css({ height: 0, overflow: 'hidden' }).show(); + options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate({height:"hide"},{ + step: function(now) { + var current = (hideHeight - now) * difference; + if ($.browser.msie || $.browser.opera) { + current = Math.ceil(current); + } + options.toShow.height( current ); + }, + duration: options.duration, + easing: options.easing, + complete: function() { + if ( !options.autoHeight ) { + options.toShow.css("height", "auto"); + } + options.complete(); + } + }); + }, + bounceslide: function(options) { + this.slide(options, { + easing: options.down ? "bounceout" : "swing", + duration: options.down ? 1000 : 200 + }); + }, + easeslide: function(options) { + this.slide(options, { + easing: "easeinout", + duration: 700 + }); + } + } +}); + +// deprecated, use accordion("activate", index) instead +$.fn.activate = function(index) { + return this.accordion("activate", index); +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.core.js b/fannie/src/jquery-ui/development-bundle/ui/ui.core.js new file mode 100644 index 000000000..b8b7cf371 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.core.js @@ -0,0 +1,291 @@ +/* + * jQuery UI 1.5.3 + * + * Copyright (c) 2008 Paul Bakaus (ui.jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +;(function($) { + +$.ui = { + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + cssCache: {}, + css: function(name) { + if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; } + var tmp = $('<div class="ui-gen">').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body'); + + //if (!$.browser.safari) + //tmp.appendTo('body'); + + //Opera and Safari set width and height to 0px instead of auto + //Safari returns rgba(0,0,0,0) when bgcolor is not set + $.ui.cssCache[name] = !!( + (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || + !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))) + ); + try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){} + return $.ui.cssCache[name]; + }, + disableSelection: function(el) { + $(el).attr('unselectable', 'on').css('MozUserSelect', 'none'); + }, + enableSelection: function(el) { + $(el).attr('unselectable', 'off').css('MozUserSelect', ''); + }, + hasScroll: function(e, a) { + var scroll = /top/.test(a||"top") ? 'scrollTop' : 'scrollLeft', has = false; + if (e[scroll] > 0) return true; e[scroll] = 1; + has = e[scroll] > 0 ? true : false; e[scroll] = 0; + return has; + } +}; + + +/** jQuery core modifications and additions **/ + +var _remove = $.fn.remove; +$.fn.remove = function() { + $("*", this).add(this).triggerHandler("remove"); + return _remove.apply(this, arguments ); +}; + +// $.widget is a factory to create jQuery plugins +// taking some boilerplate code out of the plugin code +// created by Scott González and Jörn Zaefferer +function getter(namespace, plugin, method) { + var methods = $[namespace][plugin].getter || []; + methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods); + return ($.inArray(method, methods) != -1); +} + +$.widget = function(name, prototype) { + var namespace = name.split(".")[0]; + name = name.split(".")[1]; + + // create plugin method + $.fn[name] = function(options) { + var isMethodCall = (typeof options == 'string'), + args = Array.prototype.slice.call(arguments, 1); + + if (isMethodCall && getter(namespace, name, options)) { + var instance = $.data(this[0], name); + return (instance ? instance[options].apply(instance, args) + : undefined); + } + + return this.each(function() { + var instance = $.data(this, name); + if (isMethodCall && instance && $.isFunction(instance[options])) { + instance[options].apply(instance, args); + } else if (!isMethodCall) { + $.data(this, name, new $[namespace][name](this, options)); + } + }); + }; + + // create widget constructor + $[namespace][name] = function(element, options) { + var self = this; + + this.widgetName = name; + this.widgetBaseClass = namespace + '-' + name; + + this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, options); + this.element = $(element) + .bind('setData.' + name, function(e, key, value) { + return self.setData(key, value); + }) + .bind('getData.' + name, function(e, key) { + return self.getData(key); + }) + .bind('remove', function() { + return self.destroy(); + }); + this.init(); + }; + + // add widget prototype + $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); +}; + +$.widget.prototype = { + init: function() {}, + destroy: function() { + this.element.removeData(this.widgetName); + }, + + getData: function(key) { + return this.options[key]; + }, + setData: function(key, value) { + this.options[key] = value; + + if (key == 'disabled') { + this.element[value ? 'addClass' : 'removeClass']( + this.widgetBaseClass + '-disabled'); + } + }, + + enable: function() { + this.setData('disabled', false); + }, + disable: function() { + this.setData('disabled', true); + } +}; + +$.widget.defaults = { + disabled: false +}; + + +/** Mouse Interaction Plugin **/ + +$.ui.mouse = { + mouseInit: function() { + var self = this; + + this.element.bind('mousedown.'+this.widgetName, function(e) { + return self.mouseDown(e); + }); + + // Prevent text selection in IE + if ($.browser.msie) { + this._mouseUnselectable = this.element.attr('unselectable'); + this.element.attr('unselectable', 'on'); + } + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + + // Restore text selection in IE + ($.browser.msie + && this.element.attr('unselectable', this._mouseUnselectable)); + }, + + mouseDown: function(e) { + // we may have missed mouseup (out of window) + (this._mouseStarted && this.mouseUp(e)); + + this._mouseDownEvent = e; + + var self = this, + btnIsLeft = (e.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).parents().add(e.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) { + return true; + } + + this._mouseDelayMet = !this.options.delay; + if (!this._mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self._mouseDelayMet = true; + }, this.options.delay); + } + + if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) { + this._mouseStarted = (this.mouseStart(e) !== false); + if (!this._mouseStarted) { + e.preventDefault(); + return true; + } + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(e) { + return self.mouseMove(e); + }; + this._mouseUpDelegate = function(e) { + return self.mouseUp(e); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + return false; + }, + + mouseMove: function(e) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !e.button) { + return this.mouseUp(e); + } + + if (this._mouseStarted) { + this.mouseDrag(e); + return false; + } + + if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) { + this._mouseStarted = + (this.mouseStart(this._mouseDownEvent, e) !== false); + (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e)); + } + + return !this._mouseStarted; + }, + + mouseUp: function(e) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + this.mouseStop(e); + } + + return false; + }, + + mouseDistanceMet: function(e) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - e.pageX), + Math.abs(this._mouseDownEvent.pageY - e.pageY) + ) >= this.options.distance + ); + }, + + mouseDelayMet: function(e) { + return this._mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + mouseStart: function(e) {}, + mouseDrag: function(e) {}, + mouseStop: function(e) {}, + mouseCapture: function(e) { return true; } +}; + +$.ui.mouse.defaults = { + cancel: null, + distance: 1, + delay: 0 +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.datepicker.js b/fannie/src/jquery-ui/development-bundle/ui/ui.datepicker.js new file mode 100644 index 000000000..877e19b52 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.datepicker.js @@ -0,0 +1,1551 @@ +/* + * jQuery UI Datepicker + * + * Copyright (c) 2006, 2007, 2008 Marc Grabanski + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * ui.core.js + * + * Marc Grabanski (m@marcgrabanski.com) and Keith Wood (kbwood@virginbroadband.com.au). + */ + +(function($) { // hide the namespace + +var PROP_NAME = 'datepicker'; + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._promptClass = 'ui-datepicker-prompt'; // The name of the dialog prompt marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + clearText: 'Clear', // Display text for clear link + clearStatus: 'Erase the current date', // Status text for clear link + closeText: 'Close', // Display text for close link + closeStatus: 'Close without change', // Status text for close link + prevText: '&#x3c;Prev', // Display text for previous month link + prevStatus: 'Show the previous month', // Status text for previous month link + nextText: 'Next&#x3e;', // Display text for next month link + nextStatus: 'Show the next month', // Status text for next month link + currentText: 'Today', // Display text for current month link + currentStatus: 'Show the current month', // Status text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + monthStatus: 'Show a different month', // Status text for selecting a month + yearStatus: 'Show a different year', // Status text for selecting a year + weekHeader: 'Wk', // Header for the week of the year column + weekStatus: 'Week of the year', // Status text for the week of the year column + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + dayStatus: 'Set DD as first week day', // Status text for the day of the week selection + dateStatus: 'Select DD, M d', // Status text for the date selection + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + initStatus: 'Select a date', // Initial Status text on opening + isRTL: false // True if right-to-left language, false if left-to-right + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'show', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + closeAtTop: true, // True to have the clear/close at the top, + // false to have them at the bottom + mandatory: false, // True to hide the Clear link, false to include it + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: true, // True if month can be selected directly, false if only prev/next + changeYear: true, // True if year can be selected directly, false if only prev/next + yearRange: '-10:+10', // Range of years to display in drop-down, + // either relative to current year (-nn:+nn) or absolute (nnnn:nnnn) + changeFirstDay: true, // True to click on day name to change, false to remain as set + highlightWeek: false, // True to highlight the selected week + showOtherMonths: false, // True to show dates in other months, false to leave blank + showWeeks: false, // True to show week of the year, false to omit + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + showStatus: false, // True to show status bar at bottom, false to not show it + statusForDate: this.dateStatus, // Function to provide status text for a date - + // takes date and instance as parameters, returns display text + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: 'normal', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + stepMonths: 1, // Number of months to step back/forward + rangeSelect: false, // Allows for selecting a date range on one date picker + rangeSeparator: ' - ', // Text between two dates in a range + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '' // The date format to use for the alternate field + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = $('<div id="' + this._mainDivId + '" style="display: none;"></div>'); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + var inlineSettings = null; + for (attrName in this._defaults) { + var attrValue = target.getAttribute('date:' + attrName); + if (attrValue) { + inlineSettings = inlineSettings || {}; + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + var nodeName = target.nodeName.toLowerCase(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) + target.id = 'dp' + new Date().getTime(); + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + return {id: target[0].id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + $('<div class="ui-datepicker-inline"></div>'))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + if (input.hasClass(this.markerClassName)) + return; + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (appendText) + input[isRTL ? 'before' : 'after']('<span class="' + this._appendClass + '">' + appendText + '</span>'); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + var trigger = $(this._get(inst, 'buttonImageOnly') ? + $('<img/>').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('<button type="button"></button>').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('<img/>').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](trigger); + trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(target); + return false; + }); + } + input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var input = $(target); + if (input.hasClass(this.markerClassName)) + return; + input.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst)); + this._updateDatepicker(inst); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param dateText string - the initial date to display (in the current format) + @param onSelect function - the function(dateText) to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, dateText, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + var id = 'dp' + new Date().getTime(); + this._dialogInput = $('<input type="text" id="' + id + + '" size="1" style="position: absolute; top: -100px;"/>'); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + this._dialogInput.val(dateText); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; + var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var nodeName = target.nodeName.toLowerCase(); + var $target = $(target); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + $target.siblings('.' + this._appendClass).remove().end(). + siblings('.' + this._triggerClass).remove().end(). + removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + target.disabled = false; + $(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = false; }).end(). + siblings('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''}); + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + target.disabled = true; + $(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = true; }).end(). + siblings('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'}); + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) + return false; + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Update the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or + @param value any - the new value for the setting (omit if above is an object) */ + _changeDatepicker: function(target, name, value) { + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst = $.data(target, PROP_NAME)) { + extendRemove(inst.settings, settings); + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date + @param endDate Date - the new end date for a range (optional) */ + _setDateDatepicker: function(target, date, endDate) { + var inst = $.data(target, PROP_NAME); + if (inst) { + this._setDate(inst, date, endDate); + this._updateDatepicker(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @return Date - the current date or + Date[2] - the current dates for a range */ + _getDateDatepicker: function(target) { + var inst = $.data(target, PROP_NAME); + if (inst) + this._setDateFromField(inst); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(e) { + var inst = $.data(e.target, PROP_NAME); + var handled = true; + if ($.datepicker._datepickerShowing) + switch (e.keyCode) { + case 9: $.datepicker._hideDatepicker(null, ''); + break; // hide on tab out + case 13: $.datepicker._selectDay(e.target, inst.selectedMonth, inst.selectedYear, + $('td.ui-datepicker-days-cell-over', inst.dpDiv)[0]); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration')); + break; // hide on escape + case 33: $.datepicker._adjustDate(e.target, (e.ctrlKey ? -1 : + -$.datepicker._get(inst, 'stepMonths')), (e.ctrlKey ? 'Y' : 'M')); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(e.target, (e.ctrlKey ? +1 : + +$.datepicker._get(inst, 'stepMonths')), (e.ctrlKey ? 'Y' : 'M')); + break; // next month/year on page down/+ ctrl + case 35: if (e.ctrlKey) $.datepicker._clearDate(e.target); + break; // clear on ctrl+end + case 36: if (e.ctrlKey) $.datepicker._gotoToday(e.target); + break; // current on ctrl+home + case 37: if (e.ctrlKey) $.datepicker._adjustDate(e.target, -1, 'D'); + break; // -1 day on ctrl+left + case 38: if (e.ctrlKey) $.datepicker._adjustDate(e.target, -7, 'D'); + break; // -1 week on ctrl+up + case 39: if (e.ctrlKey) $.datepicker._adjustDate(e.target, +1, 'D'); + break; // +1 day on ctrl+right + case 40: if (e.ctrlKey) $.datepicker._adjustDate(e.target, +7, 'D'); + break; // +1 week on ctrl+down + default: handled = false; + } + else if (e.keyCode == 36 && e.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else + handled = false; + if (handled) { + e.preventDefault(); + e.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(e) { + var inst = $.data(e.target, PROP_NAME); + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode : e.charCode); + return e.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.data(input, PROP_NAME); + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + $.datepicker._hideDatepicker(null, ''); + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + inst.rangeStart = null; + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1] * + $('.ui-datepicker', inst.dpDiv[0])[0].offsetWidth); + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim') || 'show'; + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._datepickerShowing = true; + if ($.browser.msie && parseInt($.browser.version) < 7) // fix IE < 7 select problems + $('iframe.ui-datepicker-cover').css({width: inst.dpDiv.width() + 4, + height: inst.dpDiv.height() + 4}); + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim](duration, postProcess); + if (duration == '') + postProcess(); + if (inst.input[0].type != 'hidden') + inst.input[0].focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var dims = {width: inst.dpDiv.width() + 4, + height: inst.dpDiv.height() + 4}; + inst.dpDiv.empty().append(this._generateDatepicker(inst)). + find('iframe.ui-datepicker-cover'). + css({width: dims.width, height: dims.height}); + var numMonths = this._getNumberOfMonths(inst); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst.input && inst.input[0].type != 'hidden') + $(inst.input[0]).focus(); + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var pos = inst.input ? this._findPos(inst.input[0]) : null; + var browserWidth = window.innerWidth || document.documentElement.clientWidth; + var browserHeight = window.innerHeight || document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + // reposition date picker horizontally if outside the browser window + if (this._get(inst, 'isRTL') || (offset.left + inst.dpDiv.width() - scrollX) > browserWidth) + offset.left = Math.max((isFixed ? 0 : scrollX), + pos[0] + (inst.input ? inst.input.width() : 0) - (isFixed ? scrollX : 0) - inst.dpDiv.width() - + (isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0)); + else + offset.left -= (isFixed ? scrollX : 0); + // reposition date picker vertically if outside the browser window + if ((offset.top + inst.dpDiv.height() - scrollY) > browserHeight) + offset.top = Math.max((isFixed ? 0 : scrollY), + pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst.dpDiv.height()) - + (isFixed && $.browser.opera ? document.documentElement.scrollTop : 0)); + else + offset.top -= (isFixed ? scrollY : 0); + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) { + obj = obj.nextSibling; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker + @param duration string - the duration over which to close the date picker */ + _hideDatepicker: function(input, duration) { + var inst = this._curInst; + if (!inst) + return; + var rangeSelect = this._get(inst, 'rangeSelect'); + if (rangeSelect && this._stayOpen) + this._selectDate('#' + inst.id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + this._stayOpen = false; + if (this._datepickerShowing) { + duration = (duration != null ? duration : this._get(inst, 'duration')); + var showAnim = this._get(inst, 'showAnim'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + }; + if (duration != '' && $.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), + duration, postProcess); + else + inst.dpDiv[(duration == '' ? 'hide' : (showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide')))](duration, postProcess); + if (duration == '') + this._tidyDialog(inst); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [this._getDate(inst), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + inst.settings.prompt = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + this._curInst = null; + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker'); + $('.' + this._promptClass, inst.dpDiv).remove(); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if (($target.parents('#' + $.datepicker._mainDivId).length == 0) && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(null, ''); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + this._adjustInstDate(inst, offset, period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._adjustDate(target); + this._notifyChange(inst); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + inst._selectingMonthYear = false; + inst[period == 'M' ? 'drawMonth' : 'drawYear'] = + select.options[select.selectedIndex].value - 0; + this._adjustDate(target); + this._notifyChange(inst); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + if (inst.input && inst._selectingMonthYear && !$.browser.msie) + inst.input[0].focus(); + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for changing the first week day. */ + _changeFirstDay: function(id, day) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + inst.settings.firstDay = day; + this._updateDatepicker(inst); + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + if ($(td).hasClass(this._unselectableClass)) + return; + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + var rangeSelect = this._get(inst, 'rangeSelect'); + if (rangeSelect) { + this._stayOpen = !this._stayOpen; + if (this._stayOpen) { + $('.ui-datepicker td').removeClass(this._currentClass); + $(td).addClass(this._currentClass); + } + } + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + if (this._stayOpen) { + inst.endDay = inst.endMonth = inst.endYear = null; + } + else if (rangeSelect) { + inst.endDay = inst.currentDay; + inst.endMonth = inst.currentMonth; + inst.endYear = inst.currentYear; + } + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + if (this._stayOpen) { + inst.rangeStart = this._daylightSavingAdjust( + new Date(inst.currentYear, inst.currentMonth, inst.currentDay)); + this._updateDatepicker(inst); + } + else if (rangeSelect) { + inst.selectedDay = inst.currentDay = inst.rangeStart.getDate(); + inst.selectedMonth = inst.currentMonth = inst.rangeStart.getMonth(); + inst.selectedYear = inst.currentYear = inst.rangeStart.getFullYear(); + inst.rangeStart = null; + if (inst.inline) + this._updateDatepicker(inst); + } + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + if (this._get(inst, 'mandatory')) + return; + this._stayOpen = false; + inst.endDay = inst.endMonth = inst.endYear = inst.rangeStart = null; + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = $.data(target[0], PROP_NAME); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (this._get(inst, 'rangeSelect') && dateStr) + dateStr = (inst.rangeStart ? this._formatDate(inst, inst.rangeStart) : + dateStr) + this._get(inst, 'rangeSeparator') + dateStr; + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else if (!this._stayOpen) { + this._hideDatepicker(null, this._get(inst, 'duration')); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input[0].focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat'); + var date = this._getDate(inst); + dateStr = (isArray(date) ? (!date[0] && !date[1] ? '' : + this.formatDate(altFormat, date[0], this._getFormatConfig(inst)) + + this._get(inst, 'rangeSeparator') + this.formatDate( + altFormat, date[1] || date[0], this._getFormatConfig(inst))) : + this.formatDate(altFormat, date, this._getFormatConfig(inst))); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); + var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First week always contains 4 Jan + var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun = 7 + firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday + if (firstDay < 4 && checkDate < firstMon) { // Adjust first three days in year if necessary + checkDate.setDate(checkDate.getDate() - 3); // Generate for previous year + return $.datepicker.iso8601Week(checkDate); + } else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) { // Check last three days in year + firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7; + if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) { // Adjust if necessary + checkDate.setDate(checkDate.getDate() + 3); // Generate for next year + return $.datepicker.iso8601Week(checkDate); + } + } + return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1; // Weeks to given date + }, + + /* Provide status text for a particular date. + @param date the date to get the status for + @param inst the current datepicker instance + @return the status display text for this date */ + dateStatus: function(date, inst) { + return $.datepicker.formatDate($.datepicker._get(inst, 'dateStatus'), + date, $.datepicker._getFormatConfig(inst)); + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + lookAhead(match); + var origSize = (match == '@' ? 14 : (match == 'y' ? 4 : 2)); + var size = origSize; + var num = 0; + while (size > 0 && iValue < value.length && + value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') { + num = num * 10 + (value.charAt(iValue++) - 0); + size--; + } + if (size == origSize) + throw 'Missing number at position ' + iValue; + return num; + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = (lookAhead(match) ? longNames : shortNames); + var size = 0; + for (var j = 0; j < names.length; j++) + size = Math.max(size, names[j].length); + var name = ''; + var iInit = iValue; + while (size > 0 && iValue < value.length) { + name += value.charAt(iValue++); + for (var i = 0; i < names.length; i++) + if (name == names[i]) + return i + 1; + size--; + } + throw 'Unknown name at position ' + iInit; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/* + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + COOKIE: 'D, dd M yy', + ISO_8601: 'yy-mm-dd', + RFC_822: 'D, d M y', + RFC_850: 'DD, dd-M-y', + RFC_1036: 'D, d M y', + RFC_1123: 'D, d M yy', + RFC_2822: 'D, d M yy', + RSS: 'D, d M y', // RFC 822 + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value) { + return (lookAhead(match) && value < 10 ? '0' : '') + value; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate()); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst) { + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.input ? inst.input.val().split(this._get(inst, 'rangeSeparator')) : null; + inst.endDay = inst.endMonth = inst.endYear = null; + var date = defaultDate = this._getDefaultDate(inst); + if (dates.length > 0) { + var settings = this._getFormatConfig(inst); + if (dates.length > 1) { + date = this.parseDate(dateFormat, dates[1], settings) || defaultDate; + inst.endDay = date.getDate(); + inst.endMonth = date.getMonth(); + inst.endYear = date.getFullYear(); + } + try { + date = this.parseDate(dateFormat, dates[0], settings) || defaultDate; + } catch (e) { + this.log(e); + date = defaultDate; + } + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates[0] ? date.getDate() : 0); + inst.currentMonth = (dates[0] ? date.getMonth() : 0); + inst.currentYear = (dates[0] ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + var date = this._determineDate(this._get(inst, 'defaultDate'), new Date()); + var minDate = this._getMinMaxDate(inst, 'min', true); + var maxDate = this._getMinMaxDate(inst, 'max'); + date = (minDate && date < minDate ? minDate : date); + date = (maxDate && date > maxDate ? maxDate : date); + return date; + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset, getDaysInMonth) { + var date = new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += (matches[1] - 0); break; + case 'w' : case 'W' : + day += (matches[1] * 7); break; + case 'm' : case 'M' : + month += (matches[1] - 0); + day = Math.min(day, getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += (matches[1] - 0); + day = Math.min(day, getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + date = (date == null ? defaultDate : + (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date))); + date = (date && date.toString() == 'Invalid Date' ? defaultDate : date); + if (date) { + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + } + return this._daylightSavingAdjust(date); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, endDate) { + var clear = !(date); + date = this._determineDate(date, new Date()); + inst.selectedDay = inst.currentDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear(); + if (this._get(inst, 'rangeSelect')) { + if (endDate) { + endDate = this._determineDate(endDate, null); + inst.endDay = endDate.getDate(); + inst.endMonth = endDate.getMonth(); + inst.endYear = endDate.getFullYear(); + } else { + inst.endDay = inst.currentDay; + inst.endMonth = inst.currentMonth; + inst.endYear = inst.currentYear; + } + } + this._adjustInstDate(inst); + if (inst.input) + inst.input.val(clear ? '' : this._formatDate(inst) + + (!this._get(inst, 'rangeSelect') ? '' : this._get(inst, 'rangeSeparator') + + this._formatDate(inst, inst.endDay, inst.endMonth, inst.endYear))); + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + if (this._get(inst, 'rangeSelect')) { + return [inst.rangeStart || startDate, + (!inst.endYear ? inst.rangeStart || startDate : + this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth, inst.endDay)))]; + } else + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateDatepicker: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var showStatus = this._get(inst, 'showStatus'); + var isRTL = this._get(inst, 'isRTL'); + // build the date picker HTML + var clear = (this._get(inst, 'mandatory') ? '' : + '<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'clearStatus') || '&#xa0;') : '') + '>' + + this._get(inst, 'clearText') + '</a></div>'); + var controls = '<div class="ui-datepicker-control">' + (isRTL ? '' : clear) + + '<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'closeStatus') || '&#xa0;') : '') + '>' + + this._get(inst, 'closeText') + '</a></div>' + (isRTL ? clear : '') + '</div>'; + var prompt = this._get(inst, 'prompt'); + var closeAtTop = this._get(inst, 'closeAtTop'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min', true); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth; + var drawYear = inst.drawYear; + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + // controls and links + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = '<div class="ui-datepicker-prev">' + (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'prevStatus') || '&#xa0;') : '') + '>' + prevText + '</a>' : + (hideIfNoPrevNext ? '' : '<label>' + prevText + '</label>')) + '</div>'; + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = '<div class="ui-datepicker-next">' + (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'nextStatus') || '&#xa0;') : '') + '>' + nextText + '</a>' : + (hideIfNoPrevNext ? '' : '<label>' + nextText + '</label>')) + '</div>'; + var currentText = this._get(inst, 'currentText'); + currentText = (!navigationAsDateFormat ? currentText: this.formatDate( + currentText, today, this._getFormatConfig(inst))); + var html = (prompt ? '<div class="' + this._promptClass + '">' + prompt + '</div>' : '') + + (closeAtTop && !inst.inline ? controls : '') + + '<div class="ui-datepicker-links">' + (isRTL ? next : prev) + + (this._isInRange(inst, (this._get(inst, 'gotoCurrent') && inst.currentDay ? + currentDate : today)) ? '<div class="ui-datepicker-current">' + + '<a onclick="jQuery.datepicker._gotoToday(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'currentStatus') || '&#xa0;') : '') + '>' + + currentText + '</a></div>' : '') + (isRTL ? prev : next) + '</div>'; + var firstDay = this._get(inst, 'firstDay'); + var changeFirstDay = this._get(inst, 'changeFirstDay'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var highlightWeek = this._get(inst, 'highlightWeek'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var showWeeks = this._get(inst, 'showWeeks'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var status = (showStatus ? this._get(inst, 'dayStatus') || '&#xa0;' : ''); + var dateStatus = this._get(inst, 'statusForDate') || this.dateStatus; + var endDate = inst.endDay ? this._daylightSavingAdjust( + new Date(inst.endYear, inst.endMonth, inst.endDay)) : currentDate; + for (var row = 0; row < numMonths[0]; row++) + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + html += '<div class="ui-datepicker-one-month' + (col == 0 ? ' ui-datepicker-new-row' : '') + '">' + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + selectedDate, row > 0 || col > 0, showStatus, monthNames) + // draw month headers + '<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>' + + '<tr class="ui-datepicker-title-row">' + + (showWeeks ? '<td>' + this._get(inst, 'weekHeader') + '</td>' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + var dayStatus = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) : + status.replace(/D/, dayNamesShort[day])); + html += '<td' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"' : '') + '>' + + (!changeFirstDay ? '<span' : + '<a onclick="jQuery.datepicker._changeFirstDay(\'#' + inst.id + '\', ' + day + ');"') + + (showStatus ? this._addStatus(inst, dayStatus) : '') + ' title="' + dayNames[day] + '">' + + dayNamesMin[day] + (changeFirstDay ? '</a>' : '</span>') + '</td>'; + } + html += '</tr></thead><tbody>'; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + html += '<tr class="ui-datepicker-days-row">' + + (showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + '</td>' : ''); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = otherMonth || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + html += '<td class="ui-datepicker-days-cell' + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end-cell' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-otherMonth' : '') + // highlight days from other months + (printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth ? + ' ui-datepicker-days-cell-over' : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass : '') + // highlight unselectable days + (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates + (printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? // in current range + ' ' + this._currentClass : '') + // highlight selected day + (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title + (unselectable ? (highlightWeek ? ' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"' + // highlight selection week + ' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"' : '') : // unhighlight selection week + ' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')' + // highlight selection + (highlightWeek ? '.parent().addClass(\'ui-datepicker-week-over\')' : '') + ';' + // highlight selection week + (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' + + inst.id + '\').html(\'' + (dateStatus.apply((inst.input ? inst.input[0] : null), + [printDate, inst]) || '&#xa0;') +'\');') + '"' + + ' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')' + // unhighlight selection + (highlightWeek ? '.parent().removeClass(\'ui-datepicker-week-over\')' : '') + ';' + // unhighlight selection week + (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' + + inst.id + '\').html(\'&#xa0;\');') + '" onclick="jQuery.datepicker._selectDay(\'#' + + inst.id + '\',' + drawMonth + ',' + drawYear + ', this);"') + '>' + // actions + (otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : // display for other months + (unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; // display for this month + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + html += '</tr>'; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + html += '</tbody></table></div>'; + } + html += (showStatus ? '<div style="clear: both;"></div><div id="ui-datepicker-status-' + inst.id + + '" class="ui-datepicker-status">' + (this._get(inst, 'initStatus') || '&#xa0;') + '</div>' : '') + + (!closeAtTop && !inst.inline ? controls : '') + + '<div style="clear: both;"></div>' + + ($.browser.msie && parseInt($.browser.version) < 7 && !inst.inline ? + '<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>' : ''); + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + selectedDate, secondary, showStatus, monthNames) { + minDate = (inst.rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate); + var html = '<div class="ui-datepicker-header">'; + // month selection + if (secondary || !this._get(inst, 'changeMonth')) + html += monthNames[drawMonth] + '&#xa0;'; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + html += '<select class="ui-datepicker-new-month" ' + + 'onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + + 'onclick="jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'monthStatus') || '&#xa0;') : '') + '>'; + for (var month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth())) + html += '<option value="' + month + '"' + + (month == drawMonth ? ' selected="selected"' : '') + + '>' + monthNames[month] + '</option>'; + } + html += '</select>'; + } + // year selection + if (secondary || !this._get(inst, 'changeYear')) + html += drawYear; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var year = 0; + var endYear = 0; + if (years.length != 2) { + year = drawYear - 10; + endYear = drawYear + 10; + } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') { + year = endYear = new Date().getFullYear(); + year += parseInt(years[0], 10); + endYear += parseInt(years[1], 10); + } else { + year = parseInt(years[0], 10); + endYear = parseInt(years[1], 10); + } + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + html += '<select class="ui-datepicker-new-year" ' + + 'onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + + 'onclick="jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + (showStatus ? this._addStatus(inst, this._get(inst, 'yearStatus') || '&#xa0;') : '') + '>'; + for (; year <= endYear; year++) { + html += '<option value="' + year + '"' + + (year == drawYear ? ' selected="selected"' : '') + + '>' + year + '</option>'; + } + html += '</select>'; + } + html += '</div>'; // Close datepicker_header + return html; + }, + + /* Provide code to set and clear the status panel. */ + _addStatus: function(inst, text) { + return ' onmouseover="jQuery(\'#ui-datepicker-status-' + inst.id + '\').html(\'' + text + '\');" ' + + 'onmouseout="jQuery(\'#ui-datepicker-status-' + inst.id + '\').html(\'&#xa0;\');"'; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._daylightSavingAdjust(new Date(year, month, day)); + // ensure it is within the bounds set + var minDate = this._getMinMaxDate(inst, 'min', true); + var maxDate = this._getMinMaxDate(inst, 'max'); + date = (minDate && date < minDate ? minDate : date); + date = (maxDate && date > maxDate ? maxDate : date); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [new Date(inst.selectedYear, inst.selectedMonth, 1), inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set - may be overridden for a range. */ + _getMinMaxDate: function(inst, minMax, checkRange) { + var date = this._determineDate(this._get(inst, minMax + 'Date'), null); + return (!checkRange || !inst.rangeStart ? date : + (!date || inst.rangeStart > date ? inst.rangeStart : date)); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - new Date(year, month, 32).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date( + curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + // during range selection, use minimum of selected date and range start + var newMinDate = (!inst.rangeStart ? null : this._daylightSavingAdjust( + new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay))); + newMinDate = (newMinDate && inst.rangeStart < newMinDate ? inst.rangeStart : newMinDate); + var minDate = newMinDate || this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate)); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance + +/* Initialise the date picker. */ +$(document).ready(function() { + $(document.body).append($.datepicker.dpDiv). + mousedown($.datepicker._checkExternalClick); +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.dialog.js b/fannie/src/jquery-ui/development-bundle/ui/ui.dialog.js new file mode 100644 index 000000000..858e9e28b --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.dialog.js @@ -0,0 +1,497 @@ +/* + * jQuery UI Dialog + * + * Copyright (c) 2008 Richard D. Worth (rdworth.org) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * ui.core.js + * ui.draggable.js + * ui.resizable.js + */ +(function($) { + +var setDataSwitch = { + dragStart: "start.draggable", + drag: "drag.draggable", + dragStop: "stop.draggable", + maxHeight: "maxHeight.resizable", + minHeight: "minHeight.resizable", + maxWidth: "maxWidth.resizable", + minWidth: "minWidth.resizable", + resizeStart: "start.resizable", + resize: "drag.resizable", + resizeStop: "stop.resizable" +}; + +$.widget("ui.dialog", { + init: function() { + var self = this, + options = this.options, + resizeHandles = typeof options.resizable == 'string' + ? options.resizable + : 'n,e,s,w,se,sw,ne,nw', + + uiDialogContent = this.element + .addClass('ui-dialog-content') + .wrap('<div/>') + .wrap('<div/>'), + + uiDialogContainer = (this.uiDialogContainer = uiDialogContent.parent() + .addClass('ui-dialog-container') + .css({position: 'relative', width: '100%', height: '100%'})), + + title = options.title || uiDialogContent.attr('title') || '', + uiDialogTitlebar = (this.uiDialogTitlebar = + $('<div class="ui-dialog-titlebar"/>')) + .append('<span class="ui-dialog-title">' + title + '</span>') + .append('<a href="#" class="ui-dialog-titlebar-close"><span>X</span></a>') + .prependTo(uiDialogContainer), + + uiDialog = (this.uiDialog = uiDialogContainer.parent()) + .appendTo(document.body) + .hide() + .addClass('ui-dialog') + .addClass(options.dialogClass) + // add content classes to dialog + // to inherit theme at top level of element + .addClass(uiDialogContent.attr('className')) + .removeClass('ui-dialog-content') + .css({ + position: 'absolute', + width: options.width, + height: options.height, + overflow: 'hidden', + zIndex: options.zIndex + }) + // setting tabIndex makes the div focusable + // setting outline to 0 prevents a border on focus in Mozilla + .attr('tabIndex', -1).css('outline', 0).keydown(function(ev) { + if (options.closeOnEscape) { + var ESC = 27; + (ev.keyCode && ev.keyCode == ESC && self.close()); + } + }) + .mousedown(function() { + self.moveToTop(); + }), + + uiDialogButtonPane = (this.uiDialogButtonPane = $('<div/>')) + .addClass('ui-dialog-buttonpane').css({ position: 'absolute', bottom: 0 }) + .appendTo(uiDialog); + + this.uiDialogTitlebarClose = $('.ui-dialog-titlebar-close', uiDialogTitlebar) + .hover( + function() { + $(this).addClass('ui-dialog-titlebar-close-hover'); + }, + function() { + $(this).removeClass('ui-dialog-titlebar-close-hover'); + } + ) + .mousedown(function(ev) { + ev.stopPropagation(); + }) + .click(function() { + self.close(); + return false; + }); + + this.uiDialogTitlebar.find("*").add(this.uiDialogTitlebar).each(function() { + $.ui.disableSelection(this); + }); + + if ($.fn.draggable) { + uiDialog.draggable({ + cancel: '.ui-dialog-content', + helper: options.dragHelper, + handle: '.ui-dialog-titlebar', + start: function(e, ui) { + self.moveToTop(); + (options.dragStart && options.dragStart.apply(self.element[0], arguments)); + }, + drag: function(e, ui) { + (options.drag && options.drag.apply(self.element[0], arguments)); + }, + stop: function(e, ui) { + (options.dragStop && options.dragStop.apply(self.element[0], arguments)); + $.ui.dialog.overlay.resize(); + } + }); + (options.draggable || uiDialog.draggable('disable')); + } + + if ($.fn.resizable) { + uiDialog.resizable({ + cancel: '.ui-dialog-content', + helper: options.resizeHelper, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: options.minHeight, + start: function() { + (options.resizeStart && options.resizeStart.apply(self.element[0], arguments)); + }, + resize: function(e, ui) { + (options.autoResize && self.size.apply(self)); + (options.resize && options.resize.apply(self.element[0], arguments)); + }, + handles: resizeHandles, + stop: function(e, ui) { + (options.autoResize && self.size.apply(self)); + (options.resizeStop && options.resizeStop.apply(self.element[0], arguments)); + $.ui.dialog.overlay.resize(); + } + }); + (options.resizable || uiDialog.resizable('disable')); + } + + this.createButtons(options.buttons); + this.isOpen = false; + + (options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe()); + (options.autoOpen && this.open()); + }, + + setData: function(key, value){ + (setDataSwitch[key] && this.uiDialog.data(setDataSwitch[key], value)); + switch (key) { + case "buttons": + this.createButtons(value); + break; + case "draggable": + this.uiDialog.draggable(value ? 'enable' : 'disable'); + break; + case "height": + this.uiDialog.height(value); + break; + case "position": + this.position(value); + break; + case "resizable": + (typeof value == 'string' && this.uiDialog.data('handles.resizable', value)); + this.uiDialog.resizable(value ? 'enable' : 'disable'); + break; + case "title": + $(".ui-dialog-title", this.uiDialogTitlebar).text(value); + break; + case "width": + this.uiDialog.width(value); + break; + } + + $.widget.prototype.setData.apply(this, arguments); + }, + + position: function(pos) { + var wnd = $(window), doc = $(document), + pTop = doc.scrollTop(), pLeft = doc.scrollLeft(), + minTop = pTop; + + if ($.inArray(pos, ['center','top','right','bottom','left']) >= 0) { + pos = [ + pos == 'right' || pos == 'left' ? pos : 'center', + pos == 'top' || pos == 'bottom' ? pos : 'middle' + ]; + } + if (pos.constructor != Array) { + pos = ['center', 'middle']; + } + if (pos[0].constructor == Number) { + pLeft += pos[0]; + } else { + switch (pos[0]) { + case 'left': + pLeft += 0; + break; + case 'right': + pLeft += wnd.width() - this.uiDialog.width(); + break; + default: + case 'center': + pLeft += (wnd.width() - this.uiDialog.width()) / 2; + } + } + if (pos[1].constructor == Number) { + pTop += pos[1]; + } else { + switch (pos[1]) { + case 'top': + pTop += 0; + break; + case 'bottom': + pTop += wnd.height() - this.uiDialog.height(); + break; + default: + case 'middle': + pTop += (wnd.height() - this.uiDialog.height()) / 2; + } + } + + // prevent the dialog from being too high (make sure the titlebar + // is accessible) + pTop = Math.max(pTop, minTop); + this.uiDialog.css({top: pTop, left: pLeft}); + }, + + size: function() { + var container = this.uiDialogContainer, + titlebar = this.uiDialogTitlebar, + content = this.element, + tbMargin = parseInt(content.css('margin-top'),10) + parseInt(content.css('margin-bottom'),10), + lrMargin = parseInt(content.css('margin-left'),10) + parseInt(content.css('margin-right'),10); + content.height(container.height() - titlebar.outerHeight() - tbMargin); + content.width(container.width() - lrMargin); + }, + + open: function() { + if (this.isOpen) { return; } + + this.overlay = this.options.modal ? new $.ui.dialog.overlay(this) : null; + (this.uiDialog.next().length > 0) && this.uiDialog.appendTo('body'); + this.position(this.options.position); + this.uiDialog.show(this.options.show); + this.options.autoResize && this.size(); + this.moveToTop(true); + + // CALLBACK: open + var openEV = null; + var openUI = { + options: this.options + }; + this.uiDialogTitlebarClose.focus(); + this.element.triggerHandler("dialogopen", [openEV, openUI], this.options.open); + + this.isOpen = true; + }, + + // the force parameter allows us to move modal dialogs to their correct + // position on open + moveToTop: function(force) { + if ((this.options.modal && !force) + || (!this.options.stack && !this.options.modal)) { return this.element.triggerHandler("dialogfocus", [null, { options: this.options }], this.options.focus); } + + var maxZ = this.options.zIndex, options = this.options; + $('.ui-dialog:visible').each(function() { + maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10) || options.zIndex); + }); + (this.overlay && this.overlay.$el.css('z-index', ++maxZ)); + this.uiDialog.css('z-index', ++maxZ); + + this.element.triggerHandler("dialogfocus", [null, { options: this.options }], this.options.focus); + }, + + close: function() { + (this.overlay && this.overlay.destroy()); + this.uiDialog.hide(this.options.hide); + + // CALLBACK: close + var closeEV = null; + var closeUI = { + options: this.options + }; + this.element.triggerHandler("dialogclose", [closeEV, closeUI], this.options.close); + $.ui.dialog.overlay.resize(); + + this.isOpen = false; + }, + + destroy: function() { + (this.overlay && this.overlay.destroy()); + this.uiDialog.hide(); + this.element + .unbind('.dialog') + .removeData('dialog') + .removeClass('ui-dialog-content') + .hide().appendTo('body'); + this.uiDialog.remove(); + }, + + createButtons: function(buttons) { + var self = this, + hasButtons = false, + uiDialogButtonPane = this.uiDialogButtonPane; + + // remove any existing buttons + uiDialogButtonPane.empty().hide(); + + $.each(buttons, function() { return !(hasButtons = true); }); + if (hasButtons) { + uiDialogButtonPane.show(); + $.each(buttons, function(name, fn) { + $('<button/>') + .text(name) + .click(function() { fn.apply(self.element[0], arguments); }) + .appendTo(uiDialogButtonPane); + }); + } + } +}); + +$.extend($.ui.dialog, { + defaults: { + autoOpen: true, + autoResize: true, + bgiframe: false, + buttons: {}, + closeOnEscape: true, + draggable: true, + height: 200, + minHeight: 100, + minWidth: 150, + modal: false, + overlay: {}, + position: 'center', + resizable: true, + stack: true, + width: 300, + zIndex: 1000 + }, + + overlay: function(dialog) { + this.$el = $.ui.dialog.overlay.create(dialog); + } +}); + +$.extend($.ui.dialog.overlay, { + instances: [], + events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), + function(e) { return e + '.dialog-overlay'; }).join(' '), + create: function(dialog) { + if (this.instances.length === 0) { + // prevent use of anchors and inputs + // we use a setTimeout in case the overlay is created from an + // event that we're going to be cancelling (see #2804) + setTimeout(function() { + $('a, :input').bind($.ui.dialog.overlay.events, function() { + // allow use of the element if inside a dialog and + // - there are no modal dialogs + // - there are modal dialogs, but we are in front of the topmost modal + var allow = false; + var $dialog = $(this).parents('.ui-dialog'); + if ($dialog.length) { + var $overlays = $('.ui-dialog-overlay'); + if ($overlays.length) { + var maxZ = parseInt($overlays.css('z-index'), 10); + $overlays.each(function() { + maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10)); + }); + allow = parseInt($dialog.css('z-index'), 10) > maxZ; + } else { + allow = true; + } + } + return allow; + }); + }, 1); + + // allow closing by pressing the escape key + $(document).bind('keydown.dialog-overlay', function(e) { + var ESC = 27; + (e.keyCode && e.keyCode == ESC && dialog.close()); + }); + + // handle window resize + $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); + } + + var $el = $('<div/>').appendTo(document.body) + .addClass('ui-dialog-overlay').css($.extend({ + borderWidth: 0, margin: 0, padding: 0, + position: 'absolute', top: 0, left: 0, + width: this.width(), + height: this.height() + }, dialog.options.overlay)); + + (dialog.options.bgiframe && $.fn.bgiframe && $el.bgiframe()); + + this.instances.push($el); + return $el; + }, + + destroy: function($el) { + this.instances.splice($.inArray(this.instances, $el), 1); + + if (this.instances.length === 0) { + $('a, :input').add([document, window]).unbind('.dialog-overlay'); + } + + $el.remove(); + }, + + height: function() { + if ($.browser.msie && $.browser.version < 7) { + var scrollHeight = Math.max( + document.documentElement.scrollHeight, + document.body.scrollHeight + ); + var offsetHeight = Math.max( + document.documentElement.offsetHeight, + document.body.offsetHeight + ); + + if (scrollHeight < offsetHeight) { + return $(window).height() + 'px'; + } else { + return scrollHeight + 'px'; + } + } else { + return $(document).height() + 'px'; + } + }, + + width: function() { + if ($.browser.msie && $.browser.version < 7) { + var scrollWidth = Math.max( + document.documentElement.scrollWidth, + document.body.scrollWidth + ); + var offsetWidth = Math.max( + document.documentElement.offsetWidth, + document.body.offsetWidth + ); + + if (scrollWidth < offsetWidth) { + return $(window).width() + 'px'; + } else { + return scrollWidth + 'px'; + } + } else { + return $(document).width() + 'px'; + } + }, + + resize: function() { + /* If the dialog is draggable and the user drags it past the + * right edge of the window, the document becomes wider so we + * need to stretch the overlay. If the user then drags the + * dialog back to the left, the document will become narrower, + * so we need to shrink the overlay to the appropriate size. + * This is handled by shrinking the overlay before setting it + * to the full document size. + */ + var $overlays = $([]); + $.each($.ui.dialog.overlay.instances, function() { + $overlays = $overlays.add(this); + }); + + $overlays.css({ + width: 0, + height: 0 + }).css({ + width: $.ui.dialog.overlay.width(), + height: $.ui.dialog.overlay.height() + }); + } +}); + +$.extend($.ui.dialog.overlay.prototype, { + destroy: function() { + $.ui.dialog.overlay.destroy(this.$el); + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.draggable.js b/fannie/src/jquery-ui/development-bundle/ui/ui.draggable.js new file mode 100644 index 000000000..31aecff58 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.draggable.js @@ -0,0 +1,562 @@ +/* + * jQuery UI Draggable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.draggable", $.extend({}, $.ui.mouse, { + init: function() { + + //Initialize needed constants + var o = this.options; + + //Position the node + if (o.helper == 'original' && !(/(relative|absolute|fixed)/).test(this.element.css('position'))) + this.element.css('position', 'relative'); + + this.element.addClass('ui-draggable'); + (o.disabled && this.element.addClass('ui-draggable-disabled')); + + this.mouseInit(); + + }, + mouseStart: function(e) { + var o = this.options; + + if (this.helper || o.disabled || $(e.target).is('.ui-resizable-handle')) return false; + + var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; + + + $(this.options.handle, this.element).find("*").andSelf().each(function() { + if(this == e.target) handle = true; + }); + if (!handle) return false; + + if($.ui.ddmanager) $.ui.ddmanager.current = this; + + //Create and append the visible helper + this.helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [e])) : (o.helper == 'clone' ? this.element.clone() : this.element); + if(!this.helper.parents('body').length) this.helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); + if(this.helper[0] != this.element[0] && !(/(fixed|absolute)/).test(this.helper.css("position"))) this.helper.css("position", "absolute"); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + this.margins = { //Cache the margins + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0) + }; + + this.cssPosition = this.helper.css("position"); //Store the helper's css position + this.offset = this.element.offset(); //The element's absolute position on the page + this.offset = { //Substract the margins from the element's absolute offset + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + this.offset.click = { //Where the click happened, relative to the element + left: e.pageX - this.offset.left, + top: e.pageY - this.offset.top + }; + + this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); //Get the offsetParent and cache its position + if(this.offsetParent[0] == document.body && $.browser.mozilla) po = { top: 0, left: 0 }; //Ugly FF3 fix + this.offset.parent = { //Store its position plus border + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + var p = this.element.position(); //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helpers + this.offset.relative = this.cssPosition == "relative" ? { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.offsetParent[0].scrollTop, + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.offsetParent[0].scrollLeft + } : { top: 0, left: 0 }; + + this.originalPosition = this.generatePosition(e); //Generate the original position + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size + + if(o.cursorAt) { + if(o.cursorAt.left != undefined) this.offset.click.left = o.cursorAt.left + this.margins.left; + if(o.cursorAt.right != undefined) this.offset.click.left = this.helperProportions.width - o.cursorAt.right + this.margins.left; + if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top + this.margins.top; + if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom + this.margins.top; + } + + + /* + * - Position constraining - + * Here we prepare position constraining like grid and containment. + */ + + if(o.containment) { + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top, + co.left+Math.max(ce.scrollWidth,ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), + co.top+Math.max(ce.scrollHeight,ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) + ]; + } + } + + //Call plugins and callbacks + this.propagate("start", e); + + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Recache the helper size + if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e); + + this.helper.addClass("ui-draggable-dragging"); + this.mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + }, + convertPositionTo: function(d, pos) { + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + return { + top: ( + pos.top // the calculated relative position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollTop) * mod // The offsetParent's scroll position, not if the element is fixed + + (this.cssPosition == "fixed" ? $(document).scrollTop() : 0) * mod + + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods) + ), + left: ( + pos.left // the calculated relative position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollLeft) * mod // The offsetParent's scroll position, not if the element is fixed + + (this.cssPosition == "fixed" ? $(document).scrollLeft() : 0) * mod + + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods) + ) + }; + }, + generatePosition: function(e) { + + var o = this.options; + var position = { + top: ( + e.pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollTop) // The offsetParent's scroll position, not if the element is fixed + - (this.cssPosition == "fixed" ? $(document).scrollTop() : 0) + ), + left: ( + e.pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollLeft) // The offsetParent's scroll position, not if the element is fixed + - (this.cssPosition == "fixed" ? $(document).scrollLeft() : 0) + ) + }; + + if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + if(this.containment) { + if(position.left < this.containment[0]) position.left = this.containment[0]; + if(position.top < this.containment[1]) position.top = this.containment[1]; + if(position.left > this.containment[2]) position.left = this.containment[2]; + if(position.top > this.containment[3]) position.top = this.containment[3]; + } + + if(o.grid) { + var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1]; + position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0]; + position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + return position; + }, + mouseDrag: function(e) { + + //Compute the helpers position + this.position = this.generatePosition(e); + this.positionAbs = this.convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + this.position = this.propagate("drag", e) || this.position; + + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + if($.ui.ddmanager) $.ui.ddmanager.drag(this, e); + + return false; + }, + mouseStop: function(e) { + + //If we are using droppables, inform the manager about the drop + var dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) + var dropped = $.ui.ddmanager.drop(this, e); + + if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true) { + var self = this; + $(this.helper).animate(this.originalPosition, parseInt(this.options.revert, 10) || 500, function() { + self.propagate("stop", e); + self.clear(); + }); + } else { + this.propagate("stop", e); + this.clear(); + } + + return false; + }, + clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.options.helper != 'original' && !this.cancelHelperRemoval) this.helper.remove(); + //if($.ui.ddmanager) $.ui.ddmanager.current = null; + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + plugins: {}, + uiHash: function(e) { + return { + helper: this.helper, + position: this.position, + absolutePosition: this.positionAbs, + options: this.options + }; + }, + propagate: function(n,e) { + $.ui.plugin.call(this, n, [e, this.uiHash()]); + if(n == "drag") this.positionAbs = this.convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins + return this.element.triggerHandler(n == "drag" ? n : "drag"+n, [e, this.uiHash()], this.options[n]); + }, + destroy: function() { + if(!this.element.data('draggable')) return; + this.element.removeData("draggable").unbind(".draggable").removeClass('ui-draggable'); + this.mouseDestroy(); + } +})); + +$.extend($.ui.draggable, { + defaults: { + appendTo: "parent", + axis: false, + cancel: ":input", + delay: 0, + distance: 1, + helper: "original" + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function(e, ui) { + var t = $('body'); + if (t.css("cursor")) ui.options._cursor = t.css("cursor"); + t.css("cursor", ui.options.cursor); + }, + stop: function(e, ui) { + if (ui.options._cursor) $('body').css("cursor", ui.options._cursor); + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(e, ui) { + var t = $(ui.helper); + if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex"); + t.css('zIndex', ui.options.zIndex); + }, + stop: function(e, ui) { + if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex); + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(e, ui) { + var t = $(ui.helper); + if(t.css("opacity")) ui.options._opacity = t.css("opacity"); + t.css('opacity', ui.options.opacity); + }, + stop: function(e, ui) { + if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity); + } +}); + +$.ui.plugin.add("draggable", "iframeFix", { + start: function(e, ui) { + $(ui.options.iframeFix === true ? "iframe" : ui.options.iframeFix).each(function() { + $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>') + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + }, + stop: function(e, ui) { + $("div.DragDropIframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function(e, ui) { + var o = ui.options; + var i = $(this).data("draggable"); + o.scrollSensitivity = o.scrollSensitivity || 20; + o.scrollSpeed = o.scrollSpeed || 20; + + i.overflowY = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(this); + i.overflowX = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(this); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') i.overflowYOffset = i.overflowY.offset(); + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') i.overflowXOffset = i.overflowX.offset(); + + }, + drag: function(e, ui) { + + var o = ui.options; + var i = $(this).data("draggable"); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') { + if((i.overflowYOffset.top + i.overflowY[0].offsetHeight) - e.pageY < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed; + if(e.pageY - i.overflowYOffset.top < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed; + + } else { + if(e.pageY - $(document).scrollTop() < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') { + if((i.overflowXOffset.left + i.overflowX[0].offsetWidth) - e.pageX < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed; + if(e.pageX - i.overflowXOffset.left < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed; + } else { + if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function(e, ui) { + + var inst = $(this).data("draggable"); + inst.snapElements = []; + $(ui.options.snap === true ? '.ui-draggable' : ui.options.snap).each(function() { + var $t = $(this); var $o = $t.offset(); + if(this != inst.element[0]) inst.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + }); + + }, + drag: function(e, ui) { + + var inst = $(this).data("draggable"); + var d = ui.options.snapTolerance || 20; + var x1 = ui.absolutePosition.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.absolutePosition.top, y2 = y1 + inst.helperProportions.height; + + for (var i = inst.snapElements.length - 1; i >= 0; i--){ + + var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, + t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; + + //Yes, I know, this is insane ;) + if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) continue; + + if(ui.options.snapMode != 'inner') { + var ts = Math.abs(t - y2) <= 20; + var bs = Math.abs(b - y1) <= 20; + var ls = Math.abs(l - x2) <= 20; + var rs = Math.abs(r - x1) <= 20; + if(ts) ui.position.top = inst.convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top; + if(bs) ui.position.top = inst.convertPositionTo("relative", { top: b, left: 0 }).top; + if(ls) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left; + if(rs) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: r }).left; + } + + if(ui.options.snapMode != 'outer') { + var ts = Math.abs(t - y1) <= 20; + var bs = Math.abs(b - y2) <= 20; + var ls = Math.abs(l - x1) <= 20; + var rs = Math.abs(r - x2) <= 20; + if(ts) ui.position.top = inst.convertPositionTo("relative", { top: t, left: 0 }).top; + if(bs) ui.position.top = inst.convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top; + if(ls) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: l }).left; + if(rs) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left; + } + + }; + } +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(e,ui) { + + var inst = $(this).data("draggable"); + inst.sortables = []; + $(ui.options.connectToSortable).each(function() { + if($.data(this, 'sortable')) { + var sortable = $.data(this, 'sortable'); + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable.refreshItems(); //Do a one-time refresh at start to refresh the containerCache + sortable.propagate("activate", e, inst); + } + }); + + }, + stop: function(e,ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("draggable"); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + this.instance.isOver = 0; + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + if(this.shouldRevert) this.instance.options.revert = true; //revert here + this.instance.mouseStop(e); + + //Also propagate receive event, since the sortable is actually receiving a element + this.instance.element.triggerHandler("sortreceive", [e, $.extend(this.instance.ui(), { sender: inst.element })], this.instance.options["receive"]); + + this.instance.options.helper = this.instance.options._helper; + } else { + this.instance.propagate("deactivate", e, inst); + } + + }); + + }, + drag: function(e,ui) { + + var inst = $(this).data("draggable"), self = this; + + var checkPos = function(o) { + + var l = o.left, r = l + o.width, + t = o.top, b = t + o.height; + + return (l < (this.positionAbs.left + this.offset.click.left) && (this.positionAbs.left + this.offset.click.left) < r + && t < (this.positionAbs.top + this.offset.click.top) && (this.positionAbs.top + this.offset.click.top) < b); + }; + + $.each(inst.sortables, function(i) { + + if(checkPos.call(inst, this.instance.containerCache)) { + + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + this.instance.isOver = 1; + + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + e.target = this.instance.currentItem[0]; + this.instance.mouseCapture(e, true); + this.instance.mouseStart(e, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst.propagate("toSortable", e); + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) this.instance.mouseDrag(e); + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + this.instance.options.revert = false; //No revert here + this.instance.mouseStop(e, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) this.instance.placeholder.remove(); + + inst.propagate("fromSortable", e); + } + + }; + + }); + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function(e,ui) { + var group = $.makeArray($(ui.options.stack.group)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || ui.options.stack.min) - (parseInt($(b).css("zIndex"),10) || ui.options.stack.min); + }); + + $(group).each(function(i) { + this.style.zIndex = ui.options.stack.min + i; + }); + + this[0].style.zIndex = ui.options.stack.min + group.length; + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.droppable.js b/fannie/src/jquery-ui/development-bundle/ui/ui.droppable.js new file mode 100644 index 000000000..6d3e159fa --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.droppable.js @@ -0,0 +1,281 @@ +/* + * jQuery UI Droppable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * ui.core.js + * ui.draggable.js + */ +(function($) { + +$.widget("ui.droppable", { + init: function() { + + this.element.addClass("ui-droppable"); + this.isover = 0; this.isout = 1; + + //Prepare the passed options + var o = this.options, accept = o.accept; + o = $.extend(o, { + accept: o.accept && o.accept.constructor == Function ? o.accept : function(d) { + return $(d).is(accept); + } + }); + + //Store the droppable's proportions + this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables.push(this); + + }, + plugins: {}, + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + absolutePosition: c.positionAbs, + options: this.options, + element: this.element + }; + }, + destroy: function() { + var drop = $.ui.ddmanager.droppables; + for ( var i = 0; i < drop.length; i++ ) + if ( drop[i] == this ) + drop.splice(i, 1); + + this.element + .removeClass("ui-droppable ui-droppable-disabled") + .removeData("droppable") + .unbind(".droppable"); + }, + over: function(e) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + $.ui.plugin.call(this, 'over', [e, this.ui(draggable)]); + this.element.triggerHandler("dropover", [e, this.ui(draggable)], this.options.over); + } + + }, + out: function(e) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + $.ui.plugin.call(this, 'out', [e, this.ui(draggable)]); + this.element.triggerHandler("dropout", [e, this.ui(draggable)], this.options.out); + } + + }, + drop: function(e,custom) { + + var draggable = custom || $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element + + var childrenIntersection = false; + this.element.find(".ui-droppable").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, 'droppable'); + if(inst.options.greedy && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)) { + childrenIntersection = true; return false; + } + }); + if(childrenIntersection) return false; + + if(this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + $.ui.plugin.call(this, 'drop', [e, this.ui(draggable)]); + this.element.triggerHandler("drop", [e, this.ui(draggable)], this.options.drop); + return true; + } + + return false; + + }, + activate: function(e) { + + var draggable = $.ui.ddmanager.current; + $.ui.plugin.call(this, 'activate', [e, this.ui(draggable)]); + if(draggable) this.element.triggerHandler("dropactivate", [e, this.ui(draggable)], this.options.activate); + + }, + deactivate: function(e) { + + var draggable = $.ui.ddmanager.current; + $.ui.plugin.call(this, 'deactivate', [e, this.ui(draggable)]); + if(draggable) this.element.triggerHandler("dropdeactivate", [e, this.ui(draggable)], this.options.deactivate); + + } +}); + +$.extend($.ui.droppable, { + defaults: { + disabled: false, + tolerance: 'intersect' + } +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) return false; + + var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, + y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height; + var l = droppable.offset.left, r = l + droppable.proportions.width, + t = droppable.offset.top, b = t + droppable.proportions.height; + + switch (toleranceMode) { + case 'fit': + return (l < x1 && x2 < r + && t < y1 && y2 < b); + break; + case 'intersect': + return (l < x1 + (draggable.helperProportions.width / 2) // Right Half + && x2 - (draggable.helperProportions.width / 2) < r // Left Half + && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half + && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + break; + case 'pointer': + return (l < ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left) && ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left) < r + && t < ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top) && ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top) < b); + break; + case 'touch': + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + break; + default: + return false; + break; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: [], + prepareOffsets: function(t, e) { + + var m = $.ui.ddmanager.droppables; + var type = e ? e.type : null; // workaround for #2317 + + for (var i = 0; i < m.length; i++) { + if(m[i].options.disabled || (t && !m[i].options.accept.call(m[i].element,(t.currentItem || t.element)))) continue; + m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue + m[i].offset = m[i].element.offset(); + m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; + + if(type == "dragstart" || type == "sortactivate") m[i].activate.call(m[i], e); //Activate the droppable if used directly from draggables + } + + }, + drop: function(draggable, e) { + + var dropped = false; + $.each($.ui.ddmanager.droppables, function() { + + if(!this.options) return; + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) + dropped = this.drop.call(this, e); + + if (!this.options.disabled && this.visible && this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) { + this.isout = 1; this.isover = 0; + this.deactivate.call(this, e); + } + + }); + return dropped; + + }, + drag: function(draggable, e) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, e); + + //Run through all droppables and check their positions based on specific tolerance options + + $.each($.ui.ddmanager.droppables, function() { + + if(this.options.disabled || this.greedyChild || !this.visible) return; + var intersects = $.ui.intersect(draggable, this, this.options.tolerance); + + var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null); + if(!c) return; + + var parentInstance; + if (this.options.greedy) { + var parent = this.element.parents('.ui-droppable:eq(0)'); + if (parent.length) { + parentInstance = $.data(parent[0], 'droppable'); + parentInstance.greedyChild = (c == 'isover' ? 1 : 0); + } + } + + // we just moved into a greedy child + if (parentInstance && c == 'isover') { + parentInstance['isover'] = 0; + parentInstance['isout'] = 1; + parentInstance.out.call(parentInstance, e); + } + + this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0; + this[c == "isover" ? "over" : "out"].call(this, e); + + // we just moved out of a greedy child + if (parentInstance && c == 'isout') { + parentInstance['isout'] = 0; + parentInstance['isover'] = 1; + parentInstance.over.call(parentInstance, e); + } + }); + + } +}; + +/* + * Droppable Extensions + */ + +$.ui.plugin.add("droppable", "activeClass", { + activate: function(e, ui) { + $(this).addClass(ui.options.activeClass); + }, + deactivate: function(e, ui) { + $(this).removeClass(ui.options.activeClass); + }, + drop: function(e, ui) { + $(this).removeClass(ui.options.activeClass); + } +}); + +$.ui.plugin.add("droppable", "hoverClass", { + over: function(e, ui) { + $(this).addClass(ui.options.hoverClass); + }, + out: function(e, ui) { + $(this).removeClass(ui.options.hoverClass); + }, + drop: function(e, ui) { + $(this).removeClass(ui.options.hoverClass); + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.resizable.js b/fannie/src/jquery-ui/development-bundle/ui/ui.resizable.js new file mode 100644 index 000000000..7b681af55 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.resizable.js @@ -0,0 +1,770 @@ +/* + * jQuery UI Resizable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.resizable", $.extend({}, $.ui.mouse, { + init: function() { + + var self = this, o = this.options; + + var elpos = this.element.css('position'); + + this.originalElement = this.element; + + // simulate .ui-resizable { position: relative; } + this.element.addClass("ui-resizable").css({ position: /static/.test(elpos) ? 'relative' : elpos }); + + $.extend(o, { + _aspectRatio: !!(o.aspectRatio), + helper: o.helper || o.ghost || o.animate ? o.helper || 'proxy' : null, + knobHandles: o.knobHandles === true ? 'ui-resizable-knob-handle' : o.knobHandles + }); + + //Default Theme + var aBorder = '1px solid #DEDEDE'; + + o.defaultTheme = { + 'ui-resizable': { display: 'block' }, + 'ui-resizable-handle': { position: 'absolute', background: '#F2F2F2', fontSize: '0.1px' }, + 'ui-resizable-n': { cursor: 'n-resize', height: '4px', left: '0px', right: '0px', borderTop: aBorder }, + 'ui-resizable-s': { cursor: 's-resize', height: '4px', left: '0px', right: '0px', borderBottom: aBorder }, + 'ui-resizable-e': { cursor: 'e-resize', width: '4px', top: '0px', bottom: '0px', borderRight: aBorder }, + 'ui-resizable-w': { cursor: 'w-resize', width: '4px', top: '0px', bottom: '0px', borderLeft: aBorder }, + 'ui-resizable-se': { cursor: 'se-resize', width: '4px', height: '4px', borderRight: aBorder, borderBottom: aBorder }, + 'ui-resizable-sw': { cursor: 'sw-resize', width: '4px', height: '4px', borderBottom: aBorder, borderLeft: aBorder }, + 'ui-resizable-ne': { cursor: 'ne-resize', width: '4px', height: '4px', borderRight: aBorder, borderTop: aBorder }, + 'ui-resizable-nw': { cursor: 'nw-resize', width: '4px', height: '4px', borderLeft: aBorder, borderTop: aBorder } + }; + + o.knobTheme = { + 'ui-resizable-handle': { background: '#F2F2F2', border: '1px solid #808080', height: '8px', width: '8px' }, + 'ui-resizable-n': { cursor: 'n-resize', top: '0px', left: '45%' }, + 'ui-resizable-s': { cursor: 's-resize', bottom: '0px', left: '45%' }, + 'ui-resizable-e': { cursor: 'e-resize', right: '0px', top: '45%' }, + 'ui-resizable-w': { cursor: 'w-resize', left: '0px', top: '45%' }, + 'ui-resizable-se': { cursor: 'se-resize', right: '0px', bottom: '0px' }, + 'ui-resizable-sw': { cursor: 'sw-resize', left: '0px', bottom: '0px' }, + 'ui-resizable-nw': { cursor: 'nw-resize', left: '0px', top: '0px' }, + 'ui-resizable-ne': { cursor: 'ne-resize', right: '0px', top: '0px' } + }; + + o._nodeName = this.element[0].nodeName; + + //Wrap the element if it cannot hold child nodes + if(o._nodeName.match(/canvas|textarea|input|select|button|img/i)) { + var el = this.element; + + //Opera fixing relative position + if (/relative/.test(el.css('position')) && $.browser.opera) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + el.wrap( + $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css( { + position: el.css('position'), + width: el.outerWidth(), + height: el.outerHeight(), + top: el.css('top'), + left: el.css('left') + }) + ); + + var oel = this.element; this.element = this.element.parent(); + + // store instance on wrapper + this.element.data('resizable', this); + + //Move margins to the wrapper + this.element.css({ marginLeft: oel.css("marginLeft"), marginTop: oel.css("marginTop"), + marginRight: oel.css("marginRight"), marginBottom: oel.css("marginBottom") + }); + + oel.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + if ($.browser.safari && o.preventDefault) oel.css('resize', 'none'); + + o.proportionallyResize = oel.css({ position: 'static', zoom: 1, display: 'block' }); + + // avoid IE jump + this.element.css({ margin: oel.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + } + + if(!o.handles) o.handles = !$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }; + if(o.handles.constructor == String) { + + o.zIndex = o.zIndex || 1000; + + if(o.handles == 'all') o.handles = 'n,e,s,w,se,sw,ne,nw'; + + var n = o.handles.split(","); o.handles = {}; + + // insertions are applied when don't have theme loaded + var insertionsDefault = { + handle: 'position: absolute; display: none; overflow:hidden;', + n: 'top: 0pt; width:100%;', + e: 'right: 0pt; height:100%;', + s: 'bottom: 0pt; width:100%;', + w: 'left: 0pt; height:100%;', + se: 'bottom: 0pt; right: 0px;', + sw: 'bottom: 0pt; left: 0px;', + ne: 'top: 0pt; right: 0px;', + nw: 'top: 0pt; left: 0px;' + }; + + for(var i = 0; i < n.length; i++) { + var handle = $.trim(n[i]), dt = o.defaultTheme, hname = 'ui-resizable-'+handle, loadDefault = !$.ui.css(hname) && !o.knobHandles, userKnobClass = $.ui.css('ui-resizable-knob-handle'), + allDefTheme = $.extend(dt[hname], dt['ui-resizable-handle']), allKnobTheme = $.extend(o.knobTheme[hname], !userKnobClass ? o.knobTheme['ui-resizable-handle'] : {}); + + // increase zIndex of sw, se, ne, nw axis + var applyZIndex = /sw|se|ne|nw/.test(handle) ? { zIndex: ++o.zIndex } : {}; + + var defCss = (loadDefault ? insertionsDefault[handle] : ''), + axis = $(['<div class="ui-resizable-handle ', hname, '" style="', defCss, insertionsDefault.handle, '"></div>'].join('')).css( applyZIndex ); + o.handles[handle] = '.ui-resizable-'+handle; + + this.element.append( + //Theme detection, if not loaded, load o.defaultTheme + axis.css( loadDefault ? allDefTheme : {} ) + // Load the knobHandle css, fix width, height, top, left... + .css( o.knobHandles ? allKnobTheme : {} ).addClass(o.knobHandles ? 'ui-resizable-knob-handle' : '').addClass(o.knobHandles) + ); + } + + if (o.knobHandles) this.element.addClass('ui-resizable-knob').css( !$.ui.css('ui-resizable-knob') ? { /*border: '1px #fff dashed'*/ } : {} ); + } + + this._renderAxis = function(target) { + target = target || this.element; + + for(var i in o.handles) { + if(o.handles[i].constructor == String) + o.handles[i] = $(o.handles[i], this.element).show(); + + if (o.transparent) + o.handles[i].css({opacity:0}); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.element.is('.ui-wrapper') && + o._nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(o.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + if (!o.transparent) + target.css(padPos, padWrapper); + + this._proportionallyResize(); + } + if(!$(o.handles[i]).length) continue; + } + }; + + this._renderAxis(this.element); + o._handles = $('.ui-resizable-handle', self.element); + + if (o.disableSelection) + o._handles.each(function(i, e) { $.ui.disableSelection(e); }); + + //Matching axis name + o._handles.mouseover(function() { + if (!o.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = o.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + o._handles.hide(); + $(self.element).addClass("ui-resizable-autohide").hover(function() { + $(this).removeClass("ui-resizable-autohide"); + o._handles.show(); + }, + function(){ + if (!o.resizing) { + $(this).addClass("ui-resizable-autohide"); + o._handles.hide(); + } + }); + } + + this.mouseInit(); + }, + plugins: {}, + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + options: this.options, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + }, + propagate: function(n,e) { + $.ui.plugin.call(this, n, [e, this.ui()]); + if (n != "resize") this.element.triggerHandler(["resize", n].join(""), [e, this.ui()], this.options[n]); + }, + destroy: function() { + var el = this.element, wrapped = el.children(".ui-resizable").get(0); + + this.mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + _destroy(el); + + if (el.is('.ui-wrapper') && wrapped) { + el.parent().append( + $(wrapped).css({ + position: el.css('position'), + width: el.outerWidth(), + height: el.outerHeight(), + top: el.css('top'), + left: el.css('left') + }) + ).end().remove(); + + _destroy(wrapped); + } + }, + mouseStart: function(e) { + if(this.options.disabled) return false; + + var handle = false; + for(var i in this.options.handles) { + if($(this.options.handles[i])[0] == e.target) handle = true; + } + if (!handle) return false; + + var o = this.options, iniPos = this.element.position(), el = this.element, + num = function(v) { return parseInt(v, 10) || 0; }, ie6 = $.browser.msie && $.browser.version < 7; + o.resizing = true; + o.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix #1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + + // sOffset decides if document scrollOffset will be added to the top/left of the resizable element + var sOffset = $.browser.msie && !o.containment && (/absolute/).test(el.css('position')) && !(/relative/).test(el.parent().css('position')); + var dscrollt = sOffset ? o.documentScroll.top : 0, dscrolll = sOffset ? o.documentScroll.left : 0; + + el.css({ position: 'absolute', top: (iniPos.top + dscrollt), left: (iniPos.left + dscrolll) }); + } + + //Opera fixing relative position + if ($.browser.opera && /relative/.test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft()||0; + curtop += $(o.containment).scrollTop()||0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: e.pageX, top: e.pageY }; + + //Aspect Ratio + o.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.height / this.originalSize.width)||1); + + if (o.preserveCursor) + $('body').css('cursor', this.axis + '-resize'); + + this.propagate("start", e); + return true; + }, + mouseDrag: function(e) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (e.pageX-smp.left)||0, dy = (e.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [e, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (o._aspectRatio || e.shiftKey) + data = this._updateRatio(data, e); + + data = this._respectSize(data, e); + + // plugins callbacks need to be called first + this.propagate("resize", e); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!o.helper && o.proportionallyResize) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this.element.triggerHandler("resize", [e, this.ui()], this.options["resize"]); + + return false; + }, + mouseStop: function(e) { + + this.options.resizing = false; + var o = this.options, num = function(v) { return parseInt(v, 10) || 0; }, self = this; + + if(o.helper) { + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + if (o.helper && !o.animate) this._proportionallyResize(); + } + + if (o.preserveCursor) + $('body').css('cursor', 'auto'); + + this.propagate("stop", e); + + if (o.helper) this.helper.remove(); + + return false; + }, + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (data.left) this.position.left = data.left; + if (data.top) this.position.top = data.top; + if (data.height) this.size.height = data.height; + if (data.width) this.size.width = data.width; + }, + _updateRatio: function(data, e) { + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height / o.aspectRatio); + else if (data.width) data.height = (csize.width * o.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + _respectSize: function(data, e) { + + var el = this.helper, o = this.options, pRatio = o._aspectRatio || e.shiftKey, a = this.axis, + ismaxw = data.width && o.maxWidth && o.maxWidth < data.width, ismaxh = data.height && o.maxHeight && o.maxHeight < data.height, + isminw = data.width && o.minWidth && o.minWidth > data.width, isminh = data.height && o.minHeight && o.minHeight > data.height; + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + _proportionallyResize: function() { + var o = this.options; + if (!o.proportionallyResize) return; + var prel = o.proportionallyResize, el = this.helper || this.element; + + if (!o.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + o.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + prel.css({ + height: (el.height() - o.borderDif[0] - o.borderDif[2]) + "px", + width: (el.width() - o.borderDif[1] - o.borderDif[3]) + "px" + }); + }, + _renderProxy: function() { + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(o.helper) { + this.helper = this.helper || $('<div style="overflow:hidden;"></div>'); + + // fix ie6 offset + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(o.helper).css({ + width: el.outerWidth() + pxyoffset, + height: el.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex + }); + + this.helper.appendTo("body"); + + if (o.disableSelection) + $.ui.disableSelection(this.helper.get(0)); + + } else { + this.helper = el; + } + }, + _change: { + e: function(e, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(e, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(e, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(e, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(e, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [e, dx, dy])); + }, + sw: function(e, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [e, dx, dy])); + }, + ne: function(e, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [e, dx, dy])); + }, + nw: function(e, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [e, dx, dy])); + } + } +})); + +$.extend($.ui.resizable, { + defaults: { + cancel: ":input", + distance: 1, + delay: 0, + preventDefault: true, + transparent: false, + minWidth: 10, + minHeight: 10, + aspectRatio: false, + disableSelection: true, + preserveCursor: true, + autoHide: false, + knobHandles: false + } +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "containment", { + + start: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + + // i'm a node, so compute top, left, right, bottom + else{ + self.containerOffset = $(ce).offset(); + self.containerPosition = $(ce).position(); + self.containerSize = { height: $(ce).innerHeight(), width: $(ce).innerWidth() }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = o._aspectRatio || e.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && /static/.test(ce.css('position'))) + cop = self.containerPosition; + + if (cp.left < (o.helper ? co.left : cop.left)) { + self.size.width = self.size.width + (o.helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width * o.aspectRatio; + self.position.left = o.helper ? co.left : cop.left; + } + + if (cp.top < (o.helper ? co.top : 0)) { + self.size.height = self.size.height + (o.helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height / o.aspectRatio; + self.position.top = o.helper ? co.top : 0; + } + + var woset = (o.helper ? self.offset.left - co.left : (self.position.left - cop.left)) + self.sizeDiff.width, + hoset = (o.helper ? self.offset.top - co.top : self.position.top) + self.sizeDiff.height; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width * o.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height / o.aspectRatio; + } + }, + + stop: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.innerWidth(), h = helper.innerHeight(); + + + if (o.helper && !o.animate && /relative/.test(ce.css('position'))) + $(this).css({ left: (ho.left - co.left), top: (ho.top - co.top), width: w, height: h }); + + if (o.helper && !o.animate && /static/.test(ce.css('position'))) + $(this).css({ left: cop.left + (ho.left - co.left), top: cop.top + (ho.top - co.top), width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || e.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"); + + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration || "slow", easing: o.animateEasing || "swing", + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr) pr.css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self.propagate("animate", e); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize, cs = self.size; + + if (!pr) self.ghost = self.element.clone(); + else self.ghost = pr.clone(); + + self.ghost.css( + { opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 } + ) + .addClass('ui-resizable-ghost').addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize; + + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + + }, + + stop: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function(e, ui) { + var o = ui.options, self = $(this).data("resizable"), + + _store = function(exp) { + $(exp).each(function() { + $(this).data("resizable-alsoresize", { + width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), + left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object') { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function(e, ui){ + var o = ui.options, self = $(this).data("resizable"), os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function(exp, c) { + $(exp).each(function() { + var start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; + + $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + $(this).css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object') { + $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function(e, ui){ + $(this).removeData("resizable-alsoresize-start"); + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.selectable.js b/fannie/src/jquery-ui/development-bundle/ui/ui.selectable.js new file mode 100644 index 000000000..814e7d48e --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.selectable.js @@ -0,0 +1,264 @@ +/* + * jQuery UI Selectable + * + * Copyright (c) 2008 Richard D. Worth (rdworth.org) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.selectable", $.extend({}, $.ui.mouse, { + init: function() { + var self = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + var selectees; + this.refresh = function() { + selectees = $(self.options.filter, self.element[0]); + selectees.each(function() { + var $this = $(this); + var pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.width(), + bottom: pos.top + $this.height(), + startselected: false, + selected: $this.hasClass('ui-selected'), + selecting: $this.hasClass('ui-selecting'), + unselecting: $this.hasClass('ui-unselecting') + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this.mouseInit(); + + this.helper = $(document.createElement('div')).css({border:'1px dotted black'}); + }, + toggle: function() { + if(this.options.disabled){ + this.enable(); + } else { + this.disable(); + } + }, + destroy: function() { + this.element + .removeClass("ui-selectable ui-selectable-disabled") + .removeData("selectable") + .unbind(".selectable"); + this.mouseDestroy(); + }, + mouseStart: function(e) { + var self = this; + + this.opos = [e.pageX, e.pageY]; + + if (this.options.disabled) + return; + + var options = this.options; + + this.selectees = $(options.filter, this.element[0]); + + // selectable START callback + this.element.triggerHandler("selectablestart", [e, { + "selectable": this.element[0], + "options": options + }], options.start); + + $('body').append(this.helper); + // position helper (lasso) + this.helper.css({ + "z-index": 100, + "position": "absolute", + "left": e.clientX, + "top": e.clientY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter('.ui-selected').each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!e.ctrlKey) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self.element.triggerHandler("selectableunselecting", [e, { + selectable: self.element[0], + unselecting: selectee.element, + options: options + }], options.unselecting); + } + }); + + var isSelectee = false; + $(e.target).parents().andSelf().each(function() { + if($.data(this, "selectable-item")) isSelectee = true; + }); + return this.options.keyboard ? !isSelectee : true; + }, + mouseDrag: function(e) { + var self = this; + this.dragged = true; + + if (this.options.disabled) + return; + + var options = this.options; + + var x1 = this.opos[0], y1 = this.opos[1], x2 = e.pageX, y2 = e.pageY; + if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"); + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element == self.element[0]) + return; + var hit = false; + if (options.tolerance == 'touch') { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance == 'fit') { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass('ui-selecting'); + selectee.selecting = true; + // selectable SELECTING callback + self.element.triggerHandler("selectableselecting", [e, { + selectable: self.element[0], + selecting: selectee.element, + options: options + }], options.selecting); + } + } else { + // UNSELECT + if (selectee.selecting) { + if (e.ctrlKey && selectee.startselected) { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + selectee.$element.addClass('ui-selected'); + selectee.selected = true; + } else { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + self.element.triggerHandler("selectableunselecting", [e, { + selectable: self.element[0], + unselecting: selectee.element, + options: options + }], options.unselecting); + } + } + if (selectee.selected) { + if (!e.ctrlKey && !selectee.startselected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self.element.triggerHandler("selectableunselecting", [e, { + selectable: self.element[0], + unselecting: selectee.element, + options: options + }], options.unselecting); + } + } + } + }); + + return false; + }, + mouseStop: function(e) { + var self = this; + + this.dragged = false; + + var options = this.options; + + $('.ui-unselecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + selectee.startselected = false; + self.element.triggerHandler("selectableunselected", [e, { + selectable: self.element[0], + unselected: selectee.element, + options: options + }], options.unselected); + }); + $('.ui-selecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-selecting').addClass('ui-selected'); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + self.element.triggerHandler("selectableselected", [e, { + selectable: self.element[0], + selected: selectee.element, + options: options + }], options.selected); + }); + this.element.triggerHandler("selectablestop", [e, { + selectable: self.element[0], + options: this.options + }], this.options.stop); + + this.helper.remove(); + + return false; + } +})); + +$.extend($.ui.selectable, { + defaults: { + distance: 1, + delay: 0, + cancel: ":input", + appendTo: 'body', + autoRefresh: true, + filter: '*', + tolerance: 'touch' + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.slider.js b/fannie/src/jquery-ui/development-bundle/ui/ui.slider.js new file mode 100644 index 000000000..fc4cbd870 --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.slider.js @@ -0,0 +1,440 @@ +/* + * jQuery UI Slider + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * ui.core.js + */ +(function($) { + +$.fn.unwrap = $.fn.unwrap || function(expr) { + return this.each(function(){ + $(this).parents(expr).eq(0).after(this).remove(); + }); +}; + +$.widget("ui.slider", { + plugins: {}, + ui: function(e) { + return { + options: this.options, + handle: this.currentHandle, + value: this.options.axis != "both" || !this.options.axis ? Math.round(this.value(null,this.options.axis == "vertical" ? "y" : "x")) : { + x: Math.round(this.value(null,"x")), + y: Math.round(this.value(null,"y")) + }, + range: this.getRange() + }; + }, + propagate: function(n,e) { + $.ui.plugin.call(this, n, [e, this.ui()]); + this.element.triggerHandler(n == "slide" ? n : "slide"+n, [e, this.ui()], this.options[n]); + }, + destroy: function() { + + this.element + .removeClass("ui-slider ui-slider-disabled") + .removeData("slider") + .unbind(".slider"); + + if(this.handle && this.handle.length) { + this.handle + .unwrap("a"); + this.handle.each(function() { + $(this).data("mouse").mouseDestroy(); + }); + } + + this.generated && this.generated.remove(); + + }, + setData: function(key, value) { + $.widget.prototype.setData.apply(this, arguments); + if (/min|max|steps/.test(key)) { + this.initBoundaries(); + } + + if(key == "range") { + value ? this.handle.length == 2 && this.createRange() : this.removeRange(); + } + + }, + + init: function() { + + var self = this; + this.element.addClass("ui-slider"); + this.initBoundaries(); + + // Initialize mouse and key events for interaction + this.handle = $(this.options.handle, this.element); + if (!this.handle.length) { + self.handle = self.generated = $(self.options.handles || [0]).map(function() { + var handle = $("<div/>").addClass("ui-slider-handle").appendTo(self.element); + if (this.id) + handle.attr("id", this.id); + return handle[0]; + }); + } + + + var handleclass = function(el) { + this.element = $(el); + this.element.data("mouse", this); + this.options = self.options; + + this.element.bind("mousedown", function() { + if(self.currentHandle) this.blur(self.currentHandle); + self.focus(this,1); + }); + + this.mouseInit(); + }; + + $.extend(handleclass.prototype, $.ui.mouse, { + mouseStart: function(e) { return self.start.call(self, e, this.element[0]); }, + mouseStop: function(e) { return self.stop.call(self, e, this.element[0]); }, + mouseDrag: function(e) { return self.drag.call(self, e, this.element[0]); }, + mouseCapture: function() { return true; }, + trigger: function(e) { this.mouseDown(e); } + }); + + + $(this.handle) + .each(function() { + new handleclass(this); + }) + .wrap('<a href="javascript:void(0)" style="outline:none;border:none;"></a>') + .parent() + .bind('focus', function(e) { self.focus(this.firstChild); }) + .bind('blur', function(e) { self.blur(this.firstChild); }) + .bind('keydown', function(e) { if(!self.options.noKeyboard) self.keydown(e.keyCode, this.firstChild); }) + ; + + // Bind the click to the slider itself + this.element.bind('mousedown.slider', function(e) { + self.click.apply(self, [e]); + self.currentHandle.data("mouse").trigger(e); + self.firstValue = self.firstValue + 1; //This is for always triggering the change event + }); + + // Move the first handle to the startValue + $.each(this.options.handles || [], function(index, handle) { + self.moveTo(handle.start, index, true); + }); + if (!isNaN(this.options.startValue)) + this.moveTo(this.options.startValue, 0, true); + + this.previousHandle = $(this.handle[0]); //set the previous handle to the first to allow clicking before selecting the handle + if(this.handle.length == 2 && this.options.range) this.createRange(); + }, + initBoundaries: function() { + + var element = this.element[0], o = this.options; + this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() }; + + $.extend(o, { + axis: o.axis || (element.offsetWidth < element.offsetHeight ? 'vertical' : 'horizontal'), + max: !isNaN(parseInt(o.max,10)) ? { x: parseInt(o.max, 10), y: parseInt(o.max, 10) } : ({ x: o.max && o.max.x || 100, y: o.max && o.max.y || 100 }), + min: !isNaN(parseInt(o.min,10)) ? { x: parseInt(o.min, 10), y: parseInt(o.min, 10) } : ({ x: o.min && o.min.x || 0, y: o.min && o.min.y || 0 }) + }); + //Prepare the real maxValue + o.realMax = { + x: o.max.x - o.min.x, + y: o.max.y - o.min.y + }; + //Calculate stepping based on steps + o.stepping = { + x: o.stepping && o.stepping.x || parseInt(o.stepping, 10) || (o.steps ? o.realMax.x/(o.steps.x || parseInt(o.steps, 10) || o.realMax.x) : 0), + y: o.stepping && o.stepping.y || parseInt(o.stepping, 10) || (o.steps ? o.realMax.y/(o.steps.y || parseInt(o.steps, 10) || o.realMax.y) : 0) + }; + }, + + + keydown: function(keyCode, handle) { + if(/(37|38|39|40)/.test(keyCode)) { + this.moveTo({ + x: /(37|39)/.test(keyCode) ? (keyCode == 37 ? '-' : '+') + '=' + this.oneStep("x") : 0, + y: /(38|40)/.test(keyCode) ? (keyCode == 38 ? '-' : '+') + '=' + this.oneStep("y") : 0 + }, handle); + } + }, + focus: function(handle,hard) { + this.currentHandle = $(handle).addClass('ui-slider-handle-active'); + if (hard) + this.currentHandle.parent()[0].focus(); + }, + blur: function(handle) { + $(handle).removeClass('ui-slider-handle-active'); + if(this.currentHandle && this.currentHandle[0] == handle) { this.previousHandle = this.currentHandle; this.currentHandle = null; }; + }, + click: function(e) { + // This method is only used if: + // - The user didn't click a handle + // - The Slider is not disabled + // - There is a current, or previous selected handle (otherwise we wouldn't know which one to move) + + var pointer = [e.pageX,e.pageY]; + + var clickedHandle = false; + this.handle.each(function() { + if(this == e.target) + clickedHandle = true; + }); + if (clickedHandle || this.options.disabled || !(this.currentHandle || this.previousHandle)) + return; + + // If a previous handle was focussed, focus it again + if (!this.currentHandle && this.previousHandle) + this.focus(this.previousHandle, true); + + // propagate only for distance > 0, otherwise propagation is done my drag + this.offset = this.element.offset(); + + this.moveTo({ + y: this.convertValue(e.pageY - this.offset.top - this.currentHandle[0].offsetHeight/2, "y"), + x: this.convertValue(e.pageX - this.offset.left - this.currentHandle[0].offsetWidth/2, "x") + }, null, !this.options.distance); + }, + + + + createRange: function() { + if(this.rangeElement) return; + this.rangeElement = $('<div></div>') + .addClass('ui-slider-range') + .css({ position: 'absolute' }) + .appendTo(this.element); + this.updateRange(); + }, + removeRange: function() { + this.rangeElement.remove(); + this.rangeElement = null; + }, + updateRange: function() { + var prop = this.options.axis == "vertical" ? "top" : "left"; + var size = this.options.axis == "vertical" ? "height" : "width"; + this.rangeElement.css(prop, (parseInt($(this.handle[0]).css(prop),10) || 0) + this.handleSize(0, this.options.axis == "vertical" ? "y" : "x")/2); + this.rangeElement.css(size, (parseInt($(this.handle[1]).css(prop),10) || 0) - (parseInt($(this.handle[0]).css(prop),10) || 0)); + }, + getRange: function() { + return this.rangeElement ? this.convertValue(parseInt(this.rangeElement.css(this.options.axis == "vertical" ? "height" : "width"),10), this.options.axis == "vertical" ? "y" : "x") : null; + }, + + handleIndex: function() { + return this.handle.index(this.currentHandle[0]); + }, + value: function(handle, axis) { + if(this.handle.length == 1) this.currentHandle = this.handle; + if(!axis) axis = this.options.axis == "vertical" ? "y" : "x"; + + var curHandle = $(handle != undefined && handle !== null ? this.handle[handle] || handle : this.currentHandle); + + if(curHandle.data("mouse").sliderValue) { + return parseInt(curHandle.data("mouse").sliderValue[axis],10); + } else { + return parseInt(((parseInt(curHandle.css(axis == "x" ? "left" : "top"),10) / (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(handle,axis))) * this.options.realMax[axis]) + this.options.min[axis],10); + } + + }, + convertValue: function(value,axis) { + return this.options.min[axis] + (value / (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis))) * this.options.realMax[axis]; + }, + + translateValue: function(value,axis) { + return ((value - this.options.min[axis]) / this.options.realMax[axis]) * (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis)); + }, + translateRange: function(value,axis) { + if (this.rangeElement) { + if (this.currentHandle[0] == this.handle[0] && value >= this.translateValue(this.value(1),axis)) + value = this.translateValue(this.value(1,axis) - this.oneStep(axis), axis); + if (this.currentHandle[0] == this.handle[1] && value <= this.translateValue(this.value(0),axis)) + value = this.translateValue(this.value(0,axis) + this.oneStep(axis), axis); + } + if (this.options.handles) { + var handle = this.options.handles[this.handleIndex()]; + if (value < this.translateValue(handle.min,axis)) { + value = this.translateValue(handle.min,axis); + } else if (value > this.translateValue(handle.max,axis)) { + value = this.translateValue(handle.max,axis); + } + } + return value; + }, + translateLimits: function(value,axis) { + if (value >= this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis)) + value = this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis); + if (value <= 0) + value = 0; + return value; + }, + handleSize: function(handle,axis) { + return $(handle != undefined && handle !== null ? this.handle[handle] : this.currentHandle)[0]["offset"+(axis == "x" ? "Width" : "Height")]; + }, + oneStep: function(axis) { + return this.options.stepping[axis] || 1; + }, + + + start: function(e, handle) { + + var o = this.options; + if(o.disabled) return false; + + // Prepare the outer size + this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() }; + + // This is a especially ugly fix for strange blur events happening on mousemove events + if (!this.currentHandle) + this.focus(this.previousHandle, true); + + this.offset = this.element.offset(); + + this.handleOffset = this.currentHandle.offset(); + this.clickOffset = { top: e.pageY - this.handleOffset.top, left: e.pageX - this.handleOffset.left }; + + this.firstValue = this.value(); + + this.propagate('start', e); + this.drag(e, handle); + return true; + + }, + stop: function(e) { + this.propagate('stop', e); + if (this.firstValue != this.value()) + this.propagate('change', e); + // This is a especially ugly fix for strange blur events happening on mousemove events + this.focus(this.currentHandle, true); + return false; + }, + drag: function(e, handle) { + + var o = this.options; + var position = { top: e.pageY - this.offset.top - this.clickOffset.top, left: e.pageX - this.offset.left - this.clickOffset.left}; + if(!this.currentHandle) this.focus(this.previousHandle, true); //This is a especially ugly fix for strange blur events happening on mousemove events + + position.left = this.translateLimits(position.left, "x"); + position.top = this.translateLimits(position.top, "y"); + + if (o.stepping.x) { + var value = this.convertValue(position.left, "x"); + value = Math.round(value / o.stepping.x) * o.stepping.x; + position.left = this.translateValue(value, "x"); + } + if (o.stepping.y) { + var value = this.convertValue(position.top, "y"); + value = Math.round(value / o.stepping.y) * o.stepping.y; + position.top = this.translateValue(value, "y"); + } + + position.left = this.translateRange(position.left, "x"); + position.top = this.translateRange(position.top, "y"); + + if(o.axis != "vertical") this.currentHandle.css({ left: position.left }); + if(o.axis != "horizontal") this.currentHandle.css({ top: position.top }); + + //Store the slider's value + this.currentHandle.data("mouse").sliderValue = { + x: Math.round(this.convertValue(position.left, "x")) || 0, + y: Math.round(this.convertValue(position.top, "y")) || 0 + }; + + if (this.rangeElement) + this.updateRange(); + this.propagate('slide', e); + return false; + }, + + moveTo: function(value, handle, noPropagation) { + + var o = this.options; + + // Prepare the outer size + this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() }; + + //If no handle has been passed, no current handle is available and we have multiple handles, return false + if (handle == undefined && !this.currentHandle && this.handle.length != 1) + return false; + + //If only one handle is available, use it + if (handle == undefined && !this.currentHandle) + handle = 0; + + if (handle != undefined) + this.currentHandle = this.previousHandle = $(this.handle[handle] || handle); + + + if(value.x !== undefined && value.y !== undefined) { + var x = value.x, y = value.y; + } else { + var x = value, y = value; + } + + if(x !== undefined && x.constructor != Number) { + var me = /^\-\=/.test(x), pe = /^\+\=/.test(x); + if(me || pe) { + x = this.value(null, "x") + parseInt(x.replace(me ? '=' : '+=', ''), 10); + } else { + x = isNaN(parseInt(x, 10)) ? undefined : parseInt(x, 10); + } + } + + if(y !== undefined && y.constructor != Number) { + var me = /^\-\=/.test(y), pe = /^\+\=/.test(y); + if(me || pe) { + y = this.value(null, "y") + parseInt(y.replace(me ? '=' : '+=', ''), 10); + } else { + y = isNaN(parseInt(y, 10)) ? undefined : parseInt(y, 10); + } + } + + if(o.axis != "vertical" && x !== undefined) { + if(o.stepping.x) x = Math.round(x / o.stepping.x) * o.stepping.x; + x = this.translateValue(x, "x"); + x = this.translateLimits(x, "x"); + x = this.translateRange(x, "x"); + + o.animate ? this.currentHandle.stop().animate({ left: x }, (Math.abs(parseInt(this.currentHandle.css("left")) - x)) * (!isNaN(parseInt(o.animate)) ? o.animate : 5)) : this.currentHandle.css({ left: x }); + } + + if(o.axis != "horizontal" && y !== undefined) { + if(o.stepping.y) y = Math.round(y / o.stepping.y) * o.stepping.y; + y = this.translateValue(y, "y"); + y = this.translateLimits(y, "y"); + y = this.translateRange(y, "y"); + o.animate ? this.currentHandle.stop().animate({ top: y }, (Math.abs(parseInt(this.currentHandle.css("top")) - y)) * (!isNaN(parseInt(o.animate)) ? o.animate : 5)) : this.currentHandle.css({ top: y }); + } + + if (this.rangeElement) + this.updateRange(); + + //Store the slider's value + this.currentHandle.data("mouse").sliderValue = { + x: Math.round(this.convertValue(x, "x")) || 0, + y: Math.round(this.convertValue(y, "y")) || 0 + }; + + if (!noPropagation) { + this.propagate('start', null); + this.propagate('stop', null); + this.propagate('change', null); + this.propagate("slide", null); + } + } +}); + +$.ui.slider.getter = "value"; + +$.ui.slider.defaults = { + handle: ".ui-slider-handle", + distance: 1, + animate: false +}; + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.sortable.js b/fannie/src/jquery-ui/development-bundle/ui/ui.sortable.js new file mode 100644 index 000000000..6d33bf98c --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.sortable.js @@ -0,0 +1,743 @@ +/* + * jQuery UI Sortable + * + * Copyright (c) 2008 Paul Bakaus + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * ui.core.js + */ +(function($) { + +function contains(a, b) { + var safari2 = $.browser.safari && $.browser.version < 522; + if (a.contains && !safari2) { + return a.contains(b); + } + if (a.compareDocumentPosition) + return !!(a.compareDocumentPosition(b) & 16); + while (b = b.parentNode) + if (b == a) return true; + return false; +}; + +$.widget("ui.sortable", $.extend({}, $.ui.mouse, { + init: function() { + + var o = this.options; + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine if the items are floating + this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false; + + //Let's determine the parent's offset + if(!(/(relative|absolute|fixed)/).test(this.element.css('position'))) this.element.css('position', 'relative'); + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this.mouseInit(); + + }, + plugins: {}, + ui: function(inst) { + return { + helper: (inst || this)["helper"], + placeholder: (inst || this)["placeholder"] || $([]), + position: (inst || this)["position"], + absolutePosition: (inst || this)["positionAbs"], + options: this.options, + element: this.element, + item: (inst || this)["currentItem"], + sender: inst ? inst.element : null + }; + }, + propagate: function(n,e,inst, noPropagation) { + $.ui.plugin.call(this, n, [e, this.ui(inst)]); + if(!noPropagation) this.element.triggerHandler(n == "sort" ? n : "sort"+n, [e, this.ui(inst)], this.options[n]); + }, + serialize: function(o) { + + var items = ($.isFunction(this.options.items) ? this.options.items.call(this.element) : $(this.options.items, this.element)).not('.ui-sortable-helper'); //Only the items of the sortable itself + var str = []; o = o || {}; + + items.each(function() { + var res = ($(this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/)); + if(res) str.push((o.key || res[1])+'[]='+(o.key && o.expression ? res[1] : res[2])); + }); + + return str.join('&'); + + }, + toArray: function(attr) { + + var items = ($.isFunction(this.options.items) ? this.options.items.call(this.element) : $(this.options.items, this.element)).not('.ui-sortable-helper'); //Only the items of the sortable itself + var ret = []; + + items.each(function() { ret.push($(this).attr(attr || 'id')); }); + return ret; + + }, + /* Be careful with the following core functions */ + intersectsWith: function(item) { + + var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height; + var l = item.left, r = l + item.width, + t = item.top, b = t + item.height; + + if(this.options.tolerance == "pointer" || this.options.forcePointerForContainers || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) { + return (y1 + this.offset.click.top > t && y1 + this.offset.click.top < b && x1 + this.offset.click.left > l && x1 + this.offset.click.left < r); + } else { + + return (l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + + }, + intersectsWithEdge: function(item) { + var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height; + var l = item.left, r = l + item.width, + t = item.top, b = t + item.height; + + if(this.options.tolerance == "pointer" || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) { + + if(!(y1 + this.offset.click.top > t && y1 + this.offset.click.top < b && x1 + this.offset.click.left > l && x1 + this.offset.click.left < r)) return false; + + if(this.floating) { + if(x1 + this.offset.click.left > l && x1 + this.offset.click.left < l + item.width/2) return 2; + if(x1 + this.offset.click.left > l+item.width/2 && x1 + this.offset.click.left < r) return 1; + } else { + if(y1 + this.offset.click.top > t && y1 + this.offset.click.top < t + item.height/2) return 2; + if(y1 + this.offset.click.top > t+item.height/2 && y1 + this.offset.click.top < b) return 1; + } + + } else { + + if (!(l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b )) return false; // Top Half + + if(this.floating) { + if(x2 > l && x1 < l) return 2; //Crosses left edge + if(x1 < r && x2 > r) return 1; //Crosses right edge + } else { + if(y2 > t && y1 < t) return 1; //Crosses top edge + if(y1 < b && y2 > b) return 2; //Crosses bottom edge + } + + } + + return false; + + }, + refresh: function() { + this.refreshItems(); + this.refreshPositions(); + }, + refreshItems: function() { + + this.items = []; + this.containers = [this]; + var items = this.items; + var self = this; + var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element), this]]; + + if(this.options.connectWith) { + for (var i = this.options.connectWith.length - 1; i >= 0; i--){ + var cur = $(this.options.connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + }; + }; + } + + for (var i = queries.length - 1; i >= 0; i--){ + queries[i][0].each(function() { + $.data(this, 'sortable-item', queries[i][1]); // Data for target checking (mouse manager) + items.push({ + item: $(this), + instance: queries[i][1], + width: 0, height: 0, + left: 0, top: 0 + }); + }); + }; + + }, + refreshPositions: function(fast) { + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent) { + var po = this.offsetParent.offset(); + this.offset.parent = { top: po.top + this.offsetParentBorders.top, left: po.left + this.offsetParentBorders.left }; + } + + for (var i = this.items.length - 1; i >= 0; i--){ + + //We ignore calculating positions of all connected containers when we're not over them + if(this.items[i].instance != this.currentContainer && this.currentContainer && this.items[i].item[0] != this.currentItem[0]) + continue; + + var t = this.options.toleranceElement ? $(this.options.toleranceElement, this.items[i].item) : this.items[i].item; + + if(!fast) { + this.items[i].width = t[0].offsetWidth; + this.items[i].height = t[0].offsetHeight; + } + + var p = t.offset(); + this.items[i].left = p.left; + this.items[i].top = p.top; + + }; + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (var i = this.containers.length - 1; i >= 0; i--){ + var p =this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + }; + } + + }, + destroy: function() { + this.element + .removeClass("ui-sortable ui-sortable-disabled") + .removeData("sortable") + .unbind(".sortable"); + this.mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) + this.items[i].item.removeData("sortable-item"); + }, + createPlaceholder: function(that) { + + var self = that || this, o = self.options; + + if(o.placeholder.constructor == String) { + var className = o.placeholder; + o.placeholder = { + element: function() { + return $('<div></div>').addClass(className)[0]; + }, + update: function(i, p) { + p.css(i.offset()).css({ width: i.outerWidth(), height: i.outerHeight() }); + } + }; + } + + self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)).appendTo('body').css({ position: 'absolute' }); + o.placeholder.update.call(self.element, self.currentItem, self.placeholder); + }, + contactContainers: function(e) { + for (var i = this.containers.length - 1; i >= 0; i--){ + + if(this.intersectsWith(this.containers[i].containerCache)) { + if(!this.containers[i].containerCache.over) { + + + if(this.currentContainer != this.containers[i]) { + + //When entering a new container, we will find the item with the least distance and append our item near it + var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top']; + for (var j = this.items.length - 1; j >= 0; j--) { + if(!contains(this.containers[i].element[0], this.items[j].item[0])) continue; + var cur = this.items[j][this.containers[i].floating ? 'left' : 'top']; + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + } + } + + if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled + continue; + + //We also need to exchange the placeholder + if(this.placeholder) this.placeholder.remove(); + if(this.containers[i].options.placeholder) { + this.containers[i].createPlaceholder(this); + } else { + this.placeholder = null;; + } + + this.currentContainer = this.containers[i]; + itemWithLeastDistance ? this.rearrange(e, itemWithLeastDistance, null, true) : this.rearrange(e, null, this.containers[i].element, true); + this.propagate("change", e); //Call plugins and callbacks + this.containers[i].propagate("change", e, this); //Call plugins and callbacks + + } + + this.containers[i].propagate("over", e, this); + this.containers[i].containerCache.over = 1; + } + } else { + if(this.containers[i].containerCache.over) { + this.containers[i].propagate("out", e, this); + this.containers[i].containerCache.over = 0; + } + } + + }; + }, + mouseCapture: function(e, overrideHandle) { + + if(this.options.disabled || this.options.type == 'static') return false; + + //We have to refresh the items data once first + this.refreshItems(); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + var currentItem = null, self = this, nodes = $(e.target).parents().each(function() { + if($.data(this, 'sortable-item') == self) { + currentItem = $(this); + return false; + } + }); + if($.data(e.target, 'sortable-item') == self) currentItem = $(e.target); + + if(!currentItem) return false; + if(this.options.handle && !overrideHandle) { + var validHandle = false; + + $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == e.target) validHandle = true; }); + if(!validHandle) return false; + } + + this.currentItem = currentItem; + return true; + + }, + mouseStart: function(e, overrideHandle, noActivation) { + + var o = this.options; + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = typeof o.helper == 'function' ? $(o.helper.apply(this.element[0], [e, this.currentItem])) : this.currentItem.clone(); + if (!this.helper.parents('body').length) $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(this.helper[0]); //Add the helper to the DOM if that didn't happen already + this.helper.css({ position: 'absolute', clear: 'both' }).addClass('ui-sortable-helper'); //Position it absolutely and add a helper class + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + this.margins = { //Cache the margins + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + + this.offset = this.currentItem.offset(); //The element's absolute position on the page + this.offset = { //Substract the margins from the element's absolute offset + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + this.offset.click = { //Where the click happened, relative to the element + left: e.pageX - this.offset.left, + top: e.pageY - this.offset.top + }; + + this.offsetParent = this.helper.offsetParent(); //Get the offsetParent and cache its position + var po = this.offsetParent.offset(); + + this.offsetParentBorders = { + top: (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + this.offset.parent = { //Store its position plus border + top: po.top + this.offsetParentBorders.top, + left: po.left + this.offsetParentBorders.left + }; + + this.originalPosition = this.generatePosition(e); //Generate the original position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; //Cache the former DOM position + + //If o.placeholder is used, create a new element at the given position with the class + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size + if(o.placeholder) this.createPlaceholder(); + + //Call plugins and callbacks + this.propagate("start", e); + this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Recache the helper size + + if(o.cursorAt) { + if(o.cursorAt.left != undefined) this.offset.click.left = o.cursorAt.left; + if(o.cursorAt.right != undefined) this.offset.click.left = this.helperProportions.width - o.cursorAt.right; + if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top; + if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom; + } + + /* + * - Position constraining - + * Here we prepare position constraining like grid and containment. + */ + + if(o.containment) { + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.parent.left, + 0 - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.parent.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.parent.top, + co.left+Math.max(ce.scrollWidth,ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.currentItem.css("marginRight"),10) || 0), + co.top+Math.max(ce.scrollHeight,ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.currentItem.css("marginBottom"),10) || 0) + ]; + } + } + + //Set the original element visibility to hidden to still fill out the white space + if(this.options.placeholder != 'clone') + this.currentItem.css('visibility', 'hidden'); + + //Post 'activate' events to possible containers + if(!noActivation) { + for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i].propagate("activate", e, this); } + } + + //Prepare possible droppables + if($.ui.ddmanager) $.ui.ddmanager.current = this; + if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e); + + this.dragging = true; + + this.mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + + }, + convertPositionTo: function(d, pos) { + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + return { + top: ( + pos.top // the calculated relative position + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) * mod // The offsetParent's scroll position + + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods) + ), + left: ( + pos.left // the calculated relative position + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft) * mod // The offsetParent's scroll position + + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods) + ) + }; + }, + generatePosition: function(e) { + + var o = this.options; + var position = { + top: ( + e.pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) // The offsetParent's scroll position, not if the element is fixed + ), + left: ( + e.pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft) // The offsetParent's scroll position, not if the element is fixed + ) + }; + + if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + if(this.containment) { + if(position.left < this.containment[0]) position.left = this.containment[0]; + if(position.top < this.containment[1]) position.top = this.containment[1]; + if(position.left > this.containment[2]) position.left = this.containment[2]; + if(position.top > this.containment[3]) position.top = this.containment[3]; + } + + if(o.grid) { + var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1]; + position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0]; + position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + return position; + }, + mouseDrag: function(e) { + + //Compute the helpers position + this.position = this.generatePosition(e); + this.positionAbs = this.convertPositionTo("absolute"); + + //Call the internal plugins + $.ui.plugin.call(this, "sort", [e, this.ui()]); + + //Regenerate the absolute position used for position checks + this.positionAbs = this.convertPositionTo("absolute"); + + //Set the helper's position + this.helper[0].style.left = this.position.left+'px'; + this.helper[0].style.top = this.position.top+'px'; + + //Rearrange + for (var i = this.items.length - 1; i >= 0; i--) { + var intersection = this.intersectsWithEdge(this.items[i]); + if(!intersection) continue; + + if(this.items[i].item[0] != this.currentItem[0] //cannot intersect with itself + && this.currentItem[intersection == 1 ? "next" : "prev"]()[0] != this.items[i].item[0] //no useless actions that have been done before + && !contains(this.currentItem[0], this.items[i].item[0]) //no action if the item moved is the parent of the item checked + && (this.options.type == 'semi-dynamic' ? !contains(this.element[0], this.items[i].item[0]) : true) + ) { + + this.direction = intersection == 1 ? "down" : "up"; + this.rearrange(e, this.items[i]); + this.propagate("change", e); //Call plugins and callbacks + break; + } + } + + //Post events to containers + this.contactContainers(e); + + //Interconnect with droppables + if($.ui.ddmanager) $.ui.ddmanager.drag(this, e); + + //Call callbacks + this.element.triggerHandler("sort", [e, this.ui()], this.options["sort"]); + + return false; + + }, + rearrange: function(e, i, a, hardRefresh) { + a ? a[0].appendChild(this.currentItem[0]) : i.item[0].parentNode.insertBefore(this.currentItem[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var self = this, counter = this.counter; + + window.setTimeout(function() { + if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + },0); + + if(this.options.placeholder) + this.options.placeholder.update.call(this.element, this.currentItem, this.placeholder); + }, + mouseStop: function(e, noPropagation) { + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) + $.ui.ddmanager.drop(this, e); + + if(this.options.revert) { + var self = this; + var cur = self.currentItem.offset(); + + //Also animate the placeholder if we have one + if(self.placeholder) self.placeholder.animate({ opacity: 'hide' }, (parseInt(this.options.revert, 10) || 500)-50); + + $(this.helper).animate({ + left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), + top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) + }, parseInt(this.options.revert, 10) || 500, function() { + self.clear(e); + }); + } else { + this.clear(e, noPropagation); + } + + return false; + + }, + clear: function(e, noPropagation) { + + if(this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) this.propagate("update", e, null, noPropagation); //Trigger update callback if the DOM position has changed + if(!contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element + this.propagate("remove", e, null, noPropagation); + for (var i = this.containers.length - 1; i >= 0; i--){ + if(contains(this.containers[i].element[0], this.currentItem[0])) { + this.containers[i].propagate("update", e, this, noPropagation); + this.containers[i].propagate("receive", e, this, noPropagation); + } + }; + }; + + //Post events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i].propagate("deactivate", e, this, noPropagation); + if(this.containers[i].containerCache.over) { + this.containers[i].propagate("out", e, this); + this.containers[i].containerCache.over = 0; + } + } + + this.dragging = false; + if(this.cancelHelperRemoval) { + this.propagate("stop", e, null, noPropagation); + return false; + } + + $(this.currentItem).css('visibility', ''); + if(this.placeholder) this.placeholder.remove(); + this.helper.remove(); this.helper = null; + this.propagate("stop", e, null, noPropagation); + + return true; + + } +})); + +$.extend($.ui.sortable, { + getter: "serialize toArray", + defaults: { + helper: "clone", + tolerance: "guess", + distance: 1, + delay: 0, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + cancel: ":input", + items: '> *', + zIndex: 1000, + dropOnEmpty: true, + appendTo: "parent" + } +}); + +/* + * Sortable Extensions + */ + +$.ui.plugin.add("sortable", "cursor", { + start: function(e, ui) { + var t = $('body'); + if (t.css("cursor")) ui.options._cursor = t.css("cursor"); + t.css("cursor", ui.options.cursor); + }, + stop: function(e, ui) { + if (ui.options._cursor) $('body').css("cursor", ui.options._cursor); + } +}); + +$.ui.plugin.add("sortable", "zIndex", { + start: function(e, ui) { + var t = ui.helper; + if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex"); + t.css('zIndex', ui.options.zIndex); + }, + stop: function(e, ui) { + if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex); + } +}); + +$.ui.plugin.add("sortable", "opacity", { + start: function(e, ui) { + var t = ui.helper; + if(t.css("opacity")) ui.options._opacity = t.css("opacity"); + t.css('opacity', ui.options.opacity); + }, + stop: function(e, ui) { + if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity); + } +}); + +$.ui.plugin.add("sortable", "scroll", { + start: function(e, ui) { + var o = ui.options; + var i = $(this).data("sortable"); + + i.overflowY = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(i.currentItem); + i.overflowX = function(el) { + do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode); + return $(document); + }(i.currentItem); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') i.overflowYOffset = i.overflowY.offset(); + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') i.overflowXOffset = i.overflowX.offset(); + + }, + sort: function(e, ui) { + + var o = ui.options; + var i = $(this).data("sortable"); + + if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') { + if((i.overflowYOffset.top + i.overflowY[0].offsetHeight) - e.pageY < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed; + if(e.pageY - i.overflowYOffset.top < o.scrollSensitivity) + i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed; + } else { + if(e.pageY - $(document).scrollTop() < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity) + $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') { + if((i.overflowXOffset.left + i.overflowX[0].offsetWidth) - e.pageX < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed; + if(e.pageX - i.overflowXOffset.left < o.scrollSensitivity) + i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed; + } else { + if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } +}); + +$.ui.plugin.add("sortable", "axis", { + sort: function(e, ui) { + + var i = $(this).data("sortable"); + + if(ui.options.axis == "y") i.position.left = i.originalPosition.left; + if(ui.options.axis == "x") i.position.top = i.originalPosition.top; + + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/ui/ui.tabs.js b/fannie/src/jquery-ui/development-bundle/ui/ui.tabs.js new file mode 100644 index 000000000..a7099d0be --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/ui/ui.tabs.js @@ -0,0 +1,599 @@ +/* + * jQuery UI Tabs + * + * Copyright (c) 2007, 2008 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.tabs", { + init: function() { + this.options.event += '.tabs'; // namespace event + + // create tabs + this.tabify(true); + }, + setData: function(key, value) { + if ((/^selected/).test(key)) + this.select(value); + else { + this.options[key] = value; + this.tabify(); + } + }, + length: function() { + return this.$tabs.length; + }, + tabId: function(a) { + return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') + || this.options.idPrefix + $.data(a); + }, + ui: function(tab, panel) { + return { + options: this.options, + tab: tab, + panel: panel, + index: this.$tabs.index(tab) + }; + }, + tabify: function(init) { + + this.$lis = $('li:has(a[href])', this.element); + this.$tabs = this.$lis.map(function() { return $('a', this)[0]; }); + this.$panels = $([]); + + var self = this, o = this.options; + + this.$tabs.each(function(i, a) { + // inline tab + if (a.hash && a.hash.replace('#', '')) // Safari 2 reports '#' for an empty hash + self.$panels = self.$panels.add(a.hash); + // remote tab + else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#" + $.data(a, 'href.tabs', a.href); // required for restore on destroy + $.data(a, 'load.tabs', a.href); // mutable + var id = self.tabId(a); + a.href = '#' + id; + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id).addClass(o.panelClass) + .insertAfter( self.$panels[i - 1] || self.element ); + $panel.data('destroy.tabs', true); + } + self.$panels = self.$panels.add( $panel ); + } + // invalid tab href + else + o.disabled.push(i + 1); + }); + + if (init) { + + // attach necessary classes for styling if not present + this.element.addClass(o.navClass); + this.$panels.each(function() { + var $this = $(this); + $this.addClass(o.panelClass); + }); + + // Selected tab + // use "selected" option or try to retrieve: + // 1. from fragment identifier in url + // 2. from cookie + // 3. from selected class attribute on <li> + if (o.selected === undefined) { + if (location.hash) { + this.$tabs.each(function(i, a) { + if (a.hash == location.hash) { + o.selected = i; + // prevent page scroll to fragment + if ($.browser.msie || $.browser.opera) { // && !o.remote + var $toShow = $(location.hash), toShowId = $toShow.attr('id'); + $toShow.attr('id', ''); + setTimeout(function() { + $toShow.attr('id', toShowId); // restore id + }, 500); + } + scrollTo(0, 0); + return false; // break + } + }); + } + else if (o.cookie) { + var index = parseInt($.cookie('ui-tabs' + $.data(self.element)),10); + if (index && self.$tabs[index]) + o.selected = index; + } + else if (self.$lis.filter('.' + o.selectedClass).length) + o.selected = self.$lis.index( self.$lis.filter('.' + o.selectedClass)[0] ); + } + o.selected = o.selected === null || o.selected !== undefined ? o.selected : 0; // first tab selected by default + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + // A selected tab cannot become disabled. + o.disabled = $.unique(o.disabled.concat( + $.map(this.$lis.filter('.' + o.disabledClass), + function(n, i) { return self.$lis.index(n); } ) + )).sort(); + if ($.inArray(o.selected, o.disabled) != -1) + o.disabled.splice($.inArray(o.selected, o.disabled), 1); + + // highlight selected tab + this.$panels.addClass(o.hideClass); + this.$lis.removeClass(o.selectedClass); + if (o.selected !== null) { + this.$panels.eq(o.selected).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before + this.$lis.eq(o.selected).addClass(o.selectedClass); + + // seems to be expected behavior that the show callback is fired + var onShow = function() { + $(self.element).triggerHandler('tabsshow', + [self.fakeEvent('tabsshow'), self.ui(self.$tabs[o.selected], self.$panels[o.selected])], o.show); + }; + + // load if remote tab + if ($.data(this.$tabs[o.selected], 'load.tabs')) + this.load(o.selected, onShow); + // just trigger show event + else + onShow(); + + } + + // clean up to avoid memory leaks in certain versions of IE 6 + $(window).bind('unload', function() { + self.$tabs.unbind('.tabs'); + self.$lis = self.$tabs = self.$panels = null; + }); + + } + + // disable tabs + for (var i = 0, li; li = this.$lis[i]; i++) + $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass); + + // reset cache if switching from cached to not cached + if (o.cache === false) + this.$tabs.removeData('cache.tabs'); + + // set up animations + var hideFx, showFx, baseFx = { 'min-width': 0, duration: 1 }, baseDuration = 'normal'; + if (o.fx && o.fx.constructor == Array) + hideFx = o.fx[0] || baseFx, showFx = o.fx[1] || baseFx; + else + hideFx = showFx = o.fx || baseFx; + + // reset some styles to maintain print style sheets etc. + var resetCSS = { display: '', overflow: '', height: '' }; + if (!$.browser.msie) // not in IE to prevent ClearType font issue + resetCSS.opacity = ''; + + // Hide a tab, animation prevents browser scrolling to fragment, + // $show is optional. + function hideTab(clicked, $hide, $show) { + $hide.animate(hideFx, hideFx.duration || baseDuration, function() { // + $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie && hideFx.opacity) + $hide[0].style.filter = ''; + if ($show) + showTab(clicked, $show, $hide); + }); + } + + // Show a tab, animation prevents browser scrolling to fragment, + // $hide is optional. + function showTab(clicked, $show, $hide) { + if (showFx === baseFx) + $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels + $show.animate(showFx, showFx.duration || baseDuration, function() { + $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie && showFx.opacity) + $show[0].style.filter = ''; + + // callback + $(self.element).triggerHandler('tabsshow', + [self.fakeEvent('tabsshow'), self.ui(clicked, $show[0])], o.show); + + }); + } + + // switch a tab + function switchTab(clicked, $li, $hide, $show) { + /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click + $.ajaxHistory.update(clicked.hash); + }*/ + $li.addClass(o.selectedClass) + .siblings().removeClass(o.selectedClass); + hideTab(clicked, $hide, $show); + } + + // attach tab event handler, unbind to avoid duplicates from former tabifying... + this.$tabs.unbind('.tabs').bind(o.event, function() { + + //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click + var $li = $(this).parents('li:eq(0)'), + $hide = self.$panels.filter(':visible'), + $show = $(this.hash); + + // If tab is already selected and not unselectable or tab disabled or + // or is already loading or click callback returns false stop here. + // Check if click handler returns false last so that it is not executed + // for a disabled or loading tab! + if (($li.hasClass(o.selectedClass) && !o.unselect) + || $li.hasClass(o.disabledClass) + || $(this).hasClass(o.loadingClass) + || $(self.element).triggerHandler('tabsselect', [self.fakeEvent('tabsselect'), self.ui(this, $show[0])], o.select) === false + ) { + this.blur(); + return false; + } + + self.options.selected = self.$tabs.index(this); + + // if tab may be closed + if (o.unselect) { + if ($li.hasClass(o.selectedClass)) { + self.options.selected = null; + $li.removeClass(o.selectedClass); + self.$panels.stop(); + hideTab(this, $hide); + this.blur(); + return false; + } else if (!$hide.length) { + self.$panels.stop(); + var a = this; + self.load(self.$tabs.index(this), function() { + $li.addClass(o.selectedClass).addClass(o.unselectClass); + showTab(a, $show); + }); + this.blur(); + return false; + } + } + + if (o.cookie) + $.cookie('ui-tabs' + $.data(self.element), self.options.selected, o.cookie); + + // stop possibly running animations + self.$panels.stop(); + + // show new tab + if ($show.length) { + + // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled + /*if ($.browser.msie && o.bookmarkable) { + var showId = this.hash.replace('#', ''); + $show.attr('id', ''); + setTimeout(function() { + $show.attr('id', showId); // restore id + }, 0); + }*/ + + var a = this; + self.load(self.$tabs.index(this), $hide.length ? + function() { + switchTab(a, $li, $hide, $show); + } : + function() { + $li.addClass(o.selectedClass); + showTab(a, $show); + } + ); + + // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash + /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0; + setTimeout(function() { + scrollTo(scrollX, scrollY); + }, 0);*/ + + } else + throw 'jQuery UI Tabs: Mismatching fragment identifier.'; + + // Prevent IE from keeping other link focussed when using the back button + // and remove dotted border from clicked link. This is controlled in modern + // browsers via CSS, also blur removes focus from address bar in Firefox + // which can become a usability and annoying problem with tabsRotate. + if ($.browser.msie) + this.blur(); + + //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE + return false; + + }); + + // disable click if event is configured to something else + if (!(/^click/).test(o.event)) + this.$tabs.bind('click.tabs', function() { return false; }); + + }, + add: function(url, label, index) { + if (index == undefined) + index = this.$tabs.length; // append by default + + var o = this.options; + var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)); + $li.data('destroy.tabs', true); + + var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] ); + + // try to find an existing element before creating a new one + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id) + .addClass(o.hideClass) + .data('destroy.tabs', true); + } + $panel.addClass(o.panelClass); + if (index >= this.$lis.length) { + $li.appendTo(this.element); + $panel.appendTo(this.element[0].parentNode); + } else { + $li.insertBefore(this.$lis[index]); + $panel.insertBefore(this.$panels[index]); + } + + o.disabled = $.map(o.disabled, + function(n, i) { return n >= index ? ++n : n }); + + this.tabify(); + + if (this.$tabs.length == 1) { + $li.addClass(o.selectedClass); + $panel.removeClass(o.hideClass); + var href = $.data(this.$tabs[0], 'load.tabs'); + if (href) + this.load(index, href); + } + + // callback + this.element.triggerHandler('tabsadd', + [this.fakeEvent('tabsadd'), this.ui(this.$tabs[index], this.$panels[index])], o.add + ); + }, + remove: function(index) { + var o = this.options, $li = this.$lis.eq(index).remove(), + $panel = this.$panels.eq(index).remove(); + + // If selected tab was removed focus tab to the right or + // in case the last tab was removed the tab to the left. + if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) + this.select(index + (index + 1 < this.$tabs.length ? 1 : -1)); + + o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), + function(n, i) { return n >= index ? --n : n }); + + this.tabify(); + + // callback + this.element.triggerHandler('tabsremove', + [this.fakeEvent('tabsremove'), this.ui($li.find('a')[0], $panel[0])], o.remove + ); + }, + enable: function(index) { + var o = this.options; + if ($.inArray(index, o.disabled) == -1) + return; + + var $li = this.$lis.eq(index).removeClass(o.disabledClass); + if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2... + $li.css('display', 'inline-block'); + setTimeout(function() { + $li.css('display', 'block'); + }, 0); + } + + o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); + + // callback + this.element.triggerHandler('tabsenable', + [this.fakeEvent('tabsenable'), this.ui(this.$tabs[index], this.$panels[index])], o.enable + ); + + }, + disable: function(index) { + var self = this, o = this.options; + if (index != o.selected) { // cannot disable already selected tab + this.$lis.eq(index).addClass(o.disabledClass); + + o.disabled.push(index); + o.disabled.sort(); + + // callback + this.element.triggerHandler('tabsdisable', + [this.fakeEvent('tabsdisable'), this.ui(this.$tabs[index], this.$panels[index])], o.disable + ); + } + }, + select: function(index) { + if (typeof index == 'string') + index = this.$tabs.index( this.$tabs.filter('[href$=' + index + ']')[0] ); + this.$tabs.eq(index).trigger(this.options.event); + }, + load: function(index, callback) { // callback is for internal usage only + + var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0], + bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs'); + + callback = callback || function() {}; + + // no remote or from cache - just finish with callback + if (!url || !bypassCache && $.data(a, 'cache.tabs')) { + callback(); + return; + } + + // load remote from here on + + var inner = function(parent) { + var $parent = $(parent), $inner = $parent.find('*:last'); + return $inner.length && $inner.is(':not(img)') && $inner || $parent; + }; + var cleanup = function() { + self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass) + .each(function() { + if (o.spinner) + inner(this).parent().html(inner(this).data('label.tabs')); + }); + self.xhr = null; + }; + + if (o.spinner) { + var label = inner(a).html(); + inner(a).wrapInner('<em></em>') + .find('em').data('label.tabs', label).html(o.spinner); + } + + var ajaxOptions = $.extend({}, o.ajaxOptions, { + url: url, + success: function(r, s) { + $(a.hash).html(r); + cleanup(); + + if (o.cache) + $.data(a, 'cache.tabs', true); // if loaded once do not load them again + + // callbacks + $(self.element).triggerHandler('tabsload', + [self.fakeEvent('tabsload'), self.ui(self.$tabs[index], self.$panels[index])], o.load + ); + o.ajaxOptions.success && o.ajaxOptions.success(r, s); + + // This callback is required because the switch has to take + // place after loading has completed. Call last in order to + // fire load before show callback... + callback(); + } + }); + if (this.xhr) { + // terminate pending requests from other tabs and restore tab label + this.xhr.abort(); + cleanup(); + } + $a.addClass(o.loadingClass); + setTimeout(function() { // timeout is again required in IE, "wait" for id being restored + self.xhr = $.ajax(ajaxOptions); + }, 0); + + }, + url: function(index, url) { + this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url); + }, + destroy: function() { + var o = this.options; + this.element.unbind('.tabs') + .removeClass(o.navClass).removeData('tabs'); + this.$tabs.each(function() { + var href = $.data(this, 'href.tabs'); + if (href) + this.href = href; + var $this = $(this).unbind('.tabs'); + $.each(['href', 'load', 'cache'], function(i, prefix) { + $this.removeData(prefix + '.tabs'); + }); + }); + this.$lis.add(this.$panels).each(function() { + if ($.data(this, 'destroy.tabs')) + $(this).remove(); + else + $(this).removeClass([o.selectedClass, o.unselectClass, + o.disabledClass, o.panelClass, o.hideClass].join(' ')); + }); + }, + fakeEvent: function(type) { + return $.event.fix({ + type: type, + target: this.element[0] + }); + } +}); + +$.ui.tabs.defaults = { + // basic setup + unselect: false, + event: 'click', + disabled: [], + cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } + // TODO history: false, + + // Ajax + spinner: 'Loading&#8230;', + cache: false, + idPrefix: 'ui-tabs-', + ajaxOptions: {}, + + // animations + fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } + + // templates + tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>', + panelTemplate: '<div></div>', + + // CSS classes + navClass: 'ui-tabs-nav', + selectedClass: 'ui-tabs-selected', + unselectClass: 'ui-tabs-unselect', + disabledClass: 'ui-tabs-disabled', + panelClass: 'ui-tabs-panel', + hideClass: 'ui-tabs-hide', + loadingClass: 'ui-tabs-loading' +}; + +$.ui.tabs.getter = "length"; + +/* + * Tabs Extensions + */ + +/* + * Rotate + */ +$.extend($.ui.tabs.prototype, { + rotation: null, + rotate: function(ms, continuing) { + + continuing = continuing || false; + + var self = this, t = this.options.selected; + + function start() { + self.rotation = setInterval(function() { + t = ++t < self.$tabs.length ? t : 0; + self.select(t); + }, ms); + } + + function stop(e) { + if (!e || e.clientX) { // only in case of a true click + clearInterval(self.rotation); + } + } + + // start interval + if (ms) { + start(); + if (!continuing) + this.$tabs.bind(this.options.event, stop); + else + this.$tabs.bind(this.options.event, function() { + stop(); + t = self.options.selected; + start(); + }); + } + // stop interval + else { + stop(); + this.$tabs.unbind(this.options.event, stop); + } + } +}); + +})(jQuery); diff --git a/fannie/src/jquery-ui/development-bundle/version.txt b/fannie/src/jquery-ui/development-bundle/version.txt new file mode 100644 index 000000000..1d5e9e0ba --- /dev/null +++ b/fannie/src/jquery-ui/development-bundle/version.txt @@ -0,0 +1 @@ +1.5.3 \ No newline at end of file diff --git a/fannie/src/jquery-ui/index.html b/fannie/src/jquery-ui/index.html new file mode 100644 index 000000000..794f2fd44 --- /dev/null +++ b/fannie/src/jquery-ui/index.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <title>Legacy jQuery UI Example Page</title> + <link type="text/css" href="css/smoothness/ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="js/jquery-1.2.6.min.js"></script> + <script type="text/javascript" src="js/jquery-ui-1.5.3.custom.min.js"></script> + <script type="text/javascript"> + $(function(){ + + // Accordion + $("#accordion").accordion({ header: "h3" }); + + // Tabs + $('#tabs').tabs(); + + + // Dialog + $('#dialog').dialog({ + autoOpen: false, + width: 600, + buttons: { + "Ok": function() { + $(this).dialog("close"); + }, + "Cancel": function() { + $(this).dialog("close"); + } + } + }); + + // Dialog Link + $('#dialog_link').click(function(){ + $('#dialog').dialog('open'); + return false; + }) + .hover( + function() { $(this).addClass('ui-hover-state'); }, + function() { $(this).removeClass('ui-hover-state'); } + ); + + // Datepicker + $('#datepicker').datepicker({ + inline: true + }); + + // Slider + $('#slider').slider({ + range: true + }); + + }); + </script> + <style type="text/css"> + body{ font: 62.5% Verdana, sans-serif; margin: 50px;} + #dialog_link {padding: .7em 1em;text-decoration: none;} + </style> + </head> + <body> + + <!-- Accordion --> + <h2 class="demoHeaders">Accordion</h2> + <div id="accordion"> + <div> + <h3><a href="#">First</a></h3> + <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div> + </div> + <div> + <h3><a href="#">Second</a></h3> + <div>Phasellus mattis tincidunt nibh.</div> + </div> + <div> + <h3><a href="#">Third</a></h3> + <div>Nam dui erat, auctor a, dignissim quis.</div> + </div> + </div> + + <!-- Tabs --> + <h2 class="demoHeaders">Tabs</h2> + <div id="tabs"> + <ul> + <li><a href="#tabs-1">First</a></li> + <li><a href="#tabs-2">Second</a></li> + <li><a href="#tabs-3">Third</a></li> + </ul> + <div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div> + <div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div> + <div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div> + </div> + + <!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller--> + <h2 class="demoHeaders">Dialog</h2> + <p><a href="#" id="dialog_link" class="ui-default-state">Open Dialog</a></p> + + + + <!-- ui-dialog --> + <div id="dialog" title="Dialog Title"> + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> + </div> + + + + + <!-- Slider --> + <h2 class="demoHeaders">Slider</h2> + <div id="slider"> + <div class='ui-slider-handle'></div> + <div class='ui-slider-handle' style="left: 100px;"></div> + </div> + + <!-- Datepicker --> + <h2 class="demoHeaders">Datepicker</h2> + <div id="datepicker"></div> + </body> +</html> + + diff --git a/fannie/src/jquery-ui/js/greybox.js b/fannie/src/jquery-ui/js/greybox.js new file mode 100644 index 000000000..deea2f0ce --- /dev/null +++ b/fannie/src/jquery-ui/js/greybox.js @@ -0,0 +1,147 @@ +/* Greybox Redux + * Required: http://jquery.com/ + * Written by: John Resig + * Reworked by: Benjamin Yu (http://foofiles.com/, http://badpopcorn.com/) + * Based on code by: 4mir Salihefendic (http://amix.dk) + * License: LGPL (read more in LGPL.txt) + * + * @name Greybox + * @cat Plugins/Greybox + */ + +/* + Defaults, all configurable via options: + { + close_img: "close.gif", + height: 400, + width: 400, + animation: false, + overlay_clickable: true, + overflow: "auto", + callback: null, + caption: "" + } +*/ +(function() { + var settings = {}; + + GB_getPageScrollTop = function(){ + var yScrolltop; + var xScrollleft; + if (self.pageYOffset || self.pageXOffset) { + yScrolltop = self.pageYOffset; + xScrollleft = self.pageXOffset; + } else if(document.documentElement&& document.documentElement.scrollTop + || document.documentElement.scrollLeft ){ // Explorer 6 Strict + yScrolltop = document.documentElement.scrollTop; + xScrollleft = document.documentElement.scrollLeft; + } else if (document.body) {// all other Explorers + yScrolltop = document.body.scrollTop; + xScrollleft = document.body.scrollLeft; + } + arrayPageScroll = new Array(xScrollleft,yScrolltop); + return arrayPageScroll; + } + + GB_overlay_size = function() { + try { + if(window.innerHeight && window.scrollMaxY + || window.innerWidth && window.scrollMaxX) { + h = window.innerHeight + window.scrollMaxY; + w = window.innerWidth + window.scrollMaxX; + var deff = document.documentElement; + var wff = (deff&&deff.clientWidth) + || document.body.clientWidth || window.innerWidth || self.innerWidth; + var hff = (deff&&deff.clientHeight) || document.body.clientHeight + || window.innerHeight || self.innerHeight; + w -= (window.innerWidth - wff); + h -= (window.innerHeight - hff); + } else if(document.body.scrollHeight > document.body.offsetHeight + || document.body.scrollWidth > document.body.offsetWidth) { + // all but Explorer Mac + h = document.body.scrollHeight; + w = document.body.scrollWidth; + } else { + // Explorer Mac.would also work in Explorer 6 Strict, Mozilla and Safari + var left_top = GB_getPageScrollTop(); + h = left_top[1] + settings.height; + w = left_top[0] + settings.width; + if( h < document.body.offsetHeight) { + h = document.body.offsetHeight; + } + if( w < document.body.offsetWidth) { + w = document.body.offsetWidth; + } + } + } catch(err) { + w = jQuery(document.body).width(); + h = jQuery(document.body).height(); + } + jQuery("#GB_overlay").css({"height":h+"px", "width":w +"px"}); + } + + GB_position = function() { + var boxWidth = settings.width; + var boxHeight = settings.height; + jQuery('#GB_window').css({ + marginLeft: '-' + parseInt(boxWidth / 2) + 'px', + width: boxWidth + 'px', + height: settings.height+"px" + }); + if( !(jQuery.browser.msie && typeof(XMLHttpRequest) == 'function')) { + // take away IE6 + jQuery('#GB_window').css({marginTop: '-' + parseInt(boxHeight / 2)+'px'}); + } + jQuery("#GB_frame").css("height",settings.height - 32 +"px"); + } + + jQuery.GB_hide = function() { + jQuery("#GB_window,#GB_overlay").remove(); + if(settings.callback && typeof(settings.callback) == 'function') { + settings.callback.apply(); + } + } + + jQuery.GB_show = function(url, options) { + settings = jQuery.extend({ + close_img: "close.gif", + height: 400, + width: 400, + animation: false, + overlay_clickable: true, + overflow: "auto", + callback: null, + caption: "" + }, options || {}); + + jQuery(document.body) + .append( + "<div id='GB_overlay'></div>" + + "<div id='GB_window'><div id='GB_caption'></div>" + + "<img src='" + settings.close_img + "' alt='Close window'/></div>"); + jQuery("#GB_window img").click(jQuery.GB_hide); + if(settings.overlay_clickable) { + jQuery("#GB_overlay").click(jQuery.GB_hide); + } + + jQuery("#GB_window") + .append("<iframe id='GB_frame' src='"+url+"'></iframe>"); + jQuery("#GB_frame").overflow(settings.overflow); + + jQuery("#GB_caption").html(settings.caption); + + GB_overlay_size(); + jQuery(window).resize(GB_overlay_size); + jQuery(window).scroll(GB_overlay_size); + jQuery("#GB_overlay").show(); + + GB_position(); + + if(settings.animation) { + jQuery("#GB_window").slideDown("slow"); + } else { + jQuery("#GB_window").show(); + } + } + +})(); diff --git a/fannie/src/jquery-ui/js/jquery-1.2.6.min.js b/fannie/src/jquery-ui/js/jquery-1.2.6.min.js new file mode 100644 index 000000000..82b98e1d7 --- /dev/null +++ b/fannie/src/jquery-ui/js/jquery-1.2.6.min.js @@ -0,0 +1,32 @@ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ +(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else +return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else +return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else +selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else +return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else +this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else +return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else +script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else +for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else +for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else +jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else +ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else +while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else +while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else +jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else +xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else +jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else +s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file diff --git a/fannie/src/jquery-ui/js/jquery-ui-1.5.3.custom.min.js b/fannie/src/jquery-ui/js/jquery-ui-1.5.3.custom.min.js new file mode 100644 index 000000000..cd289bf56 --- /dev/null +++ b/fannie/src/jquery-ui/js/jquery-ui-1.5.3.custom.min.js @@ -0,0 +1 @@ +(function(C){C.ui={plugin:{add:function(E,F,H){var G=C.ui[E].prototype;for(var D in H){G.plugins[D]=G.plugins[D]||[];G.plugins[D].push([F,H[D]])}},call:function(D,F,E){var H=D.plugins[F];if(!H){return }for(var G=0;G<H.length;G++){if(D.options[H[G][0]]){H[G][1].apply(D.element,E)}}}},cssCache:{},css:function(D){if(C.ui.cssCache[D]){return C.ui.cssCache[D]}var E=C('<div class="ui-gen">').addClass(D).css({position:"absolute",top:"-5000px",left:"-5000px",display:"block"}).appendTo("body");C.ui.cssCache[D]=!!((!(/auto|default/).test(E.css("cursor"))||(/^[1-9]/).test(E.css("height"))||(/^[1-9]/).test(E.css("width"))||!(/none/).test(E.css("backgroundImage"))||!(/transparent|rgba\(0, 0, 0, 0\)/).test(E.css("backgroundColor"))));try{C("body").get(0).removeChild(E.get(0))}catch(F){}return C.ui.cssCache[D]},disableSelection:function(D){C(D).attr("unselectable","on").css("MozUserSelect","none")},enableSelection:function(D){C(D).attr("unselectable","off").css("MozUserSelect","")},hasScroll:function(G,E){var D=/top/.test(E||"top")?"scrollTop":"scrollLeft",F=false;if(G[D]>0){return true}G[D]=1;F=G[D]>0?true:false;G[D]=0;return F}};var B=C.fn.remove;C.fn.remove=function(){C("*",this).add(this).triggerHandler("remove");return B.apply(this,arguments)};function A(E,F,G){var D=C[E][F].getter||[];D=(typeof D=="string"?D.split(/,?\s+/):D);return(C.inArray(G,D)!=-1)}C.widget=function(E,D){var F=E.split(".")[0];E=E.split(".")[1];C.fn[E]=function(J){var H=(typeof J=="string"),I=Array.prototype.slice.call(arguments,1);if(H&&A(F,E,J)){var G=C.data(this[0],E);return(G?G[J].apply(G,I):undefined)}return this.each(function(){var K=C.data(this,E);if(H&&K&&C.isFunction(K[J])){K[J].apply(K,I)}else{if(!H){C.data(this,E,new C[F][E](this,J))}}})};C[F][E]=function(I,H){var G=this;this.widgetName=E;this.widgetBaseClass=F+"-"+E;this.options=C.extend({},C.widget.defaults,C[F][E].defaults,H);this.element=C(I).bind("setData."+E,function(L,J,K){return G.setData(J,K)}).bind("getData."+E,function(K,J){return G.getData(J)}).bind("remove",function(){return G.destroy()});this.init()};C[F][E].prototype=C.extend({},C.widget.prototype,D)};C.widget.prototype={init:function(){},destroy:function(){this.element.removeData(this.widgetName)},getData:function(D){return this.options[D]},setData:function(D,E){this.options[D]=E;if(D=="disabled"){this.element[E?"addClass":"removeClass"](this.widgetBaseClass+"-disabled")}},enable:function(){this.setData("disabled",false)},disable:function(){this.setData("disabled",true)}};C.widget.defaults={disabled:false};C.ui.mouse={mouseInit:function(){var D=this;this.element.bind("mousedown."+this.widgetName,function(E){return D.mouseDown(E)});if(C.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},mouseDestroy:function(){this.element.unbind("."+this.widgetName);(C.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},mouseDown:function(F){(this._mouseStarted&&this.mouseUp(F));this._mouseDownEvent=F;var E=this,G=(F.which==1),D=(typeof this.options.cancel=="string"?C(F.target).parents().add(F.target).filter(this.options.cancel).length:false);if(!G||D||!this.mouseCapture(F)){return true}this._mouseDelayMet=!this.options.delay;if(!this._mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){E._mouseDelayMet=true},this.options.delay)}if(this.mouseDistanceMet(F)&&this.mouseDelayMet(F)){this._mouseStarted=(this.mouseStart(F)!==false);if(!this._mouseStarted){F.preventDefault();return true}}this._mouseMoveDelegate=function(H){return E.mouseMove(H)};this._mouseUpDelegate=function(H){return E.mouseUp(H)};C(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);return false},mouseMove:function(D){if(C.browser.msie&&!D.button){return this.mouseUp(D)}if(this._mouseStarted){this.mouseDrag(D);return false}if(this.mouseDistanceMet(D)&&this.mouseDelayMet(D)){this._mouseStarted=(this.mouseStart(this._mouseDownEvent,D)!==false);(this._mouseStarted?this.mouseDrag(D):this.mouseUp(D))}return !this._mouseStarted},mouseUp:function(D){C(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this.mouseStop(D)}return false},mouseDistanceMet:function(D){return(Math.max(Math.abs(this._mouseDownEvent.pageX-D.pageX),Math.abs(this._mouseDownEvent.pageY-D.pageY))>=this.options.distance)},mouseDelayMet:function(D){return this._mouseDelayMet},mouseStart:function(D){},mouseDrag:function(D){},mouseStop:function(D){},mouseCapture:function(D){return true}};C.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);(function(A){A.widget("ui.draggable",A.extend({},A.ui.mouse,{init:function(){var B=this.options;if(B.helper=="original"&&!(/(relative|absolute|fixed)/).test(this.element.css("position"))){this.element.css("position","relative")}this.element.addClass("ui-draggable");(B.disabled&&this.element.addClass("ui-draggable-disabled"));this.mouseInit()},mouseStart:function(F){var H=this.options;if(this.helper||H.disabled||A(F.target).is(".ui-resizable-handle")){return false}var C=!this.options.handle||!A(this.options.handle,this.element).length?true:false;A(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==F.target){C=true}});if(!C){return false}if(A.ui.ddmanager){A.ui.ddmanager.current=this}this.helper=A.isFunction(H.helper)?A(H.helper.apply(this.element[0],[F])):(H.helper=="clone"?this.element.clone():this.element);if(!this.helper.parents("body").length){this.helper.appendTo((H.appendTo=="parent"?this.element[0].parentNode:H.appendTo))}if(this.helper[0]!=this.element[0]&&!(/(fixed|absolute)/).test(this.helper.css("position"))){this.helper.css("position","absolute")}this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)};this.cssPosition=this.helper.css("position");this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.offset.click={left:F.pageX-this.offset.left,top:F.pageY-this.offset.top};this.offsetParent=this.helper.offsetParent();var B=this.offsetParent.offset();if(this.offsetParent[0]==document.body&&A.browser.mozilla){B={top:0,left:0}}this.offset.parent={top:B.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:B.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)};var E=this.element.position();this.offset.relative=this.cssPosition=="relative"?{top:E.top-(parseInt(this.helper.css("top"),10)||0)+this.offsetParent[0].scrollTop,left:E.left-(parseInt(this.helper.css("left"),10)||0)+this.offsetParent[0].scrollLeft}:{top:0,left:0};this.originalPosition=this.generatePosition(F);this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};if(H.cursorAt){if(H.cursorAt.left!=undefined){this.offset.click.left=H.cursorAt.left+this.margins.left}if(H.cursorAt.right!=undefined){this.offset.click.left=this.helperProportions.width-H.cursorAt.right+this.margins.left}if(H.cursorAt.top!=undefined){this.offset.click.top=H.cursorAt.top+this.margins.top}if(H.cursorAt.bottom!=undefined){this.offset.click.top=this.helperProportions.height-H.cursorAt.bottom+this.margins.top}}if(H.containment){if(H.containment=="parent"){H.containment=this.helper[0].parentNode}if(H.containment=="document"||H.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,A(H.containment=="document"?document:window).width()-this.offset.relative.left-this.offset.parent.left-this.helperProportions.width-this.margins.left-(parseInt(this.element.css("marginRight"),10)||0),(A(H.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.offset.relative.top-this.offset.parent.top-this.helperProportions.height-this.margins.top-(parseInt(this.element.css("marginBottom"),10)||0)]}if(!(/^(document|window|parent)$/).test(H.containment)){var D=A(H.containment)[0];var G=A(H.containment).offset();this.containment=[G.left+(parseInt(A(D).css("borderLeftWidth"),10)||0)-this.offset.relative.left-this.offset.parent.left,G.top+(parseInt(A(D).css("borderTopWidth"),10)||0)-this.offset.relative.top-this.offset.parent.top,G.left+Math.max(D.scrollWidth,D.offsetWidth)-(parseInt(A(D).css("borderLeftWidth"),10)||0)-this.offset.relative.left-this.offset.parent.left-this.helperProportions.width-this.margins.left-(parseInt(this.element.css("marginRight"),10)||0),G.top+Math.max(D.scrollHeight,D.offsetHeight)-(parseInt(A(D).css("borderTopWidth"),10)||0)-this.offset.relative.top-this.offset.parent.top-this.helperProportions.height-this.margins.top-(parseInt(this.element.css("marginBottom"),10)||0)]}}this.propagate("start",F);this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};if(A.ui.ddmanager&&!H.dropBehaviour){A.ui.ddmanager.prepareOffsets(this,F)}this.helper.addClass("ui-draggable-dragging");this.mouseDrag(F);return true},convertPositionTo:function(C,D){if(!D){D=this.position}var B=C=="absolute"?1:-1;return{top:(D.top+this.offset.relative.top*B+this.offset.parent.top*B-(this.cssPosition=="fixed"||(this.cssPosition=="absolute"&&this.offsetParent[0]==document.body)?0:this.offsetParent[0].scrollTop)*B+(this.cssPosition=="fixed"?A(document).scrollTop():0)*B+this.margins.top*B),left:(D.left+this.offset.relative.left*B+this.offset.parent.left*B-(this.cssPosition=="fixed"||(this.cssPosition=="absolute"&&this.offsetParent[0]==document.body)?0:this.offsetParent[0].scrollLeft)*B+(this.cssPosition=="fixed"?A(document).scrollLeft():0)*B+this.margins.left*B)}},generatePosition:function(E){var F=this.options;var B={top:(E.pageY-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition=="fixed"||(this.cssPosition=="absolute"&&this.offsetParent[0]==document.body)?0:this.offsetParent[0].scrollTop)-(this.cssPosition=="fixed"?A(document).scrollTop():0)),left:(E.pageX-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition=="fixed"||(this.cssPosition=="absolute"&&this.offsetParent[0]==document.body)?0:this.offsetParent[0].scrollLeft)-(this.cssPosition=="fixed"?A(document).scrollLeft():0))};if(!this.originalPosition){return B}if(this.containment){if(B.left<this.containment[0]){B.left=this.containment[0]}if(B.top<this.containment[1]){B.top=this.containment[1]}if(B.left>this.containment[2]){B.left=this.containment[2]}if(B.top>this.containment[3]){B.top=this.containment[3]}}if(F.grid){var D=this.originalPosition.top+Math.round((B.top-this.originalPosition.top)/F.grid[1])*F.grid[1];B.top=this.containment?(!(D<this.containment[1]||D>this.containment[3])?D:(!(D<this.containment[1])?D-F.grid[1]:D+F.grid[1])):D;var C=this.originalPosition.left+Math.round((B.left-this.originalPosition.left)/F.grid[0])*F.grid[0];B.left=this.containment?(!(C<this.containment[0]||C>this.containment[2])?C:(!(C<this.containment[0])?C-F.grid[0]:C+F.grid[0])):C}return B},mouseDrag:function(B){this.position=this.generatePosition(B);this.positionAbs=this.convertPositionTo("absolute");this.position=this.propagate("drag",B)||this.position;if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(A.ui.ddmanager){A.ui.ddmanager.drag(this,B)}return false},mouseStop:function(C){var D=false;if(A.ui.ddmanager&&!this.options.dropBehaviour){var D=A.ui.ddmanager.drop(this,C)}if((this.options.revert=="invalid"&&!D)||(this.options.revert=="valid"&&D)||this.options.revert===true){var B=this;A(this.helper).animate(this.originalPosition,parseInt(this.options.revert,10)||500,function(){B.propagate("stop",C);B.clear()})}else{this.propagate("stop",C);this.clear()}return false},clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.options.helper!="original"&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},plugins:{},uiHash:function(B){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,options:this.options}},propagate:function(C,B){A.ui.plugin.call(this,C,[B,this.uiHash()]);if(C=="drag"){this.positionAbs=this.convertPositionTo("absolute")}return this.element.triggerHandler(C=="drag"?C:"drag"+C,[B,this.uiHash()],this.options[C])},destroy:function(){if(!this.element.data("draggable")){return }this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable");this.mouseDestroy()}}));A.extend(A.ui.draggable,{defaults:{appendTo:"parent",axis:false,cancel:":input",delay:0,distance:1,helper:"original"}});A.ui.plugin.add("draggable","cursor",{start:function(D,C){var B=A("body");if(B.css("cursor")){C.options._cursor=B.css("cursor")}B.css("cursor",C.options.cursor)},stop:function(C,B){if(B.options._cursor){A("body").css("cursor",B.options._cursor)}}});A.ui.plugin.add("draggable","zIndex",{start:function(D,C){var B=A(C.helper);if(B.css("zIndex")){C.options._zIndex=B.css("zIndex")}B.css("zIndex",C.options.zIndex)},stop:function(C,B){if(B.options._zIndex){A(B.helper).css("zIndex",B.options._zIndex)}}});A.ui.plugin.add("draggable","opacity",{start:function(D,C){var B=A(C.helper);if(B.css("opacity")){C.options._opacity=B.css("opacity")}B.css("opacity",C.options.opacity)},stop:function(C,B){if(B.options._opacity){A(B.helper).css("opacity",B.options._opacity)}}});A.ui.plugin.add("draggable","iframeFix",{start:function(C,B){A(B.options.iframeFix===true?"iframe":B.options.iframeFix).each(function(){A('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(A(this).offset()).appendTo("body")})},stop:function(C,B){A("div.DragDropIframeFix").each(function(){this.parentNode.removeChild(this)})}});A.ui.plugin.add("draggable","scroll",{start:function(D,C){var E=C.options;var B=A(this).data("draggable");E.scrollSensitivity=E.scrollSensitivity||20;E.scrollSpeed=E.scrollSpeed||20;B.overflowY=function(F){do{if(/auto|scroll/.test(F.css("overflow"))||(/auto|scroll/).test(F.css("overflow-y"))){return F}F=F.parent()}while(F[0].parentNode);return A(document)}(this);B.overflowX=function(F){do{if(/auto|scroll/.test(F.css("overflow"))||(/auto|scroll/).test(F.css("overflow-x"))){return F}F=F.parent()}while(F[0].parentNode);return A(document)}(this);if(B.overflowY[0]!=document&&B.overflowY[0].tagName!="HTML"){B.overflowYOffset=B.overflowY.offset()}if(B.overflowX[0]!=document&&B.overflowX[0].tagName!="HTML"){B.overflowXOffset=B.overflowX.offset()}},drag:function(D,C){var E=C.options;var B=A(this).data("draggable");if(B.overflowY[0]!=document&&B.overflowY[0].tagName!="HTML"){if((B.overflowYOffset.top+B.overflowY[0].offsetHeight)-D.pageY<E.scrollSensitivity){B.overflowY[0].scrollTop=B.overflowY[0].scrollTop+E.scrollSpeed}if(D.pageY-B.overflowYOffset.top<E.scrollSensitivity){B.overflowY[0].scrollTop=B.overflowY[0].scrollTop-E.scrollSpeed}}else{if(D.pageY-A(document).scrollTop()<E.scrollSensitivity){A(document).scrollTop(A(document).scrollTop()-E.scrollSpeed)}if(A(window).height()-(D.pageY-A(document).scrollTop())<E.scrollSensitivity){A(document).scrollTop(A(document).scrollTop()+E.scrollSpeed)}}if(B.overflowX[0]!=document&&B.overflowX[0].tagName!="HTML"){if((B.overflowXOffset.left+B.overflowX[0].offsetWidth)-D.pageX<E.scrollSensitivity){B.overflowX[0].scrollLeft=B.overflowX[0].scrollLeft+E.scrollSpeed}if(D.pageX-B.overflowXOffset.left<E.scrollSensitivity){B.overflowX[0].scrollLeft=B.overflowX[0].scrollLeft-E.scrollSpeed}}else{if(D.pageX-A(document).scrollLeft()<E.scrollSensitivity){A(document).scrollLeft(A(document).scrollLeft()-E.scrollSpeed)}if(A(window).width()-(D.pageX-A(document).scrollLeft())<E.scrollSensitivity){A(document).scrollLeft(A(document).scrollLeft()+E.scrollSpeed)}}}});A.ui.plugin.add("draggable","snap",{start:function(D,C){var B=A(this).data("draggable");B.snapElements=[];A(C.options.snap===true?".ui-draggable":C.options.snap).each(function(){var F=A(this);var E=F.offset();if(this!=B.element[0]){B.snapElements.push({item:this,width:F.outerWidth(),height:F.outerHeight(),top:E.top,left:E.left})}})},drag:function(J,N){var I=A(this).data("draggable");var L=N.options.snapTolerance||20;var D=N.absolutePosition.left,C=D+I.helperProportions.width,P=N.absolutePosition.top,O=P+I.helperProportions.height;for(var H=I.snapElements.length-1;H>=0;H--){var E=I.snapElements[H].left,B=E+I.snapElements[H].width,R=I.snapElements[H].top,M=R+I.snapElements[H].height;if(!((E-L<D&&D<B+L&&R-L<P&&P<M+L)||(E-L<D&&D<B+L&&R-L<O&&O<M+L)||(E-L<C&&C<B+L&&R-L<P&&P<M+L)||(E-L<C&&C<B+L&&R-L<O&&O<M+L))){continue}if(N.options.snapMode!="inner"){var K=Math.abs(R-O)<=20;var Q=Math.abs(M-P)<=20;var G=Math.abs(E-C)<=20;var F=Math.abs(B-D)<=20;if(K){N.position.top=I.convertPositionTo("relative",{top:R-I.helperProportions.height,left:0}).top}if(Q){N.position.top=I.convertPositionTo("relative",{top:M,left:0}).top}if(G){N.position.left=I.convertPositionTo("relative",{top:0,left:E-I.helperProportions.width}).left}if(F){N.position.left=I.convertPositionTo("relative",{top:0,left:B}).left}}if(N.options.snapMode!="outer"){var K=Math.abs(R-P)<=20;var Q=Math.abs(M-O)<=20;var G=Math.abs(E-D)<=20;var F=Math.abs(B-C)<=20;if(K){N.position.top=I.convertPositionTo("relative",{top:R,left:0}).top}if(Q){N.position.top=I.convertPositionTo("relative",{top:M-I.helperProportions.height,left:0}).top}if(G){N.position.left=I.convertPositionTo("relative",{top:0,left:E}).left}if(F){N.position.left=I.convertPositionTo("relative",{top:0,left:B-I.helperProportions.width}).left}}}}});A.ui.plugin.add("draggable","connectToSortable",{start:function(D,C){var B=A(this).data("draggable");B.sortables=[];A(C.options.connectToSortable).each(function(){if(A.data(this,"sortable")){var E=A.data(this,"sortable");B.sortables.push({instance:E,shouldRevert:E.options.revert});E.refreshItems();E.propagate("activate",D,B)}})},stop:function(D,C){var B=A(this).data("draggable");A.each(B.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;B.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance.mouseStop(D);this.instance.element.triggerHandler("sortreceive",[D,A.extend(this.instance.ui(),{sender:B.element})],this.instance.options["receive"]);this.instance.options.helper=this.instance.options._helper}else{this.instance.propagate("deactivate",D,B)}})},drag:function(F,E){var D=A(this).data("draggable"),B=this;var C=function(K){var H=K.left,J=H+K.width,I=K.top,G=I+K.height;return(H<(this.positionAbs.left+this.offset.click.left)&&(this.positionAbs.left+this.offset.click.left)<J&&I<(this.positionAbs.top+this.offset.click.top)&&(this.positionAbs.top+this.offset.click.top)<G)};A.each(D.sortables,function(G){if(C.call(D,this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=A(B).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return E.helper[0]};F.target=this.instance.currentItem[0];this.instance.mouseCapture(F,true);this.instance.mouseStart(F,true,true);this.instance.offset.click.top=D.offset.click.top;this.instance.offset.click.left=D.offset.click.left;this.instance.offset.parent.left-=D.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=D.offset.parent.top-this.instance.offset.parent.top;D.propagate("toSortable",F)}if(this.instance.currentItem){this.instance.mouseDrag(F)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance.mouseStop(F,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}D.propagate("fromSortable",F)}}})}});A.ui.plugin.add("draggable","stack",{start:function(D,B){var C=A.makeArray(A(B.options.stack.group)).sort(function(F,E){return(parseInt(A(F).css("zIndex"),10)||B.options.stack.min)-(parseInt(A(E).css("zIndex"),10)||B.options.stack.min)});A(C).each(function(E){this.style.zIndex=B.options.stack.min+E});this[0].style.zIndex=B.options.stack.min+C.length}})})(jQuery);(function(A){A.widget("ui.droppable",{init:function(){this.element.addClass("ui-droppable");this.isover=0;this.isout=1;var C=this.options,B=C.accept;C=A.extend(C,{accept:C.accept&&C.accept.constructor==Function?C.accept:function(D){return A(D).is(B)}});this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};A.ui.ddmanager.droppables.push(this)},plugins:{},ui:function(B){return{draggable:(B.currentItem||B.element),helper:B.helper,position:B.position,absolutePosition:B.positionAbs,options:this.options,element:this.element}},destroy:function(){var B=A.ui.ddmanager.droppables;for(var C=0;C<B.length;C++){if(B[C]==this){B.splice(C,1)}}this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable")},over:function(C){var B=A.ui.ddmanager.current;if(!B||(B.currentItem||B.element)[0]==this.element[0]){return }if(this.options.accept.call(this.element,(B.currentItem||B.element))){A.ui.plugin.call(this,"over",[C,this.ui(B)]);this.element.triggerHandler("dropover",[C,this.ui(B)],this.options.over)}},out:function(C){var B=A.ui.ddmanager.current;if(!B||(B.currentItem||B.element)[0]==this.element[0]){return }if(this.options.accept.call(this.element,(B.currentItem||B.element))){A.ui.plugin.call(this,"out",[C,this.ui(B)]);this.element.triggerHandler("dropout",[C,this.ui(B)],this.options.out)}},drop:function(D,C){var B=C||A.ui.ddmanager.current;if(!B||(B.currentItem||B.element)[0]==this.element[0]){return false}var E=false;this.element.find(".ui-droppable").not(".ui-draggable-dragging").each(function(){var F=A.data(this,"droppable");if(F.options.greedy&&A.ui.intersect(B,A.extend(F,{offset:F.element.offset()}),F.options.tolerance)){E=true;return false}});if(E){return false}if(this.options.accept.call(this.element,(B.currentItem||B.element))){A.ui.plugin.call(this,"drop",[D,this.ui(B)]);this.element.triggerHandler("drop",[D,this.ui(B)],this.options.drop);return true}return false},activate:function(C){var B=A.ui.ddmanager.current;A.ui.plugin.call(this,"activate",[C,this.ui(B)]);if(B){this.element.triggerHandler("dropactivate",[C,this.ui(B)],this.options.activate)}},deactivate:function(C){var B=A.ui.ddmanager.current;A.ui.plugin.call(this,"deactivate",[C,this.ui(B)]);if(B){this.element.triggerHandler("dropdeactivate",[C,this.ui(B)],this.options.deactivate)}}});A.extend(A.ui.droppable,{defaults:{disabled:false,tolerance:"intersect"}});A.ui.intersect=function(L,F,J){if(!F.offset){return false}var D=(L.positionAbs||L.position.absolute).left,C=D+L.helperProportions.width,I=(L.positionAbs||L.position.absolute).top,H=I+L.helperProportions.height;var E=F.offset.left,B=E+F.proportions.width,K=F.offset.top,G=K+F.proportions.height;switch(J){case"fit":return(E<D&&C<B&&K<I&&H<G);break;case"intersect":return(E<D+(L.helperProportions.width/2)&&C-(L.helperProportions.width/2)<B&&K<I+(L.helperProportions.height/2)&&H-(L.helperProportions.height/2)<G);break;case"pointer":return(E<((L.positionAbs||L.position.absolute).left+(L.clickOffset||L.offset.click).left)&&((L.positionAbs||L.position.absolute).left+(L.clickOffset||L.offset.click).left)<B&&K<((L.positionAbs||L.position.absolute).top+(L.clickOffset||L.offset.click).top)&&((L.positionAbs||L.position.absolute).top+(L.clickOffset||L.offset.click).top)<G);break;case"touch":return((I>=K&&I<=G)||(H>=K&&H<=G)||(I<K&&H>G))&&((D>=E&&D<=B)||(C>=E&&C<=B)||(D<E&&C>B));break;default:return false;break}};A.ui.ddmanager={current:null,droppables:[],prepareOffsets:function(D,F){var B=A.ui.ddmanager.droppables;var E=F?F.type:null;for(var C=0;C<B.length;C++){if(B[C].options.disabled||(D&&!B[C].options.accept.call(B[C].element,(D.currentItem||D.element)))){continue}B[C].visible=B[C].element.css("display")!="none";if(!B[C].visible){continue}B[C].offset=B[C].element.offset();B[C].proportions={width:B[C].element[0].offsetWidth,height:B[C].element[0].offsetHeight};if(E=="dragstart"||E=="sortactivate"){B[C].activate.call(B[C],F)}}},drop:function(B,C){var D=false;A.each(A.ui.ddmanager.droppables,function(){if(!this.options){return }if(!this.options.disabled&&this.visible&&A.ui.intersect(B,this,this.options.tolerance)){D=this.drop.call(this,C)}if(!this.options.disabled&&this.visible&&this.options.accept.call(this.element,(B.currentItem||B.element))){this.isout=1;this.isover=0;this.deactivate.call(this,C)}});return D},drag:function(B,C){if(B.options.refreshPositions){A.ui.ddmanager.prepareOffsets(B,C)}A.each(A.ui.ddmanager.droppables,function(){if(this.options.disabled||this.greedyChild||!this.visible){return }var E=A.ui.intersect(B,this,this.options.tolerance);var G=!E&&this.isover==1?"isout":(E&&this.isover==0?"isover":null);if(!G){return }var F;if(this.options.greedy){var D=this.element.parents(".ui-droppable:eq(0)");if(D.length){F=A.data(D[0],"droppable");F.greedyChild=(G=="isover"?1:0)}}if(F&&G=="isover"){F["isover"]=0;F["isout"]=1;F.out.call(F,C)}this[G]=1;this[G=="isout"?"isover":"isout"]=0;this[G=="isover"?"over":"out"].call(this,C);if(F&&G=="isout"){F["isout"]=0;F["isover"]=1;F.over.call(F,C)}})}};A.ui.plugin.add("droppable","activeClass",{activate:function(C,B){A(this).addClass(B.options.activeClass)},deactivate:function(C,B){A(this).removeClass(B.options.activeClass)},drop:function(C,B){A(this).removeClass(B.options.activeClass)}});A.ui.plugin.add("droppable","hoverClass",{over:function(C,B){A(this).addClass(B.options.hoverClass)},out:function(C,B){A(this).removeClass(B.options.hoverClass)},drop:function(C,B){A(this).removeClass(B.options.hoverClass)}})})(jQuery);(function(A){A.widget("ui.resizable",A.extend({},A.ui.mouse,{init:function(){var M=this,N=this.options;var Q=this.element.css("position");this.originalElement=this.element;this.element.addClass("ui-resizable").css({position:/static/.test(Q)?"relative":Q});A.extend(N,{_aspectRatio:!!(N.aspectRatio),helper:N.helper||N.ghost||N.animate?N.helper||"proxy":null,knobHandles:N.knobHandles===true?"ui-resizable-knob-handle":N.knobHandles});var H="1px solid #DEDEDE";N.defaultTheme={"ui-resizable":{display:"block"},"ui-resizable-handle":{position:"absolute",background:"#F2F2F2",fontSize:"0.1px"},"ui-resizable-n":{cursor:"n-resize",height:"4px",left:"0px",right:"0px",borderTop:H},"ui-resizable-s":{cursor:"s-resize",height:"4px",left:"0px",right:"0px",borderBottom:H},"ui-resizable-e":{cursor:"e-resize",width:"4px",top:"0px",bottom:"0px",borderRight:H},"ui-resizable-w":{cursor:"w-resize",width:"4px",top:"0px",bottom:"0px",borderLeft:H},"ui-resizable-se":{cursor:"se-resize",width:"4px",height:"4px",borderRight:H,borderBottom:H},"ui-resizable-sw":{cursor:"sw-resize",width:"4px",height:"4px",borderBottom:H,borderLeft:H},"ui-resizable-ne":{cursor:"ne-resize",width:"4px",height:"4px",borderRight:H,borderTop:H},"ui-resizable-nw":{cursor:"nw-resize",width:"4px",height:"4px",borderLeft:H,borderTop:H}};N.knobTheme={"ui-resizable-handle":{background:"#F2F2F2",border:"1px solid #808080",height:"8px",width:"8px"},"ui-resizable-n":{cursor:"n-resize",top:"0px",left:"45%"},"ui-resizable-s":{cursor:"s-resize",bottom:"0px",left:"45%"},"ui-resizable-e":{cursor:"e-resize",right:"0px",top:"45%"},"ui-resizable-w":{cursor:"w-resize",left:"0px",top:"45%"},"ui-resizable-se":{cursor:"se-resize",right:"0px",bottom:"0px"},"ui-resizable-sw":{cursor:"sw-resize",left:"0px",bottom:"0px"},"ui-resizable-nw":{cursor:"nw-resize",left:"0px",top:"0px"},"ui-resizable-ne":{cursor:"ne-resize",right:"0px",top:"0px"}};N._nodeName=this.element[0].nodeName;if(N._nodeName.match(/canvas|textarea|input|select|button|img/i)){var B=this.element;if(/relative/.test(B.css("position"))&&A.browser.opera){B.css({position:"relative",top:"auto",left:"auto"})}B.wrap(A('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:B.css("position"),width:B.outerWidth(),height:B.outerHeight(),top:B.css("top"),left:B.css("left")}));var J=this.element;this.element=this.element.parent();this.element.data("resizable",this);this.element.css({marginLeft:J.css("marginLeft"),marginTop:J.css("marginTop"),marginRight:J.css("marginRight"),marginBottom:J.css("marginBottom")});J.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});if(A.browser.safari&&N.preventDefault){J.css("resize","none")}N.proportionallyResize=J.css({position:"static",zoom:1,display:"block"});this.element.css({margin:J.css("margin")});this._proportionallyResize()}if(!N.handles){N.handles=!A(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}}if(N.handles.constructor==String){N.zIndex=N.zIndex||1000;if(N.handles=="all"){N.handles="n,e,s,w,se,sw,ne,nw"}var O=N.handles.split(",");N.handles={};var G={handle:"position: absolute; display: none; overflow:hidden;",n:"top: 0pt; width:100%;",e:"right: 0pt; height:100%;",s:"bottom: 0pt; width:100%;",w:"left: 0pt; height:100%;",se:"bottom: 0pt; right: 0px;",sw:"bottom: 0pt; left: 0px;",ne:"top: 0pt; right: 0px;",nw:"top: 0pt; left: 0px;"};for(var R=0;R<O.length;R++){var S=A.trim(O[R]),L=N.defaultTheme,F="ui-resizable-"+S,C=!A.ui.css(F)&&!N.knobHandles,P=A.ui.css("ui-resizable-knob-handle"),T=A.extend(L[F],L["ui-resizable-handle"]),D=A.extend(N.knobTheme[F],!P?N.knobTheme["ui-resizable-handle"]:{});var K=/sw|se|ne|nw/.test(S)?{zIndex:++N.zIndex}:{};var I=(C?G[S]:""),E=A(['<div class="ui-resizable-handle ',F,'" style="',I,G.handle,'"></div>'].join("")).css(K);N.handles[S]=".ui-resizable-"+S;this.element.append(E.css(C?T:{}).css(N.knobHandles?D:{}).addClass(N.knobHandles?"ui-resizable-knob-handle":"").addClass(N.knobHandles))}if(N.knobHandles){this.element.addClass("ui-resizable-knob").css(!A.ui.css("ui-resizable-knob")?{}:{})}}this._renderAxis=function(Y){Y=Y||this.element;for(var V in N.handles){if(N.handles[V].constructor==String){N.handles[V]=A(N.handles[V],this.element).show()}if(N.transparent){N.handles[V].css({opacity:0})}if(this.element.is(".ui-wrapper")&&N._nodeName.match(/textarea|input|select|button/i)){var W=A(N.handles[V],this.element),X=0;X=/sw|ne|nw|se|n|s/.test(V)?W.outerHeight():W.outerWidth();var U=["padding",/ne|nw|n/.test(V)?"Top":/se|sw|s/.test(V)?"Bottom":/^e$/.test(V)?"Right":"Left"].join("");if(!N.transparent){Y.css(U,X)}this._proportionallyResize()}if(!A(N.handles[V]).length){continue}}};this._renderAxis(this.element);N._handles=A(".ui-resizable-handle",M.element);if(N.disableSelection){N._handles.each(function(U,V){A.ui.disableSelection(V)})}N._handles.mouseover(function(){if(!N.resizing){if(this.className){var U=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}M.axis=N.axis=U&&U[1]?U[1]:"se"}});if(N.autoHide){N._handles.hide();A(M.element).addClass("ui-resizable-autohide").hover(function(){A(this).removeClass("ui-resizable-autohide");N._handles.show()},function(){if(!N.resizing){A(this).addClass("ui-resizable-autohide");N._handles.hide()}})}this.mouseInit()},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,options:this.options,originalSize:this.originalSize,originalPosition:this.originalPosition}},propagate:function(C,B){A.ui.plugin.call(this,C,[B,this.ui()]);if(C!="resize"){this.element.triggerHandler(["resize",C].join(""),[B,this.ui()],this.options[C])}},destroy:function(){var D=this.element,C=D.children(".ui-resizable").get(0);this.mouseDestroy();var B=function(E){A(E).removeClass("ui-resizable ui-resizable-disabled").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};B(D);if(D.is(".ui-wrapper")&&C){D.parent().append(A(C).css({position:D.css("position"),width:D.outerWidth(),height:D.outerHeight(),top:D.css("top"),left:D.css("left")})).end().remove();B(C)}},mouseStart:function(K){if(this.options.disabled){return false}var J=false;for(var H in this.options.handles){if(A(this.options.handles[H])[0]==K.target){J=true}}if(!J){return false}var C=this.options,B=this.element.position(),D=this.element,I=function(O){return parseInt(O,10)||0},G=A.browser.msie&&A.browser.version<7;C.resizing=true;C.documentScroll={top:A(document).scrollTop(),left:A(document).scrollLeft()};if(D.is(".ui-draggable")||(/absolute/).test(D.css("position"))){var M=A.browser.msie&&!C.containment&&(/absolute/).test(D.css("position"))&&!(/relative/).test(D.parent().css("position"));var L=M?C.documentScroll.top:0,F=M?C.documentScroll.left:0;D.css({position:"absolute",top:(B.top+L),left:(B.left+F)})}if(A.browser.opera&&/relative/.test(D.css("position"))){D.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var N=I(this.helper.css("left")),E=I(this.helper.css("top"));if(C.containment){N+=A(C.containment).scrollLeft()||0;E+=A(C.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:N,top:E};this.size=C.helper||G?{width:D.outerWidth(),height:D.outerHeight()}:{width:D.width(),height:D.height()};this.originalSize=C.helper||G?{width:D.outerWidth(),height:D.outerHeight()}:{width:D.width(),height:D.height()};this.originalPosition={left:N,top:E};this.sizeDiff={width:D.outerWidth()-D.width(),height:D.outerHeight()-D.height()};this.originalMousePosition={left:K.pageX,top:K.pageY};C.aspectRatio=(typeof C.aspectRatio=="number")?C.aspectRatio:((this.originalSize.height/this.originalSize.width)||1);if(C.preserveCursor){A("body").css("cursor",this.axis+"-resize")}this.propagate("start",K);return true},mouseDrag:function(I){var D=this.helper,C=this.options,J={},M=this,F=this.originalMousePosition,K=this.axis;var N=(I.pageX-F.left)||0,L=(I.pageY-F.top)||0;var E=this._change[K];if(!E){return false}var H=E.apply(this,[I,N,L]),G=A.browser.msie&&A.browser.version<7,B=this.sizeDiff;if(C._aspectRatio||I.shiftKey){H=this._updateRatio(H,I)}H=this._respectSize(H,I);this.propagate("resize",I);D.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!C.helper&&C.proportionallyResize){this._proportionallyResize()}this._updateCache(H);this.element.triggerHandler("resize",[I,this.ui()],this.options["resize"]);return false},mouseStop:function(I){this.options.resizing=false;var E=this.options,H=function(M){return parseInt(M,10)||0},K=this;if(E.helper){var D=E.proportionallyResize,B=D&&(/textarea/i).test(D.get(0).nodeName),C=B&&A.ui.hasScroll(D.get(0),"left")?0:K.sizeDiff.height,G=B?0:K.sizeDiff.width;var L={width:(K.size.width-G),height:(K.size.height-C)},F=(parseInt(K.element.css("left"),10)+(K.position.left-K.originalPosition.left))||null,J=(parseInt(K.element.css("top"),10)+(K.position.top-K.originalPosition.top))||null;if(!E.animate){this.element.css(A.extend(L,{top:J,left:F}))}if(E.helper&&!E.animate){this._proportionallyResize()}}if(E.preserveCursor){A("body").css("cursor","auto")}this.propagate("stop",I);if(E.helper){this.helper.remove()}return false},_updateCache:function(B){var C=this.options;this.offset=this.helper.offset();if(B.left){this.position.left=B.left}if(B.top){this.position.top=B.top}if(B.height){this.size.height=B.height}if(B.width){this.size.width=B.width}},_updateRatio:function(D,E){var F=this.options,G=this.position,C=this.size,B=this.axis;if(D.height){D.width=(C.height/F.aspectRatio)}else{if(D.width){D.height=(C.width*F.aspectRatio)}}if(B=="sw"){D.left=G.left+(C.width-D.width);D.top=null}if(B=="nw"){D.top=G.top+(C.height-D.height);D.left=G.left+(C.width-D.width)}return D},_respectSize:function(H,I){var F=this.helper,E=this.options,N=E._aspectRatio||I.shiftKey,M=this.axis,P=H.width&&E.maxWidth&&E.maxWidth<H.width,J=H.height&&E.maxHeight&&E.maxHeight<H.height,D=H.width&&E.minWidth&&E.minWidth>H.width,O=H.height&&E.minHeight&&E.minHeight>H.height;if(D){H.width=E.minWidth}if(O){H.height=E.minHeight}if(P){H.width=E.maxWidth}if(J){H.height=E.maxHeight}var C=this.originalPosition.left+this.originalSize.width,L=this.position.top+this.size.height;var G=/sw|nw|w/.test(M),B=/nw|ne|n/.test(M);if(D&&G){H.left=C-E.minWidth}if(P&&G){H.left=C-E.maxWidth}if(O&&B){H.top=L-E.minHeight}if(J&&B){H.top=L-E.maxHeight}var K=!H.width&&!H.height;if(K&&!H.left&&H.top){H.top=null}else{if(K&&!H.top&&H.left){H.left=null}}return H},_proportionallyResize:function(){var F=this.options;if(!F.proportionallyResize){return }var D=F.proportionallyResize,C=this.helper||this.element;if(!F.borderDif){var B=[D.css("borderTopWidth"),D.css("borderRightWidth"),D.css("borderBottomWidth"),D.css("borderLeftWidth")],E=[D.css("paddingTop"),D.css("paddingRight"),D.css("paddingBottom"),D.css("paddingLeft")];F.borderDif=A.map(B,function(G,I){var H=parseInt(G,10)||0,J=parseInt(E[I],10)||0;return H+J})}D.css({height:(C.height()-F.borderDif[0]-F.borderDif[2])+"px",width:(C.width()-F.borderDif[1]-F.borderDif[3])+"px"})},_renderProxy:function(){var C=this.element,F=this.options;this.elementOffset=C.offset();if(F.helper){this.helper=this.helper||A('<div style="overflow:hidden;"></div>');var B=A.browser.msie&&A.browser.version<7,D=(B?1:0),E=(B?2:-1);this.helper.addClass(F.helper).css({width:C.outerWidth()+E,height:C.outerHeight()+E,position:"absolute",left:this.elementOffset.left-D+"px",top:this.elementOffset.top-D+"px",zIndex:++F.zIndex});this.helper.appendTo("body");if(F.disableSelection){A.ui.disableSelection(this.helper.get(0))}}else{this.helper=C}},_change:{e:function(D,C,B){return{width:this.originalSize.width+C}},w:function(F,C,B){var G=this.options,D=this.originalSize,E=this.originalPosition;return{left:E.left+C,width:D.width-C}},n:function(F,C,B){var G=this.options,D=this.originalSize,E=this.originalPosition;return{top:E.top+B,height:D.height-B}},s:function(D,C,B){return{height:this.originalSize.height+B}},se:function(D,C,B){return A.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[D,C,B]))},sw:function(D,C,B){return A.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[D,C,B]))},ne:function(D,C,B){return A.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[D,C,B]))},nw:function(D,C,B){return A.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[D,C,B]))}}}));A.extend(A.ui.resizable,{defaults:{cancel:":input",distance:1,delay:0,preventDefault:true,transparent:false,minWidth:10,minHeight:10,aspectRatio:false,disableSelection:true,preserveCursor:true,autoHide:false,knobHandles:false}});A.ui.plugin.add("resizable","containment",{start:function(I,K){var E=K.options,M=A(this).data("resizable"),G=M.element;var C=E.containment,F=(C instanceof A)?C.get(0):(/parent/.test(C))?G.parent().get(0):C;if(!F){return }M.containerElement=A(F);if(/document/.test(C)||C==document){M.containerOffset={left:0,top:0};M.containerPosition={left:0,top:0};M.parentData={element:A(document),left:0,top:0,width:A(document).width(),height:A(document).height()||document.body.parentNode.scrollHeight}}else{M.containerOffset=A(F).offset();M.containerPosition=A(F).position();M.containerSize={height:A(F).innerHeight(),width:A(F).innerWidth()};var J=M.containerOffset,B=M.containerSize.height,H=M.containerSize.width,D=(A.ui.hasScroll(F,"left")?F.scrollWidth:H),L=(A.ui.hasScroll(F)?F.scrollHeight:B);M.parentData={element:F,left:J.left,top:J.top,width:D,height:L}}},resize:function(H,K){var E=K.options,N=A(this).data("resizable"),C=N.containerSize,J=N.containerOffset,G=N.size,I=N.position,L=E._aspectRatio||H.shiftKey,B={top:0,left:0},D=N.containerElement;if(D[0]!=document&&/static/.test(D.css("position"))){B=N.containerPosition}if(I.left<(E.helper?J.left:B.left)){N.size.width=N.size.width+(E.helper?(N.position.left-J.left):(N.position.left-B.left));if(L){N.size.height=N.size.width*E.aspectRatio}N.position.left=E.helper?J.left:B.left}if(I.top<(E.helper?J.top:0)){N.size.height=N.size.height+(E.helper?(N.position.top-J.top):N.position.top);if(L){N.size.width=N.size.height/E.aspectRatio}N.position.top=E.helper?J.top:0}var F=(E.helper?N.offset.left-J.left:(N.position.left-B.left))+N.sizeDiff.width,M=(E.helper?N.offset.top-J.top:N.position.top)+N.sizeDiff.height;if(F+N.size.width>=N.parentData.width){N.size.width=N.parentData.width-F;if(L){N.size.height=N.size.width*E.aspectRatio}}if(M+N.size.height>=N.parentData.height){N.size.height=N.parentData.height-M;if(L){N.size.width=N.size.height/E.aspectRatio}}},stop:function(G,J){var C=J.options,L=A(this).data("resizable"),H=L.position,I=L.containerOffset,B=L.containerPosition,D=L.containerElement;var E=A(L.helper),M=E.offset(),K=E.innerWidth(),F=E.innerHeight();if(C.helper&&!C.animate&&/relative/.test(D.css("position"))){A(this).css({left:(M.left-I.left),top:(M.top-I.top),width:K,height:F})}if(C.helper&&!C.animate&&/static/.test(D.css("position"))){A(this).css({left:B.left+(M.left-I.left),top:B.top+(M.top-I.top),width:K,height:F})}}});A.ui.plugin.add("resizable","grid",{resize:function(H,J){var D=J.options,L=A(this).data("resizable"),G=L.size,E=L.originalSize,F=L.originalPosition,K=L.axis,I=D._aspectRatio||H.shiftKey;D.grid=typeof D.grid=="number"?[D.grid,D.grid]:D.grid;var C=Math.round((G.width-E.width)/(D.grid[0]||1))*(D.grid[0]||1),B=Math.round((G.height-E.height)/(D.grid[1]||1))*(D.grid[1]||1);if(/^(se|s|e)$/.test(K)){L.size.width=E.width+C;L.size.height=E.height+B}else{if(/^(ne)$/.test(K)){L.size.width=E.width+C;L.size.height=E.height+B;L.position.top=F.top-B}else{if(/^(sw)$/.test(K)){L.size.width=E.width+C;L.size.height=E.height+B;L.position.left=F.left-C}else{L.size.width=E.width+C;L.size.height=E.height+B;L.position.top=F.top-B;L.position.left=F.left-C}}}}});A.ui.plugin.add("resizable","animate",{stop:function(I,K){var F=K.options,L=A(this).data("resizable");var E=F.proportionallyResize,B=E&&(/textarea/i).test(E.get(0).nodeName),C=B&&A.ui.hasScroll(E.get(0),"left")?0:L.sizeDiff.height,H=B?0:L.sizeDiff.width;var D={width:(L.size.width-H),height:(L.size.height-C)},G=(parseInt(L.element.css("left"),10)+(L.position.left-L.originalPosition.left))||null,J=(parseInt(L.element.css("top"),10)+(L.position.top-L.originalPosition.top))||null;L.element.animate(A.extend(D,J&&G?{top:J,left:G}:{}),{duration:F.animateDuration||"slow",easing:F.animateEasing||"swing",step:function(){var M={width:parseInt(L.element.css("width"),10),height:parseInt(L.element.css("height"),10),top:parseInt(L.element.css("top"),10),left:parseInt(L.element.css("left"),10)};if(E){E.css({width:M.width,height:M.height})}L._updateCache(M);L.propagate("animate",I)}})}});A.ui.plugin.add("resizable","ghost",{start:function(E,D){var F=D.options,B=A(this).data("resizable"),G=F.proportionallyResize,C=B.size;if(!G){B.ghost=B.element.clone()}else{B.ghost=G.clone()}B.ghost.css({opacity:0.25,display:"block",position:"relative",height:C.height,width:C.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof F.ghost=="string"?F.ghost:"");B.ghost.appendTo(B.helper)},resize:function(D,C){var E=C.options,B=A(this).data("resizable"),F=E.proportionallyResize;if(B.ghost){B.ghost.css({position:"relative",height:B.size.height,width:B.size.width})}},stop:function(D,C){var E=C.options,B=A(this).data("resizable"),F=E.proportionallyResize;if(B.ghost&&B.helper){B.helper.get(0).removeChild(B.ghost.get(0))}}});A.ui.plugin.add("resizable","alsoResize",{start:function(E,C){var F=C.options,B=A(this).data("resizable"),D=function(G){A(G).each(function(){A(this).data("resizable-alsoresize",{width:parseInt(A(this).width(),10),height:parseInt(A(this).height(),10),left:parseInt(A(this).css("left"),10),top:parseInt(A(this).css("top"),10)})})};if(typeof (F.alsoResize)=="object"){if(F.alsoResize.length){F.alsoResize=F.alsoResize[0];D(F.alsoResize)}else{A.each(F.alsoResize,function(G,H){D(G)})}}else{D(F.alsoResize)}},resize:function(F,E){var G=E.options,C=A(this).data("resizable"),D=C.originalSize,I=C.originalPosition;var H={height:(C.size.height-D.height)||0,width:(C.size.width-D.width)||0,top:(C.position.top-I.top)||0,left:(C.position.left-I.left)||0},B=function(J,K){A(J).each(function(){var N=A(this).data("resizable-alsoresize"),M={},L=K&&K.length?K:["width","height","top","left"];A.each(L||["width","height","top","left"],function(O,Q){var P=(N[Q]||0)+(H[Q]||0);if(P&&P>=0){M[Q]=P||null}});A(this).css(M)})};if(typeof (G.alsoResize)=="object"){A.each(G.alsoResize,function(J,K){B(J,K)})}else{B(G.alsoResize)}},stop:function(C,B){A(this).removeData("resizable-alsoresize-start")}})})(jQuery);(function(A){A.widget("ui.selectable",A.extend({},A.ui.mouse,{init:function(){var B=this;this.element.addClass("ui-selectable");this.dragged=false;var C;this.refresh=function(){C=A(B.options.filter,B.element[0]);C.each(function(){var D=A(this);var E=D.offset();A.data(this,"selectable-item",{element:this,$element:D,left:E.left,top:E.top,right:E.left+D.width(),bottom:E.top+D.height(),startselected:false,selected:D.hasClass("ui-selected"),selecting:D.hasClass("ui-selecting"),unselecting:D.hasClass("ui-unselecting")})})};this.refresh();this.selectees=C.addClass("ui-selectee");this.mouseInit();this.helper=A(document.createElement("div")).css({border:"1px dotted black"})},toggle:function(){if(this.options.disabled){this.enable()}else{this.disable()}},destroy:function(){this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this.mouseDestroy()},mouseStart:function(E){var C=this;this.opos=[E.pageX,E.pageY];if(this.options.disabled){return }var D=this.options;this.selectees=A(D.filter,this.element[0]);this.element.triggerHandler("selectablestart",[E,{"selectable":this.element[0],"options":D}],D.start);A("body").append(this.helper);this.helper.css({"z-index":100,"position":"absolute","left":E.clientX,"top":E.clientY,"width":0,"height":0});if(D.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var F=A.data(this,"selectable-item");F.startselected=true;if(!E.ctrlKey){F.$element.removeClass("ui-selected");F.selected=false;F.$element.addClass("ui-unselecting");F.unselecting=true;C.element.triggerHandler("selectableunselecting",[E,{selectable:C.element[0],unselecting:F.element,options:D}],D.unselecting)}});var B=false;A(E.target).parents().andSelf().each(function(){if(A.data(this,"selectable-item")){B=true}});return this.options.keyboard?!B:true},mouseDrag:function(I){var C=this;this.dragged=true;if(this.options.disabled){return }var E=this.options;var D=this.opos[0],H=this.opos[1],B=I.pageX,G=I.pageY;if(D>B){var F=B;B=D;D=F}if(H>G){var F=G;G=H;H=F}this.helper.css({left:D,top:H,width:B-D,height:G-H});this.selectees.each(function(){var J=A.data(this,"selectable-item");if(!J||J.element==C.element[0]){return }var K=false;if(E.tolerance=="touch"){K=(!(J.left>B||J.right<D||J.top>G||J.bottom<H))}else{if(E.tolerance=="fit"){K=(J.left>D&&J.right<B&&J.top>H&&J.bottom<G)}}if(K){if(J.selected){J.$element.removeClass("ui-selected");J.selected=false}if(J.unselecting){J.$element.removeClass("ui-unselecting");J.unselecting=false}if(!J.selecting){J.$element.addClass("ui-selecting");J.selecting=true;C.element.triggerHandler("selectableselecting",[I,{selectable:C.element[0],selecting:J.element,options:E}],E.selecting)}}else{if(J.selecting){if(I.ctrlKey&&J.startselected){J.$element.removeClass("ui-selecting");J.selecting=false;J.$element.addClass("ui-selected");J.selected=true}else{J.$element.removeClass("ui-selecting");J.selecting=false;if(J.startselected){J.$element.addClass("ui-unselecting");J.unselecting=true}C.element.triggerHandler("selectableunselecting",[I,{selectable:C.element[0],unselecting:J.element,options:E}],E.unselecting)}}if(J.selected){if(!I.ctrlKey&&!J.startselected){J.$element.removeClass("ui-selected");J.selected=false;J.$element.addClass("ui-unselecting");J.unselecting=true;C.element.triggerHandler("selectableunselecting",[I,{selectable:C.element[0],unselecting:J.element,options:E}],E.unselecting)}}}});return false},mouseStop:function(D){var B=this;this.dragged=false;var C=this.options;A(".ui-unselecting",this.element[0]).each(function(){var E=A.data(this,"selectable-item");E.$element.removeClass("ui-unselecting");E.unselecting=false;E.startselected=false;B.element.triggerHandler("selectableunselected",[D,{selectable:B.element[0],unselected:E.element,options:C}],C.unselected)});A(".ui-selecting",this.element[0]).each(function(){var E=A.data(this,"selectable-item");E.$element.removeClass("ui-selecting").addClass("ui-selected");E.selecting=false;E.selected=true;E.startselected=true;B.element.triggerHandler("selectableselected",[D,{selectable:B.element[0],selected:E.element,options:C}],C.selected)});this.element.triggerHandler("selectablestop",[D,{selectable:B.element[0],options:this.options}],this.options.stop);this.helper.remove();return false}}));A.extend(A.ui.selectable,{defaults:{distance:1,delay:0,cancel:":input",appendTo:"body",autoRefresh:true,filter:"*",tolerance:"touch"}})})(jQuery);(function(B){function A(E,D){var C=B.browser.safari&&B.browser.version<522;if(E.contains&&!C){return E.contains(D)}if(E.compareDocumentPosition){return !!(E.compareDocumentPosition(D)&16)}while(D=D.parentNode){if(D==E){return true}}return false}B.widget("ui.sortable",B.extend({},B.ui.mouse,{init:function(){var C=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?(/left|right/).test(this.items[0].item.css("float")):false;if(!(/(relative|absolute|fixed)/).test(this.element.css("position"))){this.element.css("position","relative")}this.offset=this.element.offset();this.mouseInit()},plugins:{},ui:function(C){return{helper:(C||this)["helper"],placeholder:(C||this)["placeholder"]||B([]),position:(C||this)["position"],absolutePosition:(C||this)["positionAbs"],options:this.options,element:this.element,item:(C||this)["currentItem"],sender:C?C.element:null}},propagate:function(F,E,C,D){B.ui.plugin.call(this,F,[E,this.ui(C)]);if(!D){this.element.triggerHandler(F=="sort"?F:"sort"+F,[E,this.ui(C)],this.options[F])}},serialize:function(E){var C=(B.isFunction(this.options.items)?this.options.items.call(this.element):B(this.options.items,this.element)).not(".ui-sortable-helper");var D=[];E=E||{};C.each(function(){var F=(B(this).attr(E.attribute||"id")||"").match(E.expression||(/(.+)[-=_](.+)/));if(F){D.push((E.key||F[1])+"[]="+(E.key&&E.expression?F[1]:F[2]))}});return D.join("&")},toArray:function(C){var D=(B.isFunction(this.options.items)?this.options.items.call(this.element):B(this.options.items,this.element)).not(".ui-sortable-helper");var E=[];D.each(function(){E.push(B(this).attr(C||"id"))});return E},intersectsWith:function(J){var E=this.positionAbs.left,D=E+this.helperProportions.width,I=this.positionAbs.top,H=I+this.helperProportions.height;var F=J.left,C=F+J.width,K=J.top,G=K+J.height;if(this.options.tolerance=="pointer"||this.options.forcePointerForContainers||(this.options.tolerance=="guess"&&this.helperProportions[this.floating?"width":"height"]>J[this.floating?"width":"height"])){return(I+this.offset.click.top>K&&I+this.offset.click.top<G&&E+this.offset.click.left>F&&E+this.offset.click.left<C)}else{return(F<E+(this.helperProportions.width/2)&&D-(this.helperProportions.width/2)<C&&K<I+(this.helperProportions.height/2)&&H-(this.helperProportions.height/2)<G)}},intersectsWithEdge:function(J){var E=this.positionAbs.left,D=E+this.helperProportions.width,I=this.positionAbs.top,H=I+this.helperProportions.height;var F=J.left,C=F+J.width,K=J.top,G=K+J.height;if(this.options.tolerance=="pointer"||(this.options.tolerance=="guess"&&this.helperProportions[this.floating?"width":"height"]>J[this.floating?"width":"height"])){if(!(I+this.offset.click.top>K&&I+this.offset.click.top<G&&E+this.offset.click.left>F&&E+this.offset.click.left<C)){return false}if(this.floating){if(E+this.offset.click.left>F&&E+this.offset.click.left<F+J.width/2){return 2}if(E+this.offset.click.left>F+J.width/2&&E+this.offset.click.left<C){return 1}}else{if(I+this.offset.click.top>K&&I+this.offset.click.top<K+J.height/2){return 2}if(I+this.offset.click.top>K+J.height/2&&I+this.offset.click.top<G){return 1}}}else{if(!(F<E+(this.helperProportions.width/2)&&D-(this.helperProportions.width/2)<C&&K<I+(this.helperProportions.height/2)&&H-(this.helperProportions.height/2)<G)){return false}if(this.floating){if(D>F&&E<F){return 2}if(E<C&&D>C){return 1}}else{if(H>K&&I<K){return 1}if(I<G&&H>G){return 2}}}return false},refresh:function(){this.refreshItems();this.refreshPositions()},refreshItems:function(){this.items=[];this.containers=[this];var D=this.items;var C=this;var F=[[B.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):B(this.options.items,this.element),this]];if(this.options.connectWith){for(var G=this.options.connectWith.length-1;G>=0;G--){var I=B(this.options.connectWith[G]);for(var E=I.length-1;E>=0;E--){var H=B.data(I[E],"sortable");if(H&&!H.options.disabled){F.push([B.isFunction(H.options.items)?H.options.items.call(H.element):B(H.options.items,H.element),H]);this.containers.push(H)}}}}for(var G=F.length-1;G>=0;G--){F[G][0].each(function(){B.data(this,"sortable-item",F[G][1]);D.push({item:B(this),instance:F[G][1],width:0,height:0,left:0,top:0})})}},refreshPositions:function(D){if(this.offsetParent){var C=this.offsetParent.offset();this.offset.parent={top:C.top+this.offsetParentBorders.top,left:C.left+this.offsetParentBorders.left}}for(var F=this.items.length-1;F>=0;F--){if(this.items[F].instance!=this.currentContainer&&this.currentContainer&&this.items[F].item[0]!=this.currentItem[0]){continue}var E=this.options.toleranceElement?B(this.options.toleranceElement,this.items[F].item):this.items[F].item;if(!D){this.items[F].width=E[0].offsetWidth;this.items[F].height=E[0].offsetHeight}var G=E.offset();this.items[F].left=G.left;this.items[F].top=G.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var F=this.containers.length-1;F>=0;F--){var G=this.containers[F].element.offset();this.containers[F].containerCache.left=G.left;this.containers[F].containerCache.top=G.top;this.containers[F].containerCache.width=this.containers[F].element.outerWidth();this.containers[F].containerCache.height=this.containers[F].element.outerHeight()}}},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this.mouseDestroy();for(var C=this.items.length-1;C>=0;C--){this.items[C].item.removeData("sortable-item")}},createPlaceholder:function(E){var C=E||this,F=C.options;if(F.placeholder.constructor==String){var D=F.placeholder;F.placeholder={element:function(){return B("<div></div>").addClass(D)[0]},update:function(G,H){H.css(G.offset()).css({width:G.outerWidth(),height:G.outerHeight()})}}}C.placeholder=B(F.placeholder.element.call(C.element,C.currentItem)).appendTo("body").css({position:"absolute"});F.placeholder.update.call(C.element,C.currentItem,C.placeholder)},contactContainers:function(F){for(var D=this.containers.length-1;D>=0;D--){if(this.intersectsWith(this.containers[D].containerCache)){if(!this.containers[D].containerCache.over){if(this.currentContainer!=this.containers[D]){var I=10000;var H=null;var E=this.positionAbs[this.containers[D].floating?"left":"top"];for(var C=this.items.length-1;C>=0;C--){if(!A(this.containers[D].element[0],this.items[C].item[0])){continue}var G=this.items[C][this.containers[D].floating?"left":"top"];if(Math.abs(G-E)<I){I=Math.abs(G-E);H=this.items[C]}}if(!H&&!this.options.dropOnEmpty){continue}if(this.placeholder){this.placeholder.remove()}if(this.containers[D].options.placeholder){this.containers[D].createPlaceholder(this)}else{this.placeholder=null}this.currentContainer=this.containers[D];H?this.rearrange(F,H,null,true):this.rearrange(F,null,this.containers[D].element,true);this.propagate("change",F);this.containers[D].propagate("change",F,this)}this.containers[D].propagate("over",F,this);this.containers[D].containerCache.over=1}}else{if(this.containers[D].containerCache.over){this.containers[D].propagate("out",F,this);this.containers[D].containerCache.over=0}}}},mouseCapture:function(G,F){if(this.options.disabled||this.options.type=="static"){return false}this.refreshItems();var E=null,D=this,C=B(G.target).parents().each(function(){if(B.data(this,"sortable-item")==D){E=B(this);return false}});if(B.data(G.target,"sortable-item")==D){E=B(G.target)}if(!E){return false}if(this.options.handle&&!F){var H=false;B(this.options.handle,E).find("*").andSelf().each(function(){if(this==G.target){H=true}});if(!H){return false}}this.currentItem=E;return true},mouseStart:function(H,F,C){var J=this.options;this.currentContainer=this;this.refreshPositions();this.helper=typeof J.helper=="function"?B(J.helper.apply(this.element[0],[H,this.currentItem])):this.currentItem.clone();if(!this.helper.parents("body").length){B(J.appendTo!="parent"?J.appendTo:this.currentItem[0].parentNode)[0].appendChild(this.helper[0])}this.helper.css({position:"absolute",clear:"both"}).addClass("ui-sortable-helper");this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)};this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.offset.click={left:H.pageX-this.offset.left,top:H.pageY-this.offset.top};this.offsetParent=this.helper.offsetParent();var D=this.offsetParent.offset();this.offsetParentBorders={top:(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)};this.offset.parent={top:D.top+this.offsetParentBorders.top,left:D.left+this.offsetParentBorders.left};this.originalPosition=this.generatePosition(H);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};if(J.placeholder){this.createPlaceholder()}this.propagate("start",H);this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()};if(J.cursorAt){if(J.cursorAt.left!=undefined){this.offset.click.left=J.cursorAt.left}if(J.cursorAt.right!=undefined){this.offset.click.left=this.helperProportions.width-J.cursorAt.right}if(J.cursorAt.top!=undefined){this.offset.click.top=J.cursorAt.top}if(J.cursorAt.bottom!=undefined){this.offset.click.top=this.helperProportions.height-J.cursorAt.bottom}}if(J.containment){if(J.containment=="parent"){J.containment=this.helper[0].parentNode}if(J.containment=="document"||J.containment=="window"){this.containment=[0-this.offset.parent.left,0-this.offset.parent.top,B(J.containment=="document"?document:window).width()-this.offset.parent.left-this.helperProportions.width-this.margins.left-(parseInt(this.element.css("marginRight"),10)||0),(B(J.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.offset.parent.top-this.helperProportions.height-this.margins.top-(parseInt(this.element.css("marginBottom"),10)||0)]}if(!(/^(document|window|parent)$/).test(J.containment)){var G=B(J.containment)[0];var I=B(J.containment).offset();this.containment=[I.left+(parseInt(B(G).css("borderLeftWidth"),10)||0)-this.offset.parent.left,I.top+(parseInt(B(G).css("borderTopWidth"),10)||0)-this.offset.parent.top,I.left+Math.max(G.scrollWidth,G.offsetWidth)-(parseInt(B(G).css("borderLeftWidth"),10)||0)-this.offset.parent.left-this.helperProportions.width-this.margins.left-(parseInt(this.currentItem.css("marginRight"),10)||0),I.top+Math.max(G.scrollHeight,G.offsetHeight)-(parseInt(B(G).css("borderTopWidth"),10)||0)-this.offset.parent.top-this.helperProportions.height-this.margins.top-(parseInt(this.currentItem.css("marginBottom"),10)||0)]}}if(this.options.placeholder!="clone"){this.currentItem.css("visibility","hidden")}if(!C){for(var E=this.containers.length-1;E>=0;E--){this.containers[E].propagate("activate",H,this)}}if(B.ui.ddmanager){B.ui.ddmanager.current=this}if(B.ui.ddmanager&&!J.dropBehaviour){B.ui.ddmanager.prepareOffsets(this,H)}this.dragging=true;this.mouseDrag(H);return true},convertPositionTo:function(D,E){if(!E){E=this.position}var C=D=="absolute"?1:-1;return{top:(E.top+this.offset.parent.top*C-(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)*C+this.margins.top*C),left:(E.left+this.offset.parent.left*C-(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft)*C+this.margins.left*C)}},generatePosition:function(F){var G=this.options;var C={top:(F.pageY-this.offset.click.top-this.offset.parent.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)),left:(F.pageX-this.offset.click.left-this.offset.parent.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft))};if(!this.originalPosition){return C}if(this.containment){if(C.left<this.containment[0]){C.left=this.containment[0]}if(C.top<this.containment[1]){C.top=this.containment[1]}if(C.left>this.containment[2]){C.left=this.containment[2]}if(C.top>this.containment[3]){C.top=this.containment[3]}}if(G.grid){var E=this.originalPosition.top+Math.round((C.top-this.originalPosition.top)/G.grid[1])*G.grid[1];C.top=this.containment?(!(E<this.containment[1]||E>this.containment[3])?E:(!(E<this.containment[1])?E-G.grid[1]:E+G.grid[1])):E;var D=this.originalPosition.left+Math.round((C.left-this.originalPosition.left)/G.grid[0])*G.grid[0];C.left=this.containment?(!(D<this.containment[0]||D>this.containment[2])?D:(!(D<this.containment[0])?D-G.grid[0]:D+G.grid[0])):D}return C},mouseDrag:function(D){this.position=this.generatePosition(D);this.positionAbs=this.convertPositionTo("absolute");B.ui.plugin.call(this,"sort",[D,this.ui()]);this.positionAbs=this.convertPositionTo("absolute");this.helper[0].style.left=this.position.left+"px";this.helper[0].style.top=this.position.top+"px";for(var C=this.items.length-1;C>=0;C--){var E=this.intersectsWithEdge(this.items[C]);if(!E){continue}if(this.items[C].item[0]!=this.currentItem[0]&&this.currentItem[E==1?"next":"prev"]()[0]!=this.items[C].item[0]&&!A(this.currentItem[0],this.items[C].item[0])&&(this.options.type=="semi-dynamic"?!A(this.element[0],this.items[C].item[0]):true)){this.direction=E==1?"down":"up";this.rearrange(D,this.items[C]);this.propagate("change",D);break}}this.contactContainers(D);if(B.ui.ddmanager){B.ui.ddmanager.drag(this,D)}this.element.triggerHandler("sort",[D,this.ui()],this.options["sort"]);return false},rearrange:function(H,G,D,F){D?D[0].appendChild(this.currentItem[0]):G.item[0].parentNode.insertBefore(this.currentItem[0],(this.direction=="down"?G.item[0]:G.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var E=this,C=this.counter;window.setTimeout(function(){if(C==E.counter){E.refreshPositions(!F)}},0);if(this.options.placeholder){this.options.placeholder.update.call(this.element,this.currentItem,this.placeholder)}},mouseStop:function(E,D){if(B.ui.ddmanager&&!this.options.dropBehaviour){B.ui.ddmanager.drop(this,E)}if(this.options.revert){var C=this;var F=C.currentItem.offset();if(C.placeholder){C.placeholder.animate({opacity:"hide"},(parseInt(this.options.revert,10)||500)-50)}B(this.helper).animate({left:F.left-this.offset.parent.left-C.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:F.top-this.offset.parent.top-C.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){C.clear(E)})}else{this.clear(E,D)}return false},clear:function(E,D){if(this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0]){this.propagate("update",E,null,D)}if(!A(this.element[0],this.currentItem[0])){this.propagate("remove",E,null,D);for(var C=this.containers.length-1;C>=0;C--){if(A(this.containers[C].element[0],this.currentItem[0])){this.containers[C].propagate("update",E,this,D);this.containers[C].propagate("receive",E,this,D)}}}for(var C=this.containers.length-1;C>=0;C--){this.containers[C].propagate("deactivate",E,this,D);if(this.containers[C].containerCache.over){this.containers[C].propagate("out",E,this);this.containers[C].containerCache.over=0}}this.dragging=false;if(this.cancelHelperRemoval){this.propagate("stop",E,null,D);return false}B(this.currentItem).css("visibility","");if(this.placeholder){this.placeholder.remove()}this.helper.remove();this.helper=null;this.propagate("stop",E,null,D);return true}}));B.extend(B.ui.sortable,{getter:"serialize toArray",defaults:{helper:"clone",tolerance:"guess",distance:1,delay:0,scroll:true,scrollSensitivity:20,scrollSpeed:20,cancel:":input",items:"> *",zIndex:1000,dropOnEmpty:true,appendTo:"parent"}});B.ui.plugin.add("sortable","cursor",{start:function(E,D){var C=B("body");if(C.css("cursor")){D.options._cursor=C.css("cursor")}C.css("cursor",D.options.cursor)},stop:function(D,C){if(C.options._cursor){B("body").css("cursor",C.options._cursor)}}});B.ui.plugin.add("sortable","zIndex",{start:function(E,D){var C=D.helper;if(C.css("zIndex")){D.options._zIndex=C.css("zIndex")}C.css("zIndex",D.options.zIndex)},stop:function(D,C){if(C.options._zIndex){B(C.helper).css("zIndex",C.options._zIndex)}}});B.ui.plugin.add("sortable","opacity",{start:function(E,D){var C=D.helper;if(C.css("opacity")){D.options._opacity=C.css("opacity")}C.css("opacity",D.options.opacity)},stop:function(D,C){if(C.options._opacity){B(C.helper).css("opacity",C.options._opacity)}}});B.ui.plugin.add("sortable","scroll",{start:function(E,D){var F=D.options;var C=B(this).data("sortable");C.overflowY=function(G){do{if(/auto|scroll/.test(G.css("overflow"))||(/auto|scroll/).test(G.css("overflow-y"))){return G}G=G.parent()}while(G[0].parentNode);return B(document)}(C.currentItem);C.overflowX=function(G){do{if(/auto|scroll/.test(G.css("overflow"))||(/auto|scroll/).test(G.css("overflow-x"))){return G}G=G.parent()}while(G[0].parentNode);return B(document)}(C.currentItem);if(C.overflowY[0]!=document&&C.overflowY[0].tagName!="HTML"){C.overflowYOffset=C.overflowY.offset()}if(C.overflowX[0]!=document&&C.overflowX[0].tagName!="HTML"){C.overflowXOffset=C.overflowX.offset()}},sort:function(E,D){var F=D.options;var C=B(this).data("sortable");if(C.overflowY[0]!=document&&C.overflowY[0].tagName!="HTML"){if((C.overflowYOffset.top+C.overflowY[0].offsetHeight)-E.pageY<F.scrollSensitivity){C.overflowY[0].scrollTop=C.overflowY[0].scrollTop+F.scrollSpeed}if(E.pageY-C.overflowYOffset.top<F.scrollSensitivity){C.overflowY[0].scrollTop=C.overflowY[0].scrollTop-F.scrollSpeed}}else{if(E.pageY-B(document).scrollTop()<F.scrollSensitivity){B(document).scrollTop(B(document).scrollTop()-F.scrollSpeed)}if(B(window).height()-(E.pageY-B(document).scrollTop())<F.scrollSensitivity){B(document).scrollTop(B(document).scrollTop()+F.scrollSpeed)}}if(C.overflowX[0]!=document&&C.overflowX[0].tagName!="HTML"){if((C.overflowXOffset.left+C.overflowX[0].offsetWidth)-E.pageX<F.scrollSensitivity){C.overflowX[0].scrollLeft=C.overflowX[0].scrollLeft+F.scrollSpeed}if(E.pageX-C.overflowXOffset.left<F.scrollSensitivity){C.overflowX[0].scrollLeft=C.overflowX[0].scrollLeft-F.scrollSpeed}}else{if(E.pageX-B(document).scrollLeft()<F.scrollSensitivity){B(document).scrollLeft(B(document).scrollLeft()-F.scrollSpeed)}if(B(window).width()-(E.pageX-B(document).scrollLeft())<F.scrollSensitivity){B(document).scrollLeft(B(document).scrollLeft()+F.scrollSpeed)}}}});B.ui.plugin.add("sortable","axis",{sort:function(E,D){var C=B(this).data("sortable");if(D.options.axis=="y"){C.position.left=C.originalPosition.left}if(D.options.axis=="x"){C.position.top=C.originalPosition.top}}})})(jQuery);(function(E){E.widget("ui.accordion",{init:function(){var G=this.options;if(G.navigation){var J=this.element.find("a").filter(G.navigationFilter);if(J.length){if(J.filter(G.header).length){G.active=J}else{G.active=J.parent().parent().prev();J.addClass("current")}}}G.headers=this.element.find(G.header);G.active=C(G.headers,G.active);if(E.browser.msie){this.element.find("a").css("zoom","1")}if(!this.element.hasClass("ui-accordion")){this.element.addClass("ui-accordion");E("<span class='ui-accordion-left'/>").insertBefore(G.headers);E("<span class='ui-accordion-right'/>").appendTo(G.headers);G.headers.addClass("ui-accordion-header").attr("tabindex","0")}var I;if(G.fillSpace){I=this.element.parent().height();G.headers.each(function(){I-=E(this).outerHeight()});var H=0;G.headers.next().each(function(){H=Math.max(H,E(this).innerHeight()-E(this).height())}).height(I-H)}else{if(G.autoHeight){I=0;G.headers.next().each(function(){I=Math.max(I,E(this).outerHeight())}).height(I)}}G.headers.not(G.active||"").next().hide();G.active.parent().andSelf().addClass(G.selectedClass);if(G.event){this.element.bind((G.event)+".accordion",F)}},activate:function(G){F.call(this.element[0],{target:C(this.options.headers,G)[0]})},destroy:function(){this.options.headers.next().css("display","");if(this.options.fillSpace||this.options.autoHeight){this.options.headers.next().css("height","")}E.removeData(this.element[0],"accordion");this.element.removeClass("ui-accordion").unbind(".accordion")}});function B(H,G){return function(){return H.apply(G,arguments)}}function D(I){if(!E.data(this,"accordion")){return }var G=E.data(this,"accordion");var H=G.options;H.running=I?0:--H.running;if(H.running){return }if(H.clearStyle){H.toShow.add(H.toHide).css({height:"",overflow:""})}E(this).triggerHandler("accordionchange",[E.event.fix({type:"accordionchange",target:G.element[0]}),H.data],H.change)}function A(G,K,L,J,M){var I=E.data(this,"accordion").options;I.toShow=G;I.toHide=K;I.data=L;var H=B(D,this);I.running=K.size()===0?G.size():K.size();if(I.animated){if(!I.alwaysOpen&&J){E.ui.accordion.animations[I.animated]({toShow:jQuery([]),toHide:K,complete:H,down:M,autoHeight:I.autoHeight})}else{E.ui.accordion.animations[I.animated]({toShow:G,toHide:K,complete:H,down:M,autoHeight:I.autoHeight})}}else{if(!I.alwaysOpen&&J){G.toggle()}else{K.hide();G.show()}H(true)}}function F(L){var J=E.data(this,"accordion").options;if(J.disabled){return false}if(!L.target&&!J.alwaysOpen){J.active.parent().andSelf().toggleClass(J.selectedClass);var I=J.active.next(),M={options:J,newHeader:jQuery([]),oldHeader:J.active,newContent:jQuery([]),oldContent:I},G=(J.active=E([]));A.call(this,G,I,M);return false}var K=E(L.target);K=E(K.parents(J.header)[0]||K);var H=K[0]==J.active[0];if(J.running||(J.alwaysOpen&&H)){return false}if(!K.is(J.header)){return }J.active.parent().andSelf().toggleClass(J.selectedClass);if(!H){K.parent().andSelf().addClass(J.selectedClass)}var G=K.next(),I=J.active.next(),M={options:J,newHeader:K,oldHeader:J.active,newContent:G,oldContent:I},N=J.headers.index(J.active[0])>J.headers.index(K[0]);J.active=H?E([]):K;A.call(this,G,I,M,H,N);return false}function C(H,G){return G!=undefined?typeof G=="number"?H.filter(":eq("+G+")"):H.not(H.not(G)):G===false?E([]):H.filter(":eq(0)")}E.extend(E.ui.accordion,{defaults:{selectedClass:"selected",alwaysOpen:true,animated:"slide",event:"click",header:"a",autoHeight:true,running:0,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},animations:{slide:function(G,I){G=E.extend({easing:"swing",duration:300},G,I);if(!G.toHide.size()){G.toShow.animate({height:"show"},G);return }var H=G.toHide.height(),J=G.toShow.height(),K=J/H;G.toShow.css({height:0,overflow:"hidden"}).show();G.toHide.filter(":hidden").each(G.complete).end().filter(":visible").animate({height:"hide"},{step:function(L){var M=(H-L)*K;if(E.browser.msie||E.browser.opera){M=Math.ceil(M)}G.toShow.height(M)},duration:G.duration,easing:G.easing,complete:function(){if(!G.autoHeight){G.toShow.css("height","auto")}G.complete()}})},bounceslide:function(G){this.slide(G,{easing:G.down?"bounceout":"swing",duration:G.down?1000:200})},easeslide:function(G){this.slide(G,{easing:"easeinout",duration:700})}}});E.fn.activate=function(G){return this.accordion("activate",G)}})(jQuery);(function(B){var A={dragStart:"start.draggable",drag:"drag.draggable",dragStop:"stop.draggable",maxHeight:"maxHeight.resizable",minHeight:"minHeight.resizable",maxWidth:"maxWidth.resizable",minWidth:"minWidth.resizable",resizeStart:"start.resizable",resize:"drag.resizable",resizeStop:"stop.resizable"};B.widget("ui.dialog",{init:function(){var J=this,K=this.options,D=typeof K.resizable=="string"?K.resizable:"n,e,s,w,se,sw,ne,nw",E=this.element.addClass("ui-dialog-content").wrap("<div/>").wrap("<div/>"),G=(this.uiDialogContainer=E.parent().addClass("ui-dialog-container").css({position:"relative",width:"100%",height:"100%"})),H=K.title||E.attr("title")||"",C=(this.uiDialogTitlebar=B('<div class="ui-dialog-titlebar"/>')).append('<span class="ui-dialog-title">'+H+"</span>").append('<a href="#" class="ui-dialog-titlebar-close"><span>X</span></a>').prependTo(G),I=(this.uiDialog=G.parent()).appendTo(document.body).hide().addClass("ui-dialog").addClass(K.dialogClass).addClass(E.attr("className")).removeClass("ui-dialog-content").css({position:"absolute",width:K.width,height:K.height,overflow:"hidden",zIndex:K.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(L){if(K.closeOnEscape){var M=27;(L.keyCode&&L.keyCode==M&&J.close())}}).mousedown(function(){J.moveToTop()}),F=(this.uiDialogButtonPane=B("<div/>")).addClass("ui-dialog-buttonpane").css({position:"absolute",bottom:0}).appendTo(I);this.uiDialogTitlebarClose=B(".ui-dialog-titlebar-close",C).hover(function(){B(this).addClass("ui-dialog-titlebar-close-hover")},function(){B(this).removeClass("ui-dialog-titlebar-close-hover")}).mousedown(function(L){L.stopPropagation()}).click(function(){J.close();return false});this.uiDialogTitlebar.find("*").add(this.uiDialogTitlebar).each(function(){B.ui.disableSelection(this)});if(B.fn.draggable){I.draggable({cancel:".ui-dialog-content",helper:K.dragHelper,handle:".ui-dialog-titlebar",start:function(M,L){J.moveToTop();(K.dragStart&&K.dragStart.apply(J.element[0],arguments))},drag:function(M,L){(K.drag&&K.drag.apply(J.element[0],arguments))},stop:function(M,L){(K.dragStop&&K.dragStop.apply(J.element[0],arguments));B.ui.dialog.overlay.resize()}});(K.draggable||I.draggable("disable"))}if(B.fn.resizable){I.resizable({cancel:".ui-dialog-content",helper:K.resizeHelper,maxWidth:K.maxWidth,maxHeight:K.maxHeight,minWidth:K.minWidth,minHeight:K.minHeight,start:function(){(K.resizeStart&&K.resizeStart.apply(J.element[0],arguments))},resize:function(M,L){(K.autoResize&&J.size.apply(J));(K.resize&&K.resize.apply(J.element[0],arguments))},handles:D,stop:function(M,L){(K.autoResize&&J.size.apply(J));(K.resizeStop&&K.resizeStop.apply(J.element[0],arguments));B.ui.dialog.overlay.resize()}});(K.resizable||I.resizable("disable"))}this.createButtons(K.buttons);this.isOpen=false;(K.bgiframe&&B.fn.bgiframe&&I.bgiframe());(K.autoOpen&&this.open())},setData:function(C,D){(A[C]&&this.uiDialog.data(A[C],D));switch(C){case"buttons":this.createButtons(D);break;case"draggable":this.uiDialog.draggable(D?"enable":"disable");break;case"height":this.uiDialog.height(D);break;case"position":this.position(D);break;case"resizable":(typeof D=="string"&&this.uiDialog.data("handles.resizable",D));this.uiDialog.resizable(D?"enable":"disable");break;case"title":B(".ui-dialog-title",this.uiDialogTitlebar).text(D);break;case"width":this.uiDialog.width(D);break}B.widget.prototype.setData.apply(this,arguments)},position:function(H){var D=B(window),E=B(document),F=E.scrollTop(),C=E.scrollLeft(),G=F;if(B.inArray(H,["center","top","right","bottom","left"])>=0){H=[H=="right"||H=="left"?H:"center",H=="top"||H=="bottom"?H:"middle"]}if(H.constructor!=Array){H=["center","middle"]}if(H[0].constructor==Number){C+=H[0]}else{switch(H[0]){case"left":C+=0;break;case"right":C+=D.width()-this.uiDialog.width();break;default:case"center":C+=(D.width()-this.uiDialog.width())/2}}if(H[1].constructor==Number){F+=H[1]}else{switch(H[1]){case"top":F+=0;break;case"bottom":F+=D.height()-this.uiDialog.height();break;default:case"middle":F+=(D.height()-this.uiDialog.height())/2}}F=Math.max(F,G);this.uiDialog.css({top:F,left:C})},size:function(){var D=this.uiDialogContainer,G=this.uiDialogTitlebar,E=this.element,F=parseInt(E.css("margin-top"),10)+parseInt(E.css("margin-bottom"),10),C=parseInt(E.css("margin-left"),10)+parseInt(E.css("margin-right"),10);E.height(D.height()-G.outerHeight()-F);E.width(D.width()-C)},open:function(){if(this.isOpen){return }this.overlay=this.options.modal?new B.ui.dialog.overlay(this):null;(this.uiDialog.next().length>0)&&this.uiDialog.appendTo("body");this.position(this.options.position);this.uiDialog.show(this.options.show);this.options.autoResize&&this.size();this.moveToTop(true);var C=null;var D={options:this.options};this.uiDialogTitlebarClose.focus();this.element.triggerHandler("dialogopen",[C,D],this.options.open);this.isOpen=true},moveToTop:function(E){if((this.options.modal&&!E)||(!this.options.stack&&!this.options.modal)){return this.element.triggerHandler("dialogfocus",[null,{options:this.options}],this.options.focus)}var D=this.options.zIndex,C=this.options;B(".ui-dialog:visible").each(function(){D=Math.max(D,parseInt(B(this).css("z-index"),10)||C.zIndex)});(this.overlay&&this.overlay.$el.css("z-index",++D));this.uiDialog.css("z-index",++D);this.element.triggerHandler("dialogfocus",[null,{options:this.options}],this.options.focus)},close:function(){(this.overlay&&this.overlay.destroy());this.uiDialog.hide(this.options.hide);var D=null;var C={options:this.options};this.element.triggerHandler("dialogclose",[D,C],this.options.close);B.ui.dialog.overlay.resize();this.isOpen=false},destroy:function(){(this.overlay&&this.overlay.destroy());this.uiDialog.hide();this.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content").hide().appendTo("body");this.uiDialog.remove()},createButtons:function(F){var E=this,C=false,D=this.uiDialogButtonPane;D.empty().hide();B.each(F,function(){return !(C=true)});if(C){D.show();B.each(F,function(G,H){B("<button/>").text(G).click(function(){H.apply(E.element[0],arguments)}).appendTo(D)})}}});B.extend(B.ui.dialog,{defaults:{autoOpen:true,autoResize:true,bgiframe:false,buttons:{},closeOnEscape:true,draggable:true,height:200,minHeight:100,minWidth:150,modal:false,overlay:{},position:"center",resizable:true,stack:true,width:300,zIndex:1000},overlay:function(C){this.$el=B.ui.dialog.overlay.create(C)}});B.extend(B.ui.dialog.overlay,{instances:[],events:B.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(C){return C+".dialog-overlay"}).join(" "),create:function(D){if(this.instances.length===0){setTimeout(function(){B("a, :input").bind(B.ui.dialog.overlay.events,function(){var F=false;var H=B(this).parents(".ui-dialog");if(H.length){var E=B(".ui-dialog-overlay");if(E.length){var G=parseInt(E.css("z-index"),10);E.each(function(){G=Math.max(G,parseInt(B(this).css("z-index"),10))});F=parseInt(H.css("z-index"),10)>G}else{F=true}}return F})},1);B(document).bind("keydown.dialog-overlay",function(E){var F=27;(E.keyCode&&E.keyCode==F&&D.close())});B(window).bind("resize.dialog-overlay",B.ui.dialog.overlay.resize)}var C=B("<div/>").appendTo(document.body).addClass("ui-dialog-overlay").css(B.extend({borderWidth:0,margin:0,padding:0,position:"absolute",top:0,left:0,width:this.width(),height:this.height()},D.options.overlay));(D.options.bgiframe&&B.fn.bgiframe&&C.bgiframe());this.instances.push(C);return C},destroy:function(C){this.instances.splice(B.inArray(this.instances,C),1);if(this.instances.length===0){B("a, :input").add([document,window]).unbind(".dialog-overlay")}C.remove()},height:function(){if(B.browser.msie&&B.browser.version<7){var D=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);var C=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);if(D<C){return B(window).height()+"px"}else{return D+"px"}}else{return B(document).height()+"px"}},width:function(){if(B.browser.msie&&B.browser.version<7){var C=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);var D=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);if(C<D){return B(window).width()+"px"}else{return C+"px"}}else{return B(document).width()+"px"}},resize:function(){var C=B([]);B.each(B.ui.dialog.overlay.instances,function(){C=C.add(this)});C.css({width:0,height:0}).css({width:B.ui.dialog.overlay.width(),height:B.ui.dialog.overlay.height()})}});B.extend(B.ui.dialog.overlay.prototype,{destroy:function(){B.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);(function(A){A.fn.unwrap=A.fn.unwrap||function(B){return this.each(function(){A(this).parents(B).eq(0).after(this).remove()})};A.widget("ui.slider",{plugins:{},ui:function(B){return{options:this.options,handle:this.currentHandle,value:this.options.axis!="both"||!this.options.axis?Math.round(this.value(null,this.options.axis=="vertical"?"y":"x")):{x:Math.round(this.value(null,"x")),y:Math.round(this.value(null,"y"))},range:this.getRange()}},propagate:function(C,B){A.ui.plugin.call(this,C,[B,this.ui()]);this.element.triggerHandler(C=="slide"?C:"slide"+C,[B,this.ui()],this.options[C])},destroy:function(){this.element.removeClass("ui-slider ui-slider-disabled").removeData("slider").unbind(".slider");if(this.handle&&this.handle.length){this.handle.unwrap("a");this.handle.each(function(){A(this).data("mouse").mouseDestroy()})}this.generated&&this.generated.remove()},setData:function(B,C){A.widget.prototype.setData.apply(this,arguments);if(/min|max|steps/.test(B)){this.initBoundaries()}if(B=="range"){C?this.handle.length==2&&this.createRange():this.removeRange()}},init:function(){var B=this;this.element.addClass("ui-slider");this.initBoundaries();this.handle=A(this.options.handle,this.element);if(!this.handle.length){B.handle=B.generated=A(B.options.handles||[0]).map(function(){var D=A("<div/>").addClass("ui-slider-handle").appendTo(B.element);if(this.id){D.attr("id",this.id)}return D[0]})}var C=function(D){this.element=A(D);this.element.data("mouse",this);this.options=B.options;this.element.bind("mousedown",function(){if(B.currentHandle){this.blur(B.currentHandle)}B.focus(this,1)});this.mouseInit()};A.extend(C.prototype,A.ui.mouse,{mouseStart:function(D){return B.start.call(B,D,this.element[0])},mouseStop:function(D){return B.stop.call(B,D,this.element[0])},mouseDrag:function(D){return B.drag.call(B,D,this.element[0])},mouseCapture:function(){return true},trigger:function(D){this.mouseDown(D)}});A(this.handle).each(function(){new C(this)}).wrap('<a href="javascript:void(0)" style="outline:none;border:none;"></a>').parent().bind("focus",function(D){B.focus(this.firstChild)}).bind("blur",function(D){B.blur(this.firstChild)}).bind("keydown",function(D){if(!B.options.noKeyboard){B.keydown(D.keyCode,this.firstChild)}});this.element.bind("mousedown.slider",function(D){B.click.apply(B,[D]);B.currentHandle.data("mouse").trigger(D);B.firstValue=B.firstValue+1});A.each(this.options.handles||[],function(D,E){B.moveTo(E.start,D,true)});if(!isNaN(this.options.startValue)){this.moveTo(this.options.startValue,0,true)}this.previousHandle=A(this.handle[0]);if(this.handle.length==2&&this.options.range){this.createRange()}},initBoundaries:function(){var B=this.element[0],C=this.options;this.actualSize={width:this.element.outerWidth(),height:this.element.outerHeight()};A.extend(C,{axis:C.axis||(B.offsetWidth<B.offsetHeight?"vertical":"horizontal"),max:!isNaN(parseInt(C.max,10))?{x:parseInt(C.max,10),y:parseInt(C.max,10)}:({x:C.max&&C.max.x||100,y:C.max&&C.max.y||100}),min:!isNaN(parseInt(C.min,10))?{x:parseInt(C.min,10),y:parseInt(C.min,10)}:({x:C.min&&C.min.x||0,y:C.min&&C.min.y||0})});C.realMax={x:C.max.x-C.min.x,y:C.max.y-C.min.y};C.stepping={x:C.stepping&&C.stepping.x||parseInt(C.stepping,10)||(C.steps?C.realMax.x/(C.steps.x||parseInt(C.steps,10)||C.realMax.x):0),y:C.stepping&&C.stepping.y||parseInt(C.stepping,10)||(C.steps?C.realMax.y/(C.steps.y||parseInt(C.steps,10)||C.realMax.y):0)}},keydown:function(C,B){if(/(37|38|39|40)/.test(C)){this.moveTo({x:/(37|39)/.test(C)?(C==37?"-":"+")+"="+this.oneStep("x"):0,y:/(38|40)/.test(C)?(C==38?"-":"+")+"="+this.oneStep("y"):0},B)}},focus:function(B,C){this.currentHandle=A(B).addClass("ui-slider-handle-active");if(C){this.currentHandle.parent()[0].focus()}},blur:function(B){A(B).removeClass("ui-slider-handle-active");if(this.currentHandle&&this.currentHandle[0]==B){this.previousHandle=this.currentHandle;this.currentHandle=null}},click:function(C){var D=[C.pageX,C.pageY];var B=false;this.handle.each(function(){if(this==C.target){B=true}});if(B||this.options.disabled||!(this.currentHandle||this.previousHandle)){return }if(!this.currentHandle&&this.previousHandle){this.focus(this.previousHandle,true)}this.offset=this.element.offset();this.moveTo({y:this.convertValue(C.pageY-this.offset.top-this.currentHandle[0].offsetHeight/2,"y"),x:this.convertValue(C.pageX-this.offset.left-this.currentHandle[0].offsetWidth/2,"x")},null,!this.options.distance)},createRange:function(){if(this.rangeElement){return }this.rangeElement=A("<div></div>").addClass("ui-slider-range").css({position:"absolute"}).appendTo(this.element);this.updateRange()},removeRange:function(){this.rangeElement.remove();this.rangeElement=null},updateRange:function(){var C=this.options.axis=="vertical"?"top":"left";var B=this.options.axis=="vertical"?"height":"width";this.rangeElement.css(C,(parseInt(A(this.handle[0]).css(C),10)||0)+this.handleSize(0,this.options.axis=="vertical"?"y":"x")/2);this.rangeElement.css(B,(parseInt(A(this.handle[1]).css(C),10)||0)-(parseInt(A(this.handle[0]).css(C),10)||0))},getRange:function(){return this.rangeElement?this.convertValue(parseInt(this.rangeElement.css(this.options.axis=="vertical"?"height":"width"),10),this.options.axis=="vertical"?"y":"x"):null},handleIndex:function(){return this.handle.index(this.currentHandle[0])},value:function(D,B){if(this.handle.length==1){this.currentHandle=this.handle}if(!B){B=this.options.axis=="vertical"?"y":"x"}var C=A(D!=undefined&&D!==null?this.handle[D]||D:this.currentHandle);if(C.data("mouse").sliderValue){return parseInt(C.data("mouse").sliderValue[B],10)}else{return parseInt(((parseInt(C.css(B=="x"?"left":"top"),10)/(this.actualSize[B=="x"?"width":"height"]-this.handleSize(D,B)))*this.options.realMax[B])+this.options.min[B],10)}},convertValue:function(C,B){return this.options.min[B]+(C/(this.actualSize[B=="x"?"width":"height"]-this.handleSize(null,B)))*this.options.realMax[B]},translateValue:function(C,B){return((C-this.options.min[B])/this.options.realMax[B])*(this.actualSize[B=="x"?"width":"height"]-this.handleSize(null,B))},translateRange:function(D,B){if(this.rangeElement){if(this.currentHandle[0]==this.handle[0]&&D>=this.translateValue(this.value(1),B)){D=this.translateValue(this.value(1,B)-this.oneStep(B),B)}if(this.currentHandle[0]==this.handle[1]&&D<=this.translateValue(this.value(0),B)){D=this.translateValue(this.value(0,B)+this.oneStep(B),B)}}if(this.options.handles){var C=this.options.handles[this.handleIndex()];if(D<this.translateValue(C.min,B)){D=this.translateValue(C.min,B)}else{if(D>this.translateValue(C.max,B)){D=this.translateValue(C.max,B)}}}return D},translateLimits:function(C,B){if(C>=this.actualSize[B=="x"?"width":"height"]-this.handleSize(null,B)){C=this.actualSize[B=="x"?"width":"height"]-this.handleSize(null,B)}if(C<=0){C=0}return C},handleSize:function(C,B){return A(C!=undefined&&C!==null?this.handle[C]:this.currentHandle)[0]["offset"+(B=="x"?"Width":"Height")]},oneStep:function(B){return this.options.stepping[B]||1},start:function(C,B){var D=this.options;if(D.disabled){return false}this.actualSize={width:this.element.outerWidth(),height:this.element.outerHeight()};if(!this.currentHandle){this.focus(this.previousHandle,true)}this.offset=this.element.offset();this.handleOffset=this.currentHandle.offset();this.clickOffset={top:C.pageY-this.handleOffset.top,left:C.pageX-this.handleOffset.left};this.firstValue=this.value();this.propagate("start",C);this.drag(C,B);return true},stop:function(B){this.propagate("stop",B);if(this.firstValue!=this.value()){this.propagate("change",B)}this.focus(this.currentHandle,true);return false},drag:function(E,D){var F=this.options;var B={top:E.pageY-this.offset.top-this.clickOffset.top,left:E.pageX-this.offset.left-this.clickOffset.left};if(!this.currentHandle){this.focus(this.previousHandle,true)}B.left=this.translateLimits(B.left,"x");B.top=this.translateLimits(B.top,"y");if(F.stepping.x){var C=this.convertValue(B.left,"x");C=Math.round(C/F.stepping.x)*F.stepping.x;B.left=this.translateValue(C,"x")}if(F.stepping.y){var C=this.convertValue(B.top,"y");C=Math.round(C/F.stepping.y)*F.stepping.y;B.top=this.translateValue(C,"y")}B.left=this.translateRange(B.left,"x");B.top=this.translateRange(B.top,"y");if(F.axis!="vertical"){this.currentHandle.css({left:B.left})}if(F.axis!="horizontal"){this.currentHandle.css({top:B.top})}this.currentHandle.data("mouse").sliderValue={x:Math.round(this.convertValue(B.left,"x"))||0,y:Math.round(this.convertValue(B.top,"y"))||0};if(this.rangeElement){this.updateRange()}this.propagate("slide",E);return false},moveTo:function(F,E,G){var H=this.options;this.actualSize={width:this.element.outerWidth(),height:this.element.outerHeight()};if(E==undefined&&!this.currentHandle&&this.handle.length!=1){return false}if(E==undefined&&!this.currentHandle){E=0}if(E!=undefined){this.currentHandle=this.previousHandle=A(this.handle[E]||E)}if(F.x!==undefined&&F.y!==undefined){var B=F.x,I=F.y}else{var B=F,I=F}if(B!==undefined&&B.constructor!=Number){var D=/^\-\=/.test(B),C=/^\+\=/.test(B);if(D||C){B=this.value(null,"x")+parseInt(B.replace(D?"=":"+=",""),10)}else{B=isNaN(parseInt(B,10))?undefined:parseInt(B,10)}}if(I!==undefined&&I.constructor!=Number){var D=/^\-\=/.test(I),C=/^\+\=/.test(I);if(D||C){I=this.value(null,"y")+parseInt(I.replace(D?"=":"+=",""),10)}else{I=isNaN(parseInt(I,10))?undefined:parseInt(I,10)}}if(H.axis!="vertical"&&B!==undefined){if(H.stepping.x){B=Math.round(B/H.stepping.x)*H.stepping.x}B=this.translateValue(B,"x");B=this.translateLimits(B,"x");B=this.translateRange(B,"x");H.animate?this.currentHandle.stop().animate({left:B},(Math.abs(parseInt(this.currentHandle.css("left"))-B))*(!isNaN(parseInt(H.animate))?H.animate:5)):this.currentHandle.css({left:B})}if(H.axis!="horizontal"&&I!==undefined){if(H.stepping.y){I=Math.round(I/H.stepping.y)*H.stepping.y}I=this.translateValue(I,"y");I=this.translateLimits(I,"y");I=this.translateRange(I,"y");H.animate?this.currentHandle.stop().animate({top:I},(Math.abs(parseInt(this.currentHandle.css("top"))-I))*(!isNaN(parseInt(H.animate))?H.animate:5)):this.currentHandle.css({top:I})}if(this.rangeElement){this.updateRange()}this.currentHandle.data("mouse").sliderValue={x:Math.round(this.convertValue(B,"x"))||0,y:Math.round(this.convertValue(I,"y"))||0};if(!G){this.propagate("start",null);this.propagate("stop",null);this.propagate("change",null);this.propagate("slide",null)}}});A.ui.slider.getter="value";A.ui.slider.defaults={handle:".ui-slider-handle",distance:1,animate:false}})(jQuery);(function(A){A.widget("ui.tabs",{init:function(){this.options.event+=".tabs";this.tabify(true)},setData:function(B,C){if((/^selected/).test(B)){this.select(C)}else{this.options[B]=C;this.tabify()}},length:function(){return this.$tabs.length},tabId:function(B){return B.title&&B.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+A.data(B)},ui:function(C,B){return{options:this.options,tab:C,panel:B,index:this.$tabs.index(C)}},tabify:function(O){this.$lis=A("li:has(a[href])",this.element);this.$tabs=this.$lis.map(function(){return A("a",this)[0]});this.$panels=A([]);var P=this,D=this.options;this.$tabs.each(function(R,Q){if(Q.hash&&Q.hash.replace("#","")){P.$panels=P.$panels.add(Q.hash)}else{if(A(Q).attr("href")!="#"){A.data(Q,"href.tabs",Q.href);A.data(Q,"load.tabs",Q.href);var T=P.tabId(Q);Q.href="#"+T;var S=A("#"+T);if(!S.length){S=A(D.panelTemplate).attr("id",T).addClass(D.panelClass).insertAfter(P.$panels[R-1]||P.element);S.data("destroy.tabs",true)}P.$panels=P.$panels.add(S)}else{D.disabled.push(R+1)}}});if(O){this.element.addClass(D.navClass);this.$panels.each(function(){var Q=A(this);Q.addClass(D.panelClass)});if(D.selected===undefined){if(location.hash){this.$tabs.each(function(S,Q){if(Q.hash==location.hash){D.selected=S;if(A.browser.msie||A.browser.opera){var R=A(location.hash),T=R.attr("id");R.attr("id","");setTimeout(function(){R.attr("id",T)},500)}scrollTo(0,0);return false}})}else{if(D.cookie){var J=parseInt(A.cookie("ui-tabs"+A.data(P.element)),10);if(J&&P.$tabs[J]){D.selected=J}}else{if(P.$lis.filter("."+D.selectedClass).length){D.selected=P.$lis.index(P.$lis.filter("."+D.selectedClass)[0])}}}}D.selected=D.selected===null||D.selected!==undefined?D.selected:0;D.disabled=A.unique(D.disabled.concat(A.map(this.$lis.filter("."+D.disabledClass),function(R,Q){return P.$lis.index(R)}))).sort();if(A.inArray(D.selected,D.disabled)!=-1){D.disabled.splice(A.inArray(D.selected,D.disabled),1)}this.$panels.addClass(D.hideClass);this.$lis.removeClass(D.selectedClass);if(D.selected!==null){this.$panels.eq(D.selected).show().removeClass(D.hideClass);this.$lis.eq(D.selected).addClass(D.selectedClass);var K=function(){A(P.element).triggerHandler("tabsshow",[P.fakeEvent("tabsshow"),P.ui(P.$tabs[D.selected],P.$panels[D.selected])],D.show)};if(A.data(this.$tabs[D.selected],"load.tabs")){this.load(D.selected,K)}else{K()}}A(window).bind("unload",function(){P.$tabs.unbind(".tabs");P.$lis=P.$tabs=P.$panels=null})}for(var G=0,N;N=this.$lis[G];G++){A(N)[A.inArray(G,D.disabled)!=-1&&!A(N).hasClass(D.selectedClass)?"addClass":"removeClass"](D.disabledClass)}if(D.cache===false){this.$tabs.removeData("cache.tabs")}var C,I,B={"min-width":0,duration:1},E="normal";if(D.fx&&D.fx.constructor==Array){C=D.fx[0]||B,I=D.fx[1]||B}else{C=I=D.fx||B}var H={display:"",overflow:"",height:""};if(!A.browser.msie){H.opacity=""}function M(R,Q,S){Q.animate(C,C.duration||E,function(){Q.addClass(D.hideClass).css(H);if(A.browser.msie&&C.opacity){Q[0].style.filter=""}if(S){L(R,S,Q)}})}function L(R,S,Q){if(I===B){S.css("display","block")}S.animate(I,I.duration||E,function(){S.removeClass(D.hideClass).css(H);if(A.browser.msie&&I.opacity){S[0].style.filter=""}A(P.element).triggerHandler("tabsshow",[P.fakeEvent("tabsshow"),P.ui(R,S[0])],D.show)})}function F(R,T,Q,S){T.addClass(D.selectedClass).siblings().removeClass(D.selectedClass);M(R,Q,S)}this.$tabs.unbind(".tabs").bind(D.event,function(){var T=A(this).parents("li:eq(0)"),Q=P.$panels.filter(":visible"),S=A(this.hash);if((T.hasClass(D.selectedClass)&&!D.unselect)||T.hasClass(D.disabledClass)||A(this).hasClass(D.loadingClass)||A(P.element).triggerHandler("tabsselect",[P.fakeEvent("tabsselect"),P.ui(this,S[0])],D.select)===false){this.blur();return false}P.options.selected=P.$tabs.index(this);if(D.unselect){if(T.hasClass(D.selectedClass)){P.options.selected=null;T.removeClass(D.selectedClass);P.$panels.stop();M(this,Q);this.blur();return false}else{if(!Q.length){P.$panels.stop();var R=this;P.load(P.$tabs.index(this),function(){T.addClass(D.selectedClass).addClass(D.unselectClass);L(R,S)});this.blur();return false}}}if(D.cookie){A.cookie("ui-tabs"+A.data(P.element),P.options.selected,D.cookie)}P.$panels.stop();if(S.length){var R=this;P.load(P.$tabs.index(this),Q.length?function(){F(R,T,Q,S)}:function(){T.addClass(D.selectedClass);L(R,S)})}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(A.browser.msie){this.blur()}return false});if(!(/^click/).test(D.event)){this.$tabs.bind("click.tabs",function(){return false})}},add:function(E,D,C){if(C==undefined){C=this.$tabs.length}var G=this.options;var I=A(G.tabTemplate.replace(/#\{href\}/g,E).replace(/#\{label\}/g,D));I.data("destroy.tabs",true);var H=E.indexOf("#")==0?E.replace("#",""):this.tabId(A("a:first-child",I)[0]);var F=A("#"+H);if(!F.length){F=A(G.panelTemplate).attr("id",H).addClass(G.hideClass).data("destroy.tabs",true)}F.addClass(G.panelClass);if(C>=this.$lis.length){I.appendTo(this.element);F.appendTo(this.element[0].parentNode)}else{I.insertBefore(this.$lis[C]);F.insertBefore(this.$panels[C])}G.disabled=A.map(G.disabled,function(K,J){return K>=C?++K:K});this.tabify();if(this.$tabs.length==1){I.addClass(G.selectedClass);F.removeClass(G.hideClass);var B=A.data(this.$tabs[0],"load.tabs");if(B){this.load(C,B)}}this.element.triggerHandler("tabsadd",[this.fakeEvent("tabsadd"),this.ui(this.$tabs[C],this.$panels[C])],G.add)},remove:function(B){var D=this.options,E=this.$lis.eq(B).remove(),C=this.$panels.eq(B).remove();if(E.hasClass(D.selectedClass)&&this.$tabs.length>1){this.select(B+(B+1<this.$tabs.length?1:-1))}D.disabled=A.map(A.grep(D.disabled,function(G,F){return G!=B}),function(G,F){return G>=B?--G:G});this.tabify();this.element.triggerHandler("tabsremove",[this.fakeEvent("tabsremove"),this.ui(E.find("a")[0],C[0])],D.remove)},enable:function(B){var C=this.options;if(A.inArray(B,C.disabled)==-1){return }var D=this.$lis.eq(B).removeClass(C.disabledClass);if(A.browser.safari){D.css("display","inline-block");setTimeout(function(){D.css("display","block")},0)}C.disabled=A.grep(C.disabled,function(F,E){return F!=B});this.element.triggerHandler("tabsenable",[this.fakeEvent("tabsenable"),this.ui(this.$tabs[B],this.$panels[B])],C.enable)},disable:function(C){var B=this,D=this.options;if(C!=D.selected){this.$lis.eq(C).addClass(D.disabledClass);D.disabled.push(C);D.disabled.sort();this.element.triggerHandler("tabsdisable",[this.fakeEvent("tabsdisable"),this.ui(this.$tabs[C],this.$panels[C])],D.disable)}},select:function(B){if(typeof B=="string"){B=this.$tabs.index(this.$tabs.filter("[href$="+B+"]")[0])}this.$tabs.eq(B).trigger(this.options.event)},load:function(G,K){var L=this,D=this.options,E=this.$tabs.eq(G),J=E[0],H=K==undefined||K===false,B=E.data("load.tabs");K=K||function(){};if(!B||!H&&A.data(J,"cache.tabs")){K();return }var M=function(N){var O=A(N),P=O.find("*:last");return P.length&&P.is(":not(img)")&&P||O};var C=function(){L.$tabs.filter("."+D.loadingClass).removeClass(D.loadingClass).each(function(){if(D.spinner){M(this).parent().html(M(this).data("label.tabs"))}});L.xhr=null};if(D.spinner){var I=M(J).html();M(J).wrapInner("<em></em>").find("em").data("label.tabs",I).html(D.spinner)}var F=A.extend({},D.ajaxOptions,{url:B,success:function(O,N){A(J.hash).html(O);C();if(D.cache){A.data(J,"cache.tabs",true)}A(L.element).triggerHandler("tabsload",[L.fakeEvent("tabsload"),L.ui(L.$tabs[G],L.$panels[G])],D.load);D.ajaxOptions.success&&D.ajaxOptions.success(O,N);K()}});if(this.xhr){this.xhr.abort();C()}E.addClass(D.loadingClass);setTimeout(function(){L.xhr=A.ajax(F)},0)},url:function(C,B){this.$tabs.eq(C).removeData("cache.tabs").data("load.tabs",B)},destroy:function(){var B=this.options;this.element.unbind(".tabs").removeClass(B.navClass).removeData("tabs");this.$tabs.each(function(){var C=A.data(this,"href.tabs");if(C){this.href=C}var D=A(this).unbind(".tabs");A.each(["href","load","cache"],function(E,F){D.removeData(F+".tabs")})});this.$lis.add(this.$panels).each(function(){if(A.data(this,"destroy.tabs")){A(this).remove()}else{A(this).removeClass([B.selectedClass,B.unselectClass,B.disabledClass,B.panelClass,B.hideClass].join(" "))}})},fakeEvent:function(B){return A.event.fix({type:B,target:this.element[0]})}});A.ui.tabs.defaults={unselect:false,event:"click",disabled:[],cookie:null,spinner:"Loading&#8230;",cache:false,idPrefix:"ui-tabs-",ajaxOptions:{},fx:null,tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>',panelTemplate:"<div></div>",navClass:"ui-tabs-nav",selectedClass:"ui-tabs-selected",unselectClass:"ui-tabs-unselect",disabledClass:"ui-tabs-disabled",panelClass:"ui-tabs-panel",hideClass:"ui-tabs-hide",loadingClass:"ui-tabs-loading"};A.ui.tabs.getter="length";A.extend(A.ui.tabs.prototype,{rotation:null,rotate:function(C,F){F=F||false;var B=this,E=this.options.selected;function G(){B.rotation=setInterval(function(){E=++E<B.$tabs.length?E:0;B.select(E)},C)}function D(H){if(!H||H.clientX){clearInterval(B.rotation)}}if(C){G();if(!F){this.$tabs.bind(this.options.event,D)}else{this.$tabs.bind(this.options.event,function(){D();E=B.options.selected;G()})}}else{D();this.$tabs.unbind(this.options.event,D)}}})})(jQuery);(function($){var PROP_NAME="datepicker";function Datepicker(){this.debug=false;this._curInst=null;this._disabledInputs=[];this._datepickerShowing=false;this._inDialog=false;this._mainDivId="ui-datepicker-div";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._promptClass="ui-datepicker-prompt";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this.regional=[];this.regional[""]={clearText:"Clear",clearStatus:"Erase the current date",closeText:"Close",closeStatus:"Close without change",prevText:"&#x3c;Prev",prevStatus:"Show the previous month",nextText:"Next&#x3e;",nextStatus:"Show the next month",currentText:"Today",currentStatus:"Show the current month",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],monthStatus:"Show a different month",yearStatus:"Show a different year",weekHeader:"Wk",weekStatus:"Week of the year",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],dayStatus:"Set DD as first week day",dateStatus:"Select DD, M d",dateFormat:"mm/dd/yy",firstDay:0,initStatus:"Select a date",isRTL:false};this._defaults={showOn:"focus",showAnim:"show",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,closeAtTop:true,mandatory:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:true,changeYear:true,yearRange:"-10:+10",changeFirstDay:true,highlightWeek:false,showOtherMonths:false,showWeeks:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",showStatus:false,statusForDate:this.dateStatus,minDate:null,maxDate:null,duration:"normal",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,stepMonths:1,rangeSelect:false,rangeSeparator:" - ",altField:"",altFormat:""};$.extend(this._defaults,this.regional[""]);this.dpDiv=$('<div id="'+this._mainDivId+'" style="display: none;"></div>')}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+new Date().getTime()}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){return{id:target[0].id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:$('<div class="ui-datepicker-inline"></div>'))}},_connectDatepicker:function(target,inst){var input=$(target);if(input.hasClass(this.markerClassName)){return }var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(appendText){input[isRTL?"before":"after"]('<span class="'+this._appendClass+'">'+appendText+"</span>")}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");var trigger=$(this._get(inst,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("<img/>").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](trigger);trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==target){$.datepicker._hideDatepicker()}else{$.datepicker._showDatepicker(target)}return false})}input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst)},_inlineDatepicker:function(target,inst){var input=$(target);if(input.hasClass(this.markerClassName)){return }input.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst));this._updateDatepicker(inst)},_dialogDatepicker:function(input,dateText,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+new Date().getTime();this._dialogInput=$('<input type="text" id="'+id+'" size="1" style="position: absolute; top: -100px;"/>');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});this._dialogInput.val(dateText);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",this._pos[0]+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var nodeName=target.nodeName.toLowerCase();var $target=$(target);$.removeData(target,PROP_NAME);if(nodeName=="input"){$target.siblings("."+this._appendClass).remove().end().siblings("."+this._triggerClass).remove().end().removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){target.disabled=false;$(target).siblings("button."+this._triggerClass).each(function(){this.disabled=false}).end().siblings("img."+this._triggerClass).css({opacity:"1.0",cursor:""});this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){target.disabled=true;$(target).siblings("button."+this._triggerClass).each(function(){this.disabled=true}).end().siblings("img."+this._triggerClass).css({opacity:"0.5",cursor:"default"});this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i<this._disabledInputs.length;i++){if(this._disabledInputs[i]==target){return true}}return false},_changeDatepicker:function(target,name,value){var settings=name||{};if(typeof name=="string"){settings={};settings[name]=value}if(inst=$.data(target,PROP_NAME)){extendRemove(inst.settings,settings);this._updateDatepicker(inst)}},_setDateDatepicker:function(target,date,endDate){var inst=$.data(target,PROP_NAME);if(inst){this._setDate(inst,date,endDate);this._updateDatepicker(inst)}},_getDateDatepicker:function(target){var inst=$.data(target,PROP_NAME);if(inst){this._setDateFromField(inst)}return(inst?this._getDate(inst):null)},_doKeyDown:function(e){var inst=$.data(e.target,PROP_NAME);var handled=true;if($.datepicker._datepickerShowing){switch(e.keyCode){case 9:$.datepicker._hideDatepicker(null,"");break;case 13:$.datepicker._selectDay(e.target,inst.selectedMonth,inst.selectedYear,$("td.ui-datepicker-days-cell-over",inst.dpDiv)[0]);return false;break;case 27:$.datepicker._hideDatepicker(null,$.datepicker._get(inst,"duration"));break;case 33:$.datepicker._adjustDate(e.target,(e.ctrlKey?-1:-$.datepicker._get(inst,"stepMonths")),(e.ctrlKey?"Y":"M"));break;case 34:$.datepicker._adjustDate(e.target,(e.ctrlKey?+1:+$.datepicker._get(inst,"stepMonths")),(e.ctrlKey?"Y":"M"));break;case 35:if(e.ctrlKey){$.datepicker._clearDate(e.target)}break;case 36:if(e.ctrlKey){$.datepicker._gotoToday(e.target)}break;case 37:if(e.ctrlKey){$.datepicker._adjustDate(e.target,-1,"D")}break;case 38:if(e.ctrlKey){$.datepicker._adjustDate(e.target,-7,"D")}break;case 39:if(e.ctrlKey){$.datepicker._adjustDate(e.target,+1,"D")}break;case 40:if(e.ctrlKey){$.datepicker._adjustDate(e.target,+7,"D")}break;default:handled=false}}else{if(e.keyCode==36&&e.ctrlKey){$.datepicker._showDatepicker(this)}else{handled=false}}if(handled){e.preventDefault();e.stopPropagation()}},_doKeyPress:function(e){var inst=$.data(e.target,PROP_NAME);var chars=$.datepicker._possibleChars($.datepicker._get(inst,"dateFormat"));var chr=String.fromCharCode(e.charCode==undefined?e.keyCode:e.charCode);return e.ctrlKey||(chr<" "||!chars||chars.indexOf(chr)>-1)},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return }var inst=$.data(input,PROP_NAME);var beforeShow=$.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));$.datepicker._hideDatepicker(null,"");$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.rangeStart=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1]*$(".ui-datepicker",inst.dpDiv[0])[0].offsetWidth);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim")||"show";var duration=$.datepicker._get(inst,"duration");var postProcess=function(){$.datepicker._datepickerShowing=true;if($.browser.msie&&parseInt($.browser.version)<7){$("iframe.ui-datepicker-cover").css({width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4})}};if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim](duration,postProcess)}if(duration==""){postProcess()}if(inst.input[0].type!="hidden"){inst.input[0].focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var dims={width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4};inst.dpDiv.empty().append(this._generateDatepicker(inst)).find("iframe.ui-datepicker-cover").css({width:dims.width,height:dims.height});var numMonths=this._getNumberOfMonths(inst);inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst.input&&inst.input[0].type!="hidden"){$(inst.input[0]).focus()}},_checkOffset:function(inst,offset,isFixed){var pos=inst.input?this._findPos(inst.input[0]):null;var browserWidth=window.innerWidth||document.documentElement.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;if(this._get(inst,"isRTL")||(offset.left+inst.dpDiv.width()-scrollX)>browserWidth){offset.left=Math.max((isFixed?0:scrollX),pos[0]+(inst.input?inst.input.width():0)-(isFixed?scrollX:0)-inst.dpDiv.width()-(isFixed&&$.browser.opera?document.documentElement.scrollLeft:0))}else{offset.left-=(isFixed?scrollX:0)}if((offset.top+inst.dpDiv.height()-scrollY)>browserHeight){offset.top=Math.max((isFixed?0:scrollY),pos[1]-(isFixed?scrollY:0)-(this._inDialog?0:inst.dpDiv.height())-(isFixed&&$.browser.opera?document.documentElement.scrollTop:0))}else{offset.top-=(isFixed?scrollY:0)}return offset},_findPos:function(obj){while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj.nextSibling}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input,duration){var inst=this._curInst;if(!inst){return }var rangeSelect=this._get(inst,"rangeSelect");if(rangeSelect&&this._stayOpen){this._selectDate("#"+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))}this._stayOpen=false;if(this._datepickerShowing){duration=(duration!=null?duration:this._get(inst,"duration"));var showAnim=this._get(inst,"showAnim");var postProcess=function(){$.datepicker._tidyDialog(inst)};if(duration!=""&&$.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(duration==""?"hide":(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide")))](duration,postProcess)}if(duration==""){this._tidyDialog(inst)}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[this._getDate(inst),inst])}this._datepickerShowing=false;this._lastInput=null;inst.settings.prompt=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}this._curInst=null},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker");$("."+this._promptClass,inst.dpDiv).remove()},_checkExternalClick:function(event){if(!$.datepicker._curInst){return }var $target=$(event.target);if(($target.parents("#"+$.datepicker._mainDivId).length==0)&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)){$.datepicker._hideDatepicker(null,"")}},_adjustDate:function(id,offset,period){var target=$(id);var inst=$.data(target[0],PROP_NAME);this._adjustInstDate(inst,offset,period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=$.data(target[0],PROP_NAME);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._adjustDate(target);this._notifyChange(inst)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=$.data(target[0],PROP_NAME);inst._selectingMonthYear=false;inst[period=="M"?"drawMonth":"drawYear"]=select.options[select.selectedIndex].value-0;this._adjustDate(target);this._notifyChange(inst)},_clickMonthYear:function(id){var target=$(id);var inst=$.data(target[0],PROP_NAME);if(inst.input&&inst._selectingMonthYear&&!$.browser.msie){inst.input[0].focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_changeFirstDay:function(id,day){var target=$(id);var inst=$.data(target[0],PROP_NAME);inst.settings.firstDay=day;this._updateDatepicker(inst)},_selectDay:function(id,month,year,td){if($(td).hasClass(this._unselectableClass)){return }var target=$(id);var inst=$.data(target[0],PROP_NAME);var rangeSelect=this._get(inst,"rangeSelect");if(rangeSelect){this._stayOpen=!this._stayOpen;if(this._stayOpen){$(".ui-datepicker td").removeClass(this._currentClass);$(td).addClass(this._currentClass)}}inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;if(this._stayOpen){inst.endDay=inst.endMonth=inst.endYear=null}else{if(rangeSelect){inst.endDay=inst.currentDay;inst.endMonth=inst.currentMonth;inst.endYear=inst.currentYear}}this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));if(this._stayOpen){inst.rangeStart=this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));this._updateDatepicker(inst)}else{if(rangeSelect){inst.selectedDay=inst.currentDay=inst.rangeStart.getDate();inst.selectedMonth=inst.currentMonth=inst.rangeStart.getMonth();inst.selectedYear=inst.currentYear=inst.rangeStart.getFullYear();inst.rangeStart=null;if(inst.inline){this._updateDatepicker(inst)}}}},_clearDate:function(id){var target=$(id);var inst=$.data(target[0],PROP_NAME);if(this._get(inst,"mandatory")){return }this._stayOpen=false;inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=$.data(target[0],PROP_NAME);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(this._get(inst,"rangeSelect")&&dateStr){dateStr=(inst.rangeStart?this._formatDate(inst,inst.rangeStart):dateStr)+this._get(inst,"rangeSeparator")+dateStr}if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{if(!this._stayOpen){this._hideDatepicker(null,this._get(inst,"duration"));this._lastInput=inst.input[0];if(typeof (inst.input[0])!="object"){inst.input[0].focus()}this._lastInput=null}}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat");var date=this._getDate(inst);dateStr=(isArray(date)?(!date[0]&&!date[1]?"":this.formatDate(altFormat,date[0],this._getFormatConfig(inst))+this._get(inst,"rangeSeparator")+this.formatDate(altFormat,date[1]||date[0],this._getFormatConfig(inst))):this.formatDate(altFormat,date,this._getFormatConfig(inst)));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());var firstMon=new Date(checkDate.getFullYear(),1-1,4);var firstDay=firstMon.getDay()||7;firstMon.setDate(firstMon.getDate()+1-firstDay);if(firstDay<4&&checkDate<firstMon){checkDate.setDate(checkDate.getDate()-3);return $.datepicker.iso8601Week(checkDate)}else{if(checkDate>new Date(checkDate.getFullYear(),12-1,28)){firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;if(firstDay>4&&(checkDate.getDay()||7)<firstDay-3){checkDate.setDate(checkDate.getDate()+3);return $.datepicker.iso8601Week(checkDate)}}}return Math.floor(((checkDate-firstMon)/86400000)/7)+1},dateStatus:function(date,inst){return $.datepicker.formatDate($.datepicker._get(inst,"dateStatus"),date,$.datepicker._getFormatConfig(inst))},parseDate:function(format,value,settings){if(format==null||value==null){throw"Invalid arguments"}value=(typeof value=="object"?value.toString():value+"");if(value==""){return null}var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var year=-1;var month=-1;var day=-1;var literal=false;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var getNumber=function(match){lookAhead(match);var origSize=(match=="@"?14:(match=="y"?4:2));var size=origSize;var num=0;while(size>0&&iValue<value.length&&value.charAt(iValue)>="0"&&value.charAt(iValue)<="9"){num=num*10+(value.charAt(iValue++)-0);size--}if(size==origSize){throw"Missing number at position "+iValue}return num};var getName=function(match,shortNames,longNames){var names=(lookAhead(match)?longNames:shortNames);var size=0;for(var j=0;j<names.length;j++){size=Math.max(size,names[j].length)}var name="";var iInit=iValue;while(size>0&&iValue<value.length){name+=value.charAt(iValue++);for(var i=0;i<names.length;i++){if(name==names[i]){return i+1}}size--}throw"Unknown name at position "+iInit};var checkLiteral=function(){if(value.charAt(iValue)!=format.charAt(iFormat)){throw"Unexpected literal at position "+iValue}iValue++};var iValue=0;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{checkLiteral()}}else{switch(format.charAt(iFormat)){case"d":day=getNumber("d");break;case"D":getName("D",dayNamesShort,dayNames);break;case"m":month=getNumber("m");break;case"M":month=getName("M",monthNamesShort,monthNames);break;case"y":year=getNumber("y");break;case"@":var date=new Date(getNumber("@"));year=date.getFullYear();month=date.getMonth()+1;day=date.getDate();break;case"'":if(lookAhead("'")){checkLiteral()}else{literal=true}break;default:checkLiteral()}}}if(year<100){year+=new Date().getFullYear()-new Date().getFullYear()%100+(year<=shortYearCutoff?0:-100)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TIMESTAMP:"@",W3C:"yy-mm-dd",formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var formatNumber=function(match,value){return(lookAhead(match)&&value<10?"0":"")+value};var formatName=function(match,value,shortNames,longNames){return(lookAhead(match)?longNames[value]:shortNames[value])};var output="";var literal=false;if(date){for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{output+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":output+=formatNumber("d",date.getDate());break;case"D":output+=formatName("D",date.getDay(),dayNamesShort,dayNames);break;case"m":output+=formatNumber("m",date.getMonth()+1);break;case"M":output+=formatName("M",date.getMonth(),monthNamesShort,monthNames);break;case"y":output+=(lookAhead("y")?date.getFullYear():(date.getYear()%100<10?"0":"")+date.getYear()%100);break;case"@":output+=date.getTime();break;case"'":if(lookAhead("'")){output+="'"}else{literal=true}break;default:output+=format.charAt(iFormat)}}}}return output},_possibleChars:function(format){var chars="";var literal=false;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{chars+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":case"m":case"y":case"@":chars+="0123456789";break;case"D":case"M":return null;case"'":if(lookAhead("'")){chars+="'"}else{literal=true}break;default:chars+=format.charAt(iFormat)}}}return chars},_get:function(inst,name){return inst.settings[name]!==undefined?inst.settings[name]:this._defaults[name]},_setDateFromField:function(inst){var dateFormat=this._get(inst,"dateFormat");var dates=inst.input?inst.input.val().split(this._get(inst,"rangeSeparator")):null;inst.endDay=inst.endMonth=inst.endYear=null;var date=defaultDate=this._getDefaultDate(inst);if(dates.length>0){var settings=this._getFormatConfig(inst);if(dates.length>1){date=this.parseDate(dateFormat,dates[1],settings)||defaultDate;inst.endDay=date.getDate();inst.endMonth=date.getMonth();inst.endYear=date.getFullYear()}try{date=this.parseDate(dateFormat,dates[0],settings)||defaultDate}catch(e){this.log(e);date=defaultDate}}inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();inst.currentDay=(dates[0]?date.getDate():0);inst.currentMonth=(dates[0]?date.getMonth():0);inst.currentYear=(dates[0]?date.getFullYear():0);this._adjustInstDate(inst)},_getDefaultDate:function(inst){var date=this._determineDate(this._get(inst,"defaultDate"),new Date());var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);return date},_determineDate:function(date,defaultDate){var offsetNumeric=function(offset){var date=new Date();date.setDate(date.getDate()+offset);return date};var offsetString=function(offset,getDaysInMonth){var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||"d"){case"d":case"D":day+=(matches[1]-0);break;case"w":case"W":day+=(matches[1]*7);break;case"m":case"M":month+=(matches[1]-0);day=Math.min(day,getDaysInMonth(year,month));break;case"y":case"Y":year+=(matches[1]-0);day=Math.min(day,getDaysInMonth(year,month));break}matches=pattern.exec(offset)}return new Date(year,month,day)};date=(date==null?defaultDate:(typeof date=="string"?offsetString(date,this._getDaysInMonth):(typeof date=="number"?(isNaN(date)?defaultDate:offsetNumeric(date)):date)));date=(date&&date.toString()=="Invalid Date"?defaultDate:date);if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0)}return this._daylightSavingAdjust(date)},_daylightSavingAdjust:function(date){if(!date){return null}date.setHours(date.getHours()>12?date.getHours()+2:0);return date},_setDate:function(inst,date,endDate){var clear=!(date);date=this._determineDate(date,new Date());inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if(this._get(inst,"rangeSelect")){if(endDate){endDate=this._determineDate(endDate,null);inst.endDay=endDate.getDate();inst.endMonth=endDate.getMonth();inst.endYear=endDate.getFullYear()}else{inst.endDay=inst.currentDay;inst.endMonth=inst.currentMonth;inst.endYear=inst.currentYear}}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst)+(!this._get(inst,"rangeSelect")?"":this._get(inst,"rangeSeparator")+this._formatDate(inst,inst.endDay,inst.endMonth,inst.endYear)))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));if(this._get(inst,"rangeSelect")){return[inst.rangeStart||startDate,(!inst.endYear?inst.rangeStart||startDate:this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)))]}else{return startDate}},_generateDatepicker:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var showStatus=this._get(inst,"showStatus");var isRTL=this._get(inst,"isRTL");var clear=(this._get(inst,"mandatory")?"":'<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(\'#'+inst.id+"');\""+(showStatus?this._addStatus(inst,this._get(inst,"clearStatus")||"&#xa0;"):"")+">"+this._get(inst,"clearText")+"</a></div>");var controls='<div class="ui-datepicker-control">'+(isRTL?"":clear)+'<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"'+(showStatus?this._addStatus(inst,this._get(inst,"closeStatus")||"&#xa0;"):"")+">"+this._get(inst,"closeText")+"</a></div>"+(isRTL?clear:"")+"</div>";var prompt=this._get(inst,"prompt");var closeAtTop=this._get(inst,"closeAtTop");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var stepMonths=this._get(inst,"stepMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth;var drawYear=inst.drawYear;if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate()));maxDraw=(minDate&&maxDraw<minDate?minDate:maxDraw);while(this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))>maxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev='<div class="ui-datepicker-prev">'+(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?"<a onclick=\"jQuery.datepicker._adjustDate('#"+inst.id+"', -"+stepMonths+", 'M');\""+(showStatus?this._addStatus(inst,this._get(inst,"prevStatus")||"&#xa0;"):"")+">"+prevText+"</a>":(hideIfNoPrevNext?"":"<label>"+prevText+"</label>"))+"</div>";var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next='<div class="ui-datepicker-next">'+(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?"<a onclick=\"jQuery.datepicker._adjustDate('#"+inst.id+"', +"+stepMonths+", 'M');\""+(showStatus?this._addStatus(inst,this._get(inst,"nextStatus")||"&#xa0;"):"")+">"+nextText+"</a>":(hideIfNoPrevNext?"":"<label>"+nextText+"</label>"))+"</div>";var currentText=this._get(inst,"currentText");currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,today,this._getFormatConfig(inst)));var html=(prompt?'<div class="'+this._promptClass+'">'+prompt+"</div>":"")+(closeAtTop&&!inst.inline?controls:"")+'<div class="ui-datepicker-links">'+(isRTL?next:prev)+(this._isInRange(inst,(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today))?'<div class="ui-datepicker-current"><a onclick="jQuery.datepicker._gotoToday(\'#'+inst.id+"');\""+(showStatus?this._addStatus(inst,this._get(inst,"currentStatus")||"&#xa0;"):"")+">"+currentText+"</a></div>":"")+(isRTL?prev:next)+"</div>";var firstDay=this._get(inst,"firstDay");var changeFirstDay=this._get(inst,"changeFirstDay");var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var beforeShowDay=this._get(inst,"beforeShowDay");var highlightWeek=this._get(inst,"highlightWeek");var showOtherMonths=this._get(inst,"showOtherMonths");var showWeeks=this._get(inst,"showWeeks");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var status=(showStatus?this._get(inst,"dayStatus")||"&#xa0;":"");var dateStatus=this._get(inst,"statusForDate")||this.dateStatus;var endDate=inst.endDay?this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)):currentDate;for(var row=0;row<numMonths[0];row++){for(var col=0;col<numMonths[1];col++){var selectedDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,inst.selectedDay));html+='<div class="ui-datepicker-one-month'+(col==0?" ui-datepicker-new-row":"")+'">'+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,showStatus,monthNames)+'<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead><tr class="ui-datepicker-title-row">'+(showWeeks?"<td>"+this._get(inst,"weekHeader")+"</td>":"");for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;var dayStatus=(status.indexOf("DD")>-1?status.replace(/DD/,dayNames[day]):status.replace(/D/,dayNamesShort[day]));html+="<td"+((dow+firstDay+6)%7>=5?' class="ui-datepicker-week-end-cell"':"")+">"+(!changeFirstDay?"<span":"<a onclick=\"jQuery.datepicker._changeFirstDay('#"+inst.id+"', "+day+');"')+(showStatus?this._addStatus(inst,dayStatus):"")+' title="'+dayNames[day]+'">'+dayNamesMin[day]+(changeFirstDay?"</a>":"</span>")+"</td>"}html+="</tr></thead><tbody>";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow<numRows;dRow++){html+='<tr class="ui-datepicker-days-row">'+(showWeeks?'<td class="ui-datepicker-week-col">'+calculateWeek(printDate)+"</td>":"");for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=otherMonth||!daySettings[0]||(minDate&&printDate<minDate)||(maxDate&&printDate>maxDate);html+='<td class="ui-datepicker-days-cell'+((dow+firstDay+6)%7>=5?" ui-datepicker-week-end-cell":"")+(otherMonth?" ui-datepicker-otherMonth":"")+(printDate.getTime()==selectedDate.getTime()&&drawMonth==inst.selectedMonth?" ui-datepicker-days-cell-over":"")+(unselectable?" "+this._unselectableClass:"")+(otherMonth&&!showOtherMonths?"":" "+daySettings[1]+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" "+this._currentClass:"")+(printDate.getTime()==today.getTime()?" ui-datepicker-today":""))+'"'+((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':"")+(unselectable?(highlightWeek?" onmouseover=\"jQuery(this).parent().addClass('ui-datepicker-week-over');\" onmouseout=\"jQuery(this).parent().removeClass('ui-datepicker-week-over');\"":""):" onmouseover=\"jQuery(this).addClass('ui-datepicker-days-cell-over')"+(highlightWeek?".parent().addClass('ui-datepicker-week-over')":"")+";"+(!showStatus||(otherMonth&&!showOtherMonths)?"":"jQuery('#ui-datepicker-status-"+inst.id+"').html('"+(dateStatus.apply((inst.input?inst.input[0]:null),[printDate,inst])||"&#xa0;")+"');")+"\" onmouseout=\"jQuery(this).removeClass('ui-datepicker-days-cell-over')"+(highlightWeek?".parent().removeClass('ui-datepicker-week-over')":"")+";"+(!showStatus||(otherMonth&&!showOtherMonths)?"":"jQuery('#ui-datepicker-status-"+inst.id+"').html('&#xa0;');")+'" onclick="jQuery.datepicker._selectDay(\'#'+inst.id+"',"+drawMonth+","+drawYear+', this);"')+">"+(otherMonth?(showOtherMonths?printDate.getDate():"&#xa0;"):(unselectable?printDate.getDate():"<a>"+printDate.getDate()+"</a>"))+"</td>";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}html+="</tr>"}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}html+="</tbody></table></div>"}}html+=(showStatus?'<div style="clear: both;"></div><div id="ui-datepicker-status-'+inst.id+'" class="ui-datepicker-status">'+(this._get(inst,"initStatus")||"&#xa0;")+"</div>":"")+(!closeAtTop&&!inst.inline?controls:"")+'<div style="clear: both;"></div>'+($.browser.msie&&parseInt($.browser.version)<7&&!inst.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>':"");return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,showStatus,monthNames){minDate=(inst.rangeStart&&minDate&&selectedDate<minDate?selectedDate:minDate);var html='<div class="ui-datepicker-header">';if(secondary||!this._get(inst,"changeMonth")){html+=monthNames[drawMonth]+"&#xa0;"}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);html+='<select class="ui-datepicker-new-month" onchange="jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'M');\" onclick=\"jQuery.datepicker._clickMonthYear('#"+inst.id+"');\""+(showStatus?this._addStatus(inst,this._get(inst,"monthStatus")||"&#xa0;"):"")+">";for(var month=0;month<12;month++){if((!inMinYear||month>=minDate.getMonth())&&(!inMaxYear||month<=maxDate.getMonth())){html+='<option value="'+month+'"'+(month==drawMonth?' selected="selected"':"")+">"+monthNames[month]+"</option>"}}html+="</select>"}if(secondary||!this._get(inst,"changeYear")){html+=drawYear}else{var years=this._get(inst,"yearRange").split(":");var year=0;var endYear=0;if(years.length!=2){year=drawYear-10;endYear=drawYear+10}else{if(years[0].charAt(0)=="+"||years[0].charAt(0)=="-"){year=endYear=new Date().getFullYear();year+=parseInt(years[0],10);endYear+=parseInt(years[1],10)}else{year=parseInt(years[0],10);endYear=parseInt(years[1],10)}}year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='<select class="ui-datepicker-new-year" onchange="jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'Y');\" onclick=\"jQuery.datepicker._clickMonthYear('#"+inst.id+"');\""+(showStatus?this._addStatus(inst,this._get(inst,"yearStatus")||"&#xa0;"):"")+">";for(;year<=endYear;year++){html+='<option value="'+year+'"'+(year==drawYear?' selected="selected"':"")+">"+year+"</option>"}html+="</select>"}html+="</div>";return html},_addStatus:function(inst,text){return" onmouseover=\"jQuery('#ui-datepicker-status-"+inst.id+"').html('"+text+"');\" onmouseout=\"jQuery('#ui-datepicker-status-"+inst.id+"').html('&#xa0;');\""},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._daylightSavingAdjust(new Date(year,month,day));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[new Date(inst.selectedYear,inst.selectedMonth,1),inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax,checkRange){var date=this._determineDate(this._get(inst,minMax+"Date"),null);return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date))},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var newMinDate=(!inst.rangeStart?null:this._daylightSavingAdjust(new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay)));newMinDate=(newMinDate&&inst.rangeStart<newMinDate?inst.rangeStart:newMinDate);var minDate=newMinDate||this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");return((!minDate||date>=minDate)&&(!maxDate||date<=maxDate))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$(document).ready(function(){$(document.body).append($.datepicker.dpDiv).mousedown($.datepicker._checkExternalClick)})})(jQuery);(function(C){C.effects=C.effects||{};C.extend(C.effects,{save:function(F,G){for(var E=0;E<G.length;E++){if(G[E]!==null){C.data(F[0],"ec.storage."+G[E],F[0].style[G[E]])}}},restore:function(F,G){for(var E=0;E<G.length;E++){if(G[E]!==null){F.css(G[E],C.data(F[0],"ec.storage."+G[E]))}}},setMode:function(E,F){if(F=="toggle"){F=E.is(":hidden")?"show":"hide"}return F},getBaseline:function(F,G){var H,E;switch(F[0]){case"top":H=0;break;case"middle":H=0.5;break;case"bottom":H=1;break;default:H=F[0]/G.height}switch(F[1]){case"left":E=0;break;case"center":E=0.5;break;case"right":E=1;break;default:E=F[1]/G.width}return{x:E,y:H}},createWrapper:function(F){if(F.parent().attr("id")=="fxWrapper"){return F}var E={width:F.outerWidth({margin:true}),height:F.outerHeight({margin:true}),"float":F.css("float")};F.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');var I=F.parent();if(F.css("position")=="static"){I.css({position:"relative"});F.css({position:"relative"})}else{var H=F.css("top");if(isNaN(parseInt(H))){H="auto"}var G=F.css("left");if(isNaN(parseInt(G))){G="auto"}I.css({position:F.css("position"),top:H,left:G,zIndex:F.css("z-index")}).show();F.css({position:"relative",top:0,left:0})}I.css(E);return I},removeWrapper:function(E){if(E.parent().attr("id")=="fxWrapper"){return E.parent().replaceWith(E)}return E},setTransition:function(F,G,E,H){H=H||{};C.each(G,function(J,I){unit=F.cssUnit(I);if(unit[0]>0){H[I]=unit[0]*E+unit[1]}});return H},animateClass:function(G,H,J,I){var E=(typeof J=="function"?J:(I?I:null));var F=(typeof J=="object"?J:null);return this.each(function(){var O={};var M=C(this);var N=M.attr("style")||"";if(typeof N=="object"){N=N["cssText"]}if(G.toggle){M.hasClass(G.toggle)?G.remove=G.toggle:G.add=G.toggle}var K=C.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(G.add){M.addClass(G.add)}if(G.remove){M.removeClass(G.remove)}var L=C.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(G.add){M.removeClass(G.add)}if(G.remove){M.addClass(G.remove)}for(var P in L){if(typeof L[P]!="function"&&L[P]&&P.indexOf("Moz")==-1&&P.indexOf("length")==-1&&L[P]!=K[P]&&(P.match(/color/i)||(!P.match(/color/i)&&!isNaN(parseInt(L[P],10))))&&(K.position!="static"||(K.position=="static"&&!P.match(/left|top|bottom|right/)))){O[P]=L[P]}}M.animate(O,H,F,function(){if(typeof C(this).attr("style")=="object"){C(this).attr("style")["cssText"]="";C(this).attr("style")["cssText"]=N}else{C(this).attr("style",N)}if(G.add){C(this).addClass(G.add)}if(G.remove){C(this).removeClass(G.remove)}if(E){E.apply(this,arguments)}})})}});C.fn.extend({_show:C.fn.show,_hide:C.fn.hide,__toggle:C.fn.toggle,_addClass:C.fn.addClass,_removeClass:C.fn.removeClass,_toggleClass:C.fn.toggleClass,effect:function(E,G,F,H){return C.effects[E]?C.effects[E].call(this,{method:E,options:G||{},duration:F,callback:H}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||/(slow|normal|fast)/.test(arguments[0]))){return this._show.apply(this,arguments)}else{var E=arguments[1]||{};E["mode"]="show";return this.effect.apply(this,[arguments[0],E,arguments[2]||E.duration,arguments[3]||E.callback])}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||/(slow|normal|fast)/.test(arguments[0]))){return this._hide.apply(this,arguments)}else{var E=arguments[1]||{};E["mode"]="hide";return this.effect.apply(this,[arguments[0],E,arguments[2]||E.duration,arguments[3]||E.callback])}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||/(slow|normal|fast)/.test(arguments[0]))||(arguments[0].constructor==Function)){return this.__toggle.apply(this,arguments)}else{var E=arguments[1]||{};E["mode"]="toggle";return this.effect.apply(this,[arguments[0],E,arguments[2]||E.duration,arguments[3]||E.callback])}},addClass:function(F,E,H,G){return E?C.effects.animateClass.apply(this,[{add:F},E,H,G]):this._addClass(F)},removeClass:function(F,E,H,G){return E?C.effects.animateClass.apply(this,[{remove:F},E,H,G]):this._removeClass(F)},toggleClass:function(F,E,H,G){return E?C.effects.animateClass.apply(this,[{toggle:F},E,H,G]):this._toggleClass(F)},morph:function(E,G,F,I,H){return C.effects.animateClass.apply(this,[{add:G,remove:E},F,I,H])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(E){var F=this.css(E),G=[];C.each(["em","px","%","pt"],function(H,I){if(F.indexOf(I)>0){G=[parseFloat(F),I]}});return G}});jQuery.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(F,E){jQuery.fx.step[E]=function(G){if(G.state==0){G.start=D(G.elem,E);G.end=B(G.end)}G.elem.style[E]="rgb("+[Math.max(Math.min(parseInt((G.pos*(G.end[0]-G.start[0]))+G.start[0]),255),0),Math.max(Math.min(parseInt((G.pos*(G.end[1]-G.start[1]))+G.start[1]),255),0),Math.max(Math.min(parseInt((G.pos*(G.end[2]-G.start[2]))+G.start[2]),255),0)].join(",")+")"}});function B(F){var E;if(F&&F.constructor==Array&&F.length==3){return F}if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return[parseInt(E[1]),parseInt(E[2]),parseInt(E[3])]}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return[parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55]}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return[parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16)]}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return[parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16)]}if(E=/rgba\(0, 0, 0, 0\)/.exec(F)){return A["transparent"]}return A[jQuery.trim(F).toLowerCase()]}function D(G,E){var F;do{F=jQuery.curCSS(G,E);if(F!=""&&F!="transparent"||jQuery.nodeName(G,"body")){break}E="backgroundColor"}while(G=G.parentNode);return B(F)}var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};jQuery.easing["jswing"]=jQuery.easing["swing"];jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(F,G,E,I,H){return jQuery.easing[jQuery.easing.def](F,G,E,I,H)},easeInQuad:function(F,G,E,I,H){return I*(G/=H)*G+E},easeOutQuad:function(F,G,E,I,H){return -I*(G/=H)*(G-2)+E},easeInOutQuad:function(F,G,E,I,H){if((G/=H/2)<1){return I/2*G*G+E}return -I/2*((--G)*(G-2)-1)+E},easeInCubic:function(F,G,E,I,H){return I*(G/=H)*G*G+E},easeOutCubic:function(F,G,E,I,H){return I*((G=G/H-1)*G*G+1)+E},easeInOutCubic:function(F,G,E,I,H){if((G/=H/2)<1){return I/2*G*G*G+E}return I/2*((G-=2)*G*G+2)+E},easeInQuart:function(F,G,E,I,H){return I*(G/=H)*G*G*G+E},easeOutQuart:function(F,G,E,I,H){return -I*((G=G/H-1)*G*G*G-1)+E},easeInOutQuart:function(F,G,E,I,H){if((G/=H/2)<1){return I/2*G*G*G*G+E}return -I/2*((G-=2)*G*G*G-2)+E},easeInQuint:function(F,G,E,I,H){return I*(G/=H)*G*G*G*G+E},easeOutQuint:function(F,G,E,I,H){return I*((G=G/H-1)*G*G*G*G+1)+E},easeInOutQuint:function(F,G,E,I,H){if((G/=H/2)<1){return I/2*G*G*G*G*G+E}return I/2*((G-=2)*G*G*G*G+2)+E},easeInSine:function(F,G,E,I,H){return -I*Math.cos(G/H*(Math.PI/2))+I+E},easeOutSine:function(F,G,E,I,H){return I*Math.sin(G/H*(Math.PI/2))+E},easeInOutSine:function(F,G,E,I,H){return -I/2*(Math.cos(Math.PI*G/H)-1)+E},easeInExpo:function(F,G,E,I,H){return(G==0)?E:I*Math.pow(2,10*(G/H-1))+E},easeOutExpo:function(F,G,E,I,H){return(G==H)?E+I:I*(-Math.pow(2,-10*G/H)+1)+E},easeInOutExpo:function(F,G,E,I,H){if(G==0){return E}if(G==H){return E+I}if((G/=H/2)<1){return I/2*Math.pow(2,10*(G-1))+E}return I/2*(-Math.pow(2,-10*--G)+2)+E},easeInCirc:function(F,G,E,I,H){return -I*(Math.sqrt(1-(G/=H)*G)-1)+E},easeOutCirc:function(F,G,E,I,H){return I*Math.sqrt(1-(G=G/H-1)*G)+E},easeInOutCirc:function(F,G,E,I,H){if((G/=H/2)<1){return -I/2*(Math.sqrt(1-G*G)-1)+E}return I/2*(Math.sqrt(1-(G-=2)*G)+1)+E},easeInElastic:function(F,H,E,L,K){var I=1.70158;var J=0;var G=L;if(H==0){return E}if((H/=K)==1){return E+L}if(!J){J=K*0.3}if(G<Math.abs(L)){G=L;var I=J/4}else{var I=J/(2*Math.PI)*Math.asin(L/G)}return -(G*Math.pow(2,10*(H-=1))*Math.sin((H*K-I)*(2*Math.PI)/J))+E},easeOutElastic:function(F,H,E,L,K){var I=1.70158;var J=0;var G=L;if(H==0){return E}if((H/=K)==1){return E+L}if(!J){J=K*0.3}if(G<Math.abs(L)){G=L;var I=J/4}else{var I=J/(2*Math.PI)*Math.asin(L/G)}return G*Math.pow(2,-10*H)*Math.sin((H*K-I)*(2*Math.PI)/J)+L+E},easeInOutElastic:function(F,H,E,L,K){var I=1.70158;var J=0;var G=L;if(H==0){return E}if((H/=K/2)==2){return E+L}if(!J){J=K*(0.3*1.5)}if(G<Math.abs(L)){G=L;var I=J/4}else{var I=J/(2*Math.PI)*Math.asin(L/G)}if(H<1){return -0.5*(G*Math.pow(2,10*(H-=1))*Math.sin((H*K-I)*(2*Math.PI)/J))+E}return G*Math.pow(2,-10*(H-=1))*Math.sin((H*K-I)*(2*Math.PI)/J)*0.5+L+E},easeInBack:function(F,G,E,J,I,H){if(H==undefined){H=1.70158}return J*(G/=I)*G*((H+1)*G-H)+E},easeOutBack:function(F,G,E,J,I,H){if(H==undefined){H=1.70158}return J*((G=G/I-1)*G*((H+1)*G+H)+1)+E},easeInOutBack:function(F,G,E,J,I,H){if(H==undefined){H=1.70158}if((G/=I/2)<1){return J/2*(G*G*(((H*=(1.525))+1)*G-H))+E}return J/2*((G-=2)*G*(((H*=(1.525))+1)*G+H)+2)+E},easeInBounce:function(F,G,E,I,H){return I-jQuery.easing.easeOutBounce(F,H-G,0,I,H)+E},easeOutBounce:function(F,G,E,I,H){if((G/=H)<(1/2.75)){return I*(7.5625*G*G)+E}else{if(G<(2/2.75)){return I*(7.5625*(G-=(1.5/2.75))*G+0.75)+E}else{if(G<(2.5/2.75)){return I*(7.5625*(G-=(2.25/2.75))*G+0.9375)+E}else{return I*(7.5625*(G-=(2.625/2.75))*G+0.984375)+E}}}},easeInOutBounce:function(F,G,E,I,H){if(G<H/2){return jQuery.easing.easeInBounce(F,G*2,0,I,H)*0.5+E}return jQuery.easing.easeOutBounce(F,G*2-H,0,I,H)*0.5+I*0.5+E}})})(jQuery);(function(A){A.effects.blind=function(B){return this.queue(function(){var D=A(this),C=["position","top","left"];var H=A.effects.setMode(D,B.options.mode||"hide");var G=B.options.direction||"vertical";A.effects.save(D,C);D.show();var J=A.effects.createWrapper(D).css({overflow:"hidden"});var E=(G=="vertical")?"height":"width";var I=(G=="vertical")?J.height():J.width();if(H=="show"){J.css(E,0)}var F={};F[E]=H=="show"?I:0;J.animate(F,B.duration,B.options.easing,function(){if(H=="hide"){D.hide()}A.effects.restore(D,C);A.effects.removeWrapper(D);if(B.callback){B.callback.apply(D[0],arguments)}D.dequeue()})})}})(jQuery);(function(A){A.effects.bounce=function(B){return this.queue(function(){var E=A(this),K=["position","top","left"];var J=A.effects.setMode(E,B.options.mode||"effect");var M=B.options.direction||"up";var C=B.options.distance||20;var D=B.options.times||5;var G=B.duration||250;if(/show|hide/.test(J)){K.push("opacity")}A.effects.save(E,K);E.show();A.effects.createWrapper(E);var F=(M=="up"||M=="down")?"top":"left";var O=(M=="up"||M=="left")?"pos":"neg";var C=B.options.distance||(F=="top"?E.outerHeight({margin:true})/3:E.outerWidth({margin:true})/3);if(J=="show"){E.css("opacity",0).css(F,O=="pos"?-C:C)}if(J=="hide"){C=C/(D*2)}if(J!="hide"){D--}if(J=="show"){var H={opacity:1};H[F]=(O=="pos"?"+=":"-=")+C;E.animate(H,G/2,B.options.easing);C=C/2;D--}for(var I=0;I<D;I++){var N={},L={};N[F]=(O=="pos"?"-=":"+=")+C;L[F]=(O=="pos"?"+=":"-=")+C;E.animate(N,G/2,B.options.easing).animate(L,G/2,B.options.easing);C=(J=="hide")?C*2:C/2}if(J=="hide"){var H={opacity:0};H[F]=(O=="pos"?"-=":"+=")+C;E.animate(H,G/2,B.options.easing,function(){E.hide();A.effects.restore(E,K);A.effects.removeWrapper(E);if(B.callback){B.callback.apply(this,arguments)}})}else{var N={},L={};N[F]=(O=="pos"?"-=":"+=")+C;L[F]=(O=="pos"?"+=":"-=")+C;E.animate(N,G/2,B.options.easing).animate(L,G/2,B.options.easing,function(){A.effects.restore(E,K);A.effects.removeWrapper(E);if(B.callback){B.callback.apply(this,arguments)}})}E.queue("fx",function(){E.dequeue()});E.dequeue()})}})(jQuery);(function(A){A.effects.clip=function(B){return this.queue(function(){var F=A(this),J=["position","top","left","height","width"];var I=A.effects.setMode(F,B.options.mode||"hide");var K=B.options.direction||"vertical";A.effects.save(F,J);F.show();var C=A.effects.createWrapper(F).css({overflow:"hidden"});var E=F[0].tagName=="IMG"?C:F;var G={size:(K=="vertical")?"height":"width",position:(K=="vertical")?"top":"left"};var D=(K=="vertical")?E.height():E.width();if(I=="show"){E.css(G.size,0);E.css(G.position,D/2)}var H={};H[G.size]=I=="show"?D:0;H[G.position]=I=="show"?0:D/2;E.animate(H,{queue:false,duration:B.duration,easing:B.options.easing,complete:function(){if(I=="hide"){F.hide()}A.effects.restore(F,J);A.effects.removeWrapper(F);if(B.callback){B.callback.apply(F[0],arguments)}F.dequeue()}})})}})(jQuery);(function(A){A.effects.drop=function(B){return this.queue(function(){var E=A(this),D=["position","top","left","opacity"];var I=A.effects.setMode(E,B.options.mode||"hide");var H=B.options.direction||"left";A.effects.save(E,D);E.show();A.effects.createWrapper(E);var F=(H=="up"||H=="down")?"top":"left";var C=(H=="up"||H=="left")?"pos":"neg";var J=B.options.distance||(F=="top"?E.outerHeight({margin:true})/2:E.outerWidth({margin:true})/2);if(I=="show"){E.css("opacity",0).css(F,C=="pos"?-J:J)}var G={opacity:I=="show"?1:0};G[F]=(I=="show"?(C=="pos"?"+=":"-="):(C=="pos"?"-=":"+="))+J;E.animate(G,{queue:false,duration:B.duration,easing:B.options.easing,complete:function(){if(I=="hide"){E.hide()}A.effects.restore(E,D);A.effects.removeWrapper(E);if(B.callback){B.callback.apply(this,arguments)}E.dequeue()}})})}})(jQuery);(function(A){A.effects.explode=function(B){return this.queue(function(){var I=B.options.pieces?Math.round(Math.sqrt(B.options.pieces)):3;var E=B.options.pieces?Math.round(Math.sqrt(B.options.pieces)):3;B.options.mode=B.options.mode=="toggle"?(A(this).is(":visible")?"hide":"show"):B.options.mode;var H=A(this).show().css("visibility","hidden");var J=H.offset();J.top-=parseInt(H.css("marginTop"))||0;J.left-=parseInt(H.css("marginLeft"))||0;var G=H.outerWidth(true);var C=H.outerHeight(true);for(var F=0;F<I;F++){for(var D=0;D<E;D++){H.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-D*(G/E),top:-F*(C/I)}).parent().addClass("effects-explode").css({position:"absolute",overflow:"hidden",width:G/E,height:C/I,left:J.left+D*(G/E)+(B.options.mode=="show"?(D-Math.floor(E/2))*(G/E):0),top:J.top+F*(C/I)+(B.options.mode=="show"?(F-Math.floor(I/2))*(C/I):0),opacity:B.options.mode=="show"?0:1}).animate({left:J.left+D*(G/E)+(B.options.mode=="show"?0:(D-Math.floor(E/2))*(G/E)),top:J.top+F*(C/I)+(B.options.mode=="show"?0:(F-Math.floor(I/2))*(C/I)),opacity:B.options.mode=="show"?1:0},B.duration||500)}}setTimeout(function(){B.options.mode=="show"?H.css({visibility:"visible"}):H.css({visibility:"visible"}).hide();if(B.callback){B.callback.apply(H[0])}H.dequeue();A(".effects-explode").remove()},B.duration||500)})}})(jQuery);(function(A){A.effects.fold=function(B){return this.queue(function(){var E=A(this),J=["position","top","left"];var G=A.effects.setMode(E,B.options.mode||"hide");var N=B.options.size||15;var M=!(!B.options.horizFirst);A.effects.save(E,J);E.show();var D=A.effects.createWrapper(E).css({overflow:"hidden"});var H=((G=="show")!=M);var F=H?["width","height"]:["height","width"];var C=H?[D.width(),D.height()]:[D.height(),D.width()];var I=/([0-9]+)%/.exec(N);if(I){N=parseInt(I[1])/100*C[G=="hide"?0:1]}if(G=="show"){D.css(M?{height:0,width:N}:{height:N,width:0})}var L={},K={};L[F[0]]=G=="show"?C[0]:N;K[F[1]]=G=="show"?C[1]:0;D.animate(L,B.duration/2,B.options.easing).animate(K,B.duration/2,B.options.easing,function(){if(G=="hide"){E.hide()}A.effects.restore(E,J);A.effects.removeWrapper(E);if(B.callback){B.callback.apply(E[0],arguments)}E.dequeue()})})}})(jQuery);(function(A){A.effects.highlight=function(B){return this.queue(function(){var E=A(this),D=["backgroundImage","backgroundColor","opacity"];var H=A.effects.setMode(E,B.options.mode||"show");var C=B.options.color||"#ffff99";var G=E.css("backgroundColor");A.effects.save(E,D);E.show();E.css({backgroundImage:"none",backgroundColor:C});var F={backgroundColor:G};if(H=="hide"){F["opacity"]=0}E.animate(F,{queue:false,duration:B.duration,easing:B.options.easing,complete:function(){if(H=="hide"){E.hide()}A.effects.restore(E,D);if(H=="show"&&jQuery.browser.msie){this.style.removeAttribute("filter")}if(B.callback){B.callback.apply(this,arguments)}E.dequeue()}})})}})(jQuery);(function(A){A.effects.pulsate=function(B){return this.queue(function(){var D=A(this);var F=A.effects.setMode(D,B.options.mode||"show");var E=B.options.times||5;if(F=="hide"){E--}if(D.is(":hidden")){D.css("opacity",0);D.show();D.animate({opacity:1},B.duration/2,B.options.easing);E=E-2}for(var C=0;C<E;C++){D.animate({opacity:0},B.duration/2,B.options.easing).animate({opacity:1},B.duration/2,B.options.easing)}if(F=="hide"){D.animate({opacity:0},B.duration/2,B.options.easing,function(){D.hide();if(B.callback){B.callback.apply(this,arguments)}})}else{D.animate({opacity:0},B.duration/2,B.options.easing).animate({opacity:1},B.duration/2,B.options.easing,function(){if(B.callback){B.callback.apply(this,arguments)}})}D.queue("fx",function(){D.dequeue()});D.dequeue()})}})(jQuery);(function(A){A.effects.puff=function(B){return this.queue(function(){var F=A(this);var C=A.extend(true,{},B.options);var H=A.effects.setMode(F,B.options.mode||"hide");var G=parseInt(B.options.percent)||150;C.fade=true;var E={height:F.height(),width:F.width()};var D=G/100;F.from=(H=="hide")?E:{height:E.height*D,width:E.width*D};C.from=F.from;C.percent=(H=="hide")?G:100;C.mode=H;F.effect("scale",C,B.duration,B.callback);F.dequeue()})};A.effects.scale=function(B){return this.queue(function(){var G=A(this);var D=A.extend(true,{},B.options);var J=A.effects.setMode(G,B.options.mode||"effect");var H=parseInt(B.options.percent)||(parseInt(B.options.percent)==0?0:(J=="hide"?0:100));var I=B.options.direction||"both";var C=B.options.origin;if(J!="effect"){D.origin=C||["middle","center"];D.restore=true}var F={height:G.height(),width:G.width()};G.from=B.options.from||(J=="show"?{height:0,width:0}:F);var E={y:I!="horizontal"?(H/100):1,x:I!="vertical"?(H/100):1};G.to={height:F.height*E.y,width:F.width*E.x};if(B.options.fade){if(J=="show"){G.from.opacity=0;G.to.opacity=1}if(J=="hide"){G.from.opacity=1;G.to.opacity=0}}D.from=G.from;D.to=G.to;D.mode=J;G.effect("size",D,B.duration,B.callback);G.dequeue()})};A.effects.size=function(B){return this.queue(function(){var C=A(this),N=["position","top","left","width","height","overflow","opacity"];var M=["position","top","left","overflow","opacity"];var J=["width","height","overflow"];var P=["fontSize"];var K=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"];var F=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"];var G=A.effects.setMode(C,B.options.mode||"effect");var I=B.options.restore||false;var E=B.options.scale||"both";var O=B.options.origin;var D={height:C.height(),width:C.width()};C.from=B.options.from||D;C.to=B.options.to||D;if(O){var H=A.effects.getBaseline(O,D);C.from.top=(D.height-C.from.height)*H.y;C.from.left=(D.width-C.from.width)*H.x;C.to.top=(D.height-C.to.height)*H.y;C.to.left=(D.width-C.to.width)*H.x}var L={from:{y:C.from.height/D.height,x:C.from.width/D.width},to:{y:C.to.height/D.height,x:C.to.width/D.width}};if(E=="box"||E=="both"){if(L.from.y!=L.to.y){N=N.concat(K);C.from=A.effects.setTransition(C,K,L.from.y,C.from);C.to=A.effects.setTransition(C,K,L.to.y,C.to)}if(L.from.x!=L.to.x){N=N.concat(F);C.from=A.effects.setTransition(C,F,L.from.x,C.from);C.to=A.effects.setTransition(C,F,L.to.x,C.to)}}if(E=="content"||E=="both"){if(L.from.y!=L.to.y){N=N.concat(P);C.from=A.effects.setTransition(C,P,L.from.y,C.from);C.to=A.effects.setTransition(C,P,L.to.y,C.to)}}A.effects.save(C,I?N:M);C.show();A.effects.createWrapper(C);C.css("overflow","hidden").css(C.from);if(E=="content"||E=="both"){K=K.concat(["marginTop","marginBottom"]).concat(P);F=F.concat(["marginLeft","marginRight"]);J=N.concat(K).concat(F);C.find("*[width]").each(function(){child=A(this);if(I){A.effects.save(child,J)}var Q={height:child.height(),width:child.width()};child.from={height:Q.height*L.from.y,width:Q.width*L.from.x};child.to={height:Q.height*L.to.y,width:Q.width*L.to.x};if(L.from.y!=L.to.y){child.from=A.effects.setTransition(child,K,L.from.y,child.from);child.to=A.effects.setTransition(child,K,L.to.y,child.to)}if(L.from.x!=L.to.x){child.from=A.effects.setTransition(child,F,L.from.x,child.from);child.to=A.effects.setTransition(child,F,L.to.x,child.to)}child.css(child.from);child.animate(child.to,B.duration,B.options.easing,function(){if(I){A.effects.restore(child,J)}})})}C.animate(C.to,{queue:false,duration:B.duration,easing:B.options.easing,complete:function(){if(G=="hide"){C.hide()}A.effects.restore(C,I?N:M);A.effects.removeWrapper(C);if(B.callback){B.callback.apply(this,arguments)}C.dequeue()}})})}})(jQuery);(function(A){A.effects.shake=function(B){return this.queue(function(){var E=A(this),K=["position","top","left"];var J=A.effects.setMode(E,B.options.mode||"effect");var M=B.options.direction||"left";var C=B.options.distance||20;var D=B.options.times||3;var G=B.duration||B.options.duration||140;A.effects.save(E,K);E.show();A.effects.createWrapper(E);var F=(M=="up"||M=="down")?"top":"left";var O=(M=="up"||M=="left")?"pos":"neg";var H={},N={},L={};H[F]=(O=="pos"?"-=":"+=")+C;N[F]=(O=="pos"?"+=":"-=")+C*2;L[F]=(O=="pos"?"-=":"+=")+C*2;E.animate(H,G,B.options.easing);for(var I=1;I<D;I++){E.animate(N,G,B.options.easing).animate(L,G,B.options.easing)}E.animate(N,G,B.options.easing).animate(H,G/2,B.options.easing,function(){A.effects.restore(E,K);A.effects.removeWrapper(E);if(B.callback){B.callback.apply(this,arguments)}});E.queue("fx",function(){E.dequeue()});E.dequeue()})}})(jQuery);(function(A){A.effects.slide=function(B){return this.queue(function(){var E=A(this),D=["position","top","left"];var I=A.effects.setMode(E,B.options.mode||"show");var H=B.options.direction||"left";A.effects.save(E,D);E.show();A.effects.createWrapper(E).css({overflow:"hidden"});var F=(H=="up"||H=="down")?"top":"left";var C=(H=="up"||H=="left")?"pos":"neg";var J=B.options.distance||(F=="top"?E.outerHeight({margin:true}):E.outerWidth({margin:true}));if(I=="show"){E.css(F,C=="pos"?-J:J)}var G={};G[F]=(I=="show"?(C=="pos"?"+=":"-="):(C=="pos"?"-=":"+="))+J;E.animate(G,{queue:false,duration:B.duration,easing:B.options.easing,complete:function(){if(I=="hide"){E.hide()}A.effects.restore(E,D);A.effects.removeWrapper(E);if(B.callback){B.callback.apply(this,arguments)}E.dequeue()}})})}})(jQuery);(function(A){A.effects.transfer=function(B){return this.queue(function(){var E=A(this);var G=A.effects.setMode(E,B.options.mode||"effect");var F=A(B.options.to);var C=E.offset();var D=A('<div class="ui-effects-transfer"></div>').appendTo(document.body);if(B.options.className){D.addClass(B.options.className)}D.addClass(B.options.className);D.css({top:C.top,left:C.left,height:E.outerHeight()-parseInt(D.css("borderTopWidth"))-parseInt(D.css("borderBottomWidth")),width:E.outerWidth()-parseInt(D.css("borderLeftWidth"))-parseInt(D.css("borderRightWidth")),position:"absolute"});C=F.offset();animation={top:C.top,left:C.left,height:F.outerHeight()-parseInt(D.css("borderTopWidth"))-parseInt(D.css("borderBottomWidth")),width:F.outerWidth()-parseInt(D.css("borderLeftWidth"))-parseInt(D.css("borderRightWidth"))};D.animate(animation,B.duration,B.options.easing,function(){D.remove();if(B.callback){B.callback.apply(E[0],arguments)}E.dequeue()})})}})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery-ui/js/jquery.blockUI.js b/fannie/src/jquery-ui/js/jquery.blockUI.js new file mode 100644 index 000000000..6aeed5ce2 --- /dev/null +++ b/fannie/src/jquery-ui/js/jquery.blockUI.js @@ -0,0 +1,398 @@ +/* + * jQuery blockUI plugin + * Version 2.15 (1-MAR-2009) + * @requires jQuery v1.2.3 or later + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007-2008 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Thanks to Amir-Hossein Sobhi for some excellent contributions! + */ + +;(function($) { + +if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) { + alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery); + return; +} + +$.fn._fadeIn = $.fn.fadeIn; + +// global $ methods for blocking/unblocking the entire page +$.blockUI = function(opts) { install(window, opts); }; +$.unblockUI = function(opts) { remove(window, opts); }; + +// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) +$.growlUI = function(title, message, timeout) { + var $m = $('<div class="growlUI"></div>'); + if (title) $m.append('<h1>'+title+'</h1>'); + if (message) $m.append('<h2>'+message+'</h2>'); + if (timeout == undefined) timeout = 3000; + $.blockUI({ + message: $m, fadeIn: 700, fadeOut: 1000, centerY: false, + timeout: timeout, showOverlay: false, + css: $.blockUI.defaults.growlCSS + }); +}; + +// plugin method for blocking element content +$.fn.block = function(opts) { + return this.each(function() { + if ($.css(this,'position') == 'static') + this.style.position = 'relative'; + if ($.browser.msie) + this.style.zoom = 1; // force 'hasLayout' + install(this, opts); + }); +}; + +// plugin method for unblocking element content +$.fn.unblock = function(opts) { + return this.each(function() { + remove(this, opts); + }); +}; + +$.blockUI.version = 2.14; // 2nd generation blocking at no extra cost! + +// override these in your code to change the default behavior and style +$.blockUI.defaults = { + // message displayed when blocking (use null for no message) + message: '<h1>Please wait...</h1>', + + // styles for the message when blocking; if you wish to disable + // these and use an external stylesheet then do this in your code: + // $.blockUI.defaults.css = {}; + css: { + padding: 0, + margin: 0, + width: '30%', + top: '40%', + left: '35%', + textAlign: 'center', + color: '#000', + border: '3px solid #aaa', + backgroundColor:'#fff', + cursor: 'wait' + }, + + // styles for the overlay + overlayCSS: { + backgroundColor: '#000', + opacity: '0.6' + }, + + // styles applied when using $.growlUI + growlCSS: { + width: '350px', + top: '10px', + left: '', + right: '10px', + border: 'none', + padding: '5px', + opacity: '0.6', + cursor: null, + color: '#fff', + backgroundColor: '#000', + '-webkit-border-radius': '10px', + '-moz-border-radius': '10px' + }, + + // z-index for the blocking overlay + baseZ: 1000, + + // set these to true to have the message automatically centered + centerX: true, // <-- only effects element blocking (page block controlled via css above) + centerY: true, + + // allow body element to be stetched in ie6; this makes blocking look better + // on "short" pages. disable if you wish to prevent changes to the body height + allowBodyStretch: true, + + // be default blockUI will supress tab navigation from leaving blocking content; + constrainTabKey: true, + + // fadeIn time in millis; set to 0 to disable fadeIn on block + fadeIn: 200, + + // fadeOut time in millis; set to 0 to disable fadeOut on unblock + fadeOut: 400, + + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock + timeout: 0, + + // disable if you don't want to show the overlay + showOverlay: true, + + // if true, focus will be placed in the first available input field when + // page blocking + focusInput: true, + + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) + applyPlatformOpacityRules: true, + + // callback method invoked when unblocking has completed; the callback is + // passed the element that has been unblocked (which is the window object for page + // blocks) and the options that were passed to the unblock call: + // onUnblock(element, options) + onUnblock: null, + + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 + quirksmodeOffsetHack: 4 +}; + +// private data and functions follow... + +var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent); +var pageBlock = null; +var pageBlockEls = []; + +function install(el, opts) { + var full = (el == window); + var msg = opts && opts.message !== undefined ? opts.message : undefined; + opts = $.extend({}, $.blockUI.defaults, opts || {}); + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); + var css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + msg = msg === undefined ? opts.message : msg; + + // remove the current block (if there is one) + if (full && pageBlock) + remove(window, {fadeOut:0}); + + // if an existing element is being used as the blocking content then we capture + // its current place in the DOM (and current display style) so we can restore + // it when we unblock + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { + var node = msg.jquery ? msg[0] : msg; + var data = {}; + $(el).data('blockUI.history', data); + data.el = node; + data.parent = node.parentNode; + data.display = node.style.display; + data.position = node.style.position; + if (data.parent) + data.parent.removeChild(node); + } + + var z = opts.baseZ; + + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; + // layer1 is the iframe layer which is used to supress bleed through of underlying content + // layer2 is the overlay layer which has opacity and a wait cursor + // layer3 is the message content that is displayed while blocking + + var lyr1 = ($.browser.msie) ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="about:blank"></iframe>') + : $('<div class="blockUI" style="display:none"></div>'); + var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;cursor:wait;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>'); + var lyr3 = full ? $('<div class="blockUI blockMsg blockPage" style="z-index:'+z+';display:none;position:fixed"></div>') + : $('<div class="blockUI blockMsg blockElement" style="z-index:'+z+';display:none;position:absolute"></div>'); + + // if we have a message, style it + if (msg) + lyr3.css(css); + + // style the overlay + if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform))) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if ($.browser.msie) + lyr1.css('opacity','0.0'); + + $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = $.browser.msie && (!$.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr && lyr3[0].style.setExpression) { + // give body 100% height + if (full && opts.allowBodyStretch && $.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each([lyr1,lyr2,lyr3], function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"') + : s.setExpression('height','this.parentNode.offsetHeight + "px"'); + full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') + : s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ($.browser.msie && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn); + if (msg) + lyr3.fadeIn(opts.fadeIn); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(':input:enabled:visible',pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + full ? $.unblockUI(opts) : $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } +}; + +// remove the block +function remove(el, opts) { + var full = el == window; + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + var els = full ? $('body').children().filter('.blockUI') : $('.blockUI', el); + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + els.fadeOut(opts.fadeOut); + setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut); + } + else + reset(els, data, opts, el); +}; + +// move blocking element back into the DOM where it started +function reset(els,data,opts,el) { + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + if (data.parent) + data.parent.appendChild(data.el); + $(data.el).removeData('blockUI.history'); + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); +}; + +// bind/unbind the handler +function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + if (!full) + $el.data('blockUI.isBlocked', b); + + if (b && !opts.showOverlay) // don't prevent events when overlay not in use + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress'; + b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler); + +// former impl... +// var $e = $('a,:input'); +// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); +}; + +// event handler to suppress keyboard/mouse events when blocking +function handler(e) { + // allow tab navigation (conditionally) + if (e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target == els[els.length-1]; + var back = e.shiftKey && e.target == els[0]; + if (fwd || back) { + setTimeout(function(){focus(back)},10); + return false; + } + } + } + // allow events within the message content + if ($(e.target).parents('div.blockMsg').length > 0) + return true; + + // allow events for content that is not being blocked + return $(e.target).parents().children().filter('div.blockUI').length == 0; +}; + +function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); +}; + +function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; +}; + +function sz(el, p) { + return parseInt($.css(el,p))||0; +}; + +})(jQuery); diff --git a/fannie/src/jquery/addons/pager/jquery.tablesorter.pager.css b/fannie/src/jquery/addons/pager/jquery.tablesorter.pager.css new file mode 100644 index 000000000..8c8e9fca4 --- /dev/null +++ b/fannie/src/jquery/addons/pager/jquery.tablesorter.pager.css @@ -0,0 +1,25 @@ +div.tablesorterPager { + padding: 10px 0 10px 0; + background-color: #D6D2C2; + text-align: center; +} +div.tablesorterPager span { + padding: 0 5px 0 5px; +} +div.tablesorterPager input.prev { + width: auto; + margin-right: 10px; +} +div.tablesorterPager input.next { + width: auto; + margin-left: 10px; +} +div.tablesorterPager input { + font-size: 8px; + width: 50px; + border: 1px solid #330000; + text-align: center; +} + + + \ No newline at end of file diff --git a/fannie/src/jquery/addons/pager/jquery.tablesorter.pager.js b/fannie/src/jquery/addons/pager/jquery.tablesorter.pager.js new file mode 100644 index 000000000..cce6ea264 --- /dev/null +++ b/fannie/src/jquery/addons/pager/jquery.tablesorter.pager.js @@ -0,0 +1,184 @@ +(function($) { + $.extend({ + tablesorterPager: new function() { + + function updatePageDisplay(c) { + var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages); + } + + function setPageSize(table,size) { + var c = table.config; + c.size = size; + c.totalPages = Math.ceil(c.totalRows / c.size); + c.pagerPositionSet = false; + moveToPage(table); + fixPosition(table); + } + + function fixPosition(table) { + var c = table.config; + if(!c.pagerPositionSet && c.positionFixed) { + var c = table.config, o = $(table); + if(o.offset) { + c.container.css({ + top: o.offset().top + o.height() + 'px', + position: 'absolute' + }); + } + c.pagerPositionSet = true; + } + } + + function moveToFirstPage(table) { + var c = table.config; + c.page = 0; + moveToPage(table); + } + + function moveToLastPage(table) { + var c = table.config; + c.page = (c.totalPages-1); + moveToPage(table); + } + + function moveToNextPage(table) { + var c = table.config; + c.page++; + if(c.page >= (c.totalPages-1)) { + c.page = (c.totalPages-1); + } + moveToPage(table); + } + + function moveToPrevPage(table) { + var c = table.config; + c.page--; + if(c.page <= 0) { + c.page = 0; + } + moveToPage(table); + } + + + function moveToPage(table) { + var c = table.config; + if(c.page < 0 || c.page > (c.totalPages-1)) { + c.page = 0; + } + + renderTable(table,c.rowsCopy); + } + + function renderTable(table,rows) { + + var c = table.config; + var l = rows.length; + var s = (c.page * c.size); + var e = (s + c.size); + if(e > rows.length ) { + e = rows.length; + } + + + var tableBody = $(table.tBodies[0]); + + // clear the table body + + $.tablesorter.clearTableBody(table); + + for(var i = s; i < e; i++) { + + //tableBody.append(rows[i]); + + var o = rows[i]; + var l = o.length; + for(var j=0; j < l; j++) { + + tableBody[0].appendChild(o[j]); + + } + } + + fixPosition(table,tableBody); + + $(table).trigger("applyWidgets"); + + if( c.page >= c.totalPages ) { + moveToLastPage(table); + } + + updatePageDisplay(c); + } + + this.appender = function(table,rows) { + + var c = table.config; + + c.rowsCopy = rows; + c.totalRows = rows.length; + c.totalPages = Math.ceil(c.totalRows / c.size); + + renderTable(table,rows); + }; + + this.defaults = { + size: 10, + offset: 0, + page: 0, + totalRows: 0, + totalPages: 0, + container: null, + cssNext: '.next', + cssPrev: '.prev', + cssFirst: '.first', + cssLast: '.last', + cssPageDisplay: '.pagedisplay', + cssPageSize: '.pagesize', + seperator: "/", + positionFixed: true, + appender: this.appender + }; + + this.construct = function(settings) { + + return this.each(function() { + + config = $.extend(this.config, $.tablesorterPager.defaults, settings); + + var table = this, pager = config.container; + + $(this).trigger("appendCache"); + + config.size = parseInt($(".pagesize",pager).val()); + + $(config.cssFirst,pager).click(function() { + moveToFirstPage(table); + return false; + }); + $(config.cssNext,pager).click(function() { + moveToNextPage(table); + return false; + }); + $(config.cssPrev,pager).click(function() { + moveToPrevPage(table); + return false; + }); + $(config.cssLast,pager).click(function() { + moveToLastPage(table); + return false; + }); + $(config.cssPageSize,pager).change(function() { + setPageSize(table,parseInt($(this).val())); + return false; + }); + }); + }; + + } + }); + // extend plugin scope + $.fn.extend({ + tablesorterPager: $.tablesorterPager.construct + }); + +})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/build.xml b/fannie/src/jquery/build.xml new file mode 100644 index 000000000..06545bbfd --- /dev/null +++ b/fannie/src/jquery/build.xml @@ -0,0 +1,26 @@ +<project name="tablesorter" default="default" basedir="."> + + <!-- SETUP --> + <property description="Files for parsing etc." name="BUILD_DIR" value="build" /> + <property description="Rhino JS Engine" name="JAR" value="${BUILD_DIR}/js.jar" /> + + <!-- Files names for distribution --> + <property name="TS" value="jquery.tablesorter.js" /> + <property name="TS_MIN" value="jquery.tablesorter.min.js" /> + + <!-- MAIN --> + <target name="min"> + <echo message="Building ${TS_MIN}" /> + <java jar="${JAR}" fork="true"> + <arg value="${BUILD_DIR}/min.js" /> + <arg value="${TS}" /> + <arg value="${TS_MIN}" /> + </java> + <echo message="${TS_MIN} built." /> + </target> + + <target name="default"> + <antcall target="min"/> + </target> + +</project> diff --git a/fannie/src/jquery/build/ParseMaster.js b/fannie/src/jquery/build/ParseMaster.js new file mode 100644 index 000000000..915a8b5db --- /dev/null +++ b/fannie/src/jquery/build/ParseMaster.js @@ -0,0 +1,106 @@ +/* + ParseMaster, version 1.0.2 (2005-08-19) + Copyright 2005, Dean Edwards + License: http://creativecommons.org/licenses/LGPL/2.1/ +*/ + +/* a multi-pattern parser */ + +// KNOWN BUG: erroneous behavior when using escapeChar with a replacement value that is a function + +function ParseMaster() { + // constants + var $EXPRESSION = 0, $REPLACEMENT = 1, $LENGTH = 2; + // used to determine nesting levels + var $GROUPS = /\(/g, $SUB_REPLACE = /\$\d/, $INDEXED = /^\$\d+$/, + $TRIM = /(['"])\1\+(.*)\+\1\1$/, $$ESCAPE = /\\./g, $QUOTE = /'/, + $$DELETED = /\x01[^\x01]*\x01/g; + var self = this; + // public + this.add = function($expression, $replacement) { + if (!$replacement) $replacement = ""; + // count the number of sub-expressions + // - add one because each pattern is itself a sub-expression + var $length = (_internalEscape(String($expression)).match($GROUPS) || "").length + 1; + // does the pattern deal with sub-expressions? + if ($SUB_REPLACE.test($replacement)) { + // a simple lookup? (e.g. "$2") + if ($INDEXED.test($replacement)) { + // store the index (used for fast retrieval of matched strings) + $replacement = parseInt($replacement.slice(1)) - 1; + } else { // a complicated lookup (e.g. "Hello $2 $1") + // build a function to do the lookup + var i = $length; + var $quote = $QUOTE.test(_internalEscape($replacement)) ? '"' : "'"; + while (i) $replacement = $replacement.split("$" + i--).join($quote + "+a[o+" + i + "]+" + $quote); + $replacement = new Function("a,o", "return" + $quote + $replacement.replace($TRIM, "$1") + $quote); + } + } + // pass the modified arguments + _add($expression || "/^$/", $replacement, $length); + }; + // execute the global replacement + this.exec = function($string) { + _escaped.length = 0; + return _unescape(_escape($string, this.escapeChar).replace( + new RegExp(_patterns, this.ignoreCase ? "gi" : "g"), _replacement), this.escapeChar).replace($$DELETED, ""); + }; + // clear the patterns collection so that this object may be re-used + this.reset = function() { + _patterns.length = 0; + }; + + // private + var _escaped = []; // escaped characters + var _patterns = []; // patterns stored by index + var _toString = function(){return "(" + String(this[$EXPRESSION]).slice(1, -1) + ")"}; + _patterns.toString = function(){return this.join("|")}; + // create and add a new pattern to the patterns collection + function _add() { + arguments.toString = _toString; + // store the pattern - as an arguments object (i think this is quicker..?) + _patterns[_patterns.length] = arguments; + } + // this is the global replace function (it's quite complicated) + function _replacement() { + if (!arguments[0]) return ""; + var i = 1, j = 0, $pattern; + // loop through the patterns + while ($pattern = _patterns[j++]) { + // do we have a result? + if (arguments[i]) { + var $replacement = $pattern[$REPLACEMENT]; + switch (typeof $replacement) { + case "function": return $replacement(arguments, i); + case "number": return arguments[$replacement + i]; + } + var $delete = (arguments[i].indexOf(self.escapeChar) == -1) ? "" : + "\x01" + arguments[i] + "\x01"; + return $delete + $replacement; + // skip over references to sub-expressions + } else i += $pattern[$LENGTH]; + } + }; + // encode escaped characters + function _escape($string, $escapeChar) { + return $escapeChar ? $string.replace(new RegExp("\\" + $escapeChar + "(.)", "g"), function($match, $char) { + _escaped[_escaped.length] = $char; + return $escapeChar; + }) : $string; + }; + // decode escaped characters + function _unescape($string, $escapeChar) { + var i = 0; + return $escapeChar ? $string.replace(new RegExp("\\" + $escapeChar, "g"), function() { + return $escapeChar + (_escaped[i++] || ""); + }) : $string; + }; + function _internalEscape($string) { + return $string.replace($$ESCAPE, ""); + }; +}; +ParseMaster.prototype = { + constructor: ParseMaster, + ignoreCase: false, + escapeChar: "" +}; diff --git a/fannie/src/jquery/build/js.jar b/fannie/src/jquery/build/js.jar new file mode 100644 index 000000000..194e5923e Binary files /dev/null and b/fannie/src/jquery/build/js.jar differ diff --git a/fannie/src/jquery/build/jsmin.js b/fannie/src/jquery/build/jsmin.js new file mode 100644 index 000000000..1ef29cf1f --- /dev/null +++ b/fannie/src/jquery/build/jsmin.js @@ -0,0 +1,316 @@ +/* jsmin.js - 2006-08-31 +Author: Franck Marcia +This work is an adaptation of jsminc.c published by Douglas Crockford. +Permission is hereby granted to use the Javascript version under the same +conditions as the jsmin.c on which it is based. + +jsmin.c +2006-05-04 + +Copyright (c) 2002 Douglas Crockford (www.crockford.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Update: + add level: + 1: minimal, keep linefeeds if single + 2: normal, the standard algorithm + 3: agressive, remove any linefeed and doesn't take care of potential + missing semicolons (can be regressive) + store stats + jsmin.oldSize + jsmin.newSize +*/ + +String.prototype.has = function(c) { + return this.indexOf(c) > -1; +}; + +function jsmin(comment, input, level) { + + if (input === undefined) { + input = comment; + comment = ''; + level = 2; + } else if (level === undefined || level < 1 || level > 3) { + level = 2; + } + + if (comment.length > 0) { + comment += '\n'; + } + + var a = '', + b = '', + EOF = -1, + LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', + DIGITS = '0123456789', + ALNUM = LETTERS + DIGITS + '_$\\', + theLookahead = EOF; + + + /* isAlphanum -- return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. + */ + + function isAlphanum(c) { + return c != EOF && (ALNUM.has(c) || c.charCodeAt(0) > 126); + } + + + /* get -- return the next character. Watch out for lookahead. If the + character is a control character, translate it to a space or + linefeed. + */ + + function get() { + + var c = theLookahead; + if (get.i == get.l) { + return EOF; + } + theLookahead = EOF; + if (c == EOF) { + c = input.charAt(get.i); + ++get.i; + } + if (c >= ' ' || c == '\n') { + return c; + } + if (c == '\r') { + return '\n'; + } + return ' '; + } + + get.i = 0; + get.l = input.length; + + + /* peek -- get the next character without getting it. + */ + + function peek() { + theLookahead = get(); + return theLookahead; + } + + + /* next -- get the next character, excluding comments. peek() is used to see + if a '/' is followed by a '/' or '*'. + */ + + function next() { + + var c = get(); + if (c == '/') { + switch (peek()) { + case '/': + for (;;) { + c = get(); + if (c <= '\n') { + return c; + } + } + break; + case '*': + get(); + for (;;) { + switch (get()) { + case '*': + if (peek() == '/') { + get(); + return ' '; + } + break; + case EOF: + throw 'Error: Unterminated comment.'; + } + } + break; + default: + return c; + } + } + return c; + } + + + /* action -- do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. + */ + + function action(d) { + + var r = []; + + if (d == 1) { + r.push(a); + } + + if (d < 3) { + a = b; + if (a == '\'' || a == '"') { + for (;;) { + r.push(a); + a = get(); + if (a == b) { + break; + } + if (a <= '\n') { + throw 'Error: unterminated string literal: ' + a; + } + if (a == '\\') { + r.push(a); + a = get(); + } + } + } + } + + b = next(); + + if (b == '/' && '(,=:[!&|'.has(a)) { + r.push(a); + r.push(b); + for (;;) { + a = get(); + if (a == '/') { + break; + } else if (a =='\\') { + r.push(a); + a = get(); + } else if (a <= '\n') { + throw 'Error: unterminated Regular Expression literal'; + } + r.push(a); + } + b = next(); + } + + return r.join(''); + } + + + /* m -- Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with + linefeeds. + Most spaces and linefeeds will be removed. + */ + + function m() { + + var r = []; + a = '\n'; + + r.push(action(3)); + + while (a != EOF) { + switch (a) { + case ' ': + if (isAlphanum(b)) { + r.push(action(1)); + } else { + r.push(action(2)); + } + break; + case '\n': + switch (b) { + case '{': + case '[': + case '(': + case '+': + case '-': + r.push(action(1)); + break; + case ' ': + r.push(action(3)); + break; + default: + if (isAlphanum(b)) { + r.push(action(1)); + } else { + if (level == 1 && b != '\n') { + r.push(action(1)); + } else { + r.push(action(2)); + } + } + } + break; + default: + switch (b) { + case ' ': + if (isAlphanum(a)) { + r.push(action(1)); + break; + } + r.push(action(3)); + break; + case '\n': + if (level == 1 && a != '\n') { + r.push(action(1)); + } else { + switch (a) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case '\'': + if (level == 3) { + r.push(action(3)); + } else { + r.push(action(1)); + } + break; + default: + if (isAlphanum(a)) { + r.push(action(1)); + } else { + r.push(action(3)); + } + } + } + break; + default: + r.push(action(1)); + break; + } + } + } + + return r.join(''); + } + + jsmin.oldSize = input.length; + ret = m(input); + jsmin.newSize = ret.length; + + return comment + ret; + +} diff --git a/fannie/src/jquery/build/min.js b/fannie/src/jquery/build/min.js new file mode 100644 index 000000000..da11096fa --- /dev/null +++ b/fannie/src/jquery/build/min.js @@ -0,0 +1,5 @@ +load("build/jsmin.js", "build/writeFile.js"); + +var f = jsmin('', readFile(arguments[0]), 3); + +writeFile( arguments[1], f ); diff --git a/fannie/src/jquery/build/pack.js b/fannie/src/jquery/build/pack.js new file mode 100644 index 000000000..13557039a --- /dev/null +++ b/fannie/src/jquery/build/pack.js @@ -0,0 +1,5 @@ +load("build/ParseMaster.js", "build/packer.js", "build/writeFile.js"); + +var out = readFile( arguments[0] ); + +writeFile( arguments[1], pack( out, 62, true, false ) ); diff --git a/fannie/src/jquery/build/packer.js b/fannie/src/jquery/build/packer.js new file mode 100644 index 000000000..56bfdd1a2 --- /dev/null +++ b/fannie/src/jquery/build/packer.js @@ -0,0 +1,316 @@ +/* + packer, version 2.0.2 (2005-08-19) + Copyright 2004-2005, Dean Edwards + License: http://creativecommons.org/licenses/LGPL/2.1/ +*/ + +function pack(_script, _encoding, _fastDecode, _specialChars) { + // constants + var $IGNORE = "$1"; + + // validate parameters + _script += "\n"; + _encoding = Math.min(parseInt(_encoding), 95); + + // apply all parsing routines + function _pack($script) { + var i, $parse; + for (i = 0; ($parse = _parsers[i]); i++) { + $script = $parse($script); + } + return $script; + }; + + // unpacking function - this is the boot strap function + // data extracted from this packing routine is passed to + // this function when decoded in the target + var _unpack = function($packed, $ascii, $count, $keywords, $encode, $decode) { + while ($count--) + if ($keywords[$count]) + $packed = $packed.replace(new RegExp('\\b' + $encode($count) + '\\b', 'g'), $keywords[$count]); + return $packed; + }; + + // code-snippet inserted into the unpacker to speed up decoding + var _decode = function() { + // does the browser support String.replace where the + // replacement value is a function? + if (!''.replace(/^/, String)) { + // decode all the values we need + while ($count--) $decode[$encode($count)] = $keywords[$count] || $encode($count); + // global replacement function + $keywords = [function($encoded){return $decode[$encoded]}]; + // generic match + $encode = function(){return'\\w+'}; + // reset the loop counter - we are now doing a global replace + $count = 1; + } + }; + + // keep a list of parsing functions, they'll be executed all at once + var _parsers = []; + function _addParser($parser) { + _parsers[_parsers.length] = $parser; + }; + + // zero encoding - just removal of white space and comments + function _basicCompression($script) { + var $parser = new ParseMaster; + // make safe + $parser.escapeChar = "\\"; + // protect strings + $parser.add(/'[^'\n\r]*'/, $IGNORE); + $parser.add(/"[^"\n\r]*"/, $IGNORE); + // remove comments + $parser.add(/\/\/[^\n\r]*[\n\r]/, " "); + $parser.add(/\/\*[^*]*\*+([^\/][^*]*\*+)*\//, " "); + // protect regular expressions + $parser.add(/\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)/, "$2"); // IGNORE + $parser.add(/[^\w\x24\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?/, $IGNORE); + // remove: ;;; doSomething(); + if (_specialChars) $parser.add(/;;;[^\n\r]+[\n\r]/); + // remove redundant semi-colons + $parser.add(/\(;;\)/, $IGNORE); // protect for (;;) loops + $parser.add(/;+\s*([};])/, "$2"); + // apply the above + $script = $parser.exec($script); + + // remove white-space + $parser.add(/(\b|\x24)\s+(\b|\x24)/, "$2 $3"); + $parser.add(/([+\-])\s+([+\-])/, "$2 $3"); + $parser.add(/\s+/, ""); + // done + return $parser.exec($script); + }; + + function _encodeSpecialChars($script) { + var $parser = new ParseMaster; + // replace: $name -> n, $$name -> na + $parser.add(/((\x24+)([a-zA-Z$_]+))(\d*)/, function($match, $offset) { + var $length = $match[$offset + 2].length; + var $start = $length - Math.max($length - $match[$offset + 3].length, 0); + return $match[$offset + 1].substr($start, $length) + $match[$offset + 4]; + }); + // replace: _name -> _0, double-underscore (__name) is ignored + var $regexp = /\b_[A-Za-z\d]\w*/; + // build the word list + var $keywords = _analyze($script, _globalize($regexp), _encodePrivate); + // quick ref + var $encoded = $keywords.$encoded; + $parser.add($regexp, function($match, $offset) { + return $encoded[$match[$offset]]; + }); + return $parser.exec($script); + }; + + function _encodeKeywords($script) { + // escape high-ascii values already in the script (i.e. in strings) + if (_encoding > 62) $script = _escape95($script); + // create the parser + var $parser = new ParseMaster; + var $encode = _getEncoder(_encoding); + // for high-ascii, don't encode single character low-ascii + var $regexp = (_encoding > 62) ? /\w\w+/ : /\w+/; + // build the word list + $keywords = _analyze($script, _globalize($regexp), $encode); + var $encoded = $keywords.$encoded; + // encode + $parser.add($regexp, function($match, $offset) { + return $encoded[$match[$offset]]; + }); + // if encoded, wrap the script in a decoding function + return $script && _bootStrap($parser.exec($script), $keywords); + }; + + function _analyze($script, $regexp, $encode) { + // analyse + // retreive all words in the script + var $all = $script.match($regexp); + var $$sorted = []; // list of words sorted by frequency + var $$encoded = {}; // dictionary of word->encoding + var $$protected = {}; // instances of "protected" words + if ($all) { + var $unsorted = []; // same list, not sorted + var $protected = {}; // "protected" words (dictionary of word->"word") + var $values = {}; // dictionary of charCode->encoding (eg. 256->ff) + var $count = {}; // word->count + var i = $all.length, j = 0, $word; + // count the occurrences - used for sorting later + do { + $word = "$" + $all[--i]; + if (!$count[$word]) { + $count[$word] = 0; + $unsorted[j] = $word; + // make a dictionary of all of the protected words in this script + // these are words that might be mistaken for encoding + $protected["$" + ($values[j] = $encode(j))] = j++; + } + // increment the word counter + $count[$word]++; + } while (i); + // prepare to sort the word list, first we must protect + // words that are also used as codes. we assign them a code + // equivalent to the word itself. + // e.g. if "do" falls within our encoding range + // then we store keywords["do"] = "do"; + // this avoids problems when decoding + i = $unsorted.length; + do { + $word = $unsorted[--i]; + if ($protected[$word] != null) { + $$sorted[$protected[$word]] = $word.slice(1); + $$protected[$protected[$word]] = true; + $count[$word] = 0; + } + } while (i); + // sort the words by frequency + $unsorted.sort(function($match1, $match2) { + return $count[$match2] - $count[$match1]; + }); + j = 0; + // because there are "protected" words in the list + // we must add the sorted words around them + do { + if ($$sorted[i] == null) $$sorted[i] = $unsorted[j++].slice(1); + $$encoded[$$sorted[i]] = $values[i]; + } while (++i < $unsorted.length); + } + return {$sorted: $$sorted, $encoded: $$encoded, $protected: $$protected}; + }; + + // build the boot function used for loading and decoding + function _bootStrap($packed, $keywords) { + var $ENCODE = _safeRegExp("$encode\\($count\\)", "g"); + + // $packed: the packed script + $packed = "'" + _escape($packed) + "'"; + + // $ascii: base for encoding + var $ascii = Math.min($keywords.$sorted.length, _encoding) || 1; + + // $count: number of words contained in the script + var $count = $keywords.$sorted.length; + + // $keywords: list of words contained in the script + for (var i in $keywords.$protected) $keywords.$sorted[i] = ""; + // convert from a string to an array + $keywords = "'" + $keywords.$sorted.join("|") + "'.split('|')"; + + // $encode: encoding function (used for decoding the script) + var $encode = _encoding > 62 ? _encode95 : _getEncoder($ascii); + $encode = String($encode).replace(/_encoding/g, "$ascii").replace(/arguments\.callee/g, "$encode"); + var $inline = "$count" + ($ascii > 10 ? ".toString($ascii)" : ""); + + // $decode: code snippet to speed up decoding + if (_fastDecode) { + // create the decoder + var $decode = _getFunctionBody(_decode); + if (_encoding > 62) $decode = $decode.replace(/\\\\w/g, "[\\xa1-\\xff]"); + // perform the encoding inline for lower ascii values + else if ($ascii < 36) $decode = $decode.replace($ENCODE, $inline); + // special case: when $count==0 there are no keywords. I want to keep + // the basic shape of the unpacking funcion so i'll frig the code... + if (!$count) $decode = $decode.replace(_safeRegExp("($count)\\s*=\\s*1"), "$1=0"); + } + + // boot function + var $unpack = String(_unpack); + if (_fastDecode) { + // insert the decoder + $unpack = $unpack.replace(/\{/, "{" + $decode + ";"); + } + $unpack = $unpack.replace(/"/g, "'"); + if (_encoding > 62) { // high-ascii + // get rid of the word-boundaries for regexp matches + $unpack = $unpack.replace(/'\\\\b'\s*\+|\+\s*'\\\\b'/g, ""); + } + if ($ascii > 36 || _encoding > 62 || _fastDecode) { + // insert the encode function + $unpack = $unpack.replace(/\{/, "{$encode=" + $encode + ";"); + } else { + // perform the encoding inline + $unpack = $unpack.replace($ENCODE, $inline); + } + // pack the boot function too + $unpack = pack($unpack, 0, false, true); + + // arguments + var $params = [$packed, $ascii, $count, $keywords]; + if (_fastDecode) { + // insert placeholders for the decoder + $params = $params.concat(0, "{}"); + } + + // the whole thing + return "eval(" + $unpack + "(" + $params + "))\n"; + }; + + // mmm.. ..which one do i need ?? + function _getEncoder($ascii) { + return $ascii > 10 ? $ascii > 36 ? $ascii > 62 ? _encode95 : _encode62 : _encode36 : _encode10; + }; + + // zero encoding + // characters: 0123456789 + var _encode10 = function($charCode) { + return $charCode; + }; + + // inherent base36 support + // characters: 0123456789abcdefghijklmnopqrstuvwxyz + var _encode36 = function($charCode) { + return $charCode.toString(36); + }; + + // hitch a ride on base36 and add the upper case alpha characters + // characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + var _encode62 = function($charCode) { + return ($charCode < _encoding ? '' : arguments.callee(parseInt($charCode / _encoding))) + + (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36)); + }; + + // use high-ascii values + var _encode95 = function($charCode) { + return ($charCode < _encoding ? '' : arguments.callee($charCode / _encoding)) + + String.fromCharCode($charCode % _encoding + 161); + }; + + // special _chars + var _encodePrivate = function($charCode) { + return "_" + $charCode; + }; + + // protect characters used by the parser + function _escape($script) { + return $script.replace(/([\\'])/g, "\\$1"); + }; + + // protect high-ascii characters already in the script + function _escape95($script) { + return $script.replace(/[\xa1-\xff]/g, function($match) { + return "\\x" + $match.charCodeAt(0).toString(16); + }); + }; + + function _safeRegExp($string, $flags) { + return new RegExp($string.replace(/\$/g, "\\$"), $flags); + }; + + // extract the body of a function + function _getFunctionBody($function) { + with (String($function)) return slice(indexOf("{") + 1, lastIndexOf("}")); + }; + + // set the global flag on a RegExp (you have to create a new one) + function _globalize($regexp) { + return new RegExp(String($regexp).slice(1, -1), "g"); + }; + + // build the parsing routine + _addParser(_basicCompression); + if (_specialChars) _addParser(_encodeSpecialChars); + if (_encoding) _addParser(_encodeKeywords); + + // go! + return _pack(_script); +}; diff --git a/fannie/src/jquery/build/writeFile.js b/fannie/src/jquery/build/writeFile.js new file mode 100644 index 000000000..43b1eb246 --- /dev/null +++ b/fannie/src/jquery/build/writeFile.js @@ -0,0 +1,19 @@ +importPackage(java.io); + +function writeFile( file, stream ) { + var buffer = new PrintWriter( new FileWriter( file ) ); + buffer.print( stream ); + buffer.close(); +} + +function read( file ) { + var jq = new File(file); + var reader = new BufferedReader(new FileReader(jq)); + var line = null; + var buffer = new java.lang.StringBuffer(jq.length()); + while( (line = reader.readLine()) != null) { + buffer.append(line); + buffer.append("\n"); + } + return buffer.toString(); +} \ No newline at end of file diff --git a/fannie/src/jquery/changelog b/fannie/src/jquery/changelog new file mode 100644 index 000000000..f6a525fd1 --- /dev/null +++ b/fannie/src/jquery/changelog @@ -0,0 +1,41 @@ +tablesorter changelog +====================== +http://tablesorter.com + +Changes in version 2.0.3 (2008-03-17) +------------------------------------- + +Bug fixes +* Missing semicolon, broke the minified version + + +Changes in version 2.0.2 (2008-03-14) +------------------------------------- + +General +* Added support for the new metadata plugin +* Added support for jQuery 1.2.3 +* Added support for decimal numbers and negative and positive digits +* Updated documenation and website with new examples +* Removed packed version. + +Bug fixes +* Sort force (Thanks to David Lynch) + + +Changes in version 2.0.1 (2007-09-17) +------------------------------------- + +General +* Removed the need for Dimensions plugin when using the pagnation plugin thanks to offset being included in the jQuery 1.2 core. +* Added support for jQuery 1.2 +* Added new Minified version of tablesorter +* Updated documenation and website with new examples + +Bug fixes +* If row values are identical the original order is kept (Thanks to David hull) +* If thead includes a table $('tbody:first', table) breaks (Thanks to David Hull) + +Speed improvements: +* appendToTable, setting innerHTML to "" before appending new content to table body. +* zebra widget. (Thanks to James Dempster) \ No newline at end of file diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/fannie/src/jquery/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 000000000..5b5dab2ab Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/fannie/src/jquery/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 000000000..ac8b229af Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 000000000..ad3d6346e Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 000000000..42ccba269 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 000000000..5a46b47cb Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 000000000..86c2baa65 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 000000000..4443fdc1a Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/fannie/src/jquery/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 000000000..7c9fa6c6e Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-icons_222222_256x240.png b/fannie/src/jquery/css/smoothness/images/ui-icons_222222_256x240.png new file mode 100644 index 000000000..b273ff111 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-icons_222222_256x240.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-icons_2e83ff_256x240.png b/fannie/src/jquery/css/smoothness/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 000000000..09d1cdc85 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-icons_2e83ff_256x240.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-icons_454545_256x240.png b/fannie/src/jquery/css/smoothness/images/ui-icons_454545_256x240.png new file mode 100644 index 000000000..59bd45b90 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-icons_454545_256x240.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-icons_888888_256x240.png b/fannie/src/jquery/css/smoothness/images/ui-icons_888888_256x240.png new file mode 100644 index 000000000..6d02426c1 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-icons_888888_256x240.png differ diff --git a/fannie/src/jquery/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/fannie/src/jquery/css/smoothness/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 000000000..2ab019b73 Binary files /dev/null and b/fannie/src/jquery/css/smoothness/images/ui-icons_cd0a0a_256x240.png differ diff --git a/fannie/src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css b/fannie/src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css new file mode 100644 index 000000000..33d736344 --- /dev/null +++ b/fannie/src/jquery/css/smoothness/jquery-ui-1.8.1.custom.css @@ -0,0 +1,486 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +/* IE7-/Win - Fix extra vertical space in lists */ +.ui-accordion a { zoom: 1; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete +----------------------------------*/ +.ui-autocomplete { position: absolute; cursor: default; } +.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* Menu +----------------------------------*/ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* Button +----------------------------------*/ + +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ + + + + + +/* Dialog +----------------------------------*/ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs +----------------------------------*/ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/AUTHORS.txt b/fannie/src/jquery/development-bundle/AUTHORS.txt new file mode 100644 index 000000000..b2168655e --- /dev/null +++ b/fannie/src/jquery/development-bundle/AUTHORS.txt @@ -0,0 +1,30 @@ +jQuery UI Authors (http://jqueryui.com/about) + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +and logs, available at http://github.com/jquery/jquery-ui + +Brandon Aaron +Paul Bakaus (paulbakaus.com) +David Bolter +Rich Caloggero +Chi Cheng (cloudream@gmail.com) +Colin Clark (http://colin.atrc.utoronto.ca/) +Michelle D'Souza +Aaron Eisenberger (aaronchi@gmail.com) +Ariel Flesler +Bohdan Ganicky +Scott González +Marc Grabanski (m@marcgrabanski.com) +Klaus Hartl (stilbuero.de) +Scott Jehl +Cody Lindley +Eduardo Lundgren (eduardolundgren@gmail.com) +Todd Parker +John Resig +Patty Toland +Ca-Phun Ung (yelotofu.com) +Keith Wood (kbwood@virginbroadband.com.au) +Maggie Costello Wachs +Richard D. Worth (rdworth.org) +Jörn Zaefferer (bassistance.de) diff --git a/fannie/src/jquery/development-bundle/GPL-LICENSE.txt b/fannie/src/jquery/development-bundle/GPL-LICENSE.txt new file mode 100644 index 000000000..11dddd00e --- /dev/null +++ b/fannie/src/jquery/development-bundle/GPL-LICENSE.txt @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, 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. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/fannie/src/jquery/development-bundle/MIT-LICENSE.txt b/fannie/src/jquery/development-bundle/MIT-LICENSE.txt new file mode 100644 index 000000000..2585de262 --- /dev/null +++ b/fannie/src/jquery/development-bundle/MIT-LICENSE.txt @@ -0,0 +1,25 @@ +Copyright (c) 2010 Paul Bakaus, http://jqueryui.com/ + +This software consists of voluntary contributions made by many +individuals (AUTHORS.txt, http://jqueryui.com/about) For exact +contribution history, see the revision history and logs, available +at http://jquery-ui.googlecode.com/svn/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/fannie/src/jquery/development-bundle/demos/accordion/collapsible.html b/fannie/src/jquery/development-bundle/demos/accordion/collapsible.html new file mode 100644 index 000000000..6618baff2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/collapsible.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - Collapse content</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#accordion").accordion({ + collapsible: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="accordion"> + <h3><a href="#">Section 1</a></h3> + <div> + <p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p> + </div> + <h3><a href="#">Section 2</a></h3> + <div> + <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p> + </div> + <h3><a href="#">Section 3</a></h3> + <div> + <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + </ul> + </div> + <h3><a href="#">Section 4</a></h3> + <div> + <p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p> + </div> +</div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>By default, accordions always keep one section open. To allow for all sections to be be collapsible, set the <code>collapsible</code> option to true. Click on the currently open section to collapse its content pane.</p> + + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/custom-icons.html b/fannie/src/jquery/development-bundle/demos/accordion/custom-icons.html new file mode 100644 index 000000000..c81fb3120 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/custom-icons.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - Customize icons</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + var icons = { + header: "ui-icon-circle-arrow-e", + headerSelected: "ui-icon-circle-arrow-s" + }; + $("#accordion").accordion({ + icons: icons + }); + $("#toggle").button().toggle(function() { + $("#accordion").accordion("option", "icons", false); + }, function() { + $("#accordion").accordion("option", "icons", icons); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="accordion"> + <h3><a href="#">Section 1</a></h3> + <div> + <p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p> + </div> + <h3><a href="#">Section 2</a></h3> + <div> + <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p> + </div> + <h3><a href="#">Section 3</a></h3> + <div> + <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + </ul> + </div> + <h3><a href="#">Section 4</a></h3> + <div> + <p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p> + </div> +</div> + +<button id="toggle">Toggle icons</button> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Customize the header icons with the <code>icons</code> option, which accepts classes for the header's default and selected (open) state. Use any class from the UI CSS framework, or create custom classes with background images.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/default.html b/fannie/src/jquery/development-bundle/demos/accordion/default.html new file mode 100644 index 000000000..2eb93dd7a --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/default.html @@ -0,0 +1,85 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#accordion").accordion(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="accordion"> + <h3><a href="#">Section 1</a></h3> + <div> + <p> + Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer + ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit + amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut + odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. + </p> + </div> + <h3><a href="#">Section 2</a></h3> + <div> + <p> + Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet + purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor + velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In + suscipit faucibus urna. + </p> + </div> + <h3><a href="#">Section 3</a></h3> + <div> + <p> + Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. + Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero + ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis + lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. + </p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + </ul> + </div> + <h3><a href="#">Section 4</a></h3> + <div> + <p> + Cras dictum. Pellentesque habitant morbi tristique senectus et netus + et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in + faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia + mauris vel est. + </p> + <p> + Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per + inceptos himenaeos. + </p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +Click headers to expand/collapse content that is broken into logical sections, much like tabs. +Optionally, toggle sections open/closed on mouseover. +</p> +<p> +The underlying HTML markup is a series of headers (H3 tags) and content divs so the content is +usable without JavaScript. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/fillspace.html b/fannie/src/jquery/development-bundle/demos/accordion/fillspace.html new file mode 100644 index 000000000..77507821c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/fillspace.html @@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - Fill space</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#accordion").accordion({ + fillSpace: true + }); + }); + $(function() { + $("#accordionResizer").resizable({ + resize: function() { + $("#accordion").accordion("resize"); + }, + minHeight: 140 + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<h3 class="docs">Resize the outer container:</h3> + +<div id="accordionResizer" style="padding:10px; width:350px; height:220px;" class="ui-widget-content"> + +<div id="accordion"> + <h3><a href="#">Section 1</a></h3> + <div> + <p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p> + </div> + <h3><a href="#">Section 2</a></h3> + <div> + <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p> + </div> + <h3><a href="#">Section 3</a></h3> + <div> + <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + </ul> + </div> + <h3><a href="#">Section 4</a></h3> + <div> + <p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p> + </div> +</div> + +<span class="ui-icon ui-icon-grip-dotted-horizontal" style="margin:2px auto;"></span> +</div><!-- End accordionResizer --> + +<div style="margin-top:7px; padding:10px; width:350px; height:50px;" class="ui-widget-content">I'm another panel</div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Because the accordion is comprised of block-level elements, by default its width fills the available horizontal space. To fill the vertical space allocated by its container, set the boolean <code>fillSpace</code> option to true, and the script will automatically set the dimensions of the accordion to the height of its parent container. The accordion will also resize with its container if the container is <code>resizable</code>.</p> + +</div><!-- End demo-description --> + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/index.html b/fannie/src/jquery/development-bundle/demos/accordion/index.html new file mode 100644 index 000000000..de3751128 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/index.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + <div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="fillspace.html">Fill space</a></li> + <li><a href="no-auto-height.html">No auto height</a></li> + <li><a href="collapsible.html">Collapse content</a></li> + <li><a href="mouseover.html">Open on mouseover</a></li> + <li><a href="custom-icons.html">Customize icons</a></li> + <li><a href="sortable.html">Sortable</a></li> + </ul> + </div> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/mouseover.html b/fannie/src/jquery/development-bundle/demos/accordion/mouseover.html new file mode 100644 index 000000000..374fc7536 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/mouseover.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - Open on mouseover</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#accordion").accordion({ + event: "mouseover" + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="accordion"> + <h3><a href="#">Section 1</a></h3> + <div> + <p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p> + </div> + <h3><a href="#">Section 2</a></h3> + <div> + <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p> + </div> + <h3><a href="#">Section 3</a></h3> + <div> + <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + </ul> + </div> + <h3><a href="#">Section 4</a></h3> + <div> + <p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p> + </div> +</div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Toggle sections open/closed on mouseover with the <code>event</code> option. The default value for event is "click."</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/no-auto-height.html b/fannie/src/jquery/development-bundle/demos/accordion/no-auto-height.html new file mode 100644 index 000000000..5cd89c61c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/no-auto-height.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - No Auto Height</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#accordion").accordion({ + autoHeight: false, + navigation: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="accordion"> + <h3><a href="#section1">Section 1</a></h3> + <div> + <p>Mauris mauris ante, blandit et, ultrices a, susceros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p> + </div> + <h3><a href="#section2">Section 2</a></h3> + <div> + <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p> + </div> + <h3><a href="#section3">Section 3</a></h3> + <div> + <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p> + <ul> + <li>List item</li> + <li>List item</li> + <li>List item</li> + <li>List item</li> + <li>List item</li> + <li>List item</li> + <li>List item</li> + </ul> + <a href="#othercontent">Link to other content</a> + </div> +</div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Setting <code>autoHeight: false</code> allows to accordion panels to keep their native height.</p> + +<p>In addition, the <code>navigation</code> option is enabled, opening the panel based on the current location, eg. no-auto-height.html#panel2 would open the second panel on page load. It also finds anchors within the content, so #othercontent will open the third section, as it contains a link with that href.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/accordion/sortable.html b/fannie/src/jquery/development-bundle/demos/accordion/sortable.html new file mode 100644 index 000000000..80487290f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/accordion/sortable.html @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Accordion - Sortable</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + var stop = false; + $("#accordion h3").click(function(event) { + if (stop) { + event.stopImmediatePropagation(); + event.preventDefault(); + stop = false; + } + }); + $("#accordion").accordion({ + header: "> div > h3" + }).sortable({ + axis: "y", + handle: "h3", + stop: function(event, ui) { + stop = true; + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="accordion"> + <div> + <h3><a href="#">Section 1</a></h3> + <div> + <p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p> + </div> + </div> + <div> + <h3><a href="#">Section 2</a></h3> + <div> + <p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p> + </div> + </div> + <div> + <h3><a href="#">Section 3</a></h3> + <div> + <p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + </ul> + </div> + </div> + <div> + <h3><a href="#">Section 4</a></h3> + <div> + <p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p> + </div> + </div> +</div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Drag the header to re-order panels.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/addClass/default.html b/fannie/src/jquery/development-bundle/demos/addClass/default.html new file mode 100644 index 000000000..1bb33b362 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/addClass/default.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - addClass Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; position: relative;} + #button { padding: .5em 1em; text-decoration: none; } + #effect { width: 240px; padding: 1em; font-size: 1.2em; border: 1px solid #000; background: #eee; color: #333; } + #effect.newClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; } + </style> + <script type="text/javascript"> + $(function() { + $("#button").click(function() { + $('#effect').addClass('newClass', 1000, callback); + return false; + }); + + function callback(){ + setTimeout(function(){ + $('#effect').removeClass('newClass'); + }, 1500); + } + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class=" ui-corner-all"> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. + </div> +</div> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>This demo adds a class which animates: text-indent, letter-spacing, width, height, padding, margin, and font-size.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/addClass/index.html b/fannie/src/jquery/development-bundle/demos/addClass/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/addClass/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/animate/default.html b/fannie/src/jquery/development-bundle/demos/animate/default.html new file mode 100644 index 000000000..21afff719 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/animate/default.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - Animate Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; position: relative;} + #button { padding: .5em 1em; text-decoration: none; } + #effect { width: 240px; height: 135px; padding: 0.4em; position: relative; background: #fff; } + #effect h3 { margin: 0; padding: 0.4em; text-align: center; } + </style> + <script type="text/javascript"> + $(function() { + $("#button").toggle( + function() { + $("#effect").animate({backgroundColor: '#aa0000', color: '#fff', width: 500}, 1000); + }, + function() { + $("#effect").animate({backgroundColor: '#fff', color: '#000', width: 240}, 1000); + } + ); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="ui-widget-content ui-corner-all"> + <h3 class="ui-widget-header ui-corner-all">Animate</h3> + <p> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. + </p> + </div> +</div> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Toggle Effect</a> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/animate/index.html b/fannie/src/jquery/development-bundle/demos/animate/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/animate/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/categories.html b/fannie/src/jquery/development-bundle/demos/autocomplete/categories.html new file mode 100644 index 000000000..bb59bf31e --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/categories.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Custom Data Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .ui-autocomplete-category { + font-weight:bold; + padding:.2em .4em; + margin:.8em 0 .2em; + line-height:1.5; + } + </style> + <script type="text/javascript"> + $.widget("custom.catcomplete", $.ui.autocomplete, { + _renderMenu: function( ul, items ) { + var self = this, + currentCategory = ""; + $.each( items, function( index, item ) { + if ( item.category != currentCategory ) { + ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" ); + currentCategory = item.category; + } + self._renderItem( ul, item ); + }); + } + }); + </script> + <script type="text/javascript"> + $(function() { + var data = [ + { label: "anders", category: "" }, + { label: "andreas", category: "" }, + { label: "antal", category: "" }, + { label: "annhhx10", category: "Products" }, + { label: "annk K12", category: "Products" }, + { label: "annttop C13", category: "Products" }, + { label: "anders andersson", category: "People" }, + { label: "andreas andersson", category: "People" }, + { label: "andreas johnson", category: "People" } + ]; + + $('#search').catcomplete({ + delay: 0, + source: data + }); + }); + </script> +</head> +<body> + +<div class="demo"> + <label for="search">Search: </label> + <input id="search" /> +</div><!-- End demo --> + +<div class="demo-description"> +<p> + A categorized search result. Try typing "a" or "n". +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/combobox.html b/fannie/src/jquery/development-bundle/demos/autocomplete/combobox.html new file mode 100644 index 000000000..3001f7d17 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/combobox.html @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Combobox Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + /* TODO shouldn't be necessary */ + .ui-button { margin-left: -1px; } + .ui-button-icon-only .ui-button-text { padding: 0.35em; } + .ui-autocomplete-input { margin: 0; padding: 0.48em 0 0.47em 0.45em; } + </style> + <script type="text/javascript"> + (function($) { + $.widget("ui.combobox", { + _create: function() { + var self = this; + var select = this.element.hide(); + var input = $("<input>") + .insertAfter(select) + .autocomplete({ + source: function(request, response) { + var matcher = new RegExp(request.term, "i"); + response(select.children("option").map(function() { + var text = $(this).text(); + if (this.value && (!request.term || matcher.test(text))) + return { + id: this.value, + label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"), + value: text + }; + })); + }, + delay: 0, + change: function(event, ui) { + if (!ui.item) { + // remove invalid value, as it didn't match anything + $(this).val(""); + return false; + } + select.val(ui.item.id); + self._trigger("selected", event, { + item: select.find("[value='" + ui.item.id + "']") + }); + + }, + minLength: 0 + }) + .addClass("ui-widget ui-widget-content ui-corner-left"); + $("<button>&nbsp;</button>") + .attr("tabIndex", -1) + .attr("title", "Show All Items") + .insertAfter(input) + .button({ + icons: { + primary: "ui-icon-triangle-1-s" + }, + text: false + }).removeClass("ui-corner-all") + .addClass("ui-corner-right ui-button-icon") + .click(function() { + // close if already visible + if (input.autocomplete("widget").is(":visible")) { + input.autocomplete("close"); + return; + } + // pass empty string as value to search for, displaying all results + input.autocomplete("search", ""); + input.focus(); + }); + } + }); + + })(jQuery); + + $(function() { + $("#combobox").combobox(); + $("#toggle").click(function() { + $("#combobox").toggle(); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label>Your preferred programming language: </label> + <select id="combobox"> + <option value="">Select one...</option> + <option value="a">asp</option> + <option value="c">c</option> + <option value="cpp">c++</option> + <option value="cf">coldfusion</option> + <option value="g">groovy</option> + <option value="h">haskell</option> + <option value="j">java</option> + <option value="js">javascript</option> + <option value="p1">perl</option> + <option value="p2">php</option> + <option value="p3">python</option> + <option value="r">ruby</option> + <option value="s">scala</option> + </select> +</div> +<button id="toggle">Show underlying select</button> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +A custom widget built by composition of Autocomplete and Button. You can either type something into the field to get filtered suggestions based on your input, or use the button to get the full list of selections. +</p> +<p> +The input is read from an existing select-element for progressive enhancement, passed to Autocomplete with a customized source-option. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/custom-data.html b/fannie/src/jquery/development-bundle/demos/autocomplete/custom-data.html new file mode 100644 index 000000000..139b41d99 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/custom-data.html @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Custom Data Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #project-label { + display: block; + font-weight: bold; + margin-bottom: 1em; + } + #project-icon { + float: left; + height: 32px; + width: 32px; + } + #project-description { + margin: 0; + padding: 0; + } + </style> + <script type="text/javascript"> + $(function() { + var projects = [ + { + value: 'jquery', + label: 'jQuery', + desc: 'the write less, do more, JavaScript library', + icon: 'jquery_32x32.png' + }, + { + value: 'jquery-ui', + label: 'jQuery UI', + desc: 'the official user interface library for jQuery', + icon: 'jqueryui_32x32.png' + }, + { + value: 'sizzlejs', + label: 'Sizzle JS', + desc: 'a pure-JavaScript CSS selector engine', + icon: 'sizzlejs_32x32.png' + } + ]; + + $('#project').autocomplete({ + minLength: 0, + source: projects, + focus: function(event, ui) { + $('#project').val(ui.item.label); + return false; + }, + select: function(event, ui) { + $('#project').val(ui.item.label); + $('#project-id').val(ui.item.value); + $('#project-description').html(ui.item.desc); + $('#project-icon').attr('src', '../images/' + ui.item.icon); + + return false; + } + }) + .data( "autocomplete" )._renderItem = function( ul, item ) { + return $( "<li></li>" ) + .data( "item.autocomplete", item ) + .append( "<a>" + item.label + "<br>" + item.desc + "</a>" ) + .appendTo( ul ); + }; + }); + </script> +</head> +<body> + +<div class="demo"> + <div id="project-label">Select a project (type "j" for a start):</div> + <img id="project-icon" src="../images/transparent_1x1.png" class="ui-state-default"/> + <input id="project"/> + <input type="hidden" id="project-id"/> + <p id="project-description"></p> +</div><!-- End demo --> + +<div class="demo-description"> +<p> +You can use your own custom data formats and displays by simply overriding the default focus and select actions. +</p> +<p> +Try typing "j" to get a list of projects or just press the down arrow. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/default.html b/fannie/src/jquery/development-bundle/demos/autocomplete/default.html new file mode 100644 index 000000000..d78b0576c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/default.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Default Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + var availableTags = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"]; + $("#tags").autocomplete({ + source: availableTags + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="tags">Tags: </label> + <input id="tags" /> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are tags for programming languages, give "ja" (for Java or JavaScript) a try. +</p> +<p> +The datasource is a simple JavaScript array, provided to the widget using the source-option. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/folding.html b/fannie/src/jquery/development-bundle/demos/autocomplete/folding.html new file mode 100644 index 000000000..d5bc71e9d --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/folding.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Accent Folding Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + var names = [ "Jörn Zaefferer", "Scott González", "John Resig" ]; + + var accentMap = { + 'á':'a', + 'ö':'o' + }; + var normalize = function( term ) { + var ret = ''; + for ( var i = 0; i < term.length; i++ ) { + ret += accentMap[ term.charAt(i) ] || term.charAt(i); + } + return ret; + }; + + $( "#developer" ).autocomplete({ + source: function( request, response ) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex( request.term ), "i" ); + response( $.grep( names, function( value ) { + value = value.label || value.value || value; + return matcher.test( value ) || matcher.test( normalize( value ) ); + }) ); + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <form> + <label for="developer">Developer: </label> + <input id="developer" /> + </form> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +The autocomplete field uses a custom source option which will match results that have accented characters even when the text field doesn't contain accented characters. However if the you type in accented characters in the text field it is smart enough not to show results that aren't accented. +</p> +<p> +Try typing "Jo" to see "John" and "Jörn", then type "Jö" to see only "Jörn". +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/index.html b/fannie/src/jquery/development-bundle/demos/autocomplete/index.html new file mode 100644 index 000000000..ba96d994e --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/index.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + <div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="remote.html">Remote datasource</a></li> + <li><a href="remote-with-cache.html">Remote with caching</a></li> + <li><a href="remote-jsonp.html">Remote JSONP datasource</a></li> + <li><a href="combobox.html">Combobox</a></li> + <li><a href="custom-data.html">Custom data and display</a></li> + <li><a href="xml.html">XML data parsed once</a></li> + <li><a href="categories.html">Categories</a></li> + <li><a href="multiple.html">Multiple values</a></li> + <li><a href="multiple-remote.html">Multiple, remote</a></li> + </ul> + </div> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/london.xml b/fannie/src/jquery/development-bundle/demos/autocomplete/london.xml new file mode 100644 index 000000000..262854998 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/london.xml @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<geonames style="MEDIUM"> +<totalResultsCount>6987</totalResultsCount> +<geoname> +<name>London</name> +<lat>51.5084152563931</lat> +<lng>-0.125532746315002</lng> +<geonameId>2643743</geonameId> +<countryCode>GB</countryCode> +<countryName>United Kingdom</countryName> + +<fcl>P</fcl> +<fcode>PPLC</fcode> +</geoname> +<geoname> +<name>London</name> +<lat>42.983389283</lat> +<lng>-81.233042387</lng> +<geonameId>6058560</geonameId> +<countryCode>CA</countryCode> +<countryName>Canada</countryName> + +<fcl>P</fcl> +<fcode>PPL</fcode> +</geoname> +<geoname> +<name>East London</name> +<lat>-33.0152850934643</lat> +<lng>27.9116249084473</lng> +<geonameId>1006984</geonameId> +<countryCode>ZA</countryCode> +<countryName>South Africa</countryName> + +<fcl>P</fcl> +<fcode>PPL</fcode> +</geoname> +<geoname> +<name>City</name> +<lat>51.5133363996235</lat> +<lng>-0.0890064239501953</lng> +<geonameId>2643744</geonameId> +<countryCode>GB</countryCode> +<countryName>United Kingdom</countryName> + +<fcl>A</fcl> +<fcode>ADM2</fcode> +</geoname> +<geoname> +<name>London</name> +<lat>37.1289771</lat> +<lng>-84.0832646</lng> +<geonameId>4298960</geonameId> +<countryCode>US</countryCode> +<countryName>United States</countryName> + +<fcl>P</fcl> +<fcode>PPL</fcode> +</geoname> +<geoname> +<name>The Tower of London</name> +<lat>51.5082349601834</lat> +<lng>-0.0763034820556641</lng> +<geonameId>6286786</geonameId> +<countryCode>GB</countryCode> +<countryName>United Kingdom</countryName> + +<fcl>S</fcl> +<fcode>CSTL</fcode> +</geoname> +<geoname> +<name>London Reefs</name> +<lat>8.85</lat> +<lng>112.5333333</lng> +<geonameId>1879967</geonameId> +<countryCode> </countryCode> +<countryName> </countryName> + +<fcl>U</fcl> +<fcode>RFSU</fcode> +</geoname> +<geoname> +<name>Greater London</name> +<lat>51.5</lat> +<lng>-0.1666667</lng> +<geonameId>2648110</geonameId> +<countryCode>GB</countryCode> +<countryName>United Kingdom</countryName> + +<fcl>A</fcl> +<fcode>ADM2</fcode> +</geoname> +<geoname> +<name>London</name> +<lat>46.1666667</lat> +<lng>6.0166667</lng> +<geonameId>2661811</geonameId> +<countryCode>CH</countryCode> +<countryName>Switzerland</countryName> + +<fcl>H</fcl> +<fcode>STM</fcode> +</geoname> +<geoname> +<name>London Borough of Islington</name> +<lat>51.5333333</lat> +<lng>-0.1333333</lng> +<geonameId>3333156</geonameId> +<countryCode>GB</countryCode> +<countryName>United Kingdom</countryName> + +<fcl>A</fcl> +<fcode>ADM2</fcode> +</geoname> +</geonames> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/multiple-remote.html b/fannie/src/jquery/development-bundle/demos/autocomplete/multiple-remote.html new file mode 100644 index 000000000..5e0f4b50b --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/multiple-remote.html @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete multiple demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + function split(val) { + return val.split(/,\s*/); + } + function extractLast(term) { + return split(term).pop(); + } + + $("#birds").autocomplete({ + source: function(request, response) { + $.getJSON("search.php", { + term: extractLast(request.term) + }, response); + }, + search: function() { + // custom minLength + var term = extractLast(this.value); + if (term.length < 2) { + return false; + } + }, + focus: function() { + // prevent value inserted on focus + return false; + }, + select: function(event, ui) { + var terms = split( this.value ); + // remove the current input + terms.pop(); + // add the selected item + terms.push( ui.item.value ); + // add placeholder to get the comma-and-space at the end + terms.push(""); + this.value = terms.join(", "); + return false; + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="birds">Birds: </label> + <input id="birds" size="50" /> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +Usage: Enter at least two characters to get bird name suggestions. Select a value to continue adding more names. +</p> +<p> +This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/multiple.html b/fannie/src/jquery/development-bundle/demos/autocomplete/multiple.html new file mode 100644 index 000000000..908cfe6ce --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/multiple.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete multiple demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + var availableTags = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"]; + function split(val) { + return val.split(/,\s*/); + } + function extractLast(term) { + return split(term).pop(); + } + + $("#tags").autocomplete({ + minLength: 0, + source: function(request, response) { + // delegate back to autocomplete, but extract the last term + response($.ui.autocomplete.filter(availableTags, extractLast(request.term))); + }, + focus: function() { + // prevent value inserted on focus + return false; + }, + select: function(event, ui) { + var terms = split( this.value ); + // remove the current input + terms.pop(); + // add the selected item + terms.push( ui.item.value ); + // add placeholder to get the comma-and-space at the end + terms.push(""); + this.value = terms.join(", "); + return false; + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="tags">Tag programming languages: </label> + <input id="tags" size="50" /> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +Usage: Type something, eg. "j" to see suggestions for tagging with programming languages. Select a value, then continue typing to add more. +</p> +<p> +This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/remote-jsonp.html b/fannie/src/jquery/development-bundle/demos/autocomplete/remote-jsonp.html new file mode 100644 index 000000000..ab8a600a8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/remote-jsonp.html @@ -0,0 +1,86 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Remote JSONP datasource demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + function log(message) { + $("<div/>").text(message).prependTo("#log"); + $("#log").attr("scrollTop", 0); + } + + $("#city").autocomplete({ + source: function(request, response) { + $.ajax({ + url: "http://ws.geonames.org/searchJSON", + dataType: "jsonp", + data: { + featureClass: "P", + style: "full", + maxRows: 12, + name_startsWith: request.term + }, + success: function(data) { + response($.map(data.geonames, function(item) { + return { + label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, + value: item.name + } + })) + } + }) + }, + minLength: 2, + select: function(event, ui) { + log(ui.item ? ("Selected: " + ui.item.label) : "Nothing selected, input was " + this.value); + }, + open: function() { + $(this).removeClass("ui-corner-all").addClass("ui-corner-top"); + }, + close: function() { + $(this).removeClass("ui-corner-top").addClass("ui-corner-all"); + } + }); + }); + </script> + <style> + .ui-autocomplete-loading { background: url(indicator.gif) no-repeat right; } + #city { width: 25em; } + </style> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="city">Your city: </label> + <input id="city" /> + Powered by <a href="http://geonames.org">geonames.org</a> +</div> + +<div class="ui-widget" style="margin-top:2em; font-family:Arial"> + Result: + <div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are cities, displayed when at least two characters are entered into the field. +</p> +<p> +In this case, the datasource is the <a href="http://geonames.org">geonames.org webservice</a>. While only the city name itself ends up in the input after selecting an element, more info is displayed in the suggestions to help find the right entry. That data is also available in callbacks, as illustrated by the Result area below the input. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/remote-with-cache.html b/fannie/src/jquery/development-bundle/demos/autocomplete/remote-with-cache.html new file mode 100644 index 000000000..a00c741e4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/remote-with-cache.html @@ -0,0 +1,76 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Remote with caching demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + function log(message) { + $("<div/>").text(message).prependTo("#log"); + $("#log").attr("scrollTop", 0); + } + + var cache = {}; + $("#birds").autocomplete({ + source: function(request, response) { + if (cache.term == request.term && cache.content) { + response(cache.content); + return; + } + if (new RegExp(cache.term).test(request.term) && cache.content && cache.content.length < 13) { + response($.ui.autocomplete.filter(cache.content, request.term)); + return; + } + $.ajax({ + url: "search.php", + dataType: "json", + data: request, + success: function(data) { + cache.term = request.term; + cache.content = data; + response(data); + } + }); + }, + minLength: 2, + select: function(event, ui) { + log(ui.item ? ("Selected: " + ui.item.value + " aka " + ui.item.id) : "Nothing selected, input was " + this.value); + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="birds">Birds: </label> + <input id="birds" /> +</div> + +<div class="ui-widget" style="margin-top:2em; font-family:Arial"> + Result: + <div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are bird names, displayed when at least two characters are entered into the field. +</p> +<p> +Similar to the remote datasource demo, though this adds some local caching to improve performance. The cache here saves just one query, and could be extended to cache multiple values, one for each term. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/remote.html b/fannie/src/jquery/development-bundle/demos/autocomplete/remote.html new file mode 100644 index 000000000..9414102e6 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/remote.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Remote datasource demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + function log(message) { + $("<div/>").text(message).prependTo("#log"); + $("#log").attr("scrollTop", 0); + } + + $("#birds").autocomplete({ + source: "search.php", + minLength: 2, + select: function(event, ui) { + log(ui.item ? ("Selected: " + ui.item.value + " aka " + ui.item.id) : "Nothing selected, input was " + this.value); + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="birds">Birds: </label> + <input id="birds" /> +</div> + +<div class="ui-widget" style="margin-top:2em; font-family:Arial"> + Result: + <div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are bird names, displayed when at least two characters are entered into the field. +</p> +<p> +The datasource is a server-side script which returns JSON data, specified via a simple URL for the source-option. In addition, the minLength-option is set to 2 to avoid queries that would return too many results and the select-event is used to display some feedback. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/search.php b/fannie/src/jquery/development-bundle/demos/autocomplete/search.php new file mode 100644 index 000000000..01206489a --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/search.php @@ -0,0 +1,640 @@ +<?php + +$q = strtolower($_GET["term"]); +if (!$q) return; +$items = array( +"Great <em>Bittern</em>"=>"Botaurus stellaris", +"Little <em>Grebe</em>"=>"Tachybaptus ruficollis", +"Black-necked Grebe"=>"Podiceps nigricollis", +"Little Bittern"=>"Ixobrychus minutus", +"Black-crowned Night Heron"=>"Nycticorax nycticorax", +"Purple Heron"=>"Ardea purpurea", +"White Stork"=>"Ciconia ciconia", +"Spoonbill"=>"Platalea leucorodia", +"Red-crested Pochard"=>"Netta rufina", +"Common Eider"=>"Somateria mollissima", +"Red Kite"=>"Milvus milvus", +"Hen Harrier"=>"Circus cyaneus", +"Montagu`s Harrier"=>"Circus pygargus", +"Black Grouse"=>"Tetrao tetrix", +"Grey Partridge"=>"Perdix perdix", +"Spotted Crake"=>"Porzana porzana", +"Corncrake"=>"Crex crex", +"Common Crane"=>"Grus grus", +"Avocet"=>"Recurvirostra avosetta", +"Stone Curlew"=>"Burhinus oedicnemus", +"Common Ringed Plover"=>"Charadrius hiaticula", +"Kentish Plover"=>"Charadrius alexandrinus", +"Ruff"=>"Philomachus pugnax", +"Common Snipe"=>"Gallinago gallinago", +"Black-tailed Godwit"=>"Limosa limosa", +"Common Redshank"=>"Tringa totanus", +"Sandwich Tern"=>"Sterna sandvicensis", +"Common Tern"=>"Sterna hirundo", +"Arctic Tern"=>"Sterna paradisaea", +"Little Tern"=>"Sternula albifrons", +"Black Tern"=>"Chlidonias niger", +"Barn Owl"=>"Tyto alba", +"Little Owl"=>"Athene noctua", +"Short-eared Owl"=>"Asio flammeus", +"European Nightjar"=>"Caprimulgus europaeus", +"Common Kingfisher"=>"Alcedo atthis", +"Eurasian Hoopoe"=>"Upupa epops", +"Eurasian Wryneck"=>"Jynx torquilla", +"European Green Woodpecker"=>"Picus viridis", +"Crested Lark"=>"Galerida cristata", +"White-headed Duck"=>"Oxyura leucocephala", +"Pale-bellied Brent Goose"=>"Branta hrota", +"Tawny Pipit"=>"Anthus campestris", +"Whinchat"=>"Saxicola rubetra", +"European Stonechat"=>"Saxicola rubicola", +"Northern Wheatear"=>"Oenanthe oenanthe", +"Savi`s Warbler"=>"Locustella luscinioides", +"Sedge Warbler"=>"Acrocephalus schoenobaenus", +"Great Reed Warbler"=>"Acrocephalus arundinaceus", +"Bearded Reedling"=>"Panurus biarmicus", +"Red-backed Shrike"=>"Lanius collurio", +"Great Grey Shrike"=>"Lanius excubitor", +"Woodchat Shrike"=>"Lanius senator", +"Common Raven"=>"Corvus corax", +"Yellowhammer"=>"Emberiza citrinella", +"Ortolan Bunting"=>"Emberiza hortulana", +"Corn Bunting"=>"Emberiza calandra", +"Great Cormorant"=>"Phalacrocorax carbo", +"Hawfinch"=>"Coccothraustes coccothraustes", +"Common Shelduck"=>"Tadorna tadorna", +"Bluethroat"=>"Luscinia svecica", +"Grey Heron"=>"Ardea cinerea", +"Barn Swallow"=>"Hirundo rustica", +"Hooded Crow"=>"Corvus cornix", +"Dunlin"=>"Calidris alpina", +"Eurasian Pied Flycatcher"=>"Ficedula hypoleuca", +"Eurasian Nuthatch"=>"Sitta europaea", +"Short-toed Tree Creeper"=>"Certhia brachydactyla", +"Wood Lark"=>"Lullula arborea", +"Tree Pipit"=>"Anthus trivialis", +"Eurasian Hobby"=>"Falco subbuteo", +"Marsh Warbler"=>"Acrocephalus palustris", +"Wood Sandpiper"=>"Tringa glareola", +"Tawny Owl"=>"Strix aluco", +"Lesser Whitethroat"=>"Sylvia curruca", +"Barnacle Goose"=>"Branta leucopsis", +"Common Goldeneye"=>"Bucephala clangula", +"Western Marsh Harrier"=>"Circus aeruginosus", +"Common Buzzard"=>"Buteo buteo", +"Sanderling"=>"Calidris alba", +"Little Gull"=>"Larus minutus", +"Eurasian Magpie"=>"Pica pica", +"Willow Warbler"=>"Phylloscopus trochilus", +"Wood Warbler"=>"Phylloscopus sibilatrix", +"Great Crested Grebe"=>"Podiceps cristatus", +"Eurasian Jay"=>"Garrulus glandarius", +"Common Redstart"=>"Phoenicurus phoenicurus", +"Blue-headed Wagtail"=>"Motacilla flava", +"Common Swift"=>"Apus apus", +"Marsh Tit"=>"Poecile palustris", +"Goldcrest"=>"Regulus regulus", +"European Golden Plover"=>"Pluvialis apricaria", +"Eurasian Bullfinch"=>"Pyrrhula pyrrhula", +"Common Whitethroat"=>"Sylvia communis", +"Meadow Pipit"=>"Anthus pratensis", +"Greylag Goose"=>"Anser anser", +"Spotted Flycatcher"=>"Muscicapa striata", +"European Greenfinch"=>"Carduelis chloris", +"Common Greenshank"=>"Tringa nebularia", +"Great Spotted Woodpecker"=>"Dendrocopos major", +"Greater Canada Goose"=>"Branta canadensis", +"Mistle Thrush"=>"Turdus viscivorus", +"Great Black-backed Gull"=>"Larus marinus", +"Goosander"=>"Mergus merganser", +"Great Egret"=>"Casmerodius albus", +"Northern Goshawk"=>"Accipiter gentilis", +"Dunnock"=>"Prunella modularis", +"Stock Dove"=>"Columba oenas", +"Common Wood Pigeon"=>"Columba palumbus", +"Eurasian Woodcock"=>"Scolopax rusticola", +"House Sparrow"=>"Passer domesticus", +"Common House Martin"=>"Delichon urbicum", +"Red Knot"=>"Calidris canutus", +"Western Jackdaw"=>"Corvus monedula", +"Brambling"=>"Fringilla montifringilla", +"Northern Lapwing"=>"Vanellus vanellus", +"European Reed Warbler"=>"Acrocephalus scirpaceus", +"Lesser Black-backed Gull"=>"Larus fuscus", +"Little Egret"=>"Egretta garzetta", +"Little Stint"=>"Calidris minuta", +"Common Linnet"=>"Carduelis cannabina", +"Mute Swan"=>"Cygnus olor", +"Common Cuckoo"=>"Cuculus canorus", +"Black-headed Gull"=>"Larus ridibundus", +"Greater White-fronted Goose"=>"Anser albifrons", +"Great Tit"=>"Parus major", +"Redwing"=>"Turdus iliacus", +"Gadwall"=>"Anas strepera", +"Fieldfare"=>"Turdus pilaris", +"Tufted Duck"=>"Aythya fuligula", +"Crested Tit"=>"Lophophanes cristatus", +"Willow Tit"=>"Poecile montanus", +"Eurasian Coot"=>"Fulica atra", +"Common Blackbird"=>"Turdus merula", +"Smew"=>"Mergus albellus", +"Common Sandpiper"=>"Actitis hypoleucos", +"Sand Martin"=>"Riparia riparia", +"Purple Sandpiper"=>"Calidris maritima", +"Northern Pintail"=>"Anas acuta", +"Blue Tit"=>"Cyanistes caeruleus", +"European Goldfinch"=>"Carduelis carduelis", +"Eurasian Whimbrel"=>"Numenius phaeopus", +"Common Reed Bunting"=>"Emberiza schoeniclus", +"Eurasian Tree Sparrow"=>"Passer montanus", +"Rook"=>"Corvus frugilegus", +"European Robin"=>"Erithacus rubecula", +"Bar-tailed Godwit"=>"Limosa lapponica", +"Dark-bellied Brent Goose"=>"Branta bernicla", +"Eurasian Oystercatcher"=>"Haematopus ostralegus", +"Eurasian Siskin"=>"Carduelis spinus", +"Northern Shoveler"=>"Anas clypeata", +"Eurasian Wigeon"=>"Anas penelope", +"Eurasian Sparrow Hawk"=>"Accipiter nisus", +"Icterine Warbler"=>"Hippolais icterina", +"Common Starling"=>"Sturnus vulgaris", +"Long-tailed Tit"=>"Aegithalos caudatus", +"Ruddy Turnstone"=>"Arenaria interpres", +"Mew Gull"=>"Larus canus", +"Common Pochard"=>"Aythya ferina", +"Common Chiffchaff"=>"Phylloscopus collybita", +"Greater Scaup"=>"Aythya marila", +"Common Kestrel"=>"Falco tinnunculus", +"Garden Warbler"=>"Sylvia borin", +"Eurasian Collared Dove"=>"Streptopelia decaocto", +"Eurasian Skylark"=>"Alauda arvensis", +"Common Chaffinch"=>"Fringilla coelebs", +"Common Moorhen"=>"Gallinula chloropus", +"Water Pipit"=>"Anthus spinoletta", +"Mallard"=>"Anas platyrhynchos", +"Winter Wren"=>"Troglodytes troglodytes", +"Common Teal"=>"Anas crecca", +"Green Sandpiper"=>"Tringa ochropus", +"White Wagtail"=>"Motacilla alba", +"Eurasian Curlew"=>"Numenius arquata", +"Song Thrush"=>"Turdus philomelos", +"European Herring Gull"=>"Larus argentatus", +"Grey Plover"=>"Pluvialis squatarola", +"Carrion Crow"=>"Corvus corone", +"Coal Tit"=>"Periparus ater", +"Spotted Redshank"=>"Tringa erythropus", +"Blackcap"=>"Sylvia atricapilla", +"Egyptian Vulture"=>"Neophron percnopterus", +"Razorbill"=>"Alca torda", +"Alpine Swift"=>"Apus melba", +"Long-legged Buzzard"=>"Buteo rufinus", +"Audouin`s Gull"=>"Larus audouinii", +"Balearic Shearwater"=>"Puffinus mauretanicus", +"Upland Sandpiper"=>"Bartramia longicauda", +"Greater Spotted Eagle"=>"Aquila clanga", +"Ring Ouzel"=>"Turdus torquatus", +"Yellow-browed Warbler"=>"Phylloscopus inornatus", +"Blue Rock Thrush"=>"Monticola solitarius", +"Buff-breasted Sandpiper"=>"Tryngites subruficollis", +"Jack Snipe"=>"Lymnocryptes minimus", +"White-rumped Sandpiper"=>"Calidris fuscicollis", +"Ruddy Shelduck"=>"Tadorna ferruginea", +"Cetti's Warbler"=>"Cettia cetti", +"Citrine Wagtail"=>"Motacilla citreola", +"Roseate Tern"=>"Sterna dougallii", +"Black-legged Kittiwake"=>"Rissa tridactyla", +"Pygmy Cormorant"=>"Phalacrocorax pygmeus", +"Booted Eagle"=>"Aquila pennata", +"Lesser White-fronted Goose"=>"Anser erythropus", +"Little Bunting"=>"Emberiza pusilla", +"Eleonora's Falcon"=>"Falco eleonorae", +"European Serin"=>"Serinus serinus", +"Twite"=>"Carduelis flavirostris", +"Yellow-legged Gull"=>"Larus michahellis", +"Gyr Falcon"=>"Falco rusticolus", +"Greenish Warbler"=>"Phylloscopus trochiloides", +"Red-necked Phalarope"=>"Phalaropus lobatus", +"Mealy Redpoll"=>"Carduelis flammea", +"Glaucous Gull"=>"Larus hyperboreus", +"Great Skua"=>"Stercorarius skua", +"Great Bustard"=>"Otis tarda", +"Velvet Scoter"=>"Melanitta fusca", +"Pine Grosbeak"=>"Pinicola enucleator", +"House Crow"=>"Corvus splendens", +"Hume`s Leaf Warbler"=>"Phylloscopus humei", +"Great Northern Loon"=>"Gavia immer", +"Long-tailed Duck"=>"Clangula hyemalis", +"Lapland Longspur"=>"Calcarius lapponicus", +"Northern Gannet"=>"Morus bassanus", +"Eastern Imperial Eagle"=>"Aquila heliaca", +"Little Auk"=>"Alle alle", +"Lesser Spotted Woodpecker"=>"Dendrocopos minor", +"Iceland Gull"=>"Larus glaucoides", +"Parasitic Jaeger"=>"Stercorarius parasiticus", +"Bewick`s Swan"=>"Cygnus bewickii", +"Little Bustard"=>"Tetrax tetrax", +"Little Crake"=>"Porzana parva", +"Baillon`s Crake"=>"Porzana pusilla", +"Long-tailed Jaeger"=>"Stercorarius longicaudus", +"King Eider"=>"Somateria spectabilis", +"Greater Short-toed Lark"=>"Calandrella brachydactyla", +"Houbara Bustard"=>"Chlamydotis undulata", +"Curlew Sandpiper"=>"Calidris ferruginea", +"Common Crossbill"=>"Loxia curvirostra", +"European Shag"=>"Phalacrocorax aristotelis", +"Horned Grebe"=>"Podiceps auritus", +"Common Quail"=>"Coturnix coturnix", +"Bearded Vulture"=>"Gypaetus barbatus", +"Lanner Falcon"=>"Falco biarmicus", +"Middle Spotted Woodpecker"=>"Dendrocopos medius", +"Pomarine Jaeger"=>"Stercorarius pomarinus", +"Red-breasted Merganser"=>"Mergus serrator", +"Eurasian Black Vulture"=>"Aegypius monachus", +"Eurasian Dotterel"=>"Charadrius morinellus", +"Common Nightingale"=>"Luscinia megarhynchos", +"Northern willow warbler"=>"Phylloscopus trochilus acredula", +"Manx Shearwater"=>"Puffinus puffinus", +"Northern Fulmar"=>"Fulmarus glacialis", +"Eurasian Eagle Owl"=>"Bubo bubo", +"Orphean Warbler"=>"Sylvia hortensis", +"Melodious Warbler"=>"Hippolais polyglotta", +"Pallas's Leaf Warbler"=>"Phylloscopus proregulus", +"Atlantic Puffin"=>"Fratercula arctica", +"Black-throated Loon"=>"Gavia arctica", +"Bohemian Waxwing"=>"Bombycilla garrulus", +"Marsh Sandpiper"=>"Tringa stagnatilis", +"Great Snipe"=>"Gallinago media", +"Squacco Heron"=>"Ardeola ralloides", +"Long-eared Owl"=>"Asio otus", +"Caspian Tern"=>"Hydroprogne caspia", +"Red-breasted Goose"=>"Branta ruficollis", +"Red-throated Loon"=>"Gavia stellata", +"Common Rosefinch"=>"Carpodacus erythrinus", +"Red-footed Falcon"=>"Falco vespertinus", +"Ross's Goose"=>"Anser rossii", +"Red Phalarope"=>"Phalaropus fulicarius", +"Pied Wagtail"=>"Motacilla yarrellii", +"Rose-coloured Starling"=>"Sturnus roseus", +"Rough-legged Buzzard"=>"Buteo lagopus", +"Saker Falcon"=>"Falco cherrug", +"European Roller"=>"Coracias garrulus", +"Short-toed Eagle"=>"Circaetus gallicus", +"Peregrine Falcon"=>"Falco peregrinus", +"Merlin"=>"Falco columbarius", +"Snow Goose"=>"Anser caerulescens", +"Snowy Owl"=>"Bubo scandiacus", +"Snow Bunting"=>"Plectrophenax nivalis", +"Common Grasshopper Warbler"=>"Locustella naevia", +"Golden Eagle"=>"Aquila chrysaetos", +"Black-winged Stilt"=>"Himantopus himantopus", +"Steppe Eagle"=>"Aquila nipalensis", +"Pallid Harrier"=>"Circus macrourus", +"European Storm-petrel"=>"Hydrobates pelagicus", +"Horned Lark"=>"Eremophila alpestris", +"Eurasian Treecreeper"=>"Certhia familiaris", +"Taiga Bean Goose"=>"Anser fabalis", +"Temminck`s Stint"=>"Calidris temminckii", +"Terek Sandpiper"=>"Xenus cinereus", +"Tundra Bean Goose"=>"Anser serrirostris", +"European Turtle Dove"=>"Streptopelia turtur", +"Leach`s Storm-petrel"=>"Oceanodroma leucorhoa", +"Eurasian Griffon Vulture"=>"Gyps fulvus", +"Paddyfield Warbler"=>"Acrocephalus agricola", +"Osprey"=>"Pandion haliaetus", +"Firecrest"=>"Regulus ignicapilla", +"Water Rail"=>"Rallus aquaticus", +"European Honey Buzzard"=>"Pernis apivorus", +"Eurasian Golden Oriole"=>"Oriolus oriolus", +"Whooper Swan"=>"Cygnus cygnus", +"Two-barred Crossbill"=>"Loxia leucoptera", +"White-tailed Eagle"=>"Haliaeetus albicilla", +"Atlantic Murre"=>"Uria aalge", +"Garganey"=>"Anas querquedula", +"Black Redstart"=>"Phoenicurus ochruros", +"Common Scoter"=>"Melanitta nigra", +"Rock Pipit"=>"Anthus petrosus", +"Lesser Spotted Eagle"=>"Aquila pomarina", +"Cattle Egret"=>"Bubulcus ibis", +"White-winged Black Tern"=>"Chlidonias leucopterus", +"Black Stork"=>"Ciconia nigra", +"Mediterranean Gull"=>"Larus melanocephalus", +"Black Kite"=>"Milvus migrans", +"Yellow Wagtail"=>"Motacilla flavissima", +"Red-necked Grebe"=>"Podiceps grisegena", +"Gull-billed Tern"=>"Gelochelidon nilotica", +"Pectoral Sandpiper"=>"Calidris melanotos", +"Barred Warbler"=>"Sylvia nisoria", +"Red-throated Pipit"=>"Anthus cervinus", +"Grey Wagtail"=>"Motacilla cinerea", +"Richard`s Pipit"=>"Anthus richardi", +"Black Woodpecker"=>"Dryocopus martius", +"Little Ringed Plover"=>"Charadrius dubius", +"Whiskered Tern"=>"Chlidonias hybrida", +"Lesser Redpoll"=>"Carduelis cabaret", +"Pallas' Bunting"=>"Emberiza pallasi", +"Ferruginous Duck"=>"Aythya nyroca", +"Whistling Swan"=>"Cygnus columbianus", +"Black Brant"=>"Branta nigricans", +"Marbled Teal"=>"Marmaronetta angustirostris", +"Canvasback"=>"Aythya valisineria", +"Redhead"=>"Aythya americana", +"Lesser Scaup"=>"Aythya affinis", +"Steller`s Eider"=>"Polysticta stelleri", +"Spectacled Eider"=>"Somateria fischeri", +"Harlequin Duck"=>"Histronicus histrionicus", +"Black Scoter"=>"Melanitta americana", +"Surf Scoter"=>"Melanitta perspicillata", +"Barrow`s Goldeneye"=>"Bucephala islandica", +"Falcated Duck"=>"Anas falcata", +"American Wigeon"=>"Anas americana", +"Blue-winged Teal"=>"Anas discors", +"American Black Duck"=>"Anas rubripes", +"Baikal Teal"=>"Anas formosa", +"Green-Winged Teal"=>"Anas carolinensis", +"Hazel Grouse"=>"Bonasa bonasia", +"Rock Partridge"=>"Alectoris graeca", +"Red-legged Partridge"=>"Alectoris rufa", +"Yellow-billed Loon"=>"Gavia adamsii", +"Cory`s Shearwater"=>"Calonectris borealis", +"Madeiran Storm-Petrel"=>"Oceanodroma castro", +"Great White Pelican"=>"Pelecanus onocrotalus", +"Dalmatian Pelican"=>"Pelecanus crispus", +"American Bittern"=>"Botaurus lentiginosus", +"Glossy Ibis"=>"Plegadis falcinellus", +"Spanish Imperial Eagle"=>"Aquila adalberti", +"Lesser Kestrel"=>"Falco naumanni", +"Houbara Bustard"=>"Chlamydotis undulata", +"Crab-Plover"=>"Dromas ardeola", +"Cream-coloured Courser"=>"Cursorius cursor", +"Collared Pratincole"=>"Glareola pratincola", +"Black-winged Pratincole"=>"Glareola nordmanni", +"Killdeer"=>"Charadrius vociferus", +"Lesser Sand Plover"=>"Charadrius mongolus", +"Greater Sand Plover"=>"Charadrius leschenaultii", +"Caspian Plover"=>"Charadrius asiaticus", +"American Golden Plover"=>"Pluvialis dominica", +"Pacific Golden Plover"=>"Pluvialis fulva", +"Sharp-tailed Sandpiper"=>"Calidris acuminata", +"Broad-billed Sandpiper"=>"Limicola falcinellus", +"Spoon-Billed Sandpiper"=>"Eurynorhynchus pygmaeus", +"Short-Billed Dowitcher"=>"Limnodromus griseus", +"Long-billed Dowitcher"=>"Limnodromus scolopaceus", +"Hudsonian Godwit"=>"Limosa haemastica", +"Little Curlew"=>"Numenius minutus", +"Lesser Yellowlegs"=>"Tringa flavipes", +"Wilson`s Phalarope"=>"Phalaropus tricolor", +"Pallas`s Gull"=>"Larus ichthyaetus", +"Laughing Gull"=>"Larus atricilla", +"Franklin`s Gull"=>"Larus pipixcan", +"Bonaparte`s Gull"=>"Larus philadelphia", +"Ring-billed Gull"=>"Larus delawarensis", +"American Herring Gull"=>"Larus smithsonianus", +"Caspian Gull"=>"Larus cachinnans", +"Ivory Gull"=>"Pagophila eburnea", +"Royal Tern"=>"Sterna maxima", +"Brünnich`s Murre"=>"Uria lomvia", +"Crested Auklet"=>"Aethia cristatella", +"Parakeet Auklet"=>"Cyclorrhynchus psittacula", +"Tufted Puffin"=>"Lunda cirrhata", +"Laughing Dove"=>"Streptopelia senegalensis", +"Great Spotted Cuckoo"=>"Clamator glandarius", +"Great Grey Owl"=>"Strix nebulosa", +"Tengmalm`s Owl"=>"Aegolius funereus", +"Red-Necked Nightjar"=>"Caprimulgus ruficollis", +"Chimney Swift"=>"Chaetura pelagica", +"Green Bea-Eater"=>"Merops orientalis", +"Grey-headed Woodpecker"=>"Picus canus", +"Lesser Short-Toed Lark"=>"Calandrella rufescens", +"Eurasian Crag Martin"=>"Hirundo rupestris", +"Red-rumped Swallow"=>"Cecropis daurica", +"Blyth`s Pipit"=>"Anthus godlewskii", +"Pechora Pipit"=>"Anthus gustavi", +"Grey-headed Wagtail"=>"Motacilla thunbergi", +"Yellow-Headed Wagtail"=>"Motacilla lutea", +"White-throated Dipper"=>"Cinclus cinclus", +"Rufous-Tailed Scrub Robin"=>"Cercotrichas galactotes", +"Thrush Nightingale"=>"Luscinia luscinia", +"White-throated Robin"=>"Irania gutturalis", +"Caspian Stonechat"=>"Saxicola maura variegata", +"Western Black-eared Wheatear"=>"Oenanthe hispanica", +"Rufous-tailed Rock Thrush"=>"Monticola saxatilis", +"Red-throated Thrush/Black-throated"=>"Turdus ruficollis", +"American Robin"=>"Turdus migratorius", +"Zitting Cisticola"=>"Cisticola juncidis", +"Lanceolated Warbler"=>"Locustella lanceolata", +"River Warbler"=>"Locustella fluviatilis", +"Blyth`s Reed Warbler"=>"Acrocephalus dumetorum", +"Caspian Reed Warbler"=>"Acrocephalus fuscus", +"Aquatic Warbler"=>"Acrocephalus paludicola", +"Booted Warbler"=>"Acrocephalus caligatus", +"Marmora's Warbler"=>"Sylvia sarda", +"Dartford Warbler"=>"Sylvia undata", +"Subalpine Warbler"=>"Sylvia cantillans", +"Ménétries's Warbler"=>"Sylvia mystacea", +"Rüppel's Warbler"=>"Sylvia rueppelli", +"Asian Desert Warbler"=>"Sylvia nana", +"Western Orphean Warbler"=>"Sylvia hortensis hortensis", +"Arctic Warbler"=>"Phylloscopus borealis", +"Radde`s Warbler"=>"Phylloscopus schwarzi", +"Western Bonelli`s Warbler"=>"Phylloscopus bonelli", +"Red-breasted Flycatcher"=>"Ficedula parva", +"Eurasian Penduline Tit"=>"Remiz pendulinus", +"Daurian Shrike"=>"Lanius isabellinus", +"Long-Tailed Shrike"=>"Lanius schach", +"Lesser Grey Shrike"=>"Lanius minor", +"Southern Grey Shrike"=>"Lanius meridionalis", +"Masked Shrike"=>"Lanius nubicus", +"Spotted Nutcracker"=>"Nucifraga caryocatactes", +"Daurian Jackdaw"=>"Corvus dauuricus", +"Purple-Backed Starling"=>"Sturnus sturninus", +"Red-Fronted Serin"=>"Serinus pusillus", +"Arctic Redpoll"=>"Carduelis hornemanni", +"Scottish Crossbill"=>"Loxia scotica", +"Parrot Crossbill"=>"Loxia pytyopsittacus", +"Black-faced Bunting"=>"Emberiza spodocephala", +"Pink-footed Goose"=>"Anser brachyrhynchus", +"Black-winged Kite"=>"Elanus caeruleus", +"European Bee-eater"=>"Merops apiaster", +"Sabine`s Gull"=>"Larus sabini", +"Sooty Shearwater"=>"Puffinus griseus", +"Lesser Canada Goose"=>"Branta hutchinsii", +"Ring-necked Duck"=>"Aythya collaris", +"Greater Flamingo"=>"Phoenicopterus roseus", +"Iberian Chiffchaff"=>"Phylloscopus ibericus", +"Ashy-headed Wagtail"=>"Motacilla cinereocapilla", +"Stilt Sandpiper"=>"Calidris himantopus", +"Siberian Stonechat"=>"Saxicola maurus", +"Greater Yellowlegs"=>"Tringa melanoleuca", +"Forster`s Tern"=>"Sterna forsteri", +"Dusky Warbler"=>"Phylloscopus fuscatus", +"Cirl Bunting"=>"Emberiza cirlus", +"Olive-backed Pipit"=>"Anthus hodgsoni", +"Sociable Lapwing"=>"Vanellus gregarius", +"Spotted Sandpiper"=>"Actitis macularius", +"Baird`s Sandpiper"=>"Calidris bairdii", +"Rustic Bunting"=>"Emberiza rustica", +"Yellow-browed Bunting"=>"Emberiza chrysophrys", +"Great Shearwater"=>"Puffinus gravis", +"Bonelli`s Eagle"=>"Aquila fasciata", +"Calandra Lark"=>"Melanocorypha calandra", +"Sardinian Warbler"=>"Sylvia melanocephala", +"Ross's Gull"=>"Larus roseus", +"Yellow-Breasted Bunting"=>"Emberiza aureola", +"Pine Bunting"=>"Emberiza leucocephalos", +"Black Guillemot"=>"Cepphus grylle", +"Pied-billed Grebe"=>"Podilymbus podiceps", +"Soft-plumaged Petrel"=>"Pterodroma mollis", +"Bulwer's Petrel"=>"Bulweria bulwerii", +"White-Faced Storm-Petrel"=>"Pelagodroma marina", +"Pallas’s Fish Eagle"=>"Haliaeetus leucoryphus", +"Sandhill Crane"=>"Grus canadensis", +"Macqueen’s Bustard"=>"Chlamydotis macqueenii", +"White-tailed Lapwing"=>"Vanellus leucurus", +"Great Knot"=>"Calidris tenuirostris", +"Semipalmated Sandpiper"=>"Calidris pusilla", +"Red-necked Stint"=>"Calidris ruficollis", +"Slender-billed Curlew"=>"Numenius tenuirostris", +"Bridled Tern"=>"Onychoprion anaethetus", +"Pallas’s Sandgrouse"=>"Syrrhaptes paradoxus", +"European Scops Owl"=>"Otus scops", +"Northern Hawk Owl"=>"Surnia ulula", +"White-Throated Needletail"=>"Hirundapus caudacutus", +"Belted Kingfisher"=>"Ceryle alcyon", +"Blue-cheeked Bee-eater"=>"Merops persicus", +"Black-headed Wagtail"=>"Motacilla feldegg", +"Northern Mockingbird"=>"Mimus polyglottos", +"Alpine Accentor"=>"Prunella collaris", +"Red-flanked Bluetail"=>"Tarsiger cyanurus", +"Isabelline Wheatear"=>"Oenanthe isabellina", +"Pied Wheatear"=>"Oenanthe pleschanka", +"Eastern Black-eared Wheatear"=>"Oenanthe melanoleuca", +"Desert Wheatear"=>"Oenanthe deserti", +"White`s Thrush"=>"Zoothera aurea", +"Siberian Thrush"=>"Zoothera sibirica", +"Eyebrowed Thrush"=>"Turdus obscurus", +"Dusky Thrush"=>"Turdus eunomus", +"Black-throated Thrush"=>"Turdus atrogularis", +"Pallas`s Grasshopper Warbler"=>"Locustella certhiola", +"Spectacled Warbler"=>"Sylvia conspicillata", +"Two-barred Warbler"=>"Phylloscopus plumbeitarsus", +"Eastern Bonelli’s Warbler"=>"Phylloscopus orientalis", +"Collared Flycatcher"=>"Ficedula albicollis", +"Wallcreeper"=>"Tichodroma muraria", +"Turkestan Shrike"=>"Lanius phoenicuroides", +"Steppe Grey Shrike"=>"Lanius pallidirostris", +"Spanish Sparrow"=>"Passer hispaniolensis", +"Red-eyed Vireo"=>"Vireo olivaceus", +"Myrtle Warbler"=>"Dendroica coronata", +"White-crowned Sparrow"=>"Zonotrichia leucophrys", +"White-throated Sparrow"=>"Zonotrichia albicollis", +"Cretzschmar`s Bunting"=>"Emberiza caesia", +"Chestnut Bunting"=>"Emberiza rutila", +"Red-headed Bunting"=>"Emberiza bruniceps", +"Black-headed Bunting"=>"Emberiza melanocephala", +"Indigo Bunting"=>"Passerina cyanea", +"Balearic Woodchat Shrike"=>"Lanius senator badius", +"Demoiselle Crane"=>"Grus virgo", +"Chough"=>"Pyrrhocorax pyrrhocorax", +"Red-Billed Chough"=>"Pyrrhocorax graculus", +"Elegant Tern"=>"Sterna elegans", +"Chukar"=>"Alectoris chukar", +"Yellow-Billed Cuckoo"=>"Coccyzus americanus", +"American Sandwich Tern"=>"Sterna sandvicensis acuflavida", +"Olive-Tree Warbler"=>"Hippolais olivetorum", +"Eastern Olivaceous Warbler"=>"Acrocephalus pallidus", +"Indian Cormorant"=>"Phalacrocorax fuscicollis", +"Spur-Winged Lapwing"=>"Vanellus spinosus", +"Yelkouan Shearwater"=>"Puffinus yelkouan", +"Trumpeter Finch"=>"Bucanetes githagineus", +"Red Grouse"=>"Lagopus scoticus", +"Rock Ptarmigan"=>"Lagopus mutus", +"Long-Tailed Cormorant"=>"Phalacrocorax africanus", +"Double-crested Cormorant"=>"Phalacrocorax auritus", +"Magnificent Frigatebird"=>"Fregata magnificens", +"Naumann's Thrush"=>"Turdus naumanni", +"Oriental Pratincole"=>"Glareola maldivarum", +"Bufflehead"=>"Bucephala albeola", +"Snowfinch"=>"Montifrigilla nivalis", +"Ural owl"=>"Strix uralensis", +"Spanish Wagtail"=>"Motacilla iberiae", +"Song Sparrow"=>"Melospiza melodia", +"Rock Bunting"=>"Emberiza cia", +"Siberian Rubythroat"=>"Luscinia calliope", +"Pallid Swift"=>"Apus pallidus", +"Eurasian Pygmy Owl"=>"Glaucidium passerinum", +"Madeira Little Shearwater"=>"Puffinus baroli", +"House Finch"=>"Carpodacus mexicanus", +"Green Heron"=>"Butorides virescens", +"Solitary Sandpiper"=>"Tringa solitaria", +"Heuglin's Gull"=>"Larus heuglini" +); + +function array_to_json( $array ){ + + if( !is_array( $array ) ){ + return false; + } + + $associative = count( array_diff( array_keys($array), array_keys( array_keys( $array )) )); + if( $associative ){ + + $construct = array(); + foreach( $array as $key => $value ){ + + // We first copy each key/value pair into a staging array, + // formatting each key and value properly as we go. + + // Format the key: + if( is_numeric($key) ){ + $key = "key_$key"; + } + $key = "\"".addslashes($key)."\""; + + // Format the value: + if( is_array( $value )){ + $value = array_to_json( $value ); + } else if( !is_numeric( $value ) || is_string( $value ) ){ + $value = "\"".addslashes($value)."\""; + } + + // Add to staging array: + $construct[] = "$key: $value"; + } + + // Then we collapse the staging array into the JSON form: + $result = "{ " . implode( ", ", $construct ) . " }"; + + } else { // If the array is a vector (not associative): + + $construct = array(); + foreach( $array as $value ){ + + // Format the value: + if( is_array( $value )){ + $value = array_to_json( $value ); + } else if( !is_numeric( $value ) || is_string( $value ) ){ + $value = "'".addslashes($value)."'"; + } + + // Add to staging array: + $construct[] = $value; + } + + // Then we collapse the staging array into the JSON form: + $result = "[ " . implode( ", ", $construct ) . " ]"; + } + + return $result; +} + +$result = array(); +foreach ($items as $key=>$value) { + if (strpos(strtolower($key), $q) !== false) { + array_push($result, array("id"=>$value, "label"=>$key, "value" => strip_tags($key))); + } + if (count($result) > 11) + break; +} +echo array_to_json($result); + +?> \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/demos/autocomplete/xml.html b/fannie/src/jquery/development-bundle/demos/autocomplete/xml.html new file mode 100644 index 000000000..3a5dadab9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/autocomplete/xml.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Autocomplete Remote datasource demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + function log(message) { + $("<div/>").text(message).prependTo("#log"); + $("#log").attr("scrollTop", 0); + } + + $.ajax({ + url: "london.xml", + dataType: "xml", + success: function(xmlResponse) { + var data = $("geoname", xmlResponse).map(function() { + return { + value: $("name", this).text() + ", " + ($.trim($("countryName", this).text()) || "(unknown country)"), + id: $("geonameId", this).text() + }; + }).get(); + $("#birds").autocomplete({ + source: data, + minLength: 0, + select: function(event, ui) { + log(ui.item ? ("Selected: " + ui.item.value + ", geonameId: " + ui.item.id) : "Nothing selected, input was " + this.value); + } + }); + } + }) + + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="ui-widget"> + <label for="birds">London matches: </label> + <input id="birds" /> +</div> + +<div class="ui-widget" style="margin-top:2em; font-family:Arial"> + Result: + <div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> +<p> +This demo shows how to retrieve some XML data, parse it using jQuery's methods, then provide it to the autocomplete as the datasource. +</p> +<p> +This should also serve as a reference on how to parse a remote XML datasource - the parsing would just happen for each request within the source-callback. +</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/checkbox.html b/fannie/src/jquery/development-bundle/demos/button/checkbox.html new file mode 100644 index 000000000..b6192ee28 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/checkbox.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button - Checkboxes demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#check").button(); + $("#format").buttonset(); + }); + </script> + <style> + #format { margin-top: 2em; } + </style> +</head> +<body> + +<div class="demo"> + + <input type="checkbox" id="check" /><label for="check">Toggle</label> + + <div id="format"> + <input type="checkbox" id="check1" /><label for="check1">B</label> + <input type="checkbox" id="check2" /><label for="check2">I</label> + <input type="checkbox" id="check3" /><label for="check3">U</label> + </div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>A checkbox is styled as a toggle button with the button widget. The label element associated with the checkbox is used for the button text.</p> + +<p>This demo also demonstrates three checkboxes styled as a button set by calling <code>.buttonset()</code> on a common container.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/default.html b/fannie/src/jquery/development-bundle/demos/button/default.html new file mode 100644 index 000000000..700c64bcc --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/default.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button - Default demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("button, input:submit, a", ".demo").button(); + + $("a", ".demo").click(function() { return false; }); + }); + </script> + <style> + + </style> +</head> +<body> + +<div class="demo"> + + <button>A button element</button> + + <input type="submit" value="A submit button"/> + + <a href="#">An anchor</a> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Examples of the markup that can be used for buttons: A button element, an input of type submit and an anchor.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/icons.html b/fannie/src/jquery/development-bundle/demos/button/icons.html new file mode 100644 index 000000000..2dc11c5d8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/icons.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button - Icons demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $(".demo button:first").button({ + icons: { + primary: 'ui-icon-locked' + }, + text: false + }).next().button({ + icons: { + primary: 'ui-icon-locked' + } + }).next().button({ + icons: { + primary: 'ui-icon-gear', + secondary: 'ui-icon-triangle-1-s' + } + }).next().button({ + icons: { + primary: 'ui-icon-gear', + secondary: 'ui-icon-triangle-1-s' + }, + text: false + }); + }); + </script> + <style> + + </style> +</head> +<body> + +<div class="demo"> + + <button>Button with icon only</button> + <button>Button with icon on the left</button> + <button>Button with two icons</button> + <button>Button with two icons and no text</button> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Some buttons with various combinations of text and icons, here specified via metadata.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/index.html b/fannie/src/jquery/development-bundle/demos/button/index.html new file mode 100644 index 000000000..c2b37200d --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/index.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="radio.html">Radios</a></li> + <li><a href="checkbox.html">Checkboxes</a></li> + <li><a href="icons.html">Icons</a></li> + <li><a href="toolbar.html">Toolbar</a></li> + <li><a href="splitbutton.html">Split Button</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/radio.html b/fannie/src/jquery/development-bundle/demos/button/radio.html new file mode 100644 index 000000000..3e5dc2379 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/radio.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button - Radio Buttons demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#radio").buttonset(); + }); + </script> + <style> + + </style> +</head> +<body> + +<div class="demo"> + + <form> + <div id="radio"> + <input type="radio" id="radio1" name="radio" /><label for="radio1">Choice 1</label> + <input type="radio" id="radio2" name="radio" checked="checked" /><label for="radio2">Choice 2</label> + <input type="radio" id="radio3" name="radio" /><label for="radio3">Choice 3</label> + </div> + </form> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>A set of three radio buttons transformed into a button set.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/splitbutton.html b/fannie/src/jquery/development-bundle/demos/button/splitbutton.html new file mode 100644 index 000000000..7e4d66038 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/splitbutton.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button - Default demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#rerun") + .button() + .click( function() { + alert( "Running the last action" ); + }) + .next() + .button( { + text: false, + icons: { + primary: "ui-icon-triangle-1-s" + } + }) + .click( function() { + alert( "Could display a menu to select an action" ); + }) + .parent() + .buttonset(); + }); + </script> + <style> + + </style> +</head> +<body> + +<div class="demo"> + + <div> + <button id="rerun">Run last action</button> + <button id="select">Select an action</button> + </div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>An example of a split button built with two buttons: A plan button with just text, one with only a primary icon +and no text. Both are grouped together in a set.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/button/toolbar.html b/fannie/src/jquery/development-bundle/demos/button/toolbar.html new file mode 100644 index 000000000..5573872a7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/button/toolbar.html @@ -0,0 +1,124 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Button - Toolbar demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #toolbar { + padding: 10px 4px; + } + </style> + <script type="text/javascript"> + $(function() { + $('#beginning').button({ + text: false, + icons: { + primary: 'ui-icon-seek-start' + } + }); + $('#rewind').button({ + text: false, + icons: { + primary: 'ui-icon-seek-prev' + } + }); + $('#play').button({ + text: false, + icons: { + primary: 'ui-icon-play' + } + }) + .click(function() { + var options; + if ($(this).text() == 'play') { + options = { + label: 'pause', + icons: { + primary: 'ui-icon-pause' + } + }; + } else { + options = { + label: 'play', + icons: { + primary: 'ui-icon-play' + } + }; + } + $(this).button('option', options); + }); + $('#stop').button({ + text: false, + icons: { + primary: 'ui-icon-stop' + } + }) + .click(function() { + $('#play').button('option', { + label: 'play', + icons: { + primary: 'ui-icon-play' + } + }); + }); + $('#forward').button({ + text: false, + icons: { + primary: 'ui-icon-seek-next' + } + }); + $('#end').button({ + text: false, + icons: { + primary: 'ui-icon-seek-end' + } + }); + $("#shuffle").button(); + $("#repeat").buttonset(); + }); + </script> +</head> +<body> + +<div class="demo"> + + <span id="toolbar" class="ui-widget-header ui-corner-all"> + <button id="beginning">go to beginning</button> + <button id="rewind">rewind</button> + <button id="play">play</button> + <button id="stop">stop</button> + <button id="forward">fast forward</button> + <button id="end">go to end</button> + + <input type="checkbox" id="shuffle" /><label for="shuffle">Shuffle</label> + + <span id="repeat"> + <input type="radio" id="repeat0" name="repeat" checked="checked" /><label for="repeat0">No Repeat</label> + <input type="radio" id="repeat1" name="repeat" /><label for="repeat1">Once</label> + <input type="radio" id="repeatall" name="repeat" /><label for="repeatall">All</label> + </span> + </span> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p> + A mediaplayer toolbar. Take a look at the underlying markup: A few button elements, + an input of type checkbox for the Shuffle button, and three inputs of type radio for the Repeat options. +</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/alt-field.html b/fannie/src/jquery/development-bundle/demos/datepicker/alt-field.html new file mode 100644 index 000000000..d51bf0634 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/alt-field.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Populate alternate field</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker({altField: '#alternate', altFormat: 'DD, d MM, yy'}); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker">&nbsp;<input type="text" id="alternate" size="30"/></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Populate an alternate field with its own date format whenever a date is selected using the <code>altField</code> and <code>altFormat</code> options. This feature could be used to present a human-friendly date for user selection, while passing a more computer-friendly date through for further processing.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/animation.html b/fannie/src/jquery/development-bundle/demos/datepicker/animation.html new file mode 100644 index 000000000..27f20ffb8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/animation.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Animations</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.blind.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.bounce.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.clip.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.drop.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.fold.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.effects.slide.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker(); + $("#anim").change(function() { $('#datepicker').datepicker('option', {showAnim: $(this).val()}); }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker" size="30"/></p> + +<p>Animations:<br /> + <select id="anim"> + <option value="show">Show (default)</option> + <option value="slideDown">Slide down</option> + <option value="fadeIn">Fade in</option> + <!-- <option value="blind">Blind (UI Effect)</option> + <option value="bounce">Bounce (UI Effect)</option> + <option value="clip">Clip (UI Effect)</option> + <option value="drop">Drop (UI Effect)</option> + <option value="fold">Fold (UI Effect)</option> + <option value="slide">Slide (UI Effect)</option> --> + <option value="">None</option> + </select> +</p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Use different animations when opening or closing the datepicker. Choose an animation from the dropdown, then click on the input to see its effect. You can use one of the three standard animations or any of the UI Effects.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/buttonbar.html b/fannie/src/jquery/development-bundle/demos/datepicker/buttonbar.html new file mode 100644 index 000000000..6cd4dbedc --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/buttonbar.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Display button bar</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $('#datepicker').datepicker({ + showButtonPanel: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Display a button for selecting Today's date and a Done button for closing the calendar with the boolean <code>showButtonPanel</code> option. Each button is enabled by default when the bar is displayed, but can be turned off with additional options. Button text is customizable.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/date-formats.html b/fannie/src/jquery/development-bundle/demos/datepicker/date-formats.html new file mode 100644 index 000000000..435ef7096 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/date-formats.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Format date</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker(); + $("#format").change(function() { $('#datepicker').datepicker('option', {dateFormat: $(this).val()}); }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker" size="30"/></p> + +<p>Format options:<br /> + <select id="format"> + <option value="mm/dd/yy">Default - mm/dd/yy</option> + <option value="yy-mm-dd">ISO 8601 - yy-mm-dd</option> + <option value="d M, y">Short - d M, y</option> + <option value="d MM, y">Medium - d MM, y</option> + <option value="DD, d MM, yy">Full - DD, d MM, yy</option> + <option value="'day' d 'of' MM 'in the year' yy">With text - 'day' d 'of' MM 'in the year' yy</option> + </select> +</p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Display date feedback in a variety of ways. Choose a date format from the dropdown, then click on the input and select a date to see it in that format.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/default.html b/fannie/src/jquery/development-bundle/demos/datepicker/default.html new file mode 100644 index 000000000..4ab50e174 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/default.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>The datepicker is tied to a standard form input field. Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay. Choose a date, click elsewhere on the page (blur the input), or hit the Esc key to close. If a date is chosen, feedback is shown as the input's value.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/dropdown-month-year.html b/fannie/src/jquery/development-bundle/demos/datepicker/dropdown-month-year.html new file mode 100644 index 000000000..c31d8ba85 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/dropdown-month-year.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Display month &amp; year menus</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $('#datepicker').datepicker({ + changeMonth: true, + changeYear: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Show month and year dropdowns in place of the static month/year header to facilitate navigation through large timeframes. Add the boolean <code>changeMonth</code> and <code>changeYear</code> options.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/event-search.html b/fannie/src/jquery/development-bundle/demos/datepicker/event-search.html new file mode 100644 index 000000000..c87ae17a4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/event-search.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Display multiple months</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + var dates = $('#from, #to').datepicker({ + defaultDate: "+1w", + changeMonth: true, + numberOfMonths: 3, + onSelect: function(selectedDate) { + var option = this.id == "from" ? "minDate" : "maxDate"; + var instance = $(this).data("datepicker"); + var date = $.datepicker.parseDate(instance.settings.dateFormat || $.datepicker._defaults.dateFormat, selectedDate, instance.settings); + dates.not(this).datepicker("option", option, date); + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<label for="from">From</label> +<input type="text" id="from" name="from"/> +<label for="to">to</label> +<input type="text" id="to" name="to"/> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Select the date range to search for.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/icon-trigger.html b/fannie/src/jquery/development-bundle/demos/datepicker/icon-trigger.html new file mode 100644 index 000000000..6da3a7792 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/icon-trigger.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Icon trigger</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker({ + showOn: 'button', + buttonImage: 'images/calendar.gif', + buttonImageOnly: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the icon next to the input field to show the datepicker. Set the datepicker to open on focus (default behavior), on icon click, or both.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/images/calendar.gif b/fannie/src/jquery/development-bundle/demos/datepicker/images/calendar.gif new file mode 100644 index 000000000..d0abaa7c0 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/datepicker/images/calendar.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/index.html b/fannie/src/jquery/development-bundle/demos/datepicker/index.html new file mode 100644 index 000000000..5749ae757 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/index.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="date-formats.html">Format date</a></li> + <li><a href="min-max.html">Restrict date range</a></li> + <li><a href="localization.html">Localize calendar</a></li> + <li><a href="alt-field.html">Populate alternate field</a></li> + <li><a href="inline.html">Display inline</a></li> + <li><a href="buttonbar.html">Display button bar</a></li> + <li><a href="dropdown-month-year.html">Display month &amp; year menus</a></li> + <li><a href="other-months.html">Dates in other months</a></li> + <li><a href="show-week.html">Show week of the year</a></li> + <li><a href="multiple-calendars.html">Display multiple months</a></li> + <li><a href="icon-trigger.html">Icon trigger</a></li> + <li><a href="animation.html">Animations</a></li> + <li><a href="event-search.html">Event Search</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/inline.html b/fannie/src/jquery/development-bundle/demos/datepicker/inline.html new file mode 100644 index 000000000..bf21fc927 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/inline.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Display inline</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker(); + }); + </script> +</head> +<body> + +<div class="demo"> + +Date: <div id="datepicker"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Display the datepicker embedded in the page instead of in an overlay. Simply call .datepicker() on a div instead of an input.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/localization.html b/fannie/src/jquery/development-bundle/demos/datepicker/localization.html new file mode 100644 index 000000000..079ae0537 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/localization.html @@ -0,0 +1,143 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Localize calendar</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-af.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ar.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-az.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-bg.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-bs.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ca.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-cs.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-da.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-de.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-el.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-en-GB.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-eo.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-es.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-et.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-eu.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-fa.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-fi.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-fo.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-fr.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-fr-CH.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-he.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-hr.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-hu.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-hy.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-id.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-is.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-it.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ja.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ko.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-lt.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-lv.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ms.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-nl.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-no.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-pl.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-pt-BR.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ro.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ru.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-sk.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-sl.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-sq.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-sr.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-sr-SR.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-sv.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-ta.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-th.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-tr.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-uk.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-vi.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-zh-CN.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-zh-HK.js"></script> + <script type="text/javascript" src="../../ui/i18n/jquery.ui.datepicker-zh-TW.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $.datepicker.setDefaults($.datepicker.regional['']); + $("#datepicker").datepicker($.datepicker.regional['fr']); + $("#locale").change(function() { + $('#datepicker').datepicker('option', $.datepicker.regional[$(this).val()]); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"/>&nbsp; + <select id="locale"> + <option value="af">Afrikaans</option> + <option value="sq">Albanian (Gjuha shqipe)</option> + <option value="ar">Arabic (&#8235;(&#1604;&#1593;&#1585;&#1576;&#1610;</option> + <option value="hy">Armenian (&#1344;&#1377;&#1397;&#1381;&#1408;&#1381;&#1398;)</option> + <option value="az">Azerbaijani (Az&#601;rbaycan dili)</option> + <option value="eu">Basque (Euskara)</option> + <option value="bs">Bosnian (Bosanski)</option> + <option value="bg">Bulgarian (&#1073;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080; &#1077;&#1079;&#1080;&#1082;)</option> + <option value="ca">Catalan (Catal&agrave;)</option> + <option value="zh-HK">Chinese Hong Kong (&#32321;&#39636;&#20013;&#25991;)</option> + <option value="zh-CN">Chinese Simplified (&#31616;&#20307;&#20013;&#25991;)</option> + <option value="zh-TW">Chinese Traditional (&#32321;&#39636;&#20013;&#25991;)</option> + <option value="hr">Croatian (Hrvatski jezik)</option> + <option value="cs">Czech (Ce&ouml;tina)</option> + <option value="da">Danish (Dansk)</option> + <option value="nl">Dutch (Nederlands)</option> + <option value="en-GB">English/UK</option> + <option value="eo">Esperanto</option> + <option value="et">Estonian (eesti keel)</option> + <option value="fo">Faroese (f&oslash;royskt)</option> + <option value="fa">Farsi/Persian (&#8235;(&#1601;&#1575;&#1585;&#1587;&#1740;</option> + <option value="fi">Finnish (suomi)</option> + <option value="fr" selected="selected">French (Fran&ccedil;ais)</option> + <option value="fr-CH">French/Swiss (Fran&ccedil;ais de Suisse)</option> + <option value="de">German (Deutsch)</option> + <option value="el">Greek (&#917;&#955;&#955;&#951;&#957;&#953;&#954;&#940;)</option> + <option value="he">Hebrew (&#8235;(&#1506;&#1489;&#1512;&#1497;&#1514;</option> + <option value="hu">Hungarian (Magyar)</option> + <option value="is">Icelandic (&Otilde;slenska)</option> + <option value="id">Indonesian (Bahasa Indonesia)</option> + <option value="it">Italian (Italiano)</option> + <option value="ja">Japanese (&#26085;&#26412;&#35486;)</option> + <option value="ko">Korean (&#54620;&#44397;&#50612;)</option> + <option value="lv">Latvian (Latvie&ouml;u Valoda)</option> + <option value="lt">Lithuanian (lietuviu kalba)</option> + <option value="ms">Malaysian (Bahasa Malaysia)</option> + <option value="no">Norwegian (Norsk)</option> + <option value="pl">Polish (Polski)</option> + <option value="pt-BR">Portuguese/Brazilian (Portugu&ecirc;s)</option> + <option value="ro">Romanian (Rom&acirc;n&#259;)</option> + <option value="ru">Russian (&#1056;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;)</option> + <option value="sr">Serbian (&#1089;&#1088;&#1087;&#1089;&#1082;&#1080; &#1112;&#1077;&#1079;&#1080;&#1082;)</option> + <option value="sr-SR">Serbian (srpski jezik)</option> + <option value="sk">Slovak (Slovencina)</option> + <option value="sl">Slovenian (Slovenski Jezik)</option> + <option value="es">Spanish (Espa&ntilde;ol)</option> + <option value="sv">Swedish (Svenska)</option> + <option value="ta">Tamil (&#2980;&#2990;&#3007;&#2996;&#3021;)</option> + <option value="th">Thai (&#3616;&#3634;&#3625;&#3634;&#3652;&#3607;&#3618;)</option> + <option value="tr">Turkish (T&uuml;rk&ccedil;e)</option> + <option value="uk">Ukranian (&#1059;&#1082;&#1088;&#1072;&#1111;&#1085;&#1089;&#1100;&#1082;&#1072;)</option> + <option value="vi">Vietnamese (Ti&#7871;ng Vi&#7879;t)</option> + </select></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Localize the datepicker calendar language and format (English / Western formatting is the default). The datepicker includes built-in support for languages that read right-to-left, such as Arabic and Hebrew.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/min-max.html b/fannie/src/jquery/development-bundle/demos/datepicker/min-max.html new file mode 100644 index 000000000..7573e6926 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/min-max.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Restrict date range</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker({minDate: -20, maxDate: '+1M +10D'}); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Restrict the range of selectable dates with the <code>minDate</code> and <code>maxDate</code> options. Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)), as a numeric offset from today (-20), or as a string of periods and units ('+1M +10D'). For the last, use 'D' for days, 'W' for weeks, 'M' for months, or 'Y' for years.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/multiple-calendars.html b/fannie/src/jquery/development-bundle/demos/datepicker/multiple-calendars.html new file mode 100644 index 000000000..8051ca524 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/multiple-calendars.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Display multiple months</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $('#datepicker').datepicker({ + numberOfMonths: 3, + showButtonPanel: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Set the <code>numberOfMonths</code> option to an integer of 2 or more to show multiple months in a single datepicker.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/other-months.html b/fannie/src/jquery/development-bundle/demos/datepicker/other-months.html new file mode 100644 index 000000000..1c0b65559 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/other-months.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Dates in other months</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker({showOtherMonths: true, selectOtherMonths: true}); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>The datepicker can show dates that come from other than the main month + being displayed. These other dates can also be made selectable.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/datepicker/show-week.html b/fannie/src/jquery/development-bundle/demos/datepicker/show-week.html new file mode 100644 index 000000000..f6015a2af --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/datepicker/show-week.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Datepicker - Show week of the year</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.datepicker.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#datepicker").datepicker({showWeek: true, firstDay: 1}); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p>Date: <input type="text" id="datepicker"></p> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>The datepicker can show the week of the year. The default calculation follows + the ISO 8601 definition: the week starts on Monday, the first week of the year + contains the first Thursday of the year. This means that some days from one + year may be placed into weeks 'belonging' to another year.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/demos.css b/fannie/src/jquery/development-bundle/demos/demos.css new file mode 100644 index 000000000..2d2ce1fc8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/demos.css @@ -0,0 +1,334 @@ +body { + font-size: 62.5%; +} + +table { + font-size: 1em; +} + +/* Site + -------------------------------- */ + +body { + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; +} + +/* Layout + -------------------------------- */ + +.layout-grid { + width: 960px; +} + +.layout-grid td { + vertical-align: top; +} + +.layout-grid td.left-nav { + width: 140px; +} + +.layout-grid td.normal { + border-left: 1px solid #eee; + padding: 20px 24px; + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; +} + +.layout-grid td.demos { + background: url('/images/demos_bg.jpg') no-repeat; + height: 337px; + overflow: hidden; +} + +/* Normal + -------------------------------- */ + +.normal h3, +.normal h4 { + margin: 0; + font-weight: normal; +} + +.normal h3 { + padding: 0 0 9px; + font-size: 1.8em; +} + +.normal h4 { + padding-bottom: 21px; + border-bottom: 1px dashed #999; + font-size: 1.2em; + font-weight: bold; +} + +.normal p { + font-size: 1.2em; +} + +/* Demos */ + +.demos-nav, .demos-nav dt, .demos-nav dd, .demos-nav ul, .demos-nav li { + margin: 0; + padding: 0 +} + +.demos-nav { + float: left; + width: 170px; + font-size: 1.3em; +} + +.demos-nav dt, +.demos-nav h4 { + margin: 0; + padding: 0; + font: normal 1.1em "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + color: #e87b10; +} + +.demos-nav dt, +.demos-nav h4 { + margin-top: 1.5em; + margin-bottom: 0; + padding-left: 8px; + padding-bottom:5px; + line-height: 1.2em; + border-bottom: 1px solid #F4F4F4; +} + +.demos-nav dd a, +.demos-nav li a { + border-bottom: 1px solid #F4F4F4; + display:block; + padding: 4px 3px 4px 8px; + font-size: 90%; + text-decoration: none; + color: #555 ; + margin:2px 0; + height:13px; +} + +.demos-nav dd a:hover, +.demos-nav dd a:focus, +.demos-nav dd a:hover, +.demos-nav dd a:focus { + background: #f3f3f3; + color:#000; + -moz-border-radius: 5px; -webkit-border-radius: 5px; +} + .demos-nav dd a.selected { + background: #555; + color:#ffffff; + -moz-border-radius: 5px; -webkit-border-radius: 5px; +} + + +/* new styles for demo pages, added by Filament 12.29.08 +eventually we should convert the font sizes to ems -- using px for now to minimize style conflicts +*/ + +.normal h3.demo-header { font-size:32px; padding:0 0 5px; border-bottom:1px solid #eee; text-transform: capitalize; } +.normal h4.demo-subheader { font-size:10px; text-transform: uppercase; color:#999; padding:8px 0 3px; border:0; margin:0; } +.normal a:link, +.normal a:visited { color:#1b75bb; text-decoration:none; } +.normal a:hover, +.normal a:active { color:#0b559b; } + +#demo-config { padding:20px 0 0; } + +#demo-frame { float:left; width:540px; height:380px; border:1px solid #ddd; overflow: auto; position: relative; } +#demo-frame h3, #demo-frame h4 { padding: 0; font-weight: bold; font-size: 1em; } + +#demo-config-menu { float:right; width:180px; } +#demo-config-menu h4 { font-size:13px; color:#666; font-weight:normal; border:0; padding-left:18px; } + +#demo-config-menu ul { list-style: none; padding: 0; margin: 0; } + +#demo-config-menu li { font-size:12px; padding:0 0 0 10px; margin:3px 0; zoom: 1; } + +#demo-config-menu li a:link, +#demo-config-menu li a:visited { display:block; padding:1px 8px 4px; border-bottom:1px dotted #b3b3b3; } +* html #demo-config-menu li a:link, +* html #demo-config-menu li a:visited { padding:1px 8px 2px; } +#demo-config-menu li a:hover, +#demo-config-menu li a:active { background-color:#f6f6f6; } + +#demo-config-menu li.demo-config-on { background: url(images/demo-config-on-tile.gif) repeat-x left center; } + +#demo-config-menu li.demo-config-on a:link, +#demo-config-menu li.demo-config-on a:visited, +#demo-config-menu li.demo-config-on a:hover, +#demo-config-menu li.demo-config-on a:active { background: url(images/demo-config-on.gif) no-repeat left; padding-left:18px; color:#fff; border:0; margin-left:-10px; margin-top: 0px; margin-bottom: 0px; } + +#demo-source, #demo-notes { + clear: both; + padding: 20px 0 0; + font-size: 1.3em; +} + +#demo-notes { width:520px; color:#333; font-size: 1em; } +#demo-notes p code, .demo-description p code { padding: 0; font-weight: bold; } +#demo-source pre, #demo-source code { padding: 0; } +code, pre { padding:8px 0 8px 20px ; font-size: 1.2em; line-height:130%; } + +#demo-source a:link, +#demo-source a:visited, +#demo-source a:hover, +#demo-source a:active { font-size:12px; padding-left:13px; background-position: left center; background-repeat: no-repeat; } + +#demo-source a.source-open:link, +#demo-source a.source-open:visited, +#demo-source a.source-open:hover, +#demo-source a.source-open:active { background-image: url(images/demo-spindown-open.gif); } + +#demo-source a.source-closed:link, +#demo-source a.source-closed:visited, +#demo-source a.source-closed:hover, +#demo-source a.source-closed:active { background-image: url(images/demo-spindown-closed.gif); } + +div.demo { + padding:12px; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; +} + +div.demo h3.docs { clear:left; font-size:12px; font-weight:normal; padding:0 0 1em; margin:0; } + +div.demo-description { + clear:both; + padding:12px; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; + font-size: 1.3em; + line-height: 1.4em; +} + +.ui-draggable, .ui-droppable { + background-position: top left; +} + +.left-nav .demos-nav { + padding-right: 10px; +} + +#demo-link { font-size:11px; padding-top: 6px; clear: both; overflow: hidden; } +#demo-link a span.ui-icon { float:left; margin-right:3px; } + +/* Component containers +----------------------------------*/ +#widget-docs .ui-widget { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; } +#widget-docs .ui-widget input, #widget-docs .ui-widget select, #widget-docs .ui-widget textarea, #widget-docs .ui-widget button { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; } +#widget-docs .ui-widget-header { border: 1px solid #ffffff; background: #464646 url(images/464646_40x100_textures_01_flat_100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +#widget-docs .ui-widget-header a { color: #ffffff; } +#widget-docs .ui-widget-content { border: 1px solid #ffffff; background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 50% 50% repeat-x; color: #222222; } +#widget-docs .ui-widget-content a { color: #222222; } + +/* Interaction states +----------------------------------*/ +#widget-docs .ui-state-default, #widget-docs .ui-widget-content #widget-docs .ui-state-default { border: 1px solid #666666; background: #555555 url(images/555555_40x100_textures_03_highlight_soft_75.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +#widget-docs .ui-state-default a { color: #ffffff; text-decoration: none; outline: none; } +#widget-docs .ui-state-hover, #widget-docs .ui-widget-content #widget-docs .ui-state-hover, #widget-docs .ui-state-focus, #widget-docs .ui-widget-content #widget-docs .ui-state-focus { border: 1px solid #666666; background: #444444 url(images/444444_40x100_textures_03_highlight_soft_60.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +#widget-docs .ui-state-hover a { color: #ffffff; text-decoration: none; outline: none; } +#widget-docs .ui-state-active, #widget-docs .ui-widget-content #widget-docs .ui-state-active { border: 1px solid #666666; background: #ffffff url(images/ffffff_40x100_textures_01_flat_65.png) 50% 50% repeat-x; font-weight: normal; color: #F6921E; outline: none; } +#widget-docs .ui-state-active a { color: #F6921E; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +#widget-docs .ui-state-highlight, #widget-docs .ui-widget-content #widget-docs .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/fbf9ee_40x100_textures_02_glass_55.png) 50% 50% repeat-x; color: #363636; } +#widget-docs .ui-state-error, #widget-docs .ui-widget-content #widget-docs .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/fef1ec_40x100_textures_05_inset_soft_95.png) 50% bottom repeat-x; color: #cd0a0a; } +#widget-docs .ui-state-error-text, #widget-docs .ui-widget-content #widget-docs .ui-state-error-text { color: #cd0a0a; } +#widget-docs .ui-state-disabled, #widget-docs .ui-widget-content #widget-docs .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +#widget-docs .ui-priority-primary, #widget-docs .ui-widget-content #widget-docs .ui-priority-primary { font-weight: bold; } +#widget-docs .ui-priority-secondary, #widget-docs .ui-widget-content #widget-docs .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +#demo-frame-wrapper .ui-icon, #widget-docs .ui-icon { width: 16px; height: 16px; background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-widget-content .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-widget-header .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-state-default .ui-icon { background-image: url(images/888888_256x240_icons_icons.png); } +#widget-docs .ui-state-hover .ui-icon, #widget-docs .ui-state-focus .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); } +#widget-docs .ui-state-active .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); } +#widget-docs .ui-state-highlight .ui-icon {background-image: url(images/2e83ff_256x240_icons_icons.png); } +#widget-docs .ui-state-error .ui-icon, #widget-docs .ui-state-error-text .ui-icon {background-image: url(images/cd0a0a_256x240_icons_icons.png); } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +#widget-docs .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; } +#widget-docs .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +#widget-docs .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +#widget-docs .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +#widget-docs .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +#widget-docs .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; } + +/* Overlays */ +#widget-docs .ui-widget-overlay { background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +#widget-docs .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; } + +/* +----------------------------------*/ + +#widget-docs { margin:20px 0 0; border: none; } + +#widget-docs h2, #widget-docs h3, #widget-docs h4, #widget-docs p, #widget-docs ul, #widget-docs code { margin:0; padding:0; } +#widget-docs code { display:block; color:#444; font-size:.9em; margin:0 0 1em; } +#widget-docs code strong { color:#000; } +#widget-docs p { margin:0 3em 1.2em 0; } +#widget-docs p.intro { font-size:13px; color:#666; line-height:1.3; } +#widget-docs ul { list-style-type: none; } + +#widget-docs h2 { font-size:16px; margin:1.2em 0 .5em; } +#widget-docs h3 { font-size:14px; color:#e6820E; margin:1.5em 0 .5em; } +.normal #widget-docs h4 { font-size:12px; color:#000; border:0; margin:0 0 .5em; } + +#docs-overview-main { width:400px; } +#docs-overview-sidebar { float:right; width:200px; } +#docs-overview-sidebar a span { color:#666; } +#widget-docs #docs-overview-main p { margin-right:0; } +#widget-docs #docs-overview-sidebar h4 { padding-left:0; } + +.docs-list-header { float:left; width:100%; margin:10px 0 0; border-bottom:1px solid #eee; } +#widget-docs .docs-list-header h2 { float:left; margin:0; } +#widget-docs .docs-list-header p { float:right; margin:5px 0; font-size:11px; } + +.docs-list { float:left; width:100%; padding:0 0 10px; } +.docs-list .param-header { float:left; clear:left; width:100%; padding:8px 0; border-top:1px solid #eee; } +#widget-docs .param-header h3, #widget-docs .param-header p { margin:0; float:left; } +#widget-docs .param-header h3 { width:50%; } +#widget-docs .param-header h3 span { background: url(images/demo-spindown-closed.gif) no-repeat left; padding-left:13px; } +#widget-docs .param-open .param-header h3 span { background: url(images/demo-spindown-open.gif) no-repeat left; } +#widget-docs .param-header p { width:24%; } +#widget-docs .param-header p.param-type span { background: url(images/icon-docs-info.gif) no-repeat left; cursor:pointer; border-bottom:1px dashed #ccc; padding-left:15px; } + +.param-details { padding-left:13px; } +.param-args { margin:0 0 1.5em; border-top:1px dotted #ccc;} +.param-args td { padding:3px 30px 3px 5px; border-bottom:1px dotted #ccc; } + + +/* overrides for ui-tab styles */ +#widget-docs ul.ui-tabs-nav { padding:0 0 0 8px; } +#widget-docs .ui-tabs-nav li { margin:5px 5px 0 0; } + +#widget-docs .ui-tabs-nav li a:link, +#widget-docs .ui-tabs-nav li a:visited, +#widget-docs .ui-tabs-nav li a:hover, +#widget-docs .ui-tabs-nav li a:active { font-size:14px; padding:4px 1.2em 3px; color:#fff; } + +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:link, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:visited, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:hover, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:active { color:#e6820E; } + +#widget-docs .ui-tabs-panel { padding:20px 9px; font-size:12px; line-height:1.4; color:#000; } + +#widget-docs .ui-widget-content a:link, +#widget-docs .ui-widget-content a:visited { color:#1b75bb; text-decoration:none; } +#widget-docs .ui-widget-content a:hover, +#widget-docs .ui-widget-content a:active { color:#0b559b; } + diff --git a/fannie/src/jquery/development-bundle/demos/dialog/animated.html b/fannie/src/jquery/development-bundle/demos/dialog/animated.html new file mode 100644 index 000000000..26f298acc --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/animated.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog - Animation</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.bgiframe-2.1.1.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.blind.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.explode.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + // increase the default animation speed to exaggerate the effect + $.fx.speeds._default = 1000; + $(function() { + $('#dialog').dialog({ + autoOpen: false, + show: 'blind', + hide: 'explode' + }); + + $('#opener').click(function() { + $('#dialog').dialog('open'); + return false; + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="dialog" title="Basic dialog"> + <p>This is an animated dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p> +</div> + +<button id="opener">Open Dialog</button> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Dialogs may be animated by specifying an effect for the show and/or hide properties. You must include the individual effects file for any effects you would like to use.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/dialog/default.html b/fannie/src/jquery/development-bundle/demos/dialog/default.html new file mode 100644 index 000000000..a0d4481c7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/default.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.bgiframe-2.1.1.js.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#dialog").dialog(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="dialog" title="Basic dialog"> + <p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p> +</div> + +<!-- Sample page content to illustrate the layering of the dialog --> +<div class="hiddenInViewSource" style="padding:20px;"> +<p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p> +<form> + <input value="text input" /><br /> + <input type="checkbox" />checkbox<br /> + <input type="radio" />radio<br /> + <select> + <option>select</option> + </select><br /><br /> + <textarea>textarea</textarea><br /> +</form> +</div><!-- End sample page content --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>The basic dialog window is an overlay positioned within the viewport and is protected from page content (like select elements) shining through with an iframe. It has a title bar and a content area, and can be moved, resized and closed with the 'x' icon by default.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/dialog/index.html b/fannie/src/jquery/development-bundle/demos/dialog/index.html new file mode 100644 index 000000000..45d4a9f43 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/index.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="animated.html">Animated dialog</a></li> + <li><a href="modal.html">Modal dialog</a></li> + <li><a href="modal-message.html">Modal message</a></li> + <li><a href="modal-confirmation.html">Modal confirmation</a></li> + <li><a href="modal-form.html">Modal form</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/dialog/modal-confirmation.html b/fannie/src/jquery/development-bundle/demos/dialog/modal-confirmation.html new file mode 100644 index 000000000..4affb5964 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/modal-confirmation.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog - Modal confirmation</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.bgiframe-2.1.1.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore! + $("#dialog").dialog("destroy"); + + $("#dialog-confirm").dialog({ + resizable: false, + height:140, + modal: true, + buttons: { + 'Delete all items': function() { + $(this).dialog('close'); + }, + Cancel: function() { + $(this).dialog('close'); + } + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="dialog-confirm" title="Empty the recycle bin?"> + <p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>These items will be permanently deleted and cannot be recovered. Are you sure?</p> +</div> + +<!-- Sample page content to illustrate the layering of the dialog --> +<div class="hiddenInViewSource" style="padding:20px;"> + <p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p> + <form> + <input value="text input" /><br /> + <input type="checkbox" />checkbox<br /> + <input type="radio" />radio<br /> + <select> + <option>select</option> + </select><br /><br /> + <textarea>textarea</textarea><br /> + </form> +</div><!-- End sample page content --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Confirm an action that may be destructive or important. Set the <code>modal</code> option to true, and specify primary and secondary user actions with the <code>buttons</code> option.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/dialog/modal-form.html b/fannie/src/jquery/development-bundle/demos/dialog/modal-form.html new file mode 100644 index 000000000..592b4ab3c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/modal-form.html @@ -0,0 +1,177 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog - Modal form</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.bgiframe-2.1.1.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + body { font-size: 62.5%; } + label, input { display:block; } + input.text { margin-bottom:12px; width:95%; padding: .4em; } + fieldset { padding:0; border:0; margin-top:25px; } + h1 { font-size: 1.2em; margin: .6em 0; } + div#users-contain { width: 350px; margin: 20px 0; } + div#users-contain table { margin: 1em 0; border-collapse: collapse; width: 100%; } + div#users-contain table td, div#users-contain table th { border: 1px solid #eee; padding: .6em 10px; text-align: left; } + .ui-dialog .ui-state-error { padding: .3em; } + .validateTips { border: 1px solid transparent; padding: 0.3em; } + + </style> + <script type="text/javascript"> + $(function() { + // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore! + $("#dialog").dialog("destroy"); + + var name = $("#name"), + email = $("#email"), + password = $("#password"), + allFields = $([]).add(name).add(email).add(password), + tips = $(".validateTips"); + + function updateTips(t) { + tips + .text(t) + .addClass('ui-state-highlight'); + setTimeout(function() { + tips.removeClass('ui-state-highlight', 1500); + }, 500); + } + + function checkLength(o,n,min,max) { + + if ( o.val().length > max || o.val().length < min ) { + o.addClass('ui-state-error'); + updateTips("Length of " + n + " must be between "+min+" and "+max+"."); + return false; + } else { + return true; + } + + } + + function checkRegexp(o,regexp,n) { + + if ( !( regexp.test( o.val() ) ) ) { + o.addClass('ui-state-error'); + updateTips(n); + return false; + } else { + return true; + } + + } + + $("#dialog-form").dialog({ + autoOpen: false, + height: 300, + width: 350, + modal: true, + buttons: { + 'Create an account': function() { + var bValid = true; + allFields.removeClass('ui-state-error'); + + bValid = bValid && checkLength(name,"username",3,16); + bValid = bValid && checkLength(email,"email",6,80); + bValid = bValid && checkLength(password,"password",5,16); + + bValid = bValid && checkRegexp(name,/^[a-z]([0-9a-z_])+$/i,"Username may consist of a-z, 0-9, underscores, begin with a letter."); + // From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ + bValid = bValid && checkRegexp(email,/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i,"eg. ui@jquery.com"); + bValid = bValid && checkRegexp(password,/^([0-9a-zA-Z])+$/,"Password field only allow : a-z 0-9"); + + if (bValid) { + $('#users tbody').append('<tr>' + + '<td>' + name.val() + '</td>' + + '<td>' + email.val() + '</td>' + + '<td>' + password.val() + '</td>' + + '</tr>'); + $(this).dialog('close'); + } + }, + Cancel: function() { + $(this).dialog('close'); + } + }, + close: function() { + allFields.val('').removeClass('ui-state-error'); + } + }); + + + + $('#create-user') + .button() + .click(function() { + $('#dialog-form').dialog('open'); + }); + + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="dialog-form" title="Create new user"> + <p class="validateTips">All form fields are required.</p> + + <form> + <fieldset> + <label for="name">Name</label> + <input type="text" name="name" id="name" class="text ui-widget-content ui-corner-all" /> + <label for="email">Email</label> + <input type="text" name="email" id="email" value="" class="text ui-widget-content ui-corner-all" /> + <label for="password">Password</label> + <input type="password" name="password" id="password" value="" class="text ui-widget-content ui-corner-all" /> + </fieldset> + </form> +</div> + + +<div id="users-contain" class="ui-widget"> + + <h1>Existing Users:</h1> + + + <table id="users" class="ui-widget ui-widget-content"> + <thead> + <tr class="ui-widget-header "> + <th>Name</th> + <th>Email</th> + <th>Password</th> + </tr> + </thead> + <tbody> + <tr> + <td>John Doe</td> + <td>john.doe@example.com</td> + <td>johndoe1</td> + </tr> + </tbody> + </table> +</div> +<button id="create-user">Create new user</button> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Use a modal dialog to require that the user enter data during a multi-step process. Embed form markup in the content area, set the <code>modal</code> option to true, and specify primary and secondary user actions with the <code>buttons</code> option.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/dialog/modal-message.html b/fannie/src/jquery/development-bundle/demos/dialog/modal-message.html new file mode 100644 index 000000000..a0ab01b21 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/modal-message.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog - Modal message</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.bgiframe-2.1.1.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore! + $("#dialog").dialog("destroy"); + + $("#dialog-message").dialog({ + modal: true, + buttons: { + Ok: function() { + $(this).dialog('close'); + } + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="dialog-message" title="Download complete"> + <p> + <span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span> + Your files have downloaded successfully into the My Downloads folder. + </p> + <p> + Currently using <b>36% of your storage space</b>. + </p> +</div> + +<!-- Sample page content to illustrate the layering of the dialog --> +<div class="hiddenInViewSource" style="padding:20px;"> + <p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p> + <form> + <input value="text input" /><br /> + <input type="checkbox" />checkbox<br /> + <input type="radio" />radio<br /> + <select> + <option>select</option> + </select><br /><br /> + <textarea>textarea</textarea><br /> + </form> +</div><!-- End sample page content --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Use a modal dialog to explicitly acknowledge information or an action before continuing their work. Set the <code>modal</code> option to true, and specify a primary action (Ok) with the <code>buttons</code> option.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/dialog/modal.html b/fannie/src/jquery/development-bundle/demos/dialog/modal.html new file mode 100644 index 000000000..1eb69f028 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/dialog/modal.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Dialog - Basic modal</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.bgiframe-2.1.1.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore! + $("#dialog").dialog("destroy"); + + $("#dialog-modal").dialog({ + height: 140, + modal: true + }); + }); + </script> +</head> +<body> + + +<div class="demo"> + +<div id="dialog-modal" title="Basic modal dialog"> + <p>Adding the modal overlay screen makes the dialog look more prominent because it dims out the page content.</p> +</div> + +<!-- Sample page content to illustrate the layering of the dialog --> +<div class="hiddenInViewSource" style="padding:20px;"> + <p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p> + <form> + <input value="text input" /><br /> + <input type="checkbox" />checkbox<br /> + <input type="radio" />radio<br /> + <select> + <option>select</option> + </select><br /><br /> + <textarea>textarea</textarea><br /> + </form> +</div><!-- End sample page content --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>A modal dialog prevents the user from interacting with the rest of the page until it is closed. To add a semi-transparent layer that dims out the page content behind the dialog, set the background color and opacity of the <code>overlay</code> option.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/constrain-movement.html b/fannie/src/jquery/development-bundle/demos/draggable/constrain-movement.html new file mode 100644 index 000000000..3bb9075e4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/constrain-movement.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Constrain movement</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .draggable { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + #draggable, #draggable2 { margin-bottom:20px; } + #draggable { cursor: n-resize; } + #draggable2 { cursor: e-resize; } + #containment-wrapper { width: 95%; height:150px; border:2px solid #ccc; padding: 10px;} + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ axis: 'y' }); + $("#draggable2").draggable({ axis: 'x' }); + + $("#draggable3").draggable({ containment: '#containment-wrapper', scroll: false }); + $("#draggable4").draggable({ containment: '#demo-frame' }); + $("#draggable5").draggable({ containment: 'parent' }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<h3 class="docs">Constrain movement along an axis:</h3> + +<div id="draggable" class="draggable ui-widget-content"> + <p>I can be dragged only vertically</p> +</div> + +<div id="draggable2" class="draggable ui-widget-content"> + <p>I can be dragged only horizontally</p> +</div> + +<h3 class="docs">Or to within another DOM element:</h3> +<div id="containment-wrapper"> +<div id="draggable3" class="draggable ui-widget-content"> + <p>I'm contained within the box</p> +</div> + +<div id="draggable4" class="draggable ui-widget-content"> + <p>I'm contained within the box's parent</p> +</div> + +<div class="draggable ui-widget-content"> + <p id="draggable5" class="ui-widget-header">I'm contained within my parent</p> +</div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Constrain the movement of each draggable by defining the boundaries of the draggable area. Set the <code>axis</code> option to limit the draggable's path to the x- or y-axis, or use the <code>containment</code> option to specify a parent DOM element or a jQuery selector, like 'document.' +</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/cursor-style.html b/fannie/src/jquery/development-bundle/demos/draggable/cursor-style.html new file mode 100644 index 000000000..3263029b0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/cursor-style.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Cursor style</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ cursorAt: { cursor: 'move', top: 56, left: 56 } }); + $("#draggable2").draggable({ cursorAt: { cursor: 'crosshair', top: -5, left: -5 } }); + $("#draggable3").draggable({ cursorAt: { bottom: 0 } }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>I will always stick to the center (relative to the mouse)</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>My cursor is at left -5 and top -5</p> +</div> + +<div id="draggable3" class="ui-widget-content"> + <p>My cursor position is only controlled for the 'bottom' value</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Position the cursor while dragging the object. By default the cursor appears in the center of the dragged object; use the <code>cursorAt</code> option to specify another location relative to the draggable (specify a pixel value from the top, right, bottom, and/or left). Customize the cursor's appearance by supplying the <code>cursor</code> option with a valid CSS cursor value: default, move, pointer, crosshair, etc. +</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/default.html b/fannie/src/jquery/development-bundle/demos/draggable/default.html new file mode 100644 index 000000000..b50c54ab1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/default.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable { width: 150px; height: 150px; padding: 0.5em; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>Drag me around</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Enable draggable functionality on any DOM element. Move the draggable object by clicking on it with the mouse and dragging it anywhere within the viewport. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/delay-start.html b/fannie/src/jquery/development-bundle/demos/draggable/delay-start.html new file mode 100644 index 000000000..c997e28e2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/delay-start.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Delay start</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2 { width: 120px; height: 120px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ distance: 20 }); + $("#draggable2").draggable({ delay: 1000 }); + $(".ui-draggable").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>Only if you drag me by 20 pixels, the dragging will start</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>Regardless of the distance, you have to drag and wait for 1000ms before dragging starts</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Delay the start of dragging for a number of milliseconds with the <code>delay</code> option; prevent dragging until the cursor is held down and dragged a specifed number of pixels with the <code>distance</code> option. +</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/events.html b/fannie/src/jquery/development-bundle/demos/draggable/events.html new file mode 100644 index 000000000..194598ffb --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/events.html @@ -0,0 +1,77 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Events</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable { width: 16em; padding: 0 1em; } + #draggable ul li { margin: 1em 0; padding: 0.5em 0; } * html #draggable ul li { height: 1%; } + #draggable ul li span.ui-icon { float: left; } + #draggable ul li span.count { font-weight: bold; } + </style> + <script type="text/javascript"> + $(function() { + var $start_counter = $('#event-start'), $drag_counter = $('#event-drag'), $stop_counter = $('#event-stop'); + var counts = [0,0,0]; + + $("#draggable").draggable({ + start: function() { + counts[0]++; + updateCounterStatus($start_counter,counts[0]); + }, + drag: function() { + counts[1]++; + updateCounterStatus($drag_counter,counts[1]); + }, + stop: function() { + counts[2]++; + updateCounterStatus($stop_counter,counts[2]); + } + }); + }); + + function updateCounterStatus($event_counter,new_count) { + // first update the status visually... + if (!$event_counter.hasClass('ui-state-hover')) { + $event_counter.addClass('ui-state-hover') + .siblings().removeClass('ui-state-hover'); + } + // ...then update the numbers + $('span.count',$event_counter).text(new_count); + } + </script> +</head> +<body> + +<div class="demo"> + +<div id="draggable" class="ui-widget ui-widget-content"> + + <p>Drag me to trigger the chain of events.</p> + + <ul class="ui-helper-reset"> + <li id="event-start" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-play"></span>"start" invoked <span class="count">0</span>x</li> + <li id="event-drag" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-arrow-4"></span>"drag" invoked <span class="count">0</span>x</li> + <li id="event-stop" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-stop"></span>"stop" invoked <span class="count">0</span>x</li> + </ul> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Layer functionality onto the draggable using the <code>start</code>, <code>drag</code>, and <code>stop</code> events. Start is fired at the start of the drag; drag during the drag; and stop when dragging stops. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/handle.html b/fannie/src/jquery/development-bundle/demos/draggable/handle.html new file mode 100644 index 000000000..16bd8a8d7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/handle.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Handles</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + #draggable p { cursor: move; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ handle: 'p' }); + $("#draggable2").draggable({ cancel: "p.ui-widget-header" }); + $("div, p").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p class="ui-widget-header">I can be dragged only by this handle</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>You can drag me around&hellip;</p> + <p class="ui-widget-header">&hellip;but you can't drag me by this handle.</p> +</div> + +<!-- ADD CANCEL DEMO --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Allow dragging only when the cursor is over a specific part of the draggable. Use the <code>handle</code> option to specify the jQuery selector of an element (or group of elements) used to drag the object.</p> +<p>Or prevent dragging when the cursor is over a specific element (or group of elements) within the draggable. Use the <code>cancel</code> option to specify a jQuery selector over which to "cancel" draggable functionality.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/index.html b/fannie/src/jquery/development-bundle/demos/draggable/index.html new file mode 100644 index 000000000..65b900c91 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/index.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="events.html">Events</a></li> + <li><a href="constrain-movement.html">Constrain movement</a></li> + <li><a href="delay-start.html">Delay start</a></li> + <li><a href="snap-to.html">Snap to element or&#160;grid</a></li> + <li><a href="scroll.html">Auto-scroll</a></li> + <li><a href="revert.html">Revert position</a></li> + <li><a href="visual-feedback.html">Visual feedback</a></li> + <li><a href="handle.html">Drag handle</a></li> + <li><a href="cursor-style.html">Cursor style</a></li> + <li><a href="sortable.html">Draggable + Sortable</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/revert.html b/fannie/src/jquery/development-bundle/demos/draggable/revert.html new file mode 100644 index 000000000..77b79599c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/revert.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Revert position</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ revert: true }); + $("#draggable2").draggable({ revert: true, helper: 'clone' }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>Revert the original</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>Revert the helper</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Return the draggable (or it's helper) to its original location when dragging stops with the boolean <code>revert</code> option. +</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/scroll.html b/fannie/src/jquery/development-bundle/demos/draggable/scroll.html new file mode 100644 index 000000000..c7033b34e --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/scroll.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Auto-scroll</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ scroll: true }); + $("#draggable2").draggable({ scroll: true, scrollSensitivity: 100 }); + $("#draggable3").draggable({ scroll: true, scrollSpeed: 100 }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>Scroll set to true, default settings</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>scrollSensitivity set to 100</p> +</div> + +<div id="draggable3" class="ui-widget-content"> + <p>scrollSpeed set to 100</p> +</div> + +<div style='height: 5000px; width: 1px;'></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Automatically scroll the document when the draggable is moved beyond the viewport. Set the <code>scroll</code> option to true to enable auto-scrolling, and fine-tune when scrolling is triggered and its speed with the <code>scrollSensitivity</code> and <code>scrollSpeed</code> options. +</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/snap-to.html b/fannie/src/jquery/development-bundle/demos/draggable/snap-to.html new file mode 100644 index 000000000..a9ad84642 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/snap-to.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Snap to element or grid</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .draggable { width: 90px; height: 80px; padding: 5px; float: left; margin: 0 10px 10px 0; font-size: .9em; } + .ui-widget-header p, .ui-widget-content p { margin: 0; } + #snaptarget { height: 140px; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ snap: true }); + $("#draggable2").draggable({ snap: '.ui-widget-header' }); + $("#draggable3").draggable({ snap: '.ui-widget-header', snapMode: 'outer' }); + $("#draggable4").draggable({ grid: [20,20] }); + $("#draggable5").draggable({ grid: [80, 80] }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="snaptarget" class="ui-widget-header"> + <p>I'm a snap target</p> +</div> + +<br clear="both" /> + +<div id="draggable" class="draggable ui-widget-content"> + <p>Default (snap: true), snaps to all other draggable elements</p> +</div> + +<div id="draggable2" class="draggable ui-widget-content"> + <p>I only snap to the big box</p> +</div> + +<div id="draggable3" class="draggable ui-widget-content"> + <p>I only snap to the outer edges of the big box</p> +</div> + +<div id="draggable4" class="draggable ui-widget-content"> + <p>I snap to a 20 x 20 grid</p> +</div> + +<div id="draggable5" class="draggable ui-widget-content"> + <p>I snap to a 80 x 80 grid</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Snap the draggable to the inner or outer boundaries of a DOM element. Use the <code>snap</code>, <code>snapMode</code> (inner, outer, both), and <code>snapTolerance</code> (distance in pixels the draggable must be from the element when snapping is invoked) options. </p> + +<p>Or snap the draggable to a grid. Set the dimensions of grid cells (height and width in pixels) with the <code>grid</code> option.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/sortable.html b/fannie/src/jquery/development-bundle/demos/draggable/sortable.html new file mode 100644 index 000000000..a87ddc0ef --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/sortable.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable + Sortable</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .demo ul { list-style-type: none; margin: 0; padding: 0; margin-bottom: 10px; } + .demo li { margin: 5px; padding: 5px; width: 150px; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable").sortable({ + revert: true + }); + $("#draggable").draggable({ + connectToSortable: '#sortable', + helper: 'clone', + revert: 'invalid' + }); + $("ul, li").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ul> + <li id="draggable" class="ui-state-highlight">Drag me down</li> +</ul> + +<ul id="sortable"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default">Item 2</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> + <li class="ui-state-default">Item 5</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Draggables are built to interact seamlessly with <a href="#">sortables</a>. +</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/draggable/visual-feedback.html b/fannie/src/jquery/development-bundle/demos/draggable/visual-feedback.html new file mode 100644 index 000000000..4644472f0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/draggable/visual-feedback.html @@ -0,0 +1,76 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Draggable - Visual feedback</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2, #draggable3, #set div { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 0 10px 10px 0; } + #draggable, #draggable2, #draggable3 { margin-bottom:20px; } + #set { clear:both; float:left; width: 368px; height: 120px; } + p { clear:both; margin:0; padding:1em 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable({ helper: 'original' }); + $("#draggable2").draggable({ opacity: 0.7, helper: 'clone' }); + $("#draggable3").draggable({ + cursor: 'move', + cursorAt: { top: -12, left: -20 }, + helper: function(event) { + return $('<div class="ui-widget-header">I\'m a custom helper</div>'); + } + }); + $("#set div").draggable({ stack: '#set div' }); + }); + </script> +</head> +<body> +<div class="demo"> + +<h3 class="docs">With helpers:</h3> + +<div id="draggable" class="ui-widget-content"> + <p>Original</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>Semi-transparent clone</p> +</div> + +<div id="draggable3" class="ui-widget-content"> + <p>Custom helper (in combination with cursorAt)</p> +</div> + +<h3 class="docs">Stacked:</h3> +<div id="set"> + <div class="ui-widget-content"> + <p>We are draggables..</p> + </div> + + <div class="ui-widget-content"> + <p>..whose z-indexes are controlled automatically..</p> + </div> + + <div class="ui-widget-content"> + <p>..with the stack option.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Provide feedback to users as they drag an object in the form of a helper. The <code>helper</code> option accepts the values 'original' (the draggable object moves with the cursor), 'clone' (a duplicate of the draggable moves with the cursor), or a function that returns a DOM element (that element is shown near the cursor during drag). Control the helper's transparency with the <code>opacity</code> option.</p> + +<p>To clarify which draggable is in play, bring the draggable in motion to front. Use the <code>zIndex</code> option to set a higher z-index for the helper, if in play, or use the <code>stack</code> option to ensure that the last item dragged will appear on top of others in the same group on drag stop.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/accepted-elements.html b/fannie/src/jquery/development-bundle/demos/droppable/accepted-elements.html new file mode 100644 index 000000000..0ba0207e3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/accepted-elements.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Accept Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; } + #draggable, #draggable-nonvalid { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; } + </style> + <script type="text/javascript"> + $(function() { + + $("#draggable, #draggable-nonvalid").draggable(); + + $("#droppable").droppable({ + accept: '#draggable', + activeClass: 'ui-state-hover', + hoverClass: 'ui-state-active', + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('p').html('Dropped!'); + } + }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable-nonvalid" class="ui-widget-content"> + <p>I'm draggable but can't be dropped</p> +</div> + +<div id="draggable" class="ui-widget-content"> + <p>Drag me to my target</p> +</div> + +<div id="droppable" class="ui-widget-header"> + <p>accept: '#draggable'</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Specify using the <code>accept</code> option which element (or group of elements) is accepted by the target droppable.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/default.html b/fannie/src/jquery/development-bundle/demos/droppable/default.html new file mode 100644 index 000000000..4134dc942 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/default.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Default Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; } + #droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable(); + $("#droppable").droppable({ + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('p').html('Dropped!'); + } + }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>Drag me to my target</p> +</div> + +<div id="droppable" class="ui-widget-header"> + <p>Drop here</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Enable any DOM element to be droppable, a target for draggable elements.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras.jpg new file mode 100644 index 000000000..e2365c29e Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras2.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras2.jpg new file mode 100644 index 000000000..909024a57 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras2.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras2_min.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras2_min.jpg new file mode 100644 index 000000000..493e0824a Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras2_min.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras3.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras3.jpg new file mode 100644 index 000000000..05a43956f Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras3.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras3_min.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras3_min.jpg new file mode 100644 index 000000000..4aa96b01e Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras3_min.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras4.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras4.jpg new file mode 100644 index 000000000..ed753d1e3 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras4.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras4_min.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras4_min.jpg new file mode 100644 index 000000000..794dbdf78 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras4_min.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras_min.jpg b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras_min.jpg new file mode 100644 index 000000000..51e0cdedf Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/droppable/images/high_tatras_min.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/droppable/index.html b/fannie/src/jquery/development-bundle/demos/droppable/index.html new file mode 100644 index 000000000..e0c4e6ae2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/index.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="accepted-elements.html">Accepted elements</a></li> + <li><a href="propagation.html">Prevent propagation</a></li> + <li><a href="visual-feedback.html">Visual feedback</a></li> + <li><a href="revert.html">Revert draggable position</a></li> + <li><a href="shopping-cart.html">Shopping Cart</a></li> + <li><a href="photo-manager.html">Simple photo manager</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/photo-manager.html b/fannie/src/jquery/development-bundle/demos/droppable/photo-manager.html new file mode 100644 index 000000000..a611c0c50 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/photo-manager.html @@ -0,0 +1,167 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Simple photo manager</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #gallery { float: left; width: 65%; min-height: 12em; } * html #gallery { height: 12em; } /* IE6 */ + .gallery.custom-state-active { background: #eee; } + .gallery li { float: left; width: 96px; padding: 0.4em; margin: 0 0.4em 0.4em 0; text-align: center; } + .gallery li h5 { margin: 0 0 0.4em; cursor: move; } + .gallery li a { float: right; } + .gallery li a.ui-icon-zoomin { float: left; } + .gallery li img { width: 100%; cursor: move; } + + #trash { float: right; width: 32%; min-height: 18em; padding: 1%;} * html #trash { height: 18em; } /* IE6 */ + #trash h4 { line-height: 16px; margin: 0 0 0.4em; } + #trash h4 .ui-icon { float: left; } + #trash .gallery h5 { display: none; } + </style> + <script type="text/javascript"> + $(function() { + // there's the gallery and the trash + var $gallery = $('#gallery'), $trash = $('#trash'); + + // let the gallery items be draggable + $('li',$gallery).draggable({ + cancel: 'a.ui-icon',// clicking an icon won't initiate dragging + revert: 'invalid', // when not dropped, the item will revert back to its initial position + containment: $('#demo-frame').length ? '#demo-frame' : 'document', // stick to demo-frame if present + helper: 'clone', + cursor: 'move' + }); + + // let the trash be droppable, accepting the gallery items + $trash.droppable({ + accept: '#gallery > li', + activeClass: 'ui-state-highlight', + drop: function(ev, ui) { + deleteImage(ui.draggable); + } + }); + + // let the gallery be droppable as well, accepting items from the trash + $gallery.droppable({ + accept: '#trash li', + activeClass: 'custom-state-active', + drop: function(ev, ui) { + recycleImage(ui.draggable); + } + }); + + // image deletion function + var recycle_icon = '<a href="link/to/recycle/script/when/we/have/js/off" title="Recycle this image" class="ui-icon ui-icon-refresh">Recycle image</a>'; + function deleteImage($item) { + $item.fadeOut(function() { + var $list = $('ul',$trash).length ? $('ul',$trash) : $('<ul class="gallery ui-helper-reset"/>').appendTo($trash); + + $item.find('a.ui-icon-trash').remove(); + $item.append(recycle_icon).appendTo($list).fadeIn(function() { + $item.animate({ width: '48px' }).find('img').animate({ height: '36px' }); + }); + }); + } + + // image recycle function + var trash_icon = '<a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a>'; + function recycleImage($item) { + $item.fadeOut(function() { + $item.find('a.ui-icon-refresh').remove(); + $item.css('width','96px').append(trash_icon).find('img').css('height','72px').end().appendTo($gallery).fadeIn(); + }); + } + + // image preview function, demonstrating the ui.dialog used as a modal window + function viewLargerImage($link) { + var src = $link.attr('href'); + var title = $link.siblings('img').attr('alt'); + var $modal = $('img[src$="'+src+'"]'); + + if ($modal.length) { + $modal.dialog('open') + } else { + var img = $('<img alt="'+title+'" width="384" height="288" style="display:none;padding: 8px;" />') + .attr('src',src).appendTo('body'); + setTimeout(function() { + img.dialog({ + title: title, + width: 400, + modal: true + }); + }, 1); + } + } + + // resolve the icons behavior with event delegation + $('ul.gallery > li').click(function(ev) { + var $item = $(this); + var $target = $(ev.target); + + if ($target.is('a.ui-icon-trash')) { + deleteImage($item); + } else if ($target.is('a.ui-icon-zoomin')) { + viewLargerImage($target); + } else if ($target.is('a.ui-icon-refresh')) { + recycleImage($item); + } + + return false; + }); + }); + </script> +</head> +<body> + <div class="demo ui-widget ui-helper-clearfix"> + + <ul id="gallery" class="gallery ui-helper-reset ui-helper-clearfix"> + <li class="ui-widget-content ui-corner-tr"> + <h5 class="ui-widget-header">High Tatras</h5> + <img src="images/high_tatras_min.jpg" alt="The peaks of High Tatras" width="96" height="72" /> + <a href="images/high_tatras.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a> + <a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a> + </li> + <li class="ui-widget-content ui-corner-tr"> + <h5 class="ui-widget-header">High Tatras 2</h5> + <img src="images/high_tatras2_min.jpg" alt="The chalet at the Green mountain lake" width="96" height="72" /> + <a href="images/high_tatras2.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a> + <a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a> + </li> + <li class="ui-widget-content ui-corner-tr"> + <h5 class="ui-widget-header">High Tatras 3</h5> + <img src="images/high_tatras3_min.jpg" alt="Planning the ascent" width="96" height="72" /> + <a href="images/high_tatras3.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a> + <a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a> + </li> + <li class="ui-widget-content ui-corner-tr"> + <h5 class="ui-widget-header">High Tatras 4</h5> + <img src="images/high_tatras4_min.jpg" alt="On top of Kozi kopka" width="96" height="72" /> + <a href="images/high_tatras4.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a> + <a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a> + </li> + </ul> + + <div id="trash" class="ui-widget-content ui-state-default"> + <h4 class="ui-widget-header"><span class="ui-icon ui-icon-trash">Trash</span> Trash</h4> + </div> + + </div><!-- End demo --> + + <div class="demo-description"> + + <p>You can delete an image either by dragging it to the Trash or by clicking the trash icon.</p> + <p>You can "recycle" an image by dragging it back to the gallery or by clicking the recycle icon.</p> + <p>You can view larger image by clicking the zoom icon. jQuery UI dialog widget is used for the modal window.</p> + + </div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/propagation.html b/fannie/src/jquery/development-bundle/demos/droppable/propagation.html new file mode 100644 index 000000000..e6cf3c212 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/propagation.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Prevent propagation</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable { width: 100px; height: 40px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; } + #droppable, #droppable2 { width: 230px; height: 120px; padding: 0.5em; float: left; margin: 10px; } + #droppable-inner, #droppable2-inner { width: 170px; height: 60px; padding: 0.5em; float: left; margin: 10px; } + </style> + <script type="text/javascript"> + $(function() { + + $("#draggable").draggable(); + + $("#droppable, #droppable-inner").droppable({ + activeClass: 'ui-state-hover', + hoverClass: 'ui-state-active', + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('> p').html('Dropped!'); + return false; + } + }); + + $("#droppable2, #droppable2-inner").droppable({ + greedy: true, + activeClass: 'ui-state-hover', + hoverClass: 'ui-state-active', + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('> p').html('Dropped!'); + } + }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>Drag me to my target</p> +</div> + +<div id="droppable" class="ui-widget-header"> + <p>Outer droppable</p> + <div id="droppable-inner" class="ui-widget-header"> + <p>Inner droppable (not greedy)</p> + </div> +</div> + +<div id="droppable2" class="ui-widget-header"> + <p>Outer droppable</p> + <div id="droppable2-inner" class="ui-widget-header"> + <p>Inner droppable (greedy)</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>When working with nested droppables &#8212; for example, you may have an editable directory structure displayed as a tree, with folder and document nodes &#8212; the <code>greedy</code> option set to true prevents event propagation when a draggable is dropped on a child node (droppable).</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/revert.html b/fannie/src/jquery/development-bundle/demos/droppable/revert.html new file mode 100644 index 000000000..1f36c7178 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/revert.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Revert draggable position</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; } + #droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; } + </style> + <script type="text/javascript"> + $(function() { + + $("#draggable").draggable({ revert: 'valid' }); + $("#draggable2").draggable({ revert: 'invalid' }); + + $("#droppable").droppable({ + activeClass: 'ui-state-hover', + hoverClass: 'ui-state-active', + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('p').html('Dropped!'); + } + }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="draggable" class="ui-widget-content"> + <p>I revert when I'm dropped</p> +</div> + +<div id="draggable2" class="ui-widget-content"> + <p>I revert when I'm not dropped</p> +</div> + +<div id="droppable" class="ui-widget-header"> + <p>Drop me here</p> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Return the draggable (or it's helper) to its original location when dragging stops with the boolean <code>revert</code> option set on the draggable.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/shopping-cart.html b/fannie/src/jquery/development-bundle/demos/droppable/shopping-cart.html new file mode 100644 index 000000000..de8ce4fe3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/shopping-cart.html @@ -0,0 +1,101 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Shopping Cart Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.accordion.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + h1 { padding: .2em; margin: 0; } + #products { float:left; width: 500px; margin-right: 2em; } + #cart { width: 200px; float: left; } + /* style the list to maximize the droppable hitarea */ + #cart ol { margin: 0; padding: 1em 0 1em 3em; } + </style> + <script type="text/javascript"> + $(function() { + $("#catalog").accordion(); + $("#catalog li").draggable({ + appendTo: "body", + helper: "clone" + }); + $("#cart ol").droppable({ + activeClass: "ui-state-default", + hoverClass: "ui-state-hover", + accept: ":not(.ui-sortable-helper)", + drop: function(event, ui) { + $(this).find(".placeholder").remove(); + $("<li></li>").text(ui.draggable.text()).appendTo(this); + } + }).sortable({ + items: "li:not(.placeholder)", + sort: function() { + // gets added unintentionally by droppable interacting with sortable + // using connectWithSortable fixes this, but doesn't allow you to customize active/hoverClass options + $(this).removeClass("ui-state-default"); + } + }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="products"> + <h1 class="ui-widget-header">Products</h1> + <div id="catalog"> + <h3><a href="#">T-Shirts</a></h3> + <div> + <ul> + <li>Lolcat Shirt</li> + <li>Cheezeburger Shirt</li> + <li>Buckit Shirt</li> + </ul> + </div> + <h3><a href="#">Bags</a></h3> + <div> + <ul> + <li>Zebra Striped</li> + <li>Black Leather</li> + <li>Alligator Leather</li> + </ul> + </div> + <h3><a href="#">Gadgets</a></h3> + <div> + <ul> + <li>iPhone</li> + <li>iPod</li> + <li>iPad</li> + </ul> + </div> + </div> +</div> + +<div id="cart"> + <h1 class="ui-widget-header">Shopping Cart</h1> + <div class="ui-widget-content"> + <ol> + <li class="placeholder">Add your items here</li> + </ol> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Demonstrate how to use an accordion to structure products into a catalog and make use drag and drop for adding +them to a shopping cart, where they are sortable.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/droppable/visual-feedback.html b/fannie/src/jquery/development-bundle/demos/droppable/visual-feedback.html new file mode 100644 index 000000000..1bb6c6038 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/droppable/visual-feedback.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Droppable - Visual feedback</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #draggable, #draggable2 { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; } + #droppable, #droppable2 { width: 120px; height: 120px; padding: 0.5em; float: left; margin: 10px; } + </style> + <script type="text/javascript"> + $(function() { + $("#draggable").draggable(); + $("#droppable").droppable({ + hoverClass: 'ui-state-active', + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('p').html('Dropped!'); + } + }); + + $("#draggable2").draggable(); + $("#droppable2").droppable({ + accept: "#draggable2", + activeClass: 'ui-state-hover', + drop: function(event, ui) { + $(this).addClass('ui-state-highlight').find('p').html('Dropped!'); + } + }); + + }); + </script> +</head> +<body> +<div class="demo"> + +<h3 class="docs">Feedback on hover:</h3> + +<div id="draggable" class="ui-widget-content"> + <p>Drag me to my target</p> +</div> + +<div id="droppable" class="ui-widget-header"> + <p>Drop here</p> +</div> + +<h3 class="docs">Feedback on activating draggable:</h3> + +<div id="draggable2" class="ui-widget-content"> + <p>Drag me to my target</p> +</div> + +<div id="droppable2" class="ui-widget-header"> + <p>Drop here</p> +</div> + +<!-- add active class demo --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Change the droppable's appearance on hover, or when the droppable is active (an acceptable draggable is dropped on it). Use the <code>hoverClass</code> or <code>activeClass</code> options to specify respective classes.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/effect/default.html b/fannie/src/jquery/development-bundle/demos/effect/default.html new file mode 100644 index 000000000..f2988c5c3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/effect/default.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - Effect Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.blind.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.bounce.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.clip.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.drop.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.explode.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.fade.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.fold.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.highlight.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.pulsate.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.scale.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.shake.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.slide.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.transfer.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; position: relative;} + #button { padding: .5em 1em; text-decoration: none; } + #effect { width: 240px; height: 135px; padding: 0.4em; position: relative; } + #effect h3 { margin: 0; padding: 0.4em; text-align: center; } + .ui-effects-transfer { border: 2px dotted gray; } + </style> + <script type="text/javascript"> + $(function() { + + //run the currently selected effect + function runEffect(){ + //get effect type from + var selectedEffect = $('#effectTypes').val(); + + //most effect types need no options passed by default + var options = {}; + //check if it's scale, transfer, or size - they need options explicitly set + if(selectedEffect == 'scale'){ options = {percent: 0}; } + else if(selectedEffect == 'transfer'){ options = { to: "#button", className: 'ui-effects-transfer' }; } + else if(selectedEffect == 'size'){ options = { to: {width: 200,height: 60} }; } + + //run the effect + $("#effect").effect(selectedEffect,options,500,callback); + }; + + //callback function to bring a hidden box back + function callback(){ + setTimeout(function(){ + $("#effect:hidden").removeAttr('style').hide().fadeIn(); + }, 1000); + }; + + //set effect from select menu value + $("#button").click(function() { + runEffect(); + return false; + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="ui-widget-content ui-corner-all"> + <h3 class="ui-widget-header ui-corner-all">Effect</h3> + <p> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. + </p> + </div> +</div> + +<select name="effects" id="effectTypes"> + <option value="blind">Blind</option> + <option value="bounce">Bounce</option> + <option value="clip">Clip</option> + <option value="drop">Drop</option> + <option value="explode">Explode</option> + <option value="fade">Fade</option> + <option value="fold">Fold</option> + <option value="highlight">Highlight</option> + <option value="puff">Puff</option> + <option value="pulsate">Pulsate</option> + <option value="scale">Scale</option> + <option value="shake">Shake</option> + <option value="size">Size</option> + <option value="slide">Slide</option> + <option value="transfer">Transfer</option> +</select> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to show the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/effect/easing.html b/fannie/src/jquery/development-bundle/demos/effect/easing.html new file mode 100644 index 000000000..12d18fe70 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/effect/easing.html @@ -0,0 +1,101 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - Effect Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .graph { + float: left; + margin-left: 10px; + } + </style> + <script type="text/javascript"> + $(function() { + if (!$("<canvas/>")[0].getContext) { + $("<div/>").text("Your browser doesn't support canvas, which is required for this demo. Give Firefox 3 a try!").appendTo("#graphs"); + return; + } + var i = 0; + var width = 100, + height = 100; + $.each($.easing, function(name, impl) { + // skip linera/jswing and any non functioning implementation + if (!$.isFunction(impl) || /jswing/.test(name)) + return; + var graph = $("<div/>").addClass("graph").appendTo("#graphs"); + var text = $("<div/>").text(++i + ". " + name).appendTo(graph); + + var canvas = $("<canvas/>").appendTo(graph)[0] + canvas.width = width; + canvas.height = height; + var drawHeight = height * 0.8; + var cradius = 10; + var ctx = canvas.getContext("2d"); + ctx.fillStyle = "black"; + + ctx.beginPath(); + ctx.moveTo(cradius, 0); + ctx.quadraticCurveTo(0, 0, 0, cradius); + ctx.lineTo(0, height - cradius); + ctx.quadraticCurveTo(0, height, cradius, height); + ctx.lineTo(width - cradius, height); + ctx.quadraticCurveTo(width, height, width, height - cradius); + ctx.lineTo(width, 0); + ctx.lineTo(cradius, 0); + ctx.fill(); + + ctx.strokeStyle = "#555"; + ctx.beginPath(); + ctx.moveTo(width * 0.1, drawHeight + .5); + ctx.lineTo(width * 0.9, drawHeight + .5); + ctx.stroke(); + + ctx.strokeStyle = "#555"; + ctx.beginPath(); + ctx.moveTo(width * 0.1, drawHeight * .3 - .5); + ctx.lineTo(width * 0.9, drawHeight * .3 - .5); + ctx.stroke(); + + ctx.strokeStyle = "white"; + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(width * 0.1, drawHeight); + $.each(new Array(width), function(position) { + var val = impl(0, position, 0, 1, height); + if (/linear|jswing/.test(name)) val = position / width; + ctx.lineTo(position * 0.8 + width * 0.1, drawHeight - drawHeight * val * 0.7); + }); + ctx.stroke(); + graph.click(function() { + $(canvas).animate({height: "hide"}, 2000, name).animate({"left": "0"}, 800).animate({height: "show"}, 2000, name); + }); + + graph.width(width).height(height + text.height() + 10); + //return false; + }); + }); + </script> +</head> +<body> + +<div class="demo"> + + <div id="graphs"></div> + + <div id="animted"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p><strong>All easings provided by jQuery UI are drawn above, using a HTML canvas element</strong>. Click a diagram to see the easing in action.</p> + +</div><!-- End demo-description --> + +</body> +</html> + diff --git a/fannie/src/jquery/development-bundle/demos/effect/index.html b/fannie/src/jquery/development-bundle/demos/effect/index.html new file mode 100644 index 000000000..cecceb6cd --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/effect/index.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effect Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Effect showcase</a></li> + <li><a href="easing.html">Easing showcase</a></li> + <!-- WIP + <li class="demo-config-on"><a href="scale.html">Scale effect</a></li> + <li class="demo-config-on"><a href="size.html">Size effect</a></li> + <li class="demo-config-on"><a href="transfer.html">Transfer effect</a></li> + --> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/hide/default.html b/fannie/src/jquery/development-bundle/demos/hide/default.html new file mode 100644 index 000000000..0e18a5581 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/hide/default.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - Hide Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.blind.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.bounce.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.clip.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.drop.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.explode.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.fold.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.highlight.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.pulsate.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.scale.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.shake.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.slide.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.transfer.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; } + #button { padding: .5em 1em; text-decoration: none; } + #effect { width: 240px; height: 135px; padding: 0.4em; position: relative; } + #effect h3 { margin: 0; padding: 0.4em; text-align: center; } + .ui-effects-transfer { border: 2px dotted gray; } + </style> + <script type="text/javascript"> + $(function() { + + //run the currently selected effect + function runEffect(){ + //get effect type from + var selectedEffect = $('#effectTypes').val(); + + //most effect types need no options passed by default + var options = {}; + //check if it's scale, transfer, or size - they need options explicitly set + if(selectedEffect == 'scale'){ options = {percent: 0}; } + else if(selectedEffect == 'transfer'){ options = { to: "#button", className: 'ui-effects-transfer' }; } + else if(selectedEffect == 'size'){ options = { to: {width: 200,height: 60} }; } + + //run the effect + $("#effect").hide(selectedEffect,options,500,callback); + }; + + //callback function to bring a hidden box back + function callback(){ + setTimeout(function(){ + $("#effect:hidden").removeAttr('style').hide().fadeIn(); + }, 1000); + }; + + //set effect from select menu value + $("#button").click(function() { + runEffect(); + return false; + }); + + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="ui-widget-content ui-corner-all"> + <h3 class="ui-widget-header ui-corner-all">Hide</h3> + <p> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. + </p> + </div> +</div> + +<select name="effects" id="effectTypes"> + <option value="blind">Blind</option> + <option value="bounce">Bounce</option> + <option value="clip">Clip</option> + <option value="drop">Drop</option> + <option value="explode">Explode</option> + <option value="fold">Fold</option> + <option value="highlight">Highlight</option> + <option value="puff">Puff</option> + <option value="pulsate">Pulsate</option> + <option value="scale">Scale</option> + <option value="shake">Shake</option> + <option value="size">Size</option> + <option value="slide">Slide</option> + <option value="transfer">Transfer</option> +</select> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/hide/index.html b/fannie/src/jquery/development-bundle/demos/hide/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/hide/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/images/calendar.gif b/fannie/src/jquery/development-bundle/demos/images/calendar.gif new file mode 100644 index 000000000..d0abaa7c0 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/calendar.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/demo-config-on-tile.gif b/fannie/src/jquery/development-bundle/demos/images/demo-config-on-tile.gif new file mode 100644 index 000000000..359da95a7 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/demo-config-on-tile.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/demo-config-on.gif b/fannie/src/jquery/development-bundle/demos/images/demo-config-on.gif new file mode 100644 index 000000000..9fcec1ac1 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/demo-config-on.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/demo-spindown-closed.gif b/fannie/src/jquery/development-bundle/demos/images/demo-spindown-closed.gif new file mode 100644 index 000000000..b247824e9 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/demo-spindown-closed.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/demo-spindown-open.gif b/fannie/src/jquery/development-bundle/demos/images/demo-spindown-open.gif new file mode 100644 index 000000000..e1c60aa55 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/demo-spindown-open.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/icon-docs-info.gif b/fannie/src/jquery/development-bundle/demos/images/icon-docs-info.gif new file mode 100644 index 000000000..6b0464e01 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/icon-docs-info.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/jquery_32x32.png b/fannie/src/jquery/development-bundle/demos/images/jquery_32x32.png new file mode 100644 index 000000000..1cd42c9fe Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/jquery_32x32.png differ diff --git a/fannie/src/jquery/development-bundle/demos/images/jqueryui_32x32.png b/fannie/src/jquery/development-bundle/demos/images/jqueryui_32x32.png new file mode 100644 index 000000000..23ca0f8b9 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/jqueryui_32x32.png differ diff --git a/fannie/src/jquery/development-bundle/demos/images/pbar-ani.gif b/fannie/src/jquery/development-bundle/demos/images/pbar-ani.gif new file mode 100644 index 000000000..0dfd45b88 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/pbar-ani.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/images/sizzlejs_32x32.png b/fannie/src/jquery/development-bundle/demos/images/sizzlejs_32x32.png new file mode 100644 index 000000000..8d7ae1e0b Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/sizzlejs_32x32.png differ diff --git a/fannie/src/jquery/development-bundle/demos/images/transparent_1x1.png b/fannie/src/jquery/development-bundle/demos/images/transparent_1x1.png new file mode 100644 index 000000000..209a43864 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/images/transparent_1x1.png differ diff --git a/fannie/src/jquery/development-bundle/demos/index.html b/fannie/src/jquery/development-bundle/demos/index.html new file mode 100644 index 000000000..db3e2bf83 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/index.html @@ -0,0 +1,313 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>jQuery UI Demos</title> + <link type="text/css" href="../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <link type="text/css" href="demos.css" rel="stylesheet" /> + <script type="text/javascript" src="../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../external/jquery.bgiframe-2.1.1.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.accordion.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.autocomplete.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.button.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.datepicker.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.dialog.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.droppable.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.position.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.progressbar.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.resizable.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.selectable.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.slider.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.sortable.js"></script> + <script type="text/javascript" src="../ui/jquery.ui.tabs.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.core.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.blind.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.bounce.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.clip.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.drop.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.explode.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.fold.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.highlight.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.pulsate.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.scale.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.shake.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.slide.js"></script> + <script type="text/javascript" src="../ui/jquery.effects.transfer.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-af.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ar.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-az.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-bs.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-bg.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ca.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-cs.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-da.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-de.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-el.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-en-GB.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-eo.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-es.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-et.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-eu.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-fa.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-fi.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-fo.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-fr.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-fr-CH.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-he.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-hr.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-hu.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-hy.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-id.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-is.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-it.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ja.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ko.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-lt.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-lv.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ms.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-nl.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-no.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-pl.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-pt-BR.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ro.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ru.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-sk.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-sl.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-sq.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-sr.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-sr-SR.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-sv.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-ta.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-th.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-tr.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-uk.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-vi.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-zh-CN.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-zh-HK.js"></script> + <script type="text/javascript" src="../ui/i18n/jquery.ui.datepicker-zh-TW.js"></script> + <script type="text/javascript"> + jQuery(function($) { + + $('.left-nav a').click(function(ev) { + window.location.hash = this.href.replace(/.+\/([^\/]+)\/index\.html/,'$1') + '|default'; + loadPage(this.href); + $('.left-nav a.selected').removeClass('selected'); + $(this).addClass('selected'); + ev.preventDefault(); + }); + + if (window.location.hash) { + if (window.location.hash.indexOf('|') === -1) { + window.location.hash += '|default'; + } + var path = window.location.href.replace(/(index\.html)?#/,''); + path = path.replace('\|','/') + '.html'; + loadPage(path); + } + + function loadPage(path) { + var section = path.replace(/\/[^\/]+\.html/,''); + var header = section.replace(/.+\/([^\/]+)/,'$1').replace(/_/, ' '); + + $('td.normal div.normal') + .empty() + .append('<h4 class="demo-subheader">Functional demo:</h4>') + .append('<h3 class="demo-header">'+ header +'</h3>') + .append('<div id="demo-config"></div>') + .find('#demo-config') + .append('<div id="demo-frame"></div><div id="demo-config-menu"></div><div id="demo-link"><a class="demoWindowLink" href="#"><span class="ui-icon ui-icon-newwin"></span>Open demo in a new window</a></div>') + .find('#demo-config-menu') + .load(section + '/index.html .demos-nav', function() { + $('#demo-config-menu a').each(function() { + this.setAttribute('href', section + '/' + this.getAttribute('href').replace(/.+\/([^\/]+)/,'$1')); + $(this).attr('target', 'demo-frame'); + $(this).click(function() { + + resetDemos(); + + $(this).parents('ul').find('li').removeClass('demo-config-on'); + $(this).parent().addClass('demo-config-on'); + $('#demo-notes').fadeOut(); + + //Set the hash to the actual page without ".html" + window.location.hash = header + '|' + this.getAttribute('href').match((/\/([^\/\\]+)\.html/))[1]; + + loadDemo(this.getAttribute('href')); + + return false; + }); + }); + + if (window.location.hash) { + var demo = window.location.hash.split('|')[1]; + $('#demo-config-menu a').each(function(){ + if (this.href.indexOf(demo + '.html') !== -1) { + $(this).parents('ul').find('li').removeClass('demo-config-on'); + $(this).parent().addClass('demo-config-on'); + loadDemo(this.href); + } + }); + } + + updateDemoNotes(); + }) + .end() + .find('#demo-link a') + .bind('click', function(ev){ + window.open(this.href); + ev.preventDefault(); + }) + .end() + .end() + ; + + resetDemos(); + } + + function loadDemo(path) { + var directory = path.match(/([^\/]+)\/[^\/\.]+\.html$/)[1]; + $.get(path, function(data) { + var source = data; + data = data.replace(/<script.*>.*<\/script>/ig,""); // Remove script tags + data = data.replace(/<\/?link.*>/ig,""); //Remove link tags + data = data.replace(/<\/?html.*>/ig,""); //Remove html tag + data = data.replace(/<\/?body.*>/ig,""); //Remove body tag + data = data.replace(/<\/?head.*>/ig,""); //Remove head tag + data = data.replace(/<\/?!doctype.*>/ig,""); //Remove doctype + data = data.replace(/<title.*>.*<\/title>/ig,""); // Remove title tags + data = data.replace(/((href|src)=["'])(?!(http|#))/ig, "$1" + directory + "/"); + + $('#demo-style').remove(); + $('#demo-frame').empty().html(data); + $('#demo-frame style').clone().appendTo('head').attr('id','demo-style'); + $('#demo-link a').attr('href', path); + updateDemoNotes(); + updateDemoSource(source); + + if (/default.html$/.test(path)) { + $.get("documentation/docs-" + path.match(/demos\/(.+)\//)[1] + ".html", function(html) { + $("#demo-source").after(html); + $("#widget-docs").tabs(); + $(".param-header").click(function() { + $(this).parent().toggleClass("param-open").end().next().toggle(); + }); + $(".docs-list-header").each(function() { + var header = $(this); + var details = header.next().find(".param-details").hide(); + $("a:first", header).click(function() { + details.show().parent().addClass("param-open"); + return false; + }); + $("a:last", header).click(function() { + details.hide().parent().removeClass("param-open"); + return false; + }); + }); + }); + } + }); + } + + function updateDemoNotes() { + var notes = $('#demo-frame .demo-description'); + if ($('#demo-notes').length == 0) { + $('<div id="demo-notes"></div>').insertAfter('#demo-config'); + } + $('#demo-notes').hide().empty().html(notes.html()); + $('#demo-notes').show(); + notes.hide(); + } + + function updateDemoSource(source) { + if ($('#demo-source').length == 0) { + $('<div id="demo-source"><a href="#" class="source-closed">View Source</a><div><pre><code></code></pre></div></div>').insertAfter('#demo-notes'); + $('#demo-source').find(">a").click(function() { + $(this).toggleClass("source-closed").toggleClass("source-open").next().toggle(); + return false; + }).end().find(">div").hide(); + } + var cleanedSource = source + .replace('themes/base/jquery.ui.all.css', 'theme/jquery.ui.all.css') + .replace(/\s*\x3Clink.*demos\x2Ecss.*\x3E\s*/, '\r\n\t') + .replace(/\x2E\x2E\x2F\x2E\x2E\x2F/g, ''); + + $('#demo-source code').empty().text(cleanedSource); + } + + function resetDemos() { + $.datepicker.setDefaults($.extend({showMonthAfterYear: false}, $.datepicker.regional[''])); + $(".ui-dialog-content").remove(); + } + + }); + </script> +</head> +<body> + +<table class="layout-grid" cellspacing="0" cellpadding="0"> + <tr> + <td class="left-nav"> + <dl class="demos-nav"> + <dt>Interactions</dt> + <dd><a href="draggable/index.html">Draggable</a></dd> + <dd><a href="droppable/index.html">Droppable</a></dd> + <dd><a href="resizable/index.html">Resizable</a></dd> + <dd><a href="selectable/index.html">Selectable</a></dd> + <dd><a href="sortable/index.html">Sortable</a></dd> + <dt>Widgets</dt> + <dd><a href="accordion/index.html">Accordion</a></dd> + <dd><a href="autocomplete/index.html">Autocomplete</a></dd> + <dd><a href="button/index.html">Button</a></dd> + <dd><a href="datepicker/index.html">Datepicker</a></dd> + <dd><a href="dialog/index.html">Dialog</a></dd> + <dd><a href="progressbar/index.html">Progressbar</a></dd> + <dd><a href="slider/index.html">Slider</a></dd> + <dd><a href="tabs/index.html">Tabs</a></dd> + <dt>Effects</dt> + <dd><a href="animate/index.html">Color Animation</a></dd> + <dd><a href="toggleClass/index.html">Toggle Class</a></dd> + <dd><a href="addClass/index.html">Add Class</a></dd> + <dd><a href="removeClass/index.html">Remove Class</a></dd> + <dd><a href="switchClass/index.html">Switch Class</a></dd> + <dd><a href="effect/index.html">Effect</a></dd> + <dd><a href="toggle/index.html">Toggle</a></dd> + <dd><a href="hide/index.html">Hide</a></dd> + <dd><a href="show/index.html">Show</a></dd> + <dt>Utilities</dt> + <dd><a href="position/index.html">Position</a></dd> + <dt>About jQuery UI</dt> + <dd><a href="http://jqueryui.com/docs/Getting_Started">Getting Started</a></dd> + <dd><a href="http://jqueryui.com/docs/Upgrade_Guide">Upgrade Guide</a></dd> + <dd><a href="http://jqueryui.com/docs/Changelog">Changelog</a></dd> + <dd><a href="http://jqueryui.com/docs/Roadmap">Roadmap</a></dd> + <dd><a href="http://jqueryui.com/docs/Subversion">Subversion Access</a></dd> + <dd><a href="http://jqueryui.com/docs/Developer_Guide">UI Developer Guidelines</a></dd> + <dt>Theming</dt> + <dd><a href="http://jqueryui.com/docs/Theming">Theming jQuery UI</a></dd> + <dd><a href="http://jqueryui.com/docs/Theming/API">jQuery UI CSS Framework</a></dd> + <dd><a href="http://jqueryui.com/docs/Theming/Themeroller">ThemeRoller application</a></dd> + <dd><a href="http://jqueryui.com/docs/Theming/ThemeSwitcher">Theme Switcher Widget</a></dd> + + </dl> + </td> + <td class="normal"> + + <div class="normal"> + + <h3>Instructions</h3> + <p> + These demos showcase some common uses of each jQuery UI plugin. Simply copy and paste code from the demos to get started. Have fun playing with them. + </p> + + </div> + + </td> + </tr> +</table> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/position/cycler.html b/fannie/src/jquery/development-bundle/demos/position/cycler.html new file mode 100644 index 000000000..fa0571e33 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/position/cycler.html @@ -0,0 +1,125 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Position - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + + <style type="text/css"> + html, body { + margin: 0; + padding: 0 + } + </style> + + <script type="text/javascript"> + $(function() { + + $.fn.position2 = function(options) { + return this.position($.extend({ + of: window, + using: function(to) { + $(this).css({ + top: to.top, + left: to.left + }) + }, + collision: "none" + }, options)); + } + + $.fn.left = function(using) { + return this.position2({ + my: "right middle", + at: "left middle", + offset: "25 0", + using: using + }); + } + $.fn.right = function(using) { + return this.position2({ + my: "left middle", + at: "right middle", + offset: "-25 0", + using: using + }); + } + $.fn.center = function(using) { + return this.position2({ + my: "center middle", + at: "center middle", + using: using + }); + }; + + $("img:eq(0)").left(); + $("img:eq(1)").center(); + $("img:eq(2)").right(); + + $("body").css({ + overflow: "hidden" + }) + $(".demo").css({ + position: "relative", + }); + $(".demo img").css({ + position: "absolute", + }); + + function animate(to) { + $(this).animate(to); + } + function next() { + $("img:eq(2)").center(animate); + $("img:eq(1)").left(animate) + $("img:eq(0)").right().appendTo(".demo"); + } + function previous() { + $("img:eq(0)").center(animate); + $("img:eq(1)").right(animate); + $("img:eq(2)").left().prependTo(".demo"); + } + $("#previous").click(previous); + $("#next").click(next); + + $(".demo img").click(function() { + $(".demo img").index(this) == 0 ? previous() : next(); + }); + + $(window).resize(function() { + $("img:eq(0)").left(animate); + $("img:eq(1)").center(animate); + $("img:eq(2)").right(animate); + }) + }); + </script> + +</head> +<body> + +<div class="demo"> + + <img src="images/earth.jpg" /> + <img src="images/flight.jpg" /> + <img src="images/rocket.jpg" /> + + <a id="previous" href="#">Previous</a> + <a id="next" href="#">Next</a> +</div> + +<div class="demo-description"> + +<p>A prototype for the <a href="http://wiki.jqueryui.com/Photoviewer">Photoviewer</a> using Position to place images at the center, left and right and cycle them. +<br/>Use the links at the top to cycle, or click on the images on the left and right. +<br/>Note how the images are repositioned when resizing the window. +<br/>Warning: Doesn't currently work inside the demo viewer; open in a new window instead!</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/position/default.html b/fannie/src/jquery/development-bundle/demos/position/default.html new file mode 100644 index 000000000..d26959b96 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/position/default.html @@ -0,0 +1,159 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Position - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.draggable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + + div#parent { + width: 60%; + margin: 10px auto; + padding: 5px; + + border: 1px solid #777; + background-color: #fbca93; + text-align: center; + } + + div.positionable { + width: 75px; + height: 75px; + position: absolute; + display: block; + right: 0; + bottom: 0; + background-color: #bcd5e6; + text-align: center; + } + + select, input { + margin-left: 15px; + } + + </style> + <script type="text/javascript"> + $(function() { + + function position(using) { + $('.positionable').position({ + of: $('#parent'), + my: $('#my_horizontal').val() + ' ' + $('#my_vertical').val(), + at: $('#at_horizontal').val() + ' '+ $('#at_vertical').val(), + offset: $('#offset').val(), + using: using, + collision: $("#collision_horizontal").val() + ' ' + $("#collision_vertical").val() + }); + } + + $('.positionable').css("opacity", 0.5); + + $(':input').bind('click keyup change', function() { position(); }); + + $("#parent").draggable({ + drag: function() { position(); } + }); + + $('.positionable').draggable({ + drag: function(event, ui) { + // reset offset before calculating it + $("#offset").val("0"); + position(function(result) { + $("#offset").val("" + (ui.offset.left - result.left) + " " + (ui.offset.top - result.top)); + position(); + }); + } + }); + + position(); + }); + </script> + +</head> +<body> + +<div class="demo"> + +<div id="parent"> + <p> + This is the position parent element. + </p> +</div> + +<div class="positionable"> + <p> + to position + </p> +</div> + +<div class="positionable" style="width:120px; height: 40px;"> + <p> + to position 2 + </p> +</div> + +<div style="padding: 20px; margin-top: 75px;"> + position... + <div style="padding-bottom: 20px;"> + <b>my:</b> + <select id="my_horizontal"> + <option value="left">left</option> + <option value="center">center</option> + <option value="right">right</option> + </select> + <select id="my_vertical"> + <option value="top">top</option> + <option value="middle">center</option> + <option value="bottom">bottom</option> + </select> + </div> + <div style="padding-bottom: 20px;"> + <b>at:</b> + <select id="at_horizontal"> + <option value="left">left</option> + <option value="center">center</option> + <option value="right">right</option> + </select> + <select id="at_vertical"> + <option value="top">top</option> + <option value="middle">center</option> + <option value="bottom">bottom</option> + </select> + </div> + <div style="padding-bottom: 20px;"> + <b>offset:</b> + <input id="offset" type="text" size="15"/> + </div> + <div style="padding-bottom: 20px;"> + <b>collision:</b> + <select id="collision_horizontal"> + <option value="flip">flip</option> + <option value="fit">fit</option> + <option value="none">none</option> + </select> + <select id="collision_vertical"> + <option value="flip">flip</option> + <option value="fit">fit</option> + <option value="none">none</option> + </select> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Use the form controls to configure the positioning, or drag the positioned element to modify its offset. +<br/>Drag around the parent element to see collision detection in action.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/position/images/earth.jpg b/fannie/src/jquery/development-bundle/demos/position/images/earth.jpg new file mode 100644 index 000000000..87ea48803 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/position/images/earth.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/position/images/flight.jpg b/fannie/src/jquery/development-bundle/demos/position/images/flight.jpg new file mode 100644 index 000000000..9721986c0 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/position/images/flight.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/position/images/rocket.jpg b/fannie/src/jquery/development-bundle/demos/position/images/rocket.jpg new file mode 100644 index 000000000..d3bff6123 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/position/images/rocket.jpg differ diff --git a/fannie/src/jquery/development-bundle/demos/position/index.html b/fannie/src/jquery/development-bundle/demos/position/index.html new file mode 100644 index 000000000..54a6d54c6 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/position/index.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Position Demo</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="cycler.html">Cycling images</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/progressbar/animated.html b/fannie/src/jquery/development-bundle/demos/progressbar/animated.html new file mode 100644 index 000000000..e094f64a3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/progressbar/animated.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Progressbar - Animated</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.progressbar.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .ui-progressbar-value { background-image: url(images/pbar-ani.gif); } + </style> + <script type="text/javascript"> + $(function() { + $("#progressbar").progressbar({ + value: 59 + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="progressbar"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +This progressbar has an animated fill by setting the +<code>background-image</code> +on the +<code>.ui-progressbar-value</code> +element, using css. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/progressbar/default.html b/fannie/src/jquery/development-bundle/demos/progressbar/default.html new file mode 100644 index 000000000..86c7c9c54 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/progressbar/default.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Progressbar - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.progressbar.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#progressbar").progressbar({ + value: 37 + }); + }); + </script> +</head> +<body> + +<div class="demo"> + + <div id="progressbar"></div> + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Default determinate progress bar.</p> + +</div><!-- End demo-description --> + + + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/progressbar/images/pbar-ani.gif b/fannie/src/jquery/development-bundle/demos/progressbar/images/pbar-ani.gif new file mode 100644 index 000000000..0dfd45b88 Binary files /dev/null and b/fannie/src/jquery/development-bundle/demos/progressbar/images/pbar-ani.gif differ diff --git a/fannie/src/jquery/development-bundle/demos/progressbar/index.html b/fannie/src/jquery/development-bundle/demos/progressbar/index.html new file mode 100644 index 000000000..cf8ee9fe3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/progressbar/index.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Progressbar Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="animated.html">Animated</a></li> + <li><a href="resize.html">Resizable progressbar</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/progressbar/resize.html b/fannie/src/jquery/development-bundle/demos/progressbar/resize.html new file mode 100644 index 000000000..fb99ab8ee --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/progressbar/resize.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Progressbar - Resizable</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.progressbar.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#progressbar").progressbar({ + value: 37 + }); + $("#progressbarWrapper").resizable(); + }); + </script> +</head> +<body> + +<div class="demo"> + + <div id="progressbarWrapper" style="height:30px; " class="ui-widget-default"> + <div id="progressbar" style="height:100%;"></div> + </div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>The progress bar's widths are specified in percentages for flexible sizing so it will resize to fit its container. Try resizing the height and width of this bar to see how it maintains the correct proportions. (This is not necessarily a real-world example, but it's a good illustration of how flexibly all the plugins are coded.)</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/removeClass/default.html b/fannie/src/jquery/development-bundle/demos/removeClass/default.html new file mode 100644 index 000000000..15a5a5756 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/removeClass/default.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - removeClass Demo</title> + <link type="text/css" href="http://jquery-ui.googlecode.com/svn/trunk/themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/trunk/jquery-1.4.2.js"></script> + <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/trunk/ui/jquery.effects.core.js"></script> + <link type="text/css" href="http://jquery-ui.googlecode.com/svn/trunk/demos/demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; position: relative;} + #button { padding: .5em 1em; text-decoration: none; } + #effect {position: relative; width: 240px; padding: 1em; letter-spacing: 0; font-size: 1.2em; border: 1px solid #000; background: #eee; color: #333; } + #effect.newClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; } + </style> + <script type="text/javascript"> + $(function() { + $("#button").click(function() { + $('#effect').removeClass('newClass', 1000, callback); + return false; + }); + + function callback(){ + setTimeout(function(){ + $('#effect').addClass('newClass'); + }, 1500); + } + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="newClass ui-corner-all"> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. + </div> +</div> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/removeClass/index.html b/fannie/src/jquery/development-bundle/demos/removeClass/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/removeClass/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/animate.html b/fannie/src/jquery/development-bundle/demos/resizable/animate.html new file mode 100644 index 000000000..36739e3dd --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/animate.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Animate</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 150px; height: 150px; padding: 0.5em; } + #resizable h3 { text-align: center; margin: 0; } + .ui-resizable-helper { border: 1px dotted gray; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + animate: true + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Animate</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Animate the resize action using the <code>animate</code> option (boolean). When this option is set to true, drag the outline to the desired location; the element animates to that size on drag stop.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/aspect-ratio.html b/fannie/src/jquery/development-bundle/demos/resizable/aspect-ratio.html new file mode 100644 index 000000000..ae236ec59 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/aspect-ratio.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Preserve aspect ratio</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 160px; height: 90px; padding: 0.5em; } + #resizable h3 { text-align: center; margin: 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + aspectRatio: 16/9 + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Preserve aspect ratio</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Maintain the existing aspect ratio or set a new one to constrain the proportions on resize. Set the <code>aspectRatio</code> option to true, and optionally pass in a new ratio (i.e., 4/3)</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/constrain-area.html b/fannie/src/jquery/development-bundle/demos/resizable/constrain-area.html new file mode 100644 index 000000000..2fdbbd957 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/constrain-area.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Constrain resize area</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #container { width: 300px; height: 300px; } + #container h3 { text-align: center; margin: 0; margin-bottom: 10px; } + #resizable { background-position: top left; width: 150px; height: 150px; } + #resizable, #container { padding: 0.5em; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + containment: '#container' + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="container" class="ui-widget-content"> + <h3 class="ui-widget-header">Containment</h3> + <div id="resizable" class="ui-state-active"> + <h3 class="ui-widget-header">Resizable</h3> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Define the boundaries of the resizable area. Use the <code>containment</code> option to specify a parent DOM element or a jQuery selector, like 'document.'</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/default.html b/fannie/src/jquery/development-bundle/demos/resizable/default.html new file mode 100644 index 000000000..a8dfd251c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/default.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 150px; height: 150px; padding: 0.5em; } + #resizable h3 { text-align: center; margin: 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable(); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Resizable</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Enable any DOM element to be resizable. With the cursor grab the right or bottom border and drag to the desired width or height.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/delay-start.html b/fannie/src/jquery/development-bundle/demos/resizable/delay-start.html new file mode 100644 index 000000000..16e024230 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/delay-start.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Delay start</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable, #resizable2 { width: 150px; height: 150px; padding: 0.5em; } + #resizable h3, #resizable2 h3 { text-align: center; margin: 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + delay: 1000 + }); + + $("#resizable2").resizable({ + distance: 40 + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<h3 class="docs">Time delay (ms):</h3> +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Time</h3> +</div> + +<h3 class="docs">Distance delay (px):</h3> +<div id="resizable2" class="ui-widget-content"> + <h3 class="ui-widget-header">Distance</h3> +</div> + +<!-- ADD DISTANCE DEMO --> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Delay the start of resizng for a number of milliseconds with the <code>delay</code> option; prevent resizing until the cursor is held down and dragged a specifed number of pixels with the <code>distance</code> option.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/helper.html b/fannie/src/jquery/development-bundle/demos/resizable/helper.html new file mode 100644 index 000000000..49e8114ab --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/helper.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Helper</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 150px; height: 150px; padding: 0.5em; } + #resizable h3 { text-align: center; margin: 0; } + .ui-resizable-helper { border: 2px dotted #00F; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + helper: 'ui-resizable-helper' + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Helper</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Display only an outline of the element while resizing by setting the <code>helper</code> option to a CSS class.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/index.html b/fannie/src/jquery/development-bundle/demos/resizable/index.html new file mode 100644 index 000000000..93198d03c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/index.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="aspect-ratio.html">Preserve aspect ratio</a></li> + <li><a href="max-min.html">Maximum / minimum size</a></li> + <li><a href="constrain-area.html">Constrain resize area</a></li> + <li><a href="delay-start.html">Delay start</a></li> + <li><a href="snap-to-grid.html">Snap to grid</a></li> + <li><a href="visual-feedback.html">Visual feedback</a></li> + <li><a href="synchronous-resize.html">Synchronous resize</a></li> + <li><a href="animate.html">Animate</a></li> + <li><a href="helper.html">Resize Helper</a></li> + <li><a href="textarea.html">Textarea</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/max-min.html b/fannie/src/jquery/development-bundle/demos/resizable/max-min.html new file mode 100644 index 000000000..a1c9f6f86 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/max-min.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Maximum / minimum size</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 200px; height: 150px; padding: 5px; } + #resizable h3 { text-align: center; margin: 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + maxHeight: 250, + maxWidth: 350, + minHeight: 150, + minWidth: 200 + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Resize larger / smaller</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Limit the resizable element to a maximum or minimum height or width using the <code>maxHeight</code>, <code>maxWidth</code>, <code>minHeight</code>, and <code>minWidth</code> options.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/snap-to-grid.html b/fannie/src/jquery/development-bundle/demos/resizable/snap-to-grid.html new file mode 100644 index 000000000..91ebbcd6f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/snap-to-grid.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Snap to grid</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 150px; height: 150px; padding: 0.5em; } + #resizable h3 { text-align: center; margin: 0; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + grid: 50 + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Grid</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Snap the resizable element to a grid. Set the dimensions of grid cells (height and width in pixels) with the <code>grid</code> option.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/synchronous-resize.html b/fannie/src/jquery/development-bundle/demos/resizable/synchronous-resize.html new file mode 100644 index 000000000..3b3b37241 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/synchronous-resize.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Synchronous resize</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { background-position: top left; } + #resizable, #also { width: 150px; height: 120px; padding: 0.5em; } + #resizable h3, #also h3 { text-align: center; margin: 0; } + #also { margin-top: 1em; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + alsoResize: '#also' + }); + $("#also").resizable(); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-header"> + <h3 class="ui-state-active">Resize</h3> +</div> + +<div id="also" class="ui-widget-content"> + <h3 class="ui-widget-header">will also resize</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Resize multiple elements simultaneously by clicking and dragging the sides of one. Pass a shared selector into the <code>alsoResize</code> option.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/textarea.html b/fannie/src/jquery/development-bundle/demos/resizable/textarea.html new file mode 100644 index 000000000..2e6e42f9e --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/textarea.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Textarea</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .ui-resizable-se { + bottom: 17px; + } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + handles: "se" + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<textarea id="resizable" rows="5" cols="20"></textarea> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Display only an outline of the element while resizing by setting the <code>helper</code> option to a CSS class.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/resizable/visual-feedback.html b/fannie/src/jquery/development-bundle/demos/resizable/visual-feedback.html new file mode 100644 index 000000000..44178423c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/resizable/visual-feedback.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Resizable - Visual feedback</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.resizable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #resizable { width: 150px; height: 150px; padding: 0.5em; } + #resizable h3 { text-align: center; margin: 0; } + .ui-resizable-ghost { border: 1px dotted gray; } + </style> + <script type="text/javascript"> + $(function() { + $("#resizable").resizable({ + ghost: true + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="resizable" class="ui-widget-content"> + <h3 class="ui-widget-header">Ghost</h3> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Instead of showing the actual element during resize, set the <code>ghost</code> option to true to show a semi-transparent part of the element.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/selectable/default.html b/fannie/src/jquery/development-bundle/demos/selectable/default.html new file mode 100644 index 000000000..f7d6d8693 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/selectable/default.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Selectable - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.selectable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + + <style type="text/css"> + #feedback { font-size: 1.4em; } + #selectable .ui-selecting { background: #FECA40; } + #selectable .ui-selected { background: #F39814; color: white; } + #selectable { list-style-type: none; margin: 0; padding: 0; width: 60%; } + #selectable li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; } + </style> + <script type="text/javascript"> + $(function() { + $("#selectable").selectable(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ol id="selectable"> + <li class="ui-widget-content">Item 1</li> + <li class="ui-widget-content">Item 2</li> + <li class="ui-widget-content">Item 3</li> + <li class="ui-widget-content">Item 4</li> + <li class="ui-widget-content">Item 5</li> + <li class="ui-widget-content">Item 6</li> + <li class="ui-widget-content">Item 7</li> +</ol> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Enable a DOM element (or group of elements) to be selectable. Draw a box with your cursor to select items. Hold down the Ctrl key to make multiple non-adjacent selections. </p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/selectable/display-grid.html b/fannie/src/jquery/development-bundle/demos/selectable/display-grid.html new file mode 100644 index 000000000..654a68d5b --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/selectable/display-grid.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Selectable - Display as grid</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.selectable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + + <style type="text/css"> + #feedback { font-size: 1.4em; } + #selectable .ui-selecting { background: #FECA40; } + #selectable .ui-selected { background: #F39814; color: white; } + #selectable { list-style-type: none; margin: 0; padding: 0; } + #selectable li { margin: 3px; padding: 1px; float: left; width: 100px; height: 80px; font-size: 4em; text-align: center; } + </style> + <script type="text/javascript"> + $(function() { + $("#selectable").selectable(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ol id="selectable"> + <li class="ui-state-default">1</li> + <li class="ui-state-default">2</li> + <li class="ui-state-default">3</li> + <li class="ui-state-default">4</li> + <li class="ui-state-default">5</li> + <li class="ui-state-default">6</li> + <li class="ui-state-default">7</li> + <li class="ui-state-default">8</li> + <li class="ui-state-default">9</li> + <li class="ui-state-default">10</li> + <li class="ui-state-default">11</li> + <li class="ui-state-default">12</li> +</ol> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>To arrange selectable items as a grid, give them identical dimensions and float them using CSS.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/selectable/index.html b/fannie/src/jquery/development-bundle/demos/selectable/index.html new file mode 100644 index 000000000..19ef9b1fa --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/selectable/index.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Selectable Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="serialize.html">Serialize</a></li> + <li><a href="display-grid.html">Display as grid</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/selectable/serialize.html b/fannie/src/jquery/development-bundle/demos/selectable/serialize.html new file mode 100644 index 000000000..9744944a5 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/selectable/serialize.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Selectable - Serialize</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.selectable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + + <style type="text/css"> + #feedback { font-size: 1.4em; } + #selectable .ui-selecting { background: #FECA40; } + #selectable .ui-selected { background: #F39814; color: white; } + #selectable { list-style-type: none; margin: 0; padding: 0; width: 60%; } + #selectable li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; } + </style> + <script type="text/javascript"> + $(function() { + $("#selectable").selectable({ + stop: function(){ + var result = $("#select-result").empty(); + $(".ui-selected", this).each(function(){ + var index = $("#selectable li").index(this); + result.append(" #" + (index + 1)); + }); + } + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<p id="feedback"> +You've selected: <span id="select-result">none</span>. +</p> + +<ol id="selectable"> + <li class="ui-widget-content">Item 1</li> + <li class="ui-widget-content">Item 2</li> + <li class="ui-widget-content">Item 3</li> + <li class="ui-widget-content">Item 4</li> + <li class="ui-widget-content">Item 5</li> + <li class="ui-widget-content">Item 6</li> +</ol> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Write a function that fires on the <code>stop</code> event to collect the index values of selected items. Present values as feedback, or pass as a data string.</p> + +</div><!-- End demo-description --> +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/show/default.html b/fannie/src/jquery/development-bundle/demos/show/default.html new file mode 100644 index 000000000..24bbba6ec --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/show/default.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - Show Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.blind.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.bounce.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.clip.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.drop.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.explode.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.fold.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.highlight.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.pulsate.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.scale.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.shake.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.slide.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.transfer.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; } + #button { padding: .5em 1em; text-decoration: none; } + #effect { width: 240px; height: 135px; padding: 0.4em; position: relative; } + #effect h3 { margin: 0; padding: 0.4em; text-align: center; } + .ui-effects-transfer { border: 2px dotted gray; } + </style> + <script type="text/javascript"> + $(function() { + + //run the currently selected effect + function runEffect(){ + //get effect type from + var selectedEffect = $('#effectTypes').val(); + + //most effect types need no options passed by default + var options = {}; + //check if it's scale, transfer, or size - they need options explicitly set + if(selectedEffect == 'scale'){ options = {percent: 100}; } + else if(selectedEffect == 'transfer'){ options = { to: "#button", className: 'ui-effects-transfer' }; } + else if(selectedEffect == 'size'){ options = { to: {width: 280,height: 185} }; } + + //run the effect + $("#effect").show(selectedEffect,options,500,callback); + }; + + //callback function to bring a hidden box back + function callback(){ + setTimeout(function(){ + $("#effect:visible").removeAttr('style').hide().fadeOut(); + }, 1000); + }; + + //set effect from select menu value + $("#button").click(function() { + runEffect(); + return false; + }); + + $("#effect").hide(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="ui-widget-content ui-corner-all"> + <h3 class="ui-widget-header ui-corner-all">Show</h3> + <p> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. + </p> + </div> +</div> + +<select name="effects" id="effectTypes"> + <option value="blind">Blind</option> + <option value="bounce">Bounce</option> + <option value="clip">Clip</option> + <option value="drop">Drop</option> + <option value="explode">Explode</option> + <option value="fold">Fold</option> + <option value="highlight">Highlight</option> + <option value="puff">Puff</option> + <option value="pulsate">Pulsate</option> + <option value="scale">Scale</option> + <option value="shake">Shake</option> + <option value="size">Size</option> + <option value="slide">Slide</option> + <option value="transfer">Transfer</option> +</select> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/show/index.html b/fannie/src/jquery/development-bundle/demos/show/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/show/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/colorpicker.html b/fannie/src/jquery/development-bundle/demos/slider/colorpicker.html new file mode 100644 index 000000000..121249e22 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/colorpicker.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Colorpicker</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #red, #green, #blue { + float: left; + clear: left; + width: 300px; + margin: 15px; + } + #swatch { + width: 120px; + height: 100px; + margin-top: 18px; + margin-left: 350px; + background-image: none; + } + #red .ui-slider-range { background: #ef2929; } + #red .ui-slider-handle { border-color: #ef2929; } + #green .ui-slider-range { background: #8ae234; } + #green .ui-slider-handle { border-color: #8ae234; } + #blue .ui-slider-range { background: #729fcf; } + #blue .ui-slider-handle { border-color: #729fcf; } + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + function hexFromRGB (r, g, b) { + var hex = [ + r.toString(16), + g.toString(16), + b.toString(16) + ]; + $.each(hex, function (nr, val) { + if (val.length == 1) { + hex[nr] = '0' + val; + } + }); + return hex.join('').toUpperCase(); + } + function refreshSwatch() { + var red = $("#red").slider("value") + ,green = $("#green").slider("value") + ,blue = $("#blue").slider("value") + ,hex = hexFromRGB(red, green, blue); + $("#swatch").css("background-color", "#" + hex); + } + $(function() { + $("#red, #green, #blue").slider({ + orientation: 'horizontal', + range: "min", + max: 255, + value: 127, + slide: refreshSwatch, + change: refreshSwatch + }); + $("#red").slider("value", 255); + $("#green").slider("value", 140); + $("#blue").slider("value", 60); + }); + </script> +</head> +<body class="ui-widget-content" style="border:0;"> + +<div class="demo"> + +<p class="ui-state-default ui-corner-all ui-helper-clearfix" style="padding:4px;"> +<span class="ui-icon ui-icon-pencil" style="float:left; margin:-2px 5px 0 0;"></span> +Simple Colorpicker +</p> + +<div id="red"></div> +<div id="green"></div> +<div id="blue"></div> + +<div id="swatch" class="ui-widget-content ui-corner-all"></div> + +</div><!-- End demo --> + +<div class="demo-description" style="clear:left;"> + +<p>Combine three sliders to create a simple RGB colorpicker.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/default.html b/fannie/src/jquery/development-bundle/demos/slider/default.html new file mode 100644 index 000000000..d63086b4d --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/default.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; } + </style> + <script type="text/javascript"> + $(function() { + $("#slider").slider(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="slider"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>The basic slider is horizontal and has a single handle that can be moved with the mouse or by using the arrow keys.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/hotelrooms.html b/fannie/src/jquery/development-bundle/demos/slider/hotelrooms.html new file mode 100644 index 000000000..02f8b772f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/hotelrooms.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Range with fixed minimum</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + var select = $("#minbeds"); + var slider = $('<div id="slider"></div>').insertAfter(select).slider({ + min: 1, + max: 6, + range: "min", + value: select[0].selectedIndex + 1, + slide: function(event, ui) { + select[0].selectedIndex = ui.value - 1; + } + }); + $("#minbeds").click(function() { + slider.slider("value", this.selectedIndex + 1); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<form id="reservation"> + <label for="minbeds">Minimum number of beds</label> + <select name="minbeds" id="minbeds"> + <option>1</option> + <option>2</option> + <option>3</option> + <option>4</option> + <option>5</option> + <option>6</option> + </select> +</form> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>How to bind a slider to an existing select element. The select stays visible to display the change. When the select is changed, the slider is updated, too.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/index.html b/fannie/src/jquery/development-bundle/demos/slider/index.html new file mode 100644 index 000000000..ec9a2f4f3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/index.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="steps.html">Snap to increments</a></li> + <li><a href="range.html">Range slider</a></li> + <li><a href="rangemin.html">Range with fixed minimum</a></li> + <li><a href="hotelrooms.html">Room reservation</a></li> + <li><a href="rangemax.html">Range with fixed maximum</a></li> + <li><a href="slider-vertical.html">Vertical slider</a></li> + <li><a href="range-vertical.html">Vertical range slider</a></li> + <li><a href="multiple-vertical.html">Multiple sliders</a></li> + <li><a href="colorpicker.html">Simple colorpicker</a></li> + <li><a href="side-scroll.html">Simple scrollbar</a></li> + <li><a href="tabs.html">Slider controls tabs</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/multiple-vertical.html b/fannie/src/jquery/development-bundle/demos/slider/multiple-vertical.html new file mode 100644 index 000000000..62d0b1634 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/multiple-vertical.html @@ -0,0 +1,77 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Multiple sliders</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; } + #eq span { + height:120px; float:left; margin:15px + } + </style> + <script type="text/javascript"> + $(function() { + // setup master volume + $("#master").slider({ + value: 60, + orientation: "horizontal", + range: "min", + animate: true + }); + // setup graphic EQ + $("#eq > span").each(function() { + // read initial values from markup and remove that + var value = parseInt($(this).text()); + $(this).empty().slider({ + value: value, + range: "min", + animate: true, + orientation: "vertical" + }); + }); + }); + </script> +</head> +<body class="ui-widget-content" style="border:0;"> + +<div class="demo"> + +<p class="ui-state-default ui-corner-all ui-helper-clearfix" style="padding:4px;"> +<span class="ui-icon ui-icon-volume-on" style="float:left; margin:-2px 5px 0 0;"></span> +Master volume +</p> + +<div id="master" style="width:260px; margin:15px;"></div> + +<p class="ui-state-default ui-corner-all" style="padding:4px;margin-top:4em;"> +<span class="ui-icon ui-icon-signal" style="float:left; margin:-2px 5px 0 0;"></span> +Graphic EQ +</p> + +<div id="eq"> + <span>88</span> + <span>77</span> + <span>55</span> + <span>33</span> + <span>40</span> + <span>45</span> + <span>70</span> +</div> + +</div><!-- End demo --> + +<div class="demo-description" style="clear:left;"> + +<p>Combine horizontal and vertical sliders, each with their own options, to create the UI for a music player.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/range-vertical.html b/fannie/src/jquery/development-bundle/demos/slider/range-vertical.html new file mode 100644 index 000000000..70fbb47b3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/range-vertical.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Vertical range slider</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + $("#slider-range").slider({ + orientation: "vertical", + range: true, + values: [17, 67], + slide: function(event, ui) { + $("#amount").val('$' + ui.values[0] + ' - $' + ui.values[1]); + } + }); + $("#amount").val('$' + $("#slider-range").slider("values", 0) + ' - $' + $("#slider-range").slider("values", 1)); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p> +<label for="amount">Target sales goal (Millions):</label> +<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" /> +</p> + +<div id="slider-range" style="height:250px;"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Change the orientation of the range slider to vertical. Assign a height value via <code>.height()</code> or by setting the height through CSS, and set the <code>orientation</code> option to "vertical."</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/range.html b/fannie/src/jquery/development-bundle/demos/slider/range.html new file mode 100644 index 000000000..be4e19af4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/range.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Range slider</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + $("#slider-range").slider({ + range: true, + min: 0, + max: 500, + values: [75, 300], + slide: function(event, ui) { + $("#amount").val('$' + ui.values[0] + ' - $' + ui.values[1]); + } + }); + $("#amount").val('$' + $("#slider-range").slider("values", 0) + ' - $' + $("#slider-range").slider("values", 1)); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p> +<label for="amount">Price range:</label> +<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" /> +</p> + +<div id="slider-range"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Set the <code>range</code> option to true to capture a range of values with two drag handles. The space between the handles is filled with a different background color to indicate those values are selected.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/rangemax.html b/fannie/src/jquery/development-bundle/demos/slider/rangemax.html new file mode 100644 index 000000000..b4f4e1e08 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/rangemax.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Range with fixed maximum</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + $("#slider-range-max").slider({ + range: "max", + min: 1, + max: 10, + value: 2, + slide: function(event, ui) { + $("#amount").val(ui.value); + } + }); + $("#amount").val($("#slider-range-max").slider("value")); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p> +<labe for="amount">Minimum number of bedrooms:</label> +<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" /> +</p> +<div id="slider-range-max"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Fix the maximum value of the range slider so that the user can only select a minimum. Set the <code>range</code> option to "max."</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/rangemin.html b/fannie/src/jquery/development-bundle/demos/slider/rangemin.html new file mode 100644 index 000000000..4f146824a --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/rangemin.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Range with fixed minimum</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + $("#slider-range-min").slider({ + range: "min", + value: 37, + min: 1, + max: 700, + slide: function(event, ui) { + $("#amount").val('$' + ui.value); + } + }); + $("#amount").val('$' + $("#slider-range-min").slider("value")); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p> +<label for="amount">Maximum price:</label> +<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" /> +</p> + +<div id="slider-range-min"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Fix the minimum value of the range slider so that the user can only select a maximum. Set the <code>range</code> option to "min."</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/side-scroll.html b/fannie/src/jquery/development-bundle/demos/slider/side-scroll.html new file mode 100644 index 000000000..fe5599bee --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/side-scroll.html @@ -0,0 +1,138 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Slider scrollbar</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; } + .scroll-pane { overflow: auto; width: 99%; float:left; } + .scroll-content { width: 2440px; float: left; } + .scroll-content-item { width: 100px; height: 100px; float: left; margin: 10px; font-size: 3em; line-height: 96px; text-align: center; } + * html .scroll-content-item { display: inline; } /* IE6 float double margin bug */ + .scroll-bar-wrap { clear: left; padding: 0 4px 0 2px; margin: 0 -1px -1px -1px; } + .scroll-bar-wrap .ui-slider { background: none; border:0; height: 2em; margin: 0 auto; } + .scroll-bar-wrap .ui-handle-helper-parent { position: relative; width: 100%; height: 100%; margin: 0 auto; } + .scroll-bar-wrap .ui-slider-handle { top:.2em; height: 1.5em; } + .scroll-bar-wrap .ui-slider-handle .ui-icon { margin: -8px auto 0; position: relative; top: 50%; } + </style> + <script type="text/javascript"> + $(function() { + //scrollpane parts + var scrollPane = $('.scroll-pane'); + var scrollContent = $('.scroll-content'); + + //build slider + var scrollbar = $(".scroll-bar").slider({ + slide:function(e, ui){ + if( scrollContent.width() > scrollPane.width() ){ scrollContent.css('margin-left', Math.round( ui.value / 100 * ( scrollPane.width() - scrollContent.width() )) + 'px'); } + else { scrollContent.css('margin-left', 0); } + } + }); + + //append icon to handle + var handleHelper = scrollbar.find('.ui-slider-handle') + .mousedown(function(){ + scrollbar.width( handleHelper.width() ); + }) + .mouseup(function(){ + scrollbar.width( '100%' ); + }) + .append('<span class="ui-icon ui-icon-grip-dotted-vertical"></span>') + .wrap('<div class="ui-handle-helper-parent"></div>').parent(); + + //change overflow to hidden now that slider handles the scrolling + scrollPane.css('overflow','hidden'); + + //size scrollbar and handle proportionally to scroll distance + function sizeScrollbar(){ + var remainder = scrollContent.width() - scrollPane.width(); + var proportion = remainder / scrollContent.width(); + var handleSize = scrollPane.width() - (proportion * scrollPane.width()); + scrollbar.find('.ui-slider-handle').css({ + width: handleSize, + 'margin-left': -handleSize/2 + }); + handleHelper.width('').width( scrollbar.width() - handleSize); + } + + //reset slider value based on scroll content position + function resetValue(){ + var remainder = scrollPane.width() - scrollContent.width(); + var leftVal = scrollContent.css('margin-left') == 'auto' ? 0 : parseInt(scrollContent.css('margin-left')); + var percentage = Math.round(leftVal / remainder * 100); + scrollbar.slider("value", percentage); + } + //if the slider is 100% and window gets larger, reveal content + function reflowContent(){ + var showing = scrollContent.width() + parseInt( scrollContent.css('margin-left') ); + var gap = scrollPane.width() - showing; + if(gap > 0){ + scrollContent.css('margin-left', parseInt( scrollContent.css('margin-left') ) + gap); + } + } + + //change handle position on window resize + $(window) + .resize(function(){ + resetValue(); + sizeScrollbar(); + reflowContent(); + }); + //init scrollbar size + setTimeout(sizeScrollbar,10);//safari wants a timeout + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="scroll-pane ui-widget ui-widget-header ui-corner-all"> + <div class="scroll-content"> + <div class="scroll-content-item ui-widget-header">1</div> + <div class="scroll-content-item ui-widget-header">2</div> + <div class="scroll-content-item ui-widget-header">3</div> + <div class="scroll-content-item ui-widget-header">4</div> + <div class="scroll-content-item ui-widget-header">5</div> + <div class="scroll-content-item ui-widget-header">6</div> + <div class="scroll-content-item ui-widget-header">7</div> + <div class="scroll-content-item ui-widget-header">8</div> + <div class="scroll-content-item ui-widget-header">9</div> + <div class="scroll-content-item ui-widget-header">10</div> + <div class="scroll-content-item ui-widget-header">11</div> + <div class="scroll-content-item ui-widget-header">12</div> + <div class="scroll-content-item ui-widget-header">13</div> + <div class="scroll-content-item ui-widget-header">14</div> + <div class="scroll-content-item ui-widget-header">15</div> + <div class="scroll-content-item ui-widget-header">16</div> + <div class="scroll-content-item ui-widget-header">17</div> + <div class="scroll-content-item ui-widget-header">18</div> + <div class="scroll-content-item ui-widget-header">19</div> + <div class="scroll-content-item ui-widget-header">20</div> + </div> + <div class="scroll-bar-wrap ui-widget-content ui-corner-bottom"> + <div class="scroll-bar"></div> + </div> +</div> + + + +</div><!-- End demo --> + + + +<div class="demo-description"> + +<p>Use a slider to manipulate the positioning of content on the page. In this case, it acts as a scrollbar with the potential to capture values if needed.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/slider-vertical.html b/fannie/src/jquery/development-bundle/demos/slider/slider-vertical.html new file mode 100644 index 000000000..b6b4027b1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/slider-vertical.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Vertical slider</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + $("#slider-vertical").slider({ + orientation: "vertical", + range: "min", + min: 0, + max: 100, + value: 60, + slide: function(event, ui) { + $("#amount").val(ui.value); + } + }); + $("#amount").val($("#slider-vertical").slider("value")); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p> +<label for="amount">Volume:</label> +<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" /> +</p> + +<div id="slider-vertical" style="height:200px;"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Change the orientation of the slider to vertical. Assign a height value via <code>.height()</code> or by setting the height through CSS, and set the <code>orientation</code> option to "vertical."</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/steps.html b/fannie/src/jquery/development-bundle/demos/slider/steps.html new file mode 100644 index 000000000..66c84b0c3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/steps.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Snap to increments</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; }; + </style> + <script type="text/javascript"> + $(function() { + $("#slider").slider({ + value:100, + min: 0, + max: 500, + step: 50, + slide: function(event, ui) { + $("#amount").val('$' + ui.value); + } + }); + $("#amount").val('$' + $("#slider").slider("value")); + }); + </script> +</head> +<body> + +<div class="demo"> + +<p> +<label for="amount">Donation amount ($50 increments):</label> +<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" /> +</p> + +<div id="slider"></div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Increment slider values with the <code>step</code> option set to an integer, commonly a dividend of the slider's maximum value. The default increment is 1.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/slider/tabs.html b/fannie/src/jquery/development-bundle/demos/slider/tabs.html new file mode 100644 index 000000000..40916c46a --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/slider/tabs.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Slider - Snap to increments</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.slider.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #demo-frame > div.demo { padding: 10px !important; } + </style> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs({ + select: function(event, ui) { + $("#slider").slider("value", ui.index); + } + }); + $("#slider").slider({ + min: 0, + max: $("#tabs").tabs("length") - 1, + slide: function(event, ui) { + $("#tabs").tabs("select", ui.value); + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="slider" style="width:100px"></div> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Control tabs with a slider.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/connect-lists-through-tabs.html b/fannie/src/jquery/development-bundle/demos/sortable/connect-lists-through-tabs.html new file mode 100644 index 000000000..d432afe9c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/connect-lists-through-tabs.html @@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Connect lists with Tabs</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.droppable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable1, #sortable2").sortable().disableSelection(); + + var $tabs = $("#tabs").tabs(); + + var $tab_items = $("ul:first li",$tabs).droppable({ + accept: ".connectedSortable li", + hoverClass: "ui-state-hover", + drop: function(ev, ui) { + var $item = $(this); + var $list = $($item.find('a').attr('href')).find('.connectedSortable'); + + ui.draggable.hide('slow', function() { + $tabs.tabs('select', $tab_items.index($item)); + $(this).appendTo($list).show('slow'); + }); + } + }); + }); + </script> +</head> +<body> +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + </ul> + <div id="tabs-1"> + <ul id="sortable1" class="connectedSortable ui-helper-reset"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default">Item 2</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> + <li class="ui-state-default">Item 5</li> + </ul> + </div> + <div id="tabs-2"> + <ul id="sortable2" class="connectedSortable ui-helper-reset"> + <li class="ui-state-highlight">Item 1</li> + <li class="ui-state-highlight">Item 2</li> + <li class="ui-state-highlight">Item 3</li> + <li class="ui-state-highlight">Item 4</li> + <li class="ui-state-highlight">Item 5</li> + </ul> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Sort items from one list into another and vice versa, by dropping the list item on the appropriate tab above. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/connect-lists.html b/fannie/src/jquery/development-bundle/demos/sortable/connect-lists.html new file mode 100644 index 000000000..b08678d61 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/connect-lists.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Connect lists</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; } + #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable1, #sortable2").sortable({ + connectWith: '.connectedSortable' + }).disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ul id="sortable1" class="connectedSortable"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default">Item 2</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> + <li class="ui-state-default">Item 5</li> +</ul> + +<ul id="sortable2" class="connectedSortable"> + <li class="ui-state-highlight">Item 1</li> + <li class="ui-state-highlight">Item 2</li> + <li class="ui-state-highlight">Item 3</li> + <li class="ui-state-highlight">Item 4</li> + <li class="ui-state-highlight">Item 5</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Sort items from one list into another and vice versa, by passing a selector into + the <code>connectWith</code> option. The simplest way to do this is to + group all related lists with a CSS class, and then pass that class into the + sortable function (i.e., <code>connectWith: '.myclass'</code>). +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/default.html b/fannie/src/jquery/development-bundle/demos/sortable/default.html new file mode 100644 index 000000000..ab81a8bc0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/default.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; } + #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; } + #sortable li span { position: absolute; margin-left: -1.3em; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable").sortable(); + $("#sortable").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ul id="sortable"> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li> + <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Enable a group of DOM elements to be sortable. Click on and drag an + element to a new spot within the list, and the other items will adjust to + fit. By default, sortable items share <code>draggable</code> properties. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/delay-start.html b/fannie/src/jquery/development-bundle/demos/sortable/delay-start.html new file mode 100644 index 000000000..7afb6be37 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/delay-start.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Delay start</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; margin-bottom: 15px;zoom: 1; } + #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 95%; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable1").sortable({ + delay: 300 + }); + + $("#sortable2").sortable({ + distance: 15 + }); + + $("li").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<h3 class="docs">Time delay of 300ms:</h3> + +<ul id="sortable1"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default">Item 2</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> +</ul> + +<h3 class="docs">Distance delay of 15px:</h3> + +<ul id="sortable2"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default">Item 2</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Prevent accidental sorting either by delay (time) or distance. Set a number of + milliseconds the element needs to be dragged before sorting starts + with the <code>delay</code> option. Set a distance in pixels the element + needs to be dragged before sorting starts with the <code>distance</code> + option. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/display-grid.html b/fannie/src/jquery/development-bundle/demos/sortable/display-grid.html new file mode 100644 index 000000000..e90a38c25 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/display-grid.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Display as grid</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable { list-style-type: none; margin: 0; padding: 0; } + #sortable li { margin: 3px 3px 3px 0; padding: 1px; float: left; width: 100px; height: 90px; font-size: 4em; text-align: center; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable").sortable(); + $("#sortable").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ul id="sortable"> + <li class="ui-state-default">1</li> + <li class="ui-state-default">2</li> + <li class="ui-state-default">3</li> + <li class="ui-state-default">4</li> + <li class="ui-state-default">5</li> + <li class="ui-state-default">6</li> + <li class="ui-state-default">7</li> + <li class="ui-state-default">8</li> + <li class="ui-state-default">9</li> + <li class="ui-state-default">10</li> + <li class="ui-state-default">11</li> + <li class="ui-state-default">12</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + To arrange sortable items as a grid, give them identical dimensions and + float them using CSS. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/empty-lists.html b/fannie/src/jquery/development-bundle/demos/sortable/empty-lists.html new file mode 100644 index 000000000..b68ad5983 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/empty-lists.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Handle empty lists</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable1, #sortable2, #sortable3 { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; background: #eee; padding: 5px; width: 143px;} + #sortable1 li, #sortable2 li, #sortable3 li { margin: 5px; padding: 5px; font-size: 1.2em; width: 120px; } + </style> + <script type="text/javascript"> + $(function() { + $("ul.droptrue").sortable({ + connectWith: 'ul' + }); + + $("ul.dropfalse").sortable({ + connectWith: 'ul', + dropOnEmpty: false + }); + + $("#sortable1, #sortable2, #sortable3").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ul id="sortable1" class='droptrue'> + <li class="ui-state-default">Can be dropped..</li> + <li class="ui-state-default">..on an empty list</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> + <li class="ui-state-default">Item 5</li> +</ul> + +<ul id="sortable2" class='dropfalse'> + <li class="ui-state-highlight">Cannot be dropped..</li> + <li class="ui-state-highlight">..on an empty list</li> + <li class="ui-state-highlight">Item 3</li> + <li class="ui-state-highlight">Item 4</li> + <li class="ui-state-highlight">Item 5</li> +</ul> + +<ul id="sortable3" class='droptrue'> +</ul> + +<br clear="both" /> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Prevent all items in a list from being dropped into a separate, empty list + using the <code>dropOnEmpty</code> option set to <code>false</code>. By default, + sortable items can be dropped on empty lists. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/index.html b/fannie/src/jquery/development-bundle/demos/sortable/index.html new file mode 100644 index 000000000..9fa93801f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/index.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="placeholder.html">Drop placeholder</a></li> + <li><a href="connect-lists.html">Connect lists</a></li> + <li><a href="connect-lists-through-tabs.html">Connect lists through tabs</a></li> + <li><a href="empty-lists.html">Handle empty lists</a></li> + <li><a href="items.html">Include / exclude items</a></li> + <li><a href="delay-start.html">Delay start</a></li> + <li><a href="display-grid.html">Display as grid</a></li> + <li><a href="portlets.html">Portlets</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/items.html b/fannie/src/jquery/development-bundle/demos/sortable/items.html new file mode 100644 index 000000000..3f1cbb6c3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/items.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Include / exclude items</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; zoom: 1; } + #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 3px; width: 90%; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable1").sortable({ + items: 'li:not(.ui-state-disabled)' + }); + + $("#sortable2").sortable({ + cancel: '.ui-state-disabled' + }); + + $("#sortable1 li, #sortable2 li").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<h3 class="docs">Specify which items are sortable:</h3> + +<ul id="sortable1"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default ui-state-disabled">(I'm not sortable or a drop target)</li> + <li class="ui-state-default ui-state-disabled">(I'm not sortable or a drop target)</li> + <li class="ui-state-default">Item 4</li> +</ul> + +<h3 class="docs">Cancel sorting (but keep as drop targets):</h3> + +<ul id="sortable2"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default ui-state-disabled">(I'm not sortable)</li> + <li class="ui-state-default ui-state-disabled">(I'm not sortable)</li> + <li class="ui-state-default">Item 4</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Specify which items are eligible to sort by passing a jQuery selector into + the <code>items</code> option. Items excluded from this option are not + sortable, nor are they valid targets for sortable items. +</p> + +<p> + To only prevent sorting on certain items, pass a jQuery selector into the + <code>cancel</code> option. Cancelled items remain valid sort targets for + others. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/placeholder.html b/fannie/src/jquery/development-bundle/demos/sortable/placeholder.html new file mode 100644 index 000000000..d9c7e838c --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/placeholder.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Drop placeholder</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; } + #sortable li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; height: 1.5em; } + html>body #sortable li { height: 1.5em; line-height: 1.2em; } + .ui-state-highlight { height: 1.5em; line-height: 1.2em; } + </style> + <script type="text/javascript"> + $(function() { + $("#sortable").sortable({ + placeholder: 'ui-state-highlight' + }); + $("#sortable").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<ul id="sortable"> + <li class="ui-state-default">Item 1</li> + <li class="ui-state-default">Item 2</li> + <li class="ui-state-default">Item 3</li> + <li class="ui-state-default">Item 4</li> + <li class="ui-state-default">Item 5</li> + <li class="ui-state-default">Item 6</li> + <li class="ui-state-default">Item 7</li> +</ul> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + When dragging a sortable item to a new location, other items will make room + for the that item by shifting to allow white space between them. Pass a + class into the <code>placeholder</code> option to style that space to + be visible. Use the boolean <code>forcePlaceholderSize</code> option + to set dimensions on the placeholder. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/sortable/portlets.html b/fannie/src/jquery/development-bundle/demos/sortable/portlets.html new file mode 100644 index 000000000..fefef3d9f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/sortable/portlets.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Sortable - Portlets</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .column { width: 170px; float: left; padding-bottom: 100px; } + .portlet { margin: 0 1em 1em 0; } + .portlet-header { margin: 0.3em; padding-bottom: 4px; padding-left: 0.2em; } + .portlet-header .ui-icon { float: right; } + .portlet-content { padding: 0.4em; } + .ui-sortable-placeholder { border: 1px dotted black; visibility: visible !important; height: 50px !important; } + .ui-sortable-placeholder * { visibility: hidden; } + </style> + <script type="text/javascript"> + $(function() { + $(".column").sortable({ + connectWith: '.column' + }); + + $(".portlet").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") + .find(".portlet-header") + .addClass("ui-widget-header ui-corner-all") + .prepend('<span class="ui-icon ui-icon-minusthick"></span>') + .end() + .find(".portlet-content"); + + $(".portlet-header .ui-icon").click(function() { + $(this).toggleClass("ui-icon-minusthick").toggleClass("ui-icon-plusthick"); + $(this).parents(".portlet:first").find(".portlet-content").toggle(); + }); + + $(".column").disableSelection(); + }); + </script> +</head> +<body> +<div class="demo"> + +<div class="column"> + + <div class="portlet"> + <div class="portlet-header">Feeds</div> + <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div> + </div> + + <div class="portlet"> + <div class="portlet-header">News</div> + <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div> + </div> + +</div> + +<div class="column"> + + <div class="portlet"> + <div class="portlet-header">Shopping</div> + <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div> + </div> + +</div> + +<div class="column"> + + <div class="portlet"> + <div class="portlet-header">Links</div> + <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div> + </div> + + <div class="portlet"> + <div class="portlet-header">Images</div> + <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div> + </div> + +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> + Enable portlets (styled divs) as sortables and use the <code>connectWith</code> + option to allow sorting between columns. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/switchClass/default.html b/fannie/src/jquery/development-bundle/demos/switchClass/default.html new file mode 100644 index 000000000..bfb0c9c8b --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/switchClass/default.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - switchClass Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; position: relative;} + #button { padding: .5em 1em; text-decoration: none; } + #effect {position: relative; } + #effect.newClass { width: 240px; padding: 1em; letter-spacing: 0; font-size: 1.2em; } + #effect.anotherNewClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; } + </style> + <script type="text/javascript"> + $(function() { + $("#button").click(function(){ + $(".newClass").switchClass('newClass', 'anotherNewClass', 1000); + $(".anotherNewClass").switchClass('anotherNewClass', 'newClass', 1000); + return false; + }); + }); + </script> +</head> +<body> + +<div class="demo"> + + +<div class="toggler"> + <div id="effect" class="newClass ui-corner-all"> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. + </div> +</div> +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/switchClass/index.html b/fannie/src/jquery/development-bundle/demos/switchClass/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/switchClass/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/ajax.html b/fannie/src/jquery/development-bundle/demos/tabs/ajax.html new file mode 100644 index 000000000..efbdf590a --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/ajax.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Content via Ajax</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs({ + ajaxOptions: { + error: function(xhr, status, index, anchor) { + $(anchor.hash).html("Couldn't load this tab. We'll try to fix this as soon as possible. If this wouldn't be a demo."); + } + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Preloaded</a></li> + <li><a href="ajax/content1.html">Tab 1</a></li> + <li><a href="ajax/content2.html">Tab 2</a></li> + <li><a href="ajax/content3-slow.php">Tab 3 (slow)</a></li> + <li><a href="ajax/content4-broken.php">Tab 4 (broken)</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Fetch external content via Ajax for the tabs by setting an href value in the tab links. While the Ajax request is waiting for a response, the tab label changes to say "Loading...", then returns to the normal label once loaded.</p> + +<p>Tabs 3 and 4 demonstrate slow-loading and broken AJAX tabs, and how to handle serverside errors in those cases. Note: These two require a webserver to interpret PHP. They won't work from the filesystem.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/ajax/content1.html b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content1.html new file mode 100644 index 000000000..759bf134e --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content1.html @@ -0,0 +1,4 @@ +<p><strong>This content was loaded via ajax.</strong> +<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> +<p>Mauris vitae ante. Curabitur augue. Nulla purus nibh, lobortis ut, feugiat at, aliquam id, purus. Sed venenatis, lorem venenatis volutpat commodo, purus quam lacinia justo, mattis interdum pede pede a odio. Fusce nibh. Morbi nisl mauris, dapibus in, tristique eget, accumsan et, pede. Donec mauris risus, pulvinar ut, faucibus eu, mollis in, nunc. In augue massa, commodo a, cursus vehicula, varius eu, dui. Suspendisse sodales suscipit lorem. Morbi malesuada, eros quis condimentum dignissim, lectus nibh tristique urna, non bibendum diam massa vel risus. Morbi suscipit. Proin egestas, eros at scelerisque scelerisque, dolor lacus fringilla lacus, ut ullamcorper mi magna at quam. Aliquam sed elit. Aliquam turpis purus, congue quis, iaculis id, ullamcorper sit amet, justo. Maecenas sed mauris. Proin magna justo, interdum in, tincidunt eu, viverra eu, turpis. Suspendisse mollis. In magna. Phasellus pellentesque, urna pellentesque convallis pellentesque, augue sem blandit pede, at rhoncus libero nisl a odio.</p> +<p>Sed vitae nibh non magna semper tempor. Duis dolor. Nam congue laoreet arcu. Fusce lobortis enim quis ligula. Maecenas commodo odio id mi. Maecenas scelerisque tellus eu odio. Etiam dolor purus, lacinia a, imperdiet in, aliquam et, eros. In pellentesque. Nullam ac massa. Integer et turpis. Ut quam augue, congue non, imperdiet id, eleifend ac, nisi. Etiam ac arcu. Cras iaculis accumsan erat. Nullam vulputate sapien nec nisi pretium rhoncus. Aliquam a nibh. Vivamus est ante, fermentum a, tincidunt ut, imperdiet nec, velit. Aenean non tortor. Sed nec mauris eget tellus condimentum rutrum.</p> \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/demos/tabs/ajax/content2.html b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content2.html new file mode 100644 index 000000000..95c25dae0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content2.html @@ -0,0 +1,4 @@ +<p><strong>This other content was loaded via ajax.</strong> +<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec turpis justo, et facilisis ligula. In congue interdum odio, a scelerisque eros posuere ac. Aenean massa tellus, dictum sit amet laoreet ut, aliquam in orci. Duis eu aliquam ligula. Nullam vel placerat ligula. Fusce venenatis viverra dictum. Phasellus dui dolor, imperdiet in sodales at, mattis sed libero. Morbi ac ipsum ligula. Quisque suscipit dui vel diam pretium nec cursus lacus malesuada. Donec sollicitudin, eros eget dignissim mollis, risus leo feugiat tellus, vel posuere nisl ipsum eu erat. Quisque posuere lacinia imperdiet. Quisque nunc leo, elementum quis ultricies et, vehicula sit amet turpis. Nullam sed nunc nec nibh condimentum mattis. Quisque sed ligula sit amet nisi ultricies bibendum eget id nisi.</p> +<p>Proin ut erat vel nunc tincidunt commodo. Curabitur feugiat, nisi et vehicula viverra, nisl orci eleifend arcu, sed blandit lectus nisl quis nisi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aenean rutrum gravida velit ac imperdiet. Integer vitae arcu risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tincidunt orci at leo egestas porta. Vivamus ac augue et enim bibendum hendrerit ut id urna. Donec sollicitudin pulvinar turpis vitae scelerisque. Etiam tempor porttitor est sed blandit. Phasellus varius consequat leo eget tincidunt. Aliquam ac dui lectus. In et consectetur orci. Duis posuere nulla ac turpis faucibus vestibulum. Sed ut velit et dolor rhoncus dapibus. Sed sit amet pellentesque est.</p> +<p>Nam in volutpat orci. Morbi sit amet orci in erat egestas dignissim. Etiam mi sapien, tempus sed iaculis a, adipiscing quis tellus. Suspendisse potenti. Nam malesuada tristique vestibulum. In tempor tellus dignissim neque consectetur eu vestibulum nisl pellentesque. Phasellus ultrices cursus velit, id aliquam nisl fringilla quis. Cras varius elit sed urna ultrices congue. Sed ornare odio sed velit pellentesque id varius nisl sodales. Sed auctor ligula egestas mi pharetra ut consectetur erat pharetra.</p> \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/demos/tabs/ajax/content3-slow.php b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content3-slow.php new file mode 100644 index 000000000..9e50dc3ac --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content3-slow.php @@ -0,0 +1,7 @@ +<?php +sleep(1); +?> +<p><strong>This content was loaded via ajax, though it took a second.</strong> +<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec turpis justo, et facilisis ligula. In congue interdum odio, a scelerisque eros posuere ac. Aenean massa tellus, dictum sit amet laoreet ut, aliquam in orci. Duis eu aliquam ligula. Nullam vel placerat ligula. Fusce venenatis viverra dictum. Phasellus dui dolor, imperdiet in sodales at, mattis sed libero. Morbi ac ipsum ligula. Quisque suscipit dui vel diam pretium nec cursus lacus malesuada. Donec sollicitudin, eros eget dignissim mollis, risus leo feugiat tellus, vel posuere nisl ipsum eu erat. Quisque posuere lacinia imperdiet. Quisque nunc leo, elementum quis ultricies et, vehicula sit amet turpis. Nullam sed nunc nec nibh condimentum mattis. Quisque sed ligula sit amet nisi ultricies bibendum eget id nisi.</p> +<p>Proin ut erat vel nunc tincidunt commodo. Curabitur feugiat, nisi et vehicula viverra, nisl orci eleifend arcu, sed blandit lectus nisl quis nisi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aenean rutrum gravida velit ac imperdiet. Integer vitae arcu risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tincidunt orci at leo egestas porta. Vivamus ac augue et enim bibendum hendrerit ut id urna. Donec sollicitudin pulvinar turpis vitae scelerisque. Etiam tempor porttitor est sed blandit. Phasellus varius consequat leo eget tincidunt. Aliquam ac dui lectus. In et consectetur orci. Duis posuere nulla ac turpis faucibus vestibulum. Sed ut velit et dolor rhoncus dapibus. Sed sit amet pellentesque est.</p> +<p>Nam in volutpat orci. Morbi sit amet orci in erat egestas dignissim. Etiam mi sapien, tempus sed iaculis a, adipiscing quis tellus. Suspendisse potenti. Nam malesuada tristique vestibulum. In tempor tellus dignissim neque consectetur eu vestibulum nisl pellentesque. Phasellus ultrices cursus velit, id aliquam nisl fringilla quis. Cras varius elit sed urna ultrices congue. Sed ornare odio sed velit pellentesque id varius nisl sodales. Sed auctor ligula egestas mi pharetra ut consectetur erat pharetra.</p> \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/demos/tabs/ajax/content4-broken.php b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content4-broken.php new file mode 100644 index 000000000..55ea2fe9f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/ajax/content4-broken.php @@ -0,0 +1,3 @@ +<?php +header("HTTP/1.0 404 Not Found"); +?> \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/demos/tabs/bottom.html b/fannie/src/jquery/development-bundle/demos/tabs/bottom.html new file mode 100644 index 000000000..c4ab31329 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/bottom.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Tabs at bottom</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs(); + $(".tabs-bottom .ui-tabs-nav, .tabs-bottom .ui-tabs-nav > *") + .removeClass("ui-corner-all ui-corner-top") + .addClass("ui-corner-bottom"); + }); + </script> + <style> + #tabs { height: 200px; } + .tabs-bottom { position: relative; } + .tabs-bottom .ui-tabs-panel { height: 140px; overflow: auto; } + .tabs-bottom .ui-tabs-nav { position: absolute !important; left: 0; bottom: 0; right:0; padding: 0 0.2em 0.2em 0; } + .tabs-bottom .ui-tabs-nav li { margin-top: -2px !important; margin-bottom: 1px !important; border-top: none; border-bottom-width: 1px; } + .ui-tabs-selected { margin-top: -3px !important; } + </style> +</head> +<body> + +<div class="demo"> + +<div id="tabs" class="tabs-bottom"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>With some additional CSS (for positioning) and JS (to put the right classes on elements) the tabs can be placed below their content.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/collapsible.html b/fannie/src/jquery/development-bundle/demos/tabs/collapsible.html new file mode 100644 index 000000000..7a638e295 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/collapsible.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Collapse content</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs({ + collapsible: true + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p><strong>Click this tab again to close the content pane.</strong></p> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p><strong>Click this tab again to close the content pane.</strong></p> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p><strong>Click this tab again to close the content pane.</strong></p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the selected tab to toggle its content closed/open. To enable this functionality, set the <code>collapsible</code> option to true.</p> + +<pre><code>collapsible: true +</code></pre> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/cookie.html b/fannie/src/jquery/development-bundle/demos/tabs/cookie.html new file mode 100644 index 000000000..638ee37f2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/cookie.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../external/jquery.cookie.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs({ + cookie: { + // store cookie for a day, without, it would be a session cookie + expires: 1 + } + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Looks the same as the default demo, but uses cookie to store the selected tab, and restore it when the page (re)loads. + +The cookie is stored for a day, so tabs will be restored even after closing the browser. Use cookie: {} for using cookies with default options.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/default.html b/fannie/src/jquery/development-bundle/demos/tabs/default.html new file mode 100644 index 000000000..7b01cc8b4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/default.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Default functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs(); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click tabs to swap between content that is broken into logical sections.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/index.html b/fannie/src/jquery/development-bundle/demos/tabs/index.html new file mode 100644 index 000000000..8fc417a4f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/index.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + <li><a href="ajax.html">Content via Ajax</a></li> + <li><a href="mouseover.html">Open on mouseover</a></li> + <li><a href="collapsible.html">Collapse content</a></li> + <li><a href="sortable.html">Sortable</a></li> + <li><a href="manipulation.html">Simple manipulation</a></li> + <li><a href="bottom.html">Tabs below content</a></li> + <li><a href="cookie.html">Cookie persistence</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/manipulation.html b/fannie/src/jquery/development-bundle/demos/tabs/manipulation.html new file mode 100644 index 000000000..ec143d52a --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/manipulation.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Simple manipulation</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.button.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.dialog.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + #dialog label, #dialog input { display:block; } + #dialog label { margin-top: 0.5em; } + #dialog input, #dialog textarea { width: 95%; } + #tabs { margin-top: 1em; } + #tabs li .ui-icon-close { float: left; margin: 0.4em 0.2em 0 0; cursor: pointer; } + #add_tab { cursor: pointer; } + </style> + <script type="text/javascript"> + $(function() { + var $tab_title_input = $('#tab_title'), $tab_content_input = $('#tab_content'); + var tab_counter = 2; + + // tabs init with a custom tab template and an "add" callback filling in the content + var $tabs = $('#tabs').tabs({ + tabTemplate: '<li><a href="#{href}">#{label}</a> <span class="ui-icon ui-icon-close">Remove Tab</span></li>', + add: function(event, ui) { + var tab_content = $tab_content_input.val() || 'Tab '+tab_counter+' content.'; + $(ui.panel).append('<p>'+tab_content+'</p>'); + } + }); + + // modal dialog init: custom buttons and a "close" callback reseting the form inside + var $dialog = $('#dialog').dialog({ + autoOpen: false, + modal: true, + buttons: { + 'Add': function() { + addTab(); + $(this).dialog('close'); + }, + 'Cancel': function() { + $(this).dialog('close'); + } + }, + open: function() { + $tab_title_input.focus(); + }, + close: function() { + $form[0].reset(); + } + }); + + // addTab form: calls addTab function on submit and closes the dialog + var $form = $('form',$dialog).submit(function() { + addTab(); + $dialog.dialog('close'); + return false; + }); + + // actual addTab function: adds new tab using the title input from the form above + function addTab() { + var tab_title = $tab_title_input.val() || 'Tab '+tab_counter; + $tabs.tabs('add', '#tabs-'+tab_counter, tab_title); + tab_counter++; + } + + // addTab button: just opens the dialog + $('#add_tab') + .button() + .click(function() { + $dialog.dialog('open'); + }); + + // close icon: removing the tab on click + // note: closable tabs gonna be an option in the future - see http://dev.jqueryui.com/ticket/3924 + $('#tabs span.ui-icon-close').live('click', function() { + var index = $('li',$tabs).index($(this).parent()); + $tabs.tabs('remove', index); + }); + }); + </script> +</head> +<body> + +<div class="demo"> + + <div id="dialog" title="Tab data"> + <form> + <fieldset class="ui-helper-reset"> + <label for="tab_title">Title</label> + <input type="text" name="tab_title" id="tab_title" value="" class="ui-widget-content ui-corner-all" /> + <label for="tab_content">Content</label> + <textarea name="tab_content" id="tab_content" class="ui-widget-content ui-corner-all"></textarea> + </fieldset> + </form> + </div> + + <button id="add_tab">Add Tab</button> + + <div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a> <span class="ui-icon ui-icon-close">Remove Tab</span></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + </div> + +</div><!-- End demo --> + +<div class="demo-description"> + <p>Simple tabs adding and removing.</p> +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/mouseover.html b/fannie/src/jquery/development-bundle/demos/tabs/mouseover.html new file mode 100644 index 000000000..30233d61e --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/mouseover.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Open on mouseover</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs({ + event: 'mouseover' + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Toggle sections open/closed on mouseover with the <code>event</code> option. The default value for event is "click."</p> + +<pre><code>event: 'mouseover' +</code></pre> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/sortable.html b/fannie/src/jquery/development-bundle/demos/tabs/sortable.html new file mode 100644 index 000000000..e57f41309 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/sortable.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Sortable</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.mouse.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.sortable.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs().find(".ui-tabs-nav").sortable({axis:'x'}); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p> +Drag the tabs above to re-order them. +<p> + +<p> +Making tabs sortable is as simple as calling + +<code>.sortable()</code> + +on the + +<code>.ui-tabs-nav</code> + +element. +</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/tabs/vertical.html b/fannie/src/jquery/development-bundle/demos/tabs/vertical.html new file mode 100644 index 000000000..e13cd8290 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/tabs/vertical.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Tabs - Vertical Tabs functionality</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script> + <script type="text/javascript" src="../../ui/jquery.ui.tabs.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <script type="text/javascript"> + $(function() { + $("#tabs").tabs().addClass('ui-tabs-vertical ui-helper-clearfix'); + $("#tabs li").removeClass('ui-corner-top').addClass('ui-corner-left'); + }); + </script> + <style type="text/css"> + +/* Vertical Tabs +----------------------------------*/ +.ui-tabs-vertical { width: 55em; } +.ui-tabs-vertical .ui-tabs-nav { padding: .2em .1em .2em .2em; float: left; width: 12em; } +.ui-tabs-vertical .ui-tabs-nav li { clear: left; width: 100%; border-bottom-width: 1px !important; border-right-width: 0 !important; margin: 0 -1px .2em 0; } +.ui-tabs-vertical .ui-tabs-nav li a { display:block; } +.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 0; padding-right: .1em; border-right-width: 1px; border-right-width: 1px; } +.ui-tabs-vertical .ui-tabs-panel { padding: 1em; float: right; width: 40em;} + </style> +</head> +<body> + +<div class="demo"> + +<div id="tabs"> + <ul> + <li><a href="#tabs-1">Nunc tincidunt</a></li> + <li><a href="#tabs-2">Proin dolor</a></li> + <li><a href="#tabs-3">Aenean lacinia</a></li> + </ul> + <div id="tabs-1"> + <h2>Content heading 1</h2> + <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p> + </div> + <div id="tabs-2"> + <h2>Content heading 2</h2> + <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> + </div> + <div id="tabs-3"> + <h2>Content heading 3</h2> + <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> + <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> + </div> +</div> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click tabs to swap between content that is broken into logical sections.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/toggle/default.html b/fannie/src/jquery/development-bundle/demos/toggle/default.html new file mode 100644 index 000000000..3659a64e8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/toggle/default.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - Toggle Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.blind.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.bounce.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.clip.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.drop.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.explode.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.fold.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.highlight.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.pulsate.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.scale.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.shake.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.slide.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.transfer.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; } + #button { padding: .5em 1em; text-decoration: none; } + #effect { width: 240px; height: 135px; padding: 0.4em; position: relative; } + #effect h3 { margin: 0; padding: 0.4em; text-align: center; } + .ui-effects-transfer { border: 2px dotted gray; } + </style> + <script type="text/javascript"> + $(function() { + //run the currently selected effect + function runEffect(){ + //get effect type from + var selectedEffect = $('#effectTypes').val(); + + //most effect types need no options passed by default + var options = {}; + //check if it's scale, transfer, or size - they need options explicitly set + if(selectedEffect == 'scale'){ options = {percent: 0}; } + else if(selectedEffect == 'size'){ options = { to: {width: 200,height: 60} }; } + + //run the effect + $("#effect").toggle(selectedEffect,options,500); + }; + + //set effect from select menu value + $("#button").click(function() { + runEffect(); + return false; + }); + + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="ui-widget-content ui-corner-all"> + <h3 class="ui-widget-header ui-corner-all">Toggle</h3> + <p> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. + </p> + </div> +</div> + +<select name="effects" id="effectTypes"> + <option value="blind">Blind</option> + <option value="bounce">Bounce</option> + <option value="clip">Clip</option> + <option value="drop">Drop</option> + <option value="explode">Explode</option> + <option value="fold">Fold</option> + <option value="highlight">Highlight</option> + <option value="puff">Puff</option> + <option value="pulsate">Pulsate</option> + <option value="scale">Scale</option> + <option value="shake">Shake</option> + <option value="size">Size</option> + <option value="slide">Slide</option> + <option value="transfer">Transfer</option> +</select> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/toggle/index.html b/fannie/src/jquery/development-bundle/demos/toggle/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/toggle/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/toggleClass/default.html b/fannie/src/jquery/development-bundle/demos/toggleClass/default.html new file mode 100644 index 000000000..b679c96b7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/toggleClass/default.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects - toggleClass Demo</title> + <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" /> + <script type="text/javascript" src="../../jquery-1.4.2.js"></script> + <script type="text/javascript" src="../../ui/jquery.effects.core.js"></script> + <link type="text/css" href="../demos.css" rel="stylesheet" /> + <style type="text/css"> + .toggler { width: 500px; height: 200px; position: relative;} + #button { padding: .5em 1em; text-decoration: none; } + #effect {position: relative; width: 240px; padding: 1em; letter-spacing: 0; font-size: 1.2em; border: 1px solid #000; background: #eee; color: #333; } + #effect.newClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; } + </style> + <script type="text/javascript"> + $(function() { + $("#button").click(function() { + $('#effect').toggleClass('newClass', 1000); + return false; + }); + }); + </script> +</head> +<body> + +<div class="demo"> + +<div class="toggler"> + <div id="effect" class="newClass ui-corner-all"> + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. + </div> +</div> + +<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a> + +</div><!-- End demo --> + +<div class="demo-description"> + +<p>Click the button above to preview the effect.</p> + +</div><!-- End demo-description --> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/demos/toggleClass/index.html b/fannie/src/jquery/development-bundle/demos/toggleClass/index.html new file mode 100644 index 000000000..0e9af371f --- /dev/null +++ b/fannie/src/jquery/development-bundle/demos/toggleClass/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <title>jQuery UI Effects Demos</title> + <link type="text/css" href="../demos.css" rel="stylesheet" /> +</head> +<body> + +<div class="demos-nav"> + <h4>Examples</h4> + <ul> + <li class="demo-config-on"><a href="default.html">Default functionality</a></li> + </ul> +</div> + +</body> +</html> diff --git a/fannie/src/jquery/development-bundle/docs/accordion.html b/fannie/src/jquery/development-bundle/docs/accordion.html new file mode 100644 index 000000000..d0c0270ce --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/accordion.html @@ -0,0 +1,977 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Accordion</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>Make the selected elements Accordion widgets. Semantic requirements:</p> +<p>The markup of your accordion container needs pairs of headers and content panels:</p> +<pre>&lt;div id=&quot;accordion&quot;&gt; + &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;First header&lt;/a&gt;&lt;/h3&gt; + &lt;div&gt;First content&lt;/div&gt; + &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Second header&lt;/a&gt;&lt;/h3&gt; + &lt;div&gt;Second content&lt;/div&gt; +&lt;/div&gt;</pre> +<p>If you use a different element for the header, specify the header-option with an appropriate selector, eg. header: 'a.header'. The content element must be always next to its header.</p> +<p>If you have links inside the accordion content and use a-elements as headers, add a class to them and use that as the header, eg. header: 'a.header'.</p> +<p>Use activate(Number) to change the active content programmatically.</p> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Accordion?section=1" title="Edit section: NOTE: If you want multiple sections open at once, don't use an accordion">edit</a>]</div><a name="NOTE:_If_you_want_multiple_sections_open_at_once.2C_don.27t_use_an_accordion"></a><h4>NOTE: If you want multiple sections open at once, don't use an accordion</h4> +<p>An accordion doesn't allow more than one content panel to be open at the same time, and it takes a lot of effort to do that. If you are looking for a widget that allows more than one content panel to be open, don't use this. Usually it can be written with a few lines of jQuery instead, something like this:</p> +<pre>jQuery(document).ready(function(){ + $('.accordion .head').click(function() { + $(this).next().toggle(); + return false; + }).next().hide(); +});</pre> +<p>Or animated:</p> +<pre>jQuery(document).ready(function(){ + $('.accordion .head').click(function() { + $(this).next().toggle('slow'); + return false; + }).next().hide(); +});</pre> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li>UI Effects Core (Optional - only for non-default animations)</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="310"> +A simple jQuery UI Accordion.<br /> +</p> +<pre>$(&quot;#accordion&quot;).accordion(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#accordion&quot;).accordion(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;accordion&quot;&gt; + &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 1&lt;/a&gt;&lt;/h3&gt; + &lt;div&gt; + &lt;p&gt; + Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer + ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit + amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut + odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. + &lt;/p&gt; + &lt;/div&gt; + &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 2&lt;/a&gt;&lt;/h3&gt; + &lt;div&gt; + &lt;p&gt; + Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet + purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor + velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In + suscipit faucibus urna. + &lt;/p&gt; + &lt;/div&gt; + &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 3&lt;/a&gt;&lt;/h3&gt; + &lt;div&gt; + &lt;p&gt; + Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. + Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero + ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis + lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. + &lt;/p&gt; + &lt;ul&gt; + &lt;li&gt;List item one&lt;/li&gt; + &lt;li&gt;List item two&lt;/li&gt; + &lt;li&gt;List item three&lt;/li&gt; + &lt;/ul&gt; + &lt;/div&gt; + &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 4&lt;/a&gt;&lt;/h3&gt; + &lt;div&gt; + &lt;p&gt; + Cras dictum. Pellentesque habitant morbi tristique senectus et netus + et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in + faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia + mauris vel est. + &lt;/p&gt; + &lt;p&gt; + Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per + inceptos himenaeos. + &lt;/p&gt; + &lt;/div&gt; +&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the accordion. Can be set when initialising (first creating) the accordion.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).accordion( "option", "disabled" ); +//setter +$( ".selector" ).accordion( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-active"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-active">active</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, Element, jQuery, Boolean, Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">first child</dd> + + </dl> + </div> + <div class="option-description"> + <p>Selector for the active element. Set to false to display none at start. Needs <code>collapsible: true</code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>active</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ active: 2 });</code></pre> +</dd> + + +<dt> + Get or set the <code>active</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var active = $( ".selector" ).accordion( "option", "active" ); +//setter +$( ".selector" ).accordion( "option", "active", 2 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-animated"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-animated">animated</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'slide'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Choose your favorite animation, or disable them (set to false). In addition to the default, 'bounceslide' and all defined easing methods are supported ('bounceslide' requires UI Effects Core).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>animated</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ animated: 'bounceslide' });</code></pre> +</dd> + + +<dt> + Get or set the <code>animated</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var animated = $( ".selector" ).accordion( "option", "animated" ); +//setter +$( ".selector" ).accordion( "option", "animated", 'bounceslide' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-autoHeight"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-autoHeight">autoHeight</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set, the highest content part is used as height reference for all other parts. Provides more consistent animations.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>autoHeight</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ autoHeight: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>autoHeight</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var autoHeight = $( ".selector" ).accordion( "option", "autoHeight" ); +//setter +$( ".selector" ).accordion( "option", "autoHeight", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-clearStyle"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-clearStyle">clearStyle</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set, clears height and overflow styles after finishing animations. This enables accordions to work with dynamic content. Won't work together with autoHeight.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>clearStyle</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ clearStyle: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>clearStyle</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var clearStyle = $( ".selector" ).accordion( "option", "clearStyle" ); +//setter +$( ".selector" ).accordion( "option", "clearStyle", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-collapsible"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-collapsible">collapsible</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether all the sections can be closed at once. Allows collapsing the active section by the triggering event (click is the default).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>collapsible</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ collapsible: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>collapsible</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var collapsible = $( ".selector" ).accordion( "option", "collapsible" ); +//setter +$( ".selector" ).accordion( "option", "collapsible", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-event"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-event">event</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'click'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The event on which to trigger the accordion.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>event</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ event: 'mouseover' });</code></pre> +</dd> + + +<dt> + Get or set the <code>event</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var event = $( ".selector" ).accordion( "option", "event" ); +//setter +$( ".selector" ).accordion( "option", "event", 'mouseover' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-fillSpace"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-fillSpace">fillSpace</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set, the accordion completely fills the height of the parent element. Overrides autoheight.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>fillSpace</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ fillSpace: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>fillSpace</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var fillSpace = $( ".selector" ).accordion( "option", "fillSpace" ); +//setter +$( ".selector" ).accordion( "option", "fillSpace", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-header"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-header">header</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, jQuery</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'&gt; li &gt;&nbsp;:first-child,&gt;&nbsp;:not(li):even'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Selector for the header element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>header</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ header: 'h3' });</code></pre> +</dd> + + +<dt> + Get or set the <code>header</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var header = $( ".selector" ).accordion( "option", "header" ); +//setter +$( ".selector" ).accordion( "option", "header", 'h3' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-icons"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-icons">icons</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Object</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">{ 'header': 'ui-icon-triangle-1-e', 'headerSelected': 'ui-icon-triangle-1-s' }</dd> + + </dl> + </div> + <div class="option-description"> + <p>Icons to use for headers. Icons may be specified for 'header' and 'headerSelected', and we recommend using the icons native to the jQuery UI CSS Framework manipulated by <a href="http://www.themeroller.com" class="external text" title="http://www.themeroller.com">jQuery UI ThemeRoller</a></p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>icons</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ icons: { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } });</code></pre> +</dd> + + +<dt> + Get or set the <code>icons</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var icons = $( ".selector" ).accordion( "option", "icons" ); +//setter +$( ".selector" ).accordion( "option", "icons", { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-navigation"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-navigation">navigation</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set, looks for the anchor that matches location.href and activates it. Great for href-based state-saving. Use navigationFilter to implement your own matcher.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>navigation</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ navigation: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>navigation</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var navigation = $( ".selector" ).accordion( "option", "navigation" ); +//setter +$( ".selector" ).accordion( "option", "navigation", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-navigationFilter"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-navigationFilter">navigationFilter</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default"> </dd> + + </dl> + </div> + <div class="option-description"> + <p>Overwrite the default location.href-matching with your own matcher.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a accordion with the <code>navigationFilter</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).accordion({ navigationFilter: function(){ ... } });</code></pre> +</dd> + + +<dt> + Get or set the <code>navigationFilter</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var navigationFilter = $( ".selector" ).accordion( "option", "navigationFilter" ); +//setter +$( ".selector" ).accordion( "option", "navigationFilter", function(){ ... } );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-change"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-change">change</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">accordionchange</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered every time the accordion changes. If the accordion is animated, the event will be triggered upon completion of the animation; otherwise, it is triggered immediately. +</p> +<pre>$('.ui-accordion').bind('accordionchange', function(event, ui) { + ui.newHeader // jQuery object, activated header + ui.oldHeader // jQuery object, previous header + ui.newContent // jQuery object, activated content + ui.oldContent // jQuery object, previous content +});</pre></p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>change</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).accordion({ + change: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>change</code> event by type: <code>accordionchange</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;accordionchange&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + +<p> +<li class="event" id="event-changestart"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-changestart">changestart</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">accordionchangestart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered every time the accordion starts to change. +</p> +<pre>$('.ui-accordion').bind('accordionchangestart', function(event, ui) { + ui.newHeader // jQuery object, activated header + ui.oldHeader // jQuery object, previous header + ui.newContent // jQuery object, activated content + ui.oldContent // jQuery object, previous content +});</pre></p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>changestart</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).accordion({ + changestart: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>changestart</code> event by type: <code>accordionchangestart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;accordionchangestart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the accordion functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + +<p> +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the accordion.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the accordion.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any accordion option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple accordion options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-accordion element.</p> + </div> +</li> + + +<li class="method" id="method-activate"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-activate">activate</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "activate" + +, index + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Activate a content part of the Accordion programmatically. The index can be a zero-indexed number to match the position of the header to close or a Selector matching an element. Pass <code>false</code> to close all (only possible with <code>collapsible:true</code>).</p> + </div> +</li> + + +<li class="method" id="method-resize"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-resize">resize</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.accordion( "resize" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Recompute heights of the accordion contents when using the fillSpace option and the container height changed. For example, when the container is a resizable, this method should be called by its resize-event.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Accordion plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.accordion.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class="<strong>ui-accordion</strong> ui-widget ui-helper-reset"&gt;<br /> +&nbsp;&nbsp;&lt;h3 class="<strong>ui-accordion-header</strong> ui-helper-reset ui-state-active ui-corner-top"&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="ui-icon ui-icon-triangle-1-s"/&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#"&gt;Section 1&lt;/a&gt;<br /> +&nbsp;&nbsp;&lt;/h3&gt;<br /> +&nbsp;&nbsp;&lt;div class="<strong>ui-accordion-content</strong> ui-helper-reset ui-widget-content ui-corner-bottom <strong>ui-accordion-content-active</strong>"&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;Section 1 content<br /> +&nbsp;&nbsp;&lt;/div&gt;<br /> +&nbsp;&nbsp;&lt;h3 class="<strong>ui-accordion-header</strong> ui-helper-reset ui-state-default ui-corner-all"&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="ui-icon ui-icon-triangle-1-e"/&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#"&gt;Section 2&lt;/a&gt;<br /> +&nbsp;&nbsp;&lt;/h3&gt;<br /> +&nbsp;&nbsp;&lt;div class="<strong>ui-accordion-content</strong> ui-helper-reset ui-widget-content ui-corner-bottom"&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;Section 2 content<br /> +&nbsp;&nbsp;&lt;/div&gt;<br /> +&nbsp;&nbsp;&lt;h3 class="<strong>ui-accordion-header</strong> ui-helper-reset ui-state-default ui-corner-all"&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="ui-icon ui-icon-triangle-1-e"/&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#"&gt;Section 3&lt;/a&gt;<br /> +&nbsp;&nbsp;&lt;/h3&gt;<br /> +&nbsp;&nbsp;&lt;div class="<strong>ui-accordion-content</strong> ui-helper-reset ui-widget-content ui-corner-bottom"&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;Section 3 content<br /> +&nbsp;&nbsp;&lt;/div&gt;<br /> +&lt;/div&gt;<br /> + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the accordion plugin, not markup you should use to create a accordion. The only markup needed for that is <br />&lt;div&gt;<br /> +&#160;&#160;&#160;&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 1&lt;/a&gt;&lt;/h3&gt;<br /> +&#160;&#160;&#160;&lt;div&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;Section 1 content<br /> +&#160;&#160;&#160;&lt;/div&gt;<br /> +&#160;&#160;&#160;&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 2&lt;/a&gt;&lt;/h3&gt;<br /> +&#160;&#160;&#160;&lt;div&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;Section 2 content<br /> +&#160;&#160;&#160;&lt;/div&gt;<br /> +&#160;&#160;&#160;&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 3&lt;/a&gt;&lt;/h3&gt;<br /> +&#160;&#160;&#160;&lt;div&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;Section 3 content<br /> +&#160;&#160;&#160;&lt;/div&gt;<br /> +&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 36551 bytes +Post-expand include size: 61985 bytes +Template argument size: 35253 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3773-1!1!0!!en!2 and timestamp 20100421180144 --> diff --git a/fannie/src/jquery/development-bundle/docs/addClass.html b/fannie/src/jquery/development-bundle/docs/addClass.html new file mode 100644 index 000000000..4996b9132 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/addClass.html @@ -0,0 +1,109 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI addClass</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/addClass?section=1" title="Edit section: addClass( class, [duration] )">edit</a>]</div><a name="addClass.28_class.2C_.5Bduration.5D_.29"></a><h3>addClass( class, <span class="optional">[</span>duration<span class="optional">]</span> )</h3> +<p>Adds the specified class to each of the set of matched elements with an optional transition between the states.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="100"> +Adds the class 'selected' to the matched elements with a one second transition.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">addClass</strong>(&quot;selected&quot;, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + p { cursor: pointer; font-size: 1.2em; } + .selected { color:red; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">addClass</strong>(&quot;selected&quot;, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + &lt;p&gt;Click me to add a 'selected' class.&lt;/p&gt; +&lt;p&gt;Click me to add a 'selected' class.&lt;/p&gt; +&lt;p&gt;Click me to add a 'selected' class.&lt;/p&gt; +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-class"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-class">class</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>One CSS class to add to the elements.</p> + </div> +</li> + + +<li class="option" id="option-duration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-duration">duration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 5208 bytes +Post-expand include size: 6765 bytes +Template argument size: 4231 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2606-1!1!0!!en!2 and timestamp 20100421131608 --> diff --git a/fannie/src/jquery/development-bundle/docs/animate.html b/fannie/src/jquery/development-bundle/docs/animate.html new file mode 100644 index 000000000..9fb8c32c1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/animate.html @@ -0,0 +1,77 @@ +<p>The jQuery UI effects core extends the <a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a> function to be able to animate colors as well. It's heavily used by the class transition feature and it's able to color animate the following properties: +</p> +<ul><li> <b>backgroundColor</b> +</li><li> <b>borderBottomColor</b> +</li><li> <b>borderLeftColor</b> +</li><li> <b>borderRightColor</b> +</li><li> <b>borderTopColor</b> +</li><li> <b>color</b> +</li><li> <b>outlineColor</b> +</li></ul> +<p>with one of the following combinations: +</p> +<ul><li> <b>hex (#FF0000)</b> +</li><li> <b>rgb (rgb(255,255,255))</b> +</li><li> <b>names ("black")</b> +</li></ul> +<p><br /> +</p><p><div class="options list"><table class="options examples" cellspacing="0"><thead><tr><th>Name</th><th>Type</th></tr></thead><tbody> +</table><b class="options">Example:</b><table class="options examples" cellspacing="0"><thead><tr><th>Name</th><th>Type</th></tr></thead><tbody> +<div class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<div id="demo" class="tabs-container" rel="125"> +A simple color animation.<br /> +</p> +<pre>$(&quot;.block&quot;).<a href="http://docs.jquery.com/Events/toggle" title="Events/toggle">toggle</a>(function() { + $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;black&quot; }, 1000); +},function() { + $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;#68BFEF&quot; }, 500); +}); + +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "<a href="http://www.w3.org/TR/html4/loose.dtd" class="external free" title="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt; +&lt;html&gt; +&lt;head&gt; + &lt;script src="<a href="http://code.jquery.com/jquery-latest.js" class="external free" title="http://code.jquery.com/jquery-latest.js">http://code.jquery.com/jquery-latest.js</a>"&gt;&lt;/script&gt; + + &lt;script src=&quot;http://jqueryui.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function(){ + $(&quot;.block&quot;).<a href="http://docs.jquery.com/Events/toggle" title="Events/toggle">toggle</a>(function() { + $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;black&quot; }, 1000); +},function() { + $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;#68BFEF&quot; }, 500); +}); + + }); + &lt;/script&gt; + &lt;style&gt; + .block { + color: white; + background-color: #68BFEF; + width: 150px; + height: 70px; + margin: 10px; + } + &lt;/style&gt; +&lt;/head&gt; +&lt;body&gt; + &lt;div class=&quot;block&quot;&gt; Click me&lt;/div&gt; +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> +</p><p></tbody></table></div> +</p><!-- +Pre-expand include size: 3730 bytes +Post-expand include size: 5382 bytes +Template argument size: 3450 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3094-1!1!0!!en!2 and timestamp 20100421092229 --> diff --git a/fannie/src/jquery/development-bundle/docs/autocomplete.html b/fannie/src/jquery/development-bundle/docs/autocomplete.html new file mode 100644 index 000000000..8416e7727 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/autocomplete.html @@ -0,0 +1,710 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Autocomplete</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>Autocomplete, when added to an input field, enables users to quickly find and select from a pre-populated list of values as they type, leveraging searching and filtering.</p> +<p>By giving an Autocomplete field focus or entering something into it, the plugin starts searching for entries that match and displays a list of values to choose from. By entering more characters, the user can filter down the list to better matches.</p> +<p>This can be used to enter previous selected values, for example you could use Autocomplete for entering tags, to complete an address, you could enter a city name and get the zip code, or maybe enter email addresses from an address book.</p> +<p>You can pull data in from a local and/or a remote source: Local is good for small data sets (like an address book with 50 entries), remote is necessary for big data sets, like a database with hundreds or millions of entries to select from.</p> +<p>Autocomplete can be customized to work with various data sources, by just specifying the source option. A data source can be:</p> +<ul> +<li>an Array with local data</li> +<li>a String, specifying a URL</li> +<li>a Callback</li> +</ul> +<p>The local data can be a simple Array of Strings, or it contains Objects for each item in the array, with either a label or value property or both. The label property is displayed in the suggestion menu. The value will be inserted into the input element after the user selected something from the menu. If just one property is specified, it will be used for both, eg. if you provide only value-properties, the value will also be used as the label.</p> +<p>When a String is used, the Autocomplete plugin expects that string to point to a URL resource that will return JSON data. It can be on the same host or on a different one (must provide JSONP). The request parameter "term" gets added to that URL. The data itself can be in the same format as the local data described above.</p> +<p>The third variation, the callback, provides the most flexibility, and can be used to connect any data source to Autocomplete. The callback gets two arguments:</p> +<ul> +<li>A request object, with a single property called "term", which refers to the value currently in the text input. For example, when the user entered "new yo" in a city field, the Autocomplete term will equal "new yo".</li> +<li>A response callback, which expects a single argument to contain the data to suggest to the user. This data should be filtered based on the provided term, and can be in any of the formats described above for simple local data (String-Array or Object-Array with label/value/both properties).</li> +</ul> +<p>The demos all focus on different variations of the source-option - look for the one that matches your use case, and take a look at the code.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li>UI Widget</li> +<li>UI Position</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="300"> +A simple jQuery UI Autocomplete.<br /> +</p> +<pre>$(&quot;input#autocomplete&quot;).autocomplete({ + source: [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;] +}); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;input#autocomplete&quot;).autocomplete({ + source: [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;] +}); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;input id=&quot;autocomplete&quot; /&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the autocomplete. Can be set when initialising (first creating) the autocomplete.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a autocomplete with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).autocomplete({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).autocomplete( "option", "disabled" ); +//setter +$( ".selector" ).autocomplete( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-delay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-delay">delay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">300</dd> + + </dl> + </div> + <div class="option-description"> + <p>The delay in milliseconds the Autocomplete waits after a keystroke to activate itself. A zero-delay makes sense for local data (more responsive), but can produce a lot of load for remote data, while being less responsive.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a autocomplete with the <code>delay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).autocomplete({ delay: 0 });</code></pre> +</dd> + + +<dt> + Get or set the <code>delay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var delay = $( ".selector" ).autocomplete( "option", "delay" ); +//setter +$( ".selector" ).autocomplete( "option", "delay", 0 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minLength"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minLength">minLength</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>The minimum number of characters a user has to type before the Autocomplete activates. Zero is useful for local data with just a few items. Should be increased when there are a lot of items, where a single character would match a few thousand items.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a autocomplete with the <code>minLength</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).autocomplete({ minLength: 0 });</code></pre> +</dd> + + +<dt> + Get or set the <code>minLength</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minLength = $( ".selector" ).autocomplete( "option", "minLength" ); +//setter +$( ".selector" ).autocomplete( "option", "minLength", 0 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-source"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-source">source</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Array, Callback</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">none, must be specified</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines the data to use, must be specified. See Overview section for more details, and look at the various demos. +</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a autocomplete with the <code>source</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).autocomplete({ source: [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;] });</code></pre> +</dd> + + +<dt> + Get or set the <code>source</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var source = $( ".selector" ).autocomplete( "option", "source" ); +//setter +$( ".selector" ).autocomplete( "option", "source", [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;] );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-search"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-search">search</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">autocompletesearch</dd> + </dl> + </div> + <div class="event-description"> + <p>Before a request (source-option) is started, after minLength and delay are met. Can be canceled (return false), then no request will be started and no items suggested.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>search</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).autocomplete({ + search: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>search</code> event by type: <code>autocompletesearch</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletesearch&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-open"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-open">open</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">autocompleteopen</dd> + </dl> + </div> + <div class="event-description"> + <p>Triggered when the suggestion menu is opened.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>open</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).autocomplete({ + open: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>open</code> event by type: <code>autocompleteopen</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompleteopen&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-focus"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-focus">focus</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">autocompletefocus</dd> + </dl> + </div> + <div class="event-description"> + <p>Before focus is moved to an item (not selecting), ui.item refers to the focused item. The default action of focus is to replace the text field's value with the value of the focused item, though only if the focus event was triggered by a keyboard interaction. Canceling this event prevents the value from being updated, but does not prevent the menu item from being focused.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>focus</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).autocomplete({ + focus: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>focus</code> event by type: <code>autocompletefocus</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletefocus&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-select"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-select">select</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">autocompleteselect</dd> + </dl> + </div> + <div class="event-description"> + <p>Triggered when an item is selected from the menu; ui.item refers to the selected item. The default action of select is to replace the text field's value with the value of the selected item. Canceling this event prevents the value from being updated, but does not prevent the menu from closing.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>select</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).autocomplete({ + select: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>select</code> event by type: <code>autocompleteselect</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompleteselect&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-close"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-close">close</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">autocompleteclose</dd> + </dl> + </div> + <div class="event-description"> + <p>When the list is hidden - doesn't have to occur together with a change.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>close</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).autocomplete({ + close: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>close</code> event by type: <code>autocompleteclose</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompleteclose&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-change"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-change">change</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">autocompletechange</dd> + </dl> + </div> + <div class="event-description"> + <p>After an item was selected; ui.item refers to the selected item. Always triggered after the close event.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>change</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).autocomplete({ + change: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>change</code> event by type: <code>autocompletechange</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletechange&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the autocomplete functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the autocomplete.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the autocomplete.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any autocomplete option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple autocomplete options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-autocomplete element.</p> + </div> +</li> + + +<li class="method" id="method-search"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-search">search</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "search" + +, <span class="optional">[</span>value<span class="optional">] </span> + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Triggers a search event, which, when data is available, then will display the suggestions; can be used by a selectbox-like button to open the suggestions when clicked. If no value argument is specified, the current input's value is used. Can be called with an empty string and minLength: 0 to display all items.</p> + </div> +</li> + + +<li class="method" id="method-close"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-close">close</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.autocomplete( "close" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Close the Autocomplete menu. Useful in combination with the search method, to close the open menu.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Autocomplete plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.autocomplete.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;input class=&quot;ui-autocomplete-input&quot;/&gt;<br /> +&lt;ul class=&quot;ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all&quot;&gt;<br /> +&nbsp;&nbsp;&lt;li class=&quot;ui-menu-item&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;ui-corner-all&quot;&gt;item 1&lt;/a&gt;<br /> +&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&lt;li class=&quot;ui-menu-item&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;ui-corner-all&quot;&gt;item 2&lt;/a&gt;<br /> +&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&lt;li class=&quot;ui-menu-item&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;ui-corner-all&quot;&gt;item 3&lt;/a&gt;<br /> +&nbsp;&nbsp;&lt;/li&gt;<br /> +&lt;/ul&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the autocomplete plugin, not markup you should use to create a autocomplete. The only markup needed for that is &lt;input/&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 29839 bytes +Post-expand include size: 47753 bytes +Template argument size: 26499 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3766-1!1!0!!en!2 and timestamp 20100421092026 --> diff --git a/fannie/src/jquery/development-bundle/docs/button.html b/fannie/src/jquery/development-bundle/docs/button.html new file mode 100644 index 000000000..1296f7afc --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/button.html @@ -0,0 +1,460 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Button</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>Button enhances standard form elements like button, input of type submit or reset or anchors to themable buttons with appropiate mouseover and active styles.</p> +<p>In addition to basic push buttons, radio buttons and checkboxes (inputs of type radio and checkbox) can be converted to buttons: Their associated label is styled to appear as the button, while the underlying input is updated on click.</p> +<p>In order to group radio buttons, Button also provides an additional widget-method, called Buttonset. Its used by selecting a container element (which contains the radio buttons) and calling buttonset(). Buttonset will also provide visual grouping, and therefore should be used whenever you have a group of buttons. It works by selecting all descendents and applying button() to them. You can enable and disable a buttonset, which will enable and disable all contained buttons. Destroying a buttonset also calls the button's destroy method.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li>UI Widget</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="300"> +A simple jQuery UI Button.<br /> +</p> +<pre>$(&quot;button&quot;).button(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;button&quot;).button(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;button&gt;Button label&lt;/button&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> +<div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<div id="demo" class="tabs-container" rel="300"> +A simple jQuery UI Button.<br /> +</p> +<pre>$(&quot;#radio1&quot;).buttonset(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#radio1&quot;).buttonset(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;radio1&quot;&gt; + &lt;input type=&quot;radio&quot; id=&quot;radio1&quot; name=&quot;radio&quot; /&gt;&lt;label for=&quot;radio1&quot;&gt;Choice 1&lt;/label&gt; + &lt;input type=&quot;radio&quot; id=&quot;radio2&quot; name=&quot;radio&quot; checked=&quot;checked&quot; /&gt;&lt;label for=&quot;radio2&quot;&gt;Choice 2&lt;/label&gt; + &lt;input type=&quot;radio&quot; id=&quot;radio3&quot; name=&quot;radio&quot; /&gt;&lt;label for=&quot;radio3&quot;&gt;Choice 3&lt;/label&gt; +&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the button. Can be set when initialising (first creating) the button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a button with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).button({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).button( "option", "disabled" ); +//setter +$( ".selector" ).button( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-text"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-text">text</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether to show any text - when set to false (display no text), icons (see icons option) must be enabled, otherwise it'll be ignored.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a button with the <code>text</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).button({ text: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>text</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var text = $( ".selector" ).button( "option", "text" ); +//setter +$( ".selector" ).button( "option", "text", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-icons"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-icons">icons</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Options</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">{ primary: null, secondary: null }</dd> + + </dl> + </div> + <div class="option-description"> + <p>Icons to display, with or without text (see text option). The primary icon is displayed on the left of the label text, the secondary on the right. Value for the primary and secondary properties must be a classname (String), eg. "ui-icon-gear". For using only a primary icon: icons: {primary:'ui-icon-locked'}. For using both primary and secondary icon: icons: {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a button with the <code>icons</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).button({ icons: {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'} });</code></pre> +</dd> + + +<dt> + Get or set the <code>icons</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var icons = $( ".selector" ).button( "option", "icons" ); +//setter +$( ".selector" ).button( "option", "icons", {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'} );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-label"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-label">label</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">HTML content of the button, or value attribute</dd> + + </dl> + </div> + <div class="option-description"> + <p>Text to show on the button. When not specified (null), the element's html content is used, or its value attribute when it's an input element of type submit or reset; or the html content of the associated label element if its an input of type radio or checkbox</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a button with the <code>label</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).button({ label: "custom label" });</code></pre> +</dd> + + +<dt> + Get or set the <code>label</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var label = $( ".selector" ).button( "option", "label" ); +//setter +</p> +$( ".selector" ).button( "option", "label", "custom label" );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + <p>There are no events for this plugin.</p> + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the button functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + +<p> +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the button.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the button.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any button option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple button options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-button element.</p> + </div> +</li> + + +<li class="method" id="method-refresh"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-refresh">refresh</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.button( "refresh" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Refreshes the visual state of the button. Useful for updating button state after the native element's checked or disabled state is changed programatically.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Button plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.button.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;button class=&quot;<strong>ui-button ui-button-text-only</strong> ui-widget ui-state-default ui-corner-all&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;span class=&quot;<strong>ui-button-text</strong>&quot;&gt;Button Label&lt;/span&gt;<br />&lt;/button&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the button plugin, not markup you should use to create a button. The only markup needed for that is &lt;button&gt;Button Label&lt;/button&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 23021 bytes +Post-expand include size: 28995 bytes +Template argument size: 13372 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3767-1!1!0!!en!2 and timestamp 20100421091628 --> diff --git a/fannie/src/jquery/development-bundle/docs/datepicker.html b/fannie/src/jquery/development-bundle/docs/datepicker.html new file mode 100644 index 000000000..3cc969090 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/datepicker.html @@ -0,0 +1,2509 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Datepicker</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Datepicker is a highly configurable plugin that adds datepicker functionality to your pages. You can customize the date format and language, restrict the selectable date ranges and add in buttons and other navigation options easily.</p> +<p>By default, the datepicker calendar opens in a small overlay onFocus and closes automatically onBlur or when a date if selected. For an inline calendar, simply attach the datepicker to a div or span. +</p><p>You can use keyboard shortcuts to drive the datepicker: +</p> +<ul> + <li>page up/down - previous/next month</li> + <li>ctrl+page up/down - previous/next year</li> + <li>ctrl+home - current month or open when closed</li> + <li>ctrl+left/right - previous/next day</li> + <li>ctrl+up/down - previous/next week</li> + <li>enter - accept the selected date</li> + <li>ctrl+end - close and erase the date</li> + <li>escape - close the datepicker without selection</li> +</ul> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Datepicker?section=1" title="Edit section: Utility functions">edit</a>]</div><a name="Utility_functions"></a><h3 id="utility-functions">Utility functions</h3> +<ul> + <li><a href="http://docs.jquery.com/UI/Datepicker/setDefaults" title="UI/Datepicker/setDefaults">$.datepicker.setDefaults( settings )</a> - Set settings for all datepicker instances.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">$.datepicker.formatDate( format, date, settings )</a> - Format a date into a string value with a specified format.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/iso8601Week" title="UI/Datepicker/iso8601Week">$.datepicker.iso8601Week( date )</a> - Determine the week of the year for a given date: 1 to 53.</li> + <li><a href="http://docs.jquery.com/UI/Datepicker/parseDate" title="UI/Datepicker/parseDate">$.datepicker.parseDate( format, value, settings ) </a> - Extract a date from a string value with a specified format.</li> +</ul> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Datepicker?section=2" title="Edit section: Localization">edit</a>]</div><a name="Localization"></a><h3>Localization</h3> +<p>Datepicker provides support for localizing its content to cater for different languages + and date formats. Each localization is contained within its own file with the + language code appended to the name, e.g. <code>jquery.ui.datepicker-fr.js</code> for French. + These files are loaded after the main datepicker code. They add their settings to the set + of available localizations and automatically apply them as defaults for all instances.</p> +<p>The <code>$.datepicker.regional</code> attribute holds an array of localizations, + indexed by language code, with '' referring to the default (English). Each entry is + an object with the following attributes: <code>closeText</code>, <code>prevText</code>, + <code>nextText</code>, <code>currentText</code>, <code>monthNames</code>, + <code>monthNamesShort</code>, <code>dayNames</code>, <code>dayNamesShort</code>, + <code>dayNamesMin</code>, <code>weekHeader</code>, <code>dateFormat</code>, + <code>firstDay</code>, <code>isRTL</code>, <code>showMonthAfterYear</code>, + and <code>yearSuffix</code>.</p> +<p>You can restore the default localizations with:</p> +<p><code>$.datepicker.setDefaults($.datepicker.regional['']);</code> +</p> +<p>And can then override an individual datepicker for a specific locale:</p> +<p><code>$(selector).datepicker($.datepicker.regional['fr']);</code> +</p> +The localization files are also available in the UI svn: <a href="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/" class="external free" title="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/">http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/</a> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="220"> +A simple jQuery UI Datepicker.<br /> +</p> +<pre>$(&quot;#datepicker&quot;).datepicker(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#datepicker&quot;).datepicker(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div type=&quot;text&quot; id=&quot;datepicker&quot;&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the datepicker. Can be set when initialising (first creating) the datepicker.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).datepicker( "option", "disabled" ); +//setter +$( ".selector" ).datepicker( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-altField"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-altField">altField</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The jQuery selector for another field that is to be updated with the selected date from the datepicker. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-altFormat" title="UI/Datepicker">altFormat</a></code> setting to change the format of the date within this field. Leave as blank for no alternate field.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>altField</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ altField: '#actualDate' });</code></pre> +</dd> + + +<dt> + Get or set the <code>altField</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var altField = $( ".selector" ).datepicker( "option", "altField" ); +//setter +$( ".selector" ).datepicker( "option", "altField", '#actualDate' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-altFormat"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-altFormat">altFormat</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> to be used for the <code><a href="http://docs.jquery.com/UI/Datepicker#option-altField" title="UI/Datepicker">altField</a></code> option. This allows one date format to be shown to the user for selection purposes, while a different format is actually sent behind the scenes. For a full list of the possible formats see the <a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a> function</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>altFormat</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ altFormat: 'yy-mm-dd' });</code></pre> +</dd> + + +<dt> + Get or set the <code>altFormat</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var altFormat = $( ".selector" ).datepicker( "option", "altFormat" ); +//setter +$( ".selector" ).datepicker( "option", "altFormat", 'yy-mm-dd' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-appendText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-appendText">appendText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display after each date field, e.g. to show the required format.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>appendText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ appendText: '(yyyy-mm-dd)' });</code></pre> +</dd> + + +<dt> + Get or set the <code>appendText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var appendText = $( ".selector" ).datepicker( "option", "appendText" ); +//setter +$( ".selector" ).datepicker( "option", "appendText", '(yyyy-mm-dd)' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-autoSize"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-autoSize">autoSize</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set to true to automatically resize the input field to accomodate dates in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>autoSize</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ autoSize: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>autoSize</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var autoSize = $( ".selector" ).datepicker( "option", "autoSize" ); +//setter +$( ".selector" ).datepicker( "option", "autoSize", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttonImage"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttonImage">buttonImage</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The URL for the popup button image. If set, <code><a href="http://docs.jquery.com/UI/Datepicker#option-buttonText" title="UI/Datepicker">buttonText</a></code> becomes the <i>alt</i> value and is not directly displayed.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>buttonImage</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ buttonImage: '/images/datepicker.gif' });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttonImage</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttonImage = $( ".selector" ).datepicker( "option", "buttonImage" ); +//setter +$( ".selector" ).datepicker( "option", "buttonImage", '/images/datepicker.gif' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttonImageOnly"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttonImageOnly">buttonImageOnly</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set to true to place an image after the field to use as the trigger without it appearing on a button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>buttonImageOnly</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ buttonImageOnly: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttonImageOnly</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttonImageOnly = $( ".selector" ).datepicker( "option", "buttonImageOnly" ); +//setter +$( ".selector" ).datepicker( "option", "buttonImageOnly", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttonText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttonText">buttonText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'...'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display on the trigger button. Use in conjunction with <code><a href="http://docs.jquery.com/UI/Datepicker#option-showOn" title="UI/Datepicker">showOn</a></code> equal to 'button' or 'both'.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>buttonText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ buttonText: 'Choose' });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttonText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttonText = $( ".selector" ).datepicker( "option", "buttonText" ); +//setter +$( ".selector" ).datepicker( "option", "buttonText", 'Choose' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-calculateWeek"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-calculateWeek">calculateWeek</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">$.datepicker.iso8601Week</dd> + + </dl> + </div> + <div class="option-description"> + <p>A function to calculate the week of the year for a given date. The default implementation uses the ISO 8601 definition: weeks start on a Monday; the first week of the year contains the first Thursday of the year.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>calculateWeek</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ calculateWeek: myWeekCalc });</code></pre> +</dd> + + +<dt> + Get or set the <code>calculateWeek</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var calculateWeek = $( ".selector" ).datepicker( "option", "calculateWeek" ); +//setter +$( ".selector" ).datepicker( "option", "calculateWeek", myWeekCalc );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-changeMonth"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-changeMonth">changeMonth</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows you to change the month by selecting from a drop-down list. You can enable this feature by setting the attribute to true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>changeMonth</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ changeMonth: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>changeMonth</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var changeMonth = $( ".selector" ).datepicker( "option", "changeMonth" ); +//setter +$( ".selector" ).datepicker( "option", "changeMonth", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-changeYear"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-changeYear">changeYear</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows you to change the year by selecting from a drop-down list. You can enable this feature by setting the attribute to true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>changeYear</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ changeYear: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>changeYear</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var changeYear = $( ".selector" ).datepicker( "option", "changeYear" ); +//setter +$( ".selector" ).datepicker( "option", "changeYear", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-closeText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-closeText">closeText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Done'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the close link. This attribute is one of the regionalisation attributes. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-showButtonPanel" title="UI/Datepicker">showButtonPanel</a></code> to display this button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>closeText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ closeText: 'X' });</code></pre> +</dd> + + +<dt> + Get or set the <code>closeText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var closeText = $( ".selector" ).datepicker( "option", "closeText" ); +//setter +$( ".selector" ).datepicker( "option", "closeText", 'X' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-constrainInput"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-constrainInput">constrainInput</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true entry in the input field is constrained to those characters allowed by the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>constrainInput</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ constrainInput: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>constrainInput</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var constrainInput = $( ".selector" ).datepicker( "option", "constrainInput" ); +//setter +$( ".selector" ).datepicker( "option", "constrainInput", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-currentText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-currentText">currentText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Today'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the current day link. This attribute is one of the regionalisation attributes. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-showButtonPanel" title="UI/Datepicker">showButtonPanel</a></code> to display this button.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>currentText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ currentText: 'Now' });</code></pre> +</dd> + + +<dt> + Get or set the <code>currentText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var currentText = $( ".selector" ).datepicker( "option", "currentText" ); +//setter +$( ".selector" ).datepicker( "option", "currentText", 'Now' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dateFormat"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dateFormat">dateFormat</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'mm/dd/yy'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The format for parsed and displayed dates. This attribute is one of the regionalisation attributes. For a full list of the possible formats see the <code><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a></code> function.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dateFormat</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dateFormat: 'yy-mm-dd' });</code></pre> +</dd> + + +<dt> + Get or set the <code>dateFormat</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dateFormat = $( ".selector" ).datepicker( "option", "dateFormat" ); +//setter +$( ".selector" ).datepicker( "option", "dateFormat", 'yy-mm-dd' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dayNames"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dayNames">dayNames</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of long day names, starting from Sunday, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. They also appear as popup hints when hovering over the corresponding column headings. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dayNames</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>dayNames</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dayNames = $( ".selector" ).datepicker( "option", "dayNames" ); +//setter +$( ".selector" ).datepicker( "option", "dayNames", ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dayNamesMin"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dayNamesMin">dayNamesMin</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of minimised day names, starting from Sunday, for use as column headers within the datepicker. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dayNamesMin</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>dayNamesMin</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dayNamesMin = $( ".selector" ).datepicker( "option", "dayNamesMin" ); +//setter +$( ".selector" ).datepicker( "option", "dayNamesMin", ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dayNamesShort"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dayNamesShort">dayNamesShort</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of abbreviated day names, starting from Sunday, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>dayNamesShort</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>dayNamesShort</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dayNamesShort = $( ".selector" ).datepicker( "option", "dayNamesShort" ); +//setter +$( ".selector" ).datepicker( "option", "dayNamesShort", ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-defaultDate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-defaultDate">defaultDate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Date, Number, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the date to highlight on first opening if the field is blank. Specify either an actual date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null for today.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>defaultDate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ defaultDate: +7 });</code></pre> +</dd> + + +<dt> + Get or set the <code>defaultDate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var defaultDate = $( ".selector" ).datepicker( "option", "defaultDate" ); +//setter +$( ".selector" ).datepicker( "option", "defaultDate", +7 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-duration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-duration">duration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'normal'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Control the speed at which the datepicker appears, it may be a time in milliseconds or a string representing one of the three predefined speeds ("slow", "normal", "fast").</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>duration</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ duration: 'slow' });</code></pre> +</dd> + + +<dt> + Get or set the <code>duration</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var duration = $( ".selector" ).datepicker( "option", "duration" ); +//setter +$( ".selector" ).datepicker( "option", "duration", 'slow' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-firstDay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-firstDay">firstDay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the first day of the week: Sunday is 0, Monday is 1, ... This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>firstDay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ firstDay: 1 });</code></pre> +</dd> + + +<dt> + Get or set the <code>firstDay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var firstDay = $( ".selector" ).datepicker( "option", "firstDay" ); +//setter +$( ".selector" ).datepicker( "option", "firstDay", 1 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-gotoCurrent"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-gotoCurrent">gotoCurrent</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true the current day link moves to the currently selected date instead of today.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>gotoCurrent</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ gotoCurrent: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>gotoCurrent</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var gotoCurrent = $( ".selector" ).datepicker( "option", "gotoCurrent" ); +//setter +$( ".selector" ).datepicker( "option", "gotoCurrent", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-hideIfNoPrevNext"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-hideIfNoPrevNext">hideIfNoPrevNext</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Normally the previous and next links are disabled when not applicable (see <code><a href="http://docs.jquery.com/UI/Datepicker#option-minDate" title="UI/Datepicker">minDate</a></code>/<code><a href="http://docs.jquery.com/UI/Datepicker#option-maxDate" title="UI/Datepicker">maxDate</a></code>). You can hide them altogether by setting this attribute to true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>hideIfNoPrevNext</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ hideIfNoPrevNext: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>hideIfNoPrevNext</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var hideIfNoPrevNext = $( ".selector" ).datepicker( "option", "hideIfNoPrevNext" ); +//setter +$( ".selector" ).datepicker( "option", "hideIfNoPrevNext", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-isRTL"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-isRTL">isRTL</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>True if the current language is drawn from right to left. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>isRTL</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ isRTL: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>isRTL</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var isRTL = $( ".selector" ).datepicker( "option", "isRTL" ); +//setter +$( ".selector" ).datepicker( "option", "isRTL", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-maxDate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-maxDate">maxDate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Date, Number, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set a maximum selectable date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +1w'), or null for no limit.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>maxDate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ maxDate: '+1m +1w' });</code></pre> +</dd> + + +<dt> + Get or set the <code>maxDate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var maxDate = $( ".selector" ).datepicker( "option", "maxDate" ); +//setter +$( ".selector" ).datepicker( "option", "maxDate", '+1m +1w' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minDate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minDate">minDate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Date, Number, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set a minimum selectable date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '-1y -1m'), or null for no limit.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>minDate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ minDate: new Date(2007, 1 - 1, 1) });</code></pre> +</dd> + + +<dt> + Get or set the <code>minDate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minDate = $( ".selector" ).datepicker( "option", "minDate" ); +//setter +$( ".selector" ).datepicker( "option", "minDate", new Date(2007, 1 - 1, 1) );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-monthNames"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-monthNames">monthNames</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of full month names, as used in the month header on each datepicker and as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>monthNames</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ monthNames: ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>monthNames</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var monthNames = $( ".selector" ).datepicker( "option", "monthNames" ); +//setter +$( ".selector" ).datepicker( "option", "monthNames", ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-monthNamesShort"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-monthNamesShort">monthNamesShort</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']</dd> + + </dl> + </div> + <div class="option-description"> + <p>The list of abbreviated month names, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>monthNamesShort</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] });</code></pre> +</dd> + + +<dt> + Get or set the <code>monthNamesShort</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var monthNamesShort = $( ".selector" ).datepicker( "option", "monthNamesShort" ); +//setter +$( ".selector" ).datepicker( "option", "monthNamesShort", ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-navigationAsDateFormat"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-navigationAsDateFormat">navigationAsDateFormat</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true the <code><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a></code> function is applied to the <code><a href="http://docs.jquery.com/UI/Datepicker#option-prevText" title="UI/Datepicker">prevText</a></code>, <code><a href="http://docs.jquery.com/UI/Datepicker#option-nextText" title="UI/Datepicker">nextText</a></code>, and <code><a href="http://docs.jquery.com/UI/Datepicker#option-currentText" title="UI/Datepicker">currentText</a></code> values before display, allowing them to display the target month names for example.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>navigationAsDateFormat</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ navigationAsDateFormat: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>navigationAsDateFormat</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var navigationAsDateFormat = $( ".selector" ).datepicker( "option", "navigationAsDateFormat" ); +//setter +$( ".selector" ).datepicker( "option", "navigationAsDateFormat", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-nextText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-nextText">nextText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Next'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the next month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>nextText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ nextText: 'Later' });</code></pre> +</dd> + + +<dt> + Get or set the <code>nextText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var nextText = $( ".selector" ).datepicker( "option", "nextText" ); +//setter +$( ".selector" ).datepicker( "option", "nextText", 'Later' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-numberOfMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-numberOfMonths">numberOfMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number, Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set how many months to show at once. The value can be a straight integer, or can be a two-element array to define the number of rows and columns to display.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>numberOfMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ numberOfMonths: [2, 3] });</code></pre> +</dd> + + +<dt> + Get or set the <code>numberOfMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var numberOfMonths = $( ".selector" ).datepicker( "option", "numberOfMonths" ); +//setter +$( ".selector" ).datepicker( "option", "numberOfMonths", [2, 3] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-prevText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-prevText">prevText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Prev'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the previous month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>prevText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ prevText: 'Earlier' });</code></pre> +</dd> + + +<dt> + Get or set the <code>prevText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var prevText = $( ".selector" ).datepicker( "option", "prevText" ); +//setter +$( ".selector" ).datepicker( "option", "prevText", 'Earlier' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-selectOtherMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-selectOtherMonths">selectOtherMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true days in other months shown before or after the current month are selectable. This only applies if <code><a href="http://docs.jquery.com/UI/Datepicker#option-showOtherMonths" title="UI/Datepicker">showOtherMonths</a></code> is also true.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>selectOtherMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ selectOtherMonths: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>selectOtherMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var selectOtherMonths = $( ".selector" ).datepicker( "option", "selectOtherMonths" ); +//setter +$( ".selector" ).datepicker( "option", "selectOtherMonths", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-shortYearCutoff"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-shortYearCutoff">shortYearCutoff</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'+10'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the cutoff year for determining the century for a date (used in conjunction with <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> 'y'). If a numeric value (0-99) is provided then this value is used directly. If a string value is provided then it is converted to a number and added to the current year. Once the cutoff year is calculated, any dates entered with a year value less than or equal to it are considered to be in the current century, while those greater than it are deemed to be in the previous century.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>shortYearCutoff</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ shortYearCutoff: 50 });</code></pre> +</dd> + + +<dt> + Get or set the <code>shortYearCutoff</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var shortYearCutoff = $( ".selector" ).datepicker( "option", "shortYearCutoff" ); +//setter +$( ".selector" ).datepicker( "option", "shortYearCutoff", 50 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showAnim"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showAnim">showAnim</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'show'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set the name of the animation used to show/hide the datepicker. Use 'show' (the default), 'slideDown', 'fadeIn', any of the show/hide <a href="http://docs.jquery.com/UI/Effects" class="external text" title="http://docs.jquery.com/UI/Effects">jQuery UI effects</a>, or '' for no animation.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showAnim</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showAnim: 'fold' });</code></pre> +</dd> + + +<dt> + Get or set the <code>showAnim</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showAnim = $( ".selector" ).datepicker( "option", "showAnim" ); +//setter +$( ".selector" ).datepicker( "option", "showAnim", 'fold' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showButtonPanel"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showButtonPanel">showButtonPanel</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether to show the button panel.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showButtonPanel</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showButtonPanel: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showButtonPanel</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showButtonPanel = $( ".selector" ).datepicker( "option", "showButtonPanel" ); +//setter +$( ".selector" ).datepicker( "option", "showButtonPanel", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showCurrentAtPos"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showCurrentAtPos">showCurrentAtPos</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specify where in a <a href="http://docs.jquery.com/UI/Datepicker#option-numberOfMonths" title="UI/Datepicker">multi-month</a> display the current month shows, starting from 0 at the top/left.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showCurrentAtPos</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showCurrentAtPos: 3 });</code></pre> +</dd> + + +<dt> + Get or set the <code>showCurrentAtPos</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showCurrentAtPos = $( ".selector" ).datepicker( "option", "showCurrentAtPos" ); +//setter +$( ".selector" ).datepicker( "option", "showCurrentAtPos", 3 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showMonthAfterYear"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showMonthAfterYear">showMonthAfterYear</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether to show the month after the year in the header.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showMonthAfterYear</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showMonthAfterYear: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showMonthAfterYear</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showMonthAfterYear = $( ".selector" ).datepicker( "option", "showMonthAfterYear" ); +//setter +$( ".selector" ).datepicker( "option", "showMonthAfterYear", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showOn"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showOn">showOn</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'focus'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Have the datepicker appear automatically when the field receives focus ('focus'), appear only when a button is clicked ('button'), or appear when either event takes place ('both').</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showOn</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showOn: 'both' });</code></pre> +</dd> + + +<dt> + Get or set the <code>showOn</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showOn = $( ".selector" ).datepicker( "option", "showOn" ); +//setter +$( ".selector" ).datepicker( "option", "showOn", 'both' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showOptions"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showOptions">showOptions</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Options</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">{}</dd> + + </dl> + </div> + <div class="option-description"> + <p>If using one of the jQuery UI effects for <code><a href="http://docs.jquery.com/UI/Datepicker#option-showAnim" title="UI/Datepicker">showAnim</a></code>, you can provide additional settings for that animation via this option.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showOptions</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showOptions: {direction: 'up' });</code></pre> +</dd> + + +<dt> + Get or set the <code>showOptions</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showOptions = $( ".selector" ).datepicker( "option", "showOptions" ); +//setter +$( ".selector" ).datepicker( "option", "showOptions", {direction: 'up' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showOtherMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showOtherMonths">showOtherMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Display dates in other months (non-selectable) at the start or end of the current month. To make these days selectable use <code><a href="http://docs.jquery.com/UI/Datepicker#option-selectOtherMonths" title="UI/Datepicker">selectOtherMonths</a></code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showOtherMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showOtherMonths: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showOtherMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showOtherMonths = $( ".selector" ).datepicker( "option", "showOtherMonths" ); +//setter +$( ".selector" ).datepicker( "option", "showOtherMonths", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-showWeek"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-showWeek">showWeek</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>When true a column is added to show the week of the year. The <code><a href="http://docs.jquery.com/UI/Datepicker#option-calculateWeek" title="UI/Datepicker">calculateWeek</a></code> option determines how the week of the year is calculated. You may also want to change the <code>firstDay</code> option.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>showWeek</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ showWeek: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>showWeek</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var showWeek = $( ".selector" ).datepicker( "option", "showWeek" ); +//setter +$( ".selector" ).datepicker( "option", "showWeek", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-stepMonths"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-stepMonths">stepMonths</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set how many months to move when clicking the Previous/Next links.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>stepMonths</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ stepMonths: 3 });</code></pre> +</dd> + + +<dt> + Get or set the <code>stepMonths</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var stepMonths = $( ".selector" ).datepicker( "option", "stepMonths" ); +//setter +$( ".selector" ).datepicker( "option", "stepMonths", 3 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-weekHeader"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-weekHeader">weekHeader</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'Wk'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The text to display for the week of the year column heading. This attribute is one of the regionalisation attributes. Use <code><a href="http://docs.jquery.com/UI/Datepicker#option-showWeek" title="UI/Datepicker">showWeek</a></code> to display this column.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>weekHeader</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ weekHeader: 'W' });</code></pre> +</dd> + + +<dt> + Get or set the <code>weekHeader</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var weekHeader = $( ".selector" ).datepicker( "option", "weekHeader" ); +//setter +$( ".selector" ).datepicker( "option", "weekHeader", 'W' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-yearRange"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-yearRange">yearRange</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'c-10:c+10'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Control the range of years displayed in the year drop-down: either relative to today's year (-nn:+nn), relative to the currently selected year (c-nn:c+nn), absolute (nnnn:nnnn), or combinations of these formats (nnnn:-nn).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>yearRange</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ yearRange: '2000:2010' });</code></pre> +</dd> + + +<dt> + Get or set the <code>yearRange</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var yearRange = $( ".selector" ).datepicker( "option", "yearRange" ); +//setter +$( ".selector" ).datepicker( "option", "yearRange", '2000:2010' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-yearSuffix"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-yearSuffix">yearSuffix</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>Additional text to display after the year in the month headers. This attribute is one of the regionalisation attributes.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a datepicker with the <code>yearSuffix</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).datepicker({ yearSuffix: 'CE' });</code></pre> +</dd> + + +<dt> + Get or set the <code>yearSuffix</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var yearSuffix = $( ".selector" ).datepicker( "option", "yearSuffix" ); +//setter +$( ".selector" ).datepicker( "option", "yearSuffix", 'CE' );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-beforeShow"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-beforeShow">beforeShow</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(input, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Can be a function that takes an input field and current datepicker instance and returns an options object to update the datepicker with. It is called just before the datepicker is displayed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>beforeShow</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + beforeShow: function(input, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-beforeShowDay"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-beforeShowDay">beforeShowDay</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(date)</dd> + </dl> + </div> + <div class="event-description"> + <p>The function takes a date as a parameter and must return an array with [0] equal to true/false indicating whether or not this date is selectable, [1] equal to a CSS class name(s) or '' for the default presentation, and [2] an optional popup tooltip for this date. It is called for each day in the datepicker before it is displayed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>beforeShowDay</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + beforeShowDay: function(date) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-onChangeMonthYear"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-onChangeMonthYear">onChangeMonthYear</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(year, month, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Allows you to define your own event when the datepicker moves to a new month and/or year. The function receives the selected year, month (1-12), and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>onChangeMonthYear</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + onChangeMonthYear: function(year, month, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-onClose"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-onClose">onClose</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(dateText, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Allows you to define your own event when the datepicker is closed, whether or not a date is selected. The function receives the selected date as text ('' if none) and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>onClose</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + onClose: function(dateText, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-onSelect"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-onSelect">onSelect</a></h3> + <dl> + <dt class="event-type-label"></dt> + <dd class="event-type">function(dateText, inst)</dd> + </dl> + </div> + <div class="event-description"> + <p>Allows you to define your own event when the datepicker is selected. The function receives the selected date as text and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>onSelect</code> event as an init option. +</dt> +<dd> +<pre><code>$('.selector').datepicker({ + onSelect: function(dateText, inst) { ... } +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the datepicker functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the datepicker.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the datepicker.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any datepicker option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple datepicker options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-datepicker element.</p> + </div> +</li> + + +<li class="method" id="method-dialog"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-dialog">dialog</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "dialog" + +, date + +, <span class="optional">[</span>onSelect<span class="optional">] </span> + +, <span class="optional">[</span>settings<span class="optional">] </span> + +, <span class="optional">[</span>pos<span class="optional">] </span>)</dd> + </dl> + </div> + <div class="method-description"> + <p>Open a datepicker in a "dialog" box. +</p><p>dateText: the initial date for the date picker as either a Date or a string in the current date format. +</p><p>onSelect: A callback function when a date is selected. The function receives the date text and date picker instance as parameters. +</p><p>settings: The new settings for the date picker. +</p><p>pos: The position of the top/left of the dialog as [x, y] or a MouseEvent that contains the coordinates. If not specified the dialog is centered on the screen.</p> + </div> +</li> + + +<li class="method" id="method-isDisabled"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-isDisabled">isDisabled</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "isDisabled" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Determine whether a date picker has been disabled.</p> + </div> +</li> + + +<li class="method" id="method-hide"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-hide">hide</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "hide" + +, <span class="optional">[</span>speed<span class="optional">] </span> + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Close a previously opened date picker. +</p><p>speed: The speed at which to close the date picker.</p> + </div> +</li> + + +<li class="method" id="method-show"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-show">show</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "show" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Call up a previously attached date picker.</p> + </div> +</li> + + +<li class="method" id="method-getDate"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-getDate">getDate</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "getDate" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the current date for the datepicker or null if no date has been selected.</p> + </div> +</li> + + +<li class="method" id="method-setDate"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-setDate">setDate</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.datepicker( "setDate" + +, date + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Sets the current date for the datepicker. The new date may also be a string in the current date format (e.g. '01/26/2009'), a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null to clear the selected date.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Datepicker plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.datepicker.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div id=&quot;ui-datepicker-div&quot; class=&quot;<strong>ui-datepicker</strong> ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-datepicker-header</strong> ui-widget-header ui-helper-clearfix ui-corner-all&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;<strong>ui-datepicker-prev</strong> ui-corner-all&quot;&gt;title=&quot;Prev&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-circle-triangle-w&quot;&gt;Prev&lt;/span&gt;&lt;/a&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;<strong>ui-datepicker-next</strong> ui-corner-all&quot; title=&quot;Next&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-circle-triangle-e&quot;&gt;Next&lt;/span&gt;&lt;/a&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-datepicker-title</strong>&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class=&quot;<strong>ui-datepicker-month</strong>&quot;&gt;January&lt;/span&gt;&lt;span class=&quot;<strong>ui-datepicker-year</strong>&quot;&gt;2009&lt;/span&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;table class=&quot;<strong>ui-datepicker-calendar</strong>&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;thead&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th class=&quot;<strong>ui-datepicker-week-end</strong>&quot;&gt;&lt;span title=&quot;Sunday&quot;&gt;Su&lt;/span&gt;&lt;/th&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/thead&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tbody&gt;&lt;tr&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td class=&quot;<strong>ui-datepicker-week-end ui-datepicker-other-month</strong> &quot;&gt;&nbsp;1&nbsp;&lt;/td&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tbody&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-datepicker-buttonpane</strong> ui-widget-content&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button type=&quot;button&quot; class=&quot;<strong>ui-datepicker-current</strong> ui-state-default ui-priority-secondary ui-corner-all&quot;&gt;Today&lt;/button&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button type=&quot;button&quot; class=&quot;<strong>ui-datepicker-close</strong> ui-state-default ui-priority-primary ui-corner-all&quot;&gt;Done&lt;/button&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br /> +&lt;/div&gt;<br /> + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the datepicker plugin, not markup you should use to create a datepicker. The only markup needed for that is &lt;input type="text" /&gt; or &lt;div&gt;&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 96078 bytes +Post-expand include size: 188891 bytes +Template argument size: 118081 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3774-1!1!0!!en!2 and timestamp 20100421060818 --> diff --git a/fannie/src/jquery/development-bundle/docs/dialog.html b/fannie/src/jquery/development-bundle/docs/dialog.html new file mode 100644 index 000000000..09c204283 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/dialog.html @@ -0,0 +1,1603 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Dialog</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>A dialog is a floating window that contains a title bar and a content area. The dialog window can be moved, resized and closed with the 'x' icon by default.</p> +<p>If the content length exceeds the maximum height, a scrollbar will automatically appear.</p> +<p>A bottom button bar and semi-transparent modal overlay layer are common options that can be added.</p> +<p>A call to <code>$(foo).dialog()</code> will initialize a dialog instance and will auto-open the dialog by default. If you want to reuse a dialog, the easiest way is to disable the "auto-open" option with: <code>$(foo).dialog({ autoOpen: false })</code> and open it with <code>$(foo).dialog('open')</code>. To close it, use <code>$foo.dialog('close')</code>. A more in-depth explanation with a full demo is available on <a href="http://blog.nemikor.com/2009/04/08/basic-usage-of-the-jquery-ui-dialog/" class="external text" title="http://blog.nemikor.com/2009/04/08/basic-usage-of-the-jquery-ui-dialog/">the Nemikor blog</a>.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li>UI Draggable (Optional)</li> +<li>UI Resizable (Optional)</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="300"> +A simple jQuery UI Dialog.<br /> +</p> +<pre>$(&quot;#dialog&quot;).dialog(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#dialog&quot;).dialog(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;dialog&quot; title=&quot;Dialog Title&quot;&gt;I'm in a dialog&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the dialog. Can be set when initialising (first creating) the dialog.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).dialog( "option", "disabled" ); +//setter +$( ".selector" ).dialog( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-autoOpen"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-autoOpen">autoOpen</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>When <i>autoOpen</i> is <i>true</i> the dialog will open automatically when <i>dialog</i> is called. If <i>false</i> it will stay hidden until <i>.dialog("open")</i> is called on it.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>autoOpen</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ autoOpen: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>autoOpen</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var autoOpen = $( ".selector" ).dialog( "option", "autoOpen" ); +//setter +$( ".selector" ).dialog( "option", "autoOpen", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-buttons"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-buttons">buttons</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Object</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">{ }</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies which buttons should be displayed on the dialog. The property key is the text of the button. The value is the callback function for when the button is clicked. The context of the callback is the dialog element; if you need access to the button, it is available as the target of the event object. +</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>buttons</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ buttons: { &quot;Ok&quot;: function() { $(this).dialog(&quot;close&quot;); } } });</code></pre> +</dd> + + +<dt> + Get or set the <code>buttons</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var buttons = $( ".selector" ).dialog( "option", "buttons" ); +//setter +$( ".selector" ).dialog( "option", "buttons", { &quot;Ok&quot;: function() { $(this).dialog(&quot;close&quot;); } } );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-closeOnEscape"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-closeOnEscape">closeOnEscape</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies whether the dialog should close when it has focus and the user presses the esacpe (ESC) key.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>closeOnEscape</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ closeOnEscape: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>closeOnEscape</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var closeOnEscape = $( ".selector" ).dialog( "option", "closeOnEscape" ); +//setter +$( ".selector" ).dialog( "option", "closeOnEscape", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-closeText"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-closeText">closeText</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'close'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies the text for the close button. Note that the close text is visibly hidden when using a standard theme.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>closeText</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ closeText: 'hide' });</code></pre> +</dd> + + +<dt> + Get or set the <code>closeText</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var closeText = $( ".selector" ).dialog( "option", "closeText" ); +//setter +$( ".selector" ).dialog( "option", "closeText", 'hide' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dialogClass"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dialogClass">dialogClass</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>The specified class name(s) will be added to the dialog, for additional theming.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>dialogClass</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ dialogClass: 'alert' });</code></pre> +</dd> + + +<dt> + Get or set the <code>dialogClass</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dialogClass = $( ".selector" ).dialog( "option", "dialogClass" ); +//setter +$( ".selector" ).dialog( "option", "dialogClass", 'alert' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-draggable"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-draggable">draggable</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the dialog will be draggable will be draggable by the titlebar.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>draggable</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ draggable: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>draggable</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var draggable = $( ".selector" ).dialog( "option", "draggable" ); +//setter +$( ".selector" ).dialog( "option", "draggable", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-height"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-height">height</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'auto'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The height of the dialog, in pixels. Specifying 'auto' is also supported to make the dialog adjust based on its content.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>height</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ height: 530 });</code></pre> +</dd> + + +<dt> + Get or set the <code>height</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var height = $( ".selector" ).dialog( "option", "height" ); +//setter +$( ".selector" ).dialog( "option", "height", 530 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-hide"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-hide">hide</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>The effect to be used when the dialog is closed.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>hide</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ hide: 'slide' });</code></pre> +</dd> + + +<dt> + Get or set the <code>hide</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var hide = $( ".selector" ).dialog( "option", "hide" ); +//setter +$( ".selector" ).dialog( "option", "hide", 'slide' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-maxHeight"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-maxHeight">maxHeight</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>The maximum height to which the dialog can be resized, in pixels.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>maxHeight</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ maxHeight: 400 });</code></pre> +</dd> + + +<dt> + Get or set the <code>maxHeight</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var maxHeight = $( ".selector" ).dialog( "option", "maxHeight" ); +//setter +$( ".selector" ).dialog( "option", "maxHeight", 400 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-maxWidth"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-maxWidth">maxWidth</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>The maximum width to which the dialog can be resized, in pixels.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>maxWidth</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ maxWidth: 600 });</code></pre> +</dd> + + +<dt> + Get or set the <code>maxWidth</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var maxWidth = $( ".selector" ).dialog( "option", "maxWidth" ); +//setter +$( ".selector" ).dialog( "option", "maxWidth", 600 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minHeight"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minHeight">minHeight</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">150</dd> + + </dl> + </div> + <div class="option-description"> + <p>The minimum height to which the dialog can be resized, in pixels.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>minHeight</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ minHeight: 300 });</code></pre> +</dd> + + +<dt> + Get or set the <code>minHeight</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minHeight = $( ".selector" ).dialog( "option", "minHeight" ); +//setter +$( ".selector" ).dialog( "option", "minHeight", 300 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minWidth"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minWidth">minWidth</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">150</dd> + + </dl> + </div> + <div class="option-description"> + <p>The minimum width to which the dialog can be resized, in pixels.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>minWidth</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ minWidth: 400 });</code></pre> +</dd> + + +<dt> + Get or set the <code>minWidth</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minWidth = $( ".selector" ).dialog( "option", "minWidth" ); +//setter +$( ".selector" ).dialog( "option", "minWidth", 400 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-modal"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-modal">modal</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the dialog will have modal behavior; other items on the page will be disabled (i.e. cannot be interacted with). Modal dialogs create an overlay below the dialog but above other page elements.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>modal</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ modal: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>modal</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var modal = $( ".selector" ).dialog( "option", "modal" ); +//setter +$( ".selector" ).dialog( "option", "modal", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-position"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-position">position</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'center'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies where the dialog should be displayed. Possible values: <br />1) a single string representing position within viewport: 'center', 'left', 'right', 'top', 'bottom'. <br />2) an array containing an <em>x,y</em> coordinate pair in pixel offset from left, top corner of viewport (e.g. [350,100]) <br />3) an array containing <em>x,y</em> position string values (e.g. ['right','top'] for top right corner).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>position</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ position: 'top' });</code></pre> +</dd> + + +<dt> + Get or set the <code>position</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var position = $( ".selector" ).dialog( "option", "position" ); +//setter +$( ".selector" ).dialog( "option", "position", 'top' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-resizable"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-resizable">resizable</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the dialog will be resizeable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>resizable</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ resizable: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>resizable</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var resizable = $( ".selector" ).dialog( "option", "resizable" ); +//setter +$( ".selector" ).dialog( "option", "resizable", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-show"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-show">show</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>The effect to be used when the dialog is opened.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>show</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ show: 'slide' });</code></pre> +</dd> + + +<dt> + Get or set the <code>show</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var show = $( ".selector" ).dialog( "option", "show" ); +//setter +$( ".selector" ).dialog( "option", "show", 'slide' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-stack"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-stack">stack</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies whether the dialog will stack on top of other dialogs. This will cause the dialog to move to the front of other dialogs when it gains focus.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>stack</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ stack: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>stack</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var stack = $( ".selector" ).dialog( "option", "stack" ); +//setter +$( ".selector" ).dialog( "option", "stack", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-title"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-title">title</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">''</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies the title of the dialog. The title can also be specified by the title attribute on the dialog source element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>title</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ title: 'Dialog Title' });</code></pre> +</dd> + + +<dt> + Get or set the <code>title</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var title = $( ".selector" ).dialog( "option", "title" ); +//setter +$( ".selector" ).dialog( "option", "title", 'Dialog Title' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-width"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-width">width</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">300</dd> + + </dl> + </div> + <div class="option-description"> + <p>The width of the dialog, in pixels.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>width</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ width: 460 });</code></pre> +</dd> + + +<dt> + Get or set the <code>width</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var width = $( ".selector" ).dialog( "option", "width" ); +//setter +$( ".selector" ).dialog( "option", "width", 460 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-zIndex"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-zIndex">zIndex</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1000</dd> + + </dl> + </div> + <div class="option-description"> + <p>The starting z-index for the dialog.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a dialog with the <code>zIndex</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).dialog({ zIndex: 3999 });</code></pre> +</dd> + + +<dt> + Get or set the <code>zIndex</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var zIndex = $( ".selector" ).dialog( "option", "zIndex" ); +//setter +$( ".selector" ).dialog( "option", "zIndex", 3999 );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-beforeclose"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-beforeclose">beforeclose</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dialogbeforeclose</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a dialog attempts to close. If the beforeclose event handler (callback function) returns false, the close will be prevented.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>beforeclose</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + beforeclose: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>beforeclose</code> event by type: <code>dialogbeforeclose</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogbeforeclose&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-open"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-open">open</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dialogopen</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when dialog is opened.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>open</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + open: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>open</code> event by type: <code>dialogopen</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogopen&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-focus"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-focus">focus</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dialogfocus</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the dialog gains focus.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>focus</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + focus: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>focus</code> event by type: <code>dialogfocus</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogfocus&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-dragStart"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-dragStart">dragStart</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dragStart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the beginning of the dialog being dragged.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>dragStart</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + dragStart: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>dragStart</code> event by type: <code>dragStart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragStart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-drag"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-drag">drag</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">drag</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the dialog is dragged.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>drag</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + drag: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>drag</code> event by type: <code>drag</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;drag&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-dragStop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-dragStop">dragStop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dragStop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered after the dialog has been dragged.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>dragStop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + dragStop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>dragStop</code> event by type: <code>dragStop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragStop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-resizeStart"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-resizeStart">resizeStart</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">resizeStart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the beginning of the dialog being resized.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>resizeStart</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + resizeStart: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>resizeStart</code> event by type: <code>resizeStart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizeStart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-resize"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-resize">resize</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">resize</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the dialog is resized.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>resize</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + resize: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>resize</code> event by type: <code>resize</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;resize&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-resizeStop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-resizeStop">resizeStop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">resizeStop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered after the dialog has been resized.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>resizeStop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + resizeStop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>resizeStop</code> event by type: <code>resizeStop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizeStop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-close"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-close">close</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dialogclose</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the dialog is closed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>close</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).dialog({ + close: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>close</code> event by type: <code>dialogclose</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogclose&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the dialog functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the dialog.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the dialog.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any dialog option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple dialog options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-dialog element.</p> + </div> +</li> + + +<li class="method" id="method-close"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-close">close</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "close" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Close the dialog.</p> + </div> +</li> + + +<li class="method" id="method-isOpen"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-isOpen">isOpen</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "isOpen" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns true if the dialog is currently open.</p> + </div> +</li> + + +<li class="method" id="method-moveToTop"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-moveToTop">moveToTop</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "moveToTop" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Move the dialog to the top of the dialogs stack.</p> + </div> +</li> + + +<li class="method" id="method-open"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-open">open</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.dialog( "open" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Open the dialog.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Dialog plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.dialog.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;<strong>ui-dialog</strong> ui-widget ui-widget-content ui-corner-all ui-draggable ui-resizable&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-dialog-titlebar</strong> ui-widget-header ui-corner-all ui-helper-clearfix&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span id=&quot;<strong>ui-dialog-title-dialog</strong>&quot; class=&quot;ui-dialog-title&quot;&gt;Dialog title&lt;/span&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;<strong>ui-dialog-titlebar-close</strong> ui-corner-all&quot; href=&quot;#&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-closethick&quot;&gt;close&lt;/span&gt;&lt;/a&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;div style=&quot;height: 200px; min-height: 109px; width: auto;&quot; class=&quot;<strong>ui-dialog-content</strong> ui-widget-content&quot; id=&quot;dialog&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Dialog content goes here.&lt;/p&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br /> +&lt;/div&gt;<br /> + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the dialog plugin, not markup you should use to create a dialog. The only markup needed for that is &lt;div&gt;&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 63516 bytes +Post-expand include size: 106554 bytes +Template argument size: 58869 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3775-1!1!0!!en!2 and timestamp 20100421091449 --> diff --git a/fannie/src/jquery/development-bundle/docs/draggable.html b/fannie/src/jquery/development-bundle/docs/draggable.html new file mode 100644 index 000000000..ddba89b16 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/draggable.html @@ -0,0 +1,1533 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Draggable</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Draggable plugin makes selected elements draggable by mouse.</p> +<p>Draggable elements gets a class of <code>ui-draggable</code>. During drag the element also gets a class of <code>ui-draggable-dragging</code>. If you want not just drag, but drag-and-drop, see the jQuery UI Droppable plugin, which provides a drop target for draggables.</p> +<p>All callbacks (start, stop, drag) receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):</p> +<ul> +<li><b>ui.helper</b> - the jQuery object representing the helper that's being dragged</li> +<li><b>ui.position</b> - current position of the helper as { top, left } object, relative to the offset element</li> +<li><b>ui.offset</b> - current absolute position of the helper as { top, left } object, relative to page</li> +</ul> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="170"> +Initialize a draggable with default options.<br /> +</p> +<pre>$(&quot;#draggable&quot;).draggable(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;style type=&quot;text/css&quot;&gt; + #draggable { width: 100px; height: 70px; background: silver; } + &lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;#draggable&quot;).draggable(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;draggable&quot;&gt;Drag me&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the draggable. Can be set when initialising (first creating) the draggable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).draggable( "option", "disabled" ); +//setter +$( ".selector" ).draggable( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-addClasses"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-addClasses">addClasses</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to false, will prevent the <code>ui-draggable</code> class from being added. This may be desired as a performance optimization when calling <code>.draggable()</code> init on many hundreds of elements.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>addClasses</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ addClasses: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>addClasses</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var addClasses = $( ".selector" ).draggable( "option", "addClasses" ); +//setter +$( ".selector" ).draggable( "option", "addClasses", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-appendTo"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-appendTo">appendTo</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Element, Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'parent'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The element passed to or selected by the <code>appendTo</code> option will be used as the draggable helper's container during dragging. By default, the helper is appended to the same container as the draggable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>appendTo</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ appendTo: 'body' });</code></pre> +</dd> + + +<dt> + Get or set the <code>appendTo</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var appendTo = $( ".selector" ).draggable( "option", "appendTo" ); +//setter +$( ".selector" ).draggable( "option", "appendTo", 'body' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-axis"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-axis">axis</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Constrains dragging to either the horizontal (x) or vertical (y) axis. Possible values: 'x', 'y'.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>axis</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ axis: 'x' });</code></pre> +</dd> + + +<dt> + Get or set the <code>axis</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var axis = $( ".selector" ).draggable( "option", "axis" ); +//setter +$( ".selector" ).draggable( "option", "axis", 'x' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cancel"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cancel">cancel</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">':input,option'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Prevents dragging from starting on specified elements.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>cancel</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ cancel: 'button' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cancel</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cancel = $( ".selector" ).draggable( "option", "cancel" ); +//setter +$( ".selector" ).draggable( "option", "cancel", 'button' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-connectToSortable"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-connectToSortable">connectToSortable</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows the draggable to be dropped onto the specified sortables. If this option is used (<code>helper</code> must be set to 'clone' in order to work flawlessly), a draggable can be dropped onto a sortable list and then becomes part of it. +</p><p>Note: Specifying this option as an array of selectors has been removed.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>connectToSortable</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ connectToSortable: 'ul#myList' });</code></pre> +</dd> + + +<dt> + Get or set the <code>connectToSortable</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var connectToSortable = $( ".selector" ).draggable( "option", "connectToSortable" ); +//setter +$( ".selector" ).draggable( "option", "connectToSortable", 'ul#myList' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-containment"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-containment">containment</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, Element, String, Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Constrains dragging to within the bounds of the specified element or region. Possible string values: 'parent', 'document', 'window', [x1, y1, x2, y2].</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>containment</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ containment: 'parent' });</code></pre> +</dd> + + +<dt> + Get or set the <code>containment</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var containment = $( ".selector" ).draggable( "option", "containment" ); +//setter +$( ".selector" ).draggable( "option", "containment", 'parent' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cursor"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cursor">cursor</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'auto'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The css cursor during the drag operation.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>cursor</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ cursor: 'crosshair' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cursor</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cursor = $( ".selector" ).draggable( "option", "cursor" ); +//setter +$( ".selector" ).draggable( "option", "cursor", 'crosshair' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cursorAt"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cursorAt">cursorAt</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Object</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Moves the dragging helper so the cursor always appears to drag from the same position. Coordinates can be given as a hash using a combination of one or two keys: <code>{ top, left, right, bottom }</code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>cursorAt</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ cursorAt: { left: 5 } });</code></pre> +</dd> + + +<dt> + Get or set the <code>cursorAt</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cursorAt = $( ".selector" ).draggable( "option", "cursorAt" ); +//setter +$( ".selector" ).draggable( "option", "cursorAt", { left: 5 } );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-delay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-delay">delay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Time in milliseconds after mousedown until dragging should start. This option can be used to prevent unwanted drags when clicking on an element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>delay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ delay: 500 });</code></pre> +</dd> + + +<dt> + Get or set the <code>delay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var delay = $( ".selector" ).draggable( "option", "delay" ); +//setter +$( ".selector" ).draggable( "option", "delay", 500 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-distance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-distance">distance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Distance in pixels after mousedown the mouse must move before dragging should start. This option can be used to prevent unwanted drags when clicking on an element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>distance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ distance: 30 });</code></pre> +</dd> + + +<dt> + Get or set the <code>distance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var distance = $( ".selector" ).draggable( "option", "distance" ); +//setter +$( ".selector" ).draggable( "option", "distance", 30 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-grid"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-grid">grid</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Snaps the dragging helper to a grid, every x and y pixels. Array values: [x, y]</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>grid</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ grid: [50, 20] });</code></pre> +</dd> + + +<dt> + Get or set the <code>grid</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var grid = $( ".selector" ).draggable( "option", "grid" ); +//setter +$( ".selector" ).draggable( "option", "grid", [50, 20] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-handle"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-handle">handle</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Element, Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If specified, restricts drag start click to the specified element(s).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>handle</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ handle: 'h2' });</code></pre> +</dd> + + +<dt> + Get or set the <code>handle</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var handle = $( ".selector" ).draggable( "option", "handle" ); +//setter +$( ".selector" ).draggable( "option", "handle", 'h2' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-helper"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-helper">helper</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Function</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'original'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows for a helper element to be used for dragging display. Possible values: 'original', 'clone', Function. If a function is specified, it must return a DOMElement.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>helper</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ helper: 'clone' });</code></pre> +</dd> + + +<dt> + Get or set the <code>helper</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var helper = $( ".selector" ).draggable( "option", "helper" ); +//setter +$( ".selector" ).draggable( "option", "helper", 'clone' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-iframeFix"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-iframeFix">iframeFix</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Prevent iframes from capturing the mousemove events during a drag. Useful in combination with cursorAt, or in any case, if the mouse cursor is not over the helper. If set to true, transparent overlays will be placed over all iframes on the page. If a selector is supplied, the matched iframes will have an overlay placed over them.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>iframeFix</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ iframeFix: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>iframeFix</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var iframeFix = $( ".selector" ).draggable( "option", "iframeFix" ); +//setter +$( ".selector" ).draggable( "option", "iframeFix", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-opacity"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-opacity">opacity</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Float</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Opacity for the helper while being dragged.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>opacity</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ opacity: 0.35 });</code></pre> +</dd> + + +<dt> + Get or set the <code>opacity</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var opacity = $( ".selector" ).draggable( "option", "opacity" ); +//setter +$( ".selector" ).draggable( "option", "opacity", 0.35 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-refreshPositions"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-refreshPositions">refreshPositions</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, all droppable positions are calculated on every mousemove. Caution: This solves issues on highly dynamic pages, but dramatically decreases performance.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>refreshPositions</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ refreshPositions: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>refreshPositions</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var refreshPositions = $( ".selector" ).draggable( "option", "refreshPositions" ); +//setter +$( ".selector" ).draggable( "option", "refreshPositions", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-revert"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-revert">revert</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the element will return to its start position when dragging stops. Possible string values: 'valid', 'invalid'. If set to invalid, revert will only occur if the draggable has not been dropped on a droppable. For valid, it's the other way around.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>revert</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ revert: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>revert</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var revert = $( ".selector" ).draggable( "option", "revert" ); +//setter +$( ".selector" ).draggable( "option", "revert", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-revertDuration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-revertDuration">revertDuration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">500</dd> + + </dl> + </div> + <div class="option-description"> + <p>The duration of the revert animation, in milliseconds. Ignored if revert is false.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>revertDuration</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ revertDuration: 1000 });</code></pre> +</dd> + + +<dt> + Get or set the <code>revertDuration</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var revertDuration = $( ".selector" ).draggable( "option", "revertDuration" ); +//setter +$( ".selector" ).draggable( "option", "revertDuration", 1000 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scope"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scope">scope</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'default'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Used to group sets of draggable and droppable items, in addition to droppable's accept option. A draggable with the same scope value as a droppable will be accepted by the droppable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>scope</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ scope: 'tasks' });</code></pre> +</dd> + + +<dt> + Get or set the <code>scope</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scope = $( ".selector" ).draggable( "option", "scope" ); +//setter +$( ".selector" ).draggable( "option", "scope", 'tasks' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scroll"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scroll">scroll</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, container auto-scrolls while dragging.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>scroll</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ scroll: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>scroll</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scroll = $( ".selector" ).draggable( "option", "scroll" ); +//setter +$( ".selector" ).draggable( "option", "scroll", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scrollSensitivity"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scrollSensitivity">scrollSensitivity</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">20</dd> + + </dl> + </div> + <div class="option-description"> + <p>Distance in pixels from the edge of the viewport after which the viewport should scroll. Distance is relative to pointer, not the draggable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>scrollSensitivity</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ scrollSensitivity: 40 });</code></pre> +</dd> + + +<dt> + Get or set the <code>scrollSensitivity</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scrollSensitivity = $( ".selector" ).draggable( "option", "scrollSensitivity" ); +//setter +$( ".selector" ).draggable( "option", "scrollSensitivity", 40 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scrollSpeed"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scrollSpeed">scrollSpeed</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">20</dd> + + </dl> + </div> + <div class="option-description"> + <p>The speed at which the window should scroll once the mouse pointer gets within the <code>scrollSensitivity</code> distance.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>scrollSpeed</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ scrollSpeed: 40 });</code></pre> +</dd> + + +<dt> + Get or set the <code>scrollSpeed</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scrollSpeed = $( ".selector" ).draggable( "option", "scrollSpeed" ); +//setter +$( ".selector" ).draggable( "option", "scrollSpeed", 40 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-snap"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-snap">snap</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to a selector or to true (equivalent to '.ui-draggable'), the draggable will snap to the edges of the selected elements when near an edge of the element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>snap</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ snap: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>snap</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var snap = $( ".selector" ).draggable( "option", "snap" ); +//setter +$( ".selector" ).draggable( "option", "snap", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-snapMode"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-snapMode">snapMode</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'both'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Determines which edges of snap elements the draggable will snap to. Ignored if snap is false. Possible values: 'inner', 'outer', 'both'</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>snapMode</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ snapMode: 'outer' });</code></pre> +</dd> + + +<dt> + Get or set the <code>snapMode</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var snapMode = $( ".selector" ).draggable( "option", "snapMode" ); +//setter +$( ".selector" ).draggable( "option", "snapMode", 'outer' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-snapTolerance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-snapTolerance">snapTolerance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">20</dd> + + </dl> + </div> + <div class="option-description"> + <p>The distance in pixels from the snap element edges at which snapping should occur. Ignored if snap is false.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>snapTolerance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ snapTolerance: 40 });</code></pre> +</dd> + + +<dt> + Get or set the <code>snapTolerance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var snapTolerance = $( ".selector" ).draggable( "option", "snapTolerance" ); +//setter +$( ".selector" ).draggable( "option", "snapTolerance", 40 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-stack"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-stack">stack</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Controls the z-Index of the set of elements that match the selector, always brings to front the dragged item. Very useful in things like window managers.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>stack</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ stack: &quot;.products&quot; });</code></pre> +</dd> + + +<dt> + Get or set the <code>stack</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var stack = $( ".selector" ).draggable( "option", "stack" ); +//setter +$( ".selector" ).draggable( "option", "stack", &quot;.products&quot; );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-zIndex"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-zIndex">zIndex</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>z-index for the helper while being dragged.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a draggable with the <code>zIndex</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).draggable({ zIndex: 2700 });</code></pre> +</dd> + + +<dt> + Get or set the <code>zIndex</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var zIndex = $( ".selector" ).draggable( "option", "zIndex" ); +//setter +$( ".selector" ).draggable( "option", "zIndex", 2700 );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-start"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-start">start</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dragstart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when dragging starts.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>start</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).draggable({ + start: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>start</code> event by type: <code>dragstart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragstart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-drag"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-drag">drag</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">drag</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the mouse is moved during the dragging.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>drag</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).draggable({ + drag: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>drag</code> event by type: <code>drag</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;drag&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-stop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-stop">stop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dragstop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when dragging stops.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>stop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).draggable({ + stop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>stop</code> event by type: <code>dragstop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragstop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.draggable( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the draggable functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.draggable( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the draggable.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.draggable( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the draggable.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.draggable( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any draggable option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.draggable( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple draggable options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.draggable( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-draggable element.</p> + </div> +</li> + + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Draggable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.draggable.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;<strong>ui-draggable</strong>&quot;&gt;&lt;/div&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the draggable plugin, not markup you should use to create a draggable. The only markup needed for that is &lt;div&gt;&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 59871 bytes +Post-expand include size: 104557 bytes +Template argument size: 57856 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3768-1!1!0!!en!2 and timestamp 20100421175825 --> diff --git a/fannie/src/jquery/development-bundle/docs/droppable.html b/fannie/src/jquery/development-bundle/docs/droppable.html new file mode 100644 index 000000000..dc7eff534 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/droppable.html @@ -0,0 +1,788 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Droppable</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Droppable plugin makes selected elements droppable (meaning they accept being dropped on by draggables). You can specify which (individually) or which kind of draggables each will accept.</p> +<p>All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):</p> +<ul> + <li> <b>ui.draggable</b> - current draggable element, a jQuery object.</li> + <li> <b>ui.helper</b> - current draggable helper, a jQuery object</li> + <li> <b>ui.position</b> - current position of the draggable helper { top: , left: }</li> + <li> <b>ui.offset</b> - current absolute position of the draggable helper { top: , left: }</li> +</ul> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li><a href="http://docs.jquery.com/UI/Draggable" title="UI/Draggable">UI Draggable</a></li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="100"> +Makes the div droppable (a drop target for a draggable).<br /> +</p> +<pre>$(&quot;#draggable&quot;).draggable(); + $(&quot;#droppable&quot;).droppable({ + drop: function() { alert('dropped'); } + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;style type=&quot;text/css&quot;&gt; + #draggable { width: 75px; height: 25px; background: silver; padding: 10px; } + #droppable { position: absolute; left: 250px; top: 0; width: 125px; height: 75px; background: gray; color: white; padding: 10px; } + &lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;#draggable&quot;).draggable(); + $(&quot;#droppable&quot;).droppable({ + drop: function() { alert('dropped'); } + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;droppable&quot;&gt;Drop here&lt;/div&gt; +&lt;div id=&quot;draggable&quot;&gt;Drag me&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the droppable. Can be set when initialising (first creating) the droppable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).droppable( "option", "disabled" ); +//setter +$( ".selector" ).droppable( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-accept"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-accept">accept</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, Function</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'*'</dd> + + </dl> + </div> + <div class="option-description"> + <p>All draggables that match the selector will be accepted. If a function is specified, the function will be called for each draggable on the page (passed as the first argument to the function), to provide a custom filter. The function should return true if the draggable should be accepted.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>accept</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ accept: '.special' });</code></pre> +</dd> + + +<dt> + Get or set the <code>accept</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var accept = $( ".selector" ).droppable( "option", "accept" ); +//setter +$( ".selector" ).droppable( "option", "accept", '.special' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-activeClass"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-activeClass">activeClass</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If specified, the class will be added to the droppable while an acceptable draggable is being dragged.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>activeClass</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ activeClass: '.ui-state-highlight' });</code></pre> +</dd> + + +<dt> + Get or set the <code>activeClass</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var activeClass = $( ".selector" ).droppable( "option", "activeClass" ); +//setter +$( ".selector" ).droppable( "option", "activeClass", '.ui-state-highlight' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-addClasses"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-addClasses">addClasses</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to false, will prevent the ui-droppable class from being added. This may be desired as a performance optimization when calling .droppable() init on many hundreds of elements.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>addClasses</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ addClasses: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>addClasses</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var addClasses = $( ".selector" ).droppable( "option", "addClasses" ); +//setter +$( ".selector" ).droppable( "option", "addClasses", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-greedy"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-greedy">greedy</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If true, will prevent event propagation on nested droppables.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>greedy</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ greedy: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>greedy</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var greedy = $( ".selector" ).droppable( "option", "greedy" ); +//setter +$( ".selector" ).droppable( "option", "greedy", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-hoverClass"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-hoverClass">hoverClass</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If specified, the class will be added to the droppable while an acceptable draggable is being hovered.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>hoverClass</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ hoverClass: 'drophover' });</code></pre> +</dd> + + +<dt> + Get or set the <code>hoverClass</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var hoverClass = $( ".selector" ).droppable( "option", "hoverClass" ); +//setter +$( ".selector" ).droppable( "option", "hoverClass", 'drophover' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scope"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scope">scope</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'default'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Used to group sets of draggable and droppable items, in addition to droppable's accept option. A draggable with the same scope value as a droppable will be accepted.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>scope</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ scope: 'tasks' });</code></pre> +</dd> + + +<dt> + Get or set the <code>scope</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scope = $( ".selector" ).droppable( "option", "scope" ); +//setter +$( ".selector" ).droppable( "option", "scope", 'tasks' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-tolerance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-tolerance">tolerance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'intersect'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies which mode to use for testing whether a draggable is 'over' a droppable. Possible values: 'fit', 'intersect', 'pointer', 'touch'. +</p> +<ul> +<li><b>fit</b>: draggable overlaps the droppable entirely</li> +<li><b>intersect</b>: draggable overlaps the droppable at least 50%</li> +<li><b>pointer</b>: mouse pointer overlaps the droppable</li> +<li><b>touch</b>: draggable overlaps the droppable any amount</li> +</ul> +<p></p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a droppable with the <code>tolerance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).droppable({ tolerance: 'fit' });</code></pre> +</dd> + + +<dt> + Get or set the <code>tolerance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var tolerance = $( ".selector" ).droppable( "option", "tolerance" ); +//setter +$( ".selector" ).droppable( "option", "tolerance", 'fit' );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-activate"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-activate">activate</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dropactivate</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered any time an accepted draggable starts dragging. This can be useful if you want to make the droppable 'light up' when it can be dropped on.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>activate</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).droppable({ + activate: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>activate</code> event by type: <code>dropactivate</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropactivate&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-deactivate"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-deactivate">deactivate</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dropdeactivate</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered any time an accepted draggable stops dragging.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>deactivate</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).droppable({ + deactivate: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>deactivate</code> event by type: <code>dropdeactivate</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropdeactivate&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-over"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-over">over</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dropover</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered as an accepted draggable is dragged 'over' (within the tolerance of) this droppable.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>over</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).droppable({ + over: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>over</code> event by type: <code>dropover</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropover&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-out"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-out">out</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">dropout</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when an accepted draggable is dragged out (within the tolerance of) this droppable.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>out</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).droppable({ + out: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>out</code> event by type: <code>dropout</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropout&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-drop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-drop">drop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">drop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when an accepted draggable is dropped 'over' (within the tolerance of) this droppable. In the callback, $(this) represents the droppable the draggable is dropped on. +ui.draggable represents the draggable.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>drop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).droppable({ + drop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>drop</code> event by type: <code>drop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;drop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.droppable( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the droppable functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.droppable( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the droppable.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.droppable( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the droppable.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.droppable( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any droppable option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.droppable( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple droppable options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.droppable( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-droppable element.</p> + </div> +</li> + + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Droppable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.droppable.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;<strong>ui-droppable</strong>&quot;&gt;&lt;/div&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the droppable plugin, not markup you should use to create a droppable. The only markup needed for that is &lt;div&gt;&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 32197 bytes +Post-expand include size: 50784 bytes +Template argument size: 26273 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3769-1!1!0!!en!2 and timestamp 20100420195244 --> diff --git a/fannie/src/jquery/development-bundle/docs/effect.html b/fannie/src/jquery/development-bundle/docs/effect.html new file mode 100644 index 000000000..01f398383 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/effect.html @@ -0,0 +1,143 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI effect</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/effect?section=1" title="Edit section: effect( effect, [options], [speed], [callback] )">edit</a>]</div><a name="effect.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>effect( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3> +<p>Uses a specific effect on an element (without the show/hide logic).</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="170"> +Apply the effect explode if you click on the element.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">effect</strong>(&quot;explode&quot;); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.explode.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + div { margin: 0 auto; width: 100px; height: 80px; background: blue; position: relative; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">effect</strong>(&quot;explode&quot;); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-effect"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-effect">effect</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>The effect to be used. Possible values: 'blind', 'bounce', 'clip', 'drop', 'explode', 'fold', 'highlight', 'puff', 'pulsate', 'scale', 'shake', 'size', 'slide', 'transfer'.</p> + </div> +</li> + + +<li class="option" id="option-options"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-options">options</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Hash</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A object/hash including specific options for the effect.</p> + </div> +</li> + + +<li class="option" id="option-speed"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-speed">speed</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + +<li class="option" id="option-callback"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-callback">callback</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A function that is called after the effect is completed.</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 6364 bytes +Post-expand include size: 8780 bytes +Template argument size: 5498 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2612-1!1!0!!en!2 and timestamp 20100421124119 --> diff --git a/fannie/src/jquery/development-bundle/docs/hide.html b/fannie/src/jquery/development-bundle/docs/hide.html new file mode 100644 index 000000000..522047f95 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/hide.html @@ -0,0 +1,144 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI hide</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/hide?section=1" title="Edit section: hide( effect, [options], [speed], [callback] )">edit</a>]</div><a name="hide.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>hide( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3> +<p>The enhanced hide method optionally accepts jQuery UI advanced effects.</p> +<p>Uses a specific effect on an element to hide the element if the first argument is an effect string.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="170"> +Apply the effect slide if you click on the p to hide a div.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">hide</strong>(&quot;slide&quot;, {}, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.slide.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + div { margin: 0px; width: 100px; height: 80px; background: blue; position: relative; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">hide</strong>(&quot;slide&quot;, {}, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-effect"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-effect">effect</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.</p> + </div> +</li> + + +<li class="option" id="option-options"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-options">options</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Hash</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A object/hash including specific options for the effect.</p> + </div> +</li> + + +<li class="option" id="option-speed"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-speed">speed</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + +<li class="option" id="option-callback"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-callback">callback</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A function that is called after the effect is completed.</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 6354 bytes +Post-expand include size: 8761 bytes +Template argument size: 5487 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2614-1!1!0!!en!2 and timestamp 20100421134337 --> diff --git a/fannie/src/jquery/development-bundle/docs/position.html b/fannie/src/jquery/development-bundle/docs/position.html new file mode 100644 index 000000000..37e591770 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/position.html @@ -0,0 +1,244 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Position Utility</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>Utility script for absolutely positioning any widget relative to the window, document, a particular element, or the cursor/mouse.</p> +<p>Do not need ui.core.js or effects.core.js.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li><i>none (only jQuery core)</i></li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="300"> +Clicking on the green element transfers to the other.<br /> +</p> +<pre> +$(&quot;#position1&quot;).position({ + my: &quot;center&quot;, + at: &quot;center&quot;, + of: &quot;#targetElement&quot; +}); +$(&quot;#position2&quot;).position({ + my: &quot;left top&quot;, + at: &quot;left top&quot;, + of: &quot;#targetElement&quot; +}); +$(&quot;#position3&quot;).position({ + my: &quot;right center&quot;, + at: &quot;right bottom&quot;, + of: &quot;#targetElement&quot; +}); +$(document).mousemove(function(ev){ + $(&quot;#position4&quot;).position({ + my: &quot;left bottom&quot;, + of: ev, + offset: &quot;3 -3&quot;, + collision: &quot;fit&quot; + }); +}); + +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;style type=&quot;text/css&quot;&gt; +#targetElement { width:240px;height:200px;background-color:#999;margin:30px auto; } +.positionDiv { width:50px;height:50px;opacity:0.6; } +#position1 {background-color:#F00;} +#position2 {background-color:#0F0;} +#position3 {background-color:#00F;} +#position4 {background-color:#FF0;} +&lt;/style&gt; + + &lt;script&gt; + $(document).ready(function() { + +$(&quot;#position1&quot;).position({ + my: &quot;center&quot;, + at: &quot;center&quot;, + of: &quot;#targetElement&quot; +}); +$(&quot;#position2&quot;).position({ + my: &quot;left top&quot;, + at: &quot;left top&quot;, + of: &quot;#targetElement&quot; +}); +$(&quot;#position3&quot;).position({ + my: &quot;right center&quot;, + at: &quot;right bottom&quot;, + of: &quot;#targetElement&quot; +}); +$(document).mousemove(function(ev){ + $(&quot;#position4&quot;).position({ + my: &quot;left bottom&quot;, + of: ev, + offset: &quot;3 -3&quot;, + collision: &quot;fit&quot; + }); +}); + + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;targetElement&quot;&gt; + &lt;div class=&quot;positionDiv&quot; id=&quot;position1&quot;&gt;&lt;/div&gt; + &lt;div class=&quot;positionDiv&quot; id=&quot;position2&quot;&gt;&lt;/div&gt; + &lt;div class=&quot;positionDiv&quot; id=&quot;position3&quot;&gt;&lt;/div&gt; + &lt;div class=&quot;positionDiv&quot; id=&quot;position4&quot;&gt;&lt;/div&gt; +&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-my"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-my">my</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines which position on <b>the element being positioned</b> to align with the target element: "horizontal vertical" alignment. A single value such as "right" will default to "right center", "top" will default to "center top" (following CSS convention). Acceptable values: "top", "center", "bottom", "left", "right". Example: "left top" or "center center"</p> + </div> +</li> + + +<li class="option" id="option-at"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-at">at</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines which position on <b>the target element</b> to align the positioned element against: "horizontal vertical" alignment. A single value such as "right" will default to "right center", "top" will default to "center top" (following CSS convention). Acceptable values: "top", "center", "bottom", "left", "right". Example: "left top" or "center center"</p> + </div> +</li> + + +<li class="option" id="option-of"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-of">of</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + </dl> + </div> + <div class="option-description"> + <p>Element to position against. You can use a browser event object contains pageX and pageY values. Example: "#top-menu"</p> + </div> +</li> + + +<li class="option" id="option-offset"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-offset">offset</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>Add these left-top values to the calculated position, eg. "50 50" (left top) A single value such as "50" will apply to both.</p> + </div> +</li> + + +<li class="option" id="option-collision"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-collision">collision</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>When the positioned element overflows the window in some direction, move it to an alternative position. Similar to my and at, this accepts a single value or a pair for horizontal/vertical, eg. "flip", "fit", "fit flip", "fit none". +</p> +<ul><li> <b>flip</b>: to the opposite side and the collision detection is run again to see if it will fit. If it won't fit in either position, the center option should be used as a fall back. +</li><li> <b>fit</b>: so the element keeps in the desired direction, but is re-positioned so it fits. +</li><li> <b>none</b>: not do collision detection. +</li></ul> +<p></p> + </div> +</li> + + +<li class="option" id="option-using"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-using">using</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + </dl> + </div> + <div class="option-description"> + <p>When specified the actual property setting is delegated to this callback. Receives a single parameter which is a hash of top and left values for the position that should be set.</p> + </div> +</li> + + +<li class="option" id="option-bgiframe"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-bgiframe">bgiframe</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>Applies the bgiframe plugin when set to true. Only applies when bgiframe is actually loaded, nothing happens otherwise.</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 7818 bytes +Post-expand include size: 11726 bytes +Template argument size: 7916 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3784-1!1!0!!en!2 and timestamp 20100421075208 --> diff --git a/fannie/src/jquery/development-bundle/docs/progressbar.html b/fannie/src/jquery/development-bundle/docs/progressbar.html new file mode 100644 index 000000000..8d52cd1a6 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/progressbar.html @@ -0,0 +1,381 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Progressbar</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p> +The progress bar is designed to simply display the current % complete for a process. The bar is coded to be flexibly sized through CSS and will scale to fit inside it's parent container by default. +</p> +<p> +This is a determinate progress bar, meaning that it should only be used in situations where the system can accurately update the current status complete. A determinate progress bar should never fill from left to right, then loop back to empty for a single process -- if the actual percent complete status cannot be calculated, an indeterminate progress bar (coming soon) or spinner animation is a better way to provide user feedback. +</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="100"> +A simple jQuery UI Progressbar.<br /> +</p> +<pre>$(&quot;#progressbar&quot;).progressbar({ value: 37 }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#progressbar&quot;).progressbar({ value: 37 }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;progressbar&quot;&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the progressbar. Can be set when initialising (first creating) the progressbar.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a progressbar with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).progressbar({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).progressbar( "option", "disabled" ); +//setter +$( ".selector" ).progressbar( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-value"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-value">value</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>The value of the progressbar.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a progressbar with the <code>value</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).progressbar({ value: 37 });</code></pre> +</dd> + + +<dt> + Get or set the <code>value</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var value = $( ".selector" ).progressbar( "option", "value" ); +//setter +$( ".selector" ).progressbar( "option", "value", 37 );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-change"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-change">change</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">progressbarchange</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the value of the progressbar changes.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>change</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).progressbar({ + change: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>change</code> event by type: <code>progressbarchange</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;progressbarchange&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the progressbar functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the progressbar.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the progressbar.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any progressbar option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple progressbar options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-progressbar element.</p> + </div> +</li> + + +<li class="method" id="method-value"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-value">value</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.progressbar( "value" + +, <span class="optional">[</span>value<span class="optional">] </span> + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>This method gets or sets the current value of the progressbar.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Progressbar plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.progressbar.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;<strong>ui-progressbar </strong>ui-widget ui-widget-content ui-corner-all&quot;&gt;<br /> + &nbsp;&nbsp;&nbsp;&lt;div style=&quot;width: 37%;&quot; class=&quot;<strong>ui-progressbar-value</strong> ui-widget-header ui-corner-left&quot;&gt;&lt;/div&gt;<br /> + &lt;/div&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the progressbar plugin, not markup you should use to create a progressbar. The only markup needed for that is &lt;div&gt;&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 18800 bytes +Post-expand include size: 21667 bytes +Template argument size: 8533 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3780-1!1!0!!en!2 and timestamp 20100421015944 --> diff --git a/fannie/src/jquery/development-bundle/docs/removeClass.html b/fannie/src/jquery/development-bundle/docs/removeClass.html new file mode 100644 index 000000000..fc87df27f --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/removeClass.html @@ -0,0 +1,113 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI removeClass</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/removeClass?section=1" title="Edit section: removeClass( [class], [duration] )">edit</a>]</div><a name="removeClass.28_.5Bclass.5D.2C_.5Bduration.5D_.29"></a><h3>removeClass( <span class="optional">[</span>class<span class="optional">]</span>, <span class="optional">[</span>duration<span class="optional">]</span> )</h3> +<p>Removes all or specified class from each of the set of matched elements with an optional transition between the states.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="100"> +Removes the class 'selected' from the matched elements with a one second transition.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">removeClass</strong>(&quot;selected&quot;, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + p { cursor: pointer; font-size: 1.2em; } + .selected { color:red; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">removeClass</strong>(&quot;selected&quot;, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p class=&quot;selected&quot;&gt;Click me to remove 'selected' class.&lt;/p&gt; +&lt;p class=&quot;selected&quot;&gt;Click me to remove 'selected' class.&lt;/p&gt; +&lt;p class=&quot;selected&quot;&gt;Click me to remove 'selected' class.&lt;/p&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-class"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-class">class</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>CSS classes to remove from the elements.</p> + </div> +</li> + + +<li class="option" id="option-duration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-duration">duration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 5297 bytes +Post-expand include size: 7164 bytes +Template argument size: 4498 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2607-1!1!0!!en!2 and timestamp 20100421143444 --> diff --git a/fannie/src/jquery/development-bundle/docs/resizable.html b/fannie/src/jquery/development-bundle/docs/resizable.html new file mode 100644 index 000000000..99b892636 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/resizable.html @@ -0,0 +1,1160 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Resizable</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Resizable plugin makes selected elements resizable (meaning they have draggable resize handles). You can specify one or more handles as well as min and max width and height.</p> +<p>All callbacks (start,stop,resize) receive two arguments: The original browser event and a prepared ui object. The ui object has the following fields:</p> +<ul> +<li><b>ui.helper</b> - a jQuery object containing the helper element</li> +<li><b>ui.originalPosition</b> - {top, left} before resizing started</li> +<li><b>ui.originalSize</b> - {width, height} before resizing started</li> +<li><b>ui.position</b> - {top, left} current position</li> +<li><b>ui.size</b> - {width, height} current size</li> +</ul> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="250"> +A simple jQuery UI Resizable.<br /> +</p> +<pre>$(&quot;#resizable&quot;).resizable(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;style type=&quot;text/css&quot;&gt; + #resizable { width: 100px; height: 100px; background: silver; } + &lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;#resizable&quot;).resizable(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;resizable&quot;&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the resizable. Can be set when initialising (first creating) the resizable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).resizable( "option", "disabled" ); +//setter +$( ".selector" ).resizable( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-alsoResize"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-alsoResize">alsoResize</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, jQuery, Element</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Resize these elements synchronous when resizing.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>alsoResize</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ alsoResize: '.other' });</code></pre> +</dd> + + +<dt> + Get or set the <code>alsoResize</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var alsoResize = $( ".selector" ).resizable( "option", "alsoResize" ); +//setter +$( ".selector" ).resizable( "option", "alsoResize", '.other' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-animate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-animate">animate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Animates to the final size after resizing.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>animate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ animate: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>animate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var animate = $( ".selector" ).resizable( "option", "animate" ); +//setter +$( ".selector" ).resizable( "option", "animate", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-animateDuration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-animateDuration">animateDuration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'slow'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Duration time for animating, in milliseconds. Other possible values: 'slow', 'normal', 'fast'.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>animateDuration</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ animateDuration: 500 });</code></pre> +</dd> + + +<dt> + Get or set the <code>animateDuration</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var animateDuration = $( ".selector" ).resizable( "option", "animateDuration" ); +//setter +$( ".selector" ).resizable( "option", "animateDuration", 500 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-animateEasing"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-animateEasing">animateEasing</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'swing'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Easing effect for animating.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>animateEasing</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ animateEasing: 'swing' });</code></pre> +</dd> + + +<dt> + Get or set the <code>animateEasing</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var animateEasing = $( ".selector" ).resizable( "option", "animateEasing" ); +//setter +$( ".selector" ).resizable( "option", "animateEasing", 'swing' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-aspectRatio"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-aspectRatio">aspectRatio</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, Float</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, resizing is constrained by the original aspect ratio. Otherwise a custom aspect ratio can be specified, such as 9 / 16, or 0.5.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>aspectRatio</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ aspectRatio: .75 });</code></pre> +</dd> + + +<dt> + Get or set the <code>aspectRatio</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var aspectRatio = $( ".selector" ).resizable( "option", "aspectRatio" ); +//setter +$( ".selector" ).resizable( "option", "aspectRatio", .75 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-autoHide"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-autoHide">autoHide</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, automatically hides the handles except when the mouse hovers over the element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>autoHide</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ autoHide: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>autoHide</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var autoHide = $( ".selector" ).resizable( "option", "autoHide" ); +//setter +$( ".selector" ).resizable( "option", "autoHide", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cancel"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cancel">cancel</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">':input,option'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Prevents resizing if you start on elements matching the selector.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>cancel</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ cancel: ':input,option' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cancel</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cancel = $( ".selector" ).resizable( "option", "cancel" ); +//setter +$( ".selector" ).resizable( "option", "cancel", ':input,option' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-containment"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-containment">containment</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Element, Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Constrains resizing to within the bounds of the specified element. Possible values: 'parent', 'document', a DOMElement, or a Selector.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>containment</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ containment: 'parent' });</code></pre> +</dd> + + +<dt> + Get or set the <code>containment</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var containment = $( ".selector" ).resizable( "option", "containment" ); +//setter +$( ".selector" ).resizable( "option", "containment", 'parent' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-delay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-delay">delay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Tolerance, in milliseconds, for when resizing should start. If specified, resizing will not start until after mouse is moved beyond duration. This can help prevent unintended resizing when clicking on an element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>delay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ delay: 20 });</code></pre> +</dd> + + +<dt> + Get or set the <code>delay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var delay = $( ".selector" ).resizable( "option", "delay" ); +//setter +$( ".selector" ).resizable( "option", "delay", 20 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-distance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-distance">distance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Tolerance, in pixels, for when resizing should start. If specified, resizing will not start until after mouse is moved beyond distance. This can help prevent unintended resizing when clicking on an element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>distance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ distance: 20 });</code></pre> +</dd> + + +<dt> + Get or set the <code>distance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var distance = $( ".selector" ).resizable( "option", "distance" ); +//setter +$( ".selector" ).resizable( "option", "distance", 20 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-ghost"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-ghost">ghost</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, a semi-transparent helper element is shown for resizing.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>ghost</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ ghost: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>ghost</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var ghost = $( ".selector" ).resizable( "option", "ghost" ); +//setter +$( ".selector" ).resizable( "option", "ghost", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-grid"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-grid">grid</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Snaps the resizing element to a grid, every x and y pixels. Array values: [x, y]</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>grid</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ grid: [50, 50] });</code></pre> +</dd> + + +<dt> + Get or set the <code>grid</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var grid = $( ".selector" ).resizable( "option", "grid" ); +//setter +$( ".selector" ).resizable( "option", "grid", [50, 50] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-handles"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-handles">handles</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Object</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'e, s, se'</dd> + + </dl> + </div> + <div class="option-description"> + <p>If specified as a string, should be a comma-split list of any of the following: 'n, e, s, w, ne, se, sw, nw, all'. The necessary handles will be auto-generated by the plugin. +</p><p>If specified as an object, the following keys are supported: { n, e, s, w, ne, se, sw, nw }. The value of any specified should be a jQuery selector matching the child element of the resizable to use as that handle. If the handle is not a child of the resizable, you can pass in the DOMElement or a valid jQuery object directly.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>handles</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ handles: 'n, e, s, w' });</code></pre> +</dd> + + +<dt> + Get or set the <code>handles</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var handles = $( ".selector" ).resizable( "option", "handles" ); +//setter +$( ".selector" ).resizable( "option", "handles", 'n, e, s, w' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-helper"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-helper">helper</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>This is the css class that will be added to a proxy element to outline the resize during the drag of the resize handle. Once the resize is complete, the original element is sized.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>helper</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ helper: 'ui-state-highlight' });</code></pre> +</dd> + + +<dt> + Get or set the <code>helper</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var helper = $( ".selector" ).resizable( "option", "helper" ); +//setter +$( ".selector" ).resizable( "option", "helper", 'ui-state-highlight' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-maxHeight"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-maxHeight">maxHeight</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>This is the maximum height the resizable should be allowed to resize to.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>maxHeight</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ maxHeight: 300 });</code></pre> +</dd> + + +<dt> + Get or set the <code>maxHeight</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var maxHeight = $( ".selector" ).resizable( "option", "maxHeight" ); +//setter +$( ".selector" ).resizable( "option", "maxHeight", 300 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-maxWidth"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-maxWidth">maxWidth</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>This is the maximum width the resizable should be allowed to resize to.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>maxWidth</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ maxWidth: 250 });</code></pre> +</dd> + + +<dt> + Get or set the <code>maxWidth</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var maxWidth = $( ".selector" ).resizable( "option", "maxWidth" ); +//setter +$( ".selector" ).resizable( "option", "maxWidth", 250 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minHeight"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minHeight">minHeight</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">10</dd> + + </dl> + </div> + <div class="option-description"> + <p>This is the minimum height the resizable should be allowed to resize to.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>minHeight</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ minHeight: 150 });</code></pre> +</dd> + + +<dt> + Get or set the <code>minHeight</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minHeight = $( ".selector" ).resizable( "option", "minHeight" ); +//setter +$( ".selector" ).resizable( "option", "minHeight", 150 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-minWidth"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-minWidth">minWidth</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">10</dd> + + </dl> + </div> + <div class="option-description"> + <p>This is the minimum width the resizable should be allowed to resize to.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a resizable with the <code>minWidth</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).resizable({ minWidth: 75 });</code></pre> +</dd> + + +<dt> + Get or set the <code>minWidth</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var minWidth = $( ".selector" ).resizable( "option", "minWidth" ); +//setter +$( ".selector" ).resizable( "option", "minWidth", 75 );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-start"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-start">start</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">resizestart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the start of a resize operation.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>start</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).resizable({ + start: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>start</code> event by type: <code>resizestart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizestart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-resize"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-resize">resize</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">resize</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered during the resize, on the drag of the resize handler.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>resize</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).resizable({ + resize: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>resize</code> event by type: <code>resize</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;resize&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-stop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-stop">stop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">resizestop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the end of a resize operation.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>stop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).resizable({ + stop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>stop</code> event by type: <code>resizestop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizestop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.resizable( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the resizable functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.resizable( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the resizable.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.resizable( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the resizable.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.resizable( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any resizable option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.resizable( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple resizable options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.resizable( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-resizable element.</p> + </div> +</li> + + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Resizable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.resizable.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;<strong>ui-resizable</strong>&quot;&gt;<br /> +&#160;&#160;&#160;&lt;div style=&quot;-moz-user-select: none;&quot; unselectable=&quot;on&quot; class=&quot;<strong>ui-resizable-handle ui-resizable-e</strong>&quot;&gt;&lt;/div&gt;<br /> +&#160;&#160;&#160;&lt;div style=&quot;-moz-user-select: none;&quot; unselectable=&quot;on&quot; class=&quot;<strong>ui-resizable-handle ui-resizable-s</strong>&quot;&gt;&lt;/div&gt;<br /> +&#160;&#160;&#160;&lt;div unselectable=&quot;on&quot; style=&quot;z-index: 1001; -moz-user-select: none;&quot; class=&quot;<strong>ui-resizable-handle ui-resizable-se</strong> ui-icon ui-icon-gripsmall-diagonal-se&quot;&gt;&lt;/div&gt;<br /> +&lt;/div&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the resizable plugin, not markup you should use to create a resizable. The only markup needed for that is &lt;div&gt;&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 46166 bytes +Post-expand include size: 77451 bytes +Template argument size: 41766 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3770-1!1!0!!en!2 and timestamp 20100421192517 --> diff --git a/fannie/src/jquery/development-bundle/docs/selectable.html b/fannie/src/jquery/development-bundle/docs/selectable.html new file mode 100644 index 000000000..4e211bedd --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/selectable.html @@ -0,0 +1,807 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Selectable</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Selectable plugin allows for elements to be selected by dragging a box (sometimes called a lasso) with the mouse over the elements. Also, elements can be selected by click or drag while holding the Ctrl/Meta key, allowing for multiple (non-contiguous) selections.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel=""> +A simple jQuery UI Selectable.<br /> +</p> +<pre>$(&quot;#selectable&quot;).selectable(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;style type=&quot;text/css&quot;&gt; +#selectable .ui-selecting { + background: silver; +} +#selectable .ui-selected { + background: gray; +} +&lt;/style&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#selectable&quot;).selectable(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;ul id=&quot;selectable&quot;&gt; +&lt;li&gt;Item 1&lt;/li&gt; +&lt;li&gt;Item 2&lt;/li&gt; +&lt;li&gt;Item 3&lt;/li&gt; +&lt;li&gt;Item 4&lt;/li&gt; +&lt;li&gt;Item 5&lt;/li&gt; +&lt;/ul&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the selectable. Can be set when initialising (first creating) the selectable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).selectable( "option", "disabled" ); +//setter +$( ".selector" ).selectable( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-autoRefresh"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-autoRefresh">autoRefresh</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>This determines whether to refresh (recalculate) the position and size of each selectee at the beginning of each select operation. If you have many many items, you may want to set this to false and call the refresh method manually.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>autoRefresh</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ autoRefresh: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>autoRefresh</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var autoRefresh = $( ".selector" ).selectable( "option", "autoRefresh" ); +//setter +$( ".selector" ).selectable( "option", "autoRefresh", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cancel"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cancel">cancel</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">':input,option'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Prevents selecting if you start on elements matching the selector.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>cancel</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ cancel: ':input,option' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cancel</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cancel = $( ".selector" ).selectable( "option", "cancel" ); +//setter +$( ".selector" ).selectable( "option", "cancel", ':input,option' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-delay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-delay">delay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Time in milliseconds to define when the selecting should start. It helps preventing unwanted selections when clicking on an element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>delay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ delay: 20 });</code></pre> +</dd> + + +<dt> + Get or set the <code>delay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var delay = $( ".selector" ).selectable( "option", "delay" ); +//setter +$( ".selector" ).selectable( "option", "delay", 20 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-distance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-distance">distance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Tolerance, in pixels, for when selecting should start. If specified, selecting will not start until after mouse is dragged beyond distance.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>distance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ distance: 20 });</code></pre> +</dd> + + +<dt> + Get or set the <code>distance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var distance = $( ".selector" ).selectable( "option", "distance" ); +//setter +$( ".selector" ).selectable( "option", "distance", 20 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-filter"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-filter">filter</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'*'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The matching child elements will be made selectees (able to be selected).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>filter</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ filter: 'li' });</code></pre> +</dd> + + +<dt> + Get or set the <code>filter</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var filter = $( ".selector" ).selectable( "option", "filter" ); +//setter +$( ".selector" ).selectable( "option", "filter", 'li' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-tolerance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-tolerance">tolerance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'touch'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Possible values: 'touch', 'fit'. +</p> +<ul> +<li><b>fit</b>: draggable overlaps the droppable entirely</li> +<li><b>touch</b>: draggable overlaps the droppable any amount</li> +</ul> +<p></p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a selectable with the <code>tolerance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).selectable({ tolerance: 'fit' });</code></pre> +</dd> + + +<dt> + Get or set the <code>tolerance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var tolerance = $( ".selector" ).selectable( "option", "tolerance" ); +//setter +$( ".selector" ).selectable( "option", "tolerance", 'fit' );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-selected"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-selected">selected</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">selected</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the end of the select operation, on each element added to the selection.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>selected</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).selectable({ + selected: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>selected</code> event by type: <code>selected</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;selected&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-selecting"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-selecting">selecting</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">selecting</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered during the select operation, on each element added to the selection.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>selecting</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).selectable({ + selecting: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>selecting</code> event by type: <code>selecting</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;selecting&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-start"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-start">start</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">selectablestart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the beginning of the select operation.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>start</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).selectable({ + start: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>start</code> event by type: <code>selectablestart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectablestart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-stop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-stop">stop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">selectablestop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the end of the select operation.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>stop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).selectable({ + stop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>stop</code> event by type: <code>selectablestop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectablestop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-unselected"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-unselected">unselected</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">unselected</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered at the end of the select operation, on each element removed from the selection.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>unselected</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).selectable({ + unselected: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>unselected</code> event by type: <code>unselected</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;unselected&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-unselecting"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-unselecting">unselecting</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">unselecting</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered during the select operation, on each element removed from the selection.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>unselecting</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).selectable({ + unselecting: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>unselecting</code> event by type: <code>unselecting</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;unselecting&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the selectable functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the selectable.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the selectable.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any selectable option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple selectable options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-selectable element.</p> + </div> +</li> + + +<li class="method" id="method-refresh"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-refresh">refresh</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.selectable( "refresh" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Refresh the position and size of each selectee element. This method can be used to manually recalculate the position and size of each selectee element. Very useful if autoRefresh is set to false.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Selectable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.selectable.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;ul class=&quot;<strong>ui-selectable</strong>&quot;&gt;<br /> +&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-selectee</strong>&quot;&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-selectee</strong>&quot;&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-selectee</strong>&quot;&gt;&lt;/li&gt;<br /> +&lt;/ul&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the selectable plugin, not markup you should use to create a selectable. The only markup needed for that is <br />&lt;ul&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&lt;/ul&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 33182 bytes +Post-expand include size: 51117 bytes +Template argument size: 26285 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3771-1!1!0!!en!2 and timestamp 20100421033329 --> diff --git a/fannie/src/jquery/development-bundle/docs/show.html b/fannie/src/jquery/development-bundle/docs/show.html new file mode 100644 index 000000000..226249d0e --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/show.html @@ -0,0 +1,144 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI show</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/show?section=1" title="Edit section: show( effect, [options], [speed], [callback] )">edit</a>]</div><a name="show.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>show( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3> +<p>The enhanced show method optionally accepts jQuery UI advanced effects.</p> +<p>Uses a specific effect on an element to show the element if the first argument is a effect string.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="170"> +Apply the effect slide if you click on the p to show a div.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">show</strong>(&quot;slide&quot;, {}, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.slide.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + div { display: none; margin: 0px; width: 100px; height: 80px; background: blue; position: relative; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">show</strong>(&quot;slide&quot;, {}, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-effect"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-effect">effect</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.</p> + </div> +</li> + + +<li class="option" id="option-options"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-options">options</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Hash</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A object/hash including specific options for the effect.</p> + </div> +</li> + + +<li class="option" id="option-speed"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-speed">speed</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + +<li class="option" id="option-callback"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-callback">callback</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A function that is called after the effect is completed.</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 6354 bytes +Post-expand include size: 8760 bytes +Template argument size: 5486 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2613-1!1!0!!en!2 and timestamp 20100421124545 --> diff --git a/fannie/src/jquery/development-bundle/docs/slider.html b/fannie/src/jquery/development-bundle/docs/slider.html new file mode 100644 index 000000000..dd669d60d --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/slider.html @@ -0,0 +1,821 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Slider</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Slider plugin makes selected elements into sliders. There are various options such as multiple handles, and ranges. The handle can be moved with the mouse or the arrow keys.</p> +<p>All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'): +</p><p>The slider widget will create handle elements with the class 'ui-slider-handle' on initialization. You can specify custom handle elements by creating and appending the elements and adding the 'ui-slider-handle' class before init. It will only create the number of handles needed to match the length of value/values. For example, if you specify 'values: [1, 5, 18]' and create one custom handle, the plugin will create the other two. +</p> +<ul> + <li><b>ui.handle</b>: DOMElement - the current focused handle + <li><b>ui.value</b>: Integer - the current handle's value +</ul> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li>UI Widget</li> +<li>UI Mouse</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel=""> +A simple jQuery UI Slider.<br /> +</p> +<pre>$(&quot;#slider&quot;).slider(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;style type=&quot;text/css&quot;&gt; + #slider { margin: 10px; } + &lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;#slider&quot;).slider(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;slider&quot;&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the slider. Can be set when initialising (first creating) the slider.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).slider( "option", "disabled" ); +//setter +$( ".selector" ).slider( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-animate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-animate">animate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, String, Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether to slide handle smoothly when user click outside handle on the bar. Will also accept a string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>animate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ animate: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>animate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var animate = $( ".selector" ).slider( "option", "animate" ); +//setter +$( ".selector" ).slider( "option", "animate", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-max"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-max">max</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">100</dd> + + </dl> + </div> + <div class="option-description"> + <p>The maximum value of the slider.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>max</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ max: 7 });</code></pre> +</dd> + + +<dt> + Get or set the <code>max</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var max = $( ".selector" ).slider( "option", "max" ); +//setter +$( ".selector" ).slider( "option", "max", 7 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-min"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-min">min</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>The minimum value of the slider.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>min</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ min: -7 });</code></pre> +</dd> + + +<dt> + Get or set the <code>min</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var min = $( ".selector" ).slider( "option", "min" ); +//setter +$( ".selector" ).slider( "option", "min", -7 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-orientation"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-orientation">orientation</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'horizontal'</dd> + + </dl> + </div> + <div class="option-description"> + <p>This option determines whether the slider has the min at the left, the max at the right or the min at the bottom, the max at the top. Possible values: 'horizontal', 'vertical'.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>orientation</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ orientation: 'vertical' });</code></pre> +</dd> + + +<dt> + Get or set the <code>orientation</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var orientation = $( ".selector" ).slider( "option", "orientation" ); +//setter +$( ".selector" ).slider( "option", "orientation", 'vertical' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-range"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-range">range</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean, String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the slider will detect if you have two handles and create a stylable range element between these two. Two other possible values are 'min' and 'max'. A min range goes from the slider min to one handle. A max range goes from one handle to the slider max.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>range</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ range: 'min' });</code></pre> +</dd> + + +<dt> + Get or set the <code>range</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var range = $( ".selector" ).slider( "option", "range" ); +//setter +$( ".selector" ).slider( "option", "range", 'min' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-step"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-step">step</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Determines the size or amount of each interval or step the slider takes between min and max. The full specified value range of the slider (max - min) needs to be evenly divisible by the step.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>step</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ step: 5 });</code></pre> +</dd> + + +<dt> + Get or set the <code>step</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var step = $( ".selector" ).slider( "option", "step" ); +//setter +$( ".selector" ).slider( "option", "step", 5 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-value"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-value">value</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Determines the value of the slider, if there's only one handle. If there is more than one handle, determines the value of the first handle.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>value</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ value: 37 });</code></pre> +</dd> + + +<dt> + Get or set the <code>value</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var value = $( ".selector" ).slider( "option", "value" ); +//setter +$( ".selector" ).slider( "option", "value", 37 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-values"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-values">values</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>This option can be used to specify multiple handles. If range is set to true, the length of 'values' should be 2.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a slider with the <code>values</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).slider({ values: [1,5,9] });</code></pre> +</dd> + + +<dt> + Get or set the <code>values</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var values = $( ".selector" ).slider( "option", "values" ); +//setter +$( ".selector" ).slider( "option", "values", [1,5,9] );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-start"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-start">start</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">slidestart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the user starts sliding.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>start</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).slider({ + start: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>start</code> event by type: <code>slidestart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidestart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-slide"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-slide">slide</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">slide</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered on every mouse move during slide. Use ui.value (single-handled sliders) to obtain the value of the current handle, $(..).slider('value', index) to get another handles' value. +</p><p>Return false in order to prevent a slide, based on ui.value.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>slide</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).slider({ + slide: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>slide</code> event by type: <code>slide</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;slide&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-change"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-change">change</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">slidechange</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered on slide stop, or if the value is changed programmatically (by the <code>value</code> method). Takes arguments event and ui. Use event.orginalEvent to detect whether the value changed by mouse, keyboard, or programmatically. Use ui.value (single-handled sliders) to obtain the value of the current handle, $(this).slider('values', index) to get another handle's value.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>change</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).slider({ + change: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>change</code> event by type: <code>slidechange</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidechange&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-stop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-stop">stop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">slidestop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the user stops sliding.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>stop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).slider({ + stop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>stop</code> event by type: <code>slidestop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidestop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the slider functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the slider.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the slider.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any slider option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple slider options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-slider element.</p> + </div> +</li> + + +<li class="method" id="method-value"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-value">value</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "value" + +, <span class="optional">[</span>value<span class="optional">] </span> + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Gets or sets the value of the slider. For single handle sliders.</p> + </div> +</li> + + +<li class="method" id="method-values"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-values">values</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.slider( "values" + +, index + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Gets or sets the values of the slider. For multiple handle or range sliders.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Slider plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.slider.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;ui-slider<strong> ui-slider-horizontal</strong> ui-widget ui-widget-content ui-corner-all&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;a style=&quot;left: 0%;&quot; class=&quot;<strong>ui-slider-handle</strong> ui-state-default ui-corner-all&quot; href=&quot;#&quot;&gt;&lt;/a&gt;<br /> +&lt;/div&gt;<br /> + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the slider plugin, not markup you should use to create a slider. The only markup needed for that is &lt;div&gt;&lt;div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 34930 bytes +Post-expand include size: 52896 bytes +Template argument size: 27114 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3776-1!1!0!!en!2 and timestamp 20100421144758 --> diff --git a/fannie/src/jquery/development-bundle/docs/sortable.html b/fannie/src/jquery/development-bundle/docs/sortable.html new file mode 100644 index 000000000..247124ba9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/sortable.html @@ -0,0 +1,1910 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Sortable</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>The jQuery UI Sortable plugin makes selected elements sortable by dragging with the mouse.</p> +<p>All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):</p> +<ul> +<li><b>ui.helper</b> - the current helper element (most often a clone of the item)</li> +<li><b>ui.position</b> - current position of the helper</li> +<li><b>ui.offset</b> - current absolute position of the helper</li> +<li><b>ui.item</b> - the current dragged element</li> +<li><b>ui.placeholder</b> - the placeholder (if you defined one)</li> +<li><b>ui.sender</b> - the sortable where the item comes from (only exists if you move from one connected list to another)</li> +</ul> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="100"> +A simple jQuery UI Sortable.<br /> +</p> +<pre>$(&quot;#sortable&quot;).sortable(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#sortable&quot;).sortable(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;ul id=&quot;sortable&quot;&gt; +&lt;li&gt;Item 1&lt;/li&gt; +&lt;li&gt;Item 2&lt;/li&gt; +&lt;li&gt;Item 3&lt;/li&gt; +&lt;li&gt;Item 4&lt;/li&gt; +&lt;li&gt;Item 5&lt;/li&gt; +&lt;/ul&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the sortable. Can be set when initialising (first creating) the sortable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).sortable( "option", "disabled" ); +//setter +$( ".selector" ).sortable( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-appendTo"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-appendTo">appendTo</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'parent'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines where the helper that moves with the mouse is being appended to during the drag (for example, to resolve overlap/zIndex issues).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>appendTo</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ appendTo: 'body' });</code></pre> +</dd> + + +<dt> + Get or set the <code>appendTo</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var appendTo = $( ".selector" ).sortable( "option", "appendTo" ); +//setter +$( ".selector" ).sortable( "option", "appendTo", 'body' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-axis"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-axis">axis</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If defined, the items can be dragged only horizontally or vertically. Possible values:'x', 'y'.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>axis</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ axis: 'x' });</code></pre> +</dd> + + +<dt> + Get or set the <code>axis</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var axis = $( ".selector" ).sortable( "option", "axis" ); +//setter +$( ".selector" ).sortable( "option", "axis", 'x' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cancel"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cancel">cancel</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">':input,button'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Prevents sorting if you start on elements matching the selector.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>cancel</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ cancel: 'button' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cancel</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cancel = $( ".selector" ).sortable( "option", "cancel" ); +//setter +$( ".selector" ).sortable( "option", "cancel", 'button' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-connectWith"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-connectWith">connectWith</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Takes a jQuery selector with items that also have sortables applied. If used, the sortable is now connected to the other one-way, so you can drag from this sortable to the other.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>connectWith</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ connectWith: '.otherlist' });</code></pre> +</dd> + + +<dt> + Get or set the <code>connectWith</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var connectWith = $( ".selector" ).sortable( "option", "connectWith" ); +//setter +$( ".selector" ).sortable( "option", "connectWith", '.otherlist' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-containment"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-containment">containment</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Element, String, Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Constrains dragging to within the bounds of the specified element - can be a DOM element, 'parent', 'document', 'window', or a jQuery selector.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>containment</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ containment: 'parent' });</code></pre> +</dd> + + +<dt> + Get or set the <code>containment</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var containment = $( ".selector" ).sortable( "option", "containment" ); +//setter +$( ".selector" ).sortable( "option", "containment", 'parent' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cursor"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cursor">cursor</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'auto'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines the cursor that is being shown while sorting.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>cursor</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ cursor: 'crosshair' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cursor</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cursor = $( ".selector" ).sortable( "option", "cursor" ); +//setter +$( ".selector" ).sortable( "option", "cursor", 'crosshair' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cursorAt"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cursorAt">cursorAt</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Object</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Moves the sorting element or helper so the cursor always appears to drag from the same position. Coordinates can be given as a hash using a combination of one or two keys: <code>{ top, left, right, bottom }</code>.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>cursorAt</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ cursorAt: 'top' });</code></pre> +</dd> + + +<dt> + Get or set the <code>cursorAt</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cursorAt = $( ".selector" ).sortable( "option", "cursorAt" ); +//setter +$( ".selector" ).sortable( "option", "cursorAt", 'top' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-delay"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-delay">delay</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Time in milliseconds to define when the sorting should start. It helps preventing unwanted drags when clicking on an element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>delay</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ delay: 500 });</code></pre> +</dd> + + +<dt> + Get or set the <code>delay</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var delay = $( ".selector" ).sortable( "option", "delay" ); +//setter +$( ".selector" ).sortable( "option", "delay", 500 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-distance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-distance">distance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1</dd> + + </dl> + </div> + <div class="option-description"> + <p>Tolerance, in pixels, for when sorting should start. If specified, sorting will not start until after mouse is dragged beyond distance. Can be used to allow for clicks on elements within a handle.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>distance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ distance: 30 });</code></pre> +</dd> + + +<dt> + Get or set the <code>distance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var distance = $( ".selector" ).sortable( "option", "distance" ); +//setter +$( ".selector" ).sortable( "option", "distance", 30 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-dropOnEmpty"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-dropOnEmpty">dropOnEmpty</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If false items from this sortable can't be dropped to an empty linked sortable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>dropOnEmpty</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ dropOnEmpty: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>dropOnEmpty</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var dropOnEmpty = $( ".selector" ).sortable( "option", "dropOnEmpty" ); +//setter +$( ".selector" ).sortable( "option", "dropOnEmpty", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-forceHelperSize"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-forceHelperSize">forceHelperSize</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If true, forces the helper to have a size.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>forceHelperSize</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ forceHelperSize: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>forceHelperSize</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var forceHelperSize = $( ".selector" ).sortable( "option", "forceHelperSize" ); +//setter +$( ".selector" ).sortable( "option", "forceHelperSize", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-forcePlaceholderSize"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-forcePlaceholderSize">forcePlaceholderSize</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If true, forces the placeholder to have a size.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>forcePlaceholderSize</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ forcePlaceholderSize: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>forcePlaceholderSize</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var forcePlaceholderSize = $( ".selector" ).sortable( "option", "forcePlaceholderSize" ); +//setter +$( ".selector" ).sortable( "option", "forcePlaceholderSize", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-grid"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-grid">grid</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Snaps the sorting element or helper to a grid, every x and y pixels. Array values: [x, y]</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>grid</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ grid: [50, 20] });</code></pre> +</dd> + + +<dt> + Get or set the <code>grid</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var grid = $( ".selector" ).sortable( "option", "grid" ); +//setter +$( ".selector" ).sortable( "option", "grid", [50, 20] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-handle"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-handle">handle</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector, Element</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Restricts sort start click to the specified element.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>handle</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ handle: 'h2' });</code></pre> +</dd> + + +<dt> + Get or set the <code>handle</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var handle = $( ".selector" ).sortable( "option", "handle" ); +//setter +$( ".selector" ).sortable( "option", "handle", 'h2' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-helper"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-helper">helper</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Function</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'original'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Allows for a helper element to be used for dragging display. The supplied function receives the event and the element being sorted, and should return a DOMElement to be used as a custom proxy helper. Possible values: 'original', 'clone'</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>helper</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ helper: 'clone' });</code></pre> +</dd> + + +<dt> + Get or set the <code>helper</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var helper = $( ".selector" ).sortable( "option", "helper" ); +//setter +$( ".selector" ).sortable( "option", "helper", 'clone' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-items"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-items">items</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Selector</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'&gt; *'</dd> + + </dl> + </div> + <div class="option-description"> + <p>Specifies which items inside the element should be sortable.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>items</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ items: 'li' });</code></pre> +</dd> + + +<dt> + Get or set the <code>items</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var items = $( ".selector" ).sortable( "option", "items" ); +//setter +$( ".selector" ).sortable( "option", "items", 'li' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-opacity"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-opacity">opacity</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Float</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines the opacity of the helper while sorting. From 0.01 to 1</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>opacity</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ opacity: 0.6 });</code></pre> +</dd> + + +<dt> + Get or set the <code>opacity</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var opacity = $( ".selector" ).sortable( "option", "opacity" ); +//setter +$( ".selector" ).sortable( "option", "opacity", 0.6 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-placeholder"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-placeholder">placeholder</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Class that gets applied to the otherwise white space.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>placeholder</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ placeholder: 'ui-state-highlight' });</code></pre> +</dd> + + +<dt> + Get or set the <code>placeholder</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var placeholder = $( ".selector" ).sortable( "option", "placeholder" ); +//setter +$( ".selector" ).sortable( "option", "placeholder", 'ui-state-highlight' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-revert"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-revert">revert</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean/Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the item will be reverted to its new DOM position with a smooth animation. Optionally, it can also be set to a number that controls the duration of the animation in ms.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>revert</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ revert: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>revert</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var revert = $( ".selector" ).sortable( "option", "revert" ); +//setter +$( ".selector" ).sortable( "option", "revert", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scroll"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scroll">scroll</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">true</dd> + + </dl> + </div> + <div class="option-description"> + <p>If set to true, the page scrolls when coming to an edge.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>scroll</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ scroll: false });</code></pre> +</dd> + + +<dt> + Get or set the <code>scroll</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scroll = $( ".selector" ).sortable( "option", "scroll" ); +//setter +$( ".selector" ).sortable( "option", "scroll", false );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scrollSensitivity"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scrollSensitivity">scrollSensitivity</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">20</dd> + + </dl> + </div> + <div class="option-description"> + <p>Defines how near the mouse must be to an edge to start scrolling.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>scrollSensitivity</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ scrollSensitivity: 40 });</code></pre> +</dd> + + +<dt> + Get or set the <code>scrollSensitivity</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scrollSensitivity = $( ".selector" ).sortable( "option", "scrollSensitivity" ); +//setter +$( ".selector" ).sortable( "option", "scrollSensitivity", 40 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-scrollSpeed"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-scrollSpeed">scrollSpeed</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">20</dd> + + </dl> + </div> + <div class="option-description"> + <p>The speed at which the window should scroll once the mouse pointer gets within the scrollSensitivity distance.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>scrollSpeed</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ scrollSpeed: 40 });</code></pre> +</dd> + + +<dt> + Get or set the <code>scrollSpeed</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var scrollSpeed = $( ".selector" ).sortable( "option", "scrollSpeed" ); +//setter +$( ".selector" ).sortable( "option", "scrollSpeed", 40 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-tolerance"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-tolerance">tolerance</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'intersect'</dd> + + </dl> + </div> + <div class="option-description"> + <p>This is the way the reordering behaves during drag. Possible values: 'intersect', 'pointer'. In some setups, 'pointer' is more natural. +</p> +<ul> +<li><b>intersect</b>: draggable overlaps the droppable at least 50%</li> +<li><b>pointer</b>: mouse pointer overlaps the droppable</li> +</ul> +<p></p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>tolerance</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ tolerance: 'pointer' });</code></pre> +</dd> + + +<dt> + Get or set the <code>tolerance</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var tolerance = $( ".selector" ).sortable( "option", "tolerance" ); +//setter +$( ".selector" ).sortable( "option", "tolerance", 'pointer' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-zIndex"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-zIndex">zIndex</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Integer</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">1000</dd> + + </dl> + </div> + <div class="option-description"> + <p>Z-index for element/helper while being sorted.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a sortable with the <code>zIndex</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).sortable({ zIndex: 5 });</code></pre> +</dd> + + +<dt> + Get or set the <code>zIndex</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var zIndex = $( ".selector" ).sortable( "option", "zIndex" ); +//setter +$( ".selector" ).sortable( "option", "zIndex", 5 );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-start"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-start">start</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortstart</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when sorting starts.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>start</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + start: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>start</code> event by type: <code>sortstart</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortstart&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-sort"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-sort">sort</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sort</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered during sorting.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>sort</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + sort: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>sort</code> event by type: <code>sort</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sort&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-change"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-change">change</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortchange</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered during sorting, but only when the DOM position has changed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>change</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + change: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>change</code> event by type: <code>sortchange</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortchange&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-beforeStop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-beforeStop">beforeStop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortbeforestop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when sorting stops, but when the placeholder/helper is still available.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>beforeStop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + beforeStop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>beforeStop</code> event by type: <code>sortbeforestop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortbeforestop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-stop"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-stop">stop</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortstop</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when sorting has stopped.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>stop</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + stop: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>stop</code> event by type: <code>sortstop</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortstop&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-update"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-update">update</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortupdate</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when the user stopped sorting and the DOM position has changed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>update</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + update: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>update</code> event by type: <code>sortupdate</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortupdate&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-receive"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-receive">receive</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortreceive</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a connected sortable list has received an item from another list.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>receive</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + receive: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>receive</code> event by type: <code>sortreceive</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortreceive&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-remove"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-remove">remove</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortremove</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a sortable item has been dragged out from the list and into another.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>remove</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + remove: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>remove</code> event by type: <code>sortremove</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortremove&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-over"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-over">over</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortover</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a sortable item is moved into a connected list.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>over</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + over: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>over</code> event by type: <code>sortover</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortover&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-out"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-out">out</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortout</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a sortable item is moved away from a connected list.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>out</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + out: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>out</code> event by type: <code>sortout</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortout&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-activate"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-activate">activate</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortactivate</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when using connected lists, every connected list on drag start receives it.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>activate</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + activate: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>activate</code> event by type: <code>sortactivate</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortactivate&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-deactivate"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-deactivate">deactivate</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">sortdeactivate</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when sorting was stopped, is propagated to all possible connected lists.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>deactivate</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).sortable({ + deactivate: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>deactivate</code> event by type: <code>sortdeactivate</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortdeactivate&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the sortable functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the sortable.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the sortable.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any sortable option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple sortable options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-sortable element.</p> + </div> +</li> + + +<li class="method" id="method-serialize"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-serialize">serialize</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "serialize" + +, <span class="optional">[</span>options<span class="optional">] </span> + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Serializes the sortable's item id's into a form/ajax submittable string. Calling this method produces a hash that can be appended to any url to easily submit a new item order back to the server. +</p><p>It works by default by looking at the id of each item in the format 'setname_number', and it spits out a hash like "setname[]=number&amp;setname[]=number". +</p><p>You can also give in a option hash as second argument to custom define how the function works. The possible options are: 'key' (replaces part1[] with whatever you want), 'attribute' (test another attribute than 'id') and 'expression' (use your own regexp). +</p><p>If serialize returns an empty string, make sure the id attributes include an underscore. They must be in the form: "set_number" For example, a 3 element list with id attributes foo_1, foo_5, foo_2 will serialize to foo[]=1&amp;foo[]=5&amp;foo[]=2. You can use an underscore, equal sign or hyphen to separate the set and number. For example foo=1 or foo-1 or foo_1 all serialize to foo[]=1.</p> + </div> +</li> + + +<li class="method" id="method-toArray"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-toArray">toArray</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "toArray" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Serializes the sortable's item id's into an array of string. If you have +</p> +<pre> +&lt;ul id=&quot;a_sortable&quot;&gt;&lt;br&gt; +&lt;li id=&quot;hello&quot;&gt;Hello&lt;/li&gt;&lt;br&gt; +&lt;li id=&quot;goodbye&quot;&gt;Good bye&lt;/li&gt;&lt;br&gt; +&lt;/ul&gt; +</pre> +<p>and do +</p> +<pre>var result = $('#a_sortable').sortable('toArray');</pre> +<p>then +</p> +<pre>result[0] will contain &quot;hello&quot; and result[1] will contain &quot;goodbye&quot;.</pre></p> + </div> +</li> + +<p> +<li class="method" id="method-refresh"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-refresh">refresh</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "refresh" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Refresh the sortable items. Custom trigger the reloading of all sortable items, causing new items to be recognized.</p> + </div> +</li> + + +<li class="method" id="method-refreshPositions"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-refreshPositions">refreshPositions</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "refreshPositions" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Refresh the cached positions of the sortables' items. Calling this method refreshes the cached item positions of all sortables. This is usually done automatically by the script and slows down performance. Use wisely.</p> + </div> +</li> + + +<li class="method" id="method-cancel"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-cancel">cancel</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.sortable( "cancel" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Cancels a change in the current sortable and reverts it back to how it was before the current sort started. Useful in the stop and receive callback functions. +</p><p>If the sortable item is not being moved from one connected sortable to another: +</p> +<pre>$(this).sortable('cancel');</pre> +<p>will cancel the change. +</p><p>If the sortable item is being moved from one connected sortable to another: +</p> +<pre>$(ui.sender).sortable('cancel');</pre> +<p>will cancel the change. Useful in the 'receive' callback.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Sortable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.sortable.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;ul class=&quot;<strong>ui-sortable</strong>&quot;&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&lt;/ul&gt; + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the sortable plugin, not markup you should use to create a sortable. The only markup needed for that is <br />&lt;ul&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br /> +&lt;/ul&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 73516 bytes +Post-expand include size: 127836 bytes +Template argument size: 72364 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3772-1!1!0!!en!2 and timestamp 20100421060740 --> diff --git a/fannie/src/jquery/development-bundle/docs/switchClass.html b/fannie/src/jquery/development-bundle/docs/switchClass.html new file mode 100644 index 000000000..66c9b26d7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/switchClass.html @@ -0,0 +1,129 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI switchClass</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/switchClass?section=1" title="Edit section: switchClass( remove, add, [duration] )">edit</a>]</div><a name="switchClass.28_remove.2C_add.2C_.5Bduration.5D_.29"></a><h3>switchClass( remove, add, <span class="optional">[</span>duration<span class="optional">]</span> )</h3> +<p>Switches from the class defined in the first argument to the class defined as second argument, using an optional transition.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="170"> +Switch the class 'highlight' to 'blue' when a paragraph is clicked with a one second transition.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">switchClass</strong>(&quot;highlight&quot;, &quot;blue&quot;, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + p { margin: 4px; font-size:16px; font-weight:bolder; + cursor:pointer; } + .blue { background: blue; } + .highlight { background:yellow; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">switchClass</strong>(&quot;highlight&quot;, &quot;blue&quot;, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p class=&quot;highlight&quot;&gt;Click to switch&lt;/p&gt; +&lt;p class=&quot;highlight&quot;&gt;to blue&lt;/p&gt; +&lt;p class=&quot;highlight&quot;&gt;on these&lt;/p&gt; +&lt;p class=&quot;highlight&quot;&gt;paragraphs&lt;/p&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-remove"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-remove">remove</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>The CSS class that will be removed.</p> + </div> +</li> + + +<li class="option" id="option-add"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-add">add</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>The CSS class that will be added.</p> + </div> +</li> + + +<li class="option" id="option-duration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-duration">duration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 5818 bytes +Post-expand include size: 7682 bytes +Template argument size: 4812 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2609-1!1!0!!en!2 and timestamp 20100421133739 --> diff --git a/fannie/src/jquery/development-bundle/docs/tabs.html b/fannie/src/jquery/development-bundle/docs/tabs.html new file mode 100644 index 000000000..f0082cb8f --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/tabs.html @@ -0,0 +1,1512 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Options</a></li> +<li><a href="#events">Events</a></li> +<li><a href="#methods">Methods</a></li> +<li><a href="#theming">Theming</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI Tabs</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <p>Tabs are generally used to break content into multiple sections that can be swapped to save space, much like an accordion.</p> +<p>By default a tab widget will swap between tabbed sections onClick, but the events can be changed to onHover through an option. Tab content can be loaded via Ajax by setting an href on a tab.</p> +<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div> +<ul> +<li class="toclevel-1"><a href="#Events"><span class="tocnumber">1</span> <span class="toctext">Events</span></a></li> +<li class="toclevel-1"><a href="#Ajax_mode"><span class="tocnumber">2</span> <span class="toctext">Ajax mode</span></a> +<ul> +<li class="toclevel-2"><a href="#Back_button_and_bookmarking"><span class="tocnumber">2.1</span> <span class="toctext">Back button and bookmarking</span></a></li> +</ul> +</li> +<li class="toclevel-1"><a href="#How_to..."><span class="tocnumber">3</span> <span class="toctext">How to...</span></a> +<ul> +<li class="toclevel-2"><a href="#...retrieve_the_index_of_the_currently_selected_tab"><span class="tocnumber">3.1</span> <span class="toctext">...retrieve the index of the currently selected tab</span></a></li> +<li class="toclevel-2"><a href="#...open_links_in_the_current_tab_instead_of_leaving_the_page"><span class="tocnumber">3.2</span> <span class="toctext">...open links in the current tab instead of leaving the page</span></a></li> +<li class="toclevel-2"><a href="#...select_a_tab_from_a_text_link_instead_of_clicking_a_tab_itself"><span class="tocnumber">3.3</span> <span class="toctext">...select a tab from a text link instead of clicking a tab itself</span></a></li> +<li class="toclevel-2"><a href="#...prevent_switching_to_the_tab_on_click_depending_on_form_validation"><span class="tocnumber">3.4</span> <span class="toctext">...prevent switching to the tab on click depending on form validation</span></a></li> +<li class="toclevel-2"><a href="#...immediately_select_a_just_added_tab"><span class="tocnumber">3.5</span> <span class="toctext">...immediately select a just added tab</span></a></li> +<li class="toclevel-2"><a href="#...follow_a_tab.27s_URL_instead_of_loading_its_content_via_ajax"><span class="tocnumber">3.6</span> <span class="toctext">...follow a tab's URL instead of loading its content via ajax</span></a></li> +<li class="toclevel-2"><a href="#...prevent_a_FOUC_.28Flash_of_Unstyled_Content.29_before_tabs_are_initialized"><span class="tocnumber">3.7</span> <span class="toctext">...prevent a FOUC (Flash of Unstyled Content) before tabs are initialized</span></a></li> +</ul> +</li> +<li class="toclevel-1"><a href="#Why_does..."><span class="tocnumber">4</span> <span class="toctext">Why does...</span></a> +<ul> +<li class="toclevel-2"><a href="#...my_slider.2C_Google_Map.2C_sIFR_etc._not_work_when_placed_in_a_hidden_.28inactive.29_tab.3F"><span class="tocnumber">4.1</span> <span class="toctext">...my slider, Google Map, sIFR etc. not work when placed in a hidden (inactive) tab?</span></a></li> +</ul> +</li> +</ul> +</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=1" title="Template:UIAPIPlugin">edit</a>]</div><a name="Events"></a><h2>Events</h2> +<p>A series of events fire when interacting with a tabs interface: +</p> +<ul><li> tabsselect, tabsload, tabsshow (in that order) +</li><li> tabsadd, tabsremove +</li><li> tabsenable, tabsdisable +</li></ul> +<p>Event binding example: +</p> +<pre>$('#example').bind('tabsselect', function(event, ui) { + + // Objects available in the function context: + ui.tab // anchor element of the selected (clicked) tab + ui.panel // element, that contains the selected/clicked tab contents + ui.index // zero-based index of the selected (clicked) tab + +});</pre> +<p>Note that if a handler for the tabsselect event returns false, the clicked tab will not become selected (useful for example if switching to the next tab requires a form validation). +</p> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=2" title="Template:UIAPIPlugin">edit</a>]</div><a name="Ajax_mode"></a><h2> Ajax mode </h2> +<p>Tabs supports loading tab content via Ajax in an unobtrusive manner. +</p><p>The HTML you need is slightly different from the one that is used for static tabs: A list of links pointing to existing resources (from where the content gets loaded) and no additional containers at all (unobtrusive!). The containers' markup is going to be created on the fly: +</p> +<pre> +&lt;div id=&quot;example&quot;&gt; + &lt;ul&gt; + &lt;li&gt;&lt;a href=&quot;ahah_1.html&quot;&gt;&lt;span&gt;Content 1&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; + &lt;li&gt;&lt;a href=&quot;ahah_2.html&quot;&gt;&lt;span&gt;Content 2&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; + &lt;li&gt;&lt;a href=&quot;ahah_3.html&quot;&gt;&lt;span&gt;Content 3&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; + &lt;/ul&gt; +&lt;/div&gt; +</pre> +<p>Obviously this degrades gracefully - the links, e.g. the content, will still be accessible with JavaScript disabled. +</p><p>Note that if you wish to reuse an existing container, you +could do so by matching a title attribute and the container's id: +</p> +<pre> +&lt;li&gt;&lt;a href=&quot;hello/world.html&quot; title=&quot;Todo Overview&quot;&gt; ... &lt;/a&gt;&lt;/li&gt; +</pre> +<p>and a container like: +</p> +<pre> +&lt;div id=&quot;Todo_Overview&quot;&gt; ... &lt;/div&gt; +</pre> +<p>(Note how white space is replaced with an underscore) +</p><p>This is useful if you want a human readable hash in the URL instead of +a cryptic generated one. +</p> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=3" title="Template:UIAPIPlugin">edit</a>]</div><a name="Back_button_and_bookmarking"></a><h3>Back button and bookmarking</h3> +<p>Tabs 2 already supported this functionality, although the history plugin needs a rewrite first (it doesn't support Safari 3 and is in general a little inflexible) before it can be build back into the tabs. It is planned and Klaus is working on it whenever he finds the time. Actual bugs in the UI Tabs plugin itself always have higher priority though. +</p> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=4" title="Template:UIAPIPlugin">edit</a>]</div><a name="How_to..."></a><h2>How to...</h2> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=5" title="Template:UIAPIPlugin">edit</a>]</div><a name="...retrieve_the_index_of_the_currently_selected_tab"></a><h3>...retrieve the index of the currently selected tab</h3> +<pre>var $tabs = $('#example').tabs(); +var selected = $tabs.tabs('option', 'selected'); // =&gt; 0</pre> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=6" title="Template:UIAPIPlugin">edit</a>]</div><a name="...open_links_in_the_current_tab_instead_of_leaving_the_page"></a><h3>...open links in the current tab instead of leaving the page</h3> +<p>"Hijax" links after tab content has been loaded: +</p> +<pre>$('#example').tabs({ + load: function(event, ui) { + $('a', ui.panel).click(function() { + $(ui.panel).load(this.href); + return false; + }); + } +});</pre> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=7" title="Template:UIAPIPlugin">edit</a>]</div><a name="...select_a_tab_from_a_text_link_instead_of_clicking_a_tab_itself"></a><h3>...select a tab from a text link instead of clicking a tab itself</h3> +<pre>var $tabs = $('#example').tabs(); // first tab selected + +$('#my-text-link').click(function() { // bind click event to link + $tabs.tabs('select', 2); // switch to third tab + return false; +});</pre> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=8" title="Template:UIAPIPlugin">edit</a>]</div><a name="...prevent_switching_to_the_tab_on_click_depending_on_form_validation"></a><h3>...prevent switching to the tab on click depending on form validation</h3> +<p>Returning false in the tabs select handler prevents the clicked tab from becoming selected. +</p> +<pre>$('#example').tabs({ + select: function(event, ui) { + var isValid = ... // form validation returning true or false + return isValid; + } +});</pre> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=9" title="Template:UIAPIPlugin">edit</a>]</div><a name="...immediately_select_a_just_added_tab"></a><h3>...immediately select a just added tab</h3> +<pre>var $tabs = $('#example').tabs({ + add: function(event, ui) { + $tabs.tabs('select', '#' + ui.panel.id); + } +});</pre> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=10" title="Template:UIAPIPlugin">edit</a>]</div><a name="...follow_a_tab.27s_URL_instead_of_loading_its_content_via_ajax"></a><h3>...follow a tab's URL instead of loading its content via ajax</h3> +<p>Note that opening a tab in a new window is unexpected, e.g. +inconsistent behaviour exposing a usablity problem (<a href="http://www.useit.com/alertbox/tabs.html" class="external free" title="http://www.useit.com/alertbox/tabs.html">http://www.useit.com/alertbox/tabs.html</a>). +</p> +<pre>$('#example').tabs({ + select: function(event, ui) { + var url = $.data(ui.tab, 'load.tabs'); + if( url ) { + location.href = url; + return false; + } + return true; + } +});</pre> +<p><br /> +</p> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=11" title="Template:UIAPIPlugin">edit</a>]</div><a name="...prevent_a_FOUC_.28Flash_of_Unstyled_Content.29_before_tabs_are_initialized"></a><h3>...prevent a FOUC (Flash of Unstyled Content) before tabs are initialized</h3> +<p>Add the necessary classes to hide an inactive tab panel to the HTML right away - note that this will <b>not</b> degrade gracefully with JavaScript being disabled: +</p> +<pre>&lt;div id=&quot;example&quot; class=&quot;ui-tabs&quot;&gt; + ... + &lt;div id=&quot;a-tab-panel&quot; class=&quot;ui-tabs-hide&quot;&gt; &lt;/div&gt; + ... +&lt;/div&gt;</pre> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=12" title="Template:UIAPIPlugin">edit</a>]</div><a name="Why_does..."></a><h2>Why does...</h2> +<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=13" title="Template:UIAPIPlugin">edit</a>]</div><a name="...my_slider.2C_Google_Map.2C_sIFR_etc._not_work_when_placed_in_a_hidden_.28inactive.29_tab.3F"></a><h3>...my slider, Google Map, sIFR etc. not work when placed in a hidden (inactive) tab?</h3> +<p>Any component that requires some dimensional computation for its initialization won't work in a hidden tab, because the tab panel itself is hidden via <code>display: none</code> so that any elements inside won't report their actual width and height (0 in most browsers). +</p><p>There's an easy workaround. Use the <em>off-left technique</em> for hiding inactive tab panels. E.g. in your style sheet replace the rule for the class selector ".ui-tabs .ui-tabs-hide" with +</p> +<pre>.ui-tabs .ui-tabs-hide { + position: absolute; + left: -10000px; +}</pre> +<p>For Google maps you can also resize the map once the tab is displayed like this: +</p> +<pre>$('#example').bind('tabsshow', function(event, ui) { + if (ui.panel.id == &quot;map-tab&quot;) { + resizeMap(); + } +});</pre> +resizeMap() will call Google Maps' checkResize() on the particular map. + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>UI Core</li> +<li>To use the cookie option: <a href="http://plugins.jquery.com/project/cookie" class="external text" title="http://plugins.jquery.com/project/cookie">jquery.cookie.js</a></li> +<li>Required CSS: +<pre>.ui-tabs .ui-tabs-hide { + display: none; +}</pre></li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="295"> +A simple jQuery UI Tabs.<br /> +</p> +<pre>$(&quot;#tabs&quot;).tabs(); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + + &lt;script&gt; + $(document).ready(function() { + $(&quot;#tabs&quot;).tabs(); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;div id=&quot;tabs&quot;&gt; + &lt;ul&gt; + &lt;li&gt;&lt;a href=&quot;#fragment-1&quot;&gt;&lt;span&gt;One&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; + &lt;li&gt;&lt;a href=&quot;#fragment-2&quot;&gt;&lt;span&gt;Two&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; + &lt;li&gt;&lt;a href=&quot;#fragment-3&quot;&gt;&lt;span&gt;Three&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; + &lt;/ul&gt; + &lt;div id=&quot;fragment-1&quot;&gt; + &lt;p&gt;First tab is active by default:&lt;/p&gt; + &lt;pre&gt;&lt;code&gt;$('#example').tabs();&lt;/code&gt;&lt;/pre&gt; + &lt;/div&gt; + &lt;div id=&quot;fragment-2&quot;&gt; + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + &lt;/div&gt; + &lt;div id=&quot;fragment-3&quot;&gt; + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + &lt;/div&gt; +&lt;/div&gt; +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Options</h2> + <ul class="options-list"> + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Disables (true) or enables (false) the tabs. Can be set when initialising (first creating) the tabs.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ disabled: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).tabs( "option", "disabled" ); +//setter +$( ".selector" ).tabs( "option", "disabled", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-ajaxOptions"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-ajaxOptions">ajaxOptions</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Options</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Additional Ajax options to consider when loading tab content (see $.ajax).</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>ajaxOptions</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ ajaxOptions: { async: false } });</code></pre> +</dd> + + +<dt> + Get or set the <code>ajaxOptions</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var ajaxOptions = $( ".selector" ).tabs( "option", "ajaxOptions" ); +//setter +$( ".selector" ).tabs( "option", "ajaxOptions", { async: false } );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cache"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cache">cache</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Whether or not to cache remote tabs content, e.g. load only once or with every click. Cached content is being lazy loaded, e.g once and only once for the first click. Note that to prevent the actual Ajax requests from being cached by the browser you need to provide an extra cache: false flag to ajaxOptions.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>cache</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ cache: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>cache</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cache = $( ".selector" ).tabs( "option", "cache" ); +//setter +$( ".selector" ).tabs( "option", "cache", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-collapsible"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-collapsible">collapsible</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>Set to true to allow an already selected tab to become unselected again upon reselection.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>collapsible</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ collapsible: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>collapsible</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var collapsible = $( ".selector" ).tabs( "option", "collapsible" ); +//setter +$( ".selector" ).tabs( "option", "collapsible", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-cookie"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-cookie">cookie</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Object</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Store the latest selected tab in a cookie. The cookie is then used to determine the initially selected tab if the <i>selected</i> option is not defined. Requires cookie plugin. The object needs to have key/value pairs of the form the cookie plugin expects as options. Available options (example): &#123; expires: 7, path: '/', domain: 'jquery.com', secure: true &#125;. Since jQuery UI 1.7 it is also possible to define the cookie name being used via <i>name</i> property.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>cookie</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ cookie: { expires: 30 } });</code></pre> +</dd> + + +<dt> + Get or set the <code>cookie</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var cookie = $( ".selector" ).tabs( "option", "cookie" ); +//setter +$( ".selector" ).tabs( "option", "cookie", { expires: 30 } );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-deselectable"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-deselectable">deselectable</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Boolean</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">false</dd> + + </dl> + </div> + <div class="option-description"> + <p>deprecated in jQuery UI 1.7, use collapsible.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>deselectable</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ deselectable: true });</code></pre> +</dd> + + +<dt> + Get or set the <code>deselectable</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var deselectable = $( ".selector" ).tabs( "option", "deselectable" ); +//setter +$( ".selector" ).tabs( "option", "deselectable", true );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-disabled"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-disabled">disabled</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Array&lt;Number&gt;</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">[]</dd> + + </dl> + </div> + <div class="option-description"> + <p>An array containing the position of the tabs (zero-based index) that should be disabled on initialization.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>disabled</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ disabled: [1, 2] });</code></pre> +</dd> + + +<dt> + Get or set the <code>disabled</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var disabled = $( ".selector" ).tabs( "option", "disabled" ); +//setter +$( ".selector" ).tabs( "option", "disabled", [1, 2] );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-event"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-event">event</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'click'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The type of event to be used for selecting a tab.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>event</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ event: 'mouseover' });</code></pre> +</dd> + + +<dt> + Get or set the <code>event</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var event = $( ".selector" ).tabs( "option", "event" ); +//setter +$( ".selector" ).tabs( "option", "event", 'mouseover' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-fx"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-fx">fx</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Options, Array&lt;Options&gt;</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">null</dd> + + </dl> + </div> + <div class="option-description"> + <p>Enable animations for hiding and showing tab panels. The duration option can be a string representing one of the three predefined speeds ("slow", "normal", "fast") or the duration in milliseconds to run an animation (default is "normal").</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>fx</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ fx: { opacity: 'toggle' } });</code></pre> +</dd> + + +<dt> + Get or set the <code>fx</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var fx = $( ".selector" ).tabs( "option", "fx" ); +//setter +$( ".selector" ).tabs( "option", "fx", { opacity: 'toggle' } );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-idPrefix"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-idPrefix">idPrefix</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'ui-tabs-'</dd> + + </dl> + </div> + <div class="option-description"> + <p>If the remote tab, its anchor element that is, has no title attribute to generate an id from, an id/fragment identifier is created from this prefix and a unique id returned by $.data(el), for example "ui-tabs-54".</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>idPrefix</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ idPrefix: 'ui-tabs-primary' });</code></pre> +</dd> + + +<dt> + Get or set the <code>idPrefix</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var idPrefix = $( ".selector" ).tabs( "option", "idPrefix" ); +//setter +$( ".selector" ).tabs( "option", "idPrefix", 'ui-tabs-primary' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-panelTemplate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-panelTemplate">panelTemplate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'&lt;div&gt;&lt;/div&gt;'</dd> + + </dl> + </div> + <div class="option-description"> + <p>HTML template from which a new tab panel is created in case of adding a tab with the add method or when creating a panel for a remote tab on the fly.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>panelTemplate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ panelTemplate: '&lt;li&gt;&lt;/li&gt;' });</code></pre> +</dd> + + +<dt> + Get or set the <code>panelTemplate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var panelTemplate = $( ".selector" ).tabs( "option", "panelTemplate" ); +//setter +$( ".selector" ).tabs( "option", "panelTemplate", '&lt;li&gt;&lt;/li&gt;' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-selected"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-selected">selected</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Number</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">0</dd> + + </dl> + </div> + <div class="option-description"> + <p>Zero-based index of the tab to be selected on initialization. To set all tabs to unselected pass -1 as value.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>selected</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ selected: 3 });</code></pre> +</dd> + + +<dt> + Get or set the <code>selected</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var selected = $( ".selector" ).tabs( "option", "selected" ); +//setter +$( ".selector" ).tabs( "option", "selected", 3 );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-spinner"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-spinner">spinner</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'&lt;em&gt;Loading&amp;#8230;&lt;/em&gt;'</dd> + + </dl> + </div> + <div class="option-description"> + <p>The HTML content of this string is shown in a tab title while remote content is loading. Pass in empty string to deactivate that behavior. An span element must be present in the A tag of the title, for the spinner content to be visible.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>spinner</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ spinner: 'Retrieving data...' });</code></pre> +</dd> + + +<dt> + Get or set the <code>spinner</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var spinner = $( ".selector" ).tabs( "option", "spinner" ); +//setter +$( ".selector" ).tabs( "option", "spinner", 'Retrieving data...' );</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="option" id="option-tabTemplate"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-tabTemplate">tabTemplate</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + <dt class="option-default-label">Default:</dt> + <dd class="option-default">'&lt;li&gt;&lt;a href&#61;"#&#123;href&#125;"&gt;&lt;span&gt;#&#123;label&#125;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;'</dd> + + </dl> + </div> + <div class="option-description"> + <p>HTML template from which a new tab is created and added. The placeholders #&#123;href&#125; and #&#123;label&#125; are replaced with the url and tab label that are passed as arguments to the add method.</p> + </div> + <div class="option-examples"> + <h4>Code examples</h4> + <dl class="option-examples-list"> + +<dt> + Initialize a tabs with the <code>tabTemplate</code> option specified. +</dt> +<dd> +<pre><code>$( ".selector" ).tabs({ tabTemplate: '&lt;div&gt;&lt;a href&#61;"#&#123;href&#125;"&gt;&lt;span&gt;#&#123;label&#125;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;' });</code></pre> +</dd> + + +<dt> + Get or set the <code>tabTemplate</code> option, after init. +</dt> +<dd> +<pre><code>//getter +var tabTemplate = $( ".selector" ).tabs( "option", "tabTemplate" ); +//setter +$( ".selector" ).tabs( "option", "tabTemplate", '&lt;div&gt;&lt;a href&#61;"#&#123;href&#125;"&gt;&lt;span&gt;#&#123;label&#125;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;' );</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="events"> + <h2 class="top-header">Events</h2> + <ul class="events-list"> + +<li class="event" id="event-select"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-select">select</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsselect</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when clicking a tab.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>select</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + select: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>select</code> event by type: <code>tabsselect</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsselect&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-load"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-load">load</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsload</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered after the content of a remote tab has been loaded.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>load</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + load: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>load</code> event by type: <code>tabsload</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsload&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-show"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-show">show</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsshow</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a tab is shown.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>show</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + show: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>show</code> event by type: <code>tabsshow</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsshow&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-add"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-add">add</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsadd</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a tab is added.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>add</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + add: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>add</code> event by type: <code>tabsadd</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsadd&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-remove"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-remove">remove</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsremove</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a tab is removed.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>remove</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + remove: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>remove</code> event by type: <code>tabsremove</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsremove&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-enable"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-enable">enable</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsenable</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a tab is enabled.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>enable</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + enable: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>enable</code> event by type: <code>tabsenable</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsenable&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + +<li class="event" id="event-disable"> + <div class="event-header"> + <h3 class="event-name"><a href="#event-disable">disable</a></h3> + <dl> + <dt class="event-type-label">Type:</dt> + <dd class="event-type">tabsdisable</dd> + </dl> + </div> + <div class="event-description"> + <p>This event is triggered when a tab is disabled.</p> + </div> + <div class="event-examples"> + <h4>Code examples</h4> + <dl class="event-examples-list"> + +<dt> + Supply a callback function to handle the <code>disable</code> event as an init option. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).tabs({ + disable: function(event, ui) { ... } +});</code></pre> +</dd> + + +<dt> + Bind to the <code>disable</code> event by type: <code>tabsdisable</code>. +</dt> +<dd> +<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsdisable&quot;, function(event, ui) { + ... +});</code></pre> +</dd> + + </dl> + </div> +</li> + + </ul> + </div> + <div id="methods"> + <h2 class="top-header">Methods</h2> + <ul class="methods-list"> + +<li class="method" id="method-destroy"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-destroy">destroy</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "destroy" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove the tabs functionality completely. This will return the element back to its pre-init state.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "disable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable the tabs.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "enable" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable the tabs.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "option" + +, optionName + +, <span class="optional">[</span>value<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Get or set any tabs option. If no value is specified, will act as a getter.</p> + </div> +</li> + + +<li class="method" id="method-option"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-option">option</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "option" + +, options + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set multiple tabs options at once by providing an options object.</p> + </div> +</li> + + +<li class="method" id="method-widget"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-widget">widget</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "widget" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Returns the .ui-tabs element.</p> + </div> +</li> + + +<li class="method" id="method-add"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-add">add</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "add" + +, url + +, label + +, <span class="optional">[</span>index<span class="optional">] </span> + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Add a new tab. The second argument is either a URL consisting of a fragment identifier only to create an in-page tab or a full url (relative or absolute, no cross-domain support) to turn the new tab into an Ajax (remote) tab. The third is the zero-based position where to insert the new tab. Optional, by default a new tab is appended at the end.</p> + </div> +</li> + + +<li class="method" id="method-remove"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-remove">remove</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "remove" + +, index + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Remove a tab. The second argument is the zero-based index of the tab to be removed.</p> + </div> +</li> + + +<li class="method" id="method-enable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-enable">enable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "enable" + +, index + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Enable a disabled tab. To enable more than one tab at once reset the disabled property like: <code>$('#example').data('disabled.tabs', []);</code>. The second argument is the zero-based index of the tab to be enabled.</p> + </div> +</li> + + +<li class="method" id="method-disable"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-disable">disable</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "disable" + +, index + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Disable a tab. The selected tab cannot be disabled. To disable more than one tab at once use: <code>$('#example').data('disabled.tabs', [1, 2, 3]);</code> The second argument is the zero-based index of the tab to be disabled.</p> + </div> +</li> + + +<li class="method" id="method-select"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-select">select</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "select" + +, index + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Select a tab, as if it were clicked. The second argument is the zero-based index of the tab to be selected or the id selector of the panel the tab is associated with (the tab's href fragment identifier, e.g. hash, points to the panel's id).</p> + </div> +</li> + + +<li class="method" id="method-load"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-load">load</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "load" + +, index + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Reload the content of an Ajax tab programmatically. This method always loads the tab content from the remote location, even if cache is set to true. The second argument is the zero-based index of the tab to be reloaded.</p> + </div> +</li> + + +<li class="method" id="method-url"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-url">url</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "url" + +, index + +, url + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Change the url from which an Ajax (remote) tab will be loaded. The specified URL will be used for subsequent loads. Note that you can not only change the URL for an existing remote tab with this method, but also turn an in-page tab into a remote tab. The second argument is the zero-based index of the tab of which its URL is to be updated. The third is a URL the content of the tab is loaded from.</p> + </div> +</li> + + +<li class="method" id="method-length"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-length">length</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "length" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Retrieve the number of tabs of the first matched tab pane.</p> + </div> +</li> + + +<li class="method" id="method-abort"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-abort">abort</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "abort" + + + + + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Terminate all running tab ajax requests and animations.</p> + </div> +</li> + + +<li class="method" id="method-rotate"> + <div class="method-header"> + <h3 class="method-name"><a href="#method-rotate">rotate</a></h3> + <dl> + <dt class="method-signature-label">Signature:</dt> + <dd class="method-signature">.tabs( "rotate" + +, ms + +, <span class="optional">[</span>continuing<span class="optional">] </span> + + + +)</dd> + </dl> + </div> + <div class="method-description"> + <p>Set up an automatic rotation through tabs of a tab pane. The second argument is an amount of time in milliseconds until the next tab in the cycle gets activated. Use 0 or null to stop the rotation. The third controls whether or not to continue the rotation after a tab has been selected by a user. Default: false.</p> + </div> +</li> + + </ul> + </div> + <div id="theming"> + <h2 class="top-header">Theming</h2> + <p>The jQuery UI Tabs plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +</p> + <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.tabs.css stylesheet that can be modified. These classes are highlighed in bold below. +</p> + + <h3>Sample markup with jQuery UI CSS Framework classes</h3> + &lt;div class=&quot;<strong>ui-tabs</strong> ui-widget ui-widget-content ui-corner-all&quot; id=&quot;tabs&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;ul class=&quot;<strong>ui-tabs-nav</strong> ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class=&quot;ui-state-default ui-corner-top ui-tabs-selected ui-state-active&quot;&gt;&lt;a href=&quot;#tabs-1&quot;&gt;Nunc tincidunt&lt;/a&gt;&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class=&quot;ui-state-default ui-corner-top&quot;&gt;&lt;a href=&quot;#tabs-2&quot;&gt;Proin dolor&lt;/a&gt;&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-tabs-panel</strong> ui-widget-content ui-corner-bottom&quot; id=&quot;tabs-1&quot;&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Tab one content goes here.&lt;/p&gt;<br /> +&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br /> +&nbsp;&nbsp;&nbsp; ...<br /> +&lt;/div&gt;<br /> + <p class="theme-note"> + <strong> + Note: This is a sample of markup generated by the tabs plugin, not markup you should use to create a tabs. The only markup needed for that is <br />&lt;div id=&quot;tabs&quot;&gt;<br /> +&#160;&#160;&#160;&lt;ul&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;#tabs-1&quot;&gt;Nunc tincidunt&lt;/a&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;#tabs-2&quot;&gt;Proin dolor&lt;/a&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;#tabs-3&quot;&gt;Aenean lacinia&lt;/a&gt;&lt;/li&gt;<br /> +&#160;&#160;&#160;&lt;/ul&gt;<br /> +&#160;&#160;&#160;&lt;div id=&quot;tabs-1&quot;&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;Tab 1 content&lt;/p&gt;<br /> +&#160;&#160;&#160;&lt;/div&gt;<br /> +&#160;&#160;&#160;&lt;div id=&quot;tabs-2&quot;&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;Tab 2 content&lt;/p&gt;<br /> +&#160;&#160;&#160;&lt;/div&gt;<br /> +&#160;&#160;&#160;&lt;div id=&quot;tabs-3&quot;&gt;<br /> +&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;Tab 3 content&lt;/p&gt;<br /> +&#160;&#160;&#160;&lt;/div&gt;<br /> +&lt;/div&gt;. + </strong> + </p> + + </div> +</div> + +</p><!-- +Pre-expand include size: 56186 bytes +Post-expand include size: 95609 bytes +Template argument size: 57003 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3777-1!1!0!!en!2 and timestamp 20100421093105 --> diff --git a/fannie/src/jquery/development-bundle/docs/toggle.html b/fannie/src/jquery/development-bundle/docs/toggle.html new file mode 100644 index 000000000..bb1754418 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/toggle.html @@ -0,0 +1,144 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI toggle</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/toggle?section=1" title="Edit section: toggle( effect, [options], [speed], [callback] )">edit</a>]</div><a name="toggle.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>toggle( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3> +<p>The enhanced toggle method optionally accepts jQuery UI advanced effects.</p> +<p>Uses a specific effect on an element to toggle the element if the first argument is an effect string.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="170"> +Apply the effect slide if you click on the p to toggle a div.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">toggle</strong>(&quot;slide&quot;, {}, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.slide.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + div { display: none; margin: 0px; width: 100px; height: 80px; background: blue; position: relative; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(&quot;div&quot;).<strong class="selflink">toggle</strong>(&quot;slide&quot;, {}, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-effect"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-effect">effect</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.</p> + </div> +</li> + + +<li class="option" id="option-options"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-options">options</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Hash</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A object/hash including specific options for the effect.</p> + </div> +</li> + + +<li class="option" id="option-speed"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-speed">speed</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>Durations are given in milliseconds; higher values indicate slower animations, not faster ones. The strings 'fast' and 'slow' can be supplied to indicate durations of 200 and 600 milliseconds, respectively.</p> + </div> +</li> + + +<li class="option" id="option-callback"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-callback">callback</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">Function</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A function that is called after the effect is completed.</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 6372 bytes +Post-expand include size: 8945 bytes +Template argument size: 5663 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2615-1!1!0!!en!2 and timestamp 20100421131329 --> diff --git a/fannie/src/jquery/development-bundle/docs/toggleClass.html b/fannie/src/jquery/development-bundle/docs/toggleClass.html new file mode 100644 index 000000000..3d0f3ed51 --- /dev/null +++ b/fannie/src/jquery/development-bundle/docs/toggleClass.html @@ -0,0 +1,111 @@ + +<ul class="UIAPIPlugin-toc"> +<li><a href="#overview">Overview</a></li> +<li><a href="#options">Arguments</a></li> +</ul> +<div class="UIAPIPlugin"> + <h1>jQuery UI toggleClass</h1> + <div id="overview"> + <h2 class="top-header">Overview</h2> + <div id="overview-main"> + <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/toggleClass?section=1" title="Edit section: toggleClass( class, [duration] )">edit</a>]</div><a name="toggleClass.28_class.2C_.5Bduration.5D_.29"></a><h3>toggleClass( class, <span class="optional">[</span>duration<span class="optional">]</span> )</h3> +<p>Adds the specified class if it is not present, and removes the specified class if it is present, using an optional transition.</p> + </div> + <div id="overview-dependencies"> + <h3>Dependencies</h3> + <ul> +<li>Effects Core</li> +</ul> + </div> + <div id="overview-example"> + <h3>Example</h3> + <div id="overview-example" class="example"> +<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul> +<p><div id="demo" class="tabs-container" rel="100"> +Adds the 'selected' class if it is not present, and removes the 'selected' class if it is present.<br /> +</p> +<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">toggleClass</strong>(&quot;selected&quot;, 1000); + }); +</pre> +<p></div><div id="source" class="tabs-container"> +</p> +<pre>&lt;!DOCTYPE html&gt; +&lt;html&gt; +&lt;head&gt; + &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt; + &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt; +&lt;style type=&quot;text/css&quot;&gt; + p { cursor: pointer; font-size: 1.2em; } + .selected { color:red; } +&lt;/style&gt; + &lt;script&gt; + $(document).ready(function() { + $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () { + $(this).<strong class="selflink">toggleClass</strong>(&quot;selected&quot;, 1000); + }); + }); + &lt;/script&gt; +&lt;/head&gt; +&lt;body style="font-size:62.5%;"&gt; + +&lt;p&gt;Click me to toggle 'selected' class.&lt;/p&gt; +&lt;p class=&quot;selected&quot;&gt;Click me to toggle 'selected' class.&lt;/p&gt; +&lt;p&gt;Click me to toggle 'selected' class.&lt;/p&gt; + +&lt;/body&gt; +&lt;/html&gt; +</pre> +<p></div> +</p><p></div> + </div> + </div> + <div id="options"> + <h2 class="top-header">Arguments</h2> + <ul class="options-list"> + +<li class="option" id="option-class"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-class">class</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String</dd> + + </dl> + </div> + <div class="option-description"> + <p>A CSS class to toggle on the elements.</p> + </div> +</li> + + +<li class="option" id="option-duration"> + <div class="option-header"> + <h3 class="option-name"><a href="#option-duration">duration</a></h3> + <dl> + <dt class="option-type-label">Type:</dt> + <dd class="option-type">String, Number</dd> + + <dt class="option-optional-label">Optional</dt> + + </dl> + </div> + <div class="option-description"> + <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p> + </div> +</li> + + </ul> + </div> +</div> + +</p><!-- +Pre-expand include size: 5271 bytes +Post-expand include size: 7027 bytes +Template argument size: 4437 bytes +Maximum: 2097152 bytes +--> + +<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2608-1!1!0!!en!2 and timestamp 20100421130934 --> diff --git a/fannie/src/jquery/development-bundle/external/jquery.bgiframe-2.1.1.js b/fannie/src/jquery/development-bundle/external/jquery.bgiframe-2.1.1.js new file mode 100644 index 000000000..ef8679d90 --- /dev/null +++ b/fannie/src/jquery/development-bundle/external/jquery.bgiframe-2.1.1.js @@ -0,0 +1,10 @@ +/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * $LastChangedDate: 2007-07-21 18:45:56 -0500 (Sat, 21 Jul 2007) $ + * $Rev: 2447 $ + * + * Version 2.1.1 + */ +(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/external/jquery.cookie.js b/fannie/src/jquery/development-bundle/external/jquery.cookie.js new file mode 100644 index 000000000..7b3e70125 --- /dev/null +++ b/fannie/src/jquery/development-bundle/external/jquery.cookie.js @@ -0,0 +1,89 @@ +/*jslint browser: true */ /*global jQuery: true */ + +/** + * jQuery Cookie plugin + * + * Copyright (c) 2010 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +// TODO JsDoc + +/** + * Create a cookie with the given key and value and other optional parameters. + * + * @example $.cookie('the_cookie', 'the_value'); + * @desc Set the value of a cookie. + * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); + * @desc Create a cookie with all available options. + * @example $.cookie('the_cookie', 'the_value'); + * @desc Create a session cookie. + * @example $.cookie('the_cookie', null); + * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain + * used when the cookie was set. + * + * @param String key The key of the cookie. + * @param String value The value of the cookie. + * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. + * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. + * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. + * If set to null or omitted, the cookie will be a session cookie and will not be retained + * when the the browser exits. + * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). + * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). + * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will + * require a secure protocol (like HTTPS). + * @type undefined + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ + +/** + * Get the value of a cookie with the given key. + * + * @example $.cookie('the_cookie'); + * @desc Get the value of a cookie. + * + * @param String key The key of the cookie. + * @return The value of the cookie. + * @type String + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ +jQuery.cookie = function (key, value, options) { + + // key and value given, set cookie... + if (arguments.length > 1 && (value === null || typeof value !== "object")) { + options = jQuery.extend({}, options); + + if (value === null) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + return (document.cookie = [ + encodeURIComponent(key), '=', + options.raw ? String(value) : encodeURIComponent(String(value)), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // key and possibly options given, get cookie... + options = value || {}; + var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; + return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; +}; diff --git a/fannie/src/jquery/development-bundle/external/jquery.metadata.js b/fannie/src/jquery/development-bundle/external/jquery.metadata.js new file mode 100644 index 000000000..ad8bfba40 --- /dev/null +++ b/fannie/src/jquery/development-bundle/external/jquery.metadata.js @@ -0,0 +1,122 @@ +/* + * Metadata - jQuery plugin for parsing metadata from elements + * + * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.metadata.js 4187 2007-12-16 17:15:27Z joern.zaefferer $ + * + */ + +/** + * Sets the type of metadata to use. Metadata is encoded in JSON, and each property + * in the JSON will become a property of the element itself. + * + * There are three supported types of metadata storage: + * + * attr: Inside an attribute. The name parameter indicates *which* attribute. + * + * class: Inside the class attribute, wrapped in curly braces: { } + * + * elem: Inside a child element (e.g. a script tag). The + * name parameter indicates *which* element. + * + * The metadata for an element is loaded the first time the element is accessed via jQuery. + * + * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements + * matched by expr, then redefine the metadata type and run another $(expr) for other elements. + * + * @name $.metadata.setType + * + * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p> + * @before $.metadata.setType("class") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from the class attribute + * + * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p> + * @before $.metadata.setType("attr", "data") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a "data" attribute + * + * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p> + * @before $.metadata.setType("elem", "script") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a nested script element + * + * @param String type The encoding type + * @param String name The name of the attribute to be used to get metadata (optional) + * @cat Plugins/Metadata + * @descr Sets the type of encoding to be used when loading metadata for the first time + * @type undefined + * @see metadata() + */ + +(function($) { + +$.extend({ + metadata : { + defaults : { + type: 'class', + name: 'metadata', + cre: /({.*})/, + single: 'metadata' + }, + setType: function( type, name ){ + this.defaults.type = type; + this.defaults.name = name; + }, + get: function( elem, opts ){ + var settings = $.extend({},this.defaults,opts); + // check for empty string in single property + if ( !settings.single.length ) settings.single = 'metadata'; + + var data = $.data(elem, settings.single); + // returned cached data if it already exists + if ( data ) return data; + + data = "{}"; + + if ( settings.type == "class" ) { + var m = settings.cre.exec( elem.className ); + if ( m ) + data = m[1]; + } else if ( settings.type == "elem" ) { + if( !elem.getElementsByTagName ) + return undefined; + var e = elem.getElementsByTagName(settings.name); + if ( e.length ) + data = $.trim(e[0].innerHTML); + } else if ( elem.getAttribute != undefined ) { + var attr = elem.getAttribute( settings.name ); + if ( attr ) + data = attr; + } + + if ( data.indexOf( '{' ) <0 ) + data = "{" + data + "}"; + + data = eval("(" + data + ")"); + + $.data( elem, settings.single, data ); + return data; + } + } +}); + +/** + * Returns the metadata object for the first member of the jQuery object. + * + * @name metadata + * @descr Returns element's metadata object + * @param Object opts An object contianing settings to override the defaults + * @type jQuery + * @cat Plugins/Metadata + */ +$.fn.metadata = function( opts ){ + return $.metadata.get( this[0], opts ); +}; + +})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/external/qunit.css b/fannie/src/jquery/development-bundle/external/qunit.css new file mode 100644 index 000000000..5714bf4a5 --- /dev/null +++ b/fannie/src/jquery/development-bundle/external/qunit.css @@ -0,0 +1,119 @@ + +ol#qunit-tests { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + padding:0; + list-style-position:inside; + + font-size: smaller; +} +ol#qunit-tests li{ + padding:0.4em 0.5em 0.4em 2.5em; + border-bottom:1px solid #fff; + font-size:small; + list-style-position:inside; +} +ol#qunit-tests li ol{ + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; + margin-top:0.5em; + margin-left:0; + padding:0.5em; + background-color:#fff; + border-radius:15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; +} +ol#qunit-tests li li{ + border-bottom:none; + margin:0.5em; + background-color:#fff; + list-style-position: inside; + padding:0.4em 0.5em 0.4em 0.5em; +} + +ol#qunit-tests li li.pass{ + border-left:26px solid #C6E746; + background-color:#fff; + color:#5E740B; + } +ol#qunit-tests li li.fail{ + border-left:26px solid #EE5757; + background-color:#fff; + color:#710909; +} +ol#qunit-tests li.pass{ + background-color:#D2E0E6; + color:#528CE0; +} +ol#qunit-tests li.fail{ + background-color:#EE5757; + color:#000; +} +ol#qunit-tests li strong { + cursor:pointer; +} +h1#qunit-header{ + background-color:#0d3349; + margin:0; + padding:0.5em 0 0.5em 1em; + color:#fff; + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + border-top-right-radius:15px; + border-top-left-radius:15px; + -moz-border-radius-topright:15px; + -moz-border-radius-topleft:15px; + -webkit-border-top-right-radius:15px; + -webkit-border-top-left-radius:15px; + text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px; +} +h2#qunit-banner{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + height:5px; + margin:0; + padding:0; +} +h2#qunit-banner.qunit-pass{ + background-color:#C6E746; +} +h2#qunit-banner.qunit-fail, #qunit-testrunner-toolbar { + background-color:#EE5757; +} +#qunit-testrunner-toolbar { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + padding:0; + /*width:80%;*/ + padding:0em 0 0.5em 2em; + font-size: small; +} +h2#qunit-userAgent { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + background-color:#2b81af; + margin:0; + padding:0; + color:#fff; + font-size: small; + padding:0.5em 0 0.5em 2.5em; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} +p#qunit-testresult{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + font-size: small; + color:#2b81af; + border-bottom-right-radius:15px; + border-bottom-left-radius:15px; + -moz-border-radius-bottomright:15px; + -moz-border-radius-bottomleft:15px; + -webkit-border-bottom-right-radius:15px; + -webkit-border-bottom-left-radius:15px; + background-color:#D2E0E6; + padding:0.5em 0.5em 0.5em 2.5em; +} +strong b.fail{ + color:#710909; + } +strong b.pass{ + color:#5E740B; + } diff --git a/fannie/src/jquery/development-bundle/external/qunit.js b/fannie/src/jquery/development-bundle/external/qunit.js new file mode 100644 index 000000000..9ef5f8d6f --- /dev/null +++ b/fannie/src/jquery/development-bundle/external/qunit.js @@ -0,0 +1,1069 @@ +/* + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2009 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + */ + +(function(window) { + +var QUnit = { + + // Initialize the configuration options + init: function() { + config = { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date, + updateRate: 1000, + blocking: false, + autorun: false, + assertions: [], + filters: [], + queue: [] + }; + + var tests = id("qunit-tests"), + banner = id("qunit-banner"), + result = id("qunit-testresult"); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + }, + + // call on start of module test to prepend name to all tests + module: function(name, testEnvironment) { + config.currentModule = name; + + synchronize(function() { + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + config.currentModule = name; + config.moduleTestEnvironment = testEnvironment; + config.moduleStats = { all: 0, bad: 0 }; + + QUnit.moduleStart( name, testEnvironment ); + }); + }, + + asyncTest: function(testName, expected, callback) { + if ( arguments.length === 2 ) { + callback = expected; + expected = 0; + } + + QUnit.test(testName, expected, callback, true); + }, + + test: function(testName, expected, callback, async) { + var name = testName, testEnvironment, testEnvironmentArg; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + // is 2nd argument a testEnvironment? + if ( expected && typeof expected === 'object') { + testEnvironmentArg = expected; + expected = null; + } + + if ( config.currentModule ) { + name = config.currentModule + " module: " + name; + } + + if ( !validTest(name) ) { + return; + } + + synchronize(function() { + QUnit.testStart( testName ); + + testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, config.moduleTestEnvironment); + if (testEnvironmentArg) { + extend(testEnvironment,testEnvironmentArg); + } + + // allow utility functions to access the current test environment + QUnit.current_testEnvironment = testEnvironment; + + config.assertions = []; + config.expected = expected; + + try { + if ( !config.pollution ) { + saveGlobal(); + } + + testEnvironment.setup.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Setup failed on " + name + ": " + e.message ); + } + + if ( async ) { + QUnit.stop(); + } + + try { + callback.call(testEnvironment); + } catch(e) { + fail("Test " + name + " died, exception and test follows", e, callback); + QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + start(); + } + } + }); + + synchronize(function() { + try { + checkPollution(); + testEnvironment.teardown.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Teardown failed on " + name + ": " + e.message ); + } + + try { + QUnit.reset(); + } catch(e) { + fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset); + } + + if ( config.expected && config.expected != config.assertions.length ) { + QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" ); + } + + var good = 0, bad = 0, + tests = id("qunit-tests"); + + config.stats.all += config.assertions.length; + config.moduleStats.all += config.assertions.length; + + if ( tests ) { + var ol = document.createElement("ol"); + ol.style.display = "none"; + + for ( var i = 0; i < config.assertions.length; i++ ) { + var assertion = config.assertions[i]; + + var li = document.createElement("li"); + li.className = assertion.result ? "pass" : "fail"; + li.appendChild(document.createTextNode(assertion.message || "(no message)")); + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + var b = document.createElement("strong"); + b.innerHTML = name + " <b style='color:black;'>(<b class='fail'>" + bad + "</b>, <b class='pass'>" + good + "</b>, " + config.assertions.length + ")</b>"; + + addEvent(b, "click", function() { + var next = b.nextSibling, display = next.style.display; + next.style.display = display === "none" ? "block" : "none"; + }); + + addEvent(b, "dblclick", function(e) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() === "strong" ) { + var text = "", node = target.firstChild; + + while ( node.nodeType === 3 ) { + text += node.nodeValue; + node = node.nextSibling; + } + + text = text.replace(/(^\s*|\s*$)/g, ""); + + if ( window.location ) { + window.location.href = window.location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent(text); + } + } + }); + + var li = document.createElement("li"); + li.className = bad ? "fail" : "pass"; + li.appendChild( b ); + li.appendChild( ol ); + tests.appendChild( li ); + + if ( bad ) { + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "block"; + id("qunit-filter-pass").disabled = null; + id("qunit-filter-missing").disabled = null; + } + } + + } else { + for ( var i = 0; i < config.assertions.length; i++ ) { + if ( !config.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + QUnit.testDone( testName, bad, config.assertions.length ); + + if ( !window.setTimeout && !config.queue.length ) { + done(); + } + }); + + if ( window.setTimeout && !config.doneTimer ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + } + }, + + /** + * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + */ + expect: function(asserts) { + config.expected = asserts; + }, + + /** + * Asserts true. + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function(a, msg) { + QUnit.log(a, msg); + + config.assertions.push({ + result: !!a, + message: msg + }); + }, + + /** + * Checks that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * + * Prefered to ok( actual == expected, message ) + * + * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); + * + * @param Object actual + * @param Object expected + * @param String message (optional) + */ + equal: function(actual, expected, message) { + push(expected == actual, actual, expected, message); + }, + + notEqual: function(actual, expected, message) { + push(expected != actual, actual, expected, message); + }, + + deepEqual: function(a, b, message) { + push(QUnit.equiv(a, b), a, b, message); + }, + + notDeepEqual: function(a, b, message) { + push(!QUnit.equiv(a, b), a, b, message); + }, + + strictEqual: function(actual, expected, message) { + push(expected === actual, actual, expected, message); + }, + + notStrictEqual: function(actual, expected, message) { + push(expected !== actual, actual, expected, message); + }, + + start: function() { + // A slight delay, to avoid any current callbacks + if ( window.setTimeout ) { + window.setTimeout(function() { + if ( config.timeout ) { + clearTimeout(config.timeout); + } + + config.blocking = false; + process(); + }, 13); + } else { + config.blocking = false; + process(); + } + }, + + stop: function(timeout) { + config.blocking = true; + + if ( timeout && window.setTimeout ) { + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + QUnit.start(); + }, timeout); + } + }, + + /** + * Resets the test setup. Useful for tests that modify the DOM. + */ + reset: function() { + if ( window.jQuery ) { + jQuery("#main").html( config.fixture ); + jQuery.event.global = {}; + jQuery.ajaxSettings = extend({}, config.ajaxSettings); + } + }, + + /** + * Trigger an event on an element. + * + * @example triggerEvent( document.body, "click" ); + * + * @param DOMElement elem + * @param String type + */ + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent("MouseEvents"); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent( event ); + + } else if ( elem.fireEvent ) { + elem.fireEvent("on"+type); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return Object.prototype.toString.call( obj ) === "[object "+ type +"]"; + }, + + // Logging callbacks + done: function(failures, total) {}, + log: function(result, message) {}, + testStart: function(name) {}, + testDone: function(name, failures, total) {}, + moduleStart: function(name, testEnvironment) {}, + moduleDone: function(name, failures, total) {} +}; + +// Backwards compatibility, deprecated +QUnit.equals = QUnit.equal; +QUnit.same = QUnit.deepEqual; + +// Maintain internal state +var config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true +}; + +// Load paramaters +(function() { + var location = window.location || { search: "", protocol: "file:" }, + GETParams = location.search.slice(1).split('&'); + + for ( var i = 0; i < GETParams.length; i++ ) { + GETParams[i] = decodeURIComponent( GETParams[i] ); + if ( GETParams[i] === "noglobals" ) { + GETParams.splice( i, 1 ); + i--; + config.noglobals = true; + } else if ( GETParams[i].search('=') > -1 ) { + GETParams.splice( i, 1 ); + i--; + } + } + + // restrict modules/tests by get parameters + config.filters = GETParams; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !!(location.protocol === 'file:'); +})(); + +// Expose the API as global variables, unless an 'exports' +// object exists, in that case we assume we're in CommonJS +if ( typeof exports === "undefined" || typeof require === "undefined" ) { + extend(window, QUnit); + window.QUnit = QUnit; +} else { + extend(exports, QUnit); + exports.QUnit = QUnit; +} + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +addEvent(window, "load", function() { + // Initialize the config, saving the execution queue + var oldconfig = extend({}, config); + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + var userAgent = id("qunit-userAgent"); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "none"; + + var filter = document.createElement("input"); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + filter.disabled = true; + addEvent( filter, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("pass") > -1 ) { + li[i].style.display = filter.checked ? "none" : ""; + } + } + }); + toolbar.appendChild( filter ); + + var label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-pass"); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + + var missing = document.createElement("input"); + missing.type = "checkbox"; + missing.id = "qunit-filter-missing"; + missing.disabled = true; + addEvent( missing, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) { + li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block"; + } + } + }); + toolbar.appendChild( missing ); + + label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-missing"); + label.innerHTML = "Hide missing tests (untested code is broken code)"; + toolbar.appendChild( label ); + } + + var main = id('main'); + if ( main ) { + config.fixture = main.innerHTML; + } + + if ( window.jQuery ) { + config.ajaxSettings = window.jQuery.ajaxSettings; + } + + QUnit.start(); +}); + +function done() { + if ( config.doneTimer && window.clearTimeout ) { + window.clearTimeout( config.doneTimer ); + config.doneTimer = null; + } + + if ( config.queue.length ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + + return; + } + + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + html = ['Tests completed in ', + +new Date - config.started, ' milliseconds.<br/>', + '<span class="passed">', config.stats.all - config.stats.bad, '</span> tests of <span class="total">', config.stats.all, '</span> passed, <span class="failed">', config.stats.bad,'</span> failed.'].join(''); + + if ( banner ) { + banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); + } + + if ( tests ) { + var result = id("qunit-testresult"); + + if ( !result ) { + result = document.createElement("p"); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests.nextSibling ); + } + + result.innerHTML = html; + } + + QUnit.done( config.stats.bad, config.stats.all ); +} + +function validTest( name ) { + var i = config.filters.length, + run = false; + + if ( !i ) { + return true; + } + + while ( i-- ) { + var filter = config.filters[i], + not = filter.charAt(0) == '!'; + + if ( not ) { + filter = filter.slice(1); + } + + if ( name.indexOf(filter) !== -1 ) { + return !not; + } + + if ( not ) { + run = true; + } + } + + return run; +} + +function push(result, actual, expected, message) { + message = message || (result ? "okay" : "failed"); + QUnit.ok( result, result ? message + ": " + QUnit.jsDump.parse(expected) : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) ); +} + +function synchronize( callback ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process(); + } +} + +function process() { + var start = (new Date()).getTime(); + + while ( config.queue.length && !config.blocking ) { + if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) { + config.queue.shift()(); + + } else { + setTimeout( process, 13 ); + break; + } + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + config.pollution.push( key ); + } + } +} + +function checkPollution( name ) { + var old = config.pollution; + saveGlobal(); + + var newGlobals = diff( old, config.pollution ); + if ( newGlobals.length > 0 ) { + ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); + config.expected++; + } + + var deletedGlobals = diff( config.pollution, old ); + if ( deletedGlobals.length > 0 ) { + ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); + config.expected++; + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var result = a.slice(); + for ( var i = 0; i < result.length; i++ ) { + for ( var j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; +} + +function fail(message, exception, callback) { + if ( typeof console !== "undefined" && console.error && console.warn ) { + console.error(message); + console.error(exception); + console.warn(callback.toString()); + + } else if ( window.opera && opera.postError ) { + opera.postError(message, exception, callback.toString); + } +} + +function extend(a, b) { + for ( var prop in b ) { + a[prop] = b[prop]; + } + + return a; +} + +function addEvent(elem, type, fn) { + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, fn ); + } else { + fn(); + } +} + +function id(name) { + return !!(typeof document !== "undefined" && document && document.getElementById) && + document.getElementById( name ); +} + +// Test for equality any JavaScript type. +// Discussions and reference: http://philrathe.com/articles/equiv +// Test suites: http://philrathe.com/tests/equiv +// Author: Philippe Rathé <prathe@gmail.com> +QUnit.equiv = function () { + + var innerEquiv; // the real equiv function + var callers = []; // stack to decide between skip/abort functions + var parents = []; // stack to avoiding loops from circular referencing + + + // Determine what is o. + function hoozit(o) { + if (QUnit.is("String", o)) { + return "string"; + + } else if (QUnit.is("Boolean", o)) { + return "boolean"; + + } else if (QUnit.is("Number", o)) { + + if (isNaN(o)) { + return "nan"; + } else { + return "number"; + } + + } else if (typeof o === "undefined") { + return "undefined"; + + // consider: typeof null === object + } else if (o === null) { + return "null"; + + // consider: typeof [] === object + } else if (QUnit.is( "Array", o)) { + return "array"; + + // consider: typeof new Date() === object + } else if (QUnit.is( "Date", o)) { + return "date"; + + // consider: /./ instanceof Object; + // /./ instanceof RegExp; + // typeof /./ === "function"; // => false in IE and Opera, + // true in FF and Safari + } else if (QUnit.is( "RegExp", o)) { + return "regexp"; + + } else if (typeof o === "object") { + return "object"; + + } else if (QUnit.is( "Function", o)) { + return "function"; + } else { + return undefined; + } + } + + // Call the o related callback with the given arguments. + function bindCallbacks(o, callbacks, args) { + var prop = hoozit(o); + if (prop) { + if (hoozit(callbacks[prop]) === "function") { + return callbacks[prop].apply(callbacks, args); + } else { + return callbacks[prop]; // or undefined + } + } + } + + var callbacks = function () { + + // for string, boolean, number and null + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + // to catch short annotaion VS 'new' annotation of a declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function (b) { + return isNaN(b); + }, + + "date": function (b, a) { + return hoozit(b) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function (b, a) { + return hoozit(b) === "regexp" && + a.source === b.source && // the regex itself + a.global === b.global && // and its modifers (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function () { + var caller = callers[callers.length - 1]; + return caller !== Object && + typeof caller !== "undefined"; + }, + + "array": function (b, a) { + var i, j, loop; + var len; + + // b could be an object literal here + if ( ! (hoozit(b) === "array")) { + return false; + } + + len = a.length; + if (len !== b.length) { // safe and faster + return false; + } + + //track reference to avoid circular references + parents.push(a); + for (i = 0; i < len; i++) { + loop = false; + for(j=0;j<parents.length;j++){ + if(parents[j] === a[i]){ + loop = true;//dont rewalk array + } + } + if (!loop && ! innerEquiv(a[i], b[i])) { + parents.pop(); + return false; + } + } + parents.pop(); + return true; + }, + + "object": function (b, a) { + var i, j, loop; + var eq = true; // unless we can proove it + var aProperties = [], bProperties = []; // collection of strings + + // comparing constructors is more strict than using instanceof + if ( a.constructor !== b.constructor) { + return false; + } + + // stack constructor before traversing properties + callers.push(a.constructor); + //track reference to avoid circular references + parents.push(a); + + for (i in a) { // be strict: don't ensures hasOwnProperty and go deep + loop = false; + for(j=0;j<parents.length;j++){ + if(parents[j] === a[i]) + loop = true; //don't go down the same path twice + } + aProperties.push(i); // collect a's properties + + if (!loop && ! innerEquiv(a[i], b[i])) { + eq = false; + break; + } + } + + callers.pop(); // unstack, we are done + parents.pop(); + + for (i in b) { + bProperties.push(i); // collect b's properties + } + + // Ensures identical properties name + return eq && innerEquiv(aProperties.sort(), bProperties.sort()); + } + }; + }(); + + innerEquiv = function () { // can take multiple arguments + var args = Array.prototype.slice.apply(arguments); + if (args.length < 2) { + return true; // end transition + } + + return (function (a, b) { + if (a === b) { + return true; // catch the most you can + } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || hoozit(a) !== hoozit(b)) { + return false; // don't lose time with error prone cases + } else { + return bindCallbacks(a, callbacks, [b, a]); + } + + // apply transition with (1..n) arguments + })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); + }; + + return innerEquiv; + +}(); + +/** + * jsDump + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php) + * Date: 5/15/2008 + * @projectDescription Advanced and extensible data dumping for Javascript. + * @version 1.0.0 + * @author Ariel Flesler + * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + */ +QUnit.jsDump = (function() { + function quote( str ) { + return '"' + str.toString().replace(/"/g, '\\"') + '"'; + }; + function literal( o ) { + return o + ''; + }; + function join( pre, arr, post ) { + var s = jsDump.separator(), + base = jsDump.indent(), + inner = jsDump.indent(1); + if ( arr.join ) + arr = arr.join( ',' + s + inner ); + if ( !arr ) + return pre + post; + return [ pre, inner + arr, base + post ].join(s); + }; + function array( arr ) { + var i = arr.length, ret = Array(i); + this.up(); + while ( i-- ) + ret[i] = this.parse( arr[i] ); + this.down(); + return join( '[', ret, ']' ); + }; + + var reName = /^function (\w+)/; + + var jsDump = { + parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance + var parser = this.parsers[ type || this.typeOf(obj) ]; + type = typeof parser; + + return type == 'function' ? parser.call( this, obj ) : + type == 'string' ? parser : + this.parsers.error; + }, + typeOf:function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if (typeof obj === "undefined") { + type = "undefined"; + } else if (QUnit.is("RegExp", obj)) { + type = "regexp"; + } else if (QUnit.is("Date", obj)) { + type = "date"; + } else if (QUnit.is("Function", obj)) { + type = "function"; + } else if (obj.setInterval && obj.document && !obj.nodeType) { + type = "window"; + } else if (obj.nodeType === 9) { + type = "document"; + } else if (obj.nodeType) { + type = "node"; + } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) { + type = "array"; + } else { + type = typeof obj; + } + return type; + }, + separator:function() { + return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? '&nbsp;' : ' '; + }, + indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + if ( !this.multiline ) + return ''; + var chr = this.indentChar; + if ( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,'&nbsp;'); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ) { + this._depth_ += a || 1; + }, + down:function( a ) { + this._depth_ -= a || 1; + }, + setParser:function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + undefined:'undefined', + 'function':function( fn ) { + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if ( name ) + ret += ' ' + name; + ret += '('; + + ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, this.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + object:function( map ) { + var ret = [ ]; + this.up(); + for ( var key in map ) + ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); + this.down(); + return join( '{', ret, '}' ); + }, + node:function( node ) { + var open = this.HTML ? '&lt;' : '<', + close = this.HTML ? '&gt;' : '>'; + + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + + for ( var a in this.DOMAttrs ) { + var val = node[this.DOMAttrs[a]]; + if ( val ) + ret += ' ' + a + '=' + this.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function + var l = fn.length; + if ( !l ) return ''; + + var args = Array(l); + while ( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:false //if true, items in a collection, are separated by a \n, else just a space. + }; + + return jsDump; +})(); + +})(this); diff --git a/fannie/src/jquery/development-bundle/jquery-1.4.2.js b/fannie/src/jquery/development-bundle/jquery-1.4.2.js new file mode 100644 index 000000000..fff677643 --- /dev/null +++ b/fannie/src/jquery/development-bundle/jquery-1.4.2.js @@ -0,0 +1,6240 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function( window, undefined ) { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, + + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The functions to execute on DOM ready + readyList = [], + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + indexOf = Array.prototype.indexOf; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + if ( elem ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $("TAG") + } else if ( !context && /^\w+$/.test( selector ) ) { + this.selector = selector; + this.context = document; + selector = document.getElementsByTagName( selector ); + return jQuery.merge( this, selector ); + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return jQuery( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.4.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // If the DOM is already ready + if ( jQuery.isReady ) { + // Execute the function immediately + fn.call( document, jQuery ); + + // Otherwise, remember the function for later + } else if ( readyList ) { + // Add the function to the wait list + readyList.push( fn ); + } + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || jQuery(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging object literal values or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { + var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src + : jQuery.isArray(copy) ? [] : {}; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 13 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( readyList ) { + // Execute all of them + var fn, i = 0; + while ( (fn = readyList[ i++ ]) ) { + fn.call( document, jQuery ); + } + + // Reset the list of functions + readyList = null; + } + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + return jQuery.ready(); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor + && !hasOwnProperty.call(obj, "constructor") + && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwnProperty.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + + if ( jQuery.support.scriptEval ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + trim: function( text ) { + return (text || "").replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + if ( !inv !== !callback( elems[ i ], i ) ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + browser: {} +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch( error ) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + +// Mutifunctional method to get and set values to a collection +// The value/s can be optionally by executed if its a function +function access( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; +} + +function now() { + return (new Date).getTime(); +} +(function() { + + jQuery.support = {}; + + var root = document.documentElement, + script = document.createElement("script"), + div = document.createElement("div"), + id = "script" + now(); + + div.style.display = "none"; + div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: div.getElementsByTagName("input")[0].value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, + + parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, + + // Will be defined later + deleteExpando: true, + checkClone: false, + scriptEval: false, + noCloneEvent: true, + boxModel: null + }; + + script.type = "text/javascript"; + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + jQuery.support.scriptEval = true; + delete window[ id ]; + } + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete script.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + root.removeChild( script ); + + if ( div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>"; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"); + div.style.width = div.style.paddingLeft = "1px"; + + document.body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + document.body.removeChild( div ).style.display = 'none'; + + div = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + root = script = div = all = a = null; +})(); + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; +var expando = "jQuery" + now(), uuid = 0, windowData = {}; + +jQuery.extend({ + cache: {}, + + expando:expando, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + "object": true, + "applet": true + }, + + data: function( elem, name, data ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache; + + if ( !id && typeof name === "string" && data === undefined ) { + return null; + } + + // Compute a unique ID for the element + if ( !id ) { + id = ++uuid; + } + + // Avoid generating a new cache unless none exists and we + // want to manipulate it. + if ( typeof name === "object" ) { + elem[ expando ] = id; + thisCache = cache[ id ] = jQuery.extend(true, {}, name); + + } else if ( !cache[ id ] ) { + elem[ expando ] = id; + cache[ id ] = {}; + } + + thisCache = cache[ id ]; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + return typeof name === "string" ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( thisCache ) { + // Remove the section of cache data + delete thisCache[ name ]; + + // If we've removed all the data, remove the element's cache + if ( jQuery.isEmptyObject(thisCache) ) { + jQuery.removeData( elem ); + } + } + + // Otherwise, we want to remove all of the element's data + } else { + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + // Completely remove the data cache + delete cache[ id ]; + } + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + if ( typeof key === "undefined" && this.length ) { + return jQuery.data( this[0] ); + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + } + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else { + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { + jQuery.data( this, key, value ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i, elem ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); +var rclass = /[\n\t]/g, + rspace = /\s+/, + rreturn = /\r/g, + rspecialurl = /href|src|style/, + rtype = /(button|input)/i, + rfocusable = /(button|input|object|select|textarea)/i, + rclickable = /^(a|area)$/i, + rradiocheck = /radio|checkbox/; + +jQuery.fn.extend({ + attr: function( name, value ) { + return access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", setClass = elem.className; + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split(rspace); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, i = 0, self = jQuery(this), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery.data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Typecast each time if the value is a Function and the appended + // value is therefore different each time. + if ( typeof val === "number" ) { + val += ""; + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't set attributes on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + if ( name in elem && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + elem[ name ] = value; + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + + // elem is actually elem.style ... set the style + // Using attr for specific style information is now deprecated. Use style instead. + return jQuery.style( elem, name, value ); + } +}); +var rnamespaces = /\.(.*)$/, + fcleanup = function( nm ) { + return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { + return "\\" + ch; + }); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery.data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events = elemData.events || {}, + eventHandle = elemData.handle, eventHandle; + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + handleObj.guid = handler.guid; + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( var j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( var j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[expando] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + jQuery.each( jQuery.cache, function() { + if ( this.events && this.events[type] ) { + jQuery.event.trigger( event, data, this.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery.data( elem, "handle" ); + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var target = event.target, old, + isClick = jQuery.nodeName(target, "a") && type === "click", + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ type ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + type ]; + + if ( old ) { + target[ "on" + type ] = null; + } + + jQuery.event.triggered = true; + target[ type ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( old ) { + target[ "on" + type ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace, events; + + event = arguments[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + var events = jQuery.data(this, "events"), handlers = events[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, arguments ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, body = document.body; + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { + event.which = event.charCode || event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); + }, + + remove: function( handleObj ) { + var remove = true, + type = handleObj.origType.replace(rnamespaces, ""); + + jQuery.each( jQuery.data(this, "events").live || [], function() { + if ( type === this.origType.replace(rnamespaces, "") ) { + remove = false; + return false; + } + }); + + if ( remove ) { + jQuery.event.remove( this, handleObj.origType, liveHandler ); + } + } + + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( this.setInterval ) { + this.onbeforeunload = eventHandle; + } + + return false; + }, + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +var removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + elem.removeEventListener( type, handle, false ); + } : + function( elem, type, handle ) { + elem.detachEvent( "on" + type, handle ); + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = now(); + + // Mark it as fixed + this[ expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + } + // otherwise set the returnValue property of the original event to false (IE) + e.returnValue = false; + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + return trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + return trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var formElems = /textarea|input|select/i, + + changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery.data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery.data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + return jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + return testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + return testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information/focus[in] is not needed anymore + beforeactivate: function( e ) { + var elem = e.target; + jQuery.data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return formElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return formElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; +} + +function trigger( type, elem, args ) { + args[0].type = type; + return jQuery.event.handle.apply( elem, args ); +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + context.each(function(){ + jQuery.event.add( this, liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + }); + + } else { + // unbind live handler + context.unbind( liveConvert( type, selector ), fn ); + } + } + + return this; + } +}); + +function liveHandler( event ) { + var stop, elems = [], selectors = [], args = arguments, + related, match, handleObj, elem, j, i, l, data, + events = jQuery.data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) + if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { + return; + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( match[i].selector === handleObj.selector ) { + elem = match[i].elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { + stop = false; + break; + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + +// Prevent memory leaks in IE +// Window isn't included so as not to unbind existing unload events +// More info: +// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ +if ( window.attachEvent && !window.addEventListener ) { + window.attachEvent("onunload", function() { + for ( var id in jQuery.cache ) { + if ( jQuery.cache[ id ].handle ) { + // Try/Catch is to handle iframes being unloaded, see #4280 + try { + jQuery.event.remove( jQuery.cache[ id ].handle.elem ); + } catch(e) {} + } + } + }); +} +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var filter = Expr.filter[ type ], found, item, left = match[1]; + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = part.toLowerCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + return match[1].toLowerCase(); + }, + CHILD: function(match){ + if ( match[1] === "nth" ) { + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + // Accessing this property makes selected-by-default + // options in Safari work properly + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 === i; + }, + eq: function(elem, i, match){ + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } else { + Sizzle.error( "Syntax error, unrecognized expression: " + name ); + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + if ( type === "first" ) { + return true; + } + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first === 0 ) { + return diff === 0; + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ + return "\\" + (num - 0 + 1); + })); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.compareDocumentPosition ? -1 : 1; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.sourceIndex ? -1 : 1; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.ownerDocument ? -1 : 1; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE + })(); +} + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return !!(a.compareDocumentPosition(b) & 16); +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = getText; +jQuery.isXMLDoc = isXML; +jQuery.contains = contains; + +return; + +window.Sizzle = Sizzle; + +})(); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + slice = Array.prototype.slice; + +// Implement the identical functionality for filter and not +var winnow = function( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + if ( jQuery.isArray( selectors ) ) { + var ret = [], cur = this[0], match, matches = {}, selector; + + if ( cur && selectors.length ) { + for ( var i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur }); + delete matches[selector]; + } + } + cur = cur.parentNode; + } + } + + return ret; + } + + var pos = jQuery.expr.match.POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + return this.map(function( i, cur ) { + while ( cur && cur.ownerDocument && cur !== context ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { + return cur; + } + cur = cur.parentNode; + } + return null; + }); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context || this.context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call(arguments).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], cur = elem[dir]; + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, + rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnocache = /<script|<object|<embed|<option|<style/i, + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, // checked="checked" or checked (html5) + fcloseTag = function( all, front, tag ) { + return rselfClosing.test( tag ) ? + all : + front + "></" + tag + ">"; + }, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize <link> and <script> tags normally +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "div<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( text ) { + if ( jQuery.isFunction(text) ) { + return this.each(function(i) { + var self = jQuery(this); + self.text( text.call(this, i, self.text()) ); + }); + } + + if ( typeof text !== "object" && text !== undefined ) { + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + } + + return jQuery.text( this ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + return this.each(function() { + jQuery( this ).wrapAll( html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } else if ( arguments.length ) { + var set = jQuery(arguments[0]); + set.push.apply( set, this.toArray() ); + return this.pushStack( set, "before", arguments ); + } + }, + + after: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } else if ( arguments.length ) { + var set = this.pushStack( this, "after", arguments ); + set.push.apply( set, jQuery(arguments[0]).toArray() ); + return set; + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function() { + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var html = this.outerHTML, ownerDocument = this.ownerDocument; + if ( !html ) { + var div = ownerDocument.createElement("div"); + div.appendChild( this.cloneNode(true) ); + html = div.innerHTML; + } + + return jQuery.clean([html.replace(rinlinejQuery, "") + // Handle the case in IE 8 where action=/test/> self-closes a tag + .replace(/=([^="'>\s]+\/)>/g, '="$1">') + .replace(rleadingWhitespace, "")], ownerDocument)[0]; + } else { + return this.cloneNode(true); + } + }); + + // Copy the events from the original to the clone + if ( events === true ) { + cloneCopyEvent( this, ret ); + cloneCopyEvent( this.find("*"), ret.find("*") ); + } + + // Return the cloned set + return ret; + }, + + html: function( value ) { + if ( value === undefined ) { + return this[0] && this[0].nodeType === 1 ? + this[0].innerHTML.replace(rinlinejQuery, "") : + null; + + // See if we can take a shortcut and just use innerHTML + } else if ( typeof value === "string" && !rnocache.test( value ) && + (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && + !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { + + value = value.replace(rxhtmlTag, fcloseTag); + + try { + for ( var i = 0, l = this.length; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + if ( this[i].nodeType === 1 ) { + jQuery.cleanData( this[i].getElementsByTagName("*") ); + this[i].innerHTML = value; + } + } + + // If using innerHTML throws an exception, use the fallback method + } catch(e) { + this.empty().append( value ); + } + + } else if ( jQuery.isFunction( value ) ) { + this.each(function(i){ + var self = jQuery(this), old = self.html(); + self.empty().append(function(){ + return value.call( this, i, old ); + }); + }); + + } else { + this.empty().append( value ); + } + + return this; + }, + + replaceWith: function( value ) { + if ( this[0] && this[0].parentNode ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery(value).detach(); + } + + return this.each(function() { + var next = this.nextSibling, parent = this.parentNode; + + jQuery(this).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } else { + return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); + } + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + var results, first, value = args[0], scripts = [], fragment, parent; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback, true ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + parent = value && value.parentNode; + + // If we're in a fragment, just use that instead of building a new one + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + + } else { + results = buildFragment( args, this, scripts ); + } + + fragment = results.fragment; + + if ( fragment.childNodes.length === 1 ) { + first = fragment = fragment.firstChild; + } else { + first = fragment.firstChild; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + i > 0 || results.cacheable || this.length > 1 ? + fragment.cloneNode(true) : + fragment + ); + } + } + + if ( scripts.length ) { + jQuery.each( scripts, evalScript ); + } + } + + return this; + + function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}); + +function cloneCopyEvent(orig, ret) { + var i = 0; + + ret.each(function() { + if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) { + return; + } + + var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( var type in events ) { + for ( var handler in events[ type ] ) { + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + } + } + } + }); +} + +function buildFragment( args, nodes, scripts ) { + var fragment, cacheable, cacheresults, + doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); + + // Only cache "small" (1/2 KB) strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && + !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + + cacheable = true; + cacheresults = jQuery.fragments[ args[0] ]; + if ( cacheresults ) { + if ( cacheresults !== 1 ) { + fragment = cacheresults; + } + } + } + + if ( !fragment ) { + fragment = doc.createDocumentFragment(); + jQuery.clean( args, doc, fragment, scripts ); + } + + if ( cacheable ) { + jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; + } + + return { fragment: fragment, cacheable: cacheable }; +} + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; + + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + return this; + + } else { + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = (i > 0 ? this.clone(true) : this).get(); + jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +jQuery.extend({ + clean: function( elems, context, fragment, scripts ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) { + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + } + + var ret = []; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" && !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + + } else if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, fcloseTag); + + // Trim whitespace, otherwise indexOf won't work as expected + var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"); + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( var j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + ret = jQuery.merge( ret, elem ); + } + } + + if ( fragment ) { + for ( var i = 0; ret[i]; i++ ) { + if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); + + } else { + if ( ret[i].nodeType === 1 ) { + ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); + } + fragment.appendChild( ret[i] ); + } + } + } + + return ret; + }, + + cleanData: function( elems ) { + var data, id, cache = jQuery.cache, + special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + id = elem[ jQuery.expando ]; + + if ( id ) { + data = cache[ id ]; + + if ( data.events ) { + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + } else { + removeEvent( elem, type, data.handle ); + } + } + } + + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + delete cache[ id ]; + } + } + } +}); +// exclude the following css properties to add px +var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + ralpha = /alpha\([^)]*\)/, + ropacity = /opacity=([^)]*)/, + rfloat = /float/i, + rdashAlpha = /-([a-z])/ig, + rupper = /([A-Z])/g, + rnumpx = /^-?\d+(?:px)?$/i, + rnum = /^-?\d/, + + cssShow = { position: "absolute", visibility: "hidden", display:"block" }, + cssWidth = [ "Left", "Right" ], + cssHeight = [ "Top", "Bottom" ], + + // cache check for defaultView.getComputedStyle + getComputedStyle = document.defaultView && document.defaultView.getComputedStyle, + // normalize float css property + styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat", + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn.css = function( name, value ) { + return access( this, name, value, true, function( elem, name, value ) { + if ( value === undefined ) { + return jQuery.curCSS( elem, name ); + } + + if ( typeof value === "number" && !rexclude.test(name) ) { + value += "px"; + } + + jQuery.style( elem, name, value ); + }); +}; + +jQuery.extend({ + style: function( elem, name, value ) { + // don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // ignore negative width and height values #1599 + if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) { + value = undefined; + } + + var style = elem.style || elem, set = value !== undefined; + + // IE uses filters for opacity + if ( !jQuery.support.opacity && name === "opacity" ) { + if ( set ) { + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // Set the alpha filter to set the opacity + var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"; + var filter = style.filter || jQuery.curCSS( elem, "filter" ) || ""; + style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity; + } + + return style.filter && style.filter.indexOf("opacity=") >= 0 ? + (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "": + ""; + } + + // Make sure we're using the right name for getting the float value + if ( rfloat.test( name ) ) { + name = styleFloat; + } + + name = name.replace(rdashAlpha, fcamelCase); + + if ( set ) { + style[ name ] = value; + } + + return style[ name ]; + }, + + css: function( elem, name, force, extra ) { + if ( name === "width" || name === "height" ) { + var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight; + + function getWH() { + val = name === "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) { + return; + } + + jQuery.each( which, function() { + if ( !extra ) { + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + } + + if ( extra === "margin" ) { + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; + } else { + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + } + }); + } + + if ( elem.offsetWidth !== 0 ) { + getWH(); + } else { + jQuery.swap( elem, props, getWH ); + } + + return Math.max(0, Math.round(val)); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style, filter; + + // IE uses filters for opacity + if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) { + ret = ropacity.test(elem.currentStyle.filter || "") ? + (parseFloat(RegExp.$1) / 100) + "" : + ""; + + return ret === "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( rfloat.test( name ) ) { + name = styleFloat; + } + + if ( !force && style && style[ name ] ) { + ret = style[ name ]; + + } else if ( getComputedStyle ) { + + // Only "float" is needed here + if ( rfloat.test( name ) ) { + name = "float"; + } + + name = name.replace( rupper, "-$1" ).toLowerCase(); + + var defaultView = elem.ownerDocument.defaultView; + + if ( !defaultView ) { + return null; + } + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) { + ret = computedStyle.getPropertyValue( name ); + } + + // We should always get a number back from opacity + if ( name === "opacity" && ret === "" ) { + ret = "1"; + } + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(rdashAlpha, fcamelCase); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = camelCase === "fontSize" ? "1em" : (ret || 0); + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) { + elem.style[ name ] = old[ name ]; + } + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + var width = elem.offsetWidth, height = elem.offsetHeight, + skip = elem.nodeName.toLowerCase() === "tr"; + + return width === 0 && height === 0 && !skip ? + true : + width > 0 && height > 0 && !skip ? + false : + jQuery.curCSS(elem, "display") === "none"; + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} +var jsc = now(), + rscript = /<script(.|\s)*?\/script>/gi, + rselectTextarea = /select|textarea/i, + rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i, + jsre = /=\?(&|$)/, + rquery = /\?/, + rts = /(\?|&)_=.*?(&|$)/, + rurl = /^(\w+:)?\/\/([^\/?#]+)/, + r20 = /%20/g, + + // Keep a copy of the old load method + _load = jQuery.fn.load; + +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( typeof url !== "string" ) { + return _load.call( this, url ); + + // Don't do a request if no elements are being requested + } else if ( !this.length ) { + return this; + } + + var off = url.indexOf(" "); + if ( off >= 0 ) { + var selector = url.slice(off, url.length); + url = url.slice(0, off); + } + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = null; + + // Otherwise, build a param string + } else if ( typeof params === "object" ) { + params = jQuery.param( params, jQuery.ajaxSettings.traditional ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + complete: function( res, status ) { + // If successful, inject the HTML into all the matched elements + if ( status === "success" || status === "notmodified" ) { + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div />") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(res.responseText.replace(rscript, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + res.responseText ); + } + + if ( callback ) { + self.each( callback, [res.responseText, status, res] ); + } + } + }); + + return this; + }, + + serialize: function() { + return jQuery.param(this.serializeArray()); + }, + serializeArray: function() { + return this.map(function() { + return this.elements ? jQuery.makeArray(this.elements) : this; + }) + .filter(function() { + return this.name && !this.disabled && + (this.checked || rselectTextarea.test(this.nodeName) || + rinput.test(this.type)); + }) + .map(function( i, elem ) { + var val = jQuery(this).val(); + + return val == null ? + null : + jQuery.isArray(val) ? + jQuery.map( val, function( val, i ) { + return { name: elem.name, value: val }; + }) : + { name: elem.name, value: val }; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) { + jQuery.fn[o] = function( f ) { + return this.bind(o, f); + }; +}); + +jQuery.extend({ + + get: function( url, data, callback, type ) { + // shift arguments if data argument was omited + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = null; + } + + return jQuery.ajax({ + type: "GET", + url: url, + data: data, + success: callback, + dataType: type + }); + }, + + getScript: function( url, callback ) { + return jQuery.get(url, null, callback, "script"); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get(url, data, callback, "json"); + }, + + post: function( url, data, callback, type ) { + // shift arguments if data argument was omited + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = {}; + } + + return jQuery.ajax({ + type: "POST", + url: url, + data: data, + success: callback, + dataType: type + }); + }, + + ajaxSetup: function( settings ) { + jQuery.extend( jQuery.ajaxSettings, settings ); + }, + + ajaxSettings: { + url: location.href, + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + /* + timeout: 0, + data: null, + username: null, + password: null, + traditional: false, + */ + // Create the request object; Microsoft failed to properly + // implement the XMLHttpRequest in IE7 (can't request local files), + // so we use the ActiveXObject when it is available + // This function can be overriden by calling jQuery.ajaxSetup + xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? + function() { + return new window.XMLHttpRequest(); + } : + function() { + try { + return new window.ActiveXObject("Microsoft.XMLHTTP"); + } catch(e) {} + }, + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + script: "text/javascript, application/javascript", + json: "application/json, text/javascript", + text: "text/plain", + _default: "*/*" + } + }, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajax: function( origSettings ) { + var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings); + + var jsonp, status, data, + callbackContext = origSettings && origSettings.context || s, + type = s.type.toUpperCase(); + + // convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Handle JSONP Parameter Callbacks + if ( s.dataType === "jsonp" ) { + if ( type === "GET" ) { + if ( !jsre.test( s.url ) ) { + s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?"; + } + } else if ( !s.data || !jsre.test(s.data) ) { + s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; + } + s.dataType = "json"; + } + + // Build temporary JSONP function + if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) { + jsonp = s.jsonpCallback || ("jsonp" + jsc++); + + // Replace the =? sequence both in the query string and the data + if ( s.data ) { + s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); + } + + s.url = s.url.replace(jsre, "=" + jsonp + "$1"); + + // We need to make sure + // that a JSONP style response is executed properly + s.dataType = "script"; + + // Handle JSONP-style loading + window[ jsonp ] = window[ jsonp ] || function( tmp ) { + data = tmp; + success(); + complete(); + // Garbage collect + window[ jsonp ] = undefined; + + try { + delete window[ jsonp ]; + } catch(e) {} + + if ( head ) { + head.removeChild( script ); + } + }; + } + + if ( s.dataType === "script" && s.cache === null ) { + s.cache = false; + } + + if ( s.cache === false && type === "GET" ) { + var ts = now(); + + // try replacing _= if it is there + var ret = s.url.replace(rts, "$1_=" + ts + "$2"); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); + } + + // If data is available, append data to url for get requests + if ( s.data && type === "GET" ) { + s.url += (rquery.test(s.url) ? "&" : "?") + s.data; + } + + // Watch for a new set of requests + if ( s.global && ! jQuery.active++ ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Matches an absolute URL, and saves the domain + var parts = rurl.exec( s.url ), + remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host); + + // If we're requesting a remote document + // and trying to load JSON or Script with a GET + if ( s.dataType === "script" && type === "GET" && remote ) { + var head = document.getElementsByTagName("head")[0] || document.documentElement; + var script = document.createElement("script"); + script.src = s.url; + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + // Handle Script loading + if ( !jsonp ) { + var done = false; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function() { + if ( !done && (!this.readyState || + this.readyState === "loaded" || this.readyState === "complete") ) { + done = true; + success(); + complete(); + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + if ( head && script.parentNode ) { + head.removeChild( script ); + } + } + }; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + + // We handle everything using the script element injection + return undefined; + } + + var requestDone = false; + + // Create the request object + var xhr = s.xhr(); + + if ( !xhr ) { + return; + } + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open(type, s.url, s.async, s.username, s.password); + } else { + xhr.open(type, s.url, s.async); + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + // Set the correct header, if data is being sent + if ( s.data || origSettings && origSettings.contentType ) { + xhr.setRequestHeader("Content-Type", s.contentType); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[s.url] ) { + xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]); + } + + if ( jQuery.etag[s.url] ) { + xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]); + } + } + + // Set header so the called script knows that it's an XMLHttpRequest + // Only send the header if it's not a remote XHR + if ( !remote ) { + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + } + + // Set the Accepts header for the server, depending on the dataType + xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? + s.accepts[ s.dataType ] + ", */*" : + s.accepts._default ); + } catch(e) {} + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) { + // Handle the global AJAX counter + if ( s.global && ! --jQuery.active ) { + jQuery.event.trigger( "ajaxStop" ); + } + + // close opended socket + xhr.abort(); + return false; + } + + if ( s.global ) { + trigger("ajaxSend", [xhr, s]); + } + + // Wait for a response to come back + var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) { + // The request was aborted + if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) { + // Opera doesn't call onreadystatechange before this point + // so we simulate the call + if ( !requestDone ) { + complete(); + } + + requestDone = true; + if ( xhr ) { + xhr.onreadystatechange = jQuery.noop; + } + + // The transfer is complete and the data is available, or the request timed out + } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) { + requestDone = true; + xhr.onreadystatechange = jQuery.noop; + + status = isTimeout === "timeout" ? + "timeout" : + !jQuery.httpSuccess( xhr ) ? + "error" : + s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? + "notmodified" : + "success"; + + var errMsg; + + if ( status === "success" ) { + // Watch for, and catch, XML document parse errors + try { + // process the data (runs the xml through httpData regardless of callback) + data = jQuery.httpData( xhr, s.dataType, s ); + } catch(err) { + status = "parsererror"; + errMsg = err; + } + } + + // Make sure that the request was successful or notmodified + if ( status === "success" || status === "notmodified" ) { + // JSONP handles its own success callback + if ( !jsonp ) { + success(); + } + } else { + jQuery.handleError(s, xhr, status, errMsg); + } + + // Fire the complete handlers + complete(); + + if ( isTimeout === "timeout" ) { + xhr.abort(); + } + + // Stop memory leaks + if ( s.async ) { + xhr = null; + } + } + }; + + // Override the abort handler, if we can (IE doesn't allow it, but that's OK) + // Opera doesn't fire onreadystatechange at all on abort + try { + var oldAbort = xhr.abort; + xhr.abort = function() { + if ( xhr ) { + oldAbort.call( xhr ); + } + + onreadystatechange( "abort" ); + }; + } catch(e) { } + + // Timeout checker + if ( s.async && s.timeout > 0 ) { + setTimeout(function() { + // Check to see if the request is still happening + if ( xhr && !requestDone ) { + onreadystatechange( "timeout" ); + } + }, s.timeout); + } + + // Send the data + try { + xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null ); + } catch(e) { + jQuery.handleError(s, xhr, null, e); + // Fire the complete handlers + complete(); + } + + // firefox 1.5 doesn't fire statechange for sync requests + if ( !s.async ) { + onreadystatechange(); + } + + function success() { + // If a local callback was specified, fire it and pass it the data + if ( s.success ) { + s.success.call( callbackContext, data, status, xhr ); + } + + // Fire the global callback + if ( s.global ) { + trigger( "ajaxSuccess", [xhr, s] ); + } + } + + function complete() { + // Process result + if ( s.complete ) { + s.complete.call( callbackContext, xhr, status); + } + + // The request was completed + if ( s.global ) { + trigger( "ajaxComplete", [xhr, s] ); + } + + // Handle the global AJAX counter + if ( s.global && ! --jQuery.active ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + + function trigger(type, args) { + (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args); + } + + // return XMLHttpRequest to allow aborting the request etc. + return xhr; + }, + + handleError: function( s, xhr, status, e ) { + // If a local callback was specified, fire it + if ( s.error ) { + s.error.call( s.context || s, xhr, status, e ); + } + + // Fire the global callback + if ( s.global ) { + (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); + } + }, + + // Counter for holding the number of active queries + active: 0, + + // Determines if an XMLHttpRequest was successful or not + httpSuccess: function( xhr ) { + try { + // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 + return !xhr.status && location.protocol === "file:" || + // Opera returns 0 when status is 304 + ( xhr.status >= 200 && xhr.status < 300 ) || + xhr.status === 304 || xhr.status === 1223 || xhr.status === 0; + } catch(e) {} + + return false; + }, + + // Determines if an XMLHttpRequest returns NotModified + httpNotModified: function( xhr, url ) { + var lastModified = xhr.getResponseHeader("Last-Modified"), + etag = xhr.getResponseHeader("Etag"); + + if ( lastModified ) { + jQuery.lastModified[url] = lastModified; + } + + if ( etag ) { + jQuery.etag[url] = etag; + } + + // Opera returns 0 when status is 304 + return xhr.status === 304 || xhr.status === 0; + }, + + httpData: function( xhr, type, s ) { + var ct = xhr.getResponseHeader("content-type") || "", + xml = type === "xml" || !type && ct.indexOf("xml") >= 0, + data = xml ? xhr.responseXML : xhr.responseText; + + if ( xml && data.documentElement.nodeName === "parsererror" ) { + jQuery.error( "parsererror" ); + } + + // Allow a pre-filtering function to sanitize the response + // s is checked to keep backwards compatibility + if ( s && s.dataFilter ) { + data = s.dataFilter( data, type ); + } + + // The filter can actually parse the response + if ( typeof data === "string" ) { + // Get the JavaScript object, if JSON is used. + if ( type === "json" || !type && ct.indexOf("json") >= 0 ) { + data = jQuery.parseJSON( data ); + + // If the type is "script", eval it in global context + } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) { + jQuery.globalEval( data ); + } + } + + return data; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = []; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray(a) || a.jquery ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[prefix] ); + } + } + + // Return the resulting serialization + return s.join("&").replace(r20, "+"); + + function buildParams( prefix, obj ) { + if ( jQuery.isArray(obj) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || /\[\]$/.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v ); + } + }); + + } else if ( !traditional && obj != null && typeof obj === "object" ) { + // Serialize object item. + jQuery.each( obj, function( k, v ) { + buildParams( prefix + "[" + k + "]", v ); + }); + + } else { + // Serialize scalar item. + add( prefix, obj ); + } + } + + function add( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction(value) ? value() : value; + s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); + } + } +}); +var elemdisplay = {}, + rfxtypes = /toggle|show|hide/, + rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/, + timerId, + fxAttrs = [ + // height animations + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], + // width animations + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], + // opacity animations + [ "opacity" ] + ]; + +jQuery.fn.extend({ + show: function( speed, callback ) { + if ( speed || speed === 0) { + return this.animate( genFx("show", 3), speed, callback); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + var old = jQuery.data(this[i], "olddisplay"); + + this[i].style.display = old || ""; + + if ( jQuery.css(this[i], "display") === "none" ) { + var nodeName = this[i].nodeName, display; + + if ( elemdisplay[ nodeName ] ) { + display = elemdisplay[ nodeName ]; + + } else { + var elem = jQuery("<" + nodeName + " />").appendTo("body"); + + display = elem.css("display"); + + if ( display === "none" ) { + display = "block"; + } + + elem.remove(); + + elemdisplay[ nodeName ] = display; + } + + jQuery.data(this[i], "olddisplay", display); + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( var j = 0, k = this.length; j < k; j++ ) { + this[j].style.display = jQuery.data(this[j], "olddisplay") || ""; + } + + return this; + } + }, + + hide: function( speed, callback ) { + if ( speed || speed === 0 ) { + return this.animate( genFx("hide", 3), speed, callback); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + var old = jQuery.data(this[i], "olddisplay"); + if ( !old && old !== "none" ) { + jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( var j = 0, k = this.length; j < k; j++ ) { + this[j].style.display = "none"; + } + + return this; + } + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2 ) { + var bool = typeof fn === "boolean"; + + if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { + this._toggle.apply( this, arguments ); + + } else if ( fn == null || bool ) { + this.each(function() { + var state = bool ? fn : jQuery(this).is(":hidden"); + jQuery(this)[ state ? "show" : "hide" ](); + }); + + } else { + this.animate(genFx("toggle", 3), fn, fn2); + } + + return this; + }, + + fadeTo: function( speed, to, callback ) { + return this.filter(":hidden").css("opacity", 0).show().end() + .animate({opacity: to}, speed, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed(speed, easing, callback); + + if ( jQuery.isEmptyObject( prop ) ) { + return this.each( optall.complete ); + } + + return this[ optall.queue === false ? "each" : "queue" ](function() { + var opt = jQuery.extend({}, optall), p, + hidden = this.nodeType === 1 && jQuery(this).is(":hidden"), + self = this; + + for ( p in prop ) { + var name = p.replace(rdashAlpha, fcamelCase); + + if ( p !== name ) { + prop[ name ] = prop[ p ]; + delete prop[ p ]; + p = name; + } + + if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { + return opt.complete.call(this); + } + + if ( ( p === "height" || p === "width" ) && this.style ) { + // Store display property + opt.display = jQuery.css(this, "display"); + + // Make sure that nothing sneaks out + opt.overflow = this.style.overflow; + } + + if ( jQuery.isArray( prop[p] ) ) { + // Create (if needed) and add to specialEasing + (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1]; + prop[p] = prop[p][0]; + } + } + + if ( opt.overflow != null ) { + this.style.overflow = "hidden"; + } + + opt.curAnim = jQuery.extend({}, prop); + + jQuery.each( prop, function( name, val ) { + var e = new jQuery.fx( self, opt, name ); + + if ( rfxtypes.test(val) ) { + e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop ); + + } else { + var parts = rfxnum.exec(val), + start = e.cur(true) || 0; + + if ( parts ) { + var end = parseFloat( parts[2] ), + unit = parts[3] || "px"; + + // We need to compute starting value + if ( unit !== "px" ) { + self.style[ name ] = (end || 1) + unit; + start = ((end || 1) / e.cur(true)) * start; + self.style[ name ] = start + unit; + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) { + end = ((parts[1] === "-=" ? -1 : 1) * end) + start; + } + + e.custom( start, end, unit ); + + } else { + e.custom( start, val, "" ); + } + } + }); + + // For JS strict compliance + return true; + }); + }, + + stop: function( clearQueue, gotoEnd ) { + var timers = jQuery.timers; + + if ( clearQueue ) { + this.queue([]); + } + + this.each(function() { + // go in reverse order so anything added to the queue during the loop is ignored + for ( var i = timers.length - 1; i >= 0; i-- ) { + if ( timers[i].elem === this ) { + if (gotoEnd) { + // force the next step to be the last + timers[i](true); + } + + timers.splice(i, 1); + } + } + }); + + // start the next in the queue if the last step wasn't forced + if ( !gotoEnd ) { + this.dequeue(); + } + + return this; + } + +}); + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show", 1), + slideUp: genFx("hide", 1), + slideToggle: genFx("toggle", 1), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, callback ) { + return this.animate( props, speed, callback ); + }; +}); + +jQuery.extend({ + speed: function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? speed : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default; + + // Queueing + opt.old = opt.complete; + opt.complete = function() { + if ( opt.queue !== false ) { + jQuery(this).dequeue(); + } + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + }; + + return opt; + }, + + easing: { + linear: function( p, n, firstNum, diff ) { + return firstNum + diff * p; + }, + swing: function( p, n, firstNum, diff ) { + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; + } + }, + + timers: [], + + fx: function( elem, options, prop ) { + this.options = options; + this.elem = elem; + this.prop = prop; + + if ( !options.orig ) { + options.orig = {}; + } + } + +}); + +jQuery.fx.prototype = { + // Simple function for setting a style value + update: function() { + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); + + // Set display property to block for height/width animations + if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) { + this.elem.style.display = "block"; + } + }, + + // Get the current size + cur: function( force ) { + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { + return this.elem[ this.prop ]; + } + + var r = parseFloat(jQuery.css(this.elem, this.prop, force)); + return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; + }, + + // Start an animation from one number to another + custom: function( from, to, unit ) { + this.startTime = now(); + this.start = from; + this.end = to; + this.unit = unit || this.unit || "px"; + this.now = this.start; + this.pos = this.state = 0; + + var self = this; + function t( gotoEnd ) { + return self.step(gotoEnd); + } + + t.elem = this.elem; + + if ( t() && jQuery.timers.push(t) && !timerId ) { + timerId = setInterval(jQuery.fx.tick, 13); + } + }, + + // Simple 'show' function + show: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.show = true; + + // Begin the animation + // Make sure that we start at a small width/height to avoid any + // flash of content + this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); + + // Start by showing the element + jQuery( this.elem ).show(); + }, + + // Simple 'hide' function + hide: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom(this.cur(), 0); + }, + + // Each step of an animation + step: function( gotoEnd ) { + var t = now(), done = true; + + if ( gotoEnd || t >= this.options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + this.options.curAnim[ this.prop ] = true; + + for ( var i in this.options.curAnim ) { + if ( this.options.curAnim[i] !== true ) { + done = false; + } + } + + if ( done ) { + if ( this.options.display != null ) { + // Reset the overflow + this.elem.style.overflow = this.options.overflow; + + // Reset the display + var old = jQuery.data(this.elem, "olddisplay"); + this.elem.style.display = old ? old : this.options.display; + + if ( jQuery.css(this.elem, "display") === "none" ) { + this.elem.style.display = "block"; + } + } + + // Hide the element if the "hide" operation was done + if ( this.options.hide ) { + jQuery(this.elem).hide(); + } + + // Reset the properties, if the item has been hidden or shown + if ( this.options.hide || this.options.show ) { + for ( var p in this.options.curAnim ) { + jQuery.style(this.elem, p, this.options.orig[p]); + } + } + + // Execute the complete function + this.options.complete.call( this.elem ); + } + + return false; + + } else { + var n = t - this.startTime; + this.state = n / this.options.duration; + + // Perform the easing function, defaults to swing + var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop]; + var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear"); + this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration); + this.now = this.start + ((this.end - this.start) * this.pos); + + // Perform the next step of the animation + this.update(); + } + + return true; + } +}; + +jQuery.extend( jQuery.fx, { + tick: function() { + var timers = jQuery.timers; + + for ( var i = 0; i < timers.length; i++ ) { + if ( !timers[i]() ) { + timers.splice(i--, 1); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + }, + + stop: function() { + clearInterval( timerId ); + timerId = null; + }, + + speeds: { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }, + + step: { + opacity: function( fx ) { + jQuery.style(fx.elem, "opacity", fx.now); + }, + + _default: function( fx ) { + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { + fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; + } else { + fx.elem[ fx.prop ] = fx.now; + } + } + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} + +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} +if ( "getBoundingClientRect" in document.documentElement ) { + jQuery.fn.offset = function( options ) { + var elem = this[0]; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; + + return { top: top, left: left }; + }; + +} else { + jQuery.fn.offset = function( options ) { + var elem = this[0]; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + jQuery.offset.initialize(); + + var offsetParent = elem.offsetParent, prevOffsetParent = elem, + doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, + body = doc.body, defaultView = doc.defaultView, + prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, + top = elem.offsetTop, left = elem.offsetLeft; + + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + break; + } + + computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; + top -= elem.scrollTop; + left -= elem.scrollLeft; + + if ( elem === offsetParent ) { + top += elem.offsetTop; + left += elem.offsetLeft; + + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; + } + + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevComputedStyle = computedStyle; + } + + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { + top += body.offsetTop; + left += body.offsetLeft; + } + + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + top += Math.max( docElem.scrollTop, body.scrollTop ); + left += Math.max( docElem.scrollLeft, body.scrollLeft ); + } + + return { top: top, left: left }; + }; +} + +jQuery.offset = { + initialize: function() { + var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0, + html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; + + jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); + + container.innerHTML = html; + body.insertBefore( container, body.firstChild ); + innerDiv = container.firstChild; + checkDiv = innerDiv.firstChild; + td = innerDiv.nextSibling.firstChild.firstChild; + + this.doesNotAddBorder = (checkDiv.offsetTop !== 5); + this.doesAddBorderForTableAndCells = (td.offsetTop === 5); + + checkDiv.style.position = "fixed", checkDiv.style.top = "20px"; + // safari subtracts parent border width here which is 5px + this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); + checkDiv.style.position = checkDiv.style.top = ""; + + innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative"; + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); + + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); + + body.removeChild( container ); + body = container = innerDiv = checkDiv = table = td = null; + jQuery.offset.initialize = jQuery.noop; + }, + + bodyOffset: function( body ) { + var top = body.offsetTop, left = body.offsetLeft; + + jQuery.offset.initialize(); + + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0; + left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + // set position first, in-case top/left are set even on static elem + if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) { + elem.style.position = "relative"; + } + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curTop = parseInt( jQuery.curCSS( elem, "top", true ), 10 ) || 0, + curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0; + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + var props = { + top: (options.top - curOffset.top) + curTop, + left: (options.left - curOffset.left) + curLeft + }; + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + position: function() { + if ( !this[0] ) { + return null; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0; + offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0; + parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( ["Left", "Top"], function( i, name ) { + var method = "scroll" + name; + + jQuery.fn[ method ] = function(val) { + var elem = this[0], win; + + if ( !elem ) { + return null; + } + + if ( val !== undefined ) { + // Set the scroll offset + return this.each(function() { + win = getWindow( this ); + + if ( win ) { + win.scrollTo( + !i ? val : jQuery(win).scrollLeft(), + i ? val : jQuery(win).scrollTop() + ); + + } else { + this[ method ] = val; + } + }); + } else { + win = getWindow( elem ); + + // Return the scroll offset + return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : + jQuery.support.boxModel && win.document.documentElement[ method ] || + win.document.body[ method ] : + elem[ method ]; + } + }; +}); + +function getWindow( elem ) { + return ("scrollTo" in elem && elem.document) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} +// Create innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each([ "Height", "Width" ], function( i, name ) { + + var type = name.toLowerCase(); + + // innerHeight and innerWidth + jQuery.fn["inner" + name] = function() { + return this[0] ? + jQuery.css( this[0], type, false, "padding" ) : + null; + }; + + // outerHeight and outerWidth + jQuery.fn["outer" + name] = function( margin ) { + return this[0] ? + jQuery.css( this[0], type, false, margin ? "margin" : "border" ) : + null; + }; + + jQuery.fn[ type ] = function( size ) { + // Get window width or height + var elem = this[0]; + if ( !elem ) { + return size == null ? null : this; + } + + if ( jQuery.isFunction( size ) ) { + return this.each(function( i ) { + var self = jQuery( this ); + self[ type ]( size.call( this, i, self[ type ]() ) ); + }); + } + + return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window? + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode + elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] || + elem.document.body[ "client" + name ] : + + // Get document width or height + (elem.nodeType === 9) ? // is it a document + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + Math.max( + elem.documentElement["client" + name], + elem.body["scroll" + name], elem.documentElement["scroll" + name], + elem.body["offset" + name], elem.documentElement["offset" + name] + ) : + + // Get or set width or height on the element + size === undefined ? + // Get width or height on the element + jQuery.css( elem, type ) : + + // Set the width or height on the element (default to pixels if value is unitless) + this.css( type, typeof size === "string" ? size : size + "px" ); + }; + +}); +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; + +})(window); diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-anim_basic_16x16.gif b/fannie/src/jquery/development-bundle/themes/base/images/ui-anim_basic_16x16.gif new file mode 100644 index 000000000..085ccaeca Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-anim_basic_16x16.gif differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 000000000..5b5dab2ab Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 000000000..ac8b229af Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 000000000..ad3d6346e Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 000000000..42ccba269 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 000000000..5a46b47cb Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 000000000..86c2baa65 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 000000000..4443fdc1a Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 000000000..7c9fa6c6e Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_222222_256x240.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_222222_256x240.png new file mode 100644 index 000000000..ee039dc09 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_222222_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 000000000..45e8928e5 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_454545_256x240.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_454545_256x240.png new file mode 100644 index 000000000..7ec70d11b Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_454545_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_888888_256x240.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_888888_256x240.png new file mode 100644 index 000000000..5ba708c39 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_888888_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 000000000..7930a5580 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.accordion.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.accordion.css new file mode 100644 index 000000000..8d8a1a6e1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.accordion.css @@ -0,0 +1,12 @@ +/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +/* IE7-/Win - Fix extra vertical space in lists */ +.ui-accordion a { zoom: 1; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.all.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.all.css new file mode 100644 index 000000000..6ee0fdf4a --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.all.css @@ -0,0 +1,2 @@ +@import "jquery.ui.base.css"; +@import "jquery.ui.theme.css"; diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.autocomplete.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.autocomplete.css new file mode 100644 index 000000000..f99006243 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.autocomplete.css @@ -0,0 +1,39 @@ +/* Autocomplete +----------------------------------*/ +.ui-autocomplete { position: absolute; cursor: default; } +.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* Menu +----------------------------------*/ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.base.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.base.css new file mode 100644 index 000000000..4011708b0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.base.css @@ -0,0 +1,10 @@ +@import url("jquery.ui.core.css"); +@import url("jquery.ui.resizable.css"); +@import url("jquery.ui.accordion.css"); +@import url("jquery.ui.autocomplete.css"); +@import url("jquery.ui.button.css"); +@import url("jquery.ui.dialog.css"); +@import url("jquery.ui.slider.css"); +@import url("jquery.ui.tabs.css"); +@import url("jquery.ui.datepicker.css"); +@import url("jquery.ui.progressbar.css"); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.button.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.button.css new file mode 100644 index 000000000..47777a428 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.button.css @@ -0,0 +1,35 @@ +/* Button +----------------------------------*/ + +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ + + + + + diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.core.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.core.css new file mode 100644 index 000000000..b3e819305 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.core.css @@ -0,0 +1,37 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.datepicker.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.datepicker.css new file mode 100644 index 000000000..a1116e69c --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.datepicker.css @@ -0,0 +1,61 @@ +/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.dialog.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.dialog.css new file mode 100644 index 000000000..f8354642a --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.dialog.css @@ -0,0 +1,13 @@ +/* Dialog +----------------------------------*/ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.progressbar.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.progressbar.css new file mode 100644 index 000000000..bc0939ecf --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.progressbar.css @@ -0,0 +1,4 @@ +/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.resizable.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.resizable.css new file mode 100644 index 000000000..366643b54 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.resizable.css @@ -0,0 +1,13 @@ +/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.slider.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.slider.css new file mode 100644 index 000000000..07c6f4e5e --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.slider.css @@ -0,0 +1,17 @@ +/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.tabs.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.tabs.css new file mode 100644 index 000000000..99e16dbdb --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.tabs.css @@ -0,0 +1,11 @@ +/* Tabs +----------------------------------*/ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/fannie/src/jquery/development-bundle/themes/base/jquery.ui.theme.css b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.theme.css new file mode 100644 index 000000000..3fcc20a50 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/base/jquery.ui.theme.css @@ -0,0 +1,247 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/ +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 000000000..5b5dab2ab Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 000000000..ac8b229af Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 000000000..ad3d6346e Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 000000000..42ccba269 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 000000000..5a46b47cb Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 000000000..86c2baa65 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 000000000..4443fdc1a Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 000000000..7c9fa6c6e Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_222222_256x240.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_222222_256x240.png new file mode 100644 index 000000000..b273ff111 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_222222_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_2e83ff_256x240.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 000000000..09d1cdc85 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_2e83ff_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_454545_256x240.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_454545_256x240.png new file mode 100644 index 000000000..59bd45b90 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_454545_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_888888_256x240.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_888888_256x240.png new file mode 100644 index 000000000..6d02426c1 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_888888_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_cd0a0a_256x240.png b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 000000000..2ab019b73 Binary files /dev/null and b/fannie/src/jquery/development-bundle/themes/smoothness/images/ui-icons_cd0a0a_256x240.png differ diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery-ui-1.8.1.custom.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery-ui-1.8.1.custom.css new file mode 100644 index 000000000..33d736344 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery-ui-1.8.1.custom.css @@ -0,0 +1,486 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +/* IE7-/Win - Fix extra vertical space in lists */ +.ui-accordion a { zoom: 1; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete +----------------------------------*/ +.ui-autocomplete { position: absolute; cursor: default; } +.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* Menu +----------------------------------*/ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* Button +----------------------------------*/ + +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ + + + + + +/* Dialog +----------------------------------*/ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs +----------------------------------*/ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.accordion.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.accordion.css new file mode 100644 index 000000000..8d8a1a6e1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.accordion.css @@ -0,0 +1,12 @@ +/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +/* IE7-/Win - Fix extra vertical space in lists */ +.ui-accordion a { zoom: 1; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.all.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.all.css new file mode 100644 index 000000000..6ee0fdf4a --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.all.css @@ -0,0 +1,2 @@ +@import "jquery.ui.base.css"; +@import "jquery.ui.theme.css"; diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.autocomplete.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.autocomplete.css new file mode 100644 index 000000000..f99006243 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.autocomplete.css @@ -0,0 +1,39 @@ +/* Autocomplete +----------------------------------*/ +.ui-autocomplete { position: absolute; cursor: default; } +.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* Menu +----------------------------------*/ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.base.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.base.css new file mode 100644 index 000000000..4011708b0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.base.css @@ -0,0 +1,10 @@ +@import url("jquery.ui.core.css"); +@import url("jquery.ui.resizable.css"); +@import url("jquery.ui.accordion.css"); +@import url("jquery.ui.autocomplete.css"); +@import url("jquery.ui.button.css"); +@import url("jquery.ui.dialog.css"); +@import url("jquery.ui.slider.css"); +@import url("jquery.ui.tabs.css"); +@import url("jquery.ui.datepicker.css"); +@import url("jquery.ui.progressbar.css"); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.button.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.button.css new file mode 100644 index 000000000..47777a428 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.button.css @@ -0,0 +1,35 @@ +/* Button +----------------------------------*/ + +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ + + + + + diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.core.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.core.css new file mode 100644 index 000000000..b3e819305 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.core.css @@ -0,0 +1,37 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.datepicker.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.datepicker.css new file mode 100644 index 000000000..a1116e69c --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.datepicker.css @@ -0,0 +1,61 @@ +/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.dialog.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.dialog.css new file mode 100644 index 000000000..f8354642a --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.dialog.css @@ -0,0 +1,13 @@ +/* Dialog +----------------------------------*/ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.progressbar.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.progressbar.css new file mode 100644 index 000000000..bc0939ecf --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.progressbar.css @@ -0,0 +1,4 @@ +/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.resizable.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.resizable.css new file mode 100644 index 000000000..366643b54 --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.resizable.css @@ -0,0 +1,13 @@ +/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.slider.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.slider.css new file mode 100644 index 000000000..07c6f4e5e --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.slider.css @@ -0,0 +1,17 @@ +/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.tabs.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.tabs.css new file mode 100644 index 000000000..99e16dbdb --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.tabs.css @@ -0,0 +1,11 @@ +/* Tabs +----------------------------------*/ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.theme.css b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.theme.css new file mode 100644 index 000000000..d777330bc --- /dev/null +++ b/fannie/src/jquery/development-bundle/themes/smoothness/jquery.ui.theme.css @@ -0,0 +1,249 @@ + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery-ui-i18n.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery-ui-i18n.js new file mode 100644 index 000000000..71f961bdb --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery-ui-i18n.js @@ -0,0 +1,1176 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +jQuery(function($){ + $.datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['af']); +}); +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Al Horani -- koko.dw@gmail.com */ +/* خالد الحوراني -- koko.dw@gmail.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name ÙØ¨Ø±Ø§ÙŠØ± - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '&#x3c;السابق', + nextText: 'التالي&#x3e;', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], + dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +});/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +jQuery(function($) { + $.datepicker.regional['az'] = { + closeText: 'BaÄŸla', + prevText: '&#x3c;Geri', + nextText: 'İrÉ™li&#x3e;', + currentText: 'Bugün', + monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun', + 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'], + monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun', + 'İyul','Avq','Sen','Okt','Noy','Dek'], + dayNames: ['Bazar','Bazar ertÉ™si','ÇərÅŸÉ™nbÉ™ axÅŸamı','ÇərÅŸÉ™nbÉ™','CümÉ™ axÅŸamı','CümÉ™','ŞənbÉ™'], + dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Åž'], + dayNamesMin: ['B','B','Ç','С','Ç','C','Åž'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['az']); +});/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '&#x3c;назад', + nextText: 'напред&#x3e;', + nextBigText: '&#x3e;&#x3e;', + currentText: 'днеÑ', + monthNames: ['Януари','Февруари','Март','Ðприл','Май','Юни', + 'Юли','ÐвгуÑÑ‚','Септември','Октомври','Ðоември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Ðпр','Май','Юни', + 'Юли','Ðвг','Сеп','Окт','Ðов','Дек'], + dayNames: ['ÐеделÑ','Понеделник','Вторник','СрÑда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Ðед','Пон','Вто','СрÑ','Чет','Пет','Съб'], + dayNamesMin: ['Ðе','По','Ð’Ñ‚','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); +/* Bosnian i18n for the jQuery UI date picker plugin. */ +/* Written by Kenan Konjo. */ +jQuery(function($){ + $.datepicker.regional['bs'] = { + closeText: 'Zatvori', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Juni', + 'Juli','August','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bs']); +});/* Inicialització en català per a l'extenció 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + closeText: 'Tancar', + prevText: '&#x3c;Ant', + nextText: 'Seg&#x3e;', + currentText: 'Avui', + monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +});/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '&#x3c;Dříve', + nextText: 'PozdÄ›ji&#x3e;', + currentText: 'Nyní', + monthNames: ['leden','únor','bÅ™ezen','duben','kvÄ›ten','Äerven', + 'Äervenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bÅ™e','dub','kvÄ›','Äer', + 'Ävc','srp','zář','říj','lis','pro'], + dayNames: ['nedÄ›le', 'pondÄ›lí', 'úterý', 'stÅ™eda', 'Ätvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'Ät', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','Ät','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '&#x3c;Forrige', + nextText: 'Næste&#x3e;', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + closeText: 'schließen', + prevText: '&#x3c;zurück', + nextText: 'Vor&#x3e;', + currentText: 'heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'Wo', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +jQuery(function($){ + $.datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'ΠÏοηγοÏμενος', + nextText: 'Επόμενος', + currentText: 'ΤÏέχων Μήνας', + monthNames: ['ΙανουάÏιος','ΦεβÏουάÏιος','ΜάÏτιος','ΑπÏίλιος','Μάιος','ΙοÏνιος', + 'ΙοÏλιος','ΑÏγουστος','ΣεπτέμβÏιος','ΟκτώβÏιος','ÎοέμβÏιος','ΔεκέμβÏιος'], + monthNamesShort: ['Ιαν','Φεβ','ΜαÏ','ΑπÏ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Îοε','Δεκ'], + dayNames: ['ΚυÏιακή','ΔευτέÏα','ΤÏίτη','ΤετάÏτη','Πέμπτη','ΠαÏασκευή','Σάββατο'], + dayNamesShort: ['ΚυÏ','Δευ','ΤÏι','Τετ','Πεμ','ΠαÏ','Σαβ'], + dayNamesMin: ['Κυ','Δε','ΤÏ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['el']); +});/* English/UK initialisation for the jQuery UI date picker plugin. */ +/* Written by Stuart. */ +jQuery(function($){ + $.datepicker.regional['en-GB'] = { + closeText: 'Done', + prevText: 'Prev', + nextText: 'Next', + currentText: 'Today', + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-GB']); +}); +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + closeText: 'Fermi', + prevText: '&lt;Anta', + nextText: 'Sekv&gt;', + currentText: 'Nuna', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','AÅ­gusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','AÅ­g','Sep','Okt','Nov','Dec'], + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ä´aÅ­do','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ä´aÅ­','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ä´a','Ve','Sa'], + weekHeader: 'Sb', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '&#x3c;Ant', + nextText: 'Sig&#x3e;', + currentText: 'Hoy', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'], + dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['es']); +});/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +jQuery(function($){ + $.datepicker.regional['et'] = { + closeText: 'Sulge', + prevText: 'Eelnev', + nextText: 'Järgnev', + currentText: 'Täna', + monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni', + 'Juuli','August','September','Oktoober','November','Detsember'], + monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni', + 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'], + dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'], + dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'], + dayNamesMin: ['P','E','T','K','N','R','L'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['et']); +}); /* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +jQuery(function($){ + $.datepicker.regional['eu'] = { + closeText: 'Egina', + prevText: '&#x3c;Aur', + nextText: 'Hur&#x3e;', + currentText: 'Gaur', + monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina', + 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'], + monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka', + 'Uzt','Abu','Ira','Urr','Aza','Abe'], + dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'], + dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'], + dayNamesMin: ['Ig','As','As','As','Os','Os','La'], + weekHeader: 'Wk', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eu']); +});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '&#x3c;قبلي', + nextText: 'بعدي&#x3e;', + currentText: 'امروز', + monthNames: ['ÙØ±ÙˆØ±Ø¯ÙŠÙ†','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسÙند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ÙŠ','د','س','Ú†','Ù¾','ج', 'Ø´'], + dayNamesMin: ['ÙŠ','د','س','Ú†','Ù¾','ج', 'Ø´'], + weekHeader: 'Ù‡Ù', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +});/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi� (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + closeText: 'Sulje', + prevText: '&laquo;Edellinen', + nextText: 'Seuraava&raquo;', + currentText: 'T&auml;n&auml;&auml;n', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu', + 'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;', + 'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'], + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + weekHeader: 'Vk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +jQuery(function($){ + $.datepicker.regional['fo'] = { + closeText: 'Lat aftur', + prevText: '&#x3c;Fyrra', + nextText: 'Næsta&#x3e;', + currentText: 'à dag', + monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'], + dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'], + dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'], + weekHeader: 'Vk', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fo']); +}); +/* Swiss-French initialisation for the jQuery UI date picker plugin. */ +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */ +jQuery(function($){ + $.datepicker.regional['fr-CH'] = { + closeText: 'Fermer', + prevText: '&#x3c;Préc', + nextText: 'Suiv&#x3e;', + currentText: 'Courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr-CH']); +});/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: '&#x3c;Préc', + nextText: 'Suiv&#x3e;', + currentText: 'Courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +});/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '&#x3c;הקוד×', + nextText: 'הב×&#x3e;', + currentText: 'היו×', + monthNames: ['ינו×ר','פברו×ר','מרץ','×פריל','מ××™','יוני', + 'יולי','×וגוסט','ספטמבר','×וקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + dayNames: ['ר×שון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + dayNamesMin: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + closeText: 'Zatvori', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Danas', + monthNames: ['SijeÄanj','VeljaÄa','Ožujak','Travanj','Svibanj','Lipanj', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Tje', + dateFormat: 'dd.mm.yy.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +});/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + closeText: 'bezárás', + prevText: '&laquo;&nbsp;vissza', + nextText: 'elÅ‘re&nbsp;&raquo;', + currentText: 'ma', + monthNames: ['Január', 'Február', 'Március', 'Ãprilis', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ãpr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + weekHeader: 'Hé', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + closeText: 'Õ“Õ¡Õ¯Õ¥Õ¬', + prevText: '&#x3c;Õ†Õ¡Õ­.', + nextText: 'Õ€Õ¡Õ».&#x3e;', + currentText: 'Ô±ÕµÕ½Ö…Ö€', + monthNames: ['Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€','Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€Õ«Õ¬','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬Õ«Õ½','Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½','ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€','Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'], + monthNamesShort: ['Õ€Õ¸Ö‚Õ¶Õ¾','Õ“Õ¥Õ¿Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬','Õ•Õ£Õ½','ÕÕ¥Õº','Õ€Õ¸Õ¯','Õ†Õ¸Õµ','Ô´Õ¥Õ¯'], + dayNames: ['Õ¯Õ«Ö€Õ¡Õ¯Õ«','Õ¥Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«','Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','Õ¸Ö‚Ö€Õ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'], + dayNamesShort: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + dayNamesMin: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + weekHeader: 'Õ‡Ô²Õ', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +});/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '&#x3c;mundur', + nextText: 'maju&#x3e;', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['id']); +});/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + closeText: 'Loka', + prevText: '&#x3c; Fyrri', + nextText: 'N&aelig;sti &#x3e;', + currentText: '&Iacute; dag', + monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;', + 'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n', + 'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'], + dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'], + dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'], + dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'], + weekHeader: 'Vika', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['is']); +});/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '&#x3c;Prec', + nextText: 'Succ&#x3e;', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + closeText: 'é–‰ã˜ã‚‹', + prevText: '&#x3c;å‰', + nextText: '次&#x3e;', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','ç«æ›œæ—¥','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['æ—¥','月','ç«','æ°´','木','金','土'], + dayNamesMin: ['æ—¥','月','ç«','æ°´','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +});/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + closeText: '닫기', + prevText: 'ì´ì „달', + nextText: '다ìŒë‹¬', + currentText: '오늘', + monthNames: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + monthNamesShort: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + dayNames: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesShort: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesMin: ['ì¼','ì›”','í™”','수','목','금','토'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: 'ë…„'}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +});/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + closeText: 'Uždaryti', + prevText: '&#x3c;Atgal', + nextText: 'Pirmyn&#x3e;', + currentText: 'Å iandien', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','RugpjÅ«tis','RugsÄ—jis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','Å¡eÅ¡'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + closeText: 'AizvÄ“rt', + prevText: 'Iepr', + nextText: 'NÄka', + currentText: 'Å odien', + monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs', + 'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n', + 'JÅ«l','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['svÄ“tdiena','pirmdiena','otrdiena','treÅ¡diena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + weekHeader: 'Nav', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +});/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +jQuery(function($){ + $.datepicker.regional['ms'] = { + closeText: 'Tutup', + prevText: '&#x3c;Sebelum', + nextText: 'Selepas&#x3e;', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Mac','April','Mei','Jun', + 'Julai','Ogos','September','Oktober','November','Disember'], + monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun', + 'Jul','Ogo','Sep','Okt','Nov','Dis'], + dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'], + dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'], + dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ms']); +});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: 'â†', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +});/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '&laquo;Forrige', + nextText: 'Neste&raquo;', + currentText: 'I dag', + monthNames: ['Januar','Februar','Mars','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uke', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '&#x3c;Poprzedni', + nextText: 'NastÄ™pny&#x3e;', + currentText: 'DziÅ›', + monthNames: ['StyczeÅ„','Luty','Marzec','KwiecieÅ„','Maj','Czerwiec', + 'Lipiec','SierpieÅ„','WrzesieÅ„','Październik','Listopad','GrudzieÅ„'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','PoniedziaÅ‚ek','Wtorek','Åšroda','Czwartek','PiÄ…tek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Åšr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Åšr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '&#x3c;Anterior', + nextText: 'Pr&oacute;ximo&#x3e;', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +});/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + closeText: 'ÃŽnchide', + prevText: '&laquo; Luna precedentă', + nextText: 'Luna următoare &raquo;', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'MarÅ£i', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '&#x3c;Пред', + nextText: 'След&#x3e;', + currentText: 'СегоднÑ', + monthNames: ['Январь','Февраль','Март','Ðпрель','Май','Июнь', + 'Июль','ÐвгуÑÑ‚','СентÑбрь','ОктÑбрь','ÐоÑбрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Ðпр','Май','Июн', + 'Июл','Ðвг','Сен','Окт','ÐоÑ','Дек'], + dayNames: ['воÑкреÑенье','понедельник','вторник','Ñреда','четверг','пÑтница','Ñуббота'], + dayNamesShort: ['вÑк','пнд','втр','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ð’Ñ','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + weekHeader: 'Ðе', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +});/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + closeText: 'ZavrieÅ¥', + prevText: '&#x3c;Predchádzajúci', + nextText: 'Nasledujúci&#x3e;', + currentText: 'Dnes', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + closeText: 'Zapri', + prevText: '&lt;Prej&#x161;nji', + nextText: 'Naslednji&gt;', + currentText: 'Trenutni', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'], + weekHeader: 'Teden', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + closeText: 'mbylle', + prevText: '&#x3c;mbrapa', + nextText: 'Përpara&#x3e;', + currentText: 'sot', + monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + weekHeader: 'Ja', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr-SR'] = { + closeText: 'Zatvori', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Jun', + 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sre','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Sed', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr-SR']); +}); +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr'] = { + closeText: 'Затвори', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'ДанаÑ', + monthNames: ['Јануар','Фебруар','Март','Ðприл','Мај','Јун', + 'Јул','ÐвгуÑÑ‚','Септембар','Октобар','Ðовембар','Децембар'], + monthNamesShort: ['Јан','Феб','Мар','Ðпр','Мај','Јун', + 'Јул','Ðвг','Сеп','Окт','Ðов','Дец'], + dayNames: ['Ðедеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'], + dayNamesShort: ['Ðед','Пон','Уто','Сре','Чет','Пет','Суб'], + dayNamesMin: ['Ðе','По','Ут','Ср','Че','Пе','Су'], + weekHeader: 'Сед', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr']); +}); +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = { + closeText: 'Stäng', + prevText: '&laquo;Förra', + nextText: 'Nästa&raquo;', + currentText: 'Idag', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNamesShort: ['Sön','MÃ¥n','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','MÃ¥ndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','MÃ¥','Ti','On','To','Fr','Lö'], + weekHeader: 'Ve', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by S A Sureshkumar (saskumar@live.com). */ +jQuery(function($){ + $.datepicker.regional['ta'] = { + closeText: 'மூடà¯', + prevText: 'à®®à¯à®©à¯à®©à¯ˆà®¯à®¤à¯', + nextText: 'அடà¯à®¤à¯à®¤à®¤à¯', + currentText: 'இனà¯à®±à¯', + monthNames: ['தை','மாசி','பஙà¯à®•à¯à®©à®¿','சிதà¯à®¤à®¿à®°à¯ˆ','வைகாசி','ஆனி', + 'ஆடி','ஆவணி','பà¯à®°à®Ÿà¯à®Ÿà®¾à®šà®¿','à®à®ªà¯à®ªà®šà®¿','காரà¯à®¤à¯à®¤à®¿à®•ை','மாரà¯à®•ழி'], + monthNamesShort: ['தை','மாசி','பஙà¯','சிதà¯','வைகா','ஆனி', + 'ஆடி','ஆவ','பà¯à®°','à®à®ªà¯','காரà¯','மாரà¯'], + dayNames: ['ஞாயிறà¯à®±à¯à®•à¯à®•ிழமை','திஙà¯à®•டà¯à®•ிழமை','செவà¯à®µà®¾à®¯à¯à®•à¯à®•ிழமை','பà¯à®¤à®©à¯à®•ிழமை','வியாழகà¯à®•ிழமை','வெளà¯à®³à®¿à®•à¯à®•ிழமை','சனிகà¯à®•ிழமை'], + dayNamesShort: ['ஞாயிறà¯','திஙà¯à®•ளà¯','செவà¯à®µà®¾à®¯à¯','பà¯à®¤à®©à¯','வியாழனà¯','வெளà¯à®³à®¿','சனி'], + dayNamesMin: ['ஞா','தி','செ','பà¯','வி','வெ','ச'], + weekHeader: 'Ðе', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ta']); +}); +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '&laquo;&nbsp;ย้อน', + nextText: 'ถัดไป&nbsp;&raquo;', + currentText: 'วันนี้', + monthNames: ['มà¸à¸£à¸²à¸„ม','à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'à¸à¸£à¸à¸à¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'], + monthNamesShort: ['ม.ค.','à¸.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'à¸.ค.','ส.ค.','à¸.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุà¸à¸£à¹Œ','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['th']); +});/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '&#x3c;geri', + nextText: 'ileri&#x3e', + currentText: 'bugün', + monthNames: ['Ocak','Åžubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','AÄŸustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Åžub','Mar','Nis','May','Haz', + 'Tem','AÄŸu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','ÇarÅŸamba','PerÅŸembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','ВереÑень','Жовтень','ЛиÑтопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','ЛиÑ','Гру'], + dayNames: ['неділÑ','понеділок','вівторок','Ñереда','четвер','п’ÑтницÑ','Ñубота'], + dayNamesShort: ['нед','пнд','вів','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ðд','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + weekHeader: 'Ðе', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +});/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +jQuery(function($){ + $.datepicker.regional['vi'] = { + closeText: 'Äóng', + prevText: '&#x3c;Trước', + nextText: 'Tiếp&#x3e;', + currentText: 'Hôm nay', + monthNames: ['Tháng Má»™t', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mưá»i', 'Tháng Mưá»i Má»™t', 'Tháng Mưá»i Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chá»§ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['vi']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '&#x3c;上月', + nextText: '下月&#x3e;', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by SCCY (samuelcychan@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-HK'] = { + closeText: '關閉', + prevText: '&#x3c;上月', + nextText: '下月&#x3e;', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-HK']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '&#x3c;上月', + nextText: '下月&#x3e;', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-af.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-af.js new file mode 100644 index 000000000..43fbf6cd8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-af.js @@ -0,0 +1,23 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +jQuery(function($){ + $.datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['af']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js new file mode 100644 index 000000000..c799b48d8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js @@ -0,0 +1,24 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Al Horani -- koko.dw@gmail.com */ +/* خالد الحوراني -- koko.dw@gmail.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name ÙØ¨Ø±Ø§ÙŠØ± - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '&#x3c;السابق', + nextText: 'التالي&#x3e;', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], + dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-az.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-az.js new file mode 100644 index 000000000..b5434057b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-az.js @@ -0,0 +1,23 @@ +/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +jQuery(function($) { + $.datepicker.regional['az'] = { + closeText: 'BaÄŸla', + prevText: '&#x3c;Geri', + nextText: 'İrÉ™li&#x3e;', + currentText: 'Bugün', + monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun', + 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'], + monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun', + 'İyul','Avq','Sen','Okt','Noy','Dek'], + dayNames: ['Bazar','Bazar ertÉ™si','ÇərÅŸÉ™nbÉ™ axÅŸamı','ÇərÅŸÉ™nbÉ™','CümÉ™ axÅŸamı','CümÉ™','ŞənbÉ™'], + dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Åž'], + dayNamesMin: ['B','B','Ç','С','Ç','C','Åž'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['az']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js new file mode 100644 index 000000000..b5113f781 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js @@ -0,0 +1,24 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '&#x3c;назад', + nextText: 'напред&#x3e;', + nextBigText: '&#x3e;&#x3e;', + currentText: 'днеÑ', + monthNames: ['Януари','Февруари','Март','Ðприл','Май','Юни', + 'Юли','ÐвгуÑÑ‚','Септември','Октомври','Ðоември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Ðпр','Май','Юни', + 'Юли','Ðвг','Сеп','Окт','Ðов','Дек'], + dayNames: ['ÐеделÑ','Понеделник','Вторник','СрÑда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Ðед','Пон','Вто','СрÑ','Чет','Пет','Съб'], + dayNamesMin: ['Ðе','По','Ð’Ñ‚','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js new file mode 100644 index 000000000..30ab826b0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js @@ -0,0 +1,23 @@ +/* Bosnian i18n for the jQuery UI date picker plugin. */ +/* Written by Kenan Konjo. */ +jQuery(function($){ + $.datepicker.regional['bs'] = { + closeText: 'Zatvori', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Juni', + 'Juli','August','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bs']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js new file mode 100644 index 000000000..b128e699e --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js @@ -0,0 +1,23 @@ +/* Inicialització en català per a l'extenció 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + closeText: 'Tancar', + prevText: '&#x3c;Ant', + nextText: 'Seg&#x3e;', + currentText: 'Avui', + monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js new file mode 100644 index 000000000..c3c07ea67 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js @@ -0,0 +1,23 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '&#x3c;Dříve', + nextText: 'PozdÄ›ji&#x3e;', + currentText: 'Nyní', + monthNames: ['leden','únor','bÅ™ezen','duben','kvÄ›ten','Äerven', + 'Äervenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bÅ™e','dub','kvÄ›','Äer', + 'Ävc','srp','zář','říj','lis','pro'], + dayNames: ['nedÄ›le', 'pondÄ›lí', 'úterý', 'stÅ™eda', 'Ätvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'Ät', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','Ät','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-da.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-da.js new file mode 100644 index 000000000..4a99a5833 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-da.js @@ -0,0 +1,23 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '&#x3c;Forrige', + nextText: 'Næste&#x3e;', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-de.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-de.js new file mode 100644 index 000000000..ac2d516aa --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-de.js @@ -0,0 +1,23 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + closeText: 'schließen', + prevText: '&#x3c;zurück', + nextText: 'Vor&#x3e;', + currentText: 'heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'Wo', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-el.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-el.js new file mode 100644 index 000000000..9542769d9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-el.js @@ -0,0 +1,23 @@ +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +jQuery(function($){ + $.datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'ΠÏοηγοÏμενος', + nextText: 'Επόμενος', + currentText: 'ΤÏέχων Μήνας', + monthNames: ['ΙανουάÏιος','ΦεβÏουάÏιος','ΜάÏτιος','ΑπÏίλιος','Μάιος','ΙοÏνιος', + 'ΙοÏλιος','ΑÏγουστος','ΣεπτέμβÏιος','ΟκτώβÏιος','ÎοέμβÏιος','ΔεκέμβÏιος'], + monthNamesShort: ['Ιαν','Φεβ','ΜαÏ','ΑπÏ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Îοε','Δεκ'], + dayNames: ['ΚυÏιακή','ΔευτέÏα','ΤÏίτη','ΤετάÏτη','Πέμπτη','ΠαÏασκευή','Σάββατο'], + dayNamesShort: ['ΚυÏ','Δευ','ΤÏι','Τετ','Πεμ','ΠαÏ','Σαβ'], + dayNamesMin: ['Κυ','Δε','ΤÏ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['el']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js new file mode 100644 index 000000000..aac7b6195 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js @@ -0,0 +1,23 @@ +/* English/UK initialisation for the jQuery UI date picker plugin. */ +/* Written by Stuart. */ +jQuery(function($){ + $.datepicker.regional['en-GB'] = { + closeText: 'Done', + prevText: 'Prev', + nextText: 'Next', + currentText: 'Today', + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['en-GB']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js new file mode 100644 index 000000000..ba5715687 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js @@ -0,0 +1,23 @@ +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + closeText: 'Fermi', + prevText: '&lt;Anta', + nextText: 'Sekv&gt;', + currentText: 'Nuna', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','AÅ­gusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','AÅ­g','Sep','Okt','Nov','Dec'], + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ä´aÅ­do','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ä´aÅ­','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ä´a','Ve','Sa'], + weekHeader: 'Sb', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-es.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-es.js new file mode 100644 index 000000000..a02133de3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-es.js @@ -0,0 +1,23 @@ +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '&#x3c;Ant', + nextText: 'Sig&#x3e;', + currentText: 'Hoy', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'], + dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['es']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-et.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-et.js new file mode 100644 index 000000000..f97311f31 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-et.js @@ -0,0 +1,23 @@ +/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +jQuery(function($){ + $.datepicker.regional['et'] = { + closeText: 'Sulge', + prevText: 'Eelnev', + nextText: 'Järgnev', + currentText: 'Täna', + monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni', + 'Juuli','August','September','Oktoober','November','Detsember'], + monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni', + 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'], + dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'], + dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'], + dayNamesMin: ['P','E','T','K','N','R','L'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['et']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js new file mode 100644 index 000000000..9ba6ee22e --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js @@ -0,0 +1,23 @@ +/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +jQuery(function($){ + $.datepicker.regional['eu'] = { + closeText: 'Egina', + prevText: '&#x3c;Aur', + nextText: 'Hur&#x3e;', + currentText: 'Gaur', + monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina', + 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'], + monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka', + 'Uzt','Abu','Ira','Urr','Aza','Abe'], + dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'], + dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'], + dayNamesMin: ['Ig','As','As','As','Os','Os','La'], + weekHeader: 'Wk', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['eu']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js new file mode 100644 index 000000000..adb3709fe --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js @@ -0,0 +1,23 @@ +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '&#x3c;قبلي', + nextText: 'بعدي&#x3e;', + currentText: 'امروز', + monthNames: ['ÙØ±ÙˆØ±Ø¯ÙŠÙ†','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسÙند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ÙŠ','د','س','Ú†','Ù¾','ج', 'Ø´'], + dayNamesMin: ['ÙŠ','د','س','Ú†','Ù¾','ج', 'Ø´'], + weekHeader: 'Ù‡Ù', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js new file mode 100644 index 000000000..e1f25fd84 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js @@ -0,0 +1,23 @@ +/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi� (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + closeText: 'Sulje', + prevText: '&laquo;Edellinen', + nextText: 'Seuraava&raquo;', + currentText: 'T&auml;n&auml;&auml;n', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu', + 'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;', + 'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'], + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + weekHeader: 'Vk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js new file mode 100644 index 000000000..c14362216 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js @@ -0,0 +1,23 @@ +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +jQuery(function($){ + $.datepicker.regional['fo'] = { + closeText: 'Lat aftur', + prevText: '&#x3c;Fyrra', + nextText: 'Næsta&#x3e;', + currentText: 'à dag', + monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'], + dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'], + dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'], + weekHeader: 'Vk', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fo']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js new file mode 100644 index 000000000..38212d548 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js @@ -0,0 +1,23 @@ +/* Swiss-French initialisation for the jQuery UI date picker plugin. */ +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */ +jQuery(function($){ + $.datepicker.regional['fr-CH'] = { + closeText: 'Fermer', + prevText: '&#x3c;Préc', + nextText: 'Suiv&#x3e;', + currentText: 'Courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr-CH']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js new file mode 100644 index 000000000..134bda65d --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js @@ -0,0 +1,23 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: '&#x3c;Préc', + nextText: 'Suiv&#x3e;', + currentText: 'Courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-he.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-he.js new file mode 100644 index 000000000..3b3dc387f --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-he.js @@ -0,0 +1,23 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '&#x3c;הקוד×', + nextText: 'הב×&#x3e;', + currentText: 'היו×', + monthNames: ['ינו×ר','פברו×ר','מרץ','×פריל','מ××™','יוני', + 'יולי','×וגוסט','ספטמבר','×וקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + dayNames: ['ר×שון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + dayNamesMin: ['×\'','ב\'','×’\'','ד\'','×”\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js new file mode 100644 index 000000000..0285c1aa9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js @@ -0,0 +1,23 @@ +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + closeText: 'Zatvori', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Danas', + monthNames: ['SijeÄanj','VeljaÄa','Ožujak','Travanj','Svibanj','Lipanj', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Tje', + dateFormat: 'dd.mm.yy.', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js new file mode 100644 index 000000000..249e7b0ef --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js @@ -0,0 +1,23 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + closeText: 'bezárás', + prevText: '&laquo;&nbsp;vissza', + nextText: 'elÅ‘re&nbsp;&raquo;', + currentText: 'ma', + monthNames: ['Január', 'Február', 'Március', 'Ãprilis', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ãpr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + weekHeader: 'Hé', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js new file mode 100644 index 000000000..c6cc1946c --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js @@ -0,0 +1,23 @@ +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + closeText: 'Õ“Õ¡Õ¯Õ¥Õ¬', + prevText: '&#x3c;Õ†Õ¡Õ­.', + nextText: 'Õ€Õ¡Õ».&#x3e;', + currentText: 'Ô±ÕµÕ½Ö…Ö€', + monthNames: ['Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€','Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€Õ«Õ¬','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬Õ«Õ½','Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½','ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€','Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€','Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'], + monthNamesShort: ['Õ€Õ¸Ö‚Õ¶Õ¾','Õ“Õ¥Õ¿Ö€','Õ„Õ¡Ö€Õ¿','Ô±ÕºÖ€','Õ„Õ¡ÕµÕ«Õ½','Õ€Õ¸Ö‚Õ¶Õ«Õ½', + 'Õ€Õ¸Ö‚Õ¬','Õ•Õ£Õ½','ÕÕ¥Õº','Õ€Õ¸Õ¯','Õ†Õ¸Õµ','Ô´Õ¥Õ¯'], + dayNames: ['Õ¯Õ«Ö€Õ¡Õ¯Õ«','Õ¥Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«','Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','Õ¸Ö‚Ö€Õ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'], + dayNamesShort: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + dayNamesMin: ['Õ¯Õ«Ö€','Õ¥Ö€Õ¯','Õ¥Ö€Ö„','Õ¹Ö€Ö„','Õ°Õ¶Õ£','Õ¸Ö‚Ö€Õ¢','Õ·Õ¢Õ©'], + weekHeader: 'Õ‡Ô²Õ', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-id.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-id.js new file mode 100644 index 000000000..c626fbb7b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-id.js @@ -0,0 +1,23 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '&#x3c;mundur', + nextText: 'maju&#x3e;', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['id']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-is.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-is.js new file mode 100644 index 000000000..c53235a49 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-is.js @@ -0,0 +1,23 @@ +/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + closeText: 'Loka', + prevText: '&#x3c; Fyrri', + nextText: 'N&aelig;sti &#x3e;', + currentText: '&Iacute; dag', + monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;', + 'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n', + 'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'], + dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'], + dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'], + dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'], + weekHeader: 'Vika', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['is']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-it.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-it.js new file mode 100644 index 000000000..59da2df67 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-it.js @@ -0,0 +1,23 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '&#x3c;Prec', + nextText: 'Succ&#x3e;', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js new file mode 100644 index 000000000..79cd827c7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js @@ -0,0 +1,23 @@ +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + closeText: 'é–‰ã˜ã‚‹', + prevText: '&#x3c;å‰', + nextText: '次&#x3e;', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','ç«æ›œæ—¥','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['æ—¥','月','ç«','æ°´','木','金','土'], + dayNamesMin: ['æ—¥','月','ç«','æ°´','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js new file mode 100644 index 000000000..5b3531652 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js @@ -0,0 +1,23 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + closeText: '닫기', + prevText: 'ì´ì „달', + nextText: '다ìŒë‹¬', + currentText: '오늘', + monthNames: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + monthNamesShort: ['1ì›”(JAN)','2ì›”(FEB)','3ì›”(MAR)','4ì›”(APR)','5ì›”(MAY)','6ì›”(JUN)', + '7ì›”(JUL)','8ì›”(AUG)','9ì›”(SEP)','10ì›”(OCT)','11ì›”(NOV)','12ì›”(DEC)'], + dayNames: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesShort: ['ì¼','ì›”','í™”','수','목','금','토'], + dayNamesMin: ['ì¼','ì›”','í™”','수','목','금','토'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: 'ë…„'}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js new file mode 100644 index 000000000..67d5119ca --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js @@ -0,0 +1,23 @@ +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + closeText: 'Uždaryti', + prevText: '&#x3c;Atgal', + nextText: 'Pirmyn&#x3e;', + currentText: 'Å iandien', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','RugpjÅ«tis','RugsÄ—jis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','Å¡eÅ¡'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'], + weekHeader: 'Wk', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js new file mode 100644 index 000000000..003934e72 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js @@ -0,0 +1,23 @@ +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + closeText: 'AizvÄ“rt', + prevText: 'Iepr', + nextText: 'NÄka', + currentText: 'Å odien', + monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs', + 'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n', + 'JÅ«l','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['svÄ“tdiena','pirmdiena','otrdiena','treÅ¡diena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + weekHeader: 'Nav', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js new file mode 100644 index 000000000..e953ac04f --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js @@ -0,0 +1,23 @@ +/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +jQuery(function($){ + $.datepicker.regional['ms'] = { + closeText: 'Tutup', + prevText: '&#x3c;Sebelum', + nextText: 'Selepas&#x3e;', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Mac','April','Mei','Jun', + 'Julai','Ogos','September','Oktober','November','Disember'], + monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun', + 'Jul','Ogo','Sep','Okt','Nov','Dis'], + dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'], + dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'], + dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ms']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js new file mode 100644 index 000000000..663d6bb26 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js @@ -0,0 +1,23 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: 'â†', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-no.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-no.js new file mode 100644 index 000000000..12b2356bf --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-no.js @@ -0,0 +1,23 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '&laquo;Forrige', + nextText: 'Neste&raquo;', + currentText: 'I dag', + monthNames: ['Januar','Februar','Mars','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uke', + dateFormat: 'yy-mm-dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js new file mode 100644 index 000000000..d315bf523 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js @@ -0,0 +1,23 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '&#x3c;Poprzedni', + nextText: 'NastÄ™pny&#x3e;', + currentText: 'DziÅ›', + monthNames: ['StyczeÅ„','Luty','Marzec','KwiecieÅ„','Maj','Czerwiec', + 'Lipiec','SierpieÅ„','WrzesieÅ„','Październik','Listopad','GrudzieÅ„'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','PoniedziaÅ‚ek','Wtorek','Åšroda','Czwartek','PiÄ…tek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Åšr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Åšr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js new file mode 100644 index 000000000..38818637d --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js @@ -0,0 +1,23 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '&#x3c;Anterior', + nextText: 'Pr&oacute;ximo&#x3e;', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js new file mode 100644 index 000000000..4fe95aeac --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js @@ -0,0 +1,26 @@ +/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + closeText: 'ÃŽnchide', + prevText: '&laquo; Luna precedentă', + nextText: 'Luna următoare &raquo;', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'MarÅ£i', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js new file mode 100644 index 000000000..b8091f9ec --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js @@ -0,0 +1,23 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '&#x3c;Пред', + nextText: 'След&#x3e;', + currentText: 'СегоднÑ', + monthNames: ['Январь','Февраль','Март','Ðпрель','Май','Июнь', + 'Июль','ÐвгуÑÑ‚','СентÑбрь','ОктÑбрь','ÐоÑбрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Ðпр','Май','Июн', + 'Июл','Ðвг','Сен','Окт','ÐоÑ','Дек'], + dayNames: ['воÑкреÑенье','понедельник','вторник','Ñреда','четверг','пÑтница','Ñуббота'], + dayNamesShort: ['вÑк','пнд','втр','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ð’Ñ','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + weekHeader: 'Ðе', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js new file mode 100644 index 000000000..e8e73e671 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js @@ -0,0 +1,23 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + closeText: 'ZavrieÅ¥', + prevText: '&#x3c;Predchádzajúci', + nextText: 'Nasledujúci&#x3e;', + currentText: 'Dnes', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js new file mode 100644 index 000000000..516550192 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js @@ -0,0 +1,24 @@ +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + closeText: 'Zapri', + prevText: '&lt;Prej&#x161;nji', + nextText: 'Naslednji&gt;', + currentText: 'Trenutni', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'], + weekHeader: 'Teden', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js new file mode 100644 index 000000000..be84104c0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js @@ -0,0 +1,23 @@ +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + closeText: 'mbylle', + prevText: '&#x3c;mbrapa', + nextText: 'Përpara&#x3e;', + currentText: 'sot', + monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + weekHeader: 'Ja', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js new file mode 100644 index 000000000..8f8ea5e63 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js @@ -0,0 +1,23 @@ +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr-SR'] = { + closeText: 'Zatvori', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Danas', + monthNames: ['Januar','Februar','Mart','April','Maj','Jun', + 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','ÄŒetvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sre','ÄŒet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','ÄŒe','Pe','Su'], + weekHeader: 'Sed', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr-SR']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js new file mode 100644 index 000000000..49c9b4a30 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js @@ -0,0 +1,23 @@ +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +jQuery(function($){ + $.datepicker.regional['sr'] = { + closeText: 'Затвори', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'ДанаÑ', + monthNames: ['Јануар','Фебруар','Март','Ðприл','Мај','Јун', + 'Јул','ÐвгуÑÑ‚','Септембар','Октобар','Ðовембар','Децембар'], + monthNamesShort: ['Јан','Феб','Мар','Ðпр','Мај','Јун', + 'Јул','Ðвг','Сеп','Окт','Ðов','Дец'], + dayNames: ['Ðедеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'], + dayNamesShort: ['Ðед','Пон','Уто','Сре','Чет','Пет','Суб'], + dayNamesMin: ['Ðе','По','Ут','Ср','Че','Пе','Су'], + weekHeader: 'Сед', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sr']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js new file mode 100644 index 000000000..8236b62b5 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js @@ -0,0 +1,23 @@ +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = { + closeText: 'Stäng', + prevText: '&laquo;Förra', + nextText: 'Nästa&raquo;', + currentText: 'Idag', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNamesShort: ['Sön','MÃ¥n','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','MÃ¥ndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','MÃ¥','Ti','On','To','Fr','Lö'], + weekHeader: 'Ve', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js new file mode 100644 index 000000000..91116d387 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js @@ -0,0 +1,23 @@ +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by S A Sureshkumar (saskumar@live.com). */ +jQuery(function($){ + $.datepicker.regional['ta'] = { + closeText: 'மூடà¯', + prevText: 'à®®à¯à®©à¯à®©à¯ˆà®¯à®¤à¯', + nextText: 'அடà¯à®¤à¯à®¤à®¤à¯', + currentText: 'இனà¯à®±à¯', + monthNames: ['தை','மாசி','பஙà¯à®•à¯à®©à®¿','சிதà¯à®¤à®¿à®°à¯ˆ','வைகாசி','ஆனி', + 'ஆடி','ஆவணி','பà¯à®°à®Ÿà¯à®Ÿà®¾à®šà®¿','à®à®ªà¯à®ªà®šà®¿','காரà¯à®¤à¯à®¤à®¿à®•ை','மாரà¯à®•ழி'], + monthNamesShort: ['தை','மாசி','பஙà¯','சிதà¯','வைகா','ஆனி', + 'ஆடி','ஆவ','பà¯à®°','à®à®ªà¯','காரà¯','மாரà¯'], + dayNames: ['ஞாயிறà¯à®±à¯à®•à¯à®•ிழமை','திஙà¯à®•டà¯à®•ிழமை','செவà¯à®µà®¾à®¯à¯à®•à¯à®•ிழமை','பà¯à®¤à®©à¯à®•ிழமை','வியாழகà¯à®•ிழமை','வெளà¯à®³à®¿à®•à¯à®•ிழமை','சனிகà¯à®•ிழமை'], + dayNamesShort: ['ஞாயிறà¯','திஙà¯à®•ளà¯','செவà¯à®µà®¾à®¯à¯','பà¯à®¤à®©à¯','வியாழனà¯','வெளà¯à®³à®¿','சனி'], + dayNamesMin: ['ஞா','தி','செ','பà¯','வி','வெ','ச'], + weekHeader: 'Ðе', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ta']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-th.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-th.js new file mode 100644 index 000000000..978500ab1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-th.js @@ -0,0 +1,23 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '&laquo;&nbsp;ย้อน', + nextText: 'ถัดไป&nbsp;&raquo;', + currentText: 'วันนี้', + monthNames: ['มà¸à¸£à¸²à¸„ม','à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'à¸à¸£à¸à¸à¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'], + monthNamesShort: ['ม.ค.','à¸.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'à¸.ค.','ส.ค.','à¸.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุà¸à¸£à¹Œ','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['th']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js new file mode 100644 index 000000000..dedfc7ff9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js @@ -0,0 +1,23 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '&#x3c;geri', + nextText: 'ileri&#x3e', + currentText: 'bugün', + monthNames: ['Ocak','Åžubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','AÄŸustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Åžub','Mar','Nis','May','Haz', + 'Tem','AÄŸu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','ÇarÅŸamba','PerÅŸembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js new file mode 100644 index 000000000..112b40e7f --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js @@ -0,0 +1,23 @@ +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '&#x3c;', + nextText: '&#x3e;', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','ВереÑень','Жовтень','ЛиÑтопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','ЛиÑ','Гру'], + dayNames: ['неділÑ','понеділок','вівторок','Ñереда','четвер','п’ÑтницÑ','Ñубота'], + dayNamesShort: ['нед','пнд','вів','Ñрд','чтв','птн','Ñбт'], + dayNamesMin: ['Ðд','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'], + weekHeader: 'Ðе', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +}); \ No newline at end of file diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js new file mode 100644 index 000000000..9813a59e0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js @@ -0,0 +1,23 @@ +/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +jQuery(function($){ + $.datepicker.regional['vi'] = { + closeText: 'Äóng', + prevText: '&#x3c;Trước', + nextText: 'Tiếp&#x3e;', + currentText: 'Hôm nay', + monthNames: ['Tháng Má»™t', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mưá»i', 'Tháng Mưá»i Má»™t', 'Tháng Mưá»i Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chá»§ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['vi']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js new file mode 100644 index 000000000..6c4883f53 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '&#x3c;上月', + nextText: '下月&#x3e;', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js new file mode 100644 index 000000000..06c4c628c --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by SCCY (samuelcychan@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-HK'] = { + closeText: '關閉', + prevText: '&#x3c;上月', + nextText: '下月&#x3e;', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'dd-mm-yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-HK']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js new file mode 100644 index 000000000..d211573c6 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '&#x3c;上月', + nextText: '下月&#x3e;', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','乿œˆ','åæœˆ','å一月','å二月'], + monthNamesShort: ['一','二','三','å››','五','å…­', + '七','å…«','ä¹','å','å一','å二'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['æ—¥','一','二','三','å››','五','å…­'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: 'å¹´'}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/fannie/src/jquery/development-bundle/ui/jquery-ui-1.8.1.custom.js b/fannie/src/jquery/development-bundle/ui/jquery-ui-1.8.1.custom.js new file mode 100644 index 000000000..748776a8b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery-ui-1.8.1.custom.js @@ -0,0 +1,10971 @@ +/*! + * jQuery UI 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +;jQuery.ui || (function($) { + +//Helper functions and ui object +$.ui = { + version: "1.8.1", + + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set || !instance.element[0].parentNode) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + + contains: function(a, b) { + return document.compareDocumentPosition + ? a.compareDocumentPosition(b) & 16 + : a !== b && a.contains(b); + }, + + hasScroll: function(el, a) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ($(el).css('overflow') == 'hidden') { return false; } + + var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop', + has = false; + + if (el[scroll] > 0) { return true; } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[scroll] = 1; + has = (el[scroll] > 0); + el[scroll] = 0; + return has; + }, + + isOverAxis: function(x, reference, size) { + //Determines when x coordinate is over "b" element axis + return (x > reference) && (x < (reference + size)); + }, + + isOver: function(y, x, top, left, height, width) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width); + }, + + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38 + } +}; + +//jQuery plugins +$.fn.extend({ + _focus: $.fn.focus, + focus: function(delay, fn) { + return typeof delay === 'number' + ? this.each(function() { + var elem = this; + setTimeout(function() { + $(elem).focus(); + (fn && fn.call(elem)); + }, delay); + }) + : this._focus.apply(this, arguments); + }, + + enableSelection: function() { + return this + .attr('unselectable', 'off') + .css('MozUserSelect', ''); + }, + + disableSelection: function() { + return this + .attr('unselectable', 'on') + .css('MozUserSelect', 'none'); + }, + + scrollParent: function() { + var scrollParent; + if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function(zIndex) { + if (zIndex !== undefined) { + return this.css('zIndex', zIndex); + } + + if (this.length) { + var elem = $(this[0]), position, value; + while (elem.length && elem[0] !== document) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css('position'); + if (position == 'absolute' || position == 'relative' || position == 'fixed') + { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt(elem.css('zIndex')); + if (!isNaN(value) && value != 0) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + } +}); + + +//Additional selectors +$.extend($.expr[':'], { + data: function(elem, i, match) { + return !!$.data(elem, match[3]); + }, + + focusable: function(element) { + var nodeName = element.nodeName.toLowerCase(), + tabIndex = $.attr(element, 'tabindex'); + return (/input|select|textarea|button|object/.test(nodeName) + ? !element.disabled + : 'a' == nodeName || 'area' == nodeName + ? element.href || !isNaN(tabIndex) + : !isNaN(tabIndex)) + // the element and all of its ancestors must be visible + // the browser may report that the area is hidden + && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length; + }, + + tabbable: function(element) { + var tabIndex = $.attr(element, 'tabindex'); + return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable'); + } +}); + +})(jQuery); +/*! + * jQuery UI Widget 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Widget + */ +(function( $ ) { + +var _remove = $.fn.remove; + +$.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( this ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); +}; + +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); + + $.widget.bridge( name, $[ namespace ][ name ] ); +}; + +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.substring( 0, 1 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ), + methodValue = instance && $.isFunction( instance[options] ) ? + instance[ options ].apply( instance, args ) : + instance; + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + if ( options ) { + instance.option( options ); + } + instance._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + this.element = $( element ).data( this.widgetName, this ); + this.options = $.extend( true, {}, + this.options, + $.metadata && $.metadata.get( element )[ this.widgetName ], + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._init(); + }, + _create: function() {}, + _init: function() {}, + + destroy: function() { + this.element + .unbind( "." + this.widgetName ) + .removeData( this.widgetName ); + this.widget() + .unbind( "." + this.widgetName ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetBaseClass + "-disabled " + + "ui-state-disabled" ); + }, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + self = this; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, self.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return self; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var callback = this.options[ type ]; + + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + data = data || {}; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( event.originalEvent ) { + for ( var i = $.event.props.length, prop; i; ) { + prop = $.event.props[ --i ]; + event[ prop ] = event.originalEvent[ prop ]; + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; + +})( jQuery ); +/*! + * jQuery UI Mouse 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.mouse", { + options: { + cancel: ':input,option', + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var self = this; + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if(self._preventClickEvent) { + self._preventClickEvent = false; + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + // TODO: figure out why we have to use originalEvent + event.originalEvent = event.originalEvent || {}; + if (event.originalEvent.mouseHandled) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var self = this, + btnIsLeft = (event.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + // preventDefault() is used to prevent the selection of text here - + // however, in Safari, this causes select boxes not to be selectable + // anymore, so this fix is needed + ($.browser.safari || event.preventDefault()); + + event.originalEvent.mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + this._preventClickEvent = (event.target == this._mouseDownEvent.target); + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } +}); + +})(jQuery); +/* + * jQuery UI Position 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Position + */ +(function( $ ) { + +$.ui = $.ui || {}; + +var horizontalPositions = /left|center|right/, + horizontalDefault = "center", + verticalPositions = /top|center|bottom/, + verticalDefault = "center", + _position = $.fn.position, + _offset = $.fn.offset; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var target = $( options.of ), + collision = ( options.collision || "flip" ).split( " " ), + offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ], + targetWidth, + targetHeight, + basePosition; + + if ( options.of.nodeType === 9 ) { + targetWidth = target.width(); + targetHeight = target.height(); + basePosition = { top: 0, left: 0 }; + } else if ( options.of.scrollTo && options.of.document ) { + targetWidth = target.width(); + targetHeight = target.height(); + basePosition = { top: target.scrollTop(), left: target.scrollLeft() }; + } else if ( options.of.preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + targetWidth = targetHeight = 0; + basePosition = { top: options.of.pageY, left: options.of.pageX }; + } else { + targetWidth = target.outerWidth(); + targetHeight = target.outerHeight(); + basePosition = target.offset(); + } + + // force my and at to have valid horizontal and veritcal positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[this] || "" ).split( " " ); + if ( pos.length === 1) { + pos = horizontalPositions.test( pos[0] ) ? + pos.concat( [verticalDefault] ) : + verticalPositions.test( pos[0] ) ? + [ horizontalDefault ].concat( pos ) : + [ horizontalDefault, verticalDefault ]; + } + pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : horizontalDefault; + pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : verticalDefault; + options[ this ] = pos; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + // normalize offset option + offset[ 0 ] = parseInt( offset[0], 10 ) || 0; + if ( offset.length === 1 ) { + offset[ 1 ] = offset[ 0 ]; + } + offset[ 1 ] = parseInt( offset[1], 10 ) || 0; + + if ( options.at[0] === "right" ) { + basePosition.left += targetWidth; + } else if (options.at[0] === horizontalDefault ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[1] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[1] === verticalDefault ) { + basePosition.top += targetHeight / 2; + } + + basePosition.left += offset[ 0 ]; + basePosition.top += offset[ 1 ]; + + return this.each(function() { + var elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + position = $.extend( {}, basePosition ); + + if ( options.my[0] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[0] === horizontalDefault ) { + position.left -= elemWidth / 2; + } + + if ( options.my[1] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[1] === verticalDefault ) { + position.top -= elemHeight / 2; + } + + // prevent fractions (see #5280) + position.left = parseInt( position.left ); + position.top = parseInt( position.top ); + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[i] ] ) { + $.ui.position[ collision[i] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + offset: offset, + my: options.my, + at: options.at + }); + } + }); + + if ( $.fn.bgiframe ) { + elem.bgiframe(); + } + elem.offset( $.extend( position, { using: options.using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var win = $( window ), + over = position.left + data.elemWidth - win.width() - win.scrollLeft(); + position.left = over > 0 ? position.left - over : Math.max( 0, position.left ); + }, + top: function( position, data ) { + var win = $( window ), + over = position.top + data.elemHeight - win.height() - win.scrollTop(); + position.top = over > 0 ? position.top - over : Math.max( 0, position.top ); + } + }, + + flip: { + left: function( position, data ) { + if ( data.at[0] === "center" ) { + return; + } + var win = $( window ), + over = position.left + data.elemWidth - win.width() - win.scrollLeft(), + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + offset = -2 * data.offset[ 0 ]; + position.left += position.left < 0 ? + myOffset + data.targetWidth + offset : + over > 0 ? + myOffset - data.targetWidth + offset : + 0; + }, + top: function( position, data ) { + if ( data.at[1] === "center" ) { + return; + } + var win = $( window ), + over = position.top + data.elemHeight - win.height() - win.scrollTop(), + myOffset = data.my[ 1 ] === "top" ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + -data.targetHeight, + offset = -2 * data.offset[ 1 ]; + position.top += position.top < 0 ? + myOffset + data.targetHeight + offset : + over > 0 ? + myOffset + atOffset + offset : + 0; + } + } +}; + +// offset setter from jQuery 1.4 +if ( !$.offset.setOffset ) { + $.offset.setOffset = function( elem, options ) { + // set position first, in-case top/left are set even on static elem + if ( /static/.test( $.curCSS( elem, "position" ) ) ) { + elem.style.position = "relative"; + } + var curElem = $( elem ), + curOffset = curElem.offset(), + curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0, + curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0, + props = { + top: (options.top - curOffset.top) + curTop, + left: (options.left - curOffset.left) + curLeft + }; + + if ( 'using' in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + }; + + $.fn.offset = function( options ) { + var elem = this[ 0 ]; + if ( !elem || !elem.ownerDocument ) { return null; } + if ( options ) { + return this.each(function() { + $.offset.setOffset( this, options ); + }); + } + return _offset.call( this ); + }; +} + +}( jQuery )); +/* + * jQuery UI Draggable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.draggable", $.ui.mouse, { + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false + }, + _create: function() { + + if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position"))) + this.element[0].style.position = 'relative'; + + (this.options.addClasses && this.element.addClass("ui-draggable")); + (this.options.disabled && this.element.addClass("ui-draggable-disabled")); + + this._mouseInit(); + + }, + + destroy: function() { + if(!this.element.data('draggable')) return; + this.element + .removeData("draggable") + .unbind(".draggable") + .removeClass("ui-draggable" + + " ui-draggable-dragging" + + " ui-draggable-disabled"); + this._mouseDestroy(); + + return this; + }, + + _mouseCapture: function(event) { + + var o = this.options; + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle')) + return false; + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) + return false; + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css("position"); + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.positionAbs = this.element.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this.position = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + //Trigger event + callbacks + if(this._trigger("start", event) === false) { + this._clear(); + return false; + } + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.helper.addClass("ui-draggable-dragging"); + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + }, + + _mouseDrag: function(event, noPropagation) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + if(this._trigger('drag', event, ui) === false) { + this._mouseUp({}); + return false; + } + this.position = ui.position; + } + + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) + dropped = $.ui.ddmanager.drop(this, event); + + //if a drop comes from outside (a sortable) + if(this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + //if the original element is removed, don't bother to continue + if(!this.element[0] || !this.element[0].parentNode) + return false; + + if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + var self = this; + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + if(self._trigger("stop", event) !== false) { + self._clear(); + } + }); + } else { + if(this._trigger("stop", event) !== false) { + this._clear(); + } + } + + return false; + }, + + cancel: function() { + + if(this.helper.is(".ui-draggable-dragging")) { + this._mouseUp({}); + } else { + this._clear(); + } + + return this; + + }, + + _getHandle: function(event) { + + var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; + $(this.options.handle, this.element) + .find("*") + .andSelf() + .each(function() { + if(this == event.target) handle = true; + }); + + return handle; + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element); + + if(!helper.parents('body').length) + helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); + + if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) + helper.css("position", "absolute"); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj == 'string') { + obj = obj.split(' '); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.element.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) { + var ce = $(o.containment)[0]; if(!ce) return; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } else if(o.containment.constructor == Array) { + this.containment = o.containment; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove(); + //if($.ui.ddmanager) $.ui.ddmanager.current = null; + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function(type, event, ui) { + ui = ui || this._uiHash(); + $.ui.plugin.call(this, type, [event, ui]); + if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins + return $.Widget.prototype._trigger.call(this, type, event, ui); + }, + + plugins: {}, + + _uiHash: function(event) { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + }; + } + +}); + +$.extend($.ui.draggable, { + version: "1.8.1" +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options, + uiSortable = $.extend({}, ui, { item: inst.element }); + inst.sortables = []; + $(o.connectToSortable).each(function() { + var sortable = $.data(this, 'sortable'); + if (sortable && !sortable.options.disabled) { + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache + sortable._trigger("activate", event, uiSortable); + } + }); + + }, + stop: function(event, ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("draggable"), + uiSortable = $.extend({}, ui, { item: inst.element }); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + + this.instance.isOver = 0; + + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + + //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid' + if(this.shouldRevert) this.instance.options.revert = true; + + //Trigger the stop of the sortable + this.instance._mouseStop(event); + + this.instance.options.helper = this.instance.options._helper; + + //If the helper has been the original item, restore properties in the sortable + if(inst.options.helper == 'original') + this.instance.currentItem.css({ top: 'auto', left: 'auto' }); + + } else { + this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance + this.instance._trigger("deactivate", event, uiSortable); + } + + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), self = this; + + var checkPos = function(o) { + var dyClick = this.offset.click.top, dxClick = this.offset.click.left; + var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left; + var itemHeight = o.height, itemWidth = o.width; + var itemTop = o.top, itemLeft = o.left; + + return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth); + }; + + $.each(inst.sortables, function(i) { + + //Copy over some variables to allow calling the sortable's native _intersectsWith + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + + if(this.instance._intersectsWith(this.instance.containerCache)) { + + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + + this.instance.isOver = 1; + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + event.target = this.instance.currentItem[0]; + this.instance._mouseCapture(event, true); + this.instance._mouseStart(event, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst._trigger("toSortable", event); + inst.dropped = this.instance.element; //draggable revert needs that + //hack so receive/update callbacks work (mostly) + inst.currentItem = inst.element; + this.instance.fromOutside = inst; + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) this.instance._mouseDrag(event); + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + + //Prevent reverting on this forced stop + this.instance.options.revert = false; + + // The out event needs to be triggered independently + this.instance._trigger('out', event, this.instance._uiHash(this.instance)); + + this.instance._mouseStop(event, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) this.instance.placeholder.remove(); + + inst._trigger("fromSortable", event); + inst.dropped = false; //draggable revert needs that + } + + }; + + }); + + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function(event, ui) { + var t = $('body'), o = $(this).data('draggable').options; + if (t.css("cursor")) o._cursor = t.css("cursor"); + t.css("cursor", o.cursor); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if (o._cursor) $('body').css("cursor", o._cursor); + } +}); + +$.ui.plugin.add("draggable", "iframeFix", { + start: function(event, ui) { + var o = $(this).data('draggable').options; + $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { + $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>') + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + }, + stop: function(event, ui) { + $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data('draggable').options; + if(t.css("opacity")) o._opacity = t.css("opacity"); + t.css('opacity', o.opacity); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if(o._opacity) $(ui.helper).css('opacity', o._opacity); + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function(event, ui) { + var i = $(this).data("draggable"); + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset(); + }, + drag: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options, scrolled = false; + + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') { + + if(!o.axis || o.axis != 'x') { + if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; + } + + if(!o.axis || o.axis != 'y') { + if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; + } + + } else { + + if(!o.axis || o.axis != 'x') { + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(!o.axis || o.axis != 'y') { + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(i, event); + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options; + i.snapElements = []; + + $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() { + var $t = $(this); var $o = $t.offset(); + if(this != i.element[0]) i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options; + var d = o.snapTolerance; + + var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; + + for (var i = inst.snapElements.length - 1; i >= 0; i--){ + + var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, + t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; + + //Yes, I know, this is insane ;) + if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) { + if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = false; + continue; + } + + if(o.snapMode != 'inner') { + var ts = Math.abs(t - y2) <= d; + var bs = Math.abs(b - y1) <= d; + var ls = Math.abs(l - x2) <= d; + var rs = Math.abs(r - x1) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; + } + + var first = (ts || bs || ls || rs); + + if(o.snapMode != 'outer') { + var ts = Math.abs(t - y1) <= d; + var bs = Math.abs(b - y2) <= d; + var ls = Math.abs(l - x1) <= d; + var rs = Math.abs(r - x2) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; + } + + if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + }; + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function(event, ui) { + + var o = $(this).data("draggable").options; + + var group = $.makeArray($(o.stack)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0); + }); + if (!group.length) { return; } + + var min = parseInt(group[0].style.zIndex) || 0; + $(group).each(function(i) { + this.style.zIndex = min + i; + }); + + this[0].style.zIndex = min + group.length; + + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("draggable").options; + if(t.css("zIndex")) o._zIndex = t.css("zIndex"); + t.css('zIndex', o.zIndex); + }, + stop: function(event, ui) { + var o = $(this).data("draggable").options; + if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex); + } +}); + +})(jQuery); +/* + * jQuery UI Droppable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.mouse.js + * jquery.ui.draggable.js + */ +(function($) { + +$.widget("ui.droppable", { + widgetEventPrefix: "drop", + options: { + accept: '*', + activeClass: false, + addClasses: true, + greedy: false, + hoverClass: false, + scope: 'default', + tolerance: 'intersect' + }, + _create: function() { + + var o = this.options, accept = o.accept; + this.isover = 0; this.isout = 1; + + this.accept = $.isFunction(accept) ? accept : function(d) { + return d.is(accept); + }; + + //Store the droppable's proportions + this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || []; + $.ui.ddmanager.droppables[o.scope].push(this); + + (o.addClasses && this.element.addClass("ui-droppable")); + + }, + + destroy: function() { + var drop = $.ui.ddmanager.droppables[this.options.scope]; + for ( var i = 0; i < drop.length; i++ ) + if ( drop[i] == this ) + drop.splice(i, 1); + + this.element + .removeClass("ui-droppable ui-droppable-disabled") + .removeData("droppable") + .unbind(".droppable"); + + return this; + }, + + _setOption: function(key, value) { + + if(key == 'accept') { + this.accept = $.isFunction(value) ? value : function(d) { + return d.is(value); + }; + } + $.Widget.prototype._setOption.apply(this, arguments); + }, + + _activate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) this.element.addClass(this.options.activeClass); + (draggable && this._trigger('activate', event, this.ui(draggable))); + }, + + _deactivate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) this.element.removeClass(this.options.activeClass); + (draggable && this._trigger('deactivate', event, this.ui(draggable))); + }, + + _over: function(event) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) this.element.addClass(this.options.hoverClass); + this._trigger('over', event, this.ui(draggable)); + } + + }, + + _out: function(event) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass); + this._trigger('out', event, this.ui(draggable)); + } + + }, + + _drop: function(event,custom) { + + var draggable = custom || $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element + + var childrenIntersection = false; + this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, 'droppable'); + if( + inst.options.greedy + && !inst.options.disabled + && inst.options.scope == draggable.options.scope + && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) + && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance) + ) { childrenIntersection = true; return false; } + }); + if(childrenIntersection) return false; + + if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.activeClass) this.element.removeClass(this.options.activeClass); + if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass); + this._trigger('drop', event, this.ui(draggable)); + return this.element; + } + + return false; + + }, + + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + offset: c.positionAbs + }; + } + +}); + +$.extend($.ui.droppable, { + version: "1.8.1" +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) return false; + + var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, + y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height; + var l = droppable.offset.left, r = l + droppable.proportions.width, + t = droppable.offset.top, b = t + droppable.proportions.height; + + switch (toleranceMode) { + case 'fit': + return (l < x1 && x2 < r + && t < y1 && y2 < b); + break; + case 'intersect': + return (l < x1 + (draggable.helperProportions.width / 2) // Right Half + && x2 - (draggable.helperProportions.width / 2) < r // Left Half + && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half + && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + break; + case 'pointer': + var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left), + draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top), + isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width); + return isOver; + break; + case 'touch': + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + break; + default: + return false; + break; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: { 'default': [] }, + prepareOffsets: function(t, event) { + + var m = $.ui.ddmanager.droppables[t.options.scope] || []; + var type = event ? event.type : null; // workaround for #2317 + var list = (t.currentItem || t.element).find(":data(droppable)").andSelf(); + + droppablesLoop: for (var i = 0; i < m.length; i++) { + + if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted + for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item + m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue + + m[i].offset = m[i].element.offset(); + m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; + + if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables + + } + + }, + drop: function(draggable, event) { + + var dropped = false; + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(!this.options) return; + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) + dropped = dropped || this._drop.call(this, event); + + if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + this.isout = 1; this.isover = 0; + this._deactivate.call(this, event); + } + + }); + return dropped; + + }, + drag: function(draggable, event) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event); + + //Run through all droppables and check their positions based on specific tolerance options + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(this.options.disabled || this.greedyChild || !this.visible) return; + var intersects = $.ui.intersect(draggable, this, this.options.tolerance); + + var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null); + if(!c) return; + + var parentInstance; + if (this.options.greedy) { + var parent = this.element.parents(':data(droppable):eq(0)'); + if (parent.length) { + parentInstance = $.data(parent[0], 'droppable'); + parentInstance.greedyChild = (c == 'isover' ? 1 : 0); + } + } + + // we just moved into a greedy child + if (parentInstance && c == 'isover') { + parentInstance['isover'] = 0; + parentInstance['isout'] = 1; + parentInstance._out.call(parentInstance, event); + } + + this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0; + this[c == "isover" ? "_over" : "_out"].call(this, event); + + // we just moved out of a greedy child + if (parentInstance && c == 'isout') { + parentInstance['isout'] = 0; + parentInstance['isover'] = 1; + parentInstance._over.call(parentInstance, event); + } + }); + + } +}; + +})(jQuery); +/* + * jQuery UI Resizable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.resizable", $.ui.mouse, { + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 1000 + }, + _create: function() { + + var self = this, o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Opera fix for relative positioning + if (/relative/.test(this.element.css('position')) && $.browser.opera) + this.element.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({ + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left') + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent().data( + "resizable", this.element.data('resizable') + ); + + this.elementIsWrapper = true; + + //Move margins to the wrapper + this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") }); + this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css('resize'); + this.originalElement.css('resize', 'none'); + + //Push the actual element to our proportionallyResize internal array + this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }); + if(this.handles.constructor == String) { + + if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw'; + var n = this.handles.split(","); this.handles = {}; + + for(var i = 0; i < n.length; i++) { + + var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle; + var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>'); + + // increase zIndex of sw, se, ne, nw axis + //TODO : this modifies original option + if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex }); + + //TODO : What's going on here? + if ('se' == handle) { + axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se'); + }; + + //Insert into internal handles object and append to element + this.handles[handle] = '.ui-resizable-'+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + target = target || this.element; + + for(var i in this.handles) { + + if(this.handles[i].constructor == String) + this.handles[i] = $(this.handles[i], this.element).show(); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(this.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) + continue; + + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $('.ui-resizable-handle', this.element) + .disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!self.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .hover(function() { + $(this).removeClass("ui-resizable-autohide"); + self._handles.show(); + }, + function(){ + if (!self.resizing) { + $(this).addClass("ui-resizable-autohide"); + self._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + destroy: function() { + + this._mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + var wrapper = this.element; + wrapper.after( + this.originalElement.css({ + position: wrapper.css('position'), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css('top'), + left: wrapper.css('left') + }) + ).remove(); + } + + this.originalElement.css('resize', this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var handle = false; + for (var i in this.handles) { + if ($(this.handles[i])[0] == event.target) { + handle = true; + } + } + + return !this.options.disabled && handle; + }, + + _mouseStart: function(event) { + + var o = this.options, iniPos = this.element.position(), el = this.element; + + this.resizing = true; + this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix for http://dev.jquery.com/ticket/1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left }); + } + + //Opera fixing relative position + if ($.browser.opera && (/relative/).test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + var cursor = $('.ui-resizable-' + this.axis).css('cursor'); + $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (this._aspectRatio || event.shiftKey) + data = this._updateRatio(data, event); + + data = this._respectSize(data, event); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!this._helper && this._proportionallyResizeElements.length) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this._trigger('resize', event, this.ui()); + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var o = this.options, self = this; + + if(this._helper) { + var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + self.helper.height(self.size.height); + self.helper.width(self.size.width); + + if (this._helper && !o.animate) this._proportionallyResize(); + } + + $('body').css('cursor', 'auto'); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) this.helper.remove(); + return false; + + }, + + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (isNumber(data.left)) this.position.left = data.left; + if (isNumber(data.top)) this.position.top = data.top; + if (isNumber(data.height)) this.size.height = data.height; + if (isNumber(data.width)) this.size.width = data.width; + }, + + _updateRatio: function(data, event) { + + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height * this.aspectRatio); + else if (data.width) data.height = (csize.width / this.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function(data, event) { + + var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height); + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + + _proportionallyResize: function() { + + var o = this.options; + if (!this._proportionallyResizeElements.length) return; + var element = this.helper || this.element; + + for (var i=0; i < this._proportionallyResizeElements.length; i++) { + + var prel = this._proportionallyResizeElements[i]; + + if (!this.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + this.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + + if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length))) + continue; + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + }; + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $('<div style="overflow:hidden;"></div>'); + + // fix ie6 offset TODO: This seems broken + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() + pxyoffset, + height: this.element.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n != "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +}); + +$.extend($.ui.resizable, { + version: "1.8.1" +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options; + + var _store = function(exp) { + $(exp).each(function() { + $(this).data("resizable-alsoresize", { + width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), + left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function(exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; + + $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + + //Opera fixing relative position + if (/relative/.test(el.css('position')) && $.browser.opera) { + self._revertToRelativePosition = true; + el.css({ position: 'absolute', top: 'auto', left: 'auto' }); + } + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"); + + //Opera fixing relative position + if (self._revertToRelativePosition && $.browser.opera) { + self._revertToRelativePosition = false; + el.css({ position: 'relative' }); + } + + $(this).removeData("resizable-alsoresize-start"); + } +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + var element = $(ce), p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + self.containerOffset = element.offset(); + self.containerPosition = element.position(); + self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; + + if (cp.left < (self._helper ? co.left : 0)) { + self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + self.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (self._helper ? co.top : 0)) { + self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + self.position.top = self._helper ? co.top : 0; + } + + self.offset.left = self.parentData.left+self.position.left; + self.offset.top = self.parentData.top+self.position.top; + + var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), + hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + + var isParent = self.containerElement.get(0) == self.element.parent().get(0), + isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position')); + + if(isParent && isOffsetRelative) woset -= self.parentData.left; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width / self.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height * self.aspectRatio; + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + + if (self._helper && !o.animate && (/relative/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + if (self._helper && !o.animate && (/static/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options, cs = self.size; + + self.ghost = self.originalElement.clone(); + self.ghost + .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass('ui-resizable-ghost') + .addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +var num = function(v) { + return parseInt(v, 10) || 0; +}; + +var isNumber = function(value) { + return !isNaN(parseInt(value, 10)); +}; + +})(jQuery); +/* + * jQuery UI Selectable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.selectable", $.ui.mouse, { + options: { + appendTo: 'body', + autoRefresh: true, + distance: 0, + filter: '*', + tolerance: 'touch' + }, + _create: function() { + var self = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + var selectees; + this.refresh = function() { + selectees = $(self.options.filter, self.element[0]); + selectees.each(function() { + var $this = $(this); + var pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass('ui-selected'), + selecting: $this.hasClass('ui-selecting'), + unselecting: $this.hasClass('ui-unselecting') + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this._mouseInit(); + + this.helper = $(document.createElement('div')) + .css({border:'1px dotted black'}) + .addClass("ui-selectable-helper"); + }, + + destroy: function() { + this.selectees + .removeClass("ui-selectee") + .removeData("selectable-item"); + this.element + .removeClass("ui-selectable ui-selectable-disabled") + .removeData("selectable") + .unbind(".selectable"); + this._mouseDestroy(); + + return this; + }, + + _mouseStart: function(event) { + var self = this; + + this.opos = [event.pageX, event.pageY]; + + if (this.options.disabled) + return; + + var options = this.options; + + this.selectees = $(options.filter, this.element[0]); + + this._trigger("start", event); + + $(options.appendTo).append(this.helper); + // position helper (lasso) + this.helper.css({ + "z-index": 100, + "position": "absolute", + "left": event.clientX, + "top": event.clientY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter('.ui-selected').each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!event.metaKey) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + }); + + $(event.target).parents().andSelf().each(function() { + var selectee = $.data(this, "selectable-item"); + if (selectee) { + selectee.$element.removeClass("ui-unselecting").addClass('ui-selecting'); + selectee.unselecting = false; + selectee.selecting = true; + selectee.selected = true; + // selectable SELECTING callback + self._trigger("selecting", event, { + selecting: selectee.element + }); + return false; + } + }); + + }, + + _mouseDrag: function(event) { + var self = this; + this.dragged = true; + + if (this.options.disabled) + return; + + var options = this.options; + + var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY; + if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"); + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element == self.element[0]) + return; + var hit = false; + if (options.tolerance == 'touch') { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance == 'fit') { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass('ui-selecting'); + selectee.selecting = true; + // selectable SELECTING callback + self._trigger("selecting", event, { + selecting: selectee.element + }); + } + } else { + // UNSELECT + if (selectee.selecting) { + if (event.metaKey && selectee.startselected) { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + selectee.$element.addClass('ui-selected'); + selectee.selected = true; + } else { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + if (selectee.selected) { + if (!event.metaKey && !selectee.startselected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + } + }); + + return false; + }, + + _mouseStop: function(event) { + var self = this; + + this.dragged = false; + + var options = this.options; + + $('.ui-unselecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + selectee.startselected = false; + self._trigger("unselected", event, { + unselected: selectee.element + }); + }); + $('.ui-selecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-selecting').addClass('ui-selected'); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + self._trigger("selected", event, { + selected: selectee.element + }); + }); + this._trigger("stop", event); + + this.helper.remove(); + + return false; + } + +}); + +$.extend($.ui.selectable, { + version: "1.8.1" +}); + +})(jQuery); +/* + * jQuery UI Sortable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.sortable", $.ui.mouse, { + widgetEventPrefix: "sort", + options: { + appendTo: "parent", + axis: false, + connectWith: false, + containment: false, + cursor: 'auto', + cursorAt: false, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: '> *', + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000 + }, + _create: function() { + + var o = this.options; + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine if the items are floating + this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false; + + //Let's determine the parent's offset + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this._mouseInit(); + + }, + + destroy: function() { + this.element + .removeClass("ui-sortable ui-sortable-disabled") + .removeData("sortable") + .unbind(".sortable"); + this._mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) + this.items[i].item.removeData("sortable-item"); + + return this; + }, + + _setOption: function(key, value){ + if ( key === "disabled" ) { + this.options[ key ] = value; + + this.widget() + [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" ); + } else { + // Don't call widget base _setOption for disable as it adds ui-state-disabled class + $.Widget.prototype._setOption.apply(self, arguments); + } + }, + + _mouseCapture: function(event, overrideHandle) { + + if (this.reverting) { + return false; + } + + if(this.options.disabled || this.options.type == 'static') return false; + + //We have to refresh the items data once first + this._refreshItems(event); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + var currentItem = null, self = this, nodes = $(event.target).parents().each(function() { + if($.data(this, 'sortable-item') == self) { + currentItem = $(this); + return false; + } + }); + if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target); + + if(!currentItem) return false; + if(this.options.handle && !overrideHandle) { + var validHandle = false; + + $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; }); + if(!validHandle) return false; + } + + this.currentItem = currentItem; + this._removeCurrentsFromItems(); + return true; + + }, + + _mouseStart: function(event, overrideHandle, noActivation) { + + var o = this.options, self = this; + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Get the next scrolling parent + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.currentItem.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css("position", "absolute"); + this.cssPosition = this.helper.css("position"); + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Cache the former DOM position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; + + //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way + if(this.helper[0] != this.currentItem[0]) { + this.currentItem.hide(); + } + + //Create the placeholder + this._createPlaceholder(); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + if(o.cursor) { // cursor option + if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor"); + $('body').css("cursor", o.cursor); + } + + if(o.opacity) { // opacity option + if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity"); + this.helper.css("opacity", o.opacity); + } + + if(o.zIndex) { // zIndex option + if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex"); + this.helper.css("zIndex", o.zIndex); + } + + //Prepare scrolling + if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') + this.overflowOffset = this.scrollParent.offset(); + + //Call callbacks + this._trigger("start", event, this._uiHash()); + + //Recache the helper size + if(!this._preserveHelperProportions) + this._cacheHelperProportions(); + + + //Post 'activate' events to possible containers + if(!noActivation) { + for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); } + } + + //Prepare possible droppables + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.dragging = true; + + this.helper.addClass("ui-sortable-helper"); + this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + }, + + _mouseDrag: function(event) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + if (!this.lastPositionAbs) { + this.lastPositionAbs = this.positionAbs; + } + + //Do scrolling + if(this.options.scroll) { + var o = this.options, scrolled = false; + if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') { + + if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; + + if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; + + } else { + + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + } + + //Regenerate the absolute position used for position checks + this.positionAbs = this._convertPositionTo("absolute"); + + //Set the helper position + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + + //Rearrange + for (var i = this.items.length - 1; i >= 0; i--) { + + //Cache variables and intersection, continue if no intersection + var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item); + if (!intersection) continue; + + if(itemElement != this.currentItem[0] //cannot intersect with itself + && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before + && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked + && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true) + //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container + ) { + + this.direction = intersection == 1 ? "down" : "up"; + + if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) { + this._rearrange(event, item); + } else { + break; + } + + this._trigger("change", event, this._uiHash()); + break; + } + } + + //Post events to containers + this._contactContainers(event); + + //Interconnect with droppables + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + //Call callbacks + this._trigger('sort', event, this._uiHash()); + + this.lastPositionAbs = this.positionAbs; + return false; + + }, + + _mouseStop: function(event, noPropagation) { + + if(!event) return; + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) + $.ui.ddmanager.drop(this, event); + + if(this.options.revert) { + var self = this; + var cur = self.placeholder.offset(); + + self.reverting = true; + + $(this.helper).animate({ + left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), + top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) + }, parseInt(this.options.revert, 10) || 500, function() { + self._clear(event); + }); + } else { + this._clear(event, noPropagation); + } + + return false; + + }, + + cancel: function() { + + var self = this; + + if(this.dragging) { + + this._mouseUp(); + + if(this.options.helper == "original") + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + else + this.currentItem.show(); + + //Post deactivating events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i]._trigger("deactivate", null, self._uiHash(this)); + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", null, self._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove(); + + $.extend(this, { + helper: null, + dragging: false, + reverting: false, + _noFinalSort: null + }); + + if(this.domPosition.prev) { + $(this.domPosition.prev).after(this.currentItem); + } else { + $(this.domPosition.parent).prepend(this.currentItem); + } + + return this; + + }, + + serialize: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected); + var str = []; o = o || {}; + + $(items).each(function() { + var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/)); + if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2])); + }); + + return str.join('&'); + + }, + + toArray: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected); + var ret = []; o = o || {}; + + items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); }); + return ret; + + }, + + /* Be careful with the following core functions */ + _intersectsWith: function(item) { + + var x1 = this.positionAbs.left, + x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, + y2 = y1 + this.helperProportions.height; + + var l = item.left, + r = l + item.width, + t = item.top, + b = t + item.height; + + var dyClick = this.offset.click.top, + dxClick = this.offset.click.left; + + var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r; + + if( this.options.tolerance == "pointer" + || this.options.forcePointerForContainers + || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height']) + ) { + return isOverElement; + } else { + + return (l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + }, + + _intersectsWithPointer: function(item) { + + var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), + isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), + isOverElement = isOverElementHeight && isOverElementWidth, + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (!isOverElement) + return false; + + return this.floating ? + ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 ) + : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) ); + + }, + + _intersectsWithSides: function(item) { + + var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), + isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (this.floating && horizontalDirection) { + return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf)); + } else { + return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf)); + } + + }, + + _getDragVerticalDirection: function() { + var delta = this.positionAbs.top - this.lastPositionAbs.top; + return delta != 0 && (delta > 0 ? "down" : "up"); + }, + + _getDragHorizontalDirection: function() { + var delta = this.positionAbs.left - this.lastPositionAbs.left; + return delta != 0 && (delta > 0 ? "right" : "left"); + }, + + refresh: function(event) { + this._refreshItems(event); + this.refreshPositions(); + return this; + }, + + _connectWith: function() { + var options = this.options; + return options.connectWith.constructor == String + ? [options.connectWith] + : options.connectWith; + }, + + _getItemsAsjQuery: function(connected) { + + var self = this; + var items = []; + var queries = []; + var connectWith = this._connectWith(); + + if(connectWith && connected) { + for (var i = connectWith.length - 1; i >= 0; i--){ + var cur = $(connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && inst != this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]); + } + }; + }; + } + + queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]); + + for (var i = queries.length - 1; i >= 0; i--){ + queries[i][0].each(function() { + items.push(this); + }); + }; + + return $(items); + + }, + + _removeCurrentsFromItems: function() { + + var list = this.currentItem.find(":data(sortable-item)"); + + for (var i=0; i < this.items.length; i++) { + + for (var j=0; j < list.length; j++) { + if(list[j] == this.items[i].item[0]) + this.items.splice(i,1); + }; + + }; + + }, + + _refreshItems: function(event) { + + this.items = []; + this.containers = [this]; + var items = this.items; + var self = this; + var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]]; + var connectWith = this._connectWith(); + + if(connectWith) { + for (var i = connectWith.length - 1; i >= 0; i--){ + var cur = $(connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && inst != this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + }; + }; + } + + for (var i = queries.length - 1; i >= 0; i--) { + var targetData = queries[i][1]; + var _queries = queries[i][0]; + + for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) { + var item = $(_queries[j]); + + item.data('sortable-item', targetData); // Data for target checking (mouse manager) + + items.push({ + item: item, + instance: targetData, + width: 0, height: 0, + left: 0, top: 0 + }); + }; + }; + + }, + + refreshPositions: function(fast) { + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent && this.helper) { + this.offset.parent = this._getParentOffset(); + } + + for (var i = this.items.length - 1; i >= 0; i--){ + var item = this.items[i]; + + var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; + + if (!fast) { + item.width = t.outerWidth(); + item.height = t.outerHeight(); + } + + var p = t.offset(); + item.left = p.left; + item.top = p.top; + }; + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (var i = this.containers.length - 1; i >= 0; i--){ + var p = this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + }; + } + + return this; + }, + + _createPlaceholder: function(that) { + + var self = that || this, o = self.options; + + if(!o.placeholder || o.placeholder.constructor == String) { + var className = o.placeholder; + o.placeholder = { + element: function() { + + var el = $(document.createElement(self.currentItem[0].nodeName)) + .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder") + .removeClass("ui-sortable-helper")[0]; + + if(!className) + el.style.visibility = "hidden"; + + return el; + }, + update: function(container, p) { + + // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that + // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified + if(className && !o.forcePlaceholderSize) return; + + //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item + if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); }; + if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); }; + } + }; + } + + //Create the placeholder + self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)); + + //Append it after the actual current item + self.currentItem.after(self.placeholder); + + //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) + o.placeholder.update(self, self.placeholder); + + }, + + _contactContainers: function(event) { + + // get innermost container that intersects with item + var innermostContainer = null, innermostIndex = null; + + + for (var i = this.containers.length - 1; i >= 0; i--){ + + // never consider a container that's located within the item itself + if($.ui.contains(this.currentItem[0], this.containers[i].element[0])) + continue; + + if(this._intersectsWith(this.containers[i].containerCache)) { + + // if we've already found a container and it's more "inner" than this, then continue + if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0])) + continue; + + innermostContainer = this.containers[i]; + innermostIndex = i; + + } else { + // container doesn't intersect. trigger "out" event if necessary + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", event, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + // if no intersecting containers found, return + if(!innermostContainer) return; + + // move the item into the container if it's not there already + if(this.containers.length === 1) { + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } else if(this.currentContainer != this.containers[innermostIndex]) { + + //When entering a new container, we will find the item with the least distance and append our item near it + var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; + for (var j = this.items.length - 1; j >= 0; j--) { + if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; + var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + } + } + + if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled + return; + + this.currentContainer = this.containers[innermostIndex]; + itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); + this._trigger("change", event, this._uiHash()); + this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder); + + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem); + + if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already + $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); + + if(helper[0] == this.currentItem[0]) + this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") }; + + if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width()); + if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height()); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj == 'string') { + obj = obj.split(' '); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.currentItem.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) { + this.offset.relative = this._getRelativeOffset(); + } + + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _rearrange: function(event, i, a, hardRefresh) { + + a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var self = this, counter = this.counter; + + window.setTimeout(function() { + if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + },0); + + }, + + _clear: function(event, noPropagation) { + + this.reverting = false; + // We delay all events that have to be triggered to after the point where the placeholder has been removed and + // everything else normalized again + var delayedTriggers = [], self = this; + + // We first have to update the dom position of the actual currentItem + // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) + if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem); + this._noFinalSort = null; + + if(this.helper[0] == this.currentItem[0]) { + for(var i in this._storedCSS) { + if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = ''; + } + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); }); + if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed + if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element + if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); }); + for (var i = this.containers.length - 1; i >= 0; i--){ + if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) { + delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + } + }; + }; + + //Post events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + if(this.containers[i].containerCache.over) { + delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + this.containers[i].containerCache.over = 0; + } + } + + //Do what was originally in plugins + if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor + if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity + if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index + + this.dragging = false; + if(this.cancelHelperRemoval) { + if(!noPropagation) { + this._trigger("beforeStop", event, this._uiHash()); + for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + return false; + } + + if(!noPropagation) this._trigger("beforeStop", event, this._uiHash()); + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + + if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null; + + if(!noPropagation) { + for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + + this.fromOutside = false; + return true; + + }, + + _trigger: function() { + if ($.Widget.prototype._trigger.apply(this, arguments) === false) { + this.cancel(); + } + }, + + _uiHash: function(inst) { + var self = inst || this; + return { + helper: self.helper, + placeholder: self.placeholder || $([]), + position: self.position, + originalPosition: self.originalPosition, + offset: self.positionAbs, + item: self.currentItem, + sender: inst ? inst.element : null + }; + } + +}); + +$.extend($.ui.sortable, { + version: "1.8.1" +}); + +})(jQuery); +/* + * jQuery UI Accordion 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.accordion", { + options: { + active: 0, + animated: 'slide', + autoHeight: true, + clearStyle: false, + collapsible: false, + event: "click", + fillSpace: false, + header: "> li > :first-child,> :not(li):even", + icons: { + header: "ui-icon-triangle-1-e", + headerSelected: "ui-icon-triangle-1-s" + }, + navigation: false, + navigationFilter: function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + } + }, + _create: function() { + + var o = this.options, self = this; + this.running = 0; + + this.element.addClass("ui-accordion ui-widget ui-helper-reset"); + + // in lack of child-selectors in CSS we need to mark top-LIs in a UL-accordion for some IE-fix + if (this.element[0].nodeName == "UL") { + this.element.children("li").addClass("ui-accordion-li-fix"); + } + + this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all") + .bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); }) + .bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); }) + .bind("focus.accordion", function(){ $(this).addClass('ui-state-focus'); }) + .bind("blur.accordion", function(){ $(this).removeClass('ui-state-focus'); }); + + this.headers + .next() + .addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); + + if ( o.navigation ) { + var current = this.element.find("a").filter(o.navigationFilter); + if ( current.length ) { + var header = current.closest(".ui-accordion-header"); + if ( header.length ) { + // anchor within header + this.active = header; + } else { + // anchor within content + this.active = current.closest(".ui-accordion-content").prev(); + } + } + } + + this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"); + this.active.next().addClass('ui-accordion-content-active'); + + //Append icon elements + this._createIcons(); + + this.resize(); + + //ARIA + this.element.attr('role','tablist'); + + this.headers + .attr('role','tab') + .bind('keydown', function(event) { return self._keydown(event); }) + .next() + .attr('role','tabpanel'); + + this.headers + .not(this.active || "") + .attr('aria-expanded','false') + .attr("tabIndex", "-1") + .next() + .hide(); + + // make sure at least one header is in the tab order + if (!this.active.length) { + this.headers.eq(0).attr('tabIndex','0'); + } else { + this.active + .attr('aria-expanded','true') + .attr('tabIndex', '0'); + } + + // only need links in taborder for Safari + if (!$.browser.safari) + this.headers.find('a').attr('tabIndex','-1'); + + if (o.event) { + this.headers.bind((o.event) + ".accordion", function(event) { + self._clickHandler.call(self, event, this); + event.preventDefault(); + }); + } + + }, + + _createIcons: function() { + var o = this.options; + if (o.icons) { + $("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers); + this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected); + this.element.addClass("ui-accordion-icons"); + } + }, + + _destroyIcons: function() { + this.headers.children(".ui-icon").remove(); + this.element.removeClass("ui-accordion-icons"); + }, + + destroy: function() { + var o = this.options; + + this.element + .removeClass("ui-accordion ui-widget ui-helper-reset") + .removeAttr("role") + .unbind('.accordion') + .removeData('accordion'); + + this.headers + .unbind(".accordion") + .removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top") + .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex"); + + this.headers.find("a").removeAttr("tabIndex"); + this._destroyIcons(); + var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active"); + if (o.autoHeight || o.fillHeight) { + contents.css("height", ""); + } + + return this; + }, + + _setOption: function(key, value) { + $.Widget.prototype._setOption.apply(this, arguments); + + if (key == "active") { + this.activate(value); + } + if (key == "icons") { + this._destroyIcons(); + if (value) { + this._createIcons(); + } + } + + }, + + _keydown: function(event) { + + var o = this.options, keyCode = $.ui.keyCode; + + if (o.disabled || event.altKey || event.ctrlKey) + return; + + var length = this.headers.length; + var currentIndex = this.headers.index(event.target); + var toFocus = false; + + switch(event.keyCode) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[(currentIndex + 1) % length]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[(currentIndex - 1 + length) % length]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._clickHandler({ target: event.target }, event.target); + event.preventDefault(); + } + + if (toFocus) { + $(event.target).attr('tabIndex','-1'); + $(toFocus).attr('tabIndex','0'); + toFocus.focus(); + return false; + } + + return true; + + }, + + resize: function() { + + var o = this.options, maxHeight; + + if (o.fillSpace) { + + if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); } + maxHeight = this.element.parent().height(); + if($.browser.msie) { this.element.parent().css('overflow', defOverflow); } + + this.headers.each(function() { + maxHeight -= $(this).outerHeight(true); + }); + + this.headers.next().each(function() { + $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height())); + }).css('overflow', 'auto'); + + } else if ( o.autoHeight ) { + maxHeight = 0; + this.headers.next().each(function() { + maxHeight = Math.max(maxHeight, $(this).height()); + }).height(maxHeight); + } + + return this; + }, + + activate: function(index) { + // TODO this gets called on init, changing the option without an explicit call for that + this.options.active = index; + // call clickHandler with custom event + var active = this._findActive(index)[0]; + this._clickHandler({ target: active }, active); + + return this; + }, + + _findActive: function(selector) { + return selector + ? typeof selector == "number" + ? this.headers.filter(":eq(" + selector + ")") + : this.headers.not(this.headers.not(selector)) + : selector === false + ? $([]) + : this.headers.filter(":eq(0)"); + }, + + // TODO isn't event.target enough? why the seperate target argument? + _clickHandler: function(event, target) { + + var o = this.options; + if (o.disabled) + return; + + // called only when using activate(false) to close all parts programmatically + if (!event.target) { + if (!o.collapsible) + return; + this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all") + .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header); + this.active.next().addClass('ui-accordion-content-active'); + var toHide = this.active.next(), + data = { + options: o, + newHeader: $([]), + oldHeader: o.active, + newContent: $([]), + oldContent: toHide + }, + toShow = (this.active = $([])); + this._toggle(toShow, toHide, data); + return; + } + + // get the click target + var clicked = $(event.currentTarget || target); + var clickedIsActive = clicked[0] == this.active[0]; + + // TODO the option is changed, is that correct? + // TODO if it is correct, shouldn't that happen after determining that the click is valid? + o.active = o.collapsible && clickedIsActive ? false : $('.ui-accordion-header', this.element).index(clicked); + + // if animations are still active, or the active header is the target, ignore click + if (this.running || (!o.collapsible && clickedIsActive)) { + return; + } + + // switch classes + this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all") + .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header); + if (!clickedIsActive) { + clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top") + .find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected); + clicked.next().addClass('ui-accordion-content-active'); + } + + // find elements to show and hide + var toShow = clicked.next(), + toHide = this.active.next(), + data = { + options: o, + newHeader: clickedIsActive && o.collapsible ? $([]) : clicked, + oldHeader: this.active, + newContent: clickedIsActive && o.collapsible ? $([]) : toShow, + oldContent: toHide + }, + down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] ); + + this.active = clickedIsActive ? $([]) : clicked; + this._toggle(toShow, toHide, data, clickedIsActive, down); + + return; + + }, + + _toggle: function(toShow, toHide, data, clickedIsActive, down) { + + var o = this.options, self = this; + + this.toShow = toShow; + this.toHide = toHide; + this.data = data; + + var complete = function() { if(!self) return; return self._completed.apply(self, arguments); }; + + // trigger changestart event + this._trigger("changestart", null, this.data); + + // count elements to animate + this.running = toHide.size() === 0 ? toShow.size() : toHide.size(); + + if (o.animated) { + + var animOptions = {}; + + if ( o.collapsible && clickedIsActive ) { + animOptions = { + toShow: $([]), + toHide: toHide, + complete: complete, + down: down, + autoHeight: o.autoHeight || o.fillSpace + }; + } else { + animOptions = { + toShow: toShow, + toHide: toHide, + complete: complete, + down: down, + autoHeight: o.autoHeight || o.fillSpace + }; + } + + if (!o.proxied) { + o.proxied = o.animated; + } + + if (!o.proxiedDuration) { + o.proxiedDuration = o.duration; + } + + o.animated = $.isFunction(o.proxied) ? + o.proxied(animOptions) : o.proxied; + + o.duration = $.isFunction(o.proxiedDuration) ? + o.proxiedDuration(animOptions) : o.proxiedDuration; + + var animations = $.ui.accordion.animations, + duration = o.duration, + easing = o.animated; + + if (easing && !animations[easing] && !$.easing[easing]) { + easing = 'slide'; + } + if (!animations[easing]) { + animations[easing] = function(options) { + this.slide(options, { + easing: easing, + duration: duration || 700 + }); + }; + } + + animations[easing](animOptions); + + } else { + + if (o.collapsible && clickedIsActive) { + toShow.toggle(); + } else { + toHide.hide(); + toShow.show(); + } + + complete(true); + + } + + // TODO assert that the blur and focus triggers are really necessary, remove otherwise + toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur(); + toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus(); + + }, + + _completed: function(cancel) { + + var o = this.options; + + this.running = cancel ? 0 : --this.running; + if (this.running) return; + + if (o.clearStyle) { + this.toShow.add(this.toHide).css({ + height: "", + overflow: "" + }); + } + + // other classes are removed before the animation; this one needs to stay until completed + this.toHide.removeClass("ui-accordion-content-active"); + + this._trigger('change', null, this.data); + } + +}); + + +$.extend($.ui.accordion, { + version: "1.8.1", + animations: { + slide: function(options, additions) { + options = $.extend({ + easing: "swing", + duration: 300 + }, options, additions); + if ( !options.toHide.size() ) { + options.toShow.animate({height: "show"}, options); + return; + } + if ( !options.toShow.size() ) { + options.toHide.animate({height: "hide"}, options); + return; + } + var overflow = options.toShow.css('overflow'), + percentDone = 0, + showProps = {}, + hideProps = {}, + fxAttrs = [ "height", "paddingTop", "paddingBottom" ], + originalWidth; + // fix width before calculating height of hidden element + var s = options.toShow; + originalWidth = s[0].style.width; + s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) ); + + $.each(fxAttrs, function(i, prop) { + hideProps[prop] = 'hide'; + + var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/); + showProps[prop] = { + value: parts[1], + unit: parts[2] || 'px' + }; + }); + options.toShow.css({ height: 0, overflow: 'hidden' }).show(); + options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{ + step: function(now, settings) { + // only calculate the percent when animating height + // IE gets very inconsistent results when animating elements + // with small values, which is common for padding + if (settings.prop == 'height') { + percentDone = ( settings.end - settings.start === 0 ) ? 0 : + (settings.now - settings.start) / (settings.end - settings.start); + } + + options.toShow[0].style[settings.prop] = + (percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit; + }, + duration: options.duration, + easing: options.easing, + complete: function() { + if ( !options.autoHeight ) { + options.toShow.css("height", ""); + } + options.toShow.css("width", originalWidth); + options.toShow.css({overflow: overflow}); + options.complete(); + } + }); + }, + bounceslide: function(options) { + this.slide(options, { + easing: options.down ? "easeOutBounce" : "swing", + duration: options.down ? 1000 : 200 + }); + } + } +}); + +})(jQuery); +/* + * jQuery UI Autocomplete 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function( $ ) { + +$.widget( "ui.autocomplete", { + options: { + minLength: 1, + delay: 300 + }, + _create: function() { + var self = this, + doc = this.element[ 0 ].ownerDocument; + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ) + // TODO verify these actually work as intended + .attr({ + role: "textbox", + "aria-autocomplete": "list", + "aria-haspopup": "true" + }) + .bind( "keydown.autocomplete", function( event ) { + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + self._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + self._move( "nextPage", event ); + break; + case keyCode.UP: + self._move( "previous", event ); + // prevent moving cursor to beginning of text field in some browsers + event.preventDefault(); + break; + case keyCode.DOWN: + self._move( "next", event ); + // prevent moving cursor to end of text field in some browsers + event.preventDefault(); + break; + case keyCode.ENTER: + // when menu is open or has focus + if ( self.menu.active ) { + event.preventDefault(); + } + //passthrough - ENTER and TAB both select the current element + case keyCode.TAB: + if ( !self.menu.active ) { + return; + } + self.menu.select( event ); + break; + case keyCode.ESCAPE: + self.element.val( self.term ); + self.close( event ); + break; + case keyCode.LEFT: + case keyCode.RIGHT: + case keyCode.SHIFT: + case keyCode.CONTROL: + case keyCode.ALT: + // ignore metakeys (shift, ctrl, alt) + break; + default: + // keypress is triggered before the input value is changed + clearTimeout( self.searching ); + self.searching = setTimeout(function() { + self.search( null, event ); + }, self.options.delay ); + break; + } + }) + .bind( "focus.autocomplete", function() { + self.selectedItem = null; + self.previous = self.element.val(); + }) + .bind( "blur.autocomplete", function( event ) { + clearTimeout( self.searching ); + // clicks on the menu (or a button to trigger a search) will cause a blur event + // TODO try to implement this without a timeout, see clearTimeout in search() + self.closing = setTimeout(function() { + self.close( event ); + self._change( event ); + }, 150 ); + }); + this._initSource(); + this.response = function() { + return self._response.apply( self, arguments ); + }; + this.menu = $( "<ul></ul>" ) + .addClass( "ui-autocomplete" ) + .appendTo( "body", doc ) + .menu({ + focus: function( event, ui ) { + var item = ui.item.data( "item.autocomplete" ); + if ( false !== self._trigger( "focus", null, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( /^key/.test(event.originalEvent.type) ) { + self.element.val( item.value ); + } + } + }, + selected: function( event, ui ) { + var item = ui.item.data( "item.autocomplete" ); + if ( false !== self._trigger( "select", event, { item: item } ) ) { + self.element.val( item.value ); + } + self.close( event ); + // only trigger when focus was lost (click on menu) + var previous = self.previous; + if ( self.element[0] !== doc.activeElement ) { + self.element.focus(); + self.previous = previous; + } + self.selectedItem = item; + }, + blur: function( event, ui ) { + if ( self.menu.element.is(":visible") ) { + self.element.val( self.term ); + } + } + }) + .zIndex( this.element.zIndex() + 1 ) + // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 + .css({ top: 0, left: 0 }) + .hide() + .data( "menu" ); + if ( $.fn.bgiframe ) { + this.menu.element.bgiframe(); + } + }, + + destroy: function() { + this.element + .removeClass( "ui-autocomplete-input" ) + .removeAttr( "autocomplete" ) + .removeAttr( "role" ) + .removeAttr( "aria-autocomplete" ) + .removeAttr( "aria-haspopup" ); + this.menu.element.remove(); + $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key ) { + $.Widget.prototype._setOption.apply( this, arguments ); + if ( key === "source" ) { + this._initSource(); + } + }, + + _initSource: function() { + var array, + url; + if ( $.isArray(this.options.source) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter(array, request.term) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + $.getJSON( url, request, response ); + }; + } else { + this.source = this.options.source; + } + }, + + search: function( value, event ) { + value = value != null ? value : this.element.val(); + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + clearTimeout( this.closing ); + if ( this._trigger("search") === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.term = this.element + .addClass( "ui-autocomplete-loading" ) + // always save the actual value, not the one passed as an argument + .val(); + + this.source( { term: value }, this.response ); + }, + + _response: function( content ) { + if ( content.length ) { + content = this._normalize( content ); + this._suggest( content ); + this._trigger( "open" ); + } else { + this.close(); + } + this.element.removeClass( "ui-autocomplete-loading" ); + }, + + close: function( event ) { + clearTimeout( this.closing ); + if ( this.menu.element.is(":visible") ) { + this._trigger( "close", event ); + this.menu.element.hide(); + this.menu.deactivate(); + } + }, + + _change: function( event ) { + if ( this.previous !== this.element.val() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[0].label && items[0].value ) { + return items; + } + return $.map( items, function(item) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend({ + label: item.label || item.value, + value: item.value || item.label + }, item ); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element + .empty() + .zIndex( this.element.zIndex() + 1 ), + menuWidth, + textWidth; + this._renderMenu( ul, items ); + // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate + this.menu.deactivate(); + this.menu.refresh(); + this.menu.element.show().position({ + my: "left top", + at: "left bottom", + of: this.element, + collision: "none" + }); + + menuWidth = ul.width( "" ).width(); + textWidth = this.element.width(); + ul.width( Math.max( menuWidth, textWidth ) ); + }, + + _renderMenu: function( ul, items ) { + var self = this; + $.each( items, function( index, item ) { + self._renderItem( ul, item ); + }); + }, + + _renderItem: function( ul, item) { + return $( "<li></li>" ) + .data( "item.autocomplete", item ) + .append( "<a>" + item.label + "</a>" ) + .appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is(":visible") ) { + this.search( null, event ); + return; + } + if ( this.menu.first() && /^previous/.test(direction) || + this.menu.last() && /^next/.test(direction) ) { + this.element.val( this.term ); + this.menu.deactivate(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" ); + }, + filter: function(array, term) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); + return $.grep( array, function(value) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + +}( jQuery )); + +/* + * jQuery UI Menu (not officially released) + * + * This widget isn't yet finished and the API is subject to change. We plan to finish + * it for the next release. You're welcome to give it a try anyway and give us feedback, + * as long as you're okay with migrating your code later on. We can help with that, too. + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Menu + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.menu", { + _create: function() { + var self = this; + this.element + .addClass("ui-menu ui-widget ui-widget-content ui-corner-all") + .attr({ + role: "listbox", + "aria-activedescendant": "ui-active-menuitem" + }) + .click(function( event ) { + if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) { + return; + } + // temporary + event.preventDefault(); + self.select( event ); + }); + this.refresh(); + }, + + refresh: function() { + var self = this; + + // don't refresh list items that are already adapted + var items = this.element.children("li:not(.ui-menu-item):has(a)") + .addClass("ui-menu-item") + .attr("role", "menuitem"); + + items.children("a") + .addClass("ui-corner-all") + .attr("tabindex", -1) + // mouseenter doesn't work with event delegation + .mouseenter(function( event ) { + self.activate( event, $(this).parent() ); + }) + .mouseleave(function() { + self.deactivate(); + }); + }, + + activate: function( event, item ) { + this.deactivate(); + if (this.hasScroll()) { + var offset = item.offset().top - this.element.offset().top, + scroll = this.element.attr("scrollTop"), + elementHeight = this.element.height(); + if (offset < 0) { + this.element.attr("scrollTop", scroll + offset); + } else if (offset > elementHeight) { + this.element.attr("scrollTop", scroll + offset - elementHeight + item.height()); + } + } + this.active = item.eq(0) + .children("a") + .addClass("ui-state-hover") + .attr("id", "ui-active-menuitem") + .end(); + this._trigger("focus", event, { item: item }); + }, + + deactivate: function() { + if (!this.active) { return; } + + this.active.children("a") + .removeClass("ui-state-hover") + .removeAttr("id"); + this._trigger("blur"); + this.active = null; + }, + + next: function(event) { + this.move("next", ".ui-menu-item:first", event); + }, + + previous: function(event) { + this.move("prev", ".ui-menu-item:last", event); + }, + + first: function() { + return this.active && !this.active.prev().length; + }, + + last: function() { + return this.active && !this.active.next().length; + }, + + move: function(direction, edge, event) { + if (!this.active) { + this.activate(event, this.element.children(edge)); + return; + } + var next = this.active[direction + "All"](".ui-menu-item").eq(0); + if (next.length) { + this.activate(event, next); + } else { + this.activate(event, this.element.children(edge)); + } + }, + + // TODO merge with previousPage + nextPage: function(event) { + if (this.hasScroll()) { + // TODO merge with no-scroll-else + if (!this.active || this.last()) { + this.activate(event, this.element.children(":first")); + return; + } + var base = this.active.offset().top, + height = this.element.height(), + result = this.element.children("li").filter(function() { + var close = $(this).offset().top - base - height + $(this).height(); + // TODO improve approximation + return close < 10 && close > -10; + }); + + // TODO try to catch this earlier when scrollTop indicates the last page anyway + if (!result.length) { + result = this.element.children(":last"); + } + this.activate(event, result); + } else { + this.activate(event, this.element.children(!this.active || this.last() ? ":first" : ":last")); + } + }, + + // TODO merge with nextPage + previousPage: function(event) { + if (this.hasScroll()) { + // TODO merge with no-scroll-else + if (!this.active || this.first()) { + this.activate(event, this.element.children(":last")); + return; + } + + var base = this.active.offset().top, + height = this.element.height(); + result = this.element.children("li").filter(function() { + var close = $(this).offset().top - base + height - $(this).height(); + // TODO improve approximation + return close < 10 && close > -10; + }); + + // TODO try to catch this earlier when scrollTop indicates the last page anyway + if (!result.length) { + result = this.element.children(":first"); + } + this.activate(event, result); + } else { + this.activate(event, this.element.children(!this.active || this.first() ? ":last" : ":first")); + } + }, + + hasScroll: function() { + return this.element.height() < this.element.attr("scrollHeight"); + }, + + select: function( event ) { + this._trigger("selected", event, { item: this.active }); + } +}); + +}(jQuery)); +/* + * jQuery UI Button 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Button + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function( $ ) { + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + otherClasses = "ui-state-hover ui-state-active " + + "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only", + formResetHandler = function( event ) { + $( ":ui-button", event.target.form ).each(function() { + var inst = $( this ).data( "button" ); + setTimeout(function() { + inst.refresh(); + }, 1 ); + }); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + if ( form ) { + radios = $( form ).find( "[name='" + name + "']" ); + } else { + radios = $( "[name='" + name + "']", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + options: { + text: true, + label: null, + icons: { + primary: null, + secondary: null + } + }, + _create: function() { + this.element.closest( "form" ) + .unbind( "reset.button" ) + .bind( "reset.button", formResetHandler ); + + this._determineButtonType(); + this.hasTitle = !!this.buttonElement.attr( "title" ); + + var self = this, + options = this.options, + toggleButton = this.type === "checkbox" || this.type === "radio", + hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ), + focusClass = "ui-state-focus"; + + if ( options.label === null ) { + options.label = this.buttonElement.html(); + } + + if ( this.element.is( ":disabled" ) ) { + options.disabled = true; + } + + this.buttonElement + .addClass( baseClasses ) + .attr( "role", "button" ) + .bind( "mouseenter.button", function() { + if ( options.disabled ) { + return; + } + $( this ).addClass( "ui-state-hover" ); + if ( this === lastActive ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "mouseleave.button", function() { + if ( options.disabled ) { + return; + } + $( this ).removeClass( hoverClass ); + }) + .bind( "focus.button", function() { + // no need to check disabled, focus won't be triggered anyway + $( this ).addClass( focusClass ); + }) + .bind( "blur.button", function() { + $( this ).removeClass( focusClass ); + }); + + if ( toggleButton ) { + this.element.bind( "change.button", function() { + self.refresh(); + }); + } + + if ( this.type === "checkbox" ) { + this.buttonElement.bind( "click.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).toggleClass( "ui-state-active" ); + self.buttonElement.attr( "aria-pressed", self.element[0].checked ); + }); + } else if ( this.type === "radio" ) { + this.buttonElement.bind( "click.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + self.buttonElement.attr( "aria-pressed", true ); + + var radio = self.element[ 0 ]; + radioGroup( radio ) + .not( radio ) + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + }); + } else { + this.buttonElement + .bind( "mousedown.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + lastActive = this; + $( document ).one( "mouseup", function() { + lastActive = null; + }); + }) + .bind( "mouseup.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).removeClass( "ui-state-active" ); + }) + .bind( "keydown.button", function(event) { + if ( options.disabled ) { + return false; + } + if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "keyup.button", function() { + $( this ).removeClass( "ui-state-active" ); + }); + + if ( this.buttonElement.is("a") ) { + this.buttonElement.keyup(function(event) { + if ( event.keyCode === $.ui.keyCode.SPACE ) { + // TODO pass through original event correctly (just as 2nd argument doesn't work) + $( this ).click(); + } + }); + } + } + + // TODO: pull out $.Widget's handling for the disabled option into + // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can + // be overridden by individual plugins + this._setOption( "disabled", options.disabled ); + }, + + _determineButtonType: function() { + + if ( this.element.is(":checkbox") ) { + this.type = "checkbox"; + } else { + if ( this.element.is(":radio") ) { + this.type = "radio"; + } else { + if ( this.element.is("input") ) { + this.type = "input"; + } else { + this.type = "button"; + } + } + } + + if ( this.type === "checkbox" || this.type === "radio" ) { + // we don't search against the document in case the element + // is disconnected from the DOM + this.buttonElement = this.element.parents().last() + .find( "[for=" + this.element.attr("id") + "]" ); + this.element.addClass( "ui-helper-hidden-accessible" ); + + var checked = this.element.is( ":checked" ); + if ( checked ) { + this.buttonElement.addClass( "ui-state-active" ); + } + this.buttonElement.attr( "aria-pressed", checked ); + } else { + this.buttonElement = this.element; + } + }, + + widget: function() { + return this.buttonElement; + }, + + destroy: function() { + this.element + .removeClass( "ui-helper-hidden-accessible" ); + this.buttonElement + .removeClass( baseClasses + " " + otherClasses ) + .removeAttr( "role" ) + .removeAttr( "aria-pressed" ) + .html( this.buttonElement.find(".ui-button-text").html() ); + + if ( !this.hasTitle ) { + this.buttonElement.removeAttr( "title" ); + } + + $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key, value ) { + $.Widget.prototype._setOption.apply( this, arguments ); + if ( key === "disabled" ) { + if ( value ) { + this.element.attr( "disabled", true ); + } else { + this.element.removeAttr( "disabled" ); + } + } + this._resetButton(); + }, + + refresh: function() { + var isDisabled = this.element.is( ":disabled" ); + if ( isDisabled !== this.options.disabled ) { + this._setOption( "disabled", isDisabled ); + } + if ( this.type === "radio" ) { + radioGroup( this.element[0] ).each(function() { + if ( $( this ).is( ":checked" ) ) { + $( this ).button( "widget" ) + .addClass( "ui-state-active" ) + .attr( "aria-pressed", true ); + } else { + $( this ).button( "widget" ) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + } + }); + } else if ( this.type === "checkbox" ) { + if ( this.element.is( ":checked" ) ) { + this.buttonElement + .addClass( "ui-state-active" ) + .attr( "aria-pressed", true ); + } else { + this.buttonElement + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + } + } + }, + + _resetButton: function() { + if ( this.type === "input" ) { + if ( this.options.label ) { + this.element.val( this.options.label ); + } + return; + } + var buttonElement = this.buttonElement, + buttonText = $( "<span></span>" ) + .addClass( "ui-button-text" ) + .html( this.options.label ) + .appendTo( buttonElement.empty() ) + .text(), + icons = this.options.icons, + multipleIcons = icons.primary && icons.secondary; + if ( icons.primary || icons.secondary ) { + buttonElement.addClass( "ui-button-text-icon" + + ( multipleIcons ? "s" : "" ) ); + if ( icons.primary ) { + buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" ); + } + if ( icons.secondary ) { + buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" ); + } + if ( !this.options.text ) { + buttonElement + .addClass( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" ) + .removeClass( "ui-button-text-icons ui-button-text-icon" ); + if ( !this.hasTitle ) { + buttonElement.attr( "title", buttonText ); + } + } + } else { + buttonElement.addClass( "ui-button-text-only" ); + } + } +}); + +$.widget( "ui.buttonset", { + _create: function() { + this.element.addClass( "ui-buttonset" ); + this._init(); + }, + + _init: function() { + this.refresh(); + }, + + _setOption: function( key, value ) { + if ( key === "disabled" ) { + this.buttons.button( "option", key, value ); + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + refresh: function() { + this.buttons = this.element.find( ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" ) + .filter( ":ui-button" ) + .button( "refresh" ) + .end() + .not( ":ui-button" ) + .button() + .end() + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-all ui-corner-left ui-corner-right" ) + .filter( ":first" ) + .addClass( "ui-corner-left" ) + .end() + .filter( ":last" ) + .addClass( "ui-corner-right" ) + .end() + .end(); + }, + + destroy: function() { + this.element.removeClass( "ui-buttonset" ); + this.buttons + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-left ui-corner-right" ) + .end() + .button( "destroy" ) + + $.Widget.prototype.destroy.call( this ); + } +}); + +}( jQuery ) ); +/* + * jQuery UI Dialog 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function($) { + +var uiDialogClasses = + 'ui-dialog ' + + 'ui-widget ' + + 'ui-widget-content ' + + 'ui-corner-all '; + +$.widget("ui.dialog", { + options: { + autoOpen: true, + buttons: {}, + closeOnEscape: true, + closeText: 'close', + dialogClass: '', + draggable: true, + hide: null, + height: 'auto', + maxHeight: false, + maxWidth: false, + minHeight: 150, + minWidth: 150, + modal: false, + position: 'center', + resizable: true, + show: null, + stack: true, + title: '', + width: 300, + zIndex: 1000 + }, + _create: function() { + this.originalTitle = this.element.attr('title'); + + var self = this, + options = self.options, + + title = options.title || self.originalTitle || '&#160;', + titleId = $.ui.dialog.getTitleId(self.element), + + uiDialog = (self.uiDialog = $('<div></div>')) + .appendTo(document.body) + .hide() + .addClass(uiDialogClasses + options.dialogClass) + .css({ + zIndex: options.zIndex + }) + // setting tabIndex makes the div focusable + // setting outline to 0 prevents a border on focus in Mozilla + .attr('tabIndex', -1).css('outline', 0).keydown(function(event) { + if (options.closeOnEscape && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE) { + + self.close(event); + event.preventDefault(); + } + }) + .attr({ + role: 'dialog', + 'aria-labelledby': titleId + }) + .mousedown(function(event) { + self.moveToTop(false, event); + }), + + uiDialogContent = self.element + .show() + .removeAttr('title') + .addClass( + 'ui-dialog-content ' + + 'ui-widget-content') + .appendTo(uiDialog), + + uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>')) + .addClass( + 'ui-dialog-titlebar ' + + 'ui-widget-header ' + + 'ui-corner-all ' + + 'ui-helper-clearfix' + ) + .prependTo(uiDialog), + + uiDialogTitlebarClose = $('<a href="#"></a>') + .addClass( + 'ui-dialog-titlebar-close ' + + 'ui-corner-all' + ) + .attr('role', 'button') + .hover( + function() { + uiDialogTitlebarClose.addClass('ui-state-hover'); + }, + function() { + uiDialogTitlebarClose.removeClass('ui-state-hover'); + } + ) + .focus(function() { + uiDialogTitlebarClose.addClass('ui-state-focus'); + }) + .blur(function() { + uiDialogTitlebarClose.removeClass('ui-state-focus'); + }) + .click(function(event) { + self.close(event); + return false; + }) + .appendTo(uiDialogTitlebar), + + uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>')) + .addClass( + 'ui-icon ' + + 'ui-icon-closethick' + ) + .text(options.closeText) + .appendTo(uiDialogTitlebarClose), + + uiDialogTitle = $('<span></span>') + .addClass('ui-dialog-title') + .attr('id', titleId) + .html(title) + .prependTo(uiDialogTitlebar); + + //handling of deprecated beforeclose (vs beforeClose) option + //Ticket #4669 http://dev.jqueryui.com/ticket/4669 + //TODO: remove in 1.9pre + if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) { + options.beforeClose = options.beforeclose; + } + + uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection(); + + if (options.draggable && $.fn.draggable) { + self._makeDraggable(); + } + if (options.resizable && $.fn.resizable) { + self._makeResizable(); + } + + self._createButtons(options.buttons); + self._isOpen = false; + + if ($.fn.bgiframe) { + uiDialog.bgiframe(); + } + }, + _init: function() { + if ( this.options.autoOpen ) { + this.open(); + } + }, + + destroy: function() { + var self = this; + + if (self.overlay) { + self.overlay.destroy(); + } + self.uiDialog.hide(); + self.element + .unbind('.dialog') + .removeData('dialog') + .removeClass('ui-dialog-content ui-widget-content') + .hide().appendTo('body'); + self.uiDialog.remove(); + + if (self.originalTitle) { + self.element.attr('title', self.originalTitle); + } + + return self; + }, + + widget: function() { + return this.uiDialog; + }, + + close: function(event) { + var self = this, + maxZ; + + if (false === self._trigger('beforeClose', event)) { + return; + } + + if (self.overlay) { + self.overlay.destroy(); + } + self.uiDialog.unbind('keypress.ui-dialog'); + + self._isOpen = false; + + if (self.options.hide) { + self.uiDialog.hide(self.options.hide, function() { + self._trigger('close', event); + }); + } else { + self.uiDialog.hide(); + self._trigger('close', event); + } + + $.ui.dialog.overlay.resize(); + + // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) + if (self.options.modal) { + maxZ = 0; + $('.ui-dialog').each(function() { + if (this !== self.uiDialog[0]) { + maxZ = Math.max(maxZ, $(this).css('z-index')); + } + }); + $.ui.dialog.maxZ = maxZ; + } + + return self; + }, + + isOpen: function() { + return this._isOpen; + }, + + // the force parameter allows us to move modal dialogs to their correct + // position on open + moveToTop: function(force, event) { + var self = this, + options = self.options, + saveScroll; + + if ((options.modal && !force) || + (!options.stack && !options.modal)) { + return self._trigger('focus', event); + } + + if (options.zIndex > $.ui.dialog.maxZ) { + $.ui.dialog.maxZ = options.zIndex; + } + if (self.overlay) { + $.ui.dialog.maxZ += 1; + self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ); + } + + //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed. + // http://ui.jquery.com/bugs/ticket/3193 + saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') }; + $.ui.dialog.maxZ += 1; + self.uiDialog.css('z-index', $.ui.dialog.maxZ); + self.element.attr(saveScroll); + self._trigger('focus', event); + + return self; + }, + + open: function() { + if (this._isOpen) { return; } + + var self = this, + options = self.options, + uiDialog = self.uiDialog; + + self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null; + if (uiDialog.next().length) { + uiDialog.appendTo('body'); + } + self._size(); + self._position(options.position); + uiDialog.show(options.show); + self.moveToTop(true); + + // prevent tabbing out of modal dialogs + if (options.modal) { + uiDialog.bind('keypress.ui-dialog', function(event) { + if (event.keyCode !== $.ui.keyCode.TAB) { + return; + } + + var tabbables = $(':tabbable', this), + first = tabbables.filter(':first'), + last = tabbables.filter(':last'); + + if (event.target === last[0] && !event.shiftKey) { + first.focus(1); + return false; + } else if (event.target === first[0] && event.shiftKey) { + last.focus(1); + return false; + } + }); + } + + // set focus to the first tabbable element in the content area or the first button + // if there are no tabbable elements, set focus on the dialog itself + $([]) + .add(uiDialog.find('.ui-dialog-content :tabbable:first')) + .add(uiDialog.find('.ui-dialog-buttonpane :tabbable:first')) + .add(uiDialog) + .filter(':first') + .focus(); + + self._trigger('open'); + self._isOpen = true; + + return self; + }, + + _createButtons: function(buttons) { + var self = this, + hasButtons = false, + uiDialogButtonPane = $('<div></div>') + .addClass( + 'ui-dialog-buttonpane ' + + 'ui-widget-content ' + + 'ui-helper-clearfix' + ); + + // if we already have a button pane, remove it + self.uiDialog.find('.ui-dialog-buttonpane').remove(); + + if (typeof buttons === 'object' && buttons !== null) { + $.each(buttons, function() { + return !(hasButtons = true); + }); + } + if (hasButtons) { + $.each(buttons, function(name, fn) { + var button = $('<button type="button"></button>') + .text(name) + .click(function() { fn.apply(self.element[0], arguments); }) + .appendTo(uiDialogButtonPane); + if ($.fn.button) { + button.button(); + } + }); + uiDialogButtonPane.appendTo(self.uiDialog); + } + }, + + _makeDraggable: function() { + var self = this, + options = self.options, + doc = $(document), + heightBeforeDrag; + + function filteredUi(ui) { + return { + position: ui.position, + offset: ui.offset + }; + } + + self.uiDialog.draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', + handle: '.ui-dialog-titlebar', + containment: 'document', + start: function(event, ui) { + heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height(); + $(this).height($(this).height()).addClass("ui-dialog-dragging"); + self._trigger('dragStart', event, filteredUi(ui)); + }, + drag: function(event, ui) { + self._trigger('drag', event, filteredUi(ui)); + }, + stop: function(event, ui) { + options.position = [ui.position.left - doc.scrollLeft(), + ui.position.top - doc.scrollTop()]; + $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag); + self._trigger('dragStop', event, filteredUi(ui)); + $.ui.dialog.overlay.resize(); + } + }); + }, + + _makeResizable: function(handles) { + handles = (handles === undefined ? this.options.resizable : handles); + var self = this, + options = self.options, + // .ui-resizable has position: relative defined in the stylesheet + // but dialogs have to use absolute or fixed positioning + position = self.uiDialog.css('position'), + resizeHandles = (typeof handles === 'string' ? + handles : + 'n,e,s,w,se,sw,ne,nw' + ); + + function filteredUi(ui) { + return { + originalPosition: ui.originalPosition, + originalSize: ui.originalSize, + position: ui.position, + size: ui.size + }; + } + + self.uiDialog.resizable({ + cancel: '.ui-dialog-content', + containment: 'document', + alsoResize: self.element, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: self._minHeight(), + handles: resizeHandles, + start: function(event, ui) { + $(this).addClass("ui-dialog-resizing"); + self._trigger('resizeStart', event, filteredUi(ui)); + }, + resize: function(event, ui) { + self._trigger('resize', event, filteredUi(ui)); + }, + stop: function(event, ui) { + $(this).removeClass("ui-dialog-resizing"); + options.height = $(this).height(); + options.width = $(this).width(); + self._trigger('resizeStop', event, filteredUi(ui)); + $.ui.dialog.overlay.resize(); + } + }) + .css('position', position) + .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se'); + }, + + _minHeight: function() { + var options = this.options; + + if (options.height === 'auto') { + return options.minHeight; + } else { + return Math.min(options.minHeight, options.height); + } + }, + + _position: function(position) { + var myAt = [], + offset = [0, 0], + isVisible; + + position = position || $.ui.dialog.prototype.options.position; + + // deep extending converts arrays to objects in jQuery <= 1.3.2 :-( +// if (typeof position == 'string' || $.isArray(position)) { +// myAt = $.isArray(position) ? position : position.split(' '); + + if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) { + myAt = position.split ? position.split(' ') : [position[0], position[1]]; + if (myAt.length === 1) { + myAt[1] = myAt[0]; + } + + $.each(['left', 'top'], function(i, offsetPosition) { + if (+myAt[i] === myAt[i]) { + offset[i] = myAt[i]; + myAt[i] = offsetPosition; + } + }); + } else if (typeof position === 'object') { + if ('left' in position) { + myAt[0] = 'left'; + offset[0] = position.left; + } else if ('right' in position) { + myAt[0] = 'right'; + offset[0] = -position.right; + } + + if ('top' in position) { + myAt[1] = 'top'; + offset[1] = position.top; + } else if ('bottom' in position) { + myAt[1] = 'bottom'; + offset[1] = -position.bottom; + } + } + + // need to show the dialog to get the actual offset in the position plugin + isVisible = this.uiDialog.is(':visible'); + if (!isVisible) { + this.uiDialog.show(); + } + this.uiDialog + // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 + .css({ top: 0, left: 0 }) + .position({ + my: myAt.join(' '), + at: myAt.join(' '), + offset: offset.join(' '), + of: window, + collision: 'fit', + // ensure that the titlebar is never outside the document + using: function(pos) { + var topOffset = $(this).css(pos).offset().top; + if (topOffset < 0) { + $(this).css('top', pos.top - topOffset); + } + } + }); + if (!isVisible) { + this.uiDialog.hide(); + } + }, + + _setOption: function(key, value){ + var self = this, + uiDialog = self.uiDialog, + isResizable = uiDialog.is(':data(resizable)'), + resize = false; + + switch (key) { + //handling of deprecated beforeclose (vs beforeClose) option + //Ticket #4669 http://dev.jqueryui.com/ticket/4669 + //TODO: remove in 1.9pre + case "beforeclose": + key = "beforeClose"; + break; + case "buttons": + self._createButtons(value); + break; + case "closeText": + // convert whatever was passed in to a string, for text() to not throw up + self.uiDialogTitlebarCloseText.text("" + value); + break; + case "dialogClass": + uiDialog + .removeClass(self.options.dialogClass) + .addClass(uiDialogClasses + value); + break; + case "disabled": + if (value) { + uiDialog.addClass('ui-dialog-disabled'); + } else { + uiDialog.removeClass('ui-dialog-disabled'); + } + break; + case "draggable": + if (value) { + self._makeDraggable(); + } else { + uiDialog.draggable('destroy'); + } + break; + case "height": + resize = true; + break; + case "maxHeight": + if (isResizable) { + uiDialog.resizable('option', 'maxHeight', value); + } + resize = true; + break; + case "maxWidth": + if (isResizable) { + uiDialog.resizable('option', 'maxWidth', value); + } + resize = true; + break; + case "minHeight": + if (isResizable) { + uiDialog.resizable('option', 'minHeight', value); + } + resize = true; + break; + case "minWidth": + if (isResizable) { + uiDialog.resizable('option', 'minWidth', value); + } + resize = true; + break; + case "position": + self._position(value); + break; + case "resizable": + // currently resizable, becoming non-resizable + if (isResizable && !value) { + uiDialog.resizable('destroy'); + } + + // currently resizable, changing handles + if (isResizable && typeof value === 'string') { + uiDialog.resizable('option', 'handles', value); + } + + // currently non-resizable, becoming resizable + if (!isResizable && value !== false) { + self._makeResizable(value); + } + break; + case "title": + // convert whatever was passed in o a string, for html() to not throw up + $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;')); + break; + case "width": + resize = true; + break; + } + + $.Widget.prototype._setOption.apply(self, arguments); + if (resize) { + self._size(); + } + }, + + _size: function() { + /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content + * divs will both have width and height set, so we need to reset them + */ + var options = this.options, + nonContentHeight; + + // reset content sizing + // hide for non content measurement because height: 0 doesn't work in IE quirks mode (see #4350) + this.element.css({ + width: 'auto', + minHeight: 0, + height: 0 + }); + + // reset wrapper sizing + // determine the height of all the non-content elements + nonContentHeight = this.uiDialog.css({ + height: 'auto', + width: options.width + }) + .height(); + + this.element + .css(options.height === 'auto' ? { + minHeight: Math.max(options.minHeight - nonContentHeight, 0), + height: 'auto' + } : { + minHeight: 0, + height: Math.max(options.height - nonContentHeight, 0) + }) + .show(); + + if (this.uiDialog.is(':data(resizable)')) { + this.uiDialog.resizable('option', 'minHeight', this._minHeight()); + } + } +}); + +$.extend($.ui.dialog, { + version: "1.8.1", + + uuid: 0, + maxZ: 0, + + getTitleId: function($el) { + var id = $el.attr('id'); + if (!id) { + this.uuid += 1; + id = this.uuid; + } + return 'ui-dialog-title-' + id; + }, + + overlay: function(dialog) { + this.$el = $.ui.dialog.overlay.create(dialog); + } +}); + +$.extend($.ui.dialog.overlay, { + instances: [], + // reuse old instances due to IE memory leak with alpha transparency (see #5185) + oldInstances: [], + maxZ: 0, + events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), + function(event) { return event + '.dialog-overlay'; }).join(' '), + create: function(dialog) { + if (this.instances.length === 0) { + // prevent use of anchors and inputs + // we use a setTimeout in case the overlay is created from an + // event that we're going to be cancelling (see #2804) + setTimeout(function() { + // handle $(el).dialog().dialog('close') (see #4065) + if ($.ui.dialog.overlay.instances.length) { + $(document).bind($.ui.dialog.overlay.events, function(event) { + // stop events if the z-index of the target is < the z-index of the overlay + return ($(event.target).zIndex() >= $.ui.dialog.overlay.maxZ); + }); + } + }, 1); + + // allow closing by pressing the escape key + $(document).bind('keydown.dialog-overlay', function(event) { + if (dialog.options.closeOnEscape && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE) { + + dialog.close(event); + event.preventDefault(); + } + }); + + // handle window resize + $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); + } + + var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay')) + .appendTo(document.body) + .css({ + width: this.width(), + height: this.height() + }); + + if ($.fn.bgiframe) { + $el.bgiframe(); + } + + this.instances.push($el); + return $el; + }, + + destroy: function($el) { + this.oldInstances.push(this.instances.splice($.inArray($el, this.instances), 1)[0]); + + if (this.instances.length === 0) { + $([document, window]).unbind('.dialog-overlay'); + } + + $el.remove(); + + // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) + var maxZ = 0; + $.each(this.instances, function() { + maxZ = Math.max(maxZ, this.css('z-index')); + }); + this.maxZ = maxZ; + }, + + height: function() { + var scrollHeight, + offsetHeight; + // handle IE 6 + if ($.browser.msie && $.browser.version < 7) { + scrollHeight = Math.max( + document.documentElement.scrollHeight, + document.body.scrollHeight + ); + offsetHeight = Math.max( + document.documentElement.offsetHeight, + document.body.offsetHeight + ); + + if (scrollHeight < offsetHeight) { + return $(window).height() + 'px'; + } else { + return scrollHeight + 'px'; + } + // handle "good" browsers + } else { + return $(document).height() + 'px'; + } + }, + + width: function() { + var scrollWidth, + offsetWidth; + // handle IE 6 + if ($.browser.msie && $.browser.version < 7) { + scrollWidth = Math.max( + document.documentElement.scrollWidth, + document.body.scrollWidth + ); + offsetWidth = Math.max( + document.documentElement.offsetWidth, + document.body.offsetWidth + ); + + if (scrollWidth < offsetWidth) { + return $(window).width() + 'px'; + } else { + return scrollWidth + 'px'; + } + // handle "good" browsers + } else { + return $(document).width() + 'px'; + } + }, + + resize: function() { + /* If the dialog is draggable and the user drags it past the + * right edge of the window, the document becomes wider so we + * need to stretch the overlay. If the user then drags the + * dialog back to the left, the document will become narrower, + * so we need to shrink the overlay to the appropriate size. + * This is handled by shrinking the overlay before setting it + * to the full document size. + */ + var $overlays = $([]); + $.each($.ui.dialog.overlay.instances, function() { + $overlays = $overlays.add(this); + }); + + $overlays.css({ + width: 0, + height: 0 + }).css({ + width: $.ui.dialog.overlay.width(), + height: $.ui.dialog.overlay.height() + }); + } +}); + +$.extend($.ui.dialog.overlay.prototype, { + destroy: function() { + $.ui.dialog.overlay.destroy(this.$el); + } +}); + +}(jQuery)); +/* + * jQuery UI Slider 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ + +(function( $ ) { + +// number of pages in a slider +// (how many times can you page up/down to go through the whole range) +var numPages = 5; + +$.widget( "ui.slider", $.ui.mouse, { + + widgetEventPrefix: "slide", + + options: { + animate: false, + distance: 0, + max: 100, + min: 0, + orientation: "horizontal", + range: false, + step: 1, + value: 0, + values: null + }, + + _create: function() { + var self = this, + o = this.options; + + this._keySliding = false; + this._mouseSliding = false; + this._animateOff = true; + this._handleIndex = null; + this._detectOrientation(); + this._mouseInit(); + + this.element + .addClass( "ui-slider" + + " ui-slider-" + this.orientation + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ); + + if ( o.disabled ) { + this.element.addClass( "ui-slider-disabled ui-disabled" ); + } + + this.range = $([]); + + if ( o.range ) { + if ( o.range === true ) { + this.range = $( "<div></div>" ); + if ( !o.values ) { + o.values = [ this._valueMin(), this._valueMin() ]; + } + if ( o.values.length && o.values.length !== 2 ) { + o.values = [ o.values[0], o.values[0] ]; + } + } else { + this.range = $( "<div></div>" ); + } + + this.range + .appendTo( this.element ) + .addClass( "ui-slider-range" ); + + if ( o.range === "min" || o.range === "max" ) { + this.range.addClass( "ui-slider-range-" + o.range ); + } + + // note: this isn't the most fittingly semantic framework class for this element, + // but worked best visually with a variety of themes + this.range.addClass( "ui-widget-header" ); + } + + if ( $( ".ui-slider-handle", this.element ).length === 0 ) { + $( "<a href='#'></a>" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + + if ( o.values && o.values.length ) { + while ( $(".ui-slider-handle", this.element).length < o.values.length ) { + $( "<a href='#'></a>" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + } + + this.handles = $( ".ui-slider-handle", this.element ) + .addClass( "ui-state-default" + + " ui-corner-all" ); + + this.handle = this.handles.eq( 0 ); + + this.handles.add( this.range ).filter( "a" ) + .click(function( event ) { + event.preventDefault(); + }) + .hover(function() { + if ( !o.disabled ) { + $( this ).addClass( "ui-state-hover" ); + } + }, function() { + $( this ).removeClass( "ui-state-hover" ); + }) + .focus(function() { + if ( !o.disabled ) { + $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" ); + $( this ).addClass( "ui-state-focus" ); + } else { + $( this ).blur(); + } + }) + .blur(function() { + $( this ).removeClass( "ui-state-focus" ); + }); + + this.handles.each(function( i ) { + $( this ).data( "index.ui-slider-handle", i ); + }); + + this.handles + .keydown(function( event ) { + var ret = true, + index = $( this ).data( "index.ui-slider-handle" ), + allowed, + curVal, + newVal, + step; + + if ( self.options.disabled ) { + return; + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_UP: + case $.ui.keyCode.PAGE_DOWN: + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + ret = false; + if ( !self._keySliding ) { + self._keySliding = true; + $( this ).addClass( "ui-state-active" ); + allowed = self._start( event, index ); + if ( allowed === false ) { + return; + } + } + break; + } + + step = self.options.step; + if ( self.options.values && self.options.values.length ) { + curVal = newVal = self.values( index ); + } else { + curVal = newVal = self.value(); + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + newVal = self._valueMin(); + break; + case $.ui.keyCode.END: + newVal = self._valueMax(); + break; + case $.ui.keyCode.PAGE_UP: + newVal = curVal + ( (self._valueMax() - self._valueMin()) / numPages ); + break; + case $.ui.keyCode.PAGE_DOWN: + newVal = curVal - ( (self._valueMax() - self._valueMin()) / numPages ); + break; + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + if ( curVal === self._valueMax() ) { + return; + } + newVal = curVal + step; + break; + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + if ( curVal === self._valueMin() ) { + return; + } + newVal = curVal - step; + break; + } + + self._slide( event, index, newVal ); + + return ret; + + }) + .keyup(function( event ) { + var index = $( this ).data( "index.ui-slider-handle" ); + + if ( self._keySliding ) { + self._keySliding = false; + self._stop( event, index ); + self._change( event, index ); + $( this ).removeClass( "ui-state-active" ); + } + + }); + + this._refreshValue(); + + this._animateOff = false; + }, + + destroy: function() { + this.handles.remove(); + this.range.remove(); + + this.element + .removeClass( "ui-slider" + + " ui-slider-horizontal" + + " ui-slider-vertical" + + " ui-slider-disabled" + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ) + .removeData( "slider" ) + .unbind( ".slider" ); + + this._mouseDestroy(); + + return this; + }, + + _mouseCapture: function( event ) { + var o = this.options, + position, + normValue, + distance, + closestHandle, + self, + index, + allowed, + offset, + mouseOverHandle; + + if ( o.disabled ) { + return false; + } + + this.elementSize = { + width: this.element.outerWidth(), + height: this.element.outerHeight() + }; + this.elementOffset = this.element.offset(); + + position = { x: event.pageX, y: event.pageY }; + normValue = this._normValueFromMouse( position ); + distance = this._valueMax() - this._valueMin() + 1; + self = this; + this.handles.each(function( i ) { + var thisDistance = Math.abs( normValue - self.values(i) ); + if ( distance > thisDistance ) { + distance = thisDistance; + closestHandle = $( this ); + index = i; + } + }); + + // workaround for bug #3736 (if both handles of a range are at 0, + // the first is always used as the one with least distance, + // and moving it is obviously prevented by preventing negative ranges) + if( o.range === true && this.values(1) === o.min ) { + index += 1; + closestHandle = $( this.handles[index] ); + } + + allowed = this._start( event, index ); + if ( allowed === false ) { + return false; + } + this._mouseSliding = true; + + self._handleIndex = index; + + closestHandle + .addClass( "ui-state-active" ) + .focus(); + + offset = closestHandle.offset(); + mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" ); + this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { + left: event.pageX - offset.left - ( closestHandle.width() / 2 ), + top: event.pageY - offset.top - + ( closestHandle.height() / 2 ) - + ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) - + ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) + + ( parseInt( closestHandle.css("marginTop"), 10 ) || 0) + }; + + normValue = this._normValueFromMouse( position ); + this._slide( event, index, normValue ); + this._animateOff = true; + return true; + }, + + _mouseStart: function( event ) { + return true; + }, + + _mouseDrag: function( event ) { + var position = { x: event.pageX, y: event.pageY }, + normValue = this._normValueFromMouse( position ); + + this._slide( event, this._handleIndex, normValue ); + + return false; + }, + + _mouseStop: function( event ) { + this.handles.removeClass( "ui-state-active" ); + this._mouseSliding = false; + + this._stop( event, this._handleIndex ); + this._change( event, this._handleIndex ); + + this._handleIndex = null; + this._clickOffset = null; + this._animateOff = false; + + return false; + }, + + _detectOrientation: function() { + this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; + }, + + _normValueFromMouse: function( position ) { + var pixelTotal, + pixelMouse, + percentMouse, + valueTotal, + valueMouse; + + if ( this.orientation === "horizontal" ) { + pixelTotal = this.elementSize.width; + pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 ); + } else { + pixelTotal = this.elementSize.height; + pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 ); + } + + percentMouse = ( pixelMouse / pixelTotal ); + if ( percentMouse > 1 ) { + percentMouse = 1; + } + if ( percentMouse < 0 ) { + percentMouse = 0; + } + if ( this.orientation === "vertical" ) { + percentMouse = 1 - percentMouse; + } + + valueTotal = this._valueMax() - this._valueMin(); + valueMouse = this._valueMin() + percentMouse * valueTotal; + + return this._trimAlignValue( valueMouse ); + }, + + _start: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + return this._trigger( "start", event, uiHash ); + }, + + _slide: function( event, index, newVal ) { + var otherVal, + newValues, + allowed; + + if ( this.options.values && this.options.values.length ) { + otherVal = this.values( index ? 0 : 1 ); + + if ( ( this.options.values.length === 2 && this.options.range === true ) && + ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) ) + ) { + newVal = otherVal; + } + + if ( newVal !== this.values( index ) ) { + newValues = this.values(); + newValues[ index ] = newVal; + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal, + values: newValues + } ); + otherVal = this.values( index ? 0 : 1 ); + if ( allowed !== false ) { + this.values( index, newVal, true ); + } + } + } else { + if ( newVal !== this.value() ) { + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal + } ); + if ( allowed !== false ) { + this.value( newVal ); + } + } + } + }, + + _stop: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "stop", event, uiHash ); + }, + + _change: function( event, index ) { + if ( !this._keySliding && !this._mouseSliding ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "change", event, uiHash ); + } + }, + + value: function( newValue ) { + if ( arguments.length ) { + this.options.value = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, 0 ); + } + + return this._value(); + }, + + values: function( index, newValue ) { + var vals, + newValues, + i; + + if ( arguments.length > 1 ) { + this.options.values[ index ] = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, index ); + } + + if ( arguments.length ) { + if ( $.isArray( arguments[ 0 ] ) ) { + vals = this.options.values; + newValues = arguments[ 0 ]; + for ( i = 0; i < vals.length; i += 1 ) { + vals[ i ] = this._trimAlignValue( newValues[ i ] ); + this._change( null, i ); + } + this._refreshValue(); + } else { + if ( this.options.values && this.options.values.length ) { + return this._values( index ); + } else { + return this.value(); + } + } + } else { + return this._values(); + } + }, + + _setOption: function( key, value ) { + var i, + valsLength = 0; + + if ( $.isArray( this.options.values ) ) { + valsLength = this.options.values.length; + } + + $.Widget.prototype._setOption.apply( this, arguments ); + + switch ( key ) { + case "disabled": + if ( value ) { + this.handles.filter( ".ui-state-focus" ).blur(); + this.handles.removeClass( "ui-state-hover" ); + this.handles.attr( "disabled", "disabled" ); + this.element.addClass( "ui-disabled" ); + } else { + this.handles.removeAttr( "disabled" ); + this.element.removeClass( "ui-disabled" ); + } + break; + case "orientation": + this._detectOrientation(); + this.element + .removeClass( "ui-slider-horizontal ui-slider-vertical" ) + .addClass( "ui-slider-" + this.orientation ); + this._refreshValue(); + break; + case "value": + this._animateOff = true; + this._refreshValue(); + this._change( null, 0 ); + this._animateOff = false; + break; + case "values": + this._animateOff = true; + this._refreshValue(); + for ( i = 0; i < valsLength; i += 1 ) { + this._change( null, i ); + } + this._animateOff = false; + break; + } + }, + + //internal value getter + // _value() returns value trimmed by min and max, aligned by step + _value: function() { + var val = this.options.value; + val = this._trimAlignValue( val ); + + return val; + }, + + //internal values getter + // _values() returns array of values trimmed by min and max, aligned by step + // _values( index ) returns single value trimmed by min and max, aligned by step + _values: function( index ) { + var val, + vals, + i; + + if ( arguments.length ) { + val = this.options.values[ index ]; + val = this._trimAlignValue( val ); + + return val; + } else { + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and then returned + vals = this.options.values.slice(); + for ( i = 0; i < vals.length; i+= 1) { + vals[ i ] = this._trimAlignValue( vals[ i ] ); + } + + return vals; + } + }, + + // returns the step-aligned value that val is closest to, between (inclusive) min and max + _trimAlignValue: function( val ) { + if ( val < this._valueMin() ) { + return this._valueMin(); + } + if ( val > this._valueMax() ) { + return this._valueMax(); + } + var step = this.options.step, + valModStep = val % step, + alignValue = val - valModStep; + + if ( valModStep >= ( step / 2 ) ) { + alignValue += step; + } + + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see #4124) + return parseFloat( alignValue.toFixed(5) ); + }, + + _valueMin: function() { + return this.options.min; + }, + + _valueMax: function() { + return this.options.max; + }, + + _refreshValue: function() { + var oRange = this.options.range, + o = this.options, + self = this, + animate = ( !this._animateOff ) ? o.animate : false, + valPercent, + _set = {}, + lastValPercent, + value, + valueMin, + valueMax; + + if ( this.options.values && this.options.values.length ) { + this.handles.each(function( i, j ) { + valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100; + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + if ( self.options.range === true ) { + if ( self.orientation === "horizontal" ) { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } else { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + lastValPercent = valPercent; + }); + } else { + value = this.value(); + valueMin = this._valueMin(); + valueMax = this._valueMax(); + valPercent = ( valueMax !== valueMin ) ? + ( value - valueMin ) / ( valueMax - valueMin ) * 100 : + 0; + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + + if ( oRange === "min" && this.orientation === "horizontal" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "horizontal" ) { + this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + if ( oRange === "min" && this.orientation === "vertical" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "vertical" ) { + this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + +}); + +$.extend( $.ui.slider, { + version: "1.8.1" +}); + +}(jQuery)); +/* + * jQuery UI Tabs 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +var tabId = 0, + listId = 0; + +$.widget("ui.tabs", { + options: { + add: null, + ajaxOptions: null, + cache: false, + cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } + collapsible: false, + disable: null, + disabled: [], + enable: null, + event: 'click', + fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } + idPrefix: 'ui-tabs-', + load: null, + panelTemplate: '<div></div>', + remove: null, + select: null, + show: null, + spinner: '<em>Loading&#8230;</em>', + tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>' + }, + _create: function() { + this._tabify(true); + }, + + _setOption: function(key, value) { + if (key == 'selected') { + if (this.options.collapsible && value == this.options.selected) { + return; + } + this.select(value); + } + else { + this.options[key] = value; + this._tabify(); + } + }, + + _tabId: function(a) { + return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') || + this.options.idPrefix + (++tabId); + }, + + _sanitizeSelector: function(hash) { + return hash.replace(/:/g, '\\:'); // we need this because an id may contain a ":" + }, + + _cookie: function() { + var cookie = this.cookie || (this.cookie = this.options.cookie.name || 'ui-tabs-' + (++listId)); + return $.cookie.apply(null, [cookie].concat($.makeArray(arguments))); + }, + + _ui: function(tab, panel) { + return { + tab: tab, + panel: panel, + index: this.anchors.index(tab) + }; + }, + + _cleanup: function() { + // restore all former loading tabs labels + this.lis.filter('.ui-state-processing').removeClass('ui-state-processing') + .find('span:data(label.tabs)') + .each(function() { + var el = $(this); + el.html(el.data('label.tabs')).removeData('label.tabs'); + }); + }, + + _tabify: function(init) { + + this.list = this.element.find('ol,ul').eq(0); + this.lis = $('li:has(a[href])', this.list); + this.anchors = this.lis.map(function() { return $('a', this)[0]; }); + this.panels = $([]); + + var self = this, o = this.options; + + var fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash + this.anchors.each(function(i, a) { + var href = $(a).attr('href'); + + // For dynamically created HTML that contains a hash as href IE < 8 expands + // such href to the full page url with hash and then misinterprets tab as ajax. + // Same consideration applies for an added tab with a fragment identifier + // since a[href=#fragment-identifier] does unexpectedly not match. + // Thus normalize href attribute... + var hrefBase = href.split('#')[0], baseEl; + if (hrefBase && (hrefBase === location.toString().split('#')[0] || + (baseEl = $('base')[0]) && hrefBase === baseEl.href)) { + href = a.hash; + a.href = href; + } + + // inline tab + if (fragmentId.test(href)) { + self.panels = self.panels.add(self._sanitizeSelector(href)); + } + + // remote tab + else if (href != '#') { // prevent loading the page itself if href is just "#" + $.data(a, 'href.tabs', href); // required for restore on destroy + + // TODO until #3808 is fixed strip fragment identifier from url + // (IE fails to load from such url) + $.data(a, 'load.tabs', href.replace(/#.*$/, '')); // mutable data + + var id = self._tabId(a); + a.href = '#' + id; + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id).addClass('ui-tabs-panel ui-widget-content ui-corner-bottom') + .insertAfter(self.panels[i - 1] || self.list); + $panel.data('destroy.tabs', true); + } + self.panels = self.panels.add($panel); + } + + // invalid tab href + else { + o.disabled.push(i); + } + }); + + // initialization from scratch + if (init) { + + // attach necessary classes for styling + this.element.addClass('ui-tabs ui-widget ui-widget-content ui-corner-all'); + this.list.addClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all'); + this.lis.addClass('ui-state-default ui-corner-top'); + this.panels.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom'); + + // Selected tab + // use "selected" option or try to retrieve: + // 1. from fragment identifier in url + // 2. from cookie + // 3. from selected class attribute on <li> + if (o.selected === undefined) { + if (location.hash) { + this.anchors.each(function(i, a) { + if (a.hash == location.hash) { + o.selected = i; + return false; // break + } + }); + } + if (typeof o.selected != 'number' && o.cookie) { + o.selected = parseInt(self._cookie(), 10); + } + if (typeof o.selected != 'number' && this.lis.filter('.ui-tabs-selected').length) { + o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected')); + } + o.selected = o.selected || (this.lis.length ? 0 : -1); + } + else if (o.selected === null) { // usage of null is deprecated, TODO remove in next release + o.selected = -1; + } + + // sanity check - default to first tab... + o.selected = ((o.selected >= 0 && this.anchors[o.selected]) || o.selected < 0) ? o.selected : 0; + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + // A selected tab cannot become disabled. + o.disabled = $.unique(o.disabled.concat( + $.map(this.lis.filter('.ui-state-disabled'), + function(n, i) { return self.lis.index(n); } ) + )).sort(); + + if ($.inArray(o.selected, o.disabled) != -1) { + o.disabled.splice($.inArray(o.selected, o.disabled), 1); + } + + // highlight selected tab + this.panels.addClass('ui-tabs-hide'); + this.lis.removeClass('ui-tabs-selected ui-state-active'); + if (o.selected >= 0 && this.anchors.length) { // check for length avoids error when initializing empty list + this.panels.eq(o.selected).removeClass('ui-tabs-hide'); + this.lis.eq(o.selected).addClass('ui-tabs-selected ui-state-active'); + + // seems to be expected behavior that the show callback is fired + self.element.queue("tabs", function() { + self._trigger('show', null, self._ui(self.anchors[o.selected], self.panels[o.selected])); + }); + + this.load(o.selected); + } + + // clean up to avoid memory leaks in certain versions of IE 6 + $(window).bind('unload', function() { + self.lis.add(self.anchors).unbind('.tabs'); + self.lis = self.anchors = self.panels = null; + }); + + } + // update selected after add/remove + else { + o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected')); + } + + // update collapsible + this.element[o.collapsible ? 'addClass' : 'removeClass']('ui-tabs-collapsible'); + + // set or update cookie after init and add/remove respectively + if (o.cookie) { + this._cookie(o.selected, o.cookie); + } + + // disable tabs + for (var i = 0, li; (li = this.lis[i]); i++) { + $(li)[$.inArray(i, o.disabled) != -1 && + !$(li).hasClass('ui-tabs-selected') ? 'addClass' : 'removeClass']('ui-state-disabled'); + } + + // reset cache if switching from cached to not cached + if (o.cache === false) { + this.anchors.removeData('cache.tabs'); + } + + // remove all handlers before, tabify may run on existing tabs after add or option change + this.lis.add(this.anchors).unbind('.tabs'); + + if (o.event != 'mouseover') { + var addState = function(state, el) { + if (el.is(':not(.ui-state-disabled)')) { + el.addClass('ui-state-' + state); + } + }; + var removeState = function(state, el) { + el.removeClass('ui-state-' + state); + }; + this.lis.bind('mouseover.tabs', function() { + addState('hover', $(this)); + }); + this.lis.bind('mouseout.tabs', function() { + removeState('hover', $(this)); + }); + this.anchors.bind('focus.tabs', function() { + addState('focus', $(this).closest('li')); + }); + this.anchors.bind('blur.tabs', function() { + removeState('focus', $(this).closest('li')); + }); + } + + // set up animations + var hideFx, showFx; + if (o.fx) { + if ($.isArray(o.fx)) { + hideFx = o.fx[0]; + showFx = o.fx[1]; + } + else { + hideFx = showFx = o.fx; + } + } + + // Reset certain styles left over from animation + // and prevent IE's ClearType bug... + function resetStyle($el, fx) { + $el.css({ display: '' }); + if (!$.support.opacity && fx.opacity) { + $el[0].style.removeAttribute('filter'); + } + } + + // Show a tab... + var showTab = showFx ? + function(clicked, $show) { + $(clicked).closest('li').addClass('ui-tabs-selected ui-state-active'); + $show.hide().removeClass('ui-tabs-hide') // avoid flicker that way + .animate(showFx, showFx.duration || 'normal', function() { + resetStyle($show, showFx); + self._trigger('show', null, self._ui(clicked, $show[0])); + }); + } : + function(clicked, $show) { + $(clicked).closest('li').addClass('ui-tabs-selected ui-state-active'); + $show.removeClass('ui-tabs-hide'); + self._trigger('show', null, self._ui(clicked, $show[0])); + }; + + // Hide a tab, $show is optional... + var hideTab = hideFx ? + function(clicked, $hide) { + $hide.animate(hideFx, hideFx.duration || 'normal', function() { + self.lis.removeClass('ui-tabs-selected ui-state-active'); + $hide.addClass('ui-tabs-hide'); + resetStyle($hide, hideFx); + self.element.dequeue("tabs"); + }); + } : + function(clicked, $hide, $show) { + self.lis.removeClass('ui-tabs-selected ui-state-active'); + $hide.addClass('ui-tabs-hide'); + self.element.dequeue("tabs"); + }; + + // attach tab event handler, unbind to avoid duplicates from former tabifying... + this.anchors.bind(o.event + '.tabs', function() { + var el = this, $li = $(this).closest('li'), $hide = self.panels.filter(':not(.ui-tabs-hide)'), + $show = $(self._sanitizeSelector(this.hash)); + + // If tab is already selected and not collapsible or tab disabled or + // or is already loading or click callback returns false stop here. + // Check if click handler returns false last so that it is not executed + // for a disabled or loading tab! + if (($li.hasClass('ui-tabs-selected') && !o.collapsible) || + $li.hasClass('ui-state-disabled') || + $li.hasClass('ui-state-processing') || + self._trigger('select', null, self._ui(this, $show[0])) === false) { + this.blur(); + return false; + } + + o.selected = self.anchors.index(this); + + self.abort(); + + // if tab may be closed + if (o.collapsible) { + if ($li.hasClass('ui-tabs-selected')) { + o.selected = -1; + + if (o.cookie) { + self._cookie(o.selected, o.cookie); + } + + self.element.queue("tabs", function() { + hideTab(el, $hide); + }).dequeue("tabs"); + + this.blur(); + return false; + } + else if (!$hide.length) { + if (o.cookie) { + self._cookie(o.selected, o.cookie); + } + + self.element.queue("tabs", function() { + showTab(el, $show); + }); + + self.load(self.anchors.index(this)); // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171 + + this.blur(); + return false; + } + } + + if (o.cookie) { + self._cookie(o.selected, o.cookie); + } + + // show new tab + if ($show.length) { + if ($hide.length) { + self.element.queue("tabs", function() { + hideTab(el, $hide); + }); + } + self.element.queue("tabs", function() { + showTab(el, $show); + }); + + self.load(self.anchors.index(this)); + } + else { + throw 'jQuery UI Tabs: Mismatching fragment identifier.'; + } + + // Prevent IE from keeping other link focussed when using the back button + // and remove dotted border from clicked link. This is controlled via CSS + // in modern browsers; blur() removes focus from address bar in Firefox + // which can become a usability and annoying problem with tabs('rotate'). + if ($.browser.msie) { + this.blur(); + } + + }); + + // disable click in any case + this.anchors.bind('click.tabs', function(){return false;}); + + }, + + destroy: function() { + var o = this.options; + + this.abort(); + + this.element.unbind('.tabs') + .removeClass('ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible') + .removeData('tabs'); + + this.list.removeClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all'); + + this.anchors.each(function() { + var href = $.data(this, 'href.tabs'); + if (href) { + this.href = href; + } + var $this = $(this).unbind('.tabs'); + $.each(['href', 'load', 'cache'], function(i, prefix) { + $this.removeData(prefix + '.tabs'); + }); + }); + + this.lis.unbind('.tabs').add(this.panels).each(function() { + if ($.data(this, 'destroy.tabs')) { + $(this).remove(); + } + else { + $(this).removeClass([ + 'ui-state-default', + 'ui-corner-top', + 'ui-tabs-selected', + 'ui-state-active', + 'ui-state-hover', + 'ui-state-focus', + 'ui-state-disabled', + 'ui-tabs-panel', + 'ui-widget-content', + 'ui-corner-bottom', + 'ui-tabs-hide' + ].join(' ')); + } + }); + + if (o.cookie) { + this._cookie(null, o.cookie); + } + + return this; + }, + + add: function(url, label, index) { + if (index === undefined) { + index = this.anchors.length; // append by default + } + + var self = this, o = this.options, + $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)), + id = !url.indexOf('#') ? url.replace('#', '') : this._tabId($('a', $li)[0]); + + $li.addClass('ui-state-default ui-corner-top').data('destroy.tabs', true); + + // try to find an existing element before creating a new one + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id).data('destroy.tabs', true); + } + $panel.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide'); + + if (index >= this.lis.length) { + $li.appendTo(this.list); + $panel.appendTo(this.list[0].parentNode); + } + else { + $li.insertBefore(this.lis[index]); + $panel.insertBefore(this.panels[index]); + } + + o.disabled = $.map(o.disabled, + function(n, i) { return n >= index ? ++n : n; }); + + this._tabify(); + + if (this.anchors.length == 1) { // after tabify + o.selected = 0; + $li.addClass('ui-tabs-selected ui-state-active'); + $panel.removeClass('ui-tabs-hide'); + this.element.queue("tabs", function() { + self._trigger('show', null, self._ui(self.anchors[0], self.panels[0])); + }); + + this.load(0); + } + + // callback + this._trigger('add', null, this._ui(this.anchors[index], this.panels[index])); + return this; + }, + + remove: function(index) { + var o = this.options, $li = this.lis.eq(index).remove(), + $panel = this.panels.eq(index).remove(); + + // If selected tab was removed focus tab to the right or + // in case the last tab was removed the tab to the left. + if ($li.hasClass('ui-tabs-selected') && this.anchors.length > 1) { + this.select(index + (index + 1 < this.anchors.length ? 1 : -1)); + } + + o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), + function(n, i) { return n >= index ? --n : n; }); + + this._tabify(); + + // callback + this._trigger('remove', null, this._ui($li.find('a')[0], $panel[0])); + return this; + }, + + enable: function(index) { + var o = this.options; + if ($.inArray(index, o.disabled) == -1) { + return; + } + + this.lis.eq(index).removeClass('ui-state-disabled'); + o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); + + // callback + this._trigger('enable', null, this._ui(this.anchors[index], this.panels[index])); + return this; + }, + + disable: function(index) { + var self = this, o = this.options; + if (index != o.selected) { // cannot disable already selected tab + this.lis.eq(index).addClass('ui-state-disabled'); + + o.disabled.push(index); + o.disabled.sort(); + + // callback + this._trigger('disable', null, this._ui(this.anchors[index], this.panels[index])); + } + + return this; + }, + + select: function(index) { + if (typeof index == 'string') { + index = this.anchors.index(this.anchors.filter('[href$=' + index + ']')); + } + else if (index === null) { // usage of null is deprecated, TODO remove in next release + index = -1; + } + if (index == -1 && this.options.collapsible) { + index = this.options.selected; + } + + this.anchors.eq(index).trigger(this.options.event + '.tabs'); + return this; + }, + + load: function(index) { + var self = this, o = this.options, a = this.anchors.eq(index)[0], url = $.data(a, 'load.tabs'); + + this.abort(); + + // not remote or from cache + if (!url || this.element.queue("tabs").length !== 0 && $.data(a, 'cache.tabs')) { + this.element.dequeue("tabs"); + return; + } + + // load remote from here on + this.lis.eq(index).addClass('ui-state-processing'); + + if (o.spinner) { + var span = $('span', a); + span.data('label.tabs', span.html()).html(o.spinner); + } + + this.xhr = $.ajax($.extend({}, o.ajaxOptions, { + url: url, + success: function(r, s) { + $(self._sanitizeSelector(a.hash)).html(r); + + // take care of tab labels + self._cleanup(); + + if (o.cache) { + $.data(a, 'cache.tabs', true); // if loaded once do not load them again + } + + // callbacks + self._trigger('load', null, self._ui(self.anchors[index], self.panels[index])); + try { + o.ajaxOptions.success(r, s); + } + catch (e) {} + }, + error: function(xhr, s, e) { + // take care of tab labels + self._cleanup(); + + // callbacks + self._trigger('load', null, self._ui(self.anchors[index], self.panels[index])); + try { + // Passing index avoid a race condition when this method is + // called after the user has selected another tab. + // Pass the anchor that initiated this request allows + // loadError to manipulate the tab content panel via $(a.hash) + o.ajaxOptions.error(xhr, s, index, a); + } + catch (e) {} + } + })); + + // last, so that load event is fired before show... + self.element.dequeue("tabs"); + + return this; + }, + + abort: function() { + // stop possibly running animations + this.element.queue([]); + this.panels.stop(false, true); + + // "tabs" queue must not contain more than two elements, + // which are the callbacks for the latest clicked tab... + this.element.queue("tabs", this.element.queue("tabs").splice(-2, 2)); + + // terminate pending requests from other tabs + if (this.xhr) { + this.xhr.abort(); + delete this.xhr; + } + + // take care of tab labels + this._cleanup(); + return this; + }, + + url: function(index, url) { + this.anchors.eq(index).removeData('cache.tabs').data('load.tabs', url); + return this; + }, + + length: function() { + return this.anchors.length; + } + +}); + +$.extend($.ui.tabs, { + version: '1.8.1' +}); + +/* + * Tabs Extensions + */ + +/* + * Rotate + */ +$.extend($.ui.tabs.prototype, { + rotation: null, + rotate: function(ms, continuing) { + + var self = this, o = this.options; + + var rotate = self._rotate || (self._rotate = function(e) { + clearTimeout(self.rotation); + self.rotation = setTimeout(function() { + var t = o.selected; + self.select( ++t < self.anchors.length ? t : 0 ); + }, ms); + + if (e) { + e.stopPropagation(); + } + }); + + var stop = self._unrotate || (self._unrotate = !continuing ? + function(e) { + if (e.clientX) { // in case of a true click + self.rotate(null); + } + } : + function(e) { + t = o.selected; + rotate(); + }); + + // start rotation + if (ms) { + this.element.bind('tabsshow', rotate); + this.anchors.bind(o.event + '.tabs', stop); + rotate(); + } + // stop rotation + else { + clearTimeout(self.rotation); + this.element.unbind('tabsshow', rotate); + this.anchors.unbind(o.event + '.tabs', stop); + delete this._rotate; + delete this._unrotate; + } + + return this; + } +}); + +})(jQuery); +/* + * jQuery UI Datepicker 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * jquery.ui.core.js + */ + +(function($) { // hide the namespace + +$.extend($.ui, { datepicker: { version: "1.8.1" } }); + +var PROP_NAME = 'datepicker'; +var dpuuid = new Date().getTime(); + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._keyEvent = false; // If the last event was a key event + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + closeText: 'Done', // Display text for close link + prevText: 'Prev', // Display text for previous month link + nextText: 'Next', // Display text for next month link + currentText: 'Today', // Display text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + weekHeader: 'Wk', // Column header for week of the year + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: '' // Additional text to append to the year in the month headers + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'show', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: 'c-10:c+10', // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: '_default', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '', // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false // True to size the input for the date format, false to leave as is + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>'); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function() { + return this.dpDiv; + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + var inlineSettings = null; + for (var attrName in this._defaults) { + var attrValue = target.getAttribute('date:' + attrName); + if (attrValue) { + inlineSettings = inlineSettings || {}; + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + var nodeName = target.nodeName.toLowerCase(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) + target.id = 'dp' + (++this.uuid); + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\$1'); // escape jQuery meta chars + return {id: id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + inst.append = $([]); + inst.trigger = $([]); + if (input.hasClass(this.markerClassName)) + return; + this._attachments(input, inst); + input.addClass(this.markerClassName).keydown(this._doKeyDown). + keypress(this._doKeyPress).keyup(this._doKeyUp). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + this._autoSize(inst); + $.data(target, PROP_NAME, inst); + }, + + /* Make attachments based on settings. */ + _attachments: function(input, inst) { + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (inst.append) + inst.append.remove(); + if (appendText) { + inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>'); + input[isRTL ? 'before' : 'after'](inst.append); + } + input.unbind('focus', this._showDatepicker); + if (inst.trigger) + inst.trigger.remove(); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + inst.trigger = $(this._get(inst, 'buttonImageOnly') ? + $('<img/>').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('<button type="button"></button>').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('<img/>').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0]) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(input[0]); + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, 'autoSize') && !inst.inline) { + var date = new Date(2009, 12 - 1, 20); // Ensure double digits + var dateFormat = this._get(inst, 'dateFormat'); + if (dateFormat.match(/[DM]/)) { + var findMax = function(names) { + var max = 0; + var maxI = 0; + for (var i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + 'monthNames' : 'monthNamesShort')))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay()); + } + inst.input.attr('size', this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) + return; + divSpan.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param date string or Date - the initial date to display + @param onSelect function - the function to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + var id = 'dp' + (++this.uuid); + this._dialogInput = $('<input type="text" id="' + id + + '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor == Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = document.documentElement.clientWidth; + var browserHeight = document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress). + unbind('keyup', this._doKeyUp); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = false; + inst.trigger.filter('button'). + each(function() { this.disabled = false; }).end(). + filter('img').css({opacity: '1.0', cursor: ''}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().removeClass('ui-state-disabled'); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = true; + inst.trigger.filter('button'). + each(function() { this.disabled = true; }).end(). + filter('img').css({opacity: '0.5', cursor: 'default'}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().addClass('ui-state-disabled'); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Retrieve the instance data for the target control. + @param target element - the target input field or division or span + @return object - the associated instance data + @throws error if a jQuery problem getting data */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw 'Missing instance data for this datepicker'; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or retrieve, + when retrieving also 'all' for all instance settings or + 'defaults' for all global defaults + @param value any - the new value for the setting + (omit if above is an object or to retrieve a value) */ + _optionDatepicker: function(target, name, value) { + var inst = this._getInst(target); + if (arguments.length == 2 && typeof name == 'string') { + return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) : + (inst ? (name == 'all' ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst) { + if (this._curInst == inst) { + this._hideDatepicker(); + } + var date = this._getDateDatepicker(target, true); + extendRemove(inst.settings, settings); + this._attachments($(target), inst); + this._autoSize(inst); + this._setDateDatepicker(target, date); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + @param target element - the target input field or division or span */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @param noDefault boolean - true if no default date is to be used + @return Date - the current date */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) + this._setDateFromField(inst, noDefault); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var inst = $.datepicker._getInst(event.target); + var handled = true; + var isRTL = inst.dpDiv.is('.ui-datepicker-rtl'); + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: var sel = $('td.' + $.datepicker._dayOverClass, inst.dpDiv). + add($('td.' + $.datepicker._currentClass, inst.dpDiv)); + if (sel[0]) + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + else + $.datepicker._hideDatepicker(); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target); + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target); + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D'); + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D'); + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else { + handled = false; + } + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var inst = $.datepicker._getInst(event.target); + if ($.datepicker._get(inst, 'constrainInput')) { + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode); + return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var inst = $.datepicker._getInst(event.target); + if (inst.input.val() != inst.lastVal) { + try { + var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (event) { + $.datepicker.log(event); + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst != inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + } + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim'); + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._datepickerShowing = true; + var borders = $.datepicker._getBorders(inst.dpDiv); + inst.dpDiv.find('iframe.ui-datepicker-cover'). // IE6- only + css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}); + }; + inst.dpDiv.zIndex($(input).zIndex()+1); + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess); + if (!showAnim || !duration) + postProcess(); + if (inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var self = this; + var borders = $.datepicker._getBorders(inst.dpDiv); + inst.dpDiv.empty().append(this._generateHTML(inst)) + .find('iframe.ui-datepicker-cover') // IE6- only + .css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}) + .end() + .find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a') + .bind('mouseout', function(){ + $(this).removeClass('ui-state-hover'); + if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover'); + if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover'); + }) + .bind('mouseover', function(){ + if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) { + $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover'); + if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover'); + if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover'); + } + }) + .end() + .find('.' + this._dayOverClass + ' a') + .trigger('mouseover') + .end(); + var numMonths = this._getNumberOfMonths(inst); + var cols = numMonths[1]; + var width = 17; + if (cols > 1) + inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em'); + else + inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width(''); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input && + inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + }, + + /* Retrieve the size of left and top borders for an element. + @param elem (jQuery object) the element of interest + @return (number[2]) the left and top borders */ + _getBorders: function(elem) { + var convert = function(value) { + return {thin: 1, medium: 2, thick: 3}[value] || value; + }; + return [parseFloat(convert(elem.css('border-left-width'))), + parseFloat(convert(elem.css('border-top-width')))]; + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(); + var dpHeight = inst.dpDiv.outerHeight(); + var inputWidth = inst.input ? inst.input.outerWidth() : 0; + var inputHeight = inst.input ? inst.input.outerHeight() : 0; + var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft(); + var viewHeight = document.documentElement.clientHeight + $(document).scrollTop(); + + offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var inst = this._getInst(obj); + var isRTL = this._get(inst, 'isRTL'); + while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) { + obj = obj[isRTL ? 'previousSibling' : 'nextSibling']; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker */ + _hideDatepicker: function(input) { + var inst = this._curInst; + if (!inst || (input && inst != $.data(input, PROP_NAME))) + return; + if (this._datepickerShowing) { + var showAnim = this._get(inst, 'showAnim'); + var duration = this._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + this._curInst = null; + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess); + if (!showAnim) + postProcess(); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar'); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if ($target[0].id != $.datepicker._mainDivId && + $target.parents('#' + $.datepicker._mainDivId).length == 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = this._getInst(target[0]); + inst._selectingMonthYear = false; + inst['selected' + (period == 'M' ? 'Month' : 'Year')] = + inst['draw' + (period == 'M' ? 'Month' : 'Year')] = + parseInt(select.options[select.selectedIndex].value,10); + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (inst.input && inst._selectingMonthYear && !$.browser.msie) + inst.input.focus(); + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var target = $(id); + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + var inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = this._getInst(target[0]); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input.focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat'); + var date = this._getDate(inst); + var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getTime()); + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var doy = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + lookAhead(match); + var size = (match == '@' ? 14 : (match == '!' ? 20 : + (match == 'y' ? 4 : (match == 'o' ? 3 : 2)))); + var digits = new RegExp('^\\d{1,' + size + '}'); + var num = value.substring(iValue).match(digits); + if (!num) + throw 'Missing number at position ' + iValue; + iValue += num[0].length; + return parseInt(num[0], 10); + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = (lookAhead(match) ? longNames : shortNames); + for (var i = 0; i < names.length; i++) { + if (value.substr(iValue, names[i].length) == names[i]) { + iValue += names[i].length; + return i + 1; + } + } + throw 'Unknown name at position ' + iValue; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'o': + doy = getNumber('o'); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case '!': + var date = new Date((getNumber('!') - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year == -1) + year = new Date().getFullYear(); + else if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + if (doy > -1) { + month = 1; + day = doy; + do { + var dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) + break; + month++; + day -= dim; + } while (true); + } + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/* + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + COOKIE: 'D, dd M yy', + ISO_8601: 'yy-mm-dd', + RFC_822: 'D, d M y', + RFC_850: 'DD, dd-M-y', + RFC_1036: 'D, d M y', + RFC_1123: 'D, d M yy', + RFC_2822: 'D, d M yy', + RSS: 'D, d M y', // RFC 822 + TICKS: '!', + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + o - day of year (no leading zeros) + oo - day of year (three digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + ! - Windows ticks (100ns since 01/01/0001) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value, len) { + var num = '' + value; + if (lookAhead(match)) + while (num.length < len) + num = '0' + num; + return num; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'o': + output += formatNumber('o', + (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case '!': + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() == inst.lastVal) { + return; + } + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.lastVal = inst.input ? inst.input.val() : null; + var date, defaultDate; + date = defaultDate = this._getDefaultDate(inst); + var settings = this._getFormatConfig(inst); + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + this.log(event); + dates = (noDefault ? '' : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, 'defaultDate'), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += parseInt(matches[1],10); break; + case 'w' : case 'W' : + day += parseInt(matches[1],10) * 7; break; + case 'm' : case 'M' : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + date = (date == null ? defaultDate : (typeof date == 'string' ? offsetString(date) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date))); + date = (date && date.toString() == 'Invalid Date' ? defaultDate : date); + if (date) { + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + } + return this._daylightSavingAdjust(date); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !(date); + var origMonth = inst.selectedMonth; + var origYear = inst.selectedYear; + date = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + inst.selectedDay = inst.currentDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear(); + if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange) + this._notifyChange(inst); + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? '' : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var isRTL = this._get(inst, 'isRTL'); + var showButtonPanel = this._get(inst, 'showButtonPanel'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var showCurrentAtPos = this._get(inst, 'showCurrentAtPos'); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth - showCurrentAtPos; + var drawYear = inst.drawYear; + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' + + ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>')); + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' + + ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>')); + var currentText = this._get(inst, 'currentText'); + var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : ''); + var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') + + (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._gotoToday(\'#' + inst.id + '\');"' + + '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : ''; + var firstDay = parseInt(this._get(inst, 'firstDay'),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + var showWeek = this._get(inst, 'showWeek'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var monthNamesShort = this._get(inst, 'monthNamesShort'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var selectOtherMonths = this._get(inst, 'selectOtherMonths'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var defaultDate = this._getDefaultDate(inst); + var html = ''; + for (var row = 0; row < numMonths[0]; row++) { + var group = ''; + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + var cornerClass = ' ui-corner-all'; + var calender = ''; + if (isMultiMonth) { + calender += '<div class="ui-datepicker-group'; + if (numMonths[1] > 1) + switch (col) { + case 0: calender += ' ui-datepicker-group-first'; + cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break; + case numMonths[1]-1: calender += ' ui-datepicker-group-last'; + cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break; + default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break; + } + calender += '">'; + } + calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' + + (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') + + (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + '</div><table class="ui-datepicker-calendar"><thead>' + + '<tr>'; + var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' + + '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>'; + } + calender += thead + '</tr></thead><tbody>'; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += '<tr>'; + var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' + + this._get(inst, 'calculateWeek')(printDate) + '</td>'); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += '<td class="' + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months + ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key + (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ? + // or defaultDate is current printedDate and defaultDate is selectedDate + ' ' + this._dayOverClass : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days + (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates + (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day + (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title + (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' + + inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions + (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months + (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' + + (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') + + (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day + (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months + '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + '</tr>'; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += '</tbody></table>' + (isMultiMonth ? '</div>' + + ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : ''); + group += calender; + } + html += group; + } + html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ? + '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : ''); + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + var changeMonth = this._get(inst, 'changeMonth'); + var changeYear = this._get(inst, 'changeYear'); + var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); + var html = '<div class="ui-datepicker-title">'; + var monthHtml = ''; + // month selection + if (secondary || !changeMonth) + monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>'; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + monthHtml += '<select class="ui-datepicker-month" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (var month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth())) + monthHtml += '<option value="' + month + '"' + + (month == drawMonth ? ' selected="selected"' : '') + + '>' + monthNamesShort[month] + '</option>'; + } + monthHtml += '</select>'; + } + if (!showMonthAfterYear) + html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : ''); + // year selection + if (secondary || !changeYear) + html += '<span class="ui-datepicker-year">' + drawYear + '</span>'; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var thisYear = new Date().getFullYear(); + var determineYear = function(value) { + var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + var year = determineYear(years[0]); + var endYear = Math.max(year, determineYear(years[1] || '')); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + html += '<select class="ui-datepicker-year" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (; year <= endYear; year++) { + html += '<option value="' + year + '"' + + (year == drawYear ? ' selected="selected"' : '') + + '>' + year + '</option>'; + } + html += '</select>'; + } + html += this._get(inst, 'yearSuffix'); + if (showMonthAfterYear) + html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml; + html += '</div>'; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._restrictMinMax(inst, + this._daylightSavingAdjust(new Date(year, month, day))); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + date = (minDate && date < minDate ? minDate : date); + date = (maxDate && date > maxDate ? maxDate : date); + return date; + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - new Date(year, month, 32).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime())); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick). + find('body').append($.datepicker.dpDiv); + $.datepicker.initialized = true; + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.8.1"; + +// Workaround for #4055 +// Add another global to avoid noConflict issues with inline event handlers +window['DP_jQuery_' + dpuuid] = $; + +})(jQuery); +/* + * jQuery UI Progressbar 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function( $ ) { + +$.widget( "ui.progressbar", { + options: { + value: 0 + }, + _create: function() { + this.element + .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) + .attr({ + role: "progressbar", + "aria-valuemin": this._valueMin(), + "aria-valuemax": this._valueMax(), + "aria-valuenow": this._value() + }); + + this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" ) + .appendTo( this.element ); + + this._refreshValue(); + }, + + destroy: function() { + this.element + .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) + .removeAttr( "role" ) + .removeAttr( "aria-valuemin" ) + .removeAttr( "aria-valuemax" ) + .removeAttr( "aria-valuenow" ); + + this.valueDiv.remove(); + + $.Widget.prototype.destroy.apply( this, arguments ); + }, + + value: function( newValue ) { + if ( newValue === undefined ) { + return this._value(); + } + + this._setOption( "value", newValue ); + return this; + }, + + _setOption: function( key, value ) { + switch ( key ) { + case "value": + this.options.value = value; + this._refreshValue(); + this._trigger( "change" ); + break; + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + _value: function() { + var val = this.options.value; + // normalize invalid value + if ( typeof val !== "number" ) { + val = 0; + } + if ( val < this._valueMin() ) { + val = this._valueMin(); + } + if ( val > this._valueMax() ) { + val = this._valueMax(); + } + + return val; + }, + + _valueMin: function() { + return 0; + }, + + _valueMax: function() { + return 100; + }, + + _refreshValue: function() { + var value = this.value(); + this.valueDiv + [ value === this._valueMax() ? "addClass" : "removeClass"]( "ui-corner-right" ) + .width( value + "%" ); + this.element.attr( "aria-valuenow", value ); + } +}); + +$.extend( $.ui.progressbar, { + version: "1.8.1" +}); + +})( jQuery ); +/* + * jQuery UI Effects 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +;jQuery.effects || (function($) { + +$.effects = {}; + + + +/******************************************************************************/ +/****************************** COLOR ANIMATIONS ******************************/ +/******************************************************************************/ + +// override the animation for color styles +$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', + 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], +function(i, attr) { + $.fx.step[attr] = function(fx) { + if (!fx.colorInit) { + fx.start = getColor(fx.elem, attr); + fx.end = getRGB(fx.end); + fx.colorInit = true; + } + + fx.elem.style[attr] = 'rgb(' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')'; + }; +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent']; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = $.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] +}; + + + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ + +var classAnimationActions = ['add', 'remove', 'toggle'], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +function getElementStyles() { + var style = document.defaultView + ? document.defaultView.getComputedStyle(this, null) + : this.currentStyle, + newStyle = {}, + key, + camelCase; + + // webkit enumerates style porperties + if (style && style.length && style[0] && style[style[0]]) { + var len = style.length; + while (len--) { + key = style[len]; + if (typeof style[key] == 'string') { + camelCase = key.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + newStyle[camelCase] = style[key]; + } + } + } else { + for (key in style) { + if (typeof style[key] === 'string') { + newStyle[key] = style[key]; + } + } + } + + return newStyle; +} + +function filterStyles(styles) { + var name, value; + for (name in styles) { + value = styles[name]; + if ( + // ignore null and undefined values + value == null || + // ignore functions (when does this occur?) + $.isFunction(value) || + // shorthand styles that need to be expanded + name in shorthandStyles || + // ignore scrollbars (break in IE) + (/scrollbar/).test(name) || + + // only colors or values that can be converted to numbers + (!(/color/i).test(name) && isNaN(parseFloat(value))) + ) { + delete styles[name]; + } + } + + return styles; +} + +function styleDifference(oldStyle, newStyle) { + var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459 + name; + + for (name in newStyle) { + if (oldStyle[name] != newStyle[name]) { + diff[name] = newStyle[name]; + } + } + + return diff; +} + +$.effects.animateClass = function(value, duration, easing, callback) { + if ($.isFunction(easing)) { + callback = easing; + easing = null; + } + + return this.each(function() { + + var that = $(this), + originalStyleAttr = that.attr('style') || ' ', + originalStyle = filterStyles(getElementStyles.call(this)), + newStyle, + className = that.attr('className'); + + $.each(classAnimationActions, function(i, action) { + if (value[action]) { + that[action + 'Class'](value[action]); + } + }); + newStyle = filterStyles(getElementStyles.call(this)); + that.attr('className', className); + + that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() { + $.each(classAnimationActions, function(i, action) { + if (value[action]) { that[action + 'Class'](value[action]); } + }); + // work around bug in IE by clearing the cssText before setting it + if (typeof that.attr('style') == 'object') { + that.attr('style').cssText = ''; + that.attr('style').cssText = originalStyleAttr; + } else { + that.attr('style', originalStyleAttr); + } + if (callback) { callback.apply(this, arguments); } + }); + }); +}; + +$.fn.extend({ + _addClass: $.fn.addClass, + addClass: function(classNames, speed, easing, callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + + _removeClass: $.fn.removeClass, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + + _toggleClass: $.fn.toggleClass, + toggleClass: function(classNames, force, speed, easing, callback) { + if ( typeof force == "boolean" || force === undefined ) { + if ( !speed ) { + // without speed parameter; + return this._toggleClass(classNames, force); + } else { + return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]); + } + } else { + // without switch parameter; + return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]); + } + }, + + switchClass: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + } +}); + + + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +$.extend($.effects, { + version: "1.8.1", + + // Saves a set of properties in a data storage + save: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); + } + }, + + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function(element) { + + // if the element is already wrapped, return it + if (element.parent().is('.ui-effects-wrapper')) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + 'float': element.css('float') + }, + wrapper = $('<div></div>') + .addClass('ui-effects-wrapper') + .css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0 + }); + + element.wrap(wrapper); + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if (element.css('position') == 'static') { + wrapper.css({ position: 'relative' }); + element.css({ position: 'relative' }); + } else { + $.extend(props, { + position: element.css('position'), + zIndex: element.css('z-index') + }); + $.each(['top', 'left', 'bottom', 'right'], function(i, pos) { + props[pos] = element.css(pos); + if (isNaN(parseInt(props[pos], 10))) { + props[pos] = 'auto'; + } + }); + element.css({position: 'relative', top: 0, left: 0 }); + } + + return wrapper.css(props).show(); + }, + + removeWrapper: function(element) { + if (element.parent().is('.ui-effects-wrapper')) + return element.parent().replaceWith(element); + return element; + }, + + setTransition: function(element, list, factor, value) { + value = value || {}; + $.each(list, function(i, x){ + unit = element.cssUnit(x); + if (unit[0] > 0) value[x] = unit[0] * factor + unit[1]; + }); + return value; + } +}); + + +function _normalizeArguments(effect, options, speed, callback) { + // shift params for method overloading + if (typeof effect == 'object') { + callback = options; + speed = null; + options = effect; + effect = options.effect; + } + if ($.isFunction(options)) { + callback = options; + speed = null; + options = {}; + } + if ($.isFunction(speed)) { + callback = speed; + speed = null; + } + if (typeof options == 'number' || $.fx.speeds[options]) { + callback = speed; + speed = options; + options = {}; + } + + options = options || {}; + + speed = speed || options.duration; + speed = $.fx.off ? 0 : typeof speed == 'number' + ? speed : $.fx.speeds[speed] || $.fx.speeds._default; + + callback = callback || options.complete; + + return [effect, options, speed, callback]; +} + +$.fn.extend({ + effect: function(effect, options, speed, callback) { + var args = _normalizeArguments.apply(this, arguments), + // TODO: make effects takes actual parameters instead of a hash + args2 = { + options: args[1], + duration: args[2], + callback: args[3] + }, + effectMethod = $.effects[effect]; + + return effectMethod && !$.fx.off ? effectMethod.call(this, args2) : this; + }, + + _show: $.fn.show, + show: function(speed) { + if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) { + return this._show.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'show'; + return this.effect.apply(this, args); + } + }, + + _hide: $.fn.hide, + hide: function(speed) { + if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) { + return this._hide.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'hide'; + return this.effect.apply(this, args); + } + }, + + // jQuery core overloads toggle and create _toggle + __toggle: $.fn.toggle, + toggle: function(speed) { + if (!speed || typeof speed == 'number' || $.fx.speeds[speed] || + typeof speed == 'boolean' || $.isFunction(speed)) { + return this.__toggle.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'toggle'; + return this.effect.apply(this, args); + } + }, + + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + + + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +$.easing.jswing = $.easing.swing; + +$.extend($.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert($.easing.default); + return $.easing[$.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); +/* + * jQuery UI Effects Blind 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.blind = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'vertical') ? 'height' : 'width'; + var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width(); + if(mode == 'show') wrapper.css(ref, 0); // Shift + + // Animation + var animation = {}; + animation[ref] = mode == 'show' ? distance : 0; + + // Animate + wrapper.animate(animation, o.duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Bounce 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.bounce = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'up'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 5; // Default # of times + var speed = o.duration || 250; // Default speed per bounce + if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + if (mode == 'hide') distance = distance / (times * 2); + if (mode != 'hide') times--; + + // Animate + if (mode == 'show') { // Show Bounce + var animation = {opacity: 1}; + animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation, speed / 2, o.options.easing); + distance = distance / 2; + times--; + }; + for (var i = 0; i < times; i++) { // Bounces + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing); + distance = (mode == 'hide') ? distance * 2 : distance / 2; + }; + if (mode == 'hide') { // Last Bounce + var animation = {opacity: 0}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + el.animate(animation, speed / 2, o.options.easing, function(){ + el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){ + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Clip 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.clip = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','height','width']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var animate = el[0].tagName == 'IMG' ? wrapper : el; + var ref = { + size: (direction == 'vertical') ? 'height' : 'width', + position: (direction == 'vertical') ? 'top' : 'left' + }; + var distance = (direction == 'vertical') ? animate.height() : animate.width(); + if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift + + // Animation + var animation = {}; + animation[ref.size] = mode == 'show' ? distance : 0; + animation[ref.position] = mode == 'show' ? 0 : distance / 2; + + // Animate + animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Drop 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.drop = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {opacity: mode == 'show' ? 1 : 0}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Explode 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.explode = function(o) { + + return this.queue(function() { + + var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + + o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode; + var el = $(this).show().css('visibility', 'hidden'); + var offset = el.offset(); + + //Substract the margins - not fixing the problem yet. + offset.top -= parseInt(el.css("marginTop"),10) || 0; + offset.left -= parseInt(el.css("marginLeft"),10) || 0; + + var width = el.outerWidth(true); + var height = el.outerHeight(true); + + for(var i=0;i<rows;i++) { // = + for(var j=0;j<cells;j++) { // || + el + .clone() + .appendTo('body') + .wrap('<div></div>') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j*(width/cells), + top: -i*(height/rows) + }) + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width/cells, + height: height/rows, + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0), + opacity: o.options.mode == 'show' ? 0 : 1 + }).animate({ + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)), + opacity: o.options.mode == 'show' ? 1 : 0 + }, o.duration || 500); + } + } + + // Set a timeout, to call the callback approx. when the other animations have finished + setTimeout(function() { + + o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide(); + if(o.callback) o.callback.apply(el[0]); // Callback + el.dequeue(); + + $('div.ui-effects-explode').remove(); + + }, o.duration || 500); + + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Fold 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.fold = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var size = o.options.size || 15; // Default fold size + var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value + var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2; + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var widthFirst = ((mode == 'show') != horizFirst); + var ref = widthFirst ? ['width', 'height'] : ['height', 'width']; + var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()]; + var percent = /([0-9]+)%/.exec(size); + if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1]; + if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift + + // Animation + var animation1 = {}, animation2 = {}; + animation1[ref[0]] = mode == 'show' ? distance[0] : size; + animation2[ref[1]] = mode == 'show' ? distance[1] : 0; + + // Animate + wrapper.animate(animation1, duration, o.options.easing) + .animate(animation2, duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Highlight 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.highlight = function(o) { + return this.queue(function() { + var elem = $(this), + props = ['backgroundImage', 'backgroundColor', 'opacity'], + mode = $.effects.setMode(elem, o.options.mode || 'show'), + animation = { + backgroundColor: elem.css('backgroundColor') + }; + + if (mode == 'hide') { + animation.opacity = 0; + } + + $.effects.save(elem, props); + elem + .show() + .css({ + backgroundImage: 'none', + backgroundColor: o.options.color || '#ffff99' + }) + .animate(animation, { + queue: false, + duration: o.duration, + easing: o.options.easing, + complete: function() { + (mode == 'hide' && elem.hide()); + $.effects.restore(elem, props); + (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter')); + (o.callback && o.callback.apply(this, arguments)); + elem.dequeue(); + } + }); + }); +}; + +})(jQuery); +/* + * jQuery UI Effects Pulsate 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.pulsate = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'show'); + times = ((o.options.times || 5) * 2) - 1; + duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2, + isVisible = elem.is(':visible'), + animateTo = 0; + + if (!isVisible) { + elem.css('opacity', 0).show(); + animateTo = 1; + } + + if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) { + times--; + } + + for (var i = 0; i < times; i++) { + elem.animate({ opacity: animateTo }, duration, o.options.easing); + animateTo = (animateTo + 1) % 2; + } + + elem.animate({ opacity: animateTo }, duration, o.options.easing, function() { + if (animateTo == 0) { + elem.hide(); + } + (o.callback && o.callback.apply(this, arguments)); + }); + + elem + .queue('fx', function() { elem.dequeue(); }) + .dequeue(); + }); +}; + +})(jQuery); +/* + * jQuery UI Effects Scale 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.puff = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'hide'), + percent = parseInt(o.options.percent, 10) || 150, + factor = percent / 100, + original = { height: elem.height(), width: elem.width() }; + + $.extend(o.options, { + fade: true, + mode: mode, + percent: mode == 'hide' ? percent : 100, + from: mode == 'hide' + ? original + : { + height: original.height * factor, + width: original.width * factor + } + }); + + elem.effect('scale', o.options, o.duration, o.callback); + elem.dequeue(); + }); +}; + +$.effects.scale = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent + var direction = o.options.direction || 'both'; // Set default axis + var origin = o.options.origin; // The origin of the scaling + if (mode != 'effect') { // Set default origin and restore for show/hide + options.origin = origin || ['middle','center']; + options.restore = true; + } + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state + + // Adjust + var factor = { // Set scaling factor + y: direction != 'horizontal' ? (percent / 100) : 1, + x: direction != 'vertical' ? (percent / 100) : 1 + }; + el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state + + if (o.options.fade) { // Fade option to support puff + if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;}; + if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;}; + }; + + // Animation + options.from = el.from; options.to = el.to; options.mode = mode; + + // Animate + el.effect('size', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.size = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','width','height','overflow','opacity']; + var props1 = ['position','top','left','overflow','opacity']; // Always restore + var props2 = ['width','height','overflow']; // Copy for children + var cProps = ['fontSize']; + var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom']; + var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var restore = o.options.restore || false; // Default restore + var scale = o.options.scale || 'both'; // Default scale mode + var origin = o.options.origin; // The origin of the sizing + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || original; // Default from state + el.to = o.options.to || original; // Default to state + // Adjust + if (origin) { // Calculate baseline shifts + var baseline = $.effects.getBaseline(origin, original); + el.from.top = (original.height - el.from.height) * baseline.y; + el.from.left = (original.width - el.from.width) * baseline.x; + el.to.top = (original.height - el.to.height) * baseline.y; + el.to.left = (original.width - el.to.width) * baseline.x; + }; + var factor = { // Set scaling factor + from: {y: el.from.height / original.height, x: el.from.width / original.width}, + to: {y: el.to.height / original.height, x: el.to.width / original.width} + }; + if (scale == 'box' || scale == 'both') { // Scale the css box + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(vProps); + el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + props = props.concat(hProps); + el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from); + el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to); + }; + }; + if (scale == 'content' || scale == 'both') { // Scale the content + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(cProps); + el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to); + }; + }; + $.effects.save(el, restore ? props : props1); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + el.css('overflow','hidden').css(el.from); // Shift + + // Animate + if (scale == 'content' || scale == 'both') { // Scale the children + vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size + hProps = hProps.concat(['marginLeft','marginRight']); // Add margins + props2 = props.concat(vProps).concat(hProps); // Concat + el.find("*[width]").each(function(){ + child = $(this); + if (restore) $.effects.save(child, props2); + var c_original = {height: child.height(), width: child.width()}; // Save original + child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x}; + child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x}; + if (factor.from.y != factor.to.y) { // Vertical props scaling + child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from); + child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from); + child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to); + }; + child.css(child.from); // Shift children + child.animate(child.to, o.duration, o.options.easing, function(){ + if (restore) $.effects.restore(child, props2); // Restore children + }); // Animate children + }); + }; + + // Animate + el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if (el.to.opacity === 0) { + el.css('opacity', el.from.opacity); + } + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Shake 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.shake = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'left'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 3; // Default # of times + var speed = o.duration || o.options.duration || 140; // Default speed per shake + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + + // Animation + var animation = {}, animation1 = {}, animation2 = {}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2; + animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2; + + // Animate + el.animate(animation, speed, o.options.easing); + for (var i = 1; i < times; i++) { // Shakes + el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing); + }; + el.animate(animation1, speed, o.options.easing). + animate(animation, speed / 2, o.options.easing, function(){ // Last shake + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Slide 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.slide = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true})); + if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Transfer 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.transfer = function(o) { + return this.queue(function() { + var elem = $(this), + target = $(o.options.to), + endPosition = target.offset(), + animation = { + top: endPosition.top, + left: endPosition.left, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = elem.offset(), + transfer = $('<div class="ui-effects-transfer"></div>') + .appendTo(document.body) + .addClass(o.options.className) + .css({ + top: startPosition.top, + left: startPosition.left, + height: elem.innerHeight(), + width: elem.innerWidth(), + position: 'absolute' + }) + .animate(animation, o.duration, o.options.easing, function() { + transfer.remove(); + (o.callback && o.callback.apply(elem[0], arguments)); + elem.dequeue(); + }); + }); +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.blind.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.blind.js new file mode 100644 index 000000000..44bd94716 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.blind.js @@ -0,0 +1,49 @@ +/* + * jQuery UI Effects Blind 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.blind = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'vertical') ? 'height' : 'width'; + var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width(); + if(mode == 'show') wrapper.css(ref, 0); // Shift + + // Animation + var animation = {}; + animation[ref] = mode == 'show' ? distance : 0; + + // Animate + wrapper.animate(animation, o.duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.bounce.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.bounce.js new file mode 100644 index 000000000..3b44dc06f --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.bounce.js @@ -0,0 +1,78 @@ +/* + * jQuery UI Effects Bounce 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.bounce = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'up'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 5; // Default # of times + var speed = o.duration || 250; // Default speed per bounce + if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + if (mode == 'hide') distance = distance / (times * 2); + if (mode != 'hide') times--; + + // Animate + if (mode == 'show') { // Show Bounce + var animation = {opacity: 1}; + animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation, speed / 2, o.options.easing); + distance = distance / 2; + times--; + }; + for (var i = 0; i < times; i++) { // Bounces + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing); + distance = (mode == 'hide') ? distance * 2 : distance / 2; + }; + if (mode == 'hide') { // Last Bounce + var animation = {opacity: 0}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + el.animate(animation, speed / 2, o.options.easing, function(){ + el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){ + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.clip.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.clip.js new file mode 100644 index 000000000..feb33661b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.clip.js @@ -0,0 +1,54 @@ +/* + * jQuery UI Effects Clip 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.clip = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','height','width']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var animate = el[0].tagName == 'IMG' ? wrapper : el; + var ref = { + size: (direction == 'vertical') ? 'height' : 'width', + position: (direction == 'vertical') ? 'top' : 'left' + }; + var distance = (direction == 'vertical') ? animate.height() : animate.width(); + if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift + + // Animation + var animation = {}; + animation[ref.size] = mode == 'show' ? distance : 0; + animation[ref.position] = mode == 'show' ? 0 : distance / 2; + + // Animate + animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.core.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.core.js new file mode 100644 index 000000000..00a551918 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.core.js @@ -0,0 +1,714 @@ +/* + * jQuery UI Effects 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +;jQuery.effects || (function($) { + +$.effects = {}; + + + +/******************************************************************************/ +/****************************** COLOR ANIMATIONS ******************************/ +/******************************************************************************/ + +// override the animation for color styles +$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', + 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], +function(i, attr) { + $.fx.step[attr] = function(fx) { + if (!fx.colorInit) { + fx.start = getColor(fx.elem, attr); + fx.end = getRGB(fx.end); + fx.colorInit = true; + } + + fx.elem.style[attr] = 'rgb(' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')'; + }; +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent']; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = $.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] +}; + + + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ + +var classAnimationActions = ['add', 'remove', 'toggle'], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +function getElementStyles() { + var style = document.defaultView + ? document.defaultView.getComputedStyle(this, null) + : this.currentStyle, + newStyle = {}, + key, + camelCase; + + // webkit enumerates style porperties + if (style && style.length && style[0] && style[style[0]]) { + var len = style.length; + while (len--) { + key = style[len]; + if (typeof style[key] == 'string') { + camelCase = key.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + newStyle[camelCase] = style[key]; + } + } + } else { + for (key in style) { + if (typeof style[key] === 'string') { + newStyle[key] = style[key]; + } + } + } + + return newStyle; +} + +function filterStyles(styles) { + var name, value; + for (name in styles) { + value = styles[name]; + if ( + // ignore null and undefined values + value == null || + // ignore functions (when does this occur?) + $.isFunction(value) || + // shorthand styles that need to be expanded + name in shorthandStyles || + // ignore scrollbars (break in IE) + (/scrollbar/).test(name) || + + // only colors or values that can be converted to numbers + (!(/color/i).test(name) && isNaN(parseFloat(value))) + ) { + delete styles[name]; + } + } + + return styles; +} + +function styleDifference(oldStyle, newStyle) { + var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459 + name; + + for (name in newStyle) { + if (oldStyle[name] != newStyle[name]) { + diff[name] = newStyle[name]; + } + } + + return diff; +} + +$.effects.animateClass = function(value, duration, easing, callback) { + if ($.isFunction(easing)) { + callback = easing; + easing = null; + } + + return this.each(function() { + + var that = $(this), + originalStyleAttr = that.attr('style') || ' ', + originalStyle = filterStyles(getElementStyles.call(this)), + newStyle, + className = that.attr('className'); + + $.each(classAnimationActions, function(i, action) { + if (value[action]) { + that[action + 'Class'](value[action]); + } + }); + newStyle = filterStyles(getElementStyles.call(this)); + that.attr('className', className); + + that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() { + $.each(classAnimationActions, function(i, action) { + if (value[action]) { that[action + 'Class'](value[action]); } + }); + // work around bug in IE by clearing the cssText before setting it + if (typeof that.attr('style') == 'object') { + that.attr('style').cssText = ''; + that.attr('style').cssText = originalStyleAttr; + } else { + that.attr('style', originalStyleAttr); + } + if (callback) { callback.apply(this, arguments); } + }); + }); +}; + +$.fn.extend({ + _addClass: $.fn.addClass, + addClass: function(classNames, speed, easing, callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + + _removeClass: $.fn.removeClass, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + + _toggleClass: $.fn.toggleClass, + toggleClass: function(classNames, force, speed, easing, callback) { + if ( typeof force == "boolean" || force === undefined ) { + if ( !speed ) { + // without speed parameter; + return this._toggleClass(classNames, force); + } else { + return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]); + } + } else { + // without switch parameter; + return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]); + } + }, + + switchClass: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + } +}); + + + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +$.extend($.effects, { + version: "1.8.1", + + // Saves a set of properties in a data storage + save: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); + } + }, + + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function(element) { + + // if the element is already wrapped, return it + if (element.parent().is('.ui-effects-wrapper')) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + 'float': element.css('float') + }, + wrapper = $('<div></div>') + .addClass('ui-effects-wrapper') + .css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0 + }); + + element.wrap(wrapper); + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if (element.css('position') == 'static') { + wrapper.css({ position: 'relative' }); + element.css({ position: 'relative' }); + } else { + $.extend(props, { + position: element.css('position'), + zIndex: element.css('z-index') + }); + $.each(['top', 'left', 'bottom', 'right'], function(i, pos) { + props[pos] = element.css(pos); + if (isNaN(parseInt(props[pos], 10))) { + props[pos] = 'auto'; + } + }); + element.css({position: 'relative', top: 0, left: 0 }); + } + + return wrapper.css(props).show(); + }, + + removeWrapper: function(element) { + if (element.parent().is('.ui-effects-wrapper')) + return element.parent().replaceWith(element); + return element; + }, + + setTransition: function(element, list, factor, value) { + value = value || {}; + $.each(list, function(i, x){ + unit = element.cssUnit(x); + if (unit[0] > 0) value[x] = unit[0] * factor + unit[1]; + }); + return value; + } +}); + + +function _normalizeArguments(effect, options, speed, callback) { + // shift params for method overloading + if (typeof effect == 'object') { + callback = options; + speed = null; + options = effect; + effect = options.effect; + } + if ($.isFunction(options)) { + callback = options; + speed = null; + options = {}; + } + if ($.isFunction(speed)) { + callback = speed; + speed = null; + } + if (typeof options == 'number' || $.fx.speeds[options]) { + callback = speed; + speed = options; + options = {}; + } + + options = options || {}; + + speed = speed || options.duration; + speed = $.fx.off ? 0 : typeof speed == 'number' + ? speed : $.fx.speeds[speed] || $.fx.speeds._default; + + callback = callback || options.complete; + + return [effect, options, speed, callback]; +} + +$.fn.extend({ + effect: function(effect, options, speed, callback) { + var args = _normalizeArguments.apply(this, arguments), + // TODO: make effects takes actual parameters instead of a hash + args2 = { + options: args[1], + duration: args[2], + callback: args[3] + }, + effectMethod = $.effects[effect]; + + return effectMethod && !$.fx.off ? effectMethod.call(this, args2) : this; + }, + + _show: $.fn.show, + show: function(speed) { + if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) { + return this._show.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'show'; + return this.effect.apply(this, args); + } + }, + + _hide: $.fn.hide, + hide: function(speed) { + if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) { + return this._hide.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'hide'; + return this.effect.apply(this, args); + } + }, + + // jQuery core overloads toggle and create _toggle + __toggle: $.fn.toggle, + toggle: function(speed) { + if (!speed || typeof speed == 'number' || $.fx.speeds[speed] || + typeof speed == 'boolean' || $.isFunction(speed)) { + return this.__toggle.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'toggle'; + return this.effect.apply(this, args); + } + }, + + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + + + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +$.easing.jswing = $.easing.swing; + +$.extend($.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert($.easing.default); + return $.easing[$.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.drop.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.drop.js new file mode 100644 index 000000000..1dab9882b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.drop.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Drop 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.drop = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {opacity: mode == 'show' ? 1 : 0}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.explode.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.explode.js new file mode 100644 index 000000000..42a185fe2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.explode.js @@ -0,0 +1,79 @@ +/* + * jQuery UI Effects Explode 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.explode = function(o) { + + return this.queue(function() { + + var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + + o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode; + var el = $(this).show().css('visibility', 'hidden'); + var offset = el.offset(); + + //Substract the margins - not fixing the problem yet. + offset.top -= parseInt(el.css("marginTop"),10) || 0; + offset.left -= parseInt(el.css("marginLeft"),10) || 0; + + var width = el.outerWidth(true); + var height = el.outerHeight(true); + + for(var i=0;i<rows;i++) { // = + for(var j=0;j<cells;j++) { // || + el + .clone() + .appendTo('body') + .wrap('<div></div>') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j*(width/cells), + top: -i*(height/rows) + }) + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width/cells, + height: height/rows, + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0), + opacity: o.options.mode == 'show' ? 0 : 1 + }).animate({ + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)), + opacity: o.options.mode == 'show' ? 1 : 0 + }, o.duration || 500); + } + } + + // Set a timeout, to call the callback approx. when the other animations have finished + setTimeout(function() { + + o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide(); + if(o.callback) o.callback.apply(el[0]); // Callback + el.dequeue(); + + $('div.ui-effects-explode').remove(); + + }, o.duration || 500); + + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.fold.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.fold.js new file mode 100644 index 000000000..fb5c76b69 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.fold.js @@ -0,0 +1,56 @@ +/* + * jQuery UI Effects Fold 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.fold = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var size = o.options.size || 15; // Default fold size + var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value + var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2; + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var widthFirst = ((mode == 'show') != horizFirst); + var ref = widthFirst ? ['width', 'height'] : ['height', 'width']; + var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()]; + var percent = /([0-9]+)%/.exec(size); + if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1]; + if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift + + // Animation + var animation1 = {}, animation2 = {}; + animation1[ref[0]] = mode == 'show' ? distance[0] : size; + animation2[ref[1]] = mode == 'show' ? distance[1] : 0; + + // Animate + wrapper.animate(animation1, duration, o.options.easing) + .animate(animation2, duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.highlight.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.highlight.js new file mode 100644 index 000000000..3fbbe7785 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.highlight.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Highlight 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.highlight = function(o) { + return this.queue(function() { + var elem = $(this), + props = ['backgroundImage', 'backgroundColor', 'opacity'], + mode = $.effects.setMode(elem, o.options.mode || 'show'), + animation = { + backgroundColor: elem.css('backgroundColor') + }; + + if (mode == 'hide') { + animation.opacity = 0; + } + + $.effects.save(elem, props); + elem + .show() + .css({ + backgroundImage: 'none', + backgroundColor: o.options.color || '#ffff99' + }) + .animate(animation, { + queue: false, + duration: o.duration, + easing: o.options.easing, + complete: function() { + (mode == 'hide' && elem.hide()); + $.effects.restore(elem, props); + (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter')); + (o.callback && o.callback.apply(this, arguments)); + elem.dequeue(); + } + }); + }); +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.pulsate.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.pulsate.js new file mode 100644 index 000000000..5dc175c3b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.pulsate.js @@ -0,0 +1,51 @@ +/* + * jQuery UI Effects Pulsate 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.pulsate = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'show'); + times = ((o.options.times || 5) * 2) - 1; + duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2, + isVisible = elem.is(':visible'), + animateTo = 0; + + if (!isVisible) { + elem.css('opacity', 0).show(); + animateTo = 1; + } + + if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) { + times--; + } + + for (var i = 0; i < times; i++) { + elem.animate({ opacity: animateTo }, duration, o.options.easing); + animateTo = (animateTo + 1) % 2; + } + + elem.animate({ opacity: animateTo }, duration, o.options.easing, function() { + if (animateTo == 0) { + elem.hide(); + } + (o.callback && o.callback.apply(this, arguments)); + }); + + elem + .queue('fx', function() { elem.dequeue(); }) + .dequeue(); + }); +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.scale.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.scale.js new file mode 100644 index 000000000..4cb538c2e --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.scale.js @@ -0,0 +1,178 @@ +/* + * jQuery UI Effects Scale 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.puff = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'hide'), + percent = parseInt(o.options.percent, 10) || 150, + factor = percent / 100, + original = { height: elem.height(), width: elem.width() }; + + $.extend(o.options, { + fade: true, + mode: mode, + percent: mode == 'hide' ? percent : 100, + from: mode == 'hide' + ? original + : { + height: original.height * factor, + width: original.width * factor + } + }); + + elem.effect('scale', o.options, o.duration, o.callback); + elem.dequeue(); + }); +}; + +$.effects.scale = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent + var direction = o.options.direction || 'both'; // Set default axis + var origin = o.options.origin; // The origin of the scaling + if (mode != 'effect') { // Set default origin and restore for show/hide + options.origin = origin || ['middle','center']; + options.restore = true; + } + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state + + // Adjust + var factor = { // Set scaling factor + y: direction != 'horizontal' ? (percent / 100) : 1, + x: direction != 'vertical' ? (percent / 100) : 1 + }; + el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state + + if (o.options.fade) { // Fade option to support puff + if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;}; + if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;}; + }; + + // Animation + options.from = el.from; options.to = el.to; options.mode = mode; + + // Animate + el.effect('size', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.size = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left','width','height','overflow','opacity']; + var props1 = ['position','top','left','overflow','opacity']; // Always restore + var props2 = ['width','height','overflow']; // Copy for children + var cProps = ['fontSize']; + var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom']; + var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var restore = o.options.restore || false; // Default restore + var scale = o.options.scale || 'both'; // Default scale mode + var origin = o.options.origin; // The origin of the sizing + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || original; // Default from state + el.to = o.options.to || original; // Default to state + // Adjust + if (origin) { // Calculate baseline shifts + var baseline = $.effects.getBaseline(origin, original); + el.from.top = (original.height - el.from.height) * baseline.y; + el.from.left = (original.width - el.from.width) * baseline.x; + el.to.top = (original.height - el.to.height) * baseline.y; + el.to.left = (original.width - el.to.width) * baseline.x; + }; + var factor = { // Set scaling factor + from: {y: el.from.height / original.height, x: el.from.width / original.width}, + to: {y: el.to.height / original.height, x: el.to.width / original.width} + }; + if (scale == 'box' || scale == 'both') { // Scale the css box + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(vProps); + el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + props = props.concat(hProps); + el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from); + el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to); + }; + }; + if (scale == 'content' || scale == 'both') { // Scale the content + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(cProps); + el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to); + }; + }; + $.effects.save(el, restore ? props : props1); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + el.css('overflow','hidden').css(el.from); // Shift + + // Animate + if (scale == 'content' || scale == 'both') { // Scale the children + vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size + hProps = hProps.concat(['marginLeft','marginRight']); // Add margins + props2 = props.concat(vProps).concat(hProps); // Concat + el.find("*[width]").each(function(){ + child = $(this); + if (restore) $.effects.save(child, props2); + var c_original = {height: child.height(), width: child.width()}; // Save original + child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x}; + child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x}; + if (factor.from.y != factor.to.y) { // Vertical props scaling + child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from); + child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from); + child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to); + }; + child.css(child.from); // Shift children + child.animate(child.to, o.duration, o.options.easing, function(){ + if (restore) $.effects.restore(child, props2); // Restore children + }); // Animate children + }); + }; + + // Animate + el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if (el.to.opacity === 0) { + el.css('opacity', el.from.opacity); + } + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.shake.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.shake.js new file mode 100644 index 000000000..fc2f120b2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.shake.js @@ -0,0 +1,57 @@ +/* + * jQuery UI Effects Shake 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.shake = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'left'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 3; // Default # of times + var speed = o.duration || o.options.duration || 140; // Default speed per shake + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + + // Animation + var animation = {}, animation1 = {}, animation2 = {}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2; + animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2; + + // Animate + el.animate(animation, speed, o.options.easing); + for (var i = 1; i < times; i++) { // Shakes + el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing); + }; + el.animate(animation1, speed, o.options.easing). + animate(animation, speed / 2, o.options.easing, function(){ // Last shake + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.slide.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.slide.js new file mode 100644 index 000000000..9c88501ba --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.slide.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Slide 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.slide = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','left']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true})); + if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.effects.transfer.js b/fannie/src/jquery/development-bundle/ui/jquery.effects.transfer.js new file mode 100644 index 000000000..49c6503b1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.effects.transfer.js @@ -0,0 +1,45 @@ +/* + * jQuery UI Effects Transfer 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function($) { + +$.effects.transfer = function(o) { + return this.queue(function() { + var elem = $(this), + target = $(o.options.to), + endPosition = target.offset(), + animation = { + top: endPosition.top, + left: endPosition.left, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = elem.offset(), + transfer = $('<div class="ui-effects-transfer"></div>') + .appendTo(document.body) + .addClass(o.options.className) + .css({ + top: startPosition.top, + left: startPosition.left, + height: elem.innerHeight(), + width: elem.innerWidth(), + position: 'absolute' + }) + .animate(animation, o.duration, o.options.easing, function() { + transfer.remove(); + (o.callback && o.callback.apply(elem[0], arguments)); + elem.dequeue(); + }); + }); +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.accordion.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.accordion.js new file mode 100644 index 000000000..ca0f24b9e --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.accordion.js @@ -0,0 +1,506 @@ +/* + * jQuery UI Accordion 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.accordion", { + options: { + active: 0, + animated: 'slide', + autoHeight: true, + clearStyle: false, + collapsible: false, + event: "click", + fillSpace: false, + header: "> li > :first-child,> :not(li):even", + icons: { + header: "ui-icon-triangle-1-e", + headerSelected: "ui-icon-triangle-1-s" + }, + navigation: false, + navigationFilter: function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + } + }, + _create: function() { + + var o = this.options, self = this; + this.running = 0; + + this.element.addClass("ui-accordion ui-widget ui-helper-reset"); + + // in lack of child-selectors in CSS we need to mark top-LIs in a UL-accordion for some IE-fix + if (this.element[0].nodeName == "UL") { + this.element.children("li").addClass("ui-accordion-li-fix"); + } + + this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all") + .bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); }) + .bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); }) + .bind("focus.accordion", function(){ $(this).addClass('ui-state-focus'); }) + .bind("blur.accordion", function(){ $(this).removeClass('ui-state-focus'); }); + + this.headers + .next() + .addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); + + if ( o.navigation ) { + var current = this.element.find("a").filter(o.navigationFilter); + if ( current.length ) { + var header = current.closest(".ui-accordion-header"); + if ( header.length ) { + // anchor within header + this.active = header; + } else { + // anchor within content + this.active = current.closest(".ui-accordion-content").prev(); + } + } + } + + this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"); + this.active.next().addClass('ui-accordion-content-active'); + + //Append icon elements + this._createIcons(); + + this.resize(); + + //ARIA + this.element.attr('role','tablist'); + + this.headers + .attr('role','tab') + .bind('keydown', function(event) { return self._keydown(event); }) + .next() + .attr('role','tabpanel'); + + this.headers + .not(this.active || "") + .attr('aria-expanded','false') + .attr("tabIndex", "-1") + .next() + .hide(); + + // make sure at least one header is in the tab order + if (!this.active.length) { + this.headers.eq(0).attr('tabIndex','0'); + } else { + this.active + .attr('aria-expanded','true') + .attr('tabIndex', '0'); + } + + // only need links in taborder for Safari + if (!$.browser.safari) + this.headers.find('a').attr('tabIndex','-1'); + + if (o.event) { + this.headers.bind((o.event) + ".accordion", function(event) { + self._clickHandler.call(self, event, this); + event.preventDefault(); + }); + } + + }, + + _createIcons: function() { + var o = this.options; + if (o.icons) { + $("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers); + this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected); + this.element.addClass("ui-accordion-icons"); + } + }, + + _destroyIcons: function() { + this.headers.children(".ui-icon").remove(); + this.element.removeClass("ui-accordion-icons"); + }, + + destroy: function() { + var o = this.options; + + this.element + .removeClass("ui-accordion ui-widget ui-helper-reset") + .removeAttr("role") + .unbind('.accordion') + .removeData('accordion'); + + this.headers + .unbind(".accordion") + .removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top") + .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex"); + + this.headers.find("a").removeAttr("tabIndex"); + this._destroyIcons(); + var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active"); + if (o.autoHeight || o.fillHeight) { + contents.css("height", ""); + } + + return this; + }, + + _setOption: function(key, value) { + $.Widget.prototype._setOption.apply(this, arguments); + + if (key == "active") { + this.activate(value); + } + if (key == "icons") { + this._destroyIcons(); + if (value) { + this._createIcons(); + } + } + + }, + + _keydown: function(event) { + + var o = this.options, keyCode = $.ui.keyCode; + + if (o.disabled || event.altKey || event.ctrlKey) + return; + + var length = this.headers.length; + var currentIndex = this.headers.index(event.target); + var toFocus = false; + + switch(event.keyCode) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[(currentIndex + 1) % length]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[(currentIndex - 1 + length) % length]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._clickHandler({ target: event.target }, event.target); + event.preventDefault(); + } + + if (toFocus) { + $(event.target).attr('tabIndex','-1'); + $(toFocus).attr('tabIndex','0'); + toFocus.focus(); + return false; + } + + return true; + + }, + + resize: function() { + + var o = this.options, maxHeight; + + if (o.fillSpace) { + + if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); } + maxHeight = this.element.parent().height(); + if($.browser.msie) { this.element.parent().css('overflow', defOverflow); } + + this.headers.each(function() { + maxHeight -= $(this).outerHeight(true); + }); + + this.headers.next().each(function() { + $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height())); + }).css('overflow', 'auto'); + + } else if ( o.autoHeight ) { + maxHeight = 0; + this.headers.next().each(function() { + maxHeight = Math.max(maxHeight, $(this).height()); + }).height(maxHeight); + } + + return this; + }, + + activate: function(index) { + // TODO this gets called on init, changing the option without an explicit call for that + this.options.active = index; + // call clickHandler with custom event + var active = this._findActive(index)[0]; + this._clickHandler({ target: active }, active); + + return this; + }, + + _findActive: function(selector) { + return selector + ? typeof selector == "number" + ? this.headers.filter(":eq(" + selector + ")") + : this.headers.not(this.headers.not(selector)) + : selector === false + ? $([]) + : this.headers.filter(":eq(0)"); + }, + + // TODO isn't event.target enough? why the seperate target argument? + _clickHandler: function(event, target) { + + var o = this.options; + if (o.disabled) + return; + + // called only when using activate(false) to close all parts programmatically + if (!event.target) { + if (!o.collapsible) + return; + this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all") + .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header); + this.active.next().addClass('ui-accordion-content-active'); + var toHide = this.active.next(), + data = { + options: o, + newHeader: $([]), + oldHeader: o.active, + newContent: $([]), + oldContent: toHide + }, + toShow = (this.active = $([])); + this._toggle(toShow, toHide, data); + return; + } + + // get the click target + var clicked = $(event.currentTarget || target); + var clickedIsActive = clicked[0] == this.active[0]; + + // TODO the option is changed, is that correct? + // TODO if it is correct, shouldn't that happen after determining that the click is valid? + o.active = o.collapsible && clickedIsActive ? false : $('.ui-accordion-header', this.element).index(clicked); + + // if animations are still active, or the active header is the target, ignore click + if (this.running || (!o.collapsible && clickedIsActive)) { + return; + } + + // switch classes + this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all") + .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header); + if (!clickedIsActive) { + clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top") + .find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected); + clicked.next().addClass('ui-accordion-content-active'); + } + + // find elements to show and hide + var toShow = clicked.next(), + toHide = this.active.next(), + data = { + options: o, + newHeader: clickedIsActive && o.collapsible ? $([]) : clicked, + oldHeader: this.active, + newContent: clickedIsActive && o.collapsible ? $([]) : toShow, + oldContent: toHide + }, + down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] ); + + this.active = clickedIsActive ? $([]) : clicked; + this._toggle(toShow, toHide, data, clickedIsActive, down); + + return; + + }, + + _toggle: function(toShow, toHide, data, clickedIsActive, down) { + + var o = this.options, self = this; + + this.toShow = toShow; + this.toHide = toHide; + this.data = data; + + var complete = function() { if(!self) return; return self._completed.apply(self, arguments); }; + + // trigger changestart event + this._trigger("changestart", null, this.data); + + // count elements to animate + this.running = toHide.size() === 0 ? toShow.size() : toHide.size(); + + if (o.animated) { + + var animOptions = {}; + + if ( o.collapsible && clickedIsActive ) { + animOptions = { + toShow: $([]), + toHide: toHide, + complete: complete, + down: down, + autoHeight: o.autoHeight || o.fillSpace + }; + } else { + animOptions = { + toShow: toShow, + toHide: toHide, + complete: complete, + down: down, + autoHeight: o.autoHeight || o.fillSpace + }; + } + + if (!o.proxied) { + o.proxied = o.animated; + } + + if (!o.proxiedDuration) { + o.proxiedDuration = o.duration; + } + + o.animated = $.isFunction(o.proxied) ? + o.proxied(animOptions) : o.proxied; + + o.duration = $.isFunction(o.proxiedDuration) ? + o.proxiedDuration(animOptions) : o.proxiedDuration; + + var animations = $.ui.accordion.animations, + duration = o.duration, + easing = o.animated; + + if (easing && !animations[easing] && !$.easing[easing]) { + easing = 'slide'; + } + if (!animations[easing]) { + animations[easing] = function(options) { + this.slide(options, { + easing: easing, + duration: duration || 700 + }); + }; + } + + animations[easing](animOptions); + + } else { + + if (o.collapsible && clickedIsActive) { + toShow.toggle(); + } else { + toHide.hide(); + toShow.show(); + } + + complete(true); + + } + + // TODO assert that the blur and focus triggers are really necessary, remove otherwise + toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur(); + toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus(); + + }, + + _completed: function(cancel) { + + var o = this.options; + + this.running = cancel ? 0 : --this.running; + if (this.running) return; + + if (o.clearStyle) { + this.toShow.add(this.toHide).css({ + height: "", + overflow: "" + }); + } + + // other classes are removed before the animation; this one needs to stay until completed + this.toHide.removeClass("ui-accordion-content-active"); + + this._trigger('change', null, this.data); + } + +}); + + +$.extend($.ui.accordion, { + version: "1.8.1", + animations: { + slide: function(options, additions) { + options = $.extend({ + easing: "swing", + duration: 300 + }, options, additions); + if ( !options.toHide.size() ) { + options.toShow.animate({height: "show"}, options); + return; + } + if ( !options.toShow.size() ) { + options.toHide.animate({height: "hide"}, options); + return; + } + var overflow = options.toShow.css('overflow'), + percentDone = 0, + showProps = {}, + hideProps = {}, + fxAttrs = [ "height", "paddingTop", "paddingBottom" ], + originalWidth; + // fix width before calculating height of hidden element + var s = options.toShow; + originalWidth = s[0].style.width; + s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) ); + + $.each(fxAttrs, function(i, prop) { + hideProps[prop] = 'hide'; + + var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/); + showProps[prop] = { + value: parts[1], + unit: parts[2] || 'px' + }; + }); + options.toShow.css({ height: 0, overflow: 'hidden' }).show(); + options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{ + step: function(now, settings) { + // only calculate the percent when animating height + // IE gets very inconsistent results when animating elements + // with small values, which is common for padding + if (settings.prop == 'height') { + percentDone = ( settings.end - settings.start === 0 ) ? 0 : + (settings.now - settings.start) / (settings.end - settings.start); + } + + options.toShow[0].style[settings.prop] = + (percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit; + }, + duration: options.duration, + easing: options.easing, + complete: function() { + if ( !options.autoHeight ) { + options.toShow.css("height", ""); + } + options.toShow.css("width", originalWidth); + options.toShow.css({overflow: overflow}); + options.complete(); + } + }); + }, + bounceslide: function(options) { + this.slide(options, { + easing: options.down ? "easeOutBounce" : "swing", + duration: options.down ? 1000 : 200 + }); + } + } +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.autocomplete.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.autocomplete.js new file mode 100644 index 000000000..79a557c85 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.autocomplete.js @@ -0,0 +1,498 @@ +/* + * jQuery UI Autocomplete 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function( $ ) { + +$.widget( "ui.autocomplete", { + options: { + minLength: 1, + delay: 300 + }, + _create: function() { + var self = this, + doc = this.element[ 0 ].ownerDocument; + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ) + // TODO verify these actually work as intended + .attr({ + role: "textbox", + "aria-autocomplete": "list", + "aria-haspopup": "true" + }) + .bind( "keydown.autocomplete", function( event ) { + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + self._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + self._move( "nextPage", event ); + break; + case keyCode.UP: + self._move( "previous", event ); + // prevent moving cursor to beginning of text field in some browsers + event.preventDefault(); + break; + case keyCode.DOWN: + self._move( "next", event ); + // prevent moving cursor to end of text field in some browsers + event.preventDefault(); + break; + case keyCode.ENTER: + // when menu is open or has focus + if ( self.menu.active ) { + event.preventDefault(); + } + //passthrough - ENTER and TAB both select the current element + case keyCode.TAB: + if ( !self.menu.active ) { + return; + } + self.menu.select( event ); + break; + case keyCode.ESCAPE: + self.element.val( self.term ); + self.close( event ); + break; + case keyCode.LEFT: + case keyCode.RIGHT: + case keyCode.SHIFT: + case keyCode.CONTROL: + case keyCode.ALT: + // ignore metakeys (shift, ctrl, alt) + break; + default: + // keypress is triggered before the input value is changed + clearTimeout( self.searching ); + self.searching = setTimeout(function() { + self.search( null, event ); + }, self.options.delay ); + break; + } + }) + .bind( "focus.autocomplete", function() { + self.selectedItem = null; + self.previous = self.element.val(); + }) + .bind( "blur.autocomplete", function( event ) { + clearTimeout( self.searching ); + // clicks on the menu (or a button to trigger a search) will cause a blur event + // TODO try to implement this without a timeout, see clearTimeout in search() + self.closing = setTimeout(function() { + self.close( event ); + self._change( event ); + }, 150 ); + }); + this._initSource(); + this.response = function() { + return self._response.apply( self, arguments ); + }; + this.menu = $( "<ul></ul>" ) + .addClass( "ui-autocomplete" ) + .appendTo( "body", doc ) + .menu({ + focus: function( event, ui ) { + var item = ui.item.data( "item.autocomplete" ); + if ( false !== self._trigger( "focus", null, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( /^key/.test(event.originalEvent.type) ) { + self.element.val( item.value ); + } + } + }, + selected: function( event, ui ) { + var item = ui.item.data( "item.autocomplete" ); + if ( false !== self._trigger( "select", event, { item: item } ) ) { + self.element.val( item.value ); + } + self.close( event ); + // only trigger when focus was lost (click on menu) + var previous = self.previous; + if ( self.element[0] !== doc.activeElement ) { + self.element.focus(); + self.previous = previous; + } + self.selectedItem = item; + }, + blur: function( event, ui ) { + if ( self.menu.element.is(":visible") ) { + self.element.val( self.term ); + } + } + }) + .zIndex( this.element.zIndex() + 1 ) + // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 + .css({ top: 0, left: 0 }) + .hide() + .data( "menu" ); + if ( $.fn.bgiframe ) { + this.menu.element.bgiframe(); + } + }, + + destroy: function() { + this.element + .removeClass( "ui-autocomplete-input" ) + .removeAttr( "autocomplete" ) + .removeAttr( "role" ) + .removeAttr( "aria-autocomplete" ) + .removeAttr( "aria-haspopup" ); + this.menu.element.remove(); + $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key ) { + $.Widget.prototype._setOption.apply( this, arguments ); + if ( key === "source" ) { + this._initSource(); + } + }, + + _initSource: function() { + var array, + url; + if ( $.isArray(this.options.source) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter(array, request.term) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + $.getJSON( url, request, response ); + }; + } else { + this.source = this.options.source; + } + }, + + search: function( value, event ) { + value = value != null ? value : this.element.val(); + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + clearTimeout( this.closing ); + if ( this._trigger("search") === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.term = this.element + .addClass( "ui-autocomplete-loading" ) + // always save the actual value, not the one passed as an argument + .val(); + + this.source( { term: value }, this.response ); + }, + + _response: function( content ) { + if ( content.length ) { + content = this._normalize( content ); + this._suggest( content ); + this._trigger( "open" ); + } else { + this.close(); + } + this.element.removeClass( "ui-autocomplete-loading" ); + }, + + close: function( event ) { + clearTimeout( this.closing ); + if ( this.menu.element.is(":visible") ) { + this._trigger( "close", event ); + this.menu.element.hide(); + this.menu.deactivate(); + } + }, + + _change: function( event ) { + if ( this.previous !== this.element.val() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[0].label && items[0].value ) { + return items; + } + return $.map( items, function(item) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend({ + label: item.label || item.value, + value: item.value || item.label + }, item ); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element + .empty() + .zIndex( this.element.zIndex() + 1 ), + menuWidth, + textWidth; + this._renderMenu( ul, items ); + // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate + this.menu.deactivate(); + this.menu.refresh(); + this.menu.element.show().position({ + my: "left top", + at: "left bottom", + of: this.element, + collision: "none" + }); + + menuWidth = ul.width( "" ).width(); + textWidth = this.element.width(); + ul.width( Math.max( menuWidth, textWidth ) ); + }, + + _renderMenu: function( ul, items ) { + var self = this; + $.each( items, function( index, item ) { + self._renderItem( ul, item ); + }); + }, + + _renderItem: function( ul, item) { + return $( "<li></li>" ) + .data( "item.autocomplete", item ) + .append( "<a>" + item.label + "</a>" ) + .appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is(":visible") ) { + this.search( null, event ); + return; + } + if ( this.menu.first() && /^previous/.test(direction) || + this.menu.last() && /^next/.test(direction) ) { + this.element.val( this.term ); + this.menu.deactivate(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" ); + }, + filter: function(array, term) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); + return $.grep( array, function(value) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + +}( jQuery )); + +/* + * jQuery UI Menu (not officially released) + * + * This widget isn't yet finished and the API is subject to change. We plan to finish + * it for the next release. You're welcome to give it a try anyway and give us feedback, + * as long as you're okay with migrating your code later on. We can help with that, too. + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Menu + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.menu", { + _create: function() { + var self = this; + this.element + .addClass("ui-menu ui-widget ui-widget-content ui-corner-all") + .attr({ + role: "listbox", + "aria-activedescendant": "ui-active-menuitem" + }) + .click(function( event ) { + if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) { + return; + } + // temporary + event.preventDefault(); + self.select( event ); + }); + this.refresh(); + }, + + refresh: function() { + var self = this; + + // don't refresh list items that are already adapted + var items = this.element.children("li:not(.ui-menu-item):has(a)") + .addClass("ui-menu-item") + .attr("role", "menuitem"); + + items.children("a") + .addClass("ui-corner-all") + .attr("tabindex", -1) + // mouseenter doesn't work with event delegation + .mouseenter(function( event ) { + self.activate( event, $(this).parent() ); + }) + .mouseleave(function() { + self.deactivate(); + }); + }, + + activate: function( event, item ) { + this.deactivate(); + if (this.hasScroll()) { + var offset = item.offset().top - this.element.offset().top, + scroll = this.element.attr("scrollTop"), + elementHeight = this.element.height(); + if (offset < 0) { + this.element.attr("scrollTop", scroll + offset); + } else if (offset > elementHeight) { + this.element.attr("scrollTop", scroll + offset - elementHeight + item.height()); + } + } + this.active = item.eq(0) + .children("a") + .addClass("ui-state-hover") + .attr("id", "ui-active-menuitem") + .end(); + this._trigger("focus", event, { item: item }); + }, + + deactivate: function() { + if (!this.active) { return; } + + this.active.children("a") + .removeClass("ui-state-hover") + .removeAttr("id"); + this._trigger("blur"); + this.active = null; + }, + + next: function(event) { + this.move("next", ".ui-menu-item:first", event); + }, + + previous: function(event) { + this.move("prev", ".ui-menu-item:last", event); + }, + + first: function() { + return this.active && !this.active.prev().length; + }, + + last: function() { + return this.active && !this.active.next().length; + }, + + move: function(direction, edge, event) { + if (!this.active) { + this.activate(event, this.element.children(edge)); + return; + } + var next = this.active[direction + "All"](".ui-menu-item").eq(0); + if (next.length) { + this.activate(event, next); + } else { + this.activate(event, this.element.children(edge)); + } + }, + + // TODO merge with previousPage + nextPage: function(event) { + if (this.hasScroll()) { + // TODO merge with no-scroll-else + if (!this.active || this.last()) { + this.activate(event, this.element.children(":first")); + return; + } + var base = this.active.offset().top, + height = this.element.height(), + result = this.element.children("li").filter(function() { + var close = $(this).offset().top - base - height + $(this).height(); + // TODO improve approximation + return close < 10 && close > -10; + }); + + // TODO try to catch this earlier when scrollTop indicates the last page anyway + if (!result.length) { + result = this.element.children(":last"); + } + this.activate(event, result); + } else { + this.activate(event, this.element.children(!this.active || this.last() ? ":first" : ":last")); + } + }, + + // TODO merge with nextPage + previousPage: function(event) { + if (this.hasScroll()) { + // TODO merge with no-scroll-else + if (!this.active || this.first()) { + this.activate(event, this.element.children(":last")); + return; + } + + var base = this.active.offset().top, + height = this.element.height(); + result = this.element.children("li").filter(function() { + var close = $(this).offset().top - base + height - $(this).height(); + // TODO improve approximation + return close < 10 && close > -10; + }); + + // TODO try to catch this earlier when scrollTop indicates the last page anyway + if (!result.length) { + result = this.element.children(":first"); + } + this.activate(event, result); + } else { + this.activate(event, this.element.children(!this.active || this.first() ? ":last" : ":first")); + } + }, + + hasScroll: function() { + return this.element.height() < this.element.attr("scrollHeight"); + }, + + select: function( event ) { + this._trigger("selected", event, { item: this.active }); + } +}); + +}(jQuery)); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.button.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.button.js new file mode 100644 index 000000000..d4aec6866 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.button.js @@ -0,0 +1,365 @@ +/* + * jQuery UI Button 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Button + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function( $ ) { + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + otherClasses = "ui-state-hover ui-state-active " + + "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only", + formResetHandler = function( event ) { + $( ":ui-button", event.target.form ).each(function() { + var inst = $( this ).data( "button" ); + setTimeout(function() { + inst.refresh(); + }, 1 ); + }); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + if ( form ) { + radios = $( form ).find( "[name='" + name + "']" ); + } else { + radios = $( "[name='" + name + "']", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + options: { + text: true, + label: null, + icons: { + primary: null, + secondary: null + } + }, + _create: function() { + this.element.closest( "form" ) + .unbind( "reset.button" ) + .bind( "reset.button", formResetHandler ); + + this._determineButtonType(); + this.hasTitle = !!this.buttonElement.attr( "title" ); + + var self = this, + options = this.options, + toggleButton = this.type === "checkbox" || this.type === "radio", + hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ), + focusClass = "ui-state-focus"; + + if ( options.label === null ) { + options.label = this.buttonElement.html(); + } + + if ( this.element.is( ":disabled" ) ) { + options.disabled = true; + } + + this.buttonElement + .addClass( baseClasses ) + .attr( "role", "button" ) + .bind( "mouseenter.button", function() { + if ( options.disabled ) { + return; + } + $( this ).addClass( "ui-state-hover" ); + if ( this === lastActive ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "mouseleave.button", function() { + if ( options.disabled ) { + return; + } + $( this ).removeClass( hoverClass ); + }) + .bind( "focus.button", function() { + // no need to check disabled, focus won't be triggered anyway + $( this ).addClass( focusClass ); + }) + .bind( "blur.button", function() { + $( this ).removeClass( focusClass ); + }); + + if ( toggleButton ) { + this.element.bind( "change.button", function() { + self.refresh(); + }); + } + + if ( this.type === "checkbox" ) { + this.buttonElement.bind( "click.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).toggleClass( "ui-state-active" ); + self.buttonElement.attr( "aria-pressed", self.element[0].checked ); + }); + } else if ( this.type === "radio" ) { + this.buttonElement.bind( "click.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + self.buttonElement.attr( "aria-pressed", true ); + + var radio = self.element[ 0 ]; + radioGroup( radio ) + .not( radio ) + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + }); + } else { + this.buttonElement + .bind( "mousedown.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + lastActive = this; + $( document ).one( "mouseup", function() { + lastActive = null; + }); + }) + .bind( "mouseup.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).removeClass( "ui-state-active" ); + }) + .bind( "keydown.button", function(event) { + if ( options.disabled ) { + return false; + } + if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "keyup.button", function() { + $( this ).removeClass( "ui-state-active" ); + }); + + if ( this.buttonElement.is("a") ) { + this.buttonElement.keyup(function(event) { + if ( event.keyCode === $.ui.keyCode.SPACE ) { + // TODO pass through original event correctly (just as 2nd argument doesn't work) + $( this ).click(); + } + }); + } + } + + // TODO: pull out $.Widget's handling for the disabled option into + // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can + // be overridden by individual plugins + this._setOption( "disabled", options.disabled ); + }, + + _determineButtonType: function() { + + if ( this.element.is(":checkbox") ) { + this.type = "checkbox"; + } else { + if ( this.element.is(":radio") ) { + this.type = "radio"; + } else { + if ( this.element.is("input") ) { + this.type = "input"; + } else { + this.type = "button"; + } + } + } + + if ( this.type === "checkbox" || this.type === "radio" ) { + // we don't search against the document in case the element + // is disconnected from the DOM + this.buttonElement = this.element.parents().last() + .find( "[for=" + this.element.attr("id") + "]" ); + this.element.addClass( "ui-helper-hidden-accessible" ); + + var checked = this.element.is( ":checked" ); + if ( checked ) { + this.buttonElement.addClass( "ui-state-active" ); + } + this.buttonElement.attr( "aria-pressed", checked ); + } else { + this.buttonElement = this.element; + } + }, + + widget: function() { + return this.buttonElement; + }, + + destroy: function() { + this.element + .removeClass( "ui-helper-hidden-accessible" ); + this.buttonElement + .removeClass( baseClasses + " " + otherClasses ) + .removeAttr( "role" ) + .removeAttr( "aria-pressed" ) + .html( this.buttonElement.find(".ui-button-text").html() ); + + if ( !this.hasTitle ) { + this.buttonElement.removeAttr( "title" ); + } + + $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key, value ) { + $.Widget.prototype._setOption.apply( this, arguments ); + if ( key === "disabled" ) { + if ( value ) { + this.element.attr( "disabled", true ); + } else { + this.element.removeAttr( "disabled" ); + } + } + this._resetButton(); + }, + + refresh: function() { + var isDisabled = this.element.is( ":disabled" ); + if ( isDisabled !== this.options.disabled ) { + this._setOption( "disabled", isDisabled ); + } + if ( this.type === "radio" ) { + radioGroup( this.element[0] ).each(function() { + if ( $( this ).is( ":checked" ) ) { + $( this ).button( "widget" ) + .addClass( "ui-state-active" ) + .attr( "aria-pressed", true ); + } else { + $( this ).button( "widget" ) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + } + }); + } else if ( this.type === "checkbox" ) { + if ( this.element.is( ":checked" ) ) { + this.buttonElement + .addClass( "ui-state-active" ) + .attr( "aria-pressed", true ); + } else { + this.buttonElement + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + } + } + }, + + _resetButton: function() { + if ( this.type === "input" ) { + if ( this.options.label ) { + this.element.val( this.options.label ); + } + return; + } + var buttonElement = this.buttonElement, + buttonText = $( "<span></span>" ) + .addClass( "ui-button-text" ) + .html( this.options.label ) + .appendTo( buttonElement.empty() ) + .text(), + icons = this.options.icons, + multipleIcons = icons.primary && icons.secondary; + if ( icons.primary || icons.secondary ) { + buttonElement.addClass( "ui-button-text-icon" + + ( multipleIcons ? "s" : "" ) ); + if ( icons.primary ) { + buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" ); + } + if ( icons.secondary ) { + buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" ); + } + if ( !this.options.text ) { + buttonElement + .addClass( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" ) + .removeClass( "ui-button-text-icons ui-button-text-icon" ); + if ( !this.hasTitle ) { + buttonElement.attr( "title", buttonText ); + } + } + } else { + buttonElement.addClass( "ui-button-text-only" ); + } + } +}); + +$.widget( "ui.buttonset", { + _create: function() { + this.element.addClass( "ui-buttonset" ); + this._init(); + }, + + _init: function() { + this.refresh(); + }, + + _setOption: function( key, value ) { + if ( key === "disabled" ) { + this.buttons.button( "option", key, value ); + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + refresh: function() { + this.buttons = this.element.find( ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" ) + .filter( ":ui-button" ) + .button( "refresh" ) + .end() + .not( ":ui-button" ) + .button() + .end() + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-all ui-corner-left ui-corner-right" ) + .filter( ":first" ) + .addClass( "ui-corner-left" ) + .end() + .filter( ":last" ) + .addClass( "ui-corner-right" ) + .end() + .end(); + }, + + destroy: function() { + this.element.removeClass( "ui-buttonset" ); + this.buttons + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-left ui-corner-right" ) + .end() + .button( "destroy" ) + + $.Widget.prototype.destroy.call( this ); + } +}); + +}( jQuery ) ); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.core.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.core.js new file mode 100644 index 000000000..48f6b9722 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.core.js @@ -0,0 +1,202 @@ +/*! + * jQuery UI 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +;jQuery.ui || (function($) { + +//Helper functions and ui object +$.ui = { + version: "1.8.1", + + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set || !instance.element[0].parentNode) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + + contains: function(a, b) { + return document.compareDocumentPosition + ? a.compareDocumentPosition(b) & 16 + : a !== b && a.contains(b); + }, + + hasScroll: function(el, a) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ($(el).css('overflow') == 'hidden') { return false; } + + var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop', + has = false; + + if (el[scroll] > 0) { return true; } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[scroll] = 1; + has = (el[scroll] > 0); + el[scroll] = 0; + return has; + }, + + isOverAxis: function(x, reference, size) { + //Determines when x coordinate is over "b" element axis + return (x > reference) && (x < (reference + size)); + }, + + isOver: function(y, x, top, left, height, width) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width); + }, + + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38 + } +}; + +//jQuery plugins +$.fn.extend({ + _focus: $.fn.focus, + focus: function(delay, fn) { + return typeof delay === 'number' + ? this.each(function() { + var elem = this; + setTimeout(function() { + $(elem).focus(); + (fn && fn.call(elem)); + }, delay); + }) + : this._focus.apply(this, arguments); + }, + + enableSelection: function() { + return this + .attr('unselectable', 'off') + .css('MozUserSelect', ''); + }, + + disableSelection: function() { + return this + .attr('unselectable', 'on') + .css('MozUserSelect', 'none'); + }, + + scrollParent: function() { + var scrollParent; + if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function(zIndex) { + if (zIndex !== undefined) { + return this.css('zIndex', zIndex); + } + + if (this.length) { + var elem = $(this[0]), position, value; + while (elem.length && elem[0] !== document) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css('position'); + if (position == 'absolute' || position == 'relative' || position == 'fixed') + { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt(elem.css('zIndex')); + if (!isNaN(value) && value != 0) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + } +}); + + +//Additional selectors +$.extend($.expr[':'], { + data: function(elem, i, match) { + return !!$.data(elem, match[3]); + }, + + focusable: function(element) { + var nodeName = element.nodeName.toLowerCase(), + tabIndex = $.attr(element, 'tabindex'); + return (/input|select|textarea|button|object/.test(nodeName) + ? !element.disabled + : 'a' == nodeName || 'area' == nodeName + ? element.href || !isNaN(tabIndex) + : !isNaN(tabIndex)) + // the element and all of its ancestors must be visible + // the browser may report that the area is hidden + && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length; + }, + + tabbable: function(element) { + var tabIndex = $.attr(element, 'tabindex'); + return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable'); + } +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.datepicker.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.datepicker.js new file mode 100644 index 000000000..042593be9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.datepicker.js @@ -0,0 +1,1727 @@ +/* + * jQuery UI Datepicker 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * jquery.ui.core.js + */ + +(function($) { // hide the namespace + +$.extend($.ui, { datepicker: { version: "1.8.1" } }); + +var PROP_NAME = 'datepicker'; +var dpuuid = new Date().getTime(); + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._keyEvent = false; // If the last event was a key event + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + closeText: 'Done', // Display text for close link + prevText: 'Prev', // Display text for previous month link + nextText: 'Next', // Display text for next month link + currentText: 'Today', // Display text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + weekHeader: 'Wk', // Column header for week of the year + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: '' // Additional text to append to the year in the month headers + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'show', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: 'c-10:c+10', // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: '_default', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '', // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false // True to size the input for the date format, false to leave as is + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>'); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function() { + return this.dpDiv; + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + var inlineSettings = null; + for (var attrName in this._defaults) { + var attrValue = target.getAttribute('date:' + attrName); + if (attrValue) { + inlineSettings = inlineSettings || {}; + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + var nodeName = target.nodeName.toLowerCase(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) + target.id = 'dp' + (++this.uuid); + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\$1'); // escape jQuery meta chars + return {id: id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + inst.append = $([]); + inst.trigger = $([]); + if (input.hasClass(this.markerClassName)) + return; + this._attachments(input, inst); + input.addClass(this.markerClassName).keydown(this._doKeyDown). + keypress(this._doKeyPress).keyup(this._doKeyUp). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + this._autoSize(inst); + $.data(target, PROP_NAME, inst); + }, + + /* Make attachments based on settings. */ + _attachments: function(input, inst) { + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (inst.append) + inst.append.remove(); + if (appendText) { + inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>'); + input[isRTL ? 'before' : 'after'](inst.append); + } + input.unbind('focus', this._showDatepicker); + if (inst.trigger) + inst.trigger.remove(); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + inst.trigger = $(this._get(inst, 'buttonImageOnly') ? + $('<img/>').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('<button type="button"></button>').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('<img/>').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0]) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(input[0]); + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, 'autoSize') && !inst.inline) { + var date = new Date(2009, 12 - 1, 20); // Ensure double digits + var dateFormat = this._get(inst, 'dateFormat'); + if (dateFormat.match(/[DM]/)) { + var findMax = function(names) { + var max = 0; + var maxI = 0; + for (var i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + 'monthNames' : 'monthNamesShort')))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay()); + } + inst.input.attr('size', this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) + return; + divSpan.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param date string or Date - the initial date to display + @param onSelect function - the function to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + var id = 'dp' + (++this.uuid); + this._dialogInput = $('<input type="text" id="' + id + + '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor == Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = document.documentElement.clientWidth; + var browserHeight = document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress). + unbind('keyup', this._doKeyUp); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = false; + inst.trigger.filter('button'). + each(function() { this.disabled = false; }).end(). + filter('img').css({opacity: '1.0', cursor: ''}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().removeClass('ui-state-disabled'); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = true; + inst.trigger.filter('button'). + each(function() { this.disabled = true; }).end(). + filter('img').css({opacity: '0.5', cursor: 'default'}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().addClass('ui-state-disabled'); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Retrieve the instance data for the target control. + @param target element - the target input field or division or span + @return object - the associated instance data + @throws error if a jQuery problem getting data */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw 'Missing instance data for this datepicker'; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or retrieve, + when retrieving also 'all' for all instance settings or + 'defaults' for all global defaults + @param value any - the new value for the setting + (omit if above is an object or to retrieve a value) */ + _optionDatepicker: function(target, name, value) { + var inst = this._getInst(target); + if (arguments.length == 2 && typeof name == 'string') { + return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) : + (inst ? (name == 'all' ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst) { + if (this._curInst == inst) { + this._hideDatepicker(); + } + var date = this._getDateDatepicker(target, true); + extendRemove(inst.settings, settings); + this._attachments($(target), inst); + this._autoSize(inst); + this._setDateDatepicker(target, date); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + @param target element - the target input field or division or span */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @param noDefault boolean - true if no default date is to be used + @return Date - the current date */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) + this._setDateFromField(inst, noDefault); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var inst = $.datepicker._getInst(event.target); + var handled = true; + var isRTL = inst.dpDiv.is('.ui-datepicker-rtl'); + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: var sel = $('td.' + $.datepicker._dayOverClass, inst.dpDiv). + add($('td.' + $.datepicker._currentClass, inst.dpDiv)); + if (sel[0]) + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + else + $.datepicker._hideDatepicker(); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target); + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target); + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D'); + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D'); + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else { + handled = false; + } + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var inst = $.datepicker._getInst(event.target); + if ($.datepicker._get(inst, 'constrainInput')) { + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode); + return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var inst = $.datepicker._getInst(event.target); + if (inst.input.val() != inst.lastVal) { + try { + var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (event) { + $.datepicker.log(event); + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst != inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + } + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim'); + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._datepickerShowing = true; + var borders = $.datepicker._getBorders(inst.dpDiv); + inst.dpDiv.find('iframe.ui-datepicker-cover'). // IE6- only + css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}); + }; + inst.dpDiv.zIndex($(input).zIndex()+1); + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess); + if (!showAnim || !duration) + postProcess(); + if (inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var self = this; + var borders = $.datepicker._getBorders(inst.dpDiv); + inst.dpDiv.empty().append(this._generateHTML(inst)) + .find('iframe.ui-datepicker-cover') // IE6- only + .css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}) + .end() + .find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a') + .bind('mouseout', function(){ + $(this).removeClass('ui-state-hover'); + if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover'); + if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover'); + }) + .bind('mouseover', function(){ + if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) { + $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover'); + if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover'); + if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover'); + } + }) + .end() + .find('.' + this._dayOverClass + ' a') + .trigger('mouseover') + .end(); + var numMonths = this._getNumberOfMonths(inst); + var cols = numMonths[1]; + var width = 17; + if (cols > 1) + inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em'); + else + inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width(''); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input && + inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + }, + + /* Retrieve the size of left and top borders for an element. + @param elem (jQuery object) the element of interest + @return (number[2]) the left and top borders */ + _getBorders: function(elem) { + var convert = function(value) { + return {thin: 1, medium: 2, thick: 3}[value] || value; + }; + return [parseFloat(convert(elem.css('border-left-width'))), + parseFloat(convert(elem.css('border-top-width')))]; + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(); + var dpHeight = inst.dpDiv.outerHeight(); + var inputWidth = inst.input ? inst.input.outerWidth() : 0; + var inputHeight = inst.input ? inst.input.outerHeight() : 0; + var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft(); + var viewHeight = document.documentElement.clientHeight + $(document).scrollTop(); + + offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var inst = this._getInst(obj); + var isRTL = this._get(inst, 'isRTL'); + while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) { + obj = obj[isRTL ? 'previousSibling' : 'nextSibling']; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker */ + _hideDatepicker: function(input) { + var inst = this._curInst; + if (!inst || (input && inst != $.data(input, PROP_NAME))) + return; + if (this._datepickerShowing) { + var showAnim = this._get(inst, 'showAnim'); + var duration = this._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + this._curInst = null; + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess); + if (!showAnim) + postProcess(); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar'); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if ($target[0].id != $.datepicker._mainDivId && + $target.parents('#' + $.datepicker._mainDivId).length == 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = this._getInst(target[0]); + inst._selectingMonthYear = false; + inst['selected' + (period == 'M' ? 'Month' : 'Year')] = + inst['draw' + (period == 'M' ? 'Month' : 'Year')] = + parseInt(select.options[select.selectedIndex].value,10); + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (inst.input && inst._selectingMonthYear && !$.browser.msie) + inst.input.focus(); + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var target = $(id); + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + var inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = this._getInst(target[0]); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input.focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat'); + var date = this._getDate(inst); + var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getTime()); + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var doy = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + lookAhead(match); + var size = (match == '@' ? 14 : (match == '!' ? 20 : + (match == 'y' ? 4 : (match == 'o' ? 3 : 2)))); + var digits = new RegExp('^\\d{1,' + size + '}'); + var num = value.substring(iValue).match(digits); + if (!num) + throw 'Missing number at position ' + iValue; + iValue += num[0].length; + return parseInt(num[0], 10); + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = (lookAhead(match) ? longNames : shortNames); + for (var i = 0; i < names.length; i++) { + if (value.substr(iValue, names[i].length) == names[i]) { + iValue += names[i].length; + return i + 1; + } + } + throw 'Unknown name at position ' + iValue; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'o': + doy = getNumber('o'); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case '!': + var date = new Date((getNumber('!') - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year == -1) + year = new Date().getFullYear(); + else if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + if (doy > -1) { + month = 1; + day = doy; + do { + var dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) + break; + month++; + day -= dim; + } while (true); + } + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/* + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + COOKIE: 'D, dd M yy', + ISO_8601: 'yy-mm-dd', + RFC_822: 'D, d M y', + RFC_850: 'DD, dd-M-y', + RFC_1036: 'D, d M y', + RFC_1123: 'D, d M yy', + RFC_2822: 'D, d M yy', + RSS: 'D, d M y', // RFC 822 + TICKS: '!', + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + o - day of year (no leading zeros) + oo - day of year (three digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + ! - Windows ticks (100ns since 01/01/0001) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value, len) { + var num = '' + value; + if (lookAhead(match)) + while (num.length < len) + num = '0' + num; + return num; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'o': + output += formatNumber('o', + (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case '!': + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() == inst.lastVal) { + return; + } + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.lastVal = inst.input ? inst.input.val() : null; + var date, defaultDate; + date = defaultDate = this._getDefaultDate(inst); + var settings = this._getFormatConfig(inst); + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + this.log(event); + dates = (noDefault ? '' : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, 'defaultDate'), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += parseInt(matches[1],10); break; + case 'w' : case 'W' : + day += parseInt(matches[1],10) * 7; break; + case 'm' : case 'M' : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + date = (date == null ? defaultDate : (typeof date == 'string' ? offsetString(date) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date))); + date = (date && date.toString() == 'Invalid Date' ? defaultDate : date); + if (date) { + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + } + return this._daylightSavingAdjust(date); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !(date); + var origMonth = inst.selectedMonth; + var origYear = inst.selectedYear; + date = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + inst.selectedDay = inst.currentDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear(); + if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange) + this._notifyChange(inst); + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? '' : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var isRTL = this._get(inst, 'isRTL'); + var showButtonPanel = this._get(inst, 'showButtonPanel'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var showCurrentAtPos = this._get(inst, 'showCurrentAtPos'); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth - showCurrentAtPos; + var drawYear = inst.drawYear; + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' + + ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>')); + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' + + ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' : + (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>')); + var currentText = this._get(inst, 'currentText'); + var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : ''); + var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') + + (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid + + '.datepicker._gotoToday(\'#' + inst.id + '\');"' + + '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : ''; + var firstDay = parseInt(this._get(inst, 'firstDay'),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + var showWeek = this._get(inst, 'showWeek'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var monthNamesShort = this._get(inst, 'monthNamesShort'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var selectOtherMonths = this._get(inst, 'selectOtherMonths'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var defaultDate = this._getDefaultDate(inst); + var html = ''; + for (var row = 0; row < numMonths[0]; row++) { + var group = ''; + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + var cornerClass = ' ui-corner-all'; + var calender = ''; + if (isMultiMonth) { + calender += '<div class="ui-datepicker-group'; + if (numMonths[1] > 1) + switch (col) { + case 0: calender += ' ui-datepicker-group-first'; + cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break; + case numMonths[1]-1: calender += ' ui-datepicker-group-last'; + cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break; + default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break; + } + calender += '">'; + } + calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' + + (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') + + (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + '</div><table class="ui-datepicker-calendar"><thead>' + + '<tr>'; + var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' + + '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>'; + } + calender += thead + '</tr></thead><tbody>'; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += '<tr>'; + var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' + + this._get(inst, 'calculateWeek')(printDate) + '</td>'); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += '<td class="' + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months + ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key + (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ? + // or defaultDate is current printedDate and defaultDate is selectedDate + ' ' + this._dayOverClass : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days + (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates + (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day + (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title + (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' + + inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions + (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months + (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' + + (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') + + (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day + (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months + '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + '</tr>'; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += '</tbody></table>' + (isMultiMonth ? '</div>' + + ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : ''); + group += calender; + } + html += group; + } + html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ? + '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : ''); + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + var changeMonth = this._get(inst, 'changeMonth'); + var changeYear = this._get(inst, 'changeYear'); + var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); + var html = '<div class="ui-datepicker-title">'; + var monthHtml = ''; + // month selection + if (secondary || !changeMonth) + monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>'; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + monthHtml += '<select class="ui-datepicker-month" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (var month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth())) + monthHtml += '<option value="' + month + '"' + + (month == drawMonth ? ' selected="selected"' : '') + + '>' + monthNamesShort[month] + '</option>'; + } + monthHtml += '</select>'; + } + if (!showMonthAfterYear) + html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : ''); + // year selection + if (secondary || !changeYear) + html += '<span class="ui-datepicker-year">' + drawYear + '</span>'; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var thisYear = new Date().getFullYear(); + var determineYear = function(value) { + var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + var year = determineYear(years[0]); + var endYear = Math.max(year, determineYear(years[1] || '')); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + html += '<select class="ui-datepicker-year" ' + + 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + + 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' + + '>'; + for (; year <= endYear; year++) { + html += '<option value="' + year + '"' + + (year == drawYear ? ' selected="selected"' : '') + + '>' + year + '</option>'; + } + html += '</select>'; + } + html += this._get(inst, 'yearSuffix'); + if (showMonthAfterYear) + html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml; + html += '</div>'; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._restrictMinMax(inst, + this._daylightSavingAdjust(new Date(year, month, day))); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + date = (minDate && date < minDate ? minDate : date); + date = (maxDate && date > maxDate ? maxDate : date); + return date; + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - new Date(year, month, 32).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime())); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick). + find('body').append($.datepicker.dpDiv); + $.datepicker.initialized = true; + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.8.1"; + +// Workaround for #4055 +// Add another global to avoid noConflict issues with inline event handlers +window['DP_jQuery_' + dpuuid] = $; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.dialog.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.dialog.js new file mode 100644 index 000000000..120729e5d --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.dialog.js @@ -0,0 +1,823 @@ +/* + * jQuery UI Dialog 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function($) { + +var uiDialogClasses = + 'ui-dialog ' + + 'ui-widget ' + + 'ui-widget-content ' + + 'ui-corner-all '; + +$.widget("ui.dialog", { + options: { + autoOpen: true, + buttons: {}, + closeOnEscape: true, + closeText: 'close', + dialogClass: '', + draggable: true, + hide: null, + height: 'auto', + maxHeight: false, + maxWidth: false, + minHeight: 150, + minWidth: 150, + modal: false, + position: 'center', + resizable: true, + show: null, + stack: true, + title: '', + width: 300, + zIndex: 1000 + }, + _create: function() { + this.originalTitle = this.element.attr('title'); + + var self = this, + options = self.options, + + title = options.title || self.originalTitle || '&#160;', + titleId = $.ui.dialog.getTitleId(self.element), + + uiDialog = (self.uiDialog = $('<div></div>')) + .appendTo(document.body) + .hide() + .addClass(uiDialogClasses + options.dialogClass) + .css({ + zIndex: options.zIndex + }) + // setting tabIndex makes the div focusable + // setting outline to 0 prevents a border on focus in Mozilla + .attr('tabIndex', -1).css('outline', 0).keydown(function(event) { + if (options.closeOnEscape && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE) { + + self.close(event); + event.preventDefault(); + } + }) + .attr({ + role: 'dialog', + 'aria-labelledby': titleId + }) + .mousedown(function(event) { + self.moveToTop(false, event); + }), + + uiDialogContent = self.element + .show() + .removeAttr('title') + .addClass( + 'ui-dialog-content ' + + 'ui-widget-content') + .appendTo(uiDialog), + + uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>')) + .addClass( + 'ui-dialog-titlebar ' + + 'ui-widget-header ' + + 'ui-corner-all ' + + 'ui-helper-clearfix' + ) + .prependTo(uiDialog), + + uiDialogTitlebarClose = $('<a href="#"></a>') + .addClass( + 'ui-dialog-titlebar-close ' + + 'ui-corner-all' + ) + .attr('role', 'button') + .hover( + function() { + uiDialogTitlebarClose.addClass('ui-state-hover'); + }, + function() { + uiDialogTitlebarClose.removeClass('ui-state-hover'); + } + ) + .focus(function() { + uiDialogTitlebarClose.addClass('ui-state-focus'); + }) + .blur(function() { + uiDialogTitlebarClose.removeClass('ui-state-focus'); + }) + .click(function(event) { + self.close(event); + return false; + }) + .appendTo(uiDialogTitlebar), + + uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>')) + .addClass( + 'ui-icon ' + + 'ui-icon-closethick' + ) + .text(options.closeText) + .appendTo(uiDialogTitlebarClose), + + uiDialogTitle = $('<span></span>') + .addClass('ui-dialog-title') + .attr('id', titleId) + .html(title) + .prependTo(uiDialogTitlebar); + + //handling of deprecated beforeclose (vs beforeClose) option + //Ticket #4669 http://dev.jqueryui.com/ticket/4669 + //TODO: remove in 1.9pre + if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) { + options.beforeClose = options.beforeclose; + } + + uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection(); + + if (options.draggable && $.fn.draggable) { + self._makeDraggable(); + } + if (options.resizable && $.fn.resizable) { + self._makeResizable(); + } + + self._createButtons(options.buttons); + self._isOpen = false; + + if ($.fn.bgiframe) { + uiDialog.bgiframe(); + } + }, + _init: function() { + if ( this.options.autoOpen ) { + this.open(); + } + }, + + destroy: function() { + var self = this; + + if (self.overlay) { + self.overlay.destroy(); + } + self.uiDialog.hide(); + self.element + .unbind('.dialog') + .removeData('dialog') + .removeClass('ui-dialog-content ui-widget-content') + .hide().appendTo('body'); + self.uiDialog.remove(); + + if (self.originalTitle) { + self.element.attr('title', self.originalTitle); + } + + return self; + }, + + widget: function() { + return this.uiDialog; + }, + + close: function(event) { + var self = this, + maxZ; + + if (false === self._trigger('beforeClose', event)) { + return; + } + + if (self.overlay) { + self.overlay.destroy(); + } + self.uiDialog.unbind('keypress.ui-dialog'); + + self._isOpen = false; + + if (self.options.hide) { + self.uiDialog.hide(self.options.hide, function() { + self._trigger('close', event); + }); + } else { + self.uiDialog.hide(); + self._trigger('close', event); + } + + $.ui.dialog.overlay.resize(); + + // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) + if (self.options.modal) { + maxZ = 0; + $('.ui-dialog').each(function() { + if (this !== self.uiDialog[0]) { + maxZ = Math.max(maxZ, $(this).css('z-index')); + } + }); + $.ui.dialog.maxZ = maxZ; + } + + return self; + }, + + isOpen: function() { + return this._isOpen; + }, + + // the force parameter allows us to move modal dialogs to their correct + // position on open + moveToTop: function(force, event) { + var self = this, + options = self.options, + saveScroll; + + if ((options.modal && !force) || + (!options.stack && !options.modal)) { + return self._trigger('focus', event); + } + + if (options.zIndex > $.ui.dialog.maxZ) { + $.ui.dialog.maxZ = options.zIndex; + } + if (self.overlay) { + $.ui.dialog.maxZ += 1; + self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ); + } + + //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed. + // http://ui.jquery.com/bugs/ticket/3193 + saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') }; + $.ui.dialog.maxZ += 1; + self.uiDialog.css('z-index', $.ui.dialog.maxZ); + self.element.attr(saveScroll); + self._trigger('focus', event); + + return self; + }, + + open: function() { + if (this._isOpen) { return; } + + var self = this, + options = self.options, + uiDialog = self.uiDialog; + + self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null; + if (uiDialog.next().length) { + uiDialog.appendTo('body'); + } + self._size(); + self._position(options.position); + uiDialog.show(options.show); + self.moveToTop(true); + + // prevent tabbing out of modal dialogs + if (options.modal) { + uiDialog.bind('keypress.ui-dialog', function(event) { + if (event.keyCode !== $.ui.keyCode.TAB) { + return; + } + + var tabbables = $(':tabbable', this), + first = tabbables.filter(':first'), + last = tabbables.filter(':last'); + + if (event.target === last[0] && !event.shiftKey) { + first.focus(1); + return false; + } else if (event.target === first[0] && event.shiftKey) { + last.focus(1); + return false; + } + }); + } + + // set focus to the first tabbable element in the content area or the first button + // if there are no tabbable elements, set focus on the dialog itself + $([]) + .add(uiDialog.find('.ui-dialog-content :tabbable:first')) + .add(uiDialog.find('.ui-dialog-buttonpane :tabbable:first')) + .add(uiDialog) + .filter(':first') + .focus(); + + self._trigger('open'); + self._isOpen = true; + + return self; + }, + + _createButtons: function(buttons) { + var self = this, + hasButtons = false, + uiDialogButtonPane = $('<div></div>') + .addClass( + 'ui-dialog-buttonpane ' + + 'ui-widget-content ' + + 'ui-helper-clearfix' + ); + + // if we already have a button pane, remove it + self.uiDialog.find('.ui-dialog-buttonpane').remove(); + + if (typeof buttons === 'object' && buttons !== null) { + $.each(buttons, function() { + return !(hasButtons = true); + }); + } + if (hasButtons) { + $.each(buttons, function(name, fn) { + var button = $('<button type="button"></button>') + .text(name) + .click(function() { fn.apply(self.element[0], arguments); }) + .appendTo(uiDialogButtonPane); + if ($.fn.button) { + button.button(); + } + }); + uiDialogButtonPane.appendTo(self.uiDialog); + } + }, + + _makeDraggable: function() { + var self = this, + options = self.options, + doc = $(document), + heightBeforeDrag; + + function filteredUi(ui) { + return { + position: ui.position, + offset: ui.offset + }; + } + + self.uiDialog.draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', + handle: '.ui-dialog-titlebar', + containment: 'document', + start: function(event, ui) { + heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height(); + $(this).height($(this).height()).addClass("ui-dialog-dragging"); + self._trigger('dragStart', event, filteredUi(ui)); + }, + drag: function(event, ui) { + self._trigger('drag', event, filteredUi(ui)); + }, + stop: function(event, ui) { + options.position = [ui.position.left - doc.scrollLeft(), + ui.position.top - doc.scrollTop()]; + $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag); + self._trigger('dragStop', event, filteredUi(ui)); + $.ui.dialog.overlay.resize(); + } + }); + }, + + _makeResizable: function(handles) { + handles = (handles === undefined ? this.options.resizable : handles); + var self = this, + options = self.options, + // .ui-resizable has position: relative defined in the stylesheet + // but dialogs have to use absolute or fixed positioning + position = self.uiDialog.css('position'), + resizeHandles = (typeof handles === 'string' ? + handles : + 'n,e,s,w,se,sw,ne,nw' + ); + + function filteredUi(ui) { + return { + originalPosition: ui.originalPosition, + originalSize: ui.originalSize, + position: ui.position, + size: ui.size + }; + } + + self.uiDialog.resizable({ + cancel: '.ui-dialog-content', + containment: 'document', + alsoResize: self.element, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: self._minHeight(), + handles: resizeHandles, + start: function(event, ui) { + $(this).addClass("ui-dialog-resizing"); + self._trigger('resizeStart', event, filteredUi(ui)); + }, + resize: function(event, ui) { + self._trigger('resize', event, filteredUi(ui)); + }, + stop: function(event, ui) { + $(this).removeClass("ui-dialog-resizing"); + options.height = $(this).height(); + options.width = $(this).width(); + self._trigger('resizeStop', event, filteredUi(ui)); + $.ui.dialog.overlay.resize(); + } + }) + .css('position', position) + .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se'); + }, + + _minHeight: function() { + var options = this.options; + + if (options.height === 'auto') { + return options.minHeight; + } else { + return Math.min(options.minHeight, options.height); + } + }, + + _position: function(position) { + var myAt = [], + offset = [0, 0], + isVisible; + + position = position || $.ui.dialog.prototype.options.position; + + // deep extending converts arrays to objects in jQuery <= 1.3.2 :-( +// if (typeof position == 'string' || $.isArray(position)) { +// myAt = $.isArray(position) ? position : position.split(' '); + + if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) { + myAt = position.split ? position.split(' ') : [position[0], position[1]]; + if (myAt.length === 1) { + myAt[1] = myAt[0]; + } + + $.each(['left', 'top'], function(i, offsetPosition) { + if (+myAt[i] === myAt[i]) { + offset[i] = myAt[i]; + myAt[i] = offsetPosition; + } + }); + } else if (typeof position === 'object') { + if ('left' in position) { + myAt[0] = 'left'; + offset[0] = position.left; + } else if ('right' in position) { + myAt[0] = 'right'; + offset[0] = -position.right; + } + + if ('top' in position) { + myAt[1] = 'top'; + offset[1] = position.top; + } else if ('bottom' in position) { + myAt[1] = 'bottom'; + offset[1] = -position.bottom; + } + } + + // need to show the dialog to get the actual offset in the position plugin + isVisible = this.uiDialog.is(':visible'); + if (!isVisible) { + this.uiDialog.show(); + } + this.uiDialog + // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 + .css({ top: 0, left: 0 }) + .position({ + my: myAt.join(' '), + at: myAt.join(' '), + offset: offset.join(' '), + of: window, + collision: 'fit', + // ensure that the titlebar is never outside the document + using: function(pos) { + var topOffset = $(this).css(pos).offset().top; + if (topOffset < 0) { + $(this).css('top', pos.top - topOffset); + } + } + }); + if (!isVisible) { + this.uiDialog.hide(); + } + }, + + _setOption: function(key, value){ + var self = this, + uiDialog = self.uiDialog, + isResizable = uiDialog.is(':data(resizable)'), + resize = false; + + switch (key) { + //handling of deprecated beforeclose (vs beforeClose) option + //Ticket #4669 http://dev.jqueryui.com/ticket/4669 + //TODO: remove in 1.9pre + case "beforeclose": + key = "beforeClose"; + break; + case "buttons": + self._createButtons(value); + break; + case "closeText": + // convert whatever was passed in to a string, for text() to not throw up + self.uiDialogTitlebarCloseText.text("" + value); + break; + case "dialogClass": + uiDialog + .removeClass(self.options.dialogClass) + .addClass(uiDialogClasses + value); + break; + case "disabled": + if (value) { + uiDialog.addClass('ui-dialog-disabled'); + } else { + uiDialog.removeClass('ui-dialog-disabled'); + } + break; + case "draggable": + if (value) { + self._makeDraggable(); + } else { + uiDialog.draggable('destroy'); + } + break; + case "height": + resize = true; + break; + case "maxHeight": + if (isResizable) { + uiDialog.resizable('option', 'maxHeight', value); + } + resize = true; + break; + case "maxWidth": + if (isResizable) { + uiDialog.resizable('option', 'maxWidth', value); + } + resize = true; + break; + case "minHeight": + if (isResizable) { + uiDialog.resizable('option', 'minHeight', value); + } + resize = true; + break; + case "minWidth": + if (isResizable) { + uiDialog.resizable('option', 'minWidth', value); + } + resize = true; + break; + case "position": + self._position(value); + break; + case "resizable": + // currently resizable, becoming non-resizable + if (isResizable && !value) { + uiDialog.resizable('destroy'); + } + + // currently resizable, changing handles + if (isResizable && typeof value === 'string') { + uiDialog.resizable('option', 'handles', value); + } + + // currently non-resizable, becoming resizable + if (!isResizable && value !== false) { + self._makeResizable(value); + } + break; + case "title": + // convert whatever was passed in o a string, for html() to not throw up + $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;')); + break; + case "width": + resize = true; + break; + } + + $.Widget.prototype._setOption.apply(self, arguments); + if (resize) { + self._size(); + } + }, + + _size: function() { + /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content + * divs will both have width and height set, so we need to reset them + */ + var options = this.options, + nonContentHeight; + + // reset content sizing + // hide for non content measurement because height: 0 doesn't work in IE quirks mode (see #4350) + this.element.css({ + width: 'auto', + minHeight: 0, + height: 0 + }); + + // reset wrapper sizing + // determine the height of all the non-content elements + nonContentHeight = this.uiDialog.css({ + height: 'auto', + width: options.width + }) + .height(); + + this.element + .css(options.height === 'auto' ? { + minHeight: Math.max(options.minHeight - nonContentHeight, 0), + height: 'auto' + } : { + minHeight: 0, + height: Math.max(options.height - nonContentHeight, 0) + }) + .show(); + + if (this.uiDialog.is(':data(resizable)')) { + this.uiDialog.resizable('option', 'minHeight', this._minHeight()); + } + } +}); + +$.extend($.ui.dialog, { + version: "1.8.1", + + uuid: 0, + maxZ: 0, + + getTitleId: function($el) { + var id = $el.attr('id'); + if (!id) { + this.uuid += 1; + id = this.uuid; + } + return 'ui-dialog-title-' + id; + }, + + overlay: function(dialog) { + this.$el = $.ui.dialog.overlay.create(dialog); + } +}); + +$.extend($.ui.dialog.overlay, { + instances: [], + // reuse old instances due to IE memory leak with alpha transparency (see #5185) + oldInstances: [], + maxZ: 0, + events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), + function(event) { return event + '.dialog-overlay'; }).join(' '), + create: function(dialog) { + if (this.instances.length === 0) { + // prevent use of anchors and inputs + // we use a setTimeout in case the overlay is created from an + // event that we're going to be cancelling (see #2804) + setTimeout(function() { + // handle $(el).dialog().dialog('close') (see #4065) + if ($.ui.dialog.overlay.instances.length) { + $(document).bind($.ui.dialog.overlay.events, function(event) { + // stop events if the z-index of the target is < the z-index of the overlay + return ($(event.target).zIndex() >= $.ui.dialog.overlay.maxZ); + }); + } + }, 1); + + // allow closing by pressing the escape key + $(document).bind('keydown.dialog-overlay', function(event) { + if (dialog.options.closeOnEscape && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE) { + + dialog.close(event); + event.preventDefault(); + } + }); + + // handle window resize + $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); + } + + var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay')) + .appendTo(document.body) + .css({ + width: this.width(), + height: this.height() + }); + + if ($.fn.bgiframe) { + $el.bgiframe(); + } + + this.instances.push($el); + return $el; + }, + + destroy: function($el) { + this.oldInstances.push(this.instances.splice($.inArray($el, this.instances), 1)[0]); + + if (this.instances.length === 0) { + $([document, window]).unbind('.dialog-overlay'); + } + + $el.remove(); + + // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) + var maxZ = 0; + $.each(this.instances, function() { + maxZ = Math.max(maxZ, this.css('z-index')); + }); + this.maxZ = maxZ; + }, + + height: function() { + var scrollHeight, + offsetHeight; + // handle IE 6 + if ($.browser.msie && $.browser.version < 7) { + scrollHeight = Math.max( + document.documentElement.scrollHeight, + document.body.scrollHeight + ); + offsetHeight = Math.max( + document.documentElement.offsetHeight, + document.body.offsetHeight + ); + + if (scrollHeight < offsetHeight) { + return $(window).height() + 'px'; + } else { + return scrollHeight + 'px'; + } + // handle "good" browsers + } else { + return $(document).height() + 'px'; + } + }, + + width: function() { + var scrollWidth, + offsetWidth; + // handle IE 6 + if ($.browser.msie && $.browser.version < 7) { + scrollWidth = Math.max( + document.documentElement.scrollWidth, + document.body.scrollWidth + ); + offsetWidth = Math.max( + document.documentElement.offsetWidth, + document.body.offsetWidth + ); + + if (scrollWidth < offsetWidth) { + return $(window).width() + 'px'; + } else { + return scrollWidth + 'px'; + } + // handle "good" browsers + } else { + return $(document).width() + 'px'; + } + }, + + resize: function() { + /* If the dialog is draggable and the user drags it past the + * right edge of the window, the document becomes wider so we + * need to stretch the overlay. If the user then drags the + * dialog back to the left, the document will become narrower, + * so we need to shrink the overlay to the appropriate size. + * This is handled by shrinking the overlay before setting it + * to the full document size. + */ + var $overlays = $([]); + $.each($.ui.dialog.overlay.instances, function() { + $overlays = $overlays.add(this); + }); + + $overlays.css({ + width: 0, + height: 0 + }).css({ + width: $.ui.dialog.overlay.width(), + height: $.ui.dialog.overlay.height() + }); + } +}); + +$.extend($.ui.dialog.overlay.prototype, { + destroy: function() { + $.ui.dialog.overlay.destroy(this.$el); + } +}); + +}(jQuery)); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.draggable.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.draggable.js new file mode 100644 index 000000000..bce43eb82 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.draggable.js @@ -0,0 +1,797 @@ +/* + * jQuery UI Draggable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.draggable", $.ui.mouse, { + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false + }, + _create: function() { + + if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position"))) + this.element[0].style.position = 'relative'; + + (this.options.addClasses && this.element.addClass("ui-draggable")); + (this.options.disabled && this.element.addClass("ui-draggable-disabled")); + + this._mouseInit(); + + }, + + destroy: function() { + if(!this.element.data('draggable')) return; + this.element + .removeData("draggable") + .unbind(".draggable") + .removeClass("ui-draggable" + + " ui-draggable-dragging" + + " ui-draggable-disabled"); + this._mouseDestroy(); + + return this; + }, + + _mouseCapture: function(event) { + + var o = this.options; + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle')) + return false; + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) + return false; + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css("position"); + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.positionAbs = this.element.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this.position = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + //Trigger event + callbacks + if(this._trigger("start", event) === false) { + this._clear(); + return false; + } + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.helper.addClass("ui-draggable-dragging"); + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + }, + + _mouseDrag: function(event, noPropagation) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + if(this._trigger('drag', event, ui) === false) { + this._mouseUp({}); + return false; + } + this.position = ui.position; + } + + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) + dropped = $.ui.ddmanager.drop(this, event); + + //if a drop comes from outside (a sortable) + if(this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + //if the original element is removed, don't bother to continue + if(!this.element[0] || !this.element[0].parentNode) + return false; + + if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + var self = this; + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + if(self._trigger("stop", event) !== false) { + self._clear(); + } + }); + } else { + if(this._trigger("stop", event) !== false) { + this._clear(); + } + } + + return false; + }, + + cancel: function() { + + if(this.helper.is(".ui-draggable-dragging")) { + this._mouseUp({}); + } else { + this._clear(); + } + + return this; + + }, + + _getHandle: function(event) { + + var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; + $(this.options.handle, this.element) + .find("*") + .andSelf() + .each(function() { + if(this == event.target) handle = true; + }); + + return handle; + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element); + + if(!helper.parents('body').length) + helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); + + if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) + helper.css("position", "absolute"); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj == 'string') { + obj = obj.split(' '); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.element.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) { + var ce = $(o.containment)[0]; if(!ce) return; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } else if(o.containment.constructor == Array) { + this.containment = o.containment; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove(); + //if($.ui.ddmanager) $.ui.ddmanager.current = null; + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function(type, event, ui) { + ui = ui || this._uiHash(); + $.ui.plugin.call(this, type, [event, ui]); + if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins + return $.Widget.prototype._trigger.call(this, type, event, ui); + }, + + plugins: {}, + + _uiHash: function(event) { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + }; + } + +}); + +$.extend($.ui.draggable, { + version: "1.8.1" +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options, + uiSortable = $.extend({}, ui, { item: inst.element }); + inst.sortables = []; + $(o.connectToSortable).each(function() { + var sortable = $.data(this, 'sortable'); + if (sortable && !sortable.options.disabled) { + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache + sortable._trigger("activate", event, uiSortable); + } + }); + + }, + stop: function(event, ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("draggable"), + uiSortable = $.extend({}, ui, { item: inst.element }); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + + this.instance.isOver = 0; + + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + + //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid' + if(this.shouldRevert) this.instance.options.revert = true; + + //Trigger the stop of the sortable + this.instance._mouseStop(event); + + this.instance.options.helper = this.instance.options._helper; + + //If the helper has been the original item, restore properties in the sortable + if(inst.options.helper == 'original') + this.instance.currentItem.css({ top: 'auto', left: 'auto' }); + + } else { + this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance + this.instance._trigger("deactivate", event, uiSortable); + } + + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), self = this; + + var checkPos = function(o) { + var dyClick = this.offset.click.top, dxClick = this.offset.click.left; + var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left; + var itemHeight = o.height, itemWidth = o.width; + var itemTop = o.top, itemLeft = o.left; + + return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth); + }; + + $.each(inst.sortables, function(i) { + + //Copy over some variables to allow calling the sortable's native _intersectsWith + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + + if(this.instance._intersectsWith(this.instance.containerCache)) { + + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + + this.instance.isOver = 1; + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + event.target = this.instance.currentItem[0]; + this.instance._mouseCapture(event, true); + this.instance._mouseStart(event, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst._trigger("toSortable", event); + inst.dropped = this.instance.element; //draggable revert needs that + //hack so receive/update callbacks work (mostly) + inst.currentItem = inst.element; + this.instance.fromOutside = inst; + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) this.instance._mouseDrag(event); + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + + //Prevent reverting on this forced stop + this.instance.options.revert = false; + + // The out event needs to be triggered independently + this.instance._trigger('out', event, this.instance._uiHash(this.instance)); + + this.instance._mouseStop(event, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) this.instance.placeholder.remove(); + + inst._trigger("fromSortable", event); + inst.dropped = false; //draggable revert needs that + } + + }; + + }); + + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function(event, ui) { + var t = $('body'), o = $(this).data('draggable').options; + if (t.css("cursor")) o._cursor = t.css("cursor"); + t.css("cursor", o.cursor); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if (o._cursor) $('body').css("cursor", o._cursor); + } +}); + +$.ui.plugin.add("draggable", "iframeFix", { + start: function(event, ui) { + var o = $(this).data('draggable').options; + $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { + $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>') + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + }, + stop: function(event, ui) { + $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data('draggable').options; + if(t.css("opacity")) o._opacity = t.css("opacity"); + t.css('opacity', o.opacity); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if(o._opacity) $(ui.helper).css('opacity', o._opacity); + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function(event, ui) { + var i = $(this).data("draggable"); + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset(); + }, + drag: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options, scrolled = false; + + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') { + + if(!o.axis || o.axis != 'x') { + if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; + } + + if(!o.axis || o.axis != 'y') { + if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; + } + + } else { + + if(!o.axis || o.axis != 'x') { + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(!o.axis || o.axis != 'y') { + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(i, event); + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options; + i.snapElements = []; + + $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() { + var $t = $(this); var $o = $t.offset(); + if(this != i.element[0]) i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options; + var d = o.snapTolerance; + + var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; + + for (var i = inst.snapElements.length - 1; i >= 0; i--){ + + var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, + t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; + + //Yes, I know, this is insane ;) + if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) { + if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = false; + continue; + } + + if(o.snapMode != 'inner') { + var ts = Math.abs(t - y2) <= d; + var bs = Math.abs(b - y1) <= d; + var ls = Math.abs(l - x2) <= d; + var rs = Math.abs(r - x1) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; + } + + var first = (ts || bs || ls || rs); + + if(o.snapMode != 'outer') { + var ts = Math.abs(t - y1) <= d; + var bs = Math.abs(b - y2) <= d; + var ls = Math.abs(l - x1) <= d; + var rs = Math.abs(r - x2) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; + } + + if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + }; + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function(event, ui) { + + var o = $(this).data("draggable").options; + + var group = $.makeArray($(o.stack)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0); + }); + if (!group.length) { return; } + + var min = parseInt(group[0].style.zIndex) || 0; + $(group).each(function(i) { + this.style.zIndex = min + i; + }); + + this[0].style.zIndex = min + group.length; + + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("draggable").options; + if(t.css("zIndex")) o._zIndex = t.css("zIndex"); + t.css('zIndex', o.zIndex); + }, + stop: function(event, ui) { + var o = $(this).data("draggable").options; + if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex); + } +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.droppable.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.droppable.js new file mode 100644 index 000000000..a356a8d37 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.droppable.js @@ -0,0 +1,285 @@ +/* + * jQuery UI Droppable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.mouse.js + * jquery.ui.draggable.js + */ +(function($) { + +$.widget("ui.droppable", { + widgetEventPrefix: "drop", + options: { + accept: '*', + activeClass: false, + addClasses: true, + greedy: false, + hoverClass: false, + scope: 'default', + tolerance: 'intersect' + }, + _create: function() { + + var o = this.options, accept = o.accept; + this.isover = 0; this.isout = 1; + + this.accept = $.isFunction(accept) ? accept : function(d) { + return d.is(accept); + }; + + //Store the droppable's proportions + this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || []; + $.ui.ddmanager.droppables[o.scope].push(this); + + (o.addClasses && this.element.addClass("ui-droppable")); + + }, + + destroy: function() { + var drop = $.ui.ddmanager.droppables[this.options.scope]; + for ( var i = 0; i < drop.length; i++ ) + if ( drop[i] == this ) + drop.splice(i, 1); + + this.element + .removeClass("ui-droppable ui-droppable-disabled") + .removeData("droppable") + .unbind(".droppable"); + + return this; + }, + + _setOption: function(key, value) { + + if(key == 'accept') { + this.accept = $.isFunction(value) ? value : function(d) { + return d.is(value); + }; + } + $.Widget.prototype._setOption.apply(this, arguments); + }, + + _activate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) this.element.addClass(this.options.activeClass); + (draggable && this._trigger('activate', event, this.ui(draggable))); + }, + + _deactivate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) this.element.removeClass(this.options.activeClass); + (draggable && this._trigger('deactivate', event, this.ui(draggable))); + }, + + _over: function(event) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) this.element.addClass(this.options.hoverClass); + this._trigger('over', event, this.ui(draggable)); + } + + }, + + _out: function(event) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass); + this._trigger('out', event, this.ui(draggable)); + } + + }, + + _drop: function(event,custom) { + + var draggable = custom || $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element + + var childrenIntersection = false; + this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, 'droppable'); + if( + inst.options.greedy + && !inst.options.disabled + && inst.options.scope == draggable.options.scope + && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) + && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance) + ) { childrenIntersection = true; return false; } + }); + if(childrenIntersection) return false; + + if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.activeClass) this.element.removeClass(this.options.activeClass); + if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass); + this._trigger('drop', event, this.ui(draggable)); + return this.element; + } + + return false; + + }, + + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + offset: c.positionAbs + }; + } + +}); + +$.extend($.ui.droppable, { + version: "1.8.1" +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) return false; + + var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, + y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height; + var l = droppable.offset.left, r = l + droppable.proportions.width, + t = droppable.offset.top, b = t + droppable.proportions.height; + + switch (toleranceMode) { + case 'fit': + return (l < x1 && x2 < r + && t < y1 && y2 < b); + break; + case 'intersect': + return (l < x1 + (draggable.helperProportions.width / 2) // Right Half + && x2 - (draggable.helperProportions.width / 2) < r // Left Half + && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half + && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + break; + case 'pointer': + var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left), + draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top), + isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width); + return isOver; + break; + case 'touch': + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + break; + default: + return false; + break; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: { 'default': [] }, + prepareOffsets: function(t, event) { + + var m = $.ui.ddmanager.droppables[t.options.scope] || []; + var type = event ? event.type : null; // workaround for #2317 + var list = (t.currentItem || t.element).find(":data(droppable)").andSelf(); + + droppablesLoop: for (var i = 0; i < m.length; i++) { + + if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted + for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item + m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue + + m[i].offset = m[i].element.offset(); + m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; + + if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables + + } + + }, + drop: function(draggable, event) { + + var dropped = false; + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(!this.options) return; + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) + dropped = dropped || this._drop.call(this, event); + + if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + this.isout = 1; this.isover = 0; + this._deactivate.call(this, event); + } + + }); + return dropped; + + }, + drag: function(draggable, event) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event); + + //Run through all droppables and check their positions based on specific tolerance options + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(this.options.disabled || this.greedyChild || !this.visible) return; + var intersects = $.ui.intersect(draggable, this, this.options.tolerance); + + var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null); + if(!c) return; + + var parentInstance; + if (this.options.greedy) { + var parent = this.element.parents(':data(droppable):eq(0)'); + if (parent.length) { + parentInstance = $.data(parent[0], 'droppable'); + parentInstance.greedyChild = (c == 'isover' ? 1 : 0); + } + } + + // we just moved into a greedy child + if (parentInstance && c == 'isover') { + parentInstance['isover'] = 0; + parentInstance['isout'] = 1; + parentInstance._out.call(parentInstance, event); + } + + this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0; + this[c == "isover" ? "_over" : "_out"].call(this, event); + + // we just moved out of a greedy child + if (parentInstance && c == 'isout') { + parentInstance['isout'] = 0; + parentInstance['isover'] = 1; + parentInstance._over.call(parentInstance, event); + } + }); + + } +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.mouse.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.mouse.js new file mode 100644 index 000000000..2a16283ef --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.mouse.js @@ -0,0 +1,151 @@ +/*! + * jQuery UI Mouse 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.mouse", { + options: { + cancel: ':input,option', + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var self = this; + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if(self._preventClickEvent) { + self._preventClickEvent = false; + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + // TODO: figure out why we have to use originalEvent + event.originalEvent = event.originalEvent || {}; + if (event.originalEvent.mouseHandled) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var self = this, + btnIsLeft = (event.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + // preventDefault() is used to prevent the selection of text here - + // however, in Safari, this causes select boxes not to be selectable + // anymore, so this fix is needed + ($.browser.safari || event.preventDefault()); + + event.originalEvent.mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + this._preventClickEvent = (event.target == this._mouseDownEvent.target); + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.position.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.position.js new file mode 100644 index 000000000..10c6dfa13 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.position.js @@ -0,0 +1,233 @@ +/* + * jQuery UI Position 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Position + */ +(function( $ ) { + +$.ui = $.ui || {}; + +var horizontalPositions = /left|center|right/, + horizontalDefault = "center", + verticalPositions = /top|center|bottom/, + verticalDefault = "center", + _position = $.fn.position, + _offset = $.fn.offset; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var target = $( options.of ), + collision = ( options.collision || "flip" ).split( " " ), + offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ], + targetWidth, + targetHeight, + basePosition; + + if ( options.of.nodeType === 9 ) { + targetWidth = target.width(); + targetHeight = target.height(); + basePosition = { top: 0, left: 0 }; + } else if ( options.of.scrollTo && options.of.document ) { + targetWidth = target.width(); + targetHeight = target.height(); + basePosition = { top: target.scrollTop(), left: target.scrollLeft() }; + } else if ( options.of.preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + targetWidth = targetHeight = 0; + basePosition = { top: options.of.pageY, left: options.of.pageX }; + } else { + targetWidth = target.outerWidth(); + targetHeight = target.outerHeight(); + basePosition = target.offset(); + } + + // force my and at to have valid horizontal and veritcal positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[this] || "" ).split( " " ); + if ( pos.length === 1) { + pos = horizontalPositions.test( pos[0] ) ? + pos.concat( [verticalDefault] ) : + verticalPositions.test( pos[0] ) ? + [ horizontalDefault ].concat( pos ) : + [ horizontalDefault, verticalDefault ]; + } + pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : horizontalDefault; + pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : verticalDefault; + options[ this ] = pos; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + // normalize offset option + offset[ 0 ] = parseInt( offset[0], 10 ) || 0; + if ( offset.length === 1 ) { + offset[ 1 ] = offset[ 0 ]; + } + offset[ 1 ] = parseInt( offset[1], 10 ) || 0; + + if ( options.at[0] === "right" ) { + basePosition.left += targetWidth; + } else if (options.at[0] === horizontalDefault ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[1] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[1] === verticalDefault ) { + basePosition.top += targetHeight / 2; + } + + basePosition.left += offset[ 0 ]; + basePosition.top += offset[ 1 ]; + + return this.each(function() { + var elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + position = $.extend( {}, basePosition ); + + if ( options.my[0] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[0] === horizontalDefault ) { + position.left -= elemWidth / 2; + } + + if ( options.my[1] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[1] === verticalDefault ) { + position.top -= elemHeight / 2; + } + + // prevent fractions (see #5280) + position.left = parseInt( position.left ); + position.top = parseInt( position.top ); + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[i] ] ) { + $.ui.position[ collision[i] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + offset: offset, + my: options.my, + at: options.at + }); + } + }); + + if ( $.fn.bgiframe ) { + elem.bgiframe(); + } + elem.offset( $.extend( position, { using: options.using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var win = $( window ), + over = position.left + data.elemWidth - win.width() - win.scrollLeft(); + position.left = over > 0 ? position.left - over : Math.max( 0, position.left ); + }, + top: function( position, data ) { + var win = $( window ), + over = position.top + data.elemHeight - win.height() - win.scrollTop(); + position.top = over > 0 ? position.top - over : Math.max( 0, position.top ); + } + }, + + flip: { + left: function( position, data ) { + if ( data.at[0] === "center" ) { + return; + } + var win = $( window ), + over = position.left + data.elemWidth - win.width() - win.scrollLeft(), + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + offset = -2 * data.offset[ 0 ]; + position.left += position.left < 0 ? + myOffset + data.targetWidth + offset : + over > 0 ? + myOffset - data.targetWidth + offset : + 0; + }, + top: function( position, data ) { + if ( data.at[1] === "center" ) { + return; + } + var win = $( window ), + over = position.top + data.elemHeight - win.height() - win.scrollTop(), + myOffset = data.my[ 1 ] === "top" ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + -data.targetHeight, + offset = -2 * data.offset[ 1 ]; + position.top += position.top < 0 ? + myOffset + data.targetHeight + offset : + over > 0 ? + myOffset + atOffset + offset : + 0; + } + } +}; + +// offset setter from jQuery 1.4 +if ( !$.offset.setOffset ) { + $.offset.setOffset = function( elem, options ) { + // set position first, in-case top/left are set even on static elem + if ( /static/.test( $.curCSS( elem, "position" ) ) ) { + elem.style.position = "relative"; + } + var curElem = $( elem ), + curOffset = curElem.offset(), + curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0, + curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0, + props = { + top: (options.top - curOffset.top) + curTop, + left: (options.left - curOffset.left) + curLeft + }; + + if ( 'using' in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + }; + + $.fn.offset = function( options ) { + var elem = this[ 0 ]; + if ( !elem || !elem.ownerDocument ) { return null; } + if ( options ) { + return this.each(function() { + $.offset.setOffset( this, options ); + }); + } + return _offset.call( this ); + }; +} + +}( jQuery )); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.progressbar.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.progressbar.js new file mode 100644 index 000000000..e6d1d21c1 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.progressbar.js @@ -0,0 +1,107 @@ +/* + * jQuery UI Progressbar 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function( $ ) { + +$.widget( "ui.progressbar", { + options: { + value: 0 + }, + _create: function() { + this.element + .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) + .attr({ + role: "progressbar", + "aria-valuemin": this._valueMin(), + "aria-valuemax": this._valueMax(), + "aria-valuenow": this._value() + }); + + this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" ) + .appendTo( this.element ); + + this._refreshValue(); + }, + + destroy: function() { + this.element + .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) + .removeAttr( "role" ) + .removeAttr( "aria-valuemin" ) + .removeAttr( "aria-valuemax" ) + .removeAttr( "aria-valuenow" ); + + this.valueDiv.remove(); + + $.Widget.prototype.destroy.apply( this, arguments ); + }, + + value: function( newValue ) { + if ( newValue === undefined ) { + return this._value(); + } + + this._setOption( "value", newValue ); + return this; + }, + + _setOption: function( key, value ) { + switch ( key ) { + case "value": + this.options.value = value; + this._refreshValue(); + this._trigger( "change" ); + break; + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + _value: function() { + var val = this.options.value; + // normalize invalid value + if ( typeof val !== "number" ) { + val = 0; + } + if ( val < this._valueMin() ) { + val = this._valueMin(); + } + if ( val > this._valueMax() ) { + val = this._valueMax(); + } + + return val; + }, + + _valueMin: function() { + return 0; + }, + + _valueMax: function() { + return 100; + }, + + _refreshValue: function() { + var value = this.value(); + this.valueDiv + [ value === this._valueMax() ? "addClass" : "removeClass"]( "ui-corner-right" ) + .width( value + "%" ); + this.element.attr( "aria-valuenow", value ); + } +}); + +$.extend( $.ui.progressbar, { + version: "1.8.1" +}); + +})( jQuery ); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.resizable.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.resizable.js new file mode 100644 index 000000000..1d08a2794 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.resizable.js @@ -0,0 +1,799 @@ +/* + * jQuery UI Resizable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.resizable", $.ui.mouse, { + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 1000 + }, + _create: function() { + + var self = this, o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Opera fix for relative positioning + if (/relative/.test(this.element.css('position')) && $.browser.opera) + this.element.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({ + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left') + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent().data( + "resizable", this.element.data('resizable') + ); + + this.elementIsWrapper = true; + + //Move margins to the wrapper + this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") }); + this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css('resize'); + this.originalElement.css('resize', 'none'); + + //Push the actual element to our proportionallyResize internal array + this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }); + if(this.handles.constructor == String) { + + if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw'; + var n = this.handles.split(","); this.handles = {}; + + for(var i = 0; i < n.length; i++) { + + var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle; + var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>'); + + // increase zIndex of sw, se, ne, nw axis + //TODO : this modifies original option + if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex }); + + //TODO : What's going on here? + if ('se' == handle) { + axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se'); + }; + + //Insert into internal handles object and append to element + this.handles[handle] = '.ui-resizable-'+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + target = target || this.element; + + for(var i in this.handles) { + + if(this.handles[i].constructor == String) + this.handles[i] = $(this.handles[i], this.element).show(); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(this.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) + continue; + + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $('.ui-resizable-handle', this.element) + .disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!self.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .hover(function() { + $(this).removeClass("ui-resizable-autohide"); + self._handles.show(); + }, + function(){ + if (!self.resizing) { + $(this).addClass("ui-resizable-autohide"); + self._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + destroy: function() { + + this._mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + var wrapper = this.element; + wrapper.after( + this.originalElement.css({ + position: wrapper.css('position'), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css('top'), + left: wrapper.css('left') + }) + ).remove(); + } + + this.originalElement.css('resize', this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var handle = false; + for (var i in this.handles) { + if ($(this.handles[i])[0] == event.target) { + handle = true; + } + } + + return !this.options.disabled && handle; + }, + + _mouseStart: function(event) { + + var o = this.options, iniPos = this.element.position(), el = this.element; + + this.resizing = true; + this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix for http://dev.jquery.com/ticket/1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left }); + } + + //Opera fixing relative position + if ($.browser.opera && (/relative/).test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + var cursor = $('.ui-resizable-' + this.axis).css('cursor'); + $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (this._aspectRatio || event.shiftKey) + data = this._updateRatio(data, event); + + data = this._respectSize(data, event); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!this._helper && this._proportionallyResizeElements.length) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this._trigger('resize', event, this.ui()); + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var o = this.options, self = this; + + if(this._helper) { + var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + self.helper.height(self.size.height); + self.helper.width(self.size.width); + + if (this._helper && !o.animate) this._proportionallyResize(); + } + + $('body').css('cursor', 'auto'); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) this.helper.remove(); + return false; + + }, + + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (isNumber(data.left)) this.position.left = data.left; + if (isNumber(data.top)) this.position.top = data.top; + if (isNumber(data.height)) this.size.height = data.height; + if (isNumber(data.width)) this.size.width = data.width; + }, + + _updateRatio: function(data, event) { + + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height * this.aspectRatio); + else if (data.width) data.height = (csize.width / this.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function(data, event) { + + var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height); + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + + _proportionallyResize: function() { + + var o = this.options; + if (!this._proportionallyResizeElements.length) return; + var element = this.helper || this.element; + + for (var i=0; i < this._proportionallyResizeElements.length; i++) { + + var prel = this._proportionallyResizeElements[i]; + + if (!this.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + this.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + + if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length))) + continue; + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + }; + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $('<div style="overflow:hidden;"></div>'); + + // fix ie6 offset TODO: This seems broken + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() + pxyoffset, + height: this.element.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n != "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +}); + +$.extend($.ui.resizable, { + version: "1.8.1" +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options; + + var _store = function(exp) { + $(exp).each(function() { + $(this).data("resizable-alsoresize", { + width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), + left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function(exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; + + $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + + //Opera fixing relative position + if (/relative/.test(el.css('position')) && $.browser.opera) { + self._revertToRelativePosition = true; + el.css({ position: 'absolute', top: 'auto', left: 'auto' }); + } + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"); + + //Opera fixing relative position + if (self._revertToRelativePosition && $.browser.opera) { + self._revertToRelativePosition = false; + el.css({ position: 'relative' }); + } + + $(this).removeData("resizable-alsoresize-start"); + } +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + var element = $(ce), p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + self.containerOffset = element.offset(); + self.containerPosition = element.position(); + self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; + + if (cp.left < (self._helper ? co.left : 0)) { + self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + self.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (self._helper ? co.top : 0)) { + self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + self.position.top = self._helper ? co.top : 0; + } + + self.offset.left = self.parentData.left+self.position.left; + self.offset.top = self.parentData.top+self.position.top; + + var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), + hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + + var isParent = self.containerElement.get(0) == self.element.parent().get(0), + isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position')); + + if(isParent && isOffsetRelative) woset -= self.parentData.left; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width / self.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height * self.aspectRatio; + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + + if (self._helper && !o.animate && (/relative/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + if (self._helper && !o.animate && (/static/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options, cs = self.size; + + self.ghost = self.originalElement.clone(); + self.ghost + .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass('ui-resizable-ghost') + .addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +var num = function(v) { + return parseInt(v, 10) || 0; +}; + +var isNumber = function(value) { + return !isNaN(parseInt(value, 10)); +}; + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.selectable.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.selectable.js new file mode 100644 index 000000000..744afb8c2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.selectable.js @@ -0,0 +1,261 @@ +/* + * jQuery UI Selectable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.selectable", $.ui.mouse, { + options: { + appendTo: 'body', + autoRefresh: true, + distance: 0, + filter: '*', + tolerance: 'touch' + }, + _create: function() { + var self = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + var selectees; + this.refresh = function() { + selectees = $(self.options.filter, self.element[0]); + selectees.each(function() { + var $this = $(this); + var pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass('ui-selected'), + selecting: $this.hasClass('ui-selecting'), + unselecting: $this.hasClass('ui-unselecting') + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this._mouseInit(); + + this.helper = $(document.createElement('div')) + .css({border:'1px dotted black'}) + .addClass("ui-selectable-helper"); + }, + + destroy: function() { + this.selectees + .removeClass("ui-selectee") + .removeData("selectable-item"); + this.element + .removeClass("ui-selectable ui-selectable-disabled") + .removeData("selectable") + .unbind(".selectable"); + this._mouseDestroy(); + + return this; + }, + + _mouseStart: function(event) { + var self = this; + + this.opos = [event.pageX, event.pageY]; + + if (this.options.disabled) + return; + + var options = this.options; + + this.selectees = $(options.filter, this.element[0]); + + this._trigger("start", event); + + $(options.appendTo).append(this.helper); + // position helper (lasso) + this.helper.css({ + "z-index": 100, + "position": "absolute", + "left": event.clientX, + "top": event.clientY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter('.ui-selected').each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!event.metaKey) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + }); + + $(event.target).parents().andSelf().each(function() { + var selectee = $.data(this, "selectable-item"); + if (selectee) { + selectee.$element.removeClass("ui-unselecting").addClass('ui-selecting'); + selectee.unselecting = false; + selectee.selecting = true; + selectee.selected = true; + // selectable SELECTING callback + self._trigger("selecting", event, { + selecting: selectee.element + }); + return false; + } + }); + + }, + + _mouseDrag: function(event) { + var self = this; + this.dragged = true; + + if (this.options.disabled) + return; + + var options = this.options; + + var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY; + if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"); + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element == self.element[0]) + return; + var hit = false; + if (options.tolerance == 'touch') { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance == 'fit') { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass('ui-selecting'); + selectee.selecting = true; + // selectable SELECTING callback + self._trigger("selecting", event, { + selecting: selectee.element + }); + } + } else { + // UNSELECT + if (selectee.selecting) { + if (event.metaKey && selectee.startselected) { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + selectee.$element.addClass('ui-selected'); + selectee.selected = true; + } else { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + if (selectee.selected) { + if (!event.metaKey && !selectee.startselected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + } + }); + + return false; + }, + + _mouseStop: function(event) { + var self = this; + + this.dragged = false; + + var options = this.options; + + $('.ui-unselecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + selectee.startselected = false; + self._trigger("unselected", event, { + unselected: selectee.element + }); + }); + $('.ui-selecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-selecting').addClass('ui-selected'); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + self._trigger("selected", event, { + selected: selectee.element + }); + }); + this._trigger("stop", event); + + this.helper.remove(); + + return false; + } + +}); + +$.extend($.ui.selectable, { + version: "1.8.1" +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.slider.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.slider.js new file mode 100644 index 000000000..44e450502 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.slider.js @@ -0,0 +1,682 @@ +/* + * jQuery UI Slider 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ + +(function( $ ) { + +// number of pages in a slider +// (how many times can you page up/down to go through the whole range) +var numPages = 5; + +$.widget( "ui.slider", $.ui.mouse, { + + widgetEventPrefix: "slide", + + options: { + animate: false, + distance: 0, + max: 100, + min: 0, + orientation: "horizontal", + range: false, + step: 1, + value: 0, + values: null + }, + + _create: function() { + var self = this, + o = this.options; + + this._keySliding = false; + this._mouseSliding = false; + this._animateOff = true; + this._handleIndex = null; + this._detectOrientation(); + this._mouseInit(); + + this.element + .addClass( "ui-slider" + + " ui-slider-" + this.orientation + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ); + + if ( o.disabled ) { + this.element.addClass( "ui-slider-disabled ui-disabled" ); + } + + this.range = $([]); + + if ( o.range ) { + if ( o.range === true ) { + this.range = $( "<div></div>" ); + if ( !o.values ) { + o.values = [ this._valueMin(), this._valueMin() ]; + } + if ( o.values.length && o.values.length !== 2 ) { + o.values = [ o.values[0], o.values[0] ]; + } + } else { + this.range = $( "<div></div>" ); + } + + this.range + .appendTo( this.element ) + .addClass( "ui-slider-range" ); + + if ( o.range === "min" || o.range === "max" ) { + this.range.addClass( "ui-slider-range-" + o.range ); + } + + // note: this isn't the most fittingly semantic framework class for this element, + // but worked best visually with a variety of themes + this.range.addClass( "ui-widget-header" ); + } + + if ( $( ".ui-slider-handle", this.element ).length === 0 ) { + $( "<a href='#'></a>" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + + if ( o.values && o.values.length ) { + while ( $(".ui-slider-handle", this.element).length < o.values.length ) { + $( "<a href='#'></a>" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + } + + this.handles = $( ".ui-slider-handle", this.element ) + .addClass( "ui-state-default" + + " ui-corner-all" ); + + this.handle = this.handles.eq( 0 ); + + this.handles.add( this.range ).filter( "a" ) + .click(function( event ) { + event.preventDefault(); + }) + .hover(function() { + if ( !o.disabled ) { + $( this ).addClass( "ui-state-hover" ); + } + }, function() { + $( this ).removeClass( "ui-state-hover" ); + }) + .focus(function() { + if ( !o.disabled ) { + $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" ); + $( this ).addClass( "ui-state-focus" ); + } else { + $( this ).blur(); + } + }) + .blur(function() { + $( this ).removeClass( "ui-state-focus" ); + }); + + this.handles.each(function( i ) { + $( this ).data( "index.ui-slider-handle", i ); + }); + + this.handles + .keydown(function( event ) { + var ret = true, + index = $( this ).data( "index.ui-slider-handle" ), + allowed, + curVal, + newVal, + step; + + if ( self.options.disabled ) { + return; + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_UP: + case $.ui.keyCode.PAGE_DOWN: + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + ret = false; + if ( !self._keySliding ) { + self._keySliding = true; + $( this ).addClass( "ui-state-active" ); + allowed = self._start( event, index ); + if ( allowed === false ) { + return; + } + } + break; + } + + step = self.options.step; + if ( self.options.values && self.options.values.length ) { + curVal = newVal = self.values( index ); + } else { + curVal = newVal = self.value(); + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + newVal = self._valueMin(); + break; + case $.ui.keyCode.END: + newVal = self._valueMax(); + break; + case $.ui.keyCode.PAGE_UP: + newVal = curVal + ( (self._valueMax() - self._valueMin()) / numPages ); + break; + case $.ui.keyCode.PAGE_DOWN: + newVal = curVal - ( (self._valueMax() - self._valueMin()) / numPages ); + break; + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + if ( curVal === self._valueMax() ) { + return; + } + newVal = curVal + step; + break; + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + if ( curVal === self._valueMin() ) { + return; + } + newVal = curVal - step; + break; + } + + self._slide( event, index, newVal ); + + return ret; + + }) + .keyup(function( event ) { + var index = $( this ).data( "index.ui-slider-handle" ); + + if ( self._keySliding ) { + self._keySliding = false; + self._stop( event, index ); + self._change( event, index ); + $( this ).removeClass( "ui-state-active" ); + } + + }); + + this._refreshValue(); + + this._animateOff = false; + }, + + destroy: function() { + this.handles.remove(); + this.range.remove(); + + this.element + .removeClass( "ui-slider" + + " ui-slider-horizontal" + + " ui-slider-vertical" + + " ui-slider-disabled" + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ) + .removeData( "slider" ) + .unbind( ".slider" ); + + this._mouseDestroy(); + + return this; + }, + + _mouseCapture: function( event ) { + var o = this.options, + position, + normValue, + distance, + closestHandle, + self, + index, + allowed, + offset, + mouseOverHandle; + + if ( o.disabled ) { + return false; + } + + this.elementSize = { + width: this.element.outerWidth(), + height: this.element.outerHeight() + }; + this.elementOffset = this.element.offset(); + + position = { x: event.pageX, y: event.pageY }; + normValue = this._normValueFromMouse( position ); + distance = this._valueMax() - this._valueMin() + 1; + self = this; + this.handles.each(function( i ) { + var thisDistance = Math.abs( normValue - self.values(i) ); + if ( distance > thisDistance ) { + distance = thisDistance; + closestHandle = $( this ); + index = i; + } + }); + + // workaround for bug #3736 (if both handles of a range are at 0, + // the first is always used as the one with least distance, + // and moving it is obviously prevented by preventing negative ranges) + if( o.range === true && this.values(1) === o.min ) { + index += 1; + closestHandle = $( this.handles[index] ); + } + + allowed = this._start( event, index ); + if ( allowed === false ) { + return false; + } + this._mouseSliding = true; + + self._handleIndex = index; + + closestHandle + .addClass( "ui-state-active" ) + .focus(); + + offset = closestHandle.offset(); + mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" ); + this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { + left: event.pageX - offset.left - ( closestHandle.width() / 2 ), + top: event.pageY - offset.top - + ( closestHandle.height() / 2 ) - + ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) - + ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) + + ( parseInt( closestHandle.css("marginTop"), 10 ) || 0) + }; + + normValue = this._normValueFromMouse( position ); + this._slide( event, index, normValue ); + this._animateOff = true; + return true; + }, + + _mouseStart: function( event ) { + return true; + }, + + _mouseDrag: function( event ) { + var position = { x: event.pageX, y: event.pageY }, + normValue = this._normValueFromMouse( position ); + + this._slide( event, this._handleIndex, normValue ); + + return false; + }, + + _mouseStop: function( event ) { + this.handles.removeClass( "ui-state-active" ); + this._mouseSliding = false; + + this._stop( event, this._handleIndex ); + this._change( event, this._handleIndex ); + + this._handleIndex = null; + this._clickOffset = null; + this._animateOff = false; + + return false; + }, + + _detectOrientation: function() { + this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; + }, + + _normValueFromMouse: function( position ) { + var pixelTotal, + pixelMouse, + percentMouse, + valueTotal, + valueMouse; + + if ( this.orientation === "horizontal" ) { + pixelTotal = this.elementSize.width; + pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 ); + } else { + pixelTotal = this.elementSize.height; + pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 ); + } + + percentMouse = ( pixelMouse / pixelTotal ); + if ( percentMouse > 1 ) { + percentMouse = 1; + } + if ( percentMouse < 0 ) { + percentMouse = 0; + } + if ( this.orientation === "vertical" ) { + percentMouse = 1 - percentMouse; + } + + valueTotal = this._valueMax() - this._valueMin(); + valueMouse = this._valueMin() + percentMouse * valueTotal; + + return this._trimAlignValue( valueMouse ); + }, + + _start: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + return this._trigger( "start", event, uiHash ); + }, + + _slide: function( event, index, newVal ) { + var otherVal, + newValues, + allowed; + + if ( this.options.values && this.options.values.length ) { + otherVal = this.values( index ? 0 : 1 ); + + if ( ( this.options.values.length === 2 && this.options.range === true ) && + ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) ) + ) { + newVal = otherVal; + } + + if ( newVal !== this.values( index ) ) { + newValues = this.values(); + newValues[ index ] = newVal; + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal, + values: newValues + } ); + otherVal = this.values( index ? 0 : 1 ); + if ( allowed !== false ) { + this.values( index, newVal, true ); + } + } + } else { + if ( newVal !== this.value() ) { + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal + } ); + if ( allowed !== false ) { + this.value( newVal ); + } + } + } + }, + + _stop: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "stop", event, uiHash ); + }, + + _change: function( event, index ) { + if ( !this._keySliding && !this._mouseSliding ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "change", event, uiHash ); + } + }, + + value: function( newValue ) { + if ( arguments.length ) { + this.options.value = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, 0 ); + } + + return this._value(); + }, + + values: function( index, newValue ) { + var vals, + newValues, + i; + + if ( arguments.length > 1 ) { + this.options.values[ index ] = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, index ); + } + + if ( arguments.length ) { + if ( $.isArray( arguments[ 0 ] ) ) { + vals = this.options.values; + newValues = arguments[ 0 ]; + for ( i = 0; i < vals.length; i += 1 ) { + vals[ i ] = this._trimAlignValue( newValues[ i ] ); + this._change( null, i ); + } + this._refreshValue(); + } else { + if ( this.options.values && this.options.values.length ) { + return this._values( index ); + } else { + return this.value(); + } + } + } else { + return this._values(); + } + }, + + _setOption: function( key, value ) { + var i, + valsLength = 0; + + if ( $.isArray( this.options.values ) ) { + valsLength = this.options.values.length; + } + + $.Widget.prototype._setOption.apply( this, arguments ); + + switch ( key ) { + case "disabled": + if ( value ) { + this.handles.filter( ".ui-state-focus" ).blur(); + this.handles.removeClass( "ui-state-hover" ); + this.handles.attr( "disabled", "disabled" ); + this.element.addClass( "ui-disabled" ); + } else { + this.handles.removeAttr( "disabled" ); + this.element.removeClass( "ui-disabled" ); + } + break; + case "orientation": + this._detectOrientation(); + this.element + .removeClass( "ui-slider-horizontal ui-slider-vertical" ) + .addClass( "ui-slider-" + this.orientation ); + this._refreshValue(); + break; + case "value": + this._animateOff = true; + this._refreshValue(); + this._change( null, 0 ); + this._animateOff = false; + break; + case "values": + this._animateOff = true; + this._refreshValue(); + for ( i = 0; i < valsLength; i += 1 ) { + this._change( null, i ); + } + this._animateOff = false; + break; + } + }, + + //internal value getter + // _value() returns value trimmed by min and max, aligned by step + _value: function() { + var val = this.options.value; + val = this._trimAlignValue( val ); + + return val; + }, + + //internal values getter + // _values() returns array of values trimmed by min and max, aligned by step + // _values( index ) returns single value trimmed by min and max, aligned by step + _values: function( index ) { + var val, + vals, + i; + + if ( arguments.length ) { + val = this.options.values[ index ]; + val = this._trimAlignValue( val ); + + return val; + } else { + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and then returned + vals = this.options.values.slice(); + for ( i = 0; i < vals.length; i+= 1) { + vals[ i ] = this._trimAlignValue( vals[ i ] ); + } + + return vals; + } + }, + + // returns the step-aligned value that val is closest to, between (inclusive) min and max + _trimAlignValue: function( val ) { + if ( val < this._valueMin() ) { + return this._valueMin(); + } + if ( val > this._valueMax() ) { + return this._valueMax(); + } + var step = this.options.step, + valModStep = val % step, + alignValue = val - valModStep; + + if ( valModStep >= ( step / 2 ) ) { + alignValue += step; + } + + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see #4124) + return parseFloat( alignValue.toFixed(5) ); + }, + + _valueMin: function() { + return this.options.min; + }, + + _valueMax: function() { + return this.options.max; + }, + + _refreshValue: function() { + var oRange = this.options.range, + o = this.options, + self = this, + animate = ( !this._animateOff ) ? o.animate : false, + valPercent, + _set = {}, + lastValPercent, + value, + valueMin, + valueMax; + + if ( this.options.values && this.options.values.length ) { + this.handles.each(function( i, j ) { + valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100; + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + if ( self.options.range === true ) { + if ( self.orientation === "horizontal" ) { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } else { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + lastValPercent = valPercent; + }); + } else { + value = this.value(); + valueMin = this._valueMin(); + valueMax = this._valueMax(); + valPercent = ( valueMax !== valueMin ) ? + ( value - valueMin ) / ( valueMax - valueMin ) * 100 : + 0; + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + + if ( oRange === "min" && this.orientation === "horizontal" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "horizontal" ) { + this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + if ( oRange === "min" && this.orientation === "vertical" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "vertical" ) { + this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + +}); + +$.extend( $.ui.slider, { + version: "1.8.1" +}); + +}(jQuery)); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.sortable.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.sortable.js new file mode 100644 index 000000000..4b9137884 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.sortable.js @@ -0,0 +1,1067 @@ +/* + * jQuery UI Sortable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.sortable", $.ui.mouse, { + widgetEventPrefix: "sort", + options: { + appendTo: "parent", + axis: false, + connectWith: false, + containment: false, + cursor: 'auto', + cursorAt: false, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: '> *', + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000 + }, + _create: function() { + + var o = this.options; + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine if the items are floating + this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false; + + //Let's determine the parent's offset + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this._mouseInit(); + + }, + + destroy: function() { + this.element + .removeClass("ui-sortable ui-sortable-disabled") + .removeData("sortable") + .unbind(".sortable"); + this._mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) + this.items[i].item.removeData("sortable-item"); + + return this; + }, + + _setOption: function(key, value){ + if ( key === "disabled" ) { + this.options[ key ] = value; + + this.widget() + [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" ); + } else { + // Don't call widget base _setOption for disable as it adds ui-state-disabled class + $.Widget.prototype._setOption.apply(self, arguments); + } + }, + + _mouseCapture: function(event, overrideHandle) { + + if (this.reverting) { + return false; + } + + if(this.options.disabled || this.options.type == 'static') return false; + + //We have to refresh the items data once first + this._refreshItems(event); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + var currentItem = null, self = this, nodes = $(event.target).parents().each(function() { + if($.data(this, 'sortable-item') == self) { + currentItem = $(this); + return false; + } + }); + if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target); + + if(!currentItem) return false; + if(this.options.handle && !overrideHandle) { + var validHandle = false; + + $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; }); + if(!validHandle) return false; + } + + this.currentItem = currentItem; + this._removeCurrentsFromItems(); + return true; + + }, + + _mouseStart: function(event, overrideHandle, noActivation) { + + var o = this.options, self = this; + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Get the next scrolling parent + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.currentItem.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css("position", "absolute"); + this.cssPosition = this.helper.css("position"); + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Cache the former DOM position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; + + //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way + if(this.helper[0] != this.currentItem[0]) { + this.currentItem.hide(); + } + + //Create the placeholder + this._createPlaceholder(); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + if(o.cursor) { // cursor option + if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor"); + $('body').css("cursor", o.cursor); + } + + if(o.opacity) { // opacity option + if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity"); + this.helper.css("opacity", o.opacity); + } + + if(o.zIndex) { // zIndex option + if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex"); + this.helper.css("zIndex", o.zIndex); + } + + //Prepare scrolling + if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') + this.overflowOffset = this.scrollParent.offset(); + + //Call callbacks + this._trigger("start", event, this._uiHash()); + + //Recache the helper size + if(!this._preserveHelperProportions) + this._cacheHelperProportions(); + + + //Post 'activate' events to possible containers + if(!noActivation) { + for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); } + } + + //Prepare possible droppables + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.dragging = true; + + this.helper.addClass("ui-sortable-helper"); + this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + }, + + _mouseDrag: function(event) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + if (!this.lastPositionAbs) { + this.lastPositionAbs = this.positionAbs; + } + + //Do scrolling + if(this.options.scroll) { + var o = this.options, scrolled = false; + if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') { + + if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; + + if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; + + } else { + + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + } + + //Regenerate the absolute position used for position checks + this.positionAbs = this._convertPositionTo("absolute"); + + //Set the helper position + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + + //Rearrange + for (var i = this.items.length - 1; i >= 0; i--) { + + //Cache variables and intersection, continue if no intersection + var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item); + if (!intersection) continue; + + if(itemElement != this.currentItem[0] //cannot intersect with itself + && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before + && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked + && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true) + //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container + ) { + + this.direction = intersection == 1 ? "down" : "up"; + + if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) { + this._rearrange(event, item); + } else { + break; + } + + this._trigger("change", event, this._uiHash()); + break; + } + } + + //Post events to containers + this._contactContainers(event); + + //Interconnect with droppables + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + //Call callbacks + this._trigger('sort', event, this._uiHash()); + + this.lastPositionAbs = this.positionAbs; + return false; + + }, + + _mouseStop: function(event, noPropagation) { + + if(!event) return; + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) + $.ui.ddmanager.drop(this, event); + + if(this.options.revert) { + var self = this; + var cur = self.placeholder.offset(); + + self.reverting = true; + + $(this.helper).animate({ + left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), + top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) + }, parseInt(this.options.revert, 10) || 500, function() { + self._clear(event); + }); + } else { + this._clear(event, noPropagation); + } + + return false; + + }, + + cancel: function() { + + var self = this; + + if(this.dragging) { + + this._mouseUp(); + + if(this.options.helper == "original") + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + else + this.currentItem.show(); + + //Post deactivating events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i]._trigger("deactivate", null, self._uiHash(this)); + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", null, self._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove(); + + $.extend(this, { + helper: null, + dragging: false, + reverting: false, + _noFinalSort: null + }); + + if(this.domPosition.prev) { + $(this.domPosition.prev).after(this.currentItem); + } else { + $(this.domPosition.parent).prepend(this.currentItem); + } + + return this; + + }, + + serialize: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected); + var str = []; o = o || {}; + + $(items).each(function() { + var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/)); + if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2])); + }); + + return str.join('&'); + + }, + + toArray: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected); + var ret = []; o = o || {}; + + items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); }); + return ret; + + }, + + /* Be careful with the following core functions */ + _intersectsWith: function(item) { + + var x1 = this.positionAbs.left, + x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, + y2 = y1 + this.helperProportions.height; + + var l = item.left, + r = l + item.width, + t = item.top, + b = t + item.height; + + var dyClick = this.offset.click.top, + dxClick = this.offset.click.left; + + var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r; + + if( this.options.tolerance == "pointer" + || this.options.forcePointerForContainers + || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height']) + ) { + return isOverElement; + } else { + + return (l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + }, + + _intersectsWithPointer: function(item) { + + var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), + isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), + isOverElement = isOverElementHeight && isOverElementWidth, + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (!isOverElement) + return false; + + return this.floating ? + ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 ) + : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) ); + + }, + + _intersectsWithSides: function(item) { + + var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), + isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (this.floating && horizontalDirection) { + return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf)); + } else { + return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf)); + } + + }, + + _getDragVerticalDirection: function() { + var delta = this.positionAbs.top - this.lastPositionAbs.top; + return delta != 0 && (delta > 0 ? "down" : "up"); + }, + + _getDragHorizontalDirection: function() { + var delta = this.positionAbs.left - this.lastPositionAbs.left; + return delta != 0 && (delta > 0 ? "right" : "left"); + }, + + refresh: function(event) { + this._refreshItems(event); + this.refreshPositions(); + return this; + }, + + _connectWith: function() { + var options = this.options; + return options.connectWith.constructor == String + ? [options.connectWith] + : options.connectWith; + }, + + _getItemsAsjQuery: function(connected) { + + var self = this; + var items = []; + var queries = []; + var connectWith = this._connectWith(); + + if(connectWith && connected) { + for (var i = connectWith.length - 1; i >= 0; i--){ + var cur = $(connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && inst != this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]); + } + }; + }; + } + + queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]); + + for (var i = queries.length - 1; i >= 0; i--){ + queries[i][0].each(function() { + items.push(this); + }); + }; + + return $(items); + + }, + + _removeCurrentsFromItems: function() { + + var list = this.currentItem.find(":data(sortable-item)"); + + for (var i=0; i < this.items.length; i++) { + + for (var j=0; j < list.length; j++) { + if(list[j] == this.items[i].item[0]) + this.items.splice(i,1); + }; + + }; + + }, + + _refreshItems: function(event) { + + this.items = []; + this.containers = [this]; + var items = this.items; + var self = this; + var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]]; + var connectWith = this._connectWith(); + + if(connectWith) { + for (var i = connectWith.length - 1; i >= 0; i--){ + var cur = $(connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && inst != this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + }; + }; + } + + for (var i = queries.length - 1; i >= 0; i--) { + var targetData = queries[i][1]; + var _queries = queries[i][0]; + + for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) { + var item = $(_queries[j]); + + item.data('sortable-item', targetData); // Data for target checking (mouse manager) + + items.push({ + item: item, + instance: targetData, + width: 0, height: 0, + left: 0, top: 0 + }); + }; + }; + + }, + + refreshPositions: function(fast) { + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent && this.helper) { + this.offset.parent = this._getParentOffset(); + } + + for (var i = this.items.length - 1; i >= 0; i--){ + var item = this.items[i]; + + var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; + + if (!fast) { + item.width = t.outerWidth(); + item.height = t.outerHeight(); + } + + var p = t.offset(); + item.left = p.left; + item.top = p.top; + }; + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (var i = this.containers.length - 1; i >= 0; i--){ + var p = this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + }; + } + + return this; + }, + + _createPlaceholder: function(that) { + + var self = that || this, o = self.options; + + if(!o.placeholder || o.placeholder.constructor == String) { + var className = o.placeholder; + o.placeholder = { + element: function() { + + var el = $(document.createElement(self.currentItem[0].nodeName)) + .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder") + .removeClass("ui-sortable-helper")[0]; + + if(!className) + el.style.visibility = "hidden"; + + return el; + }, + update: function(container, p) { + + // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that + // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified + if(className && !o.forcePlaceholderSize) return; + + //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item + if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); }; + if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); }; + } + }; + } + + //Create the placeholder + self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)); + + //Append it after the actual current item + self.currentItem.after(self.placeholder); + + //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) + o.placeholder.update(self, self.placeholder); + + }, + + _contactContainers: function(event) { + + // get innermost container that intersects with item + var innermostContainer = null, innermostIndex = null; + + + for (var i = this.containers.length - 1; i >= 0; i--){ + + // never consider a container that's located within the item itself + if($.ui.contains(this.currentItem[0], this.containers[i].element[0])) + continue; + + if(this._intersectsWith(this.containers[i].containerCache)) { + + // if we've already found a container and it's more "inner" than this, then continue + if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0])) + continue; + + innermostContainer = this.containers[i]; + innermostIndex = i; + + } else { + // container doesn't intersect. trigger "out" event if necessary + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", event, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + // if no intersecting containers found, return + if(!innermostContainer) return; + + // move the item into the container if it's not there already + if(this.containers.length === 1) { + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } else if(this.currentContainer != this.containers[innermostIndex]) { + + //When entering a new container, we will find the item with the least distance and append our item near it + var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; + for (var j = this.items.length - 1; j >= 0; j--) { + if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; + var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + } + } + + if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled + return; + + this.currentContainer = this.containers[innermostIndex]; + itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); + this._trigger("change", event, this._uiHash()); + this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder); + + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem); + + if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already + $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); + + if(helper[0] == this.currentItem[0]) + this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") }; + + if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width()); + if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height()); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj == 'string') { + obj = obj.split(' '); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.currentItem.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) { + this.offset.relative = this._getRelativeOffset(); + } + + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _rearrange: function(event, i, a, hardRefresh) { + + a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var self = this, counter = this.counter; + + window.setTimeout(function() { + if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + },0); + + }, + + _clear: function(event, noPropagation) { + + this.reverting = false; + // We delay all events that have to be triggered to after the point where the placeholder has been removed and + // everything else normalized again + var delayedTriggers = [], self = this; + + // We first have to update the dom position of the actual currentItem + // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) + if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem); + this._noFinalSort = null; + + if(this.helper[0] == this.currentItem[0]) { + for(var i in this._storedCSS) { + if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = ''; + } + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); }); + if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed + if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element + if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); }); + for (var i = this.containers.length - 1; i >= 0; i--){ + if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) { + delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + } + }; + }; + + //Post events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + if(this.containers[i].containerCache.over) { + delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + this.containers[i].containerCache.over = 0; + } + } + + //Do what was originally in plugins + if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor + if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity + if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index + + this.dragging = false; + if(this.cancelHelperRemoval) { + if(!noPropagation) { + this._trigger("beforeStop", event, this._uiHash()); + for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + return false; + } + + if(!noPropagation) this._trigger("beforeStop", event, this._uiHash()); + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + + if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null; + + if(!noPropagation) { + for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + + this.fromOutside = false; + return true; + + }, + + _trigger: function() { + if ($.Widget.prototype._trigger.apply(this, arguments) === false) { + this.cancel(); + } + }, + + _uiHash: function(inst) { + var self = inst || this; + return { + helper: self.helper, + placeholder: self.placeholder || $([]), + position: self.position, + originalPosition: self.originalPosition, + offset: self.positionAbs, + item: self.currentItem, + sender: inst ? inst.element : null + }; + } + +}); + +$.extend($.ui.sortable, { + version: "1.8.1" +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.tabs.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.tabs.js new file mode 100644 index 000000000..2c9ae8d58 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.tabs.js @@ -0,0 +1,721 @@ +/* + * jQuery UI Tabs 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +var tabId = 0, + listId = 0; + +$.widget("ui.tabs", { + options: { + add: null, + ajaxOptions: null, + cache: false, + cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } + collapsible: false, + disable: null, + disabled: [], + enable: null, + event: 'click', + fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } + idPrefix: 'ui-tabs-', + load: null, + panelTemplate: '<div></div>', + remove: null, + select: null, + show: null, + spinner: '<em>Loading&#8230;</em>', + tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>' + }, + _create: function() { + this._tabify(true); + }, + + _setOption: function(key, value) { + if (key == 'selected') { + if (this.options.collapsible && value == this.options.selected) { + return; + } + this.select(value); + } + else { + this.options[key] = value; + this._tabify(); + } + }, + + _tabId: function(a) { + return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') || + this.options.idPrefix + (++tabId); + }, + + _sanitizeSelector: function(hash) { + return hash.replace(/:/g, '\\:'); // we need this because an id may contain a ":" + }, + + _cookie: function() { + var cookie = this.cookie || (this.cookie = this.options.cookie.name || 'ui-tabs-' + (++listId)); + return $.cookie.apply(null, [cookie].concat($.makeArray(arguments))); + }, + + _ui: function(tab, panel) { + return { + tab: tab, + panel: panel, + index: this.anchors.index(tab) + }; + }, + + _cleanup: function() { + // restore all former loading tabs labels + this.lis.filter('.ui-state-processing').removeClass('ui-state-processing') + .find('span:data(label.tabs)') + .each(function() { + var el = $(this); + el.html(el.data('label.tabs')).removeData('label.tabs'); + }); + }, + + _tabify: function(init) { + + this.list = this.element.find('ol,ul').eq(0); + this.lis = $('li:has(a[href])', this.list); + this.anchors = this.lis.map(function() { return $('a', this)[0]; }); + this.panels = $([]); + + var self = this, o = this.options; + + var fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash + this.anchors.each(function(i, a) { + var href = $(a).attr('href'); + + // For dynamically created HTML that contains a hash as href IE < 8 expands + // such href to the full page url with hash and then misinterprets tab as ajax. + // Same consideration applies for an added tab with a fragment identifier + // since a[href=#fragment-identifier] does unexpectedly not match. + // Thus normalize href attribute... + var hrefBase = href.split('#')[0], baseEl; + if (hrefBase && (hrefBase === location.toString().split('#')[0] || + (baseEl = $('base')[0]) && hrefBase === baseEl.href)) { + href = a.hash; + a.href = href; + } + + // inline tab + if (fragmentId.test(href)) { + self.panels = self.panels.add(self._sanitizeSelector(href)); + } + + // remote tab + else if (href != '#') { // prevent loading the page itself if href is just "#" + $.data(a, 'href.tabs', href); // required for restore on destroy + + // TODO until #3808 is fixed strip fragment identifier from url + // (IE fails to load from such url) + $.data(a, 'load.tabs', href.replace(/#.*$/, '')); // mutable data + + var id = self._tabId(a); + a.href = '#' + id; + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id).addClass('ui-tabs-panel ui-widget-content ui-corner-bottom') + .insertAfter(self.panels[i - 1] || self.list); + $panel.data('destroy.tabs', true); + } + self.panels = self.panels.add($panel); + } + + // invalid tab href + else { + o.disabled.push(i); + } + }); + + // initialization from scratch + if (init) { + + // attach necessary classes for styling + this.element.addClass('ui-tabs ui-widget ui-widget-content ui-corner-all'); + this.list.addClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all'); + this.lis.addClass('ui-state-default ui-corner-top'); + this.panels.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom'); + + // Selected tab + // use "selected" option or try to retrieve: + // 1. from fragment identifier in url + // 2. from cookie + // 3. from selected class attribute on <li> + if (o.selected === undefined) { + if (location.hash) { + this.anchors.each(function(i, a) { + if (a.hash == location.hash) { + o.selected = i; + return false; // break + } + }); + } + if (typeof o.selected != 'number' && o.cookie) { + o.selected = parseInt(self._cookie(), 10); + } + if (typeof o.selected != 'number' && this.lis.filter('.ui-tabs-selected').length) { + o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected')); + } + o.selected = o.selected || (this.lis.length ? 0 : -1); + } + else if (o.selected === null) { // usage of null is deprecated, TODO remove in next release + o.selected = -1; + } + + // sanity check - default to first tab... + o.selected = ((o.selected >= 0 && this.anchors[o.selected]) || o.selected < 0) ? o.selected : 0; + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + // A selected tab cannot become disabled. + o.disabled = $.unique(o.disabled.concat( + $.map(this.lis.filter('.ui-state-disabled'), + function(n, i) { return self.lis.index(n); } ) + )).sort(); + + if ($.inArray(o.selected, o.disabled) != -1) { + o.disabled.splice($.inArray(o.selected, o.disabled), 1); + } + + // highlight selected tab + this.panels.addClass('ui-tabs-hide'); + this.lis.removeClass('ui-tabs-selected ui-state-active'); + if (o.selected >= 0 && this.anchors.length) { // check for length avoids error when initializing empty list + this.panels.eq(o.selected).removeClass('ui-tabs-hide'); + this.lis.eq(o.selected).addClass('ui-tabs-selected ui-state-active'); + + // seems to be expected behavior that the show callback is fired + self.element.queue("tabs", function() { + self._trigger('show', null, self._ui(self.anchors[o.selected], self.panels[o.selected])); + }); + + this.load(o.selected); + } + + // clean up to avoid memory leaks in certain versions of IE 6 + $(window).bind('unload', function() { + self.lis.add(self.anchors).unbind('.tabs'); + self.lis = self.anchors = self.panels = null; + }); + + } + // update selected after add/remove + else { + o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected')); + } + + // update collapsible + this.element[o.collapsible ? 'addClass' : 'removeClass']('ui-tabs-collapsible'); + + // set or update cookie after init and add/remove respectively + if (o.cookie) { + this._cookie(o.selected, o.cookie); + } + + // disable tabs + for (var i = 0, li; (li = this.lis[i]); i++) { + $(li)[$.inArray(i, o.disabled) != -1 && + !$(li).hasClass('ui-tabs-selected') ? 'addClass' : 'removeClass']('ui-state-disabled'); + } + + // reset cache if switching from cached to not cached + if (o.cache === false) { + this.anchors.removeData('cache.tabs'); + } + + // remove all handlers before, tabify may run on existing tabs after add or option change + this.lis.add(this.anchors).unbind('.tabs'); + + if (o.event != 'mouseover') { + var addState = function(state, el) { + if (el.is(':not(.ui-state-disabled)')) { + el.addClass('ui-state-' + state); + } + }; + var removeState = function(state, el) { + el.removeClass('ui-state-' + state); + }; + this.lis.bind('mouseover.tabs', function() { + addState('hover', $(this)); + }); + this.lis.bind('mouseout.tabs', function() { + removeState('hover', $(this)); + }); + this.anchors.bind('focus.tabs', function() { + addState('focus', $(this).closest('li')); + }); + this.anchors.bind('blur.tabs', function() { + removeState('focus', $(this).closest('li')); + }); + } + + // set up animations + var hideFx, showFx; + if (o.fx) { + if ($.isArray(o.fx)) { + hideFx = o.fx[0]; + showFx = o.fx[1]; + } + else { + hideFx = showFx = o.fx; + } + } + + // Reset certain styles left over from animation + // and prevent IE's ClearType bug... + function resetStyle($el, fx) { + $el.css({ display: '' }); + if (!$.support.opacity && fx.opacity) { + $el[0].style.removeAttribute('filter'); + } + } + + // Show a tab... + var showTab = showFx ? + function(clicked, $show) { + $(clicked).closest('li').addClass('ui-tabs-selected ui-state-active'); + $show.hide().removeClass('ui-tabs-hide') // avoid flicker that way + .animate(showFx, showFx.duration || 'normal', function() { + resetStyle($show, showFx); + self._trigger('show', null, self._ui(clicked, $show[0])); + }); + } : + function(clicked, $show) { + $(clicked).closest('li').addClass('ui-tabs-selected ui-state-active'); + $show.removeClass('ui-tabs-hide'); + self._trigger('show', null, self._ui(clicked, $show[0])); + }; + + // Hide a tab, $show is optional... + var hideTab = hideFx ? + function(clicked, $hide) { + $hide.animate(hideFx, hideFx.duration || 'normal', function() { + self.lis.removeClass('ui-tabs-selected ui-state-active'); + $hide.addClass('ui-tabs-hide'); + resetStyle($hide, hideFx); + self.element.dequeue("tabs"); + }); + } : + function(clicked, $hide, $show) { + self.lis.removeClass('ui-tabs-selected ui-state-active'); + $hide.addClass('ui-tabs-hide'); + self.element.dequeue("tabs"); + }; + + // attach tab event handler, unbind to avoid duplicates from former tabifying... + this.anchors.bind(o.event + '.tabs', function() { + var el = this, $li = $(this).closest('li'), $hide = self.panels.filter(':not(.ui-tabs-hide)'), + $show = $(self._sanitizeSelector(this.hash)); + + // If tab is already selected and not collapsible or tab disabled or + // or is already loading or click callback returns false stop here. + // Check if click handler returns false last so that it is not executed + // for a disabled or loading tab! + if (($li.hasClass('ui-tabs-selected') && !o.collapsible) || + $li.hasClass('ui-state-disabled') || + $li.hasClass('ui-state-processing') || + self._trigger('select', null, self._ui(this, $show[0])) === false) { + this.blur(); + return false; + } + + o.selected = self.anchors.index(this); + + self.abort(); + + // if tab may be closed + if (o.collapsible) { + if ($li.hasClass('ui-tabs-selected')) { + o.selected = -1; + + if (o.cookie) { + self._cookie(o.selected, o.cookie); + } + + self.element.queue("tabs", function() { + hideTab(el, $hide); + }).dequeue("tabs"); + + this.blur(); + return false; + } + else if (!$hide.length) { + if (o.cookie) { + self._cookie(o.selected, o.cookie); + } + + self.element.queue("tabs", function() { + showTab(el, $show); + }); + + self.load(self.anchors.index(this)); // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171 + + this.blur(); + return false; + } + } + + if (o.cookie) { + self._cookie(o.selected, o.cookie); + } + + // show new tab + if ($show.length) { + if ($hide.length) { + self.element.queue("tabs", function() { + hideTab(el, $hide); + }); + } + self.element.queue("tabs", function() { + showTab(el, $show); + }); + + self.load(self.anchors.index(this)); + } + else { + throw 'jQuery UI Tabs: Mismatching fragment identifier.'; + } + + // Prevent IE from keeping other link focussed when using the back button + // and remove dotted border from clicked link. This is controlled via CSS + // in modern browsers; blur() removes focus from address bar in Firefox + // which can become a usability and annoying problem with tabs('rotate'). + if ($.browser.msie) { + this.blur(); + } + + }); + + // disable click in any case + this.anchors.bind('click.tabs', function(){return false;}); + + }, + + destroy: function() { + var o = this.options; + + this.abort(); + + this.element.unbind('.tabs') + .removeClass('ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible') + .removeData('tabs'); + + this.list.removeClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all'); + + this.anchors.each(function() { + var href = $.data(this, 'href.tabs'); + if (href) { + this.href = href; + } + var $this = $(this).unbind('.tabs'); + $.each(['href', 'load', 'cache'], function(i, prefix) { + $this.removeData(prefix + '.tabs'); + }); + }); + + this.lis.unbind('.tabs').add(this.panels).each(function() { + if ($.data(this, 'destroy.tabs')) { + $(this).remove(); + } + else { + $(this).removeClass([ + 'ui-state-default', + 'ui-corner-top', + 'ui-tabs-selected', + 'ui-state-active', + 'ui-state-hover', + 'ui-state-focus', + 'ui-state-disabled', + 'ui-tabs-panel', + 'ui-widget-content', + 'ui-corner-bottom', + 'ui-tabs-hide' + ].join(' ')); + } + }); + + if (o.cookie) { + this._cookie(null, o.cookie); + } + + return this; + }, + + add: function(url, label, index) { + if (index === undefined) { + index = this.anchors.length; // append by default + } + + var self = this, o = this.options, + $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)), + id = !url.indexOf('#') ? url.replace('#', '') : this._tabId($('a', $li)[0]); + + $li.addClass('ui-state-default ui-corner-top').data('destroy.tabs', true); + + // try to find an existing element before creating a new one + var $panel = $('#' + id); + if (!$panel.length) { + $panel = $(o.panelTemplate).attr('id', id).data('destroy.tabs', true); + } + $panel.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide'); + + if (index >= this.lis.length) { + $li.appendTo(this.list); + $panel.appendTo(this.list[0].parentNode); + } + else { + $li.insertBefore(this.lis[index]); + $panel.insertBefore(this.panels[index]); + } + + o.disabled = $.map(o.disabled, + function(n, i) { return n >= index ? ++n : n; }); + + this._tabify(); + + if (this.anchors.length == 1) { // after tabify + o.selected = 0; + $li.addClass('ui-tabs-selected ui-state-active'); + $panel.removeClass('ui-tabs-hide'); + this.element.queue("tabs", function() { + self._trigger('show', null, self._ui(self.anchors[0], self.panels[0])); + }); + + this.load(0); + } + + // callback + this._trigger('add', null, this._ui(this.anchors[index], this.panels[index])); + return this; + }, + + remove: function(index) { + var o = this.options, $li = this.lis.eq(index).remove(), + $panel = this.panels.eq(index).remove(); + + // If selected tab was removed focus tab to the right or + // in case the last tab was removed the tab to the left. + if ($li.hasClass('ui-tabs-selected') && this.anchors.length > 1) { + this.select(index + (index + 1 < this.anchors.length ? 1 : -1)); + } + + o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }), + function(n, i) { return n >= index ? --n : n; }); + + this._tabify(); + + // callback + this._trigger('remove', null, this._ui($li.find('a')[0], $panel[0])); + return this; + }, + + enable: function(index) { + var o = this.options; + if ($.inArray(index, o.disabled) == -1) { + return; + } + + this.lis.eq(index).removeClass('ui-state-disabled'); + o.disabled = $.grep(o.disabled, function(n, i) { return n != index; }); + + // callback + this._trigger('enable', null, this._ui(this.anchors[index], this.panels[index])); + return this; + }, + + disable: function(index) { + var self = this, o = this.options; + if (index != o.selected) { // cannot disable already selected tab + this.lis.eq(index).addClass('ui-state-disabled'); + + o.disabled.push(index); + o.disabled.sort(); + + // callback + this._trigger('disable', null, this._ui(this.anchors[index], this.panels[index])); + } + + return this; + }, + + select: function(index) { + if (typeof index == 'string') { + index = this.anchors.index(this.anchors.filter('[href$=' + index + ']')); + } + else if (index === null) { // usage of null is deprecated, TODO remove in next release + index = -1; + } + if (index == -1 && this.options.collapsible) { + index = this.options.selected; + } + + this.anchors.eq(index).trigger(this.options.event + '.tabs'); + return this; + }, + + load: function(index) { + var self = this, o = this.options, a = this.anchors.eq(index)[0], url = $.data(a, 'load.tabs'); + + this.abort(); + + // not remote or from cache + if (!url || this.element.queue("tabs").length !== 0 && $.data(a, 'cache.tabs')) { + this.element.dequeue("tabs"); + return; + } + + // load remote from here on + this.lis.eq(index).addClass('ui-state-processing'); + + if (o.spinner) { + var span = $('span', a); + span.data('label.tabs', span.html()).html(o.spinner); + } + + this.xhr = $.ajax($.extend({}, o.ajaxOptions, { + url: url, + success: function(r, s) { + $(self._sanitizeSelector(a.hash)).html(r); + + // take care of tab labels + self._cleanup(); + + if (o.cache) { + $.data(a, 'cache.tabs', true); // if loaded once do not load them again + } + + // callbacks + self._trigger('load', null, self._ui(self.anchors[index], self.panels[index])); + try { + o.ajaxOptions.success(r, s); + } + catch (e) {} + }, + error: function(xhr, s, e) { + // take care of tab labels + self._cleanup(); + + // callbacks + self._trigger('load', null, self._ui(self.anchors[index], self.panels[index])); + try { + // Passing index avoid a race condition when this method is + // called after the user has selected another tab. + // Pass the anchor that initiated this request allows + // loadError to manipulate the tab content panel via $(a.hash) + o.ajaxOptions.error(xhr, s, index, a); + } + catch (e) {} + } + })); + + // last, so that load event is fired before show... + self.element.dequeue("tabs"); + + return this; + }, + + abort: function() { + // stop possibly running animations + this.element.queue([]); + this.panels.stop(false, true); + + // "tabs" queue must not contain more than two elements, + // which are the callbacks for the latest clicked tab... + this.element.queue("tabs", this.element.queue("tabs").splice(-2, 2)); + + // terminate pending requests from other tabs + if (this.xhr) { + this.xhr.abort(); + delete this.xhr; + } + + // take care of tab labels + this._cleanup(); + return this; + }, + + url: function(index, url) { + this.anchors.eq(index).removeData('cache.tabs').data('load.tabs', url); + return this; + }, + + length: function() { + return this.anchors.length; + } + +}); + +$.extend($.ui.tabs, { + version: '1.8.1' +}); + +/* + * Tabs Extensions + */ + +/* + * Rotate + */ +$.extend($.ui.tabs.prototype, { + rotation: null, + rotate: function(ms, continuing) { + + var self = this, o = this.options; + + var rotate = self._rotate || (self._rotate = function(e) { + clearTimeout(self.rotation); + self.rotation = setTimeout(function() { + var t = o.selected; + self.select( ++t < self.anchors.length ? t : 0 ); + }, ms); + + if (e) { + e.stopPropagation(); + } + }); + + var stop = self._unrotate || (self._unrotate = !continuing ? + function(e) { + if (e.clientX) { // in case of a true click + self.rotate(null); + } + } : + function(e) { + t = o.selected; + rotate(); + }); + + // start rotation + if (ms) { + this.element.bind('tabsshow', rotate); + this.anchors.bind(o.event + '.tabs', stop); + rotate(); + } + // stop rotation + else { + clearTimeout(self.rotation); + this.element.unbind('tabsshow', rotate); + this.anchors.unbind(o.event + '.tabs', stop); + delete this._rotate; + delete this._unrotate; + } + + return this; + } +}); + +})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/jquery.ui.widget.js b/fannie/src/jquery/development-bundle/ui/jquery.ui.widget.js new file mode 100644 index 000000000..bb9d91404 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/jquery.ui.widget.js @@ -0,0 +1,236 @@ +/*! + * jQuery UI Widget 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Widget + */ +(function( $ ) { + +var _remove = $.fn.remove; + +$.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( this ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); +}; + +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); + + $.widget.bridge( name, $[ namespace ][ name ] ); +}; + +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.substring( 0, 1 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ), + methodValue = instance && $.isFunction( instance[options] ) ? + instance[ options ].apply( instance, args ) : + instance; + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + if ( options ) { + instance.option( options ); + } + instance._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + this.element = $( element ).data( this.widgetName, this ); + this.options = $.extend( true, {}, + this.options, + $.metadata && $.metadata.get( element )[ this.widgetName ], + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._init(); + }, + _create: function() {}, + _init: function() {}, + + destroy: function() { + this.element + .unbind( "." + this.widgetName ) + .removeData( this.widgetName ); + this.widget() + .unbind( "." + this.widgetName ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetBaseClass + "-disabled " + + "ui-state-disabled" ); + }, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + self = this; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, self.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return self; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var callback = this.options[ type ]; + + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + data = data || {}; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( event.originalEvent ) { + for ( var i = $.event.props.length, prop; i; ) { + prop = $.event.props[ --i ]; + event[ prop ] = event.originalEvent[ prop ]; + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; + +})( jQuery ); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.blind.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.blind.min.js new file mode 100644 index 000000000..88f2c4fae --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.blind.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Blind 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a); +c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.bounce.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.bounce.min.js new file mode 100644 index 000000000..2c92d73c2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.bounce.min.js @@ -0,0 +1,15 @@ +/* + * jQuery UI Effects Bounce 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/ +3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a); +b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.clip.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.clip.min.js new file mode 100644 index 000000000..38839e021 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.clip.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Clip 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","left","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,c/2)}var h={};h[g.size]= +f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.core.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.core.min.js new file mode 100644 index 000000000..950ebc662 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.core.min.js @@ -0,0 +1,30 @@ +/* + * jQuery UI Effects 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f){function k(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return l.transparent;return l[f.trim(c).toLowerCase()]}function q(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return k(b)}function m(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function n(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in r||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function s(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function j(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(f.isFunction(b)){d=b;b=null}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=q(b.elem,a);b.end=k(b.end);b.colorInit= +true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var l={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189, +183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255, +165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},o=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=n(m.call(this)),p,t=e.attr("className");f.each(o,function(u, +i){c[i]&&e[i+"Class"](c[i])});p=n(m.call(this));e.attr("className",t);e.animate(s(h,p),a,b,function(){f.each(o,function(u,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a? +f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===undefined?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.1",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!== +null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent(); +var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"}); +c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=j.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c|| +typeof c=="number"||f.fx.speeds[c])return this._show.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c])return this._hide.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||typeof c=="boolean"||f.isFunction(c))return this.__toggle.apply(this, +arguments);else{var a=j.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+ +b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2, +10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)* +a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c, +a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c, +a,b,d,e,g){if(g==undefined)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0, +d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.drop.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.drop.min.js new file mode 100644 index 000000000..df173d8eb --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.drop.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Drop 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","left","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e=="show"?1: +0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.explode.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.explode.min.js new file mode 100644 index 000000000..3ad43bff3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.explode.min.js @@ -0,0 +1,15 @@ +/* + * jQuery UI Effects Explode 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f= +0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.fold.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.fold.min.js new file mode 100644 index 000000000..c5bdd2540 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.fold.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Fold 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* +f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.highlight.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.highlight.min.js new file mode 100644 index 000000000..6648084fe --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.highlight.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Highlight 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.pulsate.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.pulsate.min.js new file mode 100644 index 000000000..47d53996d --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.pulsate.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Pulsate 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration, +a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.scale.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.scale.min.js new file mode 100644 index 000000000..ce82552c9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.scale.min.js @@ -0,0 +1,20 @@ +/* + * jQuery UI Effects Scale 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a, +b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity= +1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","left","width","height","overflow","opacity"],g=["position","top","left","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=c.effects.setMode(a, +b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};if(m=="box"||m=="both"){if(d.from.y!= +d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);a.css("overflow","hidden").css(a.from); +if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);child.to=c.effects.setTransition(child, +f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,n?e:g);c.effects.removeWrapper(a);b.callback&& +b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.shake.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.shake.min.js new file mode 100644 index 000000000..19da6f564 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.shake.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Shake 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","left"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=(h=="pos"?"-=":"+=")+ +e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.slide.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.slide.min.js new file mode 100644 index 000000000..00135847b --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.slide.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Slide 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","left"],e=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(e=="show")a.css(f,b=="pos"?-g:g);var i={};i[f]=(e=="show"?b=="pos"? +"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.transfer.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.transfer.min.js new file mode 100644 index 000000000..307a65da9 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.effects.transfer.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Transfer 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.accordion.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.accordion.min.js new file mode 100644 index 000000000..a74e50899 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.accordion.min.js @@ -0,0 +1,30 @@ +/* + * jQuery UI Accordion 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},_create:function(){var a=this.options,b=this;this.running=0;this.element.addClass("ui-accordion ui-widget ui-helper-reset"); +this.element[0].nodeName=="UL"&&this.element.children("li").addClass("ui-accordion-li-fix");this.headers=this.element.find(a.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c(this).removeClass("ui-state-focus")}); +this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(a.navigation){var d=this.element.find("a").filter(a.navigationFilter);if(d.length){var f=d.closest(".ui-accordion-header");this.active=f.length?f:d.closest(".ui-accordion-content").prev()}}this.active=this._findActive(this.active||a.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active"); +this._createIcons();this.resize();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown",function(g){return b._keydown(g)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();this.active.length?this.active.attr("aria-expanded","true").attr("tabIndex","0"):this.headers.eq(0).attr("tabIndex","0");c.browser.safari||this.headers.find("a").attr("tabIndex","-1");a.event&&this.headers.bind(a.event+ +".accordion",function(g){b._clickHandler.call(b,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span/>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion"); +this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");if(a.autoHeight||a.fillHeight)b.css("height", +"");return this},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();b&&this._createIcons()}},_keydown:function(a){var b=c.ui.keyCode;if(!(this.options.disabled||a.altKey||a.ctrlKey)){var d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target}, +a.target);a.preventDefault()}if(g){c(a.target).attr("tabIndex","-1");c(g).attr("tabIndex","0");g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0, +b-c(this).innerHeight()+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a=="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d= +this.options;if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]==this.active[0];d.active=d.collapsible&&b?false:c(".ui-accordion-header",this.element).index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected); +a.next().addClass("ui-accordion-content-active")}e=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):e,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(e,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},e=this.active=c([]);this._toggle(e,f,g)}},_toggle:function(a,b,d,f,g){var e=this.options,k=this;this.toShow=a;this.toHide=b;this.data=d;var i=function(){if(k)return k._completed.apply(k,arguments)};this._trigger("changestart",null,this.data);this.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]), +toHide:b,complete:i,down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:i,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var h=e.duration,j=e.animated;if(j&&!f[j]&&!c.easing[j])j="slide";f[j]||(f[j]=function(l){this.slide(l,{easing:j, +duration:h||700})});f[j](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}i(true)}b.prev().attr("aria-expanded","false").attr("tabIndex","-1").blur();a.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(a){var b=this.options;this.running=a?0:--this.running;if(!this.running){b.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion, +{version:"1.8.1",animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},e={},k;b=a.toShow;k=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(i,h){e[h]="hide";i=(""+c.css(a.toShow[0], +h)).match(/^([\d+-.]+)(.*)$/);g[h]={value:i[1],unit:i[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(e,{step:function(i,h){if(h.prop=="height")f=h.end-h.start===0?0:(h.now-h.start)/(h.end-h.start);a.toShow[0].style[h.prop]=f*g[h.prop].value+g[h.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css("width",k);a.toShow.css({overflow:d});a.complete()}})}else a.toHide.animate({height:"hide"}, +a);else a.toShow.animate({height:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.autocomplete.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.autocomplete.min.js new file mode 100644 index 000000000..7ef3ca99d --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.autocomplete.min.js @@ -0,0 +1,28 @@ +/* + * jQuery UI Autocomplete 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(e){e.widget("ui.autocomplete",{options:{minLength:1,delay:300},_create:function(){var a=this,b=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){var d=e.ui.keyCode;switch(c.keyCode){case d.PAGE_UP:a._move("previousPage",c);break;case d.PAGE_DOWN:a._move("nextPage",c);break;case d.UP:a._move("previous",c);c.preventDefault(); +break;case d.DOWN:a._move("next",c);c.preventDefault();break;case d.ENTER:a.menu.active&&c.preventDefault();case d.TAB:if(!a.menu.active)return;a.menu.select(c);break;case d.ESCAPE:a.element.val(a.term);a.close(c);break;case d.LEFT:case d.RIGHT:case d.SHIFT:case d.CONTROL:case d.ALT:break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){a.search(null,c)},a.options.delay);break}}).bind("focus.autocomplete",function(){a.selectedItem=null;a.previous=a.element.val()}).bind("blur.autocomplete", +function(c){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo("body",b).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",null,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("select", +c,{item:d})&&a.element.val(d.value);a.close(c);c=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=c}a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource()},_initSource:function(){var a,b;if(e.isArray(this.options.source)){a=this.options.source;this.source=function(c,d){d(e.ui.autocomplete.filter(a,c.term))}}else if(typeof this.options.source==="string"){b=this.options.source;this.source=function(c,d){e.getJSON(b,c,d)}}else this.source=this.options.source},search:function(a,b){a= +a!=null?a:this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search")!==false)return this._search(a)},_search:function(a){this.term=this.element.addClass("ui-autocomplete-loading").val();this.source({term:a},this.response)},_response:function(a){if(a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing); +if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return e.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+ +1),c;this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position({my:"left top",at:"left bottom",of:this.element,collision:"none"});a=b.width("").width();c=this.element.width();b.width(Math.max(a,c))},_renderMenu:function(a,b){var c=this;e.each(b,function(d,f){c._renderItem(a,f)})},_renderItem:function(a,b){return e("<li></li>").data("item.autocomplete",b).append("<a>"+b.label+"</a>").appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&& +/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")},filter:function(a,b){var c=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(d){return c.test(d.label||d.value||d)})}})})(jQuery); +(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(b){a.activate(b,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.attr("scrollTop"),f=this.element.height();if(c<0)this.element.attr("scrollTop",d+c);else c>f&&this.element.attr("scrollTop",d+c-f+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); +this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prev().length},last:function(){return this.active&&!this.active.next().length},move:function(a,b,c){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);a.length?this.activate(c,a):this.activate(c,this.element.children(b))}else this.activate(c,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active|| +this.last())this.activate(a,this.element.children(":first"));else{var b=this.active.offset().top,c=this.element.height(),d=this.element.children("li").filter(function(){var f=e(this).offset().top-b-c+e(this).height();return f<10&&f>-10});d.length||(d=this.element.children(":last"));this.activate(a,d)}else this.activate(a,this.element.children(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last")); +else{var b=this.active.offset().top,c=this.element.height();result=this.element.children("li").filter(function(){var d=e(this).offset().top-b+c-e(this).height();return d<10&&d>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.button.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.button.min.js new file mode 100644 index 000000000..dc9a4f164 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.button.min.js @@ -0,0 +1,24 @@ +/* + * jQuery UI Button 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Button + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",i);this._determineButtonType(); +this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button", +function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button", +function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button", +function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")? +"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()); +this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed", +true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement,c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(), +d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":""));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon");this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}}); +a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.core.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.core.min.js new file mode 100644 index 000000000..eafb5f4a4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.core.min.js @@ -0,0 +1,15 @@ +/*! + * jQuery UI 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +jQuery.ui||function(c){c.ui={version:"1.8.1",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")=="hidden")return false; +b=b&&b=="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,f,g){return c.ui.isOverAxis(a,d,f)&&c.ui.isOverAxis(b,e,g)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33, +PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))|| +/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!== +undefined)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b||"area"==b?a.href||!isNaN(d):!isNaN(d))&& +!c(a)["area"==b?"parents":"closest"](":hidden").length},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.datepicker.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.datepicker.min.js new file mode 100644 index 000000000..11b3e87fc --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.datepicker.min.js @@ -0,0 +1,80 @@ +/* + * jQuery UI Datepicker 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * jquery.ui.core.js + */ +(function(d){function J(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"show",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"_default",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a, +b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.1"}});var y=(new Date).getTime();d.extend(J.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= +f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id)a.id="dp"+ ++this.uuid;var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f== +""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){a="dp"+ ++this.uuid;this._dialogInput=d('<input type="text" id="'+a+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor==Date? +this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); +d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, +_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= +d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& +this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&& +!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker(); +return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey|| +a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target, +a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat")); +var c=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| +a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); +d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& +d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, +h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); +this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); +this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), +k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; +a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): +"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& +!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; +b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){a=this._getInst(d(a)[0]); +a.input&&a._selectingMonthYear&&!d.browser.msie&&a.input.focus();a._selectingMonthYear=!a._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a, +"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")|| +this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null; +for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+ +s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,G){p=o(p)?G:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length)==p[w]){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break; +case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c, +k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c? +c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)=="'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break; +case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false, +e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"), +e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))}, +_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1], +10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null; +a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ +y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),G=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var K=this._getDefaultDate(a),H="",C=0;C<i[0];C++){for(var L= +"",D=0;D<i[1];D++){var M=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c? +f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var N=0;N<A;N++){x+="<tr>";var O=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,I=B&&!G||!F[0]||j&&q<j||o&&q>o;O+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==M.getTime()&&g==a.selectedMonth&& +a._keyEvent||K.getTime()==q.getTime()&&K.getTime()==M.getTime()?" "+this._dayOverClass:"")+(I?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(I?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?"&#xa0;":I?'<span class="ui-state-default">'+q.getDate()+ +"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=O+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");L+=x}H+=L}H+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': +"");a._keyEvent=false;return H},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+ +a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?"&#xa0;":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, +i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?"&#xa0;":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); +return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new J;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.1";window["DP_jQuery_"+y]=d})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.dialog.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.dialog.min.js new file mode 100644 index 000000000..076c62b31 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.dialog.min.js @@ -0,0 +1,39 @@ +/* + * jQuery UI Dialog 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");var a=this,b=a.options,d=b.title||a.originalTitle||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ +b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), +h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id", +e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); +a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== +b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index", +c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== +f[0]&&e.shiftKey){g.focus(1);return false}}});c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a, +function(g,f){g=c('<button type="button"></button>').text(g).click(function(){f.apply(b.element[0],arguments)}).appendTo(e);c.fn.button&&g.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging"); +b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,position:f.position,size:f.size}}a=a===undefined?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position"); +a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop", +f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0];a=a||c.ui.dialog.prototype.options.position;if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(e,g){if(+b[e]===b[e]){d[e]=b[e];b[e]= +g}})}else if(typeof a==="object"){if("left"in a){b[0]="left";d[0]=a.left}else if("right"in a){b[0]="right";d[0]=-a.right}if("top"in a){b[1]="top";d[1]=a.top}else if("bottom"in a){b[1]="bottom";d[1]=-a.bottom}}(a=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position({my:b.join(" "),at:b.join(" "),offset:d.join(" "),of:window,collision:"fit",using:function(e){var g=c(this).css(e).offset().top;g<0&&c(this).css("top",e.top-g)}});a||this.uiDialog.hide()},_setOption:function(a, +b){var d=this,e=d.uiDialog,g=e.is(":data(resizable)"),f=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");break;case "draggable":b?d._makeDraggable():e.draggable("destroy");break; +case "height":f=true;break;case "maxHeight":g&&e.resizable("option","maxHeight",b);f=true;break;case "maxWidth":g&&e.resizable("option","maxWidth",b);f=true;break;case "minHeight":g&&e.resizable("option","minHeight",b);f=true;break;case "minWidth":g&&e.resizable("option","minWidth",b);f=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title", +d.uiDialogTitlebar).html(""+(b||"&#160;"));break;case "width":f=true;break}c.Widget.prototype._setOption.apply(d,arguments);f&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight", +this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.1",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&& +c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&& +b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight, +document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0, +height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.draggable.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.draggable.min.js new file mode 100644 index 000000000..56b71a790 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.draggable.min.js @@ -0,0 +1,49 @@ +/* + * jQuery UI Draggable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, +b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== +"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&& +a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"), +10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): +f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+ +this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+ +Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left- +this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs= +this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.1"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable"); +if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper; +c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver= +1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left; +this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper= +this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a= +d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options; +if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!= +"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX- +b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()- +c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this, +width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&& +o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t= +p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&& +(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"), +10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.droppable.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.droppable.min.js new file mode 100644 index 000000000..de365ee74 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.droppable.min.js @@ -0,0 +1,26 @@ +/* + * jQuery UI Droppable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.mouse.js + * jquery.ui.draggable.js + */ +(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this); +a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&& +this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass); +this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g= +d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop", +a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.1"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height; +switch(c){case "fit":return i<e&&g<k&&j<f&&h<l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=i&& +e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!= +"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem|| +a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e= +d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.mouse.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.mouse.min.js new file mode 100644 index 000000000..fb7725eb7 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.mouse.min.js @@ -0,0 +1,17 @@ +/*! + * jQuery UI Mouse 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&& +this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault(); +return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&& +this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- +a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.position.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.position.min.js new file mode 100644 index 000000000..57cc7d296 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.position.min.js @@ -0,0 +1,15 @@ +/* + * jQuery UI Position 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h= +0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+= +g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k, +elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"? +-b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position= +"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.progressbar.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.progressbar.min.js new file mode 100644 index 000000000..ea4463fbb --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.progressbar.min.js @@ -0,0 +1,16 @@ +/* + * jQuery UI Progressbar 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b){b.widget("ui.progressbar",{options:{value:0},_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===undefined)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){switch(a){case "value":this.options.value=c;this._refreshValue();this._trigger("change");break}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;if(a<this._valueMin())a=this._valueMin();if(a>this._valueMax())a=this._valueMax();return a}, +_valueMin:function(){return 0},_valueMax:function(){return 100},_refreshValue:function(){var a=this.value();this.valueDiv[a===this._valueMax()?"addClass":"removeClass"]("ui-corner-right").width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.1"})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.resizable.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.resizable.min.js new file mode 100644 index 000000000..0992d38a8 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.resizable.min.js @@ -0,0 +1,47 @@ +/* + * jQuery UI Resizable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.resizable",d.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");d.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element, +_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&d.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(d('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var e=0;e<c.length;e++){var g=d.trim(c[e]),f=d('<div class="ui-resizable-handle '+("ui-resizable-"+g)+'"></div>');/sw|se|ne|nw/.test(g)&&f.css({zIndex:++a.zIndex});"se"==g&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=d(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=d(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}d(this.handles[i])}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){d(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){d(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){d(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(d(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +e=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(e.is(".ui-draggable")||/absolute/.test(e.css("position")))e.css({position:"absolute",top:c.top,left:c.left});d.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var g=m(this.helper.css("top"));if(a.containment){c+=d(a.containment).scrollLeft()||0;g+=d(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:g};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:c,top:g};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",a=="auto"?this.axis+"-resize":a);e.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,e=this._change[this.axis];if(!e)return false;c=e.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var e=this._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName);e=g&&d.ui.hasScroll(e[0],"left")?0:c.sizeDiff.height; +g={width:c.size.width-(g?0:c.sizeDiff.width),height:c.size.height-e};e=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var f=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(d.extend(g,{top:f,left:e}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", +b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,e=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(e=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(e=="nw"){b.top= +a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,e=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,g=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,f=k(b.width)&&a.minWidth&&a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(f)b.width=a.minWidth;if(h)b.height=a.minHeight;if(e)b.width=a.maxWidth;if(g)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, +l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(f&&l)b.left=i-a.minWidth;if(e&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(g&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var e=[c.css("borderTopWidth"), +c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],g=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=d.map(e,function(f,h){f=parseInt(f,10)||0;h=parseInt(g[h],10)||0;return f+h})}d.browser.msie&&(d(b).is(":hidden")||d(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset= +this.element.offset();if(this._helper){this.helper=this.helper||d('<div style="overflow:hidden;"></div>');var a=d.browser.msie&&d.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ +a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return d.extend(this._change.n.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){d.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable, +{version:"1.8.1"});d.ui.plugin.add("resizable","alsoResize",{start:function(){var b=d(this).data("resizable").options,a=function(c){d(c).each(function(){d(this).data("resizable-alsoresize",{width:parseInt(d(this).width(),10),height:parseInt(d(this).height(),10),left:parseInt(d(this).css("left"),10),top:parseInt(d(this).css("top"),10)})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else d.each(b.alsoResize,function(c){a(c)}); +else a(b.alsoResize)},resize:function(){var b=d(this).data("resizable"),a=b.options,c=b.originalSize,e=b.originalPosition,g={height:b.size.height-c.height||0,width:b.size.width-c.width||0,top:b.position.top-e.top||0,left:b.position.left-e.left||0},f=function(h,i){d(h).each(function(){var j=d(this),l=d(this).data("resizable-alsoresize"),p={};d.each((i&&i.length?i:["width","height","top","left"])||["width","height","top","left"],function(n,o){if((n=(l[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(/relative/.test(j.css("position"))&& +d.browser.opera){b._revertToRelativePosition=true;j.css({position:"absolute",top:"auto",left:"auto"})}j.css(p)})};typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?d.each(a.alsoResize,function(h,i){f(h,i)}):f(a.alsoResize)},stop:function(){var b=d(this).data("resizable");if(b._revertToRelativePosition&&d.browser.opera){b._revertToRelativePosition=false;el.css({position:"relative"})}d(this).removeData("resizable-alsoresize-start")}});d.ui.plugin.add("resizable","animate",{stop:function(b){var a= +d(this).data("resizable"),c=a.options,e=a._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName),f=g&&d.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height;g={width:a.size.width-(g?0:a.sizeDiff.width),height:a.size.height-f};f=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(d.extend(g,h&&f?{top:h,left:f}:{}),{duration:c.animateDuration,easing:c.animateEasing, +step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&d(e[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});d.ui.plugin.add("resizable","containment",{start:function(){var b=d(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof d?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= +d(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var e=d(a),g=[];d(["Top","Right","Left","Bottom"]).each(function(i,j){g[i]=m(e.css("padding"+j))});b.containerOffset=e.offset();b.containerPosition=e.position();b.containerSize={height:e.innerHeight()-g[3],width:e.innerWidth()-g[1]};c=b.containerOffset; +var f=b.containerSize.height,h=b.containerSize.width;h=d.ui.hasScroll(a,"left")?a.scrollWidth:h;f=d.ui.hasScroll(a)?a.scrollHeight:f;b.parentData={element:a,left:c.left,top:c.top,width:h,height:f}}}},resize:function(b){var a=d(this).data("resizable"),c=a.options,e=a.containerOffset,g=a.position;b=a._aspectRatio||b.shiftKey;var f={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))f=e;if(g.left<(a._helper?e.left:0)){a.size.width+=a._helper?a.position.left-e.left: +a.position.left-f.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?e.left:0}if(g.top<(a._helper?e.top:0)){a.size.height+=a._helper?a.position.top-e.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?e.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-f.left:a.offset.left-f.left)+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-f.top:a.offset.top- +e.top)+a.sizeDiff.height);g=a.containerElement.get(0)==a.element.parent().get(0);f=/relative|absolute/.test(a.containerElement.css("position"));if(g&&f)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(e+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-e;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=d(this).data("resizable"),a=b.options,c=b.containerOffset,e=b.containerPosition, +g=b.containerElement,f=d(b.helper),h=f.offset(),i=f.outerWidth()-b.sizeDiff.width;f=f.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f});b._helper&&!a.animate&&/static/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f})}});d.ui.plugin.add("resizable","ghost",{start:function(){var b=d(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, +display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=d(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=d(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});d.ui.plugin.add("resizable","grid",{resize:function(){var b= +d(this).data("resizable"),a=b.options,c=b.size,e=b.originalSize,g=b.originalPosition,f=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-e.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-e.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a}else if(/^(ne)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}else{if(/^(sw)$/.test(f)){b.size.width=e.width+h;b.size.height= +e.height+a}else{b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}b.position.left=g.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.selectable.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.selectable.min.js new file mode 100644 index 000000000..3103e159a --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.selectable.min.js @@ -0,0 +1,22 @@ +/* + * jQuery UI Selectable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(d.options.filter,d.element[0]);f.each(function(){var c=e(this),b=c.offset();e.data(this,"selectable-item",{element:this,$element:c,left:b.left,top:b.top,right:b.left+c.outerWidth(),bottom:b.top+c.outerHeight(),startselected:false,selected:c.hasClass("ui-selected"), +selecting:c.hasClass("ui-selecting"),unselecting:c.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this}, +_mouseStart:function(d){var f=this;this.opos=[d.pageX,d.pageY];if(!this.options.disabled){var c=this.options;this.selectees=e(c.filter,this.element[0]);this._trigger("start",d);e(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});c.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!d.metaKey){b.$element.removeClass("ui-selected"); +b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",d,{unselecting:b.element})}});e(d.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){b.$element.removeClass("ui-unselecting").addClass("ui-selecting");b.unselecting=false;b.selecting=true;b.selected=true;f._trigger("selecting",d,{selecting:b.element});return false}})}},_mouseDrag:function(d){var f=this;this.dragged=true;if(!this.options.disabled){var c=this.options, +b=this.opos[0],g=this.opos[1],h=d.pageX,i=d.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(c.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(c.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting"); +a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",d,{selecting:a.element})}}else{if(a.selecting)if(d.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",d,{unselecting:a.element})}if(a.selected)if(!d.metaKey&& +!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",d,{unselecting:a.element})}}}});return false}},_mouseStop:function(d){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var c=e.data(this,"selectable-item");c.$element.removeClass("ui-unselecting");c.unselecting=false;c.startselected=false;f._trigger("unselected",d,{unselected:c.element})});e(".ui-selecting",this.element[0]).each(function(){var c= +e.data(this,"selectable-item");c.$element.removeClass("ui-selecting").addClass("ui-selected");c.selecting=false;c.selected=true;c.startselected=true;f._trigger("selected",d,{selected:c.element})});this._trigger("stop",d);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.1"})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.slider.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.slider.min.js new file mode 100644 index 000000000..162193879 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.slider.min.js @@ -0,0 +1,33 @@ +/* + * jQuery UI Slider 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled"); +this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),g,h,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");g=b._start(c,f);if(g===false)return}break}i=b.options.step;g=b.options.values&&b.options.values.length?(h=b.values(f)):(h=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:h=b._valueMin();break;case d.ui.keyCode.END:h=b._valueMax();break;case d.ui.keyCode.PAGE_UP:h=g+(b._valueMax()-b._valueMin())/5;break;case d.ui.keyCode.PAGE_DOWN:h=g-(b._valueMax()-b._valueMin())/5;break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(g=== +b._valueMax())return;h=g+i;break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(g===b._valueMin())return;h=g-i;break}b._slide(c,f,h);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,g,h,i;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c={x:b.pageX,y:b.pageY};e=this._normValueFromMouse(c);f=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(j){var k=Math.abs(e-h.values(j));if(f>k){f=k;g=d(this);i=j}});if(a.range===true&&this.values(1)===a.min){i+=1;g=d(this.handles[i])}if(this._start(b, +i)===false)return false;this._mouseSliding=true;h._handleIndex=i;g.addClass("ui-state-active").focus();a=g.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-g.width()/2,top:b.pageY-a.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)};e=this._normValueFromMouse(c);this._slide(b,i,e);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a], +value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value= +this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value(); +else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation(); +this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b]; +return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<this._valueMin())return this._valueMin();if(b>this._valueMax())return this._valueMax();var a=this.options.step,c=b%a;b=b-c;if(c>=a/2)b+=a;return parseFloat(b.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,a=this.options,c=this, +e=!this._animateOff?a.animate:false,f,g={},h,i,j,k;if(this.options.values&&this.options.values.length)this.handles.each(function(l){f=(c.values(l)-c._valueMin())/(c._valueMax()-c._valueMin())*100;g[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](g,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(l===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);if(l===1)c.range[e?"animate":"css"]({width:f-h+"%"},{queue:false,duration:a.animate})}else{if(l=== +0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(l===1)c.range[e?"animate":"css"]({height:f-h+"%"},{queue:false,duration:a.animate})}h=f});else{i=this.value();j=this._valueMin();k=this._valueMax();f=k!==j?(i-j)/(k-j)*100:0;g[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](g,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e? +"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.1"})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.sortable.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.sortable.min.js new file mode 100644 index 000000000..8da1ab8f4 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.sortable.min.js @@ -0,0 +1,59 @@ +/* + * jQuery UI Sortable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(self, +arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= +c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, +{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); +if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", +a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+ +this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+ +b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+ +"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, +c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== +document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", +null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): +d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c}, +_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/ +2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b= +d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a= +this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)? +h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"), +b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)? +i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement, +c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height= +this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()- +parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0], +this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b= +1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change", +a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]== +this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options; +if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b= +d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width- +this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+ +this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top; +if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f- +this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+ +(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&& +this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]|| +this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update", +g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity", +this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e= +0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.1"})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.tabs.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.tabs.min.js new file mode 100644 index 000000000..2317b68b3 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.tabs.min.js @@ -0,0 +1,34 @@ +/* + * jQuery UI Tabs 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d){var s=0,u=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'},_create:function(){this._tabify(true)},_setOption:function(c,e){if(c=="selected")this.options.collapsible&&e==this.options.selected|| +this.select(e);else{this.options[c]=e;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+ ++s},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++u);return d.cookie.apply(null,[c].concat(d.makeArray(arguments)))},_ui:function(c,e){return{tab:c,panel:e,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c= +d(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function e(g,f){g.css({display:""});!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}this.list=this.element.find("ol,ul").eq(0);this.lis=d("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);var a=this,b=this.options,h=/^#.+/;this.anchors.each(function(g,f){var j=d(f).attr("href"),l=j.split("#")[0],p;if(l&&(l===location.toString().split("#")[0]|| +(p=d("base")[0])&&l===p.href)){j=f.hash;f.href=j}if(h.test(j))a.panels=a.panels.add(a._sanitizeSelector(j));else if(j!="#"){d.data(f,"href.tabs",j);d.data(f,"load.tabs",j.replace(/#.*$/,""));j=a._tabId(f);f.href="#"+j;f=d("#"+j);if(!f.length){f=d(b.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else b.disabled.push(g)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(b.selected===undefined){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){b.selected=g;return false}});if(typeof b.selected!="number"&&b.cookie)b.selected=parseInt(a._cookie(),10);if(typeof b.selected!="number"&&this.lis.filter(".ui-tabs-selected").length)b.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));b.selected=b.selected||(this.lis.length?0:-1)}else if(b.selected===null)b.selected=-1;b.selected=b.selected>=0&&this.anchors[b.selected]||b.selected<0?b.selected:0;b.disabled=d.unique(b.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(b.selected,b.disabled)!=-1&&b.disabled.splice(d.inArray(b.selected,b.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(b.selected>=0&&this.anchors.length){this.panels.eq(b.selected).removeClass("ui-tabs-hide");this.lis.eq(b.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[b.selected],a.panels[b.selected]))});this.load(b.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else b.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[b.collapsible?"addClass": +"removeClass"]("ui-tabs-collapsible");b.cookie&&this._cookie(b.selected,b.cookie);c=0;for(var i;i=this.lis[c];c++)d(i)[d.inArray(c,b.disabled)!=-1&&!d(i).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");b.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(b.event!="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs", +function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(b.fx)if(d.isArray(b.fx)){m=b.fx[0];o=b.fx[1]}else m=o=b.fx;var q=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);a._trigger("show", +null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},r=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};this.anchors.bind(b.event+".tabs", +function(){var g=this,f=d(this).closest("li"),j=a.panels.filter(":not(.ui-tabs-hide)"),l=d(a._sanitizeSelector(this.hash));if(f.hasClass("ui-tabs-selected")&&!b.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}b.selected=a.anchors.index(this);a.abort();if(b.collapsible)if(f.hasClass("ui-tabs-selected")){b.selected=-1;b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){r(g, +j)}).dequeue("tabs");this.blur();return false}else if(!j.length){b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this));this.blur();return false}b.cookie&&a._cookie(b.selected,b.cookie);if(l.length){j.length&&a.element.queue("tabs",function(){r(g,j)});a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs", +function(){return false})},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(b,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this, +"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,e,a){if(a===undefined)a=this.anchors.length;var b=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,e));c=!c.indexOf("#")?c.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs", +true);var i=d("#"+c);i.length||(i=d(h.panelTemplate).attr("id",c).data("destroy.tabs",true));i.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);i.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);i.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");i.removeClass("ui-tabs-hide"); +this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(c){var e=this.options,a=this.lis.eq(c).remove(),b=this.panels.eq(c).remove();if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=c}),function(h){return h>=c?--h:h});this._tabify();this._trigger("remove", +null,this._ui(a.find("a")[0],b[0]));return this},enable:function(c){var e=this.options;if(d.inArray(c,e.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=c});this._trigger("enable",null,this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){var e=this.options;if(c!=e.selected){this.lis.eq(c).addClass("ui-state-disabled");e.disabled.push(c);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this}, +select:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));else if(c===null)c=-1;if(c==-1&&this.options.collapsible)c=this.options.selected;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},load:function(c){var e=this,a=this.options,b=this.anchors.eq(c)[0],h=d.data(b,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(b,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing"); +if(a.spinner){var i=d("span",b);i.data("label.tabs",i.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(b.hash)).html(k);e._cleanup();a.cache&&d.data(b,"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.error(k,n,c,b)}catch(m){}}}));e.element.dequeue("tabs");return this}}, +abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(c,e){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.1"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(c,e){var a=this,b=this.options,h=a._rotate||(a._rotate= +function(i){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=b.selected;a.select(++k<a.anchors.length?k:0)},c);i&&i.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(i){i.clientX&&a.rotate(null)}:function(){t=b.selected;h()});if(c){this.element.bind("tabsshow",h);this.anchors.bind(b.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(b.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery); diff --git a/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.widget.min.js b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.widget.min.js new file mode 100644 index 000000000..74fb653a0 --- /dev/null +++ b/fannie/src/jquery/development-bundle/ui/minified/jquery.ui.widget.min.js @@ -0,0 +1,15 @@ +/*! + * jQuery UI Widget 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Widget + */ +(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype= +b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g= +b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create(); +this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f, +h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a= +b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); diff --git a/fannie/src/jquery/development-bundle/version.txt b/fannie/src/jquery/development-bundle/version.txt new file mode 100644 index 000000000..b9268dae2 --- /dev/null +++ b/fannie/src/jquery/development-bundle/version.txt @@ -0,0 +1 @@ +1.8.1 \ No newline at end of file diff --git a/fannie/src/jquery/docs/assets/ajax-content.html b/fannie/src/jquery/docs/assets/ajax-content.html new file mode 100644 index 000000000..0d10cfbcd --- /dev/null +++ b/fannie/src/jquery/docs/assets/ajax-content.html @@ -0,0 +1,43 @@ + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> \ No newline at end of file diff --git a/fannie/src/jquery/docs/css/jq.css b/fannie/src/jquery/docs/css/jq.css new file mode 100644 index 000000000..389ee774d --- /dev/null +++ b/fannie/src/jquery/docs/css/jq.css @@ -0,0 +1,29 @@ +body,div,h1{font-family:'trebuchet ms', verdana, arial;margin:0;padding:0;} +body{background-color:#fff;color:#333;font-size:small;margin:0;padding:0;} +h1{font-size:large;font-weight:400;margin:0;} +h2{color:#333;font-size:small;font-weight:400;margin:0;} +pre{background-color:#eee;border:1px solid #ddd;border-left-width:5px;color:#333;font-size:small;overflow-x:auto;padding:15px;} +pre.normal{background-color:transparent;border:none;border-left-width:0;overflow-x:auto;} +#logo{background:url(images/jq.png);display:block;float:right;height:31px;margin-right:10px;margin-top:10px;width:110px;} +#main{margin:0 20px 20px;padding:0 15px 15px 0;} +#content{padding:20px;} +#busy{background-color:#e95555;border:1px ridge #ccc;color:#eee;display:none;padding:3px;position:absolute;right:7px;top:7px;} +hr{height:1px;} +code{font-size:108%;font-style:normal;padding:0;} +ul{color:#333;list-style:square;} +#banner{margin:20px;padding-bottom:10px;text-align:left;} +#banner *{color:#232121;font-family:Georgia, Palatino, Times New Roman;font-size:30px;font-style:normal;font-weight:400;margin:0;padding:0;} +#banner h1{display:block;float:left;} +#banner h1 em{color:#6cf;} +#banner h2{float:right;font-size:26px;margin:10px 10px -10px -10px;} +#banner h3{clear:both;display:block;font-size:12px;margin-top:-20px;} +#banner a{border-top:1px solid #888;display:block;font-size:14px;margin:5px 0 0;padding:10px 0 0;text-align:right;width:auto;} +a.external{background-image:url(../img/external.png);background-position:center right;background-repeat:no-repeat;padding-right:12px;} +form{font-size:10pt;margin-bottom:20px;width:auto;} +form fieldset{padding:10px;text-align:left;width:140px;} +div#main h1{border-bottom:1px solid #CDCDCD;display:block;margin-top:20px;padding:10px 0 2px;} +table#tablesorter-demo {margin: 10px 0 0 0;} +table#options *{font-size:small;} +p.tip em {padding: 2px; background-color: #6cf; color: #FFF;} +p.tip.update em {background-color: #FF0000;} +div.digg {float: right;} \ No newline at end of file diff --git a/fannie/src/jquery/docs/example-ajax.html b/fannie/src/jquery/docs/example-ajax.html new file mode 100644 index 000000000..254ac7093 --- /dev/null +++ b/fannie/src/jquery/docs/example-ajax.html @@ -0,0 +1,119 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Appending table data with ajax</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> + <script type="text/javascript" id="js"> + $(document).ready(function() { + $("table").tablesorter(); + $("#ajax-append").click(function() { + $.get("assets/ajax-content.html", function(html) { + // append the "ajax'd" data to the table body + $("table tbody").append(html); + // let the plugin know that we made a update + $("table").trigger("update"); + // set sorting column and direction, this will sort on the first and third column + var sorting = [[2,1],[0,0]]; + // sort on the first column + $("table").trigger("sorton",[sorting]); + }); + return false; + }); +}); + </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Appending table data with ajax</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + <a href="#" id="ajax-append">Append new table data</a> + <br/> + <br/> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> diff --git a/fannie/src/jquery/docs/example-empty-table.html b/fannie/src/jquery/docs/example-empty-table.html new file mode 100644 index 000000000..52531dc8e --- /dev/null +++ b/fannie/src/jquery/docs/example-empty-table.html @@ -0,0 +1,75 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Initializing tablesorter on a empty table</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> + <script type="text/javascript" id="js">$(document).ready(function() { + $("table").tablesorter(); + $("#append").click(function() { + // add some html + var html = "<tr><td>Peter</td><td>Parker</td><td>28</td><td>$9.99</td><td>20%</td><td>Jul 6, 2006 8:14 AM</td></tr>"; + html += "<tr><td>John</td><td>Hood</td><td>33</td><td>$19.99</td><td>25%</td><td>Dec 10, 2002 5:14 AM</td></tr><tr><td>Clark</td><td>Kent</td><td>18</td><td>$15.89</td><td>44%</td><td>Jan 12, 2003 11:14 AM</td></tr>"; + html += "<tr><td>Bruce</td><td>Almighty</td><td>45</td><td>$153.19</td><td>44%</td><td>Jan 18, 2001 9:12 AM</td></tr>"; + // append new html to table body + $("table tbody").append(html); + // let the plugin know that we made a update + $("table").trigger("update"); + // set sorting column and direction, this will sort on the first and third column + var sorting = [[2,1],[0,0]]; + // sort on the first column + $("table").trigger("sorton",[sorting]); + return false; + }); +});</script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Initializing tablesorter on a empty table</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + <a href="#" id="append">Append new table data</a> + <br/> + <br/> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> diff --git a/fannie/src/jquery/docs/example-extending-defaults.html b/fannie/src/jquery/docs/example-extending-defaults.html new file mode 100644 index 000000000..931e26a61 --- /dev/null +++ b/fannie/src/jquery/docs/example-extending-defaults.html @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Extending default options</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // extend the default setting to always include the zebra widget. + $.tablesorter.defaults.widgets = ['zebra']; + // extend the default setting to always sort on the first column + $.tablesorter.defaults.sortList = [[0,0]]; + // call the tablesorter plugin + $("table").tablesorter(); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Extending default options</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-meta-headers.html b/fannie/src/jquery/docs/example-meta-headers.html new file mode 100644 index 000000000..6340faab9 --- /dev/null +++ b/fannie/src/jquery/docs/example-meta-headers.html @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Disable headers using metadata</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.metadata.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript"> + window.tableFile="table-metadata-disable.html"; + </script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin, the magic happens in the markup + $("table").tablesorter(); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Disable headers using metadata</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th class="{sorter: false}">First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th class="{sorter: false}">Discount</th> + <th>Date</th> + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-meta-parsers.html b/fannie/src/jquery/docs/example-meta-parsers.html new file mode 100644 index 000000000..33a938cf3 --- /dev/null +++ b/fannie/src/jquery/docs/example-meta-parsers.html @@ -0,0 +1,105 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Setting column parser using metadata</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.metadata.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin, the magic happens in the markup + $("table").tablesorter(); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Setting column parser using metadata</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th class="{sorter: 'text'}">First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th class="{sorter: 'procent'}">Discount</th> + <th>Date</th> + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-meta-sort-list.html b/fannie/src/jquery/docs/example-meta-sort-list.html new file mode 100644 index 000000000..99fdaeba3 --- /dev/null +++ b/fannie/src/jquery/docs/example-meta-sort-list.html @@ -0,0 +1,107 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Setting initial sorting order with metadata</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.metadata.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin, the magic happens in the markup + $("table").tablesorter(); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Setting initial sorting order with metadata</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <!-- sortlist is appended to the table using the class attribute and is picked up by metadata plugin --> + <table cellspacing="1" class="tablesorter {sortlist: [[0,0],[4,0]]}"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-debug.html b/fannie/src/jquery/docs/example-option-debug.html new file mode 100644 index 000000000..8492b607a --- /dev/null +++ b/fannie/src/jquery/docs/example-option-debug.html @@ -0,0 +1,116 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Enabling debug mode</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin + $("table").tablesorter({ + // enable debug mode + debug: true + }); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Enabling debug mode</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + + <p class="tip"> + <em>NOTE!</em> If firebug is installed the debuging information will be displayed in the firebug console. + </p> + + <h1>Demo</h1> + <div id="demo"> + + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + + </div> + + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-digits.html b/fannie/src/jquery/docs/example-option-digits.html new file mode 100644 index 000000000..6db8fb2b5 --- /dev/null +++ b/fannie/src/jquery/docs/example-option-digits.html @@ -0,0 +1,106 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Enabling debug mode</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin + $("table").tablesorter(); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Dealing with digits</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + + <h1>Demo</h1> + <div id="demo"> + + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Diff</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>9.99</td> + <td>20.3%</td> + <td>+3.0</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>19.99</td> + <td>25.1%</td> + <td>-7</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>15.89</td> + <td>44.2%</td> + <td>-15</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>153.19</td> + <td>44%</td> + <td>+19</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>56</td> + <td>153.19</td> + <td>23%</td> + <td>+9</td> + </tr> + </tbody> + </table> + + </div> + + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-sort-force.html b/fannie/src/jquery/docs/example-option-sort-force.html new file mode 100644 index 000000000..6e8824c70 --- /dev/null +++ b/fannie/src/jquery/docs/example-option-sort-force.html @@ -0,0 +1,107 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Force a default sorting order</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin + $("table").tablesorter({ + // set forced sort on the fourth column and i decending order. + sortForce: [[0,0]] + }); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Force a default sorting order</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-sort-key.html b/fannie/src/jquery/docs/example-option-sort-key.html new file mode 100644 index 000000000..ec8d48a08 --- /dev/null +++ b/fannie/src/jquery/docs/example-option-sort-key.html @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Change multi-column sorting key</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin + $("table").tablesorter({ + // change the multi sort key from the default shift to alt button + sortMultiSortKey: 'altKey' + }); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Change multi-column sorting key</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-sort-list.html b/fannie/src/jquery/docs/example-option-sort-list.html new file mode 100644 index 000000000..eda63721c --- /dev/null +++ b/fannie/src/jquery/docs/example-option-sort-list.html @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Set a initial sorting order</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin + $("table").tablesorter({ + // sort on the first column and third column, order asc + sortList: [[0,0],[2,0]] + }); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Set a initial sorting order</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-sort-order.html b/fannie/src/jquery/docs/example-option-sort-order.html new file mode 100644 index 000000000..b3b0bbef3 --- /dev/null +++ b/fannie/src/jquery/docs/example-option-sort-order.html @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Set a initi + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin + $("table").tablesorter({ + // change the default sorting order from 'asc' to 'desc' + sortInitialOrder: 'desc' + }); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Set a initial sorting order</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-option-text-extraction.html b/fannie/src/jquery/docs/example-option-text-extraction.html new file mode 100644 index 000000000..fb4b523c5 --- /dev/null +++ b/fannie/src/jquery/docs/example-option-text-extraction.html @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Dealing with markup inside cells</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + + // call the tablesorter plugin + $("table").tablesorter({ + // define a custom text extraction function + textExtraction: function(node) { + // extract data from markup and return it + return node.childNodes[0].childNodes[0].innerHTML; + } + }); +}); </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Dealing with markup inside cells</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td><strong><em>Peter</em></strong></td> + <td><strong><em>Parker</em></strong></td> + <td><strong><em>28</em></strong></td> + <td><strong><em>$9.99</em></strong></td> + <td><strong><em>20%</em></strong></td> + <td><strong><em>Jul 6, 2006 8:14 AM</em></strong></td> + </tr> + <tr> + <td><strong><em>John</em></strong></td> + <td><strong><em>Hood</em></strong></td> + <td><strong><em>33</em></strong></td> + <td><strong><em>$19.99</em></strong></td> + <td><strong><em>25%</em></strong></td> + <td><strong><em>Dec 10, 2002 5:14 AM</em></strong></td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-options-headers.html b/fannie/src/jquery/docs/example-options-headers.html new file mode 100644 index 000000000..b382b355e --- /dev/null +++ b/fannie/src/jquery/docs/example-options-headers.html @@ -0,0 +1,118 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Disable headers using options</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + $("table").tablesorter({ + // pass the headers argument and assing a object + headers: { + // assign the secound column (we start counting zero) + 1: { + // disable it by setting the property sorter to false + sorter: false + }, + // assign the third column (we start counting zero) + 2: { + // disable it by setting the property sorter to false + sorter: false + } + } + }); +});</script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Disable headers using options</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-pager.html b/fannie/src/jquery/docs/example-pager.html new file mode 100644 index 000000000..6313568a2 --- /dev/null +++ b/fannie/src/jquery/docs/example-pager.html @@ -0,0 +1,329 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Pager plugin</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript"> + $(function() { + $("table") + .tablesorter({widthFixed: true, widgets: ['zebra']}) + .tablesorterPager({container: $("#pager")}); + }); + </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Pager plugin</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + +<h1>Javascript</h1> +<pre class="javascript"> +$(document).ready(function() { + $("table") + .tablesorter({widthFixed: true, widgets: ['zebra']}) + .tablesorterPager({container: $("#pager")}); +}); +</pre> +<h1>Demo</h1> +<table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr></tbody> +</table> +<div id="pager" class="pager"> + <form> + <img src="../addons/pager/icons/first.png" class="first"/> + <img src="../addons/pager/icons/prev.png" class="prev"/> + <input type="text" class="pagedisplay"/> + <img src="../addons/pager/icons/next.png" class="next"/> + <img src="../addons/pager/icons/last.png" class="last"/> + <select class="pagesize"> + <option selected="selected" value="10">10</option> + <option value="20">20</option> + <option value="30">30</option> + <option value="40">40</option> + </select> + </form> +</div> + +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-parsers.html b/fannie/src/jquery/docs/example-parsers.html new file mode 100644 index 000000000..002ee0a7f --- /dev/null +++ b/fannie/src/jquery/docs/example-parsers.html @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Writing custom parsers</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> + <script type="text/javascript" id="js"> + // add parser through the tablesorter addParser method + $.tablesorter.addParser({ + // set a unique id + id: 'grades', + is: function(s) { + // return false so this parser is not auto detected + return false; + }, + format: function(s) { + // format your data for normalization + return s.toLowerCase().replace(/good/,2).replace(/medium/,1).replace(/bad/,0); + }, + // set type, either numeric or text + type: 'numeric' + }); + + $(function() { + $("table").tablesorter({ + headers: { + 6: { + sorter:'grades' + } + } + }); + }); + </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Writing custom parsers</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>Name</th> + <th>Major</th> + <th>Gender</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Overall grades</th> + </tr> + </thead> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + <td>80</td> + <td>70</td> + <td>75</td> + <td>bad</td> + </tr> + <tr> + <td>Student02</td> + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>good</td> + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + <td>80</td> + <td>medium</td> + </tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-trigger-sort.html b/fannie/src/jquery/docs/example-trigger-sort.html new file mode 100644 index 000000000..d107921f8 --- /dev/null +++ b/fannie/src/jquery/docs/example-trigger-sort.html @@ -0,0 +1,113 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Sort table using a link outside the table</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> + <script type="text/javascript" id="js">$(document).ready(function() { + $("table").tablesorter(); + $("#trigger-link").click(function() { + // set sorting column and direction, this will sort on the first and third column the column index starts at zero + var sorting = [[0,0],[2,0]]; + // sort on the first column + $("table").trigger("sorton",[sorting]); + // return false to stop default link action + return false; + }); +});</script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Sort table using a link outside the table</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody></table> + <a href="#" id="trigger-link">Sort first and third columns</a> + <br/> + <br/> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> diff --git a/fannie/src/jquery/docs/example-triggers.html b/fannie/src/jquery/docs/example-triggers.html new file mode 100644 index 000000000..58d1711a9 --- /dev/null +++ b/fannie/src/jquery/docs/example-triggers.html @@ -0,0 +1,336 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Triggers sortStart and sortEnd</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> +<script type="text/javascript" id="js">$(document).ready(function() { + // call the tablesorter plugin, the magic happens in the markup + $("table").tablesorter(); + //assign the sortStart event + $("table").bind("sortStart",function() { + $("#overlay").show(); + }).bind("sortEnd",function() { + $("#overlay").hide(); + }); +}); </script> +<style> +#overlay { + top: 100px; + left: 50%; + position: absolute; + margin-left: -100px; + width: 200px; + text-align: center; + display: none; + margin-top: -10px; + background: #000; + color: #FFF; +} +</style> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Triggers sortStart and sortEnd</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id=""> + <div id="overlay"> + Please wait... + </div> + <!-- sortlist is appended to the table using the class attribute and is picked up by metadata plugin --> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr> + </tbody> + </table> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/example-update-cell.html b/fannie/src/jquery/docs/example-update-cell.html new file mode 100644 index 000000000..3dbd8b047 --- /dev/null +++ b/fannie/src/jquery/docs/example-update-cell.html @@ -0,0 +1,118 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Appending table data with ajax</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript" src="js/examples.js"></script> + <script type="text/javascript" id="js"> + $(document).ready(function() { + $("table").tablesorter(); + $("table tbody td.discount").click(function() { + // randomize a number + var discount = '$' + Math.round(Math.random() * Math.random() * 100) + '.' + Math.round(Math.random() * Math.random() * 100); + $(this).text(discount); + $("table").trigger("updateCell",[this]); + // set sorting column and direction, this will sort on the first and third column + var sorting = [[3,1]]; + // sort on the first column + $("table").trigger("sorton",[sorting]); + return false; + + + }); +}); + </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Updateing the table cache</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + <h1>Demo</h1> + <div id="demo"> + <table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Date</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td class="discount">$9.99</td> + <td>20%</td> + + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td class="discount">$19.99</td> + <td>25%</td> + + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td class="discount">$15.89</td> + <td>44%</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td class="discount">$153.19</td> + <td>44%</td> + + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td class="discount">$13.19</td> + <td>11%</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + <br/> + <br/> + </div> + <h1>Javascript</h1> + <div id="javascript"> + <pre class="javascript"></pre> + </div> + <h1>HTML</h1> + <div id="html"> + <pre class="html"></pre> + </div> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> diff --git a/fannie/src/jquery/docs/example-widgets.html b/fannie/src/jquery/docs/example-widgets.html new file mode 100644 index 000000000..807722692 --- /dev/null +++ b/fannie/src/jquery/docs/example-widgets.html @@ -0,0 +1,383 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0 - Writing custom widgets</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript"> + $(function() { + // add new widget called repeatHeaders + $.tablesorter.addWidget({ + // give the widget a id + id: "repeatHeaders", + // format is called when the on init and when a sorting has finished + format: function(table) { + // cache and collect all TH headers + if(!this.headers) { + var h = this.headers = []; + $("thead th",table).each(function() { + h.push( + "<th>" + $(this).text() + "</th>" + ); + + }); + } + + // remove appended headers by classname. + $("tr.repated-header",table).remove(); + + // loop all tr elements and insert a copy of the "headers" + for(var i=0; i < table.tBodies[0].rows.length; i++) { + // insert a copy of the table head every 10th row + if((i%5) == 4) { + $("tbody tr:eq(" + i + ")",table).before( + $("<tr></tr>").addClass("repated-header").html(this.headers.join("")) + + ); + } + } + + } + }); + + // call the tablesorter plugin and assign widgets with id "zebra" (Default widget in the core) and the newly created "repeatHeaders" + $("table").tablesorter({ + widgets: ['zebra','repeatHeaders'] + }); + + }); + </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Writing custom widgets</h2> + <h3>Flexible client-side table sorting</h3> + <a href="index.html">Back to documentation</a> +</div> +<div id="main"> + +<h1>Javascript</h1> +<pre class="javascript"> +// add new widget called repeatHeaders +$.tablesorter.addWidget({ + // give the widget a id + id: "repeatHeaders", + // format is called when the on init and when a sorting has finished + format: function(table) { + // cache and collect all TH headers + if(!this.headers) { + var h = this.headers = []; + $("thead th",table).each(function() { + h.push( + "<th>" + $(this).text() + "</th>" + ); + + }); + } + + // remove appended headers by classname. + $("tr.repated-header",table).remove(); + + // loop all tr elements and insert a copy of the "headers" + for(var i=0; i < table.tBodies[0].rows.length; i++) { + // insert a copy of the table head every 10th row + if((i%5) == 4) { + $("tbody tr:eq(" + i + ")",table).before( + $("<tr></tr>").html(this.headers.join("")) + + ); + } + } + } +}); + +// call the tablesorter plugin and assign widgets with id "zebra" (Default widget in the core) and the newly created "repeatHeaders" +$("table").tablesorter({ + widgets: ['zebra','repeatHeaders'] +}); +</pre> + +<h1>Demo</h1> +<table cellspacing="1" class="tablesorter"> + <thead> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + </tbody> +</table> +</div> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/img/external.png b/fannie/src/jquery/docs/img/external.png new file mode 100644 index 000000000..419c06fb9 Binary files /dev/null and b/fannie/src/jquery/docs/img/external.png differ diff --git a/fannie/src/jquery/docs/index.html b/fannie/src/jquery/docs/index.html new file mode 100644 index 000000000..43c21f210 --- /dev/null +++ b/fannie/src/jquery/docs/index.html @@ -0,0 +1,576 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> +<head> + <title>jQuery plugin: Tablesorter 2.0</title> + <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> + <script type="text/javascript" src="js/docs.js"></script> + <script type="text/javascript"> + $(function() { + $("#tablesorter-demo").tablesorter({sortList:[[0,0],[2,1]], widgets: ['zebra']}); + $("#options").tablesorter({sortList: [[0,0]], headers: { 3:{sorter: false}, 4:{sorter: false}}}); + }); + </script> +</head> +<body> +<div id="banner"> + <h1>table<em>sorter</em></h1> + <h2>Documentation</h2> + <h3>Flexible client-side table sorting</h3> + <a href="#"></a> +</div> +<div id="main"> + <div class="digg"> + <script src="http://images.del.icio.us/static/js/blogbadge.js"></script> + </div> + + <p> + <strong>Author:</strong> <a class="external" href="http://lovepeacenukes.com">Christian Bach</a><br /> + <strong>Version:</strong> 2.0.5 (<a href="../changelog">changelog</a>)<br /> + <strong>Licence:</strong> + Dual licensed under <a class="external" href="http://www.opensource.org/licenses/mit-license.php">MIT</a> + or <a class="external" href="http://www.opensource.org/licenses/gpl-license.php">GPL</a> licenses. + </p> + + <p class="tip update"> + <em>Update!</em> New version!, and the tablesorter docs are now available in russian, head over to <a class="external" href="http://tablesorter.ru/docs/">tablesorter.ru</a> + </p> + + <p class="tip"> + <em>Helping out!</em> If you like tablesorter and you're feeling generous, take a look at my <a class="external" href="http://www.amazon.com/gp/registry/wishlist/3VAOWCL63NEA6/ref=wl_web/">Amazon Wish List</a> + </p> + + + <p>Comments and love letters can be sent to: <span class="email">christian at tablesorter dot com</span>.</p> + + <p> </p> + + + + <!-- + <p class="tip"> + <em>Help!</em> keep tablesorter.com up and running. If you like tablesorter, have a couple of bucks over or just feel like it. Please donate.</p> + </p> + + <form name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="post"> + <input type="hidden" name="cmd" value="_xclick"> + <input type="hidden" name="business" value="christian.bach@polyester.se"> + <input type="hidden" name="item_name" value="Tablesorter donation"> + <input type="hidden" name="currency_code" value="USD"> + <input type="hidden" name="amount" value="10.00"> + <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but04.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"> + </form> + --> + + + + <a name="Contents"></a> + <h1>Contents</h1> + <ol> + <li><a href="#Introduction">Introduction</a></li> + <li><a href="#Demo">Demo</a></li> + <li><a href="#Getting-Started">Getting started</a></li> + + <li><a href="#Examples">Examples</a></li> + + <li><a href="#Configuration">Configuration</a></li> + <li><a href="#Download">Download</a></li> + <li><a href="#Compatibility">Compatibility</a></li> + <li><a href="#Support">Support</a></li> + <li><a href="#Credits">Credits</a></li> + </ol> + + <a name="Introduction"></a> + <h1>Introduction</h1> + <p> + tablesorter is a <a class="external" href="http://jquery.com">jQuery</a> plugin for turning a + standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. + tablesorter can successfully parse and sort many types of data including linked data in a cell. + It has many useful features including: + </p> + + <ul> + <li>Multi-column sorting</li> + <li>Parsers for sorting text, URIs, integers, currency, floats, IP addresses, dates (ISO, long and short formats), time. <a href="example-parsers.html">Add your own easily</a></li> + <!-- + <li>Support for ROWSPAN and COLSPAN on TH elements</li> + --> + <li>Support secondary "hidden" sorting (e.g., maintain alphabetical sort when sorting on other criteria)</li> + <li>Extensibility via <a href="example-widgets.html">widget system</a></li> + <li>Cross-browser: IE 6.0+, FF 2+, Safari 2.0+, Opera 9.0+</li> + <li>Small code size</li> + + </ul> + + <a name="Demo"></a> + <h1>Demo</h1> + + <table id="tablesorter-demo" class="tablesorter" border="0" cellpadding="0" cellspacing="1"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Age</th> + <th>Total</th> + <th>Discount</th> + <th>Difference</th> + <th>Date</th> + </tr> + </thead> + <tbody> + <tr> + <td>Peter</td> + <td>Parker</td> + <td>28</td> + <td>$9.99</td> + <td>20.9%</td> + <td>+12.1</td> + <td>Jul 6, 2006 8:14 AM</td> + </tr> + <tr> + <td>John</td> + <td>Hood</td> + <td>33</td> + <td>$19.99</td> + <td>25%</td> + <td>+12</td> + <td>Dec 10, 2002 5:14 AM</td> + </tr> + <tr> + <td>Clark</td> + <td>Kent</td> + <td>18</td> + <td>$15.89</td> + <td>44%</td> + <td>-26</td> + <td>Jan 12, 2003 11:14 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Almighty</td> + <td>45</td> + <td>$153.19</td> + <td>44.7%</td> + <td>+77</td> + <td>Jan 18, 2001 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>-100.9</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + <tr> + <td>Bruce</td> + <td>Evans</td> + <td>22</td> + <td>$13.19</td> + <td>11%</td> + <td>0</td> + <td>Jan 18, 2007 9:12 AM</td> + </tr> + </tbody> + </table> + + <p class="tip"> + <em>TIP!</em> Sort multiple columns simultaneously by holding down the shift key and clicking a second, third or even fourth column header! + </p> + + + <a name="Getting-Started"></a> + <h1>Getting started</h1> + <p> + To use the tablesorter plugin, include the <a class="external" href="http://jquery.com">jQuery</a> + library and the tablesorter plugin inside the <code>&lt;head&gt;</code> tag + of your HTML document: + </p> + +<pre class="javascript"> +&lt;script type=&quot;text/javascript&quot; src=&quot;/path/to/jquery-latest.js&quot;&gt;&lt;/script&gt; +&lt;script type=&quot;text/javascript&quot; src=&quot;/path/to/jquery.tablesorter.js&quot;&gt;&lt;/script&gt; +</pre> + + + <p>tablesorter works on standard HTML tables. You must include THEAD and TBODY tags:</p> + + <pre class="html"> +&lt;table id="myTable" class="tablesorter"&gt; +&lt;thead&gt; +&lt;tr&gt; + &lt;th&gt;Last Name&lt;/th&gt; + &lt;th&gt;First Name&lt;/th&gt; + &lt;th&gt;Email&lt;/th&gt; + &lt;th&gt;Due&lt;/th&gt; + &lt;th&gt;Web Site&lt;/th&gt; +&lt;/tr&gt; +&lt;/thead&gt; +&lt;tbody&gt; +&lt;tr&gt; + &lt;td&gt;Smith&lt;/td&gt; + &lt;td&gt;John&lt;/td&gt; + &lt;td&gt;jsmith@gmail.com&lt;/td&gt; + &lt;td&gt;$50.00&lt;/td&gt; + &lt;td&gt;http://www.jsmith.com&lt;/td&gt; +&lt;/tr&gt; +&lt;tr&gt; + &lt;td&gt;Bach&lt;/td&gt; + &lt;td&gt;Frank&lt;/td&gt; + &lt;td&gt;fbach@yahoo.com&lt;/td&gt; + &lt;td&gt;$50.00&lt;/td&gt; + &lt;td&gt;http://www.frank.com&lt;/td&gt; +&lt;/tr&gt; +&lt;tr&gt; + &lt;td&gt;Doe&lt;/td&gt; + &lt;td&gt;Jason&lt;/td&gt; + &lt;td&gt;jdoe@hotmail.com&lt;/td&gt; + &lt;td&gt;$100.00&lt;/td&gt; + &lt;td&gt;http://www.jdoe.com&lt;/td&gt; +&lt;/tr&gt; +&lt;tr&gt; + &lt;td&gt;Conway&lt;/td&gt; + &lt;td&gt;Tim&lt;/td&gt; + &lt;td&gt;tconway@earthlink.net&lt;/td&gt; + &lt;td&gt;$50.00&lt;/td&gt; + &lt;td&gt;http://www.timconway.com&lt;/td&gt; +&lt;/tr&gt; +&lt;/tbody&gt; +&lt;/table&gt; + </pre> + + + <p>Start by telling tablesorter to sort your table when the document is loaded:</p> + + + + + <pre class="javascript"> +$(document).ready(function() + { + $("#myTable").tablesorter(); + } +); + </pre> + + <p> + Click on the headers and you'll see that your table is now sortable! You can + also pass in configuration options when you initialize the table. This tells + tablesorter to sort on the first and second column in ascending order. + </p> + + + + <pre class="javascript"> +$(document).ready(function() + { + $("#myTable").tablesorter( {sortList: [[0,0], [1,0]]} ); + } +); + </pre> + + <p class="tip"> + <em>NOTE!</em> tablesorter will auto-detect most data types including numbers, dates, ip-adresses for more information see <a href="#Examples">Examples</a> + </p> + + + + + + <a name="Examples"></a> + <h1>Examples</h1> + <p> + These examples will show what's possible with tablesorter. You need Javascript enabled to + run these samples, just like you and your users will need Javascript enabled to use tablesorter. + </p> + + <strong>Basic</strong> + <ul> + <li><a href="example-option-sort-list.html">Set a initial sorting order using options</a></li> + <li><a href="example-option-digits.html">Dealing with digits!</a></li> + <li><a href="example-options-headers.html">Disable header using options</a></li> + <li><a href="example-trigger-sort.html">Sort table using a link outside the table</a></li> + <li><a href="example-option-sort-force.html">Force a default sorting order</a></li> + <li><a href="example-option-sort-key.html">Change the default multi-sorting key</a></li> + </ul> + <strong>Metadata - setting inline options</strong> + <ul> + <li><a href="example-meta-sort-list.html">Set a initial sorting order using metadata</a></li> + <li><a href="example-meta-headers.html">Disable header using metadata</a></li> + <li><a href="example-meta-parsers.html">Setting column parser using metadata</a></li> + </ul> + + <strong>Advanced</strong> + <ul> + <li><a href="example-triggers.html">Triggers sortEnd and sortStart(Displaying sorting progress)</a></li> + <li><a href="example-ajax.html">Appending table data with ajax</a></li> + <li><a href="example-empty-table.html">Initializing tablesorter on a empty table</a></li> + <li><a href="example-option-text-extraction.html">Dealing with markup inside cells</a></li> + <li><a href="example-extending-defaults.html">Extending default options</a></li> + <li><a href="example-option-debug.html">Enableing debug mode</a></li> + <li><a href="example-parsers.html">Parser, writing your own</a></li> + <li><a href="example-widgets.html">Widgets, writing your own</a></li> + </ul> + + <strong>Companion plugins</strong> + <ul> + <li><a href="example-pager.html">Pager plugin</a></li> + </ul> + + + + + + + <a name="Configuration"></a> + <h1>Configuration</h1> + + <p> + tablesorter has many options you can pass in at initialization to achieve different effects: + </p> + + + + <table id="options" class="tablesorter" border="0" cellpadding="0" cellspacing="1"> + <thead> + <tr> + <th>Property</th> + <th>Type</th> + <th>Default</th> + <th>Description</th> + <th>Link</th> + </tr> + </thead> + <tbody> + <tr> + <td>sortList</td> + <td>Array</td> + <td>null</td> + <td>An array of instructions for per-column sorting and direction in the format: <code>[[columnIndex, sortDirection], ... ]</code> where columnIndex is a zero-based index for your columns left-to-right and sortDirection is 0 for Ascending and 1 for Descending. A valid argument that sorts ascending first by column 1 and then column 2 looks like: <code>[[0,0],[1,0]]</code></td> + <td><a href="example-option-sort-list.html">Example</a></td> + </tr> + <!-- + <tr> + <td>sortInitialOrder</td> + <td>String</td> + <td>asc</td> + <td>When clicking the header for the first time, the direction it sorts. Valid arguments are "asc" for Ascending or "desc" for Descending.</td> + <td><a href="example-option-sort-order.html">Example</a></td> + </tr> + --> + <tr> + <td>sortMultiSortKey</td> + <td>String</td> + <td>shiftKey</td> + <td>The key used to select more than one column for multi-column sorting. Defaults to the shift key. Other options might be ctrlKey, altKey. <br/>Reference: <a class="external" href="http://developer.mozilla.org/en/docs/DOM:event#Properties">http://developer.mozilla.org/en/docs/DOM:event#Properties</a></td> + + <td><a href="example-option-sort-key.html">Example</a></td> + </tr> + <tr> + <td>textExtraction</td> + <td>String Or Function</td> + <td>simple</td> + <td> + Defines which method is used to extract data from a table cell for sorting. + Built-in options include "simple" and "complex". Use complex if you have data marked up + inside of a table cell like: <code>&lt;td&gt;&lt;strong&gt;&lt;em&gt;123 Main Street&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;</code>. + Complex can be slow in large tables so consider writing your own text extraction function "myTextExtraction" which you define like: +<pre class="javascript"> +var myTextExtraction = function(node) +{ + // extract data from markup and return it + return node.childNodes[0].childNodes[0].innerHTML; +} +$(document).ready(function() + { + $("#myTable").tableSorter( {textExtraction: myTextExtraction} ); + } +); +</pre> + + tablesorter will pass a jQuery object containing the contents of the current cell for you to parse and return. Thanks to Josh Nathanson for the examples. + </td> + <td><a href="example-option-text-extraction.html">Example</a></td> + </tr> + <tr> + <td>headers</td> + <td>Object</td> + <td>null</td> + <td> + An object of instructions for per-column controls in the format: <code>headers: { 0: { option: setting }, ... }</code> For example, to disable + sorting on the first two columns of a table: <code>headers: { 0: { sorter: false}, 1: {sorter: false} }</code> + </td> + <td><a href="example-options-headers.html">Example</a></td> + </tr> + <tr> + <td>sortForce</td> + <td>Array</td> + <td>null</td> + <td>Use to add an additional forced sort that will be appended to the dynamic selections by the user. For example, can be used to sort people alphabetically after some other user-selected sort that results in rows with the same value like dates or money due. It can help prevent data from appearing as though it has a random secondary sort.</td> + <td><a href="example-option-sort-force.html">Example</a></td> + </tr> + <tr> + <td>widthFixed</td> + <td>Boolean</td> + <td>false</td> + <td>Indicates if tablesorter should apply fixed widths to the table columns. This is useful for the Pager companion. Requires the <a href="#Download-Addons">jQuery dimension plugin</a> to work.</a></td> + <td><a href="example-pager.html">Example</a></td> + </tr> + <tr> + <td>cancelSelection</td> + <td>Boolean</td> + <td>true</td> + <td>Indicates if tablesorter should disable selection of text in the table header (TH). Makes header behave more like a button.</td> + <td></td> + </tr> + <tr> + <td>cssHeader</td> + <td>String</td> + <td>"header"</td> + <td>The CSS style used to style the header in its unsorted state. Example from the blue skin: +<pre class="css"> +th.header { + background-image: url(../img/small.gif); + cursor: pointer; + font-weight: bold; + background-repeat: no-repeat; + background-position: center left; + padding-left: 20px; + border-right: 1px solid #dad9c7; + margin-left: -1px; +} +</pre> + </td> + <td></td> + </tr> + <tr> + <td>cssAsc</td> + <td>String</td> + <td>"headerSortUp"</td> + <td>The CSS style used to style the header when sorting ascending. Example from the blue skin: +<pre class="css"> +th.headerSortUp { + background-image: url(../img/small_asc.gif); + background-color: #3399FF; +} +</pre> + </td> + <td></td> + </tr> + <tr> + <td>cssDesc</td> + <td>String</td> + <td>"headerSortDown"</td> + <td>The CSS style used to style the header when sorting descending. Example from the blue skin: +<pre class="css"> +th.headerSortDown { + background-image: url(../img/small_desc.gif); + background-color: #3399FF; +} +</pre> + </td> + <td></td> + </tr> + <tr> + <td>debug</td> + <td>Boolean</td> + <td>false</td> + <td> + Boolean flag indicating if tablesorter should display debuging information usefull for development. + </td> + <td><a href="example-option-debug.html">Example</a></td> + </tr> + </tbody> + </table> + + + +<a name="Download"></a> + <h1>Download</h1> + + <p><strong>Full release</strong> - Plugin, Documentation, Add-ons, Themes <a href="../jquery.tablesorter.zip">jquery.tablesorter.zip</a></p> + + + <p><strong>Pick n choose</strong> - Place at least the required files in a directory on your webserver that is accessible to a web browser. Record this location.</p> + + <strong id="Download-Required">Required:</strong> + <ul> + <li><a class="external" href="http://docs.jquery.com/Downloading_jQuery#Download_jQuery">jQuery</a> (1.2.1 or higher)</li> + <li><a href="../jquery.tablesorter.min.js">jquery.tablesorter.min.js</a> (12kb, Minified for production)</li> + </ul> + + <strong id="Download-Addons">Optional/Add-Ons:</strong> + <ul> + <li><a class="external" href="http://jquery.com/dev/svn/trunk/plugins/metadata/lib/jQuery/metadata.js?format=raw">metadata.js</a> (3,7kb <strong>Required for setting <a href="#Examples">inline options</a></strong>)</li> + <!-- + <li><a class="external" href="http://dev.jquery.com/browser/trunk/plugins/dimensions/jquery.dimensions. +.js?format=raw">jquery.dimensions.pack.js</a> (5,1kb, <a href="http://dean.edwards.name/packer/" class="external">packed</a>, for production. <strong>Required: for the <a href="example-pager.html">tablesorter pagination plugin</a></strong>)</li> + --> + <li><a href="../jquery.tablesorter.js">jquery.tablesorter.js</a> (17,7kb, for development)</li> + <li><a href="../addons/pager/jquery.tablesorter.pager.js">jquery.tablesorter.pager.js</a> (3,6kb, <a href="example-pager.html">tablesorter pagination plugin</a>)</li> + </ul> + + <strong id="Download-Widgets">Widgets:</strong> + <ul> + <li><a class="external" href="http://www.jdempster.com/category/code/jquery/tablesortercookiewidget/">Cookie Widget</a>, By <a class="external" href="http://www.jdempster.com/">James Dempster</a></li> + </ul> + + <strong id="Download-Themes">Themes:</strong> + <ul> + <li><a href="../themes/green/green.zip">Green Skin</a> - Images and CSS styles for green themed headers</li> + <li><a href="../themes/blue/blue.zip">Blue Skin</a> - Images and CSS styles for blue themed headers (as seen in the examples)</li> + </ul> + + <a name="Compatibility"></a> + <h1>Browser Compatibility</h1> + + <p>tablesorter has been tested successfully in the following browsers with Javascript enabled:</p> + <ul> + <li>Firefox 2+</li> + <li>Internet Explorer 6+</li> + <li>Safari 2+</li> + <li>Opera 9+</li> + <li>Konqueror</li> + </ul> + + <p><a class="external" href="http://docs.jquery.com/Browser_Compatibility">jQuery Browser Compatibility</a></p> + + + + +<a name="Support"></a> + <h1>Support</h1> + <p> + Support is available through the + <a class="external" href="http://jquery.com/discuss/">jQuery Mailing List</a>. + </p> + <p>Access to the jQuery Mailing List is also available through <a class="external" href="http://www.nabble.com/JQuery-f15494.html">Nabble Forums</a>.</p> + + + <a name="Credits"></a> + <h1>Credits</h1> + <p> + Written by <a class="external" href="http://lovepeacenukes.com">Christian Bach</a>. + </p> + <p> + Documentation written by <a class="external" href="http://www.ghidinelli.com">Brian Ghidinelli</a>, + based on <a class="external" href="http://malsup.com/jquery/">Mike Alsup's</a> great documention. + </p> + <p> + <a class="external" href="http://ejohn.org">John Resig</a> for the fantastic <a class="external" href="http://jquery.com">jQuery</a> + </p> +</div> + +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> +<script type="text/javascript"> +_uacct = "UA-2189649-2"; +urchinTracker(); +</script> +</body> +</html> + diff --git a/fannie/src/jquery/docs/js/docs.js b/fannie/src/jquery/docs/js/docs.js new file mode 100644 index 000000000..924caed67 --- /dev/null +++ b/fannie/src/jquery/docs/js/docs.js @@ -0,0 +1,23 @@ +/* Stop IE flicker */ +if ($.browser.msie == true) document.execCommand('BackgroundImageCache', false, true); +ChiliBook.recipeFolder = "js/chili/"; +ChiliBook.stylesheetFolder = "js/chili/" + +jQuery.fn.antispam = function() { + return this.each(function(){ + var email = $(this).text().toLowerCase().replace(/\sdot/g,'.').replace(/\sat/g,'@').replace(/\s+/g,''); + var URI = "mailto:" + email; + $(this).hide().before( + $("<a></a>").attr("href",URI).addClass("external").text(email) + ); + }); +}; + + +$(function() { + $("pre.javascript").chili(); + $("pre.html").chili(); + $("pre.css").chili(); + $("a.external").each(function() {this.target = '_new'}); + $("span.email").antispam(); +}); \ No newline at end of file diff --git a/fannie/src/jquery/docs/js/examples.js b/fannie/src/jquery/docs/js/examples.js new file mode 100644 index 000000000..d7d43987f --- /dev/null +++ b/fannie/src/jquery/docs/js/examples.js @@ -0,0 +1,29 @@ +$(function() { + + // get javascript source + $("#javascript pre").text($("#js").html()); + + if($("#demo").size() > 0) { + // old school chaining... + var html = $("#demo").html() + .toLowerCase() + .replace(/\n|\t|\r/g,'') + .replace(/<td/g,'\t\t\t<td') + .replace(/<\/td>/g,'</td>\n') + .replace(/<th/g,'\t\t\t<th') + .replace(/<\/th>/g,'</th>\n') + .replace(/<\/tr>/g,'\t\t</tr>') + .replace(/<tr>/g,'\n\t\t<tr>\n') + .replace(/<thead/g,'\n\t<thead>') + .replace(/<\/thead>/g,'\n\t</thead>') + .replace(/<tbody/g,'\n\t<tbody') + .replace(/<\/tbody>/g,'\n\t</tbody>') + .replace(/<\/table>/g,'\n</table>') + .replace(/-->/g,'-->\n'); + + $("#html pre").text(html); + } + $("pre.javascript").chili(); + $("pre.html").chili(); + $("pre.css").chili(); +}); \ No newline at end of file diff --git a/fannie/src/jquery/index.html b/fannie/src/jquery/index.html new file mode 100644 index 000000000..8406e57d2 --- /dev/null +++ b/fannie/src/jquery/index.html @@ -0,0 +1,395 @@ +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <title>jQuery UI Example Page</title> + <link type="text/css" href="css/smoothness/jquery-ui-1.8.1.custom.css" rel="stylesheet" /> + <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> + <script type="text/javascript" src="js/jquery-ui-1.8.1.custom.min.js"></script> + <script type="text/javascript"> + $(function(){ + + // Accordion + $("#accordion").accordion({ header: "h3" }); + + //Autocomplete + $("#autocomplete").autocomplete({ + source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"] + }); + + // Button + $("#button").button(); + $("#radioset").buttonset(); + + // Tabs + $('#tabs').tabs(); + + + // Dialog + $('#dialog').dialog({ + autoOpen: false, + width: 600, + buttons: { + "Ok": function() { + $(this).dialog("close"); + }, + "Cancel": function() { + $(this).dialog("close"); + } + } + }); + + // Dialog Link + $('#dialog_link').click(function(){ + $('#dialog').dialog('open'); + return false; + }); + + // Datepicker + $('#datepicker').datepicker({ + inline: true + }); + + // Slider + $('#slider').slider({ + range: true, + values: [17, 67] + }); + + // Progressbar + $("#progressbar").progressbar({ + value: 20 + }); + + //hover states on the static widgets + $('#dialog_link, ul#icons li').hover( + function() { $(this).addClass('ui-state-hover'); }, + function() { $(this).removeClass('ui-state-hover'); } + ); + + }); + </script> + <style type="text/css"> + /*demo page css*/ + body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;} + .demoHeaders { margin-top: 2em; } + #dialog_link {padding: .4em 1em .4em 20px;text-decoration: none;position: relative;} + #dialog_link span.ui-icon {margin: 0 5px 0 0;position: absolute;left: .2em;top: 50%;margin-top: -8px;} + ul#icons {margin: 0; padding: 0;} + ul#icons li {margin: 2px; position: relative; padding: 4px 0; cursor: pointer; float: left; list-style: none;} + ul#icons span.ui-icon {float: left; margin: 0 4px;} + </style> + </head> + <body> + <h1>Welcome to jQuery UI!</h1> + <p style="font-size: 1.3em; line-height: 1.5; margin: 1em 0; width: 50%;">This page demonstrates the widgets you downloaded using the theme you selected in the download builder. We've included and linked to minified versions of <a href="js/jquery-1.4.2.min.js">jQuery</a>, your personalized copy of <a href="js/jquery-ui-1.8.1.custom.min.js">jQuery UI (js/jquery-ui-1.8.1.custom.min.js)</a>, and <a href="css/smoothness/jquery-ui-1.8.1.custom.css">css/smoothness/jquery-ui-1.8.1.custom.css</a> which imports the entire jQuery UI CSS Framework. You can choose to link a subset of the CSS Framework depending on your needs. </p> + <p style="font-size: 1.2em; line-height: 1.5; margin: 1em 0; width: 50%;">You've downloaded components and a theme that are compatible with jQuery 1.3+. Please make sure you are using jQuery 1.3+ in your production environment.</p> + + <p style="font-weight: bold; margin: 2em 0 1em; font-size: 1.3em;">YOUR COMPONENTS:</p> + + <!-- Accordion --> + <h2 class="demoHeaders">Accordion</h2> + <div id="accordion"> + <div> + <h3><a href="#">First</a></h3> + <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div> + </div> + <div> + <h3><a href="#">Second</a></h3> + <div>Phasellus mattis tincidunt nibh.</div> + </div> + <div> + <h3><a href="#">Third</a></h3> + <div>Nam dui erat, auctor a, dignissim quis.</div> + </div> + </div> + + <!-- Autocomplete --> + <h2 class="demoHeaders">Autocomplete</h2> + <div> + <input id="autocomplete" style="z-index: 100; position: relative" title="type &quot;a&quot;" /> + </div> + + + <!-- Button --> + <h2 class="demoHeaders">Button</h2> + <button id="button">A button element</button> + <form style="margin-top: 1em;"> + <div id="radioset"> + <input type="radio" id="radio1" name="radio" /><label for="radio1">Choice 1</label> + <input type="radio" id="radio2" name="radio" checked="checked" /><label for="radio2">Choice 2</label> + <input type="radio" id="radio3" name="radio" /><label for="radio3">Choice 3</label> + </div> + </form> + + + <!-- Tabs --> + <h2 class="demoHeaders">Tabs</h2> + <div id="tabs"> + <ul> + <li><a href="#tabs-1">First</a></li> + <li><a href="#tabs-2">Second</a></li> + <li><a href="#tabs-3">Third</a></li> + </ul> + <div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div> + <div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div> + <div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div> + </div> + + <!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller--> + <h2 class="demoHeaders">Dialog</h2> + <p><a href="#" id="dialog_link" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-newwin"></span>Open Dialog</a></p> + + + <h2 class="demoHeaders">Overlay and Shadow Classes <em>(not currently used in UI widgets)</em></h2> + <div style="position: relative; width: 96%; height: 200px; padding:1% 4%; overflow:hidden;" class="fakewindowcontain"> + <p>Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p> + + <!-- ui-dialog --> + <div class="ui-overlay"><div class="ui-widget-overlay"></div><div class="ui-widget-shadow ui-corner-all" style="width: 302px; height: 152px; position: absolute; left: 50px; top: 30px;"></div></div> + <div style="position: absolute; width: 280px; height: 130px;left: 50px; top: 30px; padding: 10px;" class="ui-widget ui-widget-content ui-corner-all"> + <div class="ui-dialog-content ui-widget-content" style="background: none; border: 0;"> + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> + </div> + </div> + + </div> + + + <!-- ui-dialog --> + <div id="dialog" title="Dialog Title"> + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> + </div> + + + + <h2 class="demoHeaders">Framework Icons (content color preview)</h2> + <ul id="icons" class="ui-widget ui-helper-clearfix"> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-n"><span class="ui-icon ui-icon-carat-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-ne"><span class="ui-icon ui-icon-carat-1-ne"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-e"><span class="ui-icon ui-icon-carat-1-e"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-se"><span class="ui-icon ui-icon-carat-1-se"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-s"><span class="ui-icon ui-icon-carat-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-sw"><span class="ui-icon ui-icon-carat-1-sw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-w"><span class="ui-icon ui-icon-carat-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-nw"><span class="ui-icon ui-icon-carat-1-nw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-n-s"><span class="ui-icon ui-icon-carat-2-n-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-e-w"><span class="ui-icon ui-icon-carat-2-e-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li> + + <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li> + <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li> + </ul> + + + <!-- Slider --> + <h2 class="demoHeaders">Slider</h2> + <div id="slider"></div> + + <!-- Datepicker --> + <h2 class="demoHeaders">Datepicker</h2> + <div id="datepicker"></div> + + <!-- Progressbar --> + <h2 class="demoHeaders">Progressbar</h2> + <div id="progressbar"></div> + + <!-- Highlight / Error --> + <h2 class="demoHeaders">Highlight / Error</h2> + <div class="ui-widget"> + <div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"> + <p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span> + <strong>Hey!</strong> Sample ui-state-highlight style.</p> + </div> + </div> + <br/> + <div class="ui-widget"> + <div class="ui-state-error ui-corner-all" style="padding: 0 .7em;"> + <p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span> + <strong>Alert:</strong> Sample ui-state-error style.</p> + </div> + </div> + + </body> +</html> + + diff --git a/fannie/src/jquery/interface.js b/fannie/src/jquery/interface.js new file mode 100644 index 000000000..817520d95 --- /dev/null +++ b/fannie/src/jquery/interface.js @@ -0,0 +1,8 @@ +/* + * Interface elements for jQuery - http://interface.eyecon.ro + * + * Copyright (c) 2006 Stefan Petre + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + */ + eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('6.16={3e:D(e){C x=0;C y=0;C 31=F;C 1j=e.18;k(6(e).H(\'1e\')==\'1k\'){3l=1j.2o;5e=1j.Q;1j.2o=\'3q\';1j.1e=\'3E\';1j.Q=\'2s\';31=12}C A=e;65(A){x+=A.56+(A.4c&&!6.2A.5Y?J(A.4c.6c)||0:0);y+=A.5i+(A.4c&&!6.2A.5Y?J(A.4c.6v)||0:0);A=A.7u}A=e;65(A&&A.4I&&A.4I.5l()!=\'1J\'){x-=A.4s||0;y-=A.3F||0;A=A.2S}k(31){1j.1e=\'1k\';1j.Q=5e;1j.2o=3l}E{x:x,y:y}},bl:D(A){C x=0,y=0;65(A){x+=A.56||0;y+=A.5i||0;A=A.7u}E{x:x,y:y}},2d:D(e){C w=6.H(e,\'Z\');C h=6.H(e,\'V\');C 1F=0;C 1y=0;C 1j=e.18;k(6(e).H(\'1e\')!=\'1k\'){1F=e.5A;1y=e.63}P{3l=1j.2o;5e=1j.Q;1j.2o=\'3q\';1j.1e=\'3E\';1j.Q=\'2s\';1F=e.5A;1y=e.63;1j.1e=\'1k\';1j.Q=5e;1j.2o=3l}E{w:w,h:h,1F:1F,1y:1y}},6O:D(A){E{1F:A.5A||0,1y:A.63||0}},8o:D(e){C h,w,3W;k(e){w=e.4E;h=e.4U}P{3W=17.2q;w=3t.6s||54.6s||(3W&&3W.4E)||17.1J.4E;h=3t.66||54.66||(3W&&3W.4U)||17.1J.4U}E{w:w,h:h}},7a:D(e){C t,l,w,h,4m,4q;k(e&&e.5J.5l()!=\'1J\'){t=e.3F;l=e.4s;w=e.68;h=e.6w;4m=0;4q=0}P{k(17.2q&&17.2q.3F){t=17.2q.3F;l=17.2q.4s;w=17.2q.68;h=17.2q.6w}P k(17.1J){t=17.1J.3F;l=17.1J.4s;w=17.1J.68;h=17.1J.6w}4m=54.6s||17.2q.4E||17.1J.4E||0;4q=54.66||17.2q.4U||17.1J.4U||0}E{t:t,l:l,w:w,h:h,4m:4m,4q:4q}},7W:D(e,4u){C A=6(e);C t=A.H(\'3D\')||\'\';C r=A.H(\'3G\')||\'\';C b=A.H(\'3H\')||\'\';C l=A.H(\'3I\')||\'\';k(4u)E{t:J(t)||0,r:J(r)||0,b:J(b)||0,l:J(l)};P E{t:t,r:r,b:b,l:l}},aY:D(e,4u){C A=6(e);C t=A.H(\'80\')||\'\';C r=A.H(\'81\')||\'\';C b=A.H(\'88\')||\'\';C l=A.H(\'87\')||\'\';k(4u)E{t:J(t)||0,r:J(r)||0,b:J(b)||0,l:J(l)};P E{t:t,r:r,b:b,l:l}},62:D(e,4u){C A=6(e);C t=A.H(\'6v\')||\'\';C r=A.H(\'86\')||\'\';C b=A.H(\'84\')||\'\';C l=A.H(\'6c\')||\'\';k(4u)E{t:J(t)||0,r:J(r)||0,b:J(b)||0,l:J(l)||0};P E{t:t,r:r,b:b,l:l}},30:D(3o){C x=3o.at||(3o.au+(17.2q.4s||17.1J.4s))||0;C y=3o.b4||(3o.bv+(17.2q.3F||17.1J.3F))||0;E{x:x,y:y}},6C:D(2u,6o){6o(2u);2u=2u.4M;65(2u){6.16.6C(2u,6o);2u=2u.bI}},bt:D(2u){6.16.6C(2u,D(A){1B(C 1N 1W A){k(25 A[1N]===\'D\'){A[1N]=Y}}})},9k:D(A,1u){C 2L=$.16.7a();C 6h=$.16.2d(A);k(!1u||1u==\'2e\')$(A).H({M:2L.t+((1t.2I(2L.h,2L.4q)-2L.t-6h.1y)/2)+\'14\'});k(!1u||1u==\'29\')$(A).H({L:2L.l+((1t.2I(2L.w,2L.4m)-2L.l-6h.1F)/2)+\'14\'})},ab:D(A,7D){C 89=$(\'82[@5W*="5L"]\',A||17),5L;89.1L(D(){5L=u.5W;u.5W=7D;u.18.69="90:8R.9e.bf(5W=\'"+5L+"\')"})}};[].7Z||(4S.9a.7Z=D(v,n){n=(n==Y)?0:n;C m=u.1Y;1B(C i=n;i<m;i++)k(u[i]==v)E i;E-1});6.6g=D(e){k(/^8Z$|^8V$|^8P$|^a0$|^a2$|^9X$|^a7$|^a8$|^9S$|^1J$|^9R$|^9B$|^9D$|^9z$|^9L$|^9H$|^9J$/i.4d(e.5J))E F;P E 12};6.O.9K=D(e,34){C c=e.4M;C 3n=c.18;3n.Q=34.Q;3n.3D=34.2M.t;3n.3I=34.2M.l;3n.3H=34.2M.b;3n.3G=34.2M.r;3n.M=34.M+\'14\';3n.L=34.L+\'14\';e.2S.7E(c,e);e.2S.9I(e)};6.O.9M=D(e){k(!6.6g(e))E F;C t=6(e);C 1j=e.18;C 31=F;C 1d={};1d.Q=t.H(\'Q\');k(t.H(\'1e\')==\'1k\'){3l=t.H(\'2o\');1j.2o=\'3q\';1j.1e=\'\';31=12}1d.1v=6.16.2d(e);1d.2M=6.16.7W(e);C 6d=e.4c?e.4c.7J:t.H(\'9O\');1d.M=J(t.H(\'M\'))||0;1d.L=J(t.H(\'L\'))||0;C 83=\'9N\'+J(1t.7o()*78);C 3P=17.9G(/^82$|^br$|^9x$|^9w$|^5c$|^9u$|^6r$|^9v$|^9A$|^9E$|^9C$|^a9$|^a6$|^aa$/i.4d(e.5J)?\'2Y\':e.5J);6.1N(3P,\'27\',83);3P.2E=\'af\';C 1U=3P.18;C M=0;C L=0;k(1d.Q==\'2i\'||1d.Q==\'2s\'){M=1d.M;L=1d.L}1U.1e=\'1k\';1U.M=M+\'14\';1U.L=L+\'14\';1U.Q=1d.Q!=\'2i\'&&1d.Q!=\'2s\'?\'2i\':1d.Q;1U.3m=\'3q\';1U.V=1d.1v.1y+\'14\';1U.Z=1d.1v.1F+\'14\';1U.3D=1d.2M.t;1U.3G=1d.2M.r;1U.3H=1d.2M.b;1U.3I=1d.2M.l;k(6.2A.4i){1U.7J=6d}P{1U.a5=6d}e.2S.7E(3P,e);1j.3D=\'2f\';1j.3G=\'2f\';1j.3H=\'2f\';1j.3I=\'2f\';1j.Q=\'2s\';1j.8f=\'1k\';1j.M=\'2f\';1j.L=\'2f\';k(31){1j.1e=\'1k\';1j.2o=3l}3P.9W(e);1U.1e=\'3E\';E{1d:1d,9T:6(3P)}};6.O.4N={9Y:[0,1m,1m],9Z:[7P,1m,1m],a3:[7M,7M,a1],9t:[0,0,0],9l:[0,0,1m],8T:[7F,42,42],92:[0,1m,1m],93:[0,0,4r],8X:[0,4r,4r],8W:[6b,6b,6b],8Y:[0,2W,0],8U:[8N,8M,7N],8L:[4r,0,4r],8O:[85,7N,47],91:[1m,7R,0],9s:[94,50,9j],9i:[4r,0,0],9n:[9r,9q,9p],9o:[9h,0,5M],9g:[1m,0,1m],99:[1m,98,0],97:[0,3O,0],95:[75,0,96],9b:[7P,7Q,7R],9c:[ae,ax,7Q],bk:[7K,1m,1m],bj:[7L,bi,7L],bh:[5M,5M,5M],bq:[1m,bp,bo],bn:[1m,1m,7K],ai:[0,1m,0],b8:[1m,0,1m],b7:[3O,0,0],b6:[0,0,3O],b5:[3O,3O,0],b9:[1m,7F,0],ba:[1m,5N,be],bd:[3O,0,3O],bb:[1m,0,0],bs:[5N,5N,5N],bK:[1m,1m,1m],bJ:[1m,1m,0]};6.O.3B=D(2v,7T){k(6.O.4N[2v])E{r:6.O.4N[2v][0],g:6.O.4N[2v][1],b:6.O.4N[2v][2]};P k(1K=/^46\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)$/.5P(2v))E{r:J(1K[1]),g:J(1K[2]),b:J(1K[3])};P k(1K=/46\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)$/.5P(2v))E{r:2g(1K[1])*2.55,g:2g(1K[2])*2.55,b:2g(1K[3])*2.55};P k(1K=/^#([a-4l-4o-9])([a-4l-4o-9])([a-4l-4o-9])$/.5P(2v))E{r:J("4g"+1K[1]+1K[1]),g:J("4g"+1K[2]+1K[2]),b:J("4g"+1K[3]+1K[3])};P k(1K=/^#([a-4l-4o-9]{2})([a-4l-4o-9]{2})([a-4l-4o-9]{2})$/.5P(2v))E{r:J("4g"+1K[1]),g:J("4g"+1K[2]),b:J("4g"+1K[3])};P E 7T==12?F:{r:1m,g:1m,b:1m}};6.O.7k={84:1,6c:1,86:1,6v:1,3y:1,bO:1,V:1,L:1,bF:1,bE:1,3H:1,3I:1,3G:1,3D:1,4W:1,5q:1,4T:1,57:1,1H:1,bx:1,bw:1,88:1,87:1,81:1,80:1,43:1,by:1,M:1,Z:1,2r:1};6.O.7g={bz:1,bD:1,bC:1,bB:1,bA:1,2v:1,b3:1};6.O.4X=[\'ay\',\'aw\',\'av\',\'az\'];6.O.6t={\'6z\':[\'4H\',\'7b\'],\'5y\':[\'4H\',\'6l\'],\'5G\':[\'5G\',\'\'],\'5z\':[\'5z\',\'\']};6.3v.1Q({8x:D(3a,1i,19,1r){E u.2j(D(){C 5H=6.1i(1i,19,1r);C e=1I 6.7i(u,5H,3a)})},6y:D(1i,1r){E u.2j(D(){C 5H=6.1i(1i,1r);C e=1I 6.6y(u,5H)})},58:D(2x){E u.1L(D(){k(u.3d)6.6n(u,2x)})},aE:D(2x){E u.1L(D(){k(u.3d)6.6n(u,2x);k(u.2j&&u.2j[\'O\'])u.2j.O=[]})}});6.1Q({6y:D(1l,R){C z=u,1O;z.2x=D(){k(6.7q(R.3z))R.3z.1A(1l)};z.4z=7t(D(){z.2x()},R.2C);1l.3d=z},19:{7h:D(p,n,7y,7X,2C){E((-1t.aC(p*1t.aB)/2)+0.5)*7X+7y}},7i:D(1l,R,3a){C z=u,1O;C y=1l.18;C 7v=6.H(1l,"3m");C 45=6.H(1l,"1e");C 1n={};z.5V=(1I 7z()).7A();R.19=R.19&&6.19[R.19]?R.19:\'7h\';z.5F=D(1s,24){k(6.O.7k[1s]){k(24==\'2t\'||24==\'2k\'||24==\'7m\'){k(!1l.3K)1l.3K={};C r=2g(6.3C(1l,1s));1l.3K[1s]=r&&r>-78?r:(2g(6.H(1l,1s))||0);24=24==\'7m\'?(45==\'1k\'?\'2t\':\'2k\'):24;R[24]=12;1n[1s]=24==\'2t\'?[0,1l.3K[1s]]:[1l.3K[1s],0];k(1s!=\'1H\')y[1s]=1n[1s][0]+(1s!=\'2r\'&&1s!=\'6p\'?\'14\':\'\');P 6.1N(y,"1H",1n[1s][0])}P{1n[1s]=[2g(6.3C(1l,1s)),2g(24)||0]}}P k(6.O.7g[1s])1n[1s]=[6.O.3B(6.3C(1l,1s)),6.O.3B(24)];P k(/^5G$|5z$|4H$|5y$|6z$/i.4d(1s)){C m=24.3c(/\\s+/g,\' \').3c(/46\\s*\\(\\s*/g,\'46(\').3c(/\\s*,\\s*/g,\',\').3c(/\\s*\\)/g,\')\').8C(/([^\\s]+)/g);2Z(1s){1a\'5G\':1a\'5z\':1a\'6z\':1a\'5y\':m[3]=m[3]||m[1]||m[0];m[2]=m[2]||m[0];m[1]=m[1]||m[0];1B(C i=0;i<6.O.4X.1Y;i++){C 3b=6.O.6t[1s][0]+6.O.4X[i]+6.O.6t[1s][1];1n[3b]=1s==\'5y\'?[6.O.3B(6.3C(1l,3b)),6.O.3B(m[i])]:[2g(6.3C(1l,3b)),2g(m[i])]}1p;1a\'4H\':1B(C i=0;i<m.1Y;i++){C 6k=2g(m[i]);C 5v=!an(6k)?\'7b\':(!/as|1k|3q|ar|aq|ap|aF|aG|aW|aV|aU/i.4d(m[i])?\'6l\':F);k(5v){1B(C j=0;j<6.O.4X.1Y;j++){3b=\'4H\'+6.O.4X[j]+5v;1n[3b]=5v==\'6l\'?[6.O.3B(6.3C(1l,3b)),6.O.3B(m[i])]:[2g(6.3C(1l,3b)),6k]}}P{y[\'b1\']=m[i]}}1p}}P{y[1s]=24}E F};1B(p 1W 3a){k(p==\'18\'){C 2Q=6.6m(3a[p]);1B(4b 1W 2Q){u.5F(4b,2Q[4b])}}P k(p==\'2E\'){k(17.5B)1B(C i=0;i<17.5B.1Y;i++){C 4a=17.5B[i].4a||17.5B[i].aR||Y;k(4a){1B(C j=0;j<4a.1Y;j++){k(4a[j].aK==\'.\'+3a[p]){C 4n=1I aJ(\'\\.\'+3a[p]+\' {\');C 3g=4a[j].18.aH;C 2Q=6.6m(3g.3c(4n,\'\').3c(/}/g,\'\'));1B(4b 1W 2Q){u.5F(4b,2Q[4b])}}}}}}P{u.5F(p,3a[p])}}y.1e=45==\'1k\'?\'3E\':45;y.3m=\'3q\';z.2x=D(){C t=(1I 7z()).7A();k(t>R.2C+z.5V){8G(z.4z);z.4z=Y;1B(p 1W 1n){k(p=="1H")6.1N(y,"1H",1n[p][1]);P k(25 1n[p][1]==\'6r\')y[p]=\'46(\'+1n[p][1].r+\',\'+1n[p][1].g+\',\'+1n[p][1].b+\')\';P y[p]=1n[p][1]+(p!=\'2r\'&&p!=\'6p\'?\'14\':\'\')}k(R.2k||R.2t)1B(C p 1W 1l.3K)k(p=="1H")6.1N(y,p,1l.3K[p]);P y[p]="";y.1e=R.2k?\'1k\':(45!=\'1k\'?45:\'3E\');y.3m=7v;1l.3d=Y;k(6.7q(R.3z))R.3z.1A(1l)}P{C n=t-u.5V;C 4B=n/R.2C;1B(p 1W 1n){k(25 1n[p][1]==\'6r\'){y[p]=\'46(\'+J(6.19[R.19](4B,n,1n[p][0].r,(1n[p][1].r-1n[p][0].r),R.2C))+\',\'+J(6.19[R.19](4B,n,1n[p][0].g,(1n[p][1].g-1n[p][0].g),R.2C))+\',\'+J(6.19[R.19](4B,n,1n[p][0].b,(1n[p][1].b-1n[p][0].b),R.2C))+\')\'}P{C 6u=6.19[R.19](4B,n,1n[p][0],(1n[p][1]-1n[p][0]),R.2C);k(p=="1H")6.1N(y,"1H",6u);P y[p]=6u+(p!=\'2r\'&&p!=\'6p\'?\'14\':\'\')}}}};z.4z=7t(D(){z.2x()},13);1l.3d=z},6n:D(1l,2x){k(2x)1l.3d.5V-=bQ;P{3t.8G(1l.3d.4z);1l.3d=Y;6.6A(1l,"O")}}});6.6m=D(3g){C 2Q={};k(25 3g==\'5h\'){3g=3g.5l().8I(\';\');1B(C i=0;i<3g.1Y;i++){4n=3g[i].8I(\':\');k(4n.1Y==2){2Q[6.8K(4n[0].3c(/\\-(\\w)/g,D(m,c){E c.aN()}))]=6.8K(4n[1])}}}E 2Q};6.G={1b:Y,q:Y,4e:D(){E u.1L(D(){k(u.5f){u.7.2H.26(\'2J\',6.G.77);u.7=Y;u.5f=F;k(6.2A.4i){u.6x="aL"}P{u.18.aI=\'\';u.18.8E=\'\';u.18.8g=\'\'}}})},77:D(e){k(6.G.q!=Y){6.G.5n(e);E F}C 8=u.1X;6(17).1S(\'2l\',6.G.6q).1S(\'4p\',6.G.5n);8.7.1c=6.16.30(e);8.7.2b=8.7.1c;8.7.5r=F;8.7.aS=u!=u.1X;6.G.q=8;k(8.7.2V&&u!=u.1X){6B=6.16.3e(8.2S);6j=6.16.2d(8);6D={x:J(6.H(8,\'L\'))||0,y:J(6.H(8,\'M\'))||0};W=8.7.2b.x-6B.x-6j.1F/2-6D.x;X=8.7.2b.y-6B.y-6j.1y/2-6D.y;6.1M.2F(8,[W,X])}E 6.aX||F},8v:D(e){C 8=6.G.q;8.7.5r=12;C 5m=8.18;8.7.4k=6.H(8,\'1e\');8.7.3s=6.H(8,\'Q\');k(!8.7.8l)8.7.8l=8.7.3s;8.7.1h={x:J(6.H(8,\'L\'))||0,y:J(6.H(8,\'M\'))||0};8.7.5j=0;8.7.5b=0;k(6.2A.4i){C 6a=6.16.62(8,12);8.7.5j=6a.l||0;8.7.5b=6a.t||0}8.7.11=6.1Q(6.16.3e(8),6.16.2d(8));k(8.7.3s!=\'2i\'&&8.7.3s!=\'2s\'){5m.Q=\'2i\'}6.G.1b.8p();C 2T=8.ao(12);6(2T).H({1e:\'3E\',L:\'2f\',M:\'2f\'});2T.18.3D=\'0\';2T.18.3G=\'0\';2T.18.3H=\'0\';2T.18.3I=\'0\';6.G.1b.4A(2T);C 21=6.G.1b.1g(0).18;k(8.7.6i){21.Z=\'8n\';21.V=\'8n\'}P{21.V=8.7.11.1y+\'14\';21.Z=8.7.11.1F+\'14\'}21.1e=\'3E\';21.3D=\'2f\';21.3G=\'2f\';21.3H=\'2f\';21.3I=\'2f\';6.1Q(8.7.11,6.16.2d(2T));k(8.7.1R){k(8.7.1R.L){8.7.1h.x+=8.7.1c.x-8.7.11.x-8.7.1R.L;8.7.11.x=8.7.1c.x-8.7.1R.L}k(8.7.1R.M){8.7.1h.y+=8.7.1c.y-8.7.11.y-8.7.1R.M;8.7.11.y=8.7.1c.y-8.7.1R.M}k(8.7.1R.43){8.7.1h.x+=8.7.1c.x-8.7.11.x-8.7.11.1y+8.7.1R.43;8.7.11.x=8.7.1c.x-8.7.11.1F+8.7.1R.43}k(8.7.1R.3y){8.7.1h.y+=8.7.1c.y-8.7.11.y-8.7.11.1y+8.7.1R.3y;8.7.11.y=8.7.1c.y-8.7.11.1y+8.7.1R.3y}}8.7.1x=8.7.1h.x;8.7.1z=8.7.1h.y;k(8.7.4L||8.7.1E==\'4R\'){4G=6.16.62(8.2S,12);8.7.11.x=8.56+(6.2A.4i?0:6.2A.5Y?-4G.l:4G.l);8.7.11.y=8.5i+(6.2A.4i?0:6.2A.5Y?-4G.t:4G.t);6(8.2S).4A(6.G.1b.1g(0))}k(8.7.1E){6.G.6J(8);8.7.2X.1E=6.G.6T}k(8.7.2V){6.1M.6V(8)}21.L=8.7.11.x-8.7.5j+\'14\';21.M=8.7.11.y-8.7.5b+\'14\';21.Z=8.7.11.1F+\'14\';21.V=8.7.11.1y+\'14\';6.G.q.7.5s=F;k(8.7.2N){8.7.2X.3k=6.G.6U}k(8.7.2r!=F){6.G.1b.H(\'2r\',8.7.2r)}k(8.7.1H){6.G.1b.H(\'1H\',8.7.1H);k(3t.5a){6.G.1b.H(\'69\',\'8A(1H=\'+8.7.1H*2W+\')\')}}k(8.7.3X){6.G.1b.5R(8.7.3X);6.G.1b.1g(0).4M.18.1e=\'1k\'}k(8.7.3i)8.7.3i.1A(8,[2T,8.7.1h.x,8.7.1h.y]);k(6.T&&6.T.4Y>0){6.T.8a(8)}k(8.7.4v==F){5m.1e=\'1k\'}E F},6J:D(8){k(8.7.1E.1D==73){k(8.7.1E==\'4R\'){8.7.1f=6.1Q({x:0,y:0},6.16.2d(8.2S));C 4Z=6.16.62(8.2S,12);8.7.1f.w=8.7.1f.1F-4Z.l-4Z.r;8.7.1f.h=8.7.1f.1y-4Z.t-4Z.b}P k(8.7.1E==\'17\'){C 6f=6.16.8o();8.7.1f={x:0,y:0,w:6f.w,h:6f.h}}}P k(8.7.1E.1D==4S){8.7.1f={x:J(8.7.1E[0])||0,y:J(8.7.1E[1])||0,w:J(8.7.1E[2])||0,h:J(8.7.1E[3])||0}}8.7.1f.W=8.7.1f.x-8.7.11.x;8.7.1f.X=8.7.1f.y-8.7.11.y},5o:D(q){k(q.7.4L||q.7.1E==\'4R\'){6(\'1J\',17).4A(6.G.1b.1g(0))}6.G.1b.8p().2k().H(\'1H\',1);k(3t.5a){6.G.1b.H(\'69\',\'8A(1H=2W)\')}},5n:D(e){6(17).26(\'2l\',6.G.6q).26(\'4p\',6.G.5n);k(6.G.q==Y){E}C q=6.G.q;6.G.q=Y;k(q.7.5r==F){E F}k(q.7.2y==12){6(q).H(\'Q\',q.7.3s)}C 5m=q.18;k(q.2V){6.G.1b.H(\'6Q\',\'4Q\')}k(q.7.3X){6.G.1b.5I(q.7.3X)}k(q.7.67==F){k(q.7.O>0){k(!q.7.1u||q.7.1u==\'29\'){C x=1I 6.O(q,{2C:q.7.O},\'L\');x.2w(q.7.1h.x,q.7.52)}k(!q.7.1u||q.7.1u==\'2e\'){C y=1I 6.O(q,{2C:q.7.O},\'M\');y.2w(q.7.1h.y,q.7.51)}}P{k(!q.7.1u||q.7.1u==\'29\')q.18.L=q.7.52+\'14\';k(!q.7.1u||q.7.1u==\'2e\')q.18.M=q.7.51+\'14\'}6.G.5o(q);k(q.7.4v==F){6(q).H(\'1e\',q.7.4k)}}P k(q.7.O>0){q.7.5s=12;C 3R=F;k(6.T&&6.1C&&q.7.2y){3R=6.16.3e(6.1C.1b.1g(0))}6.G.1b.8x({L:3R?3R.x:q.7.11.x,M:3R?3R.y:q.7.11.y},q.7.O,D(){q.7.5s=F;k(q.7.4v==F){q.18.1e=q.7.4k}6.G.5o(q)})}P{6.G.5o(q);k(q.7.4v==F){6(q).H(\'1e\',q.7.4k)}}k(6.T&&6.T.4Y>0){6.T.7Y(q)}k(6.1C&&q.7.2y){6.1C.bG(q)}k(q.7.1T&&(q.7.52!=q.7.1h.x||q.7.51!=q.7.1h.y)){q.7.1T.1A(q,q.7.71||[0,0,q.7.52,q.7.51])}k(q.7.3h)q.7.3h.1A(q);E F},6U:D(x,y,W,X){k(W!=0)W=J((W+(u.7.2N*W/1t.8r(W))/2)/u.7.2N)*u.7.2N;k(X!=0)X=J((X+(u.7.33*X/1t.8r(X))/2)/u.7.33)*u.7.33;E{W:W,X:X,x:0,y:0}},6T:D(x,y,W,X){W=1t.3A(1t.2I(W,u.7.1f.W),u.7.1f.w+u.7.1f.W-u.7.11.1F);X=1t.3A(1t.2I(X,u.7.1f.X),u.7.1f.h+u.7.1f.X-u.7.11.1y);E{W:W,X:X,x:0,y:0}},6q:D(e){k(6.G.q==Y||6.G.q.7.5s==12){E}C q=6.G.q;q.7.2b=6.16.30(e);k(q.7.5r==F){8u=1t.bg(1t.8t(q.7.1c.x-q.7.2b.x,2)+1t.8t(q.7.1c.y-q.7.2b.y,2));k(8u<q.7.5g){E}P{6.G.8v(e)}}C W=q.7.2b.x-q.7.1c.x;C X=q.7.2b.y-q.7.1c.y;1B(C i 1W q.7.2X){C 1P=q.7.2X[i].1A(q,[q.7.1h.x+W,q.7.1h.y+X,W,X]);k(1P&&1P.1D==5C){W=i!=\'3V\'?1P.W:(1P.x-q.7.1h.x);X=i!=\'3V\'?1P.X:(1P.y-q.7.1h.y)}}q.7.1x=q.7.11.x+W-q.7.5j;q.7.1z=q.7.11.y+X-q.7.5b;k(q.7.2V&&(q.7.1V||q.7.1T)){6.1M.1V(q,q.7.1x,q.7.1z)}k(q.7.3j)q.7.3j.1A(q,[q.7.1h.x+W,q.7.1h.y+X]);k(!q.7.1u||q.7.1u==\'29\'){q.7.52=q.7.1h.x+W;6.G.1b.1g(0).18.L=q.7.1x+\'14\'}k(!q.7.1u||q.7.1u==\'2e\'){q.7.51=q.7.1h.y+X;6.G.1b.1g(0).18.M=q.7.1z+\'14\'}k(6.T&&6.T.4Y>0){6.T.6N(q)}E F},2B:D(o){k(!6.G.1b){6(\'1J\',17).4A(\'<2Y 27="8y"></2Y>\');6.G.1b=6(\'#8y\');C A=6.G.1b.1g(0);C 2U=A.18;2U.Q=\'2s\';2U.1e=\'1k\';2U.6Q=\'4Q\';2U.8f=\'1k\';2U.3m=\'3q\';k(3t.5a){A.6x="8z"}P{2U.9V=\'1k\';2U.8g=\'1k\';2U.8E=\'1k\'}}k(!o){o={}}E u.1L(D(){k(u.5f||!6.16)E;k(3t.5a){u.9P=D(){E F};u.9Q=D(){E F}}C A=u;C 2H=o.2z?6(u).ah(o.2z):6(u);k(6.2A.4i){2H.1L(D(){u.6x="8z"})}P{2H.H(\'-8Q-3V-5c\',\'1k\');2H.H(\'3V-5c\',\'1k\');2H.H(\'-aD-3V-5c\',\'1k\')}u.7={2H:2H,67:o.67?12:F,4v:o.4v?12:F,2y:o.2y?o.2y:F,2V:o.2V?o.2V:F,4L:o.4L?o.4L:F,2r:o.2r?J(o.2r)||0:F,1H:o.1H?2g(o.1H):F,O:J(o.O)||Y,6e:o.6e?o.6e:F,2X:{},1c:{},3i:o.3i&&o.3i.1D==2G?o.3i:F,3h:o.3h&&o.3h.1D==2G?o.3h:F,1T:o.1T&&o.1T.1D==2G?o.1T:F,1u:/2e|29/.4d(o.1u)?o.1u:F,5g:o.5g?J(o.5g)||0:0,1R:o.1R?o.1R:F,6i:o.6i?12:F,3X:o.3X||F};k(o.2X&&o.2X.1D==2G)u.7.2X.3V=o.2X;k(o.3j&&o.3j.1D==2G)u.7.3j=o.3j;k(o.1E&&((o.1E.1D==73&&(o.1E==\'4R\'||o.1E==\'17\'))||(o.1E.1D==4S&&o.1E.1Y==4))){u.7.1E=o.1E}k(o.1G){u.7.1G=o.1G}k(o.3k){k(25 o.3k==\'bM\'){u.7.2N=J(o.3k)||1;u.7.33=J(o.3k)||1}P k(o.3k.1Y==2){u.7.2N=J(o.3k[0])||1;u.7.33=J(o.3k[1])||1}}k(o.1V&&o.1V.1D==2G){u.7.1V=o.1V}u.5f=12;2H.1L(D(){u.1X=A});2H.1S(\'2J\',6.G.77)})}};6.3v.1Q({7V:6.G.4e,5E:6.G.2B});6.B={S:Y,20:Y,q:Y,1c:Y,1v:Y,Q:Y,4h:D(e){6.B.q=(u.53)?u.53:u;6.B.1c=6.16.30(e);6.B.1v={Z:J(6(6.B.q).H(\'Z\'))||0,V:J(6(6.B.q).H(\'V\'))||0};6.B.Q={M:J(6(6.B.q).H(\'M\'))||0,L:J(6(6.B.q).H(\'L\'))||0};6(17).1S(\'2l\',6.B.79).1S(\'4p\',6.B.76);k(25 6.B.q.I.8H===\'D\'){6.B.q.I.8H.1A(6.B.q)}E F},76:D(e){6(17).26(\'2l\',6.B.79).26(\'4p\',6.B.76);k(25 6.B.q.I.8F===\'D\'){6.B.q.I.8F.1A(6.B.q)}6.B.q=Y},79:D(e){k(!6.B.q){E}1c=6.16.30(e);4j=6.B.Q.M-6.B.1c.y+1c.y;4f=6.B.Q.L-6.B.1c.x+1c.x;4j=1t.2I(1t.3A(4j,6.B.q.I.4D-6.B.1v.V),6.B.q.I.3S);4f=1t.2I(1t.3A(4f,6.B.q.I.4C-6.B.1v.Z),6.B.q.I.44);k(25 6.B.q.I.3j===\'D\'){C 4O=6.B.q.I.3j.1A(6.B.q,[4f,4j]);k(25 4O==\'aZ\'&&4O.1Y==2){4f=4O[0];4j=4O[1]}}6.B.q.18.M=4j+\'14\';6.B.q.18.L=4f+\'14\';E F},5O:D(e){6(17).1S(\'2l\',6.B.4Q).1S(\'4p\',6.B.58);6.B.S=u.S;6.B.20=u.20;6.B.1c=6.16.30(e);k(6.B.S.I.3i){6.B.S.I.3i.1A(6.B.S,[u])}6.B.1v={Z:J(6(u.S).H(\'Z\'))||0,V:J(6(u.S).H(\'V\'))||0};6.B.Q={M:J(6(u.S).H(\'M\'))||0,L:J(6(u.S).H(\'L\'))||0};E F},58:D(){6(17).26(\'2l\',6.B.4Q).26(\'4p\',6.B.58);k(6.B.S.I.3h){6.B.S.I.3h.1A(6.B.S,[6.B.20])}6.B.S=Y;6.B.20=Y},3x:D(W,59){E 1t.3A(1t.2I(6.B.1v.Z+W*59,6.B.S.I.57),6.B.S.I.5q)},3w:D(X,59){E 1t.3A(1t.2I(6.B.1v.V+X*59,6.B.S.I.4T),6.B.S.I.4W)},8k:D(V){E 1t.3A(1t.2I(V,6.B.S.I.4T),6.B.S.I.4W)},4Q:D(e){k(6.B.S==Y){E}1c=6.16.30(e);W=1c.x-6.B.1c.x;X=1c.y-6.B.1c.y;U={Z:6.B.1v.Z,V:6.B.1v.V};1o={M:6.B.Q.M,L:6.B.Q.L};2Z(6.B.20){1a\'e\':U.Z=6.B.3x(W,1);1p;1a\'8w\':U.Z=6.B.3x(W,1);U.V=6.B.3w(X,1);1p;1a\'w\':U.Z=6.B.3x(W,-1);1o.L=6.B.Q.L-U.Z+6.B.1v.Z;1p;1a\'5k\':U.Z=6.B.3x(W,-1);1o.L=6.B.Q.L-U.Z+6.B.1v.Z;U.V=6.B.3w(X,1);1p;1a\'3U\':U.V=6.B.3w(X,-1);1o.M=6.B.Q.M-U.V+6.B.1v.V;U.Z=6.B.3x(W,-1);1o.L=6.B.Q.L-U.Z+6.B.1v.Z;1p;1a\'n\':U.V=6.B.3w(X,-1);1o.M=6.B.Q.M-U.V+6.B.1v.V;1p;1a\'5p\':U.V=6.B.3w(X,-1);1o.M=6.B.Q.M-U.V+6.B.1v.V;U.Z=6.B.3x(W,1);1p;1a\'s\':U.V=6.B.3w(X,1);1p}k(6.B.S.I.2a){k(6.B.20==\'n\'||6.B.20==\'s\')28=U.V*6.B.S.I.2a;P 28=U.Z;2D=6.B.8k(28*6.B.S.I.2a);28=2D/6.B.S.I.2a;2Z(6.B.20){1a\'n\':1a\'3U\':1a\'5p\':1o.M+=U.V-2D;1p}2Z(6.B.20){1a\'3U\':1a\'w\':1a\'5k\':1o.L+=U.Z-28;1p}U.V=2D;U.Z=28}k(1o.M<6.B.S.I.3S){2D=U.V+1o.M-6.B.S.I.3S;1o.M=6.B.S.I.3S;k(6.B.S.I.2a){28=2D/6.B.S.I.2a;2Z(6.B.20){1a\'3U\':1a\'w\':1a\'5k\':1o.L+=U.Z-28;1p}U.Z=28}U.V=2D}k(1o.L<6.B.S.I.44){28=U.Z+1o.L-6.B.S.I.44;1o.L=6.B.S.I.44;k(6.B.S.I.2a){2D=28*6.B.S.I.2a;2Z(6.B.20){1a\'n\':1a\'3U\':1a\'5p\':1o.M+=U.V-2D;1p}U.V=2D}U.Z=28}k(1o.M+U.V>6.B.S.I.4D){U.V=6.B.S.I.4D-1o.M;k(6.B.S.I.2a){U.Z=U.V/6.B.S.I.2a}}k(1o.L+U.Z>6.B.S.I.4C){U.Z=6.B.S.I.4C-1o.L;k(6.B.S.I.2a){U.V=U.Z*6.B.S.I.2a}}C 3u=F;2K=6.B.S.18;2K.L=1o.L+\'14\';2K.M=1o.M+\'14\';2K.Z=U.Z+\'14\';2K.V=U.V+\'14\';k(6.B.S.I.8q){3u=6.B.S.I.8q.1A(6.B.S,[U,1o]);k(3u){k(3u.1v){6.1Q(U,3u.1v)}k(3u.Q){6.1Q(1o,3u.Q)}}}2K.L=1o.L+\'14\';2K.M=1o.M+\'14\';2K.Z=U.Z+\'14\';2K.V=U.V+\'14\';E F},2B:D(R){k(!R||!R.22||R.22.1D!=5C){E}E u.1L(D(){C A=u;A.I=R;A.I.57=R.57||10;A.I.4T=R.4T||10;A.I.5q=R.5q||4y;A.I.4W=R.4W||4y;A.I.3S=R.3S||-8s;A.I.44=R.44||-8s;A.I.4C=R.4C||4y;A.I.4D=R.4D||4y;6M=6(A).H(\'Q\');k(!(6M==\'2i\'||6M==\'2s\')){A.18.Q=\'2i\'}8B=/n|5p|e|8w|s|5k|w|3U/g;1B(i 1W A.I.22){k(i.5l().8C(8B)!=Y){k(A.I.22[i].1D==73){2z=6(A.I.22[i]);k(2z.4V()>0){A.I.22[i]=2z.1g(0)}}k(A.I.22[i].4I){A.I.22[i].S=A;A.I.22[i].20=i;6(A.I.22[i]).1S(\'2J\',6.B.5O)}}}k(A.I.2n){k(25 A.I.2n===\'5h\'){5t=6(A.I.2n);k(5t.4V()>0){5t.1L(D(){u.53=A});5t.1S(\'2J\',6.B.4h)}}P k(A.I.2n.4I){A.I.2n.53=A;6(A.I.2n).1S(\'2J\',6.B.4h)}P k(A.I.2n==12){6(u).1S(\'2J\',6.B.4h)}}})},4e:D(){E u.1L(D(){C A=u;1B(i 1W A.I.22){A.I.22[i].S=Y;A.I.22[i].20=Y;6(A.I.22[i]).26(\'2J\',6.B.5O)}k(A.I.2n){k(25 A.I.2n===\'5h\'){2z=6(A.I.2n);k(2z.4V()>0){2z.26(\'2J\',6.B.4h)}}P k(A.I.2n==12){6(u).26(\'2J\',6.B.4h)}}A.I=Y})}};6.3v.1Q({bu:6.B.2B,aA:6.B.4e});6.1M={6W:1,7n:D(1O){C 1O=1O;E u.1L(D(){u.2c.3M.1L(D(5U){6.1M.2F(u,1O[5U])})})},1g:D(){C 1O=[];u.1L(D(6H){k(u.6X){1O[6H]=[];C 8=u;C 1v=6.16.2d(u);u.2c.3M.1L(D(5U){C x=u.56;C y=u.5i;4x=J(x*2W/(1v.w-u.5A));4J=J(y*2W/(1v.h-u.63));1O[6H][5U]=[4x||0,4J||0,x||0,y||0]})}});E 1O},6V:D(8){8.7.8m=8.7.1f.w-8.7.11.1F;8.7.8D=8.7.1f.h-8.7.11.1y;k(8.5x.2c.70){5X=8.5x.2c.3M.1g(8.6Z+1);k(5X){8.7.1f.w=(J(6(5X).H(\'L\'))||0)+8.7.11.1F;8.7.1f.h=(J(6(5X).H(\'M\'))||0)+8.7.11.1y}5Z=8.5x.2c.3M.1g(8.6Z-1);k(5Z){C 6I=J(6(5Z).H(\'L\'))||0;C 6P=J(6(5Z).H(\'L\'))||0;8.7.1f.x+=6I;8.7.1f.y+=6P;8.7.1f.w-=6I;8.7.1f.h-=6P}}8.7.8e=8.7.1f.w-8.7.11.1F;8.7.8d=8.7.1f.h-8.7.11.1y;k(8.7.1G){8.7.2N=((8.7.1f.w-8.7.11.1F)/8.7.1G)||1;8.7.33=((8.7.1f.h-8.7.11.1y)/8.7.1G)||1;8.7.8b=8.7.8e/8.7.1G;8.7.8h=8.7.8d/8.7.1G}8.7.1f.W=8.7.1f.x-8.7.1h.x;8.7.1f.X=8.7.1f.y-8.7.1h.y;6.G.1b.H(\'6Q\',\'7e\')},1V:D(8,x,y){k(8.7.1G){8c=J(x/8.7.8b);4x=8c*2W/8.7.1G;8i=J(y/8.7.8h);4J=8i*2W/8.7.1G}P{4x=J(x*2W/8.7.8m);4J=J(y*2W/8.7.8D)}8.7.71=[4x||0,4J||0,x||0,y||0];k(8.7.1V)8.7.1V.1A(8,8.7.71)},7x:D(3o){8J=3o.aP||3o.aO||-1;2Z(8J){1a 35:6.1M.2F(u.1X,[61,61]);1p;1a 36:6.1M.2F(u.1X,[-61,-61]);1p;1a 37:6.1M.2F(u.1X,[-u.1X.7.2N||-1,0]);1p;1a 38:6.1M.2F(u.1X,[0,-u.1X.7.33||-1]);1p;1a 39:6.1M.2F(u.1X,[u.1X.7.2N||1,0]);1p;1a 40:6.G.2F(u.1X,[0,u.1X.7.33||1]);1p}},2F:D(8,Q){k(!8.7){E}8.7.11=6.1Q(6.16.3e(8),6.16.2d(8));8.7.1h={x:J(6.H(8,\'L\'))||0,y:J(6.H(8,\'M\'))||0};8.7.3s=6.H(8,\'Q\');k(8.7.3s!=\'2i\'&&8.7.3s!=\'2s\'){8.18.Q=\'2i\'}6.G.6J(8);6.1M.6V(8);W=J(Q[0])||0;X=J(Q[1])||0;1x=8.7.1h.x+W;1z=8.7.1h.y+X;k(8.7.1G){1P=6.G.6U.1A(8,[1x,1z,W,X]);k(1P.1D==5C){W=1P.W;X=1P.X}1x=8.7.1h.x+W;1z=8.7.1h.y+X}1P=6.G.6T.1A(8,[1x,1z,W,X]);k(1P&&1P.1D==5C){W=1P.W;X=1P.X}1x=8.7.1h.x+W;1z=8.7.1h.y+X;k(8.7.2V&&(8.7.1V||8.7.1T)){6.1M.1V(8,1x,1z)}1x=!8.7.1u||8.7.1u==\'29\'?1x:8.7.1h.x||0;1z=!8.7.1u||8.7.1u==\'2e\'?1z:8.7.1h.y||0;8.18.L=1x+\'14\';8.18.M=1z+\'14\'},2B:D(o){E u.1L(D(){k(u.6X==12||!o.5K||!6.16||!6.G||!6.T){E}2P=6(o.5K,u);k(2P.4V()==0){E}C 2h={1E:\'4R\',2V:12,1V:o.1V&&o.1V.1D==2G?o.1V:Y,1T:o.1T&&o.1T.1D==2G?o.1T:Y,2z:u,1H:o.1H||F};k(o.1G&&J(o.1G)){2h.1G=J(o.1G)||1;2h.1G=2h.1G>0?2h.1G:1}k(2P.4V()==1)2P.5E(2h);P{6(2P.1g(0)).5E(2h);2h.2z=Y;2P.5E(2h)}2P.aM(6.1M.7x);2P.1N(\'6W\',6.1M.6W++);u.6X=12;u.2c={};u.2c.7l=2h.7l;u.2c.1G=2h.1G;u.2c.3M=2P;u.2c.70=o.70?12:F;6Y=u;6Y.2c.3M.1L(D(7c){u.6Z=7c;u.5x=6Y});k(o.1O&&o.1O.1D==4S){1B(i=o.1O.1Y-1;i>=0;i--){k(o.1O[i].1D==4S&&o.1O[i].1Y==2){A=u.2c.3M.1g(i);k(A.4I){6.1M.2F(A,o.1O[i])}}}}})}};6.3v.1Q({aj:6.1M.2B,ak:6.1M.7n,al:6.1M.1g});6.T={7f:D(2O,2R,4t,4w){E 2O<=6.G.q.7.1x&&(2O+4t)>=(6.G.q.7.1x+6.G.q.7.11.w)&&2R<=6.G.q.7.1z&&(2R+4w)>=(6.G.q.7.1z+6.G.q.7.11.h)?12:F},7d:D(2O,2R,4t,4w){E!(2O>(6.G.q.7.1x+6.G.q.7.11.w)||(2O+4t)<6.G.q.7.1x||2R>(6.G.q.7.1z+6.G.q.7.11.h)||(2R+4w)<6.G.q.7.1z)?12:F},1c:D(2O,2R,4t,4w){E 2O<6.G.q.7.2b.x&&(2O+4t)>6.G.q.7.2b.x&&2R<6.G.q.7.2b.y&&(2R+4w)>6.G.q.7.2b.y?12:F},3Q:F,23:{},4Y:0,1Z:{},8a:D(8){k(6.G.q==Y){E}C i;6.T.23={};C 6K=F;1B(i 1W 6.T.1Z){k(6.T.1Z[i]!=Y){C K=6.T.1Z[i].1g(0);k(6(6.G.q).7S(\'.\'+K.N.a)){k(K.N.m==F){K.N.p=6.1Q(6.16.3e(K),6.16.6O(K));K.N.m=12}k(K.N.ac){6.T.1Z[i].5R(K.N.ac)}6.T.23[i]=6.T.1Z[i];k(6.1C&&K.N.s&&6.G.q.7.2y){K.N.A=6(\'.\'+K.N.a,K);8.18.1e=\'1k\';6.1C.7I(K);K.N.7r=6.1C.8j(6.1N(K,\'27\')).7s;8.18.1e=8.7.4k;6K=12}k(K.N.60){K.N.60.1A(6.T.1Z[i].1g(0),[6.G.q])}}}}k(6K){6.1C.5O()}},7G:D(){6.T.23={};1B(i 1W 6.T.1Z){k(6.T.1Z[i]!=Y){C K=6.T.1Z[i].1g(0);k(6(6.G.q).7S(\'.\'+K.N.a)){K.N.p=6.1Q(6.16.3e(K),6.16.6O(K));k(K.N.ac){6.T.1Z[i].5R(K.N.ac)}6.T.23[i]=6.T.1Z[i];k(6.1C&&K.N.s&&6.G.q.7.2y){K.N.A=6(\'.\'+K.N.a,K);8.18.1e=\'1k\';6.1C.7I(K);8.18.1e=8.7.4k}}}}},6N:D(e){k(6.G.q==Y){E}6.T.3Q=F;C i;C 72=F;C 7H=0;1B(i 1W 6.T.23){C K=6.T.23[i].1g(0);k(6.T.3Q==F&&6.T[K.N.t](K.N.p.x,K.N.p.y,K.N.p.1F,K.N.p.1y)){k(K.N.3N&&K.N.h==F){6.T.23[i].5R(K.N.3N)}k(K.N.h==F&&K.N.5T){72=12}K.N.h=12;6.T.3Q=K;k(6.1C&&K.N.s&&6.G.q.7.2y){6.1C.1b.1g(0).2E=K.N.7j;6.1C.6N(K)}7H++}P k(K.N.h==12){k(K.N.64){K.N.64.1A(K,[e,6.G.1b.1g(0).4M,K.N.O])}k(K.N.3N){6.T.23[i].5I(K.N.3N)}K.N.h=F}}k(6.1C&&!6.T.3Q&&6.G.q.2y){6.1C.1b.1g(0).18.1e=\'1k\'}k(72){6.T.3Q.N.5T.1A(6.T.3Q,[e,6.G.1b.1g(0).4M])}},7Y:D(e){C i;1B(i 1W 6.T.23){C K=6.T.23[i].1g(0);k(K.N.ac){6.T.23[i].5I(K.N.ac)}k(K.N.3N){6.T.23[i].5I(K.N.3N)}k(K.N.s){6.1C.7O[6.1C.7O.1Y]=i}k(K.N.5w&&K.N.h==12){K.N.h=F;K.N.5w.1A(K,[e,K.N.O])}K.N.m=F;K.N.h=F}6.T.23={}},4e:D(){E u.1L(D(){k(u.5d){k(u.N.s){27=6.1N(u,\'27\');6.1C.7C[27]=Y;6(\'.\'+u.N.a,u).7V()}6.T.1Z[\'d\'+u.74]=Y;u.5d=F;u.f=Y}})},2B:D(o){E u.1L(D(){k(u.5d==12||!o.5K||!6.16||!6.G){E}u.N={a:o.5K,ac:o.9d||F,3N:o.a4||F,7j:o.8S||F,5w:o.9f||o.5w||F,5T:o.5T||o.bH||F,64:o.64||o.bL||F,60:o.60||F,t:o.5u&&(o.5u==\'7f\'||o.5u==\'7d\')?o.5u:\'1c\',O:o.O?o.O:F,m:F,h:F};k(o.b0==12&&6.1C){27=6.1N(u,\'27\');6.1C.7C[27]=u.N.a;u.N.s=12;k(o.1T){u.N.1T=o.1T;u.N.7r=6.1C.8j(27).7s}}u.5d=12;u.74=J(1t.7o()*78);6.T.1Z[\'d\'+u.74]=6(u);6.T.4Y++})}};6.3v.1Q({9U:6.T.4e,bm:6.T.2B});6.bc=6.T.7G;6.1q={3J:Y,48:F,5D:Y,6L:D(e){6.1q.48=12;6.1q.2t(e,u,12)},6S:D(e){k(6.1q.3J!=u)E;6.1q.48=F;6.1q.2k(e,u)},2t:D(e,A,48){k(6.1q.3J!=Y)E;k(!A){A=u}6.1q.3J=A;2p=6.1Q(6.16.3e(A),6.16.2d(A));4K=6(A);3p=4K.1N(\'3p\');5Q=4K.1N(\'5Q\');k(3p){6.1q.5D=3p;4K.1N(\'3p\',\'\');6(\'#7p\').6F(3p);k(5Q)6(\'#6R\').6F(5Q.3c(\'bN://\',\'\'));P 6(\'#6R\').6F(\'\');1b=6(\'#4F\');k(A.2m.2E){1b.1g(0).2E=A.2m.2E}P{1b.1g(0).2E=\'\'}6E=6.16.2d(1b.1g(0));7U=48&&A.2m.Q==\'6G\'?\'3y\':A.2m.Q;2Z(7U){1a\'M\':1z=2p.y-6E.1y;1x=2p.x;1p;1a\'L\':1z=2p.y;1x=2p.x-6E.1F;1p;1a\'43\':1z=2p.y;1x=2p.x+2p.1F;1p;1a\'6G\':6(\'1J\').1S(\'2l\',6.1q.2l);1c=6.16.30(e);1z=1c.y+15;1x=1c.x+15;1p;7e:1z=2p.y+2p.1y;1x=2p.x;1p}1b.H({M:1z+\'14\',L:1x+\'14\'});k(A.2m.4P==F){1b.2t()}P{1b.aT(A.2m.4P)}k(A.2m.3Z)A.2m.3Z.1A(A);4K.1S(\'7B\',6.1q.2k).1S(\'7w\',6.1q.6S)}},2l:D(e){k(6.1q.3J==Y){6(\'1J\').26(\'2l\',6.1q.2l);E}1c=6.16.30(e);6(\'#4F\').H({M:1c.y+15+\'14\',L:1c.x+15+\'14\'})},2k:D(e,A){k(!A){A=u}k(6.1q.48!=12&&6.1q.3J==A){6.1q.3J=Y;6(\'#4F\').aQ(1);6(A).1N(\'3p\',6.1q.5D).26(\'7B\',6.1q.2k).26(\'7w\',6.1q.6S);k(A.2m.3Y)A.2m.3Y.1A(A);6.1q.5D=Y}},2B:D(R){k(!6.1q.1b){6(\'1J\').4A(\'<2Y 27="4F"><2Y 27="7p"></2Y><2Y 27="6R"></2Y></2Y>\');6(\'#4F\').H({Q:\'2s\',2r:4y,1e:\'1k\'});6.1q.1b=12}E u.1L(D(){k(6.1N(u,\'3p\')){u.2m={Q:/M|3y|L|43|6G/.4d(R.Q)?R.Q:\'3y\',2E:R.2E?R.2E:F,4P:R.4P?R.4P:F,3Z:R.3Z&&R.3Z.1D==2G?R.3Z:F,3Y:R.3Y&&R.3Y.1D==2G?R.3Y:F};C A=6(u);A.1S(\'bP\',6.1q.2t);A.1S(\'6L\',6.1q.6L)}})}};6.3v.9m=6.1q.2B;6.3v.1Q({ad:D(1i,1r,19){E u.2j(\'3r\',D(){1I 6.O.32(u,1i,1r,\'2e\',\'3L\',19)})},ag:D(1i,1r,19){E u.2j(\'3r\',D(){1I 6.O.32(u,1i,1r,\'29\',\'3L\',19)})},9F:D(1i,1r,19){E u.2j(\'3r\',D(){k(6.H(u,\'1e\')==\'1k\'){1I 6.O.32(u,1i,1r,\'29\',\'49\',19)}P{1I 6.O.32(u,1i,1r,\'29\',\'3L\',19)}})},9y:D(1i,1r,19){E u.2j(\'3r\',D(){k(6.H(u,\'1e\')==\'1k\'){1I 6.O.32(u,1i,1r,\'2e\',\'49\',19)}P{1I 6.O.32(u,1i,1r,\'2e\',\'3L\',19)}})},am:D(1i,1r,19){E u.2j(\'3r\',D(){1I 6.O.32(u,1i,1r,\'2e\',\'49\',19)})},b2:D(1i,1r,19){E u.2j(\'3r\',D(){1I 6.O.32(u,1i,1r,\'29\',\'49\',19)})}});6.O.32=D(e,1i,1r,5S,3f,19){k(!6.6g(e)){6.6A(e,\'3r\');E F}C z=u;C 31=F;z.A=6(e);z.19=25 1r==\'5h\'?1r:19||Y;z.1r=25 1r==\'D\'?1r:Y;z.3f=3f;z.1i=1i;z.1w=6.16.2d(e);z.1d={};z.1d.Q=z.A.H(\'Q\');z.1d.1e=z.A.H(\'1e\');k(z.1d.1e==\'1k\'){3l=z.A.H(\'2o\');z.A.2t();31=12}z.1d.M=z.A.H(\'M\');z.1d.L=z.A.H(\'L\');k(31){z.A.2k();z.A.H(\'2o\',3l)}z.1d.Z=z.1w.w+\'14\';z.1d.V=z.1w.h+\'14\';z.1d.3m=z.A.H(\'3m\');z.1w.M=J(z.1d.M)||0;z.1w.L=J(z.1d.L)||0;k(z.1d.Q!=\'2i\'&&z.1d.Q!=\'2s\'){z.A.H(\'Q\',\'2i\')}z.A.H(\'3m\',\'3q\').H(\'V\',3f==\'49\'&&5S==\'2e\'?1:z.1w.h+\'14\').H(\'Z\',3f==\'49\'&&5S==\'29\'?1:z.1w.w+\'14\');z.3z=D(){z.A.H(z.1d);k(z.3f==\'3L\')z.A.2k();P z.A.2t();6.6A(z.A.1g(0),\'3r\')};2Z(5S){1a\'2e\':z.3T=1I 6.O(z.A.1g(0),6.1i(1i-15,z.19,1r),\'V\');z.41=1I 6.O(z.A.1g(0),6.1i(z.1i,z.19,z.3z),\'M\');k(z.3f==\'3L\'){z.3T.2w(z.1w.h,0);z.41.2w(z.1w.M,z.1w.M+z.1w.h/2)}P{z.3T.2w(0,z.1w.h);z.41.2w(z.1w.M+z.1w.h/2,z.1w.M)}1p;1a\'29\':z.3T=1I 6.O(z.A.1g(0),6.1i(1i-15,z.19,1r),\'Z\');z.41=1I 6.O(z.A.1g(0),6.1i(z.1i,z.19,z.3z),\'L\');k(z.3f==\'3L\'){z.3T.2w(z.1w.w,0);z.41.2w(z.1w.L,z.1w.L+z.1w.w/2)}P{z.3T.2w(0,z.1w.w);z.41.2w(z.1w.L+z.1w.w/2,z.1w.L)}1p}};',62,735,'||||||jQuery|dragCfg|elm||||||||||||if||||||dragged||||this||||||el|iResize|var|function|return|false|iDrag|css|resizeOptions|parseInt|iEL|left|top|dropCfg|fx|else|position|options|resizeElement|iDrop|newSizes|height|dx|dy|null|width||oC|true||px||iUtil|document|style|easing|case|helper|pointer|oldStyle|display|cont|get|oR|speed|es|none|elem|255|props|newPosition|break|iTooltip|callback|tp|Math|axis|sizes|oldP|nx|hb|ny|apply|for|iSort|constructor|containment|wb|fractions|opacity|new|body|result|each|iSlider|attr|values|newCoords|extend|cursorAt|bind|onChange|wrs|onSlide|in|dragElem|length|zones|resizeDirection|dhs|handlers|highlighted|vp|typeof|unbind|id|nWidth|horizontally|ratio|currentPointer|slideCfg|getSize|vertically|0px|parseFloat|params|relative|queue|hide|mousemove|tooltipCFG|dragHandle|visibility|pos|documentElement|zIndex|absolute|show|nodeEl|color|custom|step|so|handle|browser|build|duration|nHeight|className|dragmoveBy|Function|dhe|max|mousedown|elS|clientScroll|margins|gx|zonex|toDrag|newStyles|zoney|parentNode|clonedEl|els|si|100|onDragModifier|div|switch|getPointer|restoreStyle|OpenClose|gy|old||||||prop|nmp|replace|animationHandler|getPosition|type|styles|onStop|onStart|onDrag|grid|oldVisibility|overflow|cs|event|title|hidden|interfaceFX|oP|window|newDimensions|fn|getHeight|getWidth|bottom|complete|min|parseColor|curCSS|marginTop|block|scrollTop|marginRight|marginBottom|marginLeft|current|orig|close|sliders|hc|128|wr|overzone|dh|minTop|eh|nw|user|de|frameClass|onHide|onShow||et||right|minLeft|oldDisplay|rgb||focused|open|cssRules|np|currentStyle|test|destroy|newLeft|0x|startDrag|msie|newTop|oD|fA|iw|rule|F0|mouseup|ih|139|scrollLeft|zonew|toInteger|ghosting|zoneh|xproc|3000|timer|append|pr|maxRight|maxBottom|clientWidth|tooltipHelper|parentBorders|border|tagName|yproc|jEl|insideParent|firstChild|namedColors|newPos|delay|move|parent|Array|minHeight|clientHeight|size|maxHeight|cssSides|count|contBorders||nRy|nRx|dragEl|self||offsetLeft|minWidth|stop|side|ActiveXObject|diffY|select|isDroppable|oldPosition|isDraggable|snapDistance|string|offsetTop|diffX|sw|toLowerCase|dEs|dragstop|hidehelper|ne|maxWidth|init|prot|handleEl|tolerance|sideEnd|onDrop|SliderContainer|borderColor|padding|offsetWidth|styleSheets|Object|oldTitle|Draggable|getValues|margin|opt|removeClass|nodeName|accept|png|211|192|start|exec|href|addClass|direction|onHover|key|startTime|src|next|opera|prev|onActivate|2000|getBorder|offsetHeight|onOut|while|innerHeight|revert|scrollWidth|filter|oldBorder|169|borderLeftWidth|oldFloat|hpc|clnt|fxCheckTag|windowSize|autoSize|sliderSize|floatVal|Color|parseStyle|stopAnim|func|fontWeight|dragmove|object|innerWidth|cssSidesEnd|pValue|borderTopWidth|scrollHeight|unselectable|pause|borderWidth|dequeue|parentPos|traverseDOM|sliderPos|helperSize|html|mouse|slider|prevLeft|getContainment|oneIsSortable|focus|elPosition|checkhover|getSizeLite|prevTop|cursor|tooltipURL|hidefocused|fitToContainer|snapToGrid|modifyContainer|tabindex|isSlider|sliderEl|SliderIteration|restricted|lastSi|applyOnHover|String|idsa||stopDrag|draginit|10000|moveDrag|getScroll|Width|nr|intersect|default|fit|colorCssProps|linear|fxe|shc|cssProps|onslide|toggle|set|random|tooltipTitle|isFunction|os|hash|setInterval|offsetParent|oldOverflow|blur|dragmoveByKey|firstNum|Date|getTime|mouseout|collected|emptyGIF|insertBefore|165|remeasure|hlt|measure|styleFloat|224|144|245|107|changed|240|230|140|is|notColor|filteredPosition|DraggableDestroy|getMargins|delta|checkdrop|indexOf|paddingTop|paddingRight|img|wid|borderBottomWidth||borderRightWidth|paddingLeft|paddingBottom|images|highlight|fracW|xfrac|maxy|maxx|listStyle|userSelect|fracH|yfrac|serialize|getHeightMinMax|initialPosition|containerMaxx|auto|getClient|empty|onResize|abs|1000|pow|distance|dragstart|se|animate|dragHelper|on|alpha|directions|match|containerMaxy|KhtmlUserSelect|onDragStop|clearInterval|onDragStart|split|pressedKey|trim|darkmagenta|183|189|darkolivegreen|tbody|moz|DXImageTransform|helperclass|brown|darkkhaki|td|darkgrey|darkcyan|darkgreen|tr|progid|darkorange|cyan|darkblue|153|indigo|130|green|215|gold|prototype|khaki|lightblue|activeclass|Microsoft|ondrop|fuchsia|148|darkred|204|centerEl|blue|ToolTip|darksalmon|darkviolet|122|150|233|darkorchid|black|textarea|iframe|hr|input|SwitchVertically|frameset|button|script|table|frame|form|SwitchHorizontally|createElement|optgroup|removeChild|meta|destroyWrapper|option|buildWrapper|w_|float|onselectstart|ondragstart|header|th|wrapper|DroppableDestroy|mozUserSelect|appendChild|tfoot|aqua|azure|caption|220|thead|beige|hoverclass|cssFloat|dl|col|colgroup|ul|ol|fixPNG||CloseVertically|173|fxWrapper|CloseHorizontally|find|lime|Slider|SliderSetValues|SliderGetValues|OpenVertically|isNaN|cloneNode|solid|dashed|dotted|transparent|pageX|clientX|Bottom|Right|216|Top|Left|ResizableDestroy|PI|cos|khtml|stopAll|double|groove|cssText|MozUserSelect|RegExp|selectorText|off|keydown|toUpperCase|keyCode|charCode|fadeOut|rules|fromHandler|fadeIn|outset|inset|ridge|selectKeyHelper|getPadding|array|sortable|borderStyle|OpenHorizontally|outlineColor|pageY|olive|navy|maroon|magenta|orange|pink|red|recallDroppables|purple|203|AlphaImageLoader|sqrt|lightgrey|238|lightgreen|lightcyan|getPositionLite|Droppable|lightyellow|193|182|lightpink||silver|purgeEvents|Resizable|clientY|outlineWidth|outlineOffset|textIndent|backgroundColor|borderTopColor|borderRightColor|borderLeftColor|borderBottomColor|lineHeight|letterSpacing|check|onhover|nextSibling|yellow|white|onout|number|http|fontSize|mouseover|100000000'.split('|'),0,{})) diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/COPYING.agpl-3.0.txt b/fannie/src/jquery/jQuery-SyntaxHighlighter/COPYING.agpl-3.0.txt new file mode 100644 index 000000000..dba13ed2d --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/COPYING.agpl-3.0.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +<http://www.gnu.org/licenses/>. diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/COPYING.txt b/fannie/src/jquery/jQuery-SyntaxHighlighter/COPYING.txt new file mode 100644 index 000000000..70b59b2e4 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/COPYING.txt @@ -0,0 +1,47 @@ +jQuery Syntax Highlighter +Copyright (C) 2010 Benjamin Arthur Lupton + +jQuery Syntax Highlighter is free software; You can redistribute it and/or modify it under the terms of +the GNU Affero General Public License version 3 as published by the Free Software Foundation. +You don't have to do anything special to accept the license and you don’t have to notify +anyone which that you have made that decision. + +jQuery Syntax Highlighter 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 your chosen license for more details. + +You should have received along with jQuery Syntax Highlighter: +- A copy of the license used. + If not, see <http://www.gnu.org/licenses/agpl-3.0.html>. +- A copy of our interpretation of the license used. + If not, see <http://github.com/balupton/jquery-syntaxhighligher/blob/master/COPYING.txt>. + +There is a strong belief within us that the license we have chosen provides not only the best solution for providing you with the essential freedom necessary to use jQuery Syntax Highlighter within your projects, but also for maintaining enough copyleft strength for us to feel confident and secure with releasing our hard work to the public. For your convenience we've included our own interpretation of the license we chose, which can be seen below. + +This is our interpretation of the GNU Affero General Public License version 3: (Quoted words are words in which there exists a definition within the license to avoid ambiguity.) + 1. You must always provide the source code, copyright and license information of jQuery Syntax Highlighter whenever you "convey" any part of jQuery Syntax Highlighter; + be it a verbatim copy or a modified copy. + 2. jQuery Syntax Highlighter was developed and has been provided for the purpose of functioning as a software library. + As such it has been developed without any sufficient knowledge about the inner workings of the works which it will be "aggregated" or "used" with. + As such it can not be considered a work which is "based on" or "derived" from the works which it will be "aggregated" or "used with", i.e. your work. + This provides the following implications: + a) You are free to use jQuery Syntax Highlighter in a work covered by the following licenses: + - GNU General Public License version 2 + - GNU Lesser General Public License version 2.1 + This is due to those licenses acknowledging that work which is not "based on" their work to fall under the a special "aggregate" use case. + This allows for jQuery Syntax Highlighter to act as an "aggregated" work and be covered by it's own licensing decisions + regardless of the license of the work jQuery Syntax Highlighter would be "aggregating" with. + You may find the relevant passages of those licenses which document this starting at: + - Line 129 of the GNU General Public License version 2 + - Line 206 of the GNU Lesser General Public License version 2.1 + b) If you have "modified", "adapted" or "extended" jQuery Syntax Highlighter then any of those modifications/extensions/adaptations which you have made + are indeed bound by this license; as you are using jQuery Syntax Highlighter under the definition of a "based on" work. + c) If you have not "modified", "adapted" or "extended" jQuery Syntax Highlighter then your work is not bound by this license; + as you are using jQuery Syntax Highlighter under the definition of an "aggregate" work. + +Our dearest hopes are that your own interpretation, values and goals for using our work freely and yet securely align with the license chosen as well as our interpretation of it. If you have any questions about the license chosen for jQuery Syntax Highlighter you can always email us directly at contact@balupton.com or you can get in contact with the license authors (the Free Software Foundation) at licensing@fsf.org to gain their opinion too. + +Alternatively you can provide feedback and acquire the support you need at our support forum. We'll definitely try and help you as soon as possible and to the best of our ability; we understand that user experience is everything, so we want to make you as happy as possible! So feel free to get in touch via our support forum and chat with other users of jQuery Syntax Highlighter here at: +http://getsatisfaction.com/balupton/products/balupton_jquery_syntax_highlighter + +Thanks, and we hope you enjoy using jQuery Syntax Highlighter and that it's everything you ever hoped it could be. \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/README.txt b/fannie/src/jquery/jQuery-SyntaxHighlighter/README.txt new file mode 100644 index 000000000..94bf39e96 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/README.txt @@ -0,0 +1,75 @@ +---- +/** + * This file is part of jQuery Syntax Highlighter + * Copyright (C) 2010 Benjamin Arthur Lupton + * http://www.balupton.com/projects/jquery-syntaxhighligher + * + * jQuery Syntax Highlighter is free software; You can redistribute it and/or modify it under the terms of + * the GNU Affero General Public License version 3 as published by the Free Software Foundation. + * You don't have to do anything special to accept the license and you don’t have to notify + * anyone which that you have made that decision. + * + * jQuery Syntax Highlighter 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 your chosen license for more details. + * + * You should have received along with jQuery Syntax Highlighter: + * - A copy of the license used. + * If not, see <http://www.gnu.org/licenses/agpl-3.0.html>. + * - A copy of our interpretation of the license used. + * If not, see <http://github.com/balupton/jquery-syntaxhighligher/blob/master/COPYING.txt>. + * + * @version 1.1.0-beta + * @date September 01, 2010 + * @since 0.1.0-dev, July 23, 2010 + * @category jquery-plugin + * @package jquery-syntaxhighligher {@link http://www.balupton/projects/jquery-syntaxhighligher} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + * @example Visit {@link http://www.balupton.com/projects/jquery-syntaxhighligher} for more information. + */ +---- + +Installation & Usage: +1. Refer to the (demo/index.html) or http://www.balupton.com/projects/jquery-syntaxhighligher if the demo is not included. + +Todo: +1. Fix known issues. + +Known Issues: +1. IE newlines are still busted in certain circumstances for CODE elements. In the meantime use PRE instead. + +---- + +Changelog: + +v1.1.0-beta, September 01, 2010 +- Changed defaultCssClass option to defaultClassname. +- Fixed issue with firefox sometimes not applying the properties to the rendered code, causing text overflow. +- We are now a bit more explicit with the css, this will help safari and opera render properly if stylesheets are still loading +- Increased the load delay so that highlight will run when themes should have loaded. +- Updated demo to use PRE elements instead. + +v1.0.1-beta, August 16, 2010 +- Now uses a local copy of prettify which contains a fix to only prettify something once. +- Fixed some issues with IE and newlines +- Set tab width to 4 instead of 8 +- IE does not have nice formatting for line numbers unfortunately so we have an alternate stylesheet + +v1.0.0-beta, August 16, 2010 +- Now uses Google's Prettify instead of Alex's Syntax Highlighter v3. There were just too many issues with Alex's and I couldn't fix them all. This fixes the IE error for all users. +- Added themes. +- Re-did nearly all the wording on the demo page to reflect the new syntax highlighter direction and features. + +v0.2.1-beta, August 15, 2010 +- Fixed an issue with IE and wraplines. + +v0.2.0-beta, July 28, 2010 +- Updated licensing information. Still using the same license, as it is the best there is, but just provided some more information on it to make life simpler. +- Fixed autoloading. + +v0.1.0-dev, July 23, 2010 +- Initial Release + +---- \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/closure.map b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/closure.map new file mode 100644 index 000000000..ac00359e2 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/closure.map @@ -0,0 +1,3430 @@ +/** Begin line maps. **/{ "file" : "./prettify/closure.map", "count": 33 } +[3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,13,13,13,13,13,13,13,12,12,12,15,15,15,15,15,15,15,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,17,17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16,16,16,18,18,18,18,19,19,19,22,22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21,23,23,23,23,23,23,23,23,24,25,25,27,27,27,27,28,28,29,29,29,29,29,29,29,29,29,29,28,31,31,31,31,31,31,31,31,31,31,30,30,30,30,30,30,30,30,30,30,28,35,35,35,35,35,35,35,35,35,35,34,34,34,34,34,34,34,34,34,34,33,33,33,33,33,33,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,38,38,38,40,40,41,43,43,44,44,42,45,45,45,45,45,45,48,48,48,48,48,48,48,47,47,47,47,47,47,47,47,47,47,49,49,49,49,49,49,49,49,50,51,51,53,53,53,53,53,53,54,54,54,55,55,55,55,55,55,55,56,56,56,26] +[-1,-1,-1,-1,-1,-1,-1,-1,-1,60,61,61,63,63,63,63,63,63,63,63,64,64,64,66,66,65,68,68,68,68,68,68,75,75,75,74,74,74,74,74,74,74,74,76,76,77,77,77,77,77,77,77,77,73,72,72,72,72,72,72,72,72,78,78,79,79,79,79,79,79,79,71,70,70,70,70,70,70,70,70,80,80,81,81,81,81,81,81,81,69,67,82,82,82,82,82,82,82,83,83,83,85,85,86,86,87,87,84,89,89,89,89,89,89,89,91,91,90,90,90,90,90,90,90,90,90,89,92,92,92,92,92,93,93,95,95,95,95,96,96,100,100,99,99,99,99,99,99,99,99,98,98,98,98,98,98,98,98,98,98,98,98,97,104,104,104,103,103,103,103,103,105,105,105,105,106,106,101,107,107,107,107,108,108,110,110,109,109,109,109,109,109,109,109,109,109,109,111,111,113,113,112,112,112,112,112,112,112,114,114,114,115,115,116,117,117,117,118,118,119,120,120,120,120,121,121,121,121,122,122,123,123,123,124,124,125,125,126,126,127,127,120,128,128,129,132,132,133,133,131,135,135,136,136,140,140,140,139,139,139,139,139,141,141,141,141,141,141,141,141,142,144,144,145,145,143,147,147,147,147,147,147,150,150,150,149,149,149,149,149,152,152,151,151,151,151,151,153,153,153,156,156,155,155,155,155,155,154,154,158,158,157,157,157,157,157,159,159,160,160,146,162,162,162,163,163,119,164,164,164,165,165,166,166,167,167,168,168,169,169,170,170,171,173,173,175,175,176,176,179,179,179,178,178,178,178,178,178,178,178,178,178,177,182,182,181,181,181,181,181,183,183,183,183,187,187,186,186,186,186,186,185,185,185,185,185,185,185,185,185,185,185,185,184,184,188,188,188,188,188,198,198,197,197,197,197,197,197,196,196,196,196,196,196,196,196,199,199,200,200,200,200,200,200,200,200,195,194,194,194,194,194,194,194,194,201,201,202,202,202,202,202,202,202,193,192,192,192,192,192,192,192,192,203,203,204,204,204,204,204,204,204,191,190,190,190,190,190,190,190,190,205,205,206,206,206,206,206,206,206,206,206,189,207,207,207,207,180,171,211,211,210,210,210,210,210,212,212,212,212,208] +[213,213,213,213,214,214,216,216,215,215,215,215,215,215,215,215,215,215,215,217,217,218,218,220,220,219,219,219,219,219,219,219,219,219,219,219,219,223,223,224,224,225,225,226,226,221,227,227,227,229,229,228,228,228,228,228,228,228,228,228,228,228,227,230,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,232,232,232,232,232,234,234,231,238,238,237,237,237,237,237,239,239,239,239,239,240,240,241,241,241,241,242,242,242,242,242,242,242,243,243,243,243,243,244,244,245,246,246,246,246,247,247,252,252,251,251,251,251,251,254,254,256,256,255,255,255,255,255,255,255,255,255,255,253,257,257,257,257,257,257,257,89,82,258,258,258,258,258,258,258,259,259,259,261,261,260,263,263,263,263,263,263,263,263,264,264,264,266,266,265,268,268,268,271,271,270,270,270,270,270,270,270,272,272,269,268,268,273,273,273,273,273,274,274,274,274,274,274,277,277,277,276,276,276,276,276,276,276,276,276,276,276,278,278,275,279,279,279,279,279,279,279,282,282,281,281,281,281,281,281,281,283,283,280,279,284,284,284,284,284,285,285,285,285,286,286,286,286,286,286,288,288,288,289,289,289,289,289,290,290,290,290,291,291,291,291,291,291,293,293,293,294,294,294,294,294,295,295,295,295,296,296,296,296,296,296,298,298,298,298,299,299,299,299,299,300,300,300,300,301,301,301,301,301,301,303,303,303,303,304,304,304,304,304,305,305,305,305,306,306,306,306,306,306,308,308,308,308,309,309,309,309,309,310,310,310,310,311,311,311,311,311,311,313,313,313,313,314,314,314,314,314,315,315,315,315,316,317,317,317,317,318,318,318,318,319,319,319,319,319,319,322,322,322,322,322,322,322,322,322,322,325,325,324,324,324,324,324,324,324,324,324,324,326,326,323,327,327,327,321,319,330,330,329,329,329,329,329,329,329,329,329,329,329,331,331,332,332,332,332,332,332,333,333,333,333,334,335,335,335,335,336,336,336,336,337,338,338,338,338,339,339,339,339,340,341,341,341,341,342,342,342,342,343,344,344,344,344,345,345,345,345,346,347,347,347,347,348,348,348,348,349,350,350,350,350,351,351,351,351,352,353,353,353,353,354,354,354,354,355,355,355,355,355,355,358,358,358,358,358,358,358,358,358,358,361,361,360,360,360,360,360,360,360,360,360,360,362,362,359] +[363,363,353,364,364,364,364,364,364,364,364,365,365,365,365,365,365,369,369,369,368,368,368,368,368,368,368,368,368,368,368,370,370,367,279,263,371,371,371,371,371,371,371,372,372,372,374,374,373,376,376,376,377,377,378,378,378,379,379,379,379,379,379,379,381,381,382,382,382,383,383,383,383,383,383,383,384,384,384,384,384,384,379,387,387,386,386,386,386,386,386,386,386,386,388,388,388,390,390,390,393,393,393,393,393,393,393,392,392,392,392,392,392,392,392,392,392,392,392,392,394,394,391,395,395,395,396,396,395,395,397,397,397,397,397,395,398,398,395,395,399,399,399,399,395,400,400,395,395,401,401,401,401,395,402,402,395,395,403,403,403,403,405,405,406,406,406,406,406,407,407,408,408,408,408,408,408,409,409,409,375,410,410,410,410,410,410,410,411,411,411,413,413,412,415,415,415,415,416,416,421,421,420,420,420,420,420,420,420,420,420,420,422,422,424,424,423,423,423,423,423,423,423,425,425,419,418,418,418,418,418,418,427,427,427,427,427,427,427,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,429,429,429,429,426,431,431,431,432,432,432,433,433,433,433,434,434,434,434,435,435,436,436,436,437,437,439,439,440,440,438,437,437,441,441,441,441,442,442,444,444,445,445,446,446,447,447,449,449,448,448,448,448,448,448,448,450,450,451,451,452,452,453,453,454,455,455,455,455,456,456,458,458,459,459,457,460,460,460,460,460,460,460,461,461,460,462,462,462,462,462,463,463,463,463,463,463,464,465,465,465,465,466,466,466,466,466,466,467,468,468,468,468,469,469,469,469,469,469,470,471,471,471,471,472,472,472,472,472,472,473,474,474,474,474,475,475,475,475,475,475,476,477,477,477,477,478,478,478,478,478,478,479,480,480,480,480,481,481,481,481,481,481,482,483,483,483,483,484,484,484,484,484,484,489,489,488,488,488,488,488,490,490,486] +[483,483,483,483,483,483,483,483,483,493,493,495,495,496,496,494,497,497,497,497,498,498,499,499,499,500,500,501,501,502,502,499,503,503,503,503,499,499,505,505,506,506,507,507,504,508,510,510,512,512,514,514,515,515,516,516,513,518,518,518,517,519,519,508,499,499,499,521,521,521,522,522,526,526,525,525,525,525,525,527,528,528,529,529,527,523,530,530,530,531,531,532,532,533,533,533,531,534,534,535,535,535,535,531,536,538,538,539,539,539,537,540,540,541,541,541,537,544,544,543,543,543,543,543,545,548,548,548,548,548,547,547,547,547,549,549,549,550,550,546,551,551,551,554,554,554,554,554,553,553,553,553,555,555,556,556,556,552,557,557,557,545,559,559,559,560,560,560,558,561,561,562,562,562,562,558,565,565,564,564,564,564,564,566,569,569,569,569,569,568,568,568,568,570,570,570,571,571,567,572,572,572,572,575,575,575,575,575,574,574,574,574,576,576,577,577,577,577,573,578,578,578,578,566,563,536,582,582,581,581,581,581,581,583,583,583,583,583,583,583,583,584,586,586,587,587,585,589,589,589,589,589,589,591,591,591,592,592,590,594,594,595,595,593,589,597,597,598,598,596,600,600,601,601,599,588,603,603,603,604,604,606,606,606,607,608,608,608,608,609,609,609,609,607,610,610,610,610,611,611,612,612,613,613,615,615,614,614,614,614,614,614,614,616,616,617,617,618,620,620,622,622,623,623,621,624,624,624,626,626,627,627,625,624,629,629,630,630,628,631,631,634,634,635,635,633,638,638,638,638,638,637,637,637,637,640,640,641,641,639,643,643,644,644,642,636,624,624,624,624,648,648,648,647,647,647,647,647,649,649,650,650,645,652,652,653,654,654,654,654,656,656,656,655,659,659,658,658,658,658,658,660,660,660,660,665,665,665,664,664,664,664,664,663,663,663,663,663,663,666,666,667,667,661,668,668,668,668,669,669,670,670,671,671,673,673,672,672,672,672,672,672,672,674,674,675,675,676,678,678,680,680,681,681,685,685,685,684,684,684,684,684,687,687,689,689,690,690,688,686,682,691,691,691,693,693,694,694,692,696,696,697,697,695,698,701,701,702,702,700,703,703,705,705,706,706,704,699,709,709,708,708,708,708,708,710,710,710,710,707] +[714,714,713,713,713,713,713,716,716,718,718,719,719,717,715,711,691,723,723,722,722,722,722,722,724,724,724,724,720,725,725,725,725,725,725,728,728,728,727,727,727,727,727,729,729,729,726,410,730,730,730,730,730,730,730,731,731,731,733,733,732,735,735,735,735,736,736,736,736,737,737,741,741,740,740,740,740,740,740,740,739,739,739,739,739,739,743,743,743,743,743,743,743,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,745,745,745,745,742,738,746,746,748,748,747,747,747,747,747,747,747,749,749,750,750,750,751,751,752,752,753,753,754,754,755,755,756,756,757,757,758,758,759,760,760,760,760,761,761,763,763,764,764,762,765,765,765,766,766,765,765,767,767,767,767,768,768,770,770,765,765,765,765,771,771,771,771,772,772,772,772,772,771,771,775,775,774,774,774,774,774,774,774,776,776,773,777,777,777,777,778,778,779,782,782,781,781,781,781,781,781,781,781,781,781,783,783,780,777,777,784,784,777,785,785,788,788,789,789,787,790,790,790,791,791,791,791,792,792,793,793,794,794,796,796,795,795,795,795,795,795,795,797,797,798,798,799,799,799,800,800,800,799,799,802,802,803,803,801,806,806,807,807,805,808,808,809,809,810,810,810,810,811,811,812,812,813,813,814,814,815,815,816,816,817,817,818,820,820,822,822,823,823,821,824,824,824,825,825,824,824,826,826,826,826,827,828,828,830,830,831,831,831,833,833,834,834,832,831,831,835,835,835,835,835,835,835,835,835,835,838,838,839,839,837,840,840,840,840,840,840,827,824,824,824,841,841,841,841,842,842,842,842,842] +[845,845,844,844,844,844,844,844,844,846,846,843,847,847,847,847,848,848,849,852,852,851,851,851,851,851,851,851,851,851,851,853,853,850,847,847,854,854,847,855,855,858,858,859,859,857,860,860,860,860,860,862,862,863,863,861,864,864,864,864,865,865,866,866,867,867,868,868,869,869,870,870,871,871,872,872,872,873,873,873,873,872,872,875,875,876,876,874,872,877,877,877,877,872,872,879,879,880,880,881,881,878,884,884,885,885,883,886,886,886,887,887,887,889,889,888,888,888,888,888,888,888,888,888,888,888,887,890,890,891,891,891,891,892,892,893,893,894,894,895,895,896,896,897,897,898,900,900,902,902,903,903,905,905,905,908,908,907,907,907,907,907,907,907,909,909,906,910,910,910,912,912,911,911,911,911,911,911,911,910,913,913,910,914,914,910,910,915,915,915,915,918,918,919,919,917,921,921,922,922,920,910,910,910,910,923,923,923,923,924,924,923,923,925,925,925,925,925,928,928,929,929,927,932,932,931,931,931,931,931,931,931,931,933,933,933,933,933,933,933,933,933,933,933,933,934,934,934,934,934,934,934,934,935,937,937,936,940,940,943,943,942,942,942,942,942,942,942,942,942,942,942,944,944,941,945,945,945,945,945,945,946,946,946,946,949,949,949,949,949,949,949,948,948,948,948,948,948,948,948,948,948,948,948,948,950,950,951,951,951,951,952,952,953,953,953,947,954,954,954,954,938,930,955,955,955,955,955,955,958,958,958,957,957,957,957,957,959,959,959,956,730,960,960,960,961,961,961,961,962,962,963,963,964,964,965,965,965,965,965,965,966,966,967,967,967,967,967,967,968,968,969,969,970,970,972,972,971,971,971,971,971,971,971,973,973,974,974,975,975,976,976,977,978,978,978,978,979,979,981,981,982,982,980,983,983,983,985,985,984,984,984,984,984,984,984,984,984,984,984,987,987,988,988,988,988,988,983,983,983,983,989,989,989,989,992,992,992,992,992,992,992,992,992,991,991,991,991,991,996,996,995,995,995,995,995,995,995,994,994,994,994,994,994,994,994,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997] +[998,998,998,993,990,999,1001,1001,1002,1002,1002,1002,1004,1004,1004,1005,1005,1005,1005,1005,1005,1006,1006,1006,1006,1006,1006,999,1007,1007,1007,1007,1008,1008,1009,1009,1010,1010,1010,1011,1011,1012,1012,1012,1012,1013,1013,1015,1015,1014,1014,1014,1014,1014,1014,1014,1016,1016,1017,1017,1018,1018,1019,1019,1020,1022,1022,1024,1024,1025,1025,1023,1026,1026,1026,1028,1028,1027,1027,1027,1027,1027,1027,1027,1026,1030,1030,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1031,1031,1031,1031,1031,1033,1033,1033,1033,1033,1033,1033,1034,1034,1034,1035,1035,1032,1039,1039,1038,1038,1038,1038,1038,1040,1040,1040,1040,1040,1040,1042,1042,1043,1043,1041,1044,1044,1044,1044,1036,1045,1045,1045,1045,1045,1045,1047,1047,1047,1047,1047,1047,1047,1047,1050,1050,1049,1049,1049,1049,1049,1051,1051,1051,1051,1048,1053,1053,1054,1054,1054,1054,1054,1055,1055,1055,1055,1046,258,1056,1056,1056,1056,1056,1056,1056,1057,1057,1057,1059,1059,1058,1061,1061,1061,1061,1062,1062,1063,1063,1064,1064,1064,1064,1064,1064,1065,1065,1065,1065,1065,1065,1065,1065,1065,1066,1068,1068,1067,1070,1070,1070,1070,1071,1071,1071,1071,1072,1072,1073,1073,1073,1073,1073,1074,1074,1075,1075,1076,1076,1077,1077,1078,1078,1080,1080,1079,1079,1079,1079,1079,1079,1079,1081,1081,1082,1082,1083,1083,1084,1084,1085,1085,1085,1085,1085,1085,1085,1088,1088,1087,1087,1087,1087,1087,1087,1087,1089,1089,1086,1085,1090,1090,1090,1090,1090,1091,1091,1091,1091,1091,1094,1094,1093,1093,1095,1095,1096,1096,1096,1100,1100,1100,1099,1099,1099,1099,1099,1103,1103,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1104,1104,1105,1105,1101,1107,1107,1107,1108,1108,1109,1109,1110,1110,1111,1111,1111,1111,1112,1112,1111,1113,1113,1114,1114,1111,1115,1115,1116,1116,1111,1117,1117,1117,1121,1121,1120,1120,1120,1120,1120,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1125,1125,1126,1126,1122,1128,1128,1128,1129,1129,1130,1130,1131,1131,1131,1131,1131,1131,1132,1132,1132,1132,1132,1133,1133,1133,1133,1133,1136,1136,1137,1137,1138,1138,1138,1138,1138,1138,1139,1139,1139,1139,1139,1139,1139,1139,1140,1140,1143,1143,1144,1144,1144,1145,1146,1146,1147,1147,1147,1147,1147,1147,1148,1148,1148,1152,1152,1151,1151,1151,1151,1151,1155,1155,1154,1154,1154,1154,1154,1154,1154,1154,1154,1154,1156,1156,1153,1157,1157,1157,1157,1157,1157,1157,1160,1160,1160,1159,1159,1159,1159,1159,1161,1161,1161,1158,1069,1060,1162,1162,1162,1162,1162,1162,1162,1163,1163,1163,1165,1165] +[1166,1166,1167,1167,1168,1168,1164,1170,1170,1170,1171,1171,1172,1174,1174,1175,1175,1175,1175,1175,1175,1175,1175,1176,1176,1175,1175,1175,1175,1175,1175,1175,1175,1177,1177,1180,1180,1180,1181,1181,1186,1186,1186,1185,1185,1185,1185,1185,1184,1184,1184,1184,1184,1184,1187,1187,1189,1189,1188,1188,1188,1188,1188,1188,1188,1188,1188,1188,1188,1188,1182,1172,1169,1190,1190,1190,1190,1190,1190,1190,1191,1191,1191,1193,1193,1194,1194,1192,1196,1196,1196,1196,1197,1197,1198,1198,1198,1199,1199,1202,1202,1202,1202,1202,1202,1202,1202,1202,1203,1204,1204,1206,1206,1206,1206,1207,1207,1207,1207,1208,1208,1211,1211,1210,1210,1210,1210,1210,1210,1210,1212,1212,1209,1213,1213,1214,1214,1214,1215,1215,1216,1216,1216,1217,1217,1218,1218,1219,1219,1221,1221,1220,1220,1220,1220,1220,1220,1220,1222,1222,1223,1223,1224,1224,1225,1225,1226,1227,1227,1227,1227,1228,1228,1230,1230,1231,1231,1229,1232,1232,1234,1234,1235,1235,1233,1236,1236,1236,1237,1237,1238,1238,1238,1238,1239,1239,1239,1239,1240,1240,1242,1242,1241,1241,1241,1241,1241,1241,1241,1243,1243,1244,1244,1238,1245,1245,1246,1249,1249,1252,1252,1251,1251,1251,1251,1251,1251,1251,1253,1253,1250,1248,1254,1254,1256,1256,1258,1258,1259,1259,1261,1261,1261,1262,1262,1262,1263,1263,1264,1264,1264,1265,1268,1268,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1267,1269,1269,1266,1270,1274,1274,1273,1273,1273,1273,1273,1275,1275,1278,1278,1278,1279,1279,1277,1280,1280,1280,1280,1280,1270,1284,1284,1283,1283,1283,1283,1283,1285,1285,1285,1285,1285,1285,1285,1285,1285,1285,1285,1285,1285,1285,1287,1287,1287,1289,1289,1290,1290,1288,1205,1202,1200,1200,1291,1291,1291,1291,1292,1292,1294,1294,1293,1293,1293,1293,1293,1293,1293,1295,1295,1296,1296,1296,1296,1296,1296,1296,1296,1297,1299,1299,1298,1301,1301,1301,1301,1302,1302,1302,1302,1303,1303,1305,1305,1304,1304,1304,1304,1304,1304,1304,1304,1306,1306,1307,1308,1308,1309,1309,1307,1310,1310,1311,1311,1312,1312,1316,1316,1315,1315,1315,1315,1315,1315,1315,1314,1314,1314,1314,1314,1314,1317,1317,1313,1312,1318,1318,1318,1319,1319,1320,1320,1320,1321,1321,1322,1322,1323,1323,1325,1325,1324,1324,1324,1324,1324,1324,1324,1326,1326,1327,1327,1328,1328,1329,1329,1330,1331,1331,1331,1331,1332,1332,1334,1334,1335,1335,1333,1336,1336,1338,1338,1339,1339,1337,1340,1340,1341,1341,1341,1341,1342,1342,1342,1343,1343,1344,1344,1344,1345,1345,1345,1345,1345,1345,1346,1346,1346,1344,1344,1347,1347,1347,1347,1347,1347,1347,1347,1347,1349,1349,1350,1350,1350,1350,1350,1350] +[1344,1344,1344,1344,1351,1352,1352,1352,1352,1353,1353,1355,1355,1358,1358,1357,1357,1357,1357,1357,1357,1357,1359,1359,1356,1354,1360,1360,1360,1361,1361,1362,1364,1364,1367,1367,1366,1366,1366,1366,1366,1366,1369,1369,1370,1370,1368,1372,1372,1372,1374,1374,1375,1375,1373,1362,1360,1360,1360,1376,1377,1377,1377,1377,1378,1378,1379,1379,1380,1380,1381,1381,1382,1382,1383,1383,1384,1386,1386,1388,1388,1389,1389,1387,1390,1390,1390,1391,1391,1394,1394,1393,1393,1393,1393,1393,1393,1396,1396,1397,1397,1395,1392,1398,1400,1400,1402,1402,1403,1403,1401,1404,1404,1404,1404,1404,1404,1398,1406,1406,1405,1405,1407,1407,1408,1408,1405,1376,1409,1409,1409,1410,1410,1412,1412,1411,1411,1411,1411,1411,1411,1411,1409,1413,1413,1409,1414,1414,1414,1414,1414,1414,1414,1414,1409,1409,1417,1417,1416,1416,1416,1416,1416,1416,1416,1416,1416,1416,1418,1418,1419,1419,1415,1409,1409,1420,1420,1421,1421,1420,1422,1422,1422,1422,1422,1422,1424,1424,1424,1425,1425,1423,1420,1420,1426,1426,1426,1426,1426,1426,1426,1426,1426,1420,1427,1429,1429,1430,1430,1430,1430,1430,1432,1432,1432,1433,1433,1435,1435,1434,1434,1437,1437,1438,1438,1436,1439,1439,1434,1441,1441,1442,1442,1444,1444,1443,1446,1446,1445,1445,1445,1445,1445,1445,1445,1447,1447,1447,1448,1448,1449,1451,1451,1453,1453,1454,1454,1452,1455,1455,1455,1455,1456,1456,1459,1459,1458,1458,1458,1458,1458,1458,1458,1458,1460,1460,1457,1461,1461,1462,1462,1464,1464,1463,1463,1463,1463,1463,1463,1463,1465,1465,1465,1467,1467,1468,1468,1466,1469,1471,1471,1473,1473,1472,1472,1472,1472,1472,1472,1472,1476,1476,1477,1477,1475,1474,1474,1474,1474,1474,1474,1479,1479,1479,1480,1480,1482,1482,1481,1481,1481,1481,1481,1481,1481,1484,1484,1487,1487,1486,1486,1486,1486,1486,1486,1486,1486,1486,1486,1488,1488,1491,1491,1491,1492,1492,1493,1493,1496,1496,1495,1495,1495,1495,1495,1495,1495,1495,1495,1495,1497,1497,1498,1498,1494,1499,1499,1500,1500,1503,1503,1503,1504,1504,1505,1505,1506,1506,1507,1507,1509,1509,1510,1510,1511,1511,1508,1512,1512,1515,1515,1515,1516,1516,1517,1517,1518,1518,1521,1521,1520,1520,1520,1520,1520,1520,1520,1520,1520,1520,1522,1522,1519,1523,1523,1524,1524,1513,1449,1447,1447,1447,1528,1528,1528,1527,1527,1527,1527,1527,1529,1529,1530,1530,1531,1531,1525,1534,1534,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1535,1535,1536,1536,1536,1536,1536,1536,1536,1537,1537,1537,1190,1538,1538,1538,1538,1538,1538,1538,1539,1539,1539,1541,1541,1540,1542,1542,1542,1542,1543,1543,1544,1544,1544,1545,1545,1546,1546,1546] +[1547,1547,1547,1549,1549,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,1553,1553,1552,1552,1552,1552,1552,1554,1555,1555,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1556,1557,1557,1557,1557,1557,1558,1558,1558,1558,1558,1558,1554,1550,1547,1547,1547,1547,1562,1562,1562,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1561,1565,1565,1564,1564,1564,1564,1564,1566,1567,1567,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1568,1569,1569,1569,1569,1569,1570,1570,1570,1570,1570,1570,1570,1566,1563,1573,1573,1572,1572,1572,1572,1572,1574,1575,1575,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1576,1577,1577,1577,1577,1577,1578,1578,1578,1578,1578,1578,1574,1581,1581,1581,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1580,1579,1584,1584,1583,1583,1583,1583,1583,1585,1586,1586] +[1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1587,1588,1588,1588,1588,1588,1585,1579,1589,1589,1589,1591,1591,1590,1590,1590,1590,1590,1590,1590,1590,1590,1590,1590,1590,1590,1592,1592,1592,1594,1594,1593,1593,1593,1593,1593,1593,1593,1593,1593,1593,1593,1593,1593,1593,1593,1595,1599,1599,1598,1598,1598,1598,1598,1600,1601,1601,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1602,1603,1603,1603,1603,1603,1604,1604,1604,1604,1600,1608,1608,1608,1607,1607,1607,1607,1607,1609,1610,1610,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1611,1612,1612,1612,1612,1612,1609,1605,1595,1592,1592,1592,1616,1616,1616,1615,1615,1615,1615,1615,1617,1618,1618,1619,1619,1619,1619,1619,1619,1619,1619,1619,1619,1619,1619,1619,1620,1620,1620,1620,1620,1621,1621,1621,1621,1617,1613,1622,1622,1622,1624,1624,1623,1623,1623,1623,1623,1623,1623,1623,1623,1623,1623,1623,1623,1623,1623,1625,1629,1629,1628,1628,1628,1628,1628,1630,1631,1631,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1632,1633,1633,1633,1633,1633,1630,1637,1637,1637,1636,1636,1636,1636,1636,1638,1639,1639,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1640,1641,1641,1641,1641,1641,1638,1634,1644,1644,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1642,1647,1647,1646,1646,1646,1646,1646,1648,1649,1649,1649,1649,1649,1649,1649,1649,1649,1649,1649,1649,1649,1651,1651,1651,1651,1651,1651,1651,1652,1652,1652,1652,1653,1653,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1654,1650,1648,1645] +[1656,1656,1660,1660,1659,1659,1659,1659,1659,1659,1659,1659,1659,1658,1658,1658,1658,1658,1658,1658,1658,1661,1661,1661,1661,1661,1661,1661,1661,1661,1661,1661,1661,1661,1662,1662,1662,1665,1665,1665,1664,1664,1664,1664,1664,1664,1664,1663,1668,1668,1667,1667,1667,1667,1667,1669,1670,1670,1672,1672,1672,1672,1672,1672,1672,1673,1673,1673,1673,1673,1673,1673,1676,1676,1675,1675,1675,1675,1675,1675,1675,1675,1677,1677,1677,1677,1677,1677,1677,1678,1678,1678,1678,1674,1679,1679,1679,1679,1679,1679,1679,1671,1680,1680,1680,1680,1680,1669,1684,1684,1684,1683,1683,1683,1683,1683,1685,1686,1686,1687,1687,1687,1687,1687,1687,1687,1688,1688,1688,1688,1688,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1689,1685,1693,1693,1693,1692,1692,1692,1692,1692,1694,1695,1695,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1697,1697,1697,1697,1697,1694,1698,1699,1699,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1700,1701,1701,1701,1701,1701,1698,1702,1703,1703,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1705,1705,1705,1705,1705,1702,1706,1707,1707,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1708,1709,1709,1709,1709,1709,1710,1710,1710,1710,1710,1710,1710,1710,1710,1710,1710,1710,1710,1706,1711,1712,1712,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1713,1714,1714,1714,1714,1714,1711,1715,1715,1715,1715,1715,1715,1715,1717,1717,1717,1718,1718,1719,1719,1716,1538,1720,1720,1720,1720,1720,1720,1720,1721,1721,1721,1723,1723,1722,1725,1725,1725,1725,1725,1725,1725,1725,1726,1726,1726,1728,1728,1727,1730,1730,1730,1731,1731,1732,1732,1733,1734,1734,1734,1735,1735,1734,1736,1736,1734,1734,1737,1737,1738,1742,1742,1741,1741,1741,1741,1741,1743,1743,1743,1743,1743,1743,1743,1743,1743,1743,1745,1745,1745,1746,1746,1746,1746,1746,1738,1747,1747,1748,1749,1749,1747,1750,1750,1751,1753,1753,1754,1754] +[1758,1758,1757,1757,1757,1757,1757,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1759,1760,1760,1761,1761,1761,1761,1761,1755,1747,1762,1762,1762,1763,1763,1767,1767,1769,1769,1772,1772,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1773,1773,1774,1774,1770,1768,1766,1765,1765,1765,1765,1765,1765,1765,1765,1776,1776,1777,1777,1778,1778,1779,1779,1779,1779,1779,1779,1779,1779,1779,1779,1779,1781,1781,1781,1784,1784,1783,1783,1783,1783,1783,1785,1785,1789,1789,1789,1788,1788,1788,1788,1788,1792,1792,1791,1791,1791,1791,1791,1791,1791,1791,1793,1793,1794,1794,1790,1796,1796,1796,1797,1797,1730,1725,1798,1798,1798,1799,1799,1801,1801,1800,1800,1800,1800,1800,1800,1800,1802,1802,1804,1804,1803,1803,1803,1803,1803,1803,1803,1803,1803,1803,1803,1803,1803,1803,1805,1805,1807,1807,1806,1806,1806,1806,1806,1806,1806,1806,1806,1806,1806,1806,1808,1808,1809,1809,1809,1810,1810,1811,1811,1812,1812,1813,1813,1813,1813,1813,1814,1814,1815,1815,1815,1815,1815,1816,1816,1817,1817,1818,1818,1819,1819,1820,1820,1822,1822,1824,1824,1824,1824,1824,1824,1824,1823,1823,1823,1823,1823,1823,1823,1823,1823,1823,1823,1823,1823,1821,1825,1825,1826,1826,1826,1826,1826,1826,1826,1826,1826,1826,1826,1826,1826,1826,1827,1827,1828,1828,1828,1828,1828,1828,1828,1828,1828,1828,1828,1829,1829,1830,1830,1830,1830,1830,1830,1830,1830,1830,1830,1830,1830,1831,1831,1832,1832,1832,1832,1832,1832,1832,1832,1832,1832,1832,1833,1833,1834,1834,1834,1834,1834,1835,1835,1838,1838,1838,1838,1838,1838,1838,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,1836,1840,1840,1840,1842,1842,1846,1846,1845,1845,1845,1845,1845,1845,1845,1845,1845,1845,1845,1844,1844,1844,1844,1844,1844,1844,1844,1843,1843,1847,1847,1847,1847,1847,1847,1849,1849,1848,1848,1850,1850,1851,1851,1851,1851,1851,1851,1851,1851,1851,1851,1851,1851,1851,1853,1853,1852,1852,1854,1854,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1856,1856,1856,1856,1856,1856,1856,1856,1856,1856,1856,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1858,1858,1858,1858,1858,1858,1858,1858,1858,1859,1859,1859,1859,1860,1860,1865,1865,1864,1864,1864,1864,1864,1864,1864,1864,1864,1864,1864,1863,1863,1863,1863,1863,1863,1863,1863,1863,1863,1862,1862,1862,1862,1862,1862,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1861,1867,1867,1868,1868,1868,1869,1869] +[1873,1873,1873,1875,1875,1876,1876,1877,1877,1878,1878,1878,1879,1879,1880,1880,1883,1883,1884,1884,1882,1885,1885,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1886,1887,1887,1888,1888,1888,1888,1888,1889,1889,1889,1889,1890,1890,1893,1893,1894,1894,1892,1891,1897,1897,1898,1898,1896,1895,1895,1895,1895,1895,1895,1895,1900,1900,1901,1901,1899,1902,1902,1903,1903,1907,1907,1906,1906,1906,1906,1906,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1908,1909,1909,1910,1910,1910,1911,1911,1911,1911,1913,1913,1913,1912,1916,1916,1915,1915,1915,1915,1915,1917,1917,1917,1917,1917,1917,1917,1917,1917,1917,1917,1918,1918,1919,1919,1920,1920,1920,1920,1924,1924,1924,1923,1923,1923,1923,1923,1925,1925,1925,1925,1927,1927,1927,1928,1928,1928,1928,1928,1928,1928,1928,1929,1930,1930,1932,1932,1932,1932,1933,1933,1935,1935,1936,1936,1937,1937,1938,1938,1938,1934,1939,1939,1939,1939,1939,1939,1941,1941,1941,1942,1942,1942,1942,1942,1942,1942,1942,1942,1942,1943,1943,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1944,1945,1945,1946,1946,1946,1946,1946,1947,1947,1931,1870,1868,1868,1868,1949,1949,1949,1950,1950,1951,1951,1951,1951,1952,1953,1954,1955,1955,1955,1957,1957,1959,1959,1958,1958,1958,1958,1958,1958,1958,1961,1961,1963,1963,1962,1962,1962,1962,1962,1962,1962,1965,1965,1966,1966,1964,1960,1968,1968,1969,1969,1967,1970,1970,1970,1970,1970,1971,1971,1971,1971,1971,1971,1972,1975,1975,1977,1977,1978,1978,1976,1973,1979,1979,1979,1980,1980,1981,1985,1985,1984,1984,1984,1984,1984,1986,1986,1986,1986,1986,1986,1986,1986,1986,1986,1988,1988,1988,1989,1989,1989,1989,1989,1993,1993,1992,1992,1992,1992,1992,1995,1995,1996,1996,1997,1997,1994,1999,1999,1999,1998,2000,2000,1972,1955,1955,1955,2001,2001,2001,2001,2002,2002,2004,2004,2003,2003,2003,2003,2003,2003,2003,2005,2008,2008,2010,2010,2011,2011,2009,2013,2013,2013,2015,2015,2016,2016,2017,2017,2019,2019,2019,2018,2020,2020,2005,2001,2001,2001,2021,2021,2021,2021,2021,2021,2024,2024,2024,2026,2026,2025,2025,2025,2025,2025,2025,2025,2028,2028,2028,2027,2031,2031,2030,2030,2030,2030,2030,2032,2032,2032,2032,2032,2032,2032,2032,2032,2032,2034,2034,2034,2033,2037,2037,2036,2036,2036,2036,2036,2038,2038,2038,2038,2038,2038,2038,2038,2038,2038,2038,2038,2038,2041,2041,2041,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040,2040] +[2044,2044,2043,2043,2043,2043,2043,2045,2045,2045,2039,1720,2046,2046,2046,2046,2046,2046,2046,2047,2047,2047,2049,2049,2050,2050,2048,2052,2052,2052,2052,2053,2053,2053,2053,2054,2054,2056,2056,2055,2055,2055,2055,2055,2055,2055,2057,2057,2058,2058,2052,2059,2059,2060,2061,2062,2062,2062,2062,2063,2063,2065,2065,2066,2066,2064,2067,2067,2067,2070,2070,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2071,2071,2068,2073,2073,2073,2073,2073,2073,2073,2073,2073,2073,2072,2074,2074,2074,2074,2074,2074,2074,2074,2072,2077,2077,2077,2077,2077,2077,2077,2077,2076,2076,2076,2076,2076,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2078,2079,2079,2075,2067,2067,2067,2067,2082,2082,2082,2083,2083,2081,2084,2084,2061,2085,2085,2085,2085,2085,2085,2085,2085,2086,2086,2086,2088,2088,2089,2089,2087,2092,2092,2091,2095,2095,2094,2094,2094,2094,2094,2094,2094,2094,2094,2094,2094,2094,2094,2094,2094,2096,2096,2093,2091,2091,2097,2097,2101,2101,2101,2101,2101,2101,2101,2101,2100,2100,2100,2100,2100,2102,2102,2099,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2103,2104,2104,2104,2104,2104,2104,2104,2104,2104,2104,2104,2104,2104,2104,2104,2105,2105,2105,2105,2105,2105,2105,2107,2107,2107,2108,2108,2106,2090,2109,2109,2109,2109,2109,2109,2109,2110,2110,2110,2112,2112,2111,2114,2114,2114,2114,2115,2115,2117,2117,2116,2116,2116,2116,2116,2116,2116,2116,2116,2116,2116,2116,2116,2116,2116,2118,2118,2120,2120,2119,2119,2119,2119,2119,2119,2119,2119,2119,2119,2119,2119,2119,2123,2123,2123,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2122,2124,2124,2125,2125,2125,2126,2127,2127,2127,2127,2128,2128,2129,2129,2132,2132,2131,2131,2131,2131,2131,2131,2133,2133,2133,2135,2135,2135,2136,2136,2136,2137,2137,2137,2137,2138,2138,2139,2139,2140,2140,2141,2141,2141,2142,2142,2142,2143,2143,2144,2144,2144,2144,2145,2145,2145,2145,2146,2146,2147,2147,2148,2148,2150,2150,2149,2149,2149,2149,2149,2149,2149,2151,2151,2152,2152,2153,2153,2154,2154,2155,2156,2156,2156,2156,2157,2157,2159,2159,2160,2160,2158,2161,2161,2161,2163,2163,2162,2162,2162,2162,2162,2162,2162,2164,2164,2161,2167,2167,2166,2166,2166,2166,2166,2166,2166,2168,2168,2165,2161,2161,2169,2169,2169,2169,2170,2170,2170,2170,2171,2174,2174,2174,2173,2173,2173,2173,2173,2175,2175,2172,2176,2176,2176,2179,2179,2179,2178,2178,2178,2178,2178,2180,2180,2177,2181,2185,2185,2184,2184,2184,2184,2184,2188,2188,2187,2187,2187,2187,2187,2187,2187,2187,2187,2187,2189,2189] +[2191,2191,2190,2190,2190,2190,2190,2190,2190,2192,2192,2186,2194,2194,2194,2193,2196,2196,2195,2195,2195,2195,2195,2195,2195,2197,2197,2197,2181,2176,2176,2176,2198,2198,2198,2198,2201,2201,2201,2200,2200,2200,2200,2200,2202,2202,2199,2203,2207,2207,2206,2206,2206,2206,2206,2208,2208,2208,2208,2208,2209,2209,2209,2211,2211,2203,2198,2198,2198,2212,2212,2212,2212,2215,2215,2214,2214,2214,2214,2214,2214,2214,2214,2216,2216,2213,2212,2217,2217,2212,2222,2222,2221,2221,2221,2221,2221,2221,2221,2221,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2223,2224,2224,2224,2224,2224,2224,2224,2224,2224,2224,2224,2224,2224,2224,2224,2220,2219,2219,2219,2219,2219,2219,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2225,2218,2226,2227,2227,2227,2227,2228,2228,2232,2232,2231,2231,2231,2231,2231,2231,2233,2233,2230,2234,2234,2229,2235,2235,2236,2236,2237,2237,2239,2239,2240,2240,2241,2241,2243,2243,2244,2244,2244,2244,2245,2246,2246,2247,2247,2248,2248,2249,2249,2250,2251,2251,2251,2251,2252,2252,2256,2256,2257,2257,2255,2254,2254,2254,2254,2254,2254,2258,2258,2253,2259,2259,2259,2260,2260,2259,2262,2262,2263,2263,2261,2259,2259,2264,2264,2265,2265,2265,2267,2267,2268,2268,2266,2265,2265,2269,2269,2269,2269,2270,2270,2270,2270,2271,2271,2272,2272,2270,2270,2273,2273,2274,2274,2274,2274,2274,2274,2275,2275,2270,2265,2265,2265,2276,2276,2278,2278,2279,2279,2279,2280,2280,2281,2281,2282,2286,2286,2285,2285,2285,2285,2285,2287,2287,2292,2292,2291,2291,2291,2291,2291,2291,2293,2293,2294,2294,2295,2295,2290,2289,2289,2289,2289,2289,2296,2296,2296,2288,2298,2298,2298,2299,2299,2282,2279,2279,2279,2303,2303,2303,2302,2302,2302,2302,2302,2304,2304,2305,2305,2300,2226,2212,2212,2212,2309,2309,2309,2308,2308,2308,2308,2308,2310,2310,2311,2311,2306,2170,-1,-1,-1,2312,2313,2313,2313,2313,2314,2314,2316,2316,2317,2317,2318,2318,2318,2318,2319,2319,2322,2322,2321,2321,2321,2321,2321,2321,2321,2321,2323,2323,2323,2323,2320,2324,2324,2324,2325,2325,2326,2326,2328,2328,2329,2329,2324,2324,2324,2324,2330,2331,2331,2331,2331,2332,2332,2333,2333,2331,2334,2334,2337,2337,2336,2336,2336,2336,2336,2336,2336,2336,2338,2338,2338,2338,2338,2339,2339,2335,2335,2335] +[2340,2340,2335,2331,2331,2341,2341,2342,2343,2344,2344,2344,2344,2345,2345,2348,2348,2347,2347,2347,2347,2347,2347,2347,2347,2349,2349,2349,2349,2350,2350,2346,2351,2351,2351,2352,2352,2351,2353,2353,2354,2355,2355,2355,2355,2356,2356,2359,2359,2358,2358,2358,2358,2358,2358,2358,2358,2358,2358,2360,2360,2361,2361,2362,2362,2357,2363,2363,2364,2364,2364,2365,2365,2365,2366,2366,2365,2369,2369,2368,2368,2368,2368,2368,2368,2368,2370,2370,2367,2365,2365,2371,2371,2371,2371,2372,2374,2374,2377,2377,2376,2376,2376,2376,2376,2376,2376,2376,2376,2376,2378,2378,2380,2380,2380,2381,2381,2381,2382,2382,2382,2382,2383,2383,2385,2385,2385,2385,2385,2385,2385,2385,2385,2386,2386,2387,2387,2390,2390,2390,2390,2390,2390,2390,2391,2391,2389,2388,2388,2392,2392,2395,2395,2394,2394,2394,2394,2394,2394,2394,2394,2394,2394,2396,2396,2397,2397,2393,2400,2400,2400,2400,2400,2400,2400,2399,2399,2399,2399,2399,2399,2399,2399,2399,2399,2399,2399,2399,2401,2401,2398,2404,2404,2403,2403,2403,2403,2403,2403,2403,2403,2403,2403,2405,2405,2406,2406,2402,2388,2354,2408,2408,2421,2421,2420,2420,2420,2420,2420,2420,2420,2420,2422,2422,2422,2423,2423,2423,2423,2419,2418,2418,2418,2418,2418,2418,2418,2418,2424,2424,2424,2425,2425,2425,2425,2417,2416,2416,2416,2416,2416,2416,2416,2416,2426,2426,2426,2427,2427,2427,2427,2415,2414,2414,2414,2414,2414,2414,2414,2414,2428,2428,2428,2429,2429,2429,2429,2413,2412,2412,2412,2412,2412,2412,2412,2412,2430,2430,2430,2431,2431,2431,2431,2411,2410,2410,2410,2410,2410,2410,2410,2410,2432,2432,2432,2433,2433,2433,2433,2409,2437,2437,2436,2436,2436,2436,2436,2438,2438,2440,2440,2440,2439,2442,2442,2441,2441,2441,2441,2441,2441,2441,2161,2444,2444,2445,2445,2445,2445,2445,2445,2445,2445,2448,2448,2447,2447,2447,2447,2447,2449,2449,2449,2446,2445,2445,2445,2445,2445,2450,2450,2451,2451,2451,2451,2451,2452,2452,2454,2454,2453,2453,2453,2453,2453,2453,2457,2457,2457,2456,2456,2456,2456,2456,2456,2456,2458,2458,2461,2461,2460,2460,2460,2460,2460,2460,2460,2460,2462,2462,2465,2465,2464,2464,2464,2464,2464,2464,2464,2464,2464,2464,2464,2464,2464,2464,2467,2467,2466,2466,2466,2466,2471,2471,2471,2472,2472,2473,2473,2470,2474,2474,2477,2477,2477,2478,2478,2475,2479,2479,2479,2479,2479,2479,2480,2480,2481,2482,2482,2482,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2482,2484,2484,2484,2484,2484,2484,2484,2484,2488,2488,2488,2488,2488,2488,2488,2488,2487,2487,2487,2487,2490,2490,2489,2492,2492,2491,2491,2491,2491,2491,2491,2494,2494,2493,2493,2493,2493,2493,2493,2495,2495,2485,2481,2109] +[-1,-1,-1,-1,2497,2497,2498,2498,2498,2498,2498,2498,2499,2499,2500,2500,2500,2500,2500,2500,2501,2501,2502,2502,2502,2502,2502,2502,2503,2503,2504,2504,2504,2504,2504,2504,2505,2505,2506,2506,2506,2506,2506,2506,2507,2507,2508,2508,2508,2508,2508,2508,2509,2509,2510,2510,2510,2510,2510,2510,2511,2511,2512,2512,2512,2512,2512,2512,2513,2513,2514,2514,2514,2514,2514,2514,2514,2514,2514,2515,2515,2516,2516,2516,2516,2516,2516,2516,2516,2518,2519,2519,2521,2521,2521,2521,2522,2522,2522,2522,2523,2523,2524,2525,2525,2525,2525,2526,2526,2526,2526,2526,2527,2527,2527,2527,2527,2527,2528,2528,2528,2528,2529,2529,2529,2529,2530,2530,2530,2530,2530,2531,2531,2531,2531,2532,2532,2532,2532,2532,2533,2533,2533,2533,2533,2533,2534,2534,2534,2534,2534,2535,2535,2535,2535,2536,2536,2536,2536,2537,2537,2537,2537,2537,2538,2538,2538,2538,2538,2539,2539,2539,2539,2540,2540,2540,2540,2540,2541,2541,2541,2541,2541,2542,2542,2542,2542,2543,2543,2543,2543,2543,2544,2544,2544,2544,2545,2545,2545,2545,2545,2546,2546,2546,2546,2547,2547,2547,2547,2548,2548,2548,2548,2548,2549,2549,2549,2549,2549,2549,2550,2550,2550,2550,2550,2551,2551,2551,2551,2552,2552,2552,2552,2552,2553,2553,2553,2553,2553,2553,2554,2554,2554,2554,2555,2555,2555,2555,2555,2556,2556,2556,2556,2556,2557,2557,2557,2557,2557,2557,2558,2558,2558,2558,2558,2558,2559,2559,2559,2559,2559,2559,2559,2560,2560,2560,2560,2561,2561,2561,2561,2562,2562,2562,2562,2563,2563,2563,2563,2564,2564,2564,2564,2564,2565,2565,2565,2565,2565,2566,2566,2566,2566,2566,2566,2567,2567,2567,2567,2568,2568,2568,2568,2569,2569,2569,2569,2569,2570,2570,2570,2570,2570,2571,2571,2571,2571,2571,2571,2572,2572,2572,2572,2573,2573,2573,2573,2573,2573,2573,2573,2574,2574,2574,2574,2574,2574,2574,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2576,2576,2576,2576,2576,2576,2576,2576,2576,2577,2577,2577,2577,2577,2578,2578,2578,2578,2578,2578,2578,2579,2579,2579,2579,2579,2579,2579,2579,2579,2579,2580,2580,2580,2580,2580,2580,2580,2580,2580,2580,2580,2580,2580,2581,2581,2581,2581,2581,2581,2581,2581,2581,2582,2582,2582,2582,2582,2582,2582,2582,2583,2583,2583,2583,2583,2583,2584,2584,2584,2584,2584,2584,2584,2584,2584,2524,2585,2585,2586,2586,2586,2586,2586,2586,2586,2586,2586,2586,2586,2586,2586,2587,2587,2588,2588,2589,2589,2591,2591,2590,2590,2590,2590,2590,2590,2590,2592,2592,2593,2593,2595,2595,2594,2596,2596,2596,2596,2600,2600,2601,2601,2599,2598,2598,2598,2598,2598,2598,2598,2598,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602,2602] +[2603,2603,2603,2603,2603,2603,2603,2605,2605,2605,2604,2606,2606,2606,2606,2606,2606,2606,2606,2607,2607,2607,2607,2607,2607,2608,2608,2608,2517,2515,2515,2609,2609,2610,2610,2610,2610,2610,2611,2611,2612,2612,2612,2612,2612,2613,2613,2614,2614,2614,2614,2614,2615,2615,2616,2616,2616,2616,2616,2616,2617,2617,2617,2618,2618,2618,2618,2618,2618,2618,2618,2619,2619,2619,2620,2620,2620,2620,2620,2620,2620,2620,2621,2621,2621,2622,2622,2622,2622,2622,2622,2622,2622,2622,2622,2623,2623,2623,2624,2624,2624,2624,2624,2624,2624,2624,2624,2624,2625,2625,2625,2626,2626,2626,2626,2626,2626,2626,2626,2626,2627,2627,2627,2628,2628,2628,2628,2628,2628,2628,2628,2628,2628,2629,2629,2629,2630,2630,2630,2630,2630,2630,2630,2630,2630,2630,2631,2631,2632,2632,2632,2632,2632,2633,2633,2633,2635,2635,2635,2635,2635,2635,2635,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2636,2637,2637,2637,2637,2634,2638,2638,2638,2639,2639,2639,2639,2639,2639,2639,2639,2639,2640,2640,2640,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2642,2642,2642,2643,2643,2643,2643,2643,2643,2643,2643,2643,2643,2644,2644,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2645,2646,2646,2646,2648,2648,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650,2650] +[2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2651,2651,2651,2651,2651,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2652,2652,2652,2652,2652,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2653,2653,2653,2653,2653,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2649,2654,2654,2654,2654,2654,2649,2646,2655,2655,2656,2656,2659,2659,2659,2660,2660,2660,2661,2662,2662,2662,2662,2662,2662,2662,2662,2662,2662,2662,2662,2662,2662,2662,2661,2665,2665,2665,2667,2667,2668,2668,2668,2669,2670,2671,2671,2672,2672,2672,2672,2672,2672,2672,2672,2672,2672,2670,2673,2674,2674,2674,2674,2674,2674,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2675,2673,2676,2677,2677,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2678,2676,2679,2680,2680,2680,2680,2680,2680,2680,2680,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2681,2679,2682,2683,2683,2683,2683,2683,2683,2683,2683,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2684,2682,2685,2686,2686,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2687,2685,2688,2689,2689,2689,2689,2689,2689,2689,2689,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2690,2688,2691,2692,2692,2692,2692,2692,2692,2692,2692,2692,2692,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2693,2691,2694,2695,2695,2695,2695,2695,2695,2695,2695,2695,2695,2695,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2696,2694,2697,2698,2698,2698,2698,2698,2698,2698,2698,2698,2698,2698,2698,2698,2698,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2699,2697,2669,2666,2700,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701,2701] +[2702,2702,2702,2702,2702,2702,2703,2703,2703,2703,2703,2703,2703,2704,2704,2704,2704,2704,2704,2704,2705,2705,2705,2705,2705,2705,2705,2705,2706,2706,2706,2706,2706,2706,2707,2707,2707,2707,2707,2707,2700,2710,2710,2710,2712,2712,2713,2714,2715,2715,2716,2716,2716,2716,2716,2716,2716,2716,2716,2717,2717,2717,2717,2717,2718,2718,2718,2718,2718,2718,2718,2718,2718,2718,2714,2719,2720,2720,2720,2720,2720,2720,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2722,2722,2722,2722,2722,2723,2723,2723,2723,2723,2723,2719,2713,2724,2725,2726,2726,2726,2726,2726,2726,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2727,2725,2728,2729,2729,2729,2729,2729,2729,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2730,2728,2731,2732,2732,2732,2732,2732,2732,2732,2732,2732,2732,2732,2732,2732,2732,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2733,2731,2734,2735,2735,2736,2736,2736,2736,2736,2736,2736,2736,2736,2736,2736,2736,2734,2737,2738,2738,2738,2738,2738,2738,2738,2738,2738,2738,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2739,2737,2740,2741,2741,2741,2741,2741,2741,2741,2741,2741,2741,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2742,2740,2743,2744,2744,2744,2744,2744,2744,2744,2744,2744,2744,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2745,2743,2746,2747,2747,2747,2747,2747,2747,2747,2747,2747,2747,2747,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2748,2746,2749,2750,2750,2750,2750,2750,2750,2750,2750,2750,2750,2750,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2751,2749] +[2752,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2754,2752,2724,2711,2755,2756,2756,2756,2756,2756,2756,2756,2756,2756,2755,2759,2759,2759,2761,2761,2762,2762,2762,2763,2764,2765,2765,2765,2765,2765,2765,2766,2766,2766,2766,2766,2766,2766,2766,2766,2766,2766,2764,2763,2760,2767,2768,2768,2768,2768,2768,2768,2768,2768,2768,2767,2771,2771,2771,2773,2773,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775,2775] +[2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2776,2776,2776,2776,2776,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2774,2777,2777,2777,2777,2777,2774,2772,2778,2779,2779,2779,2779,2780,2780,2780,2780,2780,2781,2781,2781,2781,2781,2781,2782,2782,2782,2782,2782,2782,2783,2783,2783,2783,2783,2783,2784,2784,2784,2784,2778,2787,2787,2787,2789,2789,2790,2790,2790,2790,2790,2790,2790,2790,2790,2790,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2791,2790,2788,2792,2793,2793,2793,2793,2793,2793,2793,2792,2796,2796,2796,2798,2798,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800,2800] +[2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2801,2801,2801,2801,2801,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2802,2802,2802,2802,2802,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2799,2803,2803,2803,2803,2803,2799,2797,2804,2805,2805,2805,2805,2805,2804,2808,2808,2808,2810,2810,2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812,2812] +[2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2811,2813,2813,2813,2813,2813,2811,2809,2814,2815,2815,2815,2815,2815,2815,2815,2814,2818,2818,2818,2820,2820,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2822,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2823,2823,2823,2823,2823,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2821,2824,2824,2824,2824,2824,2821,2819,2825,2826,2826,2826,2826,2826,2826,2827,2827,2827,2827,2827,2827,2828,2828,2828,2828,2828,2825,2831,2831,2831,2833,2833,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2835,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2836,2836,2836,2836,2836,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2837,2837,2837,2837,2837,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2834,2838,2838,2838,2838,2838,2834,2832,2839,2840,2840,2840,2840,2840,2841,2841,2841,2841,2841,2839,2829] +[2844,2844,2846,2846,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2848,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2849,2849,2849,2849,2849,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2850,2850,2850,2850,2850,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2847,2851,2851,2851,2851,2851,2847,2845,2852,2853,2853,2853,2853,2853,2853,2853,2854,2854,2854,2854,2854,2855,2855,2855,2855,2855,2852,2858,2858,2858,2860,2860,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2862,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2863,2863,2863,2863,2863] +[2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2864,2864,2864,2864,2864,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2861,2865,2865,2865,2865,2865,2861,2859,2866,2867,2867,2867,2867,2867,2866,2870,2870,2870,2872,2872,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2874,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2875,2875,2875,2875,2875,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2873,2876,2876,2876,2876,2876,2873,2871,2877,2878,2878,2878,2878,2878,2877,2881,2881,2881,2883,2883,2884,2884,2884,2885,2886,2887,2887,2888,2888,2888,2888,2888,2888,2888,2888,2888,2888,2888,2886,2885,2882] +[2889,2890,2890,2890,2890,2890,2890,2890,2890,2889,2893,2893,2893,2893,2893,2893,2893,2893,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2892,2894,2894,2897,2897,2897,2897,2897,2897,2897,2896,2896,2896,2896,2896,2896,2896,2896,2896,2896,2896,2896,2896,2896,2896,2898,2898,2898,2898,2898,2898,2898,2898,2899,2901,2901,2902,2902,2900,2904,2904,2904,2904,2905,2905,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2907,2907,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2906,2908,2908,2911,2911,2911,2912,2912,2909,2913,2913,2913,2913,2913,2913,2915,2915,2915,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2914,2918,2918,2918,2918,2918,2918,2918,2918,2917,2917,2917,2917,2917,2917,2917,2917,2917,2917,2917,2917,2919,2919,2919,2919,2919,2919,2919,2919,2920,2922,2922,2921,2924,2924,2924,2924,2924,2924,2924,2924,2925,2925,2925,2926,2926,2928,2928,2928,2928,2929,2929,2929,2929,2930,2930,2933,2933,2933,2933,2933,2933,2933,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2932,2936,2936,2935,2935,2935,2935,2934,2934,2937,2937,2937,2937,2938,2938,2938,2938,2938,2938,2938,2938,2938,2939,2939,2941,2941,2940,2940,2940,2940,2940,2940,2940,2928,2944,2944,2943,2943,2943,2943,2942,2942,2945,2945,2947,2947,2946,2946,2948,2949,2949,2949,2949,2950,2950,2952,2952,2953,2953,2951,2954,2954,2954,2956,2956,2955,2955,2955,2955,2955,2955,2955,2955,2955,2955,2954,2960,2960,2959,2959,2959,2959,2959,2959,2959,2959,2959,2959,2958,2958,2958,2958,2958,2958,2958,2958,2961,2961,2961,2961,2961,2961,2961,2961,2961,2961,2961,2961,2961,2961,2957,2954,2962,2962,2963,2964,2964,2964,2964,2965,2965,2969,2969,2968,2968,2968,2968,2968,2968,2968,2968,2968,2968,2967,2967,2967,2967,2967,2967,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2970,2971,2971,2971,2971,2972,2972,2974,2974,2976,2976,2977,2977,2975,2978,2978,2978,2978,2979,2979,2979,2979,2980,2980,2981,2981,2981,2981,2981,2981,2982,2982,2984,2984,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2983,2985,2985,2986,2986,2988,2988,2987,2987,2987,2987,2987,2987,2987,2987,2987,2987,2987,2989,2989,2989,2989,2991,2991,2990,2990,2990,2990,2990,2990,2990,2990,2989,2989,2992,2992,2992,2992,2992,2992,2989,2994,2994,2993,2993,2993,2993,2993,2993,2993,2993,2989,2989,2995,2995,2995,2995,2995,2995,2995,2989,2997,2997,2996,2996,2996,2996,2996,2996,2996,2996] +[2998,2998,2998,2998,2998,2998,2978,2978,3000,3000,2999,2999,2999,2999,2999,2999,2999,2999,2999,2999,2978,3004,3004,3003,3003,3003,3003,3003,3003,3003,3003,3003,3003,3002,3002,3002,3002,3002,3002,3002,3002,3005,3005,3005,3005,3005,3005,3005,3005,3005,3005,3005,3005,3005,3005,3001,2978,3006,3006,3007,3009,3009,3010,3010,3010,3010,3010,3011,3011,3011,3011,3011,3011,3007,3012,3012,3014,3014,3013,3013,3013,3013,3013,3013,3013,3013,3013,3013,3012,3018,3018,3017,3017,3017,3017,3017,3017,3017,3017,3017,3017,3016,3016,3016,3016,3016,3016,3016,3016,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3019,3015,3012,3020,3020,3022,3022,3023,3023,3023,3023,3023,3024,3024,3024,3025,3026,3026,3027,3029,3029,3030,3030,3031,3031,3031,3032,3032,3032,3032,3032,3031,3031,3033,3033,3034,3036,3036,3039,3039,3039,3039,3039,3039,3039,3039,3039,3038,3038,3038,3038,3038,3038,3038,3038,3038,3038,3038,3038,3038,3038,3040,3040,3040,3040,3040,3040,3044,3044,3044,3043,3043,3043,3043,3043,3043,3043,3043,3043,3043,3043,3043,3047,3047,3047,3047,3047,3047,3047,3047,3047,3046,3046,3046,3046,3046,3046,3046,3046,3046,3046,3046,3046,3046,3046,3046,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,3045,3050,3050,3050,3051,3054,3054,3054,3054,3053,3053,3053,3053,3053,3056,3056,3055,3055,3055,3055,3055,3055,3055,3055,3055,3055,3052,3034,3057,3057,3058,3058,3059,3061,3061,3063,3063,3062,3062,3062,3062,3062,3062,3062,3062,3062,3062,3064,3064,3064,3065,3065,3065,3065,3065,3065,3064,3064,3067,3067,3066,3066,3066,3066,3066,3066,3066,3066,3069,3069,3071,3071,3072,3072,3070,3064,3064,3064,3064,3073,3075,3075,3076,3076,3077,3077,3077,3078,3078,3078,3078,3078,3078,3077,3077,3080,3080,3079,3079,3079,3079,3079,3079,3079,3079,3082,3082,3083,3083,3083,3083,3083,3077,3077,3077,3077,3084,3084,3084,3084,3087,3087,3087,3086,3086,3086,3086,3086,3088,3088,3085,3089,3090,3090,3090,3090,3091,3091,3092,3092,3092,3093,3093,3093,3095,3095,3094,3094,3094,3094,3094,3094,3094,3094,3094,3094,3094,3094,3094,3097,3097,3100,3100,3099,3099,3099,3099,3099,3099,3099,3099,3099,3099,3099,3099,3099,3098,3098,3098,3098,3098,3098,3098,3098,3098,3098,3098,3093,3093,3093,3093,3101,3101,3101,3101,3103,3103,3103,3103,3103,3103,3103,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3102,3105,3105,3109,3109,3109,3109,3109,3109,3109,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3108,3110,3110] +[3111,3111,3111,3111,3111,3107,3106,3106,3106,3106,3106,3106,3106,3106,3106,3106,3113,3113,3113,3114,3115,3115,3112,3116,3116,3112,3112,3117,3117,3117,3117,3117,3117,3089,3077,3077,3077,3119,3119,3119,3120,3120,3120,3120,3122,3122,3122,3121,3121,3123,3123,3128,3128,3127,3127,3127,3127,3127,3127,3127,3127,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3129,3130,3130,3130,3130,3130,3126,3125,3125,3125,3125,3125,3125,3125,3125,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3131,3132,3132,3132,3132,3124,3121,3134,3134,3135,3135,3059,3057,3057,3057,3136,3138,3138,3139,3139,3139,3140,3140,3140,3140,3141,3141,3143,3143,3142,3142,3142,3142,3142,3142,3142,3142,3142,3142,3142,3144,3144,3145,3145,3147,3147,3146,3146,3146,3146,3146,3146,3146,3146,3146,3146,3146,3146,3150,3150,3151,3151,3152,3152,3154,3154,3154,3157,3157,3156,3156,3156,3156,3156,3158,3158,3158,3155,3160,3160,3163,3163,3162,3162,3162,3162,3162,3162,3162,3162,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3164,3165,3165,3165,3167,3167,3167,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3169,3169,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3170,3170,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3168,3171,3171,3174,3174,3174,3175,3175,3172,3176,3176,3176,3177,3177,3179,3179,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3178,3180,3182,3182,3184,3184,3183,3183,3183,3183,3183,3183,3183,3183,3183,3183,3183,3185,3185,3185,3186,3186,3186,3186,3186,3186,3185,3185,3188,3188,3187,3187,3187,3187,3187,3187,3187,3187,3189,3191,3191,3194,3194,3194,3194,3194,3194,3194,3194,3194,3193,3193,3193,3193,3193,3193,3193,3193,3193,3193,3193,3193,3193,3193,3195,3195,3195,3195,3195,3195,3192,3196,3196,3196,3196,3197,3197,3198,3198,3199,3199,3202,3202,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3200,3200,3200,3200,3200,3200,3200,3203,3203,3204,3204,3205,3206,3206,3206,3206,3207,3207,3210,3210,3209,3209,3209,3209,3209,3209,3209,3209,3209,3209,3209,3211,3211,3208,3212,3212,3212,3214,3214,3213,3213,3213,3213,3213,3213,3213,3213,3213,3213,3215,3215,3215,3219,3219,3218,3218,3218,3218,3218,3217,3217,3217,3217,3217,3217,3217,3217,3217,3217,3217,3217,3216,3216,3215,3215,3220,3220,3220,3220,3220,3220,3220,3220,3223,3223,3222,3222,3222,3222,3222,3222,3222,3222,3222,3222,3225,3225,3224,3224,3224,3224,3224,3224] +[3212,3212,3212,3212,3229,3229,3229,3228,3228,3228,3228,3228,3228,3228,3228,3228,3228,3228,3228,3228,3231,3231,3230,3230,3230,3230,3230,3233,3233,3232,3232,3232,3232,3232,3232,3226,3236,3236,3235,3235,3235,3235,3235,3235,3235,3235,3235,3235,3237,3237,3242,3242,3241,3241,3241,3241,3241,3241,3241,3241,3241,3241,3241,3240,3240,3240,3240,3240,3240,3240,3240,3240,3240,3240,3240,3240,3243,3243,3244,3244,3238,3189,3185,3185,3185,3247,3247,3247,3246,3246,3246,3246,3246,3246,3246,3246,3246,3246,3248,3248,3251,3251,3250,3250,3250,3250,3250,3250,3250,3250,3250,3250,3249,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3252,3024,2954,3253,3253,3253,3254,3254,3256,3256,3255,3255,3255,3255,3255,3255,3255,3259,3259,3259,3259,3259,3259,3259,3259,3259,3259,3259,3260,3260,3261,3261,3261,3261,3257,3253,3253,3253,3253,3263,3263,3263,3262,3265,3265,3264,3264,2924,3266,3266,3266,3267,3267,3267,3267,3268,3268,3269,3272,3272,3272,3272,3272,3272,3272,3272,3272,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3271,3273,3273,3273,3273,3273,3273,3270,3276,3276,3276,3276,3276,3276,3276,3276,3276,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3275,3277,3277,3277,3277,3277,3277,3277,3274,3280,3280,3280,3280,3280,3280,3280,3280,3280,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3279,3281,3281,3281,3281,3281,3281,3278,3269,3282,3282,3283,3283,3283,3284,3284,3285,3285,3286,3286,3288,3288,3287,3287,3287,3287,3287,3287,3287,3289,3289,3290,3290,3291,3291,3291,3291,3292,3292,3292,3292,3293,3293,3294,3294,3295,3295,3298,3298,3299,3299,3297,3296,3296,3296,3296,3296,3296,3296,3300,3300,3301,3301,3302,3302,3303,3303,3307,3307,3306,3306,3306,3306,3306,3310,3310,3311,3311,3309,3312,3312,3308,3314,3314,3314,3315,3315,3315,3315,3315,3316,3316,3316,3316,3317,3317,3318,3318,3318,3318,3321,3321,3321,3320,3320,3320,3320,3319,3319,3322,3322,3323,3323,3323,3323,3323,3324,3324,3324,3324,3324,3324,3324,3324,3325,3326,3326,3328,3328,3328,3328,3328,3328,3330,3331,3331,3331,3331,3332,3332,3332,3332,3332,3330,3330,3330,3330,3330,3330,3330,3330,3330,3329,3329,3327,3323,3333,3333,3333,3333,3333,3334,3334,3335,3335,3336,3336,3339,3339,3337,3337,3342,3342,3342,3342,3342,3342,3342,3342,3341,3341,3341,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3344,3344,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3343,3345,3345] +[3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3346,3346,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3347,3347,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3348,3348,3348,3348,3348,3348,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3349,3349,3349,3349,3349,3349,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3350,3350,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3351,3351,3351,3351,3351,3351,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3352,3352,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3353,3353,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3354,3354,3340,3340,3340,3340,3340,3340,3340,3340,3340,3355,3355,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3356,3356,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3357,3357,3340,3340,3340,3340,3340,3340,3340,3340,3340,3340,3358,3358,3340,3340,3340,3340,3340,3340,3340,3359,3359,3359,3359,3359,3359,3340,3340,3340,3340,3340,3340,3340,3340,3360,3360,3340,62,59,0,0] +/** Begin file information. **/ +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +["./prettify/prettify.js"] +/** Begin mapping definitions. **/ +["./prettify/prettify.js",1,0] +["./prettify/prettify.js",63,0] +["./prettify/prettify.js",63,0] +["./prettify/prettify.js",63,0,"window"] +["./prettify/prettify.js",63,39] +["./prettify/prettify.js",66,0] +["./prettify/prettify.js",66,0] +["./prettify/prettify.js",66,0,"window"] +["./prettify/prettify.js",66,25] +["./prettify/prettify.js",77,0] +["./prettify/prettify.js",72,0] +["./prettify/prettify.js",72,0,"window"] +["./prettify/prettify.js",77,4] +["./prettify/prettify.js",77,4,"window"] +["./prettify/prettify.js",84,4] +["./prettify/prettify.js",84,4,"window"] +["./prettify/prettify.js",90,4] +["./prettify/prettify.js",90,4,"window"] +["./prettify/prettify.js",90,28] +["./prettify/prettify.js",90,33] +["./prettify/prettify.js",93,0] +["./prettify/prettify.js",93,0] +["./prettify/prettify.js",93,0,"window"] +["./prettify/prettify.js",93,31] +["./prettify/prettify.js",93,31,""] +["./prettify/prettify.js",93,31] +["./prettify/prettify.js",93,34] +["./prettify/prettify.js",94,2] +["./prettify/prettify.js",94,6,"ieVersion"] +["./prettify/prettify.js",94,18,"navigator"] +["./prettify/prettify.js",94,31,"userAgent"] +["./prettify/prettify.js",94,31,"navigator"] +["./prettify/prettify.js",95,31] +["./prettify/prettify.js",95,6,"match"] +["./prettify/prettify.js",95,6,"userAgent"] +["./prettify/prettify.js",95,6,"navigator"] +["./prettify/prettify.js",95,32] +["./prettify/prettify.js",96,2] +["./prettify/prettify.js",96,2,"ieVersion"] +["./prettify/prettify.js",96,14] +["./prettify/prettify.js",96,14,"ieVersion"] +["./prettify/prettify.js",96,26] +["./prettify/prettify.js",96,27] +["./prettify/prettify.js",96,27,"ieVersion"] +["./prettify/prettify.js",96,37] +["./prettify/prettify.js",96,42] +["./prettify/prettify.js",97,2] +["./prettify/prettify.js",97,2] +["./prettify/prettify.js",97,2,"window"] +["./prettify/prettify.js",97,33] +["./prettify/prettify.js",97,33,""] +["./prettify/prettify.js",97,33] +["./prettify/prettify.js",97,36] +["./prettify/prettify.js",97,38] +["./prettify/prettify.js",97,45,"ieVersion"] +["./prettify/prettify.js",98,2] +["./prettify/prettify.js",98,9,"ieVersion"] +["./prettify/prettify.js",102,1] +["./prettify/prettify.js",1517,2] +["./prettify/prettify.js",102,10] +["./prettify/prettify.js",102,10,""] +["./prettify/prettify.js",102,10] +["./prettify/prettify.js",102,13] +["./prettify/prettify.js",237,11] +["./prettify/prettify.js",237,11,"textToHtml"] +["./prettify/prettify.js",237,21] +["./prettify/prettify.js",237,22,"str"] +["./prettify/prettify.js",237,27] +["./prettify/prettify.js",238,4] +["./prettify/prettify.js",240,16] +["./prettify/prettify.js",240,11,"replace"] +["./prettify/prettify.js",239,16] +["./prettify/prettify.js",239,11,"replace"] +["./prettify/prettify.js",238,22] +["./prettify/prettify.js",238,11,"replace"] +["./prettify/prettify.js",238,11,"str"] +["./prettify/prettify.js",238,23,"pr_amp"] +["./prettify/prettify.js",238,31] +["./prettify/prettify.js",239,17,"pr_lt"] +["./prettify/prettify.js",239,24] +["./prettify/prettify.js",240,17,"pr_gt"] +["./prettify/prettify.js",240,24] +["./prettify/prettify.js",308,11] +["./prettify/prettify.js",308,11,"normalizedHtml"] +["./prettify/prettify.js",308,25] +["./prettify/prettify.js",308,26,"node"] +["./prettify/prettify.js",308,32,"out"] +["./prettify/prettify.js",308,37,"opt_sortAttrs"] +["./prettify/prettify.js",308,52] +["./prettify/prettify.js",309,4] +["./prettify/prettify.js",309,12,"nodeType"] +["./prettify/prettify.js",309,12,"node"] +["./prettify/prettify.js",310,6] +["./prettify/prettify.js",310,11] +["./prettify/prettify.js",310,6] +["./prettify/prettify.js",311,8] +["./prettify/prettify.js",311,12,"name"] +["./prettify/prettify.js",311,43] +["./prettify/prettify.js",311,19,"toLowerCase"] +["./prettify/prettify.js",311,19,"tagName"] +["./prettify/prettify.js",311,19,"node"] +["./prettify/prettify.js",313,8] +["./prettify/prettify.js",313,16] +["./prettify/prettify.js",313,8,"push"] +["./prettify/prettify.js",313,8,"out"] +["./prettify/prettify.js",313,17] +["./prettify/prettify.js",313,22,"name"] +["./prettify/prettify.js",314,8] +["./prettify/prettify.js",314,12,"attrs"] +["./prettify/prettify.js",314,20,"attributes"] +["./prettify/prettify.js",314,20,"node"] +["./prettify/prettify.js",315,12,"n"] +["./prettify/prettify.js",315,16,"length"] +["./prettify/prettify.js",315,16,"attrs"] +["./prettify/prettify.js",316,8] +["./prettify/prettify.js",316,12,"n"] +["./prettify/prettify.js",316,15] +["./prettify/prettify.js",317,10] +["./prettify/prettify.js",317,14,"opt_sortAttrs"] +["./prettify/prettify.js",317,29] +["./prettify/prettify.js",319,12] +["./prettify/prettify.js",318,12] +["./prettify/prettify.js",318,16,"sortedAttrs"] +["./prettify/prettify.js",318,30] +["./prettify/prettify.js",319,21,"i"] +["./prettify/prettify.js",319,25,"n"] +["./prettify/prettify.js",319,28] +["./prettify/prettify.js",319,30,"i"] +["./prettify/prettify.js",319,35] +["./prettify/prettify.js",319,37] +["./prettify/prettify.js",319,41] +["./prettify/prettify.js",319,41] +["./prettify/prettify.js",319,41,"sortedAttrs"] +["./prettify/prettify.js",319,53,"i"] +["./prettify/prettify.js",319,58] +["./prettify/prettify.js",319,58,"attrs"] +["./prettify/prettify.js",319,64,"i"] +["./prettify/prettify.js",320,12] +["./prettify/prettify.js",320,28] +["./prettify/prettify.js",320,12,"sort"] +["./prettify/prettify.js",320,12,"sortedAttrs"] +["./prettify/prettify.js",320,38] +["./prettify/prettify.js",320,38,""] +["./prettify/prettify.js",320,38] +["./prettify/prettify.js",320,39,"a"] +["./prettify/prettify.js",320,42,"b"] +["./prettify/prettify.js",320,45] +["./prettify/prettify.js",321,16] +["./prettify/prettify.js",321,24] +["./prettify/prettify.js",321,24,"name"] +["./prettify/prettify.js",321,24,"a"] +["./prettify/prettify.js",321,33,"name"] +["./prettify/prettify.js",321,33,"b"] +["./prettify/prettify.js",321,43] +["./prettify/prettify.js",321,48] +["./prettify/prettify.js",321,48,"name"] +["./prettify/prettify.js",321,48,"a"] +["./prettify/prettify.js",321,59,"name"] +["./prettify/prettify.js",321,59,"b"] +["./prettify/prettify.js",321,68] +["./prettify/prettify.js",321,72] +["./prettify/prettify.js",323,12] +["./prettify/prettify.js",323,12,"attrs"] +["./prettify/prettify.js",323,20,"sortedAttrs"] +["./prettify/prettify.js",325,10] +["./prettify/prettify.js",325,19,"i"] +["./prettify/prettify.js",325,23] +["./prettify/prettify.js",325,26,"i"] +["./prettify/prettify.js",325,30,"n"] +["./prettify/prettify.js",325,33] +["./prettify/prettify.js",325,35,"i"] +["./prettify/prettify.js",325,38] +["./prettify/prettify.js",326,16,"attr"] +["./prettify/prettify.js",326,16,"attr"] +["./prettify/prettify.js",326,23] +["./prettify/prettify.js",326,23,"attrs"] +["./prettify/prettify.js",326,29,"i"] +["./prettify/prettify.js",327,12] +["./prettify/prettify.js",327,17,"specified"] +["./prettify/prettify.js",327,17,"attr"] +["./prettify/prettify.js",328,20] +["./prettify/prettify.js",328,12,"push"] +["./prettify/prettify.js",328,12,"out"] +["./prettify/prettify.js",328,21] +["./prettify/prettify.js",328,47] +["./prettify/prettify.js",328,26,"toLowerCase"] +["./prettify/prettify.js",328,26,"name"] +["./prettify/prettify.js",328,26,"attr"] +["./prettify/prettify.js",329,21] +["./prettify/prettify.js",233,16] +["./prettify/prettify.js",233,11,"replace"] +["./prettify/prettify.js",232,16] +["./prettify/prettify.js",232,11,"replace"] +["./prettify/prettify.js",231,16] +["./prettify/prettify.js",231,11,"replace"] +["./prettify/prettify.js",230,22] +["./prettify/prettify.js",230,11,"replace"] +["./prettify/prettify.js",329,40,"value"] +["./prettify/prettify.js",329,40,"attr"] +["./prettify/prettify.js",230,23,"pr_amp"] +["./prettify/prettify.js",230,31] +["./prettify/prettify.js",231,17,"pr_lt"] +["./prettify/prettify.js",231,24] +["./prettify/prettify.js",232,17,"pr_gt"] +["./prettify/prettify.js",232,24] +["./prettify/prettify.js",233,17,"pr_quot"] +["./prettify/prettify.js",233,26] +["./prettify/prettify.js",329,53] +["./prettify/prettify.js",332,8] +["./prettify/prettify.js",332,16] +["./prettify/prettify.js",332,8,"push"] +["./prettify/prettify.js",332,8,"out"] +["./prettify/prettify.js",332,17] +["./prettify/prettify.js",333,8] +["./prettify/prettify.js",333,17,"child"] +["./prettify/prettify.js",333,25,"firstChild"] +["./prettify/prettify.js",333,25,"node"] +["./prettify/prettify.js",333,42,"child"] +["./prettify/prettify.js",333,49,"child"] +["./prettify/prettify.js",333,57,"nextSibling"] +["./prettify/prettify.js",333,57,"child"] +["./prettify/prettify.js",334,10] +["./prettify/prettify.js",334,24] +["./prettify/prettify.js",334,10,"normalizedHtml"] +["./prettify/prettify.js",334,25,"child"] +["./prettify/prettify.js",334,32,"out"] +["./prettify/prettify.js",334,37,"opt_sortAttrs"] +["./prettify/prettify.js",336,8] +["./prettify/prettify.js",336,12,"firstChild"] +["./prettify/prettify.js",336,12,"node"] +["./prettify/prettify.js",336,31] +["./prettify/prettify.js",336,56] +["./prettify/prettify.js",336,32,"test"] +["./prettify/prettify.js",336,32] +["./prettify/prettify.js",336,57,"name"] +["./prettify/prettify.js",337,10] +["./prettify/prettify.js",337,18] +["./prettify/prettify.js",337,10,"push"] +["./prettify/prettify.js",337,10,"out"] +["./prettify/prettify.js",337,19] +["./prettify/prettify.js",337,26,"name"] +["./prettify/prettify.js",337,32] +["./prettify/prettify.js",339,8] +["./prettify/prettify.js",340,6] +["./prettify/prettify.js",340,11] +["./prettify/prettify.js",340,6] +["./prettify/prettify.js",340,14] +["./prettify/prettify.js",340,19] +["./prettify/prettify.js",340,14] +["./prettify/prettify.js",341,8] +["./prettify/prettify.js",341,16] +["./prettify/prettify.js",341,8,"push"] +["./prettify/prettify.js",341,8,"out"] +["./prettify/prettify.js",341,27] +["./prettify/prettify.js",341,17,"textToHtml"] +["./prettify/prettify.js",341,28,"nodeValue"] +["./prettify/prettify.js",341,28,"node"] +["./prettify/prettify.js",342,8] +["./prettify/prettify.js",354,11] +["./prettify/prettify.js",354,11,"combinePrefixPatterns"] +["./prettify/prettify.js",354,32] +["./prettify/prettify.js",354,33,"regexs"] +["./prettify/prettify.js",354,41] +["./prettify/prettify.js",371,13] +["./prettify/prettify.js",371,13,"decodeEscape"] +["./prettify/prettify.js",371,25] +["./prettify/prettify.js",371,26,"charsetPart"] +["./prettify/prettify.js",371,39] +["./prettify/prettify.js",372,6] +["./prettify/prettify.js",372,28] +["./prettify/prettify.js",372,10,"charAt"] +["./prettify/prettify.js",372,10,"charsetPart"] +["./prettify/prettify.js",372,29] +["./prettify/prettify.js",372,36] +["./prettify/prettify.js",372,44] +["./prettify/prettify.js",372,73] +["./prettify/prettify.js",372,51,"charCodeAt"] +["./prettify/prettify.js",372,51,"charsetPart"] +["./prettify/prettify.js",372,74] +["./prettify/prettify.js",373,6] +["./prettify/prettify.js",373,32] +["./prettify/prettify.js",373,14,"charAt"] +["./prettify/prettify.js",373,14,"charsetPart"] +["./prettify/prettify.js",373,33] +["./prettify/prettify.js",374,8] +["./prettify/prettify.js",374,13] +["./prettify/prettify.js",374,8] +["./prettify/prettify.js",374,18] +["./prettify/prettify.js",374,25] +["./prettify/prettify.js",375,8] +["./prettify/prettify.js",375,13] +["./prettify/prettify.js",375,8] +["./prettify/prettify.js",375,18] +["./prettify/prettify.js",375,25] +["./prettify/prettify.js",376,8] +["./prettify/prettify.js",376,13] +["./prettify/prettify.js",376,8] +["./prettify/prettify.js",376,18] +["./prettify/prettify.js",376,25] +["./prettify/prettify.js",377,8] +["./prettify/prettify.js",377,13] +["./prettify/prettify.js",377,8] +["./prettify/prettify.js",377,18] +["./prettify/prettify.js",377,25] +["./prettify/prettify.js",378,8] +["./prettify/prettify.js",378,13] +["./prettify/prettify.js",378,8] +["./prettify/prettify.js",378,18] +["./prettify/prettify.js",378,25] +["./prettify/prettify.js",379,8] +["./prettify/prettify.js",379,13] +["./prettify/prettify.js",379,8] +["./prettify/prettify.js",379,18] +["./prettify/prettify.js",379,25] +["./prettify/prettify.js",380,8] +["./prettify/prettify.js",380,13] +["./prettify/prettify.js",380,8] +["./prettify/prettify.js",380,18] +["./prettify/prettify.js",380,23] +["./prettify/prettify.js",380,18] +["./prettify/prettify.js",381,10] +["./prettify/prettify.js",381,25] +["./prettify/prettify.js",381,17,"parseInt"] +["./prettify/prettify.js",381,47] +["./prettify/prettify.js",381,26,"substring"] +["./prettify/prettify.js",381,26,"charsetPart"] +["./prettify/prettify.js",381,48] +["./prettify/prettify.js",381,52] +["./prettify/prettify.js",382,39] +["./prettify/prettify.js",382,17,"charCodeAt"] +["./prettify/prettify.js",382,17,"charsetPart"] +["./prettify/prettify.js",382,40] +["./prettify/prettify.js",383,8] +["./prettify/prettify.js",383,13] +["./prettify/prettify.js",383,8] +["./prettify/prettify.js",383,18] +["./prettify/prettify.js",383,23] +["./prettify/prettify.js",383,18] +["./prettify/prettify.js",383,28] +["./prettify/prettify.js",383,33] +["./prettify/prettify.js",383,28] +["./prettify/prettify.js",383,38] +["./prettify/prettify.js",383,43] +["./prettify/prettify.js",383,38] +["./prettify/prettify.js",383,48] +["./prettify/prettify.js",383,53] +["./prettify/prettify.js",383,48] +["./prettify/prettify.js",384,8] +["./prettify/prettify.js",384,13] +["./prettify/prettify.js",384,8] +["./prettify/prettify.js",384,18] +["./prettify/prettify.js",384,23] +["./prettify/prettify.js",384,18] +["./prettify/prettify.js",384,28] +["./prettify/prettify.js",384,33] +["./prettify/prettify.js",384,28] +["./prettify/prettify.js",385,10] +["./prettify/prettify.js",385,25] +["./prettify/prettify.js",385,17,"parseInt"] +["./prettify/prettify.js",385,47] +["./prettify/prettify.js",385,26,"substring"] +["./prettify/prettify.js",385,26,"charsetPart"] +["./prettify/prettify.js",385,48] +["./prettify/prettify.js",385,52] +["./prettify/prettify.js",386,8] +["./prettify/prettify.js",386,8] +["./prettify/prettify.js",386,17] +["./prettify/prettify.js",386,46] +["./prettify/prettify.js",386,24,"charCodeAt"] +["./prettify/prettify.js",386,24,"charsetPart"] +["./prettify/prettify.js",386,47] +["./prettify/prettify.js",390,13] +["./prettify/prettify.js",390,13,"encodeEscape"] +["./prettify/prettify.js",390,25] +["./prettify/prettify.js",390,26,"charCode"] +["./prettify/prettify.js",390,36] +["./prettify/prettify.js",391,6] +["./prettify/prettify.js",391,10,"charCode"] +["./prettify/prettify.js",391,21] +["./prettify/prettify.js",392,8] +["./prettify/prettify.js",392,16] +["./prettify/prettify.js",392,16,"charCode"] +["./prettify/prettify.js",392,27] +["./prettify/prettify.js",392,34] +["./prettify/prettify.js",392,43] +["./prettify/prettify.js",392,69] +["./prettify/prettify.js",392,52,"toString"] +["./prettify/prettify.js",392,52,"charCode"] +["./prettify/prettify.js",392,70] +["./prettify/prettify.js",394,10,"ch"] +["./prettify/prettify.js",394,10,"ch"] +["./prettify/prettify.js",394,34] +["./prettify/prettify.js",394,15,"fromCharCode"] +["./prettify/prettify.js",394,15,"String"] +["./prettify/prettify.js",394,35,"charCode"] +["./prettify/prettify.js",395,6] +["./prettify/prettify.js",395,10,"ch"] +["./prettify/prettify.js",395,17] +["./prettify/prettify.js",395,25,"ch"] +["./prettify/prettify.js",395,32] +["./prettify/prettify.js",395,39,"ch"] +["./prettify/prettify.js",395,46] +["./prettify/prettify.js",395,53,"ch"] +["./prettify/prettify.js",395,60] +["./prettify/prettify.js",396,8] +["./prettify/prettify.js",396,8,"ch"] +["./prettify/prettify.js",396,13] +["./prettify/prettify.js",396,20,"ch"] +["./prettify/prettify.js",398,6] +["./prettify/prettify.js",398,13,"ch"] +["./prettify/prettify.js",401,13] +["./prettify/prettify.js",401,13,"caseFoldCharset"] +["./prettify/prettify.js",401,28] +["./prettify/prettify.js",401,29,"charSet"] +["./prettify/prettify.js",401,38] +["./prettify/prettify.js",402,6] +["./prettify/prettify.js",402,10,"charsetParts"] +["./prettify/prettify.js",402,71] +["./prettify/prettify.js",402,25,"match"] +["./prettify/prettify.js",402,42] +["./prettify/prettify.js",402,25,"substring"] +["./prettify/prettify.js",402,25,"charSet"] +["./prettify/prettify.js",402,43] +["./prettify/prettify.js",402,46,"length"] +["./prettify/prettify.js",402,46,"charSet"] +["./prettify/prettify.js",402,63] +["./prettify/prettify.js",403,20] +["./prettify/prettify.js",403,14,"RegExp"] +["./prettify/prettify.js",410,14] +["./prettify/prettify.js",411,14] +["./prettify/prettify.js",412,10,"groups"] +["./prettify/prettify.js",412,10,"groups"] +["./prettify/prettify.js",412,19] +["./prettify/prettify.js",415,6] +["./prettify/prettify.js",413,6] +["./prettify/prettify.js",413,10,"ranges"] +["./prettify/prettify.js",413,19] +["./prettify/prettify.js",414,10,"inverse"] +["./prettify/prettify.js",414,20] +["./prettify/prettify.js",414,20,"charsetParts"] +["./prettify/prettify.js",414,33] +["./prettify/prettify.js",414,40] +["./prettify/prettify.js",415,15,"i"] +["./prettify/prettify.js",415,19] +["./prettify/prettify.js",415,19,"inverse"] +["./prettify/prettify.js",415,29] +["./prettify/prettify.js",415,33] +["./prettify/prettify.js",415,36,"n"] +["./prettify/prettify.js",415,40,"length"] +["./prettify/prettify.js",415,40,"charsetParts"] +["./prettify/prettify.js",415,61,"i"] +["./prettify/prettify.js",415,65,"n"] +["./prettify/prettify.js",415,68] +["./prettify/prettify.js",415,70,"i"] +["./prettify/prettify.js",415,73] +["./prettify/prettify.js",416,8] +["./prettify/prettify.js",416,12,"p"] +["./prettify/prettify.js",416,16] +["./prettify/prettify.js",416,16,"charsetParts"] +["./prettify/prettify.js",416,29,"i"] +["./prettify/prettify.js",417,8] +["./prettify/prettify.js",417,16,"p"] +["./prettify/prettify.js",418,10] +["./prettify/prettify.js",418,15] +["./prettify/prettify.js",418,10] +["./prettify/prettify.js",418,22] +["./prettify/prettify.js",418,27] +["./prettify/prettify.js",418,22] +["./prettify/prettify.js",419,10] +["./prettify/prettify.js",419,15] +["./prettify/prettify.js",419,10] +["./prettify/prettify.js",419,22] +["./prettify/prettify.js",419,27] +["./prettify/prettify.js",419,22] +["./prettify/prettify.js",420,10] +["./prettify/prettify.js",420,15] +["./prettify/prettify.js",420,10] +["./prettify/prettify.js",420,22] +["./prettify/prettify.js",420,27] +["./prettify/prettify.js",420,22] +["./prettify/prettify.js",421,10] +["./prettify/prettify.js",421,15] +["./prettify/prettify.js",421,10] +["./prettify/prettify.js",421,22] +["./prettify/prettify.js",421,27] +["./prettify/prettify.js",421,22] +["./prettify/prettify.js",422,12] +["./prettify/prettify.js",422,23] +["./prettify/prettify.js",422,12,"push"] +["./prettify/prettify.js",422,12,"groups"] +["./prettify/prettify.js",422,24,"p"] +["./prettify/prettify.js",423,12] +["./prettify/prettify.js",425,12,"start"] +["./prettify/prettify.js",425,12,"start"] +["./prettify/prettify.js",425,32] +["./prettify/prettify.js",425,20,"decodeEscape"] +["./prettify/prettify.js",425,33,"p"] +["./prettify/prettify.js",426,8] +["./prettify/prettify.js",426,12,"end"] +["./prettify/prettify.js",427,8] +["./prettify/prettify.js",427,12,"i"] +["./prettify/prettify.js",427,16] +["./prettify/prettify.js",427,20,"n"] +["./prettify/prettify.js",427,25] +["./prettify/prettify.js",427,33] +["./prettify/prettify.js",427,33,"charsetParts"] +["./prettify/prettify.js",427,46,"i"] +["./prettify/prettify.js",427,50] +["./prettify/prettify.js",427,54] +["./prettify/prettify.js",428,10] +["./prettify/prettify.js",428,10,"end"] +["./prettify/prettify.js",428,28] +["./prettify/prettify.js",428,16,"decodeEscape"] +["./prettify/prettify.js",428,29] +["./prettify/prettify.js",428,29,"charsetParts"] +["./prettify/prettify.js",428,42,"i"] +["./prettify/prettify.js",428,46] +["./prettify/prettify.js",429,10] +["./prettify/prettify.js",429,10,"i"] +["./prettify/prettify.js",429,15] +["./prettify/prettify.js",431,10] +["./prettify/prettify.js",431,10,"end"] +["./prettify/prettify.js",431,16,"start"] +["./prettify/prettify.js",433,8] +["./prettify/prettify.js",433,19] +["./prettify/prettify.js",433,8,"push"] +["./prettify/prettify.js",433,8,"ranges"] +["./prettify/prettify.js",433,20] +["./prettify/prettify.js",433,21,"start"] +["./prettify/prettify.js",433,28,"end"] +["./prettify/prettify.js",435,8] +["./prettify/prettify.js",435,12] +["./prettify/prettify.js",435,14,"end"] +["./prettify/prettify.js",435,20] +["./prettify/prettify.js",435,26,"start"] +["./prettify/prettify.js",435,34] +["./prettify/prettify.js",435,40] +["./prettify/prettify.js",436,10] +["./prettify/prettify.js",436,16,"end"] +["./prettify/prettify.js",436,22] +["./prettify/prettify.js",436,28,"start"] +["./prettify/prettify.js",436,36] +["./prettify/prettify.js",437,23] +["./prettify/prettify.js",437,12,"push"] +["./prettify/prettify.js",437,12,"ranges"] +["./prettify/prettify.js",437,24] +["./prettify/prettify.js",437,33] +["./prettify/prettify.js",437,25,"max"] +["./prettify/prettify.js",437,25,"Math"] +["./prettify/prettify.js",437,34] +["./prettify/prettify.js",437,38,"start"] +["./prettify/prettify.js",437,47] +["./prettify/prettify.js",437,59] +["./prettify/prettify.js",437,51,"min"] +["./prettify/prettify.js",437,51,"Math"] +["./prettify/prettify.js",437,60,"end"] +["./prettify/prettify.js",437,65] +["./prettify/prettify.js",437,71] +["./prettify/prettify.js",439,10] +["./prettify/prettify.js",439,16,"end"] +["./prettify/prettify.js",439,22] +["./prettify/prettify.js",439,28,"start"] +["./prettify/prettify.js",439,36] +["./prettify/prettify.js",440,23] +["./prettify/prettify.js",440,12,"push"] +["./prettify/prettify.js",440,12,"ranges"] +["./prettify/prettify.js",440,24] +["./prettify/prettify.js",440,33] +["./prettify/prettify.js",440,25,"max"] +["./prettify/prettify.js",440,25,"Math"] +["./prettify/prettify.js",440,34] +["./prettify/prettify.js",440,38,"start"] +["./prettify/prettify.js",440,47] +["./prettify/prettify.js",440,60] +["./prettify/prettify.js",440,52,"min"] +["./prettify/prettify.js",440,52,"Math"] +["./prettify/prettify.js",440,61,"end"] +["./prettify/prettify.js",440,66] +["./prettify/prettify.js",440,73] +["./prettify/prettify.js",447,6] +["./prettify/prettify.js",447,17] +["./prettify/prettify.js",447,6,"sort"] +["./prettify/prettify.js",447,6,"ranges"] +["./prettify/prettify.js",447,27] +["./prettify/prettify.js",447,27,""] +["./prettify/prettify.js",447,27] +["./prettify/prettify.js",447,28,"a"] +["./prettify/prettify.js",447,31,"b"] +["./prettify/prettify.js",447,34] +["./prettify/prettify.js",447,36] +["./prettify/prettify.js",447,44] +["./prettify/prettify.js",447,44,"a"] +["./prettify/prettify.js",447,46] +["./prettify/prettify.js",447,51] +["./prettify/prettify.js",447,51,"b"] +["./prettify/prettify.js",447,53] +["./prettify/prettify.js",447,61] +["./prettify/prettify.js",447,61,"b"] +["./prettify/prettify.js",447,63] +["./prettify/prettify.js",447,69] +["./prettify/prettify.js",447,69,"a"] +["./prettify/prettify.js",447,71] +["./prettify/prettify.js",448,10,"consolidatedRanges"] +["./prettify/prettify.js",448,10,"consolidatedRanges"] +["./prettify/prettify.js",448,31] +["./prettify/prettify.js",449,10,"lastRange"] +["./prettify/prettify.js",449,10,"lastRange"] +["./prettify/prettify.js",449,22] +["./prettify/prettify.js",449,23,"NaN"] +["./prettify/prettify.js",449,28,"NaN"] +["./prettify/prettify.js",450,6] +["./prettify/prettify.js",450,15,"i"] +["./prettify/prettify.js",450,19] +["./prettify/prettify.js",450,22,"i"] +["./prettify/prettify.js",450,26,"length"] +["./prettify/prettify.js",450,26,"ranges"] +["./prettify/prettify.js",450,41] +["./prettify/prettify.js",450,43,"i"] +["./prettify/prettify.js",450,46] +["./prettify/prettify.js",451,12,"range"] +["./prettify/prettify.js",451,12,"range"] +["./prettify/prettify.js",451,20] +["./prettify/prettify.js",451,20,"ranges"] +["./prettify/prettify.js",451,27,"i"] +["./prettify/prettify.js",452,8] +["./prettify/prettify.js",452,12] +["./prettify/prettify.js",452,12,"range"] +["./prettify/prettify.js",452,18] +["./prettify/prettify.js",452,24] +["./prettify/prettify.js",452,24,"lastRange"] +["./prettify/prettify.js",452,34] +["./prettify/prettify.js",452,39] +["./prettify/prettify.js",453,10] +["./prettify/prettify.js",453,10] +["./prettify/prettify.js",453,10,"lastRange"] +["./prettify/prettify.js",453,20] +["./prettify/prettify.js",453,33] +["./prettify/prettify.js",453,25,"max"] +["./prettify/prettify.js",453,25,"Math"] +["./prettify/prettify.js",453,34] +["./prettify/prettify.js",453,34,"lastRange"] +["./prettify/prettify.js",453,44] +["./prettify/prettify.js",453,48] +["./prettify/prettify.js",453,48,"range"] +["./prettify/prettify.js",453,54] +["./prettify/prettify.js",455,10] +["./prettify/prettify.js",455,33] +["./prettify/prettify.js",455,10,"push"] +["./prettify/prettify.js",455,10,"consolidatedRanges"] +["./prettify/prettify.js",455,34,"lastRange"] +["./prettify/prettify.js",455,46,"range"] +["./prettify/prettify.js",459,10,"out"] +["./prettify/prettify.js",459,10,"out"] +["./prettify/prettify.js",459,16] +["./prettify/prettify.js",459,17] +["./prettify/prettify.js",460,6] +["./prettify/prettify.js",460,10,"inverse"] +["./prettify/prettify.js",460,29] +["./prettify/prettify.js",460,21,"push"] +["./prettify/prettify.js",460,21,"out"] +["./prettify/prettify.js",460,30] +["./prettify/prettify.js",461,6] +["./prettify/prettify.js",461,20] +["./prettify/prettify.js",461,6,"apply"] +["./prettify/prettify.js",461,6,"push"] +["./prettify/prettify.js",461,6,"out"] +["./prettify/prettify.js",461,21,"out"] +["./prettify/prettify.js",461,26,"groups"] +["./prettify/prettify.js",462,6] +["./prettify/prettify.js",462,15,"i"] +["./prettify/prettify.js",462,19] +["./prettify/prettify.js",462,22,"i"] +["./prettify/prettify.js",462,26,"length"] +["./prettify/prettify.js",462,26,"consolidatedRanges"] +["./prettify/prettify.js",462,53] +["./prettify/prettify.js",462,55,"i"] +["./prettify/prettify.js",462,58] +["./prettify/prettify.js",463,8] +["./prettify/prettify.js",463,12,"range"] +["./prettify/prettify.js",463,20] +["./prettify/prettify.js",463,20,"consolidatedRanges"] +["./prettify/prettify.js",463,39,"i"] +["./prettify/prettify.js",464,8] +["./prettify/prettify.js",464,16] +["./prettify/prettify.js",464,8,"push"] +["./prettify/prettify.js",464,8,"out"] +["./prettify/prettify.js",464,29] +["./prettify/prettify.js",464,17,"encodeEscape"] +["./prettify/prettify.js",464,30] +["./prettify/prettify.js",464,30,"range"] +["./prettify/prettify.js",464,36] +["./prettify/prettify.js",465,8] +["./prettify/prettify.js",465,12] +["./prettify/prettify.js",465,12,"range"] +["./prettify/prettify.js",465,18] +["./prettify/prettify.js",465,23] +["./prettify/prettify.js",465,23,"range"] +["./prettify/prettify.js",465,29] +["./prettify/prettify.js",465,33] +["./prettify/prettify.js",466,10] +["./prettify/prettify.js",466,14] +["./prettify/prettify.js",466,14,"range"] +["./prettify/prettify.js",466,20] +["./prettify/prettify.js",466,25] +["./prettify/prettify.js",466,29] +["./prettify/prettify.js",466,29,"range"] +["./prettify/prettify.js",466,35] +["./prettify/prettify.js",466,49] +["./prettify/prettify.js",466,41,"push"] +["./prettify/prettify.js",466,41,"out"] +["./prettify/prettify.js",466,50] +["./prettify/prettify.js",467,10] +["./prettify/prettify.js",467,18] +["./prettify/prettify.js",467,10,"push"] +["./prettify/prettify.js",467,10,"out"] +["./prettify/prettify.js",467,31] +["./prettify/prettify.js",467,19,"encodeEscape"] +["./prettify/prettify.js",467,32] +["./prettify/prettify.js",467,32,"range"] +["./prettify/prettify.js",467,38] +["./prettify/prettify.js",470,6] +["./prettify/prettify.js",470,14] +["./prettify/prettify.js",470,6,"push"] +["./prettify/prettify.js",470,6,"out"] +["./prettify/prettify.js",470,15] +["./prettify/prettify.js",471,6] +["./prettify/prettify.js",471,21] +["./prettify/prettify.js",471,13,"join"] +["./prettify/prettify.js",471,13,"out"] +["./prettify/prettify.js",471,22] +["./prettify/prettify.js",474,13] +["./prettify/prettify.js",474,13,"allowAnywhereFoldCaseAndRenumberGroups"] +["./prettify/prettify.js",474,51] +["./prettify/prettify.js",474,52,"regex"] +["./prettify/prettify.js",474,59] +["./prettify/prettify.js",500,6] +["./prettify/prettify.js",478,6] +["./prettify/prettify.js",478,10,"parts"] +["./prettify/prettify.js",478,36] +["./prettify/prettify.js",478,18,"match"] +["./prettify/prettify.js",478,18,"source"] +["./prettify/prettify.js",478,18,"regex"] +["./prettify/prettify.js",479,20] +["./prettify/prettify.js",479,14,"RegExp"] +["./prettify/prettify.js",489,14] +["./prettify/prettify.js",490,14] +["./prettify/prettify.js",491,10,"n"] +["./prettify/prettify.js",491,14,"length"] +["./prettify/prettify.js",491,14,"parts"] +["./prettify/prettify.js",496,10,"capturedGroups"] +["./prettify/prettify.js",496,27] +["./prettify/prettify.js",500,15,"i"] +["./prettify/prettify.js",500,19] +["./prettify/prettify.js",500,22,"groupIndex"] +["./prettify/prettify.js",500,35] +["./prettify/prettify.js",500,38,"i"] +["./prettify/prettify.js",500,42,"n"] +["./prettify/prettify.js",500,45] +["./prettify/prettify.js",500,47,"i"] +["./prettify/prettify.js",500,50] +["./prettify/prettify.js",501,8] +["./prettify/prettify.js",501,12,"p"] +["./prettify/prettify.js",501,16] +["./prettify/prettify.js",501,16,"parts"] +["./prettify/prettify.js",501,22,"i"] +["./prettify/prettify.js",502,8] +["./prettify/prettify.js",502,12,"p"] +["./prettify/prettify.js",502,18] +["./prettify/prettify.js",504,10] +["./prettify/prettify.js",504,10] +["./prettify/prettify.js",504,12,"groupIndex"] +["./prettify/prettify.js",505,15] +["./prettify/prettify.js",505,19] +["./prettify/prettify.js",505,36] +["./prettify/prettify.js",505,28,"charAt"] +["./prettify/prettify.js",505,28,"p"] +["./prettify/prettify.js",505,37] +["./prettify/prettify.js",507,10] +["./prettify/prettify.js",506,14,"decimalValue"] +["./prettify/prettify.js",506,29] +["./prettify/prettify.js",506,41] +["./prettify/prettify.js",506,30,"substring"] +["./prettify/prettify.js",506,30,"p"] +["./prettify/prettify.js",506,42] +["./prettify/prettify.js",507,30,"decimalValue"] +["./prettify/prettify.js",507,46,"groupIndex"] +["./prettify/prettify.js",508,12] +["./prettify/prettify.js",508,12] +["./prettify/prettify.js",508,12,"capturedGroups"] +["./prettify/prettify.js",508,27,"decimalValue"] +["./prettify/prettify.js",508,43] +["./prettify/prettify.js",515,6] +["./prettify/prettify.js",515,15,"i"] +["./prettify/prettify.js",515,19] +["./prettify/prettify.js",515,22,"i"] +["./prettify/prettify.js",515,26,"length"] +["./prettify/prettify.js",515,26,"capturedGroups"] +["./prettify/prettify.js",515,49] +["./prettify/prettify.js",515,51,"i"] +["./prettify/prettify.js",516,8] +["./prettify/prettify.js",516,12] +["./prettify/prettify.js",516,19] +["./prettify/prettify.js",516,19,"capturedGroups"] +["./prettify/prettify.js",516,34,"i"] +["./prettify/prettify.js",517,10] +["./prettify/prettify.js",517,10] +["./prettify/prettify.js",517,10,"capturedGroups"] +["./prettify/prettify.js",517,25,"i"] +["./prettify/prettify.js",517,30] +["./prettify/prettify.js",517,32,"capturedGroupIndex"] +["./prettify/prettify.js",520,6] +["./prettify/prettify.js",520,22,"groupIndex"] +["./prettify/prettify.js",520,15,"i"] +["./prettify/prettify.js",520,19] +["./prettify/prettify.js",520,38,"i"] +["./prettify/prettify.js",520,42,"n"] +["./prettify/prettify.js",520,45] +["./prettify/prettify.js",520,47,"i"] +["./prettify/prettify.js",520,50] +["./prettify/prettify.js",521,8] +["./prettify/prettify.js",521,12,"p"] +["./prettify/prettify.js",521,16] +["./prettify/prettify.js",521,16,"parts"] +["./prettify/prettify.js",521,22,"i"] +["./prettify/prettify.js",522,8] +["./prettify/prettify.js",522,12,"p"] +["./prettify/prettify.js",522,18] +["./prettify/prettify.js",522,23] +["./prettify/prettify.js",523,10] +["./prettify/prettify.js",523,10] +["./prettify/prettify.js",523,12,"groupIndex"] +["./prettify/prettify.js",524,10] +["./prettify/prettify.js",524,14] +["./prettify/prettify.js",524,14,"capturedGroups"] +["./prettify/prettify.js",524,29,"groupIndex"] +["./prettify/prettify.js",524,45,"undefined"] +["./prettify/prettify.js",525,12] +["./prettify/prettify.js",525,12] +["./prettify/prettify.js",525,12,"parts"] +["./prettify/prettify.js",525,18,"i"] +["./prettify/prettify.js",525,23] +["./prettify/prettify.js",527,15] +["./prettify/prettify.js",527,19] +["./prettify/prettify.js",527,36] +["./prettify/prettify.js",527,28,"charAt"] +["./prettify/prettify.js",527,28,"p"] +["./prettify/prettify.js",527,37] +["./prettify/prettify.js",529,10] +["./prettify/prettify.js",528,14,"decimalValue"] +["./prettify/prettify.js",528,29] +["./prettify/prettify.js",528,41] +["./prettify/prettify.js",528,30,"substring"] +["./prettify/prettify.js",528,30,"p"] +["./prettify/prettify.js",528,42] +["./prettify/prettify.js",529,30,"decimalValue"] +["./prettify/prettify.js",529,46,"groupIndex"] +["./prettify/prettify.js",530,12] +["./prettify/prettify.js",530,12] +["./prettify/prettify.js",530,12,"parts"] +["./prettify/prettify.js",530,18,"i"] +["./prettify/prettify.js",530,23] +["./prettify/prettify.js",530,30] +["./prettify/prettify.js",530,30,"capturedGroups"] +["./prettify/prettify.js",530,45,"groupIndex"] +["./prettify/prettify.js",537,6] +["./prettify/prettify.js",537,22,"groupIndex"] +["./prettify/prettify.js",537,15,"i"] +["./prettify/prettify.js",537,19] +["./prettify/prettify.js",537,38,"i"] +["./prettify/prettify.js",537,42,"n"] +["./prettify/prettify.js",537,45] +["./prettify/prettify.js",537,47,"i"] +["./prettify/prettify.js",538,8] +["./prettify/prettify.js",538,12] +["./prettify/prettify.js",538,20] +["./prettify/prettify.js",538,20,"parts"] +["./prettify/prettify.js",538,26,"i"] +["./prettify/prettify.js",538,32] +["./prettify/prettify.js",538,40] +["./prettify/prettify.js",538,40,"parts"] +["./prettify/prettify.js",538,46,"i"] +["./prettify/prettify.js",538,50] +["./prettify/prettify.js",538,56] +["./prettify/prettify.js",538,56] +["./prettify/prettify.js",538,56,"parts"] +["./prettify/prettify.js",538,62,"i"] +["./prettify/prettify.js",538,67] +["./prettify/prettify.js",543,6] +["./prettify/prettify.js",543,10,"ignoreCase"] +["./prettify/prettify.js",543,10,"regex"] +["./prettify/prettify.js",543,30,"needToFoldCase"] +["./prettify/prettify.js",544,8] +["./prettify/prettify.js",544,17,"i"] +["./prettify/prettify.js",544,21] +["./prettify/prettify.js",544,24,"i"] +["./prettify/prettify.js",544,28,"n"] +["./prettify/prettify.js",544,31] +["./prettify/prettify.js",544,33,"i"] +["./prettify/prettify.js",544,36] +["./prettify/prettify.js",545,10] +["./prettify/prettify.js",545,14,"p"] +["./prettify/prettify.js",545,18] +["./prettify/prettify.js",545,18,"parts"] +["./prettify/prettify.js",545,24,"i"] +["./prettify/prettify.js",546,14,"ch0"] +["./prettify/prettify.js",546,14,"ch0"] +["./prettify/prettify.js",546,28] +["./prettify/prettify.js",546,20,"charAt"] +["./prettify/prettify.js",546,20,"p"] +["./prettify/prettify.js",546,29] +["./prettify/prettify.js",547,10] +["./prettify/prettify.js",547,14,"length"] +["./prettify/prettify.js",547,14,"p"] +["./prettify/prettify.js",547,26] +["./prettify/prettify.js",547,31,"ch0"] +["./prettify/prettify.js",547,39] +["./prettify/prettify.js",548,12] +["./prettify/prettify.js",548,12] +["./prettify/prettify.js",548,12,"parts"] +["./prettify/prettify.js",548,18,"i"] +["./prettify/prettify.js",548,38] +["./prettify/prettify.js",548,23,"caseFoldCharset"] +["./prettify/prettify.js",548,39,"p"] +["./prettify/prettify.js",549,17] +["./prettify/prettify.js",549,21,"ch0"] +["./prettify/prettify.js",549,29] +["./prettify/prettify.js",551,12] +["./prettify/prettify.js",551,12] +["./prettify/prettify.js",551,12,"parts"] +["./prettify/prettify.js",551,18,"i"] +["./prettify/prettify.js",551,32] +["./prettify/prettify.js",551,23,"replace"] +["./prettify/prettify.js",551,23,"p"] +["./prettify/prettify.js",552,16] +["./prettify/prettify.js",553,25] +["./prettify/prettify.js",553,25,""] +["./prettify/prettify.js",553,25] +["./prettify/prettify.js",553,26,"ch"] +["./prettify/prettify.js",553,30] +["./prettify/prettify.js",554,22,"cc"] +["./prettify/prettify.js",554,22,"cc"] +["./prettify/prettify.js",554,40] +["./prettify/prettify.js",554,27,"charCodeAt"] +["./prettify/prettify.js",554,27,"ch"] +["./prettify/prettify.js",554,41] +["./prettify/prettify.js",555,18] +["./prettify/prettify.js",555,25] +["./prettify/prettify.js",555,50] +["./prettify/prettify.js",555,31,"fromCharCode"] +["./prettify/prettify.js",555,31,"String"] +["./prettify/prettify.js",555,51,"cc"] +["./prettify/prettify.js",555,56] +["./prettify/prettify.js",555,61,"cc"] +["./prettify/prettify.js",555,66] +["./prettify/prettify.js",555,72] +["./prettify/prettify.js",561,6] +["./prettify/prettify.js",561,23] +["./prettify/prettify.js",561,13,"join"] +["./prettify/prettify.js",561,13,"parts"] +["./prettify/prettify.js",561,24] +["./prettify/prettify.js",359,4] +["./prettify/prettify.js",355,4] +["./prettify/prettify.js",355,8,"capturedGroupIndex"] +["./prettify/prettify.js",355,29] +["./prettify/prettify.js",357,8,"needToFoldCase"] +["./prettify/prettify.js",357,25] +["./prettify/prettify.js",358,8,"ignoreCase"] +["./prettify/prettify.js",358,21] +["./prettify/prettify.js",359,13,"i"] +["./prettify/prettify.js",359,17] +["./prettify/prettify.js",359,20,"n"] +["./prettify/prettify.js",359,24,"length"] +["./prettify/prettify.js",359,24,"regexs"] +["./prettify/prettify.js",359,39,"i"] +["./prettify/prettify.js",359,43,"n"] +["./prettify/prettify.js",359,46] +["./prettify/prettify.js",359,48,"i"] +["./prettify/prettify.js",359,51] +["./prettify/prettify.js",360,6] +["./prettify/prettify.js",360,10,"regex"] +["./prettify/prettify.js",360,18] +["./prettify/prettify.js",360,18,"regexs"] +["./prettify/prettify.js",360,25,"i"] +["./prettify/prettify.js",361,6] +["./prettify/prettify.js",361,10,"ignoreCase"] +["./prettify/prettify.js",361,10,"regex"] +["./prettify/prettify.js",362,8] +["./prettify/prettify.js",362,8,"ignoreCase"] +["./prettify/prettify.js",362,21] +["./prettify/prettify.js",363,13] +["./prettify/prettify.js",363,30] +["./prettify/prettify.js",363,17,"test"] +["./prettify/prettify.js",363,17] +["./prettify/prettify.js",363,51] +["./prettify/prettify.js",363,31,"replace"] +["./prettify/prettify.js",363,31,"source"] +["./prettify/prettify.js",363,31,"regex"] +["./prettify/prettify.js",364,21] +["./prettify/prettify.js",364,64] +["./prettify/prettify.js",364,70] +["./prettify/prettify.js",365,8] +["./prettify/prettify.js",365,8,"needToFoldCase"] +["./prettify/prettify.js",365,25] +["./prettify/prettify.js",366,8] +["./prettify/prettify.js",366,8,"ignoreCase"] +["./prettify/prettify.js",366,21] +["./prettify/prettify.js",367,8] +["./prettify/prettify.js",564,4] +["./prettify/prettify.js",564,8,"rewritten"] +["./prettify/prettify.js",564,20] +["./prettify/prettify.js",565,13,"i"] +["./prettify/prettify.js",565,17] +["./prettify/prettify.js",565,4] +["./prettify/prettify.js",565,20,"n"] +["./prettify/prettify.js",565,24,"length"] +["./prettify/prettify.js",565,24,"regexs"] +["./prettify/prettify.js",565,39,"i"] +["./prettify/prettify.js",565,43,"n"] +["./prettify/prettify.js",565,46] +["./prettify/prettify.js",565,48,"i"] +["./prettify/prettify.js",565,51] +["./prettify/prettify.js",566,6] +["./prettify/prettify.js",566,10,"regex"] +["./prettify/prettify.js",566,18] +["./prettify/prettify.js",566,18,"regexs"] +["./prettify/prettify.js",566,25,"i"] +["./prettify/prettify.js",567,6] +["./prettify/prettify.js",567,10,"global"] +["./prettify/prettify.js",567,10,"regex"] +["./prettify/prettify.js",567,26,"multiline"] +["./prettify/prettify.js",567,26,"regex"] +["./prettify/prettify.js",567,45] +["./prettify/prettify.js",567,60] +["./prettify/prettify.js",567,55,"Error"] +["./prettify/prettify.js",567,61] +["./prettify/prettify.js",567,66,"regex"] +["./prettify/prettify.js",568,6] +["./prettify/prettify.js",568,20] +["./prettify/prettify.js",568,6,"push"] +["./prettify/prettify.js",568,6,"rewritten"] +["./prettify/prettify.js",569,10] +["./prettify/prettify.js",569,56] +["./prettify/prettify.js",569,18,"allowAnywhereFoldCaseAndRenumberGroups"] +["./prettify/prettify.js",569,57,"regex"] +["./prettify/prettify.js",569,66] +["./prettify/prettify.js",572,4] +["./prettify/prettify.js",572,21] +["./prettify/prettify.js",572,15,"RegExp"] +["./prettify/prettify.js",572,36] +["./prettify/prettify.js",572,22,"join"] +["./prettify/prettify.js",572,22,"rewritten"] +["./prettify/prettify.js",572,37] +["./prettify/prettify.js",572,43] +["./prettify/prettify.js",572,43,"ignoreCase"] +["./prettify/prettify.js",572,56] +["./prettify/prettify.js",572,63] +["./prettify/prettify.js",613,11] +["./prettify/prettify.js",613,11,"makeTabExpander"] +["./prettify/prettify.js",613,26] +["./prettify/prettify.js",613,27,"tabWidth"] +["./prettify/prettify.js",613,37] +["./prettify/prettify.js",615,4] +["./prettify/prettify.js",615,8,"charInLine"] +["./prettify/prettify.js",615,21] +["./prettify/prettify.js",617,4] +["./prettify/prettify.js",617,20] +["./prettify/prettify.js",617,20,""] +["./prettify/prettify.js",617,20] +["./prettify/prettify.js",617,21,"plainText"] +["./prettify/prettify.js",617,32] +["./prettify/prettify.js",623,6] +["./prettify/prettify.js",621,6] +["./prettify/prettify.js",621,10,"out"] +["./prettify/prettify.js",621,16] +["./prettify/prettify.js",622,10,"pos"] +["./prettify/prettify.js",622,16] +["./prettify/prettify.js",623,15,"i"] +["./prettify/prettify.js",623,19] +["./prettify/prettify.js",623,22,"n"] +["./prettify/prettify.js",623,26,"length"] +["./prettify/prettify.js",623,26,"plainText"] +["./prettify/prettify.js",623,44,"i"] +["./prettify/prettify.js",623,48,"n"] +["./prettify/prettify.js",623,51] +["./prettify/prettify.js",623,53,"i"] +["./prettify/prettify.js",626,8] +["./prettify/prettify.js",624,33,"ch"] +["./prettify/prettify.js",624,17,"charAt"] +["./prettify/prettify.js",624,17,"plainText"] +["./prettify/prettify.js",624,34,"i"] +["./prettify/prettify.js",627,10] +["./prettify/prettify.js",627,15] +["./prettify/prettify.js",627,10] +["./prettify/prettify.js",628,12] +["./prettify/prettify.js",628,17,"out"] +["./prettify/prettify.js",628,24,"out"] +["./prettify/prettify.js",628,30] +["./prettify/prettify.js",629,12] +["./prettify/prettify.js",629,20] +["./prettify/prettify.js",629,12,"push"] +["./prettify/prettify.js",629,12,"out"] +["./prettify/prettify.js",629,40] +["./prettify/prettify.js",629,21,"substring"] +["./prettify/prettify.js",629,21,"plainText"] +["./prettify/prettify.js",629,41,"pos"] +["./prettify/prettify.js",629,46,"i"] +["./prettify/prettify.js",634,16,"nSpaces"] +["./prettify/prettify.js",634,16,"nSpaces"] +["./prettify/prettify.js",634,26,"tabWidth"] +["./prettify/prettify.js",634,38,"charInLine"] +["./prettify/prettify.js",634,51,"tabWidth"] +["./prettify/prettify.js",636,12] +["./prettify/prettify.js",635,12,"charInLine"] +["./prettify/prettify.js",635,26,"nSpaces"] +["./prettify/prettify.js",636,19,"nSpaces"] +["./prettify/prettify.js",636,30] +["./prettify/prettify.js",636,33,"nSpaces"] +["./prettify/prettify.js",636,44,"length"] +["./prettify/prettify.js",637,14] +["./prettify/prettify.js",637,22] +["./prettify/prettify.js",637,14,"push"] +["./prettify/prettify.js",637,14,"out"] +["./prettify/prettify.js",637,39] +["./prettify/prettify.js",637,23,"substring"] +["./prettify/prettify.js",614,17,"SPACES"] +["./prettify/prettify.js",637,40] +["./prettify/prettify.js",637,43,"nSpaces"] +["./prettify/prettify.js",639,12] +["./prettify/prettify.js",639,12,"pos"] +["./prettify/prettify.js",639,18,"i"] +["./prettify/prettify.js",639,22] +["./prettify/prettify.js",640,12] +["./prettify/prettify.js",641,10] +["./prettify/prettify.js",641,15] +["./prettify/prettify.js",641,10] +["./prettify/prettify.js",642,12] +["./prettify/prettify.js",642,12,"charInLine"] +["./prettify/prettify.js",642,25] +["./prettify/prettify.js",643,12] +["./prettify/prettify.js",644,10] +["./prettify/prettify.js",644,10] +["./prettify/prettify.js",645,12] +["./prettify/prettify.js",645,12] +["./prettify/prettify.js",645,14,"charInLine"] +["./prettify/prettify.js",648,6] +["./prettify/prettify.js",648,10] +["./prettify/prettify.js",648,11,"out"] +["./prettify/prettify.js",648,18] +["./prettify/prettify.js",648,25,"plainText"] +["./prettify/prettify.js",649,6] +["./prettify/prettify.js",649,14] +["./prettify/prettify.js",649,6,"push"] +["./prettify/prettify.js",649,6,"out"] +["./prettify/prettify.js",649,34] +["./prettify/prettify.js",649,15,"substring"] +["./prettify/prettify.js",649,15,"plainText"] +["./prettify/prettify.js",649,35,"pos"] +["./prettify/prettify.js",650,6] +["./prettify/prettify.js",650,21] +["./prettify/prettify.js",650,13,"join"] +["./prettify/prettify.js",650,13,"out"] +["./prettify/prettify.js",650,22] +["./prettify/prettify.js",753,11] +["./prettify/prettify.js",753,11,"appendDecorations"] +["./prettify/prettify.js",753,28] +["./prettify/prettify.js",753,29,"basePos"] +["./prettify/prettify.js",753,38,"sourceCode"] +["./prettify/prettify.js",753,50,"langHandler"] +["./prettify/prettify.js",753,63,"out"] +["./prettify/prettify.js",753,68] +["./prettify/prettify.js",754,4] +["./prettify/prettify.js",754,9,"sourceCode"] +["./prettify/prettify.js",754,4] +["./prettify/prettify.js",755,8,"job"] +["./prettify/prettify.js",755,8,"job"] +["./prettify/prettify.js",755,14] +["./prettify/prettify.js",756,14,"sourceCode"] +["./prettify/prettify.js",757,15,"basePos"] +["./prettify/prettify.js",759,4] +["./prettify/prettify.js",759,15] +["./prettify/prettify.js",759,4,"langHandler"] +["./prettify/prettify.js",759,16,"job"] +["./prettify/prettify.js",760,4] +["./prettify/prettify.js",760,18] +["./prettify/prettify.js",760,4,"apply"] +["./prettify/prettify.js",760,4,"push"] +["./prettify/prettify.js",760,4,"out"] +["./prettify/prettify.js",760,19,"out"] +["./prettify/prettify.js",760,24,"decorations"] +["./prettify/prettify.js",760,24,"job"] +["./prettify/prettify.js",809,11] +["./prettify/prettify.js",809,11,"createSimpleLexer"] +["./prettify/prettify.js",809,28] +["./prettify/prettify.js",809,29,"shortcutStylePatterns"] +["./prettify/prettify.js",809,52,"fallthroughStylePatterns"] +["./prettify/prettify.js",809,78] +["./prettify/prettify.js",810,4] +["./prettify/prettify.js",810,8,"shortcuts"] +["./prettify/prettify.js",810,20] +["./prettify/prettify.js",811,8,"tokenizer"] +["./prettify/prettify.js",812,5] +["./prettify/prettify.js",833,6] +["./prettify/prettify.js",812,14] +["./prettify/prettify.js",812,14,""] +["./prettify/prettify.js",812,14] +["./prettify/prettify.js",812,17] +["./prettify/prettify.js",816,6] +["./prettify/prettify.js",813,6] +["./prettify/prettify.js",813,10,"allPatterns"] +["./prettify/prettify.js",813,52] +["./prettify/prettify.js",813,24,"concat"] +["./prettify/prettify.js",813,24,"shortcutStylePatterns"] +["./prettify/prettify.js",813,53,"fallthroughStylePatterns"] +["./prettify/prettify.js",814,10,"allRegexs"] +["./prettify/prettify.js",814,22] +["./prettify/prettify.js",815,10,"regexKeys"] +["./prettify/prettify.js",815,22] +["./prettify/prettify.js",816,15,"i"] +["./prettify/prettify.js",816,19] +["./prettify/prettify.js",816,22,"n"] +["./prettify/prettify.js",816,26,"length"] +["./prettify/prettify.js",816,26,"allPatterns"] +["./prettify/prettify.js",816,46,"i"] +["./prettify/prettify.js",816,50,"n"] +["./prettify/prettify.js",816,53] +["./prettify/prettify.js",816,55,"i"] +["./prettify/prettify.js",816,58] +["./prettify/prettify.js",817,8] +["./prettify/prettify.js",817,12,"patternParts"] +["./prettify/prettify.js",817,27] +["./prettify/prettify.js",817,27,"allPatterns"] +["./prettify/prettify.js",817,39,"i"] +["./prettify/prettify.js",818,12,"shortcutChars"] +["./prettify/prettify.js",818,28] +["./prettify/prettify.js",818,28,"patternParts"] +["./prettify/prettify.js",818,41] +["./prettify/prettify.js",819,8] +["./prettify/prettify.js",819,12,"shortcutChars"] +["./prettify/prettify.js",820,10] +["./prettify/prettify.js",820,15] +["./prettify/prettify.js",820,19,"c"] +["./prettify/prettify.js",820,23,"length"] +["./prettify/prettify.js",820,23,"shortcutChars"] +["./prettify/prettify.js",820,45] +["./prettify/prettify.js",820,47,"c"] +["./prettify/prettify.js",820,52] +["./prettify/prettify.js",820,54] +["./prettify/prettify.js",821,12] +["./prettify/prettify.js",821,12] +["./prettify/prettify.js",821,12,"shortcuts"] +["./prettify/prettify.js",821,42] +["./prettify/prettify.js",821,22,"charAt"] +["./prettify/prettify.js",821,22,"shortcutChars"] +["./prettify/prettify.js",821,43,"c"] +["./prettify/prettify.js",821,49,"patternParts"] +["./prettify/prettify.js",824,12,"regex"] +["./prettify/prettify.js",824,12,"regex"] +["./prettify/prettify.js",824,20] +["./prettify/prettify.js",824,20,"patternParts"] +["./prettify/prettify.js",824,33] +["./prettify/prettify.js",825,12,"k"] +["./prettify/prettify.js",825,12,"k"] +["./prettify/prettify.js",825,16] +["./prettify/prettify.js",825,21,"regex"] +["./prettify/prettify.js",826,8] +["./prettify/prettify.js",826,12] +["./prettify/prettify.js",826,37] +["./prettify/prettify.js",826,13,"hasOwnProperty"] +["./prettify/prettify.js",826,13,"regexKeys"] +["./prettify/prettify.js",826,38,"k"] +["./prettify/prettify.js",826,42] +["./prettify/prettify.js",827,10] +["./prettify/prettify.js",827,24] +["./prettify/prettify.js",827,10,"push"] +["./prettify/prettify.js",827,10,"allRegexs"] +["./prettify/prettify.js",827,25,"regex"] +["./prettify/prettify.js",828,10] +["./prettify/prettify.js",828,10] +["./prettify/prettify.js",828,10,"regexKeys"] +["./prettify/prettify.js",828,20,"k"] +["./prettify/prettify.js",828,25] +["./prettify/prettify.js",831,6] +["./prettify/prettify.js",831,20] +["./prettify/prettify.js",831,6,"push"] +["./prettify/prettify.js",831,6,"allRegexs"] +["./prettify/prettify.js",831,21] +["./prettify/prettify.js",832,6] +["./prettify/prettify.js",832,6,"tokenizer"] +["./prettify/prettify.js",832,39] +["./prettify/prettify.js",832,18,"combinePrefixPatterns"] +["./prettify/prettify.js",832,40,"allRegexs"] +["./prettify/prettify.js",835,4] +["./prettify/prettify.js",835,8,"nPatterns"] +["./prettify/prettify.js",835,20,"length"] +["./prettify/prettify.js",835,20,"fallthroughStylePatterns"] +["./prettify/prettify.js",849,8,"decorate"] +["./prettify/prettify.js",849,28] +["./prettify/prettify.js",849,28,""] +["./prettify/prettify.js",849,28] +["./prettify/prettify.js",849,29,"job"] +["./prettify/prettify.js",849,34] +["./prettify/prettify.js",862,6] +["./prettify/prettify.js",850,6] +["./prettify/prettify.js",850,35,"basePos"] +["./prettify/prettify.js",850,45,"basePos"] +["./prettify/prettify.js",850,45,"job"] +["./prettify/prettify.js",856,10,"decorations"] +["./prettify/prettify.js",856,24] +["./prettify/prettify.js",856,25,"basePos"] +["./prettify/prettify.js",856,34,"PR_PLAIN"] +["./prettify/prettify.js",857,10,"pos"] +["./prettify/prettify.js",857,16] +["./prettify/prettify.js",858,10,"tokens"] +["./prettify/prettify.js",858,35] +["./prettify/prettify.js",858,19,"match"] +["./prettify/prettify.js",850,23,"source"] +["./prettify/prettify.js",850,23,"job"] +["./prettify/prettify.js",858,36,"tokenizer"] +["./prettify/prettify.js",858,50] +["./prettify/prettify.js",859,10,"styleCache"] +["./prettify/prettify.js",859,23] +["./prettify/prettify.js",862,15,"ti"] +["./prettify/prettify.js",862,20] +["./prettify/prettify.js",862,23,"nTokens"] +["./prettify/prettify.js",862,33,"length"] +["./prettify/prettify.js",862,33,"tokens"] +["./prettify/prettify.js",862,48,"ti"] +["./prettify/prettify.js",862,53,"nTokens"] +["./prettify/prettify.js",862,62] +["./prettify/prettify.js",862,64,"ti"] +["./prettify/prettify.js",862,68] +["./prettify/prettify.js",863,8] +["./prettify/prettify.js",863,12,"token"] +["./prettify/prettify.js",863,20] +["./prettify/prettify.js",863,20,"tokens"] +["./prettify/prettify.js",863,27,"ti"] +["./prettify/prettify.js",864,12,"style"] +["./prettify/prettify.js",864,20] +["./prettify/prettify.js",864,20,"styleCache"] +["./prettify/prettify.js",864,31,"token"] +["./prettify/prettify.js",865,12,"match"] +["./prettify/prettify.js",865,20] +["./prettify/prettify.js",865,25] +["./prettify/prettify.js",867,12,"isEmbedded"] +["./prettify/prettify.js",868,8] +["./prettify/prettify.js",868,12] +["./prettify/prettify.js",868,19,"style"] +["./prettify/prettify.js",868,29] +["./prettify/prettify.js",869,10] +["./prettify/prettify.js",869,10,"isEmbedded"] +["./prettify/prettify.js",869,23] +["./prettify/prettify.js",870,15] +["./prettify/prettify.js",871,10] +["./prettify/prettify.js",871,14,"patternParts"] +["./prettify/prettify.js",871,29] +["./prettify/prettify.js",871,29,"shortcuts"] +["./prettify/prettify.js",871,51] +["./prettify/prettify.js",871,39,"charAt"] +["./prettify/prettify.js",871,39,"token"] +["./prettify/prettify.js",871,52] +["./prettify/prettify.js",872,10] +["./prettify/prettify.js",872,14,"patternParts"] +["./prettify/prettify.js",872,28] +["./prettify/prettify.js",873,12] +["./prettify/prettify.js",873,12,"match"] +["./prettify/prettify.js",873,31] +["./prettify/prettify.js",873,20,"match"] +["./prettify/prettify.js",873,20,"token"] +["./prettify/prettify.js",873,32] +["./prettify/prettify.js",873,32,"patternParts"] +["./prettify/prettify.js",873,45] +["./prettify/prettify.js",874,12] +["./prettify/prettify.js",874,12,"style"] +["./prettify/prettify.js",874,20] +["./prettify/prettify.js",874,20,"patternParts"] +["./prettify/prettify.js",874,33] +["./prettify/prettify.js",875,17] +["./prettify/prettify.js",876,12] +["./prettify/prettify.js",876,21,"i"] +["./prettify/prettify.js",876,25] +["./prettify/prettify.js",876,28,"i"] +["./prettify/prettify.js",876,32,"nPatterns"] +["./prettify/prettify.js",876,43] +["./prettify/prettify.js",876,45,"i"] +["./prettify/prettify.js",876,48] +["./prettify/prettify.js",877,14] +["./prettify/prettify.js",877,14,"patternParts"] +["./prettify/prettify.js",877,29] +["./prettify/prettify.js",877,29,"fallthroughStylePatterns"] +["./prettify/prettify.js",877,54,"i"] +["./prettify/prettify.js",879,14] +["./prettify/prettify.js",878,14,"match"] +["./prettify/prettify.js",878,33] +["./prettify/prettify.js",878,22,"match"] +["./prettify/prettify.js",878,22,"token"] +["./prettify/prettify.js",878,34] +["./prettify/prettify.js",878,34,"patternParts"] +["./prettify/prettify.js",878,47] +["./prettify/prettify.js",879,25] +["./prettify/prettify.js",880,16] +["./prettify/prettify.js",880,16,"style"] +["./prettify/prettify.js",880,24] +["./prettify/prettify.js",880,24,"patternParts"] +["./prettify/prettify.js",880,37] +["./prettify/prettify.js",881,16] +["./prettify/prettify.js",885,12] +["./prettify/prettify.js",885,17,"match"] +["./prettify/prettify.js",886,14,"style"] +["./prettify/prettify.js",886,22,"PR_PLAIN"] +["./prettify/prettify.js",891,10] +["./prettify/prettify.js",890,10,"isEmbedded"] +["./prettify/prettify.js",890,23,"length"] +["./prettify/prettify.js",890,23,"style"] +["./prettify/prettify.js",890,39] +["./prettify/prettify.js",890,44] +["./prettify/prettify.js",890,71] +["./prettify/prettify.js",890,56,"substring"] +["./prettify/prettify.js",890,56,"style"] +["./prettify/prettify.js",890,72] +["./prettify/prettify.js",890,75] +["./prettify/prettify.js",891,28] +["./prettify/prettify.js",891,30,"match"] +["./prettify/prettify.js",891,39] +["./prettify/prettify.js",891,46] +["./prettify/prettify.js",891,46,"match"] +["./prettify/prettify.js",891,52] +["./prettify/prettify.js",891,59] +["./prettify/prettify.js",891,70] +["./prettify/prettify.js",892,12] +["./prettify/prettify.js",892,12,"isEmbedded"] +["./prettify/prettify.js",892,25] +["./prettify/prettify.js",893,12] +["./prettify/prettify.js",893,12,"style"] +["./prettify/prettify.js",893,20,"PR_SOURCE"] +["./prettify/prettify.js",896,10] +["./prettify/prettify.js",896,15,"isEmbedded"] +["./prettify/prettify.js",896,29] +["./prettify/prettify.js",896,29,"styleCache"] +["./prettify/prettify.js",896,40,"token"] +["./prettify/prettify.js",896,49,"style"] +["./prettify/prettify.js",899,12,"tokenStart"] +["./prettify/prettify.js",899,12,"tokenStart"] +["./prettify/prettify.js",899,25,"pos"] +["./prettify/prettify.js",900,8] +["./prettify/prettify.js",900,8,"pos"] +["./prettify/prettify.js",900,15,"length"] +["./prettify/prettify.js",900,15,"token"] +["./prettify/prettify.js",902,8] +["./prettify/prettify.js",902,13,"isEmbedded"] +["./prettify/prettify.js",904,15] +["./prettify/prettify.js",905,14,"embeddedSource"] +["./prettify/prettify.js",905,14,"embeddedSource"] +["./prettify/prettify.js",905,31] +["./prettify/prettify.js",905,31,"match"] +["./prettify/prettify.js",905,37] +["./prettify/prettify.js",906,10] +["./prettify/prettify.js",906,14,"embeddedSourceStart"] +["./prettify/prettify.js",906,49] +["./prettify/prettify.js",906,36,"indexOf"] +["./prettify/prettify.js",906,36,"token"] +["./prettify/prettify.js",906,50,"embeddedSource"] +["./prettify/prettify.js",907,14,"embeddedSourceEnd"] +["./prettify/prettify.js",907,34,"embeddedSourceStart"] +["./prettify/prettify.js",907,56,"length"] +["./prettify/prettify.js",907,56,"embeddedSource"] +["./prettify/prettify.js",908,10] +["./prettify/prettify.js",908,14] +["./prettify/prettify.js",908,14,"match"] +["./prettify/prettify.js",908,20] +["./prettify/prettify.js",908,24] +["./prettify/prettify.js",912,12] +["./prettify/prettify.js",912,12,"embeddedSourceEnd"] +["./prettify/prettify.js",912,32,"length"] +["./prettify/prettify.js",912,32,"token"] +["./prettify/prettify.js",912,47,"length"] +["./prettify/prettify.js",912,47] +["./prettify/prettify.js",912,47,"match"] +["./prettify/prettify.js",912,53] +["./prettify/prettify.js",913,12] +["./prettify/prettify.js",913,12,"embeddedSourceStart"] +["./prettify/prettify.js",913,34,"embeddedSourceEnd"] +["./prettify/prettify.js",913,54,"length"] +["./prettify/prettify.js",913,54,"embeddedSource"] +["./prettify/prettify.js",915,14,"lang"] +["./prettify/prettify.js",915,14,"lang"] +["./prettify/prettify.js",915,36] +["./prettify/prettify.js",915,21,"substring"] +["./prettify/prettify.js",915,21,"style"] +["./prettify/prettify.js",915,37] +["./prettify/prettify.js",917,10] +["./prettify/prettify.js",917,27] +["./prettify/prettify.js",917,10,"appendDecorations"] +["./prettify/prettify.js",918,14,"basePos"] +["./prettify/prettify.js",918,24,"tokenStart"] +["./prettify/prettify.js",919,29] +["./prettify/prettify.js",919,14,"substring"] +["./prettify/prettify.js",919,14,"token"] +["./prettify/prettify.js",919,30] +["./prettify/prettify.js",919,33,"embeddedSourceStart"] +["./prettify/prettify.js",920,14,"decorate"] +["./prettify/prettify.js",920,24,"decorations"] +["./prettify/prettify.js",922,10] +["./prettify/prettify.js",922,27] +["./prettify/prettify.js",922,10,"appendDecorations"] +["./prettify/prettify.js",923,14,"basePos"] +["./prettify/prettify.js",923,24,"tokenStart"] +["./prettify/prettify.js",923,37,"embeddedSourceStart"] +["./prettify/prettify.js",924,14,"embeddedSource"] +["./prettify/prettify.js",925,37] +["./prettify/prettify.js",925,14,"langHandlerForExtension"] +["./prettify/prettify.js",925,38,"lang"] +["./prettify/prettify.js",925,44,"embeddedSource"] +["./prettify/prettify.js",926,14,"decorations"] +["./prettify/prettify.js",928,10] +["./prettify/prettify.js",928,27] +["./prettify/prettify.js",928,10,"appendDecorations"] +["./prettify/prettify.js",929,14,"basePos"] +["./prettify/prettify.js",929,24,"tokenStart"] +["./prettify/prettify.js",929,37,"embeddedSourceEnd"] +["./prettify/prettify.js",930,29] +["./prettify/prettify.js",930,14,"substring"] +["./prettify/prettify.js",930,14,"token"] +["./prettify/prettify.js",930,30,"embeddedSourceEnd"] +["./prettify/prettify.js",931,14,"decorate"] +["./prettify/prettify.js",931,24,"decorations"] +["./prettify/prettify.js",903,10] +["./prettify/prettify.js",903,26] +["./prettify/prettify.js",903,10,"push"] +["./prettify/prettify.js",903,10,"decorations"] +["./prettify/prettify.js",903,27,"basePos"] +["./prettify/prettify.js",903,37,"tokenStart"] +["./prettify/prettify.js",903,49,"style"] +["./prettify/prettify.js",934,6] +["./prettify/prettify.js",934,6,"decorations"] +["./prettify/prettify.js",934,6,"job"] +["./prettify/prettify.js",934,24,"decorations"] +["./prettify/prettify.js",936,4] +["./prettify/prettify.js",936,11,"decorate"] +["./prettify/prettify.js",954,11] +["./prettify/prettify.js",954,11,"sourceDecorator"] +["./prettify/prettify.js",954,26] +["./prettify/prettify.js",954,27,"options"] +["./prettify/prettify.js",954,36] +["./prettify/prettify.js",955,8,"shortcutStylePatterns"] +["./prettify/prettify.js",955,32] +["./prettify/prettify.js",955,36,"fallthroughStylePatterns"] +["./prettify/prettify.js",955,63] +["./prettify/prettify.js",956,4] +["./prettify/prettify.js",956,8] +["./prettify/prettify.js",956,8,"options"] +["./prettify/prettify.js",958,6] +["./prettify/prettify.js",958,32] +["./prettify/prettify.js",958,6,"push"] +["./prettify/prettify.js",958,6,"shortcutStylePatterns"] +["./prettify/prettify.js",959,10] +["./prettify/prettify.js",959,11,"PR_STRING"] +["./prettify/prettify.js",959,23] +["./prettify/prettify.js",960,11] +["./prettify/prettify.js",960,17] +["./prettify/prettify.js",961,11] +["./prettify/prettify.js",961,11] +["./prettify/prettify.js",961,15] +["./prettify/prettify.js",961,15,"options"] +["./prettify/prettify.js",963,32] +["./prettify/prettify.js",963,6,"push"] +["./prettify/prettify.js",963,6,"shortcutStylePatterns"] +["./prettify/prettify.js",964,10] +["./prettify/prettify.js",964,11,"PR_STRING"] +["./prettify/prettify.js",964,23] +["./prettify/prettify.js",965,11] +["./prettify/prettify.js",965,17] +["./prettify/prettify.js",968,32] +["./prettify/prettify.js",968,6,"push"] +["./prettify/prettify.js",968,6,"shortcutStylePatterns"] +["./prettify/prettify.js",969,10] +["./prettify/prettify.js",969,11,"PR_STRING"] +["./prettify/prettify.js",970,11] +["./prettify/prettify.js",971,11] +["./prettify/prettify.js",971,17] +["./prettify/prettify.js",973,4] +["./prettify/prettify.js",973,8] +["./prettify/prettify.js",973,8,"options"] +["./prettify/prettify.js",975,35] +["./prettify/prettify.js",975,6,"push"] +["./prettify/prettify.js",975,6,"fallthroughStylePatterns"] +["./prettify/prettify.js",976,10] +["./prettify/prettify.js",976,11,"PR_STRING"] +["./prettify/prettify.js",976,22] +["./prettify/prettify.js",976,53] +["./prettify/prettify.js",978,4] +["./prettify/prettify.js",978,8] +["./prettify/prettify.js",978,8,"options"] +["./prettify/prettify.js",979,6] +["./prettify/prettify.js",979,10] +["./prettify/prettify.js",979,10,"options"] +["./prettify/prettify.js",979,37] +["./prettify/prettify.js",981,8] +["./prettify/prettify.js",981,34] +["./prettify/prettify.js",981,8,"push"] +["./prettify/prettify.js",981,8,"shortcutStylePatterns"] +["./prettify/prettify.js",982,12] +["./prettify/prettify.js",982,13,"PR_COMMENT"] +["./prettify/prettify.js",982,25] +["./prettify/prettify.js",983,13] +["./prettify/prettify.js",983,19] +["./prettify/prettify.js",984,8] +["./prettify/prettify.js",984,37] +["./prettify/prettify.js",984,8,"push"] +["./prettify/prettify.js",984,8,"fallthroughStylePatterns"] +["./prettify/prettify.js",985,12] +["./prettify/prettify.js",985,13,"PR_STRING"] +["./prettify/prettify.js",986,13] +["./prettify/prettify.js",987,13] +["./prettify/prettify.js",989,8] +["./prettify/prettify.js",989,34] +["./prettify/prettify.js",989,8,"push"] +["./prettify/prettify.js",989,8,"shortcutStylePatterns"] +["./prettify/prettify.js",989,35] +["./prettify/prettify.js",989,36,"PR_COMMENT"] +["./prettify/prettify.js",989,48] +["./prettify/prettify.js",989,62] +["./prettify/prettify.js",989,68] +["./prettify/prettify.js",992,4] +["./prettify/prettify.js",992,8] +["./prettify/prettify.js",992,8,"options"] +["./prettify/prettify.js",992,35] +["./prettify/prettify.js",993,6] +["./prettify/prettify.js",993,35] +["./prettify/prettify.js",993,6,"push"] +["./prettify/prettify.js",993,6,"fallthroughStylePatterns"] +["./prettify/prettify.js",993,36] +["./prettify/prettify.js",993,37,"PR_COMMENT"] +["./prettify/prettify.js",993,49] +["./prettify/prettify.js",993,66] +["./prettify/prettify.js",994,6] +["./prettify/prettify.js",994,35] +["./prettify/prettify.js",994,6,"push"] +["./prettify/prettify.js",994,6,"fallthroughStylePatterns"] +["./prettify/prettify.js",995,10] +["./prettify/prettify.js",995,11,"PR_COMMENT"] +["./prettify/prettify.js",995,23] +["./prettify/prettify.js",995,50] +["./prettify/prettify.js",997,4] +["./prettify/prettify.js",997,8] +["./prettify/prettify.js",997,8,"options"] +["./prettify/prettify.js",1011,35] +["./prettify/prettify.js",1011,6,"push"] +["./prettify/prettify.js",1011,6,"fallthroughStylePatterns"] +["./prettify/prettify.js",1012,10] +["./prettify/prettify.js",1012,11] +["./prettify/prettify.js",1013,21] +["./prettify/prettify.js",1013,15,"RegExp"] +["./prettify/prettify.js",1013,22] +["./prettify/prettify.js",1013,28,"REGEXP_PRECEDER_PATTERN"] +["./prettify/prettify.js",1013,76] +["./prettify/prettify.js",1017,8,"keywords"] +["./prettify/prettify.js",1017,8,"keywords"] +["./prettify/prettify.js",1017,46] +["./prettify/prettify.js",1017,19,"replace"] +["./prettify/prettify.js",1017,19] +["./prettify/prettify.js",1017,19,"options"] +["./prettify/prettify.js",1017,47] +["./prettify/prettify.js",1017,61] +["./prettify/prettify.js",1018,4] +["./prettify/prettify.js",1018,8,"length"] +["./prettify/prettify.js",1018,8,"keywords"] +["./prettify/prettify.js",1019,35] +["./prettify/prettify.js",1019,6,"push"] +["./prettify/prettify.js",1019,6,"fallthroughStylePatterns"] +["./prettify/prettify.js",1020,10] +["./prettify/prettify.js",1020,11,"PR_KEYWORD"] +["./prettify/prettify.js",1021,21] +["./prettify/prettify.js",1021,15,"RegExp"] +["./prettify/prettify.js",1021,22] +["./prettify/prettify.js",1021,47] +["./prettify/prettify.js",1021,31,"replace"] +["./prettify/prettify.js",1021,31,"keywords"] +["./prettify/prettify.js",1021,48] +["./prettify/prettify.js",1021,56] +["./prettify/prettify.js",1021,63] +["./prettify/prettify.js",1021,72] +["./prettify/prettify.js",1024,4] +["./prettify/prettify.js",1024,30] +["./prettify/prettify.js",1024,4,"push"] +["./prettify/prettify.js",1024,4,"shortcutStylePatterns"] +["./prettify/prettify.js",1024,31] +["./prettify/prettify.js",1024,32,"PR_PLAIN"] +["./prettify/prettify.js",1024,48] +["./prettify/prettify.js",1024,56] +["./prettify/prettify.js",1024,62] +["./prettify/prettify.js",1025,4] +["./prettify/prettify.js",1025,33] +["./prettify/prettify.js",1025,4,"push"] +["./prettify/prettify.js",1025,4,"fallthroughStylePatterns"] +["./prettify/prettify.js",1027,8] +["./prettify/prettify.js",1027,9,"PR_LITERAL"] +["./prettify/prettify.js",1027,25] +["./prettify/prettify.js",1027,51] +["./prettify/prettify.js",1028,8] +["./prettify/prettify.js",1028,9,"PR_TYPE"] +["./prettify/prettify.js",1028,25] +["./prettify/prettify.js",1028,58] +["./prettify/prettify.js",1029,8] +["./prettify/prettify.js",1029,9,"PR_PLAIN"] +["./prettify/prettify.js",1029,25] +["./prettify/prettify.js",1029,50] +["./prettify/prettify.js",1030,8] +["./prettify/prettify.js",1030,9,"PR_LITERAL"] +["./prettify/prettify.js",1031,19] +["./prettify/prettify.js",1042,9] +["./prettify/prettify.js",1042,15] +["./prettify/prettify.js",1043,8] +["./prettify/prettify.js",1043,9,"PR_PUNCTUATION"] +["./prettify/prettify.js",1043,25] +["./prettify/prettify.js",1043,53] +["./prettify/prettify.js",1045,4] +["./prettify/prettify.js",1045,28] +["./prettify/prettify.js",1045,11,"createSimpleLexer"] +["./prettify/prettify.js",1045,29,"shortcutStylePatterns"] +["./prettify/prettify.js",1045,52,"fallthroughStylePatterns"] +["./prettify/prettify.js",1069,11] +["./prettify/prettify.js",1069,11,"recombineTagsAndDecorations"] +["./prettify/prettify.js",1069,38] +["./prettify/prettify.js",1069,39,"job"] +["./prettify/prettify.js",1069,44] +["./prettify/prettify.js",1136,13] +["./prettify/prettify.js",1136,13,"emitTextUpTo"] +["./prettify/prettify.js",1136,25] +["./prettify/prettify.js",1136,26,"sourceIdx"] +["./prettify/prettify.js",1136,37] +["./prettify/prettify.js",1137,6] +["./prettify/prettify.js",1137,10,"sourceIdx"] +["./prettify/prettify.js",1137,22,"outputIdx"] +["./prettify/prettify.js",1137,33] +["./prettify/prettify.js",1138,8] +["./prettify/prettify.js",1138,12,"openDecoration"] +["./prettify/prettify.js",1138,30,"openDecoration"] +["./prettify/prettify.js",1138,49,"currentDecoration"] +["./prettify/prettify.js",1138,68] +["./prettify/prettify.js",1140,10] +["./prettify/prettify.js",1140,19] +["./prettify/prettify.js",1140,10,"push"] +["./prettify/prettify.js",1140,10,"html"] +["./prettify/prettify.js",1140,20] +["./prettify/prettify.js",1141,10] +["./prettify/prettify.js",1141,10,"openDecoration"] +["./prettify/prettify.js",1141,27] +["./prettify/prettify.js",1143,8] +["./prettify/prettify.js",1143,12] +["./prettify/prettify.js",1143,13,"openDecoration"] +["./prettify/prettify.js",1143,31,"currentDecoration"] +["./prettify/prettify.js",1143,50] +["./prettify/prettify.js",1144,10] +["./prettify/prettify.js",1144,10,"openDecoration"] +["./prettify/prettify.js",1144,27,"currentDecoration"] +["./prettify/prettify.js",1145,10] +["./prettify/prettify.js",1145,19] +["./prettify/prettify.js",1145,10,"push"] +["./prettify/prettify.js",1145,10,"html"] +["./prettify/prettify.js",1145,20] +["./prettify/prettify.js",1145,37,"openDecoration"] +["./prettify/prettify.js",1145,53] +["./prettify/prettify.js",1154,8] +["./prettify/prettify.js",1154,12,"htmlChunk"] +["./prettify/prettify.js",1156,20] +["./prettify/prettify.js",1156,24,"replace"] +["./prettify/prettify.js",1154,34] +["./prettify/prettify.js",1154,24,"textToHtml"] +["./prettify/prettify.js",1155,23] +["./prettify/prettify.js",1155,12,"tabExpander"] +["./prettify/prettify.js",1155,44] +["./prettify/prettify.js",1155,24,"substring"] +["./prettify/prettify.js",1155,24,"sourceText"] +["./prettify/prettify.js",1155,45,"outputIdx"] +["./prettify/prettify.js",1155,56,"sourceIdx"] +["./prettify/prettify.js",1157,21] +["./prettify/prettify.js",1156,21,"lastWasSpace"] +["./prettify/prettify.js",1157,23,"startOrSpaceRe"] +["./prettify/prettify.js",1158,23,"adjacentSpaceRe"] +["./prettify/prettify.js",1158,40] +["./prettify/prettify.js",1161,8] +["./prettify/prettify.js",1161,8,"lastWasSpace"] +["./prettify/prettify.js",1161,43] +["./prettify/prettify.js",1161,23,"test"] +["./prettify/prettify.js",1161,23,"trailingSpaceRe"] +["./prettify/prettify.js",1161,44,"htmlChunk"] +["./prettify/prettify.js",1162,8] +["./prettify/prettify.js",1162,17] +["./prettify/prettify.js",1162,8,"push"] +["./prettify/prettify.js",1162,8,"html"] +["./prettify/prettify.js",1162,35] +["./prettify/prettify.js",1162,18,"replace"] +["./prettify/prettify.js",1162,18,"htmlChunk"] +["./prettify/prettify.js",1162,36,"newlineRe"] +["./prettify/prettify.js",1162,47,"lineBreaker"] +["./prettify/prettify.js",1163,8] +["./prettify/prettify.js",1163,8,"outputIdx"] +["./prettify/prettify.js",1163,20,"sourceIdx"] +["./prettify/prettify.js",1070,4] +["./prettify/prettify.js",1070,8,"sourceText"] +["./prettify/prettify.js",1070,21,"source"] +["./prettify/prettify.js",1070,21,"job"] +["./prettify/prettify.js",1071,8,"extractedTags"] +["./prettify/prettify.js",1071,24,"extractedTags"] +["./prettify/prettify.js",1071,24,"job"] +["./prettify/prettify.js",1072,8,"decorations"] +["./prettify/prettify.js",1072,22,"decorations"] +["./prettify/prettify.js",1072,22,"job"] +["./prettify/prettify.js",1074,8,"html"] +["./prettify/prettify.js",1074,15] +["./prettify/prettify.js",1076,8,"outputIdx"] +["./prettify/prettify.js",1076,20] +["./prettify/prettify.js",1078,8,"openDecoration"] +["./prettify/prettify.js",1078,25] +["./prettify/prettify.js",1079,8,"currentDecoration"] +["./prettify/prettify.js",1079,28] +["./prettify/prettify.js",1080,8,"tagPos"] +["./prettify/prettify.js",1080,17] +["./prettify/prettify.js",1081,8,"decPos"] +["./prettify/prettify.js",1081,17] +["./prettify/prettify.js",1082,8,"tabExpander"] +["./prettify/prettify.js",1082,37] +["./prettify/prettify.js",1082,22,"makeTabExpander"] +["./prettify/prettify.js",1082,38] +["./prettify/prettify.js",1082,38,"window"] +["./prettify/prettify.js",1084,8,"adjacentSpaceRe"] +["./prettify/prettify.js",1084,26] +["./prettify/prettify.js",1085,8,"startOrSpaceRe"] +["./prettify/prettify.js",1085,25] +["./prettify/prettify.js",1086,8,"newlineRe"] +["./prettify/prettify.js",1086,20] +["./prettify/prettify.js",1087,8,"trailingSpaceRe"] +["./prettify/prettify.js",1087,26] +["./prettify/prettify.js",1088,8,"lastWasSpace"] +["./prettify/prettify.js",1088,23] +["./prettify/prettify.js",1091,8,"isIE678"] +["./prettify/prettify.js",1091,37] +["./prettify/prettify.js",1091,18] +["./prettify/prettify.js",1091,18,"window"] +["./prettify/prettify.js",1092,8,"lineBreakHtml"] +["./prettify/prettify.js",1092,8,"lineBreakHtml"] +["./prettify/prettify.js",1094,8] +["./prettify/prettify.js",1093,8,"isIE678"] +["./prettify/prettify.js",1099,11] +["./prettify/prettify.js",1094,11,"tagName"] +["./prettify/prettify.js",1094,11,"sourceNode"] +["./prettify/prettify.js",1094,11,"job"] +["./prettify/prettify.js",1094,38] +["./prettify/prettify.js",1099,14] +["./prettify/prettify.js",1099,14,"isIE678"] +["./prettify/prettify.js",1099,26] +["./prettify/prettify.js",1099,30] +["./prettify/prettify.js",1100,14] +["./prettify/prettify.js",1100,14,"isIE678"] +["./prettify/prettify.js",1100,26] +["./prettify/prettify.js",1100,30] +["./prettify/prettify.js",1100,47] +["./prettify/prettify.js",1104,13] +["./prettify/prettify.js",1105,10] +["./prettify/prettify.js",1109,4] +["./prettify/prettify.js",1109,8,"numberLines"] +["./prettify/prettify.js",1109,52] +["./prettify/prettify.js",1109,22,"match"] +["./prettify/prettify.js",1109,22,"className"] +["./prettify/prettify.js",1109,22,"sourceNode"] +["./prettify/prettify.js",1109,22,"job"] +["./prettify/prettify.js",1109,53] +["./prettify/prettify.js",1110,8,"lineBreaker"] +["./prettify/prettify.js",1111,4] +["./prettify/prettify.js",1111,8,"numberLines"] +["./prettify/prettify.js",1111,21] +["./prettify/prettify.js",1113,6] +["./prettify/prettify.js",1112,6] +["./prettify/prettify.js",1112,10,"lineBreaks"] +["./prettify/prettify.js",1112,23] +["./prettify/prettify.js",1113,15,"i"] +["./prettify/prettify.js",1113,19] +["./prettify/prettify.js",1113,22,"i"] +["./prettify/prettify.js",1113,26] +["./prettify/prettify.js",1113,30] +["./prettify/prettify.js",1113,32,"i"] +["./prettify/prettify.js",1114,8] +["./prettify/prettify.js",1114,8] +["./prettify/prettify.js",1114,8,"lineBreaks"] +["./prettify/prettify.js",1114,19,"i"] +["./prettify/prettify.js",1114,24,"lineBreakHtml"] +["./prettify/prettify.js",1114,40] +["./prettify/prettify.js",1114,62,"i"] +["./prettify/prettify.js",1114,66] +["./prettify/prettify.js",1116,6] +["./prettify/prettify.js",1116,10,"lineNum"] +["./prettify/prettify.js",1117,20] +["./prettify/prettify.js",1116,20] +["./prettify/prettify.js",1116,20,"numberLines"] +["./prettify/prettify.js",1116,32] +["./prettify/prettify.js",1116,38,"length"] +["./prettify/prettify.js",1116,38] +["./prettify/prettify.js",1116,38,"numberLines"] +["./prettify/prettify.js",1116,50] +["./prettify/prettify.js",1117,12] +["./prettify/prettify.js",1117,12,"numberLines"] +["./prettify/prettify.js",1117,24] +["./prettify/prettify.js",1117,29] +["./prettify/prettify.js",1117,33] +["./prettify/prettify.js",1118,6] +["./prettify/prettify.js",1118,15] +["./prettify/prettify.js",1118,6,"push"] +["./prettify/prettify.js",1118,6,"html"] +["./prettify/prettify.js",1118,16] +["./prettify/prettify.js",1118,54,"lineNum"] +["./prettify/prettify.js",1118,65] +["./prettify/prettify.js",1118,69] +["./prettify/prettify.js",1119,6] +["./prettify/prettify.js",1119,10,"lineNum"] +["./prettify/prettify.js",1120,17] +["./prettify/prettify.js",1120,8,"push"] +["./prettify/prettify.js",1120,8,"html"] +["./prettify/prettify.js",1120,18] +["./prettify/prettify.js",1120,30,"lineNum"] +["./prettify/prettify.js",1120,40] +["./prettify/prettify.js",1120,43] +["./prettify/prettify.js",1122,6] +["./prettify/prettify.js",1122,15] +["./prettify/prettify.js",1122,6,"push"] +["./prettify/prettify.js",1122,6,"html"] +["./prettify/prettify.js",1122,16] +["./prettify/prettify.js",1123,6] +["./prettify/prettify.js",1123,6,"lineBreaker"] +["./prettify/prettify.js",1123,29] +["./prettify/prettify.js",1123,29,""] +["./prettify/prettify.js",1123,29] +["./prettify/prettify.js",1123,32] +["./prettify/prettify.js",1124,8] +["./prettify/prettify.js",1124,12,"lb"] +["./prettify/prettify.js",1124,17] +["./prettify/prettify.js",1124,17,"lineBreaks"] +["./prettify/prettify.js",1124,28] +["./prettify/prettify.js",1124,30,"lineNum"] +["./prettify/prettify.js",1124,40] +["./prettify/prettify.js",1127,8] +["./prettify/prettify.js",1128,15] +["./prettify/prettify.js",1127,15,"openDecoration"] +["./prettify/prettify.js",1128,15] +["./prettify/prettify.js",1128,27,"lb"] +["./prettify/prettify.js",1128,32] +["./prettify/prettify.js",1128,50,"openDecoration"] +["./prettify/prettify.js",1128,67] +["./prettify/prettify.js",1128,75,"lb"] +["./prettify/prettify.js",1131,6] +["./prettify/prettify.js",1131,6,"lineBreaker"] +["./prettify/prettify.js",1131,20,"lineBreakHtml"] +["./prettify/prettify.js",1167,4] +["./prettify/prettify.js",1167,4] +["./prettify/prettify.js",1167,11] +["./prettify/prettify.js",1167,4] +["./prettify/prettify.js",1184,6] +["./prettify/prettify.js",1171,6,"outputTag"] +["./prettify/prettify.js",1171,10,"tagPos"] +["./prettify/prettify.js",1171,19,"length"] +["./prettify/prettify.js",1171,19,"extractedTags"] +["./prettify/prettify.js",1172,8] +["./prettify/prettify.js",1172,12,"decPos"] +["./prettify/prettify.js",1172,21,"length"] +["./prettify/prettify.js",1172,21,"decorations"] +["./prettify/prettify.js",1176,22] +["./prettify/prettify.js",1176,22,"extractedTags"] +["./prettify/prettify.js",1176,36,"tagPos"] +["./prettify/prettify.js",1176,47] +["./prettify/prettify.js",1176,47,"decorations"] +["./prettify/prettify.js",1176,59,"decPos"] +["./prettify/prettify.js",1178,22] +["./prettify/prettify.js",1181,20] +["./prettify/prettify.js",1184,21] +["./prettify/prettify.js",1185,8] +["./prettify/prettify.js",1185,20] +["./prettify/prettify.js",1185,8,"emitTextUpTo"] +["./prettify/prettify.js",1185,21] +["./prettify/prettify.js",1185,21,"extractedTags"] +["./prettify/prettify.js",1185,35,"tagPos"] +["./prettify/prettify.js",1186,8] +["./prettify/prettify.js",1186,12,"openDecoration"] +["./prettify/prettify.js",1186,28] +["./prettify/prettify.js",1188,10] +["./prettify/prettify.js",1188,19] +["./prettify/prettify.js",1188,10,"push"] +["./prettify/prettify.js",1188,10,"html"] +["./prettify/prettify.js",1188,20] +["./prettify/prettify.js",1189,10] +["./prettify/prettify.js",1189,10,"openDecoration"] +["./prettify/prettify.js",1189,27] +["./prettify/prettify.js",1191,8] +["./prettify/prettify.js",1191,17] +["./prettify/prettify.js",1191,8,"push"] +["./prettify/prettify.js",1191,8,"html"] +["./prettify/prettify.js",1191,18] +["./prettify/prettify.js",1191,18,"extractedTags"] +["./prettify/prettify.js",1191,32,"tagPos"] +["./prettify/prettify.js",1191,41] +["./prettify/prettify.js",1192,8] +["./prettify/prettify.js",1192,8,"tagPos"] +["./prettify/prettify.js",1192,18] +["./prettify/prettify.js",1193,13] +["./prettify/prettify.js",1193,17,"decPos"] +["./prettify/prettify.js",1193,26,"length"] +["./prettify/prettify.js",1193,26,"decorations"] +["./prettify/prettify.js",1193,46] +["./prettify/prettify.js",1194,8] +["./prettify/prettify.js",1194,20] +["./prettify/prettify.js",1194,8,"emitTextUpTo"] +["./prettify/prettify.js",1194,21] +["./prettify/prettify.js",1194,21,"decorations"] +["./prettify/prettify.js",1194,33,"decPos"] +["./prettify/prettify.js",1195,8] +["./prettify/prettify.js",1195,8,"currentDecoration"] +["./prettify/prettify.js",1195,28] +["./prettify/prettify.js",1195,28,"decorations"] +["./prettify/prettify.js",1195,40,"decPos"] +["./prettify/prettify.js",1195,49] +["./prettify/prettify.js",1196,8] +["./prettify/prettify.js",1196,8,"decPos"] +["./prettify/prettify.js",1196,18] +["./prettify/prettify.js",1198,8] +["./prettify/prettify.js",1201,4] +["./prettify/prettify.js",1201,16] +["./prettify/prettify.js",1201,4,"emitTextUpTo"] +["./prettify/prettify.js",1201,17,"length"] +["./prettify/prettify.js",1201,17,"sourceText"] +["./prettify/prettify.js",1202,4] +["./prettify/prettify.js",1202,8,"openDecoration"] +["./prettify/prettify.js",1203,15] +["./prettify/prettify.js",1203,6,"push"] +["./prettify/prettify.js",1203,6,"html"] +["./prettify/prettify.js",1203,16] +["./prettify/prettify.js",1205,4] +["./prettify/prettify.js",1205,8,"numberLines"] +["./prettify/prettify.js",1205,32] +["./prettify/prettify.js",1205,23,"push"] +["./prettify/prettify.js",1205,23,"html"] +["./prettify/prettify.js",1205,33] +["./prettify/prettify.js",1206,4] +["./prettify/prettify.js",1206,4,"prettyPrintedHtml"] +["./prettify/prettify.js",1206,4,"job"] +["./prettify/prettify.js",1206,37] +["./prettify/prettify.js",1206,28,"join"] +["./prettify/prettify.js",1206,28,"html"] +["./prettify/prettify.js",1206,38] +["./prettify/prettify.js",1227,11] +["./prettify/prettify.js",1227,11,"registerLangHandler"] +["./prettify/prettify.js",1227,30] +["./prettify/prettify.js",1227,31,"handler"] +["./prettify/prettify.js",1227,40,"fileExtensions"] +["./prettify/prettify.js",1227,56] +["./prettify/prettify.js",1228,4] +["./prettify/prettify.js",1228,9] +["./prettify/prettify.js",1228,13,"i"] +["./prettify/prettify.js",1228,17,"length"] +["./prettify/prettify.js",1228,17,"fileExtensions"] +["./prettify/prettify.js",1228,40] +["./prettify/prettify.js",1228,42,"i"] +["./prettify/prettify.js",1228,47] +["./prettify/prettify.js",1228,49] +["./prettify/prettify.js",1228,51] +["./prettify/prettify.js",1229,6] +["./prettify/prettify.js",1229,10,"ext"] +["./prettify/prettify.js",1229,16] +["./prettify/prettify.js",1229,16,"fileExtensions"] +["./prettify/prettify.js",1229,31,"i"] +["./prettify/prettify.js",1230,6] +["./prettify/prettify.js",1230,45] +["./prettify/prettify.js",1230,11,"hasOwnProperty"] +["./prettify/prettify.js",1230,11,"langHandlerRegistry"] +["./prettify/prettify.js",1230,46,"ext"] +["./prettify/prettify.js",1232,13] +["./prettify/prettify.js",1232,17] +["./prettify/prettify.js",1232,30,"window"] +["./prettify/prettify.js",1233,23] +["./prettify/prettify.js",1233,8] +["./prettify/prettify.js",1233,8,"console"] +["./prettify/prettify.js",1233,24] +["./prettify/prettify.js",1233,63,"ext"] +["./prettify/prettify.js",1231,8] +["./prettify/prettify.js",1231,8] +["./prettify/prettify.js",1231,8,"langHandlerRegistry"] +["./prettify/prettify.js",1231,28,"ext"] +["./prettify/prettify.js",1231,35,"handler"] +["./prettify/prettify.js",1237,11] +["./prettify/prettify.js",1237,11,"langHandlerForExtension"] +["./prettify/prettify.js",1237,34] +["./prettify/prettify.js",1237,35,"extension"] +["./prettify/prettify.js",1237,46,"source"] +["./prettify/prettify.js",1237,54] +["./prettify/prettify.js",1238,4] +["./prettify/prettify.js",1238,10,"extension"] +["./prettify/prettify.js",1238,57] +["./prettify/prettify.js",1238,23,"hasOwnProperty"] +["./prettify/prettify.js",1238,23,"langHandlerRegistry"] +["./prettify/prettify.js",1238,58,"extension"] +["./prettify/prettify.js",1241,6,"extension"] +["./prettify/prettify.js",1242,18] +["./prettify/prettify.js",1241,30] +["./prettify/prettify.js",1241,18,"test"] +["./prettify/prettify.js",1241,18] +["./prettify/prettify.js",1241,31,"source"] +["./prettify/prettify.js",1242,12] +["./prettify/prettify.js",1243,12] +["./prettify/prettify.js",1245,4] +["./prettify/prettify.js",1245,11] +["./prettify/prettify.js",1245,11,"langHandlerRegistry"] +["./prettify/prettify.js",1245,31,"extension"] +["./prettify/prettify.js",1337,11] +["./prettify/prettify.js",1337,11,"applyDecorator"] +["./prettify/prettify.js",1337,25] +["./prettify/prettify.js",1337,26,"job"] +["./prettify/prettify.js",1337,31] +["./prettify/prettify.js",1338,4] +["./prettify/prettify.js",1338,8,"sourceCodeHtml"] +["./prettify/prettify.js",1338,25,"sourceCodeHtml"] +["./prettify/prettify.js",1338,25,"job"] +["./prettify/prettify.js",1339,8,"opt_langExtension"] +["./prettify/prettify.js",1339,28,"langExtension"] +["./prettify/prettify.js",1339,28,"job"] +["./prettify/prettify.js",1342,4] +["./prettify/prettify.js",1342,4,"prettyPrintedHtml"] +["./prettify/prettify.js",1342,4,"job"] +["./prettify/prettify.js",1342,28,"sourceCodeHtml"] +["./prettify/prettify.js",1344,4] +["./prettify/prettify.js",1344,8] +["./prettify/prettify.js",1346,6] +["./prettify/prettify.js",1346,10,"sourceAndExtractedTags"] +["./prettify/prettify.js",679,8,"matches"] +["./prettify/prettify.js",679,25] +["./prettify/prettify.js",679,18,"match"] +["./prettify/prettify.js",1346,47,"sourceCodeHtml"] +["./prettify/prettify.js",679,26,"pr_chunkPattern"] +["./prettify/prettify.js",680,8,"sourceBuf"] +["./prettify/prettify.js",680,8,"sourceBuf"] +["./prettify/prettify.js",680,20] +["./prettify/prettify.js",681,4] +["./prettify/prettify.js",681,8,"sourceBufLen"] +["./prettify/prettify.js",681,23] +["./prettify/prettify.js",682,8,"extractedTags"] +["./prettify/prettify.js",682,24] +["./prettify/prettify.js",683,4] +["./prettify/prettify.js",683,8,"matches"] +["./prettify/prettify.js",684,6] +["./prettify/prettify.js",684,6] +["./prettify/prettify.js",684,15,"i"] +["./prettify/prettify.js",684,19] +["./prettify/prettify.js",684,22,"n"] +["./prettify/prettify.js",684,26,"length"] +["./prettify/prettify.js",684,26,"matches"] +["./prettify/prettify.js",684,42,"i"] +["./prettify/prettify.js",684,46,"n"] +["./prettify/prettify.js",684,49] +["./prettify/prettify.js",684,51,"i"] +["./prettify/prettify.js",684,54] +["./prettify/prettify.js",685,8] +["./prettify/prettify.js",685,12,"match"] +["./prettify/prettify.js",685,20] +["./prettify/prettify.js",685,20,"matches"] +["./prettify/prettify.js",685,28,"i"] +["./prettify/prettify.js",686,8] +["./prettify/prettify.js",686,12,"length"] +["./prettify/prettify.js",686,12,"match"] +["./prettify/prettify.js",686,27] +["./prettify/prettify.js",686,44] +["./prettify/prettify.js",686,32,"charAt"] +["./prettify/prettify.js",686,32,"match"] +["./prettify/prettify.js",686,45] +["./prettify/prettify.js",686,52] +["./prettify/prettify.js",687,10] +["./prettify/prettify.js",687,35] +["./prettify/prettify.js",687,35] +["./prettify/prettify.js",687,14,"test"] +["./prettify/prettify.js",687,14,"pr_commentPrefix"] +["./prettify/prettify.js",687,36,"match"] +["./prettify/prettify.js",688,10] +["./prettify/prettify.js",688,33] +["./prettify/prettify.js",688,14,"test"] +["./prettify/prettify.js",688,14,"pr_cdataPrefix"] +["./prettify/prettify.js",688,34,"match"] +["./prettify/prettify.js",688,42] +["./prettify/prettify.js",690,12] +["./prettify/prettify.js",690,26] +["./prettify/prettify.js",690,12,"push"] +["./prettify/prettify.js",690,12,"sourceBuf"] +["./prettify/prettify.js",690,42] +["./prettify/prettify.js",690,27,"substring"] +["./prettify/prettify.js",690,27,"match"] +["./prettify/prettify.js",690,43] +["./prettify/prettify.js",690,46,"length"] +["./prettify/prettify.js",690,46,"match"] +["./prettify/prettify.js",690,61] +["./prettify/prettify.js",691,12] +["./prettify/prettify.js",691,12,"sourceBufLen"] +["./prettify/prettify.js",691,28,"length"] +["./prettify/prettify.js",691,28,"match"] +["./prettify/prettify.js",691,43] +["./prettify/prettify.js",692,17] +["./prettify/prettify.js",692,37] +["./prettify/prettify.js",692,21,"test"] +["./prettify/prettify.js",692,21,"pr_brPrefix"] +["./prettify/prettify.js",692,38,"match"] +["./prettify/prettify.js",692,46] +["./prettify/prettify.js",695,12] +["./prettify/prettify.js",695,26] +["./prettify/prettify.js",695,12,"push"] +["./prettify/prettify.js",695,12,"sourceBuf"] +["./prettify/prettify.js",695,27] +["./prettify/prettify.js",696,12] +["./prettify/prettify.js",696,12] +["./prettify/prettify.js",696,14,"sourceBufLen"] +["./prettify/prettify.js",698,12] +["./prettify/prettify.js",698,29] +["./prettify/prettify.js",698,16,"indexOf"] +["./prettify/prettify.js",698,16,"match"] +["./prettify/prettify.js",698,30,"PR_NOCODE"] +["./prettify/prettify.js",698,44] +["./prettify/prettify.js",744,14] +["./prettify/prettify.js",744,13,"match"] +["./prettify/prettify.js",741,16] +["./prettify/prettify.js",741,13,"replace"] +["./prettify/prettify.js",698,61,"match"] +["./prettify/prettify.js",741,17] +["./prettify/prettify.js",742,17] +["./prettify/prettify.js",744,15] +["./prettify/prettify.js",698,69] +["./prettify/prettify.js",702,14] +["./prettify/prettify.js",702,18,"name"] +["./prettify/prettify.js",702,25] +["./prettify/prettify.js",702,36] +["./prettify/prettify.js",702,25,"match"] +["./prettify/prettify.js",702,25,"match"] +["./prettify/prettify.js",702,37,"pr_tagNameRe"] +["./prettify/prettify.js",702,51] +["./prettify/prettify.js",703,18,"depth"] +["./prettify/prettify.js",703,26] +["./prettify/prettify.js",704,18,"j"] +["./prettify/prettify.js",706,21] +["./prettify/prettify.js",706,19,"j"] +["./prettify/prettify.js",706,23,"i"] +["./prettify/prettify.js",706,27] +["./prettify/prettify.js",705,14] +["./prettify/prettify.js",705,14] +["./prettify/prettify.js",706,14] +["./prettify/prettify.js",706,14] +["./prettify/prettify.js",706,30,"j"] +["./prettify/prettify.js",706,34,"n"] +["./prettify/prettify.js",706,37] +["./prettify/prettify.js",706,39,"j"] +["./prettify/prettify.js",706,42] +["./prettify/prettify.js",707,16] +["./prettify/prettify.js",707,20,"name2"] +["./prettify/prettify.js",707,44] +["./prettify/prettify.js",707,28,"match"] +["./prettify/prettify.js",707,28] +["./prettify/prettify.js",707,28,"matches"] +["./prettify/prettify.js",707,36,"j"] +["./prettify/prettify.js",707,45,"pr_tagNameRe"] +["./prettify/prettify.js",708,16] +["./prettify/prettify.js",708,20,"name2"] +["./prettify/prettify.js",708,29] +["./prettify/prettify.js",708,29,"name2"] +["./prettify/prettify.js",708,35] +["./prettify/prettify.js",708,42,"name"] +["./prettify/prettify.js",709,18] +["./prettify/prettify.js",709,22] +["./prettify/prettify.js",709,22,"name2"] +["./prettify/prettify.js",709,28] +["./prettify/prettify.js",709,35] +["./prettify/prettify.js",710,20] +["./prettify/prettify.js",710,24] +["./prettify/prettify.js",710,26,"depth"] +["./prettify/prettify.js",710,36] +["./prettify/prettify.js",710,41] +["./prettify/prettify.js",710,47] +["./prettify/prettify.js",712,20] +["./prettify/prettify.js",712,20] +["./prettify/prettify.js",712,22,"depth"] +["./prettify/prettify.js",716,14] +["./prettify/prettify.js",716,18,"j"] +["./prettify/prettify.js",716,22,"n"] +["./prettify/prettify.js",716,25] +["./prettify/prettify.js",717,16] +["./prettify/prettify.js",717,34] +["./prettify/prettify.js",717,16,"push"] +["./prettify/prettify.js",717,16,"extractedTags"] +["./prettify/prettify.js",718,20,"sourceBufLen"] +["./prettify/prettify.js",718,62] +["./prettify/prettify.js",718,34,"join"] +["./prettify/prettify.js",718,47] +["./prettify/prettify.js",718,34,"slice"] +["./prettify/prettify.js",718,34,"matches"] +["./prettify/prettify.js",718,48,"i"] +["./prettify/prettify.js",718,51,"j"] +["./prettify/prettify.js",718,55] +["./prettify/prettify.js",718,63] +["./prettify/prettify.js",719,16] +["./prettify/prettify.js",719,16,"i"] +["./prettify/prettify.js",719,20,"j"] +["./prettify/prettify.js",721,16] +["./prettify/prettify.js",721,34] +["./prettify/prettify.js",721,16,"push"] +["./prettify/prettify.js",721,16,"extractedTags"] +["./prettify/prettify.js",721,35,"sourceBufLen"] +["./prettify/prettify.js",721,49,"match"] +["./prettify/prettify.js",724,14] +["./prettify/prettify.js",724,32] +["./prettify/prettify.js",724,14,"push"] +["./prettify/prettify.js",724,14,"extractedTags"] +["./prettify/prettify.js",724,33,"sourceBufLen"] +["./prettify/prettify.js",724,47,"match"] +["./prettify/prettify.js",727,15] +["./prettify/prettify.js",728,10] +["./prettify/prettify.js",728,14,"literalText"] +["./prettify/prettify.js",728,39,"match"] +["./prettify/prettify.js",728,39,"match"] +["./prettify/prettify.js",728,39,"match"] +["./prettify/prettify.js",252,4] +["./prettify/prettify.js",252,8,"pos"] +["./prettify/prettify.js",252,26] +["./prettify/prettify.js",252,14,"indexOf"] +["./prettify/prettify.js",252,14,"html"] +["./prettify/prettify.js",252,27] +["./prettify/prettify.js",253,4] +["./prettify/prettify.js",253,8,"pos"] +["./prettify/prettify.js",253,14] +["./prettify/prettify.js",253,19] +["./prettify/prettify.js",253,19] +["./prettify/prettify.js",253,26,"html"] +["./prettify/prettify.js",253,4] +["./prettify/prettify.js",257,4] +["./prettify/prettify.js",257,9] +["./prettify/prettify.js",257,11,"pos"] +["./prettify/prettify.js",257,17,"pos"] +["./prettify/prettify.js",257,35] +["./prettify/prettify.js",257,23,"indexOf"] +["./prettify/prettify.js",257,23,"html"] +["./prettify/prettify.js",257,36] +["./prettify/prettify.js",257,42,"pos"] +["./prettify/prettify.js",257,48] +["./prettify/prettify.js",257,55] +["./prettify/prettify.js",257,57] +["./prettify/prettify.js",257,59] +["./prettify/prettify.js",258,6] +["./prettify/prettify.js",258,10,"end"] +["./prettify/prettify.js",258,28] +["./prettify/prettify.js",258,16,"indexOf"] +["./prettify/prettify.js",258,16,"html"] +["./prettify/prettify.js",258,29] +["./prettify/prettify.js",258,34,"pos"] +["./prettify/prettify.js",259,6] +["./prettify/prettify.js",259,10,"end"] +["./prettify/prettify.js",259,17] +["./prettify/prettify.js",259,20] +["./prettify/prettify.js",260,8] +["./prettify/prettify.js",260,12,"num"] +["./prettify/prettify.js",260,32] +["./prettify/prettify.js",260,18,"substring"] +["./prettify/prettify.js",260,18,"html"] +["./prettify/prettify.js",260,33,"pos"] +["./prettify/prettify.js",260,39] +["./prettify/prettify.js",260,42,"end"] +["./prettify/prettify.js",261,12,"radix"] +["./prettify/prettify.js",261,20] +["./prettify/prettify.js",262,8] +["./prettify/prettify.js",262,12,"num"] +["./prettify/prettify.js",262,29] +["./prettify/prettify.js",262,19,"charAt"] +["./prettify/prettify.js",262,19,"num"] +["./prettify/prettify.js",262,30] +["./prettify/prettify.js",262,37] +["./prettify/prettify.js",262,42] +["./prettify/prettify.js",263,10] +["./prettify/prettify.js",263,10,"num"] +["./prettify/prettify.js",263,29] +["./prettify/prettify.js",263,16,"substring"] +["./prettify/prettify.js",263,16,"num"] +["./prettify/prettify.js",263,30] +["./prettify/prettify.js",264,10] +["./prettify/prettify.js",264,10,"radix"] +["./prettify/prettify.js",264,18] +["./prettify/prettify.js",266,8] +["./prettify/prettify.js",266,12,"codePoint"] +["./prettify/prettify.js",266,32] +["./prettify/prettify.js",266,24,"parseInt"] +["./prettify/prettify.js",266,33,"num"] +["./prettify/prettify.js",266,38,"radix"] +["./prettify/prettify.js",267,8] +["./prettify/prettify.js",267,18] +["./prettify/prettify.js",267,13,"isNaN"] +["./prettify/prettify.js",267,19,"codePoint"] +["./prettify/prettify.js",268,10,"html"] +["./prettify/prettify.js",268,32] +["./prettify/prettify.js",268,18,"substring"] +["./prettify/prettify.js",268,18,"html"] +["./prettify/prettify.js",268,33] +["./prettify/prettify.js",268,36,"pos"] +["./prettify/prettify.js",268,62] +["./prettify/prettify.js",268,43,"fromCharCode"] +["./prettify/prettify.js",268,43,"String"] +["./prettify/prettify.js",268,63,"codePoint"] +["./prettify/prettify.js",269,32] +["./prettify/prettify.js",269,18,"substring"] +["./prettify/prettify.js",269,18,"html"] +["./prettify/prettify.js",269,33,"end"] +["./prettify/prettify.js",269,39] +["./prettify/prettify.js",274,4] +["./prettify/prettify.js",274,4] +["./prettify/prettify.js",279,16] +["./prettify/prettify.js",279,11,"replace"] +["./prettify/prettify.js",278,16] +["./prettify/prettify.js",278,11,"replace"] +["./prettify/prettify.js",277,16] +["./prettify/prettify.js",277,11,"replace"] +["./prettify/prettify.js",276,16] +["./prettify/prettify.js",276,11,"replace"] +["./prettify/prettify.js",275,16] +["./prettify/prettify.js",275,11,"replace"] +["./prettify/prettify.js",274,23] +["./prettify/prettify.js",274,11,"replace"] +["./prettify/prettify.js",274,11,"html"] +["./prettify/prettify.js",274,24,"pr_ltEnt"] +["./prettify/prettify.js",274,34] +["./prettify/prettify.js",275,17,"pr_gtEnt"] +["./prettify/prettify.js",275,27] +["./prettify/prettify.js",276,17,"pr_aposEnt"] +["./prettify/prettify.js",276,29] +["./prettify/prettify.js",277,17,"pr_quotEnt"] +["./prettify/prettify.js",277,29] +["./prettify/prettify.js",278,17,"pr_nbspEnt"] +["./prettify/prettify.js",278,29] +["./prettify/prettify.js",279,17,"pr_ampEnt"] +["./prettify/prettify.js",279,28] +["./prettify/prettify.js",729,10] +["./prettify/prettify.js",729,24] +["./prettify/prettify.js",729,10,"push"] +["./prettify/prettify.js",729,10,"sourceBuf"] +["./prettify/prettify.js",729,25,"literalText"] +["./prettify/prettify.js",730,10] +["./prettify/prettify.js",730,10,"sourceBufLen"] +["./prettify/prettify.js",730,26,"length"] +["./prettify/prettify.js",730,26,"literalText"] +["./prettify/prettify.js",734,4] +["./prettify/prettify.js",734,4] +["./prettify/prettify.js",734,11] +["./prettify/prettify.js",734,35] +["./prettify/prettify.js",734,21,"join"] +["./prettify/prettify.js",734,21,"sourceBuf"] +["./prettify/prettify.js",734,36] +["./prettify/prettify.js",734,47,"extractedTags"] +["./prettify/prettify.js",1348,6] +["./prettify/prettify.js",1348,10,"source"] +["./prettify/prettify.js",1348,19,"source"] +["./prettify/prettify.js",1348,19,"sourceAndExtractedTags"] +["./prettify/prettify.js",1349,6] +["./prettify/prettify.js",1349,6,"source"] +["./prettify/prettify.js",1349,6,"job"] +["./prettify/prettify.js",1349,19,"source"] +["./prettify/prettify.js",1350,6] +["./prettify/prettify.js",1350,6,"basePos"] +["./prettify/prettify.js",1350,6,"job"] +["./prettify/prettify.js",1350,20] +["./prettify/prettify.js",1356,6] +["./prettify/prettify.js",1356,6,"extractedTags"] +["./prettify/prettify.js",1356,6,"job"] +["./prettify/prettify.js",1356,26,"tags"] +["./prettify/prettify.js",1356,26,"sourceAndExtractedTags"] +["./prettify/prettify.js",1359,6] +["./prettify/prettify.js",1359,56] +["./prettify/prettify.js",1359,29] +["./prettify/prettify.js",1359,6,"langHandlerForExtension"] +["./prettify/prettify.js",1359,30,"opt_langExtension"] +["./prettify/prettify.js",1359,49,"source"] +["./prettify/prettify.js",1359,57,"job"] +["./prettify/prettify.js",1362,6] +["./prettify/prettify.js",1362,33] +["./prettify/prettify.js",1362,6,"recombineTagsAndDecorations"] +["./prettify/prettify.js",1362,34,"job"] +["./prettify/prettify.js",1363,6] +["./prettify/prettify.js",1363,13,"e"] +["./prettify/prettify.js",1363,16] +["./prettify/prettify.js",1364,6] +["./prettify/prettify.js",1364,10] +["./prettify/prettify.js",1364,23,"window"] +["./prettify/prettify.js",1365,8] +["./prettify/prettify.js",1365,22] +["./prettify/prettify.js",1365,8] +["./prettify/prettify.js",1365,8,"console"] +["./prettify/prettify.js",1365,23] +["./prettify/prettify.js",1365,23,"e"] +["./prettify/prettify.js",1365,28] +["./prettify/prettify.js",1365,28,"e"] +["./prettify/prettify.js",1365,41] +["./prettify/prettify.js",1365,41,"e"] +["./prettify/prettify.js",1365,54,"e"] +["./prettify/prettify.js",146,2] +["./prettify/prettify.js",146,6,"PR_STRING"] +["./prettify/prettify.js",146,18] +["./prettify/prettify.js",148,6,"PR_KEYWORD"] +["./prettify/prettify.js",148,19] +["./prettify/prettify.js",150,6,"PR_COMMENT"] +["./prettify/prettify.js",150,19] +["./prettify/prettify.js",152,6,"PR_TYPE"] +["./prettify/prettify.js",152,16] +["./prettify/prettify.js",154,6,"PR_LITERAL"] +["./prettify/prettify.js",154,19] +["./prettify/prettify.js",156,6,"PR_PUNCTUATION"] +["./prettify/prettify.js",156,23] +["./prettify/prettify.js",158,6,"PR_PLAIN"] +["./prettify/prettify.js",158,17] +["./prettify/prettify.js",165,6,"PR_SOURCE"] +["./prettify/prettify.js",165,18] +["./prettify/prettify.js",175,6,"PR_NOCODE"] +["./prettify/prettify.js",175,18] +["./prettify/prettify.js",194,6,"REGEXP_PRECEDER_PATTERN"] +["./prettify/prettify.js",218,5] +["./prettify/prettify.js",194,41] +["./prettify/prettify.js",194,41,""] +["./prettify/prettify.js",194,41] +["./prettify/prettify.js",194,44] +["./prettify/prettify.js",208,6] +["./prettify/prettify.js",195,6] +["./prettify/prettify.js",195,10,"preceders"] +["./prettify/prettify.js",195,22] +["./prettify/prettify.js",196,10] +["./prettify/prettify.js",196,15] +["./prettify/prettify.js",196,21] +["./prettify/prettify.js",196,28] +["./prettify/prettify.js",196,33] +["./prettify/prettify.js",196,38] +["./prettify/prettify.js",196,44] +["./prettify/prettify.js",196,49] +["./prettify/prettify.js",196,55] +["./prettify/prettify.js",197,10] +["./prettify/prettify.js",197,16] +["./prettify/prettify.js",197,21] +["./prettify/prettify.js",197,26] +["./prettify/prettify.js",197,43] +["./prettify/prettify.js",197,49] +["./prettify/prettify.js",197,65] +["./prettify/prettify.js",198,10] +["./prettify/prettify.js",198,53] +["./prettify/prettify.js",198,58] +["./prettify/prettify.js",198,64] +["./prettify/prettify.js",198,69] +["./prettify/prettify.js",198,75] +["./prettify/prettify.js",199,10] +["./prettify/prettify.js",199,15] +["./prettify/prettify.js",199,21] +["./prettify/prettify.js",199,28] +["./prettify/prettify.js",199,34] +["./prettify/prettify.js",199,39] +["./prettify/prettify.js",199,45] +["./prettify/prettify.js",199,52] +["./prettify/prettify.js",200,10] +["./prettify/prettify.js",200,16] +["./prettify/prettify.js",200,22] +["./prettify/prettify.js",200,29] +["./prettify/prettify.js",200,36] +["./prettify/prettify.js",200,44] +["./prettify/prettify.js",200,49] +["./prettify/prettify.js",200,54] +["./prettify/prettify.js",201,10] +["./prettify/prettify.js",201,15] +["./prettify/prettify.js",201,21] +["./prettify/prettify.js",201,27] +["./prettify/prettify.js",201,34] +["./prettify/prettify.js",201,39] +["./prettify/prettify.js",201,44] +["./prettify/prettify.js",201,50] +["./prettify/prettify.js",202,10] +["./prettify/prettify.js",202,17] +["./prettify/prettify.js",203,10] +["./prettify/prettify.js",203,19] +["./prettify/prettify.js",203,27] +["./prettify/prettify.js",203,39] +["./prettify/prettify.js",204,10] +["./prettify/prettify.js",204,16] +["./prettify/prettify.js",204,24] +["./prettify/prettify.js",204,35] +["./prettify/prettify.js",205,10] +["./prettify/prettify.js",205,20] +["./prettify/prettify.js",205,29] +["./prettify/prettify.js",205,36] +["./prettify/prettify.js",207,10,"pattern"] +["./prettify/prettify.js",207,20] +["./prettify/prettify.js",208,15,"i"] +["./prettify/prettify.js",208,19] +["./prettify/prettify.js",208,22,"i"] +["./prettify/prettify.js",208,26,"length"] +["./prettify/prettify.js",208,26,"preceders"] +["./prettify/prettify.js",208,44] +["./prettify/prettify.js",208,46,"i"] +["./prettify/prettify.js",209,8] +["./prettify/prettify.js",209,8,"pattern"] +["./prettify/prettify.js",209,19] +["./prettify/prettify.js",209,45] +["./prettify/prettify.js",209,25,"replace"] +["./prettify/prettify.js",209,25] +["./prettify/prettify.js",209,25,"preceders"] +["./prettify/prettify.js",209,35,"i"] +["./prettify/prettify.js",209,46] +["./prettify/prettify.js",209,64] +["./prettify/prettify.js",211,6] +["./prettify/prettify.js",211,6,"pattern"] +["./prettify/prettify.js",211,17] +["./prettify/prettify.js",212,6] +["./prettify/prettify.js",212,13,"pattern"] +["./prettify/prettify.js",224,6,"pr_amp"] +["./prettify/prettify.js",224,15] +["./prettify/prettify.js",225,6,"pr_lt"] +["./prettify/prettify.js",225,14] +["./prettify/prettify.js",226,6,"pr_gt"] +["./prettify/prettify.js",226,14] +["./prettify/prettify.js",227,6,"pr_quot"] +["./prettify/prettify.js",227,16] +["./prettify/prettify.js",244,6,"pr_ltEnt"] +["./prettify/prettify.js",244,17] +["./prettify/prettify.js",245,6,"pr_gtEnt"] +["./prettify/prettify.js",245,17] +["./prettify/prettify.js",246,6,"pr_aposEnt"] +["./prettify/prettify.js",246,19] +["./prettify/prettify.js",247,6,"pr_quotEnt"] +["./prettify/prettify.js",247,19] +["./prettify/prettify.js",248,6,"pr_ampEnt"] +["./prettify/prettify.js",248,18] +["./prettify/prettify.js",249,6,"pr_nbspEnt"] +["./prettify/prettify.js",249,19] +["./prettify/prettify.js",287,6,"newlineRe"] +["./prettify/prettify.js",287,18] +["./prettify/prettify.js",575,6,"PR_innerHtmlWorks"] +["./prettify/prettify.js",575,26] +["./prettify/prettify.js",654,6,"pr_chunkPattern"] +["./prettify/prettify.js",654,34] +["./prettify/prettify.js",654,28,"RegExp"] +["./prettify/prettify.js",660,6] +["./prettify/prettify.js",661,6] +["./prettify/prettify.js",662,6,"pr_commentPrefix"] +["./prettify/prettify.js",662,25] +["./prettify/prettify.js",663,6,"pr_cdataPrefix"] +["./prettify/prettify.js",663,23] +["./prettify/prettify.js",664,6,"pr_brPrefix"] +["./prettify/prettify.js",664,20] +["./prettify/prettify.js",665,6,"pr_tagNameRe"] +["./prettify/prettify.js",665,21] +["./prettify/prettify.js",1048,6,"decorateSource"] +["./prettify/prettify.js",1048,38] +["./prettify/prettify.js",1048,23,"sourceDecorator"] +["./prettify/prettify.js",1048,39] +["./prettify/prettify.js",142,38,"ALL_KEYWORDS"] +["./prettify/prettify.js",1050,24] +["./prettify/prettify.js",1051,26] +["./prettify/prettify.js",1052,28] +["./prettify/prettify.js",1053,25] +["./prettify/prettify.js",1210,6,"langHandlerRegistry"] +["./prettify/prettify.js",1210,28] +["./prettify/prettify.js",1247,2] +["./prettify/prettify.js",1247,21] +["./prettify/prettify.js",1247,2,"registerLangHandler"] +["./prettify/prettify.js",1247,22,"decorateSource"] +["./prettify/prettify.js",1247,38] +["./prettify/prettify.js",1247,39] +["./prettify/prettify.js",1248,2] +["./prettify/prettify.js",1248,21] +["./prettify/prettify.js",1248,2,"registerLangHandler"] +["./prettify/prettify.js",1249,23] +["./prettify/prettify.js",1249,6,"createSimpleLexer"] +["./prettify/prettify.js",1250,10] +["./prettify/prettify.js",1251,10] +["./prettify/prettify.js",1252,11] +["./prettify/prettify.js",1252,12,"PR_PLAIN"] +["./prettify/prettify.js",1252,28] +["./prettify/prettify.js",1253,11] +["./prettify/prettify.js",163,23,"PR_DECLARATION"] +["./prettify/prettify.js",1253,28] +["./prettify/prettify.js",1254,11] +["./prettify/prettify.js",1254,12,"PR_COMMENT"] +["./prettify/prettify.js",1254,28] +["./prettify/prettify.js",1256,11] +["./prettify/prettify.js",1256,12] +["./prettify/prettify.js",1256,28] +["./prettify/prettify.js",1257,11] +["./prettify/prettify.js",1257,12] +["./prettify/prettify.js",1257,28] +["./prettify/prettify.js",1258,11] +["./prettify/prettify.js",1258,12,"PR_PUNCTUATION"] +["./prettify/prettify.js",1258,28] +["./prettify/prettify.js",1259,11] +["./prettify/prettify.js",1259,12] +["./prettify/prettify.js",1259,28] +["./prettify/prettify.js",1261,11] +["./prettify/prettify.js",1261,12] +["./prettify/prettify.js",1261,28] +["./prettify/prettify.js",1263,11] +["./prettify/prettify.js",1263,12] +["./prettify/prettify.js",1263,28] +["./prettify/prettify.js",1264,11] +["./prettify/prettify.js",1264,12] +["./prettify/prettify.js",1264,28] +["./prettify/prettify.js",1266,6] +["./prettify/prettify.js",1266,7] +["./prettify/prettify.js",1266,25] +["./prettify/prettify.js",1266,32] +["./prettify/prettify.js",1266,40] +["./prettify/prettify.js",1266,48] +["./prettify/prettify.js",1266,57] +["./prettify/prettify.js",1266,64] +["./prettify/prettify.js",1267,2] +["./prettify/prettify.js",1267,21] +["./prettify/prettify.js",1267,2,"registerLangHandler"] +["./prettify/prettify.js",1268,23] +["./prettify/prettify.js",1268,6,"createSimpleLexer"] +["./prettify/prettify.js",1269,10] +["./prettify/prettify.js",1270,11] +["./prettify/prettify.js",1270,12,"PR_PLAIN"] +["./prettify/prettify.js",1270,29] +["./prettify/prettify.js",1270,39] +["./prettify/prettify.js",1270,45] +["./prettify/prettify.js",1271,11] +["./prettify/prettify.js",169,24,"PR_ATTRIB_VALUE"] +["./prettify/prettify.js",1271,29] +["./prettify/prettify.js",1271,61] +["./prettify/prettify.js",1271,67] +["./prettify/prettify.js",1273,10] +["./prettify/prettify.js",1274,11] +["./prettify/prettify.js",161,15,"PR_TAG"] +["./prettify/prettify.js",1274,29] +["./prettify/prettify.js",1275,11] +["./prettify/prettify.js",167,23,"PR_ATTRIB_NAME"] +["./prettify/prettify.js",1275,29] +["./prettify/prettify.js",1276,11] +["./prettify/prettify.js",1276,12] +["./prettify/prettify.js",1276,29] +["./prettify/prettify.js",1277,11] +["./prettify/prettify.js",1277,12,"PR_PUNCTUATION"] +["./prettify/prettify.js",1277,29] +["./prettify/prettify.js",1278,11] +["./prettify/prettify.js",1278,12] +["./prettify/prettify.js",1278,29] +["./prettify/prettify.js",1279,11] +["./prettify/prettify.js",1279,12] +["./prettify/prettify.js",1279,29] +["./prettify/prettify.js",1280,11] +["./prettify/prettify.js",1280,12] +["./prettify/prettify.js",1280,29] +["./prettify/prettify.js",1281,11] +["./prettify/prettify.js",1281,12] +["./prettify/prettify.js",1281,29] +["./prettify/prettify.js",1282,11] +["./prettify/prettify.js",1282,12] +["./prettify/prettify.js",1282,29] +["./prettify/prettify.js",1283,11] +["./prettify/prettify.js",1283,12] +["./prettify/prettify.js",1283,29] +["./prettify/prettify.js",1285,6] +["./prettify/prettify.js",1285,7] +["./prettify/prettify.js",1286,2] +["./prettify/prettify.js",1286,21] +["./prettify/prettify.js",1286,2,"registerLangHandler"] +["./prettify/prettify.js",1287,23] +["./prettify/prettify.js",1287,6,"createSimpleLexer"] +["./prettify/prettify.js",1287,24] +["./prettify/prettify.js",1287,28] +["./prettify/prettify.js",1287,29] +["./prettify/prettify.js",169,24,"PR_ATTRIB_VALUE"] +["./prettify/prettify.js",1287,47] +["./prettify/prettify.js",1287,62] +["./prettify/prettify.js",1287,63] +["./prettify/prettify.js",1288,2] +["./prettify/prettify.js",1288,21] +["./prettify/prettify.js",1288,2,"registerLangHandler"] +["./prettify/prettify.js",1288,37] +["./prettify/prettify.js",1288,22,"sourceDecorator"] +["./prettify/prettify.js",1288,38] +["./prettify/prettify.js",114,78,"CPP_KEYWORDS"] +["./prettify/prettify.js",1290,26] +["./prettify/prettify.js",1291,28] +["./prettify/prettify.js",1292,12] +["./prettify/prettify.js",1292,13] +["./prettify/prettify.js",1292,18] +["./prettify/prettify.js",1292,24] +["./prettify/prettify.js",1292,31] +["./prettify/prettify.js",1292,38] +["./prettify/prettify.js",1292,45] +["./prettify/prettify.js",1293,2] +["./prettify/prettify.js",1293,21] +["./prettify/prettify.js",1293,2,"registerLangHandler"] +["./prettify/prettify.js",1293,37] +["./prettify/prettify.js",1293,22,"sourceDecorator"] +["./prettify/prettify.js",1293,38] +["./prettify/prettify.js",1294,22] +["./prettify/prettify.js",1295,12] +["./prettify/prettify.js",1295,13] +["./prettify/prettify.js",1296,2] +["./prettify/prettify.js",1296,21] +["./prettify/prettify.js",1296,2,"registerLangHandler"] +["./prettify/prettify.js",1296,37] +["./prettify/prettify.js",1296,22,"sourceDecorator"] +["./prettify/prettify.js",1296,38] +["./prettify/prettify.js",123,78,"CSHARP_KEYWORDS"] +["./prettify/prettify.js",1298,26] +["./prettify/prettify.js",1299,28] +["./prettify/prettify.js",1300,29] +["./prettify/prettify.js",1301,12] +["./prettify/prettify.js",1301,13] +["./prettify/prettify.js",1302,2] +["./prettify/prettify.js",1302,21] +["./prettify/prettify.js",1302,2,"registerLangHandler"] +["./prettify/prettify.js",1302,37] +["./prettify/prettify.js",1302,22,"sourceDecorator"] +["./prettify/prettify.js",1302,38] +["./prettify/prettify.js",118,75,"JAVA_KEYWORDS"] +["./prettify/prettify.js",1304,28] +["./prettify/prettify.js",1305,12] +["./prettify/prettify.js",1305,13] +["./prettify/prettify.js",1306,2] +["./prettify/prettify.js",1306,21] +["./prettify/prettify.js",1306,2,"registerLangHandler"] +["./prettify/prettify.js",1306,37] +["./prettify/prettify.js",1306,22,"sourceDecorator"] +["./prettify/prettify.js",1306,38] +["./prettify/prettify.js",138,75,"SH_KEYWORDS"] +["./prettify/prettify.js",1308,26] +["./prettify/prettify.js",1309,30] +["./prettify/prettify.js",1310,12] +["./prettify/prettify.js",1310,13] +["./prettify/prettify.js",1310,20] +["./prettify/prettify.js",1310,27] +["./prettify/prettify.js",1311,2] +["./prettify/prettify.js",1311,21] +["./prettify/prettify.js",1311,2,"registerLangHandler"] +["./prettify/prettify.js",1311,37] +["./prettify/prettify.js",1311,22,"sourceDecorator"] +["./prettify/prettify.js",1311,38] +["./prettify/prettify.js",133,57,"PYTHON_KEYWORDS"] +["./prettify/prettify.js",1313,26] +["./prettify/prettify.js",1314,30] +["./prettify/prettify.js",1315,33] +["./prettify/prettify.js",1316,12] +["./prettify/prettify.js",1316,13] +["./prettify/prettify.js",1316,19] +["./prettify/prettify.js",1317,2] +["./prettify/prettify.js",1317,21] +["./prettify/prettify.js",1317,2,"registerLangHandler"] +["./prettify/prettify.js",1317,37] +["./prettify/prettify.js",1317,22,"sourceDecorator"] +["./prettify/prettify.js",1317,38] +["./prettify/prettify.js",129,77,"PERL_KEYWORDS"] +["./prettify/prettify.js",1319,26] +["./prettify/prettify.js",1320,30] +["./prettify/prettify.js",1321,27] +["./prettify/prettify.js",1322,12] +["./prettify/prettify.js",1322,13] +["./prettify/prettify.js",1322,21] +["./prettify/prettify.js",1322,27] +["./prettify/prettify.js",1323,2] +["./prettify/prettify.js",1323,21] +["./prettify/prettify.js",1323,2,"registerLangHandler"] +["./prettify/prettify.js",1323,37] +["./prettify/prettify.js",1323,22,"sourceDecorator"] +["./prettify/prettify.js",1323,38] +["./prettify/prettify.js",136,79,"RUBY_KEYWORDS"] +["./prettify/prettify.js",1325,26] +["./prettify/prettify.js",1326,30] +["./prettify/prettify.js",1327,27] +["./prettify/prettify.js",1328,12] +["./prettify/prettify.js",1328,13] +["./prettify/prettify.js",1329,2] +["./prettify/prettify.js",1329,21] +["./prettify/prettify.js",1329,2,"registerLangHandler"] +["./prettify/prettify.js",1329,37] +["./prettify/prettify.js",1329,22,"sourceDecorator"] +["./prettify/prettify.js",1329,38] +["./prettify/prettify.js",126,71,"JSCRIPT_KEYWORDS"] +["./prettify/prettify.js",1331,28] +["./prettify/prettify.js",1332,27] +["./prettify/prettify.js",1333,12] +["./prettify/prettify.js",1333,13] +["./prettify/prettify.js",1334,2] +["./prettify/prettify.js",1334,21] +["./prettify/prettify.js",1334,2,"registerLangHandler"] +["./prettify/prettify.js",1335,23] +["./prettify/prettify.js",1335,6,"createSimpleLexer"] +["./prettify/prettify.js",1335,24] +["./prettify/prettify.js",1335,28] +["./prettify/prettify.js",1335,29] +["./prettify/prettify.js",1335,30,"PR_STRING"] +["./prettify/prettify.js",1335,41] +["./prettify/prettify.js",1335,56] +["./prettify/prettify.js",1335,57] +["./prettify/prettify.js",1495,2] +["./prettify/prettify.js",1495,2] +["./prettify/prettify.js",1495,2,"window"] +["./prettify/prettify.js",1495,32,"normalizedHtml"] +["./prettify/prettify.js",1496,2] +["./prettify/prettify.js",1496,2] +["./prettify/prettify.js",1496,2,"window"] +["./prettify/prettify.js",1370,11,"prettyPrintOne"] +["./prettify/prettify.js",1370,11,"prettyPrintOne"] +["./prettify/prettify.js",1370,25] +["./prettify/prettify.js",1370,26,"sourceCodeHtml"] +["./prettify/prettify.js",1370,42,"opt_langExtension"] +["./prettify/prettify.js",1370,61] +["./prettify/prettify.js",1371,4] +["./prettify/prettify.js",1371,8,"job"] +["./prettify/prettify.js",1371,14] +["./prettify/prettify.js",1372,22,"sourceCodeHtml"] +["./prettify/prettify.js",1373,21,"opt_langExtension"] +["./prettify/prettify.js",1375,4] +["./prettify/prettify.js",1375,18] +["./prettify/prettify.js",1375,4,"applyDecorator"] +["./prettify/prettify.js",1375,19,"job"] +["./prettify/prettify.js",1376,4] +["./prettify/prettify.js",1376,11,"prettyPrintedHtml"] +["./prettify/prettify.js",1376,11,"job"] +["./prettify/prettify.js",1497,2] +["./prettify/prettify.js",1497,2] +["./prettify/prettify.js",1497,2,"window"] +["./prettify/prettify.js",1379,11,"prettyPrint"] +["./prettify/prettify.js",1379,11,"prettyPrint"] +["./prettify/prettify.js",1379,22] +["./prettify/prettify.js",1379,23,"opt_whenDone"] +["./prettify/prettify.js",1379,37] +["./prettify/prettify.js",1401,13] +["./prettify/prettify.js",1401,13,"doWork"] +["./prettify/prettify.js",1401,19] +["./prettify/prettify.js",1401,22] +["./prettify/prettify.js",1405,6] +["./prettify/prettify.js",1402,6] +["./prettify/prettify.js",1402,10,"endTime"] +["./prettify/prettify.js",1402,21] +["./prettify/prettify.js",1402,21] +["./prettify/prettify.js",1402,21,"window"] +["./prettify/prettify.js",1403,30] +["./prettify/prettify.js",1403,21,"now"] +["./prettify/prettify.js",1403,21,"clock"] +["./prettify/prettify.js",1403,35] +["./prettify/prettify.js",1404,21,"Infinity"] +["./prettify/prettify.js",1405,13,"k"] +["./prettify/prettify.js",1405,17,"length"] +["./prettify/prettify.js",1405,17,"elements"] +["./prettify/prettify.js",1405,45] +["./prettify/prettify.js",1405,36,"now"] +["./prettify/prettify.js",1405,36,"clock"] +["./prettify/prettify.js",1405,50,"endTime"] +["./prettify/prettify.js",1405,59] +["./prettify/prettify.js",1405,59,"k"] +["./prettify/prettify.js",1405,64] +["./prettify/prettify.js",1406,8] +["./prettify/prettify.js",1406,12,"cs"] +["./prettify/prettify.js",1406,17] +["./prettify/prettify.js",1406,17,"elements"] +["./prettify/prettify.js",1406,26,"k"] +["./prettify/prettify.js",1407,8] +["./prettify/prettify.js",1407,12,"className"] +["./prettify/prettify.js",1407,12,"cs"] +["./prettify/prettify.js",1407,48] +["./prettify/prettify.js",1407,28,"indexOf"] +["./prettify/prettify.js",1407,28,"className"] +["./prettify/prettify.js",1407,28,"cs"] +["./prettify/prettify.js",1407,49] +["./prettify/prettify.js",1407,67] +["./prettify/prettify.js",1407,70] +["./prettify/prettify.js",1413,10] +["./prettify/prettify.js",1413,14,"langExtension"] +["./prettify/prettify.js",1413,48] +["./prettify/prettify.js",1413,30,"match"] +["./prettify/prettify.js",1413,30,"className"] +["./prettify/prettify.js",1413,30,"cs"] +["./prettify/prettify.js",1413,49] +["./prettify/prettify.js",1414,10] +["./prettify/prettify.js",1414,14,"langExtension"] +["./prettify/prettify.js",1414,31] +["./prettify/prettify.js",1414,31,"langExtension"] +["./prettify/prettify.js",1414,47] +["./prettify/prettify.js",1414,47,"langExtension"] +["./prettify/prettify.js",1414,61] +["./prettify/prettify.js",1418,10] +["./prettify/prettify.js",1417,10] +["./prettify/prettify.js",1417,14,"nested"] +["./prettify/prettify.js",1417,23] +["./prettify/prettify.js",1418,19,"p"] +["./prettify/prettify.js",1418,23,"parentNode"] +["./prettify/prettify.js",1418,23,"cs"] +["./prettify/prettify.js",1418,38,"p"] +["./prettify/prettify.js",1418,41,"p"] +["./prettify/prettify.js",1418,45,"parentNode"] +["./prettify/prettify.js",1418,45,"p"] +["./prettify/prettify.js",1419,12] +["./prettify/prettify.js",1419,17,"tagName"] +["./prettify/prettify.js",1419,17,"p"] +["./prettify/prettify.js",1419,31] +["./prettify/prettify.js",1419,40,"tagName"] +["./prettify/prettify.js",1419,40,"p"] +["./prettify/prettify.js",1419,54] +["./prettify/prettify.js",1420,17,"tagName"] +["./prettify/prettify.js",1420,17,"p"] +["./prettify/prettify.js",1420,31] +["./prettify/prettify.js",1421,16,"className"] +["./prettify/prettify.js",1421,16,"p"] +["./prettify/prettify.js",1421,50] +["./prettify/prettify.js",1421,31,"indexOf"] +["./prettify/prettify.js",1421,31,"className"] +["./prettify/prettify.js",1421,31,"p"] +["./prettify/prettify.js",1421,51] +["./prettify/prettify.js",1421,69] +["./prettify/prettify.js",1421,72] +["./prettify/prettify.js",1422,14] +["./prettify/prettify.js",1422,14,"nested"] +["./prettify/prettify.js",1422,23] +["./prettify/prettify.js",1423,14] +["./prettify/prettify.js",1428,10] +["./prettify/prettify.js",1428,15,"className"] +["./prettify/prettify.js",1428,15,"cs"] +["./prettify/prettify.js",1428,51] +["./prettify/prettify.js",1428,31,"indexOf"] +["./prettify/prettify.js",1428,31,"className"] +["./prettify/prettify.js",1428,31,"cs"] +["./prettify/prettify.js",1428,52] +["./prettify/prettify.js",1428,74] +["./prettify/prettify.js",1429,12] +["./prettify/prettify.js",1429,12,"nested"] +["./prettify/prettify.js",1429,21] +["./prettify/prettify.js",1433,10] +["./prettify/prettify.js",1433,14] +["./prettify/prettify.js",1433,15,"nested"] +["./prettify/prettify.js",1433,23] +["./prettify/prettify.js",1436,39,"cs"] +["./prettify/prettify.js",1436,39,"cs"] +["./prettify/prettify.js",1436,39,"cs"] +["./prettify/prettify.js",580,4] +["./prettify/prettify.js",580,8] +["./prettify/prettify.js",580,17,"PR_innerHtmlWorks"] +["./prettify/prettify.js",580,36] +["./prettify/prettify.js",581,10,"testNode"] +["./prettify/prettify.js",581,10,"testNode"] +["./prettify/prettify.js",581,43] +["./prettify/prettify.js",581,21,"createElement"] +["./prettify/prettify.js",581,21,"document"] +["./prettify/prettify.js",581,44] +["./prettify/prettify.js",582,6] +["./prettify/prettify.js",582,26] +["./prettify/prettify.js",582,6,"appendChild"] +["./prettify/prettify.js",582,6,"testNode"] +["./prettify/prettify.js",583,33] +["./prettify/prettify.js",583,10,"createTextNode"] +["./prettify/prettify.js",583,10,"document"] +["./prettify/prettify.js",583,34] +["./prettify/prettify.js",584,6] +["./prettify/prettify.js",584,6,"PR_innerHtmlWorks"] +["./prettify/prettify.js",584,26] +["./prettify/prettify.js",584,35] +["./prettify/prettify.js",584,27,"test"] +["./prettify/prettify.js",584,27] +["./prettify/prettify.js",584,36,"innerHTML"] +["./prettify/prettify.js",584,36,"testNode"] +["./prettify/prettify.js",587,4] +["./prettify/prettify.js",587,8,"PR_innerHtmlWorks"] +["./prettify/prettify.js",587,27] +["./prettify/prettify.js",588,10,"content"] +["./prettify/prettify.js",588,10,"content"] +["./prettify/prettify.js",588,20,"innerHTML"] +["./prettify/prettify.js",588,20,"node"] +["./prettify/prettify.js",590,6] +["./prettify/prettify.js",284,11] +["./prettify/prettify.js",284,21,"tagName"] +["./prettify/prettify.js",590,23,"node"] +["./prettify/prettify.js",591,8] +["./prettify/prettify.js",591,8,"content"] +["./prettify/prettify.js",591,28] +["./prettify/prettify.js",591,18,"textToHtml"] +["./prettify/prettify.js",591,29,"content"] +["./prettify/prettify.js",592,13] +["./prettify/prettify.js",592,33,"node"] +["./prettify/prettify.js",592,33,"node"] +["./prettify/prettify.js",592,33,"node"] +["./prettify/prettify.js",294,4] +["./prettify/prettify.js",294,8] +["./prettify/prettify.js",294,18,"tagName"] +["./prettify/prettify.js",294,18,"node"] +["./prettify/prettify.js",294,34] +["./prettify/prettify.js",294,34] +["./prettify/prettify.js",294,41] +["./prettify/prettify.js",295,4] +["./prettify/prettify.js",295,23] +["./prettify/prettify.js",295,9,"test"] +["./prettify/prettify.js",295,9,"newlineRe"] +["./prettify/prettify.js",592,39,"content"] +["./prettify/prettify.js",295,4] +["./prettify/prettify.js",296,4] +["./prettify/prettify.js",296,8,"whitespace"] +["./prettify/prettify.js",296,21] +["./prettify/prettify.js",298,4] +["./prettify/prettify.js",298,8,"currentStyle"] +["./prettify/prettify.js",298,8,"node"] +["./prettify/prettify.js",299,6] +["./prettify/prettify.js",299,6,"whitespace"] +["./prettify/prettify.js",299,19,"whiteSpace"] +["./prettify/prettify.js",299,19,"currentStyle"] +["./prettify/prettify.js",299,19,"node"] +["./prettify/prettify.js",300,11] +["./prettify/prettify.js",300,15,"getComputedStyle"] +["./prettify/prettify.js",300,15,"window"] +["./prettify/prettify.js",303,6] +["./prettify/prettify.js",303,6,"whitespace"] +["./prettify/prettify.js",303,19,"whiteSpace"] +["./prettify/prettify.js",303,42] +["./prettify/prettify.js",303,19,"getComputedStyle"] +["./prettify/prettify.js",303,19,"window"] +["./prettify/prettify.js",303,43,"node"] +["./prettify/prettify.js",303,49] +["./prettify/prettify.js",305,4] +["./prettify/prettify.js",305,4] +["./prettify/prettify.js",305,11] +["./prettify/prettify.js",305,12,"whitespace"] +["./prettify/prettify.js",305,26,"whitespace"] +["./prettify/prettify.js",305,41] +["./prettify/prettify.js",295,36] +["./prettify/prettify.js",295,36] +["./prettify/prettify.js",295,43] +["./prettify/prettify.js",592,13] +["./prettify/prettify.js",592,32] +["./prettify/prettify.js",593,8,"content"] +["./prettify/prettify.js",594,20] +["./prettify/prettify.js",594,18,"replace"] +["./prettify/prettify.js",593,33] +["./prettify/prettify.js",593,18,"replace"] +["./prettify/prettify.js",593,18,"content"] +["./prettify/prettify.js",593,34] +["./prettify/prettify.js",593,58] +["./prettify/prettify.js",594,21] +["./prettify/prettify.js",594,44] +["./prettify/prettify.js",596,6] +["./prettify/prettify.js",596,6] +["./prettify/prettify.js",596,13,"content"] +["./prettify/prettify.js",587,4] +["./prettify/prettify.js",599,8,"out"] +["./prettify/prettify.js",599,8,"out"] +["./prettify/prettify.js",599,14] +["./prettify/prettify.js",600,4] +["./prettify/prettify.js",600,13,"child"] +["./prettify/prettify.js",600,21,"firstChild"] +["./prettify/prettify.js",600,21,"node"] +["./prettify/prettify.js",600,38,"child"] +["./prettify/prettify.js",600,45,"child"] +["./prettify/prettify.js",600,53,"nextSibling"] +["./prettify/prettify.js",600,53,"child"] +["./prettify/prettify.js",601,6] +["./prettify/prettify.js",601,20] +["./prettify/prettify.js",601,6,"normalizedHtml"] +["./prettify/prettify.js",601,21,"child"] +["./prettify/prettify.js",601,28,"out"] +["./prettify/prettify.js",603,4] +["./prettify/prettify.js",603,4] +["./prettify/prettify.js",603,19] +["./prettify/prettify.js",603,11,"join"] +["./prettify/prettify.js",603,11,"out"] +["./prettify/prettify.js",603,20] +["./prettify/prettify.js",1437,12] +["./prettify/prettify.js",1437,12,"content"] +["./prettify/prettify.js",1437,37] +["./prettify/prettify.js",1437,22,"replace"] +["./prettify/prettify.js",1437,22,"content"] +["./prettify/prettify.js",1437,38] +["./prettify/prettify.js",1437,55] +["./prettify/prettify.js",1440,12] +["./prettify/prettify.js",1440,12,"prettyPrintingJob"] +["./prettify/prettify.js",1440,32] +["./prettify/prettify.js",1441,30,"content"] +["./prettify/prettify.js",1442,29,"langExtension"] +["./prettify/prettify.js",1443,26,"cs"] +["./prettify/prettify.js",1445,12] +["./prettify/prettify.js",1445,26] +["./prettify/prettify.js",1445,12,"applyDecorator"] +["./prettify/prettify.js",1445,27,"prettyPrintingJob"] +["./prettify/prettify.js",1461,6] +["./prettify/prettify.js",1460,10,"newContent"] +["./prettify/prettify.js",1460,23,"prettyPrintedHtml"] +["./prettify/prettify.js",1460,23,"prettyPrintingJob"] +["./prettify/prettify.js",1461,6] +["./prettify/prettify.js",1462,10,"cs"] +["./prettify/prettify.js",1462,10,"cs"] +["./prettify/prettify.js",1462,15,"sourceNode"] +["./prettify/prettify.js",1462,15,"prettyPrintingJob"] +["./prettify/prettify.js",1465,6] +["./prettify/prettify.js",284,11] +["./prettify/prettify.js",284,21,"tagName"] +["./prettify/prettify.js",1465,24,"cs"] +["./prettify/prettify.js",1468,13] +["./prettify/prettify.js",1472,12,"pre"] +["./prettify/prettify.js",1472,12,"pre"] +["./prettify/prettify.js",1472,40] +["./prettify/prettify.js",1472,18,"createElement"] +["./prettify/prettify.js",1472,18,"document"] +["./prettify/prettify.js",1472,41] +["./prettify/prettify.js",1473,8] +["./prettify/prettify.js",1473,17,"i"] +["./prettify/prettify.js",1473,21] +["./prettify/prettify.js",1473,24,"i"] +["./prettify/prettify.js",1473,28,"length"] +["./prettify/prettify.js",1473,28,"attributes"] +["./prettify/prettify.js",1473,28,"cs"] +["./prettify/prettify.js",1473,50] +["./prettify/prettify.js",1473,52,"i"] +["./prettify/prettify.js",1473,55] +["./prettify/prettify.js",1474,10] +["./prettify/prettify.js",1474,14,"a"] +["./prettify/prettify.js",1474,18] +["./prettify/prettify.js",1474,18,"attributes"] +["./prettify/prettify.js",1474,18,"cs"] +["./prettify/prettify.js",1474,32,"i"] +["./prettify/prettify.js",1475,10] +["./prettify/prettify.js",1475,14,"specified"] +["./prettify/prettify.js",1475,14,"a"] +["./prettify/prettify.js",1477,12] +["./prettify/prettify.js",1476,42,"aname"] +["./prettify/prettify.js",1476,24,"toLowerCase"] +["./prettify/prettify.js",1476,24,"name"] +["./prettify/prettify.js",1476,24,"a"] +["./prettify/prettify.js",1477,26] +["./prettify/prettify.js",1478,14] +["./prettify/prettify.js",1478,14,"className"] +["./prettify/prettify.js",1478,14,"pre"] +["./prettify/prettify.js",1478,30,"value"] +["./prettify/prettify.js",1478,30,"a"] +["./prettify/prettify.js",1480,14] +["./prettify/prettify.js",1480,30] +["./prettify/prettify.js",1480,14,"setAttribute"] +["./prettify/prettify.js",1480,14,"pre"] +["./prettify/prettify.js",1480,31,"name"] +["./prettify/prettify.js",1480,31,"a"] +["./prettify/prettify.js",1480,39,"value"] +["./prettify/prettify.js",1480,39,"a"] +["./prettify/prettify.js",1484,8] +["./prettify/prettify.js",1484,8,"innerHTML"] +["./prettify/prettify.js",1484,8,"pre"] +["./prettify/prettify.js",1484,24,"newContent"] +["./prettify/prettify.js",1487,8] +["./prettify/prettify.js",1487,34] +["./prettify/prettify.js",1487,8,"replaceChild"] +["./prettify/prettify.js",1487,8,"parentNode"] +["./prettify/prettify.js",1487,8,"cs"] +["./prettify/prettify.js",1487,35,"pre"] +["./prettify/prettify.js",1487,40,"cs"] +["./prettify/prettify.js",1467,8] +["./prettify/prettify.js",1467,8,"innerHTML"] +["./prettify/prettify.js",1467,8,"cs"] +["./prettify/prettify.js",1467,23,"newContent"] +["./prettify/prettify.js",1447,3] +["./prettify/prettify.js",1447,3,"className"] +["./prettify/prettify.js",1447,3,"cs"] +["./prettify/prettify.js",1447,19] +["./prettify/prettify.js",1451,6] +["./prettify/prettify.js",1451,10,"k"] +["./prettify/prettify.js",1451,14,"length"] +["./prettify/prettify.js",1451,14,"elements"] +["./prettify/prettify.js",1453,8] +["./prettify/prettify.js",1453,18] +["./prettify/prettify.js",1453,8,"setTimeout"] +["./prettify/prettify.js",1453,19,"doWork"] +["./prettify/prettify.js",1453,27] +["./prettify/prettify.js",1454,13] +["./prettify/prettify.js",1454,17,"opt_whenDone"] +["./prettify/prettify.js",1455,20] +["./prettify/prettify.js",1455,8,"opt_whenDone"] +["./prettify/prettify.js",1384,4] +["./prettify/prettify.js",1382,4] +["./prettify/prettify.js",1382,8,"codeSegments"] +["./prettify/prettify.js",1382,23] +["./prettify/prettify.js",1380,65] +["./prettify/prettify.js",1380,36,"getElementsByTagName"] +["./prettify/prettify.js",1380,36,"document"] +["./prettify/prettify.js",1382,34,"tn"] +["./prettify/prettify.js",1380,65] +["./prettify/prettify.js",1380,36,"getElementsByTagName"] +["./prettify/prettify.js",1380,36,"document"] +["./prettify/prettify.js",1382,52,"tn"] +["./prettify/prettify.js",1380,65] +["./prettify/prettify.js",1380,36,"getElementsByTagName"] +["./prettify/prettify.js",1380,36,"document"] +["./prettify/prettify.js",1382,71,"tn"] +["./prettify/prettify.js",1383,8,"elements"] +["./prettify/prettify.js",1383,19] +["./prettify/prettify.js",1384,13,"i"] +["./prettify/prettify.js",1384,17] +["./prettify/prettify.js",1384,20,"i"] +["./prettify/prettify.js",1384,24,"length"] +["./prettify/prettify.js",1384,24,"codeSegments"] +["./prettify/prettify.js",1384,45] +["./prettify/prettify.js",1384,47,"i"] +["./prettify/prettify.js",1385,6] +["./prettify/prettify.js",1385,6] +["./prettify/prettify.js",1385,15,"j"] +["./prettify/prettify.js",1385,19] +["./prettify/prettify.js",1385,22,"n"] +["./prettify/prettify.js",1385,26,"length"] +["./prettify/prettify.js",1385,26] +["./prettify/prettify.js",1385,26,"codeSegments"] +["./prettify/prettify.js",1385,39,"i"] +["./prettify/prettify.js",1385,50,"j"] +["./prettify/prettify.js",1385,54,"n"] +["./prettify/prettify.js",1385,57] +["./prettify/prettify.js",1385,59,"j"] +["./prettify/prettify.js",1386,8] +["./prettify/prettify.js",1386,21] +["./prettify/prettify.js",1386,8,"push"] +["./prettify/prettify.js",1386,8,"elements"] +["./prettify/prettify.js",1386,22] +["./prettify/prettify.js",1386,22] +["./prettify/prettify.js",1386,22,"codeSegments"] +["./prettify/prettify.js",1386,35,"i"] +["./prettify/prettify.js",1386,38,"j"] +["./prettify/prettify.js",1389,4] +["./prettify/prettify.js",1389,4,"codeSegments"] +["./prettify/prettify.js",1389,19] +["./prettify/prettify.js",1391,4] +["./prettify/prettify.js",1391,8,"clock"] +["./prettify/prettify.js",1391,16,"Date"] +["./prettify/prettify.js",1392,4] +["./prettify/prettify.js",1392,9] +["./prettify/prettify.js",1392,9,"clock"] +["./prettify/prettify.js",1393,6,"clock"] +["./prettify/prettify.js",1393,14] +["./prettify/prettify.js",1393,32] +["./prettify/prettify.js",1393,32,""] +["./prettify/prettify.js",1393,32] +["./prettify/prettify.js",1393,35] +["./prettify/prettify.js",1393,37] +["./prettify/prettify.js",1393,62] +["./prettify/prettify.js",1393,45,"getTime"] +["./prettify/prettify.js",1393,44] +["./prettify/prettify.js",1393,49,"Date"] +["./prettify/prettify.js",1398,4] +["./prettify/prettify.js",1398,8,"k"] +["./prettify/prettify.js",1398,12] +["./prettify/prettify.js",1399,8,"prettyPrintingJob"] +["./prettify/prettify.js",1492,4] +["./prettify/prettify.js",1492,10] +["./prettify/prettify.js",1492,4,"doWork"] +["./prettify/prettify.js",1498,2] +["./prettify/prettify.js",1498,2] +["./prettify/prettify.js",1498,2,"window"] +["./prettify/prettify.js",1498,17] +["./prettify/prettify.js",1499,33,"combinePrefixPatterns"] +["./prettify/prettify.js",1500,29,"createSimpleLexer"] +["./prettify/prettify.js",1501,31,"registerLangHandler"] +["./prettify/prettify.js",1502,27,"sourceDecorator"] +["./prettify/prettify.js",167,23,"PR_ATTRIB_NAME"] +["./prettify/prettify.js",169,24,"PR_ATTRIB_VALUE"] +["./prettify/prettify.js",1505,22,"PR_COMMENT"] +["./prettify/prettify.js",163,23,"PR_DECLARATION"] +["./prettify/prettify.js",1507,22,"PR_KEYWORD"] +["./prettify/prettify.js",1508,22,"PR_LITERAL"] +["./prettify/prettify.js",1509,21,"PR_NOCODE"] +["./prettify/prettify.js",1510,20,"PR_PLAIN"] +["./prettify/prettify.js",1511,26,"PR_PUNCTUATION"] +["./prettify/prettify.js",1512,21,"PR_SOURCE"] +["./prettify/prettify.js",1513,21,"PR_STRING"] +["./prettify/prettify.js",161,15,"PR_TAG"] +["./prettify/prettify.js",1515,19,"PR_TYPE"] diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.css new file mode 100644 index 000000000..221bd0c6a --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.css @@ -0,0 +1,44 @@ +/* Pretty printing styles. Used with prettify.js. */ + +.str { color: #080; } +.kwd { color: #008; } +.com { color: #800; } +.typ { color: #606; } +.lit { color: #066; } +.pun { color: #660; } +.pln { color: #000; } +.tag { color: #008; } +.atn { color: #606; } +.atv { color: #080; } +.dec { color: #606; } +pre.prettyprint { padding: 2px; border: 1px solid #888 } + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { background: #eee } + +@media print { + .str { color: #060; } + .kwd { color: #006; font-weight: bold; } + .com { color: #600; font-style: italic; } + .typ { color: #404; font-weight: bold; } + .lit { color: #044; } + .pun { color: #440; } + .pln { color: #000; } + .tag { color: #006; font-weight: bold; } + .atn { color: #404; } + .atv { color: #060; } +} diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.js new file mode 100644 index 000000000..f1265bde5 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.js @@ -0,0 +1,1517 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview + * some functions for browser-side pretty printing of code contained in html. + * <p> + * + * For a fairly comprehensive set of languages see the + * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a> + * file that came with this source. At a minimum, the lexer should work on a + * number of languages including C and friends, Java, Python, Bash, SQL, HTML, + * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk + * and a subset of Perl, but, because of commenting conventions, doesn't work on + * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. + * <p> + * Usage: <ol> + * <li> include this source file in an html page via + * {@code <script type="text/javascript" src="/path/to/prettify.js"></script>} + * <li> define style rules. See the example page for examples. + * <li> mark the {@code <pre>} and {@code <code>} tags in your source with + * {@code class=prettyprint.} + * You can also use the (html deprecated) {@code <xmp>} tag, but the pretty + * printer needs to do more substantial DOM manipulations to support that, so + * some css styles may not be preserved. + * </ol> + * That's it. I wanted to keep the API as simple as possible, so there's no + * need to specify which language the code is in, but if you wish, you can add + * another class to the {@code <pre>} or {@code <code>} element to specify the + * language, as in {@code <pre class="prettyprint lang-java">}. Any class that + * starts with "lang-" followed by a file extension, specifies the file type. + * See the "lang-*.js" files in this directory for code that implements + * per-language file handlers. + * <p> + * Change log:<br> + * cbeust, 2006/08/22 + * <blockquote> + * Java annotations (start with "@") are now captured as literals ("lit") + * </blockquote> + * @requires console + */ + +// JSLint declarations +/*global console, document, navigator, setTimeout, window */ + +/** + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with + * UI events. + * If set to {@code false}, {@code prettyPrint()} is synchronous. + */ +window['PR_SHOULD_USE_CONTINUATION'] = true; + +/** the number of characters between tab columns */ +window['PR_TAB_WIDTH'] = 4; + +/** Walks the DOM returning a properly escaped version of innerHTML. + * @param {Node} node + * @param {Array.<string>} out output buffer that receives chunks of HTML. + */ +window['PR_normalizedHtml'] + +/** Contains functions for creating and registering new language handlers. + * @type {Object} + */ + = window['PR'] + +/** Pretty print a chunk of code. + * + * @param {string} sourceCodeHtml code as html + * @return {string} code as html, but prettier + */ + = window['prettyPrintOne'] +/** Find all the {@code <pre>} and {@code <code>} tags in the DOM with + * {@code class=prettyprint} and prettify them. + * @param {Function?} opt_whenDone if specified, called when the last entry + * has been finished. + */ + = window['prettyPrint'] = void 0; + +/** browser detection. @extern @returns false if not IE, otherwise the major version. */ +window['_pr_isIE6'] = function () { + var ieVersion = navigator && navigator.userAgent && + navigator.userAgent.match(/\bMSIE ([678])\./); + ieVersion = ieVersion ? +ieVersion[1] : false; + window['_pr_isIE6'] = function () { return ieVersion; }; + return ieVersion; +}; + + +(function () { + // Keyword lists for various languages. + var FLOW_CONTROL_KEYWORDS = + "break continue do else for if return while "; + var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " + + "double enum extern float goto int long register short signed sizeof " + + "static struct switch typedef union unsigned void volatile "; + var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " + + "new operator private protected public this throw true try typeof "; + var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " + + "concept concept_map const_cast constexpr decltype " + + "dynamic_cast explicit export friend inline late_check " + + "mutable namespace nullptr reinterpret_cast static_assert static_cast " + + "template typeid typename using virtual wchar_t where "; + var JAVA_KEYWORDS = COMMON_KEYWORDS + + "abstract boolean byte extends final finally implements import " + + "instanceof null native package strictfp super synchronized throws " + + "transient "; + var CSHARP_KEYWORDS = JAVA_KEYWORDS + + "as base by checked decimal delegate descending event " + + "fixed foreach from group implicit in interface internal into is lock " + + "object out override orderby params partial readonly ref sbyte sealed " + + "stackalloc string select uint ulong unchecked unsafe ushort var "; + var JSCRIPT_KEYWORDS = COMMON_KEYWORDS + + "debugger eval export function get null set undefined var with " + + "Infinity NaN "; + var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " + + "goto if import last local my next no our print package redo require " + + "sub undef unless until use wantarray while BEGIN END "; + var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " + + "elif except exec finally from global import in is lambda " + + "nonlocal not or pass print raise try with yield " + + "False True None "; + var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" + + " defined elsif end ensure false in module next nil not or redo rescue " + + "retry self super then true undef unless until when yield BEGIN END "; + var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " + + "function in local set then until "; + var ALL_KEYWORDS = ( + CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS + + PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS); + + // token style names. correspond to css classes + /** token style for a string literal */ + var PR_STRING = 'str'; + /** token style for a keyword */ + var PR_KEYWORD = 'kwd'; + /** token style for a comment */ + var PR_COMMENT = 'com'; + /** token style for a type */ + var PR_TYPE = 'typ'; + /** token style for a literal value. e.g. 1, null, true. */ + var PR_LITERAL = 'lit'; + /** token style for a punctuation string. */ + var PR_PUNCTUATION = 'pun'; + /** token style for a punctuation string. */ + var PR_PLAIN = 'pln'; + + /** token style for an sgml tag. */ + var PR_TAG = 'tag'; + /** token style for a markup declaration such as a DOCTYPE. */ + var PR_DECLARATION = 'dec'; + /** token style for embedded source. */ + var PR_SOURCE = 'src'; + /** token style for an sgml attribute name. */ + var PR_ATTRIB_NAME = 'atn'; + /** token style for an sgml attribute value. */ + var PR_ATTRIB_VALUE = 'atv'; + + /** + * A class that indicates a section of markup that is not code, e.g. to allow + * embedding of line numbers within code listings. + */ + var PR_NOCODE = 'nocode'; + + /** A set of tokens that can precede a regular expression literal in + * javascript. + * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full + * list, but I've removed ones that might be problematic when seen in + * languages that don't support regular expression literals. + * + * <p>Specifically, I've removed any keywords that can't precede a regexp + * literal in a syntactically legal javascript program, and I've removed the + * "in" keyword since it's not a keyword in many languages, and might be used + * as a count of inches. + * + * <p>The link a above does not accurately describe EcmaScript rules since + * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works + * very well in practice. + * + * @private + */ + var REGEXP_PRECEDER_PATTERN = function () { + var preceders = [ + "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=", + "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=", + "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";", + "<", "<<", "<<=", "<=", "=", "==", "===", ">", + ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[", + "^", "^=", "^^", "^^=", "{", "|", "|=", "||", + "||=", "~" /* handles =~ and !~ */, + "break", "case", "continue", "delete", + "do", "else", "finally", "instanceof", + "return", "throw", "try", "typeof" + ]; + var pattern = '(?:^^|[+-]'; + for (var i = 0; i < preceders.length; ++i) { + pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1'); + } + pattern += ')\\s*'; // matches at end, and matches empty string + return pattern; + // CAVEAT: this does not properly handle the case where a regular + // expression immediately follows another since a regular expression may + // have flags for case-sensitivity and the like. Having regexp tokens + // adjacent is not valid in any language I'm aware of, so I'm punting. + // TODO: maybe style special characters inside a regexp as punctuation. + }(); + + // Define regexps here so that the interpreter doesn't have to create an + // object each time the function containing them is called. + // The language spec requires a new object created even if you don't access + // the $1 members. + var pr_amp = /&/g; + var pr_lt = /</g; + var pr_gt = />/g; + var pr_quot = /\"/g; + /** like textToHtml but escapes double quotes to be attribute safe. */ + function attribToHtml(str) { + return str.replace(pr_amp, '&amp;') + .replace(pr_lt, '&lt;') + .replace(pr_gt, '&gt;') + .replace(pr_quot, '&quot;'); + } + + /** escapest html special characters to html. */ + function textToHtml(str) { + return str.replace(pr_amp, '&amp;') + .replace(pr_lt, '&lt;') + .replace(pr_gt, '&gt;'); + } + + + var pr_ltEnt = /&lt;/g; + var pr_gtEnt = /&gt;/g; + var pr_aposEnt = /&apos;/g; + var pr_quotEnt = /&quot;/g; + var pr_ampEnt = /&amp;/g; + var pr_nbspEnt = /&nbsp;/g; + /** unescapes html to plain text. */ + function htmlToText(html) { + var pos = html.indexOf('&'); + if (pos < 0) { return html; } + // Handle numeric entities specially. We can't use functional substitution + // since that doesn't work in older versions of Safari. + // These should be rare since most browsers convert them to normal chars. + for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) { + var end = html.indexOf(';', pos); + if (end >= 0) { + var num = html.substring(pos + 3, end); + var radix = 10; + if (num && num.charAt(0) === 'x') { + num = num.substring(1); + radix = 16; + } + var codePoint = parseInt(num, radix); + if (!isNaN(codePoint)) { + html = (html.substring(0, pos) + String.fromCharCode(codePoint) + + html.substring(end + 1)); + } + } + } + + return html.replace(pr_ltEnt, '<') + .replace(pr_gtEnt, '>') + .replace(pr_aposEnt, "'") + .replace(pr_quotEnt, '"') + .replace(pr_nbspEnt, ' ') + .replace(pr_ampEnt, '&'); + } + + /** is the given node's innerHTML normally unescaped? */ + function isRawContent(node) { + return 'XMP' === node.tagName; + } + + var newlineRe = /[\r\n]/g; + /** + * Are newlines and adjacent spaces significant in the given node's innerHTML? + */ + function isPreformatted(node, content) { + // PRE means preformatted, and is a very common case, so don't create + // unnecessary computed style objects. + if ('PRE' === node.tagName) { return true; } + if (!newlineRe.test(content)) { return true; } // Don't care + var whitespace = ''; + // For disconnected nodes, IE has no currentStyle. + if (node.currentStyle) { + whitespace = node.currentStyle.whiteSpace; + } else if (window.getComputedStyle) { + // Firefox makes a best guess if node is disconnected whereas Safari + // returns the empty string. + whitespace = window.getComputedStyle(node, null).whiteSpace; + } + return !whitespace || whitespace === 'pre'; + } + + function normalizedHtml(node, out, opt_sortAttrs) { + switch (node.nodeType) { + case 1: // an element + var name = node.tagName.toLowerCase(); + + out.push('<', name); + var attrs = node.attributes; + var n = attrs.length; + if (n) { + if (opt_sortAttrs) { + var sortedAttrs = []; + for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; } + sortedAttrs.sort(function (a, b) { + return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1; + }); + attrs = sortedAttrs; + } + for (var i = 0; i < n; ++i) { + var attr = attrs[i]; + if (!attr.specified) { continue; } + out.push(' ', attr.name.toLowerCase(), + '="', attribToHtml(attr.value), '"'); + } + } + out.push('>'); + for (var child = node.firstChild; child; child = child.nextSibling) { + normalizedHtml(child, out, opt_sortAttrs); + } + if (node.firstChild || !/^(?:br|link|img)$/.test(name)) { + out.push('<\/', name, '>'); + } + break; + case 3: case 4: // text + out.push(textToHtml(node.nodeValue)); + break; + } + } + + /** + * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally + * matches the union o the sets o strings matched d by the input RegExp. + * Since it matches globally, if the input strings have a start-of-input + * anchor (/^.../), it is ignored for the purposes of unioning. + * @param {Array.<RegExp>} regexs non multiline, non-global regexs. + * @return {RegExp} a global regex. + */ + function combinePrefixPatterns(regexs) { + var capturedGroupIndex = 0; + + var needToFoldCase = false; + var ignoreCase = false; + for (var i = 0, n = regexs.length; i < n; ++i) { + var regex = regexs[i]; + if (regex.ignoreCase) { + ignoreCase = true; + } else if (/[a-z]/i.test(regex.source.replace( + /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) { + needToFoldCase = true; + ignoreCase = false; + break; + } + } + + function decodeEscape(charsetPart) { + if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); } + switch (charsetPart.charAt(1)) { + case 'b': return 8; + case 't': return 9; + case 'n': return 0xa; + case 'v': return 0xb; + case 'f': return 0xc; + case 'r': return 0xd; + case 'u': case 'x': + return parseInt(charsetPart.substring(2), 16) + || charsetPart.charCodeAt(1); + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + return parseInt(charsetPart.substring(1), 8); + default: return charsetPart.charCodeAt(1); + } + } + + function encodeEscape(charCode) { + if (charCode < 0x20) { + return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16); + } + var ch = String.fromCharCode(charCode); + if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') { + ch = '\\' + ch; + } + return ch; + } + + function caseFoldCharset(charSet) { + var charsetParts = charSet.substring(1, charSet.length - 1).match( + new RegExp( + '\\\\u[0-9A-Fa-f]{4}' + + '|\\\\x[0-9A-Fa-f]{2}' + + '|\\\\[0-3][0-7]{0,2}' + + '|\\\\[0-7]{1,2}' + + '|\\\\[\\s\\S]' + + '|-' + + '|[^-\\\\]', + 'g')); + var groups = []; + var ranges = []; + var inverse = charsetParts[0] === '^'; + for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) { + var p = charsetParts[i]; + switch (p) { + case '\\B': case '\\b': + case '\\D': case '\\d': + case '\\S': case '\\s': + case '\\W': case '\\w': + groups.push(p); + continue; + } + var start = decodeEscape(p); + var end; + if (i + 2 < n && '-' === charsetParts[i + 1]) { + end = decodeEscape(charsetParts[i + 2]); + i += 2; + } else { + end = start; + } + ranges.push([start, end]); + // If the range might intersect letters, then expand it. + if (!(end < 65 || start > 122)) { + if (!(end < 65 || start > 90)) { + ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]); + } + if (!(end < 97 || start > 122)) { + ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]); + } + } + } + + // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]] + // -> [[1, 12], [14, 14], [16, 17]] + ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1] - a[1]); }); + var consolidatedRanges = []; + var lastRange = [NaN, NaN]; + for (var i = 0; i < ranges.length; ++i) { + var range = ranges[i]; + if (range[0] <= lastRange[1] + 1) { + lastRange[1] = Math.max(lastRange[1], range[1]); + } else { + consolidatedRanges.push(lastRange = range); + } + } + + var out = ['[']; + if (inverse) { out.push('^'); } + out.push.apply(out, groups); + for (var i = 0; i < consolidatedRanges.length; ++i) { + var range = consolidatedRanges[i]; + out.push(encodeEscape(range[0])); + if (range[1] > range[0]) { + if (range[1] + 1 > range[0]) { out.push('-'); } + out.push(encodeEscape(range[1])); + } + } + out.push(']'); + return out.join(''); + } + + function allowAnywhereFoldCaseAndRenumberGroups(regex) { + // Split into character sets, escape sequences, punctuation strings + // like ('(', '(?:', ')', '^'), and runs of characters that do not + // include any of the above. + var parts = regex.source.match( + new RegExp( + '(?:' + + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]' // a character set + + '|\\\\u[A-Fa-f0-9]{4}' // a unicode escape + + '|\\\\x[A-Fa-f0-9]{2}' // a hex escape + + '|\\\\[0-9]+' // a back-reference or octal escape + + '|\\\\[^ux0-9]' // other escape sequence + + '|\\(\\?[:!=]' // start of a non-capturing group + + '|[\\(\\)\\^]' // start/emd of a group, or line start + + '|[^\\x5B\\x5C\\(\\)\\^]+' // run of other characters + + ')', + 'g')); + var n = parts.length; + + // Maps captured group numbers to the number they will occupy in + // the output or to -1 if that has not been determined, or to + // undefined if they need not be capturing in the output. + var capturedGroups = []; + + // Walk over and identify back references to build the capturedGroups + // mapping. + for (var i = 0, groupIndex = 0; i < n; ++i) { + var p = parts[i]; + if (p === '(') { + // groups are 1-indexed, so max group index is count of '(' + ++groupIndex; + } else if ('\\' === p.charAt(0)) { + var decimalValue = +p.substring(1); + if (decimalValue && decimalValue <= groupIndex) { + capturedGroups[decimalValue] = -1; + } + } + } + + // Renumber groups and reduce capturing groups to non-capturing groups + // where possible. + for (var i = 1; i < capturedGroups.length; ++i) { + if (-1 === capturedGroups[i]) { + capturedGroups[i] = ++capturedGroupIndex; + } + } + for (var i = 0, groupIndex = 0; i < n; ++i) { + var p = parts[i]; + if (p === '(') { + ++groupIndex; + if (capturedGroups[groupIndex] === undefined) { + parts[i] = '(?:'; + } + } else if ('\\' === p.charAt(0)) { + var decimalValue = +p.substring(1); + if (decimalValue && decimalValue <= groupIndex) { + parts[i] = '\\' + capturedGroups[groupIndex]; + } + } + } + + // Remove any prefix anchors so that the output will match anywhere. + // ^^ really does mean an anchored match though. + for (var i = 0, groupIndex = 0; i < n; ++i) { + if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; } + } + + // Expand letters to groupts to handle mixing of case-sensitive and + // case-insensitive patterns if necessary. + if (regex.ignoreCase && needToFoldCase) { + for (var i = 0; i < n; ++i) { + var p = parts[i]; + var ch0 = p.charAt(0); + if (p.length >= 2 && ch0 === '[') { + parts[i] = caseFoldCharset(p); + } else if (ch0 !== '\\') { + // TODO: handle letters in numeric escapes. + parts[i] = p.replace( + /[a-zA-Z]/g, + function (ch) { + var cc = ch.charCodeAt(0); + return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']'; + }); + } + } + } + + return parts.join(''); + } + + var rewritten = []; + for (var i = 0, n = regexs.length; i < n; ++i) { + var regex = regexs[i]; + if (regex.global || regex.multiline) { throw new Error('' + regex); } + rewritten.push( + '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')'); + } + + return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g'); + } + + var PR_innerHtmlWorks = null; + function getInnerHtml(node) { + // inner html is hopelessly broken in Safari 2.0.4 when the content is + // an html description of well formed XML and the containing tag is a PRE + // tag, so we detect that case and emulate innerHTML. + if (null === PR_innerHtmlWorks) { + var testNode = document.createElement('PRE'); + testNode.appendChild( + document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />')); + PR_innerHtmlWorks = !/</.test(testNode.innerHTML); + } + + if (PR_innerHtmlWorks) { + var content = node.innerHTML; + // XMP tags contain unescaped entities so require special handling. + if (isRawContent(node)) { + content = textToHtml(content); + } else if (!isPreformatted(node, content)) { + content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1') + .replace(/(?:[\r\n]+[ \t]*)+/g, ' '); + } + return content; + } + + var out = []; + for (var child = node.firstChild; child; child = child.nextSibling) { + normalizedHtml(child, out); + } + return out.join(''); + } + + /** returns a function that expand tabs to spaces. This function can be fed + * successive chunks of text, and will maintain its own internal state to + * keep track of how tabs are expanded. + * @return {function (string) : string} a function that takes + * plain text and return the text with tabs expanded. + * @private + */ + function makeTabExpander(tabWidth) { + var SPACES = ' '; + var charInLine = 0; + + return function (plainText) { + // walk over each character looking for tabs and newlines. + // On tabs, expand them. On newlines, reset charInLine. + // Otherwise increment charInLine + var out = null; + var pos = 0; + for (var i = 0, n = plainText.length; i < n; ++i) { + var ch = plainText.charAt(i); + + switch (ch) { + case '\t': + if (!out) { out = []; } + out.push(plainText.substring(pos, i)); + // calculate how much space we need in front of this part + // nSpaces is the amount of padding -- the number of spaces needed + // to move us to the next column, where columns occur at factors of + // tabWidth. + var nSpaces = tabWidth - (charInLine % tabWidth); + charInLine += nSpaces; + for (; nSpaces >= 0; nSpaces -= SPACES.length) { + out.push(SPACES.substring(0, nSpaces)); + } + pos = i + 1; + break; + case '\n': + charInLine = 0; + break; + default: + ++charInLine; + } + } + if (!out) { return plainText; } + out.push(plainText.substring(pos)); + return out.join(''); + }; + } + + var pr_chunkPattern = new RegExp( + '[^<]+' // A run of characters other than '<' + + '|<\!--[\\s\\S]*?--\>' // an HTML comment + + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>' // a CDATA section + // a probable tag that should not be highlighted + + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>' + + '|<', // A '<' that does not begin a larger chunk + 'g'); + var pr_commentPrefix = /^<\!--/; + var pr_cdataPrefix = /^<!\[CDATA\[/; + var pr_brPrefix = /^<br\b/i; + var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/; + + /** split markup into chunks of html tags (style null) and + * plain text (style {@link #PR_PLAIN}), converting tags which are + * significant for tokenization (<br>) into their textual equivalent. + * + * @param {string} s html where whitespace is considered significant. + * @return {Object} source code and extracted tags. + * @private + */ + function extractTags(s) { + // since the pattern has the 'g' modifier and defines no capturing groups, + // this will return a list of all chunks which we then classify and wrap as + // PR_Tokens + var matches = s.match(pr_chunkPattern); + var sourceBuf = []; + var sourceBufLen = 0; + var extractedTags = []; + if (matches) { + for (var i = 0, n = matches.length; i < n; ++i) { + var match = matches[i]; + if (match.length > 1 && match.charAt(0) === '<') { + if (pr_commentPrefix.test(match)) { continue; } + if (pr_cdataPrefix.test(match)) { + // strip CDATA prefix and suffix. Don't unescape since it's CDATA + sourceBuf.push(match.substring(9, match.length - 3)); + sourceBufLen += match.length - 12; + } else if (pr_brPrefix.test(match)) { + // <br> tags are lexically significant so convert them to text. + // This is undone later. + sourceBuf.push('\n'); + ++sourceBufLen; + } else { + if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) { + // A <span class="nocode"> will start a section that should be + // ignored. Continue walking the list until we see a matching end + // tag. + var name = match.match(pr_tagNameRe)[2]; + var depth = 1; + var j; + end_tag_loop: + for (j = i + 1; j < n; ++j) { + var name2 = matches[j].match(pr_tagNameRe); + if (name2 && name2[2] === name) { + if (name2[1] === '/') { + if (--depth === 0) { break end_tag_loop; } + } else { + ++depth; + } + } + } + if (j < n) { + extractedTags.push( + sourceBufLen, matches.slice(i, j + 1).join('')); + i = j; + } else { // Ignore unclosed sections. + extractedTags.push(sourceBufLen, match); + } + } else { + extractedTags.push(sourceBufLen, match); + } + } + } else { + var literalText = htmlToText(match); + sourceBuf.push(literalText); + sourceBufLen += literalText.length; + } + } + } + return { source: sourceBuf.join(''), tags: extractedTags }; + } + + /** True if the given tag contains a class attribute with the nocode class. */ + function isNoCodeTag(tag) { + return !!tag + // First canonicalize the representation of attributes + .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g, + ' $1="$2$3$4"') + // Then look for the attribute we want. + .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/); + } + + /** + * Apply the given language handler to sourceCode and add the resulting + * decorations to out. + * @param {number} basePos the index of sourceCode within the chunk of source + * whose decorations are already present on out. + */ + function appendDecorations(basePos, sourceCode, langHandler, out) { + if (!sourceCode) { return; } + var job = { + source: sourceCode, + basePos: basePos + }; + langHandler(job); + out.push.apply(out, job.decorations); + } + + /** Given triples of [style, pattern, context] returns a lexing function, + * The lexing function interprets the patterns to find token boundaries and + * returns a decoration list of the form + * [index_0, style_0, index_1, style_1, ..., index_n, style_n] + * where index_n is an index into the sourceCode, and style_n is a style + * constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to + * all characters in sourceCode[index_n-1:index_n]. + * + * The stylePatterns is a list whose elements have the form + * [style : string, pattern : RegExp, DEPRECATED, shortcut : string]. + * + * Style is a style constant like PR_PLAIN, or can be a string of the + * form 'lang-FOO', where FOO is a language extension describing the + * language of the portion of the token in $1 after pattern executes. + * E.g., if style is 'lang-lisp', and group 1 contains the text + * '(hello (world))', then that portion of the token will be passed to the + * registered lisp handler for formatting. + * The text before and after group 1 will be restyled using this decorator + * so decorators should take care that this doesn't result in infinite + * recursion. For example, the HTML lexer rule for SCRIPT elements looks + * something like ['lang-js', /<[s]cript>(.+?)<\/script>/]. This may match + * '<script>foo()<\/script>', which would cause the current decorator to + * be called with '<script>' which would not match the same rule since + * group 1 must not be empty, so it would be instead styled as PR_TAG by + * the generic tag rule. The handler registered for the 'js' extension would + * then be called with 'foo()', and finally, the current decorator would + * be called with '<\/script>' which would not match the original rule and + * so the generic tag rule would identify it as a tag. + * + * Pattern must only match prefixes, and if it matches a prefix, then that + * match is considered a token with the same style. + * + * Context is applied to the last non-whitespace, non-comment token + * recognized. + * + * Shortcut is an optional string of characters, any of which, if the first + * character, gurantee that this pattern and only this pattern matches. + * + * @param {Array} shortcutStylePatterns patterns that always start with + * a known character. Must have a shortcut string. + * @param {Array} fallthroughStylePatterns patterns that will be tried in + * order if the shortcut ones fail. May have shortcuts. + * + * @return {function (Object)} a + * function that takes source code and returns a list of decorations. + */ + function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) { + var shortcuts = {}; + var tokenizer; + (function () { + var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns); + var allRegexs = []; + var regexKeys = {}; + for (var i = 0, n = allPatterns.length; i < n; ++i) { + var patternParts = allPatterns[i]; + var shortcutChars = patternParts[3]; + if (shortcutChars) { + for (var c = shortcutChars.length; --c >= 0;) { + shortcuts[shortcutChars.charAt(c)] = patternParts; + } + } + var regex = patternParts[1]; + var k = '' + regex; + if (!regexKeys.hasOwnProperty(k)) { + allRegexs.push(regex); + regexKeys[k] = null; + } + } + allRegexs.push(/[\0-\uffff]/); + tokenizer = combinePrefixPatterns(allRegexs); + })(); + + var nPatterns = fallthroughStylePatterns.length; + var notWs = /\S/; + + /** + * Lexes job.source and produces an output array job.decorations of style + * classes preceded by the position at which they start in job.source in + * order. + * + * @param {Object} job an object like {@code + * source: {string} sourceText plain text, + * basePos: {int} position of job.source in the larger chunk of + * sourceCode. + * } + */ + var decorate = function (job) { + var sourceCode = job.source, basePos = job.basePos; + /** Even entries are positions in source in ascending order. Odd enties + * are style markers (e.g., PR_COMMENT) that run from that position until + * the end. + * @type {Array.<number|string>} + */ + var decorations = [basePos, PR_PLAIN]; + var pos = 0; // index into sourceCode + var tokens = sourceCode.match(tokenizer) || []; + var styleCache = {}; + + // loop through + for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) { + var token = tokens[ti]; + var style = styleCache[token]; + var match = void 0; + + var isEmbedded; + if (typeof style === 'string') { + isEmbedded = false; + } else { + var patternParts = shortcuts[token.charAt(0)]; + if (patternParts) { + match = token.match(patternParts[1]); + style = patternParts[0]; + } else { + for (var i = 0; i < nPatterns; ++i) { + patternParts = fallthroughStylePatterns[i]; + match = token.match(patternParts[1]); + if (match) { + style = patternParts[0]; + break; + } + } + + if (!match) { // make sure that we make progress + style = PR_PLAIN; + } + } + + isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5); + if (isEmbedded && !(match && typeof match[1] === 'string')) { + isEmbedded = false; + style = PR_SOURCE; + } + + if (!isEmbedded) { styleCache[token] = style; } + } + + var tokenStart = pos; + pos += token.length; + + if (!isEmbedded) { + decorations.push(basePos + tokenStart, style); + } else { // Treat group 1 as an embedded block of source code. + var embeddedSource = match[1]; + var embeddedSourceStart = token.indexOf(embeddedSource); + var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length; + if (match[2]) { + // If embeddedSource can be blank, then it would match at the + // beginning which would cause us to infinitely recurse on the + // entire token, so we catch the right context in match[2]. + embeddedSourceEnd = token.length - match[2].length; + embeddedSourceStart = embeddedSourceEnd - embeddedSource.length; + } + var lang = style.substring(5); + // Decorate the left of the embedded source + appendDecorations( + basePos + tokenStart, + token.substring(0, embeddedSourceStart), + decorate, decorations); + // Decorate the embedded source + appendDecorations( + basePos + tokenStart + embeddedSourceStart, + embeddedSource, + langHandlerForExtension(lang, embeddedSource), + decorations); + // Decorate the right of the embedded section + appendDecorations( + basePos + tokenStart + embeddedSourceEnd, + token.substring(embeddedSourceEnd), + decorate, decorations); + } + } + job.decorations = decorations; + }; + return decorate; + } + + /** returns a function that produces a list of decorations from source text. + * + * This code treats ", ', and ` as string delimiters, and \ as a string + * escape. It does not recognize perl's qq() style strings. + * It has no special handling for double delimiter escapes as in basic, or + * the tripled delimiters used in python, but should work on those regardless + * although in those cases a single string literal may be broken up into + * multiple adjacent string literals. + * + * It recognizes C, C++, and shell style comments. + * + * @param {Object} options a set of optional parameters. + * @return {function (Object)} a function that examines the source code + * in the input job and builds the decoration list. + */ + function sourceDecorator(options) { + var shortcutStylePatterns = [], fallthroughStylePatterns = []; + if (options['tripleQuotedStrings']) { + // '''multi-line-string''', 'single-line-string', and double-quoted + shortcutStylePatterns.push( + [PR_STRING, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, + null, '\'"']); + } else if (options['multiLineStrings']) { + // 'multi-line-string', "multi-line-string" + shortcutStylePatterns.push( + [PR_STRING, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, + null, '\'"`']); + } else { + // 'single-line-string', "single-line-string" + shortcutStylePatterns.push( + [PR_STRING, + /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, + null, '"\'']); + } + if (options['verbatimStrings']) { + // verbatim-string-literal production from the C# grammar. See issue 93. + fallthroughStylePatterns.push( + [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); + } + if (options['hashComments']) { + if (options['cStyleComments']) { + // Stop C preprocessor declarations at an unclosed open comment + shortcutStylePatterns.push( + [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, + null, '#']); + fallthroughStylePatterns.push( + [PR_STRING, + /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, + null]); + } else { + shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']); + } + } + if (options['cStyleComments']) { + fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]); + fallthroughStylePatterns.push( + [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); + } + if (options['regexLiterals']) { + var REGEX_LITERAL = ( + // A regular expression literal starts with a slash that is + // not followed by * or / so that it is not confused with + // comments. + '/(?=[^/*])' + // and then contains any number of raw characters, + + '(?:[^/\\x5B\\x5C]' + // escape sequences (\x5C), + + '|\\x5C[\\s\\S]' + // or non-nesting character sets (\x5B\x5D); + + '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+' + // finally closed by a /. + + '/'); + fallthroughStylePatterns.push( + ['lang-regex', + new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')') + ]); + } + + var keywords = options['keywords'].replace(/^\s+|\s+$/g, ''); + if (keywords.length) { + fallthroughStylePatterns.push( + [PR_KEYWORD, + new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]); + } + + shortcutStylePatterns.push([PR_PLAIN, /^\s+/, null, ' \r\n\t\xA0']); + fallthroughStylePatterns.push( + // TODO(mikesamuel): recognize non-latin letters and numerals in idents + [PR_LITERAL, /^@[a-z_$][a-z_$@0-9]*/i, null], + [PR_TYPE, /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null], + [PR_PLAIN, /^[a-z_$][a-z_$@0-9]*/i, null], + [PR_LITERAL, + new RegExp( + '^(?:' + // A hex number + + '0x[a-f0-9]+' + // or an octal or decimal number, + + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)' + // possibly in scientific notation + + '(?:e[+\\-]?\\d+)?' + + ')' + // with an optional modifier like UL for unsigned long + + '[a-z]*', 'i'), + null, '0123456789'], + [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]); + + return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns); + } + + var decorateSource = sourceDecorator({ + 'keywords': ALL_KEYWORDS, + 'hashComments': true, + 'cStyleComments': true, + 'multiLineStrings': true, + 'regexLiterals': true + }); + + /** Breaks {@code job.source} around style boundaries in + * {@code job.decorations} while re-interleaving {@code job.extractedTags}, + * and leaves the result in {@code job.prettyPrintedHtml}. + * @param {Object} job like { + * source: {string} source as plain text, + * extractedTags: {Array.<number|string>} extractedTags chunks of raw + * html preceded by their position in {@code job.source} + * in order + * decorations: {Array.<number|string} an array of style classes preceded + * by the position at which they start in job.source in order + * } + * @private + */ + function recombineTagsAndDecorations(job) { + var sourceText = job.source; + var extractedTags = job.extractedTags; + var decorations = job.decorations; + + var html = []; + // index past the last char in sourceText written to html + var outputIdx = 0; + + var openDecoration = null; + var currentDecoration = null; + var tagPos = 0; // index into extractedTags + var decPos = 0; // index into decorations + var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']); + + var adjacentSpaceRe = /([\r\n ]) /g; + var startOrSpaceRe = /(^| ) /gm; + var newlineRe = /\r\n?|\n/g; + var trailingSpaceRe = /[ \r\n]$/; + var lastWasSpace = true; // the last text chunk emitted ended with a space. + + // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7- + var isIE678 = window['_pr_isIE6'](); + var lineBreakHtml = ( + isIE678 + ? (job.sourceNode.tagName === 'PRE' + // Use line feeds instead of <br>s so that copying and pasting works + // on IE. + // Doing this on other browsers breaks lots of stuff since \r\n is + // treated as two newlines on Firefox. + ? (isIE678 === 6 ? '&#160;\r\n' : + isIE678 === 7 ? '&#160;<br>\r' : '&#160;\r') + // IE collapses multiple adjacent <br>s into 1 line break. + // Prefix every newline with '&#160;' to prevent such behavior. + // &nbsp; is the same as &#160; but works in XML as well as HTML. + : '&#160;<br />') + : '<br />'); + + // Look for a class like linenums or linenums:<n> where <n> is the 1-indexed + // number of the first line. + var numberLines = job.sourceNode.className.match(/\blinenums\b(?::(\d+))?/); + var lineBreaker; + if (numberLines) { + var lineBreaks = []; + for (var i = 0; i < 10; ++i) { + lineBreaks[i] = lineBreakHtml + '</li><li class="L' + i + '">'; + } + var lineNum = numberLines[1] && numberLines[1].length + ? numberLines[1] - 1 : 0; // Lines are 1-indexed + html.push('<ol class="linenums"><li class="L', (lineNum) % 10, '"'); + if (lineNum) { + html.push(' value="', lineNum + 1, '"'); + } + html.push('>'); + lineBreaker = function () { + var lb = lineBreaks[++lineNum % 10]; + // If a decoration is open, we need to close it before closing a list-item + // and reopen it on the other side of the list item. + return openDecoration + ? ('</span>' + lb + '<span class="' + openDecoration + '">') : lb; + }; + } else { + lineBreaker = lineBreakHtml; + } + + // A helper function that is responsible for opening sections of decoration + // and outputing properly escaped chunks of source + function emitTextUpTo(sourceIdx) { + if (sourceIdx > outputIdx) { + if (openDecoration && openDecoration !== currentDecoration) { + // Close the current decoration + html.push('</span>'); + openDecoration = null; + } + if (!openDecoration && currentDecoration) { + openDecoration = currentDecoration; + html.push('<span class="', openDecoration, '">'); + } + // This interacts badly with some wikis which introduces paragraph tags + // into pre blocks for some strange reason. + // It's necessary for IE though which seems to lose the preformattedness + // of <pre> tags when their innerHTML is assigned. + // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html + // and it serves to undo the conversion of <br>s to newlines done in + // chunkify. + var htmlChunk = textToHtml( + tabExpander(sourceText.substring(outputIdx, sourceIdx))) + .replace(lastWasSpace + ? startOrSpaceRe + : adjacentSpaceRe, '$1&#160;'); + // Keep track of whether we need to escape space at the beginning of the + // next chunk. + lastWasSpace = trailingSpaceRe.test(htmlChunk); + html.push(htmlChunk.replace(newlineRe, lineBreaker)); + outputIdx = sourceIdx; + } + } + + while (true) { + // Determine if we're going to consume a tag this time around. Otherwise + // we consume a decoration or exit. + var outputTag; + if (tagPos < extractedTags.length) { + if (decPos < decorations.length) { + // Pick one giving preference to extractedTags since we shouldn't open + // a new style that we're going to have to immediately close in order + // to output a tag. + outputTag = extractedTags[tagPos] <= decorations[decPos]; + } else { + outputTag = true; + } + } else { + outputTag = false; + } + // Consume either a decoration or a tag or exit. + if (outputTag) { + emitTextUpTo(extractedTags[tagPos]); + if (openDecoration) { + // Close the current decoration + html.push('</span>'); + openDecoration = null; + } + html.push(extractedTags[tagPos + 1]); + tagPos += 2; + } else if (decPos < decorations.length) { + emitTextUpTo(decorations[decPos]); + currentDecoration = decorations[decPos + 1]; + decPos += 2; + } else { + break; + } + } + emitTextUpTo(sourceText.length); + if (openDecoration) { + html.push('</span>'); + } + if (numberLines) { html.push('</li></ol>'); } + job.prettyPrintedHtml = html.join(''); + } + + /** Maps language-specific file extensions to handlers. */ + var langHandlerRegistry = {}; + /** Register a language handler for the given file extensions. + * @param {function (Object)} handler a function from source code to a list + * of decorations. Takes a single argument job which describes the + * state of the computation. The single parameter has the form + * {@code { + * source: {string} as plain text. + * decorations: {Array.<number|string>} an array of style classes + * preceded by the position at which they start in + * job.source in order. + * The language handler should assigned this field. + * basePos: {int} the position of source in the larger source chunk. + * All positions in the output decorations array are relative + * to the larger source chunk. + * } } + * @param {Array.<string>} fileExtensions + */ + function registerLangHandler(handler, fileExtensions) { + for (var i = fileExtensions.length; --i >= 0;) { + var ext = fileExtensions[i]; + if (!langHandlerRegistry.hasOwnProperty(ext)) { + langHandlerRegistry[ext] = handler; + } else if ('console' in window) { + console['warn']('cannot override language handler %s', ext); + } + } + } + function langHandlerForExtension(extension, source) { + if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) { + // Treat it as markup if the first non whitespace character is a < and + // the last non-whitespace character is a >. + extension = /^\s*</.test(source) + ? 'default-markup' + : 'default-code'; + } + return langHandlerRegistry[extension]; + } + registerLangHandler(decorateSource, ['default-code']); + registerLangHandler( + createSimpleLexer( + [], + [ + [PR_PLAIN, /^[^<?]+/], + [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/], + [PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], + // Unescaped content in an unknown language + ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/], + ['lang-', /^<%([\s\S]+?)(?:%>|$)/], + [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], + ['lang-', /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i], + // Unescaped content in javascript. (Or possibly vbscript). + ['lang-js', /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i], + // Contains unescaped stylesheet content + ['lang-css', /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i], + ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i] + ]), + ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']); + registerLangHandler( + createSimpleLexer( + [ + [PR_PLAIN, /^[\s]+/, null, ' \t\r\n'], + [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\''] + ], + [ + [PR_TAG, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], + [PR_ATTRIB_NAME, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], + ['lang-uq.val', /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], + [PR_PUNCTUATION, /^[=<>\/]+/], + ['lang-js', /^on\w+\s*=\s*\"([^\"]+)\"/i], + ['lang-js', /^on\w+\s*=\s*\'([^\']+)\'/i], + ['lang-js', /^on\w+\s*=\s*([^\"\'>\s]+)/i], + ['lang-css', /^style\s*=\s*\"([^\"]+)\"/i], + ['lang-css', /^style\s*=\s*\'([^\']+)\'/i], + ['lang-css', /^style\s*=\s*([^\"\'>\s]+)/i] + ]), + ['in.tag']); + registerLangHandler( + createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']); + registerLangHandler(sourceDecorator({ + 'keywords': CPP_KEYWORDS, + 'hashComments': true, + 'cStyleComments': true + }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']); + registerLangHandler(sourceDecorator({ + 'keywords': 'null true false' + }), ['json']); + registerLangHandler(sourceDecorator({ + 'keywords': CSHARP_KEYWORDS, + 'hashComments': true, + 'cStyleComments': true, + 'verbatimStrings': true + }), ['cs']); + registerLangHandler(sourceDecorator({ + 'keywords': JAVA_KEYWORDS, + 'cStyleComments': true + }), ['java']); + registerLangHandler(sourceDecorator({ + 'keywords': SH_KEYWORDS, + 'hashComments': true, + 'multiLineStrings': true + }), ['bsh', 'csh', 'sh']); + registerLangHandler(sourceDecorator({ + 'keywords': PYTHON_KEYWORDS, + 'hashComments': true, + 'multiLineStrings': true, + 'tripleQuotedStrings': true + }), ['cv', 'py']); + registerLangHandler(sourceDecorator({ + 'keywords': PERL_KEYWORDS, + 'hashComments': true, + 'multiLineStrings': true, + 'regexLiterals': true + }), ['perl', 'pl', 'pm']); + registerLangHandler(sourceDecorator({ + 'keywords': RUBY_KEYWORDS, + 'hashComments': true, + 'multiLineStrings': true, + 'regexLiterals': true + }), ['rb']); + registerLangHandler(sourceDecorator({ + 'keywords': JSCRIPT_KEYWORDS, + 'cStyleComments': true, + 'regexLiterals': true + }), ['js']); + registerLangHandler( + createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']); + + function applyDecorator(job) { + var sourceCodeHtml = job.sourceCodeHtml; + var opt_langExtension = job.langExtension; + + // Prepopulate output in case processing fails with an exception. + job.prettyPrintedHtml = sourceCodeHtml; + + try { + // Extract tags, and convert the source code to plain text. + var sourceAndExtractedTags = extractTags(sourceCodeHtml); + /** Plain text. @type {string} */ + var source = sourceAndExtractedTags.source; + job.source = source; + job.basePos = 0; + + /** Even entries are positions in source in ascending order. Odd entries + * are tags that were extracted at that position. + * @type {Array.<number|string>} + */ + job.extractedTags = sourceAndExtractedTags.tags; + + // Apply the appropriate language handler + langHandlerForExtension(opt_langExtension, source)(job); + // Integrate the decorations and tags back into the source code to produce + // a decorated html string which is left in job.prettyPrintedHtml. + recombineTagsAndDecorations(job); + } catch (e) { + if ('console' in window) { + console['log'](e && e['stack'] ? e['stack'] : e); + } + } + } + + function prettyPrintOne(sourceCodeHtml, opt_langExtension) { + var job = { + sourceCodeHtml: sourceCodeHtml, + langExtension: opt_langExtension + }; + applyDecorator(job); + return job.prettyPrintedHtml; + } + + function prettyPrint(opt_whenDone) { + function byTagName(tn) { return document.getElementsByTagName(tn); } + // fetch a list of nodes to rewrite + var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')]; + var elements = []; + for (var i = 0; i < codeSegments.length; ++i) { + for (var j = 0, n = codeSegments[i].length; j < n; ++j) { + elements.push(codeSegments[i][j]); + } + } + codeSegments = null; + + var clock = Date; + if (!clock['now']) { + clock = { 'now': function () { return (new Date).getTime(); } }; + } + + // The loop is broken into a series of continuations to make sure that we + // don't make the browser unresponsive when rewriting a large page. + var k = 0; + var prettyPrintingJob; + + function doWork() { + var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ? + clock.now() + 250 /* ms */ : + Infinity); + for (; k < elements.length && clock.now() < endTime; k++) { + var cs = elements[k]; + if (cs.className && cs.className.indexOf('prettyprint') >= 0) { + // If the classes includes a language extensions, use it. + // Language extensions can be specified like + // <pre class="prettyprint lang-cpp"> + // the language extension "cpp" is used to find a language handler as + // passed to PR_registerLangHandler. + var langExtension = cs.className.match(/\blang-(\w+)\b/); + if (langExtension) { langExtension = langExtension[1]; } + + // make sure this is not nested in an already prettified element + var nested = false; + for (var p = cs.parentNode; p; p = p.parentNode) { + if ((p.tagName === 'pre' || p.tagName === 'code' || + p.tagName === 'xmp') && + p.className && p.className.indexOf('prettyprint') >= 0) { + nested = true; + break; + } + } + + // make sure we haven't already prettified this element + if ( cs.className && cs.className.indexOf('prettyprint-has') >= 0 ) { + nested = true; + } + + // handle + if (!nested) { + // fetch the content as a snippet of properly escaped HTML. + // Firefox adds newlines at the end. + var content = getInnerHtml(cs); + content = content.replace(/(?:\r\n?|\n)$/, ''); + + // do the pretty printing + prettyPrintingJob = { + sourceCodeHtml: content, + langExtension: langExtension, + sourceNode: cs + }; + applyDecorator(prettyPrintingJob); + replaceWithPrettyPrintedHtml(); + cs.className += ' prettyprint-has'; + } + } + } + if (k < elements.length) { + // finish up in a continuation + setTimeout(doWork, 250); + } else if (opt_whenDone) { + opt_whenDone(); + } + } + + function replaceWithPrettyPrintedHtml() { + var newContent = prettyPrintingJob.prettyPrintedHtml; + if (!newContent) { return; } + var cs = prettyPrintingJob.sourceNode; + + // push the prettified html back into the tag. + if (!isRawContent(cs)) { + // just replace the old html with the new + cs.innerHTML = newContent; + } else { + // we need to change the tag to a <pre> since <xmp>s do not allow + // embedded tags such as the span tags used to attach styles to + // sections of source code. + var pre = document.createElement('PRE'); + for (var i = 0; i < cs.attributes.length; ++i) { + var a = cs.attributes[i]; + if (a.specified) { + var aname = a.name.toLowerCase(); + if (aname === 'class') { + pre.className = a.value; // For IE 6 + } else { + pre.setAttribute(a.name, a.value); + } + } + } + pre.innerHTML = newContent; + + // remove the old + cs.parentNode.replaceChild(pre, cs); + cs = pre; + } + } + + doWork(); + } + + window['PR_normalizedHtml'] = normalizedHtml; + window['prettyPrintOne'] = prettyPrintOne; + window['prettyPrint'] = prettyPrint; + window['PR'] = { + 'combinePrefixPatterns': combinePrefixPatterns, + 'createSimpleLexer': createSimpleLexer, + 'registerLangHandler': registerLangHandler, + 'sourceDecorator': sourceDecorator, + 'PR_ATTRIB_NAME': PR_ATTRIB_NAME, + 'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE, + 'PR_COMMENT': PR_COMMENT, + 'PR_DECLARATION': PR_DECLARATION, + 'PR_KEYWORD': PR_KEYWORD, + 'PR_LITERAL': PR_LITERAL, + 'PR_NOCODE': PR_NOCODE, + 'PR_PLAIN': PR_PLAIN, + 'PR_PUNCTUATION': PR_PUNCTUATION, + 'PR_SOURCE': PR_SOURCE, + 'PR_STRING': PR_STRING, + 'PR_TAG': PR_TAG, + 'PR_TYPE': PR_TYPE + }; +})(); diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.min.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.min.css new file mode 100644 index 000000000..eb731fa38 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.min.css @@ -0,0 +1 @@ +.str{color:#080;}.kwd{color:#008;}.com{color:#800;}.typ{color:#606;}.lit{color:#066;}.pun{color:#660;}.pln{color:#000;}.tag{color:#008;}.atn{color:#606;}.atv{color:#080;}.dec{color:#606;}pre.prettyprint{padding:2px;border:1px solid #888;}ol.linenums{margin-top:0;margin-bottom:0;}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none;}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee;}@media print{.str{color:#060;}.kwd{color:#006;font-weight:bold;}.com{color:#600;font-style:italic;}.typ{color:#404;font-weight:bold;}.lit{color:#044;}.pun{color:#440;}.pln{color:#000;}.tag{color:#006;font-weight:bold;}.atn{color:#404;}.atv{color:#060;}} \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.min.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.min.js new file mode 100644 index 000000000..f5bf6894f --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/prettify/prettify.min.js @@ -0,0 +1,33 @@ +window.PR_SHOULD_USE_CONTINUATION=true;window.PR_TAB_WIDTH=4;window.PR_normalizedHtml=window.PR=window.prettyPrintOne=window.prettyPrint=void 0;window._pr_isIE6=function(){var y=navigator&&navigator.userAgent&&navigator.userAgent.match(/\bMSIE ([678])\./);y=y?+y[1]:false;window._pr_isIE6=function(){return y};return y}; +(function(){function y(b){return b.replace(L,"&amp;").replace(M,"&lt;").replace(N,"&gt;")}function H(b,f,i){switch(b.nodeType){case 1:var o=b.tagName.toLowerCase();f.push("<",o);var l=b.attributes,n=l.length;if(n){if(i){for(var r=[],j=n;--j>=0;)r[j]=l[j];r.sort(function(q,m){return q.name<m.name?-1:q.name===m.name?0:1});l=r}for(j=0;j<n;++j){r=l[j];r.specified&&f.push(" ",r.name.toLowerCase(),'="',r.value.replace(L,"&amp;").replace(M,"&lt;").replace(N,"&gt;").replace(X,"&quot;"),'"')}}f.push(">"); +for(l=b.firstChild;l;l=l.nextSibling)H(l,f,i);if(b.firstChild||!/^(?:br|link|img)$/.test(o))f.push("</",o,">");break;case 3:case 4:f.push(y(b.nodeValue));break}}function O(b){function f(e){if(e.charAt(0)!=="\\")return e.charCodeAt(0);switch(e.charAt(1)){case "b":return 8;case "t":return 9;case "n":return 10;case "v":return 11;case "f":return 12;case "r":return 13;case "u":case "x":return parseInt(e.substring(2),16)||e.charCodeAt(1);case "0":case "1":case "2":case "3":case "4":case "5":case "6":case "7":return parseInt(e.substring(1), +8);default:return e.charCodeAt(1)}}function i(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);if(e==="\\"||e==="-"||e==="["||e==="]")e="\\"+e;return e}function o(e){var d=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));e=[];for(var a=[],k=d[0]==="^",c=k?1:0,h=d.length;c<h;++c){var g=d[c];switch(g){case "\\B":case "\\b":case "\\D":case "\\d":case "\\S":case "\\s":case "\\W":case "\\w":e.push(g); +continue}g=f(g);var s;if(c+2<h&&"-"===d[c+1]){s=f(d[c+2]);c+=2}else s=g;a.push([g,s]);if(!(s<65||g>122)){s<65||g>90||a.push([Math.max(65,g)|32,Math.min(s,90)|32]);s<97||g>122||a.push([Math.max(97,g)&-33,Math.min(s,122)&-33])}}a.sort(function(v,w){return v[0]-w[0]||w[1]-v[1]});d=[];g=[NaN,NaN];for(c=0;c<a.length;++c){h=a[c];if(h[0]<=g[1]+1)g[1]=Math.max(g[1],h[1]);else d.push(g=h)}a=["["];k&&a.push("^");a.push.apply(a,e);for(c=0;c<d.length;++c){h=d[c];a.push(i(h[0]));if(h[1]>h[0]){h[1]+1>h[0]&&a.push("-"); +a.push(i(h[1]))}}a.push("]");return a.join("")}function l(e){for(var d=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),a=d.length,k=[],c=0,h=0;c<a;++c){var g=d[c];if(g==="(")++h;else if("\\"===g.charAt(0))if((g=+g.substring(1))&&g<=h)k[g]=-1}for(c=1;c<k.length;++c)if(-1===k[c])k[c]=++n;for(h=c=0;c<a;++c){g=d[c];if(g==="("){++h;if(k[h]===undefined)d[c]="(?:"}else if("\\"=== +g.charAt(0))if((g=+g.substring(1))&&g<=h)d[c]="\\"+k[h]}for(h=c=0;c<a;++c)if("^"===d[c]&&"^"!==d[c+1])d[c]="";if(e.ignoreCase&&r)for(c=0;c<a;++c){g=d[c];e=g.charAt(0);if(g.length>=2&&e==="[")d[c]=o(g);else if(e!=="\\")d[c]=g.replace(/[a-zA-Z]/g,function(s){s=s.charCodeAt(0);return"["+String.fromCharCode(s&-33,s|32)+"]"})}return d.join("")}for(var n=0,r=false,j=false,q=0,m=b.length;q<m;++q){var t=b[q];if(t.ignoreCase)j=true;else if(/[a-z]/i.test(t.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, +""))){r=true;j=false;break}}var p=[];q=0;for(m=b.length;q<m;++q){t=b[q];if(t.global||t.multiline)throw Error(""+t);p.push("(?:"+l(t)+")")}return RegExp(p.join("|"),j?"gi":"g")}function Y(b){var f=0;return function(i){for(var o=null,l=0,n=0,r=i.length;n<r;++n)switch(i.charAt(n)){case "\t":o||(o=[]);o.push(i.substring(l,n));l=b-f%b;for(f+=l;l>=0;l-=16)o.push(" ".substring(0,l));l=n+1;break;case "\n":f=0;break;default:++f}if(!o)return i;o.push(i.substring(l));return o.join("")}}function I(b, +f,i,o){if(f){b={source:f,basePos:b};i(b);o.push.apply(o,b.decorations)}}function B(b,f){var i={},o;(function(){for(var r=b.concat(f),j=[],q={},m=0,t=r.length;m<t;++m){var p=r[m],e=p[3];if(e)for(var d=e.length;--d>=0;)i[e.charAt(d)]=p;p=p[1];e=""+p;if(!q.hasOwnProperty(e)){j.push(p);q[e]=null}}j.push(/[\0-\uffff]/);o=O(j)})();var l=f.length,n=function(r){for(var j=r.basePos,q=[j,z],m=0,t=r.source.match(o)||[],p={},e=0,d=t.length;e<d;++e){var a=t[e],k=p[a],c=void 0,h;if(typeof k==="string")h=false; +else{var g=i[a.charAt(0)];if(g){c=a.match(g[1]);k=g[0]}else{for(h=0;h<l;++h){g=f[h];if(c=a.match(g[1])){k=g[0];break}}c||(k=z)}if((h=k.length>=5&&"lang-"===k.substring(0,5))&&!(c&&typeof c[1]==="string")){h=false;k=P}h||(p[a]=k)}g=m;m+=a.length;if(h){h=c[1];var s=a.indexOf(h),v=s+h.length;if(c[2]){v=a.length-c[2].length;s=v-h.length}k=k.substring(5);I(j+g,a.substring(0,s),n,q);I(j+g+s,h,Q(k,h),q);I(j+g+v,a.substring(v),n,q)}else q.push(j+g,k)}r.decorations=q};return n}function x(b){var f=[],i=[]; +if(b.tripleQuotedStrings)f.push([A,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""]);else b.multiLineStrings?f.push([A,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):f.push([A,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);b.verbatimStrings&&i.push([A, +/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);if(b.hashComments)if(b.cStyleComments){f.push([C,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"]);i.push([A,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else f.push([C,/^#[^\r\n]*/,null,"#"]);if(b.cStyleComments){i.push([C,/^\/\/[^\r\n]*/,null]);i.push([C,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}b.regexLiterals&&i.push(["lang-regex",RegExp("^"+Z+"(/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/)")]); +b=b.keywords.replace(/^\s+|\s+$/g,"");b.length&&i.push([R,RegExp("^(?:"+b.replace(/\s+/g,"|")+")\\b"),null]);f.push([z,/^\s+/,null," \r\n\t\u00a0"]);i.push([J,/^@[a-z_$][a-z_$@0-9]*/i,null],[S,/^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/,null],[z,/^[a-z_$][a-z_$@0-9]*/i,null],[J,/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],[E,/^.[^\s\w\.$@\'\"\`\/\#]*/,null]);return B(f,i)}function $(b){function f(D){if(D>r){if(j&&j!==q){n.push("</span>");j=null}if(!j&&q){j=q; +n.push('<span class="',j,'">')}var T=y(p(i.substring(r,D))).replace(c?d:e,"$1&#160;");c=k.test(T);n.push(T.replace(a,s));r=D}}var i=b.source,o=b.extractedTags,l=b.decorations,n=[],r=0,j=null,q=null,m=0,t=0,p=Y(window.PR_TAB_WIDTH),e=/([\r\n ]) /g,d=/(^| ) /gm,a=/\r\n?|\n/g,k=/[ \r\n]$/,c=true,h=window._pr_isIE6();h=h?b.sourceNode.tagName==="PRE"?h===6?"&#160;\r\n":h===7?"&#160;<br>\r":"&#160;\r":"&#160;<br />":"<br />";var g=b.sourceNode.className.match(/\blinenums\b(?::(\d+))?/),s;if(g){for(var v= +[],w=0;w<10;++w)v[w]=h+'</li><li class="L'+w+'">';var F=g[1]&&g[1].length?g[1]-1:0;n.push('<ol class="linenums"><li class="L',F%10,'"');F&&n.push(' value="',F+1,'"');n.push(">");s=function(){var D=v[++F%10];return j?"</span>"+D+'<span class="'+j+'">':D}}else s=h;for(;;)if(m<o.length?t<l.length?o[m]<=l[t]:true:false){f(o[m]);if(j){n.push("</span>");j=null}n.push(o[m+1]);m+=2}else if(t<l.length){f(l[t]);q=l[t+1];t+=2}else break;f(i.length);j&&n.push("</span>");g&&n.push("</li></ol>");b.prettyPrintedHtml= +n.join("")}function u(b,f){for(var i=f.length;--i>=0;){var o=f[i];if(G.hasOwnProperty(o))"console"in window&&console.warn("cannot override language handler %s",o);else G[o]=b}}function Q(b,f){b&&G.hasOwnProperty(b)||(b=/^\s*</.test(f)?"default-markup":"default-code");return G[b]}function U(b){var f=b.sourceCodeHtml,i=b.langExtension;b.prettyPrintedHtml=f;try{var o,l=f.match(aa);f=[];var n=0,r=[];if(l)for(var j=0,q=l.length;j<q;++j){var m=l[j];if(m.length>1&&m.charAt(0)==="<"){if(!ba.test(m))if(ca.test(m)){f.push(m.substring(9, +m.length-3));n+=m.length-12}else if(da.test(m)){f.push("\n");++n}else if(m.indexOf(V)>=0&&m.replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,' $1="$2$3$4"').match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/)){var t=m.match(W)[2],p=1,e;e=j+1;a:for(;e<q;++e){var d=l[e].match(W);if(d&&d[2]===t)if(d[1]==="/"){if(--p===0)break a}else++p}if(e<q){r.push(n,l.slice(j,e+1).join(""));j=e}else r.push(n,m)}else r.push(n,m)}else{var a;p=m;var k=p.indexOf("&");if(k<0)a=p;else{for(--k;(k=p.indexOf("&#",k+ +1))>=0;){var c=p.indexOf(";",k);if(c>=0){var h=p.substring(k+3,c),g=10;if(h&&h.charAt(0)==="x"){h=h.substring(1);g=16}var s=parseInt(h,g);isNaN(s)||(p=p.substring(0,k)+String.fromCharCode(s)+p.substring(c+1))}}a=p.replace(ea,"<").replace(fa,">").replace(ga,"'").replace(ha,'"').replace(ia," ").replace(ja,"&")}f.push(a);n+=a.length}}o={source:f.join(""),tags:r};var v=o.source;b.source=v;b.basePos=0;b.extractedTags=o.tags;Q(i,v)(b);$(b)}catch(w){if("console"in window)console.log(w&&w.stack?w.stack:w)}} +var A="str",R="kwd",C="com",S="typ",J="lit",E="pun",z="pln",P="src",V="nocode",Z=function(){for(var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=","~","break","case","continue","delete","do","else","finally","instanceof","return","throw","try","typeof"],f="(?:^^|[+-]",i=0;i<b.length;++i)f+="|"+b[i].replace(/([^=<>:&a-z])/g, +"\\$1");f+=")\\s*";return f}(),L=/&/g,M=/</g,N=/>/g,X=/\"/g,ea=/&lt;/g,fa=/&gt;/g,ga=/&apos;/g,ha=/&quot;/g,ja=/&amp;/g,ia=/&nbsp;/g,ka=/[\r\n]/g,K=null,aa=RegExp("[^<]+|<!--[\\s\\S]*?--\>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|</?[a-zA-Z](?:[^>\"']|'[^']*'|\"[^\"]*\")*>|<","g"),ba=/^<\!--/,ca=/^<!\[CDATA\[/,da=/^<br\b/i,W=/^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/,la=x({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename using virtual wchar_t where break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof abstract boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params partial readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof debugger eval export function get null set undefined var with Infinity NaN caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END break continue do else for if return while and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None break continue do else for if return while alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END break continue do else for if return while case done elif esac eval fi function in local set then until ", +hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true}),G={};u(la,["default-code"]);u(B([],[[z,/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],[C,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[E,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup", +"htm","html","mxml","xhtml","xml","xsl"]);u(B([[z,/^[\s]+/,null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[E,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i], +["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);u(B([],[["atv",/^[\s\S]+/]]),["uq.val"]);u(x({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename using virtual wchar_t where ", +hashComments:true,cStyleComments:true}),["c","cc","cpp","cxx","cyc","m"]);u(x({keywords:"null true false"}),["json"]);u(x({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof abstract boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params partial readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ", +hashComments:true,cStyleComments:true,verbatimStrings:true}),["cs"]);u(x({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof abstract boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ", +cStyleComments:true}),["java"]);u(x({keywords:"break continue do else for if return while case done elif esac eval fi function in local set then until ",hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);u(x({keywords:"break continue do else for if return while and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]); +u(x({keywords:"caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);u(x({keywords:"break continue do else for if return while alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",hashComments:true, +multiLineStrings:true,regexLiterals:true}),["rb"]);u(x({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof debugger eval export function get null set undefined var with Infinity NaN ",cStyleComments:true,regexLiterals:true}),["js"]);u(B([],[[A,/^[\s\S]+/]]), +["regex"]);window.PR_normalizedHtml=H;window.prettyPrintOne=function(b,f){var i={sourceCodeHtml:b,langExtension:f};U(i);return i.prettyPrintedHtml};window.prettyPrint=function(b){function f(){for(var t=window.PR_SHOULD_USE_CONTINUATION?j.now()+250:Infinity;q<o.length&&j.now()<t;q++){var p=o[q];if(p.className&&p.className.indexOf("prettyprint")>=0){var e=p.className.match(/\blang-(\w+)\b/);if(e)e=e[1];for(var d=false,a=p.parentNode;a;a=a.parentNode)if((a.tagName==="pre"||a.tagName==="code"||a.tagName=== +"xmp")&&a.className&&a.className.indexOf("prettyprint")>=0){d=true;break}if(p.className&&p.className.indexOf("prettyprint-has")>=0)d=true;if(!d){a=p;if(null===K){d=document.createElement("PRE");d.appendChild(document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));K=!/</.test(d.innerHTML)}if(K){d=a.innerHTML;if("XMP"===a.tagName)d=y(d);else{a=a;if("PRE"===a.tagName)a=true;else if(ka.test(d)){var k="";if(a.currentStyle)k=a.currentStyle.whiteSpace;else if(window.getComputedStyle)k=window.getComputedStyle(a, +null).whiteSpace;a=!k||k==="pre"}else a=true;a||(d=d.replace(/(<br\s*\/?>)[\r\n]+/g,"$1").replace(/(?:[\r\n]+[ \t]*)+/g," "))}d=d}else{d=[];for(a=a.firstChild;a;a=a.nextSibling)H(a,d);d=d.join("")}d=d.replace(/(?:\r\n?|\n)$/,"");m={sourceCodeHtml:d,langExtension:e,sourceNode:p};U(m);if(e=m.prettyPrintedHtml){d=m.sourceNode;if("XMP"===d.tagName){a=document.createElement("PRE");for(k=0;k<d.attributes.length;++k){var c=d.attributes[k];if(c.specified)if(c.name.toLowerCase()==="class")a.className=c.value; +else a.setAttribute(c.name,c.value)}a.innerHTML=e;d.parentNode.replaceChild(a,d)}else d.innerHTML=e}p.className+=" prettyprint-has"}}}if(q<o.length)setTimeout(f,250);else b&&b()}for(var i=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],o=[],l=0;l<i.length;++l)for(var n=0,r=i[l].length;n<r;++n)o.push(i[l][n]);i=null;var j=Date;j.now||(j={now:function(){return(new Date).getTime()}});var q=0,m;f()};window.PR={combinePrefixPatterns:O,createSimpleLexer:B, +registerLangHandler:u,sourceDecorator:x,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:C,PR_DECLARATION:"dec",PR_KEYWORD:R,PR_LITERAL:J,PR_NOCODE:V,PR_PLAIN:z,PR_PUNCTUATION:E,PR_SOURCE:P,PR_STRING:A,PR_TAG:"tag",PR_TYPE:S}})(); diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/closure.map b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/closure.map new file mode 100644 index 000000000..8336d7b2f --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/closure.map @@ -0,0 +1,1276 @@ +/** Begin line maps. **/{ "file" : "./scripts/closure.map", "count": 23 } +[] +[] +[] +[] +[] +[] +[] +[] +[1,1,1,2,2,2,2,2,2,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,1,1,5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,9,9,9,10,10,10,10,10,10,10,10,10,10] +[-1,-1,-1,11,11,11,11,11,11,14,14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12,12,12,-1,-1,15,15,15,15,15,15,15,15,15,15,15,15,16,17,17,17,18,18,18,18,18,18,21,21,21,21,21,21,21,21,20,20,20,20,20,20,20,20,19,19,19,19,17,17,22,22,22,22,22,22,22,22,22,22,22,26,26,26,26,26,26,26,25,25,25,25,25,25,25,25,24,24,24,24,24,24,24,27,27,27,27,27,17,17,17,17,28,29,29,29,30,30,30,30,30,30,33,33,33,33,33,33,33,33,32,32,32,32,32,32,32,32,31,31,31,31,29,29,34,34,34,34,34,34,34,34,34,34,34,34,38,38,38,38,38,38,38,37,37,37,37,37,37,37,37,36,36,36,36,39,39,39,39,39,39,39,39,40,41,41,42,42,46,46,46,46,46,46,46,45,45,45,45,45,45,45,45,44,44,44,44,44,44,44,47,47,47,47,47,47,28,48,48,49,49,49,49,49,49,52,52,52,52,52,52,52,52,51,51,51,51,51,51,51,51,50,50,50,50,50,50,48,48,53,53,53,53,53,53,53,53,53,53,53,57,57,57,57,57,57,57,56,56,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,58,58,58,58,58,48,48,48,48,59,60,60,60,61,61,61,61,61,61,64,64,64,64,64,64,64,64,63,63,63,63,63,63,63,63,62,62,62,62,62,62,60,60,65,65,65,65,65,65,65,65,65,65,65,65,69,69,69,69,69,69,69,68,68,68,68,68,68,68,68,67,67,67,67,67,67,71,74,74,74,74,74,74,74,73,73,73,73,73,73,73,73,72,72,72,72,72,72,72,75,75,75,75,75,75,75,75,76,77,77,78,78,79,79,79,79,79,79,79,79,80,81,81,83,83,83,83,84,84,84,84,85,85,86,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,86,88,88,89,89,90,90,92,92,92,92,92,92,92,92,92,92,91,91,91,91,91,91,91,94,94,93,93,98,98,97,97,97,97,97,100,100,100,100,100,100,100,100,100,100,101,101,99,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,106,105,105,105,105,104,104,104,104,104,104,109,109,109,109,109,109,109,108,108,108,108,108,108,108,108] +[110,110,102,60,114,114,114,114,114,114,114,113,113,113,113,113,113,113,113,112,112,112,112,112,112,112,112,112,115,115,115,115,115,115,48,116,116,117,117,117,117,117,117,120,120,120,120,120,120,120,120,119,119,119,119,119,119,119,119,118,118,118,118,118,116,116,121,121,121,121,121,121,121,121,121,121,121,125,125,125,125,125,125,125,124,124,124,124,124,124,124,124,123,123,123,123,123,123,123,123,126,126,126,126,126,116,116,116,116,127,128,128,128,129,129,129,129,129,129,132,132,132,132,132,132,132,132,131,131,131,131,131,131,131,131,130,130,130,130,130,128,128,133,133,133,133,133,133,133,133,133,133,133,133,137,137,137,137,137,137,137,136,136,136,136,136,136,136,136,135,135,135,135,135,139,142,142,142,142,142,142,142,141,141,141,141,141,141,141,141,140,140,140,140,140,140,140,143,143,143,143,143,143,143,143,144,145,145,146,146,147,147,147,147,147,147,147,147,148,149,149,151,151,151,151,152,152,152,152,153,153,154,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,154,156,156,157,157,158,158,160,160,160,160,160,160,160,160,160,160,159,159,159,159,159,159,159,162,162,161,161,166,166,165,165,165,165,165,168,168,168,168,168,168,168,168,168,168,169,169,167,175,175,175,175,175,175,175,175,174,174,174,174,174,174,174,174,173,173,173,173,172,172,172,172,172,172,177,177,177,177,177,177,177,176,176,176,176,176,176,176,176,178,178,170,182,182,182,182,182,182,182,182,181,181,181,181,181,181,181,181,180,180,180,180,180,180,180,180,183,183,183,183,183,183,127,184,184,185,185,185,185,185,185,188,188,188,188,188,188,188,188,187,187,187,187,187,187,187,187,186,186,186,186,186,186,184,184,189,189,189,189,189,189,189,189,189,189,189,193,193,193,193,193,193,193,192,192,192,192,192,192,192,192,191,191,191,191,191,191,191,191,191,194,194,194,194,194,184,184,184,184,195,196,196,196,197,197,197,197,197,197,200,200,200,200,200,200,200,200,199,199,199,199,199,199,199,199,198,198,198,198,198,198,196,196,201,201,201,201,201,201,201,201,201,201,201,201,205,205,205,205,205,205,205,204,204,204,204,204,204,204,204,203,203,203,203,203,203] +[196,196,196,196,196,196,196,196,207,208,208,210,210,210,210,211,211,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,213,213,213,216,216,216,216,216,216,216,215,215,215,215,215,215,215,215,214,214,214,214,214,214,214,217,219,219,220,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,222,222,222,222,223,223,223,223,224,224,225,225,226,226,228,228,228,228,228,228,228,228,228,228,227,227,227,227,227,227,227,230,230,229,229,234,234,233,233,233,233,233,236,236,236,236,236,236,236,236,236,236,237,237,235,243,243,243,243,243,243,243,243,242,242,242,242,242,242,242,242,241,241,241,241,240,240,240,240,240,240,245,245,245,245,245,245,245,244,244,244,244,244,244,244,244,246,246,248,248,248,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,250,250,250,250,251,251,252,252,253,253,255,255,255,255,255,255,255,255,255,255,254,254,254,254,254,254,254,256,256,257,257,258,259,259,259,260,260,260,260,260,260,262,262,262,262,262,262,262,262,262,262,262,263,263,261,259,259,264,264,264,264,264,264,264,264,264,265,265,265,265,265,267,267,267,266,268,268,268,268,268,270,270,270,270,270,270,270,270,270,270,271,271,269,272,272,272,273,273,273,273,273,273,274,274,274,274,274,274,274,272,272,275,275,275,275,275,275,275,275,275,275,275,275,276,276,276,276,276,278,278,278,278,278,278,278,279,279,277,276,272,272,272,280,280,280,280,280,280,281,281,281,280,285,285,285,285,285,285,285,285,284,284,284,284,284,284,284,284,283,283,283,283,283,283,283,283,283,286,286,286,286,286,286,184,287,287,288,288,288,288,288,288,291,291,291,291,291,291,291,291,290,290,290,290,290,290,290,290,289,289,289,289,289,289,287,287,292,292,292,292,292,292,292,292,292,292,292,296,296,296,296,296,296,296,295,295,295,295,295,295,295,295,294,294,294,294,294,294,294,294,294] +[293,293,293,293,293,287,287,287,287,298,299,299,299,300,300,300,300,300,300,303,303,303,303,303,303,303,303,302,302,302,302,302,302,302,302,301,301,301,301,301,301,299,299,304,304,304,304,304,304,304,304,304,304,304,304,308,308,308,308,308,308,308,307,307,307,307,307,307,307,307,306,306,306,306,306,306,309,309,309,309,309,309,309,309,310,311,311,317,317,317,317,317,317,317,316,316,316,316,316,316,316,316,315,315,315,315,315,315,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,313,322,322,322,322,322,322,322,322,321,321,321,321,321,321,321,321,320,320,320,320,320,320,320,320,320,323,323,323,323,323,323,327,327,327,327,327,327,327,326,326,326,326,326,326,326,326,325,325,325,325,325,325,325,325,325,328,328,328,328,328] +[10,-1,-1,-1,-1,-1,-1,-1,-1,332,334,334,333,338,338,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,340,340,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,336,341,341,341,341,341,341,341,341,342,344,344,345,345,343,347,347,347,348,348,350,350,350,350,350,350,350,350,350,349,349,349,349,349,348,351,351,348,352,355,355,355,355,355,355,355,355,355,355,355,356,356,356,356,356,356,356,356,357,358,358,364,364,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,362,362,362,362,362,362,365,365,366,367,367,368,368,366,360,359,369,369,369,369,370,370,370,370,370,370,370,371,371,371,372,372,372,372,373,373,374,374,374,374,374,374,374,374,374,374,374,374,374,374,377,377,376,376,376,376,376,376,376,376,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,379,379,379,375,380,380,382,382,383,383,383,383,384,384,381,385,385,385,386,386,386,386,386,386,387,387,387,385,385,388,388,388,388,388,388,388,388,388,388,388,388,390,390,391,391,391,391,391,391,392,392,392,394,394,393,393,393,393,393,393,393,392,392,395,395,396,396,396,397,397,401,401,400,400,400,400,400,400,400,398,398,396,396,396,396,402,402,402,402,402,402,402,403,403,405,405,405,409,409,409,409,409,409,409,409,409,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,413,413,412,412,412,412,412,412,412,412,411,411,411,411,411,411,411,414,414,414,414,414,414,414,415,415,415,415,415,415,415,407,416,416,417,417,417,417,417,418,418,421,421,421,421,421,421,421,421,421,420,420,420,420,420,420,420,420,420,420,420,420,420,420,422,422,422,422,422,422,422,425,425,425,424,424,424,424,424,426,426,426,426,426,426,426,426,426,426,429,429,429,428,428,428,428,430,430,430,430,430,430,430,430,430,430,430,430,433,433,433,432,432,432,432,432,432,434,434,434,434,434,434,434,434,437,437,437,436,436,436,436,436,438,438,441,441,440,440,440,442,442,446,446,445,445,445,445,445,445,445,445,445,445,445,445,447,447,448,448,448,448,448,448,448,449,449,449,346] +[452,452,451,451,451,451,451,451,451,451,451,451,451,451,451,454,454,453,453,453,453,453,453,453,453,453,453,453,453,453,450,455,455,455,455,455,455,455,455,456,458,458,459,459,457,461,461,461,462,462,464,464,464,464,464,464,464,464,464,463,463,463,463,463,462,465,465,462,466,469,469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,471,472,472,478,478,477,477,477,477,477,477,477,477,477,477,477,477,477,476,476,476,476,476,476,479,479,480,481,481,482,482,480,474,473,483,483,483,483,484,484,484,484,484,484,484,485,485,485,486,486,486,486,487,487,488,488,488,488,488,488,488,488,488,488,491,491,490,490,490,490,490,490,490,490,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,493,493,493,489,494,494,496,496,497,497,497,497,498,498,495,499,499,499,500,500,500,500,500,500,501,501,501,499,499,502,502,502,502,502,502,502,502,502,502,502,502,504,504,505,505,505,505,505,505,506,506,506,508,508,507,507,507,507,507,507,507,506,506,509,509,510,510,510,511,511,515,515,514,514,514,514,514,514,514,512,512,510,510,510,510,516,516,516,516,516,516,516,517,517,519,519,519,523,523,523,523,523,523,523,523,523,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,527,527,526,526,526,526,526,526,526,526,525,525,525,525,525,525,525,528,528,528,528,528,528,528,529,529,529,529,529,529,529,521,530,530,531,531,531,531,531,532,532,535,535,535,535,535,535,535,535,535,534,534,534,534,534,534,534,534,534,534,534,534,534,534,536,536,536,536,536,536,536,536,536,539,539,539,538,538,538,538,538,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,540,543,543,543,542,542,542,542,544,544,547,547,546,546,546,548,548,552,552,551,551,551,551,551,551,551,551,551,551,551,551,553,553,554,554,554,554,554,554,554,555,555,555,460,335,331,556,556,556,556,556,556,556,329] +[-1,-1,-1,-1,-1,-1,-1,-1,-1,560,562,562,561,567,567,566,566,566,565,565,565,565,565,565,565,565,565,565,565,565,570,570,569,569,569,568,568,568,568,568,568,568,568,568,568,568,568,564,571,571,571,571,571,571,571,571,572,574,574,573,576,576,576,576,576,576,584,584,584,585,585,585,585,585,583,582,582,582,582,582,586,586,581,580,580,580,580,580,580,580,580,579,579,578,578,578,578,578,578,578,587,587,577,591,591,591,591,591,591,591,591,590,590,590,590,590,590,590,590,590,590,589,589,589,589,589,589,589,589,594,594,594,594,594,594,594,593,593,593,593,593,593,593,593,593,593,592,592,592,592,592,592,592,592,588,595,595,595,595,595,595,595,595,596,597,597,599,599,599,599,599,599,604,604,604,604,604,604,604,604,605,605,605,605,605,603,602,602,602,602,602,602,602,602,601,601,601,601,601,601,606,606,606,606,606,607,607,607,607,607,607,607,607,607,607,600,598,608,608,608,610,610,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,615,615,615,615,615,615,615,614,614,614,614,614,614,614,614,613,613,613,613,613,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,611,608,608,608,608,619,619,619,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,620,620,620,620,620,620,620,620,621,621,621,621,621,621,622,622,622,622,622,621,621,621,621,621,621,621,621,621,621,623,623,623,623,623,621,621,621,621,621,621,624,624,624,624,624,624,621,621,621,621,621,621,621,621,621,621,625,625,625,625,625,621,621,621,621,621,621,621,621,621,621,621,621,626,626,626,626,626,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,627,627,627,627,627,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,628,628,628,628,628,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,629,629,629,629,629,629,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,630,630,630,630,630,630,630,630,630,630,630,630] +[621,621,621,621,621,621,631,631,631,631,631,631,631,631,631,631,631,621,621,621,621,621,621,621,632,633,633,633,633,633,633,633,633,633,633,633,632,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,634,634,634,634,634,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,621,621,621,621,621,621,621,621,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,621,-1,-1,-1,-1,-1,637,637,637,637,637,637,637,637,638,640,640,639,642,642,642,642,643,643,645,645,645,645,645,644,644,644,644,644,644,644,646,646,648,648,647,647,647,647,647,647,647,647,649,649,649,651,651,653,653,652,652,652,652,652,652,652,654,654,650,649,649,655,655,655,655,658,658,657,657,657,657,657,657,657,657,661,661,660,660,660,660,660,660,660,662,662,664,664,663,663,663,663,663,663,663,665,665,666,666,666,666,666,666,666,666,668,668,672,672,671,671,671,671,671,671,671,673,673,673,673,673,675,675,675,675,675,674,674,674,674,674,674,674,676,676,669,677,677,677,680,680,680,679,679,679,679,679,679,679,679,678,684,684,683,683,683,683,683,683,683,683,682,682,682,682,682,682,682,682,682,682,682,682,682,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,686,686,686,686,686,686,686,686,687,688,688,694,694,695,695,695,695,695,693,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,690,690,689,699,699,699,698,698,698,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,702,702,701,701,701,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700] +[704,704,704,704,704,703,703,707,707,707,706,706,706,706,706,705,710,710,710,710,710,709,709,709,709,709,708,713,713,713,712,712,712,712,712,712,712,712,712,712,711,716,716,716,716,716,715,715,715,715,715,715,715,715,715,715,714,717,717,717,717,717,717,717,718,718,718,718,718,718,637,-1,-1,-1,-1,-1,719,719,719,719,719,719,719,719,720,721,721,722,722,722,722,723,723,725,725,725,725,725,724,724,724,724,724,724,724,726,726,728,728,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,729,729,731,731,730,730,730,730,730,730,730,733,733,733,735,735,734,734,734,734,734,734,734,736,736,736,737,740,740,740,740,740,739,739,739,739,739,739,739,738,738,741,745,745,744,744,744,744,744,744,744,744,744,744,744,744,744,746,746,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,751,751,751,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,752,752,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,757,757,757,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,758,758,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,763,763,763,762,762,762,762,762,764,764,765,765,765,765,765,765,765,765,766,768,768,769,769,767,774,774,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,775,775,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,777,777,778,778,778,778,778,778,778,778,778,778,778,771,770,782,782,782,781,781,781,781,781,781,781,781,780,780,780,780,780,779,785,785,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,786,786,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,787,790,790,790,790,790,790,789,789,789,789,789,789,789,789,789,789,789,789,789,791,791,791,791,791,792,792,792,792,792,792,793,793,793,793,793,793,722,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,794,794,794,794,794,794,-1,-1,-1,-1,-1,-1,-1,795,795,795,795,795,795,795,795,796,797,797,799,799,799,799,799,799,800,800,800,800,800,800,800,801,801,801,801,801,801,801,801,801,801,801,801,801] +[802,802,802,802,802,802,802,802,802,802,802,802,799,804,804,804,804,804,803,803,803,803,803,803,803,803,803,803,803,803,803,795,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,805,805,805,805,805,805,805,805,806,808,808,807,810,810,810,810,811,811,811,811,812,812,813,813,813,813,813,814,814,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,816,816,819,819,818,818,818,818,818,820,820,817,821,821,810,810,822,822,822,822,822,823,824,826,826,828,828,829,829,831,831,831,834,834,833,833,833,833,833,835,835,832,836,836,836,836,836,836,837,837,837,809,-1,-1,-1,838,838,838,838,838,838,838,838,839,840,840,842,842,842,842,843,843,845,845,846,846,846,846,846,851,851,851,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,849,849,849,849,849,849,849,849,849,849,852,852,852,852,853,853,852,854,854,854,854,854,854,854,855,855,855,855,855,855,841,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,856,856,856,856,856,856,856,856,857,859,859,858,861,861,861,862,862,862,862,862,862,863,863,863,861,861,864,864,864,864,864,864,864,864,864,866,866,867,867,867,860,860,860,860,868,868,869,869,869,869,869,870,870,872,872,871,871,871,871,871,871,871,873,873,875,875,874,874,874,873,876,876,876,876,876,878,878,878,877,877,877,877,877,877,877,877,877,877,879,879,879,879,879,879,879,879,877,877,880,880,882,882,883,883,883,883,883,883,883,881,877,884,884,884,887,887,886,886,886,886,886,886,886,885,885,888,888,888,888,888,889,889,891,891,890,890,890,890,890,890,890,890,890,890,890,890,890,890,890,890,890,892,892,893,893,893,894,894,894,895,895,895,895,895,895,896,896,896,894,894,897,897,897,897,897,897,897,897,898,900,900,901,901,901,901,904,904,903,903,903,903,903,905,905,905,905,905,907,907,907,910,910,909,909,909,909,909,911,911,911,911,908,898,894,894,894,912,914,914,916,916,916,916,916,916,916,917,917,919,919,919,920,920,920,920,923,923,922,922,922,922,922,922,922,922,924,924,924,924,925,925,925,925,925,921,912,926,926,927,927] +[928,928,928,928,926,929,930,930,931,936,936,936,936,936,936,936,935,935,935,935,935,935,935,935,934,934,934,934,934,934,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,938,939,939,939,939,939,940,940,940,940,940,940,940,940,940,940,938,941,943,943,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,941,948,948,948,948,948,948,948,948,947,947,947,947,947,947,947,947,946,946,946,946,946,946,944,944,950,950,957,957,956,956,956,956,956,956,956,956,956,956,956,956,958,958,958,958,958,958,958,958,958,958,958,955,954,954,954,954,954,954,954,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,960,960,953,952,952,952,952,952,952,952,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,969,969,969,968,968,968,968,970,971,971,971,971,971,971,971,971,971,971,971,971,971,972,972,972,972,972,972,972,972,972,972,973,973,973,973,973,973,973,973,973,973,973,973,973,974,974,974,974,974,974,974,974,974,974,975,975,975,975,975,975,975,975,975,975,975,975,975,975,976,976,976,976,976,976,970,967,966,966,966,966,966,966,966,966,966,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,978,978,965,964,964,964,964,964,979,979,979,979,979,979,979,979,980,981,981,982,982,982,982,983,983,985,985,986,986,986,986,986,984,987,987,990,990,989,989,989,989,989,991,991,991,991,991,991,991,991,993,993,993,996,996,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,997,997,1001,1001,1001,1000,1000,1000,1000,1000,1000,1000,1000,1000,1002,1002,1002,1002,1002,1002,1002,1002,1003,1003,998,982,1006,1006,1006,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1004,1009,1009,1008,1008,1008,1008,1008,1008,1008,1008,1008,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1013,1013,1013,1012,1012,1012,1012,1012,1012,1011,1016,1016,1015,1015,1015,1015,1015,1015,1015,1015,1015,1017,1017,1017,1017,1017,1017,1017,1017,1017,1019,1019,1018,1018,1018,1018,1018,1018,1014] +[1022,1022,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1020,1025,1025,1024,1024,1024,1024,1024,1024,1024,1024,1024,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1027,1032,1032,1032,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1030,1037,1037,1036,1036,1036,1036,1036,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1035,1034,1034,1034,1034,1034,1039,1039,1039,1039,1039,1039,1039,1039,1040,1041,1041,1042,1042,1042,1042,1043,1043,1045,1045,1046,1046,1046,1046,1046,1044,1047,1047,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1049,1049,1049,1049,1049,1053,1053,1052,1052,1052,1052,1052,1051,1051,1048,1054,1054,1057,1057,1056,1056,1056,1056,1056,1056,1056,1055,1059,1059,1059,1062,1062,1061,1061,1061,1061,1061,1061,1061,1061,1061,1060,1060,1063,1063,1063,1064,1064,1063,1063,1066,1066,1065,1065,1065,1065,1065,1065,1065,1063,1063,1067,1067,1063,1069,1069,1068,1068,1068,1068,1068,1068,1068,1063,1063,1070,1070,1063,1075,1075,1074,1074,1074,1074,1074,1074,1074,1076,1076,1076,1076,1076,1076,1076,1076,1073,1072,1072,1072,1077,1077,1077,1077,1077,1071,1063,1078,1079,1079,1082,1082,1081,1081,1081,1081,1081,1081,1081,1080,1084,1084,1084,1087,1087,1086,1086,1086,1086,1085,1093,1093,1093,1092,1092,1092,1092,1092,1091,1091,1090,1090,1090,1090,1094,1094,1098,1098,1098,1097,1097,1097,1097,1097,1097,1097,1095,1095,1078,1042,1101,1101,1101,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1099,1106,1106,1105,1105,1105,1105,1105,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1104,1103,1103,1103,1103,1103,1108,1108,1108,1108,1108,1108,1108,1108,1109,1110,1110,1111,1111,1111,1111,1112,1112,1114,1114,1115,1115,1115,1115,1115,1113,1116,1116,1117,1122,1122,1121,1121,1121,1121,1121,1120,1120,1119,1119,1119,1119,1119,1119,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1118] +[1124,1124,1124,1117,1125,1125,1117,1116,1126,1126,1129,1129,1129,1128,1128,1128,1128,1128,1128,1128,1127,1140,1140,1139,1139,1139,1139,1139,1139,1139,1138,1138,1137,1137,1137,1137,1137,1137,1137,1137,1137,1136,1136,1135,1135,1135,1135,1135,1135,1135,1135,1135,1141,1141,1141,1141,1141,1141,1141,1141,1141,1141,1141,1141,1141,1141,1141,1134,1133,1133,1133,1133,1142,1142,1132,1131,1131,1131,1131,1131,1143,1143,1143,1143,1143,1143,1143,1143,1144,1145,1145,1146,1146,1146,1146,1147,1147,1149,1149,1150,1150,1150,1150,1150,1148,1151,1151,1154,1154,1153,1153,1153,1153,1153,1152,1156,1156,1156,1159,1159,1158,1158,1158,1158,1158,1158,1158,1158,1161,1161,1161,1161,1161,1161,1161,1162,1162,1162,1162,1163,1163,1164,1164,1164,1164,1164,1160,1165,1165,1165,1169,1169,1169,1168,1168,1168,1168,1168,1170,1170,1166,1146,1130,1108,1174,1174,1174,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,1177,1177,1176,1176,1176,1176,1178,1179,1179,1179,1179,1179,1179,1179,1179,1179,1179,1179,1179,1179,1180,1180,1180,1180,1180,1180,1180,1180,1180,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1181,1182,1182,1182,1182,1182,1182,1182,1182,1182,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1184,1184,1184,1184,1184,1184,1184,1184,1184,1184,1184,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1186,1186,1186,1186,1186,1186,1186,1178,1175,1189,1189,1188,1188,1188,1188,1190,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1191,1192,1192,1192,1192,1192,1192,1192,1193,1193,1193,1193,1193,1193,1193,1193,1193,1193,1193,1193,1193,1194,1194,1194,1194,1194,1194,1194,1195,1195,1195,1195,1195,1195,1195,1195,1195,1195,1195,1195,1195,1195,1196,1196,1196,1196,1196,1196,1196,1196,1196,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1198,1198,1198,1198,1198,1198,1198,1198,1190,1199,1199,1199,1199,1199,1199,1199,1200,1200,1200,1200,1200,1200,888,-1,-1,-1,1201,1204,1204,1203,1203,1203,1203,1203,1203,1202,1208,1208,1208,1208,1208,1208,1208,1207,1207,1207,1207,1207,1207,1207,1207,1206,1206,1206,1206,1206,1206,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1209,1205] +[1212,1212,1212,1212,1212,1212,1212,1212,1212,1212,1212,1213,1213,1213,1213,1213,1213,1213,1213,1214,1215,1215,1221,1221,1220,1220,1220,1220,1220,1220,1220,1220,1220,1220,1219,1219,1219,1219,1219,1219,1222,1222,1223,1224,1224,1223,1217,1216,1225,1225,1225,1225,1225,1210,884,856,608,563,559,1226,1226,1226,1226,1226,1226,1226,0] +/** Begin file information. **/ +[] +[] +[] +[] +[] +[] +[] +[] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +["./scripts/jquery.syntaxhighlighter.js"] +/** Begin mapping definitions. **/ +["./scripts/jquery.syntaxhighlighter.js",1,0] +["./scripts/jquery.syntaxhighlighter.js",20,0] +["./scripts/jquery.syntaxhighlighter.js",20,5] +["./scripts/jquery.syntaxhighlighter.js",20,12,"console"] +["./scripts/jquery.syntaxhighlighter.js",20,12,"window"] +["./scripts/jquery.syntaxhighlighter.js",20,31] +["./scripts/jquery.syntaxhighlighter.js",21,1] +["./scripts/jquery.syntaxhighlighter.js",21,1,"console"] +["./scripts/jquery.syntaxhighlighter.js",21,1,"window"] +["./scripts/jquery.syntaxhighlighter.js",21,18] +["./scripts/jquery.syntaxhighlighter.js",25,0] +["./scripts/jquery.syntaxhighlighter.js",25,5] +["./scripts/jquery.syntaxhighlighter.js",25,12,"emulated"] +["./scripts/jquery.syntaxhighlighter.js",25,12,"console"] +["./scripts/jquery.syntaxhighlighter.js",25,12,"window"] +["./scripts/jquery.syntaxhighlighter.js",25,40] +["./scripts/jquery.syntaxhighlighter.js",25,54] +["./scripts/jquery.syntaxhighlighter.js",27,1] +["./scripts/jquery.syntaxhighlighter.js",27,6] +["./scripts/jquery.syntaxhighlighter.js",27,13,"log"] +["./scripts/jquery.syntaxhighlighter.js",27,13,"console"] +["./scripts/jquery.syntaxhighlighter.js",27,13,"window"] +["./scripts/jquery.syntaxhighlighter.js",27,36] +["./scripts/jquery.syntaxhighlighter.js",28,2] +["./scripts/jquery.syntaxhighlighter.js",28,2,"hasLog"] +["./scripts/jquery.syntaxhighlighter.js",28,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",28,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",28,26] +["./scripts/jquery.syntaxhighlighter.js",30,6] +["./scripts/jquery.syntaxhighlighter.js",31,2] +["./scripts/jquery.syntaxhighlighter.js",31,7] +["./scripts/jquery.syntaxhighlighter.js",31,14,"log"] +["./scripts/jquery.syntaxhighlighter.js",31,14,"console"] +["./scripts/jquery.syntaxhighlighter.js",31,14,"window"] +["./scripts/jquery.syntaxhighlighter.js",31,37] +["./scripts/jquery.syntaxhighlighter.js",32,3] +["./scripts/jquery.syntaxhighlighter.js",32,3,"log"] +["./scripts/jquery.syntaxhighlighter.js",32,3,"console"] +["./scripts/jquery.syntaxhighlighter.js",32,3,"window"] +["./scripts/jquery.syntaxhighlighter.js",32,32] +["./scripts/jquery.syntaxhighlighter.js",32,32,""] +["./scripts/jquery.syntaxhighlighter.js",32,32] +["./scripts/jquery.syntaxhighlighter.js",32,34] +["./scripts/jquery.syntaxhighlighter.js",34,2] +["./scripts/jquery.syntaxhighlighter.js",34,2,"hasLog"] +["./scripts/jquery.syntaxhighlighter.js",34,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",34,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",34,26] +["./scripts/jquery.syntaxhighlighter.js",38,1] +["./scripts/jquery.syntaxhighlighter.js",38,6] +["./scripts/jquery.syntaxhighlighter.js",38,13,"debug"] +["./scripts/jquery.syntaxhighlighter.js",38,13,"console"] +["./scripts/jquery.syntaxhighlighter.js",38,13,"window"] +["./scripts/jquery.syntaxhighlighter.js",38,38] +["./scripts/jquery.syntaxhighlighter.js",39,2] +["./scripts/jquery.syntaxhighlighter.js",39,2,"hasDebug"] +["./scripts/jquery.syntaxhighlighter.js",39,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",39,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",39,28] +["./scripts/jquery.syntaxhighlighter.js",41,6] +["./scripts/jquery.syntaxhighlighter.js",42,2] +["./scripts/jquery.syntaxhighlighter.js",42,7] +["./scripts/jquery.syntaxhighlighter.js",42,14,"debug"] +["./scripts/jquery.syntaxhighlighter.js",42,14,"console"] +["./scripts/jquery.syntaxhighlighter.js",42,14,"window"] +["./scripts/jquery.syntaxhighlighter.js",42,39] +["./scripts/jquery.syntaxhighlighter.js",43,3] +["./scripts/jquery.syntaxhighlighter.js",43,3,"debug"] +["./scripts/jquery.syntaxhighlighter.js",43,3,"console"] +["./scripts/jquery.syntaxhighlighter.js",43,3,"window"] +["./scripts/jquery.syntaxhighlighter.js",43,26] +["./scripts/jquery.syntaxhighlighter.js",43,26] +["./scripts/jquery.syntaxhighlighter.js",43,27,"hasLog"] +["./scripts/jquery.syntaxhighlighter.js",43,27,"console"] +["./scripts/jquery.syntaxhighlighter.js",43,27,"window"] +["./scripts/jquery.syntaxhighlighter.js",43,59] +["./scripts/jquery.syntaxhighlighter.js",43,59,""] +["./scripts/jquery.syntaxhighlighter.js",43,59] +["./scripts/jquery.syntaxhighlighter.js",43,61] +["./scripts/jquery.syntaxhighlighter.js",43,74] +["./scripts/jquery.syntaxhighlighter.js",43,74,""] +["./scripts/jquery.syntaxhighlighter.js",43,74] +["./scripts/jquery.syntaxhighlighter.js",43,76] +["./scripts/jquery.syntaxhighlighter.js",44,34] +["./scripts/jquery.syntaxhighlighter.js",44,4] +["./scripts/jquery.syntaxhighlighter.js",44,8,"arr"] +["./scripts/jquery.syntaxhighlighter.js",44,14] +["./scripts/jquery.syntaxhighlighter.js",44,15] +["./scripts/jquery.syntaxhighlighter.js",44,42,"i"] +["./scripts/jquery.syntaxhighlighter.js",44,46] +["./scripts/jquery.syntaxhighlighter.js",44,49,"i"] +["./scripts/jquery.syntaxhighlighter.js",44,53,"length"] +["./scripts/jquery.syntaxhighlighter.js",44,53,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",44,71] +["./scripts/jquery.syntaxhighlighter.js",44,71,"i"] +["./scripts/jquery.syntaxhighlighter.js",44,78] +["./scripts/jquery.syntaxhighlighter.js",44,86] +["./scripts/jquery.syntaxhighlighter.js",44,78,"push"] +["./scripts/jquery.syntaxhighlighter.js",44,78,"arr"] +["./scripts/jquery.syntaxhighlighter.js",44,87] +["./scripts/jquery.syntaxhighlighter.js",44,87,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",44,97,"i"] +["./scripts/jquery.syntaxhighlighter.js",45,7] +["./scripts/jquery.syntaxhighlighter.js",45,31] +["./scripts/jquery.syntaxhighlighter.js",45,7,"apply"] +["./scripts/jquery.syntaxhighlighter.js",45,7,"log"] +["./scripts/jquery.syntaxhighlighter.js",45,7,"console"] +["./scripts/jquery.syntaxhighlighter.js",45,7,"window"] +["./scripts/jquery.syntaxhighlighter.js",45,32,"console"] +["./scripts/jquery.syntaxhighlighter.js",45,32,"window"] +["./scripts/jquery.syntaxhighlighter.js",45,48,"arr"] +["./scripts/jquery.syntaxhighlighter.js",48,2] +["./scripts/jquery.syntaxhighlighter.js",48,2,"hasDebug"] +["./scripts/jquery.syntaxhighlighter.js",48,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",48,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",48,28] +["./scripts/jquery.syntaxhighlighter.js",52,1] +["./scripts/jquery.syntaxhighlighter.js",52,6] +["./scripts/jquery.syntaxhighlighter.js",52,13,"warn"] +["./scripts/jquery.syntaxhighlighter.js",52,13,"console"] +["./scripts/jquery.syntaxhighlighter.js",52,13,"window"] +["./scripts/jquery.syntaxhighlighter.js",52,37] +["./scripts/jquery.syntaxhighlighter.js",53,2] +["./scripts/jquery.syntaxhighlighter.js",53,2,"hasWarn"] +["./scripts/jquery.syntaxhighlighter.js",53,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",53,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",53,27] +["./scripts/jquery.syntaxhighlighter.js",55,6] +["./scripts/jquery.syntaxhighlighter.js",56,2] +["./scripts/jquery.syntaxhighlighter.js",56,7] +["./scripts/jquery.syntaxhighlighter.js",56,14,"warn"] +["./scripts/jquery.syntaxhighlighter.js",56,14,"console"] +["./scripts/jquery.syntaxhighlighter.js",56,14,"window"] +["./scripts/jquery.syntaxhighlighter.js",56,38] +["./scripts/jquery.syntaxhighlighter.js",57,3] +["./scripts/jquery.syntaxhighlighter.js",57,3,"warn"] +["./scripts/jquery.syntaxhighlighter.js",57,3,"console"] +["./scripts/jquery.syntaxhighlighter.js",57,3,"window"] +["./scripts/jquery.syntaxhighlighter.js",57,25] +["./scripts/jquery.syntaxhighlighter.js",57,25] +["./scripts/jquery.syntaxhighlighter.js",57,26,"hasLog"] +["./scripts/jquery.syntaxhighlighter.js",57,26,"console"] +["./scripts/jquery.syntaxhighlighter.js",57,26,"window"] +["./scripts/jquery.syntaxhighlighter.js",57,58] +["./scripts/jquery.syntaxhighlighter.js",57,58,""] +["./scripts/jquery.syntaxhighlighter.js",57,58] +["./scripts/jquery.syntaxhighlighter.js",57,60] +["./scripts/jquery.syntaxhighlighter.js",57,73] +["./scripts/jquery.syntaxhighlighter.js",57,73,""] +["./scripts/jquery.syntaxhighlighter.js",57,73] +["./scripts/jquery.syntaxhighlighter.js",57,75] +["./scripts/jquery.syntaxhighlighter.js",58,33] +["./scripts/jquery.syntaxhighlighter.js",58,4] +["./scripts/jquery.syntaxhighlighter.js",58,8,"arr"] +["./scripts/jquery.syntaxhighlighter.js",58,14] +["./scripts/jquery.syntaxhighlighter.js",58,15] +["./scripts/jquery.syntaxhighlighter.js",58,41,"i"] +["./scripts/jquery.syntaxhighlighter.js",58,45] +["./scripts/jquery.syntaxhighlighter.js",58,48,"i"] +["./scripts/jquery.syntaxhighlighter.js",58,52,"length"] +["./scripts/jquery.syntaxhighlighter.js",58,52,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",58,70] +["./scripts/jquery.syntaxhighlighter.js",58,70,"i"] +["./scripts/jquery.syntaxhighlighter.js",58,77] +["./scripts/jquery.syntaxhighlighter.js",58,85] +["./scripts/jquery.syntaxhighlighter.js",58,77,"push"] +["./scripts/jquery.syntaxhighlighter.js",58,77,"arr"] +["./scripts/jquery.syntaxhighlighter.js",58,86] +["./scripts/jquery.syntaxhighlighter.js",58,86,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",58,96,"i"] +["./scripts/jquery.syntaxhighlighter.js",59,7] +["./scripts/jquery.syntaxhighlighter.js",59,31] +["./scripts/jquery.syntaxhighlighter.js",59,7,"apply"] +["./scripts/jquery.syntaxhighlighter.js",59,7,"log"] +["./scripts/jquery.syntaxhighlighter.js",59,7,"console"] +["./scripts/jquery.syntaxhighlighter.js",59,7,"window"] +["./scripts/jquery.syntaxhighlighter.js",59,32,"console"] +["./scripts/jquery.syntaxhighlighter.js",59,32,"window"] +["./scripts/jquery.syntaxhighlighter.js",59,48,"arr"] +["./scripts/jquery.syntaxhighlighter.js",62,2] +["./scripts/jquery.syntaxhighlighter.js",62,2,"hasWarn"] +["./scripts/jquery.syntaxhighlighter.js",62,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",62,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",62,27] +["./scripts/jquery.syntaxhighlighter.js",66,1] +["./scripts/jquery.syntaxhighlighter.js",66,6] +["./scripts/jquery.syntaxhighlighter.js",66,13,"error"] +["./scripts/jquery.syntaxhighlighter.js",66,13,"console"] +["./scripts/jquery.syntaxhighlighter.js",66,13,"window"] +["./scripts/jquery.syntaxhighlighter.js",66,38] +["./scripts/jquery.syntaxhighlighter.js",67,2] +["./scripts/jquery.syntaxhighlighter.js",67,2,"hasError"] +["./scripts/jquery.syntaxhighlighter.js",67,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",67,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",67,28] +["./scripts/jquery.syntaxhighlighter.js",69,6] +["./scripts/jquery.syntaxhighlighter.js",70,2] +["./scripts/jquery.syntaxhighlighter.js",70,7] +["./scripts/jquery.syntaxhighlighter.js",70,14,"error"] +["./scripts/jquery.syntaxhighlighter.js",70,14,"console"] +["./scripts/jquery.syntaxhighlighter.js",70,14,"window"] +["./scripts/jquery.syntaxhighlighter.js",70,39] +["./scripts/jquery.syntaxhighlighter.js",71,3] +["./scripts/jquery.syntaxhighlighter.js",71,3,"error"] +["./scripts/jquery.syntaxhighlighter.js",71,3,"console"] +["./scripts/jquery.syntaxhighlighter.js",71,3,"window"] +["./scripts/jquery.syntaxhighlighter.js",71,34] +["./scripts/jquery.syntaxhighlighter.js",71,34,""] +["./scripts/jquery.syntaxhighlighter.js",71,34] +["./scripts/jquery.syntaxhighlighter.js",71,36] +["./scripts/jquery.syntaxhighlighter.js",72,4] +["./scripts/jquery.syntaxhighlighter.js",72,8,"msg"] +["./scripts/jquery.syntaxhighlighter.js",72,14] +["./scripts/jquery.syntaxhighlighter.js",75,4] +["./scripts/jquery.syntaxhighlighter.js",75,9,"hasLog"] +["./scripts/jquery.syntaxhighlighter.js",75,9,"console"] +["./scripts/jquery.syntaxhighlighter.js",75,9,"window"] +["./scripts/jquery.syntaxhighlighter.js",75,33] +["./scripts/jquery.syntaxhighlighter.js",76,9,"arr"] +["./scripts/jquery.syntaxhighlighter.js",76,9,"arr"] +["./scripts/jquery.syntaxhighlighter.js",76,15] +["./scripts/jquery.syntaxhighlighter.js",76,16] +["./scripts/jquery.syntaxhighlighter.js",76,35] +["./scripts/jquery.syntaxhighlighter.js",76,39] +["./scripts/jquery.syntaxhighlighter.js",76,43,"i"] +["./scripts/jquery.syntaxhighlighter.js",76,47] +["./scripts/jquery.syntaxhighlighter.js",76,50,"i"] +["./scripts/jquery.syntaxhighlighter.js",76,54,"length"] +["./scripts/jquery.syntaxhighlighter.js",76,54,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",76,72] +["./scripts/jquery.syntaxhighlighter.js",76,72,"i"] +["./scripts/jquery.syntaxhighlighter.js",76,79] +["./scripts/jquery.syntaxhighlighter.js",76,87] +["./scripts/jquery.syntaxhighlighter.js",76,79,"push"] +["./scripts/jquery.syntaxhighlighter.js",76,79,"arr"] +["./scripts/jquery.syntaxhighlighter.js",76,88] +["./scripts/jquery.syntaxhighlighter.js",76,88,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",76,98,"i"] +["./scripts/jquery.syntaxhighlighter.js",77,8] +["./scripts/jquery.syntaxhighlighter.js",77,32] +["./scripts/jquery.syntaxhighlighter.js",77,8,"apply"] +["./scripts/jquery.syntaxhighlighter.js",77,8,"log"] +["./scripts/jquery.syntaxhighlighter.js",77,8,"console"] +["./scripts/jquery.syntaxhighlighter.js",77,8,"window"] +["./scripts/jquery.syntaxhighlighter.js",77,33,"console"] +["./scripts/jquery.syntaxhighlighter.js",77,33,"window"] +["./scripts/jquery.syntaxhighlighter.js",77,49,"arr"] +["./scripts/jquery.syntaxhighlighter.js",79,5] +["./scripts/jquery.syntaxhighlighter.js",79,5,"msg"] +["./scripts/jquery.syntaxhighlighter.js",79,11] +["./scripts/jquery.syntaxhighlighter.js",83,4] +["./scripts/jquery.syntaxhighlighter.js",83,14,"i"] +["./scripts/jquery.syntaxhighlighter.js",83,18] +["./scripts/jquery.syntaxhighlighter.js",83,21,"i"] +["./scripts/jquery.syntaxhighlighter.js",83,25,"length"] +["./scripts/jquery.syntaxhighlighter.js",83,25,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",83,43] +["./scripts/jquery.syntaxhighlighter.js",83,45,"i"] +["./scripts/jquery.syntaxhighlighter.js",83,49] +["./scripts/jquery.syntaxhighlighter.js",84,5] +["./scripts/jquery.syntaxhighlighter.js",84,10] +["./scripts/jquery.syntaxhighlighter.js",84,17] +["./scripts/jquery.syntaxhighlighter.js",84,17,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",84,27,"i"] +["./scripts/jquery.syntaxhighlighter.js",84,34] +["./scripts/jquery.syntaxhighlighter.js",85,6] +["./scripts/jquery.syntaxhighlighter.js",87,5] +["./scripts/jquery.syntaxhighlighter.js",87,5,"msg"] +["./scripts/jquery.syntaxhighlighter.js",87,12] +["./scripts/jquery.syntaxhighlighter.js",87,17] +["./scripts/jquery.syntaxhighlighter.js",87,17,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",87,27,"i"] +["./scripts/jquery.syntaxhighlighter.js",91,4] +["./scripts/jquery.syntaxhighlighter.js",91,9] +["./scripts/jquery.syntaxhighlighter.js",91,16,"Error"] +["./scripts/jquery.syntaxhighlighter.js",91,26] +["./scripts/jquery.syntaxhighlighter.js",92,5] +["./scripts/jquery.syntaxhighlighter.js",92,20] +["./scripts/jquery.syntaxhighlighter.js",92,15,"Error"] +["./scripts/jquery.syntaxhighlighter.js",92,21,"msg"] +["./scripts/jquery.syntaxhighlighter.js",95,5] +["./scripts/jquery.syntaxhighlighter.js",95,11,"msg"] +["./scripts/jquery.syntaxhighlighter.js",99,2] +["./scripts/jquery.syntaxhighlighter.js",99,2,"hasError"] +["./scripts/jquery.syntaxhighlighter.js",99,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",99,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",99,28] +["./scripts/jquery.syntaxhighlighter.js",103,1] +["./scripts/jquery.syntaxhighlighter.js",103,6] +["./scripts/jquery.syntaxhighlighter.js",103,13,"trace"] +["./scripts/jquery.syntaxhighlighter.js",103,13,"console"] +["./scripts/jquery.syntaxhighlighter.js",103,13,"window"] +["./scripts/jquery.syntaxhighlighter.js",103,38] +["./scripts/jquery.syntaxhighlighter.js",104,2] +["./scripts/jquery.syntaxhighlighter.js",104,2,"hasTrace"] +["./scripts/jquery.syntaxhighlighter.js",104,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",104,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",104,28] +["./scripts/jquery.syntaxhighlighter.js",106,6] +["./scripts/jquery.syntaxhighlighter.js",107,2] +["./scripts/jquery.syntaxhighlighter.js",107,7] +["./scripts/jquery.syntaxhighlighter.js",107,14,"trace"] +["./scripts/jquery.syntaxhighlighter.js",107,14,"console"] +["./scripts/jquery.syntaxhighlighter.js",107,14,"window"] +["./scripts/jquery.syntaxhighlighter.js",107,39] +["./scripts/jquery.syntaxhighlighter.js",108,3] +["./scripts/jquery.syntaxhighlighter.js",108,3,"trace"] +["./scripts/jquery.syntaxhighlighter.js",108,3,"console"] +["./scripts/jquery.syntaxhighlighter.js",108,3,"window"] +["./scripts/jquery.syntaxhighlighter.js",108,34] +["./scripts/jquery.syntaxhighlighter.js",108,34,""] +["./scripts/jquery.syntaxhighlighter.js",108,34] +["./scripts/jquery.syntaxhighlighter.js",108,36] +["./scripts/jquery.syntaxhighlighter.js",109,4] +["./scripts/jquery.syntaxhighlighter.js",109,24] +["./scripts/jquery.syntaxhighlighter.js",109,4,"error"] +["./scripts/jquery.syntaxhighlighter.js",109,4,"console"] +["./scripts/jquery.syntaxhighlighter.js",109,4,"window"] +["./scripts/jquery.syntaxhighlighter.js",109,25] +["./scripts/jquery.syntaxhighlighter.js",112,2] +["./scripts/jquery.syntaxhighlighter.js",112,2,"hasTrace"] +["./scripts/jquery.syntaxhighlighter.js",112,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",112,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",112,28] +["./scripts/jquery.syntaxhighlighter.js",116,1] +["./scripts/jquery.syntaxhighlighter.js",116,1,"emulated"] +["./scripts/jquery.syntaxhighlighter.js",116,1,"console"] +["./scripts/jquery.syntaxhighlighter.js",116,1,"window"] +["./scripts/jquery.syntaxhighlighter.js",116,27] +["./scripts/jquery.syntaxhighlighter.js",127,1] +["./scripts/jquery.syntaxhighlighter.js",232,2] +["./scripts/jquery.syntaxhighlighter.js",127,9] +["./scripts/jquery.syntaxhighlighter.js",127,9,""] +["./scripts/jquery.syntaxhighlighter.js",127,9] +["./scripts/jquery.syntaxhighlighter.js",127,10,"$"] +["./scripts/jquery.syntaxhighlighter.js",127,12] +["./scripts/jquery.syntaxhighlighter.js",139,1] +["./scripts/jquery.syntaxhighlighter.js",139,1,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",139,1,"$"] +["./scripts/jquery.syntaxhighlighter.js",139,22,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",139,22,"$"] +["./scripts/jquery.syntaxhighlighter.js",139,52] +["./scripts/jquery.syntaxhighlighter.js",139,52,""] +["./scripts/jquery.syntaxhighlighter.js",139,52] +["./scripts/jquery.syntaxhighlighter.js",139,53,"url"] +["./scripts/jquery.syntaxhighlighter.js",139,58,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",139,68] +["./scripts/jquery.syntaxhighlighter.js",141,2] +["./scripts/jquery.syntaxhighlighter.js",141,7] +["./scripts/jquery.syntaxhighlighter.js",141,9,"body"] +["./scripts/jquery.syntaxhighlighter.js",141,9,"document"] +["./scripts/jquery.syntaxhighlighter.js",141,24] +["./scripts/jquery.syntaxhighlighter.js",141,33] +["./scripts/jquery.syntaxhighlighter.js",142,3] +["./scripts/jquery.syntaxhighlighter.js",142,13] +["./scripts/jquery.syntaxhighlighter.js",142,3,"setTimeout"] +["./scripts/jquery.syntaxhighlighter.js",142,22] +["./scripts/jquery.syntaxhighlighter.js",142,22,""] +["./scripts/jquery.syntaxhighlighter.js",142,22] +["./scripts/jquery.syntaxhighlighter.js",142,24] +["./scripts/jquery.syntaxhighlighter.js",143,4] +["./scripts/jquery.syntaxhighlighter.js",143,28] +["./scripts/jquery.syntaxhighlighter.js",143,4,"apply"] +["./scripts/jquery.syntaxhighlighter.js",143,4,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",143,4,"$"] +["./scripts/jquery.syntaxhighlighter.js",143,29,"$"] +["./scripts/jquery.syntaxhighlighter.js",143,31] +["./scripts/jquery.syntaxhighlighter.js",143,32,"url"] +["./scripts/jquery.syntaxhighlighter.js",143,36,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",144,5] +["./scripts/jquery.syntaxhighlighter.js",146,3] +["./scripts/jquery.syntaxhighlighter.js",146,10,"$"] +["./scripts/jquery.syntaxhighlighter.js",150,2] +["./scripts/jquery.syntaxhighlighter.js",150,6,"id"] +["./scripts/jquery.syntaxhighlighter.js",150,11] +["./scripts/jquery.syntaxhighlighter.js",150,36] +["./scripts/jquery.syntaxhighlighter.js",150,25,"replace"] +["./scripts/jquery.syntaxhighlighter.js",150,25,"url"] +["./scripts/jquery.syntaxhighlighter.js",150,37] +["./scripts/jquery.syntaxhighlighter.js",150,54] +["./scripts/jquery.syntaxhighlighter.js",151,6,"$old"] +["./scripts/jquery.syntaxhighlighter.js",151,14] +["./scripts/jquery.syntaxhighlighter.js",151,13,"$"] +["./scripts/jquery.syntaxhighlighter.js",151,15] +["./scripts/jquery.syntaxhighlighter.js",151,19,"id"] +["./scripts/jquery.syntaxhighlighter.js",152,2] +["./scripts/jquery.syntaxhighlighter.js",152,7] +["./scripts/jquery.syntaxhighlighter.js",152,14,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",152,28] +["./scripts/jquery.syntaxhighlighter.js",153,3] +["./scripts/jquery.syntaxhighlighter.js",153,3,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",153,15] +["./scripts/jquery.syntaxhighlighter.js",157,2] +["./scripts/jquery.syntaxhighlighter.js",157,7,"length"] +["./scripts/jquery.syntaxhighlighter.js",157,7,"$old"] +["./scripts/jquery.syntaxhighlighter.js",157,23] +["./scripts/jquery.syntaxhighlighter.js",158,3] +["./scripts/jquery.syntaxhighlighter.js",158,8,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",159,4] +["./scripts/jquery.syntaxhighlighter.js",159,15] +["./scripts/jquery.syntaxhighlighter.js",159,4,"remove"] +["./scripts/jquery.syntaxhighlighter.js",159,4,"$old"] +["./scripts/jquery.syntaxhighlighter.js",163,4] +["./scripts/jquery.syntaxhighlighter.js",163,11,"$"] +["./scripts/jquery.syntaxhighlighter.js",168,6,"bodyEl"] +["./scripts/jquery.syntaxhighlighter.js",168,6,"bodyEl"] +["./scripts/jquery.syntaxhighlighter.js",168,15] +["./scripts/jquery.syntaxhighlighter.js",168,44] +["./scripts/jquery.syntaxhighlighter.js",168,15,"getElementsByTagName"] +["./scripts/jquery.syntaxhighlighter.js",168,15,"document"] +["./scripts/jquery.syntaxhighlighter.js",168,45] +["./scripts/jquery.syntaxhighlighter.js",168,45,"safari"] +["./scripts/jquery.syntaxhighlighter.js",168,45,"browser"] +["./scripts/jquery.syntaxhighlighter.js",168,45,"$"] +["./scripts/jquery.syntaxhighlighter.js",168,64] +["./scripts/jquery.syntaxhighlighter.js",168,73] +["./scripts/jquery.syntaxhighlighter.js",168,81] +["./scripts/jquery.syntaxhighlighter.js",169,2] +["./scripts/jquery.syntaxhighlighter.js",169,6,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",169,37] +["./scripts/jquery.syntaxhighlighter.js",169,15,"createElement"] +["./scripts/jquery.syntaxhighlighter.js",169,15,"document"] +["./scripts/jquery.syntaxhighlighter.js",169,38] +["./scripts/jquery.syntaxhighlighter.js",170,2] +["./scripts/jquery.syntaxhighlighter.js",170,2,"type"] +["./scripts/jquery.syntaxhighlighter.js",170,2,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",170,16] +["./scripts/jquery.syntaxhighlighter.js",171,2] +["./scripts/jquery.syntaxhighlighter.js",171,2,"rel"] +["./scripts/jquery.syntaxhighlighter.js",171,2,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",171,15] +["./scripts/jquery.syntaxhighlighter.js",172,2] +["./scripts/jquery.syntaxhighlighter.js",172,2,"media"] +["./scripts/jquery.syntaxhighlighter.js",172,2,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",172,17] +["./scripts/jquery.syntaxhighlighter.js",173,2] +["./scripts/jquery.syntaxhighlighter.js",173,2,"href"] +["./scripts/jquery.syntaxhighlighter.js",173,2,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",173,16,"url"] +["./scripts/jquery.syntaxhighlighter.js",174,2] +["./scripts/jquery.syntaxhighlighter.js",174,2,"id"] +["./scripts/jquery.syntaxhighlighter.js",174,2,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",174,14,"id"] +["./scripts/jquery.syntaxhighlighter.js",175,2] +["./scripts/jquery.syntaxhighlighter.js",175,20] +["./scripts/jquery.syntaxhighlighter.js",175,2,"appendChild"] +["./scripts/jquery.syntaxhighlighter.js",175,2,"bodyEl"] +["./scripts/jquery.syntaxhighlighter.js",175,21,"linkEl"] +["./scripts/jquery.syntaxhighlighter.js",178,2] +["./scripts/jquery.syntaxhighlighter.js",178,9,"$"] +["./scripts/jquery.syntaxhighlighter.js",191,1] +["./scripts/jquery.syntaxhighlighter.js",191,1,"appendScript"] +["./scripts/jquery.syntaxhighlighter.js",191,1,"$"] +["./scripts/jquery.syntaxhighlighter.js",191,18,"appendScript"] +["./scripts/jquery.syntaxhighlighter.js",191,18,"$"] +["./scripts/jquery.syntaxhighlighter.js",191,44] +["./scripts/jquery.syntaxhighlighter.js",191,44,""] +["./scripts/jquery.syntaxhighlighter.js",191,44] +["./scripts/jquery.syntaxhighlighter.js",191,45,"url"] +["./scripts/jquery.syntaxhighlighter.js",191,50,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",191,60] +["./scripts/jquery.syntaxhighlighter.js",193,2] +["./scripts/jquery.syntaxhighlighter.js",193,7] +["./scripts/jquery.syntaxhighlighter.js",193,9,"body"] +["./scripts/jquery.syntaxhighlighter.js",193,9,"document"] +["./scripts/jquery.syntaxhighlighter.js",193,24] +["./scripts/jquery.syntaxhighlighter.js",193,33] +["./scripts/jquery.syntaxhighlighter.js",194,3] +["./scripts/jquery.syntaxhighlighter.js",194,13] +["./scripts/jquery.syntaxhighlighter.js",194,3,"setTimeout"] +["./scripts/jquery.syntaxhighlighter.js",194,22] +["./scripts/jquery.syntaxhighlighter.js",194,22,""] +["./scripts/jquery.syntaxhighlighter.js",194,22] +["./scripts/jquery.syntaxhighlighter.js",194,24] +["./scripts/jquery.syntaxhighlighter.js",195,4] +["./scripts/jquery.syntaxhighlighter.js",195,24] +["./scripts/jquery.syntaxhighlighter.js",195,4,"apply"] +["./scripts/jquery.syntaxhighlighter.js",195,4,"appendScript"] +["./scripts/jquery.syntaxhighlighter.js",195,4,"$"] +["./scripts/jquery.syntaxhighlighter.js",195,25,"$"] +["./scripts/jquery.syntaxhighlighter.js",195,27] +["./scripts/jquery.syntaxhighlighter.js",195,28,"url"] +["./scripts/jquery.syntaxhighlighter.js",195,32,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",196,5] +["./scripts/jquery.syntaxhighlighter.js",198,3] +["./scripts/jquery.syntaxhighlighter.js",198,10,"$"] +["./scripts/jquery.syntaxhighlighter.js",202,2] +["./scripts/jquery.syntaxhighlighter.js",202,6,"id"] +["./scripts/jquery.syntaxhighlighter.js",202,11] +["./scripts/jquery.syntaxhighlighter.js",202,32] +["./scripts/jquery.syntaxhighlighter.js",202,21,"replace"] +["./scripts/jquery.syntaxhighlighter.js",202,21,"url"] +["./scripts/jquery.syntaxhighlighter.js",202,33] +["./scripts/jquery.syntaxhighlighter.js",202,50] +["./scripts/jquery.syntaxhighlighter.js",203,6,"$old"] +["./scripts/jquery.syntaxhighlighter.js",203,14] +["./scripts/jquery.syntaxhighlighter.js",203,13,"$"] +["./scripts/jquery.syntaxhighlighter.js",203,15] +["./scripts/jquery.syntaxhighlighter.js",203,19,"id"] +["./scripts/jquery.syntaxhighlighter.js",204,2] +["./scripts/jquery.syntaxhighlighter.js",204,7] +["./scripts/jquery.syntaxhighlighter.js",204,14,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",204,28] +["./scripts/jquery.syntaxhighlighter.js",205,3] +["./scripts/jquery.syntaxhighlighter.js",205,3,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",205,15] +["./scripts/jquery.syntaxhighlighter.js",209,2] +["./scripts/jquery.syntaxhighlighter.js",209,7,"length"] +["./scripts/jquery.syntaxhighlighter.js",209,7,"$old"] +["./scripts/jquery.syntaxhighlighter.js",209,23] +["./scripts/jquery.syntaxhighlighter.js",210,3] +["./scripts/jquery.syntaxhighlighter.js",210,8,"overwrite"] +["./scripts/jquery.syntaxhighlighter.js",211,4] +["./scripts/jquery.syntaxhighlighter.js",211,15] +["./scripts/jquery.syntaxhighlighter.js",211,4,"remove"] +["./scripts/jquery.syntaxhighlighter.js",211,4,"$old"] +["./scripts/jquery.syntaxhighlighter.js",215,4] +["./scripts/jquery.syntaxhighlighter.js",215,11,"$"] +["./scripts/jquery.syntaxhighlighter.js",220,6,"bodyEl"] +["./scripts/jquery.syntaxhighlighter.js",220,6,"bodyEl"] +["./scripts/jquery.syntaxhighlighter.js",220,15] +["./scripts/jquery.syntaxhighlighter.js",220,44] +["./scripts/jquery.syntaxhighlighter.js",220,15,"getElementsByTagName"] +["./scripts/jquery.syntaxhighlighter.js",220,15,"document"] +["./scripts/jquery.syntaxhighlighter.js",220,45] +["./scripts/jquery.syntaxhighlighter.js",220,45,"safari"] +["./scripts/jquery.syntaxhighlighter.js",220,45,"browser"] +["./scripts/jquery.syntaxhighlighter.js",220,45,"$"] +["./scripts/jquery.syntaxhighlighter.js",220,64] +["./scripts/jquery.syntaxhighlighter.js",220,73] +["./scripts/jquery.syntaxhighlighter.js",220,81] +["./scripts/jquery.syntaxhighlighter.js",221,2] +["./scripts/jquery.syntaxhighlighter.js",221,6,"scriptEl"] +["./scripts/jquery.syntaxhighlighter.js",221,39] +["./scripts/jquery.syntaxhighlighter.js",221,17,"createElement"] +["./scripts/jquery.syntaxhighlighter.js",221,17,"document"] +["./scripts/jquery.syntaxhighlighter.js",221,40] +["./scripts/jquery.syntaxhighlighter.js",222,2] +["./scripts/jquery.syntaxhighlighter.js",222,2,"type"] +["./scripts/jquery.syntaxhighlighter.js",222,2,"scriptEl"] +["./scripts/jquery.syntaxhighlighter.js",222,18] +["./scripts/jquery.syntaxhighlighter.js",223,2] +["./scripts/jquery.syntaxhighlighter.js",223,2,"src"] +["./scripts/jquery.syntaxhighlighter.js",223,2,"scriptEl"] +["./scripts/jquery.syntaxhighlighter.js",223,17,"url"] +["./scripts/jquery.syntaxhighlighter.js",224,2] +["./scripts/jquery.syntaxhighlighter.js",224,2,"id"] +["./scripts/jquery.syntaxhighlighter.js",224,2,"scriptEl"] +["./scripts/jquery.syntaxhighlighter.js",224,16,"id"] +["./scripts/jquery.syntaxhighlighter.js",225,2] +["./scripts/jquery.syntaxhighlighter.js",225,20] +["./scripts/jquery.syntaxhighlighter.js",225,2,"appendChild"] +["./scripts/jquery.syntaxhighlighter.js",225,2,"bodyEl"] +["./scripts/jquery.syntaxhighlighter.js",225,21,"scriptEl"] +["./scripts/jquery.syntaxhighlighter.js",228,2] +["./scripts/jquery.syntaxhighlighter.js",228,9,"$"] +["./scripts/jquery.syntaxhighlighter.js",232,3,"jQuery"] +["./scripts/jquery.syntaxhighlighter.js",242,1] +["./scripts/jquery.syntaxhighlighter.js",619,2] +["./scripts/jquery.syntaxhighlighter.js",242,9] +["./scripts/jquery.syntaxhighlighter.js",242,9,""] +["./scripts/jquery.syntaxhighlighter.js",242,9] +["./scripts/jquery.syntaxhighlighter.js",242,10,"$"] +["./scripts/jquery.syntaxhighlighter.js",242,12] +["./scripts/jquery.syntaxhighlighter.js",253,1] +["./scripts/jquery.syntaxhighlighter.js",253,1,"findAndSelf"] +["./scripts/jquery.syntaxhighlighter.js",253,1,"fn"] +["./scripts/jquery.syntaxhighlighter.js",253,1,"$"] +["./scripts/jquery.syntaxhighlighter.js",253,20,"findAndSelf"] +["./scripts/jquery.syntaxhighlighter.js",253,20,"fn"] +["./scripts/jquery.syntaxhighlighter.js",253,20,"$"] +["./scripts/jquery.syntaxhighlighter.js",253,48] +["./scripts/jquery.syntaxhighlighter.js",253,48,""] +["./scripts/jquery.syntaxhighlighter.js",253,48] +["./scripts/jquery.syntaxhighlighter.js",253,49,"selector"] +["./scripts/jquery.syntaxhighlighter.js",253,58] +["./scripts/jquery.syntaxhighlighter.js",255,2] +["./scripts/jquery.syntaxhighlighter.js",255,46] +["./scripts/jquery.syntaxhighlighter.js",255,9,"filter"] +["./scripts/jquery.syntaxhighlighter.js",255,37] +["./scripts/jquery.syntaxhighlighter.js",255,9,"andSelf"] +["./scripts/jquery.syntaxhighlighter.js",255,19] +["./scripts/jquery.syntaxhighlighter.js",255,9,"find"] +["./scripts/jquery.syntaxhighlighter.js",254,15,"$this"] +["./scripts/jquery.syntaxhighlighter.js",254,14,"$"] +["./scripts/jquery.syntaxhighlighter.js",254,16] +["./scripts/jquery.syntaxhighlighter.js",255,20,"selector"] +["./scripts/jquery.syntaxhighlighter.js",255,47,"selector"] +["./scripts/jquery.syntaxhighlighter.js",269,1] +["./scripts/jquery.syntaxhighlighter.js",269,1,"replace"] +["./scripts/jquery.syntaxhighlighter.js",269,1,"prototype"] +["./scripts/jquery.syntaxhighlighter.js",269,1,"Number"] +["./scripts/jquery.syntaxhighlighter.js",269,28,"replace"] +["./scripts/jquery.syntaxhighlighter.js",269,28,"prototype"] +["./scripts/jquery.syntaxhighlighter.js",269,28,"Number"] +["./scripts/jquery.syntaxhighlighter.js",269,64] +["./scripts/jquery.syntaxhighlighter.js",269,64,""] +["./scripts/jquery.syntaxhighlighter.js",269,64] +["./scripts/jquery.syntaxhighlighter.js",269,66] +["./scripts/jquery.syntaxhighlighter.js",271,2] +["./scripts/jquery.syntaxhighlighter.js",271,26] +["./scripts/jquery.syntaxhighlighter.js",271,9,"apply"] +["./scripts/jquery.syntaxhighlighter.js",271,9,"replace"] +["./scripts/jquery.syntaxhighlighter.js",270,18,"str"] +["./scripts/jquery.syntaxhighlighter.js",270,12,"String"] +["./scripts/jquery.syntaxhighlighter.js",270,19] +["./scripts/jquery.syntaxhighlighter.js",271,27] +["./scripts/jquery.syntaxhighlighter.js",271,32,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",284,1] +["./scripts/jquery.syntaxhighlighter.js",284,8,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",284,8,"$"] +["./scripts/jquery.syntaxhighlighter.js",616,2] +["./scripts/jquery.syntaxhighlighter.js",616,21] +["./scripts/jquery.syntaxhighlighter.js",616,2,"warn"] +["./scripts/jquery.syntaxhighlighter.js",616,2,"console"] +["./scripts/jquery.syntaxhighlighter.js",616,2,"window"] +["./scripts/jquery.syntaxhighlighter.js",616,22] +["./scripts/jquery.syntaxhighlighter.js",285,2] +["./scripts/jquery.syntaxhighlighter.js",285,2,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",285,2,"$"] +["./scripts/jquery.syntaxhighlighter.js",285,24] +["./scripts/jquery.syntaxhighlighter.js",287,13] +["./scripts/jquery.syntaxhighlighter.js",291,12] +["./scripts/jquery.syntaxhighlighter.js",296,17] +["./scripts/jquery.syntaxhighlighter.js",301,13] +["./scripts/jquery.syntaxhighlighter.js",306,17] +["./scripts/jquery.syntaxhighlighter.js",311,19] +["./scripts/jquery.syntaxhighlighter.js",316,34] +["./scripts/jquery.syntaxhighlighter.js",321,30] +["./scripts/jquery.syntaxhighlighter.js",326,22] +["./scripts/jquery.syntaxhighlighter.js",331,24] +["./scripts/jquery.syntaxhighlighter.js",336,13] +["./scripts/jquery.syntaxhighlighter.js",341,14] +["./scripts/jquery.syntaxhighlighter.js",341,15] +["./scripts/jquery.syntaxhighlighter.js",346,27] +["./scripts/jquery.syntaxhighlighter.js",352,94] +["./scripts/jquery.syntaxhighlighter.js",358,77] +["./scripts/jquery.syntaxhighlighter.js",362,17] +["./scripts/jquery.syntaxhighlighter.js",362,17,""] +["./scripts/jquery.syntaxhighlighter.js",362,17] +["./scripts/jquery.syntaxhighlighter.js",362,18,"options"] +["./scripts/jquery.syntaxhighlighter.js",362,26] +["./scripts/jquery.syntaxhighlighter.js",364,4] +["./scripts/jquery.syntaxhighlighter.js",365,5,"config"] +["./scripts/jquery.syntaxhighlighter.js",365,14,"config"] +["./scripts/jquery.syntaxhighlighter.js",364,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",368,8,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",368,18,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",368,18,"config"] +["./scripts/jquery.syntaxhighlighter.js",369,4] +["./scripts/jquery.syntaxhighlighter.js",369,9] +["./scripts/jquery.syntaxhighlighter.js",369,9,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",369,17,"length"] +["./scripts/jquery.syntaxhighlighter.js",369,17,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",369,32] +["./scripts/jquery.syntaxhighlighter.js",369,39] +["./scripts/jquery.syntaxhighlighter.js",370,5] +["./scripts/jquery.syntaxhighlighter.js",370,5,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",370,5,"config"] +["./scripts/jquery.syntaxhighlighter.js",370,36] +["./scripts/jquery.syntaxhighlighter.js",370,22,"substr"] +["./scripts/jquery.syntaxhighlighter.js",370,22,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",370,37] +["./scripts/jquery.syntaxhighlighter.js",370,39,"length"] +["./scripts/jquery.syntaxhighlighter.js",370,39,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",370,54] +["./scripts/jquery.syntaxhighlighter.js",372,4] +["./scripts/jquery.syntaxhighlighter.js",372,4] +["./scripts/jquery.syntaxhighlighter.js",372,11,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",375,4] +["./scripts/jquery.syntaxhighlighter.js",375,12] +["./scripts/jquery.syntaxhighlighter.js",375,4,"extend"] +["./scripts/jquery.syntaxhighlighter.js",375,4,"$"] +["./scripts/jquery.syntaxhighlighter.js",375,13] +["./scripts/jquery.syntaxhighlighter.js",375,19,"config"] +["./scripts/jquery.syntaxhighlighter.js",364,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",375,45,"options"] +["./scripts/jquery.syntaxhighlighter.js",375,54] +["./scripts/jquery.syntaxhighlighter.js",378,4] +["./scripts/jquery.syntaxhighlighter.js",378,9,"Sparkle"] +["./scripts/jquery.syntaxhighlighter.js",378,9,"$"] +["./scripts/jquery.syntaxhighlighter.js",380,27] +["./scripts/jquery.syntaxhighlighter.js",380,5,"addExtension"] +["./scripts/jquery.syntaxhighlighter.js",380,5,"Sparkle"] +["./scripts/jquery.syntaxhighlighter.js",380,5,"$"] +["./scripts/jquery.syntaxhighlighter.js",380,28] +["./scripts/jquery.syntaxhighlighter.js",380,57] +["./scripts/jquery.syntaxhighlighter.js",380,57,""] +["./scripts/jquery.syntaxhighlighter.js",380,57] +["./scripts/jquery.syntaxhighlighter.js",380,59] +["./scripts/jquery.syntaxhighlighter.js",381,6] +["./scripts/jquery.syntaxhighlighter.js",381,29] +["./scripts/jquery.syntaxhighlighter.js",381,6,"syntaxHighlight"] +["./scripts/jquery.syntaxhighlighter.js",381,7] +["./scripts/jquery.syntaxhighlighter.js",381,6,"$"] +["./scripts/jquery.syntaxhighlighter.js",381,8] +["./scripts/jquery.syntaxhighlighter.js",386,4] +["./scripts/jquery.syntaxhighlighter.js",386,4,"syntaxHighlight"] +["./scripts/jquery.syntaxhighlighter.js",386,4,"fn"] +["./scripts/jquery.syntaxhighlighter.js",386,4,"$"] +["./scripts/jquery.syntaxhighlighter.js",386,27,"SyntaxHighlight"] +["./scripts/jquery.syntaxhighlighter.js",386,27,"fn"] +["./scripts/jquery.syntaxhighlighter.js",386,27,"$"] +["./scripts/jquery.syntaxhighlighter.js",386,50,"fn"] +["./scripts/jquery.syntaxhighlighter.js",364,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",389,4] +["./scripts/jquery.syntaxhighlighter.js",389,9,"load"] +["./scripts/jquery.syntaxhighlighter.js",389,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",389,45] +["./scripts/jquery.syntaxhighlighter.js",389,23,"load"] +["./scripts/jquery.syntaxhighlighter.js",364,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",392,4] +["./scripts/jquery.syntaxhighlighter.js",392,9,"highlight"] +["./scripts/jquery.syntaxhighlighter.js",392,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",392,55] +["./scripts/jquery.syntaxhighlighter.js",392,28,"highlight"] +["./scripts/jquery.syntaxhighlighter.js",364,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",395,4] +["./scripts/jquery.syntaxhighlighter.js",395,11] +["./scripts/jquery.syntaxhighlighter.js",399,17] +["./scripts/jquery.syntaxhighlighter.js",399,17,""] +["./scripts/jquery.syntaxhighlighter.js",399,17] +["./scripts/jquery.syntaxhighlighter.js",399,19] +["./scripts/jquery.syntaxhighlighter.js",402,5,"config"] +["./scripts/jquery.syntaxhighlighter.js",402,14,"config"] +["./scripts/jquery.syntaxhighlighter.js",401,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",403,5,"prettifyBaseUrl"] +["./scripts/jquery.syntaxhighlighter.js",403,23,"prettifyBaseUrl"] +["./scripts/jquery.syntaxhighlighter.js",403,23,"config"] +["./scripts/jquery.syntaxhighlighter.js",404,5,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",404,15,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",404,15,"config"] +["./scripts/jquery.syntaxhighlighter.js",405,5,"themes"] +["./scripts/jquery.syntaxhighlighter.js",405,5,"themes"] +["./scripts/jquery.syntaxhighlighter.js",405,14,"themes"] +["./scripts/jquery.syntaxhighlighter.js",405,14,"config"] +["./scripts/jquery.syntaxhighlighter.js",408,4] +["./scripts/jquery.syntaxhighlighter.js",408,9] +["./scripts/jquery.syntaxhighlighter.js",408,34] +["./scripts/jquery.syntaxhighlighter.js",408,10,"loaded"] +["./scripts/jquery.syntaxhighlighter.js",401,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",408,39] +["./scripts/jquery.syntaxhighlighter.js",409,5] +["./scripts/jquery.syntaxhighlighter.js",409,19] +["./scripts/jquery.syntaxhighlighter.js",409,5,"appendScript"] +["./scripts/jquery.syntaxhighlighter.js",409,5,"$"] +["./scripts/jquery.syntaxhighlighter.js",409,20,"prettifyBaseUrl"] +["./scripts/jquery.syntaxhighlighter.js",409,36] +["./scripts/jquery.syntaxhighlighter.js",410,5] +["./scripts/jquery.syntaxhighlighter.js",410,23] +["./scripts/jquery.syntaxhighlighter.js",410,5,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",410,5,"$"] +["./scripts/jquery.syntaxhighlighter.js",410,24,"prettifyBaseUrl"] +["./scripts/jquery.syntaxhighlighter.js",410,40] +["./scripts/jquery.syntaxhighlighter.js",411,5] +["./scripts/jquery.syntaxhighlighter.js",411,23] +["./scripts/jquery.syntaxhighlighter.js",411,5,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",411,5,"$"] +["./scripts/jquery.syntaxhighlighter.js",411,24,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",411,32] +["./scripts/jquery.syntaxhighlighter.js",412,5] +["./scripts/jquery.syntaxhighlighter.js",412,11] +["./scripts/jquery.syntaxhighlighter.js",412,5,"each"] +["./scripts/jquery.syntaxhighlighter.js",412,5,"$"] +["./scripts/jquery.syntaxhighlighter.js",412,12,"themes"] +["./scripts/jquery.syntaxhighlighter.js",412,27] +["./scripts/jquery.syntaxhighlighter.js",412,27,""] +["./scripts/jquery.syntaxhighlighter.js",412,27] +["./scripts/jquery.syntaxhighlighter.js",412,28,"i"] +["./scripts/jquery.syntaxhighlighter.js",412,30,"theme"] +["./scripts/jquery.syntaxhighlighter.js",412,36] +["./scripts/jquery.syntaxhighlighter.js",413,6] +["./scripts/jquery.syntaxhighlighter.js",413,24] +["./scripts/jquery.syntaxhighlighter.js",413,6,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",413,6,"$"] +["./scripts/jquery.syntaxhighlighter.js",413,25,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",413,33] +["./scripts/jquery.syntaxhighlighter.js",413,50,"theme"] +["./scripts/jquery.syntaxhighlighter.js",413,56] +["./scripts/jquery.syntaxhighlighter.js",415,5] +["./scripts/jquery.syntaxhighlighter.js",415,10,"msie"] +["./scripts/jquery.syntaxhighlighter.js",415,10,"browser"] +["./scripts/jquery.syntaxhighlighter.js",415,10,"$"] +["./scripts/jquery.syntaxhighlighter.js",416,24] +["./scripts/jquery.syntaxhighlighter.js",416,6,"appendStylesheet"] +["./scripts/jquery.syntaxhighlighter.js",416,6,"$"] +["./scripts/jquery.syntaxhighlighter.js",416,25,"baseUrl"] +["./scripts/jquery.syntaxhighlighter.js",416,33] +["./scripts/jquery.syntaxhighlighter.js",418,5] +["./scripts/jquery.syntaxhighlighter.js",418,5,"loadedExtras"] +["./scripts/jquery.syntaxhighlighter.js",401,28,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",418,38] +["./scripts/jquery.syntaxhighlighter.js",422,4] +["./scripts/jquery.syntaxhighlighter.js",422,11] +["./scripts/jquery.syntaxhighlighter.js",426,17] +["./scripts/jquery.syntaxhighlighter.js",429,19] +["./scripts/jquery.syntaxhighlighter.js",429,19,""] +["./scripts/jquery.syntaxhighlighter.js",429,19] +["./scripts/jquery.syntaxhighlighter.js",429,21] +["./scripts/jquery.syntaxhighlighter.js",430,4] +["./scripts/jquery.syntaxhighlighter.js",430,11] +["./scripts/jquery.syntaxhighlighter.js",430,18,"prettyPrint"] +["./scripts/jquery.syntaxhighlighter.js",430,34] +["./scripts/jquery.syntaxhighlighter.js",430,49,"loadedExtras"] +["./scripts/jquery.syntaxhighlighter.js",430,49] +["./scripts/jquery.syntaxhighlighter.js",434,30] +["./scripts/jquery.syntaxhighlighter.js",434,30,""] +["./scripts/jquery.syntaxhighlighter.js",434,30] +["./scripts/jquery.syntaxhighlighter.js",434,31,"css"] +["./scripts/jquery.syntaxhighlighter.js",434,35] +["./scripts/jquery.syntaxhighlighter.js",441,4] +["./scripts/jquery.syntaxhighlighter.js",441,4] +["./scripts/jquery.syntaxhighlighter.js",436,8,"language"] +["./scripts/jquery.syntaxhighlighter.js",436,19] +["./scripts/jquery.syntaxhighlighter.js",437,5,"regex"] +["./scripts/jquery.syntaxhighlighter.js",437,13] +["./scripts/jquery.syntaxhighlighter.js",438,5,"match"] +["./scripts/jquery.syntaxhighlighter.js",438,23] +["./scripts/jquery.syntaxhighlighter.js",438,13,"exec"] +["./scripts/jquery.syntaxhighlighter.js",438,13,"regex"] +["./scripts/jquery.syntaxhighlighter.js",438,24,"css"] +["./scripts/jquery.syntaxhighlighter.js",441,12,"match"] +["./scripts/jquery.syntaxhighlighter.js",441,22] +["./scripts/jquery.syntaxhighlighter.js",441,4] +["./scripts/jquery.syntaxhighlighter.js",441,29] +["./scripts/jquery.syntaxhighlighter.js",442,5] +["./scripts/jquery.syntaxhighlighter.js",442,5,"language"] +["./scripts/jquery.syntaxhighlighter.js",442,16] +["./scripts/jquery.syntaxhighlighter.js",442,16,"match"] +["./scripts/jquery.syntaxhighlighter.js",442,22] +["./scripts/jquery.syntaxhighlighter.js",443,5] +["./scripts/jquery.syntaxhighlighter.js",443,5,"match"] +["./scripts/jquery.syntaxhighlighter.js",443,23] +["./scripts/jquery.syntaxhighlighter.js",443,13,"exec"] +["./scripts/jquery.syntaxhighlighter.js",443,13,"regex"] +["./scripts/jquery.syntaxhighlighter.js",443,24,"css"] +["./scripts/jquery.syntaxhighlighter.js",447,4] +["./scripts/jquery.syntaxhighlighter.js",447,11,"language"] +["./scripts/jquery.syntaxhighlighter.js",451,15] +["./scripts/jquery.syntaxhighlighter.js",451,15,""] +["./scripts/jquery.syntaxhighlighter.js",451,15] +["./scripts/jquery.syntaxhighlighter.js",451,17] +["./scripts/jquery.syntaxhighlighter.js",453,4] +["./scripts/jquery.syntaxhighlighter.js",455,5,"$el"] +["./scripts/jquery.syntaxhighlighter.js",455,12] +["./scripts/jquery.syntaxhighlighter.js",455,11,"$"] +["./scripts/jquery.syntaxhighlighter.js",455,13] +["./scripts/jquery.syntaxhighlighter.js",458,4] +["./scripts/jquery.syntaxhighlighter.js",458,33] +["./scripts/jquery.syntaxhighlighter.js",458,4,"highlight"] +["./scripts/jquery.syntaxhighlighter.js",458,4,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",458,4,"$"] +["./scripts/jquery.syntaxhighlighter.js",458,34] +["./scripts/jquery.syntaxhighlighter.js",459,11,"$el"] +["./scripts/jquery.syntaxhighlighter.js",463,4] +["./scripts/jquery.syntaxhighlighter.js",463,11] +["./scripts/jquery.syntaxhighlighter.js",467,22] +["./scripts/jquery.syntaxhighlighter.js",467,22,""] +["./scripts/jquery.syntaxhighlighter.js",467,22] +["./scripts/jquery.syntaxhighlighter.js",467,23,"params"] +["./scripts/jquery.syntaxhighlighter.js",467,30] +["./scripts/jquery.syntaxhighlighter.js",469,4] +["./scripts/jquery.syntaxhighlighter.js",469,9] +["./scripts/jquery.syntaxhighlighter.js",469,16,"params"] +["./scripts/jquery.syntaxhighlighter.js",469,27] +["./scripts/jquery.syntaxhighlighter.js",470,5] +["./scripts/jquery.syntaxhighlighter.js",470,5,"params"] +["./scripts/jquery.syntaxhighlighter.js",470,14] +["./scripts/jquery.syntaxhighlighter.js",472,8,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",472,28] +["./scripts/jquery.syntaxhighlighter.js",473,5,"config"] +["./scripts/jquery.syntaxhighlighter.js",473,14,"config"] +["./scripts/jquery.syntaxhighlighter.js",473,14,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",474,5,"$el"] +["./scripts/jquery.syntaxhighlighter.js",474,11,"el"] +["./scripts/jquery.syntaxhighlighter.js",474,11,"params"] +["./scripts/jquery.syntaxhighlighter.js",474,22] +["./scripts/jquery.syntaxhighlighter.js",477,4] +["./scripts/jquery.syntaxhighlighter.js",477,11,"$el"] +["./scripts/jquery.syntaxhighlighter.js",477,26,"jQuery"] +["./scripts/jquery.syntaxhighlighter.js",478,5,"$el"] +["./scripts/jquery.syntaxhighlighter.js",478,12] +["./scripts/jquery.syntaxhighlighter.js",478,11,"$"] +["./scripts/jquery.syntaxhighlighter.js",478,13] +["./scripts/jquery.syntaxhighlighter.js",482,4] +["./scripts/jquery.syntaxhighlighter.js",482,34] +["./scripts/jquery.syntaxhighlighter.js",482,10,"loaded"] +["./scripts/jquery.syntaxhighlighter.js",482,10,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",482,4] +["./scripts/jquery.syntaxhighlighter.js",491,8,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",491,27,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",491,27,"config"] +["./scripts/jquery.syntaxhighlighter.js",492,5,"defaultSelector"] +["./scripts/jquery.syntaxhighlighter.js",492,23] +["./scripts/jquery.syntaxhighlighter.js",493,4] +["./scripts/jquery.syntaxhighlighter.js",493,9] +["./scripts/jquery.syntaxhighlighter.js",493,16,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",493,37] +["./scripts/jquery.syntaxhighlighter.js",493,47] +["./scripts/jquery.syntaxhighlighter.js",494,5] +["./scripts/jquery.syntaxhighlighter.js",494,5,"defaultSelector"] +["./scripts/jquery.syntaxhighlighter.js",494,23] +["./scripts/jquery.syntaxhighlighter.js",494,48] +["./scripts/jquery.syntaxhighlighter.js",494,27,"join"] +["./scripts/jquery.syntaxhighlighter.js",494,27,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",494,49] +["./scripts/jquery.syntaxhighlighter.js",495,5] +["./scripts/jquery.syntaxhighlighter.js",495,5,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",495,45] +["./scripts/jquery.syntaxhighlighter.js",495,24,"join"] +["./scripts/jquery.syntaxhighlighter.js",495,24,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",495,46] +["./scripts/jquery.syntaxhighlighter.js",497,9] +["./scripts/jquery.syntaxhighlighter.js",498,5] +["./scripts/jquery.syntaxhighlighter.js",498,5,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",498,30] +["./scripts/jquery.syntaxhighlighter.js",498,24,"String"] +["./scripts/jquery.syntaxhighlighter.js",498,31,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",499,5] +["./scripts/jquery.syntaxhighlighter.js",499,5,"defaultSelector"] +["./scripts/jquery.syntaxhighlighter.js",499,23] +["./scripts/jquery.syntaxhighlighter.js",499,51] +["./scripts/jquery.syntaxhighlighter.js",499,27,"replace"] +["./scripts/jquery.syntaxhighlighter.js",499,27,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",499,52] +["./scripts/jquery.syntaxhighlighter.js",499,56] +["./scripts/jquery.syntaxhighlighter.js",503,4] +["./scripts/jquery.syntaxhighlighter.js",503,9,"defaultSelector"] +["./scripts/jquery.syntaxhighlighter.js",503,29] +["./scripts/jquery.syntaxhighlighter.js",503,36] +["./scripts/jquery.syntaxhighlighter.js",503,37,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",503,56] +["./scripts/jquery.syntaxhighlighter.js",504,5] +["./scripts/jquery.syntaxhighlighter.js",504,25] +["./scripts/jquery.syntaxhighlighter.js",504,5,"error"] +["./scripts/jquery.syntaxhighlighter.js",504,5,"console"] +["./scripts/jquery.syntaxhighlighter.js",504,5,"window"] +["./scripts/jquery.syntaxhighlighter.js",504,26] +["./scripts/jquery.syntaxhighlighter.js",504,84] +["./scripts/jquery.syntaxhighlighter.js",504,85] +["./scripts/jquery.syntaxhighlighter.js",504,90,"arguments"] +["./scripts/jquery.syntaxhighlighter.js",504,102] +["./scripts/jquery.syntaxhighlighter.js",504,103,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",504,103,"config"] +["./scripts/jquery.syntaxhighlighter.js",505,5] +["./scripts/jquery.syntaxhighlighter.js",505,25] +["./scripts/jquery.syntaxhighlighter.js",505,5,"trace"] +["./scripts/jquery.syntaxhighlighter.js",505,5,"console"] +["./scripts/jquery.syntaxhighlighter.js",505,5,"window"] +["./scripts/jquery.syntaxhighlighter.js",509,8,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",509,8,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",509,92] +["./scripts/jquery.syntaxhighlighter.js",509,17,"filter"] +["./scripts/jquery.syntaxhighlighter.js",509,51] +["./scripts/jquery.syntaxhighlighter.js",509,17,"filter"] +["./scripts/jquery.syntaxhighlighter.js",509,32] +["./scripts/jquery.syntaxhighlighter.js",509,17,"findAndSelf"] +["./scripts/jquery.syntaxhighlighter.js",509,17,"$el"] +["./scripts/jquery.syntaxhighlighter.js",509,33] +["./scripts/jquery.syntaxhighlighter.js",509,52] +["./scripts/jquery.syntaxhighlighter.js",509,69,"defaultSelector"] +["./scripts/jquery.syntaxhighlighter.js",509,93] +["./scripts/jquery.syntaxhighlighter.js",516,4] +["./scripts/jquery.syntaxhighlighter.js",516,53] +["./scripts/jquery.syntaxhighlighter.js",516,4,"each"] +["./scripts/jquery.syntaxhighlighter.js",516,15] +["./scripts/jquery.syntaxhighlighter.js",516,4,"addClass"] +["./scripts/jquery.syntaxhighlighter.js",512,14] +["./scripts/jquery.syntaxhighlighter.js",512,4,"css"] +["./scripts/jquery.syntaxhighlighter.js",512,4,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",512,15] +["./scripts/jquery.syntaxhighlighter.js",513,5] +["./scripts/jquery.syntaxhighlighter.js",513,19] +["./scripts/jquery.syntaxhighlighter.js",514,5] +["./scripts/jquery.syntaxhighlighter.js",514,19] +["./scripts/jquery.syntaxhighlighter.js",515,5] +["./scripts/jquery.syntaxhighlighter.js",515,20] +["./scripts/jquery.syntaxhighlighter.js",516,16] +["./scripts/jquery.syntaxhighlighter.js",516,31,"defaultClassname"] +["./scripts/jquery.syntaxhighlighter.js",516,62] +["./scripts/jquery.syntaxhighlighter.js",516,62,""] +["./scripts/jquery.syntaxhighlighter.js",516,62] +["./scripts/jquery.syntaxhighlighter.js",516,64] +["./scripts/jquery.syntaxhighlighter.js",518,9,"$code"] +["./scripts/jquery.syntaxhighlighter.js",518,18] +["./scripts/jquery.syntaxhighlighter.js",518,17,"$"] +["./scripts/jquery.syntaxhighlighter.js",518,19] +["./scripts/jquery.syntaxhighlighter.js",519,6,"css"] +["./scripts/jquery.syntaxhighlighter.js",519,22] +["./scripts/jquery.syntaxhighlighter.js",519,12,"attr"] +["./scripts/jquery.syntaxhighlighter.js",519,12,"$code"] +["./scripts/jquery.syntaxhighlighter.js",519,23] +["./scripts/jquery.syntaxhighlighter.js",520,6,"language"] +["./scripts/jquery.syntaxhighlighter.js",520,6,"language"] +["./scripts/jquery.syntaxhighlighter.js",520,52] +["./scripts/jquery.syntaxhighlighter.js",520,17,"determineLanguage"] +["./scripts/jquery.syntaxhighlighter.js",520,17,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",520,53,"css"] +["./scripts/jquery.syntaxhighlighter.js",523,5] +["./scripts/jquery.syntaxhighlighter.js",523,19] +["./scripts/jquery.syntaxhighlighter.js",523,5,"addClass"] +["./scripts/jquery.syntaxhighlighter.js",523,5,"$code"] +["./scripts/jquery.syntaxhighlighter.js",523,20] +["./scripts/jquery.syntaxhighlighter.js",523,28,"language"] +["./scripts/jquery.syntaxhighlighter.js",527,4] +["./scripts/jquery.syntaxhighlighter.js",527,9,"lineNumbers"] +["./scripts/jquery.syntaxhighlighter.js",527,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",528,20] +["./scripts/jquery.syntaxhighlighter.js",528,5,"addClass"] +["./scripts/jquery.syntaxhighlighter.js",528,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",528,21] +["./scripts/jquery.syntaxhighlighter.js",532,4] +["./scripts/jquery.syntaxhighlighter.js",532,9,"theme"] +["./scripts/jquery.syntaxhighlighter.js",532,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",533,20] +["./scripts/jquery.syntaxhighlighter.js",533,5,"addClass"] +["./scripts/jquery.syntaxhighlighter.js",533,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",533,21] +["./scripts/jquery.syntaxhighlighter.js",533,30,"theme"] +["./scripts/jquery.syntaxhighlighter.js",533,30,"config"] +["./scripts/jquery.syntaxhighlighter.js",537,4] +["./scripts/jquery.syntaxhighlighter.js",537,9,"alternateLines"] +["./scripts/jquery.syntaxhighlighter.js",537,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",538,20] +["./scripts/jquery.syntaxhighlighter.js",538,5,"addClass"] +["./scripts/jquery.syntaxhighlighter.js",538,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",538,21] +["./scripts/jquery.syntaxhighlighter.js",542,4] +["./scripts/jquery.syntaxhighlighter.js",542,15] +["./scripts/jquery.syntaxhighlighter.js",542,4,"prettyPrint"] +["./scripts/jquery.syntaxhighlighter.js",546,4] +["./scripts/jquery.syntaxhighlighter.js",546,9,"stripEmptyStartFinishLines"] +["./scripts/jquery.syntaxhighlighter.js",546,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",547,84] +["./scripts/jquery.syntaxhighlighter.js",547,5,"each"] +["./scripts/jquery.syntaxhighlighter.js",547,16] +["./scripts/jquery.syntaxhighlighter.js",547,5,"find"] +["./scripts/jquery.syntaxhighlighter.js",547,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",547,17] +["./scripts/jquery.syntaxhighlighter.js",547,93] +["./scripts/jquery.syntaxhighlighter.js",547,93,""] +["./scripts/jquery.syntaxhighlighter.js",547,93] +["./scripts/jquery.syntaxhighlighter.js",547,95] +["./scripts/jquery.syntaxhighlighter.js",549,10,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",549,26] +["./scripts/jquery.syntaxhighlighter.js",549,25,"$"] +["./scripts/jquery.syntaxhighlighter.js",549,27] +["./scripts/jquery.syntaxhighlighter.js",551,7,"empty"] +["./scripts/jquery.syntaxhighlighter.js",551,45] +["./scripts/jquery.syntaxhighlighter.js",551,15,"test"] +["./scripts/jquery.syntaxhighlighter.js",551,15] +["./scripts/jquery.syntaxhighlighter.js",550,31,"html"] +["./scripts/jquery.syntaxhighlighter.js",550,14,"html"] +["./scripts/jquery.syntaxhighlighter.js",550,14,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",552,7,"$parent"] +["./scripts/jquery.syntaxhighlighter.js",552,36] +["./scripts/jquery.syntaxhighlighter.js",552,17,"parent"] +["./scripts/jquery.syntaxhighlighter.js",552,17,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",553,7,"$siblings"] +["./scripts/jquery.syntaxhighlighter.js",553,7,"$siblings"] +["./scripts/jquery.syntaxhighlighter.js",553,40] +["./scripts/jquery.syntaxhighlighter.js",553,19,"siblings"] +["./scripts/jquery.syntaxhighlighter.js",553,19,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",556,6] +["./scripts/jquery.syntaxhighlighter.js",556,11,"empty"] +["./scripts/jquery.syntaxhighlighter.js",556,21,"length"] +["./scripts/jquery.syntaxhighlighter.js",556,21,"$siblings"] +["./scripts/jquery.syntaxhighlighter.js",556,42] +["./scripts/jquery.syntaxhighlighter.js",556,48,"length"] +["./scripts/jquery.syntaxhighlighter.js",556,48,"$siblings"] +["./scripts/jquery.syntaxhighlighter.js",556,69] +["./scripts/jquery.syntaxhighlighter.js",556,102] +["./scripts/jquery.syntaxhighlighter.js",556,74,"is"] +["./scripts/jquery.syntaxhighlighter.js",556,90] +["./scripts/jquery.syntaxhighlighter.js",556,74,"filter"] +["./scripts/jquery.syntaxhighlighter.js",556,74,"$siblings"] +["./scripts/jquery.syntaxhighlighter.js",556,91] +["./scripts/jquery.syntaxhighlighter.js",556,103] +["./scripts/jquery.syntaxhighlighter.js",556,113] +["./scripts/jquery.syntaxhighlighter.js",558,11,"$parent"] +["./scripts/jquery.syntaxhighlighter.js",558,40] +["./scripts/jquery.syntaxhighlighter.js",558,21,"parent"] +["./scripts/jquery.syntaxhighlighter.js",558,21,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",559,8,"value"] +["./scripts/jquery.syntaxhighlighter.js",559,8,"value"] +["./scripts/jquery.syntaxhighlighter.js",559,27] +["./scripts/jquery.syntaxhighlighter.js",559,16,"val"] +["./scripts/jquery.syntaxhighlighter.js",559,16,"$parent"] +["./scripts/jquery.syntaxhighlighter.js",560,7] +["./scripts/jquery.syntaxhighlighter.js",560,25] +["./scripts/jquery.syntaxhighlighter.js",560,7,"val"] +["./scripts/jquery.syntaxhighlighter.js",560,19] +["./scripts/jquery.syntaxhighlighter.js",560,7,"next"] +["./scripts/jquery.syntaxhighlighter.js",560,7,"$parent"] +["./scripts/jquery.syntaxhighlighter.js",560,26,"value"] +["./scripts/jquery.syntaxhighlighter.js",561,7] +["./scripts/jquery.syntaxhighlighter.js",561,21] +["./scripts/jquery.syntaxhighlighter.js",561,7,"remove"] +["./scripts/jquery.syntaxhighlighter.js",561,7,"$parent"] +["./scripts/jquery.syntaxhighlighter.js",568,4] +["./scripts/jquery.syntaxhighlighter.js",568,9,"stripInitialWhitespace"] +["./scripts/jquery.syntaxhighlighter.js",568,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",569,54] +["./scripts/jquery.syntaxhighlighter.js",569,5,"each"] +["./scripts/jquery.syntaxhighlighter.js",569,16] +["./scripts/jquery.syntaxhighlighter.js",569,5,"find"] +["./scripts/jquery.syntaxhighlighter.js",569,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",569,17] +["./scripts/jquery.syntaxhighlighter.js",569,63] +["./scripts/jquery.syntaxhighlighter.js",569,63,""] +["./scripts/jquery.syntaxhighlighter.js",569,63] +["./scripts/jquery.syntaxhighlighter.js",569,65] +["./scripts/jquery.syntaxhighlighter.js",571,10,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",571,26] +["./scripts/jquery.syntaxhighlighter.js",571,25,"$"] +["./scripts/jquery.syntaxhighlighter.js",571,27] +["./scripts/jquery.syntaxhighlighter.js",574,7,"whitespace"] +["./scripts/jquery.syntaxhighlighter.js",574,21] +["./scripts/jquery.syntaxhighlighter.js",573,25] +["./scripts/jquery.syntaxhighlighter.js",573,15,"match"] +["./scripts/jquery.syntaxhighlighter.js",572,31,"html"] +["./scripts/jquery.syntaxhighlighter.js",572,14,"html"] +["./scripts/jquery.syntaxhighlighter.js",572,14,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",573,26] +["./scripts/jquery.syntaxhighlighter.js",573,55] +["./scripts/jquery.syntaxhighlighter.js",574,27] +["./scripts/jquery.syntaxhighlighter.js",574,31] +["./scripts/jquery.syntaxhighlighter.js",577,6] +["./scripts/jquery.syntaxhighlighter.js",577,11,"length"] +["./scripts/jquery.syntaxhighlighter.js",577,11,"whitespace"] +["./scripts/jquery.syntaxhighlighter.js",579,87] +["./scripts/jquery.syntaxhighlighter.js",579,7,"each"] +["./scripts/jquery.syntaxhighlighter.js",579,68] +["./scripts/jquery.syntaxhighlighter.js",579,7,"add"] +["./scripts/jquery.syntaxhighlighter.js",579,48] +["./scripts/jquery.syntaxhighlighter.js",579,7,"children"] +["./scripts/jquery.syntaxhighlighter.js",579,37] +["./scripts/jquery.syntaxhighlighter.js",579,7,"siblings"] +["./scripts/jquery.syntaxhighlighter.js",579,26] +["./scripts/jquery.syntaxhighlighter.js",579,7,"parent"] +["./scripts/jquery.syntaxhighlighter.js",579,7,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",579,49] +["./scripts/jquery.syntaxhighlighter.js",579,69,"$initialText"] +["./scripts/jquery.syntaxhighlighter.js",579,96] +["./scripts/jquery.syntaxhighlighter.js",579,96,""] +["./scripts/jquery.syntaxhighlighter.js",579,96] +["./scripts/jquery.syntaxhighlighter.js",579,98] +["./scripts/jquery.syntaxhighlighter.js",581,12,"$nextText"] +["./scripts/jquery.syntaxhighlighter.js",581,25] +["./scripts/jquery.syntaxhighlighter.js",581,24,"$"] +["./scripts/jquery.syntaxhighlighter.js",581,26] +["./scripts/jquery.syntaxhighlighter.js",582,9,"html"] +["./scripts/jquery.syntaxhighlighter.js",582,30] +["./scripts/jquery.syntaxhighlighter.js",582,16,"html"] +["./scripts/jquery.syntaxhighlighter.js",582,16,"$nextText"] +["./scripts/jquery.syntaxhighlighter.js",584,8] +["./scripts/jquery.syntaxhighlighter.js",584,8,"html"] +["./scripts/jquery.syntaxhighlighter.js",584,27] +["./scripts/jquery.syntaxhighlighter.js",584,15,"replace"] +["./scripts/jquery.syntaxhighlighter.js",584,15,"html"] +["./scripts/jquery.syntaxhighlighter.js",584,38] +["./scripts/jquery.syntaxhighlighter.js",584,32,"RegExp"] +["./scripts/jquery.syntaxhighlighter.js",584,39] +["./scripts/jquery.syntaxhighlighter.js",584,43,"whitespace"] +["./scripts/jquery.syntaxhighlighter.js",584,54] +["./scripts/jquery.syntaxhighlighter.js",584,61] +["./scripts/jquery.syntaxhighlighter.js",586,8] +["./scripts/jquery.syntaxhighlighter.js",586,22] +["./scripts/jquery.syntaxhighlighter.js",586,8,"html"] +["./scripts/jquery.syntaxhighlighter.js",586,8,"$nextText"] +["./scripts/jquery.syntaxhighlighter.js",586,23,"html"] +["./scripts/jquery.syntaxhighlighter.js",593,4] +["./scripts/jquery.syntaxhighlighter.js",593,4] +["./scripts/jquery.syntaxhighlighter.js",593,9,"wrapLines"] +["./scripts/jquery.syntaxhighlighter.js",593,9,"config"] +["./scripts/jquery.syntaxhighlighter.js",594,15] +["./scripts/jquery.syntaxhighlighter.js",594,5,"css"] +["./scripts/jquery.syntaxhighlighter.js",594,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",594,16] +["./scripts/jquery.syntaxhighlighter.js",595,6] +["./scripts/jquery.syntaxhighlighter.js",595,19] +["./scripts/jquery.syntaxhighlighter.js",596,6] +["./scripts/jquery.syntaxhighlighter.js",596,19] +["./scripts/jquery.syntaxhighlighter.js",597,6] +["./scripts/jquery.syntaxhighlighter.js",597,20] +["./scripts/jquery.syntaxhighlighter.js",598,6] +["./scripts/jquery.syntaxhighlighter.js",598,19] +["./scripts/jquery.syntaxhighlighter.js",601,15] +["./scripts/jquery.syntaxhighlighter.js",601,5,"css"] +["./scripts/jquery.syntaxhighlighter.js",601,5,"$codes"] +["./scripts/jquery.syntaxhighlighter.js",601,16] +["./scripts/jquery.syntaxhighlighter.js",602,6] +["./scripts/jquery.syntaxhighlighter.js",602,19] +["./scripts/jquery.syntaxhighlighter.js",603,6] +["./scripts/jquery.syntaxhighlighter.js",603,19] +["./scripts/jquery.syntaxhighlighter.js",604,6] +["./scripts/jquery.syntaxhighlighter.js",604,20] +["./scripts/jquery.syntaxhighlighter.js",605,6] +["./scripts/jquery.syntaxhighlighter.js",605,19] +["./scripts/jquery.syntaxhighlighter.js",610,4] +["./scripts/jquery.syntaxhighlighter.js",610,11] +["./scripts/jquery.syntaxhighlighter.js",482,39] +["./scripts/jquery.syntaxhighlighter.js",483,5] +["./scripts/jquery.syntaxhighlighter.js",483,10,"debug"] +["./scripts/jquery.syntaxhighlighter.js",483,10,"config"] +["./scripts/jquery.syntaxhighlighter.js",483,45] +["./scripts/jquery.syntaxhighlighter.js",483,25,"debug"] +["./scripts/jquery.syntaxhighlighter.js",483,25,"console"] +["./scripts/jquery.syntaxhighlighter.js",483,25,"window"] +["./scripts/jquery.syntaxhighlighter.js",483,46] +["./scripts/jquery.syntaxhighlighter.js",484,5] +["./scripts/jquery.syntaxhighlighter.js",484,15] +["./scripts/jquery.syntaxhighlighter.js",484,5,"setTimeout"] +["./scripts/jquery.syntaxhighlighter.js",484,24] +["./scripts/jquery.syntaxhighlighter.js",484,24,""] +["./scripts/jquery.syntaxhighlighter.js",484,24] +["./scripts/jquery.syntaxhighlighter.js",484,26] +["./scripts/jquery.syntaxhighlighter.js",485,6] +["./scripts/jquery.syntaxhighlighter.js",485,39] +["./scripts/jquery.syntaxhighlighter.js",485,6,"apply"] +["./scripts/jquery.syntaxhighlighter.js",485,6,"highlight"] +["./scripts/jquery.syntaxhighlighter.js",485,6,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",485,40,"SyntaxHighlighter"] +["./scripts/jquery.syntaxhighlighter.js",485,59] +["./scripts/jquery.syntaxhighlighter.js",485,60,"params"] +["./scripts/jquery.syntaxhighlighter.js",486,7] +["./scripts/jquery.syntaxhighlighter.js",619,3,"jQuery"] diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.js new file mode 100644 index 000000000..559435fa8 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.js @@ -0,0 +1,619 @@ +/** + * @depends nothing + * @name core.console + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + */ + +/** + * Console Emulator + * We have to convert arguments into arrays, and do this explicitly as webkit (chrome) hates function references, and arguments cannot be passed as is + * @version 1.0.3 + * @date August 31, 2010 + * @since 0.1.0-dev, December 01, 2009 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + +// Check to see if console exists, if not define it +if ( typeof window.console === 'undefined' ) { + window.console = {}; +} + +// Check to see if we have emulated the console yet +if ( typeof window.console.emulated === 'undefined' ) { + // Emulate Log + if ( typeof window.console.log === 'function' ) { + window.console.hasLog = true; + } + else { + if ( typeof window.console.log === 'undefined' ) { + window.console.log = function(){}; + } + window.console.hasLog = false; + } + + // Emulate Debug + if ( typeof window.console.debug === 'function' ) { + window.console.hasDebug = true; + } + else { + if ( typeof window.console.debug === 'undefined' ) { + window.console.debug = !window.console.hasLog ? function(){} : function(){ + var arr = ['console.debug:']; for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }; + window.console.log.apply(window.console, arr); + }; + } + window.console.hasDebug = false; + } + + // Emulate Warn + if ( typeof window.console.warn === 'function' ) { + window.console.hasWarn = true; + } + else { + if ( typeof window.console.warn === 'undefined' ) { + window.console.warn = !window.console.hasLog ? function(){} : function(){ + var arr = ['console.warn:']; for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }; + window.console.log.apply(window.console, arr); + }; + } + window.console.hasWarn = false; + } + + // Emulate Error + if ( typeof window.console.error === 'function' ) { + window.console.hasError = true; + } + else { + if ( typeof window.console.error === 'undefined' ) { + window.console.error = function(){ + var msg = "An error has occured."; + + // Log + if ( window.console.hasLog ) { + var arr = ['console.error:']; for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }; + window.console.log.apply(window.console, arr); + // Adjust Message + msg = 'An error has occured. More information is available in your browser\'s javascript console.' + } + + // Prepare Arguments + for ( var i = 0; i < arguments.length; ++i ) { + if ( typeof arguments[i] !== 'string' ) { + break; + } + msg += "\n"+arguments[i]; + } + + // Throw Error + if ( typeof Error !== 'undefined' ) { + throw new Error(msg); + } + else { + throw(msg); + } + }; + } + window.console.hasError = false; + } + + // Emulate Trace + if ( typeof window.console.trace === 'function' ) { + window.console.hasTrace = true; + } + else { + if ( typeof window.console.trace === 'undefined' ) { + window.console.trace = function(){ + window.console.error('console.trace does not exist'); + }; + } + window.console.hasTrace = false; + } + + // Done + window.console.emulated = true; +} +/** + * @depends jquery + * @name jquery.appendscriptstyle + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + */ + +/** + * jQuery Aliaser + */ +(function($){ + + /** + * Append a Stylesheet to the DOM + * @version 1.1.0 + * @date July 23, 2010 + * @since 1.0.0, June 30, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + $.appendStylesheet = $.appendStylesheet || function(url, overwrite){ + // Check + if ( !(document.body||false) ) { + setTimeout(function(){ + $.appendStylesheet.apply($,[url,overwrite]); + },500); + // Chain + return $; + } + + // Prepare + var id = 'stylesheet-'+url.replace(/[^a-zA-Z0-9]/g, '');; + var $old = $('#'+id); + if ( typeof overwrite === 'undefined' ) { + overwrite = false; + } + + // Check + if ( $old.length === 1 ) { + if ( overwrite ) { + $old.remove(); + } + else { + // Chain + return $; + } + } + + // Create + var bodyEl = document.getElementsByTagName($.browser.safari ? 'head' : 'body')[0]; + var linkEl = document.createElement('link'); + linkEl.type = 'text/css'; + linkEl.rel = 'stylesheet'; + linkEl.media = 'screen'; + linkEl.href = url; + linkEl.id = id; + bodyEl.appendChild(linkEl); + + // Chain + return $; + }; + + /** + * Append a Script to the DOM + * @version 1.1.0 + * @date July 23, 2010 + * @since 1.0.0, June 30, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + $.appendScript = $.appendScript || function(url, overwrite){ + // Check + if ( !(document.body||false) ) { + setTimeout(function(){ + $.appendScript.apply($,[url,overwrite]); + },500); + // Chain + return $; + } + + // Prepare + var id = 'script-'+url.replace(/[^a-zA-Z0-9]/g, '');; + var $old = $('#'+id); + if ( typeof overwrite === 'undefined' ) { + overwrite = false; + } + + // Check + if ( $old.length === 1 ) { + if ( overwrite ) { + $old.remove(); + } + else { + // Chain + return $; + } + } + + // Create + var bodyEl = document.getElementsByTagName($.browser.safari ? 'head' : 'body')[0]; + var scriptEl = document.createElement('script'); + scriptEl.type = 'text/javascript'; + scriptEl.src = url; + scriptEl.id = id; + bodyEl.appendChild(scriptEl); + + // Chain + return $; + }; + + +})(jQuery); +/** + * @depends core.console, jquery, jquery.appendscriptstyle + * @name jquery.syntaxhighlighter + * @package jquery-syntaxhighlighter {@link http://www.balupton/projects/jquery-syntaxhighlighter} + */ + +/** + * jQuery Aliaser + */ +(function($){ + + /** + * Get all elements within ourself which match the selector, and include ourself in the search + * @version 1.0.0 + * @date June 30, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + $.fn.findAndSelf = $.fn.findAndSelf || function(selector){ + var $this = $(this); + return $this.find(selector).andSelf().filter(selector); + }; + + /** + * Add the String replace method to the Number prototype + * This is to fix an error with jQuery v1.4.2 when $('#el').val() contains a numeric value on Firefox. + * Error is here: http://getsatisfaction.com/balupton/topics/word_jumbles + * @version 1.0.0 + * @date September 01, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + Number.prototype.replace = Number.prototype.replace || function(){ + var str = String(this); + return str.replace.apply(this,arguments); + } + + /** + * jQuery SyntaxHighlighter + * @version 1.0.1-beta + * @date August 16, 2010 + * @since 0.1.0-dev, July 23, 2010 + * @package jquery-syntaxhighlighter {@link http://www.balupton/projects/jquery-syntaxhighlighter} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + if ( !($.SyntaxHighlighter||false) ) { + $.SyntaxHighlighter = { + // Configuration + 'config': { + /** + * Whether or not we should load in Google Prettify automatically if it was not detected. + */ + 'load': true, + + /** + * Whether or not we should highlight all appropriate code blocks automatically once the page has finished loading. + */ + 'highlight': true, + + /** + * Whether or not we should output debug information in case something is not working correctly. + */ + 'debug': false, + + /** + * Whether or not we should wrap the code blocks lines, or have them scrollable. + */ + 'wrapLines': true, + + /** + * Whether or not we should display line numbers next to the code blocks. + */ + 'lineNumbers': true, + + /** + * Whether or not we should strip empty start and finish lines from the code blocks. + */ + 'stripEmptyStartFinishLines': true, + + /** + * Whether or not we should remove whitespaces/indentations which are only there for HTML formatting of our code block. + */ + 'stripInitialWhitespace': true, + + /** + * Whether or not we should alternate the lines background colours on odd and even rows. + */ + 'alternateLines': false, + + /** + * The default class to look for in case we have not explicitly specified a language. + */ + 'defaultClassname': 'highlight', + + /** + * The theme that should be used by our highlighted code blocks. + */ + 'theme': 'balupton', + + /** + * The themes to load in for use with our highlighted code blocks. + */ + 'themes': ['balupton'], + + /** + * Whether or not we should add a Syntax Highlighter Sparkle extension if jQuery Sparkle is detected. + */ + 'addSparkleExtension': true, + + /** + * The baseUrl to load Google's Prettify from. + * This is used to load in Google's Prettify if the load option is true and it was not found. + */ + 'prettifyBaseUrl': false ? 'http://192.168.1.2/repos/jquery-syntaxhighlighter/prettify' : 'http://github.com/balupton/jquery-syntaxhighlighter/raw/master/prettify', + + /** + * The baseUrl to load our Syntax Highlighter from. + * This is used to load in the stylesheet and additional themes. + */ + 'baseUrl': false ? 'http://192.168.1.2/repos/jquery-syntaxhighlighter' : 'http://github.com/balupton/jquery-syntaxhighlighter/raw/master' + }, + + // Init + init: function(options){ + // Prepare + var SyntaxHighlighter = this, + config = SyntaxHighlighter.config; + + // Fix baseUrl + var baseUrl = config.baseUrl; + if ( baseUrl[baseUrl.length-1] === '/' ) { + config.baseUrl = baseUrl.substr(0,baseUrl.length-2); + } + delete baseUrl; + + // Configure + $.extend(true, SyntaxHighlighter.config, options||{}); + + // Sparkle + if ( $.Sparkle||false && config.addSparkleExtension ) { + // Add Syntax Highlighter to Sparkle + $.Sparkle.addExtension('syntaxhighlighter', function(){ + $(this).syntaxHighlight(); + }); + } + + // Attach + $.fn.syntaxHighlight = $.fn.SyntaxHighlight = SyntaxHighlighter.fn; + + // Load + if ( config.load ) SyntaxHighlighter.load(); + + // Highlight + if ( config.highlight ) SyntaxHighlighter.highlight(); + + // Chain + return this; + }, + + // Load + load: function(){ + // Prepare + var SyntaxHighlighter = this, + config = SyntaxHighlighter.config, + prettifyBaseUrl = config.prettifyBaseUrl, + baseUrl = config.baseUrl, + themes = config.themes; + + // Append + if ( !SyntaxHighlighter.loaded() ) { + $.appendScript(prettifyBaseUrl+'/prettify.min.js'); + $.appendStylesheet(prettifyBaseUrl+'/prettify.min.css'); + $.appendStylesheet(baseUrl+'/styles/style.min.css'); + $.each(themes,function(i,theme){ + $.appendStylesheet(baseUrl+'/styles/theme-'+theme+'.min.css'); + }); + if ( $.browser.msie ) { + $.appendStylesheet(baseUrl+'/styles/ie.min.css'); + } + SyntaxHighlighter.loadedExtras = true; + } + + // Chain + return this; + }, + + // Loaded Extras + loadedExtras: false, + + // Loaded + loaded: function(){ + return typeof prettyPrint !== 'undefined' && this.loadedExtras; + }, + + // Determine Language + determineLanguage: function(css){ + // Prepare + var language = null, + regex = /lang(uage)?-([a-z0-9]+)/g, + match = regex.exec(css); + + // Handle + while ( match !== null ) { + language = match[2]; + match = regex.exec(css); + } + + // Return langauge + return language; + }, + + // jQuery Function + fn: function(){ + // Prepare + var SyntaxHighlighter = $.SyntaxHighlighter, + config = SyntaxHighlighter.config, + $el = $(this); + + // Highlight + $.SyntaxHighlighter.highlight({ + 'el': $el + }); + + // Chain + return this; + }, + + // Highlight + highlight: function(params){ + // Prepare + if ( typeof params !== 'object' ) { + params = {}; + } + var SyntaxHighlighter = this, + config = SyntaxHighlighter.config, + $el = params.el||false; + + // Adjust + if ( !($el instanceof jQuery) ) { + $el = $('body'); + } + + // Check + if ( !SyntaxHighlighter.loaded() ) { + if ( config.debug ) window.console.debug('SyntaxHighlighter.highlight: Chosen SyntaxHighlighter is not yet defined. Waiting 1200 ms then trying again.'); + setTimeout(function(){ + SyntaxHighlighter.highlight.apply(SyntaxHighlighter, [params]); + },1200); + return; + } + + // Prepare Classnames + var defaultClassname = config.defaultClassname, + defaultSelector = ''; + if ( typeof defaultClassname === 'array' ) { + defaultSelector = '.'+defaultClassname.join(',.'); + defaultClassname = defaultClassname.join(' '); + } + else { + defaultClassname = String(defaultClassname); + defaultSelector = '.'+defaultClassname.replace(' ',',.'); + } + + // Check Classnames + if ( defaultSelector === '.' || !defaultClassname ) { + window.console.error('SyntaxHighlighter.highlight: Invalid defaultClassname.', [this,arguments], [config.defaultClassname]); + window.console.trace(); + } + + // Fetch + var $codes = $el.findAndSelf('code,pre').filter('[class*=lang],'+defaultSelector).filter(':not(.prettyprint)'); + + // Highlight + $codes.css({ + 'overflow-y': 'visible', + 'overflow-x': 'visible', + 'white-space': 'pre' + }).addClass('prettyprint '+defaultClassname).each(function(){ + // Prepare + var $code = $(this), + css = $code.attr('class'), + language = SyntaxHighlighter.determineLanguage(css); + + // Language + $code.addClass('lang-'+language); + }); + + // WrapLines + if ( config.lineNumbers ) { + $codes.addClass('linenums'); + } + + // Theme + if ( config.theme ) { + $codes.addClass('theme-'+config.theme); + } + + // AlternateLines + if ( config.alternateLines ) { + $codes.addClass('alternate'); + } + + // Fire + prettyPrint(); + + // Adjust HTML: stripEmptyStartFinishLines + // we have to do this here, as before prettyPrint IE has issues with newlines + if ( config.stripEmptyStartFinishLines ) { + $codes.find('li:first-child > :first-child, li:last-child > :first-child').each(function(){ + // Prepare + var $initialText = $(this), + html = $initialText.html(), + empty = /^([\r\n\s\t]|\&nbsp;)*$/.test(html), + $parent = $initialText.parent(), + $siblings = $initialText.siblings(); + + // Check + if ( empty && ($siblings.length === 0 || ($siblings.length === 1 && $siblings.filter(':last').is('br'))) ) { + // Remove Line + var $parent = $initialText.parent(), + value = $parent.val(); + $parent.next().val(value); + $parent.remove(); + } + }); + } + + // Adjust HTML: stripInitialWhitespace + // we have to do this here, as before prettyPrint IE has issues with newlines + if ( config.stripInitialWhitespace ) { + $codes.find('li:first-child > :first-child').each(function(){ + // Prepare + var $initialText = $(this), + html = $initialText.html(), + match = html.match(/^(([\r\n\s\t]|\&nbsp;)+)/)||[], + whitespace = (match[1]||''); + + // Check + if ( whitespace.length ) { + // Replace + $initialText.parent().siblings().children(':first-child').add($initialText).each(function(){ + // Prepare + var $nextText = $(this), + html = $nextText.html(); + // Replace + html = html.replace(new RegExp('^'+whitespace,'gm'), ''); + // Apply + $nextText.html(html); + }); + } + }); + } + + // Adjust Lines + if ( config.wrapLines ) { + $codes.css({ + 'overflow-x':'hidden', + 'overflow-y':'hidden', + 'white-space':'pre-wrap', + 'max-height':'none' + }); + } else { + $codes.css({ + 'overflow-x':'auto', + 'overflow-y':'auto', + 'white-space':'normal', + 'max-height':'500px' + }); + } + + // Chain + return this; + } + + }; + } + else { + window.console.warn("SyntaxHighlighter has already been defined..."); + } + +})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.min.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.min.js new file mode 100644 index 000000000..73f232ef5 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/jquery.syntaxhighlighter.min.js @@ -0,0 +1,23 @@ +/* + GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} +*/ +if(typeof window.console==="undefined")window.console={}; +if(typeof window.console.emulated==="undefined"){if(typeof window.console.log==="function")window.console.hasLog=true;else{if(typeof window.console.log==="undefined")window.console.log=function(){};window.console.hasLog=false}if(typeof window.console.debug==="function")window.console.hasDebug=true;else{if(typeof window.console.debug==="undefined")window.console.debug=!window.console.hasLog?function(){}:function(){for(var a=["console.debug:"],b=0;b<arguments.length;b++)a.push(arguments[b]);window.console.log.apply(window.console, +a)};window.console.hasDebug=false}if(typeof window.console.warn==="function")window.console.hasWarn=true;else{if(typeof window.console.warn==="undefined")window.console.warn=!window.console.hasLog?function(){}:function(){for(var a=["console.warn:"],b=0;b<arguments.length;b++)a.push(arguments[b]);window.console.log.apply(window.console,a)};window.console.hasWarn=false}if(typeof window.console.error==="function")window.console.hasError=true;else{if(typeof window.console.error==="undefined")window.console.error= +function(){var a="An error has occured.";if(window.console.hasLog){a=["console.error:"];for(var b=0;b<arguments.length;b++)a.push(arguments[b]);window.console.log.apply(window.console,a);a="An error has occured. More information is available in your browser's javascript console."}for(b=0;b<arguments.length;++b){if(typeof arguments[b]!=="string")break;a+="\n"+arguments[b]}if(typeof Error!=="undefined")throw Error(a);else throw a;};window.console.hasError=false}if(typeof window.console.trace==="function")window.console.hasTrace= +true;else{if(typeof window.console.trace==="undefined")window.console.trace=function(){window.console.error("console.trace does not exist")};window.console.hasTrace=false}window.console.emulated=true} +(function(a){a.appendStylesheet=a.appendStylesheet||function(b,e){if(!(document.body||0)){setTimeout(function(){a.appendStylesheet.apply(a,[b,e])},500);return a}var c="stylesheet-"+b.replace(/[^a-zA-Z0-9]/g,""),d=a("#"+c);if(typeof e==="undefined")e=false;if(d.length===1)if(e)d.remove();else return a;d=document.getElementsByTagName(a.browser.safari?"head":"body")[0];var f=document.createElement("link");f.type="text/css";f.rel="stylesheet";f.media="screen";f.href=b;f.id=c;d.appendChild(f);return a}; +a.appendScript=a.appendScript||function(b,e){if(!(document.body||0)){setTimeout(function(){a.appendScript.apply(a,[b,e])},500);return a}var c="script-"+b.replace(/[^a-zA-Z0-9]/g,""),d=a("#"+c);if(typeof e==="undefined")e=false;if(d.length===1)if(e)d.remove();else return a;d=document.getElementsByTagName(a.browser.safari?"head":"body")[0];var f=document.createElement("script");f.type="text/javascript";f.src=b;f.id=c;d.appendChild(f);return a}})(jQuery); +(function(a){a.fn.findAndSelf=a.fn.findAndSelf||function(b){return a(this).find(b).andSelf().filter(b)};Number.prototype.replace=Number.prototype.replace||function(){return String(this).replace.apply(this,arguments)};if(a.SyntaxHighlighter)window.console.warn("SyntaxHighlighter has already been defined...");else a.SyntaxHighlighter={config:{load:true,highlight:true,debug:false,wrapLines:true,lineNumbers:true,stripEmptyStartFinishLines:true,stripInitialWhitespace:true,alternateLines:false,defaultClassname:"highlight", +theme:"balupton",themes:["balupton"],addSparkleExtension:true,prettifyBaseUrl:"http://github.com/balupton/jquery-syntaxhighlighter/raw/master/prettify",baseUrl:"http://github.com/balupton/jquery-syntaxhighlighter/raw/master"},init:function(b){var e=this.config,c=e.baseUrl;if(c[c.length-1]==="/")e.baseUrl=c.substr(0,c.length-2);delete c;a.extend(true,this.config,b||{});a.Sparkle&&a.Sparkle.addExtension("syntaxhighlighter",function(){a(this).syntaxHighlight()});a.fn.syntaxHighlight=a.fn.SyntaxHighlight= +this.fn;e.load&&this.load();e.highlight&&this.highlight();return this},load:function(){var b=this.config,e=b.prettifyBaseUrl,c=b.baseUrl;b=b.themes;if(!this.loaded()){a.appendScript(e+"/prettify.min.js");a.appendStylesheet(e+"/prettify.min.css");a.appendStylesheet(c+"/styles/style.min.css");a.each(b,function(d,f){a.appendStylesheet(c+"/styles/theme-"+f+".min.css")});a.browser.msie&&a.appendStylesheet(c+"/styles/ie.min.css");this.loadedExtras=true}return this},loadedExtras:false,loaded:function(){return typeof prettyPrint!== +"undefined"&&this.loadedExtras},determineLanguage:function(b){for(var e=null,c=/lang(uage)?-([a-z0-9]+)/g,d=c.exec(b);d!==null;){e=d[2];d=c.exec(b)}return e},fn:function(){var b=a(this);a.SyntaxHighlighter.highlight({el:b});return this},highlight:function(b){if(typeof b!=="object")b={};var e=this,c=e.config,d=b.el||false;d instanceof jQuery||(d=a("body"));if(e.loaded()){var f=c.defaultClassname,j="";if(typeof f==="array"){j="."+f.join(",.");f=f.join(" ")}else{f=String(f);j="."+f.replace(" ",",.")}if(j=== +"."||!f){window.console.error("SyntaxHighlighter.highlight: Invalid defaultClassname.",[this,arguments],[c.defaultClassname]);window.console.trace()}d=d.findAndSelf("code,pre").filter("[class*=lang],"+j).filter(":not(.prettyprint)");d.css({"overflow-y":"visible","overflow-x":"visible","white-space":"pre"}).addClass("prettyprint "+f).each(function(){var g=a(this),i=g.attr("class");i=e.determineLanguage(i);g.addClass("lang-"+i)});c.lineNumbers&&d.addClass("linenums");c.theme&&d.addClass("theme-"+c.theme); +c.alternateLines&&d.addClass("alternate");prettyPrint();c.stripEmptyStartFinishLines&&d.find("li:first-child > :first-child, li:last-child > :first-child").each(function(){var g=a(this),i=/^([\r\n\s\t]|\&nbsp;)*$/.test(g.html()),h=g.parent();h=g.siblings();if(i&&(h.length===0||h.length===1&&h.filter(":last").is("br"))){h=g.parent();g=h.val();h.next().val(g);h.remove()}});c.stripInitialWhitespace&&d.find("li:first-child > :first-child").each(function(){var g=a(this),i=(g.html().match(/^(([\r\n\s\t]|\&nbsp;)+)/)|| +[])[1]||"";i.length&&g.parent().siblings().children(":first-child").add(g).each(function(){var h=a(this),k=h.html();k=k.replace(RegExp("^"+i,"gm"),"");h.html(k)})});c.wrapLines?d.css({"overflow-x":"hidden","overflow-y":"hidden","white-space":"pre-wrap","max-height":"none"}):d.css({"overflow-x":"auto","overflow-y":"auto","white-space":"normal","max-height":"500px"});return this}else{c.debug&&window.console.debug("SyntaxHighlighter.highlight: Chosen SyntaxHighlighter is not yet defined. Waiting 1200 ms then trying again."); +setTimeout(function(){e.highlight.apply(e,[b])},1200)}}}})(jQuery); diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/core.console.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/core.console.js new file mode 100644 index 000000000..80462d508 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/core.console.js @@ -0,0 +1,117 @@ +/** + * @depends nothing + * @name core.console + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + */ + +/** + * Console Emulator + * We have to convert arguments into arrays, and do this explicitly as webkit (chrome) hates function references, and arguments cannot be passed as is + * @version 1.0.3 + * @date August 31, 2010 + * @since 0.1.0-dev, December 01, 2009 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + +// Check to see if console exists, if not define it +if ( typeof window.console === 'undefined' ) { + window.console = {}; +} + +// Check to see if we have emulated the console yet +if ( typeof window.console.emulated === 'undefined' ) { + // Emulate Log + if ( typeof window.console.log === 'function' ) { + window.console.hasLog = true; + } + else { + if ( typeof window.console.log === 'undefined' ) { + window.console.log = function(){}; + } + window.console.hasLog = false; + } + + // Emulate Debug + if ( typeof window.console.debug === 'function' ) { + window.console.hasDebug = true; + } + else { + if ( typeof window.console.debug === 'undefined' ) { + window.console.debug = !window.console.hasLog ? function(){} : function(){ + var arr = ['console.debug:']; for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }; + window.console.log.apply(window.console, arr); + }; + } + window.console.hasDebug = false; + } + + // Emulate Warn + if ( typeof window.console.warn === 'function' ) { + window.console.hasWarn = true; + } + else { + if ( typeof window.console.warn === 'undefined' ) { + window.console.warn = !window.console.hasLog ? function(){} : function(){ + var arr = ['console.warn:']; for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }; + window.console.log.apply(window.console, arr); + }; + } + window.console.hasWarn = false; + } + + // Emulate Error + if ( typeof window.console.error === 'function' ) { + window.console.hasError = true; + } + else { + if ( typeof window.console.error === 'undefined' ) { + window.console.error = function(){ + var msg = "An error has occured."; + + // Log + if ( window.console.hasLog ) { + var arr = ['console.error:']; for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }; + window.console.log.apply(window.console, arr); + // Adjust Message + msg = 'An error has occured. More information is available in your browser\'s javascript console.' + } + + // Prepare Arguments + for ( var i = 0; i < arguments.length; ++i ) { + if ( typeof arguments[i] !== 'string' ) { + break; + } + msg += "\n"+arguments[i]; + } + + // Throw Error + if ( typeof Error !== 'undefined' ) { + throw new Error(msg); + } + else { + throw(msg); + } + }; + } + window.console.hasError = false; + } + + // Emulate Trace + if ( typeof window.console.trace === 'function' ) { + window.console.hasTrace = true; + } + else { + if ( typeof window.console.trace === 'undefined' ) { + window.console.trace = function(){ + window.console.error('console.trace does not exist'); + }; + } + window.console.hasTrace = false; + } + + // Done + window.console.emulated = true; +} diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/jquery.appendscriptstyle.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/jquery.appendscriptstyle.js new file mode 100644 index 000000000..b15f9a7f6 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/jquery.appendscriptstyle.js @@ -0,0 +1,115 @@ +/** + * @depends jquery + * @name jquery.appendscriptstyle + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + */ + +/** + * jQuery Aliaser + */ +(function($){ + + /** + * Append a Stylesheet to the DOM + * @version 1.1.0 + * @date July 23, 2010 + * @since 1.0.0, June 30, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + $.appendStylesheet = $.appendStylesheet || function(url, overwrite){ + // Check + if ( !(document.body||false) ) { + setTimeout(function(){ + $.appendStylesheet.apply($,[url,overwrite]); + },500); + // Chain + return $; + } + + // Prepare + var id = 'stylesheet-'+url.replace(/[^a-zA-Z0-9]/g, '');; + var $old = $('#'+id); + if ( typeof overwrite === 'undefined' ) { + overwrite = false; + } + + // Check + if ( $old.length === 1 ) { + if ( overwrite ) { + $old.remove(); + } + else { + // Chain + return $; + } + } + + // Create + var bodyEl = document.getElementsByTagName($.browser.safari ? 'head' : 'body')[0]; + var linkEl = document.createElement('link'); + linkEl.type = 'text/css'; + linkEl.rel = 'stylesheet'; + linkEl.media = 'screen'; + linkEl.href = url; + linkEl.id = id; + bodyEl.appendChild(linkEl); + + // Chain + return $; + }; + + /** + * Append a Script to the DOM + * @version 1.1.0 + * @date July 23, 2010 + * @since 1.0.0, June 30, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + $.appendScript = $.appendScript || function(url, overwrite){ + // Check + if ( !(document.body||false) ) { + setTimeout(function(){ + $.appendScript.apply($,[url,overwrite]); + },500); + // Chain + return $; + } + + // Prepare + var id = 'script-'+url.replace(/[^a-zA-Z0-9]/g, '');; + var $old = $('#'+id); + if ( typeof overwrite === 'undefined' ) { + overwrite = false; + } + + // Check + if ( $old.length === 1 ) { + if ( overwrite ) { + $old.remove(); + } + else { + // Chain + return $; + } + } + + // Create + var bodyEl = document.getElementsByTagName($.browser.safari ? 'head' : 'body')[0]; + var scriptEl = document.createElement('script'); + scriptEl.type = 'text/javascript'; + scriptEl.src = url; + scriptEl.id = id; + bodyEl.appendChild(scriptEl); + + // Chain + return $; + }; + + +})(jQuery); diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/jquery.syntaxhighlighter.js b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/jquery.syntaxhighlighter.js new file mode 100644 index 000000000..78d73ad92 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/scripts/resources/jquery.syntaxhighlighter.js @@ -0,0 +1,387 @@ +/** + * @depends core.console, jquery, jquery.appendscriptstyle + * @name jquery.syntaxhighlighter + * @package jquery-syntaxhighlighter {@link http://www.balupton/projects/jquery-syntaxhighlighter} + */ + +/** + * jQuery Aliaser + */ +(function($){ + + /** + * Get all elements within ourself which match the selector, and include ourself in the search + * @version 1.0.0 + * @date June 30, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + $.fn.findAndSelf = $.fn.findAndSelf || function(selector){ + var $this = $(this); + return $this.find(selector).andSelf().filter(selector); + }; + + /** + * Add the String replace method to the Number prototype + * This is to fix an error with jQuery v1.4.2 when $('#el').val() contains a numeric value on Firefox. + * Error is here: http://getsatisfaction.com/balupton/topics/word_jumbles + * @version 1.0.0 + * @date September 01, 2010 + * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + Number.prototype.replace = Number.prototype.replace || function(){ + var str = String(this); + return str.replace.apply(this,arguments); + } + + /** + * jQuery SyntaxHighlighter + * @version 1.0.1-beta + * @date August 16, 2010 + * @since 0.1.0-dev, July 23, 2010 + * @package jquery-syntaxhighlighter {@link http://www.balupton/projects/jquery-syntaxhighlighter} + * @author Benjamin "balupton" Lupton {@link http://www.balupton.com} + * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com} + * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html} + */ + if ( !($.SyntaxHighlighter||false) ) { + $.SyntaxHighlighter = { + // Configuration + 'config': { + /** + * Whether or not we should load in Google Prettify automatically if it was not detected. + */ + 'load': true, + + /** + * Whether or not we should highlight all appropriate code blocks automatically once the page has finished loading. + */ + 'highlight': true, + + /** + * Whether or not we should output debug information in case something is not working correctly. + */ + 'debug': false, + + /** + * Whether or not we should wrap the code blocks lines, or have them scrollable. + */ + 'wrapLines': true, + + /** + * Whether or not we should display line numbers next to the code blocks. + */ + 'lineNumbers': true, + + /** + * Whether or not we should strip empty start and finish lines from the code blocks. + */ + 'stripEmptyStartFinishLines': true, + + /** + * Whether or not we should remove whitespaces/indentations which are only there for HTML formatting of our code block. + */ + 'stripInitialWhitespace': true, + + /** + * Whether or not we should alternate the lines background colours on odd and even rows. + */ + 'alternateLines': false, + + /** + * The default class to look for in case we have not explicitly specified a language. + */ + 'defaultClassname': 'highlight', + + /** + * The theme that should be used by our highlighted code blocks. + */ + 'theme': 'balupton', + + /** + * The themes to load in for use with our highlighted code blocks. + */ + 'themes': ['balupton'], + + /** + * Whether or not we should add a Syntax Highlighter Sparkle extension if jQuery Sparkle is detected. + */ + 'addSparkleExtension': true, + + /** + * The baseUrl to load Google's Prettify from. + * This is used to load in Google's Prettify if the load option is true and it was not found. + */ + 'prettifyBaseUrl': false ? 'http://192.168.1.2/repos/jquery-syntaxhighlighter/prettify' : 'http://github.com/balupton/jquery-syntaxhighlighter/raw/master/prettify', + + /** + * The baseUrl to load our Syntax Highlighter from. + * This is used to load in the stylesheet and additional themes. + */ + 'baseUrl': false ? 'http://192.168.1.2/repos/jquery-syntaxhighlighter' : 'http://github.com/balupton/jquery-syntaxhighlighter/raw/master' + }, + + // Init + init: function(options){ + // Prepare + var SyntaxHighlighter = this, + config = SyntaxHighlighter.config; + + // Fix baseUrl + var baseUrl = config.baseUrl; + if ( baseUrl[baseUrl.length-1] === '/' ) { + config.baseUrl = baseUrl.substr(0,baseUrl.length-2); + } + delete baseUrl; + + // Configure + $.extend(true, SyntaxHighlighter.config, options||{}); + + // Sparkle + if ( $.Sparkle||false && config.addSparkleExtension ) { + // Add Syntax Highlighter to Sparkle + $.Sparkle.addExtension('syntaxhighlighter', function(){ + $(this).syntaxHighlight(); + }); + } + + // Attach + $.fn.syntaxHighlight = $.fn.SyntaxHighlight = SyntaxHighlighter.fn; + + // Load + if ( config.load ) SyntaxHighlighter.load(); + + // Highlight + if ( config.highlight ) SyntaxHighlighter.highlight(); + + // Chain + return this; + }, + + // Load + load: function(){ + // Prepare + var SyntaxHighlighter = this, + config = SyntaxHighlighter.config, + prettifyBaseUrl = config.prettifyBaseUrl, + baseUrl = config.baseUrl, + themes = config.themes; + + // Append + if ( !SyntaxHighlighter.loaded() ) { + $.appendScript(prettifyBaseUrl+'/prettify.min.js'); + $.appendStylesheet(prettifyBaseUrl+'/prettify.min.css'); + $.appendStylesheet(baseUrl+'/styles/style.min.css'); + $.each(themes,function(i,theme){ + $.appendStylesheet(baseUrl+'/styles/theme-'+theme+'.min.css'); + }); + if ( $.browser.msie ) { + $.appendStylesheet(baseUrl+'/styles/ie.min.css'); + } + SyntaxHighlighter.loadedExtras = true; + } + + // Chain + return this; + }, + + // Loaded Extras + loadedExtras: false, + + // Loaded + loaded: function(){ + return typeof prettyPrint !== 'undefined' && this.loadedExtras; + }, + + // Determine Language + determineLanguage: function(css){ + // Prepare + var language = null, + regex = /lang(uage)?-([a-z0-9]+)/g, + match = regex.exec(css); + + // Handle + while ( match !== null ) { + language = match[2]; + match = regex.exec(css); + } + + // Return langauge + return language; + }, + + // jQuery Function + fn: function(){ + // Prepare + var SyntaxHighlighter = $.SyntaxHighlighter, + config = SyntaxHighlighter.config, + $el = $(this); + + // Highlight + $.SyntaxHighlighter.highlight({ + 'el': $el + }); + + // Chain + return this; + }, + + // Highlight + highlight: function(params){ + // Prepare + if ( typeof params !== 'object' ) { + params = {}; + } + var SyntaxHighlighter = this, + config = SyntaxHighlighter.config, + $el = params.el||false; + + // Adjust + if ( !($el instanceof jQuery) ) { + $el = $('body'); + } + + // Check + if ( !SyntaxHighlighter.loaded() ) { + if ( config.debug ) window.console.debug('SyntaxHighlighter.highlight: Chosen SyntaxHighlighter is not yet defined. Waiting 1200 ms then trying again.'); + setTimeout(function(){ + SyntaxHighlighter.highlight.apply(SyntaxHighlighter, [params]); + },1200); + return; + } + + // Prepare Classnames + var defaultClassname = config.defaultClassname, + defaultSelector = ''; + if ( typeof defaultClassname === 'array' ) { + defaultSelector = '.'+defaultClassname.join(',.'); + defaultClassname = defaultClassname.join(' '); + } + else { + defaultClassname = String(defaultClassname); + defaultSelector = '.'+defaultClassname.replace(' ',',.'); + } + + // Check Classnames + if ( defaultSelector === '.' || !defaultClassname ) { + window.console.error('SyntaxHighlighter.highlight: Invalid defaultClassname.', [this,arguments], [config.defaultClassname]); + window.console.trace(); + } + + // Fetch + var $codes = $el.findAndSelf('code,pre').filter('[class*=lang],'+defaultSelector).filter(':not(.prettyprint)'); + + // Highlight + $codes.css({ + 'overflow-y': 'visible', + 'overflow-x': 'visible', + 'white-space': 'pre' + }).addClass('prettyprint '+defaultClassname).each(function(){ + // Prepare + var $code = $(this), + css = $code.attr('class'), + language = SyntaxHighlighter.determineLanguage(css); + + // Language + $code.addClass('lang-'+language); + }); + + // WrapLines + if ( config.lineNumbers ) { + $codes.addClass('linenums'); + } + + // Theme + if ( config.theme ) { + $codes.addClass('theme-'+config.theme); + } + + // AlternateLines + if ( config.alternateLines ) { + $codes.addClass('alternate'); + } + + // Fire + prettyPrint(); + + // Adjust HTML: stripEmptyStartFinishLines + // we have to do this here, as before prettyPrint IE has issues with newlines + if ( config.stripEmptyStartFinishLines ) { + $codes.find('li:first-child > :first-child, li:last-child > :first-child').each(function(){ + // Prepare + var $initialText = $(this), + html = $initialText.html(), + empty = /^([\r\n\s\t]|\&nbsp;)*$/.test(html), + $parent = $initialText.parent(), + $siblings = $initialText.siblings(); + + // Check + if ( empty && ($siblings.length === 0 || ($siblings.length === 1 && $siblings.filter(':last').is('br'))) ) { + // Remove Line + var $parent = $initialText.parent(), + value = $parent.val(); + $parent.next().val(value); + $parent.remove(); + } + }); + } + + // Adjust HTML: stripInitialWhitespace + // we have to do this here, as before prettyPrint IE has issues with newlines + if ( config.stripInitialWhitespace ) { + $codes.find('li:first-child > :first-child').each(function(){ + // Prepare + var $initialText = $(this), + html = $initialText.html(), + match = html.match(/^(([\r\n\s\t]|\&nbsp;)+)/)||[], + whitespace = (match[1]||''); + + // Check + if ( whitespace.length ) { + // Replace + $initialText.parent().siblings().children(':first-child').add($initialText).each(function(){ + // Prepare + var $nextText = $(this), + html = $nextText.html(); + // Replace + html = html.replace(new RegExp('^'+whitespace,'gm'), ''); + // Apply + $nextText.html(html); + }); + } + }); + } + + // Adjust Lines + if ( config.wrapLines ) { + $codes.css({ + 'overflow-x':'hidden', + 'overflow-y':'hidden', + 'white-space':'pre-wrap', + 'max-height':'none' + }); + } else { + $codes.css({ + 'overflow-x':'auto', + 'overflow-y':'auto', + 'white-space':'normal', + 'max-height':'500px' + }); + } + + // Chain + return this; + } + + }; + } + else { + window.console.warn("SyntaxHighlighter has already been defined..."); + } + +})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/ie.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/ie.css new file mode 100644 index 000000000..4ce15eb50 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/ie.css @@ -0,0 +1,8 @@ +.prettyprint ol.linenums { + list-style: decimal inside; /* ie does not support outside */ + padding: 3px 10px; +} +.prettyprint ol.linenums li { + padding-left: 0px; + border:none; +} \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/ie.min.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/ie.min.css new file mode 100644 index 000000000..8a40b2c69 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/ie.min.css @@ -0,0 +1 @@ +.prettyprint ol.linenums{list-style:decimal inside;padding:3px 10px;}.prettyprint ol.linenums li{padding-left:0;border:none;} \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/style.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/style.css new file mode 100644 index 000000000..0777845c7 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/style.css @@ -0,0 +1,53 @@ +.prettyprint ol, +.prettyprint ul { + list-style: none; +} +.prettyprint ol.linenums { + list-style: decimal outside; + padding-left: 47px; + color:#AFAFAF; + font-size:12px; +} +.prettyprint ol.linenums li { + padding-left: 15px; + border-left:3px #6CE26C solid; +} +.prettyprint li > * { + font-size:14px; +} +.prettyprint { + border: 5px solid #DDD; + padding: 7px 0 5px; + font-size: 14px; + white-space: pre; + overflow: auto; + max-height: 500px; + width: 100%; + display: block; +} +.prettyprint ol, .prettyprint ul { + padding: 5px 0; +} + +.prettyprint li.L0, +.prettyprint li.L1, +.prettyprint li.L2, +.prettyprint li.L3, +.prettyprint li.L4, +.prettyprint li.L5, +.prettyprint li.L6, +.prettyprint li.L7, +.prettyprint li.L8, +.prettyprint li.L9 { + list-style:inherit; + background:none; +} + +.prettyprint.alternate +.prettyprint.alternate li.L1, +.prettyprint.alternate li.L3, +.prettyprint.alternate li.L5, +.prettyprint.alternate li.L7, +.prettyprint.alternate li.L9 { + background:#F5F5F5; +} \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/style.min.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/style.min.css new file mode 100644 index 000000000..740e4c382 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/style.min.css @@ -0,0 +1 @@ +.prettyprint ol,.prettyprint ul{list-style:none;}.prettyprint ol.linenums{list-style:decimal outside;padding-left:47px;color:#AFAFAF;font-size:12px;}.prettyprint ol.linenums li{padding-left:15px;border-left:3px #6CE26C solid;}.prettyprint li>*{font-size:14px;}.prettyprint{border:5px solid #DDD;padding:7px 0 5px;font-size:14px;white-space:pre;overflow:auto;max-height:500px;width:100%;display:block;}.prettyprint ol,.prettyprint ul{padding:5px 0;}.prettyprint li.L0,.prettyprint li.L1,.prettyprint li.L2,.prettyprint li.L3,.prettyprint li.L4,.prettyprint li.L5,.prettyprint li.L6,.prettyprint li.L7,.prettyprint li.L8,.prettyprint li.L9{list-style:inherit;background:none;}.prettyprint.alternate .prettyprint.alternate li.L1,.prettyprint.alternate li.L3,.prettyprint.alternate li.L5,.prettyprint.alternate li.L7,.prettyprint.alternate li.L9{background:#F5F5F5;} \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-balupton.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-balupton.css new file mode 100644 index 000000000..a053c0320 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-balupton.css @@ -0,0 +1,48 @@ +.prettyprint.theme-balupton { + font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 15px; +} +.prettyprint.theme-balupton .com { + color: #008200; /* balupton green */ +} +.prettyprint.theme-balupton .lit { + color: #066; /* google green */ +} +.prettyprint.theme-balupton.lang-html .lit { + /* CSS Property Value */ + color: #066; /* google green */ +} +.prettyprint.theme-balupton.lang-html .kwd { + /* CSS Property Value Keyword */ + color: #066; /* google green */ + font-weight:bold; +} +.prettyprint.theme-balupton.lang-html .atv + .pln, +.prettyprint.theme-balupton.lang-html .pun + .pln { + /* CSS Property Name */ + color: blue; +} +.prettyprint.theme-balupton .atv, +.prettyprint.theme-balupton .str { + color: blue; +} +.prettyprint.theme-balupton .atn { + color: gray; +} +.prettyprint.theme-balupton .pln { + color: black; +} +.prettyprint.theme-balupton .pun { + color: #666; +} +.prettyprint.theme-balupton .typ { + color: #606; +} +.prettyprint.theme-balupton .tag, +.prettyprint.theme-balupton .kwd { + color: #006699; + font-weight: bold; +} diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-balupton.min.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-balupton.min.css new file mode 100644 index 000000000..bcb423a0e --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-balupton.min.css @@ -0,0 +1 @@ +.prettyprint.theme-balupton{font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace;font-size:14px;font-style:normal;font-weight:normal;line-height:15px;}.prettyprint.theme-balupton .com{color:#008200;}.prettyprint.theme-balupton .lit{color:#066;}.prettyprint.theme-balupton.lang-html .lit{color:#066;}.prettyprint.theme-balupton.lang-html .kwd{color:#066;font-weight:bold;}.prettyprint.theme-balupton.lang-html .atv+.pln,.prettyprint.theme-balupton.lang-html .pun+.pln{color:blue;}.prettyprint.theme-balupton .atv,.prettyprint.theme-balupton .str{color:blue;}.prettyprint.theme-balupton .atn{color:gray;}.prettyprint.theme-balupton .pln{color:black;}.prettyprint.theme-balupton .pun{color:#666;}.prettyprint.theme-balupton .typ{color:#606;}.prettyprint.theme-balupton .tag,.prettyprint.theme-balupton .kwd{color:#069;font-weight:bold;} \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-google.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-google.css new file mode 100644 index 000000000..fd6c346e7 --- /dev/null +++ b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-google.css @@ -0,0 +1 @@ +/* The google theme is the base theme. No extra stying is needed. */ \ No newline at end of file diff --git a/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-google.min.css b/fannie/src/jquery/jQuery-SyntaxHighlighter/styles/theme-google.min.css new file mode 100644 index 000000000..e69de29bb diff --git a/fannie/src/jquery/jquery.form.js b/fannie/src/jquery/jquery.form.js new file mode 100644 index 000000000..f5beb2ccb --- /dev/null +++ b/fannie/src/jquery/jquery.form.js @@ -0,0 +1,789 @@ +/* + * jQuery form plugin + * @requires jQuery v1.0.3 + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + * Version: .97 + */ + +/** + * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX. + * + * ajaxSubmit accepts a single argument which can be either a success callback function + * or an options Object. If a function is provided it will be invoked upon successful + * completion of the submit and will be passed the response from the server. + * If an options Object is provided, the following attributes are supported: + * + * target: Identifies the element(s) in the page to be updated with the server response. + * This value may be specified as a jQuery selection string, a jQuery object, + * or a DOM element. + * default value: null + * + * url: URL to which the form data will be submitted. + * default value: value of form's 'action' attribute + * + * type: The method in which the form data should be submitted, 'GET' or 'POST'. + * default value: value of form's 'method' attribute (or 'GET' if none found) + * + * beforeSubmit: Callback method to be invoked before the form is submitted. + * default value: null + * + * success: Callback method to be invoked after the form has been successfully submitted + * and the response has been returned from the server + * default value: null + * + * dataType: Expected dataType of the response. One of: null, 'xml', 'script', or 'json' + * default value: null + * + * semantic: Boolean flag indicating whether data must be submitted in semantic order (slower). + * default value: false + * + * resetForm: Boolean flag indicating whether the form should be reset if the submit is successful + * + * clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful + * + * + * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for + * validating the form data. If the 'beforeSubmit' callback returns false then the form will + * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data + * in array format, the jQuery object, and the options object passed into ajaxSubmit. + * The form data array takes the following form: + * + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] + * + * If a 'success' callback method is provided it is invoked after the response has been returned + * from the server. It is passed the responseText or responseXML value (depending on dataType). + * See jQuery.ajax for further details. + * + * + * The dataType option provides a means for specifying how the server response should be handled. + * This maps directly to the jQuery.httpData method. The following values are supported: + * + * 'xml': if dataType == 'xml' the server response is treated as XML and the 'after' + * callback method, if specified, will be passed the responseXML value + * 'json': if dataType == 'json' the server response will be evaluted and passed to + * the 'after' callback, if specified + * 'script': if dataType == 'script' the server response is evaluated in the global context + * + * + * Note that it does not make sense to use both the 'target' and 'dataType' options. If both + * are provided the target will be ignored. + * + * The semantic argument can be used to force form serialization in semantic order. + * This is normally true anyway, unless the form contains input elements of type='image'. + * If your form must be submitted with name/value pairs in semantic order and your form + * contains an input of type='image" then pass true for this arg, otherwise pass false + * (or nothing) to avoid the overhead for this logic. + * + * + * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this: + * + * $("#form-id").submit(function() { + * $(this).ajaxSubmit(options); + * return false; // cancel conventional submit + * }); + * + * When using ajaxForm(), however, this is done for you. + * + * @example + * $('#myForm').ajaxSubmit(function(data) { + * alert('Form submit succeeded! Server returned: ' + data); + * }); + * @desc Submit form and alert server response + * + * + * @example + * var options = { + * target: '#myTargetDiv' + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Submit form and update page element with server response + * + * + * @example + * var options = { + * success: function(responseText) { + * alert(responseText); + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Submit form and alert the server response + * + * + * @example + * var options = { + * beforeSubmit: function(formArray, jqForm) { + * if (formArray.length == 0) { + * alert('Please enter data.'); + * return false; + * } + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Pre-submit validation which aborts the submit operation if form data is empty + * + * + * @example + * var options = { + * url: myJsonUrl.php, + * dataType: 'json', + * success: function(data) { + * // 'data' is an object representing the the evaluated json data + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc json data returned and evaluated + * + * + * @example + * var options = { + * url: myXmlUrl.php, + * dataType: 'xml', + * success: function(responseXML) { + * // responseXML is XML document object + * var data = $('myElement', responseXML).text(); + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc XML data returned from server + * + * + * @example + * var options = { + * resetForm: true + * }; + * $('#myForm').ajaxSubmit(options); + * @desc submit form and reset it if successful + * + * @example + * $('#myForm).submit(function() { + * $(this).ajaxSubmit(); + * return false; + * }); + * @desc Bind form's submit event to use ajaxSubmit + * + * + * @name ajaxSubmit + * @type jQuery + * @param options object literal containing options which control the form submission process + * @cat Plugins/Form + * @return jQuery + * @see formToArray + * @see ajaxForm + * @see $.ajax + * @author jQuery Community + */ +jQuery.fn.ajaxSubmit = function(options) { + if (typeof options == 'function') + options = { success: options }; + + options = jQuery.extend({ + url: this.attr('action') || window.location, + type: this.attr('method') || 'GET' + }, options || {}); + + var a = this.formToArray(options.semantic); + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this; + + // fire vetoable 'validate' event + var veto = {}; + jQuery.event.trigger('form.submit.validate', [a, this, options, veto]); + if (veto.veto) + return this; + + var q = jQuery.param(a);//.replace(/%20/g,'+'); + + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else + options.data = q; // data is the query string for 'post' + + var $form = this, callbacks = []; + if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); + if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data, status) { + jQuery(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, [data, status]); + }); + } + else if (options.success) + callbacks.push(options.success); + + options.success = function(data, status) { + for (var i=0, max=callbacks.length; i < max; i++) + callbacks[i](data, status); + }; + + // are there files to upload? + var files = jQuery('input:file', this).fieldValue(); + var found = false; + for (var j=0; j < files.length; j++) + if (files[j]) + found = true; + + if (options.iframe || found) // options.iframe allows user to force iframe mode + fileUpload(); + else + jQuery.ajax(options); + + // fire 'notify' event + jQuery.event.trigger('form.submit.notify', [this, options]); + return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + var opts = jQuery.extend({}, jQuery.ajaxSettings, options); + + var id = 'jqFormIO' + jQuery.fn.ajaxSubmit.counter++; + var $io = jQuery('<iframe id="' + id + '" name="' + id + '" />'); + var io = $io[0]; + var op8 = jQuery.browser.opera && window.opera.version() < 9; + if (jQuery.browser.msie || op8) io.src = 'javascript:false;document.write("");'; + $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' }); + + // make sure form attrs are set + form.method = 'POST'; + form.encoding ? form.encoding = 'multipart/form-data' : form.enctype = 'multipart/form-data'; + + var xhr = { // mock object + responseText: null, + responseXML: null, + status: 0, + statusText: 'n/a', + getAllResponseHeaders: function() {}, + getResponseHeader: function() {}, + setRequestHeader: function() {} + }; + + var g = opts.global; + // trigger ajax global events so that activity/block indicators work like normal + if (g && ! jQuery.active++) jQuery.event.trigger("ajaxStart"); + if (g) jQuery.event.trigger("ajaxSend", [xhr, opts]); + + var cbInvoked = 0; + var timedOut = 0; + + // take a breath so that pending repaints get some cpu time before the upload starts + setTimeout(function() { + $io.appendTo('body'); + // jQuery's event binding doesn't work for iframe events in IE + io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); + form.action = opts.url; + var t = form.target; + form.target = id; + + // support timout + if (opts.timeout) + setTimeout(function() { timedOut = true; cb(); }, opts.timeout); + + form.submit(); + form.target = t; // reset + }, 10); + + function cb() { + if (cbInvoked++) return; + + io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false); + + var ok = true; + try { + if (timedOut) throw 'timeout'; + // extract the server response from the iframe + var data, doc; + doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document; + xhr.responseText = doc.body ? doc.body.innerHTML : null; + xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; + + if (opts.dataType == 'json' || opts.dataType == 'script') { + var ta = doc.getElementsByTagName('textarea')[0]; + data = ta ? ta.value : xhr.responseText; + if (opts.dataType == 'json') + eval("data = " + data); + else + jQuery.globalEval(data); + } + else if (opts.dataType == 'xml') { + data = xhr.responseXML; + if (!data && xhr.responseText != null) + data = toXml(xhr.responseText); + } + else { + data = xhr.responseText; + } + } + catch(e){ + ok = false; + jQuery.handleError(opts, xhr, 'error', e); + } + + // ordering of these callbacks/triggers is odd, but that's how $.ajax does it + if (ok) { + opts.success(data, 'success'); + if (g) jQuery.event.trigger("ajaxSuccess", [xhr, opts]); + } + if (g) jQuery.event.trigger("ajaxComplete", [xhr, opts]); + if (g && ! --jQuery.active) jQuery.event.trigger("ajaxStop"); + if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error'); + + // clean up + setTimeout(function() { + $io.remove(); + xhr.responseXML = null; + }, 100); + }; + + function toXml(s, doc) { + if (window.ActiveXObject) { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + doc.loadXML(s); + } + else + doc = (new DOMParser()).parseFromString(s, 'text/xml'); + return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null; + } + }; +}; +jQuery.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids + +/** + * ajaxForm() provides a mechanism for fully automating form submission. + * + * The advantages of using this method instead of ajaxSubmit() are: + * + * 1: This method will include coordinates for <input type="image" /> elements (if the element + * is used to submit the form). + * 2. This method will include the submit element's name/value data (for the element that was + * used to submit the form). + * 3. This method binds the submit() method to the form for you. + * + * Note that for accurate x/y coordinates of image submit elements in all browsers + * you need to also use the "dimensions" plugin (this method will auto-detect its presence). + * + * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely + * passes the options argument along after properly binding events for submit elements and + * the form itself. See ajaxSubmit for a full description of the options argument. + * + * + * @example + * var options = { + * target: '#myTargetDiv' + * }; + * $('#myForm').ajaxSForm(options); + * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response + * when the form is submitted. + * + * + * @example + * var options = { + * success: function(responseText) { + * alert(responseText); + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Bind form's submit event so that server response is alerted after the form is submitted. + * + * + * @example + * var options = { + * beforeSubmit: function(formArray, jqForm) { + * if (formArray.length == 0) { + * alert('Please enter data.'); + * return false; + * } + * } + * }; + * $('#myForm').ajaxSubmit(options); + * @desc Bind form's submit event so that pre-submit callback is invoked before the form + * is submitted. + * + * + * @name ajaxForm + * @param options object literal containing options which control the form submission process + * @return jQuery + * @cat Plugins/Form + * @type jQuery + * @see ajaxSubmit + * @author jQuery Community + */ +jQuery.fn.ajaxForm = function(options) { + return this.each(function() { + jQuery("input:submit,input:image,button:submit", this).click(function(ev) { + var $form = this.form; + $form.clk = this; + if (this.type == 'image') { + if (ev.offsetX != undefined) { + $form.clk_x = ev.offsetX; + $form.clk_y = ev.offsetY; + } else if (typeof jQuery.fn.offset == 'function') { // try to use dimensions plugin + var offset = jQuery(this).offset(); + $form.clk_x = ev.pageX - offset.left; + $form.clk_y = ev.pageY - offset.top; + } else { + $form.clk_x = ev.pageX - this.offsetLeft; + $form.clk_y = ev.pageY - this.offsetTop; + } + } + // clear form vars + setTimeout(function() { + $form.clk = $form.clk_x = $form.clk_y = null; + }, 10); + }) + }).submit(function(e) { + jQuery(this).ajaxSubmit(options); + return false; + }); +}; + + +/** + * formToArray() gathers form element data into an array of objects that can + * be passed to any of the following ajax functions: $.get, $.post, or load. + * Each object in the array has both a 'name' and 'value' property. An example of + * an array for a simple login form might be: + * + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] + * + * It is this array that is passed to pre-submit callback functions provided to the + * ajaxSubmit() and ajaxForm() methods. + * + * The semantic argument can be used to force form serialization in semantic order. + * This is normally true anyway, unless the form contains input elements of type='image'. + * If your form must be submitted with name/value pairs in semantic order and your form + * contains an input of type='image" then pass true for this arg, otherwise pass false + * (or nothing) to avoid the overhead for this logic. + * + * @example var data = $("#myForm").formToArray(); + * $.post( "myscript.cgi", data ); + * @desc Collect all the data from a form and submit it to the server. + * + * @name formToArray + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower) + * @type Array<Object> + * @cat Plugins/Form + * @see ajaxForm + * @see ajaxSubmit + * @author jQuery Community + */ +jQuery.fn.formToArray = function(semantic) { + var a = []; + if (this.length == 0) return a; + + var form = this[0]; + var els = semantic ? form.getElementsByTagName('*') : form.elements; + if (!els) return a; + for(var i=0, max=els.length; i < max; i++) { + var el = els[i]; + var n = el.name; + if (!n) continue; + + if (semantic && form.clk && el.type == "image") { + // handle image inputs on the fly when semantic == true + if(!el.disabled && form.clk == el) + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + continue; + } + var v = jQuery.fieldValue(el, true); + if (v === null) continue; + if (v.constructor == Array) { + for(var j=0, jmax=v.length; j < jmax; j++) + a.push({name: n, value: v[j]}); + } + else + a.push({name: n, value: v}); + } + + if (!semantic && form.clk) { + // input type=='image' are not found in elements array! handle them here + var inputs = form.getElementsByTagName("input"); + for(var i=0, max=inputs.length; i < max; i++) { + var input = inputs[i]; + var n = input.name; + if(n && !input.disabled && input.type == "image" && form.clk == input) + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + } + } + return a; +}; + + +/** + * Serializes form data into a 'submittable' string. This method will return a string + * in the format: name1=value1&amp;name2=value2 + * + * The semantic argument can be used to force form serialization in semantic order. + * If your form must be submitted with name/value pairs in semantic order then pass + * true for this arg, otherwise pass false (or nothing) to avoid the overhead for + * this logic (which can be significant for very large forms). + * + * @example var data = $("#myForm").formSerialize(); + * $.ajax('POST', "myscript.cgi", data); + * @desc Collect all the data from a form into a single string + * + * @name formSerialize + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower) + * @type String + * @cat Plugins/Form + * @see formToArray + * @author jQuery Community + */ +jQuery.fn.formSerialize = function(semantic) { + //hand off to jQuery.param for proper encoding + return jQuery.param(this.formToArray(semantic)); +}; + + +/** + * Serializes all field elements in the jQuery object into a query string. + * This method will return a string in the format: name1=value1&amp;name2=value2 + * + * The successful argument controls whether or not serialization is limited to + * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. + * + * @example var data = $("input").formSerialize(); + * @desc Collect the data from all successful input elements into a query string + * + * @example var data = $(":radio").formSerialize(); + * @desc Collect the data from all successful radio input elements into a query string + * + * @example var data = $("#myForm :checkbox").formSerialize(); + * @desc Collect the data from all successful checkbox input elements in myForm into a query string + * + * @example var data = $("#myForm :checkbox").formSerialize(false); + * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string + * + * @example var data = $(":input").formSerialize(); + * @desc Collect the data from all successful input, select, textarea and button elements into a query string + * + * @name fieldSerialize + * @param successful true if only successful controls should be serialized (default is true) + * @type String + * @cat Plugins/Form + */ +jQuery.fn.fieldSerialize = function(successful) { + var a = []; + this.each(function() { + var n = this.name; + if (!n) return; + var v = jQuery.fieldValue(this, successful); + if (v && v.constructor == Array) { + for (var i=0,max=v.length; i < max; i++) + a.push({name: n, value: v[i]}); + } + else if (v !== null && typeof v != 'undefined') + a.push({name: this.name, value: v}); + }); + //hand off to jQuery.param for proper encoding + return jQuery.param(a); +}; + + +/** + * Returns the value(s) of the element in the matched set. For example, consider the following form: + * + * <form><fieldset> + * <input name="A" type="text" /> + * <input name="A" type="text" /> + * <input name="B" type="checkbox" value="B1" /> + * <input name="B" type="checkbox" value="B2"/> + * <input name="C" type="radio" value="C1" /> + * <input name="C" type="radio" value="C2" /> + * </fieldset></form> + * + * var v = $(':text').fieldValue(); + * // if no values are entered into the text inputs + * v == ['',''] + * // if values entered into the text inputs are 'foo' and 'bar' + * v == ['foo','bar'] + * + * var v = $(':checkbox').fieldValue(); + * // if neither checkbox is checked + * v === undefined + * // if both checkboxes are checked + * v == ['B1', 'B2'] + * + * var v = $(':radio').fieldValue(); + * // if neither radio is checked + * v === undefined + * // if first radio is checked + * v == ['C1'] + * + * The successful argument controls whether or not the field element must be 'successful' + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. If this value is false the value(s) + * for each element is returned. + * + * Note: This method *always* returns an array. If no valid value can be determined the + * array will be empty, otherwise it will contain one or more values. + * + * @example var data = $("#myPasswordElement").fieldValue(); + * alert(data[0]); + * @desc Alerts the current value of the myPasswordElement element + * + * @example var data = $("#myForm :input").fieldValue(); + * @desc Get the value(s) of the form elements in myForm + * + * @example var data = $("#myForm :checkbox").fieldValue(); + * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object. + * + * @example var data = $("#mySingleSelect").fieldValue(); + * @desc Get the value(s) of the select control + * + * @example var data = $(':text').fieldValue(); + * @desc Get the value(s) of the text input or textarea elements + * + * @example var data = $("#myMultiSelect").fieldValue(); + * @desc Get the values for the select-multiple control + * + * @name fieldValue + * @param Boolean successful true if only the values for successful controls should be returned (default is true) + * @type Array<String> + * @cat Plugins/Form + */ +jQuery.fn.fieldValue = function(successful) { + for (var val=[], i=0, max=this.length; i < max; i++) { + var el = this[i]; + var v = jQuery.fieldValue(el, successful); + if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) + continue; + v.constructor == Array ? jQuery.merge(val, v) : val.push(v); + } + return val; +}; + +/** + * Returns the value of the field element. + * + * The successful argument controls whether or not the field element must be 'successful' + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. If the given element is not + * successful and the successful arg is not false then the returned value will be null. + * + * Note: If the successful flag is true (default) but the element is not successful, the return will be null + * Note: The value returned for a successful select-multiple element will always be an array. + * Note: If the element has no value the return value will be undefined. + * + * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]); + * @desc Gets the current value of the myPasswordElement element + * + * @name fieldValue + * @param Element el The DOM element for which the value will be returned + * @param Boolean successful true if value returned must be for a successful controls (default is true) + * @type String or Array<String> or null or undefined + * @cat Plugins/Form + */ +jQuery.fieldValue = function(el, successful) { + var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); + if (typeof successful == 'undefined') successful = true; + + if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || + (t == 'checkbox' || t == 'radio') && !el.checked || + (t == 'submit' || t == 'image') && el.form && el.form.clk != el || + tag == 'select' && el.selectedIndex == -1)) + return null; + + if (tag == 'select') { + var index = el.selectedIndex; + if (index < 0) return null; + var a = [], ops = el.options; + var one = (t == 'select-one'); + var max = (one ? index+1 : ops.length); + for(var i=(one ? index : 0); i < max; i++) { + var op = ops[i]; + if (op.selected) { + // extra pain for IE... + var v = jQuery.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value; + if (one) return v; + a.push(v); + } + } + return a; + } + return el.value; +}; + + +/** + * Clears the form data. Takes the following actions on the form's input fields: + * - input text fields will have their 'value' property set to the empty string + * - select elements will have their 'selectedIndex' property set to -1 + * - checkbox and radio inputs will have their 'checked' property set to false + * - inputs of type submit, button, reset, and hidden will *not* be effected + * - button elements will *not* be effected + * + * @example $('form').clearForm(); + * @desc Clears all forms on the page. + * + * @name clearForm + * @type jQuery + * @cat Plugins/Form + * @see resetForm + */ +jQuery.fn.clearForm = function() { + return this.each(function() { + jQuery('input,select,textarea', this).clearFields(); + }); +}; + +/** + * Clears the selected form elements. Takes the following actions on the matched elements: + * - input text fields will have their 'value' property set to the empty string + * - select elements will have their 'selectedIndex' property set to -1 + * - checkbox and radio inputs will have their 'checked' property set to false + * - inputs of type submit, button, reset, and hidden will *not* be effected + * - button elements will *not* be effected + * + * @example $('.myInputs').clearFields(); + * @desc Clears all inputs with class myInputs + * + * @name clearFields + * @type jQuery + * @cat Plugins/Form + * @see clearForm + */ +jQuery.fn.clearFields = jQuery.fn.clearInputs = function() { + return this.each(function() { + var t = this.type, tag = this.tagName.toLowerCase(); + if (t == 'text' || t == 'password' || tag == 'textarea') + this.value = ''; + else if (t == 'checkbox' || t == 'radio') + this.checked = false; + else if (tag == 'select') + this.selectedIndex = -1; + }); +}; + + +/** + * Resets the form data. Causes all form elements to be reset to their original value. + * + * @example $('form').resetForm(); + * @desc Resets all forms on the page. + * + * @name resetForm + * @type jQuery + * @cat Plugins/Form + * @see clearForm + */ +jQuery.fn.resetForm = function() { + return this.each(function() { + // guard against an input with the name of 'reset' + // note that IE reports the reset function as an 'object' + if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) + this.reset(); + }); +}; diff --git a/fannie/src/jquery/jquery.js b/fannie/src/jquery/jquery.js new file mode 100644 index 000000000..b170a78f8 --- /dev/null +++ b/fannie/src/jquery/jquery.js @@ -0,0 +1,155 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? +e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= +j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, +"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= +true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| +c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", +L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, +"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ +a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], +d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== +a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& +!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= +true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", +i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", +" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= +this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= +e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= +null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, +"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= +a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, +isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= +{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; +if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& +!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, +toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, +u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), +function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; +if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; +for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- +1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, +relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= +l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; +h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= +m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| +!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= +h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, +gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; +c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? +a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& +this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| +u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== +1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); +this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], +"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, +animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= +j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); +this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| +c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? +function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= +this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; +k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& +f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); + diff --git a/fannie/src/jquery/jquery.metadata.js b/fannie/src/jquery/jquery.metadata.js new file mode 100644 index 000000000..6a984dbce --- /dev/null +++ b/fannie/src/jquery/jquery.metadata.js @@ -0,0 +1,122 @@ +/* + * Metadata - jQuery plugin for parsing metadata from elements + * + * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + * + */ + +/** + * Sets the type of metadata to use. Metadata is encoded in JSON, and each property + * in the JSON will become a property of the element itself. + * + * There are three supported types of metadata storage: + * + * attr: Inside an attribute. The name parameter indicates *which* attribute. + * + * class: Inside the class attribute, wrapped in curly braces: { } + * + * elem: Inside a child element (e.g. a script tag). The + * name parameter indicates *which* element. + * + * The metadata for an element is loaded the first time the element is accessed via jQuery. + * + * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements + * matched by expr, then redefine the metadata type and run another $(expr) for other elements. + * + * @name $.metadata.setType + * + * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p> + * @before $.metadata.setType("class") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from the class attribute + * + * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p> + * @before $.metadata.setType("attr", "data") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a "data" attribute + * + * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p> + * @before $.metadata.setType("elem", "script") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a nested script element + * + * @param String type The encoding type + * @param String name The name of the attribute to be used to get metadata (optional) + * @cat Plugins/Metadata + * @descr Sets the type of encoding to be used when loading metadata for the first time + * @type undefined + * @see metadata() + */ + +(function($) { + +$.extend({ + metadata : { + defaults : { + type: 'class', + name: 'metadata', + cre: /({.*})/, + single: 'metadata' + }, + setType: function( type, name ){ + this.defaults.type = type; + this.defaults.name = name; + }, + get: function( elem, opts ){ + var settings = $.extend({},this.defaults,opts); + // check for empty string in single property + if ( !settings.single.length ) settings.single = 'metadata'; + + var data = $.data(elem, settings.single); + // returned cached data if it already exists + if ( data ) return data; + + data = "{}"; + + if ( settings.type == "class" ) { + var m = settings.cre.exec( elem.className ); + if ( m ) + data = m[1]; + } else if ( settings.type == "elem" ) { + if( !elem.getElementsByTagName ) + return undefined; + var e = elem.getElementsByTagName(settings.name); + if ( e.length ) + data = $.trim(e[0].innerHTML); + } else if ( elem.getAttribute != undefined ) { + var attr = elem.getAttribute( settings.name ); + if ( attr ) + data = attr; + } + + if ( data.indexOf( '{' ) <0 ) + data = "{" + data + "}"; + + data = eval("(" + data + ")"); + + $.data( elem, settings.single, data ); + return data; + } + } +}); + +/** + * Returns the metadata object for the first member of the jQuery object. + * + * @name metadata + * @descr Returns element's metadata object + * @param Object opts An object contianing settings to override the defaults + * @type jQuery + * @cat Plugins/Metadata + */ +$.fn.metadata = function( opts ){ + return $.metadata.get( this[0], opts ); +}; + +})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/jquery.tablesorter.js b/fannie/src/jquery/jquery.tablesorter.js new file mode 100644 index 000000000..9b5873122 --- /dev/null +++ b/fannie/src/jquery/jquery.tablesorter.js @@ -0,0 +1,1031 @@ +/* + * + * TableSorter 2.0 - Client-side table sorting with ease! + * Version 2.0.5b + * @requires jQuery v1.2.3 + * + * Copyright (c) 2007 Christian Bach + * Examples and docs at: http://tablesorter.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ +/** + * + * @description Create a sortable table with multi-column sorting capabilitys + * + * @example $('table').tablesorter(); + * @desc Create a simple tablesorter interface. + * + * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] }); + * @desc Create a tablesorter interface and sort on the first and secound column column headers. + * + * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } }); + * + * @desc Create a tablesorter interface and disableing the first and second column headers. + * + * + * @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } }); + * + * @desc Create a tablesorter interface and set a column parser for the first + * and second column. + * + * + * @param Object + * settings An object literal containing key/value pairs to provide + * optional settings. + * + * + * @option String cssHeader (optional) A string of the class name to be appended + * to sortable tr elements in the thead of the table. Default value: + * "header" + * + * @option String cssAsc (optional) A string of the class name to be appended to + * sortable tr elements in the thead on a ascending sort. Default value: + * "headerSortUp" + * + * @option String cssDesc (optional) A string of the class name to be appended + * to sortable tr elements in the thead on a descending sort. Default + * value: "headerSortDown" + * + * @option String sortInitialOrder (optional) A string of the inital sorting + * order can be asc or desc. Default value: "asc" + * + * @option String sortMultisortKey (optional) A string of the multi-column sort + * key. Default value: "shiftKey" + * + * @option String textExtraction (optional) A string of the text-extraction + * method to use. For complex html structures inside td cell set this + * option to "complex", on large tables the complex option can be slow. + * Default value: "simple" + * + * @option Object headers (optional) An array containing the forces sorting + * rules. This option let's you specify a default sorting rule. Default + * value: null + * + * @option Array sortList (optional) An array containing the forces sorting + * rules. This option let's you specify a default sorting rule. Default + * value: null + * + * @option Array sortForce (optional) An array containing forced sorting rules. + * This option let's you specify a default sorting rule, which is + * prepended to user-selected rules. Default value: null + * + * @option Boolean sortLocaleCompare (optional) Boolean flag indicating whatever + * to use String.localeCampare method or not. Default set to true. + * + * + * @option Array sortAppend (optional) An array containing forced sorting rules. + * This option let's you specify a default sorting rule, which is + * appended to user-selected rules. Default value: null + * + * @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter + * should apply fixed widths to the table columns. This is usefull when + * using the pager companion plugin. This options requires the dimension + * jquery plugin. Default value: false + * + * @option Boolean cancelSelection (optional) Boolean flag indicating if + * tablesorter should cancel selection of the table headers text. + * Default value: true + * + * @option Boolean debug (optional) Boolean flag indicating if tablesorter + * should display debuging information usefull for development. + * + * @type jQuery + * + * @name tablesorter + * + * @cat Plugins/Tablesorter + * + * @author Christian Bach/christian.bach@polyester.se + */ + +(function ($) { + $.extend({ + tablesorter: new + function () { + + var parsers = [], + widgets = []; + + this.defaults = { + cssHeader: "header", + cssAsc: "headerSortUp", + cssDesc: "headerSortDown", + cssChildRow: "expand-child", + sortInitialOrder: "asc", + sortMultiSortKey: "shiftKey", + sortForce: null, + sortAppend: null, + sortLocaleCompare: true, + textExtraction: "simple", + parsers: {}, widgets: [], + widgetZebra: { + css: ["even", "odd"] + }, headers: {}, widthFixed: false, + cancelSelection: true, + sortList: [], + headerList: [], + dateFormat: "us", + decimal: '/\.|\,/g', + onRenderHeader: null, + selectorHeaders: 'thead th', + debug: false + }; + + /* debuging utils */ + + function benchmark(s, d) { + log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); + } + + this.benchmark = benchmark; + + function log(s) { + if (typeof console != "undefined" && typeof console.debug != "undefined") { + console.log(s); + } else { + alert(s); + } + } + + /* parsers utils */ + + function buildParserCache(table, $headers) { + + if (table.config.debug) { + var parsersDebug = ""; + } + + if (table.tBodies.length == 0) return; // In the case of empty tables + var rows = table.tBodies[0].rows; + + if (rows[0]) { + + var list = [], + cells = rows[0].cells, + l = cells.length; + + for (var i = 0; i < l; i++) { + + var p = false; + + if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) { + + p = getParserById($($headers[i]).metadata().sorter); + + } else if ((table.config.headers[i] && table.config.headers[i].sorter)) { + + p = getParserById(table.config.headers[i].sorter); + } + if (!p) { + + p = detectParserForColumn(table, rows, -1, i); + } + + if (table.config.debug) { + parsersDebug += "column:" + i + " parser:" + p.id + "\n"; + } + + list.push(p); + } + } + + if (table.config.debug) { + log(parsersDebug); + } + + return list; + }; + + function detectParserForColumn(table, rows, rowIndex, cellIndex) { + var l = parsers.length, + node = false, + nodeValue = false, + keepLooking = true; + while (nodeValue == '' && keepLooking) { + rowIndex++; + if (rows[rowIndex]) { + node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex); + nodeValue = trimAndGetNodeText(table.config, node); + if (table.config.debug) { + log('Checking if value was empty on row:' + rowIndex); + } + } else { + keepLooking = false; + } + } + for (var i = 1; i < l; i++) { + if (parsers[i].is(nodeValue, table, node)) { + return parsers[i]; + } + } + // 0 is always the generic parser (text) + return parsers[0]; + } + + function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) { + return rows[rowIndex].cells[cellIndex]; + } + + function trimAndGetNodeText(config, node) { + return $.trim(getElementText(config, node)); + } + + function getParserById(name) { + var l = parsers.length; + for (var i = 0; i < l; i++) { + if (parsers[i].id.toLowerCase() == name.toLowerCase()) { + return parsers[i]; + } + } + return false; + } + + /* utils */ + + function buildCache(table) { + + if (table.config.debug) { + var cacheTime = new Date(); + } + + var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0, + totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0, + parsers = table.config.parsers, + cache = { + row: [], + normalized: [] + }; + + for (var i = 0; i < totalRows; ++i) { + + /** Add the table data to main data array */ + var c = $(table.tBodies[0].rows[i]), + cols = []; + + // if this is a child row, add it to the last row's children and + // continue to the next row + if (c.hasClass(table.config.cssChildRow)) { + cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c); + // go to the next for loop + continue; + } + + cache.row.push(c); + + for (var j = 0; j < totalCells; ++j) { + cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j])); + } + + cols.push(cache.normalized.length); // add position for rowCache + cache.normalized.push(cols); + cols = null; + }; + + if (table.config.debug) { + benchmark("Building cache for " + totalRows + " rows:", cacheTime); + } + + return cache; + }; + + function getElementText(config, node) { + + var text = ""; + + if (!node) return ""; + + if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false; + + if (config.textExtraction == "simple") { + if (config.supportsTextContent) { + text = node.textContent; + } else { + if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) { + text = node.childNodes[0].innerHTML; + } else { + text = node.innerHTML; + } + } + } else { + if (typeof(config.textExtraction) == "function") { + text = config.textExtraction(node); + } else { + text = $(node).text(); + } + } + return text; + } + + function appendToTable(table, cache) { + + if (table.config.debug) { + var appendTime = new Date() + } + + var c = cache, + r = c.row, + n = c.normalized, + totalRows = n.length, + checkCell = (n[0].length - 1), + tableBody = $(table.tBodies[0]), + rows = []; + + + for (var i = 0; i < totalRows; i++) { + var pos = n[i][checkCell]; + + rows.push(r[pos]); + + if (!table.config.appender) { + + //var o = ; + var l = r[pos].length; + for (var j = 0; j < l; j++) { + tableBody[0].appendChild(r[pos][j]); + } + + // + } + } + + + + if (table.config.appender) { + + table.config.appender(table, rows); + } + + rows = null; + + if (table.config.debug) { + benchmark("Rebuilt table:", appendTime); + } + + // apply table widgets + applyWidget(table); + + // trigger sortend + setTimeout(function () { + $(table).trigger("sortEnd"); + }, 0); + + }; + + function buildHeaders(table) { + + if (table.config.debug) { + var time = new Date(); + } + + var meta = ($.metadata) ? true : false; + + var header_index = computeTableHeaderCellIndexes(table); + + $tableHeaders = $(table.config.selectorHeaders, table).each(function (index) { + + this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex]; + // this.column = index; + this.order = formatSortingOrder(table.config.sortInitialOrder); + + + this.count = this.order; + + if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true; + if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index); + + if (!this.sortDisabled) { + var $th = $(this).addClass(table.config.cssHeader); + if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th); + } + + // add cell to headerList + table.config.headerList[index] = this; + }); + + if (table.config.debug) { + benchmark("Built headers:", time); + log($tableHeaders); + } + + return $tableHeaders; + + }; + + // from: + // http://www.javascripttoolbox.com/lib/table/examples.php + // http://www.javascripttoolbox.com/temp/table_cellindex.html + + + function computeTableHeaderCellIndexes(t) { + var matrix = []; + var lookup = {}; + var thead = t.getElementsByTagName('THEAD')[0]; + var trs = thead.getElementsByTagName('TR'); + + for (var i = 0; i < trs.length; i++) { + var cells = trs[i].cells; + for (var j = 0; j < cells.length; j++) { + var c = cells[j]; + + var rowIndex = c.parentNode.rowIndex; + var cellId = rowIndex + "-" + c.cellIndex; + var rowSpan = c.rowSpan || 1; + var colSpan = c.colSpan || 1 + var firstAvailCol; + if (typeof(matrix[rowIndex]) == "undefined") { + matrix[rowIndex] = []; + } + // Find first available column in the first row + for (var k = 0; k < matrix[rowIndex].length + 1; k++) { + if (typeof(matrix[rowIndex][k]) == "undefined") { + firstAvailCol = k; + break; + } + } + lookup[cellId] = firstAvailCol; + for (var k = rowIndex; k < rowIndex + rowSpan; k++) { + if (typeof(matrix[k]) == "undefined") { + matrix[k] = []; + } + var matrixrow = matrix[k]; + for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) { + matrixrow[l] = "x"; + } + } + } + } + return lookup; + } + + function checkCellColSpan(table, rows, row) { + var arr = [], + r = table.tHead.rows, + c = r[row].cells; + + for (var i = 0; i < c.length; i++) { + var cell = c[i]; + + if (cell.colSpan > 1) { + arr = arr.concat(checkCellColSpan(table, headerArr, row++)); + } else { + if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) { + arr.push(cell); + } + // headerArr[row] = (i+row); + } + } + return arr; + }; + + function checkHeaderMetadata(cell) { + if (($.metadata) && ($(cell).metadata().sorter === false)) { + return true; + }; + return false; + } + + function checkHeaderOptions(table, i) { + if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { + return true; + }; + return false; + } + + function checkHeaderOptionsSortingLocked(table, i) { + if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder; + return false; + } + + function applyWidget(table) { + var c = table.config.widgets; + var l = c.length; + for (var i = 0; i < l; i++) { + + getWidgetById(c[i]).format(table); + } + + } + + function getWidgetById(name) { + var l = widgets.length; + for (var i = 0; i < l; i++) { + if (widgets[i].id.toLowerCase() == name.toLowerCase()) { + return widgets[i]; + } + } + }; + + function formatSortingOrder(v) { + if (typeof(v) != "Number") { + return (v.toLowerCase() == "desc") ? 1 : 0; + } else { + return (v == 1) ? 1 : 0; + } + } + + function isValueInArray(v, a) { + var l = a.length; + for (var i = 0; i < l; i++) { + if (a[i][0] == v) { + return true; + } + } + return false; + } + + function setHeadersCss(table, $headers, list, css) { + // remove all header information + $headers.removeClass(css[0]).removeClass(css[1]); + + var h = []; + $headers.each(function (offset) { + if (!this.sortDisabled) { + h[this.column] = $(this); + } + }); + + var l = list.length; + for (var i = 0; i < l; i++) { + h[list[i][0]].addClass(css[list[i][1]]); + } + } + + function fixColumnWidth(table, $headers) { + var c = table.config; + if (c.widthFixed) { + var colgroup = $('<colgroup>'); + $("tr:first td", table.tBodies[0]).each(function () { + colgroup.append($('<col>').css('width', $(this).width())); + }); + $(table).prepend(colgroup); + }; + } + + function updateHeaderSortCount(table, sortList) { + var c = table.config, + l = sortList.length; + for (var i = 0; i < l; i++) { + var s = sortList[i], + o = c.headerList[s[0]]; + o.count = s[1]; + o.count++; + } + } + + /* sorting methods */ + + function multisort(table, sortList, cache) { + + if (table.config.debug) { + var sortTime = new Date(); + } + + var dynamicExp = "var sortWrapper = function(a,b) {", + l = sortList.length; + + // TODO: inline functions. + for (var i = 0; i < l; i++) { + + var c = sortList[i][0]; + var order = sortList[i][1]; + // var s = (getCachedSortType(table.config.parsers,c) == "text") ? + // ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? + // "sortNumeric" : "sortNumericDesc"); + // var s = (table.config.parsers[c].type == "text") ? ((order == 0) + // ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ? + // makeSortNumeric(c) : makeSortNumericDesc(c)); + var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c)); + var e = "e" + i; + + dynamicExp += "var " + e + " = " + s; // + "(a[" + c + "],b[" + c + // + "]); "; + dynamicExp += "if(" + e + ") { return " + e + "; } "; + dynamicExp += "else { "; + + } + + // if value is the same keep orignal order + var orgOrderCol = cache.normalized[0].length - 1; + dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; + + for (var i = 0; i < l; i++) { + dynamicExp += "}; "; + } + + dynamicExp += "return 0; "; + dynamicExp += "}; "; + + if (table.config.debug) { + benchmark("Evaling expression:" + dynamicExp, new Date()); + } + + eval(dynamicExp); + + cache.normalized.sort(sortWrapper); + + if (table.config.debug) { + benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime); + } + + return cache; + }; + + function makeSortFunction(type, direction, index) { + var a = "a[" + index + "]", + b = "b[" + index + "]"; + if (type == 'text' && direction == 'asc') { + return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));"; + } else if (type == 'text' && direction == 'desc') { + return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));"; + } else if (type == 'numeric' && direction == 'asc') { + return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));"; + } else if (type == 'numeric' && direction == 'desc') { + return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));"; + } + }; + + function makeSortText(i) { + return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));"; + }; + + function makeSortTextDesc(i) { + return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));"; + }; + + function makeSortNumeric(i) { + return "a[" + i + "]-b[" + i + "];"; + }; + + function makeSortNumericDesc(i) { + return "b[" + i + "]-a[" + i + "];"; + }; + + function sortText(a, b) { + if (table.config.sortLocaleCompare) return a.localeCompare(b); + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); + }; + + function sortTextDesc(a, b) { + if (table.config.sortLocaleCompare) return b.localeCompare(a); + return ((b < a) ? -1 : ((b > a) ? 1 : 0)); + }; + + function sortNumeric(a, b) { + return a - b; + }; + + function sortNumericDesc(a, b) { + return b - a; + }; + + function getCachedSortType(parsers, i) { + return parsers[i].type; + }; /* public methods */ + this.construct = function (settings) { + return this.each(function () { + // if no thead or tbody quit. + if (!this.tHead || !this.tBodies) return; + // declare + var $this, $document, $headers, cache, config, shiftDown = 0, + sortOrder; + // new blank config object + this.config = {}; + // merge and extend. + config = $.extend(this.config, $.tablesorter.defaults, settings); + // store common expression for speed + $this = $(this); + // save the settings where they read + $.data(this, "tablesorter", config); + // build headers + $headers = buildHeaders(this); + // try to auto detect column type, and store in tables config + this.config.parsers = buildParserCache(this, $headers); + // build the cache for the tbody cells + cache = buildCache(this); + // get the css class names, could be done else where. + var sortCSS = [config.cssDesc, config.cssAsc]; + // fixate columns if the users supplies the fixedWidth option + fixColumnWidth(this); + // apply event handling to headers + // this is to big, perhaps break it out? + $headers.click( + + function (e) { + var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; + if (!this.sortDisabled && totalRows > 0) { + // Only call sortStart if sorting is + // enabled. + $this.trigger("sortStart"); + // store exp, for speed + var $cell = $(this); + // get current column index + var i = this.column; + // get current column sort order + this.order = this.count++ % 2; + // always sort on the locked order. + if(this.lockedOrder) this.order = this.lockedOrder; + + // user only whants to sort on one + // column + if (!e[config.sortMultiSortKey]) { + // flush the sort list + config.sortList = []; + if (config.sortForce != null) { + var a = config.sortForce; + for (var j = 0; j < a.length; j++) { + if (a[j][0] != i) { + config.sortList.push(a[j]); + } + } + } + // add column to sort list + config.sortList.push([i, this.order]); + // multi column sorting + } else { + // the user has clicked on an all + // ready sortet column. + if (isValueInArray(i, config.sortList)) { + // revers the sorting direction + // for all tables. + for (var j = 0; j < config.sortList.length; j++) { + var s = config.sortList[j], + o = config.headerList[s[0]]; + if (s[0] == i) { + o.count = s[1]; + o.count++; + s[1] = o.count % 2; + } + } + } else { + // add column to sort list array + config.sortList.push([i, this.order]); + } + }; + setTimeout(function () { + // set css for headers + setHeadersCss($this[0], $headers, config.sortList, sortCSS); + appendToTable( + $this[0], multisort( + $this[0], config.sortList, cache) + ); + }, 1); + // stop normal event by returning false + return false; + } + // cancel selection + }).mousedown(function () { + if (config.cancelSelection) { + this.onselectstart = function () { + return false + }; + return false; + } + }); + // apply easy methods that trigger binded events + $this.bind("update", function () { + var me = this; + setTimeout(function () { + // rebuild parsers. + me.config.parsers = buildParserCache( + me, $headers); + // rebuild the cache map + cache = buildCache(me); + }, 1); + }).bind("updateCell", function (e, cell) { + var config = this.config; + // get position from the dom. + var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex]; + // update cache + cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format( + getElementText(config, cell), cell); + }).bind("sorton", function (e, list) { + $(this).trigger("sortStart"); + config.sortList = list; + // update and store the sortlist + var sortList = config.sortList; + // update header count index + updateHeaderSortCount(this, sortList); + // set css for headers + setHeadersCss(this, $headers, sortList, sortCSS); + // sort the table and append it to the dom + appendToTable(this, multisort(this, sortList, cache)); + }).bind("appendCache", function () { + appendToTable(this, cache); + }).bind("applyWidgetId", function (e, id) { + getWidgetById(id).format(this); + }).bind("applyWidgets", function () { + // apply widgets + applyWidget(this); + }); + if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { + config.sortList = $(this).metadata().sortlist; + } + // if user has supplied a sort list to constructor. + if (config.sortList.length > 0) { + $this.trigger("sorton", [config.sortList]); + } + // apply widgets + applyWidget(this); + }); + }; + this.addParser = function (parser) { + var l = parsers.length, + a = true; + for (var i = 0; i < l; i++) { + if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { + a = false; + } + } + if (a) { + parsers.push(parser); + }; + }; + this.addWidget = function (widget) { + widgets.push(widget); + }; + this.formatFloat = function (s) { + var i = parseFloat(s); + return (isNaN(i)) ? 0 : i; + }; + this.formatInt = function (s) { + var i = parseInt(s); + return (isNaN(i)) ? 0 : i; + }; + this.isDigit = function (s, config) { + // replace all an wanted chars and match. + return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, ''))); + }; + this.clearTableBody = function (table) { + if ($.browser.msie) { + function empty() { + while (this.firstChild) + this.removeChild(this.firstChild); + } + empty.apply(table.tBodies[0]); + } else { + table.tBodies[0].innerHTML = ""; + } + }; + } + }); + + // extend plugin scope + $.fn.extend({ + tablesorter: $.tablesorter.construct + }); + + // make shortcut + var ts = $.tablesorter; + + // add default parsers + ts.addParser({ + id: "text", + is: function (s) { + return true; + }, format: function (s) { + return $.trim(s.toLocaleLowerCase()); + }, type: "text" + }); + + ts.addParser({ + id: "digit", + is: function (s, table) { + var c = table.config; + return $.tablesorter.isDigit(s, c); + }, format: function (s) { + return $.tablesorter.formatFloat(s); + }, type: "numeric" + }); + + ts.addParser({ + id: "currency", + is: function (s) { + return /^[£$€?.]/.test(s); + }, format: function (s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), "")); + }, type: "numeric" + }); + + ts.addParser({ + id: "ipAddress", + is: function (s) { + return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); + }, format: function (s) { + var a = s.split("."), + r = "", + l = a.length; + for (var i = 0; i < l; i++) { + var item = a[i]; + if (item.length == 2) { + r += "0" + item; + } else { + r += item; + } + } + return $.tablesorter.formatFloat(r); + }, type: "numeric" + }); + + ts.addParser({ + id: "url", + is: function (s) { + return /^(https?|ftp|file):\/\/$/.test(s); + }, format: function (s) { + return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), '')); + }, type: "text" + }); + + ts.addParser({ + id: "isoDate", + is: function (s) { + return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); + }, format: function (s) { + return $.tablesorter.formatFloat((s != "") ? new Date(s.replace( + new RegExp(/-/g), "/")).getTime() : "0"); + }, type: "numeric" + }); + + ts.addParser({ + id: "percent", + is: function (s) { + return /\%$/.test($.trim(s)); + }, format: function (s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), "")); + }, type: "numeric" + }); + + ts.addParser({ + id: "usLongDate", + is: function (s) { + return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); + }, format: function (s) { + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, type: "numeric" + }); + + ts.addParser({ + id: "shortDate", + is: function (s) { + return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); + }, format: function (s, table) { + var c = table.config; + s = s.replace(/\-/g, "/"); + if (c.dateFormat == "us") { + // reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); + } else if (c.dateFormat == "uk") { + // reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); + } else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); + } + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, type: "numeric" + }); + ts.addParser({ + id: "time", + is: function (s) { + return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); + }, format: function (s) { + return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); + }, type: "numeric" + }); + ts.addParser({ + id: "metadata", + is: function (s) { + return false; + }, format: function (s, table, cell) { + var c = table.config, + p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; + return $(cell).metadata()[p]; + }, type: "numeric" + }); + // add default widgets + ts.addWidget({ + id: "zebra", + format: function (table) { + if (table.config.debug) { + var time = new Date(); + } + var $tr, row = -1, + odd; + // loop through the visible rows + $("tr:visible", table.tBodies[0]).each(function (i) { + $tr = $(this); + // style children rows the same way the parent + // row was styled + if (!$tr.hasClass(table.config.cssChildRow)) row++; + odd = (row % 2 == 0); + $tr.removeClass( + table.config.widgetZebra.css[odd ? 0 : 1]).addClass( + table.config.widgetZebra.css[odd ? 1 : 0]) + }); + if (table.config.debug) { + $.tablesorter.benchmark("Applying Zebra widget", time); + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/jquery.tablesorter.min.js b/fannie/src/jquery/jquery.tablesorter.min.js new file mode 100644 index 000000000..b8605df1e --- /dev/null +++ b/fannie/src/jquery/jquery.tablesorter.min.js @@ -0,0 +1,4 @@ + +(function($){$.extend({tablesorter:new +function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1 +var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery); \ No newline at end of file diff --git a/fannie/src/jquery/js/jquery-1.4.2.min.js b/fannie/src/jquery/js/jquery-1.4.2.min.js new file mode 100644 index 000000000..7c2430802 --- /dev/null +++ b/fannie/src/jquery/js/jquery-1.4.2.min.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? +e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= +j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, +"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= +true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| +c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", +L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, +"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ +a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], +d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== +a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& +!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= +true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", +i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", +" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= +this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= +e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= +null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, +"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= +a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, +isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= +{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; +if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& +!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, +toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, +u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), +function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; +if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; +for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- +1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, +relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= +l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; +h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= +m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| +!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= +h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, +gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; +c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? +a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& +this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| +u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== +1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); +this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], +"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, +animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= +j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); +this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| +c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? +function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= +this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; +k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& +f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/fannie/src/jquery/js/jquery-1.5.min.js b/fannie/src/jquery/js/jquery-1.5.min.js new file mode 100644 index 000000000..9144b8ae9 --- /dev/null +++ b/fannie/src/jquery/js/jquery-1.5.min.js @@ -0,0 +1,16 @@ +/*! + * jQuery JavaScript Library v1.5 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Jan 31 08:31:29 2011 -0500 + */ +(function(a,b){function b$(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function bX(a){if(!bR[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bR[a]=c}return bR[a]}function bW(a,b){var c={};d.each(bV.concat.apply([],bV.slice(0,b)),function(){c[this]=a});return c}function bJ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f=a.converters,g,h=e.length,i,j=e[0],k,l,m,n,o;for(g=1;g<h;g++){k=j,j=e[g];if(j==="*")j=k;else if(k!=="*"&&k!==j){l=k+" "+j,m=f[l]||f["* "+j];if(!m){o=b;for(n in f){i=n.split(" ");if(i[0]===k||i[0]==="*"){o=f[i[1]+" "+j];if(o){n=f[n],n===!0?m=o:o===!0&&(m=n);break}}}}!m&&!o&&d.error("No conversion from "+l.replace(" "," to ")),m!==!0&&(c=m?m(c):o(n(c)))}}return c}function bI(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bH(a,b,c,e){d.isArray(b)&&b.length?d.each(b,function(b,f){c||bp.test(a)?e(a,f):bH(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)}):c||b==null||typeof b!=="object"?e(a,b):d.isArray(b)||d.isEmptyObject(b)?e(a,""):d.each(b,function(b,d){bH(a+"["+b+"]",d,c,e)})}function bG(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bD,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(g[l]?l=b:(c.dataTypes.unshift(l),l=bG(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bG(a,c,d,e,"*",g));return l}function bF(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bz),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bn(a,b,c){var e=b==="width"?bh:bi,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function _(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(q,"`").replace(r,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,p,q=[],r=[],s=d._data(this,u);typeof s==="function"&&(s=s.events);if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(o,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,p=f.handleObj.origHandler.apply(f.elem,arguments);if(p===!1||a.isPropagationStopped()){c=f.level,p===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,b,c){c[0].type=a;return d.event.handle.apply(b,c)}function w(){return!0}function v(){return!1}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");e.type="text/javascript",d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a,c){if(a==null){if(e)return e;e=a={}}c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.then(c.cancel,b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments,c=b.length,e=c<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),f=e.promise(),g;c>1?(g=Array(c),d.each(b,function(a,b){d.when(b).then(function(b){g[a]=arguments.length>1?E.call(arguments,0):b,--c||e.resolveWith(f,g)},e.reject)})):e!==a&&e.resolve(a);return f},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return a.jQuery=a.$=d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option"));if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:b.getElementsByTagName("input")[0].value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,_scriptEval:null,noCloneEvent:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},g.disabled=!0,d.support.optDisabled=!h.disabled,d.support.scriptEval=function(){if(d.support._scriptEval===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();e.type="text/javascript";try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(d.support._scriptEval=!0,delete a[f]):d.support._scriptEval=!1,b.removeChild(e),b=e=f=null}return d.support._scriptEval};try{delete b.test}catch(i){d.support.deleteExpando=!1}b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function j(){d.support.noCloneEvent=!1,b.detachEvent("onclick",j)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var k=c.createDocumentFragment();k.appendChild(b.firstChild),d.support.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var l=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=l("submit"),d.support.changeBubbles=l("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!d.isEmptyObject(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={}),typeof c==="object"&&(f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c)),i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,i=g?b[d.expando]:d.expando;if(!h[i])return;if(c){var j=e?h[i][f]:h[i];if(j){delete j[c];if(!d.isEmptyObject(j))return}}if(e){delete h[i][f];if(!d.isEmptyObject(h[i]))return}var k=h[i][f];d.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},h[i][f]=k):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var g=/[\n\t\r]/g,h=/\s+/,i=/\r/g,j=/^(?:href|src|style)$/,k=/^(?:button|input)$/i,l=/^(?:button|input|object|select|textarea)$/i,m=/^a(?:rea)?$/i,n=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(h);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",i=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(i+=" "+b[j]);f.className=d.trim(i)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(h);for(var e=0,f=this.length;e<f;e++){var i=this[e];if(i.nodeType===1&&i.className)if(a){var j=(" "+i.className+" ").replace(g," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");i.className=d.trim(j)}else i.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,i=d(this),j=b,k=a.split(h);while(f=k[g++])j=e?j:!i.hasClass(f),i[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(g," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,j=c.type==="select-one";if(f<0)return null;for(var k=j?f:0,l=j?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(j)return a;g.push(a)}}return g}if(n.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(i,"")}return b}var o=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){o&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&n.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=j.test(c);if(c==="selected"&&!d.support.optSelected){var n=a.parentNode;n&&(n.selectedIndex,n.parentNode&&n.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&k.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:l.test(a.nodeName)||m.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var o=/\.(.*)$/,p=/^(?:textarea|input|select)$/i,q=/\./g,r=/ /g,s=/[^\w\s.|`]/g,t=function(a){return a.replace(s,"\\$&")},u="events";d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a);if(f===!1)f=v;else if(!f)return;var h,i;f.handler&&(h=f,f=h.handler),f.guid||(f.guid=d.guid++);var j=d._data(c);if(!j)return;var k=j[u],l=j.handle;typeof k==="function"?(l=k.handle,k=k.events):k||(c.nodeType||(j[u]=j=function(){}),j.events=k={}),l||(j.handle=l=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(l.elem,arguments):b}),l.elem=c,e=e.split(" ");var m,n=0,o;while(m=e[n++]){i=h?d.extend({},h):{handler:f,data:g},m.indexOf(".")>-1?(o=m.split("."),m=o.shift(),i.namespace=o.slice(0).sort().join(".")):(o=[],i.namespace=""),i.type=m,i.guid||(i.guid=f.guid);var p=k[m],q=d.event.special[m]||{};if(!p){p=k[m]=[];if(!q.setup||q.setup.call(c,g,o,l)===!1)c.addEventListener?c.addEventListener(m,l,!1):c.attachEvent&&c.attachEvent("on"+m,l)}q.add&&(q.add.call(c,i),i.handler.guid||(i.handler.guid=f.guid)),p.push(i),d.event.global[m]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),w=s&&s[u];if(!s||!w)return;typeof w==="function"&&(s=w,w=w.events),c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in w)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),t).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=w[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete w[h]}if(d.isEmptyObject(w)){var x=s.handle;x&&(x.elem=null),delete s.events,delete s.handle,typeof s==="function"?d.removeData(a,u,!0):d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=e.nodeType?d._data(e,"handle"):(d._data(e,u)||{}).handle;h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(o,""),n=d.nodeName(l,"a")&&m==="click",p=d.event.special[m]||{};if((!p._default||p._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,u),typeof i==="function"&&(i=i.events),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(c){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,c){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var c=a.target,e=c.type;if((e==="submit"||e==="image")&&d(c).closest("form").length){a.liveFired=b;return C("submit",this,arguments)}}),d.event.add(this,"keypress.specialSubmit",function(a){var c=a.target,e=c.type;if((e==="text"||e==="password")&&d(c).closest("form").length&&a.keyCode===13){a.liveFired=b;return C("submit",this,arguments)}});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(p.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f){a.type="change",a.liveFired=b;return d.event.trigger(a,arguments[1],c)}}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;if(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")return B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")return B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return p.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return p.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var p in a)n[c](p,e,a[p],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=o.exec(h),k="",j&&(k=j[0],h=h.replace(o,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function s(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var j=d[g];if(j){var k=!1;j=j[a];while(j){if(j.sizcache===c){k=d[j.sizset];break}if(j.nodeType===1){f||(j.sizcache=c,j.sizset=g);if(typeof b!=="string"){if(j===b){k=!0;break}}else if(i.filter(b,[j]).length>0){k=j;break}}j=j[a]}d[g]=k}}}function r(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0;[0,0].sort(function(){h=!1;return 0});var i=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var l,m,o,p,q,r,s,u,v=!0,w=i.isXML(d),x=[],y=b;do{a.exec(""),l=a.exec(y);if(l){y=l[3],x.push(l[1]);if(l[2]){p=l[3];break}}}while(l);if(x.length>1&&k.exec(b))if(x.length===2&&j.relative[x[0]])m=t(x[0]+x[1],d);else{m=j.relative[x[0]]?[d]:i(x.shift(),d);while(x.length)b=x.shift(),j.relative[b]&&(b+=x.shift()),m=t(b,m)}else{!g&&x.length>1&&d.nodeType===9&&!w&&j.match.ID.test(x[0])&&!j.match.ID.test(x[x.length-1])&&(q=i.find(x.shift(),d,w),d=q.expr?i.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:n(g)}:i.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),m=q.expr?i.filter(q.expr,q.set):q.set,x.length>0?o=n(m):v=!1;while(x.length)r=x.pop(),s=r,j.relative[r]?s=x.pop():r="",s==null&&(s=d),j.relative[r](o,s,w)}else o=x=[]}o||(o=m),o||i.error(r||b);if(f.call(o)==="[object Array]")if(v)if(d&&d.nodeType===1)for(u=0;o[u]!=null;u++)o[u]&&(o[u]===!0||o[u].nodeType===1&&i.contains(d,o[u]))&&e.push(m[u]);else for(u=0;o[u]!=null;u++)o[u]&&o[u].nodeType===1&&e.push(m[u]);else e.push.apply(e,o);else n(o,e);p&&(i(p,h,e,g),i.uniqueSort(e));return e};i.uniqueSort=function(a){if(p){g=h,a.sort(p);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},i.matches=function(a,b){return i(a,null,null,b)},i.matchesSelector=function(a,b){return i(b,null,null,[a]).length>0},i.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=j.order.length;e<f;e++){var g,h=j.order[e];if(g=j.leftMatch[h].exec(a)){var i=g[1];g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(/\\/g,""),d=j.find[h](g,b,c);if(d!=null){a=a.replace(j.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},i.filter=function(a,c,d,e){var f,g,h=a,k=[],l=c,m=c&&c[0]&&i.isXML(c[0]);while(a&&c.length){for(var n in j.filter)if((f=j.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=j.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;l===k&&(k=[]);if(j.preFilter[n]){f=j.preFilter[n](f,l,d,k,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=l[s])!=null;s++)if(p){o=q(p,f,s,l);var t=e^!!o;d&&o!=null?t?g=!0:l[s]=!1:t&&(k.push(p),g=!0)}if(o!==b){d||(l=k),a=a.replace(j.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)i.error(a);else break;h=a}return l},i.error=function(a){throw"Syntax error, unrecognized expression: "+a};var j=i.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!/\W/.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&i.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!/\W/.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&i.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=s;typeof b==="string"&&!/\W/.test(b)&&(b=b.toLowerCase(),d=b,g=r),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=s;typeof b==="string"&&!/\W/.test(b)&&(b=b.toLowerCase(),d=b,g=r),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(/\\/g,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(/\\/g,"")},TAG:function(a,b){return a[1].toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||i.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&i.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(/\\/g,"");!f&&j.attrMap[g]&&(a[1]=j.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(/\\/g,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=i(b[3],null,null,c);else{var g=i.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(j.match.POS.test(b[0])||j.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!i(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.type},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=j.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||i.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,k=g.length;h<k;h++)if(g[h]===a)return!1;return!0}i.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=j.attrHandle[c]?j.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=j.setFilters[e];if(f)return f(a,c,b,d)}}},k=j.match.POS,l=function(a,b){return"\\"+(b-0+1)};for(var m in j.match)j.match[m]=new RegExp(j.match[m].source+/(?![^\[]*\])(?![^\(]*\))/.source),j.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+j.match[m].source.replace(/\\(\d+)/g,l));var n=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(o){n=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var p,q;c.documentElement.compareDocumentPosition?p=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(p=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return q(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return q(e[k],f[k]);return k===c?q(a,f[k],-1):q(e[k],b,1)},q=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),i.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=i.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(j.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},j.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(j.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(j.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=i,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){i=function(b,e,f,g){e=e||c;if(!g&&!i.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return n(e.getElementsByTagName(b),f);if(h[2]&&j.find.CLASS&&e.getElementsByClassName)return n(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return n([e.body],f);if(h&&h[3]){var k=e.getElementById(h[3]);if(!k||!k.parentNode)return n([],f);if(k.id===h[3])return n([k],f)}try{return n(e.querySelectorAll(b),f)}catch(l){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e.getAttribute("id"),o=m||d,p=e.parentNode,q=/^\s*[+~]/.test(b);m?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),q&&p&&(e=e.parentNode);try{if(!q||p)return n(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(r){}finally{m||e.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)i[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(i.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!i.isXML(a))try{if(d||!j.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return i(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;j.order.splice(1,0,"CLASS"),j.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?i.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?i.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:i.contains=function(){return!1},i.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var t=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=j.match.PSEUDO.exec(a))e+=c[0],a=a.replace(j.match.PSEUDO,"");a=j.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)i(a,f[g],d);return i.filter(e,d)};d.find=i,d.expr=i.selectors,d.expr[":"]=d.expr.filters,d.unique=i.uniqueSort,d.text=i.getText,d.isXMLDoc=i.isXML,d.contains=i.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!0:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,_)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if(!d.support.noCloneEvent&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){f=a.getElementsByTagName("*"),g=e.getElementsByTagName("*");for(h=0;f[h];++h)$(f[h],g[h]);$(a,e)}if(b){Z(a,e);if(c&&"getElementsByTagName"in a){f=a.getElementsByTagName("*"),g=e.getElementsByTagName("*");if(f.length)for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var ba=/alpha\([^)]*\)/i,bb=/opacity=([^)]*)/,bc=/-([a-z])/ig,bd=/([A-Z])/g,be=/^-?\d+(?:px)?$/i,bf=/^-?\d/,bg={position:"absolute",visibility:"hidden",display:"block"},bh=["Left","Right"],bi=["Top","Bottom"],bj,bk,bl,bm=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bj(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bj)return bj(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bc,bm)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bn(a,b,e):d.swap(a,bg,function(){f=bn(a,b,e)});if(f<=0){f=bj(a,b,b),f==="0px"&&bl&&(f=bl(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!be.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=ba.test(f)?f.replace(ba,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bk=function(a,c,e){var f,g,h;e=e.replace(bd,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bl=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!be.test(d)&&bf.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bj=bk||bl,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bo=/%20/g,bp=/\[\]$/,bq=/\r?\n/g,br=/#.*$/,bs=/^(.*?):\s*(.*?)\r?$/mg,bt=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bu=/^(?:GET|HEAD)$/,bv=/^\/\//,bw=/\?/,bx=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,by=/^(?:select|textarea)/i,bz=/\s+/,bA=/([?&])_=[^&]*/,bB=/^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/,bC=d.fn.load,bD={},bE={};d.fn.extend({load:function(a,b,c){if(typeof a!=="string"&&bC)return bC.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}var g="GET";b&&(d.isFunction(b)?(c=b,b=null):typeof b==="object"&&(b=d.param(b,d.ajaxSettings.traditional),g="POST"));var h=this;d.ajax({url:a,type:g,dataType:"html",data:b,complete:function(a,b,e){e=a.responseText,a.isResolved()&&(a.done(function(a){e=a}),h.html(f?d("<div>").append(e.replace(bx,"")).find(f):e)),c&&h.each(c,[e,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||by.test(this.nodeName)||bt.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bq,"\r\n")}}):{name:b.name,value:c.replace(bq,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,b){d[b]=function(a,c,e,f){d.isFunction(c)&&(f=f||e,e=c,c=null);return d.ajax({type:b,url:a,data:c,success:e,dataType:f})}}),d.extend({getScript:function(a,b){return d.get(a,null,b,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a){d.extend(!0,d.ajaxSettings,a),a.context&&(d.ajaxSettings.context=a.context)},ajaxSettings:{url:location.href,global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bF(bD),ajaxTransport:bF(bE),ajax:function(a,e){function w(a,c,e,l){if(t!==2){t=2,p&&clearTimeout(p),o=b,m=l||"",v.readyState=a?4:0;var n,q,r,s=e?bI(f,v,e):b,u,w;if(a>=200&&a<300||a===304){if(f.ifModified){if(u=v.getResponseHeader("Last-Modified"))d.lastModified[f.url]=u;if(w=v.getResponseHeader("Etag"))d.etag[f.url]=w}if(a===304)c="notmodified",n=!0;else try{q=bJ(f,s),c="success",n=!0}catch(x){c="parsererror",r=x}}else r=c,a&&(c="error",a<0&&(a=0));v.status=a,v.statusText=c,n?i.resolveWith(g,[q,c,v]):i.rejectWith(g,[v,c,r]),v.statusCode(k),k=b,f.global&&h.trigger("ajax"+(n?"Success":"Error"),[v,f,n?q:r]),j.resolveWith(g,[v,c]),f.global&&(h.trigger("ajaxComplete",[v,f]),--d.active||d.event.trigger("ajaxStop"))}}typeof e!=="object"&&(e=a,a=b),e=e||{};var f=d.extend(!0,{},d.ajaxSettings,e),g=(f.context=("context"in e?e:d.ajaxSettings).context)||f,h=g===f?d.event:d(g),i=d.Deferred(),j=d._Deferred(),k=f.statusCode||{},l={},m,n,o,p,q=c.location,r=q.protocol||"http:",s,t=0,u,v={readyState:0,setRequestHeader:function(a,b){t===0&&(l[a.toLowerCase()]=b);return this},getAllResponseHeaders:function(){return t===2?m:null},getResponseHeader:function(a){var b;if(t===2){if(!n){n={};while(b=bs.exec(m))n[b[1].toLowerCase()]=b[2]}b=n[a.toLowerCase()]}return b||null},abort:function(a){a=a||"abort",o&&o.abort(a),w(0,a);return this}};i.promise(v),v.success=v.done,v.error=v.fail,v.complete=j.done,v.statusCode=function(a){if(a){var b;if(t<2)for(b in a)k[b]=[k[b],a[b]];else b=a[v.status],v.then(b,b)}return this},f.url=(""+(a||f.url)).replace(br,"").replace(bv,r+"//"),f.dataTypes=d.trim(f.dataType||"*").toLowerCase().split(bz),f.crossDomain||(s=bB.exec(f.url.toLowerCase()),f.crossDomain=s&&(s[1]!=r||s[2]!=q.hostname||(s[3]||(s[1]==="http:"?80:443))!=(q.port||(r==="http:"?80:443)))),f.data&&f.processData&&typeof f.data!=="string"&&(f.data=d.param(f.data,f.traditional)),bG(bD,f,e,v),f.type=f.type.toUpperCase(),f.hasContent=!bu.test(f.type),f.global&&d.active++===0&&d.event.trigger("ajaxStart");if(!f.hasContent){f.data&&(f.url+=(bw.test(f.url)?"&":"?")+f.data);if(f.cache===!1){var x=d.now(),y=f.url.replace(bA,"$1_="+x);f.url=y+(y===f.url?(bw.test(f.url)?"&":"?")+"_="+x:"")}}if(f.data&&f.hasContent&&f.contentType!==!1||e.contentType)l["content-type"]=f.contentType;f.ifModified&&(d.lastModified[f.url]&&(l["if-modified-since"]=d.lastModified[f.url]),d.etag[f.url]&&(l["if-none-match"]=d.etag[f.url])),l.accept=f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+(f.dataTypes[0]!=="*"?", */*; q=0.01":""):f.accepts["*"];for(u in f.headers)l[u.toLowerCase()]=f.headers[u];if(!f.beforeSend||f.beforeSend.call(g,v,f)!==!1&&t!==2){for(u in {success:1,error:1,complete:1})v[u](f[u]);o=bG(bE,f,e,v);if(o){t=v.readyState=1,f.global&&h.trigger("ajaxSend",[v,f]),f.async&&f.timeout>0&&(p=setTimeout(function(){v.abort("timeout")},f.timeout));try{o.send(l,w)}catch(z){status<2?w(-1,z):d.error(z)}}else w(-1,"No Transport")}else w(0,"abort"),v=!1;return v},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery)d.each(a,function(){f(this.name,this.value)});else for(var g in a)bH(g,a[g],c,f);return e.join("&").replace(bo,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bK=d.now(),bL=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bK++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){e=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bL.test(b.url)||e&&bL.test(b.data))){var f,g=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h=a[g],i=b.url,j=b.data,k="$1"+g+"$2";b.jsonp!==!1&&(i=i.replace(bL,k),b.url===i&&(e&&(j=j.replace(bL,k)),b.data===j&&(i+=(/\?/.test(i)?"&":"?")+b.jsonp+"="+g))),b.url=i,b.data=j,a[g]=function(a){f=[a]},b.complete=[function(){a[g]=h;if(h)f&&d.isFunction(h)&&a[g](f[0]);else try{delete a[g]}catch(b){}},b.complete],b.converters["script json"]=function(){f||d.error(g+" was not called");return f[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript"},contents:{script:/javascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bM=d.now(),bN={},bO,bP;d.ajaxSettings.xhr=a.ActiveXObject?function(){if(a.location.protocol!=="file:")try{return new a.XMLHttpRequest}catch(b){}try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(c){}}:function(){return new a.XMLHttpRequest};try{bP=d.ajaxSettings.xhr()}catch(bQ){}d.support.ajax=!!bP,d.support.cors=bP&&"withCredentials"in bP,bP=b,d.support.ajax&&d.ajaxTransport(function(b){if(!b.crossDomain||d.support.cors){var c;return{send:function(e,f){bO||(bO=1,d(a).bind("unload",function(){d.each(bN,function(a,b){b.onreadystatechange&&b.onreadystatechange(1)})}));var g=b.xhr(),h;b.username?g.open(b.type,b.url,b.async,b.username,b.password):g.open(b.type,b.url,b.async),(!b.crossDomain||b.hasContent)&&!e["x-requested-with"]&&(e["x-requested-with"]="XMLHttpRequest");try{d.each(e,function(a,b){g.setRequestHeader(a,b)})}catch(i){}g.send(b.hasContent&&b.data||null),c=function(a,e){if(c&&(e||g.readyState===4)){c=0,h&&(g.onreadystatechange=d.noop,delete bN[h]);if(e)g.readyState!==4&&g.abort();else{var i=g.status,j,k=g.getAllResponseHeaders(),l={},m=g.responseXML;m&&m.documentElement&&(l.xml=m),l.text=g.responseText;try{j=g.statusText}catch(n){j=""}i=i===0?!b.crossDomain||j?k?304:0:302:i==1223?204:i,f(i,j,l,k)}}},b.async&&g.readyState!==4?(h=bM++,bN[h]=g,g.onreadystatechange=c):c()},abort:function(){c&&c(0,1)}}}});var bR={},bS=/^(?:toggle|show|hide)$/,bT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,bU,bV=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(bW("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",bX(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(bW("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(bW("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=bX(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(bS.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=bT.exec(e),j=f.cur()||0;if(i){var k=parseFloat(i[2]),l=i[3]||"px";l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:bW("show",1),slideUp:bW("hide",1),slideToggle:bW("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(d.css(this.elem,this.prop));return a||0},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||"px",this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!bU&&(bU=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(bU),bU=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var bY=/^t(?:able|d|h)$/i,bZ=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=b$(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!bY.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=bZ.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!bZ.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=b$(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=b$(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}})})(window); diff --git a/fannie/src/jquery/js/jquery-1.6.2.min.js b/fannie/src/jquery/js/jquery-1.6.2.min.js new file mode 100644 index 000000000..48590ecb9 --- /dev/null +++ b/fannie/src/jquery/js/jquery-1.6.2.min.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/fannie/src/jquery/js/jquery-ui-1.8.1.custom.min.js b/fannie/src/jquery/js/jquery-ui-1.8.1.custom.min.js new file mode 100644 index 000000000..9ea846d65 --- /dev/null +++ b/fannie/src/jquery/js/jquery-ui-1.8.1.custom.min.js @@ -0,0 +1,756 @@ +/*! + * jQuery UI 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +jQuery.ui||function(c){c.ui={version:"1.8.1",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")=="hidden")return false; +b=b&&b=="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,f,g){return c.ui.isOverAxis(a,d,f)&&c.ui.isOverAxis(b,e,g)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33, +PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))|| +/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!== +undefined)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b||"area"==b?a.href||!isNaN(d):!isNaN(d))&& +!c(a)["area"==b?"parents":"closest"](":hidden").length},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}(jQuery); +;/*! + * jQuery UI Widget 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Widget + */ +(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype= +b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g= +b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create(); +this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f, +h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a= +b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); +;/*! + * jQuery UI Mouse 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&& +this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault(); +return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&& +this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- +a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h= +0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+= +g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k, +elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"? +-b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position= +"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, +b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== +"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&& +a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"), +10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): +f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+ +this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+ +Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left- +this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs= +this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.1"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable"); +if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper; +c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver= +1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left; +this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper= +this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a= +d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options; +if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!= +"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX- +b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()- +c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this, +width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&& +o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t= +p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&& +(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"), +10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery); +;/* + * jQuery UI Droppable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.mouse.js + * jquery.ui.draggable.js + */ +(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this); +a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&& +this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass); +this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g= +d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop", +a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.1"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height; +switch(c){case "fit":return i<e&&g<k&&j<f&&h<l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=i&& +e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!= +"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem|| +a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e= +d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery); +;/* + * jQuery UI Resizable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.resizable",d.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");d.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element, +_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&d.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(d('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var e=0;e<c.length;e++){var g=d.trim(c[e]),f=d('<div class="ui-resizable-handle '+("ui-resizable-"+g)+'"></div>');/sw|se|ne|nw/.test(g)&&f.css({zIndex:++a.zIndex});"se"==g&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=d(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=d(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}d(this.handles[i])}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){d(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){d(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){d(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(d(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +e=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(e.is(".ui-draggable")||/absolute/.test(e.css("position")))e.css({position:"absolute",top:c.top,left:c.left});d.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var g=m(this.helper.css("top"));if(a.containment){c+=d(a.containment).scrollLeft()||0;g+=d(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:g};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:c,top:g};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",a=="auto"?this.axis+"-resize":a);e.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,e=this._change[this.axis];if(!e)return false;c=e.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var e=this._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName);e=g&&d.ui.hasScroll(e[0],"left")?0:c.sizeDiff.height; +g={width:c.size.width-(g?0:c.sizeDiff.width),height:c.size.height-e};e=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var f=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(d.extend(g,{top:f,left:e}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", +b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,e=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(e=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(e=="nw"){b.top= +a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,e=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,g=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,f=k(b.width)&&a.minWidth&&a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(f)b.width=a.minWidth;if(h)b.height=a.minHeight;if(e)b.width=a.maxWidth;if(g)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, +l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(f&&l)b.left=i-a.minWidth;if(e&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(g&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var e=[c.css("borderTopWidth"), +c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],g=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=d.map(e,function(f,h){f=parseInt(f,10)||0;h=parseInt(g[h],10)||0;return f+h})}d.browser.msie&&(d(b).is(":hidden")||d(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset= +this.element.offset();if(this._helper){this.helper=this.helper||d('<div style="overflow:hidden;"></div>');var a=d.browser.msie&&d.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ +a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return d.extend(this._change.n.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){d.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable, +{version:"1.8.1"});d.ui.plugin.add("resizable","alsoResize",{start:function(){var b=d(this).data("resizable").options,a=function(c){d(c).each(function(){d(this).data("resizable-alsoresize",{width:parseInt(d(this).width(),10),height:parseInt(d(this).height(),10),left:parseInt(d(this).css("left"),10),top:parseInt(d(this).css("top"),10)})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else d.each(b.alsoResize,function(c){a(c)}); +else a(b.alsoResize)},resize:function(){var b=d(this).data("resizable"),a=b.options,c=b.originalSize,e=b.originalPosition,g={height:b.size.height-c.height||0,width:b.size.width-c.width||0,top:b.position.top-e.top||0,left:b.position.left-e.left||0},f=function(h,i){d(h).each(function(){var j=d(this),l=d(this).data("resizable-alsoresize"),p={};d.each((i&&i.length?i:["width","height","top","left"])||["width","height","top","left"],function(n,o){if((n=(l[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(/relative/.test(j.css("position"))&& +d.browser.opera){b._revertToRelativePosition=true;j.css({position:"absolute",top:"auto",left:"auto"})}j.css(p)})};typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?d.each(a.alsoResize,function(h,i){f(h,i)}):f(a.alsoResize)},stop:function(){var b=d(this).data("resizable");if(b._revertToRelativePosition&&d.browser.opera){b._revertToRelativePosition=false;el.css({position:"relative"})}d(this).removeData("resizable-alsoresize-start")}});d.ui.plugin.add("resizable","animate",{stop:function(b){var a= +d(this).data("resizable"),c=a.options,e=a._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName),f=g&&d.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height;g={width:a.size.width-(g?0:a.sizeDiff.width),height:a.size.height-f};f=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(d.extend(g,h&&f?{top:h,left:f}:{}),{duration:c.animateDuration,easing:c.animateEasing, +step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&d(e[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});d.ui.plugin.add("resizable","containment",{start:function(){var b=d(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof d?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= +d(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var e=d(a),g=[];d(["Top","Right","Left","Bottom"]).each(function(i,j){g[i]=m(e.css("padding"+j))});b.containerOffset=e.offset();b.containerPosition=e.position();b.containerSize={height:e.innerHeight()-g[3],width:e.innerWidth()-g[1]};c=b.containerOffset; +var f=b.containerSize.height,h=b.containerSize.width;h=d.ui.hasScroll(a,"left")?a.scrollWidth:h;f=d.ui.hasScroll(a)?a.scrollHeight:f;b.parentData={element:a,left:c.left,top:c.top,width:h,height:f}}}},resize:function(b){var a=d(this).data("resizable"),c=a.options,e=a.containerOffset,g=a.position;b=a._aspectRatio||b.shiftKey;var f={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))f=e;if(g.left<(a._helper?e.left:0)){a.size.width+=a._helper?a.position.left-e.left: +a.position.left-f.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?e.left:0}if(g.top<(a._helper?e.top:0)){a.size.height+=a._helper?a.position.top-e.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?e.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-f.left:a.offset.left-f.left)+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-f.top:a.offset.top- +e.top)+a.sizeDiff.height);g=a.containerElement.get(0)==a.element.parent().get(0);f=/relative|absolute/.test(a.containerElement.css("position"));if(g&&f)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(e+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-e;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=d(this).data("resizable"),a=b.options,c=b.containerOffset,e=b.containerPosition, +g=b.containerElement,f=d(b.helper),h=f.offset(),i=f.outerWidth()-b.sizeDiff.width;f=f.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f});b._helper&&!a.animate&&/static/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f})}});d.ui.plugin.add("resizable","ghost",{start:function(){var b=d(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, +display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=d(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=d(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});d.ui.plugin.add("resizable","grid",{resize:function(){var b= +d(this).data("resizable"),a=b.options,c=b.size,e=b.originalSize,g=b.originalPosition,f=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-e.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-e.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a}else if(/^(ne)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}else{if(/^(sw)$/.test(f)){b.size.width=e.width+h;b.size.height= +e.height+a}else{b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}b.position.left=g.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(d.options.filter,d.element[0]);f.each(function(){var c=e(this),b=c.offset();e.data(this,"selectable-item",{element:this,$element:c,left:b.left,top:b.top,right:b.left+c.outerWidth(),bottom:b.top+c.outerHeight(),startselected:false,selected:c.hasClass("ui-selected"), +selecting:c.hasClass("ui-selecting"),unselecting:c.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this}, +_mouseStart:function(d){var f=this;this.opos=[d.pageX,d.pageY];if(!this.options.disabled){var c=this.options;this.selectees=e(c.filter,this.element[0]);this._trigger("start",d);e(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});c.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!d.metaKey){b.$element.removeClass("ui-selected"); +b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",d,{unselecting:b.element})}});e(d.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){b.$element.removeClass("ui-unselecting").addClass("ui-selecting");b.unselecting=false;b.selecting=true;b.selected=true;f._trigger("selecting",d,{selecting:b.element});return false}})}},_mouseDrag:function(d){var f=this;this.dragged=true;if(!this.options.disabled){var c=this.options, +b=this.opos[0],g=this.opos[1],h=d.pageX,i=d.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(c.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(c.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting"); +a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",d,{selecting:a.element})}}else{if(a.selecting)if(d.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",d,{unselecting:a.element})}if(a.selected)if(!d.metaKey&& +!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",d,{unselecting:a.element})}}}});return false}},_mouseStop:function(d){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var c=e.data(this,"selectable-item");c.$element.removeClass("ui-unselecting");c.unselecting=false;c.startselected=false;f._trigger("unselected",d,{unselected:c.element})});e(".ui-selecting",this.element[0]).each(function(){var c= +e.data(this,"selectable-item");c.$element.removeClass("ui-selecting").addClass("ui-selected");c.selecting=false;c.selected=true;c.startselected=true;f._trigger("selected",d,{selected:c.element})});this._trigger("stop",d);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.1"})})(jQuery); +;/* + * jQuery UI Sortable 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(self, +arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= +c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, +{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); +if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", +a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+ +this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+ +b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+ +"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, +c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== +document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", +null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): +d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c}, +_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/ +2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b= +d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a= +this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)? +h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"), +b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)? +i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement, +c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height= +this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()- +parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0], +this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b= +1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change", +a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]== +this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options; +if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b= +d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width- +this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+ +this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top; +if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f- +this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+ +(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&& +this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]|| +this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update", +g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity", +this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e= +0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.1"})})(jQuery); +;/* + * jQuery UI Accordion 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},_create:function(){var a=this.options,b=this;this.running=0;this.element.addClass("ui-accordion ui-widget ui-helper-reset"); +this.element[0].nodeName=="UL"&&this.element.children("li").addClass("ui-accordion-li-fix");this.headers=this.element.find(a.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c(this).removeClass("ui-state-focus")}); +this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(a.navigation){var d=this.element.find("a").filter(a.navigationFilter);if(d.length){var f=d.closest(".ui-accordion-header");this.active=f.length?f:d.closest(".ui-accordion-content").prev()}}this.active=this._findActive(this.active||a.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active"); +this._createIcons();this.resize();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown",function(g){return b._keydown(g)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();this.active.length?this.active.attr("aria-expanded","true").attr("tabIndex","0"):this.headers.eq(0).attr("tabIndex","0");c.browser.safari||this.headers.find("a").attr("tabIndex","-1");a.event&&this.headers.bind(a.event+ +".accordion",function(g){b._clickHandler.call(b,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span/>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion"); +this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");if(a.autoHeight||a.fillHeight)b.css("height", +"");return this},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();b&&this._createIcons()}},_keydown:function(a){var b=c.ui.keyCode;if(!(this.options.disabled||a.altKey||a.ctrlKey)){var d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target}, +a.target);a.preventDefault()}if(g){c(a.target).attr("tabIndex","-1");c(g).attr("tabIndex","0");g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0, +b-c(this).innerHeight()+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a=="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d= +this.options;if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]==this.active[0];d.active=d.collapsible&&b?false:c(".ui-accordion-header",this.element).index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected); +a.next().addClass("ui-accordion-content-active")}e=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):e,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(e,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},e=this.active=c([]);this._toggle(e,f,g)}},_toggle:function(a,b,d,f,g){var e=this.options,k=this;this.toShow=a;this.toHide=b;this.data=d;var i=function(){if(k)return k._completed.apply(k,arguments)};this._trigger("changestart",null,this.data);this.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]), +toHide:b,complete:i,down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:i,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var h=e.duration,j=e.animated;if(j&&!f[j]&&!c.easing[j])j="slide";f[j]||(f[j]=function(l){this.slide(l,{easing:j, +duration:h||700})});f[j](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}i(true)}b.prev().attr("aria-expanded","false").attr("tabIndex","-1").blur();a.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(a){var b=this.options;this.running=a?0:--this.running;if(!this.running){b.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion, +{version:"1.8.1",animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},e={},k;b=a.toShow;k=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(i,h){e[h]="hide";i=(""+c.css(a.toShow[0], +h)).match(/^([\d+-.]+)(.*)$/);g[h]={value:i[1],unit:i[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(e,{step:function(i,h){if(h.prop=="height")f=h.end-h.start===0?0:(h.now-h.start)/(h.end-h.start);a.toShow[0].style[h.prop]=f*g[h.prop].value+g[h.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css("width",k);a.toShow.css({overflow:d});a.complete()}})}else a.toHide.animate({height:"hide"}, +a);else a.toShow.animate({height:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(e){e.widget("ui.autocomplete",{options:{minLength:1,delay:300},_create:function(){var a=this,b=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){var d=e.ui.keyCode;switch(c.keyCode){case d.PAGE_UP:a._move("previousPage",c);break;case d.PAGE_DOWN:a._move("nextPage",c);break;case d.UP:a._move("previous",c);c.preventDefault(); +break;case d.DOWN:a._move("next",c);c.preventDefault();break;case d.ENTER:a.menu.active&&c.preventDefault();case d.TAB:if(!a.menu.active)return;a.menu.select(c);break;case d.ESCAPE:a.element.val(a.term);a.close(c);break;case d.LEFT:case d.RIGHT:case d.SHIFT:case d.CONTROL:case d.ALT:break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){a.search(null,c)},a.options.delay);break}}).bind("focus.autocomplete",function(){a.selectedItem=null;a.previous=a.element.val()}).bind("blur.autocomplete", +function(c){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo("body",b).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",null,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("select", +c,{item:d})&&a.element.val(d.value);a.close(c);c=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=c}a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource()},_initSource:function(){var a,b;if(e.isArray(this.options.source)){a=this.options.source;this.source=function(c,d){d(e.ui.autocomplete.filter(a,c.term))}}else if(typeof this.options.source==="string"){b=this.options.source;this.source=function(c,d){e.getJSON(b,c,d)}}else this.source=this.options.source},search:function(a,b){a= +a!=null?a:this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search")!==false)return this._search(a)},_search:function(a){this.term=this.element.addClass("ui-autocomplete-loading").val();this.source({term:a},this.response)},_response:function(a){if(a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing); +if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return e.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+ +1),c;this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position({my:"left top",at:"left bottom",of:this.element,collision:"none"});a=b.width("").width();c=this.element.width();b.width(Math.max(a,c))},_renderMenu:function(a,b){var c=this;e.each(b,function(d,f){c._renderItem(a,f)})},_renderItem:function(a,b){return e("<li></li>").data("item.autocomplete",b).append("<a>"+b.label+"</a>").appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&& +/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")},filter:function(a,b){var c=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(d){return c.test(d.label||d.value||d)})}})})(jQuery); +(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(b){a.activate(b,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.attr("scrollTop"),f=this.element.height();if(c<0)this.element.attr("scrollTop",d+c);else c>f&&this.element.attr("scrollTop",d+c-f+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); +this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prev().length},last:function(){return this.active&&!this.active.next().length},move:function(a,b,c){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);a.length?this.activate(c,a):this.activate(c,this.element.children(b))}else this.activate(c,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active|| +this.last())this.activate(a,this.element.children(":first"));else{var b=this.active.offset().top,c=this.element.height(),d=this.element.children("li").filter(function(){var f=e(this).offset().top-b-c+e(this).height();return f<10&&f>-10});d.length||(d=this.element.children(":last"));this.activate(a,d)}else this.activate(a,this.element.children(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last")); +else{var b=this.active.offset().top,c=this.element.height();result=this.element.children("li").filter(function(){var d=e(this).offset().top-b+c-e(this).height();return d<10&&d>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery); +;/* + * jQuery UI Button 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Button + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",i);this._determineButtonType(); +this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button", +function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button", +function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button", +function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")? +"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()); +this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed", +true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement,c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(), +d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":""));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon");this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}}); +a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");var a=this,b=a.options,d=b.title||a.originalTitle||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ +b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), +h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id", +e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); +a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== +b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index", +c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== +f[0]&&e.shiftKey){g.focus(1);return false}}});c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a, +function(g,f){g=c('<button type="button"></button>').text(g).click(function(){f.apply(b.element[0],arguments)}).appendTo(e);c.fn.button&&g.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging"); +b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,position:f.position,size:f.size}}a=a===undefined?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position"); +a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop", +f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0];a=a||c.ui.dialog.prototype.options.position;if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(e,g){if(+b[e]===b[e]){d[e]=b[e];b[e]= +g}})}else if(typeof a==="object"){if("left"in a){b[0]="left";d[0]=a.left}else if("right"in a){b[0]="right";d[0]=-a.right}if("top"in a){b[1]="top";d[1]=a.top}else if("bottom"in a){b[1]="bottom";d[1]=-a.bottom}}(a=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position({my:b.join(" "),at:b.join(" "),offset:d.join(" "),of:window,collision:"fit",using:function(e){var g=c(this).css(e).offset().top;g<0&&c(this).css("top",e.top-g)}});a||this.uiDialog.hide()},_setOption:function(a, +b){var d=this,e=d.uiDialog,g=e.is(":data(resizable)"),f=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");break;case "draggable":b?d._makeDraggable():e.draggable("destroy");break; +case "height":f=true;break;case "maxHeight":g&&e.resizable("option","maxHeight",b);f=true;break;case "maxWidth":g&&e.resizable("option","maxWidth",b);f=true;break;case "minHeight":g&&e.resizable("option","minHeight",b);f=true;break;case "minWidth":g&&e.resizable("option","minWidth",b);f=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title", +d.uiDialogTitlebar).html(""+(b||"&#160;"));break;case "width":f=true;break}c.Widget.prototype._setOption.apply(d,arguments);f&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight", +this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.1",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&& +c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&& +b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight, +document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0, +height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery); +;/* + * jQuery UI Slider 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled"); +this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),g,h,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");g=b._start(c,f);if(g===false)return}break}i=b.options.step;g=b.options.values&&b.options.values.length?(h=b.values(f)):(h=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:h=b._valueMin();break;case d.ui.keyCode.END:h=b._valueMax();break;case d.ui.keyCode.PAGE_UP:h=g+(b._valueMax()-b._valueMin())/5;break;case d.ui.keyCode.PAGE_DOWN:h=g-(b._valueMax()-b._valueMin())/5;break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(g=== +b._valueMax())return;h=g+i;break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(g===b._valueMin())return;h=g-i;break}b._slide(c,f,h);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,g,h,i;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c={x:b.pageX,y:b.pageY};e=this._normValueFromMouse(c);f=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(j){var k=Math.abs(e-h.values(j));if(f>k){f=k;g=d(this);i=j}});if(a.range===true&&this.values(1)===a.min){i+=1;g=d(this.handles[i])}if(this._start(b, +i)===false)return false;this._mouseSliding=true;h._handleIndex=i;g.addClass("ui-state-active").focus();a=g.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-g.width()/2,top:b.pageY-a.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)};e=this._normValueFromMouse(c);this._slide(b,i,e);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a], +value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value= +this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value(); +else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation(); +this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b]; +return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<this._valueMin())return this._valueMin();if(b>this._valueMax())return this._valueMax();var a=this.options.step,c=b%a;b=b-c;if(c>=a/2)b+=a;return parseFloat(b.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,a=this.options,c=this, +e=!this._animateOff?a.animate:false,f,g={},h,i,j,k;if(this.options.values&&this.options.values.length)this.handles.each(function(l){f=(c.values(l)-c._valueMin())/(c._valueMax()-c._valueMin())*100;g[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](g,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(l===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);if(l===1)c.range[e?"animate":"css"]({width:f-h+"%"},{queue:false,duration:a.animate})}else{if(l=== +0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(l===1)c.range[e?"animate":"css"]({height:f-h+"%"},{queue:false,duration:a.animate})}h=f});else{i=this.value();j=this._valueMin();k=this._valueMax();f=k!==j?(i-j)/(k-j)*100:0;g[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](g,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e? +"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.1"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d){var s=0,u=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'},_create:function(){this._tabify(true)},_setOption:function(c,e){if(c=="selected")this.options.collapsible&&e==this.options.selected|| +this.select(e);else{this.options[c]=e;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+ ++s},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++u);return d.cookie.apply(null,[c].concat(d.makeArray(arguments)))},_ui:function(c,e){return{tab:c,panel:e,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c= +d(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function e(g,f){g.css({display:""});!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}this.list=this.element.find("ol,ul").eq(0);this.lis=d("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);var a=this,b=this.options,h=/^#.+/;this.anchors.each(function(g,f){var j=d(f).attr("href"),l=j.split("#")[0],p;if(l&&(l===location.toString().split("#")[0]|| +(p=d("base")[0])&&l===p.href)){j=f.hash;f.href=j}if(h.test(j))a.panels=a.panels.add(a._sanitizeSelector(j));else if(j!="#"){d.data(f,"href.tabs",j);d.data(f,"load.tabs",j.replace(/#.*$/,""));j=a._tabId(f);f.href="#"+j;f=d("#"+j);if(!f.length){f=d(b.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else b.disabled.push(g)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(b.selected===undefined){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){b.selected=g;return false}});if(typeof b.selected!="number"&&b.cookie)b.selected=parseInt(a._cookie(),10);if(typeof b.selected!="number"&&this.lis.filter(".ui-tabs-selected").length)b.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));b.selected=b.selected||(this.lis.length?0:-1)}else if(b.selected===null)b.selected=-1;b.selected=b.selected>=0&&this.anchors[b.selected]||b.selected<0?b.selected:0;b.disabled=d.unique(b.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(b.selected,b.disabled)!=-1&&b.disabled.splice(d.inArray(b.selected,b.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(b.selected>=0&&this.anchors.length){this.panels.eq(b.selected).removeClass("ui-tabs-hide");this.lis.eq(b.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[b.selected],a.panels[b.selected]))});this.load(b.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else b.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[b.collapsible?"addClass": +"removeClass"]("ui-tabs-collapsible");b.cookie&&this._cookie(b.selected,b.cookie);c=0;for(var i;i=this.lis[c];c++)d(i)[d.inArray(c,b.disabled)!=-1&&!d(i).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");b.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(b.event!="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs", +function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(b.fx)if(d.isArray(b.fx)){m=b.fx[0];o=b.fx[1]}else m=o=b.fx;var q=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);a._trigger("show", +null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},r=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};this.anchors.bind(b.event+".tabs", +function(){var g=this,f=d(this).closest("li"),j=a.panels.filter(":not(.ui-tabs-hide)"),l=d(a._sanitizeSelector(this.hash));if(f.hasClass("ui-tabs-selected")&&!b.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}b.selected=a.anchors.index(this);a.abort();if(b.collapsible)if(f.hasClass("ui-tabs-selected")){b.selected=-1;b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){r(g, +j)}).dequeue("tabs");this.blur();return false}else if(!j.length){b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this));this.blur();return false}b.cookie&&a._cookie(b.selected,b.cookie);if(l.length){j.length&&a.element.queue("tabs",function(){r(g,j)});a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs", +function(){return false})},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(b,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this, +"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,e,a){if(a===undefined)a=this.anchors.length;var b=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,e));c=!c.indexOf("#")?c.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs", +true);var i=d("#"+c);i.length||(i=d(h.panelTemplate).attr("id",c).data("destroy.tabs",true));i.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);i.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);i.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");i.removeClass("ui-tabs-hide"); +this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(c){var e=this.options,a=this.lis.eq(c).remove(),b=this.panels.eq(c).remove();if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=c}),function(h){return h>=c?--h:h});this._tabify();this._trigger("remove", +null,this._ui(a.find("a")[0],b[0]));return this},enable:function(c){var e=this.options;if(d.inArray(c,e.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=c});this._trigger("enable",null,this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){var e=this.options;if(c!=e.selected){this.lis.eq(c).addClass("ui-state-disabled");e.disabled.push(c);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this}, +select:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));else if(c===null)c=-1;if(c==-1&&this.options.collapsible)c=this.options.selected;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},load:function(c){var e=this,a=this.options,b=this.anchors.eq(c)[0],h=d.data(b,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(b,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing"); +if(a.spinner){var i=d("span",b);i.data("label.tabs",i.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(b.hash)).html(k);e._cleanup();a.cache&&d.data(b,"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.error(k,n,c,b)}catch(m){}}}));e.element.dequeue("tabs");return this}}, +abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(c,e){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.1"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(c,e){var a=this,b=this.options,h=a._rotate||(a._rotate= +function(i){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=b.selected;a.select(++k<a.anchors.length?k:0)},c);i&&i.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(i){i.clientX&&a.rotate(null)}:function(){t=b.selected;h()});if(c){this.element.bind("tabsshow",h);this.anchors.bind(b.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(b.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery); +;/* + * jQuery UI Datepicker 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * jquery.ui.core.js + */ +(function(d){function J(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"show",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"_default",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a, +b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.1"}});var y=(new Date).getTime();d.extend(J.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= +f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id)a.id="dp"+ ++this.uuid;var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f== +""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){a="dp"+ ++this.uuid;this._dialogInput=d('<input type="text" id="'+a+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor==Date? +this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); +d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, +_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= +d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& +this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&& +!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker(); +return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey|| +a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target, +a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat")); +var c=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| +a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); +d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& +d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, +h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); +this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); +this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), +k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; +a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): +"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& +!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; +b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){a=this._getInst(d(a)[0]); +a.input&&a._selectingMonthYear&&!d.browser.msie&&a.input.focus();a._selectingMonthYear=!a._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a, +"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")|| +this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null; +for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+ +s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,G){p=o(p)?G:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length)==p[w]){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break; +case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c, +k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c? +c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)=="'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break; +case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false, +e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"), +e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))}, +_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1], +10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null; +a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| +a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, +g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ +y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),G=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var K=this._getDefaultDate(a),H="",C=0;C<i[0];C++){for(var L= +"",D=0;D<i[1];D++){var M=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c? +f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var N=0;N<A;N++){x+="<tr>";var O=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,I=B&&!G||!F[0]||j&&q<j||o&&q>o;O+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==M.getTime()&&g==a.selectedMonth&& +a._keyEvent||K.getTime()==q.getTime()&&K.getTime()==M.getTime()?" "+this._dayOverClass:"")+(I?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(I?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?"&#xa0;":I?'<span class="ui-state-default">'+q.getDate()+ +"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=O+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");L+=x}H+=L}H+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': +"");a._keyEvent=false;return H},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+ +a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?"&#xa0;":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, +i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?"&#xa0;":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); +return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new J;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.1";window["DP_jQuery_"+y]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b){b.widget("ui.progressbar",{options:{value:0},_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===undefined)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){switch(a){case "value":this.options.value=c;this._refreshValue();this._trigger("change");break}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;if(a<this._valueMin())a=this._valueMin();if(a>this._valueMax())a=this._valueMax();return a}, +_valueMin:function(){return 0},_valueMax:function(){return 100},_refreshValue:function(){var a=this.value();this.valueDiv[a===this._valueMax()?"addClass":"removeClass"]("ui-corner-right").width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.1"})})(jQuery); +;/* + * jQuery UI Effects 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f){function k(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return l.transparent;return l[f.trim(c).toLowerCase()]}function q(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return k(b)}function m(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function n(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in r||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function s(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function j(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(f.isFunction(b)){d=b;b=null}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=q(b.elem,a);b.end=k(b.end);b.colorInit= +true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var l={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189, +183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255, +165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},o=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=n(m.call(this)),p,t=e.attr("className");f.each(o,function(u, +i){c[i]&&e[i+"Class"](c[i])});p=n(m.call(this));e.attr("className",t);e.animate(s(h,p),a,b,function(){f.each(o,function(u,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a? +f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===undefined?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.1",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!== +null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent(); +var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"}); +c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=j.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c|| +typeof c=="number"||f.fx.speeds[c])return this._show.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c])return this._hide.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||typeof c=="boolean"||f.isFunction(c))return this.__toggle.apply(this, +arguments);else{var a=j.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+ +b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2, +10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)* +a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c, +a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c, +a,b,d,e,g){if(g==undefined)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0, +d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery); +;/* + * jQuery UI Effects Blind 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a); +c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Bounce 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/ +3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a); +b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery); +;/* + * jQuery UI Effects Clip 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","left","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,c/2)}var h={};h[g.size]= +f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Drop 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","left","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e=="show"?1: +0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Explode 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f= +0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* +f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration, +a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery); +;/* + * jQuery UI Effects Scale 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a, +b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity= +1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","left","width","height","overflow","opacity"],g=["position","top","left","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=c.effects.setMode(a, +b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};if(m=="box"||m=="both"){if(d.from.y!= +d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);a.css("overflow","hidden").css(a.from); +if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);child.to=c.effects.setTransition(child, +f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,n?e:g);c.effects.removeWrapper(a);b.callback&& +b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Shake 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","left"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=(h=="pos"?"-=":"+=")+ +e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery); +;/* + * jQuery UI Effects Slide 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","left"],e=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(e=="show")a.css(f,b=="pos"?-g:g);var i={};i[f]=(e=="show"?b=="pos"? +"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Transfer 1.8.1 + * + * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/fannie/src/jquery/js/jquery.js b/fannie/src/jquery/js/jquery.js new file mode 120000 index 000000000..169c7e91d --- /dev/null +++ b/fannie/src/jquery/js/jquery.js @@ -0,0 +1 @@ +jquery-1.6.2.min.js \ No newline at end of file diff --git a/fannie/src/jquery/tests/assets/ajax-content.html b/fannie/src/jquery/tests/assets/ajax-content.html new file mode 100644 index 000000000..b0198e148 --- /dev/null +++ b/fannie/src/jquery/tests/assets/ajax-content.html @@ -0,0 +1,28 @@ +<tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> +</tr> +<tr> + <td>Student05</td> + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + +</tr> +<tr> + <td>Student06</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + <td>80</td> + <td>85</td> +</tr> diff --git a/fannie/src/jquery/tests/cell.metadata.html b/fannie/src/jquery/tests/cell.metadata.html new file mode 100644 index 000000000..60382ff6b --- /dev/null +++ b/fannie/src/jquery/tests/cell.metadata.html @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter 2.0-dev demo, multi column sorting</title> + + <style type="text/css">@import "assets/css/default.css";</style> + + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.metadata.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + + $(function() { + $("table").tablesorter({debug:true}); + }); + + </script> +</head> + +<body> +<h1>tablesorter 2.0-dev demo, multi column sorting</h1> +<p> +To select more then one column to sort by, hold down your shift key and press the "headers". +Pressing a all ready sorted column while holding down shift will reverse the order. +</p> +<p> +Releasing the shift key and pressing a column will result in a one column sort. +</p> + +<p>Not big enough? <a href="#" class="append">Add 500 random rows of data </a> (can be clicked many times, more then a 1000 rows can be slow)</p> + +<table id="large" cellspacing="0"> + + <thead> + + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th class="{sorter:'metadata'}">English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td class="{sortValue: 0}">80</td> + <td>100'70,00.00</td> + <td>75.00</td> + <td>0</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td class="{sortValue: 1}">90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td class="{sortValue: 2}">85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td class="{sortValue: 3}">60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + </tbody> +</table> + <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> +</script> +<script type="text/javascript"> +_uacct = "UA-2189649-1"; +urchinTracker(); +</script> + </body> +</html> diff --git a/fannie/src/jquery/tests/checkbox.html b/fannie/src/jquery/tests/checkbox.html new file mode 100644 index 000000000..4f654635a --- /dev/null +++ b/fannie/src/jquery/tests/checkbox.html @@ -0,0 +1,117 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter 2.0-dev demo, multi column sorting</title> + + <style type="text/css">@import "assets/css/default.css";</style> + + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + + $(function() { + + // add ie checkbox widget + $.tablesorter.addWidget({ + id: "iecheckboxes", + format: function(table) { + if($.browser.msie) { + if(!this.init) { + $(":checkbox",table).change(function() { this.checkedState = this.checked}); + this.init = true; + } + $(":checkbox",table).each(function() { + $(this).attr("checked",this.checkedState); + }); + } + } + }); + + $("table").tablesorter({widgets: ['iecheckboxes']}) + + + + + + }); + + </script> +</head> + +<body> + +<table id="large" cellspacing="0"> + + <thead> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td><form><input type="checkbox" checked=""/></form></td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td><form><input type="checkbox"/></form></td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td><form><input type="checkbox" checked=""/></form></td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td><form><input type="checkbox" checked=""/></form></td> + </tr> + </tbody> +</table> + </body> +</html> diff --git a/fannie/src/jquery/tests/colspan.html b/fannie/src/jquery/tests/colspan.html new file mode 100644 index 000000000..deb1836a4 --- /dev/null +++ b/fannie/src/jquery/tests/colspan.html @@ -0,0 +1,149 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <title>Untitled Document</title> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + $(function() { + $("table").tablesorter({debug: true}); + }); + </script> + </head> + <body> + <table id="rowspan" cellspacing="0" class="tablesorter"> + <thead> + <tr> + + <th colspan="2">General information</th> + + <th colspan="4">Degree information</th> + <th rowspan="2">Name</th> + </tr> + <tr> + <th>Major</th> + <th>Gender</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + </tr> + </thead> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + <td>80</td> + <td>70</td> + <td>75</td> + <td>80%</td> + </tr> + <tr> + <td>Student02</td> + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90%</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + <td>80</td> + <td>85%</td> + </tr> + </tbody> +</table> + +<table id="rowspan2" cellspacing="0"> + <thead> + + <tr> + <th colspan="2"> something</th> + <th> Group of information 1</th> + <th colspan="2"> Group of information 2</th> + </tr> + <tr> + <th> Col 1</th> + <th> Col 2</th> + <th> Col 3</th> + <th> Col 4</th> + <th> Col 5</th> + </tr> + + </thead> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + <td>80</td> + <td>70</td> + + </tr> + <tr> + <td>Student02</td> + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + </tr> + </tbody> +</table> +<table id="rowspan3" cellspacing="0"> + <thead> + <tr> + <th> Col 1</th> + <th> Col 2</th> + <th> Col 3</th> + <th> Col 4</th> + <th> Col 5</th> + </tr> + + </thead> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + <td>80</td> + <td>70</td> + + </tr> + <tr> + <td>Student02</td> + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + </tr> + </tbody> +</table> + </body> +</html> diff --git a/fannie/src/jquery/tests/demo.html b/fannie/src/jquery/tests/demo.html new file mode 100644 index 000000000..3b6397fba --- /dev/null +++ b/fannie/src/jquery/tests/demo.html @@ -0,0 +1,353 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter 2.0-dev demo, multi column sorting</title> + + <style type="text/css">@import "assets/css/default.css";</style> + + + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + + $(function() { + $("table").tablesorter({debug: true}) + $("a.append").click(appendData); + + + }); + + var lastStudent = 23; + var limit = 500; + + function appendData() { + + var tdTagStart = '<td>'; + var tdTagEnd = '</td>'; + var sex = ['male','female']; + var major = ['Mathematics','Languages']; + + + for(var i = 0; i < limit; i++) { + var rnd = i % 2; + var row = '<tr>'; + row += tdTagStart + 'student' + (lastStudent++) + tdTagEnd; + row += tdTagStart + major[rnd] + tdTagEnd; + row += tdTagStart + sex[rnd] + tdTagEnd; + + row += tdTagStart + randomNumber() + tdTagEnd; + row += tdTagStart + randomNumber() + tdTagEnd; + row += tdTagStart + randomNumber() + tdTagEnd; + row += tdTagStart + randomNumber() + tdTagEnd; + + row += '</tr>'; + + $("table/tbody:first").append(row); + + }; + + + $("table").trigger('update'); + return false; + } + + function randomNumber() { + return Math.floor(Math.random()*101) + } + + </script> +</head> + +<body> +<h1>tablesorter 2.0-dev demo, multi column sorting</h1> +<p> +To select more then one column to sort by, hold down your shift key and press the "headers". +Pressing a all ready sorted column while holding down shift will reverse the order. +</p> +<p> +Releasing the shift key and pressing a column will result in a one column sort. +</p> + +<p>Not big enough? <a href="#" class="append">Add 500 random rows of data </a> (can be clicked many times, more then a 1000 rows can be slow)</p> + +<table id="large" cellspacing="0" class="tablesorter"> + + <thead> + <tr> + <th colspan="2">One and Two</th> + <th rowspan="2">Three</th> + <th rowspan="2">Three</th> + <th rowspan="2">Three</th> + <th rowspan="2">Three</th> + <th rowspan="2">Three</th> + </tr> + <tr> + <th>Name</th> + <th>Major</th> + + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + </tbody> +</table> + <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> +</script> +<script type="text/javascript"> +_uacct = "UA-2189649-1"; +urchinTracker(); +</script> + </body> +</html> diff --git a/fannie/src/jquery/tests/index.html b/fannie/src/jquery/tests/index.html new file mode 100644 index 000000000..f2bf1578d --- /dev/null +++ b/fannie/src/jquery/tests/index.html @@ -0,0 +1,22 @@ + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> + +<head> + + <title>Love Peace and Nukes</title> + +</head> + + <body> + + <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> + </script> + <script type="text/javascript"> + _uacct = "UA-2189649-1"; + urchinTracker(); + </script> + + </body> + +</html> \ No newline at end of file diff --git a/fannie/src/jquery/tests/large.html b/fannie/src/jquery/tests/large.html new file mode 100644 index 000000000..64a81c29f --- /dev/null +++ b/fannie/src/jquery/tests/large.html @@ -0,0 +1,30 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter: 296 rows</title> + + <style type="text/css">@import "assets/css/default.css";</style> + + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.pager.js"></script> + <script type="text/javascript"> + $(function() { + $("table").tablesorter({debug: true, widgets: ['zebra']}); + + }); + </script> + + + + +</head> + +<body> + +</body> + +</html> + diff --git a/fannie/src/jquery/tests/lockedOrder.html b/fannie/src/jquery/tests/lockedOrder.html new file mode 100644 index 000000000..0f3432a05 --- /dev/null +++ b/fannie/src/jquery/tests/lockedOrder.html @@ -0,0 +1,355 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter 2.0-dev demo, multi column sorting</title> + + <style type="text/css">@import "assets/css/default.css";</style> + + + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + + $(function() { + $("table").tablesorter({debug: true, headers: { + 3: { + lockedOrder: 1 + } + }}); + $("a.append").click(appendData); + + + }); + + var lastStudent = 23; + var limit = 500; + + function appendData() { + + var tdTagStart = '<td>'; + var tdTagEnd = '</td>'; + var sex = ['male','female']; + var major = ['Mathematics','Languages']; + + + for(var i = 0; i < limit; i++) { + var rnd = i % 2; + var row = '<tr>'; + row += tdTagStart + 'student' + (lastStudent++) + tdTagEnd; + row += tdTagStart + major[rnd] + tdTagEnd; + row += tdTagStart + sex[rnd] + tdTagEnd; + + row += tdTagStart + randomNumber() + tdTagEnd; + row += tdTagStart + randomNumber() + tdTagEnd; + row += tdTagStart + randomNumber() + tdTagEnd; + row += tdTagStart + randomNumber() + tdTagEnd; + + row += '</tr>'; + + $("table/tbody:first").append(row); + + }; + + + $("table").trigger('update'); + return false; + } + + function randomNumber() { + return Math.floor(Math.random()*101) + } + + </script> +</head> + +<body> +<h1>tablesorter 2.0-dev demo, multi column sorting</h1> +<p> +To select more then one column to sort by, hold down your shift key and press the "headers". +Pressing a all ready sorted column while holding down shift will reverse the order. +</p> +<p> +Releasing the shift key and pressing a column will result in a one column sort. +</p> + +<p>Not big enough? <a href="#" class="append">Add 500 random rows of data </a> (can be clicked many times, more then a 1000 rows can be slow)</p> + +<table id="large" cellspacing="0" class="tablesorter"> + + <thead> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + </tbody> +</table> + <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> +</script> +<script type="text/javascript"> +_uacct = "UA-2189649-1"; +urchinTracker(); +</script> + </body> +</html> diff --git a/fannie/src/jquery/tests/metadata.html b/fannie/src/jquery/tests/metadata.html new file mode 100644 index 000000000..738d1efbc --- /dev/null +++ b/fannie/src/jquery/tests/metadata.html @@ -0,0 +1,320 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter 2.0-dev demo, multi column sorting</title> + + <style type="text/css">@import "assets/css/default.css";</style> + + <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.metadata.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + + $(function() { + /* + $("table").tablesorter({ +                             cssAsc: 'ascsort' +                             ,cssDesc: 'descsort' +                             ,cssHeader: 'unsorted' +                             ,headers: { 0: { sorter: false } +                                       } +                             ,sortForce: [2, 1] +                        }); + */ + + + }); + + </script> +</head> + +<body> +<h1>tablesorter 2.0-dev demo, multi column sorting</h1> +<p> +To select more then one column to sort by, hold down your shift key and press the "headers". +Pressing a all ready sorted column while holding down shift will reverse the order. +</p> +<p> +Releasing the shift key and pressing a column will result in a one column sort. +</p> + +<p>Not big enough? <a href="#" class="append">Add 500 random rows of data </a> (can be clicked many times, more then a 1000 rows can be slow)</p> + +<table id="large" cellspacing="0"> + + <thead> + + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th data="sorter:'none'">English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + </tbody> +</table> + <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> +</script> +<script type="text/javascript"> +_uacct = "UA-2189649-1"; +urchinTracker(); +</script> + </body> +</html> diff --git a/fannie/src/jquery/tests/multiple-headers.html b/fannie/src/jquery/tests/multiple-headers.html new file mode 100644 index 000000000..9ff782f5d --- /dev/null +++ b/fannie/src/jquery/tests/multiple-headers.html @@ -0,0 +1,67 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <title>Untitled Document</title> + <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" id="" media="print, projection, screen" /> + <script type="text/javascript" src="../jquery-latest.js"></script> + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + <script type="text/javascript"> + $(function() { + $("table").tablesorter({debug: true}); + }); + </script> + </head> + <body> + <table id="rowspan" cellspacing="0" class="tablesorter"> + <thead> + <tr> + + <th colspan="2">General information</th> + + <th colspan="3">Degree information</th> + <th rowspan="2">Geometry</th> + + </tr> + <tr> + <th>Major</th> + <th>Gender</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + + </tr> + </thead> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + <td></td> + <td>70</td> + <td></td> + + </tr> + <tr> + <td>Student02</td> + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td></td> + + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + <td>80</td> + + </tr> + </tbody> +</table> + </body> +</html> diff --git a/fannie/src/jquery/tests/pager.html b/fannie/src/jquery/tests/pager.html new file mode 100644 index 000000000..7f5811e60 --- /dev/null +++ b/fannie/src/jquery/tests/pager.html @@ -0,0 +1,553 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html> +<head> +<title>tablesorter: 296 rows</title> + + <style type="text/css">@import "../docs/assets/css/default.css";</style> + <style type="text/css">@import "../addons/pager/jquery.tablesorter.pager.css";</style> + <style type="text/css">@import "assets/css/default.css";</style> + + <script type="text/javascript" src="../jquery-latest.js"></script> + + <script type="text/javascript" src="../jquery.tablesorter.js"></script> + + <script type="text/javascript"> + $(function() { + $("table") + .tablesorter({debug: true}) + //.tablesorterPager({container: $("#pager")}); + }); + </script> +</head> + +<body> +<table cellspacing="0" id="large"> + <thead> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </thead> + <tfoot> + <tr> + <th>Name</th> + <th>Major</th> + <th>Sex</th> + <th>English</th> + <th>Japanese</th> + <th>Calculus</th> + <th>Geometry</th> + + </tr> + </tfoot> + <tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr></tbody> + <tr> + <td>Student01</td> + <td>Languages</td> + <td>male</td> + + <td>80</td> + <td>70</td> + <td>75</td> + <td>80</td> + </tr> + <tr> + <td>Student02</td> + + <td>Mathematics</td> + <td>male</td> + <td>90</td> + <td>88</td> + <td>100</td> + <td>90</td> + + </tr> + <tr> + <td>Student03</td> + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>95</td> + + <td>80</td> + <td>85</td> + </tr> + <tr> + <td>Student04</td> + <td>Languages</td> + <td>male</td> + + <td>60</td> + <td>55</td> + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student05</td> + + <td>Languages</td> + <td>female</td> + <td>68</td> + <td>80</td> + <td>95</td> + <td>80</td> + + </tr> + <tr> + <td>Student06</td> + <td>Mathematics</td> + <td>male</td> + <td>100</td> + <td>99</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student07</td> + <td>Mathematics</td> + <td>male</td> + + <td>85</td> + <td>68</td> + <td>90</td> + <td>90</td> + </tr> + <tr> + <td>Student08</td> + + <td>Languages</td> + <td>male</td> + <td>100</td> + <td>90</td> + <td>90</td> + <td>85</td> + + </tr> + <tr> + <td>Student09</td> + <td>Mathematics</td> + <td>male</td> + <td>80</td> + <td>50</td> + + <td>65</td> + <td>75</td> + </tr> + <tr> + <td>Student10</td> + <td>Languages</td> + <td>male</td> + + <td>85</td> + <td>100</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student11</td> + + <td>Languages</td> + <td>male</td> + <td>86</td> + <td>85</td> + <td>100</td> + <td>100</td> + + </tr> + <tr> + <td>Student12</td> + <td>Mathematics</td> + <td>female</td> + <td>100</td> + <td>75</td> + + <td>70</td> + <td>85</td> + </tr> + <tr> + <td>Student13</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>80</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student14</td> + + <td>Languages</td> + <td>female</td> + <td>50</td> + <td>45</td> + <td>55</td> + <td>90</td> + + </tr> + <tr> + <td>Student15</td> + <td>Languages</td> + <td>male</td> + <td>95</td> + <td>35</td> + + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student16</td> + <td>Languages</td> + <td>female</td> + + <td>100</td> + <td>50</td> + <td>30</td> + <td>70</td> + </tr> + <tr> + <td>Student17</td> + + <td>Languages</td> + <td>female</td> + <td>80</td> + <td>100</td> + <td>55</td> + <td>65</td> + + </tr> + <tr> + <td>Student18</td> + <td>Mathematics</td> + <td>male</td> + <td>30</td> + <td>49</td> + + <td>55</td> + <td>75</td> + </tr> + <tr> + <td>Student19</td> + <td>Languages</td> + <td>male</td> + + <td>68</td> + <td>90</td> + <td>88</td> + <td>70</td> + </tr> + <tr> + <td>Student20</td> + + <td>Mathematics</td> + <td>male</td> + <td>40</td> + <td>45</td> + <td>40</td> + <td>80</td> + + </tr> + <tr> + <td>Student21</td> + <td>Languages</td> + <td>male</td> + <td>50</td> + <td>45</td> + + <td>100</td> + <td>100</td> + </tr> + <tr> + <td>Student22</td> + <td>Mathematics</td> + <td>male</td> + + <td>100</td> + <td>99</td> + <td>100</td> + <td>90</td> + </tr> + <tr> + <td>Student23</td> + + <td>Languages</td> + <td>female</td> + <td>85</td> + <td>80</td> + <td>80</td> + <td>80</td> + + </tr> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr></tbody> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr></tbody> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr></tbody> + <tr><td>student23</td><td>Mathematics</td><td>male</td><td>82</td><td>77</td><td>0</td><td>79</td></tr><tr><td>student24</td><td>Languages</td><td>female</td><td>100</td><td>91</td><td>13</td><td>82</td></tr><tr><td>student25</td><td>Mathematics</td><td>male</td><td>22</td><td>96</td><td>82</td><td>53</td></tr><tr><td>student26</td><td>Languages</td><td>female</td><td>37</td><td>29</td><td>56</td><td>59</td></tr><tr><td>student27</td><td>Mathematics</td><td>male</td><td>86</td><td>82</td><td>69</td><td>23</td></tr><tr><td>student28</td><td>Languages</td><td>female</td><td>44</td><td>25</td><td>43</td><td>1</td></tr><tr><td>student29</td><td>Mathematics</td><td>male</td><td>77</td><td>47</td><td>22</td><td>38</td></tr><tr><td>student30</td><td>Languages</td><td>female</td><td>19</td><td>35</td><td>23</td><td>10</td></tr><tr><td>student31</td><td>Mathematics</td><td>male</td><td>90</td><td>27</td><td>17</td><td>50</td></tr><tr><td>student32</td><td>Languages</td><td>female</td><td>60</td><td>75</td><td>33</td><td>38</td></tr><tr><td>student33</td><td>Mathematics</td><td>male</td><td>4</td><td>31</td><td>37</td><td>15</td></tr><tr><td>student34</td><td>Languages</td><td>female</td><td>77</td><td>97</td><td>81</td><td>44</td></tr><tr><td>student35</td><td>Mathematics</td><td>male</td><td>5</td><td>81</td><td>51</td><td>95</td></tr><tr><td>student36</td><td>Languages</td><td>female</td><td>70</td><td>61</td><td>70</td><td>94</td></tr><tr><td>student37</td><td>Mathematics</td><td>male</td><td>60</td><td>3</td><td>61</td><td>84</td></tr><tr><td>student38</td><td>Languages</td><td>female</td><td>63</td><td>39</td><td>0</td><td>11</td></tr><tr><td>student39</td><td>Mathematics</td><td>male</td><td>50</td><td>46</td><td>32</td><td>38</td></tr><tr><td>student40</td><td>Languages</td><td>female</td><td>51</td><td>75</td><td>25</td><td>3</td></tr><tr><td>student41</td><td>Mathematics</td><td>male</td><td>43</td><td>34</td><td>28</td><td>78</td></tr><tr><td>student42</td><td>Languages</td><td>female</td><td>11</td><td>89</td><td>60</td><td>95</td></tr><tr><td>student43</td><td>Mathematics</td><td>male</td><td>48</td><td>92</td><td>18</td><td>88</td></tr><tr><td>student44</td><td>Languages</td><td>female</td><td>82</td><td>2</td><td>59</td><td>73</td></tr><tr><td>student45</td><td>Mathematics</td><td>male</td><td>91</td><td>73</td><td>37</td><td>39</td></tr><tr><td>student46</td><td>Languages</td><td>female</td><td>4</td><td>8</td><td>12</td><td>10</td></tr><tr><td>student47</td><td>Mathematics</td><td>male</td><td>89</td><td>10</td><td>6</td><td>11</td></tr><tr><td>student48</td><td>Languages</td><td>female</td><td>90</td><td>32</td><td>21</td><td>18</td></tr><tr><td>student49</td><td>Mathematics</td><td>male</td><td>42</td><td>49</td><td>49</td><td>72</td></tr><tr><td>student50</td><td>Languages</td><td>female</td><td>56</td><td>37</td><td>67</td><td>54</td></tr><tr><td>student51</td><td>Mathematics</td><td>male</td><td>48</td><td>31</td><td>55</td><td>63</td></tr><tr><td>student52</td><td>Languages</td><td>female</td><td>38</td><td>91</td><td>71</td><td>74</td></tr><tr><td>student53</td><td>Mathematics</td><td>male</td><td>2</td><td>63</td><td>85</td><td>100</td></tr><tr><td>student54</td><td>Languages</td><td>female</td><td>75</td><td>81</td><td>16</td><td>23</td></tr><tr><td>student55</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>15</td><td>53</td></tr><tr><td>student56</td><td>Languages</td><td>female</td><td>23</td><td>52</td><td>79</td><td>94</td></tr><tr><td>student57</td><td>Mathematics</td><td>male</td><td>80</td><td>22</td><td>61</td><td>12</td></tr><tr><td>student58</td><td>Languages</td><td>female</td><td>53</td><td>5</td><td>79</td><td>79</td></tr><tr><td>student59</td><td>Mathematics</td><td>male</td><td>96</td><td>32</td><td>35</td><td>17</td></tr><tr><td>student60</td><td>Languages</td><td>female</td><td>16</td><td>76</td><td>65</td><td>27</td></tr><tr><td>student61</td><td>Mathematics</td><td>male</td><td>20</td><td>57</td><td>22</td><td>23</td></tr><tr><td>student62</td><td>Languages</td><td>female</td><td>19</td><td>83</td><td>87</td><td>78</td></tr><tr><td>student63</td><td>Mathematics</td><td>male</td><td>2</td><td>5</td><td>83</td><td>30</td></tr><tr><td>student64</td><td>Languages</td><td>female</td><td>0</td><td>21</td><td>9</td><td>93</td></tr><tr><td>student65</td><td>Mathematics</td><td>male</td><td>20</td><td>86</td><td>13</td><td>96</td></tr><tr><td>student66</td><td>Languages</td><td>female</td><td>28</td><td>35</td><td>87</td><td>57</td></tr><tr><td>student67</td><td>Mathematics</td><td>male</td><td>36</td><td>50</td><td>29</td><td>10</td></tr><tr><td>student68</td><td>Languages</td><td>female</td><td>60</td><td>90</td><td>96</td><td>6</td></tr><tr><td>student69</td><td>Mathematics</td><td>male</td><td>34</td><td>61</td><td>43</td><td>98</td></tr><tr><td>student70</td><td>Languages</td><td>female</td><td>13</td><td>37</td><td>91</td><td>83</td></tr><tr><td>student71</td><td>Mathematics</td><td>male</td><td>47</td><td>80</td><td>57</td><td>82</td></tr><tr><td>student72</td><td>Languages</td><td>female</td><td>69</td><td>43</td><td>37</td><td>37</td></tr><tr><td>student73</td><td>Mathematics</td><td>male</td><td>54</td><td>60</td><td>94</td><td>21</td></tr><tr><td>student74</td><td>Languages</td><td>female</td><td>71</td><td>14</td><td>34</td><td>46</td></tr><tr><td>student75</td><td>Mathematics</td><td>male</td><td>89</td><td>96</td><td>31</td><td>17</td></tr><tr><td>student76</td><td>Languages</td><td>female</td><td>28</td><td>48</td><td>29</td><td>94</td></tr><tr><td>student77</td><td>Mathematics</td><td>male</td><td>100</td><td>65</td><td>20</td><td>24</td></tr><tr><td>student78</td><td>Languages</td><td>female</td><td>11</td><td>96</td><td>90</td><td>33</td></tr><tr><td>student79</td><td>Mathematics</td><td>male</td><td>53</td><td>55</td><td>93</td><td>39</td></tr><tr><td>student80</td><td>Languages</td><td>female</td><td>1</td><td>100</td><td>84</td><td>44</td></tr><tr><td>student81</td><td>Mathematics</td><td>male</td><td>63</td><td>78</td><td>96</td><td>43</td></tr><tr><td>student82</td><td>Languages</td><td>female</td><td>41</td><td>69</td><td>82</td><td>35</td></tr><tr><td>student83</td><td>Mathematics</td><td>male</td><td>94</td><td>98</td><td>13</td><td>9</td></tr><tr><td>student84</td><td>Languages</td><td>female</td><td>94</td><td>72</td><td>91</td><td>77</td></tr><tr><td>student85</td><td>Mathematics</td><td>male</td><td>71</td><td>32</td><td>45</td><td>25</td></tr><tr><td>student86</td><td>Languages</td><td>female</td><td>9</td><td>89</td><td>64</td><td>37</td></tr><tr><td>student87</td><td>Mathematics</td><td>male</td><td>89</td><td>1</td><td>73</td><td>67</td></tr><tr><td>student88</td><td>Languages</td><td>female</td><td>43</td><td>41</td><td>68</td><td>79</td></tr><tr><td>student89</td><td>Mathematics</td><td>male</td><td>7</td><td>38</td><td>22</td><td>37</td></tr><tr><td>student90</td><td>Languages</td><td>female</td><td>94</td><td>83</td><td>93</td><td>37</td></tr><tr><td>student91</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>2</td><td>61</td></tr><tr><td>student92</td><td>Languages</td><td>female</td><td>46</td><td>41</td><td>30</td><td>69</td></tr><tr><td>student93</td><td>Mathematics</td><td>male</td><td>47</td><td>19</td><td>85</td><td>83</td></tr><tr><td>student94</td><td>Languages</td><td>female</td><td>39</td><td>14</td><td>64</td><td>62</td></tr><tr><td>student95</td><td>Mathematics</td><td>male</td><td>71</td><td>31</td><td>46</td><td>28</td></tr><tr><td>student96</td><td>Languages</td><td>female</td><td>90</td><td>94</td><td>45</td><td>40</td></tr><tr><td>student97</td><td>Mathematics</td><td>male</td><td>46</td><td>89</td><td>2</td><td>5</td></tr><tr><td>student98</td><td>Languages</td><td>female</td><td>41</td><td>43</td><td>47</td><td>99</td></tr><tr><td>student99</td><td>Mathematics</td><td>male</td><td>71</td><td>90</td><td>89</td><td>73</td></tr><tr><td>student100</td><td>Languages</td><td>female</td><td>31</td><td>64</td><td>18</td><td>56</td></tr><tr><td>student101</td><td>Mathematics</td><td>male</td><td>52</td><td>13</td><td>69</td><td>99</td></tr><tr><td>student102</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>83</td><td>18</td></tr><tr><td>student103</td><td>Mathematics</td><td>male</td><td>23</td><td>65</td><td>98</td><td>80</td></tr><tr><td>student104</td><td>Languages</td><td>female</td><td>78</td><td>100</td><td>57</td><td>66</td></tr><tr><td>student105</td><td>Mathematics</td><td>male</td><td>69</td><td>21</td><td>43</td><td>97</td></tr><tr><td>student106</td><td>Languages</td><td>female</td><td>27</td><td>2</td><td>78</td><td>38</td></tr><tr><td>student107</td><td>Mathematics</td><td>male</td><td>86</td><td>96</td><td>46</td><td>34</td></tr><tr><td>student108</td><td>Languages</td><td>female</td><td>13</td><td>84</td><td>66</td><td>64</td></tr><tr><td>student109</td><td>Mathematics</td><td>male</td><td>35</td><td>95</td><td>98</td><td>81</td></tr><tr><td>student110</td><td>Languages</td><td>female</td><td>30</td><td>28</td><td>62</td><td>54</td></tr><tr><td>student111</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>35</td><td>85</td></tr><tr><td>student112</td><td>Languages</td><td>female</td><td>19</td><td>81</td><td>19</td><td>69</td></tr><tr><td>student113</td><td>Mathematics</td><td>male</td><td>66</td><td>5</td><td>98</td><td>54</td></tr><tr><td>student114</td><td>Languages</td><td>female</td><td>38</td><td>80</td><td>40</td><td>16</td></tr><tr><td>student115</td><td>Mathematics</td><td>male</td><td>5</td><td>84</td><td>96</td><td>97</td></tr><tr><td>student116</td><td>Languages</td><td>female</td><td>59</td><td>97</td><td>69</td><td>54</td></tr><tr><td>student117</td><td>Mathematics</td><td>male</td><td>0</td><td>34</td><td>79</td><td>49</td></tr><tr><td>student118</td><td>Languages</td><td>female</td><td>18</td><td>7</td><td>12</td><td>85</td></tr><tr><td>student119</td><td>Mathematics</td><td>male</td><td>93</td><td>87</td><td>7</td><td>59</td></tr><tr><td>student120</td><td>Languages</td><td>female</td><td>42</td><td>23</td><td>26</td><td>90</td></tr><tr><td>student121</td><td>Mathematics</td><td>male</td><td>17</td><td>39</td><td>66</td><td>89</td></tr><tr><td>student122</td><td>Languages</td><td>female</td><td>26</td><td>75</td><td>90</td><td>18</td></tr><tr><td>student123</td><td>Mathematics</td><td>male</td><td>34</td><td>23</td><td>77</td><td>80</td></tr><tr><td>student124</td><td>Languages</td><td>female</td><td>52</td><td>6</td><td>77</td><td>42</td></tr><tr><td>student125</td><td>Mathematics</td><td>male</td><td>56</td><td>2</td><td>85</td><td>81</td></tr><tr><td>student126</td><td>Languages</td><td>female</td><td>51</td><td>35</td><td>67</td><td>44</td></tr><tr><td>student127</td><td>Mathematics</td><td>male</td><td>64</td><td>64</td><td>44</td><td>34</td></tr><tr><td>student128</td><td>Languages</td><td>female</td><td>67</td><td>91</td><td>79</td><td>82</td></tr><tr><td>student129</td><td>Mathematics</td><td>male</td><td>4</td><td>26</td><td>15</td><td>79</td></tr><tr><td>student130</td><td>Languages</td><td>female</td><td>72</td><td>10</td><td>3</td><td>69</td></tr><tr><td>student131</td><td>Mathematics</td><td>male</td><td>94</td><td>77</td><td>51</td><td>1</td></tr><tr><td>student132</td><td>Languages</td><td>female</td><td>27</td><td>95</td><td>85</td><td>48</td></tr><tr><td>student133</td><td>Mathematics</td><td>male</td><td>92</td><td>11</td><td>40</td><td>61</td></tr><tr><td>student134</td><td>Languages</td><td>female</td><td>4</td><td>18</td><td>56</td><td>60</td></tr><tr><td>student135</td><td>Mathematics</td><td>male</td><td>8</td><td>42</td><td>26</td><td>52</td></tr><tr><td>student136</td><td>Languages</td><td>female</td><td>7</td><td>60</td><td>47</td><td>21</td></tr><tr><td>student137</td><td>Mathematics</td><td>male</td><td>51</td><td>81</td><td>30</td><td>90</td></tr><tr><td>student138</td><td>Languages</td><td>female</td><td>58</td><td>6</td><td>16</td><td>73</td></tr><tr><td>student139</td><td>Mathematics</td><td>male</td><td>48</td><td>38</td><td>37</td><td>31</td></tr><tr><td>student140</td><td>Languages</td><td>female</td><td>33</td><td>26</td><td>56</td><td>60</td></tr><tr><td>student141</td><td>Mathematics</td><td>male</td><td>84</td><td>84</td><td>29</td><td>75</td></tr><tr><td>student142</td><td>Languages</td><td>female</td><td>72</td><td>35</td><td>6</td><td>54</td></tr><tr><td>student143</td><td>Mathematics</td><td>male</td><td>31</td><td>42</td><td>70</td><td>82</td></tr><tr><td>student144</td><td>Languages</td><td>female</td><td>94</td><td>87</td><td>50</td><td>35</td></tr><tr><td>student145</td><td>Mathematics</td><td>male</td><td>91</td><td>52</td><td>80</td><td>26</td></tr><tr><td>student146</td><td>Languages</td><td>female</td><td>78</td><td>65</td><td>79</td><td>79</td></tr><tr><td>student147</td><td>Mathematics</td><td>male</td><td>50</td><td>90</td><td>59</td><td>71</td></tr><tr><td>student148</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>66</td><td>33</td></tr><tr><td>student149</td><td>Mathematics</td><td>male</td><td>17</td><td>36</td><td>34</td><td>13</td></tr><tr><td>student150</td><td>Languages</td><td>female</td><td>30</td><td>95</td><td>69</td><td>73</td></tr><tr><td>student151</td><td>Mathematics</td><td>male</td><td>20</td><td>53</td><td>49</td><td>58</td></tr><tr><td>student152</td><td>Languages</td><td>female</td><td>19</td><td>89</td><td>60</td><td>60</td></tr><tr><td>student153</td><td>Mathematics</td><td>male</td><td>52</td><td>82</td><td>20</td><td>3</td></tr><tr><td>student154</td><td>Languages</td><td>female</td><td>66</td><td>98</td><td>53</td><td>66</td></tr><tr><td>student155</td><td>Mathematics</td><td>male</td><td>5</td><td>85</td><td>22</td><td>58</td></tr><tr><td>student156</td><td>Languages</td><td>female</td><td>34</td><td>43</td><td>68</td><td>8</td></tr><tr><td>student157</td><td>Mathematics</td><td>male</td><td>43</td><td>0</td><td>91</td><td>14</td></tr><tr><td>student158</td><td>Languages</td><td>female</td><td>34</td><td>18</td><td>67</td><td>31</td></tr><tr><td>student159</td><td>Mathematics</td><td>male</td><td>79</td><td>73</td><td>34</td><td>52</td></tr><tr><td>student160</td><td>Languages</td><td>female</td><td>15</td><td>61</td><td>37</td><td>27</td></tr><tr><td>student161</td><td>Mathematics</td><td>male</td><td>74</td><td>77</td><td>15</td><td>45</td></tr><tr><td>student162</td><td>Languages</td><td>female</td><td>52</td><td>62</td><td>19</td><td>58</td></tr><tr><td>student163</td><td>Mathematics</td><td>male</td><td>77</td><td>60</td><td>27</td><td>95</td></tr><tr><td>student164</td><td>Languages</td><td>female</td><td>96</td><td>1</td><td>93</td><td>57</td></tr><tr><td>student165</td><td>Mathematics</td><td>male</td><td>51</td><td>63</td><td>75</td><td>19</td></tr><tr><td>student166</td><td>Languages</td><td>female</td><td>32</td><td>44</td><td>72</td><td>99</td></tr><tr><td>student167</td><td>Mathematics</td><td>male</td><td>82</td><td>84</td><td>57</td><td>63</td></tr><tr><td>student168</td><td>Languages</td><td>female</td><td>53</td><td>12</td><td>85</td><td>67</td></tr><tr><td>student169</td><td>Mathematics</td><td>male</td><td>49</td><td>16</td><td>84</td><td>6</td></tr><tr><td>student170</td><td>Languages</td><td>female</td><td>39</td><td>34</td><td>16</td><td>65</td></tr><tr><td>student171</td><td>Mathematics</td><td>male</td><td>100</td><td>68</td><td>88</td><td>4</td></tr><tr><td>student172</td><td>Languages</td><td>female</td><td>14</td><td>25</td><td>63</td><td>52</td></tr><tr><td>student173</td><td>Mathematics</td><td>male</td><td>74</td><td>26</td><td>15</td><td>60</td></tr><tr><td>student174</td><td>Languages</td><td>female</td><td>11</td><td>58</td><td>8</td><td>92</td></tr><tr><td>student175</td><td>Mathematics</td><td>male</td><td>62</td><td>47</td><td>2</td><td>31</td></tr><tr><td>student176</td><td>Languages</td><td>female</td><td>65</td><td>26</td><td>32</td><td>42</td></tr><tr><td>student177</td><td>Mathematics</td><td>male</td><td>83</td><td>78</td><td>69</td><td>24</td></tr><tr><td>student178</td><td>Languages</td><td>female</td><td>14</td><td>100</td><td>7</td><td>43</td></tr><tr><td>student179</td><td>Mathematics</td><td>male</td><td>28</td><td>35</td><td>89</td><td>7</td></tr><tr><td>student180</td><td>Languages</td><td>female</td><td>1</td><td>48</td><td>39</td><td>62</td></tr><tr><td>student181</td><td>Mathematics</td><td>male</td><td>14</td><td>4</td><td>24</td><td>69</td></tr><tr><td>student182</td><td>Languages</td><td>female</td><td>64</td><td>52</td><td>72</td><td>2</td></tr><tr><td>student183</td><td>Mathematics</td><td>male</td><td>15</td><td>26</td><td>27</td><td>85</td></tr><tr><td>student184</td><td>Languages</td><td>female</td><td>91</td><td>49</td><td>40</td><td>7</td></tr><tr><td>student185</td><td>Mathematics</td><td>male</td><td>87</td><td>89</td><td>42</td><td>87</td></tr><tr><td>student186</td><td>Languages</td><td>female</td><td>75</td><td>76</td><td>61</td><td>88</td></tr><tr><td>student187</td><td>Mathematics</td><td>male</td><td>11</td><td>48</td><td>66</td><td>30</td></tr><tr><td>student188</td><td>Languages</td><td>female</td><td>73</td><td>7</td><td>92</td><td>72</td></tr><tr><td>student189</td><td>Mathematics</td><td>male</td><td>98</td><td>36</td><td>58</td><td>15</td></tr><tr><td>student190</td><td>Languages</td><td>female</td><td>80</td><td>2</td><td>86</td><td>56</td></tr><tr><td>student191</td><td>Mathematics</td><td>male</td><td>36</td><td>33</td><td>97</td><td>4</td></tr><tr><td>student192</td><td>Languages</td><td>female</td><td>59</td><td>2</td><td>33</td><td>90</td></tr><tr><td>student193</td><td>Mathematics</td><td>male</td><td>94</td><td>6</td><td>19</td><td>33</td></tr><tr><td>student194</td><td>Languages</td><td>female</td><td>82</td><td>49</td><td>72</td><td>42</td></tr><tr><td>student195</td><td>Mathematics</td><td>male</td><td>80</td><td>59</td><td>8</td><td>30</td></tr><tr><td>student196</td><td>Languages</td><td>female</td><td>89</td><td>17</td><td>90</td><td>27</td></tr><tr><td>student197</td><td>Mathematics</td><td>male</td><td>46</td><td>22</td><td>6</td><td>67</td></tr><tr><td>student198</td><td>Languages</td><td>female</td><td>65</td><td>75</td><td>73</td><td>77</td></tr><tr><td>student199</td><td>Mathematics</td><td>male</td><td>77</td><td>97</td><td>54</td><td>13</td></tr><tr><td>student200</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>57</td><td>96</td></tr><tr><td>student201</td><td>Mathematics</td><td>male</td><td>92</td><td>21</td><td>11</td><td>80</td></tr><tr><td>student202</td><td>Languages</td><td>female</td><td>45</td><td>49</td><td>93</td><td>40</td></tr><tr><td>student203</td><td>Mathematics</td><td>male</td><td>74</td><td>25</td><td>87</td><td>53</td></tr><tr><td>student204</td><td>Languages</td><td>female</td><td>15</td><td>71</td><td>23</td><td>4</td></tr><tr><td>student205</td><td>Mathematics</td><td>male</td><td>82</td><td>97</td><td>95</td><td>73</td></tr><tr><td>student206</td><td>Languages</td><td>female</td><td>82</td><td>60</td><td>58</td><td>98</td></tr><tr><td>student207</td><td>Mathematics</td><td>male</td><td>26</td><td>64</td><td>11</td><td>100</td></tr><tr><td>student208</td><td>Languages</td><td>female</td><td>64</td><td>9</td><td>60</td><td>45</td></tr><tr><td>student209</td><td>Mathematics</td><td>male</td><td>96</td><td>81</td><td>96</td><td>63</td></tr><tr><td>student210</td><td>Languages</td><td>female</td><td>24</td><td>39</td><td>0</td><td>69</td></tr><tr><td>student211</td><td>Mathematics</td><td>male</td><td>86</td><td>64</td><td>7</td><td>10</td></tr><tr><td>student212</td><td>Languages</td><td>female</td><td>7</td><td>64</td><td>50</td><td>7</td></tr><tr><td>student213</td><td>Mathematics</td><td>male</td><td>59</td><td>12</td><td>26</td><td>77</td></tr><tr><td>student214</td><td>Languages</td><td>female</td><td>21</td><td>25</td><td>93</td><td>82</td></tr><tr><td>student215</td><td>Mathematics</td><td>male</td><td>22</td><td>18</td><td>64</td><td>51</td></tr><tr><td>student216</td><td>Languages</td><td>female</td><td>92</td><td>41</td><td>98</td><td>28</td></tr><tr><td>student217</td><td>Mathematics</td><td>male</td><td>32</td><td>48</td><td>14</td><td>17</td></tr><tr><td>student218</td><td>Languages</td><td>female</td><td>62</td><td>36</td><td>85</td><td>56</td></tr><tr><td>student219</td><td>Mathematics</td><td>male</td><td>33</td><td>37</td><td>90</td><td>87</td></tr><tr><td>student220</td><td>Languages</td><td>female</td><td>24</td><td>43</td><td>60</td><td>84</td></tr><tr><td>student221</td><td>Mathematics</td><td>male</td><td>6</td><td>59</td><td>37</td><td>51</td></tr><tr><td>student222</td><td>Languages</td><td>female</td><td>91</td><td>97</td><td>5</td><td>76</td></tr><tr><td>student223</td><td>Mathematics</td><td>male</td><td>86</td><td>29</td><td>32</td><td>27</td></tr><tr><td>student224</td><td>Languages</td><td>female</td><td>63</td><td>59</td><td>68</td><td>91</td></tr><tr><td>student225</td><td>Mathematics</td><td>male</td><td>57</td><td>73</td><td>95</td><td>68</td></tr><tr><td>student226</td><td>Languages</td><td>female</td><td>38</td><td>54</td><td>59</td><td>87</td></tr><tr><td>student227</td><td>Mathematics</td><td>male</td><td>53</td><td>62</td><td>72</td><td>64</td></tr><tr><td>student228</td><td>Languages</td><td>female</td><td>62</td><td>84</td><td>72</td><td>73</td></tr><tr><td>student229</td><td>Mathematics</td><td>male</td><td>13</td><td>0</td><td>83</td><td>58</td></tr><tr><td>student230</td><td>Languages</td><td>female</td><td>35</td><td>65</td><td>80</td><td>87</td></tr><tr><td>student231</td><td>Mathematics</td><td>male</td><td>76</td><td>20</td><td>28</td><td>50</td></tr><tr><td>student232</td><td>Languages</td><td>female</td><td>9</td><td>17</td><td>66</td><td>33</td></tr><tr><td>student233</td><td>Mathematics</td><td>male</td><td>92</td><td>2</td><td>99</td><td>61</td></tr><tr><td>student234</td><td>Languages</td><td>female</td><td>47</td><td>69</td><td>98</td><td>39</td></tr><tr><td>student235</td><td>Mathematics</td><td>male</td><td>21</td><td>44</td><td>38</td><td>82</td></tr><tr><td>student236</td><td>Languages</td><td>female</td><td>19</td><td>86</td><td>51</td><td>78</td></tr><tr><td>student237</td><td>Mathematics</td><td>male</td><td>28</td><td>45</td><td>49</td><td>36</td></tr><tr><td>student238</td><td>Languages</td><td>female</td><td>78</td><td>19</td><td>49</td><td>81</td></tr><tr><td>student239</td><td>Mathematics</td><td>male</td><td>72</td><td>69</td><td>47</td><td>20</td></tr><tr><td>student240</td><td>Languages</td><td>female</td><td>17</td><td>43</td><td>66</td><td>56</td></tr><tr><td>student241</td><td>Mathematics</td><td>male</td><td>90</td><td>1</td><td>94</td><td>4</td></tr><tr><td>student242</td><td>Languages</td><td>female</td><td>6</td><td>18</td><td>2</td><td>51</td></tr><tr><td>student243</td><td>Mathematics</td><td>male</td><td>1</td><td>37</td><td>72</td><td>13</td></tr><tr><td>student244</td><td>Languages</td><td>female</td><td>80</td><td>0</td><td>58</td><td>54</td></tr><tr><td>student245</td><td>Mathematics</td><td>male</td><td>83</td><td>31</td><td>85</td><td>9</td></tr><tr><td>student246</td><td>Languages</td><td>female</td><td>90</td><td>99</td><td>29</td><td>12</td></tr><tr><td>student247</td><td>Mathematics</td><td>male</td><td>89</td><td>23</td><td>81</td><td>59</td></tr><tr><td>student248</td><td>Languages</td><td>female</td><td>72</td><td>26</td><td>28</td><td>3</td></tr><tr><td>student249</td><td>Mathematics</td><td>male</td><td>28</td><td>10</td><td>50</td><td>47</td></tr><tr><td>student250</td><td>Languages</td><td>female</td><td>89</td><td>14</td><td>89</td><td>4</td></tr><tr><td>student251</td><td>Mathematics</td><td>male</td><td>15</td><td>23</td><td>37</td><td>69</td></tr><tr><td>student252</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>10</td><td>36</td></tr><tr><td>student253</td><td>Mathematics</td><td>male</td><td>49</td><td>45</td><td>64</td><td>23</td></tr><tr><td>student254</td><td>Languages</td><td>female</td><td>79</td><td>75</td><td>63</td><td>74</td></tr><tr><td>student255</td><td>Mathematics</td><td>male</td><td>2</td><td>56</td><td>64</td><td>75</td></tr><tr><td>student256</td><td>Languages</td><td>female</td><td>36</td><td>26</td><td>29</td><td>58</td></tr><tr><td>student257</td><td>Mathematics</td><td>male</td><td>17</td><td>22</td><td>66</td><td>73</td></tr><tr><td>student258</td><td>Languages</td><td>female</td><td>70</td><td>91</td><td>97</td><td>45</td></tr><tr><td>student259</td><td>Mathematics</td><td>male</td><td>34</td><td>30</td><td>78</td><td>30</td></tr><tr><td>student260</td><td>Languages</td><td>female</td><td>77</td><td>57</td><td>86</td><td>77</td></tr><tr><td>student261</td><td>Mathematics</td><td>male</td><td>12</td><td>59</td><td>68</td><td>7</td></tr><tr><td>student262</td><td>Languages</td><td>female</td><td>11</td><td>60</td><td>97</td><td>71</td></tr><tr><td>student263</td><td>Mathematics</td><td>male</td><td>12</td><td>30</td><td>35</td><td>58</td></tr><tr><td>student264</td><td>Languages</td><td>female</td><td>46</td><td>15</td><td>23</td><td>40</td></tr><tr><td>student265</td><td>Mathematics</td><td>male</td><td>44</td><td>81</td><td>9</td><td>26</td></tr><tr><td>student266</td><td>Languages</td><td>female</td><td>15</td><td>68</td><td>32</td><td>15</td></tr><tr><td>student267</td><td>Mathematics</td><td>male</td><td>5</td><td>58</td><td>50</td><td>98</td></tr><tr><td>student268</td><td>Languages</td><td>female</td><td>42</td><td>30</td><td>32</td><td>24</td></tr><tr><td>student269</td><td>Mathematics</td><td>male</td><td>78</td><td>100</td><td>99</td><td>57</td></tr><tr><td>student270</td><td>Languages</td><td>female</td><td>55</td><td>33</td><td>87</td><td>25</td></tr><tr><td>student271</td><td>Mathematics</td><td>male</td><td>25</td><td>97</td><td>29</td><td>93</td></tr><tr><td>student272</td><td>Languages</td><td>female</td><td>39</td><td>35</td><td>18</td><td>43</td></tr><tr><td>student273</td><td>Mathematics</td><td>male</td><td>35</td><td>17</td><td>99</td><td>58</td></tr><tr><td>student274</td><td>Languages</td><td>female</td><td>86</td><td>52</td><td>27</td><td>24</td></tr><tr><td>student275</td><td>Mathematics</td><td>male</td><td>97</td><td>38</td><td>73</td><td>76</td></tr><tr><td>student276</td><td>Languages</td><td>female</td><td>20</td><td>6</td><td>19</td><td>8</td></tr><tr><td>student277</td><td>Mathematics</td><td>male</td><td>93</td><td>36</td><td>9</td><td>47</td></tr><tr><td>student278</td><td>Languages</td><td>female</td><td>42</td><td>3</td><td>15</td><td>2</td></tr><tr><td>student279</td><td>Mathematics</td><td>male</td><td>61</td><td>18</td><td>96</td><td>2</td></tr><tr><td>student280</td><td>Languages</td><td>female</td><td>99</td><td>89</td><td>87</td><td>94</td></tr><tr><td>student281</td><td>Mathematics</td><td>male</td><td>48</td><td>95</td><td>90</td><td>0</td></tr><tr><td>student282</td><td>Languages</td><td>female</td><td>60</td><td>47</td><td>31</td><td>30</td></tr><tr><td>student283</td><td>Mathematics</td><td>male</td><td>64</td><td>24</td><td>10</td><td>76</td></tr><tr><td>student284</td><td>Languages</td><td>female</td><td>99</td><td>37</td><td>4</td><td>68</td></tr><tr><td>student285</td><td>Mathematics</td><td>male</td><td>0</td><td>98</td><td>68</td><td>69</td></tr><tr><td>student286</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>49</td><td>59</td></tr><tr><td>student287</td><td>Mathematics</td><td>male</td><td>86</td><td>14</td><td>37</td><td>17</td></tr><tr><td>student288</td><td>Languages</td><td>female</td><td>27</td><td>48</td><td>93</td><td>27</td></tr><tr><td>student289</td><td>Mathematics</td><td>male</td><td>84</td><td>89</td><td>6</td><td>68</td></tr><tr><td>student290</td><td>Languages</td><td>female</td><td>99</td><td>0</td><td>20</td><td>57</td></tr><tr><td>student291</td><td>Mathematics</td><td>male</td><td>50</td><td>96</td><td>72</td><td>42</td></tr><tr><td>student292</td><td>Languages</td><td>female</td><td>98</td><td>2</td><td>27</td><td>92</td></tr><tr><td>student293</td><td>Mathematics</td><td>male</td><td>19</td><td>9</td><td>42</td><td>87</td></tr><tr><td>student294</td><td>Languages</td><td>female</td><td>98</td><td>97</td><td>9</td><td>22</td></tr><tr><td>student295</td><td>Mathematics</td><td>male</td><td>75</td><td>30</td><td>77</td><td>64</td></tr><tr><td>student296</td><td>Languages</td><td>female</td><td>51</td><td>98</td><td>55</td><td>3</td></tr><tr><td>student297</td><td>Mathematics</td><td>male</td><td>25</td><td>95</td><td>86</td><td>72</td></tr><tr><td>student298</td><td>Languages</td><td>female</td><td>20</td><td>75</td><td>37</td><td>35</td></tr><tr><td>student299</td><td>Mathematics</td><td>male</td><td>4</td><td>92</td><td>41</td><td>11</td></tr><tr><td>student300</td><td>Languages</td><td>female</td><td>28</td><td>3</td><td>28</td><td>91</td></tr><tr><td>student301</td><td>Mathematics</td><td>male</td><td>41</td><td>63</td><td>4</td><td>25</td></tr><tr><td>student302</td><td>Languages</td><td>female</td><td>29</td><td>16</td><td>77</td><td>90</td></tr><tr><td>student303</td><td>Mathematics</td><td>male</td><td>89</td><td>41</td><td>51</td><td>82</td></tr><tr><td>student304</td><td>Languages</td><td>female</td><td>40</td><td>91</td><td>24</td><td>34</td></tr><tr><td>student305</td><td>Mathematics</td><td>male</td><td>7</td><td>47</td><td>49</td><td>78</td></tr><tr><td>student306</td><td>Languages</td><td>female</td><td>6</td><td>37</td><td>55</td><td>62</td></tr><tr><td>student307</td><td>Mathematics</td><td>male</td><td>30</td><td>73</td><td>34</td><td>90</td></tr><tr><td>student308</td><td>Languages</td><td>female</td><td>82</td><td>91</td><td>95</td><td>93</td></tr><tr><td>student309</td><td>Mathematics</td><td>male</td><td>62</td><td>4</td><td>73</td><td>82</td></tr><tr><td>student310</td><td>Languages</td><td>female</td><td>39</td><td>10</td><td>12</td><td>57</td></tr><tr><td>student311</td><td>Mathematics</td><td>male</td><td>89</td><td>64</td><td>20</td><td>67</td></tr><tr><td>student312</td><td>Languages</td><td>female</td><td>56</td><td>36</td><td>92</td><td>41</td></tr><tr><td>student313</td><td>Mathematics</td><td>male</td><td>99</td><td>80</td><td>99</td><td>74</td></tr><tr><td>student314</td><td>Languages</td><td>female</td><td>31</td><td>79</td><td>64</td><td>93</td></tr><tr><td>student315</td><td>Mathematics</td><td>male</td><td>53</td><td>2</td><td>70</td><td>55</td></tr><tr><td>student316</td><td>Languages</td><td>female</td><td>35</td><td>15</td><td>29</td><td>60</td></tr><tr><td>student317</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>69</td><td>60</td></tr><tr><td>student318</td><td>Languages</td><td>female</td><td>88</td><td>28</td><td>13</td><td>66</td></tr><tr><td>student319</td><td>Mathematics</td><td>male</td><td>65</td><td>12</td><td>16</td><td>40</td></tr><tr><td>student320</td><td>Languages</td><td>female</td><td>28</td><td>17</td><td>19</td><td>40</td></tr><tr><td>student321</td><td>Mathematics</td><td>male</td><td>24</td><td>100</td><td>44</td><td>70</td></tr><tr><td>student322</td><td>Languages</td><td>female</td><td>20</td><td>59</td><td>83</td><td>52</td></tr><tr><td>student323</td><td>Mathematics</td><td>male</td><td>17</td><td>60</td><td>82</td><td>91</td></tr><tr><td>student324</td><td>Languages</td><td>female</td><td>95</td><td>99</td><td>43</td><td>37</td></tr><tr><td>student325</td><td>Mathematics</td><td>male</td><td>30</td><td>18</td><td>99</td><td>31</td></tr><tr><td>student326</td><td>Languages</td><td>female</td><td>34</td><td>7</td><td>83</td><td>86</td></tr><tr><td>student327</td><td>Mathematics</td><td>male</td><td>98</td><td>63</td><td>4</td><td>35</td></tr><tr><td>student328</td><td>Languages</td><td>female</td><td>54</td><td>23</td><td>98</td><td>46</td></tr><tr><td>student329</td><td>Mathematics</td><td>male</td><td>97</td><td>93</td><td>45</td><td>18</td></tr><tr><td>student330</td><td>Languages</td><td>female</td><td>27</td><td>74</td><td>0</td><td>77</td></tr><tr><td>student331</td><td>Mathematics</td><td>male</td><td>9</td><td>70</td><td>41</td><td>37</td></tr><tr><td>student332</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>76</td><td>20</td></tr><tr><td>student333</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>19</td></tr><tr><td>student334</td><td>Languages</td><td>female</td><td>77</td><td>100</td><td>33</td><td>9</td></tr><tr><td>student335</td><td>Mathematics</td><td>male</td><td>38</td><td>53</td><td>77</td><td>18</td></tr><tr><td>student336</td><td>Languages</td><td>female</td><td>18</td><td>13</td><td>26</td><td>10</td></tr><tr><td>student337</td><td>Mathematics</td><td>male</td><td>90</td><td>47</td><td>87</td><td>70</td></tr><tr><td>student338</td><td>Languages</td><td>female</td><td>38</td><td>49</td><td>36</td><td>74</td></tr><tr><td>student339</td><td>Mathematics</td><td>male</td><td>100</td><td>64</td><td>13</td><td>72</td></tr><tr><td>student340</td><td>Languages</td><td>female</td><td>74</td><td>25</td><td>41</td><td>52</td></tr><tr><td>student341</td><td>Mathematics</td><td>male</td><td>37</td><td>13</td><td>16</td><td>13</td></tr><tr><td>student342</td><td>Languages</td><td>female</td><td>24</td><td>34</td><td>15</td><td>83</td></tr><tr><td>student343</td><td>Mathematics</td><td>male</td><td>20</td><td>5</td><td>67</td><td>28</td></tr><tr><td>student344</td><td>Languages</td><td>female</td><td>45</td><td>2</td><td>25</td><td>72</td></tr><tr><td>student345</td><td>Mathematics</td><td>male</td><td>19</td><td>11</td><td>75</td><td>35</td></tr><tr><td>student346</td><td>Languages</td><td>female</td><td>6</td><td>58</td><td>31</td><td>15</td></tr><tr><td>student347</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>36</td><td>11</td></tr><tr><td>student348</td><td>Languages</td><td>female</td><td>12</td><td>3</td><td>95</td><td>40</td></tr><tr><td>student349</td><td>Mathematics</td><td>male</td><td>7</td><td>52</td><td>74</td><td>2</td></tr><tr><td>student350</td><td>Languages</td><td>female</td><td>88</td><td>92</td><td>60</td><td>55</td></tr><tr><td>student351</td><td>Mathematics</td><td>male</td><td>92</td><td>70</td><td>91</td><td>45</td></tr><tr><td>student352</td><td>Languages</td><td>female</td><td>74</td><td>76</td><td>59</td><td>44</td></tr><tr><td>student353</td><td>Mathematics</td><td>male</td><td>63</td><td>69</td><td>60</td><td>94</td></tr><tr><td>student354</td><td>Languages</td><td>female</td><td>3</td><td>68</td><td>55</td><td>48</td></tr><tr><td>student355</td><td>Mathematics</td><td>male</td><td>39</td><td>96</td><td>21</td><td>48</td></tr><tr><td>student356</td><td>Languages</td><td>female</td><td>41</td><td>34</td><td>27</td><td>5</td></tr><tr><td>student357</td><td>Mathematics</td><td>male</td><td>64</td><td>3</td><td>47</td><td>33</td></tr><tr><td>student358</td><td>Languages</td><td>female</td><td>95</td><td>14</td><td>63</td><td>55</td></tr><tr><td>student359</td><td>Mathematics</td><td>male</td><td>70</td><td>100</td><td>13</td><td>82</td></tr><tr><td>student360</td><td>Languages</td><td>female</td><td>52</td><td>24</td><td>100</td><td>21</td></tr><tr><td>student361</td><td>Mathematics</td><td>male</td><td>0</td><td>40</td><td>86</td><td>9</td></tr><tr><td>student362</td><td>Languages</td><td>female</td><td>0</td><td>2</td><td>49</td><td>32</td></tr><tr><td>student363</td><td>Mathematics</td><td>male</td><td>23</td><td>10</td><td>86</td><td>94</td></tr><tr><td>student364</td><td>Languages</td><td>female</td><td>15</td><td>3</td><td>86</td><td>49</td></tr><tr><td>student365</td><td>Mathematics</td><td>male</td><td>76</td><td>23</td><td>31</td><td>0</td></tr><tr><td>student366</td><td>Languages</td><td>female</td><td>35</td><td>35</td><td>78</td><td>94</td></tr><tr><td>student367</td><td>Mathematics</td><td>male</td><td>29</td><td>42</td><td>43</td><td>100</td></tr><tr><td>student368</td><td>Languages</td><td>female</td><td>66</td><td>8</td><td>5</td><td>10</td></tr><tr><td>student369</td><td>Mathematics</td><td>male</td><td>74</td><td>15</td><td>56</td><td>83</td></tr><tr><td>student370</td><td>Languages</td><td>female</td><td>75</td><td>43</td><td>90</td><td>8</td></tr><tr><td>student371</td><td>Mathematics</td><td>male</td><td>40</td><td>60</td><td>4</td><td>70</td></tr><tr><td>student372</td><td>Languages</td><td>female</td><td>62</td><td>42</td><td>17</td><td>49</td></tr><tr><td>student373</td><td>Mathematics</td><td>male</td><td>31</td><td>46</td><td>44</td><td>54</td></tr><tr><td>student374</td><td>Languages</td><td>female</td><td>30</td><td>34</td><td>47</td><td>87</td></tr><tr><td>student375</td><td>Mathematics</td><td>male</td><td>9</td><td>69</td><td>41</td><td>52</td></tr><tr><td>student376</td><td>Languages</td><td>female</td><td>85</td><td>43</td><td>29</td><td>92</td></tr><tr><td>student377</td><td>Mathematics</td><td>male</td><td>79</td><td>0</td><td>40</td><td>25</td></tr><tr><td>student378</td><td>Languages</td><td>female</td><td>36</td><td>40</td><td>72</td><td>85</td></tr><tr><td>student379</td><td>Mathematics</td><td>male</td><td>53</td><td>68</td><td>88</td><td>2</td></tr><tr><td>student380</td><td>Languages</td><td>female</td><td>87</td><td>78</td><td>38</td><td>79</td></tr><tr><td>student381</td><td>Mathematics</td><td>male</td><td>89</td><td>97</td><td>83</td><td>38</td></tr><tr><td>student382</td><td>Languages</td><td>female</td><td>21</td><td>19</td><td>49</td><td>10</td></tr><tr><td>student383</td><td>Mathematics</td><td>male</td><td>47</td><td>12</td><td>68</td><td>50</td></tr><tr><td>student384</td><td>Languages</td><td>female</td><td>37</td><td>12</td><td>49</td><td>95</td></tr><tr><td>student385</td><td>Mathematics</td><td>male</td><td>84</td><td>0</td><td>88</td><td>51</td></tr><tr><td>student386</td><td>Languages</td><td>female</td><td>89</td><td>61</td><td>27</td><td>48</td></tr><tr><td>student387</td><td>Mathematics</td><td>male</td><td>10</td><td>47</td><td>87</td><td>61</td></tr><tr><td>student388</td><td>Languages</td><td>female</td><td>16</td><td>9</td><td>26</td><td>56</td></tr><tr><td>student389</td><td>Mathematics</td><td>male</td><td>57</td><td>33</td><td>13</td><td>47</td></tr><tr><td>student390</td><td>Languages</td><td>female</td><td>90</td><td>35</td><td>77</td><td>75</td></tr><tr><td>student391</td><td>Mathematics</td><td>male</td><td>31</td><td>47</td><td>47</td><td>53</td></tr><tr><td>student392</td><td>Languages</td><td>female</td><td>9</td><td>4</td><td>24</td><td>12</td></tr><tr><td>student393</td><td>Mathematics</td><td>male</td><td>61</td><td>19</td><td>81</td><td>7</td></tr><tr><td>student394</td><td>Languages</td><td>female</td><td>4</td><td>57</td><td>57</td><td>7</td></tr><tr><td>student395</td><td>Mathematics</td><td>male</td><td>67</td><td>29</td><td>21</td><td>2</td></tr><tr><td>student396</td><td>Languages</td><td>female</td><td>51</td><td>6</td><td>45</td><td>6</td></tr><tr><td>student397</td><td>Mathematics</td><td>male</td><td>93</td><td>14</td><td>77</td><td>14</td></tr><tr><td>student398</td><td>Languages</td><td>female</td><td>1</td><td>89</td><td>34</td><td>27</td></tr><tr><td>student399</td><td>Mathematics</td><td>male</td><td>93</td><td>77</td><td>57</td><td>91</td></tr><tr><td>student400</td><td>Languages</td><td>female</td><td>67</td><td>77</td><td>80</td><td>32</td></tr><tr><td>student401</td><td>Mathematics</td><td>male</td><td>58</td><td>89</td><td>4</td><td>17</td></tr><tr><td>student402</td><td>Languages</td><td>female</td><td>30</td><td>56</td><td>0</td><td>53</td></tr><tr><td>student403</td><td>Mathematics</td><td>male</td><td>28</td><td>25</td><td>32</td><td>59</td></tr><tr><td>student404</td><td>Languages</td><td>female</td><td>62</td><td>34</td><td>81</td><td>64</td></tr><tr><td>student405</td><td>Mathematics</td><td>male</td><td>29</td><td>84</td><td>26</td><td>23</td></tr><tr><td>student406</td><td>Languages</td><td>female</td><td>70</td><td>8</td><td>63</td><td>77</td></tr><tr><td>student407</td><td>Mathematics</td><td>male</td><td>8</td><td>65</td><td>47</td><td>99</td></tr><tr><td>student408</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>10</td><td>89</td></tr><tr><td>student409</td><td>Mathematics</td><td>male</td><td>84</td><td>21</td><td>46</td><td>58</td></tr><tr><td>student410</td><td>Languages</td><td>female</td><td>21</td><td>84</td><td>18</td><td>49</td></tr><tr><td>student411</td><td>Mathematics</td><td>male</td><td>27</td><td>9</td><td>63</td><td>40</td></tr><tr><td>student412</td><td>Languages</td><td>female</td><td>93</td><td>0</td><td>19</td><td>91</td></tr><tr><td>student413</td><td>Mathematics</td><td>male</td><td>31</td><td>92</td><td>87</td><td>43</td></tr><tr><td>student414</td><td>Languages</td><td>female</td><td>53</td><td>25</td><td>98</td><td>43</td></tr><tr><td>student415</td><td>Mathematics</td><td>male</td><td>36</td><td>75</td><td>80</td><td>89</td></tr><tr><td>student416</td><td>Languages</td><td>female</td><td>37</td><td>68</td><td>12</td><td>54</td></tr><tr><td>student417</td><td>Mathematics</td><td>male</td><td>25</td><td>89</td><td>12</td><td>53</td></tr><tr><td>student418</td><td>Languages</td><td>female</td><td>92</td><td>2</td><td>8</td><td>46</td></tr><tr><td>student419</td><td>Mathematics</td><td>male</td><td>11</td><td>28</td><td>60</td><td>58</td></tr><tr><td>student420</td><td>Languages</td><td>female</td><td>1</td><td>37</td><td>35</td><td>17</td></tr><tr><td>student421</td><td>Mathematics</td><td>male</td><td>67</td><td>30</td><td>38</td><td>85</td></tr><tr><td>student422</td><td>Languages</td><td>female</td><td>68</td><td>79</td><td>34</td><td>41</td></tr><tr><td>student423</td><td>Mathematics</td><td>male</td><td>72</td><td>45</td><td>93</td><td>41</td></tr><tr><td>student424</td><td>Languages</td><td>female</td><td>56</td><td>46</td><td>45</td><td>38</td></tr><tr><td>student425</td><td>Mathematics</td><td>male</td><td>86</td><td>21</td><td>84</td><td>0</td></tr><tr><td>student426</td><td>Languages</td><td>female</td><td>99</td><td>85</td><td>41</td><td>19</td></tr><tr><td>student427</td><td>Mathematics</td><td>male</td><td>71</td><td>35</td><td>3</td><td>89</td></tr><tr><td>student428</td><td>Languages</td><td>female</td><td>22</td><td>91</td><td>12</td><td>16</td></tr><tr><td>student429</td><td>Mathematics</td><td>male</td><td>15</td><td>3</td><td>26</td><td>93</td></tr><tr><td>student430</td><td>Languages</td><td>female</td><td>35</td><td>46</td><td>34</td><td>74</td></tr><tr><td>student431</td><td>Mathematics</td><td>male</td><td>33</td><td>83</td><td>97</td><td>20</td></tr><tr><td>student432</td><td>Languages</td><td>female</td><td>99</td><td>20</td><td>3</td><td>26</td></tr><tr><td>student433</td><td>Mathematics</td><td>male</td><td>48</td><td>42</td><td>83</td><td>18</td></tr><tr><td>student434</td><td>Languages</td><td>female</td><td>44</td><td>4</td><td>25</td><td>30</td></tr><tr><td>student435</td><td>Mathematics</td><td>male</td><td>78</td><td>48</td><td>60</td><td>45</td></tr><tr><td>student436</td><td>Languages</td><td>female</td><td>47</td><td>57</td><td>89</td><td>0</td></tr><tr><td>student437</td><td>Mathematics</td><td>male</td><td>88</td><td>12</td><td>100</td><td>53</td></tr><tr><td>student438</td><td>Languages</td><td>female</td><td>48</td><td>0</td><td>51</td><td>60</td></tr><tr><td>student439</td><td>Mathematics</td><td>male</td><td>70</td><td>89</td><td>85</td><td>16</td></tr><tr><td>student440</td><td>Languages</td><td>female</td><td>71</td><td>94</td><td>34</td><td>33</td></tr><tr><td>student441</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>72</td><td>18</td></tr><tr><td>student442</td><td>Languages</td><td>female</td><td>7</td><td>53</td><td>97</td><td>21</td></tr><tr><td>student443</td><td>Mathematics</td><td>male</td><td>65</td><td>36</td><td>60</td><td>87</td></tr><tr><td>student444</td><td>Languages</td><td>female</td><td>43</td><td>21</td><td>24</td><td>34</td></tr><tr><td>student445</td><td>Mathematics</td><td>male</td><td>85</td><td>77</td><td>65</td><td>28</td></tr><tr><td>student446</td><td>Languages</td><td>female</td><td>61</td><td>90</td><td>78</td><td>91</td></tr><tr><td>student447</td><td>Mathematics</td><td>male</td><td>92</td><td>0</td><td>78</td><td>12</td></tr><tr><td>student448</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>62</td><td>90</td></tr><tr><td>student449</td><td>Mathematics</td><td>male</td><td>86</td><td>16</td><td>74</td><td>5</td></tr><tr><td>student450</td><td>Languages</td><td>female</td><td>100</td><td>86</td><td>24</td><td>23</td></tr><tr><td>student451</td><td>Mathematics</td><td>male</td><td>14</td><td>25</td><td>6</td><td>45</td></tr><tr><td>student452</td><td>Languages</td><td>female</td><td>86</td><td>39</td><td>98</td><td>88</td></tr><tr><td>student453</td><td>Mathematics</td><td>male</td><td>72</td><td>68</td><td>77</td><td>19</td></tr><tr><td>student454</td><td>Languages</td><td>female</td><td>9</td><td>45</td><td>23</td><td>100</td></tr><tr><td>student455</td><td>Mathematics</td><td>male</td><td>34</td><td>67</td><td>89</td><td>79</td></tr><tr><td>student456</td><td>Languages</td><td>female</td><td>92</td><td>0</td><td>47</td><td>45</td></tr><tr><td>student457</td><td>Mathematics</td><td>male</td><td>64</td><td>58</td><td>26</td><td>98</td></tr><tr><td>student458</td><td>Languages</td><td>female</td><td>43</td><td>93</td><td>59</td><td>100</td></tr><tr><td>student459</td><td>Mathematics</td><td>male</td><td>82</td><td>35</td><td>97</td><td>81</td></tr><tr><td>student460</td><td>Languages</td><td>female</td><td>18</td><td>35</td><td>24</td><td>100</td></tr><tr><td>student461</td><td>Mathematics</td><td>male</td><td>79</td><td>80</td><td>43</td><td>51</td></tr><tr><td>student462</td><td>Languages</td><td>female</td><td>56</td><td>10</td><td>17</td><td>67</td></tr><tr><td>student463</td><td>Mathematics</td><td>male</td><td>36</td><td>44</td><td>14</td><td>85</td></tr><tr><td>student464</td><td>Languages</td><td>female</td><td>26</td><td>40</td><td>69</td><td>2</td></tr><tr><td>student465</td><td>Mathematics</td><td>male</td><td>59</td><td>93</td><td>43</td><td>78</td></tr><tr><td>student466</td><td>Languages</td><td>female</td><td>78</td><td>84</td><td>88</td><td>3</td></tr><tr><td>student467</td><td>Mathematics</td><td>male</td><td>41</td><td>37</td><td>80</td><td>60</td></tr><tr><td>student468</td><td>Languages</td><td>female</td><td>44</td><td>27</td><td>97</td><td>77</td></tr><tr><td>student469</td><td>Mathematics</td><td>male</td><td>29</td><td>19</td><td>64</td><td>82</td></tr><tr><td>student470</td><td>Languages</td><td>female</td><td>50</td><td>96</td><td>27</td><td>46</td></tr><tr><td>student471</td><td>Mathematics</td><td>male</td><td>49</td><td>15</td><td>51</td><td>45</td></tr><tr><td>student472</td><td>Languages</td><td>female</td><td>38</td><td>35</td><td>31</td><td>78</td></tr><tr><td>student473</td><td>Mathematics</td><td>male</td><td>1</td><td>80</td><td>23</td><td>65</td></tr><tr><td>student474</td><td>Languages</td><td>female</td><td>91</td><td>17</td><td>23</td><td>76</td></tr><tr><td>student475</td><td>Mathematics</td><td>male</td><td>57</td><td>39</td><td>35</td><td>63</td></tr><tr><td>student476</td><td>Languages</td><td>female</td><td>33</td><td>73</td><td>62</td><td>14</td></tr><tr><td>student477</td><td>Mathematics</td><td>male</td><td>96</td><td>16</td><td>88</td><td>40</td></tr><tr><td>student478</td><td>Languages</td><td>female</td><td>30</td><td>63</td><td>16</td><td>13</td></tr><tr><td>student479</td><td>Mathematics</td><td>male</td><td>74</td><td>39</td><td>37</td><td>87</td></tr><tr><td>student480</td><td>Languages</td><td>female</td><td>26</td><td>36</td><td>94</td><td>79</td></tr><tr><td>student481</td><td>Mathematics</td><td>male</td><td>19</td><td>58</td><td>65</td><td>12</td></tr><tr><td>student482</td><td>Languages</td><td>female</td><td>73</td><td>36</td><td>22</td><td>48</td></tr><tr><td>student483</td><td>Mathematics</td><td>male</td><td>78</td><td>94</td><td>75</td><td>7</td></tr><tr><td>student484</td><td>Languages</td><td>female</td><td>59</td><td>51</td><td>9</td><td>35</td></tr><tr><td>student485</td><td>Mathematics</td><td>male</td><td>67</td><td>71</td><td>100</td><td>85</td></tr><tr><td>student486</td><td>Languages</td><td>female</td><td>33</td><td>30</td><td>15</td><td>46</td></tr><tr><td>student487</td><td>Mathematics</td><td>male</td><td>12</td><td>19</td><td>16</td><td>37</td></tr><tr><td>student488</td><td>Languages</td><td>female</td><td>80</td><td>98</td><td>29</td><td>14</td></tr><tr><td>student489</td><td>Mathematics</td><td>male</td><td>70</td><td>51</td><td>14</td><td>31</td></tr><tr><td>student490</td><td>Languages</td><td>female</td><td>95</td><td>38</td><td>15</td><td>92</td></tr><tr><td>student491</td><td>Mathematics</td><td>male</td><td>60</td><td>31</td><td>74</td><td>12</td></tr><tr><td>student492</td><td>Languages</td><td>female</td><td>62</td><td>56</td><td>90</td><td>68</td></tr><tr><td>student493</td><td>Mathematics</td><td>male</td><td>63</td><td>11</td><td>29</td><td>91</td></tr><tr><td>student494</td><td>Languages</td><td>female</td><td>41</td><td>1</td><td>25</td><td>20</td></tr><tr><td>student495</td><td>Mathematics</td><td>male</td><td>60</td><td>5</td><td>31</td><td>44</td></tr><tr><td>student496</td><td>Languages</td><td>female</td><td>11</td><td>35</td><td>5</td><td>28</td></tr><tr><td>student497</td><td>Mathematics</td><td>male</td><td>11</td><td>96</td><td>42</td><td>37</td></tr><tr><td>student498</td><td>Languages</td><td>female</td><td>16</td><td>72</td><td>79</td><td>74</td></tr><tr><td>student499</td><td>Mathematics</td><td>male</td><td>9</td><td>21</td><td>22</td><td>66</td></tr><tr><td>student500</td><td>Languages</td><td>female</td><td>34</td><td>22</td><td>64</td><td>34</td></tr><tr><td>student501</td><td>Mathematics</td><td>male</td><td>50</td><td>93</td><td>86</td><td>61</td></tr><tr><td>student502</td><td>Languages</td><td>female</td><td>50</td><td>22</td><td>40</td><td>44</td></tr><tr><td>student503</td><td>Mathematics</td><td>male</td><td>3</td><td>8</td><td>39</td><td>17</td></tr><tr><td>student504</td><td>Languages</td><td>female</td><td>98</td><td>16</td><td>93</td><td>55</td></tr><tr><td>student505</td><td>Mathematics</td><td>male</td><td>86</td><td>89</td><td>36</td><td>28</td></tr><tr><td>student506</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>13</td><td>50</td></tr><tr><td>student507</td><td>Mathematics</td><td>male</td><td>57</td><td>57</td><td>3</td><td>38</td></tr><tr><td>student508</td><td>Languages</td><td>female</td><td>34</td><td>79</td><td>69</td><td>77</td></tr><tr><td>student509</td><td>Mathematics</td><td>male</td><td>2</td><td>4</td><td>16</td><td>59</td></tr><tr><td>student510</td><td>Languages</td><td>female</td><td>60</td><td>62</td><td>99</td><td>100</td></tr><tr><td>student511</td><td>Mathematics</td><td>male</td><td>65</td><td>52</td><td>52</td><td>95</td></tr><tr><td>student512</td><td>Languages</td><td>female</td><td>58</td><td>73</td><td>94</td><td>1</td></tr><tr><td>student513</td><td>Mathematics</td><td>male</td><td>39</td><td>75</td><td>28</td><td>76</td></tr><tr><td>student514</td><td>Languages</td><td>female</td><td>46</td><td>6</td><td>64</td><td>78</td></tr><tr><td>student515</td><td>Mathematics</td><td>male</td><td>51</td><td>60</td><td>99</td><td>8</td></tr><tr><td>student516</td><td>Languages</td><td>female</td><td>17</td><td>20</td><td>12</td><td>97</td></tr><tr><td>student517</td><td>Mathematics</td><td>male</td><td>72</td><td>17</td><td>96</td><td>73</td></tr><tr><td>student518</td><td>Languages</td><td>female</td><td>92</td><td>21</td><td>62</td><td>27</td></tr><tr><td>student519</td><td>Mathematics</td><td>male</td><td>50</td><td>42</td><td>4</td><td>33</td></tr><tr><td>student520</td><td>Languages</td><td>female</td><td>52</td><td>37</td><td>1</td><td>57</td></tr><tr><td>student521</td><td>Mathematics</td><td>male</td><td>58</td><td>40</td><td>35</td><td>54</td></tr><tr><td>student522</td><td>Languages</td><td>female</td><td>9</td><td>38</td><td>57</td><td>53</td></tr><tr><td>student523</td><td>Mathematics</td><td>male</td><td>79</td><td>20</td><td>18</td><td>18</td></tr><tr><td>student524</td><td>Languages</td><td>female</td><td>1</td><td>4</td><td>94</td><td>27</td></tr><tr><td>student525</td><td>Mathematics</td><td>male</td><td>95</td><td>41</td><td>29</td><td>98</td></tr><tr><td>student526</td><td>Languages</td><td>female</td><td>34</td><td>59</td><td>9</td><td>21</td></tr><tr><td>student527</td><td>Mathematics</td><td>male</td><td>39</td><td>66</td><td>41</td><td>29</td></tr><tr><td>student528</td><td>Languages</td><td>female</td><td>3</td><td>2</td><td>81</td><td>25</td></tr><tr><td>student529</td><td>Mathematics</td><td>male</td><td>33</td><td>44</td><td>37</td><td>85</td></tr><tr><td>student530</td><td>Languages</td><td>female</td><td>69</td><td>25</td><td>59</td><td>79</td></tr><tr><td>student531</td><td>Mathematics</td><td>male</td><td>13</td><td>50</td><td>49</td><td>52</td></tr><tr><td>student532</td><td>Languages</td><td>female</td><td>54</td><td>83</td><td>45</td><td>31</td></tr><tr><td>student533</td><td>Mathematics</td><td>male</td><td>15</td><td>24</td><td>97</td><td>51</td></tr><tr><td>student534</td><td>Languages</td><td>female</td><td>7</td><td>51</td><td>69</td><td>63</td></tr><tr><td>student535</td><td>Mathematics</td><td>male</td><td>91</td><td>8</td><td>38</td><td>56</td></tr><tr><td>student536</td><td>Languages</td><td>female</td><td>50</td><td>13</td><td>74</td><td>80</td></tr><tr><td>student537</td><td>Mathematics</td><td>male</td><td>54</td><td>75</td><td>74</td><td>10</td></tr><tr><td>student538</td><td>Languages</td><td>female</td><td>76</td><td>39</td><td>70</td><td>46</td></tr><tr><td>student539</td><td>Mathematics</td><td>male</td><td>84</td><td>72</td><td>39</td><td>40</td></tr><tr><td>student540</td><td>Languages</td><td>female</td><td>100</td><td>47</td><td>2</td><td>14</td></tr><tr><td>student541</td><td>Mathematics</td><td>male</td><td>42</td><td>61</td><td>1</td><td>1</td></tr><tr><td>student542</td><td>Languages</td><td>female</td><td>57</td><td>71</td><td>65</td><td>61</td></tr><tr><td>student543</td><td>Mathematics</td><td>male</td><td>78</td><td>5</td><td>41</td><td>34</td></tr><tr><td>student544</td><td>Languages</td><td>female</td><td>14</td><td>76</td><td>36</td><td>47</td></tr><tr><td>student545</td><td>Mathematics</td><td>male</td><td>15</td><td>19</td><td>63</td><td>96</td></tr><tr><td>student546</td><td>Languages</td><td>female</td><td>27</td><td>82</td><td>33</td><td>56</td></tr><tr><td>student547</td><td>Mathematics</td><td>male</td><td>70</td><td>23</td><td>96</td><td>90</td></tr><tr><td>student548</td><td>Languages</td><td>female</td><td>61</td><td>2</td><td>2</td><td>78</td></tr><tr><td>student549</td><td>Mathematics</td><td>male</td><td>22</td><td>37</td><td>64</td><td>36</td></tr><tr><td>student550</td><td>Languages</td><td>female</td><td>75</td><td>96</td><td>94</td><td>40</td></tr><tr><td>student551</td><td>Mathematics</td><td>male</td><td>43</td><td>8</td><td>29</td><td>21</td></tr><tr><td>student552</td><td>Languages</td><td>female</td><td>7</td><td>96</td><td>87</td><td>18</td></tr><tr><td>student553</td><td>Mathematics</td><td>male</td><td>65</td><td>76</td><td>52</td><td>44</td></tr><tr><td>student554</td><td>Languages</td><td>female</td><td>41</td><td>62</td><td>73</td><td>54</td></tr><tr><td>student555</td><td>Mathematics</td><td>male</td><td>25</td><td>98</td><td>21</td><td>40</td></tr><tr><td>student556</td><td>Languages</td><td>female</td><td>17</td><td>70</td><td>96</td><td>82</td></tr><tr><td>student557</td><td>Mathematics</td><td>male</td><td>43</td><td>91</td><td>27</td><td>43</td></tr><tr><td>student558</td><td>Languages</td><td>female</td><td>33</td><td>37</td><td>24</td><td>33</td></tr><tr><td>student559</td><td>Mathematics</td><td>male</td><td>87</td><td>87</td><td>10</td><td>31</td></tr><tr><td>student560</td><td>Languages</td><td>female</td><td>48</td><td>40</td><td>97</td><td>74</td></tr><tr><td>student561</td><td>Mathematics</td><td>male</td><td>63</td><td>75</td><td>91</td><td>55</td></tr><tr><td>student562</td><td>Languages</td><td>female</td><td>66</td><td>82</td><td>59</td><td>95</td></tr><tr><td>student563</td><td>Mathematics</td><td>male</td><td>21</td><td>95</td><td>58</td><td>38</td></tr><tr><td>student564</td><td>Languages</td><td>female</td><td>92</td><td>9</td><td>97</td><td>45</td></tr><tr><td>student565</td><td>Mathematics</td><td>male</td><td>59</td><td>7</td><td>94</td><td>20</td></tr><tr><td>student566</td><td>Languages</td><td>female</td><td>64</td><td>95</td><td>24</td><td>12</td></tr><tr><td>student567</td><td>Mathematics</td><td>male</td><td>70</td><td>46</td><td>36</td><td>74</td></tr><tr><td>student568</td><td>Languages</td><td>female</td><td>16</td><td>25</td><td>91</td><td>49</td></tr><tr><td>student569</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>24</td><td>88</td></tr><tr><td>student570</td><td>Languages</td><td>female</td><td>9</td><td>61</td><td>95</td><td>27</td></tr><tr><td>student571</td><td>Mathematics</td><td>male</td><td>18</td><td>12</td><td>76</td><td>46</td></tr><tr><td>student572</td><td>Languages</td><td>female</td><td>61</td><td>71</td><td>49</td><td>63</td></tr><tr><td>student573</td><td>Mathematics</td><td>male</td><td>46</td><td>32</td><td>85</td><td>17</td></tr><tr><td>student574</td><td>Languages</td><td>female</td><td>42</td><td>42</td><td>11</td><td>37</td></tr><tr><td>student575</td><td>Mathematics</td><td>male</td><td>49</td><td>76</td><td>41</td><td>20</td></tr><tr><td>student576</td><td>Languages</td><td>female</td><td>22</td><td>27</td><td>80</td><td>12</td></tr><tr><td>student577</td><td>Mathematics</td><td>male</td><td>76</td><td>34</td><td>18</td><td>66</td></tr><tr><td>student578</td><td>Languages</td><td>female</td><td>96</td><td>77</td><td>29</td><td>17</td></tr><tr><td>student579</td><td>Mathematics</td><td>male</td><td>62</td><td>51</td><td>67</td><td>72</td></tr><tr><td>student580</td><td>Languages</td><td>female</td><td>96</td><td>67</td><td>22</td><td>54</td></tr><tr><td>student581</td><td>Mathematics</td><td>male</td><td>77</td><td>11</td><td>23</td><td>88</td></tr><tr><td>student582</td><td>Languages</td><td>female</td><td>6</td><td>28</td><td>24</td><td>33</td></tr><tr><td>student583</td><td>Mathematics</td><td>male</td><td>39</td><td>23</td><td>12</td><td>100</td></tr><tr><td>student584</td><td>Languages</td><td>female</td><td>10</td><td>21</td><td>20</td><td>71</td></tr><tr><td>student585</td><td>Mathematics</td><td>male</td><td>11</td><td>27</td><td>7</td><td>100</td></tr><tr><td>student586</td><td>Languages</td><td>female</td><td>40</td><td>34</td><td>97</td><td>78</td></tr><tr><td>student587</td><td>Mathematics</td><td>male</td><td>2</td><td>51</td><td>83</td><td>19</td></tr><tr><td>student588</td><td>Languages</td><td>female</td><td>18</td><td>76</td><td>30</td><td>25</td></tr><tr><td>student589</td><td>Mathematics</td><td>male</td><td>24</td><td>57</td><td>46</td><td>81</td></tr><tr><td>student590</td><td>Languages</td><td>female</td><td>2</td><td>10</td><td>31</td><td>94</td></tr><tr><td>student591</td><td>Mathematics</td><td>male</td><td>91</td><td>84</td><td>75</td><td>13</td></tr><tr><td>student592</td><td>Languages</td><td>female</td><td>79</td><td>44</td><td>97</td><td>10</td></tr><tr><td>student593</td><td>Mathematics</td><td>male</td><td>42</td><td>60</td><td>67</td><td>30</td></tr><tr><td>student594</td><td>Languages</td><td>female</td><td>61</td><td>57</td><td>75</td><td>35</td></tr><tr><td>student595</td><td>Mathematics</td><td>male</td><td>42</td><td>46</td><td>81</td><td>71</td></tr><tr><td>student596</td><td>Languages</td><td>female</td><td>92</td><td>63</td><td>75</td><td>74</td></tr><tr><td>student597</td><td>Mathematics</td><td>male</td><td>86</td><td>37</td><td>40</td><td>51</td></tr><tr><td>student598</td><td>Languages</td><td>female</td><td>52</td><td>10</td><td>47</td><td>3</td></tr><tr><td>student599</td><td>Mathematics</td><td>male</td><td>100</td><td>28</td><td>14</td><td>76</td></tr><tr><td>student600</td><td>Languages</td><td>female</td><td>31</td><td>76</td><td>20</td><td>43</td></tr><tr><td>student601</td><td>Mathematics</td><td>male</td><td>40</td><td>27</td><td>6</td><td>6</td></tr><tr><td>student602</td><td>Languages</td><td>female</td><td>5</td><td>8</td><td>79</td><td>21</td></tr><tr><td>student603</td><td>Mathematics</td><td>male</td><td>7</td><td>54</td><td>6</td><td>91</td></tr><tr><td>student604</td><td>Languages</td><td>female</td><td>28</td><td>30</td><td>15</td><td>3</td></tr><tr><td>student605</td><td>Mathematics</td><td>male</td><td>38</td><td>93</td><td>98</td><td>92</td></tr><tr><td>student606</td><td>Languages</td><td>female</td><td>43</td><td>96</td><td>89</td><td>91</td></tr><tr><td>student607</td><td>Mathematics</td><td>male</td><td>43</td><td>49</td><td>14</td><td>83</td></tr><tr><td>student608</td><td>Languages</td><td>female</td><td>50</td><td>61</td><td>72</td><td>98</td></tr><tr><td>student609</td><td>Mathematics</td><td>male</td><td>4</td><td>49</td><td>99</td><td>83</td></tr><tr><td>student610</td><td>Languages</td><td>female</td><td>5</td><td>36</td><td>73</td><td>82</td></tr><tr><td>student611</td><td>Mathematics</td><td>male</td><td>40</td><td>84</td><td>99</td><td>54</td></tr><tr><td>student612</td><td>Languages</td><td>female</td><td>29</td><td>96</td><td>65</td><td>69</td></tr><tr><td>student613</td><td>Mathematics</td><td>male</td><td>12</td><td>76</td><td>5</td><td>99</td></tr><tr><td>student614</td><td>Languages</td><td>female</td><td>47</td><td>83</td><td>49</td><td>4</td></tr><tr><td>student615</td><td>Mathematics</td><td>male</td><td>37</td><td>27</td><td>22</td><td>4</td></tr><tr><td>student616</td><td>Languages</td><td>female</td><td>94</td><td>39</td><td>49</td><td>24</td></tr><tr><td>student617</td><td>Mathematics</td><td>male</td><td>0</td><td>75</td><td>21</td><td>41</td></tr><tr><td>student618</td><td>Languages</td><td>female</td><td>59</td><td>36</td><td>4</td><td>18</td></tr><tr><td>student619</td><td>Mathematics</td><td>male</td><td>22</td><td>66</td><td>13</td><td>3</td></tr><tr><td>student620</td><td>Languages</td><td>female</td><td>43</td><td>87</td><td>4</td><td>48</td></tr><tr><td>student621</td><td>Mathematics</td><td>male</td><td>100</td><td>15</td><td>51</td><td>52</td></tr><tr><td>student622</td><td>Languages</td><td>female</td><td>63</td><td>71</td><td>99</td><td>17</td></tr><tr><td>student623</td><td>Mathematics</td><td>male</td><td>14</td><td>34</td><td>44</td><td>100</td></tr><tr><td>student624</td><td>Languages</td><td>female</td><td>23</td><td>8</td><td>57</td><td>27</td></tr><tr><td>student625</td><td>Mathematics</td><td>male</td><td>23</td><td>14</td><td>32</td><td>40</td></tr><tr><td>student626</td><td>Languages</td><td>female</td><td>34</td><td>49</td><td>72</td><td>54</td></tr><tr><td>student627</td><td>Mathematics</td><td>male</td><td>21</td><td>16</td><td>81</td><td>26</td></tr><tr><td>student628</td><td>Languages</td><td>female</td><td>54</td><td>69</td><td>34</td><td>34</td></tr><tr><td>student629</td><td>Mathematics</td><td>male</td><td>72</td><td>11</td><td>63</td><td>31</td></tr><tr><td>student630</td><td>Languages</td><td>female</td><td>87</td><td>98</td><td>9</td><td>47</td></tr><tr><td>student631</td><td>Mathematics</td><td>male</td><td>43</td><td>52</td><td>53</td><td>58</td></tr><tr><td>student632</td><td>Languages</td><td>female</td><td>50</td><td>14</td><td>4</td><td>20</td></tr><tr><td>student633</td><td>Mathematics</td><td>male</td><td>89</td><td>83</td><td>67</td><td>87</td></tr><tr><td>student634</td><td>Languages</td><td>female</td><td>0</td><td>79</td><td>9</td><td>16</td></tr><tr><td>student635</td><td>Mathematics</td><td>male</td><td>59</td><td>17</td><td>84</td><td>58</td></tr><tr><td>student636</td><td>Languages</td><td>female</td><td>94</td><td>95</td><td>36</td><td>60</td></tr><tr><td>student637</td><td>Mathematics</td><td>male</td><td>39</td><td>42</td><td>63</td><td>46</td></tr><tr><td>student638</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>6</td><td>10</td></tr><tr><td>student639</td><td>Mathematics</td><td>male</td><td>50</td><td>16</td><td>41</td><td>71</td></tr><tr><td>student640</td><td>Languages</td><td>female</td><td>8</td><td>60</td><td>46</td><td>13</td></tr><tr><td>student641</td><td>Mathematics</td><td>male</td><td>45</td><td>85</td><td>59</td><td>36</td></tr><tr><td>student642</td><td>Languages</td><td>female</td><td>83</td><td>35</td><td>0</td><td>57</td></tr><tr><td>student643</td><td>Mathematics</td><td>male</td><td>8</td><td>30</td><td>60</td><td>14</td></tr><tr><td>student644</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>73</td><td>38</td></tr><tr><td>student645</td><td>Mathematics</td><td>male</td><td>26</td><td>14</td><td>58</td><td>2</td></tr><tr><td>student646</td><td>Languages</td><td>female</td><td>93</td><td>16</td><td>42</td><td>2</td></tr><tr><td>student647</td><td>Mathematics</td><td>male</td><td>85</td><td>94</td><td>76</td><td>16</td></tr><tr><td>student648</td><td>Languages</td><td>female</td><td>57</td><td>45</td><td>32</td><td>16</td></tr><tr><td>student649</td><td>Mathematics</td><td>male</td><td>16</td><td>16</td><td>90</td><td>13</td></tr><tr><td>student650</td><td>Languages</td><td>female</td><td>43</td><td>3</td><td>18</td><td>87</td></tr><tr><td>student651</td><td>Mathematics</td><td>male</td><td>16</td><td>24</td><td>32</td><td>44</td></tr><tr><td>student652</td><td>Languages</td><td>female</td><td>59</td><td>98</td><td>3</td><td>34</td></tr><tr><td>student653</td><td>Mathematics</td><td>male</td><td>73</td><td>18</td><td>47</td><td>83</td></tr><tr><td>student654</td><td>Languages</td><td>female</td><td>99</td><td>25</td><td>100</td><td>93</td></tr><tr><td>student655</td><td>Mathematics</td><td>male</td><td>0</td><td>73</td><td>97</td><td>84</td></tr><tr><td>student656</td><td>Languages</td><td>female</td><td>0</td><td>28</td><td>94</td><td>75</td></tr><tr><td>student657</td><td>Mathematics</td><td>male</td><td>65</td><td>90</td><td>58</td><td>63</td></tr><tr><td>student658</td><td>Languages</td><td>female</td><td>84</td><td>35</td><td>86</td><td>41</td></tr><tr><td>student659</td><td>Mathematics</td><td>male</td><td>45</td><td>39</td><td>59</td><td>9</td></tr><tr><td>student660</td><td>Languages</td><td>female</td><td>32</td><td>10</td><td>31</td><td>62</td></tr><tr><td>student661</td><td>Mathematics</td><td>male</td><td>61</td><td>28</td><td>54</td><td>61</td></tr><tr><td>student662</td><td>Languages</td><td>female</td><td>70</td><td>96</td><td>14</td><td>54</td></tr><tr><td>student663</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>29</td><td>8</td></tr><tr><td>student664</td><td>Languages</td><td>female</td><td>41</td><td>10</td><td>46</td><td>23</td></tr><tr><td>student665</td><td>Mathematics</td><td>male</td><td>81</td><td>91</td><td>80</td><td>21</td></tr><tr><td>student666</td><td>Languages</td><td>female</td><td>79</td><td>71</td><td>65</td><td>68</td></tr><tr><td>student667</td><td>Mathematics</td><td>male</td><td>47</td><td>69</td><td>18</td><td>90</td></tr><tr><td>student668</td><td>Languages</td><td>female</td><td>26</td><td>16</td><td>70</td><td>0</td></tr><tr><td>student669</td><td>Mathematics</td><td>male</td><td>66</td><td>10</td><td>93</td><td>35</td></tr><tr><td>student670</td><td>Languages</td><td>female</td><td>66</td><td>68</td><td>27</td><td>13</td></tr><tr><td>student671</td><td>Mathematics</td><td>male</td><td>86</td><td>79</td><td>26</td><td>45</td></tr><tr><td>student672</td><td>Languages</td><td>female</td><td>50</td><td>53</td><td>25</td><td>74</td></tr><tr><td>student673</td><td>Mathematics</td><td>male</td><td>97</td><td>53</td><td>9</td><td>14</td></tr><tr><td>student674</td><td>Languages</td><td>female</td><td>28</td><td>79</td><td>69</td><td>42</td></tr><tr><td>student675</td><td>Mathematics</td><td>male</td><td>60</td><td>72</td><td>5</td><td>9</td></tr><tr><td>student676</td><td>Languages</td><td>female</td><td>53</td><td>21</td><td>39</td><td>43</td></tr><tr><td>student677</td><td>Mathematics</td><td>male</td><td>37</td><td>65</td><td>45</td><td>91</td></tr><tr><td>student678</td><td>Languages</td><td>female</td><td>76</td><td>80</td><td>60</td><td>27</td></tr><tr><td>student679</td><td>Mathematics</td><td>male</td><td>85</td><td>27</td><td>34</td><td>55</td></tr><tr><td>student680</td><td>Languages</td><td>female</td><td>66</td><td>11</td><td>41</td><td>17</td></tr><tr><td>student681</td><td>Mathematics</td><td>male</td><td>27</td><td>61</td><td>89</td><td>82</td></tr><tr><td>student682</td><td>Languages</td><td>female</td><td>40</td><td>26</td><td>1</td><td>3</td></tr><tr><td>student683</td><td>Mathematics</td><td>male</td><td>25</td><td>1</td><td>66</td><td>95</td></tr><tr><td>student684</td><td>Languages</td><td>female</td><td>63</td><td>44</td><td>85</td><td>63</td></tr><tr><td>student685</td><td>Mathematics</td><td>male</td><td>97</td><td>95</td><td>78</td><td>83</td></tr><tr><td>student686</td><td>Languages</td><td>female</td><td>51</td><td>2</td><td>13</td><td>87</td></tr><tr><td>student687</td><td>Mathematics</td><td>male</td><td>63</td><td>92</td><td>87</td><td>23</td></tr><tr><td>student688</td><td>Languages</td><td>female</td><td>22</td><td>96</td><td>59</td><td>59</td></tr><tr><td>student689</td><td>Mathematics</td><td>male</td><td>33</td><td>80</td><td>15</td><td>23</td></tr><tr><td>student690</td><td>Languages</td><td>female</td><td>34</td><td>75</td><td>19</td><td>24</td></tr><tr><td>student691</td><td>Mathematics</td><td>male</td><td>36</td><td>68</td><td>48</td><td>54</td></tr><tr><td>student692</td><td>Languages</td><td>female</td><td>32</td><td>36</td><td>20</td><td>12</td></tr><tr><td>student693</td><td>Mathematics</td><td>male</td><td>68</td><td>91</td><td>74</td><td>50</td></tr><tr><td>student694</td><td>Languages</td><td>female</td><td>87</td><td>91</td><td>96</td><td>37</td></tr><tr><td>student695</td><td>Mathematics</td><td>male</td><td>23</td><td>9</td><td>14</td><td>4</td></tr><tr><td>student696</td><td>Languages</td><td>female</td><td>94</td><td>62</td><td>9</td><td>77</td></tr><tr><td>student697</td><td>Mathematics</td><td>male</td><td>14</td><td>7</td><td>45</td><td>75</td></tr><tr><td>student698</td><td>Languages</td><td>female</td><td>73</td><td>92</td><td>19</td><td>90</td></tr><tr><td>student699</td><td>Mathematics</td><td>male</td><td>8</td><td>20</td><td>79</td><td>78</td></tr><tr><td>student700</td><td>Languages</td><td>female</td><td>76</td><td>35</td><td>100</td><td>39</td></tr><tr><td>student701</td><td>Mathematics</td><td>male</td><td>27</td><td>51</td><td>89</td><td>49</td></tr><tr><td>student702</td><td>Languages</td><td>female</td><td>0</td><td>64</td><td>72</td><td>37</td></tr><tr><td>student703</td><td>Mathematics</td><td>male</td><td>93</td><td>46</td><td>94</td><td>87</td></tr><tr><td>student704</td><td>Languages</td><td>female</td><td>69</td><td>22</td><td>17</td><td>2</td></tr><tr><td>student705</td><td>Mathematics</td><td>male</td><td>17</td><td>52</td><td>11</td><td>3</td></tr><tr><td>student706</td><td>Languages</td><td>female</td><td>13</td><td>2</td><td>52</td><td>19</td></tr><tr><td>student707</td><td>Mathematics</td><td>male</td><td>75</td><td>61</td><td>72</td><td>73</td></tr><tr><td>student708</td><td>Languages</td><td>female</td><td>84</td><td>37</td><td>7</td><td>36</td></tr><tr><td>student709</td><td>Mathematics</td><td>male</td><td>81</td><td>19</td><td>45</td><td>14</td></tr><tr><td>student710</td><td>Languages</td><td>female</td><td>62</td><td>17</td><td>39</td><td>27</td></tr><tr><td>student711</td><td>Mathematics</td><td>male</td><td>88</td><td>69</td><td>6</td><td>81</td></tr><tr><td>student712</td><td>Languages</td><td>female</td><td>53</td><td>82</td><td>59</td><td>29</td></tr><tr><td>student713</td><td>Mathematics</td><td>male</td><td>83</td><td>34</td><td>71</td><td>34</td></tr><tr><td>student714</td><td>Languages</td><td>female</td><td>95</td><td>52</td><td>61</td><td>4</td></tr><tr><td>student715</td><td>Mathematics</td><td>male</td><td>6</td><td>71</td><td>53</td><td>13</td></tr><tr><td>student716</td><td>Languages</td><td>female</td><td>82</td><td>97</td><td>82</td><td>5</td></tr><tr><td>student717</td><td>Mathematics</td><td>male</td><td>65</td><td>50</td><td>31</td><td>46</td></tr><tr><td>student718</td><td>Languages</td><td>female</td><td>27</td><td>46</td><td>25</td><td>37</td></tr><tr><td>student719</td><td>Mathematics</td><td>male</td><td>98</td><td>42</td><td>35</td><td>44</td></tr><tr><td>student720</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>44</td><td>44</td></tr><tr><td>student721</td><td>Mathematics</td><td>male</td><td>3</td><td>16</td><td>82</td><td>93</td></tr><tr><td>student722</td><td>Languages</td><td>female</td><td>34</td><td>3</td><td>43</td><td>70</td></tr><tr><td>student723</td><td>Mathematics</td><td>male</td><td>59</td><td>77</td><td>14</td><td>21</td></tr><tr><td>student724</td><td>Languages</td><td>female</td><td>16</td><td>53</td><td>57</td><td>59</td></tr><tr><td>student725</td><td>Mathematics</td><td>male</td><td>79</td><td>1</td><td>44</td><td>16</td></tr><tr><td>student726</td><td>Languages</td><td>female</td><td>10</td><td>8</td><td>19</td><td>9</td></tr><tr><td>student727</td><td>Mathematics</td><td>male</td><td>89</td><td>48</td><td>79</td><td>16</td></tr><tr><td>student728</td><td>Languages</td><td>female</td><td>8</td><td>87</td><td>23</td><td>87</td></tr><tr><td>student729</td><td>Mathematics</td><td>male</td><td>17</td><td>53</td><td>95</td><td>84</td></tr><tr><td>student730</td><td>Languages</td><td>female</td><td>65</td><td>52</td><td>39</td><td>61</td></tr><tr><td>student731</td><td>Mathematics</td><td>male</td><td>44</td><td>30</td><td>96</td><td>72</td></tr><tr><td>student732</td><td>Languages</td><td>female</td><td>70</td><td>79</td><td>32</td><td>33</td></tr><tr><td>student733</td><td>Mathematics</td><td>male</td><td>30</td><td>47</td><td>46</td><td>11</td></tr><tr><td>student734</td><td>Languages</td><td>female</td><td>76</td><td>100</td><td>16</td><td>49</td></tr><tr><td>student735</td><td>Mathematics</td><td>male</td><td>39</td><td>36</td><td>90</td><td>89</td></tr><tr><td>student736</td><td>Languages</td><td>female</td><td>1</td><td>94</td><td>19</td><td>29</td></tr><tr><td>student737</td><td>Mathematics</td><td>male</td><td>23</td><td>73</td><td>78</td><td>87</td></tr><tr><td>student738</td><td>Languages</td><td>female</td><td>87</td><td>71</td><td>44</td><td>64</td></tr><tr><td>student739</td><td>Mathematics</td><td>male</td><td>22</td><td>19</td><td>82</td><td>20</td></tr><tr><td>student740</td><td>Languages</td><td>female</td><td>94</td><td>52</td><td>67</td><td>39</td></tr><tr><td>student741</td><td>Mathematics</td><td>male</td><td>14</td><td>17</td><td>51</td><td>87</td></tr><tr><td>student742</td><td>Languages</td><td>female</td><td>56</td><td>63</td><td>98</td><td>3</td></tr><tr><td>student743</td><td>Mathematics</td><td>male</td><td>99</td><td>92</td><td>46</td><td>98</td></tr><tr><td>student744</td><td>Languages</td><td>female</td><td>19</td><td>76</td><td>83</td><td>88</td></tr><tr><td>student745</td><td>Mathematics</td><td>male</td><td>15</td><td>77</td><td>68</td><td>81</td></tr><tr><td>student746</td><td>Languages</td><td>female</td><td>48</td><td>81</td><td>48</td><td>38</td></tr><tr><td>student747</td><td>Mathematics</td><td>male</td><td>29</td><td>1</td><td>38</td><td>61</td></tr><tr><td>student748</td><td>Languages</td><td>female</td><td>71</td><td>63</td><td>0</td><td>30</td></tr><tr><td>student749</td><td>Mathematics</td><td>male</td><td>19</td><td>68</td><td>30</td><td>53</td></tr><tr><td>student750</td><td>Languages</td><td>female</td><td>91</td><td>18</td><td>27</td><td>62</td></tr><tr><td>student751</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>38</td><td>36</td></tr><tr><td>student752</td><td>Languages</td><td>female</td><td>99</td><td>38</td><td>75</td><td>50</td></tr><tr><td>student753</td><td>Mathematics</td><td>male</td><td>55</td><td>71</td><td>34</td><td>90</td></tr><tr><td>student754</td><td>Languages</td><td>female</td><td>52</td><td>40</td><td>98</td><td>83</td></tr><tr><td>student755</td><td>Mathematics</td><td>male</td><td>14</td><td>63</td><td>61</td><td>1</td></tr><tr><td>student756</td><td>Languages</td><td>female</td><td>1</td><td>31</td><td>94</td><td>96</td></tr><tr><td>student757</td><td>Mathematics</td><td>male</td><td>49</td><td>66</td><td>55</td><td>92</td></tr><tr><td>student758</td><td>Languages</td><td>female</td><td>0</td><td>19</td><td>80</td><td>82</td></tr><tr><td>student759</td><td>Mathematics</td><td>male</td><td>26</td><td>35</td><td>87</td><td>3</td></tr><tr><td>student760</td><td>Languages</td><td>female</td><td>8</td><td>28</td><td>76</td><td>39</td></tr><tr><td>student761</td><td>Mathematics</td><td>male</td><td>52</td><td>11</td><td>83</td><td>57</td></tr><tr><td>student762</td><td>Languages</td><td>female</td><td>83</td><td>68</td><td>84</td><td>25</td></tr><tr><td>student763</td><td>Mathematics</td><td>male</td><td>17</td><td>2</td><td>56</td><td>70</td></tr><tr><td>student764</td><td>Languages</td><td>female</td><td>17</td><td>58</td><td>0</td><td>84</td></tr><tr><td>student765</td><td>Mathematics</td><td>male</td><td>75</td><td>6</td><td>47</td><td>85</td></tr><tr><td>student766</td><td>Languages</td><td>female</td><td>76</td><td>32</td><td>93</td><td>39</td></tr><tr><td>student767</td><td>Mathematics</td><td>male</td><td>20</td><td>75</td><td>84</td><td>65</td></tr><tr><td>student768</td><td>Languages</td><td>female</td><td>25</td><td>47</td><td>12</td><td>89</td></tr><tr><td>student769</td><td>Mathematics</td><td>male</td><td>86</td><td>94</td><td>79</td><td>45</td></tr><tr><td>student770</td><td>Languages</td><td>female</td><td>65</td><td>81</td><td>55</td><td>35</td></tr><tr><td>student771</td><td>Mathematics</td><td>male</td><td>62</td><td>41</td><td>41</td><td>43</td></tr><tr><td>student772</td><td>Languages</td><td>female</td><td>14</td><td>4</td><td>62</td><td>43</td></tr><tr><td>student773</td><td>Mathematics</td><td>male</td><td>17</td><td>55</td><td>72</td><td>78</td></tr><tr><td>student774</td><td>Languages</td><td>female</td><td>95</td><td>46</td><td>35</td><td>6</td></tr><tr><td>student775</td><td>Mathematics</td><td>male</td><td>72</td><td>0</td><td>56</td><td>48</td></tr><tr><td>student776</td><td>Languages</td><td>female</td><td>30</td><td>88</td><td>19</td><td>56</td></tr><tr><td>student777</td><td>Mathematics</td><td>male</td><td>42</td><td>44</td><td>88</td><td>56</td></tr><tr><td>student778</td><td>Languages</td><td>female</td><td>42</td><td>69</td><td>56</td><td>63</td></tr><tr><td>student779</td><td>Mathematics</td><td>male</td><td>78</td><td>57</td><td>78</td><td>3</td></tr><tr><td>student780</td><td>Languages</td><td>female</td><td>15</td><td>86</td><td>24</td><td>98</td></tr><tr><td>student781</td><td>Mathematics</td><td>male</td><td>46</td><td>8</td><td>43</td><td>69</td></tr><tr><td>student782</td><td>Languages</td><td>female</td><td>67</td><td>98</td><td>15</td><td>52</td></tr><tr><td>student783</td><td>Mathematics</td><td>male</td><td>33</td><td>32</td><td>63</td><td>57</td></tr><tr><td>student784</td><td>Languages</td><td>female</td><td>35</td><td>95</td><td>16</td><td>53</td></tr><tr><td>student785</td><td>Mathematics</td><td>male</td><td>78</td><td>54</td><td>54</td><td>82</td></tr><tr><td>student786</td><td>Languages</td><td>female</td><td>81</td><td>85</td><td>91</td><td>4</td></tr><tr><td>student787</td><td>Mathematics</td><td>male</td><td>42</td><td>41</td><td>23</td><td>14</td></tr><tr><td>student788</td><td>Languages</td><td>female</td><td>59</td><td>100</td><td>86</td><td>36</td></tr><tr><td>student789</td><td>Mathematics</td><td>male</td><td>1</td><td>92</td><td>60</td><td>12</td></tr><tr><td>student790</td><td>Languages</td><td>female</td><td>100</td><td>34</td><td>5</td><td>70</td></tr><tr><td>student791</td><td>Mathematics</td><td>male</td><td>3</td><td>81</td><td>2</td><td>17</td></tr><tr><td>student792</td><td>Languages</td><td>female</td><td>31</td><td>55</td><td>19</td><td>3</td></tr><tr><td>student793</td><td>Mathematics</td><td>male</td><td>11</td><td>33</td><td>98</td><td>77</td></tr><tr><td>student794</td><td>Languages</td><td>female</td><td>4</td><td>61</td><td>7</td><td>86</td></tr><tr><td>student795</td><td>Mathematics</td><td>male</td><td>57</td><td>86</td><td>7</td><td>27</td></tr><tr><td>student796</td><td>Languages</td><td>female</td><td>5</td><td>74</td><td>62</td><td>36</td></tr><tr><td>student797</td><td>Mathematics</td><td>male</td><td>57</td><td>67</td><td>66</td><td>61</td></tr><tr><td>student798</td><td>Languages</td><td>female</td><td>93</td><td>88</td><td>87</td><td>25</td></tr><tr><td>student799</td><td>Mathematics</td><td>male</td><td>59</td><td>96</td><td>64</td><td>41</td></tr><tr><td>student800</td><td>Languages</td><td>female</td><td>62</td><td>7</td><td>69</td><td>23</td></tr><tr><td>student801</td><td>Mathematics</td><td>male</td><td>35</td><td>83</td><td>32</td><td>55</td></tr><tr><td>student802</td><td>Languages</td><td>female</td><td>42</td><td>58</td><td>15</td><td>83</td></tr><tr><td>student803</td><td>Mathematics</td><td>male</td><td>41</td><td>90</td><td>40</td><td>12</td></tr><tr><td>student804</td><td>Languages</td><td>female</td><td>81</td><td>43</td><td>83</td><td>7</td></tr><tr><td>student805</td><td>Mathematics</td><td>male</td><td>87</td><td>77</td><td>33</td><td>20</td></tr><tr><td>student806</td><td>Languages</td><td>female</td><td>53</td><td>87</td><td>30</td><td>37</td></tr><tr><td>student807</td><td>Mathematics</td><td>male</td><td>13</td><td>35</td><td>85</td><td>16</td></tr><tr><td>student808</td><td>Languages</td><td>female</td><td>20</td><td>82</td><td>90</td><td>34</td></tr><tr><td>student809</td><td>Mathematics</td><td>male</td><td>58</td><td>2</td><td>16</td><td>14</td></tr><tr><td>student810</td><td>Languages</td><td>female</td><td>14</td><td>28</td><td>23</td><td>56</td></tr><tr><td>student811</td><td>Mathematics</td><td>male</td><td>49</td><td>97</td><td>36</td><td>8</td></tr><tr><td>student812</td><td>Languages</td><td>female</td><td>31</td><td>46</td><td>11</td><td>63</td></tr><tr><td>student813</td><td>Mathematics</td><td>male</td><td>74</td><td>9</td><td>76</td><td>43</td></tr><tr><td>student814</td><td>Languages</td><td>female</td><td>42</td><td>83</td><td>95</td><td>75</td></tr><tr><td>student815</td><td>Mathematics</td><td>male</td><td>2</td><td>65</td><td>45</td><td>29</td></tr><tr><td>student816</td><td>Languages</td><td>female</td><td>79</td><td>59</td><td>69</td><td>88</td></tr><tr><td>student817</td><td>Mathematics</td><td>male</td><td>68</td><td>18</td><td>26</td><td>84</td></tr><tr><td>student818</td><td>Languages</td><td>female</td><td>39</td><td>13</td><td>99</td><td>15</td></tr><tr><td>student819</td><td>Mathematics</td><td>male</td><td>22</td><td>48</td><td>71</td><td>6</td></tr><tr><td>student820</td><td>Languages</td><td>female</td><td>12</td><td>53</td><td>88</td><td>11</td></tr><tr><td>student821</td><td>Mathematics</td><td>male</td><td>33</td><td>90</td><td>80</td><td>29</td></tr><tr><td>student822</td><td>Languages</td><td>female</td><td>37</td><td>9</td><td>54</td><td>86</td></tr><tr><td>student823</td><td>Mathematics</td><td>male</td><td>91</td><td>78</td><td>85</td><td>1</td></tr><tr><td>student824</td><td>Languages</td><td>female</td><td>31</td><td>58</td><td>67</td><td>31</td></tr><tr><td>student825</td><td>Mathematics</td><td>male</td><td>22</td><td>30</td><td>50</td><td>98</td></tr><tr><td>student826</td><td>Languages</td><td>female</td><td>55</td><td>58</td><td>56</td><td>10</td></tr><tr><td>student827</td><td>Mathematics</td><td>male</td><td>56</td><td>76</td><td>57</td><td>53</td></tr><tr><td>student828</td><td>Languages</td><td>female</td><td>1</td><td>12</td><td>98</td><td>81</td></tr><tr><td>student829</td><td>Mathematics</td><td>male</td><td>67</td><td>92</td><td>66</td><td>71</td></tr><tr><td>student830</td><td>Languages</td><td>female</td><td>30</td><td>61</td><td>44</td><td>49</td></tr><tr><td>student831</td><td>Mathematics</td><td>male</td><td>0</td><td>41</td><td>44</td><td>61</td></tr><tr><td>student832</td><td>Languages</td><td>female</td><td>72</td><td>52</td><td>45</td><td>85</td></tr><tr><td>student833</td><td>Mathematics</td><td>male</td><td>60</td><td>99</td><td>12</td><td>94</td></tr><tr><td>student834</td><td>Languages</td><td>female</td><td>83</td><td>58</td><td>75</td><td>42</td></tr><tr><td>student835</td><td>Mathematics</td><td>male</td><td>95</td><td>0</td><td>53</td><td>77</td></tr><tr><td>student836</td><td>Languages</td><td>female</td><td>33</td><td>28</td><td>70</td><td>62</td></tr><tr><td>student837</td><td>Mathematics</td><td>male</td><td>39</td><td>82</td><td>75</td><td>5</td></tr><tr><td>student838</td><td>Languages</td><td>female</td><td>41</td><td>100</td><td>45</td><td>47</td></tr><tr><td>student839</td><td>Mathematics</td><td>male</td><td>81</td><td>69</td><td>27</td><td>29</td></tr><tr><td>student840</td><td>Languages</td><td>female</td><td>90</td><td>1</td><td>26</td><td>49</td></tr><tr><td>student841</td><td>Mathematics</td><td>male</td><td>45</td><td>38</td><td>20</td><td>34</td></tr><tr><td>student842</td><td>Languages</td><td>female</td><td>3</td><td>25</td><td>31</td><td>1</td></tr><tr><td>student843</td><td>Mathematics</td><td>male</td><td>55</td><td>77</td><td>86</td><td>49</td></tr><tr><td>student844</td><td>Languages</td><td>female</td><td>61</td><td>60</td><td>91</td><td>76</td></tr><tr><td>student845</td><td>Mathematics</td><td>male</td><td>80</td><td>85</td><td>74</td><td>9</td></tr><tr><td>student846</td><td>Languages</td><td>female</td><td>63</td><td>89</td><td>73</td><td>71</td></tr><tr><td>student847</td><td>Mathematics</td><td>male</td><td>79</td><td>15</td><td>97</td><td>42</td></tr><tr><td>student848</td><td>Languages</td><td>female</td><td>99</td><td>18</td><td>73</td><td>43</td></tr><tr><td>student849</td><td>Mathematics</td><td>male</td><td>30</td><td>52</td><td>38</td><td>56</td></tr><tr><td>student850</td><td>Languages</td><td>female</td><td>65</td><td>86</td><td>67</td><td>34</td></tr><tr><td>student851</td><td>Mathematics</td><td>male</td><td>73</td><td>43</td><td>6</td><td>55</td></tr><tr><td>student852</td><td>Languages</td><td>female</td><td>42</td><td>43</td><td>51</td><td>73</td></tr><tr><td>student853</td><td>Mathematics</td><td>male</td><td>8</td><td>70</td><td>98</td><td>0</td></tr><tr><td>student854</td><td>Languages</td><td>female</td><td>29</td><td>41</td><td>12</td><td>45</td></tr><tr><td>student855</td><td>Mathematics</td><td>male</td><td>57</td><td>3</td><td>90</td><td>90</td></tr><tr><td>student856</td><td>Languages</td><td>female</td><td>80</td><td>52</td><td>96</td><td>54</td></tr><tr><td>student857</td><td>Mathematics</td><td>male</td><td>43</td><td>83</td><td>82</td><td>46</td></tr><tr><td>student858</td><td>Languages</td><td>female</td><td>7</td><td>91</td><td>71</td><td>31</td></tr><tr><td>student859</td><td>Mathematics</td><td>male</td><td>68</td><td>13</td><td>70</td><td>7</td></tr><tr><td>student860</td><td>Languages</td><td>female</td><td>51</td><td>44</td><td>15</td><td>52</td></tr><tr><td>student861</td><td>Mathematics</td><td>male</td><td>91</td><td>70</td><td>1</td><td>78</td></tr><tr><td>student862</td><td>Languages</td><td>female</td><td>4</td><td>11</td><td>65</td><td>78</td></tr><tr><td>student863</td><td>Mathematics</td><td>male</td><td>20</td><td>63</td><td>55</td><td>85</td></tr><tr><td>student864</td><td>Languages</td><td>female</td><td>59</td><td>3</td><td>87</td><td>26</td></tr><tr><td>student865</td><td>Mathematics</td><td>male</td><td>4</td><td>89</td><td>44</td><td>32</td></tr><tr><td>student866</td><td>Languages</td><td>female</td><td>26</td><td>67</td><td>98</td><td>39</td></tr><tr><td>student867</td><td>Mathematics</td><td>male</td><td>48</td><td>79</td><td>38</td><td>66</td></tr><tr><td>student868</td><td>Languages</td><td>female</td><td>16</td><td>32</td><td>15</td><td>3</td></tr><tr><td>student869</td><td>Mathematics</td><td>male</td><td>13</td><td>20</td><td>50</td><td>85</td></tr><tr><td>student870</td><td>Languages</td><td>female</td><td>4</td><td>92</td><td>20</td><td>39</td></tr><tr><td>student871</td><td>Mathematics</td><td>male</td><td>82</td><td>6</td><td>23</td><td>53</td></tr><tr><td>student872</td><td>Languages</td><td>female</td><td>6</td><td>60</td><td>74</td><td>64</td></tr><tr><td>student873</td><td>Mathematics</td><td>male</td><td>66</td><td>48</td><td>39</td><td>14</td></tr><tr><td>student874</td><td>Languages</td><td>female</td><td>43</td><td>83</td><td>3</td><td>100</td></tr><tr><td>student875</td><td>Mathematics</td><td>male</td><td>21</td><td>49</td><td>9</td><td>0</td></tr><tr><td>student876</td><td>Languages</td><td>female</td><td>79</td><td>80</td><td>71</td><td>80</td></tr><tr><td>student877</td><td>Mathematics</td><td>male</td><td>84</td><td>25</td><td>26</td><td>88</td></tr><tr><td>student878</td><td>Languages</td><td>female</td><td>38</td><td>46</td><td>66</td><td>60</td></tr><tr><td>student879</td><td>Mathematics</td><td>male</td><td>35</td><td>27</td><td>98</td><td>51</td></tr><tr><td>student880</td><td>Languages</td><td>female</td><td>57</td><td>59</td><td>2</td><td>67</td></tr><tr><td>student881</td><td>Mathematics</td><td>male</td><td>76</td><td>87</td><td>78</td><td>8</td></tr><tr><td>student882</td><td>Languages</td><td>female</td><td>21</td><td>40</td><td>8</td><td>17</td></tr><tr><td>student883</td><td>Mathematics</td><td>male</td><td>50</td><td>4</td><td>68</td><td>66</td></tr><tr><td>student884</td><td>Languages</td><td>female</td><td>83</td><td>86</td><td>30</td><td>92</td></tr><tr><td>student885</td><td>Mathematics</td><td>male</td><td>63</td><td>46</td><td>66</td><td>94</td></tr><tr><td>student886</td><td>Languages</td><td>female</td><td>76</td><td>71</td><td>2</td><td>62</td></tr><tr><td>student887</td><td>Mathematics</td><td>male</td><td>74</td><td>18</td><td>68</td><td>6</td></tr><tr><td>student888</td><td>Languages</td><td>female</td><td>65</td><td>77</td><td>44</td><td>88</td></tr><tr><td>student889</td><td>Mathematics</td><td>male</td><td>67</td><td>32</td><td>61</td><td>19</td></tr><tr><td>student890</td><td>Languages</td><td>female</td><td>85</td><td>96</td><td>85</td><td>41</td></tr><tr><td>student891</td><td>Mathematics</td><td>male</td><td>14</td><td>87</td><td>70</td><td>5</td></tr><tr><td>student892</td><td>Languages</td><td>female</td><td>81</td><td>28</td><td>45</td><td>28</td></tr><tr><td>student893</td><td>Mathematics</td><td>male</td><td>9</td><td>19</td><td>18</td><td>83</td></tr><tr><td>student894</td><td>Languages</td><td>female</td><td>40</td><td>70</td><td>2</td><td>4</td></tr><tr><td>student895</td><td>Mathematics</td><td>male</td><td>18</td><td>19</td><td>51</td><td>89</td></tr><tr><td>student896</td><td>Languages</td><td>female</td><td>70</td><td>35</td><td>25</td><td>12</td></tr><tr><td>student897</td><td>Mathematics</td><td>male</td><td>72</td><td>90</td><td>7</td><td>41</td></tr><tr><td>student898</td><td>Languages</td><td>female</td><td>84</td><td>1</td><td>71</td><td>86</td></tr><tr><td>student899</td><td>Mathematics</td><td>male</td><td>14</td><td>2</td><td>38</td><td>86</td></tr><tr><td>student900</td><td>Languages</td><td>female</td><td>78</td><td>37</td><td>60</td><td>1</td></tr><tr><td>student901</td><td>Mathematics</td><td>male</td><td>66</td><td>95</td><td>31</td><td>68</td></tr><tr><td>student902</td><td>Languages</td><td>female</td><td>23</td><td>60</td><td>80</td><td>65</td></tr><tr><td>student903</td><td>Mathematics</td><td>male</td><td>76</td><td>89</td><td>63</td><td>96</td></tr><tr><td>student904</td><td>Languages</td><td>female</td><td>3</td><td>46</td><td>90</td><td>70</td></tr><tr><td>student905</td><td>Mathematics</td><td>male</td><td>65</td><td>44</td><td>96</td><td>79</td></tr><tr><td>student906</td><td>Languages</td><td>female</td><td>68</td><td>77</td><td>8</td><td>65</td></tr><tr><td>student907</td><td>Mathematics</td><td>male</td><td>86</td><td>61</td><td>99</td><td>43</td></tr><tr><td>student908</td><td>Languages</td><td>female</td><td>88</td><td>95</td><td>32</td><td>13</td></tr><tr><td>student909</td><td>Mathematics</td><td>male</td><td>53</td><td>100</td><td>59</td><td>82</td></tr><tr><td>student910</td><td>Languages</td><td>female</td><td>35</td><td>7</td><td>95</td><td>35</td></tr><tr><td>student911</td><td>Mathematics</td><td>male</td><td>23</td><td>0</td><td>1</td><td>77</td></tr><tr><td>student912</td><td>Languages</td><td>female</td><td>9</td><td>68</td><td>72</td><td>63</td></tr><tr><td>student913</td><td>Mathematics</td><td>male</td><td>23</td><td>92</td><td>39</td><td>96</td></tr><tr><td>student914</td><td>Languages</td><td>female</td><td>94</td><td>97</td><td>6</td><td>58</td></tr><tr><td>student915</td><td>Mathematics</td><td>male</td><td>49</td><td>31</td><td>29</td><td>71</td></tr><tr><td>student916</td><td>Languages</td><td>female</td><td>21</td><td>57</td><td>79</td><td>57</td></tr><tr><td>student917</td><td>Mathematics</td><td>male</td><td>0</td><td>35</td><td>100</td><td>89</td></tr><tr><td>student918</td><td>Languages</td><td>female</td><td>64</td><td>82</td><td>75</td><td>52</td></tr><tr><td>student919</td><td>Mathematics</td><td>male</td><td>16</td><td>66</td><td>69</td><td>68</td></tr><tr><td>student920</td><td>Languages</td><td>female</td><td>92</td><td>95</td><td>11</td><td>27</td></tr><tr><td>student921</td><td>Mathematics</td><td>male</td><td>16</td><td>88</td><td>85</td><td>90</td></tr><tr><td>student922</td><td>Languages</td><td>female</td><td>56</td><td>15</td><td>26</td><td>98</td></tr><tr><td>student923</td><td>Mathematics</td><td>male</td><td>78</td><td>27</td><td>40</td><td>17</td></tr><tr><td>student924</td><td>Languages</td><td>female</td><td>95</td><td>10</td><td>44</td><td>32</td></tr><tr><td>student925</td><td>Mathematics</td><td>male</td><td>99</td><td>85</td><td>52</td><td>18</td></tr><tr><td>student926</td><td>Languages</td><td>female</td><td>73</td><td>31</td><td>71</td><td>49</td></tr><tr><td>student927</td><td>Mathematics</td><td>male</td><td>21</td><td>79</td><td>10</td><td>63</td></tr><tr><td>student928</td><td>Languages</td><td>female</td><td>92</td><td>71</td><td>80</td><td>12</td></tr><tr><td>student929</td><td>Mathematics</td><td>male</td><td>23</td><td>29</td><td>33</td><td>88</td></tr><tr><td>student930</td><td>Languages</td><td>female</td><td>41</td><td>8</td><td>98</td><td>84</td></tr><tr><td>student931</td><td>Mathematics</td><td>male</td><td>97</td><td>17</td><td>79</td><td>21</td></tr><tr><td>student932</td><td>Languages</td><td>female</td><td>72</td><td>40</td><td>93</td><td>92</td></tr><tr><td>student933</td><td>Mathematics</td><td>male</td><td>75</td><td>58</td><td>3</td><td>26</td></tr><tr><td>student934</td><td>Languages</td><td>female</td><td>15</td><td>98</td><td>27</td><td>28</td></tr><tr><td>student935</td><td>Mathematics</td><td>male</td><td>76</td><td>88</td><td>80</td><td>6</td></tr><tr><td>student936</td><td>Languages</td><td>female</td><td>84</td><td>23</td><td>42</td><td>92</td></tr><tr><td>student937</td><td>Mathematics</td><td>male</td><td>71</td><td>56</td><td>86</td><td>71</td></tr><tr><td>student938</td><td>Languages</td><td>female</td><td>7</td><td>39</td><td>58</td><td>22</td></tr><tr><td>student939</td><td>Mathematics</td><td>male</td><td>1</td><td>55</td><td>54</td><td>60</td></tr><tr><td>student940</td><td>Languages</td><td>female</td><td>20</td><td>31</td><td>30</td><td>8</td></tr><tr><td>student941</td><td>Mathematics</td><td>male</td><td>97</td><td>54</td><td>41</td><td>81</td></tr><tr><td>student942</td><td>Languages</td><td>female</td><td>83</td><td>41</td><td>86</td><td>64</td></tr><tr><td>student943</td><td>Mathematics</td><td>male</td><td>71</td><td>95</td><td>32</td><td>7</td></tr><tr><td>student944</td><td>Languages</td><td>female</td><td>0</td><td>27</td><td>30</td><td>91</td></tr><tr><td>student945</td><td>Mathematics</td><td>male</td><td>99</td><td>75</td><td>17</td><td>22</td></tr><tr><td>student946</td><td>Languages</td><td>female</td><td>92</td><td>53</td><td>10</td><td>90</td></tr><tr><td>student947</td><td>Mathematics</td><td>male</td><td>4</td><td>44</td><td>94</td><td>32</td></tr><tr><td>student948</td><td>Languages</td><td>female</td><td>0</td><td>97</td><td>48</td><td>79</td></tr><tr><td>student949</td><td>Mathematics</td><td>male</td><td>97</td><td>55</td><td>79</td><td>74</td></tr><tr><td>student950</td><td>Languages</td><td>female</td><td>65</td><td>98</td><td>9</td><td>32</td></tr><tr><td>student951</td><td>Mathematics</td><td>male</td><td>56</td><td>73</td><td>38</td><td>81</td></tr><tr><td>student952</td><td>Languages</td><td>female</td><td>84</td><td>94</td><td>61</td><td>50</td></tr><tr><td>student953</td><td>Mathematics</td><td>male</td><td>48</td><td>20</td><td>77</td><td>0</td></tr><tr><td>student954</td><td>Languages</td><td>female</td><td>39</td><td>98</td><td>14</td><td>20</td></tr><tr><td>student955</td><td>Mathematics</td><td>male</td><td>4</td><td>15</td><td>24</td><td>65</td></tr><tr><td>student956</td><td>Languages</td><td>female</td><td>78</td><td>22</td><td>92</td><td>31</td></tr><tr><td>student957</td><td>Mathematics</td><td>male</td><td>28</td><td>38</td><td>26</td><td>54</td></tr><tr><td>student958</td><td>Languages</td><td>female</td><td>49</td><td>61</td><td>35</td><td>54</td></tr><tr><td>student959</td><td>Mathematics</td><td>male</td><td>81</td><td>15</td><td>28</td><td>17</td></tr><tr><td>student960</td><td>Languages</td><td>female</td><td>54</td><td>80</td><td>58</td><td>2</td></tr><tr><td>student961</td><td>Mathematics</td><td>male</td><td>75</td><td>23</td><td>5</td><td>37</td></tr><tr><td>student962</td><td>Languages</td><td>female</td><td>55</td><td>65</td><td>1</td><td>20</td></tr><tr><td>student963</td><td>Mathematics</td><td>male</td><td>86</td><td>42</td><td>70</td><td>36</td></tr><tr><td>student964</td><td>Languages</td><td>female</td><td>54</td><td>45</td><td>54</td><td>80</td></tr><tr><td>student965</td><td>Mathematics</td><td>male</td><td>38</td><td>18</td><td>69</td><td>92</td></tr><tr><td>student966</td><td>Languages</td><td>female</td><td>33</td><td>89</td><td>46</td><td>83</td></tr><tr><td>student967</td><td>Mathematics</td><td>male</td><td>43</td><td>9</td><td>55</td><td>76</td></tr><tr><td>student968</td><td>Languages</td><td>female</td><td>13</td><td>26</td><td>12</td><td>86</td></tr><tr><td>student969</td><td>Mathematics</td><td>male</td><td>94</td><td>22</td><td>85</td><td>59</td></tr><tr><td>student970</td><td>Languages</td><td>female</td><td>93</td><td>58</td><td>6</td><td>10</td></tr><tr><td>student971</td><td>Mathematics</td><td>male</td><td>35</td><td>72</td><td>85</td><td>36</td></tr><tr><td>student972</td><td>Languages</td><td>female</td><td>37</td><td>51</td><td>96</td><td>93</td></tr><tr><td>student973</td><td>Mathematics</td><td>male</td><td>71</td><td>10</td><td>79</td><td>59</td></tr><tr><td>student974</td><td>Languages</td><td>female</td><td>71</td><td>31</td><td>73</td><td>93</td></tr><tr><td>student975</td><td>Mathematics</td><td>male</td><td>80</td><td>26</td><td>86</td><td>97</td></tr><tr><td>student976</td><td>Languages</td><td>female</td><td>69</td><td>21</td><td>67</td><td>69</td></tr><tr><td>student977</td><td>Mathematics</td><td>male</td><td>38</td><td>86</td><td>10</td><td>39</td></tr><tr><td>student978</td><td>Languages</td><td>female</td><td>48</td><td>90</td><td>39</td><td>81</td></tr><tr><td>student979</td><td>Mathematics</td><td>male</td><td>90</td><td>83</td><td>3</td><td>42</td></tr><tr><td>student980</td><td>Languages</td><td>female</td><td>19</td><td>1</td><td>91</td><td>84</td></tr><tr><td>student981</td><td>Mathematics</td><td>male</td><td>98</td><td>25</td><td>50</td><td>46</td></tr><tr><td>student982</td><td>Languages</td><td>female</td><td>38</td><td>88</td><td>21</td><td>16</td></tr><tr><td>student983</td><td>Mathematics</td><td>male</td><td>71</td><td>48</td><td>18</td><td>43</td></tr><tr><td>student984</td><td>Languages</td><td>female</td><td>79</td><td>85</td><td>18</td><td>16</td></tr><tr><td>student985</td><td>Mathematics</td><td>male</td><td>51</td><td>66</td><td>90</td><td>68</td></tr><tr><td>student986</td><td>Languages</td><td>female</td><td>100</td><td>95</td><td>65</td><td>91</td></tr><tr><td>student987</td><td>Mathematics</td><td>male</td><td>6</td><td>74</td><td>24</td><td>24</td></tr><tr><td>student988</td><td>Languages</td><td>female</td><td>93</td><td>80</td><td>94</td><td>35</td></tr><tr><td>student989</td><td>Mathematics</td><td>male</td><td>65</td><td>78</td><td>57</td><td>94</td></tr><tr><td>student990</td><td>Languages</td><td>female</td><td>27</td><td>92</td><td>21</td><td>91</td></tr><tr><td>student991</td><td>Mathematics</td><td>male</td><td>77</td><td>15</td><td>26</td><td>76</td></tr><tr><td>student992</td><td>Languages</td><td>female</td><td>28</td><td>84</td><td>51</td><td>67</td></tr><tr><td>student993</td><td>Mathematics</td><td>male</td><td>3</td><td>78</td><td>62</td><td>50</td></tr><tr><td>student994</td><td>Languages</td><td>female</td><td>59</td><td>77</td><td>20</td><td>74</td></tr><tr><td>student995</td><td>Mathematics</td><td>male</td><td>62</td><td>66</td><td>8</td><td>75</td></tr><tr><td>student996</td><td>Languages</td><td>female</td><td>88</td><td>70</td><td>33</td><td>43</td></tr><tr><td>student997</td><td>Mathematics</td><td>male</td><td>73</td><td>33</td><td>42</td><td>53</td></tr><tr><td>student998</td><td>Languages</td><td>female</td><td>64</td><td>10</td><td>2</td><td>31</td></tr><tr><td>student999</td><td>Mathematics</td><td>male</td><td>91</td><td>93</td><td>16</td><td>35</td></tr><tr><td>student1000</td><td>Languages</td><td>female</td><td>30</td><td>68</td><td>95</td><td>40</td></tr><tr><td>student1001</td><td>Mathematics</td><td>male</td><td>25</td><td>2</td><td>48</td><td>32</td></tr><tr><td>student1002</td><td>Languages</td><td>female</td><td>50</td><td>77</td><td>53</td><td>81</td></tr><tr><td>student1003</td><td>Mathematics</td><td>male</td><td>67</td><td>44</td><td>10</td><td>65</td></tr><tr><td>student1004</td><td>Languages</td><td>female</td><td>29</td><td>53</td><td>34</td><td>86</td></tr><tr><td>student1005</td><td>Mathematics</td><td>male</td><td>77</td><td>69</td><td>22</td><td>75</td></tr><tr><td>student1006</td><td>Languages</td><td>female</td><td>48</td><td>82</td><td>95</td><td>40</td></tr><tr><td>student1007</td><td>Mathematics</td><td>male</td><td>30</td><td>71</td><td>29</td><td>63</td></tr><tr><td>student1008</td><td>Languages</td><td>female</td><td>45</td><td>31</td><td>4</td><td>71</td></tr><tr><td>student1009</td><td>Mathematics</td><td>male</td><td>81</td><td>12</td><td>20</td><td>44</td></tr><tr><td>student1010</td><td>Languages</td><td>female</td><td>17</td><td>66</td><td>82</td><td>42</td></tr><tr><td>student1011</td><td>Mathematics</td><td>male</td><td>15</td><td>11</td><td>32</td><td>18</td></tr><tr><td>student1012</td><td>Languages</td><td>female</td><td>27</td><td>34</td><td>59</td><td>19</td></tr><tr><td>student1013</td><td>Mathematics</td><td>male</td><td>18</td><td>67</td><td>25</td><td>14</td></tr><tr><td>student1014</td><td>Languages</td><td>female</td><td>24</td><td>64</td><td>52</td><td>24</td></tr><tr><td>student1015</td><td>Mathematics</td><td>male</td><td>36</td><td>87</td><td>48</td><td>46</td></tr><tr><td>student1016</td><td>Languages</td><td>female</td><td>33</td><td>1</td><td>70</td><td>68</td></tr><tr><td>student1017</td><td>Mathematics</td><td>male</td><td>48</td><td>26</td><td>3</td><td>80</td></tr><tr><td>student1018</td><td>Languages</td><td>female</td><td>53</td><td>63</td><td>85</td><td>57</td></tr><tr><td>student1019</td><td>Mathematics</td><td>male</td><td>58</td><td>73</td><td>0</td><td>24</td></tr><tr><td>student1020</td><td>Languages</td><td>female</td><td>85</td><td>90</td><td>81</td><td>0</td></tr><tr><td>student1021</td><td>Mathematics</td><td>male</td><td>69</td><td>28</td><td>52</td><td>76</td></tr><tr><td>student1022</td><td>Languages</td><td>female</td><td>75</td><td>22</td><td>7</td><td>52</td></tr></tbody> + +</table> +<div id="pager" class="pager"> + <form> + <img src="../addons/pager/icons/first.png" class="first"/> + <img src="../addons/pager/icons/prev.png" class="prev"/> + <input type="text" class="pagedisplay"/> + <img src="../addons/pager/icons/next.png" class="next"/> + <img src="../addons/pager/icons/last.png" class="last"/> + <select class="pagesize"> + <option selected="selected" value="10">10</option> + <option value="20">20</option> + <option value="30">30</option> + <option value="40">40</option> + </select> + </form> +</div> +</body> + +</html> + diff --git a/fannie/src/jquery/themes/blue/asc.gif b/fannie/src/jquery/themes/blue/asc.gif new file mode 100644 index 000000000..74157867f Binary files /dev/null and b/fannie/src/jquery/themes/blue/asc.gif differ diff --git a/fannie/src/jquery/themes/blue/bg.gif b/fannie/src/jquery/themes/blue/bg.gif new file mode 100644 index 000000000..fac668fcf Binary files /dev/null and b/fannie/src/jquery/themes/blue/bg.gif differ diff --git a/fannie/src/jquery/themes/blue/blue.zip b/fannie/src/jquery/themes/blue/blue.zip new file mode 100644 index 000000000..9945a92aa Binary files /dev/null and b/fannie/src/jquery/themes/blue/blue.zip differ diff --git a/fannie/src/jquery/themes/blue/desc.gif b/fannie/src/jquery/themes/blue/desc.gif new file mode 100644 index 000000000..3b30b3c58 Binary files /dev/null and b/fannie/src/jquery/themes/blue/desc.gif differ diff --git a/fannie/src/jquery/themes/blue/style.css b/fannie/src/jquery/themes/blue/style.css new file mode 100644 index 000000000..d65ee3dc3 --- /dev/null +++ b/fannie/src/jquery/themes/blue/style.css @@ -0,0 +1,43 @@ +@media screen { + +/* tables */ +table.tablesorter { + font-family:arial; + background-color: #CDCDCD; + margin:10px 0pt 15px; + font-size: 8pt; + width: 100%; + text-align: left; +} +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #e6EEEE; + border: 1px solid #FFF; + font-size: 8pt; + padding: 4px; +} +table.tablesorter thead tr .header { + background-image: url(bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + vertical-align: top; +} +table.tablesorter tbody tr.odd td { + background-color:#F0F0F6; +} +table.tablesorter thead tr .headerSortUp { + background-image: url(asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { +background-color: #8dbdd8; +} + +} diff --git a/fannie/src/jquery/themes/green/asc.png b/fannie/src/jquery/themes/green/asc.png new file mode 100644 index 000000000..66e39cad0 Binary files /dev/null and b/fannie/src/jquery/themes/green/asc.png differ diff --git a/fannie/src/jquery/themes/green/bg.png b/fannie/src/jquery/themes/green/bg.png new file mode 100644 index 000000000..ca8371613 Binary files /dev/null and b/fannie/src/jquery/themes/green/bg.png differ diff --git a/fannie/src/jquery/themes/green/desc.png b/fannie/src/jquery/themes/green/desc.png new file mode 100644 index 000000000..431f63abd Binary files /dev/null and b/fannie/src/jquery/themes/green/desc.png differ diff --git a/fannie/src/jquery/themes/green/green.zip b/fannie/src/jquery/themes/green/green.zip new file mode 100644 index 000000000..6a14d240a Binary files /dev/null and b/fannie/src/jquery/themes/green/green.zip differ diff --git a/fannie/src/jquery/themes/green/style.css b/fannie/src/jquery/themes/green/style.css new file mode 100644 index 000000000..4a545898a --- /dev/null +++ b/fannie/src/jquery/themes/green/style.css @@ -0,0 +1,39 @@ +table.tablesorter { + font-size: 12px; + background-color: #4D4D4D; + width: 1024px; + border: 1px solid #000; +} +table.tablesorter th { + text-align: left; + padding: 5px; + background-color: #6E6E6E; +} +table.tablesorter td { + color: #FFF; + padding: 5px; +} +table.tablesorter .even { + background-color: #3D3D3D; +} +table.tablesorter .odd { + background-color: #6E6E6E; +} +table.tablesorter .header { + background-image: url(bg.png); + background-repeat: no-repeat; + border-left: 1px solid #FFF; + border-right: 1px solid #000; + border-top: 1px solid #FFF; + padding-left: 30px; + padding-top: 8px; + height: auto; +} +table.tablesorter .headerSortUp { + background-image: url(asc.png); + background-repeat: no-repeat; +} +table.tablesorter .headerSortDown { + background-image: url(desc.png); + background-repeat: no-repeat; +} \ No newline at end of file diff --git a/fannie/src/mk_trans_archive.php b/fannie/src/mk_trans_archive.php new file mode 100644 index 000000000..5bbc836b1 --- /dev/null +++ b/fannie/src/mk_trans_archive.php @@ -0,0 +1,348 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function mk_trans_archive_table($month,$year,$db,$redo=False){ + global $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_REMOTE, + $FANNIE_ARCHIVE_DBMS, $FANNIE_ARCHIVE_DB;; + + $trans_columns = "( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(255) default NULL, + `description` varchar(255) default NULL, + `trans_type` varchar(255) default NULL, + `trans_subtype` varchar(255) default NULL, + `trans_status` varchar(255) default NULL, + `department` smallint(6) default NULL, + `quantity` double default NULL, + `scale` tinyint(4) default NULL, + `cost` double default 0.00 NULL, + `unitPrice` double default NULL, + `total` double default NULL, + `regPrice` double default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` double default NULL, + `memDiscount` double default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` double default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` double default NULL, + `mixMatch` varchar(13) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` smallint(6) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` varchar(255) default NULL, + `trans_id` int(11) default NULL + )"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $trans_columns = "([datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [cost] [money] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [staff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL )"; + } + + $month = str_pad($month,2,'0',STR_PAD_LEFT); + if (strlen($year) == 2) $year = "20".$year; + elseif(strlen($year) != 4) + $year = "20".substr($year,-2); + $name = "transArchive".$year.$month; + + $q = "CREATE TABLE $name $trans_columns"; + + $exists = $db->table_exists($name); + $p = $dbc->prepare_statement($q,$FANNIE_ARCHIVE_DB); + if (!$exists){ + $db->exec_statement($p,array(),$FANNIE_ARCHIVE_DB); + echo "Created archive table for $month / $year<br />"; + } + else if ($exists && $redo){ + $drop = $db->prepare_statement("DROP TABLE $name",$FANNIE_ARCHIVE_DB); + $db->exec_statement($drop,array(),$FANNIE_ARCHIVE_DB); + $db->exec_statement($p,array(),$FANNIE_ARCHIVE_DB); + echo "Re-created archive table for $month / $year<br />"; + } + else { + echo "Skipping existing table for $month / $year<br />"; + } +} + +function mk_trans_archive_views($month,$year,$db){ + global $FANNIE_SERVER_DBMS, $FANNIE_ARCHIVE_DB; + + $month = (int)$month; + $year = (int)$year; + + $month = str_pad($month,2,'0',STR_PAD_LEFT); + if (strlen($year) == 2) $year = "20".$year; + elseif(strlen($year) != 4) + $year = "20".substr($year,-2); + + /* dlog view only requires slight tweak for My/MS SQL + receipt views are more divergent thus listed completely + separate */ + $dlogQ = "CREATE view dlog$year$month as + select + d.datetime as tdate, + d.register_no, + d.emp_no, + d.trans_no, + d.upc, + CASE WHEN (d.trans_subtype IN ('CP','IC') OR d.upc like('%000000052')) then 'T' + WHEN d.upc = 'DISCOUNT' then 'S' else d.trans_type end as trans_type, + CASE WHEN d.upc = 'MAD Coupon' THEN 'MA' ELSe + case when d.upc like('%00000000052') then 'RR' else d.trans_subtype end end as trans_subtype, + d.trans_status, + d.department, + d.quantity, + d.unitPrice, + d.total, + d.tax, + d.foodstamp, + d.itemQtty, + d.memType, + d.staff, + d.card_no, + d.trans_id,"; + if (strstr($FANNIE_SERVER_DBMS,"MYSQL")){ + $dlogQ .= "concat(convert(d.emp_no,char), '-', convert(d.register_no,char), '-', + convert(d.trans_no,char)) as trans_num"; + } + else { + $dlogQ .= "(convert(varchar,d.emp_no) + '-' + convert(varchar,d.register_no) + '-' + + convert(varchar,d.trans_no)) as trans_num"; + } + $dlogQ .= " from transArchive$year$month as d + where d.trans_status not in ('D','X','Z') and d.emp_no not in (9999,56) and d.register_no <> 99"; + + $rp1Q = "CREATE view rp_dt_receipt_$year$month as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char), ' @ ', convert(Volume,char), ' /', convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char), ' /', convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char), ' @ ', convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num + + from transArchive$year$month + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $rp1Q = "CREATE view rp_dt_receipt_$year$month as + select + datetime, + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax <> 0 and foodstamp <> 0 + then 'TF' + when tax <> 0 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + card_no as memberID, + unitPrice, + voided, + trans_id, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num + from transArchive$year$month + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT'"; + } + + + $rp2Q = "create view rp_receipt_header_$year$month as + select + datetime as dateTimeStamp, + card_no as memberID, + concat(convert(emp_no,char), '-', convert(register_no,char), '-', convert(trans_no,char)) as trans_num, + register_no, + emp_no, + trans_no, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discounttype = 2 then memDiscount else 0 end),decimal(10,2)) as memSpecial, + convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, + convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + from transArchive$year$month + group by register_no, emp_no, trans_no, card_no, datetime"; + + if ($FANNIE_SERVER_DBMS == 'MSSQL'){ + $rp2Q = "create view rp_receipt_header_$year$month as + select + datetime as dateTimeStamp, + card_no as memberID, + (convert(varchar,emp_no) + '-' + convert(varchar,register_no) + '-' + convert(varchar,trans_no)) as trans_num, + register_no, + emp_no, + trans_no, + convert(numeric(10,2), sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2), sum(case when discounttype = 2 then memDiscount else 0 end)) as memSpecial, + convert(numeric(10,2), sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, + convert(numeric(10,2), sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + from transArchive$year$month + group by register_no, emp_no, trans_no, card_no, datetime"; + } + + if ($db->table_exists("dlog".$year.$month,$FANNIE_ARCHIVE_DB)){ + $drop = $db->prepare_statement("DROP VIEW dlog$year$month", $FANNIE_ARCHIVE_DB); + $db->exec_statement($drop,array(),$FANNIE_ARCHIVE_DB); + } + $dlogP = $db->prepare_statement($dlogQ,$FANNIE_ARCHIVE_DB); + $db->exec_statement($dlogP,array(),$FANNIE_ARCHIVE_DB); + if ($db->table_exists("rp_dt_receipt_".$year.$month,$FANNIE_ARCHIVE_DB)){ + $drop = $db->prepare_statement("DROP VIEW rp_dt_receipt_$year$month",$FANNIE_ARCHIVE_DB); + $db->exec_statement($drop,array(),$FANNIE_ARCHIVE_DB); + } + $rp1P = $db->prepare_statement($rp1Q,$FANNIE_ARCHIVE_DB); + $db->exec_statement($rp1P,array(),$FANNIE_ARCHIVE_DB); + if ($db->table_exists("rp_receipt_header_".$year.$month,$FANNIE_ARCHIVE_DB)){ + $drop = $db->prepare_statement("DROP VIEW rp_receipt_header_$year$month",$FANNIE_ARCHIVE_DB); + $db->exec_statement($drop,array(),$FANNIE_ARCHIVE_DB); + } + $rp2P = $db->prepare_statement($rp2Q,$FANNIE_ARCHIVE_DB); + $db->exec_statement($rp2P,array(),$FANNIE_ARCHIVE_DB); + + echo "Created views for $month / $year <br />"; +} + + +?> diff --git a/fannie/src/mysql_connect.php b/fannie/src/mysql_connect.php new file mode 100644 index 000000000..991d4b4e7 --- /dev/null +++ b/fannie/src/mysql_connect.php @@ -0,0 +1,35 @@ +<?php # Script 8.1 - mysql_connect.php (Second version after 7.2) + +// This file contains the database access information. +// This file also establishes a connection to MySQL and selects the database. + +/* try to deal with relative paths for includes */ +$path = ""; +$found = False; +$uri = $_SERVER['REQUEST_URI']; +$tmp = explode("?",$uri); +if (is_array($tmp) && count($tmp) > 1) + $uri = $tmp[0]; +foreach(explode("/",$uri) as $x){ + if (strpos($x,".php") === False + && strlen($x) != 0){ + $path .= "../"; + } + if (!$found && stripos($x,"fannie") !== False){ + $found = True; + $path = ""; + } +} + +if (!isset($FANNIE_SERVER)) + include($path.'config.php'); + +if (!class_exists("SQLManager")) + include($path.'src/SQLManager.php'); + +// Make the connection. +$dbc = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); +setlocale(LC_MONETARY, 'en_US'); + +?> diff --git a/fannie/src/navbar.dynamic.php b/fannie/src/navbar.dynamic.php new file mode 100644 index 000000000..ca69ada2a --- /dev/null +++ b/fannie/src/navbar.dynamic.php @@ -0,0 +1,63 @@ +<!-- --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 5Feb13 AT Build menu via config.php + 18Jan13 EL Add Synchronize > ProductUser. Not WEFC_Toronto-specific. + 3Jan13 EL Add Sales > General Costs. Not WEFC_Toronto-specific. + 10Oct12 EL Add memberCards to Sync flyout +. Add Section for WEFC Toronto utilities. + 4Sep12 EL Access to the item/import utilities: +. Add Import Products item to submenu level0 +. Add Products item to submenu level1 +. Add Import Departments item to submenu level0 +. Add Departments and Sub Departments items to submenu level1 +. EL Add "Upload a File" item to submenu level1, Prods and Depts Import. + 10Aug12 Eric Lee Add Manage Batch Types to Sales Batches submenu0 +. Add "and Tool" to "Product List" +x Add Product List and Tool to Item Maint submenu0 +. Add submenu1 for Products to Item Maint submenu0 +. Add submenu1 for Departments to Item Maint submenu0 +--> + +<link rel="stylesheet" href="<?php echo $path; ?>src/style.css" type="text/css" media="screen" title="no title" charset="utf-8"> + +<div class="" style="width:140px;z-index:999999;position:relative;"> +<ul id="css_menu_root"> + +<?php +global $FANNIE_MENU; +if (!isset($FANNIE_MENU) || !is_array($FANNIE_MENU)) + include($path.'src/defaultmenu.php'); +function render_menu($arr,$depth=0){ + global $FANNIE_URL; + foreach($arr as $entry){ + if(strlen($entry['url']) != 0 && substr($entry['url'],0,1) != '/' + && !strstr($entry['url'],'://')){ + $entry['url'] = $FANNIE_URL.$entry['url']; + } + if ($depth == 0) + printf('<li style="width:100%%;" class="menu%d">',$depth); + else + echo '<li>'; + printf('<a href="%s">%s</a>',$entry['url'],$entry['label']); + if (isset($entry['submenu']) && is_array($entry['submenu']) && count($entry['submenu']) != 0){ + echo '<div class="menuwrapper">'; + printf('<div class="submenu level%d" style="width:155px;top:-28px;left:135px;">',$depth); + echo '<ul style="">'; + render_menu($entry['submenu'],$depth+1); + echo '</ul></div></div>'; + } + echo '</li>'; + if (isset($entry['subheading']) && $depth == 0){ + printf('<div class="sub">%s</div>',$entry['subheading']); + } + } +} +render_menu($FANNIE_MENU); +?> +</ul> +<!-- 10Aug12 EL Added --> +Click the headings for more/other options. +</div> + +<!-- *Note: This script is required for scripted add on support and IE 6 sub menu functionality. + *Note: This menu will fully function in all CSS2 browsers with the script removed.--> diff --git a/fannie/src/navbar.html b/fannie/src/navbar.html new file mode 100644 index 000000000..44ee236f6 --- /dev/null +++ b/fannie/src/navbar.html @@ -0,0 +1,270 @@ +<!-- - -COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 18Jan13 EL Add Synchronize > ProductUser. Not WEFC_Toronto-specific. + 3Jan13 EL Add Sales > General Costs. Not WEFC_Toronto-specific. + 10Oct12 EL Add memberCards to Sync flyout +. Add Section for WEFC Toronto utilities. + 4Sep12 EL Access to the item/import utilities: +. Add Import Products item to submenu level0 +. Add Products item to submenu level1 +. Add Import Departments item to submenu level0 +. Add Departments and Sub Departments items to submenu level1 +. EL Add "Upload a File" item to submenu level1, Prods and Depts Import. + 10Aug12 Eric Lee Add Manage Batch Types to Sales Batches submenu0 +. Add "and Tool" to "Product List" +x Add Product List and Tool to Item Maint submenu0 +. Add submenu1 for Products to Item Maint submenu0 +. Add submenu1 for Departments to Item Maint submenu0 +--> + +<div class="" style="width:140px;z-index:999999;position:relative;"> +<ul id="css_menu_root"> + +<li style="width:100%;" class="menu0"> + <a href="<?php echo $path; ?>item/ItemEditorPage.php">Item Maintenance</a> + <div class="menuwrapper"> + <div class="submenu level0" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + + <li><a href="<?php echo $path; ?>item/ItemEditorPage.php" title="item or brand">Manage Products &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:195px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>item/ItemEditorPage.php">By UPC/SKU or Brand prefix</a></li> + <li><a href="<?php echo $path; ?>item/ProductListPage.php" title="List and edit">Product List and Tool</a></li> + <li><a href="<?php echo $path; ?>item/ItemFlags.php" title="List and edit">Product Flags</a></li> + </ul> + </div> + </div></li> + + <li><a href="<?php echo $path; ?>item/import/">Import Products &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>item/import/ProductImportPage.php">Products</a></li> + <li><a href="<?php echo $path; ?>item/import/UploadAnyFile.php">Upload a file</a></li> + </ul> + </div> + </div> + </li> + + <li><a href="<?php echo $path; ?>item/departments/">Manage Departments &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>item/departments/SuperDeptEditor.php">Super Departments</a></li> + <li><a href="<?php echo $path; ?>item/departments/DepartmentEditor.php">Departments</a></li> + <li><a href="<?php echo $path; ?>item/departments/SubDeptEditor.php">Sub Departments</a></li> + </ul> + </div> + </div> + </li> + + <li><a href="<?php echo $path; ?>item/import/">Import Departments &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <!-- li><a href="<?php echo $path; ?>item/import/super.php">Super Departments</a></li --> + <li><a href="<?php echo $path; ?>item/import/DepartmentImportPage.php">Departments</a></li> + <li><a href="<?php echo $path; ?>item/import/SubdeptImportPage.php">Sub Departments</a></li> + <li><a href="<?php echo $path; ?>item/import/UploadAnyFile.php">Upload a file</a></li> + </ul> + </div> + </div> + </li> + + <li><a href="<?php echo $path; ?>item/likecodes/">Manage Likecodes</a></li> + <li><a href="<?php echo $path; ?>item/vendors/">Manage Vendors</a></li> + <li><a href="<?php echo $path; ?>modules/plugins2.0/HouseCoupon/HouseCoupon.php">Store Coupons</a></li> + </ul> + </div> + </div> +<div class="sub"> + Manage our product DB +</div> +</li> + +<li style="width:100%;" class="menu0"> + <a href="<?php echo $path; ?>batches/">Sales Batches</a> + <div class="menuwrapper"> + <div class="submenu level0" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>batches/newbatch.oo/">Sales Batches</a></li> + <li><a href="<?php echo $path; ?>batches/xlsbatch/">Upload Batch</a></li> + <li><a href="<?php echo $path; ?>batches/BatchTypeEditor.php">Manage Batch Types</a></li> + <li><a href="<?php echo $path; ?>batches/CAP/">Co+op Deals Sales</a></li> + <li><a href="<?php echo $path; ?>batches/UNFI/">Vendor Pricing</a></li> + </ul> + </div> + </div> +<div class="sub"> + Create automated sales &amp; price changes +</div> +</li> + +<li style="width:100%;" class="menu0"> + <a href="<?php echo $path; ?>reports/index.php" title="Click for notes on reports">Reports</a> + <div class="menuwrapper"> + <div class="submenu level0" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <li><a href=""><span class="imea imeam">Movement &gt;&gt;</span></a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>reports/DepartmentMovement">Department Movement</a></li> + <li><a href="<?php echo $path; ?>reports/ManufacturerMovement/">Manufacturer Movement</a></li> + <li><a href="<?php echo $path; ?>reports/ProductMovement/">Item Movement</a></li> + <li><a href="<?php echo $path; ?>reports/Correlated/">Correlated Movement</a></li> + <li><a href="<?php echo $path; ?>reports/NonMovement/">Non-Movement</a></li> + <li><a href="<?php echo $path; ?>reports/Trends/">Trends</a></li> + <li><a href="<?php echo $path; ?>reports/MonthOverMonth/">Monthly Movement</a></li> + <li><a href="<?php echo $path; ?>reports/MovementPrice/">Movement by Price</a></li> + </ul> + </div> + </div> + <li><a href="">Sales &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:155px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>reports/GeneralSales/">General Sales Report</a></li> + <li><a href="<?php echo $path; ?>reports/GeneralCosts/">General Costs Report</a></li> + <li><a href="<?php echo $path; ?>reports/SalesToday/">Today's Sales</a></li> + <li><a href="<?php echo $path; ?>reports/HourlySales/">Store Hourly Sales</a></li> + <li><a href="<?php echo $path; ?>reports/HourlySales/hourlySalesDept.php">Department Hourly Sales</a></li> + </ul> + </div> + </div> + <li><a href="<?php echo $path; ?>item/ProductListPage.php">Product List and Tool</a></li> + <li><a href="<?php echo $path; ?>reports/PriceHistory/">Price History Report</a></li> + <li><a href="<?php echo $path; ?>reports/DepartmentSettings/">Department Settings</a></li> + <li><a href="<?php echo $path; ?>reports/OpenRings/">Open Rings</a></li> + <li><a href="<?php echo $path; ?>reports/BatchReport/">Batches</a></li> + <li><a href="<?php echo $path; ?>reports/CustomerCount/">Customer Count</a></li> + </ul> + </div> + </div> +<div class="sub"> + Custom reporting tools +</div> +</li> + +<li style="width:100%;"><a href="<?php echo $path; ?>cron/management/">Dayend Polling</a> + <div class="menuwrapper"> + <div class="submenu level0" style="width:155px;top:-28;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>cron/management/" >Scheduled Tasks</a></li> + <li><a href="<?php echo $path; ?>logs/">View Logs</a></li> + </ul> + </div> + </div> +<div class="sub"> + Generate dayend sales report +</div> +</li> + +<li style="width:100%;"><a href="<?php echo $path; ?>sync/index.php">Synchronize</a> + <div class="menuwrapper"> + <div class="submenu level0" style="width:145px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=products">Products</a></li> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=productUser">ProductUser</a></li> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=custdata">Membership</a></li> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=memberCards">Member Cards</a></li> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=employees">Employees</a></li> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=departments">Departments</a></li> + <li><a href="<?php echo $path; ?>sync/TableSyncPage.php?tablename=subdepts">Sub-Departments</a></li> +<!-- <li><a href="<?php echo $path; ?>sync/reloadsubdepts.php">Sub-Departments</a></li> --> +<!-- <li><a href="<?php echo $path; ?>sync/reloadtenders.php">Tenders</a></li> --> + </ul> + </div> + </div> +<div class="sub"> + Update cash registers +</div> +</li> + +<li style="width:100%;"><a href="<?php echo $path; ?>admin/index.php">Admin</a> + <div class="menuwrapper"> + <div class="submenu level0" style="width:155px;top:-28;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>admin/Cashiers/">Cashier Management &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:195px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>admin/Cashiers/AddCashierPage.php">Add a new cashier</a></li> + <li><a href="<?php echo $path; ?>admin/Cashiers/ViewCashiersPage.php">View/edit cashiers</a></li> + <li><a href="<?php echo $path; ?>reports/cash_report/">Cashier performance report</a></li> + </ul> + </div><!-- /#submenu --> + </div><!-- /#menuwrapper --> + </li> + <li><a href="<?php echo $path; ?>mem/index.php">Member Management &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:195px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>mem/MemberSearchPage.php">View/Edit Members</a></li> + <li><a href="<?php echo $path; ?>mem/MemberTypeEditor.php">Manage Member Types</a></li> + <li><a href="<?php echo $path; ?>mem/NewMemberTool.php">View/Create New Members</a></li> + <li><a href="<?php echo $path; ?>mem/numbers/">Print Member Stickers</a></li> + <li><a href="<?php echo $path; ?>mem/import/">Import Member Information &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level2" style="width:155px;top:-28;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>mem/import/MemNameNumImportPage.php">Names &amp; Numbers</a></li> + <li><a href="<?php echo $path; ?>mem/import/MemContactImportPage.php">Contact Information</a></li> + <li><a href="<?php echo $path; ?>mem/import/EquityHistoryImportPage.php">Existing Equity</a></li> + </ul> + </div><!-- /#submenu --> + </div><!-- /#menuwrapper --> + </li> + </ul> + </div><!-- /#submenu --> + </div><!-- /#menuwrapper --> + </li> + <li><a href="<?php echo $path; ?>mem/statements/">E-mail Statements &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:195px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>mem/statements/indvAR.php">AR (Member)</a></li> + <li><a href="<?php echo $path; ?>mem/statements/busAR.php">AR (Business EOM)</a></li> + <li><a href="<?php echo $path; ?>mem/statements/busAR.php">AR (Business Any Balance)</a></li> + <li><a href="<?php echo $path; ?>mem/statements/equity.php">Equity</a></li> + <li><a href="<?php echo $path; ?>mem/statements/history.php">Sent E-mail History</a></li> + </ul> + </div><!-- /#submenu --> + </div><!-- /#menuwrapper --> + </li> + <li><a href="<?php echo $path; ?>admin/Tenders/">Tenders</a></li> + <li><a href="<?php echo $path; ?>ordering/">Special Orders &gt;&gt;</a> + <div class="menuwrapper"> + <div class="submenu level1" style="width:195px;top:-28px;left:135px;"> + <ul style=""> + <li><a href="<?php echo $path; ?>ordering/view.php">Create Order</a></li> + <li><a href="<?php echo $path; ?>ordering/clearinghouse.php">Review Active Orders</a></li> + <li><a href="<?php echo $path; ?>ordering/historical.php">Review Old Orders</a></li> + <li><a href="<?php echo $path; ?>ordering/receivingReport.php">Receiving Report</a></li> + <li><a href="<?php echo $path; ?>ordering/muzak.php">Muzak</a></li> + </ul> + </div><!-- /#submenu --> + </div><!-- /#menuwrapper --> + </li> + <!-- <li><a href="<?php echo $path; ?>admin/charges.php">Staff Charges</a></li> + <li><a href="<?php echo $path; ?>admin/volunteers.php">Volunteer Hours</a></li>--> + <li><a href="<?php echo $path; ?>admin/labels/">Print Shelftags</a></li> + <!-- <li><a href="<?php echo $path; ?>admin/patronage.php">Patronage Tool</a></li> --> + <li><a href="<?php echo $path; ?>admin/LookupReceipt/">Transaction Lookup</a></li> + </ul> + </div> + </div> +<div class="sub"> + Administrative functions, etc. +</div> +</li> + +</ul> +<!-- 10Aug12 EL Added --> +Click the headings for more/other options. +</div> + +<!-- *Note: This script is required for scripted add on support and IE 6 sub menu functionality. + *Note: This menu will fully function in all CSS2 browsers with the script removed.--> diff --git a/fannie/src/pear-stuff/OLE/ChainedBlockStream.php b/fannie/src/pear-stuff/OLE/ChainedBlockStream.php new file mode 100644 index 000000000..79122b7f5 --- /dev/null +++ b/fannie/src/pear-stuff/OLE/ChainedBlockStream.php @@ -0,0 +1,229 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * Stream wrapper for reading data stored in an OLE file. + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.0 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_0.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Structures + * @package OLE + * @author Christian Schmidt <schmidt@php.net> + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: ChainedBlockStream.php,v 1.1 2007/02/13 21:00:42 schmidt Exp $ + * @link http://pear.php.net/package/OLE + * @since File available since Release 0.6.0 + */ + +require_once 'PEAR.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/OLE/OLE.php'; + +/** + * Stream wrapper for reading data stored in an OLE file. Implements methods + * for PHP's stream_wrapper_register(). For creating streams using this + * wrapper, use OLE_PPS_File::getStream(). + * + * @category Structures + * @package OLE + * @author Christian Schmidt <schmidt@php.net> + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/OLE + * @since Class available since Release 0.6.0 + */ +class OLE_ChainedBlockStream extends PEAR +{ + /** + * The OLE container of the file that is being read. + * @var OLE + */ + var $ole; + + /** + * Parameters specified by fopen(). + * @var array + */ + var $params; + + /** + * The binary data of the file. + * @var string + */ + var $data; + + /** + * The file pointer. + * @var int byte offset + */ + var $pos; + + /** + * Implements support for fopen(). + * For creating streams using this wrapper, use OLE_PPS_File::getStream(). + * @param string resource name including scheme, e.g. + * ole-chainedblockstream://oleInstanceId=1 + * @param string only "r" is supported + * @param int mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH + * @param string absolute path of the opened stream (out parameter) + * @return bool true on success + */ + function stream_open($path, $mode, $options, &$openedPath) + { + if ($mode != 'r') { + if ($options & STREAM_REPORT_ERRORS) { + trigger_error('Only reading is supported', E_USER_WARNING); + } + return false; + } + + // 25 is length of "ole-chainedblockstream://" + parse_str(substr($path, 25), $this->params); + if (!isset($this->params['oleInstanceId'], + $this->params['blockId'], + $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) { + + if ($options & STREAM_REPORT_ERRORS) { + trigger_error('OLE stream not found', E_USER_WARNING); + } + return false; + } + $this->ole = $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']]; + + $blockId = $this->params['blockId']; + $this->data = ''; + if (isset($this->params['size']) && + $this->params['size'] < $this->ole->bigBlockThreshold && + $blockId != $this->ole->root->_StartBlock) { + + // Block id refers to small blocks + $rootPos = $this->ole->_getBlockOffset($this->ole->root->_StartBlock); + while ($blockId != -2) { + $pos = $rootPos + $blockId * $this->ole->bigBlockSize; + $blockId = $this->ole->sbat[$blockId]; + fseek($this->ole->_file_handle, $pos); + $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + } + } else { + // Block id refers to big blocks + while ($blockId != -2) { + $pos = $this->ole->_getBlockOffset($blockId); + fseek($this->ole->_file_handle, $pos); + $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + $blockId = $this->ole->bbat[$blockId]; + } + } + if (isset($this->params['size'])) { + $this->data = substr($this->data, 0, $this->params['size']); + } + + if ($options & STREAM_USE_PATH) { + $openedPath = $path; + } + + return true; + } + + /** + * Implements support for fclose(). + * @return string + */ + function stream_close() + { + $this->ole = null; + unset($GLOBALS['_OLE_INSTANCES']); + } + + /** + * Implements support for fread(), fgets() etc. + * @param int maximum number of bytes to read + * @return string + */ + function stream_read($count) + { + if ($this->stream_eof()) { + return false; + } + $s = substr($this->data, $this->pos, $count); + $this->pos += $count; + return $s; + } + + /** + * Implements support for feof(). + * @return bool TRUE if the file pointer is at EOF; otherwise FALSE + */ + function stream_eof() + { + $eof = $this->pos >= strlen($this->data); + // Workaround for bug in PHP 5.0.x: http://bugs.php.net/27508 + if (version_compare(PHP_VERSION, '5.0', '>=') && + version_compare(PHP_VERSION, '5.1', '<')) { + + $eof = !$eof; + } + return $eof; + } + + /** + * Returns the position of the file pointer, i.e. its offset into the file + * stream. Implements support for ftell(). + * @return int + */ + function stream_tell() + { + return $this->pos; + } + + /** + * Implements support for fseek(). + * @param int byte offset + * @param int SEEK_SET, SEEK_CUR or SEEK_END + * @return bool + */ + function stream_seek($offset, $whence) + { + if ($whence == SEEK_SET && $offset >= 0) { + $this->pos = $offset; + } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) { + $this->pos += $offset; + } elseif ($whence == SEEK_END && -$offset <= sizeof($this->data)) { + $this->pos = strlen($this->data) + $offset; + } else { + return false; + } + return true; + } + + /** + * Implements support for fstat(). Currently the only supported field is + * "size". + * @return array + */ + function stream_stat() + { + return array( + 'size' => strlen($this->data), + ); + } + + // Methods used by stream_wrapper_register() that are not implemented: + // bool stream_flush ( void ) + // int stream_write ( string data ) + // bool rename ( string path_from, string path_to ) + // bool mkdir ( string path, int mode, int options ) + // bool rmdir ( string path, int options ) + // bool dir_opendir ( string path, int options ) + // array url_stat ( string path, int flags ) + // string dir_readdir ( void ) + // bool dir_rewinddir ( void ) + // bool dir_closedir ( void ) +} + +?> diff --git a/fannie/src/pear-stuff/OLE/OLE.php b/fannie/src/pear-stuff/OLE/OLE.php new file mode 100644 index 000000000..841df3f45 --- /dev/null +++ b/fannie/src/pear-stuff/OLE/OLE.php @@ -0,0 +1,572 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: OLE.php,v 1.15 2007/12/18 20:59:11 schmidt Exp $ + + +/** +* Constants for OLE package +*/ +define('OLE_PPS_TYPE_ROOT', 5); +define('OLE_PPS_TYPE_DIR', 1); +define('OLE_PPS_TYPE_FILE', 2); +define('OLE_DATA_SIZE_SMALL', 0x1000); +define('OLE_LONG_INT_SIZE', 4); +define('OLE_PPS_SIZE', 0x80); + +require_once 'PEAR.php'; + +/** +* Array for storing OLE instances that are accessed from +* OLE_ChainedBlockStream::stream_open(). +* @var array +*/ +$GLOBALS['_OLE_INSTANCES'] = array(); + +/** +* OLE package base class. +* +* @category Structures +* @package OLE +* @author Xavier Noguer <xnoguer@php.net> +* @author Christian Schmidt <schmidt@php.net> +*/ +class OLE extends PEAR +{ + + /** + * The file handle for reading an OLE container + * @var resource + */ + var $_file_handle; + + /** + * Array of PPS's found on the OLE container + * @var array + */ + var $_list; + + /** + * Root directory of OLE container + * @var OLE_PPS_Root + */ + var $root; + + /** + * Big Block Allocation Table + * @var array (blockId => nextBlockId) + */ + var $bbat; + + /** + * Short Block Allocation Table + * @var array (blockId => nextBlockId) + */ + var $sbat; + + /** + * Size of big blocks. This is usually 512. + * @var int number of octets per block. + */ + var $bigBlockSize; + + /** + * Size of small blocks. This is usually 64. + * @var int number of octets per block + */ + var $smallBlockSize; + + /** + * Creates a new OLE object + * @access public + */ + function OLE() + { + $this->_list = array(); + } + + /** + * Destructor (using PEAR) + * Just closes the file handle on the OLE file. + * + * @access private + */ + function _OLE() + { + fclose($this->_file_handle); + } + + /** + * Reads an OLE container from the contents of the file given. + * + * @access public + * @param string $file + * @return mixed true on success, PEAR_Error on failure + */ + function read($file) + { + $fh = @fopen($file, "r"); + if (!$fh) { + return $this->raiseError("Can't open file $file"); + } + $this->_file_handle = $fh; + + $signature = fread($fh, 8); + if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { + return $this->raiseError("File doesn't seem to be an OLE container."); + } + fseek($fh, 28); + if (fread($fh, 2) != "\xFE\xFF") { + // This shouldn't be a problem in practice + return $this->raiseError("Only Little-Endian encoding is supported."); + } + // Size of blocks and short blocks in bytes + $this->bigBlockSize = pow(2, $this->_readInt2($fh)); + $this->smallBlockSize = pow(2, $this->_readInt2($fh)); + + // Skip UID, revision number and version number + fseek($fh, 44); + // Number of blocks in Big Block Allocation Table + $bbatBlockCount = $this->_readInt4($fh); + + // Root chain 1st block + $directoryFirstBlockId = $this->_readInt4($fh); + + // Skip unused bytes + fseek($fh, 56); + // Streams shorter than this are stored using small blocks + $this->bigBlockThreshold = $this->_readInt4($fh); + // Block id of first sector in Short Block Allocation Table + $sbatFirstBlockId = $this->_readInt4($fh); + // Number of blocks in Short Block Allocation Table + $sbbatBlockCount = $this->_readInt4($fh); + // Block id of first sector in Master Block Allocation Table + $mbatFirstBlockId = $this->_readInt4($fh); + // Number of blocks in Master Block Allocation Table + $mbbatBlockCount = $this->_readInt4($fh); + $this->bbat = array(); + + // Remaining 4 * 109 bytes of current block is beginning of Master + // Block Allocation Table + $mbatBlocks = array(); + for ($i = 0; $i < 109; $i++) { + $mbatBlocks[] = $this->_readInt4($fh); + } + + // Read rest of Master Block Allocation Table (if any is left) + $pos = $this->_getBlockOffset($mbatFirstBlockId); + for ($i = 0; $i < $mbbatBlockCount; $i++) { + fseek($fh, $pos); + for ($j = 0; $j < $this->bigBlockSize / 4 - 1; $j++) { + $mbatBlocks[] = $this->_readInt4($fh); + } + // Last block id in each block points to next block + $pos = $this->_getBlockOffset($this->_readInt4($fh)); + } + + // Read Big Block Allocation Table according to chain specified by + // $mbatBlocks + for ($i = 0; $i < $bbatBlockCount; $i++) { + $pos = $this->_getBlockOffset($mbatBlocks[$i]); + fseek($fh, $pos); + for ($j = 0 ; $j < $this->bigBlockSize / 4; $j++) { + $this->bbat[] = $this->_readInt4($fh); + } + } + + // Read short block allocation table (SBAT) + $this->sbat = array(); + $shortBlockCount = $sbbatBlockCount * $this->bigBlockSize / 4; + $sbatFh = $this->getStream($sbatFirstBlockId); + for ($blockId = 0; $blockId < $shortBlockCount; $blockId++) { + $this->sbat[$blockId] = $this->_readInt4($sbatFh); + } + fclose($sbatFh); + + $this->_readPpsWks($directoryFirstBlockId); + + return true; + } + + /** + * @param int $blockId block id + * @return int byte offset from beginning of file + * @access private + */ + function _getBlockOffset($blockId) + { + return 512 + $blockId * $this->bigBlockSize; + } + + /** + * Returns a stream for use with fread() etc. External callers should + * use OLE_PPS_File::getStream(). + * @param int|PPS $blockIdOrPps block id or PPS + * @return resource read-only stream + */ + function getStream($blockIdOrPps) + { + global $FANNIE_ROOT; + include_once $FANNIE_ROOT.'src/pear-stuff/OLE/ChainedBlockStream.php'; + static $isRegistered = false; + if (!$isRegistered) { + stream_wrapper_register('ole-chainedblockstream', + 'OLE_ChainedBlockStream'); + $isRegistered = true; + } + + // Store current instance in global array, so that it can be accessed + // in OLE_ChainedBlockStream::stream_open(). + // Object is removed from self::$instances in OLE_Stream::close(). + $GLOBALS['_OLE_INSTANCES'][] = $this; + $instanceId = end(array_keys($GLOBALS['_OLE_INSTANCES'])); + + $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId; + if (is_a($blockIdOrPps, 'OLE_PPS')) { + $path .= '&blockId=' . $blockIdOrPps->_StartBlock; + $path .= '&size=' . $blockIdOrPps->Size; + } else { + $path .= '&blockId=' . $blockIdOrPps; + } + return fopen($path, 'r'); + } + + /** + * Reads a signed char. + * @param resource $fh file handle + * @return int + * @access private + */ + function _readInt1($fh) + { + list(, $tmp) = unpack("c", fread($fh, 1)); + return $tmp; + } + + /** + * Reads an unsigned short (2 octets). + * @param resource $fh file handle + * @return int + * @access private + */ + function _readInt2($fh) + { + list(, $tmp) = unpack("v", fread($fh, 2)); + return $tmp; + } + + /** + * Reads an unsigned long (4 octets). + * @param resource file handle + * @return int + * @access private + */ + function _readInt4($fh) + { + list(, $tmp) = unpack("V", fread($fh, 4)); + return $tmp; + } + + /** + * Gets information about all PPS's on the OLE container from the PPS WK's + * creates an OLE_PPS object for each one. + * + * @access private + * @param integer $blockId the block id of the first block + * @return mixed true on success, PEAR_Error on failure + */ + function _readPpsWks($blockId) + { + global $FANNIE_ROOT; + $fh = $this->getStream($blockId); + for ($pos = 0; ; $pos += 128) { + fseek($fh, $pos, SEEK_SET); + $nameUtf16 = fread($fh, 64); + $nameLength = $this->_readInt2($fh); + $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2); + // Simple conversion from UTF-16LE to ISO-8859-1 + $name = str_replace("\x00", "", $nameUtf16); + $type = $this->_readInt1($fh); + switch ($type) { + case OLE_PPS_TYPE_ROOT: + require_once $FANNIE_ROOT.'src/pear-stuff/OLE/PPS/Root.php'; + $pps = new OLE_PPS_Root(null, null, array()); + $this->root = $pps; + break; + case OLE_PPS_TYPE_DIR: + $pps = new OLE_PPS(null, null, null, null, null, + null, null, null, null, array()); + break; + case OLE_PPS_TYPE_FILE: + require_once $FANNIE_ROOT.'src/pear-stuff/OLE/PPS/File.php'; + $pps = new OLE_PPS_File($name); + break; + default: + continue; + } + fseek($fh, 1, SEEK_CUR); + $pps->Type = $type; + $pps->Name = $name; + $pps->PrevPps = $this->_readInt4($fh); + $pps->NextPps = $this->_readInt4($fh); + $pps->DirPps = $this->_readInt4($fh); + fseek($fh, 20, SEEK_CUR); + $pps->Time1st = OLE::OLE2LocalDate(fread($fh, 8)); + $pps->Time2nd = OLE::OLE2LocalDate(fread($fh, 8)); + $pps->_StartBlock = $this->_readInt4($fh); + $pps->Size = $this->_readInt4($fh); + $pps->No = count($this->_list); + $this->_list[] = $pps; + + // check if the PPS tree (starting from root) is complete + if (isset($this->root) && + $this->_ppsTreeComplete($this->root->No)) { + + break; + } + } + fclose($fh); + + // Initialize $pps->children on directories + foreach ($this->_list as $pps) { + if ($pps->Type == OLE_PPS_TYPE_DIR || $pps->Type == OLE_PPS_TYPE_ROOT) { + $nos = array($pps->DirPps); + $pps->children = array(); + while ($nos) { + $no = array_pop($nos); + if ($no != -1) { + $childPps = $this->_list[$no]; + $nos[] = $childPps->PrevPps; + $nos[] = $childPps->NextPps; + $pps->children[] = $childPps; + } + } + } + } + + return true; + } + + /** + * It checks whether the PPS tree is complete (all PPS's read) + * starting with the given PPS (not necessarily root) + * + * @access private + * @param integer $index The index of the PPS from which we are checking + * @return boolean Whether the PPS tree for the given PPS is complete + */ + function _ppsTreeComplete($index) + { + return isset($this->_list[$index]) && + ($pps = $this->_list[$index]) && + ($pps->PrevPps == -1 || + $this->_ppsTreeComplete($pps->PrevPps)) && + ($pps->NextPps == -1 || + $this->_ppsTreeComplete($pps->NextPps)) && + ($pps->DirPps == -1 || + $this->_ppsTreeComplete($pps->DirPps)); + } + + /** + * Checks whether a PPS is a File PPS or not. + * If there is no PPS for the index given, it will return false. + * @param integer $index The index for the PPS + * @return bool true if it's a File PPS, false otherwise + * @access public + */ + function isFile($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == OLE_PPS_TYPE_FILE); + } + return false; + } + + /** + * Checks whether a PPS is a Root PPS or not. + * If there is no PPS for the index given, it will return false. + * @param integer $index The index for the PPS. + * @return bool true if it's a Root PPS, false otherwise + * @access public + */ + function isRoot($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == OLE_PPS_TYPE_ROOT); + } + return false; + } + + /** + * Gives the total number of PPS's found in the OLE container. + * @return integer The total number of PPS's found in the OLE container + * @access public + */ + function ppsTotal() + { + return count($this->_list); + } + + /** + * Gets data from a PPS + * If there is no PPS for the index given, it will return an empty string. + * @param integer $index The index for the PPS + * @param integer $position The position from which to start reading + * (relative to the PPS) + * @param integer $length The amount of bytes to read (at most) + * @return string The binary string containing the data requested + * @access public + * @see OLE_PPS_File::getStream() + */ + function getData($index, $position, $length) + { + // if position is not valid return empty string + if (!isset($this->_list[$index]) || + $position >= $this->_list[$index]->Size || + $position < 0) { + + return ''; + } + $fh = $this->getStream($this->_list[$index]); + $data = stream_get_contents($fh, $length, $position); + fclose($fh); + return $data; + } + + /** + * Gets the data length from a PPS + * If there is no PPS for the index given, it will return 0. + * @param integer $index The index for the PPS + * @return integer The amount of bytes in data the PPS has + * @access public + */ + function getDataLength($index) + { + if (isset($this->_list[$index])) { + return $this->_list[$index]->Size; + } + return 0; + } + + /** + * Utility function to transform ASCII text to Unicode + * + * @access public + * @static + * @param string $ascii The ASCII string to transform + * @return string The string in Unicode + */ + function Asc2Ucs($ascii) + { + $rawname = ''; + for ($i = 0; $i < strlen($ascii); $i++) { + $rawname .= $ascii{$i} . "\x00"; + } + return $rawname; + } + + /** + * Utility function + * Returns a string for the OLE container with the date given + * + * @access public + * @static + * @param integer $date A timestamp + * @return string The string for the OLE container + */ + function LocalDate2OLE($date = null) + { + if (!isset($date)) { + return "\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2, 32); + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + // calculate seconds + $big_date = $days * 24 * 3600 + + gmmktime(date("H",$date),date("i",$date),date("s",$date), + date("m",$date),date("d",$date),date("Y",$date)); + // multiply just to make MS happy + $big_date *= 10000000; + + $high_part = floor($big_date / $factor); + // lower 4 bytes + $low_part = floor((($big_date / $factor) - $high_part) * $factor); + + // Make HEX string + $res = ''; + + for ($i = 0; $i < 4; $i++) { + $hex = $low_part % 0x100; + $res .= pack('c', $hex); + $low_part /= 0x100; + } + for ($i = 0; $i < 4; $i++) { + $hex = $high_part % 0x100; + $res .= pack('c', $hex); + $high_part /= 0x100; + } + return $res; + } + + /** + * Returns a timestamp from an OLE container's date + * @param integer $string A binary string with the encoded date + * @return string The timestamp corresponding to the string + * @access public + * @static + */ + function OLE2LocalDate($string) + { + if (strlen($string) != 8) { + return new PEAR_Error("Expecting 8 byte string"); + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2,32); + $high_part = 0; + for ($i = 0; $i < 4; $i++) { + list(, $high_part) = unpack('C', $string{(7 - $i)}); + if ($i < 3) { + $high_part *= 0x100; + } + } + $low_part = 0; + for ($i = 4; $i < 8; $i++) { + list(, $low_part) = unpack('C', $string{(7 - $i)}); + if ($i < 7) { + $low_part *= 0x100; + } + } + $big_date = ($high_part * $factor) + $low_part; + // translate to seconds + $big_date /= 10000000; + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + + // translate to seconds from beggining of UNIX era + $big_date -= $days * 24 * 3600; + return floor($big_date); + } +} +?> diff --git a/fannie/src/pear-stuff/OLE/PPS.php b/fannie/src/pear-stuff/OLE/PPS.php new file mode 100644 index 000000000..6044c97b0 --- /dev/null +++ b/fannie/src/pear-stuff/OLE/PPS.php @@ -0,0 +1,222 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: PPS.php,v 1.7 2007/02/13 21:00:42 schmidt Exp $ + + +require_once 'PEAR.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/OLE/OLE.php'; + +/** +* Class for creating PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category Structures +* @package OLE +*/ +class OLE_PPS extends PEAR +{ + /** + * The PPS index + * @var integer + */ + var $No; + + /** + * The PPS name (in Unicode) + * @var string + */ + var $Name; + + /** + * The PPS type. Dir, Root or File + * @var integer + */ + var $Type; + + /** + * The index of the previous PPS + * @var integer + */ + var $PrevPps; + + /** + * The index of the next PPS + * @var integer + */ + var $NextPps; + + /** + * The index of it's first child if this is a Dir or Root PPS + * @var integer + */ + var $DirPps; + + /** + * A timestamp + * @var integer + */ + var $Time1st; + + /** + * A timestamp + * @var integer + */ + var $Time2nd; + + /** + * Starting block (small or big) for this PPS's data inside the container + * @var integer + */ + var $_StartBlock; + + /** + * The size of the PPS's data (in bytes) + * @var integer + */ + var $Size; + + /** + * The PPS's data (only used if it's not using a temporary file) + * @var string + */ + var $_data; + + /** + * Array of child PPS's (only used by Root and Dir PPS's) + * @var array + */ + var $children = array(); + + /** + * Pointer to OLE container + * @var OLE + */ + var $ole; + + /** + * The constructor + * + * @access public + * @param integer $No The PPS index + * @param string $name The PPS name + * @param integer $type The PPS type. Dir, Root or File + * @param integer $prev The index of the previous PPS + * @param integer $next The index of the next PPS + * @param integer $dir The index of it's first child if this is a Dir or Root PPS + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + * @param string $data The (usually binary) source data of the PPS + * @param array $children Array containing children PPS for this PPS + */ + function OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) + { + $this->No = $No; + $this->Name = $name; + $this->Type = $type; + $this->PrevPps = $prev; + $this->NextPps = $next; + $this->DirPps = $dir; + $this->Time1st = $time_1st; + $this->Time2nd = $time_2nd; + $this->_data = $data; + $this->children = $children; + if ($data != '') { + $this->Size = strlen($data); + } else { + $this->Size = 0; + } + } + + /** + * Returns the amount of data saved for this PPS + * + * @access private + * @return integer The amount of data (in bytes) + */ + function _DataLen() + { + if (!isset($this->_data)) { + return 0; + } + if (isset($this->_PPS_FILE)) { + fseek($this->_PPS_FILE, 0); + $stats = fstat($this->_PPS_FILE); + return $stats[7]; + } else { + return strlen($this->_data); + } + } + + /** + * Returns a string with the PPS's WK (What is a WK?) + * + * @access private + * @return string The binary string + */ + function _getPpsWk() + { + $ret = $this->Name; + for ($i = 0; $i < (64 - strlen($this->Name)); $i++) { + $ret .= "\x00"; + } + $ret .= pack("v", strlen($this->Name) + 2) // 66 + . pack("c", $this->Type) // 67 + . pack("c", 0x00) //UK // 68 + . pack("V", $this->PrevPps) //Prev // 72 + . pack("V", $this->NextPps) //Next // 76 + . pack("V", $this->DirPps) //Dir // 80 + . "\x00\x09\x02\x00" // 84 + . "\x00\x00\x00\x00" // 88 + . "\xc0\x00\x00\x00" // 92 + . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root + . "\x00\x00\x00\x00" // 100 + . OLE::LocalDate2OLE($this->Time1st) // 108 + . OLE::LocalDate2OLE($this->Time2nd) // 116 + . pack("V", isset($this->_StartBlock)? + $this->_StartBlock:0) // 120 + . pack("V", $this->Size) // 124 + . pack("V", 0); // 128 + return $ret; + } + + /** + * Updates index and pointers to previous, next and children PPS's for this + * PPS. I don't think it'll work with Dir PPS's. + * + * @access private + * @param array &$pps_array Reference to the array of PPS's for the whole OLE + * container + * @return integer The index for this PPS + */ + function _savePpsSetPnt(&$pps_array) + { + $pps_array[count($pps_array)] = &$this; + $this->No = count($pps_array) - 1; + $this->PrevPps = 0xFFFFFFFF; + $this->NextPps = 0xFFFFFFFF; + if (count($this->children) > 0) { + $this->DirPps = $this->children[0]->_savePpsSetPnt($pps_array); + } else { + $this->DirPps = 0xFFFFFFFF; + } + return $this->No; + } +} +?> diff --git a/fannie/src/pear-stuff/OLE/PPS/File.php b/fannie/src/pear-stuff/OLE/PPS/File.php new file mode 100644 index 000000000..4d58b40ac --- /dev/null +++ b/fannie/src/pear-stuff/OLE/PPS/File.php @@ -0,0 +1,125 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: File.php,v 1.12 2008/02/02 21:00:37 schmidt Exp $ + + +require_once $FANNIE_ROOT.'src/pear-stuff/OLE/PPS.php'; +require_once 'System.php'; + +/** +* Class for creating File PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category Structures +* @package OLE +*/ +class OLE_PPS_File extends OLE_PPS +{ + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * The constructor + * + * @access public + * @param string $name The name of the file (in Unicode) + * @see OLE::Asc2Ucs() + */ + function OLE_PPS_File($name) + { + $this->_tmp_dir = System::tmpdir(); + $this->OLE_PPS( + null, + $name, + OLE_PPS_TYPE_FILE, + null, + null, + null, + null, + null, + '', + array()); + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Initialization method. Has to be called right after OLE_PPS_File(). + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function init() + { + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_File"); + $fh = @fopen($this->_tmp_filename, "w+b"); + if ($fh == false) { + return $this->raiseError("Can't create temporary file"); + } + $this->_PPS_FILE = $fh; + if ($this->_PPS_FILE) { + fseek($this->_PPS_FILE, 0); + } + + return true; + } + + /** + * Append data to PPS + * + * @access public + * @param string $data The data to append + */ + function append($data) + { + if ($this->_PPS_FILE) { + fwrite($this->_PPS_FILE, $data); + } else { + $this->_data .= $data; + } + } + + /** + * Returns a stream for reading this file using fread() etc. + * @return resource a read-only stream + */ + function getStream() + { + $this->ole->getStream($this); + } +} +?> diff --git a/fannie/src/pear-stuff/OLE/PPS/Root.php b/fannie/src/pear-stuff/OLE/PPS/Root.php new file mode 100644 index 000000000..a1117e38e --- /dev/null +++ b/fannie/src/pear-stuff/OLE/PPS/Root.php @@ -0,0 +1,486 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: Root.php,v 1.10 2008/02/02 21:00:37 schmidt Exp $ + + +require_once $FANNIE_ROOT.'src/pear-stuff/OLE/PPS.php'; +require_once 'System.php'; + +/** +* Class for creating Root PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category Structures +* @package OLE +*/ +class OLE_PPS_Root extends OLE_PPS +{ + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * Constructor + * + * @access public + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + */ + function OLE_PPS_Root($time_1st, $time_2nd, $raChild) + { + $this->_tmp_dir = System::tmpdir(); + $this->OLE_PPS( + null, + OLE::Asc2Ucs('Root Entry'), + OLE_PPS_TYPE_ROOT, + null, + null, + null, + $time_1st, + $time_2nd, + null, + $raChild); + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Method for saving the whole OLE container (including files). + * In fact, if called with an empty argument (or '-'), it saves to a + * temporary file and then outputs it's contents to stdout. + * + * @param string $filename The name of the file where to save the OLE container + * @access public + * @return mixed true on success, PEAR_Error on failure + */ + function save($filename) + { + // Initial Setting for saving + $this->_BIG_BLOCK_SIZE = pow(2, + ((isset($this->_BIG_BLOCK_SIZE))? $this->_adjust2($this->_BIG_BLOCK_SIZE) : 9)); + $this->_SMALL_BLOCK_SIZE= pow(2, + ((isset($this->_SMALL_BLOCK_SIZE))? $this->_adjust2($this->_SMALL_BLOCK_SIZE): 6)); + + // Open temp file if we are sending output to stdout + if (($filename == '-') || ($filename == '')) { + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_Root"); + $this->_FILEH_ = @fopen($this->_tmp_filename,"w+b"); + if ($this->_FILEH_ == false) { + return $this->raiseError("Can't create temporary file."); + } + } else { + $this->_FILEH_ = @fopen($filename, "wb"); + if ($this->_FILEH_ == false) { + return $this->raiseError("Can't open $filename. It may be in use or protected."); + } + } + // Make an array of PPS's (for Save) + $aList = array(); + $this->_savePpsSetPnt($aList); + // calculate values for header + list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo); + // Save Header + $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); + + // Make Small Data string (write SBD) + $this->_data = $this->_makeSmallData($aList); + + // Write BB + $this->_saveBigData($iSBDcnt, $aList); + // Write PPS + $this->_savePps($aList); + // Write Big Block Depot and BDList and Adding Header informations + $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); + // Close File, send it to stdout if necessary + if (($filename == '-') || ($filename == '')) { + fseek($this->_FILEH_, 0); + fpassthru($this->_FILEH_); + @fclose($this->_FILEH_); + // Delete the temporary file. + @unlink($this->_tmp_filename); + } else { + @fclose($this->_FILEH_); + } + + return true; + } + + /** + * Calculate some numbers + * + * @access private + * @param array $raList Reference to an array of PPS's + * @return array The array of numbers + */ + function _calcSize(&$raList) + { + // Calculate Basic Setting + list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0); + $iSmallLen = 0; + $iSBcnt = 0; + for ($i = 0; $i < count($raList); $i++) { + if ($raList[$i]->Type == OLE_PPS_TYPE_FILE) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if ($raList[$i]->Size < OLE_DATA_SIZE_SMALL) { + $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + } else { + $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + } + } + $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE; + $iSlCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); + $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0); + $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) + + (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0)); + $iCnt = count($raList); + $iBdCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; + $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0)); + + return array($iSBDcnt, $iBBcnt, $iPPScnt); + } + + /** + * Helper function for caculating a magic value for block sizes + * + * @access private + * @param integer $i2 The argument + * @see save() + * @return integer + */ + function _adjust2($i2) + { + $iWk = log($i2)/log(2); + return ($iWk > floor($iWk))? floor($iWk)+1:$iWk; + } + + /** + * Save OLE header + * + * @access private + * @param integer $iSBDcnt + * @param integer $iBBcnt + * @param integer $iPPScnt + */ + function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt) + { + $FILE = $this->_FILEH_; + + // Calculate Basic Setting + $iBlCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + + // Calculate BD count + if ($iBdCnt > $i1stBdL) { + while (1) { + $iBdExL++; + $iAllW++; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) { + break; + } + } + } + + // Save Header + fwrite($FILE, + "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("v", 0x3b) + . pack("v", 0x03) + . pack("v", -2) + . pack("v", 9) + . pack("v", 6) + . pack("v", 0) + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("V", $iBdCnt) + . pack("V", $iBBcnt+$iSBDcnt) //ROOT START + . pack("V", 0) + . pack("V", 0x1000) + . pack("V", 0) //Small Block Depot + . pack("V", 1) + ); + // Extra BDList Start, Count + if ($iBdCnt < $i1stBdL) { + fwrite($FILE, + pack("V", -2). // Extra BDList Start + pack("V", 0) // Extra BDList Count + ); + } else { + fwrite($FILE, pack("V", $iAll+$iBdCnt) . pack("V", $iBdExL)); + } + + // BDList + for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; $i++) { + fwrite($FILE, pack("V", $iAll+$i)); + } + if ($i < $i1stBdL) { + for ($j = 0; $j < ($i1stBdL-$i); $j++) { + fwrite($FILE, (pack("V", -1))); + } + } + } + + /** + * Saving big data (PPS's with data bigger than OLE_DATA_SIZE_SMALL) + * + * @access private + * @param integer $iStBlk + * @param array &$raList Reference to array of PPS's + */ + function _saveBigData($iStBlk, &$raList) + { + $FILE = $this->_FILEH_; + + // cycle through PPS's + for ($i = 0; $i < count($raList); $i++) { + if ($raList[$i]->Type != OLE_PPS_TYPE_DIR) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if (($raList[$i]->Size >= OLE_DATA_SIZE_SMALL) || + (($raList[$i]->Type == OLE_PPS_TYPE_ROOT) && isset($raList[$i]->_data))) + { + // Write Data + if (isset($raList[$i]->_PPS_FILE)) { + $iLen = 0; + fseek($raList[$i]->_PPS_FILE, 0); // To The Top + while($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + $iLen += strlen($sBuff); + fwrite($FILE, $sBuff); + } + } else { + fwrite($FILE, $raList[$i]->_data); + } + + if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) { + for ($j = 0; $j < ($this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)); $j++) { + fwrite($FILE, "\x00"); + } + } + // Set For PPS + $raList[$i]->_StartBlock = $iStBlk; + $iStBlk += + (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + // Close file for each PPS, and unlink it + if (isset($raList[$i]->_PPS_FILE)) { + @fclose($raList[$i]->_PPS_FILE); + $raList[$i]->_PPS_FILE = null; + @unlink($raList[$i]->_tmp_filename); + } + } + } + } + + /** + * get small data (PPS's with data smaller than OLE_DATA_SIZE_SMALL) + * + * @access private + * @param array &$raList Reference to array of PPS's + */ + function _makeSmallData(&$raList) + { + $sRes = ''; + $FILE = $this->_FILEH_; + $iSmBlk = 0; + + for ($i = 0; $i < count($raList); $i++) { + // Make SBD, small data string + if ($raList[$i]->Type == OLE_PPS_TYPE_FILE) { + if ($raList[$i]->Size <= 0) { + continue; + } + if ($raList[$i]->Size < OLE_DATA_SIZE_SMALL) { + $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + // Add to SBD + for ($j = 0; $j < ($iSmbCnt-1); $j++) { + fwrite($FILE, pack("V", $j+$iSmBlk+1)); + } + fwrite($FILE, pack("V", -2)); + + // Add to Data String(this will be written for RootEntry) + if ($raList[$i]->_PPS_FILE) { + fseek($raList[$i]->_PPS_FILE, 0); // To The Top + while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + $sRes .= $sBuff; + } + } else { + $sRes .= $raList[$i]->_data; + } + if ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) { + for ($j = 0; $j < ($this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); $j++) { + $sRes .= "\x00"; + } + } + // Set for PPS + $raList[$i]->_StartBlock = $iSmBlk; + $iSmBlk += $iSmbCnt; + } + } + } + $iSbCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); + if ($iSmBlk % $iSbCnt) { + for ($i = 0; $i < ($iSbCnt - ($iSmBlk % $iSbCnt)); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + return $sRes; + } + + /** + * Saves all the PPS's WKs + * + * @access private + * @param array $raList Reference to an array with all PPS's + */ + function _savePps(&$raList) + { + // Save each PPS WK + for ($i = 0; $i < count($raList); $i++) { + fwrite($this->_FILEH_, $raList[$i]->_getPpsWk()); + } + // Adjust for Block + $iCnt = count($raList); + $iBCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; + if ($iCnt % $iBCnt) { + for ($i = 0; $i < (($iBCnt - ($iCnt % $iBCnt)) * OLE_PPS_SIZE); $i++) { + fwrite($this->_FILEH_, "\x00"); + } + } + } + + /** + * Saving Big Block Depot + * + * @access private + * @param integer $iSbdSize + * @param integer $iBsize + * @param integer $iPpsCnt + */ + function _saveBbd($iSbdSize, $iBsize, $iPpsCnt) + { + $FILE = $this->_FILEH_; + // Calculate Basic Setting + $iBbCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBsize + $iPpsCnt + $iSbdSize; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + // Calculate BD count + if ($iBdCnt >$i1stBdL) { + while (1) { + $iBdExL++; + $iAllW++; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) { + break; + } + } + } + + // Making BD + // Set for SBD + if ($iSbdSize > 0) { + for ($i = 0; $i < ($iSbdSize - 1); $i++) { + fwrite($FILE, pack("V", $i+1)); + } + fwrite($FILE, pack("V", -2)); + } + // Set for B + for ($i = 0; $i < ($iBsize - 1); $i++) { + fwrite($FILE, pack("V", $i+$iSbdSize+1)); + } + fwrite($FILE, pack("V", -2)); + + // Set for PPS + for ($i = 0; $i < ($iPpsCnt - 1); $i++) { + fwrite($FILE, pack("V", $i+$iSbdSize+$iBsize+1)); + } + fwrite($FILE, pack("V", -2)); + // Set for BBD itself ( 0xFFFFFFFD : BBD) + for ($i = 0; $i < $iBdCnt; $i++) { + fwrite($FILE, pack("V", 0xFFFFFFFD)); + } + // Set for ExtraBDList + for ($i = 0; $i < $iBdExL; $i++) { + fwrite($FILE, pack("V", 0xFFFFFFFC)); + } + // Adjust for Block + if (($iAllW + $iBdCnt) % $iBbCnt) { + for ($i = 0; $i < ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + // Extra BDList + if ($iBdCnt > $i1stBdL) { + $iN=0; + $iNb=0; + for ($i = $i1stBdL;$i < $iBdCnt; $i++, $iN++) { + if ($iN >= ($iBbCnt - 1)) { + $iN = 0; + $iNb++; + fwrite($FILE, pack("V", $iAll+$iBdCnt+$iNb)); + } + fwrite($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i)); + } + if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) { + for ($i = 0; $i < (($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1))); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + fwrite($FILE, pack("V", -2)); + } + } +} +?> diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer.php new file mode 100644 index 000000000..a2ee4d406 --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer.php @@ -0,0 +1,104 @@ +<?php +/* +* Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +* +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* <jmcnamara@cpan.org> +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +require_once 'PEAR.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Workbook.php'; + +/** +* Class for writing Excel Spreadsheets. This class should change COMPLETELY. +* +* @author Xavier Noguer <xnoguer@rezebra.com> +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook +{ + /** + * The constructor. It just creates a Workbook + * + * @param string $filename The optional filename for the Workbook. + * @return Spreadsheet_Excel_Writer_Workbook The Workbook created + */ + function Spreadsheet_Excel_Writer($filename = '') + { + $this->_filename = $filename; + $this->Spreadsheet_Excel_Writer_Workbook($filename); + } + + /** + * Send HTTP headers for the Excel file. + * + * @param string $filename The filename to use for HTTP headers + * @access public + */ + function send($filename) + { + header("Content-type: application/vnd.ms-excel"); + header("Content-Disposition: attachment; filename=\"$filename\""); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); + header("Pragma: public"); + } + + /** + * Utility function for writing formulas + * Converts a cell's coordinates to the A1 format. + * + * @access public + * @static + * @param integer $row Row for the cell to convert (0-indexed). + * @param integer $col Column for the cell to convert (0-indexed). + * @return string The cell identifier in A1 format + */ + function rowcolToCell($row, $col) + { + if ($col > 255) { //maximum column value exceeded + return new PEAR_Error("Maximum column value exceeded: $col"); + } + + $int = (int)($col / 26); + $frac = $col % 26; + $chr1 = ''; + + if ($int > 0) { + $chr1 = chr(ord('A') + $int - 1); + } + + $chr2 = chr(ord('A') + $frac); + $row++; + + return $chr1 . $chr2 . $row; + } +} +?> diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/BIFFwriter.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/BIFFwriter.php new file mode 100644 index 000000000..2e129f961 --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/BIFFwriter.php @@ -0,0 +1,261 @@ +<?php +/* +* Module written/ported by Xavier Noguer <xnoguer@php.net> +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* <jmcnamara@cpan.org> +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@php.net +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +require_once 'PEAR.php'; + +/** +* Class for writing Excel BIFF records. +* +* From "MICROSOFT EXCEL BINARY FILE FORMAT" by Mark O'Brien (Microsoft Corporation): +* +* BIFF (BInary File Format) is the file format in which Excel documents are +* saved on disk. A BIFF file is a complete description of an Excel document. +* BIFF files consist of sequences of variable-length records. There are many +* different types of BIFF records. For example, one record type describes a +* formula entered into a cell; one describes the size and location of a +* window into a document; another describes a picture format. +* +* @author Xavier Noguer <xnoguer@php.net> +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR +{ + /** + * The BIFF/Excel version (5). + * @var integer + */ + var $_BIFF_version = 0x0500; + + /** + * The byte order of this architecture. 0 => little endian, 1 => big endian + * @var integer + */ + var $_byte_order; + + /** + * The string containing the data of the BIFF stream + * @var string + */ + var $_data; + + /** + * The size of the data in bytes. Should be the same as strlen($this->_data) + * @var integer + */ + var $_datasize; + + /** + * The maximun length for a BIFF record. See _addContinue() + * @var integer + * @see _addContinue() + */ + var $_limit; + + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * Constructor + * + * @access public + */ + function Spreadsheet_Excel_Writer_BIFFwriter() + { + $this->_byte_order = ''; + $this->_data = ''; + $this->_datasize = 0; + $this->_limit = 2080; + $this->_tmp_dir = ''; + // Set the byte order + $this->_setByteOrder(); + } + + /** + * Determine the byte order and store it as class data to avoid + * recalculating it for each call to new(). + * + * @access private + */ + function _setByteOrder() + { + // Check if "pack" gives the required IEEE 64bit float + $teststr = pack("d", 1.2345); + $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); + if ($number == $teststr) { + $byte_order = 0; // Little Endian + } elseif ($number == strrev($teststr)){ + $byte_order = 1; // Big Endian + } else { + // Give up. I'll fix this in a later version. + return $this->raiseError("Required floating point format ". + "not supported on this platform."); + } + $this->_byte_order = $byte_order; + } + + /** + * General storage function + * + * @param string $data binary data to prepend + * @access private + */ + function _prepend($data) + { + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data = $data.$this->_data; + $this->_datasize += strlen($data); + } + + /** + * General storage function + * + * @param string $data binary data to append + * @access private + */ + function _append($data) + { + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data = $this->_data.$data; + $this->_datasize += strlen($data); + } + + /** + * Writes Excel BOF record to indicate the beginning of a stream or + * sub-stream in the BIFF file. + * + * @param integer $type Type of BIFF file to write: 0x0005 Workbook, + * 0x0010 Worksheet. + * @access private + */ + function _storeBof($type) + { + $record = 0x0809; // Record identifier + + // According to the SDK $build and $year should be set to zero. + // However, this throws a warning in Excel 5. So, use magic numbers. + if ($this->_BIFF_version == 0x0500) { + $length = 0x0008; + $unknown = ''; + $build = 0x096C; + $year = 0x07C9; + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x0010; + $unknown = pack("VV", 0x00000041, 0x00000006); //unknown last 8 bytes for BIFF8 + $build = 0x0DBB; + $year = 0x07CC; + } + $version = $this->_BIFF_version; + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $version, $type, $build, $year); + $this->_prepend($header . $data . $unknown); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + function _storeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + $header = pack("vv", $record, $length); + $this->_append($header); + } + + /** + * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In + * Excel 97 the limit is 8228 bytes. Records that are longer than these limits + * must be split up into CONTINUE blocks. + * + * This function takes a long BIFF record and inserts CONTINUE records as + * necessary. + * + * @param string $data The original binary data to be written + * @return string A very convenient string of continue blocks + * @access private + */ + function _addContinue($data) + { + $limit = $this->_limit; + $record = 0x003C; // Record identifier + + // The first 2080/8224 bytes remain intact. However, we have to change + // the length field of the record. + $tmp = substr($data, 0, 2).pack("v", $limit-4).substr($data, 4, $limit - 4); + + $header = pack("vv", $record, $limit); // Headers for continue records + + // Retrieve chunks of 2080/8224 bytes +4 for the header. + $data_length = strlen($data); + for ($i = $limit; $i < ($data_length - $limit); $i += $limit) { + $tmp .= $header; + $tmp .= substr($data, $i, $limit); + } + + // Retrieve the last chunk of data + $header = pack("vv", $record, strlen($data) - $i); + $tmp .= $header; + $tmp .= substr($data, $i, strlen($data) - $i); + + return $tmp; + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } +} +?> diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Format.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Format.php new file mode 100644 index 000000000..efa078ea8 --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Format.php @@ -0,0 +1,1114 @@ +<?php +/* +* Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* <jmcnamara@cpan.org> +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +require_once 'PEAR.php'; + +/** +* Class for generating Excel XF records (formats) +* +* @author Xavier Noguer <xnoguer@rezebra.com> +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Format extends PEAR +{ + /** + * The index given by the workbook when creating a new format. + * @var integer + */ + var $_xf_index; + + /** + * Index to the FONT record. + * @var integer + */ + var $font_index; + + /** + * The font name (ASCII). + * @var string + */ + var $_font_name; + + /** + * Height of font (1/20 of a point) + * @var integer + */ + var $_size; + + /** + * Bold style + * @var integer + */ + var $_bold; + + /** + * Bit specifiying if the font is italic. + * @var integer + */ + var $_italic; + + /** + * Index to the cell's color + * @var integer + */ + var $_color; + + /** + * The text underline property + * @var integer + */ + var $_underline; + + /** + * Bit specifiying if the font has strikeout. + * @var integer + */ + var $_font_strikeout; + + /** + * Bit specifiying if the font has outline. + * @var integer + */ + var $_font_outline; + + /** + * Bit specifiying if the font has shadow. + * @var integer + */ + var $_font_shadow; + + /** + * 2 bytes specifiying the script type for the font. + * @var integer + */ + var $_font_script; + + /** + * Byte specifiying the font family. + * @var integer + */ + var $_font_family; + + /** + * Byte specifiying the font charset. + * @var integer + */ + var $_font_charset; + + /** + * An index (2 bytes) to a FORMAT record (number format). + * @var integer + */ + var $_num_format; + + /** + * Bit specifying if formulas are hidden. + * @var integer + */ + var $_hidden; + + /** + * Bit specifying if the cell is locked. + * @var integer + */ + var $_locked; + + /** + * The three bits specifying the text horizontal alignment. + * @var integer + */ + var $_text_h_align; + + /** + * Bit specifying if the text is wrapped at the right border. + * @var integer + */ + var $_text_wrap; + + /** + * The three bits specifying the text vertical alignment. + * @var integer + */ + var $_text_v_align; + + /** + * 1 bit, apparently not used. + * @var integer + */ + var $_text_justlast; + + /** + * The two bits specifying the text rotation. + * @var integer + */ + var $_rotation; + + /** + * The cell's foreground color. + * @var integer + */ + var $_fg_color; + + /** + * The cell's background color. + * @var integer + */ + var $_bg_color; + + /** + * The cell's background fill pattern. + * @var integer + */ + var $_pattern; + + /** + * Style of the bottom border of the cell + * @var integer + */ + var $_bottom; + + /** + * Color of the bottom border of the cell. + * @var integer + */ + var $_bottom_color; + + /** + * Style of the top border of the cell + * @var integer + */ + var $_top; + + /** + * Color of the top border of the cell. + * @var integer + */ + var $_top_color; + + /** + * Style of the left border of the cell + * @var integer + */ + var $_left; + + /** + * Color of the left border of the cell. + * @var integer + */ + var $_left_color; + + /** + * Style of the right border of the cell + * @var integer + */ + var $_right; + + /** + * Color of the right border of the cell. + * @var integer + */ + var $_right_color; + + /** + * Constructor + * + * @access private + * @param integer $index the XF index for the format. + * @param array $properties array with properties to be set on initialization. + */ + function Spreadsheet_Excel_Writer_Format($BIFF_version, $index = 0, $properties = array()) + { + $this->_xf_index = $index; + $this->_BIFF_version = $BIFF_version; + $this->font_index = 0; + $this->_font_name = 'Verdana'; + $this->_size = 10; + $this->_bold = 0x0190; + $this->_italic = 0; + $this->_color = 0x7FFF; + $this->_underline = 0; + $this->_font_strikeout = 0; + $this->_font_outline = 0; + $this->_font_shadow = 0; + $this->_font_script = 0; + $this->_font_family = 0; + $this->_font_charset = 0; + + $this->_num_format = 0; + + $this->_hidden = 0; + $this->_locked = 0; + + $this->_text_h_align = 0; + $this->_text_wrap = 0; + $this->_text_v_align = 2; + $this->_text_justlast = 0; + $this->_rotation = 0; + + $this->_fg_color = 0x40; + $this->_bg_color = 0x41; + + $this->_pattern = 0; + + $this->_bottom = 0; + $this->_top = 0; + $this->_left = 0; + $this->_right = 0; + $this->_diag = 0; + + $this->_bottom_color = 0x40; + $this->_top_color = 0x40; + $this->_left_color = 0x40; + $this->_right_color = 0x40; + $this->_diag_color = 0x40; + + // Set properties passed to Spreadsheet_Excel_Writer_Workbook::addFormat() + foreach ($properties as $property => $value) + { + if (method_exists($this, 'set'.ucwords($property))) { + $method_name = 'set'.ucwords($property); + $this->$method_name($value); + } + } + } + + + /** + * Generate an Excel BIFF XF record (style or cell). + * + * @param string $style The type of the XF record ('style' or 'cell'). + * @return string The XF record + */ + function getXf($style) + { + // Set the type of the XF record and some of the attributes. + if ($style == 'style') { + $style = 0xFFF5; + } else { + $style = $this->_locked; + $style |= $this->_hidden << 1; + } + + // Flags to indicate if attributes have been set. + $atr_num = ($this->_num_format != 0)?1:0; + $atr_fnt = ($this->font_index != 0)?1:0; + $atr_alc = ($this->_text_wrap)?1:0; + $atr_bdr = ($this->_bottom || + $this->_top || + $this->_left || + $this->_right)?1:0; + $atr_pat = (($this->_fg_color != 0x40) || + ($this->_bg_color != 0x41) || + $this->_pattern)?1:0; + $atr_prot = $this->_locked | $this->_hidden; + + // Zero the default border colour if the border has not been set. + if ($this->_bottom == 0) { + $this->_bottom_color = 0; + } + if ($this->_top == 0) { + $this->_top_color = 0; + } + if ($this->_right == 0) { + $this->_right_color = 0; + } + if ($this->_left == 0) { + $this->_left_color = 0; + } + if ($this->_diag == 0) { + $this->_diag_color = 0; + } + + $record = 0x00E0; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x0010; // Number of bytes to follow + } + if ($this->_BIFF_version == 0x0600) { + $length = 0x0014; + } + + $ifnt = $this->font_index; // Index to FONT record + $ifmt = $this->_num_format; // Index to FORMAT record + if ($this->_BIFF_version == 0x0500) { + $align = $this->_text_h_align; // Alignment + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + $align |= $this->_rotation << 8; + $align |= $atr_num << 10; + $align |= $atr_fnt << 11; + $align |= $atr_alc << 12; + $align |= $atr_bdr << 13; + $align |= $atr_pat << 14; + $align |= $atr_prot << 15; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $fill = $this->_pattern; // Fill and border line style + $fill |= $this->_bottom << 6; + $fill |= $this->_bottom_color << 9; + + $border1 = $this->_top; // Border line style and color + $border1 |= $this->_left << 3; + $border1 |= $this->_right << 6; + $border1 |= $this->_top_color << 9; + + $border2 = $this->_left_color; // Border color + $border2 |= $this->_right_color << 7; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $ifnt, $ifmt, $style, $align, + $icv, $fill, + $border1, $border2); + } elseif ($this->_BIFF_version == 0x0600) { + $align = $this->_text_h_align; // Alignment + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + + $used_attrib = $atr_num << 2; + $used_attrib |= $atr_fnt << 3; + $used_attrib |= $atr_alc << 4; + $used_attrib |= $atr_bdr << 5; + $used_attrib |= $atr_pat << 6; + $used_attrib |= $atr_prot << 7; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $border1 = $this->_left; // Border line style and color + $border1 |= $this->_right << 4; + $border1 |= $this->_top << 8; + $border1 |= $this->_bottom << 12; + $border1 |= $this->_left_color << 16; + $border1 |= $this->_right_color << 23; + $diag_tl_to_rb = 0; // FIXME: add method + $diag_tr_to_lb = 0; // FIXME: add method + $border1 |= $diag_tl_to_rb << 30; + $border1 |= $diag_tr_to_lb << 31; + + $border2 = $this->_top_color; // Border color + $border2 |= $this->_bottom_color << 7; + $border2 |= $this->_diag_color << 14; + $border2 |= $this->_diag << 21; + $border2 |= $this->_pattern << 26; + + $header = pack("vv", $record, $length); + + $rotation = $this->_rotation; + $biff8_options = 0x00; + $data = pack("vvvC", $ifnt, $ifmt, $style, $align); + $data .= pack("CCC", $rotation, $biff8_options, $used_attrib); + $data .= pack("VVv", $border1, $border2, $icv); + } + + return($header . $data); + } + + /** + * Generate an Excel BIFF FONT record. + * + * @return string The FONT record + */ + function getFont() + { + $dyHeight = $this->_size * 20; // Height of font (1/20 of a point) + $icv = $this->_color; // Index to color palette + $bls = $this->_bold; // Bold style + $sss = $this->_font_script; // Superscript/subscript + $uls = $this->_underline; // Underline + $bFamily = $this->_font_family; // Font family + $bCharSet = $this->_font_charset; // Character set + $encoding = 0; // TODO: Unicode support + + $cch = strlen($this->_font_name); // Length of font name + $record = 0x31; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x0F + $cch; // Record length + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x10 + $cch; + } + $reserved = 0x00; // Reserved + $grbit = 0x00; // Font attributes + if ($this->_italic) { + $grbit |= 0x02; + } + if ($this->_font_strikeout) { + $grbit |= 0x08; + } + if ($this->_font_outline) { + $grbit |= 0x10; + } + if ($this->_font_shadow) { + $grbit |= 0x20; + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0500) { + $data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch); + } elseif ($this->_BIFF_version == 0x0600) { + $data = pack("vvvvvCCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch, $encoding); + } + return($header . $data . $this->_font_name); + } + + /** + * Returns a unique hash key for a font. + * Used by Spreadsheet_Excel_Writer_Workbook::_storeAllFonts() + * + * The elements that form the key are arranged to increase the probability of + * generating a unique key. Elements that hold a large range of numbers + * (eg. _color) are placed between two binary elements such as _italic + * + * @return string A key for this font + */ + function getFontKey() + { + $key = "$this->_font_name$this->_size"; + $key .= "$this->_font_script$this->_underline"; + $key .= "$this->_font_strikeout$this->_bold$this->_font_outline"; + $key .= "$this->_font_family$this->_font_charset"; + $key .= "$this->_font_shadow$this->_color$this->_italic"; + $key = str_replace(' ', '_', $key); + return ($key); + } + + /** + * Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF() + * + * @return integer The index for the XF record + */ + function getXfIndex() + { + return($this->_xf_index); + } + + /** + * Used in conjunction with the set_xxx_color methods to convert a color + * string into a number. Color range is 0..63 but we will restrict it + * to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15. + * + * @access private + * @param string $name_color name of the color (i.e.: 'blue', 'red', etc..). Optional. + * @return integer The color index + */ + function _getColor($name_color = '') + { + $colors = array( + 'aqua' => 0x0F, + 'cyan' => 0x0F, + 'black' => 0x08, + 'blue' => 0x0C, + 'brown' => 0x10, + 'magenta' => 0x0E, + 'fuchsia' => 0x0E, + 'gray' => 0x17, + 'grey' => 0x17, + 'green' => 0x11, + 'lime' => 0x0B, + 'navy' => 0x12, + 'orange' => 0x35, + 'purple' => 0x14, + 'red' => 0x0A, + 'silver' => 0x16, + 'white' => 0x09, + 'yellow' => 0x0D + ); + + // Return the default color, 0x7FFF, if undef, + if ($name_color == '') { + return(0x7FFF); + } + + // or the color string converted to an integer, + if (isset($colors[$name_color])) { + return($colors[$name_color]); + } + + // or the default color if string is unrecognised, + if (preg_match("/\D/",$name_color)) { + return(0x7FFF); + } + + // or an index < 8 mapped into the correct range, + if ($name_color < 8) { + return($name_color + 8); + } + + // or the default color if arg is outside range, + if ($name_color > 63) { + return(0x7FFF); + } + + // or an integer in the valid range + return($name_color); + } + + /** + * Set cell alignment. + * + * @access public + * @param string $location alignment for the cell ('left', 'right', etc...). + */ + function setAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'left') { + $this->_text_h_align = 1; + } + if ($location == 'centre') { + $this->_text_h_align = 2; + } + if ($location == 'center') { + $this->_text_h_align = 2; + } + if ($location == 'right') { + $this->_text_h_align = 3; + } + if ($location == 'fill') { + $this->_text_h_align = 4; + } + if ($location == 'justify') { + $this->_text_h_align = 5; + } + if ($location == 'merge') { + $this->_text_h_align = 6; + } + if ($location == 'equal_space') { // For T.K. + $this->_text_h_align = 7; + } + if ($location == 'top') { + $this->_text_v_align = 0; + } + if ($location == 'vcentre') { + $this->_text_v_align = 1; + } + if ($location == 'vcenter') { + $this->_text_v_align = 1; + } + if ($location == 'bottom') { + $this->_text_v_align = 2; + } + if ($location == 'vjustify') { + $this->_text_v_align = 3; + } + if ($location == 'vequal_space') { // For T.K. + $this->_text_v_align = 4; + } + } + + /** + * Set cell horizontal alignment. + * + * @access public + * @param string $location alignment for the cell ('left', 'right', etc...). + */ + function setHAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'left') { + $this->_text_h_align = 1; + } + if ($location == 'centre') { + $this->_text_h_align = 2; + } + if ($location == 'center') { + $this->_text_h_align = 2; + } + if ($location == 'right') { + $this->_text_h_align = 3; + } + if ($location == 'fill') { + $this->_text_h_align = 4; + } + if ($location == 'justify') { + $this->_text_h_align = 5; + } + if ($location == 'merge') { + $this->_text_h_align = 6; + } + if ($location == 'equal_space') { // For T.K. + $this->_text_h_align = 7; + } + } + + /** + * Set cell vertical alignment. + * + * @access public + * @param string $location alignment for the cell ('top', 'vleft', 'vright', etc...). + */ + function setVAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'top') { + $this->_text_v_align = 0; + } + if ($location == 'vcentre') { + $this->_text_v_align = 1; + } + if ($location == 'vcenter') { + $this->_text_v_align = 1; + } + if ($location == 'bottom') { + $this->_text_v_align = 2; + } + if ($location == 'vjustify') { + $this->_text_v_align = 3; + } + if ($location == 'vequal_space') { // For T.K. + $this->_text_v_align = 4; + } + } + + /** + * This is an alias for the unintuitive setAlign('merge') + * + * @access public + */ + function setMerge() + { + $this->setAlign('merge'); + } + + /** + * Sets the boldness of the text. + * Bold has a range 100..1000. + * 0 (400) is normal. 1 (700) is bold. + * + * @access public + * @param integer $weight Weight for the text, 0 maps to 400 (normal text), + 1 maps to 700 (bold text). Valid range is: 100-1000. + It's Optional, default is 1 (bold). + */ + function setBold($weight = 1) + { + if ($weight == 1) { + $weight = 0x2BC; // Bold text + } + if ($weight == 0) { + $weight = 0x190; // Normal text + } + if ($weight < 0x064) { + $weight = 0x190; // Lower bound + } + if ($weight > 0x3E8) { + $weight = 0x190; // Upper bound + } + $this->_bold = $weight; + } + + + /************************************ + * FUNCTIONS FOR SETTING CELLS BORDERS + */ + + /** + * Sets the width for the bottom border of the cell + * + * @access public + * @param integer $style style of the cell border. 1 => thin, 2 => thick. + */ + function setBottom($style) + { + $this->_bottom = $style; + } + + /** + * Sets the width for the top border of the cell + * + * @access public + * @param integer $style style of the cell top border. 1 => thin, 2 => thick. + */ + function setTop($style) + { + $this->_top = $style; + } + + /** + * Sets the width for the left border of the cell + * + * @access public + * @param integer $style style of the cell left border. 1 => thin, 2 => thick. + */ + function setLeft($style) + { + $this->_left = $style; + } + + /** + * Sets the width for the right border of the cell + * + * @access public + * @param integer $style style of the cell right border. 1 => thin, 2 => thick. + */ + function setRight($style) + { + $this->_right = $style; + } + + + /** + * Set cells borders to the same style + * + * @access public + * @param integer $style style to apply for all cell borders. 1 => thin, 2 => thick. + */ + function setBorder($style) + { + $this->setBottom($style); + $this->setTop($style); + $this->setLeft($style); + $this->setRight($style); + } + + + /******************************************* + * FUNCTIONS FOR SETTING CELLS BORDERS COLORS + */ + + /** + * Sets all the cell's borders to the same color + * + * @access public + * @param mixed $color The color we are setting. Either a string (like 'blue'), + * or an integer (range is [8...63]). + */ + function setBorderColor($color) + { + $this->setBottomColor($color); + $this->setTopColor($color); + $this->setLeftColor($color); + $this->setRightColor($color); + } + + /** + * Sets the cell's bottom border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setBottomColor($color) + { + $value = $this->_getColor($color); + $this->_bottom_color = $value; + } + + /** + * Sets the cell's top border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setTopColor($color) + { + $value = $this->_getColor($color); + $this->_top_color = $value; + } + + /** + * Sets the cell's left border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setLeftColor($color) + { + $value = $this->_getColor($color); + $this->_left_color = $value; + } + + /** + * Sets the cell's right border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setRightColor($color) + { + $value = $this->_getColor($color); + $this->_right_color = $value; + } + + + /** + * Sets the cell's foreground color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setFgColor($color) + { + $value = $this->_getColor($color); + $this->_fg_color = $value; + if ($this->_pattern == 0) { // force color to be seen + $this->_pattern = 1; + } + } + + /** + * Sets the cell's background color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setBgColor($color) + { + $value = $this->_getColor($color); + $this->_bg_color = $value; + if ($this->_pattern == 0) { // force color to be seen + $this->_pattern = 1; + } + } + + /** + * Sets the cell's color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setColor($color) + { + $value = $this->_getColor($color); + $this->_color = $value; + } + + /** + * Sets the fill pattern attribute of a cell + * + * @access public + * @param integer $arg Optional. Defaults to 1. Meaningful values are: 0-18, + * 0 meaning no background. + */ + function setPattern($arg = 1) + { + $this->_pattern = $arg; + } + + /** + * Sets the underline of the text + * + * @access public + * @param integer $underline The value for underline. Possible values are: + * 1 => underline, 2 => double underline. + */ + function setUnderline($underline) + { + $this->_underline = $underline; + } + + /** + * Sets the font style as italic + * + * @access public + */ + function setItalic() + { + $this->_italic = 1; + } + + /** + * Sets the font size + * + * @access public + * @param integer $size The font size (in pixels I think). + */ + function setSize($size) + { + $this->_size = $size; + } + + /** + * Sets text wrapping + * + * @access public + */ + function setTextWrap() + { + $this->_text_wrap = 1; + } + + /** + * Sets the orientation of the text + * + * @access public + * @param integer $angle The rotation angle for the text (clockwise). Possible + values are: 0, 90, 270 and -1 for stacking top-to-bottom. + */ + function setTextRotation($angle) + { + switch ($angle) + { + case 0: + $this->_rotation = 0; + break; + case 90: + if ($this->_BIFF_version == 0x0500) { + $this->_rotation = 3; + } elseif ($this->_BIFF_version == 0x0600) { + $this->_rotation = 180; + } + break; + case 270: + if ($this->_BIFF_version == 0x0500) { + $this->_rotation = 2; + } elseif ($this->_BIFF_version == 0x0600) { + $this->_rotation = 90; + } + break; + case -1: + if ($this->_BIFF_version == 0x0500) { + $this->_rotation = 1; + } elseif ($this->_BIFF_version == 0x0600) { + $this->_rotation = 255; + } + break; + default : + return $this->raiseError("Invalid value for angle.". + " Possible values are: 0, 90, 270 and -1 ". + "for stacking top-to-bottom."); + $this->_rotation = 0; + break; + } + } + + /** + * Sets the numeric format. + * It can be date, time, currency, etc... + * + * @access public + * @param integer $num_format The numeric format. + */ + function setNumFormat($num_format) + { + $this->_num_format = $num_format; + } + + /** + * Sets font as strikeout. + * + * @access public + */ + function setStrikeOut() + { + $this->_font_strikeout = 1; + } + + /** + * Sets outlining for a font. + * + * @access public + */ + function setOutLine() + { + $this->_font_outline = 1; + } + + /** + * Sets font as shadow. + * + * @access public + */ + function setShadow() + { + $this->_font_shadow = 1; + } + + /** + * Sets the script type of the text + * + * @access public + * @param integer $script The value for script type. Possible values are: + * 1 => superscript, 2 => subscript. + */ + function setScript($script) + { + $this->_font_script = $script; + } + + /** + * Locks a cell. + * + * @access public + */ + function setLocked() + { + $this->_locked = 1; + } + + /** + * Unlocks a cell. Useful for unprotecting particular cells of a protected sheet. + * + * @access public + */ + function setUnLocked() + { + $this->_locked = 0; + } + + /** + * Sets the font family name. + * + * @access public + * @param string $fontfamily The font family name. Possible values are: + * 'Times New Roman', 'Arial', 'Courier'. + */ + function setFontFamily($font_family) + { + $this->_font_name = $font_family; + } +} +?> diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Parser.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Parser.php new file mode 100644 index 000000000..eaa330eb8 --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Parser.php @@ -0,0 +1,1703 @@ +<?php +/** +* Class for parsing Excel formulas +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/** +* @const SPREADSHEET_EXCEL_WRITER_ADD token identifier for character "+" +*/ +define('SPREADSHEET_EXCEL_WRITER_ADD', "+"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_SUB token identifier for character "-" +*/ +define('SPREADSHEET_EXCEL_WRITER_SUB', "-"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_MUL token identifier for character "*" +*/ +define('SPREADSHEET_EXCEL_WRITER_MUL', "*"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_DIV token identifier for character "/" +*/ +define('SPREADSHEET_EXCEL_WRITER_DIV', "/"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_OPEN token identifier for character "(" +*/ +define('SPREADSHEET_EXCEL_WRITER_OPEN', "("); + +/** +* @const SPREADSHEET_EXCEL_WRITER_CLOSE token identifier for character ")" +*/ +define('SPREADSHEET_EXCEL_WRITER_CLOSE', ")"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_COMA token identifier for character "," +*/ +define('SPREADSHEET_EXCEL_WRITER_COMA', ","); + +/** +* @const SPREADSHEET_EXCEL_WRITER_SEMICOLON token identifier for character ";" +*/ +define('SPREADSHEET_EXCEL_WRITER_SEMICOLON', ";"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_GT token identifier for character ">" +*/ +define('SPREADSHEET_EXCEL_WRITER_GT', ">"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_LT token identifier for character "<" +*/ +define('SPREADSHEET_EXCEL_WRITER_LT', "<"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_LE token identifier for character "<=" +*/ +define('SPREADSHEET_EXCEL_WRITER_LE', "<="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_GE token identifier for character ">=" +*/ +define('SPREADSHEET_EXCEL_WRITER_GE', ">="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_EQ token identifier for character "=" +*/ +define('SPREADSHEET_EXCEL_WRITER_EQ', "="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_NE token identifier for character "<>" +*/ +define('SPREADSHEET_EXCEL_WRITER_NE', "<>"); + +/** +* * @const SPREADSHEET_EXCEL_WRITER_CONCAT token identifier for character "&" +*/ +define('SPREADSHEET_EXCEL_WRITER_CONCAT', "&"); + +require_once 'PEAR.php'; + +/** +* Class for parsing Excel formulas +* +* @author Xavier Noguer <xnoguer@rezebra.com> +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Parser extends PEAR +{ + /** + * The index of the character we are currently looking at + * @var integer + */ + var $_current_char; + + /** + * The token we are working on. + * @var string + */ + var $_current_token; + + /** + * The formula to parse + * @var string + */ + var $_formula; + + /** + * The character ahead of the current char + * @var string + */ + var $_lookahead; + + /** + * The parse tree to be generated + * @var string + */ + var $_parse_tree; + + /** + * The byte order. 1 => big endian, 0 => little endian. + * @var integer + */ + var $_byte_order; + + /** + * Array of external sheets + * @var array + */ + var $_ext_sheets; + + /** + * Array of sheet references in the form of REF structures + * @var array + */ + var $_references; + + /** + * The BIFF version for the workbook + * @var integer + */ + var $_BIFF_version; + + /** + * The class constructor + * + * @param integer $byte_order The byte order (Little endian or Big endian) of the architecture + (optional). 1 => big endian, 0 (default) little endian. + */ + function Spreadsheet_Excel_Writer_Parser($byte_order, $biff_version) + { + $this->_current_char = 0; + $this->_BIFF_version = $biff_version; + $this->_current_token = ''; // The token we are working on. + $this->_formula = ''; // The formula to parse. + $this->_lookahead = ''; // The character ahead of the current char. + $this->_parse_tree = ''; // The parse tree to be generated. + $this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's + $this->_byte_order = $byte_order; // Little Endian or Big Endian + $this->_ext_sheets = array(); + $this->_references = array(); + } + + /** + * Initialize the ptg and function hashes. + * + * @access private + */ + function _initializeHashes() + { + // The Excel ptg indices + $this->ptg = array( + 'ptgExp' => 0x01, + 'ptgTbl' => 0x02, + 'ptgAdd' => 0x03, + 'ptgSub' => 0x04, + 'ptgMul' => 0x05, + 'ptgDiv' => 0x06, + 'ptgPower' => 0x07, + 'ptgConcat' => 0x08, + 'ptgLT' => 0x09, + 'ptgLE' => 0x0A, + 'ptgEQ' => 0x0B, + 'ptgGE' => 0x0C, + 'ptgGT' => 0x0D, + 'ptgNE' => 0x0E, + 'ptgIsect' => 0x0F, + 'ptgUnion' => 0x10, + 'ptgRange' => 0x11, + 'ptgUplus' => 0x12, + 'ptgUminus' => 0x13, + 'ptgPercent' => 0x14, + 'ptgParen' => 0x15, + 'ptgMissArg' => 0x16, + 'ptgStr' => 0x17, + 'ptgAttr' => 0x19, + 'ptgSheet' => 0x1A, + 'ptgEndSheet' => 0x1B, + 'ptgErr' => 0x1C, + 'ptgBool' => 0x1D, + 'ptgInt' => 0x1E, + 'ptgNum' => 0x1F, + 'ptgArray' => 0x20, + 'ptgFunc' => 0x21, + 'ptgFuncVar' => 0x22, + 'ptgName' => 0x23, + 'ptgRef' => 0x24, + 'ptgArea' => 0x25, + 'ptgMemArea' => 0x26, + 'ptgMemErr' => 0x27, + 'ptgMemNoMem' => 0x28, + 'ptgMemFunc' => 0x29, + 'ptgRefErr' => 0x2A, + 'ptgAreaErr' => 0x2B, + 'ptgRefN' => 0x2C, + 'ptgAreaN' => 0x2D, + 'ptgMemAreaN' => 0x2E, + 'ptgMemNoMemN' => 0x2F, + 'ptgNameX' => 0x39, + 'ptgRef3d' => 0x3A, + 'ptgArea3d' => 0x3B, + 'ptgRefErr3d' => 0x3C, + 'ptgAreaErr3d' => 0x3D, + 'ptgArrayV' => 0x40, + 'ptgFuncV' => 0x41, + 'ptgFuncVarV' => 0x42, + 'ptgNameV' => 0x43, + 'ptgRefV' => 0x44, + 'ptgAreaV' => 0x45, + 'ptgMemAreaV' => 0x46, + 'ptgMemErrV' => 0x47, + 'ptgMemNoMemV' => 0x48, + 'ptgMemFuncV' => 0x49, + 'ptgRefErrV' => 0x4A, + 'ptgAreaErrV' => 0x4B, + 'ptgRefNV' => 0x4C, + 'ptgAreaNV' => 0x4D, + 'ptgMemAreaNV' => 0x4E, + 'ptgMemNoMemN' => 0x4F, + 'ptgFuncCEV' => 0x58, + 'ptgNameXV' => 0x59, + 'ptgRef3dV' => 0x5A, + 'ptgArea3dV' => 0x5B, + 'ptgRefErr3dV' => 0x5C, + 'ptgAreaErr3d' => 0x5D, + 'ptgArrayA' => 0x60, + 'ptgFuncA' => 0x61, + 'ptgFuncVarA' => 0x62, + 'ptgNameA' => 0x63, + 'ptgRefA' => 0x64, + 'ptgAreaA' => 0x65, + 'ptgMemAreaA' => 0x66, + 'ptgMemErrA' => 0x67, + 'ptgMemNoMemA' => 0x68, + 'ptgMemFuncA' => 0x69, + 'ptgRefErrA' => 0x6A, + 'ptgAreaErrA' => 0x6B, + 'ptgRefNA' => 0x6C, + 'ptgAreaNA' => 0x6D, + 'ptgMemAreaNA' => 0x6E, + 'ptgMemNoMemN' => 0x6F, + 'ptgFuncCEA' => 0x78, + 'ptgNameXA' => 0x79, + 'ptgRef3dA' => 0x7A, + 'ptgArea3dA' => 0x7B, + 'ptgRefErr3dA' => 0x7C, + 'ptgAreaErr3d' => 0x7D + ); + + // Thanks to Michael Meeks and Gnumeric for the initial arg values. + // + // The following hash was generated by "function_locale.pl" in the distro. + // Refer to function_locale.pl for non-English function names. + // + // The array elements are as follow: + // ptg: The Excel function ptg code. + // args: The number of arguments that the function takes: + // >=0 is a fixed number of arguments. + // -1 is a variable number of arguments. + // class: The reference, value or array class of the function args. + // vol: The function is volatile. + // + $this->_functions = array( + // function ptg args class vol + 'COUNT' => array( 0, -1, 0, 0 ), + 'IF' => array( 1, -1, 1, 0 ), + 'ISNA' => array( 2, 1, 1, 0 ), + 'ISERROR' => array( 3, 1, 1, 0 ), + 'SUM' => array( 4, -1, 0, 0 ), + 'AVERAGE' => array( 5, -1, 0, 0 ), + 'MIN' => array( 6, -1, 0, 0 ), + 'MAX' => array( 7, -1, 0, 0 ), + 'ROW' => array( 8, -1, 0, 0 ), + 'COLUMN' => array( 9, -1, 0, 0 ), + 'NA' => array( 10, 0, 0, 0 ), + 'NPV' => array( 11, -1, 1, 0 ), + 'STDEV' => array( 12, -1, 0, 0 ), + 'DOLLAR' => array( 13, -1, 1, 0 ), + 'FIXED' => array( 14, -1, 1, 0 ), + 'SIN' => array( 15, 1, 1, 0 ), + 'COS' => array( 16, 1, 1, 0 ), + 'TAN' => array( 17, 1, 1, 0 ), + 'ATAN' => array( 18, 1, 1, 0 ), + 'PI' => array( 19, 0, 1, 0 ), + 'SQRT' => array( 20, 1, 1, 0 ), + 'EXP' => array( 21, 1, 1, 0 ), + 'LN' => array( 22, 1, 1, 0 ), + 'LOG10' => array( 23, 1, 1, 0 ), + 'ABS' => array( 24, 1, 1, 0 ), + 'INT' => array( 25, 1, 1, 0 ), + 'SIGN' => array( 26, 1, 1, 0 ), + 'ROUND' => array( 27, 2, 1, 0 ), + 'LOOKUP' => array( 28, -1, 0, 0 ), + 'INDEX' => array( 29, -1, 0, 1 ), + 'REPT' => array( 30, 2, 1, 0 ), + 'MID' => array( 31, 3, 1, 0 ), + 'LEN' => array( 32, 1, 1, 0 ), + 'VALUE' => array( 33, 1, 1, 0 ), + 'TRUE' => array( 34, 0, 1, 0 ), + 'FALSE' => array( 35, 0, 1, 0 ), + 'AND' => array( 36, -1, 0, 0 ), + 'OR' => array( 37, -1, 0, 0 ), + 'NOT' => array( 38, 1, 1, 0 ), + 'MOD' => array( 39, 2, 1, 0 ), + 'DCOUNT' => array( 40, 3, 0, 0 ), + 'DSUM' => array( 41, 3, 0, 0 ), + 'DAVERAGE' => array( 42, 3, 0, 0 ), + 'DMIN' => array( 43, 3, 0, 0 ), + 'DMAX' => array( 44, 3, 0, 0 ), + 'DSTDEV' => array( 45, 3, 0, 0 ), + 'VAR' => array( 46, -1, 0, 0 ), + 'DVAR' => array( 47, 3, 0, 0 ), + 'TEXT' => array( 48, 2, 1, 0 ), + 'LINEST' => array( 49, -1, 0, 0 ), + 'TREND' => array( 50, -1, 0, 0 ), + 'LOGEST' => array( 51, -1, 0, 0 ), + 'GROWTH' => array( 52, -1, 0, 0 ), + 'PV' => array( 56, -1, 1, 0 ), + 'FV' => array( 57, -1, 1, 0 ), + 'NPER' => array( 58, -1, 1, 0 ), + 'PMT' => array( 59, -1, 1, 0 ), + 'RATE' => array( 60, -1, 1, 0 ), + 'MIRR' => array( 61, 3, 0, 0 ), + 'IRR' => array( 62, -1, 0, 0 ), + 'RAND' => array( 63, 0, 1, 1 ), + 'MATCH' => array( 64, -1, 0, 0 ), + 'DATE' => array( 65, 3, 1, 0 ), + 'TIME' => array( 66, 3, 1, 0 ), + 'DAY' => array( 67, 1, 1, 0 ), + 'MONTH' => array( 68, 1, 1, 0 ), + 'YEAR' => array( 69, 1, 1, 0 ), + 'WEEKDAY' => array( 70, -1, 1, 0 ), + 'HOUR' => array( 71, 1, 1, 0 ), + 'MINUTE' => array( 72, 1, 1, 0 ), + 'SECOND' => array( 73, 1, 1, 0 ), + 'NOW' => array( 74, 0, 1, 1 ), + 'AREAS' => array( 75, 1, 0, 1 ), + 'ROWS' => array( 76, 1, 0, 1 ), + 'COLUMNS' => array( 77, 1, 0, 1 ), + 'OFFSET' => array( 78, -1, 0, 1 ), + 'SEARCH' => array( 82, -1, 1, 0 ), + 'TRANSPOSE' => array( 83, 1, 1, 0 ), + 'TYPE' => array( 86, 1, 1, 0 ), + 'ATAN2' => array( 97, 2, 1, 0 ), + 'ASIN' => array( 98, 1, 1, 0 ), + 'ACOS' => array( 99, 1, 1, 0 ), + 'CHOOSE' => array( 100, -1, 1, 0 ), + 'HLOOKUP' => array( 101, -1, 0, 0 ), + 'VLOOKUP' => array( 102, -1, 0, 0 ), + 'ISREF' => array( 105, 1, 0, 0 ), + 'LOG' => array( 109, -1, 1, 0 ), + 'CHAR' => array( 111, 1, 1, 0 ), + 'LOWER' => array( 112, 1, 1, 0 ), + 'UPPER' => array( 113, 1, 1, 0 ), + 'PROPER' => array( 114, 1, 1, 0 ), + 'LEFT' => array( 115, -1, 1, 0 ), + 'RIGHT' => array( 116, -1, 1, 0 ), + 'EXACT' => array( 117, 2, 1, 0 ), + 'TRIM' => array( 118, 1, 1, 0 ), + 'REPLACE' => array( 119, 4, 1, 0 ), + 'SUBSTITUTE' => array( 120, -1, 1, 0 ), + 'CODE' => array( 121, 1, 1, 0 ), + 'FIND' => array( 124, -1, 1, 0 ), + 'CELL' => array( 125, -1, 0, 1 ), + 'ISERR' => array( 126, 1, 1, 0 ), + 'ISTEXT' => array( 127, 1, 1, 0 ), + 'ISNUMBER' => array( 128, 1, 1, 0 ), + 'ISBLANK' => array( 129, 1, 1, 0 ), + 'T' => array( 130, 1, 0, 0 ), + 'N' => array( 131, 1, 0, 0 ), + 'DATEVALUE' => array( 140, 1, 1, 0 ), + 'TIMEVALUE' => array( 141, 1, 1, 0 ), + 'SLN' => array( 142, 3, 1, 0 ), + 'SYD' => array( 143, 4, 1, 0 ), + 'DDB' => array( 144, -1, 1, 0 ), + 'INDIRECT' => array( 148, -1, 1, 1 ), + 'CALL' => array( 150, -1, 1, 0 ), + 'CLEAN' => array( 162, 1, 1, 0 ), + 'MDETERM' => array( 163, 1, 2, 0 ), + 'MINVERSE' => array( 164, 1, 2, 0 ), + 'MMULT' => array( 165, 2, 2, 0 ), + 'IPMT' => array( 167, -1, 1, 0 ), + 'PPMT' => array( 168, -1, 1, 0 ), + 'COUNTA' => array( 169, -1, 0, 0 ), + 'PRODUCT' => array( 183, -1, 0, 0 ), + 'FACT' => array( 184, 1, 1, 0 ), + 'DPRODUCT' => array( 189, 3, 0, 0 ), + 'ISNONTEXT' => array( 190, 1, 1, 0 ), + 'STDEVP' => array( 193, -1, 0, 0 ), + 'VARP' => array( 194, -1, 0, 0 ), + 'DSTDEVP' => array( 195, 3, 0, 0 ), + 'DVARP' => array( 196, 3, 0, 0 ), + 'TRUNC' => array( 197, -1, 1, 0 ), + 'ISLOGICAL' => array( 198, 1, 1, 0 ), + 'DCOUNTA' => array( 199, 3, 0, 0 ), + 'ROUNDUP' => array( 212, 2, 1, 0 ), + 'ROUNDDOWN' => array( 213, 2, 1, 0 ), + 'RANK' => array( 216, -1, 0, 0 ), + 'ADDRESS' => array( 219, -1, 1, 0 ), + 'DAYS360' => array( 220, -1, 1, 0 ), + 'TODAY' => array( 221, 0, 1, 1 ), + 'VDB' => array( 222, -1, 1, 0 ), + 'MEDIAN' => array( 227, -1, 0, 0 ), + 'SUMPRODUCT' => array( 228, -1, 2, 0 ), + 'SINH' => array( 229, 1, 1, 0 ), + 'COSH' => array( 230, 1, 1, 0 ), + 'TANH' => array( 231, 1, 1, 0 ), + 'ASINH' => array( 232, 1, 1, 0 ), + 'ACOSH' => array( 233, 1, 1, 0 ), + 'ATANH' => array( 234, 1, 1, 0 ), + 'DGET' => array( 235, 3, 0, 0 ), + 'INFO' => array( 244, 1, 1, 1 ), + 'DB' => array( 247, -1, 1, 0 ), + 'FREQUENCY' => array( 252, 2, 0, 0 ), + 'ERROR.TYPE' => array( 261, 1, 1, 0 ), + 'REGISTER.ID' => array( 267, -1, 1, 0 ), + 'AVEDEV' => array( 269, -1, 0, 0 ), + 'BETADIST' => array( 270, -1, 1, 0 ), + 'GAMMALN' => array( 271, 1, 1, 0 ), + 'BETAINV' => array( 272, -1, 1, 0 ), + 'BINOMDIST' => array( 273, 4, 1, 0 ), + 'CHIDIST' => array( 274, 2, 1, 0 ), + 'CHIINV' => array( 275, 2, 1, 0 ), + 'COMBIN' => array( 276, 2, 1, 0 ), + 'CONFIDENCE' => array( 277, 3, 1, 0 ), + 'CRITBINOM' => array( 278, 3, 1, 0 ), + 'EVEN' => array( 279, 1, 1, 0 ), + 'EXPONDIST' => array( 280, 3, 1, 0 ), + 'FDIST' => array( 281, 3, 1, 0 ), + 'FINV' => array( 282, 3, 1, 0 ), + 'FISHER' => array( 283, 1, 1, 0 ), + 'FISHERINV' => array( 284, 1, 1, 0 ), + 'FLOOR' => array( 285, 2, 1, 0 ), + 'GAMMADIST' => array( 286, 4, 1, 0 ), + 'GAMMAINV' => array( 287, 3, 1, 0 ), + 'CEILING' => array( 288, 2, 1, 0 ), + 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), + 'LOGNORMDIST' => array( 290, 3, 1, 0 ), + 'LOGINV' => array( 291, 3, 1, 0 ), + 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), + 'NORMDIST' => array( 293, 4, 1, 0 ), + 'NORMSDIST' => array( 294, 1, 1, 0 ), + 'NORMINV' => array( 295, 3, 1, 0 ), + 'NORMSINV' => array( 296, 1, 1, 0 ), + 'STANDARDIZE' => array( 297, 3, 1, 0 ), + 'ODD' => array( 298, 1, 1, 0 ), + 'PERMUT' => array( 299, 2, 1, 0 ), + 'POISSON' => array( 300, 3, 1, 0 ), + 'TDIST' => array( 301, 3, 1, 0 ), + 'WEIBULL' => array( 302, 4, 1, 0 ), + 'SUMXMY2' => array( 303, 2, 2, 0 ), + 'SUMX2MY2' => array( 304, 2, 2, 0 ), + 'SUMX2PY2' => array( 305, 2, 2, 0 ), + 'CHITEST' => array( 306, 2, 2, 0 ), + 'CORREL' => array( 307, 2, 2, 0 ), + 'COVAR' => array( 308, 2, 2, 0 ), + 'FORECAST' => array( 309, 3, 2, 0 ), + 'FTEST' => array( 310, 2, 2, 0 ), + 'INTERCEPT' => array( 311, 2, 2, 0 ), + 'PEARSON' => array( 312, 2, 2, 0 ), + 'RSQ' => array( 313, 2, 2, 0 ), + 'STEYX' => array( 314, 2, 2, 0 ), + 'SLOPE' => array( 315, 2, 2, 0 ), + 'TTEST' => array( 316, 4, 2, 0 ), + 'PROB' => array( 317, -1, 2, 0 ), + 'DEVSQ' => array( 318, -1, 0, 0 ), + 'GEOMEAN' => array( 319, -1, 0, 0 ), + 'HARMEAN' => array( 320, -1, 0, 0 ), + 'SUMSQ' => array( 321, -1, 0, 0 ), + 'KURT' => array( 322, -1, 0, 0 ), + 'SKEW' => array( 323, -1, 0, 0 ), + 'ZTEST' => array( 324, -1, 0, 0 ), + 'LARGE' => array( 325, 2, 0, 0 ), + 'SMALL' => array( 326, 2, 0, 0 ), + 'QUARTILE' => array( 327, 2, 0, 0 ), + 'PERCENTILE' => array( 328, 2, 0, 0 ), + 'PERCENTRANK' => array( 329, -1, 0, 0 ), + 'MODE' => array( 330, -1, 2, 0 ), + 'TRIMMEAN' => array( 331, 2, 0, 0 ), + 'TINV' => array( 332, 2, 1, 0 ), + 'CONCATENATE' => array( 336, -1, 1, 0 ), + 'POWER' => array( 337, 2, 1, 0 ), + 'RADIANS' => array( 342, 1, 1, 0 ), + 'DEGREES' => array( 343, 1, 1, 0 ), + 'SUBTOTAL' => array( 344, -1, 0, 0 ), + 'SUMIF' => array( 345, -1, 0, 0 ), + 'COUNTIF' => array( 346, 2, 0, 0 ), + 'COUNTBLANK' => array( 347, 1, 0, 0 ), + 'ROMAN' => array( 354, -1, 1, 0 ) + ); + } + + /** + * Convert a token to the proper ptg value. + * + * @access private + * @param mixed $token The token to convert. + * @return mixed the converted token on success. PEAR_Error if the token + * is not recognized + */ + function _convert($token) + { + if (preg_match("/^\"[^\"]{0,255}\"$/", $token)) { + return $this->_convertString($token); + + } elseif (is_numeric($token)) { + return $this->_convertNumber($token); + + // match references like A1 or $A$1 + } elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$token)) { + return $this->_convertRef2d($token); + + // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 + } elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z](\d+)$/u",$token)) { + return $this->_convertRef3d($token); + + // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 + } elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z](\d+)$/u",$token)) { + return $this->_convertRef3d($token); + + // match ranges like A1:B2 + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) { + return $this->_convertRange2d($token); + + // match ranges like A1..B2 + } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) { + return $this->_convertRange2d($token); + + // match external ranges like Sheet1!A1 or Sheet1:Sheet2!A1:B2 + } elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/u",$token)) { + return $this->_convertRange3d($token); + + // match external ranges like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 + } elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/u",$token)) { + return $this->_convertRange3d($token); + + // operators (including parentheses) + } elseif (isset($this->ptg[$token])) { + return pack("C", $this->ptg[$token]); + + // commented so argument number can be processed correctly. See toReversePolish(). + /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token)) + { + return($this->_convertFunction($token,$this->_func_args)); + }*/ + + // if it's an argument, ignore the token (the argument remains) + } elseif ($token == 'arg') { + return ''; + } + // TODO: use real error codes + return $this->raiseError("Unknown token $token"); + } + + /** + * Convert a number token to ptgInt or ptgNum + * + * @access private + * @param mixed $num an integer or double for conversion to its ptg value + */ + function _convertNumber($num) + { + // Integer in the range 0..2**16-1 + if ((preg_match("/^\d+$/", $num)) and ($num <= 65535)) { + return pack("Cv", $this->ptg['ptgInt'], $num); + } else { // A float + if ($this->_byte_order) { // if it's Big Endian + $num = strrev($num); + } + return pack("Cd", $this->ptg['ptgNum'], $num); + } + } + + /** + * Convert a string token to ptgStr + * + * @access private + * @param string $string A string for conversion to its ptg value. + * @return mixed the converted token on success. PEAR_Error if the string + * is longer than 255 characters. + */ + function _convertString($string) + { + // chop away beggining and ending quotes + $string = substr($string, 1, strlen($string) - 2); + if (strlen($string) > 255) { + return $this->raiseError("String is too long"); + } + + if ($this->_BIFF_version == 0x0500) { + return pack("CC", $this->ptg['ptgStr'], strlen($string)).$string; + } elseif ($this->_BIFF_version == 0x0600) { + $encoding = 0; // TODO: Unicode support + return pack("CCC", $this->ptg['ptgStr'], strlen($string), $encoding).$string; + } + } + + /** + * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of + * args that it takes. + * + * @access private + * @param string $token The name of the function for convertion to ptg value. + * @param integer $num_args The number of arguments the function receives. + * @return string The packed ptg for the function + */ + function _convertFunction($token, $num_args) + { + $args = $this->_functions[$token][1]; + $volatile = $this->_functions[$token][3]; + + // Fixed number of args eg. TIME($i,$j,$k). + if ($args >= 0) { + return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); + } + // Variable number of args eg. SUM($i,$j,$k, ..). + if ($args == -1) { + return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); + } + } + + /** + * Convert an Excel range such as A1:D4 to a ptgRefV. + * + * @access private + * @param string $range An Excel range in the A1:A2 or A1..A2 format. + */ + function _convertRange2d($range, $class=0) + { + + // TODO: possible class value 0,1,2 check Formula.pm + // Split the range into 2 cell refs + if (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\:([A-Ia-i]?[A-Za-z])(\d+)$/", $range)) { + list($cell1, $cell2) = split(':', $range); + } elseif (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\.\.([A-Ia-i]?[A-Za-z])(\d+)$/", $range)) { + list($cell1, $cell2) = split('\.\.', $range); + + } else { + // TODO: use real error codes + return $this->raiseError("Unknown range separator", 0, PEAR_ERROR_DIE); + } + + // Convert the cell references + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if (PEAR::isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if (PEAR::isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea']); + } elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgAreaV']); + } elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgAreaA']); + } else { + // TODO: use real error codes + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + return $ptgArea . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to + * a ptgArea3d. + * + * @access private + * @param string $token An Excel range in the Sheet1!A1:A2 format. + * @return mixed The packed ptgArea3d token on success, PEAR_Error on failure. + */ + function _convertRange3d($token) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $range) = split('!', $token); + + // Convert the external reference part (different for BIFF8) + if ($this->_BIFF_version == 0x0500) { + $ext_ref = $this->_packExtRef($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } elseif ($this->_BIFF_version == 0x0600) { + $ext_ref = $this->_getRefIndex($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + + // Split the range into 2 cell refs + list($cell1, $cell2) = split(':', $range); + + // Convert the cell references + if (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/", $cell1)) { + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if (PEAR::isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if (PEAR::isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + } else { // It's a rows range (like 26:27) + $cells_array = $this->_rangeToPackedRange($cell1.':'.$cell2); + if (PEAR::isError($cells_array)) { + return $cells_array; + } + list($row1, $col1, $row2, $col2) = $cells_array; + } + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea3d']); + } elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgArea3dV']); + } elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgArea3dA']); + } else { + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. + * + * @access private + * @param string $cell An Excel cell reference + * @return string The cell in packed() format with the corresponding ptg + */ + function _convertRef2d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Convert the cell reference + $cell_array = $this->_cellToPackedRowcol($cell); + if (PEAR::isError($cell_array)) { + return $cell_array; + } + list($row, $col) = $cell_array; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef']); + } elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRefV']); + } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRefA']); + } else { + // TODO: use real error codes + return $this->raiseError("Unknown class $class"); + } + return $ptgRef.$row.$col; + } + + /** + * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a + * ptgRef3d. + * + * @access private + * @param string $cell An Excel cell reference + * @return mixed The packed ptgRef3d token on success, PEAR_Error on failure. + */ + function _convertRef3d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $cell) = split('!', $cell); + + // Convert the external reference part (different for BIFF8) + if ($this->_BIFF_version == 0x0500) { + $ext_ref = $this->_packExtRef($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } elseif ($this->_BIFF_version == 0x0600) { + $ext_ref = $this->_getRefIndex($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + + // Convert the cell reference part + list($row, $col) = $this->_cellToPackedRowcol($cell); + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef3d']); + } elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRef3dV']); + } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRef3dA']); + } else { + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + + return $ptgRef . $ext_ref. $row . $col; + } + + /** + * Convert the sheet name part of an external reference, for example "Sheet1" or + * "Sheet1:Sheet2", to a packed structure. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return string The reference index in packed() format + */ + function _packExtRef($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = split(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // References are stored relative to 0xFFFF. + $offset = -1 - $sheet1; + + return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); + } + + /** + * Look up the REF index that corresponds to an external sheet name + * (or range). If it doesn't exist yet add it to the workbook's references + * array. It assumes all sheet names given must exist. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return mixed The reference index in packed() format on success, + * PEAR_Error on failure + */ + function _getRefIndex($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = split(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // assume all references belong to this document + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); + $total_references = count($this->_references); + $index = -1; + for ($i = 0; $i < $total_references; $i++) { + if ($ref == $this->_references[$i]) { + $index = $i; + break; + } + } + // if REF was not found add it to references array + if ($index == -1) { + $this->_references[$total_references] = $ref; + $index = $total_references; + } + + return pack('v', $index); + } + + /** + * Look up the index that corresponds to an external sheet name. The hash of + * sheet names is updated by the addworksheet() method of the + * Spreadsheet_Excel_Writer_Workbook class. + * + * @access private + * @return integer The sheet index, -1 if the sheet was not found + */ + function _getSheetIndex($sheet_name) + { + if (!isset($this->_ext_sheets[$sheet_name])) { + return -1; + } else { + return $this->_ext_sheets[$sheet_name]; + } + } + + /** + * This method is used to update the array of sheet names. It is + * called by the addWorksheet() method of the + * Spreadsheet_Excel_Writer_Workbook class. + * + * @access public + * @see Spreadsheet_Excel_Writer_Workbook::addWorksheet() + * @param string $name The name of the worksheet being added + * @param integer $index The index of the worksheet being added + */ + function setExtSheet($name, $index) + { + $this->_ext_sheets[$name] = $index; + } + + /** + * pack() row and column into the required 3 or 4 byte format. + * + * @access private + * @param string $cell The Excel cell reference to be packed + * @return array Array containing the row and column in packed() format + */ + function _cellToPackedRowcol($cell) + { + $cell = strtoupper($cell); + list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); + if ($col >= 256) { + return $this->raiseError("Column in: $cell greater than 255"); + } + // FIXME: change for BIFF8 + if ($row >= 16384) { + return $this->raiseError("Row in: $cell greater than 16384 "); + } + + // Set the high bits to indicate if row or col are relative. + if ($this->_BIFF_version == 0x0500) { + $row |= $col_rel << 14; + $row |= $row_rel << 15; + $col = pack('C', $col); + } elseif ($this->_BIFF_version == 0x0600) { + $col |= $col_rel << 14; + $col |= $row_rel << 15; + $col = pack('v', $col); + } + $row = pack('v', $row); + + return array($row, $col); + } + + /** + * pack() row range into the required 3 or 4 byte format. + * Just using maximum col/rows, which is probably not the correct solution + * + * @access private + * @param string $range The Excel range to be packed + * @return array Array containing (row1,col1,row2,col2) in packed() format + */ + function _rangeToPackedRange($range) + { + preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); + // return absolute rows if there is a $ in the ref + $row1_rel = empty($match[1]) ? 1 : 0; + $row1 = $match[2]; + $row2_rel = empty($match[3]) ? 1 : 0; + $row2 = $match[4]; + // Convert 1-index to zero-index + $row1--; + $row2--; + // Trick poor inocent Excel + $col1 = 0; + $col2 = 16383; // FIXME: maximum possible value for Excel 5 (change this!!!) + + // FIXME: this changes for BIFF8 + if (($row1 >= 16384) or ($row2 >= 16384)) { + return $this->raiseError("Row in: $range greater than 16384 "); + } + + // Set the high bits to indicate if rows are relative. + if ($this->_BIFF_version == 0x0500) { + $row1 |= $row1_rel << 14; // FIXME: probably a bug + $row2 |= $row2_rel << 15; + $col1 = pack('C', $col1); + $col2 = pack('C', $col2); + } elseif ($this->_BIFF_version == 0x0600) { + $col1 |= $row1_rel << 15; + $col2 |= $row2_rel << 15; + $col1 = pack('v', $col1); + $col2 = pack('v', $col2); + } + $row1 = pack('v', $row1); + $row2 = pack('v', $row2); + + return array($row1, $col1, $row2, $col2); + } + + /** + * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero + * indexed row and column number. Also returns two (0,1) values to indicate + * whether the row or column are relative references. + * + * @access private + * @param string $cell The Excel cell reference in A1 format. + * @return array + */ + function _cellToRowcol($cell) + { + preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match); + // return absolute column if there is a $ in the ref + $col_rel = empty($match[1]) ? 1 : 0; + $col_ref = $match[2]; + $row_rel = empty($match[3]) ? 1 : 0; + $row = $match[4]; + + // Convert base26 column string to a number. + $expn = strlen($col_ref) - 1; + $col = 0; + $col_ref_length = strlen($col_ref); + for ($i = 0; $i < $col_ref_length; $i++) { + $col += (ord($col_ref{$i}) - ord('A') + 1) * pow(26, $expn); + $expn--; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return array($row, $col, $row_rel, $col_rel); + } + + /** + * Advance to the next valid token. + * + * @access private + */ + function _advance() + { + $i = $this->_current_char; + $formula_length = strlen($this->_formula); + // eat up white spaces + if ($i < $formula_length) { + while ($this->_formula{$i} == " ") { + $i++; + } + + if ($i < ($formula_length - 1)) { + $this->_lookahead = $this->_formula{$i+1}; + } + $token = ''; + } + + while ($i < $formula_length) { + $token .= $this->_formula{$i}; + if ($i < ($formula_length - 1)) { + $this->_lookahead = $this->_formula{$i+1}; + } else { + $this->_lookahead = ''; + } + + if ($this->_match($token) != '') { + //if ($i < strlen($this->_formula) - 1) { + // $this->_lookahead = $this->_formula{$i+1}; + //} + $this->_current_char = $i + 1; + $this->_current_token = $token; + return 1; + } + + if ($i < ($formula_length - 2)) { + $this->_lookahead = $this->_formula{$i+2}; + } else { // if we run out of characters _lookahead becomes empty + $this->_lookahead = ''; + } + $i++; + } + //die("Lexical error ".$this->_current_char); + } + + /** + * Checks if it's a valid token. + * + * @access private + * @param mixed $token The token to check. + * @return mixed The checked token or false on failure + */ + function _match($token) + { + switch($token) { + case SPREADSHEET_EXCEL_WRITER_ADD: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_SUB: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_MUL: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_DIV: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_OPEN: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_CLOSE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_COMA: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_SEMICOLON: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_GT: + if ($this->_lookahead == '=') { // it's a GE token + break; + } + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_LT: + // it's a LE or a NE token + if (($this->_lookahead == '=') or ($this->_lookahead == '>')) { + break; + } + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_GE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_LE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_EQ: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_NE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_CONCAT: + return $token; + break; + default: + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.') and + ($this->_lookahead != '!')) + { + return $token; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1) + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // if it's a range (A1:A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // if it's a range (A1..A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's an external range like Sheet1!A1 or Sheet1:Sheet2!A1:B2 + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's an external range like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's a number (check that it's not a sheet name or range) + elseif (is_numeric($token) and + (!is_numeric($token.$this->_lookahead) or ($this->_lookahead == '')) and + ($this->_lookahead != '!') and ($this->_lookahead != ':')) + { + return $token; + } + // If it's a string (of maximum 255 characters) + elseif (preg_match("/^\"[^\"]{0,255}\"$/",$token)) + { + return $token; + } + // if it's a function call + elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$token) and ($this->_lookahead == "(")) + { + return $token; + } + return ''; + } + } + + /** + * The parsing method. It parses a formula. + * + * @access public + * @param string $formula The formula to parse, without the initial equal + * sign (=). + * @return mixed true on success, PEAR_Error on failure + */ + function parse($formula) + { + $this->_current_char = 0; + $this->_formula = $formula; + $this->_lookahead = $formula{1}; + $this->_advance(); + $this->_parse_tree = $this->_condition(); + if (PEAR::isError($this->_parse_tree)) { + return $this->_parse_tree; + } + return true; + } + + /** + * It parses a condition. It assumes the following rule: + * Cond -> Expr [(">" | "<") Expr] + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _condition() + { + $result = $this->_expression(); + if (PEAR::isError($result)) { + return $result; + } + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LT) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLT', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GT) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGT', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LE) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLE', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GE) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGE', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_EQ) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgEQ', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_NE) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgNE', $result, $result2); + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_CONCAT) { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgConcat', $result, $result2); + } + return $result; + } + + /** + * It parses a expression. It assumes the following rule: + * Expr -> Term [("+" | "-") Term] + * -> "string" + * -> "-" Term + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _expression() + { + // If it's a string return a string node + if (preg_match("/^\"[^\"]{0,255}\"$/", $this->_current_token)) { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB) { + // catch "-" Term + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgUminus', $result2, ''); + return $result; + } + $result = $this->_term(); + if (PEAR::isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB)) { + /**/ + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) { + $this->_advance(); + $result2 = $this->_term(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgAdd', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_term(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgSub', $result, $result2); + } + } + return $result; + } + + /** + * This function just introduces a ptgParen element in the tree, so that Excel + * doesn't get confused when working with a parenthesized formula afterwards. + * + * @access private + * @see _fact() + * @return array The parsed ptg'd tree + */ + function _parenthesizedExpression() + { + $result = $this->_createTree('ptgParen', $this->_expression(), ''); + return $result; + } + + /** + * It parses a term. It assumes the following rule: + * Term -> Fact [("*" | "/") Fact] + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _term() + { + $result = $this->_fact(); + if (PEAR::isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_DIV)) { + /**/ + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) { + $this->_advance(); + $result2 = $this->_fact(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgMul', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_fact(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgDiv', $result, $result2); + } + } + return $result; + } + + /** + * It parses a factor. It assumes the following rule: + * Fact -> ( Expr ) + * | CellRef + * | CellRange + * | Number + * | Function + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _fact() + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN) { + $this->_advance(); // eat the "(" + $result = $this->_parenthesizedExpression(); + if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) { + return $this->raiseError("')' token expected."); + } + $this->_advance(); // eat the ")" + return $result; + } + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/u",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1) + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/u",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a range + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token) or + preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + // If it's an external range (Sheet1!A1 or Sheet1!A1:B2) + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + // If it's an external range ('Sheet1'!A1 or 'Sheet1'!A1:B2) + elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + elseif (is_numeric($this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a function call + elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$this->_current_token)) + { + $result = $this->_func(); + return $result; + } + return $this->raiseError("Syntax error: ".$this->_current_token. + ", lookahead: ".$this->_lookahead. + ", current char: ".$this->_current_char); + } + + /** + * It parses a function call. It assumes the following rule: + * Func -> ( Expr [,Expr]* ) + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _func() + { + $num_args = 0; // number of arguments received + $function = strtoupper($this->_current_token); + $result = ''; // initialize result + $this->_advance(); + $this->_advance(); // eat the "(" + while ($this->_current_token != ')') { + /**/ + if ($num_args > 0) { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_COMA or + $this->_current_token == SPREADSHEET_EXCEL_WRITER_SEMICOLON) + { + $this->_advance(); // eat the "," or ";" + } else { + return $this->raiseError("Syntax error: comma expected in ". + "function $function, arg #{$num_args}"); + } + $result2 = $this->_condition(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', $result, $result2); + } else { // first argument + $result2 = $this->_condition(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', '', $result2); + } + $num_args++; + } + if (!isset($this->_functions[$function])) { + return $this->raiseError("Function $function() doesn't exist"); + } + $args = $this->_functions[$function][1]; + // If fixed number of args eg. TIME($i,$j,$k). Check that the number of args is valid. + if (($args >= 0) and ($args != $num_args)) { + return $this->raiseError("Incorrect number of arguments in function $function() "); + } + + $result = $this->_createTree($function, $result, $num_args); + $this->_advance(); // eat the ")" + return $result; + } + + /** + * Creates a tree. In fact an array which may have one or two arrays (sub-trees) + * as elements. + * + * @access private + * @param mixed $value The value of this node. + * @param mixed $left The left array (sub-tree) or a final node. + * @param mixed $right The right array (sub-tree) or a final node. + * @return array A tree + */ + function _createTree($value, $left, $right) + { + return array('value' => $value, 'left' => $left, 'right' => $right); + } + + /** + * Builds a string containing the tree in reverse polish notation (What you + * would use in a HP calculator stack). + * The following tree: + * + * + + * / \ + * 2 3 + * + * produces: "23+" + * + * The following tree: + * + * + + * / \ + * 3 * + * / \ + * 6 A1 + * + * produces: "36A1*+" + * + * In fact all operands, functions, references, etc... are written as ptg's + * + * @access public + * @param array $tree The optional tree to convert. + * @return string The tree in reverse polish notation + */ + function toReversePolish($tree = array()) + { + $polish = ""; // the string we are going to return + if (empty($tree)) { // If it's the first call use _parse_tree + $tree = $this->_parse_tree; + } + if (is_array($tree['left'])) { + $converted_tree = $this->toReversePolish($tree['left']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } elseif ($tree['left'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['left']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + if (is_array($tree['right'])) { + $converted_tree = $this->toReversePolish($tree['right']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } elseif ($tree['right'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['right']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + // if it's a function convert it here (so we can set it's arguments) + if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and + !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and + !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and + !is_numeric($tree['value']) and + !isset($this->ptg[$tree['value']])) + { + // left subtree for a function is always an array. + if ($tree['left'] != '') { + $left_tree = $this->toReversePolish($tree['left']); + } else { + $left_tree = ''; + } + if (PEAR::isError($left_tree)) { + return $left_tree; + } + // add it's left subtree and return. + return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); + } else { + $converted_tree = $this->_convert($tree['value']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + } + $polish .= $converted_tree; + return $polish; + } +} +?> diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Validator.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Validator.php new file mode 100644 index 000000000..0f091c61d --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Validator.php @@ -0,0 +1,230 @@ +<?php +/* +* Module written by Herman Kuiper <herman@ozuzo.net> +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +//require_once('PEAR.php'); + +// Possible operator types + +/* +FIXME: change prefixes +*/ +define("OP_BETWEEN", 0x00); +define("OP_NOTBETWEEN", 0x01); +define("OP_EQUAL", 0x02); +define("OP_NOTEQUAL", 0x03); +define("OP_GT", 0x04); +define("OP_LT", 0x05); +define("OP_GTE", 0x06); +define("OP_LTE", 0x07); + +/** +* Baseclass for generating Excel DV records (validations) +* +* @author Herman Kuiper +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ +class Spreadsheet_Excel_Writer_Validator +{ + var $_type; + var $_style; + var $_fixedList; + var $_blank; + var $_incell; + var $_showprompt; + var $_showerror; + var $_title_prompt; + var $_descr_prompt; + var $_title_error; + var $_descr_error; + var $_operator; + var $_formula1; + var $_formula2; + /** + * The parser from the workbook. Used to parse validation formulas also + * @var Spreadsheet_Excel_Writer_Parser + */ + var $_parser; + + function Spreadsheet_Excel_Writer_Validator(&$parser) + { + $this->_parser = $parser; + $this->_type = 0x01; // FIXME: add method for setting datatype + $this->_style = 0x00; + $this->_fixedList = false; + $this->_blank = false; + $this->_incell = false; + $this->_showprompt = false; + $this->_showerror = true; + $this->_title_prompt = "\x00"; + $this->_descr_prompt = "\x00"; + $this->_title_error = "\x00"; + $this->_descr_error = "\x00"; + $this->_operator = 0x00; // default is equal + $this->_formula1 = ''; + $this->_formula2 = ''; + } + + function setPrompt($promptTitle = "\x00", $promptDescription = "\x00", $showPrompt = true) + { + $this->_showprompt = $showPrompt; + $this->_title_prompt = $promptTitle; + $this->_descr_prompt = $promptDescription; + } + + function setError($errorTitle = "\x00", $errorDescription = "\x00", $showError = true) + { + $this->_showerror = $showError; + $this->_title_error = $errorTitle; + $this->_descr_error = $errorDescription; + } + + function allowBlank() + { + $this->_blank = true; + } + + function onInvalidStop() + { + $this->_style = 0x00; + } + + function onInvalidWarn() + { + $this->_style = 0x01; + } + + function onInvalidInfo() + { + $this->_style = 0x02; + } + + function setFormula1($formula) + { + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if (PEAR::isError($error)) { + return $this->_formula1; + } + + $this->_formula1 = $this->_parser->toReversePolish(); + if (PEAR::isError($this->_formula1)) { + return $this->_formula1; + } + return true; + } + + function setFormula2($formula) + { + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if (PEAR::isError($error)) { + return $this->_formula2; + } + + $this->_formula2 = $this->_parser->toReversePolish(); + if (PEAR::isError($this->_formula2)) { + return $this->_formula2; + } + return true; + } + + function _getOptions() + { + $options = $this->_type; + $options |= $this->_style << 3; + if ($this->_fixedList) { + $options |= 0x80; + } + if ($this->_blank) { + $options |= 0x100; + } + if (!$this->_incell) { + $options |= 0x200; + } + if ($this->_showprompt) { + $options |= 0x40000; + } + if ($this->_showerror) { + $options |= 0x80000; + } + $options |= $this->_operator << 20; + + return $options; + } + + function _getData() + { + $title_prompt_len = strlen($this->_title_prompt); + $descr_prompt_len = strlen($this->_descr_prompt); + $title_error_len = strlen($this->_title_error); + $descr_error_len = strlen($this->_descr_error); + + $formula1_size = strlen($this->_formula1); + $formula2_size = strlen($this->_formula2); + + $data = pack("V", $this->_getOptions()); + $data .= pack("vC", $title_prompt_len, 0x00) . $this->_title_prompt; + $data .= pack("vC", $title_error_len, 0x00) . $this->_title_error; + $data .= pack("vC", $descr_prompt_len, 0x00) . $this->_descr_prompt; + $data .= pack("vC", $descr_error_len, 0x00) . $this->_descr_error; + + $data .= pack("vv", $formula1_size, 0x0000) . $this->_formula1; + $data .= pack("vv", $formula2_size, 0x0000) . $this->_formula2; + + return $data; + } +} + +/*class Spreadsheet_Excel_Writer_Validation_List extends Spreadsheet_Excel_Writer_Validation +{ + function Spreadsheet_Excel_Writer_Validation_list() + { + parent::Spreadsheet_Excel_Writer_Validation(); + $this->_type = 0x03; + } + + function setList($source, $incell = true) + { + $this->_incell = $incell; + $this->_fixedList = true; + + $source = implode("\x00", $source); + $this->_formula1 = pack("CCC", 0x17, strlen($source), 0x0c) . $source; + } + + function setRow($row, $col1, $col2, $incell = true) + { + $this->_incell = $incell; + //$this->_formula1 = ...; + } + + function setCol($col, $row1, $row2, $incell = true) + { + $this->_incell = $incell; + //$this->_formula1 = ...; + } +}*/ + +?> diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Workbook.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Workbook.php new file mode 100644 index 000000000..3c20f5313 --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Workbook.php @@ -0,0 +1,1592 @@ +<?php +/* +* Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* <jmcnamara@cpan.org> +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Format.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/BIFFwriter.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Worksheet.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Parser.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/OLE/PPS/Root.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/OLE/PPS/File.php'; + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer <xnoguer@rezebra.com> +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Filename for the Workbook + * @var string + */ + var $_filename; + + /** + * Formula parser + * @var object Parser + */ + var $_parser; + + /** + * Flag for 1904 date system (0 => base date is 1900, 1 => base date is 1904) + * @var integer + */ + var $_1904; + + /** + * The active worksheet of the workbook (0 indexed) + * @var integer + */ + var $_activesheet; + + /** + * 1st displayed worksheet in the workbook (0 indexed) + * @var integer + */ + var $_firstsheet; + + /** + * Number of workbook tabs selected + * @var integer + */ + var $_selected; + + /** + * Index for creating adding new formats to the workbook + * @var integer + */ + var $_xf_index; + + /** + * Flag for preventing close from being called twice. + * @var integer + * @see close() + */ + var $_fileclosed; + + /** + * The BIFF file size for the workbook. + * @var integer + * @see _calcSheetOffsets() + */ + var $_biffsize; + + /** + * The default sheetname for all sheets created. + * @var string + */ + var $_sheetname; + + /** + * The default XF format. + * @var object Format + */ + var $_tmp_format; + + /** + * Array containing references to all of this workbook's worksheets + * @var array + */ + var $_worksheets; + + /** + * Array of sheetnames for creating the EXTERNSHEET records + * @var array + */ + var $_sheetnames; + + /** + * Array containing references to all of this workbook's formats + * @var array + */ + var $_formats; + + /** + * Array containing the colour palette + * @var array + */ + var $_palette; + + /** + * The default format for URLs. + * @var object Format + */ + var $_url_format; + + /** + * The codepage indicates the text encoding used for strings + * @var integer + */ + var $_codepage; + + /** + * The country code used for localization + * @var integer + */ + var $_country_code; + + /** + * number of bytes for sizeinfo of strings + * @var integer + */ + var $_string_sizeinfo_size; + + /** + * Class constructor + * + * @param string filename for storing the workbook. "-" for writing to stdout. + * @access public + */ + function Spreadsheet_Excel_Writer_Workbook($filename) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + + $this->_filename = $filename; + $this->_parser =& new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); + $this->_1904 = 0; + $this->_activesheet = 0; + $this->_firstsheet = 0; + $this->_selected = 0; + $this->_xf_index = 16; // 15 style XF's and 1 cell XF. + $this->_fileclosed = 0; + $this->_biffsize = 0; + $this->_sheetname = 'Sheet'; + $this->_tmp_format =& new Spreadsheet_Excel_Writer_Format($this->_BIFF_version); + $this->_worksheets = array(); + $this->_sheetnames = array(); + $this->_formats = array(); + $this->_palette = array(); + $this->_codepage = 0x04E4; // FIXME: should change for BIFF8 + $this->_country_code = -1; + $this->_string_sizeinfo = 3; + + // Add the default format for hyperlinks + $this->_url_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); + $this->_str_total = 0; + $this->_str_unique = 0; + $this->_str_table = array(); + $this->_setPaletteXl97(); + } + + /** + * Calls finalization methods. + * This method should always be the last one to be called on every workbook + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function close() + { + if ($this->_fileclosed) { // Prevent close() from being called twice. + return true; + } + $res = $this->_storeWorkbook(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + $this->_fileclosed = 1; + return true; + } + + /** + * An accessor for the _worksheets[] array + * Returns an array of the worksheet objects in a workbook + * It actually calls to worksheets() + * + * @access public + * @see worksheets() + * @return array + */ + function sheets() + { + return $this->worksheets(); + } + + /** + * An accessor for the _worksheets[] array. + * Returns an array of the worksheet objects in a workbook + * + * @access public + * @return array + */ + function worksheets() + { + return $this->_worksheets; + } + + /** + * Sets the BIFF version. + * This method exists just to access experimental functionality + * from BIFF8. It will be deprecated ! + * Only possible value is 8 (Excel 97/2000). + * For any other value it fails silently. + * + * @access public + * @param integer $version The BIFF version + */ + function setVersion($version) + { + if ($version == 8) { // only accept version 8 + $version = 0x0600; + $this->_BIFF_version = $version; + // change BIFFwriter limit for CONTINUE records + $this->_limit = 8228; + $this->_tmp_format->_BIFF_version = $version; + $this->_url_format->_BIFF_version = $version; + $this->_parser->_BIFF_version = $version; + $this->_codepage = 0x04B0; + + $total_worksheets = count($this->_worksheets); + // change version for all worksheets too + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->_BIFF_version = $version; + } + + $total_formats = count($this->_formats); + // change version for all formats too + for ($i = 0; $i < $total_formats; $i++) { + $this->_formats[$i]->_BIFF_version = $version; + } + } + } + + /** + * Set the country identifier for the workbook + * + * @access public + * @param integer $code Is the international calling country code for the + * chosen country. + */ + function setCountry($code) + { + $this->_country_code = $code; + } + + /** + * Add a new worksheet to the Excel workbook. + * If no name is given the name of the worksheet will be Sheeti$i, with + * $i in [1..]. + * + * @access public + * @param string $name the optional name of the worksheet + * @return mixed reference to a worksheet object on success, PEAR_Error + * on failure + */ + function &addWorksheet($name = '') + { + $index = count($this->_worksheets); + $sheetname = $this->_sheetname; + + if ($name == '') { + $name = $sheetname.($index+1); + } + + // Check that sheetname is <= 31 chars (Excel limit before BIFF8). + if ($this->_BIFF_version != 0x0600) + { + if (strlen($name) > 31) { + return $this->raiseError("Sheetname $name must be <= 31 chars"); + } + } + + // Check that the worksheet name doesn't already exist: a fatal Excel error. + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->getName() == $name) { + return $this->raiseError("Worksheet '$name' already exists"); + } + } + + $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, + $name, $index, + $this->_activesheet, $this->_firstsheet, + $this->_str_total, $this->_str_unique, + $this->_str_table, $this->_url_format, + $this->_parser, $this->_tmp_dir); + + $this->_worksheets[$index] = &$worksheet; // Store ref for iterator + $this->_sheetnames[$index] = $name; // Store EXTERNSHEET names + $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser + return $worksheet; + } + + /** + * Add a new format to the Excel workbook. + * Also, pass any properties to the Format constructor. + * + * @access public + * @param array $properties array with properties for initializing the format. + * @return &Spreadsheet_Excel_Writer_Format reference to an Excel Format + */ + function &addFormat($properties = array()) + { + $format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version, $this->_xf_index, $properties); + $this->_xf_index += 1; + $this->_formats[] = &$format; + return $format; + } + + /** + * Create new validator. + * + * @access public + * @return &Spreadsheet_Excel_Writer_Validator reference to a Validator + */ + function &addValidator() + { + global $FANNIE_ROOT; + include_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Validator.php'; + /* FIXME: check for successful inclusion*/ + $valid = new Spreadsheet_Excel_Writer_Validator($this->_parser); + return $valid; + } + + /** + * Change the RGB components of the elements in the colour palette. + * + * @access public + * @param integer $index colour index + * @param integer $red red RGB value [0-255] + * @param integer $green green RGB value [0-255] + * @param integer $blue blue RGB value [0-255] + * @return integer The palette index for the custom color + */ + function setCustomColor($index, $red, $green, $blue) + { + // Match a HTML #xxyyzz style parameter + /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { + @_ = ($_[0], hex $1, hex $2, hex $3); + }*/ + + // Check that the colour index is the right range + if ($index < 8 or $index > 64) { + // TODO: assign real error codes + return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); + } + + // Check that the colour components are in the right range + if (($red < 0 or $red > 255) || + ($green < 0 or $green > 255) || + ($blue < 0 or $blue > 255)) + { + return $this->raiseError("Color component outside range: 0 <= color <= 255"); + } + + $index -= 8; // Adjust colour index (wingless dragonfly) + + // Set the RGB value + $this->_palette[$index] = array($red, $green, $blue, 0); + return($index + 8); + } + + /** + * Sets the colour palette to the Excel 97+ default. + * + * @access private + */ + function _setPaletteXl97() + { + $this->_palette = array( + array(0x00, 0x00, 0x00, 0x00), // 8 + array(0xff, 0xff, 0xff, 0x00), // 9 + array(0xff, 0x00, 0x00, 0x00), // 10 + array(0x00, 0xff, 0x00, 0x00), // 11 + array(0x00, 0x00, 0xff, 0x00), // 12 + array(0xff, 0xff, 0x00, 0x00), // 13 + array(0xff, 0x00, 0xff, 0x00), // 14 + array(0x00, 0xff, 0xff, 0x00), // 15 + array(0x80, 0x00, 0x00, 0x00), // 16 + array(0x00, 0x80, 0x00, 0x00), // 17 + array(0x00, 0x00, 0x80, 0x00), // 18 + array(0x80, 0x80, 0x00, 0x00), // 19 + array(0x80, 0x00, 0x80, 0x00), // 20 + array(0x00, 0x80, 0x80, 0x00), // 21 + array(0xc0, 0xc0, 0xc0, 0x00), // 22 + array(0x80, 0x80, 0x80, 0x00), // 23 + array(0x99, 0x99, 0xff, 0x00), // 24 + array(0x99, 0x33, 0x66, 0x00), // 25 + array(0xff, 0xff, 0xcc, 0x00), // 26 + array(0xcc, 0xff, 0xff, 0x00), // 27 + array(0x66, 0x00, 0x66, 0x00), // 28 + array(0xff, 0x80, 0x80, 0x00), // 29 + array(0x00, 0x66, 0xcc, 0x00), // 30 + array(0xcc, 0xcc, 0xff, 0x00), // 31 + array(0x00, 0x00, 0x80, 0x00), // 32 + array(0xff, 0x00, 0xff, 0x00), // 33 + array(0xff, 0xff, 0x00, 0x00), // 34 + array(0x00, 0xff, 0xff, 0x00), // 35 + array(0x80, 0x00, 0x80, 0x00), // 36 + array(0x80, 0x00, 0x00, 0x00), // 37 + array(0x00, 0x80, 0x80, 0x00), // 38 + array(0x00, 0x00, 0xff, 0x00), // 39 + array(0x00, 0xcc, 0xff, 0x00), // 40 + array(0xcc, 0xff, 0xff, 0x00), // 41 + array(0xcc, 0xff, 0xcc, 0x00), // 42 + array(0xff, 0xff, 0x99, 0x00), // 43 + array(0x99, 0xcc, 0xff, 0x00), // 44 + array(0xff, 0x99, 0xcc, 0x00), // 45 + array(0xcc, 0x99, 0xff, 0x00), // 46 + array(0xff, 0xcc, 0x99, 0x00), // 47 + array(0x33, 0x66, 0xff, 0x00), // 48 + array(0x33, 0xcc, 0xcc, 0x00), // 49 + array(0x99, 0xcc, 0x00, 0x00), // 50 + array(0xff, 0xcc, 0x00, 0x00), // 51 + array(0xff, 0x99, 0x00, 0x00), // 52 + array(0xff, 0x66, 0x00, 0x00), // 53 + array(0x66, 0x66, 0x99, 0x00), // 54 + array(0x96, 0x96, 0x96, 0x00), // 55 + array(0x00, 0x33, 0x66, 0x00), // 56 + array(0x33, 0x99, 0x66, 0x00), // 57 + array(0x00, 0x33, 0x00, 0x00), // 58 + array(0x33, 0x33, 0x00, 0x00), // 59 + array(0x99, 0x33, 0x00, 0x00), // 60 + array(0x99, 0x33, 0x66, 0x00), // 61 + array(0x33, 0x33, 0x99, 0x00), // 62 + array(0x33, 0x33, 0x33, 0x00), // 63 + ); + } + + /** + * Assemble worksheets into a workbook and send the BIFF data to an OLE + * storage. + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeWorkbook() + { + if (count($this->_worksheets) == 0) { + return true; + } + + // Ensure that at least one worksheet has been selected. + if ($this->_activesheet == 0) { + $this->_worksheets[0]->selected = 1; + } + + // Calculate the number of selected worksheet tabs and call the finalization + // methods for each worksheet + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->selected) { + $this->_selected++; + } + $this->_worksheets[$i]->close($this->_sheetnames); + } + + // Add Workbook globals + $this->_storeBof(0x0005); + $this->_storeCodepage(); + if ($this->_BIFF_version == 0x0600) { + $this->_storeWindow1(); + } + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterns(); // For print area and repeat rows + } + $this->_storeNames(); // For print area and repeat rows + if ($this->_BIFF_version == 0x0500) { + $this->_storeWindow1(); + } + $this->_storeDatemode(); + $this->_storeAllFonts(); + $this->_storeAllNumFormats(); + $this->_storeAllXfs(); + $this->_storeAllStyles(); + $this->_storePalette(); + $this->_calcSheetOffsets(); + + // Add BOUNDSHEET records + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); + } + + if ($this->_country_code != -1) { + $this->_storeCountry(); + } + + if ($this->_BIFF_version == 0x0600) { + //$this->_storeSupbookInternal(); + /* TODO: store external SUPBOOK records and XCT and CRN records + in case of external references for BIFF8 */ + //$this->_storeExternsheetBiff8(); + $this->_storeSharedStringsTable(); + } + + // End Workbook globals + $this->_storeEof(); + + // Store the workbook in an OLE container + $res = $this->_storeOLEFile(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + return true; + } + + /** + * Store the workbook in an OLE container + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeOLEFile() + { + if($this->_BIFF_version == 0x0600) { + $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Workbook')); + } else { + $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Book')); + } + if ($this->_tmp_dir != '') { + $OLE->setTempDir($this->_tmp_dir); + } + $res = $OLE->init(); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + $OLE->append($this->_data); + + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + while ($tmp = $this->_worksheets[$i]->getData()) { + $OLE->append($tmp); + } + } + + $root = new OLE_PPS_Root(time(), time(), array($OLE)); + if ($this->_tmp_dir != '') { + $root->setTempDir($this->_tmp_dir); + } + + $res = $root->save($this->_filename); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + return true; + } + + /** + * Calculate offsets for Worksheet BOF records. + * + * @access private + */ + function _calcSheetOffsets() + { + if ($this->_BIFF_version == 0x0600) { + $boundsheet_length = 12; // fixed length for a BOUNDSHEET record + } else { + $boundsheet_length = 11; + } + $EOF = 4; + $offset = $this->_datasize; + + if ($this->_BIFF_version == 0x0600) { + // add the length of the SST + /* TODO: check this works for a lot of strings (> 8224 bytes) */ + $offset += $this->_calculateSharedStringsSizes(); + if ($this->_country_code != -1) { + $offset += 8; // adding COUNTRY record + } + // add the lenght of SUPBOOK, EXTERNSHEET and NAME records + //$offset += 8; // FIXME: calculate real value when storing the records + } + $total_worksheets = count($this->_worksheets); + // add the length of the BOUNDSHEET records + for ($i = 0; $i < $total_worksheets; $i++) { + $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); + } + $offset += $EOF; + + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->offset = $offset; + $offset += $this->_worksheets[$i]->_datasize; + } + $this->_biffsize = $offset; + } + + /** + * Store the Excel FONT records. + * + * @access private + */ + function _storeAllFonts() + { + // tmp_format is added by the constructor. We use this to write the default XF's + $format = $this->_tmp_format; + $font = $format->getFont(); + + // Note: Fonts are 0-indexed. According to the SDK there is no index 4, + // so the following fonts are 0, 1, 2, 3, 5 + // + for ($i = 1; $i <= 5; $i++){ + $this->_append($font); + } + + // Iterate through the XF objects and write a FONT record if it isn't the + // same as the default FONT and if it hasn't already been used. + // + $fonts = array(); + $index = 6; // The first user defined FONT + + $key = $format->getFontKey(); // The default font from _tmp_format + $fonts[$key] = 0; // Index of the default font + + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $key = $this->_formats[$i]->getFontKey(); + if (isset($fonts[$key])) { + // FONT has already been used + $this->_formats[$i]->font_index = $fonts[$key]; + } else { + // Add a new FONT record + $fonts[$key] = $index; + $this->_formats[$i]->font_index = $index; + $index++; + $font = $this->_formats[$i]->getFont(); + $this->_append($font); + } + } + } + + /** + * Store user defined numerical formats i.e. FORMAT records + * + * @access private + */ + function _storeAllNumFormats() + { + // Leaning num_format syndrome + $hash_num_formats = array(); + $num_formats = array(); + $index = 164; + + // Iterate through the XF objects and write a FORMAT record if it isn't a + // built-in format type and if the FORMAT string hasn't already been used. + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $num_format = $this->_formats[$i]->_num_format; + + // Check if $num_format is an index to a built-in format. + // Also check for a string of zeros, which is a valid format string + // but would evaluate to zero. + // + if (!preg_match("/^0+\d/", $num_format)) { + if (preg_match("/^\d+$/", $num_format)) { // built-in format + continue; + } + } + + if (isset($hash_num_formats[$num_format])) { + // FORMAT has already been used + $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; + } else{ + // Add a new FORMAT + $hash_num_formats[$num_format] = $index; + $this->_formats[$i]->_num_format = $index; + array_push($num_formats,$num_format); + $index++; + } + } + + // Write the new FORMAT records starting from 0xA4 + $index = 164; + foreach ($num_formats as $num_format) { + $this->_storeNumFormat($num_format,$index); + $index++; + } + } + + /** + * Write all XF records. + * + * @access private + */ + function _storeAllXfs() + { + // _tmp_format is added by the constructor. We use this to write the default XF's + // The default font index is 0 + // + $format = $this->_tmp_format; + for ($i = 0; $i <= 14; $i++) { + $xf = $format->getXf('style'); // Style XF + $this->_append($xf); + } + + $xf = $format->getXf('cell'); // Cell XF + $this->_append($xf); + + // User defined XFs + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $xf = $this->_formats[$i]->getXf('cell'); + $this->_append($xf); + } + } + + /** + * Write all STYLE records. + * + * @access private + */ + function _storeAllStyles() + { + $this->_storeStyle(); + } + + /** + * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for + * the NAME records. + * + * @access private + */ + function _storeExterns() + { + // Create EXTERNCOUNT with number of worksheets + $this->_storeExterncount(count($this->_worksheets)); + + // Create EXTERNSHEET for each worksheet + foreach ($this->_sheetnames as $sheetname) { + $this->_storeExternsheet($sheetname); + } + } + + /** + * Write the NAME record to define the print area and the repeat rows and cols. + * + * @access private + */ + function _storeNames() + { + // Create the print area NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + // Write a Name record if the print area has been defined + if (isset($this->_worksheets[$i]->print_rowmin)) { + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x06, // NAME type + $this->_worksheets[$i]->print_rowmin, + $this->_worksheets[$i]->print_rowmax, + $this->_worksheets[$i]->print_colmin, + $this->_worksheets[$i]->print_colmax + ); + } + } + + // Create the print title NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + $rowmin = $this->_worksheets[$i]->title_rowmin; + $rowmax = $this->_worksheets[$i]->title_rowmax; + $colmin = $this->_worksheets[$i]->title_colmin; + $colmax = $this->_worksheets[$i]->title_colmax; + + // Determine if row + col, row, col or nothing has been defined + // and write the appropriate record + // + if (isset($rowmin) && isset($colmin)) { + // Row and column titles have been defined. + // Row title has been defined. + $this->_storeNameLong( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } elseif (isset($rowmin)) { + // Row title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + 0x00, + 0xff + ); + } elseif (isset($colmin)) { + // Column title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + 0x0000, + 0x3fff, + $colmin, + $colmax + ); + } else { + // Print title hasn't been defined. + } + } + } + + + + + /****************************************************************************** + * + * BIFF RECORDS + * + */ + + /** + * Stores the CODEPAGE biff record. + * + * @access private + */ + function _storeCodepage() + { + $record = 0x0042; // Record identifier + $length = 0x0002; // Number of bytes to follow + $cv = $this->_codepage; // The code page + + $header = pack('vv', $record, $length); + $data = pack('v', $cv); + + $this->_append($header . $data); + } + + /** + * Write Excel BIFF WINDOW1 record. + * + * @access private + */ + function _storeWindow1() + { + $record = 0x003D; // Record identifier + $length = 0x0012; // Number of bytes to follow + + $xWn = 0x0000; // Horizontal position of window + $yWn = 0x0000; // Vertical position of window + $dxWn = 0x25BC; // Width of window + $dyWn = 0x1572; // Height of window + + $grbit = 0x0038; // Option flags + $ctabsel = $this->_selected; // Number of workbook tabs selected + $wTabRatio = 0x0258; // Tab to scrollbar ratio + + $itabFirst = $this->_firstsheet; // 1st displayed worksheet + $itabCur = $this->_activesheet; // Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, + $grbit, + $itabCur, $itabFirst, + $ctabsel, $wTabRatio); + $this->_append($header . $data); + } + + /** + * Writes Excel BIFF BOUNDSHEET record. + * FIXME: inconsistent with BIFF documentation + * + * @param string $sheetname Worksheet name + * @param integer $offset Location of worksheet BOF + * @access private + */ + function _storeBoundsheet($sheetname,$offset) + { + $record = 0x0085; // Record identifier + if ($this->_BIFF_version == 0x0600) { + $length = 0x08 + strlen($sheetname); // Number of bytes to follow + } else { + $length = 0x07 + strlen($sheetname); // Number of bytes to follow + } + + $grbit = 0x0000; // Visibility and sheet type + $cch = strlen($sheetname); // Length of sheet name + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("Vvv", $offset, $grbit, $cch); + } else { + $data = pack("VvC", $offset, $grbit, $cch); + } + $this->_append($header.$data.$sheetname); + } + + /** + * Write Internal SUPBOOK record + * + * @access private + */ + function _storeSupbookInternal() + { + $record = 0x01AE; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", count($this->_worksheets), 0x0104); + $this->_append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheetBiff8() + { + $total_references = count($this->_parser->_references); + $record = 0x0017; // Record identifier + $length = 2 + 6 * $total_references; // Number of bytes to follow + + $supbook_index = 0; // FIXME: only using internal SUPBOOK record + $header = pack("vv", $record, $length); + $data = pack('v', $total_references); + for ($i = 0; $i < $total_references; $i++) { + $data .= $this->_parser->_references[$i]; + } + $this->_append($header . $data); + } + + /** + * Write Excel BIFF STYLE records. + * + * @access private + */ + function _storeStyle() + { + $record = 0x0293; // Record identifier + $length = 0x0004; // Bytes to follow + + $ixfe = 0x8000; // Index to style XF + $BuiltIn = 0x00; // Built-in style + $iLevel = 0xff; // Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + $this->_append($header . $data); + } + + + /** + * Writes Excel FORMAT record for non "built-in" numerical formats. + * + * @param string $format Custom format string + * @param integer $ifmt Format index code + * @access private + */ + function _storeNumFormat($format, $ifmt) + { + $record = 0x041E; // Record identifier + + if ($this->_BIFF_version == 0x0600) { + $length = 5 + strlen($format); // Number of bytes to follow + $encoding = 0x0; + } elseif ($this->_BIFF_version == 0x0500) { + $length = 3 + strlen($format); // Number of bytes to follow + } + + $cch = strlen($format); // Length of format string + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vvC", $ifmt, $cch, $encoding); + } elseif ($this->_BIFF_version == 0x0500) { + $data = pack("vC", $ifmt, $cch); + } + $this->_append($header . $data . $format); + } + + /** + * Write DATEMODE record to indicate the date system in use (1904 or 1900). + * + * @access private + */ + function _storeDatemode() + { + $record = 0x0022; // Record identifier + $length = 0x0002; // Bytes to follow + + $f1904 = $this->_1904; // Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + $this->_append($header . $data); + } + + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in the workbook. + * + * Excel only stores references to external sheets that are used in NAME. + * The workbook NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param integer $cxals Number of external references + * @access private + */ + function _storeExterncount($cxals) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + $this->_append($header . $data); + } + + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + $length = 0x02 + strlen($sheetname); // Number of bytes to follow + + $cch = strlen($sheetname); // Length of sheet name + $rgch = 0x03; // Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_append($header . $data . $sheetname); + } + + + /** + * Store the NAME record in the short format that is used for storing the print + * area, repeat rows only and repeat columns only. + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x0024; // Number of bytes to follow + + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x0015; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + $this->_append($header . $data); + } + + + /** + * Store the NAME record in the long format that is used for storing the repeat + * rows and columns when both are specified. This shares a lot of code with + * _storeNameShort() but we use a separate method to keep the code clean. + * Code abstraction for reuse can be carried too far, and I should know. ;-) + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x003d; // Number of bytes to follow + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x002e; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + // Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + // Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + // End of data + $data .= pack("C", 0x10); + $this->_append($header . $data); + } + + /** + * Stores the COUNTRY record for localization + * + * @access private + */ + function _storeCountry() + { + $record = 0x008C; // Record identifier + $length = 4; // Number of bytes to follow + + $header = pack('vv', $record, $length); + /* using the same country code always for simplicity */ + $data = pack('vv', $this->_country_code, $this->_country_code); + $this->_append($header . $data); + } + + /** + * Stores the PALETTE biff record. + * + * @access private + */ + function _storePalette() + { + $aref = $this->_palette; + + $record = 0x0092; // Record identifier + $length = 2 + 4 * count($aref); // Number of bytes to follow + $ccv = count($aref); // Number of RGB values to follow + $data = ''; // The RGB data + + // Pack the RGB data + foreach ($aref as $color) { + foreach ($color as $byte) { + $data .= pack("C",$byte); + } + } + + $header = pack("vvv", $record, $length, $ccv); + $this->_append($header . $data); + } + + /** + * Calculate + * Handling of the SST continue blocks is complicated by the need to include an + * additional continuation byte depending on whether the string is split between + * blocks or whether it starts at the beginning of the block. (There are also + * additional complications that will arise later when/if Rich Strings are + * supported). + * + * @access private + */ + function _calculateSharedStringsSizes() + { + /* Iterate through the strings to calculate the CONTINUE block sizes. + For simplicity we use the same size for the SST and CONTINUE records: + 8228 : Maximum Excel97 block size + -4 : Length of block header + -8 : Length of additional SST header information + -8 : Arbitrary number to keep within _add_continue() limit = 8208 + */ + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $this->_block_sizes = array(); + $continue = 0; + + foreach (array_keys($this->_str_table) as $string) { + $string_length = strlen($string); + $headerinfo = unpack("vlength/Cencoding", $string); + $encoding = $headerinfo["encoding"]; + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + $block_length += $string_length; + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + /* TODO: Unicode data should only be split on char (2 byte) + boundaries. Therefore, in some cases we need to reduce the + amount of available + */ + $align = 0; + + // Only applies to Unicode strings + if ($encoding == 1) { + // Min string + header size -1 + $header_length = 4; + + if ($space_remaining > $header_length) { + // String contains 3 byte header => split on odd boundary + if (!$split_string && $space_remaining % 2 != 1) { + $space_remaining--; + $align = 1; + } + // Split section without header => split on even boundary + else if ($split_string && $space_remaining % 2 == 1) { + $space_remaining--; + $align = 1; + } + + $split_string = 1; + } + } + + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $written += $space_remaining; + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue - $align; + + // Store the max size for this block + $this->_block_sizes[] = $continue_limit - $align; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + if ($block_length > 0) { + $continue = 1; + } else { + $continue = 0; + } + } else { + // Store the max size for this block + $this->_block_sizes[] = $written + $continue; + + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + if ($block_length < $continue_limit) { + $written = $block_length; + } else { + $written = 0; + } + } + } + + // Store the max size for the last block unless it is empty + if ($written + $continue) { + $this->_block_sizes[] = $written + $continue; + } + + + /* Calculate the total length of the SST and associated CONTINUEs (if any). + The SST record will have a length even if it contains no strings. + This length is required to set the offsets in the BOUNDSHEET records since + they must be written before the SST records + */ + + $tmp_block_sizes = array(); + $tmp_block_sizes = $this->_block_sizes; + + $length = 12; + if (!empty($tmp_block_sizes)) { + $length += array_shift($tmp_block_sizes); // SST + } + while (!empty($tmp_block_sizes)) { + $length += 4 + array_shift($tmp_block_sizes); // CONTINUEs + } + + return $length; + } + + /** + * Write all of the workbooks strings into an indexed array. + * See the comments in _calculate_shared_string_sizes() for more information. + * + * The Excel documentation says that the SST record should be followed by an + * EXTSST record. The EXTSST record is a hash table that is used to optimise + * access to SST. However, despite the documentation it doesn't seem to be + * required so we will ignore it. + * + * @access private + */ + function _storeSharedStringsTable() + { + $record = 0x00fc; // Record identifier + $length = 0x0008; // Number of bytes to follow + $total = 0x0000; + + // Iterate through the strings to calculate the CONTINUE block sizes + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $continue = 0; + + // sizes are upside down + $tmp_block_sizes = $this->_block_sizes; + // $tmp_block_sizes = array_reverse($this->_block_sizes); + + // The SST record is required even if it contains no strings. Thus we will + // always have a length + // + if (!empty($tmp_block_sizes)) { + $length = 8 + array_shift($tmp_block_sizes); + } + else { + // No strings + $length = 8; + } + + + + // Write the SST block header information + $header = pack("vv", $record, $length); + $data = pack("VV", $this->_str_total, $this->_str_unique); + $this->_append($header . $data); + + + + + /* TODO: not good for performance */ + foreach (array_keys($this->_str_table) as $string) { + + $string_length = strlen($string); + $headerinfo = unpack("vlength/Cencoding", $string); + $encoding = $headerinfo["encoding"]; + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + // + $block_length += $string_length; + + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $this->_append($string); + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + // + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + // + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + // Unicode data should only be split on char (2 byte) boundaries. + // Therefore, in some cases we need to reduce the amount of available + // space by 1 byte to ensure the correct alignment. + $align = 0; + + // Only applies to Unicode strings + if ($encoding == 1) { + // Min string + header size -1 + $header_length = 4; + + if ($space_remaining > $header_length) { + // String contains 3 byte header => split on odd boundary + if (!$split_string && $space_remaining % 2 != 1) { + $space_remaining--; + $align = 1; + } + // Split section without header => split on even boundary + else if ($split_string && $space_remaining % 2 == 1) { + $space_remaining--; + $align = 1; + } + + $split_string = 1; + } + } + + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $tmp = substr($string, 0, $space_remaining); + $this->_append($tmp); + + // The remainder will be written in the next block(s) + $string = substr($string, $space_remaining); + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue - $align; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + // + if ($block_length > 0) { + $continue = 1; + } else { + $continue = 0; + } + } else { + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + } + + // Write the CONTINUE block header + if (!empty($this->_block_sizes)) { + $record = 0x003C; + $length = array_shift($tmp_block_sizes); + + $header = pack('vv', $record, $length); + if ($continue) { + $header .= pack('C', $encoding); + } + $this->_append($header); + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + // + if ($block_length < $continue_limit) { + $this->_append($string); + $written = $block_length; + } else { + $written = 0; + } + } + } + } + + +} + diff --git a/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Worksheet.php b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Worksheet.php new file mode 100644 index 000000000..ce98a2afd --- /dev/null +++ b/fannie/src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Worksheet.php @@ -0,0 +1,3521 @@ +<?php +/* +* Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* <jmcnamara@cpan.org> +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/Parser.php'; +require_once $FANNIE_ROOT.'src/pear-stuff/Spreadsheet_Excel_Writer/Writer/BIFFwriter.php'; + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer <xnoguer@rezebra.com> +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Name of the Worksheet + * @var string + */ + var $name; + + /** + * Index for the Worksheet + * @var integer + */ + var $index; + + /** + * Reference to the (default) Format object for URLs + * @var object Format + */ + var $_url_format; + + /** + * Reference to the parser used for parsing formulas + * @var object Format + */ + var $_parser; + + /** + * Filehandle to the temporary file for storing data + * @var resource + */ + var $_filehandle; + + /** + * Boolean indicating if we are using a temporary file for storing data + * @var bool + */ + var $_using_tmpfile; + + /** + * Maximum number of rows for an Excel spreadsheet (BIFF5) + * @var integer + */ + var $_xls_rowmax; + + /** + * Maximum number of columns for an Excel spreadsheet (BIFF5) + * @var integer + */ + var $_xls_colmax; + + /** + * Maximum number of characters for a string (LABEL record in BIFF5) + * @var integer + */ + var $_xls_strmax; + + /** + * First row for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_rowmin; + + /** + * Last row for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_rowmax; + + /** + * First column for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_colmin; + + /** + * Last column for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_colmax; + + /** + * Array containing format information for columns + * @var array + */ + var $_colinfo; + + /** + * Array containing the selected area for the worksheet + * @var array + */ + var $_selection; + + /** + * Array containing the panes for the worksheet + * @var array + */ + var $_panes; + + /** + * The active pane for the worksheet + * @var integer + */ + var $_active_pane; + + /** + * Bit specifying if panes are frozen + * @var integer + */ + var $_frozen; + + /** + * Bit specifying if the worksheet is selected + * @var integer + */ + var $selected; + + /** + * The paper size (for printing) (DOCUMENT!!!) + * @var integer + */ + var $_paper_size; + + /** + * Bit specifying paper orientation (for printing). 0 => landscape, 1 => portrait + * @var integer + */ + var $_orientation; + + /** + * The page header caption + * @var string + */ + var $_header; + + /** + * The page footer caption + * @var string + */ + var $_footer; + + /** + * The horizontal centering value for the page + * @var integer + */ + var $_hcenter; + + /** + * The vertical centering value for the page + * @var integer + */ + var $_vcenter; + + /** + * The margin for the header + * @var float + */ + var $_margin_head; + + /** + * The margin for the footer + * @var float + */ + var $_margin_foot; + + /** + * The left margin for the worksheet in inches + * @var float + */ + var $_margin_left; + + /** + * The right margin for the worksheet in inches + * @var float + */ + var $_margin_right; + + /** + * The top margin for the worksheet in inches + * @var float + */ + var $_margin_top; + + /** + * The bottom margin for the worksheet in inches + * @var float + */ + var $_margin_bottom; + + /** + * First row to reapeat on each printed page + * @var integer + */ + var $title_rowmin; + + /** + * Last row to reapeat on each printed page + * @var integer + */ + var $title_rowmax; + + /** + * First column to reapeat on each printed page + * @var integer + */ + var $title_colmin; + + /** + * First row of the area to print + * @var integer + */ + var $print_rowmin; + + /** + * Last row to of the area to print + * @var integer + */ + var $print_rowmax; + + /** + * First column of the area to print + * @var integer + */ + var $print_colmin; + + /** + * Last column of the area to print + * @var integer + */ + var $print_colmax; + + /** + * Whether to use outline. + * @var integer + */ + var $_outline_on; + + /** + * Auto outline styles. + * @var bool + */ + var $_outline_style; + + /** + * Whether to have outline summary below. + * @var bool + */ + var $_outline_below; + + /** + * Whether to have outline summary at the right. + * @var bool + */ + var $_outline_right; + + /** + * Outline row level. + * @var integer + */ + var $_outline_row_level; + + /** + * Whether to fit to page when printing or not. + * @var bool + */ + var $_fit_page; + + /** + * Number of pages to fit wide + * @var integer + */ + var $_fit_width; + + /** + * Number of pages to fit high + * @var integer + */ + var $_fit_height; + + /** + * Reference to the total number of strings in the workbook + * @var integer + */ + var $_str_total; + + /** + * Reference to the number of unique strings in the workbook + * @var integer + */ + var $_str_unique; + + /** + * Reference to the array containing all the unique strings in the workbook + * @var array + */ + var $_str_table; + + /** + * Merged cell ranges + * @var array + */ + var $_merged_ranges; + + /** + * Charset encoding currently used when calling writeString() + * @var string + */ + var $_input_encoding; + + /** + * Constructor + * + * @param string $name The name of the new worksheet + * @param integer $index The index of the new worksheet + * @param mixed &$activesheet The current activesheet of the workbook we belong to + * @param mixed &$firstsheet The first worksheet in the workbook we belong to + * @param mixed &$url_format The default format for hyperlinks + * @param mixed &$parser The formula parser created for the Workbook + * @param string $tmp_dir The path to the directory for temporary files + * @access private + */ + function Spreadsheet_Excel_Writer_Worksheet($BIFF_version, $name, + $index, &$activesheet, + &$firstsheet, &$str_total, + &$str_unique, &$str_table, + &$url_format, &$parser, + $tmp_dir) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + $this->_BIFF_version = $BIFF_version; + $rowmax = 65536; // 16384 in Excel 5 + $colmax = 256; + + $this->name = $name; + $this->index = $index; + $this->activesheet = &$activesheet; + $this->firstsheet = &$firstsheet; + $this->_str_total = &$str_total; + $this->_str_unique = &$str_unique; + $this->_str_table = &$str_table; + $this->_url_format = &$url_format; + $this->_parser = &$parser; + + //$this->ext_sheets = array(); + $this->_filehandle = ''; + $this->_using_tmpfile = true; + //$this->fileclosed = 0; + //$this->offset = 0; + $this->_xls_rowmax = $rowmax; + $this->_xls_colmax = $colmax; + $this->_xls_strmax = 255; + $this->_dim_rowmin = $rowmax + 1; + $this->_dim_rowmax = 0; + $this->_dim_colmin = $colmax + 1; + $this->_dim_colmax = 0; + $this->_colinfo = array(); + $this->_selection = array(0,0,0,0); + $this->_panes = array(); + $this->_active_pane = 3; + $this->_frozen = 0; + $this->selected = 0; + + $this->_paper_size = 0x0; + $this->_orientation = 0x1; + $this->_header = ''; + $this->_footer = ''; + $this->_hcenter = 0; + $this->_vcenter = 0; + $this->_margin_head = 0.50; + $this->_margin_foot = 0.50; + $this->_margin_left = 0.75; + $this->_margin_right = 0.75; + $this->_margin_top = 1.00; + $this->_margin_bottom = 1.00; + + $this->title_rowmin = null; + $this->title_rowmax = null; + $this->title_colmin = null; + $this->title_colmax = null; + $this->print_rowmin = null; + $this->print_rowmax = null; + $this->print_colmin = null; + $this->print_colmax = null; + + $this->_print_gridlines = 1; + $this->_screen_gridlines = 1; + $this->_print_headers = 0; + + $this->_fit_page = 0; + $this->_fit_width = 0; + $this->_fit_height = 0; + + $this->_hbreaks = array(); + $this->_vbreaks = array(); + + $this->_protect = 0; + $this->_password = null; + + $this->col_sizes = array(); + $this->_row_sizes = array(); + + $this->_zoom = 100; + $this->_print_scale = 100; + + $this->_outline_row_level = 0; + $this->_outline_style = 0; + $this->_outline_below = 1; + $this->_outline_right = 1; + $this->_outline_on = 1; + + $this->_merged_ranges = array(); + + $this->_input_encoding = ''; + + $this->_dv = array(); + + $this->_tmp_dir = $tmp_dir; + + $this->_initialize(); + } + + /** + * Open a tmp file to store the majority of the Worksheet data. If this fails, + * for example due to write permissions, store the data in memory. This can be + * slow for large files. + * + * @access private + */ + function _initialize() + { + if ($this->_using_tmpfile == false) { + return; + } + + if ($this->_tmp_dir === '' && ini_get('open_basedir') === false) { + // open_basedir restriction in effect - store data in memory + // ToDo: Let the error actually have an effect somewhere + $this->_using_tmpfile = false; + return new PEAR_Error('Temp file could not be opened since open_basedir restriction in effect - please use setTmpDir() - using memory storage instead'); + } + + // Open tmp file for storing Worksheet data + if ($this->_tmp_dir === '') { + $fh = tmpfile(); + } else { + // For people with open base dir restriction + $tmpfilename = tempnam($this->_tmp_dir, "Spreadsheet_Excel_Writer"); + $fh = @fopen($tmpfilename, "w+b"); + } + + if ($fh === false) { + // If tmpfile() fails store data in memory + $this->_using_tmpfile = false; + } else { + // Store filehandle + $this->_filehandle = $fh; + } + } + + /** + * Add data to the beginning of the workbook (note the reverse order) + * and to the end of the workbook. + * + * @access public + * @see Spreadsheet_Excel_Writer_Workbook::storeWorkbook() + * @param array $sheetnames The array of sheetnames from the Workbook this + * worksheet belongs to + */ + function close($sheetnames) + { + $num_sheets = count($sheetnames); + + /*********************************************** + * Prepend in reverse order!! + */ + + // Prepend the sheet dimensions + $this->_storeDimensions(); + + // Prepend the sheet password + $this->_storePassword(); + + // Prepend the sheet protection + $this->_storeProtect(); + + // Prepend the page setup + $this->_storeSetup(); + + /* FIXME: margins are actually appended */ + // Prepend the bottom margin + $this->_storeMarginBottom(); + + // Prepend the top margin + $this->_storeMarginTop(); + + // Prepend the right margin + $this->_storeMarginRight(); + + // Prepend the left margin + $this->_storeMarginLeft(); + + // Prepend the page vertical centering + $this->_storeVcenter(); + + // Prepend the page horizontal centering + $this->_storeHcenter(); + + // Prepend the page footer + $this->_storeFooter(); + + // Prepend the page header + $this->_storeHeader(); + + // Prepend the vertical page breaks + $this->_storeVbreak(); + + // Prepend the horizontal page breaks + $this->_storeHbreak(); + + // Prepend WSBOOL + $this->_storeWsbool(); + + // Prepend GRIDSET + $this->_storeGridset(); + + // Prepend GUTS + if ($this->_BIFF_version == 0x0500) { + $this->_storeGuts(); + } + + // Prepend PRINTGRIDLINES + $this->_storePrintGridlines(); + + // Prepend PRINTHEADERS + $this->_storePrintHeaders(); + + // Prepend EXTERNSHEET references + if ($this->_BIFF_version == 0x0500) { + for ($i = $num_sheets; $i > 0; $i--) { + $sheetname = $sheetnames[$i-1]; + $this->_storeExternsheet($sheetname); + } + } + + // Prepend the EXTERNCOUNT of external references. + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterncount($num_sheets); + } + + // Prepend the COLINFO records if they exist + if (!empty($this->_colinfo)) { + $colcount = count($this->_colinfo); + for ($i = 0; $i < $colcount; $i++) { + $this->_storeColinfo($this->_colinfo[$i]); + } + $this->_storeDefcol(); + } + + // Prepend the BOF record + $this->_storeBof(0x0010); + + /* + * End of prepend. Read upwards from here. + ***********************************************/ + + // Append + $this->_storeWindow2(); + $this->_storeZoom(); + if (!empty($this->_panes)) { + $this->_storePanes($this->_panes); + } + $this->_storeSelection($this->_selection); + $this->_storeMergedCells(); + /* TODO: add data validity */ + /*if ($this->_BIFF_version == 0x0600) { + $this->_storeDataValidity(); + }*/ + $this->_storeEof(); + } + + /** + * Retrieve the worksheet name. + * This is usefull when creating worksheets without a name. + * + * @access public + * @return string The worksheet's name + */ + function getName() + { + return $this->name; + } + + /** + * Retrieves data from memory in one chunk, or from disk in $buffer + * sized chunks. + * + * @return string The data + */ + function getData() + { + $buffer = 4096; + + // Return data stored in memory + if (isset($this->_data)) { + $tmp = $this->_data; + unset($this->_data); + $fh = $this->_filehandle; + if ($this->_using_tmpfile) { + fseek($fh, 0); + } + return $tmp; + } + // Return data stored on disk + if ($this->_using_tmpfile) { + if ($tmp = fread($this->_filehandle, $buffer)) { + return $tmp; + } + } + + // No data to return + return ''; + } + + /** + * Sets a merged cell range + * + * @access public + * @param integer $first_row First row of the area to merge + * @param integer $first_col First column of the area to merge + * @param integer $last_row Last row of the area to merge + * @param integer $last_col Last column of the area to merge + */ + function setMerge($first_row, $first_col, $last_row, $last_col) + { + if (($last_row < $first_row) || ($last_col < $first_col)) { + return; + } + // don't check rowmin, rowmax, etc... because we don't know when this + // is going to be called + $this->_merged_ranges[] = array($first_row, $first_col, $last_row, $last_col); + } + + /** + * Set this worksheet as a selected worksheet, + * i.e. the worksheet has its tab highlighted. + * + * @access public + */ + function select() + { + $this->selected = 1; + } + + /** + * Set this worksheet as the active worksheet, + * i.e. the worksheet that is displayed when the workbook is opened. + * Also set it as selected. + * + * @access public + */ + function activate() + { + $this->selected = 1; + $this->activesheet = $this->index; + } + + /** + * Set this worksheet as the first visible sheet. + * This is necessary when there are a large number of worksheets and the + * activated worksheet is not visible on the screen. + * + * @access public + */ + function setFirstSheet() + { + $this->firstsheet = $this->index; + } + + /** + * Set the worksheet protection flag + * to prevent accidental modification and to + * hide formulas if the locked and hidden format properties have been set. + * + * @access public + * @param string $password The password to use for protecting the sheet. + */ + function protect($password) + { + $this->_protect = 1; + $this->_password = $this->_encodePassword($password); + } + + /** + * Set the width of a single column or a range of columns. + * + * @access public + * @param integer $firstcol first column on the range + * @param integer $lastcol last column on the range + * @param integer $width width to set + * @param mixed $format The optional XF format to apply to the columns + * @param integer $hidden The optional hidden atribute + * @param integer $level The optional outline level + */ + function setColumn($firstcol, $lastcol, $width, $format = null, $hidden = 0, $level = 0) + { + $this->_colinfo[] = array($firstcol, $lastcol, $width, &$format, $hidden, $level); + + // Set width to zero if column is hidden + $width = ($hidden) ? 0 : $width; + + for ($col = $firstcol; $col <= $lastcol; $col++) { + $this->col_sizes[$col] = $width; + } + } + + /** + * Set which cell or cells are selected in a worksheet + * + * @access public + * @param integer $first_row first row in the selected quadrant + * @param integer $first_column first column in the selected quadrant + * @param integer $last_row last row in the selected quadrant + * @param integer $last_column last column in the selected quadrant + */ + function setSelection($first_row,$first_column,$last_row,$last_column) + { + $this->_selection = array($first_row,$first_column,$last_row,$last_column); + } + + /** + * Set panes and mark them as frozen. + * + * @access public + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function freezePanes($panes) + { + $this->_frozen = 1; + $this->_panes = $panes; + } + + /** + * Set panes and mark them as unfrozen. + * + * @access public + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function thawPanes($panes) + { + $this->_frozen = 0; + $this->_panes = $panes; + } + + /** + * Set the page orientation as portrait. + * + * @access public + */ + function setPortrait() + { + $this->_orientation = 1; + } + + /** + * Set the page orientation as landscape. + * + * @access public + */ + function setLandscape() + { + $this->_orientation = 0; + } + + /** + * Set the paper type. Ex. 1 = US Letter, 9 = A4 + * + * @access public + * @param integer $size The type of paper size to use + */ + function setPaper($size = 0) + { + $this->_paper_size = $size; + } + + + /** + * Set the page header caption and optional margin. + * + * @access public + * @param string $string The header text + * @param float $margin optional head margin in inches. + */ + function setHeader($string,$margin = 0.50) + { + if (strlen($string) >= 255) { + //carp 'Header string must be less than 255 characters'; + return; + } + $this->_header = $string; + $this->_margin_head = $margin; + } + + /** + * Set the page footer caption and optional margin. + * + * @access public + * @param string $string The footer text + * @param float $margin optional foot margin in inches. + */ + function setFooter($string,$margin = 0.50) + { + if (strlen($string) >= 255) { + //carp 'Footer string must be less than 255 characters'; + return; + } + $this->_footer = $string; + $this->_margin_foot = $margin; + } + + /** + * Center the page horinzontally. + * + * @access public + * @param integer $center the optional value for centering. Defaults to 1 (center). + */ + function centerHorizontally($center = 1) + { + $this->_hcenter = $center; + } + + /** + * Center the page vertically. + * + * @access public + * @param integer $center the optional value for centering. Defaults to 1 (center). + */ + function centerVertically($center = 1) + { + $this->_vcenter = $center; + } + + /** + * Set all the page margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins($margin) + { + $this->setMarginLeft($margin); + $this->setMarginRight($margin); + $this->setMarginTop($margin); + $this->setMarginBottom($margin); + } + + /** + * Set the left and right margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins_LR($margin) + { + $this->setMarginLeft($margin); + $this->setMarginRight($margin); + } + + /** + * Set the top and bottom margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins_TB($margin) + { + $this->setMarginTop($margin); + $this->setMarginBottom($margin); + } + + /** + * Set the left margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginLeft($margin = 0.75) + { + $this->_margin_left = $margin; + } + + /** + * Set the right margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginRight($margin = 0.75) + { + $this->_margin_right = $margin; + } + + /** + * Set the top margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginTop($margin = 1.00) + { + $this->_margin_top = $margin; + } + + /** + * Set the bottom margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginBottom($margin = 1.00) + { + $this->_margin_bottom = $margin; + } + + /** + * Set the rows to repeat at the top of each printed page. + * + * @access public + * @param integer $first_row First row to repeat + * @param integer $last_row Last row to repeat. Optional. + */ + function repeatRows($first_row, $last_row = null) + { + $this->title_rowmin = $first_row; + if (isset($last_row)) { //Second row is optional + $this->title_rowmax = $last_row; + } else { + $this->title_rowmax = $first_row; + } + } + + /** + * Set the columns to repeat at the left hand side of each printed page. + * + * @access public + * @param integer $first_col First column to repeat + * @param integer $last_col Last column to repeat. Optional. + */ + function repeatColumns($first_col, $last_col = null) + { + $this->title_colmin = $first_col; + if (isset($last_col)) { // Second col is optional + $this->title_colmax = $last_col; + } else { + $this->title_colmax = $first_col; + } + } + + /** + * Set the area of each worksheet that will be printed. + * + * @access public + * @param integer $first_row First row of the area to print + * @param integer $first_col First column of the area to print + * @param integer $last_row Last row of the area to print + * @param integer $last_col Last column of the area to print + */ + function printArea($first_row, $first_col, $last_row, $last_col) + { + $this->print_rowmin = $first_row; + $this->print_colmin = $first_col; + $this->print_rowmax = $last_row; + $this->print_colmax = $last_col; + } + + + /** + * Set the option to hide gridlines on the printed page. + * + * @access public + */ + function hideGridlines() + { + $this->_print_gridlines = 0; + } + + /** + * Set the option to hide gridlines on the worksheet (as seen on the screen). + * + * @access public + */ + function hideScreenGridlines() + { + $this->_screen_gridlines = 0; + } + + /** + * Set the option to print the row and column headers on the printed page. + * + * @access public + * @param integer $print Whether to print the headers or not. Defaults to 1 (print). + */ + function printRowColHeaders($print = 1) + { + $this->_print_headers = $print; + } + + /** + * Set the vertical and horizontal number of pages that will define the maximum area printed. + * It doesn't seem to work with OpenOffice. + * + * @access public + * @param integer $width Maximun width of printed area in pages + * @param integer $height Maximun heigth of printed area in pages + * @see setPrintScale() + */ + function fitToPages($width, $height) + { + $this->_fit_page = 1; + $this->_fit_width = $width; + $this->_fit_height = $height; + } + + /** + * Store the horizontal page breaks on a worksheet (for printing). + * The breaks represent the row after which the break is inserted. + * + * @access public + * @param array $breaks Array containing the horizontal page breaks + */ + function setHPagebreaks($breaks) + { + foreach ($breaks as $break) { + array_push($this->_hbreaks, $break); + } + } + + /** + * Store the vertical page breaks on a worksheet (for printing). + * The breaks represent the column after which the break is inserted. + * + * @access public + * @param array $breaks Array containing the vertical page breaks + */ + function setVPagebreaks($breaks) + { + foreach ($breaks as $break) { + array_push($this->_vbreaks, $break); + } + } + + + /** + * Set the worksheet zoom factor. + * + * @access public + * @param integer $scale The zoom factor + */ + function setZoom($scale = 100) + { + // Confine the scale to Excel's range + if ($scale < 10 || $scale > 400) { + $this->raiseError("Zoom factor $scale outside range: 10 <= zoom <= 400"); + $scale = 100; + } + + $this->_zoom = floor($scale); + } + + /** + * Set the scale factor for the printed page. + * It turns off the "fit to page" option + * + * @access public + * @param integer $scale The optional scale factor. Defaults to 100 + */ + function setPrintScale($scale = 100) + { + // Confine the scale to Excel's range + if ($scale < 10 || $scale > 400) { + $this->raiseError("Print scale $scale outside range: 10 <= zoom <= 400"); + $scale = 100; + } + + // Turn off "fit to page" option + $this->_fit_page = 0; + + $this->_print_scale = floor($scale); + } + + /** + * Map to the appropriate write method acording to the token recieved. + * + * @access public + * @param integer $row The row of the cell we are writing to + * @param integer $col The column of the cell we are writing to + * @param mixed $token What we are writing + * @param mixed $format The optional format to apply to the cell + */ + function write($row, $col, $token, $format = null) + { + // Check for a cell reference in A1 notation and substitute row and column + /*if ($_[0] =~ /^\D/) { + @_ = $this->_substituteCellref(@_); + }*/ + + if (preg_match("/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/", $token)) { + // Match number + return $this->writeNumber($row, $col, $token, $format); + } elseif (preg_match("/^[fh]tt?p:\/\//", $token)) { + // Match http or ftp URL + return $this->writeUrl($row, $col, $token, '', $format); + } elseif (preg_match("/^mailto:/", $token)) { + // Match mailto: + return $this->writeUrl($row, $col, $token, '', $format); + } elseif (preg_match("/^(?:in|ex)ternal:/", $token)) { + // Match internal or external sheet link + return $this->writeUrl($row, $col, $token, '', $format); + } elseif (preg_match("/^=/", $token)) { + // Match formula + return $this->writeFormula($row, $col, $token, $format); + } elseif ($token == '') { + // Match blank + return $this->writeBlank($row, $col, $format); + } else { + // Default: match string + return $this->writeString($row, $col, $token, $format); + } + } + + /** + * Write an array of values as a row + * + * @access public + * @param integer $row The row we are writing to + * @param integer $col The first col (leftmost col) we are writing to + * @param array $val The array of values to write + * @param mixed $format The optional format to apply to the cell + * @return mixed PEAR_Error on failure + */ + + function writeRow($row, $col, $val, $format = null) + { + $retval = ''; + if (is_array($val)) { + foreach ($val as $v) { + if (is_array($v)) { + $this->writeCol($row, $col, $v, $format); + } else { + $this->write($row, $col, $v, $format); + } + $col++; + } + } else { + $retval = new PEAR_Error('$val needs to be an array'); + } + return($retval); + } + + /** + * Write an array of values as a column + * + * @access public + * @param integer $row The first row (uppermost row) we are writing to + * @param integer $col The col we are writing to + * @param array $val The array of values to write + * @param mixed $format The optional format to apply to the cell + * @return mixed PEAR_Error on failure + */ + + function writeCol($row, $col, $val, $format = null) + { + $retval = ''; + if (is_array($val)) { + foreach ($val as $v) { + $this->write($row, $col, $v, $format); + $row++; + } + } else { + $retval = new PEAR_Error('$val needs to be an array'); + } + return($retval); + } + + /** + * Returns an index to the XF record in the workbook + * + * @access private + * @param mixed &$format The optional XF format + * @return integer The XF record index + */ + function _XF(&$format) + { + if ($format) { + return($format->getXfIndex()); + } else { + return(0x0F); + } + } + + + /****************************************************************************** + ******************************************************************************* + * + * Internal methods + */ + + + /** + * Store Worksheet data in memory using the parent's class append() or to a + * temporary file, the default. + * + * @access private + * @param string $data The binary data to append + */ + function _append($data) + { + if ($this->_using_tmpfile) { + // Add CONTINUE records if necessary + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + fwrite($this->_filehandle, $data); + $this->_datasize += strlen($data); + } else { + parent::_append($data); + } + } + + /** + * Substitute an Excel cell reference in A1 notation for zero based row and + * column values in an argument list. + * + * Ex: ("A4", "Hello") is converted to (3, 0, "Hello"). + * + * @access private + * @param string $cell The cell reference. Or range of cells. + * @return array + */ + function _substituteCellref($cell) + { + $cell = strtoupper($cell); + + // Convert a column range: 'A:A' or 'B:G' + if (preg_match("/([A-I]?[A-Z]):([A-I]?[A-Z])/", $cell, $match)) { + list($no_use, $col1) = $this->_cellToRowcol($match[1] .'1'); // Add a dummy row + list($no_use, $col2) = $this->_cellToRowcol($match[2] .'1'); // Add a dummy row + return(array($col1, $col2)); + } + + // Convert a cell range: 'A1:B7' + if (preg_match("/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/", $cell, $match)) { + list($row1, $col1) = $this->_cellToRowcol($match[1]); + list($row2, $col2) = $this->_cellToRowcol($match[2]); + return(array($row1, $col1, $row2, $col2)); + } + + // Convert a cell reference: 'A1' or 'AD2000' + if (preg_match("/\$?([A-I]?[A-Z]\$?\d+)/", $cell)) { + list($row1, $col1) = $this->_cellToRowcol($match[1]); + return(array($row1, $col1)); + } + + // TODO use real error codes + $this->raiseError("Unknown cell reference $cell", 0, PEAR_ERROR_DIE); + } + + /** + * Convert an Excel cell reference in A1 notation to a zero based row and column + * reference; converts C1 to (0, 2). + * + * @access private + * @param string $cell The cell reference. + * @return array containing (row, column) + */ + function _cellToRowcol($cell) + { + preg_match("/\$?([A-I]?[A-Z])\$?(\d+)/",$cell,$match); + $col = $match[1]; + $row = $match[2]; + + // Convert base26 column string to number + $chars = split('', $col); + $expn = 0; + $col = 0; + + while ($chars) { + $char = array_pop($chars); // LS char first + $col += (ord($char) -ord('A') +1) * pow(26,$expn); + $expn++; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return(array($row, $col)); + } + + /** + * Based on the algorithm provided by Daniel Rentz of OpenOffice. + * + * @access private + * @param string $plaintext The password to be encoded in plaintext. + * @return string The encoded password + */ + function _encodePassword($plaintext) + { + $password = 0x0000; + $i = 1; // char position + + // split the plain text password in its component characters + $chars = preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $char) { + $value = ord($char) << $i; // shifted ASCII value + $rotated_bits = $value >> 15; // rotated bits beyond bit 15 + $value &= 0x7fff; // first 15 bits + $password ^= ($value | $rotated_bits); + $i++; + } + + $password ^= strlen($plaintext); + $password ^= 0xCE4B; + + return($password); + } + + /** + * This method sets the properties for outlining and grouping. The defaults + * correspond to Excel's defaults. + * + * @param bool $visible + * @param bool $symbols_below + * @param bool $symbols_right + * @param bool $auto_style + */ + function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false) + { + $this->_outline_on = $visible; + $this->_outline_below = $symbols_below; + $this->_outline_right = $symbols_right; + $this->_outline_style = $auto_style; + + // Ensure this is a boolean vale for Window2 + if ($this->_outline_on) { + $this->_outline_on = 1; + } + } + + /****************************************************************************** + ******************************************************************************* + * + * BIFF RECORDS + */ + + + /** + * Write a double to the specified row and column (zero indexed). + * An integer can be written as a double. Excel will display an + * integer. $format is optional. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param float $num The number to write + * @param mixed $format The optional XF format + * @return integer + */ + function writeNumber($row, $col, $num, $format = null) + { + $record = 0x0203; // Record identifier + $length = 0x000E; // Number of bytes to follow + + $xf = $this->_XF($format); // The cell format + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $xl_double = pack("d", $num); + if ($this->_byte_order) { // if it's Big Endian + $xl_double = strrev($xl_double); + } + + $this->_append($header.$data.$xl_double); + return(0); + } + + /** + * Write a string to the specified row and column (zero indexed). + * NOTE: there is an Excel 5 defined limit of 255 characters. + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $format The XF format for the cell + * @return integer + */ + function writeString($row, $col, $str, $format = null) + { + if ($this->_BIFF_version == 0x0600) { + return $this->writeStringBIFF8($row, $col, $str, $format); + } + $strlen = strlen($str); + $record = 0x0204; // Record identifier + $length = 0x0008 + $strlen; // Bytes to follow + $xf = $this->_XF($format); // The cell format + + $str_error = 0; + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + if ($strlen > $this->_xls_strmax) { // LABEL must be < 255 chars + $str = substr($str, 0, $this->_xls_strmax); + $length = 0x0008 + $this->_xls_strmax; + $strlen = $this->_xls_strmax; + $str_error = -3; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row, $col, $xf, $strlen); + $this->_append($header . $data . $str); + return($str_error); + } + + /** + * Sets Input Encoding for writing strings + * + * @access public + * @param string $encoding The encoding. Ex: 'UTF-16LE', 'utf-8', 'ISO-859-7' + */ + function setInputEncoding($encoding) + { + if ($encoding != 'UTF-16LE' && !function_exists('iconv')) { + $this->raiseError("Using an input encoding other than UTF-16LE requires PHP support for iconv"); + } + $this->_input_encoding = $encoding; + } + + /** + * Write a string to the specified row and column (zero indexed). + * This is the BIFF8 version (no 255 chars limit). + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $format The XF format for the cell + * @return integer + */ + function writeStringBIFF8($row, $col, $str, $format = null) + { + if ($this->_input_encoding == 'UTF-16LE') + { + $strlen = function_exists('mb_strlen') ? mb_strlen($str, 'UTF-16LE') : (strlen($str) / 2); + $encoding = 0x1; + } + elseif ($this->_input_encoding != '') + { + $str = iconv($this->_input_encoding, 'UTF-16LE', $str); + $strlen = function_exists('mb_strlen') ? mb_strlen($str, 'UTF-16LE') : (strlen($str) / 2); + $encoding = 0x1; + } + else + { + $strlen = strlen($str); + $encoding = 0x0; + } + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + $xf = $this->_XF($format); // The cell format + + $str_error = 0; + + // Check that row and col are valid and store max and min values + if ($this->_checkRowCol($row, $col) == false) { + return -2; + } + + $str = pack('vC', $strlen, $encoding).$str; + + /* check if string is already present */ + if (!isset($this->_str_table[$str])) { + $this->_str_table[$str] = $this->_str_unique++; + } + $this->_str_total++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xf, $this->_str_table[$str]); + $this->_append($header.$data); + return $str_error; + } + + /** + * Check row and col before writing to a cell, and update the sheet's + * dimensions accordingly + * + * @access private + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @return boolean true for success, false if row and/or col are grester + * then maximums allowed. + */ + function _checkRowCol($row, $col) + { + if ($row >= $this->_xls_rowmax) { + return false; + } + if ($col >= $this->_xls_colmax) { + return false; + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + return true; + } + + /** + * Writes a note associated with the cell given by the row and column. + * NOTE records don't have a length limit. + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $note The note to write + */ + function writeNote($row, $col, $note) + { + $note_length = strlen($note); + $record = 0x001C; // Record identifier + $max_length = 2048; // Maximun length for a NOTE record + //$length = 0x0006 + $note_length; // Bytes to follow + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + // Length for this record is no more than 2048 + 6 + $length = 0x0006 + min($note_length, 2048); + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $note_length); + $this->_append($header . $data . substr($note, 0, 2048)); + + for ($i = $max_length; $i < $note_length; $i += $max_length) { + $chunk = substr($note, $i, $max_length); + $length = 0x0006 + strlen($chunk); + $header = pack("vv", $record, $length); + $data = pack("vvv", -1, 0, strlen($chunk)); + $this->_append($header.$data.$chunk); + } + return(0); + } + + /** + * Write a blank cell to the specified row and column (zero indexed). + * A blank cell is used to specify formatting without adding a string + * or a number. + * + * A blank cell without a format serves no purpose. Therefore, we don't write + * a BLANK record unless a format is specified. + * + * Returns 0 : normal termination (including no format) + * -1 : insufficient number of arguments + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param mixed $format The XF format + */ + function writeBlank($row, $col, $format) + { + // Don't write a blank cell unless it has a format + if (!$format) { + return(0); + } + + $record = 0x0201; // Record identifier + $length = 0x0006; // Number of bytes to follow + $xf = $this->_XF($format); // The cell format + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { + return(-2); + } + if ($col >= $this->_xls_colmax) { + return(-2); + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $this->_append($header . $data); + return 0; + } + + /** + * Write a formula to the specified row and column (zero indexed). + * The textual representation of the formula is passed to the parser in + * Parser.php which returns a packed binary string. + * + * Returns 0 : normal termination + * -1 : formula errors (bad formula) + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $formula The formula text string + * @param mixed $format The optional XF format + * @return integer + */ + function writeFormula($row, $col, $formula, $format = null) + { + $record = 0x0006; // Record identifier + + // Excel normally stores the last calculated value of the formula in $num. + // Clearly we are not in a position to calculate this a priori. Instead + // we set $num to zero and set the option flags in $grbit to ensure + // automatic calculation of the formula when the file is opened. + // + $xf = $this->_XF($format); // The cell format + $num = 0x00; // Current value of formula + $grbit = 0x03; // Option flags + $unknown = 0x0000; // Must be zero + + + // Check that row and col are valid and store max and min values + if ($this->_checkRowCol($row, $col) == false) { + return -2; + } + + // Strip the '=' or '@' sign at the beginning of the formula string + if (preg_match("/^=/", $formula)) { + $formula = preg_replace("/(^=)/", "", $formula); + } elseif (preg_match("/^@/", $formula)) { + $formula = preg_replace("/(^@)/", "", $formula); + } else { + // Error handling + $this->writeString($row, $col, 'Unrecognised character for formula'); + return -1; + } + + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if ($this->isError($error)) { + $this->writeString($row, $col, $error->getMessage()); + return -1; + } + + $formula = $this->_parser->toReversePolish(); + if ($this->isError($formula)) { + $this->writeString($row, $col, $formula->getMessage()); + return -1; + } + + $formlen = strlen($formula); // Length of the binary string + $length = 0x16 + $formlen; // Length of the record data + + $header = pack("vv", $record, $length); + $data = pack("vvvdvVv", $row, $col, $xf, $num, + $grbit, $unknown, $formlen); + + $this->_append($header . $data . $formula); + return 0; + } + + /** + * Write a hyperlink. + * This is comprised of two elements: the visible label and + * the invisible link. The visible label is the same as the link unless an + * alternative string is specified. The label is written using the + * writeString() method. Therefore the 255 characters string limit applies. + * $string and $format are optional. + * + * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external + * directory url. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Row + * @param integer $col Column + * @param string $url URL string + * @param string $string Alternative label + * @param mixed $format The cell format + * @return integer + */ + function writeUrl($row, $col, $url, $string = '', $format = null) + { + // Add start row and col to arg list + return($this->_writeUrlRange($row, $col, $row, $col, $url, $string, $format)); + } + + /** + * This is the more general form of writeUrl(). It allows a hyperlink to be + * written to a range of cells. This function also decides the type of hyperlink + * to be written. These are either, Web (http, ftp, mailto), Internal + * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $string Alternative label + * @param mixed $format The cell format + * @return integer + */ + + function _writeUrlRange($row1, $col1, $row2, $col2, $url, $string = '', $format = null) + { + + // Check for internal/external sheet links or default to web link + if (preg_match('[^internal:]', $url)) { + return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url, $string, $format)); + } + if (preg_match('[^external:]', $url)) { + return($this->_writeUrlExternal($row1, $col1, $row2, $col2, $url, $string, $format)); + } + return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url, $string, $format)); + } + + + /** + * Used to write http, ftp and mailto hyperlinks. + * The link type ($options) is 0x03 is the same as absolute dir ref without + * sheet. However it is differentiated by the $unknown2 data stream. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlWeb($row1, $col1, $row2, $col2, $url, $str, $format = null) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if (!$format) { + $format = $this->_url_format; + } + + // Write the visible label using the writeString() method. + if ($str == '') { + $str = $url; + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) || ($str_error == -3)) { + return $str_error; + } + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); + + // Pack the option flags + $options = pack("V", 0x03); + + // Convert URL to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL + $url_len = pack("V", strlen($url)); + + // Calculate the data length + $length = 0x34 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header . $data . + $unknown1 . $options . + $unknown2 . $url_len . $url); + return($str_error); + } + + /** + * Used to write internal reference hyperlinks such as "Sheet1!A1". + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlInternal($row1, $col1, $row2, $col2, $url, $str, $format = null) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if (!$format) { + $format = $this->_url_format; + } + + // Strip URL type + $url = preg_replace('/^internal:/', '', $url); + + // Write the visible label + if ($str == '') { + $str = $url; + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) || ($str_error == -3)) { + return $str_error; + } + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + + // Pack the option flags + $options = pack("V", 0x08); + + // Convert the URL type and to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL as chars (not wchars) + $url_len = pack("V", floor(strlen($url)/2)); + + // Calculate the data length + $length = 0x24 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header . $data . + $unknown1 . $options . + $url_len . $url); + return($str_error); + } + + /** + * Write links to external directory names such as 'c:\foo.xls', + * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. + * + * Note: Excel writes some relative links with the $dir_long string. We ignore + * these cases for the sake of simpler code. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlExternal($row1, $col1, $row2, $col2, $url, $str, $format = null) + { + // Network drives are different. We will handle them separately + // MS/Novell network drives and shares start with \\ + if (preg_match('[^external:\\\\]', $url)) { + return; //($this->_writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); + } + + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if (!$format) { + $format = $this->_url_format; + } + + // Strip URL type and change Unix dir separator to Dos style (if needed) + // + $url = preg_replace('/^external:/', '', $url); + $url = preg_replace('/\//', "\\", $url); + + // Write the visible label + if ($str == '') { + $str = preg_replace('/\#/', ' - ', $url); + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) or ($str_error == -3)) { + return $str_error; + } + + // Determine if the link is relative or absolute: + // relative if link contains no dir separator, "somefile.xls" + // relative if link starts with up-dir, "..\..\somefile.xls" + // otherwise, absolute + + $absolute = 0x02; // Bit mask + if (!preg_match("/\\\/", $url)) { + $absolute = 0x00; + } + if (preg_match("/^\.\.\\\/", $url)) { + $absolute = 0x00; + } + $link_type = 0x01 | $absolute; + + // Determine if the link contains a sheet reference and change some of the + // parameters accordingly. + // Split the dir name and sheet name (if it exists) + /*if (preg_match("/\#/", $url)) { + list($dir_long, $sheet) = split("\#", $url); + } else { + $dir_long = $url; + } + + if (isset($sheet)) { + $link_type |= 0x08; + $sheet_len = pack("V", strlen($sheet) + 0x01); + $sheet = join("\0", split('', $sheet)); + $sheet .= "\0\0\0"; + } else { + $sheet_len = ''; + $sheet = ''; + }*/ + $dir_long = $url; + if (preg_match("/\#/", $url)) { + $link_type |= 0x08; + } + + + + // Pack the link type + $link_type = pack("V", $link_type); + + // Calculate the up-level dir count e.g.. (..\..\..\ == 3) + $up_count = preg_match_all("/\.\.\\\/", $dir_long, $useless); + $up_count = pack("v", $up_count); + + // Store the short dos dir name (null terminated) + $dir_short = preg_replace("/\.\.\\\/", '', $dir_long) . "\0"; + + // Store the long dir name as a wchar string (non-null terminated) + //$dir_long = join("\0", split('', $dir_long)); + $dir_long = $dir_long . "\0"; + + // Pack the lengths of the dir strings + $dir_short_len = pack("V", strlen($dir_short) ); + $dir_long_len = pack("V", strlen($dir_long) ); + $stream_len = pack("V", 0);//strlen($dir_long) + 0x06); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); + $unknown2 = pack("H*",'0303000000000000C000000000000046' ); + $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000'); + $unknown4 = pack("v", 0x03 ); + + // Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $unknown2 . + $up_count . + $dir_short_len. + $dir_short . + $unknown3 . + $stream_len ;/*. + $dir_long_len . + $unknown4 . + $dir_long . + $sheet_len . + $sheet ;*/ + + // Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + // Write the packed data + $this->_append($header. $data); + return($str_error); + } + + + /** + * This method is used to set the height and format for a row. + * + * @access public + * @param integer $row The row to set + * @param integer $height Height we are giving to the row. + * Use null to set XF without setting height + * @param mixed $format XF format we are giving to the row + * @param bool $hidden The optional hidden attribute + * @param integer $level The optional outline level for row, in range [0,7] + */ + function setRow($row, $height, $format = null, $hidden = false, $level = 0) + { + $record = 0x0208; // Record identifier + $length = 0x0010; // Number of bytes to follow + + $colMic = 0x0000; // First defined column + $colMac = 0x0000; // Last defined column + $irwMac = 0x0000; // Used by Excel to optimise loading + $reserved = 0x0000; // Reserved + $grbit = 0x0000; // Option flags + $ixfe = $this->_XF($format); // XF index + + // set _row_sizes so _sizeRow() can use it + $this->_row_sizes[$row] = $height; + + // Use setRow($row, null, $XF) to set XF format without setting height + if ($height != null) { + $miyRw = $height * 20; // row height + } else { + $miyRw = 0xff; // default row height is 256 + } + + $level = max(0, min($level, 7)); // level should be between 0 and 7 + $this->_outline_row_level = max($level, $this->_outline_row_level); + + + // Set the options flags. fUnsynced is used to show that the font and row + // heights are not compatible. This is usually the case for WriteExcel. + // The collapsed flag 0x10 doesn't seem to be used to indicate that a row + // is collapsed. Instead it is used to indicate that the previous row is + // collapsed. The zero height flag, 0x20, is used to collapse a row. + + $grbit |= $level; + if ($hidden) { + $grbit |= 0x0020; + } + $grbit |= 0x0040; // fUnsynced + if ($format) { + $grbit |= 0x0080; + } + $grbit |= 0x0100; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $row, $colMic, $colMac, $miyRw, + $irwMac,$reserved, $grbit, $ixfe); + $this->_append($header.$data); + } + + /** + * Writes Excel DIMENSIONS to define the area in which there is data. + * + * @access private + */ + function _storeDimensions() + { + $record = 0x0200; // Record identifier + $row_min = $this->_dim_rowmin; // First row + $row_max = $this->_dim_rowmax + 1; // Last row plus 1 + $col_min = $this->_dim_colmin; // First column + $col_max = $this->_dim_colmax + 1; // Last column plus 1 + $reserved = 0x0000; // Reserved by Excel + + if ($this->_BIFF_version == 0x0500) { + $length = 0x000A; // Number of bytes to follow + $data = pack("vvvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x000E; + $data = pack("VVvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + } + $header = pack("vv", $record, $length); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record Window2. + * + * @access private + */ + function _storeWindow2() + { + $record = 0x023E; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x000A; // Number of bytes to follow + } elseif ($this->_BIFF_version == 0x0600) { + $length = 0x0012; + } + + $grbit = 0x00B6; // Option flags + $rwTop = 0x0000; // Top row visible in window + $colLeft = 0x0000; // Leftmost column visible in window + + + // The options flags that comprise $grbit + $fDspFmla = 0; // 0 - bit + $fDspGrid = $this->_screen_gridlines; // 1 + $fDspRwCol = 1; // 2 + $fFrozen = $this->_frozen; // 3 + $fDspZeros = 1; // 4 + $fDefaultHdr = 1; // 5 + $fArabic = 0; // 6 + $fDspGuts = $this->_outline_on; // 7 + $fFrozenNoSplit = 0; // 0 - bit + $fSelected = $this->selected; // 1 + $fPaged = 1; // 2 + + $grbit = $fDspFmla; + $grbit |= $fDspGrid << 1; + $grbit |= $fDspRwCol << 2; + $grbit |= $fFrozen << 3; + $grbit |= $fDspZeros << 4; + $grbit |= $fDefaultHdr << 5; + $grbit |= $fArabic << 6; + $grbit |= $fDspGuts << 7; + $grbit |= $fFrozenNoSplit << 8; + $grbit |= $fSelected << 9; + $grbit |= $fPaged << 10; + + $header = pack("vv", $record, $length); + $data = pack("vvv", $grbit, $rwTop, $colLeft); + // FIXME !!! + if ($this->_BIFF_version == 0x0500) { + $rgbHdr = 0x00000000; // Row/column heading and gridline color + $data .= pack("V", $rgbHdr); + } elseif ($this->_BIFF_version == 0x0600) { + $rgbHdr = 0x0040; // Row/column heading and gridline color index + $zoom_factor_page_break = 0x0000; + $zoom_factor_normal = 0x0000; + $data .= pack("vvvvV", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); + } + $this->_append($header.$data); + } + + /** + * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. + * + * @access private + */ + function _storeDefcol() + { + $record = 0x0055; // Record identifier + $length = 0x0002; // Number of bytes to follow + $colwidth = 0x0008; // Default column width + + $header = pack("vv", $record, $length); + $data = pack("v", $colwidth); + $this->_prepend($header . $data); + } + + /** + * Write BIFF record COLINFO to define column widths + * + * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C + * length record. + * + * @access private + * @param array $col_array This is the only parameter received and is composed of the following: + * 0 => First formatted column, + * 1 => Last formatted column, + * 2 => Col width (8.43 is Excel default), + * 3 => The optional XF format of the column, + * 4 => Option flags. + * 5 => Optional outline level + */ + function _storeColinfo($col_array) + { + if (isset($col_array[0])) { + $colFirst = $col_array[0]; + } + if (isset($col_array[1])) { + $colLast = $col_array[1]; + } + if (isset($col_array[2])) { + $coldx = $col_array[2]; + } else { + $coldx = 8.43; + } + if (isset($col_array[3])) { + $format = $col_array[3]; + } else { + $format = 0; + } + if (isset($col_array[4])) { + $grbit = $col_array[4]; + } else { + $grbit = 0; + } + if (isset($col_array[5])) { + $level = $col_array[5]; + } else { + $level = 0; + } + $record = 0x007D; // Record identifier + $length = 0x000B; // Number of bytes to follow + + $coldx += 0.72; // Fudge. Excel subtracts 0.72 !? + $coldx *= 256; // Convert to units of 1/256 of a char + + $ixfe = $this->_XF($format); + $reserved = 0x00; // Reserved + + $level = max(0, min($level, 7)); + $grbit |= $level << 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvC", $colFirst, $colLast, $coldx, + $ixfe, $grbit, $reserved); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record SELECTION. + * + * @access private + * @param array $array array containing ($rwFirst,$colFirst,$rwLast,$colLast) + * @see setSelection() + */ + function _storeSelection($array) + { + list($rwFirst,$colFirst,$rwLast,$colLast) = $array; + $record = 0x001D; // Record identifier + $length = 0x000F; // Number of bytes to follow + + $pnn = $this->_active_pane; // Pane position + $rwAct = $rwFirst; // Active row + $colAct = $colFirst; // Active column + $irefAct = 0; // Active cell ref + $cref = 1; // Number of refs + + if (!isset($rwLast)) { + $rwLast = $rwFirst; // Last row in reference + } + if (!isset($colLast)) { + $colLast = $colFirst; // Last col in reference + } + + // Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, + $irefAct, $cref, + $rwFirst, $rwLast, + $colFirst, $colLast); + $this->_append($header . $data); + } + + /** + * Store the MERGEDCELLS record for all ranges of merged cells + * + * @access private + */ + function _storeMergedCells() + { + // if there are no merged cell ranges set, return + if (count($this->_merged_ranges) == 0) { + return; + } + $record = 0x00E5; + $length = 2 + count($this->_merged_ranges) * 8; + + $header = pack('vv', $record, $length); + $data = pack('v', count($this->_merged_ranges)); + foreach ($this->_merged_ranges as $range) { + $data .= pack('vvvv', $range[0], $range[2], $range[1], $range[3]); + } + $this->_append($header . $data); + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in a worksheet. + * + * Excel only stores references to external sheets that are used in formulas. + * For simplicity we store references to all the sheets in the workbook + * regardless of whether they are used or not. This reduces the overall + * complexity and eliminates the need for a two way dialogue between the formula + * parser the worksheet objects. + * + * @access private + * @param integer $count The number of external sheet references in this worksheet + */ + function _storeExterncount($count) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $count); + $this->_prepend($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. A formula references a sheet name via an index. Since we store a + * reference to all of the external worksheets the EXTERNSHEET index is the same + * as the worksheet index. + * + * @access private + * @param string $sheetname The name of a external worksheet + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + + // References to the current sheet are encoded differently to references to + // external sheets. + // + if ($this->name == $sheetname) { + $sheetname = ''; + $length = 0x02; // The following 2 bytes + $cch = 1; // The following byte + $rgch = 0x02; // Self reference + } else { + $length = 0x02 + strlen($sheetname); + $cch = strlen($sheetname); + $rgch = 0x03; // Reference to a sheet in the current workbook + } + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_prepend($header . $data . $sheetname); + } + + /** + * Writes the Excel BIFF PANE record. + * The panes can either be frozen or thawed (unfrozen). + * Frozen panes are specified in terms of an integer number of rows and columns. + * Thawed panes are specified in terms of Excel's units for rows and columns. + * + * @access private + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function _storePanes($panes) + { + $y = $panes[0]; + $x = $panes[1]; + $rwTop = $panes[2]; + $colLeft = $panes[3]; + if (count($panes) > 4) { // if Active pane was received + $pnnAct = $panes[4]; + } else { + $pnnAct = null; + } + $record = 0x0041; // Record identifier + $length = 0x000A; // Number of bytes to follow + + // Code specific to frozen or thawed panes. + if ($this->_frozen) { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = $y; + } + if (!isset($colLeft)) { + $colLeft = $x; + } + } else { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = 0; + } + if (!isset($colLeft)) { + $colLeft = 0; + } + + // Convert Excel's row and column units to the internal units. + // The default row height is 12.75 + // The default column width is 8.43 + // The following slope and intersection values were interpolated. + // + $y = 20*$y + 255; + $x = 113.879*$x + 390; + } + + + // Determine which pane should be active. There is also the undocumented + // option to override this should it be necessary: may be removed later. + // + if (!isset($pnnAct)) { + if ($x != 0 && $y != 0) { + $pnnAct = 0; // Bottom right + } + if ($x != 0 && $y == 0) { + $pnnAct = 1; // Top right + } + if ($x == 0 && $y != 0) { + $pnnAct = 2; // Bottom left + } + if ($x == 0 && $y == 0) { + $pnnAct = 3; // Top left + } + } + + $this->_active_pane = $pnnAct; // Used in _storeSelection + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); + $this->_append($header . $data); + } + + /** + * Store the page setup SETUP BIFF record. + * + * @access private + */ + function _storeSetup() + { + $record = 0x00A1; // Record identifier + $length = 0x0022; // Number of bytes to follow + + $iPaperSize = $this->_paper_size; // Paper size + $iScale = $this->_print_scale; // Print scaling factor + $iPageStart = 0x01; // Starting page number + $iFitWidth = $this->_fit_width; // Fit to number of pages wide + $iFitHeight = $this->_fit_height; // Fit to number of pages high + $grbit = 0x00; // Option flags + $iRes = 0x0258; // Print resolution + $iVRes = 0x0258; // Vertical print resolution + $numHdr = $this->_margin_head; // Header Margin + $numFtr = $this->_margin_foot; // Footer Margin + $iCopies = 0x01; // Number of copies + + $fLeftToRight = 0x0; // Print over then down + $fLandscape = $this->_orientation; // Page orientation + $fNoPls = 0x0; // Setup not read from printer + $fNoColor = 0x0; // Print black and white + $fDraft = 0x0; // Print draft quality + $fNotes = 0x0; // Print notes + $fNoOrient = 0x0; // Orientation not set + $fUsePage = 0x0; // Use custom starting page + + $grbit = $fLeftToRight; + $grbit |= $fLandscape << 1; + $grbit |= $fNoPls << 2; + $grbit |= $fNoColor << 3; + $grbit |= $fDraft << 4; + $grbit |= $fNotes << 5; + $grbit |= $fNoOrient << 6; + $grbit |= $fUsePage << 7; + + $numHdr = pack("d", $numHdr); + $numFtr = pack("d", $numFtr); + if ($this->_byte_order) { // if it's Big Endian + $numHdr = strrev($numHdr); + $numFtr = strrev($numFtr); + } + + $header = pack("vv", $record, $length); + $data1 = pack("vvvvvvvv", $iPaperSize, + $iScale, + $iPageStart, + $iFitWidth, + $iFitHeight, + $grbit, + $iRes, + $iVRes); + $data2 = $numHdr.$numFtr; + $data3 = pack("v", $iCopies); + $this->_prepend($header . $data1 . $data2 . $data3); + } + + /** + * Store the header caption BIFF record. + * + * @access private + */ + function _storeHeader() + { + $record = 0x0014; // Record identifier + + $str = $this->_header; // header string + $cch = strlen($str); // Length of header string + if ($this->_BIFF_version == 0x0600) { + $encoding = 0x0; // TODO: Unicode support + $length = 3 + $cch; // Bytes to follow + } else { + $length = 1 + $cch; // Bytes to follow + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vC", $cch, $encoding); + } else { + $data = pack("C", $cch); + } + + $this->_prepend($header.$data.$str); + } + + /** + * Store the footer caption BIFF record. + * + * @access private + */ + function _storeFooter() + { + $record = 0x0015; // Record identifier + + $str = $this->_footer; // Footer string + $cch = strlen($str); // Length of footer string + if ($this->_BIFF_version == 0x0600) { + $encoding = 0x0; // TODO: Unicode support + $length = 3 + $cch; // Bytes to follow + } else { + $length = 1 + $cch; + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vC", $cch, $encoding); + } else { + $data = pack("C", $cch); + } + + $this->_prepend($header . $data . $str); + } + + /** + * Store the horizontal centering HCENTER BIFF record. + * + * @access private + */ + function _storeHcenter() + { + $record = 0x0083; // Record identifier + $length = 0x0002; // Bytes to follow + + $fHCenter = $this->_hcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fHCenter); + + $this->_prepend($header.$data); + } + + /** + * Store the vertical centering VCENTER BIFF record. + * + * @access private + */ + function _storeVcenter() + { + $record = 0x0084; // Record identifier + $length = 0x0002; // Bytes to follow + + $fVCenter = $this->_vcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fVCenter); + $this->_prepend($header . $data); + } + + /** + * Store the LEFTMARGIN BIFF record. + * + * @access private + */ + function _storeMarginLeft() + { + $record = 0x0026; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_left; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Store the RIGHTMARGIN BIFF record. + * + * @access private + */ + function _storeMarginRight() + { + $record = 0x0027; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_right; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Store the TOPMARGIN BIFF record. + * + * @access private + */ + function _storeMarginTop() + { + $record = 0x0028; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_top; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Store the BOTTOMMARGIN BIFF record. + * + * @access private + */ + function _storeMarginBottom() + { + $record = 0x0029; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_bottom; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) { // if it's Big Endian + $data = strrev($data); + } + + $this->_prepend($header . $data); + } + + /** + * Merges the area given by its arguments. + * This is an Excel97/2000 method. It is required to perform more complicated + * merging than the normal setAlign('merge'). + * + * @access public + * @param integer $first_row First row of the area to merge + * @param integer $first_col First column of the area to merge + * @param integer $last_row Last row of the area to merge + * @param integer $last_col Last column of the area to merge + */ + function mergeCells($first_row, $first_col, $last_row, $last_col) + { + $record = 0x00E5; // Record identifier + $length = 0x000A; // Bytes to follow + $cref = 1; // Number of refs + + // Swap last row/col for first row/col as necessary + if ($first_row > $last_row) { + list($first_row, $last_row) = array($last_row, $first_row); + } + + if ($first_col > $last_col) { + list($first_col, $last_col) = array($last_col, $first_col); + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $cref, $first_row, $last_row, + $first_col, $last_col); + + $this->_append($header.$data); + } + + /** + * Write the PRINTHEADERS BIFF record. + * + * @access private + */ + function _storePrintHeaders() + { + $record = 0x002a; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintRwCol = $this->_print_headers; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintRwCol); + $this->_prepend($header . $data); + } + + /** + * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the + * GRIDSET record. + * + * @access private + */ + function _storePrintGridlines() + { + $record = 0x002b; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintGrid = $this->_print_gridlines; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintGrid); + $this->_prepend($header . $data); + } + + /** + * Write the GRIDSET BIFF record. Must be used in conjunction with the + * PRINTGRIDLINES record. + * + * @access private + */ + function _storeGridset() + { + $record = 0x0082; // Record identifier + $length = 0x0002; // Bytes to follow + + $fGridSet = !($this->_print_gridlines); // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fGridSet); + $this->_prepend($header . $data); + } + + /** + * Write the GUTS BIFF record. This is used to configure the gutter margins + * where Excel outline symbols are displayed. The visibility of the gutters is + * controlled by a flag in WSBOOL. + * + * @see _storeWsbool() + * @access private + */ + function _storeGuts() + { + $record = 0x0080; // Record identifier + $length = 0x0008; // Bytes to follow + + $dxRwGut = 0x0000; // Size of row gutter + $dxColGut = 0x0000; // Size of col gutter + + $row_level = $this->_outline_row_level; + $col_level = 0; + + // Calculate the maximum column outline level. The equivalent calculation + // for the row outline level is carried out in setRow(). + $colcount = count($this->_colinfo); + for ($i = 0; $i < $colcount; $i++) { + // Skip cols without outline level info. + if (count($this->_colinfo[$i]) >= 6) { + $col_level = max($this->_colinfo[$i][5], $col_level); + } + } + + // Set the limits for the outline levels (0 <= x <= 7). + $col_level = max(0, min($col_level, 7)); + + // The displayed level is one greater than the max outline levels + if ($row_level) { + $row_level++; + } + if ($col_level) { + $col_level++; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $dxRwGut, $dxColGut, $row_level, $col_level); + + $this->_prepend($header.$data); + } + + + /** + * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction + * with the SETUP record. + * + * @access private + */ + function _storeWsbool() + { + $record = 0x0081; // Record identifier + $length = 0x0002; // Bytes to follow + $grbit = 0x0000; + + // The only option that is of interest is the flag for fit to page. So we + // set all the options in one go. + // + /*if ($this->_fit_page) { + $grbit = 0x05c1; + } else { + $grbit = 0x04c1; + }*/ + // Set the option flags + $grbit |= 0x0001; // Auto page breaks visible + if ($this->_outline_style) { + $grbit |= 0x0020; // Auto outline styles + } + if ($this->_outline_below) { + $grbit |= 0x0040; // Outline summary below + } + if ($this->_outline_right) { + $grbit |= 0x0080; // Outline summary right + } + if ($this->_fit_page) { + $grbit |= 0x0100; // Page setup fit to page + } + if ($this->_outline_on) { + $grbit |= 0x0400; // Outline symbols displayed + } + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $this->_prepend($header . $data); + } + + /** + * Write the HORIZONTALPAGEBREAKS BIFF record. + * + * @access private + */ + function _storeHbreak() + { + // Return if the user hasn't specified pagebreaks + if (empty($this->_hbreaks)) { + return; + } + + // Sort and filter array of page breaks + $breaks = $this->_hbreaks; + sort($breaks, SORT_NUMERIC); + if ($breaks[0] == 0) { // don't use first break if it's 0 + array_shift($breaks); + } + + $record = 0x001b; // Record identifier + $cbrk = count($breaks); // Number of page breaks + if ($this->_BIFF_version == 0x0600) { + $length = 2 + 6*$cbrk; // Bytes to follow + } else { + $length = 2 + 2*$cbrk; // Bytes to follow + } + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + if ($this->_BIFF_version == 0x0600) { + $data .= pack("vvv", $break, 0x0000, 0x00ff); + } else { + $data .= pack("v", $break); + } + } + + $this->_prepend($header.$data); + } + + + /** + * Write the VERTICALPAGEBREAKS BIFF record. + * + * @access private + */ + function _storeVbreak() + { + // Return if the user hasn't specified pagebreaks + if (empty($this->_vbreaks)) { + return; + } + + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. + // It is slightly higher in Excel 97/200, approx. 1026 + $breaks = array_slice($this->_vbreaks,0,1000); + + // Sort and filter array of page breaks + sort($breaks, SORT_NUMERIC); + if ($breaks[0] == 0) { // don't use first break if it's 0 + array_shift($breaks); + } + + $record = 0x001a; // Record identifier + $cbrk = count($breaks); // Number of page breaks + if ($this->_BIFF_version == 0x0600) { + $length = 2 + 6*$cbrk; // Bytes to follow + } else { + $length = 2 + 2*$cbrk; // Bytes to follow + } + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + if ($this->_BIFF_version == 0x0600) { + $data .= pack("vvv", $break, 0x0000, 0xffff); + } else { + $data .= pack("v", $break); + } + } + + $this->_prepend($header . $data); + } + + /** + * Set the Biff PROTECT record to indicate that the worksheet is protected. + * + * @access private + */ + function _storeProtect() + { + // Exit unless sheet protection has been specified + if ($this->_protect == 0) { + return; + } + + $record = 0x0012; // Record identifier + $length = 0x0002; // Bytes to follow + + $fLock = $this->_protect; // Worksheet is protected + + $header = pack("vv", $record, $length); + $data = pack("v", $fLock); + + $this->_prepend($header.$data); + } + + /** + * Write the worksheet PASSWORD record. + * + * @access private + */ + function _storePassword() + { + // Exit unless sheet protection and password have been specified + if (($this->_protect == 0) || (!isset($this->_password))) { + return; + } + + $record = 0x0013; // Record identifier + $length = 0x0002; // Bytes to follow + + $wPassword = $this->_password; // Encoded password + + $header = pack("vv", $record, $length); + $data = pack("v", $wPassword); + + $this->_prepend($header . $data); + } + + + /** + * Insert a 24bit bitmap image in a worksheet. + * + * @access public + * @param integer $row The row we are going to insert the bitmap into + * @param integer $col The column we are going to insert the bitmap into + * @param string $bitmap The bitmap filename + * @param integer $x The horizontal position (offset) of the image inside the cell. + * @param integer $y The vertical position (offset) of the image inside the cell. + * @param integer $scale_x The horizontal scale + * @param integer $scale_y The vertical scale + */ + function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1) + { + $bitmap_array = $this->_processBitmap($bitmap); + if ($this->isError($bitmap_array)) { + $this->writeString($row, $col, $bitmap_array->getMessage()); + return; + } + list($width, $height, $size, $data) = $bitmap_array; //$this->_processBitmap($bitmap); + + // Scale the frame of the image. + $width *= $scale_x; + $height *= $scale_y; + + // Calculate the vertices of the image and write the OBJ record + $this->_positionImage($col, $row, $x, $y, $width, $height); + + // Write the IMDATA record to store the bitmap data + $record = 0x007f; + $length = 8 + $size; + $cf = 0x09; + $env = 0x01; + $lcb = $size; + + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); + $this->_append($header.$data); + } + + /** + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * + * @access private + * @note the SDK incorrectly states that the height should be expressed as a + * percentage of 1024. + * @param integer $col_start Col containing upper left corner of object + * @param integer $row_start Row containing top left corner of object + * @param integer $x1 Distance to left side of object + * @param integer $y1 Distance to top of object + * @param integer $width Width of image frame + * @param integer $height Height of image frame + */ + function _positionImage($col_start, $row_start, $x1, $y1, $width, $height) + { + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= $this->_sizeCol($col_start)) { + $x1 = 0; + } + if ($y1 >= $this->_sizeRow($row_start)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= $this->_sizeCol($col_end)) { + $width -= $this->_sizeCol($col_end); + $col_end++; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= $this->_sizeRow($row_end)) { + $height -= $this->_sizeRow($row_end); + $row_end++; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero eight or width. + // + if ($this->_sizeCol($col_start) == 0) { + return; + } + if ($this->_sizeCol($col_end) == 0) { + return; + } + if ($this->_sizeRow($row_start) == 0) { + return; + } + if ($this->_sizeRow($row_end) == 0) { + return; + } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / $this->_sizeCol($col_start) * 1024; + $y1 = $y1 / $this->_sizeRow($row_start) * 256; + $x2 = $width / $this->_sizeCol($col_end) * 1024; // Distance to right side of object + $y2 = $height / $this->_sizeRow($row_end) * 256; // Distance to bottom of object + + $this->_storeObjPicture($col_start, $x1, + $row_start, $y1, + $col_end, $x2, + $row_end, $y2); + } + + /** + * Convert the width of a cell from user's units to pixels. By interpolation + * the relationship is: y = 7x +5. If the width hasn't been set by the user we + * use the default value. If the col is hidden we use a value of zero. + * + * @access private + * @param integer $col The column + * @return integer The width in pixels + */ + function _sizeCol($col) + { + // Look up the cell value to see if it has been changed + if (isset($this->col_sizes[$col])) { + if ($this->col_sizes[$col] == 0) { + return(0); + } else { + return(floor(7 * $this->col_sizes[$col] + 5)); + } + } else { + return(64); + } + } + + /** + * Convert the height of a cell from user's units to pixels. By interpolation + * the relationship is: y = 4/3x. If the height hasn't been set by the user we + * use the default value. If the row is hidden we use a value of zero. (Not + * possible to hide row yet). + * + * @access private + * @param integer $row The row + * @return integer The width in pixels + */ + function _sizeRow($row) + { + // Look up the cell value to see if it has been changed + if (isset($this->_row_sizes[$row])) { + if ($this->_row_sizes[$row] == 0) { + return(0); + } else { + return(floor(4/3 * $this->_row_sizes[$row])); + } + } else { + return(17); + } + } + + /** + * Store the OBJ record that precedes an IMDATA record. This could be generalise + * to support other Excel objects. + * + * @access private + * @param integer $colL Column containing upper left corner of object + * @param integer $dxL Distance from left side of cell + * @param integer $rwT Row containing top left corner of object + * @param integer $dyT Distance from top of cell + * @param integer $colR Column containing lower right corner of object + * @param integer $dxR Distance from right of cell + * @param integer $rwB Row containing bottom right corner of object + * @param integer $dyB Distance from bottom of cell + */ + function _storeObjPicture($colL,$dxL,$rwT,$dyT,$colR,$dxR,$rwB,$dyB) + { + $record = 0x005d; // Record identifier + $length = 0x003c; // Bytes to follow + + $cObj = 0x0001; // Count of objects in file (set to 1) + $OT = 0x0008; // Object type. 8 = Picture + $id = 0x0001; // Object ID + $grbit = 0x0614; // Option flags + + $cbMacro = 0x0000; // Length of FMLA structure + $Reserved1 = 0x0000; // Reserved + $Reserved2 = 0x0000; // Reserved + + $icvBack = 0x09; // Background colour + $icvFore = 0x09; // Foreground colour + $fls = 0x00; // Fill pattern + $fAuto = 0x00; // Automatic fill + $icv = 0x08; // Line colour + $lns = 0xff; // Line style + $lnw = 0x01; // Line weight + $fAutoB = 0x00; // Automatic border + $frs = 0x0000; // Frame style + $cf = 0x0009; // Image format, 9 = bitmap + $Reserved3 = 0x0000; // Reserved + $cbPictFmla = 0x0000; // Length of FMLA structure + $Reserved4 = 0x0000; // Reserved + $grbit2 = 0x0001; // Option flags + $Reserved5 = 0x0000; // Reserved + + + $header = pack("vv", $record, $length); + $data = pack("V", $cObj); + $data .= pack("v", $OT); + $data .= pack("v", $id); + $data .= pack("v", $grbit); + $data .= pack("v", $colL); + $data .= pack("v", $dxL); + $data .= pack("v", $rwT); + $data .= pack("v", $dyT); + $data .= pack("v", $colR); + $data .= pack("v", $dxR); + $data .= pack("v", $rwB); + $data .= pack("v", $dyB); + $data .= pack("v", $cbMacro); + $data .= pack("V", $Reserved1); + $data .= pack("v", $Reserved2); + $data .= pack("C", $icvBack); + $data .= pack("C", $icvFore); + $data .= pack("C", $fls); + $data .= pack("C", $fAuto); + $data .= pack("C", $icv); + $data .= pack("C", $lns); + $data .= pack("C", $lnw); + $data .= pack("C", $fAutoB); + $data .= pack("v", $frs); + $data .= pack("V", $cf); + $data .= pack("v", $Reserved3); + $data .= pack("v", $cbPictFmla); + $data .= pack("v", $Reserved4); + $data .= pack("v", $grbit2); + $data .= pack("V", $Reserved5); + + $this->_append($header . $data); + } + + /** + * Convert a 24 bit bitmap into the modified internal format used by Windows. + * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the + * MSDN library. + * + * @access private + * @param string $bitmap The bitmap to process + * @return array Array with data and properties of the bitmap + */ + function _processBitmap($bitmap) + { + // Open file. + $bmp_fd = @fopen($bitmap,"rb"); + if (!$bmp_fd) { + $this->raiseError("Couldn't import $bitmap"); + } + + // Slurp the file into a string. + $data = fread($bmp_fd, filesize($bitmap)); + + // Check that the file is big enough to be a bitmap. + if (strlen($data) <= 0x36) { + $this->raiseError("$bitmap doesn't contain enough data.\n"); + } + + // The first 2 bytes are used to identify the bitmap. + $identity = unpack("A2ident", $data); + if ($identity['ident'] != "BM") { + $this->raiseError("$bitmap doesn't appear to be a valid bitmap image.\n"); + } + + // Remove bitmap data: ID. + $data = substr($data, 2); + + // Read and remove the bitmap size. This is more reliable than reading + // the data size at offset 0x22. + // + $size_array = unpack("Vsa", substr($data, 0, 4)); + $size = $size_array['sa']; + $data = substr($data, 4); + $size -= 0x36; // Subtract size of bitmap header. + $size += 0x0C; // Add size of BIFF header. + + // Remove bitmap data: reserved, offset, header length. + $data = substr($data, 12); + + // Read and remove the bitmap width and height. Verify the sizes. + $width_and_height = unpack("V2", substr($data, 0, 8)); + $width = $width_and_height[1]; + $height = $width_and_height[2]; + $data = substr($data, 8); + if ($width > 0xFFFF) { + $this->raiseError("$bitmap: largest image width supported is 65k.\n"); + } + if ($height > 0xFFFF) { + $this->raiseError("$bitmap: largest image height supported is 65k.\n"); + } + + // Read and remove the bitmap planes and bpp data. Verify them. + $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); + $data = substr($data, 4); + if ($planes_and_bitcount[2] != 24) { // Bitcount + $this->raiseError("$bitmap isn't a 24bit true color bitmap.\n"); + } + if ($planes_and_bitcount[1] != 1) { + $this->raiseError("$bitmap: only 1 plane supported in bitmap image.\n"); + } + + // Read and remove the bitmap compression. Verify compression. + $compression = unpack("Vcomp", substr($data, 0, 4)); + $data = substr($data, 4); + + //$compression = 0; + if ($compression['comp'] != 0) { + $this->raiseError("$bitmap: compression not supported in bitmap image.\n"); + } + + // Remove bitmap data: data size, hres, vres, colours, imp. colours. + $data = substr($data, 20); + + // Add the BITMAPCOREHEADER data + $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + $data = $header . $data; + + return (array($width, $height, $size, $data)); + } + + /** + * Store the window zoom factor. This should be a reduced fraction but for + * simplicity we will store all fractions with a numerator of 100. + * + * @access private + */ + function _storeZoom() + { + // If scale is 100 we don't need to write a record + if ($this->_zoom == 100) { + return; + } + + $record = 0x00A0; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->_zoom, 100); + $this->_append($header . $data); + } + + /** + * FIXME: add comments + */ + function setValidation($row1, $col1, $row2, $col2, &$validator) + { + $this->_dv[] = $validator->_getData() . + pack("vvvvv", 1, $row1, $row2, $col1, $col2); + } + + /** + * Store the DVAL and DV records. + * + * @access private + */ + function _storeDataValidity() + { + $record = 0x01b2; // Record identifier + $length = 0x0012; // Bytes to follow + + $grbit = 0x0002; // Prompt box at cell, no cached validity data at DV records + $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position + $verPos = 0x00000000; // Vertical position of prompt box, if fixed position + $objId = 0xffffffff; // Object identifier of drop down arrow object, or -1 if not visible + + $header = pack('vv', $record, $length); + $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, + count($this->_dv)); + $this->_append($header.$data); + + $record = 0x01be; // Record identifier + foreach ($this->_dv as $dv) { + $length = strlen($dv); // Bytes to follow + $header = pack("vv", $record, $length); + $this->_append($header . $dv); + } + } +} +?> diff --git a/fannie/src/screen.css b/fannie/src/screen.css new file mode 100644 index 000000000..e5c2aa37c --- /dev/null +++ b/fannie/src/screen.css @@ -0,0 +1,84 @@ +BODY { + font-family: Helvectica, Arial, Sans, Sans-serif; + font-size: .83em; + padding-left: 7px; + padding-right: 7px; + padding-top: 7px; + width: 1000px; + margin: auto; +} + +H1 { + font-size: 1.5em; +} + +LI { + line-height: 2em; +} + +UL { + list-style-type: none; + padding-left: 0px; +} + +#page_top { + border-bottom: 1px solid #999; + color: #666; + font-size: 2em; +} + +#page_nav { + float: left; + border-right: 1px solid #999; + padding-right: 8px; + width: 118px; +} + +#page_panel { + float: left; + padding-left: 8px; + padding-top: 8px; + padding-bottom: 8px; + width: 865px; +} + +#page_foot { + border-top: 1px solid #999; + clear: both; + float: left; + width: 100%; +} + + #page_top a:active, + #page_top a:link, + #page_top a:hover, + #page_top a:visited { + color: #666; + text-decoration: none; + } + + #page_nav UL { + margin-top: 8px; + } + + + /* TODO - These should have better names */ +.p_status { + margin: .3em 0; + color: #666; +} + +.status { + color: #F00; +} + +.accesskey { + color: #00297A; +} + +.textAlignCenter { + text-align: center; +} +.textAlignRight { + text-align: right; +} \ No newline at end of file diff --git a/fannie/src/select_dlog.php b/fannie/src/select_dlog.php new file mode 100644 index 000000000..91b67e293 --- /dev/null +++ b/fannie/src/select_dlog.php @@ -0,0 +1,297 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("SQLManager")) require_once("sql/SQLManager.php"); + +/** + @file +*/ + +/** + @brief Get an appropriate transaction view + @param $date a single date + @param $end_date a second date + @return A database table name + + If called with a single argument, returns the smallest + available transaction view containing that day. + + If called with two arguments, returns the smallest + available transaction view containing that date range. + + Return value is fully qualified as db_name.table_name + + This function differs from select_dtrans() by using + a dlog style view. The returned table will omit testing + and canceled transaction records. +*/ +function select_dlog($date, $end_date="",$unions=True){ + global $dbc,$FANNIE_TRANS_DB,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB,$FANNIE_ARCHIVE_METHOD; + + $dbconn = ($FANNIE_SERVER_DBMS=='MSSQL')?'.dbo.':'.'; + + $diffQ = $dbc->prepare_statement("select ".$dbc->datediff($dbc->now(),'?')." as daydiff"); + $diffR = $dbc->exec_statement($diffQ,array($date)); + $diffRow = $dbc->fetch_array($diffR); + $daydiff = abs($diffRow['daydiff']); + if ($FANNIE_ARCHIVE_METHOD == "partitions"){ + return ($daydiff == 0) ? $FANNIE_TRANS_DB.$dbconn."dlog" : $FANNIE_ARCHIVE_DB.$dbconn."dlogBig"; + } + + // parse out starting month and year + $month=0; + $year=0; + $array = explode("-",$date); + if (is_array($array) && count($array) == 3){ + $month = $array[1]; + $year = $array[0]; + } + else { + $array = explode("/",$date); + if (is_array($array) && count($array) == 3){ + $month = $array[0]; + $year = $array[2]; + } + } + if ($month == 0 && $year == 0) return "dlog"; + if (strlen($year) == 2) $year = "20".$year; + + // no end date, so give the smallest chunk + // with the given day + if ($end_date == ''){ + if ($daydiff < 1){ + return $FANNIE_TRANS_DB.$dbconn."dlog"; + } + if ($daydiff < 15){ + return $FANNIE_TRANS_DB.$dbconn."dlog_15"; + } + return $FANNIE_ARCHIVE_DB.$dbconn."dlog".$year.(str_pad($month,2,'0',STR_PAD_LEFT)); + } + + // new - get end_date + $endarray = explode('-',$end_date); + $endyear = $endarray[0]; + $endmonth = 0; + if ($endyear == $end_date){ + $endarray = explode("/",$end_date); + $endmonth = $endarray[0]; + $endyear = $endarray[2]; + } + else + $endmonth = $endarray[1]; + if ($endmonth == $end_date){ + return "dlog"; + } + if (strlen($endyear) < 4){ + $endyear = "20".$endyear; + } + + $diffR = $dbc->exec_statement($diffQ,array($end_date)); + $diffRow = $dbc->fetch_array($diffR); + $enddiff = abs($diffRow['daydiff']); + + // if one of the available snapshots contains + // both dates, return that + if ($enddiff < 1 && $daydiff < 1) + return $FANNIE_TRANS_DB.$dbconn."dlog"; + elseif ($enddiff < 15 && $daydiff < 15) + return $FANNIE_TRANS_DB.$dbconn."dlog_15"; + elseif ($endmonth == $month && $endyear == $year) + return $FANNIE_ARCHIVE_DB.$dbconn."dlog".$year.(str_pad($month,2,'0',STR_PAD_LEFT)); + elseif ($enddiff < 91 && $daydiff < 91) + return $FANNIE_TRANS_DB.$dbconn."dlog_90_view"; + + // otherwise: + // create a union of dlog archives containing the + // specified span + $endstamp = mktime(0,0,0,$endmonth,1,$endyear); + $startstamp = mktime(0,0,0,$month,1,$year); + $data = "(select * from "; + $tables = array(); + while ($startstamp <= $endstamp){ + $data .= $FANNIE_ARCHIVE_DB.$dbconn."dlog{$year}{$month} union all select * from "; + $tables[] = $FANNIE_ARCHIVE_DB.$dbconn."dlog{$year}{$month}"; + $month += 1; + if ($month > 12){ + $year += 1; + $month = 1; + } + $month = str_pad($month,2,'0',STR_PAD_LEFT); + $startstamp = mktime(0,0,0,$month,1,$year); + } + preg_match("/(.*) union all select \* from $/",$data,$matches); + $data = $matches[1].")"; + + if ($unions) return $data; + else return $tables; +} + +/** @cond */ +function select_dlog_array($date,$end_date=""){ + return select_dlog($date,$end_date,False); +} +/** @endcond */ + +/** @cond */ +function fixup_dquery($query,$table){ + if (!is_array($table)){ + return str_replace("__TRANS__",$table,$query); + } + $order = ""; + $tmp = preg_split("/ORDER\s+BY/i",$query,NULL,PREG_SPLIT_NO_EMPTY); + if (count($tmp)==2){ + $query = $tmp[0]; + $order = " ORDER BY ".$tmp[1]; + } + $ret = ""; + for($i=0;$i<count($table);$i++){ + $ret .= str_replace("__TRANS__",$table[$i],$query); + if($i<count($table)-1) + $ret .= " UNION ALL "; + } + return $ret.$order; +} +/** @endcond */ + +/** + @brief Get an appropriate transaction table + @param $date a single date + @param $end_date a second date + @return A database table name + + If called with a single argument, returns the smallest + available transaction table containing that day. + + If called with two arguments, returns the smallest + available transaction table containing that date range. + + Return value is fully qualified as db_name.table_name +*/ +function select_dtrans($date, $end_date=""){ + global $dbc,$FANNIE_TRANS_DB,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB,$FANNIE_ARCHIVE_METHOD; + + $dbconn = ($FANNIE_SERVER_DBMS=='MSSQL')?'.dbo.':'.'; + + $diffQ = $dbc->prepare_statement("select ".$dbc->datediff($dbc->now(),'?')." as daydiff"); + $diffR = $dbc->exec_statement($diffQ,array($date)); + $diffRow = $dbc->fetch_array($diffR); + $daydiff = abs($diffRow['daydiff']); + if ($FANNIE_ARCHIVE_METHOD == "partitions"){ + return ($daydiff == 0) ? $FANNIE_TRANS_DB.$dbconn."dtransactions" : $FANNIE_ARCHIVE_DB.$dbconn."bigArchive"; + } + + // parse out starting month and year + $array = explode("-",$date); + $month = $array[1]; + $year = $array[0]; + if ($year == $date){ + $array = explode("/",$date); + $month = $array[0]; + $year = $array[2]; + } + if ($month == $date) return "dtransactions"; + if (strlen($year) == 2) $year = "20".$year; + + // no end date, so give the smallest chunk + // with the given day + if ($end_date == ''){ + if ($daydiff < 1){ + return $FANNIE_TRANS_DB.$dbconn."dtransactions"; + } + return $FANNIE_ARCHIVE_DB.$dbconn."transArchive".$year.(str_pad($month,2,'0',STR_PAD_LEFT)); + } + + // new - get end_date + $endarray = explode('-',$end_date); + $endmonth = $endarray[1]; + $endyear = $endarray[0]; + if ($endyear == $end_date){ + $endarray = explode("/",$end_date); + $endmonth = $endarray[0]; + $endyear = $endarray[2]; + } + if ($endmonth == $end_date){ + return "dtransactions"; + } + if (strlen($endyear) < 4){ + $endyear = "20".$endyear; + } + $diffR = $dbc->exec_statement($diffQ,array($end_date)); + $diffRow = $dbc->fetch_array($diffR); + $enddiff = abs($diffRow['daydiff']); + + // if one of the available snapshots contains + // both dates, return that + if ($enddiff < 1 && $daydiff < 1) + return $FANNIE_TRANS_DB.$dbconn."dtransactions"; + elseif ($endmonth == $month && $endyear == $year) + return $FANNIE_ARCHIVE_DB.$dbconn."transArchive".$year.(str_pad($month,2,'0',STR_PAD_LEFT)); + elseif ($enddiff < 91 && $daydiff < 91) + return $FANNIE_TRANS_DB.$dbconn."transarchive"; + + // otherwise: + // create a union of dlog archives containing the + // specified span + $endstamp = mktime(0,0,0,$endmonth,1,$endyear); + $startstamp = mktime(0,0,0,$month,1,$year); + $data = "(select * from "; + while ($startstamp <= $endstamp){ + $data .= $FANNIE_ARCHIVE_DB.$dbconn."transArchive{$year}{$month} union all select * from "; + $month += 1; + if ($month > 12){ + $year += 1; + $month = 1; + } + $month = str_pad($month,2,'0',STR_PAD_LEFT); + $startstamp = mktime(0,0,0,$month,1,$year); + } + preg_match("/(.*) union all select \* from $/",$data,$matches); + $data = $matches[1].")"; + + return $data; +} + +/** @cond */ +// standard comparison function for query rows +function standard_compare($v1,$v2){ + global $STANDARD_COMPARE_ORDER,$STANDARD_COMPARE_DIRECTION; + if (strstr($STANDARD_COMPARE_ORDER,".")){ + $STANDARD_COMPARE_ORDER = substr($STANDARD_COMPARE_ORDER,strpos($STANDARD_COMPARE_ORDER,".")+1); + } + $a = $v1[$STANDARD_COMPARE_ORDER]; + $b = $v2[$STANDARD_COMPARE_ORDER]; + if (is_numeric($a) && is_numeric($b)){ + if ($STANDARD_COMPARE_DIRECTION == "ASC") + return ($a < $b) ? -1 : 1; + else + return ($a > $b) ? -1 : 1; + } + else{ + if ($STANDARD_COMPARE_DIRECTION == "ASC") + return (strcmp($a,$b)<=0) ? -1 : 1; + else + return (strcmp($a,$b)>=0) ? -1 : 1; + } +} +/** @endcond */ +?> diff --git a/fannie/src/style.css b/fannie/src/style.css new file mode 100644 index 000000000..36c0c7de8 --- /dev/null +++ b/fannie/src/style.css @@ -0,0 +1,330 @@ +/*#body { + color:#444444; + +}*/ + +#box { border: 2px; + border-style: solid; + padding: 2em; + margin: 0.75em; +} + +p { + font-family: "Arial,Lucida"; + color:#330066; + font-size: 1em; + line-height: 1.4em; +} + +h2 { + font-family: "Arial,Lucida"; + font-size: 1.6em; + line-height: 1.8em; + color:#330066; +} + +h3 { + font-family: "Arial,Lucia"; + font-size: 1.2em; + font-weight: bolder; + line-height: 0.8em; + color: #330066; +} +h4 { + font-family: "Arial,Lucia"; + font-size: 1.4em; + line-height: 1.4em; + letter-spacing: 0.2em; + color:#330066; +} + +#alert { + display: block; + background-color: #FFFFCC; + padding: 3px; + margin: 3px; + font-family: "Arial,Lucida"; + font-size: 1em; + font-weight: bolder; +} + +/* */ +/* --- Autonomous Style --- */ +/* */ + +body { + font-family:arial; + font-size:12px; + cursor:default; + color:#999999; +} + +td { + font-family:arial; + font-size:12px; + cursor:default; + color:#444444; +} + +th { + font-family:arial; + font-size:12px; + font-weight:bold; + color:#444444; +} + +a { + color:#330066; + text-decoration:none; + font-size:13px +} + +a:hover { + color:#330066; + text-decoration:underline; +} + +input { + font-family:monaco; + font-size:12px; + padding:0px; + height:21px; +/* background-color:#F9F9F9; */ + color:#000000; + /* make button more visually obvious... + border-color:#CCCCCC; + border-style:solid; + border-width:1; + background-color:#EEEEEE; + */ +} + +#loading { + font:bold 12px Verdana; + color:red; +} + +/* */ +/* --- phpMyEdit Styles --- */ +/* */ + +hr.pme-hr { border: 0px solid; padding: 0px; margin: 0px; border-top-width: 1px; height: 1px; } +table.pme-main { border: #004d9c 1px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; } +table.pme-navigation { border: #004d9c 0px solid; border-collapse: collapse; border-spacing: 0px; width: 100%; } +th.pme-header { border: #004d9c 1px solid; padding: 4px; background: #add8e6; } +td.pme-key-0, td.pme-value-0, td.pme-help-0, td.pme-navigation-0, td.pme-cell-0, +td.pme-key-1, td.pme-value-1, td.pme-help-0, td.pme-navigation-1, td.pme-cell-1, +td.pme-sortinfo, td.pme-filter { border: #004d9c 1px solid; padding: 3px; } +td.pme-buttons { text-align: left; } +td.pme-message { text-align: center; } +td.pme-stats { text-align: right; } + +/* */ +/* --- CalendarControl Styles --- */ +/* */ + +#CalendarControlIFrame { + display: none; + left: 0px; + position: absolute; + top: 0px; + height: 250px; + width: 250px; + z-index: 99; +} + +#CalendarControl { + position:absolute; + background-color:#FFF; + margin:0; + padding:0; + display:none; + z-index: 100; +} + +#CalendarControl table { + font-family: arial, verdana, helvetica, sans-serif; + font-size: 8pt; + border-left: 1px solid #336; + border-right: 1px solid #336; +} + +#CalendarControl th { + font-weight: normal; +} + +#CalendarControl th a { + font-weight: normal; + text-decoration: none; + color: #FFF; + padding: 1px; +} + +#CalendarControl td { + text-align: center; +} + +#CalendarControl .header { + background-color: #330066; +} + +#CalendarControl .weekday { + background-color: #DDD; + color: #000; +} + +#CalendarControl .weekend { + background-color: #FFC; + color: #000; +} + +#CalendarControl .current { + border: 1px solid #339; + background-color: #336; + color: #FFF; +} + +#CalendarControl .weekday, +#CalendarControl .weekend, +#CalendarControl .current { + display: block; + text-decoration: none; + border: 1px solid #FFF; + width: 2em; +} + +#CalendarControl .weekday:hover, +#CalendarControl .weekend:hover, +#CalendarControl .current:hover { + color: #FFF; + background-color: #336; + border: 1px solid #999; +} + +#CalendarControl .previous { + text-align: left; +} + +#CalendarControl .next { + text-align: right; +} + +#CalendarControl .previous, +#CalendarControl .next { + padding: 1px 3px 1px 3px; + font-size: 1.4em; +} + +#CalendarControl .previous a, +#CalendarControl .next a { + color: #FFF; + text-decoration: none; + font-weight: bold; +} + +#CalendarControl .title { + text-align: center; + font-weight: bold; + color: #FFF; +} + +#CalendarControl .empty { + background-color: #CCC; + border: 1px solid #FFF; +} + +/* NEW MENUS */ +ul#css_menu_root { + padding: 0; + text-align: left; +} + +ul#css_menu_root div.sub { + margin-bottom: 5px; + padding-bottom: 5px; + border-bottom: solid 1px black; +} + +ul#css_menu_root a { + font-size: 16px; + font-family:Arial; + text-decoration: none; +} + +ul#css_menu_root li { + list-style-type: none; + padding-bottom: 0; +} + +ul#css_menu_root li div.submenu { + z-index: 1; + margin-top: 10px; + position: absolute; + line-height: 1.8em; +} + +ul#css_menu_root li div.submenu ul { + background: #ffffff; + border: solid 1px black; + padding: 2px; + padding-left: 3px; +} + +ul#css_menu_root li div.submenu a { + font-size: 13px; +} + +ul#css_menu_root li div.menuwrapper { + position: relative; + margin-left: -5px; +} + + +ul#css_menu_root li:hover { + background: #bbbbbb; +} + +/* I couldn't figure out how to change + * the link color without changing ALL + * the links, so I resorted to light enough + * highlighting that I could leave the + * foreground color alone +ul#css_menu_root li:hover a { + color: #ffffff; +} +*/ + +ul#css_menu_root li div.level0 { + display: none; +} + +ul#css_menu_root li:hover div.level0{ + display: block; +} + +/* menu are no longer infinite + * each new layer needs a pair + * of show/hide settings like + * these */ +div.level0 li div.level1 { + display: none; +} + +div.level0 li:hover div.level1 { + display: block; +} + +div.level1 li div.level2 { + display: none; +} + +div.level1 li:hover div.level2 { + display: block; +} + +.MemFormTable th { + text-align: right; + background: #330066; + color: #fff; + padding: 0 5px 0 2px; +} diff --git a/fannie/src/tmp_dir.php b/fannie/src/tmp_dir.php new file mode 100644 index 000000000..76e15f28d --- /dev/null +++ b/fannie/src/tmp_dir.php @@ -0,0 +1,41 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +// function sys_get_temp_dir doesn't exist in PHP < 5.2.1 + +if ( !function_exists('sys_get_temp_dir')) { + function sys_get_temp_dir() { + if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } + if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); } + if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); } + $tempfile=tempnam(__FILE__,''); + if (file_exists($tempfile)) { + unlink($tempfile); + return realpath(dirname($tempfile)); + } + return null; + } +} + + +?> diff --git a/fannie/src/trans_connect.php b/fannie/src/trans_connect.php new file mode 100644 index 000000000..427006134 --- /dev/null +++ b/fannie/src/trans_connect.php @@ -0,0 +1,35 @@ +<?php # Script 8.1 - mysql_connect.php (Second version after 7.2) + +// This file contains the database access information. +// This file also establishes a connection to MySQL and selects the database. + +/* try to deal with relative paths for includes */ +$path = ""; +$found = False; +$uri = $_SERVER['REQUEST_URI']; +$tmp = explode("?",$uri); +if (is_array($tmp) && count($tmp) > 1) + $uri = $tmp[0]; +foreach(explode("/",$uri) as $x){ + if (strpos($x,".php") === False + && strlen($x) != 0){ + $path .= "../"; + } + if (!$found && stripos($x,"fannie") !== False){ + $found = True; + $path = ""; + } +} + +if (!isset($FANNIE_SERVER)) + include($path.'config.php'); + +if (!class_exists("SQLManager")) + include($path.'src/SQLManager.php'); + +// Make the connection. +$dbc = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); +setlocale(LC_MONETARY, 'en_US'); + +?> diff --git a/fannie/src/xmlData.php b/fannie/src/xmlData.php new file mode 100644 index 000000000..15a123004 --- /dev/null +++ b/fannie/src/xmlData.php @@ -0,0 +1,83 @@ +<?php + +class xmlData { + + var $parser; + var $DATA; + var $curTag; + var $valid; + + function xmlData($str){ + $this->valid = False; + $this->parser = xml_parser_create(); + xml_set_object($this->parser,$this); + xml_set_element_handler($this->parser,"startTag","endTag"); + xml_set_character_data_handler($this->parser,"tagData"); + xml_parse($this->parser,$str,True); + xml_parser_free($this->parser); + } + + function startTag($parser,$name,$attr){ + $name = strtoupper($name); + if (isset($attr["KEY"])) + $name = strtoupper($attr["KEY"]); + $this->curTag = array("tag"=>$name,"attributes"=>$attr,"chardata"=>""); + } + + function endTag($parser,$name){ + $name = $this->curTag["tag"]; + if (!isset($this->DATA["$name"])) + $this->DATA["$name"] = array(); + array_push($this->DATA["$name"],$this->curTag); + $this->valid = True; + } + + function tagData($parser,$data){ + $this->curTag["chardata"] = $data; + } + + function get($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + if (count($this->DATA["$tagname"]) == 1){ + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + + } + else { + $ret = array(); + foreach ($this->DATA["$tagname"] as $d) + array_push($ret,$d["chardata"]); + return $ret; + } + } + + function isValid(){ return $this->valid; } + + function get_first($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + else { + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + } + } + + function array_dump(){ + $ret = array(); + foreach ($this->DATA as $field=>$value){ + if (isset($value[0]) && + isset($value[0]["chardata"])) + $ret[$field] = $value[0]["chardata"]; + } + return $ret; + } +} + +?> diff --git a/fannie/sync/SyncIndexPage.php b/fannie/sync/SyncIndexPage.php new file mode 100644 index 000000000..8e7a6bdba --- /dev/null +++ b/fannie/sync/SyncIndexPage.php @@ -0,0 +1,68 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * 28Feb13 Andy Theuninck wrapped as class + * 19Jan13 Eric Lee Add productUser to table list + * 10Oct12 Eric Lee Add memberCards to table list +*/ + +include('../config.php'); +include($FANNIE_ROOT.'classlib2.0/FanniePage.php'); + +class SyncIndexPage extends FanniePage { + + protected $title = "Fannie : Sync Lane"; + protected $header = "Sync Lane Operational Tables"; + + function body_content(){ + ob_start(); + ?> + <form action="TableSyncPage.php" method="get"> + + <b>Table</b>: <select name="tablename"> + <option value="">Select a table</option> + <option value="products">Products</option> + <option value="productUser">Extra Product Info</option> + <option value="custdata">Members</option> + <option value="memberCards">Membership Cards</option> + <option value="employees">Cashiers</option> + <option value="departments">Departments</option> + <option value="tenders">Tenders</option> + </select><br /><br /> + + <b>Other table</b>: <input type="text" name="othertable" /><br /><br /> + + <input type="submit" value="Send Data" /> + </form> + <?php + return ob_get_clean(); + } +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new SyncIndexPage(); + $obj->draw_page(); +} + +?> diff --git a/fannie/sync/TableSyncPage.php b/fannie/sync/TableSyncPage.php new file mode 100644 index 000000000..d6f7eb2d2 --- /dev/null +++ b/fannie/sync/TableSyncPage.php @@ -0,0 +1,124 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + * NOTE: SQLManager's transfer method is not the fastest way of pulling + * this off. I'm using it so I can mix & match MySQL and SQL Server + * without errors. + * + * Rewriting the loop to use mysql commandline programs would be good + * if everything's on the same dbms. Using the global settings in + * $FANNIE_LANES is the important part. Rough sketch of this + * is in comments below. + * Using fannie/sync/special/* is one way to effect this. + * + */ +include('../config.php'); +include($FANNIE_ROOT.'classlib2.0/FannieAPI.php'); + +class TableSyncPage extends FanniePage { + + protected $title = "Fannie : Sync Data"; + protected $header = "Syncing data"; + + private $errors = array(); + private $results = ''; + + function preprocess(){ + global $FANNIE_OP_DB, $FANNIE_LANES; + $table = FormLib::get_form_value('tablename',''); + $othertable = FormLib::get_form_value('othertable',''); + + if ($table === '' && $othertable !== '') + $table = $othertable; + + if (empty($table)){ + $this->errors[] = "Error: no table was specified"; + return True; + } + elseif (ereg("[^A-Za-z0-9_]",$table)){ + $this->errors[] = "Error: \"$table\" contains illegal characters"; + return True; + } + + $dbc = FannieDB::get($FANNIE_OP_DB); + + $this->results = "<p style='font-family:Arial; font-size:1.0em;'>Syncing table $table <ul>"; + + if (file_exists("special/$table.php")){ + ob_start(); + include("special/$table.php"); + $this->results .= ob_get_clean(); + } + else { + $i = 1; + foreach ($FANNIE_LANES as $lane){ + $dbc->add_connection($lane['host'],$lane['type'], + $lane['op'],$lane['user'],$lane['pw']); + + if ($dbc->connections[$lane['op']]){ + $dbc->query("TRUNCATE TABLE $table",$lane['op']); + $success = $dbc->transfer($FANNIE_OP_DB, + "SELECT * FROM $table", + $lane['op'], + "INSERT INTO $table"); + $dbc->close($lane['op']); + if ($success){ + $this->results .= "<li>Lane ".$i." ({$lane['host']}) completed successfully</li>"; + } + else { + $this->errors[] = "Lane ".$i." ({$lane['host']}) completed but with some errors"; + } + } + else { + $this->errors[] = "Lane ".$i." ({$lane['host']}) couldn't connect to lane"; + } + $i++; + } + } + + $this->results .= "</ul></p>"; + + return True; + } + + function body_content(){ + $ret = ''; + if (count($this->errors) > 0){ + $ret .= '<blockquote style="border: solid 1px red; padding: 4px;"><ul>'; + foreach($this->errors as $e) + $ret .= '<li>'.$e.'</li>'; + $ret .= '</ul><a href="SyncIndexPage.php">Try Again</a></blockquote>'; + } + $ret .= $this->results; + return $ret; + } +} + +if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])){ + $obj = new TableSyncPage(); + $obj->draw_page(); +} + + +?> diff --git a/fannie/sync/archiveutil.php b/fannie/sync/archiveutil.php new file mode 100644 index 000000000..ed67dc920 --- /dev/null +++ b/fannie/sync/archiveutil.php @@ -0,0 +1,60 @@ +<?php + +include('../config.php'); + +$header = "Build Archives"; +$page_title = "Build Archives"; +include($FANNIE_ROOT.'src/header.html'); +include($FANNIE_ROOT.'src/SQLManager.php'); +include($FANNIE_ROOT.'src/mk_trans_archive.php'); + +if (isset($_REQUEST['rebuild'])){ + $startM = sprintf("%d",$_REQUEST['m1']); + $endM = sprintf("%d",$_REQUEST['m2']); + $startY = sprintf("%d",$_REQUEST['y1']); + $endY = sprintf("%d",$_REQUEST['y2']); + $redo = isset($_REQUEST['retable']) ? True : False; + + if (strlen($startY) == 2) + $startY = "20".$startY; + else if (strlen($startY) != 4) + $startY = "20".substr($startY,-2); + + if (strlen($endY) == 2) + $endY = "20".$endY; + else if (strlen($endY) != 4) + $endY = "20".substr($endY,-2); + + $sql = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_ARCHIVE_DB,$FANNIE_SERVER_USER, + $FANNIE_SERVER_PW); + $endTS = mktime(0,0,0,$endM,1,$endY); + $curTS = mktime(0,0,0,$startM,1,$startY); + while($curTS <= $endTS){ + mk_trans_archive_table($startM,$startY,$sql,$redo); + mk_trans_archive_views($startM,$startY,$sql); + $startM++; + if ($startM > 12){ + $startM=1; + $startY++; + } + $curTS = mktime(0,0,0,$startM,1,$startY); + } +} +else { + echo '<form action="archiveutil.php" method="get"> + <table cellspacing="0" cellpadding="4"> + <tr><th>Start Month</th><td><input type="text" size="3" name="m1" /></td> + <th>Year</th><td><input type="text" size="4" name="y1" /></td></tr> + <tr><th>End Month</th><td><input type="text" size="3" name="m2" /></td> + <th>Year</th><td><input type="text" size="4" name="y2" /></td></tr> + <tr><th colspan="2">Recreate tables</th> + <td colspan="2"><input type="checkbox" name="retable" /></td></tr> + <tr><td colspan="4"><input type="submit" name="rebuild" value="Go" /></td> + </table> + </form>'; + +} +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/sync/index.php b/fannie/sync/index.php new file mode 100644 index 000000000..684d00fc2 --- /dev/null +++ b/fannie/sync/index.php @@ -0,0 +1,59 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * 28Feb13 Andy Theuninck moved functionality to SyncIndexPage.php + * 19Jan13 Eric Lee Add productUser to table list + * 10Oct12 Eric Lee Add memberCards to table list +*/ +header('Location: SyncIndexPage.php'); +exit; + +include('../config.php'); + +$page_title = "Fannie : Sync Lane"; +$header = "Sync Lane Operational Tables"; +include($FANNIE_ROOT.'src/header.html'); + +echo "<form action=\"tablesync.php\" method=\"get\">"; + +echo "<b>Table</b>: <select name=\"tablename\"> + <option>Select a table</option> + <option>products</option> + <option>productUser</option> + <option>custdata</option> + <option>memberCards</option> + <option>employees</option> + <option>departments</option> + <option>tenders</option> +</select><br /><br />"; + +echo "<b>Other table</b>: <input type=\"text\" name=\"othertable\" /><br /><br />"; + +echo '<input type="submit" value="Send Data" />'; +echo "</form>"; +echo '<a href="store/">Sync Stores</a>'; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/sync/special/.gitignore b/fannie/sync/special/.gitignore new file mode 100644 index 000000000..36e570de8 --- /dev/null +++ b/fannie/sync/special/.gitignore @@ -0,0 +1,2 @@ +*.php +!generic.mysql.php diff --git a/fannie/sync/special/README b/fannie/sync/special/README new file mode 100644 index 000000000..e82a86626 --- /dev/null +++ b/fannie/sync/special/README @@ -0,0 +1,17 @@ +By default, Fannie is set to use SQLManager's transfer method +to move tables between servers. This does work, regardless +of how SQL Server & MySQL are mixed on the network, but is not +particularly fast for large tables. + +Scripts in this directory allow alternate, customized data +transfer. The normal table sync procedure will check for matching +custom scripts and use those instead if applicable. Matching is +based on table name - e.g., if syncing the table "products", +Fannie checks for a file here named "products.php". + +Matching files are called using include(). + +I recommend using non-matching names (e.g., "products.wfc.php") +so that if there is any SVN collaboration, people don't overwrite +each other's customizations. Symlinks can point the correct +name at whichever file(s) you actually want to use. diff --git a/fannie/sync/special/custdata.php b/fannie/sync/special/custdata.php new file mode 120000 index 000000000..db3578be7 --- /dev/null +++ b/fannie/sync/special/custdata.php @@ -0,0 +1 @@ +custdata.wfc.php \ No newline at end of file diff --git a/fannie/sync/special/custdata.wfc.php b/fannie/sync/special/custdata.wfc.php new file mode 100644 index 000000000..b1a5317e9 --- /dev/null +++ b/fannie/sync/special/custdata.wfc.php @@ -0,0 +1,44 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include(dirname(__FILE__).'/../../config.php'); +require_once($FANNIE_ROOT.'sync/special/generic.mysql.php'); + +// on each MySQL lane, load the CSV file +foreach($FANNIE_LANES as $lane){ + $dbc = new SQLManager($lane['host'],$lane['type'],$lane['op'], + $lane['user'],$lane['pw']); + if ($dbc->connections[$lane['op']] !== False){ + + if ($lane['host'] != "129.103.2.26" && $lane['host'] != "129.103.2.21" ){ + $dbc->query("DELETE FROM custdata WHERE type NOT IN ('PC','REG')",$lane['op']); + } + else { + $dbc->query("DELETE FROM custdata WHERE type IN ('TERM')",$lane['op']); + } + } +} + +echo "<li>Custdata table synched</li>"; + +?> diff --git a/fannie/sync/special/generic.mysql.php b/fannie/sync/special/generic.mysql.php new file mode 100644 index 000000000..f0bfff291 --- /dev/null +++ b/fannie/sync/special/generic.mysql.php @@ -0,0 +1,92 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + If all machines are on MySQL, this, + which uses mysqldump, + is much faster than SQLManager transfer +*/ + +if (!isset($FANNIE_ROOT)) + include(dirname(__FILE__).'/../../config.php'); +include_once($FANNIE_ROOT.'src/tmp_dir.php'); + +$ret = 0; +$output = array(); +if (isset($outputFormat) && $outputFormat == 'plain') { + $itemStart = ''; + $itemEnd = ''; + $lineBreak = "\n"; +} +else { + $outputFormat = 'html'; + $itemStart = '<li>'; + $itemEnd = '</li>'; + $lineBreak = '<br />'; +} + +if (empty($table)) { + echo "{$itemStart}No table named. Cannot run.{$itemEnd}"; + return; +} +$tempfile = tempnam(sys_get_temp_dir(),$table.".sql"); + +// Make a mysqldump of the table. +exec("mysqldump -u $FANNIE_SERVER_USER -p$FANNIE_SERVER_PW -h $FANNIE_SERVER $FANNIE_OP_DB $table > $tempfile", $output, $ret); +if ( $ret > 0 ) { + $report = implode("$lineBreak", $output); + if ( strlen($report) > 0 ) + $report = "{$lineBreak}$report"; + echo "{$itemStart}mysqldump failed, returned: $ret {$report}{$itemEnd}"; +} +else { + // Load the mysqldump from Fannie to each lane. + $laneNumber=1; + foreach($FANNIE_LANES as $lane){ + $ret = 0; + $output = array(); + if ( strpos($lane['host'], ':') > 0 ) { + list($host, $port) = explode(":", $lane['host']); + exec("mysql -u {$lane['user']} -p{$lane['pw']} -h {$host} -P {$port} {$lane['op']} < $tempfile", $output, $ret); + } + else { + exec("mysql -u {$lane['user']} -p{$lane['pw']} -h {$lane['host']} {$lane['op']} < $tempfile", $output, $ret); + } + if ( $ret == 0 ) { + echo "{$itemStart}Lane $laneNumber ({$lane['host']}) $table completed successfully{$itemEnd}"; + } else { + $report = implode("$lineBreak", $output); + if ( strlen($report) > 0 ) + $report = "{$lineBreak}$report"; + echo "{$itemStart}Lane $laneNumber ({$lane['host']}) $table failed, returned: $ret {$report}{$itemEnd}"; + } + unset($output); + $laneNumber++; + // each lane + } +// mysqldump ok +} + +unlink($tempfile); + +?> diff --git a/fannie/sync/special/products.php b/fannie/sync/special/products.php new file mode 120000 index 000000000..044c225dd --- /dev/null +++ b/fannie/sync/special/products.php @@ -0,0 +1 @@ +generic.mysql.php \ No newline at end of file diff --git a/fannie/sync/special/products.wfc.php b/fannie/sync/special/products.wfc.php new file mode 100644 index 000000000..a45488835 --- /dev/null +++ b/fannie/sync/special/products.wfc.php @@ -0,0 +1,51 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +// fire DTS packages to sync MSSQL lanes with server +//$dbc->query("exec productsUpdateAll"); + +// Run DTS to export server data to a CSV file +//$dbc->query("exec master..xp_cmdshell 'dtsrun /S IS4CSERV\IS4CSERV /U $FANNIE_SERVER_USER /P $FANNIE_SERVER_PW /N CSV_products',no_output",$FANNIE_OP_DB); + +// on each MySQL lane, load the CSV file +foreach($FANNIE_LANES as $lane){ + + if ($lane['type'] != 'MYSQL') continue; + + $dbc->add_connection($lane['host'],$lane['type'],$lane['op'], + $lane['user'],$lane['pw']); + if ($dbc->connections[$lane['op']] !== False){ + + if (!is_readable('/pos/csvs/products.csv')) break; + + $dbc->query("TRUNCATE TABLE products",$lane['op']); + + $dbc->query("LOAD DATA LOCAL INFILE '/pos/csvs/products.csv' INTO TABLE + products FIELDS TERMINATED BY ',' OPTIONALLY + ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n'",$lane['op']); + } +} + +echo "<li>Product table synched</li>"; + +?> diff --git a/fannie/sync/special/subdepts.php b/fannie/sync/special/subdepts.php new file mode 120000 index 000000000..22cc2c963 --- /dev/null +++ b/fannie/sync/special/subdepts.php @@ -0,0 +1 @@ +subdepts.wfc.php \ No newline at end of file diff --git a/fannie/sync/special/subdepts.wfc.php b/fannie/sync/special/subdepts.wfc.php new file mode 100644 index 000000000..b2e91ebc0 --- /dev/null +++ b/fannie/sync/special/subdepts.wfc.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +// map server super depts to lane subdepts +foreach($FANNIE_LANES as $lane){ + + $dbc->add_connection($lane['host'],$lane['type'],$lane['op'], + $lane['user'],$lane['pw']); + if ($dbc->connections[$lane['op']] !== False){ + $selectQ = "SELECT superID,super_name,dept_ID FROM MasterSuperDepts"; + $insQ = "INSERT INTO subdepts (subdept_no,subdept_name,dept_ID)"; + + $dbc->query("TRUNCATE TABLE subdepts",$lane['op']); + $dbc->transfer($FANNIE_OP_DB,$selectQ,$lane['op'],$insQ); + } +} + +echo "<li>Subdepts table synched</li>"; + +?> diff --git a/fannie/sync/special/tenders.wfc.php b/fannie/sync/special/tenders.wfc.php new file mode 100644 index 000000000..db516a1b3 --- /dev/null +++ b/fannie/sync/special/tenders.wfc.php @@ -0,0 +1,43 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + + +// map my big tender table down +foreach($FANNIE_LANES as $lane){ + + $dbc->add_connection($lane['host'],$lane['type'],$lane['op'], + $lane['user'],$lane['pw']); + if ($dbc->connections[$lane['op']] !== False){ + $selectQ = "SELECT TenderID,TenderCode,TenderName,TenderType,ChangeMessage, + MinAmount,MaxAmount,MaxRefund FROM tenders"; + $insQ = "INSERT INTO tenders (TenderID,TenderCode,TenderName,TenderType, + ChangeMessage,MinAmount,MaxAmount,MaxRefund)"; + + $dbc->query("TRUNCATE TABLE tenders",$lane['op']); + $dbc->transfer($FANNIE_OP_DB,$selectQ,$lane['op'],$insQ); + } +} + +echo "<li>Tenders table synched</li>"; + +?> diff --git a/fannie/sync/store/index.php b/fannie/sync/store/index.php new file mode 100644 index 000000000..ddcbe6aed --- /dev/null +++ b/fannie/sync/store/index.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include('../../config.php'); + +$page_title = "Fannie : Sync Store"; +$header = "Sync Store Operational Tables"; +include($FANNIE_ROOT.'src/header.html'); + +echo "<form action=\"tablesync.php\" method=\"get\">"; + +echo "<b>Table</b>: <select name=\"tablename\"> + <option>Select a table</option> + <option>products</option> + <option>custdata</option> + <option>employees</option> + <option>departments</option> + <option>tenders</option> +</select><br /><br />"; + +echo "<b>Other table</b>: <input type=\"text\" name=\"othertable\" /><br /><br />"; + +if ($FANNIE_MASTER_STORE == 'me'){ + echo "<b>Send to</b>: <select name=\"storeNum\"> + <option value=\"\">All Stores</option>"; + for ($i=0;$i<$FANNIE_NUM_STORES;$i++) + printf('<option value="%d">%s</option>',$i,$FANNIE_STORES[$i]['host']); + echo "</select><br />"; +} +else { + echo "You are <b>not</b> the master store. You are sending + this store's table <b>to</b> the master store. + This store's data will <b>replace</b> the master + store's data. Be careful.<br />"; +} + +echo '<input type="submit" value="Send Data" />'; +echo "</form>"; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/sync/store/products.php b/fannie/sync/store/products.php new file mode 100644 index 000000000..d916d2bea --- /dev/null +++ b/fannie/sync/store/products.php @@ -0,0 +1,52 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include('../../config.php'); +include($FANNIE_ROOT.'src/mysql_connect.html'); + +$page_title = "Fannie : Sync Store"; +$header = "Sync Product Info"; +include($FANNIE_ROOT.'src/header.html'); + +echo "<form action=\"products.php\" method=\"get\">"; + +if ($FANNIE_MASTER_STORE == 'me'){ + echo "<b>Send to</b>: <select name=\"storeNum\"> + <option value=\"\">All Stores</option>"; + for ($i=0;$i<$FANNIE_NUM_STORES;$i++) + printf('<option value="%d">%s</option>',$i,$FANNIE_STORES[$i]['host']); + echo "</select><br />"; + echo '<input type="submit" value="Send Data" />'; +} +else { + echo "You are <b>not</b> the master store. You are sending + this store's table <b>to</b> the master store. + This store's data will <b>replace</b> the master + store's data. Be careful.<br />"; +} + +echo "</form>"; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/fannie/sync/store/special/README b/fannie/sync/store/special/README new file mode 100644 index 000000000..e82a86626 --- /dev/null +++ b/fannie/sync/store/special/README @@ -0,0 +1,17 @@ +By default, Fannie is set to use SQLManager's transfer method +to move tables between servers. This does work, regardless +of how SQL Server & MySQL are mixed on the network, but is not +particularly fast for large tables. + +Scripts in this directory allow alternate, customized data +transfer. The normal table sync procedure will check for matching +custom scripts and use those instead if applicable. Matching is +based on table name - e.g., if syncing the table "products", +Fannie checks for a file here named "products.php". + +Matching files are called using include(). + +I recommend using non-matching names (e.g., "products.wfc.php") +so that if there is any SVN collaboration, people don't overwrite +each other's customizations. Symlinks can point the correct +name at whichever file(s) you actually want to use. diff --git a/fannie/sync/store/special/custdata.php b/fannie/sync/store/special/custdata.php new file mode 120000 index 000000000..db3578be7 --- /dev/null +++ b/fannie/sync/store/special/custdata.php @@ -0,0 +1 @@ +custdata.wfc.php \ No newline at end of file diff --git a/fannie/sync/store/special/custdata.wfc.php b/fannie/sync/store/special/custdata.wfc.php new file mode 100644 index 000000000..eda856188 --- /dev/null +++ b/fannie/sync/store/special/custdata.wfc.php @@ -0,0 +1,23 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + diff --git a/fannie/sync/store/special/likeCodes.php b/fannie/sync/store/special/likeCodes.php new file mode 120000 index 000000000..c5d3ac3c9 --- /dev/null +++ b/fannie/sync/store/special/likeCodes.php @@ -0,0 +1 @@ +likeCodes.wfc.php \ No newline at end of file diff --git a/fannie/sync/store/special/likeCodes.wfc.php b/fannie/sync/store/special/likeCodes.wfc.php new file mode 100644 index 000000000..23c3a320f --- /dev/null +++ b/fannie/sync/store/special/likeCodes.wfc.php @@ -0,0 +1,15 @@ +<?php + +$sql = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); +$sql->query("TRUNCATE TABLE likeCodes",$FANNIE_OP_DB); +$sql->query("TRUNCATE TABLE upcLike",$FANNIE_OP_DB); + +$sql->add_connection('129.103.2.10','MSSQL','WedgePOS','sa',$FANNIE_SERVER_PW); +$sql->transfer("WedgePOS", "SELECT * FROM likeCodes", + $FANNIE_OP_DB, "INSERT INTO likeCodes"); +$sql->transfer("WedgePOS", "SELECT * FROM upcLike", + $FANNIE_OP_DB, "INSERT INTO upcLike"); +echo "<li>Like Codes synched</li>"; + +?> diff --git a/fannie/sync/store/special/products.php b/fannie/sync/store/special/products.php new file mode 120000 index 000000000..6588463ed --- /dev/null +++ b/fannie/sync/store/special/products.php @@ -0,0 +1 @@ +products.wfc.php \ No newline at end of file diff --git a/fannie/sync/store/special/products.wfc.php b/fannie/sync/store/special/products.wfc.php new file mode 100644 index 000000000..1e00a8282 --- /dev/null +++ b/fannie/sync/store/special/products.wfc.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +// Run DTS to export server data to a CSV file +$ms = new SQLManager('129.103.2.10','MSSQL','WedgePOS','sa',$FANNIE_SERVER_PW); +//$ms->query("exec master..xp_cmdshell 'dtsrun /S IS4CSERV\IS4CSERV /U sa /P $FANNIE_SERVER_PW /N CSV_products',no_output",'WedgePOS'); + +if (!is_readable('/pos/csvs/products.csv')) echo 'Problem exporting product table'; +else { + $dbc->add_connection($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + $dbc->query("TRUNCATE TABLE products",$FANNIE_OP_DB); + + $dbc->query("LOAD DATA LOCAL INFILE '/pos/csvs/products.csv' INTO TABLE + products FIELDS TERMINATED BY ',' OPTIONALLY + ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n'",$FANNIE_OP_DB); + echo "<li>Product table synched</li>"; +} + +?> diff --git a/fannie/sync/store/tablesync.php b/fannie/sync/store/tablesync.php new file mode 100644 index 000000000..1073896f6 --- /dev/null +++ b/fannie/sync/store/tablesync.php @@ -0,0 +1,125 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of Fannie. + + Fannie is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Fannie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + * This works the same way as server => lane syncing, + * just for master => store + * + */ +include('../../config.php'); + +$table = (isset($_REQUEST['tablename']))?$_REQUEST['tablename']:''; +if (isset($_REQUEST['othertable']) && !empty($_REQUEST['othertable'])) $table = $_REQUEST['othertable']; + +$page_title = "Fannie : Sync Data"; +$header = "Syncing data"; +include($FANNIE_ROOT.'src/header.html'); + +if (empty($table)){ + echo "<i>Error: no table was specified</i>"; +} +elseif (ereg("[^A-Za-z0-9_]",$table)){ + echo "<i>Error: \"$table\" contains illegal characters</i>"; +} +else { + include($FANNIE_ROOT.'src/SQLManager.php'); + /* + Connecting to the transactional database here is + intentional. SQLManager identifies connections by + database name; if both stores have the same name + for their operational database (which is likely) + connection to op on both will cause problems. + */ + $dbc = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS, + $FANNIE_TRANS_DB,$FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + + echo "<p>Syncing table $table"; + echo "<ul>"; + flush(); + + if (file_exists("special/$table.php")){ + include("special/$table.php"); + } + else { + echo "Whoa! bail-out! multi-store not safe right now!";exit; + if (isset($_REQUEST['storeNum']) && $_REQUEST['storeNum']==="") unset($_REQUEST['storeNum']); + + $start = isset($_REQUEST['storeNum']) ? $_REQUEST['storeNum'] : 0; + $end = isset($_REQUEST['storeNum']) ? $_REQUEST['storeNum']+1 : $FANNIE_NUM_STORES; + + $selectCols = ""; + $cols = $dbc->table_definition($table,$FANNIE_TRANS_DB); + foreach($cols as $name=>$type){ + if ($name != "id") // ignore autoinc columns + $selectCols .= $name.","; + } + $selectCols = rtrim($selectCols,","); + + for($i=$start; $i<$FANNIE_NUM_STORES; $i++){ + $store = $FANNIE_STORES[$i]; + $dbc->add_connection($store['host'],$store['type'], + $store['op'],$store['user'],$store['pw']); + + if ($dbc->connections[$store['op']]){ + $insCols = "("; + $cols = $dbc->table_definition($table,$store['op']); + foreach($cols as $name=>$type){ + if ($name != "id") // ignore autoinc columns + $insCols .= $name.","; + } + $insCols = rtrim($insCols,",").")"; + + $dbc->query("TRUNCATE TABLE $table",$store['op']); + + $fqn = ($FANNIE_SERVER_DBMS == "MSSQL") ? $FANNIE_TRANS_DB.".dbo.".$table : $FANNIE_TRANS_DB.".".$table; + $select = "SELECT $selectCols FROM $fqn"; + $ins = "INSERT INTO $table $insCols"; + //echo $select."<br />"; + //echo $ins."<br />"; + $success = $dbc->transfer($FANNIE_TRANS_DB, + $select, + $store['op'], + $ins); + $dbc->close($store['op']); + + if ($success){ + echo "<li>Store ".($i+1)." completed successfully</li>"; + } + else { + echo "<li>Store ".($i+1)." completed but with some errors</li>"; + } + } + else { + echo "<li>Couldn't connect to store ".($i+1)."</li>"; + } + } + } + + echo "</ul>"; +} + +echo "<a href=\"index.php\">Store Sync Menu</a>"; + +include($FANNIE_ROOT.'src/footer.html'); + +?> diff --git a/license/license.txt b/license/license.txt new file mode 100755 index 000000000..9f8d190e3 --- /dev/null +++ b/license/license.txt @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details Type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; Type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/pos/annualmeeting/Bitmap4.class.php b/pos/annualmeeting/Bitmap4.class.php new file mode 100755 index 000000000..98989b00c --- /dev/null +++ b/pos/annualmeeting/Bitmap4.class.php @@ -0,0 +1,609 @@ +<?php +/* +Bitmap.class.php +version 1 (2009-09-24) +author Alex Frase + +References + http://en.wikipedia.org/wiki/BMP_file_format + http://atlc.sourceforge.net/bmp.html + http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization +*/ + +class Bitmap { + + var $DIB1; + var $DIB2; + var $DIB3; + var $DIB4; + var $DIB5; + + var $error; + + var $magic; + var $dibVersion; + var $width; + var $height; + var $bpp; // bits per pixel + var $hppm; // horiz. pixels per meter + var $vppm; // vert. pixels per meter + var $palSize; + var $palSizeImp; + var $palette; + var $image; + var $rowBytes; + + + /* + * INTERNAL METHODS + */ + + function ReturnError($err=null, $ret=null) { + $this->error = is_string($err) ? $err : "Unknown error"; + return $ret; + } // ReturnError() + + function ParseInt($data, $left=0, $right=-1, $signed=false, $bigEndian=false) { + if (is_string($data)) { + $isarray = false; + if ($right < 0) + $right = strlen($data) - 1; + } else if (is_array($data)) { + $isarray = true; + $data = array_values($data); + if ($right < 0) + $right = count($data) - 1; + } else { + return null; + } + if ($right < $left) + return null; + // set traversal range and direction + $start = $bigEndian ? $right : $left; + $end = $bigEndian ? $left : $right; + $delta = $bigEndian ? -1 : 1; + // process bytes + $n = $start; + $val = $isarray ? (int)$data[$n] : ord($data[$n]); + $factor = 256; + while ($n != $end) { + $n += $delta; + $val += $factor * ($isarray ? (int)$data[$n] : ord($data[$n])); + $factor <<= 8; // *= 256 + } + // check sign bit + if ($signed && (($isarray ? (int)$data[$end] : ord($data[$end])) & 0x80)) + $val = -$factor + $val; + // done + return $val; + } // ParseInt() + + function RenderInt($val, $bytes, $signed=false, $bigEndian=false) { + $val = (int)$val; + $bytes = (int)$bytes; + $range = pow(2, $bytes * 8); + $neg = false; + if ($signed && $val < 0) + $val = (~ (-$val)) + 1; + // set traversal range and direction + $start = $bigEndian ? ($bytes - 1) : 0; + $end = $bigEndian ? 0 : ($bytes - 1); + $delta = $bigEndian ? -1 : 1; + // set bytes + $data = str_repeat("\x00", $bytes); + for ($n = $start; $n != $end; $n += $delta) { + $data[$n] = chr($val & 0xFF); + $val >>= 8; // /= 256 + } + // done + return $data; + } // RenderInt() + + + function LastError($reset=true) { + $err = $this->error; + if ($reset) + $this->error = null; + return $err; + } // LastError() + + function Load($filename, $filedata=null) { + $data = ""; + if ($filename === true) { + $data = $filedata; + } else { + $data = file_get_contents($filename); + if (!$data) + return $this->ReturnError("Load(): failed reading file \"".$filename."\""); + } + $datasize = strlen($data); + + // read the BMP header + + if ($datasize < 18) + return $this->ReturnError("Load(): incomplete BMP header (file is ".$datasize." bytes)"); + $magic = substr($data, 0, 2); + $fileSize = $this->ParseInt($data, 2, 5); + // bytes 6-9 are unused (application specific) + $imageAt = $this->ParseInt($data, 10, 13); + + // validate the BMP header + + switch ($magic) { + case "BM": // Windows 3.1x, 95, NT, ... + case "BA": // OS/2 Bitmap Array + case "CI": // OS/2 Color Icon + case "CP": // OS/2 Color Pointer + case "IC": // OS/2 Icon + case "PT": // OS/2 Pointer + break; + default: + return $this->ReturnError("Load(): unknown magic numbers \"".dechex(ord($magic[0]))." ".dechex(ord($magic[1]))."\""); + } + if ($fileSize != $datasize) + return $this->ReturnError("Load(): incorrect file size (".$fileSize." reported, ".$datasize." actual)"); + + // read the DIB header + + $headerSize = $this->ParseInt($data, 14, 17); + if ($datasize < (14 + $headerSize)) + return $this->ReturnError("Load(): incomplete DIB header (file is ".$datasize." bytes)"); + switch ($headerSize) { + case $this->DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + $width = $this->ParseInt($data, 18, 19); + $height = $this->ParseInt($data, 20, 21); + $colorPlanes = $this->ParseInt($data, 22, 23); + $bpp = $this->ParseInt($data, 24, 25); + if ($bpp == 16 || $bpp == 32) // not supported in this header + return $this->ReturnError("Load(): ".$bpp." bits-per-pixel invalid in V1 header"); + $compression = 0; + $imgDataSize = null; + $hppm = null; + $vppm = null; + $palSize = 0; + $palSizeImp = 0; + break; + + case $this->DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $width = $this->ParseInt($data, 18, 21, true); + $height = $this->ParseInt($data, 22, 25, true); + $colorPlanes = $this->ParseInt($data, 26, 27); + $bpp = $this->ParseInt($data, 28, 29); + $compression = $this->ParseInt($data, 30, 33); + $imgDataSize = $this->ParseInt($data, 34, 37); + $hppm = $this->ParseInt($data, 38, 41, true); + $vppm = $this->ParseInt($data, 42, 45, true); + $palSize = $this->ParseInt($data, 46, 49); + $palSizeImp = $this->ParseInt($data, 50, 53); + break; + + // TODO: more header formats + + default: + return $this->ReturnError("Load(): unknown DIB header size (".$headerSize." bytes)"); + } + + // validate the DIB header + + if ($width < 1) + return $this->ReturnError("Load(): invalid image width ".$width); + if ($height == 0) // height can be negative, meaning data is top-to-bottom instead of bottom-to-top + return $this->ReturnError("Load(): invalid image height ".$height); + if ($colorPlanes != 1) + return $this->ReturnError("Load(): invalid color plane count ".$colorPlanes); + if ($bpp != 1 && $bpp != 4 && $bpp != 8 && $bpp != 16 && $bpp != 24 && $bpp != 32) + return $this->ReturnError("Load(): invalid bits-per-pixel ".$bpp); + switch ($compression) { + case 0: // BI_RGB (uncompressed) + break; + case 1: // BI_RLE8 (RLE; 8 bpp only) + case 2: // BI_RLE4 (RLE; 4 bpp only) + case 3: // BI_BITFIELDS (bitfield; 16 and 32 bpp only) + case 4: // BI_JPEG (JPEG) + case 5: // BI_PNG (PNG) + // TODO: support compression? + return $this->ReturnError("Load(): image data compression not supported"); + default: + return $this->ReturnError("Load(): invalid compression code ".$compression); + } + $rowDataSize = (int)((($width * $bpp) + 31) / 32) * 4; + if ($imgDataSize === null || $imgDataSize === 0) + $imgDataSize = abs($height) * $rowDataSize; + else if ($imgDataSize != (abs($height) * $rowDataSize)){ + while(ord($data[strlen($data)-1])===0){ + $imgDataSize--; + $data = substr($data,0,strlen($data)-1); + } + if($imgDataSize != (abs($height) * $rowDataSize)) + return $this->ReturnError("Load(): incorrect image data size (".$imgDataSize." reported, ".(abs($height) * $rowDataSize)." expected)"); + } + if ($hppm !== null && $hppm <= 0) + return $this->ReturnError("Load(): invalid horizontal pixels-per-meter ".$hppm); + if ($vppm !== null && $vppm <= 0) + return $this->ReturnError("Load(): invalid vertical pixels-per-meter ".$hppm); + + // read the palette + + if (!$palSize && $bpp < 16) + $palSize = pow(2, $bpp); + if ($palSize) { + $palColorSize = ($headerSize == $this->DIB1) ? 3 : 4; + $palDataSize = $palSize * $palColorSize; + if ($datasize < (14 + $headerSize + $palDataSize)) + return $this->ReturnError("Load(): incomplete palette (file is ".$datasize." bytes)"); + $palette = substr($data, 14 + $headerSize, $palDataSize); + if ($palColorSize < 4) { + // pad each palette color to 4 bytes for simpler lookup (remember "." doesn't match newline, hence "|\\n") + $palette = preg_replace('/(.|\\n){'.$palColorSize.'}/', '\\1'.str_repeat("\x00",(4-$palColorSize)), $palette); + } + } else { + $palColorSize = 0; + $palDataSize = 0; + $palette = null; + } + + // read the image + + if ($datasize < ($imageAt + $imgDataSize)) + return $this->ReturnError("Load(): incomplete image (file is ".$datasize." bytes)"); + $image = substr($data, $imageAt, $imgDataSize); + $rowBytes = (int)((($width * $bpp) + 7) / 8); + if ($rowBytes > $rowDataSize) + return $this->ReturnError("Load(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + if ($rowBytes < $rowDataSize) { + // strip off word-alignment padding (remember "." doesn't match newline, hence "|\\n") + $image = preg_replace('/((?:.|\\n){'.$rowBytes.'})((?:.|\\n){'.($rowDataSize-$rowBytes).'})/', '\\1', $image); + } + if ($height < 0) { + $height = abs($height); + } else { + // flip image rows vertically (BMPs are stored upside-down by default) + $str_split = array(); + $val = ""; + for($i=0; $i<strlen($image); $i++){ + if ($i % $rowBytes == 0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $image[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + $image = implode('', array_reverse($str_split)); + } + + // initialize the object + + $this->magic = $magic; + $this->dibVersion = $headerSize; + $this->width = $width; + $this->height = $height; + $this->bpp = $bpp; + $this->rowBytes = $rowBytes; + $this->hppm = $hppm; + $this->vppm = $vppm; + $this->palSize = $palSize; + $this->palSizeImp = $palSizeImp; + $this->palette = $palette; + $this->image = $image; + + // all done + return true; + } // Load() + + + /* + * OBJECT METHODS + */ + + function Bitmap($width=1, $height=1, $bpp=1, $dpi=72) { + $this->DIB1 = 12; + $this->DIB2 = 64; + $this->DIB3 = 40; + $this->DIB4 = 108; + $this->DIB5 = 124; + + $this->error = null; + + if (!is_numeric($width) || (int)$width < 1) + die('Bitmap width must be at least 1'); + if (!is_numeric($height) || (int)$height < 1) + die('Bitmap height must be at least 1'); + if (!is_numeric($bpp) || (int)$bpp != 1) + die('Color bitmaps not yet supported'); + if (!is_numeric($dpi) || (int)$dpi < 1) + die('Bitmap DPI must be at least 1'); + $this->magic = "BM"; + $this->dibVersion = $this->DIB3; + $this->width = (int)$width; + $this->height = (int)$height; + $this->bpp = (int)$bpp; + $this->rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->hppm = (int)(($dpi * 39.37) + 0.5); // 39.37 inches per meter + $this->vppm = $this->hppm; + $this->palSize = 2; + $this->palSizeImp = 0; + $this->palette = "\xFF\xFF\xFF\x00\x00\x00\x00\x00"; + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->image = str_repeat("\x00", $rowBytes * $this->height); + } // __construct() + + function Save($filename) { + // prepare the image + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $rowDataSize = (int)((($this->width * $this->bpp) + 31) / 32) * 4; + if ($rowBytes > $rowDataSize) + return $this->ReturnError("Save(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + $pad = str_repeat("\x00", $rowDataSize - $rowBytes); // might be 0 -> "" pad, which is ok + $image = implode($pad, array_reverse(str_split($this->image, $rowBytes))) . $pad; + $imgDataSize = $this->height * $rowDataSize; + if ($imgDataSize != strlen($image)) + return $this->ReturnError("Save(): consistency error (calculated image data size ".$imgDataSize.", prepared ".strlen($image).")"); + + // prepare the palette + if ($this->palSize) { + $palette = $this->palette; + // if ($this->dibVersion == self::DIB1) // strip padding... + } else { + $palette = ""; + } + $palDataSize = strlen($palette); + + // prepare the DIB header + $dibHead = ""; + switch ($this->dibVersion) { + case $this->DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + return $this->ReturnError("Save(): only DIB3 is supported for writing"); + + case $this->DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $dibHead .= $this->RenderInt($this->DIB3, 4); + $dibHead .= $this->RenderInt($this->width, 4, true); + $dibHead .= $this->RenderInt($this->height, 4, true); + $dibHead .= $this->RenderInt(1, 2); // colorPlanes + $dibHead .= $this->RenderInt($this->bpp, 2); + $dibHead .= $this->RenderInt(0, 4); // compression + $dibHead .= $this->RenderInt($imgDataSize, 4); + $dibHead .= $this->RenderInt($this->hppm, 4, true); + $dibHead .= $this->RenderInt($this->vppm, 4, true); + $dibHead .= $this->RenderInt($this->palSize, 4); + $dibHead .= $this->RenderInt($this->palSizeImp, 4); + break; + + // TODO: more header formats + + default: + return $this->ReturnError("Save(): only DIB3 is supported for writing"); + } + if (strlen($dibHead) != $this->dibVersion) + return $this->ReturnError("Save(): consistency error (calculated DIB size ".$this->dibVersion.", prepared ".strlen($dibHead).")"); + + // prepare the BMP header + $imageAt = 14 + $this->dibVersion + $palDataSize; + $fileSize = $imageAt + $imgDataSize; + $bmpHead = ""; + $bmpHead .= $this->magic; + $bmpHead .= $this->RenderInt($fileSize, 4); + $bmpHead .= $this->RenderInt(0, 4); // bytes 6-9 are unused (application specific) + $bmpHead .= $this->RenderInt($imageAt, 4); + + // write or return the file + $data = $bmpHead . $dibHead . $palette . $image; + if ($filename === true) + return $data; + $bytes = file_put_contents($filename, $data); + if ($bytes != strlen($data)) + return $this->ReturnError("Save(): failed writing file \"".$filename."\" (".$bytes." of ".strlen($data)." bytes written)"); + return true; + } // Save() + + function GetWidth() { return $this->width; } + + function GetHeight() { return $this->height; } + + function GetColorDepth() { return $this->bpp; } + + function GetHorizResolution($asDPI=false) { return $asDPI ? (int)(($this->hppm / 39.37) + 0.5) : $this->hppm; } + + function GetVertResolution($asDPI=false) { return $asDPI ? (int)(($this->vppm / 39.37) + 0.5) : $this->vppm; } + + function GetPaletteSize() { return ($this->bpp < 16 && $this->palSize) ? $this->palSize : null; } + + function GetPaletteColor($index, $channel=null) { + if (!$this->palSize || $this->palette === null || $index < 0 || $index >= $this->palSize) + return null; + $byte = $index << 2; // (int)($index * 4) + if ($channel !== null) { + if ($channel < 0 || $channel > 2) + return null; + return ord($this->palette[$byte + $channel]); + } + return $this->ParseInt($this->palette, $byte, $byte + 2); + } // GetPaletteColor() + + function GetPixelValue($x, $y) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // fetch pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + return $this->ParseInt($this->image, $byte, $byte + 2); // BMPs don't actually have an alpha channel, so ignore the 4th byte + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + return $this->ParseInt($this->image, $byte, $byte + 2); + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + return $this->ParseInt($this->image, $byte, $byte + 1); + case 8: + $byte = ($y * $this->rowBytes) + $x; + return ord($this->image[$byte]); + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + return ((ord($this->image[$byte]) >> $shift) & 0x0F); + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + return ((ord($this->image[$byte]) >> $shift) & 0x01); + } + return null; + } // GetPixelValue() + + function SetPixelValue($x, $y, $val) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // validate new pixel value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // set pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + $this->image = substr_replace($this->image, $this->RenderInt($val,3), $byte, 3); // BMPs don't actually have an alpha channel, so ignore the 4th byte + return true; + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + $this->image = substr_replace($this->image, $this->RenderInt($val,3), $byte, 3); + return true; + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + $this->image = substr_replace($this->image, $this->RenderInt($val,2), $byte, 2); + return true; + case 8: + $byte = ($y * $this->rowBytes) + $x; + $this->image[$byte] = chr($val); + return true; + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + $mask = (0x0F << $shift); + $this->image[$byte] = chr( (ord($this->image[$byte]) & (~ $mask)) | ($val & $mask) ); + return true; + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + if ($val) + $this->image[$byte] = chr( ord($this->image[$byte]) | (0x01 << $shift) ); + else + $this->image[$byte] = chr( ord($this->image[$byte]) & (0xFF ^ (0x01 << $shift)) ); + return true; + } + return null; + } // SetPixelValue() + + function DrawLine($x0, $y0, $x1, $y1, $val) { + // validate coordinates + if ($x0 < 0) + $x0 += $this->width; + else if ($x0 >= $this->width) + return null; + if ($y0 < 0) + $y0 += $this->height; + else if ($y0 >= $this->height) + return null; + if ($x1 < 0) + $x1 += $this->width; + else if ($x1 >= $this->width) + return null; + if ($y1 < 0) + $y1 += $this->height; + else if ($y1 >= $this->height) + return null; + // validate new pixel(s) value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // draw! + // http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization + $steep = (abs($y1 - $y0) > abs($x1 - $x0)); + if ($steep) { + $t=$x0; $x0=$y0; $y0=$t; // swap $x0,$y0 + $t=$x1; $x1=$y1; $y1=$t; // swap $x1,$y1 + } + if ($x0 > $x1) { + $t=$x0; $x0=$x1; $x1=$t; // swap $x0,$x1 + $t=$y0; $y0=$y1; $y1=$t; // swap $y0,$y1 + } + $dx = ($x1 - $x0); + $dy = abs($y1 - $y0); + $err = $dx >> 1; + $sy = ($y0 < $y1) ? 1 : -1; + while ($x0 <= $x1) { + if ($steep) + $this->SetPixelValue($y0, $x0, 1); + else + $this->SetPixelValue($x0, $y0, 1); + $err -= $dy; + if ($err < 0) { + $y0 += $sy; + $err += $dx; + } + $x0++; + } + return true; + } // DrawLine() + + function GetPixelColor($x, $y, $channel=null) { + $val = $this->GetPixelValue($x, $y); + if ($val !== null && $this->palette !== null) + return $this->GetPaletteColor($val, $channel); + if ($this->bpp == 16) { + $val = + (((((($val >> 10) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 16) + + (((((($val >> 5) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 8) + + (int)(((($val & 0x1F) / 0x1F) * 0xFF) + 0.5); + } + return $val; + } // GetPixelColor() + + function GetRawData() { + return $this->image; + } // GetRawData() + + function GetRawBytesPerRow() { + return $this->rowBytes; + } // GetRawBytesPerRow() + +} // Bitmap + +function RenderBitmapFromFile($fn){ + $slip = ""; + + $bmp = new Bitmap(); + $bmp->Load($fn); + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $printer = new ESCPOSPrintHandler(); + $stripes = $printer->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $printer->InlineBitmap($stripes[$i], $bmpWidth); + + $slip .= $printer->AlignCenter(); + if (count($stripes) > 1) + $slip .= $printer->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $printer->ResetLineSpacing()."\n"; + $slip .= $printer->AlignLeft(); + + return $slip; +} + diff --git a/pos/annualmeeting/PrintHandlers/ESCPOSPrintHandler.class.php b/pos/annualmeeting/PrintHandlers/ESCPOSPrintHandler.class.php new file mode 100755 index 000000000..c8b76f6b2 --- /dev/null +++ b/pos/annualmeeting/PrintHandlers/ESCPOSPrintHandler.class.php @@ -0,0 +1,674 @@ +<?php +/* +ESCPOSPrintHandler.class.php +version 1 (2009-09-25) +author Alex Frase + +Notes + Epson TM-H6000II prints 504 pixels per line; + 42 columns with standard 12x24 font, 56 columns with alternate 9x17 font +*/ + +class ESCPOSPrintHandler { + + function Tab() { + // "\t" + return "\x09"; + } + + function LineFeed($lines=1) { + // one line: "\n" + if ($lines <= 1) + return "\x0A"; + // multiple lines: ESC "d" num + return "\x1B\x64".chr( max(0, min(255, (int)$lines)) ); + } + + function PageFeed($reset=true) { + // "(ESC) FF" + return ($reset?"":"\x1B")."\x0C"; + } + + function CarriageReturn() { + // "\r" + return "\x0D"; + } + + function ClearPage() { + // CAN + return "\x18"; + } + + // TODO: realtime status transmission; DLE(\x10) EOT(\x04) n + + // TODO: realtime request to printer; DLE(\x10) ENQ(\x05) n + + // TODO: realtime pulse; DLE(\x10) DC4(\x14) 1 m t + + function CharacterSpacing($dots=0) { + // ESC " " space + return "\x1B\x20".chr( max(0, min(255, $dots)) ); + } + + function TextStyle($altFont=false, $bold=false, $tall=false, $wide=false, $underline=false) { + // ESC "!" bitfield + return ("\x1B\x21" + .chr( + ($underline ? 128 : 0) + + ($wide ? 32 : 0) + + ($tall ? 16 : 0) + + ($bold ? 8 : 0) + + ($altFont ? 1 : 0) + ) + ); + } + + function GotoX($dots=0) { + // ESC "$" xLO xHI + return ("\x1B\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } // GotoX() + + // TODO: enable downloadable character set; ESC(\x1B) "%"(\x25) flag + + // TODO: define downloadable characters; ESC(\x1B) "&"(\x26) 3(\x03) char0 char1 data + + /* + ESC/POS requires graphical bitmap data in columns, but BMP is rasterized in rows, + so this function transposes the latter to the former. The source BMP data must + be 1 bpp (black/white image only), and $width is in pixels == bits (not bytes). + The return will be an array of binary strings; if the source data fits in one + inline stripe (8 pixels tall with $tallDots, 24 otherwise) the array will have + only one element. + */ + function TransposeBitmapData($data, $width, $tallDots=false) { + $oldRowBytes = (int)(($width + 7) / 8); + $newColBytes = $tallDots ? 1 : 3; + $oldStripeSize = (int)($oldRowBytes * ($tallDots ? 8 : 24)); + $stripes = array(); + + // str_split function doesn't exist in PHP4 + $str_split = array(); + $val = ""; + for($i=0;$i<strlen($data);$i++){ + if ($i % $oldStripeSize==0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $data[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + // end manual split + + foreach ($str_split as $oldData) { + $oldData = str_pad($oldData, $oldStripeSize, "\x00", STR_PAD_RIGHT); + $newData = str_repeat("\x00", $width * $newColBytes); + for ($c = 0; $c < $width; $c++) { + $oldMask = 1 << (7 - ($c % 8)); + $newByte = ($tallDots ? $c : ($c + $c + $c)); + // top or only byte + $b = 0; + for ($r = 0; $r < 8; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 0] = chr($b); + if (!$tallDots) { + // middle byte + $b = 0; + for ($r = 8; $r < 16; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 1] = chr($b); + // bottom byte + $b = 0; + for ($r = 16; $r < 24; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 2] = chr($b); + } + } + $stripes[] = $newData; + } + return $stripes; + } // TransposeBitmapData() + + /* + Bitmaps are always drawn 24 dots tall (the height of a normal printed line). + Tall dots are each 3x tall, so they take 1 byte per column (8 bits * 3 dots each = 24). + Short dots require 3 bytes per column (8 bits * 3 bytes = 24). + Data must therefore have ($width * ($tallDots ? 3 : 1)) bytes. + Each data byte specifies dots top-to-bottom, from most- to least-significant-bit: + \xC0 = \b11000000 = pixels in the top two rows + \x81 = \b10000001 = pixels on the top and bottom rows + Multiple bytes are drawn top-to-bottom (if !$tallDots), then left-to-right. + */ + function InlineBitmap($data, $width, $tallDots=false, $wideDots=false) { + // ESC "*" bitfield widthLO widthHI data + $width = (int)max(0, min(1023, $width)); + $bytes = (int)($width * ($tallDots ? 1 : 3)); + return ("\x1B\x2A" + .chr( ($tallDots ? 0 : 32) + ($wideDots ? 0 : 1) ) + .chr( (int)($width % 256) ) + .chr( (int)($width / 256) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } // InlineBitmap() + + // TODO: InlineBitmapFromFile() + + function Underline($dots=1) { + // ESC "-" size + return "\x1B\x2D".chr( max(0, min(2, $dots)) ); + } + + function ResetLineSpacing() { + // ESC "2" + return "\x1B\x32"; + } + + function LineSpacing($space=64) { + // in some small increment; with 12x24 font, space=64 seems to be approximately single-spaced, space=128 double + // ESC "3" space + return "\x1B\x33".chr( max(0, min(255, $space)) ); + } + + // TODO: return home; ESC(\x1B) "<"(\x3C) + + // TODO: select peripheral device; ESC(\x1B) "="(\x3D) n + + // TODO: delete downloadable characters; ESC(\x1B) "?"(\x3F) char + + function Reset() { + // ESC "@" + return "\x1B\x40"; + } + + function SetTabs($tabs=null) { + // ESC "D" tabs NUL + if (!is_array($tabs) || !count($tabs)) + return "\x1B\x44\x00"; + $tabs = array_unique(array_map('chr', $tabs), SORT_NUMERIC); + sort($tabs); + return ("\x1B\x44" + .implode('', $tabs) + ."\x00" + ); + } + + function Bold($on=true) { + // ESC "E" bit + return "\x1B\x45".chr( $on ? 1 : 0 ); + } + + function DoublePrint($on=true) { + // is this like a shadow effect? + // ESC "G" bit + return "\x1B\x47".chr( $on ? 1 : 0 ); + } + + function PaperFeed($space) { + // in some small increment; with 12x24 font, space=64 seems to be approximately one printed line, space=128 two + // ESC "J" space + return "\x1B\x4A".chr( max(0, min(255, $space)) ); + } + + function PaperFeedBack($space) { + // in some small increment + // ESC "K" num + return "\x1B\x4B".chr( max(0, min(24, $space)) ); + } + + function PageMode() { + // ESC "L" + return "\x1B\x4C"; + } + + function Font($font=0) { + // ESC "M" font + // (FS "G" font) + return "\x1B\x4D".chr( max(0, min(2, $font)) ); + } + + /* + international character sets: + 0: America + 1: France + 2: Germany + 3: UK + 4: Denmark I + 5: Sweden + 6: Italy + 7: Spain I + 8: Japan + 9: Norway + 10: Denmark II + 11: Spain II + 12: Latin America + 13: Korea + */ + function CharacterSet($set=0) { + // ESC "R" set + return "\x1B\x52".chr( max(0, min(13, $set)) ); + } + + function LineMode() { + // ESC "S" + return "\x1B\x53"; + } + + function PageOrient($orient=0) { + // ESC "T" dir + return "\x1B\x54".chr( max(0, min(3, (int)$orient)) ); + } + + // TODO: unidirectional printing; ESC(\x1B) "U"(\x55) bit + + function Rotate($on=true) { + // ESC "V" bit + return "\x1B\x56".chr( $on ? 1 : 0 ); + } + + function PageRegion($x=0, $y=0, $dx=65535, $dy=65535) { + // ESC "W" xLO xHI yLO yHI dxLO dxHI dyLO dyHI + return ("\x1B\x57" + .chr( max(0, (int)($x % 256)) ) + .chr( max(0, min(255, (int)($x / 245))) ) + .chr( max(0, (int)($y % 256)) ) + .chr( max(0, min(255, (int)($y / 245))) ) + .chr( max(0, (int)($dx % 256)) ) + .chr( max(0, min(255, (int)($dx / 245))) ) + .chr( max(0, (int)($dy % 256)) ) + .chr( max(0, min(255, (int)($dy / 245))) ) + ); + } + + function MoveX($dots) { + // ESC "\" dxLO dxHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1B\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function AlignLeft() { + // ESC "a" align + return "\x1B\x61\x00"; + } + + function AlignCenter() { + // ESC "a" align + return "\x1B\x61\x01"; + } + + function AlignRight() { + // ESC "a" align + return "\x1B\x61\x02"; + } + + function PaperRoll($receipt=true, $journal=false, $endorse=false, $validation=false) { + // ESC "c" "0" bitfield + return ("\x1B\x63\x30" + .chr( + ($validation ? 8 : 0) // ?? + + ($endorse ? 4 : 0) + + ($journal ? 2 : 0) // ?? + + ($receipt ? 1 : 0) + ) + ); + } // PaperRoll() + + // TODO: set paper out warning sensor; ESC(\x1B) "c"(\x63) "3"(\x33) bitfield + + // TODO: set paper out stop sensor; ESC(\x1B) "c"(\x63) "4"(\x34) bitfield + + function PanelButtons($on=true) { + // ESC "c" "5" flag + return "\x1B\x63\x35".chr( $on ? 0 : 1 ); + } + + function LineFeedBack() { + // ESC "e" 1 + return "\x1B\x65\x01"; + } + + // TODO: define macro; ESC(\x1B) "g"(\x67) NUL(\x00) num lenLO lenHI data + + // TODO: run macro; ESC(\x1B) "g"(\x67) num + + function DrawerKick($pin=2, $on=100, $off=100) { + // ESC "p" pin on off + return ("\x1B\x70" + .chr( ($pin < 3.5) ? 0 : 1 ) + .chr( max(0, min(255, (int)($on / 2))) ) // times are *2ms + .chr( max(0, min(255, (int)($off / 2))) ) + ); + } + + /* + code tables: + 0: PC437 (USA: Standard Europe) + 1: Katakana + 2: PC850 (Multilingual) + 3: PC860 (Portugese) + 4: PC863 (Canadian-French) + 5: PC865 (Nordic) + 16: WPC1252 + 17: PC866 (Cryllic #2) + 18: PC852 (Latin2) + 19: PC858 + 255: blank + */ + function CodeTable($table=0) { + // ESC "t" table + return "\x1B\x74".chr( max(0, min(255, $table)) ); + } + + // TODO: send peripheral device status; ESC(\x1B) "u"(\x75) ? + + // TODO: send paper sensor status; ESC(\x1B) "v"(\x76) ? + + function UpsideDown($on=true) { + // ESC "{" flag + return "\x1B\x7B".chr( $on ? 1 : 0 ); + } + + // TODO: paper forced feed; FS(\x1C) "A"(\x41) ? + + // TODO: send bitmap file FS(\x1C) "B"(\x42) bitmap + + // TODO: pdf 417 aspect definition; FS(\x1C) "C"(\x43) ? + + // TODO: pdf 417 ecc level definition FS(\x1C) "D"(\x44) ? + + // TODO: horz/vert bar in page mode FS(\x1C) "E"(\x45) dir lenLO lenHI width + + // TODO: set 2d barcode size; FS(\x1C) "H"(\x48) zoom + + // TODO: paper forced return; FS(\x1C) "R"(\x52) ? + + // TODO: store data; FS(\x1C) "g"(\x67) "1"(\x31) \x00 aLO aML aMH aHI bLO bHI data; max memory address=1024 + + // TODO: load data; FS(\x1C) "g"(\x67) "2"(\x32) \x00 aLO aML aMH aHI bLO bHI; max memory address=1024 + + // TODO: print 2d barcode FS(\x1C) "k"(\x6B) type lenLO lenHI data + + // TODO: print stored bitmap; FS(\x1C) "p"(\x70) num bitfield + + // TODO: store bitmaps; FS(\x1C) "q"(\x71) num [xLO xHI yLO yHI]{num} + + function CharacterZoom($horiz=1, $vert=1) { + // GS "!" zoom + return "\x1D\x21".chr( + 16 * (int)(max(1, min(8, $horiz)) - 1) + + (int)(max(1, min(8, $vert)) - 1) + ); + } + + function GotoY($dots=0) { + // GS "$" yLO yHI + return ("\x1D\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + // TODO: define downloadable image; GS(\x1D) "*"(\x2A) x y data + + function Test($type=3, $paper=0) { + // GS "(" "A" + return ("\x1D\x28\x41\x02\x00" + .chr( max(0, min(2, (int)$paper)) ) + .chr( max(1, min(3, (int)$type)) ) + ); + } + + // TODO: edit NV memory; GS(\x1D) "("(\x28) "C"(\x43) ... + + // TODO: toggle realtime command; GS(\x1D) "("(\x28) "D"(\x44) ... + + // TODO: user startup commands; GS(\x1D) "("(\x28) "E"(\x45) ... + + function Density($factor=1.0) { + // GS "(" "K" \x02 \x00 \x31 factor + // factor = 0.7 (\xFA) - 0.9 (\xFF) ; 1.0 (\x00) - 1.3 (\x06) + return ("\x1D\x28\x4B\x02\x00\x31" + .chr( (int)((256 + max(-6, min(6, (($factor - 1.0) * 20)))) % 256) ) + ); + } + + function ColorBlack() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x31"; + } + + function ColorRed() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x32"; + } + + // TODO: print downloadable image; GS(\x1D) "/"(\x2F) bitfield + + // TODO: toggle macro recording; GS(\x1D) ":"(\x3A) + + function Invert($on=true) { + // GS "B" flag + return "\x1D\x42".chr( $on ? 1 : 0 ); + } + + // TODO: set counter print mode; GS(\x1D) "C"(\x43) "0"(\x30) digits align + + // TODO: set counter mode; GS(\x1D) "C"(\x43) "1"(\x31) aLO aHI bLO bHI step repeat + + // TODO: set counter mode value; GS(\x1D) "C"(\x43) "2"(\x32) vLO vHI + + // TODO: set counter mode; GS(\x1D) "C"(\x43) ";"(\x3B) sa ";"(\x3B) sb ";"(\x3B) sn ";"(\x3B) sr ";"(\x3B) sc ";"(\x3B) + + function SpeedHigh() { + // GS "E" speed + return "\x1D\x45\x00"; + } + + function SpeedMedium() { + // GS "E" speed + return "\x1D\x45\x10"; + } + + function SpeedLow() { + // GS "E" speed + return "\x1D\x45\x20"; + } + + function BarcodeHRI($below=true, $above=false) { + // GS "H" bitfield + return ("\x1D\x48" + .chr( ($below ? 2 : 0) + ($above ? 1 : 0) ) + ); + } + + // TODO: send printer ID; GS(\x1D) "I"(\x49) type + + function LeftMargin($dots=0) { + // GS "L" marginLO marginHI + return ("\x1D\x4C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function DotPitch($primary=0, $secondary=0) { + // sets dot pitch to 1/Xth inch (25.4/Xth mm), or 0 for default + // GS "P" pitch pitch + return "\x1D\x50".chr($primary).chr($secondary); + } + + function DiscardLine() { + // GS "T" printbit + return "\x1D\x54\x00"; + } + + function PreCutPaper($full=false) { + // the cutter is above the print position, so cutting without feeding will put the cut above the last few lines printed + // GS "V" bit + // ESC "i" (partial) + // ESC "m" (partial) + return "\x1D\x56".chr( $full ? 0 : 1 ); + } + + function CutPaper($full=false, $feed=0) { + // this version feeds the paper far enough to put the cutter just below the last line printed, plus the feed distance (in pixels?) + // GS "V" bit feed + return ("\x1D\x56" + .chr( $full ? 65 : 66 ) + .chr( $feed ) + ); + } + + function PrintableWidth($dots=65535) { + // GS "W" widthLO widthHI + return ("\x1D\x57" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function MoveY($dots) { + // GS "\" dyLO dyHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1D\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + // TODO: run macro; GS(\x1D) "^"(\x5E) repeat delay mode + + // TODO: enable automatic status back; GS(\x1D) "a"(\x61) bitfield + + function Smooth($on=true) { + // GS "b" flag + return "\x1D\x62".chr( $on ? 1 : 0 ); + } + + // TODO: print counter; GS(\x1D) "c"(\x63) + + function BarcodeHRIFont($font=0) { + // GS "f" font + return "\x1D\x66".chr( max(0, min(2, $font)) ); + } + + function BarcodeHeight($dots=162) { + // GS "h" height + return "\x1D\x68".chr( max(1, min(255, $dots)) ); + } + + function BarcodeUPC($data, $upcE=false) { + $bytes = max(11, min(12, strlen($data))); + return ("\x1D\x6B" + .chr( $upcE ? 66 : 65 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeEAN($data, $ean8=false) { + $bytes = $ean8 ? max(7, min(8, strlen($data))) : max(12, min(13, strlen($data))); + return ("\x1D\x6B" + .chr( $ean8 ? 68 : 67 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE39($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(69) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-Z $%+./-]|', ' ', substr($data, 0, $bytes)), $bytes, ' ', STR_PAD_LEFT) + ); + } + + function BarcodeITF($data) { + $bytes = max(2, min(254, (int)(strlen($data) / 2) * 2)); + return ("\x1D\x6B" + .chr(70) + .chr($bytes) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODEABAR($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(71) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-D$+./:-]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE93($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(72) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + function BarcodeCODE128($data) { + $bytes = max(2, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(73) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + // TODO: send status; GS(\x1D) "r"(\x72) bitfield + + /* + Raster bitmaps may be up to 524280 pixels wide ((255+255*256)*8), and up to 2303 pixels tall (255+8*256). + Tall dots are 2 pixels tall, and wide dots are 2 pixels wide. + This function takes $width and $height as pixels, but the printer takes width as bytes (= 8 pixels). + Data must have (($width * $height) / 8) bytes. + The bits in each data byte specify dots from left-to-right, and bytes are left-to-right, top-to-bottom. + \xC0 = \b11000000 = pixels in the left two columns + \x81 = \b10000001 = pixels in the left and right columns + */ + function RasterBitmap($data, $width, $height, $tallDots=false, $wideDots=false) { + // GS "v" 0 bits widthLO widthHI heightLO heightHI data + $width = (int)(($width + 7) / 8); + $bytes = (int)($width * $height); + return ("\x1D\x76\x00" + .chr( ($tallDots ? 2 : 0) + ($wideDots ? 1 : 0) ) + .chr( (int)($width % 256) ) + .chr( max(0, min(255, (int)($width / 256))) ) + .chr( (int)($height % 256) ) + .chr( max(0, min(8, (int)($height / 256))) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } + + function BarcodeWidth($scale=3) { + // ($scale * 0.141mm) is the width per single code line, not the total code width + // GS "w" scale + return "\x1D\x77".chr( max(1, min(6, $scale)) ); + } + +} // ESCPOSPrintHandler + diff --git a/pos/annualmeeting/db.php b/pos/annualmeeting/db.php new file mode 100755 index 000000000..907d6f548 --- /dev/null +++ b/pos/annualmeeting/db.php @@ -0,0 +1,9 @@ +<?php +require('lib/SQLManager.php'); + +function db(){ + $dbc = new SQLManager('localhost','MYSQL','meeting','root','is4c'); + return $dbc; +} + +?> diff --git a/pos/annualmeeting/edit.php b/pos/annualmeeting/edit.php new file mode 100755 index 000000000..8a2879fe2 --- /dev/null +++ b/pos/annualmeeting/edit.php @@ -0,0 +1,154 @@ +<?php + +include('print.php'); +set_time_limit(0); + +include('db.php'); +$db = db(); + +if (isset($_REQUEST['checkin'])){ + + $cn = $_REQUEST['cn']; + $pinfo = array(); + $pinfo['meals'] = array(); + $pinfo['card_no'] = $cn; + $pinfo['amt'] = $_REQUEST['ttldue']; + + $q = "DELETE FROM regMeals WHERE card_no=".$cn; + $r = $db->query($q); + for($i=0;$i<count($_REQUEST['am']);$i++){ + $q = sprintf("INSERT INTO regMeals VALUES (%d,'%s',%d)", + $cn,($i==0?'OWNER':'GUEST'),$_REQUEST['am'][$i]); + $r = $db->query($q); + if ($_REQUEST['am'][$i] == 1) + $pinfo['meals'][] = 'meat'; + else + $pinfo['meals'][] = 'veg'; + } + if (isset($_REQUEST['km'])){ + foreach($_REQUEST['km'] as $km){ + if ($km == 0) continue; + $q = "INSERT INTO regMeals VALUES ($cn,'CHILD',0)"; + $r = $db->query($q); + $pinfo['meals'][] = 'kid'; + } + } + for($i=0;$i<$_REQUEST['chicken'];$i++){ + $q = "INSERT INTO regMeals VALUES ($cn,'GUEST',1)"; + $r = $db->query($q); + $pinfo['meals'][] = 'meat'; + } + for($i=0;$i<$_REQUEST['veg'];$i++){ + $q = "INSERT INTO regMeals VALUES ($cn,'GUEST',2)"; + $r = $db->query($q); + $pinfo['meals'][] = 'veg'; + } + for($i=0;$i<$_REQUEST['kids'];$i++){ + $q = "INSERT INtO regMeals VALUES ($cn,'CHILD',0)"; + $r = $db->query($q); + $pinfo['meals'][] = 'kid'; + } + $q = "UPDATE registrations SET checked_in=1 WHERE card_no=".$cn; + $r = $db->query($q); + print_info($pinfo); + header("Location: index.php"); + exit; +} +else if (isset($_REQUEST['back'])){ + header("Location: index.php"); + exit; +} + +$q = "SELECT typeDesc,pending,arrived,ttl + FROM arrivals as a left join mealttl as t + ON a.typeDesc=t.name"; +$r = $db->query($q); +$arr = array(); +while($w = $db->fetch_row($r)) + $arr[] = $w; + +$cn = (int)$_REQUEST['cn']; + +$q = "SELECT name,guest_count,child_count,1 as paid,checked_in + FROM registrations WHERE card_no=".$cn; +$r = $db->query($q); +$regW = $db->fetch_row($r); + +$q = "SELECT t.typeDesc,m.subtype FROM regMeals as m + LEFT JOIN mealType AS t ON m.subtype=t.id + WHERE m.card_no=".$cn; +$r = $db->query($q); +$adult = array(); +$kids = array(); +while($w = $db->fetch_row($r)){ + if ($w[1] > 0) + $adult[] = $w; + else + $kids[] = $w; +} +?> +<script type="text/javascript"> +function reCalc(){ + var c = document.getElementById('chicken').value; + var v = document.getElementById('veg').value; + var b = document.getElementById('basedue').value; + + var due = (c*20) + (v*20) + (1*b); + document.getElementById('amtdue').innerHTML='$'+due; + document.getElementById('ttldue').value = due; +} +</script> +<body onload="document.getElementById('chicken').focus();"> +<div> + <div style="float:left;width:60%;"> + <form method="post" action="edit.php"> + <table> + <?php if ($regW['checked_in'] != 0){ + echo '<tr><th colspan="2" style="color:red;">ALREADY CHECKED IN</th></tr>'; + } ?> + <tr><th>Name</th><td><?php echo $regW['name']; ?></td></tr> + <tr><th>Paid</th><td><?php echo ($regW['paid']==1?'Yes':'No'); ?></td></tr> + <tr><th>Guests</th><td><?php echo $regW['guest_count']; ?></td></tr> + <tr><th>Children</th><td><?php echo $regW['child_count']; ?></td></tr> + <tr><td colspan="2" align="center">Registered Meals</td></tr> + <?php foreach ($adult as $a){ + echo '<tr><th>Adult Meal</th><td><select name="am[]">'; + if ($a[1]==1) + echo '<option value="1" selected>Chicken</option><option value="2">Curry</option>'; + else + echo '<option value="1">Chicken</option><option value="2" selected>Curry</option>'; + echo '</select></td></tr>'; + } ?> + <?php foreach ($kids as $k){ + echo '<tr><th>Child Meal</th><td><select name="km[]">'; + echo '<option value="1" selected>Spaghetti</option><option value="0">None</option>'; + echo '</select></td></tr>'; + } ?> + <tr><td colspan="2" align="center">Additional Meals</td></tr> + <tr><th>Chicken</th><td><input type="text" name="chicken" id="chicken" value="0" onchange="reCalc(); "/></td></tr> + <tr><th>Curry</th><td><input type="text" name="veg" id="veg" onchange="reCalc();" value="0" /></td></tr> + <tr><th>Spaghetti</th><td><input type="text" name="kids" value="0" /></td></tr> + <tr><td colspan="2">&nbsp;</td></tr> + <tr><th>Amount Due</th><td id="amtdue">$<?php echo ($regW['paid']==1?0:20*$regW['guest_count']); ?></td></tr> + <input type="hidden" id="basedue" name="basedue" value="<?php echo ($regW['paid']==1?0:20*$regW['guest_count']); ?>" /> + <input type="hidden" id="ttldue" name="ttldue" value="<?php echo ($regW['paid']==1?0:20*$regW['guest_count']); ?>" /> + <input type="hidden" name="cn" value="<?php echo $cn; ?>" /> + <tr><td><input type="submit" name="checkin" value="Check In" /></td> + <td><input type="submit" name="back" value="Go Back" /></td></tr> + </table> + </form> + </div> + + <div style="float:left;width:35%;"> + <table cellspacing="0" cellpadding="4" border="1"> + <tr><th>&nbsp;</th><th>Remaining</th><th>Claimed</th></tr> + <?php foreach($arr as $a){ + printf('<tr><td>%s</td><td>%d</td><td>%d</td></tr>', + $a['typeDesc'],$a['pending'],$a['arrived']); + } ?> + </table> + </div> + + <div style="clear:left;"></div> +</div> +</body> diff --git a/pos/annualmeeting/images/kids.bmp b/pos/annualmeeting/images/kids.bmp new file mode 100755 index 000000000..1d187ce70 Binary files /dev/null and b/pos/annualmeeting/images/kids.bmp differ diff --git a/pos/annualmeeting/images/kidsbpp.bmp b/pos/annualmeeting/images/kidsbpp.bmp new file mode 100755 index 000000000..b59003077 Binary files /dev/null and b/pos/annualmeeting/images/kidsbpp.bmp differ diff --git a/pos/annualmeeting/images/meat.bmp b/pos/annualmeeting/images/meat.bmp new file mode 100755 index 000000000..ec5844db9 Binary files /dev/null and b/pos/annualmeeting/images/meat.bmp differ diff --git a/pos/annualmeeting/images/meatbpp.bmp b/pos/annualmeeting/images/meatbpp.bmp new file mode 100755 index 000000000..b640c4d16 Binary files /dev/null and b/pos/annualmeeting/images/meatbpp.bmp differ diff --git a/pos/annualmeeting/images/veg.bmp b/pos/annualmeeting/images/veg.bmp new file mode 100755 index 000000000..3e3a0e1b4 Binary files /dev/null and b/pos/annualmeeting/images/veg.bmp differ diff --git a/pos/annualmeeting/images/vegbpp.bmp b/pos/annualmeeting/images/vegbpp.bmp new file mode 100755 index 000000000..ee7c81e94 Binary files /dev/null and b/pos/annualmeeting/images/vegbpp.bmp differ diff --git a/pos/annualmeeting/index.php b/pos/annualmeeting/index.php new file mode 100755 index 000000000..019036727 --- /dev/null +++ b/pos/annualmeeting/index.php @@ -0,0 +1,83 @@ +<?php +include('print.php'); +include('db.php'); + +ini_set('display_errors','on'); +set_time_limit(0); + +/* +$in = array(); +$in['meals'] = array('meat'); +$in['card_no'] = 10000; + +print_info($in); +*/ + +if (isset($_REQUEST['cn'])){ + $cn = $_REQUEST['cn']; + $found = False; + $db = db(); + if (is_numeric($cn)){ + $q = sprintf("SELECT CardNo FROM custdata + WHERE CardNo=%d",$cn); + $r = $db->query($q); + if ($db->num_rows($r) > 0) + $found = array_pop($db->fetch_row($r)); + else { + $q2 = sprintf("SELECT card_no FROM + membercards WHERE upc='%s'", + str_pad($cn,13,'0',STR_PAD_LEFT)); + $r2 = $db->query($q2); + if ($db->num_rows($r2) > 0) + $found = array_pop($db->fetch_row($r2)); + } + } + else { + $q = sprintf("SELECT CardNo,LastName,FirstName + FROM custdata WHERE LastName LIKE '%s%%' + ORDER BY LastName,FirstName", + $db->escape($cn)); + $r = $db->query($q); + if ($db->num_rows($r) > 0){ + $found = True; + ?> + <form action="index.php" method="get"> + <b>Multiple Matches</b>:<br /> + <select name="cn"> + <?php while($w = $db->fetch_row($r)){ + printf('<option value="%d">%s, %s</option>', + $w['CardNo'],$w['LastName'], + $w['FirstName']); + } ?> + </select> + <input type="submit" value="Proceed" /> + </form> + <?php + } + } + + if ($found !== False){ + if ($found !== True){ + $chkQ = sprintf("SELECT card_no FROM + registrations WHERE card_no=%d", + $found); + $chkR = $db->query($chkQ); + if ($db->num_rows($chkR) == 0) + header("Location: new.php?cn=".$found); + else + header("Location: edit.php?cn=".$found); + } + exit; + } + else { + echo '<div><i>No owner found</i></div>'; + } +} +?> +<body onload="document.getElementById('cn').focus();"> +<form action="index.php" method="get"> +<b>Enter owner# or card# or last name</b>:<br /> +<input type="text" id="cn" name="cn" /> +<input type="submit" value="Proceed" /> +</form> +</body> diff --git a/pos/annualmeeting/lib/SQLManager.php b/pos/annualmeeting/lib/SQLManager.php new file mode 100755 index 000000000..2af41e242 --- /dev/null +++ b/pos/annualmeeting/lib/SQLManager.php @@ -0,0 +1,563 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************** +CLASS INTERFACE + +Properties: +rows - contains the number of rows from the last + query +TYPE_MYSQL - type for MySQL (static) +TYPE_MSSQL - type for Microsoft SQL Server (static) + +Methods: +SQLManager(server, type, database, username, password[default: ''], persistent[default: False]) + Constructor. Creates the object and adds an initial connection to use as the + default. Future references to this connection can be made using the $database string. + Type should be one of the static database types, e.g. TYPE_MYSQL + +add_connection(server, type, database, username, password[d: ''], persistent[d: False]) + Same as above, but this is not the default connection. + +select_db(database_name, connection_identifier) + Selects the given database, using the default connection if no identifier is provided. + +query(query_string, connection_identifier) + Issues the query and returns the result, using the default connection is no identifier + is provided. + +fetch_array(result_object, connection_identifer) + Returns the row array, using the default connection if no identifier is provided. + +**************************************************/ + +define('DEBUG_MYSQL_QUERIES',$_SERVER['DOCUMENT_ROOT'].'/queries.log'); +define('DEBUG_SMART_INSERTS',$_SERVER['DOCUMENT_ROOT'].'/smart_insert_errors.log'); + +$TYPE_MYSQL = 'MYSQL'; +$TYPE_MSSQL = 'MSSQL'; +$TYPE_PGSQL = 'PGSQL'; + +class SQLManager { + + var $connections; + var $db_types; + var $default_db; + + var $TYPE_MYSQL = 'MYSQL'; + var $TYPE_MSSQL = 'MSSQL'; + var $TYPE_PGSQL = 'PGSQL'; + + function SQLManager($server,$type,$database,$username,$password='',$persistent=False){ + $this->connections=array(); + $this->db_types=array(); + $this->default_db = $database; + $this->add_connection($server,strtoupper($type), + $database,$username,$password, + $persistent); + } + + function add_connection($server,$type,$database,$username,$password='',$persistent=False){ + if (isset($this->connections[$database])){ + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,False); + } + else { + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,True); + + } + $this->db_types[$database] = strtoupper($type); + $gotdb = $this->select_db($database,$database); + if (!$gotdb){ + if ($this->query("CREATE DATABASE $database")){ + $this->select_db($database,$database); + } + else { + unset($this->db_types[$database]); + $this->connections[$database] = False; + } + } + + } + + function connect($server,$type,$username,$password,$persistent=False,$newlink=False){ + switch($type){ + case $this->TYPE_MYSQL: + if ($persistent) + return mysql_pconnect($server,$username,$password,$newlink); + else + return mysql_connect($server,$username,$password,$newlink); + case $this->TYPE_MSSQL: + if ($persistent) + return mssql_pconnect($server,$username,$password); + else + return mssql_connect($server,$username,$password); + case $this->TYPE_PGSQL: + $conStr = "host=".$server." user=".$username." password=".$password; + if ($persistent) + return pg_pconnect($conStr); + else + return pg_connect($conStr); + } + return -1; + } + + function db_close($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_close($this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_close($this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return pg_close($this->connections[$which_connection]); + } + unset($this->connections[$which_connection]); + unset($this->db_types[$which_connection]); + return -1; + } + function select_db($db_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return True; + } + return -1; + } + + function query($query_text,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $result = mysql_query($query_text,$this->connections[$which_connection]); + if (!$result && DEBUG_MYSQL_QUERIES != ""){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n\n"); + fclose($fp); + } + return $result; + case $this->TYPE_MSSQL: + $result = mssql_query($query_text,$this->connections[$which_connection]); + if (!$result && DEBUG_MYSQL_QUERIES != ""){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n\n"); + fclose($fp); + } + return $result; + case $this->TYPE_PGSQL: + return pg_query($this->connections[$which_connection],$query_text); + } + return -1; + } + + function num_rows($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_rows($result_object); + case $this->TYPE_MSSQL: + return mssql_num_rows($result_object); + case $this->TYPE_PGSQL: + return pg_num_rows($result_object); + } + return -1; + } + + function num_fields($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_fields($result_object); + case $this->TYPE_MSSQL: + return mssql_num_fields($result_object); + case $this->TYPE_PGSQL: + return pg_num_fields($result_object); + } + return -1; + } + + function fetch_array($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_array($result_object); + case $this->TYPE_MSSQL: + return mssql_fetch_array($result_object); + case $this->TYPE_PGSQL: + return pg_fetch_array($result_object); + } + return -1; + } + + /* compatibility */ + function fetch_row($result_object,$which_connection=''){ + return $this->fetch_array($result_object,$which_connection); + } + + function fetch_field($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_field($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_fetch_field($result_object,$index); + } + return -1; + } + + function field_type($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_field_type($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_field_type($result_object,$index); + case $this->TYPE_PGSQL: + return pg_field_type($result_object,$index); + } + return -1; + } + + function close($which_connection=''){ + return; + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_close($this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_close($this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return pg_close($this->connections[$which_connection]); + } + return -1; + } + + function test($which_connection=''){ + if ($which_connection=='') + $which_connection=$this->default_db; + + if ($this->connections[$which_connection]) return True; + else return False; + } + + /* copy a table from one database to another, not necessarily on + the same server or format + + $source_db is the database name of the source + $select_query is the query that will get the data + $dest_db is the database name of the destination + $insert_query is the beginning of the query that will add the + data to the destination (specify everything up to VALUES) + */ + function transfer($source_db,$select_query,$dest_db,$insert_query){ + $result = $this->query($select_query,$source_db); + if (!$result) return False; + + $num_fields = $this->num_fields($result,$source_db); + + $unquoted = array("money"=>1,"real"=>1,"numeric"=>1, + "float4"=>1,"float8"=>1,"bit"=>1,"decimal"=>1, + "unknown"=>1); + $strings = array("varchar"=>1,"nvarchar"=>1,"string"=>1, + "char"=>1); + $dates = array("datetime"=>1); + $queries = array(); + + while($row = $this->fetch_array($result,$source_db)){ + $full_query = $insert_query." VALUES ("; + for ($i=0; $i<$num_fields; $i++){ + $type = $this->field_type($result,$i,$source_db); + if ($row[$i] == "" && strstr(strtoupper($type),"INT")) + $row[$i] = 0; + elseif ($row[$i] == "" && isset($unquoted[$type])) + $row[$i] = 0; + if (isset($dates[$type])){ + $clean = $this->cleanDateTime($row[$i]); + $row[$i] = ($clean!="")?$clean:$row[$i]; + } + elseif (isset($strings[$type])) + $row[$i] = str_replace("'","''",$row[$i]); + + if (isset($unquoted[$type])) + $full_query .= $row[$i].","; + else + $full_query .= "'".$row[$i]."',"; + } + $full_query = substr($full_query,0,strlen($full_query)-1).")"; + $queries[] = $full_query; + } + + $ret = True; + + foreach ($queries as $q){ + if(!$this->query($q,$dest_db)){ + $ret = False; + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,$q."\n\n"); + fclose($fp); + } + } + + return $ret; + } + + function cleanDateTime($str){ + $stdFmt = "/(\d\d\d\d)-(\d\d)-(\d\d) (\d+?):(\d\d):(\d\d)/"; + if (preg_match($stdFmt,$str,$group)) + return $str; + + $msqlFmt = "/(\w\w\w) (\d+) (\d\d\d\d) +(\d+?):(\d\d)(\w)M/"; + + $months = array( + "jan"=>"01", + "feb"=>"02", + "mar"=>"03", + "apr"=>"04", + "may"=>"05", + "jun"=>"06", + "jul"=>"07", + "aug"=>"08", + "sep"=>"09", + "oct"=>"10", + "nov"=>"11", + "dec"=>"12" + ); + + $info = array( + "month" => 1, + "day" => 1, + "year" => 1900, + "hour" => 0, + "min" => 0 + ); + + if (preg_match($msqlFmt,$str,$group)){ + $info["month"] = $months[strtolower($group[1])]; + $info["day"] = $group[2]; + $info["year"] = $group[3]; + $info["hour"] = $group[4]; + $info["min"] = $group[5]; + if ($group[6] == "P" && $info["hour"] != "12") + $info["hour"] = ($info["hour"] + 12) % 24; + elseif($group[6] == "A" && $info["hour"] == "12") + $info["hour"] = 0; + } + + $ret = $info["year"]."-"; + $ret .= str_pad($info["month"],2,"0",STR_PAD_LEFT)."-"; + $ret .= str_pad($info["day"],2,"0",STR_PAD_LEFT)." "; + $ret .= str_pad($info["hour"],2,"0",STR_PAD_LEFT).":"; + $ret .= str_pad($info["min"],2,"0",STR_PAD_LEFT); + return $ret; + } + + /* check whether the given table exists + Return values: + True => table exists + False => table doesn't exist + -1 => Operation not supported for this database type + */ + function table_exists($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $result = $this->query("SHOW TABLES FROM $which_connection + LIKE '$table_name'",$which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + case $this->TYPE_MSSQL: + $result = $this->query("SELECT name FROM sysobjects + WHERE name LIKE '$table_name'", + $which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + } + return -1; + } + + /* return the table's definition + Return values: + array of values => table found + array format: $return['column_name'] = + array('column_type', is_auto_increment) + False => no such table + -1 => Operation not supported for this database type + */ + function table_definition($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $return = array(); + $result = $this->query("SHOW COLUMNS FROM $table_name",$which_connection); + while($row = $this->fetch_row($result)){ + $auto = False; + if (strstr($row[5],"auto_increment")) + $auto = True; + $return[strtoupper($row[0])] = array($row[1],$auto,$row[0]); + } + if (count($return) == 0) return False; + else return $return; + case $this->TYPE_MSSQL: + $return = array(); + $result = $this->query("SELECT c.name,t.name,c.length, + CASE WHEN c.autoval IS NULL + THEN 0 ELSE 1 END AS auto + FROM syscolumns AS c + LEFT JOIN sysobjects AS o + ON c.id=o.id + LEFT JOIN systypes AS t + ON c.xtype=t.xtype + WHERE o.name='$table_name'",$which_connection); + while($row = $this->fetch_row($result)){ + $auto = False; + if ($row[3] == 1) $auto = True; + $return[strtoupper($row[0])] = array($row[1]."(".$row[2].")",$auto,$row[0]); + } + if (count($return) == 0) return False; + else return $return; + } + return -1; + } + + /* attempt to load an array of values + * into the specified table + * array format: $values['column_name'] = 'column_value' + * If debugging is enabled, columns that couldn't be + * written are noted + */ + function smart_insert($table_name,$values,$which_connection=''){ + $OUTFILE = DEBUG_SMART_INSERTS; + + if ($which_connection == '') + $which_connection=$this->default_db; + $exists = $this->table_exists($table_name,$which_connection); + if (!$exists) return False; + if ($exists === -1) return -1; + + $t_def = $this->table_definition($table_name,$which_connection); + + $fp = -1; + $tstamp = date("r"); + if ($OUTFILE != "") + $fp = fopen($OUTFILE,"a"); + + $cols = "("; + $vals = "("; + foreach($values as $k=>$v){ + $k = strtoupper($k); + if (isset($t_def[$k]) && is_array($t_def[$k])){ + if (!$t_def[$k][1]){ + if (stristr($t_def[$k][0],"money") || + stristr($t_def[$k][0],'decimal') || + stristr($t_def[$k][0],'float') || + stristr($t_def[$k][0],'double') ) + $vals .= $v.","; + else + $vals .= "'".$v."',"; + $col_name = $t_def[$k][2]; + if ($this->db_types[$which_connection] == $this->TYPE_MYSQL) + $cols .= "`".$col_name."`,"; + else + $cols .= $col_name.","; + } + else { + if ($OUTFILE != "") + fwrite($fp,"$tstamp: Column $k in table $table_name + is auto_increment so your value + was omitted\n"); + } + } + else { + if ($OUTFILE != '') + fwrite($fp,"$tstamp: Column $k not in table $table_name\n"); + } + } + $cols = substr($cols,0,strlen($cols)-1).")"; + $vals = substr($vals,0,strlen($vals)-1).")"; + $insertQ = "INSERT INTO $table_name $cols VALUES $vals"; + + $ret = $this->query($insertQ,$which_connection); + if (!$ret && $OUTFILE != ""){ + fwrite($fp,"$tstamp: $insertQ\n"); + } + if ($OUTFILE != "") fclose($fp); + + return $ret; + } + + function datediff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "datediff($date1,$date2)"; + case $this->TYPE_MSSQL: + return "datediff(dd,$date2,$date1)"; + } + } + + function now($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "now()"; + case $this->TYPE_MSSQL: + return "getdate()"; + case $this->TYPE_PGSQL: + return "now()"; + } + } + + function escape($str,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_real_escape_string($str); + case $this->TYPE_MSSQL: + return str_replace("'","''",$str); + } + return $str; + } +} + +?> diff --git a/pos/annualmeeting/meetingdb.sql b/pos/annualmeeting/meetingdb.sql new file mode 100644 index 000000000..5ef1b67d3 --- /dev/null +++ b/pos/annualmeeting/meetingdb.sql @@ -0,0 +1,214 @@ +-- MySQL dump 10.11 +-- +-- Host: localhost Database: annualmeeting +-- ------------------------------------------------------ +-- Server version 5.0.95 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Temporary table structure for view `arrivals` +-- + +DROP TABLE IF EXISTS `arrivals`; +/*!50001 DROP VIEW IF EXISTS `arrivals`*/; +/*!50001 CREATE TABLE `arrivals` ( + `typeDesc` varchar(50), + `pending` decimal(23,0), + `arrived` decimal(23,0) +) ENGINE=MyISAM */; + +-- +-- Table structure for table `custdata` +-- + +DROP TABLE IF EXISTS `custdata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `custdata` ( + `CardNo` int(8) default NULL, + `personNum` tinyint(4) NOT NULL default '1', + `LastName` varchar(30) default NULL, + `FirstName` varchar(30) default NULL, + `CashBack` double NOT NULL default '60', + `Balance` double NOT NULL default '0', + `Discount` smallint(6) default NULL, + `MemDiscountLimit` double NOT NULL default '0', + `ChargeOk` tinyint(4) NOT NULL default '1', + `WriteChecks` tinyint(4) NOT NULL default '1', + `StoreCoupons` tinyint(4) NOT NULL default '1', + `Type` varchar(10) NOT NULL default 'pc', + `memType` tinyint(4) default NULL, + `staff` tinyint(4) NOT NULL default '0', + `SSI` tinyint(4) NOT NULL default '0', + `Purchases` double NOT NULL default '0', + `NumberOfChecks` smallint(6) NOT NULL default '0', + `memCoupons` int(11) NOT NULL default '1', + `blueLine` varchar(50) default NULL, + `Shown` tinyint(4) NOT NULL default '1', + `id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `CardNo` (`CardNo`), + KEY `LastName` (`LastName`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `custdata` +-- + +LOCK TABLES `custdata` WRITE; +/*!40000 ALTER TABLE `custdata` DISABLE KEYS */; +/*!40000 ALTER TABLE `custdata` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mealttl` +-- + +DROP TABLE IF EXISTS `mealttl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `mealttl` ( + `name` varchar(50) default NULL, + `ttl` int(11) default NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mealttl` +-- + +LOCK TABLES `mealttl` WRITE; +/*!40000 ALTER TABLE `mealttl` DISABLE KEYS */; +INSERT INTO `mealttl` VALUES ('Chicken',100),('Child Spaghetti',100),('Ratatouille',100); +/*!40000 ALTER TABLE `mealttl` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mealtype` +-- + +DROP TABLE IF EXISTS `mealtype`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `mealtype` ( + `id` int(11) default NULL, + `typeDesc` varchar(50) default NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mealtype` +-- + +LOCK TABLES `mealtype` WRITE; +/*!40000 ALTER TABLE `mealtype` DISABLE KEYS */; +INSERT INTO `mealtype` VALUES (0,'Child Spaghetti'),(1,'Chicken'),(2,'Curry'); +/*!40000 ALTER TABLE `mealtype` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `membercards` +-- + +DROP TABLE IF EXISTS `membercards`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `membercards` ( + `card_no` int(11) NOT NULL default '0', + `upc` varchar(13) default NULL, + PRIMARY KEY (`card_no`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `membercards` +-- + +LOCK TABLES `membercards` WRITE; +/*!40000 ALTER TABLE `membercards` DISABLE KEYS */; +/*!40000 ALTER TABLE `membercards` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `registrations` +-- + +DROP TABLE IF EXISTS `registrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `registrations` ( + `tdate` datetime default NULL, + `card_no` int(11) default NULL, + `name` varchar(150) default NULL, + `email` varchar(150) default NULL, + `phone` varchar(30) default NULL, + `guest_count` int(11) default NULL, + `child_count` int(11) default NULL, + `paid` int(11) default NULL, + `checked_in` int(11) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `registrations` +-- + +LOCK TABLES `registrations` WRITE; +/*!40000 ALTER TABLE `registrations` DISABLE KEYS */; +/*!40000 ALTER TABLE `registrations` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `regmeals` +-- + +DROP TABLE IF EXISTS `regmeals`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `regmeals` ( + `card_no` int(11) default NULL, + `type` varchar(5) default NULL, + `subtype` smallint(6) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `regmeals` +-- + +LOCK TABLES `regmeals` WRITE; +/*!40000 ALTER TABLE `regmeals` DISABLE KEYS */; +/*!40000 ALTER TABLE `regmeals` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Final view structure for view `arrivals` +-- + +/*!50001 DROP TABLE `arrivals`*/; +/*!50001 DROP VIEW IF EXISTS `arrivals`*/; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `arrivals` AS select `t`.`typeDesc` AS `typeDesc`,sum((case when (`r`.`checked_in` = 0) then 1 else 0 end)) AS `pending`,sum((case when (`r`.`checked_in` = 1) then 1 else 0 end)) AS `arrived` from ((`regmeals` `m` left join `registrations` `r` on((`m`.`card_no` = `r`.`card_no`))) left join `mealtype` `t` on((`t`.`id` = `m`.`subtype`))) group by `t`.`typeDesc` */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2013-02-05 8:37:29 diff --git a/pos/annualmeeting/new.php b/pos/annualmeeting/new.php new file mode 100755 index 000000000..97633fc6d --- /dev/null +++ b/pos/annualmeeting/new.php @@ -0,0 +1,122 @@ +<?php + +include('print.php'); +set_time_limit(0); + +include('db.php'); +$db = db(); + +if (isset($_REQUEST['checkin'])){ + + $cn = $_REQUEST['cn']; + $pinfo = array(); + $pinfo['meals'] = array(); + $pinfo['card_no'] = $cn; + $pinfo['amt'] = $_REQUEST['ttldue']; + + $q = sprintf("INSERT INTO registrations VALUES (now(),%d,'%s', + '','',0,0,0,0)",$cn,$db->escape($_REQUEST['name'])); + $r = $db->query($q); + for($i=0;$i<count($_REQUEST['am']);$i++){ + $q = sprintf("INSERT INTO regMeals VALUES (%d,'%s',%d)", + $cn,($i==0?'OWNER':'GUEST'),$_REQUEST['am'][$i]); + $r = $db->query($q); + if ($_REQUEST['am'][$i] == 1) + $pinfo['meals'][] = 'meat'; + else + $pinfo['meals'][] = 'veg'; + } + + for($i=0;$i<$_REQUEST['chicken'];$i++){ + $q = "INSERT INTO regMeals VALUES ($cn,'GUEST',1)"; + $r = $db->query($q); + $pinfo['meals'][] = 'meat'; + } + for($i=0;$i<$_REQUEST['veg'];$i++){ + $q = "INSERT INTO regMeals VALUES ($cn,'GUEST',2)"; + $r = $db->query($q); + $pinfo['meals'][] = 'veg'; + } + for($i=0;$i<$_REQUEST['kids'];$i++){ + $q = "INSERT INtO regMeals VALUES ($cn,'CHILD',0)"; + $r = $db->query($q); + $pinfo['meals'][] = 'kid'; + } + $q = "UPDATE registrations SET checked_in=1 WHERE card_no=".$cn; + $r = $db->query($q); + print_info($pinfo); + header("Location: index.php"); + exit; +} +else if (isset($_REQUEST['back'])){ + header("Location: index.php"); + exit; +} + +$q = "SELECT typeDesc,pending,arrived,ttl + FROM arrivals as a left join mealttl as t + ON a.typeDesc=t.name"; +$r = $db->query($q); +$arr = array(); +while($w = $db->fetch_row($r)) + $arr[] = $w; + +$cn = (int)$_REQUEST['cn']; + +$q = "SELECT FirstName,LastName FROM custdata + WHERE personNum=1 AND CardNo=".$cn; +$r = $db->query($q); +$regW = $db->fetch_row($r); +$regW['name'] = $regW['FirstName'].' '.$regW['LastName']; + +?> +<script type="text/javascript"> +function reCalc(){ + var c = document.getElementById('chicken').value; + var v = document.getElementById('veg').value; + var b = document.getElementById('basedue').value; + + var due = (c*20) + (v*20) + (1*b); + document.getElementById('amtdue').innerHTML='$'+due; + document.getElementById('ttldue').value= due; +} +</script> +<body style="background-color: red;" onload="document.getElementById('chicken').focus();"> +<div style="color:white;">DID NOT RSVP</div> +<div> + <div style="float:left;width:60%;"> + <form method="post" action="new.php"> + <table> + <tr><th>Name</th><td><input type="text" name="name" value="<?php echo $regW['name']; ?>" /></td></tr> + <tr><th>Owner Meal</th><td><select name="am[]"> + <option value="0"></option> + <option value="1" selected>Chicken</option><option value="2">Curry</option> + </select></td></tr> + <tr><td colspan="2" align="center">Additional Meals</td></tr> + <tr><th>Chicken</th><td><input type="text" name="chicken" id="chicken" value="0" onchange="reCalc(); "/></td></tr> + <tr><th>Curry</th><td><input type="text" name="veg" id="veg" onchange="reCalc();" value="0" /></td></tr> + <tr><th>Spaghetti</th><td><input type="text" name="kids" value="0" /></td></tr> + <tr><td colspan="2">&nbsp;</td></tr> + <tr><th>Amount Due</th><td id="amtdue">$0</td></tr> + <input type="hidden" id="basedue" name="basedue" value="0" /> + <input type="hidden" id="ttldue" name="ttldue" value="0" /> + <input type="hidden" name="cn" value="<?php echo $cn; ?>" /> + <tr><td><input type="submit" name="checkin" value="Check In" /></td> + <td><input type="submit" name="back" value="Go Back" /></td></tr> + </table> + </form> + </div> + + <div style="float:left;width:35%;"> + <table cellspacing="0" cellpadding="4" border="1"> + <tr><th>&nbsp;</th><th>Pending</th><th>Remaining</th></tr> + <?php foreach($arr as $a){ + printf('<tr><td>%s</td><td>%d</td><td>%d</td></tr>', + $a['typeDesc'],$a['pending'],$a['arrived']); + } ?> + </table> + </div> + + <div style="clear:left;"></div> +</div> +</body> diff --git a/pos/annualmeeting/print.php b/pos/annualmeeting/print.php new file mode 100755 index 000000000..2138a2c5c --- /dev/null +++ b/pos/annualmeeting/print.php @@ -0,0 +1,59 @@ +<?php + +if (!function_exists("printImage")) include_once('printLib.php'); + +function print_info($INFO){ + //return; + $receipt = ""; + $dts = 0; + foreach($INFO['meals'] as $mtype){ + $receipt .= centerString("Dinner Choice")."\n"; + switch(strtolower($mtype[0])){ + case 'm': + $receipt .= printImage("images/meatbpp.bmp"); + $dts++; + break; + case 'v': + $receipt .= printImage("images/vegbpp.bmp"); + $dts++; + break; + case 'k': + $receipt .= printImage("images/kidsbpp.bmp"); + break; + } + $receipt .= centerString("Please place this ticket face up on the table")."\n"; + $receipt .= centerString("visible so the server knows your meal choice")."\n"; + $receipt .= cut(); + } + for ($i=0; $i<$dts*2;$i++){ + $receipt .= biggerFont(centerBig("Free Drink Ticket"))."\n\n"; + $receipt .= centerString("This drink is good for one designated soda, beer")."\n"; + $receipt .= centerString("or wine. Ticket must be surrendered to the")."\n"; + $receipt .= centerString("bartender in exchange for beverages.")."\n"; + $receipt .= boldFont(); + $receipt .= centerString("You must be at least 21 years old to redeem")."\n"; + $receipt .= centerString("for alcoholic beverages.")."\n"; + $receipt .= normalFont(); + $receipt .= cut(); + } + + for($i=0;$i<2;$i++){ + $receipt .= centerString("Raffle Ticket - Your number is:")."\n\n"; + $receipt .= biggerFont(centerBig($INFO['card_no']))."\n\n"; + $receipt .= centerString("Please hold this ticket for the raffle")."\n"; + $receipt .= cut(); + } + + if (!isset($INFO['amt']) || $INFO['amt'] == 0){ + $receipt .= biggerFont(centerBig("PAID IN FULL"))."\n"; + $receipt .= cut(); + } + else { + $receipt .= biggerFont(centerBig(sprintf('AMOUNT DUE: $%.2f',$INFO['amt'])))."\n"; + $receipt .= cut(); + } + + writeLine($receipt); +} + +?> diff --git a/pos/annualmeeting/printLib.php b/pos/annualmeeting/printLib.php new file mode 100755 index 000000000..db432d746 --- /dev/null +++ b/pos/annualmeeting/printLib.php @@ -0,0 +1,148 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("ESCPOSPrintHandler")) include_once("PrintHandlers/ESCPOSPrintHandler.class.php"); +if (!class_exists("Bitmap")) include_once("Bitmap4.class.php"); +define('PRINTER_OUT_PORT','LPT1:'); +//define('PRINTER_OUT_PORT','fake-receipt.txt'); + + +// -------------------------------------------------------------- +function build_time($timestamp) { + + return strftime("%m/%d/%y %I:%M %p", $timestamp); +} +// -------------------------------------------------------------- +function centerString($text) { + + return center($text, 59); +} +// -------------------------------------------------------------- +function writeLine($text) { + $fp = fopen(PRINTER_OUT_PORT, "w"); + fwrite($fp, $text); + fclose($fp); +} +// -------------------------------------------------------------- + +function center($text, $linewidth) { + $blank = str_repeat(" ", 59); + $text = trim($text); + $lead = (int) (($linewidth - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +// ------------------------------------------------------------- +function drawerKick() { + + writeLine(chr(27).chr(112).chr(0).chr(48)."0"); +} + +// ------------------------------------------------------------- +function printImage($image_fn) { + $receipt = "" + .chr(27).chr(33).chr(5); + $img = RenderBitmapFromFile($image_fn); + $receipt .= $img."\n"; + + return $receipt; + +} +// ------------------------------------------------------------- +function promoMsg() { + +} + +/***** jqh 09/29/05 functions added for new receipt *****/ +function biggerFont($str) { + $receipt=chr(29).chr(33).chr(17); + $receipt.=$str; + $receipt.=chr(29).chr(33).chr(00); + + return $receipt; +} +function centerBig($text) { + $blank = str_repeat(" ", 30); + $text = trim($text); + $lead = (int) ((30 - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +/***** jqh end change *****/ + +function normalFont() { + return chr(27).chr(33).chr(5); +} +function boldFont() { + return chr(27).chr(33).chr(9); +} + +function cut(){ + $receipt = str_repeat("\n", 8); + $receipt .= chr(27).chr(105); + return $receipt; +} + +function twoColumns($col1, $col2) { + // init + $max = 56; + $text = ""; + // find longest string in each column, ignoring font change strings + $c1max = 0; + $col1s = array(); + foreach( $col1 as $c1) { + $c1s = trim(str_replace(array(boldFont(),normalFont()), "", $c1)); + $col1s[] = $c1s; + $c1max = max($c1max, strlen($c1s)); + } + $c2max = 0; + $col2s = array(); + foreach( $col2 as $c2) { + $c2s = trim(str_replace(array(boldFont(),normalFont()), "", $c2)); + $col2s[] = $c2s; + $c2max = max($c2max, strlen($c2s)); + } + // space the columns as much as they'll fit + $spacer = $max - $c1max - $c2max; + // scan both columns + for( $x=0; isset($col1[$x]) && isset($col2[$x]); $x++) { + $c1 = trim($col1[$x]); $c1l = strlen($col1s[$x]); + $c2 = trim($col2[$x]); $c2l = strlen($col2s[$x]); + if( ($c1max+$spacer+$c2l) <= $max) { + $text .= $c1 . @str_repeat(" ", ($c1max+$spacer)-$c1l) . $c2 . "\n"; + } else { + $text .= $c1 . "\n" . str_repeat(" ", $c1max+$spacer) . $c2 . "\n"; + } + } + // if one column is longer than the other, print the extras + // (only one of these should happen since the loop above runs as long as both columns still have rows) + for( $y=$x; isset($col1[$y]); $y++) { + $text .= trim($col1[$y]) . "\n"; + } // col1 extras + for( $y=$x; isset($col2[$y]); $y++) { + $text .= str_repeat(" ", $c1max+$spacer) . trim($col2[$y]) . "\n"; + } // col2 extras + return $text; +} + +?> diff --git a/pos/is4c-nf/.gitignore b/pos/is4c-nf/.gitignore new file mode 100644 index 000000000..7f36d842e --- /dev/null +++ b/pos/is4c-nf/.gitignore @@ -0,0 +1,4 @@ +fakereceipt.txt +/ini-local.php +css/store.css +cc-modules diff --git a/pos/is4c-nf/WFC_VS_RELEASE b/pos/is4c-nf/WFC_VS_RELEASE new file mode 100644 index 000000000..868d08ab4 --- /dev/null +++ b/pos/is4c-nf/WFC_VS_RELEASE @@ -0,0 +1,260 @@ +==================================================== += DIFFERENCES BETWEEN MY SCRIPTS AND THE RELEASE += VERSION SCRIPTS, DISCUSSED PER FILE +==================================================== + +authenticate3.php: WFC version requires frontendsecurity >= 21 + to unlock someone else's screen. Trunk requires >= 11 + +chgName.php: File doesn't exist in WFC version. Function is in + lib/printLib.php. WFC version doesn't handle different + account # lengths differently + +chkscale.php: not in use. Can replace scale.php in gui-base.php's + drawGui() + +chkscanner.php: not in use. Can be added to gui-base.php's drawGui() + +clearscanner.php: not in use, as with chkscanner.php + +clientscripts.php: most of these functions are no longer used + in my code, either incorporated directly in if they're + only called once or replaced by gui-base.php's javascript + generating php functions. + +clubCard.php: moved to parser-class-lib/ClubCard.php + +connect.php: several changes here, in lib/connect.php + 1) uses my SQLManager class rather than the SQL abstraction + functions + 2) uses persistent connections for local [lane] DBs + 3) amtdue in getsubtotals() is calculated using a float cast + since string numbers > $999 cause weird results + 4) uploadToServer() uses SQLManager's transfer method to + move tables from one DB to another. In theory this works + even when lane and sever have different DBMS's (tested with + MSSQL lane & Postgres server). + 5) uploadToServer() also uploads to a table called dTransToday. + WFC truncates this table every night rather than archiving + and truncating dTransactions. + +decision.php: endorseType() (from clientscripts.php) is incorporated + directly into the code. Javascript for populating & submitting + the form is slightly different. I changed it when running into + some error, but I forget what. It should be functionally identical. + There are a couple extra warning session variables that I use + in conjunction with boxMsg2.php to throw in "Enter to continue, + clear to cancel" cashier prompts. Enter credit card or check + tender w/o an amount provides a good example of this. + +display.php: not used. All drawing of the main frame set is done by + drawGui() in gui-base.php + +end.php: the auotReprint session variable gets checked (setting it + causes a second receipt to be printed automatically). + moveTempData() also offloads data to a lane table localTrans_today. + This is truncated nightly and used in place of localTrans in a + couple spots for speed. + +ini.php: I'm adding $_SESSION variables to deal with place where table + names differ among versions and/or DBMSes + + $_SESSION["local_dtrans"] is the local table in translog that + corresponds in format to the dtransactions table on the server + (WFC dtransations doesn't have MemberType or Staff on the server + side, so I use a view locally to trim those columns out) + +invalid.php et al: none of the "invalid" pages exist anymore. The gui + class InvalidPage allows a two different bodies to be loaded + based on $_GET["invalid"], so the old invalid pages that only + differ in color & message text are not needed. + +lib.php: in lib/lib.php. I removed nullwrap_old and truthwrap functions + as they are not used anywhere. + +loadconfig.php: in lib/loadconfig.php. I removed the nexttransno function + as it is not used. + +loan*.php: these seem to rely on a loanenter() display function that does + not exist, so I skipped implementing them. + +login.php: just a redirect so all drawing takes place in the same frameset + from gui-base.php's drawGui(). + +maindisplay.php: gone. All javascript jumping around is with the + main frameset in gui-base.php. + +mcoupon.php: gone. Function moved to parser-class-lib/UPC.php + +MemCommentPlus.php: relies on non-existant memDataConnect(), thus skipped. + +memlist.php: moved to gui-modules/memlist.php. We had an issue with + cashiers using the "Clear" button to try and dimiss both memlist.php + and memsearch.php. I've modified memlist.php's javascript so + hitting "CL<enter>" will dimiss the list without selecting a member. + Input filtering also triggers on "CL" (from memsearch.php), which + is kind of a kludge. You can't search by just "CL" anymore, but + our "Clancy" membership doesn't end up with so much weird and + incorrect activity. + +msgscreen.php: again eliminated, everything runs through the same frameset + in gui-base.php + +pos.php: this only exists to call drawGui(). I had to add it because + once in a great while - I never found any rhyme or reason to it - + redirecting two pages in the frameset (input and main_frame) at the + same time caused IE to lock up completely. I just gave up and + redirected the top level location to pos.php after setting + $_SESSION variables to get the proper input & main_frame. + +pos2.php: this is the doozy, and has its own section below + +prehkeys.php: this is going to be one of the bigger ones to merge. + I haven't checked it line for line yet, but I'll jot down differences + that stand out: + tender(): + I do some type casting at the beginning to change + the amount from a string to a numeric type. PHP does + not interpret strings over $999 (i.e., 100000 and up) + correctly. I also add support for traveler's checks (TV) + They get endorsed like checks and added AS checks. Thus + they show up as checks on the server side (per our + financial dept's request) but aren't restricted by the + cash over limit at the lanes. + deptkey(): has a couple hard-coded bits for cashier prompts + and automatic second receipts. + I removed MADDiscount() and needBasedDisc(); neither is used. + +printLib.php: in lib/printLib.php. Modified printReceiptHeader() to + allow for an arbitrary number of header lines. + +printReceipt.php: in lib/printReceipt.php. Mine uses setDrawKickLater() + instead of setDrawKick() to open in a more limited number of + circumstances. The rest of the function is pretty significantly + different. We still use an "old" style receipt and the new/old + split is reflected heavily. I'll move mine up to your receipt + when time allows, but I want to merge more important code first. + +reprint.php: again, my receipt style differs but this isn't a high priority. + +resume.php: we've both changed the original structure of this; I *think* + they're functionally equivilent. Mine uses SQLManager's transfer + method to move data between servers for [theoretical] DMBS + independence. + +scale.php: mine is slightly different. A $_SESSION variable short circuits + the page to hide the scale (since I'm always using the same + frameset, scale.php is always there but it shouldn't always + be showing scale input). + +setDrawerKick.php: my setDrawerKickLater() opens for non-zero cash tenders + and credit card tenders. + +special.php: in lib/special.php. Again mine is geared towards DMBS + independence. The mysql query is currently hardcoded in. + +suspendedlist.php: same deal as special.php (except it's in gui-modules) + +tenderReport.php: in lib/tenderReport.php. Mine is a re-write as a loop + to avoid a lot of repetitiveness and extended to different + tenders easily. + +upcscanned.php: in parser-class-lib/UPC.php. A fair amount of + difference here. Basic functionality should be the same, but + compatibility may need fine-tuning after some testing. + +==================================================== += MY POS2.PHP +==================================================== +At a glance, this bears little resemblance to the release +version. Input parsing takes place in three steps. + +STEP ONE: The first parse chain + An array of parser objects is built, then the + input string is handed to each object in the array + Objects in the first parse chain MAY modify the + input string. + +STEP TWO: Quantity + After the first parse chain finshes modifying the + input string, the quantity operator (*) is handled. + This is the end of what I think of as "pre-parsing", + where the input string is modified and $_SESSION variables + are set in preparation for "actual parsing" + +STEP THREE: The second parse chain + Again there's an array of parser objects and the input + string is handed to each one in turn. This time the + objects must finish handling the input. Once in object + returns true from its check() method - asserting that it + can handle this input - the loop is broken. No additional + objects get that input [so write tight check() methods]. + By convention, the boolean return value of the object's + parse() method dicates whether or not to call lastpage(). + This is merely a convenience provided because many objects + do finish by calling lastpage(). + +The main upside of this setup is that adding or removing input +handling is a snap. Just create a new parser object and add it to +the appropriate chain or comment out/remove the one(s) you don't want. +The downside is tracing the difference between my code and the +release version involves going through a lot of files. I've done +my best to go through release pos2.php and add parser objects for +any additional input, but I may have missed some things. Testing +should keep an eye out for input unknown screens. Notes on this +process follow: + +"TNPR": calls a trackPatronage() function that doesn't seem + to exist. If the function is found, this should be added + to the first parse chain. +"CC" & "TB": credit cards do NOT require an amount at WFC + (coincidentally, neither do checks, although this doesn't + come up in the release's pos2.php) +"EC": does not require an amount at WFC +"ES": not sure what this is supposed to do. If it behaves oddly, + recommend changing return value in parser-class-lib/EndOfShift.php + parse() function to True. +"TW": Tare w/ no amount adds a tare of .01 at WFC + +==================================================== += NEW FILES I'VE ADDED: += WHAT IS THIS AND WHY IS IT HERE? +==================================================== +gui-base.php + THE centerpiece of the display code. It contains + the frameset that used to be in pos.php, login.php, + display.php, etc. It provides functions for changing + the one page in the frameset (via http header or + javascript) and a function to change both the + input and main frames. All switching goes through + this script (instead of main_display(x), goHome(), + etc). + +adminauthenticate.php & /gui-modules/adminlogin.php + This is meant to be a multi-purpose login, rather + than have separate login code for everything that + comes up (no sale, cancel, etc). adminauthenticate.php + will check to see if the user with the provided + password has frontendsecurity >= 30 (this could be + changed to a $_SESSION variable for even more + extensibility), and if so loads whichever gui-module + is specified by $_SESSION["adminRequest"] + I use this to load my undo function (see: + parser-class-lib/Steering case "UNDO") + +undoTransaction.php & /gui-modules/undo.php + New feature to rollback an entire transaction. The + gui-module prompts for a transaction number (trans_num style) + and undoTransaction.php loads the reverse of that + transaction into localTempTrans. After confirming that + a) it's the right transaction and b) nothing went horribly + awry in reversing it, the reversal can be completed with + a "0ca" (or zero any tender, really). + +prodInfo.php & /gui-modules/productDump.php + The idea here is to provide the cashier with a faster tool + to deal with items not ringing correctly. Rather than + filling out paperwork, the cashier can enter "PROD", then + re-scan the item. This prints out a receipt indicating + whether the UPC is in the system, what it's current + price is, and whether it's on sale. diff --git a/pos/is4c-nf/ajax-callbacks/ajax-cabreceipt.php b/pos/is4c-nf/ajax-callbacks/ajax-cabreceipt.php new file mode 100644 index 000000000..625525c85 --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-cabreceipt.php @@ -0,0 +1,33 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$CORE_LOCAL->set("cabReference",$_REQUEST['input']); +$receipt = ReceiptLib::printReceipt('cab'); +ReceiptLib::writeLine($receipt); + +echo "Done"; + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-decision.php b/pos/is4c-nf/ajax-callbacks/ajax-decision.php new file mode 100644 index 000000000..81e302bfc --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-decision.php @@ -0,0 +1,50 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$decision = isset($_REQUEST['input'])?strtoupper(trim($_REQUEST["input"])):'CL'; + +$ret = array('dest_page'=>MiscLib::base_url().'gui-modules/pos2.php', + 'endorse'=>False, 'cleared'=>False); + +if ($decision == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $ret['cleared'] = True; +} +elseif (strlen($decision) > 0) { + + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$CORE_LOCAL->get("strEntered")); +} +else { + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$CORE_LOCAL->get("strEntered")); +} + +echo JsonLib::array_to_json($ret); + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-end.php b/pos/is4c-nf/ajax-callbacks/ajax-end.php new file mode 100644 index 000000000..d242ea832 --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-end.php @@ -0,0 +1,174 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); + +if ($CORE_LOCAL->get("End") == 1) { + TransRecord::addtransDiscount(); + TransRecord::addTax(); + $taxes = Database::LineItemTaxes(); + foreach($taxes as $tax){ + TransRecord::addQueued('TAXLINEITEM',$tax['description'],$tax['rate_id'],'',$tax['amount']); + } +} + +$receiptType = isset($_REQUEST['receiptType'])?$_REQUEST['receiptType']:''; + +$yesSync = JsonLib::array_to_json(array('sync'=>True)); +$noSync = JsonLib::array_to_json(array('sync'=>False)); +$output = $noSync; + +if (strlen($receiptType) > 0) { + + $receiptContent = array(); + + $kicker_class = ($CORE_LOCAL->get("kickerModule")=="") ? 'Kicker' : $CORE_LOCAL->get('kickerModule'); + $kicker_object = new $kicker_class(); + if (!is_object($kicker_object)) $kicker_object = new Kicker(); + $dokick = $kicker_object->doKick(); + + $PRINT_OBJ = new ESCPOSPrintHandler(); + + $email = CoreState::getCustomerPref('email_receipt'); + $customerEmail = filter_var($email, FILTER_VALIDATE_EMAIL); + $doEmail = ($customerEmail !== False) ? True : False; + + if ($receiptType != "none") + $receiptContent[] = ReceiptLib::printReceipt($receiptType,False,$doEmail); + + if ($CORE_LOCAL->get("ccCustCopy") == 1){ + $CORE_LOCAL->set("ccCustCopy",0); + $receiptContent[] = ReceiptLib::printReceipt($receiptType); + } + elseif ($receiptType == "ccSlip"){ + // don't mess with reprints + } + elseif ($CORE_LOCAL->get("autoReprint") == 1){ + $CORE_LOCAL->set("autoReprint",0); + $receiptContent[] = ReceiptLib::printReceipt($receiptType,True); + } + + if ($CORE_LOCAL->get("End") >= 1 || $receiptType == "cancelled" + || $receiptType == "suspended"){ + $CORE_LOCAL->set("End",0); + cleartemptrans($receiptType); + $output = $yesSync; + UdpComm::udpSend("termReset"); + } + + // close session so if printer hangs + // this script won't lock the session file + if (session_id() != ''){ + session_write_close(); + } + + if ($receiptType == "full" && $dokick){ + ReceiptLib::drawerKick(); + } + + $EMAIL_OBJ = new EmailPrintHandler(); + foreach($receiptContent as $receipt){ + if(is_array($receipt)){ + if (!empty($receipt['print'])) + $PRINT_OBJ->writeLine($receipt['print']); + if (!empty($receipt['any'])) + $EMAIL_OBJ->writeLine($receipt['any'],$customerEmail); + } + elseif(!empty($receipt)) + $PRINT_OBJ->writeLine($receipt); + } +} + +$td = SigCapture::term_object(); +if (is_object($td)) + $td->WriteToScale("reset"); + +echo $output; + +function cleartemptrans($type) { + global $CORE_LOCAL; + + TransRecord::emptyQueue(); + + // make sure transno advances even if something + // wacky happens with the db shuffling + Database::loadglobalvalues(); + $CORE_LOCAL->set("transno",$CORE_LOCAL->get("transno") + 1); + Database::setglobalvalue("TransNo", $CORE_LOCAL->get("transno")); + + $db = Database::tDataConnect(); + + if($type == "cancelled") { + $db->query("update localtemptrans set trans_status = 'X'"); + } + + moveTempData(); + truncateTempTables(); + + /** + Moved to separate ajax call (ajax-transaction-sync.php) + */ + if ($CORE_LOCAL->get("testremote")==0) + Database::testremote(); + + if ($CORE_LOCAL->get("TaxExempt") != 0) { + $CORE_LOCAL->set("TaxExempt",0); + Database::setglobalvalue("TaxExempt", 0); + } + + CoreState::memberReset(); + CoreState::transReset(); + CoreState::printReset(); + + Database::getsubtotals(); + + return 1; +} + + +function truncateTempTables() { + $connection = Database::tDataConnect(); + $query1 = "truncate table localtemptrans"; + $query2 = "truncate table activitytemplog"; + $query3 = "truncate table couponApplied"; + + $connection->query($query1); + $connection->query($query2); + $connection->query($query3); +} + +function moveTempData() { + $connection = Database::tDataConnect(); + + $connection->query("update localtemptrans set trans_type = 'T' where trans_subtype IN ('CP','IC')"); + $connection->query("update localtemptrans set upc = 'DISCOUNT', description = upc, department = 0, trans_type='S' where trans_status = 'S'"); + + $connection->query("insert into localtrans select * from localtemptrans"); + $connection->query("insert into localtrans_today select * from localtemptrans"); + $connection->query("insert into dtransactions select * from localtemptrans"); + + $connection->query("insert into activitylog select * from activitytemplog"); + $connection->query("insert into alog select * from activitytemplog"); +} +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-endorse.php b/pos/is4c-nf/ajax-callbacks/ajax-endorse.php new file mode 100644 index 000000000..3408e11a1 --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-endorse.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$endorseType = isset($_REQUEST['type']) ? $_REQUEST['type'] : ''; +$amount = isset($_REQUEST['amount']) ? $_REQUEST['amount'] : ''; + +if (strlen($endorseType) > 0) { + + // close session so if printer hangs + // this script won't lock the session file + if (session_id() != '') + session_write_close(); + + switch ($endorseType) { + + case "check": + ReceiptLib::frank($amount); + break; + + case "giftcert": + ReceiptLib::frankgiftcert($amount); + break; + + case "stock": + ReceiptLib::frankstock($amount); + break; + + case "classreg": + ReceiptLib::frankclassreg(); + break; + + default: + break; + } +} +echo "Done"; +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-footer.php b/pos/is4c-nf/ajax-callbacks/ajax-footer.php new file mode 100644 index 000000000..21e4f81cc --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-footer.php @@ -0,0 +1,29 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +echo DisplayLib::printfooter(); + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-parser.php b/pos/is4c-nf/ajax-callbacks/ajax-parser.php new file mode 100644 index 000000000..1ab4709fd --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-parser.php @@ -0,0 +1,154 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$sd = MiscLib::scaleObject(); +$st = MiscLib::sigTermObject(); + +/* + * MAIN PARSING BEGINS + */ +$entered = ""; +if (isset($_REQUEST["input"])) { + $entered = strtoupper(trim($_REQUEST["input"])); +} + +if (substr($entered, -2) == "CL") $entered = "CL"; + +if ($entered == "RI") $entered = $CORE_LOCAL->get("strEntered"); + +if ($CORE_LOCAL->get("msgrepeat") == 1 && $entered != "CL") { + $entered = $CORE_LOCAL->get("strRemembered"); +} +$CORE_LOCAL->set("strEntered",$entered); + +$json = ""; + +if ($entered != ""){ + /* this breaks the model a bit, but I'm putting + * putting the CC parser first manually to minimize + * code that potentially handles the PAN */ + if (in_array("Paycards",$CORE_LOCAL->get("PluginList"))){ + /* this breaks the model a bit, but I'm putting + * putting the CC parser first manually to minimize + * code that potentially handles the PAN */ + if($CORE_LOCAL->get("PaycardsCashierFacing")=="1" && substr($entered,0,9) == "PANCACHE:"){ + /* cashier-facing device behavior; run card immediately */ + $entered = substr($entered,9); + $CORE_LOCAL->set("CachePanEncBlock",$entered); + } + + $pe = new paycardEntered(); + if ($pe->check($entered)){ + $valid = $pe->parse($entered); + $entered = "PAYCARD"; + $CORE_LOCAL->set("strEntered",""); + $json = $valid; + } + } + + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("multiple",0); + + /* FIRST PARSE CHAIN: + * Objects belong in the first parse chain if they + * modify the entered string, but do not process it + * This chain should be used for checking prefixes/suffixes + * to set up appropriate $CORE_LOCAL variables. + */ + $parser_lib_path = MiscLib::base_url()."parser-class-lib/"; + if (!is_array($CORE_LOCAL->get("preparse_chain"))) + $CORE_LOCAL->set("preparse_chain",PreParser::get_preparse_chain()); + + foreach ($CORE_LOCAL->get("preparse_chain") as $cn){ + if (!class_exists($cn)) continue; + $p = new $cn(); + if ($p->check($entered)) + $entered = $p->parse($entered); + if (!$entered || $entered == "") + break; + } + + if ($entered != "" && $entered != "PAYCARD"){ + /* + * SECOND PARSE CHAIN + * these parser objects should process any input + * completely. The return value of parse() determines + * whether to call lastpage() [list the items on screen] + */ + if (!is_array($CORE_LOCAL->get("parse_chain"))) + $CORE_LOCAL->set("parse_chain",Parser::get_parse_chain()); + + $result = False; + foreach ($CORE_LOCAL->get("parse_chain") as $cn){ + if (!class_exists($cn)) continue; + $p = new $cn(); + if ($p->check($entered)){ + $result = $p->parse($entered); + break; + } + } + if ($result && is_array($result)){ + $json = $result; + if (isset($result['udpmsg']) && $result['udpmsg'] !== False){ + if (is_object($sd)) + $sd->WriteToScale($result['udpmsg']); + if (is_object($st)) + $st->WriteToScale($result['udpmsg']); + } + } + else { + $arr = array( + 'main_frame'=>false, + 'target'=>'.baseHeight', + 'output'=>DisplayLib::inputUnknown()); + $json = $arr; + if (is_object($sd)) + $sd->WriteToScale('errorBeep'); + } + } +} + +$CORE_LOCAL->set("msgrepeat",0); + +if (empty($json)) echo "{}"; +else { + if (isset($json['redraw_footer']) && $json['redraw_footer'] !== False){ + $json['redraw_footer'] = DisplayLib::printfooter(); + } + if (isset($json['scale']) && $json['scale'] !== False){ + $display = DisplayLib::scaledisplaymsg($json['scale']); + if (is_array($display)) + $json['scale'] = $display['display']; + else + $json['scale'] = $display; + $term_display = DisplayLib::termdisplaymsg(); + if (!empty($term_display)) + $json['term'] = $term_display; + } + echo JsonLib::array_to_json($json); +} + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-paycard-auth.php b/pos/is4c-nf/ajax-callbacks/ajax-paycard-auth.php new file mode 100644 index 000000000..cef369fc9 --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-paycard-auth.php @@ -0,0 +1,59 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +// send the request +$result = 0; // 0 is never returned, so we use it to make sure it changes +$myObj = 0; +$json = array(); +$json['main_frame'] = MiscLib::base_url().'gui-modules/paycardSuccess.php'; +$json['receipt'] = false; +foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + $myObj = new $rpc(); + if ($myObj->handlesType($CORE_LOCAL->get("paycard_type"))){ + break; + } +} + +$st = MiscLib::sigTermObject(); + +$result = $myObj->doSend($CORE_LOCAL->get("paycard_mode")); +if ($result == PaycardLib::PAYCARD_ERR_OK){ + PaycardLib::paycard_wipe_pan(); + $json = $myObj->cleanup($json); + $CORE_LOCAL->set("strRemembered",""); + $CORE_LOCAL->set("msgrepeat",0); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); +} +else { + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("msgrepeat",0); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); +} + +echo JsonLib::array_to_json($json); diff --git a/pos/is4c-nf/ajax-callbacks/ajax-poll-scale.php b/pos/is4c-nf/ajax-callbacks/ajax-poll-scale.php new file mode 100644 index 000000000..ad7d0126a --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-poll-scale.php @@ -0,0 +1,37 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$scaleDriver = $CORE_LOCAL->get("scaleDriver"); +$sd = 0; +if ($scaleDriver != "") + $sd = new $scaleDriver(); + +if (is_object($sd)) + $sd->ReadFromScale(); +else + echo "{}"; // no driver => empty json + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-poll-term.php b/pos/is4c-nf/ajax-callbacks/ajax-poll-term.php new file mode 100644 index 000000000..29b2b4f7e --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-poll-term.php @@ -0,0 +1,36 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$termDriver = $CORE_LOCAL->get("SigCapture"); +$td = 0; +if ($termDriver != "") + $td = new $termDriver(); + +if (is_object($td)){ + $res = $td->poll("poke"); +} + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-scale.php b/pos/is4c-nf/ajax-callbacks/ajax-scale.php new file mode 100644 index 000000000..912d6187f --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-scale.php @@ -0,0 +1,35 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$input = isset($_REQUEST['input'])?$_REQUEST['input']:''; +$display = DisplayLib::scaledisplaymsg($input); + +if (is_array($display)) + echo $display['display']; +else + echo $display; + +?> diff --git a/pos/is4c-nf/ajax-callbacks/ajax-transaction-sync.php b/pos/is4c-nf/ajax-callbacks/ajax-transaction-sync.php new file mode 100644 index 000000000..1bc936025 --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ajax-transaction-sync.php @@ -0,0 +1,32 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); + +/* +if ($CORE_LOCAL->get("testremote")==0) + Database::testremote(); +*/ + +echo 'Done'; diff --git a/pos/is4c-nf/ajax-callbacks/ddd.php b/pos/is4c-nf/ajax-callbacks/ddd.php new file mode 100644 index 000000000..7bedb9fe2 --- /dev/null +++ b/pos/is4c-nf/ajax-callbacks/ddd.php @@ -0,0 +1,51 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +/* + * DDD is WFC lingo for unsaleable goods (dropped, dented, damaged, etc) + * Functionally this works like canceling a transaction, but marks + * items with a different trans_status (Z) so these items can + * be pulled out in later reports + */ + +$db = Database::tDataConnect(); +$query = "UPDATE localtemptrans SET trans_status='Z'"; +$db->query($query); +$query = "INSERT INTO dtransactions SELECT * from localtemptrans"; +$db->query($query); +$query = "INSERT INTO localtrans SELECT * from localtemptrans"; +$db->query($query); + +$CORE_LOCAL->set("plainmsg","items marked ddd"); +$CORE_LOCAL->set("End",2); + +$_REQUEST['receiptType'] = 'ddd'; +ob_start(); +include(realpath(dirname(__FILE__).'/ajax-end.php')); +header("Location: ".MiscLib::base_url()."gui-modules/pos2.php"); +ob_end_clean(); + +?> diff --git a/pos/is4c-nf/ajax-callbacks/fakereceipt.txt b/pos/is4c-nf/ajax-callbacks/fakereceipt.txt new file mode 100644 index 000000000..515dd51d3 Binary files /dev/null and b/pos/is4c-nf/ajax-callbacks/fakereceipt.txt differ diff --git a/pos/is4c-nf/bye.html b/pos/is4c-nf/bye.html new file mode 100644 index 000000000..b305407ff --- /dev/null +++ b/pos/is4c-nf/bye.html @@ -0,0 +1,4 @@ +<HTML> +<BODY> +</BODY> +</HTML> diff --git a/pos/is4c-nf/css/install.css b/pos/is4c-nf/css/install.css new file mode 100644 index 000000000..1377f882a --- /dev/null +++ b/pos/is4c-nf/css/install.css @@ -0,0 +1,157 @@ +body { font-family: Arial; } +p { font-size: 14px; margin-left: 10px; } + +.tabwrap { + width:88%; + margin-left:auto; + margin-right:auto; +} +/*.ui-tabs-panel { + height: 800px; + overflow:auto; +}*/ + +.alert { + background: whiteSmoke; + border: #ececec solid 3px; + border-radius: 8px; + padding: 4px 12px; + margin-bottom: 4px; +} + +.success { + color: green; + font-weight: bold; +} +.fail { + color: red; + font-weight: bold; +} +#install td { vertical-align:top; } + +h2 { padding-top:8px; } + +#wrapper { + margin-left:auto; + margin-right:auto; + width: 82%; +} + +.tblSection { + border:2px solid #666; + border-radius:28px; + margin:12px; +} + +.tblSection h3 { + background: #eee; + font-size: 1.5em +} + +.tblHeader { + border-top: #eee 2px solid; + padding: 8px 0 16px 0; +} + +.submitBtn { + padding-top: 30px; + text-align:center; +} +.submitBtn input { + font-size:1.4em; +} + +input[type="text"] { + /*font-size:1.3em;*/ + /*float:left;*/ +} +.noteTxt { + color:#666; + display: block; + font-size:14px; + line-height: 1.1em; + position: relative; + top:-33px; + float:right; + width:auto; + background: whiteSmoke; + padding: 10px; + max-width: 66%; +} + +.spacer { + display: block; + float: left; +} + +.pre { + font-weight:bolder; + font-family:monaco, monospace; +} +/********************************* + * INSTALLER MENU TAB STYLES + *********************************/ +.invertedshiftdown{ +padding: 0; +width: 100%; +border-top: 5px solid #D10000; /*Red color theme*/ +background: transparent; +voice-family: "\"}\""; +voice-family: inherit; +} + +.invertedshiftdown ul{ +margin:0; +margin-left: 40px; /*margin between first menu item and left browser edge*/ +padding: 0; +list-style: none; +} + +.invertedshiftdown li{ +display: inline; +margin: 0 2px 0 0; +padding: 0; +text-transform:uppercase; +} + +.invertedshiftdown a{ +float: left; +display: block; +font: bold 15px Arial; +color: black; +text-decoration: none; +margin: 0 1px 0 0; /*Margin between each menu item*/ +padding: 5px 10px 9px 10px; /*Padding within each menu item*/ +background-color: white; /*Default menu color*/ + +/*BELOW 4 LINES add rounded bottom corners to each menu item. + ONLY WORKS IN FIREFOX AND FUTURE CSS3 CAPABLE BROWSERS + REMOVE IF DESIRED*/ +-moz-border-radius-bottomleft: 5px; +border-bottom-left-radius: 5px; +-moz-border-radius-bottomright: 5px; +border-bottom-right-radius: 5px; +} + +.invertedshiftdown a:hover{ +background-color: #D10000; /*Red color theme*/ +padding-top: 9px; /*Flip default padding-top value with padding-bottom */ +padding-bottom: 5px; /*Flip default padding-bottom value with padding-top*/ +color: white; +} + +.invertedshiftdown .current a{ /** currently selected menu item **/ +background-color: #D10000; /*Red color theme*/ +padding-top: 9px; /*Flip default padding-top value with padding-bottom */ +padding-bottom: 5px; /*Flip default padding-bottom value with padding-top*/ +color: white; +} + +.db_hints { + margin-left: 25px; + width: 350px; +} + +/*************************** + * Switch stuff + ***************************/ diff --git a/pos/is4c-nf/css/pos.css b/pos/is4c-nf/css/pos.css new file mode 100644 index 000000000..833b3e90a --- /dev/null +++ b/pos/is4c-nf/css/pos.css @@ -0,0 +1,152 @@ +html { overflow: hidden; } +body { font-family: arial; margin-top: 20px; } +.mainBGimage { + background-image: url('../graphics/is4c.gif'); + background-repeat: no-repeat; +} +div#boundingBox { width: 675px; } +/********************************************* +* COLORS +*********************************************/ +.coloredArea { background: #004080; color: #ffffff; } +.colored { background: #004080; color: #ffffff; } /* compat */ +.errorColoredArea { background: #800000; color: #ffffff; } +.errorColored { background: #800000; color: #ffffff; } /* compat */ +.lightestColorText { color: #808080; } +.coloredText { color: #004080; } +.errorColoredText { color: #800000; } +.lightColorText { color: #408080; } +.lightColorArea { color: #ffffff; background: #408080; } +.totalLine { color: #000000; } +.totalArea { background: #000000; color: #ffffff; } +.fsLine { color: #800080; } +.fsArea { background: #800080; color: #ffffff; } +/********************************************* + * main display +*********************************************/ +div.baseHeight { height: 325px; width: 100%; text-align: center; } +div.training { background-color: #aa0000; } +div.centerOffset { padding-top: 80px; } +div.centeredDisplay { margin-left: auto; margin-right: auto; width: 40%; + padding: 30px 0 10px 0; text-align: center; + top: 70px; position: relative; } +span.larger { font-weight: bold; } +span.smaller { font-size: 80%; } +div.clear { clear: both; width: 100%; } +div#headerb { width: 100%; } +div#headerb .left { float: left; text-align: left; width: 48%; } +div#headerb .right { float: left; text-align: right; width: 48%; } +div#headerb .clear { clear: left; width: 100%; border-top: solid 1px #000000; + margin-bottom: 5px;} +div#headerb .bigger { font-size: 90%; font-weight: bold; } +div#headerb .smaller { font-size: 75%; } +div#plainmsg { text-align: center; font-weight: bold; + margin-left: auto; margin-right: auto; + font-size: 120%; line-height: 1.7em; } +div#footer { width: 100%; } +div#footer table { width: 100%;} +div#footer tr.heading td {border-bottom: solid 1px #000000; font-size: 80%; + font-weight: bold; height: 30px; vertical-align: bottom;} +div#footer tr.heading .first { text-align: center; } +div#footer tr.heading .reg { width: 21%; text-align: center; } +div#footer tr.heading .total { text-align: right; width: 18%; } +div#footer tr.values td { height: 50px; vertical-align: middle; text-align: center;} +div#footer tr.values .first { font-weight: bold; font-size: 150%; } +div#footer tr.values .reg { font-weight: bold; font-size: 110%; } +div#footer tr.values .total { font-weight: bold; font-size: 150%; } +div.item { width: 100%; font-size: 120%; text-align: left; } +div.item div { float: left; } +div.item .desc { width: 58%; } +div.item .comments { width: 20%; text-align: right; } +div.item .total { width: 14%; text-align: right; padding-right: 5px; } +div.item .suffix { width: 4%; text-align: right; } +div#boxMsg { border: solid 1px black; padding: 0; background: #ffffff; min-height: 150px;} +div#boxMsg .boxMsgAlert { font-weight: bold; font-size: 120%; + border-bottom: solid 1px #000000; + text-align: left; padding: 3px; } +div#boxMsg .boxMsgBody { padding: 10px 0 0px 0; text-align: left;} +div#boxMsg .boxMsgBody .msgicon { width: 16%; float: left;} +div#boxMsg .boxMsgBody .msgtext { text-align: left; padding-left: 15px; + float: left; width: 75%; } +div .listbox {float: left; padding: 10px 10px 0 0; } +div .listboxText {float: left; font-weight: bold; } +div .farewellMsg {text-align: center; font-weight: bold; + font-size: 120%; line-height: 1.4em;} +/********************************************* + * Initial login page +*********************************************/ +div#loginTopBar { width: 100%; margin:0; } +div#loginTopBar .name { width: 16%; font-weight: bold; background: #ffcc00; height: 30px; + font-size: 90%; text-align:center; float: left; padding-top: 10px; + border-bottom: solid 1px #000000; vertical-align: middle;} +div#loginTopBar .version { width: 80%; float: left; border-bottom: solid 1px #000000; + height: 20px; text-align: right; font-size: 70%; padding-top: 20px;} +div#loginTopBar .welcome { clear: left; text-align: center; + width: 16%; font-size: 90%; font-weight: bold; padding-bottom: 2px;} +div#loginCenter { width: 100%; padding-top: 80px; text-align: center; } +div#loginCenter .box { width: 40%; padding: 30px 0px 10px 0px; + font-size: 105%; margin-left: auto; margin-right: auto;} +div#loginExit { width: 90%; text-align:right; padding-top: 90px; font-size: 70%;} +/********************************************* + * Input frame +*********************************************/ +div#inputArea { width: 100%; } +div#inputAreaEnd { clear: left; height: 1px;} +div#inputArea .inputform { float: left; width: 25%;} +div#inputArea .notices {float: left; width: 70%; text-align: right; font-size: 80%;} +div#inputArea .notices .time {font-size: 115%; font-weight: bold; padding-left: 10px; color: #000000;} +/********************************************* + * Scale display +*********************************************/ +div#scalebox { position: absolute; left: 676px; top: 22px; } +div#scaleClear { clear: right; height: 1px; } +div#scaleTop { width: 118px; font-size: 80%; font-weight: bold; height: 18px; + text-align: center; } +div#scaleBottom { width: 118px; color: #000000; background: #eeeeee; font-weight: bold; + font-size: 120%; height: 44px; text-align: center; padding-top: 5px;} +/********************************************* + * Quick Keys +*********************************************/ +div.qkRow { width: 100%; clear: left; text-align: center; } +div.qkBox { width: 23%; float: left; padding: 10px; text-align: center; } +div.qkBox div { width: 75px; padding: 5px 0 5px 0; margin-left:auto; margin-right:auto;} +input.quick_button { width: 65px; height: 55px; + border: outset 3px #004080; color: #004080; + background-color: #ffffff; } +div.qkArrowBox { width: 20px; float: left; padding-top: 25px;} +input.qkArrow { width: 50px; height: 30px; border: outset 3px #004080; + color: #004080; background-color: #ffffff; } + +/********************************************* + * Number Box +*********************************************/ +table#numpad { + position: absolute; + left: 25px; + top: 50px; + font-size: 25pt; +} +table#numpad td { + border: outset 2px #004080; + background-color: #ffffff; + color: #004080; + width: 45px; + text-align: center; +} +/********************************************* + * Keyboard Box +*********************************************/ +table#letterpad { + position: absolute; + left: 55px; + top: 210px; + font-size: 25pt; +} +table#letterpad td { + border: solid 1px #004080; + background-color: #ffffff; + color: #004080; + width: 45px; + text-align: center; +} + diff --git a/pos/is4c-nf/css/toggle-switch.css b/pos/is4c-nf/css/toggle-switch.css new file mode 100755 index 000000000..891b0add2 --- /dev/null +++ b/pos/is4c-nf/css/toggle-switch.css @@ -0,0 +1,283 @@ +/* ------------------------------------------ +CSS TOGGLE SWITCHES (IonuÈ› Colceriu) +Licensed under Unlicense +https://github.com/ghinda/css-toggle-switch +------------------------------------------ */ + +/* Toggle Switches */ +@media only screen { + + /* Checkbox + */ + .toggle { + position: relative; + left:-43%; + display: block; + width: 58%; + + padding: 0; + margin: 0; + + font-family: sans-serif; + font-weight: bold; +/* font-size: 12px;*/ +/* color: #fff;*/ + +/* text-shadow: 1px 1px 1px #191b1e;*/ + } + + /* Position the label over all the elements, except the toggle-button + * Clicking anywhere on the label will change the switch-state + */ + .toggle label { + position: relative; + z-index: 3; + + display: block; + width: 100%; + padding: 3px 0; + cursor: pointer; + } + + /* Don't hide the input from screen-readers and keyboard access + */ + .toggle input { + position: absolute; + opacity: 0; + z-index: 5; + } + + /* Outline the toggle when the input is focused */ + .toggle input:focus ~ .toggle-button { + outline: 1px dotted #fff; + } + + /* Track */ + .toggle label:after { + content: ''; + position: absolute; + top: 0; + right: 0; + z-index: 0; + display: block; + width: 80px; + height: 18px; + padding: 2px 0; + + background-color: #dd7e6d; + border: 1px solid #b15b4d; + border-radius: 2px; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.17), 0 1px 0px rgba(255, 255, 255, 0.9); + + /* Text labels */ + content: "off \a on"; + white-space: pre; + + color: #8f5247; + font-weight: bold; + text-align: center; + text-shadow: 0 1px 0px rgba(255, 255, 255, 0.4); + + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; + -webkit-column-gap: 0; + -moz-column-gap: 0; + column-gap: 0; + } + + /* We could use label:after to create the toggle button + * But we won't be able to use transitions on it, except in Firefox + */ + .toggle span { + display: block; + position: absolute; + right: -1px; + top: -2px; + z-index: 4; + width: 40px; + height: 26px; + + border: 1px solid #bbbbbb; + + background-color: #f7f7f7; + background-image: -webkit-linear-gradient(top, #f7f7f7, #ececec); + background-image: -moz-linear-gradient(top, #f7f7f7, #ececec); + background-image: -ms-linear-gradient(top, #f7f7f7, #ececec); + background-image: -o-linear-gradient(top, #f7f7f7, #ececec); + background-image: linear-gradient(top, #f7f7f7, #ececec); + + box-shadow: inset 0 1px 2px rgba(255, 255, 255, 1), 0 1px 1px rgba(0, 0, 0, 0.12); + border-radius: 2px; + + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; + } + + .toggle input:checked ~ span { + right: 45px; + } + + .toggle input:checked + label:after { + background-color: #a0c66b; + border-color: #87aa5b; + + color: #60783f; + } + + /* Radio Switch + */ + .switch { + position: relative; + left:-43%; + border: 0; + padding: 0; + width: 58%; + + font-family: sans-serif; + font-weight: bold; +/* font-size: 12px;*/ +/* color: #fff;*/ + +/* text-shadow: 1px 1px 1px #191b1e;*/ + + } + + .switch legend { + float: left; + width: 40%; + padding: 7px 10% 3px 0; + + text-align: right; + } + + .switch input { + position: absolute; + opacity: 0; + } + + .switch legend:after { + content: ''; + + position: absolute; + top: 0; + left: 50%; + z-index: 0; + + width: 50%; + height: 100%; + + padding: 2px; + background-color: #2d3035; + + border-radius: 3px; + + box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.3), 0 1px 0px rgba(255, 255, 255, 0.2); + } + + .switch label { + position: relative; + z-index: 2; + + float: left; + width: 25%; + margin-top: 2px; + + padding: 5px 0 3px 0; + text-align: center; + + color: #64676b; + text-shadow: 0 1px 0 #000; + } + + + .switch input:checked + label { + color: #2d592a; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + } + + .switch input:focus + label { + outline: 1px dotted #fff; + } + + .switch .switch-button { + clear: both; + position: absolute; + top: 0; + left: 50%; + z-index: 1; + + width: 25%; + height: 100%; + + margin: 2px; + + background-color: #70c66b; + + background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: -ms-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + background-image: linear-gradient(top, rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0)); + + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), inset 0 1px 1px rgba(255, 255, 255, 0.45); + + border-radius: 3px; + + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; + } + .switch input:last-of-type:checked ~ .switch-button { + left: 75%; + } + + /* Treo Switch */ + .switch.switch-treo label { + width: 16.6%; + } + .switch.switch-treo .switch-button { + width: 16.6%; + } + .switch.switch-treo input:checked:nth-of-type(2) ~ .switch-button { + left: 66.6%; + } + .switch.switch-treo input:checked:last-of-type ~ .switch-button { + left: 83.26%; + } + /* Switch Themes/Colors */ + .switch.blue input:checked + label { + color: #15475d; + } + .switch.blue .switch-button { + background-color: #38a3d4; + } + .switch.yellow .switch-button { + background-color: #ccc165; + } + .switch.yellow input:checked + label { + color: #494525; + } + /* Bugfix for older Webkit, including mobile Webkit. Adapted from: + * http://css-tricks.com/webkit-sibling-bug/ + */ + .switch, .toggle { + -webkit-animation: bugfix infinite 1s; + } + + @-webkit-keyframes bugfix { from { position: relative; } to { position: relative; } } + +} + +/* Default form styles */ +fieldset { + margin: 0 0 2em 0; + border: 0; +} + +fieldset legend { +/* color: #fff;*/ +} diff --git a/pos/is4c-nf/customer-base.php b/pos/is4c-nf/customer-base.php new file mode 100644 index 000000000..4993d1191 --- /dev/null +++ b/pos/is4c-nf/customer-base.php @@ -0,0 +1,46 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> +<html> +<head> +<script type="text/javascript"> +if (opener.name != "main_frame"){ + self.blur(); +} +</script> +</head> +<FRAMESET cols='675,118,*' frameborder='0'> + <frameset rows="40,440,*" frameborder=0 scrolling=no> + <FRAME src='/gui-modules/blank.html' name='cust_input' border='0' scrolling='no'> + <FRAME src='/gui-modules/posCustDisplay.php' name='cust_main_frame' border='0' scrolling='no'> + </FRAMESET> + <!-- + <frameset rows="345,50,50,*" frameborder=0 scrolling=no> + <frame src="scale.php" name="scale" border=0 scrolling=no> + <frame src="endorse.php" name="endorse" border=0 scrolling=no> + <frame src="end.php" name="end" border=0 scrolling=no> + </frameset> + --> +</FRAMESET> +</html> diff --git a/pos/is4c-nf/favicon.ico b/pos/is4c-nf/favicon.ico new file mode 100644 index 000000000..4f2ba4fcb Binary files /dev/null and b/pos/is4c-nf/favicon.ico differ diff --git a/pos/is4c-nf/graphics/BLUEDOT.GIF b/pos/is4c-nf/graphics/BLUEDOT.GIF new file mode 100644 index 000000000..225b4a764 Binary files /dev/null and b/pos/is4c-nf/graphics/BLUEDOT.GIF differ diff --git a/pos/is4c-nf/graphics/GREENDOT.GIF b/pos/is4c-nf/graphics/GREENDOT.GIF new file mode 100644 index 000000000..7982829ab Binary files /dev/null and b/pos/is4c-nf/graphics/GREENDOT.GIF differ diff --git a/pos/is4c-nf/graphics/REDDOT.GIF b/pos/is4c-nf/graphics/REDDOT.GIF new file mode 100644 index 000000000..507f175f7 Binary files /dev/null and b/pos/is4c-nf/graphics/REDDOT.GIF differ diff --git a/pos/is4c-nf/graphics/WFC_Logo.bmp b/pos/is4c-nf/graphics/WFC_Logo.bmp new file mode 100644 index 000000000..5abfe365a Binary files /dev/null and b/pos/is4c-nf/graphics/WFC_Logo.bmp differ diff --git a/pos/is4c-nf/graphics/WFC_Logo_2.bmp b/pos/is4c-nf/graphics/WFC_Logo_2.bmp new file mode 100644 index 000000000..115b507ee Binary files /dev/null and b/pos/is4c-nf/graphics/WFC_Logo_2.bmp differ diff --git a/pos/is4c-nf/graphics/bluekey4.gif b/pos/is4c-nf/graphics/bluekey4.gif new file mode 100644 index 000000000..cb9000cb4 Binary files /dev/null and b/pos/is4c-nf/graphics/bluekey4.gif differ diff --git a/pos/is4c-nf/graphics/ccFail.gif b/pos/is4c-nf/graphics/ccFail.gif new file mode 100644 index 000000000..8995838a6 Binary files /dev/null and b/pos/is4c-nf/graphics/ccFail.gif differ diff --git a/pos/is4c-nf/graphics/ccIn.gif b/pos/is4c-nf/graphics/ccIn.gif new file mode 100644 index 000000000..46da6b0cd Binary files /dev/null and b/pos/is4c-nf/graphics/ccIn.gif differ diff --git a/pos/is4c-nf/graphics/ccInLit.gif b/pos/is4c-nf/graphics/ccInLit.gif new file mode 100755 index 000000000..c631a6525 Binary files /dev/null and b/pos/is4c-nf/graphics/ccInLit.gif differ diff --git a/pos/is4c-nf/graphics/ccTest.gif b/pos/is4c-nf/graphics/ccTest.gif new file mode 100644 index 000000000..dcbe15096 Binary files /dev/null and b/pos/is4c-nf/graphics/ccTest.gif differ diff --git a/pos/is4c-nf/graphics/ccTestLit.gif b/pos/is4c-nf/graphics/ccTestLit.gif new file mode 100755 index 000000000..ac5b87da7 Binary files /dev/null and b/pos/is4c-nf/graphics/ccTestLit.gif differ diff --git a/pos/is4c-nf/graphics/crossD.gif b/pos/is4c-nf/graphics/crossD.gif new file mode 100644 index 000000000..efe7fec5f Binary files /dev/null and b/pos/is4c-nf/graphics/crossD.gif differ diff --git a/pos/is4c-nf/graphics/exclaimC.gif b/pos/is4c-nf/graphics/exclaimC.gif new file mode 100644 index 000000000..82a8e138f Binary files /dev/null and b/pos/is4c-nf/graphics/exclaimC.gif differ diff --git a/pos/is4c-nf/graphics/harvest_rcpt_hdr2.bmp b/pos/is4c-nf/graphics/harvest_rcpt_hdr2.bmp new file mode 100644 index 000000000..03c0b936e Binary files /dev/null and b/pos/is4c-nf/graphics/harvest_rcpt_hdr2.bmp differ diff --git a/pos/is4c-nf/graphics/hrvst_is4c.gif b/pos/is4c-nf/graphics/hrvst_is4c.gif new file mode 100644 index 000000000..688c28b9b Binary files /dev/null and b/pos/is4c-nf/graphics/hrvst_is4c.gif differ diff --git a/pos/is4c-nf/graphics/is4c.gif b/pos/is4c-nf/graphics/is4c.gif new file mode 100644 index 000000000..540fb2022 Binary files /dev/null and b/pos/is4c-nf/graphics/is4c.gif differ diff --git a/pos/is4c-nf/graphics/is4c_login2.gif b/pos/is4c-nf/graphics/is4c_login2.gif new file mode 100644 index 000000000..e5b267ce6 Binary files /dev/null and b/pos/is4c-nf/graphics/is4c_login2.gif differ diff --git a/pos/is4c-nf/graphics/key-icon.png b/pos/is4c-nf/graphics/key-icon.png new file mode 100644 index 000000000..1454c1dc4 Binary files /dev/null and b/pos/is4c-nf/graphics/key-icon.png differ diff --git a/pos/is4c-nf/graphics/noreceipt.gif b/pos/is4c-nf/graphics/noreceipt.gif new file mode 100644 index 000000000..0f34e95ef Binary files /dev/null and b/pos/is4c-nf/graphics/noreceipt.gif differ diff --git a/pos/is4c-nf/graphics/rcpt_hdr.bmp b/pos/is4c-nf/graphics/rcpt_hdr.bmp new file mode 100644 index 000000000..a10a94c2d Binary files /dev/null and b/pos/is4c-nf/graphics/rcpt_hdr.bmp differ diff --git a/pos/is4c-nf/graphics/receipt.gif b/pos/is4c-nf/graphics/receipt.gif new file mode 100644 index 000000000..dd73f2ec0 Binary files /dev/null and b/pos/is4c-nf/graphics/receipt.gif differ diff --git a/pos/is4c-nf/graphics/redkey4.gif b/pos/is4c-nf/graphics/redkey4.gif new file mode 100644 index 000000000..617fc0d5e Binary files /dev/null and b/pos/is4c-nf/graphics/redkey4.gif differ diff --git a/pos/is4c-nf/graphics/switchblue2.gif b/pos/is4c-nf/graphics/switchblue2.gif new file mode 100644 index 000000000..c96891a49 Binary files /dev/null and b/pos/is4c-nf/graphics/switchblue2.gif differ diff --git a/pos/is4c-nf/graphics/switchred2.gif b/pos/is4c-nf/graphics/switchred2.gif new file mode 100644 index 000000000..38b242fc4 Binary files /dev/null and b/pos/is4c-nf/graphics/switchred2.gif differ diff --git a/pos/is4c-nf/gui-class-lib/BasicPage.php b/pos/is4c-nf/gui-class-lib/BasicPage.php new file mode 100644 index 000000000..b708d289c --- /dev/null +++ b/pos/is4c-nf/gui-class-lib/BasicPage.php @@ -0,0 +1,466 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + + @class BasicPage + + This is the base class for all display scripts + + Display scripts are not required to use this + base class but it does provide a lot of common + functionality for building HTML pages with standard + headers, footers, and styling. + + */ + +class BasicPage { + + var $onload_commands; + /** + Relative URL for POS root directory + Pages often need this. + */ + var $page_url; + + var $body_class='mainBGimage'; + + /** + Constructor + + The constructor automatically runs + the preprocess and print_page methods + (if applicable). Creating a new instance + will output the entire page contents + */ + function BasicPage(){ + $this->onload_commands = ""; + $this->page_url = MiscLib::base_url(); + if ($this->preprocess()){ + ob_start(); + $this->print_page(); + ob_end_flush(); + } + } + + /** + Add output in the <head> section + @return None + + This function should print anything that + belongs inside the HTML head tags + */ + function head_content(){ + + } + + /** + Add output in the <body> section + @return None + + This function should print anything that + belongs inside the HTML body tags + */ + function body_content(){ + + } + + /** + Decide whether to display output + @return True or False + + This is the first function called. It is typically + used to check $_GET or $_POST variables. If the + function returns True, the rest of the page will be + printed. If the function returns False, there is no + output. Usually this function returns False after + setting a redirect header to change to another page. + */ + function preprocess(){ + return True; + } + + /** + Print HTML output + @return None + + Print the page. This version includes the scale + weight display as well as the head and body + content from those methods. Javascript commands + that have been requested via add_onload_command + are all run on page load. + */ + function print_page(){ + $my_url = $this->page_url; + ?> + <!DOCTYPE html> + <html> + <?php + echo "<head>"; + echo "<title>COREPOS</title>"; + // 18Aug12 EL Add content/charset. + echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}/css/pos.css\">"; + // include store css file if it exists + if (file_exists(dirname(__FILE__).'/../store.css')){ + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}/store.css\">"; + } + echo "<script type=\"text/javascript\" + src=\"{$my_url}/js/jquery.js\"></script>"; + $this->head_content(); + echo "</head>"; + echo '<body class="'.$this->body_class.'">'; + echo "<div id=\"boundingBox\">"; + $this->body_content(); + echo "</div>"; + $this->scale_box(); + $this->scanner_scale_polling(); + // body_content populates onload_commands + if (!empty($this->onload_commands)){ + echo "\n<script type=\"text/javascript\">\n"; + echo "\$(document).ready(function(){\n"; + echo $this->onload_commands; + echo "});\n"; + echo "</script>\n"; + } + // 18Aug12 EL Moved after ready-script. + echo "</body>\n"; + echo "</html>"; + } + + /** + Add a javascript command to the queue + @param $str A javascript command + @return None + + All queued commands are run once the page loads + Note: JQuery is present + */ + function add_onload_command($str){ + $this->onload_commands .= $str."\n"; + } + + protected $mask_input = False; + function hide_input($bool){ + $this->mask_input = $bool; + } + + /** + Display the standard header with input box + @param $action What the form does + @return None + + The default action is for a page to POST + back to itself. Any specified action will + be included in the form tag exactly as is. + You can pass "action=..." or "onsubmit=..." + (or both) but $action should have one or the + other attributes + */ + function input_header($action=""){ + global $CORE_LOCAL; + $my_url = $this->page_url; + if (empty($action)) + $action = "action=\"".$_SERVER['PHP_SELF']."\""; + + $this->add_onload_command("betterDate();\n\$('#reginput').focus();"); + + $inputType = "text"; + if ($this->mask_input) + $inputType = "password"; + // this needs to be configurable; just fixing + // a giant PHP warning for the moment + $time = strftime("%m/%d/%y %I:%M %p", time()); + + $CORE_LOCAL->set("repeatable",0); + ?> + <script type="text/javascript"> + function betterDate() { + var myNow = new Date(); + var ampm = 'AM'; + var hour = myNow.getHours(); + var minute = myNow.getMinutes(); + if (hour >= 12){ + ampm = 'PM'; + hour = hour - 12; + } + if (hour == 0) hour = 12; + + var year = myNow.getYear() % 100; + var month = myNow.getMonth()+1; + var day = myNow.getDate(); + if (year < 10) year = '0'+year; + if (month < 10) month = '0'+month; + if (day < 10) day ='0'+day; + if (minute < 10) minute = '0'+minute; + + var timeStr = month+'/'+day+'/'+year+' '; + timeStr += hour+':'+minute+' '+ampm; + $('#timeSpan').html(timeStr); + setTimeout(betterDate,20000); + } + </script> + <div id="inputArea"> + <div class="inputform <?php echo ($CORE_LOCAL->get("training")==1?'training':''); ?>"> + <form name="form" id="formlocal" method="post" autocomplete="off" + <?php echo $action; ?> > + <input name="reginput" value="" onblur="$('#reginput').focus();" + type="<?php echo $inputType; ?>" id="reginput" /> + </form> + </div> + <div class="notices coloredText <?php echo ($CORE_LOCAL->get("training")==1?'training':''); ?>"> + <?php + if ($CORE_LOCAL->get("training") == 1) { + echo "<span class=\"text\">"._("training")." </span>" + ."<img alt=\"training\" src='{$my_url}graphics/BLUEDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + elseif ($CORE_LOCAL->get("standalone") == 0) { + echo "<img alt=\"online\" src='{$my_url}graphics/GREENDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + else { + echo "<span class=\"text\">stand alone</span>" + ."<img alt=\"standalone\" src='{$my_url}graphics/REDDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + if ($CORE_LOCAL->get("receiptToggle")==1){ + echo "<img alt=\"receipt\" src='{$my_url}graphics/receipt.gif'>&nbsp;&nbsp;&nbsp;"; + } + else { + echo "<img alt=\"no receipt\" src='{$my_url}graphics/noreceipt.gif'>&nbsp;&nbsp;&nbsp;"; + } + if($CORE_LOCAL->get("CCintegrate") == 1 && + $CORE_LOCAL->get("ccLive") == 1 && $CORE_LOCAL->get("training") == 0){ + if ($CORE_LOCAL->get("CachePanEncBlock")=="") + echo "<img alt=\"cc mode\" src='{$my_url}graphics/ccIn.gif'>&nbsp;"; + else + echo "<img alt=\"cc available\" src='{$my_url}graphics/ccInLit.gif'>&nbsp;"; + }elseif($CORE_LOCAL->get("CCintegrate") == 1 && + ($CORE_LOCAL->get("training") == 1 || $CORE_LOCAL->get("ccLive") == 0)){ + if ($CORE_LOCAL->get("CachePanEncBlock")=="") + echo "<img alt=\"cc test mode\" src='{$my_url}graphics/ccTest.gif'>&nbsp;"; + else + echo "<img alt=\"cc available (test)\" src='{$my_url}graphics/ccTestLit.gif'>&nbsp;"; + } + + echo "<span id=\"timeSpan\" class=\"time\">".$time."</span>\n"; + if ($CORE_LOCAL->get("prefix") != ""){ + $this->add_onload_command("\$('#reginput').val('" + .$CORE_LOCAL->get("prefix")."');\n"); + $CORE_LOCAL->set("prefix",""); + } + ?> + + </div> + </div> + <div id="inputAreaEnd"></div> + <?php + } + + /** + Display the standard header without input box + @return None + */ + function noinput_header(){ + global $CORE_LOCAL; + $my_url = $this->page_url; + $this->add_onload_command("betterDate();\n"); + + $time = strftime("%m/%d/%y %I:%M %p", time()); + + $CORE_LOCAL->set("repeatable",0); + ?> + <script type="text/javascript"> + function betterDate() { + var myNow = new Date(); + var ampm = 'AM'; + var hour = myNow.getHours(); + var minute = myNow.getMinutes(); + if (hour >= 12){ + ampm = 'PM'; + hour = hour - 12; + } + if (hour == 0) hour = 12; + + var year = myNow.getYear() % 100; + var month = myNow.getMonth()+1; + var day = myNow.getDate(); + if (year < 10) year = '0'+year; + if (month < 10) month = '0'+month; + if (day < 10) day ='0'+day; + if (minute < 10) minute = '0'+minute; + + var timeStr = month+'/'+day+'/'+year+' '; + timeStr += hour+':'+minute+' '+ampm; + $('#timeSpan').html(timeStr); + setTimeout(betterDate,20000); + } + </script> + <div id="inputArea"> + <div class="inputform"> + &nbsp; + </div> + <div class="notices coloredText"> + <?php + if ($CORE_LOCAL->get("training") == 1) { + echo "<span class=\"text\">"._("training")." </span>" + ."<img alt=\"training\" src='{$my_url}graphics/BLUEDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + elseif ($CORE_LOCAL->get("standalone") == 0) { + echo "<img alt=\"online\" src='{$my_url}graphics/GREENDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + else { + echo "<span class=\"text\">stand alone</span>" + ."<img alt=\"standalone\" src='{$my_url}graphics/REDDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + if($CORE_LOCAL->get("CCintegrate") == 1 && + $CORE_LOCAL->get("ccLive") == 1 && $CORE_LOCAL->get("training") == 0){ + if ($CORE_LOCAL->get("CachePanEncBlock")=="") + echo "<img alt=\"cc mode\" src='{$my_url}graphics/ccIn.gif'>&nbsp;"; + else + echo "<img alt=\"cc available\" src='{$my_url}graphics/ccInLit.gif'>&nbsp;"; + }elseif($CORE_LOCAL->get("CCintegrate") == 1 && + ($CORE_LOCAL->get("training") == 1 || $CORE_LOCAL->get("ccLive") == 0)){ + if ($CORE_LOCAL->get("CachePanEncBlock")=="") + echo "<img alt=\"cc test mode\" src='{$my_url}graphics/ccTest.gif'>&nbsp;"; + else + echo "<img alt=\"cc available (test)\" src='{$my_url}graphics/ccTestLit.gif'>&nbsp;"; + } + + echo "<span id=\"timeSpan\" class=\"time\">".$time."</span>\n"; + ?> + + </div> + </div> + <div id="inputAreaEnd"></div> + <?php + } + + /** + Output the standard scale display box + @return None + */ + function scale_box(){ + ?> + <div id="scalebox"> + <div id="scaleTop" class="coloredArea"> + <?php echo _("weight"); ?> + </div> + <div id="scaleBottom"> + <?php echo DisplayLib::scaledisplaymsg(); ?> + </div> + <div id="scaleIconBox"> + <?php echo DisplayLib::termdisplaymsg(); ?> + </div> + </div> + <?php + } + + /** + Read input from scale + @return None + + Outputs the javascript used to poll for scale + input and activates it on page load. + */ + function scanner_scale_polling($include_scans=True){ + if (!$include_scans) return ''; + ?> + <script type="text/javascript" + src="<?php echo $this->page_url; ?>js/poll-scale.js"> + </script> + <?php + $this->add_onload_command("pollScale('".$this->page_url."');\n"); + } + + /** + Print the standard footer + @return None + */ + function footer(){ + echo '<div id="footer">'; + DisplayLib::printfooter(); + echo '</div>'; + } + + /** + Go to a different page + @param $url the new page URL + + Use this function instead of manual redirects + to allow debug output. + */ + function change_page($url){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("Debug_Redirects") == 1){ + $stack = debug_backtrace(); + printf('Follow redirect to <a href="%s">%s</a>',$url,$url); + echo '<hr />Stack:'; + foreach($stack as $s){ + echo '<ul><li>'; + if(!empty($s['class'])) echo $s['class'].'::'; + echo $s['function'].'()'; + echo '<li>Line '.$s['line'].', '.$s['file']; + } + foreach($stack as $s) echo '</ul>'; + } + else + header("Location: ".$url); + } + + function default_parsewrapper_js($input="reginput",$form="formlocal"){ + ?> + <script type="text/javascript"> + function parseWrapper(str){ + $('#<?php echo $input; ?>').val(str); + $('#<?php echo $form; ?>').submit(); + } + </script> + <?php + } +} + +/** + @example HelloWorld.php + + AutoLoader.php should be included in any top level + scripts. If the URL in the browser address bar + is your script, it's a top level script. No other + includes are necessary. AutoLoader will include + other classes as needed. + + body_content() draws the page. Methods from BasicPage + provide the standard input box at the top and footer + at the bottom. DisplayLib::boxMsg() is a utility function that + puts the 'Hello World' message in a standard message + box. + + preprocess() handles input. In this case any form + input causes a redirect to the main display script. + + Note the very last line creating an object. That's + necessary to actually display anything. + +*/ + +?> diff --git a/pos/is4c-nf/gui-class-lib/InputPage.php b/pos/is4c-nf/gui-class-lib/InputPage.php new file mode 100644 index 000000000..a3d48eb01 --- /dev/null +++ b/pos/is4c-nf/gui-class-lib/InputPage.php @@ -0,0 +1,78 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** @class InputPage + + This class automatically adds the input header + and the footer. Any display script using this + class will POST form input to itself as that + is the default action inherited from BasicPage. + */ + +class InputPage extends BasicPage { + + function print_page(){ + $my_url = $this->page_url; + ?> + <!DOCTYPE html> + <html> + <?php + echo "<head>"; + // 18Aug12 EL Add content/charset. + echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}css/pos.css\">"; + // include store css file if it exists + if (file_exists(dirname(__FILE__).'/../store.css')){ + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}/store.css\">"; + } + echo "<script type=\"text/javascript\" + src=\"{$my_url}js/jquery.js\"></script>"; + $this->head_content(); + echo "</head>"; + echo '<body class="'.$this->body_class.'">'; + echo "<div id=\"boundingBox\">"; + $this->input_header(); + echo DisplayLib::printheaderb(); + $this->body_content(); + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>\n"; + echo "</div>\n"; + $this->scale_box(); + if (!empty($this->onload_commands)){ + echo "<script type=\"text/javascript\">\n"; + echo "\$(document).ready(function(){\n"; + echo $this->onload_commands; + echo "});\n"; + echo "</script>\n"; + } + // 18Aug12 EL Moved after ready-script. + echo "</body>\n"; + print "</html>"; + } + +} + +?> diff --git a/pos/is4c-nf/gui-class-lib/NoInputPage.php b/pos/is4c-nf/gui-class-lib/NoInputPage.php new file mode 100644 index 000000000..cc7952abe --- /dev/null +++ b/pos/is4c-nf/gui-class-lib/NoInputPage.php @@ -0,0 +1,81 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** @class NoInputPage + + This class automatically adds the header and + and footer, but the header does not contain + an input form. + + Normally pages using this class will define + their own form in body_content(). + */ + +class NoInputPage extends BasicPage { + + function print_page(){ + $my_url = $this->page_url; + ?> + <!DOCTYPE html> + <html> + <?php + echo "<head>"; + // 18Aug12 EL Add content/charset. + echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}css/pos.css\">"; + // include store css file if it exists + if (file_exists(dirname(__FILE__).'/../store.css')){ + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}/store.css\">"; + } + echo "<script type=\"text/javascript\" + src=\"{$my_url}js/jquery.js\"></script>"; + $this->head_content(); + echo "</head>"; + echo '<body class="'.$this->body_class.'">'; + echo "<div id=\"boundingBox\">"; + $this->noinput_header(); + echo DisplayLib::printheaderb(); + $this->body_content(); + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + echo "</div>"; + $this->scale_box(); + $this->scanner_scale_polling(false); + if (!empty($this->onload_commands)){ + echo "\n<script type=\"text/javascript\">\n"; + echo "\$(document).ready(function(){\n"; + echo $this->onload_commands; + echo "});\n"; + echo "</script>\n"; + } + // 18Aug12 EL Moved after ready-script. + echo "</body>\n"; + print "</html>"; + } + +} + +?> diff --git a/pos/is4c-nf/gui-modules/HowPagesWork.html b/pos/is4c-nf/gui-modules/HowPagesWork.html new file mode 100644 index 000000000..4d09cc113 --- /dev/null +++ b/pos/is4c-nf/gui-modules/HowPagesWork.html @@ -0,0 +1,197 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>How CORE POS IS4C Pages are Constructed and Work</title> +<style type="text/css"> +// Reset margins for browser compatibility. +p, ul, ol { + margin: 0.0em 0.0em 0.0em 0.0em; +} +pre, tt, .tt { + font-family: Courier New; + font-size: 0.8em; +} +.gray { + background-color:#DEDEDE; +} +.first { + margin-top: 0.5em; +} +</style> +</head> +<body> +<div style="text-align: center;"> +<H2>How CORE POS IS4C Pages are Constructed and Work</H2> +<p>Revised: 18Aug2012</p> +</div> + +<p>This document walks through how a Top Level Page, +i.e. one whose name appears in the browser address bar +and whose initial source usually resides in /IS4C/pos/is4c-nf/gui-modules, +is assembled by PHP. +You may find this useful if you are new to object-oriented PHP, JavaScript, jQuery or JSON. +I wrote this as part of trying to become un-new to some of those. +<br />Eric "flathat" Lee, 18Aug2012 +</p> + +<p>The initial subject subject will be pos2.php, +although we may find that too difficult and do a simpler one such as mgrlogin.php instead. +This commentary will not be exhaustive but I hope will illuminate most of the most important features. +</p> + +<ul> +<li> +<div class="gray tt"> +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); +</div><!-- /.gray --> +<p class="first"> +This uses the PHP Magic Constant <tt>__FILE__</tt> +<br />See:<tt>http://php.net/manual/en/language.constants.predefined.php</tt> +<br />to refer to the path and name of the current file +and the <tt>dirname()</tt> function to reduce that to the path, +and then familiar code to point to +<tt>/IS4C/pos/is4c-nf/lib/AutoLoader.php</tt> +<br />which points to +<br /> - <tt>/IS4C/pos/is4c-nf/lib/LocalStorage/conf.php</tt> +<br />which points to +<br /> - <tt>/IS4C/pos/is4c-nf/lib/LocalStorage/SessionStorage.php</tt> +<br />which defines and includes the class <tt>CORE_LOCAL</tt>, +which consists simply of two methods, which are used a great deal, +to <tt>set</tt> and <tt>get</tt> certain variables, +and a structure of other classes which I don't understand yet +but that are generally related to maintaining a session, +that is, information that persists between the instances of running <tt>pos2.php</tt> +that create the PoS transaction. +<br /><tt>AutoLoader.php</tt> itself contains classes for finding the other files +that the Top Level Page might refer to and makes a persistent list or map of them +using <tt>$CORE_LOCAL->set</tt> and <tt>->get</tt>. +It is essential that naming conventions be observed, +e.g. that a class <tt>FooBar</tt> be defined in a file called <tt>FooBar.php</tt> +</li> + +<li> +<div class="gray tt"> +new pos2(); +</div><!-- /.gray --> +<p class="first"> +Next, find the above line at the end of the listing. +It says to run the function <tt>pos2</tt>. +Go back to the top of the listing to find where <tt>pos2</tt> is defined. +</p> +</li> + +<li> +<div class="gray tt"> +class pos2 extends BasicPage { +</div><!-- /.gray --> +<p class="first"> +In the above, <tt>extends</tt> means that the class being defined, <tt>pos2</tt>, +is a child of <tt>BasicPage</tt> that inherits from it and may add to and redefine parts of it. +To understand <tt>pos2</tt> we must first understand <tt>BasicPage</tt> +which is defined in +<br /><tt>/IS4C/pos/is4c-nf/gui-class-lib/BasicPage.php</tt> +<br />Go there now. +</p> +<p>(If you read through <tt>pos2</tt> you will notice it contains only functions +and no calls to them, i.e. nothing exectuable. +To learn how <tt>pos2()</tt> actually does anything study <tt>BasicPage</tt>.) +</p> +</li> + +<li> +<div class="gray tt"> +function BasicPage(){ +</div><!-- /.gray --> +<p class="first"> +Find the above line towards the top of the listing. +A function, or method, to use the correct oo term, +with the same name as the class it is in is called a <em>Constructor</em>, +and, unlike other methods, is run each time an instance of the class, +or a child of it, such as <tt>pos2()</tt> is created with <tt>new</tt>. +</p> +<p>The constructor, <tt>BasicPage()</tt> runs it's <tt>preprocess()</tt> method +and possibly its <tt>print_page()</tt> method. +There is a useful comment about <tt>preprocess()</tt> in the code at this point: +<blockquote>It is typically + used to check $_GET or $_POST variables. If the + function returns True, the rest of the page will be + printed. If the function returns False, there is no + output. Usually this function returns False after + setting a redirect header to change to another page. +</blockquote> +</p> +<p> +Now go back to <tt>pos2.php</tt> to see whether either of those methods have been +redefined for use there. +It turns out that <tt>preprocess()</tt> has and <tt>print_page()</tt> has not, +although other methods of <tt>BasicPage</tt> which are called by <tt>print_page()</tt>, +including <tt>body_content()</tt>, have. +</p> +</li> +<li> +<pre class="gray"> +&lt;form name="form" id="formlocal" method="post" autocomplete="off" +action="pos2.php" onsubmit="return submitWrapper();" &gt; +&lt;input name="reginput" value="" onblur="$('#reginput').focus();" +type="text" id="reginput" /&gt; +&lt;/form&gt; +</pre> +<p class="first"> +Before examining <tt>preprocess</tt> look at the <tt>&lt;form&gt;</tt> that captures +the <tt>POST</tt> variables that <tt>preprocess()</tt> will handle. +It is quite simple, with only one <tt>input</tt>, with <tt>name="reginput"</tt>, +the input being sent back to itself <tt>action="pos2.php"</tt> +and <tt>onsubmit="return submitWrapper();"</tt>. +The latter is the subject of most of the rest of this page. +</p> + +<li> +<div class="gray tt"> +if (Authenticate::check_password($_REQUEST['reginput'])){ +</div><!-- /.gray --> +<p class="first"> +NOT TRUE. login2.php calls itself to check password and then runs pos2. +<br />$this->change_page($this->page_url."gui-modules/pos2.php"); +<br />The first time <tt>pos2.php</tt> is called is from <tt>login2.php</tt> +which submits a form variable named <tt>reginput</tt>, the same as <tt>pos2</tt>'s own variable, +containing the password of a cashier. +Let's look at what <tt>preprocess</tt> does with this value, a two-to-four-digit number. +</p> +</li> +<li> +<div class="gray tt"> +x pos2(); +</div><!-- /.gray --> +<p class="first"> +<br />The first time <tt>pos2.php</tt> is called is from <tt>login2.php</tt>, +with no <tt>GET</tt> or <tt>POST</tt> variables. +</p> +</li> + +</ul> + +<!-- +"r +<br /> +"p +<p> +</p> +"t +<tt></tt> +"l +<li> +<div class="gray tt"> +new pos2(); +</div><!-- /.gray --> +<!-- Delete me +<p class="first"> +Next, ... +</p> +</li> + +--> + +</body> +</html> + diff --git a/pos/is4c-nf/gui-modules/UnpaidAR.php b/pos/is4c-nf/gui-modules/UnpaidAR.php new file mode 100644 index 000000000..3b1428cb1 --- /dev/null +++ b/pos/is4c-nf/gui-modules/UnpaidAR.php @@ -0,0 +1,93 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class UnpaidAR extends BasicPage { + + function preprocess(){ + global $CORE_LOCAL; + if (isset($_REQUEST['reginput'])){ + $dec = $_REQUEST['reginput']; + $amt = $CORE_LOCAL->get("old_ar_balance"); + + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("strRemembered",""); + + if (strtoupper($dec) == "CL"){ + if ($CORE_LOCAL->get('memType') == 0){ + PrehLib::memberID($CORE_LOCAL->get("defaultNonMem")); + } + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + elseif ($dec == "" || strtoupper($dec) == "BQ"){ + if (strtoupper($dec)=="BQ") + $amt = $CORE_LOCAL->get("balance"); + $CORE_LOCAL->set("strRemembered", ($amt*100).'DP9900'); + $CORE_LOCAL->set("msgrepeat",1); + $memtype = $CORE_LOCAL->get("memType"); + $type = $CORE_LOCAL->get("Type"); + if ($memtype == 1 || $memtype == 3 || $type == "INACT"){ + $CORE_LOCAL->set("isMember",1); + PrehLib::ttl(); + } + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + return True; + } + + function body_content(){ + global $CORE_LOCAL; + $amt = $CORE_LOCAL->get("old_ar_balance"); + $this->input_header(); + ?> + <div class="baseHeight"> + + <?php + if ($amt == $CORE_LOCAL->get("balance")){ + echo DisplayLib::boxMsg(sprintf("Old A/R Balance: $%.2f<br /> + [Enter] to pay balance now<br /> + [Clear] to leave balance",$amt)); + } + else { + echo DisplayLib::boxMsg(sprintf("Old A/R Balance: $%.2f<br /> + Total A/R Balance: $%.2f<br /> + [Enter] to pay old balance<br /> + [Balance] to pay the entire balance<br /> + [Clear] to leave the balance", + $amt,$CORE_LOCAL->get("balance"))); + } + echo "</div>"; + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + $CORE_LOCAL->set("msgrepeat",2); + } // END body_content() FUNCTION +} + +new UnpaidAR(); + +?> diff --git a/pos/is4c-nf/gui-modules/adminlist.php b/pos/is4c-nf/gui-modules/adminlist.php new file mode 100755 index 000000000..d754de033 --- /dev/null +++ b/pos/is4c-nf/gui-modules/adminlist.php @@ -0,0 +1,153 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class adminlist extends NoInputPage { + + function preprocess(){ + global $CORE_LOCAL; + + if (isset($_REQUEST['selectlist'])){ + if (empty($_REQUEST['selectlist'])){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + elseif ($_REQUEST['selectlist'] == 'SUSPEND'){ + Database::getsubtotals(); + if ($CORE_LOCAL->get("LastID") == 0) { + $CORE_LOCAL->set("boxMsg",_("no transaction in progress")); + $this->change_page($this->page_url."gui-modules/boxMsg2.php"); + return False; + } + else { + // ajax call to end transaction + // and print receipt + SuspendLib::suspendorder(); + $this->add_onload_command("\$.ajax({ + type:'post', + url:'{$this->page_url}ajax-callbacks/ajax-end.php', + cache: false, + data: 'receiptType=suspended', + dataType: 'json', + success: function(data){ + \$.ajax({ + type:'post', + url:'{$this->page_url}ajax-callbacks/ajax-transaction-sync.php', + cache: false, + success: function(data){ + location='{$this->page_url}gui-modules/pos2.php'; + }, + error: function(e1){ + location='{$this->page_url}gui-modules/pos2.php'; + } + }); + }, + error: function(e1){ + location='{$this->page_url}gui-modules/pos2.php'; + } + });"); + return True; + } + } + else if ($_REQUEST['selectlist'] == 'RESUME'){ + Database::getsubtotals(); + if ($CORE_LOCAL->get("LastID") != 0) { + $CORE_LOCAL->set("boxMsg",_("transaction in progress")); + $this->change_page($this->page_url."gui-modules/boxMsg2.php"); + } + elseif (SuspendLib::checksuspended() == 0) { + $CORE_LOCAL->set("boxMsg",_("no suspended transaction")); + $CORE_LOCAL->set("strRemembered",""); + $this->change_page($this->page_url."gui-modules/boxMsg2.php"); + } + else { + $this->change_page($this->page_url."gui-modules/suspendedlist.php"); + } + return False; + } + else if ($_REQUEST['selectlist'] == 'TR'){ + TenderReport::printReport(); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript" src="<?php echo $this->page_url; ?>js/ajax-parser.js"></script> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist :selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content() { + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <span class="larger"><?php echo _("administrative tasks"); ?></span> + <br /> + <form id="selectform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <select name="selectlist" id="selectlist" onblur="$('#selectlist').focus();"> + <option value=''> + <option value='SUSPEND'>1. <?php echo _("Suspend Transaction"); ?> + <option value='RESUME'>2. <?php echo _("Resume Transaction"); ?> + <option value='TR'>3. <?php echo _("Tender Reports"); ?> + </select> + </form> + <p> + <span class="smaller"><?php echo _("clear to cancel"); ?></span> + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#selectlist').focus();"); + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);"); + } // END body_content() FUNCTION +} + +new adminlist(); +?> diff --git a/pos/is4c-nf/gui-modules/adminlogin.php b/pos/is4c-nf/gui-modules/adminlogin.php new file mode 100644 index 000000000..61edf709a --- /dev/null +++ b/pos/is4c-nf/gui-modules/adminlogin.php @@ -0,0 +1,159 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* this module is intended for re-use. + * Pass the name of a class with the + * static properties: + * - adminLoginMsg (message to display) + * - adminLoginLevel (employees.frontendsecurity requirement) + * and static method: + * - adminLoginCallback(boolean $success) + * + * The callback should return a URL or True (for pos2.php) + * when $success is True. When $success is False, the return + * value is irrelevant. That call is provided in case any + * cleanup is necessary after a failed login. + */ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class adminlogin extends NoInputPage { + var $box_color; + var $msg; + var $heading; + + function preprocess(){ + global $CORE_LOCAL; + $this->box_color="coloredArea"; + $this->msg = _("enter admin password"); + + // get calling class (required) + $class = isset($_REQUEST['class']) ? $_REQUEST['class'] : ''; + $pos_home = MiscLib::base_url().'gui-modules/pos2.php'; + if ($class === '' || !class_exists($class)){ + $this->change_page($pos_home); + return False; + } + // make sure calling class implements required + // method and properties + try { + $method = new ReflectionMethod($class, 'adminLoginCallback'); + if (!$method->isStatic() || !$method->isPublic()) + throw new Exception('bad method adminLoginCallback'); + $property = new ReflectionProperty($class, 'adminLoginMsg'); + if (!$property->isStatic() || !$property->isPublic()) + throw new Exception('bad property adminLoginMsg'); + $property = new ReflectionProperty($class, 'adminLoginLevel'); + if (!$property->isStatic() || !$property->isPublic()) + throw new Exception('bad property adminLoginLevel'); + } + catch (Exception $e){ + $this->change_page($pos_home); + return False; + } + + if (isset($_REQUEST['reginput'])){ + $passwd = $_REQUEST['reginput']; + if (strtoupper($passwd) == "CL"){ + $class::adminLoginCallback(False); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if (!is_numeric($passwd) || $passwd > 9999 || $passwd < 1){ + $this->box_color="errorColoredArea"; + $this->msg = _("re-enter admin password"); + } + else { + $query = "select emp_no, FirstName, LastName from employees + where EmpActive = 1 and frontendsecurity >= " + .$class::$adminLoginLevel + ." and (CashierPassword = ".$passwd + ." or AdminPassword = ".$passwd.")"; + $db = Database::pDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + if ($num_rows != 0) { + $row = $db->fetch_row($result); + TransRecord::add_log_record(array( + 'upc' => $passwd, + 'description' => substr($class::$adminLoginMsg,0,30), + 'charflag' => 'PW', + 'num_flag' => $row['emp_no'] + )); + + $result = $class::adminLoginCallback(True); + if ($result === True) + $this->change_page(MiscLib::base_url().'gui-modules/pos2.php'); + else + $this->change_page($result); + return False; + } + else { + $this->box_color="errorColoredArea"; + $this->msg = _("re-enter admin password"); + + TransRecord::add_log_record(array( + 'upc' => $passwd, + 'description' => substr($class::$adminLoginMsg,0,30), + 'charflag' => 'PW' + )); + } + } + } + return True; + } + + function head_content(){ + $this->default_parsewrapper_js(); + $this->scanner_scale_polling(True); + } + + function body_content(){ + global $CORE_LOCAL; + $heading = $CORE_LOCAL->get("adminLoginMsg"); + ?> + <div class="baseHeight"> + <div class="<?php echo $this->box_color; ?> centeredDisplay"> + <span class="larger"> + <?php echo $heading ?> + </span><br /> + <form name="form" id="formlocal" method="post" + autocomplete="off" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input type="password" id="reginput" name="reginput" tabindex="0" onblur="$('#reginput').focus();" /> + <input type="hidden" name="class" value="<?php echo $_REQUEST['class']; ?>" /> + </form> + <p> + <?php echo $this->msg ?> + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#reginput').focus();"); + } // END true_body() FUNCTION + + +} + +new adminlogin(); + +?> diff --git a/pos/is4c-nf/gui-modules/bigComment.php b/pos/is4c-nf/gui-modules/bigComment.php new file mode 100644 index 000000000..3ea15c9a0 --- /dev/null +++ b/pos/is4c-nf/gui-modules/bigComment.php @@ -0,0 +1,136 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class bigComment extends NoInputPage { + + /** + Input processing function + */ + function preprocess(){ + global $CORE_LOCAL; + + // a selection was made + if (isset($_REQUEST['comment'])){ + + if (isset($_REQUEST['cleared']) && $_REQUEST['cleared'] == '1'){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + $comment = str_replace("\r",'',$_REQUEST['comment']); + // remove trailing newline from double enter + $comment = substr($comment,0,strlen($comment)-1); + $lines = explode("\n", $comment); + foreach($lines as $line){ + $line = trim($line); + if (strlen($line) == 0) + continue; + elseif (strlen($line) <= 30) + TransRecord::addcomment($line); + else { + $wrap = wordwrap($line, 30, "\n", True); + $shorter_lines = explode("\n", $wrap); + foreach($shorter_lines as $short_line) + TransRecord::addcomment($short_line); + } + } + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + return True; + } // END preprocess() FUNCTION + + /** + Pretty standard javascript for + catching CL typed in a select box + */ + function head_content(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#cleared').val(1); + $('#selectform').submit(); + } + else if ( (prevPrevKey == 116 || prevPrevKey == 84) && + (prevKey == 116 || prevKey == 84) ){ //TT<enter> + $('#cleared').val(1); + $('#selectform').submit(); + } + else if (prevKey == 13){ + $('#selectform').submit(); + } + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + /** + Build a <select> form that submits + back to this script + */ + function body_content(){ + global $CORE_LOCAL; + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\"" + ." id=\"selectform\">" + ."<textarea name=\"comment\" id=\"comment\" " + ." cols=\"35\" rows=\"15\" onblur=\"\$('#comment').focus();\">"; + + echo "</textarea>" + .'<input type="hidden" name="cleared" id="cleared" value="0" />' + ."</form>" + ."</div>" + ."<div class=\"listboxText coloredText centerOffset\">"; + echo _('press [enter] twice to save'); + echo '<br />'; + echo _("clear to cancel")."</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + + $this->add_onload_command("\$('#comment').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#comment').focus();\n"); + } // END body_content() FUNCTION + +} + +new bigComment(); + +?> diff --git a/pos/is4c-nf/gui-modules/blank.html b/pos/is4c-nf/gui-modules/blank.html new file mode 100644 index 000000000..89fc154ff --- /dev/null +++ b/pos/is4c-nf/gui-modules/blank.html @@ -0,0 +1 @@ +<html></html> diff --git a/pos/is4c-nf/gui-modules/boxMsg2.php b/pos/is4c-nf/gui-modules/boxMsg2.php new file mode 100755 index 000000000..444e68a82 --- /dev/null +++ b/pos/is4c-nf/gui-modules/boxMsg2.php @@ -0,0 +1,94 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class boxMsg2 extends BasicPage { + + function head_content(){ + ?> + <script type="text/javascript"> + function submitWrapper(){ + var str = $('#reginput').val(); + var endorseType = $('#endorseType').val(); + var endorseAmt = $('#endorseAmt').val(); + $.ajax({ + url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-decision.php', + type: 'get', + data: 'input='+str, + dataType: 'json', + cache: false, + success: function(data){ + if (!data.cleared && endorseType != ''){ + $.ajax({ + url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-endorse.php', + type: 'get', + data: 'type='+endorseType+'&amount='+endorseAmt, + cache: false, + success: function(){ + location = data.dest_page; + } + }); + } + else { + location = data.dest_page; + } + } + }); + return false; + } + </script> + <?php + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header("onsubmit=\"return submitWrapper();\""); + ?> + <div class="baseHeight"> + + <?php + echo DisplayLib::boxMsg($CORE_LOCAL->get("boxMsg"),"",True); + echo "</div>"; + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + echo '<input type="hidden" id="endorseType" value="' + .(isset($_REQUEST['endorse'])?$_REQUEST['endorse']:'') + .'" />'; + echo '<input type="hidden" id="endorseAmt" value="' + .(isset($_REQUEST['endorseAmt'])?$_REQUEST['endorseAmt']:'') + .'" />'; + + $CORE_LOCAL->set("boxMsg",''); + $CORE_LOCAL->set("msgrepeat",2); + if (!isset($_REQUEST['quiet'])) + MiscLib::errorBeep(); + } // END body_content() FUNCTION +} + +new boxMsg2(); + +?> diff --git a/pos/is4c-nf/gui-modules/cablist.php b/pos/is4c-nf/gui-modules/cablist.php new file mode 100644 index 000000000..f29138e30 --- /dev/null +++ b/pos/is4c-nf/gui-modules/cablist.php @@ -0,0 +1,153 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class cablist extends NoInputPage { + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist option:selected').val(''); + } + submitWrapper(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + function submitWrapper(){ + var ref = $('#selectlist').val(); + if (ref != ""){ + $.ajax({ + url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-cabreceipt.php', + type: 'get', + cache: false, + data: 'input='+ref, + success: function(data){ + location='<?php echo $this->page_url; ?>gui-modules/pos2.php'; + } + }); + } + else { + location='<?php echo $this->page_url; ?>gui-modules/pos2.php'; + } + + return false; + } + </script> + <?php + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#selectlist').focus();\n"); + } + + function body_content(){ + global $CORE_LOCAL; + + $db = Database::pDataConnect(); + $query = "SELECT frontendsecurity FROM employees WHERE emp_no=".$CORE_LOCAL->get("CashierNo"); + $result = $db->query($query); + $fes = 0; + if ($db->num_rows($result) > 0) + $fes = array_pop($db->fetch_row($result)); + + /* if front end security >= 25, pull all + * available receipts; other wise, just + * current cashier's receipt */ + + $result = -1; + if ($fes >= 25){ + $query = "select emp_no, register_no, trans_no, sum((case when trans_type = 'T' then -1 * total else 0 end)) as total " + ."from localtranstoday " + ." group by register_no, emp_no, trans_no + having sum((case when trans_type='T' THEN -1*total ELSE 0 end)) >= 30 + order by register_no,emp_no,trans_no desc"; + $db = Database::tDataConnect(); + if ($CORE_LOCAL->get("standalone") == 0){ + $query = str_replace("localtranstoday","dtransactions",$query); + $db = Database::mDataConnect(); + } + $result = $db->query($query); + + } + else { + $query = "select emp_no, register_no, trans_no, sum((case when trans_type = 'T' then -1 * total else 0 end)) as total " + ."from localtranstoday where register_no = ".$CORE_LOCAL->get("laneno")." and emp_no = ".$CORE_LOCAL->get("CashierNo") + ." group by register_no, emp_no, trans_no + having sum((case when trans_type='T' THEN -1*total ELSE 0 end)) >= 30 + order by trans_no desc"; + + $db = Database::tDataConnect(); + $result = $db->query($query); + } + + $num_rows = $db->num_rows($result); + ?> + + <div class="baseHeight"> + <div class="listbox"> + <form name="selectform" onsubmit="return submitWrapper();"> + <select name="selectlist" size="10" onblur="$('#selectlist').focus()" + id="selectlist"> + + <?php + $selected = "selected"; + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + echo "<option value='".$row["emp_no"]."-".$row["register_no"]."-".$row["trans_no"]."'"; + echo $selected; + echo ">lane ".substr(100 + $row["register_no"], -2)." Cashier ".$row["emp_no"] + ." #".$row["trans_no"]." -- $".$row["total"]; + $selected = ""; + } + if ($num_rows == 0){ + echo "<option value=\"\">None found</option>"; + } + ?> + + </select> + </form> + </div> + <div class="listboxText coloredText centerOffset"> + use arrow keys to navigate<br />[enter] to reprint receipt<br />[clear] to cancel + </div> + <div class="clear"></div> + </div> + + <?php + } // END body_content() FUNCTION +} + +new cablist(); + +?> diff --git a/pos/is4c-nf/gui-modules/cclist.php b/pos/is4c-nf/gui-modules/cclist.php new file mode 100644 index 000000000..dd07f8342 --- /dev/null +++ b/pos/is4c-nf/gui-modules/cclist.php @@ -0,0 +1,80 @@ +<?php + +if (!class_exists("MainFramePage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/MainFramePage.php"); +if (!function_exists("paycard_reset")) include_once($_SESSION["INCLUDE_PATH"]."/cc-modules/lib/paycardLib.php"); +if (!function_exists("changeBothPages")) include_once($_SESSION["INCLUDE_PATH"]."/gui-base.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class giftcardlist extends MainFramePage { + + function preprocess(){ + global $CORE_LOCAL; + if (isset($_POST["selectlist"])){ + $prefix = $_POST["selectlist"]; + if ($prefix == "CCM"){ + $CORE_LOCAL->set("strRemembered","CCM"); + $CORE_LOCAL->set("msgrepeat",1); + changeBothPages("/gui-modules/input.php","/gui-modules/pos2.php"); + } + else + changeBothPages("/gui-modules/input.php?in=$prefix","/gui-modules/pos2.php"); + return False; + } + return True; + } + + function body_tag() { + echo "<body onload=\"document.selectform.selectlist.selectedIndex=0; document.selectform.selectlist.focus();\">"; + } + + function head(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if(!e)e = window.event; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + document.selectform.selectlist[0].value = ''; + document.selectform.selectlist.selectedIndex = 0; + } + document.selectform.submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content() { + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <span class="larger">credit card transaction</span> + <form name='selectform' method='post' action='/gui-modules/cclist.php'> + <select name='selectlist' onblur='document.selectform.selectlist.focus()' onkeypress='processkeypress(event)' > + <option value=''>Sale + <option value='CCM'>Sale Via Terminal + <option value='VD'>Void Previous Card + <option value='FC'>Correction Charge + </select> + </form> + <span class="smaller">[clear] to cancel</span> + <p /> + </div> + </div> + <?php + } // END body_content() FUNCTION +} + +new giftcardlist(); +?> diff --git a/pos/is4c-nf/gui-modules/checklist.php b/pos/is4c-nf/gui-modules/checklist.php new file mode 100644 index 000000000..01cc4a659 --- /dev/null +++ b/pos/is4c-nf/gui-modules/checklist.php @@ -0,0 +1,132 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class checklist extends NoInputPage { + + /** + Input processing function + */ + function preprocess(){ + global $CORE_LOCAL; + + // a selection was made + if (isset($_REQUEST['search'])){ + $entered = strtoupper($_REQUEST['search']); + + if ($entered == "" || $entered == "CL"){ + // should be empty string + // javascript causes this input if the + // user presses CL{enter} + // Redirect to main screen + $CORE_LOCAL->set("tenderTotal","0"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + if (!empty($entered)){ + // built department input string and set it + // to be the next POS entry + // Redirect to main screen + $input = $CORE_LOCAL->get("tenderTotal")."CQ".$entered; + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$input); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + return True; + } // END preprocess() FUNCTION + + /** + Pretty standard javascript for + catching CL typed in a select box + */ + function head_content(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + /** + Build a <select> form that submits + back to this script + */ + function body_content(){ + global $CORE_LOCAL; + $db = pDataConnect(); + $q = "SELECT TenderCode,TenderName FROM tenders WHERE TenderName LIKE '%check%' ORDER BY TenderName"; + $r = $db->query($q); + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\"" + ." id=\"selectform\">" + ."<select name=\"search\" id=\"search\" " + ."size=\"15\" onblur=\"\$('#search').focus();\">"; + + $selected = "selected"; + while($row = $db->fetch_row($r)){ + echo "<option value='".$row["TenderCode"]."' ".$selected.">"; + echo $row['TenderName']; + echo '</option>'; + $selected = ""; + } + echo "</select>" + ."</form>" + ."</div>" + ."<div class=\"listboxText coloredText centerOffset\">" + ."[Clear] to Cancel</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#search').focus();\n"); + } // END body_content() FUNCTION + +} + +new checklist(); + +?> diff --git a/pos/is4c-nf/gui-modules/coupondeptinvalid.php b/pos/is4c-nf/gui-modules/coupondeptinvalid.php new file mode 100644 index 000000000..433df5ab7 --- /dev/null +++ b/pos/is4c-nf/gui-modules/coupondeptinvalid.php @@ -0,0 +1,50 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +if (!class_exists("MainFramePage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/MainFramePage.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class coupondeptinvalid extends MainFramePage { + function body_tag() { + print "<body onload=\"document.form.dept.focus()\">"; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay errorColored"> + <span class="larger">department invalid</span> + <form name='form' method='post' autocomplete='off' action='../coupondec.php'> + <input Type='text' name='dept' size='6' tabindex='0' onBlur='document.form.dept.focus();'> + <p /> + department key or [clear] to cancel + <p /> + </div> + </div> + <?php + } // END body_content() FUNCTION +} + +new coupondeptinvalid(); + +?> diff --git a/pos/is4c-nf/gui-modules/deptlist.php b/pos/is4c-nf/gui-modules/deptlist.php new file mode 100644 index 000000000..1ddc74fb3 --- /dev/null +++ b/pos/is4c-nf/gui-modules/deptlist.php @@ -0,0 +1,135 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class deptlist extends NoInputPage { + + /** + Input processing function + */ + function preprocess(){ + global $CORE_LOCAL; + + // a selection was made + if (isset($_REQUEST['search'])){ + $entered = strtoupper($_REQUEST['search']); + + if ($entered == "" || $entered == "CL"){ + // should be empty string + // javascript causes this input if the + // user presses CL{enter} + // Redirect to main screen + $CORE_LOCAL->set("departmentAmount","0"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + if (is_numeric($entered)){ + // built department input string and set it + // to be the next POS entry + // Redirect to main screen + $input = $CORE_LOCAL->get("departmentAmount")."DP".$entered."0"; + $qty = $CORE_LOCAL->get("quantity"); + if ($qty != "" & $qty != 1 & $qty != 0) + $input = $qty."*".$input; + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$input); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + return True; + } // END preprocess() FUNCTION + + /** + Pretty standard javascript for + catching CL typed in a select box + */ + function head_content(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + /** + Build a <select> form that submits + back to this script + */ + function body_content(){ + global $CORE_LOCAL; + $db = Database::pDataConnect(); + $q = "SELECT dept_no,dept_name FROM departments ORDER BY dept_name"; + $r = $db->query($q); + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\"" + ." id=\"selectform\">" + ."<select name=\"search\" id=\"search\" " + ."size=\"15\" onblur=\"\$('#search').focus();\">"; + + $selected = "selected"; + while($row = $db->fetch_row($r)){ + echo "<option value='".$row["dept_no"]."' ".$selected.">"; + echo $row['dept_name']; + echo '</option>'; + $selected = ""; + } + echo "</select>" + ."</form>" + ."</div>" + ."<div class=\"listboxText coloredText centerOffset\">" + ._("clear to cancel")."</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#search').focus();\n"); + } // END body_content() FUNCTION + +} + +new deptlist(); + +?> diff --git a/pos/is4c-nf/gui-modules/drawerPage.php b/pos/is4c-nf/gui-modules/drawerPage.php new file mode 100755 index 000000000..16510b150 --- /dev/null +++ b/pos/is4c-nf/gui-modules/drawerPage.php @@ -0,0 +1,178 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class drawerPage extends NoInputPage { + + var $is_admin; + var $my_drawer; + var $available; + + function preprocess(){ + global $CORE_LOCAL; + + $this->my_drawer = ReceiptLib::currentDrawer(); + $this->available = ReceiptLib::availableDrawers(); + $this->is_admin = False; + $db = Database::pDataConnect(); + $chk = $db->query('SELECT frontendsecurity FROM employees + WHERE emp_no='.$CORE_LOCAL->get('CashierNo')); + if ($db->num_rows($chk) > 0){ + $sec = array_pop($db->fetch_row($chk)); + if ($sec >= 30) $this->is_admin = True; + } + + if (isset($_REQUEST['selectlist'])){ + if (empty($_REQUEST['selectlist'])){ + if (empty($this->available) && !$this->is_admin && $this->my_drawer == 0){ + // no drawer available and not admin + // sign out and go back to main login screen + Database::setglobalvalue("LoggedIn", 0); + $CORE_LOCAL->set("LoggedIn",0); + $CORE_LOCAL->set("training",0); + $CORE_LOCAL->set("gui-scale","no"); + $this->change_page($this->page_url."gui-modules/login2.php"); + } + else { + $this->change_page($this->page_url."gui-modules/pos2.php"); + } + return False; + } + if (substr($_REQUEST['selectlist'],0,2) == 'TO' && $this->is_admin){ + // take over a drawer + $new_drawer = substr($_REQUEST['selectlist'],2); + if ($this->my_drawer != 0){ + // free up the current drawer if it exists + ReceiptLib::drawerKick(); + ReceiptLib::freeDrawer($this->my_drawer); + } + // switch to the requested drawer + ReceiptLib::assignDrawer($CORE_LOCAL->get('CashierNo'),$new_drawer); + ReceiptLib::drawerKick(); + $this->my_drawer = $new_drawer; + } + elseif (substr($_REQUEST['selectlist'],0,2) == 'SW'){ + // switch to available drawer + $new_drawer = substr($_REQUEST['selectlist'],2); + foreach($this->available as $id){ + // verify the requested drawer is available + if ($new_drawer == $id){ + if ($this->my_drawer != 0){ + // free up the current drawer if it exists + ReceiptLib::drawerKick(); + ReceiptLib::freeDrawer($this->my_drawer); + } + // switch to the requested drawer + ReceiptLib::assignDrawer($CORE_LOCAL->get('CashierNo'),$new_drawer); + ReceiptLib::drawerKick(); + $this->my_drawer = $new_drawer; + + break; + } + } + } + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist :selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content() { + global $CORE_LOCAL; + $msg = 'You are using drawer #'.$this->my_drawer; + if ($this->my_drawer == 0) + $msg = 'You do not have a drawer'; + $num_drawers = ($CORE_LOCAL->get('dualDrawerMode')===1) ? 2 : 1; + $db = Database::pDataConnect(); + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <span class="larger"><?php echo $msg; ?></span> + <br /> + <form id="selectform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <select name="selectlist" id="selectlist" onblur="$('#selectlist').focus();"> + <option value=''> + <?php + if ($this->is_admin){ + for($i=0;$i<$num_drawers;$i++){ + $nameQ = 'SELECT FirstName FROM drawerowner as d + LEFT JOIN employees AS e ON e.emp_no=d.emp_no + WHERE d.drawer_no='.($i+1); + $name = $db->query($nameQ); + if ($db->num_rows($name) > 0) + $name = array_pop($db->fetch_row($name)); + if (empty($name)) $name = 'Unassigned'; + printf('<option value="TO%d">Take over drawer #%d (%s)</option>', + ($i+1),($i+1),$name); + } + } + elseif (count($this->available) > 0){ + foreach($this->available as $num){ + printf('<option value="SW%d">Switch to drawer #%d</option>', + $num,$num); + } + } + else + echo '<option value="">No actions available</option>'; + ?> + </select> + </form> + <p> + <span class="smaller"><?php echo _("clear to cancel"); ?></span> + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#selectlist').focus();"); + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);"); + } // END body_content() FUNCTION +} + +new drawerPage(); +?> diff --git a/pos/is4c-nf/gui-modules/fsTotalConfirm.php b/pos/is4c-nf/gui-modules/fsTotalConfirm.php new file mode 100755 index 000000000..197d195d2 --- /dev/null +++ b/pos/is4c-nf/gui-modules/fsTotalConfirm.php @@ -0,0 +1,172 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class fsTotalConfirm extends NoInputPage { + + var $tendertype; + + function preprocess(){ + global $CORE_LOCAL; + $this->tendertype = ""; + if (isset($_REQUEST["selectlist"])){ + $choice = $_REQUEST["selectlist"]; + if ($choice == "EF"){ + $chk = PrehLib::fsEligible(); + if ($chk !== True){ + $this->change_page($chk); + return False; + } + // 13Feb13 Andy + // Disable option to enter tender here by returning immediately + // to pos2.php. Should be conigurable or have secondary + // functionality removed entirely + $this->tendertype = 'EF'; + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + elseif ($choice == "EC"){ + $chk = PrehLib::ttl(); + if ($chk !== True){ + $this->change_page($chk); + return False; + } + // 13Feb13 Andy + // Disabled option; see above + $this->tendertype = 'EC'; + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if ($choice == ''){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + elseif (isset($_REQUEST['tendertype'])){ + $this->tendertype = $_REQUEST['tendertype']; + $valid_input = False; + $in = $_REQUEST['tenderamt']; + if (empty($in)){ + if ($this->tendertype == 'EF') + $CORE_LOCAL->set("strRemembered",100*$CORE_LOCAL->get("fsEligible")."EF"); + else + $CORE_LOCAL->set("strRemembered",100*$CORE_LOCAL->get("runningTotal")."EC"); + $CORE_LOCAL->set("msgrepeat",1); + $valid_input = True; + } + elseif (is_numeric($in)){ + if ($this->tendertype == 'EF' && $in > (100*$CORE_LOCAL->get("fsEligible"))) + $valid_input = False; + else { + $CORE_LOCAL->set("strRemembered",$in.$this->tendertype); + $CORE_LOCAL->set("msgrepeat",1); + $valid_input = True; + } + } + elseif (strtoupper($in) == "CL"){ + $CORE_LOCAL->set("strRemembered",""); + $CORE_LOCAL->set("msgrepeat",0); + $valid_input = True; + } + + if ($valid_input){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist :selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content() { + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <?php if (empty($this->tendertype)){ ?> + <span class="larger">Customer is using the</span> + <?php } ?> + <form id="selectform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + + <?php if (empty($this->tendertype)){ ?> + <select size="2" name="selectlist" + id="selectlist" onblur="$('#selectlist').focus();"> + <option value='EC' selected>Cash Portion + <option value='EF'>Food Portion + </select> + <?php } else { ?> + <input type="text" id="tenderamt" + name="tenderamt" onblur="$('#tenderamt').focus();" /> + <br /> + <span class="larger">Press [enter] to tender + $<?php printf("%.2f",($this->tendertype=='EF'?$CORE_LOCAL->get("fsEligible"):$CORE_LOCAL->get("runningTotal"))); ?> + as <?php echo ($this->tendertype=="EF"?"EBT Food":"EBT Cash") ?> + or input a different amount</span> + <br /> + <input type="hidden" name="tendertype" value="<?php echo $this->tendertype?>" /> + <?php } ?> + </form> + <p> + <span class="smaller">[clear] to cancel</span> + </p> + </div> + </div> + <?php + if (empty($this->tendertype)){ + $this->add_onload_command("\$('#selectlist').focus();\n"); + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);\n"); + } + else + $this->add_onload_command("\$('#tenderamt').focus();\n"); + } // END body_content() FUNCTION +} + +new fsTotalConfirm(); +?> diff --git a/pos/is4c-nf/gui-modules/giftcardlist.php b/pos/is4c-nf/gui-modules/giftcardlist.php new file mode 100644 index 000000000..2ed94436b --- /dev/null +++ b/pos/is4c-nf/gui-modules/giftcardlist.php @@ -0,0 +1,92 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class giftcardlist extends NoInputPage { + + function preprocess(){ + global $CORE_LOCAL; + if (isset($_REQUEST["selectlist"])){ + $CORE_LOCAL->set("prefix",$_REQUEST["selectlist"]); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if(!e)e = window.event; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#selectlist').focus();\n"); + } // END head() FUNCTION + + function body_content() { + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <span class="larger">gift card transaction</span> + <form name="selectform" method="post" id="selectform" + action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <select id="selectlist" name="selectlist" + onblur="$('#selectlist').focus()"> + <option value="">Sale + <option value="AC">Activate + <option value="AV">Add Value + <option value="PV">Balance + </select> + </form> + <p> + <span class="smaller">[clear] to cancel</span> + </p> + </div> + </div> + <?php + } // END body_content() FUNCTION +} + +new giftcardlist(); +?> diff --git a/pos/is4c-nf/gui-modules/input.php b/pos/is4c-nf/gui-modules/input.php new file mode 100644 index 000000000..180315cce --- /dev/null +++ b/pos/is4c-nf/gui-modules/input.php @@ -0,0 +1,194 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("BasicPage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/BasicPage.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class Input extends BasicPage { + + function body_tag(){ + $val = ''; + if (isset($_GET["in"])) $val = $_GET["in"]; + echo "<body onload=\"betterDate(); document.form.reginput.focus(); document.form.reginput.value='$val';\">"; + } + + function head(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript"> + + function keyDown(e) + { + if ( ! e ) { + e = event; + } + var ieKey=e.keyCode; + switch(ieKey) { + case 37: + case 38: + submitMainForm('U'); + break; + case 39: + case 40: + submitMainForm('D'); + break; + case 115: + submitMainForm('LOCK'); + break; + case 117: + submitMainForm('RI'); + break; + case 121: + submitMainForm('WAKEUP'); + break; + default: + break; + } + } + + function betterDate() { + var myNow = new Date(); + var ampm = 'AM'; + var hour = myNow.getHours(); + var minute = myNow.getMinutes(); + if (hour >= 12){ + ampm = 'PM'; + hour = hour - 12; + } + if (hour == 0) hour = 12; + + var year = myNow.getYear() % 100; + var month = myNow.getMonth()+1; + var day = myNow.getDate(); + if (year < 10) year = '0'+year; + if (month < 10) month = '0'+month; + if (day < 10) day ='0'+day; + if (minute < 10) minute = '0'+minute; + + var timeStr = month+'/'+day+'/'+year+' '; + timeStr += hour+':'+minute+' '+ampm; + $('#timeSpan').html(timeStr); + setTimeout(betterDate,20000); + } + + function submitMainForm(str){ + /* this can be simplified eventually, but right now + * there's a fallback in case the other frame's form + * doesn't have an id + */ + if($('#form1 input',window.top.main_frame.document).length != 0){ + $('#form1 input',window.top.main_frame.document).val(str); + window.top.main_frame.submitWrapper(); + } + else{ + $('form:first input',window.top.main_frame.document).val(str); + $('form:first',window.top.main_frame.document).submit(); + } + + $('#formlocal input').val(''); + $('#formlocal input').focus(); + } + + $(document).ready(function() { + $('#formlocal').submit(function() { + submitMainForm($('#formlocal input').val()); + return false; + }); + + $(document).keydown(keyDown); + }); + </script> + + + <?php + } // END head() function + + function body_content(){ + global $CORE_LOCAL; + if ($this->mask_input){ + $inputType = "password"; + } else { + $inputType = "text"; + } + /* + if (isset($_POST["reginput"])) { + $input = strtoupper(trim($_POST["reginput"])); + } else { + $input = ""; + } + */ + $time = strftime("%m/%d/%y %I:%M %p", time()); + + $CORE_LOCAL->set("repeatable",0); + ?> + <div id="inputArea"> + <div class="inputform"> + <form name="form" id="formlocal" method="post" autocomplete="off" + action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input name="reginput" value="" onBlur="document.forms[0].reginput.focus();" + type="<?php echo $inputType; ?>" /> + </form> + </div> + <div class="notices"> + <?php + if ($CORE_LOCAL->get("training") == 1) { + echo "<span class=\"text\">training </span>" + ."<img src='/graphics/BLUEDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + elseif ($CORE_LOCAL->get("standalone") == 0) { + echo "<img src='/graphics/GREENDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + else { + echo "<span class=\"text\">stand alone</span>" + ."<img src='/graphics/REDDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + if($CORE_LOCAL->get("CCintegrate") == 1 && + $CORE_LOCAL->get("ccLive") == 1 && $CORE_LOCAL->get("training") == 0){ + echo "<img src='/graphics/ccIn.gif'>&nbsp;"; + }elseif($CORE_LOCAL->get("CCintegrate") == 1 && + ($CORE_LOCAL->get("training") == 1 || $CORE_LOCAL->get("ccLive") == 0)){ + echo "<img src='/graphics/ccTest.gif'>&nbsp;"; + } + + echo "<span id=timeSpan class=\"time\">".$time."</span>\n"; + ?> + + </div> + </div> + <?php + /* + if ( strlen($input) > 0 || $CORE_LOCAL->get("msgrepeat") == 2) { + echo "<script type=\"text/javascript\">"; + echo "if (top.main_frame.document.forms[0] && + top.main_frame.document.forms[0].input){"; + echo "top.main_frame.document.forms[0].input.value = '".$input."';\n"; + echo "top.main_frame.document.forms[0].submit();\n"; + echo "}"; + echo "</script>"; + } + */ + } // END body_content() FUNCTION +} + +new Input(); +?> diff --git a/pos/is4c-nf/gui-modules/login2.php b/pos/is4c-nf/gui-modules/login2.php new file mode 100755 index 000000000..3560e412d --- /dev/null +++ b/pos/is4c-nf/gui-modules/login2.php @@ -0,0 +1,152 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); +AutoLoader::LoadMap(); + +class login2 extends BasicPage { + + var $box_css_class; + var $msg; + + var $body_class = ''; + + function preprocess(){ + global $CORE_LOCAL; + $this->box_css_class = 'coloredArea'; + $this->msg = _('please enter your password'); + + if (isset($_REQUEST['reginput'])){ + if (Authenticate::check_password($_REQUEST['reginput'])){ + Database::testremote(); + $sd = MiscLib::scaleObject(); + if (is_object($sd)) + $sd->ReadReset(); + + /** + Find a drawer for the cashier + */ + $my_drawer = ReceiptLib::currentDrawer(); + if ($my_drawer == 0){ + $available = ReceiptLib::availableDrawers(); + if (count($available) > 0){ + ReceiptLib::assignDrawer($CORE_LOCAL->get('CashierNo'),$available[0]); + $my_drawer = $available[0]; + } + } + else + ReceiptLib::assignDrawer($CORE_LOCAL->get('CashierNo'),$my_drawer); + + /** + Use Kicker object to determine whether the drawer should open + The first line is just a failsafe in case the setting has not + been configured. + */ + if (session_id() != '') + session_write_close(); + $kicker_class = ($CORE_LOCAL->get("kickerModule")=="") ? 'Kicker' : $CORE_LOCAL->get('kickerModule'); + $kicker_object = new $kicker_class(); + if ($kicker_object->kickOnSignIn()) + ReceiptLib::drawerKick(); + + if ($my_drawer == 0) + $this->change_page($this->page_url."gui-modules/drawerPage.php"); + else + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else { + $this->box_css_class = 'errorColoredArea'; + $this->msg = _('password invalid, please re-enter'); + } + } + + return True; + } + + function head_content(){ + ?> + <script type="text/javascript"> + function closeFrames() { + window.top.close(); + } + </script> + <?php + $this->default_parsewrapper_js(); + } + + function body_content(){ + global $CORE_LOCAL; + // 18Agu12 EL Add separately for readability of source. + $this->add_onload_command("\$('#reginput').focus();"); + $this->add_onload_command("\$('#scalebox').css('display','none');"); + + ?> + <div id="loginTopBar"> + <div class="name">I S 4 C</div> + <div class="version">P H P &nbsp; D E V E L O P M E N T + &nbsp; V E R S I O N &nbsp; 2 .0 .0</div> + <div class="welcome coloredArea"><?php echo _("W E L C O M E"); ?></div> + </div> + <div id="loginCenter"> + <div class="box <?php echo $this->box_css_class; ?>"> + <b><?php echo _("log in"); ?></b> + <form id="formlocal" name="form" method="post" autocomplete="off" + action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input type="password" name="reginput" size="20" tabindex="0" + onblur="$('#reginput').focus();" id="reginput" > + <p> + <?php echo $this->msg ?> + </p> + </form> + </div> + </div> + <div id="loginExit"> + <?php echo _("EXIT"); ?> + <?php + if ($CORE_LOCAL->get("browserOnly") == 1) { + echo "<a href=\"\" onclick=\"window.top.close();\" "; + } + else { + //echo "<a href='/bye.html' onclick=\"var cw=window.open('','Customer_Display'); cw.close()\" "; + echo "<a href=\"\" "; + } + echo "onmouseover=\"document.exit.src='{$this->page_url}graphics/switchred2.gif';\" "; + echo "onmouseout=\"document.exit.src='{$this->page_url}graphics/switchblue2.gif';\">"; + ?> + <img id="exit" style="border:0;" alt="exit" src="<?php echo $this->page_url; ?>graphics/switchblue2.gif" /></a> + + </div> + <form name="hidden"> + <input type="hidden" name="scan" value="noScan"> + </form> + <?php + } // END true_body() FUNCTION + +} + +new login2(); + +?> diff --git a/pos/is4c-nf/gui-modules/login3.php b/pos/is4c-nf/gui-modules/login3.php new file mode 100644 index 000000000..e95fd5ef6 --- /dev/null +++ b/pos/is4c-nf/gui-modules/login3.php @@ -0,0 +1,86 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class login3 extends BasicPage { + + var $color; + var $img; + var $msg; + + protected $mask_input = True; + + function preprocess(){ + $this->color = "coloredArea"; + $this->img = $this->page_url."graphics/key-icon.png"; + $this->msg = _("please enter password"); + if (isset($_REQUEST['reginput'])){ + if (Authenticate::check_password($_REQUEST['reginput'],4)){ + $sd = MiscLib::scaleObject(); + if (is_object($sd)) + $sd->ReadReset(); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else { + $this->color = "errorColoredArea"; + $this->img = $this->page_url."graphics/redkey4.gif"; + $this->msg = _("password invalid, please re-enter"); + } + } + return True; + } + + function head_content(){ + $this->default_parsewrapper_js(); + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header(); + echo DisplayLib::printheaderb(); + ?> + <div class="baseHeight"> + <div class="<?php echo $this->color; ?> centeredDisplay"> + <img alt="key" src='<?php echo $this->img ?>' /> + <p> + <?php echo $this->msg ?> + </p> + </div> + </div> + <?php + TransRecord::addactivity(3); + Database::getsubtotals(); + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + } // END true_body() FUNCTION + +} + +new login3(); + +?> diff --git a/pos/is4c-nf/gui-modules/memlist.php b/pos/is4c-nf/gui-modules/memlist.php new file mode 100755 index 000000000..3658d3520 --- /dev/null +++ b/pos/is4c-nf/gui-modules/memlist.php @@ -0,0 +1,308 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 5Oct2012 Eric Lee Added: + * + A WEFC_Toronto-only chunk for collecting Member Card# + * + A general facility for displaying an error encountered in preprocess() + * in body_content() using temp_message. + +*/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class memlist extends NoInputPage { + + var $temp_result; + var $temp_num_rows; + var $entered; + var $db; + var $temp_message; + + private $results = array(); + private $submitted = False; + + function preprocess(){ + global $CORE_LOCAL; + + // set variable ahead of time + // so we know if lookup found no one + // vs. lookup didn't happen + $this->submitted = False; + + $entered = ""; + if (isset($_REQUEST['idSearch']) && strlen($_REQUEST['idSearch']) > 0){ + $entered = $_REQUEST['idSearch']; + } + elseif (isset($_REQUEST['search'])){ + $entered = strtoupper(trim($_REQUEST["search"])); + $entered = str_replace("'", "''", $entered); + } + else return True; + + if (substr($entered, -2) == "ID") $entered = substr($entered, 0, strlen($entered) - 2); + + $personNum = False; + $memberID = False; + if (strstr($entered,"::") !== False){ + // Values of memlist items are "CardNo::personNum" + list($memberID,$personNum) = explode("::",$entered); + $this->submitted = True; + } + // No input available, stop + if (!$entered || strlen($entered) < 1 || $entered == "CL") { + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else { + // find the member + $lookups = AutoLoader::ListModules('MemberLookup', True); + foreach($lookups as $class){ + if (!class_exists($class)) continue; + $obj = new $class(); + if(is_numeric($entered) && !$obj->handle_numbers()) + continue; + elseif(!is_numeric($entered) && !$obj->handle_text()) + continue; + elseif(is_numeric($entered)){ + $chk = $obj->lookup_by_number($entered); + if ($chk['url'] !== False){ + $this->change_page($chk['url']); + return False; + } + foreach($chk['results'] as $key=>$val) + $this->results[$key] = $val; + } + elseif(!is_numeric($entered)){ + $chk = $obj->lookup_by_text($entered); + if ($chk['url'] !== False){ + $this->change_page($chk['url']); + return False; + } + foreach($chk['results'] as $key=>$val) + $this->results[$key] = $val; + } + } + $this->submitted = True; + } + + // if theres only 1 match don't show the memlist + // when it's the default non-member account OR + // when name verification is disabled + if (count($this->results) == 1 && + ($CORE_LOCAL->get("verifyName")==0 || $entered == $CORE_LOCAL->get('defaultNonMem'))) { + $key = array_pop(array_keys($this->results)); + list($memberID, $personNum) = explode('::',$key); + } + + // we have exactly one row and + // don't need to confirm any further + if ($memberID !== False && $personNum !== False){ + $db_a = Database::pDataConnect(); + $query = $db_a->prepare_statement('SELECT CardNo, personNum, + LastName, FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type, + memType,staff,SSI,Purchases,NumberOfChecks,memCoupons, + blueLine,Shown,id FROM custdata WHERE CardNo=? + AND personNum=?'); + $result = $db_a->exec_statement($query,array($memberID, $personNum)); + $row = $db_a->fetch_row($result); + PrehLib::setMember($row["CardNo"], $personNum, $row); + + // WEFC_Toronto: If a Member Card # was entered when the choice from the list was made, + // add the memberCards record. + if ( $CORE_LOCAL->get('store') == "WEFC_Toronto" ) { + $mmsg = ""; + if ( isset($_REQUEST['memberCard']) && $_REQUEST['memberCard'] != "" ) { + $memberCard = $_REQUEST['memberCard']; + if ( !is_numeric($memberCard) || strlen($memberCard) > 5 || $memberCard == 0 ) { + $mmsg = "Bad Member Card# format >{$memberCard}<"; + } + else { + $upc = sprintf("00401229%05d", $memberCard); + // Check that it isn't already there, perhaps for someone else. + $mQ = "SELECT card_no FROM memberCards where card_no = {$row['CardNo']}"; + $mResult = $db_a->query($mQ); + $mNumRows = $db_a->num_rows($mResult); + if ( $mNumRows > 0 ) { + $mmsg = "{$row['CardNo']} is already associated with another Member Card"; + } + else { + $mQ = "INSERT INTO memberCards (card_no, upc) VALUES ({$row['CardNo']}, '$upc')"; + $mResult = $db_a->query($mQ); + if ( !$mResult ) { + $mmsg = "Linking membership to Member Card failed."; + } + } + } + } + if ( $mmsg != "" ) { + // Prepare to display the error. + $this->temp_message = $mmsg; + return True; + } + // /WEFC_Toronto bit. + } + + // don't bother with unpaid balance check if there is no balance + if ($entered != $CORE_LOCAL->get("defaultNonMem") && $CORE_LOCAL->get('balance') > 0){ + $unpaid = PrehLib::check_unpaid_ar($row["CardNo"]); + if ($unpaid) + $this->change_page($this->page_url."gui-modules/UnpaidAR.php"); + else + $this->change_page($this->page_url."gui-modules/pos2.php"); + } + else + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // Prepare to display the memlist (list to choose from). + $this->temp_message = ""; + return True; + + } // END preprocess() FUNCTION + + function head_content(){ + global $CORE_LOCAL; + if (count($this->results) > 0){ + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#search').focus();\n"); + } else { + $this->default_parsewrapper_js('reginput','selectform'); + $this->add_onload_command("\$('#reginput').focus();\n"); + } + ?> + <script type="text/javascript"> + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').each(function(){ + $(this).val(''); + }); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + $message = $this->temp_message; + + echo "<div class=\"baseHeight\">" + ."<form id=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">"; + + // First check for a problem found in preprocess. + if ( $message != "" ) { + echo " + <div class=\"colored centeredDisplay\"> + <span class=\"larger\"> + {$message}<br />". + _("enter member number or name"). + "</span> + <input type=\"text\" name=\"search\" size=\"15\" + onblur=\"\$('#reginput').focus();\" id=\"reginput\" /> + <br />press [enter] to cancel + </div>"; + } + /* for no results, just throw up a re-do + * otherwise, put results in a select box + */ + elseif (count($this->results) < 1){ + echo " + <div class=\"colored centeredDisplay\"> + <span class=\"larger\">"; + if (!$this->submitted) + echo _("member search")."<br />"._("enter member number or name"); + else + echo _("no match found")."<br />"._("next search or member number"); + echo "</span> + <input type=\"text\" name=\"search\" size=\"15\" + onblur=\"\$('#reginput').focus();\" id=\"reginput\" /> + <br /> + press [enter] to cancel + </div>"; + } + else { + echo "<div class=\"listbox\">" + ."<select name=\"search\" size=\"15\" " + ."onblur=\"\$('#search').focus();\" ondblclick=\"document.forms['selectform'].submit();\" id=\"search\">"; + + $selectFlag = 0; + // I don't know what !$entered was supposed to do here, + // but the variable isn't defined + if (False && $CORE_LOCAL->get("memlistNonMember") == 1) { + echo "<option value='3::1' selected> 3 " + ."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer"; + $selectFlag = 1; + } + + foreach($this->results as $optval => $label){ + echo '<option value="'.$optval.'"'; + if ($selectFlag == 0){ + echo ' selected'; + $selectFlag = 1; + } + echo '>'.$label.'</option>'; + } + echo "</select></div><!-- /.listbox -->" + ."<div class=\"listboxText coloredText centerOffset\">" + ._("use arrow keys to navigate")."<p>"._("clear to cancel")."</div><!-- /.listboxText coloredText .centerOffset -->" + ."<div class=\"clear\"></div>"; + + // A textbox for the Member Card number, to be added to the db for the selected member. + if ( $CORE_LOCAL->get('store') == "WEFC_Toronto" ) { + echo "<div style='text-align:left; margin-top: 0.5em;'> + <p style='margin: 0.2em 0em 0.2em 0em; font-size:0.8em;'>To link the member chosen above to a Member Card:</p>"; + echo "<span style='font-weight:bold;'>Member Card#:</span> <input name='memberCard' id='memberCard' width='20' title='The digits after 01229, no leading zeroes, not the final, small check-digit' />"; + echo "<p style='margin-top: 0.2em; font-size:0.8em;'>If the back of the card has: '4 01229 00125 7' enter 125 + <br />Then the card should be recognized in the scan.</p>"; + echo "</div>"; + } + + } + echo "</form></div>"; + } // END body_content() FUNCTION + +// /class memlist +} + +new memlist(); + +?> diff --git a/pos/is4c-nf/gui-modules/memlist_cards.php b/pos/is4c-nf/gui-modules/memlist_cards.php new file mode 100644 index 000000000..4a41f8f07 --- /dev/null +++ b/pos/is4c-nf/gui-modules/memlist_cards.php @@ -0,0 +1,347 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 24Mar2013 Eric Lee Removed some woodshed comments before saving to github. + * 5Oct2012 Eric Lee A specialized WEFC_Toronto utility to update Fannie and lanes + * with Member Card numbers linked to members in a CiviCRM database. + + * 5Oct2012 Eric Lee Added: + * + A WEFC_Toronto-only chunk for collecting Member Card# + * + A general facility for displaying an error encountered in preprocess() + * in body_content() using temp_message. + +*/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class memlist_cards extends NoInputPage { + + var $temp_result; + var $temp_num_rows; + var $entered; + var $db; + var $temp_message; + + function preprocess(){ + global $CORE_LOCAL; + + // set variable ahead of time + // so we know if lookup found no one + // vs. lookup didn't happen + $this->temp_num_rows = -1; + + $entered = ""; + if (isset($_REQUEST['idSearch']) && strlen($_REQUEST['idSearch']) > 0){ + $entered = $_REQUEST['idSearch']; + } + elseif (isset($_REQUEST['search'])){ + $entered = strtoupper(trim($_REQUEST["search"])); + $entered = str_replace("'", "''", $entered); + } + else return True; + + if (substr($entered, -2) == "ID") $entered = substr($entered, 0, strlen($entered) - 2); + + $personNum = 1; + $selected_name = False; + // Values of memlist items are "CardNo::personNum" + if (strstr($entered,"::") !== False){ + $tmp = explode("::",$entered); + $entered = $tmp[0]; + $personNum = $tmp[1]; + $selected_name = True; + } + + // No input available, stop + if (!$entered || strlen($entered) < 1 || $entered == "CL") { + $this->change_page($this->page_url."gui-modules/memlist_cards.php"); + return False; + } + + $memberID = $entered; + $db_a = Database::pDataConnect(); + + if (!is_numeric($entered)) { + $query = "select CardNo,personNum,LastName,FirstName from custdata + where LastName like '".$entered."%' order by LastName, FirstName"; + } + else { + $query = "select CardNo,personNum,LastName,FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type,memType,staff, + SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown,id from custdata + where CardNo = '".$entered."' order by personNum"; + } + + $result = $db_a->query($query); + $num_rows = $db_a->num_rows($result); + + // if theres only 1 match don't show the memlist + if ($num_rows == 1) { + $selected_name = True; + $personNum = 1; + } + + // if there's one result and either + // a. it's the default nonmember account or + // b. it's been confirmed in the select box + // then set the member number + // proceed/return to the appropriate next page + if ( ($num_rows == 1 && $entered == $CORE_LOCAL->get("defaultNonMem")) + || + (is_numeric($entered) && is_numeric($personNum) && $selected_name) ) { + $row = $db_a->fetch_array($result); + // Don't want to affect the current trans. Will it still work? + // PrehLib::setMember($row["CardNo"], $personNum,$row); + + // WEFC_Toronto: If a Member Card # was entered when the choice from the list was made, + // add the memberCards record. + if ( $CORE_LOCAL->get('store') == "WEFC_Toronto" ) { + $mmsg = ""; + if ( isset($_REQUEST['memberCard']) && $_REQUEST['memberCard'] != "" ) { + $memberCard = $_REQUEST['memberCard']; + $upc = sprintf("00401229%05d", $memberCard); + $card_no = $row['CardNo']; + + // Get the Member Card # from CiviCRM. + // By looking up card_no in Civi members to get the contact id and use contact_id to get mcard. + // Can't do that because MySQL on Civi will only allow access from pos and posdev. + // Have to get op to enter mcard# again. + + if ( !is_numeric($memberCard) || strlen($memberCard) > 5 || $memberCard == 0 ) { + $mmsg .= "<br />Bad Member Card# format >{$memberCard}<"; + } + else { + /* Check that it isn't already in use, perhaps for someone else. + */ + $masterLane = $CORE_LOCAL->get('laneno'); + $currentLane = $masterLane; + $mQ = "SELECT card_no FROM memberCards where card_no = $card_no"; + $mResult = $db_a->query($mQ); + $mNumRows = $db_a->num_rows($mResult); + if ( $mNumRows > 0 ) { + $mmsg .= "<br />On lane $currentLane {$row['CardNo']} is already associated with a Member Card"; + } + else { + $mQ = "INSERT INTO memberCards (card_no, upc) VALUES ({$row['CardNo']}, '$upc')"; + $mResult = $db_a->query($mQ); + if ( !$mResult ) { + $mmsg .= "<br />On lane $currentLane linking membership to Member Card failed."; + } + } + + // Do other lane. + $otherLane = ($masterLane == 1) ? 2 : 1; + $currentLane = $otherLane; + $isLAN = 1; + if ( $isLAN ) { + $LANE = "10.0.0.6$otherLane"; + $LANE_PORT = "3306"; + } + else { + $LANE = "wefc.dyndns.org"; + $LANE_PORT = "5066$otherLane"; + } + $LANE_USER = "root"; + $LANE_PW = "wefc1229"; + $LANE_DB = "opdata"; + $db_b = new mysqli("$LANE", "$LANE_USER", "$LANE_PW", "$LANE_DB", "$LANE_PORT"); + if ( $db_b->connect_error != "" ) { + $mmsg .= "<br />Connection to lane $currentLane failed >". $db_b->connect_error ."<"; + } else { + $mQ = "SELECT card_no FROM memberCards where card_no = $card_no"; + $mResult = $db_b->query("$mQ"); + $mNumRows = $mResult->$num_rows; + if ( $mNumRows > 0 ) { + $mmsg .= "<br />On lane $currentLane member $card_no is already associated with a Member Card"; + } + else { + $mQ = "INSERT INTO memberCards (card_no, upc) VALUES ($card_no, '$upc')"; + $mResult = $db_b->query($mQ); + if ( !$mResult ) { + $mmsg .= "<br />On lane $currentLane linking membership to Member Card failed."; + } + } + } + $db_b->close(); + } + } + else { + $mmsg .= "<br />Member Card# absent or empty."; + } + if ( $mmsg != "" ) { + // Prepare to display the error. + $this->temp_result = $result; + $this->temp_num_rows = $num_rows; + $this->entered = $entered; + $this->db = $db_a; + $this->temp_message = preg_replace("/^<br />/", "", $mmsg); + return True; + } + // /WEFC_Toronto bit. + } + + if ($entered != $CORE_LOCAL->get("defaultNonMem") && PrehLib::check_unpaid_ar($row["CardNo"])) + $this->change_page($this->page_url."gui-modules/UnpaidAR.php"); + else + $this->change_page($this->page_url."gui-modules/memlist_cards.php"); + return False; + } + + // Prepare to display the memlist (list to choose from). + $this->temp_result = $result; + $this->temp_num_rows = $num_rows; + $this->entered = $entered; + $this->db = $db_a; + $this->temp_message = ""; + return True; + + } // END preprocess() FUNCTION + + function head_content(){ + global $CORE_LOCAL; + if ($this->temp_num_rows > 0){ + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#search').focus();\n"); + } else { + $this->default_parsewrapper_js('reginput','selectform'); + $this->add_onload_command("\$('#reginput').focus();\n"); + } + ?> + <script type="text/javascript"> + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').each(function(){ + $(this).val(''); + }); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + $num_rows = $this->temp_num_rows; + $result = $this->temp_result; + $entered = $this->entered; + $db = $this->db; + $message = $this->temp_message; + + echo "<div class=\"baseHeight\">" + ."<form id=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">"; + + // First check for a problem found in preprocess. + if ( $message != "" ) { + echo " + <div class=\"colored centeredDisplay\"> + <span class=\"larger\"> + {$message}<br />". + _("enter member number or name"). + "</span> + <input type=\"text\" name=\"search\" size=\"15\" + onblur=\"\$('#reginput').focus();\" id=\"reginput\" /> + <br />press [enter] to cancel + </div>"; + } + /* for no results, just throw up a re-do + * otherwise, put results in a select box + */ + elseif ($num_rows < 1) { + echo " + <div class=\"colored centeredDisplay\"> + <span class=\"larger\">"; + if ($num_rows == -1) + echo _("member search")."<br />"._("enter member number or name"); + else + echo _("no match found")."<br />"._("next search or member number"); + echo "</span> + <input type=\"text\" name=\"search\" size=\"15\" + onblur=\"\$('#reginput').focus();\" id=\"reginput\" /> + <br /> + press [enter] to cancel + </div>"; + } + else { + echo "<div class=\"listbox\">" + ."<select name=\"search\" size=\"15\" " + ."onblur=\"\$('#search').focus();\" ondblclick=\"document.forms['selectform'].submit();\" id=\"search\">"; + + $selectFlag = 0; + if (!is_numeric($entered) && $CORE_LOCAL->get("memlistNonMember") == 1) { + echo "<option value='3::1' selected> 3 " + ."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer"; + $selectFlag = 1; + } + + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + if( $i == 0 && $selectFlag == 0) { + $selected = "selected"; + } else { + $selected = ""; + } + echo "<option value='".$row["CardNo"]."::".$row["personNum"]."' ".$selected.">" + .$row["CardNo"]." ".$row["LastName"].", ".$row["FirstName"]."\n"; + } + echo "</select></div><!-- /.listbox -->" + ."<div class=\"listboxText coloredText centerOffset\">" + ._("use arrow keys to navigate")."<p>"._("clear to cancel")."</div><!-- /.listboxText coloredText .centerOffset -->" + ."<div class=\"clear\"></div>"; + + // A textbox for the Member Card number, to be added to the db for the selected member. + if ( $CORE_LOCAL->get('store') == "WEFC_Toronto" ) { + echo "<div style='text-align:left; margin-top: 0.5em;'> + <p style='margin: 0.2em 0em 0.2em 0em; font-size:0.8em;'>To link the member chosen above to a Member Card:</p>"; + echo "<span style='font-weight:bold;'>Member Card#:</span> <input name='memberCard' id='memberCard' width='20' title='The digits after 01229, no leading zeroes, not the final, small check-digit' />"; + echo "<p style='margin-top: 0.2em; font-size:0.8em;'>If the back of the card has: '4 01229 00125 7' enter 125 + "; + echo "</div>"; + } + + } + echo "</form></div>"; + } // END body_content() FUNCTION + +// /class memlist +} + +new memlist_cards(); + +?> diff --git a/pos/is4c-nf/gui-modules/mgrlogin.php b/pos/is4c-nf/gui-modules/mgrlogin.php new file mode 100644 index 000000000..d1ae35af6 --- /dev/null +++ b/pos/is4c-nf/gui-modules/mgrlogin.php @@ -0,0 +1,156 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class mgrlogin extends NoInputPage { + + function preprocess(){ + if (isset($_REQUEST['input'])){ + $arr = $this->mgrauthenticate($_REQUEST['input']); + echo JsonLib::array_to_json($arr); + return False; + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript"> + function submitWrapper(){ + var passwd = $('#reginput').val(); + $.ajax({ + url: '<?php echo $_SERVER['PHP_SELF']; ?>', + data: 'input='+passwd, + type: 'get', + cache: false, + dataType: 'json', + error: function(data,st,xmlro){ + }, + success: function(data){ + if (data.cancelOrder){ + $.ajax({ + url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-end.php', + type: 'get', + data: 'receiptType=cancelled', + cache: false, + success: function(data2){ + location = '<?php echo $this->page_url; ?>gui-modules/pos2.php'; + } + }); + } + else if (data.giveUp){ + location = '<?php echo $this->page_url; ?>gui-modules/pos2.php'; + } + else { + $('div#cancelLoginBox').removeClass('coloredArea'); + $('div#cancelLoginBox').addClass('errorColoredArea'); + $('span.larger').html(data.heading); + $('span#localmsg').html(data.msg); + $('#reginput').val(''); + $('#reginput').focus(); + } + } + }); + return false; + } + </script> + <?php + $this->default_parsewrapper_js(); + $this->scanner_scale_polling(True); + } + + function body_content(){ + global $CORE_LOCAL; + $this->add_onload_command("\$('#reginput').focus();\n"); + ?> + <div class="baseHeight"> + <div id="cancelLoginBox" class="coloredArea centeredDisplay"> + <span class="larger"> + <?php echo _("confirm cancellation"); ?> + </span><br /> + <form name="form" id="formlocal" method="post" + autocomplete="off" onsubmit="return submitWrapper();"> + <input type="password" name="reginput" tabindex="0" + onblur="$('#reginput').focus();" id="reginput" /> + </form> + <p> + <span id="localmsg"><?php echo _("please enter manager password"); ?></span> + </p> + </div> + </div> + <?php + } // END true_body() FUNCTION + + function mgrauthenticate($password){ + global $CORE_LOCAL; + + $ret = array( + 'cancelOrder'=>false, + 'msg'=>_('password invalid'), + 'heading'=>_('re-enter manager password'), + 'giveUp'=>false + ); + + $password = strtoupper($password); + $password = str_replace("'","",$password); + + if (!isset($password) || strlen($password) < 1 || $password == "CL") { + $ret['giveUp'] = true; + return $ret; + } + elseif (!is_numeric($password)) { + return $ret; + } + elseif ($password > 9999 || $password < 1) { + return $ret; + } + + $db = Database::pDataConnect(); + $priv = sprintf("%d",$CORE_LOCAL->get("SecurityCancel")); + $query = "select emp_no, FirstName, LastName from employees where EmpActive = 1 and frontendsecurity >= $priv " + ."and (CashierPassword = ".$password." or AdminPassword = ".$password.")"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows != 0) { + $this->cancelorder(); + $ret['cancelOrder'] = true; + } + + return $ret; + } + + function cancelorder() { + global $CORE_LOCAL; + + $CORE_LOCAL->set("plainmsg",_("transaction cancelled")); + UdpComm::udpSend("rePoll"); + $CORE_LOCAL->set("ccTermOut","reset"); + } +} + +new mgrlogin(); +?> diff --git a/pos/is4c-nf/gui-modules/noinput.php b/pos/is4c-nf/gui-modules/noinput.php new file mode 100644 index 000000000..fcac48ccf --- /dev/null +++ b/pos/is4c-nf/gui-modules/noinput.php @@ -0,0 +1,56 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("BasicPage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/BasicPage.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class noinput extends BasicPage { + + function body_content(){ + global $CORE_LOCAL; + ?> + <div id="inputArea"> + <div class="inputform">&nbsp;</div> + <div class="notices"> + <?php + $time = strftime("%m/%d/%y %I:%M %p", time()); + + if ($CORE_LOCAL->get("training") == 1) { + echo "<span class=\"text\">training </span>" + ."<img src='/graphics/BLUEDOT.GIF'>&nbsp;&nbsp:&nbsp;"; + } + elseif ($CORE_LOCAL->get("standalone") == 0) { + echo "<img src='/graphics/GREENDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + else { + echo "<span class=\"text\">stand alone</span>" + ."<img src='/graphics/REDDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + ?> + </div> + </div> + <?php + } // END body_content() FUNCTION +} + +new noinput(); diff --git a/pos/is4c-nf/gui-modules/nslogin.php b/pos/is4c-nf/gui-modules/nslogin.php new file mode 100644 index 000000000..c9bd92e2c --- /dev/null +++ b/pos/is4c-nf/gui-modules/nslogin.php @@ -0,0 +1,87 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class nslogin extends NoInputPage { + + var $color; + var $heading; + var $msg; + + function preprocess(){ + $this->color ="coloredArea"; + $this->heading = _("enter manager password"); + $this->msg = _("confirm no sales"); + + if (isset($_REQUEST['reginput'])){ + if (strtoupper($_REQUEST['reginput']) == "CL"){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + elseif (Authenticate::ns_check_password($_REQUEST['reginput'])){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else { + $this->color ="errorColoredArea"; + $this->heading = _("re-enter manager password"); + $this->msg = _("invalid password"); + } + } + + return True; + } + + function head_content(){ + $this->default_parsewrapper_js('reginput','nsform'); + $this->scanner_scale_polling(True); + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="<?php echo $this->color; ?> centeredDisplay"> + <span class="larger"> + <?php echo $this->heading ?> + </span><br /> + <form name="form" id="nsform" method="post" autocomplete="off" + action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input type="password" name="reginput" tabindex="0" + onblur="$('#reginput').focus();" id="reginput" /> + </form> + <p> + <?php echo $this->msg ?> + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#reginput').focus();\n"); + } // END true_body() FUNCTION + +} + +new nslogin(); + +?> diff --git a/pos/is4c-nf/gui-modules/paycardMsgCVV2.php b/pos/is4c-nf/gui-modules/paycardMsgCVV2.php new file mode 100644 index 000000000..56ae92799 --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardMsgCVV2.php @@ -0,0 +1,77 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +if (!class_exists("MainFramePage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/MainFramePage.php"); +if (!function_exists("paycard_reset")) require_once($_SESSION["INCLUDE_PATH"]."/cc-modules/lib/paycardLib.php"); +if (!function_exists("changeCurrentPage")) require_once($_SESSION["INCLUDE_PATH"]."/gui-base.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class paycardMsgCVV2 extends MainFramePage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_POST['input'])) { + $input = strtoupper(trim($_POST['input'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + paycard_reset(); + changeCurrentPageJS("/gui-modules/pos2.php"); + return False; + } + + // no input is confirmation to proceed + if( $input != "" && is_numeric($input)) { + $CORE_LOCAL->set("paycard_cvv2",$input); + changeCurrentPageJS("/paycardAuthorize.php"); + return False; + } + // if we're still here, we haven't accepted a valid amount yet; display prompt again + } // post? + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <form action="/gui-modules/paycardMsgCVV2.php" method=post name="form1" tabindex="0"> + <input type=hidden name="input" size=20> + </form> + <div class="baseHeight"> + <?php + // generate message to print + paycard_msgBox($type,"Requires CVV2", + "Enter Verification # from back of card","[clear] to cancel"); + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <script type="text/javascript"> + var msgrepeat=2; + </script> + <?php + } +} + +new paycardMsgCVV2(0,1); diff --git a/pos/is4c-nf/gui-modules/paycardSignature.php b/pos/is4c-nf/gui-modules/paycardSignature.php new file mode 100644 index 000000000..ee3268c79 --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardSignature.php @@ -0,0 +1,80 @@ +<?php +/******************************************************************************* + + Copyright 2001, 20010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("MainFramePage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/MainFramePage.php"); +if (!function_exists("changeCurrentPage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-base.php"); +if (!function_exists("printfooter")) include_once($_SESSION["INCLUDE_PATH"]."/lib/drawscreen.php"); +if (!function_exists("receipt")) include_once($_SESSION["INCLUDE_PATH"]."/lib/clientscripts.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class paycardSignature extends MainFramePage{ + + function preprocess(){ + global $CORE_LOCAL; + // check for input + if( isset($_POST["input"])) { + $input = strtoupper(trim($_POST["input"])); + $done = False; + if( $input == "" || $input == "CL") { // [enter] or [clear] skips this step + $done = True; + } + else if (strlen($input) > 0){ + $file = $_POST['input']; + $saveas = $_SESSION["INCLUDE_PATH"]."/graphics/SigImages/".basename($_POST['input']); + copy($_POST['input'],$saveas); + unlink($_POST['input']); + $CORE_LOCAL->set("CapturedSigFile",basename($saveas)); + if (file_exists($saveas)) + $done = True; + } + + if ($done){ + if ($CORE_LOCAL->get("SigSlipType") == "") + $CORE_LOCAL->set("SigSlipType","ccSlip"); + receipt($CORE_LOCAL->get("SigSlipType")); + + changeCurrentPageJS("/gui-modules/paycardSuccess.php"); + } + } + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <form action="paycardSignature.php" method=post name="form1" tabindex="0"> + <input type=hidden name="input" size=20> + </form> + <div class="baseHeight"> + <?php + $header = "Signature"; + boxMsg("Waiting for signature<br />Press [Enter] to skip this step",$header); + $CORE_LOCAL->set("msgrepeat",2); + $CORE_LOCAL->set("ccTermOut","sig"); + ?> + </div> + <?php + } +} + +new paycardSignature(0,1); diff --git a/pos/is4c-nf/gui-modules/paycardSuccess.php b/pos/is4c-nf/gui-modules/paycardSuccess.php new file mode 100755 index 000000000..f8709adc6 --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardSuccess.php @@ -0,0 +1,214 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class paycardSuccess extends BasicPage { + + function preprocess(){ + global $CORE_LOCAL; + + /* ajax poll to check for sig img */ + if (isset($_REQUEST['poll'])){ + $attempt = $this->sig_check(); + if ($attempt === False) + echo "notfound"; + else + echo $attempt; + return False; + } + + // check for input + if(isset($_REQUEST["reginput"])) { + $input = strtoupper(trim($_POST["reginput"])); + + $mode = $CORE_LOCAL->get("paycard_mode"); + $type = $CORE_LOCAL->get("paycard_type"); + $tender_id = $CORE_LOCAL->get("paycard_id"); + if( $input == "" || $input == "CL") { // [enter] or [clear] exits this screen + // remember the mode, type and transid before we reset them + $CORE_LOCAL->set("boxMsg",""); + // store signature if present + // if this is just a signature request, not + // a full cc/gift transaction, associate + // it with last trans_id + if ($CORE_LOCAL->get("SigCapture") != "" && + $CORE_LOCAL->get("paycard_amount") >= $CORE_LOCAL->get("CCSigLimit")){ + $db = Database::tDataConnect(); + if ($tender_id == 0) $tender_id = $CORE_LOCAL->get("LastID"); + $sigQ = sprintf("INSERT INTO CapturedSignature VALUES + (%s,%d,%d,%d,%d,'%s','%s')", + $db->now(),$CORE_LOCAL->get("CashierNo"), + $CORE_LOCAL->get("laneno"), + $CORE_LOCAL->get("transno"), + $tender_id, + substr($CORE_LOCAL->get("CapturedSigFile"),-3), + $db->escape(file_get_contents($CORE_LOCAL->get("CapturedSigFile"))) + ); + $db->query($sigQ); + $CORE_LOCAL->set("CapturedSigFile",""); + $CORE_LOCAL->set("SigSlipType",""); + $this->sig_check(True); + } + + PaycardLib::paycard_reset(); + UdpComm::udpSend("termReset"); + $CORE_LOCAL->set("strRemembered","TO"); + $CORE_LOCAL->set("msgrepeat",1); + + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if ($mode == PaycardLib::PAYCARD_MODE_AUTH && $input == "VD"){ + $this->change_page($this->page_url."gui-modules/paycardboxMsgVoid.php"); + return False; + } + } + /* shouldn't happen unless session glitches + but getting here implies the transaction + succeeded */ + $var = $CORE_LOCAL->get("boxMsg"); + if (empty($var)){ + $CORE_LOCAL->set("boxMsg", + "<b>Approved</b><font size=-1> + <p>&nbsp; + <p>[enter] to continue + <br>[void] to cancel and void + </font>"); + } + return True; + } + + function sig_check($clear=False){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("SigCapture")=="") return False; + + $deviceClass = $CORE_LOCAL->get("SigCapture"); + $device = new $deviceClass(); + if (!is_object($device)) return False; + + if ($clear) + $device->WriteToScale("reset"); + else { + $img = $device->poll("getsig"); + $img = str_replace("\\","/",$img); + $CORE_LOCAL->set("CapturedSigFile",$device->getpath().$img); + } + + return $CORE_LOCAL->get("CapturedSigFile"); + } + + function head_content(){ + ?> + <script type="text/javascript"> + function submitWrapper(){ + var str = $('#reginput').val(); + if (str.toUpperCase() == 'RP'){ + $.ajax({url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-end.php', + cache: false, + type: 'post', + data: 'receiptType='+$('#rp_type').val(), + success: function(data){} + }); + $('#reginput').val(''); + return false; + } + return true; + } + function getImg(){ + $.ajax({url: 'paycardSuccess.php', + cache: false, + type: 'post', + data: 'poll=1', + success: setImg + }); + } + function setImg(ret_data){ + if (ret_data){ + var ext = ret_data.substr(ret_data.lastIndexOf('.') + 1); + if (ext == "bmp"){ + $('#sigimg').attr('src',ret_data); + } + else{ + setTimeout('getImg()',500); + } + } + else + setTimeout('getImg()',500); + } + </script> + <?php + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header("onsubmit=\"return submitWrapper();\" action=\"{$this->page_url}gui-modules/paycardSuccess.php\""); + ?> + <div class="baseHeight"> + <?php + /* + $header = "Wedge - Payment Card"; + if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_CREDIT) $header = "Wedge - Credit Card"; + else if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_GIFT) $header = "Wedge - Gift Card"; + else $CORE_LOCAL->set("boxMsg","Please verify cardholder signature"); + */ + // show signature if available + if ($CORE_LOCAL->get("SigCapture") != "" && + $CORE_LOCAL->get("paycard_amount") >= $CORE_LOCAL->get("CCSigLimit")){ + $img = $CORE_LOCAL->get("CapturedSigFile"); + if(!is_file($img)) $img=""; + $newstr = "<img src=\"$img\" width=200 id=\"sigimg\" style=\"border:solid 1px black;\" />"; + $msg = "<b>Approved</b><font size=-1> + <p>$newstr + <p>[enter] to continue + <br>[void] to cancel and void"; + $CORE_LOCAL->set("boxMsg",$msg); + $this->add_onload_command("setTimeout('getImg()',500);"); + } + echo DisplayLib::boxMsg($CORE_LOCAL->get("boxMsg"),"",True); + $CORE_LOCAL->set("msgrepeat",2); + //UdpComm::udpSend('goodBeep'); + UdpComm::udpSend('termApproved'); + ?> + </div> + <?php + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + + $rp_type = ''; + if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_GIFT) { + if( $CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_BALANCE) { + $rp_type = "gcBalSlip"; + } else { + $rp_type ="gcSlip"; + } + } else if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_CREDIT) { + $rp_type = "ccSlip"; + } + printf("<input type=\"hidden\" id=\"rp_type\" value=\"%s\" />",$rp_type); + } +} + +new paycardSuccess(); diff --git a/pos/is4c-nf/gui-modules/paycardboxMsgAuth.php b/pos/is4c-nf/gui-modules/paycardboxMsgAuth.php new file mode 100755 index 000000000..babb3daa1 --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardboxMsgAuth.php @@ -0,0 +1,123 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + Modifications copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class paycardboxMsgAuth extends PaycardProcessPage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $CORE_LOCAL->set("ccTermOut","resettotal:". + str_replace(".","",sprintf("%.2f",$CORE_LOCAL->get("amtdue")))); + $st = MiscLib::sigTermObject(); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("CachePanEncBlock",""); + $CORE_LOCAL->set("CachePinEncBlock",""); + $CORE_LOCAL->set("CacheCardType",""); + UdpComm::udpSend("termReset"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if ($input == ""){ + if ($this->validate_amount()){ + $this->action = "onsubmit=\"return false;\""; + $this->add_onload_command("paycard_submitWrapper();"); + } + } + else if( $input != "" && substr($input,-2) != "CL") { + // any other input is an alternate amount + $CORE_LOCAL->set("paycard_amount","invalid"); + if( is_numeric($input)) + $CORE_LOCAL->set("paycard_amount",$input/100); + } + // if we're still here, we haven't accepted a valid amount yet; display prompt again + } // post? + return True; + } + + function validate_amount(){ + global $CORE_LOCAL; + $amt = $CORE_LOCAL->get("paycard_amount"); + $due = $CORE_LOCAL->get("amtdue"); + if( !is_numeric($amt) || abs($amt) < 0.005) { + } else if( $amt > 0 && $due < 0) { + } else if( $amt < 0 && $due > 0) { + } else if( abs($amt) > abs($due) && $CORE_LOCAL->get("CacheCardType") != "DEBIT" && $CORE_LOCAL->get("CacheCardType") != "EBTCASH") { + } else { + return True; + } + return False; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + // generate message to print + $type = $CORE_LOCAL->get("paycard_type"); + $mode = $CORE_LOCAL->get("paycard_mode"); + $amt = $CORE_LOCAL->get("paycard_amount"); + $due = $CORE_LOCAL->get("amtdue"); + if( !is_numeric($amt) || abs($amt) < 0.005) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount: $amt $due", + "Enter a different amount","[clear] to cancel"); + } else if( $amt > 0 && $due < 0) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a negative amount","[clear] to cancel"); + } else if( $amt < 0 && $due > 0) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a positive amount","[clear] to cancel"); + } else if( abs($amt) > abs($due) && $CORE_LOCAL->get("CacheCardType") != "DEBIT" && $CORE_LOCAL->get("CacheCardType") != "EBTCASH") { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a lesser amount","[clear] to cancel"); + } else if( $amt > 0) { + $msg = "Tender ".PaycardLib::paycard_moneyFormat($amt); + if ($CORE_LOCAL->get("CacheCardType") != "") + $msg .= " as ".$CORE_LOCAL->get("CacheCardType"); + echo PaycardLib::paycard_msgBox($type,$msg."?","","[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } else if( $amt < 0) { + echo PaycardLib::paycard_msgBox($type,"Refund ".PaycardLib::paycard_moneyFormat($amt)."?","","[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } else { + echo PaycardLib::paycard_errBox($type,"Invalid Entry", + "Enter a different amount","[clear] to cancel"); + } + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +new paycardboxMsgAuth(); diff --git a/pos/is4c-nf/gui-modules/paycardboxMsgBalance.php b/pos/is4c-nf/gui-modules/paycardboxMsgBalance.php new file mode 100644 index 000000000..2c23688a4 --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardboxMsgBalance.php @@ -0,0 +1,68 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class paycardboxMsgBalance extends PaycardProcessPage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + PaycardLib::paycard_reset(); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // when checking balance, no input is confirmation to proceed + if( $input == "") { + $this->add_onload_command("paycard_submitWrapper();"); + $this->action = "onsubmit=\"return false;\""; + } + // any other input is unrecognized, display prompt again + } // post? + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + echo PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Check Card Balance?", + "If you proceed, you <b>cannot void</b> any previous action on this card!", + "[enter] to continue<br>[clear] to cancel"); + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +new paycardboxMsgBalance(); diff --git a/pos/is4c-nf/gui-modules/paycardboxMsgGift.php b/pos/is4c-nf/gui-modules/paycardboxMsgGift.php new file mode 100644 index 000000000..67ae2b19d --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardboxMsgGift.php @@ -0,0 +1,105 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class paycardboxMsgGift extends PaycardProcessPage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + PaycardLib::paycard_reset(); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // when (de)activating/adding-value, double check that the current amount is acceptable + // before checking input (similar logic is later when generating the message) + $amtValid = false; + $amt = $CORE_LOCAL->get("paycard_amount"); + if( !is_numeric($amt) || $amt < 0.005) { + } else { + // all errors are caught above; here, the amount is okay + $amtValid = true; + } + + // no input is confirmation to proceed + if( $input == "" && $amtValid) { + $this->add_onload_command("paycard_submitWrapper();"); + $this->action = "onsubmit=\"return false;\""; + } + else if( $input != "" && substr($input,-2) != "CL") { + // any other input is an alternate amount + $CORE_LOCAL->set("paycard_amount","invalid"); + if( is_numeric($input)) + $CORE_LOCAL->set("paycard_amount",$input/100); + } + // if we're still here, we haven't accepted a valid amount yet; display prompt again + } // post? + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + // generate message to print + $type = $CORE_LOCAL->get("paycard_type"); + $mode = $CORE_LOCAL->get("paycard_mode"); + $amt = $CORE_LOCAL->get("paycard_amount"); + if( $amt == 0) { + if( $mode == PaycardLib::PAYCARD_MODE_ACTIVATE) + echo PaycardLib::paycard_msgBox($type,"Enter Activation Amount", + "Enter the amount to put on the card", + "[clear] to cancel"); + else if( $mode == PaycardLib::PAYCARD_MODE_ADDVALUE) + echo PaycardLib::paycard_msgBox($type,"Enter Add-Value Amount", + "Enter the amount to put on the card", + "[clear] to cancel"); + } else if( !is_numeric($amt) || $amt < 0.005) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a positive amount to put on the card", + "[clear] to cancel"); + } else if( $mode == PaycardLib::PAYCARD_MODE_ACTIVATE) { + echo PaycardLib::paycard_msgBox($type,"Activate ".PaycardLib::paycard_moneyFormat($amt)."?","", + "[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } else if( $mode == PaycardLib::PAYCARD_MODE_ADDVALUE) { + echo PaycardLib::paycard_msgBox($type,"Add Value ".PaycardLib::paycard_moneyFormat($amt)."?","", + "[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +new paycardboxMsgGift(0,1); diff --git a/pos/is4c-nf/gui-modules/paycardboxMsgVoid.php b/pos/is4c-nf/gui-modules/paycardboxMsgVoid.php new file mode 100755 index 000000000..81c581f24 --- /dev/null +++ b/pos/is4c-nf/gui-modules/paycardboxMsgVoid.php @@ -0,0 +1,112 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class paycardboxMsgVoid extends PaycardProcessPage { + + protected $mask_input = True; + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",'TO'); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + $continue = false; + // when voiding tenders, the input must be an FEC's passcode + if( $CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_VOID && $input != "" && substr($input,-2) != "CL") { + $sql = "select emp_no, FirstName, LastName from employees" . + " where EmpActive=1 and frontendsecurity>=11 and AdminPassword=".(int)$input; + $db = Database::pDataConnect(); + $result = $db->query($sql); + if( $db->num_rows($result) > 0) { + $CORE_LOCAL->set("adminP",$input); + $continue = true; + } + } + // when voiding items, no code is necessary, only confirmation + if( $CORE_LOCAL->get("paycard_mode") != PaycardLib::PAYCARD_MODE_VOID && $input == "") + $continue = true; + // go? + if( $continue) { + // send the request, then disable the form + $this->add_onload_command('paycard_submitWrapper();'); + $this->action = "onsubmit=\"return false;\""; + } + // if we're still here, display prompt again + } // post? + else if ($CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_AUTH){ + // call paycard_void on first load to set up + // transaction and check for problems + $id = $CORE_LOCAL->get("paycard_id"); + foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + $myObj = new $rpc(); + if ($myObj->handlesType($CORE_LOCAL->get("paycard_type"))){ + $ret = $myObj->paycard_void($id); + if (isset($ret['output']) && !empty($ret['output'])){ + $CORE_LOCAL->set("boxMsg",$ret['output']); + $this->change_page($this->page_url."gui-modules/boxMsg2.php"); + return False; + } + break; + } + } + } + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + // generate message to print + $type = $CORE_LOCAL->get("paycard_type"); + $mode = $CORE_LOCAL->get("paycard_mode"); + $amt = $CORE_LOCAL->get("paycard_amount"); + if( $mode == PaycardLib::PAYCARD_MODE_VOIDITEM) { + echo PaycardLib::paycard_msgBox($type,"Void " . PaycardLib::paycard_moneyFormat($amt) . " Gift Card?","","[enter] to continue voiding<br>[clear] to cancel the void"); + } else if( $amt > 0) { + echo PaycardLib::paycard_msgBox($type,"Void " . PaycardLib::paycard_moneyFormat($amt) . " Payment?","Please enter password then","[enter] to continue voiding or<br>[clear] to cancel the void"); + } else { + echo PaycardLib::paycard_msgBox($type,"Void " . PaycardLib::paycard_moneyFormat($amt) . " Refund?","Please enter password then","[enter] to continue voiding or<br>[clear] to cancel the void"); + } + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +new paycardboxMsgVoid(); diff --git a/pos/is4c-nf/gui-modules/pos2.ajax.php b/pos/is4c-nf/gui-modules/pos2.ajax.php new file mode 100644 index 000000000..0aef47066 --- /dev/null +++ b/pos/is4c-nf/gui-modules/pos2.ajax.php @@ -0,0 +1,112 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +session_cache_limiter('nocache'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class pos2 extends BasicPage { + + function head_content(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript" src="<?php echo $this->page_url; ?>js/ajax-parser.js"></script> + <script type="text/javascript"> + function submitWrapper(){ + var str = $('#reginput').val(); + runParser(str,'<?php echo $this->page_url; ?>'); + return false; + } + function parseWrapper(str){ + runParser(str,'<?php echo $this->page_url; ?>'); + } + function lockScreen(){ + location = '<?php echo $this->page_url; ?>gui-modules/login3.php'; + } + </script> + <?php + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header('onsubmit="return submitWrapper();"'); + if ($CORE_LOCAL->get("timeout") != "") + $this->add_onload_command("setTimeout('lockScreen()', ".$CORE_LOCAL->get("timeout").");\n"); + $this->add_onload_command("\$('#reginput').keydown(function(ev){ + switch(ev.keyCode){ + case 33: + \$('#reginput').val('U11'); + submitWrapper(); + break; + case 38: + \$('#reginput').val('U'); + submitWrapper(); + break; + case 34: + \$('#reginput').val('D11'); + submitWrapper(); + break; + case 40: + \$('#reginput').val('D'); + submitWrapper(); + break; + } + });\n"); + if ($CORE_LOCAL->get("msgrepeat") == 1) + $this->add_onload_command("submitWrapper();"); + ?> + <div class="baseHeight"> + <?php + + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("multiple",0); + $CORE_LOCAL->set("casediscount",0); + + // set memberID if not set already + if (!$CORE_LOCAL->get("memberID")) { + $CORE_LOCAL->set("memberID","0"); + } + + if ($CORE_LOCAL->get("plainmsg") && strlen($CORE_LOCAL->get("plainmsg")) > 0) { + echo DisplayLib::printheaderb(); + echo "<div class=\"centerOffset\">"; + echo DisplayLib::plainmsg($CORE_LOCAL->get("plainmsg")); + $CORE_LOCAL->set("plainmsg",0); + echo "</div>"; + } + else + echo DisplayLib::lastpage(); + + echo "</div>"; // end base height + + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + } // END body_content() FUNCTION +} + +new pos2(); + +?> diff --git a/pos/is4c-nf/gui-modules/pos2.php b/pos/is4c-nf/gui-modules/pos2.php new file mode 100755 index 000000000..ac1f8ffed --- /dev/null +++ b/pos/is4c-nf/gui-modules/pos2.php @@ -0,0 +1,299 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +session_cache_limiter('nocache'); + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class pos2 extends BasicPage { + + var $display; + + function preprocess(){ + global $CORE_LOCAL; + $this->display = ""; + + $sd = MiscLib::scaleObject(); + //$st = MiscLib::sigTermObject(); + + $entered = ""; + if (isset($_REQUEST["reginput"])) { + $entered = strtoupper(trim($_REQUEST["reginput"])); + } + + if (substr($entered, -2) == "CL") $entered = "CL"; + + if ($entered == "RI") $entered = $CORE_LOCAL->get("strEntered"); + + if ($CORE_LOCAL->get("msgrepeat") == 1 && $entered != "CL") { + $entered = $CORE_LOCAL->get("strRemembered"); + } + $CORE_LOCAL->set("strEntered",$entered); + + $json = array(); + if ($entered != ""){ + + if (in_array("Paycards",$CORE_LOCAL->get("PluginList"))){ + /* this breaks the model a bit, but I'm putting + * putting the CC parser first manually to minimize + * code that potentially handles the PAN */ + if($CORE_LOCAL->get("PaycardsCashierFacing")=="1" && substr($entered,0,9) == "PANCACHE:"){ + /* cashier-facing device behavior; run card immediately */ + $entered = substr($entered,9); + $CORE_LOCAL->set("CachePanEncBlock",$entered); + } + + $pe = new paycardEntered(); + if ($pe->check($entered)){ + $valid = $pe->parse($entered); + $entered = "PAYCARD"; + $CORE_LOCAL->set("strEntered",""); + $json = $valid; + } + + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("multiple",0); + } + + /* FIRST PARSE CHAIN: + * Objects belong in the first parse chain if they + * modify the entered string, but do not process it + * This chain should be used for checking prefixes/suffixes + * to set up appropriate $CORE_LOCAL variables. + */ + $parser_lib_path = $this->page_url."parser-class-lib/"; + if (!is_array($CORE_LOCAL->get("preparse_chain"))) + $CORE_LOCAL->set("preparse_chain",PreParser::get_preparse_chain()); + + foreach ($CORE_LOCAL->get("preparse_chain") as $cn){ + if (!class_exists($cn)) continue; + $p = new $cn(); + if ($p->check($entered)) + $entered = $p->parse($entered); + if (!$entered || $entered == "") + break; + } + + if ($entered != "" && $entered != "PAYCARD"){ + /* + * SECOND PARSE CHAIN + * these parser objects should process any input + * completely. The return value of parse() determines + * whether to call lastpage() [list the items on screen] + */ + if (!is_array($CORE_LOCAL->get("parse_chain"))) + $CORE_LOCAL->set("parse_chain",Parser::get_parse_chain()); + + $result = False; + foreach ($CORE_LOCAL->get("parse_chain") as $cn){ + if (!class_exists($cn)) continue; + $p = new $cn(); + if ($p->check($entered)){ + $result = $p->parse($entered); + break; + } + } + if ($result && is_array($result)){ + $json = $result; + if (isset($result['udpmsg']) && $result['udpmsg'] !== False){ + if (is_object($sd)) + $sd->WriteToScale($result['udpmsg']); + /* + if (is_object($st)) + $st->WriteToScale($result['udpmsg']); + */ + } + } + else { + $arr = array( + 'main_frame'=>false, + 'target'=>'.baseHeight', + 'output'=>DisplayLib::inputUnknown()); + $json = $arr; + if (is_object($sd)){ + $sd->WriteToScale('errorBeep'); + } + } + } + } + $CORE_LOCAL->set("msgrepeat",0); + if (isset($json['main_frame']) && $json['main_frame'] != False){ + $this->change_page($json['main_frame']); + return False; + } + if (isset($json['output']) && !empty($json['output'])) + $this->display = $json['output']; + + if (isset($json['retry']) && $json['retry'] != False){ + $this->add_onload_command("setTimeout(\"inputRetry('".$json['retry']."');\", 150);\n"); + } + + if (isset($json['receipt']) && $json['receipt'] != False){ + $this->add_onload_command("receiptFetch('".$json['receipt']."');\n"); + } + + return True; + } + + function head_content(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript" src="<?php echo $this->page_url; ?>js/ajax-parser.js"></script> + <script type="text/javascript"> + function submitWrapper(){ + var str = $('#reginput').val(); + $('#reginput').val(''); + //if (str.indexOf("tw") != -1 || str.indexOf("TW") != -1 || (str.search(/^[0-9]+$/) == 0 && str.length <= 13) || str=='TFS' + // || str == 'U' || str == 'D'){ + clearTimeout(screenLockVar); + runParser(str,'<?php echo $this->page_url; ?>'); + enableScreenLock(); + return false; + //} + //return true; + } + function parseWrapper(str){ + $('#reginput').val(str); + $('#formlocal').submit(); + } + var screenLockVar; + function enableScreenLock(){ + screenLockVar = setTimeout('lockScreen()', <?php echo $CORE_LOCAL->get("timeout") ?>); + } + function lockScreen(){ + location = '<?php echo $this->page_url; ?>gui-modules/login3.php'; + } + function receiptFetch(r_type){ + $.ajax({ + url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-end.php', + type: 'get', + data: 'receiptType='+r_type, + dataType: 'json', + cache: false, + success: function(data){ + if (data.sync){ + ajaxTransactionSync('<?php echo $this->page_url; ?>'); + } + }, + error: function(e1){ + } + }); + } + function inputRetry(str){ + parseWrapper(str); + } + </script> + <?php + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header('action="pos2.php" onsubmit="return submitWrapper();"'); + if ($CORE_LOCAL->get("timeout") != "") + $this->add_onload_command("enableScreenLock();\n"); + $this->add_onload_command("\$('#reginput').keydown(function(ev){ + switch(ev.which){ + case 33: + parseWrapper('U11'); + break; + case 38: + parseWrapper('U'); + break; + case 34: + parseWrapper('D11'); + break; + case 40: + parseWrapper('D'); + break; + case 9: + parseWrapper('TFS'); + return false; + } + });\n"); + /* + if ($CORE_LOCAL->get("msgrepeat") == 1) + $this->add_onload_command("submitWrapper();"); + */ + ?> + <div class="baseHeight"> + <?php + + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("multiple",0); + $CORE_LOCAL->set("casediscount",0); + + // set memberID if not set already + if (!$CORE_LOCAL->get("memberID")) { + $CORE_LOCAL->set("memberID","0"); + } + + if ($CORE_LOCAL->get("plainmsg") && strlen($CORE_LOCAL->get("plainmsg")) > 0) { + echo DisplayLib::printheaderb(); + echo "<div class=\"centerOffset\">"; + echo DisplayLib::plainmsg($CORE_LOCAL->get("plainmsg")); + $CORE_LOCAL->set("plainmsg",0); + echo "</div>"; + } + elseif (!empty($this->display)) + echo $this->display; + else + echo DisplayLib::lastpage(); + + echo "</div>"; // end base height + + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + + if ($CORE_LOCAL->get("touchscreen") === True){ + echo '<div style="text-align: center;"> + <input type="submit" value="Items" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="parseWrapper(\'QK0\');" /> + <input type="submit" value="Total" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="parseWrapper(\'QK4\');" /> + <input type="submit" value="Tender" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="parseWrapper(\'QK2\');" /> + <input type="submit" value="Member" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="parseWrapper(\'QK5\');" /> + <input type="submit" value="Misc" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="parseWrapper(\'QK6\');" /> + </div>'; + } + } // END body_content() FUNCTION +} + +new pos2(); + +?> diff --git a/pos/is4c-nf/gui-modules/posCustDisplay.php b/pos/is4c-nf/gui-modules/posCustDisplay.php new file mode 100644 index 000000000..753d9789e --- /dev/null +++ b/pos/is4c-nf/gui-modules/posCustDisplay.php @@ -0,0 +1,64 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +session_cache_limiter('nocache'); + +if (!class_exists("BasicPage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/BasicPage.php"); + +if (!function_exists("lastpage")) include($_SESSION["INCLUDE_PATH"]."/lib/listitems.php"); +if (!function_exists("printheaderb")) include($_SESSION["INCLUDE_PATH"]."/lib/drawscreen.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class posCustDisplay extends BasicPage { + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + + if ($CORE_LOCAL->get("plainmsg") && strlen($CORE_LOCAL->get("plainmsg")) > 0) { + printheaderb(); + echo "<div class=\"centerOffset\">"; + plainmsg($CORE_LOCAL->get("plainmsg")); + echo "</div>"; + echo "</div>"; // end of baseHeight + } + else { + // No input and no messages, so + // list the items + if ($CORE_LOCAL->get("End") == 1) + printReceiptfooter(True); + else + lastpage(True); + } + echo "</div>"; // end base height + + printfooter(True); + + } // END body_content() FUNCTION +} + +new posCustDisplay(); + +?> diff --git a/pos/is4c-nf/gui-modules/priceOverride.php b/pos/is4c-nf/gui-modules/priceOverride.php new file mode 100644 index 000000000..b94a50274 --- /dev/null +++ b/pos/is4c-nf/gui-modules/priceOverride.php @@ -0,0 +1,109 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class PriceOverride extends NoInputPage { + + var $description; + var $price; + + function preprocess(){ + global $CORE_LOCAL; + $line_id = $CORE_LOCAL->get("currentid"); + $db = Database::tDataConnect(); + + $q = "SELECT description,total,department FROM localtemptrans + WHERE trans_type IN ('I','D') AND trans_status = '' + AND trans_id=".((int)$line_id); + $r = $db->query($q); + if ($db->num_rows($r)==0){ + // current record cannot be repriced + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + $w = $db->fetch_row($r); + $this->description = $w['description']; + $this->price = sprintf('$%.2f',$w['total']); + + if (isset($_REQUEST['reginput'])){ + $input = strtoupper($_REQUEST['reginput']); + + if ($input == "CL"){ + if ($this->price == "$0.00"){ + $q = sprintf("DELETE FROM localtemptrans WHERE trans_id=".(int)$line_id); + $r = $db->query($q); + } + // override canceled; go home + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if (is_numeric($input) && $input != 0){ + $cents = 0; + $dollars = 0; + if (strlen($input)==1 || strlen($input)==2) + $cents = $input; + else { + $cents = substr($input,-2); + $dollars = substr($input,0,strlen($input)-2); + } + $ttl = ((int)$dollars) + ((int)$cents / 100.0); + $ttl = number_format($ttl,2); + if ($w['department'] == $CORE_LOCAL->get("BottleReturnDept")) + $ttl = $ttl * -1; + + $q = sprintf("UPDATE localtemptrans SET total=%.2f, charflag='PO' + WHERE trans_id=%d",$ttl,$line_id); + $r = $db->query($q); + + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + + return True; + } + + function body_content() { + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <span class="larger">price override</span> + <form name="overrideform" method="post" + id="overrideform" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input type="text" id="reginput" name='reginput' tabindex="0" onblur="$('#reginput').focus()" /> + </form> + <span><?php echo $this->description; ?> - <?php echo $this->price; ?></span> + <p> + <span class="smaller">[clear] to cancel</span> + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#reginput').focus();\n"); + } // END body_content() FUNCTION +} + +new PriceOverride(); +?> diff --git a/pos/is4c-nf/gui-modules/productlist.php b/pos/is4c-nf/gui-modules/productlist.php new file mode 100644 index 000000000..4778f4775 --- /dev/null +++ b/pos/is4c-nf/gui-modules/productlist.php @@ -0,0 +1,216 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 11Feb2013 EL Support argument from initial PV command: PVAPPLES. + * 18Jan2013 Eric Lee Extended lookup to productUser.description, with Andy's help. + * Very slow unless products.upc has been changed to VARCHAR(13). + +*/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class productlist extends NoInputPage { + + var $temp_result; + var $temp_num_rows; + var $boxSize; + + function preprocess(){ + global $CORE_LOCAL; + + $entered = ""; + if (isset($_REQUEST["search"])) + $entered = strtoupper(trim($_REQUEST["search"])); + elseif ($CORE_LOCAL->get("pvsearch") != "") + $entered = strtoupper(trim($CORE_LOCAL->get("pvsearch"))); + else{ + $this->temp_num_rows = 0; + return True; + } + + // canceled + if (empty($entered)){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // picked an item from the list + if (is_numeric($entered) && strlen($entered) == 13){ + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$entered); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + if (is_numeric($entered)) { + // expand UPC-E to UPC-A + if (substr($entered, 0, 1) == 0 && strlen($entered) == 7) { + $p6 = substr($entered, -1); + + if ($p6 == 0) + $entered = substr($entered, 0, 3)."00000".substr($entered, 3, 3); + elseif ($p6 == 1) + $entered = substr($entered, 0, 3)."10000".substr($entered, 4, 3); + elseif ($p6 == 2) + $entered = substr($entered, 0, 3)."20000".substr($entered, 4, 3); + elseif ($p6 == 3) + $entered = substr($entered, 0, 4)."00000".substr($entered, 4, 2); + elseif ($p6 == 4) + $entered = substr($entered, 0, 5)."00000".substr($entered, 6, 1); + else + $entered = substr($entered, 0, 6)."0000".$p6; + + } + + // UPCs should be length 13 w/ at least one leading zero + if (strlen($entered) == 13 && substr($entered, 0, 1) != 0) + $entered = "0".substr($entered, 0, 12); + else + $entered = substr("0000000000000".$entered, -13); + + // zero out the price field of scale UPCs + if (substr($entered, 0, 3) == "002") + $entered = substr($entered, 0, 8)."00000"; + } + + /* get all available modules */ + $modules = AutoLoader::ListModules('ProductSearch'); + $results = array(); + $this->boxSize = 1; + /* search with each available module. Use UPC + to filter out any duplicate results */ + foreach($modules as $mod_name){ + $mod = new $mod_name(); + $mod_results = $mod->search($entered); + foreach($mod_results as $upc => $record){ + if (!isset($results[$upc])) + $results[$upc] = $record; + } + if ($mod->result_size > $this->boxSize) + $this->boxSize = $mod->result_size; + } + + $this->temp_result = $results; + $this->temp_num_rows = count($results); + + return True; + } // END preprocess() FUNCTION + + function head_content(){ + global $CORE_LOCAL; + // Javascript is only really needed if there are results + if ($this->temp_num_rows != 0){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } + } // END head() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + $result = $this->temp_result; + $num_rows = $this->temp_num_rows; + + if ($num_rows == 0) { + $this->productsearchbox(_("no match found")."<br />"._("next search or enter upc")); + } + else { + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\"" + ." id=\"selectform\">" + ."<select name=\"search\" id=\"search\" " + ."size=".$this->boxSize." onblur=\"\$('#search').focus();\" ondblclick=\"document.forms['selectform'].submit();\">"; + + $selected = "selected"; + foreach($result as $row){ + $price = $row["normal_price"]; + + if ($row["scale"] != 0) $Scale = "S"; + else $Scale = " "; + + if (!$price) $price = "unKnown"; + else $price = MiscLib::truncate2($price); + + echo "<option value='".$row["upc"]."' ".$selected.">".$row["upc"]." -- ".$row["description"] + ." ---- [".$price."] ".$Scale."\n"; + + $selected = ""; + } + echo "</select>" + ."</form>" + ."</div>" + ."<div class=\"listboxText coloredText centerOffset\">" + ._("clear to cancel")."</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + } + + $this->add_onload_command("\$('#search').focus();\n"); + } // END body_content() FUNCTION + + function productsearchbox($strmsg) { + ?> + <div class="baseHeight"> + <div class="colored centeredDisplay"> + <span class="larger"> + <?php echo $strmsg;?> + </span> + <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" autocomplete="off"> + <input type="text" name="search" size="15" id="search" + onblur="$('#search').focus();" /> + </form> + press [enter] to cancel + </div> + </div> + <?php + } + +} + +new productlist(); + +?> diff --git a/pos/is4c-nf/gui-modules/qtty2.php b/pos/is4c-nf/gui-modules/qtty2.php new file mode 100644 index 000000000..c5351ca30 --- /dev/null +++ b/pos/is4c-nf/gui-modules/qtty2.php @@ -0,0 +1,94 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class qtty2 extends BasicPage { + + var $box_color; + var $msg; + + function preprocess(){ + global $CORE_LOCAL; + + $this->box_color="coloredArea"; + $this->msg = _("quantity required"); + + if (!isset($_REQUEST['reginput'])) return True; + + $qtty = strtoupper(trim($_REQUEST["reginput"])); + if ($qtty == "CL") { + $CORE_LOCAL->set("qttyvalid",0); + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("msgrepeat",0); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + elseif (is_numeric($qtty) && $qtty < 9999 && $qtty >= 0) { + $input_string = $CORE_LOCAL->get("item"); + $plu = ""; + while(!empty($input_string) && is_numeric($input_string[strlen($input_string)-1])){ + $plu = $input_string[strlen($input_string)-1] . $plu; + $input_string = substr($input_string,0,strlen($input_string)-1); + } + $CORE_LOCAL->set("qttyvalid",1); + $CORE_LOCAL->set("strRemembered",$input_string.$qtty."*".$plu); + $CORE_LOCAL->set("msgrepeat",1); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + $this->box_color="errorColoredArea"; + $this->msg = _("invalid quantity"); + return True; + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header(); + echo DisplayLib::printheaderb(); + ?> + <div class="baseHeight"> + <div class="<?php echo $this->box_color; ?> centeredDisplay"> + <span class="larger"> + <?php echo $this->msg ?> + </span><br /> + <p> + <?php echo _("enter number or clear to cancel"); ?> + </p> + </div> + </div> + + <?php + $CORE_LOCAL->set("msgrepeat",2); + $CORE_LOCAL->set("item",$CORE_LOCAL->get("strEntered")); + UdpComm::udpSend('errorBeep'); + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + } // END true_body() FUNCTION +} + +new qtty2(); + +?> diff --git a/pos/is4c-nf/gui-modules/refundComment.php b/pos/is4c-nf/gui-modules/refundComment.php new file mode 100644 index 000000000..50d6fc44c --- /dev/null +++ b/pos/is4c-nf/gui-modules/refundComment.php @@ -0,0 +1,123 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class RefundComment extends NoInputPage { + + function preprocess(){ + global $CORE_LOCAL; + if (isset($_REQUEST["selectlist"])){ + $input = $_REQUEST["selectlist"]; + if ($input == "CL"){ + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("strRemembered",""); + $CORE_LOCAL->set("refundComment",""); + } + else if ($input == "Other"){ + return True; + } + else { + $input = str_replace("'","",$input); + $CORE_LOCAL->set("strRemembered",$CORE_LOCAL->get("refundComment")); + // add comment calls additem(), which wipes + // out refundComment; save it + TransRecord::addcomment("RF: ".$input); + $CORE_LOCAL->set("refundComment",$CORE_LOCAL->get("strRemembered")); + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("refund",1); + } + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist :selected').val('CL'); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content() { + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="centeredDisplay colored"> + <span class="larger">reason for refund</span> + <form name="selectform" method="post" + id="selectform" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <?php + if (isset($_POST['selectlist']) && $_POST['selectlist'] == 'Other') { + ?> + <input type="text" id="selectlist" name="selectlist" + onblur="$('#selectlist').focus();" /> + <?php + } + else { + ?> + <select name="selectlist" id="selectlist" + onblur="$('#selectlist').focus();"> + <option>Overcharge</option> + <option>Spoiled</option> + <option>Did not Need</option> + <option>Did not Like</option> + <option>Other</option> + </select> + <?php + } + ?> + </form> + <p> + <span class="smaller">[clear] to cancel</span> + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#selectlist').focus();\n"); + //if (isset($_POST['selectlist']) && $_POST['selectlist'] == 'Other') + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);\n"); + } // END body_content() FUNCTION +} + +new RefundComment(); +?> diff --git a/pos/is4c-nf/gui-modules/requestInfo.php b/pos/is4c-nf/gui-modules/requestInfo.php new file mode 100644 index 000000000..e77178031 --- /dev/null +++ b/pos/is4c-nf/gui-modules/requestInfo.php @@ -0,0 +1,136 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* this module is intended for re-use. Just set + * Pass the name of a class with the + * static properties: + * - requestInfoHeader (upper message to display) + * - requestInfoMsg (lower message to display) + * and static method: + * - requestInfoCallback(string $info) + * + * The callback receives the info entered by the + * cashier. To reject the entry as invalid, return + * False. Otherwise return a URL to redirect to that + * page or True to go to pos2.php. + */ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class requestInfo extends NoInputPage { + + private $request_header = ''; + private $request_msg = ''; + + function preprocess(){ + // get calling class (required) + $class = isset($_REQUEST['class']) ? $_REQUEST['class'] : ''; + $pos_home = MiscLib::base_url().'gui-modules/pos2.php'; + if ($class === '' || !class_exists($class)){ + $this->change_page($pos_home); + return False; + } + // make sure calling class implements required + // method and properties + try { + $method = new ReflectionMethod($class, 'requestInfoCallback'); + if (!$method->isStatic() || !$method->isPublic()) + throw new Exception('bad method requestInfoCallback'); + $property = new ReflectionProperty($class, 'requestInfoMsg'); + if (!$property->isStatic() || !$property->isPublic()) + throw new Exception('bad property requestInfoMsg'); + $property = new ReflectionProperty($class, 'requestInfoHeader'); + if (!$property->isStatic() || !$property->isPublic()) + throw new Exception('bad property requestInfoHeader'); + } + catch (Exception $e){ + $this->change_page($pos_home); + return False; + } + + $this->request_header = $class::$requestInfoHeader; + $this->request_msg = $class::$requestInfoMsg; + + // info was submitted + if (isset($_REQUEST['input'])){ + $reginput = strtoupper($_REQUEST['input']); + if ($reginput == 'CL'){ + // clear; go home + $this->change_page($pos_home); + return False; + } + elseif ($reginput === ''){ + // blank. stay at prompt + return True; + } + else { + // give info to callback function + $result = $class::requestInfoCallback($reginput); + if ($result === True){ + // accepted. go home + $this->change_page($pos_home); + return False; + } + elseif ($result === False){ + // input rejected. try again + $this->result_header = 'invalid entry'; + return True; + } + else { + // callback wants to navigate to + // another page + $this->change_page($result); + return False; + } + } + } + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="colored centeredDisplay"> + <span class="larger"> + <?php echo $this->request_header; ?> + </span> + <form name="form" method="post" autocomplete="off" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input type="text" id="reginput" name='input' tabindex="0" onblur="$('#input').focus()" /> + <input type="hidden" name="class" value="<?php echo $_REQUEST['class']; ?>" /> + </form> + <p> + <?php echo $this->request_msg; ?> + </p> + </div> + </div> + + <?php + $this->add_onload_command("\$('#reginput').focus();"); + } // END true_body() FUNCTION + +} + +new requestInfo(); + +?> diff --git a/pos/is4c-nf/gui-modules/rplist.php b/pos/is4c-nf/gui-modules/rplist.php new file mode 100644 index 000000000..382cba156 --- /dev/null +++ b/pos/is4c-nf/gui-modules/rplist.php @@ -0,0 +1,126 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class rplist extends NoInputPage { + + function preprocess(){ + if (isset($_REQUEST['selectlist'])){ + if (!empty($_REQUEST['selectlist'])){ + $PRINT_OBJ = new ESCPOSPrintHandler(); + $receipt = ReceiptLib::printReceipt($_REQUEST['selectlist']); + if (session_id() != ''){ + session_write_close(); + } + if(is_array($receipt)){ + if (!empty($receipt['any'])) + $EMAIL_OBJ->writeLine($receipt['any']); + if (!empty($receipt['print'])) + $PRINT_OBJ->writeLine($receipt['print']); + } + elseif(!empty($receipt)) + $PRINT_OBJ->writeLine($receipt); + } + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + return True; + } + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist option:selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#selectlist').focus();\n"); + } + + function body_content(){ + global $CORE_LOCAL; + $query = "select register_no, emp_no, trans_no, sum((case when trans_type = 'T' then -1 * total else 0 end)) as total " + ."from localtranstoday where register_no = ".$CORE_LOCAL->get("laneno")." and emp_no = ".$CORE_LOCAL->get("CashierNo") + ." group by register_no, emp_no, trans_no order by trans_no desc"; + + $db = Database::tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + ?> + + <div class="baseHeight"> + <div class="listbox"> + <form name="selectform" method="post" id="selectform" + action="<?php echo $_SERVER['PHP_SELF']; ?>" > + <select name="selectlist" size="10" id="selectlist" + onblur="$('#selectlist').focus()" > + + <?php + $selected = "selected"; + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + echo "<option value='".$row["register_no"]."::".$row["emp_no"]."::".$row["trans_no"]."'"; + echo $selected; + echo ">lane ".substr(100 + $row["register_no"], -2)." Cashier ".substr(100 + $row["emp_no"], -2) + ." #".$row["trans_no"]." -- $". + sprintf('%.2f',$row["total"]); + $selected = ""; + } + ?> + + </select> + </form> + </div> + <div class="listboxText coloredText centerOffset"> + <?php echo _("use arrow keys to navigate"); ?><br /> + <?php echo _("enter to reprint receipt"); ?><br /> + <?php echo _("clear to cancel"); ?> + </div> + <div class="clear"></div> + </div> + + <?php + } // END body_content() FUNCTION +} + +new rplist(); + +?> diff --git a/pos/is4c-nf/gui-modules/smartItemList.php b/pos/is4c-nf/gui-modules/smartItemList.php new file mode 100644 index 000000000..5be613125 --- /dev/null +++ b/pos/is4c-nf/gui-modules/smartItemList.php @@ -0,0 +1,181 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +if (!class_exists("MainFramePage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/MainFramePage.php"); +if (!function_exists("tDataConnect")) include($_SESSION["INCLUDE_PATH"]."/lib/connect.php"); +if (!function_exists("setMember")) include($_SESSION["INCLUDE_PATH"]."/lib/prehkeys.php"); +if (!function_exists("changeBothPages")) include($_SESSION["INCLUDE_PATH"]."/gui-base.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class SmartItemList extends MainFramePage { + + var $temp_result; + var $entered; + var $db; + + function preprocess(){ + global $CORE_LOCAL; + if (isset($_POST['selectlist'])){ + $val = $_POST['selectlist']; + if ($val != 'CL'){ + $CORE_LOCAL->set('strRemembered',$val); + $CORE_LOCAL->set('msgrepeat',1); + } + changeBothPages('/gui-modules/input.php','/gui-modules/pos2.php'); + return False; + } + return True; + } // END preprocess() FUNCTION + + function body_tag() { + echo "<body onLoad='preloadopts(); document.selectform.selectlist.focus()'>"; + } + + function head(){ + global $CORE_LOCAL; + // Javascript is only needed if there are results + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + var entered = ''; + function processkeypress(e) { + var jsKey; + if(!e)e = window.event; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + try { + document.selectform.selectlist[0].value = 'CL'; + } + catch(ex){ + var o = document.createElement('option'); + o.text = 'CL'; + o.value = 'CL'; + safeAdd(document.selectform.selectlist, o); + } + document.selectform.selectlist.selectedIndex = 0; + } + document.selectform.submit(); + } + else { + if (jsKey == 33 || jsKey == 34 || jsKey == 38 || jsKey == 40){ + // up, down, page up, page down + return true; + } + + var s = document.getElementById('selectlist'); + for(var i=s.options.length-1; i>=0; i--) + s.remove(i); + + if (jsKey == 8){ + for (var i=0; i<allopts.length; i++){ + safeAdd(s, allopts[i]); + } + entered = ''; + s.selectedIndex = 0; + return false; + } + + entered += String.fromCharCode(jsKey).toUpperCase(); + var index = -1; + var j = 0; + for (var i=0; i<allopts.length; i++){ + if (allopts[i].text.toUpperCase().indexOf(entered) == 0){ + safeAdd(s,allopts[i]); + index = 0; + } + } + if (index != -1){ + s.selectedIndex = index; + } + } + prevPrevKey = prevKey; + prevKey = jsKey; + return true; + } + + var isIE = /*@cc_on!@*/false; + if (isIE) + document.onkeydown = processkeypress; + else + document.onkeypress = processkeypress; + + var allopts = new Array(); + function preloadopts(){ + var s = document.getElementById('selectlist'); + for(var i=0; i<s.options.length; i++){ + allopts[i] = s.options[i]; + } + } + + function safeAdd(selector, opt){ + try { + selector.add(opt,null); + } + catch (ex){ + selector.add(opt); + } + } + </script> + <?php + } // END head() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + + $db = pDataConnect(); + $itemsQ = "select upc,description from products order by description"; + $result = $db->query($itemsQ); + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name='selectform' method='post' action='".$_SERVER["PHP_SELF"]."'>" + ."<select id='selectlist' name='selectlist' size='15' " + ."onBlur='document.selectform.selectlist.focus()'>"; + + $selectFlag = 0; + for ($i = 0; $i < $db->num_rows($result); $i++) { + $row = $db->fetch_array($result); + if( $i == 0 && $selectFlag == 0) { + $selected = "selected"; + } else { + $selected = ""; + } + echo "<option value='".$row["upc"]."' ".$selected.">" + .$row["description"]."</option>"; + } + echo "</select></form></div>" + ."<div class=\"centerOffset listboxText coloredText\">" + ."use arrow keys to navigate<p>[esc] to cancel</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + } // END body_content() FUNCTION +} + +new SmartItemList(); + +?> diff --git a/pos/is4c-nf/gui-modules/suspendedlist.php b/pos/is4c-nf/gui-modules/suspendedlist.php new file mode 100644 index 000000000..8f273b547 --- /dev/null +++ b/pos/is4c-nf/gui-modules/suspendedlist.php @@ -0,0 +1,177 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class suspendedlist extends NoInputPage { + var $temp_result; + var $temp_num_rows; + var $temp_db; + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if(!e)e = window.event; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#selectlist :selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function preprocess(){ + global $CORE_LOCAL; + + /* form submitted */ + if (isset($_REQUEST['selectlist'])){ + if (!empty($_REQUEST['selectlist'])){ + $tmp = explode("::",$_REQUEST['selectlist']); + $this->doResume($tmp[0],$tmp[1],$tmp[2]); + } + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + $query_local = "select register_no, emp_no, trans_no, sum(total) as total from suspendedtoday " + ."group by register_no, emp_no, trans_no"; + + $db_a = Database::tDataConnect(); + $result = ""; + if ($CORE_LOCAL->get("standalone") == 1) $result = $db_a->query($query_local); + else { + $db_a = Database::mDataConnect(); + $result = $db_a->query($query_local); + } + + $num_rows = $db_a->num_rows($result); + + /* if there are suspended transactions available, + * store the result and row count as class variables + * so they can be retrieved in body_content() + * + * otherwise notify that there are no suspended + * transactions + */ + if ($num_rows > 0){ + $this->temp_result = $result; + $this->temp_num_rows = $num_rows; + $this->temp_db = $db_a; + return True; + } + else { + $CORE_LOCAL->set("boxMsg",_("no suspended transaction")); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + return True; + } // END preprocess() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + $num_rows = $this->temp_num_rows; + $result = $this->temp_result; + $db = $this->temp_db; + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form id=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">\n" + ."<select name=\"selectlist\" size=\"10\" onblur=\"\$('#selectlist').focus();\" + id=\"selectlist\">"; + + $selected = "selected"; + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + echo "<option value='".$row["register_no"]."::".$row["emp_no"]."::".$row["trans_no"]."' ".$selected + ."> lane ".substr(100 + $row["register_no"], -2)." Cashier ".substr(100 + $row["emp_no"], -2) + ." #".$row["trans_no"]." -- $".$row["total"]."\n"; + $selected = ""; + } + + echo "</select>\n</form>\n</div>\n" + ."<div class=\"listboxText coloredText centerOffset\">" + ._("use arrow keys to navigate")."<br />"._("clear to cancel")."</div>\n" + ."<div class=\"clear\"></div>"; + echo "</div>"; + $this->add_onload_command("\$('#selectlist').focus();"); + $this->add_onload_command("\$('#selectlist').keypress(processkeypress);"); + } // END body_content() FUNCTION + + function doResume($reg,$emp,$trans){ + global $CORE_LOCAL; + + $query_del = "delete from suspended where register_no = ".$reg." and emp_no = " + .$emp." and trans_no = ".$trans; + + $db_a = Database::tDataConnect(); + $query_a = "select trans_id from localtemptrans"; + $result_a = $db_a->query($query_a); + $num_rows_a = $db_a->num_rows($result_a); + + // use SQLManager's transfer method when not in stand alone mode + // to eliminate the cross server query - andy 8/31/07 + if ($num_rows_a == 0) { + if ($CORE_LOCAL->get("standalone") == 0){ + $db_a->add_connection($CORE_LOCAL->get("mServer"),$CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"),$CORE_LOCAL->get("mUser"),$CORE_LOCAL->get("mPass")); + $cols = Database::getMatchingColumns($db_a,"localtemptrans","suspendedtoday"); + $remoteQ = "select {$cols} from suspendedtoday where register_no = $reg " + ." and emp_no = ".$emp." and trans_no = ".$trans." order by trans_id"; + $success = $db_a->transfer($CORE_LOCAL->get("mDatabase"),$remoteQ, + $CORE_LOCAL->get("tDatabase"),"insert into localtemptrans ({$cols})"); + if ($success) + $db_a->query($query_del,$CORE_LOCAL->get("mDatabase")); + $db_a->close($CORE_LOCAL->get("mDatabase"),True); + } + else { + $localQ = "select * from suspendedtoday where register_no = $reg " + ." and emp_no = ".$emp." and trans_no = ".$trans." order by trans_id"; + $success = $db_a->query("insert into localtemptrans ".$localQ); + if ($success) + $db_a->query($query_del); + } + } + + $query_update = "update localtemptrans set register_no = ".$CORE_LOCAL->get("laneno").", emp_no = ".$CORE_LOCAL->get("CashierNo") + .", trans_no = ".$CORE_LOCAL->get("transno"); + + $db_a->query($query_update); + Database::getsubtotals(); + } +} + +new suspendedlist(); + +?> diff --git a/pos/is4c-nf/gui-modules/tenderlist.php b/pos/is4c-nf/gui-modules/tenderlist.php new file mode 100644 index 000000000..3b824ea5c --- /dev/null +++ b/pos/is4c-nf/gui-modules/tenderlist.php @@ -0,0 +1,144 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class tenderlist extends NoInputPage { + + /** + Input processing function + */ + function preprocess(){ + global $CORE_LOCAL; + + // a selection was made + if (isset($_REQUEST['search'])){ + $entered = strtoupper($_REQUEST['search']); + + if ($entered == "" || $entered == "CL"){ + // should be empty string + // javascript causes this input if the + // user presses CL{enter} + // Redirect to main screen + $CORE_LOCAL->set("tenderTotal","0"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + if (!empty($entered)){ + // built department input string and set it + // to be the next POS entry + // Redirect to main screen + $input = $CORE_LOCAL->get("tenderTotal").$entered; + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$input); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + return True; + } // END preprocess() FUNCTION + + /** + Pretty standard javascript for + catching CL typed in a select box + */ + function head_content(){ + global $CORE_LOCAL; + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').val(''); + } + else if ( (prevPrevKey == 116 || prevPrevKey == 84) && + (prevKey == 116 || prevKey == 84) ){ //TT<enter> + $('#search option:selected').val(''); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + /** + Build a <select> form that submits + back to this script + */ + function body_content(){ + global $CORE_LOCAL; + $db = Database::pDataConnect(); + $q = "SELECT TenderCode,TenderName FROM tenders + WHERE MaxAmount > 0 + ORDER BY TenderName"; + $r = $db->query($q); + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\"" + ." id=\"selectform\">" + ."<select name=\"search\" id=\"search\" " + ."size=\"15\" onblur=\"\$('#search').focus();\">"; + + $selected = "selected"; + while($row = $db->fetch_row($r)){ + echo "<option value='".$row["TenderCode"]."' ".$selected.">"; + echo $row['TenderName']; + echo '</option>'; + $selected = ""; + } + echo "</select>" + ."</form>" + ."</div>" + ."<div class=\"listboxText coloredText centerOffset\">"; + if ($CORE_LOCAL->get("tenderTotal") >= 0) + echo _("tendering").' $'; + else + echo _("refunding").' $'; + printf('%.2f',abs($CORE_LOCAL->get("tenderTotal"))/100); + echo '<br />'; + echo _("clear to cancel")."</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#search').focus();\n"); + } // END body_content() FUNCTION + +} + +new tenderlist(); + +?> diff --git a/pos/is4c-nf/gui-modules/undo.php b/pos/is4c-nf/gui-modules/undo.php new file mode 100644 index 000000000..5271265d3 --- /dev/null +++ b/pos/is4c-nf/gui-modules/undo.php @@ -0,0 +1,225 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +class undo extends NoInputPage { + var $msg; + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <div class="<?php echo $this->box_color; ?> centeredDisplay"> + <span class="larger"> + <?php echo $this->msg ?> + </span><br /> + <form name="form" method='post' autocomplete="off" action="<?php echo $_SERVER["PHP_SELF"]; ?>"> + <input type="text" name="reginput" id="reginput" tabindex="0" onblur="($'#reginput').focus();" > + </form> + <p> + Enter transaction number<br />[clear to cancel] + </p> + </div> + </div> + <?php + $this->add_onload_command("\$('#reginput').focus();"); + } + + function preprocess(){ + global $CORE_LOCAL; + $this->box_color = "coloredArea"; + $this->msg = "Undo transaction"; + + if (isset($_REQUEST['reginput'])){ + $trans_num = strtoupper($_REQUEST['reginput']); + + // clear/cancel undo attempt + if ($trans_num == "" || $trans_num == "CL"){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // error: malformed transaction number + if (!strpos($trans_num,"-")){ + $this->box_color="errorColoredArea"; + $this->msg = "Transaction not found"; + return True; + } + + $temp = explode("-",$trans_num); + // error: malformed transaction number (2) + if (count($temp) != 3){ + $this->box_color="errorColoredArea"; + $this->msg = "Transaction not found"; + return True; + } + + $emp_no = $temp[0]; + $register_no = $temp[1]; + $old_trans_no = $temp[2]; + // error: malformed transaction number (3) + if (!is_numeric($emp_no) || !is_numeric($register_no) + || !is_numeric($old_trans_no)){ + $this->box_color="errorColoredArea"; + $this->msg = "Transaction not found"; + return True; + } + + $db = 0; + $query = ""; + if ($register_no == $CORE_LOCAL->get("laneno")){ + // look up transation locally + $db = Database::tDataConnect(); + $query = "select upc, description, trans_type, trans_subtype, + trans_status, department, quantity, scale, unitPrice, + total, regPrice, tax, foodstamp, discount, memDiscount, + discountable, discounttype, voided, PercentDiscount, + ItemQtty, volDiscType, volume, VolSpecial, mixMatch, + matched, card_no, trans_id + from localtranstoday where register_no = $register_no + and emp_no = $emp_no and trans_no = $old_trans_no + and ".$db->datediff($db->now(),'datetime')." = 0 + and trans_status <> 'X' + order by trans_id"; + } + else if ($CORE_LOCAL->get("standalone") == 1){ + // error: remote lookups won't work in standalone + $this->box_color="errorColoredArea"; + $this->msg = "Transaction not found"; + return True; + } + else { + // look up transaction remotely + $db = Database::mDataConnect(); + $query = "select upc, description, trans_type, trans_subtype, + trans_status, department, quantity, Scale, unitPrice, + total, regPrice, tax, foodstamp, discount, memDiscount, + discountable, discounttype, voided, PercentDiscount, + ItemQtty, volDiscType, volume, VolSpecial, mixMatch, + matched, card_no, trans_id + from dtransactions where register_no = $register_no + and emp_no = $emp_no and trans_no = $old_trans_no + and ".$db->datediff($db->now(),'datetime')." = 0 + and trans_status <> 'X' + order by trans_id"; + } + + $result = $db->query($query); + // transaction not found + if ($db->num_rows($result) < 1){ + $this->box_color="errorColoredArea"; + $this->msg = "Transaction not found"; + return True; + } + + /* change the cashier to the original transaction's cashier */ + $prevCashier = $CORE_LOCAL->get("CashierNo"); + $CORE_LOCAL->set("CashierNo",$emp_no); + $CORE_LOCAL->set("transno",Database::gettransno($emp_no)); + + /* rebuild the transaction, line by line, in reverse */ + $card_no = 0; + TransRecord::addcomment("VOIDING TRANSACTION $trans_num"); + while ($row = $db->fetch_array($result)){ + $card_no = $row["card_no"]; + + if ($row["upc"] == "TAX"){ + //TransRecord::addtax(); + } + elseif ($row["trans_type"] == "T"){ + if ($row["description"] == "Change") + TransRecord::addchange(-1*$row["total"]); + elseif ($row["description"] == "FS Change") + TransRecord::addfsones(-1*$row["total"]); + else + TransRecord::addtender($row["description"],$row["trans_subtype"],-1*$row["total"]); + } + elseif (strstr($row["description"],"** YOU SAVED")){ + $temp = explode("$",$row["description"]); + TransRecord::adddiscount(substr($temp[1],0,-3),$row["department"]); + } + elseif ($row["upc"] == "FS Tax Exempt") + TransRecord::addfsTaxExempt(); + elseif (strstr($row["description"],"% Discount Applied")){ + $temp = explode("%",$row["description"]); + TransRecord::discountnotify(substr($temp[0],3)); + } + elseif ($row["description"] == "** Order is Tax Exempt **") + TransRecord::addTaxExempt(); + elseif ($row["description"] == "** Tax Excemption Reversed **") + TransRecord::reverseTaxExempt(); + elseif ($row["description"] == " * Manufacturers Coupon") + TransRecord::addCoupon($row["upc"],$row["department"],-1*$row["total"]); + elseif (strstr($row["description"],"** Tare Weight")){ + $temp = explode(" ",$row["description"]); + TransRecord::addTare($temp[3]*100); + } + elseif ($row["upc"] == "MAD Coupon"){ + $madCoup = $row['total']; + TransRecord::addItem("MAD Coupon", "Member Appreciation Coupon", "I", "CP", "C", 0, 1, + -1*$madCoup, -1*$madCoup, -1*$madCoup, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 17); + } + elseif ($row["upc"] == "DISCOUNT"){ + //TransRecord::addTransDiscount(); + } + elseif ($row["trans_status"] != "M" && $row["upc"] != "0" && + (is_numeric($row["upc"]) || strstr($row["upc"],"DP"))) { + $row["trans_status"] = "V"; + $row["total"] *= -1; + $row["discount"] *= -1; + $row["memDiscount"] *= -1; + $row["quantity"] *= -1; + $row["ItemQtty"] *= -1; + TransRecord::addItem($row["upc"],$row["description"],$row["trans_type"],$row["trans_subtype"], + $row["trans_status"],$row["department"],$row["quantity"], + $row["unitPrice"],$row["total"],$row["regPrice"], + $row["Scale"],$row["tax"],$row["foodstamp"],$row["discount"], + $row["memDiscount"],$row["discountable"],$row["discounttype"], + $row["ItemQtty"],$row["volDiscType"],$row["volume"],$row["VolSpecial"], + $row["mixMatch"],$row["matched"],$row["voided"]); + } + } + + $op = Database::pDataConnect(); + $query = "select CardNo,personNum,LastName,FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type,memType,staff, + SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown,id from custdata + where CardNo = '".$card_no."'"; + $res = $op->query($query); + $row = $op->fetch_row($res); + PrehLib::setMember($card_no,1,$row); + $CORE_LOCAL->set("autoReprint",0); + + /* restore the logged in cashier */ + $CORE_LOCAL->set("CashierNo",$prevCashier); + $CORE_LOCAL->set("transno",Database::gettransno($prevCashier)); + + $this->change_page($this->page_url."gui-modules/undo_confirm.php"); + return False; + } + return True; + } +} + +new undo(); diff --git a/pos/is4c-nf/gui-modules/undo_confirm.php b/pos/is4c-nf/gui-modules/undo_confirm.php new file mode 100644 index 000000000..468bddf43 --- /dev/null +++ b/pos/is4c-nf/gui-modules/undo_confirm.php @@ -0,0 +1,124 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../lib/AutoLoader.php'); + +/* wraps around an undone transaction to limit editing options + CL cancels the attempt (wraps to input "CN") + {Enter} finishes the transaction (wraps to input "0CA") +*/ +class undo_confirm extends BasicPage { + var $box_color; + var $msg; + + function body_content(){ + global $CORE_LOCAL; + echo $this->input_header(); + ?> + <div class="baseHeight"> + <?php + if (empty($this->msg)) + echo DisplayLib::lastpage(); + else { + echo $this->msg; + } + ?> + </div> + <?php + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + $this->add_onload_command("\$('#reginput').keyup(function(ev){ + switch(ev.keyCode){ + case 33: + \$('#reginput').val('U11'); + \$('#formlocal').submit(); + break; + case 38: + \$('#reginput').val('U'); + \$('#formlocal').submit(); + break; + case 34: + \$('#reginput').val('D11'); + \$('#formlocal').submit(); + break; + case 40: + \$('#reginput').val('D'); + \$('#formlocal').submit(); + break; + } + });\n"); + $this->add_onload_command("undoInstructions();"); + } + + function head_content(){ + ?> + <script type="text/javascript"> + function undoInstructions(){ + var str = '<span style="padding:3px;background:#fff;"><b>[Enter] to accept, [Clear] to reject</b></span> '; + var cur = $('.notices').html(); + $('.notices').html(str+cur); + } + </script> + <?php + } + + function preprocess(){ + global $CORE_LOCAL; + $this->msg = ""; + if (isset($_REQUEST['reginput'])){ + switch(strtoupper($_REQUEST['reginput'])){ + case 'CL': + // zero removes password check I think + $CORE_LOCAL->set("runningTotal",0); + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered","CN"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + break; + case '': + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered","0CA"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + break; + case 'U': + case 'U11': + case 'D': + case 'D11': + // just use the parser module here + // for simplicity; all its really + // doing is updating a couple session vars + $si = new ScrollItems(); + $json = $si->parse($_REQUEST['reginput']); + $this->msg = $json['output']; + break; + default: + break; + } + } + return True; + } +} + +new undo_confirm(); diff --git a/pos/is4c-nf/gui-modules/undo_input.php b/pos/is4c-nf/gui-modules/undo_input.php new file mode 100644 index 000000000..ad9d9bac1 --- /dev/null +++ b/pos/is4c-nf/gui-modules/undo_input.php @@ -0,0 +1,151 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("BasicPage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/BasicPage.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class undo_input extends BasicPage { + + function body_tag(){ + echo "<body onload=\"document.form.reginput.focus()\">"; + } + + function head(){ + ?> + <script type="text/javascript"> + + function keyDown(e) + { + if ( ! e ) { + e = event; + } + var ieKey=e.keyCode; + switch(ieKey) { + case 37: + { + window.top.main_frame.document.form1.input.value = 'U'; + window.top.main_frame.document.form1.submit(); + }; + break; + case 38: + { + window.top.main_frame.document.form1.input.value = 'U'; + window.top.main_frame.document.form1.submit(); + }; + break; + case 39: + { + window.top.main_frame.document.form1.input.value = 'D'; + window.top.main_frame.document.form1.submit(); + }; + break; + case 40: + { + window.top.main_frame.document.form1.input.value = 'D'; + window.top.main_frame.document.form1.submit(); + }; + break; + default: + break; + } + } + + document.onkeydown = keyDown; + + // filter all form input + // only acceptable inputs are: + // clear or cancel to cancel the transaction + // enter to accept the transaction + // all other inputs are erased + function inputCheck(){ + var input = document.getElementById('reginput').value.toUpperCase(); + if (input == "CL" || input == "CN"){ + window.top.main_frame.document.form1.input.value = 'CN'; + window.top.main_frame.document.form1.submit(); + } + else if (input == ""){ + window.top.main_frame.document.form1.input.value = '0CA'; + window.top.main_frame.document.form1.submit(); + window.location = '/gui-modules/input.php'; + } + else { + document.getElementById('reginput').value = ""; + } + } + </script> + <?php + } // END head() function + + function body_content(){ + global $CORE_LOCAL; + // this *should* be true anyway, but it's here so canceling won't + // require authentication (and leave this filtered input frame) + $CORE_LOCAL->set("runningTotal",0); + + echo "<div id=\"inputArea\">"; + echo "<div class=\"inputform\">"; + echo "<form name='form' method='post' autocomplete='off' onsubmit=\"inputCheck();return false;\">"; + if ($this->mask_input){ + $inputType = "password"; + } else { + $inputType = "text"; + } + echo "<input name='reginput' id=reginput type=".$inputType." value='' onBlur='document.forms[0].reginput.focus();'>"; + echo "</form></div>"; + echo "<div class=\"notices\">"; + echo "<b>[Enter] to accept, [Clear] to reject</b>&nbsp;&nbsp;&nbsp;&nbsp;"; + if (isset($_POST["reginput"])) { + $input = strtoupper(trim($_POST["reginput"])); + } else { + $input = ""; + } + + $time = strftime("%m/%d/%y %I:%M %p", time()); + + $CORE_LOCAL->set("repeatable",0); + + if ($CORE_LOCAL->get("training") == 1) { + echo "<span class=\"text\">training </span>" + ."<img src='/graphics/BLUEDOT.GIF'>&nbsp;&nbsp:&nbsp;"; + } + elseif ($CORE_LOCAL->get("standalone") == 0) { + echo "<img src='/graphics/GREENDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + else { + echo "<span class=\"text\">stand alone</span>" + ."<img src='/graphics/REDDOT.GIF'>&nbsp;&nbsp;&nbsp;"; + } + + echo "<span class=\"time\">".$time."</span>\n"; + + if ( strlen($input) > 0 || $CORE_LOCAL->get("msgrepeat") == 2) { + echo "<script type=\"text/javascript\">"; + echo "top.main_frame.document.forms[0].input.value = '".$input."';\n"; + echo "top.main_frame.document.forms[0].submit();\n"; + echo "</script>"; + } + } // END body_content() FUNCTION +} + +new undo_input(); +?> diff --git a/pos/is4c-nf/gui-modules/virtualCouponList.php b/pos/is4c-nf/gui-modules/virtualCouponList.php new file mode 100644 index 000000000..053bf728f --- /dev/null +++ b/pos/is4c-nf/gui-modules/virtualCouponList.php @@ -0,0 +1,139 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +if (!class_exists("MainFramePage")) include_once($_SESSION["INCLUDE_PATH"]."/gui-class-lib/MainFramePage.php"); +if (!function_exists("tDataConnect")) include($_SESSION["INCLUDE_PATH"]."/lib/connect.php"); +if (!function_exists("setMember")) include($_SESSION["INCLUDE_PATH"]."/lib/prehkeys.php"); +if (!function_exists("changeBothPages")) include($_SESSION["INCLUDE_PATH"]."/gui-base.php"); +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class virtualCouponList extends MainFramePage { + + var $temp_result; + var $entered; + var $db; + + function preprocess(){ + global $CORE_LOCAL; + + if (isset($_POST["selectlist"])){ + $id = $_POST["selectlist"]; + + if ($id != "CL") + addVirtualCoupon($id); + + changeBothPages("/gui-modules/input.php","/gui-modules/pos2.php"); + return False; + } + + $sql = pDataConnect(); + $cardno = $CORE_LOCAL->get("memberID"); + $discountQ = "select flag,name from virtualcoupon as v + left join custdata as c + on c.memcoupons & v.flag <> 0 + left join + (select cast(upc as unsigned) as upc,sum(quantity) as quantity + from translog.localtemptrans where trans_type='I' and + trans_subtype='CP' group by upc) as l + on v.flag=l.upc + where c.cardno=$cardno and c.personnum=1 + and (l.upc is null or l.quantity=0)"; + $discountR = $sql->query($discountQ); + $this->temp_result = $discountR; + $this->db = $sql; + + if ($sql->num_rows($discountR) == 0){ + $CORE_LOCAL->set("boxMsg","No virtual coupons available"); + changeBothPages("/gui-modules/input.php","/gui-modules/boxMsg2.php"); + return False; + + } + + return True; + } // END preprocess() FUNCTION + + function body_tag() { + echo "<body onLoad='document.selectform.selectlist.focus()'>"; + } + + function head(){ + global $CORE_LOCAL; + // Javascript is only needed if there are results + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if(!e)e = window.event; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + document.selectform.selectlist[0].value = 'CL'; + document.selectform.selectlist.selectedIndex = 0; + } + document.selectform.submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + $result = $this->temp_result; + $db = $this->db; + + echo "<div class=\"baseHeight\">" + ."<div class=\"listbox\">" + ."<form name='selectform' method='post' action='".$_SERVER["PHP_SELF"]."'>" + ."<select onkeypress='processkeypress(event);' name='selectlist' size='15' " + ."onBlur='document.selectform.selectlist.focus()'>"; + + $selectFlag = 0; + for ($i = 0; $i < $db->num_rows($result); $i++) { + $row = $db->fetch_array($result); + if( $i == 0 && $selectFlag == 0) { + $selected = "selected"; + } else { + $selected = ""; + } + echo "<option value='".$row["flag"]."' ".$selected.">" + .$row["name"]."</option>"; + } + echo "</select></form></div>" + ."<div class=\"centerOffset listboxText coloredText\">" + ."use arrow keys to navigate<p>[esc] to cancel</div>" + ."<div class=\"clear\"></div>"; + echo "</div>"; + } // END body_content() FUNCTION +} + +new virtualCouponList(); + +?> diff --git a/pos/is4c-nf/index.php b/pos/is4c-nf/index.php new file mode 100644 index 000000000..d07a44293 --- /dev/null +++ b/pos/is4c-nf/index.php @@ -0,0 +1,3 @@ +<?php +header('Location: login.php'); +?> diff --git a/pos/is4c-nf/ini.php.dist b/pos/is4c-nf/ini.php.dist new file mode 100644 index 000000000..005d60eba --- /dev/null +++ b/pos/is4c-nf/ini.php.dist @@ -0,0 +1,128 @@ +<?php +/* + COPY / RENAME TO ini.php + MOSTLY SANE DEFAULTS +*/ + +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +if (!isset($CORE_LOCAL)) + + require_once(realpath(dirname(__FILE__)."/lib/LocalStorage/conf.php")); + + +/************************************************************************************ +General Settings +************************************************************************************/ + +$CORE_LOCAL->set("OS",'other', True); +$CORE_LOCAL->set("browserOnly",1, True); +$CORE_LOCAL->set("store",'NewPI', True); +$CORE_LOCAL->set("laneno",1, True); + +/************************************************************************************ +Data Connection Settings +************************************************************************************/ +$CORE_LOCAL->set("mServer",'localhost', True); +$CORE_LOCAL->set("mDatabase",'COREserver', True); +$CORE_LOCAL->set("mDBMS",'mysql', True); + // Options: mssql, mysql, pgsql +$CORE_LOCAL->set("mUser",'', True); +$CORE_LOCAL->set("mPass",'', True); + +$CORE_LOCAL->set("DBMS",'mysql', True); +$CORE_LOCAL->set("tDatabase",'translog', True); +$CORE_LOCAL->set("pDatabase",'opdata', True); +$CORE_LOCAL->set("localhost",'10.0.1.120', True); +$CORE_LOCAL->set("localUser",'', True); +$CORE_LOCAL->set("localPass",'', True); + +/*********************************************************************************** +Receipt & Printer Settings +************************************************************************************/ + +$CORE_LOCAL->set("print",1, True); +$CORE_LOCAL->set("newReceipt",1, True); + +//$CORE_LOCAL->set("printerPort","LPT1:", True); +//$CORE_LOCAL->set("printerPort","/dev/lp0", True); +$CORE_LOCAL->set("printerPort",'fakereceipt.txt', True); + +$CORE_LOCAL->set("receiptHeaderCount",0, True); +$CORE_LOCAL->set("receiptFooterCount",0, True); +$CORE_LOCAL->set("ckEndorseCount",0, True); +$CORE_LOCAL->set("chargeSlipCount",0, True); + +/*********************************************************************************** +Screen Message Settings +************************************************************************************/ + +$CORE_LOCAL->set("welcomeMsgCount",0, True); +$CORE_LOCAL->set("trainingMsgCount",0, True); +$CORE_LOCAL->set("farewellMsgCount",0, True); + +$CORE_LOCAL->set("alertBar",'New Pi - Alert', True); + +/*********************************************************************************** +Credit Card +************************************************************************************/ + +$CORE_LOCAL->set("CCintegrate",1, True); +$CORE_LOCAL->set("gcIntegrate",1, True); +$CORE_LOCAL->set("ccLive",0, True); +$CORE_LOCAL->set("RegisteredPaycardClasses",array('MercuryGift','GoEMerchant'), True); + +/*********************************************************************************** +Other Settings +************************************************************************************/ + +$CORE_LOCAL->set("discountEnforced",1, True); +$CORE_LOCAL->set("lockScreen",1, True); + +$CORE_LOCAL->set("memlistNonMember",0, True); +$CORE_LOCAL->set("cashOverLimit",1, True); +$CORE_LOCAL->set("dollarOver",50, True); +$CORE_LOCAL->set("defaultNonMem",'11', True); + +$CORE_LOCAL->set("CustomerDisplay",0, True); +$CORE_LOCAL->set("touchscreen",False, True); + +//$CORE_LOCAL->set("SigCapture",'COM1', True); +$CORE_LOCAL->set("SigCapture",'', True); +$CORE_LOCAL->set("visitingMem",'', True); +$CORE_LOCAL->set("scalePort",'', True); +$CORE_LOCAL->set("scaleDriver",'', True); +$CORE_LOCAL->set("CCSigLimit",0, True); +$CORE_LOCAL->set("SpecialUpcClasses",array(), True); +$CORE_LOCAL->set("DiscountTypeCount",5, True); +$CORE_LOCAL->set("DiscountTypeClasses",array('NormalPricing','EveryoneSale','MemberSale','CaseDiscount','StaffSale'), True); +$CORE_LOCAL->set("PriceMethodCount",3, True); +$CORE_LOCAL->set("PriceMethodClasses",array('BasicPM','GroupPM','QttyEnforcedGroupPM'), True); +$CORE_LOCAL->set("enableFranking",0, True); +$CORE_LOCAL->set("BottleReturnDept",'', True); +$CORE_LOCAL->set("ReceiptHeaderImage",'', True); +$CORE_LOCAL->set("timeout",180000, True); +$CORE_LOCAL->set("TRDesiredTenders",array(), True); +$CORE_LOCAL->set("DrawerKickMedia", array(), True); + +@include_once(dirname(__FILE__).'/ini-local.php'); +?> diff --git a/pos/is4c-nf/install/README b/pos/is4c-nf/install/README new file mode 100644 index 000000000..9df3fc355 --- /dev/null +++ b/pos/is4c-nf/install/README @@ -0,0 +1,6 @@ +Put IS4C in apache's root directory. Have PHP installed. +Have a MySQL or SQL Server somewhere accessible. + +Navigate to this directory. Configuration is web-based. +ini.php (in the above directory) must be writeable +by apache to save your config. diff --git a/pos/is4c-nf/install/buildLTTViews.php b/pos/is4c-nf/install/buildLTTViews.php new file mode 100644 index 000000000..32b55db05 --- /dev/null +++ b/pos/is4c-nf/install/buildLTTViews.php @@ -0,0 +1,400 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function buildLTTViews($db,$type,$errors=array()){ + if (strstr($type,'mysql')) return buildLTTViewsMySQL($db,$errors); + elseif(strstr($type,'mssql')) return buildLTTViewsMSSQL($db,$errors); +} + +function buildLTTViewsMySQL($db, $errors=array()){ + +//-------------------------------------------------------------- +// CREATE lttSummary VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view lttsummary as + select + (case when min(datetime) is null then now() else min(datetime) end) as tdate, + max(card_no) as card_no, + convert(sum(total),decimal(10,2)) as runningTotal, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discountable <> 0 and tax <> 0 then total else 0 end),decimal(10,2)) as discTaxable, + convert(sum(case when discounttype in (2,3) then memDiscount else 0 end),decimal(10,2)) as memSpecial, + convert(sum(case when discounttype=4 THEN memDiscount ELSE 0 END), decimal(10,2)) as staffSpecial, + convert(sum(case when discountable = 0 then 0 else total end),decimal(10,2)) as discountableTTL, + "; + +$taxRatesQ = "select id,description from taxrates order by id"; +$taxRatesR = $db->query($taxRatesQ); +while ($taxRatesW = $db->fetch_row($taxRatesR)){ + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 then total else 0 end),decimal(10,2)) as noDiscTaxable_".$taxRatesW[1].",\n"; + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 then total else 0 end),decimal(10,2)) as discTaxable_".$taxRatesW[1].",\n"; + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 and foodstamp=1 then total else 0 end),decimal(10,2)) as fsTaxable_".$taxRatesW[1].",\n"; + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 and foodstamp=1 then total else 0 end),decimal(10,2)) as fsDiscTaxable_".$taxRatesW[1].",\n"; +} + +$createStr .= " +convert(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end),decimal(10,2)) as chargeTotal, +convert(sum(case when department = 990 then total else 0 end),decimal(10,2)) as paymentTotal, +convert(sum(case when trans_type = 'T' then total else 0 end),decimal(10,2)) as tenderTotal,\n"; +$createStr .= "convert(sum(case when trans_subtype = 'FS' or trans_subtype = 'EF' then total else 0 end),decimal(10,2)) as fsTendered, +convert(sum(case when foodstamp = 1 and discountable = 0 then total else 0 end),decimal(10,2)) as fsNoDiscTTL, +convert(sum(case when foodstamp = 1 and discountable <> 0 then total else 0 end),decimal(10,2)) as fsDiscTTL, +(case when (max(percentDiscount) is null or max(percentDiscount) < 0) then 0.00 else max(convert(percentDiscount,decimal)) end) as percentDiscount, +convert(sum(case when numflag=1 THEN total ELSE 0 END),decimal(10,2)) as localTotal, +convert(sum(case when trans_status='V' THEN -total ELSE 0 END),decimal(10,2)) as voidTotal, +max(trans_id) as LastID +from localtemptrans WHERE trans_type <> 'L'\n"; + +$errors = db_structure_modify($db,'lttsummary','DROP VIEW lttsummary',$errors); +$errors = db_structure_modify($db,'lttsummary',$createStr,$errors); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("localtemptrans","localtranstoday",$rpQ); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ .= " GROUP BY emp_no,register_no,trans_no"; +$errors = db_structure_modify($db,'rp_lttsummary','DROP VIEW rp_lttsummary',$errors); +$errors = db_structure_modify($db,'rp_lttsummary',$rpQ,$errors); +//echo str_replace("\n","<br />",$createStr)."<br />"; +//echo "<hr />"; + + +//-------------------------------------------------------------- +// CREATE lttSubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE VIEW lttsubtotals AS + select tdate,\n"; +$ratesQ = "select description,rate from taxrates"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +if (count($rates) > 0){ + $createStr .= "convert("; + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "(noDiscTaxable_".$desc[$i]." * ".$rates[$i].") + "; + $createStr .= "(discTaxable_".$desc[$i]." * ((100-percentDiscount)/100) * ".$rates[$i].") + "; + } + $createStr = substr($createStr,0,strlen($createStr)-2); + $createStr .= ",decimal(10,2)) as taxTotal,\n"; +} +else $createStr .= "0 as taxTotal,\n"; + +$createStr .= "fsTendered, +CONVERT(fsTendered + fsNoDiscTTL + (fsDiscTTL * ((100-percentDiscount)/100)), DECIMAL(10,2)) AS fsEligible,\n"; +if(count($rates) > 0){ + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "convert((fsDiscTaxable_".$desc[$i]."*((100-percentDiscount)/100)) + fsTaxable_".$desc[$i].",decimal(10,2)) as fsTaxable_".$desc[$i].","; + $createStr .= "convert((fsDiscTaxable_".$desc[$i]."*((100-percentDiscount)/100)*".$rates[$i].")+(fsTaxable_".$desc[$i]."*".$rates[$i]."),decimal(10,2)) as fsTax_".$desc[$i].",\n"; + } +} +else $createStr .= "0 as fsTax,\n"; + +$createStr .= "convert(discountableTTL * percentDiscount / 100,decimal(10,2)) as transDiscount + +from lttsummary\n"; +$errors = db_structure_modify($db,'lttsubtotals','DROP VIEW lttsubtotals',$errors); +$errors = db_structure_modify($db,'lttsubtotals',$createStr,$errors); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$errors = db_structure_modify($db,'rp_lttsubtotals','DROP VIEW rp_lttsubtotals',$errors); +$errors = db_structure_modify($db,'rp_lttsubtotals',$rpQ,$errors); +//echo str_replace("\n","<br />",$createStr)."<br />"; +//echo "<hr />"; + +//-------------------------------------------------------------- +// CREATE SubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view subtotals as +select +(case when l.LastID is null then 0 else l.LastID end) as LastID, +l.card_no as card_no, +l.runningTotal as runningTotal, +l.discountableTTL as discountableTotal, +l.tenderTotal, +l.chargeTotal, +l.paymentTotal, +l.discountTTL, +l.memSpecial, +l.staffSpecial, +s.fsEligible as fsEligible,\n"; + +$ratesQ = "select description,rate from taxrates order by rate desc"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +$fsTaxStr = "convert(CASE WHEN "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable_".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " = 0 THEN 0 ELSE CASE WHEN l.fsTendered <> 0 AND -1 * l.fsTendered >= "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable_".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " THEN -1 * ("; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTax_".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= ") ELSE CASE "; +for ($i = 0; $i < count($rates); $i++){ + $fsTaxStr .= "WHEN -1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable_".$desc[$j]; + $fsTaxStr .= "<= s.fsTaxable_".$desc[$i]; + $fsTaxStr .= " THEN -("; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "s.fsTax_".$desc[$j]."+"; + $fsTaxStr .= "((-1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable_".$desc[$j]; + $fsTaxStr .= ") * ".$rates[$i]."))"; +} +$fsTaxStr .= " ELSE 0 "; +$fsTaxStr .= " END END END,decimal(10,2))\n"; + +if(count($rates) > 0){ + $createStr .= $fsTaxStr." as fsTaxExempt,\n"; + $createStr .= "convert(s.taxTotal+".$fsTaxStr.",decimal(10,2)) as taxTotal,\n"; +} +else { + $createStr .= "0 as fsTaxExempt,\n"; + $createStr .= "0 as taxTotal,\n"; +} +$createStr .= " +s.transDiscount, +l.percentDiscount, +l.localTotal, +l.voidTotal +from lttsummary l, lttsubtotals s where l.tdate = s.tdate\n"; + +$errors = db_structure_modify($db,'subtotals','DROP VIEW subtotals',$errors); +$errors = db_structure_modify($db,'subtotals',$createStr,$errors); +$rpQ = str_replace("select","select l.emp_no,l.register_no,l.trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$rpQ = str_replace("view subtotals","view rp_subtotals",$rpQ); +$rpQ .= " AND l.emp_no=s.emp_no AND + l.register_no=s.register_no AND + l.trans_no=s.trans_no"; +$errors = db_structure_modify($db,'rp_subtotals','DROP VIEW rp_subtotals',$errors); +$errors = db_structure_modify($db,'rp_subtotals',$rpQ,$errors); +//echo str_replace("\n","<br />",$createStr)."<br />"; + +return $errors; +} + +function buildLTTViewsMSSQL($db){ + +//-------------------------------------------------------------- +// CREATE lttSummary VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view lttsummary as + select + (case when min(datetime) is null then getdate() else min(datetime) end) as tdate, + max(card_no) as card_no, + convert(numeric(10,2),sum(total)) as runningTotal, + convert(numeric(10,2),sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2),sum(case when discounttype in (2,3) then memDiscount else 0 end)) as memSpecial, + convert(numeric(10,2),sum(case when discounttype = 4 then memDiscount else 0 end)) as staffSpecial, + convert(numeric(10,2),sum(case when discountable = 0 then 0 else total end)) as discountableTTL, + "; + +$taxRatesQ = "select id,description from taxrates order by id"; +$taxRatesR = $db->query($taxRatesQ); +while ($taxRatesW = $db->fetch_row($taxRatesR)){ + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 then total else 0 end)) as noDiscTaxable_".$taxRatesW[1].","; + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 then total else 0 end)) as discTaxable_".$taxRatesW[1].","; + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 and foodstamp=1 then total else 0 end)) as fsTaxable_".$taxRatesW[1].","; + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 and foodstamp=1 then total else 0 end)) as fsDiscTaxable_".$taxRatesW[1].","; +} + +$createStr .= " +convert(numeric(10,2),sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, +convert(numeric(10,2),sum(case when department = 990 then total else 0 end)) as paymentTotal, +convert(numeric(10,2),sum(case when trans_type = 'T' then total else 0 end)) as tenderTotal,"; +$createStr .= "convert(numeric(10,2),sum(case when trans_subtype = 'FS' or trans_subtype = 'EF' then total else 0 end)) as fsTendered, +convert(numeric(10,2),sum(case when foodstamp = 1 and discountable = 0 then total else 0 end)) as fsItems, +convert(numeric(10,2),sum(case when foodstamp = 1 and discountable <> 0 then total else 0 end)) as fsDiscItems, +(case when (max(percentDiscount) is null or max(percentDiscount) < 0) then 0.00 else max(convert(numeric(10,2),percentDiscount)) end) as percentDiscount, +convert(numeric(10,2),sum(case when numflag=1 then total else 0 end)) as localTotal, +convert(numeric(10,2),sum(case when trans_status='V' then -total else 0 end)) as voidTotal, +max(trans_id) as LastID +from localtemptrans WHERE trans_type <> 'L'"; + +$db->query("DROP VIEW lttsummary"); +$db->query($createStr); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("localtemptrans","localtranstoday",$rpQ); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ .= " GROUP BY emp_no,register_no,trans_no"; +$db->query("DROP VIEW rp_lttsummary"); +$db->query($rpQ); +//echo $createStr."<br />"; +//echo "lttSummary view created<br />"; + + +//-------------------------------------------------------------- +// CREATE lttSubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE VIEW lttsubtotals AS + select tdate,"; +$ratesQ = "select description,rate from taxrates"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +if(count($rates) > 0){ + $createStr .= "convert(numeric(10,2),"; + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "(noDiscTaxable_".$desc[$i]." * ".$rates[$i].") + "; + $createStr .= "(discTaxable_".$desc[$i]." * ((100-percentDiscount)/100) * ".$rates[$i].") + "; + } + $createStr = substr($createStr,0,strlen($createStr)-2); + $createStr .= ") as taxTotal,"; +} +else $createStr .= "0 as taxTotal,"; + +$createStr .= " +fsTendered, +(fsDiscItems - convert(numeric(10,2),(fsDiscItems * (percentDiscount)/100)) +fsItems + fsTendered) as fsEligible,\n"; +if(count($rates) > 0){ + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "convert(numeric(10,2),(fsDiscTaxable_".$desc[$i]."*((100-percentDiscount)/100)) + fsTaxable_".$desc[$i].") as fsTaxable_".$desc[$i].","; + $createStr .= "convert(numeric(10,2),(fsDiscTaxable_".$desc[$i]."*((100-percentDiscount)/100)*".$rates[$i].")+(fsTaxable_".$desc[$i]."*".$rates[$i].")) as fsTax_".$desc[$i].","; + } +} +else $createStr .= "0 as fsTax,"; + +$createStr .= "convert(numeric(10,2),discountableTTL * percentDiscount / 100) as transDiscount + +from lttsummary"; +$db->query("DROP VIEW lttsubtotals"); +$db->query($createStr); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$db->query("DROP VIEW rp_lttsubtotals"); +$db->query($rpQ); +//echo $createStr."<br />"; +//echo "lttSubTotals view created<br />"; + +//-------------------------------------------------------------- +// CREATE SubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view subtotals as +select +(case when l.LastID is null then 0 else l.LastID end) as LastID, +l.card_no as card_no, +l.runningTotal as runningTotal, +l.discountableTTL as discountableTotal, +l.tenderTotal, +l.chargeTotal, +l.paymentTotal, +l.discountTTL, +l.memSpecial, +l.staffSpecial, +s.fsEligible as fsEligible,"; + +$ratesQ = "select description,rate from taxrates order by rate desc"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +$fsTaxStr = "convert(numeric(10,2),CASE WHEN "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable_".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " = 0 THEN 0 ELSE CASE WHEN -1 * l.fsTendered >= "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable_".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " THEN -1 * ("; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTax".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= ") ELSE CASE "; +for ($i = 0; $i < count($rates); $i++){ + $fsTaxStr .= "WHEN -1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable_".$desc[$j]; + $fsTaxStr .= "<= s.fsTaxable_".$desc[$i]; + $fsTaxStr .= " THEN -("; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "s.fsTax".$desc[$j]."+"; + $fsTaxStr .= "((-1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable_".$desc[$j]; + $fsTaxStr .= ") * ".$rates[$i]."))"; +} +$fsTaxStr .= " END END END)"; + +if(count($rates) > 0){ + $createStr .= $fsTaxStr." as fsTaxExempt,"; + $createStr .= "convert(numeric(10,2),s.taxTotal+".$fsTaxStr.") as taxTotal,"; +} +else { + $createStr .= "0 as fsTaxExempt,"; + $createStr .= "0 as taxTotal,"; +} +$createStr .= " +s.transDiscount, +l.percentDiscount, +l.localTotal, +l.voidTotal +from lttsummary l, lttsubtotals s where l.tdate = s.tdate"; + +$db->query("DROP VIEW subtotals"); +$db->query($createStr); +$rpQ = str_replace("select","select l.emp_no,l.register_no,l.trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$rpQ = str_replace("view subtotals","view rp_subtotals",$rpQ); +$rpQ .= " AND l.emp_no=s.emp_no AND + l.register_no=s.register_no AND + l.trans_no=s.trans_no"; +$db->query("DROP VIEW rp_subtotals"); +$db->query($rpQ); +//echo $createStr."<br />"; +//echo "SubTotals view created<br />"; + +} + +?> diff --git a/pos/is4c-nf/install/data/couponcode.sql b/pos/is4c-nf/install/data/couponcode.sql new file mode 100644 index 000000000..05b06bdfb --- /dev/null +++ b/pos/is4c-nf/install/data/couponcode.sql @@ -0,0 +1,95 @@ +('01',1,0) +('14',2,0) +('16',3,0) +('19',4,0) +('02',5,0) +('10',1,-0.1) +('13',4,-1) +('09',3,-2) +('07',3,-1.5) +('42',3,-1) +('52',3,-0.55) +('41',3,-0.5) +('38',3,-0.3) +('37',3,-0.25) +('08',2,-3) +('51',2,-2) +('48',2,-1.85) +('47',2,-1.75) +('46',2,-1.6) +('36',2,-1.5) +('44',2,-1.35) +('34',2,-1.25) +('43',2,-1.1) +('32',2,-0.75) +('98',2,-0.65) +('31',2,-0.6) +('23',2,-0.45) +('22',2,-0.4) +('21',2,-0.35) +('56',2,-0.2) +('54',2,-0.15) +('53',2,-0.1) +('33',2,-1) +('28',2,-0.55) +('24',2,-0.5) +('58',2,-0.3) +('57',2,-0.25) +('61',1,-10) +('62',1,-9.5) +('63',1,-9) +('64',1,-8.5) +('66',1,-8) +('67',1,-7.5) +('68',1,-7) +('71',1,-6.5) +('72',1,-6) +('73',1,-5.5) +('74',1,-5) +('96',1,-4.5) +('93',1,-4) +('92',1,-3.75) +('91',1,-3.5) +('88',1,-3.25) +('87',1,-3) +('26',1,-2.85) +('86',1,-2.75) +('18',1,-2.6) +('84',1,-2.5) +('83',1,-2.25) +('82',1,-2) +('11',1,-1.85) +('81',1,-1.75) +('06',1,-1.6) +('78',1,-1.5) +('05',1,-1.4) +('04',1,-1.35) +('77',1,-1.25) +('03',1,-1.1) +('76',1,-1) +('99',1,-0.99) +('95',1,-0.95) +('90',1,-0.9) +('85',1,-0.85) +('89',1,-0.89) +('80',1,-0.8) +('79',1,-0.79) +('75',1,-0.75) +('70',1,-0.7) +('69',1,-0.69) +('65',1,-0.65) +('60',1,-0.6) +('59',1,-0.59) +('55',1,-0.55) +('50',1,-0.5) +('49',1,-0.49) +('45',1,-0.45) +('40',1,-0.4) +('39',1,-0.39) +('35',1,-0.35) +('30',1,-0.3) +('29',1,-0.29) +('20',1,-0.2) +('25',1,-0.25) +('15',1,-0.15) +('12',1,-0.12) diff --git a/pos/is4c-nf/install/data/couponcodes.sql b/pos/is4c-nf/install/data/couponcodes.sql new file mode 100644 index 000000000..05b06bdfb --- /dev/null +++ b/pos/is4c-nf/install/data/couponcodes.sql @@ -0,0 +1,95 @@ +('01',1,0) +('14',2,0) +('16',3,0) +('19',4,0) +('02',5,0) +('10',1,-0.1) +('13',4,-1) +('09',3,-2) +('07',3,-1.5) +('42',3,-1) +('52',3,-0.55) +('41',3,-0.5) +('38',3,-0.3) +('37',3,-0.25) +('08',2,-3) +('51',2,-2) +('48',2,-1.85) +('47',2,-1.75) +('46',2,-1.6) +('36',2,-1.5) +('44',2,-1.35) +('34',2,-1.25) +('43',2,-1.1) +('32',2,-0.75) +('98',2,-0.65) +('31',2,-0.6) +('23',2,-0.45) +('22',2,-0.4) +('21',2,-0.35) +('56',2,-0.2) +('54',2,-0.15) +('53',2,-0.1) +('33',2,-1) +('28',2,-0.55) +('24',2,-0.5) +('58',2,-0.3) +('57',2,-0.25) +('61',1,-10) +('62',1,-9.5) +('63',1,-9) +('64',1,-8.5) +('66',1,-8) +('67',1,-7.5) +('68',1,-7) +('71',1,-6.5) +('72',1,-6) +('73',1,-5.5) +('74',1,-5) +('96',1,-4.5) +('93',1,-4) +('92',1,-3.75) +('91',1,-3.5) +('88',1,-3.25) +('87',1,-3) +('26',1,-2.85) +('86',1,-2.75) +('18',1,-2.6) +('84',1,-2.5) +('83',1,-2.25) +('82',1,-2) +('11',1,-1.85) +('81',1,-1.75) +('06',1,-1.6) +('78',1,-1.5) +('05',1,-1.4) +('04',1,-1.35) +('77',1,-1.25) +('03',1,-1.1) +('76',1,-1) +('99',1,-0.99) +('95',1,-0.95) +('90',1,-0.9) +('85',1,-0.85) +('89',1,-0.89) +('80',1,-0.8) +('79',1,-0.79) +('75',1,-0.75) +('70',1,-0.7) +('69',1,-0.69) +('65',1,-0.65) +('60',1,-0.6) +('59',1,-0.59) +('55',1,-0.55) +('50',1,-0.5) +('49',1,-0.49) +('45',1,-0.45) +('40',1,-0.4) +('39',1,-0.39) +('35',1,-0.35) +('30',1,-0.3) +('29',1,-0.29) +('20',1,-0.2) +('25',1,-0.25) +('15',1,-0.15) +('12',1,-0.12) diff --git a/pos/is4c-nf/install/data/custdata.csv b/pos/is4c-nf/install/data/custdata.csv new file mode 120000 index 000000000..613ad813d --- /dev/null +++ b/pos/is4c-nf/install/data/custdata.csv @@ -0,0 +1 @@ +../../../../fannie/install/sample_data/custdata.csv \ No newline at end of file diff --git a/pos/is4c-nf/install/data/departments.sql b/pos/is4c-nf/install/data/departments.sql new file mode 100644 index 000000000..9a7c5cd85 --- /dev/null +++ b/pos/is4c-nf/install/data/departments.sql @@ -0,0 +1,247 @@ +('92','HBHBA','1','0',50.00,0.01,'0','2005-13-12','1') +('104','HHOMEOPATHIC','1','0',50.00,0.01,'0','2005-13-12','1') +('14','BWATER','0','1',50.00,0.01,'0','2005-13-12','1') +('191','GSOBEVNOTAX','0','1',50.00,0.01,'0','2005-13-12','1') +('246','GMSOGENMERCH','1','0',50.00,0.01,'0','2005-13-12','1') +('249','GMSEEDSFLWR','1','0',50.00,0.01,'0','2005-13-12','1') +('247','PTRANSFLWR','1','0',50.00,0.01,'0','2005-13-12','1') +('248','PTRANSEDIBLE','0','1',50.00,0.01,'0','2005-13-12','1') +('250','GMSEEDSEDIBLE','0','1',50.00,0.01,'0','2005-13-12','1') +('1','BBAKING','0','1',50.00,0.01,'0','1900-01-01','1') +('2','BBEAN','0','1',50.00,0.01,'0','1900-01-01','1') +('3','BCEREAL','0','1',50.00,0.01,'0','1900-01-01','1') +('4','BDRIEDFRU','0','1',50.00,0.01,'0','1900-01-01','1') +('5','BFLOUR','0','1',50.00,0.01,'0','1900-01-01','1') +('6','BGRAIN','0','1',50.00,0.01,'0','1900-01-01','1') +('7','BMIXES','0','1',50.00,0.01,'0','1900-01-01','1') +('8','BNUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('10','BPASTA','0','1',50.00,0.01,'0','1900-01-01','1') +('11','BRICE','0','1',50.00,0.01,'0','1900-01-01','1') +('12','BSNACK','0','1',50.00,0.01,'0','1900-01-01','1') +('13','BOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('15','BOIL','0','1',50.00,0.01,'0','1900-01-01','1') +('16','BCANDY','1','1',50.00,0.01,'0','1900-01-01','1') +('17','BCHOC','1','1',50.00,0.01,'0','1900-01-01','1') +('18','BNONFOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('19','BTAXFOOD','1','1',50.00,0.01,'0','1900-01-01','1') +('21','BAGREFUN','0','1',50.00,0.01,'0','1900-01-01','1') +('22','BSOBULK B','0','1',50.00,0.01,'0','1900-01-01','1') +('23','PREPACK','0','1',50.00,0.01,'0','1900-01-01','1') +('24','BSOBULK A','0','1',50.00,0.01,'0','1900-01-01','1') +('25','BSO NONFOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('26','CBUTTER','0','1',50.00,0.01,'0','1900-01-01','1') +('27','CDAIRY','0','1',50.00,0.01,'0','1900-01-01','1') +('28','CEGGS','0','1',50.00,0.01,'0','1900-01-01','1') +('29','CJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('30','CMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('31','CSOY','0','1',50.00,0.01,'0','1900-01-01','1') +('32','CSOYMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('188','GBEVNOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('34','COTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('38','FZBAK','0','1',50.00,0.01,'0','1900-01-01','1') +('39','FZDEZ','0','1',50.00,0.01,'0','1900-01-01','1') +('40','FZENTREE','0','1',50.00,0.01,'0','1900-01-01','1') +('41','FZFRUITVE','0','1',50.00,0.01,'0','1900-01-01','1') +('42','FZJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('261','MEAT FZ','0','1',50.00,0.01,'0','1900-01-01','1') +('44','FZPIZZA','0','1',50.00,0.01,'0','1900-01-01','1') +('45','FZSOY','0','1',50.00,0.01,'0','1900-01-01','1') +('46','FZOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('189','GBEVTAX','1','1',50.00,0.01,'0','1900-01-01','1') +('54','CJUGRETUR','0','1',50.00,0.01,'0','1900-01-01','1') +('55','CSO','0','1',50.00,0.01,'0','1900-01-01','1') +('56','CSOMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('57','FZSO','0','1',50.00,0.01,'0','1900-01-01','1') +('190','GSOBEVTAX','1','1',50.00,0.01,'0','1900-01-01','1') +('59','CCOUPON','0','1',50.00,0.01,'0','1900-01-01','1') +('60','DBAKED','2','0',50.00,0.01,'0','1900-01-01','1') +('63','DCASE','2','0',50.00,0.01,'0','1900-01-01','1') +('64','DPREPACK','2','0',50.00,0.01,'0','1900-01-01','1') +('65','DSANDWICH','2','0',50.00,0.01,'0','1900-01-01','1') +('66','DSOUP','0','0',50.00,0.01,'0','1900-01-01','1') +('67','DSTEAMTAB','2','0',50.00,0.01,'0','1900-01-01','1') +('68','DOTHER','2','0',50.00,0.01,'0','1900-01-01','1') +('69','DBEVERAGE','2','0',50.00,0.01,'0','1900-01-01','1') +('70','DPREPCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('71','DPORTCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('72','DSOCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('73','DSO','2','0',50.00,0.01,'0','1900-01-01','1') +('74','DCOUPON','1','0',50.00,0.01,'0','1900-01-01','1') +('150','DOutsideBakery','0','1',50.00,0.01,'0','1900-01-01','1') +('151','GTEA','0','1',50.00,0.01,'0','1900-01-01','1') +('152','GBABY','0','1',50.00,0.01,'0','1900-01-01','1') +('153','GBAK/MIX','0','1',50.00,0.01,'0','1900-01-01','1') +('154','GBARS','0','1',50.00,0.01,'0','1900-01-01','1') +('155','GCOOK/BKD','0','1',50.00,0.01,'0','1900-01-01','1') +('156','GCANBNVEG','0','1',50.00,0.01,'0','1900-01-01','1') +('157','GCEREAL','0','1',50.00,0.01,'0','1900-01-01','1') +('158','GCHIP','0','1',50.00,0.01,'0','1900-01-01','1') +('159','GCRACK/SN','0','1',50.00,0.01,'0','1900-01-01','1') +('160','GCOND/VIN','0','1',50.00,0.01,'0','1900-01-01','1') +('161','GETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('162','GCANDYNOT','0','1',50.00,0.01,'0','1900-01-01','1') +('163','GGRAIN/RI','0','1',50.00,0.01,'0','1900-01-01','1') +('164','GJAM','0','1',50.00,0.01,'0','1900-01-01','1') +('165','GJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('166','GMILK/POW','0','1',50.00,0.01,'0','1900-01-01','1') +('167','GMIX/PREP','0','1',50.00,0.01,'0','1900-01-01','1') +('168','GNUTBUTTE','0','1',50.00,0.01,'0','1900-01-01','1') +('169','GOIL','0','1',50.00,0.01,'0','1900-01-01','1') +('170','GPASTA','0','1',50.00,0.01,'0','1900-01-01','1') +('171','GPICK/OLI','0','1',50.00,0.01,'0','1900-01-01','1') +('172','GSEAFOOD','0','1',50.00,0.01,'0','1900-01-01','1') +('173','GSALAD/DR','0','1',50.00,0.01,'0','1900-01-01','1') +('174','GSOUPCAN','0','1',50.00,0.01,'0','1900-01-01','1') +('175','GSOUP/PKG','0','1',50.00,0.01,'0','1900-01-01','1') +('176','GSWEETENE','0','1',50.00,0.01,'0','1900-01-01','1') +('177','GTOMATO','0','1',50.00,0.01,'0','1900-01-01','1') +('178','GSO NOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('179','GCANDY','1','1',50.00,0.01,'0','1900-01-01','1') +('180','GCANDYSO','1','1',50.00,0.01,'0','1900-01-01','1') +('181','GHHCLEANR','1','0',50.00,0.01,'0','1900-01-01','1') +('182','GNFPET','1','0',50.00,0.01,'0','1900-01-01','1') +('183','GHHPAPER','1','0',50.00,0.01,'0','1900-01-01','1') +('185','GNFOODSO','1','0',50.00,0.01,'0','1900-01-01','1') +('186','GOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('251','BCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('252','BDRVEGGIE','0','1',50.00,0.01,'0','1900-01-01','1') +('253','BHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('254','BORGHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('255','BTEA','0','1',50.00,0.01,'0','1900-01-01','1') +('256','BVIT','1','0',50.00,0.01,'0','1900-01-01','1') +('257','BFOOD','0','1',50.00,0.01,'0','1900-01-01','1') +('245','BPKGCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('239','BPACKNOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('93','HBODYCARE','1','0',50.00,0.01,'0','1900-01-01','1') +('94','HFACIAL','1','0',50.00,0.01,'0','1900-01-01','1') +('95','HBATH','1','0',50.00,0.01,'0','1900-01-01','1') +('96','HHAIR','1','0',50.00,0.01,'0','1900-01-01','1') +('97','HLOTION','1','0',50.00,0.01,'0','1900-01-01','1') +('98','HSOAP','1','0',50.00,0.01,'0','1900-01-01','1') +('99','HTEETH','1','0',50.00,0.01,'0','1900-01-01','1') +('100','HNONTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('101','HVITSUPPL','1','0',50.00,0.01,'0','1900-01-01','1') +('102','HHERB','1','0',50.00,0.01,'0','1900-01-01','1') +('103','HOTHER','1','0',50.00,0.01,'0','1900-01-01','1') +('244','GMBooks','1','0',50.00,0.01,'0','1900-01-01','1') +('258','BSOHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('259','BSOCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('123','HSOBODYCA','1','0',50.00,0.01,'0','1900-01-01','1') +('124','HSOVITHERB','1','0',50.00,0.01,'0','1900-01-01','1') +('125','HSOBHBA','1','0',50.00,0.01,'0','1900-01-01','1') +('243','GMSOBooks','1','0',50.00,0.01,'0','1900-01-01','1') +('127','HSONOTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('128','HCOUPON','1','0',50.00,0.01,'0','1900-01-01','1') +('600','SUPPLIES','0','0',50.00,0.01,'0','1900-01-01','1') +('187','GNONFDNOTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('500','FLOWERS','1','0',50.00,0.01,'0','1900-01-01','1') +('502','PRODUCE KEY','0','1',50.00,0.01,'0','1900-01-01','1') +('604','MISC PO','0','0',50.00,0.01,'0','1900-01-01','1') +('503','BASKETS','0','1',50.00,0.01,'0','1900-01-01','1') +('505','TRANSEDIBLE','1','1',50.00,0.01,'0','1900-01-01','1') +('507','SO TAX','1','0',50.00,0.01,'0','1900-01-01','1') +('200','PFLOWERS','1','1',50.00,0.01,'0','1900-01-01','1') +('201','PFRUIT','0','1',50.00,0.01,'0','1900-01-01','1') +('202','PJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('203','PNONFOOD','1','1',50.00,0.01,'0','1900-01-01','1') +('204','POTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('205','PREVRACK','1','1',50.00,0.01,'0','1900-01-01','1') +('206','PSO','0','1',50.00,0.01,'0','1900-01-01','1') +('208','PVEGGIE','0','1',50.00,0.01,'0','1900-01-01','1') +('209','PSEEDS','0','1',50.00,0.01,'0','1900-01-01','1') +('210','PRODREVN','0','1',50.00,0.01,'0','1900-01-01','1') +('220','PCOUPON','0','1',50.00,0.01,'0','1900-01-01','1') +('900','GIFTCERT','0','0',50.00,0.01,'0','1900-01-01','1') +('990','ARPAYMEN','0','0',50.00,0.01,'0','1900-01-01','1') +('991','CLASS B Equity','0','0',80.00,0.01,'0','1900-01-01','1') +('700','TOTES','0','0',50.00,0.01,'0','1900-01-01','1') +('508','ASIAN','0','1',50.00,0.01,'0','1900-01-01','1') +('510','BRASSICA','0','1',50.00,0.01,'0','1900-01-01','1') +('703','MISCRECEIPT','0','0',50.00,0.01,'0','1900-01-01','1') +('512','ETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('513','GREENS','0','1',50.00,0.01,'0','1900-01-01','1') +('992','CLASS A Equity','0','0',20.00,0.01,'0','1900-01-01','1') +('61','DOUTDESSERTS','2','0',50.00,0.01,'0','1900-01-01','1') +('62','DCO-OPSHARE','2','0',50.00,0.01,'0','1900-01-01','1') +('225','DGGSALADS','2','0',50.00,0.01,'0','1900-01-01','1') +('226','DGGSANDWICH','2','0',50.00,0.01,'0','1900-01-01','1') +('227','DOLIVES','0','0',50.00,0.01,'0','1900-01-01','1') +('228','DDGGENTREE','2','0',50.00,0.01,'0','1900-01-01','1') +('229','DDESSERT','0','0',50.00,0.01,'0','1900-01-01','1') +('230','DPREPCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('231','DPORCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('232','DFAKECHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('233','DSOCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('37','CBEVERAGE','0','1',50.00,0.01,'0','1900-01-01','1') +('35','CYOGURT','0','1',50.00,0.01,'0','1900-01-01','1') +('260','MEAT FRESH','0','1',50.00,0.01,'0','1900-01-01','1') +('242','GMGENERAL','1','0',50.00,0.01,'0','1900-01-01','1') +('902','GIFTCARD','0','0',300.00,0.01,'0','1990-01-01','1') +('234','DVENDORS','0','1',50.00,0.01,'0','1900-01-01','1') +('235','MARKETING SALES','1','0',50.00,0.01,'0','1900-01-01','1') +('501','NON-FOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('240','GMMag','1','0',50.00,0.01,'0','2005-13-11','1') +('241','GMCards','1','0',50.00,0.01,'0','2005-13-11','1') +('262','MeatSOFrsh','0','1',50.00,0.01,'0','2005-13-12','1') +('263','MeatSOFrzn','0','1',50.00,0.01,'0','2005-13-12','1') +('53','CSOButter','0','1',50.00,0.01,'0','2005-13-12','1') +('800','IT Corrections','0','1',9999.00,'-9999.00','0','2006-08-01','1001') +('238','POLDFLOWERS','1','0',50.00,0.01,NULL,'2005-28-03','1') +('708','CLASSES','0','0',50.00,0.01,NULL,'2006-06-04','1001') +('75','DSOBAKED','0','0',50.00,0.01,'0','2006-11-05','1') +('207','PSOTAX','1','1',50.00,0.01,'0','2006-16-06','1') +('610','RRR','0','0',50.00,0.01,'0','2006-24-10','1001') +('76','DDELI MEATS','0','0',50.00,0.01,'0','1900-01-01','1') +('504','TRAYS','1','0',50.00,0.01,'0','1900-01-01','1') +('86','HSEASONAL','1','0',50.00,0.01,'0','2008-10-04','1') +('506','TRANSNONEDIBLE','1','0',50.00,0.01,'0','1900-01-01','1') +('509','BEAN','0','1',50.00,0.01,'0','1900-01-01','1') +('511','CARROTS','0','1',50.00,0.01,'0','1900-01-01','1') +('514','HERBS','0','1',50.00,0.01,'0','1900-01-01','1') +('515','LETTUCE','0','1',50.00,0.01,'0','1900-01-01','1') +('516','MUSHROOMS','0','1',50.00,0.01,'0','1900-01-01','1') +('517','ONIONS','0','1',50.00,0.01,'0','1900-01-01','1') +('518','PEPPERS','0','1',50.00,0.01,'0','1900-01-01','1') +('519','POTATOES','0','1',50.00,0.01,'0','1900-01-01','1') +('520','ROOTS','0','1',50.00,0.01,'0','1900-01-01','1') +('521','SALADS','0','1',50.00,0.01,'0','1900-01-01','1') +('522','SPROUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('523','SQUASH','0','1',50.00,0.01,'0','1900-01-01','1') +('524','TOMATOES','0','1',50.00,0.01,'0','1900-01-01','1') +('525','WSQUASH','0','1',50.00,0.01,'0','1900-01-01','1') +('526','YAMS','0','1',50.00,0.01,'0','1900-01-01','1') +('527','VEGGMISC','0','1',50.00,0.01,'0','1900-01-01','1') +('528','VEGGJAR','0','1',50.00,0.01,'0','1900-01-01','1') +('529','VEGGCUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('540','APPLEBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('541','APPLES','0','1',50.00,0.01,'0','1900-01-01','1') +('542','BERRIES','0','1',50.00,0.01,'0','1900-01-01','1') +('543','CITRUSBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('544','CITRUS','0','1',50.00,0.01,'0','1900-01-01','1') +('545','PEARBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('546','PEARS','0','1',50.00,0.01,'0','1900-01-01','1') +('547','TROPICAL','0','1',50.00,0.01,'0','1900-01-01','1') +('548','NUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('549','ETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('550','FIGS','0','1',50.00,0.01,'0','1900-01-01','1') +('551','GRAPES','0','1',50.00,0.01,'0','1900-01-01','1') +('552','FRUITJAR','0','1',50.00,0.01,'0','1900-01-01','1') +('553','FRUITMISC','0','1',50.00,0.01,'0','1900-01-01','1') +('554','FRUITCUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('555','MELONS','0','1',50.00,0.01,'0','1900-01-01','1') +('556','STONEFRUIT','0','1',50.00,0.01,'0','1900-01-01','1') +('557','AVOCADOS','0','1',50.00,0.01,'0','1900-01-01','1') +('535','PRODUCE CORRECTION','0','1',50.00,0.01,'0','2008-02-04','1') +('87','HLIP','1','0',50.00,0.01,'0','2008-10-04','1') +('88','HDEOD','1','0',50.00,0.01,'0','2008-10-04','1') +('89','HAROMATHERPY','1','0',50.00,0.01,'0','2008-10-04','1') +('90','HFIRSTAID','1','0',50.00,0.01,'0','2008-10-04','1') +('91','HKIDSBODY','1','0',50.00,0.01,'0','2008-10-04','1') +('105','HPROTEIN','1','0',50.00,0.01,'0','2008-10-04','1') +('106','HJUICE','1','0',50.00,0.01,'0','2008-10-04','1') +('107','HGREENS','1','0',50.00,0.01,'0','2008-10-04','1') +('108','HKIDSSUPP','1','0',50.00,0.01,'0','2008-10-04','1') +('881','MISC #1','0','0',50.00,0.01,'0','2008-12-08','1') +('882','MISC #2','0','0',50.00,0.01,'0','2008-12-08','1') +('236','MARKETING PROMO','0','0',50.00,0.01,'0','2009-26-01','1') +('77','DSPECIALEVENT','2','0',50.00,0.01,'0','2009-10-09','1') diff --git a/pos/is4c-nf/install/data/employees.sql b/pos/is4c-nf/install/data/employees.sql new file mode 100644 index 000000000..9fbc18ec6 --- /dev/null +++ b/pos/is4c-nf/install/data/employees.sql @@ -0,0 +1,2 @@ +(56,56,56,'Kate','Kipling','STAFF',1,20,20,'1975-11-05') +(7000,7000,7000,'John','Norton','SUB',1,15,15,'1976-07-04') \ No newline at end of file diff --git a/pos/is4c-nf/install/data/globalvalues.sql b/pos/is4c-nf/install/data/globalvalues.sql new file mode 100644 index 000000000..934d1081e --- /dev/null +++ b/pos/is4c-nf/install/data/globalvalues.sql @@ -0,0 +1 @@ +(6000,'ADMIN ',0,11,0,0,0) diff --git a/pos/is4c-nf/install/data/products.csv b/pos/is4c-nf/install/data/products.csv new file mode 120000 index 000000000..a1259b561 --- /dev/null +++ b/pos/is4c-nf/install/data/products.csv @@ -0,0 +1 @@ +../../../../fannie/install/sample_data/products.csv \ No newline at end of file diff --git a/pos/is4c-nf/install/data/subdepts.sql b/pos/is4c-nf/install/data/subdepts.sql new file mode 100644 index 000000000..040f6cab8 --- /dev/null +++ b/pos/is4c-nf/install/data/subdepts.sql @@ -0,0 +1,246 @@ +('5','HBC','92') +('5','HBC','104') +('1','BULK','14') +('4','GROCERY','191') +('9','Gen Merch','246') +('9','Gen Merch','249') +('6','Produce','247') +('6','Produce','248') +('9','Gen Merch','250') +('1','BULK','1') +('1','BULK','2') +('1','BULK','3') +('1','BULK','4') +('1','BULK','5') +('1','BULK','6') +('1','BULK','7') +('1','BULK','8') +('1','BULK','10') +('1','BULK','11') +('1','BULK','12') +('1','BULK','13') +('1','BULK','15') +('1','BULK','16') +('1','BULK','17') +('1','BULK','18') +('1','BULK','19') +('1','BULK','21') +('1','BULK','22') +('1','BULK','23') +('1','BULK','24') +('1','BULK','25') +('2','COOL/FROZEN','26') +('2','COOL/FROZEN','27') +('2','COOL/FROZEN','28') +('2','COOL/FROZEN','29') +('2','COOL/FROZEN','30') +('2','COOL/FROZEN','31') +('2','COOL/FROZEN','32') +('4','GROCERY','188') +('2','COOL/FROZEN','34') +('2','COOL/FROZEN','38') +('2','COOL/FROZEN','39') +('2','COOL/FROZEN','40') +('2','COOL/FROZEN','41') +('2','COOL/FROZEN','42') +('8','Meat','261') +('2','COOL/FROZEN','44') +('2','COOL/FROZEN','45') +('2','COOL/FROZEN','46') +('4','GROCERY','189') +('2','COOL/FROZEN','54') +('2','COOL/FROZEN','55') +('2','COOL/FROZEN','56') +('2','COOL/FROZEN','57') +('4','GROCERY','190') +('2','COOL/FROZEN','59') +('3','DELI','60') +('3','DELI','63') +('3','DELI','64') +('3','DELI','65') +('3','DELI','66') +('3','DELI','67') +('3','DELI','68') +('3','DELI','69') +('3','DELI','70') +('3','DELI','71') +('3','DELI','72') +('3','DELI','73') +('3','DELI','74') +('3','DELI','150') +('4','GROCERY','151') +('4','GROCERY','152') +('4','GROCERY','153') +('4','GROCERY','154') +('4','GROCERY','155') +('4','GROCERY','156') +('4','GROCERY','157') +('4','GROCERY','158') +('4','GROCERY','159') +('4','GROCERY','160') +('4','GROCERY','161') +('4','GROCERY','162') +('4','GROCERY','163') +('4','GROCERY','164') +('4','GROCERY','165') +('4','GROCERY','166') +('4','GROCERY','167') +('4','GROCERY','168') +('4','GROCERY','169') +('4','GROCERY','170') +('4','GROCERY','171') +('4','GROCERY','172') +('4','GROCERY','173') +('4','GROCERY','174') +('4','GROCERY','175') +('4','GROCERY','176') +('4','GROCERY','177') +('4','GROCERY','178') +('4','GROCERY','179') +('4','GROCERY','180') +('4','GROCERY','181') +('4','GROCERY','182') +('4','GROCERY','183') +('4','GROCERY','185') +('4','GROCERY','186') +('1','BULK','251') +('1','BULK','252') +('1','BULK','253') +('1','BULK','254') +('1','BULK','255') +('1','BULK','256') +('1','BULK','257') +('1','BULK','245') +('1','BULK','239') +('5','HBC','93') +('5','HBC','94') +('5','HBC','95') +('5','HBC','96') +('5','HBC','97') +('5','HBC','98') +('5','HBC','99') +('5','HBC','100') +('5','HBC','101') +('5','HBC','102') +('5','HBC','103') +('9','Gen Merch','244') +('1','BULK','258') +('1','BULK','259') +('5','HBC','123') +('5','HBC','124') +('5','HBC','125') +('9','Gen Merch','243') +('5','HBC','127') +('5','HBC','128') +('0','Misc','600') +('4','GROCERY','187') +('6','Produce','500') +('6','Produce','502') +('0','Misc','604') +('6','Produce','503') +('6','Produce','505') +('6','Produce','507') +('6','Produce','200') +('6','Produce','201') +('6','Produce','202') +('6','Produce','203') +('6','Produce','204') +('6','Produce','205') +('6','Produce','206') +('6','Produce','208') +('6','Produce','209') +('6','Produce','210') +('6','Produce','220') +('0','Misc','900') +('0','Misc','990') +('0','Misc','991') +('0','Misc','700') +('6','Produce','508') +('6','Produce','510') +('0','Misc','703') +('6','Produce','512') +('6','Produce','513') +('0','Misc','992') +('3','DELI','61') +('3','DELI','62') +('3','DELI','225') +('3','DELI','226') +('3','DELI','227') +('3','DELI','228') +('3','DELI','229') +('3','DELI','230') +('3','DELI','231') +('3','DELI','232') +('3','DELI','233') +('2','COOL/FROZEN','37') +('2','COOL/FROZEN','35') +('8','Meat','260') +('9','Gen Merch','242') +('0','Misc','902') +('3','DELI','234') +('7','Marketing','235') +('6','Produce','501') +('9','Gen Merch','240') +('9','Gen Merch','241') +('8','Meat','262') +('8','Meat','263') +('2','COOL/FROZEN','53') +('0','Misc','800') +('6','Produce','238') +('0','Misc','708') +('3','DELI','75') +('6','Produce','207') +('0','Misc','610') +('3','DELI','76') +('6','Produce','504') +('5','HBC','86') +('6','Produce','506') +('6','Produce','509') +('6','Produce','511') +('6','Produce','514') +('6','Produce','515') +('6','Produce','516') +('6','Produce','517') +('6','Produce','518') +('6','Produce','519') +('6','Produce','520') +('6','Produce','521') +('6','Produce','522') +('6','Produce','523') +('6','Produce','524') +('6','Produce','525') +('6','Produce','526') +('6','Produce','527') +('6','Produce','528') +('6','Produce','529') +('6','Produce','540') +('6','Produce','541') +('6','Produce','542') +('6','Produce','543') +('6','Produce','544') +('6','Produce','545') +('6','Produce','546') +('6','Produce','547') +('6','Produce','548') +('6','Produce','549') +('6','Produce','550') +('6','Produce','551') +('6','Produce','552') +('6','Produce','553') +('6','Produce','554') +('6','Produce','555') +('6','Produce','556') +('6','Produce','557') +('6','Produce','535') +('5','HBC','87') +('5','HBC','88') +('5','HBC','89') +('5','HBC','90') +('5','HBC','91') +('5','HBC','105') +('5','HBC','106') +('5','HBC','107') +('5','HBC','108') +('0','Misc','881') +('0','Misc','882') +('7','Marketing','236') diff --git a/pos/is4c-nf/install/data/tenders.sql b/pos/is4c-nf/install/data/tenders.sql new file mode 100644 index 000000000..4c3722310 --- /dev/null +++ b/pos/is4c-nf/install/data/tenders.sql @@ -0,0 +1,19 @@ +(1,'CA','Cash','CA','Change',0,500,500) +(2,'CK','Check','CKCB','Cash Back',0,500,0) +(3,'CC','Credit Card','','',0,500,99999) +(4,'DC','Debit Card','DCCB','Cash Back',0,100,0) +(5,'FS','EBT','','',0,100,10) +(6,'MC','Coupons','','',0,20,0.01) +(7,'MI','Instore Charges','','',0,1000,5) +(8,'TC','Gift Certificate','TCCB','Change',0.01,0,10) +(9,'EC','EBT Cash','ECCB','ECT Cash Back',0,500,0) +(10,'WT','WIC','CK','',0.01,900,0) +(11,'IC','Instore Coupon','','',0.01,5,0) +(12,'CX','Corp. Charge','','',0.01,9999,0) +(13,'LN','Tender','','',0.01,9999,0) +(14,'CP','Coupons','','',0,20,0.01) +(15,'EF','EBT FS','','',0,100,10) +(16,'GD','Gift Card','CA','Credit Acct',0,500,10) +(17,'TV','Travelers Check','CK','Change',0,500,500) +(18,'MA','MAD Coupon','CA','',0.01,2.5,0) +(19,'RR','RRR Coupon','CA','',0.01,1,0) diff --git a/pos/is4c-nf/install/db-ini.php b/pos/is4c-nf/install/db-ini.php new file mode 100644 index 000000000..b88f25570 --- /dev/null +++ b/pos/is4c-nf/install/db-ini.php @@ -0,0 +1,113 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>Manage Configuration via Database</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Config Management</h2> + +<div class="alert success"><em> +<?php if (isset($_POST['writeLocal'])){ + write_conf_from_db(); + echo 'Wrote to ini.php'; +} +else if (isset($_POST['sendToServer'])){ + send_conf_to_server(); + echo 'Shipped settings to server'; +} +else if (isset($_POST['fetchFromServer'])){ + get_conf_from_server(); + echo 'Got settings to server<br />'; + echo 'Wrote to ini.php'; +} +?> +</em></div> + +<?php +/** + Check for connectivity, configurations to + determine available options +*/ + +$local_db = db_test_connect($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('pDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); +$local_config = False; +if ($local_db){ + $test = $local_db->query('SELECT keycode, value FROM lane_config'); + if ($test) $local_config = $local_db->num_rows($test); +} + +$remote_db = db_test_connect($CORE_LOCAL->get('mServer'), + $CORE_LOCAL->get('mDBMS'), + $CORE_LOCAL->get('mDatabase'), + $CORE_LOCAL->get('mUser'), + $CORE_LOCAL->get('mPass')); +$remote_config = False; +if ($remote_db){ + $test = $remote_db->query('SELECT keycode, value FROM lane_config'); + if ($test) $remote_config = $remote_db->num_rows($test); +} +?> + +<form action=db-ini.php method=post> + +<?php if ($local_db !== False && $local_config){ ?> +<p> +Write settings from the lane's configuration database to ini.php. +<br /> +<input type="submit" name="writeLocal" + value="Write <?php echo $local_config; ?> Settings to ini.php" /> +</p> +<?php } else if ($local_db === False){?> +Cannot connect to local database +<?php } else if (!$local_config){ ?> +Local configuration database is empty +<?php } ?> +<hr /> + +<?php if ($local_db !== False && $local_config && $remote_db !== False){ ?> +<p> +Send this lane's configuration database to the server. +<br /> +<input type="submit" name="sendToServer" + value="Write <?php echo $local_config; ?> Settings to Server" /> +</p> +<?php } else if ($local_db === False){?> +Cannot connect to local database +<?php } else if ($remote_db === False){?> +Cannot connect to server database +<?php } else if (!$local_config){ ?> +Local configuration database is empty +<?php } ?> +<hr /> + +<?php if ($local_db !== False && $remote_config && $remote_db !== False){ ?> +<p> +Get configuration settings from the server database. +<br /> +<input type="submit" name="fetchFromServer" + value="Get <?php echo $remote_config; ?> Settings from Server" /> +</p> +<?php } else if ($local_db === False){?> +Cannot connect to local database +<?php } else if ($remote_db === False){?> +Cannot connect to server database +<?php } else if (!$remote_config){ ?> +Server configuration database is empty +<?php } ?> +<hr /> diff --git a/pos/is4c-nf/install/debug.php b/pos/is4c-nf/install/debug.php new file mode 100644 index 000000000..f2f1df957 --- /dev/null +++ b/pos/is4c-nf/install/debug.php @@ -0,0 +1,74 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>Debug Settings</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Debug Settings</h2> +<b>Logs</b><br /> +Default logs: +<ul> + <li><i>php-errors.log</i> contains PHP errors, warnings, notices, etc depending on error reporting settings for PHP installation.</li> + <li><i>queries.log</i> lists failed queries</li> +</ul> +<div class="alert"><?php check_writeable('../log/php-errors.log'); ?></div> +<div class="alert"><?php check_writeable('../log/queries.log'); ?></div> +Optional logs: +<ul> + <li><i>core_local.log</i> lists changes to session/state values. Fills FAST.</li> +</ul> +<div class="alert"><?php check_writeable('../log/core_local.log','True'); ?></div> +<hr /> +<form action=debug.php method=post> +<b>Log State Changes</b>: <select name=DEBUG_STATE> +<?php +if(isset($_REQUEST['DEBUG_STATE'])) $CORE_LOCAL->set('Debug_CoreLocal',$_REQUEST['DEBUG_STATE'],True); +if ($CORE_LOCAL->get("Debug_CoreLocal") == 1){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0>No</option>"; +} +else { + echo "<option value=1 >Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('Debug_CoreLocal',"'".$CORE_LOCAL->get("Debug_CoreLocal")."'"); +?> +</select><br /> +See optional logs above. +<hr /> +<b>Show Page Changes</b>: <select name=DEBUG_REDIRECT> +<?php +if(isset($_REQUEST['DEBUG_REDIRECT'])) $CORE_LOCAL->set('Debug_Redirects',$_REQUEST['DEBUG_REDIRECT'],True); +if ($CORE_LOCAL->get("Debug_Redirects") == 1){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0>No</option>"; +} +else { + echo "<option value=1 >Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('Debug_Redirects',"'".$CORE_LOCAL->get("Debug_Redirects")."'"); +?> +</select><br /> +This option changes HTTP redirects into manual, clickable links. A stack +trace is also included. There are some javascript-based URL changes that +this won't catch, but your browser surely has a fancy javascript console +available for those. If not, find a better browser. +<hr /> +<input type=submit value="Save Changes" /> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/extra_config.php b/pos/is4c-nf/install/extra_config.php new file mode 100644 index 000000000..5d10ca0df --- /dev/null +++ b/pos/is4c-nf/install/extra_config.php @@ -0,0 +1,601 @@ +<!DOCTYPE html> +<html> +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<head> +<title>IT CORE Lane Installation: Additional Configuration</title> +<link rel="stylesheet" href="../css/toggle-switch.css" type="text/css" /> +<script type="text/javascript" src="../js/jquery.js"></script> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Additional Configuration</h2> + +<div class="alert"><?php check_writeable('../ini.php', False, 'PHP'); ?></div> +<div class="alert"><?php check_writeable('../ini-local.php', True, 'PHP'); ?></div> + +<form action=extra_config.php method=post> +<table id="install" border=0 cellspacing=0 cellpadding=4> +<tr><td colspan=2 class="tblHeader"><h3>General Settings</h3></td></tr> +<tr><td style="width: 30%;"> +</td><td> +<?php +if (isset($_REQUEST['BROWSER_ONLY'])) $CORE_LOCAL->set('browserOnly',1,True); +elseif (isset($_REQUEST['esubmit'])) $CORE_LOCAL->set('browserOnly',0,True); +else $CORE_LOCAL->set('browserOnly',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='BROWSER_ONLY' id='browser'"; +if ($CORE_LOCAL->get('browserOnly') == 1) echo " value='1' checked />"; +else echo " value='0' />"; +echo "\n<label for='browser' onclick=''>Browser only: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('browserOnly',$CORE_LOCAL->get('browserOnly')); +?> +<span class='noteTxt'>If Yes, the "exit" button on the login screen attempts to close the window.</span> +</td></tr><tr><td> +<b>Store</b>:</td><td> +<?php +if (isset($_REQUEST['STORE'])) $CORE_LOCAL->set('store',$_REQUEST['STORE'],True); +printf("<input type=text name=STORE value=\"%s\" />",$CORE_LOCAL->get('store')); +confsave('store',"'".$CORE_LOCAL->get('store')."'"); +?> +<span class='noteTxt'>In theory, any hard-coded, store specific sequences should be blocked +off based on the store setting. Adherence to this principle is less than ideal.</span> +</td></tr><tr><td> +</td><td> +<?php +if(isset($_REQUEST['DISCOUNTS'])) $CORE_LOCAL->set('discountEnforced',1,True); +elseif(isset($_REQUEST['DISCOUNTS'])) $CORE_LOCAL->set('discountEnforced',0,True); +elseif ($CORE_LOCAL->get('discountEnforced')==='') $CORE_LOCAL->set('discountEnforced',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='DISCOUNTS' id='discounts'"; +if ($CORE_LOCAL->get("discountEnforced") == 1) echo " value='1' checked"; +else echo " value='0'"; +echo " />\n<label for='discounts' onclick=''>Discounts Enabled: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('discountEnforced',$CORE_LOCAL->get('discountEnforced')); +?> +<span class='noteTxt'>If yes, members get a percentage discount as specified in custdata.</span> +</td></tr><tr><td> +<label><b>Discount Module</b></label> +</td><td> +<select name="DISCOUNTHANDLER"> +<?php +if(isset($_REQUEST['DISCOUNTHANDLER'])) $CORE_LOCAL->set('DiscountModule',$_REQUEST['DISCOUNTHANDLER'],True); +elseif ($CORE_LOCAL->get('DiscountModule') === '') $CORE_LOCAL->set('DiscountModule','DiscountModule'); +$mods = AutoLoader::ListModules('DiscountModule',True); +foreach($mods as $m){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('DiscountModule')==$m ? 'selected' : ''), + $m); +} +confsave('DiscountModule',"'".$CORE_LOCAL->get('DiscountModule')."'"); +?> +</select> +<span class='noteTxt'>Calculates actual discount amount</span> +</td></tr><tr><td></td><td> +<?php +if(isset($_REQUEST['RDISCOUNTS'])) $CORE_LOCAL->set('refundDiscountable',1,True); +elseif(isset($_REQUEST['esubmit'])) $CORE_LOCAL->set('refundDiscountable',0,True); +elseif($CORE_LOCAL->get('refundDiscountable')==='') $CORE_LOCAL->set('refundDiscountable',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='RDISCOUNTS' id='rdiscounts'"; +if ($CORE_LOCAL->get("refundDiscountable") == 1) echo " value='1' checked"; +else echo " value='0'"; +echo " />\n<label for='rdiscounts' onclick=''>Discounts on refunds: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('refundDiscountable',$CORE_LOCAL->get('refundDiscountable')); +?> +<span class='noteTxt'>If yes, percent discount is applied to refunds</span> +</td></tr><tr><td> +<b>Line Item Discount (member)</b>: </td><td> +<?php +if(isset($_REQUEST['LD_MEM'])) $CORE_LOCAL->set('LineItemDiscountMem',$_REQUEST['LD_MEM'],True); +printf("<input type=text name=LD_MEM value=\"%f\" />",$CORE_LOCAL->get('LineItemDiscountMem')); +confsave('LineItemDiscountMem',"'".$CORE_LOCAL->get('LineItemDiscountMem')."'"); +?> +(percentage; 0.05 =&gt; 5%) +</td></tr><tr><td> +<b>Line Item Discount (non-member)</b>: </td><td> +<?php +if(isset($_REQUEST['LD_NONMEM'])) $CORE_LOCAL->set('LineItemDiscountNonMem',$_REQUEST['LD_NONMEM'],True); +printf("<input type=text name=LD_NONMEM value=\"%f\" />",$CORE_LOCAL->get('LineItemDiscountNonMem')); +confsave('LineItemDiscountNonMem',"'".$CORE_LOCAL->get('LineItemDiscountNonMem')."'"); +?> +(percentage; 0.05 =&gt; 5%) +</td></tr><tr><td> +<b>Default Non-member #</b>: </td><td> +<?php +if(isset($_REQUEST['NONMEM'])) $CORE_LOCAL->set('defaultNonMem',$_REQUEST['NONMEM'],True); +printf("<input type=text name=NONMEM value=\"%s\" />",$CORE_LOCAL->get('defaultNonMem')); +confsave('defaultNonMem',"'".$CORE_LOCAL->get('defaultNonMem')."'"); +?> +<span class='noteTxt'>Normally a single account number is used for most if not all non-member +transactions. Specify that account number here.</span> +</td></tr><tr><td> +<b>Visiting Member #</b>: </td><td> +<?php +if(isset($_REQUEST['VISMEM'])) $CORE_LOCAL->set('visitingMem',$_REQUEST['VISMEM'],True); +printf("<input type=text name=VISMEM value=\"%s\" />",$CORE_LOCAL->get('visitingMem')); +confsave('visitingMem',"'".$CORE_LOCAL->get('visitingMem')."'"); +?> +<span class='noteTxt'>This account provides members of other co-ops with member pricing +but no other benefits. Leave blank to disable.</span> +</td></tr><tr><td></td><td> +<?php +if (isset($_REQUEST['SHOW_NONMEM'])) $CORE_LOCAL->set('memlistNonMember',1,True); +elseif (isset($_REQUEST['esubmit'])) $CORE_LOCAL->set('memlistNonMember',0,True); +elseif ($CORE_LOCAL->get('memlistNonMember')==='') $CORE_LOCAL->set('memlistNonMember',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='SHOW_NONMEM' id='shownonmem'"; +if ($CORE_LOCAL->get("memlistNonMember") == 1) echo " value='1' checked"; +else echo " value='0'"; +echo " />\n<label for='shownonmem' onclick=''>Show non-member: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('memlistNonMember',$CORE_LOCAL->get('memlistNonMember')); +?> +<span class='noteTxt'>Display non-member acct. in member searches?</span> +</td></tr><tr><td> +<b>Bottle Return Department number</b>: </td><td> +<?php +if(isset($_REQUEST['BOTTLE_RET'])) $CORE_LOCAL->set('BottleReturnDept',$_REQUEST['BOTTLE_RET'],True); +printf("<input type=text name=BOTTLE_RET value=\"%s\" />",$CORE_LOCAL->get('BottleReturnDept')); +confsave('BottleReturnDept',"'".$CORE_LOCAL->get('BottleReturnDept')."'"); +?> +<span class='noteTxt'>Add a BOTTLE RETURN item to your products table with a normal_price of 0, IS4C will prompt for Bottle Return amt. and then make it a negative value.</span> +</td></tr> + + +<tr><td colspan=2 class="tblHeader"> +<h3>Hardware Settings</h3></td></tr> +<tr><td> +<b>Printer port</b>:<br /> +<?php +if(isset($_REQUEST['PPORT'])) $CORE_LOCAL->set('printerPort',$_REQUEST['PPORT'],True); + +?> +</td><td> + +<input type="radio" name=PPORT value="/dev/lp0" id="div-lp0" + <?php if($CORE_LOCAL->get('printerPort')=="/dev/lp0") echo "checked"; ?> /><label for="div-lp0">/dev/lp0 (*nix)</label><br /> +<input type="radio" name=PPORT value="/dev/usb/lp0" id="div-usb-lp0" + <?php if($CORE_LOCAL->get('printerPort')=="/dev/usb/lp0") echo "checked"; ?> /><label for="div-usb-lp0">/dev/usb/lp0 (*nix)</label><br /> +<input type="radio" name=PPORT value="LPT1:" id="lpt1-" + <?php if($CORE_LOCAL->get('printerPort')=="LPT:") echo "checked"; ?> /><label for="lpt1-">LPT1: (windows)</label><br /> +<input type="radio" name=PPORT value="fakereceipt.txt" id="fakercpt" + <?php if($CORE_LOCAL->get('printerPort')=="fakereceipt.txt") echo "checked"; ?> /><label for="fakercpt">fakereceipt.txt</label><br /> +<input type="radio" name=PPORT value="other" /><input type=text name="otherpport"></input><br /> + +<?php +confsave('printerPort',"'".$CORE_LOCAL->get('printerPort')."'"); +?> +<span class='noteTxt' style="top:-120px;"> <?php printf("<p>Current value: <span class='pre'>%s</span></p>",$CORE_LOCAL->get('printerPort')); ?> +<br />Path to the printer. Select from common values, or enter a custom path. Some ubuntu distros might put your USB printer at /dev/usblp0</span> +</td></tr> +<tr><td></td><td> +<?php +if (isset($_REQUEST['FRANK'])) $CORE_LOCAL->set('enableFranking',1,True); +elseif ($CORE_LOCAL->get('enableFranking')==='') $CORE_LOCAL->set('enableFranking',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='FRANK' id='enableFranking'"; +if ($CORE_LOCAL->get("enableFranking") == 1) echo " value='1' checked"; +else echo " value='0'"; +echo " />\n<label for='enableFranking' onclick=''>Enable Check Franking: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('enableFranking',$CORE_LOCAL->get("enableFranking")); +?> +</select></td></tr> +<tr><td> +<b>Drawer Behavior Module</b>:</td><td> +<?php +$kmods = AutoLoader::ListModules('Kicker',True); +if(isset($_REQUEST['kickerModule'])) $CORE_LOCAL->set('kickerModule',$_REQUEST['kickerModule'],True); +if ($CORE_LOCAL->get('kickerModule')=='') $CORE_LOCAL->set('kickerModule','Kicker',True); +echo '<select name="kickerModule">'; +foreach($kmods as $k){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('kickerModule')==$k?'selected':''), + $k); +} +echo '</select>'; +confsave('kickerModule',"'".$CORE_LOCAL->get('kickerModule')."'"); +?> +</td></tr><tr><td></td><td> +<?php +if (isset($_REQUEST['DDM'])) $CORE_LOCAL->set('dualDrawerMode',1,True); +elseif (isset($_REQUEST['esubmit'])) $CORE_LOCAL->set('dualDrawerMode',0,True); +elseif ($CORE_LOCAL->get('dualDrawerMode')==='') $CORE_LOCAL->set('dualDrawerMode',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='DDM' id='dualDrawerMode'"; +if ($CORE_LOCAL->get("dualDrawerMode") == 1) echo " value='1' checked"; +else echo " value='0'"; +echo " />\n<label for='dualDrawerMode' onclick=''>Dual Drawer Mode: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('dualDrawerMode',$CORE_LOCAL->get("dualDrawerMode")); +?> +</select></td></tr><tr><td> +<b>Scanner/scale port</b>:</td><td> +<?php +if(isset($_REQUEST['SPORT'])) $CORE_LOCAL->set('scalePort',$_REQUEST['SPORT'],True); +printf("<input type=text name=SPORT value=\"%s\" />",$CORE_LOCAL->get('scalePort')); +confsave('scalePort',"'".$CORE_LOCAL->get('scalePort')."'"); +?> +</td></tr><tr><td colspan=2> +<p>Path to the scanner scale. Common values are COM1 (windows) and /dev/ttyS0 (linux).</p> +</td></tr><tr><td> +<b>Scanner/scale driver</b>:</td><td> +<?php +if(isset($_REQUEST['SDRIVER'])) $CORE_LOCAL->set('scaleDriver',$_REQUEST['SDRIVER'],True); +printf("<input type=text name=SDRIVER value=\"%s\" />",$CORE_LOCAL->get('scaleDriver')); +confsave('scaleDriver',"'".$CORE_LOCAL->get('scaleDriver')."'"); +?> +</td></tr><tr><td colspan=2> +<p>The name of your scale driver. Known good values include "ssd" and "NewMagellan".</p> +<?php +// try to initialize scale driver +if ($CORE_LOCAL->get("scaleDriver") != ""){ + $classname = $CORE_LOCAL->get("scaleDriver"); + if (!file_exists('../scale-drivers/php-wrappers/'.$classname.'.php')) + echo "<br /><i>Warning: PHP driver file not found</i>"; + else { + if (!class_exists($classname)) + include('../scale-drivers/php-wrappers/'.$classname.'.php'); + $instance = new $classname(); + @$instance->SavePortConfiguration($CORE_LOCAL->get("scalePort")); + @$abs_path = substr($_SERVER['SCRIPT_FILENAME'],0, + strlen($_SERVER['SCRIPT_FILENAME'])-strlen('install/extra_config.php')-1); + @$instance->SaveDirectoryConfiguration($abs_path); + } +} +?> +</td></tr> + +<tr><td colspan=2 class="tblHeader"> +<h3>Display Settings</h3></td></tr><tr><td> +<b>Alert Bar</b>:</td><td> +<?php +if (isset($_REQUEST['ALERT'])) $CORE_LOCAL->set('alertBar',$_REQUEST['ALERT'],True); +printf("<input size=40 type=text name=ALERT value=\"%s\" />",$CORE_LOCAL->get('alertBar')); +confsave('alertBar',"'".$CORE_LOCAL->get('alertBar')."'"); +?> +</td></tr> +<tr><td> +</td><td> +<?php +if (isset($_REQUEST['LOCKSCREEN'])) $CORE_LOCAL->set('lockScreen',1,True); +elseif (isset($_REQUEST['esubmit'])) $CORE_LOCAL->set('lockScreen',0,True); +elseif ($CORE_LOCAL->get('lockScreen')==='') $CORE_LOCAL->set('lockScreen',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='LOCKSCREEN' id='lockscreen'"; +if ($CORE_LOCAL->get("lockScreen") == 1) echo " value='1' checked"; +else echo " value='0'"; +echo " />\n<label for='lockscreen' onclick=''>Lock screen on idle: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('lockScreen',$CORE_LOCAL->get('lockScreen')); +?> +</td></tr> +<tr><td> +<b>Lock Screen Timeout</b>:</td><td> +<?php +if(isset($_REQUEST['TIMEOUT'])) $CORE_LOCAL->set('timeout',$_REQUEST['TIMEOUT'],True); +elseif ($CORE_LOCAL->get('timeout')==='') $CORE_LOCAL->set('timeout',180000,True); +printf("<input type=text name=TIMEOUT value=\"%s\" />",$CORE_LOCAL->get('timeout')); +confsave('timeout',"'".$CORE_LOCAL->get('timeout')."'"); +?> +<span class='noteTxt'>Enter timeout in milliseconds. Default: 180000 (3 minutes)</span> +</td></tr> +<tr><td> +<b>Footer Modules</b> (left to right):</td><td> +<?php +$footer_mods = array(); +// get current settings +$current_mods = $CORE_LOCAL->get("FooterModules"); +// replace w/ form post if needed +// fill in defaults if missing +if (isset($_REQUEST['FOOTER_MODS'])) $current_mods = $_REQUEST['FOOTER_MODS']; +elseif(!is_array($current_mods) || count($current_mods) != 5){ + $current_mods = array( + 'SavedOrCouldHave', + 'TransPercentDiscount', + 'MemSales', + 'EveryoneSales', + 'MultiTotal' + ); +} +$footer_mods = AutoLoader::ListModules('FooterBox'); +for($i=0;$i<5;$i++){ + echo '<select name="FOOTER_MODS[]">'; + foreach($footer_mods as $fm){ + printf('<option %s>%s</option>', + ($current_mods[$i]==$fm?'selected':''),$fm); + } + echo '</select><br />'; +} +$saveStr = "array("; +foreach($current_mods as $m) + $saveStr .= "'".$m."',"; +$saveStr = rtrim($saveStr,",").")"; +confsave('FooterModules',$saveStr); +?> +</td></tr><tr><td> +<b>Enable onscreen keys</b>:</td><td> <select name=SCREENKEYS> +<?php +if(isset($_REQUEST['SCREENKEYS'])){ + $CORE_LOCAL->set('touchscreen',($_REQUEST['SCREENKEYS']==1)?True:False,True); +} +if ($CORE_LOCAL->get('touchscreen')){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0 >No</option>"; + confsave('touchscreen','True'); +} +else { + echo "<option value=1 >Yes</option>"; + echo "<option value=0 selected>No</option>"; + confsave('touchscreen','False'); +} +?> +</select></td></tr><tr><td> +<b>Separate customer display</b>:</td><td> <select name=CUSTDISPLAY> +<?php +if(isset($_REQUEST['CUSTDISPLAY'])) $CORE_LOCAL->set('CustomerDisplay',$_REQUEST['CUSTDISPLAY'],True); +if ($CORE_LOCAL->get('CustomerDisplay')){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0 >No</option>"; +} +else { + echo "<option value=1 >Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('CustomerDisplay',$CORE_LOCAL->get('CustomerDisplay')); +?> +</select></td></tr><tr><td colspan=2> +<p>Touchscreen keys and menus really don't need to appear on +the customer-facing display. Experimental feature where one +window always shows the item listing. Very alpha.</p> +</td></tr> + + + + +<tr><td colspan=2 class="tblHeader"><h3>Tender Settings</h3></td></tr> +<tr><td> +<b>Allow members to write checks over purchase amount</b>: </td><td><select name=OVER> +<?php +if(isset($_REQUEST['OVER'])) $CORE_LOCAL->set('cashOverLimit',$_REQUEST['OVER'],True); +if ($CORE_LOCAL->get("cashOverLimit") == 1){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0 >No</option>"; +} +else { + echo "<option value=1>Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('cashOverLimit',$CORE_LOCAL->get('cashOverLimit')); +?> +</select></td></tr><tr><td> +<b>Check over limit</b>:</td><td>$ +<?php +if(isset($_REQUEST['OVER_LIMIT'])) $CORE_LOCAL->set('dollarOver',$_REQUEST['OVER_LIMIT'],True); +printf("<input type=text size=4 name=OVER_LIMIT value=\"%s\" />",$CORE_LOCAL->get('dollarOver')); +confsave('dollarOver',$CORE_LOCAL->get('dollarOver')); +?> +</td></tr> +<tr><td> +<b>Modular Tenders</b>: </td><td><select name=MODTENDERS> +<?php +if(isset($_REQUEST['MODTENDERS'])) $CORE_LOCAL->set('ModularTenders',$_REQUEST['MODTENDERS'],True); +if ($CORE_LOCAL->get('ModularTenders')){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0 >No</option>"; +} +else { + echo "<option value=1 >Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('ModularTenders',"'".$CORE_LOCAL->get('ModularTenders')."'"); +?> +</select></td></tr><tr><td> +<b>Tender Report</b>:</td> +<td><select name="TENDERREPORTMOD"> +<?php +if(isset($_REQUEST['TENDERREPORTMOD'])) $CORE_LOCAL->set('TenderReportMod',$_REQUEST['TENDERREPORTMOD'],True); +if($CORE_LOCAL->get('TenderReportMod')=='') $CORE_LOCAL->set('TenderReportMod','DefaultTenderReport',True); +$mods = AutoLoader::ListModules('TenderReport'); +sort($mods); +foreach($mods as $mod){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('TenderReportMod') == $mod ? 'selected' : ''), + $mod + ); +} +confsave('TenderReportMod',"'".$CORE_LOCAL->get('TenderReportMod')."'"); +?> +</select></td></tr><tr><td> +<b>Tender Mapping</b>:<br /> +<p>Map custom tenders to IS4Cs expected tenders Tender Rpt. column: Include the checked tenders + in the Tender Report (available via Mgrs. Menu [MG])</p></td><td> +<?php +$settings = $CORE_LOCAL->get("TenderMap"); +if (!is_array($settings)) $settings = array(); +if (isset($_REQUEST['TenderMapping'])){ + $saveStr = "array("; + $settings = array(); + foreach($_REQUEST['TenderMapping'] as $tm){ + if($tm=="") continue; + list($code,$mod) = explode(":",$tm); + $settings[$code] = $mod; + $saveStr .= "'".$code."'=>'".$mod."',"; + } + $saveStr = rtrim($saveStr,",").")"; + confsave('TenderMap',$saveStr); +} +$mods = AutoLoader::ListModules('TenderModule'); +// Tender Report: Desired tenders column +$settings2 = $CORE_LOCAL->get("TRDesiredTenders"); +if (!is_array($settings2)) $settings2 = array(); +if (isset($_REQUEST['TR_LIST'])){ + $saveStr2 = "array("; + $settings2 = array(); + foreach($_REQUEST['TR_LIST'] as $dt){ + if($dt=="") continue; + list($code2,$name2) = explode(":",$dt); + $settings2[$code2] = $name2; + $saveStr2 .= "'".$code2."'=>'".addslashes($name2)."',"; + } + $saveStr2 = rtrim($saveStr2,",").")"; + confsave('TRDesiredTenders',$saveStr2); +} //end TR desired tenders +$db = Database::pDataConnect(); +$res = $db->query("SELECT TenderCode, TenderName FROM tenders ORDER BY TenderName"); +?> +<table cellspacing="0" cellpadding="4" border="1"> +<?php +echo "<thead><tr><th>Tender Name</th><th>Map To</th><th>Tender Rpt</th></tr></thead><tbody>\n"; +while($row = $db->fetch_row($res)){ + printf('<tr><td>%s (%s)</td>',$row['TenderName'],$row['TenderCode']); + echo '<td><select name="TenderMapping[]">'; + echo '<option value="">default</option>'; + foreach($mods as $m){ + printf('<option value="%s:%s" %s>%s</option>', + $row['TenderCode'],$m, + (isset($settings[$row['TenderCode']])&&$settings[$row['TenderCode']]==$m)?'selected':'', + $m); + } + echo '</select></td>'; + echo "<td><input type=checkbox name=\"TR_LIST[]\" "; + echo 'value="'.$row['TenderCode'].':'.$row['TenderName'].'"'; + if (array_key_exists($row['TenderCode'], $settings2)) echo " CHECKED"; + echo "></td></tr></tbody>"; +} +?> +</table> + +</td></tr><tr><td colspan=2 class="tblHeader"> +<h3>Integrated Card Processing</h3> +<p><i>Integrated card processing configuration is included for the sake +of completeness. The modules themselves require individual configuration, +too</i></p></td></tr><tr><td> +<b>Integrated Credit Cards</b>: </td><td><select name=INT_CC> +<?php +if(isset($_REQUEST['INT_CC'])) $CORE_LOCAL->set('CCintegrate',$_REQUEST['INT_CC'],True); +if ($CORE_LOCAL->get('CCintegrate') == 1){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0>No</option>"; +} +else { + echo "<option value=1>Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('CCintegrate',$CORE_LOCAL->get('CCintegrate')); +?> +</select></td></tr><tr><td> +<b>Integrated Gift Cards</b>: </td><td><select name=INT_GC> +<?php +if(isset($_REQUEST['INT_GC'])) $CORE_LOCAL->set('gcIntegrate',$_REQUEST['INT_GC'],True); +if ($CORE_LOCAL->get('gcIntegrate') == 1){ + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0>No</option>"; +} +else { + echo "<option value=1>Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('gcIntegrate',$CORE_LOCAL->get('gcIntegrate')); +?> +</select></td></tr><tr><td> +<b>Enabled paycard modules</b>:</td><td> +<select multiple size=10 name=PAY_MODS[]> +<?php +if (isset($_REQUEST['PAY_MODS'])) $CORE_LOCAL->set('RegisteredPaycardClasses',$_REQUEST['PAY_MODS'],True); + +$mods = array(); +$dh = opendir('../plugins/Paycards/'); +while(False !== ($f = readdir($dh))){ + if ($f == "." || $f == ".." || $f == "BasicCCModule.php") + continue; + if (substr($f,-4) == ".php") + $mods[] = rtrim($f,".php"); +} + +foreach($mods as $m){ + $selected = ""; + foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $r){ + if ($r == $m){ + $selected = "selected"; + break; + } + } + echo "<option $selected>$m</option>"; +} + +$saveStr = "array("; +foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $r){ + $saveStr .= "'".$r."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confsave('RegisteredPaycardClasses',$saveStr); +?> +</select></td></tr><tr><td> +<b>Signature Required Limit</b>:</td><td> +<?php +if (isset($_REQUEST['CCSigLimit'])) $CORE_LOCAL->set('CCSigLimit',$_REQUEST['CCSigLimit'],True); +if ($CORE_LOCAL->get('CCSigLimit')=="") $CORE_LOCAL->set('CCSigLimit',0.00,True); +printf(" \$<input size=4 type=text name=CCSigLimit value=\"%s\" />",$CORE_LOCAL->get('CCSigLimit')); +confsave('CCSigLimit',$CORE_LOCAL->get('CCSigLimit')); +?> +</td></tr><tr><td><b>Signature Capture Device</b>:</td><td> +<?php +if (isset($_REQUEST['SigCapture'])) $CORE_LOCAL->set('SigCapture',$_REQUEST['SigCapture'],True); +printf("<br /><input size=4 type=text name=SigCapture value=\"%s\" />",$CORE_LOCAL->get('SigCapture')); +confsave('SigCapture',"'".$CORE_LOCAL->get('SigCapture')."'"); +?> +<i>(blank for none)</i></td></tr> +<tr><td colspan=2 class="tblHeader"> +<h3>Variou</h3> +<p>This group was started in order to handle variations as options rather than per-coop code variations.</p> +<h4 style="margin: 0.25em 0.0em 0.25em 0.0em;">Related to transactions:</h4></td></tr><tr><td> + +<!-- Normal/default Yes/True --> +<b>Member ID trigger subtotal</b>:</td><td> +<?php +// Get the value from the latest submit, if it existed, into the core_local array ... +if (array_key_exists('MEMBER_SUBTOTAL', $_REQUEST)){ + $CORE_LOCAL->set('member_subtotal',($_REQUEST['MEMBER_SUBTOTAL']==1)?True:False,True); +} +// ... or from CORE_LOCAL if it is known ... +elseif ( $CORE_LOCAL->get("member_subtotal") === False ) { + $noop = ""; +} +elseif ( $CORE_LOCAL->get("member_subtotal") === True ) { + $noop = ""; +} +// ... or set the default value ... +elseif ( $CORE_LOCAL->get("member_subtotal") == NULL ) { + $CORE_LOCAL->set('member_subtotal', True, True); +} +// ... or complain (unexpected actual values such as 0 or 1). +else { + echo "<br />Current value of 'member_subtotal' unrecognized."; +} +echo "<select name='MEMBER_SUBTOTAL'>"; +// Display current, or default, value. +if ($CORE_LOCAL->get('member_subtotal')){ + echo "<option value='1' selected>Yes</option>"; + echo "<option value='0' >No</option>"; + // Save current, or default, value. After submit, this will be the new value. + confsave('member_subtotal', 'True'); +} +else { + echo "<option value='1' >Yes</option>"; + echo "<option value='0' selected>No</option>"; + // Save current, or default, value. After submit, this will be the new value. + confsave('member_subtotal', 'False'); +} +?> +</td></tr> +<tr><td colspan=2 class="submitBtn"> +<input type=submit name=esubmit value="Save Changes" /> +</td></tr> +</table> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/extra_data.php b/pos/is4c-nf/install/extra_data.php new file mode 100644 index 000000000..ca1147d4c --- /dev/null +++ b/pos/is4c-nf/install/extra_data.php @@ -0,0 +1,84 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>IT CORE Lane Installation: Sample data</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Sample Data</h2> + +<form action=extra_data.php method=post> +<div class="alert success"><b> +<?php +$db = new SQLManager($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('pDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); + +if (isset($_REQUEST['employees'])){ + echo "Loading employees"; + $db->query("TRUNCATE TABLE employees"); + load_sample_data($db,'employees'); +} +elseif(isset($_REQUEST['custdata'])){ + echo "Loading custdata"; + $db->query("TRUNCATE TABLE custdata"); + load_sample_data($db,'custdata'); +} +elseif(isset($_REQUEST['products'])){ + echo "Loading products"; + $db->query("TRUNCATE TABLE products"); + load_sample_data($db,'products'); +} +elseif(isset($_REQUEST['depts'])){ + echo "Loading departments"; + $db->query("TRUNCATE TABLE departments"); + load_sample_data($db,'departments'); + echo "<br />Loading subdepts"; + $db->query("TRUNCATE TABLE subdepts"); + load_sample_data($db,'subdepts'); +} +?> +</b></div> +<p>Some sample data is available to get a test lane +up &amp; running quickly. Keep in mind this data +overwrites whatever is currently in the table.</p> +<hr /> +<b>Employees</b> +<p>This table contains login information for cashiers. The two +included logins are '56' and '7000'.</p> +<input id="data" type=submit name=employees value="Load sample employees" /> +<hr /> +<b>Custdata</b> +<p>Customer data is the membership information. Sample data includes + a way too many mostly identical lines. A very scrubbed version +of someone's customer table I think.</p> +<input type=submit name=custdata value="Load sample customers" /> +<hr /> +<b>Products</b> +<p>Stuff to sell. There's a lot of sample data. I think this might +be the Wedge's or at least a snapshot of it.</p> +<input type=submit name=products value="Load sample products" /> +<hr /> +<b>Departments</b> &amp; <b>Subdepts</b> +<p>Products get categorized into departments &amp; subdepartments. +You can also ring amounts directly to a department. Not needed, +strictly speaking, for a basic lane (Ring up items, total, +accept tender, provide change).</p> +<input type=submit name=depts value="Load sample departments" /> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/index.php b/pos/is4c-nf/install/index.php new file mode 100644 index 000000000..9e4baadc7 --- /dev/null +++ b/pos/is4c-nf/install/index.php @@ -0,0 +1,2572 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + DHermann test +*********************************************************************************/ + +ini_set('display_errors','1'); + +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +if(file_exists((dirname(__FILE__).'/../ini.php'))) + include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>IT CORE Lane Installation: Necessities</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +<script type="text/javascript" src="../js/jquery.js"></script> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Necessities</h2> + +<form action=index.php method=post> + +<div class="alert"><?php check_writeable('../ini.php', False, 'PHP'); ?></div> +<div class="alert"><?php check_writeable('../ini-local.php', True, 'PHP'); ?></div> + +PHP is running as: <?php echo whoami(); ?><br /> +<?php +if (!function_exists("socket_create")){ + echo '<b>Warning</b>: PHP socket extension is not enabled. NewMagellan will not work quite right'; +} +?> +<br /> +<table id="install" border=0 cellspacing=0 cellpadding=4> +<tr> +<td style="width: 30%;">OS: </td><td><select name=OS> +<?php +if (isset($_REQUEST['OS'])) $CORE_LOCAL->set('OS',$_REQUEST['OS'],True); +if ($CORE_LOCAL->get('OS') == 'win32'){ + echo "<option value=win32 selected>Windows</option>"; + echo "<option value=other>*nix</option>"; +} +else { + echo "<option value=win32>Windows</option>"; + echo "<option value=other selected>*nix</option>"; +} +confsave('OS',"'".$CORE_LOCAL->get('OS')."'"); +?> +</select></td></tr> +<tr><td>Lane number:</td><td> +<?php +if (isset($_REQUEST['LANE_NO']) && is_numeric($_REQUEST['LANE_NO'])) $CORE_LOCAL->set('laneno',$_REQUEST['LANE_NO'],True); +printf("<input type=text name=LANE_NO value=\"%d\" />", + $CORE_LOCAL->get('laneno')); +confsave('laneno',$CORE_LOCAL->get('laneno')); +?> +</td></tr><tr><td colspan=2 class="tblheader"> +<h3>Database set up</h3></td></tr> +<tr><td> +Lane database host: </td><td> +<?php +if (isset($_REQUEST['LANE_HOST'])) $CORE_LOCAL->set('localhost',$_REQUEST['LANE_HOST'],True); +printf("<input type=text name=LANE_HOST value=\"%s\" />", + $CORE_LOCAL->get('localhost')); +confsave('localhost',"'".$CORE_LOCAL->get('localhost')."'"); +?> +</td></tr><tr><td> +Lane database type:</td> +<td><select name=LANE_DBMS> +<?php +$db_opts = array('mysql'=>'MySQL','mssql'=>'SQL Server', + 'pdomysql'=>'MySQL (PDO)','pdomssql'=>'SQL Server (PDO)'); +if(isset($_REQUEST['LANE_DBMS'])) $CORE_LOCAL->set('DBMS',$_REQUEST['LANE_DBMS'],True); +foreach($db_opts as $name=>$label){ + printf('<option %s value="%s">%s</option>', + ($CORE_LOCAL->get('DBMS')==$name?'selected':''), + $name,$label); +} +confsave('DBMS',"'".$CORE_LOCAL->get('DBMS')."'"); +?> +</select></td></tr> +<tr><td>Lane user name:</td><td> +<?php +if (isset($_REQUEST['LANE_USER'])) $CORE_LOCAL->set('localUser',$_REQUEST['LANE_USER'],True); +printf("<input type=text name=LANE_USER value=\"%s\" />", + $CORE_LOCAL->get('localUser')); +confsave('localUser',"'".$CORE_LOCAL->get('localUser')."'"); +?> +</td></tr><tr><td> +Lane password:</td><td> +<?php +if (isset($_REQUEST['LANE_PASS'])) $CORE_LOCAL->set('localPass',$_REQUEST['LANE_PASS'],True); +printf("<input type=password name=LANE_PASS value=\"%s\" />", + $CORE_LOCAL->get('localPass')); +confsave('localPass',"'".$CORE_LOCAL->get('localPass')."'"); +?> +</td></tr><tr><td> +Lane operational DB:</td><td> +<?php +if (isset($_REQUEST['LANE_OP_DB'])) $CORE_LOCAL->set('pDatabase',$_REQUEST['LANE_OP_DB'],True); +printf("<input type=text name=LANE_OP_DB value=\"%s\" />", + $CORE_LOCAL->get('pDatabase')); +confsave('pDatabase',"'".$CORE_LOCAL->get('pDatabase')."'"); +?> +</td></tr><tr><td colspan=2> +<div class="noteTxt"> +Testing operational DB Connection: +<?php +$gotDBs = 0; +if ($CORE_LOCAL->get("DBMS") == "mysql") + $val = ini_set('mysql.connect_timeout',5); + +$sql = db_test_connect($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('pDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); +if ($sql === False){ + echo "<span class='fail'>Failed</span>"; + echo '<div class="db_hints" style="margin-left:25px;">'; + if (!function_exists('socket_create')){ + echo '<i>Try enabling PHP\'s socket extension in php.ini for better diagnostics</i>'; + } + elseif (@MiscLib::pingport($CORE_LOCAL->get('localhost'),$CORE_LOCAL->get('DBMS'))){ + echo '<i>Database found at '.$CORE_LOCAL->get('localhost').'. Verify username and password + and/or database account permissions.</i>'; + } + else { + echo '<i>Database does not appear to be listening for connections on ' + .$CORE_LOCAL->get('localhost').'. Verify host is correct, database is running and + firewall is allowing connections.</i>'; + } + echo '</div>'; +} +else { + echo "<span class='success'>Succeeded</span><br />"; + //echo "<textarea rows=3 cols=80>"; + $opErrors = create_op_dbs($sql,$CORE_LOCAL->get('DBMS')); + $gotDBs++; + if (!empty($opErrors)){ + echo '<div class="db_create_errors" style="border: solid 1px red;padding:5px;">'; + echo 'There were some errors creating operational DB structure'; + echo '<ul style="margin-top:2px;">'; + foreach($opErrors as $error){ + echo '<li>'; + echo 'Error on structure <b>'.$error['struct'].'</b>. '; + printf('<a href="" onclick="$(\'#eDetails%s\').toggle();return false;">Details</a>', + $error['struct']); + printf('<ul style="display:none;" id="eDetails%s">',$error['struct']); + echo '<li>Query: <pre>'.$error['query'].'</pre></li>'; + echo '<li>Error Message: '.$error['details'].'</li>'; + echo '</ul>'; + echo '</li>'; + } + echo '</div>'; + } + //echo "</textarea>"; +} +?> +</div> <!-- noteTxt --> +</td></tr><tr><td> +Lane transaction DB:</td><td> +<?php +if (isset($_REQUEST['LANE_TRANS_DB'])) $CORE_LOCAL->set('tDatabase',$_REQUEST['LANE_TRANS_DB'],True); +printf("<input type=text name=LANE_TRANS_DB value=\"%s\" />", + $CORE_LOCAL->get('tDatabase')); +confsave('tDatabase',"'".$CORE_LOCAL->get('tDatabase')."'"); +?> +</td></tr><tr><td colspan=2> +<div class="noteTxt"> +Testing transactional DB connection: +<?php +$sql = db_test_connect($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('tDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); +if ($sql === False ){ + echo "<span class='fail'>Failed</span>"; + echo '<div class="db_hints" style="margin-left:25px;">'; + echo '<i>If both connections failed, see above. If just this one + is failing, it\'s probably an issue of database user + permissions.</i>'; + echo '</div>'; +} +else { + echo "<span class='success'>Succeeded</span><br />"; + //echo "<textarea rows=3 cols=80>"; + + + /* Re-do tax rates here so changes affect the subsequent + * ltt* view builds. + */ + if (isset($_REQUEST['TAX_RATE']) && $sql->table_exists('taxrates')){ + $queries = array(); + for($i=0; $i<count($_REQUEST['TAX_RATE']); $i++){ + $rate = $_REQUEST['TAX_RATE'][$i]; + $desc = $_REQUEST['TAX_DESC'][$i]; + if(is_numeric($rate)){ + $desc = str_replace(" ","",$desc); + $queries[] = sprintf("INSERT INTO taxrates VALUES + (%d,%f,'%s')",$i+1,$rate,$desc); + } + else if ($rate != ""){ + echo "<br /><b>Error</b>: the given + tax rate, $rate, doesn't seem to + be a number."; + } + $sql->query("TRUNCATE TABLE taxrates"); + foreach($queries as $q) + $sql->query($q); + } + } + + $transErrors = create_trans_dbs($sql,$CORE_LOCAL->get('DBMS')); + $gotDBs++; + if (!empty($transErrors)){ + echo '<div class="db_create_errors" style="border: solid 1px red;padding:5px;">'; + echo 'There were some errors creating transactional DB structure'; + echo '<ul style="margin-top:2px;">'; + foreach($transErrors as $error){ + echo '<li>'; + echo 'Error on structure <b>'.$error['struct'].'</b>. '; + printf('<a href="" onclick="$(\'#eDetails%s\').toggle();return false;">Details</a>', + $error['struct']); + printf('<ul style="display:none;" id="eDetails%s">',$error['struct']); + echo '<li>Query: <pre>'.$error['query'].'</pre></li>'; + echo '<li>Error Message: '.$error['details'].'</li>'; + echo '</ul>'; + echo '</li>'; + } + echo '</div>'; + } + //echo "</textarea>"; +} +?> +</div> <!-- noteTxt --> +</td></tr><tr><td> +Server database host: </td><td> +<?php +if (isset($_REQUEST['SERVER_HOST'])) $CORE_LOCAL->set('mServer',$_REQUEST['SERVER_HOST'],True); +printf("<input type=text name=SERVER_HOST value=\"%s\" />", + $CORE_LOCAL->get('mServer')); +confsave('mServer',"'".$CORE_LOCAL->get('mServer')."'"); +?> +</td></tr><tr><td> +Server database type:</td><td> +<select name=SERVER_TYPE> +<?php +$db_opts = array('mysql'=>'MySQL','mssql'=>'SQL Server', + 'pdomysql'=>'MySQL (PDO)','pdomssql'=>'SQL Server (PDO)'); +if (isset($_REQUEST['SERVER_TYPE'])) $CORE_LOCAL->set('mDBMS',$_REQUEST['SERVER_TYPE'],True); +foreach($db_opts as $name=>$label){ + printf('<option %s value="%s">%s</option>', + ($CORE_LOCAL->get('mDBMS')==$name?'selected':''), + $name,$label); +} +confsave('mDBMS',"'".$CORE_LOCAL->get('mDBMS')."'"); +?> +</select></td></tr><tr><td> +Server user name:</td><td> +<?php +if (isset($_REQUEST['SERVER_USER'])) $CORE_LOCAL->set('mUser',$_REQUEST['SERVER_USER'],True); +printf("<input type=text name=SERVER_USER value=\"%s\" />", + $CORE_LOCAL->get('mUser')); +confsave('mUser',"'".$CORE_LOCAL->get('mUser')."'"); +?> +</td></tr><tr><td> +Server password:</td><td> +<?php +if (isset($_REQUEST['SERVER_PASS'])) $CORE_LOCAL->set('mPass',$_REQUEST['SERVER_PASS'],True); +printf("<input type=password name=SERVER_PASS value=\"%s\" />", + $CORE_LOCAL->get('mPass')); +confsave('mPass',"'".$CORE_LOCAL->get('mPass')."'"); +?> +</td></tr><tr><td> +Server database name:</td><td> +<?php +if (isset($_REQUEST['SERVER_DB'])) $CORE_LOCAL->set('mDatabase',$_REQUEST['SERVER_DB'],True); +printf("<input type=text name=SERVER_DB value=\"%s\" />", + $CORE_LOCAL->get('mDatabase')); +confsave('mDatabase',"'".$CORE_LOCAL->get('mDatabase')."'"); +?> +</td></tr><tr><td colspan=2> +<div class="noteTxt"> +Testing server connection: +<?php +$sql = db_test_connect($CORE_LOCAL->get('mServer'), + $CORE_LOCAL->get('mDBMS'), + $CORE_LOCAL->get('mDatabase'), + $CORE_LOCAL->get('mUser'), + $CORE_LOCAL->get('mPass')); +if ($sql === False){ + echo "<span class='fail'>Failed</span>"; + echo '<div class="db_hints" style="margin-left:25px;width:350px;">'; + if (!function_exists('socket_create')){ + echo '<i>Try enabling PHP\'s socket extension in php.ini for better diagnostics</i>'; + } + elseif (@MiscLib::pingport($CORE_LOCAL->get('mServer'),$CORE_LOCAL->get('DBMS'))){ + echo '<i>Database found at '.$CORE_LOCAL->get('mServer').'. Verify username and password + and/or database account permissions.</i>'; + } + else { + echo '<i>Database does not appear to be listening for connections on ' + .$CORE_LOCAL->get('mServer').'. Verify host is correct, database is running and + firewall is allowing connections.</i>'; + } + echo '</div>'; +} +else { + echo "<span class='success'>Succeeded</span><br />"; + //echo "<textarea rows=3 cols=80>"; + $sErrors = create_min_server($sql,$CORE_LOCAL->get('mDBMS')); + if (!empty($sErrors)){ + echo '<div class="db_create_errors" style="border: solid 1px red;padding:5px;">'; + echo 'There were some errors creating transactional DB structure'; + echo '<ul style="margin-top:2px;">'; + foreach($sErrors as $error){ + echo '<li>'; + echo 'Error on structure <b>'.$error['struct'].'</b>. '; + printf('<a href="" onclick="$(\'#eDetails%s\').toggle();return false;">Details</a>', + $error['struct']); + printf('<ul style="display:none;" id="eDetails%s">',$error['struct']); + echo '<li>Query: <pre>'.$error['query'].'</pre></li>'; + echo '<li>Error Message: '.$error['details'].'</li>'; + echo '</ul>'; + echo '</li>'; + } + echo '</div>'; + } + //echo "</textarea>"; +} +?> +</div> <!-- noteTxt --> +</td></tr><tr><td colspan=2 class="tblHeader"> +<h3>Tax</h3></td></tr> +<tr><td colspan=2> +<p><i>Provided tax rates are used to create database views. As such, +descriptions should be DB-legal syntax (e.g., no spaces). A rate of +0% with ID 0 is automatically included. Enter exact values - e.g., +0.05 to represent 5%.</i></p></td></tr> +<tr><td colspan=2> +<?php +$rates = array(); +if($gotDBs == 2){ + $sql = new SQLManager($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('tDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); + $ratesR = $sql->query("SELECT id,rate,description FROM taxrates ORDER BY id"); + while($row=$sql->fetch_row($ratesR)) + $rates[] = array($row[0],$row[1],$row[2]); +} +echo "<table><tr><th>ID</th><th>Rate</th><th>Description</th></tr>"; +foreach($rates as $rate){ + printf("<tr><td>%d</td><td><input type=text name=TAX_RATE[] value=\"%f\" /></td> + <td><input type=text name=TAX_DESC[] value=\"%s\" /></td></tr>", + $rate[0],$rate[1],$rate[2]); +} +printf("<tr><td>(Add)</td><td><input type=text name=TAX_RATE[] value=\"\" /></td> + <td><input type=text name=TAX_DESC[] value=\"\" /></td></tr></table>"); +?> +</td></tr><tr><td colspan=2 class="submitBtn"> +<input type=submit value="Save &amp; Re-run installation checks" /> +</form> +</td></tr> +</table> +</div> <!-- wrapper --> +<?php + +function create_op_dbs($db,$type){ + global $CORE_LOCAL; + $name = $CORE_LOCAL->get('pDatabase'); + $errors = array(); + + create_if_needed($db, $type, $name, 'couponcodes', 'op', $errors); + $chk = $db->query('SELECT Code FROM couponcodes', $name); + if ($db->num_rows($chk) == 0){ + load_sample_data($db,'couponcodes'); + } + + create_if_needed($db, $type, $name, 'custdata', 'op', $errors); + + create_if_needed($db, $type, $name, 'memberCards', 'op', $errors); + + create_if_needed($db, $type, $name, 'custPreferences', 'op', $errors); + + $cardsViewQ = "CREATE VIEW memberCardsView AS + SELECT CONCAT('" . $CORE_LOCAL->get('memberUpcPrefix') . "',c.CardNo) as upc, c.CardNo as card_no FROM custdata c"; + if (!$db->table_exists('memberCardsView',$name)){ + db_structure_modify($db,'memberCardsView',$cardsViewQ,$errors); + } + + create_if_needed($db, $type, $name, 'departments', 'op', $errors); + + create_if_needed($db, $type, $name, 'employees', 'op', $errors); + + create_if_needed($db, $type, $name, 'globalvalues', 'op', $errors); + $chk = $db->query('SELECT CashierNo FROM globalvalues', $name); + if ($db->num_rows($chk) != 1){ + $db->query('TRUNCATE TABLE globalvalues'); + load_sample_data($db,'globalvalues'); + } + + create_if_needed($db, $type, $name, 'drawerowner', 'op', $errors); + $chk = $db->query('SELECT drawer_no FROM drawerowner', $name); + if ($db->num_rows($chk) == 0){ + $db->query('INSERT INTO drawerowner (drawer_no) VALUES (1)', $name); + $db->query('INSERT INTO drawerowner (drawer_no) VALUES (2)', $name); + } + + create_if_needed($db, $type, $name, 'products', 'op', $errors); + + create_if_needed($db, $type, $name, 'dateRestrict', 'op', $errors); + + create_if_needed($db, $type, $name, 'tenders', 'op', $errors); + $chk = $db->query('SELECT TenderID FROM tenders', $name); + if ($db->num_rows($chk) == 0){ + load_sample_data($db,'tenders'); + } + + create_if_needed($db, $type, $name, 'subdepts', 'op', $errors); + + create_if_needed($db, $type, $name, 'customReceipt', 'op', $errors); + + create_if_needed($db, $type, $name, 'custReceiptMessage', 'op', $errors); + + create_if_needed($db, $type, $name, 'disableCoupon', 'op', $errors); + + create_if_needed($db, $type, $name, 'houseCoupons', 'op', $errors); + + create_if_needed($db, $type, $name, 'houseVirtualCoupons', 'op', $errors); + + create_if_needed($db, $type, $name, 'houseCouponItems', 'op', $errors); + + create_if_needed($db, $type, $name, 'memchargebalance', 'op', $errors); + + create_if_needed($db, $type, $name, 'unpaid_ar_today', 'op', $errors); + + // Update lane_config structure if needed + if ($db->table_exists('lane_config', $name)){ + $def = $db->table_definition('lane_config', $name); + if (!isset($def['keycode']) || !isset($def['value'])) + $db->query('DROP TABLE lane_config', $name); + } + create_if_needed($db, $type, $name, 'lane_config', 'op', $errors); + + return $errors; +} + +function create_trans_dbs($db,$type){ + global $CORE_LOCAL; + $name = $CORE_LOCAL->get('tDatabase'); + $errors = array(); + + create_if_needed($db, $type, $name, 'activities', 'trans', $errors); + + create_if_needed($db, $type, $name, 'alog', 'trans', $errors); + + create_if_needed($db, $type, $name, 'activitylog', 'trans', $errors); + + create_if_needed($db, $type, $name, 'activitytemplog', 'trans', $errors); + + create_if_needed($db, $type, $name, 'dtransactions', 'trans', $errors); + + create_if_needed($db, $type, $name, 'localtrans', 'trans', $errors); + + create_if_needed($db, $type, $name, 'localtransarchive', 'trans', $errors); + + create_if_needed($db, $type, $name, 'localtrans_today', 'trans', $errors); + + create_if_needed($db, $type, $name, 'suspended', 'trans', $errors); + + create_if_needed($db, $type, $name, 'localtemptrans', 'trans', $errors); + + create_if_needed($db, $type, $name, 'taxrates', 'trans', $errors); + + create_if_needed($db, $type, $name, 'localtranstoday', 'trans', $errors); + + create_if_needed($db, $type, $name, 'memdiscountadd', 'trans', $errors); + + create_if_needed($db, $type, $name, 'memdiscountremove', 'trans', $errors); + + create_if_needed($db, $type, $name, 'screendisplay', 'trans', $errors); + + create_if_needed($db, $type, $name, 'staffdiscountadd', 'trans', $errors); + + create_if_needed($db, $type, $name, 'staffdiscountremove', 'trans', $errors); + + create_if_needed($db, $type, $name, 'suspendedtoday', 'trans', $errors); + + create_if_needed($db, $type, $name, 'couponApplied', 'trans', $errors); + + /* lttsummary, lttsubtotals, and subtotals + * always get rebuilt to account for tax rate + * changes */ + include('buildLTTViews.php'); + $errors = buildLTTViews($db,$type,$errors); + + create_if_needed($db, $type, $name, 'taxView', 'trans', $errors); + + $lttR = "CREATE view ltt_receipt as + select + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then concat(quantity, ' @ ', unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(volume, ' /', unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(Quantity, ' @ ', Volume, ' /', unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(ItemQtty, ' /', UnitPrice) + when abs(itemQtty) > 1 + then concat(quantity, ' @ ', unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax = 1 and foodstamp <> 0 + then 'TF' + when tax = 1 and foodstamp = 0 + then 'T' + when tax = 0 and foodstamp <> 0 + then 'F' + WHEN (tax > 1 and foodstamp <> 0) + THEN CONCAT(LEFT(t.description,1),'F') + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + unitPrice, + voided, + CASE + WHEN upc = 'DISCOUNT' THEN ( + SELECT MAX(trans_id) FROM localtemptrans WHERE voided=3 + )-1 + WHEN trans_type = 'T' THEN trans_id+99999 + ELSE trans_id + END AS trans_id + from localtemptrans as l + left join taxrates as t + on l.tax = t.id + where voided <> 5 and UPC <> 'TAX' + AND trans_type <> 'L'"; + if($type == 'mssql'){ + $lttR = "CREATE view ltt_receipt as + select + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then quantity+ ' @ '+ unitPrice + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then volume+ ' /'+ unitPrice + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then Quantity+ ' @ '+Volume+ ' /'+ unitPrice + when abs(itemQtty) > 1 and discounttype = 3 + then ItemQtty+ ' /'+ UnitPrice + when abs(itemQtty) > 1 + then quantity+' @ '+unitPrice + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax = 1 and foodstamp <> 0 + then 'TF' + when tax = 1 and foodstamp = 0 + then 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN LEFT(t.description,1)+'F' + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + unitPrice, + trans_id + CASE + WHEN upc = 'DISCOUNT' THEN ( + SELECT MAX(trans_id) FROM localtemptrans WHERE voided=3 + )-1 + WHEN trans_type = 'T' THEN trans_id+99999 + ELSE trans_id + END AS trans_id + from localtemptrans as l + left join taxrates as t + on l.tax = t.id + where voided <> 5 and UPC <> 'TAX' + AND trans_type <> 'L' + order by trans_id"; + } + db_structure_modify($db,'ltt_receipt','DROP VIEW ltt_receipt',$errors); + if(!$db->table_exists('ltt_receipt',$name)){ + db_structure_modify($db,'ltt_receipt',$lttR,$errors); + } + + $rV = "CREATE view receipt as + select + case + when trans_type = 'T' + then concat(right( concat(space(44), upper(rtrim(Description)) ), 44) + , right(concat( space(8), format(-1 * Total, 2)), 8) + , right(concat(space(4), status), 4)) + when voided = 3 + then concat(left(concat(Description, space(30)), 30) + , space(9) + , 'TOTAL' + , right(concat(space(8), format(UnitPrice, 2)), 8)) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then concat(left(concat(Description, space(30)), 30) + , space(14) + , right(concat(space(8), format(unitPrice, 2)), 8) + , right(concat(space(4), status), 4)) + else + concat(left(concat(Description, space(30)), 30) + , ' ' + , left(concat(Comment, space(13)), 13) + , right(concat(space(8), format(Total, 2)), 8) + , right(concat(space(4), status), 4)) + end + as linetoprint + from ltt_receipt + order by trans_id"; + if($type == 'mssql'){ + $rV = "CREATE view receipt as + select top 100 percent + case + when trans_type = 'T' + then right((space(44) + upper(rtrim(Description))), 44) + + right((space(8) + convert(varchar, (-1 * Total))), 8) + + right((space(4) + status), 4) + when voided = 3 + then left(Description + space(30), 30) + + space(9) + + 'TOTAL' + + right(space(8) + convert(varchar, UnitPrice), 8) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then left(Description + space(30), 30) + + space(14) + + right(space(8) + convert(varchar, UnitPrice), 8) + + right(space(4) + status, 4) + when sequence < 1000 + then description + else + left(Description + space(30), 30) + + ' ' + + left(Comment + space(13), 13) + + right(space(8) + convert(varchar, Total), 8) + + right(space(4) + status, 4) + end + as linetoprint, + sequence + from ltt_receipt + order by sequence"; + } + if(!$db->table_exists('receipt',$name)){ + db_structure_modify($db,'receipt',$rV,$errors); + } + + $rpheader = "CREATE VIEW rp_receipt_header AS + select + min(datetime) as dateTimeStamp, + card_no as memberID, + register_no, + emp_no, + trans_no, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discounttype = 2 then memDiscount else 0 end),decimal(10,2)) as memSpecial, + case when (min(datetime) is null) then 0 else + sum(CASE WHEN discounttype = 4 THEN memDiscount ELSE 0 END) + end as staffSpecial, + convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, + convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + from localtranstoday + WHERE trans_type <> 'L' + group by register_no, emp_no, trans_no, card_no"; + if($type == 'mssql'){ + $rpheader = "CREATE view rp_receipt_header as + select + min(datetime) as dateTimeStamp, + card_no as memberID, + register_no, + emp_no, + trans_no, + convert(numeric(10,2), sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2), sum(case when discounttype = 2 then memDiscount else 0 end)) as memSpecial, + case when (min(datetime) is null) then 0 else + sum(CASE WHEN discounttype = 4 THEN memDiscount ELSE 0 END) + end as staffSpecial, + convert(numeric(10,2), sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, + convert(numeric(10,2), sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, + abs(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, + sum(case when upc = 'Discount' then total else 0 end) as transDiscount, + sum(case when trans_type = 'T' then -1 * total else 0 end) as tenderTotal + from localtranstoday + WHERE trans_type <> 'L' + group by register_no, emp_no, trans_no, card_no"; + } + if(!$db->table_exists('rp_receipt_header',$name)){ + db_structure_modify($db,'rp_receipt_header',$rpheader,$errors); + } + + $rplttR = "CREATE view rp_ltt_receipt as + select + register_no, + emp_no, + trans_no, + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then concat(quantity, ' @ ', unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(volume, ' /', unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(Quantity, ' @ ', Volume, ' /', unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(ItemQtty, ' /', UnitPrice) + when abs(itemQtty) > 1 + then concat(quantity, ' @ ', unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + WHEN (tax = 1 and foodstamp <> 0) + THEN 'TF' + WHEN (tax = 1 and foodstamp = 0) + THEN 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN CONCAT(LEFT(t.description,1),'F') + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + unitPrice, + voided, + trans_id + from localtranstoday as l + left join taxrates as t + on l.tax = t.id + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT' + AND trans_type <> 'L' + order by emp_no, trans_no, trans_id"; + if($type == 'mssql'){ + $rplttR = "CREATE view rp_ltt_receipt as + select + register_no, + emp_no, + trans_no, + description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then quantity+ ' @ '+ unitPrice + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then volume+ ' /'+ unitPrice + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then Quantity+ ' @ '+ Volume+ ' /'+ unitPrice + when abs(itemQtty) > 1 and discounttype = 3 + then ItemQtty+' /'+ UnitPrice + when abs(itemQtty) > 1 + then quantity+ ' @ '+ unitPrice + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + WHEN (tax = 1 and foodstamp <> 0) + THEN 'TF' + WHEN (tax = 1 and foodstamp = 0) + THEN 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN LEFT(t.description,1)+'F' + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + unitPrice, + voided, + trans_id + from localtranstoday as l + left join taxrates as t + on l.tax = t.id + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT' + AND trans_type <> 'L' + order by emp_no, trans_no, trans_id"; + } + db_structure_modify($db,'rp_ltt_receipt','DROP VIEW rp_ltt_receipt',$errors); + if(!$db->table_exists('rp_ltt_receipt',$name)){ + db_structure_modify($db,'rp_ltt_receipt',$rplttR,$errors); + } + + $rprV = "CREATE view rp_receipt as + select + register_no, + emp_no, + trans_no, + case + when trans_type = 'T' + then concat(right( concat(space(44), upper(rtrim(Description)) ), 44) + , right(concat( space(8), format(-1 * Total, 2)), 8) + , right(concat(space(4), status), 4)) + when voided = 3 + then concat(left(concat(Description, space(30)), 30) + , space(9) + , 'TOTAL' + , right(concat(space(8), format(UnitPrice, 2)), 8)) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then concat(left(concat(Description, space(30)), 30) + , space(14) + , right(concat(space(8), format(UnitPrice, 2)), 8) + , right(concat(space(4), status), 4)) + else + concat(left(concat(Description, space(30)), 30) + , ' ' + , left(concat(Comment, space(13)), 13) + , right(concat(space(8), format(Total, 2)), 8) + , right(concat(space(4), status), 4)) + end + as linetoprint, + trans_id + from rp_ltt_receipt"; + if($type == 'mssql'){ + $rprV = "CREATE view rp_receipt as + select + register_no, + emp_no, + trans_no, + case + when trans_type = 'T' + then right((space(44) + upper(rtrim(Description))), 44) + + right((space(8) + convert(varchar, (-1 * Total))), 8) + + right((space(4) + status), 4) + when voided = 3 + then left(Description + space(30), 30) + + space(9) + + 'TOTAL' + + right(space(8) + convert(varchar, UnitPrice), 8) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then left(Description + space(30), 30) + + space(14) + + right(space(8) + convert(varchar, UnitPrice), 8) + + right(space(4) + status, 4) + else + left(Description + space(30), 30) + + ' ' + + left(Comment + space(13), 13) + + right(space(8) + convert(varchar, Total), 8) + + right(space(4) + status, 4) + end + as linetoprint, + trans_id + from rp_ltt_receipt"; + } + if(!$db->table_exists('rp_receipt',$name)){ + db_structure_modify($db,'rp_receipt',$rprV,$errors); + } + + create_if_needed($db, $type, $name, 'efsnetRequest', 'trans', $errors); + + create_if_needed($db, $type, $name, 'efsnetRequestMod', 'trans', $errors); + + create_if_needed($db, $type, $name, 'efsnetResponse', 'trans', $errors); + + create_if_needed($db, $type, $name, 'efsnetTokens', 'trans', $errors); + + create_if_needed($db, $type, $name, 'valutecRequest', 'trans', $errors); + + create_if_needed($db, $type, $name, 'valutecRequestMod', 'trans', $errors); + + create_if_needed($db, $type, $name, 'valutecResponse', 'trans', $errors); + + $ccV = "CREATE view ccReceiptView + AS + select + (case r.mode + when 'tender' then 'Credit Card Purchase' + when 'retail_sale' then 'Credit Card Purchase' + when 'Credit_Sale' then 'Credit Card Purchase' + when 'retail_alone_credit' then 'Credit Card Refund' + when 'Credit_Return' then 'Credit Card Refund' + when 'refund' then 'Credit Card Refund' + else '' + end) as tranType, + (case r.mode + when 'refund' then -1*r.amount + else r.amount + end) as amount, + r.PAN, + (case r.manual when 1 then 'Manual' else 'Swiped' end) as entryMethod, + r.issuer, + r.name, + s.xResultMessage, + s.xApprovalNumber, + s.xTransactionID, + r.date, r.cashierNo, r.laneNo, r.transNo, r.transID, r.datetime, + 0 as sortorder + from efsnetRequest r + join efsnetResponse s + on s.date=r.date + and s.cashierNo=r.cashierNo + and s.laneNo=r.laneNo + and s.transNo=r.transNo + and s.transID=r.transID + where s.validResponse=1 and + (s.xResultMessage like '%APPROVE%' or s.xResultMessage like '%PENDING%') + + union all + + select + (case r.mode + when 'tender' then 'Credit Card Purchase CANCELED' + when 'retail_sale' then 'Credit Card Purchase CANCELLED' + when 'Credit_Sale' then 'Credit Card Purchase CANCELLED' + when 'retail_alone_credit' then 'Credit Card Refund CANCELLED' + when 'Credit_Return' then 'Credit Card Refund CANCELLED' + when 'refund' then 'Credit Card Refund CANCELED' + else '' + end) as tranType, + (case r.mode when 'refund' then r.amount else -1*r.amount end) as amount, + r.PAN, + (case r.manual when 1 then 'Manual' else 'Swiped' end) as entryMethod, + r.issuer, + r.name, + s.xResultMessage, + s.xApprovalNumber, + s.xTransactionID, + r.date, r.cashierNo, r.laneNo, r.transNo, r.transID, r.datetime, + 1 as sortorder + from efsnetRequestMod m + join efsnetRequest r + on r.date=m.date + and r.cashierNo=m.cashierNo + and r.laneNo=m.laneNo + and r.transNo=m.transNo + and r.transID=m.transID + join efsnetResponse s + on s.date=r.date + and s.cashierNo=r.cashierNo + and s.laneNo=r.laneNo + and s.transNo=r.transNo + and s.transID=r.transID + where s.validResponse=1 and (s.xResultMessage like '%APPROVE%') + and m.validResponse=1 and + (m.xResponseCode=0 or m.xResultMessage like '%APPROVE%') + and m.mode='void'"; + if(!$db->table_exists('ccReceiptView',$name)){ + db_structure_modify($db,'ccReceiptView',$ccV,$errors); + } + + $gcV = "CREATE VIEW gcReceiptView + AS + select + (case mode + when 'tender' then 'Gift Card Purchase' + when 'refund' then 'Gift Card Refund' + when 'addvalue' then 'Gift Card Add Value' + when 'activate' then 'Gift Card Activation' + else 'Gift Card Transaction' + end) as tranType, + (case mode when 'refund' then -1*r.amount else r.amount end) as amount, + terminalID, + PAN, + (case manual when 1 then 'Manual' else 'Swiped' end) as entryMethod, + xAuthorizationCode, + xBalance, + '' as xVoidCode, + r.date, r.cashierNo, r.laneNo, r.transNo, r.transID, r.datetime, + 0 as sortorder + from valutecRequest r + join valutecResponse s + on s.date=r.date + and s.cashierNo=r.cashierNo + and s.laneNo=r.laneNo + and s.transNo=r.transNo + and s.transID=r.transID + where s.validResponse=1 and (s.xAuthorized='true' or s.xAuthorized='Appro') + + union all + + select + (case r.mode + when 'tender' then 'Gift Card Purchase CANCELED' + when 'refund' then 'Gift Card Refund CANCELED' + when 'addvalue' then 'Gift Card Add Value CANCELED' + when 'activate' then 'Gift Card Activation CANCELED' + else 'Gift Card Transaction CANCELED' + end) as tranType, + (case r.mode when 'refund' then r.amount else -1*r.amount end) as amount, + terminalID, + PAN, + (case manual when 1 then 'Manual' else 'Swiped' end) as entryMethod, + origAuthCode as xAuthorizationCode, + xBalance, + xAuthorizationCode as xVoidCode, + r.date, r.cashierNo, r.laneNo, r.transNo, r.transID, m.datetime, + 1 as sortorder + from valutecRequestMod as m + join valutecRequest as r + on r.date=m.date + and r.cashierNo=m.cashierNo + and r.laneNo=m.laneNo + and r.transNo=m.transNo + and r.transID=m.transID + where m.validResponse=1 and (m.xAuthorized='true' + or m.xAuthorized='Appro') and m.mode='void'"; + if(!$db->table_exists('gcReceiptView',$name)){ + db_structure_modify($db,'gcReceiptView',$gcV,$errors); + } + + $sigCaptureTable = "CREATE TABLE CapturedSignature ( + tdate datetime, + emp_no int, + register_no int, + trans_no int, + trans_id int, + filetype char(3), + filecontents blob)"; + if($type == "mssql"){ + $sigCaptureTable = str_replace("blob","image",$sigCaptureTable); + } + if (!$db->table_exists("CapturedSignature")){ + db_structure_modify($db,'CapturedSignature',$sigCaptureTable,$errors); + } + + $lttG = "CREATE view ltt_grouped as + select upc,description,trans_type,trans_subtype,sum(itemQtty)as itemqtty, + discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale, + sum(unitprice) as unitprice, + convert(sum(total),decimal(10,2)) as total, + sum(regPrice) as regPrice,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtemptrans + where description not like '** YOU SAVED %' and trans_status = 'M' + group by upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + matched,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select upc,case when numflag=1 then concat(description,'*') else description end as description, + trans_type,trans_subtype,sum(itemQtty)as itemqtty,discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale,unitprice,convert(sum(total),decimal(10,2)) as total,regPrice,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtemptrans + where description not like '** YOU SAVED %' and trans_status !='M' + AND trans_type <> 'L' + group by upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + unitprice,regPrice,matched,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select upc, + case when discounttype=1 then + concat(' > you saved $',convert(convert(sum(quantity*regprice-quantity*unitprice),decimal(10,2)),char(20)),' <') + when discounttype=2 then + concat(' > you saved $',convert(convert(sum(quantity*regprice-quantity*unitprice),decimal(10,2)),char(20)),' Member Special <') + end as description, + trans_type,'0' as trans_subtype,0 as itemQtty,discounttype,volume, + 'D' as trans_status, + 2 as voided, + department,0 as quantity,matched,min(trans_id)+1 as trans_id, + scale,0 as unitprice, + 0 as total, + 0 as regPrice,0 as tax,0 as foodstamp,charflag, + case when trans_status='d' or scale=1 then trans_id else scale end as grouper + from localtemptrans + where description not like '** YOU SAVED %' and (discounttype=1 or discounttype=2) + AND trans_type <> 'L' + group by upc,description,trans_type,trans_subtype,discounttype,volume, + department,scale,matched, + case when trans_status='d' or scale=1 then trans_id else scale end + having convert(sum(quantity*regprice-quantity*unitprice),decimal(10,2))<>0"; + if($type == 'mssql'){ + $lttG = "CREATE view ltt_grouped as + select upc,description,trans_type,trans_subtype,sum(itemQtty)as itemqtty, + discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale, + sum(unitprice) as unitprice, + sum(total) as total, + sum(regPrice) as regPrice,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtemptrans + where description not like '** YOU SAVED %' and trans_status = 'M' + group by upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + matched,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select upc,case when numflag=1 then description+'*' else description end as description, + trans_type,trans_subtype,sum(itemQtty)as itemqtty,discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale,unitprice,sum(total) as total,regPrice,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtemptrans + where description not like '** YOU SAVED %' and trans_status !='M' + AND trans_type <> 'L' + group by upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + unitprice,regPrice,matched,tax,foodstamp,charflag, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select upc, + case when discounttype=1 then + ' > you saved $'+convert(varchar(20),convert(money,sum(quantity*regprice-quantity*unitprice)))+' <' + when discounttype=2 then + ' > you saved $'+convert(varchar(20),convert(money,sum(quantity*regprice-quantity*unitprice)))+' Member Special <' + end as description, + trans_type,'0' as trans_subtype,0 as itemQtty,discounttype,volume, + 'D' as trans_status, + 2 as voided, + department,0 as quantity,matched,min(trans_id)+1 as trans_id, + scale,0 as unitprice, + 0 as total, + 0 as regPrice,0 as tax,0 as foodstamp,charflag, + case when trans_status='d' or scale=1 then trans_id else scale end as grouper + from localtemptrans + where description not like '** YOU SAVED %' and (discounttype=1 or discounttype=2) + AND trans_type <> 'L' + group by upc,description,trans_type,trans_subtype,discounttype,volume, + department,scale,matched, + case when trans_status='d' or scale=1 then trans_id else scale end + having convert(money,sum(quantity*regprice-quantity*unitprice))<>0"; + } + db_structure_modify($db,'ltt_grouped','DROP VIEW ltt_grouped',$errors); + if(!$db->table_exists('ltt_grouped',$name)){ + db_structure_modify($db,'ltt_grouped',$lttG,$errors); + } + + + $lttreorderG = "CREATE view ltt_receipt_reorder_g as + select + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when charflag = 'SO' + then '' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char),' @ ',convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char),' /',convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char),' @ ',convert(Volume,char),' /',convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char),' /',convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char),' @ ',convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + when tax = 1 and foodstamp <> 0 + then 'TF' + when tax = 1 and foodstamp = 0 + then 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN CONCAT(LEFT(t.description,1),'F') + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + case when trans_subtype='CM' or voided in (10,17) + then 'CM' else trans_type + end + as trans_type, + unitPrice, + voided, + trans_id + 1000 as sequence, + department, + upc, + trans_subtype + from ltt_grouped as l + left join taxrates as t + on l.tax = t.id + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT' + AND trans_type <> 'L' + and not (trans_status='M' and total=convert('0.00',decimal(10,2))) + + union + + select + ' ' as description, + ' ' as comment, + 0 as total, + ' ' as Status, + ' ' as trans_type, + 0 as unitPrice, + 0 as voided, + 999 as sequence, + '' as department, + '' as upc, + '' as trans_subtype"; + + if($type == 'mssql'){ + $lttreorderG = "CREATE view ltt_receipt_reorder_g as + select top 100 percent + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + WHEN (tax = 1 and foodstamp <> 0) + THEN 'TF' + WHEN (tax = 1 and foodstamp = 0) + THEN 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN LEFT(t.description,1)+'F' + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + case when trans_subtype='CM' or voided in (10,17) + then 'CM' else trans_type + end + as trans_type, + unitPrice, + voided, + trans_id + 1000 as sequence, + department, + upc, + trans_subtype + from ltt_grouped as l + left join taxrates as t + on l.tax = t.id + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT' + AND trans_type <> 'L' + and not (trans_status='M' and total=convert(money,'0.00')) + + union + + select + ' ' as description, + ' ' as comment, + 0 as total, + ' ' as Status, + ' ' as trans_type, + 0 as unitPrice, + 0 as voided, + 999 as sequence, + '' as department, + '' as upc, + '' as trans_subtype"; + } + db_structure_modify($db,'ltt_receipt_reorder_g','DROP VIEW ltt_receipt_reorder_g',$errors); + if(!$db->table_exists('ltt_receipt_reorder_g',$name)){ + db_structure_modify($db,'ltt_receipt_reorder_g',$lttreorderG,$errors); + } + + $reorderG = "CREATE view receipt_reorder_g as + select + case + when trans_type = 'T' + then + case when trans_subtype = 'CP' and upc<>'0' + then concat( + rpad(Description,30,' '), + ' ', + rpad(Comment,12,' '), + lpad(convert(Total,char),8,' '), + lpad(status,4,' ') ) + else concat( lpad(upper(Description),44,' '), + lpad(convert((-1 * Total),char),8,' '), + lpad(status,4,' ') ) + end + when voided = 3 + then concat( rpad(Description,30,' '), + space(9), + 'TOTAL', + lpad(convert(UnitPrice,char),8,' ') ) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then concat( rpad(Description,30,' '), + space(14), + lpad(convert(UnitPrice,char),8,' '), + lpad(status,4,' ') ) + when sequence < 1000 + then description + else + concat( rpad(Description,30,' '), + ' ', + rpad(Comment,12,' '), + lpad(convert(Total,char),8,' '), + lpad(status,4,' ') ) + end as linetoprint, + sequence, + department, + subdept_name as dept_name, + trans_type, + upc + from ltt_receipt_reorder_g r + left outer join ".$CORE_LOCAL->get('pDatabase').".subdepts d on r.department=d.dept_ID + where r.total<>0 or r.unitprice=0 + order by sequence"; + if($type == 'mssql'){ + $reorderG = "CREATE view receipt_reorder_g as + select top 100 percent + case + when trans_type = 'T' + then + case when trans_subtype = 'CP' and upc<>'0' + then left(Description + space(30), 30) + + ' ' + + left(Comment + space(12), 12) + + right(space(8) + convert(varchar, Total), 8) + + right(space(4) + status, 4) + else right((space(44) + upper(rtrim(Description))), 44) + + right((space(8) + convert(varchar, (-1 * Total))), 8) + + right((space(4) + status), 4) + end + when voided = 3 + then left(Description + space(30), 30) + + space(9) + + 'TOTAL' + + right(space(8) + convert(varchar, UnitPrice), 8) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then left(Description + space(30), 30) + + space(14) + + right(space(8) + convert(varchar, UnitPrice), 8) + + right(space(4) + status, 4) + when sequence < 1000 + then description + else + left(Description + space(30), 30) + + ' ' + + left(Comment + space(12), 12) + + right(space(8) + convert(varchar, Total), 8) + + right(space(4) + status, 4) + end + as linetoprint, + sequence, + department, + dept_name, + trans_type, + upc + from ltt_receipt_reorder_g r + left outer join ".$CORE_LOCAL->get('pDatabase')."dbo.subdepts + d on r.department=d.dept_ID + where r.total<>0 or r.unitprice=0 + order by sequence"; + } + if(!$db->table_exists('receipt_reorder_g',$name)){ + db_structure_modify($db,'receipt_reorder_g',$reorderG,$errors); + } + + + $unionsG = "CREATE view receipt_reorder_unions_g as + select linetoprint, + sequence,dept_name,1 as ordered,upc + from receipt_reorder_g + where (department<>0 or trans_type IN ('CM','I')) + and linetoprint not like 'member discount%' + + union all + + select replace(replace(replace(r1.linetoprint,'** T',' = t'),' **',' = '),'W','w') as linetoprint, + r1.sequence,r2.dept_name,1 as ordered,r2.upc + from receipt_reorder_g as r1 join receipt_reorder_g as r2 on r1.sequence+1=r2.sequence + where r1.linetoprint like '** T%' and r2.dept_name is not null and r1.linetoprint<>'** Tare Weight 0 **' + + union all + + select + concat( + rpad(concat('** ',rtrim(convert(percentdiscount,char)),'% Discount Applied **'),30,' '), + ' ', + space(13), + lpad(convert((-1*transDiscount),char),8,' '), + space(4) ) as linetoprint, + 0 as sequence,null as dept_name,2 as ordered, + '' as upc + from subtotals + where percentdiscount<>0 + + union all + + select linetoprint,sequence,null as dept_name,2 as ordered,upc + from receipt_reorder_g + where linetoprint like 'member discount%' + + union all + + select + concat( + lpad('SUBTOTAL',44,' '), + lpad(convert(round(l.runningTotal-s.taxTotal-l.tenderTotal,2),char),8,' '), + space(4) ) as linetoprint,1 as sequence,null as dept_name,3 as ordered,'' as upc + from lttsummary as l, subtotals as s + + union all + + select + concat( + lpad('TAX',44,' '), + lpad(convert(round(taxtotal,2),char),8,' '), + space(4) ) as linetoprint, + 2 as sequence,null as dept_name,3 as ordered,'' as upc + from subtotals + + union all + + select + concat( + lpad('TOTAL',44,' '), + lpad(convert(runningtotal-tendertotal,char),8,' '), + space(4) ) as linetoprint,3 as sequence,null as dept_name,3 as ordered,'' as upc + from lttsummary + + union all + + select linetoprint,sequence,dept_name,4 as ordered,upc + from receipt_reorder_g + where (trans_type='T' and department = 0) + or (department = 0 and trans_type NOT IN ('CM','I') + and linetoprint NOT LIKE '** %' + and linetoprint NOT LIKE 'Subtotal%') + + union all + + select + concat( + lpad('CURRENT AMOUNT DUE',44,' '), + lpad(convert(runningTotal-transDiscount,char),8,' '), + space(4) ) as linetoprint, + 5 as sequence, + null as dept_name, + 5 as ordered,'' as upc + from subtotals where runningTotal <> 0 "; + + if($type == 'mssql'){ + $unionsG = "CREATE view receipt_reorder_unions_g as + select linetoprint, + sequence,dept_name,1 as ordered,upc + from receipt_reorder_g + where (department<>0 or trans_type IN ('CM','I')) + and linetoprint not like 'member discount%' + + union all + + select replace(replace(replace(r1.linetoprint,'** T',' = T'),' **',' = '),'W','w') as linetoprint, + r1.[sequence],r2.dept_name,1 as ordered,r2.upc + from receipt_reorder_g r1 join receipt_reorder_g r2 on r1.[sequence]+1=r2.[sequence] + where r1.linetoprint like '** T%' and r2.dept_name is not null and r1.linetoprint<>'** Tare Weight 0 **' + + union all + + select + left('** '+rtrim(convert(char,percentdiscount))+'% Discount Applied **' + space(30), 30) + + ' ' + + left('' + space(13), 13) + + right(space(8) + convert(varchar, (-1*transDiscount)), 8) + + right(space(4) + '', 4), + 0 as sequence,null as dept_name,2 as ordered, + '' as upc + from subtotals + where percentdiscount<>0 + + union all + + select linetoprint,sequence,null as dept_name,2 as ordered,upc + from receipt_reorder_g + where linetoprint like 'member discount%' + + union all + + select + right((space(44) + upper(rtrim('SUBTOTAL'))), 44) + + right((space(8) + convert(varchar,round(l.runningTotal-s.taxTotal-l.tenderTotal,2))),8) + + right((space(4) + ''), 4) as linetoprint,1 as sequence,null as dept_name,3 as ordered,'' as upc + from lttsummary as l, subtotals as s + + union all + + select + right((space(44) + upper(rtrim('TAX'))), 44) + + right((space(8) + convert(varchar,round(taxtotal,2))), 8) + + right((space(4) + ''), 4) as linetoprint, + 2 as sequence,null as dept_name,3 as ordered,'' as upc + from subtotals + + union all + + select + right((space(44) + upper(rtrim('TOTAL'))), 44) + + right((space(8) +convert(varchar,runningtotal-tendertotal)),8) + + right((space(4) + ''), 4) as linetoprint,3 as sequence,null as dept_name,3 as ordered,'' as upc + from lttsummary + + union all + + select linetoprint,sequence,dept_name,4 as ordered,upc + from receipt_reorder_g + where (trans_type='T' and department = 0) + or (department = 0 and trans_type NOT IN ('CM','I') and linetoprint like '%Coupon%') + + union all + + select + right((space(44) + upper(rtrim('Current Amount Due'))), 44) + +right((space(8) + convert(varchar,subtotal)),8) + + right((space(4) + ''), 4) as linetoprint, + 5 as sequence, + null as dept_name, + 5 as ordered,'' as upc + from subtotals where runningtotal <> 0 "; + } + if(!$db->table_exists('receipt_reorder_unions_g',$name)){ + db_structure_modify($db,'receipt_reorder_unions_g',$unionsG,$errors); + } + + $rplttG = "CREATE view rp_ltt_grouped as + select register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,sum(itemQtty)as itemqtty, + discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale, + sum(unitprice) as unitprice, + convert(sum(total),decimal(10,2)) as total, + sum(regPrice) as regPrice,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtranstoday + where description not like '** YOU SAVED %' and trans_status = 'M' + group by register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + matched,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select register_no,emp_no,trans_no,card_no, + upc,case when numflag=1 then concat(description,'*') else description end as description, + trans_type,trans_subtype,sum(itemQtty)as itemqtty,discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale,unitprice,convert(sum(total),decimal(10,2)) as total,regPrice,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtranstoday + where description not like '** YOU SAVED %' and trans_status !='M' + AND trans_type <> 'L' + group by register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + unitprice,regPrice,matched,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select register_no,emp_no,trans_no,card_no, + upc, + case when discounttype=1 then + concat(' > YOU SAVED $',convert(convert(sum(quantity*regprice-quantity*unitprice),decimal(10,2)),char(20)),' <') + when discounttype=2 then + concat(' > YOU SAVED $',convert(convert(sum(quantity*regprice-quantity*unitprice),decimal(10,2)),char(20)),' Member Special <') + end as description, + trans_type,'0' as trans_subtype,0 as itemQtty,discounttype,volume, + 'D' as trans_status, + 2 as voided, + department,0 as quantity,matched,min(trans_id)+1 as trans_id, + scale,0 as unitprice, + 0 as total, + 0 as regPrice,0 as tax,0 as foodstamp, + case when trans_status='d' or scale=1 then trans_id else scale end as grouper + from localtranstoday + where description not like '** YOU SAVED %' and (discounttype=1 or discounttype=2) + AND trans_type <> 'L' + group by register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,discounttype,volume, + department,scale,matched, + case when trans_status='d' or scale=1 then trans_id else scale end + having convert(sum(quantity*regprice-quantity*unitprice),decimal(10,2))<>0"; + if($type == 'mssql'){ + $rplttG = "CREATE view rp_ltt_grouped as + select register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,sum(itemQtty)as itemqtty, + discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale, + sum(unitprice) as unitprice, + sum(total) as total, + sum(regPrice) as regPrice,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtranstoday + where description not like '** YOU SAVED %' and trans_status = 'M' + group by register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + matched,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select register_no,emp_no,trans_no,card_no, + upc,case when numflag=1 then description+'*' else description end as description, + trans_type,trans_subtype,sum(itemQtty)as itemqtty,discounttype,volume, + trans_status, + case when voided=1 then 0 else voided end as voided, + department,sum(quantity) as quantity,matched,min(trans_id) as trans_id, + scale,unitprice,sum(total) as total,regPrice,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end as grouper + from localtranstoday + where description not like '** YOU SAVED %' and trans_status !='M' + AND trans_type <> 'L' + group by register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,discounttype,volume, + trans_status, + department,scale,case when voided=1 then 0 else voided end, + unitprice,regPrice,matched,tax,foodstamp, + case when trans_status='d' or scale=1 or trans_type='T' then trans_id else scale end + + union all + + select register_no,emp_no,trans_no,card_no, + upc, + case when discounttype=1 then + ' > YOU SAVED $'+convert(varchar(20),convert(money,sum(quantity*regprice-quantity*unitprice)))+' <' + when discounttype=2 then + ' > YOU SAVED $'+convert(varchar(20),convert(money,sum(quantity*regprice-quantity*unitprice)))+' Member Special <' + end as description, + trans_type,'0' as trans_subtype,0 as itemQtty,discounttype,volume, + 'D' as trans_status, + 2 as voided, + department,0 as quantity,matched,min(trans_id)+1 as trans_id, + scale,0 as unitprice, + 0 as total, + 0 as regPrice,0 as tax,0 as foodstamp, + case when trans_status='d' or scale=1 then trans_id else scale end as grouper + from localtranstoday + where description not like '** YOU SAVED %' and (discounttype=1 or discounttype=2) + AND trans_type <> 'L' + group by register_no,emp_no,trans_no,card_no, + upc,description,trans_type,trans_subtype,discounttype,volume, + department,scale,matched, + case when trans_status='d' or scale=1 then trans_id else scale end + having convert(money,sum(quantity*regprice-quantity*unitprice))<>0"; + } + db_structure_modify($db,'rp_ltt_grouped','DROP VIEW rp_ltt_grouped',$errors); + if(!$db->table_exists('rp_ltt_grouped',$name)){ + db_structure_modify($db,'rp_ltt_grouped',$rplttG,$errors); + } + + $rpreorderG = "CREATE view rp_ltt_receipt_reorder_g as + select + register_no,emp_no,trans_no,card_no, + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then concat(convert(quantity,char),' @ ',convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then concat(convert(volume,char),' /',convert(unitPrice,char)) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then concat(convert(Quantity,char),' @ ',convert(Volume,char),' /',convert(unitPrice,char)) + when abs(itemQtty) > 1 and discounttype = 3 + then concat(convert(ItemQtty,char),' /',convert(UnitPrice,char)) + when abs(itemQtty) > 1 + then concat(convert(quantity,char),' @ ',convert(unitPrice,char)) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + WHEN (tax = 1 and foodstamp <> 0) + THEN 'TF' + WHEN (tax = 1 and foodstamp = 0) + THEN 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN CONCAT(LEFT(t.description,1),'F') + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + unitPrice, + voided, + trans_id + 1000 as sequence, + department, + upc, + trans_subtype + from rp_ltt_grouped as l + left join taxrates as t + on l.tax=t.id + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT' + AND trans_type <> 'L' + and not (trans_status='M' and total=convert('0.00',decimal)) + + union + + select + 0 as register_no, 0 as emp_no,0 as trans_no,0 as card_no, + ' ' as description, + ' ' as comment, + 0 as total, + ' ' as Status, + ' ' as trans_type, + 0 as unitPrice, + 0 as voided, + 999 as sequence, + '' as department, + '' as upc, + '' as trans_subtype"; + if($type == 'mssql'){ + $rpreorderG = "CREATE view rp_ltt_receipt_reorder_g as + select top 100 percent + register_no,emp_no,trans_no,card_no, + l.description, + case + when voided = 5 + then 'Discount' + when trans_status = 'M' + then 'Mbr special' + when trans_status = 'S' + then 'Staff special' + when scale <> 0 and quantity <> 0 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1 + then convert(varchar, volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1 + then convert(varchar, Quantity) + ' @ ' + convert(varchar, Volume) + ' /' + convert(varchar, unitPrice) + when abs(itemQtty) > 1 and discounttype = 3 + then convert(varchar,ItemQtty) + ' /' + convert(varchar, UnitPrice) + when abs(itemQtty) > 1 + then convert(varchar, quantity) + ' @ ' + convert(varchar, unitPrice) + when matched > 0 + then '1 w/ vol adj' + else '' + end + as comment, + total, + case + when trans_status = 'V' + then 'VD' + when trans_status = 'R' + then 'RF' + WHEN (tax = 1 and foodstamp <> 0) + THEN 'TF' + WHEN (tax = 1 and foodstamp = 0) + THEN 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN LEFT(t.description,1)+'F' + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + when tax = 0 and foodstamp <> 0 + then 'F' + when tax = 0 and foodstamp = 0 + then '' + end + as Status, + trans_type, + unitPrice, + voided, + trans_id + 1000 as sequence, + department, + upc, + trans_subtype + from rp_ltt_grouped as l + left join taxrates as t + on l.tax=t.id + where voided <> 5 and UPC <> 'TAX' and UPC <> 'DISCOUNT' + AND trans_type <> 'L' + and not (trans_status='M' and total=convert(money,'0.00')) + + union + + select + 0 as register_no, 0 as emp_no,0 as trans_no,0 as card_no, + ' ' as description, + ' ' as comment, + 0 as total, + ' ' as Status, + ' ' as trans_type, + 0 as unitPrice, + 0 as voided, + 999 as sequence, + '' as department, + '' as upc, + '' as trans_subtype"; + } + db_structure_modify($db,'rp_ltt_receipt_reorder_g','DROP VIEW rp_ltt_receipt_reorder_g',$errors); + if(!$db->table_exists("rp_ltt_receipt_reorder_g",$name)){ + db_structure_modify($db,'rp_ltt_receipt_reorder_g',$rpreorderG,$errors); + } + + $rpG = "CREATE view rp_receipt_reorder_g as + select + register_no,emp_no,trans_no,card_no, + case + when trans_type = 'T' + then + case when trans_subtype = 'CP' and upc<>'0' + then concat( + rpad(Description,30,' '), + ' ', + rpad(Comment,12,' '), + lpad(convert(Total,char),8,' '), + lpad(status,4,' ')) + else concat( + lpad(upper(rtrim(Description)),44,' '), + lpad(convert((-1 * Total),char),8,' '), + lpad(status,4,' ')) + end + when voided = 3 + then concat(rpad(Description,30,' '), + space(9), + 'TOTAL', + lpad(convert(UnitPrice,char),8,' ')) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then concat(rpad(Description,30,' '), + space(14), + lpad(convert(UnitPrice,char),8,' '), + lpad(status,4,' ')) + when sequence < 1000 + then description + else + concat(rpad(Description,30,' '), + ' ', + rpad(Comment,12, ' '), + lpad(convert(Total,char),8,' '), + lpad(status,4,' ')) + end + as linetoprint, + sequence, + department, + subdept_name as dept_name, + case when trans_subtype='CM' or voided in (10,17) + then 'CM' else trans_type + end + as trans_type, + upc + + from rp_ltt_receipt_reorder_g r + left outer join ".$CORE_LOCAL->get('pDatabase').".subdepts d + on r.department=d.dept_ID + where r.total<>0 or r.unitprice=0 + order by register_no,emp_no,trans_no,card_no,sequence"; + if($type == 'mssql'){ + $rpG = "CREATE view rp_receipt_reorder_g as + select top 100 percent + register_no,emp_no,trans_no,card_no, + case + when trans_type = 'T' + then + case when trans_subtype = 'CP' and upc<>'0' + then left(Description + space(30), 30) + + ' ' + + left(Comment + space(12), 12) + + right(space(8) + convert(varchar, Total), 8) + + right(space(4) + status, 4) + else right((space(44) + upper(rtrim(Description))), 44) + + right((space(8) + convert(varchar, (-1 * Total))), 8) + + right((space(4) + status), 4) + end + when voided = 3 + then left(Description + space(30), 30) + + space(9) + + 'TOTAL' + + right(space(8) + convert(varchar, UnitPrice), 8) + when voided = 2 + then description + when voided = 4 + then description + when voided = 6 + then description + when voided = 7 or voided = 17 + then left(Description + space(30), 30) + + space(14) + + right(space(8) + convert(varchar, UnitPrice), 8) + + right(space(4) + status, 4) + when sequence < 1000 + then description + else + left(Description + space(30), 30) + + ' ' + + left(Comment + space(12), 12) + + right(space(8) + convert(varchar, Total), 8) + + right(space(4) + status, 4) + end + as linetoprint, + sequence, + department, + dept_name, + case when trans_subtype='CM' or voided in (10,17) + then 'CM' else trans_type + end + as trans_type, + upc + + from rp_ltt_receipt_reorder_g r + left outer join ".$CORE_LOCAL->get('pDatabase').".dbo.subdepts d + on r.department=d.dept_ID + where r.total<>0 or r.unitprice=0 + order by register_no,emp_no,trans_no,card_no,sequence"; + } + if(!$db->table_exists('rp_receipt_reorder_g',$name)){ + db_structure_modify($db,'rp_receipt_reorder_g',$rpG,$errors); + } + + $rpunionsG = "CREATE view rp_receipt_reorder_unions_g as + select linetoprint, + emp_no,register_no,trans_no, + sequence,dept_name,1 as ordered,upc + from rp_receipt_reorder_g + where (department<>0 or trans_type='CM') + and linetoprint not like 'member discount%' + + union all + + select replace(replace(r1.linetoprint,'** T',' = T'),' **',' = ') as linetoprint, + r1.emp_no,r1.register_no,r1.trans_no, + r1.sequence,r2.dept_name,1 as ordered,r2.upc + from rp_receipt_reorder_g r1 join rp_receipt_reorder_g r2 on r1.sequence+1=r2.sequence + and r1.register_no=r2.register_no and r1.emp_no=r2.emp_no and r1.trans_no=r2.trans_no + where r1.linetoprint like '** T%' and r2.dept_name is not null and r1.linetoprint<>'** Tare Weight 0 **' + + union all + + select + concat( + rpad(concat('** ',rtrim(convert(percentdiscount,char)),'% Discount Applied **'),30,' '), + space(14), + lpad(convert((-1*transDiscount),char),8,' '), + space(4) ), + emp_no,register_no,trans_no, + 0 as sequence,null as dept_name,2 as ordered, + '' as upc + from rp_subtotals + where percentdiscount<>0 + + union all + + select linetoprint, + emp_no,register_no,trans_no, + sequence,null as dept_name,2 as ordered,upc + from rp_receipt_reorder_g + where linetoprint like 'member discount%' + + union all + + select + concat( + lpad('SUBTOTAL',44,' '), + lpad(convert(l.runningTotal-s.taxTotal-l.tenderTotal,char),8,' '), + space(4)) as linetoprint, + l.emp_no,l.register_no,l.trans_no, + 1 as sequence,null as dept_name,3 as ordered,'' as upc + from rp_lttsummary as l, rp_subtotals as s + WHERE l.emp_no = s.emp_no and + l.register_no = s.register_no and + l.trans_no = s.trans_no + + union all + + select + concat( + lpad('TAX',44,' '), + lpad(convert(taxtotal,char),8,' '), + space(4)) as linetoprint, + emp_no,register_no,trans_no, + 2 as sequence,null as dept_name,3 as ordered,'' as upc + from rp_subtotals + + union all + + select + concat( + lpad('TOTAL',44,' '), + lpad(convert(runningtotal-tendertotal,char),8,' '), + space(4)) as linetoprint, + emp_no,register_no,trans_no, + 3 as sequence,null as dept_name,3 as ordered,'' as upc + from rp_lttsummary + + union all + + select linetoprint, + emp_no,register_no,trans_no, + sequence,dept_name,4 as ordered,upc + from rp_receipt_reorder_g + where (trans_type='T' and department = 0) + or (department = 0 and linetoprint like '%Coupon%') + + union all + + select + concat( + lpad('CURRENT AMOUNT DUE',44,' '), + lpad(convert(runningTotal-transDiscount,char),8,' '), + space(4)) as linetoprint, + emp_no,register_no,trans_no, + 5 as sequence, + null as dept_name, + 5 as ordered,'' as upc + from rp_subtotals where runningTotal <> 0 "; + if($type == 'mssql'){ + $rpunionsG = "CREATE view rp_receipt_reorder_unions_g as + select linetoprint, + emp_no,register_no,trans_no, + sequence,dept_name,1 as ordered,upc + from rp_receipt_reorder_g + where (department<>0 or trans_type='CM') + and linetoprint not like 'member discount%' + + union all + + select replace(replace(r1.linetoprint,'** T',' = T'),' **',' = ') as linetoprint, + r1.emp_no,r1.register_no,r1.trans_no, + r1.[sequence],r2.dept_name,1 as ordered,r2.upc + from rp_receipt_reorder_g r1 join rp_receipt_reorder_g r2 on r1.[sequence]+1=r2.[sequence] + and r1.emp_no=r2.emp_no and r1.register_no=r2.register_no and r1.trans_no=r2.trans_no + where r1.linetoprint like '** T%' and r2.dept_name is not null and r1.linetoprint<>'** Tare Weight 0 **' + + union all + + select + left('** '+rtrim(convert(char,percentdiscount))+'% Discount Applied **' + space(30), 30) + + ' ' + + left('' + space(13), 13) + + right(space(8) + convert(varchar, (-1*transDiscount)), 8) + + right(space(4) + '', 4), + emp_no,register_no,trans_no, + 0 as sequence,null as dept_name,2 as ordered, + '' as upc + from rp_subtotals + where percentdiscount<>0 + + union all + + select linetoprint, + emp_no,register_no,trans_no, + sequence,null as dept_name,2 as ordered,upc + from rp_receipt_reorder_g + where linetoprint like 'member discount%' + + union all + + select + right((space(44) + upper(rtrim('SUBTOTAL'))), 44) + + right((space(8) + convert(varchar,l.runningTotal-s.taxTotal-l.tenderTotal)),8) + + right((space(4) + ''), 4) as linetoprint, + l.emp_no,l.register_no,l.trans_no, + 1 as sequence,null as dept_name,3 as ordered,'' as upc + from rp_lttsummary as l, rp_subtotals as s + WHERE l.emp_no = s.emp_no and + l.register_no = s.register_no and + l.trans_no = s.trans_no + + union all + + select + right((space(44) + upper(rtrim('TAX'))), 44) + + right((space(8) + convert(varchar,taxtotal)), 8) + + right((space(4) + ''), 4) as linetoprint, + emp_no,register_no,trans_no, + 2 as sequence,null as dept_name,3 as ordered,'' as upc + from rp_subtotals + + union all + + select + right((space(44) + upper(rtrim('TOTAL'))), 44) + + right((space(8) +convert(varchar,runningtotal-tendertotal)),8) + + right((space(4) + ''), 4) as linetoprint, + emp_no,register_no,trans_no, + 3 as sequence,null as dept_name,3 as ordered,'' as upc + from rp_lttsummary + + union all + + select linetoprint, + emp_no,register_no,trans_no, + sequence,dept_name,4 as ordered,upc + from rp_receipt_reorder_g + where (trans_type='T' and department = 0) + or (department = 0 and linetoprint like '%Coupon%') + + union all + + select + right((space(44) + upper(rtrim('Current Amount Due'))), 44) + +right((space(8) + convert(varchar,subtotal)),8) + + right((space(4) + ''), 4) as linetoprint, + emp_no,register_no,trans_no, + 5 as sequence, + null as dept_name, + 5 as ordered,'' as upc + from rp_subtotals where runningtotal <> 0"; + } + if(!$db->table_exists('rp_receipt_reorder_unions_g',$name)){ + db_structure_modify($db,'rp_receipt_reorder_unions_g',$rpunionsG,$errors); + } + + return $errors; +} + +function create_min_server($db,$type){ + global $CORE_LOCAL; + $name = $CORE_LOCAL->get('mDatabase'); + $errors = array(); + + $dtransQ = "CREATE TABLE `dtransactions` ( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(255) default NULL, + `description` varchar(255) default NULL, + `trans_type` varchar(255) default NULL, + `trans_subtype` varchar(255) default NULL, + `trans_status` varchar(255) default NULL, + `department` smallint(6) default NULL, + `quantity` real default NULL, + `scale` tinyint(4) default NULL, + `cost` real default 0.00 NULL, + `unitPrice` real default NULL, + `total` real default NULL, + `regPrice` real default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` real default NULL, + `memDiscount` real default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` real default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` real default NULL, + `mixMatch` smallint(6) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` smallint(6) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` varchar(255) default NULL, + `trans_id` int(11) default NULL + )"; + if ($type == 'mssql'){ + $dtransQ = "CREATE TABLE [dtransactions] ( + [datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [smallint] NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [staff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL + ) ON [PRIMARY]"; + } + if (!$db->table_exists("dtransactions",$name)){ + $db->query($dtransQ,$name); + db_structure_modify($db,'dtransactions',$dtransQ,$errors); + } + + $susQ = str_replace("dtransactions","suspended",$dtransQ); + if(!$db->table_exists("suspended",$name)){ + db_structure_modify($db,'suspended',$susQ,$errors); + } + + $dlogQ = "CREATE VIEW dlog AS + SELECT + datetime AS tdate, + register_no, + emp_no, + trans_no, + upc, + CASE WHEN (trans_subtype IN ('CP','IC') OR upc like('%000000052')) then 'T' WHEN upc = 'DISCOUNT' then 'S' else trans_type end as trans_type, + CASE WHEN upc = 'MAD Coupon' THEN 'MA' + WHEN upc like('%00000000052') THEN 'RR' ELSE trans_subtype END as trans_subtype, + trans_status, + department, + quantity, + unitPrice, + total, + tax, + foodstamp, + ItemQtty, + memType, + staff, + numflag, + charflag, + card_no, + trans_id, + ".$db->concat( + $db->convert('emp_no','char'),"'-'", + $db->convert('register_no','char'),"'-'", + $db->convert('trans_no','char'),'') + ." as trans_num + FROM dtransactions + WHERE trans_status NOT IN ('D','X','Z') + AND emp_no <> 9999 and register_no <> 99"; + if(!$db->table_exists("dlog",$name)){ + $errors = db_structure_modify($db,'dlog',$dlogQ,$errors); + } + + + + $alogQ = "CREATE TABLE alog ( + `datetime` datetime, + LaneNo smallint, + CashierNo smallint, + TransNo int, + Activity tinyint, + `Interval` real)"; + if ($type == 'mssql'){ + $alogQ = str_replace("`datetime`","[datetime]",$alogQ); + $alogQ = str_replace("`","",$alogQ); + } + if(!$db->table_exists("alog",$name)){ + db_structure_modify($db,'alog',$alogQ,$errors); + } + + $susToday = "CREATE VIEW suspendedtoday AS + SELECT * FROM suspended WHERE " + .$db->datediff($db->now(),'datetime')." = 0"; + if (!$db->table_exists("suspendedtoday",$name)){ + db_structure_modify($db,'suspendedtoday',$susToday,$errors); + } + + $efsrq = "CREATE TABLE efsnetRequest ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + refNum varchar (50) , + live tinyint , + mode varchar (32) , + amount real , + PAN varchar (19) , + issuer varchar (16) , + name varchar (50) , + manual tinyint , + sentPAN tinyint , + sentExp tinyint , + sentTr1 tinyint , + sentTr2 tinyint + )"; + if(!$db->table_exists('efsnetRequest',$name)){ + db_structure_modify($db,'efsnetRequest',$efsrq,$errors); + } + + $efsrp = "CREATE TABLE efsnetResponse ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + refNum varchar (50), + seconds float , + commErr int , + httpCode int , + validResponse smallint , + xResponseCode varchar (4), + xResultCode varchar (4), + xResultMessage varchar (100), + xTransactionID varchar (12), + xApprovalNumber varchar (20) + )"; + if(!$db->table_exists('efsnetResponse',$name)){ + db_structure_modify($db,'efsnetResponse',$efsrp,$errors); + } + + $efsrqm = "CREATE TABLE efsnetRequestMod ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + origRefNum varchar (50), + origAmount real , + origTransactionID varchar(12) , + mode varchar (32), + altRoute tinyint , + seconds float , + commErr int , + httpCode int , + validResponse smallint , + xResponseCode varchar(4), + xResultCode varchar(4), + xResultMessage varchar(100) + )"; + if(!$db->table_exists('efsnetRequestMod',$name)){ + db_structure_modify($db,'efsnetRequestMod',$efsrqm,$errors); + } + + $ttG = "CREATE view TenderTapeGeneric + as + select + tdate, + emp_no, + register_no, + trans_no, + CASE WHEN trans_subtype = 'CP' AND upc LIKE '%MAD%' THEN '' + WHEN trans_subtype IN ('EF','EC','TA') THEN 'EF' + ELSE trans_subtype + END AS trans_subtype, + CASE WHEN trans_subtype = 'ca' THEN + CASE WHEN total >= 0 THEN total ELSE 0 END + ELSE + -1 * total + END AS tender + from dlog + where datediff(tdate, curdate()) = 0 + and trans_subtype not in ('0','')"; + if (!$db->table_exists("TenderTapeGeneric",$name)){ + db_structure_modify($db,'TenderTapeGeneric',$ttG,$errors); + } + + // re-use definition to create lane_config on server + create_if_needed($db, $type, $name, 'lane_config', 'op', $errors); + + return $errors; +} + +?> diff --git a/pos/is4c-nf/install/plugins.php b/pos/is4c-nf/install/plugins.php new file mode 100644 index 000000000..8ddb1e1cf --- /dev/null +++ b/pos/is4c-nf/install/plugins.php @@ -0,0 +1,122 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>IT CORE Lane Installation: Plugins</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +<link rel="stylesheet" href="../css/toggle-switch.css" type="text/css" /> +<script type="text/javascript" src="../js/jquery.js"></script> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Plugins</h2> + +<div class="alert"><?php check_writeable('../ini.php'); ?></div> +<div class="alert"><?php check_writeable('../ini-local.php'); ?></div> + +<table id="install" border=0 cellspacing=0 cellpadding=4> + +<form action=plugins.php method=post> +<b>Available plugins</b>:<br /> +<?php +if (isset($_REQUEST['PLUGINLIST']) || isset($_REQUEST['psubmit'])){ + $oldset = $CORE_LOCAL->get('PluginList'); + if (!is_array($oldset)) $oldset = array(); + $newset = isset($_REQUEST['PLUGINLIST']) ? $_REQUEST['PLUGINLIST'] : array(); + foreach($newset as $plugin_class){ + if (!Plugin::IsEnabled($plugin_class)){ + $obj = new $plugin_class(); + $obj->plugin_enable(); + } + } + foreach($oldset as $plugin_class){ + if (!in_array($plugin_class,$newset)){ + $obj = new $plugin_class(); + $obj->plugin_disable(); + } + } + $CORE_LOCAL->set('PluginList',$_REQUEST['PLUGINLIST'], True); +} +$type_check = $CORE_LOCAL->get('PluginList'); +if (!is_array($type_check)) $CORE_LOCAL->set('PluginList',array(), True); + +$mods = AutoLoader::ListModules('Plugin'); +sort($mods); + +foreach($mods as $m){ + $enabled = False; + $instance = new $m(); + foreach($CORE_LOCAL->get("PluginList") as $r){ + if ($r == $m){ + $enabled = True; + break; + } + } + echo '<tr><td colspan="2" style="height:1px;"><hr /></td></tr>'; + echo '<tr><td style="width:10em;"></td> + <td style="width:25em;">'."\n"; + echo '<fieldset class="toggle">'."\n"; + printf('<input name="PLUGINLIST[]" id="plugin_%s" type="checkbox" %s + value="%s" /><label onclick="" for="plugin_%s">%s</label>', + $m, ($enabled?'checked':''),$m, $m, $m); + echo "\n".'<span class="toggle-button"></span></fieldset>'."\n"; + printf('<span class="noteTxt">%s</span>',$instance->plugin_description); + echo '</td></tr>'."\n"; + + if ($enabled && empty($instance->plugin_settings)){ + echo '<tr><td colspan="2"><i>No settings required</i></td></tr>'; + } + else if ($enabled){ + foreach($instance->plugin_settings as $field => $info){ + echo '<tr><td colspan="2" style="margin-bottom: 0px; height:auto;">'; + $form_id = $m.'_'.$field; + if (isset($_REQUEST[$form_id])) + $CORE_LOCAL->set($field,$_REQUEST[$form_id],True); + if ($CORE_LOCAL->get($field) === "") + $CORE_LOCAL->set($field,isset($info['default'])?$info['default']:'',True); + echo '<b>'.(isset($info['label'])?$info['label']:$field).'</b>: '; + if (isset($info['options']) && is_array($info['options'])){ + printf('<select name="%s">',$form_id); + foreach($info['options'] as $label => $value){ + printf('<option %s value="%s">%s</option>', + ($CORE_LOCAL->get($field)==$value?'selected':''), + $value, $label); + } + echo '</select>'; + } + else { + printf('<input type="text" name="%s" value="%s" />', + $form_id,$CORE_LOCAL->get($field)); + } + if (isset($info['description'])) + echo '<span class="noteTxt">'.$info['description'].'</span>'; + confsave($field,"'".$CORE_LOCAL->get($field)."'"); + echo '</td></tr>'; + } + } + +} +echo '</table>'; + +$saveStr = "array("; +foreach($CORE_LOCAL->get("PluginList") as $r){ + $saveStr .= "'".$r."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confsave('PluginList',$saveStr); +?> +<hr /> +<input type=submit name=psubmit value="Save Changes" /> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/receipt.php b/pos/is4c-nf/install/receipt.php new file mode 100644 index 000000000..6d0dd8c6a --- /dev/null +++ b/pos/is4c-nf/install/receipt.php @@ -0,0 +1,142 @@ +<!DOCTYPE html> +<html> +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<head> +<title>IT CORE Lane Installation: Receipt Configuration</title> +<link rel="stylesheet" href="../css/toggle-switch.css" type="text/css" /> +<script type="text/javascript" src="../js/jquery.js"></script> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Receipt Configuration</h2> + +<div class="alert"><?php check_writeable('../ini.php'); ?></div> +<div class="alert"><?php check_writeable('../ini-local.php'); ?></div> + +<form action=receipt.php method=post> +<table id="install" border=0 cellspacing=0 cellpadding=4> +<tr><td colspan=2 class="tblHeader"> +<h3>Receipt Settings</h3></td></tr> +<tr><td style="width: 30%;"> +</td><td> +<?php +if (isset($_REQUEST['PRINT'])) $CORE_LOCAL->set('print',1,True); +elseif (isset($_REQUEST['esubmit'])) $CORE_LOCAL->set('print',0,True); +elseif ($CORE_LOCAL->get('print')==='') $CORE_LOCAL->set('print',0,True); +echo "<fieldset class='toggle'>\n<input type='checkbox' name='PRINT' id='printing'"; +if ($CORE_LOCAL->get("print") == 1) echo " checked"; +echo " />\n<label for='printing' onclick=''>Enable receipts: </label>\n + <span class='toggle-button'></span></fieldset>"; +confsave('print',$CORE_LOCAL->get("print")); +?> +</td></tr><tr><td> +<b>Use new receipt</b>: </td><td><select name=NEWRECEIPT> +<?php +if (isset($_REQUEST['NEWRECEIPT'])) $CORE_LOCAL->set('newReceipt',$_REQUEST['NEWRECEIPT'],True); +if ($CORE_LOCAL->get("newReceipt") == 2){ + echo "<option value=2 selected>PHP (even newer)</option>"; + echo "<option value=1>Yes</option>"; + echo "<option value=0>No</option>"; +} +elseif ($CORE_LOCAL->get("newReceipt") == 1){ + echo "<option value=2>PHP (even newer)</option>"; + echo "<option value=1 selected>Yes</option>"; + echo "<option value=0>No</option>"; +} +else { + echo "<option value=2>PHP (even newer)</option>"; + echo "<option value=1 >Yes</option>"; + echo "<option value=0 selected>No</option>"; +} +confsave('newReceipt',$CORE_LOCAL->get("newReceipt")); +?> +</select> +<span class='noteTxt'>The new receipt groups items by category; the old one just lists +them in order.</span></td></tr><tr><td> +<b>Email Receipt Sender</b>:</td><td> +<?php +if(isset($_REQUEST['emailReceiptFrom'])) $CORE_LOCAL->set('emailReceiptFrom',$_REQUEST['emailReceiptFrom'],True); +printf("<input type=text name=emailReceiptFrom value=\"%s\" />",$CORE_LOCAL->get('emailReceiptFrom')); +confsave('emailReceiptFrom',"'".$CORE_LOCAL->get('emailReceiptFrom')."'"); +?> +</td></tr> +<tr><td colspan="2"><h3>PHP Receipt Modules</h3></td></tr> +<tr><td><b>Data Fetch Mod</b>:</td> +<td><select name="RBFETCHDATA"> +<?php +if(isset($_REQUEST['RBFETCHDATA'])) $CORE_LOCAL->set('RBFetchData',$_REQUEST['RBFETCHDATA'],True); +if($CORE_LOCAL->get('RBFetchData')=='') $CORE_LOCAL->set('RBFetchData','DefaultReceiptDataFetch',True); +$mods = AutoLoader::ListModules('DefaultReceiptDataFetch',True); +sort($mods); +foreach($mods as $mod){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('RBFetchData') == $mod ? 'selected' : ''), + $mod + ); +} +confsave('RBFetchData',"'".$CORE_LOCAL->get('RBFetchData')."'"); +?> +</select></td></tr> +<tr><td><b>Filtering Mod</b>:</td> +<td><select name="RBFILTER"> +<?php +if(isset($_REQUEST['RBFILTER'])) $CORE_LOCAL->set('RBFilter',$_REQUEST['RBFILTER'],True); +if($CORE_LOCAL->get('RBFilter')=='') $CORE_LOCAL->set('RBFilter','DefaultReceiptFilter',True); +$mods = AutoLoader::ListModules('DefaultReceiptFilter',True); +sort($mods); +foreach($mods as $mod){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('RBFilter') == $mod ? 'selected' : ''), + $mod + ); +} +confsave('RBFilter',"'".$CORE_LOCAL->get('RBFilter')."'"); +?> +</select></td></tr> +<tr><td><b>Sorting Mod</b>:</td> +<td><select name="RBSORT"> +<?php +if(isset($_REQUEST['RBSORT'])) $CORE_LOCAL->set('RBSort',$_REQUEST['RBSORT'],True); +if($CORE_LOCAL->get('RBSort')=='') $CORE_LOCAL->set('RBSort','DefaultReceiptSort',True); +$mods = AutoLoader::ListModules('DefaultReceiptSort',True); +sort($mods); +foreach($mods as $mod){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('RBSort') == $mod ? 'selected' : ''), + $mod + ); +} +confsave('RBSort',"'".$CORE_LOCAL->get('RBSort')."'"); +?> +</select></td></tr> +<tr><td><b>Tagging Mod</b>:</td> +<td><select name="RBTAG"> +<?php +if(isset($_REQUEST['RBTAG'])) $CORE_LOCAL->set('RBTag',$_REQUEST['RBTAG'],True); +if($CORE_LOCAL->get('RBTag')=='') $CORE_LOCAL->set('RBTag','DefaultReceiptTag',True); +$mods = AutoLoader::ListModules('DefaultReceiptTag',True); +sort($mods); +foreach($mods as $mod){ + printf('<option %s>%s</option>', + ($CORE_LOCAL->get('RBTag') == $mod ? 'selected' : ''), + $mod + ); +} +confsave('RBTag',"'".$CORE_LOCAL->get('RBTag')."'"); +?> +</select></td></tr> +<tr><td style="width: 30%;"> +<tr><td colspan=2 class="submitBtn"> +<input type=submit name=esubmit value="Save Changes" /> +</td></tr> +</table> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/scanning.php b/pos/is4c-nf/install/scanning.php new file mode 100644 index 000000000..f665ade3a --- /dev/null +++ b/pos/is4c-nf/install/scanning.php @@ -0,0 +1,229 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>IT CORE Lane Installation: Scanning options</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Scanning Options</h2> + +<div class="alert"><?php check_writeable('../ini.php', False, 'PHP'); ?></div> +<div class="alert"><?php check_writeable('../ini-local.php', True, 'PHP'); ?></div> + +<form action=scanning.php method=post> +<table id="install" border=0 cellspacing=0 cellpadding=4> +<tr><td style="width:30%;"> +<b>Special UPCs</b>:<br /> +<p>Special handling modules for UPCs that aren't products (e.g., coupons)</p> +</td><td> +<select multiple size=10 name=SPECIAL_UPC_MODS[]> +<?php +if (isset($_REQUEST['SPECIAL_UPC_MODS'])) $CORE_LOCAL->set('SpecialUpcClasses',$_REQUEST['SPECIAL_UPC_MODS'],True); + +$mods = AutoLoader::ListModules('SpecialUPC'); + +foreach($mods as $m){ + $selected = ""; + foreach($CORE_LOCAL->get("SpecialUpcClasses") as $r){ + if ($r == $m){ + $selected = "selected"; + break; + } + } + echo "<option $selected>$m</option>"; +} + +$saveStr = "array("; +foreach($CORE_LOCAL->get("SpecialUpcClasses") as $r){ + $saveStr .= "'".$r."',"; +} +$saveStr = rtrim($saveStr,",").")"; +confsave('SpecialUpcClasses',$saveStr); +?> +</select></td></tr> +<tr><td style="width: 30%;"> +</td><td> +</td></tr><tr><td> +<b>Coupons &amp; Sales Tax</b>:</td><td> +<?php +if (isset($_REQUEST['COUPONTAX'])) $CORE_LOCAL->set('CouponsAreTaxable',$_REQUEST['COUPONTAX'],True); +echo '<select name="COUPONTAX">'; +if ($CORE_LOCAL->get('CouponsAreTaxable') === 0){ + echo '<option value="1">Tax pre-coupon total</option>'; + echo '<option value="0" selected>Tax post-coupon total</option>'; +} +else { + echo '<option value="1" selected>Tax pre-coupon total</option>'; + echo '<option value="0">Tax post-coupon total</option>'; + $CORE_LOCAL->set('CouponsAreTaxable', 1); +} +echo '</select>'; +confsave('CouponsAreTaxable',$CORE_LOCAL->get('CouponsAreTaxable')); +?> +<span class='noteTxt'>Apply sales tax based on item price before any coupons, or +apply sales tax to item price inclusive of coupons.</span> +</td></tr> +<hr /> +<p>Discount type modules control how sale prices are calculated.</p></td></tr> +<tr><td> +<b>Number of Discounts</b>:</td><td> +<?php +if (isset($_REQUEST['DT_COUNT']) && is_numeric($_REQUEST['DT_COUNT'])) $CORE_LOCAL->set('DiscountTypeCount',$_REQUEST['DT_COUNT'],True); +if ($CORE_LOCAL->get("DiscountTypeCount") == "") $CORE_LOCAL->set("DiscountTypeCount",5,True); +if ($CORE_LOCAL->get("DiscountTypeCount") <= 0) $CORE_LOCAL->set("DiscountTypeCount",1,True); +printf("<input type=text size=4 name=DT_COUNT value=\"%d\" />", + $CORE_LOCAL->get('DiscountTypeCount')); +confsave('DiscountTypeCount',$CORE_LOCAL->get('DiscountTypeCount')); +?></td></tr><tr><td> +<b>Discount Module Mapping</b>:</td><td> +<?php +if (isset($_REQUEST['DT_MODS'])) $CORE_LOCAL->set('DiscountTypeClasses',$_REQUEST['DT_MODS'],True); +if (!is_array($CORE_LOCAL->get('DiscountTypeClasses'))){ + $CORE_LOCAL->set('DiscountTypeClasses', + array( + 'NormalPricing', + 'EveryoneSale', + 'MemberSale', + 'CaseDiscount', + 'StaffSale' + ),True); +} +$discounts = AutoLoader::ListModules('DiscountType'); +$dt_conf = $CORE_LOCAL->get("DiscountTypeClasses"); +for($i=0;$i<$CORE_LOCAL->get('DiscountTypeCount');$i++){ + echo "[$i] => "; + echo "<select name=DT_MODS[]>"; + foreach($discounts as $d) { + echo "<option"; + if (isset($dt_conf[$i]) && $dt_conf[$i] == $d) + echo " selected"; + echo ">$d</option>"; + } + echo "</select><br />"; +} +$saveStr = "array("; +$tmp_count = 0; +foreach($CORE_LOCAL->get("DiscountTypeClasses") as $r){ + $saveStr .= "'".$r."',"; + if ($tmp_count == $CORE_LOCAL->get("DiscountTypeCount")-1) + break; + $tmp_count++; +} +$saveStr = rtrim($saveStr,",").")"; +confsave('DiscountTypeClasses',$saveStr); +?></td></tr><tr><td colspan=2> +<hr /> <p>Price Methods dictate how item prices are calculated. + There's some overlap with Discount Types, but <i>generally</i> + price methods deal with grouped items.</p></td></tr> +<tr><td> +<b>Number of Price Methods</b>:</td><td> +<?php +if (isset($_REQUEST['PM_COUNT']) && is_numeric($_REQUEST['PM_COUNT'])) $CORE_LOCAL->set('PriceMethodCount',$_REQUEST['PM_COUNT'],True); +if ($CORE_LOCAL->get("PriceMethodCount") == "") $CORE_LOCAL->set("PriceMethodCount",3,True); +if ($CORE_LOCAL->get("PriceMethodCount") <= 0) $CORE_LOCAL->set("PriceMethodCount",1,True); +printf("<input type=text size=4 name=PM_COUNT value=\"%d\" />", + $CORE_LOCAL->get('PriceMethodCount')); +confsave('PriceMethodCount',$CORE_LOCAL->get('PriceMethodCount')); +?> +</td></tr><tr><td> +<b>Price Method Mapping</b>:</td><td> +<?php +if (isset($_REQUEST['PM_MODS'])) $CORE_LOCAL->set('PriceMethodClasses',$_REQUEST['PM_MODS'],True); +if (!is_array($CORE_LOCAL->get('PriceMethodClasses'))){ + $CORE_LOCAL->set('PriceMethodClasses', + array( + 'BasicPM', + 'GroupPM', + 'QttyEnforcedGroupPM' + ),True); +} +$pms = AutoLoader::ListModules('PriceMethod'); +$pm_conf = $CORE_LOCAL->get("PriceMethodClasses"); +for($i=0;$i<$CORE_LOCAL->get('PriceMethodCount');$i++){ + echo "[$i] => "; + echo "<select name=PM_MODS[]>"; + foreach($pms as $p) { + echo "<option"; + if (isset($pm_conf[$i]) && $pm_conf[$i] == $p) + echo " selected"; + echo ">$p</option>"; + } + echo "</select><br />"; +} +$saveStr = "array("; +$tmp_count = 0; +foreach($CORE_LOCAL->get("PriceMethodClasses") as $r){ + $saveStr .= "'".$r."',"; + if ($tmp_count == $CORE_LOCAL->get("PriceMethodCount")-1) + break; + $tmp_count++; +} +$saveStr = rtrim($saveStr,",").")"; +confsave('PriceMethodClasses',$saveStr); +?></td></tr><tr><td colspan=2> +<hr /> <p>Special Department modules add extra steps to open rings in specific departments. + Enter department number(s) that each module should apply to.</p> +</td></tr> +<tr><td> +<?php +$sdepts = AutoLoader::ListModules('SpecialDept'); +$sconf = $CORE_LOCAL->get('SpecialDeptMap'); +if (!is_array($sconf)) $sconf = array(); +if (isset($_REQUEST['SDEPT_MAP_LIST'])){ + $sconf = array(); + for($i=0;$i<count($_REQUEST['SDEPT_MAP_NAME']);$i++){ + if (!isset($_REQUEST['SDEPT_MAP_LIST'][$i])) continue; + if (empty($_REQUEST['SDEPT_MAP_LIST'][$i])) continue; + + $class = $_REQUEST['SDEPT_MAP_NAME'][$i]; + $obj = new $class(); + $ids = preg_split('/\D+/',$_REQUEST['SDEPT_MAP_LIST'][$i]); + foreach($ids as $id) + $sconf = $obj->register($id,$sconf); + } + $CORE_LOCAL->set('SpecialDeptMap',$sconf,True); +} +foreach($sdepts as $sd){ + $list = ""; + foreach($sconf as $id => $mods){ + if (in_array($sd,$mods)) + $list .= $id.', '; + } + $list = rtrim($list,', '); + printf('<tr><td>%s</td><td> + <input type="text" name="SDEPT_MAP_LIST[]" value="%s" /> + <input type="hidden" name="SDEPT_MAP_NAME[]" value="%s" /> + </td></tr>', + $sd,$list,$sd); +} +$saveStr = 'array('; +foreach($sconf as $id => $mods){ + if (empty($mods)) continue; + $saveStr .= $id.'=>array('; + foreach($mods as $m) + $saveStr .= '\''.$m.'\','; + $saveStr = rtrim($saveStr,',').'),'; +} +$saveStr = rtrim($saveStr,',').')'; +confsave('SpecialDeptMap',$saveStr); +?> +</td></tr> +<tr><td colspan=2> +<hr /> +<input type=submit name=scansubmit value="Save Changes" /> +</td></tr></table> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/security.php b/pos/is4c-nf/install/security.php new file mode 100644 index 000000000..9361f628c --- /dev/null +++ b/pos/is4c-nf/install/security.php @@ -0,0 +1,81 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); +?> +<html> +<head> +<title>Security configuration options</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +<?php include('tabs.php'); ?> +<div id="wrapper"> +<h2>IT CORE Lane Installation: Security</h2> +<form action=security.php method=post> +<table id="install" border=0 cellspacing=0 cellpadding=4><tr><td> +<b>Cancel Transaction</b>: </td><td><select name=PRIV_CANCEL> +<?php +if(isset($_REQUEST['PRIV_CANCEL'])) $CORE_LOCAL->set('SecurityCancel',$_REQUEST['PRIV_CANCEL'],True); +if ($CORE_LOCAL->get("SecurityCancel")=="") $CORE_LOCAL->set("SecurityCancel",20,True); +if ($CORE_LOCAL->get("SecurityCancel") == 30){ + echo "<option value=30 selected>Admin only</option>"; + echo "<option value=20>All</option>"; +} +else { + echo "<option value=30 >Admin only</option>"; + echo "<option value=20 selected>All</option>"; +} +confsave('SecurityCancel',$CORE_LOCAL->get("SecurityCancel")); +?> +</select></td></tr><tr><td> +<b>Suspend/Resume</b>: </td><td><select name=PRIV_SR> +<?php +if(isset($_REQUEST['PRIV_SR'])) $CORE_LOCAL->set('SecuritySR',$_REQUEST['PRIV_SR'],True); +if ($CORE_LOCAL->get("SecuritySR")=="") $CORE_LOCAL->set("SecuritySR",20,True); +if ($CORE_LOCAL->get("SecuritySR") == 30){ + echo "<option value=30 selected>Admin only</option>"; + echo "<option value=20>All</option>"; +} +else { + echo "<option value=30 >Admin only</option>"; + echo "<option value=20 selected>All</option>"; +} +confsave('SecuritySR',$CORE_LOCAL->get("SecuritySR")); +?> +</select></td></tr><tr><td> +<b>Refund Item</b>: </td><td><select name=PRIV_REFUND> +<?php +if(isset($_REQUEST['PRIV_REFUND'])) $CORE_LOCAL->set('SecurityRefund',$_REQUEST['PRIV_REFUND'],True); +if ($CORE_LOCAL->get("SecurityRefund")=="") $CORE_LOCAL->set("SecurityRefund",20,True); +if ($CORE_LOCAL->get("SecurityRefund") == 30){ + echo "<option value=30 selected>Admin only</option>"; + echo "<option value=20>All</option>"; +} +else { + echo "<option value=30 >Admin only</option>"; + echo "<option value=20 selected>All</option>"; +} +confsave('SecurityRefund',$CORE_LOCAL->get("SecurityRefund")); +?> +</select></td></tr><tr><td> +<b>Void Limit</b>:</td><td> +<?php +if (isset($_REQUEST['VOIDLIMIT'])) $CORE_LOCAL->set('VoidLimit',$_REQUEST['VOIDLIMIT'],True); +if ($CORE_LOCAL->get("VoidLimit")=="") $CORE_LOCAL->set("VoidLimit",0,True); +printf("<input type=text name=VOIDLIMIT value=\"%s\" />",$CORE_LOCAL->get('VoidLimit')); +confsave('VoidLimit',"'".$CORE_LOCAL->get('VoidLimit')."'"); +?> (in dollars, per transaction. Zero for unlimited). +</td></tr><tr><td colspan=2> +<hr /> +<input type=submit name=secsubmit value="Save Changes" /> +</td></tr></table> +</form> +</div> <!-- wrapper --> +</body> +</html> diff --git a/pos/is4c-nf/install/sql/op/couponcodes.php b/pos/is4c-nf/install/sql/op/couponcodes.php new file mode 100644 index 000000000..0e2f45c44 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/couponcodes.php @@ -0,0 +1,26 @@ +<?php +/* +Table: couponcodes + +Columns: + Code varchar + Qty int + Value currency + +Depends on: + none + +Use: +Standard UPC coupon codes. Code is the UPC suffix, +Qty is required quantity, value is the coupon's value. +*/ +$CREATE['op.couponcodes'] = " + CREATE TABLE couponcodes ( + Code varchar(4), + Qty int, + Value real, + PRIMARY KeY (Code) + ) +"; + +?> diff --git a/pos/is4c-nf/install/sql/op/custPreferences.php b/pos/is4c-nf/install/sql/op/custPreferences.php new file mode 100644 index 000000000..529880d0f --- /dev/null +++ b/pos/is4c-nf/install/sql/op/custPreferences.php @@ -0,0 +1,27 @@ +<?php +/* +Table: custPreferences + +Columns: + card_no int + pref_key varchar + pref_value varchar + +Depends on: + custdata (table) + custAvailablePrefs (table) + +Use: +Store customer-specific preferences +This table supplements custdata and is +available at the lanes. +*/ +$CREATE['op.custPreferences'] = " + CREATE TABLE custPreferences ( + card_no int, + pref_key varchar(50), + pref_value varchar(100), + PRIMARY KEY (card_no, pref_key) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/custReceiptMessage.php b/pos/is4c-nf/install/sql/op/custReceiptMessage.php new file mode 100644 index 000000000..c08f0c96b --- /dev/null +++ b/pos/is4c-nf/install/sql/op/custReceiptMessage.php @@ -0,0 +1,34 @@ +<?php +/* +Table: custReceiptMessage + +Columns: + card_no int + msg_text varchar + modifier_module varchar + +Depends on: + custdata (table) + +Use: +Create member-specific messages for +receipts. + +- card_no is the member number +- msg_text is the message itself +- modifier_module is [optionally] the name + of a class that should be invoked + to potentially modify the message. + An equity message, for example, might + use a modifier module to check and see + if payment was made in the current + transaction +*/ +$CREATE['op.custReceiptMessage'] = " + CREATE TABLE custReceiptMessage ( + card_no int, + msg_text varchar(255), + modifier_module varchar(50) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/custdata.php b/pos/is4c-nf/install/sql/op/custdata.php new file mode 100644 index 000000000..967887c7d --- /dev/null +++ b/pos/is4c-nf/install/sql/op/custdata.php @@ -0,0 +1,161 @@ +<?php +/* +Table: custdata + +Columns: + CardNo int + personNum tinyint + LastName varchar + FirstName varchar + CashBack double + Balance double + Discount smallint + MemDiscountLimit double + ChargeOk tinyint + WriteChecks tinyint + StoreCoupons tinyint + Type varchar + memType + staff + SSI + Purchases + NumberOfChecks + memCoupons + blueLine + Shown + LastChange + id int (auto increment) + +Depends on: + memtype + +Use: +This is one of two "primary" tables dealing with membership +(the other is meminfo). Of the two, only custdata is present +at the checkout. Column meaning may not be quite identical +across stores. + +[Probably] The Same Everywhere: +- CardNo is the member's number. This identifies them. +- personNum is for stores that allow more than one person per membership. + personNum starts at 1. + The combination (CardNo, personNum) should be unique for each record. +- FirstName what it sounds like. +- LastName what it sounds like. +- Discount gives the member a percentage discount on purchases. +- Type identifies whether the record is for an actual member. + If Type is 'PC', the person is considered a member at the register. + This is a little confusing, but not everyone in the table has to be + a member. +- blueLine is displayed on the checkout screen when the member's number is entered. +- id just provides a guaranteed-unique row identifier. + +[Probably] Just For Organizing: +The register is mostly unaware of these settings, +but they can be used on the backend for consistency checks +e.g., make sure all staff members have the appropriate percent discount +- staff identifies someone as an employee. Value: 1? +- memType allows a little more nuance than just member yes/no. + FK to memtype.memtype +- SSI probably because of a historic senior citizen discount. + (Sounds like it is obsolete or at least not used.) + +WFC Specific: +- ChargeOk=1 if member may run a store charge balance; =0 may not. +- MemDiscountLimit is their store charge account limit. +- Balance is a store charge balance as of the start of the day, + if the person has one. + Some records are for organizations, esp vendors, + that have charge accounts. + Is updated from newBalanceToday_cust by cronjob arbalance.sanitycheck.php +- memCoupons indicates how many virtual coupons (tender MA) are available. + +[Probably] Ignored: +To the best of my (Andy's) knowledge, these have no meaning on the front or back end. +- CashBack +- WriteChecks +- StoreCoupons +- Purchases +- NumberOfChecks +- Shown + +Maintenance: +- Single edit: fannie/mem/search.php +- Single add: fannie/mem/new.php +- Batch import: fannie/mem/import/*.php +- custdata.Balance is updated from newBalanceToday_cust by cronjob arbalance.sanitycheck.php + +*/ +/*--COMMENTS - - - - - - - - - - - - - - - - - - - - + + * 12Dec12 EL Field LastChange + * MSSQL will probably need support like described at: + * http://www.dociletree.co.za/mssql-and-on-update/ + * 22Oct12 EL Comment about cron update of Balance. + * EL Comment about ChargeOK + * EL Maintenance section in comments. + * 26Jun12 Eric Lee Reformatted Use section + * epoch AT Original notes by Andy Theuninck. + +*/ +$CREATE['op.custdata'] = " + CREATE TABLE `custdata` ( + `CardNo` int(11) default NULL, + `personNum` tinyint(4) NOT NULL default '1', + `LastName` varchar(30) default NULL, + `FirstName` varchar(30) default NULL, + `CashBack` double NOT NULL default '60', + `Balance` double NOT NULL default '0', + `Discount` smallint(6) default NULL, + `MemDiscountLimit` double NOT NULL default '0', + `ChargeOk` tinyint(4) NOT NULL default '1', + `WriteChecks` tinyint(4) NOT NULL default '1', + `StoreCoupons` tinyint(4) NOT NULL default '1', + `Type` varchar(10) NOT NULL default 'pc', + `memType` tinyint(4) default NULL, + `staff` tinyint(4) NOT NULL default '0', + `SSI` tinyint(4) NOT NULL default '0', + `Purchases` double NOT NULL default '0', + `NumberOfChecks` smallint(6) NOT NULL default '0', + `memCoupons` int(11) NOT NULL default '1', + `blueLine` varchar(50) default NULL, + `Shown` tinyint(4) NOT NULL default '1', + `LastChange` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + `id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `CardNo` (`CardNo`), + KEY `LastName` (`LastName`), + KEY `LastChange` (`LastChange`) + ) +"; + +if ($dbms == "MSSQL"){ + $CREATE['op.custdata'] = " + CREATE TABLE [custdata] ( + [CardNo] [varchar] (25) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [personNum] [varchar] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [LastName] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [FirstName] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [CashBack] [money] NULL , + [Balance] [money] NULL , + [Discount] [smallint] NULL , + [MemDiscountLimit] [money] NULL , + [ChargeOk] [bit] NULL , + [WriteChecks] [bit] NULL , + [StoreCoupons] [bit] NULL , + [Type] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [memType] [smallint] NULL , + [staff] [tinyint] NULL , + [SSI] [tinyint] NULL , + [Purchases] [money] NULL , + [NumberOfChecks] [smallint] NULL , + [memCoupons] [int] NULL , + [blueLine] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [Shown] [tinyint] NULL , + [LastChange] [datetime] NULL , + [id] [int] IDENTITY (1, 1) NOT NULL + ) ON [PRIMARY] + "; +} + +?> diff --git a/pos/is4c-nf/install/sql/op/customReceipt.php b/pos/is4c-nf/install/sql/op/customReceipt.php new file mode 100644 index 000000000..3df873126 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/customReceipt.php @@ -0,0 +1,39 @@ +<?php +/* +Table: customReceipt + +Columns: + text varchar + seq int + type varchar + +Depends on: + none + +Use: +This table contains strings of text +that originally lived in the lane's +ini.php. At first it was only used +for receipt headers and footers, hence +the name. Submit a patch if you want +a saner name. + +Current valid types are: +receiptHeader +receiptFooter +ckEndorse +welcomeMsg +farewellMsg +trainingMsg +chargeSlip + +*/ +$CREATE['op.customReceipt'] = " + CREATE TABLE customReceipt ( + text varchar(80), + seq int, + type varchar(20), + PRIMARY KEY (seq, type) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/dateRestrict.php b/pos/is4c-nf/install/sql/op/dateRestrict.php new file mode 100644 index 000000000..140347d74 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/dateRestrict.php @@ -0,0 +1,36 @@ +<?php +/* +Table: dateRestrict + +Columns: + upc varchar + dept_ID int + restrict_date date + restrict_dow smallint + restrict_start time + restrict_end time + +Depends on: + products (table) + departments (table) +Use: +Store restrictions for selling products at +certain dates & times. Restrictions can be specified +by UPC or department number as well as by +exact date or day of week. If start and end +times are entered, restriction will only apply +during that span +*/ +$CREATE['op.dateRestrict'] = " + CREATE TABLE dateRestrict ( + upc varchar(13), + dept_ID int, + restrict_date date default null, + restrict_dow smallint default null, + restrict_start time default null, + restrict_end time default null, + INDEX (upc), + INDEX (dept_ID) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/departments.php b/pos/is4c-nf/install/sql/op/departments.php new file mode 100644 index 000000000..5a7f04f9b --- /dev/null +++ b/pos/is4c-nf/install/sql/op/departments.php @@ -0,0 +1,69 @@ +<?php +/* +Table: departments + +Columns: + dept_no smallint + dept_name varchar + dept_tax tinyint + dept_fs tinyint + dept_limit dbms currency + dept_minimum dbms currency + dept_discount tinyint + modified datetime + modifiedby int + +Depends on: + none + +Use: +Departments are the primary level of granularity +for products. Each product may belong to one department, +and when items are rung up the department setting +is what's saved in the transaction log + +dept_no and dept_name identify a department + +dept_tax,dept_fs, and dept_discount indicate whether +items in that department are taxable, foodstampable, +and discountable (respectively). Mostly these affect +open rings at the register, although WFC also uses +them to speed up new item entry. + +dept_limit and dept_minimum are the highest and lowest +sales allowed in the department. These also affect open +rings. The prompt presented if limits are exceeded is +ONLY a warning, not a full stop. +*/ + +$CREATE['op.departments'] = " + CREATE TABLE `departments` ( + `dept_no` smallint(6) default NULL, + `dept_name` varchar(30) default NULL, + `dept_tax` tinyint(4) default NULL, + `dept_fs` tinyint(4) default NULL, + `dept_limit` double default NULL, + `dept_minimum` double default NULL, + `dept_discount` tinyint(4) default NULL, + `modified` datetime default NULL, + `modifiedby` int(11) default NULL, + PRIMARY KEY (`dept_no`), + KEY `dept_name` (`dept_name`) + ); +"; +if ($dbms == "MSSQL"){ + $CREATE['op.departments'] = " + CREATE TABLE [departments] ( + [dept_no] [smallint] NULL , + [dept_name] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [dept_tax] [tinyint] NULL , + [dept_fs] [bit] NOT NULL , + [dept_limit] [money] NULL , + [dept_minimum] [money] NULL , + [dept_discount] [smallint] NULL , + [modified] [smalldatetime] NULL , + [modifiedby] [int] NULL + )"; +} + +?> diff --git a/pos/is4c-nf/install/sql/op/disableCoupon.php b/pos/is4c-nf/install/sql/op/disableCoupon.php new file mode 100644 index 000000000..4cc1a59ef --- /dev/null +++ b/pos/is4c-nf/install/sql/op/disableCoupon.php @@ -0,0 +1,23 @@ +<?php +/* +Table: disableCoupon + +Columns: + upc varchar + reason text + +Depends on: + none + +Use: +Manually disable a specific manufacturer coupon UPC +*/ +$CREATE['op.disableCoupon'] = " + CREATE TABLE disableCoupon ( + upc varchar(13), + reason text, + primary key (upc) + ) +"; + +?> diff --git a/pos/is4c-nf/install/sql/op/drawerowner.php b/pos/is4c-nf/install/sql/op/drawerowner.php new file mode 100644 index 000000000..9efe81fec --- /dev/null +++ b/pos/is4c-nf/install/sql/op/drawerowner.php @@ -0,0 +1,24 @@ +<?php +/* +Table: drawerowner + +Columns: + drawer_no int + emp_no int + +Depends on: + employees (table) + +Use: +Manage assignments when more than one +cash drawer is present. +*/ +$CREATE['op.drawerowner'] = " + CREATE TABLE drawerowner ( + drawer_no tinyint, + emp_no smallint, + PRIMARY KEY (drawer_no) + ) +"; + +?> diff --git a/pos/is4c-nf/install/sql/op/employees.php b/pos/is4c-nf/install/sql/op/employees.php new file mode 100644 index 000000000..0c34bc09b --- /dev/null +++ b/pos/is4c-nf/install/sql/op/employees.php @@ -0,0 +1,45 @@ +<?php +/* +Table: employees + +Columns: + emp_no int + CashierPassword int + AdminPassword int + FirstName varchar + LastName varchar + JobTitle varchar + EmpActive int + frontendsecurity int + backendsecurity int + birthdate datetime + + +Depends on: + none + +Use: +Table of cashiers. emp_no identifies +a cashier uniquely. CashierPassword and +AdminPassword are numeric passcodes used +pretty interchangably (should probably match). +EmpActive toggles whether an account can +actually log in. frontendsecurity is used +to restrict certain actions at the register +based on security level. +*/ +$CREATE['op.employees'] = " + CREATE TABLE employees ( + emp_no smallint, + CashierPassword int, + AdminPassword int, + FirstName varchar(255), + LastName varchar(255), + JobTitle varchar(255), + EmpActive tinyint, + frontendsecurity smallint, + backendsecurity smallint, + birthdate datetime, + PRIMARY KEY (emp_no)) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/globalvalues.php b/pos/is4c-nf/install/sql/op/globalvalues.php new file mode 100644 index 000000000..1cdbaae33 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/globalvalues.php @@ -0,0 +1,35 @@ +<?php +/* +Table: globalvalues + +Columns: + CashierNo int + Cashier varchar + LoggedIn int + TransNo int + TTLFlag int + FntlFlag int + TaxExempt int + +Depends on: + none + +Use: +A small subset of session values. Storing this +in SQL ensures it will survive a browser crash +or reboot to pick up more-or-less when the transaction +left off. +*/ +$CREATE['op.globalvalues'] = " + CREATE TABLE globalvalues ( + CashierNo int, + Cashier varchar(30), + LoggedIn tinyint, + TransNo int, + TTLFlag tinyint, + FntlFlag tinyint, + TaxExempt tinyint + ) +"; + +?> diff --git a/pos/is4c-nf/install/sql/op/houseCouponItems.php b/pos/is4c-nf/install/sql/op/houseCouponItems.php new file mode 100644 index 000000000..a5c62c200 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/houseCouponItems.php @@ -0,0 +1,29 @@ +<?php +/* +Table: houseCouponItems + +Columns: + coupID int + upc varchar + type varchar + +Depends on: + houseCoupons + +Use: +WFC runs custom barcoded coupons with +upc prefix 499999. See houseCoupons for +more detail. Type here should be 'QUALIFIER', +'DISCOUNT', or 'BOTH'. +*/ +$CREATE['op.houseCouponItems'] = " + CREATE TABLE houseCouponItems ( + coupID int, + upc varchar(13), + type varchar(15), + PRIMARY KEY (coupID,upc), + INDEX (coupID), + INDEX (upc) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/houseCoupons.php b/pos/is4c-nf/install/sql/op/houseCoupons.php new file mode 100644 index 000000000..e22d4fbf7 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/houseCoupons.php @@ -0,0 +1,118 @@ +<?php +/* +Table: houseCoupons + +Columns: + coupID int + endDate datetime + limit smallint + memberOnly smallint + discountType varchar + discountValue double + minType varchar + minValue double + department int + +Depends on: + houseCouponItems + +Use: +WFC runs custom barcoded coupons with +upc prefix 499999, then the coupon ID +(zero padded to 5 digits). There's a +tool in legacy for putting these together +that may eventually make it into fannie. + +endDate is the last day the coupon is valid + +limit is the number of times the coupon can be +used in one transaction + +memberOnly means the coupon can only be used +by a member (custdata.Type='PC') + +minType and minValue specify how one +qualifies for the coupon - certain item(s), +purchase amount, etc + +* 'Q' must purchase at least minValue + qualifying items (by quantity) +* 'Q+' must purchase more than minValue + qualifying items (by quantity) +* 'D' must purchase at least minValue + items from qualifying departments + (by $ value) +* 'D+' must purchase more than minValue + items from qualifying departments + (by $ value) +* 'M' is mixed. Must purchase at least + minValue qualifying items and at least + one discount item +* '$' must puchase at least minValue + goods (by $ value) +* '$+' must puchase more than minValue + goods (by $ value) +* '' blank means no minimum purchase + +discountType and discountValue specify +how the discount is calculated + +(item related discounts) +* 'Q' discount equals discountValue times + unitPrice for the cheapest qualifying + item (essentially percent discount) +* 'P' discount equals unitPrice minus + discountValue for the cheapest qualifying + item (essentially an sale price) +* 'FI' discount equals discountValues times + quantity for the cheapest qualifying item + (works with by-weight items) + +(department related discounts) +* 'FD' discount equals discountValue times + quantity for the cheapest qualifying item +* 'AD' discount equals discountValue times + sum(quantity) for ALL qualifying items + +(other discounts) +* 'F' discount equals discountValue +* '%' discountValue is a percent discount for + all discountable items + +Qualifying items are stored in houseCouponItems. Not +all coupons require entries here. Records can be +items (by UPC) or departments (by department number). +Some minimum and discount types only work with one +or the other. + +houseCouponItems.coupID is the coupon ID + +houseCouponItems.upc is an item UPC or a department number. + +houseCouponItems.type is only relevant to the mixed (M) +minimum type. Values are: +* 'QUALIFIER' counts as a qualifying item for mixed +* 'DISCOUNT' counts as a discount item for mixed +* 'BOTH' can be a qualfying item or a discount item +If not using the mixed minimum, always choose 'BOTH' + +The nuts and bolts of this are in +the UPC.php parser module (IT CORE). +*/ +$CREATE['op.houseCoupons'] = " + CREATE TABLE houseCoupons ( + coupID int, + endDate datetime, + `limit` smallint, + memberOnly smallint, + discountType varchar(2), + discountValue double, + minType varchar(2), + minValue double, + department int, + PRIMARY KEY (coupID) + ) +"; +if ($dbms == "MSSQL") + $CREATE['op.houseCoupons'] = str_replace("`","",$CREATE['op.houseCoupons']); +?> diff --git a/pos/is4c-nf/install/sql/op/houseVirtualCoupons.php b/pos/is4c-nf/install/sql/op/houseVirtualCoupons.php new file mode 100644 index 000000000..5caf02a43 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/houseVirtualCoupons.php @@ -0,0 +1,31 @@ +<?php +/* +Table: houseVirtualCoupons + +Columns: + card_no int + coupID int + description varchar + start_date datetime + end_date datetime + +Depends on: + houseCoupons + houseCouponItems + +Use: +Assign house coupons to members so +they can be applied without scanning +a barcode +*/ +$CREATE['op.houseVirtualCoupons'] = " + CREATE TABLE houseVirtualCoupons ( + card_no int, + coupID int, + description varchar(100), + start_date datetime, + end_date datetime, + PRIMARY KEY (coupID, card_no) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/lane_config.php b/pos/is4c-nf/install/sql/op/lane_config.php new file mode 100644 index 000000000..98ec02e34 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/lane_config.php @@ -0,0 +1,25 @@ +<?php +/* +Table: lane_config + +Columns: + keycode varchar + value varchar + modified datetime + +Depends on: + none + +Use: +Store settings for lane ini.php +globally +*/ +$CREATE['op.lane_config'] = " + CREATE TABLE lane_config ( + keycode varchar(255), + value varchar(255), + modified datetime, + PRIMARY KEY (keycode) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/memberCards.php b/pos/is4c-nf/install/sql/op/memberCards.php new file mode 100644 index 000000000..789434d96 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/memberCards.php @@ -0,0 +1,24 @@ +<?php +/* +Table: memberCards + +Columns: + card_no int + upc varchar + +Depends on: + custdata (table) + +Use: +WFC has barcoded member identification cards. +card_no is the member, upc is their card. +*/ +$CREATE['op.memberCards'] = " + CREATE TABLE memberCards ( + card_no int, + upc varchar(13), + PRIMARY KEY(card_no), + INDEX(upc) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/memchargebalance.php b/pos/is4c-nf/install/sql/op/memchargebalance.php new file mode 100644 index 000000000..85f05a009 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/memchargebalance.php @@ -0,0 +1,27 @@ +<?php +/* +Table: memchargebalance + +Columns: + CardNo int + availBal currency + balance currency + +Depends on: + custdata (Table) + +Use: +View showing member charge balance. Authoritative, +up-to-the-second data is on the server but a local +lookup is faster if slightly stale data is acceptable. +*/ +$CREATE['op.memchargebalance'] = " + CREATE view memchargebalance as + SELECT + c.CardNo, + c.memDiscountLimit - c.Balance AS availBal, + c.Balance as balance + FROM custdata AS c WHERE personNum = 1 +"; + +?> diff --git a/pos/is4c-nf/install/sql/op/products.php b/pos/is4c-nf/install/sql/op/products.php new file mode 100644 index 000000000..a71ebb7ab --- /dev/null +++ b/pos/is4c-nf/install/sql/op/products.php @@ -0,0 +1,227 @@ +<?php +/* +Table: products + +Columns: + upc int or varchar, dbms dependent + description varchar + normal_price double + pricemethod smallint + groupprice double + quantity smallint + special_price double + specialpricemethod smallint + specialgroupprice double + specialquantity smallint + start_date datetime + end_date datetime + department smallint + size varchar + tax smallint + foodstamp tinyint + scale tinyint + scaleprice tinyint + mixmatchcode varchar + modified datetime + advertised tinyint + tareweight double + discount smallint + discounttype tinyint + unitofmeasure varchar + wicable tinyint + qttyEnforced tinyint + idEnforced tinyint + cost double + inUse tinyint + numflag int + subdept smallint + deposit double + local tinyint + store_id smallint + id int auto_increment + +Depends on: + none + +Use: +This table lists items in the system. + +upc is how items are identified. Regardless of +whether it's an integer or a varchar, it should +always have length 13. Whether or not to include +check digits is up to the individual store. + +id provides a unique row identifier, but upc +should probably be unique too. If not, you'll have +to add code to either let the cashier choose which +matching record or to limit which records are +pushed to the registers. + +description is used for screen display, reporting, +and receipts. + +Pricing: +When an item has pricemethod 0, the price is +simply normal_price. If pricemethod is greater than +0, groupprice and quantity are used to calculate +the price. There is variance here by implementation, +but generally pricemethod 1 or 2 will yield the +most obvious grouped pricing. Example: buy one, get +the second 50% off + normal_price => 1.00 + pricemethod => 1 (or maybe 2) + groupprice => 1.50 + quantity => 2 +If discounttype is greater than zero, the special* +columns get used instead but otherwise behavior +should be similar. + +start_date and end_date indicate the start and end +of a sale. The current register code does not check +these to validate sales. + +department and subdept are an item's department +and subdepartment settings. + +tax indicates if an item is taxable and at what rate + +foodstamp indicates whether an item can be purchased +using foodstamps + +scale indicates whether an item should be sold by weight + +mixmatchcode relates to pricing when pricemethod is +greater than zero. Items with the same mixmatchcode +are considred equivalent when determining whether the +customer has reached the required quantity. + +modified [ideally] lists the last time a product was +changed. Not all back end tools remember to update this +and of course direct updates via SQL may forget too. + +tareweight is a default tare for by weight items + +discount indicates whether an item is eligible for +percentage discounts on a whole transactions. Value 0 +means exclude from discounts. + +discounttype indicates if an item is on sale + 0 => not on sale + 1 => on sale for everyone + 2 => on sale for members +Values greater than 2 may be used, but results will +vary based on whose code you're running + +unitofmeasure might be used for screen display and +receipt listings of quantity. + +qttyEnforced forces the cashier to enter an explicit +quantity when ringing up the item + +cost is the item's cost + +isUse indicates whether the item is currently +available for sale. Whether cashiers can bypass this +setting probably varies by front end implementation. + +local indicates whether the item is locally sourced. + +Other columns: +size, scaleprice, advertised, wicable, idEnforced, +numflag, and deposit have no current meaning on the +front or back end. Or no current implementation. +The meaning of idEnforced is pretty clear, but setting +it won't *do* anything. +*/ + +$CREATE['op.products'] = " + CREATE TABLE `products` ( + `upc` varchar(13) default NULL, + `description` varchar(30) default NULL, + `normal_price` double default NULL, + `pricemethod` smallint(6) default NULL, + `groupprice` double default NULL, + `quantity` smallint(6) default NULL, + `special_price` double default NULL, + `specialpricemethod` smallint(6) default NULL, + `specialgroupprice` double default NULL, + `specialquantity` smallint(6) default NULL, + `start_date` datetime default NULL, + `end_date` datetime default NULL, + `department` smallint(6) default NULL, + `size` varchar(9) default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `scale` tinyint(4) default NULL, + `scaleprice` tinyint(4) default 0 NULL, + `mixmatchcode` varchar(13) default NULL, + `modified` datetime default NULL, + `advertised` tinyint(4) default NULL, + `tareweight` double default NULL, + `discount` smallint(6) default NULL, + `discounttype` tinyint(4) default NULL, + `unitofmeasure` varchar(15) default NULL, + `wicable` smallint(6) default NULL, + `qttyEnforced` tinyint(4) default NULL, + `idEnforced` tinyint(4) default NULL, + `cost` double default 0 NULL, + `inUse` tinyint(4) default NULL, + `numflag` int(11) default '0', + `subdept` smallint(4) default NULL, + `deposit` double default NULL, + `local` int(11) default '0', + `store_id` smallint default '0', + `id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `upc` (`upc`), + KEY `description` (`description`), + KEY `normal_price` (`normal_price`), + KEY `subdept` (`subdept`), + KEY `department` (`department`), + KEY `store_id` (`store_id`) + ) +"; +if ($dbms == "MSSQL"){ + $CREATE['op.products'] = " + CREATE TABLE [products] ( + [upc] [varchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , + [description] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [normal_price] [money] NULL , + [pricemethod] [smallint] NULL , + [groupprice] [money] NULL , + [quantity] [smallint] NULL , + [special_price] [money] NULL , + [specialpricemethod] [smallint] NULL , + [specialgroupprice] [money] NULL , + [specialquantity] [smallint] NULL , + [start_date] [datetime] NULL , + [end_date] [datetime] NULL , + [department] [smallint] NOT NULL , + [size] [varchar] (9) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [tax] [smallint] NOT NULL , + [foodstamp] [bit] NOT NULL , + [Scale] [bit] NOT NULL , + [scaleprice] [tinyint] NULL , + [mixmatchcode] [varchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [modified] [datetime] NULL , + [advertised] [bit] NOT NULL , + [tareweight] [float] NULL , + [discount] [smallint] NULL , + [discounttype] [tinyint] NULL , + [unitofmeasure] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [wicable] [smallint] NULL , + [qttyEnforced] [tinyint] NULL , + [idEnforced] [tinyint] NULL , + [cost] [money] NULL , + [inUse] [tinyint] NOT NULL , + [numflag] [int] NULL , + [subdept] [smallint] NULL , + [deposit] [money] NULL , + [local] [int] NULL , + [store_id] [smallint] 0, + [id] [int] IDENTITY (1, 1) NOT NULL , + PRIMARY KEY ([id]) ) + "; +} + +?> diff --git a/pos/is4c-nf/install/sql/op/subdepts.php b/pos/is4c-nf/install/sql/op/subdepts.php new file mode 100644 index 000000000..6fe23d660 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/subdepts.php @@ -0,0 +1,39 @@ +<?php +/* +Table: subdepts + +Columns: + subdept_no smallint + subdept_name varchar + dept_ID smallint + +Depends on: + departments (table) + +Use: +A department may contain multiple subdepartments. +In most implementations I've seen, invidual products +can be tagged with a subdepartment, but that +setting doesn't go into the final transaction log +*/ +$CREATE['op.subdepts'] = " + CREATE TABLE `subdepts` ( + `subdept_no` smallint(4) NOT NULL, + `subdept_name` varchar(30) default NULL, + `dept_ID` smallint(4) default NULL, + PRIMARY KEY `subdept_no` (`subdept_no`), + KEY `subdept_name` (`subdept_name`) + ) +"; + +if ($dbms == "MSSQL"){ + $CREATE['op.subdepts'] = " + CREATE TABLE subdepts ( + subdept_no smallint, + subdept_name varchar(30), + dept_ID smallint + ) + "; +} + +?> diff --git a/pos/is4c-nf/install/sql/op/tenders.php b/pos/is4c-nf/install/sql/op/tenders.php new file mode 100644 index 000000000..89178abe4 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/tenders.php @@ -0,0 +1,46 @@ +<?php +/* +Table: tenders + +Columns: + TenderID smallint + TenderCode varchar + TenderName varchar + TenderType varchar + ChangeMessage varchar + MinAmount double + MaxAmount double + MaxRefund double + +Depends on: + none + +Use: +List of tenders IT CORE accepts. TenderCode +should be unique; it's what cashiers type in +at the register as well as the identifier that +eventually shows up in transaction logs. + +ChangeMessage, MinAmount, MaxAmount, and +MaxRefund all do exactly what they sound like. + +TenderName shows up at the register screen +and on various reports. + +TenderType and TenderID are mostly ignored. +*/ +$CREATE['op.tenders'] = " + CREATE TABLE tenders ( + TenderID smallint, + TenderCode varchar(255), + TenderName varchar(255), + TenderType varchar(255), + ChangeMessage varchar(255), + MinAmount double, + MaxAmount double, + MaxRefund double, + PRIMARY KEY (TenderID), + INDEX (TenderCode) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/op/unpaid_ar_today.php b/pos/is4c-nf/install/sql/op/unpaid_ar_today.php new file mode 100644 index 000000000..4ececa8d1 --- /dev/null +++ b/pos/is4c-nf/install/sql/op/unpaid_ar_today.php @@ -0,0 +1,28 @@ +<?php +/* +Table: unpaid_ar_today + +Columns: + card_no int + old_balance currency + recent_payments currency + +Depends on: + custdata (table) + +Use: +Listing of overdue balances. Authoritative, +up-to-the-second data is on the server +but checking a local table is faster if +slightly stale data is acceptable +*/ +$CREATE['op.unpaid_ar_today'] = " + CREATE TABLE unpaid_ar_today ( + card_no int, + old_balance real, + recent_payments real, + primary key (card_no) + ) +"; + +?> diff --git a/pos/is4c-nf/install/sql/trans/activities.php b/pos/is4c-nf/install/sql/trans/activities.php new file mode 100644 index 000000000..6557daf6a --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/activities.php @@ -0,0 +1,21 @@ +<?php +/* +Table: activities + +Columns: + Activity int + Description varchar + +Depends on: + none + +Use: +Lists meaning for different activity IDs. +*/ +$CREATE['trans.activities'] = " + CREATE TABLE activities ( + Activity tinyint, + Description varchar(15), + PRIMARY KEY (Activity) + ) +"; diff --git a/pos/is4c-nf/install/sql/trans/activitylog.php b/pos/is4c-nf/install/sql/trans/activitylog.php new file mode 100644 index 000000000..882f8fb7b --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/activitylog.php @@ -0,0 +1,22 @@ +<?php +/* +Table: activitylog + +Columns: + datetime datetime + LaneNo int + CashierNo int + TransNo int + Activity int + Interval double + +Depends on: + none + +Use: +Lane-side record of activities. These are +shipped to the server via alog. +*/ +$CREATE['trans.activitylog'] = duplicate_structure($dbms,'alog','activitylog'); + +?> diff --git a/pos/is4c-nf/install/sql/trans/activitytemplog.php b/pos/is4c-nf/install/sql/trans/activitytemplog.php new file mode 100644 index 000000000..fa7d087b4 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/activitytemplog.php @@ -0,0 +1,22 @@ +<?php +/* +Table: activitytemplog + +Columns: + datetime datetime + LaneNo int + CashierNo int + TransNo int + Activity int + Interval double + +Depends on: + none + +Use: +Stores activity info during transaction. +Rotates into alog and activitylog. +*/ +$CREATE['trans.activitytemplog'] = duplicate_structure($dbms,'alog','activitytemplog'); + +?> diff --git a/pos/is4c-nf/install/sql/trans/alog.php b/pos/is4c-nf/install/sql/trans/alog.php new file mode 100644 index 000000000..25973e397 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/alog.php @@ -0,0 +1,37 @@ +<?php +/* +Table: alog + +Columns: + datetime datetime + LaneNo int + CashierNo int + TransNo int + Activity int + Interval double + +Depends on: + none + +Use: +This table logs cashier activities. I think +Interval is time between activities and +Activity specifies what exactly the cashier did, +but I don't know what the various codings mean. +WFC does not use this table for anything. +*/ +$CREATE['trans.alog'] = " + CREATE TABLE alog ( + `datetime` datetime, + LaneNo smallint, + CashierNo smallint, + TransNo int, + Activity tinyint, + `Interval` double + ) +"; +if ($dbms == 'MSSQL'){ + $CREATE['trans.alog'] = str_replace("`datetime`","[datetime]",$CREATE['trans.alog']); + $CREATE['trans.alog'] = str_replace("`","",$CREATE['trans.alog']); +} +?> diff --git a/pos/is4c-nf/install/sql/trans/couponApplied.php b/pos/is4c-nf/install/sql/trans/couponApplied.php new file mode 100644 index 000000000..4e6298be2 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/couponApplied.php @@ -0,0 +1,27 @@ +<?php +/* +Table: couponApplied + +Columns: + emp_no int + trans_no int + quantity float + trans_id int + +Depends on: + none + +Use: +Track which items have had coupons applied +to them. This is primarily to deal with +"free" coupons that can apply to multiple, +differently-priced items ina single transaction. +*/ +$CREATE['trans.couponApplied'] = " + CREATE TABLE couponApplied ( + emp_no INT, + trans_no INT, + quantity FLOAT, + trans_id INT + ) +"; diff --git a/pos/is4c-nf/install/sql/trans/dtransactions.php b/pos/is4c-nf/install/sql/trans/dtransactions.php new file mode 100644 index 000000000..ca0092457 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/dtransactions.php @@ -0,0 +1,279 @@ +<?php +/* +Table: dtransactions + +Columns: + datetime datetime + register_no int + emp_no int + trans_no int + upc varchar + description varchar + trans_type varchar + trans_subtype varchar + trans_status varchar + department smallint + quantity double + scale tinyint + cost currency + unitPrice currency + total currency + regPrice currency + tax smallint + foodstamp tinyint + discount currency + memDiscount currency + discounttable tinyint + discounttype tinyint + voided tinyint + percentDiscount tinyint + ItemQtty double + volDiscType tinyint + volume tinyint + VolSpecial currency + mixMatch varchar + matched smallint + memType tinyint + staff tinyint + numflag int + charflag varchar + card_no int + trans_id int + +Depends on: + none + +Use: +This is IT CORE's transaction log. A rather important table. + +A transaction can be uniquely identified by: +date + register_no + emp_no + trans_no +A record in a transaction can be uniquely identified by: +date + register_no + emp_no + trans_no + trans_id +Note that "date" is not necessary datetime. All records +in a transaction don't always have the exact same time +to the second. + +upc is generally a product. The column is always a varchar +here, regardless of dbms, because sometimes non-numeric +data goes here such as 'DISCOUNT', 'TAX', or 'amountDPdept' +(transaction discounts, applicable tax, and open rings, +respectively). + +description is what's displayed on screen and on receipts. + +trans_type indicates the record's type Values include +(but may not be limited to at all co-ops): + I => normally a product identified by upc, but + can also be a discount line (upc='DISCOUNT') + or a YOU SAVED line (upc='0'). + A => tax total line + C => a commentary line. These generally exist + only for generating the on-screen display + at the register (subtotal lines, etc). + D => open ring to a department. In this case, + upc will be the amount, 'DP', and the + department number + T => tender record. UPC is generally, but not + always, '0' (e.g., manufacturer coupons + have their own UPCs) + 0 => another commentary line + +trans_subtype refines the record's type. Values include +(but may not be limited to at all co-ops): + CM => record is a cashier-written comment. + Used to make notes on a transaction + (tender code) => goes with trans_type 'T', + exact values depends what's + in core_op.tenders + 0 => no refinement available for this trans_type + blank => no refinement available for this trans_type + +trans_status is a fairly all-purpose indicator. Values include +(but may not be limited to at all co-ops): + X => the transaction is canceled + D => this can be omitted with back-end reporting + R => this line is a refund + V => this line is a void + M => this line is a member special discount + C => this line is a coupon + Z => this item was damaged, not sold (WFC) + 0 => no particular meaning + blank => no particular meaning + +department is set for a UPC item, an open-department ring, +a member special discount, or a manufacturer coupon. All +other lines have zero here. + +quantity and ItemQtty are the number of items sold on +that line. These can be fractional for by-weight items. +These values are normally the same, except for: + 1. member special lines, where ItemQtty is always zero. + This is useful for tracking actual movement by UPC + 2. refund lines, where quantity is negative and ItemQtty + is not. No idea what the reasoning was here. + +scale indicates an item sold by-weight. Meaningless on +non-item records. + +cost indicates an item's cost. Meaningless on non-item +records. + +unitPrice is the price a customer will be charged per item. +total is quantity times unitPrice. This is what the +customer actually pays. If an item is on sale, regPrice +indicates the regular price per item. On non-item records, +total is usually the only relevant column. Sales are +positive, voids/refunds/tenders are negative. + +tax indicates whether to tax an item and at what rate + +foodstamp indicates whether an item can be paid for +using foodstamps + +discount is any per-item discount that was applied. +In the simplest case, this is the regularPrice +minus the unitPrice (times quantity). Discounts are +listed as positive values. + +memDiscount is the same as discount, but these +discounts are only applied if the customer is a +member (custdata.Type = 'PC') + +discountable indicates whether an item is eligible +for transaction-wide percent discounts. + +discounttype indicates what type of sale an item +is on. + 0 => not on sale + 1 => on sale for everyone + 2 => on sale for members +Values over 2 may be used, but aren't used +consistently across co-ops at this time. + +voided indicates whether a line has been voided + 0 => no + 1 => yes +voided is also used as a status flag in some cases +You'd have to dig into IT CORE code a bit to get a +handle on that. + +percentDiscount is a percentage discount applied to +the whole transaction. This is an integer, so +5 = 5% = 0.05 + +volDiscType is a volume discount type. Usage varies +a lot here, but in general: + volDiscType => core_op.products.pricemethod + volume => core_op.products.quantity + VolSpecial => core_op.products.groupprice +If an item is on sale, those become specialpricemethod, +specialquantity, and specialgroupprice (respectively). +Exact calculations depend a lot of volDiscType. 0 means +there is no volume discount, and either 1 or 2 (depending +on IT CORE version) will probably do a simple 3 for $2 style +sale (quantity=3, groupprice=2.00). Higher type values +vary. + +mixMatch relates to volume pricing. In general, items +with the same mixMatch setting are interchangeable. This +is so you can do sales across a set of products (e.g., Clif +Bars) and the customer can buy various flavors but still +get the discount. + +matched notes item quantites that have already been used +for a volume pricing group. This is so the same item doesn't +get counted more than once. + +memType and staff match values in core_op.custdata. Including +them here helps determine membership status at the time of +purchase as opposed to current status. + +numflag and charflag are generic status indicators. As far +as I know, there's no uniform usage across implementations. + +card_no is the customer number from core_op.custdata. +*/ +$CREATE['trans.dtransactions'] = " + CREATE TABLE dtransactions ( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(13) default NULL, + `description` varchar(30) default NULL, + `trans_type` varchar(1) default NULL, + `trans_subtype` varchar(2) default NULL, + `trans_status` varchar(1) default NULL, + `department` smallint(6) default NULL, + `quantity` double default NULL, + `scale` tinyint(4) default NULL, + `cost` decimal(10,2) default 0.00 NULL, + `unitPrice` decimal(10,2) default NULL, + `total` decimal(10,2) default NULL, + `regPrice` decimal(10,2) default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` decimal(10,2) default NULL, + `memDiscount` decimal(10,2) default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` double default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` decimal(10,2) default NULL, + `mixMatch` varchar(13) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` int(11) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` int(11) default NULL, + `trans_id` int(11) default NULL + ) +"; + +if ($dbms == "MSSQL"){ + $CREATE['trans.dtransactions'] = " + CREATE TABLE dtransactions ([datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [cost] [money] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [isStaff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL + ) + "; +} +?> diff --git a/pos/is4c-nf/install/sql/trans/efsnetRequest.php b/pos/is4c-nf/install/sql/trans/efsnetRequest.php new file mode 100644 index 000000000..e60802d1a --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/efsnetRequest.php @@ -0,0 +1,80 @@ +<?php +/* +Table: efsnetRequest + +Columns: + date int + cashierNo int + laneNo int + transNo int + transID int + datetime datetime + refNum varchar + live tinyint + mode varchar + amount double + PAN varchar + issuer varchar + name varchar + manual tinyint + sentPAN tinyint + sentExp tinyint + sentTr1 tinyint + sentTr2 tinyint + +Depends on: + none + +Use: +This table logs information that is +sent to a credit-card payment gateway. +All current paycard modules use this table +structure. Future ones don't necessarily have +to, but doing so may enable more code re-use. + +Some column usage may vary depending on a +given gateway's requirements and/or formatting, +but in general: + +cashierNo, laneNo, transNo, and transID are +equivalent to emp_no, register_no, trans_no, and +trans_id in dtransactions (respectively). + +mode indicates the type of transaction, such as +refund or sale. Exact value can vary from gateway +to gateway. + +PAN is the cardnumber - for the love of $deity +only save the last 4 digits here - issuer is +Visa, MC, etc, and name is the cardholder's name +(if available). + +The sent* columns indicate which information was +sent. Most gateways will accept PAN + expiration +date, or either track. Sending both tracks is +usually fine; I've never seen a system where +you send all 4 pieces of card info. +*/ +$CREATE['trans.efsnetRequest'] = " + CREATE TABLE efsnetRequest ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + refNum varchar (50) , + live tinyint , + mode varchar (32) , + amount double , + PAN varchar (19) , + issuer varchar (16) , + name varchar (50) , + manual tinyint , + sentPAN tinyint , + sentExp tinyint , + sentTr1 tinyint , + sentTr2 tinyint + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/efsnetRequestMod.php b/pos/is4c-nf/install/sql/trans/efsnetRequestMod.php new file mode 100644 index 000000000..65d52f0d3 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/efsnetRequestMod.php @@ -0,0 +1,79 @@ +<?php +/* +Table: efsnetRequestMod + +Columns: + date int + cashierNo int + laneNo int + transNo int + transID int + datetime datetime + origRefNum varchar + origAmount double + origTransactionID varchar + mode varchar + altRoute tinyint + seconds float + commErr int + httpCode int + validResponse smallint + xResponseCode varchar + xResultCode varchar + xResultMessage varchar + +Depends on: + efsnetRequest (table) + +Use: +This table logs information that is +returned from a credit-card payment gateway +when modifying an earlier transaction. +Generally, this means some kind of void. +All current paycard modules use this table +structure. Future ones don't necessarily have +to, but doing so may enable more code re-use. + +Some column usage may vary depending on a +given gateway's requirements and/or formatting, +but in general: + +cashierNo, laneNo, transNo, and transID are +equivalent to emp_no, register_no, trans_no, and +trans_id in dtransactions (respectively). + +mode is the operation type. Exact syntax varies +by gateway. Some gateways provide multiple +addresses. Using a different one can be noted +in altRoute. + +seconds, commErr, and httpCode are curl-related +entries noting how long the network request took +and errors that occurred, if any. + +the x* columns vary a lot. What to store here +depends what the gateway returns. +*/ +$CREATE['trans.efsnetRequestMod'] = " + CREATE TABLE efsnetRequestMod ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + origRefNum varchar (50), + origAmount double , + origTransactionID varchar(12) , + mode varchar (32), + altRoute tinyint , + seconds float , + commErr int , + httpCode int , + validResponse smallint , + xResponseCode varchar(4), + xResultCode varchar(4), + xResultMessage varchar(100) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/efsnetResponse.php b/pos/is4c-nf/install/sql/trans/efsnetResponse.php new file mode 100644 index 000000000..dc1ac603e --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/efsnetResponse.php @@ -0,0 +1,69 @@ +<?php +/* +Table: efsnetResponse + +Columns: + date int + cashierNo int + laneNo int + transNo int + transID int + datetime datetime + refNum varchar + seconds float + commErr int + httpCode int + validResponse smallint + xResponseCode varchar + xResultCode varchar + xResultMessage varchar + xTransactionID varchar + xApprovalNumber varchar + +Depends on: + efsnetRequest (table) + +Use: +This table logs information that is +returned from a credit-card payment gateway +after sending a [non-void] request. +All current paycard modules use this table +structure. Future ones don't necessarily have +to, but doing so may enable more code re-use. + +Some column usage may vary depending on a +given gateway's requirements and/or formatting, +but in general: + +cashierNo, laneNo, transNo, and transID are +equivalent to emp_no, register_no, trans_no, and +trans_id in dtransactions (respectively). + +seconds, commErr, and httpCode are curl-related +entries noting how long the network request took +and errors that occurred, if any. + +the x* columns vary a lot. What to store here +depends what the gateway returns. +*/ +$CREATE['trans.efsnetResponse'] = " + CREATE TABLE efsnetResponse ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + refNum varchar (50), + seconds float , + commErr int , + httpCode int , + validResponse smallint , + xResponseCode varchar (4), + xResultCode varchar (8), + xResultMessage varchar (100), + xTransactionID varchar (12), + xApprovalNumber varchar (20) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/efsnetTokens.php b/pos/is4c-nf/install/sql/trans/efsnetTokens.php new file mode 100644 index 000000000..038c0240c --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/efsnetTokens.php @@ -0,0 +1,41 @@ +<?php +/* +Table: efsnetTokens + +Columns: + expireDay datetime + refNum varchar + token varchar + processData varchar + acqRefData + +Depends on: + efsnetRequest (table) + efsnetResponse (table) + +Use: +This table logs tokens used for modifying +later transactions. + +expireDay is when(ish) the token is no longer valid + +refNum maps to efsnetRequest & efsnetResponse +records + +token is the actual token + +processData and acqRefData are additional +values needed in addition to the token for +certain kinds of modifying transactions +*/ +$CREATE['trans.efsnetTokens'] = " + CREATE TABLE efsnetTokens ( + expireDay datetime, + refNum varchar(50), + token varchar(100), + processData varchar(255), + acqRefData varchar(255), + PRIMARY KEY (refNum,token) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/localtemptrans.php b/pos/is4c-nf/install/sql/trans/localtemptrans.php new file mode 100644 index 000000000..772dc197d --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/localtemptrans.php @@ -0,0 +1,137 @@ +<?php +/* +Table: localtemptrans + +Columns: + datetime datetime + register_no int + emp_no int + trans_no int + upc varchar + description varchar + trans_type varchar + trans_subtype varchar + trans_status varchar + department smallint + quantity double + scale tinyint + cost currency + unitPrice currency + total currency + regPrice currency + tax smallint + foodstamp tinyint + discount currency + memDiscount currency + discounttable tinyint + discounttype tinyint + voided tinyint + percentDiscount tinyint + ItemQtty double + volDiscType tinyint + volume tinyint + VolSpecial currency + mixMatch varchar + matched smallint + memType tinyint + staff tinyint + numflag int + charflag varchar + card_no int + trans_id int + +Depends on: + none + +Use: +Stores current transaction data. See +dtransactions for detailed information on +the columns. The only notable difference +is this table has an automatically incremented +trans_id column. +*/ +$CREATE['trans.localtemptrans'] = " + CREATE TABLE localtemptrans ( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(13) default NULL, + `description` varchar(30) default NULL, + `trans_type` varchar(1) default NULL, + `trans_subtype` varchar(2) default NULL, + `trans_status` varchar(1) default NULL, + `department` smallint(6) default NULL, + `quantity` double default NULL, + `scale` tinyint(4) default NULL, + `cost` decimal(10,2) default 0.00 NULL, + `unitPrice` decimal(10,2) default NULL, + `total` decimal(10,2) default NULL, + `regPrice` decimal(10,2) default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` decimal(10,2) default NULL, + `memDiscount` decimal(10,2) default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` double default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` decimal(10,2) default NULL, + `mixMatch` varchar(13) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` int(11) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` int(11) default NULL, + `trans_id` int(11) NOT NULL auto_increment, + PRIMARY KEY (trans_id) + ) +"; + +if ($dbms == "MSSQL"){ + $CREATE['trans.localtemptrans'] = " + CREATE TABLE localtemptrans ([datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [cost] [money] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [isStaff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL + [trans_id] [int] IDENTITY (1, 1) NOT NULL + ) ON [PRIMARY] + "; +} +?> diff --git a/pos/is4c-nf/install/sql/trans/localtrans.php b/pos/is4c-nf/install/sql/trans/localtrans.php new file mode 100644 index 000000000..e7bedd1bb --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/localtrans.php @@ -0,0 +1,53 @@ +<?php +/* +Table: localtrans + +Columns: + datetime datetime + register_no int + emp_no int + trans_no int + upc varchar + description varchar + trans_type varchar + trans_subtype varchar + trans_status varchar + department smallint + quantity double + scale tinyint + cost currency + unitPrice currency + total currency + regPrice currency + tax smallint + foodstamp tinyint + discount currency + memDiscount currency + discounttable tinyint + discounttype tinyint + voided tinyint + percentDiscount tinyint + ItemQtty double + volDiscType tinyint + volume tinyint + VolSpecial currency + mixMatch varchar + matched smallint + memType tinyint + staff tinyint + numflag int + charflag varchar + card_no int + trans_id int + +Depends on: + none + +Use: +Lane-side record of historical transactions. +See dtransactions for details on what the columns +are used for. +*/ +$CREATE['trans.localtrans'] = duplicate_structure($dbms,'dtransactions','localtrans'); + +?> diff --git a/pos/is4c-nf/install/sql/trans/localtrans_today.php b/pos/is4c-nf/install/sql/trans/localtrans_today.php new file mode 100644 index 000000000..f8e13be86 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/localtrans_today.php @@ -0,0 +1,56 @@ +<?php +/* +Table: localtrans_today + +Columns: + datetime datetime + register_no int + emp_no int + trans_no int + upc varchar + description varchar + trans_type varchar + trans_subtype varchar + trans_status varchar + department smallint + quantity double + scale tinyint + cost currency + unitPrice currency + total currency + regPrice currency + tax smallint + foodstamp tinyint + discount currency + memDiscount currency + discounttable tinyint + discounttype tinyint + voided tinyint + percentDiscount tinyint + ItemQtty double + volDiscType tinyint + volume tinyint + VolSpecial currency + mixMatch varchar + matched smallint + memType tinyint + staff tinyint + numflag int + charflag varchar + card_no int + trans_id int + +Depends on: + none + +Use: +Contains today's transactions. Access is generally +via the view localtranstoday that enforces the +today-only restriction but truncating this table +daily will yield better performance on some actions +that reference the current day's info - for example, +reprinting receipts. +*/ +$CREATE['trans.localtrans_today'] = duplicate_structure($dbms,'dtransactions','localtrans_today'); + +?> diff --git a/pos/is4c-nf/install/sql/trans/localtransarchive.php b/pos/is4c-nf/install/sql/trans/localtransarchive.php new file mode 100644 index 000000000..6db1018c3 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/localtransarchive.php @@ -0,0 +1,54 @@ +<?php +/* +Table: localtransarchive + +Columns: + datetime datetime + register_no int + emp_no int + trans_no int + upc varchar + description varchar + trans_type varchar + trans_subtype varchar + trans_status varchar + department smallint + quantity double + scale tinyint + cost currency + unitPrice currency + total currency + regPrice currency + tax smallint + foodstamp tinyint + discount currency + memDiscount currency + discounttable tinyint + discounttype tinyint + voided tinyint + percentDiscount tinyint + ItemQtty double + volDiscType tinyint + volume tinyint + VolSpecial currency + mixMatch varchar + matched smallint + memType tinyint + staff tinyint + numflag int + charflag varchar + card_no int + trans_id int + +Depends on: + none + +Use: +Lane side storage of transactions older than what's +in localtrans. This could probably go away entirely. +By the data is removed from localtrans it should be +safely archived on the server side anyway. +*/ +$CREATE['trans.localtransarchive'] = duplicate_structure($dbms,'dtransactions','localtransarchive'); + +?> diff --git a/pos/is4c-nf/install/sql/trans/localtranstoday.php b/pos/is4c-nf/install/sql/trans/localtranstoday.php new file mode 100644 index 000000000..9345d49ee --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/localtranstoday.php @@ -0,0 +1,19 @@ +<?php +/* +View: localtranstoday + +Columns: + identical to dtransactions + +Depends on: + localtrans_today (table) + +Use: +List today's transactions +*/ +$CREATE['trans.localtranstoday'] = " + CREATE VIEW localtranstoday AS + SELECT * FROM localtrans_today WHERE " + .$con->datediff($con->now(),'datetime')." = 0 +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/memdiscountadd.php b/pos/is4c-nf/install/sql/trans/memdiscountadd.php new file mode 100644 index 000000000..91ef09a87 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/memdiscountadd.php @@ -0,0 +1,61 @@ +<?php +/* +View: memdiscountadd + +Columns: + identical to dtransactions + +Depends on: + localtemptrans (table) + +Use: +This view calculates member discounts on items +in the transaction that have not yet been applied. +These records are then inserted into localtemptrans +to apply the relevant discount(s). +*/ +$CREATE['trans.memdiscountadd'] = " + CREATE VIEW memdiscountadd AS + select + max(datetime) as datetime, + register_no, + emp_no, + trans_no, + upc, + CASE WHEN volDiscType IN (3,4) THEN 'Set Discount' ELSE description END as description, + 'I' as trans_type, + '' as trans_subtype, + 'M' as trans_status, + max(department) as department, + 1 as quantity, + 0 as scale, + 0 as cost, + -1 * sum(memDiscount) as unitPrice, + -1 * sum(memDiscount) as total, + -1 * sum(memDiscount )as regPrice, + max(tax) as tax, + max(foodstamp) as foodstamp, + 0 as discount, + -1 * sum(memDiscount) as memDiscount, + 3 as discountable, + 20 as discounttype, + 8 as voided, + MAX(percentDiscount) as percentDiscount, + 0 as ItemQtty, + 0 as volDiscType, + 0 as volume, + 0 as VolSpecial, + 0 as mixMatch, + 0 as matched, + MAX(memType) as memType, + MAX(staff) as staff, + 0 as numflag, + '' as charflag, + card_no as card_no + from localtemptrans + where ((discounttype = 2 and unitPrice = regPrice) or trans_status = 'M') + group by register_no, emp_no, trans_no, upc, description, card_no + having + sum(memDiscount)<> 0 +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/memdiscountremove.php b/pos/is4c-nf/install/sql/trans/memdiscountremove.php new file mode 100644 index 000000000..ec476ae93 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/memdiscountremove.php @@ -0,0 +1,67 @@ +<?php +/* +View: memdiscountremove + +Columns: + identical to dtransactions + +Depends on: + localtemptrans (table) + +Use: +This view is the opposite of memdiscountadd. +It calculates the reverse of all currently +applied member discounts on items. These records +are inserted into localtemptrans to remove +member discounts if needed. +*/ +$CREATE['trans.memdiscountremove'] = " + CREATE view memdiscountremove as + Select + max(datetime) as datetime, + register_no, + emp_no, + trans_no, + upc, + CASE WHEN volDiscType IN (3,4) THEN 'Set Discount' ELSE description END as description, + 'I' as trans_type, + '' as trans_subtype, + 'M' as trans_status, + max(department) as department, + 1 as quantity, + 0 as scale, + 0 as cost, + -1 * (sum(case when (discounttype = 2 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)) as unitPrice, + -1 * (sum(case when (discounttype = 2 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)) as total, + -1 * (sum(case when (discounttype = 2 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end))as regPrice, + max(tax) as tax, + max(foodstamp) as foodstamp, + 0 as discount, + -1 * (sum(case when (discounttype = 2 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)) as memDiscount, + 3 as discountable, + 20 as discounttype, + 8 as voided, + MAX(percentDiscount) as percentDiscount, + 0 as ItemQtty, + 0 as volDiscType, + 0 as volume, + 0 as VolSpecial, + 0 as mixMatch, + 0 as matched, + MAX(memType) as memType, + MAX(staff) as staff, + 0 as numflag, + '' as charflag, + card_no as card_no + from localtemptrans + where ((discounttype = 2 and unitPrice <> regPrice) or trans_status = 'M') + group by register_no, emp_no, trans_no, upc, description, card_no + having + sum(case when (discounttype = 2 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)<> 0 +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/screendisplay.php b/pos/is4c-nf/install/sql/trans/screendisplay.php new file mode 100644 index 000000000..9fe2fb7ba --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/screendisplay.php @@ -0,0 +1,236 @@ +<?php +/* +View: suspendedtoday + +Columns: + description varchar + comment varchar + total varchar + status varchar + lineColor varchar + discounttype int + trans_type varchar + trans_status varchar + voided int + trans_id int + +Depends on: + localtemptrans, taxrates + +Use: +Formats current transaction info for +onscreen display. + +The first four columns are display text +and on rendered left to right. Description +goes on the far left, comment goes in the middle, +total is the lineitem's price, and status is +a character or two on the far right. + +trans_id is used to select appropriate lines if +the entire transaction does not fit on the screen + +The remaining columns are used for display formatting +mostly in terms of background & text color. +*/ +$CREATE['trans.screendisplay'] = " + CREATE view screendisplay as + select + CASE + WHEN (voided = 5 or voided = 11 or voided = 17 or trans_type = 'T') + THEN '' + ELSE + l.description + END + as description, + CASE + WHEN(discounttype = 3 and trans_status = 'V') + THEN CONCAT(ItemQtty,' /',UnitPrice) + WHEN (voided = 5) + THEN 'Discount' + WHEN (trans_status = 'M') + THEN 'Mbr special' + WHEN (trans_status = 'S') + THEN 'Staff special' + WHEN (scale <> 0 and quantity <> 0 and unitPrice <> 0.01) + THEN CONCAT( quantity,' @ ',unitPrice) + WHEN (SUBSTRING(upc, 1, 3) = '002') + THEN CONCAT( itemQtty,' @ ',regPrice) + WHEN (abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1) + THEN CONCAT(volume,' for ',unitPrice) + WHEN (abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1) + THEN CONCAT(Quantity,' @ ',Volume,' for ',unitPrice) + WHEN (abs(itemQtty) > 1 and discounttype = 3) + THEN CONCAT(ItemQtty,' /',UnitPrice) + WHEN (abs(itemQtty) > 1) + THEN CONCAT(quantity,' @ ',unitPrice) + WHEN (voided = 3) + THEN 'Total ' + WHEN (voided = 5) + THEN 'Discount ' + WHEN (voided = 7) + THEN '' + WHEN (voided = 11 or voided = 17) + THEN upc + WHEN (matched > 0) + THEN '1 w/ vol adj' + WHEN (trans_type = 'T') + THEN l.description + ELSE + '' + END + as comment, + CASE + WHEN (voided = 3 or voided = 5 or voided = 7 or voided = 11 or voided = 17) + THEN unitPrice + WHEN (trans_status = 'D') + THEN '' + ELSE + total + END + as total, + CASE + WHEN (trans_status = 'V') + THEN 'VD' + WHEN (trans_status = 'R') + THEN 'RF' + WHEN (trans_status = 'C') + THEN 'MC' + WHEN (tax = 1 and foodstamp <> 0) + THEN 'TF' + WHEN (tax = 1 and foodstamp = 0) + THEN 'T' + WHEN (tax > 1 and foodstamp <> 0) + THEN CONCAT(LEFT(t.description,1),'F') + WHEN (tax > 1 and foodstamp = 0) + THEN LEFT(t.description,1) + WHEN (tax = 0 and foodstamp <> 0) + THEN 'F' + WHEN (tax = 0 and foodstamp = 0) + THEN '' + ELSE + '' + END + as status, + CASE + WHEN (trans_status = 'V' or trans_type = 'T' or trans_status = 'R' or trans_status = 'C' or trans_status = 'M' or voided = 17 or trans_status = 'J') + THEN '800000' + WHEN ((discounttype <> 0 and (matched > 0 or volDiscType=0)) or voided = 2 or voided = 6 or voided = 4 or voided = 5 or voided = 10 or voided = 22) + THEN '408080' + WHEN (voided = 3 or voided = 11) + THEN '000000' + WHEN (voided = 7) + THEN '800080' + ELSE + '004080' + END + as lineColor, + discounttype, + trans_type, + trans_status, + voided, + trans_id + from localtemptrans as l + left join taxrates as t + on l.tax = t.id + WHERE trans_type <> 'L' + order by trans_id +"; +if ($dbms == 'MSSQL'){ + $CREATE['trans.screendisplay'] = "CREATE view screendisplay as + select + CASE + WHEN (voided = 5 or voided = 11 or voided = 17 or trans_type = 'T') + THEN '' + ELSE + l.description + END + as description, + CASE + WHEN(discounttype = 3 and trans_status = 'V') + THEN ItemQtty+' /'+UnitPrice + WHEN (voided = 5) + THEN 'Discount' + WHEN (trans_status = 'M') + THEN 'Mbr special' + WHEN (trans_status = 'S') + THEN 'Staff special' + WHEN (scale <> 0 and quantity <> 0) + THEN quantity+' @ '+unitPrice + WHEN (SUBSTRING(upc, 1, 3) = '002') + THEN itemQtty+' @ '+regPrice + WHEN (abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity = 1) + THEN volume+' for '+unitPrice + WHEN (abs(itemQtty) > 1 and abs(itemQtty) > abs(quantity) and discounttype <> 3 and quantity <> 1) + THEN Quantity+' @ '+Volume+' for '+unitPrice + WHEN (abs(itemQtty) > 1 and discounttype = 3) + THEN ItemQtty+' /'+UnitPrice + WHEN (abs(itemQtty) > 1) + THEN quantity+' @ '+unitPrice + WHEN (voided = 3) + THEN 'Total ' + WHEN (voided = 5) + THEN 'Discount ' + WHEN (voided = 7) + THEN '' + WHEN (voided = 11 or voided = 17) + THEN upc + WHEN (matched > 0) + THEN '1 w/ vol adj' + WHEN (trans_type = 'T') + THEN l.description + ELSE + '' + END + as comment, + CASE + WHEN (voided = 3 or voided = 5 or voided = 7 or voided = 11 or voided = 17) + THEN unitPrice + WHEN (trans_status = 'D') + THEN '' + ELSE + total + END + as total, + CASE + WHEN (trans_status = 'V') + THEN 'VD' + WHEN (trans_status = 'R') + THEN 'RF' + WHEN (trans_status = 'C') + THEN 'MC' + WHEN (tax <> 0 and foodstamp <> 0) + THEN 'TF' + WHEN (tax <> 0 and foodstamp = 0) + THEN 'T' + WHEN (tax = 0 and foodstamp <> 0) + THEN 'F' + WHEN (tax = 0 and foodstamp = 0) + THEN '' + ELSE + '' + END + as status, + CASE + WHEN (trans_status = 'V' or trans_type = 'T' or trans_status = 'R' or trans_status = 'C' or trans_status = 'M' or voided = 17 or trans_status = 'J') + THEN '800000' + WHEN ((discounttype <> 0 and (volDiscType=0 or matched>0)) or voided = 2 or voided = 6 or voided = 4 or voided = 5 or voided = 10 or voided = 22) + THEN '408080' + WHEN (voided = 3 or voided = 11) + THEN '000000' + WHEN (voided = 7) + THEN '800080' + ELSE + '004080' + END + as lineColor, + discounttype, + trans_type, + trans_status, + voided, + trans_id + from localtemptrans + WHERE trans_type <> 'L' + order by trans_id"; +} +?> diff --git a/pos/is4c-nf/install/sql/trans/staffdiscountadd.php b/pos/is4c-nf/install/sql/trans/staffdiscountadd.php new file mode 100644 index 000000000..6dd495a77 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/staffdiscountadd.php @@ -0,0 +1,55 @@ +<?php +/* +View: staffdiscountadd + +Columns: + identical to dtransactions + +Depends on: + localtemptrans (table) + +Use: +This view calculates staff discounts on items +in the transaction that have not yet been applied. +These records are then inserted into localtemptrans +to apply the relevant discount(s). +*/ +$CREATE['trans.staffdiscountadd'] = " + CREATE VIEW staffdiscountadd AS + select max(datetime) AS datetime, + register_no AS register_no, + emp_no AS emp_no, + trans_no AS trans_no, + upc AS upc, + description AS description, + 'I' AS trans_type, + '' AS trans_subtype, + 'S' AS trans_status, + max(department) AS department, + 1 AS quantity, + 0 AS scale, + 0 AS cost, + (-(1) * sum(memDiscount)) AS unitPrice, + (-(1) * sum(memDiscount)) AS total, + (-(1) * sum(memDiscount)) AS regPrice, + max(tax) AS tax, + max(foodstamp) AS foodstamp, + 0 AS discount, + (-(1) * sum(memDiscount)) AS memDiscount, + 3 AS discountable, + 40 AS discounttype, + 8 AS voided, + MAX(percentDiscount) as percentDiscount, + 0 AS ItemQtty,0 AS volDiscType, + 0 AS volume,0 AS VolSpecial, + 0 AS mixMatch,0 AS matched, + MAX(memType) as memType, + MAX(staff) as staff, + 0 as numflag, + '' as charflag, + card_no AS card_no + from localtemptrans + where (((discounttype = 4) and (unitPrice = regPrice)) or (trans_status = 'S')) + group by register_no,emp_no,trans_no,upc,description,card_no having (sum(memDiscount) <> 0) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/staffdiscountremove.php b/pos/is4c-nf/install/sql/trans/staffdiscountremove.php new file mode 100644 index 000000000..63a33960b --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/staffdiscountremove.php @@ -0,0 +1,67 @@ +<?php +/* +View: staffdiscountremove + +Columns: + identical to dtransactions + +Depends on: + localtemptrans (table) + +Use: +This view is the opposite of staffdiscountadd. +It calculates the reverse of all currently +applied staff discounts on items. These records +are inserted into localtemptrans to remove +staff discounts if needed. +*/ +$CREATE['trans.staffdiscountremove'] = " + CREATE view staffdiscountremove as + Select + max(datetime) as datetime, + register_no, + emp_no, + trans_no, + upc, + description, + 'I' as trans_type, + '' as trans_subtype, + 'S' as trans_status, + max(department) as department, + 1 as quantity, + 0 as scale, + 0 as cost, + -1 * (sum(case when (discounttype = 4 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)) as unitPrice, + -1 * (sum(case when (discounttype = 4 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)) as total, + -1 * (sum(case when (discounttype = 4 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end))as regPrice, + max(tax) as tax, + max(foodstamp) as foodstamp, + 0 as discount, + -1 * (sum(case when (discounttype = 4 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)) as memDiscount, + 3 as discountable, + 40 as discounttype, + 8 as voided, + MAX(percentDiscount) as percentDiscount, + 0 as ItemQtty, + 0 as volDiscType, + 0 as volume, + 0 as VolSpecial, + 0 as mixMatch, + 0 as matched, + MAX(memType) as memType, + MAX(staff) as staff, + 0 as numflag, + '' as charflag, + card_no as card_no + from localtemptrans + where ((discounttype = 4 and unitPrice <> regPrice) or trans_status = 'S') + group by register_no, emp_no, trans_no, upc, description, card_no + having + sum(case when (discounttype = 4 and unitPrice <> regPrice) then -1 * memDiscount + else memDiscount end)<> 0 +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/suspended.php b/pos/is4c-nf/install/sql/trans/suspended.php new file mode 100644 index 000000000..c09e46da4 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/suspended.php @@ -0,0 +1,52 @@ +<?php +/* +Table: suspended + +Columns: + datetime datetime + register_no int + emp_no int + trans_no int + upc varchar + description varchar + trans_type varchar + trans_subtype varchar + trans_status varchar + department smallint + quantity double + scale tinyint + cost currency + unitPrice currency + total currency + regPrice currency + tax smallint + foodstamp tinyint + discount currency + memDiscount currency + discounttable tinyint + discounttype tinyint + voided tinyint + percentDiscount tinyint + ItemQtty double + volDiscType tinyint + volume tinyint + VolSpecial currency + mixMatch varchar + matched smallint + memType tinyint + staff tinyint + numflag int + charflag varchar + card_no int + trans_id int + +Depends on: + none + +Use: +Local table for suspending transactions if +server connection is temporarily unavailable +*/ +$CREATE['trans.suspended'] = duplicate_structure($dbms,'dtransactions','suspended'); + +?> diff --git a/pos/is4c-nf/install/sql/trans/suspendedtoday.php b/pos/is4c-nf/install/sql/trans/suspendedtoday.php new file mode 100644 index 000000000..468d49e80 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/suspendedtoday.php @@ -0,0 +1,25 @@ +<?php +/* +View: suspendedtoday + +Columns: + identical to dtransactions + +Depends on: + suspended (table) + +Use: +This view omits all entries in suspended +that aren't from the current day. Resuming +a transaction from a previous day wouldn't +necessarily cause problems, but "stale" +suspended transactions that never get resumed +could eventually make the list of available +transactions unwieldy. +*/ +$CREATE['trans.suspendedtoday'] = " + CREATE VIEW suspendedtoday AS + SELECT * FROM suspended WHERE " + .$con->datediff($con->now(),'datetime')." = 0 +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/taxView.php b/pos/is4c-nf/install/sql/trans/taxView.php new file mode 100644 index 000000000..ae6cb6272 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/taxView.php @@ -0,0 +1,87 @@ +<?php +/* +View: suspendedtoday + +Columns: + id int + description varchar + taxTotal currency + fsTaxable currency + fsTaxTotal currency + foodstampTender currency + taxrate float + +Depends on: + localtemptrans (table), taxrates (table), + lttsummary (view) + +Use: +This view is a revised, BETA way of dealing +with taxes. Rather than generate the tax total +(including foodstamp exemptions) with a series of +cascading views, this single view provides a +record for each available tax rate. Exemption +calculations then occur on the code side in a +far-easier-to-read imperative style. + +id is the tax rate's identifier and description +is it's description. + +taxTotal is the total tax due for this particular +rate. SUM(taxTotal) over the view would be the total +tax due with all rates. + +fsTaxable is the *retail* cost of goods taxed at this rate. +fsTaxTotal is tax due on those items at this rate. + +foodstampTender is the total amount tendered in foodstamps +for the transaction. This will be the same for all records +in this view and is provided as a convenience to avoid a +second look-up query. + +rate is this tax rate as a decimal - i.e., 1% is 0.01. + +---------------------------------------------- +In calculating exemptions, foodstampTender and fsTaxable +are important. If foodstampTender is >= fsTaxable then +all foodstampable, taxable items were purchased with foodstamps +and you can subtract fsTaxTotal from taxTotal. On the other +hand if foodstampTender is < fsTaxable then you should reduce +taxTotal by a proportional pro-rated amount. + +When dealing with multiple tax rates, it is important to +reduce foodstampTender each time it is used. The value in the +view is the same for all records and POS has to decide where +to apply that tender more than once. +*/ +$CREATE['trans.taxView'] = " + CREATE VIEW taxView AS + SELECT + r.id, + r.description, + CONVERT(SUM(CASE + WHEN l.trans_type IN ('I','D') AND discountable=0 THEN total + WHEN l.trans_type IN ('I','D') AND discountable<>0 THEN total * ((100-s.percentDiscount)/100) + ELSE 0 END + ) * r.rate, DECIMAL(10,2)) as taxTotal, + CONVERT(SUM(CASE + WHEN l.trans_type IN ('I','D') AND discountable=0 AND foodstamp=1 THEN total + WHEN l.trans_type IN ('I','D') AND discountable<>0 AND foodstamp=1 THEN total * ((100-s.percentDiscount)/100) + ELSE 0 END + ), DECIMAL(10,2)) as fsTaxable, + CONVERT(SUM(CASE + WHEN l.trans_type IN ('I','D') AND discountable=0 AND foodstamp=1 THEN total + WHEN l.trans_type IN ('I','D') AND discountable<>0 AND foodstamp=1 THEN total * ((100-s.percentDiscount)/100) + ELSE 0 END + ) * r.rate, DECIMAL(10,2)) as fsTaxTotal, + -1*MAX(fsTendered) as foodstampTender, + MAX(r.rate) as taxrate + FROM + taxrates AS r + LEFT JOIN localtemptrans AS l + ON r.id=l.tax + JOIN lttsummary AS s + WHERE trans_type <> 'L' + GROUP BY r.id,r.description +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/taxrates.php b/pos/is4c-nf/install/sql/trans/taxrates.php new file mode 100644 index 000000000..6d7d18a81 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/taxrates.php @@ -0,0 +1,23 @@ +<?php +/* +Table: taxrates + +Columns: + id int + rate float + description varchar + +Depends on: + none + +Use: +Local tax rates +*/ +$CREATE['trans.taxrates'] = " + CREATE TABLE taxrates ( + id INT, + rate FLOAT, + description VARCHAR(50), + PRIMARY KEY (id) + ) +"; diff --git a/pos/is4c-nf/install/sql/trans/valutecRequest.php b/pos/is4c-nf/install/sql/trans/valutecRequest.php new file mode 100644 index 000000000..05c953bec --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/valutecRequest.php @@ -0,0 +1,69 @@ +<?php +/* +Table: valutecRequest + +Columns: + date int + cashierNo int + laneNo int + transNo int + transID int + datetime datetime + identifier varchar + terminalID varchar + live tinyint + mode varchar + amount double + PAN varchar + manual tinyint + +Depends on: + none + +Use: +This table logs information that is +sent to a gift-card payment gateway. +All current paycard modules use this table +structure. Future ones don't necessarily have +to, but doing so may enable more code re-use. + +Some column usage may vary depending on a +given gateway's requirements and/or formatting, +but in general: + +cashierNo, laneNo, transNo, and transID are +equivalent to emp_no, register_no, trans_no, and +trans_id in dtransactions (respectively). + +mode indicates the type of transaction, such as +sale or balance check. Exact value can vary from gateway +to gateway. + +PAN is the cardnumber. Storing the whole thing +doesn't really matter for gift cards. + +manual indicates a typed-in card number. Otherwise, +the assumption is you sent track data. + +identifier and terminalID are historically related +to the Valutec gateway. Other modules can use +these fields for anything. +*/ +$CREATE['trans.valutecRequest'] = " + CREATE TABLE valutecRequest ( + date int, + cashierNo int, + laneNo int, + transNo int, + transID int, + datetime datetime, + identifier varchar(10), + terminalID varchar(20), + live tinyint, + mode varchar(32), + amount double, + PAN varchar(19), + manual tinyint + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/valutecRequestMod.php b/pos/is4c-nf/install/sql/trans/valutecRequestMod.php new file mode 100644 index 000000000..7b4b6e0f9 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/valutecRequestMod.php @@ -0,0 +1,73 @@ +<?php +/* +Table: valutecRequestMod + +Columns: + date int + cashierNo int + laneNo int + transNo int + transID int + datetime datetime + origAuthCode varchar + mode varchar + seconds float + commErr int + httpCode int + validResponse smallint + xAuthorized varchar + xAuthorizationCode varchar + xBalance varchar + xErrorMsg varchar + +Depends on: + valutecRequest (table) + +Use: +This table logs information that is +returned from a gift-card payment gateway +when modifying an earlier transaction. +Generally, this means some kind of void. +All current paycard modules use this table +structure. Future ones don't necessarily have +to, but doing so may enable more code re-use. + +Some column usage may vary depending on a +given gateway's requirements and/or formatting, +but in general: + +cashierNo, laneNo, transNo, and transID are +equivalent to emp_no, register_no, trans_no, and +trans_id in dtransactions (respectively). + +mode is the operation type. Exact syntax varies +by gateway. + +seconds, commErr, and httpCode are curl-related +entries noting how long the network request took +and errors that occurred, if any. + +the x* columns vary a lot. What to store here +depends what the gateway returns. +*/ +$CREATE['trans.valutecRequestMod'] = " + CREATE TABLE valutecRequestMod ( + date int, + cashierNo int, + laneNo int, + transNo int, + transID int, + datetime datetime, + origAuthCode varchar(9), + mode varchar(32), + seconds float, + commErr int, + httpCode int, + validResponse smallint, + xAuthorized varchar(5), + xAuthorizationCode varchar(9), + xBalance varchar(8), + xErrorMsg varchar(100) + ) +"; +?> diff --git a/pos/is4c-nf/install/sql/trans/valutecResponse.php b/pos/is4c-nf/install/sql/trans/valutecResponse.php new file mode 100644 index 000000000..dbac731f0 --- /dev/null +++ b/pos/is4c-nf/install/sql/trans/valutecResponse.php @@ -0,0 +1,67 @@ +<?php +/* +Table: valutecResponse + +Columns: + date int + cashierNo int + laneNo int + transNo int + transID int + datetime datetime + identifier varchar + seconds float + commErr int + httpCode int + validResponse smallint + xAuthorized varchar + xAuthorizationCode varchar + xBalance varchar + xErrorMsg varchar + +Depends on: + valutecRequest (table) + +Use: +This table logs information that is +returned from a gift-card payment gateway +after sending a [non-void] request. +All current paycard modules use this table +structure. Future ones don't necessarily have +to, but doing so may enable more code re-use. + +Some column usage may vary depending on a +given gateway's requirements and/or formatting, +but in general: + +cashierNo, laneNo, transNo, and transID are +equivalent to emp_no, register_no, trans_no, and +trans_id in dtransactions (respectively). + +seconds, commErr, and httpCode are curl-related +entries noting how long the network request took +and errors that occurred, if any. + +the x* columns vary a lot. What to store here +depends what the gateway returns. +*/ +$CREATE['trans.valutecResponse'] = " + CREATE TABLE valutecResponse ( + date int, + cashierNo int, + laneNo int, + transNo int, + transID int, + datetime datetime, + identifier varchar(10), + seconds float, + commErr int, + httpCode int, + validResponse smallint, + xAuthorized varchar(5), + xAuthorizationCode varchar(9), + xBalance varchar(8), + xErrorMsg varchar(100) + ) +"; +?> diff --git a/pos/is4c-nf/install/tabs.php b/pos/is4c-nf/install/tabs.php new file mode 100644 index 000000000..a9e714b58 --- /dev/null +++ b/pos/is4c-nf/install/tabs.php @@ -0,0 +1,15 @@ +<link rel="stylesheet" href="../css/install.css" /> +<div class="invertedshiftdown"> + <ul> + <li><a href="index.php">NECESSITIES</a></li> + <li><a href="extra_config.php">EXTRAS</a></li> + <li><a href="receipt.php">RECEIPT</a></li> + <li><a href="scanning.php">SCANNING</a></li> + <li><a href="security.php">SECURITY</a></li> + <li><a href="plugins.php">PLUGINS</a></li> + <li><a href="debug.php">DEBUG</a></li> + <li><a href="db-ini.php">SERVER INI</a></li> + <li><a href="extra_data.php">SAMPLE DATA</a></li> + </ul> +</div> +<br> diff --git a/pos/is4c-nf/install/upgrade-ini.php b/pos/is4c-nf/install/upgrade-ini.php new file mode 100644 index 000000000..7052a1ade --- /dev/null +++ b/pos/is4c-nf/install/upgrade-ini.php @@ -0,0 +1,74 @@ +<?php +include(realpath(dirname(__FILE__).'/../lib/AutoLoader.php')); +AutoLoader::LoadMap(); +include(realpath(dirname(__FILE__).'/../ini.php')); +include('util.php'); + +ini_set('display_errors','1'); + +$SILENT = isset($_REQUEST['quiet']) ? True : False; + +$db_local = Database::pDataConnect(); +$db_remote = Database::mDataConnect(); + +$msgs = ""; +$upgrades = array(); + +$stamp = $db_local->query("SELECT modified FROM lane_config"); +if (!$stamp){ + $msgs .= "There's a problem with the local database; can't upgrade"; +} +else { + $dt = array_pop($db_local->fetch_row($stamp)); + $chk = $db_remote->query("SELECT keycode,value FROM lane_config + WHERE modified >= '$dt'"); + if (!$chk){ + $msgs .= "There's a problem with the remote database"; + } + else { + while($row = $db_remote->fetch_row($chk)){ + $upgrades[$row["keycode"]] = unserialize($row['value']); + } + } +} + +if (!empty($msgs)){ + if (!$SILENT){ + echo "<b>Error</b>: ".$msgs; + } + else { + header("Location: ../login.php"); + } + exit; +} + +if (!empty($upgrades)){ + foreach($upgrades as $key => $val){ + if (is_array($val)){ + $str = "array("; + foreach($val as $v) + $str .= "'$v',"; + $str = rtrim($str,",").")"; + confsave($key,$str); + } + else if (is_string($val) || is_bool($val)){ + confsave($key,"'".$val."'"); + } + else + confsave($key,$val); + } + $db_local->query("UPDATE lane_config SET modified=".$db_local->now()); + $msgs .= "Upgrades to ini.php complete!"; +} +else { + $msgs .= "Settings are up to date!"; +} + +if (!$SILENT){ + echo $msgs; +} +else { + header("Location: ../login.php"); +} + +?> diff --git a/pos/is4c-nf/install/util.php b/pos/is4c-nf/install/util.php new file mode 100644 index 000000000..92e1310b6 --- /dev/null +++ b/pos/is4c-nf/install/util.php @@ -0,0 +1,375 @@ +<?php + +function whoami(){ + if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + return $chk['name']; + } + else + return get_current_user(); +} + +function check_writeable($filename, $optional=False, $template=False){ + $basename = basename($filename); + $failure = ($optional) ? 'blue' : 'red'; + $status = ($optional) ? 'Optional' : 'Warning'; + + if (!file_exists($filename) && !$optional && is_writable($filename)){ + $fp = fopen($filename,'w'); + if ($template !== False){ + switch($template){ + case 'PHP': + fwrite($fp,"<?php\n"); + fwrite($fp,"?>\n"); + break; + } + } + fclose($fp); + } + + if (!file_exists($filename)){ + echo "<span style=\"color:$failure;\"><b>$status</b>: $basename does not exist</span><br />"; + if (!$optional){ + echo "<b>Advice</b>: <div style=\"font-face:mono;background:#ccc;padding:8px;\"> + touch \"".realpath(dirname($filename))."/".basename($filename)."\"<br /> + chown ".whoami()." \"".realpath(dirname($filename))."/".basename($filename)."\"</div>"; + } + } + elseif (is_writable($filename)) + echo "<span style=\"color:green;\">$basename is writeable</span><br />"; + else { + echo "<span style=\"color:red;\"><b>Warning</b>: $basename is not writeable</span><br />"; + echo "<b>Advice</b>: <div style=\"font-face:mono;background:#ccc;padding:8px;\"> + chown ".whoami()." \"".realpath(dirname($filename))."/".basename($filename)."\"<br /> + chmod 600 \"".realpath(dirname($filename))."/".basename($filename)."\"</div>"; + } +} + +/** + Save entry to ini.php or ini-local.php + @param $key string key + @param $value string value + @param $prefer_local use ini-local if it exists + @return boolean success + + Values are written to a file and must be valid + PHP code. For example, a PHP string should include + single or double quote delimiters in $value. +*/ +function confsave($key,$value,$prefer_local=False){ + + // do nothing if page isn't a form submit (i.e. user didn't press save) + if ($_SERVER['REQUEST_METHOD'] !== 'POST') + return NULL; + + /* + Attempt to update settings in both ini.php and ini-local.php. + If found in both, return False if (and only if) ini-local.php + couldn't be set to the correct value. If not found in either, + add to whichever is writeable; if both writeable, respect the + $prefer_local setting. If neither is writeable, return False. + */ + + $path_global = '../ini.php'; + $path_local = '../ini-local.php'; + + $writeable_global = is_writable($path_global); + $writeable_local = is_writable($path_local); + + if (!$writeable_global && !$writeable_local) + return False; + + $found_global = $found_local = False; + $written_global = $written_local = False; + $added_global = $added_local = False; + + $orig_setting = '|\$CORE_LOCAL->set\([\'"]'.$key.'[\'"],\s*(.+)\);[\r\n]|'; + $new_setting = "\$CORE_LOCAL->set('{$key}',{$value}, True);\n"; + + $orig_global = file_get_contents($path_global); + if (strstr($orig_global,'<?php') === False) + $orig_global = "<?php\n".$orig_global; + $orig_local = $writeable_local ? file_get_contents($path_local) : ''; + if ($writeable_local && strstr($orig_local,'<?php') === False) + $orig_local = "<?php\n".$orig_local; + + $new_global = preg_replace($orig_setting, $new_setting, $orig_global, + -1, $found_global); + $new_local = preg_replace($orig_setting, $new_setting, $orig_local, + -1, $found_local); + if ($found_global) { + preg_match($orig_setting, $orig_global, $matches); + if ($matches[1] === $value.', True') // found with exact same value + $written_global = True; // no need to bother rewriting it + elseif ($writeable_global) + $written_global = file_put_contents($path_global, $new_global); + } + + if ($found_local) { + preg_match($orig_setting, $orig_local, $matches); + if ($matches[1] === $value.', True') // found with exact same value + $written_local = True; // no need to bother rewriting it + elseif ($writeable_local) { + $written_local = file_put_contents($path_local, $new_local); + } + } + + if ($found_local && !$written_local) + return False; // ini-local.php is overriding ini.php with bad data! + if ($written_global || $written_local){ + if ($written_global && $key != 'laneno') + conf_to_db($key, $value); + return True; // successfully written somewhere relevant + } + + if (!$found_global && !$found_local) { + $append_path = ($prefer_local? $path_local : $path_global); + $append_path = ($writeable_local? $append_path : $path_global); + $append_path = ($writeable_global? $append_path : $path_local); + } + elseif (!$found_local && $writeable_local) { + $append_path = $path_local; + } + if ($append_path === $path_global) { + $new_global = preg_replace("|(\?>)?\s*$|", $new_setting.'?>', $orig_global, + 1, $found_global); + $added_global = file_put_contents($append_path, $new_global); + } + else { + $new_local = preg_replace("|(\?>)?\s*$|", $new_setting.'?>', $orig_local, + 1, $found_local); + $added_local = file_put_contents($append_path, $new_local); + } + if ($added_global || $added_local){ + if ($added_global && $key != 'laneno') + conf_to_db($key, $value); + return True; // successfully appended somewhere relevant + } + + return False; // didn't manage to write anywhere! +} + +/** + Save value to opdata.lane_config + @param $key string key + @param $value string value + + Called automatically by confsave(). +*/ +function conf_to_db($key, $value){ + global $CORE_LOCAL; + $sql = db_test_connect($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('pDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); + if ($sql !== False){ + $q = $sql->prepare_statement("SELECT value FROM lane_config + WHERE keycode=?"); + $r = $sql->exec_statement($q, array($key)); + if ($r === False) return False; // old table format + if ($sql->num_rows($r) == 0){ + $ins = $sql->prepare_statement('INSERT INTO lane_config + (keycode, value) VALUES (?, ?)'); + $sql->exec_statement($ins, array($key, $value)); + } + else { + $up = $sql->prepare_statement('UPDATE lane_config SET + value=? WHERE keycode=?'); + $sql->exec_statement($up, array($value, $key)); + } + } +} + +/** + Rewrite ini.php with values from + opdata.lane_config +*/ +function write_conf_from_db(){ + global $CORE_LOCAL; + $sql = db_test_connect($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('pDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); + if ($sql !== False){ + $q = 'SELECT keycode, value FROM lane_config'; + $r = $sql->query($q); + while($w = $db->fetch_row($r)) + confsave($w['keycode'], $w['value']); + } +} + +/** + Copy values from opdata.lane_config to the + server's lane_config table. +*/ +function send_conf_to_server(){ + global $CORE_LOCAL; + $sql = db_test_connect($CORE_LOCAL->get('localhost'), + $CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('pDatabase'), + $CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); + $mine = array(); + if ($sql !== False){ + $q = 'SELECT keycode, value FROM lane_config'; + $r = $sql->query($q); + while($w = $sql->fetch_row($r)) + $mine[$w['keycode']] = $w['value']; + } + + $sql = db_test_connect($CORE_LOCAL->get('mServer'), + $CORE_LOCAL->get('mDBMS'), + $CORE_LOCAL->get('mDatabase'), + $CORE_LOCAL->get('mUser'), + $CORE_LOCAL->get('mPass')); + if ($sql !== False){ + $chk = $sql->prepare_statement('SELECT value FROM + lane_config WHERE keycode=?'); + $ins = $sql->prepare_statement('INSERT INTO lane_config + (keycode, value) VALUES (?, ?)'); + $up = $sql->prepare_statement('UPDATE lane_config SET + value=? WHERE keycode=?'); + foreach($mine as $key => $value){ + $exists = $sql->exec_statement($chk, array($key)); + if ($sql->num_rows($exists) == 0) + $sql->exec_statement($ins, array($key, $value)); + else + $sql->exec_statement($up, array($value, $key)); + } + } +} + +/** + Fetch values from the server's lane_config table + Write them to ini.php and opdata.lane_config. +*/ +function get_conf_from_server(){ + global $CORE_LOCAL; + $sql = db_test_connect($CORE_LOCAL->get('mServer'), + $CORE_LOCAL->get('mDBMS'), + $CORE_LOCAL->get('mDatabase'), + $CORE_LOCAL->get('mUser'), + $CORE_LOCAL->get('mPass')); + $theirs = array(); + if ($sql !== False){ + $q = 'SELECT keycode, value FROM lane_config'; + $r = $sql->query($q); + while($w = $sql->fetch_row($r)) + $theirs[$w['keycode']] = $w['value']; + } + + foreach($theirs as $key => $value){ + confsave($key, $value); + } +} + +function load_sample_data($sql, $table){ + if (file_exists("data/$table.sql")){ + $fp = fopen("data/$table.sql","r"); + while($line = fgets($fp)){ + $sql->query("INSERT INTO $table VALUES $line"); + } + fclose($fp); + } + else if (file_exists("data/$table.csv")){ + $path = realpath("data/$table.csv"); + $prep = $sql->prepare_statement("LOAD DATA LOCAL INFILE + '$path' + INTO TABLE $table + FIELDS TERMINATED BY ',' + ESCAPED BY '\\\\' + OPTIONALLY ENCLOSED BY '\"' + LINES TERMINATED BY '\\r\\n'"); + $sql->exec_statement($prep); + } +} + +function db_test_connect($host,$type,$db,$user,$pw){ + $sql = False; + try { + if ($type == 'mysql') + ini_set('mysql.connect_timeout',1); + elseif ($type == 'mssql') + ini_set('mssql.connect_timeout',1); + ob_start(); + $sql = @ new SQLManager($host,$type,$db,$user,$pw); + ob_end_clean(); + } + catch(Exception $ex) {} + + if ($sql === False || $sql->connections[$db] === False) + return False; + else + return $sql; +} + +/* query to create another table with the same + columns +*/ +function duplicate_structure($dbms,$table1,$table2){ + if (strstr($dbms,"MYSQL")){ + return "CREATE TABLE `$table2` LIKE `$table1`"; + } + elseif ($dbms == "MSSQL"){ + return "SELECT * INTO [$table2] FROM [$table1] WHERE 1=0"; + } +} + +function create_if_needed($con, $dbms, $db_name, $table_name, $stddb, &$errors=array()){ + if ($con->table_exists($table_name,$db_name)) return $errors; + $dbms = strtoupper($dbms); + + $fn = dirname(__FILE__)."/sql/$stddb/$table_name.php"; + if (!file_exists($fn)){ + $errors[] = array( + 'struct'=>$table_name, + 'query'=>'n/a', + 'details'=>'Missing file: '.$fn, + 'important'=>True + ); + return $errors; + } + + include($fn); + if (!isset($CREATE["$stddb.$table_name"])){ + $errors[] = array( + 'struct'=>$table_name, + 'query'=>'n/a', + 'details'=>'No valid $CREATE in: '.$fn, + 'important'=>True + ); + return $errors; + } + + return db_structure_modify($con, $table_name, $CREATE["$stddb.$table_name"], $errors); +} + +function db_structure_modify($sql, $struct_name, $query, &$errors=array()){ + ob_start(); + $try = @$sql->query($query); + ob_end_clean(); + if ($try === False){ + if (stristr($query, "DROP ") && stristr($query,"VIEW ")){ + /* suppress unimportant errors + $errors[] = array( + 'struct' => $struct_name, + 'query' => $query, + 'important' => False + ); + */ + } + else { + $errors[] = array( + 'struct'=>$struct_name, + 'query'=>$query, + 'details'=>$sql->error(), + 'important'=>True + ); + } + } + return $errors; +} + +?> diff --git a/pos/is4c-nf/js/CustomerDisplay.js b/pos/is4c-nf/js/CustomerDisplay.js new file mode 100644 index 000000000..7029367f4 --- /dev/null +++ b/pos/is4c-nf/js/CustomerDisplay.js @@ -0,0 +1,3 @@ +var customerWin = window.open('http://localhost/customer-base.php', + 'Customer_Display'); +// 'width=400,height=300'); diff --git a/pos/is4c-nf/js/Letters.js b/pos/is4c-nf/js/Letters.js new file mode 100644 index 000000000..051695147 --- /dev/null +++ b/pos/is4c-nf/js/Letters.js @@ -0,0 +1,76 @@ + +var LD_ParentField = null; + +function LD_show(pf){ + LD_ParentField = pf; + + if (top.main_frame.document.getElementById('letterpad')){ + top.main_frame.document.getElementById('letterpad').style.display = 'block'; + } + else { + top.main_frame.document.body.innerHTML += LD_drawtable(); + } +} + +function LD_hide(){ + top.main_frame.document.getElementById('letterpad').style.display='none'; + LD_ParentField = null; +} + +function LD_drawtable(){ + var ret = "<table id=letterpad><tr>"; + ret += "<td onclick=\"top.LD_doTask('q');\">Q</td>"; + ret += "<td onclick=\"top.LD_doTask('w');\">W</td>"; + ret += "<td onclick=\"top.LD_doTask('e');\">E</td>"; + ret += "<td onclick=\"top.LD_doTask('r');\">R</td>"; + ret += "<td onclick=\"top.LD_doTask('t');\">T</td>"; + ret += "<td onclick=\"top.LD_doTask('y');\">Y</td>"; + ret += "<td onclick=\"top.LD_doTask('u');\">U</td>"; + ret += "<td onclick=\"top.LD_doTask('i');\">I</td>"; + ret += "<td onclick=\"top.LD_doTask('o');\">O</td>"; + ret += "<td onclick=\"top.LD_doTask('p');\">P</td>"; + ret += "</tr><tr>"; + ret += "<td onclick=\"top.LD_doTask('a');\">A</td>"; + ret += "<td onclick=\"top.LD_doTask('s');\">S</td>"; + ret += "<td onclick=\"top.LD_doTask('d');\">D</td>"; + ret += "<td onclick=\"top.LD_doTask('f');\">F</td>"; + ret += "<td onclick=\"top.LD_doTask('g');\">G</td>"; + ret += "<td onclick=\"top.LD_doTask('h');\">H</td>"; + ret += "<td onclick=\"top.LD_doTask('j');\">J</td>"; + ret += "<td onclick=\"top.LD_doTask('k');\">K</td>"; + ret += "<td onclick=\"top.LD_doTask('l');\">L</td>"; + ret += "<td onclick=\"top.LD_doTask('back');\">&lt;</td>"; + ret += "</tr><tr>"; + ret += "<td onclick=\"top.LD_doTask('z');\">Z</td>"; + ret += "<td onclick=\"top.LD_doTask('x');\">X</td>"; + ret += "<td onclick=\"top.LD_doTask('c');\">C</td>"; + ret += "<td onclick=\"top.LD_doTask('v');\">V</td>"; + ret += "<td onclick=\"top.LD_doTask('b');\">B</td>"; + ret += "<td onclick=\"top.LD_doTask('n');\">N</td>"; + ret += "<td onclick=\"top.LD_doTask('m');\">M</td>"; + ret += "<td colspan=2 onclick=\"top.LD_doTask(' ');\">&nbsp;</td>"; + ret += "<td onclick=\"top.LD_doTask('clear');\">[X]</td>"; + ret += "</tr><tr>"; + ret += "</tr></table>"; + return ret; +} + +function LD_doTask(str){ + var val; + switch(str){ + case 'clear': + LD_hide(); + break; + case 'back': + val = LD_ParentField.value; + if (val.length > 0){ + val = val.substring(0,val.length-1); + LD_ParentField.value = val; + } + break; + default: + val = LD_ParentField.value; + val += str; + LD_ParentField.value = val; + } +} diff --git a/pos/is4c-nf/js/Numbers.css b/pos/is4c-nf/js/Numbers.css new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/js/Numbers.js b/pos/is4c-nf/js/Numbers.js new file mode 100644 index 000000000..fa196b533 --- /dev/null +++ b/pos/is4c-nf/js/Numbers.js @@ -0,0 +1,63 @@ + +var ParentField = null; + +function ND_show(pf){ + ParentField = pf; + + if (top.main_frame.document.getElementById('numpad')){ + top.main_frame.document.getElementById('numpad').style.display = 'block'; + } + else { + top.main_frame.document.body.innerHTML += drawtable(); + } +} + +function ND_hide(){ + top.main_frame.document.getElementById('numpad').style.display='none'; + ParentField = null; +} + +function drawtable(){ + var ret = "<table id=numpad><tr>"; + ret += "<td onclick=\"top.doTask('7');\">7</td>"; + ret += "<td onclick=\"top.doTask('8');\">8</td>"; + ret += "<td onclick=\"top.doTask('9');\">9</td>"; + ret += "</tr><tr>"; + ret += "<td onclick=\"top.doTask('4');\">4</td>"; + ret += "<td onclick=\"top.doTask('5');\">5</td>"; + ret += "<td onclick=\"top.doTask('6');\">6</td>"; + ret += "</tr><tr>"; + ret += "<td onclick=\"top.doTask('1');\">1</td>"; + ret += "<td onclick=\"top.doTask('2');\">2</td>"; + ret += "<td onclick=\"top.doTask('3');\">3</td>"; + ret += "</tr><tr>"; + ret += "<td onclick=\"top.doTask('0');\">0</td>"; + ret += "<td onclick=\"top.doTask('.');\">.</td>"; + ret += "<td onclick=\"top.doTask('00');\">00</td>"; + ret += "</tr><tr>"; + ret += "<td onclick=\"top.doTask('*');\">*</td>"; + ret += "<td onclick=\"top.doTask('back');\">&lt;</td>"; + ret += "<td onclick=\"top.doTask('clear');\">[X]</td>"; + ret += "</tr></table>"; + return ret; +} + +function doTask(str){ + var val; + switch(str){ + case 'clear': + ND_hide(); + break; + case 'back': + val = ParentField.value; + if (val.length > 0){ + val = val.substring(0,val.length-1); + ParentField.value = val; + } + break; + default: + val = ParentField.value; + val += str; + ParentField.value = val; + } +} diff --git a/pos/is4c-nf/js/ajax-parser.js b/pos/is4c-nf/js/ajax-parser.js new file mode 100644 index 000000000..37a77b4c2 --- /dev/null +++ b/pos/is4c-nf/js/ajax-parser.js @@ -0,0 +1,91 @@ +var CORE_JS_PREFIX = ""; + +function runParser(input_str,rel_prefix){ + CORE_JS_PREFIX = rel_prefix; + $.ajax({ + url: CORE_JS_PREFIX+'ajax-callbacks/ajax-parser.php', + type: 'GET', + data: "input="+input_str, + dataType: "json", + cache: false, + error: parserError, + success: parserHandler + }); +} + +function parserError(xml_ro,st,err){ +} + +function parserHandler(data,status_str,xml_ro){ + if (data.main_frame){ + location = data.main_frame; + return; + } + else { + if (data.output) + $(data.target).html(data.output); + } + + if (data.redraw_footer){ + /* + $.ajax({ + url: CORE_JS_PREFIX+'ajax-callbacks/ajax-footer.php', + type: 'GET', + cache: false, + success: function(data){ + $('#footer').html(data); + } + }); + */ + $('#footer').html(data.redraw_footer); + } + + if (data.scale){ + /* + $.ajax({ + url: CORE_JS_PREFIX+'ajax-callbacks/ajax-scale.php', + type: 'get', + data: 'input='+data.scale, + cache: false, + success: function(res){ + $('#scaleBottom').html(res); + } + }); + */ + $('#scaleBottom').html(data.scale); + } + + if (data.term){ + $('#scaleIconBox').html(data.term); + } + + if (data.receipt){ + $.ajax({ + url: CORE_JS_PREFIX+'ajax-callbacks/ajax-end.php', + type: 'GET', + data: 'receiptType='+data.receipt, + dataType: 'json', + cache: false, + success: function(data){ + if (data.sync){ + ajaxTransactionSync(CORE_JS_PREFIX); + } + } + }); + } + + if (data.retry){ + setTimeout("runParser('"+data.retry+"','"+CORE_JS_PREFIX+"');",150); + } +} + +function ajaxTransactionSync(rel_prefix){ + $.ajax({ + url: rel_prefix+'ajax-callbacks/ajax-transaction-sync.php', + type: 'GET', + cache: false, + success: function(data){ + } + }); + +} diff --git a/pos/is4c-nf/js/jquery.js b/pos/is4c-nf/js/jquery.js new file mode 100644 index 000000000..83589daa7 --- /dev/null +++ b/pos/is4c-nf/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v1.8.3 jquery.com | jquery.org/license */ +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/pos/is4c-nf/js/poll-scale.js b/pos/is4c-nf/js/poll-scale.js new file mode 100644 index 000000000..7bdce6571 --- /dev/null +++ b/pos/is4c-nf/js/poll-scale.js @@ -0,0 +1,43 @@ +var SCALE_REL_PRE = ""; + +function pollScale(rel_prefix){ + SCALE_REL_PRE = rel_prefix; + $.ajax({url: SCALE_REL_PRE+'ajax-callbacks/ajax-poll-scale.php', + type: 'post', + cache: false, + dataType: 'json', + error: scalePollError, + success: scalePollSuccess + }); +} + +function scalePollError(e1,e2,e3){ + rePoll(); +} + +function scalePollSuccess(data){ + if (data){ + if (data.scale){ + $('#scaleBottom').html(data.scale); + } + + if (data.scans && data.scans.indexOf && data.scans.indexOf(':') !== -1){ + // data from the cc terminal + // run directly; don't include user input + if (typeof runParser == 'function') + runParser(data.scans, SCALE_REL_PRE); + } + else if ($('#reginput').length != 0 && data.scans){ + // barcode scan input + var v = $('#reginput').val(); + parseWrapper(v+data.scans); + //return; // why is this here? scale needs to keep polling... + } + } + rePoll(); +} + +function rePoll(){ + var timeout = 100; + setTimeout("pollScale('"+SCALE_REL_PRE+"')",timeout); +} diff --git a/pos/is4c-nf/lib/Authenticate.php b/pos/is4c-nf/lib/Authenticate.php new file mode 100644 index 000000000..baeaa121a --- /dev/null +++ b/pos/is4c-nf/lib/Authenticate.php @@ -0,0 +1,171 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class Authenticate + Functions for user authentication +*/ +class Authenticate extends LibraryClass { + + +/** + Authenticate an employee by password + @param $password password from employee table + @param $activity activity identifier to log + @return True or False + + If no one is currently logged in, any valid + password will be accepted. If someone is logged + in, then only passwords for that user <i>or</i> + a user with frontendsecurity >= 30 in the + employee table will be accepted. +*/ +static public function check_password($password,$activity=1){ + global $CORE_LOCAL; + + $password = strtoupper($password); + $password = str_replace("'", "", $password); + $password = str_replace(",", "", $password); + $paswword = str_replace("+", "", $password); + + if ($password == "TRAINING") $password = 9999; // if password is training, change to '9999' + + if (!is_numeric($password)) return False; // if password is non-numeric, not a valid password + elseif ($password < 1) return False; // if password is less than 1, not a valid password + + $query_g = "select LoggedIn,CashierNo from globalvalues"; + $db_g = Database::pDataConnect(); + $result_g = $db_g->query($query_g); + $row_g = $db_g->fetch_array($result_g); + $password = $db_g->escape($password); + + if ($row_g["LoggedIn"] == 0) { + $query_q = "select emp_no, FirstName, LastName, " + .$db_g->yeardiff($db_g->now(),'birthdate')." as age " + ."from employees where EmpActive = 1 " + ."and CashierPassword = '".$password."'"; + $result_q = $db_g->query($query_q); + $num_rows_q = $db_g->num_rows($result_q); + + if ($num_rows_q > 0) { + $row_q = $db_g->fetch_array($result_q); + + Database::loadglobalvalues(); + + $transno = Database::gettransno($row_q["emp_no"]); + $globals = array( + "CashierNo" => $row_q["emp_no"], + "Cashier" => $row_q["FirstName"]." ".substr($row_q["LastName"], 0, 1).".", + "TransNo" => $transno, + "LoggedIn" => 1 + ); + Database::setglobalvalues($globals); + + CoreState::cashier_login($transno, $row_q['age']); + + if ($transno == 1) TransRecord::addactivity($activity); + + } elseif ($password == 9999) { + Database::loadglobalvalues(); + + $transno = Database::gettransno(9999); + $globals = array( + "CashierNo" => 9999, + "Cashier" => "Training Mode", + "TransNo" => $transno, + "LoggedIn" => 1 + ); + Database::setglobalvalues($globals); + + CoreState::cashier_login($transno, 0); + } + else return False; + } + else { + // longer query but simpler. since someone is logged in already, + // only accept password from that person OR someone with a high + // frontendsecurity setting + $query_a = "select emp_no, FirstName, LastName, " + .$db_g->yeardiff($db_g->now(),'birthdate')." as age " + ."from employees " + ."where EmpActive = 1 and " + ."(frontendsecurity >= 30 or emp_no = ".$row_g["CashierNo"].") " + ."and (CashierPassword = '".$password."' or AdminPassword = '".$password."')"; + + $result_a = $db_g->query($query_a); + + $num_rows_a = $db_g->num_rows($result_a); + + if ($num_rows_a > 0) { + + Database::loadglobalvalues(); + $row = $db_g->fetch_row($result_a); + CoreState::cashier_login(False, $row['age']); + } + elseif ($row_g["CashierNo"] == "9999" && $password == "9999"){ + Database::loadglobalvalues(); + CoreState::cashier_login(False, 0); + } + else return False; + } + + return True; +} + +/** + Authentication function for Wedge NoSale page + @param $password the password + @return True or False + @deprecated +*/ +static public function ns_check_password($password){ + global $CORE_LOCAL; + + $password = strtoupper(trim($password)); + if ($password == "TRAINING") + $password = 9999; + + if (!is_numeric($password)) + return False; + elseif ($password > "9999" || $password < "1") + return False; + elseif (empty($password)) + return False; + + $db = Database::pDataConnect(); + $query2 = "select emp_no, FirstName, LastName from employees where empactive = 1 and " + ."frontendsecurity >= 11 and (cashierpassword = ".$password." or adminpassword = " + .$password.")"; + $result2 = $db->query($query2); + $num_row2 = $db->num_rows($result2); + + if ($num_row2 > 0) { + ReceiptLib::drawerKick(); + return True; + } + return False; +} + +} // end class Authenticate + +?> diff --git a/pos/is4c-nf/lib/AutoLoader.php b/pos/is4c-nf/lib/AutoLoader.php new file mode 100755 index 000000000..9fa8d84db --- /dev/null +++ b/pos/is4c-nf/lib/AutoLoader.php @@ -0,0 +1,245 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!isset($CORE_LOCAL)) include_once(dirname(__FILE__).'/LocalStorage/conf.php'); + +/** + @class LibraryClass + Class for defining library functions. + All methods should be static. + + This exists to make documented hierarchy + more sensible. +*/ +class LibraryClass { +} + +/** + @class AutoLoader + Map available modules and register automatic + class loading +*/ +class AutoLoader extends LibraryClass { + + /** + Autoload class by name + @param $name class name + */ + static public function LoadClass($name){ + global $CORE_LOCAL; + $map = $CORE_LOCAL->get("ClassLookup"); + if (!is_array($map)) return; + + if (isset($map[$name]) && !file_exists($map[$name])){ + // file is missing. + // rebuild map to see if the class is + // gone or the file just moved + self::LoadMap(); + $map = $CORE_LOCAL->get("ClassLookup"); + if (!is_array($map)) return; + } + else if (!isset($map[$name])){ + // class is unknown + // rebuild map to see if the definition + // file has been added + self::LoadMap(); + $map = $CORE_LOCAL->get("ClassLookup"); + if (!is_array($map)) return; + } + + if (isset($map[$name]) && !class_exists($name,False) + && file_exists($map[$name])){ + + include_once($map[$name]); + } + } + + /** + Map available classes. Class names should + match filenames for lookups to work. + */ + static public function LoadMap(){ + global $CORE_LOCAL; + $class_map = array(); + $search_path = realpath(dirname(__FILE__).'/../'); + self::RecursiveLoader($search_path, $class_map); + $CORE_LOCAL->set("ClassLookup",$class_map); + } + + /** + Get a list of available modules with the + given base class + @param $base_class string class name + @param $include_base whether base class should be included + in the return value + @return an array of class names + */ + static public function ListModules($base_class, $include_base=False){ + $ret = array(); + + // lookup plugin modules, then standard modules + $map = Plugin::PluginMap(); + switch($base_class){ + case 'DiscountType': + $path = realpath(dirname(__FILE__).'/Scanning/DiscountTypes'); + $map = Plugin::PluginMap($path,$map); + break; + case 'FooterBox': + $path = realpath(dirname(__FILE__).'/FooterBoxes'); + $map = Plugin::PluginMap($path,$map); + break; + case 'Kicker': + $path = realpath(dirname(__FILE__).'/Kickers'); + $map = Plugin::PluginMap($path,$map); + break; + case 'Parser': + $path = realpath(dirname(__FILE__).'/../parser-class-lib/parse'); + $map = Plugin::PluginMap($path,$map); + break; + case 'PreParser': + $path = realpath(dirname(__FILE__).'/../parser-class-lib/preparse'); + $map = Plugin::PluginMap($path,$map); + break; + case 'PriceMethod': + $path = realpath(dirname(__FILE__).'/Scanning/PriceMethods'); + $map = Plugin::PluginMap($path,$map); + break; + case 'SpecialUPC': + $path = realpath(dirname(__FILE__).'/Scanning/SpecialUPCs'); + $map = Plugin::PluginMap($path,$map); + break; + case 'SpecialDept': + $path = realpath(dirname(__FILE__).'/Scanning/SpecialDepts'); + $map = Plugin::PluginMap($path,$map); + break; + case 'TenderModule': + $path = realpath(dirname(__FILE__).'/Tenders'); + $map = Plugin::PluginMap($path,$map); + break; + case 'TenderReport': + $path = realpath(dirname(__FILE__).'/ReceiptBuilding/TenderReports'); + $map = Plugin::PluginMap($path,$map); + break; + case 'DefaultReceiptDataFetch': + $path = realpath(dirname(__FILE__).'/ReceiptBuilding/ReceiptDataFetch'); + $map = Plugin::PluginMap($path,$map); + break; + case 'DefaultReceiptFilter': + $path = realpath(dirname(__FILE__).'/ReceiptBuilding/ReceiptFilter'); + $map = Plugin::PluginMap($path,$map); + break; + case 'DefaultReceiptSort': + $path = realpath(dirname(__FILE__).'/ReceiptBuilding/ReceiptSort'); + $map = Plugin::PluginMap($path,$map); + break; + case 'DefaultReceiptTag': + $path = realpath(dirname(__FILE__).'/ReceiptBuilding/ReceiptTag'); + $map = Plugin::PluginMap($path,$map); + break; + case 'ProductSearch': + $path = realpath(dirname(__FILE__).'/Search/Products'); + $map = Plugin::PluginMap($path,$map); + break; + case 'DiscountModule': + $map['DiscountModule'] = realpath(dirname(__FILE__).'/DiscountModule.php'); + break; + case 'MemberLookup': + $map['MemberLookup'] = realpath(dirname(__FILE__).'/MemberLookup.php'); + break; + } + + foreach($map as $name => $file){ + + // matched base class + if ($name === $base_class){ + if ($include_base) $ret[] = $name; + continue; + } + + ob_start(); + if (!class_exists($name)){ + ob_end_clean(); + continue; + } + + if (strstr($file,'plugins')){ + $parent = Plugin::MemberOf($file); + if ($parent && Plugin::IsEnabled($parent) && is_subclass_of($name,$base_class)) + $ret[] = $name; + else if ($base_class=="Plugin" && is_subclass_of($name,$base_class)) + $ret[] = $name; + } + else { + if (is_subclass_of($name,$base_class)) + $ret[] = $name; + } + ob_end_clean(); + } + + return $ret; + } + + /** + Helper function to walk through file structure + @param $path starting path + @param $map array of class name => file + @return $map (by reference) + */ + static private function RecursiveLoader($path,&$map=array()){ + if(!is_dir($path)) return $map; + + $dh = opendir($path); + while($dh && ($file=readdir($dh)) !== False){ + if ($file[0] == ".") continue; + $fullname = realpath($path."/".$file); + if (is_dir($fullname) && $file != "gui-modules"){ + self::RecursiveLoader($fullname, $map); + } + else if (substr($file,-4) == '.php'){ + $class = substr($file,0,strlen($file)-4); + $map[$class] = $fullname; + } + } + closedir($dh); + } + +} + +if (function_exists('spl_autoload_register')){ + spl_autoload_register(array('AutoLoader','LoadClass')); +} +else { + function __autoload($name){ + AutoLoader::LoadClass($name); + } +} + +/** internationalization */ +/* +setlocale(LC_MESSAGES, "en_US.UTF-8"); +bindtextdomain("pos-nf",realpath(dirname(__FILE__).'/../locale')); +bind_textdomain_codeset("pos-nf","UTF-8"); +textdomain("pos-nf"); + */ + +?> diff --git a/pos/is4c-nf/lib/Bitmap.php b/pos/is4c-nf/lib/Bitmap.php new file mode 100755 index 000000000..4ad4e7662 --- /dev/null +++ b/pos/is4c-nf/lib/Bitmap.php @@ -0,0 +1,670 @@ +<?php +/* +Bitmap.class.php +version 1 (2009-09-24) +author Alex Frase + +References + http://en.wikipedia.org/wiki/BMP_file_format + http://atlc.sourceforge.net/bmp.html + http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization +*/ + +class Bitmap { + + var $DIB1; + var $DIB2; + var $DIB3; + var $DIB4; + var $DIB5; + + var $error; + + var $magic; + var $dibVersion; + var $width; + var $height; + var $bpp; // bits per pixel + var $hppm; // horiz. pixels per meter + var $vppm; // vert. pixels per meter + var $palSize; + var $palSizeImp; + var $palette; + var $image; + var $rowBytes; + + + /* + * INTERNAL METHODS + */ + + function ReturnError($err=null, $ret=null) { + $this->error = is_string($err) ? $err : "Unknown error"; + return $ret; + } // ReturnError() + + function ParseInt($data, $left=0, $right=-1, $signed=false, $bigEndian=false) { + if (is_string($data)) { + $isarray = false; + if ($right < 0) + $right = strlen($data) - 1; + } else if (is_array($data)) { + $isarray = true; + $data = array_values($data); + if ($right < 0) + $right = count($data) - 1; + } else { + return null; + } + if ($right < $left) + return null; + // set traversal range and direction + $start = $bigEndian ? $right : $left; + $end = $bigEndian ? $left : $right; + $delta = $bigEndian ? -1 : 1; + // process bytes + $n = $start; + $val = $isarray ? (int)$data[$n] : ord($data[$n]); + $factor = 256; + while ($n != $end) { + $n += $delta; + $val += $factor * ($isarray ? (int)$data[$n] : ord($data[$n])); + $factor <<= 8; // *= 256 + } + // check sign bit + if ($signed && (($isarray ? (int)$data[$end] : ord($data[$end])) & 0x80)) + $val = -$factor + $val; + // done + return $val; + } // ParseInt() + + function RenderInt($val, $bytes, $signed=false, $bigEndian=false) { + $val = (int)$val; + $bytes = (int)$bytes; + $range = pow(2, $bytes * 8); + $neg = false; + if ($signed && $val < 0) + $val = (~ (-$val)) + 1; + // set traversal range and direction + $start = $bigEndian ? ($bytes - 1) : 0; + $end = $bigEndian ? 0 : ($bytes - 1); + $delta = $bigEndian ? -1 : 1; + // set bytes + $data = str_repeat("\x00", $bytes); + for ($n = $start; $n != $end; $n += $delta) { + $data[$n] = chr($val & 0xFF); + $val >>= 8; // /= 256 + } + // done + return $data; + } // RenderInt() + + + function LastError($reset=true) { + $err = $this->error; + if ($reset) + $this->error = null; + return $err; + } // LastError() + + function Load($filename, $filedata=null) { + $data = ""; + if ($filename === true) { + $data = $filedata; + } else { + $data = file_get_contents($filename); + if (!$data) + return $this->ReturnError("Load(): failed reading file \"".$filename."\""); + } + $datasize = strlen($data); + + // read the BMP header + + if ($datasize < 18) + return $this->ReturnError("Load(): incomplete BMP header (file is ".$datasize." bytes)"); + $magic = substr($data, 0, 2); + $fileSize = $this->ParseInt($data, 2, 5); + // bytes 6-9 are unused (application specific) + $imageAt = $this->ParseInt($data, 10, 13); + + // validate the BMP header + + switch ($magic) { + case "BM": // Windows 3.1x, 95, NT, ... + case "BA": // OS/2 Bitmap Array + case "CI": // OS/2 Color Icon + case "CP": // OS/2 Color Pointer + case "IC": // OS/2 Icon + case "PT": // OS/2 Pointer + break; + default: + return $this->ReturnError("Load(): unknown magic numbers \"".dechex(ord($magic[0]))." ".dechex(ord($magic[1]))."\""); + } + if ($fileSize != $datasize) + return $this->ReturnError("Load(): incorrect file size (".$fileSize." reported, ".$datasize." actual)"); + + // read the DIB header + + $headerSize = $this->ParseInt($data, 14, 17); + if ($datasize < (14 + $headerSize)) + return $this->ReturnError("Load(): incomplete DIB header (file is ".$datasize." bytes)"); + switch ($headerSize) { + case $this->DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + $width = $this->ParseInt($data, 18, 19); + $height = $this->ParseInt($data, 20, 21); + $colorPlanes = $this->ParseInt($data, 22, 23); + $bpp = $this->ParseInt($data, 24, 25); + if ($bpp == 16 || $bpp == 32) // not supported in this header + return $this->ReturnError("Load(): ".$bpp." bits-per-pixel invalid in V1 header"); + $compression = 0; + $imgDataSize = null; + $hppm = null; + $vppm = null; + $palSize = 0; + $palSizeImp = 0; + break; + + case $this->DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $width = $this->ParseInt($data, 18, 21, true); + $height = $this->ParseInt($data, 22, 25, true); + $colorPlanes = $this->ParseInt($data, 26, 27); + $bpp = $this->ParseInt($data, 28, 29); + $compression = $this->ParseInt($data, 30, 33); + $imgDataSize = $this->ParseInt($data, 34, 37); + $hppm = $this->ParseInt($data, 38, 41, true); + $vppm = $this->ParseInt($data, 42, 45, true); + $palSize = $this->ParseInt($data, 46, 49); + $palSizeImp = $this->ParseInt($data, 50, 53); + break; + + // TODO: more header formats + + default: + return $this->ReturnError("Load(): unknown DIB header size (".$headerSize." bytes)"); + } + + // validate the DIB header + + if ($width < 1) + return $this->ReturnError("Load(): invalid image width ".$width); + if ($height == 0) // height can be negative, meaning data is top-to-bottom instead of bottom-to-top + return $this->ReturnError("Load(): invalid image height ".$height); + if ($colorPlanes != 1) + return $this->ReturnError("Load(): invalid color plane count ".$colorPlanes); + if ($bpp != 1 && $bpp != 4 && $bpp != 8 && $bpp != 16 && $bpp != 24 && $bpp != 32) + return $this->ReturnError("Load(): invalid bits-per-pixel ".$bpp); + switch ($compression) { + case 0: // BI_RGB (uncompressed) + break; + case 1: // BI_RLE8 (RLE; 8 bpp only) + case 2: // BI_RLE4 (RLE; 4 bpp only) + case 3: // BI_BITFIELDS (bitfield; 16 and 32 bpp only) + case 4: // BI_JPEG (JPEG) + case 5: // BI_PNG (PNG) + // TODO: support compression? + return $this->ReturnError("Load(): image data compression not supported"); + default: + return $this->ReturnError("Load(): invalid compression code ".$compression); + } + $rowDataSize = (int)((($width * $bpp) + 31) / 32) * 4; + if ($imgDataSize === null || $imgDataSize === 0) + $imgDataSize = abs($height) * $rowDataSize; + else if ($imgDataSize != (abs($height) * $rowDataSize)){ + /** modification by Andy 09Aug13 + I think this makes more sense and it's incorrect + to assume all zero bytes at the end of the + image are padding **/ + $padding = $imgDataSize % 4; + if ($padding > 0){ + $imgDataSize -= $padding; + $data = substr($data,0,strlen($data)-$padding); + } + /* previous method for removing padding + while(ord($data[strlen($data)-1])===0){ + $imgDataSize--; + $data = substr($data,0,strlen($data)-1); + } + */ + if($imgDataSize != (abs($height) * $rowDataSize)) + return $this->ReturnError("Load(): incorrect image data size (".$imgDataSize." reported, ".(abs($height) * $rowDataSize)." expected)"); + } + if ($hppm !== null && $hppm <= 0) + return $this->ReturnError("Load(): invalid horizontal pixels-per-meter ".$hppm); + if ($vppm !== null && $vppm <= 0) + return $this->ReturnError("Load(): invalid vertical pixels-per-meter ".$hppm); + + // read the palette + + if (!$palSize && $bpp < 16) + $palSize = pow(2, $bpp); + if ($palSize) { + $palColorSize = ($headerSize == $this->DIB1) ? 3 : 4; + $palDataSize = $palSize * $palColorSize; + if ($datasize < (14 + $headerSize + $palDataSize)) + return $this->ReturnError("Load(): incomplete palette (file is ".$datasize." bytes)"); + $palette = substr($data, 14 + $headerSize, $palDataSize); + if ($palColorSize < 4) { + // pad each palette color to 4 bytes for simpler lookup (remember "." doesn't match newline, hence "|\\n") + $palette = preg_replace('/(.|\\n){'.$palColorSize.'}/', '\\1'.str_repeat("\x00",(4-$palColorSize)), $palette); + } + } else { + $palColorSize = 0; + $palDataSize = 0; + $palette = null; + } + + // read the image + + if ($datasize < ($imageAt + $imgDataSize)) + return $this->ReturnError("Load(): incomplete image (file is ".$datasize." bytes)"); + $image = substr($data, $imageAt, $imgDataSize); + $rowBytes = (int)((($width * $bpp) + 7) / 8); + if ($rowBytes > $rowDataSize) + return $this->ReturnError("Load(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + if ($rowBytes < $rowDataSize) { + // strip off word-alignment padding (remember "." doesn't match newline, hence "|\\n") + $image = preg_replace('/((?:.|\\n){'.$rowBytes.'})((?:.|\\n){'.($rowDataSize-$rowBytes).'})/', '\\1', $image); + } + if ($height < 0) { + $height = abs($height); + } else { + // flip image rows vertically (BMPs are stored upside-down by default) + $str_split = array(); + $val = ""; + for($i=0; $i<strlen($image); $i++){ + if ($i % $rowBytes == 0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $image[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + $image = implode('', array_reverse($str_split)); + } + + // initialize the object + + $this->magic = $magic; + $this->dibVersion = $headerSize; + $this->width = $width; + $this->height = $height; + $this->bpp = $bpp; + $this->rowBytes = $rowBytes; + $this->hppm = $hppm; + $this->vppm = $vppm; + $this->palSize = $palSize; + $this->palSizeImp = $palSizeImp; + $this->palette = $palette; + $this->image = $image; + + // all done + return true; + } // Load() + + + /* + * OBJECT METHODS + */ + + function Bitmap($width=1, $height=1, $bpp=1, $dpi=72) { + $this->DIB1 = 12; + $this->DIB2 = 64; + $this->DIB3 = 40; + $this->DIB4 = 108; + $this->DIB5 = 124; + + $this->error = null; + + if (!is_numeric($width) || (int)$width < 1) + die('Bitmap width must be at least 1'); + if (!is_numeric($height) || (int)$height < 1) + die('Bitmap height must be at least 1'); + if (!is_numeric($bpp) || (int)$bpp != 1) + die('Color bitmaps not yet supported'); + if (!is_numeric($dpi) || (int)$dpi < 1) + die('Bitmap DPI must be at least 1'); + $this->magic = "BM"; + $this->dibVersion = $this->DIB3; + $this->width = (int)$width; + $this->height = (int)$height; + $this->bpp = (int)$bpp; + $this->rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->hppm = (int)(($dpi * 39.37) + 0.5); // 39.37 inches per meter + $this->vppm = $this->hppm; + $this->palSize = 2; + $this->palSizeImp = 0; + $this->palette = "\xFF\xFF\xFF\x00\x00\x00\x00\x00"; + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->image = str_repeat("\x00", $rowBytes * $this->height); + } // __construct() + + function Save($filename) { + // prepare the image + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $rowDataSize = (int)((($this->width * $this->bpp) + 31) / 32) * 4; + if ($rowBytes > $rowDataSize) + return $this->ReturnError("Save(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + $pad = str_repeat("\x00", $rowDataSize - $rowBytes); // might be 0 -> "" pad, which is ok + $image = implode($pad, array_reverse(str_split($this->image, $rowBytes))) . $pad; + $imgDataSize = $this->height * $rowDataSize; + if ($imgDataSize != strlen($image)) + return $this->ReturnError("Save(): consistency error (calculated image data size ".$imgDataSize.", prepared ".strlen($image).")"); + + // prepare the palette + if ($this->palSize) { + $palette = $this->palette; + // if ($this->dibVersion == self::DIB1) // strip padding... + } else { + $palette = ""; + } + $palDataSize = strlen($palette); + + // prepare the DIB header + $dibHead = ""; + switch ($this->dibVersion) { + case $this->DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + return $this->ReturnError("Save(): only DIB3 is supported for writing"); + + case $this->DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $dibHead .= $this->RenderInt($this->DIB3, 4); + $dibHead .= $this->RenderInt($this->width, 4, true); + $dibHead .= $this->RenderInt($this->height, 4, true); + $dibHead .= $this->RenderInt(1, 2); // colorPlanes + $dibHead .= $this->RenderInt($this->bpp, 2); + $dibHead .= $this->RenderInt(0, 4); // compression + $dibHead .= $this->RenderInt($imgDataSize, 4); + $dibHead .= $this->RenderInt($this->hppm, 4, true); + $dibHead .= $this->RenderInt($this->vppm, 4, true); + $dibHead .= $this->RenderInt($this->palSize, 4); + $dibHead .= $this->RenderInt($this->palSizeImp, 4); + break; + + // TODO: more header formats + + default: + return $this->ReturnError("Save(): only DIB3 is supported for writing"); + } + if (strlen($dibHead) != $this->dibVersion) + return $this->ReturnError("Save(): consistency error (calculated DIB size ".$this->dibVersion.", prepared ".strlen($dibHead).")"); + + // prepare the BMP header + $imageAt = 14 + $this->dibVersion + $palDataSize; + $fileSize = $imageAt + $imgDataSize; + $bmpHead = ""; + $bmpHead .= $this->magic; + $bmpHead .= $this->RenderInt($fileSize, 4); + $bmpHead .= $this->RenderInt(0, 4); // bytes 6-9 are unused (application specific) + $bmpHead .= $this->RenderInt($imageAt, 4); + + // write or return the file + $data = $bmpHead . $dibHead . $palette . $image; + if ($filename === true) + return $data; + $bytes = file_put_contents($filename, $data); + if ($bytes != strlen($data)) + return $this->ReturnError("Save(): failed writing file \"".$filename."\" (".$bytes." of ".strlen($data)." bytes written)"); + return true; + } // Save() + + function GetWidth() { return $this->width; } + + function GetHeight() { return $this->height; } + + function GetColorDepth() { return $this->bpp; } + + function GetHorizResolution($asDPI=false) { return $asDPI ? (int)(($this->hppm / 39.37) + 0.5) : $this->hppm; } + + function GetVertResolution($asDPI=false) { return $asDPI ? (int)(($this->vppm / 39.37) + 0.5) : $this->vppm; } + + function GetPaletteSize() { return ($this->bpp < 16 && $this->palSize) ? $this->palSize : null; } + + function GetPaletteColor($index, $channel=null) { + if (!$this->palSize || $this->palette === null || $index < 0 || $index >= $this->palSize) + return null; + $byte = $index << 2; // (int)($index * 4) + if ($channel !== null) { + if ($channel < 0 || $channel > 2) + return null; + return ord($this->palette[$byte + $channel]); + } + return $this->ParseInt($this->palette, $byte, $byte + 2); + } // GetPaletteColor() + + function GetPixelValue($x, $y) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // fetch pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + return $this->ParseInt($this->image, $byte, $byte + 2); // BMPs don't actually have an alpha channel, so ignore the 4th byte + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + return $this->ParseInt($this->image, $byte, $byte + 2); + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + return $this->ParseInt($this->image, $byte, $byte + 1); + case 8: + $byte = ($y * $this->rowBytes) + $x; + return ord($this->image[$byte]); + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + return ((ord($this->image[$byte]) >> $shift) & 0x0F); + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + return ((ord($this->image[$byte]) >> $shift) & 0x01); + } + return null; + } // GetPixelValue() + + function SetPixelValue($x, $y, $val) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // validate new pixel value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // set pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + $this->image = substr_replace($this->image, $this->RenderInt($val,3), $byte, 3); // BMPs don't actually have an alpha channel, so ignore the 4th byte + return true; + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + $this->image = substr_replace($this->image, $this->RenderInt($val,3), $byte, 3); + return true; + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + $this->image = substr_replace($this->image, $this->RenderInt($val,2), $byte, 2); + return true; + case 8: + $byte = ($y * $this->rowBytes) + $x; + $this->image[$byte] = chr($val); + return true; + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + $mask = (0x0F << $shift); + $this->image[$byte] = chr( (ord($this->image[$byte]) & (~ $mask)) | ($val & $mask) ); + return true; + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + if ($val) + $this->image[$byte] = chr( ord($this->image[$byte]) | (0x01 << $shift) ); + else + $this->image[$byte] = chr( ord($this->image[$byte]) & (0xFF ^ (0x01 << $shift)) ); + return true; + } + return null; + } // SetPixelValue() + + function DrawLine($x0, $y0, $x1, $y1, $val) { + // validate coordinates + if ($x0 < 0) + $x0 += $this->width; + else if ($x0 >= $this->width) + return null; + if ($y0 < 0) + $y0 += $this->height; + else if ($y0 >= $this->height) + return null; + if ($x1 < 0) + $x1 += $this->width; + else if ($x1 >= $this->width) + return null; + if ($y1 < 0) + $y1 += $this->height; + else if ($y1 >= $this->height) + return null; + // validate new pixel(s) value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // draw! + // http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization + $steep = (abs($y1 - $y0) > abs($x1 - $x0)); + if ($steep) { + $t=$x0; $x0=$y0; $y0=$t; // swap $x0,$y0 + $t=$x1; $x1=$y1; $y1=$t; // swap $x1,$y1 + } + if ($x0 > $x1) { + $t=$x0; $x0=$x1; $x1=$t; // swap $x0,$x1 + $t=$y0; $y0=$y1; $y1=$t; // swap $y0,$y1 + } + $dx = ($x1 - $x0); + $dy = abs($y1 - $y0); + $err = $dx >> 1; + $sy = ($y0 < $y1) ? 1 : -1; + while ($x0 <= $x1) { + if ($steep) + $this->SetPixelValue($y0, $x0, 1); + else + $this->SetPixelValue($x0, $y0, 1); + $err -= $dy; + if ($err < 0) { + $y0 += $sy; + $err += $dx; + } + $x0++; + } + return true; + } // DrawLine() + + function GetPixelColor($x, $y, $channel=null) { + $val = $this->GetPixelValue($x, $y); + if ($val !== null && $this->palette !== null) + return $this->GetPaletteColor($val, $channel); + if ($this->bpp == 16) { + $val = + (((((($val >> 10) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 16) + + (((((($val >> 5) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 8) + + (int)(((($val & 0x1F) / 0x1F) * 0xFF) + 0.5); + } + return $val; + } // GetPixelColor() + + function GetRawData() { + return $this->image; + } // GetRawData() + + function GetRawBytesPerRow() { + return $this->rowBytes; + } // GetRawBytesPerRow() + + /** + Generate a bar graph bitmap + @param $percent (0.05 and 5 both represent 5%) + @param $width default 200 + @param $height default 40 + @return Bitmap object + */ + public static function BarGraph($percent, $width=200, $height=40){ + $graph = new Bitmap($width, $height, 1); + $black = 1; + $spacing = 5; + + // border top + $graph->DrawLine(0, 0, $width-1, 0, $black); + // border bottom + $graph->DrawLine(0, $height-1, $width-1, $height-1, $black); + // border left + $graph->DrawLine(0, 1, 0, $height-2, $black); + // border right + $graph->DrawLine($width-1, 1, $width-1, $height-2, $black); + + $full_bar_size = $width - ($spacing*2); + if ($percent > 1) $percent = (float)($percent / 100.00); + if ($percent > 1) $percent = 1.0; + $bar_size = round($percent * $full_bar_size); + + for($line=$spacing;$line<$height-$spacing;$line++){ + $graph->DrawLine($spacing, $line, $spacing+$bar_size, $line, $black); + } + + return $graph; + } + + /** + Turn bitmap into receipt string + @param $arg string filename OR Bitmap obj + @return receipt-formatted string + */ + public static function RenderBitmap($arg){ + global $PRINT_OBJ; + $slip = ""; + + $bmp = null; + if (is_object($arg) && is_a($arg, 'Bitmap')){ + $bmp = $arg; + } + else if (file_exists($arg)){ + $bmp = new Bitmap(); + $bmp->Load($arg); + } + + // argument was invalid + if ($bmp === null) + return ""; + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $printer = $PRINT_OBJ; + $stripes = $printer->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $printer->InlineBitmap($stripes[$i], $bmpWidth); + + $slip .= $printer->AlignCenter(); + if (count($stripes) > 1) + $slip .= $printer->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $printer->ResetLineSpacing()."\n"; + $slip .= $printer->AlignLeft(); + + return $slip; + } + +} // Bitmap + + diff --git a/pos/is4c-nf/lib/CoreState.php b/pos/is4c-nf/lib/CoreState.php new file mode 100755 index 000000000..ea7e77b90 --- /dev/null +++ b/pos/is4c-nf/lib/CoreState.php @@ -0,0 +1,704 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(realpath(dirname(__FILE__)."/../ini.php")); + +/** + @class CoreState + Setup session variables +*/ +class CoreState extends LibraryClass { + +/** + Populates $CORE_LOCAL with default values. + Short-hand for calling every other function + in this file. Normally called once on + startup. +*/ +static public function initiate_session() { + self::system_init(); + self::memberReset(); + self::transReset(); + self::printReset(); + PaycardLib::paycard_reset(); + + Database::getsubtotals(); + Database::loadglobalvalues(); + self::loaddata(); + self::customreceipt(); +} + +/** + Initialize system default values in + $CORE_LOCAL. Variables defined here + should always exist but won't be reset + to these values on a regular basis. +*/ +static public function system_init() { + global $CORE_LOCAL; + + /** + @var standalone + indicates whether the server + database is available. + - 0 => server is available + - 1 => server is not available + */ + $CORE_LOCAL->set("standalone",0); + + /** + @var currentid + localtemptrans.trans_id for current + cursor position + */ + $CORE_LOCAL->set("currentid",1); + + /** + @var currenttopid + localtemptrans.trans_id for the first + item currently shown on screen + */ + $CORE_LOCAL->set("currenttopid",1); + + /** + @var training + Lane is in training mode + - 0 => not in training mode + - 1 => in training mode + */ + $CORE_LOCAL->set("training",0); + + /** + @var SNR + Scale Not Ready. Set a non-zero value + (normally a UPC) to be entered when + the scale settles on a weight + */ + $CORE_LOCAL->set("SNR",0); + + /** + @var weight + Currently scale weight (as float) + */ + $CORE_LOCAL->set("weight",0); + + /** + @var scale + Scale has a valid weight + - 0 => scale error or settling + - 1 => scale settled on weight + */ + $CORE_LOCAL->set("scale",1); + + /** + @var plainmsg + Lines of text to display on + main POS screen (pos2.php) that + are not part of a transaction. Used + for things like messages after signing + on or finishing/canceling/suspending a + transaction + */ + $CORE_LOCAL->set("plainmsg",""); + + /** + @var ccTermOut + Used for sending messages to Ingenico + device. Very alpha. + */ + $CORE_LOCAL->set("ccTermOut","idle"); +} + +/** + Initialize transaction variable in $CORE_LOCAL. + This function is called after the end of every + transaction so these values will be the + the defaults every time. +*/ +static public function transReset() { + global $CORE_LOCAL; + + /** + @var End + Indicates transaction has ended + 0 => transaction in progress + 1 => transaction is complete + */ + $CORE_LOCAL->set("End",0); + + /** + @var memberID + Current member number + */ + $CORE_LOCAL->set("memberID","0"); + + /** + @var TaxExempt + Tax exempt status flag + 0 => transaction is taxable + 1 => transaction is tax exempt + */ + $CORE_LOCAL->set("TaxExempt",0); + + /** + @var yousaved + Total savings on the transaction (as float). + Includes any if applicable: + - transaction level percent discount + - sale prices (localtemptrans.discount) + - member prices (localtemptrans.memDiscount) + */ + $CORE_LOCAL->set("yousaved",0); + + /** + @var couldhavesaved + Total member savings that were not applied. + Consists of localtemptrans.memDiscount on + non-member purchases + */ + $CORE_LOCAL->set("couldhavesaved",0); + + /** + @var specials + Total saving via sale prices. Consists + of localtemptrans.discount and when applicable + localtemptrans.memDiscount + */ + $CORE_LOCAL->set("specials",0); + + /** + @var tare + Current tare setting (as float) + */ + $CORE_LOCAL->set("tare",0); + + /** + @var change + Amount of change due (as float) + */ + $CORE_LOCAL->set("change",0); + + /** + @var toggletax + Alter the next item's tax status + - 0 => do nothing + - 1 => change next tax status + */ + $CORE_LOCAL->set("toggletax",0); + + /** + @var togglefoodstamp + Alter the next item's foodstamp status + - 0 => do nothing + - 1 => change next foodstamp status + */ + $CORE_LOCAL->set("togglefoodstamp",0); + + /** + @var toggleDiscountable + Alter the next item's discount status + - 0 => do nothing + - 1 => change next discount status + */ + $CORE_LOCAL->set("toggleDiscountable",0); + + /** + @var refund + Indicates current ring is a refund. This + is set as a session variable as it could + apply to items, open rings, or potentially + other kinds of input. + - 0 => not a refund + - 1 => refund + */ + $CORE_LOCAL->set("refund",0); + + /** + @var casediscount + Line item case discount percentage (as + integer; 5 = 5%). This feature may be redundant + in that it could be handled with the generic + line-item discount. It more or less just differs + in that the messages say "Case". + */ + $CORE_LOCAL->set("casediscount",0); + + /** + @var multiple + Cashier used the "*" key to enter + a multiplier. This currently makes the + products.qttyEnforced flag work. This may + be redundant and the quantity setting below + is likely sufficient to determine whether + a multiplier was used. + */ + $CORE_LOCAL->set("multiple",0); + + /** + @var quantity + Quantity for the current ring. A non-zero + value usually means the cashier used "*" + to enter a multiplier. A value of zero + gets converted to one unless the item requires + a quantity via products.scale or + products.qttyEnforced. + */ + $CORE_LOCAL->set("quantity",0); + + /** + @var strEntered + Stores the last user input from the main + POS screen. Used in conjunction with the + msgrepeat option. + */ + $CORE_LOCAL->set("strEntered",""); + + /** + @var strRemembered + Value to use as input the next time + the main POS screen loads. Used in + conjunction with the msgrepeat + option. + */ + $CORE_LOCAL->set("strRemembered",""); + + /** + @var msgrepeat + Controls repeat input behavior + - 0 => do nothing + - 1 => set POS input to the value + in strRemembered + + strEntered, strRemembered, and msgrepeat + are strongly interrelated. + + When parsing user input on the main POS screen, + the entered value is always stored as strEntered. + + msgrepeat gets used in two slightly different + ways. If you're on a page other than the main + screen, set msgrepeat to 1 and strRemembered to + the desired input, then redirect to pos2.php. This + will run the chosen value through standard input + processing. + + The other way msgrepeat is used is with boxMsg2.php. + This page is a generic enter to continue, clear to + cancel prompt. If you redirect to boxMsg2.php and the + user presses enter, POS will set msgrepeat to 1 and + copy strEntered into strRemembered effectively repeating + the last input. Code using this feature will interpret + a msgrepeat value of 1 to indicate the user has given + confirmation. + + msgrepeat is always cleared back to zero when input + processing finishes. + + */ + $CORE_LOCAL->set("msgrepeat",0); + + /** + @var boxMsg + Message string to display on the boxMsg2.php page + */ + $CORE_LOCAL->set("boxMsg",""); + + /** + @var itemPD + Line item percent discount (as integer; 5 = 5%). + Applies a percent discount to the current ring. + */ + $CORE_LOCAL->set("itemPD",0); + + /** + @var cashierAgeOverride + This flag indicates a manager has given approval + for the cashier to sell age-restricted items. This + setting only comes into effect if the cashier is + too young. The value persists for the remainder of + the transaction so the manager does not have to give + approval for each individual item. + - 0 => no manager approval + - 1 => manager has given approval + */ + $CORE_LOCAL->set("cashierAgeOverride",0); + + /** + @var lastWeight + The weight of the last by-weight item entered into + the transaction. It's used to monitor for scale + problems. Consecutive items with the exact same + weight often indicate the scale is stuck or not + responding properly. + */ + $CORE_LOCAL->set("lastWeight",0.00); + + /** + @var CachePanEncBlcok + Stores the encrypted string of card information + provided by the CC terminal. If the terminal is + facing the customer, the customer may swipe their + card before the cashier is done ringing in items + so the value is stored in session until the + cashier is ready to process payment + */ + $CORE_LOCAL->set("CachePanEncBlock",""); + + /** + @var CachePinEncBlock + Stores the encrypted string of PIN data. + Similar to CachePanEncBlock. + */ + $CORE_LOCAL->set("CachePinEncBlock",""); + + /** + @var CacheCardType + Stores the selected card type. + Similar to CachePanEncBlock. + Known values are: + - CREDIT + - DEBIT + - EBTFOOD + - EBTCASH + */ + $CORE_LOCAL->set("CacheCardType",""); + + /** + @var CacheCardCashBack + Stores the select cashback amount. + Similar to CachePanEncBlock. + */ + $CORE_LOCAL->set("CacheCardCashBack",0); + + /** + @var ccTermState + Stores a string representing the CC + terminals current display. This drives + an optional on-screen icon to let the + cashier know what the CC terminal is + doing if they cannot see its screen. + */ + $CORE_LOCAL->set('ccTermState','swipe'); + + /** + @var paycard_voiceauthcode + Stores a voice authorization code for use + with a paycard transaction. Not normally used + but required to pass Mercury's certification + script. + */ + $CORE_LOCAL->set("paycard_voiceauthcode",""); + + /** + @var ebt_authcode + Stores a foodstamp authorization code. + Similar to paycard_voiceauthcode. + */ + $CORE_LOCAL->set("ebt_authcode",""); + + /** + @var ebt_vnum + Stores a foodstamp voucher number. + Similar to paycard_voiceauthcode. + */ + $CORE_LOCAL->set("ebt_vnum",""); + + /** + @var paycard_keyed + - True => card number was hand keyed + - False => card was swiped + + Normally POS figures this out automatically + but it has to be overriden to pass Mercury's + certification script. They require some + keyed transactions even though the CC terminal + is only capable of producing swipe-style data. + */ + $CORE_LOCAL->set("paycard_keyed",False); + + foreach($CORE_LOCAL->get('PluginList') as $p){ + if (!class_exists($p)) continue; + $obj = new $p(); + $obj->plugin_transaction_reset(); + } +} + +/** + Initialize print related variables in $CORE_LOCAL. + This function is called after the end of + every transaction. +*/ +static public function printReset() { + global $CORE_LOCAL; + + /** + @var receiptToggle + Control whether a receipt prints + - 0 => do not print receipt + - 1 => print receipt normally + + Note that some kinds of receipts + such as credit card or store charge + signature slips cannot be suppressed + and will always print. + */ + $CORE_LOCAL->set("receiptToggle",1); + + /** + @var autoReprint + Print two receipts. + - 0 => do nothing + - 1 => print a copy of the receipt + */ + $CORE_LOCAL->set("autoReprint",0); +} + +/** + Initialize member related variables in $CORE_LOCAL. + This function is called after the end of + every transaction. +*/ +static public function memberReset() { + global $CORE_LOCAL; + + /** + @var memberID + The current member number + */ + $CORE_LOCAL->set("memberID","0"); + + /** + @var isMember + Indicates whether the current customer + is considered a member or just someone + who happens to have a number + 0 - not considered a member + 1 - is a member + + This is controlled by custdata.Type. That + field must be 'PC' for the account to be + considered a member. + */ + $CORE_LOCAL->set("isMember",0); + + /** + @var isStaff + Indicates whether the current customer is + an employee. Corresponds to custdata.staff. + */ + $CORE_LOCAL->set("isStaff",0); + + /** + @var SSI + Corresponds to custdata.SSI for current + customer. + */ + $CORE_LOCAL->set("SSI",0); + + /** + @var memMsg + Text string shown in the upper left of the + POS screen near the word MEMBER. + */ + $CORE_LOCAL->set("memMsg",""); + + /** + @var memType + Corresponds to custdata.memType for current + customer. + */ + $CORE_LOCAL->set("memType",0); + + /** + @var balance + Current customer's charge account balance + owed. + */ + $CORE_LOCAL->set("balance",0); + + /** + @var availBal + Current customer's available charge account + balance. This is equivalent to + custdata.memDiscountLimit minus the balance + setting above. + */ + $CORE_LOCAL->set("availBal",0); + + /** + @var percentDiscount + The current customer's transaction-level + percent discount as an integer (i.e., 5 = 5%). + Corresponds to custdata.Discount. + */ + $CORE_LOCAL->set("percentDiscount",0); + + /** + @var memAge + Actually current customer's birthday + as YYYYMMDD but used to calculate age. + This is stored if the customer purchases + an age-restricted item. + */ + $CORE_LOCAL->set("memAge",date('Ymd')); +} + +/** + Get member information line for a given member + @param $row a record from custdata + @return string + @deprecated + Just define blueLine in custdata. +*/ +static public function blueLine($row) { + $status = array('Non-Owner', 'Shareholder', 'Subscriber', 'Inactive', 'Refund', 'On Hold', 'Sister Org.', 'Other Co-ops'); + if ($row["blueLine"]) { // custom blueLine as defined by db + return $row["blueLine"]; + } elseif (isset($row["blueLine"])) { // 0 - default blueLine with out name + return '#'.$row['CardNo'].' - '.$row['Discount'].'% - '.$status[$row['memType']]; + } else { // NULL - default blueLine including name + return '#'.$row['CardNo'].' - '.$status[$row['memType']].': '.$row['FirstName'].' '.$row['LastName']; + } +} + +/** + If there are records in localtemptrans, get the + member number and initialize $CORE_LOCAL member + variables. + + The only time this function does anything is + in crash recovery - if a browser is closed and + re-opened or the computer is rebooted in the + middle of a transaction. +*/ +static public function loaddata() { + global $CORE_LOCAL; + + $query_local = "select card_no from localtemptrans"; + + $db_local = Database::tDataConnect(); + $result_local = $db_local->query($query_local); + $num_rows_local = $db_local->num_rows($result_local); + + if ($num_rows_local > 0) { + $row_local = $db_local->fetch_array($result_local); + + if ($row_local["card_no"] && strlen($row_local["card_no"]) > 0) { + $CORE_LOCAL->set("memberID",$row_local["card_no"]); + } + } + + if ($CORE_LOCAL->get("memberID") == "0") { + // not used - andy 4/12/07 + $CORE_LOCAL->set("percentDiscount",0); + $CORE_LOCAL->set("memType",0); + } + else { + $query_member = "select CardNo,memType,Type,Discount,staff,SSI, + MemDiscountLimit,blueLine,FirstName,LastName + from custdata where CardNo = '".$CORE_LOCAL->get("memberID")."'"; + $db_product = Database::pDataConnect(); + $result = $db_product->query($query_member); + if ($db_product->num_rows($result) > 0) { + $row = $db_product->fetch_array($result); + $CORE_LOCAL->set("memMsg",self::blueLine($row)); + $CORE_LOCAL->set("memType",$row["memType"]); + $CORE_LOCAL->set("percentDiscount",$row["Discount"]); + + if ($row["Type"] == "PC") $CORE_LOCAL->set("isMember",1); + else $CORE_LOCAL->set("isMember",0); + + $CORE_LOCAL->set("isStaff",$row["staff"]); + $CORE_LOCAL->set("SSI",$row["SSI"]); + $CORE_LOCAL->set("discountcap",$row["MemDiscountLimit"]); + + if ($CORE_LOCAL->get("SSI") == 1) + $CORE_LOCAL->set("memMsg",$CORE_LOCAL->get("memMsg")." #"); + } + } +} + +/** + Fetch text fields from the customReceipt table + These fields are used for various messages that + invariably must be customized at every store. + */ +static public function customreceipt(){ + global $CORE_LOCAL; + + $db = Database::pDataConnect(); + $headerQ = "select text,type,seq from customReceipt order by seq"; + $headerR = $db->query($headerQ); + $counts = array(); + while($headerW = $db->fetch_row($headerR)){ + $typeStr = $headerW['type']; + $numeral = $headerW['seq']+1; + $text = $headerW['text']; + + // translation for really old data + if (strtolower($typeStr)=="header") + $typeStr = "receiptHeader"; + elseif(strtolower($typeStr)=="footer") + $typeStr = "receiptFooter"; + + $CORE_LOCAL->set($typeStr.$numeral,$text); + + if (!isset($counts[$typeStr])) + $counts[$typeStr] = 1; + else + $counts[$typeStr]++; + } + + foreach($counts as $key => $num){ + $CORE_LOCAL->set($key."Count",$num); + } +} + +static public function getCustomerPref($key){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get('memberID') == 0) return ''; + $db = Database::pDataConnect(); + $q = sprintf('SELECT pref_value FROM custPreferences WHERE + card_no=%d AND pref_key=\'%s\'', + $CORE_LOCAL->get('memberID'),$key); + $r = $db->query($q); + if ($r === False) return ''; + if ($db->num_rows($r) == 0) return ''; + return array_pop($db->fetch_row($r)); +} + +static public function cashier_login($transno=False, $age=0){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get('CashierNo')==9999){ + $CORE_LOCAL->set('training', 1); + } + if (!is_numeric($age)) $age = 0; + $CORE_LOCAL->set('cashierAge', $age); + if($transno && is_numeric($transno)){ + $CORE_LOCAL->set('transno', $transno); + } +} + +} + +?> diff --git a/pos/is4c-nf/lib/Database.php b/pos/is4c-nf/lib/Database.php new file mode 100644 index 000000000..084a005fb --- /dev/null +++ b/pos/is4c-nf/lib/Database.php @@ -0,0 +1,710 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 27Feb2013 Andy Theuninck singleton connection for local databases + * 13Jan2013 Eric Lee Added changeLttTaxCode(From, To); + +*/ + +/** + @class Database + Functions related to the database +*/ +class Database extends LibraryClass { + + +/*********************************************************************************************** + + Functions transcribed from connect.asp on 07.13.03 by Brandon. + +***********************************************************************************************/ + +/** + Singleton connection +*/ +static private $SQL_CONNECTION = null; + +/** + Connect to the transaction database (local) + @return a SQLManager object +*/ +static public function tDataConnect() +{ + global $CORE_LOCAL; + + if (self::$SQL_CONNECTION === null){ + /** + Add both local databases to the connection object + */ + self::$SQL_CONNECTION = new SQLManager($CORE_LOCAL->get("localhost"),$CORE_LOCAL->get("DBMS"),$CORE_LOCAL->get("tDatabase"), + $CORE_LOCAL->get("localUser"),$CORE_LOCAL->get("localPass"),False); + self::$SQL_CONNECTION->db_types[$CORE_LOCAL->get('pDatabase')] = strtoupper($CORE_LOCAL->get('DBMS')); + self::$SQL_CONNECTION->connections[$CORE_LOCAL->get('pDatabase')] = self::$SQL_CONNECTION->connections[$CORE_LOCAL->get('tDatabase')]; + } + else { + /** + Switch connection object to the requested database + */ + self::$SQL_CONNECTION->query('use '.$CORE_LOCAL->get('tDatabase')); + self::$SQL_CONNECTION->default_db = $CORE_LOCAL->get('tDatabase'); + } + return self::$SQL_CONNECTION; +} + +/** + Connect to the operational database (local) + @return a SQLManager object +*/ +static public function pDataConnect() +{ + global $CORE_LOCAL; + + if (self::$SQL_CONNECTION === null){ + /** + Add both local databases to the connection object + */ + self::$SQL_CONNECTION = new SQLManager($CORE_LOCAL->get("localhost"),$CORE_LOCAL->get("DBMS"),$CORE_LOCAL->get("pDatabase"), + $CORE_LOCAL->get("localUser"),$CORE_LOCAL->get("localPass"),False); + self::$SQL_CONNECTION->db_types[$CORE_LOCAL->get('tDatabase')] = strtoupper($CORE_LOCAL->get('DBMS')); + self::$SQL_CONNECTION->connections[$CORE_LOCAL->get('tDatabase')] = self::$SQL_CONNECTION->connections[$CORE_LOCAL->get('pDatabase')]; + } + else { + /** + Switch connection object to the requested database + */ + self::$SQL_CONNECTION->query('use '.$CORE_LOCAL->get('pDatabase')); + self::$SQL_CONNECTION->default_db = $CORE_LOCAL->get('pDatabase'); + } + return self::$SQL_CONNECTION; +} + +/** + Connect to the remote server database + @return a SQLManager object +*/ +static public function mDataConnect() +{ + global $CORE_LOCAL; + + $sql = new SQLManager($CORE_LOCAL->get("mServer"),$CORE_LOCAL->get("mDBMS"),$CORE_LOCAL->get("mDatabase"), + $CORE_LOCAL->get("mUser"),$CORE_LOCAL->get("mPass"),False); + return $sql; +} + +// ----------getsubtotals()---------- + +// getsubtotals() updates the values held in our session variables. + +/** + Load values from subtotals view into $CORE_LOCAL. + Essentially refreshes totals in the session. +*/ +static public function getsubtotals() { + global $CORE_LOCAL; + + $query = "SELECT * FROM subtotals"; + $connection = self::tDataConnect(); + $result = $connection->query($query); + $row = $connection->fetch_array($result); + + // reset a few variables + if (!$row || $row["LastID"] == 0) { + $CORE_LOCAL->set("ttlflag",0); + $CORE_LOCAL->set("fntlflag",0); + self::setglobalflags(0); + } + + $CORE_LOCAL->set("LastID", (!$row || !isset($row['LastID'])) ? 0 : (double)$row["LastID"] ); + $cn = (!$row || !isset($row['card_no'])) ? "0" : trim($row["card_no"]); + if ($cn != "0" || $CORE_LOCAL->get("memberID") == "") + $CORE_LOCAL->set("memberID",$cn); + $CORE_LOCAL->set("runningTotal", (!$row || !isset($row['runningTotal'])) ? 0 : (double)$row["runningTotal"] ); + $CORE_LOCAL->set("taxTotal", (!$row || !isset($row['taxTotal'])) ? 0 : (double)$row["taxTotal"] ); + $CORE_LOCAL->set("discounttotal", (!$row || !isset($row['discountTTL'])) ? 0 : (double)$row["discountTTL"] ); + $CORE_LOCAL->set("tenderTotal", (!$row || !isset($row['tenderTotal'])) ? 0 : (double)$row["tenderTotal"] ); + $CORE_LOCAL->set("memSpecial", (!$row || !isset($row['memSpecial'])) ? 0 : (double)$row["memSpecial"] ); + $CORE_LOCAL->set("staffSpecial", (!$row || !isset($row['staffSpecial'])) ? 0 : (double)$row["staffSpecial"] ); + $CORE_LOCAL->set("percentDiscount", (!$row || !isset($row['percentDiscount'])) ? 0 : (double)$row["percentDiscount"] ); + $CORE_LOCAL->set("transDiscount", (!$row || !isset($row['transDiscount'])) ? 0 : (double)$row["transDiscount"] ); + $CORE_LOCAL->set("fsTaxExempt", (!$row || !isset($row['fsTaxExempt'])) ? 0 : (double)$row["fsTaxExempt"] ); + $CORE_LOCAL->set("fsEligible", (!$row || !isset($row['fsEligible'])) ? 0 : (double)$row["fsEligible"] ); + $CORE_LOCAL->set("chargeTotal", (!$row || !isset($row['chargeTotal'])) ? 0 : (double)$row["chargeTotal"] ); + $CORE_LOCAL->set("paymentTotal", (!$row || !isset($row['paymentTotal'])) ? 0 : (double)$row["paymentTotal"] ); + $CORE_LOCAL->set("memChargeTotal", $CORE_LOCAL->get("chargeTotal") + $CORE_LOCAL->get("paymentTotal") ); + $CORE_LOCAL->set("discountableTotal", (!$row || !isset($row['discountableTotal'])) ? 0 : (double)$row["discountableTotal"] ); + $CORE_LOCAL->set("localTotal", (!$row || !isset($row['localTotal'])) ? 0 : (double)$row["localTotal"] ); + $CORE_LOCAL->set("voidTotal", (!$row || !isset($row['voidTotal'])) ? 0 : (double)$row["voidTotal"] ); + + if ($CORE_LOCAL->get("memberID") == "0" && $CORE_LOCAL->get("runningTotal") > 0) { + if ($CORE_LOCAL->get("SSI") != 0 && ($CORE_LOCAL->get("isStaff") == 3 || $CORE_LOCAL->get("isStaff") == 6)) PrehLib::wmdiscount(); + } + + $handler_class = $CORE_LOCAL->get('DiscountModule'); + if ($handler_class === '') $handler_class = 'DiscountModule'; + elseif (!class_exists($handler_class)) $handler_class = 'DiscountModule'; + if (class_exists($handler_class)){ + $module = new $handler_class(); + $CORE_LOCAL->set('transDiscount', $module->calculate() ); + } + + /* BETA 10Jun2013 + ENABLED LIVE 15Aug2013 + Calculate taxes & exemptions separately from + the subtotals view. + + Adding the exemption amount back on is a bit + silly but the goal for the moment is to keep + this function behaving the same. Once the subtotals + view is deprecated we can revisit how these two + session variables should behave. + */ + $taxes = Database::LineItemTaxes(); + $taxTTL = 0.00; + $exemptTTL = 0.00; + foreach($taxes as $tax){ + $taxTTL += $tax['amount']; + $exemptTTL += $tax['exempt']; + } + $CORE_LOCAL->set('taxTotal', number_format($taxTTL,2)); + $CORE_LOCAL->set('fsTaxExempt', number_format(-1*$exemptTTL,2)); + + if ( $CORE_LOCAL->get("TaxExempt") == 1 ) { + $CORE_LOCAL->set("taxable",0); + $CORE_LOCAL->set("taxTotal",0); + $CORE_LOCAL->set("fsTaxable",0); + $CORE_LOCAL->set("fsTaxExempt",0); + } + + $CORE_LOCAL->set("subtotal",number_format($CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("transDiscount"), 2)); + /* using a string for amtdue behaves strangely for + * values > 1000, so use floating point */ + $CORE_LOCAL->set("amtdue",(double)round($CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("taxTotal"), 2)); + + if ( $CORE_LOCAL->get("fsEligible") > $CORE_LOCAL->get("subtotal") ) { + $CORE_LOCAL->set("fsEligible",$CORE_LOCAL->get("subtotal")); + } +} + +/** + Calculate taxes using new-style taxView. + @return an array of records each containing: + - id + - description + - amount (taxes actually due) + - exempt (taxes exempted because of foodstamps) + There will always be one record for each existing tax rate. +*/ +static public function LineItemTaxes(){ + $db = Database::tDataConnect(); + $q = "SELECT id, description, taxTotal, fsTaxable, fsTaxTotal, foodstampTender, taxrate + FROM taxView ORDER BY taxrate DESC"; + $r = $db->query($q); + $taxRows = array(); + $fsTenderTTL = 0.00; + while ($w = $db->fetch_row($r)){ + $w['fsExempt'] = 0.00; + $taxRows[] = $w; + $fsTenderTTL = $w['foodstampTender']; + } + + // loop through line items and deal with + // foodstamp tax exemptions + for($i=0;$i<count($taxRows);$i++){ + if($fsTenderTTL <= 0.005) continue; + + if (abs($fsTenderTTL - $taxRows[$i]['fsTaxable']) < 0.005){ + // CASE 1: + // Available foodstamp tender matches foodstamp taxable total + // Decrement line item tax by foodstamp tax total + // No FS tender left, so exemption ends + $taxRows[$i]['taxTotal'] = MiscLib::truncate2($taxRows[$i]['taxTotal'] - $taxRows[$i]['fsTaxTotal']); + $taxRows[$i]['fsExempt'] = $taxRows[$i]['fsTaxTotal']; + $fsTenderTTL = 0; + } + else if ($fsTenderTTL > $taxRows[$i]['fsTaxable']){ + // CASE 2: + // Available foodstamp tender exeeds foodstamp taxable total + // Decrement line item tax by foodstamp tax total + // Decrement foodstamp tender total to reflect amount not yet applied + $taxRows[$i]['taxTotal'] = MiscLib::truncate2($taxRows[$i]['taxTotal'] - $taxRows[$i]['fsTaxTotal']); + $taxRows[$i]['fsExempt'] = $taxRows[$i]['fsTaxTotal']; + $fsTenderTTL = MiscLib::truncate2($fsTenderTTL - $taxRows[$i]['fsTaxable']);; + } + else { + // CASE 3: + // Available foodstamp tender is less than foodstamp taxable total + // Decrement line item tax proprotionally to foodstamp tender available + // No FS tender left, so exemption ends + $percentageApplied = $fsTenderTTL / $taxRows[$i]['fsTaxable']; + $exemption = $taxRows[$i]['fsTaxTotal'] * $percentageApplied; + $taxRows[$i]['taxTotal'] = MiscLib::truncate2($taxRows[$i]['taxTotal'] - $exemption); + $taxRows[$i]['fsExempt'] = $exemption; + $fsTenderTTL = 0; + } + } + + $ret = array(); + foreach($taxRows as $tr){ + $ret[] = array( + 'rate_id' => $tr['id'], + 'description' => $tr['description'], + 'amount' => $tr['taxTotal'], + 'exempt' => $tr['fsExempt'] + ); + } + return $ret; +} + +// ----------gettransno($CashierNo /int)---------- +// +// Given $CashierNo, gettransno() will look up the number of the most recent transaction. + +/** + Get the next transaction number for a given cashier + @param $CashierNo cashier number (emp_no in tables) + @return integer transaction number +*/ +static public function gettransno($CashierNo) { + global $CORE_LOCAL; + + $database = $CORE_LOCAL->get("tDatabase"); + $register_no = $CORE_LOCAL->get("laneno"); + $query = "SELECT max(trans_no) as maxtransno from localtranstoday where emp_no = '" + .$CashierNo."' and register_no = '" + .$register_no."' GROUP by register_no, emp_no"; + $connection = self::tDataConnect(); + $result = $connection->query($query); + $row = $connection->fetch_array($result); + if (!$row || !$row["maxtransno"]) { + $trans_no = 1; + } + else { + $trans_no = $row["maxtransno"] + 1; + } + return $trans_no; +} + +// ------------------------------------------------------------------ + +/** + See if the remote database is available + This function calls uploadtoServer() if + the initial test works. + @return integer + - 1 server available + - 0 server down +*/ +static public function testremote() { + global $CORE_LOCAL; + + + $intConnected = MiscLib::pingport($CORE_LOCAL->get("mServer"), $CORE_LOCAL->get("mDBMS")); + if ($intConnected == 1) { + + self::uploadtoServer(); + + } else { + $CORE_LOCAL->set("standalone",1); + } + + return ($CORE_LOCAL->get("standalone") + 1) % 2; +} + +// ------------------------------------------------------------------ +/** + Copy tables from the lane to the remote server + The following tables are copied: + - dtransactions + - alog + - suspended + - efsnetRequest + - efsnetResponse + - efsnetRequestMod + + On success the local tables are truncated. The efsnet tables + are copied in the uploadCCdata() function but that gets called + automatically. + + @return + - 1 upload succeeded + - 0 upload failed +*/ +static public function uploadtoServer() +{ + global $CORE_LOCAL; + + $uploaded = 0; + + // new upload method makes use of SQLManager's transfer method + // to simulate cross-server queries + $connect = self::tDataConnect(); + $connect->add_connection($CORE_LOCAL->get("mServer"), + $CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"), + $CORE_LOCAL->get("mUser"), + $CORE_LOCAL->get("mPass"), + False); + if (!isset($connect->connections[$CORE_LOCAL->get("mDatabase")]) || + $connect->connections[$CORE_LOCAL->get("mDatabase")] === False){ + $CORE_LOCAL->set("standalone",1); + return 0; + } + + $dt_matches = self::getMatchingColumns($connect,"dtransactions"); + + if ($connect->transfer($CORE_LOCAL->get("tDatabase"), + "select {$dt_matches} from dtransactions", + $CORE_LOCAL->get("mDatabase"),"insert into dtransactions ({$dt_matches})")){ + + // Moved up + $connect->query("truncate table dtransactions", + $CORE_LOCAL->get("tDatabase")); + + $al_matches = self::getMatchingColumns($connect,"alog"); + // interval is a mysql reserved word + // so it needs to be escaped + $local_columns = str_replace('Interval', + $connect->identifier_escape('Interval',$CORE_LOCAL->get('tDatabase')), + $al_matches); + $server_columns = str_replace('Interval', + $connect->identifier_escape('Interval',$CORE_LOCAL->get('mDatabase')), + $al_matches); + $al_success = $connect->transfer($CORE_LOCAL->get("tDatabase"), + "select $local_columns FROM alog", + $CORE_LOCAL->get("mDatabase"), + "insert into alog ($server_columns)"); + + $su_matches = self::getMatchingColumns($connect,"suspended"); + $su_success = $connect->transfer($CORE_LOCAL->get("tDatabase"), + "select {$su_matches} from suspended", + $CORE_LOCAL->get("mDatabase"), + "insert into suspended ({$su_matches})"); + + /* Move up + $connect->query("truncate table dtransactions", + $CORE_LOCAL->get("tDatabase")); + */ + if ($al_success){ + $connect->query("truncate table alog", + $CORE_LOCAL->get("tDatabase")); + } + if ($su_success){ + $connect->query("truncate table suspended", + $CORE_LOCAL->get("tDatabase")); + } + + $uploaded = 1; + $CORE_LOCAL->set("standalone",0); + } + else { + $uploaded = 0; + $CORE_LOCAL->set("standalone",1); + } + + $connect->close($CORE_LOCAL->get("mDatabase"),True); + + self::uploadCCdata(); + + return $uploaded; +} + +/** + Get a list of columns that exist on the local db + and the server db for the given table. + @param $connection a SQLManager object that's + already connected + @param $table_name the table + @param $table2 is provided, it match columns from + local.table_name against remote.table2 + @return an array of column names +*/ +static public function getMatchingColumns($connection,$table_name,$table2=""){ + global $CORE_LOCAL; + + $local_poll = $connection->table_definition($table_name,$CORE_LOCAL->get("tDatabase")); + $local_cols = array(); + foreach($local_poll as $name=>$v) + $local_cols[$name] = True; + $remote_poll = $connection->table_definition((!empty($table2)?$table2:$table_name), + $CORE_LOCAL->get("mDatabase")); + $matching_cols = array(); + foreach($remote_poll as $name=>$v){ + if (isset($local_cols[$name])) + $matching_cols[] = $name; + } + + $ret = ""; + foreach($matching_cols as $col) + $ret .= $col.","; + return rtrim($ret,","); +} + +/** Get a list of columns in both tables. + @param $connection a SQLManager object that's + already connected + @param $table1 a database table + @param $table2 a database table + @return an array of column names common to both tables + */ +static public function localMatchingColumns($connection,$table1,$table2){ + $poll1 = $connection->table_definition($table1); + $cols1 = array(); + foreach($poll1 as $name=>$v) + $cols1[$name] = True; + $poll2 = $connection->table_definition($table2); + $matching_cols = array(); + foreach($poll2 as $name=>$v){ + if (isset($cols1[$name])) + $matching_cols[] = $name; + } + + $ret = ""; + foreach($matching_cols as $col) + $ret .= $col.","; + return rtrim($ret,","); +} + +/** + Transfer credit card tables to the server. + See uploadtoServer(). +*/ +static public function uploadCCdata(){ + global $CORE_LOCAL; + + $sql = self::tDataConnect(); + $sql->add_connection($CORE_LOCAL->get("mServer"), + $CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"), + $CORE_LOCAL->get("mUser"), + $CORE_LOCAL->get("mPass"), + False); + + $req_cols = self::getMatchingColumns($sql,"efsnetRequest"); + if ($sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$req_cols} from efsnetRequest", + $CORE_LOCAL->get("mDatabase"),"insert into efsnetRequest ({$req_cols})")){ + + $sql->query("truncate table efsnetRequest", + $CORE_LOCAL->get("tDatabase")); + + $res_cols = self::getMatchingColumns($sql,"efsnetResponse"); + $res_success = $sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$res_cols} from efsnetResponse", + $CORE_LOCAL->get("mDatabase"), + "insert into efsnetResponse ({$res_cols})"); + if ($res_success){ + $sql->query("truncate table efsnetResponse", + $CORE_LOCAL->get("tDatabase")); + } + + $mod_cols = self::getMatchingColumns($sql,"efsnetRequestMod"); + $mod_success = $sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$mod_cols} from efsnetRequestMod", + $CORE_LOCAL->get("mDatabase"), + "insert into efsnetRequestMod ({$mod_cols})"); + if ($mod_success){ + $sql->query("truncate table efsnetRequestMod", + $CORE_LOCAL->get("tDatabase")); + } + + $mod_cols = self::getMatchingColumns($sql,"efsnetTokens"); + $mod_success = $sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$mod_cols} from efsnetTokens", + $CORE_LOCAL->get("mDatabase"), + "insert into efsnetTokens ({$mod_cols})"); + if ($mod_success){ + $sql->query("truncate table efsnetTokens", + $CORE_LOCAL->get("tDatabase")); + } + } +} + +/** + Read globalvalues settings into $CORE_LOCAL. +*/ +static public function loadglobalvalues() { + global $CORE_LOCAL; + + $query = "select CashierNo,Cashier,LoggedIn,TransNo,TTLFlag, + FntlFlag,TaxExempt from globalvalues"; + $db = self::pDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + + $CORE_LOCAL->set("CashierNo",$row["CashierNo"]); + $CORE_LOCAL->set("cashier",$row["Cashier"]); + $CORE_LOCAL->set("LoggedIn",$row["LoggedIn"]); + $CORE_LOCAL->set("transno",$row["TransNo"]); + $CORE_LOCAL->set("ttlflag",$row["TTLFlag"]); + $CORE_LOCAL->set("fntlflag",$row["FntlFlag"]); + $CORE_LOCAL->set("TaxExempt",$row["TaxExempt"]); +} + +/** + Set new value in $CORE_LOCAL. + @param $param keycode + @param $val new value +*/ +static public function loadglobalvalue($param,$val){ + global $CORE_LOCAL; + switch(strtoupper($param)){ + case 'CASHIERNO': + $CORE_LOCAL->set("CashierNo",$val); + break; + case 'CASHIER': + $CORE_LOCAL->set("cashier",$val); + break; + case 'LOGGEDIN': + $CORE_LOCAL->set("LoggedIn",$val); + break; + case 'TRANSNO': + $CORE_LOCAL->set("transno",$val); + break; + case 'TTLFLAG': + $CORE_LOCAL->set("ttlflag",$val); + break; + case 'FNTLFLAG': + $CORE_LOCAL->set("fntlflag",$val); + break; + case 'TAXEXEMPT': + $CORE_LOCAL->set("TaxExempt",$val); + break; + } +} + +/** + Update setting in globalvalues table. + @param $param keycode + @param $value new value +*/ +static public function setglobalvalue($param, $value) { + global $CORE_LOCAL; + + $db = self::pDataConnect(); + + if (!is_numeric($value)) { + $value = "'".$value."'"; + } + + $strUpdate = "update globalvalues set ".$param." = ".$value; + + $db->query($strUpdate); +} + +/** + Update many settings in globalvalues table + and in $CORE_LOCAL + @param $arr An array of keys and values +*/ +static public function setglobalvalues($arr){ + $setStr = ""; + foreach($arr as $param => $value){ + $setStr .= $param." = "; + if (!is_numeric($value)) + $setStr .= "'".$value."',"; + else + $setStr .= $value.","; + self::loadglobalvalue($param,$value); + } + $setStr = rtrim($setStr,","); + + $db = self::pDataConnect(); + $upQ = "UPDATE globalvalues SET ".$setStr; + $db->query($upQ); +} + +/** + Sets TTLFlag and FntlFlag in globalvalues table + @param $value value for both fields. +*/ +static public function setglobalflags($value) { + $db = self::pDataConnect(); + + $db->query("update globalvalues set TTLFlag = ".$value.", FntlFlag = ".$value); +} + +/** + Change one tax code in all items of localtemptrans to a different one. + Parameters are the names of the taxes, as in taxrates.description + @param $fromName The name of the tax changed from. + @param $fromName The name of the tax changed to. +*/ +static public function changeLttTaxCode($fromName, $toName) { + + $msg = ""; + $pfx = "changeLttTaxCode "; + $pfx = ""; + if ( $fromName == "" ) { + $msg = "{$pfx}fromName is empty"; + return msg; + } else { + if ( $toName == "" ) { + $msg = "{$pfx}toName is empty"; + return msg; + } + } + + $db = self::tDataConnect(); + + // Get the codes for the names provided. + $query = "SELECT id FROM taxrates WHERE description = '$fromName'"; + $result = $db->query($query); + $row = $db->fetch_row($result); + if ( $row ) { + $fromId = $row['id']; + } else { + $msg = "{$pfx}fromName: >{$fromName}< not known."; + return $msg; + } + $query = "SELECT id FROM taxrates WHERE description = '$toName'"; + $result = $db->query($query); + $row = $db->fetch_row($result); + if ( $row ) { + $toId = $row['id']; + } else { + $msg = "{$pfx}toName: >{$toName}< not known."; + return $msg; + } + + // Change the values. + $query = "UPDATE localtemptrans set tax = $toId WHERE tax = $fromId"; + $result = $db->query($query); + /* Complains that errno is undefined in SQLManager. + if ( $db->errno ) { + return "{$pfx}UPDATE error: " . $db->error; + } + */ + if ( !$result ) { + return "UPDATE false"; + } + + return True; + +// changeLttTaxCode +} + +} // end Database class + +?> diff --git a/pos/is4c-nf/lib/DiscountModule.php b/pos/is4c-nf/lib/DiscountModule.php new file mode 100644 index 000000000..c37df901b --- /dev/null +++ b/pos/is4c-nf/lib/DiscountModule.php @@ -0,0 +1,51 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DiscountModule + Calculate a per-transaction discount + + This module is called in Database::getsubtotals() + and the value it calculates will be stored in + $CORE_LOCAL as 'transDiscount'. The default version + simply returns the value calculated by the + translog.subtotals view. +*/ +class DiscountModule { + + /** + Calculate the discount based on current + transaction state + @return double discount amount + + Note return value should be positive unless + you're doing something odd + */ + public function calculate(){ + global $CORE_LOCAL; + $subtotalsDiscount = $CORE_LOCAL->get('transDiscount'); + if ($subtotalsDiscount === '') + $subtotalsDiscount = 0.00; + return $subtotalsDiscount; + } +} diff --git a/pos/is4c-nf/lib/DisplayLib.php b/pos/is4c-nf/lib/DisplayLib.php new file mode 100644 index 000000000..bef0d0b6d --- /dev/null +++ b/pos/is4c-nf/lib/DisplayLib.php @@ -0,0 +1,797 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DisplayLib + Functions for drawing display elements +*/ +class DisplayLib extends LibraryClass { + +/** + Get the standard footer with total and + amount(s) saved + @param $readOnly don't update any session info + This would be set when rendering a separate, + different customer display + @return A string of HTML +*/ +static public function printfooter($readOnly=False) { + global $CORE_LOCAL; + + $FOOTER_MODULES = $CORE_LOCAL->get("FooterModules"); + // use defaults if modules haven't been configured + // properly + if (!is_array($FOOTER_MODULES) || count($FOOTER_MODULES) != 5){ + $FOOTER_MODULES = array( + 'SavedOrCouldHave', + 'TransPercentDiscount', + 'MemSales', + 'EveryoneSales', + 'MultiTotal' + ); + } + + $modchain = array(); + foreach($FOOTER_MODULES as $MOD){ + $modchain[] = new $MOD(); + } + + if (!$readOnly) { + $CORE_LOCAL->set("runningTotal",$CORE_LOCAL->get("amtdue")); + } + + if ($CORE_LOCAL->get("End") == 1 && !$readOnly) { + $CORE_LOCAL->set("runningTotal",-1 * $CORE_LOCAL->get("change")); + } + + if ($CORE_LOCAL->get("scale") == 1) { + $weight = number_format($CORE_LOCAL->get("weight"), 2)."lb."; + } + else { + $weight = "_ _ _ _"; + } + + $ret = "<table>"; + $ret .= "<tr class=\"heading\">"; + $label = $modchain[0]->header_content(); + $ret .= sprintf('<td class="first %s" style="%s">%s</td>', + $modchain[0]->header_css_class, $modchain[0]->header_css,$label); + $label = $modchain[1]->header_content(); + $ret .= sprintf('<td class="reg %s" style="%s">%s</td>', + $modchain[1]->header_css_class, $modchain[1]->header_css,$label); + $label = $modchain[2]->header_content(); + $ret .= sprintf('<td class="reg %s" style="%s">%s</td>', + $modchain[2]->header_css_class, $modchain[2]->header_css,$label); + $label = $modchain[3]->header_content(); + $ret .= sprintf('<td class="reg %s" style="%s">%s</td>', + $modchain[3]->header_css_class, $modchain[3]->header_css,$label); + $label = $modchain[4]->header_content(); + $ret .= sprintf('<td class="total %s" style="%s">%s</td>', + $modchain[4]->header_css_class, $modchain[4]->header_css,$label); + $ret .= "</tr>"; + + $special = $CORE_LOCAL->get("memSpecial") + $CORE_LOCAL->get("staffSpecial"); + $dbldiscounttotal = number_format($CORE_LOCAL->get("discounttotal"), 2); + if ($CORE_LOCAL->get("isMember") == 1) { + $dblyousaved = number_format( $CORE_LOCAL->get("transDiscount") + $dbldiscounttotal + $special, 2); + if (!$readOnly){ + $CORE_LOCAL->set("yousaved",$dblyousaved); + $CORE_LOCAL->set("couldhavesaved",0); + $CORE_LOCAL->set("specials",number_format($dbldiscounttotal + $special, 2)); + } + } + else { + $dblyousaved = number_format($CORE_LOCAL->get("memSpecial"),2); + if (!$readOnly){ + $CORE_LOCAL->set("yousaved",$dbldiscounttotal + $CORE_LOCAL->get("staffSpecial")); + $CORE_LOCAL->set("couldhavesaved",$dblyousaved); + $CORE_LOCAL->set("specials",$dbldiscounttotal + $CORE_LOCAL->get("staffSpecial")); + } + } + + if (!$readOnly){ + if ($CORE_LOCAL->get("End") == 1) { + MiscLib::rePoll(); + } + if ($CORE_LOCAL->get("scale") == 0 && $CORE_LOCAL->get("SNR") != 0) { + MiscLib::rePoll(); + } + } + + $ret .= "<tr class=\"values\">"; + $box = $modchain[0]->display_content(); + $ret .= sprintf('<td class="first %s" style="%s">%s</td>', + $modchain[0]->display_css_class,$modchain[0]->display_css,$box); + $box = $modchain[1]->display_content(); + $ret .= sprintf('<td class="reg %s" style="%s">%s</td>', + $modchain[1]->display_css_class,$modchain[1]->display_css,$box); + $box = $modchain[2]->display_content(); + $ret .= sprintf('<td class="reg %s" style="%s">%s</td>', + $modchain[2]->display_css_class,$modchain[2]->display_css,$box); + $box = $modchain[3]->display_content(); + $ret .= sprintf('<td class="reg %s" style="%s">%s</td>', + $modchain[3]->display_css_class,$modchain[3]->display_css,$box); + $box = $modchain[4]->display_content(); + $ret .= sprintf('<td class="total %s" style="%s">%s</td>', + $modchain[4]->display_css_class,$modchain[4]->display_css,$box); + $ret .= "</tr>"; + $ret .= "</table>"; + + if (!$readOnly){ + $ret .= "<form name='hidden'>\n"; + $ret .= "<input type='hidden' id='ccTermOut' name='ccTermOut' value=\"".$CORE_LOCAL->get("ccTermOut")."\">\n"; + $ret .= "</form>"; + $CORE_LOCAL->set("ccTermOut","idle"); + } + + return $ret; +} + +//--------------------------------------------------------------------// + +/** + Wrap a message in a id="plainmsg" div + @param $strmsg the message + @return An HTML string +*/ +static public function plainmsg($strmsg) { + return "<div id=\"plainmsg\" class=\"coloredText\">$strmsg</div>"; +} + + +//-------------------------------------------------------------------// + +/** + Get a centered message box + @param $strmsg the message + @param $icon graphic icon file + @param $noBeep don't send a scale beep + @return An HTML string + + This function will include the header + printheaderb(). +*/ +static public function msgbox($strmsg, $icon,$noBeep=False) { + global $CORE_LOCAL; + + $ret = self::printheaderb(); + $ret .= "<div id=\"boxMsg\" class=\"centeredDisplay\">"; + $ret .= "<div class=\"boxMsgAlert coloredArea\">"; + $ret .= $CORE_LOCAL->get("alertBar"); + $ret .= "</div>"; + $ret .= "<div class=\"boxMsgBody\">"; + $ret .= "<div class=\"msgicon\"><img src=\"$icon\" /></div>"; + $ret .= "<div class=\"msgtext\">"; + $ret .= $strmsg; + $ret .= "</div><div class=\"clear\"></div></div>"; + $ret .= "</div>"; + + if (!$noBeep) + MiscLib::errorBeep(); + + $CORE_LOCAL->set("strRemembered",$CORE_LOCAL->get("strEntered")); + $CORE_LOCAL->set("msgrepeat",1); + + return $ret; +} +//--------------------------------------------------------------------// + +/** + Get a centered message box with "crossD" graphic + @param $strmsg the message + @return An HTML string + + An alias for msgbox(). +*/ +static public function xboxMsg($strmsg) { + return self::msgbox($strmsg, MiscLib::base_url()."graphics/crossD.gif"); +} + +/** + Get a centered message box with "exclaimC" graphic + @param $strmsg the message + @param $header does nothing... + @param $noBeep don't beep scale + @return An HTML string + + An alias for msgbox(). +*/ +static public function boxMsg($strmsg,$header="",$noBeep=False) { + return self::msgbox($strmsg, MiscLib::base_url()."graphics/exclaimC.gif",$noBeep); +} + +/** + Get a centered message box with input unknown message. + @return An HTML string + + An alias for msgbox(). +*/ +static public function inputUnknown() { + return self::msgbox("<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "._("input unknown")."</b>", MiscLib::base_url()."graphics/exclaimC.gif",True); +} + +//--------------------------------------------------------------------// + +/** + Get the standard header row with CASHIER + and MEMBER info + @return An HTML string +*/ +static public function printheaderb() { + global $CORE_LOCAL; + + $strmemberID = ""; + if ($CORE_LOCAL->get("memberID") == "0") { + $strmemberID = ""; + } + else { + $strmemberID = $CORE_LOCAL->get("memMsg"); + if ($CORE_LOCAL->get("isMember") == 0){ + $strmemberID = str_replace("(0)", "(n/a)", $strmemberID); + } + } + + $ret = ' + <div id="headerb"> + <div class="left"> + <span class="bigger">'._("M E M B E R").' &nbsp;&nbsp;</span> + <span class="smaller"> + '.$strmemberID.' + </span> + </div> + <div class="right"> + <span class="bigger">'._("C A S H I E R").' &nbsp;&nbsp;</span> + <span class="smaller"> + '.$CORE_LOCAL->get("cashier").' + </span> + </div> + <div class="clear"></div> + </div> + '; + return $ret; +} + +//-------------------------------------------------------------------// + +/** + Get a transaction line item + @param $field2 typically description + @param $field3 comment section. Used for things + like "0.59@1.99" on weight items. + @param $total the right-hand number + @param $field5 flags after the number + @param $trans_id value from localtemptrans. Including + the trans_id makes the lines selectable via mouseclick + (or touchscreen). + @return An HTML string +*/ +static public function printitem($field2, $field3, $total, $field5, $trans_id=-1) { + global $CORE_LOCAL; + + $onclick = ""; + if ($trans_id != -1){ + $curID = $CORE_LOCAL->get("currentid"); + $diff = $trans_id - $curID; + if ($diff > 0){ + $onclick="onclick=\"parseWrapper('D$diff');\""; + } + else if ($diff < 0){ + $diff *= -1; + $onclick="onclick=\"parseWrapper('U$diff');\""; + } + } + + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($field2 == "") $field2 = "&nbsp;"; + if (trim($field3) == "") $field3 = "&nbsp;"; + if ($field5 == "") $field5 = "&nbsp;"; + + $ret = "<div class=\"item\">"; + $ret .= "<div $onclick class=\"desc coloredText\">$field2</div>"; + $ret .= "<div $onclick class=\"comments lightestColorText\">$field3</div>"; + $ret .= "<div $onclick class=\"total lightestColorText\">$total</div>"; + $ret .= "<div $onclick class=\"suffix lightestColorText\">$field5</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//------------------------------------------------------------------// + +/** + Get a transaction line item in a specific color + @param $color is a hex color code (do not include a '#') + (see CSS notes) + @param $description typically description + @param $comments comment section. Used for things + like "0.59@1.99" on weight items. + @param $total the right-hand number + @param $suffix flags after the number + @param $trans_id value from localtemptrans. Including + the trans_id makes the lines selectable via mouseclick + (or touchscreen). + @return An HTML string + + CSS Notes: + In an effort to replace hard-coded colors, some values are + re-written as CSS classes rather than inline styles. + Current mapping: + - 004080 => coloredText + - 408080 => lightColorText + - 000000 => totalLine + - 800080 => fsLine +*/ +static public function printitemcolor($color, $description, $comments, $total, $suffix,$trans_id=-1) { + global $CORE_LOCAL; + + $onclick = ""; + if ($trans_id != -1){ + $curID = $CORE_LOCAL->get("currentid"); + $diff = $trans_id - $curID; + if ($diff > 0){ + $onclick="onclick=\"parseWrapper('D$diff');\""; + } + else if ($diff < 0){ + $diff *= -1; + $onclick="onclick=\"parseWrapper('U$diff');\""; + } + } + + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($total == 0 && $color == "408080") $total = "&nbsp;"; + if ($description == "") $description = "&nbsp;"; + if (trim($comments) == "") $comments = "&nbsp;"; + if ($suffix == "") $suffix = "&nbsp;"; + + $style = ''; + $class = ''; + if ($color == '004080') + $class = 'coloredText'; + else if ($color == '000000') + $class = 'totalLine'; + else if ($color == '800080') + $class = 'fsLine'; + else if ($color == '408080') + $class = 'lightColorText'; + else + $style = "style=\"color:#$color;\""; + + $ret = "<div class=\"item\">"; + $ret .= "<div $onclick class=\"desc $class\" $style>$description</div>"; + $ret .= "<div $onclick class=\"comments $class\" $style>$comments</div>"; + $ret .= "<div $onclick class=\"total $class\" $style>$total</div>"; + $ret .= "<div $onclick class=\"suffix $class\" $style>$suffix</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//----------------------------------------------------------------// + +/** + Get a transaction line item in a specific color + @param $color is a hex color code (do not include a '#') + (see CSS notes) + @param $description typically description + @param $comments comment section. Used for things + like "0.59@1.99" on weight items. + @param $total the right-hand number + @param $suffix flags after the number + @return An HTML string + + CSS Notes: + In an effort to replace hard-coded colors, some values are + re-written as CSS classes rather than inline styles. + Current mapping: + - 004080 => coloredArea + - 408080 => lightColorArea + - 000000 => totalArea + - 800080 => fsArea +*/ +static public function printitemcolorhilite($color, $description, $comments, $total, $suffix) { + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($total == 0 && $color == "408080") $total = "&nbsp;"; + if ($description == "") $description="&nbsp;"; + if (trim($comments) == "") $comments="&nbsp;"; + if ($suffix == "") $suffix="&nbsp;"; + + $style = ''; + $class = ''; + if ($color == '004080') + $class = 'coloredArea'; + else if ($color == '000000') + $class = 'totalArea'; + else if ($color == '800080') + $class = 'fsArea'; + else if ($color == '408080') + $class = 'lightColorArea'; + else + $style = "style=\"background:#$color;color:#ffffff;\""; + + $ret = "<div class=\"item\">"; + $ret .= "<div class=\"desc $class\" $style>$description</div>"; + $ret .= "<div class=\"comments $class\" $style>$comments</div>"; + $ret .= "<div class=\"total $class\" $style>$total</div>"; + $ret .= "<div class=\"suffix $class\" $style>$suffix</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//----------------------------------------------------------------// + +/** + Get the scale display box + @param $input message from scale + @return An HTML string + + If $input is specified, weight information + in the session gets updated before returning + the current value. + + Known input values are: + - S11WWWW where WWWW is weight in hundreths + (i.e., 1lb = 0100) + - S141 not settled on a weight yet + - S143 zero weight + - S145 an error condition + - S142 an error condition +*/ +static public function scaledisplaymsg($input=""){ + global $CORE_LOCAL; + $reginput = trim(strtoupper($input)); + + $scans = ''; + + // return early; all other cases simplified + // by resetting session "weight" + if (strlen($reginput) == 0) { + if (is_numeric($CORE_LOCAL->get("weight"))) + return number_format($CORE_LOCAL->get("weight"), 2)." lb"; + else + return $CORE_LOCAL->get("weight")." lb"; + } + + $display_weight = ""; + $weight = 0; + $CORE_LOCAL->set("scale",0); + $CORE_LOCAL->set("weight",0); + + $prefix = "NonsenseThatWillNotEverHappen"; + if (substr($reginput, 0, 3) == "S11") + $prefix = "S11"; + else if (substr($reginput,0,4)=="S144") + $prefix = "S144"; + + if (strpos($reginput, $prefix) === 0){ + $len = strlen($prefix); + if (!substr($reginput, $len) || + !is_numeric(substr($reginput, $len))) { + $display_weight = "_ _ _ _"; + } + else { + $weight = number_format(substr($reginput, $len)/100, 2); + $CORE_LOCAL->set("weight",$weight); + $display_weight = $weight." lb"; + $CORE_LOCAL->set("scale",1); + if ($CORE_LOCAL->get('SNR') != 0 && $weight != 0){ + $scans = $CORE_LOCAL->get('SNR'); + } + } + } + elseif (substr($reginput, 0, 4) == "S143") { + $display_weight = "0.00 lb"; + $CORE_LOCAL->set("scale",1); + } + elseif (substr($reginput, 0, 4) == "S141") { + $display_weight = "_ _ _ _"; + } + elseif (substr($reginput, 0, 4) == "S145") { + $display_weight = "err -0"; + } + elseif (substr($reginput, 0, 4) == "S142") { + $display_weight = "error"; + } + else { + $display_weight = "? ? ? ?"; + } + + $ret = array('display'=>$display_weight); + if (!empty($scans)) $ret['upc'] = $scans; + + return $ret; +} + +/** + Display CC terminal state + @return HTML string +*/ +static public function termdisplaymsg(){ + global $CORE_LOCAL; + if (!in_array("Paycards",$CORE_LOCAL->get("PluginList"))) + return ''; + elseif($CORE_LOCAL->get("PaycardsCashierFacing")=="1") + return ''; + // style box to look like a little screen + $ret = '<div style="background:#ccc;border:solid 1px black;padding:7px;text-align:center;font-size:120%;">'; + $rdy = '<div style="background:#0c0;border:solid 1px black;padding:7px;text-align:center;font-size:120%;">'; + switch($CORE_LOCAL->get('ccTermState')){ + case 'swipe': + return $ret.'Slide<br />Card</div>'; + break; + case 'ready': + return $rdy.'Ready</div>'; + break; + case 'pin': + return $ret.'Enter<br />PIN</div>'; + break; + case 'type': + return $ret.'Card<br />Type</div>'; + break; + case 'cashback': + return $ret.'Cash<br />Back</div>'; + break; + } + return ''; +} + +/** + Get the items currently on screen + @param $top_item is trans_id (localtemptrans) + of the first item to display + @param $highlight is the trans_id (localtemptrans) + of the currently selected item + @return An HTML string + + If you just want to show the most recently + scanned items, use lastpage(). +*/ +static public function listitems($top_item, $highlight) { + global $CORE_LOCAL; + + Database::getsubtotals(); + $LastID = $CORE_LOCAL->get("LastID"); + +//----------------Boundary Top ------------------ + + if ($highlight < 1) { + $highlight = 1; + $top_item = 1; + } + + if ($highlight > $LastID) { + $highlight = $LastID; + } + + if ($highlight < $top_item) { + $top_item = $highlight; + } + + if ($highlight > ($top_item + 11)) { + $top_item = ($highlight - 11); + } + + $CORE_LOCAL->set("currenttopid",$top_item); + $CORE_LOCAL->set("currentid",$highlight); + +//------------------Boundary Bottom---------------- + + $CORE_LOCAL->set("currentid",$highlight); + return self::drawitems($top_item, 11, $highlight); +} + + +/** + Show some items and farewell message + @param $readOnly don't update totals + @return An HTML string + + Show a few recent items and the + "Thank you for shopping" messaging. + + Yes, this function should be renamed. It + has nothing to do with receipts. +*/ +static public function printReceiptfooter($readOnly=False) { + global $CORE_LOCAL; + + if (!$readOnly) + Database::getsubtotals(); + $last_id = $CORE_LOCAL->get("LastID"); + + if (($last_id - 7) < 0) { + $top_id = 1; + } + else { + $top_id = $last_id - 7; + } + + $ret = self::drawitems($top_id, 7, 0); + + $ret .= "<div class=\"farewellMsg coloredText\">"; + for($i=0;$i<=$CORE_LOCAL->get("farewellMsgCount");$i++){ + $ret .= $CORE_LOCAL->get("farewellMsg".$i)."<br />"; + } + + $email = CoreState::getCustomerPref('email_receipt'); + $doEmail = filter_var($email, FILTER_VALIDATE_EMAIL); + if($doEmail) $ret .= 'receipt emailed'; + + $ret .= "</div>"; + return $ret; +} + + +/** + Get the currently displayed items + @param $top_item is the trans_id of the first item to display + @param $rows is the number of items to display + @param $highlight is the trans_id of the selected item + @return An HTML string + + This function probably shouldn't be used directly. + Call listitems() or lastpage() instead. +*/ +static public function drawitems($top_item, $rows, $highlight) { + global $CORE_LOCAL; + + $ret = self::printheaderb(); + + $query = "select count(*) as count from localtemptrans"; + $db = Database::tDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + $rowCount = $row["count"]; + + $last_item = array(); + + if ($rowCount == 0) { + $ret .= "<div class=\"centerOffset\">"; + $msg_text = ""; + if ($CORE_LOCAL->get("training") != 1) { + for($i=1; $i<=$CORE_LOCAL->get("welcomeMsgCount");$i++){ + $msg_text .= $CORE_LOCAL->get("welcomeMsg".$i)."<br />"; + } + } + else { + for($i=1; $i<=$CORE_LOCAL->get("trainingMsgCount");$i++){ + $msg_text .= $CORE_LOCAL->get("trainingMsg".$i)."<br />"; + } + } + $ret .= self::plainmsg($msg_text); + $ret .= "</div>"; + } + else { + + $query_range = "select trans_id,description,total,comment,status,lineColor + from screendisplay where trans_id >= ".$top_item." and trans_id <= " + .($top_item + $rows)." order by trans_id"; + $db_range = Database::tDataConnect(); + $result_range = $db_range->query($query_range); + $num_rows = $db_range->num_rows($result_range); + + for ($i = 0; $i < $num_rows; $i++) { + $row = $db_range->fetch_array($result_range); + + $trans_id = $row["trans_id"]; + $description = $row["description"]; + $total = $row["total"]; + $comment = $row["comment"]; + $tf = $row["status"]; + $color = $row["lineColor"]; + + + if ($trans_id == $highlight) { + $ret .= self::printitemcolorhilite($color, $description, $comment, $total, $tf); + } + else + { + if ($color == "004080") { + $ret .= self::printitem($description, $comment, $total, $tf,$trans_id); + } + else { + $ret .= self::printitemcolor($color, $description, $comment, $total, $tf,$trans_id); + } + } + + if (!strstr($description,'Subtotal')){ + $fixed_desc = str_replace(":"," ",$description); + if (strlen($fixed_desc) > 24){ + $fixed_desc = substr($fixed_desc,0,24); + } + $fixed_price = empty($total)?'':sprintf('%.2f',$total); + $spaces = str_pad('',30-strlen($fixed_desc)-strlen($fixed_price),' '); + $last_item[] = $fixed_desc.$spaces.$fixed_price; + } + } + } + + $td = SigCapture::term_object(); + if (is_object($td) && !empty($last_item)){ + $due = sprintf('%.2f',$CORE_LOCAL->get("amtdue")); + $dueline = 'Subtotal' + .str_pad('',22-strlen($due),' ') + .$due; + $items = ""; + $count = 0; + for($i=count($last_item)-1;$i>=0;$i--){ + $items = ":".$last_item[$i].$items; + $count++; + if ($count >= 3) break; + } + for($i=$count;$i<3;$i++) + $items = ": ".$items; + $td->WriteToScale("display:".$last_item.":".$dueline); + } + + return $ret; +} + + +/** + Get the currently displayed items + @param $readOnly don't update session + @return An HTML string + + This will always display the most recently + scanned items. If you want a specific subset, + use listitems(). +*/ +static public function lastpage($readOnly=False) { + global $CORE_LOCAL; + + if (!$readOnly){ + Database::getsubtotals(); + } + $last_id = $CORE_LOCAL->get("LastID"); + + if (($last_id - 11) < 0) { + $top_id = 1; + } + else { + $top_id = $last_id - 11; + } + + if (!$readOnly){ + $CORE_LOCAL->set("currentid",$last_id); + $CORE_LOCAL->set("currenttopid",$top_id); + } + return self::drawitems($top_id, 11, $last_id); +} + +} // end class DisplayLib + +?> diff --git a/pos/is4c-nf/lib/FooterBoxes/EveryoneSales.php b/pos/is4c-nf/lib/FooterBoxes/EveryoneSales.php new file mode 100644 index 000000000..95a55f9b4 --- /dev/null +++ b/pos/is4c-nf/lib/FooterBoxes/EveryoneSales.php @@ -0,0 +1,41 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class EveryoneSales extends FooterBox { + + public $header_css_class = 'coloredText'; + public $display_css = "font-weight:bold;font-size:110%;"; + public $display_css_class = 'lightestColorText'; + + function header_content(){ + return _("Special"); + } + + function display_content(){ + global $CORE_LOCAL; + $saleTTL = (is_numeric($CORE_LOCAL->get("discounttotal"))) ? number_format($CORE_LOCAL->get("discounttotal"),2) : "0.00"; + return $saleTTL; + } +} + +?> diff --git a/pos/is4c-nf/lib/FooterBoxes/FooterBox.php b/pos/is4c-nf/lib/FooterBoxes/FooterBox.php new file mode 100644 index 000000000..c72d79c46 --- /dev/null +++ b/pos/is4c-nf/lib/FooterBoxes/FooterBox.php @@ -0,0 +1,78 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class FooterBox + Base class for displaying footer + + The footer contain five boxes. Stores + can select a different module for each + box. +*/ +class FooterBox { + + /** + CSS here will be applied (in-line) to the + header content. If you define a different + width alignment might go haywire. + */ + public $header_css = ''; + public $header_css_class = ''; + /** + CSS here will be applied (in-line) to the + display content. If you define a different + width alignment might go haywire. + */ + public $display_css = ''; + public $display_css_class = ''; + + /** + Define the header for this box + @return An HTML string + */ + function header_content(){ + return ""; + } + + /** + Define the content for this box + @return An HTML string + */ + function display_content(){ + return ""; + } +} + +/** + @example EgoFooter.php + + Footer Box modules are pretty simple. The header_content() + method defines the label above the box and the + display_content() method defines the box itself. If needed + you can define CSS via the class properties. + + This module just shows a constant reminder about the + store's most critical department. +*/ + +?> diff --git a/pos/is4c-nf/lib/FooterBoxes/MemSales.php b/pos/is4c-nf/lib/FooterBoxes/MemSales.php new file mode 100644 index 000000000..b6f1140f3 --- /dev/null +++ b/pos/is4c-nf/lib/FooterBoxes/MemSales.php @@ -0,0 +1,43 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class MemSales extends FooterBox { + + public $header_css_class = 'coloredText'; + public $display_css = "font-weight:bold;font-size:110%;"; + public $display_css_class = 'lightestColorText'; + + function header_content(){ + return _("Mbr Special"); + } + + function display_content(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("isMember") == 1) + return number_format($CORE_LOCAL->get("memSpecial"), 2); + else + return "n/a"; + } +} + +?> diff --git a/pos/is4c-nf/lib/FooterBoxes/MultiTotal.php b/pos/is4c-nf/lib/FooterBoxes/MultiTotal.php new file mode 100644 index 000000000..a205809f2 --- /dev/null +++ b/pos/is4c-nf/lib/FooterBoxes/MultiTotal.php @@ -0,0 +1,73 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class MultiTotal extends FooterBox { + + public $display_css = "font-weight:bold;font-size:150%;"; + + function header_content(){ + global $CORE_LOCAL; + if ( $CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") != 1 ) { + if ($CORE_LOCAL->get("fntlflag") == 1){ + $this->header_css_class = 'fsArea'; + return _("fs Amount Due"); + } + else { + $this->header_css_class = 'errorColoredArea'; + return _("Amount Due"); + } + } + elseif ($CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") == 1 ) { + $this->header_css_class = 'coloredArea'; + return _("Change"); + } + else { + $this->header_css_class = 'totalArea'; + return _("Total"); + } + } + + function display_content(){ + global $CORE_LOCAL; + if ( $CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") != 1 ) { + if ($CORE_LOCAL->get("fntlflag") == 1){ + $this->display_css_class = 'fsLine'; + return number_format($CORE_LOCAL->get("fsEligible"),2); + } + else { + $this->display_css_class = 'errorColoredText'; + return number_format($CORE_LOCAL->get("runningTotal"),2); + } + } + elseif ($CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") == 1 ) { + $this->display_css_class = 'coloredText'; + return number_format($CORE_LOCAL->get("runningTotal"),2); + } + else { + $this->display_css_class = 'totalLine'; + return number_format((double)$CORE_LOCAL->get("runningTotal"),2); + } + } +} + +?> diff --git a/pos/is4c-nf/lib/FooterBoxes/SavedOrCouldHave.php b/pos/is4c-nf/lib/FooterBoxes/SavedOrCouldHave.php new file mode 100644 index 000000000..6320b21a4 --- /dev/null +++ b/pos/is4c-nf/lib/FooterBoxes/SavedOrCouldHave.php @@ -0,0 +1,51 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class SavedOrCouldHave extends FooterBox { + + public $display_css = "font-weight:bold;font-size:150%;"; + public $display_css_class = 'coloredText'; + + function header_content(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("isMember") == 1) + return _("You Saved"); + else + return _("Could Have Saved"); + } + + function display_content(){ + global $CORE_LOCAL; + $saleTTL = (is_numeric($CORE_LOCAL->get("discounttotal"))) ? number_format($CORE_LOCAL->get("discounttotal"),2) : "0.00"; + $memSaleTTL = is_numeric($CORE_LOCAL->get("memSpecial")) ? number_format($CORE_LOCAL->get("memSpecial"),2) : "0.00"; + + if ($CORE_LOCAL->get("isMember") == 1){ + return number_format($CORE_LOCAL->get("transDiscount") + + $saleTTL + $memSaleTTL, 2); + } + else + return $memSaleTTL; + } +} + +?> diff --git a/pos/is4c-nf/lib/FooterBoxes/TransPercentDiscount.php b/pos/is4c-nf/lib/FooterBoxes/TransPercentDiscount.php new file mode 100644 index 000000000..cd26e6201 --- /dev/null +++ b/pos/is4c-nf/lib/FooterBoxes/TransPercentDiscount.php @@ -0,0 +1,47 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class TransPercentDiscount extends FooterBox { + + public $header_css_class = 'coloredText'; + public $display_css = "font-weight:bold;font-size:110%;"; + public $display_css_class = 'lightestText'; + + function header_content(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("percentDiscount") == 0) + return _("% Discount"); + else + return $CORE_LOCAL->get("percentDiscount")._("% Discount"); + } + + function display_content(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("percentDiscount") != 0 ) + return number_format($CORE_LOCAL->get("transDiscount"), 2); + else + return "n/a"; + } +} + +?> diff --git a/pos/is4c-nf/lib/JsonLib.php b/pos/is4c-nf/lib/JsonLib.php new file mode 100644 index 000000000..07a33ad8e --- /dev/null +++ b/pos/is4c-nf/lib/JsonLib.php @@ -0,0 +1,87 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class JsonLib + Functions for JSON support in PHP < 5.3 +*/ +class JsonLib extends LibraryClass { + +/** + Convert an array to a JSON string + @param $arr an array of values + @return A JSON string representing the array +*/ +static public function array_to_json($arr){ + $ret = "["; + for($i=0;$i<count($arr);$i++){ + if (isset($arr[$i])) + $ret .= self::encode_value_json($arr[$i]).","; + else { + $ret = ""; + break; // not a numeric indexed array + } + } + if (!empty($ret)){ + $ret = substr($ret,0,strlen($ret)-1)."]"; + return $ret; + } + + $ret = "{"; + foreach($arr as $k=>$v){ + $ret .= '"'.$k.'":'; + $ret .= self::encode_value_json($v).","; + } + $ret = substr($ret,0,strlen($ret)-1)."}"; + return $ret; +} + +/** + Convert a variable to a JSON string + @param $val a single variable + @return A JSON string representing the variable +*/ +static public function encode_value_json($val){ + if (is_array($val)) return self::array_to_json($val); + if (is_numeric($val)) return ltrim($val,'0'); + if ($val === true) return 'true'; + if ($val === false) return 'false'; + else return '"'.addcslashes($val,"\\\"\r\n\t").'"'; +} + +/** + Remove newlines, carriage returns, and tabs + from the string (some browser don't like these + in JSON strings) + @str a string + @return the modified string +*/ +static public function fixstring($str){ + $str = str_replace("\n","",$str); + $str = str_replace("\r","",$str); + $str = str_replace("\t","",$str); +} + +} + +?> diff --git a/pos/is4c-nf/lib/Kickers/Kicker.php b/pos/is4c-nf/lib/Kickers/Kicker.php new file mode 100644 index 000000000..dc835127f --- /dev/null +++ b/pos/is4c-nf/lib/Kickers/Kicker.php @@ -0,0 +1,73 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class Kicker + Base class for opening cash drawer + +*/ +class Kicker { + + /** + Determine whether to open the drawer + @return boolean + */ + function doKick(){ + global $CORE_LOCAL; + if($CORE_LOCAL->get('training') == 1) return False; + $db = Database::tDataConnect(); + + $query = "select trans_id from localtemptrans where + (trans_subtype = 'CA' and total <> 0)"; + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + return ($num_rows > 0) ? True : False; + + } + + /** + Determine whether to open the drawer when + a cashier signs in + @return boolean + */ + function kickOnSignIn(){ + global $CORE_LOCAL; + if($CORE_LOCAL->get('training') == 1) return False; + return True; + } + + /** + Determine whether to open the drawer when + a cashier signs out + @return boolean + */ + function kickOnSignOut(){ + global $CORE_LOCAL; + if($CORE_LOCAL->get('training') == 1) return False; + return True; + } +} + +?> diff --git a/pos/is4c-nf/lib/Kickers/WFC_Kicker.php b/pos/is4c-nf/lib/Kickers/WFC_Kicker.php new file mode 100755 index 000000000..631eb40f9 --- /dev/null +++ b/pos/is4c-nf/lib/Kickers/WFC_Kicker.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class WFC_Kicker + Opens drawer for cash, credit card over $25, + credit card refunds, and stamp sales +*/ +class WFC_Kicker extends Kicker { + + function doKick(){ + global $CORE_LOCAL; + $db = Database::tDataConnect(); + + $query = "select trans_id from localtemptrans where + (trans_subtype = 'CA' and total <> 0) or + (trans_subtype IN ('CC','AX') AND (total < -25 or total > 0)) or + upc='0000000001065'"; + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + $ret = ($num_rows > 0) ? True : False; + + // use session to override default behavior + // based on specific cashier actions rather + // than transaction state + $override = $CORE_LOCAL->get('kickOverride'); + $CORE_LOCAL->set('kickOverride',False); + if ($override === True) $ret = True; + + return $ret; + } + + function kickOnSignIn(){ + return False; + } +} + +?> diff --git a/pos/is4c-nf/lib/LocalStorage/LocalStorage.php b/pos/is4c-nf/lib/LocalStorage/LocalStorage.php new file mode 100644 index 000000000..ca5aa88ab --- /dev/null +++ b/pos/is4c-nf/lib/LocalStorage/LocalStorage.php @@ -0,0 +1,106 @@ +<?php + +/** + @class LocalStorage + + A module for storing persistent values + This is handled via PHP sessions by + default. + + Interface class. Must be subclassed + to do anything. +*/ + +class LocalStorage { + + protected $immutables = array(); + + /** + Constructor + */ + function LocalStorage(){ + + } + + /** + Get the value stored with the given key + @param $key A unique key string + @return The value (mixed) + + The value can be any PHP type that the + underlying mechanism can store. + + If the key is not found, the return + value will be an empty string. + */ + function get($key){ + + } + + /** + Save the value with the given key + @param $key A unique key string + @param $val The value (mixed) + @param $immutable the value is a constant + + The value can be any PHP type that the + underlying mechanism can store. + */ + function set($key,$val,$immutable=False){ + debug($key); + } + + /** + Store an immutable value by key + @param $key A unique key string + @param $val The value (mixed) + + Values are saved in LocalStorage::immutables + */ + function immutable_set($key,$val){ + $this->immutables[$key] = $val; + } + + /** + Check if a key is present in immutables + @param $key A unique key string + @return bool + */ + function is_immutable($key){ + if (isset($this->immutables[$key])) + return True; + else + return False; + } + + /** + Log state changes if debugging is enabled + + Call this from your set method + */ + function debug(){ + if($this->get("Debug_CoreLocal") == 1){ + $stack = debug_backtrace(); + $log = realpath(dirname(__FILE__).'/../../log/').'/core_local.log'; + $fp = @fopen($log,'a'); + if ($fp){ + foreach($stack as $s){ + if ($s['function']=='set'&&$s['class']==get_class($this)){ + ob_start(); + echo date('r').': Changed value for '.$s['args'][0]."\n"; + echo 'New value: '; + print_r($s['args'][1]); + echo "\n"; + echo 'Line '.$s['line'].', '.$s['file']."\n\n"; + $out = ob_get_clean(); + fwrite($fp,$out); + break; + } + } + fclose($fp); + } + } + } +} + +?> diff --git a/pos/is4c-nf/lib/LocalStorage/MemcacheStorage.php b/pos/is4c-nf/lib/LocalStorage/MemcacheStorage.php new file mode 100644 index 000000000..4b868da70 --- /dev/null +++ b/pos/is4c-nf/lib/LocalStorage/MemcacheStorage.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("LocalStorage")) include_once(realpath(dirname(__FILE__).'/LocalStorage.php')); + +/** + @class MemcacheStorage + + A LocalStorage implementation using + memcached + + Requires memcached +*/ +class MemcacheStorage extends LocalStorage { + + var $con; + function MemcacheStorage(){ + $this->con = new Memcache(); + $this->con->connect('127.0.0.1',11211); + } + + function get($key){ + if ($this->is_immutable($key)) return $this->immutables[$key]; + $val = $this->con->get($key); + if ($val === False){ + $exists = $this->con->replace($key,False); + if ($exists === False) + return ""; + } + return $val; + } + + function set($key,$val,$immutable=False){ + if ($immutable) + $this->immutable_set($key,$val); + else + $this->con->set($key,$val); + $this->debug($key,$val); + } +} + +?> diff --git a/pos/is4c-nf/lib/LocalStorage/SQLiteDB/db b/pos/is4c-nf/lib/LocalStorage/SQLiteDB/db new file mode 100644 index 000000000..bf857a59d Binary files /dev/null and b/pos/is4c-nf/lib/LocalStorage/SQLiteDB/db differ diff --git a/pos/is4c-nf/lib/LocalStorage/SQLiteStorage.php b/pos/is4c-nf/lib/LocalStorage/SQLiteStorage.php new file mode 100644 index 000000000..21b14748c --- /dev/null +++ b/pos/is4c-nf/lib/LocalStorage/SQLiteStorage.php @@ -0,0 +1,67 @@ +<?php + +if (!class_exists("LocalStorage")) include_once($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/LocalStorage.php"); + +/** + @class SQLiteStorage + A LocalStorage implementation using SQLite + + Mostly a sample of what an alternative might + look like. Performance is decidedly subpar. + Not recommended for production use. +*/ +class SQLiteStorage extends LocalStorage { + var $db; + function SQLiteStorage(){ + $this->db = $this->conn(); + $result = sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND name='is4c_local'", $this->db); + + if (sqlite_num_rows($result) == 0){ + $result = sqlite_query("CREATE TABLE is4c_local (keystr varchar(255), valstr varchar(255), + PRIMARY KEY (keystr) )",$this->db); + } + } + + function get($key){ + if ($this->is_immutable($key)) return $this->immutables[$key]; + + $row = sqlite_array_query("SELECT valstr FROM is4c_local WHERE keystr='$key'",$this->db); + if (!$row) return ""; + $row = $row[0]; + if (strstr($row[0],chr(255))) return explode(chr(255),$row[0]); + else return $row[0]; + } + + function set($key,$val,$immutable=False){ + if ($immutable) + $this->immutable_set($key,$val); + else { + if (empty($val)) + sqlite_query("DELETE FROM is4c_local WHERE keystr='$key'",$this->db); + else { + if (is_array($val)){ + $temp = ""; + foreach($val as $v) $temp.=$v.chr(255); + $val = substr($temp,0,strlen($temp)-1); + } + $check = sqlite_query("SELECT valstr FROM is4c_local WHERE keystr='$key'",$this->db); + if (sqlite_num_rows($check) == 0){ + //echo "INSERT INTO is4c_local VALUES ('$key','$val')"; + sqlite_query("INSERT INTO is4c_local VALUES ('$key','$val')",$this->db); + } + else + sqlite_query("UPDATE is4c_local SET valstr='$val' WHERE keystr='$key'",$this->db); + } + } + $this->debug(); + } + + function conn(){ + return sqlite_open($_SESSION["INCLUDE_PATH"]. + "/lib/LocalStorage/SQLiteDB/db", + 0666); + + } +} + +?> diff --git a/pos/is4c-nf/lib/LocalStorage/SessionStorage.php b/pos/is4c-nf/lib/LocalStorage/SessionStorage.php new file mode 100644 index 000000000..c49b21cf4 --- /dev/null +++ b/pos/is4c-nf/lib/LocalStorage/SessionStorage.php @@ -0,0 +1,57 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("LocalStorage")) include_once(realpath(dirname(__FILE__).'/LocalStorage.php')); + +/** + @class SessionStorage + + A LocalStorage implementation using + PHP sessions. + + The module will try to start session as + needed but performance is better if + session.auto_start is enabled in php.ini. +*/ +class SessionStorage extends LocalStorage { + function SessionStorage(){ + if(ini_get('session.auto_start')==0 && !headers_sent()) + @session_start(); + } + + function get($key){ + if ($this->is_immutable($key)) return $this->immutables[$key]; + if (!isset($_SESSION["$key"])) return ""; + return $_SESSION["$key"]; + } + + function set($key,$val,$immutable=False){ + if ($immutable) + $this->immutable_set($key,$val); + else + $_SESSION["$key"] = $val; + $this->debug($key,$val); + } +} + +?> diff --git a/pos/is4c-nf/lib/LocalStorage/UnitTestStorage.php b/pos/is4c-nf/lib/LocalStorage/UnitTestStorage.php new file mode 100644 index 000000000..01f3e3ee0 --- /dev/null +++ b/pos/is4c-nf/lib/LocalStorage/UnitTestStorage.php @@ -0,0 +1,50 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("LocalStorage")) include_once(realpath(dirname(__FILE__).'/LocalStorage.php')); + +/** + @class UnitTestStorage + + Doesn't do any persistant storage. Just facilitates unit testing +*/ +class UnitTestStorage extends LocalStorage { + + private $mutable = array(); + + function get($key){ + if ($this->is_immutable($key)) return $this->immutables[$key]; + if (!isset($this->mutable["$key"])) return ""; + return $this->mutable["$key"]; + } + + function set($key,$val,$immutable=False){ + if ($immutable) + $this->immutable_set($key,$val); + else + $this->mutable["$key"] = $val; + $this->debug($key,$val); + } +} + +?> diff --git a/pos/is4c-nf/lib/LocalStorage/conf.php b/pos/is4c-nf/lib/LocalStorage/conf.php new file mode 100755 index 000000000..b65495bb9 --- /dev/null +++ b/pos/is4c-nf/lib/LocalStorage/conf.php @@ -0,0 +1,52 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @file + @brief This file specifies the LocalStorage implemenation + + Include this file to get a LocalStorage instance + in the variable $CORE_LOCAL. +*/ + +$elog = realpath(dirname(__FILE__).'/../../log/').'/php-errors.log'; +ini_set('error_log',$elog); + +$LOCAL_STORAGE_MECHANISM = 'SessionStorage'; + +if (!class_exists($LOCAL_STORAGE_MECHANISM)){ + include(realpath(dirname(__FILE__).'/'.$LOCAL_STORAGE_MECHANISM.".php")); +} + +$CORE_LOCAL = new $LOCAL_STORAGE_MECHANISM(); +global $CORE_LOCAL; + +/** + Settings in ini.php are (or should be) immutable. They're not + necessarily saved in the session or session replacement mechanism. + Include these settings every time. +*/ +if (file_exists(dirname(__FILE__).'/../../ini.php')) + include_once(realpath(dirname(__FILE__).'/../../ini.php')); + +?> diff --git a/pos/is4c-nf/lib/MemberLookup.php b/pos/is4c-nf/lib/MemberLookup.php new file mode 100644 index 000000000..ae8df4e73 --- /dev/null +++ b/pos/is4c-nf/lib/MemberLookup.php @@ -0,0 +1,106 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class MemberLookup +*/ + +class MemberLookup { + + /** + This module handle numeric inputs + @return boolean default True + */ + public function handle_numbers(){ + return True; + } + + /** + This module handle text inputs + @return boolean default True + */ + public function handle_text(){ + return True; + } + + /** + Get return-value formatted array + @return an array with keys: + - url => redirect to URL, default False + - results => matching member records + + The results array is used to populate the + member <select> box. The key for each record + should be CardNo::personNum. The value is what's + displayed for the cashier and can be whatever + you like. + */ + protected function default_value(){ + return array( + 'url' => False, + 'results' => array() + ); + } + + /** + Find member by custdata.CardNo + @param $num the member number + @return array. See default_value(). + */ + public function lookup_by_number($num){ + $dbc = Database::pDataConnect(); + $query = $dbc->prepare_statement('SELECT CardNo, personNum, + LastName, FirstName FROM custdata + WHERE CardNo=? ORDER BY personNum'); + $result = $dbc->exec_statement($query, array($num)); + + $ret = $this->default_value(); + while($w = $dbc->fetch_row($result)){ + $key = $w['CardNo'].'::'.$w['personNum']; + $val = $w['LastName'].', '.$w['FirstName']; + $ret['results'][$key] = $val; + } + return $ret; + } + + /** + Find member by last name. + @param $num the search string. + @return array. See default_value(). + */ + public function lookup_by_text($text){ + $dbc = Database::pDataConnect(); + $query = $dbc->prepare_statement('SELECT CardNo, personNum, + LastName, FirstName FROM custdata + WHERE LastName LIKE ? ORDER BY LastName, FirstName'); + $result = $dbc->exec_statement($query, array($text.'%')); + $ret = $this->default_value(); + while($w = $dbc->fetch_row($result)){ + $key = $w['CardNo'].'::'.$w['personNum']; + $val = $w['LastName'].', '.$w['FirstName']; + $ret['results'][$key] = $val; + } + return $ret; + } + +} diff --git a/pos/is4c-nf/lib/MiscLib.php b/pos/is4c-nf/lib/MiscLib.php new file mode 100644 index 000000000..41976c990 --- /dev/null +++ b/pos/is4c-nf/lib/MiscLib.php @@ -0,0 +1,275 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @clss MiscLib + Generic functions +*/ +class MiscLib extends LibraryClass { + +/** + Path detection. Find the relative URL for + POS root. + @param $check_file file to search for + @return A relative URL with trailing slash +*/ +static public function base_url($check_file="css/pos.css"){ + $ret = ""; + $cutoff = 0; + while($cutoff < 20 && !file_exists($ret.$check_file)){ + $ret .= "../"; + $cutoff++; + } + if ($cutoff >= 20) return False; + else return $ret; +} + +// These functions have been translated from lib.asp by Brandon on 07.13.03. +// The "/blah" notation in the function heading indicates the Type of argument that should be given. + +// ----------int($num /numeric)---------- +// +// Given $num, detemine if it is numeric. +// If so, int returns the integral part of $num. +// Else generate a fatal error. + +/** + Cast value to integer + @param $num must be numeric + @return integer +*/ +static public function int($num) { + if(is_numeric($num)) { + return (int) $num; + } + else { + die("FATAL ERROR: Argument, '".$num.",' given to int() is not numeric."); + } +} + +// -----------nullwrap($num /numeric)---------- +// +// Given $num, if it is empty or of length less than one, nullwrap becomes "0". +// If the argument is a non-numeric, generate a fatal error. +// Else nullwrap becomes the number. + +/** + Sanitizes values + @param $num a value + @return a sanitized value + + Probably an artifact of ASP implementation. + In practice any argument that evaluates to False + get translated to integer zero. +*/ +static public function nullwrap($num) { + + + if ( !$num ) { + return 0; + } + elseif (!is_numeric($num) && strlen($num) < 1) { + return " "; + } + else { + return $num; + } +} + +// ----------truncate2($num /numeric)---------- +// +// Round $num to two (2) digits after the decimal and return it as a STRING. + +/** + Convert number to string with two decimal digits + @param $num a number + @return formatted string +*/ +static public function truncate2($num) { + return number_format($num, 2); +} + +// ----------pinghost($host /string)---------- +// +// Given $host, pinghost() looks up that host name or IP address. +// If it can connect function returned as true, else false. + +/** + Ping a host + @param $host the name or IP + @return + - 1 on success + - 0 on failure + @deprecated + Doesn't work reliably in all environments. + Use pingport(). +*/ +static public function pinghost($host) +{ + global $CORE_LOCAL; + + $host = str_replace("[", "", $host); + $host = str_replace("]", "", $host); + + if (strstr($host,"\\")){ + $tmp = explode("\\",$host); + $host = $tmp[0]; + } + + $intConnected = 0; + if ($CORE_LOCAL->get("OS") == "win32") { + $pingReturn = exec("ping -n 1 $host", $aPingReturn); + $packetLoss = "(0% loss"; + } else { + $pingReturn = exec("ping -c 1 $host", $aPingReturn); + $packetLoss = "1 received, 0% packet loss"; + } + + foreach($aPingReturn as $returnLine) + + { $pos = strpos($returnLine, $packetLoss); + if ($pos) { + $intConnected = 1; + break; + } + } + return $intConnected; +} + +/** + Connect to a host briefly + @param $host name or IP + @param $dbms database type (supported: mysql, mssql) + @return + - 1 on success + - 0 on failure + + This still works if the environment doesn't have + ping or ping has odd output. It also verifies the + database is running as well as the host is up. +*/ +static public function pingport($host,$dbms){ + $port = strstr($dbms,'mysql') ? 3306 : 1433; + if (strstr($host,":")) + list($host,$port) = explode(":",$host); + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0)); + socket_set_block($sock); + $test = socket_connect($sock,$host,$port); + socket_close($sock); + return ($test ? 1 : 0); +} + +/** + Guess whether PHP is running on windows + @return + 1 - windows + 0 - not windows +*/ +static public function win32() { + $winos = 0; + if (substr(PHP_OS, 0, 3) == "WIN") $winos = 1; + return $winos; +} + +/** + Get the scale wrapper object + @return An ScaleDriverWrapper object + + The driver is chosen via "scaleDriver" + in $CORE_LOCAL. If the object cannot be + found this returns zero +*/ +static public function scaleObject(){ + global $CORE_LOCAL; + $scaleDriver = $CORE_LOCAL->get("scaleDriver"); + $sd = 0; + if ($scaleDriver != ""){ + $sd = new $scaleDriver(); + } + return $sd; +} + +/** + Get the signature capture wrapper object + @return An ScaleDriverWrapper object + + The driver is chosen via "termDriver" + in $CORE_LOCAL. If the object cannot be + found this returns zero. + + Signature capture support is very alpha. +*/ +static public function sigTermObject(){ + global $CORE_LOCAL; + $termDriver = $CORE_LOCAL->get("termDriver"); + $st = 0; + if ($termDriver != ""){ + $st = new $termDriver(); + } + return $st; +} + +/** + Send good beep message to the scale +*/ +static public function goodBeep() { + global $CORE_LOCAL; + $sd = self::scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("goodBeep"); +} + +/** + Send re-poll message to the scale +*/ +static public function rePoll() { + global $CORE_LOCAL; + $sd = self::scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("rePoll"); +} + +/** + Send error beep message to the scale +*/ +static public function errorBeep() { + global $CORE_LOCAL; + $sd = self::scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("errorBeep"); +} + +/** + Send two pairs beep message to the scale +*/ +static public function twoPairs() { + global $CORE_LOCAL; + $sd = self::scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("twoPairs"); +} + +} // end class MiscLib + +?> diff --git a/pos/is4c-nf/lib/PrehLib.php b/pos/is4c-nf/lib/PrehLib.php new file mode 100644 index 000000000..48f24c47b --- /dev/null +++ b/pos/is4c-nf/lib/PrehLib.php @@ -0,0 +1,1403 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 13Feb2013 Andy Theuninck visitingMem support for memdiscountadd + 13Jan2013 Eric Lee New omtr_ttl() based on ttl() for Ontario Meal Tax Rebate. + 18Sep2012 Eric Lee In setMember support for not displaying subtotal. + +*/ + +/** + @class PrehLib + A horrible, horrible catch-all clutter of functions +*/ +class PrehLib extends LibraryClass { + +/** + Remove member number from current transaction +*/ +static public function clearMember(){ + global $CORE_LOCAL; + + CoreState::memberReset(); + $db = Database::tDataConnect(); + $db->query("UPDATE localtemptrans SET card_no=0,percentDiscount=NULL"); + $CORE_LOCAL->set("ttlflag",0); +} + +/** + Set member number for transaction + @param $member_number CardNo from custdata + @return An array. See Parser::default_json() + for format. + + This function will either assign the number + to the current transaction or return a redirect + request to get more input. If you want the + cashier to verify member name from a list, use + this function. If you want to force the number + to be set immediately, use setMember(). +*/ +static public function memberID($member_number) { + global $CORE_LOCAL; + + $query = "select CardNo,personNum,LastName,FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type,memType,staff, + SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown,id from custdata + where CardNo = '".$member_number."'"; + + $ret = array( + "main_frame"=>false, + "output"=>"", + "target"=>".baseHeight", + "redraw_footer"=>false + ); + + $db = Database::pDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + + if ($num_rows == 1 && + $member_number == $CORE_LOCAL->get("defaultNonMem")){ + $row = $db->fetch_array($result); + self::setMember($row["CardNo"], $row["personNum"],$row); + $ret['redraw_footer'] = True; + $ret['output'] = DisplayLib::lastpage(); + return $ret; + } + + // special hard coding for member 5607 WFC + // needs to go away + if ($member_number == "5607"){ + $ret['main_frame'] = MiscLib::base_url()."gui-modules/requestInfo.php?class=PrehLib"; + } + + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("memType",0); + $CORE_LOCAL->set("percentDiscount",0); + $CORE_LOCAL->set("memMsg",""); + + if (empty($ret['output']) && $ret['main_frame'] == false) + $ret['main_frame'] = MiscLib::base_url()."gui-modules/memlist.php?idSearch=".$member_number; + + if ($CORE_LOCAL->get("verifyName") != 1){ + $ret['udpmsg'] = 'goodBeep'; + } + + return $ret; +} + +public static $requestInfoHeader = 'member gift'; +public static $requestInfoMsg = 'Card for which member?'; +public static function requestInfoCallback($info){ + TransRecord::addcomment("CARD FOR #".$info); + + $query = "select CardNo,personNum,LastName,FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type,memType,staff, + SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown,id from custdata + where CardNo = 5607"; + $db = Database::pDataConnect(); + $result = $db->query($query); + $row = $db->fetch_row($result); + self::setMember($row["CardNo"], $row["personNum"],$row); + + return True; +} + +//------------------------------------------------- + +/** + Assign a member number to a transaction + @param $member CardNo from custdata + @param $personNumber personNum from custdata + @param $row a record from custdata + + See memberID() for more information. +*/ +static public function setMember($member, $personNumber, $row) { + global $CORE_LOCAL; + + $conn = Database::pDataConnect(); + + $CORE_LOCAL->set("memMsg",CoreState::blueLine($row)); + $chargeOk = self::chargeOk(); + if ($CORE_LOCAL->get("balance") != 0 && $member != $CORE_LOCAL->get("defaultNonMem")) + $CORE_LOCAL->set("memMsg",$CORE_LOCAL->get("memMsg")." AR"); + + $CORE_LOCAL->set("memberID",$member); + $CORE_LOCAL->set("memType",$row["memType"]); + $CORE_LOCAL->set("lname",$row["LastName"]); + $CORE_LOCAL->set("fname",$row["FirstName"]); + $CORE_LOCAL->set("Type",$row["Type"]); + $CORE_LOCAL->set("percentDiscount",$row["Discount"]); + + if ($CORE_LOCAL->get("Type") == "PC") { + $CORE_LOCAL->set("isMember",1); + } else { + $CORE_LOCAL->set("isMember",0); + } + + $CORE_LOCAL->set("isStaff",$row["staff"]); + $CORE_LOCAL->set("SSI",$row["SSI"]); + + if ($CORE_LOCAL->get("SSI") == 1) + $CORE_LOCAL->set("memMsg",$CORE_LOCAL->get("memMsg")." #"); + + $conn2 = Database::tDataConnect(); + $memquery = "update localtemptrans set card_no = '".$member."', + memType = ".sprintf("%d",$CORE_LOCAL->get("memType")).", + staff = ".sprintf("%d",$CORE_LOCAL->get("isStaff")); + if ($CORE_LOCAL->get("DBMS") == "mssql" && $CORE_LOCAL->get("store") == "wfc") + $memquery = str_replace("staff","isStaff",$memquery); + + if ($CORE_LOCAL->get("store") == "wedge") { + if ($CORE_LOCAL->get("isMember") == 0 && $CORE_LOCAL->get("percentDiscount") == 10) { + $memquery .= " , percentDiscount = 0 "; + } + elseif ($CORE_LOCAL->get("isStaff") != 1 && $CORE_LOCAL->get("percentDiscount") == 15) { + $memquery .= " , percentDiscount = 0 "; + } + } + + if ($CORE_LOCAL->get("discountEnforced") != 0) { + $memquery .= " , percentDiscount = ".$CORE_LOCAL->get("percentDiscount")." "; + } + else if ($CORE_LOCAL->get("discountEnforced") == 0 && $CORE_LOCAL->get("tenderTotal") == 0) { + $memquery .= " , percentDiscount = 0 "; + } + + $conn2->query($memquery); + + $opts = array('upc'=>'MEMENTRY','description'=>'CARDNO IN NUMFLAG','numflag'=>$member); + TransRecord::add_log_record($opts); + + if ($CORE_LOCAL->get("isStaff") == 0) { + $CORE_LOCAL->set("staffSpecial",0); + } + + // 16Sep12 Eric Lee Allow not append Subtotal at this point. + if ( $CORE_LOCAL->get("member_subtotal") === False ) { + $noop = ""; + } elseif ( $CORE_LOCAL->get("member_subtotal") === True ) { + self::ttl(); + } elseif ( $CORE_LOCAL->get("member_subtotal") == NULL ) { + self::ttl(); + } +} + +/** + Check if the member has overdue store charge balance + @param $cardno member number + @return True or False + + The logic for what constitutes past due has to be built + into the unpaid_ar_today view. Without that this function + doesn't really do much. +*/ +static public function check_unpaid_ar($cardno){ + global $CORE_LOCAL; + + // only attempt if server is available + // and not the default non-member + if ($cardno == $CORE_LOCAL->get("defaultNonMem")) return False; + if ($CORE_LOCAL->get("balance") == 0) return False; + + $db = Database::mDataConnect(); + + if (!$db->table_exists("unpaid_ar_today")) return False; + + $query = "SELECT old_balance,recent_payments FROM unpaid_ar_today + WHERE card_no = $cardno"; + $result = $db->query($query); + + // should always be a row, but just in case + if ($db->num_rows($result) == 0) return False; + $row = $db->fetch_row($result); + + $bal = $row["old_balance"]; + $paid = $row["recent_payments"]; + if ($CORE_LOCAL->get("memChargeTotal") > 0) + $paid += $CORE_LOCAL->get("memChargeTotal"); + + if ($bal <= 0) return False; + if ($paid >= $bal) return False; + + // only case where customer prompt should appear + if ($bal > 0 && $paid < $bal){ + $CORE_LOCAL->set("old_ar_balance",$bal - $paid); + return True; + } + + // just in case i forgot anything... + return False; +} + + +//------------------------------------------------- + +/** + Check if an item is voided or a refund + @param $num item trans_id in localtemptrans + @return array of status information with keys: + - voided (int) + - scaleprice (numeric) + - discountable (int) + - discounttype (int) + - caseprice (numeric) + - refund (boolean) + - status (string) +*/ +static public function checkstatus($num) { + global $CORE_LOCAL; + + $ret = array( + 'voided' => 0, + 'scaleprice' => 0, + 'discountable' => 0, + 'discounttype' => 0, + 'caseprice' => 0, + 'refund' => False, + 'status' => '' + ); + + if (!$num) { + $num = 0; + } + + $query = "select voided,unitPrice,discountable, + discounttype,trans_status + from localtemptrans where trans_id = ".$num; + + $db = Database::tDataConnect(); + $result = $db->query($query); + + + $num_rows = $db->num_rows($result); + + if ($num_rows > 0) { + $row = $db->fetch_array($result); + + $ret['voided'] = $row['voided']; + $ret['scaleprice'] = $row['unitPrice']; + $ret['discountable'] = $row['discountable']; + $ret['discounttype'] = $row['discounttype']; + $ret['caseprice'] = $row['unitPrice']; + + if ($row["trans_status"] == "V") { + $ret['status'] = 'V'; + } + +// added by apbw 6/04/05 to correct voiding of refunded items + + if ($row["trans_status"] == "R") { + $CORE_LOCAL->set("refund",1); + $CORE_LOCAL->set("autoReprint",1); + $ret['status'] = 'R'; + $ret['refund'] = True; + } + } + + return $ret; +} + +//--------------------------------------------------- + +/** + Add a tender to the transaction + @right tender code from tenders table + @strl tender amount in cents (100 = $1) + @return An array see Parser::default_json() + for format explanation. + + This function will automatically end a transaction + if the amount due becomes <= zero. + + @deprecated See PrehLib::modular_tender +*/ +static public function classic_tender($right, $strl) { + global $CORE_LOCAL; + $tender_upc = ""; + + $ret = array('main_frame'=>false, + 'redraw_footer'=>false, + 'target'=>'.baseHeight', + 'output'=>""); + + if ($CORE_LOCAL->get("LastID") == 0){ + $ret['output'] = DisplayLib::boxMsg(_("no transaction in progress")); + return $ret; + } + elseif ($strl > 999999){ + $ret['output'] = DisplayLib::xboxMsg("tender amount of ".MiscLib::truncate2($strl/100)."<br />exceeds allowable limit"); + return $ret; + } + elseif ($right == "WT"){ + $ret['output'] = DisplayLib::xboxMsg(_("WIC tender not applicable")); + return $ret; + } + elseif ($right == "CK" && $CORE_LOCAL->get("ttlflag") == 1 && ($CORE_LOCAL->get("isMember") != 0 || $CORE_LOCAL->get("isStaff") != 0) && (($strl/100 - $CORE_LOCAL->get("amtdue") - 0.005) > $CORE_LOCAL->get("dollarOver")) && ($CORE_LOCAL->get("cashOverLimit") == 1)){ + $ret['output'] = DisplayLib::boxMsg(_("member or staff check tender cannot + exceed total purchase by over $").$CORE_LOCAL->get("dollarOver")); + return $ret; + } + elseif ((($right == "CC" || $right == "TB" || $right == "GD") && $strl/100 > ($CORE_LOCAL->get("amtdue") + 0.005)) && $CORE_LOCAL->get("amtdue") >= 0){ + $ret['output'] = DisplayLib::xboxMsg(_("tender cannot exceed purchase amount")); + return $ret; + } + elseif($right == "EC" && $strl/100 > $CORE_LOCAL->get("amtdue")){ + $ret['output'] = DisplayLib::xboxMsg(_("no cash back with EBT cash tender")); + return $ret; + } + elseif($right == "CK" && $CORE_LOCAL->get("ttlflag") == 1 && $CORE_LOCAL->get("isMember") == 0 and $CORE_LOCAL->get("isStaff") == 0 && ($strl/100 - $CORE_LOCAL->get("amtdue") - 0.005) > 5){ + $ret['output'] = DisplayLib::xboxMsg(_("non-member check tender cannot exceed total purchase by over $5.00")); + return $ret; + } + + Database::getsubtotals(); + + if ($CORE_LOCAL->get("ttlflag") == 1 && ($right == "CX" || $right == "SC" || $right == "MI")) { + + $charge_ok = self::chargeOk(); + if ($right == "CX" && $charge_ok == 1 && strlen($CORE_LOCAL->get("memberID")) == 5 && substr($CORE_LOCAL->get("memberID"), 0, 1) == "5") $charge_ok = 1; + elseif (($right == "SC" || $right == "MI") && $charge_ok == 1) $charge_ok = 1; + else $charge_ok = 0; + } + + /* when processing as strings, weird things happen + * in excess of 1000, so use floating point */ + $strl .= ""; // force type to string + $mult = 1; + if ($strl[0] == "-"){ + $mult = -1; + $strl = substr($strl,1,strlen($strl)); + } + $dollars = (int)substr($strl,0,strlen($strl)-2); + $cents = ((int)substr($strl,-2))/100.0; + $strl = (double)($dollars+round($cents,2)); + $strl *= $mult; + + if ($CORE_LOCAL->get("ttlflag") == 0) { + $ret['output'] = DisplayLib::boxMsg(_("transaction must be totaled before tender can be accepted")); + return $ret; + } + elseif (($right == "FS" || $right == "EF" || $right == "EB") && $CORE_LOCAL->get("fntlflag") == 0) { + $ret['output'] = DisplayLib::boxMsg(_("eligible amount must be totaled before foodstamp tender can be accepted")); + return $ret; + } + elseif (($right == "EB" || $right == "EF") && $CORE_LOCAL->get("fntlflag") == 1 && $CORE_LOCAL->get("fsEligible") + 10 <= $strl) { + $ret['output'] = DisplayLib::xboxMsg(_("Foodstamp tender cannot exceed eligible amount by over $10.00")); + return $ret; + } + elseif ($right == "CX" && $charge_ok == 0) { + $ret['output'] = DisplayLib::xboxMsg("member ".$CORE_LOCAL->get("memberID")."<br />is not authorized<br />to make corporate charges"); + return $ret; + } + //alert customer that charge exceeds avail balance + elseif (($right == "MI" || $right == "SC") && $charge_ok == 0 && $CORE_LOCAL->get("availBal") < 0) { + $ret['output'] = DisplayLib::xboxMsg("member ".$CORE_LOCAL->get("memberID")."<br /> has $" . $CORE_LOCAL->get("availBal") . " available."); + return $ret; + } + elseif (($right == "MI" || $right == "SC") && $charge_ok == 1 && $CORE_LOCAL->get("availBal") < 0) { + $ret['output'] = DisplayLib::xboxMsg("member ".$CORE_LOCAL->get("memberID")."<br /> "._("is overlimit")); + return $ret; + } + elseif (($right == "MI" || $right == "SC") && $charge_ok == 0) { + $ret['output'] = DisplayLib::xboxMsg("member ".$CORE_LOCAL->get("memberID")."<br /> "._("is not authorized to make employee charges")); + return $ret; + } + elseif (($right == "MI" || $right == "SC") && $charge_ok == 1 && ($CORE_LOCAL->get("availBal") + $CORE_LOCAL->get("memChargeTotal") - $strl) < 0) { + $ret['output'] = DisplayLib::xboxMsg("member ".$CORE_LOCAL->get("memberID")."<br /> "._("has exceeded charge limit")); + return $ret; + } + elseif (($right == "MI" || $right == "SC") && $charge_ok == 1 && (ABS($CORE_LOCAL->get("memChargeTotal"))+ $strl) >= ($CORE_LOCAL->get("availBal") + 0.005) && $CORE_LOCAL->get("store")=="WFC") { + $memChargeRemain = $CORE_LOCAL->get("availBal"); + $memChargeCommitted = $memChargeRemain + $CORE_LOCAL->get("memChargeTotal"); + $ret['output'] = DisplayLib::xboxMsg("available balance for charge <br>is only $" .$memChargeCommitted. ".<br><b><font size = 5>$" . number_format($memChargeRemain,2) . "</font></b><br>may still be used on this purchase."); + return $ret; + } + elseif(($right == "MI" || $right == "CX" || $right == "MI") && MiscLib::truncate2($CORE_LOCAL->get("amtdue")) < MiscLib::truncate2($strl)) { + $ret['output'] = DisplayLib::xboxMsg(_("charge tender exceeds purchase amount")); + return $ret; + } + + $db = Database::pDataConnect(); + $query = "select TenderID,TenderCode,TenderName,TenderType, + ChangeMessage,MinAmount,MaxAmount,MaxRefund from + tenders where tendercode = '".$right."'"; + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) { + $ret['output'] = DisplayLib::inputUnknown(); + return $ret; + } + + $row = $db->fetch_array($result); + $tender_code = $right; + $tendered = -1 * $strl; + + $tender_desc = $row["TenderName"]; + $unit_price = 0; + + if ($tender_code == "FS") { + $CORE_LOCAL->set("boxMsg",_("WFC no longer excepts paper foods stamps. Please choose a different tender type")); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($tender_code == "CP" && $strl > $row["MaxAmount"] && $CORE_LOCAL->get("msgrepeat") == 0){ + $CORE_LOCAL->set("boxMsg","$".$strl." "._("is greater than coupon limit")."<p>" + ."<font size='-1'>"._("clear to cancel").", "._("enter to proceed")."</font>"); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($strl > $row["MaxAmount"] && $CORE_LOCAL->get("msgrepeat") == 0){ + $CORE_LOCAL->set("boxMsg","$".$strl." "._("is greater than tender limit")." " + ."for ".$row['TenderName']."<p>" + ."<font size='-1'>"._("clear to cancel").", "._("enter to proceed")."</font>"); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "GD" || $right == "TC"){ + $CORE_LOCAL->set("autoReprint",1); + } + + if ($strl - $CORE_LOCAL->get("amtdue") > 0) { + $CORE_LOCAL->set("change",$strl - $CORE_LOCAL->get("amtdue")); + } + else { + $CORE_LOCAL->set("change",0); + } + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-" + .trim($CORE_LOCAL->get("laneno"))."-" + .trim($CORE_LOCAL->get("transno")); + if($CORE_LOCAL->get("enableFranking") == 1) { + if ($right == "CK" && $CORE_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$strl; + return $ret; + } + elseif ($right == "TV" && $CORE_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert travelers check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$strl; + return $ret; + } + elseif ($right == "RC" && $CORE_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert rebate check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$strl; + return $ret; + } + elseif ($right == "TC" && $CORE_LOCAL->get("msgrepeat") == 0) { + $CORE_LOCAL->set("boxMsg","<B> insert gift certificate<B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$strl; + return $ret; + } + } + + if ($tender_code == "TV") + TransRecord::addItem($tender_upc, $tender_desc, "T", "CK", "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + elseif ($tender_code == "RC"){ + TransRecord::addItem($tender_upc, $tender_desc, "T", "CK", "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + else + TransRecord::addItem($tender_upc, $tender_desc, "T", $tender_code, "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + $CORE_LOCAL->set("msgrepeat",0); + + Database::getsubtotals(); + + if ($right == "FS" || $right == "EB" || $right == "XE" || $right == "EF") { + TransRecord::addfsTaxExempt(); + } + + if ($right == "FS") { + $fs = -1 * $CORE_LOCAL->get("fsEligible"); + $fs_ones = (($fs * 100) - (($fs * 100) % 100))/100; + $fs_change = $fs - $fs_ones; + + if ($fs_ones > 0) { + TransRecord::addfsones($fs_ones); + } + + if ($fs_change > 0) { + TransRecord::addchange($fs_change,$tender_code); + } + Database::getsubtotals(); + } + + if ($CORE_LOCAL->get("amtdue") <= 0.005) { + if ($CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_AUTH + && ($right == "CC" || $right == "GD")){ + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("fntlflag",0); + $chk = self::ttl(); + if ($chk === True) + $ret['output'] = DisplayLib::lastpage(); + else + $ret['main_frame'] = $chk; + return $ret; + } + + $CORE_LOCAL->set("change",-1 * $CORE_LOCAL->get("amtdue")); + $cash_return = $CORE_LOCAL->get("change"); + + if ($right != "FS") { + TransRecord::addchange($cash_return,'CA'); + } + + $CORE_LOCAL->set("End",1); + $ret['receipt'] = 'full'; + $ret['output'] = DisplayLib::printReceiptFooter(); + } + else { + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("fntlflag",0); + $chk = self::ttl(); + if ($chk === True) + $ret['output'] = DisplayLib::lastpage(); + else + $ret['main_frame'] = $chk; + } + $ret['redraw_footer'] = true; + return $ret; +} + +/** + Add a tender to the transaction + @right tender amount in cents (100 = $1) + @strl tender code from tenders table + @return An array see Parser::default_json() + for format explanation. + + This function will automatically end a transaction + if the amount due becomes <= zero. +*/ +static public function modular_tender($right, $strl){ + global $CORE_LOCAL; + $ret = array('main_frame'=>false, + 'redraw_footer'=>false, + 'target'=>'.baseHeight', + 'output'=>""); + + /* when processing as strings, weird things happen + * in excess of 1000, so use floating point */ + $strl .= ""; // force type to string + $mult = 1; + if ($strl[0] == "-"){ + $mult = -1; + $strl = substr($strl,1,strlen($strl)); + } + $dollars = (int)substr($strl,0,strlen($strl)-2); + $cents = ((int)substr($strl,-2))/100.0; + $strl = (double)($dollars+round($cents,2)); + $strl *= $mult; + + /** + First use base module to check for error + conditions common to all tenders + */ + $base_object = new TenderModule($right, $strl); + Database::getsubtotals(); + $ec = $base_object->ErrorCheck(); + if ($ec !== True){ + $ret['output'] = $ec; + return $ret; + } + $pr = $base_object->PreReqCheck(); + if ($pr !== True){ + $ret['main_frame'] = $pr; + return $ret; + } + + /** + Get a tender-specific module if + one has been configured + */ + $tender_object = 0; + $map = $CORE_LOCAL->get("TenderMap"); + if (is_array($map) && isset($map[$right])){ + $class = $map[$right]; + $tender_object = new $class($right, $strl); + } + else { + $tender_object = $base_object; + } + + if (!is_object($tender_object)){ + $ret['output'] = DisplayLib::boxMsg(_('tender is misconfigured')); + return $ret; + } + else if (get_class($tender_object) != 'TenderModule'){ + /** + Do tender-specific error checking and prereqs + */ + $ec = $tender_object->ErrorCheck(); + if ($ec !== True){ + $ret['output'] = $ec; + return $ret; + } + $pr = $tender_object->PreReqCheck(); + if ($pr !== True){ + $ret['main_frame'] = $pr; + return $ret; + } + } + + // add the tender record + $tender_object->Add(); + Database::getsubtotals(); + + // see if transaction has ended + if ($CORE_LOCAL->get("amtdue") <= 0.005) { + + $CORE_LOCAL->set("change",-1 * $CORE_LOCAL->get("amtdue")); + $cash_return = $CORE_LOCAL->get("change"); + TransRecord::addchange($cash_return,$tender_object->ChangeType()); + + $CORE_LOCAL->set("End",1); + $ret['receipt'] = 'full'; + $ret['output'] = DisplayLib::printReceiptFooter(); + } + else { + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("fntlflag",0); + $chk = self::ttl(); + if ($chk === True) + $ret['output'] = DisplayLib::lastpage(); + else + $ret['main_frame'] = $chk; + } + $ret['redraw_footer'] = true; + return $ret; +} + +/** + Call the configured tender function, either + PrehLib::modular_tender or PrehLib::classic_tender +*/ +static public function tender($right, $strl){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("ModularTenders")==1) + return self::modular_tender($right, $strl); + else + return self::classic_tender($right, $strl); +} + +//------------------------------------------------------- + +/** + Add an open ring to a department + @param $price amount in cents (100 = $1) + @param $dept POS department + @ret an array of return values + @returns An array. See Parser::default_json() + for format explanation. +*/ +static public function deptkey($price, $dept,$ret=array()) { + global $CORE_LOCAL; + + $intvoided = 0; + + if ($CORE_LOCAL->get("quantity") == 0 && $CORE_LOCAL->get("multiple") == 0) { + $CORE_LOCAL->set("quantity",1); + } + + $ringAsCoupon = False; + if (substr($price,0,2) == 'MC'){ + $ringAsCoupon = True; + $price = substr($price,2); + } + + if (!is_numeric($dept) || !is_numeric($price) || strlen($price) < 1 || strlen($dept) < 2) { + $ret['output'] = DisplayLib::inputUnknown(); + $CORE_LOCAL->set("quantity",1); + $ret['udpmsg'] = 'errorBeep'; + return $ret; + } + + $strprice = $price; + $strdept = $dept; + $price = $price/100; + $dept = $dept/10; + + if ($CORE_LOCAL->get("casediscount") > 0 && $CORE_LOCAL->get("casediscount") <= 100) { + $case_discount = (100 - $CORE_LOCAL->get("casediscount"))/100; + $price = $case_discount * $price; + } + $total = $price * $CORE_LOCAL->get("quantity"); + $intdept = $dept; + + $query = "select dept_no,dept_name,dept_tax,dept_fs,dept_limit, + dept_minimum,dept_discount from departments where dept_no = ".$intdept; + $db = Database::pDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + if ($num_rows == 0) { + $ret['output'] = DisplayLib::boxMsg(_("department unknown")); + $ret['udpmsg'] = 'errorBeep'; + $CORE_LOCAL->set("quantity",1); + } + elseif ($ringAsCoupon){ + $row = $db->fetch_array($result); + $query2 = "select department, sum(total) as total from localtemptrans where department = " + .$dept." group by department"; + + $db2 = Database::tDataConnect(); + $result2 = $db2->query($query2); + + $num_rows2 = $db2->num_rows($result2); + if ($num_rows2 == 0) { + $ret['output'] = DisplayLib::boxMsg(_("no item found in")."<br />".$row["dept_name"]); + $ret['udpmsg'] = 'errorBeep'; + } + else { + $row2 = $db2->fetch_array($result2); + if ($price > $row2["total"]) { + $ret['output'] = DisplayLib::boxMsg(_("coupon amount greater than department total")); + $ret['udpmsg'] = 'errorBeep'; + } + else { + TransRecord::addItem("", $row["dept_name"]." Coupon", "I", "CP", "C", $dept, 1, -1 * $price, -1 * $price, -1 * $price, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, $intvoided); + $CORE_LOCAL->set("ttlflag",0); + $ret['output'] = DisplayLib::lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + } + } + } + else { + $row = $db->fetch_array($result); + if (!$row["dept_limit"]) $deptmax = 0; + else $deptmax = $row["dept_limit"]; + + if (!$row["dept_minimum"]) $deptmin = 0; + else $deptmin = $row["dept_minimum"]; + $tax = $row["dept_tax"]; + + if ($row["dept_fs"] != 0) $foodstamp = 1; + else $foodstamp = 0; + + $deptDiscount = $row["dept_discount"]; + + if ($CORE_LOCAL->get("toggleDiscountable") == 1) { + $CORE_LOCAL->set("toggleDiscountable",0); + if ($deptDiscount == 0) { + $deptDiscount = 1; + } else { + $deptDiscount = 0; + } + } + + if ($CORE_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = ($foodstamp + 1) % 2; + $CORE_LOCAL->set("togglefoodstamp",0); + } + + // Hard coding starts + if ($dept == 606) { + $price = -1 * $price; + $total = -1 * $total; + } + // Hard coding ends + + if ($CORE_LOCAL->get("ddNotify") != 0 && $CORE_LOCAL->get("itemPD") == 10) { + $CORE_LOCAL->set("itemPD",0); + $deptDiscount = 7; + $intvoided = 22; + } + + if ($price > $deptmax && $CORE_LOCAL->get("msgrepeat") == 0) { + + $CORE_LOCAL->set("boxMsg","$".$price." "._("is greater than department limit")."<p>" + ."<font size='-1'>"._("clear to cancel").", "._("enter to proceed")."</font>"); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + } + elseif ($price < $deptmin && $CORE_LOCAL->get("msgrepeat") == 0) { + $CORE_LOCAL->set("boxMsg","$".$price." "._("is lower than department minimum")."<p>" + ."<font size='-1'>"._("clear to cancel").", "._("enter to proceed")."</font>"); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + } + else { + if ($CORE_LOCAL->get("casediscount") > 0) { + TransRecord::addcdnotify(); + $CORE_LOCAL->set("casediscount",0); + } + + if ($CORE_LOCAL->get("toggletax") == 1) { + if ($tax > 0) $tax = 0; + else $tax = 1; + $CORE_LOCAL->set("toggletax",0); + } + + if ($dept == "77"){ + $db2 = Database::tDataConnect(); + $taxratesQ = "SELECT rate FROM taxrates WHERE id=$tax"; + $taxratesR = $db2->query($taxratesQ); + $rate = array_pop($db2->fetch_row($taxratesR)); + + $price /= (1+$rate); + $price = MiscLib::truncate2($price); + $total = $price * $CORE_LOCAL->get("quantity"); + } + + TransRecord::addItem($price."DP".$dept, $row["dept_name"], "D", " ", " ", $dept, $CORE_LOCAL->get("quantity"), $price, $total, $price, 0 ,$tax, $foodstamp, 0, 0, $deptDiscount, 0, $CORE_LOCAL->get("quantity"), 0, 0, 0, 0, 0, $intvoided); + $CORE_LOCAL->set("ttlflag",0); + //$CORE_LOCAL->set("ttlrequested",0); + $ret['output'] = DisplayLib::lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + $CORE_LOCAL->set("msgrepeat",0); + } + } + + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("itemPD",0); + + return $ret; +} + +//------------------------------------------------- + +/** + Total the transaction + @return + True - total successfully + String - URL + + If ttl() returns a string, go to that URL for + more information on the error or to resolve the + problem. + + The most common error, by far, is no + member number in which case the return value + is the member-entry page. +*/ +static public function ttl() { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("memberID") == "0") { + return MiscLib::base_url()."gui-modules/memlist.php"; + } + else { + $mconn = Database::tDataConnect(); + $query = ""; + $query2 = ""; + if ($CORE_LOCAL->get("isMember") == 1 || $CORE_LOCAL->get("memberID") == $CORE_LOCAL->get("visitingMem")) { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","memdiscountadd"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountadd"; + } else { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","memdiscountremove"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountremove"; + } + + if ($CORE_LOCAL->get("isStaff") != 0) { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","staffdiscountadd"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountadd"; + } else { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","staffdiscountremove"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountremove"; + } + + $result = $mconn->query($query); + $result2 = $mconn->query($query2); + + $CORE_LOCAL->set("ttlflag",1); + Database::setglobalvalue("TTLFlag", 1); + $temp = self::chargeOk(); + if ($CORE_LOCAL->get("balance") < $CORE_LOCAL->get("memChargeTotal") && $CORE_LOCAL->get("memChargeTotal") > 0){ + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("boxMsg",sprintf("<b>A/R Imbalance</b><br /> + Total AR payments $%.2f exceeds AR balance %.2f<br /> + <font size=-1>[enter] to continue, [clear] to cancel</font>", + $CORE_LOCAL->get("memChargeTotal"), + $CORE_LOCAL->get("balance"))); + $CORE_LOCAL->set("strEntered","TL"); + return MiscLib::base_url()."gui-modules/boxMsg2.php?quiet=1"; + } + } + + if ($CORE_LOCAL->get("percentDiscount") > 0) { + if ($CORE_LOCAL->get("member_subtotal") === False){ + TransRecord::addItem("", "Subtotal", "", "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("subtotal")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + TransRecord::discountnotify($CORE_LOCAL->get("percentDiscount")); + TransRecord::addItem("", $CORE_LOCAL->get("percentDiscount")."% Discount", "C", "", "D", 0, 0, MiscLib::truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + $amtDue = str_replace(",", "", $CORE_LOCAL->get("amtdue")); + + // check in case something else like an + // approval code is already being sent + // to the cc terminal + //if ($CORE_LOCAL->get("ccTermOut")=="idle"){ + $CORE_LOCAL->set("ccTermOut","total:". + str_replace(".","",sprintf("%.2f",$amtDue))); + /* + $st = sigTermObject(); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); + */ + //} + $memline = ""; + if($CORE_LOCAL->get("memberID") != $CORE_LOCAL->get("defaultNonMem")) { + $memline = " #" . $CORE_LOCAL->get("memberID"); + } + // temporary fix Andy 13Feb13 + // my cashiers don't like the behavior; not configurable yet + if ($CORE_LOCAL->get("store") == "wfc") $memline=""; + $peek = self::peekItem(); + if (True || substr($peek,0,9) != "Subtotal "){ + TransRecord::addItem("", "Subtotal ".MiscLib::truncate2($CORE_LOCAL->get("subtotal")).", Tax ".MiscLib::truncate2($CORE_LOCAL->get("taxTotal")).$memline, "C", "", "D", 0, 0, $amtDue, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3); + } + + if ($CORE_LOCAL->get("fntlflag") == 1) { + TransRecord::addItem("", "Foodstamps Eligible", "", "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + } + return True; +} + +//--------------------------------------- + +//------------------------------------------------- + +/** + Total the transaction, which the cashier thinks may be eligible for the + Ontario Meal Tax Rebate. + @return + True - total successfully + String - URL + + If ttl() returns a string, go to that URL for + more information on the error or to resolve the + problem. + + The most common error, by far, is no + member number in which case the return value + is the member-entry page. + + The Ontario Meal Tax Rebate refunds the provincial part of the + Harmonized Sales Tax if the total of the transaction is not more + than a certain amount. + + If the transaction qualifies, + change the tax status for each item at the higher rate to the lower rate. + Display a message that a change was made. + Otherwise display a message about that. + Total the transaction as usual. + +*/ +static public function omtr_ttl() { + global $CORE_LOCAL; + + // Must have gotten member number before totaling. + if ($CORE_LOCAL->get("memberID") == "0") { + return MiscLib::base_url()."gui-modules/memlist.php"; + } + else { + $mconn = Database::tDataConnect(); + $query = ""; + $query2 = ""; + // Apply or remove any member discounts as appropriate. + if ($CORE_LOCAL->get("isMember") == 1 || $CORE_LOCAL->get("memberID") == $CORE_LOCAL->get("visitingMem")) { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","memdiscountadd"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountadd"; + } else { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","memdiscountremove"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountremove"; + } + + // Apply or remove any staff discounts as appropriate. + if ($CORE_LOCAL->get("isStaff") != 0) { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","staffdiscountadd"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountadd"; + } else { + $cols = Database::localMatchingColumns($mconn,"localtemptrans","staffdiscountremove"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountremove"; + } + + $result = $mconn->query($query); + $result2 = $mconn->query($query2); + + $CORE_LOCAL->set("ttlflag",1); + Database::setglobalvalue("TTLFlag", 1); + + // Refresh totals after staff and member discounts. + Database::getsubtotals(); + + // Is the before-tax total within range? + if ($CORE_LOCAL->get("runningTotal") <= 4.00 ) { + $totalBefore = $CORE_LOCAL->get("amtdue"); + $ret = Database::changeLttTaxCode("HST","GST"); + if ( $ret !== True ) { + TransRecord::addcomment("$ret"); + } else { + Database::getsubtotals(); + $saved = ($totalBefore - $CORE_LOCAL->get("amtdue")); + $comment = sprintf("OMTR OK. You saved: $%.2f", $saved); + TransRecord::addcomment("$comment"); + } + } + else { + TransRecord::addcomment("Does NOT qualify for OMTR"); + } + + /* If member can do Store Charge, warn on certain conditions. + * Important preliminary is to refresh totals. + */ + $temp = self::chargeOk(); + if ($CORE_LOCAL->get("balance") < $CORE_LOCAL->get("memChargeTotal") && $CORE_LOCAL->get("memChargeTotal") > 0){ + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("boxMsg",sprintf("<b>A/R Imbalance</b><br /> + Total AR payments $%.2f exceeds AR balance %.2f<br /> + <font size=-1>[enter] to continue, [clear] to cancel</font>", + $CORE_LOCAL->get("memChargeTotal"), + $CORE_LOCAL->get("balance"))); + $CORE_LOCAL->set("strEntered","TL"); + return MiscLib::base_url()."gui-modules/boxMsg2.php?quiet=1"; + } + } + + // Display discount. + if ($CORE_LOCAL->get("percentDiscount") > 0) { + TransRecord::addItem("", $CORE_LOCAL->get("percentDiscount")."% Discount", "C", "", "D", 0, 0, MiscLib::truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + + $amtDue = str_replace(",", "", $CORE_LOCAL->get("amtdue")); + + // check in case something else like an + // approval code is already being sent + // to the cc terminal + //if ($CORE_LOCAL->get("ccTermOut")=="idle"){ + + $CORE_LOCAL->set("ccTermOut","total:". + str_replace(".","",sprintf("%.2f",$amtDue))); + + /* + $st = sigTermObject(); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); + */ + //} + + // Compose the member ID string for the description. + if($CORE_LOCAL->get("memberID") != $CORE_LOCAL->get("defaultNonMem")) { + $memline = " #" . $CORE_LOCAL->get("memberID"); + } + else { + $memline = ""; + } + + // Put out the Subtotal line. + $peek = self::peekItem(); + if (True || substr($peek,0,9) != "Subtotal "){ + TransRecord::addItem("", "Subtotal ".MiscLib::truncate2($CORE_LOCAL->get("subtotal")).", Tax ".MiscLib::truncate2($CORE_LOCAL->get("taxTotal")).$memline, "C", "", "D", 0, 0, $amtDue, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3); + } + + if ($CORE_LOCAL->get("fntlflag") == 1) { + TransRecord::addItem("", "Foodstamps Eligible", "", "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + } + + return True; + +// omtr_ttl +} + +//--------------------------------------- + +/** + See what the last item in the transaction is currently + @return localtemptrans.description for the last item +*/ +static public function peekItem(){ + $db = Database::tDataConnect(); + $q = "SELECT description FROM localtemptrans ORDER BY trans_id DESC"; + $r = $db->query($q); + $w = $db->fetch_row($r); + return (isset($w['description'])?$w['description']:''); +} + +//--------------------------------------- + +/** + Add tax and transaction discount records. + This is called at the end of a transaction. + There's probably no other place where calling + this function is appropriate. +*/ +static public function finalttl() { + global $CORE_LOCAL; + if ($CORE_LOCAL->get("percentDiscount") > 0) { + TransRecord::addItem("", "Discount", "C", "", "D", 0, 0, MiscLib::truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + + TransRecord::addItem("Subtotal", "Subtotal", "C", "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("taxTotal") - $CORE_LOCAL->get("fsTaxExempt")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11); + + + if ($CORE_LOCAL->get("fsTaxExempt") != 0) { + TransRecord::addItem("Tax", "FS Taxable", "C", "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("fsTaxExempt")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + TransRecord::addItem("Total", "Total", "C", "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("amtdue")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11); + +} + +//--------------------------------------- + +//------------------------------------------- + +/** + Add foodstamp elgibile total record +*/ +static public function fsEligible() { + global $CORE_LOCAL; + Database::getsubtotals(); + if ($CORE_LOCAL->get("fsEligible") < 0 && False) { + $CORE_LOCAL->set("boxMsg","Foodstamp eligible amount inapplicable<P>Please void out earlier tender and apply foodstamp first"); + return MiscLib::base_url()."gui-modules/boxMsg2.php"; + } + else { + $CORE_LOCAL->set("fntlflag",1); + Database::setglobalvalue("FntlFlag", 1); + if ($CORE_LOCAL->get("ttlflag") != 1) return self::ttl(); + else TransRecord::addItem("", "Foodstamps Eligible", "" , "", "D", 0, 0, MiscLib::truncate2($CORE_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + + return True; + } +} + +//------------------------------------------ + +/** + Add a percent discount notification + @param $strl discount percentage + @param $json keyed array + @return An array see Parser::default_json() + @deprecated + Use discountnotify() instead. This just adds + hard-coded percentages and PLUs that likely + aren't applicable anywhere but the Wedge. +*/ +static public function percentDiscount($strl,$json=array()) { + if ($strl == 10.01) $strl = 10; + + if (!is_numeric($strl) || $strl > 100 || $strl < 0) $json['output'] = DisplayLib::boxMsg("discount invalid"); + else { + $query = "select sum(total) as total from localtemptrans where upc = '0000000008005' group by upc"; + + $db = Database::tDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + if ($num_rows == 0) $couponTotal = 0; + else { + $row = $db->fetch_array($result); + $couponTotal = MiscLib::nullwrap($row["total"]); + } + if ($couponTotal == 0 || $strl == 0) { + + if ($strl != 0) TransRecord::discountnotify($strl); + $db->query("update localtemptrans set percentDiscount = ".$strl); + $chk = self::ttl(); + if ($chk !== True) + $json['main_frame'] = $chk; + $json['output'] = DisplayLib::lastpage(); + } + else $json['output'] = DisplayLib::xboxMsg("10% discount already applied"); + } + return $json; +} + +//------------------------------------------ + +/** + Check whether the current member has store + charge balance available. + @return + 1 - Yes + 0 - No + + Sets current balance in $CORE_LOCAL as "balance". + Sets available balance in $CORE_LOCAL as "availBal". +*/ +static public function chargeOk() { + global $CORE_LOCAL; + + Database::getsubtotals(); + + $conn = Database::pDataConnect(); + $query = "select m.availBal,m.balance,c.ChargeOk from memchargebalance as m + left join custdata AS c ON m.CardNo=c.CardNo AND c.personNum=1 + where m.CardNo = '".$CORE_LOCAL->get("memberID")."'"; + + $result = $conn->query($query); + $num_rows = $conn->num_rows($result); + $row = $conn->fetch_array($result); + + $availBal = $row["availBal"] + $CORE_LOCAL->get("memChargeTotal"); + + $CORE_LOCAL->set("balance",$row["balance"]); + $CORE_LOCAL->set("availBal",number_format($availBal,2,'.','')); + + $chargeOk = 1; + if ($num_rows == 0 || !$row["ChargeOk"]) { + $chargeOk = 0; + } + elseif ( $row["ChargeOk"] == 0 ) { + $chargeOk = 0; + } + + return $chargeOk; + +} + +//---------------------------------------------------------- + +/** + Add a comment + @deprecated + Use addcomment(). +*/ +static public function comment($comment){ + TransRecord::addcomment($comment); + DisplayLib::lastpage(); +} +//---------------------------------------------------------- + +/** + End of Shift functionality isn't in use + @deprecated +*/ +static public function endofShift($json) { + global $CORE_LOCAL; + + $CORE_LOCAL->set("memberID","99999"); + $CORE_LOCAL->set("memMsg","End of Shift"); + TransRecord::addEndofShift(); + Database::getsubtotals(); + $chk = self::ttl(); + if ($chk !== True){ + $json['main_frame'] = $chk; + return $json; + } + $CORE_LOCAL->set("runningtotal",$CORE_LOCAL->get("amtdue")); + return self::tender("CA", $CORE_LOCAL->get("runningtotal") * 100); +} + +//--------------------------- WORKING MEMBER DISCOUNT -------------------------- +/** + Add a working member discount + @deprecated + Do not use this. The memType structure in custdata + is a far better solution. +*/ +static public function wmdiscount() { + global $CORE_LOCAL; + + $sconn = Database::mDataConnect(); + $conn2 = Database::tDataConnect(); + + $volQ = "SELECT * FROM is4c_op.volunteerDiscounts WHERE CardNo = ".$CORE_LOCAL->get("memberID"); + + $volR = $sconn->query($volQ); + $row = $sconn->fetch_array($volR); + $total = $row["total"]; + + if ($row["staff"] == 3) { + if ($CORE_LOCAL->get("discountableTotal") > $total) { + $a = $total * .15; // apply 15% disocunt + $b = ($CORE_LOCAL->get("discountableTotal") - $total) * .02 ; // apply 2% discount + $c = $a + $b; + $aggdisc = number_format(($c / $CORE_LOCAL->get("discountableTotal")) * 100,2); // aggregate discount + + $CORE_LOCAL->set("transDiscount",$c); + $CORE_LOCAL->set("percentDiscount",$aggdisc); + } + elseif ($CORE_LOCAL->get("discountableTotal") <= $total) { + $CORE_LOCAL->set("percentDiscount",15); + $CORE_LOCAL->set("transDiscount",$CORE_LOCAL->get("discountableTotal") * .15); + } + } + elseif ($row["staff"] == 6) { + if ($CORE_LOCAL->get("discountableTotal") > $total) { + $a = $total * .05; // apply 15% disocunt + $aggdisc = number_format(($a / $CORE_LOCAL->get("discountableTotal")) * 100,2); // aggregate discount + + $CORE_LOCAL->set("transDiscount",$a); + $CORE_LOCAL->set("percentDiscount",$aggdisc); + } + elseif ($CORE_LOCAL->get("discountableTotal") <= $total) { + $CORE_LOCAL->set("percentDiscount",5); + $CORE_LOCAL->set("transDiscount",$CORE_LOCAL->get("discountableTotal") * .05); + } + } + +// TransRecord::discountnotify($CORE_LOCAL->get("percentDiscount")); + $conn2->query("update localtemptrans set percentDiscount = ".$CORE_LOCAL->get("percentDiscount")); + + if ($CORE_LOCAL->get("discountableTotal") < $total) { + $a = number_format($CORE_LOCAL->get("discountableTotal") / 20,2); + $arr = explode(".",$a); + if ($arr[1] >= 75 && $arr[1] != 00) $dec = 75; + elseif ($arr[1] >= 50 && $arr[1] < 75) $dec = 50; + elseif ($arr[1] >= 25 && $arr[1] < 50) $dec = 25; + elseif ($arr[1] >= 00 && $arr[1] < 25) $dec = 00; + + $CORE_LOCAL->set("volunteerDiscount",$arr[0]. "." .$dec); + } + else { + $CORE_LOCAL->set("volunteerDiscount",$total / 20); + } + +// echo "voldisc: " .$CORE_LOCAL->get("volunteerDiscount"); +} +//------------------------- END WORKING MEMBER DISCOUNT ------------------------- +} +?> diff --git a/pos/is4c-nf/lib/PrintHandlers/ESCPOSPrintHandler.php b/pos/is4c-nf/lib/PrintHandlers/ESCPOSPrintHandler.php new file mode 100755 index 000000000..5fc62faed --- /dev/null +++ b/pos/is4c-nf/lib/PrintHandlers/ESCPOSPrintHandler.php @@ -0,0 +1,774 @@ +<?php +/* +ESCPOSPrintHandler +version 1 (2009-09-25) +author Alex Frase + +Notes + Epson TM-H6000II prints 504 pixels per line; + 42 columns with standard 12x24 font, 56 columns with alternate 9x17 font +*/ + +class ESCPOSPrintHandler { + + function Tab() { + // "\t" + return "\x09"; + } + + function LineFeed($lines=1) { + // one line: "\n" + if ($lines <= 1) + return "\x0A"; + // multiple lines: ESC "d" num + return "\x1B\x64".chr( max(0, min(255, (int)$lines)) ); + } + + function PageFeed($reset=true) { + // "(ESC) FF" + return ($reset?"":"\x1B")."\x0C"; + } + + function CarriageReturn() { + // "\r" + return "\x0D"; + } + + function ClearPage() { + // CAN + return "\x18"; + } + + // TODO: realtime status transmission; DLE(\x10) EOT(\x04) n + + // TODO: realtime request to printer; DLE(\x10) ENQ(\x05) n + + // TODO: realtime pulse; DLE(\x10) DC4(\x14) 1 m t + + function CharacterSpacing($dots=0) { + // ESC " " space + return "\x1B\x20".chr( max(0, min(255, $dots)) ); + } + + /** + Center a string of text + @param $text the text + @param $big boolean using larger font + @return a printable string + + Replaces old center(), centerString(), + and centerBig() functions. + */ + function centerString($text,$big=false){ + $width = ($big) ? 58 : 59; + + $blank = str_repeat(" ", $width); + $text = trim($text); + $lead = (int) (($width - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; + } + + /** + Add font style command + @param $altFont use alternate font + @param $bold use bold font + @param $tall use tall characters + @param $wide use wide characters + @param $underline use undlerined font + @return A printer command string + + Replaces several old printLib.php functions + TextStyle(true) is equivalent to normalFont() + TextStyle(true,true) is equivalent to boldFont() + TextStyle(true,false,true) is equivalent to + biggerFont(). + */ + function TextStyle($altFont=false, $bold=false, $tall=false, $wide=false, $underline=false) { + // ESC "!" bitfield + return ("\x1B\x21" + .chr( + ($underline ? 128 : 0) + + ($wide ? 32 : 0) + + ($tall ? 16 : 0) + + ($bold ? 8 : 0) + + ($altFont ? 1 : 0) + ) + ); + } + + function GotoX($dots=0) { + // ESC "$" xLO xHI + return ("\x1B\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } // GotoX() + + // TODO: enable downloadable character set; ESC(\x1B) "%"(\x25) flag + + // TODO: define downloadable characters; ESC(\x1B) "&"(\x26) 3(\x03) char0 char1 data + + /* + ESC/POS requires graphical bitmap data in columns, but BMP is rasterized in rows, + so this function transposes the latter to the former. The source BMP data must + be 1 bpp (black/white image only), and $width is in pixels == bits (not bytes). + The return will be an array of binary strings; if the source data fits in one + inline stripe (8 pixels tall with $tallDots, 24 otherwise) the array will have + only one element. + */ + function TransposeBitmapData($data, $width, $tallDots=false) { + $oldRowBytes = (int)(($width + 7) / 8); + $newColBytes = $tallDots ? 1 : 3; + $oldStripeSize = (int)($oldRowBytes * ($tallDots ? 8 : 24)); + $stripes = array(); + + // str_split function doesn't exist in PHP4 + $str_split = array(); + $val = ""; + for($i=0;$i<strlen($data);$i++){ + if ($i % $oldStripeSize==0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $data[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + // end manual split + + foreach ($str_split as $oldData) { + $oldData = str_pad($oldData, $oldStripeSize, "\x00", STR_PAD_RIGHT); + $newData = str_repeat("\x00", $width * $newColBytes); + for ($c = 0; $c < $width; $c++) { + $oldMask = 1 << (7 - ($c % 8)); + $newByte = ($tallDots ? $c : ($c + $c + $c)); + // top or only byte + $b = 0; + for ($r = 0; $r < 8; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 0] = chr($b); + if (!$tallDots) { + // middle byte + $b = 0; + for ($r = 8; $r < 16; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 1] = chr($b); + // bottom byte + $b = 0; + for ($r = 16; $r < 24; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 2] = chr($b); + } + } + $stripes[] = $newData; + } + return $stripes; + } // TransposeBitmapData() + + /* + Bitmaps are always drawn 24 dots tall (the height of a normal printed line). + Tall dots are each 3x tall, so they take 1 byte per column (8 bits * 3 dots each = 24). + Short dots require 3 bytes per column (8 bits * 3 bytes = 24). + Data must therefore have ($width * ($tallDots ? 3 : 1)) bytes. + Each data byte specifies dots top-to-bottom, from most- to least-significant-bit: + \xC0 = \b11000000 = pixels in the top two rows + \x81 = \b10000001 = pixels on the top and bottom rows + Multiple bytes are drawn top-to-bottom (if !$tallDots), then left-to-right. + */ + function InlineBitmap($data, $width, $tallDots=false, $wideDots=false) { + // ESC "*" bitfield widthLO widthHI data + $width = (int)max(0, min(1023, $width)); + $bytes = (int)($width * ($tallDots ? 1 : 3)); + return ("\x1B\x2A" + .chr( ($tallDots ? 0 : 32) + ($wideDots ? 0 : 1) ) + .chr( (int)($width % 256) ) + .chr( (int)($width / 256) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } // InlineBitmap() + + // TODO: InlineBitmapFromFile() + + function Underline($dots=1) { + // ESC "-" size + return "\x1B\x2D".chr( max(0, min(2, $dots)) ); + } + + function ResetLineSpacing() { + // ESC "2" + return "\x1B\x32"; + } + + function LineSpacing($space=64) { + // in some small increment; with 12x24 font, space=64 seems to be approximately single-spaced, space=128 double + // ESC "3" space + return "\x1B\x33".chr( max(0, min(255, $space)) ); + } + + // TODO: return home; ESC(\x1B) "<"(\x3C) + + // TODO: select peripheral device; ESC(\x1B) "="(\x3D) n + + // TODO: delete downloadable characters; ESC(\x1B) "?"(\x3F) char + + function Reset() { + // ESC "@" + return "\x1B\x40"; + } + + function SetTabs($tabs=null) { + // ESC "D" tabs NUL + if (!is_array($tabs) || !count($tabs)) + return "\x1B\x44\x00"; + $tabs = array_unique(array_map('chr', $tabs), SORT_NUMERIC); + sort($tabs); + return ("\x1B\x44" + .implode('', $tabs) + ."\x00" + ); + } + + function Bold($on=true) { + // ESC "E" bit + return "\x1B\x45".chr( $on ? 1 : 0 ); + } + + function DoublePrint($on=true) { + // is this like a shadow effect? + // ESC "G" bit + return "\x1B\x47".chr( $on ? 1 : 0 ); + } + + function PaperFeed($space) { + // in some small increment; with 12x24 font, space=64 seems to be approximately one printed line, space=128 two + // ESC "J" space + return "\x1B\x4A".chr( max(0, min(255, $space)) ); + } + + function PaperFeedBack($space) { + // in some small increment + // ESC "K" num + return "\x1B\x4B".chr( max(0, min(24, $space)) ); + } + + function PageMode() { + // ESC "L" + return "\x1B\x4C"; + } + + function Font($font=0) { + // ESC "M" font + // (FS "G" font) + return "\x1B\x4D".chr( max(0, min(2, $font)) ); + } + + /* + international character sets: + 0: America + 1: France + 2: Germany + 3: UK + 4: Denmark I + 5: Sweden + 6: Italy + 7: Spain I + 8: Japan + 9: Norway + 10: Denmark II + 11: Spain II + 12: Latin America + 13: Korea + */ + function CharacterSet($set=0) { + // ESC "R" set + return "\x1B\x52".chr( max(0, min(13, $set)) ); + } + + function LineMode() { + // ESC "S" + return "\x1B\x53"; + } + + function PageOrient($orient=0) { + // ESC "T" dir + return "\x1B\x54".chr( max(0, min(3, (int)$orient)) ); + } + + // TODO: unidirectional printing; ESC(\x1B) "U"(\x55) bit + + function Rotate($on=true) { + // ESC "V" bit + return "\x1B\x56".chr( $on ? 1 : 0 ); + } + + function PageRegion($x=0, $y=0, $dx=65535, $dy=65535) { + // ESC "W" xLO xHI yLO yHI dxLO dxHI dyLO dyHI + return ("\x1B\x57" + .chr( max(0, (int)($x % 256)) ) + .chr( max(0, min(255, (int)($x / 245))) ) + .chr( max(0, (int)($y % 256)) ) + .chr( max(0, min(255, (int)($y / 245))) ) + .chr( max(0, (int)($dx % 256)) ) + .chr( max(0, min(255, (int)($dx / 245))) ) + .chr( max(0, (int)($dy % 256)) ) + .chr( max(0, min(255, (int)($dy / 245))) ) + ); + } + + function MoveX($dots) { + // ESC "\" dxLO dxHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1B\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function AlignLeft() { + // ESC "a" align + return "\x1B\x61\x00"; + } + + function AlignCenter() { + // ESC "a" align + return "\x1B\x61\x01"; + } + + function AlignRight() { + // ESC "a" align + return "\x1B\x61\x02"; + } + + function PaperRoll($receipt=true, $journal=false, $endorse=false, $validation=false) { + // ESC "c" "0" bitfield + return ("\x1B\x63\x30" + .chr( + ($validation ? 8 : 0) // ?? + + ($endorse ? 4 : 0) + + ($journal ? 2 : 0) // ?? + + ($receipt ? 1 : 0) + ) + ); + } // PaperRoll() + + // TODO: set paper out warning sensor; ESC(\x1B) "c"(\x63) "3"(\x33) bitfield + + // TODO: set paper out stop sensor; ESC(\x1B) "c"(\x63) "4"(\x34) bitfield + + function PanelButtons($on=true) { + // ESC "c" "5" flag + return "\x1B\x63\x35".chr( $on ? 0 : 1 ); + } + + function LineFeedBack() { + // ESC "e" 1 + return "\x1B\x65\x01"; + } + + // TODO: define macro; ESC(\x1B) "g"(\x67) NUL(\x00) num lenLO lenHI data + + // TODO: run macro; ESC(\x1B) "g"(\x67) num + + function DrawerKick($pin=2, $on=100, $off=100) { + // ESC "p" pin on off + return ("\x1B\x70" + .chr( ($pin < 3.5) ? 0 : 1 ) + .chr( max(0, min(255, (int)($on / 2))) ) // times are *2ms + .chr( max(0, min(255, (int)($off / 2))) ) + ); + } + + /* + code tables: + 0: PC437 (USA: Standard Europe) + 1: Katakana + 2: PC850 (Multilingual) + 3: PC860 (Portugese) + 4: PC863 (Canadian-French) + 5: PC865 (Nordic) + 16: WPC1252 + 17: PC866 (Cryllic #2) + 18: PC852 (Latin2) + 19: PC858 + 255: blank + */ + function CodeTable($table=0) { + // ESC "t" table + return "\x1B\x74".chr( max(0, min(255, $table)) ); + } + + // TODO: send peripheral device status; ESC(\x1B) "u"(\x75) ? + + // TODO: send paper sensor status; ESC(\x1B) "v"(\x76) ? + + function UpsideDown($on=true) { + // ESC "{" flag + return "\x1B\x7B".chr( $on ? 1 : 0 ); + } + + // TODO: paper forced feed; FS(\x1C) "A"(\x41) ? + + // TODO: send bitmap file FS(\x1C) "B"(\x42) bitmap + + // TODO: pdf 417 aspect definition; FS(\x1C) "C"(\x43) ? + + // TODO: pdf 417 ecc level definition FS(\x1C) "D"(\x44) ? + + // TODO: horz/vert bar in page mode FS(\x1C) "E"(\x45) dir lenLO lenHI width + + // TODO: set 2d barcode size; FS(\x1C) "H"(\x48) zoom + + // TODO: paper forced return; FS(\x1C) "R"(\x52) ? + + // TODO: store data; FS(\x1C) "g"(\x67) "1"(\x31) \x00 aLO aML aMH aHI bLO bHI data; max memory address=1024 + + // TODO: load data; FS(\x1C) "g"(\x67) "2"(\x32) \x00 aLO aML aMH aHI bLO bHI; max memory address=1024 + + // TODO: print 2d barcode FS(\x1C) "k"(\x6B) type lenLO lenHI data + + // TODO: print stored bitmap; FS(\x1C) "p"(\x70) num bitfield + + // TODO: store bitmaps; FS(\x1C) "q"(\x71) num [xLO xHI yLO yHI]{num} + + function CharacterZoom($horiz=1, $vert=1) { + // GS "!" zoom + return "\x1D\x21".chr( + 16 * (int)(max(1, min(8, $horiz)) - 1) + + (int)(max(1, min(8, $vert)) - 1) + ); + } + + function GotoY($dots=0) { + // GS "$" yLO yHI + return ("\x1D\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + // TODO: define downloadable image; GS(\x1D) "*"(\x2A) x y data + + function Test($type=3, $paper=0) { + // GS "(" "A" + return ("\x1D\x28\x41\x02\x00" + .chr( max(0, min(2, (int)$paper)) ) + .chr( max(1, min(3, (int)$type)) ) + ); + } + + // TODO: edit NV memory; GS(\x1D) "("(\x28) "C"(\x43) ... + + // TODO: toggle realtime command; GS(\x1D) "("(\x28) "D"(\x44) ... + + // TODO: user startup commands; GS(\x1D) "("(\x28) "E"(\x45) ... + + function Density($factor=1.0) { + // GS "(" "K" \x02 \x00 \x31 factor + // factor = 0.7 (\xFA) - 0.9 (\xFF) ; 1.0 (\x00) - 1.3 (\x06) + return ("\x1D\x28\x4B\x02\x00\x31" + .chr( (int)((256 + max(-6, min(6, (($factor - 1.0) * 20)))) % 256) ) + ); + } + + function ColorBlack() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x31"; + } + + function ColorRed() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x32"; + } + + // TODO: print downloadable image; GS(\x1D) "/"(\x2F) bitfield + + // TODO: toggle macro recording; GS(\x1D) ":"(\x3A) + + function Invert($on=true) { + // GS "B" flag + return "\x1D\x42".chr( $on ? 1 : 0 ); + } + + // TODO: set counter print mode; GS(\x1D) "C"(\x43) "0"(\x30) digits align + + // TODO: set counter mode; GS(\x1D) "C"(\x43) "1"(\x31) aLO aHI bLO bHI step repeat + + // TODO: set counter mode value; GS(\x1D) "C"(\x43) "2"(\x32) vLO vHI + + // TODO: set counter mode; GS(\x1D) "C"(\x43) ";"(\x3B) sa ";"(\x3B) sb ";"(\x3B) sn ";"(\x3B) sr ";"(\x3B) sc ";"(\x3B) + + function SpeedHigh() { + // GS "E" speed + return "\x1D\x45\x00"; + } + + function SpeedMedium() { + // GS "E" speed + return "\x1D\x45\x10"; + } + + function SpeedLow() { + // GS "E" speed + return "\x1D\x45\x20"; + } + + function BarcodeHRI($below=true, $above=false) { + // GS "H" bitfield + return ("\x1D\x48" + .chr( ($below ? 2 : 0) + ($above ? 1 : 0) ) + ); + } + + // TODO: send printer ID; GS(\x1D) "I"(\x49) type + + function LeftMargin($dots=0) { + // GS "L" marginLO marginHI + return ("\x1D\x4C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function DotPitch($primary=0, $secondary=0) { + // sets dot pitch to 1/Xth inch (25.4/Xth mm), or 0 for default + // GS "P" pitch pitch + return "\x1D\x50".chr($primary).chr($secondary); + } + + function DiscardLine() { + // GS "T" printbit + return "\x1D\x54\x00"; + } + + function PreCutPaper($full=false) { + // the cutter is above the print position, so cutting without feeding will put the cut above the last few lines printed + // GS "V" bit + // ESC "i" (partial) + // ESC "m" (partial) + return "\x1D\x56".chr( $full ? 0 : 1 ); + } + + function CutPaper($full=false, $feed=0) { + // this version feeds the paper far enough to put the cutter just below the last line printed, plus the feed distance (in pixels?) + // GS "V" bit feed + return ("\x1D\x56" + .chr( $full ? 65 : 66 ) + .chr( $feed ) + ); + } + + function PrintableWidth($dots=65535) { + // GS "W" widthLO widthHI + return ("\x1D\x57" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function MoveY($dots) { + // GS "\" dyLO dyHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1D\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + // TODO: run macro; GS(\x1D) "^"(\x5E) repeat delay mode + + // TODO: enable automatic status back; GS(\x1D) "a"(\x61) bitfield + + function Smooth($on=true) { + // GS "b" flag + return "\x1D\x62".chr( $on ? 1 : 0 ); + } + + // TODO: print counter; GS(\x1D) "c"(\x63) + + function BarcodeHRIFont($font=0) { + // GS "f" font + return "\x1D\x66".chr( max(0, min(2, $font)) ); + } + + function BarcodeHeight($dots=162) { + // GS "h" height + return "\x1D\x68".chr( max(1, min(255, $dots)) ); + } + + function BarcodeUPC($data, $upcE=false) { + $bytes = max(11, min(12, strlen($data))); + return ("\x1D\x6B" + .chr( $upcE ? 66 : 65 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeEAN($data, $ean8=false) { + $bytes = $ean8 ? max(7, min(8, strlen($data))) : max(12, min(13, strlen($data))); + return ("\x1D\x6B" + .chr( $ean8 ? 68 : 67 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE39($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(69) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-Z $%+./-]|', ' ', substr($data, 0, $bytes)), $bytes, ' ', STR_PAD_LEFT) + ); + } + + function BarcodeITF($data) { + $bytes = max(2, min(254, (int)(strlen($data) / 2) * 2)); + return ("\x1D\x6B" + .chr(70) + .chr($bytes) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODEABAR($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(71) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-D$+./:-]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE93($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(72) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + function BarcodeCODE128($data) { + $bytes = max(2, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(73) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + // TODO: send status; GS(\x1D) "r"(\x72) bitfield + + /* + Raster bitmaps may be up to 524280 pixels wide ((255+255*256)*8), and up to 2303 pixels tall (255+8*256). + Tall dots are 2 pixels tall, and wide dots are 2 pixels wide. + This function takes $width and $height as pixels, but the printer takes width as bytes (= 8 pixels). + Data must have (($width * $height) / 8) bytes. + The bits in each data byte specify dots from left-to-right, and bytes are left-to-right, top-to-bottom. + \xC0 = \b11000000 = pixels in the left two columns + \x81 = \b10000001 = pixels in the left and right columns + */ + function RasterBitmap($data, $width, $height, $tallDots=false, $wideDots=false) { + // GS "v" 0 bits widthLO widthHI heightLO heightHI data + $width = (int)(($width + 7) / 8); + $bytes = (int)($width * $height); + return ("\x1D\x76\x00" + .chr( ($tallDots ? 2 : 0) + ($wideDots ? 1 : 0) ) + .chr( (int)($width % 256) ) + .chr( max(0, min(255, (int)($width / 256))) ) + .chr( (int)($height % 256) ) + .chr( max(0, min(8, (int)($height / 256))) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } + + function BarcodeWidth($scale=3) { + // ($scale * 0.141mm) is the width per single code line, not the total code width + // GS "w" scale + return "\x1D\x77".chr( max(1, min(6, $scale)) ); + } + + function writeLine($text){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("print") != 0) { + + /* check fails on LTP1: in PHP4 + suppress open errors and check result + instead + */ + //if (is_writable($CORE_LOCAL->get("printerPort"))){} + $fp = fopen($CORE_LOCAL->get("printerPort"), "w"); + if ($fp){ + fwrite($fp, $text); + fclose($fp); + } + } + } + + function RenderBitmapFromFile($fn, $align='C'){ + return $this->RenderBitmap($fn, $align); + } + + /** + Turn bitmap into receipt string + @param $arg string filename OR Bitmap obj + @return receipt-formatted string + */ + function RenderBitmap($arg, $align='C'){ + $slip = ""; + + if (!class_exists('Bitmap')) return ""; + + $bmp = null; + if (is_object($arg) && is_a($arg, 'Bitmap')){ + $bmp = $arg; + } + else if (file_exists($arg)){ + $bmp = new Bitmap(); + $bmp->Load($arg); + } + + // argument was invalid + if ($bmp === null) + return ""; + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $stripes = $this->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $this->InlineBitmap($stripes[$i], $bmpWidth); + + if ($align == 'C') + $slip .= $this->AlignCenter(); + if (count($stripes) > 1) + $slip .= $this->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $this->ResetLineSpacing(); + if ($align == 'C') $slip .= "\n"; + $slip .= $this->AlignLeft(); + + return $slip; + } + +} // ESCPOSPrintHandler + diff --git a/pos/is4c-nf/lib/PrintHandlers/EmailPrintHandler.php b/pos/is4c-nf/lib/PrintHandlers/EmailPrintHandler.php new file mode 100755 index 000000000..e28392aab --- /dev/null +++ b/pos/is4c-nf/lib/PrintHandlers/EmailPrintHandler.php @@ -0,0 +1,334 @@ +<?php +/** + @class EmailPrintHandler + + Distribute receipt via email + + Most methods are not implemented + because they have no purpose in + a non-physical receipt +*/ + +class EmailPrintHandler extends PrintHandler { + + /** + Get printer tab + @return string printer command + */ + function Tab() { + return " "; + } + + /** + Get newlines + @param $lines number of lines + @return string printer command + */ + function LineFeed($lines=1) { + $ret = "\n"; + for($i=1;$i<$lines;$i++) + $ret .= "\n"; + return $ret; + } + + function PageFeed($reset=true) { + return ""; + } + + /** + Get carriage return + @return string printer command + */ + function CarriageReturn() { + return ""; + } + + function ClearPage() { + return ""; + } + + function CharacterSpacing($dots=0) { + // ESC " " space + return ""; + } + + function centerString($text,$big=false){ + $width = 60; + + $blank = str_repeat(" ", $width); + $text = trim($text); + $lead = (int) (($width - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; + } + + function TextStyle($altFont=false, $bold=false, $tall=false, $wide=false, $underline=false) { + return ""; + } + + function GotoX($dots=0) { + return ""; + } // GotoX() + + function InlineBitmap($data, $width, $tallDots=false, $wideDots=false) { + return ""; + } // InlineBitmap() + + function Underline($dots=1) { + return ""; + } + + function ResetLineSpacing() { + return ""; + } + + function LineSpacing($space=64) { + return ""; + } + + function Reset() { + return ""; + } + + function SetTabs($tabs=null) { + return ""; + } + + /** + Enable or disable bold font + @param $on boolean enable + @return string printer command + */ + function Bold($on=true) { + return ""; + } + + function DoublePrint($on=true) { + return ""; + } + + function PaperFeed($space) { + return ""; + } + + function PaperFeedBack($space) { + return ""; + } + + function PageMode() { + return ""; + } + + function Font($font=0) { + return ""; + } + + function CharacterSet($set=0) { + return ""; + } + + function LineMode() { + return ""; + } + + function PageOrient($orient=0) { + return ""; + } + + // TODO: unidirectional printing; ESC(\x1B) "U"(\x55) bit + + function Rotate($on=true) { + return ""; + } + + function PageRegion($x=0, $y=0, $dx=65535, $dy=65535) { + return ""; + } + + function MoveX($dots) { + return ""; + } + + function AlignLeft() { + return ""; + } + + function AlignCenter() { + return ""; + } + + function AlignRight() { + return ""; + } + + function PaperRoll($receipt=true, $journal=false, $endorse=false, $validation=false) { + return ""; + } // PaperRoll() + + function PanelButtons($on=true) { + return ""; + } + + function LineFeedBack() { + return ""; + } + + function DrawerKick($pin=2, $on=100, $off=100) { + // ESC "p" pin on off + return ("\x1B\x70" + .chr( ($pin < 3.5) ? 0 : 1 ) + .chr( max(0, min(255, (int)($on / 2))) ) // times are *2ms + .chr( max(0, min(255, (int)($off / 2))) ) + ); + } + + function CodeTable($table=0) { + return ""; + } + + function UpsideDown($on=true) { + return ""; + } + + function CharacterZoom($horiz=1, $vert=1) { + return ""; + } + + function GotoY($dots=0) { + return ""; + } + + function Test($type=3, $paper=0) { + return ""; + } + + function Density($factor=1.0) { + return ""; + } + + function ColorBlack() { + return ""; + } + + function ColorRed() { + return ""; + } + + function Invert($on=true) { + return ""; + } + + function SpeedHigh() { + return ""; + } + + function SpeedMedium() { + return ""; + } + + function SpeedLow() { + return ""; + } + + function BarcodeHRI($below=true, $above=false) { + return ""; + } + + function LeftMargin($dots=0) { + return ""; + } + + function DotPitch($primary=0, $secondary=0) { + return ""; + } + + function DiscardLine() { + return ""; + } + + function PreCutPaper($full=false) { + return ""; + } + + function CutPaper($full=false, $feed=0) { + return ""; + } + + function PrintableWidth($dots=65535) { + return ""; + } + + function MoveY($dots) { + return ""; + } + + function Smooth($on=true) { + return ""; + } + + function BarcodeHRIFont($font=0) { + return ""; + } + + function BarcodeHeight($dots=162) { + return ""; + } + + function BarcodeUPC($data, $upcE=false) { + return ""; + } + + function BarcodeEAN($data, $ean8=false) { + return ""; + } + + function BarcodeCODE39($data) { + return ""; + } + + function BarcodeITF($data) { + return ""; + } + + function BarcodeCODEABAR($data) { + return ""; + } + + function BarcodeCODE93($data) { + return ""; + } + + function BarcodeCODE128($data) { + return ""; + } + + function BarcodeWidth($scale=3) { + return ""; + } + + /** + Write output to device + @param the output string + */ + function writeLine($text, $to=False){ + global $CORE_LOCAL; + $text = substr($text,0,strlen($text)-2); + if ($CORE_LOCAL->get("print") != 0 && $to !== False) { + + $subject = "Receipt ".date("Y-m-d"); + $subject .= " ".$CORE_LOCAL->get("CashierNo"); + $subject .= "-".$CORE_LOCAL->get("laneno"); + $subject .= "-".$CORE_LOCAL->get("transno"); + + $headers = "From: ".$CORE_LOCAL->get("emailReceiptFrom"); + + mail($to, $subject, $text, $headers); + } + } + + function RenderBitmapFromFile($fn){ + return ""; + } +} + +?> diff --git a/pos/is4c-nf/lib/PrintHandlers/PrintHandler.php b/pos/is4c-nf/lib/PrintHandlers/PrintHandler.php new file mode 100755 index 000000000..5a8c54904 --- /dev/null +++ b/pos/is4c-nf/lib/PrintHandlers/PrintHandler.php @@ -0,0 +1,710 @@ +<?php +/** + @class PrintHandler + Generic print module + + This is working backwards from the + existing ESCPOS class. + Work-in-progress. +*/ + +class PrintHandler { + + /** + Get printer tab + @return string printer command + */ + function Tab() { + return "\t"; + } + + /** + Get newlines + @param $lines number of lines + @return string printer command + */ + function LineFeed($lines=1) { + $ret = "\n"; + for($i=1;$i<$lines;$i++) + $ret .= "\n"; + return $ret; + } + + function PageFeed($reset=true) { + // "(ESC) FF" + return ($reset?"":"\x1B")."\x0C"; + } + + /** + Get carriage return + @return string printer command + */ + function CarriageReturn() { + return "\r"; + } + + function ClearPage() { + // CAN + return "\x18"; + } + + function CharacterSpacing($dots=0) { + // ESC " " space + return "\x1B\x20".chr( max(0, min(255, $dots)) ); + } + + /** + Center a string of text + @param $text the text + @param $big boolean using larger font + @return a printable string + + Replaces old center(), centerString(), + and centerBig() functions. + */ + function centerString($text,$big=false){ + $width = ($big) ? 30 : 59; + + $blank = str_repeat(" ", $width); + $text = trim($text); + $lead = (int) (($width - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; + } + + /** + Add font style command + @param $altFont use alternate font + @param $bold use bold font + @param $tall use tall characters + @param $wide use wide characters + @param $underline use undlerined font + @return A printer command string + + Replaces several old printLib.php functions + TextStyle(true) is equivalent to normalFont() + TextStyle(true,true) is equivalent to boldFont() + TextStyle(true,false,true) is equivalent to + biggerFont(). + */ + function TextStyle($altFont=false, $bold=false, $tall=false, $wide=false, $underline=false) { + // ESC "!" bitfield + return ("\x1B\x21" + .chr( + ($underline ? 128 : 0) + + ($wide ? 32 : 0) + + ($tall ? 16 : 0) + + ($bold ? 8 : 0) + + ($altFont ? 1 : 0) + ) + ); + } + + function GotoX($dots=0) { + // ESC "$" xLO xHI + return ("\x1B\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } // GotoX() + + /* + ESC/POS requires graphical bitmap data in columns, but BMP is rasterized in rows, + so this function transposes the latter to the former. The source BMP data must + be 1 bpp (black/white image only), and $width is in pixels == bits (not bytes). + The return will be an array of binary strings; if the source data fits in one + inline stripe (8 pixels tall with $tallDots, 24 otherwise) the array will have + only one element. + */ + function TransposeBitmapData($data, $width, $tallDots=false) { + $oldRowBytes = (int)(($width + 7) / 8); + $newColBytes = $tallDots ? 1 : 3; + $oldStripeSize = (int)($oldRowBytes * ($tallDots ? 8 : 24)); + $stripes = array(); + + // str_split function doesn't exist in PHP4 + $str_split = array(); + $val = ""; + for($i=0;$i<strlen($data);$i++){ + if ($i % $oldStripeSize==0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $data[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + // end manual split + + foreach ($str_split as $oldData) { + $oldData = str_pad($oldData, $oldStripeSize, "\x00", STR_PAD_RIGHT); + $newData = str_repeat("\x00", $width * $newColBytes); + for ($c = 0; $c < $width; $c++) { + $oldMask = 1 << (7 - ($c % 8)); + $newByte = ($tallDots ? $c : ($c + $c + $c)); + // top or only byte + $b = 0; + for ($r = 0; $r < 8; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 0] = chr($b); + if (!$tallDots) { + // middle byte + $b = 0; + for ($r = 8; $r < 16; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 1] = chr($b); + // bottom byte + $b = 0; + for ($r = 16; $r < 24; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 2] = chr($b); + } + } + $stripes[] = $newData; + } + return $stripes; + } // TransposeBitmapData() + + /* + Bitmaps are always drawn 24 dots tall (the height of a normal printed line). + Tall dots are each 3x tall, so they take 1 byte per column (8 bits * 3 dots each = 24). + Short dots require 3 bytes per column (8 bits * 3 bytes = 24). + Data must therefore have ($width * ($tallDots ? 3 : 1)) bytes. + Each data byte specifies dots top-to-bottom, from most- to least-significant-bit: + \xC0 = \b11000000 = pixels in the top two rows + \x81 = \b10000001 = pixels on the top and bottom rows + Multiple bytes are drawn top-to-bottom (if !$tallDots), then left-to-right. + */ + function InlineBitmap($data, $width, $tallDots=false, $wideDots=false) { + // ESC "*" bitfield widthLO widthHI data + $width = (int)max(0, min(1023, $width)); + $bytes = (int)($width * ($tallDots ? 1 : 3)); + return ("\x1B\x2A" + .chr( ($tallDots ? 0 : 32) + ($wideDots ? 0 : 1) ) + .chr( (int)($width % 256) ) + .chr( (int)($width / 256) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } // InlineBitmap() + + function Underline($dots=1) { + // ESC "-" size + return "\x1B\x2D".chr( max(0, min(2, $dots)) ); + } + + function ResetLineSpacing() { + // ESC "2" + return "\x1B\x32"; + } + + function LineSpacing($space=64) { + // in some small increment; with 12x24 font, space=64 seems to be approximately single-spaced, space=128 double + // ESC "3" space + return "\x1B\x33".chr( max(0, min(255, $space)) ); + } + + function Reset() { + // ESC "@" + return "\x1B\x40"; + } + + function SetTabs($tabs=null) { + // ESC "D" tabs NUL + if (!is_array($tabs) || !count($tabs)) + return "\x1B\x44\x00"; + $tabs = array_unique(array_map('chr', $tabs), SORT_NUMERIC); + sort($tabs); + return ("\x1B\x44" + .implode('', $tabs) + ."\x00" + ); + } + + /** + Enable or disable bold font + @param $on boolean enable + @return string printer command + */ + function Bold($on=true) { + return ""; + } + + function DoublePrint($on=true) { + // is this like a shadow effect? + // ESC "G" bit + return "\x1B\x47".chr( $on ? 1 : 0 ); + } + + function PaperFeed($space) { + // in some small increment; with 12x24 font, space=64 seems to be approximately one printed line, space=128 two + // ESC "J" space + return "\x1B\x4A".chr( max(0, min(255, $space)) ); + } + + function PaperFeedBack($space) { + // in some small increment + // ESC "K" num + return "\x1B\x4B".chr( max(0, min(24, $space)) ); + } + + function PageMode() { + // ESC "L" + return "\x1B\x4C"; + } + + function Font($font=0) { + // ESC "M" font + // (FS "G" font) + return "\x1B\x4D".chr( max(0, min(2, $font)) ); + } + + /* + international character sets: + 0: America + 1: France + 2: Germany + 3: UK + 4: Denmark I + 5: Sweden + 6: Italy + 7: Spain I + 8: Japan + 9: Norway + 10: Denmark II + 11: Spain II + 12: Latin America + 13: Korea + */ + function CharacterSet($set=0) { + // ESC "R" set + return "\x1B\x52".chr( max(0, min(13, $set)) ); + } + + function LineMode() { + // ESC "S" + return "\x1B\x53"; + } + + function PageOrient($orient=0) { + // ESC "T" dir + return "\x1B\x54".chr( max(0, min(3, (int)$orient)) ); + } + + // TODO: unidirectional printing; ESC(\x1B) "U"(\x55) bit + + function Rotate($on=true) { + // ESC "V" bit + return "\x1B\x56".chr( $on ? 1 : 0 ); + } + + function PageRegion($x=0, $y=0, $dx=65535, $dy=65535) { + // ESC "W" xLO xHI yLO yHI dxLO dxHI dyLO dyHI + return ("\x1B\x57" + .chr( max(0, (int)($x % 256)) ) + .chr( max(0, min(255, (int)($x / 245))) ) + .chr( max(0, (int)($y % 256)) ) + .chr( max(0, min(255, (int)($y / 245))) ) + .chr( max(0, (int)($dx % 256)) ) + .chr( max(0, min(255, (int)($dx / 245))) ) + .chr( max(0, (int)($dy % 256)) ) + .chr( max(0, min(255, (int)($dy / 245))) ) + ); + } + + function MoveX($dots) { + // ESC "\" dxLO dxHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1B\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function AlignLeft() { + // ESC "a" align + return "\x1B\x61\x00"; + } + + function AlignCenter() { + // ESC "a" align + return "\x1B\x61\x01"; + } + + function AlignRight() { + // ESC "a" align + return "\x1B\x61\x02"; + } + + function PaperRoll($receipt=true, $journal=false, $endorse=false, $validation=false) { + // ESC "c" "0" bitfield + return ("\x1B\x63\x30" + .chr( + ($validation ? 8 : 0) // ?? + + ($endorse ? 4 : 0) + + ($journal ? 2 : 0) // ?? + + ($receipt ? 1 : 0) + ) + ); + } // PaperRoll() + + function PanelButtons($on=true) { + // ESC "c" "5" flag + return "\x1B\x63\x35".chr( $on ? 0 : 1 ); + } + + function LineFeedBack() { + // ESC "e" 1 + return "\x1B\x65\x01"; + } + + function DrawerKick($pin=2, $on=100, $off=100) { + // ESC "p" pin on off + return ("\x1B\x70" + .chr( ($pin < 3.5) ? 0 : 1 ) + .chr( max(0, min(255, (int)($on / 2))) ) // times are *2ms + .chr( max(0, min(255, (int)($off / 2))) ) + ); + } + + /* + code tables: + 0: PC437 (USA: Standard Europe) + 1: Katakana + 2: PC850 (Multilingual) + 3: PC860 (Portugese) + 4: PC863 (Canadian-French) + 5: PC865 (Nordic) + 16: WPC1252 + 17: PC866 (Cryllic #2) + 18: PC852 (Latin2) + 19: PC858 + 255: blank + */ + function CodeTable($table=0) { + // ESC "t" table + return "\x1B\x74".chr( max(0, min(255, $table)) ); + } + + function UpsideDown($on=true) { + // ESC "{" flag + return "\x1B\x7B".chr( $on ? 1 : 0 ); + } + + function CharacterZoom($horiz=1, $vert=1) { + // GS "!" zoom + return "\x1D\x21".chr( + 16 * (int)(max(1, min(8, $horiz)) - 1) + + (int)(max(1, min(8, $vert)) - 1) + ); + } + + function GotoY($dots=0) { + // GS "$" yLO yHI + return ("\x1D\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function Test($type=3, $paper=0) { + // GS "(" "A" + return ("\x1D\x28\x41\x02\x00" + .chr( max(0, min(2, (int)$paper)) ) + .chr( max(1, min(3, (int)$type)) ) + ); + } + + function Density($factor=1.0) { + // GS "(" "K" \x02 \x00 \x31 factor + // factor = 0.7 (\xFA) - 0.9 (\xFF) ; 1.0 (\x00) - 1.3 (\x06) + return ("\x1D\x28\x4B\x02\x00\x31" + .chr( (int)((256 + max(-6, min(6, (($factor - 1.0) * 20)))) % 256) ) + ); + } + + function ColorBlack() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x31"; + } + + function ColorRed() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x32"; + } + + function Invert($on=true) { + // GS "B" flag + return "\x1D\x42".chr( $on ? 1 : 0 ); + } + + function SpeedHigh() { + // GS "E" speed + return "\x1D\x45\x00"; + } + + function SpeedMedium() { + // GS "E" speed + return "\x1D\x45\x10"; + } + + function SpeedLow() { + // GS "E" speed + return "\x1D\x45\x20"; + } + + function BarcodeHRI($below=true, $above=false) { + // GS "H" bitfield + return ("\x1D\x48" + .chr( ($below ? 2 : 0) + ($above ? 1 : 0) ) + ); + } + + function LeftMargin($dots=0) { + // GS "L" marginLO marginHI + return ("\x1D\x4C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function DotPitch($primary=0, $secondary=0) { + // sets dot pitch to 1/Xth inch (25.4/Xth mm), or 0 for default + // GS "P" pitch pitch + return "\x1D\x50".chr($primary).chr($secondary); + } + + function DiscardLine() { + // GS "T" printbit + return "\x1D\x54\x00"; + } + + function PreCutPaper($full=false) { + // the cutter is above the print position, so cutting without feeding will put the cut above the last few lines printed + // GS "V" bit + // ESC "i" (partial) + // ESC "m" (partial) + return "\x1D\x56".chr( $full ? 0 : 1 ); + } + + function CutPaper($full=false, $feed=0) { + // this version feeds the paper far enough to put the cutter just below the last line printed, plus the feed distance (in pixels?) + // GS "V" bit feed + return ("\x1D\x56" + .chr( $full ? 65 : 66 ) + .chr( $feed ) + ); + } + + function PrintableWidth($dots=65535) { + // GS "W" widthLO widthHI + return ("\x1D\x57" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function MoveY($dots) { + // GS "\" dyLO dyHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1D\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function Smooth($on=true) { + // GS "b" flag + return "\x1D\x62".chr( $on ? 1 : 0 ); + } + + function BarcodeHRIFont($font=0) { + // GS "f" font + return "\x1D\x66".chr( max(0, min(2, $font)) ); + } + + function BarcodeHeight($dots=162) { + // GS "h" height + return "\x1D\x68".chr( max(1, min(255, $dots)) ); + } + + function BarcodeUPC($data, $upcE=false) { + $bytes = max(11, min(12, strlen($data))); + return ("\x1D\x6B" + .chr( $upcE ? 66 : 65 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeEAN($data, $ean8=false) { + $bytes = $ean8 ? max(7, min(8, strlen($data))) : max(12, min(13, strlen($data))); + return ("\x1D\x6B" + .chr( $ean8 ? 68 : 67 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE39($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(69) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-Z $%+./-]|', ' ', substr($data, 0, $bytes)), $bytes, ' ', STR_PAD_LEFT) + ); + } + + function BarcodeITF($data) { + $bytes = max(2, min(254, (int)(strlen($data) / 2) * 2)); + return ("\x1D\x6B" + .chr(70) + .chr($bytes) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODEABAR($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(71) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-D$+./:-]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE93($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(72) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + function BarcodeCODE128($data) { + $bytes = max(2, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(73) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + /* + Raster bitmaps may be up to 524280 pixels wide ((255+255*256)*8), and up to 2303 pixels tall (255+8*256). + Tall dots are 2 pixels tall, and wide dots are 2 pixels wide. + This function takes $width and $height as pixels, but the printer takes width as bytes (= 8 pixels). + Data must have (($width * $height) / 8) bytes. + The bits in each data byte specify dots from left-to-right, and bytes are left-to-right, top-to-bottom. + \xC0 = \b11000000 = pixels in the left two columns + \x81 = \b10000001 = pixels in the left and right columns + */ + function RasterBitmap($data, $width, $height, $tallDots=false, $wideDots=false) { + // GS "v" 0 bits widthLO widthHI heightLO heightHI data + $width = (int)(($width + 7) / 8); + $bytes = (int)($width * $height); + return ("\x1D\x76\x00" + .chr( ($tallDots ? 2 : 0) + ($wideDots ? 1 : 0) ) + .chr( (int)($width % 256) ) + .chr( max(0, min(255, (int)($width / 256))) ) + .chr( (int)($height % 256) ) + .chr( max(0, min(8, (int)($height / 256))) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } + + function BarcodeWidth($scale=3) { + // ($scale * 0.141mm) is the width per single code line, not the total code width + // GS "w" scale + return "\x1D\x77".chr( max(1, min(6, $scale)) ); + } + + /** + Write output to device + @param the output string + */ + function writeLine($text){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("print") != 0) { + + /* check fails on LTP1: in PHP4 + suppress open errors and check result + instead + */ + //if (is_writable($CORE_LOCAL->get("printerPort"))){} + $fp = fopen($CORE_LOCAL->get("printerPort"), "w"); + if ($fp){ + fwrite($fp, $text); + fclose($fp); + } + } + } + + /** + Draw bitmap from file + @param $fn a bitmap file + @return printer command string + */ + function RenderBitmapFromFile($fn, $align='C'){ + return $this->RenderBitmap($fn, $align); + } + + /** + Turn bitmap into receipt string + @param $arg string filename OR Bitmap obj + @return receipt-formatted string + */ + function RenderBitmap($arg, $align='C'){ + $slip = ""; + + if (!class_exists('Bitmap')) return ""; + + $bmp = null; + if (is_object($arg) && is_a($arg, 'Bitmap')){ + $bmp = $arg; + } + else if (file_exists($arg)){ + $bmp = new Bitmap(); + $bmp->Load($arg); + } + + // argument was invalid + if ($bmp === null) + return ""; + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $stripes = $this->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $this->InlineBitmap($stripes[$i], $bmpWidth); + + $slip .= $this->AlignCenter(); + if (count($stripes) > 1) + $slip .= $this->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $this->ResetLineSpacing()."\n"; + $slip .= $this->AlignLeft(); + + return $slip; + } +} + +?> diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptDataFetch/DefaultReceiptDataFetch.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptDataFetch/DefaultReceiptDataFetch.php new file mode 100644 index 000000000..fa880155f --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptDataFetch/DefaultReceiptDataFetch.php @@ -0,0 +1,69 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultReceiptDataFetch + Module for fetching records from + the database for a receipt +*/ + +class DefaultReceiptDataFetch { + + /** + Implementation function + @return SQL result object + */ + function fetch($empNo=False,$laneNo=False,$transNo=False){ + global $CORE_LOCAL; + $op_db = $CORE_LOCAL->get('pDatabase'); + $sql = Database::tDataConnect(); + $query = 'SELECT l.upc,l.trans_type,l.description, + l.total,l.percentDiscount,l.trans_status, + l.charflag,l.scale,l.quantity,l.unitPrice, + l.ItemQtty,l.matched,l.numflag,l.tax, + l.foodstamp,l.trans_id, + s.subdept_name AS category + FROM localtemptrans AS l LEFT JOIN ' + .$op_db.$sql->sep().'subdepts AS s + ON l.department=s.dept_ID + WHERE trans_type <> \'L\' + ORDER BY trans_id DESC'; + if ($empNo && $laneNo && $transNo){ + $query = sprintf("SELECT l.upc,l.trans_type,l.description, + l.total,l.percentDiscount,l.trans_status, + l.charflag,l.scale,l.quantity,l.unitPrice, + l.ItemQtty,l.matched,l.numflag,l.tax, + l.foodstamp,l.trans_id, + s.subdept_name AS category + FROM localtranstoday as l LEFT JOIN " + .$op_db.$sql->sep()."subdepts AS s + ON l.department=s.dept_ID + WHERE trans_type <> 'L' AND + emp_no=%d AND register_no=%d AND trans_no=%d + ORDER BY trans_id DESC",$empNo,$laneNo,$transNo); + } + $result = $sql->query($query); + return $result; + } + +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFilter/DefaultReceiptFilter.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFilter/DefaultReceiptFilter.php new file mode 100755 index 000000000..0af70dc1a --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFilter/DefaultReceiptFilter.php @@ -0,0 +1,112 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultReceiptFilter + Module for adding and removing + records from the set that will be + printed. Subclasses may modify the + filter() method to alter behavior +*/ +class DefaultReceiptFilter { + + /** + Filtering function + @param $data an SQL result object + @return an array of records + */ + function filter($data){ + $deptsUsed = array(); + $tenderTTL = 0.00; + $tax = False; + $discount = False; + $returnset = array(); + + // walk through backwards and pick rows to keep + $dbc = Database::tDataConnect(); + $count = 0; + while($row = $dbc->fetch_row($data)){ + if ($tax === False && $row['upc'] == 'TAX'){ + // keep tax row. relevant to total and subtotal + $tax = $row; + } + else if ($discount === False && $row['upc'] == 'DISCOUNT'){ + if ($discount['total'] == 0) continue; + // keep discount row. need to pick up proper % discount still + $discount = $row; + $discount['trans_type'] = 'S'; + } + else if ($row['trans_type'] == 'T'){ + // keep tender rows. use them to calculate total + $tenderTTL += $row['total']; + $returnset[] = $row; + $count++; + } + else if ($row['trans_type'] == 'I' || $row['trans_type'] == 'D'){ + // keep item rows + // save department for fetching category headers + // and update discount row if necessary + if ($discount !== False && $row['percentDiscount'] > $discount['percentDiscount']) + $discount['percentDiscount'] = $row['percentDiscount']; + if (!isset($reverseMap[$row['category']])) + $reverseMap[$row['category']] = True; + $returnset[] = $row; + $count++; + } + else if ($row['trans_status'] == '0' && substr($row['description'],0,7)=="** Tare"){ + // only deal with tare lines + $prev = $count-1; + if (isset($returnset[$prev]) && strlen($returnset[$prev]['description'])>7 + && substr($returnset[$prev],0,7)=="** Tare"){ + continue; // ignore repeat tares + } + $tare = $row; + if (isset($returnset[$prev])) + $tare['category'] = $returnset[$prev]['category']; + $returnset[] = $tare; + $count++; + } + } + + $returnset = array_reverse($returnset); + + // add discount, subtotal, tax, and total records to the end + if ($discount){ + $returnset[] = $discount; + } + $returnset[] = array('upc'=>'SUBTOTAL','trans_type'=>'S', + 'total'=>(-1*$tenderTTL) - $tax['total']); + if ($tax){ + $returnset[] = $tax; + } + $returnset[] = array('upc'=>'TOTAL','trans_type'=>'S','total'=>-1*$tenderTTL); + + // add category headers + foreach($reverseMap as $catName => $val){ + $returnset[] = array('upc'=>'CAT_HEADER','trans_type'=>'H','description'=>$catName); + } + + return $returnset; + } + +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFilter/InOrderReceiptFilter.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFilter/InOrderReceiptFilter.php new file mode 100755 index 000000000..83dd0a70d --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFilter/InOrderReceiptFilter.php @@ -0,0 +1,95 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class InOrderReceiptFilter + Do not add category headers +*/ +class InOrderReceiptFilter extends DefaultReceiptFilter { + + /** + Filtering function + @param $data an SQL result object + @return an array of records + */ + function filter($data){ + $tenderTTL = 0.00; + $tax = False; + $discount = False; + $returnset = array(); + + // walk through backwards and pick rows to keep + $dbc = Database::tDataConnect(); + $count = 0; + while($row = $dbc->fetch_row($data)){ + if ($tax === False && $row['upc'] == 'TAX'){ + // keep tax row. relevant to total and subtotal + $tax = $row; + } + else if ($discount === False && $row['upc'] == 'DISCOUNT'){ + if ($discount['total'] == 0) continue; + // keep discount row. need to pick up proper % discount still + $discount = $row; + $discount['trans_type'] = 'S'; + } + else if ($row['trans_type'] == 'T'){ + // keep tender rows. use them to calculate total + $tenderTTL += $row['total']; + $returnset[] = $row; + $count++; + } + else if ($row['trans_type'] == 'I' || $row['trans_type'] == 'D'){ + // keep item rows + // save department for fetching category headers + // and update discount row if necessary + if ($discount !== False && $row['percentDiscount'] > $discount['percentDiscount']) + $discount['percentDiscount'] = $row['percentDiscount']; + $returnset[] = $row; + $count++; + } + else if ($row['trans_status'] == '0' && substr($row['description'],0,7)=="** Tare"){ + // only deal with tare lines + $prev = $count-1; + if (isset($returnset[$prev]) && strlen($returnset[$prev]['description'])>7 + && substr($returnset[$prev],0,7)=="** Tare"){ + continue; // ignore repeat tares + } + $returnset[] = $row; + $count++; + } + } + + $returnset = array_reverse($returnset); + + // add discount, subtotal, tax, and total records to the end + if ($discount) + $returnset[] = $discount; + $returnset[] = array('upc'=>'SUBTOTAL','trans_type'=>'S','total'=>(-1*$tenderTTL) - $tax['total']); + if ($tax) + $returnset[] = $tax; + $returnset[] = array('upc'=>'TOTAL','trans_type'=>'S','total'=>-1*$tenderTTL); + + return $returnset; + } + +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/DefaultReceiptFormat.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/DefaultReceiptFormat.php new file mode 100755 index 000000000..f2d8816a6 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/DefaultReceiptFormat.php @@ -0,0 +1,52 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultReceiptFormat + Module for print-formatting + receipt records. Subclasses can + override the format() method +*/ +class DefaultReceiptFormat { + + /* + boolean. + */ + public $is_bold; + + /** + constructor. disables bolding by default + */ + function DefaultReceiptFormat(){ + $is_bold = False; + } + + /** + Formatting function + @param $row a single receipt record + @return a formatted string + */ + function format($row){ + return ""; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/ItemReceiptFormat.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/ItemReceiptFormat.php new file mode 100755 index 000000000..704b00d57 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/ItemReceiptFormat.php @@ -0,0 +1,107 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class ItemFormat + Module for print-formatting + item records. +*/ +class ItemReceiptFormat extends DefaultReceiptFormat { + + /** + Formatting function + @param $row a single receipt record + @return a formatted string + */ + function format($row){ + if ($row['trans_type'] == 'D'){ + // department open ring; not much to format + return $this->align($row['description'],'',$row['total'],$this->flags($row)); + } + else if ($row['trans_status'] == 'D'){ + // a "YOU SAVED" line + $description = strtolower($row['description']); + $description = str_replace("**"," >",$description); + return $description; + } + else if ($row['trans_status'] == 'M'){ + // member special line + $description = sprintf(' > you saved $%.2f Member Special <',$row['total']*-1); + return $description; + } + else { + // an item record + + $comment = ""; + if ($row['charflag']=='SO'){ + // intentional. special orders can have weird + // quantity fields + $comment = ""; + } + elseif ($row['scale'] != 0 && $row['quantity'] != 0){ + $comment = sprintf('%.2f @ %.2f',$row['quantity'],$row['unitPrice']); + } + else if (abs($row['ItemQtty']>1)){ + $comment = sprintf('%d @ %.2f',$row['quantity'],$row['unitPrice']); + } + else if ($row['matched'] > 0){ + $comment = 'w/ vol adj'; + } + + if ($row['numflag'] > 0) $row['description'] .= '*'; + + return $this->align($row['description'],$comment,$row['total'],$this->flags($row)); + } + } + + /** + Determine flags for a row + */ + function flags($row){ + if($row['trans_status']=='V') return 'VD'; + elseif($row['trans_status']=='R') return 'RF'; + else { + $flags = ''; + if($row['tax'] != 0) + $flags .= 'T'; + if($row['foodstamp'] != 0) + $flags .= 'F'; + return $flags; + } + } + + /** + Pad fields into a standard width and alignment + */ + function align($description, $comment, $amount, $flags=""){ + $amount = sprintf('%.2f',$amount); + if ($amount=="0.00") $amount=""; + + $ret = str_pad($description,30,' ',STR_PAD_RIGHT); + $ret .= str_pad($comment,14,' ',STR_PAD_RIGHT); + $ret .= str_pad($amount,8,' ',STR_PAD_LEFT); + $ret .= str_pad($flags,4,' ',STR_PAD_LEFT); + + return $ret; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/OtherReceiptFormat.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/OtherReceiptFormat.php new file mode 100755 index 000000000..540a14923 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/OtherReceiptFormat.php @@ -0,0 +1,49 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class OtherFormat + Module for print-formatting + miscelaneous records. +*/ +class OtherReceiptFormat extends DefaultReceiptFormat { + + /** + Formatting function + @param $row a single receipt record + @return a formatted string + */ + function format($row){ + if ($row['trans_type'] == '0'){ + // tare + $description = strtolower($description); + $description = str_replace('**',' =',$description); + return $description; + } + else if ($row['trans_type'] == 'H' && $row['description'] != ''){ + $this->is_bold = True; + return $row['description']; + } + return ""; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/TenderReceiptFormat.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/TenderReceiptFormat.php new file mode 100755 index 000000000..31ce2f7e9 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/TenderReceiptFormat.php @@ -0,0 +1,41 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class TenderFormat + Module for print-formatting + tender records. +*/ +class TenderReceiptFormat extends DefaultReceiptFormat { + + /** + Formatting function + @param $row a single receipt record + @return a formatted string + */ + function format($row){ + $ret = str_pad($row['description'],44,' ',STR_PAD_LEFT); + $ret .= str_pad(sprintf('%.2f',-1*$row['total']),8,' ',STR_PAD_LEFT); + return $ret; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/TotalReceiptFormat.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/TotalReceiptFormat.php new file mode 100755 index 000000000..77416a16e --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptFormat/TotalReceiptFormat.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class TotalFormat + Module for print-formatting + total records. +*/ +class TotalReceiptFormat extends DefaultReceiptFormat { + + /** + Formatting function + @param $row a single receipt record + @return a formatted string + */ + function format($row){ + switch($row['upc']){ + case 'TOTAL': + $this->is_bold = True; + return $this->align($row['upc'],$row['total']); + break; + case 'SUBTOTAL': + case 'TAX': + return $this->align($row['upc'],$row['total']); + break; + case 'DISCOUNT': + $text = sprintf("%d%% Discount Applied",$row['percentDiscount']); + return $this->align($text,$row['total']); + break; + } + } + + function align($text,$amount){ + $amount = sprintf('%.2f',$amount); + + $ret = str_pad($text,44,' ',STR_PAD_LEFT); + $ret .= str_pad($amount,8,' ',STR_PAD_LEFT); + return $ret; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptSort/DefaultReceiptSort.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptSort/DefaultReceiptSort.php new file mode 100755 index 000000000..082e8a635 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptSort/DefaultReceiptSort.php @@ -0,0 +1,166 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultReceiptFilter + Module for sorting receipt records + Subclasses can modify the sort() + method to alter behavior +*/ +class DefaultReceiptSort { + + /** + Sorting function + @param $rowset an array of records + @return an array of records + */ + function sort($rowset){ + $tax = False; + $discount = False; + $total = False; + $subtotal = False; + $items = array('_uncategorized'=>array()); + $headers = array(); + $tenders = array(); + + // accumulate the various pieces + foreach($rowset as $row){ + if ($row['upc'] == 'TAX'){ + $tax = $row; + } + elseif($row['upc'] == 'DISCOUNT'){ + $discount = $row; + } + elseif($row['upc'] == 'SUBTOTAL'){ + $subtotal = $row; + } + elseif($row['upc'] == 'TOTAL'){ + $total = $row; + } + elseif($row['upc'] == 'CAT_HEADER'){ + $headers[] = $row; + } + elseif($row['trans_type'] == 'T'){ + $tenders[] = $row; + } + else { + if(isset($row['category'])){ + if (!isset($items[$row['category']])) + $items[$row['category']] = array(); + + $items[$row['category']] = $this->upc_merge($items[$row['category']],$row); + } + else { + $items[$row['_uncategorized']] = $this->upc_merge($items[$row['_uncategorized']],$row); + } + } + } + + $returnset = array(); + + // first add uncategorized item records + if (count($items['_uncategorized'] > 0)){ + usort($items['_uncategorized'],array('DefaultReceiptSort','record_compare')); + foreach($items['_uncategorized'] as $row){ + $returnset[] = $row; + } + } + + // next do categorized alphabetically + // if there are items for a given header, + // add that header followed by those items + if (count($headers) > 0){ + asort($headers); + foreach($headers as $hrow){ + if (count($items[$hrow['description']]) > 0){ + $returnset[] = $hrow; + usort($items[$hrow['description']],array('DefaultReceiptSort','record_compare')); + foreach($items[$hrow['description']] as $irow) + $returnset[] = $irow; + } + } + } + + // then discount, subtotal, tax, total + if ($discount !== False) + $returnset[] = $discount; + if ($subtotal !== False) + $returnset[] = $subtotal; + if ($tax !== False) + $returnset[] = $tax; + if ($total !== False) + $returnset[] = $total; + + // finally tenders + if(count($tenders) > 0){ + usort($tenders, array('DefaultReceiptSort','record_compare')); + foreach($tenders as $trow) + $returnset[] = $trow; + } + + return $returnset; + } + + // utility function to sort records by the trans_id field + public static function record_compare($r1,$r2){ + if (!isset($r1['trans_id']) || !isset($r2['trans_id'])) + return 0; + else + return $r1['trans_id'] - $r2['trans_id']; + } + + /** + Combine item records when appropriate + @param $cur an array of records some of which + are keyed by UPC + @param $new a new record + @return $cur with the new record added + */ + protected function upc_merge($cur, $new){ + if ($new['trans_status'] != '' || $row['trans_type'] != '' + || $new['scale'] != 0 || $new['matched'] != 0){ + /** + By-weight, refund, void, or group discount + items shouldn't be combined. They + get added with a simple numerical key + */ + $cur[] = $new; + } + else if (isset($cur[$new['upc']])){ + /** + Valid item to merge; add to the existing record + */ + $cur[$new['upc']]['ItemQty'] += $new['ItemQty']; + $cur[$new['upc']]['quantity'] += $new['quantity']; + $cur[$new['upc']]['total'] += $new['total']; + } + else { + /** + Valid item to merge; add record with + UPC key. + */ + $cur[$new['upc']] = $new; + } + return $cur; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptSort/InOrderReceiptSort.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptSort/InOrderReceiptSort.php new file mode 100755 index 000000000..d27dd6d65 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptSort/InOrderReceiptSort.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class InOrderReceiptSort + Does nothing. Leave items in the order they + were entered. +*/ +class InOrderReceiptSort extends DefaultReceiptSort { + + /** + Sorting function + @param $rowset an array of records + @return an array of records + */ + function sort($rowset){ + return $rowset; + } + +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/ReceiptTag/DefaultReceiptTag.php b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptTag/DefaultReceiptTag.php new file mode 100755 index 000000000..4fb5f9341 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/ReceiptTag/DefaultReceiptTag.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultReceiptTag + Module for marking receipt records + as certain types. Subclasses can + override the tag() method +*/ +class DefaultReceiptTag { + + /** + Tagging function + @param $rowset an array of records + @return an array of records + */ + function tag($rowset){ + + for($i=0;$i<count($rowset);$i++){ + switch($rowset[$i]['trans_type']){ + case 'T': + $rowset[$i]['tag'] = 'Tender'; + break; + case 'I': + case 'D': + $rowset[$i]['tag'] = 'Item'; + break; + case 'H': + case '0': + $rowset[$i]['tag'] = 'Other'; + break; + default: + $rowset[$i]['tag'] = 'Total'; + break; + } + } + + return $rowset; + } +} diff --git a/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/DefaultTenderReport.php b/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/DefaultTenderReport.php new file mode 100644 index 000000000..e5b235a28 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/DefaultTenderReport.php @@ -0,0 +1,109 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultTenderReport + Generate a tender report +*/ +class DefaultTenderReport extends TenderReport { + +/** + Print a tender report + + This tender report is based on a single tender tape view + rather than multiple views (e.g. ckTenders, ckTenderTotal, etc). + Which tenders to include is defined via checkboxes by the + tenders on the install page's "extras" tab. + */ +static public function get(){ + global $CORE_LOCAL; + + $DESIRED_TENDERS = $CORE_LOCAL->get("TRDesiredTenders"); + + $db_a = Database::mDataConnect(); + + $blank = " "; + $fieldNames = " ".substr("Time".$blank, 0, 13) + .substr("Lane".$blank, 0, 9) + .substr("Trans #".$blank, 0, 12) + .substr("Change".$blank, 0, 14) + .substr("Amount".$blank, 0, 14)."\n"; + $ref = ReceiptLib::centerString(trim($CORE_LOCAL->get("CashierNo"))." ".trim($CORE_LOCAL->get("cashier"))." ".ReceiptLib::build_time(time()))."\n\n"; + $receipt = ""; + + foreach(array_keys($DESIRED_TENDERS) as $tender_code){ + $query = "select tdate from TenderTapeGeneric where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and tender_code = '".$tender_code."' order by tdate"; + $result = $db_a->query($query); + $num_rows = $db_a->num_rows($result); + if ($num_rows <= 0) continue; + + //$receipt .= chr(27).chr(33).chr(5); + + $titleStr = ""; + $itemize = 1; + for ($i = 0; $i < strlen($DESIRED_TENDERS[$tender_code]); $i++) + $titleStr .= $DESIRED_TENDERS[$tender_code][$i]." "; + $titleStr = substr($titleStr,0,strlen($titleStr)-1); + $receipt .= ReceiptLib::centerString($titleStr)."\n"; + + $receipt .= $ref; + if ($itemize == 1) $receipt .= ReceiptLib::centerString("------------------------------------------------------"); + + $query = "select tdate,register_no,trans_no,tender + from TenderTapeGeneric where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and tender_code = '".$tender_code."' order by tdate"; + $result = $db_a->query($query); + $num_rows = $db_a->num_rows($result); + + if ($itemize == 1) $receipt .= $fieldNames; + $sum = 0; + + for ($i = 0; $i < $num_rows; $i++) { + if (($CORE_LOCAL->get("store") == "harvest-cb") && ($tender_code == "PE" || $tender_code == "BU" || $tender_code == "EL" || $tender_code == "PY" || $tender_code == "TV")) $itemize = 1; + else $itemize = 0; + $row = $db_a->fetch_array($result); + $timeStamp = self::timeStamp($row["tdate"]); + if ($itemize == 1) { + $receipt .= " ".substr($timeStamp.$blank, 0, 13) + .substr($row["register_no"].$blank, 0, 9) + .substr($row["trans_no"].$blank, 0, 8) + .substr($blank.number_format("0", 2), -10) + .substr($blank.number_format($row["tender"], 2), -14)."\n"; + } + $sum += $row["tender"]; + } + + $receipt.= ReceiptLib::centerString("------------------------------------------------------"); + + $receipt .= substr($blank.$blank.$blank."Count: ".$num_rows." Total: ".number_format($sum,2), -56)."\n"; + $receipt .= str_repeat("\n", 4); +// $receipt .= chr(27).chr(105); + } + + return $receipt.chr(27).chr(105); +} + +} + +?> diff --git a/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/TenderReport.php b/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/TenderReport.php new file mode 100644 index 000000000..06bad3026 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/TenderReport.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class TenderReport + Generate a tender report +*/ +class TenderReport extends LibraryClass { + +/** + Write tender report to the printer +*/ +static public function printReport(){ + $contents = self::get(); + ReceiptLib::writeLine($contents); +} + +/** + Generate a tender report + @return [string] receipt contents + + This method can be overriden by subclasses to create + alternate tender reports. When called, this function + will use whichever module is listed in the configuration + setting "TenderReportMod". If nothing has been selected, + the "DefaultTenderReport" module is used. + */ +static public function get(){ + global $CORE_LOCAL; + $trClass = $CORE_LOCAL->get("TenderReportMod"); + if ($trClass == '') $trClass = 'DefaultTenderReport'; + return $trClass::get(); +} + +static public function timeStamp($time) { + + return strftime("%I:%M %p", strtotime($time)); +} + +} + +?> diff --git a/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/WfcTenderReport.php b/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/WfcTenderReport.php new file mode 100644 index 000000000..14881240f --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/TenderReports/WfcTenderReport.php @@ -0,0 +1,187 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class WfcTenderReport + Generate a tender report +*/ +class WfcTenderReport extends TenderReport { + +/** + Print a tender report + + This tender report is based on a single tender tape view + rather than multiple views (e.g. ckTenders, ckTenderTotal, etc) + adding a new tender is mostly just a matter of adding it + to the $DESIRED_TENDERS array (exception being if you want + special handling in the tender tape view (e.g., three + tender types are actually compined under EBT) + */ +static public function get(){ + global $CORE_LOCAL; + + $DESIRED_TENDERS = $CORE_LOCAL->get("TRDesiredTenders"); + + $DESIRED_TENDERS = array("CK"=>"CHECK TENDERS", + "CC"=>"CREDIT CARD TENDERS", + "GD"=>"GIFT CARD TENDERS", + "TC"=>"GIFT CERT TENDERS", + "MI"=>"STORE CHARGE TENDERS", + "EF"=>"EBT CARD TENDERS", + "CP"=>"COUPONS TENDERED", + "IC"=>"INSTORE COUPONS TENDERED", + "ST"=>"STAMP BOOKS SOLD", + "BP"=>"BUS PASSES SOLD", + "AR"=>"AR PAYMENTS", + "EQ"=>"EQUITY SALES", + "SN"=>"SANDWICH CARD", + "CF"=>"COFFEE CARD", + "SC"=>"STORE CREDIT" + ); + + $db_a = Database::mDataConnect(); + + $blank = " "; + $fieldNames = " ".substr("Time".$blank, 0, 13) + .substr("Lane".$blank, 0, 9) + .substr("Trans #".$blank, 0, 12) + .substr("Change".$blank, 0, 14) + .substr("Amount".$blank, 0, 14)."\n"; + $ref = ReceiptLib::centerString(trim($CORE_LOCAL->get("CashierNo"))." ".trim($CORE_LOCAL->get("cashier"))." ".ReceiptLib::build_time(time()))."\n\n"; + $receipt = ""; + + $itemize = 0; + foreach($DESIRED_TENDERS as $tender_code => $header){ + $query = "select tdate,register_no,trans_no,-total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='T' AND trans_subtype='".$tender_code."' + ORDER BY tdate"; + switch($tender_code){ + case 'CC': + $query = "select tdate,register_no,trans_no,-total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='T' AND trans_subtype IN ('CC','AX') + ORDER BY tdate"; + break; + case 'EF': + $query = "select tdate,register_no,trans_no,-total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='T' AND trans_subtype IN ('EF','EC') + ORDER BY tdate"; + break; + case 'CP': + $query = "select tdate,register_no,trans_no,-total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='T' AND trans_subtype ='CP' AND + upc NOT LIKE '%MAD%' ORDER BY tdate"; + break; + case 'SC': + $query = "select tdate,register_no,trans_no,-total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='T' AND trans_subtype ='SC' AND + total<0 ORDER BY tdate"; + break; + case 'AR': + $query = "select tdate,register_no,trans_no,total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='D' AND department = 990 + ORDER BY tdate"; + break; + case 'EQ': + $query = "select tdate,register_no,trans_no,total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='D' AND department IN (991,992) + ORDER BY tdate"; + break; + case 'ST': + $query = "select tdate,register_no,trans_no,total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='I' AND upc = '0000000001065' + ORDER BY tdate"; + break; + case 'BP': + $query = "select tdate,register_no,trans_no,total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='I' AND upc IN('0000000007573','0000000007574') + ORDER BY tdate"; + break; + case 'SN': + $query = "select tdate,register_no,trans_no,total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='I' AND upc LIKE '002001000%' + ORDER BY tdate"; + break; + case 'CF': + $query = "select tdate,register_no,trans_no,total AS tender + from dlog where emp_no=".$CORE_LOCAL->get("CashierNo"). + " and trans_type='I' AND upc LIKE '002000600%' + ORDER BY tdate"; + break; + } + $result = $db_a->query($query); + $num_rows = $db_a->num_rows($result); + if ($num_rows <= 0) continue; + + //$receipt .= chr(27).chr(33).chr(5); + + $titleStr = ""; + for ($i = 0; $i < strlen($header); $i++) + $titleStr .= $header[$i]." "; + $titleStr = substr($titleStr,0,strlen($titleStr)-1); + $receipt .= ReceiptLib::centerString($titleStr)."\n"; + + $receipt .= $ref; + if ($itemize == 1) $receipt .= ReceiptLib::centerString("------------------------------------------------------"); + + $itemize = 1; + + if ($itemize == 1) $receipt .= $fieldNames; + $sum = 0; + + for ($i = 0; $i < $num_rows; $i++) { + $row = $db_a->fetch_array($result); + $timeStamp = self::timeStamp($row["tdate"]); + if ($itemize == 1) { + $receipt .= " ".substr($timeStamp.$blank, 0, 13) + .substr($row["register_no"].$blank, 0, 9) + .substr($row["trans_no"].$blank, 0, 8) + .substr($blank.number_format("0", 2), -10) + .substr($blank.number_format($row["tender"], 2), -14)."\n"; + } + $sum += $row["tender"]; + } + + $receipt.= ReceiptLib::centerString("------------------------------------------------------"); + + $receipt .= substr($blank.$blank.$blank."Count: ".$num_rows." Total: ".number_format($sum,2), -56)."\n"; + $receipt .= str_repeat("\n", 4); + + $receipt .= chr(27).chr(105); + } + + return $receipt.chr(27).chr(105); +} + +} + +?> diff --git a/pos/is4c-nf/lib/ReceiptBuilding/custMessages/WfcEquityMessage.php b/pos/is4c-nf/lib/ReceiptBuilding/custMessages/WfcEquityMessage.php new file mode 100755 index 000000000..34e72ffd4 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptBuilding/custMessages/WfcEquityMessage.php @@ -0,0 +1,28 @@ +<?php + +class WfcEquityMessage { + + function message($str){ + global $CORE_LOCAL; + $ret = ""; + if (strstr($str," == ") ){ + $lines = explode(" == ",$str); + if ($CORE_LOCAL->get("equityNoticeAmt") > 0){ + if (isset($lines[0]) && is_numeric(substr($lines[0],13))){ + $newamt = substr($lines[0],13) - $CORE_LOCAL->get("equityNoticeAmt"); + $lines[0] = sprintf('EQUITY BALANCE DUE $%.2f',$newamt); + if ($newamt <= 0 && isset($lines[1])) + $lines[1] = "PAID IN FULL"; + } + } + foreach($lines as $line) + $ret .= ReceiptLib::centerString($line)."\n"; + } + else + $ret .= $str; + return $ret; + } + +} + +?> diff --git a/pos/is4c-nf/lib/ReceiptLib.php b/pos/is4c-nf/lib/ReceiptLib.php new file mode 100755 index 000000000..cffafcc55 --- /dev/null +++ b/pos/is4c-nf/lib/ReceiptLib.php @@ -0,0 +1,1519 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class ReceiptLib + Receipt functions +*/ +class ReceiptLib extends LibraryClass { + + static private $PRINT_OBJ; + +// -------------------------------------------------------------- +static public function build_time($timestamp) { + + return strftime("%m/%d/%y %I:%M %p", $timestamp); +} +// -------------------------------------------------------------- +static public function centerString($text) { + + return self::center($text, 59); +} +// -------------------------------------------------------------- +static public function writeLine($text) { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("print") != 0) { + /* check fails on LTP1: in PHP4 + suppress open errors and check result + instead + */ + //if (is_writable($CORE_LOCAL->get("printerPort"))){ + $fp = fopen($CORE_LOCAL->get("printerPort"), "w"); + fwrite($fp, $text); + fclose($fp); + } +} +// -------------------------------------------------------------- +static public function center_check($text) { + +// return str_repeat(" ", 22).center($text, 60); // apbw 03/24/05 Wedge printer swap patch + return self::center($text, 60); // apbw 03/24/05 Wedge printer swap patch +} + +// -------------------------------------------------------------- +// concatenated by tt/apbw 3/16/05 old wedge printer Franking Patch II + +static public function endorse($text) { + + self::writeLine(chr(27).chr(64).chr(27).chr(99).chr(48).chr(4) + // .chr(27).chr(33).chr(10) + .$text + .chr(27).chr(99).chr(48).chr(1) + .chr(12) + .chr(27).chr(33).chr(5)); +} +// ------------------------------------------------------------- + +static public function center($text, $linewidth) { + $blank = str_repeat(" ", 59); + $text = trim($text); + $lead = (int) (($linewidth - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} + +// ------------------------------------------------------------- +static public function drawerKick() { + $pin = self::currentDrawer(); + if ($pin == 1) + self::writeLine(chr(27).chr(112).chr(0).chr(48)."0"); + elseif ($pin == 2) + self::writeLine(chr(27).chr(112).chr(1).chr(48)."0"); + //self::writeLine(chr(27).chr(112).chr(48).chr(55).chr(121)); +} + +/** + Which drawer is currently in use + @return + 1 - Use the first drawer + 2 - Use the second drawer + 0 - Current cashier has no drawer + + This always returns 1 when dual drawer mode + is enabled. Assignments in the table aren't + relevant. +*/ +static public function currentDrawer(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get('dualDrawerMode') !== 1) return 1; + $db = Database::pDataConnect(); + $chkQ = 'SELECT drawer_no FROM drawerowner WHERE emp_no='.$CORE_LOCAL->get('CashierNo'); + $chkR = $db->query($chkQ); + if ($db->num_rows($chkR) == 0) return 0; + else return array_pop($db->fetch_row($chkR)); +} + +/** + Assign drawer to cashier + @param $emp the employee number + @param $num the drawer number + @return success True/False +*/ +static public function assignDrawer($emp,$num){ + $db = Database::pDataConnect(); + $upQ = sprintf('UPDATE drawerowner SET emp_no=%d WHERE drawer_no=%d',$emp,$num); + $upR = $db->query($upQ); + return ($upR !== False) ? True : False; +} + +/** + Unassign drawer + @param $num the drawer number + @return success True/False +*/ +static public function freeDrawer($num){ + $db = Database::pDataConnect(); + $upQ = sprintf('UPDATE drawerowner SET emp_no=NULL WHERE drawer_no=%d',$num); + $upR = $db->query($upQ); + return ($upR !== False) ? True : False; +} + +/** + Get list of available drawers + @return array of drawer numbers +*/ +static public function availableDrawers(){ + global $CORE_LOCAL; + $db = Database::pDataConnect(); + $q = 'SELECT drawer_no FROM drawerowner WHERE emp_no IS NULL ORDER BY drawer_no'; + $r = $db->query($q); + $ret = array(); + while($w = $db->fetch_row($r)) + $ret[] = $w['drawer_no']; + return $ret; +} + +// ------------------------------------------------------------- +static public function printReceiptHeader($dateTimeStamp, $ref) { + global $CORE_LOCAL; + + $receipt = self::$PRINT_OBJ->TextStyle(True); + $img_cache = $CORE_LOCAL->get('ImageCache'); + if (!is_array($img_cache)) $img_cache = array(); + + for ($i=1; $i <= $CORE_LOCAL->get("receiptHeaderCount"); $i++){ + + /** + If the receipt header line is a .bmp file (and it exists), + print it on the receipt. Otherwise just print the line of + text centered. + */ + $headerLine = $CORE_LOCAL->get("receiptHeader".$i); + $graphics_path = MiscLib::base_url().'graphics'; + if (substr($headerLine,-4) == ".bmp" && file_exists($graphics_path.'/'.$headerLine)){ + // save image bytes in cache so they're not recalculated + // on every receipt + $img_file = $graphics_path.'/'.$headerLine; + if (isset($img_cache[basename($img_file)]) && !empty($img_cache[basename($img_file)]) && get_class(self::$PRINT_OBJ)=='ESCPOSPrintHandler'){ + $receipt .= $img_cache[basename($img_file)]."\n"; + } + else { + $img = self::$PRINT_OBJ->RenderBitmapFromFile($img_file); + $receipt .= $img."\n"; + $img_cache[basename($img_file)] = $img; + $CORE_LOCAL->set('ImageCache',$img_cache); + $receipt .= "\n"; + } + } + else { + $bold = ($i==1) ? True : False; + $receipt .= self::$PRINT_OBJ->centerString($CORE_LOCAL->get("receiptHeader$i"), $bold); + $receipt .= "\n"; + } + } + + $receipt .= "\n"; + $receipt .= "Cashier: ".$CORE_LOCAL->get("cashier")."\n\n"; + + $time = self::build_time($dateTimeStamp); + $time = str_replace(" "," ",$time); + $spaces = 55 - strlen($time) - strlen($ref); + $receipt .= $time.str_repeat(' ',$spaces).$ref."\n"; + + return $receipt; +} +// ------------------------------------------------------------- +static public function promoMsg() { + +} + +// Charge Footer split into two functions by apbw 2/1/05 + +static public function printChargeFooterCust($dateTimeStamp, $ref) { // apbw 2/14/05 SCR + global $CORE_LOCAL; + + $chgName = self::getChgName(); // added by apbw 2/14/05 SCR + + $date = self::build_time($dateTimeStamp); + + $receipt = chr(27).chr(33).chr(5)."\n\n\n".self::centerString("C U S T O M E R C O P Y")."\n" + .self::centerString("................................................")."\n" + .self::centerString($CORE_LOCAL->get("chargeSlip1"))."\n\n" + ."CUSTOMER CHARGE ACCOUNT\n" + ."Name: ".trim($chgName)."\n" // changed by apbw 2/14/05 SCR + ."Member Number: ".trim($CORE_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."Charge Amount: $".number_format(-1 * $CORE_LOCAL->get("chargeTotal"), 2)."\n" + .self::centerString("................................................")."\n" + ."\n\n\n\n\n\n\n" + .chr(27).chr(105); + + return $receipt; + +} + +// Charge Footer split into two functions by apbw 2/1/05 + +static public function printChargeFooterStore($dateTimeStamp, $ref) { // apbw 2/14/05 SCR + global $CORE_LOCAL; + + + $chgName = self::getChgName(); // added by apbw 2/14/05 SCR + + $date = self::build_time($dateTimeStamp); + + $receipt = "\n\n\n\n\n\n\n" + .chr(27).chr(105) + .chr(27).chr(33).chr(5) // apbw 3/18/05 + ."\n".self::centerString($CORE_LOCAL->get("chargeSlip2"))."\n" + .self::centerString("................................................")."\n" + .self::centerString($CORE_LOCAL->get("chargeSlip1"))."\n\n" + ."CUSTOMER CHARGE ACCOUNT\n" + ."Name: ".trim($chgName)."\n" // changed by apbw 2/14/05 SCR + ."Member Number: ".trim($CORE_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."Charge Amount: $".number_format(-1 * $CORE_LOCAL->get("chargeTotal"), 2)."\n" + ."I AGREE TO PAY THE ABOVE AMOUNT\n" + ."TO MY CHARGE ACCOUNT\n" + ."Purchaser Sign Below\n\n\n" + ."X____________________________________________\n" + .$CORE_LOCAL->get("fname")." ".$CORE_LOCAL->get("lname")."\n\n" + .self::centerString(".................................................")."\n\n"; + + return $receipt; + + +} + +static public function printCabCoupon($dateTimeStamp, $ref){ + global $CORE_LOCAL; + + /* no cut + $receipt = "\n\n\n\n\n\n\n" + .chr(27).chr(105) + .chr(27).chr(33).chr(5) + ."\n"; + */ + $receipt = "\n"; + + $receipt .= self::biggerFont(self::centerBig("WHOLE FOODS COMMUNITY CO-OP"))."\n\n"; + $receipt .= self::centerString("(218) 728-0884")."\n"; + $receipt .= self::centerString("MEMBER OWNED SINCE 1970")."\n"; + $receipt .= self::centerString(self::build_time($dateTimeStamp))."\n"; + $receipt .= self::centerString('Effective this date ONLY')."\n"; + $parts = explode("-",$ref); + $receipt .= self::centerString("Cashier: $parts[0]")."\n"; + $receipt .= self::centerString("Transaction: $ref")."\n"; + $receipt .= "\n"; + $receipt .= "Your net purchase today of at least $30.00"."\n"; + $receipt .= "qualifies you for a WFC CAB COUPON"."\n"; + $receipt .= "in the amount of $3.00"; + $receipt .= " with\n\n"; + $receipt .= "GO GREEN TAXI (722-8090) or"."\n"; + $receipt .= "YELLOW CAB OF DULUTH (727-1515)"."\n"; + $receipt .= "from WFC toward the destination of\n"; + $receipt .= "your choice TODAY"."\n\n"; + + + $receipt .= "" + ."This coupon is not transferable.\n" + ."One coupon/day/customer.\n" + ."Any amount of fare UNDER the value of this coupon\n" + ."is the property of the cab company.\n" + ."Any amount of fare OVER the value of this coupon\n" + ."is your responsibility.\n" + ."Tips are NOT covered by this coupon.\n" + ."Acceptance of this coupon by the cab driver is\n" + ."subject to the terms and conditions noted above.\n"; + + return $receipt; +} + +// ------------- frank.php incorporated into printlib on 3/24/05 apbw (from here to eof) ------- + +static public function frank($amount) { + global $CORE_LOCAL; + + $date = strftime("%m/%d/%y %I:%M %p", time()); + $ref = trim($CORE_LOCAL->get("memberID"))." ".trim($CORE_LOCAL->get("CashierNo"))." ".trim($CORE_LOCAL->get("laneno"))." ".trim($CORE_LOCAL->get("transno")); + $tender = "AMT: ".MiscLib::truncate2($amount)." CHANGE: ".MiscLib::truncate2($CORE_LOCAL->get("change")); + $output = self::center_check($ref)."\n" + .self::center_check($date)."\n" + .self::center_check($CORE_LOCAL->get("ckEndorse1"))."\n" + .self::center_check($CORE_LOCAL->get("ckEndorse2"))."\n" + .self::center_check($CORE_LOCAL->get("ckEndorse3"))."\n" + .self::center_check($CORE_LOCAL->get("ckEndorse4"))."\n" + .self::center_check($tender)."\n"; + + + + self::endorse($output); +} + +// ----------------------------------------------------- + +static public function frankgiftcert($amount) { + global $CORE_LOCAL; + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + $next_year_stamp = mktime(0,0,0,date("m"), date("d"), date("Y")+1); + $next_year = strftime("%m/%d/%y", $next_year_stamp); // apbw 3/10/05 "%D" didn't work - Franking patch + // lines 200-207 edited 03/24/05 apbw Wedge Printer Swap Patch + $output = ""; + $output .= str_repeat("\n", 6); + $output .= "ref: " .$ref. "\n"; + $output .= str_repeat(" ", 5).$time_now; + $output .= str_repeat(" ", 12).$next_year; + $output .= str_repeat("\n", 3); + $output .= str_repeat(" ", 75); + $output .= "$".MiscLib::truncate2($amount); + self::endorse($output); + +} + +// ----------------------------------------------------- + +static public function frankstock($amount) { + global $CORE_LOCAL; + + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + /* pointless + if ($CORE_LOCAL->get("franking") == 0) { + $CORE_LOCAL->set("franking",1); + } + */ + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + $output = ""; + $output .= str_repeat("\n", 40); // 03/24/05 apbw Wedge Printer Swap Patch + if ($CORE_LOCAL->get("equityAmt")){ + $output = "Equity Payment ref: ".$ref." ".$time_now; // WFC + $CORE_LOCAL->set("equityAmt",""); + $CORE_LOCAL->set("LastEquityReference",$ref); + } + else { + $output .= "Stock Payment $".$amount." ref: ".$ref." ".$time_now; // apbw 3/24/05 Wedge Printer Swap Patch + } + + self::endorse($output); +} +//------------------------------------------------------- + + +static public function frankclassreg() { + global $CORE_LOCAL; + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + $output = ""; + $output .= str_repeat("\n", 11); // apbw 3/24/05 Wedge Printer Swap Patch + $output .= str_repeat(" ", 5); // apbw 3/24/05 Wedge Printer Swap Patch + $output .= "Validated: ".$time_now." ref: ".$ref; // apbw 3/24/05 Wedge Printer Swap Patch + + self::endorse($output); + +} + +/***** jqh 09/29/05 functions added for new receipt *****/ +static public function biggerFont($str) { + $receipt=chr(29).chr(33).chr(17); + $receipt.=$str; + $receipt.=chr(29).chr(33).chr(00); + + return $receipt; +} +static public function centerBig($text) { + $blank = str_repeat(" ", 30); + $text = trim($text); + $lead = (int) ((30 - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +/***** jqh end change *****/ + +/***** CvR 06/28/06 calculate current balance for receipt ****/ +static public function chargeBalance($receipt){ + global $CORE_LOCAL; + PrehLib::chargeOK(); + + $db = Database::tDataConnect(); + $checkQ = "select trans_id from localtemptrans where department=990 or trans_subtype='MI'"; + $checkR = $db->query($checkQ); + $num_rows = $db->num_rows($checkR); + + $currActivity = $CORE_LOCAL->get("memChargeTotal"); + $currBalance = $CORE_LOCAL->get("balance") - $currActivity; + + if(($num_rows > 0 || $currBalance != 0) && $CORE_LOCAL->get("memberID") != 11){ + $chargeString = "Current IOU Balance: $".sprintf("%.2f",$currBalance); + $receipt = $receipt."\n\n".self::biggerFont(self::centerBig($chargeString)); + } + + return $receipt; +} + +static public function storeCreditIssued($second, $ref=''){ + global $CORE_LOCAL; + if ($second) return ""; + + $db = Database::tDataConnect(); + $checkQ = "select sum(total) from localtemptrans where trans_subtype='SC' and trans_type='T'"; + if ($ref !== ''){ + list($e, $r, $t) = explode('-',$ref); + $checkQ = "select sum(total) from localtranstoday where + trans_subtype='SC' and trans_type='T' + AND emp_no=".((int)$e).' + AND register_no='.((int)$r).' + AND trans_no='.((int)$t); + } + $checkR = $db->query($checkQ); + + $num_rows = $db->num_rows($checkR); + if ($num_rows == 0) return ""; + + $row = $db->fetch_row($checkR); + $issued = $row[0]; + if ($issued <= 0) return ""; + + + $slip = self::centerString("................................................")."\n\n"; + $slip .= self::centerString("( C U S T O M E R C O P Y )")."\n"; + $slip .= self::biggerFont("Store credit issued")."\n\n"; + $slip .= self::biggerFont(sprintf("Amount \$%.2f",$issued))."\n\n"; + + if ( $CORE_LOCAL->get("fname") != "" && $CORE_LOCAL->get("lname") != ""){ + $slip .= "Name: ".$CORE_LOCAL->get("fname")." ".$CORE_LOCAL->get("lname")."\n\n"; + } + else { + $slip .= "Name: ____________________________________________\n\n"; + } + $slip .= "Ph #: ____________________________________________\n\n"; + + $slip .= " * no cash back on store credit refunds\n"; + $slip .= " * change amount is not transferable to\n another store credit\n"; + $slip .= self::centerString("................................................")."\n"; + return $slip; +} + +static public function getChgName() { + /* + the name that appears beneath the signature + line on the customer copy is pulled from $CORE_LOCAL. + Pulling the name here from custdata w/o respecting + personNum can cause this name to differ from the + signature line, so I'm using $CORE_LOCAL here too. I'm + leaving the query in place as a check that memberID + is valid; shouldn't slow anything down noticably. + + I also changed the memberID strlen qualifier because the + != 4 or == 4 decision was causing inconsistent behavior + with older memberships that have memberIDs shorter than + 4 digits. + + andy + */ + global $CORE_LOCAL; + $query = "select LastName, FirstName from custdata where CardNo = '" .$CORE_LOCAL->get("memberID") ."'"; + $connection = Database::pDataConnect(); + $result = $connection->query($query); + $num_rows = $connection->num_rows($result); + + if ($num_rows > 0) { + $LastInit = substr($CORE_LOCAL->get("lname"), 0, 1)."."; + return trim($CORE_LOCAL->get("fname")) ." ". $LastInit; + } + else{ + return $CORE_LOCAL->get('memMsg'); + } +} + +static public function printCCSigSlip($dateTimeStamp,$ref,$storeCopy=True,$rp=0){ + global $CORE_LOCAL; + self::normalFont(); + + $date = self::build_time($dateTimeStamp); + $ert = explode("-",$ref); + $emp = $ert[0]; + $reg = $ert[1]; + $trans = $ert[2]; + $slip = ""; + $db = -1; + $idclause = ""; + $sort = ""; + + if ( $rp != 0 ) { // if this is a reprint of a previous transaction, loop through all cc slips for that transaction + $db = Database::mDataConnect(); + } else { // else if current transaction, just grab most recent + if ($storeCopy){ + $idclause = " and transID = ".$CORE_LOCAL->get("paycard_id"); + } + $sort = " desc "; + $db = Database::tDataConnect(); + } + // query database for cc receipt info + $query = "select tranType, amount, PAN, entryMethod, issuer, xResultMessage, xApprovalNumber, xTransactionID, name, " + ." datetime from ccReceiptView where date=".date('Ymd',$dateTimeStamp) + ." and cashierNo = ".$emp." and laneNo = ".$reg + ." and transNo = ".$trans ." ".$idclause + ." order by datetime, cashierNo, laneNo, transNo, xTransactionID, transID ".$sort.", sortorder ".$sort; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + for ($i=0;$i<$num_rows;$i++) { + $row = $db->fetch_array($result); + $trantype = $row['tranType']; + if ($row['amount'] < 0) { + $amt = "-$".number_format(-1*$row['amount'],2); + } else { + $amt = "$".number_format($row['amount'],2); + } + $pan = $row['PAN']; // already masked in the database + $entryMethod = $row['entryMethod']; + $cardBrand = $row['issuer']; + $approvalPhrase = $row['xResultMessage']; + $authCode = "#".$row['xApprovalNumber']; + $sequenceNum = $row['xTransactionID']; + $name = $row["name"]; + + // store copy is 22 lines long + if (!$storeCopy){ + //$slip .= "CC".self::centerString("C U S T O M E R C O P Y")."\n"; // "wedge copy" + } + else { + $slip .= "CC".substr(self::centerString($CORE_LOCAL->get("chargeSlip2")),2)."\n"; // "wedge copy" + } + $slip .= self::centerString("................................................")."\n"; + if ($storeCopy){ + $slip .= self::centerString($CORE_LOCAL->get("chargeSlip1"))."\n" // store name + .self::centerString($CORE_LOCAL->get("chargeSlip3").", ".$CORE_LOCAL->get("chargeSlip4"))."\n" // address + .self::centerString($CORE_LOCAL->get("chargeSlip5"))."\n" // merchant code + .self::centerString($CORE_LOCAL->get("receiptHeader2"))."\n\n"; // phone + } + + if ($storeCopy){ + $slip .= $trantype."\n" // trans type: purchase, canceled purchase, refund or canceled refund + ."Card: ".$cardBrand." ".$pan."\n" + ."Reference: ".$ref."\n" + ."Date & Time: ".$date."\n" + ."Entry Method: ".$entryMethod."\n" // swiped or manual entry + ."Sequence Number: ".$sequenceNum."\n" // their sequence # + //."Authorization: ".$approvalPhrase." ".$authCode."\n" // result + auth number + ."Authorization: ".$approvalPhrase."\n" // result + auth number + .self::boldFont() // change to bold font for the total + ."Amount: ".$amt."\n" + .self::normalFont(); + } + else { + // use columns instead + $c1 = array(); + $c2 = array(); + $c1[] = $trantype; + $c1[] = "Entry Method: ".$entryMethod; + $c1[] = "Sequence Number: ".$sequenceNum; + $c2[] = $cardBrand." ".$pan; + $c2[] = "Authorization: ".$approvalPhrase; + $c2[] = self::boldFont()."Amount: ".$amt.self::normalFont(); + $slip .= self::twoColumns($c1,$c2); + } + if ($storeCopy){ + $slip .= self::centerString("I agree to pay above total amount")."\n" + .self::centerString("according to card issuer agreement.")."\n\n" + + .self::centerString("X____________________________________________")."\n" + .self::centerString($name)."\n"; + } + $slip .= self::centerString(".................................................")."\n" + ."\n"; + // if more than one sig slip, cut after each one (except the last) + if ($num_rows > 1 && $i < $num_rows-1 && $storeCopy) { + $slip .= "\n\n\n\n".chr(27).chr(105); + } + } + + if ($CORE_LOCAL->get("SigCapture") != "" && $CORE_LOCAL->get("SigSlipType") == "ccSlip"){ + $sig_file = $_SESSION["INCLUDE_PATH"]."/graphics/SigImages/" + .$CORE_LOCAL->get("CapturedSigFile"); + + $bmp = new Bitmap(); + $bmp->Load($sig_file); + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $printer = new ESCPOSPrintHandler(); + $stripes = $printer->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $printer->InlineBitmap($stripes[$i], $bmpWidth); + + $slip .= $printer->AlignCenter(); + if (count($stripes) > 1) + $slip .= $printer->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $printer->ResetLineSpacing()."\n"; + $slip .= $printer->AlignLeft(); + } + + return $slip; +} + +static public function normalFont() { + return chr(27).chr(33).chr(5); +} +static public function boldFont() { + return chr(27).chr(33).chr(9); +} + +static public function localTTL(){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("localTotal") == 0) return ""; + + $str = sprintf("LOCAL PURCHASES = \$%.2f", + $CORE_LOCAL->get("localTotal")); + return $str."\n"; +} + +static public function graphedLocalTTL(){ + global $CORE_LOCAL; + $db = Database::tDataConnect(); + + $lookup = "SELECT + SUM(CASE WHEN p.local=1 THEN l.total ELSE 0 END) as localTTL, + SUM(CASE WHEN l.trans_type IN ('I','D') then l.total ELSE 0 END) as itemTTL + FROM localtemptrans AS l LEFT JOIN ". + $CORE_LOCAL->get('pDatabase').$db->sep()."products AS p + ON l.upc=p.upc + WHERE l.trans_type IN ('I','D')"; + $lookup = $db->query($lookup); + if ($db->num_rows($lookup) == 0) + return ''; + $row = $db->fetch_row($lookup); + if ($row['localTTL'] == 0) + return ''; + + $percent = ((float)$row['localTTL']) / ((float)$row['itemTTL']); + $str = sprintf('LOCAL PURCHASES = $%.2f (%.2f%%)', + $row['localTTL'], 100*$percent); + $str .= "\n"; + + $str .= self::$PRINT_OBJ->RenderBitmap(Bitmap::BarGraph($percent), 'L'); + return $str."\n"; +} + +static public function receiptFromBuilders($reprint=False,$trans_num=''){ + global $CORE_LOCAL; + + $empNo=0;$laneNo=0;$transNo=0; + if ($reprint){ + $temp = explode("-",$trans_num); + $empNo= $temp[0]; + $laneNo = $temp[1]; + $transNo = $temp[2]; + } + + $FETCH_MOD = $CORE_LOCAL->get("RBFetchData"); + if($FETCH_MOD=="") $FETCH_MOD = "DefaultReceiptDataFetch"; + $mod = new $FETCH_MOD(); + $data = array(); + if ($reprint) + $data = $mod->fetch($empNo,$laneNo,$transNo); + else + $data = $mod->fetch(); + + // load module configuration + $FILTER_MOD = $CORE_LOCAL->get("RBFilter"); + if($FILTER_MOD=="") $FILTER_MOD = "DefaultReceiptFilter"; + $SORT_MOD = $CORE_LOCAL->get("RBSort"); + if($SORT_MOD=="") $SORT_MOD = "DefaultReceiptSort"; + $TAG_MOD = $CORE_LOCAL->get("RBTag"); + if($TAG_MOD=="") $TAG_MOD = "DefaultReceiptTag"; + + $f = new $FILTER_MOD(); + $recordset = $f->filter($data); + + $s = new $SORT_MOD(); + $recordset = $s->sort($recordset); + + $t = new $TAG_MOD(); + $recordset = $t->tag($recordset); + + $ret = ""; + foreach($recordset as $record){ + $class_name = $record['tag'].'ReceiptFormat'; + if (!class_exists($class_name)) continue; + $obj = new $class_name(); + + $line = $obj->format($record); + + if($obj->is_bold){ + $ret .= self::$PRINT_OBJ->TextStyle(True,True); + $ret .= $line; + $ret .= self::$PRINT_OBJ->TextStyle(True,False); + $ret .= "\n"; + } + else { + $ret .= $line; + $ret .= "\n"; + } + } + + return $ret; +} + +static public function receiptDetail($reprint=False,$trans_num='') { // put into its own function to make it easier to follow, and slightly modified for wider-spread use of joe's "new" receipt format --- apbw 7/3/2007 + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("newReceipt") == 2) + return self::receiptFromBuilders($reprint,$trans_num); + + $detail = ""; + $empNo=0;$laneNo=0;$transNo=0; + if ($reprint){ + $temp = explode("-",$trans_num); + $empNo= $temp[0]; + $laneNo = $temp[1]; + $transNo = $temp[2]; + } + + if ($CORE_LOCAL->get("newReceipt") == 0 ) { + // if old style has been specifically requested + // for a partial or reprint, use old format + $query="select linetoprint from receipt"; + if ($reprint){ + $query = "select linetoprint from rp_receipt + where emp_no=$empNo and register_no=$laneNo + and trans_no=$transNo order by trans_id"; + } + $db = Database::tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + // loop through the results to generate the items listing. + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + $detail .= $row[0]."\n"; + } + } + else { + $db = Database::tDataConnect(); + + // otherwise use new format + $query = "select linetoprint,sequence,dept_name,ordered, 0 as ". + $db->identifier_escape('local') + ." from receipt_reorder_unions_g order by ordered,dept_name, " + ." case when ordered=4 then '' else upc end, " + .$db->identifier_escape('sequence'); + if ($reprint){ + $query = "select linetoprint,sequence,dept_name,ordered, 0 as ". + $db->identifier_escape('local') + ." from rp_receipt_reorder_unions_g where emp_no=$empNo and " + ." register_no=$laneNo and trans_no=$transNo " + ." order by ordered,dept_name, " + ." case when ordered=4 then '' else upc end, " + .$db->identifier_escape('sequence'); + } + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + // loop through the results to generate the items listing. + $lastDept=""; + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + if ($row[2]!=$lastDept){ // department header + + if ($row['2']==''){ + $detail .= "\n"; + } + else{ + $detail .= self::$PRINT_OBJ->TextStyle(True,True); + $detail .= $row[2]; + $detail .= self::$PRINT_OBJ->TextStyle(True,False); + $detail .= "\n"; + } + } + /***** jqh 12/14/05 fix tax exempt on receipt *****/ + if ($row[1]==2 and $CORE_LOCAL->get("TaxExempt")==1){ + $detail .= " TAX 0.00\n"; + } + elseif ($row[1]==1 and $CORE_LOCAL->get("TaxExempt")==1){ + $queryExempt="select + right((space(44) + upper(rtrim('SUBTOTAL'))), 44) + + right((space(8) + convert(varchar,runningTotal-tenderTotal)), 8) + + right((space(4) + ''), 4) as linetoprint,1 as sequence,null as dept_name,3 as ordered,'' as upc + from lttSummary"; + $resultExempt = $db->query($queryExempt); + $rowExempt = $db->fetch_array($resultExempt); + $detail .= $rowExempt[0]."\n"; + } + else{ + if ($CORE_LOCAL->get("promoMsg") == 1 && $row[4] == 1 ){ + // '*' added to local items 8/15/2007 apbw for eat local challenge + $detail .= '*'.$row[0]."\n"; + } else { + if ( strpos($row[0]," TOTAL") ) { + // if it's the grand total line . . . + $detail .= self::$PRINT_OBJ->TextStyle(True,True); + $detail .= $row[0]."\n"; + $detail .= self::$PRINT_OBJ->TextStyle(True,False); + } else { + $detail .= $row[0]."\n"; + } + } + } + /***** jqh end change *****/ + + $lastDept=$row[2]; + } // end for loop + } + + return $detail; +} + +/* + * gift card receipt functions --atf 10/8/07 + */ +static public function printGCSlip($dateTimeStamp, $ref, $storeCopy=true, $rp=0) { + global $CORE_LOCAL; + + $date = self::build_time($dateTimeStamp); + $ert = explode("-",$ref); + $emp = $ert[0]; + $reg = $ert[1]; + $trans = $ert[2]; + $slip = ""; + + // query database for gc receipt info + $db = Database::tDataConnect(); + $order = ""; + $where = $db->identifier_escape('date')."=".date('Ymd',$dateTimeStamp) + ." AND cashierNo=".$emp." AND laneNo=".$reg." AND transNo=".$trans; + if( $rp == 0) { + $order = " desc"; + $where .= " AND transID=".$CORE_LOCAL->get("paycard_id"); + } + $sql = "SELECT * FROM gcReceiptView WHERE ".$where." ORDER BY " + .$db->identifier_escape('datetime').$order.", sortorder".$order; + $result = $db->query($sql); + $num = $db->num_rows($result); + + // print a receipt for each row returned + for( $x = 0; $row = $db->fetch_array($result); $x++) { + // special stuff for the store copy only + if( $storeCopy) { + // cut before each slip after the first + if( $x > 0) + $slip .= "\n\n\n\n".chr(27).chr(105); + // reprint header + if( $rp != 0) + $slip .= chr(27).chr(33).chr(5).self::centerString("*** R E P R I N T ***")."\n"; + // store header + $slip .= "GC".substr(self::centerString($CORE_LOCAL->get("chargeSlip2")),2)."\n" // "wedge copy" + . self::centerString("................................................")."\n" + . self::centerString($CORE_LOCAL->get("chargeSlip1"))."\n" // store name + . self::centerString($CORE_LOCAL->get("chargeSlip3").", ".$CORE_LOCAL->get("chargeSlip4"))."\n" // address + . self::centerString($CORE_LOCAL->get("receiptHeader2"))."\n" // phone + . "\n"; + } else { + if( $x == 0) { + if( $num > 1) $slip .= self::centerString("------- C A R D H O L D E R C O P I E S -------")."\n"; + else $slip .= self::centerString("--------- C A R D H O L D E R C O P Y ---------")."\n"; + //$slip .= self::centerString("................................................")."\n"; + } + } + // transaction data + if( true) { // two-column layout + $col1 = array(); + $col2 = array(); + $col1[] = $row['tranType']; + $col2[] = "Date: ".date('m/d/y h:i a', strtotime($row['datetime'])); + $col1[] = "Terminal ID: ".$row['terminalID']; + $col2[] = "Reference: ".$ref."-".$row['transID']; + $col1[] = "Card: ".$row['PAN']; + $col2[] = "Entry Method: ".$row['entryMethod']; + if( ((int)$row['xVoidCode']) > 0) { + $col1[] = "Void Auth: ".$row['xVoidCode']; + $col2[] = "Orig Auth: ".$row['xAuthorizationCode']; + } else { + $col1[] = "Authorization: ".$row['xAuthorizationCode']; + $col2[] = ""; + } + $col1[] = self::boldFont()."Amount: ".PaycardLib::paycard_moneyFormat($row['amount']).self::normalFont(); // bold ttls apbw 11/3/07 + $col2[] = "New Balance: ".PaycardLib::paycard_moneyFormat($row['xBalance']); + $slip .= self::twoColumns($col1, $col2); + } else { // all-left layout + $slip .= $row['tranType']."\n" + . "Card: ".$row['PAN']."\n" + . "Date: ".date('m/d/y h:i a', strtotime($row['datetime']))."\n" + . "Terminal ID: ".$row['terminalID']."\n" + . "Reference: ".$ref."-".$row['transID']."\n" + . "Entry Method: ".$row['entryMethod']."\n"; + if( ((int)$row['xVoidCode']) > 0) { + $slip .= "Original Authorization: ".$row['xAuthorizationCode']."\n" + . "Void Authorization: ".$row['xVoidCode']."\n"; + } else { + $slip .= "Authorization: ".$row['xAuthorizationCode']."\n"; + } + $slip .= self::boldFont()."Amount: ".PaycardLib::paycard_moneyFormat($row['amount']).self::normalFont()."\n" // bold ttls apbw 11/3/07 + . "New Balance: ".PaycardLib::paycard_moneyFormat($row['xBalance'])."\n"; + } + // name/phone on activation only + if( $row['tranType'] == 'Gift Card Activation' && $storeCopy) { + $slip .= "\n".self::centerString("Name: ___________________________________")."\n" + ."\n".self::centerString("Phone: ___________________________________")."\n"; + } + $slip .= self::centerString(".................................................")."\n"; + // reprint footer + if( $storeCopy && $rp != 0) + $slip .= chr(27).chr(33).chr(5).self::centerString("*** R E P R I N T ***")."\n"; + + if ($rp == 0) break; // easier that row-limiting the query + } // foreach row + + // add normal font ONLY IF we printed something else, too + if( strlen($slip) > 0) + $slip = self::normalFont() . $slip; + + return $slip; +} // printGCSlip() + +static public function printGCBalSlip() { + global $CORE_LOCAL; + + // balance inquiries are not logged and have no meaning in a reprint, + // so we can assume that it just happened now and all data is still in session vars + $tempArr = $CORE_LOCAL->get("paycard_response"); + $bal = "$".number_format($tempArr["Balance"],2); + $pan = $CORE_LOCAL->get("paycard_PAN"); // no need to mask gift card numbers + $slip = self::normalFont() + .self::centerString(".................................................")."\n" + .self::centerString($CORE_LOCAL->get("chargeSlip1"))."\n" // store name + .self::centerString($CORE_LOCAL->get("chargeSlip3").", ".$CORE_LOCAL->get("chargeSlip4"))."\n" // address + .self::centerString($CORE_LOCAL->get("receiptHeader2"))."\n" // phone + ."\n" + ."Gift Card Balance\n" + ."Card: ".$pan."\n" + ."Date: ".date('m/d/y h:i a')."\n" + .self::boldFont() // change to bold font for the total + ."Balance: ".$bal."\n" + .self::normalFont() + .self::centerString(".................................................")."\n" + ."\n"; + return $slip; +} // printGCBalSlip() + +static public function twoColumns($col1, $col2) { + // init + $max = 56; + $text = ""; + // find longest string in each column, ignoring font change strings + $c1max = 0; + $col1s = array(); + foreach( $col1 as $c1) { + $c1s = trim(str_replace(array(self::boldFont(),self::normalFont()), "", $c1)); + $col1s[] = $c1s; + $c1max = max($c1max, strlen($c1s)); + } + $c2max = 0; + $col2s = array(); + foreach( $col2 as $c2) { + $c2s = trim(str_replace(array(self::boldFont(),self::normalFont()), "", $c2)); + $col2s[] = $c2s; + $c2max = max($c2max, strlen($c2s)); + } + // space the columns as much as they'll fit + $spacer = $max - $c1max - $c2max; + // scan both columns + for( $x=0; isset($col1[$x]) && isset($col2[$x]); $x++) { + $c1 = trim($col1[$x]); $c1l = strlen($col1s[$x]); + $c2 = trim($col2[$x]); $c2l = strlen($col2s[$x]); + if( ($c1max+$spacer+$c2l) <= $max) { + $text .= $c1 . @str_repeat(" ", ($c1max+$spacer)-$c1l) . $c2 . "\n"; + } else { + $text .= $c1 . "\n" . str_repeat(" ", $c1max+$spacer) . $c2 . "\n"; + } + } + // if one column is longer than the other, print the extras + // (only one of these should happen since the loop above runs as long as both columns still have rows) + for( $y=$x; isset($col1[$y]); $y++) { + $text .= trim($col1[$y]) . "\n"; + } // col1 extras + for( $y=$x; isset($col2[$y]); $y++) { + $text .= str_repeat(" ", $c1max+$spacer) . trim($col2[$y]) . "\n"; + } // col2 extras + return $text; +} + +/** + generates a receipt string + @param $arg1 string receipt type + or reprint receipt reference + <emp_no>-<register_no>-<trans_no> + @param $second boolean indicating it's a second receipt + @param $email generate email-style receipt + @return string receipt content +*/ +static public function printReceipt($arg1,$second=False,$email=False) { + global $CORE_LOCAL; + + if($second) $email = False; // store copy always prints + if($arg1 != "full") $email = False; + + $dateTimeStamp = time(); + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + + $reprint = False; + $rp_where = ''; + /** + Arg is requesting a reprint receipt + Reprints always run as type "full" + and always print to paper + + This block deprecates ReceiptLib::reprintReceipt() + */ + if (preg_match('/^\d+-\d+-\d+$/',$arg1) === 1 || preg_match('/^\d+::\d+::\d+$/',$arg1) === 1){ + $emp=$reg=$trans=0; + if (strstr($arg1,'-') !== False) + list($emp, $reg, $trans) = explode('-',$arg1); + else if (strstr($arg1,'::') !== False) + list($reg, $emp, $trans) = explode('::',$arg1); + $arg1 = 'full'; + $email = False; + $second = False; + $reprint = True; + $rp_where = 'emp_no='.((int)$emp). ' AND + register_no='.((int)$reg).' AND + trans_no='.((int)$trans); + $ref = sprintf('%d-%d-%d',$emp,$reg,$trans); + + // lookup trans information + $queryHeader = "select * from rp_receipt_header where ".$rp_where; + $db = Database::tDataConnect(); + $header = $db->query($queryHeader); + $row = $db->fetch_row($header); + $dateTimeStamp = $row["dateTimeStamp"]; + $dateTimeStamp = strtotime($dateTimeStamp); + + // set session variables from trans information + $CORE_LOCAL->set("memberID",$row["memberID"]); + $CORE_LOCAL->set("memCouponTLL",$row["couponTotal"]); + $CORE_LOCAL->set("transDiscount",$row["transDiscount"]); + $CORE_LOCAL->set("chargeTotal",-1*$row["chargeTotal"]); + $CORE_LOCAL->set("discounttotal",$row["discountTTL"]); + $CORE_LOCAL->set("memSpecial",$row["memSpecial"]); + + // lookup member info + $db = Database::pDataConnect(); + $queryID = "select LastName,FirstName,Type,blueLine from custdata + where CardNo = '".$CORE_LOCAL->get("memberID")."' and personNum=1"; + $result = $db->query($queryID); + $row = $db->fetch_array($result); + + // set session variables from member info + $CORE_LOCAL->set("lname",$row["LastName"]); + $CORE_LOCAL->set("fname",$row["FirstName"]); + $CORE_LOCAL->set('isMember', ($row['Type']=='PC' ? 1 : 0)); + $CORE_LOCAL->set("memMsg",$row["blueLine"]); + if ($CORE_LOCAL->get("isMember") == 1) { + $CORE_LOCAL->set("yousaved",number_format( $CORE_LOCAL->get("transDiscount") + + $CORE_LOCAL->get("discounttotal") + $CORE_LOCAL->get("memSpecial"), 2)); + $CORE_LOCAL->set("couldhavesaved",0); + $CORE_LOCAL->set("specials",number_format($CORE_LOCAL->get("discounttotal") + + $CORE_LOCAL->get("memSpecial"), 2)); + } + else { + $CORE_LOCAL->set("yousaved",$CORE_LOCAL->get("discounttotal")); + $CORE_LOCAL->set("couldhavesaved",number_format($CORE_LOCAL->get("memSpecial"), 2)); + $CORE_LOCAL->set("specials",$CORE_LOCAL->get("discounttotal")); + } + } + + self::$PRINT_OBJ = new ESCPOSPrintHandler(); + $receipt = ""; + + $noreceipt = ($CORE_LOCAL->get("receiptToggle")==1 ? 0 : 1); + $ignoreNR = array("ccSlip"); + + if ($noreceipt != 1 || in_array($arg1,$ignoreNR) || $email){ + $receipt = self::printReceiptHeader($dateTimeStamp, $ref); + + if ($second){ + $ins = self::$PRINT_OBJ->centerString("( S T O R E C O P Y )")."\n"; + $receipt = substr($receipt,0,3).$ins.substr($receipt,3); + } + else if ($reprint !== False){ + $ins = self::$PRINT_OBJ->centerString("*** R E P R I N T ***")."\n"; + $receipt = substr($receipt,0,3).$ins.substr($receipt,3); + } + + if ($arg1 == "full") { + $receipt = array('any'=>'','print'=>''); + if ($email) self::$PRINT_OBJ = new EmailPrintHandler(); + $receipt['any'] = self::printReceiptHeader($dateTimeStamp, $ref); + + if ($reprint !== False) + $receipt['any'] .= self::receiptDetail(True, $ref); + else + $receipt['any'] .= self::receiptDetail(); + $member = trim($CORE_LOCAL->get("memberID")); + $your_discount = $CORE_LOCAL->get("transDiscount"); + + if ($CORE_LOCAL->get("transDiscount") + + $CORE_LOCAL->get("specials") > 0 ) { + $receipt['any'] .= 'TODAY YOU SAVED = $'. + number_format($your_discount + $CORE_LOCAL->get("specials"),2). + "\n"; + } + $receipt['any'] .= self::localTTL(); + //$receipt['any'] .= self::graphedLocalTTL(); + $receipt['any'] .= "\n"; + + if (trim($CORE_LOCAL->get("memberID")) != $CORE_LOCAL->get("defaultNonMem")) { + if ($CORE_LOCAL->get("newReceipt")>=1){ + $receipt['any'] .= self::$PRINT_OBJ->TextStyle(True,False,True); + $receipt['any'] .= self::$PRINT_OBJ->centerString("thank you - owner ".$member,True); + $receipt['any'] .= self::$PRINT_OBJ->TextStyle(True); + $receipt['any'] .= "\n\n"; + } + else{ + $receipt['any'] .= self::$PRINT_OBJ->centerString("Thank You - member ".$member); + $receipt['any'] .= "\n"; + } + } + else { + if ($CORE_LOCAL->get("newReceipt")>=1){ + $receipt['any'] .= self::$PRINT_OBJ->TextStyle(True,False,True); + $receipt['any'] .= self::$PRINT_OBJ->centerString("thank you",True); + $receipt['any'] .= self::$PRINT_OBJ->TextStyle(True); + $receipt['any'] .= "\n\n"; + } + else{ + $receipt['any'] .= self::$PRINT_OBJ->centerString("Thank You!"); + $receipt['any'] .= "\n"; + } + } + + for ($i = 1; $i <= $CORE_LOCAL->get("receiptFooterCount"); $i++){ + $receipt['any'] .= self::$PRINT_OBJ->centerString($CORE_LOCAL->get("receiptFooter$i")); + $receipt['any'] .= "\n"; + } + + if ($CORE_LOCAL->get("store")=="wfc"){ + $refund_date = date("m/d/Y",mktime(0,0,0,date("n"),date("j")+30,date("Y"))); + $receipt['any'] .= self::$PRINT_OBJ->centerString("returns accepted with this receipt through ".$refund_date); + $receipt['any'] .= "\n"; + } + + /***** CvR add charge total to receipt bottom ****/ + $receipt['any'] = self::chargeBalance($receipt['any']); + /**** CvR end ****/ + + // preemptive-check: avoid extra function calls if there aren't + // applicable records + $db = Database::tDataConnect(); + $q = "SELECT + SUM(CASE WHEN trans_subtype IN ('CC','AX','DC') THEN 1 ELSE 0 END) as CC, + SUM(CASE WHEN trans_subtype='GD' OR department=902 THEN 1 ELSE 0 END) as GD, + SUM(CASE WHEN trans_subtype='SC' THEN 1 ELSE 0 END) as SC, + SUM(CASE WHEN department=991 THEN 1 ELSE 0 END) as equity + FROM localtemptrans"; + if ($reprint !== False){ + $q = str_replace('localtemptrans','localtranstoday',$q); + $q .= ' WHERE '.$rp_where; + } + $r = $db->query($q); + $chk = array('CC'=>0,'GD'=>0,'SC'=>0,'equity'=>0); + if ($db->num_rows($r) > 0) $chk = $db->fetch_row($r); + + // append customer copy to actual lane receipt + if ($chk['CC'] > 0 && $CORE_LOCAL->get('standalone') == 0){ + $receipt['any'] .= self::printCCSigSlip($dateTimeStamp, $ref, + false, ($reprint===False ? 0 : 1)); + } + + if ($chk['GD'] > 0){ + if ($CORE_LOCAL->get("autoReprint") == 1) + $receipt['any'] .= self::printGCSlip($dateTimeStamp, $ref, false, 1); + else + $receipt['any'] .= self::printGCSlip($dateTimeStamp, $ref, true, 1); + } + + if ($CORE_LOCAL->get("promoMsg") == 1) { + self::promoMsg(); + } + + $CORE_LOCAL->set("equityNoticeAmt",0); + if ($chk['equity'] > 0) + $receipt['any'] .= self::equityNotification( ($reprint===False) ? '' : $ref ); + if ($CORE_LOCAL->get('memberID') != $CORE_LOCAL->get('defaultNonMem')) + $receipt['any'] .= self::memReceiptMessages($CORE_LOCAL->get("memberID")); + $CORE_LOCAL->set("equityNoticeAmt",0); + + // switch back to print output handler + self::$PRINT_OBJ = new ESCPOSPrintHandler(); + if ($chk['SC'] > 0){ + $receipt['print'] .= self::storeCreditIssued($second, + ($reprint===False ? '' : $ref) ); + } + + // knit pieces back together if not emailing + if (!$email) $receipt = ''.$receipt['any'].$receipt['print']; + + $CORE_LOCAL->set("headerprinted",0); + } + else if ($arg1 == "cab"){ + $ref = $CORE_LOCAL->get("cabReference"); + $receipt = self::printCabCoupon($dateTimeStamp, $ref); + $CORE_LOCAL->set("cabReference",""); + } + elseif ($arg1 == "ccSlip") { + $receipt = self::printCCSigSlip($dateTimeStamp,$ref,True); + } + else if ($arg1 == "gcSlip") { + if ($CORE_LOCAL->get("autoReprint") == 1){ + $receipt = self::printGCSlip($dateTimeStamp,$ref,true); + } + else { + $receipt = self::printGCSlip($dateTimeStamp,$ref,false); + } + } + else if ($arg1 == "gcBalSlip") { + $receipt = self::printGCBalSlip(); + } + else { + /***** jqh 09/29/05 if receipt isn't full, then display receipt in old style *****/ + $query="select linetoprint from receipt"; + $db = Database::tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + // loop through the results to generate the items listing. + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + $receipt .= $row[0]."\n"; + } + /***** jqh end change *****/ + + $dashes = "\n".self::centerString("----------------------------------------------")."\n"; + + if ($arg1 == "partial") { + $receipt .= $dashes.self::centerString("* P A R T I A L T R A N S A C T I O N *").$dashes; + } + elseif ($arg1 == "cancelled") { + $receipt .= $dashes.self::centerString("* T R A N S A C T I O N C A N C E L L E D *").$dashes; + } + elseif ($arg1 == "resume") { + $receipt .= $dashes.self::centerString("* T R A N S A C T I O N R E S U M E D *").$dashes + .self::centerString("A complete receipt will be printed\n") + .self::centerString("at the end of the transaction"); + } + elseif ($arg1 == "suspended") { + $receipt .= $dashes.self::centerString("* T R A N S A C T I O N S U S P E N D E D *").$dashes + .self::centerString($ref); + } + + } /***** jqh end big if statement change *****/ + } + + /* -------------------------------------------------------------- + print store copy of charge slip regardless of receipt print setting - apbw 2/14/05 + ---------------------------------------------------------------- */ + if ($CORE_LOCAL->get("chargeTotal") != 0 && ($CORE_LOCAL->get("End") == 1 || $reprint)) { + if (is_array($receipt)) + $receipt['print'] .= self::printChargeFooterStore($dateTimeStamp, $ref); + else + $receipt .= self::printChargeFooterStore($dateTimeStamp, $ref); + } + + if (is_array($receipt)){ + if ($receipt['print'] !== ''){ + $receipt['print'] = $receipt['print']."\n\n\n\n\n\n\n"; + $receipt['print'] .= chr(27).chr(105); + } + } + elseif ($receipt !== ""){ + $receipt = $receipt."\n\n\n\n\n\n\n"; + $receipt .= chr(27).chr(105); + } + + if (!in_array($arg1,$ignoreNR)) + $CORE_LOCAL->set("receiptToggle",1); + if ($reprint){ + $CORE_LOCAL->set("memMsg",""); + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("percentDiscount",0); + $CORE_LOCAL->set('isMember', 0); + } + return $receipt; +} + +static public function reprintReceipt($trans_num=""){ + global $CORE_LOCAL; + + self::$PRINT_OBJ = new ESCPOSPrintHandler(); + + if (strlen($trans_num) >= 1) { + $title = chr(27).chr(33).chr(5).self::centerString("*** R E P R I N T ***")."\n\n\n"; + + $arpspec = explode("::", $trans_num); + $laneno = $arpspec[0]; + $cashierNo = $arpspec[1]; + $transno = $arpspec[2]; + + $ref = trim($cashierNo)."-".trim($laneno)."-".trim($transno); + + $queryHeader = "select * from rp_receipt_header where register_no = ".$laneno." and emp_no = ".$cashierNo." and trans_no = ".$transno; + + $connect = Database::tDataConnect(); + $header = $connect->query($queryHeader); + $headerRow = $connect->fetch_array($header); + + $dateTimeStamp = $headerRow["dateTimeStamp"]; + $dateTimeStamp = strtotime($dateTimeStamp); + + $CORE_LOCAL->set("memberID",$headerRow["memberID"]); + $CORE_LOCAL->set("memCouponTLL",$headerRow["couponTotal"]); + $CORE_LOCAL->set("transDiscount",$headerRow["transDiscount"]); + $CORE_LOCAL->set("chargeTotal",-1*$headerRow["chargeTotal"]); + + $CORE_LOCAL->set("discounttotal",$headerRow["discountTTL"]); + $CORE_LOCAL->set("memSpecial",$headerRow["memSpecial"]); + + $connID = Database::pDataConnect(); + $queryID = "select LastName,FirstName,Type,blueLine from custdata + where CardNo = '".$CORE_LOCAL->get("memberID")."' and personNum=1"; + $result = $connID->query($queryID); + $row = $connID->fetch_array($result); + + // restore names for charge slips + $CORE_LOCAL->set("lname",$row["LastName"]); + $CORE_LOCAL->set("fname",$row["FirstName"]); + + if ($row["Type"] == "PC") { + $CORE_LOCAL->set("isMember",1); + } + else { + $CORE_LOCAL->set("isMember",0); + } + $CORE_LOCAL->set("memMsg",$row["blueLine"]); + + if ($CORE_LOCAL->get("isMember") == 1) { + $CORE_LOCAL->set("yousaved",number_format( $CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("discounttotal") + $CORE_LOCAL->get("memSpecial"), 2)); + $CORE_LOCAL->set("couldhavesaved",0); + $CORE_LOCAL->set("specials",number_format($CORE_LOCAL->get("discounttotal") + $CORE_LOCAL->get("memSpecial"), 2)); + } + else { + $dblyousaved = number_format($CORE_LOCAL->get("memSpecial"), 2); + $CORE_LOCAL->set("yousaved",$CORE_LOCAL->get("discounttotal")); + $CORE_LOCAL->set("couldhavesaved",number_format($CORE_LOCAL->get("memSpecial"), 2)); + $CORE_LOCAL->set("specials",$CORE_LOCAL->get("discounttotal")); + } + + + // call to transLog, the body of the receipt comes from the view 'receipt' + $receipt = $title.self::printReceiptHeader($dateTimeStamp, $ref); + + $receipt .= self::receiptDetail(True,$ref); + + // The Nitty Gritty: + $member = "Member ".trim($CORE_LOCAL->get("memberID")); + // if ($member == 0) $member = $CORE_LOCAL->get("defaultNonMem"); + $your_discount = $CORE_LOCAL->get("transDiscount"); + + if ($CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("specials") > 0) { + $receipt .= "\n".self::centerString("------------------ YOUR SAVINGS -------------------")."\n"; + + if ($your_discount > 0) { + $receipt .= " DISCOUNTS: $".number_format($your_discount, 2)."\n"; + } + + if ($CORE_LOCAL->get("specials") > 0) { + $receipt .= " SPECIALS: $".number_format($CORE_LOCAL->get("specials"), 2)."\n"; + } + + $receipt .= self::centerString("---------------------------------------------------")."\n"; + } + $receipt .= "\n"; + + if (trim($CORE_LOCAL->get("memberID")) != $CORE_LOCAL->get("defaultNonMem")) { + $receipt .= self::centerString("Thank You - ".$member)."\n"; + } + else { + $receipt .= self::centerString("Thank You!")."\n"; + } + + if ($CORE_LOCAL->get("yousaved") > 0) { + $receipt .= self::centerString("You Saved $".number_format($CORE_LOCAL->get("yousaved"), 2))."\n"; + } + + if ($CORE_LOCAL->get("couldhavesaved") > 0 && $CORE_LOCAL->get("yousaved") > 0) { + $receipt .= self::centerString("You could have saved an additional $" + .number_format($CORE_LOCAL->get("couldhavesaved"), 2))."\n"; + } + elseif ($CORE_LOCAL->get("couldhavesaved") > 0) { + $receipt .= self::centerString("You could have saved $" + .number_format($CORE_LOCAL->get("couldhavesaved"), 2))."\n"; + } + + for ($i = 1; $i <= $CORE_LOCAL->get("receiptFooterCount"); $i++){ + $receipt .= self::$PRINT_OBJ->centerString($CORE_LOCAL->get("receiptFooter$i")); + $receipt .= "\n"; + } + + + if ($CORE_LOCAL->get("chargeTotal") != 0 ) { // apbw 03/10/05 Reprint patch + $receipt = $receipt.self::printChargeFooterStore($dateTimeStamp, $ref); // apbw 03/10/05 Reprint patch + } // apbw 03/10/05 Reprint patch + + $receipt .= self::printGCSlip($dateTimeStamp, $ref, true, 1); + $receipt .= self::printCCSigSlip($dateTimeStamp, $ref, False, 1); + + $receipt = $receipt."\n\n\n\n\n\n\n"; // apbw 03/10/05 Reprint patch + self::writeLine($receipt.chr(27).chr(105)); // apbw 03/10/05 Reprint patch + $receipt = ""; // apbw 03/10/05 Reprint patch + + $CORE_LOCAL->set("memMsg",""); + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("percentDiscount",0); + $CORE_LOCAL->set('isMember', 0); + } +} + +static public function memReceiptMessages($card_no){ + $db = Database::pDataConnect(); + $q = "SELECT msg_text,modifier_module FROM custReceiptMessage WHERE card_no=".$card_no; + $r = $db->query($q); + $ret = ""; + while($w = $db->fetch_row($r)){ + if (file_exists(dirname(__FILE__).'/ReceiptBuilding/custMessages/'.$w['modifier_module'].'.php')){ + $class_name = $w['modifier_module']; + if (!class_exists($class_name)){ + include(dirname(__FILE__).'/ReceiptBuilding/custMessages/'.$class_name.'.php'); + } + $obj = new $class_name(); + $ret .= $obj->message($w['msg_text']); + } + else { + $ret .= $w['msg_text']."\n"; + } + } + return $ret; +} + +static public function equityNotification($trans_num=''){ + global $CORE_LOCAL; + $db = Database::tDataConnect(); + $checkQ = "select sum(total) from localtemptrans where department=991 + group by department having sum(total) <> 0"; + if (!empty($trans_num)){ + list($e,$r,$t) = explode('-',$trans_num); + $checkQ = sprintf("SELECT sum(total) FROM localtranstoday WHERE emp_no=%d AND + register_no=%d AND trans_no=%d AND department=991 + group by department having sum(total) <> 0",$e,$r,$t); + } + $checkR = $db->query($checkQ); + if ($db->num_rows($checkR) == 0) + return ""; + $row = $db->fetch_row($checkR); + + $slip = self::centerString("................................................")."\n\n"; + $slip .= self::biggerFont("Class B Equity Purchase")."\n\n"; + $slip .= self::biggerFont(sprintf('Amount: $%.2f',$row[0]))."\n"; + $slip .= "\n"; + $slip .= "Proof of purchase for owner equity\n"; + $slip .= "Please retain receipt for your records\n\n"; + $slip .= self::centerString("................................................")."\n\n"; + + $CORE_LOCAL->set("equityNoticeAmt",$row[0]); + + return $slip; +} + +} + +?> diff --git a/pos/is4c-nf/lib/SQLManager.php b/pos/is4c-nf/lib/SQLManager.php new file mode 100644 index 000000000..8cbf2578f --- /dev/null +++ b/pos/is4c-nf/lib/SQLManager.php @@ -0,0 +1,962 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SQLManager + Custom abstraction layer for SQL + + Please see Fannie. It's the same class + and tons of documentation to reproduce here. +*/ + +/************************************************** +CLASS INTERFACE + +Properties: +rows - contains the number of rows from the last + query +TYPE_MYSQL - type for MySQL (static) +TYPE_MSSQL - type for Microsoft SQL Server (static) + +Methods: +SQLManager(server, type, database, username, password[default: ''], persistent[default: False]) + Constructor. Creates the object and adds an initial connection to use as the + default. Future references to this connection can be made using the $database string. + Type should be one of the static database types, e.g. TYPE_MYSQL + +add_connection(server, type, database, username, password[d: ''], persistent[d: False]) + Same as above, but this is not the default connection. + +select_db(database_name, connection_identifier) + Selects the given database, using the default connection if no identifier is provided. + +query(query_string, connection_identifier) + Issues the query and returns the result, using the default connection is no identifier + is provided. + +fetch_array(result_object, connection_identifer) + Returns the row array, using the default connection if no identifier is provided. + +**************************************************/ + +define('DEBUG_MYSQL_QUERIES',realpath(dirname(__FILE__).'/../log/queries.log')); +define('DEBUG_SMART_INSERTS',realpath(dirname(__FILE__).'/../log/smart_insert_errors.log')); + +$TYPE_MYSQL = 'MYSQL'; +$TYPE_MSSQL = 'MSSQL'; +$TYPE_PGSQL = 'PGSQL'; + +$TYPE_PDOMY = 'PDOMYSQL'; +$TYPE_PDOMS = 'PDOMSSQL'; +$TYPE_PDOPG = 'PDOPGSQL'; + +class SQLManager { + + var $connections; + var $db_types; + var $default_db; + + var $TYPE_MYSQL = 'MYSQL'; + var $TYPE_MSSQL = 'MSSQL'; + var $TYPE_PGSQL = 'PGSQL'; + + var $TYPE_PDOMY = 'PDOMYSQL'; + var $TYPE_PDOMS = 'PDOMSSQL'; + var $TYPE_PDOPG = 'PDOPGSQL'; + + function SQLManager($server,$type,$database,$username,$password='',$persistent=False){ + $this->connections=array(); + $this->db_types=array(); + $this->default_db = $database; + $this->add_connection($server,strtoupper($type), + $database,$username,$password, + $persistent); + } + + function add_connection($server,$type,$database,$username,$password='',$persistent=False){ + if (isset($this->connections[$database])){ + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,False); + } + else { + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,True); + } + $this->db_types[$database] = strtoupper($type); + $gotdb = $this->select_db($database,$database); + if (!$gotdb){ + if ($this->query("CREATE DATABASE $database")){ + $this->select_db($database,$database); + } + else { + unset($this->db_types[$database]); + $this->connections[$database] = False; + } + } + + } + + function connect($server,$type,$username,$password,$persistent=False,$newlink=False){ + switch($type){ + case $this->TYPE_MYSQL: + if ($persistent) + return mysql_pconnect($server,$username,$password,$newlink); + else + return mysql_connect($server,$username,$password,$newlink); + case $this->TYPE_MSSQL: + if ($persistent) + return mssql_pconnect($server,$username,$password); + else + return mssql_connect($server,$username,$password); + case $this->TYPE_PGSQL: + $conStr = "host=".$server." user=".$username." password=".$password; + if ($persistent) + return pg_pconnect($conStr); + else + return pg_connect($conStr); + case $this->TYPE_PDOMY: + $dsn = 'mysql:host='.$server; + return new PDO($dsn, $username, $password); + case $this->TYPE_PDOMS: + $dsn = 'mssql:host='.$server; + return new PDO($dsn, $username, $password); + case $this->TYPE_PDOPG: + $dsn = 'pgsql:host='.$server; + return new PDO($dsn, $username, $password); + } + return -1; + } + + function select_db($db_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return True; + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + return $this->query('use '.$db_name,$which_connection); + } + return -1; + } + + function query($query_text,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $result = mysql_query($query_text,$this->connections[$which_connection]); + if (!$result && DEBUG_MYSQL_QUERIES != "" && is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n\n"); + fclose($fp); + } + else if (!$result) echo $query_text."<hr />"; + return $result; + case $this->TYPE_MSSQL: + $result = mssql_query($query_text,$this->connections[$which_connection]); + if (!$result && DEBUG_MYSQL_QUERIES != "" && is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n\n"); + fclose($fp); + } + return $result; + case $this->TYPE_PGSQL: + return pg_query($this->connections[$which_connection],$query_text); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + $result = $obj->query($query_text); + if (!$result && DEBUG_MYSQL_QUERIES != "" && is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n\n"); + fclose($fp); + } + return $result; + } + return -1; + } + + /** + Prepared statement: non-PDO types just return the query_text + without modification + */ + function prepare_statement($query_text,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + case $this->TYPE_MSSQL: + return $query_text; + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + return $obj->prepare($query_text); + } + return False; + } + + /** + execute statement: exec is emulated for non-PDO types + */ + function exec_statement($stmt,$args=array(),$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + case $this->TYPE_MSSQL: + $query = ""; + $parts = explode('?',$stmt); + foreach($parts as $p){ + $query .= $p; + if (count($args)>0){ + $val = array_shift($args); + $query .= is_numeric($val) ? $val : "'".$this->escape($val,$which_connection)."'"; + } + } + return $this->query($query,$which_connection); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $success = False; + if (is_object($stmt)){ + $success = $stmt->execute($args); + } + return $success ? $stmt : False; + } + return False; + } + + function num_rows($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_rows($result_object); + case $this->TYPE_MSSQL: + return mssql_num_rows($result_object); + case $this->TYPE_PGSQL: + return pg_num_rows($result_object); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + return $result_object->rowCount(); + } + return -1; + } + + function num_fields($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_fields($result_object); + case $this->TYPE_MSSQL: + return mssql_num_fields($result_object); + case $this->TYPE_PGSQL: + return pg_num_fields($result_object); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + return $result_object->columnCount(); + } + return -1; + } + + function fetch_array($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_array($result_object); + case $this->TYPE_MSSQL: + return mssql_fetch_array($result_object); + case $this->TYPE_PGSQL: + return pg_fetch_array($result_object); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + return $result_object->fetch(); + } + return False; + } + + /* compatibility */ + function fetch_row($result_object,$which_connection=''){ + return $this->fetch_array($result_object,$which_connection); + } + + function fetch_field($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_field($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_fetch_field($result_object,$index); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + return $result_object->getColumnMeta($index); + } + return -1; + } + + function field_type($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_field_type($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_field_type($result_object,$index); + case $this->TYPE_PGSQL: + return pg_field_type($result_object,$index); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $info = $result_object->getColumnMeta($index); + if (!isset($info['native_type'])) return 'bit'; + else return strtolower($info['native_type']); + } + return -1; + } + + /** + This is effectively disabled. Singleton behavior + means it isn't really necessary + */ + function close($which_connection='',$force=False){ + if (!$force) return True; + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_close($this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_close($this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return pg_close($this->connections[$which_connection]); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + return True; + } + return -1; + } + + /** + Temporary compatibility solution. Will go away once + db_close() calls are gone in all branches + */ + function db_close($which_connection='',$force=False){ + return $this->close($which_connection,$force); + } + + /** + Start a SQL transaction + Nexted transactions not supported on MSSQL + */ + function start_transaction($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return $this->query("START TRANSACTION",$which_connection); + case $this->TYPE_MSSQL: + return $this->query("BEGIN TRANSACTION tr1",$which_connection); + case $this->TYPE_PGSQL: + return $this->query("START TRANSACTION",$which_connection); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + return $obj->beginTransaction(); + } + return -1; + } + + /** + Commit an SQL transaction + */ + function commit_transaction($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return $this->query("COMMIT",$which_connection); + case $this->TYPE_MSSQL: + return $this->query("COMMIT TRANSACTION tr1",$which_connection); + case $this->TYPE_PGSQL: + return $this->query("COMMIT",$which_connection); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + return $obj->commit(); + } + return -1; + } + + /** + Rollback an SQL transaction + */ + function rollback_transaction($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return $this->query("ROLLBACK",$which_connection); + case $this->TYPE_MSSQL: + return $this->query("ROLLBACK TRANSACTION tr1",$which_connection); + case $this->TYPE_PGSQL: + return $this->query("ROLLBACK",$which_connection); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + return $obj->rollBack(); + } + return -1; + } + + function test($which_connection=''){ + if ($which_connection=='') + $which_connection=$this->default_db; + + if ($this->connections[$which_connection]) return True; + else return False; + } + + /* copy a table from one database to another, not necessarily on + the same server or format + + $source_db is the database name of the source + $select_query is the query that will get the data + $dest_db is the database name of the destination + $insert_query is the beginning of the query that will add the + data to the destination (specify everything up to VALUES) + */ + function transfer($source_db,$select_query,$dest_db,$insert_query){ + $result = $this->query($select_query,$source_db); + if (!$result) return False; + + $num_fields = $this->num_fields($result,$source_db); + + $unquoted = array("money"=>1,"real"=>1,"numeric"=>1, + "float4"=>1,"float8"=>1,"bit"=>1,"decimal"=>1, + "unknown"=>1,'double'=>1); + $strings = array("varchar"=>1,"nvarchar"=>1,"string"=>1, + "char"=>1,'var_string'); + $dates = array("datetime"=>1); + $queries = array(); + + while($row = $this->fetch_array($result,$source_db)){ + $full_query = $insert_query." VALUES ("; + for ($i=0; $i<$num_fields; $i++){ + $type = $this->field_type($result,$i,$source_db); + if ($row[$i] == "" && strstr(strtoupper($type),"INT")) + $row[$i] = 0; + elseif ($row[$i] == "" && isset($unquoted[$type])) + $row[$i] = 0; + if (isset($dates[$type])){ + $clean = $this->cleanDateTime($row[$i]); + $row[$i] = ($clean!="")?$clean:$row[$i]; + } + elseif (isset($strings[$type])) + $row[$i] = str_replace("'","''",$row[$i]); + + if (isset($unquoted[$type])) + $full_query .= $row[$i].","; + else + $full_query .= "'".$row[$i]."',"; + } + $full_query = substr($full_query,0,strlen($full_query)-1).")"; + $queries[] = $full_query; + } + + $ret = True; + + $this->start_transaction($dest_db); + + foreach ($queries as $q){ + if(!$this->query($q,$dest_db)){ + $ret = False; + if (is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,$q."\n\n"); + fclose($fp); + } + } + } + + if ($ret === True) + $this->commit_transaction($dest_db); + else + $this->rollback_transaction($dest_db); + + return $ret; + } + + function cleanDateTime($str){ + $stdFmt = "/(\d\d\d\d)-(\d\d)-(\d\d) (\d+?):(\d\d):(\d\d)/"; + if (preg_match($stdFmt,$str,$group)) + return $str; + + $msqlFmt = "/(\w\w\w) (\d+) (\d\d\d\d) +(\d+?):(\d\d)(\w)M/"; + + $months = array( + "jan"=>"01", + "feb"=>"02", + "mar"=>"03", + "apr"=>"04", + "may"=>"05", + "jun"=>"06", + "jul"=>"07", + "aug"=>"08", + "sep"=>"09", + "oct"=>"10", + "nov"=>"11", + "dec"=>"12" + ); + + $info = array( + "month" => 1, + "day" => 1, + "year" => 1900, + "hour" => 0, + "min" => 0 + ); + + if (preg_match($msqlFmt,$str,$group)){ + $info["month"] = $months[strtolower($group[1])]; + $info["day"] = $group[2]; + $info["year"] = $group[3]; + $info["hour"] = $group[4]; + $info["min"] = $group[5]; + if ($group[6] == "P" && $info["hour"] != "12") + $info["hour"] = ($info["hour"] + 12) % 24; + elseif($group[6] == "A" && $info["hour"] == "12") + $info["hour"] = 0; + } + + $ret = $info["year"]."-"; + $ret .= str_pad($info["month"],2,"0",STR_PAD_LEFT)."-"; + $ret .= str_pad($info["day"],2,"0",STR_PAD_LEFT)." "; + $ret .= str_pad($info["hour"],2,"0",STR_PAD_LEFT).":"; + $ret .= str_pad($info["min"],2,"0",STR_PAD_LEFT); + return $ret; + } + + /* check whether the given table exists + Return values: + True => table exists + False => table doesn't exist + -1 => Operation not supported for this database type + */ + function table_exists($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + $result = $this->query("SHOW TABLES FROM $which_connection + LIKE '$table_name'",$which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + $result = $this->query("SELECT name FROM sysobjects + WHERE name LIKE '$table_name'", + $which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + $result = $this->query("SELECT relname FROM pg_class + WHERE relname LIKE '$tablename'", + $which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + } + return -1; + } + + /* return the table's definition + Return values: + array of values => table found + array format: $return['column_name'] = + array('column_type', is_auto_increment) + False => no such table + -1 => Operation not supported for this database type + */ + function table_definition($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + $return = array(); + $result = $this->query("SHOW COLUMNS FROM $table_name",$which_connection); + while($row = $this->fetch_row($result,$which_connection)){ + $auto = False; + if (strstr($row[5],"auto_increment")) + $auto = True; + $return[$row[0]] = array($row[1],$auto,$row[0]); + } + if (count($return) == 0) return False; + else return $return; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + $return = array(); + $result = $this->query("SELECT c.name,t.name,c.length, + CASE WHEN c.autoval IS NULL + THEN 0 ELSE 1 END AS auto + FROM syscolumns AS c + LEFT JOIN sysobjects AS o + ON c.id=o.id + LEFT JOIN systypes AS t + ON c.xtype=t.xtype + WHERE o.name='$table_name'",$which_connection); + while($row = $this->fetch_row($result,$which_connection)){ + $auto = False; + if ($row[3] == 1) $auto = True; + $return[$row[0]] = array($row[1]."(".$row[2].")",$auto,$row[0]); + } + if (count($return) == 0) return False; + else return $return; + case $this->TYPE_PDOPG: + case $this->TYPE_PGSQL: + $return = array(); + $result = $this->query("SELECT a.attname,t.typname FROM pg_class AS c + LEFT JOIN pg_attribute AS a ON a.attrelid = c.oid + LEFT JOIN pg_type AS t ON a.atttypid = t.oid + WHERE c.relname='$table_name'", $which_connection); + while($row = $this->fetch_row($result,$which_connection)){ + $return[$row[0]] = array($row[1],False); + } + if (count($return) == 0) return False; + else return $return; + } + return -1; + } + + /* attempt to load an array of values + * into the specified table + * array format: $values['column_name'] = 'column_value' + * If debugging is enabled, columns that couldn't be + * written are noted + */ + function smart_insert($table_name,$values,$which_connection=''){ + $OUTFILE = DEBUG_SMART_INSERTS; + + if ($which_connection == '') + $which_connection=$this->default_db; + $exists = $this->table_exists($table_name,$which_connection); + if (!$exists) return False; + if ($exists === -1) return -1; + + $t_def = $this->table_definition($table_name,$which_connection); + + $fp = -1; + $tstamp = date("r"); + if ($OUTFILE != "" && is_writable($OUTFILE)) + $fp = fopen($OUTFILE,"a"); + + $cols = "("; + $vals = "("; + foreach($values as $k=>$v){ + //$k = strtoupper($k); + if (isset($t_def[$k]) && is_array($t_def[$k])){ + if (!$t_def[$k][1]){ + if (stristr($t_def[$k][0],"money") || + stristr($t_def[$k][0],'decimal') || + stristr($t_def[$k][0],'float') || + stristr($t_def[$k][0],'double') ) + $vals .= $v.","; + else + $vals .= "'".$v."',"; + $col_name = $t_def[$k][2]; + if ($this->db_types[$which_connection] == $this->TYPE_MYSQL) + $cols .= "`".$col_name."`,"; + else + $cols .= $col_name.","; + } + else { + if ($OUTFILE != "") + fwrite($fp,"$tstamp: Column $k in table $table_name + is auto_increment so your value + was omitted\n"); + } + } + else { + if ($OUTFILE != '') + fwrite($fp,"$tstamp: Column $k not in table $table_name\n"); + } + } + $cols = substr($cols,0,strlen($cols)-1).")"; + $vals = substr($vals,0,strlen($vals)-1).")"; + $insertQ = "INSERT INTO $table_name $cols VALUES $vals"; + + $ret = $this->query($insertQ,$which_connection); + if (!$ret && $OUTFILE != ""){ + fwrite($fp,"$tstamp: $insertQ\n"); + } + if ($OUTFILE != "" && is_writable($OUTFILE)) fclose($fp); + + return $ret; + } + + function datediff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + return "datediff($date1,$date2)"; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + return "datediff(dd,$date2,$date1)"; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return "extract(day from ($date2 - $date1))"; + } + } + + function yeardiff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + return "DATE_FORMAT(FROM_DAYS(DATEDIFF($date1,$date2)), '%Y')+0"; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + return "datediff(yy,$date2,$date1)"; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return "extract(year from age($date1,$date))"; + } + } + + function now($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + return "now()"; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + return "getdate()"; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return "now()"; + } + } + + function dayofweek($col,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + return "dayofweek($col)"; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + return "datepart(dw,$col)"; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return "extract(dow from $col"; + } + } + + function curtime($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + return "curtime()"; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + return "getdate()"; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return "current_time"; + } + } + + function escape($str,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_real_escape_string($str); + case $this->TYPE_MSSQL: + return str_replace("'","''",$str); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + $quoted = $obj->quote($str); + return ($quoted == "''" ? '' : substr($quoted, 1, strlen($quoted)-2)); + } + return $str; + } + + function identifier_escape($str,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + case $this->TYPE_PDOMY: + return '`'.$str.'`'; + case $this->TYPE_PDOMS: + case $this->TYPE_MSSQL: + return '['.$str.']'; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return '"'.$str.'"'; + } + return $str; + } + + function sep($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + case $this->TYPE_PDOMY: + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return '.'; + case $this->TYPE_PDOMS: + case $this->TYPE_MSSQL: + return '.dbo.'; + } + return '.'; + } + + + function error($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_error(); + case $this->TYPE_MSSQL: + return mssql_get_last_message(); + case $this->TYPE_PDOMY: + case $this->TYPE_PDOMS: + case $this->TYPE_PDOPG: + $obj = $this->connections[$which_connection]; + $info = $obj->errorInfo(); + return ($info[2]==null ? '' : $info[2]); + } + return 'unknown error'; + } + + /** + Concatenate strings + @param Arbitrary; see below + @return The SQL expression + + This function takes an arbitrary number of arguments + and concatenates them. The last argument is the + standard $which_connection but in this case it is + not optional. You may pass the empty string to use + the default database though. + + This method currently only supports MySQL and MSSQL + */ + function concat(){ + $args = func_get_args(); + $ret = ""; + $which_connection = $args[count($args)-1]; + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + $ret .= "CONCAT("; + for($i=0;$i<count($args)-1;$i++) + $ret .= $args[$i].","; + $ret = rtrim($ret,",").")"; + break; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + for($i=0;$i<count($args)-1;$i++) + $ret .= $args[$i]."+"; + $ret = rtrim($ret,"+"); + break; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + for($i=0;$i<count($args)-1;$i++) + $ret .= $args[$i]."||"; + $ret = rtrim($ret,"||"); + break; + } + return $ret; + } + + /** + Get a SQL convert function + @param $expr An SQL expression + @param $type Convert to this SQL type + @param $which_connection see method close() + @return The SQL expression + + This method currently only supports MySQL and MSSQL + + */ + function convert($expr,$type,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_PDOMY: + case $this->TYPE_MYSQL: + if(strtoupper($type)=='INT') + $type='SIGNED'; + return "CONVERT($expr,$type)"; + case $this->TYPE_MSSQL: + case $this->TYPE_PDOMS: + return "CONVERT($type,$expr)"; + case $this->TYPE_PGSQL: + case $this->TYPE_PDOPG: + return "CAST($expr AS $type)"; + } + return ""; + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountType.php b/pos/is4c-nf/lib/Scanning/DiscountType.php new file mode 100644 index 000000000..451cff883 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountType.php @@ -0,0 +1,117 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DiscountType + Base module for computing sale prices +*/ +class DiscountType { + + /** + Convenience variable to save prieInfo() argument + for later if needed + */ + var $savedRow; + /** + Convenience variable to save prieInfo() return + value for later if needed + */ + var $savedInfo; + + /** + Calculate pricing + @param $row A record from the products table + @param $quantity Scanned quantity + @return Keyed array + - regPrice The normal price per item + - unitPrice The actual price per unit + If it's not on sale, unitPrice will + match regPrice + - discount The discount amount for everyone + - memDiscount The discount amount for members + */ + function priceInfo($row,$quantity=1){ + return array( + "regPrice"=>0, + "unitPrice"=>0, + "discount"=>0, + "memDiscount"=>0 + ); + } + + /** + Add a discount notification + @return None + + Optionally add an informational record + to the transaction so a savings message + appears on screen. + */ + function addDiscountLine(){ + + } + + /** + @return + - True The item is on sale + - False The item is not on sale + */ + function isSale(){ + return false; + } + + /** + @return + - True The sale is only for members + - False The sale is for everyone + */ + function isMemberOnly(){ + return false; + } + + /** + Alias for isMemberOnly() + */ + function isMemberSale(){ + return $this->isMemberOnly(); + } + + /** + @return + - True The sale is only for staff + - False The sale is for everyone + */ + function isStaffOnly(){ + return false; + } + + /** + Alias for isStaffOnly() + */ + function isStaffSale(){ + return $this->isStaffOnly(); + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/CasePriceDiscount.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/CasePriceDiscount.php new file mode 100644 index 000000000..62c5359d4 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/CasePriceDiscount.php @@ -0,0 +1,69 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CasePriceDiscount extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + $ret['discount'] = 0; + $ret['memDiscount'] = 0; + + if ($CORE_LOCAL->get("casediscount") > 0 && $CORE_LOCAL->get("casediscount") <= 100) { + $casediscount = (100 - $CORE_LOCAL->get("casediscount"))/100; + $ret['unitPrice'] = MiscLib::truncate2($casediscount * $ret['unitPrice']); + $ret['regPrice'] = $ret['unitPrice']; + $CORE_LOCAL->set("casediscount",0); + } + + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + TransRecord::addcdnotify(); + } + + function isSale(){ + return false; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/EveryoneSale.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/EveryoneSale.php new file mode 100644 index 000000000..571ccae85 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/EveryoneSale.php @@ -0,0 +1,114 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class EveryoneSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['special_price']; + + /* if not by weight, just use the sticker price + (for scaled items, the UPC parse module + calculates a weight estimate and sets a quantity + so normal_price can be used. This could be done + for all items, but typically the deli doesn't + keep good track of whether their items are + marked scale correctly since it only matters when an + item goes on sale + */ + if (isset($row['stickerprice']) && $row['scale'] == 0){ + $ret['regPrice'] = $row['stickerprice']; + } + + $ret['discount'] = ($ret['regPrice'] - $row['special_price']) * $quantity; + $ret['memDiscount'] = 0; + + if ($CORE_LOCAL->get("itemPD") > 0){ + $discount = $row['special_price'] * (($CORE_LOCAL->get("itemPD")/100)); + $ret["unitPrice"] = $row['special_price'] - $discount; + $ret["discount"] += ($discount * $quantity); + } + + // enforce per-transaction limit + if ($row['specialpricemethod']==0 && $row['specialquantity'] > 0){ + $tdb = Database::tDataConnect(); + $chkQ = "SELECT sum(ItemQtty) FROM + localtemptrans WHERE upc='{$row['upc']}'"; + if (strlen($row['mixmatchcode'])>0 && $row['mixmatchcode'][0]=='b') + $chkQ .= " OR mixMatch='{$row['mixmatchcode']}'"; + $chkR = $tdb->query($chkQ); + $prevSales = 0; + if ($tdb->num_rows($chkR) > 0){ + $prevSales = array_pop($tdb->fetch_row($chkR)); + } + + if ($prevSales >= $row['specialquantity']){ + // already sold the limit; use non-sale price + $ret['unitPrice'] = $row['normal_price']; + $ret['discount'] = 0; + } + else if ( ($prevSales+$quantity) > $row['specialquantity'] ){ + // this multiple qty ring will pass the limit + // set discount based on appropriate quantity + // and adjust unitPrice so total comes out correctly + $discountQty = $row['specialquantity'] - $prevSales; + $ret['discount'] = ($ret['regPrice'] - $row['special_price']) * $discountQty; + $total = ($ret['regPrice'] * $quantity) - $ret['discount']; + $ret['unitPrice'] = MiscLib::truncate2($total / $quantity); + } + } + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $CORE_LOCAL; + if ($this->savedInfo['discount'] != 0){ + TransRecord::adddiscount($this->savedInfo['discount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/MemberSale.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/MemberSale.php new file mode 100644 index 000000000..4454ff20b --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/MemberSale.php @@ -0,0 +1,79 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class MemberSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = MiscLib::truncate2(($ret['regPrice'] - $row['special_price']) * $quantity); + + if ($CORE_LOCAL->get("isMember") == 1 || $CORE_LOCAL->get("memberID") == $CORE_LOCAL->get("visitingMem")) + $ret["unitPrice"] = $row['special_price']; + + if ($CORE_LOCAL->get("itemPD") > 0){ + $discount = $ret['unitPrice'] * (($CORE_LOCAL->get("itemPD")/100)); + $ret["unitPrice"] -= $discount; + $ret["discount"] += ($discount * $quantity); + } + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("isMember") == 1 || $CORE_LOCAL->get("memberID") == $CORE_LOCAL->get("visitingMem")){ + TransRecord::adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + if ($this->savedInfo['discount'] != 0){ + TransRecord::adddiscount($this->savedInfo['discount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return true; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/NormalPricing.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/NormalPricing.php new file mode 100644 index 000000000..f108fbced --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/NormalPricing.php @@ -0,0 +1,70 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class NormalPricing extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + $ret = array(); + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + $ret['discount'] = 0; + $ret['memDiscount'] = 0; + if ($CORE_LOCAL->get("itemPD") > 0){ + $discount = $row['normal_price'] * (($CORE_LOCAL->get("itemPD")/100)); + $ret["unitPrice"] = $row['normal_price'] - $discount; + $ret["discount"] = $discount * $quantity; + } + + $this->savedRow = $row; + $this->savedInfo = $ret; + + return $ret; + } + + function addDiscountLine(){ + global $CORE_LOCAL; + if (isset($this->savedInfo) && $this->savedInfo['discount'] != 0){ + TransRecord::adddiscount($this->savedInfo['discount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return false; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/PercentMemSale.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/PercentMemSale.php new file mode 100644 index 000000000..5e63be4c3 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/PercentMemSale.php @@ -0,0 +1,69 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PercentMemSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = MiscLib::truncate2(($ret['regPrice'] - ($ret['unitPrice'] * $row['special_price'])) * $quantity); + + if ($CORE_LOCAL->get("isMember") == 1) + $ret['unitPrice'] = MiscLib::truncate2($ret['unitPrice'] * $row['special_price']); + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("isMember")){ + TransRecord::adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return true; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/SlidingMemSale.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/SlidingMemSale.php new file mode 100644 index 000000000..f065a9e0e --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/SlidingMemSale.php @@ -0,0 +1,69 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class SlidingMemSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = MiscLib::truncate2($row['special_price'] * $quantity); + + if ($CORE_LOCAL->get("isMember")) + $ret['unitPrice'] -= $row['special_price']; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("isMember")){ + TransRecord::adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return true; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/DiscountTypes/StaffSale.php b/pos/is4c-nf/lib/Scanning/DiscountTypes/StaffSale.php new file mode 100644 index 000000000..4ae909ed3 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/DiscountTypes/StaffSale.php @@ -0,0 +1,69 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class StaffSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $CORE_LOCAL; + if (is_array($this->savedInfo)) + return $this->savedInfo; + + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = ($ret['regPrice'] - $row['special_price']) * $quantity; + + if ($CORE_LOCAL->get("isStaff") == 1) + $ret["unitPrice"] = $row['special_price']; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("isStaff") == 1){ + TransRecord::adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return true; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethod.php b/pos/is4c-nf/lib/Scanning/PriceMethod.php new file mode 100644 index 000000000..3b42376f8 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethod.php @@ -0,0 +1,57 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class PriceMethod + Base class for handling different price methods + + These modules add an item to the transaction + + The default case is to add an item with the + specified price (BasicPM) but other methods + with group deals, buy-one-get-one, etc can + get really convoluted. UPC parsing is easier + to follow with that code relegated to a module. + + Stores can also swap out modules as needed and + rearrange them so products.pricemethod=X doesn't + need to mean the same thing at every store. +*/ +class PriceMethod { + + var $savedRow; + var $savedInfo; + + /** + Add the item to the transaction + @param $row A product table record + @param $quantity Scan quantity + @param $priceObj A DiscountType object + */ + function addItem($row,$quantity,$priceObj){ + return true; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/ABGroupPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/ABGroupPM.php new file mode 100644 index 000000000..aad0d7dec --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/ABGroupPM.php @@ -0,0 +1,225 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class ABGroupPM + + This module provides a group price where + the customer must buy something from + item group A *and* item group B to receive + the associated discount (ex: buy salsa, + save $0.50 on chips) + + This is pricemethod 4 in earlier WFC releases + and may not exist anywhere else. +*/ + +class ABGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + $mixMatch = $row['mixmatchcode']; + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* not straight-up interchangable + * ex: buy item A, get $1 off item B + * need strict pairs AB + * + * type 3 tries to split the discount amount + * across A & B's departments; type 4 + * does not + */ + $qualMM = abs($mixMatch); + $discMM = -1*abs($mixMatch); + + $dbt = Database::tDataConnect(); + + // lookup existing qualifiers (i.e., item As) + // by-weight items are rounded down here + $q1 = "SELECT floor(sum(ItemQtty)),max(department) + FROM localtemptrans WHERE mixMatch='$qualMM' + and trans_status <> 'R'"; + $r1 = $dbt->query($q1); + $quals = 0; + $dept1 = 0; + if($dbt->num_rows($r1)>0){ + $rowq = $dbt->fetch_row($r1); + $quals = round($rowq[0]); + $dept1 = $rowq[1]; + } + + // lookup existing discounters (i.e., item Bs) + // by-weight items are counted per-line here + // + // extra checks to make sure the maximum + // discount on scale items is "free" + $q2 = "SELECT sum(CASE WHEN scale=0 THEN ItemQtty ELSE 1 END), + max(department),max(scale),max(total) FROM localtemptrans + WHERE mixMatch='$discMM' + and trans_status <> 'R'"; + $r2 = $dbt->query($q2); + $dept2 = 0; + $discs = 0; + $discountIsScale = false; + $scaleDiscMax = 0; + if($dbt->num_rows($r2)>0){ + $rowd = $dbt->fetch_row($r2); + $discs = round($rowd[0]); + $dept2 = $rowd[1]; + if ($rowd[2]==1) $discountIsScale = true; + $scaleDiscMax = $rowd[3]; + } + if ($quantity != (int)$quantity && $mixMatch < 0){ + $discountIsScale = true; + $scaleDiscMax = $quantity * $unitPrice; + } + + // items that have already been used in an AB set + $q3 = "SELECT sum(matched) FROM localtemptrans WHERE + mixmatch IN ('$qualMM','$discMM')"; + $r3 = $dbt->query($q3); + $matches = ($dbt->num_rows($r3)>0)?array_pop($dbt->fetch_array($r3)):0; + + // reduce totals by existing matches + // implicit: quantity required for B = 1 + // i.e., buy X item A save on 1 item B + $matches = $matches/$groupQty; + $quals -= $matches*($groupQty-1); + $discs -= $matches; + + // where does the currently scanned item go? + if ($mixMatch > 0){ + $quals = ($quals >0)?$quals+floor($quantity):floor($quantity); + $dept1 = $department; + } + else { + // again, scaled items count once per line + if ($quantity != (int)$quantity) + $discs = ($discs >0)?$discs+1:1; + else + $discs = ($discs >0)?$discs+$quantity:$quantity; + $dept2 = $department; + } + + // count up complete sets + $sets = 0; + while($discs > 0 && $quals >= ($groupQty-1) ){ + $discs -= 1; + $quals -= ($groupQty -1); + $sets++; + } + + if ($sets > 0){ + $maxDiscount = $sets*$groupPrice; + if ($scaleDiscMax != 0 && $maxDiscount > $scaleDiscMax) + $maxDiscount = $scaleDiscMax; + + // if the current item is by-weight, quantity + // decrement has to be corrected, but matches + // should still be an integer + $ttlMatches = $sets; + if($quantity != (int)$quantity) $sets = $quantity; + $quantity = $quantity - $sets; + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + $sets, + $pricing['unitPrice'], + MiscLib::truncate2($sets*$pricing['unitPrice']), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + ($priceObj->isMemberSale() || $priceObj->isStaffSale()) ? 0 : MiscLib::truncate2($maxDiscount), + ($priceObj->isMemberSale() || $priceObj->isStaffSale()) ? MiscLib::truncate2($maxDiscount) : 0, + $row['discount'], + $row['discounttype'], + $sets, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $ttlMatches * $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + if (!$priceObj->isMemberSale() && !$priceObj->isStaffSale()){ + TransRecord::additemdiscount($dept2,MiscLib::truncate2($maxDiscount)); + } + } + + /* any remaining quantity added without + grouping discount */ + if ($quantity > 0){ + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/BasicPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/BasicPM.php new file mode 100644 index 000000000..bbc5a31af --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/BasicPM.php @@ -0,0 +1,71 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class BasicPM + + This module just adds the item with the given + quantity and price/discount information + + Classically, this is pricemethod=0 +*/ + +class BasicPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + $row['pricemethod'], + $row['quantity'], + $row['groupprice'], + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/BigGroupPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/BigGroupPM.php new file mode 100644 index 000000000..b07839155 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/BigGroupPM.php @@ -0,0 +1,158 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class BigGroupPM + + Elaborate set matching; can require up to + 11 separate items + Qualifying item(s) have a mixmatch code + with a matching 'stem' plus '_qX' + (e.g., mmitemstem_q0, mmitemstem_q1, etc) + Discount item has the same stem plus '_d' + (e.g, mmitemstem_d) + + Customer has to buy one item from each + qualifying group as well as an item from + the discount group. +*/ + +class BigGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + $stem = substr($mixMatch,0,10); + $sets = 99; + // count up total sets + for($i=0; $i<=$volume; $i++){ + $tmp = $stem."_q".$i; + if ($volume == $i) $tmp = $stem.'_d'; + + $chkQ = "SELECT sum(CASE WHEN scale=0 THEN ItemQtty ELSE 1 END) + FROM localtemptrans WHERE mixmatch='$tmp' + and trans_status<>'R'"; + $chkR = $dbt->query($chkQ); + $tsets = 0; + if ($dbt->num_rows($chkR) > 0){ + $tsets = array_pop($dbt->fetch_row($chkR)); + } + if ($tmp == $mixMatch){ + $tsets += is_int($quantity)?$quantity:1; + } + + if ($tsets < $sets) + $sets = $tsets; + + // item not found, no point continuing + if ($sets == 0) break; + } + + // count existing sets + $matches = 0; + $mQ = "SELECT sum(matched) FROM localtemptrans WHERE + left(mixmatch,11)='{$stem}_'"; + $mR = $dbt->query($mQ); + if ($dbt->num_rows($mR) > 0) + $matches = array_pop($dbt->fetch_row($mR)); + $sets -= $matches; + + // this means the current item + // completes a new set + if ($sets > 0){ + if ($priceObj->isSale()){ + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()) + $pricing['memDiscount'] = MiscLib::truncate2($row['specialgroupprice'] * $quantity); + else + $pricing['discount'] = MiscLib::truncate2($row['specialgroupprice'] * $quantity); + } + else { + $pricing['unitPrice'] = $pricing['unitPrice'] - $row['specialgroupprice']; + } + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $sets, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + else { + // not a new set, treat as a regular item + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + $row['pricemethod'], + $row['quantity'], + $row['groupprice'], + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/GroupPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/GroupPM.php new file mode 100644 index 000000000..5f1326b78 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/GroupPM.php @@ -0,0 +1,83 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class GroupPM + + This module provides the simplest form of group price: + each item is sold for the group price divided by the + group size. Buying a "complete" group is not required. + + In most locations, this is pricemethod 1 or 2 +*/ + +class GroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + if ($priceObj->isSale()){ + $disc = $pricing['unitPrice'] - ($row['specialgroupprice'] / $row['specialquantity']); + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()) + $pricing['memDiscount'] = MiscLib::truncate2($disc * $quantity); + else + $pricing['discount'] = MiscLib::truncate2($disc * $quantity); + } + else { + $pricing['unitPrice'] = $row['groupprice'] / $row['quantity']; + } + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/MoreThanQttyPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/MoreThanQttyPM.php new file mode 100644 index 000000000..b7f22908c --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/MoreThanQttyPM.php @@ -0,0 +1,137 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +/** + @class MoreThanQttyPM + + This method provides a discount + on all items in the group beyond + the required quantity. Discount is + reflected as a percentage in groupprice. + Groups are defined via mixmatch. +*/ + +class MoreThanQttyPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* count items in the transaction + from the given group + + Also note the total of items already + rung in that did not receive a discount + */ + $mixMatch = $row["mixmatchcode"]; + $queryt = "select sum(ItemQtty) as mmqtty, + sum(CASE WHEN discount=0 THEN total ELSE 0 END) as unDiscountedTotal, + mixMatch from localtemptrans + where trans_status <> 'R' AND + mixMatch = '".$mixMatch."' group by mixMatch"; + if (!$mixMatch || $mixMatch == '0') { + $mixMatch = 0; + $queryt = "select sum(ItemQtty) as mmqtty, + sum(CASE WHEN discount=0 THEN total ELSE 0 END) as unDiscountedTotal, + from " + ."localtemptrans where trans_status<>'R' AND " + ."upc = '".$row['upc']."' group by upc"; + } + $dbt = Database::tDataConnect(); + $resultt = $dbt->query($queryt); + $num_rowst = $dbt->num_rows($resultt); + + $trans_qty = 0; + $undisc_ttl = 0; + if ($num_rowst > 0){ + $rowt = $dbt->fetch_array($resultt); + $trans_qty = floor($rowt['mmqtty']); + $undisc_ttl = $rowt['unDiscountedTotal']; + } + /* include the items in this ring */ + $trans_qty += $quantity; + + /* if purchases exceed then requirement, apply + the discount */ + if ($trans_qty >= $groupQty){ + $discountAmt = $pricing['unitPrice'] * $groupPrice; + + if ( ($trans_qty - $quantity) < $groupQty){ + /* this ring puts us over the threshold. + extra math to account for discount on + previously rung items */ + $totalDiscount = ($undisc_ttl * $groupPrice) + ($discountAmt * $quantity); + $actualTotal = ($pricing['unitPrice']*$quantity) - $totalDiscount; + $pricing['discount'] = $totalDiscount; + $pricing['unitPrice'] = $actualTotal / $quantity; + } + else { + $pricing['discount'] = $discountAmt * $quantity; + $pricing['unitPrice'] -= $discountAmt; + } + } + + /* add the item */ + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/NoDiscOnSalesPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/NoDiscOnSalesPM.php new file mode 100644 index 000000000..6dfcce71d --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/NoDiscOnSalesPM.php @@ -0,0 +1,71 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class NoDiscOnSalePM + + A replacement for BasicPM. This disables + transaction percent discount for items + that are on sale + +*/ + +class NoDiscOnSalePM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + ($row['discounttype']>0?0:$row['discount']), + $row['discounttype'], + $quantity, + $row['pricemethod'], + $row['quantity'], + $row['groupprice'], + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/QttyEnforcedGroupPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/QttyEnforcedGroupPM.php new file mode 100644 index 000000000..5223483d7 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/QttyEnforcedGroupPM.php @@ -0,0 +1,227 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +/** + @class QttyEnforcedGroupPM + + This module provides grouped sales where the + customer is required to buy a "complete set" + before the group discount is applied + + In most locations, this is pricemethod 1 or 2 +*/ + +class QttyEnforcedGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* calculate how many complete sets are + present in this scan and how many remain + after complete sets */ + $new_sets = floor($quantity / $groupQty); + $remainder = $quantity % $groupQty; + + /* add complete sets */ + if ($new_sets > 0){ + + $percentDiscount = 0; + if (!$priceObj->isSale() && $pricing['unitPrice'] != $row['normal_price']){ + $percentDiscount = ($row['normal_price'] - $pricing['unitPrice']) / $row['normal_price']; + $groupPrice *= (1 - $percentDiscount); + } + else if ($priceObj->isSale() && $pricing['unitPrice'] != $row['special_price']){ + $percentDiscount = ($row['special_price'] - $pricing['unitPrice']) / $row['special_price']; + $groupPrice *= (1 - $percentDiscount); + } + + /* discount for complete set */ + $discount = $new_sets * (($pricing['unitPrice']*$groupQty) - $groupPrice); + $total = ($new_sets* $groupQty * $pricing['unitPrice']) - $discount; + $unit = $total / ($new_sets * $groupQty); + $memDiscount = 0; + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()){ + $memDiscount = $discount; + $discount = 0; + } + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + $new_sets * $groupQty, + MiscLib::truncate2($unit), + MiscLib::truncate2($total), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $discount, + $memDiscount, + $row['discount'], + $row['discounttype'], + $new_sets * $groupQty, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $new_sets * $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + if ($percentDiscount != 0){ + $discount -= $pricing['discount']; + } + TransRecord::adddiscount($discount,$row['department']); + + $quantity = $quantity - ($new_sets * $groupQty); + if ($quantity < 0) $quantity = 0; + } + + /* if potential matches remain, check for sets */ + if ($remainder > 0){ + /* count items in the transaction + from the given group, minus + items that have already been used + in a grouping */ + $mixMatch = $row["mixmatchcode"]; + $queryt = "select sum(ItemQtty - matched) as mmqtty, + mixMatch from localtemptrans + where trans_status <> 'R' AND + mixMatch = '".$mixMatch."' group by mixMatch"; + if (!$mixMatch || $mixMatch == '0') { + $mixMatch = 0; + $queryt = "select sum(ItemQtty - matched) as mmqtty from " + ."localtemptrans where trans_status<>'R' AND " + ."upc = '".$row['upc']."' group by upc"; + } + $dbt = Database::tDataConnect(); + $resultt = $dbt->query($queryt); + $num_rowst = $dbt->num_rows($resultt); + + $trans_qty = 0; + if ($num_rowst > 0){ + $rowt = $dbt->fetch_array($resultt); + $trans_qty = floor($rowt['mmqtty']); + } + + /* remainder from current scan plus existing + unmatched items complete a new set, so + add one item with the group discount */ + if ($trans_qty + $remainder >= $groupQty){ + /* adjusted price for the "last" item in a set */ + $priceAdjust = $groupPrice - (($groupQty-1) * $pricing['unitPrice']); + $discount = $pricing['unitPrice'] - $priceAdjust; + $memDiscount = 0; + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()){ + $memDiscount = $discount; + $discount = 0; + } + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + 1, + $pricing['unitPrice'] - $discount, + $pricing['unitPrice'] - $discount, + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $discount, + $memDiscount, + $row['discount'], + $row['discounttype'], + 1, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + $quantity -= 1; + if ($quantity < 0) $quantity = 0; + } + } + + /* any remaining quantity added without + grouping discount */ + if ($quantity > 0){ + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/PriceMethods/SplitABGroupPM.php b/pos/is4c-nf/lib/Scanning/PriceMethods/SplitABGroupPM.php new file mode 100644 index 000000000..c5a982a5a --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/PriceMethods/SplitABGroupPM.php @@ -0,0 +1,227 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SplitABGroupPM + + The same as ABGroupPM, but the discount gets + split across two departments + + Splitting doesn't work with member/staff + sales (discount will still apply, just + not divided) + + This is pricemethod 3 in earlier WFC releases + and may not exist anywhere else. +*/ + +class SplitABGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + $department = $row['department']; + + $mixMatch = $row['mixmatchcode']; + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* not straight-up interchangable + * ex: buy item A, get $1 off item B + * need strict pairs AB + * + * type 3 tries to split the discount amount + * across A & B's departments; type 4 + * does not + */ + $qualMM = abs($mixMatch); + $discMM = -1*abs($mixMatch); + + $dbt = Database::tDataConnect(); + // lookup existing qualifiers (i.e., item As) + // by-weight items are rounded down here + $q1 = "SELECT floor(sum(ItemQtty)),max(department) + FROM localtemptrans WHERE mixMatch='$qualMM' + and trans_status <> 'R'"; + $r1 = $dbt->query($q1); + $quals = 0; + $dept1 = 0; + if($dbt->num_rows($r1)>0){ + $rowq = $dbt->fetch_row($r1); + $quals = round($rowq[0]); + $dept1 = $rowq[1]; + } + + // lookup existing discounters (i.e., item Bs) + // by-weight items are counted per-line here + // + // extra checks to make sure the maximum + // discount on scale items is "free" + $q2 = "SELECT sum(CASE WHEN scale=0 THEN ItemQtty ELSE 1 END), + max(department),max(scale),max(total) FROM localtemptrans + WHERE mixMatch='$discMM' + and trans_status <> 'R'"; + $r2 = $dbt->query($q2); + $dept2 = 0; + $discs = 0; + $discountIsScale = false; + $scaleDiscMax = 0; + if($dbt->num_rows($r2)>0){ + $rowd = $dbt->fetch_row($r2); + $discs = round($rowd[0]); + $dept2 = $rowd[1]; + if ($rowd[2]==1) $discountIsScale = true; + $scaleDiscMax = $rowd[3]; + } + if ($quantity != (int)$quantity && $mixMatch < 0){ + $discountIsScale = true; + $scaleDiscMax = $quantity * $unitPrice; + } + + // items that have already been used in an AB set + $q3 = "SELECT sum(matched) FROM localtemptrans WHERE + mixmatch IN ('$qualMM','$discMM')"; + $r3 = $dbt->query($q3); + $matches = ($dbt->num_rows($r3)>0)?array_pop($dbt->fetch_array($r3)):0; + + // reduce totals by existing matches + // implicit: quantity required for B = 1 + // i.e., buy X item A save on 1 item B + $matches = $matches/$groupQty; + $quals -= $matches*($groupQty-1); + $discs -= $matches; + + // where does the currently scanned item go? + if ($mixMatch > 0){ + $quals = ($quals >0)?$quals+floor($quantity):floor($quantity); + $dept1 = $department; + } + else { + // again, scaled items count once per line + if ($quantity != (int)$quantity) + $discs = ($discs >0)?$discs+1:1; + else + $discs = ($discs >0)?$discs+$quantity:$quantity; + $dept2 = $department; + } + + // count up complete sets + $sets = 0; + while($discs > 0 && $quals >= ($groupQty-1) ){ + $discs -= 1; + $quals -= ($groupQty -1); + $sets++; + } + + if ($sets > 0){ + $maxDiscount = $sets*$groupPrice; + if ($scaleDiscMax != 0 && $maxDiscount > $scaleDiscMax) + $maxDiscount = $scaleDiscMax; + + // if the current item is by-weight, quantity + // decrement has to be corrected, but matches + // should still be an integer + $ttlMatches = $sets; + if($quantity != (int)$quantity) $sets = $quantity; + $quantity = $quantity - $sets; + + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + $sets, + $pricing['unitPrice'], + MiscLib::truncate2($sets*$pricing['unitPrice']), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + ($priceObj->isMemberSale() || $priceObj->isStaffSale()) ? MiscLib::truncate2($maxDiscount) : 0, + $row['discount'], + $row['discounttype'], + $sets, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $ttlMatches * $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + if (!$priceObj->isMemberSale() && !$priceObj->isStaffSale()){ + TransRecord::additemdiscount($dept1,MiscLib::truncate2($maxDiscount/2.0)); + TransRecord::additemdiscount($dept2,MiscLib::truncate2($maxDiscount/2.0)); + } + } + + /* any remaining quantity added without + grouping discount */ + if ($quantity > 0){ + TransRecord::addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + MiscLib::truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialDept.php b/pos/is4c-nf/lib/Scanning/SpecialDept.php new file mode 100644 index 000000000..f71b61b58 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialDept.php @@ -0,0 +1,67 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SpecialDept + + A class to add custom actions to + certain departments +*/ +class SpecialDept { + + /** + Utility function + Add the class to a handler map + @param $deptID the department number + @param $arr a handler map (array) + @return handler map (array) + */ + function register($deptID,$arr){ + if (!is_array($arr)) $arr = array(); + if (!isset($arr[$deptID]) || !is_array($arr[$deptID])) + $arr[$deptID] = array(); + $inst = new ReflectionClass($this); + $arr[$deptID][] = $inst->name; + return $arr; + } + + /** + Process an open ring + @param $upc The department ID + @param $amount the sale amount + @param $json Keyed array + See the Parser class for array format + @return Keyed array + See the Parser class for array format + + These modules supplement parsing to make + open ring handling more customizable. The module + will be invoked within a Parser object and + hence uses the same return format. + */ + function handle($deptID,$amount,$json){ + return $json; + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialDepts/ArWarnDept.php b/pos/is4c-nf/lib/Scanning/SpecialDepts/ArWarnDept.php new file mode 100644 index 000000000..daa1255d2 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialDepts/ArWarnDept.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ArWarnDept extends SpecialDept { + + function handle($deptID,$amount,$json){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("boxMsg","<b>A/R Payment Sale</b><br>remember to retain you<br> + reprinted receipt<br><font size=-1>[enter] to continue, [clear] to cancel</font>"); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?quiet=1'; + } + + return $json; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialDepts/AutoReprintDept.php b/pos/is4c-nf/lib/Scanning/SpecialDepts/AutoReprintDept.php new file mode 100644 index 000000000..8e448756a --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialDepts/AutoReprintDept.php @@ -0,0 +1,31 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AutoReprintDept extends SpecialDept { + + function handle($deptID,$amount,$json){ + global $CORE_LOCAL; + $CORE_LOCAL->set('autoReprint',1); + return $json; + } +} diff --git a/pos/is4c-nf/lib/Scanning/SpecialDepts/EquityEndorseDept.php b/pos/is4c-nf/lib/Scanning/SpecialDepts/EquityEndorseDept.php new file mode 100755 index 000000000..11d9c8d1a --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialDepts/EquityEndorseDept.php @@ -0,0 +1,53 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class EquityEndorseDept extends SpecialDept { + + function handle($deptID,$amount,$json){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("memberID") == "0" || $CORE_LOCAL->get("memberID") == $CORE_LOCAL->get("defaultNonMem")){ + $CORE_LOCAL->set('strEntered',''); + $CORE_LOCAL->set('boxMsg','Equity requires member.<br />Apply member number first'); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + return $json; + } + + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $ref = trim($CORE_LOCAL->get("CashierNo"))."-" + .trim($CORE_LOCAL->get("laneno"))."-" + .trim($CORE_LOCAL->get("transno")); + if ($CORE_LOCAL->get("LastEquityReference") != $ref){ + $CORE_LOCAL->set("equityAmt",$amount); + $CORE_LOCAL->set("boxMsg","<b>Equity Sale</b><br>Insert paperwork and press<br> + <font size=-1>[enter] to continue, [clear] to cancel</font>"); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?quiet=1&endorse=stock&endorseAmt='.$amount; + } + } + + return $json; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialDepts/EquityWarnDept.php b/pos/is4c-nf/lib/Scanning/SpecialDepts/EquityWarnDept.php new file mode 100755 index 000000000..b2ebed25b --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialDepts/EquityWarnDept.php @@ -0,0 +1,46 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class EquityWarnDept extends SpecialDept { + + function handle($deptID,$amount,$json){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("memberID") == "0" || $CORE_LOCAL->get("memberID") == $CORE_LOCAL->get("defaultNonMem")){ + $CORE_LOCAL->set('strEntered',''); + $CORE_LOCAL->set('boxMsg','Equity requires member.<br />Apply member number first'); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + return $json; + } + + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("boxMsg","<b>Equity Sale</b><br>please confirm<br> + <font size=-1>[enter] to continue, [clear] to cancel</font>"); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php?quiet=1'; + } + + return $json; + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialUPC.php b/pos/is4c-nf/lib/Scanning/SpecialUPC.php new file mode 100644 index 000000000..006b42332 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialUPC.php @@ -0,0 +1,68 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SpecialUPC + Handler module for non-product UPCs + + If a scanned UPC does not correspond + to an entry in the products table, enabled + SpecialUPC modules can supplement processing. + + CouponCode is the most universal example. +*/ + +class SpecialUPC { + +/** + Check function + @param $upc The UPC + @return + - True This module handles this UPC + - False This module doesn't handle this UPC +*/ +function is_special($upc){ + + return false; +} + +/** + Process the UPC + @param $upc The UPC + @param $json Keyed array + See the Parser class for array format + @return Keyed array + See the Parser class for array format + + These modules supplement parsing to make + UPC handling more customizable. The module + will be invoked within a Paser object and + hence uses the same return format. +*/ +function handle($upc,$json){ + +} + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialUPCs/CouponCode.php b/pos/is4c-nf/lib/Scanning/SpecialUPCs/CouponCode.php new file mode 100644 index 000000000..ffadb3542 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialUPCs/CouponCode.php @@ -0,0 +1,229 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class CouponCode + Handle standard manufacturer coupons + + This module looks for UPCs with prefix + - 005 UPC-12 coupon + - 099 EAN-13 coupon + + It extracts the manufacturer prefix from + the UPC and validates that a matching item + is in the transaction + + It looks up the coupon code to calculate + a discount value and adds the coupon to + the transaction +*/ +class CouponCode extends SpecialUPC { + +var $ean; + + function is_special($upc){ + $this->ean = false; + if (substr($upc,0,3) == "005") + return true; + elseif (substr($upc,0,3) == "099"){ + $this->ean = true; + return true; + } + + return false; + } + + function handle($upc,$json){ + global $CORE_LOCAL; + + $man_id = substr($upc, 3, 5); + $fam = substr($upc, 8, 3); + $val = substr($upc, -2); + + $db = Database::pDataConnect(); + $query = "select Value,Qty from couponcodes where Code = '".$val."'"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) { + $json['output'] = DisplayLib::boxMsg(_("coupon type unknown")."<br />"._("enter coupon manually")); + return $json; + } + + $query2 = "SELECT reason FROM disableCoupon WHERE upc='$upc'"; + $result2 = $db->query($query2); + if ($db->num_rows($result2) > 0){ + $reason = array_pop($db->fetch_row($result2)); + $json['output'] = DisplayLib::boxMsg(_("coupon disabled")."<br />".$reason); + return $json; + } + + $row = $db->fetch_array($result); + $value = $row["Value"]; + $qty = $row["Qty"]; + + if ($fam == "992") { + // 992 basically means blanket accept + // Old method of asking cashier to assign a department + // just creates confusion + // Instead I just try to guess, otherwise use zero + // (since that's what would happen anyway when the + // confused cashier does a generic coupon tender) + $value = MiscLib::truncate2($value); + $CORE_LOCAL->set("couponupc",$upc); + $CORE_LOCAL->set("couponamt",$value); + + $dept = 0; + $db = Database::tDataConnect(); + $query = "select department from localtemptrans WHERE + substring(upc,4,5)='$man_id' group by department + order by count(*) desc"; + $result = $db->query($query); + if ($db->num_rows($result) > 0) + $dept = array_pop($db->fetch_row($result)); + + TransRecord::addCoupon($upc, $dept, $value); + $json['output'] = DisplayLib::lastpage(); + return $json; + } + + // validate coupon + $db = Database::tDataConnect(); + $fam = substr($fam, 0, 2); + + /* the idea here is to track exactly which + items in the transaction a coupon was + previously applied to + */ + $query = "select max(t.unitPrice) as unitPrice, + max(t.department) as department, + max(t.ItemQtty) as itemQtty, + sum(case when c.quantity is null then 0 else c.quantity end) as couponQtty, + max(case when c.quantity is not null then 0 else t.foodstamp end) as foodstamp, + max(case when c.quantity is not null then 0 else t.tax end) as tax, + max(t.emp_no) as emp_no, + max(t.trans_no) as trans_no, + t.trans_id from + localtemptrans as t left join couponApplied as c + on t.emp_no=c.emp_no and t.trans_no=c.trans_no + and t.trans_id=c.trans_id + where (substring(t.upc,4,5)='$man_id'"; + /* not right per the standard, but organic valley doesn't + * provide consistent manufacturer ids in the same goddamn + * coupon book */ + if ($this->ean) + $query .= " or substring(t.upc,3,5)='$man_id'"; + $query .= ") and t.trans_status <> 'C' + group by t.trans_id + order by t.unitPrice desc"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + /* no item w/ matching manufacturer */ + if ($num_rows == 0){ + $json['output'] = DisplayLib::boxMsg(_("product not found")."<br />"._("in transaction")); + return $json; + } + + /* count up per-item quantites that have not + yet had a coupon applied to them */ + $available = array(); + $emp_no=$transno=$dept=$foodstamp=$tax=-1; + $act_qty = 0; + while($row = $db->fetch_array($result)){ + if ($row["itemQtty"] - $row["couponQtty"] > 0){ + $id = $row["trans_id"]; + $available["$id"] = array(0,0); + $available["$id"][0] = $row["unitPrice"]; + $available["$id"][1] += $row["itemQtty"]; + $available["$id"][1] -= $row["couponQtty"]; + $act_qty += $available["$id"][1]; + } + if ($emp_no == -1){ + $emp_no = $row["emp_no"]; + $transno = $row["trans_no"]; + $dept = $row["department"]; + $foodstamp = $row["foodstamp"]; + $tax = $row['tax']; + } + } + + /* every line has maximum coupons applied */ + if (count($available) == 0) { + $json['output'] = DisplayLib::boxMsg(_("Coupon already applied")."<br />"._("for this item")); + return $json; + } + + /* insufficient number of matching items */ + if ($qty > $act_qty) { + $json['output'] = DisplayLib::boxMsg(sprintf(_("coupon requires %d items"),$qty)."<br />". + sprintf(_("there are only %d item(s)"),$act_qty)."<br />"._("in this transaction")); + return $json; + } + + + /* free item, multiple choices + needs work, obviously */ + if ($value == 0 && count($available) > 1){ + // decide which item(s) + // manually by cashier maybe? + } + + /* log the item(s) this coupon is + being applied to */ + $applied = 0; + foreach(array_keys($available) as $id){ + if ($value == 0) + $value = -1 * $available["$id"][0]; + if ($qty <= $available["$id"][1]){ + $q = "INSERT INTO couponApplied + (emp_no,trans_no,quantity,trans_id) + VALUES ( + $emp_no,$transno,$qty,$id)"; + $r = $db->query($q); + $applied += $qty; + } + else { + $q = "INSERT INTO couponApplied + (emp_no,trans_no,quantity,trans_id) + VALUES ( + $emp_no,$transno,". + $available["$id"][1].",$id)"; + $r = $db->query($q); + $applied += $available["$id"][1]; + } + + if ($applied >= $qty) break; + } + + $value = MiscLib::truncate2($value); + $json['udpmsg'] = 'goodBeep'; + TransRecord::addCoupon($upc, $dept, $value, $foodstamp, $tax); + $json['output'] = DisplayLib::lastpage(); + $json['redraw_footer'] = True; + return $json; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialUPCs/DatabarCoupon.php b/pos/is4c-nf/lib/Scanning/SpecialUPCs/DatabarCoupon.php new file mode 100644 index 000000000..a03b09ccf --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialUPCs/DatabarCoupon.php @@ -0,0 +1,474 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DatabarCoupon extends SpecialUPC { + + function is_special($upc){ + if (substr($upc,0,4) == "8110" && strlen($upc) > 13) + return true; + + return false; + } + + function handle($upc,$json){ + global $CORE_LOCAL; + + $pos = 0; + $first_req = array(); + + /* STEP 1 - REQUIRED FIELDS */ + + // remove prefix 8110 + $pos += 4; + + // grab company prefix length, remove it from barcode + $prefix_length = ((int)$upc[$pos]) + 6; + $pos += 1; + + // grab company prefix, remove from barcode + $first_req['man_id'] = substr($upc,$pos,$prefix_length); + $pos += $prefix_length; + + // this way all prefixes map against + // localtemptrans.upc[2,length] + if ($prefix_length==6) + $first_req['man_id'] = "0".$first_req['man_id']; + + // grab offer code, remove from barcode + $offer = substr($upc,$pos,6); + $pos += 6; + + // read value length + $val_length = (int)$upc[$pos]; + $pos += 1; + + // read value + $value = (int)substr($upc,$pos,$val_length); + $pos += $val_length; + + // read primary requirement length + $req_length = (int)$upc[$pos]; + $pos += 1; + + // read primary requirement value + $first_req['value'] = substr($upc,$pos,$req_length); + $pos += $req_length; + + // read primary requirement type-code + $first_req['code'] = $upc[$pos]; + $pos += 1; + + // read primary requirement family code + $first_req['family'] = substr($upc,$pos,3); + $pos += 3; + + /* END REQUIRED FIELDS */ + + /* example: + + barcode: 8110100707340143853100110110 + company prefix length => 1 (+6) + company prefix => 0070734 + offer code => 014385 + value length => 3 + value => 100 + primary req length => 1 + primary req value => 1 + primary req code => 0 + primary req family => 110 + */ + + /* STEP 2 - CHECK FOR OPTIONAL FIELDS */ + + // second required item + $second_req = array(); + $req_rules_code = 1; + $duplicate_prefix_flag = false; + if (isset($upc[$pos]) && $upc[$pos] == "1"){ + $pos += 1; + + $rules_code = $upc[$pos]; + $pos += 1; + + $sr_length = (int)$upc[$pos]; + $pos += 1; + $second_req['value'] = substr($upc,$pos,$sr_length); + $pos += $sr_length; + + $second_req['code'] = $upc[$pos]; + $pos += 1; + + $second_req['family'] = substr($upc,$pos,3); + $pos += 3; + + $sm_length = ((int)$upc[$pos]) + 6; + $pos += 1; + if ($sm_length == 15){ // 9+6 + $second_req['man_id'] = $first_req['man_id']; + $duplicate_prefix_flag = true; + } + else { + $second_req['man_id'] = substr($upc,$pos,$sm_length); + $pos += $sm_length; + + if ($sm_length == 6) + $second_req['man_id'] = "0".$second_req['man_id']; + } + } + + // third required item + $third_req = array(); + if (isset($upc[$pos]) && $upc[$pos] == "2"){ + $pos += 1; + + $tr_length = (int)$upc[$pos]; + $pos += 1; + $third_req['value'] = substr($upc,$pos,$tr_length); + $pos += $tr_length; + + $third_req['code'] = $upc[$pos]; + $pos += 1; + + $third_req['family'] = substr($upc,$pos,3); + $pos += 3; + + $tm_length = ((int)$upc[$pos]) + 6; + $pos += 1; + if ($tm_length == 15){ // 9+6 + $third_req['man_id'] = $first_req['man_id']; + $duplicate_prefix_flag = true; + } + else { + $third_req['man_id'] = substr($upc,$pos,$tm_length); + $pos += $tm_length; + + if ($tm_length == 6) + $third_req['man_id'] = "0".$third_req['man_id']; + } + } + + if ($duplicate_prefix_flag){ + $first_req['man_id'] .= $first_req['family']; + $second_req['man_id'] .= $second_req['family']; + $third_req['man_id'] .= $third_req['family']; + } + + // expiration date + if (isset($upc[$pos]) && $upc[$pos] == "3"){ + $pos += 1; + $expires = substr($upc,$pos,6); + $pos += 6; + + $y = "20".substr($expires,0,2); + $m = substr($expires,2,2); + $d = substr($expires,4,2); + + $tstamp = mktime(23,59,59,$m,$d,$y); + if ($tstamp < time()){ + $json['output'] = DisplayLib::boxMsg("Coupon expired $m/$d/$y"); + return $json; + } + } + + // start date + if (isset($upc[$pos]) && $upc[$pos] == "4"){ + $pos += 1; + $starts = substr($upc,$pos,6); + $pos += 6; + + $y = "20".substr($starts,0,2); + $m = substr($starts,2,2); + $d = substr($starts,4,2); + + $tstamp = mktime(0,0,0,$m,$d,$y); + if ($tstamp > time()){ + $json['output'] = DisplayLib::boxMsg("Coupon not valid until $m/$d/$y"); + return $json; + } + } + + // serial number + $serial = false; + if (isset($upc[$pos]) && $upc[$pos] == "5"){ + $pos += 1; + $serial_length = ((int)$upc[$pos]) + 6; + $pos += 1; + $serial = substr($upc,$pos,$serial_length); + $pos += $serial_length; + } + + // retailer + $retailer = false; + if (isset($upc[$pos]) && $upc[$pos] == "6"){ + $pos += 1; + $rt_length = ((int)$upc[$pos]) + 6; + $pos += 1; + $retailer = substr($upc,$pos,$rt_length); + $pos += $rt_length; + } + + /* END OPTIONAL FIELDS */ + + /* STEP 3 - The Miscellaneous Field + This field is also optional, but filling in + the default values here will make code + that validates coupons and calculates values + consistent + */ + + $misc = array( + 'value_code' => 0, + 'value_applies' => 0, + 'store_coupon' => 0, + 'no_multiply' => 0 + ); + if (isset($upc[$pos]) && $upc[$pos] == "9"){ + $pos += 1; + $misc['value_code'] = $upc[$pos]; + $pos += 1; + $misc['value_applies'] = $upc[$pos]; + $pos += 1; + $misc['store_coupon'] = $upc[$pos]; + $pos += 1; + $misc['no_multiply'] = $upc[$pos]; + $pos += 1; + } + + /* END Miscellaneous Field */ + + /* STEP 4 - validate coupon requirements */ + + $primary = $this->validateRequirement($first_req, $json); + if (!$primary && (count($second_req) == 0 || $req_rules_code == 1 || $req_rules_code == 2)){ + // if the primary requirement isn't valid and + // a) there are no more requirments, or + // b) the primary requirement is mandatory + // return the json. Error message should have been + // set up by validateRequirement() + return $json; + } + + $secondary = $this->validateRequirement($second_req, $json); + if (!$secondary && (count($third_req) == 0 || $req_rules_code == 1)){ + // if the secondary requirment isn't valid and + // a) there are no more requirments, or + // b) all requirements are mandatory + // return the json. Error message should have been + // set up by validateRequirement() + return $json; + } + + $tertiary = $this->validateRequirement($third_req, $json); + + // compare requirement results with rules + // return error message if applicable + switch ($req_rules_code){ + case '0': // any requirement can be used + if (!$primary && !$secondary && !$tertiary) + return $json; + break; + case '1': // all required + if (!$primary || !$secondary || !$tertiary) + return $json; + break; + case '2': // primary + second OR third + if (!$primary) + return $json; + else if (!$secondary && !$tertiary) + return $json; + break; + case '3': // either second or third. seems odd, may + // be misreading documentation on this one + if (!$secondary && !$tertiary) + return $json; + break; + default: + $json['output'] = DisplayLib::boxMsg("Malformed coupon"); + return $json; + } + + /* End requirement validation */ + + /* STEP 5 - determine coupon value */ + + $val_arr = $first_req; + if ($misc['value_applies'] == 1) + $val_arr = $second_req; + else if ($misc['value_applies'] == 2) + $val_arr = $third_req; + + $value = 0; + switch($misc['value_code']){ + case '0': // value in cents + case '6': + $value = MiscLib::truncate2($val_arr['value'] / 100.00); + break; + case '1': // free item + $value = $val_arr['price']; + break; + case '2': // multiple free items + $value = MiscLib::truncate2($val_arr['price'] * $val_arr['value']); + break; + case '5': // percent off + $value = MiscLib::truncate2($val_arr['price'] * ($val_arr['value']/100.00)); + break; + default: + $json['output'] = DisplayLib::boxMsg("Error: bad coupon"); + return $json; + } + + /* attempt to cram company prefix and offer code + into 13 characters + + First character is zero + Next characters are company prefix + Remaining characters are offer code in base-36 + + The first zero is there so that the company + prefix will "line up" with matching items in + localtemptrans + + The offer code is converted to base-36 to + reduce its character count. + + Offer code won't always fit. This is just best + effort. I've already seen a real coupon using + a 10 digit prefix. In theory there could even + be a 12 digit prefix leaving no room for the + offer code at all. + */ + $upc_start = "0".$val_arr['man_id']; + $offer = base_convert($offer,10,36); + $remaining = 13 - strlen($upc_start); + if (strlen($offer) < $remaining) + $offer = str_pad($offer,$remaining,'0',STR_PAD_LEFT); + elseif (strlen($offer) > $remaining) + $offer = substr($offer,0,$remaining); + $coupon_upc = $upc_start.$offer; + + TransRecord::addCoupon($coupon_upc, $row['department'], -1*$value); + $json['output'] = DisplayLib::lastpage(); + + return $json; + } + + /* method takes an requirement array and a json array, + both by reference + + item price is added to the requirements array as it + can be needed to calculate coupon value later + + json array is updated to include error messages if + the requirement isn't met, but these are not necessarily + fatal errors when there are multiple requirements + + return true/false based on whether requirement is met + */ + function validateRequirement(&$req, &$json){ + $db = Database::tDataConnect(); + + /* simple case first; just wants total transaction value + no company prefixing + */ + if ($req['code'] == 2){ + $q = "SELECT SUM(total) FROM localtemptrans WHERE + trans_type IN ('I','D','M')"; + $r = $db->query($q); + $ttl_required = MiscLib::truncate2($req['value'] / 100.00); + if ($db->num_rows($r) == 0){ + $json['output'] = DisplayLib::boxMsg("Coupon requires transaction of at least \$$ttl_required"); + return false; + } + + $w = $dbc->fetch_row($r); + if ($w[0] < $ttl_required){ + $json['output'] = DisplayLib::boxMsg("Coupon requires transaction of at least \$$ttl_required"); + return false; + } + return true; + } + + $query = sprintf("SELECT + max(CASE WHEN trans_status<>'C' THEN unitPrice ELSE 0 END) as price, + sum(CASE WHEN trans_status<>'C' THEN total ELSE 0 END) as total, + max(department) as department, + sum(CASE WHEN trans_status<>'C' THEN ItemQtty ELSE 0 END) as qty, + sum(CASE WHEN trans_status='C' THEN 1 ELSE 0 END) as couponqtty + FROM localtemptrans WHERE + substring(upc,2,%d) = '%s'", + strlen($req['man_id']),$req['man_id']); + $result = $db->query($query); + + if ($db->num_rows($result) <= 0){ + $json['output'] = DisplayLib::boxMsg("Coupon requirements not met"); + return $false; + } + $row = $db->fetch_row($result); + $req['price'] = $row['price']; + + switch($req['code']){ + case '0': // various qtty requirements + case '3': + case '4': + $available_qty = $row['qty'] - ($row['couponqtty'] * $req['value']); + if ($available_qty < $req['value']){ + // Coupon requirement not met + if ($row['couponqtty'] > 0) + $json['output'] = DisplayLib::boxMsg("Coupon already applied"); + else + $json['output'] = DisplayLib::boxMsg("Coupon requires ".$req['value']." items"); + return false; + } + break; + case '1': + $available_ttl = $row['total'] - ($row['couponqtty'] * $req['value']); + if ($available_ttl < $req['value']){ + // Coupon requirement not met + if ($row['couponqtty'] > 0) + $json['output'] = DisplayLib::boxMsg("Coupon already applied"); + else + $json['output'] = DisplayLib::boxMsg("Coupon requires ".$req['value']." items"); + return false; + } + break; + case '9': + $json['output'] = DisplayLib::boxMsg("Tender coupon manually"); + return false; + default: + $json['output'] = DisplayLib::boxMsg("Error: bad coupon"); + return false; + } + + return true; // requirement validated + } + +} + +/* +$obj = new DatabarCoupon(); +$obj->handle("8110100707340143853100110110",array()); +$obj->handle("811010041570000752310011020096000",array()); +$obj->handle("8110007487303085831001200003101130",array()); +*/ + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialUPCs/HouseCoupon.php b/pos/is4c-nf/lib/Scanning/SpecialUPCs/HouseCoupon.php new file mode 100644 index 000000000..b04e356aa --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialUPCs/HouseCoupon.php @@ -0,0 +1,350 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class HouseCoupon + WFC style custom store coupons + + This class looks for UPC prefix 00499999 + + The remainder of the UPC is an ID value + to look up requirement(s) and discount + via the houseCoupons and houseCouponItems + tables +*/ +class HouseCoupon extends SpecialUPC { + + function is_special($upc){ + if (substr($upc,0,8) == "00499999") + return true; + + return false; + } + + function handle($upc,$json){ + global $CORE_LOCAL; + + $coupID = ltrim(substr($upc,-5),"0"); + $leadDigits = substr($upc,3,5); + + /* make sure the coupon exists + * and isn't expired + */ + $db = Database::pDataConnect(); + $infoQ = "select endDate,".$db->identifier_escape('limit'). + ",discountType, department, + discountValue,minType,minValue,memberOnly, + case when endDate is NULL then 0 else + ".$db->datediff('endDate',$db->now())." end as expired + from + houseCoupons where coupID=".$coupID; + $infoR = $db->query($infoQ); + if ($db->num_rows($infoR) == 0){ + $json['output'] = DisplayLib::boxMsg(_("coupon not found")); + return $json; + } + $infoW = $db->fetch_row($infoR); + if ($infoW["expired"] < 0){ + $expired = substr($infoW["endDate"],0,strrpos($infoW["endDate"]," ")); + $json['output'] = DisplayLib::boxMsg(_("coupon expired")." ".$expired); + return $json; + } + + /* check the number of times this coupon + * has been used in this transaction + * against the limit */ + $transDB = Database::tDataConnect(); + $limitQ = "select case when sum(ItemQtty) is null + then 0 else sum(ItemQtty) end + from localtemptrans where + upc = '".$upc."'"; + $limitR = $transDB->query($limitQ); + $times_used = array_pop($transDB->fetch_row($limitR)); + if ($times_used >= $infoW["limit"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon already applied")); + return $json; + } + + /* check for member-only, tigher use tracking + available with member coupons */ + if ($infoW["memberOnly"] == 1 and + ($CORE_LOCAL->get("memberID") == "0" or $CORE_LOCAL->get("isMember") != 1) + ){ + $json['output'] = DisplayLib::boxMsg(_("Member only coupon")."<br />". + _("Apply member number first")); + return $json; + } + else if ($infoW["memberOnly"] == 1 && $CORE_LOCAL->get("standalone")==0){ + $mDB = Database::mDataConnect(); + $mR = $mDB->query("SELECT quantity FROM houseCouponThisMonth + WHERE card_no=".$CORE_LOCAL->get("memberID")." and + upc='$upc'"); + if ($mDB->num_rows($mR) > 0){ + $uses = array_pop($mDB->fetch_row($mR)); + if ($infoW["limit"] >= $uses){ + $json['output'] = DisplayLib::boxMsg(_("Coupon already used")."<br />". + _("on this membership")); + return $json; + } + } + } + + /* verify the minimum purchase has been made */ + switch($infoW["minType"]){ + case "Q": // must purchase at least X + $minQ = "select case when sum(ItemQtty) is null + then 0 else sum(ItemQtty) end + from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID; + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty < $infoW["minValue"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case "Q+": // must purchase more than X + $minQ = "select case when sum(ItemQtty) is null + then 0 else sum(ItemQtty) end + from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID; + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty <= $infoW["minValue"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case 'D': // must at least purchase from department + $minQ = "select case when sum(total) is null + then 0 else sum(total) end + from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID; + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty < $infoW["minValue"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case 'D+': // must more than purchase from department + $minQ = "select case when sum(total) is null + then 0 else sum(total) end + from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID; + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty <= $infoW["minValue"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case 'M': // must purchase at least X qualifying items + // and some quantity corresponding discount items + $minQ = "select case when sum(ItemQtty) is null then 0 else + sum(ItemQtty) end + from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=$coupID + and h.type = 'QUALIFIER'"; + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + + $min2Q = "select case when sum(ItemQtty) is null then 0 else + sum(ItemQtty) end + from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=$coupID + and h.type = 'DISCOUNT'"; + $min2R = $transDB->query($min2Q); + $validQtty2 = array_pop($transDB->fetch_row($min2R)); + + if ($validQtty < $infoW["minValue"] || $validQtty2 <= 0){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case '$': // must purchase at least $ total items + $minQ = "SELECT sum(total) FROM localtemptrans + WHERE trans_type IN ('I','D','M')"; + $minR = $transDB->query($minQ); + $validAmt = array_pop($transDB->fetch_row($minR)); + if ($validAmt < $infoW["minValue"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case '$+': // must purchase more than $ total items + $minQ = "SELECT sum(total) FROM localtemptrans + WHERE trans_type IN ('I','D','M')"; + $minR = $transDB->query($minQ); + $validAmt = array_pop($transDB->fetch_row($minR)); + if ($validAmt <= $infoW["minValue"]){ + $json['output'] = DisplayLib::boxMsg(_("coupon requirements not met")); + return $json; + } + break; + case '': // no minimum + case ' ': + break; + default: + $json['output'] = DisplayLib::boxMsg(_("unknown minimum type")." ".$infoW["minType"]); + return $json; + } + + /* if we got this far, the coupon + * should be valid + */ + $value = 0; + switch($infoW["discountType"]){ + case "Q": // quantity discount + // discount = coupon's discountValue + // times the cheapeast coupon item + $valQ = "select unitPrice, department from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total >0 + order by unitPrice asc"; + $valR = $transDB->query($valQ); + $valW = $transDB->fetch_row($valR); + $value = $valW[0]*$infoW["discountValue"]; + break; + case "P": // discount price + // query to get the item's department and current value + // current value minus the discount price is how much to + // take off + $value = $infoW["discountValue"]; + $deptQ = "select department,(total/quantity) as value from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total >0 + order by unitPrice asc"; + $deptR = $transDB->query($deptQ); + $row = $transDB->fetch_row($deptR); + $value = $row[1] - $value; + break; + case "FD": // flat discount for departments + // simply take off the requested amount + // scales with quantity for by-weight items + $value = $infoW["discountValue"]; + $valQ = "select department,quantity from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total > 0 + order by unitPrice asc"; + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = $row[1] * $value; + break; + case "MD": // mix discount for departments + // take off item value or discount value + // whichever is less + $value = $infoW["discountValue"]; + $valQ = "select department,l.total from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total > 0 + order by l.total desc"; + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = ($row[1] < $value) ? $row[1] : $value; + break; + case "AD": // all department discount + // apply discount across all items + // scales with quantity for by-weight items + $value = $infoW["discountValue"]; + $valQ = "select sum(quantity) from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total > 0 + order by unitPrice asc"; + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = $row[1] * $value; + break; + case "FI": // flat discount for items + // simply take off the requested amount + // scales with quantity for by-weight items + $value = $infoW["discountValue"]; + $valQ = "select l.upc,quantity from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total > 0 + order by unitPrice asc"; + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = $row[1] * $value; + break; + case "F": // completely flat; no scaling for weight + $value = $infoW["discountValue"]; + break; + case "%": // percent discount on all items + Database::getsubtotals(); + $value = $infoW["discountValue"]*$CORE_LOCAL->get("discountableTotal"); + break; + case "%D": // percent discount on all items in give department(s) + $valQ = "select sum(total) from localtemptrans + as l left join opdata".$transDB->sep()."houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT')"; + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = $row[0] * $infoW["discountValue"]; + break; + } + + $dept = $infoW["department"]; + + TransRecord::addhousecoupon($upc,$dept,-1*$value); + $json['output'] = DisplayLib::lastpage(); + $json['udpmsg'] = 'goodBeep'; + $json['redraw_footer'] = True; + return $json; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialUPCs/MagicPLU.php b/pos/is4c-nf/lib/Scanning/SpecialUPCs/MagicPLU.php new file mode 100644 index 000000000..0d25eaa68 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialUPCs/MagicPLU.php @@ -0,0 +1,73 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class MagicPLU + + This module matches specific UPCs to a function + Only here for legacy support. Probably not a great + idea. Hardcoding a function to a UPC doesn't scale + very well. Keeping track of what every special PLU + does would get messy. +*/ +class MagicPLU extends SpecialUPC { + + function is_special($upc){ + if ($upc == "0000000008005" || $upc == "0000000008006") + return true; + + return false; + } + + function handle($upc,$json){ + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + + switch(ltrim($upc,'0')){ + case '8006': + if ($CORE_LOCAL->get("memberID") == 0) + $json['main_frame'] = $my_url.'gui-modules/memlist.php'; + else if ($CORE_LOCAL->get("msgrepeat") == 0){ + $CORE_LOCAL->set("boxMsg","<B>".$total." stock payment</B><BR>insert form<BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"); + $ret["main_frame"] = $my_url."gui-modules/boxMsg2.php?endorse=stock&endorseAmt=".$total; + } + break; + case '8005': + if ($CORE_LOCAL->get("memberID") == 0) + $json['main_frame'] = $my_url.'gui-modules/memlist.php'; + elseif ($CORE_LOCAL->get("isMember") == 0) + $json['output'] = DisplayLib::boxMsg("<br />member discount not applicable"); + elseif ($CORE_LOCAL->get("percentDiscount") > 0) + $json['output'] = DisplayLib::boxMsg($CORE_LOCAL->get("percentDiscount")."% discount already applied"); + break; + } + + // magic plu, but other conditions not matched + if ($json['main_frame'] === false && empty($json['output'])) + $json['output'] = DisplayLib::boxMsg($upc."<br />is not a valid item"); + + return $json; + } +} + +?> diff --git a/pos/is4c-nf/lib/Scanning/SpecialUPCs/SpecialOrder.php b/pos/is4c-nf/lib/Scanning/SpecialUPCs/SpecialOrder.php new file mode 100644 index 000000000..e6b7295f6 --- /dev/null +++ b/pos/is4c-nf/lib/Scanning/SpecialUPCs/SpecialOrder.php @@ -0,0 +1,88 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SpecialOrder + WFC Electronic Special Orders + + Special order upc format: + prefix orderID transID + 00454 xxxxxx xx + + e.g., orderID #1, transID #1: + 0045400000101 + + These IDs are used to locate the + special order record in the + PendingSpecialOrder table on + the server database +*/ + +class SpecialOrder extends SpecialUPC { + + function is_special($upc){ + if (substr($upc,0,5) == "00454") + return true; + + return false; + } + + function handle($upc,$json){ + global $CORE_LOCAL; + + $orderID = substr($upc,5,6); + $transID = substr($upc,11,2); + + if ((int)$transID === 0){ + $json['output'] = DisplayLib::boxMsg(_("Not a valid order")); + return $json; + } + + $db = Database::mDataConnect(); + $query = sprintf("SELECT upc,description,department, + quantity,unitPrice,total,regPrice,d.dept_tax,d.dept_fs, + ItemQtty,p.discountable + FROM PendingSpecialOrder as p LEFT JOIN + is4c_op.departments AS d ON p.department=d.dept_no + WHERE order_id=%d AND trans_id=%d", + $orderID,$transID); + $result = $db->query($query); + + if ($db->num_rows($result) != 1){ + $json['output'] = DisplayLib::boxMsg(_("Order not found")); + return $json; + } + + $row = $db->fetch_array($result); + TransRecord::addItem($row['upc'],$row['description'],'I','','',$row['department'],$row['quantity'], + $row['unitPrice'],$row['total'],$row['regPrice'],0,$row['dept_tax'], + $row['dept_fs'],0.00,0.00,$row['discountable'],0,$row['ItemQtty'],0,0,0,$orderID,$transID,0,0.00,0,'SO'); + $json['output'] = DisplayLib::lastpage(); + $json['udpmsg'] = 'goodBeep'; + $json['redraw_footer'] = True; + + return $json; + } +} + +?> diff --git a/pos/is4c-nf/lib/Search/Products/DefaultProductSearch.php b/pos/is4c-nf/lib/Search/Products/DefaultProductSearch.php new file mode 100644 index 000000000..70fed9102 --- /dev/null +++ b/pos/is4c-nf/lib/Search/Products/DefaultProductSearch.php @@ -0,0 +1,47 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultProductSearch + Look up products in the database +*/ +class DefaultProductSearch extends ProductSearch { + + public function search($str){ + $ret = array(); + $sql = Database::pDataConnect(); + $query = "select upc, description, normal_price, special_price, " + ."advertised, scale from products where " + ."description like '%".$str."%' " + . "and upc LIKE ('0000000%') " + . "and inUse='1' " + ."order by description"; + $result = $sql->query($query); + while($row = $sql->fetch_row($result)){ + $ret[$row['upc']] = $row; + } + return $ret; + } +} + +?> diff --git a/pos/is4c-nf/lib/Search/Products/ProductSearch.php b/pos/is4c-nf/lib/Search/Products/ProductSearch.php new file mode 100644 index 000000000..22919b1f5 --- /dev/null +++ b/pos/is4c-nf/lib/Search/Products/ProductSearch.php @@ -0,0 +1,58 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class ProductSearch + Base class for providing product search results +*/ +class ProductSearch { + + /** + Set how big the result box is (in rows) + */ + public $result_size = 15; + + /** + Do the actual search + @param $str a search string + @return array + + The return value is an array of product records. + Each record should have the following keys: + upc + description + normal_price + scale + The records can simply be query results or + you can use some custom construction + + The outer array should be of the form + upc => record so returns from multiple searches + can be merged together easily. + */ + public function search($str){ + return array(); + } +} + +?> diff --git a/pos/is4c-nf/lib/Search/Products/ProductUserSearch.php b/pos/is4c-nf/lib/Search/Products/ProductUserSearch.php new file mode 100644 index 000000000..9c1d9ad28 --- /dev/null +++ b/pos/is4c-nf/lib/Search/Products/ProductUserSearch.php @@ -0,0 +1,54 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DefaultProductSearch + Use the productUser table to + supplement searches +*/ +class ProductUserSearch extends ProductSearch { + + public function search($str){ + $ret = array(); + $sql = Database::pDataConnect(); + if (!$sql->table_exists('productUser')) return array(); + $query = "SELECT p.upc, + CASE WHEN u.description IS NULL THEN p.description + ELSE u.description END as description, + p.normal_price, p.special_price, p.advertised, p.scale + FROM products AS p + LEFT JOIN productUser AS u ON p.upc=u.upc + WHERE (p.description LIKE '%$str%' OR + u.description LIKE '%$str%') + AND p.upc LIKE ('0000000%') + AND p.inUse='1' + ORDER BY description"; + $result = $sql->query($query); + while($row = $sql->fetch_row($result)){ + $ret[$row['upc']] = $row; + } + return $ret; + } +} + +?> diff --git a/pos/is4c-nf/lib/SuspendLib.php b/pos/is4c-nf/lib/SuspendLib.php new file mode 100644 index 000000000..7a8c02c7b --- /dev/null +++ b/pos/is4c-nf/lib/SuspendLib.php @@ -0,0 +1,99 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class SuspendLib + Functions related to suspend and resume transaction +*/ +class SuspendLib extends LibraryClass { + +/** + Suspends the current transaction + If the remote server is available, it will be suspended + there. Otherwise it is suspended locally. +*/ +static public function suspendorder() { + global $CORE_LOCAL; + + //testremote(); + $query_a = "select emp_no, trans_no from localtemptrans"; + $db_a = Database::tDataConnect(); + $result_a = $db_a->query($query_a); + $row_a = $db_a->fetch_array($result_a); + $cashier_no = substr("000".$row_a["emp_no"], -2); + $trans_no = substr("0000".$row_a["trans_no"], -4); + + if ($CORE_LOCAL->get("standalone") == 0) { + $db_a->add_connection($CORE_LOCAL->get("mServer"),$CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"),$CORE_LOCAL->get("mUser"),$CORE_LOCAL->get("mPass")); + $cols = Database::getMatchingColumns($db_a,"localtemptrans","suspended"); + $db_a->transfer($CORE_LOCAL->get("tDatabase"),"select {$cols} from localtemptrans", + $CORE_LOCAL->get("mDatabase"),"insert into suspended ($cols)"); + $db_a->close($CORE_LOCAL->get("mDatabase"),True); + } + else { + $query = "insert into suspended select * from localtemptrans"; + $result = $db_a->query($query); + } + + /* ensure the cancel happens */ + $cancelR = $db_a->query("UPDATE localtemptrans SET trans_status='X'"); + + $CORE_LOCAL->set("plainmsg",_("transaction suspended")); + $recall_line = $CORE_LOCAL->get("standalone")." ".$CORE_LOCAL->get("laneno")." ".$cashier_no." ".$trans_no; +} + +/** + Check whether there are suspended transactions + @return + - 1 Yes + - 0 No + + This function ignores any transactions that + are not from the current day. +*/ +static public function checksuspended() { + global $CORE_LOCAL; + + //Database::testremote(); + + $db_a = Database::tDataConnect(); + $query_local = "select * from suspendedtoday"; + + $result = ""; + if ($CORE_LOCAL->get("standalone") == 1) { + $result = $db_a->query($query_local); + } else { + $db_a = Database::mDataConnect(); + $result = $db_a->query($query_local); + } + + $num_rows = $db_a->num_rows($result); + + if ($num_rows == 0) return 0; + else return 1; +} + +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/CheckTender.php b/pos/is4c-nf/lib/Tenders/CheckTender.php new file mode 100755 index 000000000..5cf1f4999 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/CheckTender.php @@ -0,0 +1,132 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class CheckTender + Tender module for checks +*/ +class CheckTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + if ( ($CORE_LOCAL->get("isMember") != 0 || $CORE_LOCAL->get("isStaff") != 0) && (($this->amount - $CORE_LOCAL->get("amtdue") - 0.005) > $CORE_LOCAL->get("dollarOver")) && ($CORE_LOCAL->get("cashOverLimit") == 1)){ + return DisplayLib::boxMsg(_("member or staff check tender cannot exceed total purchase by over $").$CORE_LOCAL->get("dollarOver")); + } + else if( $CORE_LOCAL->get("store")=="wfc" && $CORE_LOCAL->get("isMember") != 0 && ($this->amount - $CORE_LOCAL->get("amtdue") - 0.005) > 0){ + // This should really be a separate tender + // module for store-specific behavior + $db = Database::pDataConnect(); + $q = sprintf("SELECT card_no FROM custReceiptMessage + WHERE card_no=%d AND modifier_module='WfcEquityMessage'", + $CORE_LOCAL->get('memberID')); + $r = $db->query($q); + if ($db->num_rows($r) > 0){ + return DisplayLib::xboxMsg(_('member check tender cannot exceed total + purchase if equity is owed')); + } + + // multi use + if ($CORE_LOCAL->get('standalone')==0){ + $chkQ = "select trans_num from dlog + where trans_type='T' and trans_subtype in ('CA','CK') + and card_no=".((int)$CORE_LOCAL->get('memberID'))." + group by trans_num + having sum(case when trans_subtype='CK' then total else 0 end) < 0 + and sum(Case when trans_subtype='CA' then total else 0 end) > 0"; + $db = Database::mDataConnect(); + $chkR = $db->query($chkQ); + if ($db->num_rows($chkR) > 0){ + return DisplayLib::xboxMsg(_('already used check over benefit today')); + } + } + } + else if( $CORE_LOCAL->get("isMember") == 0 and $CORE_LOCAL->get("isStaff") == 0 && ($this->amount - $CORE_LOCAL->get("amtdue") - 0.005) > 0){ + return DisplayLib::xboxMsg(_('non-member check tender cannot exceed total purchase')); + } + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("enableFranking") != 1) + return True; + + // check endorsing + if ($CORE_LOCAL->get("msgrepeat") == 0){ + return $this->DefaultPrompt(); + } + + return True; + } + + function Add(){ + global $CORE_LOCAL; + // count rebate and travelers as regular checks + if ($CORE_LOCAL->get("store")=="wfc" && ($this->tender_code == "TV" || $this->tender_code == "RC")){ + $this->tender_code = "CK"; + } + parent::Add(); + } + + function DefaultPrompt(){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("enableFranking") != 1) + return parent::DefaultPrompt(); + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-" + .trim($CORE_LOCAL->get("laneno"))."-" + .trim($CORE_LOCAL->get("transno")); + + if ($this->amount === False) + $this->amount = $this->DefaultTotal(); + + $msg = "<br />"._("insert")." ".$this->name_string. + ' for $'.sprintf('%.2f',$this->amount). + "<br />"._("press enter to endorse"); + $msg .= "<p><font size='-1'>"._("clear to cancel")."</font></p>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + + $CORE_LOCAL->set("boxMsg",$msg); + $CORE_LOCAL->set('strEntered', (100*$this->amount).$this->tender_code); + + return MiscLib::base_url().'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$this->amount; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/CreditCardTender.php b/pos/is4c-nf/lib/Tenders/CreditCardTender.php new file mode 100755 index 000000000..410017f6e --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/CreditCardTender.php @@ -0,0 +1,63 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class CreditCardTender + Tender module for credit cards +*/ +class CreditCardTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + + if (($this->amount > ($CORE_LOCAL->get("amtdue") + 0.005)) && $CORE_LOCAL->get("amtdue") >= 0){ + return DisplayLib::xboxMsg(_("tender cannot exceed purchase amount")); + } + + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + if ($this->tender_code == 'CC' && $CORE_LOCAL->get('store') == 'wfc') + $CORE_LOCAL->set('kickOverride',True); + return True; + } + + function AllowDefault(){ + if ($this->tender_code == 'CC' && $CORE_LOCAL->get('store') == 'wfc') + return True; + else + return False; + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/DisabledTender.php b/pos/is4c-nf/lib/Tenders/DisabledTender.php new file mode 100644 index 000000000..b1e7ab962 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/DisabledTender.php @@ -0,0 +1,38 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class DisabledTender + Tender module for disabling tenders + Deleting opdata.tenders records would work too, + of course. This just displays an error message + instead. +*/ +class DisabledTender extends TenderModule { + + function ErrorCheck(){ + return DisplayLib::xboxMsg($this->name_string." "._("tender disabled")); + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/FoodstampTender.php b/pos/is4c-nf/lib/Tenders/FoodstampTender.php new file mode 100644 index 000000000..bfb8d38ca --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/FoodstampTender.php @@ -0,0 +1,63 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class FoodstampTender + Tender module for EBT +*/ +class FoodstampTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("fntlflag") == 0){ + return DisplayLib::boxMsg(_("eligible amount must be totaled before foodstamp tender can be accepted")); + } + else if ($this->amount > ($CORE_LOCAL->get("fsEligible")+10)){ + return DisplayLib::xboxMsg(_('Foodstamp tender cannot exceed eligible amount by over $10.00')); + } + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + return True; + } + + function Add(){ + parent::Add(); + TransRecord::addfsTaxExempt(); + } + + function AllowDefault(){ + return False; + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/GiftCardTender.php b/pos/is4c-nf/lib/Tenders/GiftCardTender.php new file mode 100644 index 000000000..8ce036fa7 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/GiftCardTender.php @@ -0,0 +1,55 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class GiftCardTender + Tender module for credit cards +*/ +class GiftCardTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + + if (($this->amount > ($CORE_LOCAL->get("amtdue") + 0.005)) && $CORE_LOCAL->get("amtdue") >= 0){ + return DisplayLib::xboxMsg(_("tender cannot exceed purchase amount")); + } + + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + $CORE_LOCAL->set("autoReprint",1); + return True; + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/GiftCertificateTender.php b/pos/is4c-nf/lib/Tenders/GiftCertificateTender.php new file mode 100644 index 000000000..2eec69321 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/GiftCertificateTender.php @@ -0,0 +1,85 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class GiftCertificateTender + Tender module for gift certificates +*/ +class GiftCertificateTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + $CORE_LOCAL->set("autoReprint",1); + + if ($CORE_LOCAL->get("enableFranking") != 1) + return True; + + if ($CORE_LOCAL->get("msgrepeat") == 0){ + return $this->DefaultPrompt(); + } + return True; + } + + function DefaultPrompt(){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("enableFranking") != 1) + return parent::DefaultPrompt(); + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-" + .trim($CORE_LOCAL->get("laneno"))."-" + .trim($CORE_LOCAL->get("transno")); + + if ($this->amount === False) + $this->amount = $this->DefaultTotal(); + + $msg = "<br />"._("insert")." ".$this->name_string. + ' for $'.sprintf('%.2f',$this->amount). + "<br />"._("press enter to endorse"); + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + + $CORE_LOCAL->set('strEntered', (100*$this->amount).$this->tender_code); + $CORE_LOCAL->set("boxMsg",$msg); + + return MiscLib::base_url().'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$this->amount; + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/RefundAndCashbackTender.php b/pos/is4c-nf/lib/Tenders/RefundAndCashbackTender.php new file mode 100644 index 000000000..cc90fd5ab --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/RefundAndCashbackTender.php @@ -0,0 +1,45 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class RefundAndCashBackTender + Module for tenders where change records + on refund transactions should have one + trans_subtype (tenders.TenderCode) and + change on cash-back transactions should + have a different one (tenders.TenderType) +*/ +class RefundAndCashBackTender extends TenderModule { + + /** + What type should be used for change records associated with this tender. + @return string tender code + */ + function ChangeType(){ + if ($this->amount == 0) return $this->tender_code; + else return $this->change_type; + } + +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/StoreChargeTender.php b/pos/is4c-nf/lib/Tenders/StoreChargeTender.php new file mode 100644 index 000000000..9d453bf21 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/StoreChargeTender.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class StoreChargeTender + Tender module for charge accounts +*/ +class StoreChargeTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + $charge_ok = PrehLib::chargeOk(); + + if ($charge_ok == 0){ + return DisplayLib::boxMsg(_("member")." ".$CORE_LOCAL->get("memberID")."<br />". + _("is not authorized")."<br />"._("to make charges")); + } + else if ($CORE_LOCAL->get("availBal") < 0){ + return DisplayLib::boxMsg(_("member")." ".$CORE_LOCAL->get("memberID")."<br />"._("is over limit")); + } + elseif ((abs($CORE_LOCAL->get("memChargeTotal"))+ $this->amount) >= ($CORE_LOCAL->get("availBal") + 0.005)){ + $memChargeRemain = $CORE_LOCAL->get("availBal"); + $memChargeCommitted = $memChargeRemain + $CORE_LOCAL->get("memChargeTotal"); + return DisplayLib::xboxMsg(_("available balance for charge")."<br />"._("is only \$").$memChargeCommitted); + } + elseif(MiscLib::truncate2($CORE_LOCAL->get("amtdue")) < MiscLib::truncate2($this->amount)) { + return DisplayLib::xboxMsg(_("charge tender exceeds purchase amount")); + } + + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + $pref = CoreState::getCustomerPref('store_charge_see_id'); + if ($pref == 'yes'){ + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("boxMsg","<BR>please verify member ID</B><BR>press [enter] to continue<P><FONT size='-1'>[clear] to cancel</FONT>"); + return MiscLib::base_url().'gui-modules/boxMsg2.php?quiet=1'; + } + } + return True; + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/StoreTransferTender.php b/pos/is4c-nf/lib/Tenders/StoreTransferTender.php new file mode 100644 index 000000000..74bd68290 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/StoreTransferTender.php @@ -0,0 +1,86 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class StoreTransfer + Tender module for inter-departmental transfers + Requires Mgr. password +*/ +class StoreTransferTender extends TenderModule { + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + + if(MiscLib::truncate2($CORE_LOCAL->get("amtdue")) < MiscLib::truncate2($this->amount)) { + return DisplayLib::xboxMsg(_("store transfer exceeds purchase amount")); + } + + $db = Database::pDataConnect(); + $query = 'SELECT chargeOk FROM custdata WHERE chargeOk=1 AND CardNo='.$CORE_LOCAL->get('memberID'); + $result = $db->query($query); + if ($db->num_rows($result) == 0){ + return DisplayLib::xboxMsg(_("member cannot make transfers")); + } + + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + + if ($CORE_LOCAL->get("transfertender") != 1){ + $CORE_LOCAL->set("transfertender",1); + return $my_url."gui-modules/adminlogin.php?class=StoreTransferTender"; + } + else { + $CORE_LOCAL->set("transfertender",0); + return True; + } + } + + public static $adminLoginMsg = 'Login for store transfer'; + public static $adminLoginLevel = 30; + public static function adminLoginCallback($success){ + global $CORE_LOCAL; + if ($success){ + $CORE_LOCAL->set('strRemembered', $CORE_LOCAL->get('strEntered')); + $CORE_LOCAL->set('msgrepeat', 1); + return True; + } + else { + $CORE_LOCAL->set('transfertender', 0); + return False; + } + } +} + +?> diff --git a/pos/is4c-nf/lib/Tenders/TenderModule.php b/pos/is4c-nf/lib/Tenders/TenderModule.php new file mode 100644 index 000000000..258447631 --- /dev/null +++ b/pos/is4c-nf/lib/Tenders/TenderModule.php @@ -0,0 +1,181 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class TenderModule + Base class for modular tenders +*/ +class TenderModule { + + var $tender_code; + var $amount; + + var $name_string; + var $change_type; + var $change_string; + var $min_limit; + var $max_limit; + + /** + Constructor + @param $code two letter tender code + @param $amt tender amount + + If you override this, be sure to call the + parent constructor + */ + function TenderModule($code, $amt){ + $this->tender_code = $code; + $this->amount = $amt; + + $db = Database::pDataConnect(); + $query = "select TenderID,TenderCode,TenderName,TenderType, + ChangeMessage,MinAmount,MaxAmount,MaxRefund from + tenders where tendercode = '".$this->tender_code."'"; + $result = $db->query($query); + + if ($db->num_rows($result) > 0){ + $row = $db->fetch_array($result); + $this->name_string = $row['TenderName']; + $this->change_type = $row['TenderType']; + $this->change_string = $row['ChangeMessage']; + $this->min_limit = $row['MinAmount']; + $this->max_limit = $row['MaxAmount']; + } + else { + $this->name_string = ''; + $this->change_string = ''; + $this->min_limit = 0; + $this->max_limit = 0; + $this->change_type = 'CA'; + } + } + + /** + Check for errors + @return True or an error message string + */ + function ErrorCheck(){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("LastID") == 0){ + return DisplayLib::boxMsg(_("no transaction in progress")); + } + elseif ($this->amount > 9999.99){ + return DisplayLib::boxMsg(_("tender amount of")." ".$this->amount."<br />"._("exceeds allowable limit")); + } + elseif ($CORE_LOCAL->get("ttlflag") == 0) { + return DisplayLib::boxMsg(_("transaction must be totaled before tender can be accepted")); + } + else if ($this->name_string === ""){ + return DisplayLib::inputUnknown(); + } + + return True; + } + + /** + Set up state and redirect if needed + @return True or a URL to redirect + */ + function PreReqCheck(){ + global $CORE_LOCAL; + if ($this->amount > $this->max_limit && $CORE_LOCAL->get("msgrepeat") == 0){ + $CORE_LOCAL->set("boxMsg","$".$this->amount." "._("is greater than tender limit for") + ." ".$this->name_string."<p>" + ."<font size='-1'>"._("clear to cancel").", "._("enter to proceed")."</font>"); + return MiscLib::base_url().'gui-modules/boxMsg2.php'; + } + + if ($this->amount - $CORE_LOCAL->get("amtdue") > 0) { + $CORE_LOCAL->set("change",$this->amount - $CORE_LOCAL->get("amtdue")); + $CORE_LOCAL->set("ChangeType", $this->change_type); + } + else { + $CORE_LOCAL->set("change",0); + } + return True; + } + + /** + Add tender to the transaction + */ + function Add(){ + TransRecord::addItem('', $this->name_string, "T", $this->tender_code, + "", 0, 0, 0, -1*$this->amount, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + + /** + What type should be used for change records associated with this tender. + @return string tender code + */ + function ChangeType(){ + return $this->change_type; + } + + /** + Allow the tender to be used without specifying a total + @return boolean + */ + function AllowDefault(){ + return True; + } + + /** + Value to use if no total is provided + @return number + */ + function DefaultTotal(){ + global $CORE_LOCAL; + return $CORE_LOCAL->get('amtdue'); + } + + /** + Prompt for the cashier when no total is provided + @return string URL + + Typically this sets up session variables and returns + the URL for boxMsg2.php. + */ + function DefaultPrompt(){ + global $CORE_LOCAL; + $amt = $this->DefaultTotal(); + $CORE_LOCAL->set('boxMsg', '<br />tender $'.sprintf('%.2f',$amt).' as '.$this->name_string + .'<br />press [enter] to continue<br /> + <font size="-1">[clear] to cancel</font>'); + $CORE_LOCAL->set('strEntered', (100*$amt).$this->tender_code); + return MiscLib::base_url().'gui-modules/boxMsg2.php'; + } + + /** + Error message shown if tender cannot be used without + specifying a total + @return html string + */ + function DisabledPrompt(){ + return DisplayLib::boxMsg('Amount required for '.$this->name_string); + } + +} + +?> diff --git a/pos/is4c-nf/lib/TransRecord.php b/pos/is4c-nf/lib/TransRecord.php new file mode 100644 index 000000000..f7c85bdef --- /dev/null +++ b/pos/is4c-nf/lib/TransRecord.php @@ -0,0 +1,746 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 10Apr2013 Andy Theuninck Filter backslash out of comments + * 19Jan2013 Eric Lee Fix typo "Datbase" in reverseTaxExempt + +*/ + +/** + @class TransRecord + Defines functions for adding records to the transaction +*/ +class TransRecord extends LibraryClass { + +/*------------------------------------------------------------------------------ +additem.php is the bread and butter of IT CORE. addItem inserts the information +stream for each item scanned, entered or transaction occurence into localtemptrans. +Each of the above follows the following structure for entry into localtemptrans: + $strupc, + $strdescription, + $strtransType, + $strtranssubType, + $strtransstatus, + $intdepartment, + $dblquantity, + $dblunitPrice, + $dbltotal, + $dblregPrice, + $intscale, + $inttax, + $intfoodstamp, + $dbldiscount, + $dblmemDiscount, + $intdiscountable, + $intdiscounttype, + $dblItemQtty, + $intvolDiscType, + $intvolume, + $dblVolSpecial, + $intmixMatch, + $intmatched, + $intvoided + +Additionally, additem.php inserts entries into the activity log when a cashier +signs in +-------------------------------------------------------------------------------*/ + +//-------insert line into localtemptrans with standard insert string-------------- + +/** + Add an item to localtemptrans. + Parameters correspond to columns in localtemptrans. See that table + for valid types. + @param $strupc localtemptrans.upc + @param $strdescription localtemptrans.description + @param $strtransType localtemptrans.trans_type + @param $strtranssubType localtemptrans.trans_subtype + @param $strtransstatuts localtemptrans.trans_status + @param $dblquantity localtemptrans.quantity + @param $dblunitPrice localtemptrans.unitPrice + @param $dbltotal localtemptrans.total + @param $dblregPrice localtemptrans.regPrice + @param $intscale localtemptrans.scale + @param $inttax localtemptrans.tax + @param $intfoodstamp localtemptrans.foodstamp + @param $dbldiscount localtemptrans.discount + @param $dblmemDiscount localtemptrans.memDiscount + @param $intdiscountable localtemptrans.discounttable + @param $intdiscounttype localtemptrans.discounttype + @param $dblItemQtty localtemptrans.ItemQtty + @param $intvolDiscType localtemptrans.volDiscType + @param $intvolume localtemptrans.volume + @param $dblVolSpecial localtemptrans.VolSpecial + @param $intmixMatch localtemptrans.mixMatch + @param $intmatched localtemptrans.matched + @param $intvoided localtemptrans.voided + @param $cost localtemptrans.cost + @param $numflag localtemptrans.numflag + @param $charflag localtemptrans.charflag + + In many cases there is a simpler function that takes far + fewer arguments and adds a specific type of record. + All such functions should be in this file. +*/ +static public function addItem($strupc, $strdescription, $strtransType, $strtranssubType, $strtransstatus, $intdepartment, $dblquantity, $dblunitPrice, $dbltotal, $dblregPrice, $intscale, $inttax, $intfoodstamp, $dbldiscount, $dblmemDiscount, $intdiscountable, $intdiscounttype, $dblItemQtty, $intvolDiscType, $intvolume, $dblVolSpecial, $intmixMatch, $intmatched, $intvoided, $cost=0, $numflag=0, $charflag='') { + global $CORE_LOCAL; + //$dbltotal = MiscLib::truncate2(str_replace(",", "", $dbltotal)); replaced by apbw 7/27/05 with the next 4 lines -- to fix thousands place errors + + $dbltotal = str_replace(",", "", $dbltotal); + $dbltotal = number_format($dbltotal, 2, '.', ''); + $dblunitPrice = str_replace(",", "", $dblunitPrice); + $dblunitPrice = number_format($dblunitPrice, 2, '.', ''); + + if ($CORE_LOCAL->get("refund") == 1) { + $dblquantity = (-1 * $dblquantity); + $dbltotal = (-1 * $dbltotal); + $dbldiscount = (-1 * $dbldiscount); + $dblmemDiscount = (-1 * $dblmemDiscount); + + if ($strtransstatus != "V" && $strtransstatus != "D") $strtransstatus = "R" ; // edited by apbw 6/04/05 to correct voiding of refunded items + + $CORE_LOCAL->set("refund",0); + $CORE_LOCAL->set("refundComment",""); + $CORE_LOCAL->set("autoReprint",1); + + if ($CORE_LOCAL->get("refundDiscountable")==0) + $intdiscountable = 0; + } + + /* Nothing in the code can set $_SESSION["void"] to 1 + elseif ($_SESSION["void"] == 1) { + $dblquantity = (-1 * $dblquantity); + $dbltotal = (-1 * $dbltotal); + $strtransstatus = "V"; + $_SESSION["void"] = 0; + } + */ + + + $intregisterno = $CORE_LOCAL->get("laneno"); + $intempno = $CORE_LOCAL->get("CashierNo"); + $inttransno = $CORE_LOCAL->get("transno"); + $strCardNo = $CORE_LOCAL->get("memberID"); + $memType = $CORE_LOCAL->get("memType"); + $staff = $CORE_LOCAL->get("isStaff"); + $percentDiscount = $CORE_LOCAL->get("percentDiscount"); + + $db = Database::tDataConnect(); + + $datetimestamp = ""; + if ($CORE_LOCAL->get("DBMS") == "mssql") { + $datetimestamp = strftime("%m/%d/%y %H:%M:%S %p", time()); + } else { + $datetimestamp = strftime("%Y-%m-%d %H:%M:%S", time()); + } + + // this session variable never gets used + //$_SESSION["datetimestamp"] = $datetimestamp; + $CORE_LOCAL->set("LastID",$CORE_LOCAL->get("LastID") + 1); + + $trans_id = $CORE_LOCAL->get("LastID"); + + $values = array( + 'datetime' => $datetimestamp, + 'register_no' => $intregisterno, + 'emp_no' => $intempno, + 'trans_no' => MiscLib::nullwrap($inttransno), + 'upc' => MiscLib::nullwrap($strupc), + 'description' => $db->escape($strdescription), + 'trans_type' => MiscLib::nullwrap($strtransType), + 'trans_subtype' => MiscLib::nullwrap($strtranssubType), + 'trans_status' => MiscLib::nullwrap($strtransstatus), + 'department' => MiscLib::nullwrap($intdepartment), + 'quantity' => MiscLib::nullwrap($dblquantity), + 'cost' => MiscLib::nullwrap($cost), + 'unitPrice' => MiscLib::nullwrap($dblunitPrice), + 'total' => MiscLib::nullwrap($dbltotal), + 'regPrice' => MiscLib::nullwrap($dblregPrice), + 'scale' => MiscLib::nullwrap($intscale), + 'tax' => MiscLib::nullwrap($inttax), + 'foodstamp' => MiscLib::nullwrap($intfoodstamp), + 'discount' => MiscLib::nullwrap($dbldiscount), + 'memDiscount' => MiscLib::nullwrap($dblmemDiscount), + 'discountable' => MiscLib::nullwrap($intdiscountable), + 'discounttype' => MiscLib::nullwrap($intdiscounttype), + 'ItemQtty' => MiscLib::nullwrap($dblItemQtty), + 'volDiscType' => MiscLib::nullwrap($intvolDiscType), + 'volume' => MiscLib::nullwrap($intvolume), + 'VolSpecial' => MiscLib::nullwrap($dblVolSpecial), + 'mixMatch' => MiscLib::nullwrap($intmixMatch), + 'matched' => MiscLib::nullwrap($intmatched), + 'voided' => MiscLib::nullwrap($intvoided), + 'memType' => MiscLib::nullwrap($memType), + 'staff' => MiscLib::nullwrap($staff), + 'percentDiscount'=> MiscLib::nullwrap($percentDiscount), + 'numflag' => MiscLib::nullwrap($numflag), + 'charflag' => $charflag, + 'card_no' => (string)$strCardNo + ); + if ($CORE_LOCAL->get("DBMS") == "mssql" && $CORE_LOCAL->get("store") == "wfc"){ + unset($values["staff"]); + $values["isStaff"] = MiscLib::nullwrap($staff); + } + + $db->smart_insert("localtemptrans",$values); + + if ($strtransType == "I" || $strtransType == "D") { + $CORE_LOCAL->set("repeatable",1); + } + + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $CORE_LOCAL->set("SNR",0); + + if ($intscale == 1) + $CORE_LOCAL->set("lastWeight",$dblquantity); +} + +/** + Add a item, but not until the end of the transaction + Use this for records that shouldn't be displayed +*/ +static public function addQueued($upc, $description, $numflag=0, $charflag='',$regPrice=0){ + global $CORE_LOCAL; + $queue = $CORE_LOCAL->get("infoRecordQueue"); + if (!is_array($queue)) $queue = array(); + $queue[] = array('upc'=>$upc,'description'=>$description, + 'numflag'=>$numflag,'charflag'=>$charflag, + 'regPrice'=>$regPrice); + $CORE_LOCAL->set("infoRecordQueue", $queue); +} + +/** + Add records queued by TransRecord::addQueued + to the current transaction then clear the queue. + Records get trans_type C, trans_status D +*/ +static public function emptyQueue(){ + global $CORE_LOCAL; + $queue = $CORE_LOCAL->get("infoRecordQueue"); + if (!is_array($queue)) $queue = array(); + foreach($queue as $record){ + if (!isset($record['upc']) || !isset($record['description']) || + !isset($record['numflag']) || !isset($record['charflag']) || + !isset($record['regPrice'])){ + continue; //skip incomplete + } + self::addItem($record['upc'], $record['description'], "C", "", "D", + 0, 0, 0, 0, $record['regPrice'], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, $record['numflag'], $record['charflag']); + } + $CORE_LOCAL->set("infoRecordQueue",array()); +} + +//________________________________end addItem() + + +//---------------------------------- insert tax line item -------------------------------------- + +/** + Add a tax record to the transaction. Amount is + pulled from session info automatically. +*/ +static public function addtax() { + global $CORE_LOCAL; + + if (True){ + self::addItem("TAX", "Tax", "A", "", "", 0, 0, 0, $CORE_LOCAL->get("taxTotal"), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return; + } + + /* line-item taxes in transaction + intentionally disabled for now + */ + + $db = Database::tDataConnect(); + $q = "SELECT id, description, taxTotal, fsTaxable, fsTaxTotal, foodstampTender, taxrate + FROM taxView ORDER BY taxrate DESC"; + $r = $db->query($q); + + $fsTenderAvailable = null; + while($w = $db->fetch_row($r)){ + if ($fsTenderAvailable === null) $fsTenderAvailable = (double)$w['foodstampTender']; + + // whole amount purchased w/ foodstamps; exempt all fsTax + if ($fsTenderAvailable >= $w['fsTaxable']){ + $w['taxTotal'] -= $w['fsTaxTotal']; + $fsTenderAvailable -= $w['fsTaxable']; + } + // partial; exempt proportionally + else if ($fsTenderAvailable > 0 && $fsTenderAvailable < $w['fsTaxable']){ + $exempt = $fsTenderAvailable * $w['taxrate']; + $w['taxTotal'] -= $exempt; + $fsTenderAvailable = 0.00; + } + + self::addItem("TAX", substr($w['description']." Tax",0,35), "A", "", "", 0, 0, 0, + MiscLib::truncate2($w['taxTotal']), 0, 0, $w['id'], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + +} + +//________________________________end addtax() + + +//---------------------------------- insert tender line item ----------------------------------- + +/** + Add a tender record to the transaction + @param $strtenderdesc is a description, such as "Credit Card" + @param $strtendercode is a 1-2 character code, such as "CC" + @param $dbltendered is the amount. Remember that payments are + <i>negative</i> amounts. +*/ +static public function addtender($strtenderdesc, $strtendercode, $dbltendered) { + self::addItem("", $strtenderdesc, "T", $strtendercode, "", 0, 0, 0, $dbltendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//_______________________________end addtender() + + +/** + Add a comment to the transaction + @param $comment is the comment text. Max length allowed + is 30 characters. +*/ +static public function addcomment($comment) { + if (strlen($comment) > 30) + $comment = substr($comment,0,30); + $comment = str_replace("\\",'',$comment); + self::addItem("",$comment, "C", "CM", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + + +//--------------------------------- insert change line item ------------------------------------ + +/** + Add a change record (a special type of tender record) + @param $dblcashreturn the change amount +*/ +static public function addchange($dblcashreturn,$strtendercode='CA') { + global $CORE_LOCAL; + self::addItem("", "Change", "T", $strtendercode, "", 0, 0, 0, $dblcashreturn, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addchange() + + +//-------------------------------- insert foods stamp change item ------------------------------ + +/** + Add a foodstamp change record + @param $intfsones the change amount + + Please do verify cashback is permitted with EBT transactions + in your area before using this. +*/ +static public function addfsones($intfsones) { + self::addItem("", "FS Change", "T", "FS", "", 0, 0, 0, $intfsones, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addfsones() + +/** + Add end of shift record + @deprecated +*/ +static public function addEndofShift() { + self::addItem("ENDOFSHIFT", "End of Shift", "S", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//-------------------------------- insert deli discount (Wedge specific) ----------------------- + +/** + Add Wedge deli discount + @deprecated +*/ +static public function addscDiscount() { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("scDiscount") != 0) { + self::addItem("DISCOUNT", "** 10% Deli Discount **", "I", "", "", 0, 1, MiscLib::truncate2(-1 * $CORE_LOCAL->get("scDiscount")), MiscLib::truncate2(-1 * $CORE_LOCAL->get("scDiscount")), 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2); + } +// addStaffCoffeeDiscount(); + +} + +/** + Add Wedge coffee discount + @deprecated +*/ +static public function addStaffCoffeeDiscount() { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("staffCoffeeDiscount") != 0) { + self::addItem("DISCOUNT", "** Coffee Discount **", "I", "", "", 0, 1, MiscLib::truncate2(-1 * $CORE_LOCAL->get("staffCoffeeDiscount")), MiscLib::truncate2(-1 * $CORE_LOCAL->get("staffCoffeeDiscount")), 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2); + } +} + +//_______________________________end addscDiscount() + + +//------------------------------- insert discount line ----------------------------------------- + +/***** jqh 09/29/05 changed adddiscount function to write the department to localtemptrans *****/ +/** + Add a "YOU SAVED" record to the transaction. This is just informational + and will not alter totals. + @param $dbldiscount discount amount + @param $department associated department +*/ +static public function adddiscount($dbldiscount,$department) { + global $CORE_LOCAL; + $strsaved = "** YOU SAVED $".MiscLib::truncate2($dbldiscount)." **"; + if ($CORE_LOCAL->get("itemPD") > 0){ + $strsaved = sprintf("** YOU SAVED \$%.2f (%d%%) **", + $dbldiscount,$CORE_LOCAL->get("itemPD")); + } + self::addItem("", $strsaved, "I", "", "D", $department, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2); +} + +//_____________________________end adddiscount() + + +//------------------------------ insert Food Stamp Tax Exempt line ----------------------------- + + +/** + Add tax exemption for foodstamps +*/ +static public function addfsTaxExempt() { + global $CORE_LOCAL; + + Database::getsubtotals(); + self::addItem("FS Tax Exempt", " Fs Tax Exempt ", "C", "", "D", 0, 0, $CORE_LOCAL->get("fsTaxExempt"), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17); +} + +//_____________________________end addfsTaxExempt() + + +//------------------------------ insert 'discount applied' line -------------------------------- + +/** + Add a information record showing transaction percent discount + @param $strl the percentage +*/ +static public function discountnotify($strl) { + if ($strl == 10.01) { + $strL = 10; + } + self::addItem("", "** ".$strl."% Discount Applied **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4); +} + +//_____________________________end discountnotify() + + +//------------------------------- insert discount line ----------------------------------------- + +//------------------------------- insert tax exempt statement line ----------------------------- + +/** + Add tax exemption record to transaction +*/ +static public function addTaxExempt() { + global $CORE_LOCAL; + + self::addItem("", "** Order is Tax Exempt **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + $CORE_LOCAL->set("TaxExempt",1); + Database::setglobalvalue("TaxExempt", 1); +} + +//_____________________________end addTaxExempt() + + +//------------------------------ insert reverse tax exempt statement --------------------------- + +/** + Add record to undo tax exemption +*/ +static public function reverseTaxExempt() { + global $CORE_LOCAL; + self::addItem("", "** Tax Exemption Reversed **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + $CORE_LOCAL->set("TaxExempt",0); + Database::setglobalvalue("TaxExempt", 0); +} + +//_____________________________end reverseTaxExempt() + +//------------------------------ insert case discount statement -------------------------------- + +/** + Add an informational record noting case discount + $CORE_LOCAL setting "casediscount" controls the percentage + shown +*/ +static public function addcdnotify() { + global $CORE_LOCAL; + self::addItem("", "** ".$CORE_LOCAL->get("casediscount")."% Case Discount Applied", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); +} + +//____________________________end addcdnotify() + +//------------------------------ insert manufacturer coupon statement -------------------------- + +/** + Add a manufacturer coupon record + @param $strupc coupon UPC + @param $intdepartment associated POS department + @param $dbltotal coupon amount (should be negative) + @param $foodstamp mark coupon foodstamp-able + @param $tax mark coupon as taxable + + Marking a coupon as taxable will *reduce* the taxable + total by the coupon amount. This is not desirable in + all tax jurisdictions. The ini setting 'CouponsAreTaxable' + controls whether the tax parameter is used. +*/ +static public function addCoupon($strupc, $intdepartment, $dbltotal, $foodstamp=0, $tax=0) { + global $CORE_LOCAL; + if ($CORE_LOCAL->get('CouponsAreTaxable') !== 0) + $tax = 0; + self::addItem($strupc, " * Manufacturers Coupon", "I", "CP", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, $tax, $foodstamp, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add an in-store coupon + @param $strupc coupon UPC + @param $intdepartment associated POS department + @param $dbltotal coupon amount (should be negative) +*/ +static public function addhousecoupon($strupc, $intdepartment, $dbltotal) { + self::addItem($strupc, " * Store Coupon", "I", "IC", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add a line-item discount + @param $intdepartment POS department + @param $dbltotal discount amount (should be <b>positive</b>) +*/ +static public function additemdiscount($intdepartment, $dbltotal) { + $dbltotal *= -1; + self::addItem('ITEMDISCOUNT'," * Item Discount", "I", "", "", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + + +//___________________________end addCoupon() + +//------------------------------ insert tare statement ----------------------------------------- + +/** + Add a tare record + @param $dbltare the tare weight. The weight + gets divided by 100, so an argument of 5 gives tare 0.05 +*/ +static public function addTare($dbltare) { + global $CORE_LOCAL; + $CORE_LOCAL->set("tare",$dbltare/100); + $rf = $CORE_LOCAL->get("refund"); + $rc = $CORE_LOCAL->get("refundComment"); + self::addItem("", "** Tare Weight ".$CORE_LOCAL->get("tare")." **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); + $CORE_LOCAL->set("refund",$rf); + $CORE_LOCAL->set("refundComment",$rc); +} + +//___________________________end addTare() + +/** + Add a virtual coupon by ID + @param $id identifier in the VirtualCoupon table +*/ +static public function addVirtualCoupon($id){ + global $CORE_LOCAL; + $sql = Database::pDataConnect(); + $fetchQ = "select name,type,value,max from VirtualCoupon WHERE flag=$id"; + $fetchR = $sql->query($fetchQ); + $coupW = $sql->fetch_row($fetchR); + + $val = (double)$coupW["value"]; + $limit = (double)$coupW["max"]; + $type = $coupW["type"]; + $desc = substr($coupW["name"],0,35); + switch(strtoupper($type)){ + case 'PERCENT': + $val = $val * $CORE_LOCAL->get("discountableTotal"); + break; + } + if ($limit != 0 && $val > $limit) + $val = $limit; + $val *= -1; + $upc = str_pad($id,13,'0',STR_PAD_LEFT); + + self::addItem($upc, $desc, "I", "CP", "C", 0, 1, $val, $val, $val, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add a deposit + @deprecated + Use deposit column in products table +*/ +static public function addDeposit($quantity, $deposit, $foodstamp) { + + $total = $quantity * $deposit; + $chardeposit = 100 * $deposit; + if($foodstamp == 1){ // ACG HARDCODED DEPARTMENTS.... + $dept = 43; + }else{ + $dept = 42; + } + self::addItem("DEPOSIT" * $chardeposit, "Deposit", "I", "", "", $dept, $quantity, $deposit, $total, $deposit, 0, 0, $foodstamp, 0, 0, 0, 0, $quantity, 0, 0, 0, 0, 0, 0); + +} + +// ----------------------------- insert transaction discount ----------------------------------- + +/** + Add transaction discount record +*/ +static public function addTransDiscount() { + global $CORE_LOCAL; + self::addItem("DISCOUNT", "Discount", "I", "", "", 0, 1, MiscLib::truncate2(-1 * $CORE_LOCAL->get("transDiscount")), MiscLib::truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add cash drop record +*/ +static public function addCashDrop($amt) { + self::addItem("DROP", "Cash Drop", "I", "", "X", 0, 1, MiscLib::truncate2(-1 * $amt), MiscLib::truncate2(-1 * $amt), 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0.00, 0, 'CD'); +} + +// ---------------------------- insert stamp in activitytemplog -------------------------------- + +/** + Add an activity record to activitytemplog + @param $activity identifier + + No one really uses activity logging currently. +*/ +static public function addactivity($activity) { + global $CORE_LOCAL; + + $timeNow = time(); + + if ($CORE_LOCAL->get("CashierNo") > 0 && $CORE_LOCAL->get("CashierNo") < 256) { + $intcashier = $CORE_LOCAL->get("CashierNo"); + } + else { + $intcashier = 0; + } + + if ($CORE_LOCAL->get("DBMS") == "mssql") { + $strqtime = "select max(datetime) as maxDateTime, getdate() as rightNow from activitytemplog"; + } else { + $strqtime = "select max(datetime) as maxDateTime, now() as rightNow from activitytemplog"; + } + + + $db = Database::tDataConnect(); + $result = $db->query($strqtime); + + + $row = $db->fetch_array($result); + + if (!$row || !$row[0]) { + + $interval = 0; + } + else { + + $interval = strtotime($row["rightNow"]) - strtotime($row["maxDateTime"]); + } + + //$_SESSION["datetimestamp"] = strftime("%Y-%m-%d %H:%M:%S", $timeNow); + $datetimestamp = strftime("%Y-%m-%d %H:%M:%S", $timeNow); + + $values = array( + 'datetime' => MiscLib::nullwrap($datetimestamp), + 'LaneNo' => MiscLib::nullwrap($CORE_LOCAL->get("laneno")), + 'CashierNo' => MiscLib::nullwrap($intcashier), + 'TransNo' => MiscLib::nullwrap($CORE_LOCAL->get("transno")), + 'Activity' => MiscLib::nullwrap($activity), + $db->identifier_escape('Interval') => MiscLib::nullwrap($interval) + ); + $result = $db->smart_insert("activitytemplog",$values); +} + +/** + Add a log entry to the transaction table. + Log records do not appear onscreen on on receipts. + + @param $opts keyed array. Currently valid keys are: + - upc + - description + - department + - numflag + - charflag + - amount1 + - amount2 + + All keys are optional and will be left blank or zero if + omitted. Log records have trans_status 'X', trans_type 'L', + and trans_subtype 'OG'. Amount1 and Amount2 are reflected in + total and regPrice (respectively). The other values go in the + correspondingly named columns. +*/ +static public function add_log_record($opts){ + if (!is_array($opts)) $opts = array(); + $upc = isset($opts['upc']) ? $opts['upc'] : ''; + $desc = isset($opts['description']) ? $opts['description'] : ''; + $dept = isset($opts['department']) ? $opts['department'] : 0; + $nflag = isset($opts['numflag']) ? $opts['numflag'] : 0; + $cflag = isset($opts['charflag']) ? $opts['charflag'] : ''; + $total = isset($opts['amount1']) ? $opts['amount1'] : 0; + $regPrice = isset($opts['amount2']) ? $opts['amount2'] : 0; + + self::addItem($upc, $desc, 'L', 'OG', 'D', $dept, + 0, // quantity + 0, // unitPrice + $total, + $regPrice, + 0, // scale + 0, // tax + 0, //foodstamp + 0, //discount + 0, //memDiscount + 0, //discountable + 0, //discounttype + 0, //ItemQtty + 0, //volDiscType + 0, //volume + 0, //VolSpecial + '', //mixMatch + 0, //matched + 0, //voided + 0, //cost + $nflag, $cflag); +} + +// ------------------------------------------------------------------------ + + +} + +?> diff --git a/pos/is4c-nf/lib/UdpComm.php b/pos/is4c-nf/lib/UdpComm.php new file mode 100644 index 000000000..7b6531619 --- /dev/null +++ b/pos/is4c-nf/lib/UdpComm.php @@ -0,0 +1,48 @@ +<?php + +/** + @class UdpComm + UDP send & receive function +*/ +class UdpComm extends LibraryClass { + +/** + Send a message via UDP + @param $msg the message + @param $port integer port +*/ +static public function udpSend($msg,$port=9450){ + if (!function_exists("socket_create")) return; + $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + $res = socket_sendto($sock, $msg, strlen($msg), 0, '127.0.0.1',$port); + socket_close($sock); +} + +/** + Bi-directional UDP communication + @param $msg the message + @param $port integer port + @return the response or an empty string + + Whatever program is listening on the other + end cannot respond on the same port. It must + send the response on (port+1). +*/ +static public function udpPoke($msg,$port=9450){ + $socket = stream_socket_server("udp://127.0.0.1:".($port+1), + $errno, $errstr, STREAM_SERVER_BIND); + self::udpSend($msg,$port); + $read = array($socket); + $write = null; + $except = null; + $ready = stream_select($read,$write,$except,0,500); + $buf = ""; + if ($ready > 0) + $buf = stream_socket_recvfrom($socket, 1024, 0, $peer); + stream_socket_shutdown($socket,STREAM_SHUT_RDWR); + return $buf; +} + +} + +?> diff --git a/pos/is4c-nf/lib/additem.php.obsolete b/pos/is4c-nf/lib/additem.php.obsolete new file mode 100644 index 000000000..a4a5d53c2 --- /dev/null +++ b/pos/is4c-nf/lib/additem.php.obsolete @@ -0,0 +1,638 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @file + @brief Defines functions for adding records to the transaction + @deprecated See TransRecord +*/ + +/*------------------------------------------------------------------------------ +additem.php is the bread and butter of IT CORE. addItem inserts the information +stream for each item scanned, entered or transaction occurence into localtemptrans. +Each of the above follows the following structure for entry into localtemptrans: + $strupc, + $strdescription, + $strtransType, + $strtranssubType, + $strtransstatus, + $intdepartment, + $dblquantity, + $dblunitPrice, + $dbltotal, + $dblregPrice, + $intscale, + $inttax, + $intfoodstamp, + $dbldiscount, + $dblmemDiscount, + $intdiscountable, + $intdiscounttype, + $dblItemQtty, + $intvolDiscType, + $intvolume, + $dblVolSpecial, + $intmixMatch, + $intmatched, + $intvoided + +Additionally, additem.php inserts entries into the activity log when a cashier +signs in +-------------------------------------------------------------------------------*/ +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("pDataConnect")) include($CORE_PATH."lib/connect.php"); +if (!function_exists("nullwrap")) include($CORE_PATH."lib/lib.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + + +//-------insert line into localtemptrans with standard insert string-------------- + +/** + Add an item to localtemptrans. + Parameters correspond to columns in localtemptrans. See that table + for valid types. + @param $strupc localtemptrans.upc + @param $strdescription localtemptrans.description + @param $strtransType localtemptrans.trans_type + @param $strtranssubType localtemptrans.trans_subtype + @param $strtransstatuts localtemptrans.trans_status + @param $dblquantity localtemptrans.quantity + @param $dblunitPrice localtemptrans.unitPrice + @param $dbltotal localtemptrans.total + @param $dblregPrice localtemptrans.regPrice + @param $intscale localtemptrans.scale + @param $inttax localtemptrans.tax + @param $intfoodstamp localtemptrans.foodstamp + @param $dbldiscount localtemptrans.discount + @param $dblmemDiscount localtemptrans.memDiscount + @param $intdiscountable localtemptrans.discounttable + @param $intdiscounttype localtemptrans.discounttype + @param $dblItemQtty localtemptrans.ItemQtty + @param $intvolDiscType localtemptrans.volDiscType + @param $intvolume localtemptrans.volume + @param $dblVolSpecial localtemptrans.VolSpecial + @param $intmixMatch localtemptrans.mixMatch + @param $intmatched localtemptrans.matched + @param $intvoided localtemptrans.voided + @param $cost localtemptrans.cost + @param $numflag localtemptrans.numflag + @param $charflag localtemptrans.charflag + + In many cases there is a simpler function that takes far + fewer arguments and adds a specific type of record. + All such functions should be in this file. +*/ +function addItem($strupc, $strdescription, $strtransType, $strtranssubType, $strtransstatus, $intdepartment, $dblquantity, $dblunitPrice, $dbltotal, $dblregPrice, $intscale, $inttax, $intfoodstamp, $dbldiscount, $dblmemDiscount, $intdiscountable, $intdiscounttype, $dblItemQtty, $intvolDiscType, $intvolume, $dblVolSpecial, $intmixMatch, $intmatched, $intvoided, $cost=0, $numflag=0, $charflag='') { + global $CORE_LOCAL; + //$dbltotal = truncate2(str_replace(",", "", $dbltotal)); replaced by apbw 7/27/05 with the next 4 lines -- to fix thousands place errors + + $dbltotal = str_replace(",", "", $dbltotal); + $dbltotal = number_format($dbltotal, 2, '.', ''); + $dblunitPrice = str_replace(",", "", $dblunitPrice); + $dblunitPrice = number_format($dblunitPrice, 2, '.', ''); + + if ($CORE_LOCAL->get("refund") == 1) { + $dblquantity = (-1 * $dblquantity); + $dbltotal = (-1 * $dbltotal); + $dbldiscount = (-1 * $dbldiscount); + $dblmemDiscount = (-1 * $dblmemDiscount); + + if ($strtransstatus != "V" && $strtransstatus != "D") $strtransstatus = "R" ; // edited by apbw 6/04/05 to correct voiding of refunded items + + $CORE_LOCAL->set("refund",0); + $CORE_LOCAL->set("refundComment",""); + + if ($CORE_LOCAL->get("refundDiscountable")==0) + $intdiscountable = 0; + } + + /* Nothing in the code can set $_SESSION["void"] to 1 + elseif ($_SESSION["void"] == 1) { + $dblquantity = (-1 * $dblquantity); + $dbltotal = (-1 * $dbltotal); + $strtransstatus = "V"; + $_SESSION["void"] = 0; + } + */ + + + $intregisterno = $CORE_LOCAL->get("laneno"); + $intempno = $CORE_LOCAL->get("CashierNo"); + $inttransno = $CORE_LOCAL->get("transno"); + $strCardNo = $CORE_LOCAL->get("memberID"); + $memType = $CORE_LOCAL->get("memType"); + $staff = $CORE_LOCAL->get("isStaff"); + + $db = tDataConnect(); + + $datetimestamp = ""; + if ($CORE_LOCAL->get("DBMS") == "mssql") { + $datetimestamp = strftime("%m/%d/%y %H:%M:%S %p", time()); + } else { + $datetimestamp = strftime("%Y-%m-%d %H:%M:%S", time()); + } + + // this session variable never gets used + //$_SESSION["datetimestamp"] = $datetimestamp; + $CORE_LOCAL->set("LastID",$CORE_LOCAL->get("LastID") + 1); + + $trans_id = $CORE_LOCAL->get("LastID"); + + $values = array( + 'datetime' => $datetimestamp, + 'register_no' => $intregisterno, + 'emp_no' => $intempno, + 'trans_no' => nullwrap($inttransno), + 'upc' => nullwrap($strupc), + 'description' => $db->escape($strdescription), + 'trans_type' => nullwrap($strtransType), + 'trans_subtype' => nullwrap($strtranssubType), + 'trans_status' => nullwrap($strtransstatus), + 'department' => nullwrap($intdepartment), + 'quantity' => nullwrap($dblquantity), + 'cost' => nullwrap($cost), + 'unitPrice' => nullwrap($dblunitPrice), + 'total' => nullwrap($dbltotal), + 'regPrice' => nullwrap($dblregPrice), + 'scale' => nullwrap($intscale), + 'tax' => nullwrap($inttax), + 'foodstamp' => nullwrap($intfoodstamp), + 'discount' => nullwrap($dbldiscount), + 'memDiscount' => nullwrap($dblmemDiscount), + 'discountable' => nullwrap($intdiscountable), + 'discounttype' => nullwrap($intdiscounttype), + 'ItemQtty' => nullwrap($dblItemQtty), + 'volDiscType' => nullwrap($intvolDiscType), + 'volume' => nullwrap($intvolume), + 'VolSpecial' => nullwrap($dblVolSpecial), + 'mixMatch' => nullwrap($intmixMatch), + 'matched' => nullwrap($intmatched), + 'voided' => nullwrap($intvoided), + 'memType' => nullwrap($memType), + 'staff' => nullwrap($staff), + 'numflag' => nullwrap($numflag), + 'charflag' => $charflag, + 'card_no' => (string)$strCardNo + ); + if ($CORE_LOCAL->get("DBMS") == "mssql" && $CORE_LOCAL->get("store") == "wfc"){ + unset($values["staff"]); + $values["isStaff"] = nullwrap($staff); + } + + $db->smart_insert("localtemptrans",$values); + $db->close(); + + if ($strtransType == "I" || $strtransType == "D") { + $CORE_LOCAL->set("beep","goodBeep"); + if ($intscale == 1) { + $CORE_LOCAL->set("screset","rePoll"); + } + elseif ($CORE_LOCAL->get("weight") != 0) { + $CORE_LOCAL->set("screset","rePoll"); + } + $CORE_LOCAL->set("repeatable",1); + } + + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $CORE_LOCAL->set("SNR",0); + $CORE_LOCAL->set("wgtRequested",0); + $CORE_LOCAL->set("nd",0); + + $CORE_LOCAL->set("ccAmtEntered",0); + $CORE_LOCAL->set("ccAmt",0); + +} + +//________________________________end addItem() + + +//---------------------------------- insert tax line item -------------------------------------- + +/** + Add a tax record to the transaction. Amount is + pulled from session info automatically. +*/ +function addtax() { + global $CORE_LOCAL; + + addItem("TAX", "Tax", "A", "", "", 0, 0, 0, $CORE_LOCAL->get("taxTotal"), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//________________________________end addtax() + + +//---------------------------------- insert tender line item ----------------------------------- + +/** + Add a tender record to the transaction + @param $strtenderdesc is a description, such as "Credit Card" + @param $strtendercode is a 1-2 character code, such as "CC" + @param $dbltendered is the amount. Remember that payments are + <i>negative</i> amounts. +*/ +function addtender($strtenderdesc, $strtendercode, $dbltendered) { + addItem("", $strtenderdesc, "T", $strtendercode, "", 0, 0, 0, $dbltendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//_______________________________end addtender() + + +/** + Add a comment to the transaction + @param $comment is the comment text. Max length allowed + is 30 characters. +*/ +function addcomment($comment) { + if (strlen($comment) > 30) + $comment = substr($comment,0,30); + addItem("",$comment, "C", "CM", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + + +//--------------------------------- insert change line item ------------------------------------ + +/** + Add a change record (a special type of tender record) + @param $dblcashreturn the change amount +*/ +function addchange($dblcashreturn) { + addItem("", "Change", "T", "CA", "", 0, 0, 0, $dblcashreturn, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addchange() + + +//-------------------------------- insert foods stamp change item ------------------------------ + +/** + Add a foodstamp change record + @param $intfsones the change amount + + Please do verify cashback is permitted with EBT transactions + in your area before using this. +*/ +function addfsones($intfsones) { + addItem("", "FS Change", "T", "FS", "", 0, 0, 0, $intfsones, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addfsones() + +/** + Add end of shift record + @deprecated +*/ +function addEndofShift() { + addItem("ENDOFSHIFT", "End of Shift", "S", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//-------------------------------- insert deli discount (Wedge specific) ----------------------- + +/** + Add Wedge deli discount + @deprecated +*/ +function addscDiscount() { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("scDiscount") != 0) { + addItem("DISCOUNT", "** 10% Deli Discount **", "I", "", "", 0, 1, truncate2(-1 * $CORE_LOCAL->get("scDiscount")), truncate2(-1 * $CORE_LOCAL->get("scDiscount")), 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2); + } +// addStaffCoffeeDiscount(); + +} + +/** + Add Wedge coffee discount + @deprecated +*/ +function addStaffCoffeeDiscount() { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("staffCoffeeDiscount") != 0) { + addItem("DISCOUNT", "** Coffee Discount **", "I", "", "", 0, 1, truncate2(-1 * $CORE_LOCAL->get("staffCoffeeDiscount")), truncate2(-1 * $CORE_LOCAL->get("staffCoffeeDiscount")), 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2); + } +} + +//_______________________________end addscDiscount() + + +//------------------------------- insert discount line ----------------------------------------- + +/***** jqh 09/29/05 changed adddiscount function to write the department to localtemptrans *****/ +/** + Add a "YOU SAVED" record to the transaction. This is just informational + and will not alter totals. + @param $dbldiscount discount amount + @param $department associated department +*/ +function adddiscount($dbldiscount,$department) { + $strsaved = "** YOU SAVED $".truncate2($dbldiscount)." **"; + addItem("", $strsaved, "I", "", "D", $department, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2); +} + +//_____________________________end adddiscount() + + +//------------------------------ insert Food Stamp Tax Exempt line ----------------------------- + + +/** + Add tax exemption for foodstamps +*/ +function addfsTaxExempt() { + global $CORE_LOCAL; + + getsubtotals(); + addItem("FS Tax Exempt", " Fs Tax Exempt ", "C", "", "D", 0, 0, $CORE_LOCAL->get("fsTaxExempt"), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17); +} + +//_____________________________end addfsTaxExempt() + + +//------------------------------ insert 'discount applied' line -------------------------------- + +/** + Add a information record showing transaction percent discount + @param $strl the percentage +*/ +function discountnotify($strl) { + if ($strl == 10.01) { + $strL = 10; + } + addItem("", "** ".$strl."% Discount Applied **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4); +} + +//_____________________________end discountnotify() + + +//------------------------------- insert discount line ----------------------------------------- + +//------------------------------- insert tax exempt statement line ----------------------------- + +/** + Add tax exemption record to transaction +*/ +function addTaxExempt() { + global $CORE_LOCAL; + + addItem("", "** Order is Tax Exempt **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + $CORE_LOCAL->set("TaxExempt",1); + setglobalvalue("TaxExempt", 1); +} + +//_____________________________end addTaxExempt() + + +//------------------------------ insert reverse tax exempt statement --------------------------- + +/** + Add record to undo tax exemption +*/ +function reverseTaxExempt() { + global $CORE_LOCAL; + addItem("", "** Tax Exemption Reversed **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + $CORE_LOCAL->set("TaxExempt",0); + setglobalvalue("TaxExempt", 0); +} + +//_____________________________end reverseTaxExempt() + +//------------------------------ insert case discount statement -------------------------------- + +/** + Add an informational record noting case discount + $CORE_LOCAL setting "casediscount" controls the percentage + shown +*/ +function addcdnotify() { + global $CORE_LOCAL; + addItem("", "** ".$CORE_LOCAL->get("casediscount")."% Case Discount Applied", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); +} + +//____________________________end addcdnotify() + +//------------------------------ insert manufacturer coupon statement -------------------------- + +/** + Add a manufacturer coupon record + @param $strupc coupon UPC + @param $intdepartment associated POS department + @param $dbltotal coupon amount (should be negative) + @param $foodstamp mark coupon foodstamp-able +*/ +function addCoupon($strupc, $intdepartment, $dbltotal, $foodstamp=0) { + addItem($strupc, " * Manufacturers Coupon", "I", "CP", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, $foodstamp, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add an in-store coupon + @param $strupc coupon UPC + @param $intdepartment associated POS department + @param $dbltotal coupon amount (should be negative) +*/ +function addhousecoupon($strupc, $intdepartment, $dbltotal) { + addItem($strupc, " * WFC Coupon", "I", "IC", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add a line-item discount + @param $intdepartment POS department + @param $dbltotal discount amount (should be <b>positive</b>) +*/ +function additemdiscount($intdepartment, $dbltotal) { + $dbltotal *= -1; + addItem('ITEMDISCOUNT'," * Item Discount", "I", "", "", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + + +//___________________________end addCoupon() + +//------------------------------ insert tare statement ----------------------------------------- + +/** + Add a tare record + @param $dbltare the tare weight. The weight + gets divided by 100, so an argument of 5 gives tare 0.05 +*/ +function addTare($dbltare) { + global $CORE_LOCAL; + $CORE_LOCAL->set("tare",$dbltare/100); + addItem("", "** Tare Weight ".$CORE_LOCAL->get("tare")." **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); +} + +//___________________________end addTare() + + +//------------------------------- insert MAD coupon statement (WFC specific) ------------------- + +/** + Add WFC virtual coupon + @deprecated +*/ +function addMadCoup() { + global $CORE_LOCAL; + + $madCoup = -1 * $CORE_LOCAL->get("madCoup"); + addItem("MAD Coupon", "Member Appreciation Coupon", "I", "CP", "C", 0, 1, $madCoup, $madCoup, $madCoup, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 17); + +} + +/** + Add a virtual coupon by ID + @param $id identifier in the VirtualCoupon table +*/ +function addVirtualCoupon($id){ + global $CORE_LOCAL; + $sql = pDataConnect(); + $fetchQ = "select name,type,value,max from VirtualCoupon WHERE flag=$id"; + $fetchR = $sql->query($fetchQ); + $coupW = $sql->fetch_row($fetchR); + + $val = (double)$coupW["value"]; + $limit = (double)$coupW["max"]; + $type = $coupW["type"]; + $desc = substr($coupW["name"],0,35); + switch(strtoupper($type)){ + case 'PERCENT': + $val = $val * $CORE_LOCAL->get("discountableTotal"); + break; + } + if ($limit != 0 && $val > $limit) + $val = $limit; + $val *= -1; + $upc = str_pad($id,13,'0',STR_PAD_LEFT); + + addItem($upc, $desc, "I", "CP", "C", 0, 1, $val, $val, $val, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + + +//___________________________end addMadCoupon() + +/** + Add a deposit + @deprecated + Use deposit column in products table +*/ +function addDeposit($quantity, $deposit, $foodstamp) { + + $total = $quantity * $deposit; + $chardeposit = 100 * $deposit; + if($foodstamp == 1){ // ACG HARDCODED DEPARTMENTS.... + $dept = 43; + }else{ + $dept = 42; + } + addItem("DEPOSIT" * $chardeposit, "Deposit", "I", "", "", $dept, $quantity, $deposit, $total, $deposit, 0, 0, $foodstamp, 0, 0, 0, 0, $quantity, 0, 0, 0, 0, 0, 0); + +} + +// ----------------------------- insert transaction discount ----------------------------------- + +/** + Add transaction discount record +*/ +function addtransDiscount() { + global $CORE_LOCAL; + addItem("DISCOUNT", "Discount", "I", "", "", 0, 1, truncate2(-1 * $CORE_LOCAL->get("transDiscount")), truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +/** + Add cash drop record +*/ +function addCashDrop($ttl) { + addItem("DROP", "Cash Drop", "I", "", "X", 0, 1, truncate2(-1 * $amt), truncate2(-1 * $amt), 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0.00, 0, 'CD'); +} + +// ---------------------------- insert stamp in activitytemplog -------------------------------- + +/** + Add an activity record to activitytemplog + @param $activity identifier + + No one really uses activity logging currently. +*/ +function addactivity($activity) { + global $CORE_LOCAL; + + $timeNow = time(); + + if ($CORE_LOCAL->get("CashierNo") > 0 && $CORE_LOCAL->get("CashierNo") < 256) { + $intcashier = $CORE_LOCAL->get("CashierNo"); + } + else { + $intcashier = 0; + } + + if ($CORE_LOCAL->get("DBMS") == "mssql") { + $strqtime = "select max(datetime) as maxDateTime, getdate() as rightNow from activitytemplog"; + } else { + $strqtime = "select max(datetime) as maxDateTime, now() as rightNow from activitytemplog"; + } + + + $db = tDataConnect(); + $result = $db->query($strqtime); + + + $row = $db->fetch_array($result); + + if (!$row || !$row[0]) { + + $interval = 0; + } + else { + + $interval = strtotime($row["rightNow"]) - strtotime($row["maxDateTime"]); + } + + //$_SESSION["datetimestamp"] = strftime("%Y-%m-%d %H:%M:%S", $timeNow); + $datetimestamp = strftime("%Y-%m-%d %H:%M:%S", $timeNow); + + $values = array( + 'datetime' => nullwrap($datetimestamp), + 'LaneNo' => nullwrap($CORE_LOCAL->get("laneno")), + 'CashierNo' => nullwrap($intcashier), + 'TransNo' => nullwrap($CORE_LOCAL->get("transno")), + 'Activity' => nullwrap($activity), + 'Interval' => nullwrap($interval) + ); + /* + if ($CORE_LOCAL->get("DBMS")=="mysql"){ + unset($values['Interval']); + $values['`Interval`'] = nullwrap($interval); + } + */ + $result = $db->smart_insert("activitytemplog",$values); + + $db->close(); + +} + +// ------------------------------------------------------------------------ + + +?> diff --git a/pos/is4c-nf/lib/adminlogin/AgeApproveAdminLogin.php b/pos/is4c-nf/lib/adminlogin/AgeApproveAdminLogin.php new file mode 100644 index 000000000..50e967e53 --- /dev/null +++ b/pos/is4c-nf/lib/adminlogin/AgeApproveAdminLogin.php @@ -0,0 +1,45 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AgeApproveAdminLogin { + + public static $adminLoginMsg = 'Login to approve sale'; + + public static $adminLoginLevel = 30; + + public static function adminLoginCallback($success){ + global $CORE_LOCAL; + if ($success){ + $CORE_LOCAL->set('refundComment', $CORE_LOCAL->get('strEntered')); + $CORE_LOCAL->set('strRemembered', $CORE_LOCAL->get('strEntered')); + $CORE_LOCAL->set('msgrepeat', 1); + $CORE_LOCAL->set('cashierAgeOverride', 1); + return True; + } + else{ + $CORE_LOCAL->set('cashierAgeOverride', 0); + return False; + } + } +} +?> diff --git a/pos/is4c-nf/lib/adminlogin/DDDAdminLogin.php b/pos/is4c-nf/lib/adminlogin/DDDAdminLogin.php new file mode 100644 index 000000000..7ba148b04 --- /dev/null +++ b/pos/is4c-nf/lib/adminlogin/DDDAdminLogin.php @@ -0,0 +1,37 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DDDAdminLogin { + + public static $adminLoginMsg = 'DDD these items?'; + + public static $adminLoginLevel = 10; + + public static function adminLoginCallback($success){ + if ($success) + return MiscLib::base_url().'ajax-callbacks/ddd.php'; + else + return False; + } + +} diff --git a/pos/is4c-nf/lib/adminlogin/PriceOverrideAdminLogin.php b/pos/is4c-nf/lib/adminlogin/PriceOverrideAdminLogin.php new file mode 100644 index 000000000..4a35d6370 --- /dev/null +++ b/pos/is4c-nf/lib/adminlogin/PriceOverrideAdminLogin.php @@ -0,0 +1,38 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PriceOverrideAdminLogin { + + static public $adminLoginMsg = 'Login to alter price'; + + static public $adminLoginLevel = 30; + + static public function adminLoginCallback($success){ + if ($success) + return MiscLib::base_url().'gui-modules/priceOverride.php'; + else + return False; + } +} + + diff --git a/pos/is4c-nf/lib/adminlogin/RefundAdminLogin.php b/pos/is4c-nf/lib/adminlogin/RefundAdminLogin.php new file mode 100644 index 000000000..2a5fb686b --- /dev/null +++ b/pos/is4c-nf/lib/adminlogin/RefundAdminLogin.php @@ -0,0 +1,43 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class RefundAdminLogin { + + public static $adminLoginMsg = 'Login to issue refund'; + + public static $adminLoginLevel = 30; + + public static function adminLoginCallback($success){ + global $CORE_LOCAL; + if ($success){ + $CORE_LOCAL->set('refundComment', $CORE_LOCAL->get('strEntered')); + return MiscLib::base_url().'gui-modules/refundComment.php'; + } + else{ + $CORE_LOCAL->set('refundComment', ''); + return False; + } + } + +} + diff --git a/pos/is4c-nf/lib/adminlogin/SusResAdminLogin.php b/pos/is4c-nf/lib/adminlogin/SusResAdminLogin.php new file mode 100644 index 000000000..8bfe931e1 --- /dev/null +++ b/pos/is4c-nf/lib/adminlogin/SusResAdminLogin.php @@ -0,0 +1,38 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class SusResAdminLogin { + + static public $adminLoginMsg = 'Login to suspend/resume transactions'; + + static public $adminLoginLevel = 30; + + static public function adminLoginCallback($success){ + if ($success) + return MiscLib::base_url().'gui-modules/adminlist.php'; + else + return False; + } +} + + diff --git a/pos/is4c-nf/lib/adminlogin/UndoAdminLogin.php b/pos/is4c-nf/lib/adminlogin/UndoAdminLogin.php new file mode 100644 index 000000000..a34f9d51d --- /dev/null +++ b/pos/is4c-nf/lib/adminlogin/UndoAdminLogin.php @@ -0,0 +1,38 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class UndoAdminLogin { + + static public $adminLoginMsg = 'Login to void transactions'; + + static public $adminLoginLevel = 30; + + static public function adminLoginCallback($success){ + if ($success) + return MiscLib::base_url().'gui-modules/undo.php'; + else + return False; + } +} + +?> diff --git a/pos/is4c-nf/lib/adodb5/adodb-active-record.inc.php b/pos/is4c-nf/lib/adodb5/adodb-active-record.inc.php new file mode 100644 index 000000000..daf3aac2d --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-active-record.inc.php @@ -0,0 +1,981 @@ +<?php +/* + +@version V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Latest version is available at http://adodb.sourceforge.net + + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Active Record implementation. Superset of Zend Framework's. + + Version 0.92 + + See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord + for info on Ruby on Rails Active Record implementation +*/ + + +global $_ADODB_ACTIVE_DBS; +global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info +global $ACTIVE_RECORD_SAFETY; // set to false to disable safety checks +global $ADODB_ACTIVE_DEFVALS; // use default values of table definition when creating new active record. + +// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat +$_ADODB_ACTIVE_DBS = array(); +$ACTIVE_RECORD_SAFETY = true; +$ADODB_ACTIVE_DEFVALS = false; + +class ADODB_Active_DB { + var $db; // ADOConnection + var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename +} + +class ADODB_Active_Table { + var $name; // table name + var $flds; // assoc array of adofieldobjs, indexed by fieldname + var $keys; // assoc array of primary keys, indexed by fieldname + var $_created; // only used when stored as a cached file + var $_belongsTo = array(); + var $_hasMany = array(); +} + +// $db = database connection +// $index = name of index - can be associative, for an example see +// http://phplens.com/lens/lensforum/msgs.php?id=17790 +// returns index into $_ADODB_ACTIVE_DBS +function ADODB_SetDatabaseAdapter(&$db, $index=false) +{ + global $_ADODB_ACTIVE_DBS; + + foreach($_ADODB_ACTIVE_DBS as $k => $d) { + if (PHP_VERSION >= 5) { + if ($d->db === $db) return $k; + } else { + if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database) + return $k; + } + } + + $obj = new ADODB_Active_DB(); + $obj->db = $db; + $obj->tables = array(); + + if ($index == false) $index = sizeof($_ADODB_ACTIVE_DBS); + + + $_ADODB_ACTIVE_DBS[$index] = $obj; + + return sizeof($_ADODB_ACTIVE_DBS)-1; +} + + +class ADODB_Active_Record { + static $_changeNames = true; // dynamically pluralize table names + static $_quoteNames = false; + + static $_foreignSuffix = '_id'; // + var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] + var $_table; // tablename, if set in class definition then use it as table name + var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat] + var $_where; // where clause set in Load() + var $_saved = false; // indicates whether data is already inserted. + var $_lasterr = false; // last error message + var $_original = false; // the original values loaded or inserted, refreshed on update + + var $foreignName; // CFR: class name when in a relationship + + static function UseDefaultValues($bool=null) + { + global $ADODB_ACTIVE_DEFVALS; + if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool; + return $ADODB_ACTIVE_DEFVALS; + } + + // should be static + static function SetDatabaseAdapter(&$db, $index=false) + { + return ADODB_SetDatabaseAdapter($db, $index); + } + + + public function __set($name, $value) + { + $name = str_replace(' ', '_', $name); + $this->$name = $value; + } + + // php5 constructor + function __construct($table = false, $pkeyarr=false, $db=false) + { + global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; + + if ($db == false && is_object($pkeyarr)) { + $db = $pkeyarr; + $pkeyarr = false; + } + + if (!$table) { + if (!empty($this->_table)) $table = $this->_table; + else $table = $this->_pluralize(get_class($this)); + } + $this->foreignName = strtolower(get_class($this)); // CFR: default foreign name + if ($db) { + $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); + } else if (!isset($this->_dbat)) { + if (sizeof($_ADODB_ACTIVE_DBS) == 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); + end($_ADODB_ACTIVE_DBS); + $this->_dbat = key($_ADODB_ACTIVE_DBS); + } + + $this->_table = $table; + $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future + + $this->UpdateActiveTable($pkeyarr); + } + + function __wakeup() + { + $class = get_class($this); + new $class; + } + + function _pluralize($table) + { + if (!ADODB_Active_Record::$_changeNames) return $table; + + $ut = strtoupper($table); + $len = strlen($table); + $lastc = $ut[$len-1]; + $lastc2 = substr($ut,$len-2); + switch ($lastc) { + case 'S': + return $table.'es'; + case 'Y': + return substr($table,0,$len-1).'ies'; + case 'X': + return $table.'es'; + case 'H': + if ($lastc2 == 'CH' || $lastc2 == 'SH') + return $table.'es'; + default: + return $table.'s'; + } + } + + // CFR Lamest singular inflector ever - @todo Make it real! + // Note: There is an assumption here...and it is that the argument's length >= 4 + function _singularize($tables) + { + + if (!ADODB_Active_Record::$_changeNames) return $table; + + $ut = strtoupper($tables); + $len = strlen($tables); + if($ut[$len-1] != 'S') + return $tables; // I know...forget oxen + if($ut[$len-2] != 'E') + return substr($tables, 0, $len-1); + switch($ut[$len-3]) + { + case 'S': + case 'X': + return substr($tables, 0, $len-2); + case 'I': + return substr($tables, 0, $len-3) . 'y'; + case 'H'; + if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') + return substr($tables, 0, $len-2); + default: + return substr($tables, 0, $len-1); // ? + } + } + + function hasMany($foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') + { + $ar = new $foreignClass($foreignRef); + $ar->foreignName = $foreignRef; + $ar->UpdateActiveTable(); + $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; + $table =& $this->TableInfo(); + $table->_hasMany[$foreignRef] = $ar; + # $this->$foreignRef = $this->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get() + } + + // use when you don't want ADOdb to auto-pluralize tablename + static function TableHasMany($table, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') + { + $ar = new ADODB_Active_Record($table); + $ar->hasMany($foreignRef, $foreignKey, $foreignClass); + } + + // use when you don't want ADOdb to auto-pluralize tablename + static function TableKeyHasMany($table, $tablePKey, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') + { + if (!is_array($tablePKey)) $tablePKey = array($tablePKey); + $ar = new ADODB_Active_Record($table,$tablePKey); + $ar->hasMany($foreignRef, $foreignKey, $foreignClass); + } + + + // use when you want ADOdb to auto-pluralize tablename for you. Note that the class must already be defined. + // e.g. class Person will generate relationship for table Persons + static function ClassHasMany($parentclass, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') + { + $ar = new $parentclass(); + $ar->hasMany($foreignRef, $foreignKey, $foreignClass); + } + + + function belongsTo($foreignRef,$foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') + { + global $inflector; + + $ar = new $parentClass($this->_pluralize($foreignRef)); + $ar->foreignName = $foreignRef; + $ar->parentKey = $parentKey; + $ar->UpdateActiveTable(); + $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; + + $table =& $this->TableInfo(); + $table->_belongsTo[$foreignRef] = $ar; + # $this->$foreignRef = $this->_belongsTo[$foreignRef]; + } + + static function ClassBelongsTo($class, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') + { + $ar = new $class(); + $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); + } + + static function TableBelongsTo($table, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') + { + $ar = new ADOdb_Active_Record($table); + $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); + } + + static function TableKeyBelongsTo($table, $tablePKey, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') + { + if (!is_array($tablePKey)) $tablePKey = array($tablePKey); + $ar = new ADOdb_Active_Record($table, $tablePKey); + $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); + } + + + /** + * __get Access properties - used for lazy loading + * + * @param mixed $name + * @access protected + * @return mixed + */ + function __get($name) + { + return $this->LoadRelations($name, '', -1, -1); + } + + /** + * @param string $name + * @param string $whereOrderBy : eg. ' AND field1 = value ORDER BY field2' + * @param offset + * @param limit + * @return mixed + */ + function LoadRelations($name, $whereOrderBy='', $offset=-1,$limit=-1) + { + $extras = array(); + $table = $this->TableInfo(); + if ($limit >= 0) $extras['limit'] = $limit; + if ($offset >= 0) $extras['offset'] = $offset; + + if (strlen($whereOrderBy)) + if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy)) + if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy)) + $whereOrderBy = 'AND '.$whereOrderBy; + + if(!empty($table->_belongsTo[$name])) + { + $obj = $table->_belongsTo[$name]; + $columnName = $obj->foreignKey; + if(empty($this->$columnName)) + $this->$name = null; + else + { + if ($obj->parentKey) $key = $obj->parentKey; + else $key = reset($table->keys); + + $arrayOfOne = $obj->Find($key.'='.$this->$columnName.' '.$whereOrderBy,false,false,$extras); + if ($arrayOfOne) { + $this->$name = $arrayOfOne[0]; + return $arrayOfOne[0]; + } + } + } + if(!empty($table->_hasMany[$name])) + { + $obj = $table->_hasMany[$name]; + $key = reset($table->keys); + $id = @$this->$key; + if (!is_numeric($id)) { + $db = $this->DB(); + $id = $db->qstr($id); + } + $objs = $obj->Find($obj->foreignKey.'='.$id. ' '.$whereOrderBy,false,false,$extras); + if (!$objs) $objs = array(); + $this->$name = $objs; + return $objs; + } + + return array(); + } + ////////////////////////////////// + + // update metadata + function UpdateActiveTable($pkeys=false,$forceUpdate=false) + { + global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; + global $ADODB_ACTIVE_DEFVALS,$ADODB_FETCH_MODE; + + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + + $table = $this->_table; + $tables = $activedb->tables; + $tableat = $this->_tableat; + if (!$forceUpdate && !empty($tables[$tableat])) { + + $tobj = $tables[$tableat]; + foreach($tobj->flds as $name => $fld) { + if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) + $this->$name = $fld->default_value; + else + $this->$name = null; + } + return; + } + $db = $activedb->db; + $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; + if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) { + $fp = fopen($fname,'r'); + @flock($fp, LOCK_SH); + $acttab = unserialize(fread($fp,100000)); + fclose($fp); + if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) { + // abs(rand()) randomizes deletion, reducing contention to delete/refresh file + // ideally, you should cache at least 32 secs + $activedb->tables[$table] = $acttab; + + //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname"); + return; + } else if ($db->debug) { + ADOConnection::outp("Refreshing cached active record file: $fname"); + } + } + $activetab = new ADODB_Active_Table(); + $activetab->name = $table; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); + + $cols = $db->MetaColumns($table); + + if (isset($savem)) $db->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$cols) { + $this->Error("Invalid table name: $table",'UpdateActiveTable'); + return false; + } + $fld = reset($cols); + if (!$pkeys) { + if (isset($fld->primary_key)) { + $pkeys = array(); + foreach($cols as $name => $fld) { + if (!empty($fld->primary_key)) $pkeys[] = $name; + } + } else + $pkeys = $this->GetPrimaryKeys($db, $table); + } + if (empty($pkeys)) { + $this->Error("No primary key found for table $table",'UpdateActiveTable'); + return false; + } + + $attr = array(); + $keys = array(); + + switch($ADODB_ASSOC_CASE) { + case 0: + foreach($cols as $name => $fldobj) { + $name = strtolower($name); + if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) + $this->$name = $fldobj->default_value; + else + $this->$name = null; + $attr[$name] = $fldobj; + } + foreach($pkeys as $k => $name) { + $keys[strtolower($name)] = strtolower($name); + } + break; + + case 1: + foreach($cols as $name => $fldobj) { + $name = strtoupper($name); + + if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) + $this->$name = $fldobj->default_value; + else + $this->$name = null; + $attr[$name] = $fldobj; + } + + foreach($pkeys as $k => $name) { + $keys[strtoupper($name)] = strtoupper($name); + } + break; + default: + foreach($cols as $name => $fldobj) { + $name = ($fldobj->name); + + if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) + $this->$name = $fldobj->default_value; + else + $this->$name = null; + $attr[$name] = $fldobj; + } + foreach($pkeys as $k => $name) { + $keys[$name] = $cols[$name]->name; + } + break; + } + + $activetab->keys = $keys; + $activetab->flds = $attr; + + if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) { + $activetab->_created = time(); + $s = serialize($activetab); + if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + adodb_write_file($fname,$s); + } + if (isset($activedb->tables[$table])) { + $oldtab = $activedb->tables[$table]; + + if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo; + if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany; + } + $activedb->tables[$table] = $activetab; + } + + function GetPrimaryKeys(&$db, $table) + { + return $db->MetaPrimaryKeys($table); + } + + // error handler for both PHP4+5. + function Error($err,$fn) + { + global $_ADODB_ACTIVE_DBS; + + $fn = get_class($this).'::'.$fn; + $this->_lasterr = $fn.': '.$err; + + if ($this->_dbat < 0) $db = false; + else { + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $db = $activedb->db; + } + + if (function_exists('adodb_throw')) { + if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false); + else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db); + } else + if (!$db || $db->debug) ADOConnection::outp($this->_lasterr); + + } + + // return last error message + function ErrorMsg() + { + if (!function_exists('adodb_throw')) { + if ($this->_dbat < 0) $db = false; + else $db = $this->DB(); + + // last error could be database error too + if ($db && $db->ErrorMsg()) return $db->ErrorMsg(); + } + return $this->_lasterr; + } + + function ErrorNo() + { + if ($this->_dbat < 0) return -9999; // no database connection... + $db = $this->DB(); + + return (int) $db->ErrorNo(); + } + + + // retrieve ADOConnection from _ADODB_Active_DBs + function DB() + { + global $_ADODB_ACTIVE_DBS; + + if ($this->_dbat < 0) { + $false = false; + $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB"); + return $false; + } + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $db = $activedb->db; + return $db; + } + + // retrieve ADODB_Active_Table + function &TableInfo() + { + global $_ADODB_ACTIVE_DBS; + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $table = $activedb->tables[$this->_tableat]; + return $table; + } + + + // I have an ON INSERT trigger on a table that sets other columns in the table. + // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook + function Reload() + { + $db =& $this->DB(); if (!$db) return false; + $table =& $this->TableInfo(); + $where = $this->GenWhere($db, $table); + return($this->Load($where)); + } + + + // set a numeric array (using natural table field ordering) as object properties + function Set(&$row) + { + global $ACTIVE_RECORD_SAFETY; + + $db = $this->DB(); + + if (!$row) { + $this->_saved = false; + return false; + } + + $this->_saved = true; + + $table = $this->TableInfo(); + if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) { + # <AP> + $bad_size = TRUE; + if (sizeof($row) == 2 * sizeof($table->flds)) { + // Only keep string keys + $keys = array_filter(array_keys($row), 'is_string'); + if (sizeof($keys) == sizeof($table->flds)) + $bad_size = FALSE; + } + if ($bad_size) { + $this->Error("Table structure of $this->_table has changed","Load"); + return false; + } + # </AP> + } + else + $keys = array_keys($row); + + # <AP> + reset($keys); + $this->_original = array(); + foreach($table->flds as $name=>$fld) { + $value = $row[current($keys)]; + $this->$name = $value; + $this->_original[] = $value; + next($keys); + } + + # </AP> + return true; + } + + // get last inserted id for INSERT + function LastInsertID(&$db,$fieldname) + { + if ($db->hasInsertID) + $val = $db->Insert_ID($this->_table,$fieldname); + else + $val = false; + + if (is_null($val) || $val === false) { + // this might not work reliably in multi-user environment + return $db->GetOne("select max(".$fieldname.") from ".$this->_table); + } + return $val; + } + + // quote data in where clause + function doquote(&$db, $val,$t) + { + switch($t) { + case 'D': + case 'T': + if (empty($val)) return 'null'; + + case 'B': + case 'N': + case 'C': + case 'X': + if (is_null($val)) return 'null'; + + if (strlen($val)>1 && + (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { + return $db->qstr($val); + break; + } + default: + return $val; + break; + } + } + + // generate where clause for an UPDATE/SELECT + function GenWhere(&$db, &$table) + { + $keys = $table->keys; + $parr = array(); + + foreach($keys as $k) { + $f = $table->flds[$k]; + if ($f) { + $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type)); + } + } + return implode(' and ', $parr); + } + + + function _QName($n,$db=false) + { + if (!ADODB_Active_Record::$_quoteNames) return $n; + if (!$db) $db = $this->DB(); if (!$db) return false; + return $db->nameQuote.$n.$db->nameQuote; + } + + //------------------------------------------------------------ Public functions below + + function Load($where=null,$bindarr=false) + { + global $ADODB_FETCH_MODE; + + $db = $this->DB(); if (!$db) return false; + $this->_where = $where; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); + + $qry = "select * from ".$this->_table; + + if($where) { + $qry .= ' WHERE '.$where; + } + $row = $db->GetRow($qry,$bindarr); + + if (isset($savem)) $db->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + return $this->Set($row); + } + + # useful for multiple record inserts + # see http://phplens.com/lens/lensforum/msgs.php?id=17795 + function Reset() + { + $this->_where=null; + $this->_saved = false; + $this->_lasterr = false; + $this->_original = false; + $vars=get_object_vars($this); + foreach($vars as $k=>$v){ + if(substr($k,0,1)!=='_'){ + $this->{$k}=null; + } + } + $this->foreignName=strtolower(get_class($this)); + return true; + } + + // false on error + function Save() + { + if ($this->_saved) $ok = $this->Update(); + else $ok = $this->Insert(); + + return $ok; + } + + + // false on error + function Insert() + { + $db = $this->DB(); if (!$db) return false; + $cnt = 0; + $table = $this->TableInfo(); + + $valarr = array(); + $names = array(); + $valstr = array(); + + foreach($table->flds as $name=>$fld) { + $val = $this->$name; + if(!is_array($val) || !is_null($val) || !array_key_exists($name, $table->keys)) { + $valarr[] = $val; + $names[] = $this->_QName($name,$db); + $valstr[] = $db->Param($cnt); + $cnt += 1; + } + } + + if (empty($names)){ + foreach($table->flds as $name=>$fld) { + $valarr[] = null; + $names[] = $name; + $valstr[] = $db->Param($cnt); + $cnt += 1; + } + } + $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')'; + $ok = $db->Execute($sql,$valarr); + + if ($ok) { + $this->_saved = true; + $autoinc = false; + foreach($table->keys as $k) { + if (is_null($this->$k)) { + $autoinc = true; + break; + } + } + if ($autoinc && sizeof($table->keys) == 1) { + $k = reset($table->keys); + $this->$k = $this->LastInsertID($db,$k); + } + } + + $this->_original = $valarr; + return !empty($ok); + } + + function Delete() + { + $db = $this->DB(); if (!$db) return false; + $table = $this->TableInfo(); + + $where = $this->GenWhere($db,$table); + $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where; + $ok = $db->Execute($sql); + + return $ok ? true : false; + } + + // returns an array of active record objects + function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) + { + $db = $this->DB(); if (!$db || empty($this->_table)) return false; + $arr = $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr,$extra); + return $arr; + } + + // returns 0 on error, 1 on update, 2 on insert + function Replace() + { + global $ADODB_ASSOC_CASE; + + $db = $this->DB(); if (!$db) return false; + $table = $this->TableInfo(); + + $pkey = $table->keys; + + foreach($table->flds as $name=>$fld) { + $val = $this->$name; + /* + if (is_null($val)) { + if (isset($fld->not_null) && $fld->not_null) { + if (isset($fld->default_value) && strlen($fld->default_value)) continue; + else { + $this->Error("Cannot update null into $name","Replace"); + return false; + } + } + }*/ + if (is_null($val) && !empty($fld->auto_increment)) { + continue; + } + + if (is_array($val)) continue; + + $t = $db->MetaType($fld->type); + $arr[$name] = $this->doquote($db,$val,$t); + $valarr[] = $val; + } + + if (!is_array($pkey)) $pkey = array($pkey); + + + if ($ADODB_ASSOC_CASE == 0) + foreach($pkey as $k => $v) + $pkey[$k] = strtolower($v); + elseif ($ADODB_ASSOC_CASE == 1) + foreach($pkey as $k => $v) + $pkey[$k] = strtoupper($v); + + $ok = $db->Replace($this->_table,$arr,$pkey); + if ($ok) { + $this->_saved = true; // 1= update 2=insert + if ($ok == 2) { + $autoinc = false; + foreach($table->keys as $k) { + if (is_null($this->$k)) { + $autoinc = true; + break; + } + } + if ($autoinc && sizeof($table->keys) == 1) { + $k = reset($table->keys); + $this->$k = $this->LastInsertID($db,$k); + } + } + + $this->_original = $valarr; + } + return $ok; + } + + // returns 0 on error, 1 on update, -1 if no change in data (no update) + function Update() + { + $db = $this->DB(); if (!$db) return false; + $table = $this->TableInfo(); + + $where = $this->GenWhere($db, $table); + + if (!$where) { + $this->error("Where missing for table $table", "Update"); + return false; + } + $valarr = array(); + $neworig = array(); + $pairs = array(); + $i = -1; + $cnt = 0; + foreach($table->flds as $name=>$fld) { + $i += 1; + $val = $this->$name; + $neworig[] = $val; + + if (isset($table->keys[$name]) || is_array($val)) + continue; + + if (is_null($val)) { + if (isset($fld->not_null) && $fld->not_null) { + if (isset($fld->default_value) && strlen($fld->default_value)) continue; + else { + $this->Error("Cannot set field $name to NULL","Update"); + return false; + } + } + } + + if (isset($this->_original[$i]) && $val == $this->_original[$i]) { + continue; + } + $valarr[] = $val; + $pairs[] = $this->_QName($name,$db).'='.$db->Param($cnt); + $cnt += 1; + } + + + if (!$cnt) return -1; + $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where; + $ok = $db->Execute($sql,$valarr); + if ($ok) { + $this->_original = $neworig; + return 1; + } + return 0; + } + + function GetAttributeNames() + { + $table = $this->TableInfo(); + if (!$table) return false; + return array_keys($table->flds); + } + +}; + +function adodb_GetActiveRecordsClass(&$db, $class, $table,$whereOrderBy,$bindarr, $primkeyArr, + $extra) +{ +global $_ADODB_ACTIVE_DBS; + + + $save = $db->SetFetchMode(ADODB_FETCH_NUM); + $qry = "select * from ".$table; + + if (!empty($whereOrderBy)) + $qry .= ' WHERE '.$whereOrderBy; + if(isset($extra['limit'])) + { + $rows = false; + if(isset($extra['offset'])) { + $rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset'],$bindarr); + } else { + $rs = $db->SelectLimit($qry, $extra['limit'],-1,$bindarr); + } + if ($rs) { + while (!$rs->EOF) { + $rows[] = $rs->fields; + $rs->MoveNext(); + } + } + } else + $rows = $db->GetAll($qry,$bindarr); + + $db->SetFetchMode($save); + + $false = false; + + if ($rows === false) { + return $false; + } + + + if (!class_exists($class)) { + $db->outp_throw("Unknown class $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); + return $false; + } + $arr = array(); + // arrRef will be the structure that knows about our objects. + // It is an associative array. + // We will, however, return arr, preserving regular 0.. order so that + // obj[0] can be used by app developpers. + $arrRef = array(); + $bTos = array(); // Will store belongTo's indices if any + foreach($rows as $row) { + + $obj = new $class($table,$primkeyArr,$db); + if ($obj->ErrorNo()){ + $db->_errorMsg = $obj->ErrorMsg(); + return $false; + } + $obj->Set($row); + $arr[] = $obj; + } // foreach($rows as $row) + + return $arr; +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-active-recordx.inc.php b/pos/is4c-nf/lib/adodb5/adodb-active-recordx.inc.php new file mode 100644 index 000000000..6d270b654 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-active-recordx.inc.php @@ -0,0 +1,1421 @@ +<?php +/* + +@version V5.06 29 Sept 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Latest version is available at http://adodb.sourceforge.net + + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Active Record implementation. Superset of Zend Framework's. + + This is "Active Record eXtended" to support JOIN, WORK and LAZY mode by Chris Ravenscroft chris#voilaweb.com + + Version 0.9 + + See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord + for info on Ruby on Rails Active Record implementation +*/ + + + // CFR: Active Records Definitions +define('ADODB_JOIN_AR', 0x01); +define('ADODB_WORK_AR', 0x02); +define('ADODB_LAZY_AR', 0x03); + + +global $_ADODB_ACTIVE_DBS; +global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info +global $ACTIVE_RECORD_SAFETY; // set to false to disable safety checks +global $ADODB_ACTIVE_DEFVALS; // use default values of table definition when creating new active record. + +// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat +$_ADODB_ACTIVE_DBS = array(); +$ACTIVE_RECORD_SAFETY = true; // CFR: disabled while playing with relations +$ADODB_ACTIVE_DEFVALS = false; + +class ADODB_Active_DB { + var $db; // ADOConnection + var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename +} + +class ADODB_Active_Table { + var $name; // table name + var $flds; // assoc array of adofieldobjs, indexed by fieldname + var $keys; // assoc array of primary keys, indexed by fieldname + var $_created; // only used when stored as a cached file + var $_belongsTo = array(); + var $_hasMany = array(); + var $_colsCount; // total columns count, including relations + + function updateColsCount() + { + $this->_colsCount = sizeof($this->flds); + foreach($this->_belongsTo as $foreignTable) + $this->_colsCount += sizeof($foreignTable->TableInfo()->flds); + foreach($this->_hasMany as $foreignTable) + $this->_colsCount += sizeof($foreignTable->TableInfo()->flds); + } +} + +// returns index into $_ADODB_ACTIVE_DBS +function ADODB_SetDatabaseAdapter(&$db) +{ + global $_ADODB_ACTIVE_DBS; + + foreach($_ADODB_ACTIVE_DBS as $k => $d) { + if (PHP_VERSION >= 5) { + if ($d->db === $db) return $k; + } else { + if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database) + return $k; + } + } + + $obj = new ADODB_Active_DB(); + $obj->db = $db; + $obj->tables = array(); + + $_ADODB_ACTIVE_DBS[] = $obj; + + return sizeof($_ADODB_ACTIVE_DBS)-1; +} + + +class ADODB_Active_Record { + static $_changeNames = true; // dynamically pluralize table names + static $_foreignSuffix = '_id'; // + var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] + var $_table; // tablename, if set in class definition then use it as table name + var $_sTable; // singularized table name + var $_pTable; // pluralized table name + var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat] + var $_where; // where clause set in Load() + var $_saved = false; // indicates whether data is already inserted. + var $_lasterr = false; // last error message + var $_original = false; // the original values loaded or inserted, refreshed on update + + var $foreignName; // CFR: class name when in a relationship + + static function UseDefaultValues($bool=null) + { + global $ADODB_ACTIVE_DEFVALS; + if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool; + return $ADODB_ACTIVE_DEFVALS; + } + + // should be static + static function SetDatabaseAdapter(&$db) + { + return ADODB_SetDatabaseAdapter($db); + } + + + public function __set($name, $value) + { + $name = str_replace(' ', '_', $name); + $this->$name = $value; + } + + // php5 constructor + // Note: if $table is defined, then we will use it as our table name + // Otherwise we will use our classname... + // In our database, table names are pluralized (because there can be + // more than one row!) + // Similarly, if $table is defined here, it has to be plural form. + // + // $options is an array that allows us to tweak the constructor's behaviour + // if $options['refresh'] is true, we re-scan our metadata information + // if $options['new'] is true, we forget all relations + function __construct($table = false, $pkeyarr=false, $db=false, $options=array()) + { + global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; + + if ($db == false && is_object($pkeyarr)) { + $db = $pkeyarr; + $pkeyarr = false; + } + + if($table) + { + // table argument exists. It is expected to be + // already plural form. + $this->_pTable = $table; + $this->_sTable = $this->_singularize($this->_pTable); + } + else + { + // We will use current classname as table name. + // We need to pluralize it for the real table name. + $this->_sTable = strtolower(get_class($this)); + $this->_pTable = $this->_pluralize($this->_sTable); + } + $this->_table = &$this->_pTable; + + $this->foreignName = $this->_sTable; // CFR: default foreign name (singular) + + if ($db) { + $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); + } else + $this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1; + + + if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); + + $this->_tableat = $this->_table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future + + // CFR: Just added this option because UpdateActiveTable() can refresh its information + // but there was no way to ask it to do that. + $forceUpdate = (isset($options['refresh']) && true === $options['refresh']); + $this->UpdateActiveTable($pkeyarr, $forceUpdate); + if(isset($options['new']) && true === $options['new']) + { + $table =& $this->TableInfo(); + unset($table->_hasMany); + unset($table->_belongsTo); + $table->_hasMany = array(); + $table->_belongsTo = array(); + } + } + + function __wakeup() + { + $class = get_class($this); + new $class; + } + + // CFR: Constants found in Rails + static $IrregularP = array( + 'PERSON' => 'people', + 'MAN' => 'men', + 'WOMAN' => 'women', + 'CHILD' => 'children', + 'COW' => 'kine', + ); + + static $IrregularS = array( + 'PEOPLE' => 'PERSON', + 'MEN' => 'man', + 'WOMEN' => 'woman', + 'CHILDREN' => 'child', + 'KINE' => 'cow', + ); + + static $WeIsI = array( + 'EQUIPMENT' => true, + 'INFORMATION' => true, + 'RICE' => true, + 'MONEY' => true, + 'SPECIES' => true, + 'SERIES' => true, + 'FISH' => true, + 'SHEEP' => true, + ); + + function _pluralize($table) + { + if (!ADODB_Active_Record::$_changeNames) return $table; + + $ut = strtoupper($table); + if(isset(self::$WeIsI[$ut])) + { + return $table; + } + if(isset(self::$IrregularP[$ut])) + { + return self::$IrregularP[$ut]; + } + $len = strlen($table); + $lastc = $ut[$len-1]; + $lastc2 = substr($ut,$len-2); + switch ($lastc) { + case 'S': + return $table.'es'; + case 'Y': + return substr($table,0,$len-1).'ies'; + case 'X': + return $table.'es'; + case 'H': + if ($lastc2 == 'CH' || $lastc2 == 'SH') + return $table.'es'; + default: + return $table.'s'; + } + } + + // CFR Lamest singular inflector ever - @todo Make it real! + // Note: There is an assumption here...and it is that the argument's length >= 4 + function _singularize($table) + { + + if (!ADODB_Active_Record::$_changeNames) return $table; + + $ut = strtoupper($table); + if(isset(self::$WeIsI[$ut])) + { + return $table; + } + if(isset(self::$IrregularS[$ut])) + { + return self::$IrregularS[$ut]; + } + $len = strlen($table); + if($ut[$len-1] != 'S') + return $table; // I know...forget oxen + if($ut[$len-2] != 'E') + return substr($table, 0, $len-1); + switch($ut[$len-3]) + { + case 'S': + case 'X': + return substr($table, 0, $len-2); + case 'I': + return substr($table, 0, $len-3) . 'y'; + case 'H'; + if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') + return substr($table, 0, $len-2); + default: + return substr($table, 0, $len-1); // ? + } + } + + /* + * ar->foreignName will contain the name of the tables associated with this table because + * these other tables' rows may also be referenced by this table using theirname_id or the provided + * foreign keys (this index name is stored in ar->foreignKey) + * + * this-table.id = other-table-#1.this-table_id + * = other-table-#2.this-table_id + */ + function hasMany($foreignRef,$foreignKey=false) + { + $ar = new ADODB_Active_Record($foreignRef); + $ar->foreignName = $foreignRef; + $ar->UpdateActiveTable(); + $ar->foreignKey = ($foreignKey) ? $foreignKey : strtolower(get_class($this)) . self::$_foreignSuffix; + + $table =& $this->TableInfo(); + if(!isset($table->_hasMany[$foreignRef])) + { + $table->_hasMany[$foreignRef] = $ar; + $table->updateColsCount(); + } +# @todo Can I make this guy be lazy? + $this->$foreignRef = $table->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get() + } + + /** + * ar->foreignName will contain the name of the tables associated with this table because + * this table's rows may also be referenced by those tables using thistable_id or the provided + * foreign keys (this index name is stored in ar->foreignKey) + * + * this-table.other-table_id = other-table.id + */ + function belongsTo($foreignRef,$foreignKey=false) + { + global $inflector; + + $ar = new ADODB_Active_Record($this->_pluralize($foreignRef)); + $ar->foreignName = $foreignRef; + $ar->UpdateActiveTable(); + $ar->foreignKey = ($foreignKey) ? $foreignKey : $ar->foreignName . self::$_foreignSuffix; + + $table =& $this->TableInfo(); + if(!isset($table->_belongsTo[$foreignRef])) + { + $table->_belongsTo[$foreignRef] = $ar; + $table->updateColsCount(); + } + $this->$foreignRef = $table->_belongsTo[$foreignRef]; + } + + /** + * __get Access properties - used for lazy loading + * + * @param mixed $name + * @access protected + * @return void + */ + function __get($name) + { + return $this->LoadRelations($name, '', -1. -1); + } + + function LoadRelations($name, $whereOrderBy, $offset=-1, $limit=-1) + { + $extras = array(); + if($offset >= 0) $extras['offset'] = $offset; + if($limit >= 0) $extras['limit'] = $limit; + $table =& $this->TableInfo(); + + if (strlen($whereOrderBy)) + if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy)) + if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy)) + $whereOrderBy = 'AND '.$whereOrderBy; + + if(!empty($table->_belongsTo[$name])) + { + $obj = $table->_belongsTo[$name]; + $columnName = $obj->foreignKey; + if(empty($this->$columnName)) + $this->$name = null; + else + { + if(($k = reset($obj->TableInfo()->keys))) + $belongsToId = $k; + else + $belongsToId = 'id'; + + $arrayOfOne = + $obj->Find( + $belongsToId.'='.$this->$columnName.' '.$whereOrderBy, false, false, $extras); + $this->$name = $arrayOfOne[0]; + } + return $this->$name; + } + if(!empty($table->_hasMany[$name])) + { + $obj = $table->_hasMany[$name]; + if(($k = reset($table->keys))) + $hasManyId = $k; + else + $hasManyId = 'id'; + + $this->$name = + $obj->Find( + $obj->foreignKey.'='.$this->$hasManyId.' '.$whereOrderBy, false, false, $extras); + return $this->$name; + } + } + ////////////////////////////////// + + // update metadata + function UpdateActiveTable($pkeys=false,$forceUpdate=false) + { + global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; + global $ADODB_ACTIVE_DEFVALS, $ADODB_FETCH_MODE; + + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + + $table = $this->_table; + $tables = $activedb->tables; + $tableat = $this->_tableat; + if (!$forceUpdate && !empty($tables[$tableat])) { + + $tobj = $tables[$tableat]; + foreach($tobj->flds as $name => $fld) { + if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) + $this->$name = $fld->default_value; + else + $this->$name = null; + } + return; + } + + $db = $activedb->db; + $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; + if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) { + $fp = fopen($fname,'r'); + @flock($fp, LOCK_SH); + $acttab = unserialize(fread($fp,100000)); + fclose($fp); + if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) { + // abs(rand()) randomizes deletion, reducing contention to delete/refresh file + // ideally, you should cache at least 32 secs + $activedb->tables[$table] = $acttab; + + //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname"); + return; + } else if ($db->debug) { + ADOConnection::outp("Refreshing cached active record file: $fname"); + } + } + $activetab = new ADODB_Active_Table(); + $activetab->name = $table; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); + + $cols = $db->MetaColumns($table); + + if (isset($savem)) $db->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$cols) { + $this->Error("Invalid table name: $table",'UpdateActiveTable'); + return false; + } + $fld = reset($cols); + if (!$pkeys) { + if (isset($fld->primary_key)) { + $pkeys = array(); + foreach($cols as $name => $fld) { + if (!empty($fld->primary_key)) $pkeys[] = $name; + } + } else + $pkeys = $this->GetPrimaryKeys($db, $table); + } + if (empty($pkeys)) { + $this->Error("No primary key found for table $table",'UpdateActiveTable'); + return false; + } + + $attr = array(); + $keys = array(); + + switch($ADODB_ASSOC_CASE) { + case 0: + foreach($cols as $name => $fldobj) { + $name = strtolower($name); + if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) + $this->$name = $fldobj->default_value; + else + $this->$name = null; + $attr[$name] = $fldobj; + } + foreach($pkeys as $k => $name) { + $keys[strtolower($name)] = strtolower($name); + } + break; + + case 1: + foreach($cols as $name => $fldobj) { + $name = strtoupper($name); + + if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) + $this->$name = $fldobj->default_value; + else + $this->$name = null; + $attr[$name] = $fldobj; + } + + foreach($pkeys as $k => $name) { + $keys[strtoupper($name)] = strtoupper($name); + } + break; + default: + foreach($cols as $name => $fldobj) { + $name = ($fldobj->name); + + if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) + $this->$name = $fldobj->default_value; + else + $this->$name = null; + $attr[$name] = $fldobj; + } + foreach($pkeys as $k => $name) { + $keys[$name] = $cols[$name]->name; + } + break; + } + + $activetab->keys = $keys; + $activetab->flds = $attr; + $activetab->updateColsCount(); + + if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) { + $activetab->_created = time(); + $s = serialize($activetab); + if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + adodb_write_file($fname,$s); + } + if (isset($activedb->tables[$table])) { + $oldtab = $activedb->tables[$table]; + + if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo; + if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany; + } + $activedb->tables[$table] = $activetab; + } + + function GetPrimaryKeys(&$db, $table) + { + return $db->MetaPrimaryKeys($table); + } + + // error handler for both PHP4+5. + function Error($err,$fn) + { + global $_ADODB_ACTIVE_DBS; + + $fn = get_class($this).'::'.$fn; + $this->_lasterr = $fn.': '.$err; + + if ($this->_dbat < 0) $db = false; + else { + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $db = $activedb->db; + } + + if (function_exists('adodb_throw')) { + if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false); + else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db); + } else + if (!$db || $db->debug) ADOConnection::outp($this->_lasterr); + + } + + // return last error message + function ErrorMsg() + { + if (!function_exists('adodb_throw')) { + if ($this->_dbat < 0) $db = false; + else $db = $this->DB(); + + // last error could be database error too + if ($db && $db->ErrorMsg()) return $db->ErrorMsg(); + } + return $this->_lasterr; + } + + function ErrorNo() + { + if ($this->_dbat < 0) return -9999; // no database connection... + $db = $this->DB(); + + return (int) $db->ErrorNo(); + } + + + // retrieve ADOConnection from _ADODB_Active_DBs + function DB() + { + global $_ADODB_ACTIVE_DBS; + + if ($this->_dbat < 0) { + $false = false; + $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB"); + return $false; + } + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $db = $activedb->db; + return $db; + } + + // retrieve ADODB_Active_Table + function &TableInfo() + { + global $_ADODB_ACTIVE_DBS; + + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $table = $activedb->tables[$this->_tableat]; + return $table; + } + + + // I have an ON INSERT trigger on a table that sets other columns in the table. + // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook + function Reload() + { + $db =& $this->DB(); if (!$db) return false; + $table =& $this->TableInfo(); + $where = $this->GenWhere($db, $table); + return($this->Load($where)); + } + + + // set a numeric array (using natural table field ordering) as object properties + function Set(&$row) + { + global $ACTIVE_RECORD_SAFETY; + + $db = $this->DB(); + + if (!$row) { + $this->_saved = false; + return false; + } + + $this->_saved = true; + + $table = $this->TableInfo(); + $sizeofFlds = sizeof($table->flds); + $sizeofRow = sizeof($row); + if ($ACTIVE_RECORD_SAFETY && $table->_colsCount != $sizeofRow && $sizeofFlds != $sizeofRow) { + # <AP> + $bad_size = TRUE; + if($sizeofRow == 2 * $table->_colsCount || $sizeofRow == 2 * $sizeofFlds) { + // Only keep string keys + $keys = array_filter(array_keys($row), 'is_string'); + if (sizeof($keys) == sizeof($table->flds)) + $bad_size = FALSE; + } + if ($bad_size) { + $this->Error("Table structure of $this->_table has changed","Load"); + return false; + } + # </AP> + } + else + $keys = array_keys($row); + # <AP> + reset($keys); + $this->_original = array(); + foreach($table->flds as $name=>$fld) + { + $value = $row[current($keys)]; + $this->$name = $value; + $this->_original[] = $value; + if(!next($keys)) break; + } + $table =& $this->TableInfo(); + foreach($table->_belongsTo as $foreignTable) + { + $ft = $foreignTable->TableInfo(); + $propertyName = $ft->name; + foreach($ft->flds as $name=>$fld) + { + $value = $row[current($keys)]; + $foreignTable->$name = $value; + $foreignTable->_original[] = $value; + if(!next($keys)) break; + } + } + foreach($table->_hasMany as $foreignTable) + { + $ft = $foreignTable->TableInfo(); + foreach($ft->flds as $name=>$fld) + { + $value = $row[current($keys)]; + $foreignTable->$name = $value; + $foreignTable->_original[] = $value; + if(!next($keys)) break; + } + } + # </AP> + return true; + } + + // get last inserted id for INSERT + function LastInsertID(&$db,$fieldname) + { + if ($db->hasInsertID) + $val = $db->Insert_ID($this->_table,$fieldname); + else + $val = false; + + if (is_null($val) || $val === false) { + // this might not work reliably in multi-user environment + return $db->GetOne("select max(".$fieldname.") from ".$this->_table); + } + return $val; + } + + // quote data in where clause + function doquote(&$db, $val,$t) + { + switch($t) { + case 'D': + case 'T': + if (empty($val)) return 'null'; + + case 'C': + case 'X': + if (is_null($val)) return 'null'; + + if (strlen($val)>1 && + (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { + return $db->qstr($val); + break; + } + default: + return $val; + break; + } + } + + // generate where clause for an UPDATE/SELECT + function GenWhere(&$db, &$table) + { + $keys = $table->keys; + $parr = array(); + + foreach($keys as $k) { + $f = $table->flds[$k]; + if ($f) { + $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type)); + } + } + return implode(' and ', $parr); + } + + + //------------------------------------------------------------ Public functions below + + function Load($where=null,$bindarr=false) + { + $db = $this->DB(); if (!$db) return false; + $this->_where = $where; + + $save = $db->SetFetchMode(ADODB_FETCH_NUM); + $qry = "select * from ".$this->_table; + $table =& $this->TableInfo(); + + if(($k = reset($table->keys))) + $hasManyId = $k; + else + $hasManyId = 'id'; + + foreach($table->_belongsTo as $foreignTable) + { + if(($k = reset($foreignTable->TableInfo()->keys))) + { + $belongsToId = $k; + } + else + { + $belongsToId = 'id'; + } + $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. + $this->_table.'.'.$foreignTable->foreignKey.'='. + $foreignTable->_table.'.'.$belongsToId; + } + foreach($table->_hasMany as $foreignTable) + { + $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. + $this->_table.'.'.$hasManyId.'='. + $foreignTable->_table.'.'.$foreignTable->foreignKey; + } + if($where) + $qry .= ' WHERE '.$where; + + // Simple case: no relations. Load row and return. + if((count($table->_hasMany) + count($table->_belongsTo)) < 1) + { + $row = $db->GetRow($qry,$bindarr); + if(!$row) + return false; + $db->SetFetchMode($save); + return $this->Set($row); + } + + // More complex case when relations have to be collated + $rows = $db->GetAll($qry,$bindarr); + if(!$rows) + return false; + $db->SetFetchMode($save); + if(count($rows) < 1) + return false; + $class = get_class($this); + $isFirstRow = true; + + if(($k = reset($this->TableInfo()->keys))) + $myId = $k; + else + $myId = 'id'; + $index = 0; $found = false; + /** @todo Improve by storing once and for all in table metadata */ + /** @todo Also re-use info for hasManyId */ + foreach($this->TableInfo()->flds as $fld) + { + if($fld->name == $myId) + { + $found = true; + break; + } + $index++; + } + if(!$found) + $this->outp_throw("Unable to locate key $myId for $class in Load()",'Load'); + + foreach($rows as $row) + { + $rowId = intval($row[$index]); + if($rowId > 0) + { + if($isFirstRow) + { + $isFirstRow = false; + if(!$this->Set($row)) + return false; + } + $obj = new $class($table,false,$db); + $obj->Set($row); + // TODO Copy/paste code below: bad! + if(count($table->_hasMany) > 0) + { + foreach($table->_hasMany as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + if(!empty($obj->$foreignName)) + { + if(!is_array($this->$foreignName)) + { + $foreignObj = $this->$foreignName; + $this->$foreignName = array(clone($foreignObj)); + } + else + { + $foreignObj = $obj->$foreignName; + array_push($this->$foreignName, clone($foreignObj)); + } + } + } + } + if(count($table->_belongsTo) > 0) + { + foreach($table->_belongsTo as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + if(!empty($obj->$foreignName)) + { + if(!is_array($this->$foreignName)) + { + $foreignObj = $this->$foreignName; + $this->$foreignName = array(clone($foreignObj)); + } + else + { + $foreignObj = $obj->$foreignName; + array_push($this->$foreignName, clone($foreignObj)); + } + } + } + } + } + } + return true; + } + + // false on error + function Save() + { + if ($this->_saved) $ok = $this->Update(); + else $ok = $this->Insert(); + + return $ok; + } + + // CFR: Sometimes we may wish to consider that an object is not to be replaced but inserted. + // Sample use case: an 'undo' command object (after a delete()) + function Dirty() + { + $this->_saved = false; + } + + // false on error + function Insert() + { + $db = $this->DB(); if (!$db) return false; + $cnt = 0; + $table = $this->TableInfo(); + + $valarr = array(); + $names = array(); + $valstr = array(); + + foreach($table->flds as $name=>$fld) { + $val = $this->$name; + if(!is_null($val) || !array_key_exists($name, $table->keys)) { + $valarr[] = $val; + $names[] = $name; + $valstr[] = $db->Param($cnt); + $cnt += 1; + } + } + + if (empty($names)){ + foreach($table->flds as $name=>$fld) { + $valarr[] = null; + $names[] = $name; + $valstr[] = $db->Param($cnt); + $cnt += 1; + } + } + $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')'; + $ok = $db->Execute($sql,$valarr); + + if ($ok) { + $this->_saved = true; + $autoinc = false; + foreach($table->keys as $k) { + if (is_null($this->$k)) { + $autoinc = true; + break; + } + } + if ($autoinc && sizeof($table->keys) == 1) { + $k = reset($table->keys); + $this->$k = $this->LastInsertID($db,$k); + } + } + + $this->_original = $valarr; + return !empty($ok); + } + + function Delete() + { + $db = $this->DB(); if (!$db) return false; + $table = $this->TableInfo(); + + $where = $this->GenWhere($db,$table); + $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where; + $ok = $db->Execute($sql); + + return $ok ? true : false; + } + + // returns an array of active record objects + function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) + { + $db = $this->DB(); if (!$db || empty($this->_table)) return false; + $table =& $this->TableInfo(); + $arr = $db->GetActiveRecordsClass(get_class($this),$this, $whereOrderBy,$bindarr,$pkeysArr,$extra, + array('foreignName'=>$this->foreignName, 'belongsTo'=>$table->_belongsTo, 'hasMany'=>$table->_hasMany)); + return $arr; + } + + // CFR: In introduced this method to ensure that inner workings are not disturbed by + // subclasses...for instance when GetActiveRecordsClass invokes Find() + // Why am I not invoking parent::Find? + // Shockingly because I want to preserve PHP4 compatibility. + function packageFind($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) + { + $db = $this->DB(); if (!$db || empty($this->_table)) return false; + $table =& $this->TableInfo(); + $arr = $db->GetActiveRecordsClass(get_class($this),$this, $whereOrderBy,$bindarr,$pkeysArr,$extra, + array('foreignName'=>$this->foreignName, 'belongsTo'=>$table->_belongsTo, 'hasMany'=>$table->_hasMany)); + return $arr; + } + + // returns 0 on error, 1 on update, 2 on insert + function Replace() + { + global $ADODB_ASSOC_CASE; + + $db = $this->DB(); if (!$db) return false; + $table = $this->TableInfo(); + + $pkey = $table->keys; + + foreach($table->flds as $name=>$fld) { + $val = $this->$name; + /* + if (is_null($val)) { + if (isset($fld->not_null) && $fld->not_null) { + if (isset($fld->default_value) && strlen($fld->default_value)) continue; + else { + $this->Error("Cannot update null into $name","Replace"); + return false; + } + } + }*/ + if (is_null($val) && !empty($fld->auto_increment)) { + continue; + } + $t = $db->MetaType($fld->type); + $arr[$name] = $this->doquote($db,$val,$t); + $valarr[] = $val; + } + + if (!is_array($pkey)) $pkey = array($pkey); + + + if ($ADODB_ASSOC_CASE == 0) + foreach($pkey as $k => $v) + $pkey[$k] = strtolower($v); + elseif ($ADODB_ASSOC_CASE == 1) + foreach($pkey as $k => $v) + $pkey[$k] = strtoupper($v); + + $ok = $db->Replace($this->_table,$arr,$pkey); + if ($ok) { + $this->_saved = true; // 1= update 2=insert + if ($ok == 2) { + $autoinc = false; + foreach($table->keys as $k) { + if (is_null($this->$k)) { + $autoinc = true; + break; + } + } + if ($autoinc && sizeof($table->keys) == 1) { + $k = reset($table->keys); + $this->$k = $this->LastInsertID($db,$k); + } + } + + $this->_original = $valarr; + } + return $ok; + } + + // returns 0 on error, 1 on update, -1 if no change in data (no update) + function Update() + { + $db = $this->DB(); if (!$db) return false; + $table = $this->TableInfo(); + + $where = $this->GenWhere($db, $table); + + if (!$where) { + $this->error("Where missing for table $table", "Update"); + return false; + } + $valarr = array(); + $neworig = array(); + $pairs = array(); + $i = -1; + $cnt = 0; + foreach($table->flds as $name=>$fld) { + $i += 1; + $val = $this->$name; + $neworig[] = $val; + + if (isset($table->keys[$name])) { + continue; + } + + if (is_null($val)) { + if (isset($fld->not_null) && $fld->not_null) { + if (isset($fld->default_value) && strlen($fld->default_value)) continue; + else { + $this->Error("Cannot set field $name to NULL","Update"); + return false; + } + } + } + + if (isset($this->_original[$i]) && $val == $this->_original[$i]) { + continue; + } + $valarr[] = $val; + $pairs[] = $name.'='.$db->Param($cnt); + $cnt += 1; + } + + + if (!$cnt) return -1; + $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where; + $ok = $db->Execute($sql,$valarr); + if ($ok) { + $this->_original = $neworig; + return 1; + } + return 0; + } + + function GetAttributeNames() + { + $table = $this->TableInfo(); + if (!$table) return false; + return array_keys($table->flds); + } + +}; + +function adodb_GetActiveRecordsClass(&$db, $class, $tableObj,$whereOrderBy,$bindarr, $primkeyArr, + $extra, $relations) +{ + global $_ADODB_ACTIVE_DBS; + + if (empty($extra['loading'])) $extra['loading'] = ADODB_LAZY_AR; + + $save = $db->SetFetchMode(ADODB_FETCH_NUM); + $table = &$tableObj->_table; + $tableInfo =& $tableObj->TableInfo(); + if(($k = reset($tableInfo->keys))) + $myId = $k; + else + $myId = 'id'; + $index = 0; $found = false; + /** @todo Improve by storing once and for all in table metadata */ + /** @todo Also re-use info for hasManyId */ + foreach($tableInfo->flds as $fld) + { + if($fld->name == $myId) + { + $found = true; + break; + } + $index++; + } + if(!$found) + $db->outp_throw("Unable to locate key $myId for $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); + + $qry = "select * from ".$table; + if(ADODB_JOIN_AR == $extra['loading']) + { + if(!empty($relations['belongsTo'])) + { + foreach($relations['belongsTo'] as $foreignTable) + { + if(($k = reset($foreignTable->TableInfo()->keys))) + { + $belongsToId = $k; + } + else + { + $belongsToId = 'id'; + } + + $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. + $table.'.'.$foreignTable->foreignKey.'='. + $foreignTable->_table.'.'.$belongsToId; + } + } + if(!empty($relations['hasMany'])) + { + if(empty($relations['foreignName'])) + $db->outp_throw("Missing foreignName is relation specification in GetActiveRecordsClass()",'GetActiveRecordsClass'); + if(($k = reset($tableInfo->keys))) + $hasManyId = $k; + else + $hasManyId = 'id'; + + foreach($relations['hasMany'] as $foreignTable) + { + $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. + $table.'.'.$hasManyId.'='. + $foreignTable->_table.'.'.$foreignTable->foreignKey; + } + } + } + if (!empty($whereOrderBy)) + $qry .= ' WHERE '.$whereOrderBy; + if(isset($extra['limit'])) + { + $rows = false; + if(isset($extra['offset'])) { + $rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset']); + } else { + $rs = $db->SelectLimit($qry, $extra['limit']); + } + if ($rs) { + while (!$rs->EOF) { + $rows[] = $rs->fields; + $rs->MoveNext(); + } + } + } else + $rows = $db->GetAll($qry,$bindarr); + + $db->SetFetchMode($save); + + $false = false; + + if ($rows === false) { + return $false; + } + + + if (!isset($_ADODB_ACTIVE_DBS)) { + include(ADODB_DIR.'/adodb-active-record.inc.php'); + } + if (!class_exists($class)) { + $db->outp_throw("Unknown class $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); + return $false; + } + $uniqArr = array(); // CFR Keep track of records for relations + $arr = array(); + // arrRef will be the structure that knows about our objects. + // It is an associative array. + // We will, however, return arr, preserving regular 0.. order so that + // obj[0] can be used by app developpers. + $arrRef = array(); + $bTos = array(); // Will store belongTo's indices if any + foreach($rows as $row) { + + $obj = new $class($table,$primkeyArr,$db); + if ($obj->ErrorNo()){ + $db->_errorMsg = $obj->ErrorMsg(); + return $false; + } + $obj->Set($row); + // CFR: FIXME: Insane assumption here: + // If the first column returned is an integer, then it's a 'id' field + // And to make things a bit worse, I use intval() rather than is_int() because, in fact, + // $row[0] is not an integer. + // + // So, what does this whole block do? + // When relationships are found, we perform JOINs. This is fast. But not accurate: + // instead of returning n objects with their n' associated cousins, + // we get n*n' objects. This code fixes this. + // Note: to-many relationships mess around with the 'limit' parameter + $rowId = intval($row[$index]); + + if(ADODB_WORK_AR == $extra['loading']) + { + $arrRef[$rowId] = $obj; + $arr[] = &$arrRef[$rowId]; + if(!isset($indices)) + $indices = $rowId; + else + $indices .= ','.$rowId; + if(!empty($relations['belongsTo'])) + { + foreach($relations['belongsTo'] as $foreignTable) + { + $foreignTableRef = $foreignTable->foreignKey; + // First array: list of foreign ids we are looking for + if(empty($bTos[$foreignTableRef])) + $bTos[$foreignTableRef] = array(); + // Second array: list of ids found + if(empty($obj->$foreignTableRef)) + continue; + if(empty($bTos[$foreignTableRef][$obj->$foreignTableRef])) + $bTos[$foreignTableRef][$obj->$foreignTableRef] = array(); + $bTos[$foreignTableRef][$obj->$foreignTableRef][] = $obj; + } + } + continue; + } + + if($rowId>0) + { + if(ADODB_JOIN_AR == $extra['loading']) + { + $isNewObj = !isset($uniqArr['_'.$row[0]]); + if($isNewObj) + $uniqArr['_'.$row[0]] = $obj; + + // TODO Copy/paste code below: bad! + if(!empty($relations['hasMany'])) + { + foreach($relations['hasMany'] as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + if(!empty($obj->$foreignName)) + { + $masterObj = &$uniqArr['_'.$row[0]]; + // Assumption: this property exists in every object since they are instances of the same class + if(!is_array($masterObj->$foreignName)) + { + // Pluck! + $foreignObj = $masterObj->$foreignName; + $masterObj->$foreignName = array(clone($foreignObj)); + } + else + { + // Pluck pluck! + $foreignObj = $obj->$foreignName; + array_push($masterObj->$foreignName, clone($foreignObj)); + } + } + } + } + if(!empty($relations['belongsTo'])) + { + foreach($relations['belongsTo'] as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + if(!empty($obj->$foreignName)) + { + $masterObj = &$uniqArr['_'.$row[0]]; + // Assumption: this property exists in every object since they are instances of the same class + if(!is_array($masterObj->$foreignName)) + { + // Pluck! + $foreignObj = $masterObj->$foreignName; + $masterObj->$foreignName = array(clone($foreignObj)); + } + else + { + // Pluck pluck! + $foreignObj = $obj->$foreignName; + array_push($masterObj->$foreignName, clone($foreignObj)); + } + } + } + } + if(!$isNewObj) + unset($obj); // We do not need this object itself anymore and do not want it re-added to the main array + } + else if(ADODB_LAZY_AR == $extra['loading']) + { + // Lazy loading: we need to give AdoDb a hint that we have not really loaded + // anything, all the while keeping enough information on what we wish to load. + // Let's do this by keeping the relevant info in our relationship arrays + // but get rid of the actual properties. + // We will then use PHP's __get to load these properties on-demand. + if(!empty($relations['hasMany'])) + { + foreach($relations['hasMany'] as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + if(!empty($obj->$foreignName)) + { + unset($obj->$foreignName); + } + } + } + if(!empty($relations['belongsTo'])) + { + foreach($relations['belongsTo'] as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + if(!empty($obj->$foreignName)) + { + unset($obj->$foreignName); + } + } + } + } + } + + if(isset($obj)) + $arr[] = $obj; + } + + if(ADODB_WORK_AR == $extra['loading']) + { + // The best of both worlds? + // Here, the number of queries is constant: 1 + n*relationship. + // The second query will allow us to perform a good join + // while preserving LIMIT etc. + if(!empty($relations['hasMany'])) + { + foreach($relations['hasMany'] as $foreignTable) + { + $foreignName = $foreignTable->foreignName; + $className = ucfirst($foreignTable->_singularize($foreignName)); + $obj = new $className(); + $dbClassRef = $foreignTable->foreignKey; + $objs = $obj->packageFind($dbClassRef.' IN ('.$indices.')'); + foreach($objs as $obj) + { + if(!is_array($arrRef[$obj->$dbClassRef]->$foreignName)) + $arrRef[$obj->$dbClassRef]->$foreignName = array(); + array_push($arrRef[$obj->$dbClassRef]->$foreignName, $obj); + } + } + + } + if(!empty($relations['belongsTo'])) + { + foreach($relations['belongsTo'] as $foreignTable) + { + $foreignTableRef = $foreignTable->foreignKey; + if(empty($bTos[$foreignTableRef])) + continue; + if(($k = reset($foreignTable->TableInfo()->keys))) + { + $belongsToId = $k; + } + else + { + $belongsToId = 'id'; + } + $origObjsArr = $bTos[$foreignTableRef]; + $bTosString = implode(',', array_keys($bTos[$foreignTableRef])); + $foreignName = $foreignTable->foreignName; + $className = ucfirst($foreignTable->_singularize($foreignName)); + $obj = new $className(); + $objs = $obj->packageFind($belongsToId.' IN ('.$bTosString.')'); + foreach($objs as $obj) + { + foreach($origObjsArr[$obj->$belongsToId] as $idx=>$origObj) + { + $origObj->$foreignName = $obj; + } + } + } + } + } + + return $arr; +} +?> diff --git a/pos/is4c-nf/lib/adodb5/adodb-csvlib.inc.php b/pos/is4c-nf/lib/adodb5/adodb-csvlib.inc.php new file mode 100644 index 000000000..1f7543f9f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-csvlib.inc.php @@ -0,0 +1,317 @@ +<?php + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +global $ADODB_INCLUDED_CSV; +$ADODB_INCLUDED_CSV = 1; + +/* + + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for CSV serialization. This is used by the csv/proxy driver and is the + CacheExecute() serialization format. + + ==== NOTE ==== + Format documented at http://php.weblogs.com/ADODB_CSV + ============== +*/ + + /** + * convert a recordset into special format + * + * @param rs the recordset + * + * @return the CSV formated data + */ + function _rs2serialize(&$rs,$conn=false,$sql='') + { + $max = ($rs) ? $rs->FieldCount() : 0; + + if ($sql) $sql = urlencode($sql); + // metadata setup + + if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete + if (is_object($conn)) { + $sql .= ','.$conn->Affected_Rows(); + $sql .= ','.$conn->Insert_ID(); + } else + $sql .= ',,'; + + $text = "====-1,0,$sql\n"; + return $text; + } + $tt = ($rs->timeCreated) ? $rs->timeCreated : time(); + + ## changed format from ====0 to ====1 + $line = "====1,$tt,$sql\n"; + + if ($rs->databaseType == 'array') { + $rows = $rs->_array; + } else { + $rows = array(); + while (!$rs->EOF) { + $rows[] = $rs->fields; + $rs->MoveNext(); + } + } + + for($i=0; $i < $max; $i++) { + $o = $rs->FetchField($i); + $flds[] = $o; + } + + $savefetch = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; + $class = $rs->connection->arrayClass; + $rs2 = new $class(); + $rs2->sql = $rs->sql; + $rs2->oldProvider = $rs->dataProvider; + $rs2->InitArrayFields($rows,$flds); + $rs2->fetchMode = $savefetch; + return $line.serialize($rs2); + } + + +/** +* Open CSV file and convert it into Data. +* +* @param url file/ftp/http url +* @param err returns the error message +* @param timeout dispose if recordset has been alive for $timeout secs +* +* @return recordset, or false if error occured. If no +* error occurred in sql INSERT/UPDATE/DELETE, +* empty recordset is returned +*/ + function csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array') + { + $false = false; + $err = false; + $fp = @fopen($url,'rb'); + if (!$fp) { + $err = $url.' file/URL not found'; + return $false; + } + @flock($fp, LOCK_SH); + $arr = array(); + $ttl = 0; + + if ($meta = fgetcsv($fp, 32000, ",")) { + // check if error message + if (strncmp($meta[0],'****',4) === 0) { + $err = trim(substr($meta[0],4,1024)); + fclose($fp); + return $false; + } + // check for meta data + // $meta[0] is -1 means return an empty recordset + // $meta[1] contains a time + + if (strncmp($meta[0], '====',4) === 0) { + + if ($meta[0] == "====-1") { + if (sizeof($meta) < 5) { + $err = "Corrupt first line for format -1"; + fclose($fp); + return $false; + } + fclose($fp); + + if ($timeout > 0) { + $err = " Illegal Timeout $timeout "; + return $false; + } + + $rs = new $rsclass($val=true); + $rs->fields = array(); + $rs->timeCreated = $meta[1]; + $rs->EOF = true; + $rs->_numOfFields = 0; + $rs->sql = urldecode($meta[2]); + $rs->affectedrows = (integer)$meta[3]; + $rs->insertid = $meta[4]; + return $rs; + } + # Under high volume loads, we want only 1 thread/process to _write_file + # so that we don't have 50 processes queueing to write the same data. + # We use probabilistic timeout, ahead of time. + # + # -4 sec before timeout, give processes 1/32 chance of timing out + # -2 sec before timeout, give processes 1/16 chance of timing out + # -1 sec after timeout give processes 1/4 chance of timing out + # +0 sec after timeout, give processes 100% chance of timing out + if (sizeof($meta) > 1) { + if($timeout >0){ + $tdiff = (integer)( $meta[1]+$timeout - time()); + if ($tdiff <= 2) { + switch($tdiff) { + case 4: + case 3: + if ((rand() & 31) == 0) { + fclose($fp); + $err = "Timeout 3"; + return $false; + } + break; + case 2: + if ((rand() & 15) == 0) { + fclose($fp); + $err = "Timeout 2"; + return $false; + } + break; + case 1: + if ((rand() & 3) == 0) { + fclose($fp); + $err = "Timeout 1"; + return $false; + } + break; + default: + fclose($fp); + $err = "Timeout 0"; + return $false; + } // switch + + } // if check flush cache + }// (timeout>0) + $ttl = $meta[1]; + } + //================================================ + // new cache format - use serialize extensively... + if ($meta[0] === '====1') { + // slurp in the data + $MAXSIZE = 128000; + + $text = fread($fp,$MAXSIZE); + if (strlen($text)) { + while ($txt = fread($fp,$MAXSIZE)) { + $text .= $txt; + } + } + fclose($fp); + $rs = unserialize($text); + if (is_object($rs)) $rs->timeCreated = $ttl; + else { + $err = "Unable to unserialize recordset"; + //echo htmlspecialchars($text),' !--END--!<p>'; + } + return $rs; + } + + $meta = false; + $meta = fgetcsv($fp, 32000, ","); + if (!$meta) { + fclose($fp); + $err = "Unexpected EOF 1"; + return $false; + } + } + + // Get Column definitions + $flds = array(); + foreach($meta as $o) { + $o2 = explode(':',$o); + if (sizeof($o2)!=3) { + $arr[] = $meta; + $flds = false; + break; + } + $fld = new ADOFieldObject(); + $fld->name = urldecode($o2[0]); + $fld->type = $o2[1]; + $fld->max_length = $o2[2]; + $flds[] = $fld; + } + } else { + fclose($fp); + $err = "Recordset had unexpected EOF 2"; + return $false; + } + + // slurp in the data + $MAXSIZE = 128000; + + $text = ''; + while ($txt = fread($fp,$MAXSIZE)) { + $text .= $txt; + } + + fclose($fp); + @$arr = unserialize($text); + //var_dump($arr); + if (!is_array($arr)) { + $err = "Recordset had unexpected EOF (in serialized recordset)"; + if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!"; + return $false; + } + $rs = new $rsclass(); + $rs->timeCreated = $ttl; + $rs->InitArrayFields($arr,$flds); + return $rs; + } + + + /** + * Save a file $filename and its $contents (normally for caching) with file locking + * Returns true if ok, false if fopen/fwrite error, 0 if rename error (eg. file is locked) + */ + function adodb_write_file($filename, $contents,$debug=false) + { + # http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows + # So to simulate locking, we assume that rename is an atomic operation. + # First we delete $filename, then we create a $tempfile write to it and + # rename to the desired $filename. If the rename works, then we successfully + # modified the file exclusively. + # What a stupid need - having to simulate locking. + # Risks: + # 1. $tempfile name is not unique -- very very low + # 2. unlink($filename) fails -- ok, rename will fail + # 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs + # 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated + if (strncmp(PHP_OS,'WIN',3) === 0) { + // skip the decimal place + $mtime = substr(str_replace(' ','_',microtime()),2); + // getmypid() actually returns 0 on Win98 - never mind! + $tmpname = $filename.uniqid($mtime).getmypid(); + if (!($fd = @fopen($tmpname,'w'))) return false; + if (fwrite($fd,$contents)) $ok = true; + else $ok = false; + fclose($fd); + + if ($ok) { + @chmod($tmpname,0644); + // the tricky moment + @unlink($filename); + if (!@rename($tmpname,$filename)) { + unlink($tmpname); + $ok = 0; + } + if (!$ok) { + if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed')); + } + } + return $ok; + } + if (!($fd = @fopen($filename, 'a'))) return false; + if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) { + if (fwrite( $fd, $contents )) $ok = true; + else $ok = false; + fclose($fd); + @chmod($filename,0644); + }else { + fclose($fd); + if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n"); + $ok = false; + } + + return $ok; + } +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-datadict.inc.php b/pos/is4c-nf/lib/adodb5/adodb-datadict.inc.php new file mode 100644 index 000000000..efcd453bb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-datadict.inc.php @@ -0,0 +1,1008 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + + DOCUMENTATION: + + See adodb/tests/test-datadict.php for docs and examples. +*/ + +/* + Test script for parser +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +function Lens_ParseTest() +{ +$str = "`zcol ACOL` NUMBER(32,2) DEFAULT 'The \"cow\" (and Jim''s dog) jumps over the moon' PRIMARY, INTI INT AUTO DEFAULT 0, zcol2\"afs ds"; +print "<p>$str</p>"; +$a= Lens_ParseArgs($str); +print "<pre>"; +print_r($a); +print "</pre>"; +} + + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { + return preg_match('/^[a-z0-9]*$/i', $text); + } +} + +//Lens_ParseTest(); + +/** + Parse arguments, treat "text" (text) and 'text' as quotation marks. + To escape, use "" or '' or )) + + Will read in "abc def" sans quotes, as: abc def + Same with 'abc def'. + However if `abc def`, then will read in as `abc def` + + @param endstmtchar Character that indicates end of statement + @param tokenchars Include the following characters in tokens apart from A-Z and 0-9 + @returns 2 dimensional array containing parsed tokens. +*/ +function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-') +{ + $pos = 0; + $intoken = false; + $stmtno = 0; + $endquote = false; + $tokens = array(); + $tokens[$stmtno] = array(); + $max = strlen($args); + $quoted = false; + $tokarr = array(); + + while ($pos < $max) { + $ch = substr($args,$pos,1); + switch($ch) { + case ' ': + case "\t": + case "\n": + case "\r": + if (!$quoted) { + if ($intoken) { + $intoken = false; + $tokens[$stmtno][] = implode('',$tokarr); + } + break; + } + + $tokarr[] = $ch; + break; + + case '`': + if ($intoken) $tokarr[] = $ch; + case '(': + case ')': + case '"': + case "'": + + if ($intoken) { + if (empty($endquote)) { + $tokens[$stmtno][] = implode('',$tokarr); + if ($ch == '(') $endquote = ')'; + else $endquote = $ch; + $quoted = true; + $intoken = true; + $tokarr = array(); + } else if ($endquote == $ch) { + $ch2 = substr($args,$pos+1,1); + if ($ch2 == $endquote) { + $pos += 1; + $tokarr[] = $ch2; + } else { + $quoted = false; + $intoken = false; + $tokens[$stmtno][] = implode('',$tokarr); + $endquote = ''; + } + } else + $tokarr[] = $ch; + + }else { + + if ($ch == '(') $endquote = ')'; + else $endquote = $ch; + $quoted = true; + $intoken = true; + $tokarr = array(); + if ($ch == '`') $tokarr[] = '`'; + } + break; + + default: + + if (!$intoken) { + if ($ch == $endstmtchar) { + $stmtno += 1; + $tokens[$stmtno] = array(); + break; + } + + $intoken = true; + $quoted = false; + $endquote = false; + $tokarr = array(); + + } + + if ($quoted) $tokarr[] = $ch; + else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch; + else { + if ($ch == $endstmtchar) { + $tokens[$stmtno][] = implode('',$tokarr); + $stmtno += 1; + $tokens[$stmtno] = array(); + $intoken = false; + $tokarr = array(); + break; + } + $tokens[$stmtno][] = implode('',$tokarr); + $tokens[$stmtno][] = $ch; + $intoken = false; + } + } + $pos += 1; + } + if ($intoken) $tokens[$stmtno][] = implode('',$tokarr); + + return $tokens; +} + + +class ADODB_DataDict { + var $connection; + var $debug = false; + var $dropTable = 'DROP TABLE %s'; + var $renameTable = 'RENAME TABLE %s TO %s'; + var $dropIndex = 'DROP INDEX %s'; + var $addCol = ' ADD'; + var $alterCol = ' ALTER COLUMN'; + var $dropCol = ' DROP COLUMN'; + var $renameColumn = 'ALTER TABLE %s RENAME COLUMN %s TO %s'; // table, old-column, new-column, column-definitions (not used by default) + var $nameRegex = '\w'; + var $nameRegexBrackets = 'a-zA-Z0-9_\(\)'; + var $schema = false; + var $serverInfo = array(); + var $autoIncrement = false; + var $dataProvider; + var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql + var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob + /// in other words, we use a text area for editting. + + function GetCommentSQL($table,$col) + { + return false; + } + + function SetCommentSQL($table,$col,$cmt) + { + return false; + } + + function MetaTables() + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaTables(); + } + + function MetaColumns($tab, $upper=true, $schema=false) + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema); + } + + function MetaPrimaryKeys($tab,$owner=false,$intkey=false) + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey); + } + + function MetaIndexes($table, $primary = false, $owner = false) + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + static $typeMap = array( + 'VARCHAR' => 'C', + 'VARCHAR2' => 'C', + 'CHAR' => 'C', + 'C' => 'C', + 'STRING' => 'C', + 'NCHAR' => 'C', + 'NVARCHAR' => 'C', + 'VARYING' => 'C', + 'BPCHAR' => 'C', + 'CHARACTER' => 'C', + 'INTERVAL' => 'C', # Postgres + 'MACADDR' => 'C', # postgres + 'VAR_STRING' => 'C', # mysql + ## + 'LONGCHAR' => 'X', + 'TEXT' => 'X', + 'NTEXT' => 'X', + 'M' => 'X', + 'X' => 'X', + 'CLOB' => 'X', + 'NCLOB' => 'X', + 'LVARCHAR' => 'X', + ## + 'BLOB' => 'B', + 'IMAGE' => 'B', + 'BINARY' => 'B', + 'VARBINARY' => 'B', + 'LONGBINARY' => 'B', + 'B' => 'B', + ## + 'YEAR' => 'D', // mysql + 'DATE' => 'D', + 'D' => 'D', + ## + 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server + ## + 'TIME' => 'T', + 'TIMESTAMP' => 'T', + 'DATETIME' => 'T', + 'TIMESTAMPTZ' => 'T', + 'SMALLDATETIME' => 'T', + 'T' => 'T', + 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql + ## + 'BOOL' => 'L', + 'BOOLEAN' => 'L', + 'BIT' => 'L', + 'L' => 'L', + ## + 'COUNTER' => 'R', + 'R' => 'R', + 'SERIAL' => 'R', // ifx + 'INT IDENTITY' => 'R', + ## + 'INT' => 'I', + 'INT2' => 'I', + 'INT4' => 'I', + 'INT8' => 'I', + 'INTEGER' => 'I', + 'INTEGER UNSIGNED' => 'I', + 'SHORT' => 'I', + 'TINYINT' => 'I', + 'SMALLINT' => 'I', + 'I' => 'I', + ## + 'LONG' => 'N', // interbase is numeric, oci8 is blob + 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers + 'DECIMAL' => 'N', + 'DEC' => 'N', + 'REAL' => 'N', + 'DOUBLE' => 'N', + 'DOUBLE PRECISION' => 'N', + 'SMALLFLOAT' => 'N', + 'FLOAT' => 'N', + 'NUMBER' => 'N', + 'NUM' => 'N', + 'NUMERIC' => 'N', + 'MONEY' => 'N', + + ## informix 9.2 + 'SQLINT' => 'I', + 'SQLSERIAL' => 'I', + 'SQLSMINT' => 'I', + 'SQLSMFLOAT' => 'N', + 'SQLFLOAT' => 'N', + 'SQLMONEY' => 'N', + 'SQLDECIMAL' => 'N', + 'SQLDATE' => 'D', + 'SQLVCHAR' => 'C', + 'SQLCHAR' => 'C', + 'SQLDTIME' => 'T', + 'SQLINTERVAL' => 'N', + 'SQLBYTES' => 'B', + 'SQLTEXT' => 'X', + ## informix 10 + "SQLINT8" => 'I8', + "SQLSERIAL8" => 'I8', + "SQLNCHAR" => 'C', + "SQLNVCHAR" => 'C', + "SQLLVARCHAR" => 'X', + "SQLBOOL" => 'L' + ); + + if (!$this->connection->IsConnected()) { + $t = strtoupper($t); + if (isset($typeMap[$t])) return $typeMap[$t]; + return 'N'; + } + return $this->connection->MetaType($t,$len,$fieldobj); + } + + function NameQuote($name = NULL,$allowBrackets=false) + { + if (!is_string($name)) { + return FALSE; + } + + $name = trim($name); + + if ( !is_object($this->connection) ) { + return $name; + } + + $quote = $this->connection->nameQuote; + + // if name is of the form `name`, quote it + if ( preg_match('/^`(.+)`$/', $name, $matches) ) { + return $quote . $matches[1] . $quote; + } + + // if name contains special characters, quote it + $regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex; + + if ( !preg_match('/^[' . $regex . ']+$/', $name) ) { + return $quote . $name . $quote; + } + + return $name; + } + + function TableName($name) + { + if ( $this->schema ) { + return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name); + } + return $this->NameQuote($name); + } + + // Executes the sql array returned by GetTableSQL and GetIndexSQL + function ExecuteSQLArray($sql, $continueOnError = true) + { + $rez = 2; + $conn = $this->connection; + $saved = $conn->debug; + foreach($sql as $line) { + + if ($this->debug) $conn->debug = true; + $ok = $conn->Execute($line); + $conn->debug = $saved; + if (!$ok) { + if ($this->debug) ADOConnection::outp($conn->ErrorMsg()); + if (!$continueOnError) return 0; + $rez = 1; + } + } + return $rez; + } + + /** + Returns the actual type given a character code. + + C: varchar + X: CLOB (character large object) or largest varchar size if CLOB is not supported + C2: Multibyte varchar + X2: Multibyte CLOB + + B: BLOB (binary large object) + + D: Date + T: Date-time + L: Integer field suitable for storing booleans (0 or 1) + I: Integer + F: Floating point number + N: Numeric or decimal number + */ + + function ActualType($meta) + { + return $meta; + } + + function CreateDatabase($dbname,$options=false) + { + $options = $this->_Options($options); + $sql = array(); + + $s = 'CREATE DATABASE ' . $this->NameQuote($dbname); + if (isset($options[$this->upperName])) + $s .= ' '.$options[$this->upperName]; + + $sql[] = $s; + return $sql; + } + + /* + Generates the SQL to create index. Returns an array of sql strings. + */ + function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false) + { + if (!is_array($flds)) { + $flds = explode(',',$flds); + } + + foreach($flds as $key => $fld) { + # some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32) + $flds[$key] = $this->NameQuote($fld,$allowBrackets=true); + } + + return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions)); + } + + function DropIndexSQL ($idxname, $tabname = NULL) + { + return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname))); + } + + function SetSchema($schema) + { + $this->schema = $schema; + } + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; + foreach($lines as $v) { + $sql[] = $alter . $v; + } + if (is_array($idxs)) { + foreach($idxs as $idx => $idxdef) { + $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); + $sql = array_merge($sql, $sql_idxs); + } + } + return $sql; + } + + /** + * Change the definition of one column + * + * As some DBM's can't do that on there own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds='' complete defintion of the new table, eg. for postgres, default '' + * @param array/string $tableoptions='' options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; + foreach($lines as $v) { + $sql[] = $alter . $v; + } + if (is_array($idxs)) { + foreach($idxs as $idx => $idxdef) { + $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); + $sql = array_merge($sql, $sql_idxs); + } + + } + return $sql; + } + + /** + * Rename one column + * + * Some DBM's can only do this together with changeing the type of the column (even if that stays the same, eg. mysql) + * @param string $tabname table-name + * @param string $oldcolumn column-name to be renamed + * @param string $newcolumn new column-name + * @param string $flds='' complete column-defintion-string like for AddColumnSQL, only used by mysql atm., default='' + * @return array with SQL strings + */ + function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='') + { + $tabname = $this->TableName ($tabname); + if ($flds) { + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + list(,$first) = each($lines); + list(,$column_def) = split("[\t ]+",$first,2); + } + return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def)); + } + + /** + * Drop one column + * + * Some DBM's can't do that on there own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds='' complete defintion of the new table, eg. for postgres, default '' + * @param array/string $tableoptions='' options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + $sql = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' '; + foreach($flds as $v) { + $sql[] = $alter . $this->NameQuote($v); + } + return $sql; + } + + function DropTableSQL($tabname) + { + return array (sprintf($this->dropTable, $this->TableName($tabname))); + } + + function RenameTableSQL($tabname,$newname) + { + return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); + } + + /** + Generate the SQL to create table. Returns an array of sql strings. + */ + function CreateTableSQL($tabname, $flds, $tableoptions=array()) + { + list($lines,$pkey,$idxs) = $this->_GenFields($flds, true); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + + $taboptions = $this->_Options($tableoptions); + $tabname = $this->TableName ($tabname); + $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions); + + // ggiunta - 2006/10/12 - KLUDGE: + // if we are on autoincrement, and table options includes REPLACE, the + // autoincrement sequence has already been dropped on table creation sql, so + // we avoid passing REPLACE to trigger creation code. This prevents + // creating sql that double-drops the sequence + if ($this->autoIncrement && isset($taboptions['REPLACE'])) + unset($taboptions['REPLACE']); + $tsql = $this->_Triggers($tabname,$taboptions); + foreach($tsql as $s) $sql[] = $s; + + if (is_array($idxs)) { + foreach($idxs as $idx => $idxdef) { + $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); + $sql = array_merge($sql, $sql_idxs); + } + } + + return $sql; + } + + function _GenFields($flds,$widespacing=false) + { + if (is_string($flds)) { + $padding = ' '; + $txt = $flds.$padding; + $flds = array(); + $flds0 = Lens_ParseArgs($txt,','); + $hasparam = false; + foreach($flds0 as $f0) { + $f1 = array(); + foreach($f0 as $token) { + switch (strtoupper($token)) { + case 'INDEX': + $f1['INDEX'] = ''; + // fall through intentionally + case 'CONSTRAINT': + case 'DEFAULT': + $hasparam = $token; + break; + default: + if ($hasparam) $f1[$hasparam] = $token; + else $f1[] = $token; + $hasparam = false; + break; + } + } + // 'index' token without a name means single column index: name it after column + if (array_key_exists('INDEX', $f1) && $f1['INDEX'] == '') { + $f1['INDEX'] = isset($f0['NAME']) ? $f0['NAME'] : $f0[0]; + // check if column name used to create an index name was quoted + if (($f1['INDEX'][0] == '"' || $f1['INDEX'][0] == "'" || $f1['INDEX'][0] == "`") && + ($f1['INDEX'][0] == substr($f1['INDEX'], -1))) { + $f1['INDEX'] = $f1['INDEX'][0].'idx_'.substr($f1['INDEX'], 1, -1).$f1['INDEX'][0]; + } + else + $f1['INDEX'] = 'idx_'.$f1['INDEX']; + } + // reset it, so we don't get next field 1st token as INDEX... + $hasparam = false; + + $flds[] = $f1; + + } + } + $this->autoIncrement = false; + $lines = array(); + $pkey = array(); + $idxs = array(); + foreach($flds as $fld) { + $fld = _array_change_key_case($fld); + + $fname = false; + $fdefault = false; + $fautoinc = false; + $ftype = false; + $fsize = false; + $fprec = false; + $fprimary = false; + $fnoquote = false; + $fdefts = false; + $fdefdate = false; + $fconstraint = false; + $fnotnull = false; + $funsigned = false; + $findex = ''; + $funiqueindex = false; + + //----------------- + // Parse attributes + foreach($fld as $attr => $v) { + if ($attr == 2 && is_numeric($v)) $attr = 'SIZE'; + else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v); + + switch($attr) { + case '0': + case 'NAME': $fname = $v; break; + case '1': + case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break; + + case 'SIZE': + $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,','); + if ($dotat === false) $fsize = $v; + else { + $fsize = substr($v,0,$dotat); + $fprec = substr($v,$dotat+1); + } + break; + case 'UNSIGNED': $funsigned = true; break; + case 'AUTOINCREMENT': + case 'AUTO': $fautoinc = true; $fnotnull = true; break; + case 'KEY': + // a primary key col can be non unique in itself (if key spans many cols...) + case 'PRIMARY': $fprimary = $v; $fnotnull = true; /*$funiqueindex = true;*/ break; + case 'DEF': + case 'DEFAULT': $fdefault = $v; break; + case 'NOTNULL': $fnotnull = $v; break; + case 'NOQUOTE': $fnoquote = $v; break; + case 'DEFDATE': $fdefdate = $v; break; + case 'DEFTIMESTAMP': $fdefts = $v; break; + case 'CONSTRAINT': $fconstraint = $v; break; + // let INDEX keyword create a 'very standard' index on column + case 'INDEX': $findex = $v; break; + case 'UNIQUE': $funiqueindex = true; break; + } //switch + } // foreach $fld + + //-------------------- + // VALIDATE FIELD INFO + if (!strlen($fname)) { + if ($this->debug) ADOConnection::outp("Undefined NAME"); + return false; + } + + $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname)); + $fname = $this->NameQuote($fname); + + if (!strlen($ftype)) { + if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'"); + return false; + } else { + $ftype = strtoupper($ftype); + } + + $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec); + + if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls + + if ($fprimary) $pkey[] = $fname; + + // some databases do not allow blobs to have defaults + if ($ty == 'X') $fdefault = false; + + // build list of indexes + if ($findex != '') { + if (array_key_exists($findex, $idxs)) { + $idxs[$findex]['cols'][] = ($fname); + if (in_array('UNIQUE', $idxs[$findex]['opts']) != $funiqueindex) { + if ($this->debug) ADOConnection::outp("Index $findex defined once UNIQUE and once not"); + } + if ($funiqueindex && !in_array('UNIQUE', $idxs[$findex]['opts'])) + $idxs[$findex]['opts'][] = 'UNIQUE'; + } + else + { + $idxs[$findex] = array(); + $idxs[$findex]['cols'] = array($fname); + if ($funiqueindex) + $idxs[$findex]['opts'] = array('UNIQUE'); + else + $idxs[$findex]['opts'] = array(); + } + } + + //-------------------- + // CONSTRUCT FIELD SQL + if ($fdefts) { + if (substr($this->connection->databaseType,0,5) == 'mysql') { + $ftype = 'TIMESTAMP'; + } else { + $fdefault = $this->connection->sysTimeStamp; + } + } else if ($fdefdate) { + if (substr($this->connection->databaseType,0,5) == 'mysql') { + $ftype = 'TIMESTAMP'; + } else { + $fdefault = $this->connection->sysDate; + } + } else if ($fdefault !== false && !$fnoquote) { + if ($ty == 'C' or $ty == 'X' or + ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) { + + if (($ty == 'D' || $ty == 'T') && strtolower($fdefault) != 'null') { + // convert default date into database-aware code + if ($ty == 'T') + { + $fdefault = $this->connection->DBTimeStamp($fdefault); + } + else + { + $fdefault = $this->connection->DBDate($fdefault); + } + } + else + if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ') + $fdefault = trim($fdefault); + else if (strtolower($fdefault) != 'null') + $fdefault = $this->connection->qstr($fdefault); + } + } + $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned); + + // add index creation + if ($widespacing) $fname = str_pad($fname,24); + + // check for field names appearing twice + if (array_key_exists($fid, $lines)) { + ADOConnection::outp("Field '$fname' defined twice"); + } + + $lines[$fid] = $fname.' '.$ftype.$suffix; + + if ($fautoinc) $this->autoIncrement = true; + } // foreach $flds + + return array($lines,$pkey,$idxs); + } + + /** + GENERATE THE SIZE PART OF THE DATATYPE + $ftype is the actual type + $ty is the type defined originally in the DDL + */ + function _GetSize($ftype, $ty, $fsize, $fprec) + { + if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) { + $ftype .= "(".$fsize; + if (strlen($fprec)) $ftype .= ",".$fprec; + $ftype .= ')'; + } + return $ftype; + } + + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s .= '(' . $flds . ')'; + $sql[] = $s; + + return $sql; + } + + function _DropAutoIncrement($tabname) + { + return false; + } + + function _TableSQL($tabname,$lines,$pkey,$tableoptions) + { + $sql = array(); + + if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) { + $sql[] = sprintf($this->dropTable,$tabname); + if ($this->autoIncrement) { + $sInc = $this->_DropAutoIncrement($tabname); + if ($sInc) $sql[] = $sInc; + } + if ( isset ($tableoptions['DROP']) ) { + return $sql; + } + } + $s = "CREATE TABLE $tabname (\n"; + $s .= implode(",\n", $lines); + if (sizeof($pkey)>0) { + $s .= ",\n PRIMARY KEY ("; + $s .= implode(", ",$pkey).")"; + } + if (isset($tableoptions['CONSTRAINTS'])) + $s .= "\n".$tableoptions['CONSTRAINTS']; + + if (isset($tableoptions[$this->upperName.'_CONSTRAINTS'])) + $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS']; + + $s .= "\n)"; + if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName]; + $sql[] = $s; + + return $sql; + } + + /** + GENERATE TRIGGERS IF NEEDED + used when table has auto-incrementing field that is emulated using triggers + */ + function _Triggers($tabname,$taboptions) + { + return array(); + } + + /** + Sanitize options, so that array elements with no keys are promoted to keys + */ + function _Options($opts) + { + if (!is_array($opts)) return array(); + $newopts = array(); + foreach($opts as $k => $v) { + if (is_numeric($k)) $newopts[strtoupper($v)] = $v; + else $newopts[strtoupper($k)] = $v; + } + return $newopts; + } + + /** + "Florian Buzin [ easywe ]" <florian.buzin#easywe.de> + + This function changes/adds new fields to your table. You don't + have to know if the col is new or not. It will check on its own. + */ + function ChangeTableSQL($tablename, $flds, $tableoptions = false, $dropOldFlds=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false); + + // check table exists + $save_handler = $this->connection->raiseErrorFn; + $this->connection->raiseErrorFn = ''; + $cols = $this->MetaColumns($tablename); + $this->connection->raiseErrorFn = $save_handler; + + if (isset($savem)) $this->connection->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ( empty($cols)) { + return $this->CreateTableSQL($tablename, $flds, $tableoptions); + } + + if (is_array($flds)) { + // Cycle through the update fields, comparing + // existing fields to fields to update. + // if the Metatype and size is exactly the + // same, ignore - by Mark Newham + $holdflds = array(); + foreach($flds as $k=>$v) { + if ( isset($cols[$k]) && is_object($cols[$k]) ) { + // If already not allowing nulls, then don't change + $obj = $cols[$k]; + if (isset($obj->not_null) && $obj->not_null) + $v = str_replace('NOT NULL','',$v); + if (isset($obj->auto_increment) && $obj->auto_increment && empty($v['AUTOINCREMENT'])) + $v = str_replace('AUTOINCREMENT','',$v); + + $c = $cols[$k]; + $ml = $c->max_length; + $mt = $this->MetaType($c->type,$ml); + if ($ml == -1) $ml = ''; + if ($mt == 'X') $ml = $v['SIZE']; + if (($mt != $v['TYPE']) || $ml != $v['SIZE'] || (isset($v['AUTOINCREMENT']) && $v['AUTOINCREMENT'] != $obj->auto_increment)) { + $holdflds[$k] = $v; + } + } else { + $holdflds[$k] = $v; + } + } + $flds = $holdflds; + } + + + // already exists, alter table instead + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + $alter = 'ALTER TABLE ' . $this->TableName($tablename); + $sql = array(); + + foreach ( $lines as $id => $v ) { + if ( isset($cols[$id]) && is_object($cols[$id]) ) { + + $flds = Lens_ParseArgs($v,','); + + // We are trying to change the size of the field, if not allowed, simply ignore the request. + // $flds[1] holds the type, $flds[2] holds the size -postnuke addition + if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4) + && (isset($flds[0][2]) && is_numeric($flds[0][2]))) { + if ($this->debug) ADOConnection::outp(sprintf("<h3>%s cannot be changed to %s currently</h3>", $flds[0][0], $flds[0][1])); + #echo "<h3>$this->alterCol cannot be changed to $flds currently</h3>"; + continue; + } + $sql[] = $alter . $this->alterCol . ' ' . $v; + } else { + $sql[] = $alter . $this->addCol . ' ' . $v; + } + } + + if ($dropOldFlds) { + foreach ( $cols as $id => $v ) + if ( !isset($lines[$id]) ) + $sql[] = $alter . $this->dropCol . ' ' . $v->name; + } + return $sql; + } +} // class +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-error.inc.php b/pos/is4c-nf/lib/adodb5/adodb-error.inc.php new file mode 100644 index 000000000..ae0b9e354 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-error.inc.php @@ -0,0 +1,258 @@ +<?php +/** + * @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * The following code is adapted from the PEAR DB error handling code. + * Portions (c)1997-2002 The PHP Group. + */ + + +if (!defined("DB_ERROR")) define("DB_ERROR",-1); + +if (!defined("DB_ERROR_SYNTAX")) { + define("DB_ERROR_SYNTAX", -2); + define("DB_ERROR_CONSTRAINT", -3); + define("DB_ERROR_NOT_FOUND", -4); + define("DB_ERROR_ALREADY_EXISTS", -5); + define("DB_ERROR_UNSUPPORTED", -6); + define("DB_ERROR_MISMATCH", -7); + define("DB_ERROR_INVALID", -8); + define("DB_ERROR_NOT_CAPABLE", -9); + define("DB_ERROR_TRUNCATED", -10); + define("DB_ERROR_INVALID_NUMBER", -11); + define("DB_ERROR_INVALID_DATE", -12); + define("DB_ERROR_DIVZERO", -13); + define("DB_ERROR_NODBSELECTED", -14); + define("DB_ERROR_CANNOT_CREATE", -15); + define("DB_ERROR_CANNOT_DELETE", -16); + define("DB_ERROR_CANNOT_DROP", -17); + define("DB_ERROR_NOSUCHTABLE", -18); + define("DB_ERROR_NOSUCHFIELD", -19); + define("DB_ERROR_NEED_MORE_DATA", -20); + define("DB_ERROR_NOT_LOCKED", -21); + define("DB_ERROR_VALUE_COUNT_ON_ROW", -22); + define("DB_ERROR_INVALID_DSN", -23); + define("DB_ERROR_CONNECT_FAILED", -24); + define("DB_ERROR_EXTENSION_NOT_FOUND",-25); + define("DB_ERROR_NOSUCHDB", -25); + define("DB_ERROR_ACCESS_VIOLATION", -26); +} + +function adodb_errormsg($value) +{ +global $ADODB_LANG,$ADODB_LANG_ARRAY; + + if (empty($ADODB_LANG)) $ADODB_LANG = 'en'; + if (isset($ADODB_LANG_ARRAY['LANG']) && $ADODB_LANG_ARRAY['LANG'] == $ADODB_LANG) ; + else { + include_once(ADODB_DIR."/lang/adodb-$ADODB_LANG.inc.php"); + } + return isset($ADODB_LANG_ARRAY[$value]) ? $ADODB_LANG_ARRAY[$value] : $ADODB_LANG_ARRAY[DB_ERROR]; +} + +function adodb_error($provider,$dbType,$errno) +{ + //var_dump($errno); + if (is_numeric($errno) && $errno == 0) return 0; + switch($provider) { + case 'mysql': $map = adodb_error_mysql(); break; + + case 'oracle': + case 'oci8': $map = adodb_error_oci8(); break; + + case 'ibase': $map = adodb_error_ibase(); break; + + case 'odbc': $map = adodb_error_odbc(); break; + + case 'mssql': + case 'sybase': $map = adodb_error_mssql(); break; + + case 'informix': $map = adodb_error_ifx(); break; + + case 'postgres': return adodb_error_pg($errno); break; + + case 'sqlite': return $map = adodb_error_sqlite(); break; + default: + return DB_ERROR; + } + //print_r($map); + //var_dump($errno); + if (isset($map[$errno])) return $map[$errno]; + return DB_ERROR; +} + +//************************************************************************************** + +function adodb_error_pg($errormsg) +{ + if (is_numeric($errormsg)) return (integer) $errormsg; + static $error_regexps = array( + '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/i' => DB_ERROR_NOSUCHTABLE, + '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/i' => DB_ERROR_ALREADY_EXISTS, + '/divide by zero$/i' => DB_ERROR_DIVZERO, + '/pg_atoi: error in .*: can\'t parse /i' => DB_ERROR_INVALID_NUMBER, + '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/i' => DB_ERROR_NOSUCHFIELD, + '/parser: parse error at or near \"/i' => DB_ERROR_SYNTAX, + '/referential integrity violation/i' => DB_ERROR_CONSTRAINT, + '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/i' + => DB_ERROR_ALREADY_EXISTS + ); + reset($error_regexps); + while (list($regexp,$code) = each($error_regexps)) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; +} + +function adodb_error_odbc() +{ +static $MAP = array( + '01004' => DB_ERROR_TRUNCATED, + '07001' => DB_ERROR_MISMATCH, + '21S01' => DB_ERROR_MISMATCH, + '21S02' => DB_ERROR_MISMATCH, + '22003' => DB_ERROR_INVALID_NUMBER, + '22008' => DB_ERROR_INVALID_DATE, + '22012' => DB_ERROR_DIVZERO, + '23000' => DB_ERROR_CONSTRAINT, + '24000' => DB_ERROR_INVALID, + '34000' => DB_ERROR_INVALID, + '37000' => DB_ERROR_SYNTAX, + '42000' => DB_ERROR_SYNTAX, + 'IM001' => DB_ERROR_UNSUPPORTED, + 'S0000' => DB_ERROR_NOSUCHTABLE, + 'S0001' => DB_ERROR_NOT_FOUND, + 'S0002' => DB_ERROR_NOSUCHTABLE, + 'S0011' => DB_ERROR_ALREADY_EXISTS, + 'S0012' => DB_ERROR_NOT_FOUND, + 'S0021' => DB_ERROR_ALREADY_EXISTS, + 'S0022' => DB_ERROR_NOT_FOUND, + 'S1000' => DB_ERROR_NOSUCHTABLE, + 'S1009' => DB_ERROR_INVALID, + 'S1090' => DB_ERROR_INVALID, + 'S1C00' => DB_ERROR_NOT_CAPABLE + ); + return $MAP; +} + +function adodb_error_ibase() +{ +static $MAP = array( + -104 => DB_ERROR_SYNTAX, + -150 => DB_ERROR_ACCESS_VIOLATION, + -151 => DB_ERROR_ACCESS_VIOLATION, + -155 => DB_ERROR_NOSUCHTABLE, + -157 => DB_ERROR_NOSUCHFIELD, + -158 => DB_ERROR_VALUE_COUNT_ON_ROW, + -170 => DB_ERROR_MISMATCH, + -171 => DB_ERROR_MISMATCH, + -172 => DB_ERROR_INVALID, + -204 => DB_ERROR_INVALID, + -205 => DB_ERROR_NOSUCHFIELD, + -206 => DB_ERROR_NOSUCHFIELD, + -208 => DB_ERROR_INVALID, + -219 => DB_ERROR_NOSUCHTABLE, + -297 => DB_ERROR_CONSTRAINT, + -530 => DB_ERROR_CONSTRAINT, + -803 => DB_ERROR_CONSTRAINT, + -551 => DB_ERROR_ACCESS_VIOLATION, + -552 => DB_ERROR_ACCESS_VIOLATION, + -922 => DB_ERROR_NOSUCHDB, + -923 => DB_ERROR_CONNECT_FAILED, + -924 => DB_ERROR_CONNECT_FAILED + ); + + return $MAP; +} + +function adodb_error_ifx() +{ +static $MAP = array( + '-201' => DB_ERROR_SYNTAX, + '-206' => DB_ERROR_NOSUCHTABLE, + '-217' => DB_ERROR_NOSUCHFIELD, + '-329' => DB_ERROR_NODBSELECTED, + '-1204' => DB_ERROR_INVALID_DATE, + '-1205' => DB_ERROR_INVALID_DATE, + '-1206' => DB_ERROR_INVALID_DATE, + '-1209' => DB_ERROR_INVALID_DATE, + '-1210' => DB_ERROR_INVALID_DATE, + '-1212' => DB_ERROR_INVALID_DATE + ); + + return $MAP; +} + +function adodb_error_oci8() +{ +static $MAP = array( + 1 => DB_ERROR_ALREADY_EXISTS, + 900 => DB_ERROR_SYNTAX, + 904 => DB_ERROR_NOSUCHFIELD, + 923 => DB_ERROR_SYNTAX, + 942 => DB_ERROR_NOSUCHTABLE, + 955 => DB_ERROR_ALREADY_EXISTS, + 1476 => DB_ERROR_DIVZERO, + 1722 => DB_ERROR_INVALID_NUMBER, + 2289 => DB_ERROR_NOSUCHTABLE, + 2291 => DB_ERROR_CONSTRAINT, + 2449 => DB_ERROR_CONSTRAINT + ); + + return $MAP; +} + +function adodb_error_mssql() +{ +static $MAP = array( + 208 => DB_ERROR_NOSUCHTABLE, + 2601 => DB_ERROR_ALREADY_EXISTS + ); + + return $MAP; +} + +function adodb_error_sqlite() +{ +static $MAP = array( + 1 => DB_ERROR_SYNTAX + ); + + return $MAP; +} + +function adodb_error_mysql() +{ +static $MAP = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1045 => DB_ERROR_ACCESS_VIOLATION, + 1046 => DB_ERROR_NODBSELECTED, + 1049 => DB_ERROR_NOSUCHDB, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1146 => DB_ERROR_NOSUCHTABLE, + 1048 => DB_ERROR_CONSTRAINT, + 2002 => DB_ERROR_CONNECT_FAILED, + 2005 => DB_ERROR_CONNECT_FAILED + ); + + return $MAP; +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-errorhandler.inc.php b/pos/is4c-nf/lib/adodb5/adodb-errorhandler.inc.php new file mode 100644 index 000000000..dab7bd04c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-errorhandler.inc.php @@ -0,0 +1,79 @@ +<?php +/** + * @version V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * +*/ + + +// added Claudio Bustos clbustos#entelchile.net +if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR); + +if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_Handler'); + +/** +* Default Error Handler. This will be called with the following params +* +* @param $dbms the RDBMS you are connecting to +* @param $fn the name of the calling function (in uppercase) +* @param $errno the native error number from the database +* @param $errmsg the native error msg from the database +* @param $p1 $fn specific parameter - see below +* @param $p2 $fn specific parameter - see below +* @param $thisConn $current connection object - can be false if no connection object created +*/ +function ADODB_Error_Handler($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection) +{ + if (error_reporting() == 0) return; // obey @ protocol + switch($fn) { + case 'EXECUTE': + $sql = $p1; + $inputparams = $p2; + + $s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")\n"; + break; + + case 'PCONNECT': + case 'CONNECT': + $host = $p1; + $database = $p2; + + $s = "$dbms error: [$errno: $errmsg] in $fn($host, '****', '****', $database)\n"; + break; + default: + $s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n"; + break; + } + /* + * Log connection error somewhere + * 0 message is sent to PHP's system logger, using the Operating System's system + * logging mechanism or a file, depending on what the error_log configuration + * directive is set to. + * 1 message is sent by email to the address in the destination parameter. + * This is the only message type where the fourth parameter, extra_headers is used. + * This message type uses the same internal function as mail() does. + * 2 message is sent through the PHP debugging connection. + * This option is only available if remote debugging has been enabled. + * In this case, the destination parameter specifies the host name or IP address + * and optionally, port number, of the socket receiving the debug information. + * 3 message is appended to the file destination + */ + if (defined('ADODB_ERROR_LOG_TYPE')) { + $t = date('Y-m-d H:i:s'); + if (defined('ADODB_ERROR_LOG_DEST')) + error_log("($t) $s", ADODB_ERROR_LOG_TYPE, ADODB_ERROR_LOG_DEST); + else + error_log("($t) $s", ADODB_ERROR_LOG_TYPE); + } + + + //print "<p>$s</p>"; + trigger_error($s,ADODB_ERROR_HANDLER_TYPE); +} +?> diff --git a/pos/is4c-nf/lib/adodb5/adodb-errorpear.inc.php b/pos/is4c-nf/lib/adodb5/adodb-errorpear.inc.php new file mode 100644 index 000000000..d1e2eb98f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-errorpear.inc.php @@ -0,0 +1,88 @@ +<?php +/** + * @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * +*/ +include_once('PEAR.php'); + +if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_PEAR'); + +/* +* Enabled the following if you want to terminate scripts when an error occurs +*/ +//PEAR::setErrorHandling (PEAR_ERROR_DIE); + +/* +* Name of the PEAR_Error derived class to call. +*/ +if (!defined('ADODB_PEAR_ERROR_CLASS')) define('ADODB_PEAR_ERROR_CLASS','PEAR_Error'); + +/* +* Store the last PEAR_Error object here +*/ +global $ADODB_Last_PEAR_Error; $ADODB_Last_PEAR_Error = false; + + /** +* Error Handler with PEAR support. This will be called with the following params +* +* @param $dbms the RDBMS you are connecting to +* @param $fn the name of the calling function (in uppercase) +* @param $errno the native error number from the database +* @param $errmsg the native error msg from the database +* @param $p1 $fn specific parameter - see below +* @param $P2 $fn specific parameter - see below + */ +function ADODB_Error_PEAR($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false) +{ +global $ADODB_Last_PEAR_Error; + + if (error_reporting() == 0) return; // obey @ protocol + switch($fn) { + case 'EXECUTE': + $sql = $p1; + $inputparams = $p2; + + $s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")"; + break; + + case 'PCONNECT': + case 'CONNECT': + $host = $p1; + $database = $p2; + + $s = "$dbms error: [$errno: $errmsg] in $fn('$host', ?, ?, '$database')"; + break; + + default: + $s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)"; + break; + } + + $class = ADODB_PEAR_ERROR_CLASS; + $ADODB_Last_PEAR_Error = new $class($s, $errno, + $GLOBALS['_PEAR_default_error_mode'], + $GLOBALS['_PEAR_default_error_options'], + $errmsg); + + //print "<p>!$s</p>"; +} + +/** +* Returns last PEAR_Error object. This error might be for an error that +* occured several sql statements ago. +*/ +function ADODB_PEAR_Error() +{ +global $ADODB_Last_PEAR_Error; + + return $ADODB_Last_PEAR_Error; +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-exceptions.inc.php b/pos/is4c-nf/lib/adodb5/adodb-exceptions.inc.php new file mode 100644 index 000000000..653775448 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-exceptions.inc.php @@ -0,0 +1,82 @@ +<?php + +/** + * @version V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * + * Exception-handling code using PHP5 exceptions (try-catch-throw). + */ + + +if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR); +define('ADODB_ERROR_HANDLER','adodb_throw'); + +class ADODB_Exception extends Exception { +var $dbms; +var $fn; +var $sql = ''; +var $params = ''; +var $host = ''; +var $database = ''; + + function __construct($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection) + { + switch($fn) { + case 'EXECUTE': + $this->sql = $p1; + $this->params = $p2; + $s = "$dbms error: [$errno: $errmsg] in $fn(\"$p1\")\n"; + break; + + case 'PCONNECT': + case 'CONNECT': + $user = $thisConnection->user; + $s = "$dbms error: [$errno: $errmsg] in $fn($p1, '$user', '****', $p2)\n"; + break; + default: + $s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n"; + break; + } + + $this->dbms = $dbms; + if ($thisConnection) { + $this->host = $thisConnection->host; + $this->database = $thisConnection->database; + } + $this->fn = $fn; + $this->msg = $errmsg; + + if (!is_numeric($errno)) $errno = -1; + parent::__construct($s,$errno); + } +} + +/** +* Default Error Handler. This will be called with the following params +* +* @param $dbms the RDBMS you are connecting to +* @param $fn the name of the calling function (in uppercase) +* @param $errno the native error number from the database +* @param $errmsg the native error msg from the database +* @param $p1 $fn specific parameter - see below +* @param $P2 $fn specific parameter - see below +*/ + +function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection) +{ +global $ADODB_EXCEPTION; + + if (error_reporting() == 0) return; // obey @ protocol + if (is_string($ADODB_EXCEPTION)) $errfn = $ADODB_EXCEPTION; + else $errfn = 'ADODB_EXCEPTION'; + throw new $errfn($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection); +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-iterator.inc.php b/pos/is4c-nf/lib/adodb5/adodb-iterator.inc.php new file mode 100644 index 000000000..55d66a35b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-iterator.inc.php @@ -0,0 +1,30 @@ +<?php + +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4. + + Declares the ADODB Base Class for PHP5 "ADODB_BASE_RS", and supports iteration with + the ADODB_Iterator class. + + $rs = $db->Execute("select * from adoxyz"); + foreach($rs as $k => $v) { + echo $k; print_r($v); echo "<br>"; + } + + + Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2 + + + Moved to adodb.inc.php to improve performance. + */ + + + + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-lib.inc.php b/pos/is4c-nf/lib/adodb5/adodb-lib.inc.php new file mode 100644 index 000000000..9b46dedc8 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-lib.inc.php @@ -0,0 +1,1193 @@ +<?php + + + + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +global $ADODB_INCLUDED_LIB; +$ADODB_INCLUDED_LIB = 1; + +/* + @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim\@natsoft.com.my). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Less commonly used functions are placed here to reduce size of adodb.inc.php. +*/ + +function adodb_strip_order_by($sql) +{ + $rez = preg_match('/(\sORDER\s+BY\s[^)]*)/is',$sql,$arr); + if ($arr) + if (strpos($arr[0],'(') !== false) { + $at = strpos($sql,$arr[0]); + $cntin = 0; + for ($i=$at, $max=strlen($sql); $i < $max; $i++) { + $ch = $sql[$i]; + if ($ch == '(') { + $cntin += 1; + } elseif($ch == ')') { + $cntin -= 1; + if ($cntin < 0) { + break; + } + } + } + $sql = substr($sql,0,$at).substr($sql,$i); + } else + $sql = str_replace($arr[0], '', $sql); + return $sql; + } + +if (false) { + $sql = 'select * from (select a from b order by a(b),b(c) desc)'; + $sql = '(select * from abc order by 1)'; + die(adodb_strip_order_by($sql)); +} + +function adodb_probetypes(&$array,&$types,$probe=8) +{ +// probe and guess the type + $types = array(); + if ($probe > sizeof($array)) $max = sizeof($array); + else $max = $probe; + + + for ($j=0;$j < $max; $j++) { + $row = $array[$j]; + if (!$row) break; + $i = -1; + foreach($row as $v) { + $i += 1; + + if (isset($types[$i]) && $types[$i]=='C') continue; + + //print " ($i ".$types[$i]. "$v) "; + $v = trim($v); + + if (!preg_match('/^[+-]{0,1}[0-9\.]+$/',$v)) { + $types[$i] = 'C'; // once C, always C + + continue; + } + if ($j == 0) { + // If empty string, we presume is character + // test for integer for 1st row only + // after that it is up to testing other rows to prove + // that it is not an integer + if (strlen($v) == 0) $types[$i] = 'C'; + if (strpos($v,'.') !== false) $types[$i] = 'N'; + else $types[$i] = 'I'; + continue; + } + + if (strpos($v,'.') !== false) $types[$i] = 'N'; + + } + } + +} + +function adodb_transpose(&$arr, &$newarr, &$hdr, &$fobjs) +{ + $oldX = sizeof(reset($arr)); + $oldY = sizeof($arr); + + if ($hdr) { + $startx = 1; + $hdr = array('Fields'); + for ($y = 0; $y < $oldY; $y++) { + $hdr[] = $arr[$y][0]; + } + } else + $startx = 0; + + for ($x = $startx; $x < $oldX; $x++) { + if ($fobjs) { + $o = $fobjs[$x]; + $newarr[] = array($o->name); + } else + $newarr[] = array(); + + for ($y = 0; $y < $oldY; $y++) { + $newarr[$x-$startx][] = $arr[$y][$x]; + } + } +} + +// Force key to upper. +// See also http://www.php.net/manual/en/function.array-change-key-case.php +function _array_change_key_case($an_array) +{ + if (is_array($an_array)) { + $new_array = array(); + foreach($an_array as $key=>$value) + $new_array[strtoupper($key)] = $value; + + return $new_array; + } + + return $an_array; +} + +function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc) +{ + if (count($fieldArray) == 0) return 0; + $first = true; + $uSet = ''; + + if (!is_array($keyCol)) { + $keyCol = array($keyCol); + } + foreach($fieldArray as $k => $v) { + if ($v === null) { + $v = 'NULL'; + $fieldArray[$k] = $v; + } else if ($autoQuote && /*!is_numeric($v) /*and strncmp($v,"'",1) !== 0 -- sql injection risk*/ strcasecmp($v,$zthis->null2null)!=0) { + $v = $zthis->qstr($v); + $fieldArray[$k] = $v; + } + if (in_array($k,$keyCol)) continue; // skip UPDATE if is key + + if ($first) { + $first = false; + $uSet = "$k=$v"; + } else + $uSet .= ",$k=$v"; + } + + $where = false; + foreach ($keyCol as $v) { + if (isset($fieldArray[$v])) { + if ($where) $where .= ' and '.$v.'='.$fieldArray[$v]; + else $where = $v.'='.$fieldArray[$v]; + } + } + + if ($uSet && $where) { + $update = "UPDATE $table SET $uSet WHERE $where"; + + $rs = $zthis->Execute($update); + + + if ($rs) { + if ($zthis->poorAffectedRows) { + /* + The Select count(*) wipes out any errors that the update would have returned. + http://phplens.com/lens/lensforum/msgs.php?id=5696 + */ + if ($zthis->ErrorNo()<>0) return 0; + + # affected_rows == 0 if update field values identical to old values + # for mysql - which is silly. + + $cnt = $zthis->GetOne("select count(*) from $table where $where"); + if ($cnt > 0) return 1; // record already exists + } else { + if (($zthis->Affected_Rows()>0)) return 1; + } + } else + return 0; + } + + // print "<p>Error=".$this->ErrorNo().'<p>'; + $first = true; + foreach($fieldArray as $k => $v) { + if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col + + if ($first) { + $first = false; + $iCols = "$k"; + $iVals = "$v"; + } else { + $iCols .= ",$k"; + $iVals .= ",$v"; + } + } + $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)"; + $rs = $zthis->Execute($insert); + return ($rs) ? 2 : 0; +} + +// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM +function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) +{ + $hasvalue = false; + + if ($multiple or is_array($defstr)) { + if ($size==0) $size=5; + $attr = ' multiple size="'.$size.'"'; + if (!strpos($name,'[]')) $name .= '[]'; + } else if ($size) $attr = ' size="'.$size.'"'; + else $attr =''; + + $s = '<select name="'.$name.'"'.$attr.' '.$selectAttr.'>'; + if ($blank1stItem) + if (is_string($blank1stItem)) { + $barr = explode(':',$blank1stItem); + if (sizeof($barr) == 1) $barr[] = ''; + $s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>"; + } else $s .= "\n<option></option>"; + + if ($zthis->FieldCount() > 1) $hasvalue=true; + else $compareFields0 = true; + + $value = ''; + $optgroup = null; + $firstgroup = true; + $fieldsize = $zthis->FieldCount(); + while(!$zthis->EOF) { + $zval = rtrim(reset($zthis->fields)); + + if ($blank1stItem && $zval=="") { + $zthis->MoveNext(); + continue; + } + + if ($fieldsize > 1) { + if (isset($zthis->fields[1])) + $zval2 = rtrim($zthis->fields[1]); + else + $zval2 = rtrim(next($zthis->fields)); + } + $selected = ($compareFields0) ? $zval : $zval2; + + $group = ''; + if ($fieldsize > 2) { + $group = rtrim($zthis->fields[2]); + } +/* + if ($optgroup != $group) { + $optgroup = $group; + if ($firstgroup) { + $firstgroup = false; + $s .="\n<optgroup label='". htmlspecialchars($group) ."'>"; + } else { + $s .="\n</optgroup>"; + $s .="\n<optgroup label='". htmlspecialchars($group) ."'>"; + } + } +*/ + if ($hasvalue) + $value = " value='".htmlspecialchars($zval2)."'"; + + if (is_array($defstr)) { + + if (in_array($selected,$defstr)) + $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>'; + else + $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>'; + } + else { + if (strcasecmp($selected,$defstr)==0) + $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>'; + else + $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>'; + } + $zthis->MoveNext(); + } // while + + // closing last optgroup + if($optgroup != null) { + $s .= "\n</optgroup>"; + } + return $s ."\n</select>\n"; +} + +// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM +function _adodb_getmenu_gp(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) +{ + $hasvalue = false; + + if ($multiple or is_array($defstr)) { + if ($size==0) $size=5; + $attr = ' multiple size="'.$size.'"'; + if (!strpos($name,'[]')) $name .= '[]'; + } else if ($size) $attr = ' size="'.$size.'"'; + else $attr =''; + + $s = '<select name="'.$name.'"'.$attr.' '.$selectAttr.'>'; + if ($blank1stItem) + if (is_string($blank1stItem)) { + $barr = explode(':',$blank1stItem); + if (sizeof($barr) == 1) $barr[] = ''; + $s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>"; + } else $s .= "\n<option></option>"; + + if ($zthis->FieldCount() > 1) $hasvalue=true; + else $compareFields0 = true; + + $value = ''; + $optgroup = null; + $firstgroup = true; + $fieldsize = sizeof($zthis->fields); + while(!$zthis->EOF) { + $zval = rtrim(reset($zthis->fields)); + + if ($blank1stItem && $zval=="") { + $zthis->MoveNext(); + continue; + } + + if ($fieldsize > 1) { + if (isset($zthis->fields[1])) + $zval2 = rtrim($zthis->fields[1]); + else + $zval2 = rtrim(next($zthis->fields)); + } + $selected = ($compareFields0) ? $zval : $zval2; + + $group = ''; + if (isset($zthis->fields[2])) { + $group = rtrim($zthis->fields[2]); + } + + if ($optgroup != $group) { + $optgroup = $group; + if ($firstgroup) { + $firstgroup = false; + $s .="\n<optgroup label='". htmlspecialchars($group) ."'>"; + } else { + $s .="\n</optgroup>"; + $s .="\n<optgroup label='". htmlspecialchars($group) ."'>"; + } + } + + if ($hasvalue) + $value = " value='".htmlspecialchars($zval2)."'"; + + if (is_array($defstr)) { + + if (in_array($selected,$defstr)) + $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>'; + else + $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>'; + } + else { + if (strcasecmp($selected,$defstr)==0) + $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>'; + else + $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>'; + } + $zthis->MoveNext(); + } // while + + // closing last optgroup + if($optgroup != null) { + $s .= "\n</optgroup>"; + } + return $s ."\n</select>\n"; +} + + +/* + Count the number of records this sql statement will return by using + query rewriting heuristics... + + Does not work with UNIONs, except with postgresql and oracle. + + Usage: + + $conn->Connect(...); + $cnt = _adodb_getcount($conn, $sql); + +*/ +function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0) +{ + $qryRecs = 0; + + if (!empty($zthis->_nestedSQL) || preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || + preg_match('/\s+GROUP\s+BY\s+/is',$sql) || + preg_match('/\s+UNION\s+/is',$sql)) { + + $rewritesql = adodb_strip_order_by($sql); + + // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias + // but this is only supported by oracle and postgresql... + if ($zthis->dataProvider == 'oci8') { + // Allow Oracle hints to be used for query optimization, Chris Wrye + if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) { + $rewritesql = "SELECT ".$hint[0]." COUNT(*) FROM (".$rewritesql.")"; + } else + $rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")"; + + } else if (strncmp($zthis->databaseType,'postgres',8) == 0 || strncmp($zthis->databaseType,'mysql',5) == 0) { + $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_"; + } else { + $rewritesql = "SELECT COUNT(*) FROM ($rewritesql)"; + } + } else { + // now replace SELECT ... FROM with SELECT COUNT(*) FROM + $rewritesql = preg_replace( + '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql); + // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails + // with mssql, access and postgresql. Also a good speedup optimization - skips sorting! + // also see http://phplens.com/lens/lensforum/msgs.php?id=12752 + $rewritesql = adodb_strip_order_by($rewritesql); + } + + if (isset($rewritesql) && $rewritesql != $sql) { + if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; + + if ($secs2cache) { + // we only use half the time of secs2cache because the count can quickly + // become inaccurate if new records are added + $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr); + + } else { + $qryRecs = $zthis->GetOne($rewritesql,$inputarr); + } + if ($qryRecs !== false) return $qryRecs; + } + //-------------------------------------------- + // query rewrite failed - so try slower way... + + + // strip off unneeded ORDER BY if no UNION + if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql; + else $rewritesql = $rewritesql = adodb_strip_order_by($sql); + + if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; + + $rstest = $zthis->Execute($rewritesql,$inputarr); + if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr); + + if ($rstest) { + $qryRecs = $rstest->RecordCount(); + if ($qryRecs == -1) { + global $ADODB_EXTENSION; + // some databases will return -1 on MoveLast() - change to MoveNext() + if ($ADODB_EXTENSION) { + while(!$rstest->EOF) { + adodb_movenext($rstest); + } + } else { + while(!$rstest->EOF) { + $rstest->MoveNext(); + } + } + $qryRecs = $rstest->_currentRow; + } + $rstest->Close(); + if ($qryRecs == -1) return 0; + } + return $qryRecs; +} + +/* + Code originally from "Cornel G" <conyg@fx.ro> + + This code might not work with SQL that has UNION in it + + Also if you are using CachePageExecute(), there is a strong possibility that + data will get out of synch. use CachePageExecute() only with tables that + rarely change. +*/ +function _adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page, + $inputarr=false, $secs2cache=0) +{ + $atfirstpage = false; + $atlastpage = false; + $lastpageno=1; + + // If an invalid nrows is supplied, + // we assume a default value of 10 rows per page + if (!isset($nrows) || $nrows <= 0) $nrows = 10; + + $qryRecs = false; //count records for no offset + + $qryRecs = _adodb_getcount($zthis,$sql,$inputarr,$secs2cache); + $lastpageno = (int) ceil($qryRecs / $nrows); + $zthis->_maxRecordCount = $qryRecs; + + + + // ***** Here we check whether $page is the last page or + // whether we are trying to retrieve + // a page number greater than the last page number. + if ($page >= $lastpageno) { + $page = $lastpageno; + $atlastpage = true; + } + + // If page number <= 1, then we are at the first page + if (empty($page) || $page <= 1) { + $page = 1; + $atfirstpage = true; + } + + // We get the data we want + $offset = $nrows * ($page-1); + if ($secs2cache > 0) + $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); + else + $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); + + + // Before returning the RecordSet, we set the pagination properties we need + if ($rsreturn) { + $rsreturn->_maxRecordCount = $qryRecs; + $rsreturn->rowsPerPage = $nrows; + $rsreturn->AbsolutePage($page); + $rsreturn->AtFirstPage($atfirstpage); + $rsreturn->AtLastPage($atlastpage); + $rsreturn->LastPageNo($lastpageno); + } + return $rsreturn; +} + +// Iván Oliva version +function _adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0) +{ + + $atfirstpage = false; + $atlastpage = false; + + if (!isset($page) || $page <= 1) { // If page number <= 1, then we are at the first page + $page = 1; + $atfirstpage = true; + } + if ($nrows <= 0) $nrows = 10; // If an invalid nrows is supplied, we assume a default value of 10 rows per page + + // ***** Here we check whether $page is the last page or whether we are trying to retrieve a page number greater than + // the last page number. + $pagecounter = $page + 1; + $pagecounteroffset = ($pagecounter * $nrows) - $nrows; + if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); + else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); + if ($rstest) { + while ($rstest && $rstest->EOF && $pagecounter>0) { + $atlastpage = true; + $pagecounter--; + $pagecounteroffset = $nrows * ($pagecounter - 1); + $rstest->Close(); + if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); + else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); + } + if ($rstest) $rstest->Close(); + } + if ($atlastpage) { // If we are at the last page or beyond it, we are going to retrieve it + $page = $pagecounter; + if ($page == 1) $atfirstpage = true; // We have to do this again in case the last page is the same as the first + //... page, that is, the recordset has only 1 page. + } + + // We get the data we want + $offset = $nrows * ($page-1); + if ($secs2cache > 0) $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); + else $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); + + // Before returning the RecordSet, we set the pagination properties we need + if ($rsreturn) { + $rsreturn->rowsPerPage = $nrows; + $rsreturn->AbsolutePage($page); + $rsreturn->AtFirstPage($atfirstpage); + $rsreturn->AtLastPage($atlastpage); + } + return $rsreturn; +} + +function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=2) +{ + global $ADODB_QUOTE_FIELDNAMES; + + if (!$rs) { + printf(ADODB_BAD_RS,'GetUpdateSQL'); + return false; + } + + $fieldUpdatedCount = 0; + $arrFields = _array_change_key_case($arrFields); + + $hasnumeric = isset($rs->fields[0]); + $setFields = ''; + + // Loop through all of the fields in the recordset + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { + // Get the field from the recordset + $field = $rs->FetchField($i); + + // If the recordset field is one + // of the fields passed in then process. + $upperfname = strtoupper($field->name); + if (adodb_key_exists($upperfname,$arrFields,$force)) { + + // If the existing field value in the recordset + // is different from the value passed in then + // go ahead and append the field name and new value to + // the update query. + + if ($hasnumeric) $val = $rs->fields[$i]; + else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname]; + else if (isset($rs->fields[$field->name])) $val = $rs->fields[$field->name]; + else if (isset($rs->fields[strtolower($upperfname)])) $val = $rs->fields[strtolower($upperfname)]; + else $val = ''; + + + if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) { + // Set the counter for the number of fields that will be updated. + $fieldUpdatedCount++; + + // Based on the datatype of the field + // Format the value properly for the database + $type = $rs->MetaType($field->type); + + + if ($type == 'null') { + $type = 'C'; + } + + if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) + $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; + else + $fnameq = $upperfname; + + + // is_null requires php 4.0.4 + //********************************************************// + if (is_null($arrFields[$upperfname]) + || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0) + || $arrFields[$upperfname] === $zthis->null2null + ) + { + switch ($force) { + + //case 0: + // //Ignore empty values. This is allready handled in "adodb_key_exists" function. + //break; + + case 1: + //Set null + $setFields .= $field->name . " = null, "; + break; + + case 2: + //Set empty + $arrFields[$upperfname] = ""; + $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq); + break; + default: + case 3: + //Set the value that was given in array, so you can give both null and empty values + if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { + $setFields .= $field->name . " = null, "; + } else { + $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq); + } + break; + } + //********************************************************// + } else { + //we do this so each driver can customize the sql for + //DB specific column types. + //Oracle needs BLOB types to be handled with a returning clause + //postgres has special needs as well + $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq, + $arrFields, $magicq); + } + } + } + } + + // If there were any modified fields then build the rest of the update query. + if ($fieldUpdatedCount > 0 || $forceUpdate) { + // Get the table name from the existing query. + if (!empty($rs->tableName)) $tableName = $rs->tableName; + else { + preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName); + $tableName = $tableName[1]; + } + // Get the full where clause excluding the word "WHERE" from + // the existing query. + preg_match('/\sWHERE\s(.*)/is', $rs->sql, $whereClause); + + $discard = false; + // not a good hack, improvements? + if ($whereClause) { + #var_dump($whereClause); + if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard)); + else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard)); + else if (preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard)); + else preg_match('/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http://sourceforge.net/tracker/index.php?func=detail&aid=1379638&group_id=42718&atid=433976 + } else + $whereClause = array(false,false); + + if ($discard) + $whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1])); + + $sql = 'UPDATE '.$tableName.' SET '.substr($setFields, 0, -2); + if (strlen($whereClause[1]) > 0) + $sql .= ' WHERE '.$whereClause[1]; + + return $sql; + + } else { + return false; + } +} + +function adodb_key_exists($key, &$arr,$force=2) +{ + if ($force<=0) { + // the following is the old behaviour where null or empty fields are ignored + return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0); + } + + if (isset($arr[$key])) return true; + ## null check below + if (ADODB_PHPVER >= 0x4010) return array_key_exists($key,$arr); + return false; +} + +/** + * There is a special case of this function for the oci8 driver. + * The proper way to handle an insert w/ a blob in oracle requires + * a returning clause with bind variables and a descriptor blob. + * + * + */ +function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$force=2) +{ +static $cacheRS = false; +static $cacheSig = 0; +static $cacheCols; + global $ADODB_QUOTE_FIELDNAMES; + + $tableName = ''; + $values = ''; + $fields = ''; + $recordSet = null; + $arrFields = _array_change_key_case($arrFields); + $fieldInsertedCount = 0; + + if (is_string($rs)) { + //ok we have a table name + //try and get the column info ourself. + $tableName = $rs; + + //we need an object for the recordSet + //because we have to call MetaType. + //php can't do a $rsclass::MetaType() + $rsclass = $zthis->rsPrefix.$zthis->databaseType; + $recordSet = new $rsclass(-1,$zthis->fetchMode); + $recordSet->connection = $zthis; + + if (is_string($cacheRS) && $cacheRS == $rs) { + $columns = $cacheCols; + } else { + $columns = $zthis->MetaColumns( $tableName ); + $cacheRS = $tableName; + $cacheCols = $columns; + } + } else if (is_subclass_of($rs, 'adorecordset')) { + if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) { + $columns = $cacheCols; + } else { + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) + $columns[] = $rs->FetchField($i); + $cacheRS = $cacheSig; + $cacheCols = $columns; + $rs->insertSig = $cacheSig++; + } + $recordSet = $rs; + + } else { + printf(ADODB_BAD_RS,'GetInsertSQL'); + return false; + } + + // Loop through all of the fields in the recordset + foreach( $columns as $field ) { + $upperfname = strtoupper($field->name); + if (adodb_key_exists($upperfname,$arrFields,$force)) { + $bad = false; + if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) + $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; + else + $fnameq = $upperfname; + + $type = $recordSet->MetaType($field->type); + + /********************************************************/ + if (is_null($arrFields[$upperfname]) + || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0) + || $arrFields[$upperfname] === $zthis->null2null + ) + { + switch ($force) { + + case 0: // we must always set null if missing + $bad = true; + break; + + case 1: + $values .= "null, "; + break; + + case 2: + //Set empty + $arrFields[$upperfname] = ""; + $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,$arrFields, $magicq); + break; + + default: + case 3: + //Set the value that was given in array, so you can give both null and empty values + if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { + $values .= "null, "; + } else { + $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq); + } + break; + } // switch + + /*********************************************************/ + } else { + //we do this so each driver can customize the sql for + //DB specific column types. + //Oracle needs BLOB types to be handled with a returning clause + //postgres has special needs as well + $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, + $arrFields, $magicq); + } + + if ($bad) continue; + // Set the counter for the number of fields that will be inserted. + $fieldInsertedCount++; + + + // Get the name of the fields to insert + $fields .= $fnameq . ", "; + } + } + + + // If there were any inserted fields then build the rest of the insert query. + if ($fieldInsertedCount <= 0) return false; + + // Get the table name from the existing query. + if (!$tableName) { + if (!empty($rs->tableName)) $tableName = $rs->tableName; + else if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName)) + $tableName = $tableName[1]; + else + return false; + } + + // Strip off the comma and space on the end of both the fields + // and their values. + $fields = substr($fields, 0, -2); + $values = substr($values, 0, -2); + + // Append the fields and their values to the insert query. + return 'INSERT INTO '.$tableName.' ( '.$fields.' ) VALUES ( '.$values.' )'; +} + + +/** + * This private method is used to help construct + * the update/sql which is generated by GetInsertSQL and GetUpdateSQL. + * It handles the string construction of 1 column -> sql string based on + * the column type. We want to do 'safe' handling of BLOBs + * + * @param string the type of sql we are trying to create + * 'I' or 'U'. + * @param string column data type from the db::MetaType() method + * @param string the column name + * @param array the column value + * + * @return string + * + */ +function _adodb_column_sql_oci8(&$zthis,$action, $type, $fname, $fnameq, $arrFields, $magicq) +{ + $sql = ''; + + // Based on the datatype of the field + // Format the value properly for the database + switch($type) { + case 'B': + //in order to handle Blobs correctly, we need + //to do some magic for Oracle + + //we need to create a new descriptor to handle + //this properly + if (!empty($zthis->hasReturningInto)) { + if ($action == 'I') { + $sql = 'empty_blob(), '; + } else { + $sql = $fnameq. '=empty_blob(), '; + } + //add the variable to the returning clause array + //so the user can build this later in + //case they want to add more to it + $zthis->_returningArray[$fname] = ':xx'.$fname.'xx'; + } else if (empty($arrFields[$fname])){ + if ($action == 'I') { + $sql = 'empty_blob(), '; + } else { + $sql = $fnameq. '=empty_blob(), '; + } + } else { + //this is to maintain compatibility + //with older adodb versions. + $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); + } + break; + + case "X": + //we need to do some more magic here for long variables + //to handle these correctly in oracle. + + //create a safe bind var name + //to avoid conflicts w/ dupes. + if (!empty($zthis->hasReturningInto)) { + if ($action == 'I') { + $sql = ':xx'.$fname.'xx, '; + } else { + $sql = $fnameq.'=:xx'.$fname.'xx, '; + } + //add the variable to the returning clause array + //so the user can build this later in + //case they want to add more to it + $zthis->_returningArray[$fname] = ':xx'.$fname.'xx'; + } else { + //this is to maintain compatibility + //with older adodb versions. + $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); + } + break; + + default: + $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); + break; + } + + return $sql; +} + +function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=true) +{ + + if ($recurse) { + switch($zthis->dataProvider) { + case 'postgres': + if ($type == 'L') $type = 'C'; + break; + case 'oci8': + return _adodb_column_sql_oci8($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq); + + } + } + + switch($type) { + case "C": + case "X": + case 'B': + $val = $zthis->qstr($arrFields[$fname],$magicq); + break; + + case "D": + $val = $zthis->DBDate($arrFields[$fname]); + break; + + case "T": + $val = $zthis->DBTimeStamp($arrFields[$fname]); + break; + + case "N": + $val = $arrFields[$fname]; + if (!is_numeric($val)) $val = str_replace(',', '.', (float)$val); + break; + + case "I": + case "R": + $val = $arrFields[$fname]; + if (!is_numeric($val)) $val = (integer) $val; + break; + + default: + $val = str_replace(array("'"," ","("),"",$arrFields[$fname]); // basic sql injection defence + if (empty($val)) $val = '0'; + break; + } + + if ($action == 'I') return $val . ", "; + + + return $fnameq . "=" . $val . ", "; + +} + + + +function _adodb_debug_execute(&$zthis, $sql, $inputarr) +{ + $ss = ''; + if ($inputarr) { + foreach($inputarr as $kk=>$vv) { + if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...'; + if (is_null($vv)) $ss .= "($kk=>null) "; + else $ss .= "($kk=>'$vv') "; + } + $ss = "[ $ss ]"; + } + $sqlTxt = is_array($sql) ? $sql[0] : $sql; + /*str_replace(', ','##1#__^LF',is_array($sql) ? $sql[0] : $sql); + $sqlTxt = str_replace(',',', ',$sqlTxt); + $sqlTxt = str_replace('##1#__^LF', ', ' ,$sqlTxt); + */ + // check if running from browser or command-line + $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); + + $dbt = $zthis->databaseType; + if (isset($zthis->dsnType)) $dbt .= '-'.$zthis->dsnType; + if ($inBrowser) { + if ($ss) { + $ss = '<code>'.htmlspecialchars($ss).'</code>'; + } + if ($zthis->debug === -1) + ADOConnection::outp( "<br>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<br>\n",false); + else if ($zthis->debug !== -99) + ADOConnection::outp( "<hr>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr>\n",false); + } else { + $ss = "\n ".$ss; + if ($zthis->debug !== -99) + ADOConnection::outp("-----<hr>\n($dbt): ".$sqlTxt." $ss\n-----<hr>\n",false); + } + + $qID = $zthis->_query($sql,$inputarr); + + /* + Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql + because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion + */ + if ($zthis->databaseType == 'mssql') { + // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6 + + if($emsg = $zthis->ErrorMsg()) { + if ($err = $zthis->ErrorNo()) { + if ($zthis->debug === -99) + ADOConnection::outp( "<hr>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr>\n",false); + + ADOConnection::outp($err.': '.$emsg); + } + } + } else if (!$qID) { + + if ($zthis->debug === -99) + if ($inBrowser) ADOConnection::outp( "<hr>\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr>\n",false); + else ADOConnection::outp("-----<hr>\n($dbt): ".$sqlTxt."$ss\n-----<hr>\n",false); + + ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg()); + } + + if ($zthis->debug === 99) _adodb_backtrace(true,9999,2); + return $qID; +} + +# pretty print the debug_backtrace function +function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0,$ishtml=null) +{ + if (!function_exists('debug_backtrace')) return ''; + + if ($ishtml === null) $html = (isset($_SERVER['HTTP_USER_AGENT'])); + else $html = $ishtml; + + $fmt = ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s"; + + $MAXSTRLEN = 128; + + $s = ($html) ? '<pre align=left>' : ''; + + if (is_array($printOrArr)) $traceArr = $printOrArr; + else $traceArr = debug_backtrace(); + array_shift($traceArr); + array_shift($traceArr); + $tabs = sizeof($traceArr)-2; + + foreach ($traceArr as $arr) { + if ($skippy) {$skippy -= 1; continue;} + $levels -= 1; + if ($levels < 0) break; + + $args = array(); + for ($i=0; $i < $tabs; $i++) $s .= ($html) ? ' &nbsp; ' : "\t"; + $tabs -= 1; + if ($html) $s .= '<font face="Courier New,Courier">'; + if (isset($arr['class'])) $s .= $arr['class'].'.'; + if (isset($arr['args'])) + foreach($arr['args'] as $v) { + if (is_null($v)) $args[] = 'null'; + else if (is_array($v)) $args[] = 'Array['.sizeof($v).']'; + else if (is_object($v)) $args[] = 'Object:'.get_class($v); + else if (is_bool($v)) $args[] = $v ? 'true' : 'false'; + else { + $v = (string) @$v; + $str = htmlspecialchars(str_replace(array("\r","\n"),' ',substr($v,0,$MAXSTRLEN))); + if (strlen($v) > $MAXSTRLEN) $str .= '...'; + $args[] = $str; + } + } + $s .= $arr['function'].'('.implode(', ',$args).')'; + + + $s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file'])); + + $s .= "\n"; + } + if ($html) $s .= '</pre>'; + if ($printOrArr) print $s; + + return $s; +} +/* +function _adodb_find_from($sql) +{ + + $sql = str_replace(array("\n","\r"), ' ', $sql); + $charCount = strlen($sql); + + $inString = false; + $quote = ''; + $parentheseCount = 0; + $prevChars = ''; + $nextChars = ''; + + + for($i = 0; $i < $charCount; $i++) { + + $char = substr($sql,$i,1); + $prevChars = substr($sql,0,$i); + $nextChars = substr($sql,$i+1); + + if((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === false) { + $quote = $char; + $inString = true; + } + + elseif((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === true && $quote == $char) { + $quote = ""; + $inString = false; + } + + elseif($char == "(" && $inString === false) + $parentheseCount++; + + elseif($char == ")" && $inString === false && $parentheseCount > 0) + $parentheseCount--; + + elseif($parentheseCount <= 0 && $inString === false && $char == " " && strtoupper(substr($prevChars,-5,5)) == " FROM") + return $i; + + } +} +*/ + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-memcache.lib.inc.php b/pos/is4c-nf/lib/adodb5/adodb-memcache.lib.inc.php new file mode 100644 index 000000000..f50dbdb94 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-memcache.lib.inc.php @@ -0,0 +1,190 @@ +<?php + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +global $ADODB_INCLUDED_MEMCACHE; +$ADODB_INCLUDED_MEMCACHE = 1; + +global $ADODB_INCLUDED_CSV; +if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + +/* + + V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + +Usage: + +$db = NewADOConnection($driver); +$db->memCache = true; /// should we use memCache instead of caching in files +$db->memCacheHost = array($ip1, $ip2, $ip3); +$db->memCachePort = 11211; /// this is default memCache port +$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) + +$db->Connect(...); +$db->CacheExecute($sql); + + Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect. + + Class instance is stored in $ADODB_CACHE +*/ + + class ADODB_Cache_MemCache { + var $createdir = false; // create caching directory structure? + + //----------------------------- + // memcache specific variables + + var $hosts; // array of hosts + var $port = 11211; + var $compress = false; // memcache compression with zlib + + var $_connected = false; + var $_memcache = false; + + function ADODB_Cache_MemCache(&$obj) + { + $this->hosts = $obj->memCacheHost; + $this->port = $obj->memCachePort; + $this->compress = $obj->memCacheCompress; + } + + // implement as lazy connection. The connection only occurs on CacheExecute call + function connect(&$err) + { + if (!function_exists('memcache_pconnect')) { + $err = 'Memcache module PECL extension not found!'; + return false; + } + + $memcache = new MemCache; + + if (!is_array($this->hosts)) $this->hosts = array($hosts); + + $failcnt = 0; + foreach($this->hosts as $host) { + if (!@$memcache->addServer($host,$this->port,true)) { + $failcnt += 1; + } + } + if ($failcnt == sizeof($this->hosts)) { + $err = 'Can\'t connect to any memcache server'; + return false; + } + $this->_connected = true; + $this->_memcache = $memcache; + return true; + } + + // returns true or false. true if successful save + function writecache($filename, $contents, $debug, $secs2cache) + { + if (!$this->_connected) { + $err = ''; + if (!$this->connect($err) && $debug) ADOConnection::outp($err); + } + if (!$this->_memcache) return false; + + if (!$this->_memcache->set($filename, $contents, $this->compress, $secs2cache)) { + if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n"); + return false; + } + + return true; + } + + // returns a recordset + function readcache($filename, &$err, $secs2cache, $rsClass) + { + $false = false; + if (!$this->_connected) $this->connect($err); + if (!$this->_memcache) return $false; + + $rs = $this->_memcache->get($filename); + if (!$rs) { + $err = 'Item with such key doesn\'t exists on the memcached server.'; + return $false; + } + + // hack, should actually use _csv2rs + $rs = explode("\n", $rs); + unset($rs[0]); + $rs = join("\n", $rs); + $rs = unserialize($rs); + if (! is_object($rs)) { + $err = 'Unable to unserialize $rs'; + return $false; + } + if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere + + $tdiff = intval($rs->timeCreated+$secs2cache - time()); + if ($tdiff <= 2) { + switch($tdiff) { + case 2: + if ((rand() & 15) == 0) { + $err = "Timeout 2"; + return $false; + } + break; + case 1: + if ((rand() & 3) == 0) { + $err = "Timeout 1"; + return $false; + } + break; + default: + $err = "Timeout 0"; + return $false; + } + } + return $rs; + } + + function flushall($debug=false) + { + if (!$this->_connected) { + $err = ''; + if (!$this->connect($err) && $debug) ADOConnection::outp($err); + } + if (!$this->_memcache) return false; + + $del = $this->_memcache->flush(); + + if ($debug) + if (!$del) ADOConnection::outp("flushall: failed!<br>\n"); + else ADOConnection::outp("flushall: succeeded!<br>\n"); + + return $del; + } + + function flushcache($filename, $debug=false) + { + if (!$this->_connected) { + $err = ''; + if (!$this->connect($err) && $debug) ADOConnection::outp($err); + } + if (!$this->_memcache) return false; + + $del = $this->_memcache->delete($filename); + + if ($debug) + if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcached server!<br>\n"); + else ADOConnection::outp("flushcache: $key entry flushed from memcached server!<br>\n"); + + return $del; + } + + // not used for memcache + function createdir($dir, $hash) + { + return true; + } + } + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-pager.inc.php b/pos/is4c-nf/lib/adodb5/adodb-pager.inc.php new file mode 100644 index 000000000..9f6ca5e2c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-pager.inc.php @@ -0,0 +1,290 @@ +<?php + +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + This class provides recordset pagination with + First/Prev/Next/Last links. + + Feel free to modify this class for your own use as + it is very basic. To learn how to use it, see the + example in adodb/tests/testpaging.php. + + "Pablo Costa" <pablo@cbsp.com.br> implemented Render_PageLinks(). + + Please note, this class is entirely unsupported, + and no free support requests except for bug reports + will be entertained by the author. + +*/ +class ADODB_Pager { + var $id; // unique id for pager (defaults to 'adodb') + var $db; // ADODB connection object + var $sql; // sql used + var $rs; // recordset generated + var $curr_page; // current page number before Render() called, calculated in constructor + var $rows; // number of rows per page + var $linksPerPage=10; // number of links per page in navigation bar + var $showPageLinks; + + var $gridAttributes = 'width=100% border=1 bgcolor=white'; + + // Localize text strings here + var $first = '<code>|&lt;</code>'; + var $prev = '<code>&lt;&lt;</code>'; + var $next = '<code>>></code>'; + var $last = '<code>>|</code>'; + var $moreLinks = '...'; + var $startLinks = '...'; + var $gridHeader = false; + var $htmlSpecialChars = true; + var $page = 'Page'; + var $linkSelectedColor = 'red'; + var $cache = 0; #secs to cache with CachePageExecute() + + //---------------------------------------------- + // constructor + // + // $db adodb connection object + // $sql sql statement + // $id optional id to identify which pager, + // if you have multiple on 1 page. + // $id should be only be [a-z0-9]* + // + function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false) + { + global $PHP_SELF; + + $curr_page = $id.'_curr_page'; + if (!empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks + + $this->sql = $sql; + $this->id = $id; + $this->db = $db; + $this->showPageLinks = $showPageLinks; + + $next_page = $id.'_next_page'; + + if (isset($_GET[$next_page])) { + $_SESSION[$curr_page] = (integer) $_GET[$next_page]; + } + if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page + + $this->curr_page = $_SESSION[$curr_page]; + + } + + //--------------------------- + // Display link to first page + function Render_First($anchor=true) + { + global $PHP_SELF; + if ($anchor) { + ?> + <a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a> &nbsp; + <?php + } else { + print "$this->first &nbsp; "; + } + } + + //-------------------------- + // Display link to next page + function render_next($anchor=true) + { + global $PHP_SELF; + + if ($anchor) { + ?> + <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a> &nbsp; + <?php + } else { + print "$this->next &nbsp; "; + } + } + + //------------------ + // Link to last page + // + // for better performance with large recordsets, you can set + // $this->db->pageExecuteCountRows = false, which disables + // last page counting. + function render_last($anchor=true) + { + global $PHP_SELF; + + if (!$this->db->pageExecuteCountRows) return; + + if ($anchor) { + ?> + <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a> &nbsp; + <?php + } else { + print "$this->last &nbsp; "; + } + } + + //--------------------------------------------------- + // original code by "Pablo Costa" <pablo@cbsp.com.br> + function render_pagelinks() + { + global $PHP_SELF; + $pages = $this->rs->LastPageNo(); + $linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages; + for($i=1; $i <= $pages; $i+=$linksperpage) + { + if($this->rs->AbsolutePage() >= $i) + { + $start = $i; + } + } + $numbers = ''; + $end = $start+$linksperpage-1; + $link = $this->id . "_next_page"; + if($end > $pages) $end = $pages; + + + if ($this->startLinks && $start > 1) { + $pos = $start - 1; + $numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> "; + } + + for($i=$start; $i <= $end; $i++) { + if ($this->rs->AbsolutePage() == $i) + $numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> "; + else + $numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> "; + + } + if ($this->moreLinks && $end < $pages) + $numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> "; + print $numbers . ' &nbsp; '; + } + // Link to previous page + function render_prev($anchor=true) + { + global $PHP_SELF; + if ($anchor) { + ?> + <a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a> &nbsp; + <?php + } else { + print "$this->prev &nbsp; "; + } + } + + //-------------------------------------------------------- + // Simply rendering of grid. You should override this for + // better control over the format of the grid + // + // We use output buffering to keep code clean and readable. + function RenderGrid() + { + global $gSQLBlockRows; // used by rs2html to indicate how many rows to display + include_once(ADODB_DIR.'/tohtml.inc.php'); + ob_start(); + $gSQLBlockRows = $this->rows; + rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars); + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + + //------------------------------------------------------- + // Navigation bar + // + // we use output buffering to keep the code easy to read. + function RenderNav() + { + ob_start(); + if (!$this->rs->AtFirstPage()) { + $this->Render_First(); + $this->Render_Prev(); + } else { + $this->Render_First(false); + $this->Render_Prev(false); + } + if ($this->showPageLinks){ + $this->Render_PageLinks(); + } + if (!$this->rs->AtLastPage()) { + $this->Render_Next(); + $this->Render_Last(); + } else { + $this->Render_Next(false); + $this->Render_Last(false); + } + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + + //------------------- + // This is the footer + function RenderPageCount() + { + if (!$this->db->pageExecuteCountRows) return ''; + $lastPage = $this->rs->LastPageNo(); + if ($lastPage == -1) $lastPage = 1; // check for empty rs. + if ($this->curr_page > $lastPage) $this->curr_page = 1; + return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>"; + } + + //----------------------------------- + // Call this class to draw everything. + function Render($rows=10) + { + global $ADODB_COUNTRECS; + + $this->rows = $rows; + + if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL; + + $savec = $ADODB_COUNTRECS; + if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true; + if ($this->cache) + $rs = $this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page); + else + $rs = $this->db->PageExecute($this->sql,$rows,$this->curr_page); + $ADODB_COUNTRECS = $savec; + + $this->rs = $rs; + if (!$rs) { + print "<h3>Query failed: $this->sql</h3>"; + return; + } + + if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage())) + $header = $this->RenderNav(); + else + $header = "&nbsp;"; + + $grid = $this->RenderGrid(); + $footer = $this->RenderPageCount(); + + $this->RenderLayout($header,$grid,$footer); + + $rs->Close(); + $this->rs = false; + } + + //------------------------------------------------------ + // override this to control overall layout and formating + function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige') + { + echo "<table ".$attributes."><tr><td>", + $header, + "</td></tr><tr><td>", + $grid, + "</td></tr><tr><td>", + $footer, + "</td></tr></table>"; + } +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-pear.inc.php b/pos/is4c-nf/lib/adodb5/adodb-pear.inc.php new file mode 100644 index 000000000..656370455 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-pear.inc.php @@ -0,0 +1,374 @@ +<?php +/** + * @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * PEAR DB Emulation Layer for ADODB. + * + * The following code is modelled on PEAR DB code by Stig Bakken <ssb@fast.no> | + * and Tomas V.V.Cox <cox@idecnet.com>. Portions (c)1997-2002 The PHP Group. + */ + + /* + We support: + + DB_Common + --------- + query - returns PEAR_Error on error + limitQuery - return PEAR_Error on error + prepare - does not return PEAR_Error on error + execute - does not return PEAR_Error on error + setFetchMode - supports ASSOC and ORDERED + errorNative + quote + nextID + disconnect + + getOne + getAssoc + getRow + getCol + getAll + + DB_Result + --------- + numRows - returns -1 if not supported + numCols + fetchInto - does not support passing of fetchmode + fetchRows - does not support passing of fetchmode + free + */ + +define('ADODB_PEAR',dirname(__FILE__)); +include_once "PEAR.php"; +include_once ADODB_PEAR."/adodb-errorpear.inc.php"; +include_once ADODB_PEAR."/adodb.inc.php"; + +if (!defined('DB_OK')) { +define("DB_OK", 1); +define("DB_ERROR",-1); + +// autoExecute constants +define('DB_AUTOQUERY_INSERT', 1); +define('DB_AUTOQUERY_UPDATE', 2); + +/** + * This is a special constant that tells DB the user hasn't specified + * any particular get mode, so the default should be used. + */ + +define('DB_FETCHMODE_DEFAULT', 0); + +/** + * Column data indexed by numbers, ordered from 0 and up + */ + +define('DB_FETCHMODE_ORDERED', 1); + +/** + * Column data indexed by column names + */ + +define('DB_FETCHMODE_ASSOC', 2); + +/* for compatibility */ + +define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); +define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); + +/** + * these are constants for the tableInfo-function + * they are bitwised or'ed. so if there are more constants to be defined + * in the future, adjust DB_TABLEINFO_FULL accordingly + */ + +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); +} + +/** + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + */ + +class DB +{ + /** + * Create a new DB object for the specified database type + * + * @param $type string database type, for example "mysql" + * + * @return object a newly created DB object, or a DB error code on + * error + */ + + function factory($type) + { + include_once(ADODB_DIR."/drivers/adodb-$type.inc.php"); + $obj = NewADOConnection($type); + if (!is_object($obj)) $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); + return $obj; + } + + /** + * Create a new DB object and connect to the specified database + * + * @param $dsn mixed "data source name", see the DB::parseDSN + * method for a description of the dsn format. Can also be + * specified as an array of the format returned by DB::parseDSN. + * + * @param $options mixed if boolean (or scalar), tells whether + * this connection should be persistent (for backends that support + * this). This parameter can also be an array of options, see + * DB_common::setOption for more information on connection + * options. + * + * @return object a newly created DB connection object, or a DB + * error object on error + * + * @see DB::parseDSN + * @see DB::isError + */ + function connect($dsn, $options = false) + { + if (is_array($dsn)) { + $dsninfo = $dsn; + } else { + $dsninfo = DB::parseDSN($dsn); + } + switch ($dsninfo["phptype"]) { + case 'pgsql': $type = 'postgres7'; break; + case 'ifx': $type = 'informix9'; break; + default: $type = $dsninfo["phptype"]; break; + } + + if (is_array($options) && isset($options["debug"]) && + $options["debug"] >= 2) { + // expose php errors with sufficient debug level + @include_once("adodb-$type.inc.php"); + } else { + @include_once("adodb-$type.inc.php"); + } + + @$obj = NewADOConnection($type); + if (!is_object($obj)) { + $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); + return $obj; + } + if (is_array($options)) { + foreach($options as $k => $v) { + switch(strtolower($k)) { + case 'persist': + case 'persistent': $persist = $v; break; + #ibase + case 'dialect': $obj->dialect = $v; break; + case 'charset': $obj->charset = $v; break; + case 'buffers': $obj->buffers = $v; break; + #ado + case 'charpage': $obj->charPage = $v; break; + #mysql + case 'clientflags': $obj->clientFlags = $v; break; + } + } + } else { + $persist = false; + } + + if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket']; + else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port']; + + if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); + else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); + + if (!$ok) $obj = ADODB_PEAR_Error(); + return $obj; + } + + /** + * Return the DB API version + * + * @return int the DB API version number + */ + function apiVersion() + { + return 2; + } + + /** + * Tell whether a result code from a DB method is an error + * + * @param $value int result code + * + * @return bool whether $value is an error + */ + function isError($value) + { + if (!is_object($value)) return false; + $class = strtolower(get_class($value)); + return $class == 'pear_error' || is_subclass_of($value, 'pear_error') || + $class == 'db_error' || is_subclass_of($value, 'db_error'); + } + + + /** + * Tell whether a result code from a DB method is a warning. + * Warnings differ from errors in that they are generated by DB, + * and are not fatal. + * + * @param $value mixed result value + * + * @return bool whether $value is a warning + */ + function isWarning($value) + { + return false; + /* + return is_object($value) && + (get_class( $value ) == "db_warning" || + is_subclass_of($value, "db_warning"));*/ + } + + /** + * Parse a data source name + * + * @param $dsn string Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * + * phptype: Database backend used in PHP (mysql, odbc etc.) + * dbsyntax: Database used with regards to SQL syntax etc. + * protocol: Communication protocol to use (tcp, unix etc.) + * hostspec: Host specification (hostname[:port]) + * database: Database to use on the DBMS server + * username: User name for login + * password: Password for login + * + * The format of the supplied DSN is in its fullest form: + * + * phptype(dbsyntax)://username:password@protocol+hostspec/database + * + * Most variations are allowed: + * + * phptype://username:password@protocol+hostspec:110//usr/db_file.db + * phptype://username:password@hostspec/database_name + * phptype://username:password@hostspec + * phptype://username@hostspec + * phptype://hostspec/database + * phptype://hostspec + * phptype(dbsyntax) + * phptype + * + * @author Tomas V.V.Cox <cox@idecnet.com> + */ + function parseDSN($dsn) + { + if (is_array($dsn)) { + return $dsn; + } + + $parsed = array( + 'phptype' => false, + 'dbsyntax' => false, + 'protocol' => false, + 'hostspec' => false, + 'database' => false, + 'username' => false, + 'password' => false + ); + + // Find phptype and dbsyntax + if (($pos = strpos($dsn, '://')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 3); + } else { + $str = $dsn; + $dsn = NULL; + } + + // Get phptype and dbsyntax + // $str => phptype(dbsyntax) + if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { + $parsed['phptype'] = $arr[1]; + $parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2]; + } else { + $parsed['phptype'] = $str; + $parsed['dbsyntax'] = $str; + } + + if (empty($dsn)) { + return $parsed; + } + + // Get (if found): username and password + // $dsn => username:password@protocol+hostspec/database + if (($at = strpos($dsn,'@')) !== false) { + $str = substr($dsn, 0, $at); + $dsn = substr($dsn, $at + 1); + if (($pos = strpos($str, ':')) !== false) { + $parsed['username'] = urldecode(substr($str, 0, $pos)); + $parsed['password'] = urldecode(substr($str, $pos + 1)); + } else { + $parsed['username'] = urldecode($str); + } + } + + // Find protocol and hostspec + // $dsn => protocol+hostspec/database + if (($pos=strpos($dsn, '/')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 1); + } else { + $str = $dsn; + $dsn = NULL; + } + + // Get protocol + hostspec + // $str => protocol+hostspec + if (($pos=strpos($str, '+')) !== false) { + $parsed['protocol'] = substr($str, 0, $pos); + $parsed['hostspec'] = urldecode(substr($str, $pos + 1)); + } else { + $parsed['hostspec'] = urldecode($str); + } + + // Get dabase if any + // $dsn => database + if (!empty($dsn)) { + $parsed['database'] = $dsn; + } + + return $parsed; + } + + /** + * Load a PHP database extension if it is not loaded already. + * + * @access public + * + * @param $name the base name of the extension (without the .so or + * .dll suffix) + * + * @return bool true if the extension was already or successfully + * loaded, false if it could not be loaded + */ + function assertExtension($name) + { + if (!extension_loaded($name)) { + $dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so'; + @dl($name . $dlext); + } + if (!extension_loaded($name)) { + return false; + } + return true; + } +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-perf.inc.php b/pos/is4c-nf/lib/adodb5/adodb-perf.inc.php new file mode 100644 index 000000000..b837a520b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-perf.inc.php @@ -0,0 +1,1099 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning. + + My apologies if you see code mixed with presentation. The presentation suits + my needs. If you want to separate code from presentation, be my guest. Patches + are welcome. + +*/ + +if (!defined('ADODB_DIR')) include_once(dirname(__FILE__).'/adodb.inc.php'); +include_once(ADODB_DIR.'/tohtml.inc.php'); + +define( 'ADODB_OPT_HIGH', 2); +define( 'ADODB_OPT_LOW', 1); + +global $ADODB_PERF_MIN; +$ADODB_PERF_MIN = 0.05; // log only if >= minimum number of secs to run + + +// returns in K the memory of current process, or 0 if not known +function adodb_getmem() +{ + if (function_exists('memory_get_usage')) + return (integer) ((memory_get_usage()+512)/1024); + + $pid = getmypid(); + + if ( strncmp(strtoupper(PHP_OS),'WIN',3)==0) { + $output = array(); + + exec('tasklist /FI "PID eq ' . $pid. '" /FO LIST', $output); + return substr($output[5], strpos($output[5], ':') + 1); + } + + /* Hopefully UNIX */ + exec("ps --pid $pid --no-headers -o%mem,size", $output); + if (sizeof($output) == 0) return 0; + + $memarr = explode(' ',$output[0]); + if (sizeof($memarr)>=2) return (integer) $memarr[1]; + + return 0; +} + +// avoids localization problems where , is used instead of . +function adodb_round($n,$prec) +{ + return number_format($n, $prec, '.', ''); +} + +/* obsolete: return microtime value as a float. Retained for backward compat */ +function adodb_microtime() +{ + return microtime(true); +} + +/* sql code timing */ +function adodb_log_sql(&$connx,$sql,$inputarr) +{ + $perf_table = adodb_perf::table(); + $connx->fnExecute = false; + $a0 = microtime(true); + $rs = $connx->Execute($sql,$inputarr); + $a1 = microtime(true); + + if (!empty($connx->_logsql) && (empty($connx->_logsqlErrors) || !$rs)) { + global $ADODB_LOG_CONN; + + if (!empty($ADODB_LOG_CONN)) { + $conn = $ADODB_LOG_CONN; + if ($conn->databaseType != $connx->databaseType) + $prefix = '/*dbx='.$connx->databaseType .'*/ '; + else + $prefix = ''; + } else { + $conn = $connx; + $prefix = ''; + } + + $conn->_logsql = false; // disable logsql error simulation + $dbT = $conn->databaseType; + + $time = $a1 - $a0; + + if (!$rs) { + $errM = $connx->ErrorMsg(); + $errN = $connx->ErrorNo(); + $conn->lastInsID = 0; + $tracer = substr('ERROR: '.htmlspecialchars($errM),0,250); + } else { + $tracer = ''; + $errM = ''; + $errN = 0; + $dbg = $conn->debug; + $conn->debug = false; + if (!is_object($rs) || $rs->dataProvider == 'empty') + $conn->_affected = $conn->affected_rows(true); + $conn->lastInsID = @$conn->Insert_ID(); + $conn->debug = $dbg; + } + if (isset($_SERVER['HTTP_HOST'])) { + $tracer .= '<br>'.$_SERVER['HTTP_HOST']; + if (isset($_SERVER['PHP_SELF'])) $tracer .= htmlspecialchars($_SERVER['PHP_SELF']); + } else + if (isset($_SERVER['PHP_SELF'])) $tracer .= '<br>'.htmlspecialchars($_SERVER['PHP_SELF']); + //$tracer .= (string) adodb_backtrace(false); + + $tracer = (string) substr($tracer,0,500); + + if (is_array($inputarr)) { + if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr); + else { + // Quote string parameters so we can see them in the + // performance stats. This helps spot disabled indexes. + $xar_params = $inputarr; + foreach ($xar_params as $xar_param_key => $xar_param) { + if (gettype($xar_param) == 'string') + $xar_params[$xar_param_key] = '"' . $xar_param . '"'; + } + $params = implode(', ', $xar_params); + if (strlen($params) >= 3000) $params = substr($params, 0, 3000); + } + } else { + $params = ''; + } + + if (is_array($sql)) $sql = $sql[0]; + if ($prefix) $sql = $prefix.$sql; + $arr = array('b'=>strlen($sql).'.'.crc32($sql), + 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6)); + //var_dump($arr); + $saved = $conn->debug; + $conn->debug = 0; + + $d = $conn->sysTimeStamp; + if (empty($d)) $d = date("'Y-m-d H:i:s'"); + if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') { + $isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)"; + } else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || strncmp($dbT,'odbtp',4)==0) { + $timer = $arr['f']; + if ($dbT == 'informix') $sql2 = substr($sql2,0,230); + + $sql1 = $conn->qstr($arr['b']); + $sql2 = $conn->qstr($arr['c']); + $params = $conn->qstr($arr['d']); + $tracer = $conn->qstr($arr['e']); + + $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($d,$sql1,$sql2,$params,$tracer,$timer)"; + if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql); + $arr = false; + } else { + if ($dbT == 'db2') $arr['f'] = (float) $arr['f']; + $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)"; + } + + global $ADODB_PERF_MIN; + if ($errN != 0 || $time >= $ADODB_PERF_MIN) { + $ok = $conn->Execute($isql,$arr); + } else + $ok = true; + + $conn->debug = $saved; + + if ($ok) { + $conn->_logsql = true; + } else { + $err2 = $conn->ErrorMsg(); + $conn->_logsql = true; // enable logsql error simulation + $perf = NewPerfMonitor($conn); + if ($perf) { + if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr); + } else { + $ok = $conn->Execute("create table $perf_table ( + created varchar(50), + sql0 varchar(250), + sql1 varchar(4000), + params varchar(3000), + tracer varchar(500), + timer decimal(16,6))"); + } + if (!$ok) { + ADOConnection::outp( "<p><b>LOGSQL Insert Failed</b>: $isql<br>$err2</p>"); + $conn->_logsql = false; + } + } + $connx->_errorMsg = $errM; + $connx->_errorCode = $errN; + } + $connx->fnExecute = 'adodb_log_sql'; + return $rs; +} + + +/* +The settings data structure is an associative array that database parameter per element. + +Each database parameter element in the array is itself an array consisting of: + +0: category code, used to group related db parameters +1: either + a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'", + b. array holding sql string and field to look for, e.g. array('show variables','table_cache'), + c. a string prefixed by =, then a PHP method of the class is invoked, + e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue', +2: description of the database parameter +*/ + +class adodb_perf { + var $conn; + var $color = '#F0F0F0'; + var $table = '<table border=1 bgcolor=white>'; + var $titles = '<tr><td><b>Parameter</b></td><td><b>Value</b></td><td><b>Description</b></td></tr>'; + var $warnRatio = 90; + var $tablesSQL = false; + var $cliFormat = "%32s => %s \r\n"; + var $sql1 = 'sql1'; // used for casting sql1 to text for mssql + var $explain = true; + var $helpurl = "<a href=http://phplens.com/adodb/reference.functions.fnexecute.and.fncacheexecute.properties.html#logsql>LogSQL help</a>"; + var $createTableSQL = false; + var $maxLength = 2000; + + // Sets the tablename to be used + static function table($newtable = false) + { + static $_table; + + if (!empty($newtable)) $_table = $newtable; + if (empty($_table)) $_table = 'adodb_logsql'; + return $_table; + } + + // returns array with info to calculate CPU Load + function _CPULoad() + { +/* + +cpu 524152 2662 2515228 336057010 +cpu0 264339 1408 1257951 168025827 +cpu1 259813 1254 1257277 168031181 +page 622307 25475680 +swap 24 1891 +intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320) +ctxt 66155838 +btime 1062315585 +processes 69293 + +*/ + // Algorithm is taken from + // http://social.technet.microsoft.com/Forums/en-US/winservergen/thread/414b0e1b-499c-411e-8a02-6a12e339c0f1/ + if (strncmp(PHP_OS,'WIN',3)==0) { + if (PHP_VERSION == '5.0.0') return false; + if (PHP_VERSION == '5.0.1') return false; + if (PHP_VERSION == '5.0.2') return false; + if (PHP_VERSION == '5.0.3') return false; + if (PHP_VERSION == '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737 + + static $FAIL = false; + if ($FAIL) return false; + + $objName = "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\CIMV2"; + $myQuery = "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name = '_Total'"; + + try { + @$objWMIService = new COM($objName); + if (!$objWMIService) { + $FAIL = true; + return false; + } + + $info[0] = -1; + $info[1] = 0; + $info[2] = 0; + $info[3] = 0; + foreach($objWMIService->ExecQuery($myQuery) as $objItem) { + $info[0] = $objItem->PercentProcessorTime(); + } + + } catch(Exception $e) { + $FAIL = true; + echo $e->getMessage(); + return false; + } + + return $info; + } + + // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com) + $statfile = '/proc/stat'; + if (!file_exists($statfile)) return false; + + $fd = fopen($statfile,"r"); + if (!$fd) return false; + + $statinfo = explode("\n",fgets($fd, 1024)); + fclose($fd); + foreach($statinfo as $line) { + $info = explode(" ",$line); + if($info[0]=="cpu") { + array_shift($info); // pop off "cpu" + if(!$info[0]) array_shift($info); // pop off blank space (if any) + return $info; + } + } + + return false; + + } + + /* NOT IMPLEMENTED */ + function MemInfo() + { + /* + + total: used: free: shared: buffers: cached: +Mem: 1055289344 917299200 137990144 0 165437440 599773184 +Swap: 2146775040 11055104 2135719936 +MemTotal: 1030556 kB +MemFree: 134756 kB +MemShared: 0 kB +Buffers: 161560 kB +Cached: 581384 kB +SwapCached: 4332 kB +Active: 494468 kB +Inact_dirty: 322856 kB +Inact_clean: 24256 kB +Inact_target: 168316 kB +HighTotal: 131064 kB +HighFree: 1024 kB +LowTotal: 899492 kB +LowFree: 133732 kB +SwapTotal: 2096460 kB +SwapFree: 2085664 kB +Committed_AS: 348732 kB + */ + } + + + /* + Remember that this is client load, not db server load! + */ + var $_lastLoad; + function CPULoad() + { + $info = $this->_CPULoad(); + if (!$info) return false; + + if (strncmp(PHP_OS,'WIN',3)==0) { + return (integer) $info[0]; + }else { + if (empty($this->_lastLoad)) { + sleep(1); + $this->_lastLoad = $info; + $info = $this->_CPULoad(); + } + + $last = $this->_lastLoad; + $this->_lastLoad = $info; + + $d_user = $info[0] - $last[0]; + $d_nice = $info[1] - $last[1]; + $d_system = $info[2] - $last[2]; + $d_idle = $info[3] - $last[3]; + + //printf("Delta - User: %f Nice: %f System: %f Idle: %f<br>",$d_user,$d_nice,$d_system,$d_idle); + + $total=$d_user+$d_nice+$d_system+$d_idle; + if ($total<1) $total=1; + return 100*($d_user+$d_nice+$d_system)/$total; + } + } + + function Tracer($sql) + { + $perf_table = adodb_perf::table(); + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $sqlq = $this->conn->qstr($sql); + $arr = $this->conn->GetArray( +"select count(*),tracer + from $perf_table where sql1=$sqlq + group by tracer + order by 1 desc"); + $s = ''; + if ($arr) { + $s .= '<h3>Scripts Affected</h3>'; + foreach($arr as $k) { + $s .= sprintf("%4d",$k[0]).' &nbsp; '.strip_tags($k[1]).'<br>'; + } + } + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_CACHE_MODE = $save; + $this->conn->fnExecute = $saveE; + return $s; + } + + /* + Explain Plan for $sql. + If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the + actual sql. + */ + function Explain($sql,$partial=false) + { + return false; + } + + function InvalidSQL($numsql = 10) + { + + if (isset($_GET['sql'])) return; + $s = '<h3>Invalid SQL</h3>'; + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + $perf_table = adodb_perf::table(); + $rs = $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql); + $this->conn->fnExecute = $saveE; + if ($rs) { + $s .= rs2html($rs,false,false,false,false); + } else + return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>"; + + return $s; + } + + + /* + This script identifies the longest running SQL + */ + function _SuspiciousSQL($numsql = 10) + { + global $ADODB_FETCH_MODE; + + $perf_table = adodb_perf::table(); + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + + if (isset($_GET['exps']) && isset($_GET['sql'])) { + $partial = !empty($_GET['part']); + echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n"; + } + + if (isset($_GET['sql'])) return; + $sql1 = $this->sql1; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + //$this->conn->debug=1; + $rs = $this->conn->SelectLimit( + "select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer + from $perf_table + where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT') + and (tracer is null or tracer not like 'ERROR:%') + group by sql1 + order by 1 desc",$numsql); + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + $this->conn->fnExecute = $saveE; + + if (!$rs) return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>"; + $s = "<h3>Suspicious SQL</h3> +<font size=1>The following SQL have high average execution times</font><br> +<table border=1 bgcolor=white><tr><td><b>Avg Time</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n"; + $max = $this->maxLength; + while (!$rs->EOF) { + $sql = $rs->fields[1]; + $raw = urlencode($sql); + if (strlen($raw)>$max-100) { + $sql2 = substr($sql,0,$max-500); + $raw = urlencode($sql2).'&part='.crc32($sql); + } + $prefix = "<a target=sql".rand()." href=\"?hidem=1&exps=1&sql=".$raw."&x#explain\">"; + $suffix = "</a>"; + if ($this->explain == false || strlen($prefix)>$max) { + $suffix = ' ... <i>String too long for GET parameter: '.strlen($prefix).'</i>'; + $prefix = ''; + } + $s .= "<tr><td>".adodb_round($rs->fields[0],6)."<td align=right>".$rs->fields[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>". + "<td>".$rs->fields[3]."<td>".$rs->fields[4]."</tr>"; + $rs->MoveNext(); + } + return $s."</table>"; + + } + + function CheckMemory() + { + return ''; + } + + + function SuspiciousSQL($numsql=10) + { + return adodb_perf::_SuspiciousSQL($numsql); + } + + function ExpensiveSQL($numsql=10) + { + return adodb_perf::_ExpensiveSQL($numsql); + } + + + /* + This reports the percentage of load on the instance due to the most + expensive few SQL statements. Tuning these statements can often + make huge improvements in overall system performance. + */ + function _ExpensiveSQL($numsql = 10) + { + global $ADODB_FETCH_MODE; + + $perf_table = adodb_perf::table(); + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + + if (isset($_GET['expe']) && isset($_GET['sql'])) { + $partial = !empty($_GET['part']); + echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n"; + } + + if (isset($_GET['sql'])) return; + + $sql1 = $this->sql1; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->SelectLimit( + "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer + from $perf_table + where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT') + and (tracer is null or tracer not like 'ERROR:%') + group by sql1 + having count(*)>1 + order by 1 desc",$numsql); + if (isset($savem)) $this->conn->SetFetchMode($savem); + $this->conn->fnExecute = $saveE; + $ADODB_FETCH_MODE = $save; + if (!$rs) return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>"; + $s = "<h3>Expensive SQL</h3> +<font size=1>Tuning the following SQL could reduce the server load substantially</font><br> +<table border=1 bgcolor=white><tr><td><b>Load</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n"; + $max = $this->maxLength; + while (!$rs->EOF) { + $sql = $rs->fields[1]; + $raw = urlencode($sql); + if (strlen($raw)>$max-100) { + $sql2 = substr($sql,0,$max-500); + $raw = urlencode($sql2).'&part='.crc32($sql); + } + $prefix = "<a target=sqle".rand()." href=\"?hidem=1&expe=1&sql=".$raw."&x#explain\">"; + $suffix = "</a>"; + if($this->explain == false || strlen($prefix>$max)) { + $prefix = ''; + $suffix = ''; + } + $s .= "<tr><td>".adodb_round($rs->fields[0],6)."<td align=right>".$rs->fields[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>". + "<td>".$rs->fields[3]."<td>".$rs->fields[4]."</tr>"; + $rs->MoveNext(); + } + return $s."</table>"; + } + + /* + Raw function to return parameter value from $settings. + */ + function DBParameter($param) + { + if (empty($this->settings[$param])) return false; + $sql = $this->settings[$param][1]; + return $this->_DBParameter($sql); + } + + /* + Raw function returning array of poll paramters + */ + function PollParameters() + { + $arr[0] = (float)$this->DBParameter('data cache hit ratio'); + $arr[1] = (float)$this->DBParameter('data reads'); + $arr[2] = (float)$this->DBParameter('data writes'); + $arr[3] = (integer) $this->DBParameter('current connections'); + return $arr; + } + + /* + Low-level Get Database Parameter + */ + function _DBParameter($sql) + { + $savelog = $this->conn->LogSQL(false); + if (is_array($sql)) { + global $ADODB_FETCH_MODE; + + $sql1 = $sql[0]; + $key = $sql[1]; + if (sizeof($sql)>2) $pos = $sql[2]; + else $pos = 1; + if (sizeof($sql)>3) $coef = $sql[3]; + else $coef = false; + $ret = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute($sql1); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs) { + while (!$rs->EOF) { + $keyf = reset($rs->fields); + if (trim($keyf) == $key) { + $ret = $rs->fields[$pos]; + if ($coef) $ret *= $coef; + break; + } + $rs->MoveNext(); + } + $rs->Close(); + } + $this->conn->LogSQL($savelog); + return $ret; + } else { + if (strncmp($sql,'=',1) == 0) { + $fn = substr($sql,1); + return $this->$fn(); + } + $sql = str_replace('$DATABASE',$this->conn->database,$sql); + $ret = $this->conn->GetOne($sql); + $this->conn->LogSQL($savelog); + + return $ret; + } + } + + /* + Warn if cache ratio falls below threshold. Displayed in "Description" column. + */ + function WarnCacheRatio($val) + { + if ($val < $this->warnRatio) + return '<font color=red><b>Cache ratio should be at least '.$this->warnRatio.'%</b></font>'; + else return ''; + } + + function clearsql() + { + $perf_table = adodb_perf::table(); + $this->conn->Execute("delete from $perf_table where created<".$this->conn->sysTimeStamp); + } + /***********************************************************************************************/ + // HIGH LEVEL UI FUNCTIONS + /***********************************************************************************************/ + + + function UI($pollsecs=5) + { + global $ADODB_LOG_CONN; + + $perf_table = adodb_perf::table(); + $conn = $this->conn; + + $app = $conn->host; + if ($conn->host && $conn->database) $app .= ', db='; + $app .= $conn->database; + + if ($app) $app .= ', '; + $savelog = $this->conn->LogSQL(false); + $info = $conn->ServerInfo(); + if (isset($_GET['clearsql'])) { + $this->clearsql(); + } + $this->conn->LogSQL($savelog); + + // magic quotes + + if (isset($_GET['sql']) && get_magic_quotes_gpc()) { + $_GET['sql'] = $_GET['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$_GET['sql']); + } + + if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10; + else $nsql = $_SESSION['ADODB_PERF_SQL']; + + $app .= $info['description']; + + + if (isset($_GET['do'])) $do = $_GET['do']; + else if (isset($_POST['do'])) $do = $_POST['do']; + else if (isset($_GET['sql'])) $do = 'viewsql'; + else $do = 'stats'; + + if (isset($_GET['nsql'])) { + if ($_GET['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $_GET['nsql']; + } + echo "<title>ADOdb Performance Monitor on $app</title><body bgcolor=white>"; + if ($do == 'viewsql') $form = "<td><form># SQL:<input type=hidden value=viewsql name=do> <input type=text size=4 name=nsql value=$nsql><input type=submit value=Go></td></form>"; + else $form = "<td>&nbsp;</td>"; + + $allowsql = !defined('ADODB_PERF_NO_RUN_SQL'); + global $ADODB_PERF_MIN; + $app .= " (Min sql timing \$ADODB_PERF_MIN=$ADODB_PERF_MIN secs)"; + + if (empty($_GET['hidem'])) + echo "<table border=1 width=100% bgcolor=lightyellow><tr><td colspan=2> + <b><a href=http://adodb.sourceforge.net/?perf=1>ADOdb</a> Performance Monitor</b> <font size=1>for $app</font></tr><tr><td> + <a href=?do=stats><b>Performance Stats</b></a> &nbsp; <a href=?do=viewsql><b>View SQL</b></a> + &nbsp; <a href=?do=tables><b>View Tables</b></a> &nbsp; <a href=?do=poll><b>Poll Stats</b></a>", + $allowsql ? ' &nbsp; <a href=?do=dosql><b>Run SQL</b></a>' : '', + "$form", + "</tr></table>"; + + + switch ($do) { + default: + case 'stats': + if (empty($ADODB_LOG_CONN)) + echo "<p>&nbsp; <a href=\"?do=viewsql&clearsql=1\">Clear SQL Log</a><br>"; + echo $this->HealthCheck(); + //$this->conn->debug=1; + echo $this->CheckMemory(); + break; + case 'poll': + $self = htmlspecialchars($_SERVER['PHP_SELF']); + echo "<iframe width=720 height=80% + src=\"{$self}?do=poll2&hidem=1\"></iframe>"; + break; + case 'poll2': + echo "<pre>"; + $this->Poll($pollsecs); + break; + + case 'dosql': + if (!$allowsql) break; + + $this->DoSQLForm(); + break; + case 'viewsql': + if (empty($_GET['hidem'])) + echo "&nbsp; <a href=\"?do=viewsql&clearsql=1\">Clear SQL Log</a><br>"; + echo($this->SuspiciousSQL($nsql)); + echo($this->ExpensiveSQL($nsql)); + echo($this->InvalidSQL($nsql)); + break; + case 'tables': + echo $this->Tables(); break; + } + global $ADODB_vers; + echo "<p><div align=center><font size=1>$ADODB_vers Sponsored by <a href=http://phplens.com/>phpLens</a></font></div>"; + } + + /* + Runs in infinite loop, returning real-time statistics + */ + function Poll($secs=5) + { + $this->conn->fnExecute = false; + //$this->conn->debug=1; + if ($secs <= 1) $secs = 1; + echo "Accumulating statistics, every $secs seconds...\n";flush(); + $arro = $this->PollParameters(); + $cnt = 0; + set_time_limit(0); + sleep($secs); + while (1) { + + $arr = $this->PollParameters(); + + $hits = sprintf('%2.2f',$arr[0]); + $reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs); + $writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs); + $sess = sprintf('%5d',$arr[3]); + + $load = $this->CPULoad(); + if ($load !== false) { + $oslabel = 'WS-CPU%'; + $osval = sprintf(" %2.1f ",(float) $load); + }else { + $oslabel = ''; + $osval = ''; + } + if ($cnt % 10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n"; + $cnt += 1; + echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n"; + flush(); + + if (connection_aborted()) return; + + sleep($secs); + $arro = $arr; + } + } + + /* + Returns basic health check in a command line interface + */ + function HealthCheckCLI() + { + return $this->HealthCheck(true); + } + + + /* + Returns basic health check as HTML + */ + function HealthCheck($cli=false) + { + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + if ($cli) $html = ''; + else $html = $this->table.'<tr><td colspan=3><h3>'.$this->conn->databaseType.'</h3></td></tr>'.$this->titles; + + $oldc = false; + $bgc = ''; + foreach($this->settings as $name => $arr) { + if ($arr === false) break; + + if (!is_string($name)) { + if ($cli) $html .= " -- $arr -- \n"; + else $html .= "<tr bgcolor=$this->color><td colspan=3><i>$arr</i> &nbsp;</td></tr>"; + continue; + } + + if (!is_array($arr)) break; + $category = $arr[0]; + $how = $arr[1]; + if (sizeof($arr)>2) $desc = $arr[2]; + else $desc = ' &nbsp; '; + + + if ($category == 'HIDE') continue; + + $val = $this->_DBParameter($how); + + if ($desc && strncmp($desc,"=",1) === 0) { + $fn = substr($desc,1); + $desc = $this->$fn($val); + } + + if ($val === false) { + $m = $this->conn->ErrorMsg(); + $val = "Error: $m"; + } else { + if (is_numeric($val) && $val >= 256*1024) { + if ($val % (1024*1024) == 0) { + $val /= (1024*1024); + $val .= 'M'; + } else if ($val % 1024 == 0) { + $val /= 1024; + $val .= 'K'; + } + //$val = htmlspecialchars($val); + } + } + if ($category != $oldc) { + $oldc = $category; + //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color; + } + if (strlen($desc)==0) $desc = '&nbsp;'; + if (strlen($val)==0) $val = '&nbsp;'; + if ($cli) { + $html .= str_replace('&nbsp;','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc))); + + }else { + $html .= "<tr$bgc><td>".$name.'</td><td>'.$val.'</td><td>'.$desc."</td></tr>\n"; + } + } + + if (!$cli) $html .= "</table>\n"; + $this->conn->fnExecute = $saveE; + + return $html; + } + + function Tables($orderby='1') + { + if (!$this->tablesSQL) return false; + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby); + $this->conn->LogSQL($savelog); + $html = rs2html($rs,false,false,false,false); + return $html; + } + + + function CreateLogTable() + { + if (!$this->createTableSQL) return false; + + $table = $this->table(); + $sql = str_replace('adodb_logsql',$table,$this->createTableSQL); + $savelog = $this->conn->LogSQL(false); + $ok = $this->conn->Execute($sql); + $this->conn->LogSQL($savelog); + return ($ok) ? true : false; + } + + function DoSQLForm() + { + + + $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); + $sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : ''; + + if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows']; + else $rows = 3; + + if (isset($_REQUEST['SMALLER'])) { + $rows /= 2; + if ($rows < 3) $rows = 3; + $_SESSION['phplens_sqlrows'] = $rows; + } + if (isset($_REQUEST['BIGGER'])) { + $rows *= 2; + $_SESSION['phplens_sqlrows'] = $rows; + } + +?> + +<form method="POST" action="<?php echo $PHP_SELF ?>"> +<table><tr> +<td> Form size: <input type="submit" value=" &lt; " name="SMALLER"><input type="submit" value=" &gt; &gt; " name="BIGGER"> +</td> +<td align=right> +<input type="submit" value=" Run SQL Below " name="RUN"><input type=hidden name=do value=dosql> +</td></tr> + <tr> + <td colspan=2><textarea rows=<?php print $rows; ?> name="sql" cols="80"><?php print htmlspecialchars($sql) ?></textarea> + </td> + </tr> + </table> +</form> + +<?php + if (!isset($_REQUEST['sql'])) return; + + $sql = $this->undomq(trim($sql)); + if (substr($sql,strlen($sql)-1) === ';') { + $print = true; + $sqla = $this->SplitSQL($sql); + } else { + $print = false; + $sqla = array($sql); + } + foreach($sqla as $sqls) { + + if (!$sqls) continue; + + if ($print) { + print "<p>".htmlspecialchars($sqls)."</p>"; + flush(); + } + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($sqls); + $this->conn->LogSQL($savelog); + if ($rs && is_object($rs) && !$rs->EOF) { + rs2html($rs); + while ($rs->NextRecordSet()) { + print "<table width=98% bgcolor=#C0C0FF><tr><td>&nbsp;</td></tr></table>"; + rs2html($rs); + } + } else { + $e1 = (integer) $this->conn->ErrorNo(); + $e2 = $this->conn->ErrorMsg(); + if (($e1) || ($e2)) { + if (empty($e1)) $e1 = '-1'; // postgresql fix + print ' &nbsp; '.$e1.': '.$e2; + } else { + print "<p>No Recordset returned<br></p>"; + } + } + } // foreach + } + + function SplitSQL($sql) + { + $arr = explode(';',$sql); + return $arr; + } + + function undomq($m) + { + if (get_magic_quotes_gpc()) { + // undo the damage + $m = str_replace('\\\\','\\',$m); + $m = str_replace('\"','"',$m); + $m = str_replace('\\\'','\'',$m); + } + return $m; +} + + + /************************************************************************/ + + /** + * Reorganise multiple table-indices/statistics/.. + * OptimizeMode could be given by last Parameter + * + * @example + * <pre> + * optimizeTables( 'tableA'); + * </pre> + * <pre> + * optimizeTables( 'tableA', 'tableB', 'tableC'); + * </pre> + * <pre> + * optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW); + * </pre> + * + * @param string table name of the table to optimize + * @param int mode optimization-mode + * <code>ADODB_OPT_HIGH</code> for full optimization + * <code>ADODB_OPT_LOW</code> for CPU-less optimization + * Default is LOW <code>ADODB_OPT_LOW</code> + * @author Markus Staab + * @return Returns <code>true</code> on success and <code>false</code> on error + */ + function OptimizeTables() + { + $args = func_get_args(); + $numArgs = func_num_args(); + + if ( $numArgs == 0) return false; + + $mode = ADODB_OPT_LOW; + $lastArg = $args[ $numArgs - 1]; + if ( !is_string($lastArg)) { + $mode = $lastArg; + unset( $args[ $numArgs - 1]); + } + + foreach( $args as $table) { + $this->optimizeTable( $table, $mode); + } + } + + /** + * Reorganise the table-indices/statistics/.. depending on the given mode. + * Default Implementation throws an error. + * + * @param string table name of the table to optimize + * @param int mode optimization-mode + * <code>ADODB_OPT_HIGH</code> for full optimization + * <code>ADODB_OPT_LOW</code> for CPU-less optimization + * Default is LOW <code>ADODB_OPT_LOW</code> + * @author Markus Staab + * @return Returns <code>true</code> on success and <code>false</code> on error + */ + function OptimizeTable( $table, $mode = ADODB_OPT_LOW) + { + ADOConnection::outp( sprintf( "<p>%s: '%s' not implemented for driver '%s'</p>", __CLASS__, __FUNCTION__, $this->conn->databaseType)); + return false; + } + + /** + * Reorganise current database. + * Default implementation loops over all <code>MetaTables()</code> and + * optimize each using <code>optmizeTable()</code> + * + * @author Markus Staab + * @return Returns <code>true</code> on success and <code>false</code> on error + */ + function optimizeDatabase() + { + $conn = $this->conn; + if ( !$conn) return false; + + $tables = $conn->MetaTables( 'TABLES'); + if ( !$tables ) return false; + + foreach( $tables as $table) { + if ( !$this->optimizeTable( $table)) { + return false; + } + } + + return true; + } + // end hack +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-php4.inc.php b/pos/is4c-nf/lib/adodb5/adodb-php4.inc.php new file mode 100644 index 000000000..788d9ec30 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-php4.inc.php @@ -0,0 +1,16 @@ +<?php + +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4. +*/ + + +class ADODB_BASE_RS { +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-time.inc.php b/pos/is4c-nf/lib/adodb5/adodb-time.inc.php new file mode 100644 index 000000000..076389507 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-time.inc.php @@ -0,0 +1,1426 @@ +<?php +/** +ADOdb Date Library, part of the ADOdb abstraction library +Download: http://phplens.com/phpeverywhere/ + +PHP native date functions use integer timestamps for computations. +Because of this, dates are restricted to the years 1901-2038 on Unix +and 1970-2038 on Windows due to integer overflow for dates beyond +those years. This library overcomes these limitations by replacing the +native function's signed integers (normally 32-bits) with PHP floating +point numbers (normally 64-bits). + +Dates from 100 A.D. to 3000 A.D. and later +have been tested. The minimum is 100 A.D. as <100 will invoke the +2 => 4 digit year conversion. The maximum is billions of years in the +future, but this is a theoretical limit as the computation of that year +would take too long with the current implementation of adodb_mktime(). + +This library replaces native functions as follows: + +<pre> + getdate() with adodb_getdate() + date() with adodb_date() + gmdate() with adodb_gmdate() + mktime() with adodb_mktime() + gmmktime() with adodb_gmmktime() + strftime() with adodb_strftime() + strftime() with adodb_gmstrftime() +</pre> + +The parameters are identical, except that adodb_date() accepts a subset +of date()'s field formats. Mktime() will convert from local time to GMT, +and date() will convert from GMT to local time, but daylight savings is +not handled currently. + +This library is independant of the rest of ADOdb, and can be used +as standalone code. + +PERFORMANCE + +For high speed, this library uses the native date functions where +possible, and only switches to PHP code when the dates fall outside +the 32-bit signed integer range. + +GREGORIAN CORRECTION + +Pope Gregory shortened October of A.D. 1582 by ten days. Thursday, +October 4, 1582 (Julian) was followed immediately by Friday, October 15, +1582 (Gregorian). + +Since 0.06, we handle this correctly, so: + +adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582) + == 24 * 3600 (1 day) + +============================================================================= + +COPYRIGHT + +(c) 2003-2005 John Lim and released under BSD-style license except for code by +jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year +and originally found at http://www.php.net/manual/en/function.mktime.php + +============================================================================= + +BUG REPORTS + +These should be posted to the ADOdb forums at + + http://phplens.com/lens/lensforum/topics.php?id=4 + +============================================================================= + +FUNCTION DESCRIPTIONS + + +** FUNCTION adodb_getdate($date=false) + +Returns an array containing date information, as getdate(), but supports +dates greater than 1901 to 2038. The local date/time format is derived from a +heuristic the first time adodb_getdate is called. + + +** FUNCTION adodb_date($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. If $timestamp is not defined, the +current timestamp is used. Unlike the function date(), it supports dates +outside the 1901 to 2038 range. + +The format fields that adodb_date supports: + +<pre> + a - "am" or "pm" + A - "AM" or "PM" + d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" + D - day of the week, textual, 3 letters; e.g. "Fri" + F - month, textual, long; e.g. "January" + g - hour, 12-hour format without leading zeros; i.e. "1" to "12" + G - hour, 24-hour format without leading zeros; i.e. "0" to "23" + h - hour, 12-hour format; i.e. "01" to "12" + H - hour, 24-hour format; i.e. "00" to "23" + i - minutes; i.e. "00" to "59" + j - day of the month without leading zeros; i.e. "1" to "31" + l (lowercase 'L') - day of the week, textual, long; e.g. "Friday" + L - boolean for whether it is a leap year; i.e. "0" or "1" + m - month; i.e. "01" to "12" + M - month, textual, 3 letters; e.g. "Jan" + n - month without leading zeros; i.e. "1" to "12" + O - Difference to Greenwich time in hours; e.g. "+0200" + Q - Quarter, as in 1, 2, 3, 4 + r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" + s - seconds; i.e. "00" to "59" + S - English ordinal suffix for the day of the month, 2 characters; + i.e. "st", "nd", "rd" or "th" + t - number of days in the given month; i.e. "28" to "31" + T - Timezone setting of this machine; e.g. "EST" or "MDT" + U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) + w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday) + Y - year, 4 digits; e.g. "1999" + y - year, 2 digits; e.g. "99" + z - day of the year; i.e. "0" to "365" + Z - timezone offset in seconds (i.e. "-43200" to "43200"). + The offset for timezones west of UTC is always negative, + and for those east of UTC is always positive. +</pre> + +Unsupported: +<pre> + B - Swatch Internet time + I (capital i) - "1" if Daylight Savings Time, "0" otherwise. + W - ISO-8601 week number of year, weeks starting on Monday + +</pre> + + +** FUNCTION adodb_date2($fmt, $isoDateString = false) +Same as adodb_date, but 2nd parameter accepts iso date, eg. + + adodb_date2('d-M-Y H:i','2003-12-25 13:01:34'); + + +** FUNCTION adodb_gmdate($fmt, $timestamp = false) + +Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the +current timestamp is used. Unlike the function date(), it supports dates +outside the 1901 to 2038 range. + + +** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year]) + +Converts a local date to a unix timestamp. Unlike the function mktime(), it supports +dates outside the 1901 to 2038 range. All parameters are optional. + + +** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year]) + +Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports +dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters +are currently compulsory. + +** FUNCTION adodb_gmstrftime($fmt, $timestamp = false) +Convert a timestamp to a formatted GMT date. + +** FUNCTION adodb_strftime($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. Internally converts $fmt into +adodb_date format, then echo result. + +For best results, you can define the local date format yourself. Define a global +variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using +adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax. + + eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s'); + + Supported format codes: + +<pre> + %a - abbreviated weekday name according to the current locale + %A - full weekday name according to the current locale + %b - abbreviated month name according to the current locale + %B - full month name according to the current locale + %c - preferred date and time representation for the current locale + %d - day of the month as a decimal number (range 01 to 31) + %D - same as %m/%d/%y + %e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31') + %h - same as %b + %H - hour as a decimal number using a 24-hour clock (range 00 to 23) + %I - hour as a decimal number using a 12-hour clock (range 01 to 12) + %m - month as a decimal number (range 01 to 12) + %M - minute as a decimal number + %n - newline character + %p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale + %r - time in a.m. and p.m. notation + %R - time in 24 hour notation + %S - second as a decimal number + %t - tab character + %T - current time, equal to %H:%M:%S + %x - preferred date representation for the current locale without the time + %X - preferred time representation for the current locale without the date + %y - year as a decimal number without a century (range 00 to 99) + %Y - year as a decimal number including the century + %Z - time zone or name or abbreviation + %% - a literal `%' character +</pre> + + Unsupported codes: +<pre> + %C - century number (the year divided by 100 and truncated to an integer, range 00 to 99) + %g - like %G, but without the century. + %G - The 4-digit year corresponding to the ISO week number (see %V). + This has the same format and value as %Y, except that if the ISO week number belongs + to the previous or next year, that year is used instead. + %j - day of the year as a decimal number (range 001 to 366) + %u - weekday as a decimal number [1,7], with 1 representing Monday + %U - week number of the current year as a decimal number, starting + with the first Sunday as the first day of the first week + %V - The ISO 8601:1988 week number of the current year as a decimal number, + range 01 to 53, where week 1 is the first week that has at least 4 days in the + current year, and with Monday as the first day of the week. (Use %G or %g for + the year component that corresponds to the week number for the specified timestamp.) + %w - day of the week as a decimal, Sunday being 0 + %W - week number of the current year as a decimal number, starting with the + first Monday as the first day of the first week +</pre> + +============================================================================= + +NOTES + +Useful url for generating test timestamps: + http://www.4webhelp.net/us/timestamp.php + +Possible future optimizations include + +a. Using an algorithm similar to Plauger's in "The Standard C Library" +(page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not +work outside 32-bit signed range, so i decided not to implement it. + +b. Implement daylight savings, which looks awfully complicated, see + http://webexhibits.org/daylightsaving/ + + +CHANGELOG + +- 11 Feb 2008 0.33 +* Bug in 0.32 fix for hour handling. Fixed. + +- 1 Feb 2008 0.32 +* Now adodb_mktime(0,0,0,12+$m,20,2040) works properly. + +- 10 Jan 2008 0.31 +* Now adodb_mktime(0,0,0,24,1,2037) works correctly. + +- 15 July 2007 0.30 +Added PHP 5.2.0 compatability fixes. + * gmtime behaviour for 1970 has changed. We use the actual date if it is between 1970 to 2038 to get the + * timezone, otherwise we use the current year as the baseline to retrieve the timezone. + * Also the timezone's in php 5.2.* support historical data better, eg. if timezone today was +8, but + in 1970 it was +7:30, then php 5.2 return +7:30, while this library will use +8. + * + +- 19 March 2006 0.24 +Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used. + +- 10 Feb 2006 0.23 +PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000. + In PHP4, we will still use -0000 for 100% compat with PHP4. + +- 08 Sept 2005 0.22 +In adodb_date2(), $is_gmt not supported properly. Fixed. + +- 18 July 2005 0.21 +In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat. +Added support for negative months in adodb_mktime(). + +- 24 Feb 2005 0.20 +Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date(). + +- 21 Dec 2004 0.17 +In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false. +Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro. + +- 17 Nov 2004 0.16 +Removed intval typecast in adodb_mktime() for secs, allowing: + adodb_mktime(0,0,0 + 2236672153,1,1,1934); +Suggested by Ryan. + +- 18 July 2004 0.15 +All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory. +This brings it more in line with mktime (still not identical). + +- 23 June 2004 0.14 + +Allow you to define your own daylights savings function, adodb_daylight_sv. +If the function is defined (somewhere in an include), then you can correct for daylights savings. + +In this example, we apply daylights savings in June or July, adding one hour. This is extremely +unrealistic as it does not take into account time-zone, geographic location, current year. + +function adodb_daylight_sv(&$arr, $is_gmt) +{ + if ($is_gmt) return; + $m = $arr['mon']; + if ($m == 6 || $m == 7) $arr['hours'] += 1; +} + +This is only called by adodb_date() and not by adodb_mktime(). + +The format of $arr is +Array ( + [seconds] => 0 + [minutes] => 0 + [hours] => 0 + [mday] => 1 # day of month, eg 1st day of the month + [mon] => 2 # month (eg. Feb) + [year] => 2102 + [yday] => 31 # days in current year + [leap] => # true if leap year + [ndays] => 28 # no of days in current month + ) + + +- 28 Apr 2004 0.13 +Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov. + +- 20 Mar 2004 0.12 +Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32. + +- 26 Oct 2003 0.11 +Because of daylight savings problems (some systems apply daylight savings to +January!!!), changed adodb_get_gmt_diff() to ignore daylight savings. + +- 9 Aug 2003 0.10 +Fixed bug with dates after 2038. +See http://phplens.com/lens/lensforum/msgs.php?id=6980 + +- 1 July 2003 0.09 +Added support for Q (Quarter). +Added adodb_date2(), which accepts ISO date in 2nd param + +- 3 March 2003 0.08 +Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS +if you want PHP to handle negative timestamps between 1901 to 1969. + +- 27 Feb 2003 0.07 +All negative numbers handled by adodb now because of RH 7.3+ problems. +See http://bugs.php.net/bug.php?id=20048&edit=2 + +- 4 Feb 2003 0.06 +Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates +are now correctly handled. + +- 29 Jan 2003 0.05 + +Leap year checking differs under Julian calendar (pre 1582). Also +leap year code optimized by checking for most common case first. + +We also handle month overflow correctly in mktime (eg month set to 13). + +Day overflow for less than one month's days is supported. + +- 28 Jan 2003 0.04 + +Gregorian correction handled. In PHP5, we might throw an error if +mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10. +Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582. + +- 27 Jan 2003 0.03 + +Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION. +Fixed calculation of days since start of year for <1970. + +- 27 Jan 2003 0.02 + +Changed _adodb_getdate() to inline leap year checking for better performance. +Fixed problem with time-zones west of GMT +0000. + +- 24 Jan 2003 0.01 + +First implementation. +*/ + + +/* Initialization */ + +/* + Version Number +*/ +define('ADODB_DATE_VERSION',0.33); + +$ADODB_DATETIME_CLASS = (PHP_VERSION >= 5.2); + +/* + This code was originally for windows. But apparently this problem happens + also with Linux, RH 7.3 and later! + + glibc-2.2.5-34 and greater has been changed to return -1 for dates < + 1970. This used to work. The problem exists with RedHat 7.3 and 8.0 + echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1 + + References: + http://bugs.php.net/bug.php?id=20048&edit=2 + http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html +*/ + +if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1); + +function adodb_date_test_date($y1,$m,$d=13) +{ + $h = round(rand()% 24); + $t = adodb_mktime($h,0,0,$m,$d,$y1); + $rez = adodb_date('Y-n-j H:i:s',$t); + if ($h == 0) $h = '00'; + else if ($h < 10) $h = '0'.$h; + if ("$y1-$m-$d $h:00:00" != $rez) { + print "<b>$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez</b><br>"; + return false; + } + return true; +} + +function adodb_date_test_strftime($fmt) +{ + $s1 = strftime($fmt); + $s2 = adodb_strftime($fmt); + + if ($s1 == $s2) return true; + + echo "error for $fmt, strftime=$s1, adodb=$s2<br>"; + return false; +} + +/** + Test Suite +*/ +function adodb_date_test() +{ + + for ($m=-24; $m<=24; $m++) + echo "$m :",adodb_date('d-m-Y',adodb_mktime(0,0,0,1+$m,20,2040)),"<br>"; + + error_reporting(E_ALL); + print "<h4>Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."</h4>"; + @set_time_limit(0); + $fail = false; + + // This flag disables calling of PHP native functions, so we can properly test the code + if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1); + + $t = time(); + + + $fmt = 'Y-m-d H:i:s'; + echo '<pre>'; + echo 'adodb: ',adodb_date($fmt,$t),'<br>'; + echo 'php : ',date($fmt,$t),'<br>'; + echo '</pre>'; + + adodb_date_test_strftime('%Y %m %x %X'); + adodb_date_test_strftime("%A %d %B %Y"); + adodb_date_test_strftime("%H %M S"); + + $t = adodb_mktime(0,0,0); + if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'<br>'; + + $t = adodb_mktime(0,0,0,6,1,2102); + if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>'; + + $t = adodb_mktime(0,0,0,2,1,2102); + if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>'; + + + print "<p>Testing gregorian <=> julian conversion<p>"; + $t = adodb_mktime(0,0,0,10,11,1492); + //http://www.holidayorigins.com/html/columbus_day.html - Friday check + if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing<br>'; + + $t = adodb_mktime(0,0,0,2,29,1500); + if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years<br>'; + + $t = adodb_mktime(0,0,0,2,29,1700); + if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years<br>'; + + print adodb_mktime(0,0,0,10,4,1582).' '; + print adodb_mktime(0,0,0,10,15,1582); + $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)); + if ($diff != 3600*24) print " <b>Error in gregorian correction = ".($diff/3600/24)." days </b><br>"; + + print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : '<b>Error</b>')."<br>"; + print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : '<b>Error</b>')."<br>"; + + print "<p>Testing overflow<p>"; + + $t = adodb_mktime(0,0,0,3,33,1965); + if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1 <br>'; + $t = adodb_mktime(0,0,0,4,33,1971); + if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2 <br>'; + $t = adodb_mktime(0,0,0,1,60,1965); + if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).' <br>'; + $t = adodb_mktime(0,0,0,12,32,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).' <br>'; + $t = adodb_mktime(0,0,0,12,63,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).' <br>'; + $t = adodb_mktime(0,0,0,13,3,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1 <br>'; + + print "Testing 2-digit => 4-digit year conversion<p>"; + if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000<br>"; + if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010<br>"; + if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020<br>"; + if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030<br>"; + if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940<br>"; + if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950<br>"; + if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990<br>"; + + // Test string formating + print "<p>Testing date formating</p>"; + + $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003'; + $s1 = date($fmt,0); + $s2 = adodb_date($fmt,0); + if ($s1 != $s2) { + print " date() 0 failed<br>$s1<br>$s2<br>"; + } + flush(); + for ($i=100; --$i > 0; ) { + + $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000); + $s1 = date($fmt,$ts); + $s2 = adodb_date($fmt,$ts); + //print "$s1 <br>$s2 <p>"; + $pos = strcmp($s1,$s2); + + if (($s1) != ($s2)) { + for ($j=0,$k=strlen($s1); $j < $k; $j++) { + if ($s1[$j] != $s2[$j]) { + print substr($s1,$j).' '; + break; + } + } + print "<b>Error date(): $ts<br><pre> +&nbsp; \"$s1\" (date len=".strlen($s1).") +&nbsp; \"$s2\" (adodb_date len=".strlen($s2).")</b></pre><br>"; + $fail = true; + } + + $a1 = getdate($ts); + $a2 = adodb_getdate($ts); + $rez = array_diff($a1,$a2); + if (sizeof($rez)>0) { + print "<b>Error getdate() $ts</b><br>"; + print_r($a1); + print "<br>"; + print_r($a2); + print "<p>"; + $fail = true; + } + } + + // Test generation of dates outside 1901-2038 + print "<p>Testing random dates between 100 and 4000</p>"; + adodb_date_test_date(100,1); + for ($i=100; --$i >= 0;) { + $y1 = 100+rand(0,1970-100); + $m = rand(1,12); + adodb_date_test_date($y1,$m); + + $y1 = 3000-rand(0,3000-1970); + adodb_date_test_date($y1,$m); + } + print '<p>'; + $start = 1960+rand(0,10); + $yrs = 12; + $i = 365.25*86400*($start-1970); + $offset = 36000+rand(10000,60000); + $max = 365*$yrs*86400; + $lastyear = 0; + + // we generate a timestamp, convert it to a date, and convert it back to a timestamp + // and check if the roundtrip broke the original timestamp value. + print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: "; + $cnt = 0; + for ($max += $i; $i < $max; $i += $offset) { + $ret = adodb_date('m,d,Y,H,i,s',$i); + $arr = explode(',',$ret); + if ($lastyear != $arr[2]) { + $lastyear = $arr[2]; + print " $lastyear "; + flush(); + } + $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]); + if ($i != $newi) { + print "Error at $i, adodb_mktime returned $newi ($ret)"; + $fail = true; + break; + } + $cnt += 1; + } + echo "Tested $cnt dates<br>"; + if (!$fail) print "<p>Passed !</p>"; + else print "<p><b>Failed</b> :-(</p>"; +} + +/** + Returns day of week, 0 = Sunday,... 6=Saturday. + Algorithm from PEAR::Date_Calc +*/ +function adodb_dow($year, $month, $day) +{ +/* +Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and +proclaimed that from that time onwards 3 days would be dropped from the calendar +every 400 years. + +Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian). +*/ + if ($year <= 1582) { + if ($year < 1582 || + ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3; + else + $greg_correction = 0; + } else + $greg_correction = 0; + + if($month > 2) + $month -= 2; + else { + $month += 10; + $year--; + } + + $day = floor((13 * $month - 1) / 5) + + $day + ($year % 100) + + floor(($year % 100) / 4) + + floor(($year / 100) / 4) - 2 * + floor($year / 100) + 77 + $greg_correction; + + return $day - 7 * floor($day / 7); +} + + +/** + Checks for leap year, returns true if it is. No 2-digit year check. Also + handles julian calendar correctly. +*/ +function _adodb_is_leap_year($year) +{ + if ($year % 4 != 0) return false; + + if ($year % 400 == 0) { + return true; + // if gregorian calendar (>1582), century not-divisible by 400 is not leap + } else if ($year > 1582 && $year % 100 == 0 ) { + return false; + } + + return true; +} + + +/** + checks for leap year, returns true if it is. Has 2-digit year check +*/ +function adodb_is_leap_year($year) +{ + return _adodb_is_leap_year(adodb_year_digit_check($year)); +} + +/** + Fix 2-digit years. Works for any century. + Assumes that if 2-digit is more than 30 years in future, then previous century. +*/ +function adodb_year_digit_check($y) +{ + if ($y < 100) { + + $yr = (integer) date("Y"); + $century = (integer) ($yr /100); + + if ($yr%100 > 50) { + $c1 = $century + 1; + $c0 = $century; + } else { + $c1 = $century; + $c0 = $century - 1; + } + $c1 *= 100; + // if 2-digit year is less than 30 years in future, set it to this century + // otherwise if more than 30 years in future, then we set 2-digit year to the prev century. + if (($y + $c1) < $yr+30) $y = $y + $c1; + else $y = $y + $c0*100; + } + return $y; +} + +function adodb_get_gmt_diff_ts($ts) +{ + if (0 <= $ts && $ts <= 0x7FFFFFFF) { // check if number in 32-bit signed range) { + $arr = getdate($ts); + $y = $arr['year']; + $m = $arr['mon']; + $d = $arr['mday']; + return adodb_get_gmt_diff($y,$m,$d); + } else { + return adodb_get_gmt_diff(false,false,false); + } + +} + +/** + get local time zone offset from GMT. Does not handle historical timezones before 1970. +*/ +function adodb_get_gmt_diff($y,$m,$d) +{ +static $TZ,$tzo; +global $ADODB_DATETIME_CLASS; + + if (!defined('ADODB_TEST_DATES')) $y = false; + else if ($y < 1970 || $y >= 2038) $y = false; + + if ($ADODB_DATETIME_CLASS && $y !== false) { + $dt = new DateTime(); + $dt->setISODate($y,$m,$d); + if (empty($tzo)) { + $tzo = new DateTimeZone(date_default_timezone_get()); + # $tzt = timezone_transitions_get( $tzo ); + } + return -$tzo->getOffset($dt); + } else { + if (isset($TZ)) return $TZ; + $y = date('Y'); + $TZ = mktime(0,0,0,12,2,$y,0) - gmmktime(0,0,0,12,2,$y,0); + } + + return $TZ; +} + +/** + Returns an array with date info. +*/ +function adodb_getdate($d=false,$fast=false) +{ + if ($d === false) return getdate(); + if (!defined('ADODB_TEST_DATES')) { + if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer + return @getdate($d); + } + } + return _adodb_getdate($d); +} + +/* +// generate $YRS table for _adodb_getdate() +function adodb_date_gentable($out=true) +{ + + for ($i=1970; $i >= 1600; $i-=10) { + $s = adodb_gmmktime(0,0,0,1,1,$i); + echo "$i => $s,<br>"; + } +} +adodb_date_gentable(); + +for ($i=1970; $i > 1500; $i--) { + +echo "<hr />$i "; + adodb_date_test_date($i,1,1); +} + +*/ + + +$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); +$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + +function adodb_validdate($y,$m,$d) +{ +global $_month_table_normal,$_month_table_leaf; + + if (_adodb_is_leap_year($y)) $marr = $_month_table_leaf; + else $marr = $_month_table_normal; + + if ($m > 12 || $m < 1) return false; + + if ($d > 31 || $d < 1) return false; + + if ($marr[$m] < $d) return false; + + if ($y < 1000 && $y > 3000) return false; + + return true; +} + +/** + Low-level function that returns the getdate() array. We have a special + $fast flag, which if set to true, will return fewer array values, + and is much faster as it does not calculate dow, etc. +*/ +function _adodb_getdate($origd=false,$fast=false,$is_gmt=false) +{ +static $YRS; +global $_month_table_normal,$_month_table_leaf; + + $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff_ts($origd)); + $_day_power = 86400; + $_hour_power = 3600; + $_min_power = 60; + + if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction + + $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); + $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + + $d366 = $_day_power * 366; + $d365 = $_day_power * 365; + + if ($d < 0) { + + if (empty($YRS)) $YRS = array( + 1970 => 0, + 1960 => -315619200, + 1950 => -631152000, + 1940 => -946771200, + 1930 => -1262304000, + 1920 => -1577923200, + 1910 => -1893456000, + 1900 => -2208988800, + 1890 => -2524521600, + 1880 => -2840140800, + 1870 => -3155673600, + 1860 => -3471292800, + 1850 => -3786825600, + 1840 => -4102444800, + 1830 => -4417977600, + 1820 => -4733596800, + 1810 => -5049129600, + 1800 => -5364662400, + 1790 => -5680195200, + 1780 => -5995814400, + 1770 => -6311347200, + 1760 => -6626966400, + 1750 => -6942499200, + 1740 => -7258118400, + 1730 => -7573651200, + 1720 => -7889270400, + 1710 => -8204803200, + 1700 => -8520336000, + 1690 => -8835868800, + 1680 => -9151488000, + 1670 => -9467020800, + 1660 => -9782640000, + 1650 => -10098172800, + 1640 => -10413792000, + 1630 => -10729324800, + 1620 => -11044944000, + 1610 => -11360476800, + 1600 => -11676096000); + + if ($is_gmt) $origd = $d; + // The valid range of a 32bit signed timestamp is typically from + // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT + // + + # old algorithm iterates through all years. new algorithm does it in + # 10 year blocks + + /* + # old algo + for ($a = 1970 ; --$a >= 0;) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d += $d366; + else $d += $d365; + + if ($d >= 0) { + $year = $a; + break; + } + } + */ + + $lastsecs = 0; + $lastyear = 1970; + foreach($YRS as $year => $secs) { + if ($d >= $secs) { + $a = $lastyear; + break; + } + $lastsecs = $secs; + $lastyear = $year; + } + + $d -= $lastsecs; + if (!isset($a)) $a = $lastyear; + + //echo ' yr=',$a,' ', $d,'.'; + + for (; --$a >= 0;) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d += $d366; + else $d += $d365; + + if ($d >= 0) { + $year = $a; + break; + } + } + /**/ + + $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd; + + $d = $lastd; + $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; + for ($a = 13 ; --$a > 0;) { + $lastd = $d; + $d += $mtab[$a] * $_day_power; + if ($d >= 0) { + $month = $a; + $ndays = $mtab[$a]; + break; + } + } + + $d = $lastd; + $day = $ndays + ceil(($d+1) / ($_day_power)); + + $d += ($ndays - $day+1)* $_day_power; + $hour = floor($d/$_hour_power); + + } else { + for ($a = 1970 ;; $a++) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d -= $d366; + else $d -= $d365; + if ($d < 0) { + $year = $a; + break; + } + } + $secsInYear = $lastd; + $d = $lastd; + $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; + for ($a = 1 ; $a <= 12; $a++) { + $lastd = $d; + $d -= $mtab[$a] * $_day_power; + if ($d < 0) { + $month = $a; + $ndays = $mtab[$a]; + break; + } + } + $d = $lastd; + $day = ceil(($d+1) / $_day_power); + $d = $d - ($day-1) * $_day_power; + $hour = floor($d /$_hour_power); + } + + $d -= $hour * $_hour_power; + $min = floor($d/$_min_power); + $secs = $d - $min * $_min_power; + if ($fast) { + return array( + 'seconds' => $secs, + 'minutes' => $min, + 'hours' => $hour, + 'mday' => $day, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secsInYear/$_day_power), + 'leap' => $leaf, + 'ndays' => $ndays + ); + } + + + $dow = adodb_dow($year,$month,$day); + + return array( + 'seconds' => $secs, + 'minutes' => $min, + 'hours' => $hour, + 'mday' => $day, + 'wday' => $dow, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secsInYear/$_day_power), + 'weekday' => gmdate('l',$_day_power*(3+$dow)), + 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)), + 0 => $origd + ); +} +/* + if ($isphp5) + $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36); + else + $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36); + break;*/ +function adodb_tz_offset($gmt,$isphp5) +{ + $zhrs = abs($gmt)/3600; + $hrs = floor($zhrs); + if ($isphp5) + return sprintf('%s%02d%02d',($gmt<=0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); + else + return sprintf('%s%02d%02d',($gmt<0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); +} + + +function adodb_gmdate($fmt,$d=false) +{ + return adodb_date($fmt,$d,true); +} + +// accepts unix timestamp and iso date format in $d +function adodb_date2($fmt, $d=false, $is_gmt=false) +{ + if ($d !== false) { + if (!preg_match( + "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", + ($d), $rr)) return adodb_date($fmt,false,$is_gmt); + + if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt); + + // h-m-s-MM-DD-YY + if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt); + else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt); + } + + return adodb_date($fmt,$d,$is_gmt); +} + + +/** + Return formatted date based on timestamp $d +*/ +function adodb_date($fmt,$d=false,$is_gmt=false) +{ +static $daylight; +global $ADODB_DATETIME_CLASS; + + if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt); + if (!defined('ADODB_TEST_DATES')) { + if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer + return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d); + + } + } + $_day_power = 86400; + + $arr = _adodb_getdate($d,true,$is_gmt); + + if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv'); + if ($daylight) adodb_daylight_sv($arr, $is_gmt); + + $year = $arr['year']; + $month = $arr['mon']; + $day = $arr['mday']; + $hour = $arr['hours']; + $min = $arr['minutes']; + $secs = $arr['seconds']; + + $max = strlen($fmt); + $dates = ''; + + $isphp5 = PHP_VERSION >= 5; + + /* + at this point, we have the following integer vars to manipulate: + $year, $month, $day, $hour, $min, $secs + */ + for ($i=0; $i < $max; $i++) { + switch($fmt[$i]) { + case 'T': + if ($ADODB_DATETIME_CLASS) { + $dt = new DateTime(); + $dt->SetDate($year,$month,$day); + $dates .= $dt->Format('T'); + } else + $dates .= date('T'); + break; + // YEAR + case 'L': $dates .= $arr['leap'] ? '1' : '0'; break; + case 'r': // Thu, 21 Dec 2000 16:01:07 +0200 + + // 4.3.11 uses '04 Jun 2004' + // 4.3.8 uses ' 4 Jun 2004' + $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', ' + . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' '; + + if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour; + + if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min; + + if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs; + + $gmt = adodb_get_gmt_diff($year,$month,$day); + + $dates .= ' '.adodb_tz_offset($gmt,$isphp5); + break; + + case 'Y': $dates .= $year; break; + case 'y': $dates .= substr($year,strlen($year)-2,2); break; + // MONTH + case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break; + case 'Q': $dates .= ($month+3)>>2; break; + case 'n': $dates .= $month; break; + case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break; + case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break; + // DAY + case 't': $dates .= $arr['ndays']; break; + case 'z': $dates .= $arr['yday']; break; + case 'w': $dates .= adodb_dow($year,$month,$day); break; + case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break; + case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break; + case 'j': $dates .= $day; break; + case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break; + case 'S': + $d10 = $day % 10; + if ($d10 == 1) $dates .= 'st'; + else if ($d10 == 2 && $day != 12) $dates .= 'nd'; + else if ($d10 == 3) $dates .= 'rd'; + else $dates .= 'th'; + break; + + // HOUR + case 'Z': + $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff($year,$month,$day); break; + case 'O': + $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$month,$day); + + $dates .= adodb_tz_offset($gmt,$isphp5); + break; + + case 'H': + if ($hour < 10) $dates .= '0'.$hour; + else $dates .= $hour; + break; + case 'h': + if ($hour > 12) $hh = $hour - 12; + else { + if ($hour == 0) $hh = '12'; + else $hh = $hour; + } + + if ($hh < 10) $dates .= '0'.$hh; + else $dates .= $hh; + break; + + case 'G': + $dates .= $hour; + break; + + case 'g': + if ($hour > 12) $hh = $hour - 12; + else { + if ($hour == 0) $hh = '12'; + else $hh = $hour; + } + $dates .= $hh; + break; + // MINUTES + case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break; + // SECONDS + case 'U': $dates .= $d; break; + case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break; + // AM/PM + // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM + case 'a': + if ($hour>=12) $dates .= 'pm'; + else $dates .= 'am'; + break; + case 'A': + if ($hour>=12) $dates .= 'PM'; + else $dates .= 'AM'; + break; + default: + $dates .= $fmt[$i]; break; + // ESCAPE + case "\\": + $i++; + if ($i < $max) $dates .= $fmt[$i]; + break; + } + } + return $dates; +} + +/** + Returns a timestamp given a GMT/UTC time. + Note that $is_dst is not implemented and is ignored. +*/ +function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false) +{ + return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true); +} + +/** + Return a timestamp given a local time. Originally by jackbbs. + Note that $is_dst is not implemented and is ignored. + + Not a very fast algorithm - O(n) operation. Could be optimized to O(1). +*/ +function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false) +{ + if (!defined('ADODB_TEST_DATES')) { + + if ($mon === false) { + return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec); + } + + // for windows, we don't check 1970 because with timezone differences, + // 1 Jan 1970 could generate negative timestamp, which is illegal + $usephpfns = (1970 < $year && $year < 2038 + || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038) + ); + + + if ($usephpfns && ($year + $mon/12+$day/365.25+$hr/(24*365.25) >= 2038)) $usephpfns = false; + + if ($usephpfns) { + return $is_gmt ? + @gmmktime($hr,$min,$sec,$mon,$day,$year): + @mktime($hr,$min,$sec,$mon,$day,$year); + } + } + + $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$mon,$day); + + /* + # disabled because some people place large values in $sec. + # however we need it for $mon because we use an array... + $hr = intval($hr); + $min = intval($min); + $sec = intval($sec); + */ + $mon = intval($mon); + $day = intval($day); + $year = intval($year); + + + $year = adodb_year_digit_check($year); + + if ($mon > 12) { + $y = floor(($mon-1)/ 12); + $year += $y; + $mon -= $y*12; + } else if ($mon < 1) { + $y = ceil((1-$mon) / 12); + $year -= $y; + $mon += $y*12; + } + + $_day_power = 86400; + $_hour_power = 3600; + $_min_power = 60; + + $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); + $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + + $_total_date = 0; + if ($year >= 1970) { + for ($a = 1970 ; $a <= $year; $a++) { + $leaf = _adodb_is_leap_year($a); + if ($leaf == true) { + $loop_table = $_month_table_leaf; + $_add_date = 366; + } else { + $loop_table = $_month_table_normal; + $_add_date = 365; + } + if ($a < $year) { + $_total_date += $_add_date; + } else { + for($b=1;$b<$mon;$b++) { + $_total_date += $loop_table[$b]; + } + } + } + $_total_date +=$day-1; + $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different; + + } else { + for ($a = 1969 ; $a >= $year; $a--) { + $leaf = _adodb_is_leap_year($a); + if ($leaf == true) { + $loop_table = $_month_table_leaf; + $_add_date = 366; + } else { + $loop_table = $_month_table_normal; + $_add_date = 365; + } + if ($a > $year) { $_total_date += $_add_date; + } else { + for($b=12;$b>$mon;$b--) { + $_total_date += $loop_table[$b]; + } + } + } + $_total_date += $loop_table[$mon] - $day; + + $_day_time = $hr * $_hour_power + $min * $_min_power + $sec; + $_day_time = $_day_power - $_day_time; + $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different); + if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction + else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582. + } + //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret; + return $ret; +} + +function adodb_gmstrftime($fmt, $ts=false) +{ + return adodb_strftime($fmt,$ts,true); +} + +// hack - convert to adodb_date +function adodb_strftime($fmt, $ts=false,$is_gmt=false) +{ +global $ADODB_DATE_LOCALE; + + if (!defined('ADODB_TEST_DATES')) { + if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer + return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts); + + } + } + + if (empty($ADODB_DATE_LOCALE)) { + /* + $tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am + $sep = substr($tstr,2,1); + $hasAM = strrpos($tstr,'M') !== false; + */ + # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24 + $dstr = gmstrftime('%x',31366800); // 30 Dec 1970, 1 am + $sep = substr($dstr,2,1); + $tstr = strtoupper(gmstrftime('%X',31366800)); // 30 Dec 1970, 1 am + $hasAM = strrpos($tstr,'M') !== false; + + $ADODB_DATE_LOCALE = array(); + $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y'; + $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s'; + + } + $inpct = false; + $fmtdate = ''; + for ($i=0,$max = strlen($fmt); $i < $max; $i++) { + $ch = $fmt[$i]; + if ($ch == '%') { + if ($inpct) { + $fmtdate .= '%'; + $inpct = false; + } else + $inpct = true; + } else if ($inpct) { + + $inpct = false; + switch($ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'E': + case 'O': + /* ignore format modifiers */ + $inpct = true; + break; + + case 'a': $fmtdate .= 'D'; break; + case 'A': $fmtdate .= 'l'; break; + case 'h': + case 'b': $fmtdate .= 'M'; break; + case 'B': $fmtdate .= 'F'; break; + case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break; + case 'C': $fmtdate .= '\C?'; break; // century + case 'd': $fmtdate .= 'd'; break; + case 'D': $fmtdate .= 'm/d/y'; break; + case 'e': $fmtdate .= 'j'; break; + case 'g': $fmtdate .= '\g?'; break; //? + case 'G': $fmtdate .= '\G?'; break; //? + case 'H': $fmtdate .= 'H'; break; + case 'I': $fmtdate .= 'h'; break; + case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd + case 'm': $fmtdate .= 'm'; break; + case 'M': $fmtdate .= 'i'; break; + case 'n': $fmtdate .= "\n"; break; + case 'p': $fmtdate .= 'a'; break; + case 'r': $fmtdate .= 'h:i:s a'; break; + case 'R': $fmtdate .= 'H:i:s'; break; + case 'S': $fmtdate .= 's'; break; + case 't': $fmtdate .= "\t"; break; + case 'T': $fmtdate .= 'H:i:s'; break; + case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break; + case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break; + case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'y': $fmtdate .= 'y'; break; + case 'Y': $fmtdate .= 'Y'; break; + case 'Z': $fmtdate .= 'T'; break; + } + } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' )) + $fmtdate .= "\\".$ch; + else + $fmtdate .= $ch; + } + //echo "fmt=",$fmtdate,"<br>"; + if ($ts === false) $ts = time(); + $ret = adodb_date($fmtdate, $ts, $is_gmt); + return $ret; +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-xmlschema.inc.php b/pos/is4c-nf/lib/adodb5/adodb-xmlschema.inc.php new file mode 100644 index 000000000..b2f0ddc5c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-xmlschema.inc.php @@ -0,0 +1,2223 @@ +<?php +// Copyright (c) 2004 ars Cognita Inc., all rights reserved +/* ****************************************************************************** + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +*******************************************************************************/ +/** + * xmlschema is a class that allows the user to quickly and easily + * build a database on any ADOdb-supported platform using a simple + * XML schema. + * + * Last Editor: $Author: jlim $ + * @author Richard Tango-Lowy & Dan Cech + * @version $Revision: 1.12 $ + * + * @package axmls + * @tutorial getting_started.pkg + */ + +function _file_get_contents($file) +{ + if (function_exists('file_get_contents')) return file_get_contents($file); + + $f = fopen($file,'r'); + if (!$f) return ''; + $t = ''; + + while ($s = fread($f,100000)) $t .= $s; + fclose($f); + return $t; +} + + +/** +* Debug on or off +*/ +if( !defined( 'XMLS_DEBUG' ) ) { + define( 'XMLS_DEBUG', FALSE ); +} + +/** +* Default prefix key +*/ +if( !defined( 'XMLS_PREFIX' ) ) { + define( 'XMLS_PREFIX', '%%P' ); +} + +/** +* Maximum length allowed for object prefix +*/ +if( !defined( 'XMLS_PREFIX_MAXLEN' ) ) { + define( 'XMLS_PREFIX_MAXLEN', 10 ); +} + +/** +* Execute SQL inline as it is generated +*/ +if( !defined( 'XMLS_EXECUTE_INLINE' ) ) { + define( 'XMLS_EXECUTE_INLINE', FALSE ); +} + +/** +* Continue SQL Execution if an error occurs? +*/ +if( !defined( 'XMLS_CONTINUE_ON_ERROR' ) ) { + define( 'XMLS_CONTINUE_ON_ERROR', FALSE ); +} + +/** +* Current Schema Version +*/ +if( !defined( 'XMLS_SCHEMA_VERSION' ) ) { + define( 'XMLS_SCHEMA_VERSION', '0.2' ); +} + +/** +* Default Schema Version. Used for Schemas without an explicit version set. +*/ +if( !defined( 'XMLS_DEFAULT_SCHEMA_VERSION' ) ) { + define( 'XMLS_DEFAULT_SCHEMA_VERSION', '0.1' ); +} + +/** +* Default Schema Version. Used for Schemas without an explicit version set. +*/ +if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) { + define( 'XMLS_DEFAULT_UPGRADE_METHOD', 'ALTER' ); +} + +/** +* Include the main ADODB library +*/ +if( !defined( '_ADODB_LAYER' ) ) { + require( 'adodb.inc.php' ); + require( 'adodb-datadict.inc.php' ); +} + +/** +* Abstract DB Object. This class provides basic methods for database objects, such +* as tables and indexes. +* +* @package axmls +* @access private +*/ +class dbObject { + + /** + * var object Parent + */ + var $parent; + + /** + * var string current element + */ + var $currentElement; + + /** + * NOP + */ + function dbObject( &$parent, $attributes = NULL ) { + $this->parent = $parent; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + + } + + function create() { + return array(); + } + + /** + * Destroys the object + */ + function destroy() { + unset( $this ); + } + + /** + * Checks whether the specified RDBMS is supported by the current + * database object or its ranking ancestor. + * + * @param string $platform RDBMS platform name (from ADODB platform list). + * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE. + */ + function supportedPlatform( $platform = NULL ) { + return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE; + } + + /** + * Returns the prefix set by the ranking ancestor of the database object. + * + * @param string $name Prefix string. + * @return string Prefix. + */ + function prefix( $name = '' ) { + return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name; + } + + /** + * Extracts a field ID from the specified field. + * + * @param string $field Field. + * @return string Field ID. + */ + function FieldID( $field ) { + return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) ); + } +} + +/** +* Creates a table object in ADOdb's datadict format +* +* This class stores information about a database table. As charactaristics +* of the table are loaded from the external source, methods and properties +* of this class are used to build up the table description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbTable extends dbObject { + + /** + * @var string Table name + */ + var $name; + + /** + * @var array Field specifier: Meta-information about each field + */ + var $fields = array(); + + /** + * @var array List of table indexes. + */ + var $indexes = array(); + + /** + * @var array Table options: Table-level options + */ + var $opts = array(); + + /** + * @var string Field index: Keeps track of which field is currently being processed + */ + var $current_field; + + /** + * @var boolean Mark table for destruction + * @access private + */ + var $drop_table; + + /** + * @var boolean Mark field for destruction (not yet implemented) + * @access private + */ + var $drop_field = array(); + + /** + * Iniitializes a new table object. + * + * @param string $prefix DB Object prefix + * @param array $attributes Array of table attributes. + */ + function dbTable( &$parent, $attributes = NULL ) { + $this->parent = $parent; + $this->name = $this->prefix($attributes['NAME']); + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'INDEX': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addIndex( $attributes ) ); + } + break; + case 'DATA': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addData( $attributes ) ); + } + break; + case 'DROP': + $this->drop(); + break; + case 'FIELD': + // Add a field + $fieldName = $attributes['NAME']; + $fieldType = $attributes['TYPE']; + $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL; + $fieldOpts = isset( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL; + + $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts ); + break; + case 'KEY': + case 'NOTNULL': + case 'AUTOINCREMENT': + // Add a field option + $this->addFieldOpt( $this->current_field, $this->currentElement ); + break; + case 'DEFAULT': + // Add a field option to the table object + + // Work around ADOdb datadict issue that misinterprets empty strings. + if( $attributes['VALUE'] == '' ) { + $attributes['VALUE'] = " '' "; + } + + $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); + break; + case 'DEFDATE': + case 'DEFTIMESTAMP': + // Add a field option to the table object + $this->addFieldOpt( $this->current_field, $this->currentElement ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Table constraint + case 'CONSTRAINT': + if( isset( $this->current_field ) ) { + $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata ); + } else { + $this->addTableOpt( $cdata ); + } + break; + // Table option + case 'OPT': + $this->addTableOpt( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'TABLE': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + case 'FIELD': + unset($this->current_field); + break; + + } + } + + /** + * Adds an index to a table object + * + * @param array $attributes Index attributes + * @return object dbIndex object + */ + function addIndex( $attributes ) { + $name = strtoupper( $attributes['NAME'] ); + $this->indexes[$name] = new dbIndex( $this, $attributes ); + return $this->indexes[$name]; + } + + /** + * Adds data to a table object + * + * @param array $attributes Data attributes + * @return object dbData object + */ + function addData( $attributes ) { + if( !isset( $this->data ) ) { + $this->data = new dbData( $this, $attributes ); + } + return $this->data; + } + + /** + * Adds a field to a table object + * + * $name is the name of the table to which the field should be added. + * $type is an ADODB datadict field type. The following field types + * are supported as of ADODB 3.40: + * - C: varchar + * - X: CLOB (character large object) or largest varchar size + * if CLOB is not supported + * - C2: Multibyte varchar + * - X2: Multibyte CLOB + * - B: BLOB (binary large object) + * - D: Date (some databases do not support this, and we return a datetime type) + * - T: Datetime or Timestamp + * - L: Integer field suitable for storing booleans (0 or 1) + * - I: Integer (mapped to I4) + * - I1: 1-byte integer + * - I2: 2-byte integer + * - I4: 4-byte integer + * - I8: 8-byte integer + * - F: Floating point number + * - N: Numeric or decimal number + * + * @param string $name Name of the table to which the field will be added. + * @param string $type ADODB datadict field type. + * @param string $size Field size + * @param array $opts Field options array + * @return array Field specifier array + */ + function addField( $name, $type, $size = NULL, $opts = NULL ) { + $field_id = $this->FieldID( $name ); + + // Set the field index so we know where we are + $this->current_field = $field_id; + + // Set the field name (required) + $this->fields[$field_id]['NAME'] = $name; + + // Set the field type (required) + $this->fields[$field_id]['TYPE'] = $type; + + // Set the field size (optional) + if( isset( $size ) ) { + $this->fields[$field_id]['SIZE'] = $size; + } + + // Set the field options + if( isset( $opts ) ) { + $this->fields[$field_id]['OPTS'][] = $opts; + } + } + + /** + * Adds a field option to the current field specifier + * + * This method adds a field option allowed by the ADOdb datadict + * and appends it to the given field. + * + * @param string $field Field name + * @param string $opt ADOdb field option + * @param mixed $value Field option value + * @return array Field specifier array + */ + function addFieldOpt( $field, $opt, $value = NULL ) { + if( !isset( $value ) ) { + $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt; + // Add the option and value + } else { + $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value ); + } + } + + /** + * Adds an option to the table + * + * This method takes a comma-separated list of table-level options + * and appends them to the table object. + * + * @param string $opt Table option + * @return array Options + */ + function addTableOpt( $opt ) { + if(isset($this->currentPlatform)) { + $this->opts[$this->parent->db->databaseType] = $opt; + } + return $this->opts; + } + + + /** + * Generates the SQL that will create the table in the database + * + * @param object $xmls adoSchema object + * @return array Array containing table creation SQL + */ + function create( &$xmls ) { + $sql = array(); + + // drop any existing indexes + if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) { + foreach( $legacy_indexes as $index => $index_details ) { + $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name ); + } + } + + // remove fields to be dropped from table object + foreach( $this->drop_field as $field ) { + unset( $this->fields[$field] ); + } + + // if table exists + if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) { + // drop table + if( $this->drop_table ) { + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + + return $sql; + } + + // drop any existing fields not in schema + foreach( $legacy_fields as $field_id => $field ) { + if( !isset( $this->fields[$field_id] ) ) { + $sql[] = $xmls->dict->DropColumnSQL( $this->name, '`'.$field->name.'`' ); + } + } + // if table doesn't exist + } else { + if( $this->drop_table ) { + return $sql; + } + + $legacy_fields = array(); + } + + // Loop through the field specifier array, building the associative array for the field options + $fldarray = array(); + + foreach( $this->fields as $field_id => $finfo ) { + // Set an empty size if it isn't supplied + if( !isset( $finfo['SIZE'] ) ) { + $finfo['SIZE'] = ''; + } + + // Initialize the field array with the type and size + $fldarray[$field_id] = array( + 'NAME' => $finfo['NAME'], + 'TYPE' => $finfo['TYPE'], + 'SIZE' => $finfo['SIZE'] + ); + + // Loop through the options array and add the field options. + if( isset( $finfo['OPTS'] ) ) { + foreach( $finfo['OPTS'] as $opt ) { + // Option has an argument. + if( is_array( $opt ) ) { + $key = key( $opt ); + $value = $opt[key( $opt )]; + @$fldarray[$field_id][$key] .= $value; + // Option doesn't have arguments + } else { + $fldarray[$field_id][$opt] = $opt; + } + } + } + } + + if( empty( $legacy_fields ) ) { + // Create the new table + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + logMsg( end( $sql ), 'Generated CreateTableSQL' ); + } else { + // Upgrade an existing table + logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" ); + switch( $xmls->upgrade ) { + // Use ChangeTableSQL + case 'ALTER': + logMsg( 'Generated ChangeTableSQL (ALTERing table)' ); + $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts ); + break; + case 'REPLACE': + logMsg( 'Doing upgrade REPLACE (testing)' ); + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + break; + // ignore table + default: + return array(); + } + } + + foreach( $this->indexes as $index ) { + $sql[] = $index->create( $xmls ); + } + + if( isset( $this->data ) ) { + $sql[] = $this->data->create( $xmls ); + } + + return $sql; + } + + /** + * Marks a field or table for destruction + */ + function drop() { + if( isset( $this->current_field ) ) { + // Drop the current field + logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" ); + // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field ); + $this->drop_field[$this->current_field] = $this->current_field; + } else { + // Drop the current table + logMsg( "Dropping table '{$this->name}'" ); + // $this->drop_table = $xmls->dict->DropTableSQL( $this->name ); + $this->drop_table = TRUE; + } + } +} + +/** +* Creates an index object in ADOdb's datadict format +* +* This class stores information about a database index. As charactaristics +* of the index are loaded from the external source, methods and properties +* of this class are used to build up the index description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbIndex extends dbObject { + + /** + * @var string Index name + */ + var $name; + + /** + * @var array Index options: Index-level options + */ + var $opts = array(); + + /** + * @var array Indexed fields: Table columns included in this index + */ + var $columns = array(); + + /** + * @var boolean Mark index for destruction + * @access private + */ + var $drop = FALSE; + + /** + * Initializes the new dbIndex object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbIndex( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + $this->name = $this->prefix ($attributes['NAME']); + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'DROP': + $this->drop(); + break; + case 'CLUSTERED': + case 'BITMAP': + case 'UNIQUE': + case 'FULLTEXT': + case 'HASH': + // Add index Option + $this->addIndexOpt( $this->currentElement ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'COL': + $this->addField( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'INDEX': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the index + * + * @param string $name Field name + * @return string Field list + */ + function addField( $name ) { + $this->columns[$this->FieldID( $name )] = $name; + + // Return the field list + return $this->columns; + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addIndexOpt( $opt ) { + $this->opts[] = $opt; + + // Return the options list + return $this->opts; + } + + /** + * Generates the SQL that will create the index in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + if( $this->drop ) { + return NULL; + } + + // eliminate any columns that aren't in the table + foreach( $this->columns as $id => $col ) { + if( !isset( $this->parent->fields[$id] ) ) { + unset( $this->columns[$id] ); + } + } + + return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts ); + } + + /** + * Marks an index for destruction + */ + function drop() { + $this->drop = TRUE; + } +} + +/** +* Creates a data object in ADOdb's datadict format +* +* This class stores information about table data. +* +* @package axmls +* @access private +*/ +class dbData extends dbObject { + + var $data = array(); + + var $row; + + /** + * Initializes the new dbIndex object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbData( &$parent, $attributes = NULL ) { + $this->parent = $parent; + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'ROW': + $this->row = count( $this->data ); + $this->data[$this->row] = array(); + break; + case 'F': + $this->addField($attributes); + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'F': + $this->addData( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'DATA': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the index + * + * @param string $name Field name + * @return string Field list + */ + function addField( $attributes ) { + if( isset( $attributes['NAME'] ) ) { + $name = $attributes['NAME']; + } else { + $name = count($this->data[$this->row]); + } + + // Set the field index so we know where we are + $this->current_field = $this->FieldID( $name ); + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addData( $cdata ) { + if( !isset( $this->data[$this->row] ) ) { + $this->data[$this->row] = array(); + } + + if( !isset( $this->data[$this->row][$this->current_field] ) ) { + $this->data[$this->row][$this->current_field] = ''; + } + + $this->data[$this->row][$this->current_field] .= $cdata; + } + + /** + * Generates the SQL that will create the index in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + $table = $xmls->dict->TableName($this->parent->name); + $table_field_count = count($this->parent->fields); + $sql = array(); + + // eliminate any columns that aren't in the table + foreach( $this->data as $row ) { + $table_fields = $this->parent->fields; + $fields = array(); + + foreach( $row as $field_id => $field_data ) { + if( !array_key_exists( $field_id, $table_fields ) ) { + if( is_numeric( $field_id ) ) { + $field_id = reset( array_keys( $table_fields ) ); + } else { + continue; + } + } + + $name = $table_fields[$field_id]['NAME']; + + switch( $table_fields[$field_id]['TYPE'] ) { + case 'C': + case 'C2': + case 'X': + case 'X2': + $fields[$name] = $xmls->db->qstr( $field_data ); + break; + case 'I': + case 'I1': + case 'I2': + case 'I4': + case 'I8': + $fields[$name] = intval($field_data); + break; + default: + $fields[$name] = $field_data; + } + + unset($table_fields[$field_id]); + } + + // check that at least 1 column is specified + if( empty( $fields ) ) { + continue; + } + + // check that no required columns are missing + if( count( $fields ) < $table_field_count ) { + foreach( $table_fields as $field ) { + if (isset( $field['OPTS'] )) + if( ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) { + continue(2); + } + } + } + + $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; + } + + return $sql; + } +} + +/** +* Creates the SQL to execute a list of provided SQL queries +* +* @package axmls +* @access private +*/ +class dbQuerySet extends dbObject { + + /** + * @var array List of SQL queries + */ + var $queries = array(); + + /** + * @var string String used to build of a query line by line + */ + var $query; + + /** + * @var string Query prefix key + */ + var $prefixKey = ''; + + /** + * @var boolean Auto prefix enable (TRUE) + */ + var $prefixMethod = 'AUTO'; + + /** + * Initializes the query set. + * + * @param object $parent Parent object + * @param array $attributes Attributes + */ + function dbQuerySet( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + // Overrides the manual prefix key + if( isset( $attributes['KEY'] ) ) { + $this->prefixKey = $attributes['KEY']; + } + + $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : ''; + + // Enables or disables automatic prefix prepending + switch( $prefixMethod ) { + case 'AUTO': + $this->prefixMethod = 'AUTO'; + break; + case 'MANUAL': + $this->prefixMethod = 'MANUAL'; + break; + case 'NONE': + $this->prefixMethod = 'NONE'; + break; + } + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: QUERY. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'QUERY': + // Create a new query in a SQL queryset. + // Ignore this query set if a platform is specified and it's different than the + // current connection platform. + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->newQuery(); + } else { + $this->discardQuery(); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Line of queryset SQL data + case 'QUERY': + $this->buildQuery( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'QUERY': + // Add the finished query to the open query set. + $this->addQuery(); + break; + case 'SQL': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + default: + + } + } + + /** + * Re-initializes the query. + * + * @return boolean TRUE + */ + function newQuery() { + $this->query = ''; + + return TRUE; + } + + /** + * Discards the existing query. + * + * @return boolean TRUE + */ + function discardQuery() { + unset( $this->query ); + + return TRUE; + } + + /** + * Appends a line to a query that is being built line by line + * + * @param string $data Line of SQL data or NULL to initialize a new query + * @return string SQL query string. + */ + function buildQuery( $sql = NULL ) { + if( !isset( $this->query ) OR empty( $sql ) ) { + return FALSE; + } + + $this->query .= $sql; + + return $this->query; + } + + /** + * Adds a completed query to the query list + * + * @return string SQL of added query + */ + function addQuery() { + if( !isset( $this->query ) ) { + return FALSE; + } + + $this->queries[] = $return = trim($this->query); + + unset( $this->query ); + + return $return; + } + + /** + * Creates and returns the current query set + * + * @param object $xmls adoSchema object + * @return array Query set + */ + function create( &$xmls ) { + foreach( $this->queries as $id => $query ) { + switch( $this->prefixMethod ) { + case 'AUTO': + // Enable auto prefix replacement + + // Process object prefix. + // Evaluate SQL statements to prepend prefix to objects + $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + + // SELECT statements aren't working yet + #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); + + case 'MANUAL': + // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX. + // If prefixKey is not set, we use the default constant XMLS_PREFIX + if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) { + // Enable prefix override + $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query ); + } else { + // Use default replacement + $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query ); + } + } + + $this->queries[$id] = trim( $query ); + } + + // Return the query set array + return $this->queries; + } + + /** + * Rebuilds the query with the prefix attached to any objects + * + * @param string $regex Regex used to add prefix + * @param string $query SQL query string + * @param string $prefix Prefix to be appended to tables, indices, etc. + * @return string Prefixed SQL query string. + */ + function prefixQuery( $regex, $query, $prefix = NULL ) { + if( !isset( $prefix ) ) { + return $query; + } + + if( preg_match( $regex, $query, $match ) ) { + $preamble = $match[1]; + $postamble = $match[5]; + $objectList = explode( ',', $match[3] ); + // $prefix = $prefix . '_'; + + $prefixedList = ''; + + foreach( $objectList as $object ) { + if( $prefixedList !== '' ) { + $prefixedList .= ', '; + } + + $prefixedList .= $prefix . trim( $object ); + } + + $query = $preamble . ' ' . $prefixedList . ' ' . $postamble; + } + + return $query; + } +} + +/** +* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements +* +* This class is used to load and parse the XML file, to create an array of SQL statements +* that can be used to build a database, and to build the database using the SQL array. +* +* @tutorial getting_started.pkg +* +* @author Richard Tango-Lowy & Dan Cech +* @version $Revision: 1.12 $ +* +* @package axmls +*/ +class adoSchema { + + /** + * @var array Array containing SQL queries to generate all objects + * @access private + */ + var $sqlArray; + + /** + * @var object ADOdb connection object + * @access private + */ + var $db; + + /** + * @var object ADOdb Data Dictionary + * @access private + */ + var $dict; + + /** + * @var string Current XML element + * @access private + */ + var $currentElement = ''; + + /** + * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database + * @access private + */ + var $upgrade = ''; + + /** + * @var string Optional object prefix + * @access private + */ + var $objectPrefix = ''; + + /** + * @var long Original Magic Quotes Runtime value + * @access private + */ + var $mgq; + + /** + * @var long System debug + * @access private + */ + var $debug; + + /** + * @var string Regular expression to find schema version + * @access private + */ + var $versionRegex = '/<schema.*?( version="([^"]*)")?.*?>/'; + + /** + * @var string Current schema version + * @access private + */ + var $schemaVersion; + + /** + * @var int Success of last Schema execution + */ + var $success; + + /** + * @var bool Execute SQL inline as it is generated + */ + var $executeInline; + + /** + * @var bool Continue SQL execution if errors occur + */ + var $continueOnError; + + /** + * Creates an adoSchema object + * + * Creating an adoSchema object is the first step in processing an XML schema. + * The only parameter is an ADOdb database connection object, which must already + * have been created. + * + * @param object $db ADOdb database connection object. + */ + function adoSchema( &$db ) { + // Initialize the environment + $this->mgq = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + + $this->db = $db; + $this->debug = $this->db->debug; + $this->dict = NewDataDictionary( $this->db ); + $this->sqlArray = array(); + $this->schemaVersion = XMLS_SCHEMA_VERSION; + $this->executeInline( XMLS_EXECUTE_INLINE ); + $this->continueOnError( XMLS_CONTINUE_ON_ERROR ); + $this->setUpgradeMethod(); + } + + /** + * Sets the method to be used for upgrading an existing database + * + * Use this method to specify how existing database objects should be upgraded. + * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to + * alter each database object directly, REPLACE attempts to rebuild each object + * from scratch, BEST attempts to determine the best upgrade method for each + * object, and NONE disables upgrading. + * + * This method is not yet used by AXMLS, but exists for backward compatibility. + * The ALTER method is automatically assumed when the adoSchema object is + * instantiated; other upgrade methods are not currently supported. + * + * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE) + * @returns string Upgrade method used + */ + function SetUpgradeMethod( $method = '' ) { + if( !is_string( $method ) ) { + return FALSE; + } + + $method = strtoupper( $method ); + + // Handle the upgrade methods + switch( $method ) { + case 'ALTER': + $this->upgrade = $method; + break; + case 'REPLACE': + $this->upgrade = $method; + break; + case 'BEST': + $this->upgrade = 'ALTER'; + break; + case 'NONE': + $this->upgrade = 'NONE'; + break; + default: + // Use default if no legitimate method is passed. + $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD; + } + + return $this->upgrade; + } + + /** + * Enables/disables inline SQL execution. + * + * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution), + * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode + * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema() + * to apply the schema to the database. + * + * @param bool $mode execute + * @return bool current execution mode + * + * @see ParseSchema(), ExecuteSchema() + */ + function ExecuteInline( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->executeInline = $mode; + } + + return $this->executeInline; + } + + /** + * Enables/disables SQL continue on error. + * + * Call this method to enable or disable continuation of SQL execution if an error occurs. + * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs. + * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing + * of the schema will continue. + * + * @param bool $mode execute + * @return bool current continueOnError mode + * + * @see addSQL(), ExecuteSchema() + */ + function ContinueOnError( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->continueOnError = $mode; + } + + return $this->continueOnError; + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to create the database described. + * @see ParseSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function ParseSchema( $filename, $returnSchema = FALSE ) { + return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema from a file (see the DTD for the proper format) + * and generate the SQL necessary to create the database described by the schema. + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + * + * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() + * @see ParseSchema(), ParseSchemaString() + */ + function ParseSchemaFile( $filename, $returnSchema = FALSE ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + // die( 'Unable to open file' ); + return FALSE; + } + + // do version detection here + if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) { + return FALSE; + } + + if ( $returnSchema ) + { + $xmlstring = ''; + while( $data = fread( $fp, 100000 ) ) { + $xmlstring .= $data; + } + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Converts an XML schema string to SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to create the database described by the schema. + * @see ParseSchema() + * + * @param string $xmlstring XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + return FALSE; + } + + // do version detection here + if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) { + return FALSE; + } + + if ( $returnSchema ) + { + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Loads an XML schema from a file and converts it to uninstallation SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to remove the database described. + * @see RemoveSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function RemoveSchema( $filename, $returnSchema = FALSE ) { + return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Converts an XML schema string to uninstallation SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to uninstall the database described by the schema. + * @see RemoveSchema() + * + * @param string $schema XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function RemoveSchemaString( $schema, $returnSchema = FALSE ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema ); + } + + /** + * Applies the current XML schema to the database (post execution). + * + * Call this method to apply the current schema (generally created by calling + * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes, + * and executing other SQL specified in the schema) after parsing. + * @see ParseSchema(), ParseSchemaString(), ExecuteInline() + * + * @param array $sqlArray Array of SQL statements that will be applied rather than + * the current schema. + * @param boolean $continueOnErr Continue to apply the schema even if an error occurs. + * @returns integer 0 if failure, 1 if errors, 2 if successful. + */ + function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) { + if( !is_bool( $continueOnErr ) ) { + $continueOnErr = $this->ContinueOnError(); + } + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + $this->success = 0; + } else { + $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr ); + } + + return $this->success; + } + + /** + * Returns the current SQL array. + * + * Call this method to fetch the array of SQL queries resulting from + * ParseSchema() or ParseSchemaString(). + * + * @param string $format Format: HTML, TEXT, or NONE (PHP array) + * @return array Array of SQL statements or FALSE if an error occurs + */ + function PrintSQL( $format = 'NONE' ) { + $sqlArray = null; + return $this->getSQL( $format, $sqlArray ); + } + + /** + * Saves the current SQL array to the local filesystem as a list of SQL queries. + * + * Call this method to save the array of SQL queries (generally resulting from a + * parsed XML schema) to the filesystem. + * + * @param string $filename Path and name where the file should be saved. + * @return boolean TRUE if save is successful, else FALSE. + */ + function SaveSQL( $filename = './schema.sql' ) { + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + if( !isset( $sqlArray ) ) { + return FALSE; + } + + $fp = fopen( $filename, "w" ); + + foreach( $sqlArray as $key => $query ) { + fwrite( $fp, $query . ";\n" ); + } + fclose( $fp ); + } + + /** + * Create an xml parser + * + * @return object PHP XML parser object + * + * @access private + */ + function create_parser() { + // Create the parser + $xmlParser = xml_parser_create(); + xml_set_object( $xmlParser, $this ); + + // Initialize the XML callback functions + xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' ); + xml_set_character_data_handler( $xmlParser, '_tag_cdata' ); + + return $xmlParser; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + switch( strtoupper( $tag ) ) { + case 'TABLE': + $this->obj = new dbTable( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + break; + case 'SQL': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->obj = new dbQuerySet( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + } + + /** + * XML Callback to process end elements + * + * @access private + * @internal + */ + function _tag_close( &$parser, $tag ) { + + } + + /** + * Converts an XML schema string to the specified DTD version. + * + * Call this method to convert a string containing an XML schema to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaFile() + * + * @param string $schema String containing XML schema that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = $schema; + } else { + $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + // compat for pre-4.3 - jlim + function _file_get_contents($path) + { + if (function_exists('file_get_contents')) return file_get_contents($path); + return join('',file($path)); + } + + /** + * Converts an XML schema file to the specified DTD version. + * + * Call this method to convert the specified XML schema file to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaString() + * + * @param string $filename Name of XML schema file that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaFileVersion( $filename ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = _file_get_contents( $filename ); + + // remove unicode BOM if present + if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) { + $result = substr( $result, 3 ); + } + } else { + $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' ); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + function TransformSchema( $schema, $xsl, $schematype='string' ) + { + // Fail if XSLT extension is not available + if( ! function_exists( 'xslt_create' ) ) { + return FALSE; + } + + $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl'; + + // look for xsl + if( !is_readable( $xsl_file ) ) { + return FALSE; + } + + switch( $schematype ) + { + case 'file': + if( !is_readable( $schema ) ) { + return FALSE; + } + + $schema = _file_get_contents( $schema ); + break; + case 'string': + default: + if( !is_string( $schema ) ) { + return FALSE; + } + } + + $arguments = array ( + '/_xml' => $schema, + '/_xsl' => _file_get_contents( $xsl_file ) + ); + + // create an XSLT processor + $xh = xslt_create (); + + // set error handler + xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler')); + + // process the schema + $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); + + xslt_free ($xh); + + return $result; + } + + /** + * Processes XSLT transformation errors + * + * @param object $parser XML parser object + * @param integer $errno Error number + * @param integer $level Error level + * @param array $fields Error information fields + * + * @access private + */ + function xslt_error_handler( $parser, $errno, $level, $fields ) { + if( is_array( $fields ) ) { + $msg = array( + 'Message Type' => ucfirst( $fields['msgtype'] ), + 'Message Code' => $fields['code'], + 'Message' => $fields['msg'], + 'Error Number' => $errno, + 'Level' => $level + ); + + switch( $fields['URI'] ) { + case 'arg:/_xml': + $msg['Input'] = 'XML'; + break; + case 'arg:/_xsl': + $msg['Input'] = 'XSL'; + break; + default: + $msg['Input'] = $fields['URI']; + } + + $msg['Line'] = $fields['line']; + } else { + $msg = array( + 'Message Type' => 'Error', + 'Error Number' => $errno, + 'Level' => $level, + 'Fields' => var_export( $fields, TRUE ) + ); + } + + $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n" + . '<table>' . "\n"; + + foreach( $msg as $label => $details ) { + $error_details .= '<tr><td><b>' . $label . ': </b></td><td>' . htmlentities( $details ) . '</td></tr>' . "\n"; + } + + $error_details .= '</table>'; + + trigger_error( $error_details, E_USER_ERROR ); + } + + /** + * Returns the AXMLS Schema Version of the requested XML schema file. + * + * Call this method to obtain the AXMLS DTD version of the requested XML schema file. + * @see SchemaStringVersion() + * + * @param string $filename AXMLS schema file + * @return string Schema version number or FALSE on error + */ + function SchemaFileVersion( $filename ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + // die( 'Unable to open file' ); + return FALSE; + } + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( preg_match( $this->versionRegex, $data, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + } + + return FALSE; + } + + /** + * Returns the AXMLS Schema Version of the provided XML schema string. + * + * Call this method to obtain the AXMLS DTD version of the provided XML schema string. + * @see SchemaFileVersion() + * + * @param string $xmlstring XML schema string + * @return string Schema version number or FALSE on error + */ + function SchemaStringVersion( $xmlstring ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + return FALSE; + } + + if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + + return FALSE; + } + + /** + * Extracts an XML schema from an existing database. + * + * Call this method to create an XML schema string from an existing database. + * If the data parameter is set to TRUE, AXMLS will include the data from the database + * in the schema. + * + * @param boolean $data Include data in schema dump + * @return string Generated XML schema + */ + function ExtractSchema( $data = FALSE ) { + $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM ); + + $schema = '<?xml version="1.0"?>' . "\n" + . '<schema version="' . $this->schemaVersion . '">' . "\n"; + + if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) { + foreach( $tables as $table ) { + $schema .= ' <table name="' . $table . '">' . "\n"; + + // grab details from database + $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE 1=1' ); + $fields = $this->db->MetaColumns( $table ); + $indexes = $this->db->MetaIndexes( $table ); + + if( is_array( $fields ) ) { + foreach( $fields as $details ) { + $extra = ''; + $content = array(); + + if( $details->max_length > 0 ) { + $extra .= ' size="' . $details->max_length . '"'; + } + + if( $details->primary_key ) { + $content[] = '<KEY/>'; + } elseif( $details->not_null ) { + $content[] = '<NOTNULL/>'; + } + + if( $details->has_default ) { + $content[] = '<DEFAULT value="' . $details->default_value . '"/>'; + } + + if( $details->auto_increment ) { + $content[] = '<AUTOINCREMENT/>'; + } + + // this stops the creation of 'R' columns, + // AUTOINCREMENT is used to create auto columns + $details->primary_key = 0; + $type = $rs->MetaType( $details ); + + $schema .= ' <field name="' . $details->name . '" type="' . $type . '"' . $extra . '>'; + + if( !empty( $content ) ) { + $schema .= "\n " . implode( "\n ", $content ) . "\n "; + } + + $schema .= '</field>' . "\n"; + } + } + + if( is_array( $indexes ) ) { + foreach( $indexes as $index => $details ) { + $schema .= ' <index name="' . $index . '">' . "\n"; + + if( $details['unique'] ) { + $schema .= ' <UNIQUE/>' . "\n"; + } + + foreach( $details['columns'] as $column ) { + $schema .= ' <col>' . $column . '</col>' . "\n"; + } + + $schema .= ' </index>' . "\n"; + } + } + + if( $data ) { + $rs = $this->db->Execute( 'SELECT * FROM ' . $table ); + + if( is_object( $rs ) ) { + $schema .= ' <data>' . "\n"; + + while( $row = $rs->FetchRow() ) { + foreach( $row as $key => $val ) { + $row[$key] = htmlentities($val); + } + + $schema .= ' <row><f>' . implode( '</f><f>', $row ) . '</f></row>' . "\n"; + } + + $schema .= ' </data>' . "\n"; + } + } + + $schema .= ' </table>' . "\n"; + } + } + + $this->db->SetFetchMode( $old_mode ); + + $schema .= '</schema>'; + return $schema; + } + + /** + * Sets a prefix for database objects + * + * Call this method to set a standard prefix that will be prepended to all database tables + * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix. + * + * @param string $prefix Prefix that will be prepended. + * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix. + * @return boolean TRUE if successful, else FALSE + */ + function SetPrefix( $prefix = '', $underscore = TRUE ) { + switch( TRUE ) { + // clear prefix + case empty( $prefix ): + logMsg( 'Cleared prefix' ); + $this->objectPrefix = ''; + return TRUE; + // prefix too long + case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: + // prefix contains invalid characters + case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ): + logMsg( 'Invalid prefix: ' . $prefix ); + return FALSE; + } + + if( $underscore AND substr( $prefix, -1 ) != '_' ) { + $prefix .= '_'; + } + + // prefix valid + logMsg( 'Set prefix: ' . $prefix ); + $this->objectPrefix = $prefix; + return TRUE; + } + + /** + * Returns an object name with the current prefix prepended. + * + * @param string $name Name + * @return string Prefixed name + * + * @access private + */ + function prefix( $name = '' ) { + // if prefix is set + if( !empty( $this->objectPrefix ) ) { + // Prepend the object prefix to the table name + // prepend after quote if used + return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name ); + } + + // No prefix set. Use name provided. + return $name; + } + + /** + * Checks if element references a specific platform + * + * @param string $platform Requested platform + * @returns boolean TRUE if platform check succeeds + * + * @access private + */ + function supportedPlatform( $platform = NULL ) { + $regex = '/^(\w*\|)*' . $this->db->databaseType . '(\|\w*)*$/'; + + if( !isset( $platform ) OR preg_match( $regex, $platform ) ) { + logMsg( "Platform $platform is supported" ); + return TRUE; + } else { + logMsg( "Platform $platform is NOT supported" ); + return FALSE; + } + } + + /** + * Clears the array of generated SQL. + * + * @access private + */ + function clearSQL() { + $this->sqlArray = array(); + } + + /** + * Adds SQL into the SQL array. + * + * @param mixed $sql SQL to Add + * @return boolean TRUE if successful, else FALSE. + * + * @access private + */ + function addSQL( $sql = NULL ) { + if( is_array( $sql ) ) { + foreach( $sql as $line ) { + $this->addSQL( $line ); + } + + return TRUE; + } + + if( is_string( $sql ) ) { + $this->sqlArray[] = $sql; + + // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL. + if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) { + $saved = $this->db->debug; + $this->db->debug = $this->debug; + $ok = $this->db->Execute( $sql ); + $this->db->debug = $saved; + + if( !$ok ) { + if( $this->debug ) { + ADOConnection::outp( $this->db->ErrorMsg() ); + } + + $this->success = 1; + } + } + + return TRUE; + } + + return FALSE; + } + + /** + * Gets the SQL array in the specified format. + * + * @param string $format Format + * @return mixed SQL + * + * @access private + */ + function getSQL( $format = NULL, $sqlArray = NULL ) { + if( !is_array( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + return FALSE; + } + + switch( strtolower( $format ) ) { + case 'string': + case 'text': + return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : ''; + case'html': + return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : ''; + } + + return $this->sqlArray; + } + + /** + * Destroys an adoSchema object. + * + * Call this method to clean up after an adoSchema object that is no longer in use. + * @deprecated adoSchema now cleans up automatically. + */ + function Destroy() { + set_magic_quotes_runtime( $this->mgq ); + unset( $this ); + } +} + +/** +* Message logging function +* +* @access private +*/ +function logMsg( $msg, $title = NULL, $force = FALSE ) { + if( XMLS_DEBUG or $force ) { + echo '<pre>'; + + if( isset( $title ) ) { + echo '<h3>' . htmlentities( $title ) . '</h3>'; + } + + if( is_object( $this ) ) { + echo '[' . get_class( $this ) . '] '; + } + + print_r( $msg ); + + echo '</pre>'; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb-xmlschema03.inc.php b/pos/is4c-nf/lib/adodb5/adodb-xmlschema03.inc.php new file mode 100644 index 000000000..cbd49b9d8 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb-xmlschema03.inc.php @@ -0,0 +1,2404 @@ +<?php +// Copyright (c) 2004-2005 ars Cognita Inc., all rights reserved +/* ****************************************************************************** + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +*******************************************************************************/ +/** + * xmlschema is a class that allows the user to quickly and easily + * build a database on any ADOdb-supported platform using a simple + * XML schema. + * + * Last Editor: $Author: jlim $ + * @author Richard Tango-Lowy & Dan Cech + * @version $Revision: 1.62 $ + * + * @package axmls + * @tutorial getting_started.pkg + */ + +function _file_get_contents($file) +{ + if (function_exists('file_get_contents')) return file_get_contents($file); + + $f = fopen($file,'r'); + if (!$f) return ''; + $t = ''; + + while ($s = fread($f,100000)) $t .= $s; + fclose($f); + return $t; +} + + +/** +* Debug on or off +*/ +if( !defined( 'XMLS_DEBUG' ) ) { + define( 'XMLS_DEBUG', FALSE ); +} + +/** +* Default prefix key +*/ +if( !defined( 'XMLS_PREFIX' ) ) { + define( 'XMLS_PREFIX', '%%P' ); +} + +/** +* Maximum length allowed for object prefix +*/ +if( !defined( 'XMLS_PREFIX_MAXLEN' ) ) { + define( 'XMLS_PREFIX_MAXLEN', 10 ); +} + +/** +* Execute SQL inline as it is generated +*/ +if( !defined( 'XMLS_EXECUTE_INLINE' ) ) { + define( 'XMLS_EXECUTE_INLINE', FALSE ); +} + +/** +* Continue SQL Execution if an error occurs? +*/ +if( !defined( 'XMLS_CONTINUE_ON_ERROR' ) ) { + define( 'XMLS_CONTINUE_ON_ERROR', FALSE ); +} + +/** +* Current Schema Version +*/ +if( !defined( 'XMLS_SCHEMA_VERSION' ) ) { + define( 'XMLS_SCHEMA_VERSION', '0.3' ); +} + +/** +* Default Schema Version. Used for Schemas without an explicit version set. +*/ +if( !defined( 'XMLS_DEFAULT_SCHEMA_VERSION' ) ) { + define( 'XMLS_DEFAULT_SCHEMA_VERSION', '0.1' ); +} + +/** +* How to handle data rows that already exist in a database during and upgrade. +* Options are INSERT (attempts to insert duplicate rows), UPDATE (updates existing +* rows) and IGNORE (ignores existing rows). +*/ +if( !defined( 'XMLS_MODE_INSERT' ) ) { + define( 'XMLS_MODE_INSERT', 0 ); +} +if( !defined( 'XMLS_MODE_UPDATE' ) ) { + define( 'XMLS_MODE_UPDATE', 1 ); +} +if( !defined( 'XMLS_MODE_IGNORE' ) ) { + define( 'XMLS_MODE_IGNORE', 2 ); +} +if( !defined( 'XMLS_EXISTING_DATA' ) ) { + define( 'XMLS_EXISTING_DATA', XMLS_MODE_INSERT ); +} + +/** +* Default Schema Version. Used for Schemas without an explicit version set. +*/ +if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) { + define( 'XMLS_DEFAULT_UPGRADE_METHOD', 'ALTER' ); +} + +/** +* Include the main ADODB library +*/ +if( !defined( '_ADODB_LAYER' ) ) { + require( 'adodb.inc.php' ); + require( 'adodb-datadict.inc.php' ); +} + +/** +* Abstract DB Object. This class provides basic methods for database objects, such +* as tables and indexes. +* +* @package axmls +* @access private +*/ +class dbObject { + + /** + * var object Parent + */ + var $parent; + + /** + * var string current element + */ + var $currentElement; + + /** + * NOP + */ + function dbObject( &$parent, $attributes = NULL ) { + $this->parent = $parent; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + + } + + function create() { + return array(); + } + + /** + * Destroys the object + */ + function destroy() { + unset( $this ); + } + + /** + * Checks whether the specified RDBMS is supported by the current + * database object or its ranking ancestor. + * + * @param string $platform RDBMS platform name (from ADODB platform list). + * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE. + */ + function supportedPlatform( $platform = NULL ) { + return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE; + } + + /** + * Returns the prefix set by the ranking ancestor of the database object. + * + * @param string $name Prefix string. + * @return string Prefix. + */ + function prefix( $name = '' ) { + return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name; + } + + /** + * Extracts a field ID from the specified field. + * + * @param string $field Field. + * @return string Field ID. + */ + function FieldID( $field ) { + return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) ); + } +} + +/** +* Creates a table object in ADOdb's datadict format +* +* This class stores information about a database table. As charactaristics +* of the table are loaded from the external source, methods and properties +* of this class are used to build up the table description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbTable extends dbObject { + + /** + * @var string Table name + */ + var $name; + + /** + * @var array Field specifier: Meta-information about each field + */ + var $fields = array(); + + /** + * @var array List of table indexes. + */ + var $indexes = array(); + + /** + * @var array Table options: Table-level options + */ + var $opts = array(); + + /** + * @var string Field index: Keeps track of which field is currently being processed + */ + var $current_field; + + /** + * @var boolean Mark table for destruction + * @access private + */ + var $drop_table; + + /** + * @var boolean Mark field for destruction (not yet implemented) + * @access private + */ + var $drop_field = array(); + + /** + * @var array Platform-specific options + * @access private + */ + var $currentPlatform = true; + + + /** + * Iniitializes a new table object. + * + * @param string $prefix DB Object prefix + * @param array $attributes Array of table attributes. + */ + function dbTable( &$parent, $attributes = NULL ) { + $this->parent = $parent; + $this->name = $this->prefix($attributes['NAME']); + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'INDEX': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addIndex( $attributes ) ); + } + break; + case 'DATA': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + xml_set_object( $parser, $this->addData( $attributes ) ); + } + break; + case 'DROP': + $this->drop(); + break; + case 'FIELD': + // Add a field + $fieldName = $attributes['NAME']; + $fieldType = $attributes['TYPE']; + $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL; + $fieldOpts = !empty( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL; + + $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts ); + break; + case 'KEY': + case 'NOTNULL': + case 'AUTOINCREMENT': + case 'DEFDATE': + case 'DEFTIMESTAMP': + case 'UNSIGNED': + // Add a field option + $this->addFieldOpt( $this->current_field, $this->currentElement ); + break; + case 'DEFAULT': + // Add a field option to the table object + + // Work around ADOdb datadict issue that misinterprets empty strings. + if( $attributes['VALUE'] == '' ) { + $attributes['VALUE'] = " '' "; + } + + $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); + break; + case 'OPT': + case 'CONSTRAINT': + // Accept platform-specific options + $this->currentPlatform = ( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Table/field constraint + case 'CONSTRAINT': + if( isset( $this->current_field ) ) { + $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata ); + } else { + $this->addTableOpt( $cdata ); + } + break; + // Table/field option + case 'OPT': + if( isset( $this->current_field ) ) { + $this->addFieldOpt( $this->current_field, $cdata ); + } else { + $this->addTableOpt( $cdata ); + } + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'TABLE': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + case 'FIELD': + unset($this->current_field); + break; + case 'OPT': + case 'CONSTRAINT': + $this->currentPlatform = true; + break; + default: + + } + } + + /** + * Adds an index to a table object + * + * @param array $attributes Index attributes + * @return object dbIndex object + */ + function addIndex( $attributes ) { + $name = strtoupper( $attributes['NAME'] ); + $this->indexes[$name] = new dbIndex( $this, $attributes ); + return $this->indexes[$name]; + } + + /** + * Adds data to a table object + * + * @param array $attributes Data attributes + * @return object dbData object + */ + function addData( $attributes ) { + if( !isset( $this->data ) ) { + $this->data = new dbData( $this, $attributes ); + } + return $this->data; + } + + /** + * Adds a field to a table object + * + * $name is the name of the table to which the field should be added. + * $type is an ADODB datadict field type. The following field types + * are supported as of ADODB 3.40: + * - C: varchar + * - X: CLOB (character large object) or largest varchar size + * if CLOB is not supported + * - C2: Multibyte varchar + * - X2: Multibyte CLOB + * - B: BLOB (binary large object) + * - D: Date (some databases do not support this, and we return a datetime type) + * - T: Datetime or Timestamp + * - L: Integer field suitable for storing booleans (0 or 1) + * - I: Integer (mapped to I4) + * - I1: 1-byte integer + * - I2: 2-byte integer + * - I4: 4-byte integer + * - I8: 8-byte integer + * - F: Floating point number + * - N: Numeric or decimal number + * + * @param string $name Name of the table to which the field will be added. + * @param string $type ADODB datadict field type. + * @param string $size Field size + * @param array $opts Field options array + * @return array Field specifier array + */ + function addField( $name, $type, $size = NULL, $opts = NULL ) { + $field_id = $this->FieldID( $name ); + + // Set the field index so we know where we are + $this->current_field = $field_id; + + // Set the field name (required) + $this->fields[$field_id]['NAME'] = $name; + + // Set the field type (required) + $this->fields[$field_id]['TYPE'] = $type; + + // Set the field size (optional) + if( isset( $size ) ) { + $this->fields[$field_id]['SIZE'] = $size; + } + + // Set the field options + if( isset( $opts ) ) { + $this->fields[$field_id]['OPTS'] = array($opts); + } else { + $this->fields[$field_id]['OPTS'] = array(); + } + } + + /** + * Adds a field option to the current field specifier + * + * This method adds a field option allowed by the ADOdb datadict + * and appends it to the given field. + * + * @param string $field Field name + * @param string $opt ADOdb field option + * @param mixed $value Field option value + * @return array Field specifier array + */ + function addFieldOpt( $field, $opt, $value = NULL ) { + if( $this->currentPlatform ) { + if( !isset( $value ) ) { + $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt; + // Add the option and value + } else { + $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value ); + } + } + } + + /** + * Adds an option to the table + * + * This method takes a comma-separated list of table-level options + * and appends them to the table object. + * + * @param string $opt Table option + * @return array Options + */ + function addTableOpt( $opt ) { + if(isset($this->currentPlatform)) { + $this->opts[$this->parent->db->databaseType] = $opt; + } + return $this->opts; + } + + + /** + * Generates the SQL that will create the table in the database + * + * @param object $xmls adoSchema object + * @return array Array containing table creation SQL + */ + function create( &$xmls ) { + $sql = array(); + + // drop any existing indexes + if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) { + foreach( $legacy_indexes as $index => $index_details ) { + $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name ); + } + } + + // remove fields to be dropped from table object + foreach( $this->drop_field as $field ) { + unset( $this->fields[$field] ); + } + + // if table exists + if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) { + // drop table + if( $this->drop_table ) { + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + + return $sql; + } + + // drop any existing fields not in schema + foreach( $legacy_fields as $field_id => $field ) { + if( !isset( $this->fields[$field_id] ) ) { + $sql[] = $xmls->dict->DropColumnSQL( $this->name, $field->name ); + } + } + // if table doesn't exist + } else { + if( $this->drop_table ) { + return $sql; + } + + $legacy_fields = array(); + } + + // Loop through the field specifier array, building the associative array for the field options + $fldarray = array(); + + foreach( $this->fields as $field_id => $finfo ) { + // Set an empty size if it isn't supplied + if( !isset( $finfo['SIZE'] ) ) { + $finfo['SIZE'] = ''; + } + + // Initialize the field array with the type and size + $fldarray[$field_id] = array( + 'NAME' => $finfo['NAME'], + 'TYPE' => $finfo['TYPE'], + 'SIZE' => $finfo['SIZE'] + ); + + // Loop through the options array and add the field options. + if( isset( $finfo['OPTS'] ) ) { + foreach( $finfo['OPTS'] as $opt ) { + // Option has an argument. + if( is_array( $opt ) ) { + $key = key( $opt ); + $value = $opt[key( $opt )]; + @$fldarray[$field_id][$key] .= $value; + // Option doesn't have arguments + } else { + $fldarray[$field_id][$opt] = $opt; + } + } + } + } + + if( empty( $legacy_fields ) ) { + // Create the new table + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + logMsg( end( $sql ), 'Generated CreateTableSQL' ); + } else { + // Upgrade an existing table + logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" ); + switch( $xmls->upgrade ) { + // Use ChangeTableSQL + case 'ALTER': + logMsg( 'Generated ChangeTableSQL (ALTERing table)' ); + $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts ); + break; + case 'REPLACE': + logMsg( 'Doing upgrade REPLACE (testing)' ); + $sql[] = $xmls->dict->DropTableSQL( $this->name ); + $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); + break; + // ignore table + default: + return array(); + } + } + + foreach( $this->indexes as $index ) { + $sql[] = $index->create( $xmls ); + } + + if( isset( $this->data ) ) { + $sql[] = $this->data->create( $xmls ); + } + + return $sql; + } + + /** + * Marks a field or table for destruction + */ + function drop() { + if( isset( $this->current_field ) ) { + // Drop the current field + logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" ); + // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field ); + $this->drop_field[$this->current_field] = $this->current_field; + } else { + // Drop the current table + logMsg( "Dropping table '{$this->name}'" ); + // $this->drop_table = $xmls->dict->DropTableSQL( $this->name ); + $this->drop_table = TRUE; + } + } +} + +/** +* Creates an index object in ADOdb's datadict format +* +* This class stores information about a database index. As charactaristics +* of the index are loaded from the external source, methods and properties +* of this class are used to build up the index description in ADOdb's +* datadict format. +* +* @package axmls +* @access private +*/ +class dbIndex extends dbObject { + + /** + * @var string Index name + */ + var $name; + + /** + * @var array Index options: Index-level options + */ + var $opts = array(); + + /** + * @var array Indexed fields: Table columns included in this index + */ + var $columns = array(); + + /** + * @var boolean Mark index for destruction + * @access private + */ + var $drop = FALSE; + + /** + * Initializes the new dbIndex object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbIndex( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + $this->name = $this->prefix ($attributes['NAME']); + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'DROP': + $this->drop(); + break; + case 'CLUSTERED': + case 'BITMAP': + case 'UNIQUE': + case 'FULLTEXT': + case 'HASH': + // Add index Option + $this->addIndexOpt( $this->currentElement ); + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'COL': + $this->addField( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'INDEX': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the index + * + * @param string $name Field name + * @return string Field list + */ + function addField( $name ) { + $this->columns[$this->FieldID( $name )] = $name; + + // Return the field list + return $this->columns; + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addIndexOpt( $opt ) { + $this->opts[] = $opt; + + // Return the options list + return $this->opts; + } + + /** + * Generates the SQL that will create the index in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + if( $this->drop ) { + return NULL; + } + + // eliminate any columns that aren't in the table + foreach( $this->columns as $id => $col ) { + if( !isset( $this->parent->fields[$id] ) ) { + unset( $this->columns[$id] ); + } + } + + return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts ); + } + + /** + * Marks an index for destruction + */ + function drop() { + $this->drop = TRUE; + } +} + +/** +* Creates a data object in ADOdb's datadict format +* +* This class stores information about table data, and is called +* when we need to load field data into a table. +* +* @package axmls +* @access private +*/ +class dbData extends dbObject { + + var $data = array(); + + var $row; + + /** + * Initializes the new dbData object. + * + * @param object $parent Parent object + * @param array $attributes Attributes + * + * @internal + */ + function dbData( &$parent, $attributes = NULL ) { + $this->parent = $parent; + } + + /** + * XML Callback to process start elements + * + * Processes XML opening tags. + * Elements currently processed are: ROW and F (field). + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'ROW': + $this->row = count( $this->data ); + $this->data[$this->row] = array(); + break; + case 'F': + $this->addField($attributes); + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + * + * Processes XML cdata. + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Index field name + case 'F': + $this->addData( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'DATA': + xml_set_object( $parser, $this->parent ); + break; + } + } + + /** + * Adds a field to the insert + * + * @param string $name Field name + * @return string Field list + */ + function addField( $attributes ) { + // check we're in a valid row + if( !isset( $this->row ) || !isset( $this->data[$this->row] ) ) { + return; + } + + // Set the field index so we know where we are + if( isset( $attributes['NAME'] ) ) { + $this->current_field = $this->FieldID( $attributes['NAME'] ); + } else { + $this->current_field = count( $this->data[$this->row] ); + } + + // initialise data + if( !isset( $this->data[$this->row][$this->current_field] ) ) { + $this->data[$this->row][$this->current_field] = ''; + } + } + + /** + * Adds options to the index + * + * @param string $opt Comma-separated list of index options. + * @return string Option list + */ + function addData( $cdata ) { + // check we're in a valid field + if ( isset( $this->data[$this->row][$this->current_field] ) ) { + // add data to field + $this->data[$this->row][$this->current_field] .= $cdata; + } + } + + /** + * Generates the SQL that will add/update the data in the database + * + * @param object $xmls adoSchema object + * @return array Array containing index creation SQL + */ + function create( &$xmls ) { + $table = $xmls->dict->TableName($this->parent->name); + $table_field_count = count($this->parent->fields); + $tables = $xmls->db->MetaTables(); + $sql = array(); + + $ukeys = $xmls->db->MetaPrimaryKeys( $table ); + if( !empty( $this->parent->indexes ) and !empty( $ukeys ) ) { + foreach( $this->parent->indexes as $indexObj ) { + if( !in_array( $indexObj->name, $ukeys ) ) $ukeys[] = $indexObj->name; + } + } + + // eliminate any columns that aren't in the table + foreach( $this->data as $row ) { + $table_fields = $this->parent->fields; + $fields = array(); + $rawfields = array(); // Need to keep some of the unprocessed data on hand. + + foreach( $row as $field_id => $field_data ) { + if( !array_key_exists( $field_id, $table_fields ) ) { + if( is_numeric( $field_id ) ) { + $field_id = reset( array_keys( $table_fields ) ); + } else { + continue; + } + } + + $name = $table_fields[$field_id]['NAME']; + + switch( $table_fields[$field_id]['TYPE'] ) { + case 'I': + case 'I1': + case 'I2': + case 'I4': + case 'I8': + $fields[$name] = intval($field_data); + break; + case 'C': + case 'C2': + case 'X': + case 'X2': + default: + $fields[$name] = $xmls->db->qstr( $field_data ); + $rawfields[$name] = $field_data; + } + + unset($table_fields[$field_id]); + + } + + // check that at least 1 column is specified + if( empty( $fields ) ) { + continue; + } + + // check that no required columns are missing + if( count( $fields ) < $table_field_count ) { + foreach( $table_fields as $field ) { + if( isset( $field['OPTS'] ) and ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) { + continue(2); + } + } + } + + // The rest of this method deals with updating existing data records. + + if( !in_array( $table, $tables ) or ( $mode = $xmls->existingData() ) == XMLS_MODE_INSERT ) { + // Table doesn't yet exist, so it's safe to insert. + logMsg( "$table doesn't exist, inserting or mode is INSERT" ); + $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; + continue; + } + + // Prepare to test for potential violations. Get primary keys and unique indexes + $mfields = array_merge( $fields, $rawfields ); + $keyFields = array_intersect( $ukeys, array_keys( $mfields ) ); + + if( empty( $ukeys ) or count( $keyFields ) == 0 ) { + // No unique keys in schema, so safe to insert + logMsg( "Either schema or data has no unique keys, so safe to insert" ); + $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; + continue; + } + + // Select record containing matching unique keys. + $where = ''; + foreach( $ukeys as $key ) { + if( isset( $mfields[$key] ) and $mfields[$key] ) { + if( $where ) $where .= ' AND '; + $where .= $key . ' = ' . $xmls->db->qstr( $mfields[$key] ); + } + } + $records = $xmls->db->Execute( 'SELECT * FROM ' . $table . ' WHERE ' . $where ); + switch( $records->RecordCount() ) { + case 0: + // No matching record, so safe to insert. + logMsg( "No matching records. Inserting new row with unique data" ); + $sql[] = $xmls->db->GetInsertSQL( $records, $mfields ); + break; + case 1: + // Exactly one matching record, so we can update if the mode permits. + logMsg( "One matching record..." ); + if( $mode == XMLS_MODE_UPDATE ) { + logMsg( "...Updating existing row from unique data" ); + $sql[] = $xmls->db->GetUpdateSQL( $records, $mfields ); + } + break; + default: + // More than one matching record; the result is ambiguous, so we must ignore the row. + logMsg( "More than one matching record. Ignoring row." ); + } + } + return $sql; + } +} + +/** +* Creates the SQL to execute a list of provided SQL queries +* +* @package axmls +* @access private +*/ +class dbQuerySet extends dbObject { + + /** + * @var array List of SQL queries + */ + var $queries = array(); + + /** + * @var string String used to build of a query line by line + */ + var $query; + + /** + * @var string Query prefix key + */ + var $prefixKey = ''; + + /** + * @var boolean Auto prefix enable (TRUE) + */ + var $prefixMethod = 'AUTO'; + + /** + * Initializes the query set. + * + * @param object $parent Parent object + * @param array $attributes Attributes + */ + function dbQuerySet( &$parent, $attributes = NULL ) { + $this->parent = $parent; + + // Overrides the manual prefix key + if( isset( $attributes['KEY'] ) ) { + $this->prefixKey = $attributes['KEY']; + } + + $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : ''; + + // Enables or disables automatic prefix prepending + switch( $prefixMethod ) { + case 'AUTO': + $this->prefixMethod = 'AUTO'; + break; + case 'MANUAL': + $this->prefixMethod = 'MANUAL'; + break; + case 'NONE': + $this->prefixMethod = 'NONE'; + break; + } + } + + /** + * XML Callback to process start elements. Elements currently + * processed are: QUERY. + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + $this->currentElement = strtoupper( $tag ); + + switch( $this->currentElement ) { + case 'QUERY': + // Create a new query in a SQL queryset. + // Ignore this query set if a platform is specified and it's different than the + // current connection platform. + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->newQuery(); + } else { + $this->discardQuery(); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + } + + /** + * XML Callback to process CDATA elements + */ + function _tag_cdata( &$parser, $cdata ) { + switch( $this->currentElement ) { + // Line of queryset SQL data + case 'QUERY': + $this->buildQuery( $cdata ); + break; + default: + + } + } + + /** + * XML Callback to process end elements + * + * @access private + */ + function _tag_close( &$parser, $tag ) { + $this->currentElement = ''; + + switch( strtoupper( $tag ) ) { + case 'QUERY': + // Add the finished query to the open query set. + $this->addQuery(); + break; + case 'SQL': + $this->parent->addSQL( $this->create( $this->parent ) ); + xml_set_object( $parser, $this->parent ); + $this->destroy(); + break; + default: + + } + } + + /** + * Re-initializes the query. + * + * @return boolean TRUE + */ + function newQuery() { + $this->query = ''; + + return TRUE; + } + + /** + * Discards the existing query. + * + * @return boolean TRUE + */ + function discardQuery() { + unset( $this->query ); + + return TRUE; + } + + /** + * Appends a line to a query that is being built line by line + * + * @param string $data Line of SQL data or NULL to initialize a new query + * @return string SQL query string. + */ + function buildQuery( $sql = NULL ) { + if( !isset( $this->query ) OR empty( $sql ) ) { + return FALSE; + } + + $this->query .= $sql; + + return $this->query; + } + + /** + * Adds a completed query to the query list + * + * @return string SQL of added query + */ + function addQuery() { + if( !isset( $this->query ) ) { + return FALSE; + } + + $this->queries[] = $return = trim($this->query); + + unset( $this->query ); + + return $return; + } + + /** + * Creates and returns the current query set + * + * @param object $xmls adoSchema object + * @return array Query set + */ + function create( &$xmls ) { + foreach( $this->queries as $id => $query ) { + switch( $this->prefixMethod ) { + case 'AUTO': + // Enable auto prefix replacement + + // Process object prefix. + // Evaluate SQL statements to prepend prefix to objects + $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); + + // SELECT statements aren't working yet + #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); + + case 'MANUAL': + // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX. + // If prefixKey is not set, we use the default constant XMLS_PREFIX + if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) { + // Enable prefix override + $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query ); + } else { + // Use default replacement + $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query ); + } + } + + $this->queries[$id] = trim( $query ); + } + + // Return the query set array + return $this->queries; + } + + /** + * Rebuilds the query with the prefix attached to any objects + * + * @param string $regex Regex used to add prefix + * @param string $query SQL query string + * @param string $prefix Prefix to be appended to tables, indices, etc. + * @return string Prefixed SQL query string. + */ + function prefixQuery( $regex, $query, $prefix = NULL ) { + if( !isset( $prefix ) ) { + return $query; + } + + if( preg_match( $regex, $query, $match ) ) { + $preamble = $match[1]; + $postamble = $match[5]; + $objectList = explode( ',', $match[3] ); + // $prefix = $prefix . '_'; + + $prefixedList = ''; + + foreach( $objectList as $object ) { + if( $prefixedList !== '' ) { + $prefixedList .= ', '; + } + + $prefixedList .= $prefix . trim( $object ); + } + + $query = $preamble . ' ' . $prefixedList . ' ' . $postamble; + } + + return $query; + } +} + +/** +* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements +* +* This class is used to load and parse the XML file, to create an array of SQL statements +* that can be used to build a database, and to build the database using the SQL array. +* +* @tutorial getting_started.pkg +* +* @author Richard Tango-Lowy & Dan Cech +* @version $Revision: 1.62 $ +* +* @package axmls +*/ +class adoSchema { + + /** + * @var array Array containing SQL queries to generate all objects + * @access private + */ + var $sqlArray; + + /** + * @var object ADOdb connection object + * @access private + */ + var $db; + + /** + * @var object ADOdb Data Dictionary + * @access private + */ + var $dict; + + /** + * @var string Current XML element + * @access private + */ + var $currentElement = ''; + + /** + * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database + * @access private + */ + var $upgrade = ''; + + /** + * @var string Optional object prefix + * @access private + */ + var $objectPrefix = ''; + + /** + * @var long Original Magic Quotes Runtime value + * @access private + */ + var $mgq; + + /** + * @var long System debug + * @access private + */ + var $debug; + + /** + * @var string Regular expression to find schema version + * @access private + */ + var $versionRegex = '/<schema.*?( version="([^"]*)")?.*?>/'; + + /** + * @var string Current schema version + * @access private + */ + var $schemaVersion; + + /** + * @var int Success of last Schema execution + */ + var $success; + + /** + * @var bool Execute SQL inline as it is generated + */ + var $executeInline; + + /** + * @var bool Continue SQL execution if errors occur + */ + var $continueOnError; + + /** + * @var int How to handle existing data rows (insert, update, or ignore) + */ + var $existingData; + + /** + * Creates an adoSchema object + * + * Creating an adoSchema object is the first step in processing an XML schema. + * The only parameter is an ADOdb database connection object, which must already + * have been created. + * + * @param object $db ADOdb database connection object. + */ + function adoSchema( &$db ) { + // Initialize the environment + $this->mgq = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + + $this->db = $db; + $this->debug = $this->db->debug; + $this->dict = NewDataDictionary( $this->db ); + $this->sqlArray = array(); + $this->schemaVersion = XMLS_SCHEMA_VERSION; + $this->executeInline( XMLS_EXECUTE_INLINE ); + $this->continueOnError( XMLS_CONTINUE_ON_ERROR ); + $this->existingData( XMLS_EXISTING_DATA ); + $this->setUpgradeMethod(); + } + + /** + * Sets the method to be used for upgrading an existing database + * + * Use this method to specify how existing database objects should be upgraded. + * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to + * alter each database object directly, REPLACE attempts to rebuild each object + * from scratch, BEST attempts to determine the best upgrade method for each + * object, and NONE disables upgrading. + * + * This method is not yet used by AXMLS, but exists for backward compatibility. + * The ALTER method is automatically assumed when the adoSchema object is + * instantiated; other upgrade methods are not currently supported. + * + * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE) + * @returns string Upgrade method used + */ + function SetUpgradeMethod( $method = '' ) { + if( !is_string( $method ) ) { + return FALSE; + } + + $method = strtoupper( $method ); + + // Handle the upgrade methods + switch( $method ) { + case 'ALTER': + $this->upgrade = $method; + break; + case 'REPLACE': + $this->upgrade = $method; + break; + case 'BEST': + $this->upgrade = 'ALTER'; + break; + case 'NONE': + $this->upgrade = 'NONE'; + break; + default: + // Use default if no legitimate method is passed. + $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD; + } + + return $this->upgrade; + } + + /** + * Specifies how to handle existing data row when there is a unique key conflict. + * + * The existingData setting specifies how the parser should handle existing rows + * when a unique key violation occurs during the insert. This can happen when inserting + * data into an existing table with one or more primary keys or unique indexes. + * The existingData method takes one of three options: XMLS_MODE_INSERT attempts + * to always insert the data as a new row. In the event of a unique key violation, + * the database will generate an error. XMLS_MODE_UPDATE attempts to update the + * any existing rows with the new data based upon primary or unique key fields in + * the schema. If the data row in the schema specifies no unique fields, the row + * data will be inserted as a new row. XMLS_MODE_IGNORE specifies that any data rows + * that would result in a unique key violation be ignored; no inserts or updates will + * take place. For backward compatibility, the default setting is XMLS_MODE_INSERT, + * but XMLS_MODE_UPDATE will generally be the most appropriate setting. + * + * @param int $mode XMLS_MODE_INSERT, XMLS_MODE_UPDATE, or XMLS_MODE_IGNORE + * @return int current mode + */ + function ExistingData( $mode = NULL ) { + if( is_int( $mode ) ) { + switch( $mode ) { + case XMLS_MODE_UPDATE: + $mode = XMLS_MODE_UPDATE; + break; + case XMLS_MODE_IGNORE: + $mode = XMLS_MODE_IGNORE; + break; + case XMLS_MODE_INSERT: + $mode = XMLS_MODE_INSERT; + break; + default: + $mode = XMLS_EXISTING_DATA; + break; + } + $this->existingData = $mode; + } + + return $this->existingData; + } + + /** + * Enables/disables inline SQL execution. + * + * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution), + * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode + * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema() + * to apply the schema to the database. + * + * @param bool $mode execute + * @return bool current execution mode + * + * @see ParseSchema(), ExecuteSchema() + */ + function ExecuteInline( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->executeInline = $mode; + } + + return $this->executeInline; + } + + /** + * Enables/disables SQL continue on error. + * + * Call this method to enable or disable continuation of SQL execution if an error occurs. + * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs. + * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing + * of the schema will continue. + * + * @param bool $mode execute + * @return bool current continueOnError mode + * + * @see addSQL(), ExecuteSchema() + */ + function ContinueOnError( $mode = NULL ) { + if( is_bool( $mode ) ) { + $this->continueOnError = $mode; + } + + return $this->continueOnError; + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to create the database + * described. This method automatically converts the schema to the latest + * axmls schema version. + * @see ParseSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function ParseSchema( $filename, $returnSchema = FALSE ) { + return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Loads an XML schema from a file and converts it to SQL. + * + * Call this method to load the specified schema directly from a file (see + * the DTD for the proper format) and generate the SQL necessary to create + * the database described by the schema. Use this method when you are dealing + * with large schema files. Otherwise, ParseSchema() is faster. + * This method does not automatically convert the schema to the latest axmls + * schema version. You must convert the schema manually using either the + * ConvertSchemaFile() or ConvertSchemaString() method. + * @see ParseSchema() + * @see ConvertSchemaFile() + * @see ConvertSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + * + * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() + * @see ParseSchema(), ParseSchemaString() + */ + function ParseSchemaFile( $filename, $returnSchema = FALSE ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + logMsg( 'Unable to open file' ); + return FALSE; + } + + // do version detection here + if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) { + logMsg( 'Invalid Schema Version' ); + return FALSE; + } + + if( $returnSchema ) { + $xmlstring = ''; + while( $data = fread( $fp, 4096 ) ) { + $xmlstring .= $data . "\n"; + } + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Converts an XML schema string to SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to create the database described by the schema. + * @see ParseSchema() + * + * @param string $xmlstring XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + logMsg( 'Empty or Invalid Schema' ); + return FALSE; + } + + // do version detection here + if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) { + logMsg( 'Invalid Schema Version' ); + return FALSE; + } + + if( $returnSchema ) { + return $xmlstring; + } + + $this->success = 2; + + $xmlParser = $this->create_parser(); + + if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { + die( sprintf( + "XML error: %s at line %d", + xml_error_string( xml_get_error_code( $xmlParser) ), + xml_get_current_line_number( $xmlParser) + ) ); + } + + xml_parser_free( $xmlParser ); + + return $this->sqlArray; + } + + /** + * Loads an XML schema from a file and converts it to uninstallation SQL. + * + * Call this method to load the specified schema (see the DTD for the proper format) from + * the filesystem and generate the SQL necessary to remove the database described. + * @see RemoveSchemaString() + * + * @param string $file Name of XML schema file. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute + */ + function RemoveSchema( $filename, $returnSchema = FALSE ) { + return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); + } + + /** + * Converts an XML schema string to uninstallation SQL. + * + * Call this method to parse a string containing an XML schema (see the DTD for the proper format) + * and generate the SQL necessary to uninstall the database described by the schema. + * @see RemoveSchema() + * + * @param string $schema XML schema string. + * @param bool $returnSchema Return schema rather than parsing. + * @return array Array of SQL queries, ready to execute. + */ + function RemoveSchemaString( $schema, $returnSchema = FALSE ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema ); + } + + /** + * Applies the current XML schema to the database (post execution). + * + * Call this method to apply the current schema (generally created by calling + * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes, + * and executing other SQL specified in the schema) after parsing. + * @see ParseSchema(), ParseSchemaString(), ExecuteInline() + * + * @param array $sqlArray Array of SQL statements that will be applied rather than + * the current schema. + * @param boolean $continueOnErr Continue to apply the schema even if an error occurs. + * @returns integer 0 if failure, 1 if errors, 2 if successful. + */ + function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) { + if( !is_bool( $continueOnErr ) ) { + $continueOnErr = $this->ContinueOnError(); + } + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + $this->success = 0; + } else { + $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr ); + } + + return $this->success; + } + + /** + * Returns the current SQL array. + * + * Call this method to fetch the array of SQL queries resulting from + * ParseSchema() or ParseSchemaString(). + * + * @param string $format Format: HTML, TEXT, or NONE (PHP array) + * @return array Array of SQL statements or FALSE if an error occurs + */ + function PrintSQL( $format = 'NONE' ) { + $sqlArray = null; + return $this->getSQL( $format, $sqlArray ); + } + + /** + * Saves the current SQL array to the local filesystem as a list of SQL queries. + * + * Call this method to save the array of SQL queries (generally resulting from a + * parsed XML schema) to the filesystem. + * + * @param string $filename Path and name where the file should be saved. + * @return boolean TRUE if save is successful, else FALSE. + */ + function SaveSQL( $filename = './schema.sql' ) { + + if( !isset( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + if( !isset( $sqlArray ) ) { + return FALSE; + } + + $fp = fopen( $filename, "w" ); + + foreach( $sqlArray as $key => $query ) { + fwrite( $fp, $query . ";\n" ); + } + fclose( $fp ); + } + + /** + * Create an xml parser + * + * @return object PHP XML parser object + * + * @access private + */ + function create_parser() { + // Create the parser + $xmlParser = xml_parser_create(); + xml_set_object( $xmlParser, $this ); + + // Initialize the XML callback functions + xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' ); + xml_set_character_data_handler( $xmlParser, '_tag_cdata' ); + + return $xmlParser; + } + + /** + * XML Callback to process start elements + * + * @access private + */ + function _tag_open( &$parser, $tag, $attributes ) { + switch( strtoupper( $tag ) ) { + case 'TABLE': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->obj = new dbTable( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + } + break; + case 'SQL': + if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { + $this->obj = new dbQuerySet( $this, $attributes ); + xml_set_object( $parser, $this->obj ); + } + break; + default: + // print_r( array( $tag, $attributes ) ); + } + + } + + /** + * XML Callback to process CDATA elements + * + * @access private + */ + function _tag_cdata( &$parser, $cdata ) { + } + + /** + * XML Callback to process end elements + * + * @access private + * @internal + */ + function _tag_close( &$parser, $tag ) { + + } + + /** + * Converts an XML schema string to the specified DTD version. + * + * Call this method to convert a string containing an XML schema to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaFile() + * + * @param string $schema String containing XML schema that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = $schema; + } else { + $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + /* + // compat for pre-4.3 - jlim + function _file_get_contents($path) + { + if (function_exists('file_get_contents')) return file_get_contents($path); + return join('',file($path)); + }*/ + + /** + * Converts an XML schema file to the specified DTD version. + * + * Call this method to convert the specified XML schema file to a different AXMLS + * DTD version. For instance, to convert a schema created for an pre-1.0 version for + * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version + * parameter is specified, the schema will be converted to the current DTD version. + * If the newFile parameter is provided, the converted schema will be written to the specified + * file. + * @see ConvertSchemaString() + * + * @param string $filename Name of XML schema file that will be converted. + * @param string $newVersion DTD version to convert to. + * @param string $newFile File name of (converted) output file. + * @return string Converted XML schema or FALSE if an error occurs. + */ + function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) { + + // grab current version + if( !( $version = $this->SchemaFileVersion( $filename ) ) ) { + return FALSE; + } + + if( !isset ($newVersion) ) { + $newVersion = $this->schemaVersion; + } + + if( $version == $newVersion ) { + $result = _file_get_contents( $filename ); + + // remove unicode BOM if present + if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) { + $result = substr( $result, 3 ); + } + } else { + $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' ); + } + + if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { + fwrite( $fp, $result ); + fclose( $fp ); + } + + return $result; + } + + function TransformSchema( $schema, $xsl, $schematype='string' ) + { + // Fail if XSLT extension is not available + if( ! function_exists( 'xslt_create' ) ) { + return FALSE; + } + + $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl'; + + // look for xsl + if( !is_readable( $xsl_file ) ) { + return FALSE; + } + + switch( $schematype ) + { + case 'file': + if( !is_readable( $schema ) ) { + return FALSE; + } + + $schema = _file_get_contents( $schema ); + break; + case 'string': + default: + if( !is_string( $schema ) ) { + return FALSE; + } + } + + $arguments = array ( + '/_xml' => $schema, + '/_xsl' => _file_get_contents( $xsl_file ) + ); + + // create an XSLT processor + $xh = xslt_create (); + + // set error handler + xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler')); + + // process the schema + $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); + + xslt_free ($xh); + + return $result; + } + + /** + * Processes XSLT transformation errors + * + * @param object $parser XML parser object + * @param integer $errno Error number + * @param integer $level Error level + * @param array $fields Error information fields + * + * @access private + */ + function xslt_error_handler( $parser, $errno, $level, $fields ) { + if( is_array( $fields ) ) { + $msg = array( + 'Message Type' => ucfirst( $fields['msgtype'] ), + 'Message Code' => $fields['code'], + 'Message' => $fields['msg'], + 'Error Number' => $errno, + 'Level' => $level + ); + + switch( $fields['URI'] ) { + case 'arg:/_xml': + $msg['Input'] = 'XML'; + break; + case 'arg:/_xsl': + $msg['Input'] = 'XSL'; + break; + default: + $msg['Input'] = $fields['URI']; + } + + $msg['Line'] = $fields['line']; + } else { + $msg = array( + 'Message Type' => 'Error', + 'Error Number' => $errno, + 'Level' => $level, + 'Fields' => var_export( $fields, TRUE ) + ); + } + + $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n" + . '<table>' . "\n"; + + foreach( $msg as $label => $details ) { + $error_details .= '<tr><td><b>' . $label . ': </b></td><td>' . htmlentities( $details ) . '</td></tr>' . "\n"; + } + + $error_details .= '</table>'; + + trigger_error( $error_details, E_USER_ERROR ); + } + + /** + * Returns the AXMLS Schema Version of the requested XML schema file. + * + * Call this method to obtain the AXMLS DTD version of the requested XML schema file. + * @see SchemaStringVersion() + * + * @param string $filename AXMLS schema file + * @return string Schema version number or FALSE on error + */ + function SchemaFileVersion( $filename ) { + // Open the file + if( !($fp = fopen( $filename, 'r' )) ) { + // die( 'Unable to open file' ); + return FALSE; + } + + // Process the file + while( $data = fread( $fp, 4096 ) ) { + if( preg_match( $this->versionRegex, $data, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + } + + return FALSE; + } + + /** + * Returns the AXMLS Schema Version of the provided XML schema string. + * + * Call this method to obtain the AXMLS DTD version of the provided XML schema string. + * @see SchemaFileVersion() + * + * @param string $xmlstring XML schema string + * @return string Schema version number or FALSE on error + */ + function SchemaStringVersion( $xmlstring ) { + if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { + return FALSE; + } + + if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) { + return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; + } + + return FALSE; + } + + /** + * Extracts an XML schema from an existing database. + * + * Call this method to create an XML schema string from an existing database. + * If the data parameter is set to TRUE, AXMLS will include the data from the database + * in the schema. + * + * @param boolean $data Include data in schema dump + * @indent string indentation to use + * @prefix string extract only tables with given prefix + * @stripprefix strip prefix string when storing in XML schema + * @return string Generated XML schema + */ + function ExtractSchema( $data = FALSE, $indent = ' ', $prefix = '' , $stripprefix=false) { + $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM ); + + $schema = '<?xml version="1.0"?>' . "\n" + . '<schema version="' . $this->schemaVersion . '">' . "\n"; + + if( is_array( $tables = $this->db->MetaTables( 'TABLES' , ($prefix) ? $prefix.'%' : '') ) ) { + foreach( $tables as $table ) { + if ($stripprefix) $table = str_replace(str_replace('\\_', '_', $pfx ), '', $table); + $schema .= $indent . '<table name="' . htmlentities( $table ) . '">' . "\n"; + + // grab details from database + $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE -1' ); + $fields = $this->db->MetaColumns( $table ); + $indexes = $this->db->MetaIndexes( $table ); + + if( is_array( $fields ) ) { + foreach( $fields as $details ) { + $extra = ''; + $content = array(); + + if( isset($details->max_length) && $details->max_length > 0 ) { + $extra .= ' size="' . $details->max_length . '"'; + } + + if( isset($details->primary_key) && $details->primary_key ) { + $content[] = '<KEY/>'; + } elseif( isset($details->not_null) && $details->not_null ) { + $content[] = '<NOTNULL/>'; + } + + if( isset($details->has_default) && $details->has_default ) { + $content[] = '<DEFAULT value="' . htmlentities( $details->default_value ) . '"/>'; + } + + if( isset($details->auto_increment) && $details->auto_increment ) { + $content[] = '<AUTOINCREMENT/>'; + } + + if( isset($details->unsigned) && $details->unsigned ) { + $content[] = '<UNSIGNED/>'; + } + + // this stops the creation of 'R' columns, + // AUTOINCREMENT is used to create auto columns + $details->primary_key = 0; + $type = $rs->MetaType( $details ); + + $schema .= str_repeat( $indent, 2 ) . '<field name="' . htmlentities( $details->name ) . '" type="' . $type . '"' . $extra; + + if( !empty( $content ) ) { + $schema .= ">\n" . str_repeat( $indent, 3 ) + . implode( "\n" . str_repeat( $indent, 3 ), $content ) . "\n" + . str_repeat( $indent, 2 ) . '</field>' . "\n"; + } else { + $schema .= "/>\n"; + } + } + } + + if( is_array( $indexes ) ) { + foreach( $indexes as $index => $details ) { + $schema .= str_repeat( $indent, 2 ) . '<index name="' . $index . '">' . "\n"; + + if( $details['unique'] ) { + $schema .= str_repeat( $indent, 3 ) . '<UNIQUE/>' . "\n"; + } + + foreach( $details['columns'] as $column ) { + $schema .= str_repeat( $indent, 3 ) . '<col>' . htmlentities( $column ) . '</col>' . "\n"; + } + + $schema .= str_repeat( $indent, 2 ) . '</index>' . "\n"; + } + } + + if( $data ) { + $rs = $this->db->Execute( 'SELECT * FROM ' . $table ); + + if( is_object( $rs ) && !$rs->EOF ) { + $schema .= str_repeat( $indent, 2 ) . "<data>\n"; + + while( $row = $rs->FetchRow() ) { + foreach( $row as $key => $val ) { + if ( $val != htmlentities( $val ) ) { + $row[$key] = '<![CDATA[' . $val . ']]>'; + } + } + + $schema .= str_repeat( $indent, 3 ) . '<row><f>' . implode( '</f><f>', $row ) . "</f></row>\n"; + } + + $schema .= str_repeat( $indent, 2 ) . "</data>\n"; + } + } + + $schema .= $indent . "</table>\n"; + } + } + + $this->db->SetFetchMode( $old_mode ); + + $schema .= '</schema>'; + return $schema; + } + + /** + * Sets a prefix for database objects + * + * Call this method to set a standard prefix that will be prepended to all database tables + * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix. + * + * @param string $prefix Prefix that will be prepended. + * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix. + * @return boolean TRUE if successful, else FALSE + */ + function SetPrefix( $prefix = '', $underscore = TRUE ) { + switch( TRUE ) { + // clear prefix + case empty( $prefix ): + logMsg( 'Cleared prefix' ); + $this->objectPrefix = ''; + return TRUE; + // prefix too long + case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: + // prefix contains invalid characters + case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ): + logMsg( 'Invalid prefix: ' . $prefix ); + return FALSE; + } + + if( $underscore AND substr( $prefix, -1 ) != '_' ) { + $prefix .= '_'; + } + + // prefix valid + logMsg( 'Set prefix: ' . $prefix ); + $this->objectPrefix = $prefix; + return TRUE; + } + + /** + * Returns an object name with the current prefix prepended. + * + * @param string $name Name + * @return string Prefixed name + * + * @access private + */ + function prefix( $name = '' ) { + // if prefix is set + if( !empty( $this->objectPrefix ) ) { + // Prepend the object prefix to the table name + // prepend after quote if used + return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name ); + } + + // No prefix set. Use name provided. + return $name; + } + + /** + * Checks if element references a specific platform + * + * @param string $platform Requested platform + * @returns boolean TRUE if platform check succeeds + * + * @access private + */ + function supportedPlatform( $platform = NULL ) { + if( !empty( $platform ) ) { + $regex = '/(^|\|)' . $this->db->databaseType . '(\||$)/i'; + + if( preg_match( '/^- /', $platform ) ) { + if (preg_match ( $regex, substr( $platform, 2 ) ) ) { + logMsg( 'Platform ' . $platform . ' is NOT supported' ); + return FALSE; + } + } else { + if( !preg_match ( $regex, $platform ) ) { + logMsg( 'Platform ' . $platform . ' is NOT supported' ); + return FALSE; + } + } + } + + logMsg( 'Platform ' . $platform . ' is supported' ); + return TRUE; + } + + /** + * Clears the array of generated SQL. + * + * @access private + */ + function clearSQL() { + $this->sqlArray = array(); + } + + /** + * Adds SQL into the SQL array. + * + * @param mixed $sql SQL to Add + * @return boolean TRUE if successful, else FALSE. + * + * @access private + */ + function addSQL( $sql = NULL ) { + if( is_array( $sql ) ) { + foreach( $sql as $line ) { + $this->addSQL( $line ); + } + + return TRUE; + } + + if( is_string( $sql ) ) { + $this->sqlArray[] = $sql; + + // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL. + if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) { + $saved = $this->db->debug; + $this->db->debug = $this->debug; + $ok = $this->db->Execute( $sql ); + $this->db->debug = $saved; + + if( !$ok ) { + if( $this->debug ) { + ADOConnection::outp( $this->db->ErrorMsg() ); + } + + $this->success = 1; + } + } + + return TRUE; + } + + return FALSE; + } + + /** + * Gets the SQL array in the specified format. + * + * @param string $format Format + * @return mixed SQL + * + * @access private + */ + function getSQL( $format = NULL, $sqlArray = NULL ) { + if( !is_array( $sqlArray ) ) { + $sqlArray = $this->sqlArray; + } + + if( !is_array( $sqlArray ) ) { + return FALSE; + } + + switch( strtolower( $format ) ) { + case 'string': + case 'text': + return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : ''; + case'html': + return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : ''; + } + + return $this->sqlArray; + } + + /** + * Destroys an adoSchema object. + * + * Call this method to clean up after an adoSchema object that is no longer in use. + * @deprecated adoSchema now cleans up automatically. + */ + function Destroy() { + set_magic_quotes_runtime( $this->mgq ); + unset( $this ); + } +} + +/** +* Message logging function +* +* @access private +*/ +function logMsg( $msg, $title = NULL, $force = FALSE ) { + if( XMLS_DEBUG or $force ) { + echo '<pre>'; + + if( isset( $title ) ) { + echo '<h3>' . htmlentities( $title ) . '</h3>'; + } + + if( @is_object( $this ) ) { + echo '[' . get_class( $this ) . '] '; + } + + print_r( $msg ); + + echo '</pre>'; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/adodb.inc.php b/pos/is4c-nf/lib/adodb5/adodb.inc.php new file mode 100644 index 000000000..02b375aeb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/adodb.inc.php @@ -0,0 +1,4400 @@ +<?php +/* + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://adodb.sourceforge.net + * + * This is the main include file for ADOdb. + * Database specific drivers are stored in the adodb/drivers/adodb-*.inc.php + * + * The ADOdb files are formatted so that doxygen can be used to generate documentation. + * Doxygen is a documentation generation tool and can be downloaded from http://doxygen.org/ + */ + +/** + \mainpage + + @version V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + + Released under both BSD license and Lesser GPL library license. You can choose which license + you prefer. + + PHP's database access functions are not standardised. This creates a need for a database + class library to hide the differences between the different database API's (encapsulate + the differences) so we can easily switch databases. + + We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, DB2, + Informix, PostgreSQL, FrontBase, Interbase (Firebird and Borland variants), Foxpro, Access, + ADO, SAP DB, SQLite and ODBC. We have had successful reports of connecting to Progress and + other databases via ODBC. + + Latest Download at http://adodb.sourceforge.net/ + + */ + + if (!defined('_ADODB_LAYER')) { + define('_ADODB_LAYER',1); + + //============================================================================================== + // CONSTANT DEFINITIONS + //============================================================================================== + + + /** + * Set ADODB_DIR to the directory where this file resides... + * This constant was formerly called $ADODB_RootPath + */ + if (!defined('ADODB_DIR')) define('ADODB_DIR',dirname(__FILE__)); + + //============================================================================================== + // GLOBAL VARIABLES + //============================================================================================== + + GLOBAL + $ADODB_vers, // database version + $ADODB_COUNTRECS, // count number of records returned - slows down query + $ADODB_CACHE_DIR, // directory to cache recordsets + $ADODB_CACHE, + $ADODB_CACHE_CLASS, + $ADODB_EXTENSION, // ADODB extension installed + $ADODB_COMPAT_FETCH, // If $ADODB_COUNTRECS and this is true, $rs->fields is available on EOF + $ADODB_FETCH_MODE, // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default... + $ADODB_GETONE_EOF, + $ADODB_QUOTE_FIELDNAMES; // Allows you to force quotes (backticks) around field names in queries generated by getinsertsql and getupdatesql. + + //============================================================================================== + // GLOBAL SETUP + //============================================================================================== + + $ADODB_EXTENSION = defined('ADODB_EXTENSION'); + + //********************************************************// + /* + Controls $ADODB_FORCE_TYPE mode. Default is ADODB_FORCE_VALUE (3). + Used in GetUpdateSql and GetInsertSql functions. Thx to Niko, nuko#mbnet.fi + + 0 = ignore empty fields. All empty fields in array are ignored. + 1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values. + 2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values. + 3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and empty fields '' are set to empty '' sql values. + */ + define('ADODB_FORCE_IGNORE',0); + define('ADODB_FORCE_NULL',1); + define('ADODB_FORCE_EMPTY',2); + define('ADODB_FORCE_VALUE',3); + //********************************************************// + + + if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) { + + define('ADODB_BAD_RS','<p>Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;</p>'); + + // allow [ ] @ ` " and . in table names + define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)'); + + // prefetching used by oracle + if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10); + + + /* + Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names. + This currently works only with mssql, odbc, oci8po and ibase derived drivers. + + 0 = assoc lowercase field names. $rs->fields['orderid'] + 1 = assoc uppercase field names. $rs->fields['ORDERID'] + 2 = use native-case field names. $rs->fields['OrderID'] + */ + + define('ADODB_FETCH_DEFAULT',0); + define('ADODB_FETCH_NUM',1); + define('ADODB_FETCH_ASSOC',2); + define('ADODB_FETCH_BOTH',3); + + if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100); + + // PHP's version scheme makes converting to numbers difficult - workaround + $_adodb_ver = (float) PHP_VERSION; + if ($_adodb_ver >= 5.2) { + define('ADODB_PHPVER',0x5200); + } else if ($_adodb_ver >= 5.0) { + define('ADODB_PHPVER',0x5000); + } else + die("PHP5 or later required. You are running ".PHP_VERSION); + } + + + //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); + + + /** + Accepts $src and $dest arrays, replacing string $data + */ + function ADODB_str_replace($src, $dest, $data) + { + if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data); + + $s = reset($src); + $d = reset($dest); + while ($s !== false) { + $data = str_replace($s,$d,$data); + $s = next($src); + $d = next($dest); + } + return $data; + } + + function ADODB_Setup() + { + GLOBAL + $ADODB_vers, // database version + $ADODB_COUNTRECS, // count number of records returned - slows down query + $ADODB_CACHE_DIR, // directory to cache recordsets + $ADODB_FETCH_MODE, + $ADODB_CACHE, + $ADODB_CACHE_CLASS, + $ADODB_FORCE_TYPE, + $ADODB_GETONE_EOF, + $ADODB_QUOTE_FIELDNAMES; + + if (empty($ADODB_CACHE_CLASS)) $ADODB_CACHE_CLASS = 'ADODB_Cache_File' ; + $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT; + $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE; + $ADODB_GETONE_EOF = null; + + if (!isset($ADODB_CACHE_DIR)) { + $ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp'; + } else { + // do not accept url based paths, eg. http:/ or ftp:/ + if (strpos($ADODB_CACHE_DIR,'://') !== false) + die("Illegal path http:// or ftp://"); + } + + + // Initialize random number generator for randomizing cache flushes + // -- note Since PHP 4.2.0, the seed becomes optional and defaults to a random value if omitted. + srand(((double)microtime())*1000000); + + /** + * ADODB version as a string. + */ + $ADODB_vers = 'V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. Released BSD & LGPL.'; + + /** + * Determines whether recordset->RecordCount() is used. + * Set to false for highest performance -- RecordCount() will always return -1 then + * for databases that provide "virtual" recordcounts... + */ + if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true; + } + + + //============================================================================================== + // CHANGE NOTHING BELOW UNLESS YOU ARE DESIGNING ADODB + //============================================================================================== + + ADODB_Setup(); + + //============================================================================================== + // CLASS ADOFieldObject + //============================================================================================== + /** + * Helper class for FetchFields -- holds info on a column + */ + class ADOFieldObject { + var $name = ''; + var $max_length=0; + var $type=""; +/* + // additional fields by dannym... (danny_milo@yahoo.com) + var $not_null = false; + // actually, this has already been built-in in the postgres, fbsql AND mysql module? ^-^ + // so we can as well make not_null standard (leaving it at "false" does not harm anyways) + + var $has_default = false; // this one I have done only in mysql and postgres for now ... + // others to come (dannym) + var $default_value; // default, if any, and supported. Check has_default first. +*/ + } + + // for transaction handling + + function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection) + { + //print "Errorno ($fn errno=$errno m=$errmsg) "; + $thisConnection->_transOK = false; + if ($thisConnection->_oldRaiseFn) { + $fn = $thisConnection->_oldRaiseFn; + $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection); + } + } + + //------------------ + // class for caching + class ADODB_Cache_File { + + var $createdir = true; // requires creation of temp dirs + + function ADODB_Cache_File() + { + global $ADODB_INCLUDED_CSV; + if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); + } + + // write serialised recordset to cache item/file + function writecache($filename, $contents, $debug, $secs2cache) + { + return adodb_write_file($filename, $contents,$debug); + } + + // load serialised recordset and unserialise it + function &readcache($filename, &$err, $secs2cache, $rsClass) + { + $rs = csv2rs($filename,$err,$secs2cache,$rsClass); + return $rs; + } + + // flush all items in cache + function flushall($debug=false) + { + global $ADODB_CACHE_DIR; + + $rez = false; + + if (strlen($ADODB_CACHE_DIR) > 1) { + $rez = $this->_dirFlush($ADODB_CACHE_DIR); + if ($debug) ADOConnection::outp( "flushall: $dir<br><pre>\n". $rez."</pre>"); + } + return $rez; + } + + // flush one file in cache + function flushcache($f, $debug=false) + { + if (!@unlink($f)) { + if ($debug) ADOConnection::outp( "flushcache: failed for $f"); + } + } + + function getdirname($hash) + { + global $ADODB_CACHE_DIR; + if (!isset($this->notSafeMode)) $this->notSafeMode = !ini_get('safe_mode'); + return ($this->notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($hash,0,2) : $ADODB_CACHE_DIR; + } + + // create temp directories + function createdir($hash, $debug) + { + $dir = $this->getdirname($hash); + if ($this->notSafeMode && !file_exists($dir)) { + $oldu = umask(0); + if (!@mkdir($dir,0771)) if(!is_dir($dir) && $debug) ADOConnection::outp("Cannot create $dir"); + umask($oldu); + } + + return $dir; + } + + /** + * Private function to erase all of the files and subdirectories in a directory. + * + * Just specify the directory, and tell it if you want to delete the directory or just clear it out. + * Note: $kill_top_level is used internally in the function to flush subdirectories. + */ + function _dirFlush($dir, $kill_top_level = false) + { + if(!$dh = @opendir($dir)) return; + + while (($obj = readdir($dh))) { + if($obj=='.' || $obj=='..') continue; + $f = $dir.'/'.$obj; + + if (strpos($obj,'.cache')) @unlink($f); + if (is_dir($f)) $this->_dirFlush($f, true); + } + if ($kill_top_level === true) @rmdir($dir); + return true; + } + } + + //============================================================================================== + // CLASS ADOConnection + //============================================================================================== + + /** + * Connection object. For connecting to databases, and executing queries. + */ + class ADOConnection { + // + // PUBLIC VARS + // + var $dataProvider = 'native'; + var $databaseType = ''; /// RDBMS currently in use, eg. odbc, mysql, mssql + var $database = ''; /// Name of database to be used. + var $host = ''; /// The hostname of the database server + var $user = ''; /// The username which is used to connect to the database server. + var $password = ''; /// Password for the username. For security, we no longer store it. + var $debug = false; /// if set to true will output sql statements + var $maxblobsize = 262144; /// maximum size of blobs or large text fields (262144 = 256K)-- some db's die otherwise like foxpro + var $concat_operator = '+'; /// default concat operator -- change to || for Oracle/Interbase + var $substr = 'substr'; /// substring operator + var $length = 'length'; /// string length ofperator + var $random = 'rand()'; /// random function + var $upperCase = 'upper'; /// uppercase function + var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d, h:i:s A'"; /// used by DBTimeStamp as the default timestamp fmt. + var $true = '1'; /// string that represents TRUE for a database + var $false = '0'; /// string that represents FALSE for a database + var $replaceQuote = "\\'"; /// string to use to replace quotes + var $nameQuote = '"'; /// string to use to quote identifiers and names + var $charSet=false; /// character set to use - only for interbase, postgres and oci8 + var $metaDatabasesSQL = ''; + var $metaTablesSQL = ''; + var $uniqueOrderBy = false; /// All order by columns have to be unique + var $emptyDate = '&nbsp;'; + var $emptyTimeStamp = '&nbsp;'; + var $lastInsID = false; + //-- + var $hasInsertID = false; /// supports autoincrement ID? + var $hasAffectedRows = false; /// supports affected rows for update/delete? + var $hasTop = false; /// support mssql/access SELECT TOP 10 * FROM TABLE + var $hasLimit = false; /// support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + var $readOnly = false; /// this is a readonly database - used by phpLens + var $hasMoveFirst = false; /// has ability to run MoveFirst(), scrolling backwards + var $hasGenID = false; /// can generate sequences using GenID(); + var $hasTransactions = true; /// has transactions + //-- + var $genID = 0; /// sequence id used by GenID(); + var $raiseErrorFn = false; /// error function to call + var $isoDates = false; /// accepts dates in ISO format + var $cacheSecs = 3600; /// cache for 1 hour + + // memcache + var $memCache = false; /// should we use memCache instead of caching in files + var $memCacheHost; /// memCache host + var $memCachePort = 11211; /// memCache port + var $memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) + + var $sysDate = false; /// name of function that returns the current date + var $sysTimeStamp = false; /// name of function that returns the current timestamp + var $sysUTimeStamp = false; // name of function that returns the current timestamp accurate to the microsecond or nearest fraction + var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets + + var $noNullStrings = false; /// oracle specific stuff - if true ensures that '' is converted to ' ' + var $numCacheHits = 0; + var $numCacheMisses = 0; + var $pageExecuteCountRows = true; + var $uniqueSort = false; /// indicates that all fields in order by must be unique + var $leftOuter = false; /// operator to use for left outer join in WHERE clause + var $rightOuter = false; /// operator to use for right outer join in WHERE clause + var $ansiOuter = false; /// whether ansi outer join syntax supported + var $autoRollback = false; // autoRollback on PConnect(). + var $poorAffectedRows = false; // affectedRows not working or unreliable + + var $fnExecute = false; + var $fnCacheExecute = false; + var $blobEncodeType = false; // false=not required, 'I'=encode to integer, 'C'=encode to char + var $rsPrefix = "ADORecordSet_"; + + var $autoCommit = true; /// do not modify this yourself - actually private + var $transOff = 0; /// temporarily disable transactions + var $transCnt = 0; /// count of nested transactions + + var $fetchMode=false; + + var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null + // + // PRIVATE VARS + // + var $_oldRaiseFn = false; + var $_transOK = null; + var $_connectionID = false; /// The returned link identifier whenever a successful database connection is made. + var $_errorMsg = false; /// A variable which was used to keep the returned last error message. The value will + /// then returned by the errorMsg() function + var $_errorCode = false; /// Last error code, not guaranteed to be used - only by oci8 + var $_queryID = false; /// This variable keeps the last created result link identifier + + var $_isPersistentConnection = false; /// A boolean variable to state whether its a persistent connection or normal connection. */ + var $_bindInputArray = false; /// set to true if ADOConnection.Execute() permits binding of array parameters. + var $_evalAll = false; + var $_affected = false; + var $_logsql = false; + var $_transmode = ''; // transaction mode + + + + /** + * Constructor + */ + function ADOConnection() + { + die('Virtual Class -- cannot instantiate'); + } + + static function Version() + { + global $ADODB_vers; + + return (float) substr($ADODB_vers,1); + } + + /** + Get server version info... + + @returns An array with 2 elements: $arr['string'] is the description string, + and $arr[version] is the version (also a string). + */ + function ServerInfo() + { + return array('description' => '', 'version' => ''); + } + + function IsConnected() + { + return !empty($this->_connectionID); + } + + function _findvers($str) + { + if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1]; + else return ''; + } + + /** + * All error messages go through this bottleneck function. + * You can define your own handler by defining the function name in ADODB_OUTP. + */ + static function outp($msg,$newline=true) + { + global $ADODB_FLUSH,$ADODB_OUTP; + + if (defined('ADODB_OUTP')) { + $fn = ADODB_OUTP; + $fn($msg,$newline); + return; + } else if (isset($ADODB_OUTP)) { + $fn = $ADODB_OUTP; + $fn($msg,$newline); + return; + } + + if ($newline) $msg .= "<br>\n"; + + if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg; + else echo strip_tags($msg); + + + if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan + + } + + function Time() + { + $rs = $this->_Execute("select $this->sysTimeStamp"); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + + /** + * Connect to database + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * @param [forceNew] force new connection + * + * @return true or false + */ + function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false) + { + if ($argHostname != "") $this->host = $argHostname; + if ($argUsername != "") $this->user = $argUsername; + if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons + if ($argDatabaseName != "") $this->database = $argDatabaseName; + + $this->_isPersistentConnection = false; + + global $ADODB_CACHE; + if (empty($ADODB_CACHE)) $this->_CreateCache(); + + if ($forceNew) { + if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true; + } else { + if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true; + } + if (isset($rez)) { + $err = $this->ErrorMsg(); + if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; + $ret = false; + } else { + $err = "Missing extension for ".$this->dataProvider; + $ret = 0; + } + if ($fn = $this->raiseErrorFn) + $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); + + + $this->_connectionID = false; + if ($this->debug) ADOConnection::outp( $this->host.': '.$err); + return $ret; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName); + } + + + /** + * Always force a new connection to database - currently only works with oracle + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * + * @return true or false + */ + function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") + { + return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true); + } + + /** + * Establish persistent connect to database + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * + * @return return true or false + */ + function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") + { + + if (defined('ADODB_NEVER_PERSIST')) + return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName); + + if ($argHostname != "") $this->host = $argHostname; + if ($argUsername != "") $this->user = $argUsername; + if ($argPassword != "") $this->password = $argPassword; + if ($argDatabaseName != "") $this->database = $argDatabaseName; + + $this->_isPersistentConnection = true; + + global $ADODB_CACHE; + if (empty($ADODB_CACHE)) $this->_CreateCache(); + + if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true; + if (isset($rez)) { + $err = $this->ErrorMsg(); + if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; + $ret = false; + } else { + $err = "Missing extension for ".$this->dataProvider; + $ret = 0; + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); + } + + $this->_connectionID = false; + if ($this->debug) ADOConnection::outp( $this->host.': '.$err); + return $ret; + } + + function outp_throw($msg,$src='WARN',$sql='') + { + if (defined('ADODB_ERROR_HANDLER') && ADODB_ERROR_HANDLER == 'adodb_throw') { + adodb_throw($this->databaseType,$src,-9999,$msg,$sql,false,$this); + return; + } + ADOConnection::outp($msg); + } + + // create cache class. Code is backward compat with old memcache implementation + function _CreateCache() + { + global $ADODB_CACHE, $ADODB_CACHE_CLASS; + + if ($this->memCache) { + global $ADODB_INCLUDED_MEMCACHE; + + if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); + $ADODB_CACHE = new ADODB_Cache_MemCache($this); + } else + $ADODB_CACHE = new $ADODB_CACHE_CLASS($this); + + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysDate; + return $col; // child class implement + } + + /** + * Should prepare the sql statement and return the stmt resource. + * For databases that do not support this, we return the $sql. To ensure + * compatibility with databases that do not support prepare: + * + * $stmt = $db->Prepare("insert into table (id, name) values (?,?)"); + * $db->Execute($stmt,array(1,'Jill')) or die('insert failed'); + * $db->Execute($stmt,array(2,'Joe')) or die('insert failed'); + * + * @param sql SQL to send to database + * + * @return return FALSE, or the prepared statement, or the original sql if + * if the database does not support prepare. + * + */ + function Prepare($sql) + { + return $sql; + } + + /** + * Some databases, eg. mssql require a different function for preparing + * stored procedures. So we cannot use Prepare(). + * + * Should prepare the stored procedure and return the stmt resource. + * For databases that do not support this, we return the $sql. To ensure + * compatibility with databases that do not support prepare: + * + * @param sql SQL to send to database + * + * @return return FALSE, or the prepared statement, or the original sql if + * if the database does not support prepare. + * + */ + function PrepareSP($sql,$param=true) + { + return $this->Prepare($sql,$param); + } + + /** + * PEAR DB Compat + */ + function Quote($s) + { + return $this->qstr($s,false); + } + + /** + Requested by "Karsten Dambekalns" <k.dambekalns@fishfarm.de> + */ + function QMagic($s) + { + return $this->qstr($s,get_magic_quotes_gpc()); + } + + function q(&$s) + { + #if (!empty($this->qNull)) if ($s == 'null') return $s; + $s = $this->qstr($s,false); + } + + /** + * PEAR DB Compat - do not use internally. + */ + function ErrorNative() + { + return $this->ErrorNo(); + } + + + /** + * PEAR DB Compat - do not use internally. + */ + function nextId($seq_name) + { + return $this->GenID($seq_name); + } + + /** + * Lock a row, will escalate and lock the table if row locking not supported + * will normally free the lock at the end of the transaction + * + * @param $table name of table to lock + * @param $where where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock + */ + function RowLock($table,$where) + { + return false; + } + + function CommitLock($table) + { + return $this->CommitTrans(); + } + + function RollbackLock($table) + { + return $this->RollbackTrans(); + } + + /** + * PEAR DB Compat - do not use internally. + * + * The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical + * for easy porting :-) + * + * @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM + * @returns The previous fetch mode + */ + function SetFetchMode($mode) + { + $old = $this->fetchMode; + $this->fetchMode = $mode; + + if ($old === false) { + global $ADODB_FETCH_MODE; + return $ADODB_FETCH_MODE; + } + return $old; + } + + + /** + * PEAR DB Compat - do not use internally. + */ + function Query($sql, $inputarr=false) + { + $rs = $this->Execute($sql, $inputarr); + if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); + return $rs; + } + + + /** + * PEAR DB Compat - do not use internally + */ + function LimitQuery($sql, $offset, $count, $params=false) + { + $rs = $this->SelectLimit($sql, $count, $offset, $params); + if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); + return $rs; + } + + + /** + * PEAR DB Compat - do not use internally + */ + function Disconnect() + { + return $this->Close(); + } + + /* + Returns placeholder for parameter, eg. + $DB->Param('a') + + will return ':a' for Oracle, and '?' for most other databases... + + For databases that require positioned params, eg $1, $2, $3 for postgresql, + pass in Param(false) before setting the first parameter. + */ + function Param($name,$type='C') + { + return '?'; + } + + /* + InParameter and OutParameter are self-documenting versions of Parameter(). + */ + function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + return $this->Parameter($stmt,$var,$name,false,$maxLen,$type); + } + + /* + */ + function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + return $this->Parameter($stmt,$var,$name,true,$maxLen,$type); + + } + + + /* + Usage in oracle + $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',64); + $db->Execute(); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + */ + function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) + { + return false; + } + + + function IgnoreErrors($saveErrs=false) + { + if (!$saveErrs) { + $saveErrs = array($this->raiseErrorFn,$this->_transOK); + $this->raiseErrorFn = false; + return $saveErrs; + } else { + $this->raiseErrorFn = $saveErrs[0]; + $this->_transOK = $saveErrs[1]; + } + } + + /** + Improved method of initiating a transaction. Used together with CompleteTrans(). + Advantages include: + + a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans. + Only the outermost block is treated as a transaction.<br> + b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.<br> + c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block + are disabled, making it backward compatible. + */ + function StartTrans($errfn = 'ADODB_TransMonitor') + { + if ($this->transOff > 0) { + $this->transOff += 1; + return true; + } + + $this->_oldRaiseFn = $this->raiseErrorFn; + $this->raiseErrorFn = $errfn; + $this->_transOK = true; + + if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans"); + $ok = $this->BeginTrans(); + $this->transOff = 1; + return $ok; + } + + + /** + Used together with StartTrans() to end a transaction. Monitors connection + for sql errors, and will commit or rollback as appropriate. + + @autoComplete if true, monitor sql errors and commit and rollback as appropriate, + and if set to false force rollback even if no SQL error detected. + @returns true on commit, false on rollback. + */ + function CompleteTrans($autoComplete = true) + { + if ($this->transOff > 1) { + $this->transOff -= 1; + return true; + } + $this->raiseErrorFn = $this->_oldRaiseFn; + + $this->transOff = 0; + if ($this->_transOK && $autoComplete) { + if (!$this->CommitTrans()) { + $this->_transOK = false; + if ($this->debug) ADOConnection::outp("Smart Commit failed"); + } else + if ($this->debug) ADOConnection::outp("Smart Commit occurred"); + } else { + $this->_transOK = false; + $this->RollbackTrans(); + if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred"); + } + + return $this->_transOK; + } + + /* + At the end of a StartTrans/CompleteTrans block, perform a rollback. + */ + function FailTrans() + { + if ($this->debug) + if ($this->transOff == 0) { + ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans"); + } else { + ADOConnection::outp("FailTrans was called"); + adodb_backtrace(); + } + $this->_transOK = false; + } + + /** + Check if transaction has failed, only for Smart Transactions. + */ + function HasFailedTrans() + { + if ($this->transOff > 0) return $this->_transOK == false; + return false; + } + + /** + * Execute SQL + * + * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) + * @param [inputarr] holds the input data to bind to. Null elements will be set to null. + * @return RecordSet or false + */ + function Execute($sql,$inputarr=false) + { + if ($this->fnExecute) { + $fn = $this->fnExecute; + $ret = $fn($this,$sql,$inputarr); + if (isset($ret)) return $ret; + } + if ($inputarr) { + if (!is_array($inputarr)) $inputarr = array($inputarr); + + $element0 = reset($inputarr); + # is_object check because oci8 descriptors can be passed in + $array_2d = is_array($element0) && !is_object(reset($element0)); + //remove extra memory copy of input -mikefedyk + unset($element0); + + if (!is_array($sql) && !$this->_bindInputArray) { + $sqlarr = explode('?',$sql); + $nparams = sizeof($sqlarr)-1; + if (!$array_2d) $inputarr = array($inputarr); + foreach($inputarr as $arr) { + $sql = ''; $i = 0; + //Use each() instead of foreach to reduce memory usage -mikefedyk + while(list(, $v) = each($arr)) { + $sql .= $sqlarr[$i]; + // from Ron Baldwin <ron.baldwin#sourceprose.com> + // Only quote string types + $typ = gettype($v); + if ($typ == 'string') + //New memory copy of input created here -mikefedyk + $sql .= $this->qstr($v); + else if ($typ == 'double') + $sql .= str_replace(',','.',$v); // locales fix so 1.1 does not get converted to 1,1 + else if ($typ == 'boolean') + $sql .= $v ? $this->true : $this->false; + else if ($typ == 'object') { + if (method_exists($v, '__toString')) $sql .= $this->qstr($v->__toString()); + else $sql .= $this->qstr((string) $v); + } else if ($v === null) + $sql .= 'NULL'; + else + $sql .= $v; + $i += 1; + + if ($i == $nparams) break; + } // while + if (isset($sqlarr[$i])) { + $sql .= $sqlarr[$i]; + if ($i+1 != sizeof($sqlarr)) $this->outp_throw( "Input Array does not match ?: ".htmlspecialchars($sql),'Execute'); + } else if ($i != sizeof($sqlarr)) + $this->outp_throw( "Input array does not match ?: ".htmlspecialchars($sql),'Execute'); + + $ret = $this->_Execute($sql); + if (!$ret) return $ret; + } + } else { + if ($array_2d) { + if (is_string($sql)) + $stmt = $this->Prepare($sql); + else + $stmt = $sql; + + foreach($inputarr as $arr) { + $ret = $this->_Execute($stmt,$arr); + if (!$ret) return $ret; + } + } else { + $ret = $this->_Execute($sql,$inputarr); + } + } + } else { + $ret = $this->_Execute($sql,false); + } + + return $ret; + } + + + function _Execute($sql,$inputarr=false) + { + if ($this->debug) { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr); + } else { + $this->_queryID = @$this->_query($sql,$inputarr); + } + + /************************ + // OK, query executed + *************************/ + + if ($this->_queryID === false) { // error handling if query fails + if ($this->debug == 99) adodb_backtrace(true,5); + $fn = $this->raiseErrorFn; + if ($fn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this); + } + $false = false; + return $false; + } + + if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead + $rsclass = $this->rsPrefix.'empty'; + $rs = (class_exists($rsclass)) ? new $rsclass(): new ADORecordSet_empty(); + + return $rs; + } + + // return real recordset from select statement + $rsclass = $this->rsPrefix.$this->databaseType; + $rs = new $rsclass($this->_queryID,$this->fetchMode); + $rs->connection = $this; // Pablo suggestion + $rs->Init(); + if (is_array($sql)) $rs->sql = $sql[0]; + else $rs->sql = $sql; + if ($rs->_numOfRows <= 0) { + global $ADODB_COUNTRECS; + if ($ADODB_COUNTRECS) { + if (!$rs->EOF) { + $rs = $this->_rs2rs($rs,-1,-1,!is_array($sql)); + $rs->_queryID = $this->_queryID; + } else + $rs->_numOfRows = 0; + } + } + return $rs; + } + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if (empty($this->_genSeqSQL)) return false; + return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); + } + + function DropSequence($seqname='adodbseq') + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /** + * Generates a sequence id and stores it in $this->genID; + * GenID is only available if $this->hasGenID = true; + * + * @param seqname name of sequence to use + * @param startID if sequence does not exist, start at this ID + * @return 0 if not supported, otherwise a sequence id + */ + function GenID($seqname='adodbseq',$startID=1) + { + if (!$this->hasGenID) { + return 0; // formerly returns false pre 1.60 + } + + $getnext = sprintf($this->_genIDSQL,$seqname); + + $holdtransOK = $this->_transOK; + + $save_handler = $this->raiseErrorFn; + $this->raiseErrorFn = ''; + @($rs = $this->Execute($getnext)); + $this->raiseErrorFn = $save_handler; + + if (!$rs) { + $this->_transOK = $holdtransOK; //if the status was ok before reset + $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); + $rs = $this->Execute($getnext); + } + if ($rs && !$rs->EOF) $this->genID = reset($rs->fields); + else $this->genID = 0; // false + + if ($rs) $rs->Close(); + + return $this->genID; + } + + /** + * @param $table string name of the table, not needed by all databases (eg. mysql), default '' + * @param $column string name of the column, not needed by all databases (eg. mysql), default '' + * @return the last inserted ID. Not all databases support this. + */ + function Insert_ID($table='',$column='') + { + if ($this->_logsql && $this->lastInsID) return $this->lastInsID; + if ($this->hasInsertID) return $this->_insertid($table,$column); + if ($this->debug) { + ADOConnection::outp( '<p>Insert_ID error</p>'); + adodb_backtrace(); + } + return false; + } + + + /** + * Portable Insert ID. Pablo Roca <pabloroca#mvps.org> + * + * @return the last inserted ID. All databases support this. But aware possible + * problems in multiuser environments. Heavy test this before deploying. + */ + function PO_Insert_ID($table="", $id="") + { + if ($this->hasInsertID){ + return $this->Insert_ID($table,$id); + } else { + return $this->GetOne("SELECT MAX($id) FROM $table"); + } + } + + /** + * @return # rows affected by UPDATE/DELETE + */ + function Affected_Rows() + { + if ($this->hasAffectedRows) { + if ($this->fnExecute === 'adodb_log_sql') { + if ($this->_logsql && $this->_affected !== false) return $this->_affected; + } + $val = $this->_affectedrows(); + return ($val < 0) ? false : $val; + } + + if ($this->debug) ADOConnection::outp( '<p>Affected_Rows error</p>',false); + return false; + } + + + /** + * @return the last error message + */ + function ErrorMsg() + { + if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg; + else return ''; + } + + + /** + * @return the last error number. Normally 0 means no error. + */ + function ErrorNo() + { + return ($this->_errorMsg) ? -1 : 0; + } + + function MetaError($err=false) + { + include_once(ADODB_DIR."/adodb-error.inc.php"); + if ($err === false) $err = $this->ErrorNo(); + return adodb_error($this->dataProvider,$this->databaseType,$err); + } + + function MetaErrorMsg($errno) + { + include_once(ADODB_DIR."/adodb-error.inc.php"); + return adodb_errormsg($errno); + } + + /** + * @returns an array with the primary key columns in it. + */ + function MetaPrimaryKeys($table, $owner=false) + { + // owner not used in base class - see oci8 + $p = array(); + $objs = $this->MetaColumns($table); + if ($objs) { + foreach($objs as $v) { + if (!empty($v->primary_key)) + $p[] = $v->name; + } + } + if (sizeof($p)) return $p; + if (function_exists('ADODB_VIEW_PRIMARYKEYS')) + return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner); + return false; + } + + /** + * @returns assoc array where keys are tables, and values are foreign keys + */ + function MetaForeignKeys($table, $owner=false, $upper=false) + { + return false; + } + /** + * Choose a database to connect to. Many databases do not support this. + * + * @param dbName is the name of the database to select + * @return true or false + */ + function SelectDB($dbName) + {return false;} + + + /** + * Will select, getting rows from $offset (1-based), for $nrows. + * This simulates the MySQL "select * from table limit $offset,$nrows" , and + * the PostgreSQL "select * from table limit $nrows offset $offset". Note that + * MySQL and PostgreSQL parameter ordering is the opposite of the other. + * eg. + * SelectLimit('select * from table',3); will return rows 1 to 3 (1-based) + * SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based) + * + * Uses SELECT TOP for Microsoft databases (when $this->hasTop is set) + * BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set + * + * @param sql + * @param [offset] is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to get + * @param [inputarr] array of bind variables + * @param [secs2cache] is a private parameter only used by jlim + * @return the recordset ($rs->databaseType == 'array') + */ + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($this->hasTop && $nrows > 0) { + // suggested by Reinhard Balling. Access requires top after distinct + // Informix requires first before distinct - F Riosa + $ismssql = (strpos($this->databaseType,'mssql') !== false); + if ($ismssql) $isaccess = false; + else $isaccess = (strpos($this->databaseType,'access') !== false); + + if ($offset <= 0) { + + // access includes ties in result + if ($isaccess) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + + if ($secs2cache != 0) { + $ret = $this->CacheExecute($secs2cache, $sql,$inputarr); + } else { + $ret = $this->Execute($sql,$inputarr); + } + return $ret; // PHP5 fix + } else if ($ismssql){ + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + } else { + $sql = preg_replace( + '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + } + } else { + $nn = $nrows + $offset; + if ($isaccess || $ismssql) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); + } else { + $sql = preg_replace( + '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); + } + } + } + + // if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows + // 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS. + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + + if ($secs2cache != 0) $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + else $rs = $this->Execute($sql,$inputarr); + + $ADODB_COUNTRECS = $savec; + if ($rs && !$rs->EOF) { + $rs = $this->_rs2rs($rs,$nrows,$offset); + } + //print_r($rs); + return $rs; + } + + /** + * Create serializable recordset. Breaks rs link to connection. + * + * @param rs the recordset to serialize + */ + function SerializableRS(&$rs) + { + $rs2 = $this->_rs2rs($rs); + $ignore = false; + $rs2->connection = $ignore; + + return $rs2; + } + + /** + * Convert database recordset to an array recordset + * input recordset's cursor should be at beginning, and + * old $rs will be closed. + * + * @param rs the recordset to copy + * @param [nrows] number of rows to retrieve (optional) + * @param [offset] offset by number of rows (optional) + * @return the new recordset + */ + function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true) + { + if (! $rs) { + $false = false; + return $false; + } + $dbtype = $rs->databaseType; + if (!$dbtype) { + $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ? + return $rs; + } + if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) { + $rs->MoveFirst(); + $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ? + return $rs; + } + $flds = array(); + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { + $flds[] = $rs->FetchField($i); + } + + $arr = $rs->GetArrayLimit($nrows,$offset); + //print_r($arr); + if ($close) $rs->Close(); + + $arrayClass = $this->arrayClass; + + $rs2 = new $arrayClass(); + $rs2->connection = $this; + $rs2->sql = $rs->sql; + $rs2->dataProvider = $this->dataProvider; + $rs2->InitArrayFields($arr,$flds); + $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; + return $rs2; + } + + /* + * Return all rows. Compat with PEAR DB + */ + function GetAll($sql, $inputarr=false) + { + $arr = $this->GetArray($sql,$inputarr); + return $arr; + } + + function GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false) + { + $rs = $this->Execute($sql, $inputarr); + if (!$rs) { + $false = false; + return $false; + } + $arr = $rs->GetAssoc($force_array,$first2cols); + return $arr; + } + + function CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false) + { + if (!is_numeric($secs2cache)) { + $first2cols = $force_array; + $force_array = $inputarr; + } + $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); + if (!$rs) { + $false = false; + return $false; + } + $arr = $rs->GetAssoc($force_array,$first2cols); + return $arr; + } + + /** + * Return first element of first row of sql statement. Recordset is disposed + * for you. + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetOne($sql,$inputarr=false) + { + global $ADODB_COUNTRECS,$ADODB_GETONE_EOF; + $crecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + $ret = false; + $rs = $this->Execute($sql,$inputarr); + if ($rs) { + if ($rs->EOF) $ret = $ADODB_GETONE_EOF; + else $ret = reset($rs->fields); + + $rs->Close(); + } + $ADODB_COUNTRECS = $crecs; + return $ret; + } + + // $where should include 'WHERE fld=value' + function GetMedian($table, $field,$where = '') + { + $total = $this->GetOne("select count(*) from $table $where"); + if (!$total) return false; + + $midrow = (integer) ($total/2); + $rs = $this->SelectLimit("select $field from $table $where order by 1",1,$midrow); + if ($rs && !$rs->EOF) return reset($rs->fields); + return false; + } + + + function CacheGetOne($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_GETONE_EOF; + $ret = false; + $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + if ($rs) { + if ($rs->EOF) $ret = $ADODB_GETONE_EOF; + else $ret = reset($rs->fields); + $rs->Close(); + } + + return $ret; + } + + function GetCol($sql, $inputarr = false, $trim = false) + { + + $rs = $this->Execute($sql, $inputarr); + if ($rs) { + $rv = array(); + if ($trim) { + while (!$rs->EOF) { + $rv[] = trim(reset($rs->fields)); + $rs->MoveNext(); + } + } else { + while (!$rs->EOF) { + $rv[] = reset($rs->fields); + $rs->MoveNext(); + } + } + $rs->Close(); + } else + $rv = false; + return $rv; + } + + function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false) + { + $rs = $this->CacheExecute($secs, $sql, $inputarr); + if ($rs) { + $rv = array(); + if ($trim) { + while (!$rs->EOF) { + $rv[] = trim(reset($rs->fields)); + $rs->MoveNext(); + } + } else { + while (!$rs->EOF) { + $rv[] = reset($rs->fields); + $rs->MoveNext(); + } + } + $rs->Close(); + } else + $rv = false; + + return $rv; + } + + function Transpose(&$rs,$addfieldnames=true) + { + $rs2 = $this->_rs2rs($rs); + $false = false; + if (!$rs2) return $false; + + $rs2->_transpose($addfieldnames); + return $rs2; + } + + /* + Calculate the offset of a date for a particular database and generate + appropriate SQL. Useful for calculating future/past dates and storing + in a database. + + If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour. + */ + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + return '('.$date.'+'.$dayFraction.')'; + } + + + /** + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetArray($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $rs = $this->Execute($sql,$inputarr); + $ADODB_COUNTRECS = $savec; + if (!$rs) + if (defined('ADODB_PEAR')) { + $cls = ADODB_PEAR_Error(); + return $cls; + } else { + $false = false; + return $false; + } + $arr = $rs->GetArray(); + $rs->Close(); + return $arr; + } + + function CacheGetAll($secs2cache,$sql=false,$inputarr=false) + { + $arr = $this->CacheGetArray($secs2cache,$sql,$inputarr); + return $arr; + } + + function CacheGetArray($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + $ADODB_COUNTRECS = $savec; + + if (!$rs) + if (defined('ADODB_PEAR')) { + $cls = ADODB_PEAR_Error(); + return $cls; + } else { + $false = false; + return $false; + } + $arr = $rs->GetArray(); + $rs->Close(); + return $arr; + } + + function GetRandRow($sql, $arr= false) + { + $rezarr = $this->GetAll($sql, $arr); + $sz = sizeof($rezarr); + return $rezarr[abs(rand()) % $sz]; + } + + /** + * Return one row of sql statement. Recordset is disposed for you. + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetRow($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + $crecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + $rs = $this->Execute($sql,$inputarr); + + $ADODB_COUNTRECS = $crecs; + if ($rs) { + if (!$rs->EOF) $arr = $rs->fields; + else $arr = array(); + $rs->Close(); + return $arr; + } + + $false = false; + return $false; + } + + function CacheGetRow($secs2cache,$sql=false,$inputarr=false) + { + $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); + if ($rs) { + if (!$rs->EOF) $arr = $rs->fields; + else $arr = array(); + + $rs->Close(); + return $arr; + } + $false = false; + return $false; + } + + /** + * Insert or replace a single record. Note: this is not the same as MySQL's replace. + * ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL. + * Also note that no table locking is done currently, so it is possible that the + * record be inserted twice by two programs... + * + * $this->Replace('products', array('prodname' =>"'Nails'","price" => 3.99), 'prodname'); + * + * $table table name + * $fieldArray associative array of data (you must quote strings yourself). + * $keyCol the primary key field name or if compound key, array of field names + * autoQuote set to true to use a hueristic to quote strings. Works with nulls and numbers + * but does not work with dates nor SQL functions. + * has_autoinc the primary key is an auto-inc field, so skip in insert. + * + * Currently blob replace not supported + * + * returns 0 = fail, 1 = update, 2 = insert + */ + + function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + + return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc); + } + + + /** + * Will select, getting rows from $offset (1-based), for $nrows. + * This simulates the MySQL "select * from table limit $offset,$nrows" , and + * the PostgreSQL "select * from table limit $nrows offset $offset". Note that + * MySQL and PostgreSQL parameter ordering is the opposite of the other. + * eg. + * CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based) + * CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based) + * + * BUG: Currently CacheSelectLimit fails with $sql with LIMIT or TOP clause already set + * + * @param [secs2cache] seconds to cache data, set to 0 to force query. This is optional + * @param sql + * @param [offset] is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to get + * @param [inputarr] array of bind variables + * @return the recordset ($rs->databaseType == 'array') + */ + function CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false) + { + if (!is_numeric($secs2cache)) { + if ($sql === false) $sql = -1; + if ($offset == -1) $offset = false; + // sql, nrows, offset,inputarr + $rs = $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs); + } else { + if ($sql === false) $this->outp_throw("Warning: \$sql missing from CacheSelectLimit()",'CacheSelectLimit'); + $rs = $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + } + return $rs; + } + + + /** + * Flush cached recordsets that match a particular $sql statement. + * If $sql == false, then we purge all files in the cache. + */ + + /** + * Flush cached recordsets that match a particular $sql statement. + * If $sql == false, then we purge all files in the cache. + */ + function CacheFlush($sql=false,$inputarr=false) + { + global $ADODB_CACHE_DIR, $ADODB_CACHE; + + if (!$sql) { + $ADODB_CACHE->flushall($this->debug); + return; + } + + $f = $this->_gencachename($sql.serialize($inputarr),false); + return $ADODB_CACHE->flushcache($f, $this->debug); + } + + + /** + * Private function to generate filename for caching. + * Filename is generated based on: + * + * - sql statement + * - database type (oci8, ibase, ifx, etc) + * - database name + * - userid + * - setFetchMode (adodb 4.23) + * + * When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR). + * Assuming that we can have 50,000 files per directory with good performance, + * then we can scale to 12.8 million unique cached recordsets. Wow! + */ + function _gencachename($sql,$createdir) + { + global $ADODB_CACHE, $ADODB_CACHE_DIR; + + if ($this->fetchMode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } else { + $mode = $this->fetchMode; + } + $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode); + if (!$ADODB_CACHE->createdir) return $m; + if (!$createdir) $dir = $ADODB_CACHE->getdirname($m); + else $dir = $ADODB_CACHE->createdir($m, $this->debug); + + return $dir.'/adodb_'.$m.'.cache'; + } + + + /** + * Execute SQL, caching recordsets. + * + * @param [secs2cache] seconds to cache data, set to 0 to force query. + * This is an optional parameter. + * @param sql SQL statement to execute + * @param [inputarr] holds the input data to bind to + * @return RecordSet or false + */ + function CacheExecute($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_CACHE; + + if (!is_numeric($secs2cache)) { + $inputarr = $sql; + $sql = $secs2cache; + $secs2cache = $this->cacheSecs; + } + + if (is_array($sql)) { + $sqlparam = $sql; + $sql = $sql[0]; + } else + $sqlparam = $sql; + + + $md5file = $this->_gencachename($sql.serialize($inputarr),true); + $err = ''; + + if ($secs2cache > 0){ + $rs = $ADODB_CACHE->readcache($md5file,$err,$secs2cache,$this->arrayClass); + $this->numCacheHits += 1; + } else { + $err='Timeout 1'; + $rs = false; + $this->numCacheMisses += 1; + } + + if (!$rs) { + // no cached rs found + if ($this->debug) { + if (get_magic_quotes_runtime() && !$this->memCache) { + ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :("); + } + if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)"); + } + + $rs = $this->Execute($sqlparam,$inputarr); + + if ($rs) { + + $eof = $rs->EOF; + $rs = $this->_rs2rs($rs); // read entire recordset into memory immediately + $rs->timeCreated = time(); // used by caching + $txt = _rs2serialize($rs,false,$sql); // serialize + + $ok = $ADODB_CACHE->writecache($md5file,$txt,$this->debug, $secs2cache); + if (!$ok) { + if ($ok === false) { + $em = 'Cache write error'; + $en = -32000; + + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'CacheExecute', $en, $em, $md5file,$sql,$this); + } + } else { + $em = 'Cache file locked warning'; + $en = -32001; + // do not call error handling for just a warning + } + + if ($this->debug) ADOConnection::outp( " ".$em); + } + if ($rs->EOF && !$eof) { + $rs->MoveFirst(); + //$rs = csv2rs($md5file,$err); + $rs->connection = $this; // Pablo suggestion + } + + } else if (!$this->memCache) + $ADODB_CACHE->flushcache($md5file); + } else { + $this->_errorMsg = ''; + $this->_errorCode = 0; + + if ($this->fnCacheExecute) { + $fn = $this->fnCacheExecute; + $fn($this, $secs2cache, $sql, $inputarr); + } + // ok, set cached object found + $rs->connection = $this; // Pablo suggestion + if ($this->debug){ + if ($this->debug == 99) adodb_backtrace(); + $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); + $ttl = $rs->timeCreated + $secs2cache - time(); + $s = is_array($sql) ? $sql[0] : $sql; + if ($inBrowser) $s = '<i>'.htmlspecialchars($s).'</i>'; + + ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]"); + } + } + return $rs; + } + + + /* + Similar to PEAR DB's autoExecute(), except that + $mode can be 'INSERT' or 'UPDATE' or DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + If $mode == 'UPDATE', then $where is compulsory as a safety measure. + + $forceUpdate means that even if the data has not changed, perform update. + */ + function AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false) + { + $false = false; + $sql = 'SELECT * FROM '.$table; + if ($where!==FALSE) $sql .= ' WHERE '.$where; + else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) { + $this->outp_throw('AutoExecute: Illegal mode=UPDATE with empty WHERE clause','AutoExecute'); + return $false; + } + + $rs = $this->SelectLimit($sql,1); + if (!$rs) return $false; // table does not exist + $rs->tableName = $table; + + switch((string) $mode) { + case 'UPDATE': + case '2': + $sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq); + break; + case 'INSERT': + case '1': + $sql = $this->GetInsertSQL($rs, $fields_values, $magicq); + break; + default: + $this->outp_throw("AutoExecute: Unknown mode=$mode",'AutoExecute'); + return $false; + } + $ret = false; + if ($sql) $ret = $this->Execute($sql); + if ($ret) $ret = true; + return $ret; + } + + + /** + * Generates an Update Query based on an existing recordset. + * $arrFields is an associative array of fields with the value + * that should be assigned. + * + * Note: This function should only be used on a recordset + * that is run against a single table and sql should only + * be a simple select stmt with no groupby/orderby/limit + * + * "Jonathan Younger" <jyounger@unilab.com> + */ + function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=null) + { + global $ADODB_INCLUDED_LIB; + + //********************************************************// + //This is here to maintain compatibility + //with older adodb versions. Sets force type to force nulls if $forcenulls is set. + if (!isset($force)) { + global $ADODB_FORCE_TYPE; + $force = $ADODB_FORCE_TYPE; + } + //********************************************************// + + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$force); + } + + /** + * Generates an Insert Query based on an existing recordset. + * $arrFields is an associative array of fields with the value + * that should be assigned. + * + * Note: This function should only be used on a recordset + * that is run against a single table. + */ + function GetInsertSQL(&$rs, $arrFields,$magicq=false,$force=null) + { + global $ADODB_INCLUDED_LIB; + if (!isset($force)) { + global $ADODB_FORCE_TYPE; + $force = $ADODB_FORCE_TYPE; + + } + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$force); + } + + + /** + * Update a blob column, given a where clause. There are more sophisticated + * blob handling functions that we could have implemented, but all require + * a very complex API. Instead we have chosen something that is extremely + * simple to understand and use. + * + * Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course. + * + * Usage to update a $blobvalue which has a primary key blob_id=1 into a + * field blobtable.blobcolumn: + * + * UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1'); + * + * Insert example: + * + * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + * $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + /** + * Usage: + * UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1'); + * + * $blobtype supports 'BLOB' and 'CLOB' + * + * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + * $conn->UpdateBlob('blobtable','blobcol',$blobpath,'id=1'); + */ + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + $fd = fopen($path,'rb'); + if ($fd === false) return false; + $val = fread($fd,filesize($path)); + fclose($fd); + return $this->UpdateBlob($table,$column,$val,$where,$blobtype); + } + + function BlobDecode($blob) + { + return $blob; + } + + function BlobEncode($blob) + { + return $blob; + } + + function SetCharSet($charset) + { + return false; + } + + function IfNull( $field, $ifNull ) + { + return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; + } + + function LogSQL($enable=true) + { + include_once(ADODB_DIR.'/adodb-perf.inc.php'); + + if ($enable) $this->fnExecute = 'adodb_log_sql'; + else $this->fnExecute = false; + + $old = $this->_logsql; + $this->_logsql = $enable; + if ($enable && !$old) $this->_affected = false; + return $old; + } + + function GetCharSet() + { + return false; + } + + /** + * Usage: + * UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB'); + * + * $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)'); + * $conn->UpdateClob('clobtable','clobcol',$clob,'id=1'); + */ + function UpdateClob($table,$column,$val,$where) + { + return $this->UpdateBlob($table,$column,$val,$where,'CLOB'); + } + + // not the fastest implementation - quick and dirty - jlim + // for best performance, use the actual $rs->MetaType(). + function MetaType($t,$len=-1,$fieldobj=false) + { + + if (empty($this->_metars)) { + $rsclass = $this->rsPrefix.$this->databaseType; + $this->_metars = new $rsclass(false,$this->fetchMode); + $this->_metars->connection = $this; + } + return $this->_metars->MetaType($t,$len,$fieldobj); + } + + + /** + * Change the SQL connection locale to a specified locale. + * This is used to get the date formats written depending on the client locale. + */ + function SetDateLocale($locale = 'En') + { + $this->locale = $locale; + switch (strtoupper($locale)) + { + case 'EN': + $this->fmtDate="'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + break; + + case 'US': + $this->fmtDate = "'m-d-Y'"; + $this->fmtTimeStamp = "'m-d-Y H:i:s'"; + break; + + case 'PT_BR': + case 'NL': + case 'FR': + case 'RO': + case 'IT': + $this->fmtDate="'d-m-Y'"; + $this->fmtTimeStamp = "'d-m-Y H:i:s'"; + break; + + case 'GE': + $this->fmtDate="'d.m.Y'"; + $this->fmtTimeStamp = "'d.m.Y H:i:s'"; + break; + + default: + $this->fmtDate="'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + break; + } + } + + /** + * GetActiveRecordsClass Performs an 'ALL' query + * + * @param mixed $class This string represents the class of the current active record + * @param mixed $table Table used by the active record object + * @param mixed $whereOrderBy Where, order, by clauses + * @param mixed $bindarr + * @param mixed $primkeyArr + * @param array $extra Query extras: limit, offset... + * @param mixed $relations Associative array: table's foreign name, "hasMany", "belongsTo" + * @access public + * @return void + */ + function GetActiveRecordsClass( + $class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false, + $extra=array(), + $relations=array()) + { + global $_ADODB_ACTIVE_DBS; + ## reduce overhead of adodb.inc.php -- moved to adodb-active-record.inc.php + ## if adodb-active-recordx is loaded -- should be no issue as they will probably use Find() + if (!isset($_ADODB_ACTIVE_DBS))include_once(ADODB_DIR.'/adodb-active-record.inc.php'); + return adodb_GetActiveRecordsClass($this, $class, $table, $whereOrderBy, $bindarr, $primkeyArr, $extra, $relations); + } + + function GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false) + { + $arr = $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr); + return $arr; + } + + /** + * Close Connection + */ + function Close() + { + $rez = $this->_close(); + $this->_connectionID = false; + return $rez; + } + + /** + * Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans(). + * + * @return true if succeeded or false if database does not support transactions + */ + function BeginTrans() + { + if ($this->debug) ADOConnection::outp("BeginTrans: Transactions not supported for this driver"); + return false; + } + + /* set transaction mode */ + function SetTransactionMode( $transaction_mode ) + { + $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider); + $this->_transmode = $transaction_mode; + } +/* +http://msdn2.microsoft.com/en-US/ms173763.aspx +http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-isolation.html +http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html +http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm +*/ + function MetaTransaction($mode,$db) + { + $mode = strtoupper($mode); + $mode = str_replace('ISOLATION LEVEL ','',$mode); + + switch($mode) { + + case 'READ UNCOMMITTED': + switch($db) { + case 'oci8': + case 'oracle': + return 'ISOLATION LEVEL READ COMMITTED'; + default: + return 'ISOLATION LEVEL READ UNCOMMITTED'; + } + break; + + case 'READ COMMITTED': + return 'ISOLATION LEVEL READ COMMITTED'; + break; + + case 'REPEATABLE READ': + switch($db) { + case 'oci8': + case 'oracle': + return 'ISOLATION LEVEL SERIALIZABLE'; + default: + return 'ISOLATION LEVEL REPEATABLE READ'; + } + break; + + case 'SERIALIZABLE': + return 'ISOLATION LEVEL SERIALIZABLE'; + break; + + default: + return $mode; + } + } + + /** + * If database does not support transactions, always return true as data always commited + * + * @param $ok set to false to rollback transaction, true to commit + * + * @return true/false. + */ + function CommitTrans($ok=true) + { return true;} + + + /** + * If database does not support transactions, rollbacks always fail, so return false + * + * @return true/false. + */ + function RollbackTrans() + { return false;} + + + /** + * return the databases that the driver can connect to. + * Some databases will return an empty array. + * + * @return an array of database names. + */ + function MetaDatabases() + { + global $ADODB_FETCH_MODE; + + if ($this->metaDatabasesSQL) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $arr = $this->GetCol($this->metaDatabasesSQL); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + return $arr; + } + + return false; + } + + + /** + * @param ttype can either be 'VIEW' or 'TABLE' or false. + * If false, both views and tables are returned. + * "VIEW" returns only views + * "TABLE" returns only tables + * @param showSchema returns the schema/user with the table name, eg. USER.TABLE + * @param mask is the input mask - only supported by oci8 and postgresql + * + * @return array of tables for current database. + */ + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + global $ADODB_FETCH_MODE; + + + $false = false; + if ($mask) { + return $false; + } + if ($this->metaTablesSQL) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute($this->metaTablesSQL); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) return $false; + $arr = $rs->GetArray(); + $arr2 = array(); + + if ($hast = ($ttype && isset($arr[0][1]))) { + $showt = strncmp($ttype,'T',1); + } + + for ($i=0; $i < sizeof($arr); $i++) { + if ($hast) { + if ($showt == 0) { + if (strncmp($arr[$i][1],'T',1) == 0) $arr2[] = trim($arr[$i][0]); + } else { + if (strncmp($arr[$i][1],'V',1) == 0) $arr2[] = trim($arr[$i][0]); + } + } else + $arr2[] = trim($arr[$i][0]); + } + $rs->Close(); + return $arr2; + } + return $false; + } + + + function _findschema(&$table,&$schema) + { + if (!$schema && ($at = strpos($table,'.')) !== false) { + $schema = substr($table,0,$at); + $table = substr($table,$at+1); + } + } + + /** + * List columns in a database as an array of ADOFieldObjects. + * See top of file for definition of object. + * + * @param $table table name to query + * @param $normalize makes table name case-insensitive (required by some databases) + * @schema is optional database schema to use - not supported by all databases. + * + * @return array of ADOFieldObjects for current table. + */ + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + + if (!empty($this->metaColumnsSQL)) { + + $schema = false; + $this->_findschema($table,$schema); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs === false || $rs->EOF) return $false; + + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + if (isset($rs->fields[3]) && $rs->fields[3]) { + if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3]; + $fld->scale = $rs->fields[4]; + if ($fld->scale>0) $fld->max_length += 1; + } else + $fld->max_length = $rs->fields[2]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return $false; + } + + /** + * List indexes on a table as an array. + * @param table table name to query + * @param primary true to only show primary keys. Not actually used for most databases + * + * @return array of indexes on current table. Each element represents an index, and is itself an associative array. + + Array ( + [name_of_index] => Array + ( + [unique] => true or false + [columns] => Array + ( + [0] => firstname + [1] => lastname + ) + ) + */ + function MetaIndexes($table, $primary = false, $owner = false) + { + $false = false; + return $false; + } + + /** + * List columns names in a table as an array. + * @param table table name to query + * + * @return array of column names for current table. + */ + function MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */) + { + $objarr = $this->MetaColumns($table); + if (!is_array($objarr)) { + $false = false; + return $false; + } + $arr = array(); + if ($numIndexes) { + $i = 0; + if ($useattnum) { + foreach($objarr as $v) + $arr[$v->attnum] = $v->name; + + } else + foreach($objarr as $v) $arr[$i++] = $v->name; + } else + foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name; + + return $arr; + } + + /** + * Different SQL databases used different methods to combine strings together. + * This function provides a wrapper. + * + * param s variable number of string parameters + * + * Usage: $db->Concat($str1,$str2); + * + * @return concatenated string + */ + function Concat() + { + $arr = func_get_args(); + return implode($this->concat_operator, $arr); + } + + + /** + * Converts a date "d" to a string that the database can understand. + * + * @param d a date in Unix date time format. + * + * @return date string in database date format + */ + function DBDate($d, $isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return $d; + + if (is_object($d)) return $d->format($this->fmtDate); + + + if (is_string($d) && !is_numeric($d)) { + if ($d === 'null' || strncmp($d,"'",1) === 0) return $d; + if ($this->isoDates) return "'$d'"; + $d = ADOConnection::UnixDate($d); + } + + return adodb_date($this->fmtDate,$d); + } + + function BindDate($d) + { + $d = $this->DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($d) + { + $d = $this->DBTimeStamp($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + + /** + * Converts a timestamp "ts" to a string that the database can understand. + * + * @param ts a timestamp in Unix date time format. + * + * @return timestamp string in database timestamp format + */ + function DBTimeStamp($ts,$isfld=false) + { + if (empty($ts) && $ts !== 0) return 'null'; + if ($isfld) return $ts; + if (is_object($ts)) return $ts->format($this->fmtTimeStamp); + + # strlen(14) allows YYYYMMDDHHMMSS format + if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14)) + return adodb_date($this->fmtTimeStamp,$ts); + + if ($ts === 'null') return $ts; + if ($this->isoDates && strlen($ts) !== 14) return "'$ts'"; + + $ts = ADOConnection::UnixTimeStamp($ts); + return adodb_date($this->fmtTimeStamp,$ts); + } + + /** + * Also in ADORecordSet. + * @param $v is a date string in YYYY-MM-DD format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixDate($v) + { + if (is_object($v)) { + // odbtp support + //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) + return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); + } + + if (is_numeric($v) && strlen($v) !== 8) return $v; + if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|", + ($v), $rr)) return false; + + if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0; + // h-m-s-MM-DD-YY + return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); + } + + + /** + * Also in ADORecordSet. + * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixTimeStamp($v) + { + if (is_object($v)) { + // odbtp support + //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) + return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); + } + + if (!preg_match( + "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", + ($v), $rr)) return false; + + if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0; + + // h-m-s-MM-DD-YY + if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); + return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]); + } + + /** + * Also in ADORecordSet. + * + * Format database date based on user defined format. + * + * @param v is the character date in YYYY-MM-DD format, returned by database + * @param fmt is the format to apply to it, using date() + * + * @return a date formated as user desires + */ + + function UserDate($v,$fmt='Y-m-d',$gmt=false) + { + $tt = $this->UnixDate($v); + + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + else if ($tt == 0) return $this->emptyDate; + else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR + } + + return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); + + } + + /** + * + * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format + * @param fmt is the format to apply to it, using date() + * + * @return a timestamp formated as user desires + */ + function UserTimeStamp($v,$fmt='Y-m-d H:i:s',$gmt=false) + { + if (!isset($v)) return $this->emptyTimeStamp; + # strlen(14) allows YYYYMMDDHHMMSS format + if (is_numeric($v) && strlen($v)<14) return ($gmt) ? adodb_gmdate($fmt,$v) : adodb_date($fmt,$v); + $tt = $this->UnixTimeStamp($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + if ($tt == 0) return $this->emptyTimeStamp; + return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); + } + + function escape($s,$magic_quotes=false) + { + return $this->addq($s,$magic_quotes); + } + + /** + * Quotes a string, without prefixing nor appending quotes. + */ + function addq($s,$magic_quotes=false) + { + if (!$magic_quotes) { + + if ($this->replaceQuote[0] == '\\'){ + // only since php 4.0.5 + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); + } + return str_replace("'",$this->replaceQuote,$s); + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + + if ($this->replaceQuote == "\\'" || ini_get('magic_quotes_sybase')) // ' already quoted, no need to change anything + return $s; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return str_replace("\\'",$this->replaceQuote,$s); + } + } + + /** + * Correctly quotes a string so that all strings are escaped. We prefix and append + * to the string single-quotes. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + if (!$magic_quotes) { + + if ($this->replaceQuote[0] == '\\'){ + // only since php 4.0.5 + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + + if ($this->replaceQuote == "\\'" || ini_get('magic_quotes_sybase')) // ' already quoted, no need to change anything + return "'$s'"; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } + } + + + /** + * Will select the supplied $page number from a recordset, given that it is paginated in pages of + * $nrows rows per page. It also saves two boolean values saying if the given page is the first + * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination. + * + * See readme.htm#ex8 for an example of usage. + * + * @param sql + * @param nrows is the number of rows per page to get + * @param page is the page number to get (1-based) + * @param [inputarr] array of bind variables + * @param [secs2cache] is a private parameter only used by jlim + * @return the recordset ($rs->databaseType == 'array') + * + * NOTE: phpLens uses a different algorithm and does not use PageExecute(). + * + */ + function PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + if ($this->pageExecuteCountRows) $rs = _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache); + else $rs = _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache); + return $rs; + } + + + /** + * Will select the supplied $page number from a recordset, given that it is paginated in pages of + * $nrows rows per page. It also saves two boolean values saying if the given page is the first + * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination. + * + * @param secs2cache seconds to cache data, set to 0 to force query + * @param sql + * @param nrows is the number of rows per page to get + * @param page is the page number to get (1-based) + * @param [inputarr] array of bind variables + * @return the recordset ($rs->databaseType == 'array') + */ + function CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false) + { + /*switch($this->dataProvider) { + case 'postgres': + case 'mysql': + break; + default: $secs2cache = 0; break; + }*/ + $rs = $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache); + return $rs; + } + +} // end class ADOConnection + + + + //============================================================================================== + // CLASS ADOFetchObj + //============================================================================================== + + /** + * Internal placeholder for record objects. Used by ADORecordSet->FetchObj(). + */ + class ADOFetchObj { + }; + + //============================================================================================== + // CLASS ADORecordSet_empty + //============================================================================================== + + class ADODB_Iterator_empty implements Iterator { + + private $rs; + + function __construct($rs) + { + $this->rs = $rs; + } + function rewind() + { + } + + function valid() + { + return !$this->rs->EOF; + } + + function key() + { + return false; + } + + function current() + { + return false; + } + + function next() + { + } + + function __call($func, $params) + { + return call_user_func_array(array($this->rs, $func), $params); + } + + function hasMore() + { + return false; + } + + } + + + /** + * Lightweight recordset when there are no records to be returned + */ + class ADORecordSet_empty implements IteratorAggregate + { + var $dataProvider = 'empty'; + var $databaseType = false; + var $EOF = true; + var $_numOfRows = 0; + var $fields = false; + var $connection = false; + function RowCount() {return 0;} + function RecordCount() {return 0;} + function PO_RecordCount(){return 0;} + function Close(){return true;} + function FetchRow() {return false;} + function FieldCount(){ return 0;} + function Init() {} + function getIterator() {return new ADODB_Iterator_empty($this);} + } + + //============================================================================================== + // DATE AND TIME FUNCTIONS + //============================================================================================== + if (!defined('ADODB_DATE_VERSION')) include(ADODB_DIR.'/adodb-time.inc.php'); + + //============================================================================================== + // CLASS ADORecordSet + //============================================================================================== + + class ADODB_Iterator implements Iterator { + + private $rs; + + function __construct($rs) + { + $this->rs = $rs; + } + function rewind() + { + $this->rs->MoveFirst(); + } + + function valid() + { + return !$this->rs->EOF; + } + + function key() + { + return $this->rs->_currentRow; + } + + function current() + { + return $this->rs->fields; + } + + function next() + { + $this->rs->MoveNext(); + } + + function __call($func, $params) + { + return call_user_func_array(array($this->rs, $func), $params); + } + + + function hasMore() + { + return !$this->rs->EOF; + } + + } + + + + /** + * RecordSet class that represents the dataset returned by the database. + * To keep memory overhead low, this class holds only the current row in memory. + * No prefetching of data is done, so the RecordCount() can return -1 ( which + * means recordcount not known). + */ + class ADORecordSet implements IteratorAggregate { + /* + * public variables + */ + var $dataProvider = "native"; + var $fields = false; /// holds the current row data + var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob + /// in other words, we use a text area for editing. + var $canSeek = false; /// indicates that seek is supported + var $sql; /// sql text + var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object. + + var $emptyTimeStamp = '&nbsp;'; /// what to display when $time==0 + var $emptyDate = '&nbsp;'; /// what to display when $time==0 + var $debug = false; + var $timeCreated=0; /// datetime in Unix format rs created -- for cached recordsets + + var $bind = false; /// used by Fields() to hold array - should be private? + var $fetchMode; /// default fetch mode + var $connection = false; /// the parent connection + /* + * private variables + */ + var $_numOfRows = -1; /** number of rows, or -1 */ + var $_numOfFields = -1; /** number of fields in recordset */ + var $_queryID = -1; /** This variable keeps the result link identifier. */ + var $_currentRow = -1; /** This variable keeps the current row in the Recordset. */ + var $_closed = false; /** has recordset been closed */ + var $_inited = false; /** Init() should only be called once */ + var $_obj; /** Used by FetchObj */ + var $_names; /** Used by FetchObj */ + + var $_currentPage = -1; /** Added by Iván Oliva to implement recordset pagination */ + var $_atFirstPage = false; /** Added by Iván Oliva to implement recordset pagination */ + var $_atLastPage = false; /** Added by Iván Oliva to implement recordset pagination */ + var $_lastPageNo = -1; + var $_maxRecordCount = 0; + var $datetime = false; + + /** + * Constructor + * + * @param queryID this is the queryID returned by ADOConnection->_query() + * + */ + function ADORecordSet($queryID) + { + $this->_queryID = $queryID; + } + + function getIterator() + { + return new ADODB_Iterator($this); + } + + /* this is experimental - i don't really know what to return... */ + function __toString() + { + include_once(ADODB_DIR.'/toexport.inc.php'); + return _adodb_export($this,',',',',false,true); + } + + + function Init() + { + if ($this->_inited) return; + $this->_inited = true; + if ($this->_queryID) @$this->_initrs(); + else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + } + if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) { + + $this->_currentRow = 0; + if ($this->EOF = ($this->_fetch() === false)) { + $this->_numOfRows = 0; // _numOfRows could be -1 + } + } else { + $this->EOF = true; + } + } + + + /** + * Generate a SELECT tag string from a recordset, and return the string. + * If the recordset has 2 cols, we treat the 1st col as the containing + * the text to display to the user, and 2nd col as the return value. Default + * strings are compared with the FIRST column. + * + * @param name name of SELECT tag + * @param [defstr] the value to hilite. Use an array for multiple hilites for listbox. + * @param [blank1stItem] true to leave the 1st item in list empty + * @param [multiple] true for listbox, false for popup + * @param [size] #rows to show for listbox. not used by popup + * @param [selectAttr] additional attributes to defined for SELECT tag. + * useful for holding javascript onChange='...' handlers. + & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with + * column 0 (1st col) if this is true. This is not documented. + * + * @return HTML + * + * changes by glen.davies@cce.ac.nz to support multiple hilited items + */ + function GetMenu($name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,$compareFields0); + } + + + + /** + * Generate a SELECT tag string from a recordset, and return the string. + * If the recordset has 2 cols, we treat the 1st col as the containing + * the text to display to the user, and 2nd col as the return value. Default + * strings are compared with the SECOND column. + * + */ + function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='') + { + return $this->GetMenu($name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,false); + } + + /* + Grouped Menu + */ + function GetMenu3($name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='') + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getmenu_gp($this, $name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,false); + } + + /** + * return recordset as a 2-dimensional array. + * + * @param [nRows] is the number of rows to return. -1 means every row. + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function GetArray($nRows = -1) + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) { + $results = adodb_getall($this,$nRows); + return $results; + } + $results = array(); + $cnt = 0; + while (!$this->EOF && $nRows != $cnt) { + $results[] = $this->fields; + $this->MoveNext(); + $cnt++; + } + return $results; + } + + function GetAll($nRows = -1) + { + $arr = $this->GetArray($nRows); + return $arr; + } + + /* + * Some databases allow multiple recordsets to be returned. This function + * will return true if there is a next recordset, or false if no more. + */ + function NextRecordSet() + { + return false; + } + + /** + * return recordset as a 2-dimensional array. + * Helper function for ADOConnection->SelectLimit() + * + * @param offset is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to return + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr = $this->GetArray($nrows); + return $arr; + } + + $this->Move($offset); + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + /** + * Synonym for GetArray() for compatibility with ADO. + * + * @param [nRows] is the number of rows to return. -1 means every row. + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function GetRows($nRows = -1) + { + $arr = $this->GetArray($nRows); + return $arr; + } + + /** + * return whole recordset as a 2-dimensional associative array if there are more than 2 columns. + * The first column is treated as the key and is not included in the array. + * If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless + * $force_array == true. + * + * @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional + * array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing, + * read the source. + * + * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and + * instead of returning array[col0] => array(remaining cols), return array[col0] => col1 + * + * @return an associative array indexed by the first column of the array, + * or false if the data has less than 2 cols. + */ + function GetAssoc($force_array = false, $first2cols = false) + { + global $ADODB_EXTENSION; + + $cols = $this->_numOfFields; + if ($cols < 2) { + $false = false; + return $false; + } + $numIndex = isset($this->fields[0]); + $results = array(); + + if (!$first2cols && ($cols > 2 || $force_array)) { + if ($ADODB_EXTENSION) { + if ($numIndex) { + while (!$this->EOF) { + $results[trim($this->fields[0])] = array_slice($this->fields, 1); + adodb_movenext($this); + } + } else { + while (!$this->EOF) { + // Fix for array_slice re-numbering numeric associative keys + $keys = array_slice(array_keys($this->fields), 1); + $sliced_array = array(); + + foreach($keys as $key) { + $sliced_array[$key] = $this->fields[$key]; + } + + $results[trim(reset($this->fields))] = $sliced_array; + adodb_movenext($this); + } + } + } else { + if ($numIndex) { + while (!$this->EOF) { + $results[trim($this->fields[0])] = array_slice($this->fields, 1); + $this->MoveNext(); + } + } else { + while (!$this->EOF) { + // Fix for array_slice re-numbering numeric associative keys + $keys = array_slice(array_keys($this->fields), 1); + $sliced_array = array(); + + foreach($keys as $key) { + $sliced_array[$key] = $this->fields[$key]; + } + + $results[trim(reset($this->fields))] = $sliced_array; + $this->MoveNext(); + } + } + } + } else { + if ($ADODB_EXTENSION) { + // return scalar values + if ($numIndex) { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $results[trim(($this->fields[0]))] = $this->fields[1]; + adodb_movenext($this); + } + } else { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $v1 = trim(reset($this->fields)); + $v2 = ''.next($this->fields); + $results[$v1] = $v2; + adodb_movenext($this); + } + } + } else { + if ($numIndex) { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $results[trim(($this->fields[0]))] = $this->fields[1]; + $this->MoveNext(); + } + } else { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $v1 = trim(reset($this->fields)); + $v2 = ''.next($this->fields); + $results[$v1] = $v2; + $this->MoveNext(); + } + } + } + } + + $ref = $results; # workaround accelerator incompat with PHP 4.4 :( + return $ref; + } + + + /** + * + * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format + * @param fmt is the format to apply to it, using date() + * + * @return a timestamp formated as user desires + */ + function UserTimeStamp($v,$fmt='Y-m-d H:i:s') + { + if (is_numeric($v) && strlen($v)<14) return adodb_date($fmt,$v); + $tt = $this->UnixTimeStamp($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + if ($tt === 0) return $this->emptyTimeStamp; + return adodb_date($fmt,$tt); + } + + + /** + * @param v is the character date in YYYY-MM-DD format, returned by database + * @param fmt is the format to apply to it, using date() + * + * @return a date formated as user desires + */ + function UserDate($v,$fmt='Y-m-d') + { + $tt = $this->UnixDate($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + else if ($tt == 0) return $this->emptyDate; + else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR + } + return adodb_date($fmt,$tt); + } + + + /** + * @param $v is a date string in YYYY-MM-DD format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixDate($v) + { + return ADOConnection::UnixDate($v); + } + + + /** + * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + static function UnixTimeStamp($v) + { + return ADOConnection::UnixTimeStamp($v); + } + + + /** + * PEAR DB Compat - do not use internally + */ + function Free() + { + return $this->Close(); + } + + + /** + * PEAR DB compat, number of rows + */ + function NumRows() + { + return $this->_numOfRows; + } + + + /** + * PEAR DB compat, number of cols + */ + function NumCols() + { + return $this->_numOfFields; + } + + /** + * Fetch a row, returning false if no more rows. + * This is PEAR DB compat mode. + * + * @return false or array containing the current record + */ + function FetchRow() + { + if ($this->EOF) { + $false = false; + return $false; + } + $arr = $this->fields; + $this->_currentRow++; + if (!$this->_fetch()) $this->EOF = true; + return $arr; + } + + + /** + * Fetch a row, returning PEAR_Error if no more rows. + * This is PEAR DB compat mode. + * + * @return DB_OK or error object + */ + function FetchInto(&$arr) + { + if ($this->EOF) return (defined('PEAR_ERROR_RETURN')) ? new PEAR_Error('EOF',-1): false; + $arr = $this->fields; + $this->MoveNext(); + return 1; // DB_OK + } + + + /** + * Move to the first row in the recordset. Many databases do NOT support this. + * + * @return true or false + */ + function MoveFirst() + { + if ($this->_currentRow == 0) return true; + return $this->Move(0); + } + + + /** + * Move to the last row in the recordset. + * + * @return true or false + */ + function MoveLast() + { + if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1); + if ($this->EOF) return false; + while (!$this->EOF) { + $f = $this->fields; + $this->MoveNext(); + } + $this->fields = $f; + $this->EOF = false; + return true; + } + + + /** + * Move to next record in the recordset. + * + * @return true if there still rows available, or false if there are no more rows (EOF). + */ + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_fetch()) return true; + } + $this->EOF = true; + /* -- tested error handling when scrolling cursor -- seems useless. + $conn = $this->connection; + if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) { + $fn = $conn->raiseErrorFn; + $fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database); + } + */ + return false; + } + + + /** + * Random access to a specific row in the recordset. Some databases do not support + * access to previous rows in the databases (no scrolling backwards). + * + * @param rowNumber is the row to move to (0-based) + * + * @return true if there still rows available, or false if there are no more rows (EOF). + */ + function Move($rowNumber = 0) + { + $this->EOF = false; + if ($rowNumber == $this->_currentRow) return true; + if ($rowNumber >= $this->_numOfRows) + if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2; + + if ($this->canSeek) { + + if ($this->_seek($rowNumber)) { + $this->_currentRow = $rowNumber; + if ($this->_fetch()) { + return true; + } + } else { + $this->EOF = true; + return false; + } + } else { + if ($rowNumber < $this->_currentRow) return false; + global $ADODB_EXTENSION; + if ($ADODB_EXTENSION) { + while (!$this->EOF && $this->_currentRow < $rowNumber) { + adodb_movenext($this); + } + } else { + + while (! $this->EOF && $this->_currentRow < $rowNumber) { + $this->_currentRow++; + + if (!$this->_fetch()) $this->EOF = true; + } + } + return !($this->EOF); + } + + $this->fields = false; + $this->EOF = true; + return false; + } + + + /** + * Get the value of a field in the current row by column name. + * Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM. + * + * @param colname is the field to access + * + * @return the value of $colname column + */ + function Fields($colname) + { + return $this->fields[$colname]; + } + + function GetAssocKeys($upper=true) + { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + if ($upper === 2) $this->bind[$o->name] = $i; + else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i; + } + } + + /** + * Use associative array to get fields array for databases that do not support + * associative arrays. Submitted by Paolo S. Asioli paolo.asioli#libero.it + * + * If you don't want uppercase cols, set $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC + * before you execute your SQL statement, and access $rs->fields['col'] directly. + * + * $upper 0 = lowercase, 1 = uppercase, 2 = whatever is returned by FetchField + */ + function GetRowAssoc($upper=1) + { + $record = array(); + // if (!$this->fields) return $record; + + if (!$this->bind) { + $this->GetAssocKeys($upper); + } + + foreach($this->bind as $k => $v) { + $record[$k] = $this->fields[$v]; + } + + return $record; + } + + + /** + * Clean up recordset + * + * @return true or false + */ + function Close() + { + // free connection object - this seems to globally free the object + // and not merely the reference, so don't do this... + // $this->connection = false; + if (!$this->_closed) { + $this->_closed = true; + return $this->_close(); + } else + return true; + } + + /** + * synonyms RecordCount and RowCount + * + * @return the number of rows or -1 if this is not supported + */ + function RecordCount() {return $this->_numOfRows;} + + + /* + * If we are using PageExecute(), this will return the maximum possible rows + * that can be returned when paging a recordset. + */ + function MaxRecordCount() + { + return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount(); + } + + /** + * synonyms RecordCount and RowCount + * + * @return the number of rows or -1 if this is not supported + */ + function RowCount() {return $this->_numOfRows;} + + + /** + * Portable RecordCount. Pablo Roca <pabloroca@mvps.org> + * + * @return the number of records from a previous SELECT. All databases support this. + * + * But aware possible problems in multiuser environments. For better speed the table + * must be indexed by the condition. Heavy test this before deploying. + */ + function PO_RecordCount($table="", $condition="") { + + $lnumrows = $this->_numOfRows; + // the database doesn't support native recordcount, so we do a workaround + if ($lnumrows == -1 && $this->connection) { + IF ($table) { + if ($condition) $condition = " WHERE " . $condition; + $resultrows = $this->connection->Execute("SELECT COUNT(*) FROM $table $condition"); + if ($resultrows) $lnumrows = reset($resultrows->fields); + } + } + return $lnumrows; + } + + + /** + * @return the current row in the recordset. If at EOF, will return the last row. 0-based. + */ + function CurrentRow() {return $this->_currentRow;} + + /** + * synonym for CurrentRow -- for ADO compat + * + * @return the current row in the recordset. If at EOF, will return the last row. 0-based. + */ + function AbsolutePosition() {return $this->_currentRow;} + + /** + * @return the number of columns in the recordset. Some databases will set this to 0 + * if no records are returned, others will return the number of columns in the query. + */ + function FieldCount() {return $this->_numOfFields;} + + + /** + * Get the ADOFieldObject of a specific column. + * + * @param fieldoffset is the column position to access(0-based). + * + * @return the ADOFieldObject for that column, or false. + */ + function FetchField($fieldoffset = -1) + { + // must be defined by child class + + $false = false; + return $false; + } + + /** + * Get the ADOFieldObjects of all columns in an array. + * + */ + function FieldTypesArray() + { + $arr = array(); + for ($i=0, $max=$this->_numOfFields; $i < $max; $i++) + $arr[] = $this->FetchField($i); + return $arr; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default case is lowercase field names. + * + * @return the object with the properties set to the fields of the current row + */ + function FetchObj() + { + $o = $this->FetchObject(false); + return $o; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default case is uppercase. + * + * @param $isupper to set the object property names to uppercase + * + * @return the object with the properties set to the fields of the current row + */ + function FetchObject($isupper=true) + { + if (empty($this->_obj)) { + $this->_obj = new ADOFetchObj(); + $this->_names = array(); + for ($i=0; $i <$this->_numOfFields; $i++) { + $f = $this->FetchField($i); + $this->_names[] = $f->name; + } + } + $i = 0; + if (PHP_VERSION >= 5) $o = clone($this->_obj); + else $o = $this->_obj; + + for ($i=0; $i <$this->_numOfFields; $i++) { + $name = $this->_names[$i]; + if ($isupper) $n = strtoupper($name); + else $n = $name; + + $o->$n = $this->Fields($name); + } + return $o; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default is lower-case field names. + * + * @return the object with the properties set to the fields of the current row, + * or false if EOF + * + * Fixed bug reported by tim@orotech.net + */ + function FetchNextObj() + { + $o = $this->FetchNextObject(false); + return $o; + } + + + /** + * Return the fields array of the current row as an object for convenience. + * The default is upper case field names. + * + * @param $isupper to set the object property names to uppercase + * + * @return the object with the properties set to the fields of the current row, + * or false if EOF + * + * Fixed bug reported by tim@orotech.net + */ + function FetchNextObject($isupper=true) + { + $o = false; + if ($this->_numOfRows != 0 && !$this->EOF) { + $o = $this->FetchObject($isupper); + $this->_currentRow++; + if ($this->_fetch()) return $o; + } + $this->EOF = true; + return $o; + } + + /** + * Get the metatype of the column. This is used for formatting. This is because + * many databases use different names for the same type, so we transform the original + * type to our standardised version which uses 1 character codes: + * + * @param t is the type passed in. Normally is ADOFieldObject->type. + * @param len is the maximum length of that field. This is because we treat character + * fields bigger than a certain size as a 'B' (blob). + * @param fieldobj is the field object returned by the database driver. Can hold + * additional info (eg. primary_key for mysql). + * + * @return the general type of the data: + * C for character < 250 chars + * X for teXt (>= 250 chars) + * B for Binary + * N for numeric or floating point + * D for date + * T for timestamp + * L for logical/Boolean + * I for integer + * R for autoincrement counter/integer + * + * + */ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + // changed in 2.32 to hashing instead of switch stmt for speed... + static $typeMap = array( + 'VARCHAR' => 'C', + 'VARCHAR2' => 'C', + 'CHAR' => 'C', + 'C' => 'C', + 'STRING' => 'C', + 'NCHAR' => 'C', + 'NVARCHAR' => 'C', + 'VARYING' => 'C', + 'BPCHAR' => 'C', + 'CHARACTER' => 'C', + 'INTERVAL' => 'C', # Postgres + 'MACADDR' => 'C', # postgres + 'VAR_STRING' => 'C', # mysql + ## + 'LONGCHAR' => 'X', + 'TEXT' => 'X', + 'NTEXT' => 'X', + 'M' => 'X', + 'X' => 'X', + 'CLOB' => 'X', + 'NCLOB' => 'X', + 'LVARCHAR' => 'X', + ## + 'BLOB' => 'B', + 'IMAGE' => 'B', + 'BINARY' => 'B', + 'VARBINARY' => 'B', + 'LONGBINARY' => 'B', + 'B' => 'B', + ## + 'YEAR' => 'D', // mysql + 'DATE' => 'D', + 'D' => 'D', + ## + 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server + ## + 'SMALLDATETIME' => 'T', + 'TIME' => 'T', + 'TIMESTAMP' => 'T', + 'DATETIME' => 'T', + 'TIMESTAMPTZ' => 'T', + 'T' => 'T', + 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql + ## + 'BOOL' => 'L', + 'BOOLEAN' => 'L', + 'BIT' => 'L', + 'L' => 'L', + ## + 'COUNTER' => 'R', + 'R' => 'R', + 'SERIAL' => 'R', // ifx + 'INT IDENTITY' => 'R', + ## + 'INT' => 'I', + 'INT2' => 'I', + 'INT4' => 'I', + 'INT8' => 'I', + 'INTEGER' => 'I', + 'INTEGER UNSIGNED' => 'I', + 'SHORT' => 'I', + 'TINYINT' => 'I', + 'SMALLINT' => 'I', + 'I' => 'I', + ## + 'LONG' => 'N', // interbase is numeric, oci8 is blob + 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers + 'DECIMAL' => 'N', + 'DEC' => 'N', + 'REAL' => 'N', + 'DOUBLE' => 'N', + 'DOUBLE PRECISION' => 'N', + 'SMALLFLOAT' => 'N', + 'FLOAT' => 'N', + 'NUMBER' => 'N', + 'NUM' => 'N', + 'NUMERIC' => 'N', + 'MONEY' => 'N', + + ## informix 9.2 + 'SQLINT' => 'I', + 'SQLSERIAL' => 'I', + 'SQLSMINT' => 'I', + 'SQLSMFLOAT' => 'N', + 'SQLFLOAT' => 'N', + 'SQLMONEY' => 'N', + 'SQLDECIMAL' => 'N', + 'SQLDATE' => 'D', + 'SQLVCHAR' => 'C', + 'SQLCHAR' => 'C', + 'SQLDTIME' => 'T', + 'SQLINTERVAL' => 'N', + 'SQLBYTES' => 'B', + 'SQLTEXT' => 'X', + ## informix 10 + "SQLINT8" => 'I8', + "SQLSERIAL8" => 'I8', + "SQLNCHAR" => 'C', + "SQLNVCHAR" => 'C', + "SQLLVARCHAR" => 'X', + "SQLBOOL" => 'L' + ); + + $tmap = false; + $t = strtoupper($t); + $tmap = (isset($typeMap[$t])) ? $typeMap[$t] : 'N'; + switch ($tmap) { + case 'C': + + // is the char field is too long, return as text field... + if ($this->blobSize >= 0) { + if ($len > $this->blobSize) return 'X'; + } else if ($len > 250) { + return 'X'; + } + return 'C'; + + case 'I': + if (!empty($fieldobj->primary_key)) return 'R'; + return 'I'; + + case false: + return 'N'; + + case 'B': + if (isset($fieldobj->binary)) + return ($fieldobj->binary) ? 'B' : 'X'; + return 'B'; + + case 'D': + if (!empty($this->connection) && !empty($this->connection->datetime)) return 'T'; + return 'D'; + + default: + if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B'; + return $tmap; + } + } + + + function _close() {} + + /** + * set/returns the current recordset page when paginating + */ + function AbsolutePage($page=-1) + { + if ($page != -1) $this->_currentPage = $page; + return $this->_currentPage; + } + + /** + * set/returns the status of the atFirstPage flag when paginating + */ + function AtFirstPage($status=false) + { + if ($status != false) $this->_atFirstPage = $status; + return $this->_atFirstPage; + } + + function LastPageNo($page = false) + { + if ($page != false) $this->_lastPageNo = $page; + return $this->_lastPageNo; + } + + /** + * set/returns the status of the atLastPage flag when paginating + */ + function AtLastPage($status=false) + { + if ($status != false) $this->_atLastPage = $status; + return $this->_atLastPage; + } + +} // end class ADORecordSet + + //============================================================================================== + // CLASS ADORecordSet_array + //============================================================================================== + + /** + * This class encapsulates the concept of a recordset created in memory + * as an array. This is useful for the creation of cached recordsets. + * + * Note that the constructor is different from the standard ADORecordSet + */ + + class ADORecordSet_array extends ADORecordSet + { + var $databaseType = 'array'; + + var $_array; // holds the 2-dimensional data array + var $_types; // the array of types of each column (C B I L M) + var $_colnames; // names of each column in array + var $_skiprow1; // skip 1st row because it holds column names + var $_fieldobjects; // holds array of field objects + var $canSeek = true; + var $affectedrows = false; + var $insertid = false; + var $sql = ''; + var $compat = false; + /** + * Constructor + * + */ + function ADORecordSet_array($fakeid=1) + { + global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH; + + // fetch() on EOF does not delete $this->fields + $this->compat = !empty($ADODB_COMPAT_FETCH); + $this->ADORecordSet($fakeid); // fake queryID + $this->fetchMode = $ADODB_FETCH_MODE; + } + + function _transpose($addfieldnames=true) + { + global $ADODB_INCLUDED_LIB; + + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + $hdr = true; + + $fobjs = $addfieldnames ? $this->_fieldobjects : false; + adodb_transpose($this->_array, $newarr, $hdr, $fobjs); + //adodb_pr($newarr); + + $this->_skiprow1 = false; + $this->_array = $newarr; + $this->_colnames = $hdr; + + adodb_probetypes($newarr,$this->_types); + + $this->_fieldobjects = array(); + + foreach($hdr as $k => $name) { + $f = new ADOFieldObject(); + $f->name = $name; + $f->type = $this->_types[$k]; + $f->max_length = -1; + $this->_fieldobjects[] = $f; + } + $this->fields = reset($this->_array); + + $this->_initrs(); + + } + + /** + * Setup the array. + * + * @param array is a 2-dimensional array holding the data. + * The first row should hold the column names + * unless paramter $colnames is used. + * @param typearr holds an array of types. These are the same types + * used in MetaTypes (C,B,L,I,N). + * @param [colnames] array of column names. If set, then the first row of + * $array should not hold the column names. + */ + function InitArray($array,$typearr,$colnames=false) + { + $this->_array = $array; + $this->_types = $typearr; + if ($colnames) { + $this->_skiprow1 = false; + $this->_colnames = $colnames; + } else { + $this->_skiprow1 = true; + $this->_colnames = $array[0]; + } + $this->Init(); + } + /** + * Setup the Array and datatype file objects + * + * @param array is a 2-dimensional array holding the data. + * The first row should hold the column names + * unless paramter $colnames is used. + * @param fieldarr holds an array of ADOFieldObject's. + */ + function InitArrayFields(&$array,&$fieldarr) + { + $this->_array = $array; + $this->_skiprow1= false; + if ($fieldarr) { + $this->_fieldobjects = $fieldarr; + } + $this->Init(); + } + + function GetArray($nRows=-1) + { + if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) { + return $this->_array; + } else { + $arr = ADORecordSet::GetArray($nRows); + return $arr; + } + } + + function _initrs() + { + $this->_numOfRows = sizeof($this->_array); + if ($this->_skiprow1) $this->_numOfRows -= 1; + + $this->_numOfFields =(isset($this->_fieldobjects)) ? + sizeof($this->_fieldobjects):sizeof($this->_types); + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode; + + if ($mode & ADODB_FETCH_ASSOC) { + if (!isset($this->fields[$colname]) && !is_null($this->fields[$colname])) $colname = strtolower($colname); + return $this->fields[$colname]; + } + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function FetchField($fieldOffset = -1) + { + if (isset($this->_fieldobjects)) { + return $this->_fieldobjects[$fieldOffset]; + } + $o = new ADOFieldObject(); + $o->name = $this->_colnames[$fieldOffset]; + $o->type = $this->_types[$fieldOffset]; + $o->max_length = -1; // length not known + + return $o; + } + + function _seek($row) + { + if (sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) { + $this->_currentRow = $row; + if ($this->_skiprow1) $row += 1; + $this->fields = $this->_array[$row]; + return true; + } + return false; + } + + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + + $pos = $this->_currentRow; + + if ($this->_numOfRows <= $pos) { + if (!$this->compat) $this->fields = false; + } else { + if ($this->_skiprow1) $pos += 1; + $this->fields = $this->_array[$pos]; + return true; + } + $this->EOF = true; + } + + return false; + } + + function _fetch() + { + $pos = $this->_currentRow; + + if ($this->_numOfRows <= $pos) { + if (!$this->compat) $this->fields = false; + return false; + } + if ($this->_skiprow1) $pos += 1; + $this->fields = $this->_array[$pos]; + return true; + } + + function _close() + { + return true; + } + + } // ADORecordSet_array + + //============================================================================================== + // HELPER FUNCTIONS + //============================================================================================== + + /** + * Synonym for ADOLoadCode. Private function. Do not use. + * + * @deprecated + */ + function ADOLoadDB($dbType) + { + return ADOLoadCode($dbType); + } + + /** + * Load the code for a specific database driver. Private function. Do not use. + */ + function ADOLoadCode($dbType) + { + global $ADODB_LASTDB; + + if (!$dbType) return false; + $db = strtolower($dbType); + switch ($db) { + case 'ado': + if (PHP_VERSION >= 5) $db = 'ado5'; + $class = 'ado'; + break; + case 'ifx': + case 'maxsql': $class = $db = 'mysqlt'; break; + case 'postgres': + case 'postgres8': + case 'pgsql': $class = $db = 'postgres7'; break; + default: + $class = $db; break; + } + + $file = ADODB_DIR."/drivers/adodb-".$db.".inc.php"; + @include_once($file); + $ADODB_LASTDB = $class; + if (class_exists("ADODB_" . $class)) return $class; + + //ADOConnection::outp(adodb_pr(get_declared_classes(),true)); + if (!file_exists($file)) ADOConnection::outp("Missing file: $file"); + else ADOConnection::outp("Syntax error in file: $file"); + return false; + } + + /** + * synonym for ADONewConnection for people like me who cannot remember the correct name + */ + function NewADOConnection($db='') + { + $tmp = ADONewConnection($db); + return $tmp; + } + + /** + * Instantiate a new Connection class for a specific database driver. + * + * @param [db] is the database Connection object to create. If undefined, + * use the last database driver that was loaded by ADOLoadCode(). + * + * @return the freshly created instance of the Connection class. + */ + function ADONewConnection($db='') + { + GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB; + + if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); + $errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false; + $false = false; + if (($at = strpos($db,'://')) !== FALSE) { + $origdsn = $db; + $fakedsn = 'fake'.substr($origdsn,$at); + if (($at2 = strpos($origdsn,'@/')) !== FALSE) { + // special handling of oracle, which might not have host + $fakedsn = str_replace('@/','@adodb-fakehost/',$fakedsn); + } + $dsna = @parse_url($fakedsn); + if (!$dsna) { + return $false; + } + $dsna['scheme'] = substr($origdsn,0,$at); + if ($at2 !== FALSE) { + $dsna['host'] = ''; + } + + if (strncmp($origdsn,'pdo',3) == 0) { + $sch = explode('_',$dsna['scheme']); + if (sizeof($sch)>1) { + + $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; + if ($sch[1] == 'sqlite') + $dsna['host'] = rawurlencode($sch[1].':'.rawurldecode($dsna['host'])); + else + $dsna['host'] = rawurlencode($sch[1].':host='.rawurldecode($dsna['host'])); + $dsna['scheme'] = 'pdo'; + } + } + + $db = @$dsna['scheme']; + if (!$db) return $false; + $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; + $dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : ''; + $dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : ''; + $dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : ''; # strip off initial / + + if (isset($dsna['query'])) { + $opt1 = explode('&',$dsna['query']); + foreach($opt1 as $k => $v) { + $arr = explode('=',$v); + $opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1; + } + } else $opt = array(); + } + /* + * phptype: Database backend used in PHP (mysql, odbc etc.) + * dbsyntax: Database used with regards to SQL syntax etc. + * protocol: Communication protocol to use (tcp, unix etc.) + * hostspec: Host specification (hostname[:port]) + * database: Database to use on the DBMS server + * username: User name for login + * password: Password for login + */ + if (!empty($ADODB_NEWCONNECTION)) { + $obj = $ADODB_NEWCONNECTION($db); + + } + + if(empty($obj)) { + + if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = ''; + if (empty($db)) $db = $ADODB_LASTDB; + + if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db); + + if (!$db) { + if (isset($origdsn)) $db = $origdsn; + if ($errorfn) { + // raise an error + $ignore = false; + $errorfn('ADONewConnection', 'ADONewConnection', -998, + "could not load the database driver for '$db'", + $db,false,$ignore); + } else + ADOConnection::outp( "<p>ADONewConnection: Unable to load database driver '$db'</p>",false); + + return $false; + } + + $cls = 'ADODB_'.$db; + if (!class_exists($cls)) { + adodb_backtrace(); + return $false; + } + + $obj = new $cls(); + } + + # constructor should not fail + if ($obj) { + if ($errorfn) $obj->raiseErrorFn = $errorfn; + if (isset($dsna)) { + if (isset($dsna['port'])) $obj->port = $dsna['port']; + foreach($opt as $k => $v) { + switch(strtolower($k)) { + case 'new': + $nconnect = true; $persist = true; break; + case 'persist': + case 'persistent': $persist = $v; break; + case 'debug': $obj->debug = (integer) $v; break; + #ibase + case 'role': $obj->role = $v; break; + case 'dialect': $obj->dialect = (integer) $v; break; + case 'charset': $obj->charset = $v; $obj->charSet=$v; break; + case 'buffers': $obj->buffers = $v; break; + case 'fetchmode': $obj->SetFetchMode($v); break; + #ado + case 'charpage': $obj->charPage = $v; break; + #mysql, mysqli + case 'clientflags': $obj->clientFlags = $v; break; + #mysql, mysqli, postgres + case 'port': $obj->port = $v; break; + #mysqli + case 'socket': $obj->socket = $v; break; + #oci8 + case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v; break; + case 'cachesecs': $obj->cacheSecs = $v; break; + case 'memcache': + $varr = explode(':',$v); + $vlen = sizeof($varr); + if ($vlen == 0) break; + $obj->memCache = true; + $obj->memCacheHost = explode(',',$varr[0]); + if ($vlen == 1) break; + $obj->memCachePort = $varr[1]; + if ($vlen == 2) break; + $obj->memCacheCompress = $varr[2] ? true : false; + break; + } + } + if (empty($persist)) + $ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + else if (empty($nconnect)) + $ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + else + $ok = $obj->NConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + + if (!$ok) return $false; + } + } + return $obj; + } + + + + // $perf == true means called by NewPerfMonitor(), otherwise for data dictionary + function _adodb_getdriver($provider,$drivername,$perf=false) + { + switch ($provider) { + case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6); + case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5); + case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4); + case 'native': break; + default: + return $provider; + } + + switch($drivername) { + case 'mysqlt': + case 'mysqli': + $drivername='mysql'; + break; + case 'postgres7': + case 'postgres8': + $drivername = 'postgres'; + break; + case 'firebird15': $drivername = 'firebird'; break; + case 'oracle': $drivername = 'oci8'; break; + case 'access': if ($perf) $drivername = ''; break; + case 'db2' : break; + case 'sapdb' : break; + default: + $drivername = 'generic'; + break; + } + return $drivername; + } + + function NewPerfMonitor(&$conn) + { + $false = false; + $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType,true); + if (!$drivername || $drivername == 'generic') return $false; + include_once(ADODB_DIR.'/adodb-perf.inc.php'); + @include_once(ADODB_DIR."/perf/perf-$drivername.inc.php"); + $class = "Perf_$drivername"; + if (!class_exists($class)) return $false; + $perf = new $class($conn); + + return $perf; + } + + function NewDataDictionary(&$conn,$drivername=false) + { + $false = false; + if (!$drivername) $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType); + + include_once(ADODB_DIR.'/adodb-lib.inc.php'); + include_once(ADODB_DIR.'/adodb-datadict.inc.php'); + $path = ADODB_DIR."/datadict/datadict-$drivername.inc.php"; + + if (!file_exists($path)) { + ADOConnection::outp("Dictionary driver '$path' not available"); + return $false; + } + include_once($path); + $class = "ADODB2_$drivername"; + $dict = new $class(); + $dict->dataProvider = $conn->dataProvider; + $dict->connection = $conn; + $dict->upperName = strtoupper($drivername); + $dict->quote = $conn->nameQuote; + if (!empty($conn->_connectionID)) + $dict->serverInfo = $conn->ServerInfo(); + + return $dict; + } + + + + /* + Perform a print_r, with pre tags for better formatting. + */ + function adodb_pr($var,$as_string=false) + { + if ($as_string) ob_start(); + + if (isset($_SERVER['HTTP_USER_AGENT'])) { + echo " <pre>\n";print_r($var);echo "</pre>\n"; + } else + print_r($var); + + if ($as_string) { + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + } + + /* + Perform a stack-crawl and pretty print it. + + @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then). + @param levels Number of levels to display + */ + function adodb_backtrace($printOrArr=true,$levels=9999,$ishtml=null) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_backtrace($printOrArr,$levels,0,$ishtml); + } + + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/contrib/toxmlrpc.inc.php b/pos/is4c-nf/lib/adodb5/contrib/toxmlrpc.inc.php new file mode 100644 index 000000000..030d60aff --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/contrib/toxmlrpc.inc.php @@ -0,0 +1,183 @@ +<?php + /** + * Helper functions to convert between ADODB recordset objects and XMLRPC values. + * Uses John Lim's AdoDB and Edd Dumbill's phpxmlrpc libs + * + * @author Daniele Baroncelli + * @author Gaetano Giunta + * @copyright (c) 2003-2004 Giunta/Baroncelli. All rights reserved. + * + * @todo some more error checking here and there + * @todo document the xmlrpc-struct used to encode recordset info + * @todo verify if using xmlrpc_encode($rs->GetArray()) would work with: + * - ADODB_FETCH_BOTH + * - null values + */ + + /** + * Include the main libraries + */ + require_once('xmlrpc.inc'); + if (!defined('ADODB_DIR')) require_once('adodb.inc.php'); + + /** + * Builds an xmlrpc struct value out of an AdoDB recordset + */ + function rs2xmlrpcval(&$adodbrs) { + + $header = rs2xmlrpcval_header($adodbrs); + $body = rs2xmlrpcval_body($adodbrs); + + // put it all together and build final xmlrpc struct + $xmlrpcrs = new xmlrpcval ( array( + "header" => $header, + "body" => $body, + ), "struct"); + + return $xmlrpcrs; + + } + + /** + * Builds an xmlrpc struct value describing an AdoDB recordset + */ + function rs2xmlrpcval_header($adodbrs) + { + $numfields = $adodbrs->FieldCount(); + $numrecords = $adodbrs->RecordCount(); + + // build structure holding recordset information + $fieldstruct = array(); + for ($i = 0; $i < $numfields; $i++) { + $fld = $adodbrs->FetchField($i); + $fieldarray = array(); + if (isset($fld->name)) + $fieldarray["name"] = new xmlrpcval ($fld->name); + if (isset($fld->type)) + $fieldarray["type"] = new xmlrpcval ($fld->type); + if (isset($fld->max_length)) + $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int"); + if (isset($fld->not_null)) + $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean"); + if (isset($fld->has_default)) + $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean"); + if (isset($fld->default_value)) + $fieldarray["default_value"] = new xmlrpcval ($fld->default_value); + $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct"); + } + $fieldcount = new xmlrpcval ($numfields, "int"); + $recordcount = new xmlrpcval ($numrecords, "int"); + $sql = new xmlrpcval ($adodbrs->sql); + $fieldinfo = new xmlrpcval ($fieldstruct, "array"); + + $header = new xmlrpcval ( array( + "fieldcount" => $fieldcount, + "recordcount" => $recordcount, + "sql" => $sql, + "fieldinfo" => $fieldinfo + ), "struct"); + + return $header; + } + + /** + * Builds an xmlrpc struct value out of an AdoDB recordset + * (data values only, no data definition) + */ + function rs2xmlrpcval_body($adodbrs) + { + $numfields = $adodbrs->FieldCount(); + + // build structure containing recordset data + $adodbrs->MoveFirst(); + $rows = array(); + while (!$adodbrs->EOF) { + $columns = array(); + // This should work on all cases of fetch mode: assoc, num, both or default + if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount()) + for ($i = 0; $i < $numfields; $i++) + if ($adodbrs->fields[$i] === null) + $columns[$i] = new xmlrpcval (''); + else + $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]); + else + foreach ($adodbrs->fields as $val) + if ($val === null) + $columns[] = new xmlrpcval (''); + else + $columns[] = xmlrpc_encode ($val); + + $rows[] = new xmlrpcval ($columns, "array"); + + $adodbrs->MoveNext(); + } + $body = new xmlrpcval ($rows, "array"); + + return $body; + } + + /** + * Returns an xmlrpc struct value as string out of an AdoDB recordset + */ + function rs2xmlrpcstring (&$adodbrs) { + $xmlrpc = rs2xmlrpcval ($adodbrs); + if ($xmlrpc) + return $xmlrpc->serialize(); + else + return null; + } + + /** + * Given a well-formed xmlrpc struct object returns an AdoDB object + * + * @todo add some error checking on the input value + */ + function xmlrpcval2rs (&$xmlrpcval) { + + $fields_array = array(); + $data_array = array(); + + // rebuild column information + $header = $xmlrpcval->structmem('header'); + + $numfields = $header->structmem('fieldcount'); + $numfields = $numfields->scalarval(); + $numrecords = $header->structmem('recordcount'); + $numrecords = $numrecords->scalarval(); + $sqlstring = $header->structmem('sql'); + $sqlstring = $sqlstring->scalarval(); + + $fieldinfo = $header->structmem('fieldinfo'); + for ($i = 0; $i < $numfields; $i++) { + $temp = $fieldinfo->arraymem($i); + $fld = new ADOFieldObject(); + while (list($key,$value) = $temp->structeach()) { + if ($key == "name") $fld->name = $value->scalarval(); + if ($key == "type") $fld->type = $value->scalarval(); + if ($key == "max_length") $fld->max_length = $value->scalarval(); + if ($key == "not_null") $fld->not_null = $value->scalarval(); + if ($key == "has_default") $fld->has_default = $value->scalarval(); + if ($key == "default_value") $fld->default_value = $value->scalarval(); + } // while + $fields_array[] = $fld; + } // for + + // fetch recordset information into php array + $body = $xmlrpcval->structmem('body'); + for ($i = 0; $i < $numrecords; $i++) { + $data_array[$i]= array(); + $xmlrpcrs_row = $body->arraymem($i); + for ($j = 0; $j < $numfields; $j++) { + $temp = $xmlrpcrs_row->arraymem($j); + $data_array[$i][$j] = $temp->scalarval(); + } // for j + } // for i + + // finally build in-memory recordset object and return it + $rs = new ADORecordSet_array(); + $rs->InitArrayFields($data_array,$fields_array); + return $rs; + + } + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/cute_icons_for_site/adodb.gif b/pos/is4c-nf/lib/adodb5/cute_icons_for_site/adodb.gif new file mode 100644 index 000000000..c5e8dfc6d Binary files /dev/null and b/pos/is4c-nf/lib/adodb5/cute_icons_for_site/adodb.gif differ diff --git a/pos/is4c-nf/lib/adodb5/cute_icons_for_site/adodb2.gif b/pos/is4c-nf/lib/adodb5/cute_icons_for_site/adodb2.gif new file mode 100644 index 000000000..f12ae2037 Binary files /dev/null and b/pos/is4c-nf/lib/adodb5/cute_icons_for_site/adodb2.gif differ diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-access.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-access.inc.php new file mode 100644 index 000000000..906c8a74e --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-access.inc.php @@ -0,0 +1,96 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_access extends ADODB_DataDict { + + var $databaseType = 'access'; + var $seqField = false; + + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'TEXT'; + case 'XL': + case 'X': return 'MEMO'; + + case 'C2': return 'TEXT'; // up to 32K + case 'X2': return 'MEMO'; + + case 'B': return 'BINARY'; + + case 'TS': + case 'D': return 'DATETIME'; + case 'T': return 'DATETIME'; + + case 'L': return 'BYTE'; + case 'I': return 'INTEGER'; + case 'I1': return 'BYTE'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'INTEGER'; + + case 'F': return 'DOUBLE'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + // return string must begin with space + function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + if ($fautoinc) { + $ftype = 'COUNTER'; + return ''; + } + if (substr($ftype,0,7) == 'DECIMAL') $ftype = 'DECIMAL'; + $suffix = ''; + if (strlen($fdefault)) { + //$suffix .= " DEFAULT $fdefault"; + if ($this->debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)"); + } + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function CreateDatabase($dbname,$options=false) + { + return array(); + } + + + function SetSchema($schema) + { + } + + function AlterColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-db2.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-db2.inc.php new file mode 100644 index 000000000..5f02f23ec --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-db2.inc.php @@ -0,0 +1,144 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_db2 extends ADODB_DataDict { + + var $databaseType = 'db2'; + var $seqField = false; + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': return 'CLOB'; + case 'X': return 'VARCHAR(3600)'; + + case 'C2': return 'VARCHAR'; // up to 32K + case 'X2': return 'VARCHAR(3600)'; // up to 32000, but default page size too small + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'TIMESTAMP'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'BIGINT'; + + case 'F': return 'DOUBLE'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if ($fautoinc) return ' GENERATED ALWAYS AS IDENTITY'; # as identity start with + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function AlterColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + + + function ChangeTableSQL($tablename, $flds, $tableoptions = false) + { + + /** + Allow basic table changes to DB2 databases + DB2 will fatally reject changes to non character columns + + */ + + $validTypes = array("CHAR","VARC"); + $invalidTypes = array("BIGI","BLOB","CLOB","DATE", "DECI","DOUB", "INTE", "REAL","SMAL", "TIME"); + // check table exists + $cols = $this->MetaColumns($tablename); + if ( empty($cols)) { + return $this->CreateTableSQL($tablename, $flds, $tableoptions); + } + + // already exists, alter table instead + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $this->TableName($tablename); + $sql = array(); + + foreach ( $lines as $id => $v ) { + if ( isset($cols[$id]) && is_object($cols[$id]) ) { + /** + If the first field of $v is the fieldname, and + the second is the field type/size, we assume its an + attempt to modify the column size, so check that it is allowed + $v can have an indeterminate number of blanks between the + fields, so account for that too + */ + $vargs = explode(' ' , $v); + // assume that $vargs[0] is the field name. + $i=0; + // Find the next non-blank value; + for ($i=1;$i<sizeof($vargs);$i++) + if ($vargs[$i] != '') + break; + + // if $vargs[$i] is one of the following, we are trying to change the + // size of the field, if not allowed, simply ignore the request. + if (in_array(substr($vargs[$i],0,4),$invalidTypes)) + continue; + // insert the appropriate DB2 syntax + if (in_array(substr($vargs[$i],0,4),$validTypes)) { + array_splice($vargs,$i,0,array('SET','DATA','TYPE')); + } + + // Now Look for the NOT NULL statement as this is not allowed in + // the ALTER table statement. If it is in there, remove it + if (in_array('NOT',$vargs) && in_array('NULL',$vargs)) { + for ($i=1;$i<sizeof($vargs);$i++) + if ($vargs[$i] == 'NOT') + break; + array_splice($vargs,$i,2,''); + } + $v = implode(' ',$vargs); + $sql[] = $alter . $this->alterCol . ' ' . $v; + } else { + $sql[] = $alter . $this->addCol . ' ' . $v; + } + } + + return $sql; + } + +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-firebird.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-firebird.inc.php new file mode 100644 index 000000000..5794c8b2f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-firebird.inc.php @@ -0,0 +1,152 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +class ADODB2_firebird extends ADODB_DataDict { + + var $databaseType = 'firebird'; + var $seqField = false; + var $seqPrefix = 'gen_'; + var $blobSize = 40000; + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': return 'VARCHAR(32000)'; + case 'X': return 'VARCHAR(4000)'; + + case 'C2': return 'VARCHAR'; // up to 32K + case 'X2': return 'VARCHAR(4000)'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'TIMESTAMP'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'INTEGER'; + + case 'F': return 'DOUBLE PRECISION'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + + function NameQuote($name = NULL) + { + if (!is_string($name)) { + return FALSE; + } + + $name = trim($name); + + if ( !is_object($this->connection) ) { + return $name; + } + + $quote = $this->connection->nameQuote; + + // if name is of the form `name`, quote it + if ( preg_match('/^`(.+)`$/', $name, $matches) ) { + return $quote . $matches[1] . $quote; + } + + // if name contains special characters, quote it + if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) { + return $quote . $name . $quote; + } + + return $quote . $name . $quote; + } + + function CreateDatabase($dbname, $options=false) + { + $options = $this->_Options($options); + $sql = array(); + + $sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'"; + + return $sql; + } + + function _DropAutoIncrement($t) + { + if (strpos($t,'.') !== false) { + $tarr = explode('.',$t); + return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"'; + } + return 'DROP GENERATOR "GEN_'.$t; + } + + + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fautoinc) $this->seqField = $fname; + if ($fconstraint) $suffix .= ' '.$fconstraint; + + return $suffix; + } + +/* +CREATE or replace TRIGGER jaddress_insert +before insert on jaddress +for each row +begin +IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN + NEW."seqField" = GEN_ID("GEN_tabname", 1); +end; +*/ + function _Triggers($tabname,$tableoptions) + { + if (!$this->seqField) return array(); + + $tab1 = preg_replace( '/"/', '', $tabname ); + if ($this->schema) { + $t = strpos($tab1,'.'); + if ($t !== false) $tab = substr($tab1,$t+1); + else $tab = $tab1; + $seqField = $this->seqField; + $seqname = $this->schema.'.'.$this->seqPrefix.$tab; + $trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab; + } else { + $seqField = $this->seqField; + $seqname = $this->seqPrefix.$tab1; + $trigname = 'trig_'.$seqname; + } + if (isset($tableoptions['REPLACE'])) + { $sql[] = "DROP GENERATOR \"$seqname\""; + $sql[] = "CREATE GENERATOR \"$seqname\""; + $sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END"; + } + else + { $sql[] = "CREATE GENERATOR \"$seqname\""; + $sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END"; + } + + $this->seqField = false; + return $sql; + } + +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-generic.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-generic.inc.php new file mode 100644 index 000000000..8f24d37e7 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-generic.inc.php @@ -0,0 +1,126 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_generic extends ADODB_DataDict { + + var $databaseType = 'generic'; + var $seqField = false; + + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'VARCHAR(250)'; + + case 'C2': return 'VARCHAR'; + case 'X2': return 'VARCHAR(250)'; + + case 'B': return 'VARCHAR'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'DATE'; + + case 'L': return 'DECIMAL(1)'; + case 'I': return 'DECIMAL(10)'; + case 'I1': return 'DECIMAL(3)'; + case 'I2': return 'DECIMAL(5)'; + case 'I4': return 'DECIMAL(10)'; + case 'I8': return 'DECIMAL(20)'; + + case 'F': return 'DECIMAL(32,8)'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + + function AlterColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + +} + +/* +//db2 + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'X': return 'VARCHAR'; + + case 'C2': return 'VARCHAR'; // up to 32K + case 'X2': return 'VARCHAR'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'T': return 'TIMESTAMP'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'BIGINT'; + + case 'F': return 'DOUBLE'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + +// ifx +function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR';// 255 + case 'X': return 'TEXT'; + + case 'C2': return 'NVARCHAR'; + case 'X2': return 'TEXT'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'T': return 'DATETIME'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'DECIMAL(20)'; + + case 'F': return 'FLOAT'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } +*/ +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-ibase.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-ibase.inc.php new file mode 100644 index 000000000..6bbd334f3 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-ibase.inc.php @@ -0,0 +1,68 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_ibase extends ADODB_DataDict { + + var $databaseType = 'ibase'; + var $seqField = false; + + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'VARCHAR(4000)'; + + case 'C2': return 'VARCHAR'; // up to 32K + case 'X2': return 'VARCHAR(4000)'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'TIMESTAMP'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'INTEGER'; + + case 'F': return 'DOUBLE PRECISION'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + + function AlterColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-informix.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-informix.inc.php new file mode 100644 index 000000000..a0d966723 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-informix.inc.php @@ -0,0 +1,81 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_informix extends ADODB_DataDict { + + var $databaseType = 'informix'; + var $seqField = false; + + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR';// 255 + case 'XL': + case 'X': return 'TEXT'; + + case 'C2': return 'NVARCHAR'; + case 'X2': return 'TEXT'; + + case 'B': return 'BLOB'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'DATETIME YEAR TO SECOND'; + + case 'L': return 'SMALLINT'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'DECIMAL(20)'; + + case 'F': return 'FLOAT'; + case 'N': return 'DECIMAL'; + default: + return $meta; + } + } + + function AlterColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); + return array(); + } + + + function DropColumnSQL($tabname, $flds) + { + if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); + return array(); + } + + // return string must begin with space + function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + if ($fautoinc) { + $ftype = 'SERIAL'; + return ''; + } + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-mssql.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-mssql.inc.php new file mode 100644 index 000000000..b4c9f8618 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-mssql.inc.php @@ -0,0 +1,284 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +/* +In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs: + + Note Delimiters are for identifiers only. Delimiters cannot be used for keywords, + whether or not they are marked as reserved in SQL Server. + + Quoted identifiers are delimited by double quotation marks ("): + SELECT * FROM "Blanks in Table Name" + + Bracketed identifiers are delimited by brackets ([ ]): + SELECT * FROM [Blanks In Table Name] + + Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default, + the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON + when they connect. + + In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER, + the quoted identifier option of sp_dboption, or the user options option of sp_configure. + + When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled. + + Syntax + + SET QUOTED_IDENTIFIER { ON | OFF } + + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_mssql extends ADODB_DataDict { + var $databaseType = 'mssql'; + var $dropIndex = 'DROP INDEX %2$s.%1$s'; + var $renameTable = "EXEC sp_rename '%s','%s'"; + var $renameColumn = "EXEC sp_rename '%s.%s','%s'"; + + var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000) + var $typeXL = 'TEXT'; + + //var $alterCol = ' ALTER COLUMN '; + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'R': + case 'INT': + case 'INTEGER': return 'I'; + case 'BIT': + case 'TINYINT': return 'I1'; + case 'SMALLINT': return 'I2'; + case 'BIGINT': return 'I8'; + case 'SMALLDATETIME': return 'T'; + case 'REAL': + case 'FLOAT': return 'F'; + default: return parent::MetaType($t,$len,$fieldobj); + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + + case 'C': return 'VARCHAR'; + case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT'; + case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle + case 'C2': return 'NVARCHAR'; + case 'X2': return 'NTEXT'; + + case 'B': return 'IMAGE'; + + case 'D': return 'DATETIME'; + + case 'TS': + case 'T': return 'DATETIME'; + case 'L': return 'BIT'; + + case 'R': + case 'I': return 'INT'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'REAL'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname $this->addCol"; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + /* + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + + return $sql; + } + */ + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) + $flds = explode(',',$flds); + $f = array(); + $s = 'ALTER TABLE ' . $tabname; + foreach($flds as $v) { + $f[] = "\n$this->dropCol ".$this->NameQuote($v); + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' IDENTITY(1,1)'; + if ($fnotnull) $suffix .= ' NOT NULL'; + else if ($suffix == '') $suffix .= ' NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* +CREATE TABLE + [ database_name.[ owner ] . | owner. ] table_name + ( { < column_definition > + | column_name AS computed_column_expression + | < table_constraint > ::= [ CONSTRAINT constraint_name ] } + + | [ { PRIMARY KEY | UNIQUE } [ ,...n ] + ) + +[ ON { filegroup | DEFAULT } ] +[ TEXTIMAGE_ON { filegroup | DEFAULT } ] + +< column_definition > ::= { column_name data_type } + [ COLLATE < collation_name > ] + [ [ DEFAULT constant_expression ] + | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] + ] + [ ROWGUIDCOL] + [ < column_constraint > ] [ ...n ] + +< column_constraint > ::= [ CONSTRAINT constraint_name ] + { [ NULL | NOT NULL ] + | [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + [ WITH FILLFACTOR = fillfactor ] + [ON {filegroup | DEFAULT} ] ] + ] + | [ [ FOREIGN KEY ] + REFERENCES ref_table [ ( ref_column ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + ] + | CHECK [ NOT FOR REPLICATION ] + ( logical_expression ) + } + +< table_constraint > ::= [ CONSTRAINT constraint_name ] + { [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + { ( column [ ASC | DESC ] [ ,...n ] ) } + [ WITH FILLFACTOR = fillfactor ] + [ ON { filegroup | DEFAULT } ] + ] + | FOREIGN KEY + [ ( column [ ,...n ] ) ] + REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + | CHECK [ NOT FOR REPLICATION ] + ( search_conditions ) + } + + + */ + + /* + CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name + ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) + [ WITH < index_option > [ ,...n] ] + [ ON filegroup ] + < index_option > :: = + { PAD_INDEX | + FILLFACTOR = fillfactor | + IGNORE_DUP_KEY | + DROP_EXISTING | + STATISTICS_NORECOMPUTE | + SORT_IN_TEMPDB + } +*/ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + + $sql[] = $s; + + return $sql; + } + + + function _GetSize($ftype, $ty, $fsize, $fprec) + { + switch ($ftype) { + case 'INT': + case 'SMALLINT': + case 'TINYINT': + case 'BIGINT': + return $ftype; + } + if ($ty == 'T') return $ftype; + return parent::_GetSize($ftype, $ty, $fsize, $fprec); + + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-mssqlnative.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-mssqlnative.inc.php new file mode 100644 index 000000000..08f413319 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-mssqlnative.inc.php @@ -0,0 +1,282 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +/* +In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs: + + Note Delimiters are for identifiers only. Delimiters cannot be used for keywords, + whether or not they are marked as reserved in SQL Server. + + Quoted identifiers are delimited by double quotation marks ("): + SELECT * FROM "Blanks in Table Name" + + Bracketed identifiers are delimited by brackets ([ ]): + SELECT * FROM [Blanks In Table Name] + + Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default, + the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON + when they connect. + + In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER, + the quoted identifier option of sp_dboption, or the user options option of sp_configure. + + When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled. + + Syntax + + SET QUOTED_IDENTIFIER { ON | OFF } + + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_mssqlnative extends ADODB_DataDict { + var $databaseType = 'mssqlnative'; + var $dropIndex = 'DROP INDEX %2$s.%1$s'; + var $renameTable = "EXEC sp_rename '%s','%s'"; + var $renameColumn = "EXEC sp_rename '%s.%s','%s'"; + + var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000) + var $typeXL = 'TEXT'; + + //var $alterCol = ' ALTER COLUMN '; + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'R': + case 'INT': + case 'INTEGER': return 'I'; + case 'BIT': + case 'TINYINT': return 'I1'; + case 'SMALLINT': return 'I2'; + case 'BIGINT': return 'I8'; + + case 'REAL': + case 'FLOAT': return 'F'; + default: return parent::MetaType($t,$len,$fieldobj); + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + + case 'C': return 'VARCHAR'; + case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT'; + case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle + case 'C2': return 'NVARCHAR'; + case 'X2': return 'NTEXT'; + + case 'B': return 'IMAGE'; + + case 'D': return 'DATETIME'; + case 'T': return 'DATETIME'; + case 'L': return 'BIT'; + + case 'R': + case 'I': return 'INT'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'REAL'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname $this->addCol"; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + /* + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + + return $sql; + } + */ + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) + $flds = explode(',',$flds); + $f = array(); + $s = 'ALTER TABLE ' . $tabname; + foreach($flds as $v) { + $f[] = "\n$this->dropCol ".$this->NameQuote($v); + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' IDENTITY(1,1)'; + if ($fnotnull) $suffix .= ' NOT NULL'; + else if ($suffix == '') $suffix .= ' NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* +CREATE TABLE + [ database_name.[ owner ] . | owner. ] table_name + ( { < column_definition > + | column_name AS computed_column_expression + | < table_constraint > ::= [ CONSTRAINT constraint_name ] } + + | [ { PRIMARY KEY | UNIQUE } [ ,...n ] + ) + +[ ON { filegroup | DEFAULT } ] +[ TEXTIMAGE_ON { filegroup | DEFAULT } ] + +< column_definition > ::= { column_name data_type } + [ COLLATE < collation_name > ] + [ [ DEFAULT constant_expression ] + | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] + ] + [ ROWGUIDCOL] + [ < column_constraint > ] [ ...n ] + +< column_constraint > ::= [ CONSTRAINT constraint_name ] + { [ NULL | NOT NULL ] + | [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + [ WITH FILLFACTOR = fillfactor ] + [ON {filegroup | DEFAULT} ] ] + ] + | [ [ FOREIGN KEY ] + REFERENCES ref_table [ ( ref_column ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + ] + | CHECK [ NOT FOR REPLICATION ] + ( logical_expression ) + } + +< table_constraint > ::= [ CONSTRAINT constraint_name ] + { [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + { ( column [ ASC | DESC ] [ ,...n ] ) } + [ WITH FILLFACTOR = fillfactor ] + [ ON { filegroup | DEFAULT } ] + ] + | FOREIGN KEY + [ ( column [ ,...n ] ) ] + REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + | CHECK [ NOT FOR REPLICATION ] + ( search_conditions ) + } + + + */ + + /* + CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name + ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) + [ WITH < index_option > [ ,...n] ] + [ ON filegroup ] + < index_option > :: = + { PAD_INDEX | + FILLFACTOR = fillfactor | + IGNORE_DUP_KEY | + DROP_EXISTING | + STATISTICS_NORECOMPUTE | + SORT_IN_TEMPDB + } +*/ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + + $sql[] = $s; + + return $sql; + } + + + function _GetSize($ftype, $ty, $fsize, $fprec) + { + switch ($ftype) { + case 'INT': + case 'SMALLINT': + case 'TINYINT': + case 'BIGINT': + return $ftype; + } + if ($ty == 'T') return $ftype; + return parent::_GetSize($ftype, $ty, $fsize, $fprec); + + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-mysql.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-mysql.inc.php new file mode 100644 index 000000000..8b703d66c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-mysql.inc.php @@ -0,0 +1,182 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_mysql extends ADODB_DataDict { + var $databaseType = 'mysql'; + var $alterCol = ' MODIFY COLUMN'; + var $alterTableAddIndex = true; + var $dropTable = 'DROP TABLE IF EXISTS %s'; // requires mysql 3.22 or later + + var $dropIndex = 'DROP INDEX %s ON %s'; + var $renameColumn = 'ALTER TABLE %s CHANGE COLUMN %s %s %s'; // needs column-definition! + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + $is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->auto_increment; + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + return !empty($fieldobj->binary) ? 'B' : 'X'; + + case 'YEAR': + case 'DATE': return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': return 'T'; + + case 'FLOAT': + case 'DOUBLE': + return 'F'; + + case 'INT': + case 'INTEGER': return $is_serial ? 'R' : 'I'; + case 'TINYINT': return $is_serial ? 'R' : 'I1'; + case 'SMALLINT': return $is_serial ? 'R' : 'I2'; + case 'MEDIUMINT': return $is_serial ? 'R' : 'I4'; + case 'BIGINT': return $is_serial ? 'R' : 'I8'; + default: return 'N'; + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + case 'C': return 'VARCHAR'; + case 'XL':return 'LONGTEXT'; + case 'X': return 'TEXT'; + + case 'C2': return 'VARCHAR'; + case 'X2': return 'LONGTEXT'; + + case 'B': return 'LONGBLOB'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'DATETIME'; + case 'L': return 'TINYINT'; + + case 'R': + case 'I4': + case 'I': return 'INTEGER'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'DOUBLE'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if ($funsigned) $suffix .= ' UNSIGNED'; + if ($fnotnull) $suffix .= ' NOT NULL'; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' AUTO_INCREMENT'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* + CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] + [table_options] [select_statement] + create_definition: + col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] + [PRIMARY KEY] [reference_definition] + or PRIMARY KEY (index_col_name,...) + or KEY [index_name] (index_col_name,...) + or INDEX [index_name] (index_col_name,...) + or UNIQUE [INDEX] [index_name] (index_col_name,...) + or FULLTEXT [INDEX] [index_name] (index_col_name,...) + or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) + [reference_definition] + or CHECK (expr) + */ + + /* + CREATE [UNIQUE|FULLTEXT] INDEX index_name + ON tbl_name (col_name[(length)],... ) + */ + + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname"; + else $sql[] = sprintf($this->dropIndex, $idxname, $tabname); + + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + if (isset($idxoptions['FULLTEXT'])) { + $unique = ' FULLTEXT'; + } elseif (isset($idxoptions['UNIQUE'])) { + $unique = ' UNIQUE'; + } else { + $unique = ''; + } + + if ( is_array($flds) ) $flds = implode(', ',$flds); + + if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname "; + else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname; + + $s .= ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + $sql[] = $s; + + return $sql; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-oci8.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-oci8.inc.php new file mode 100644 index 000000000..0b7ce05a8 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-oci8.inc.php @@ -0,0 +1,297 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_oci8 extends ADODB_DataDict { + + var $databaseType = 'oci8'; + var $seqField = false; + var $seqPrefix = 'SEQ_'; + var $dropTable = "DROP TABLE %s CASCADE CONSTRAINTS"; + var $trigPrefix = 'TRIG_'; + var $alterCol = ' MODIFY '; + var $typeX = 'VARCHAR(4000)'; + var $typeXL = 'CLOB'; + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'VARCHAR': + case 'VARCHAR2': + case 'CHAR': + case 'VARBINARY': + case 'BINARY': + if (isset($this) && $len <= $this->blobSize) return 'C'; + return 'X'; + + case 'NCHAR': + case 'NVARCHAR2': + case 'NVARCHAR': + if (isset($this) && $len <= $this->blobSize) return 'C2'; + return 'X2'; + + case 'NCLOB': + case 'CLOB': + return 'XL'; + + case 'LONG RAW': + case 'LONG VARBINARY': + case 'BLOB': + return 'B'; + + case 'TIMESTAMP': + return 'TS'; + + case 'DATE': + return 'T'; + + case 'INT': + case 'SMALLINT': + case 'INTEGER': + return 'I'; + + default: + return 'N'; + } + } + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'X': return $this->typeX; + case 'XL': return $this->typeXL; + + case 'C2': return 'NVARCHAR2'; + case 'X2': return 'NVARCHAR2(4000)'; + + case 'B': return 'BLOB'; + + case 'TS': + return 'TIMESTAMP'; + + case 'D': + case 'T': return 'DATE'; + case 'L': return 'NUMBER(1)'; + case 'I1': return 'NUMBER(3)'; + case 'I2': return 'NUMBER(5)'; + case 'I': + case 'I4': return 'NUMBER(10)'; + + case 'I8': return 'NUMBER(20)'; + case 'F': return 'NUMBER'; + case 'N': return 'NUMBER'; + case 'R': return 'NUMBER(20)'; + default: + return $meta; + } + } + + function CreateDatabase($dbname, $options=false) + { + $options = $this->_Options($options); + $password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger'; + $tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : ''; + $sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace; + $sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname"; + + return $sql; + } + + function AddColumnSQL($tabname, $flds) + { + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname ADD ("; + foreach($lines as $v) { + $f[] = "\n $v"; + } + + $s .= implode(', ',$f).')'; + $sql[] = $s; + return $sql; + } + + function AlterColumnSQL($tabname, $flds) + { + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname MODIFY("; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f).')'; + $sql[] = $s; + return $sql; + } + + function DropColumnSQL($tabname, $flds) + { + if (!is_array($flds)) $flds = explode(',',$flds); + foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v); + + $sql = array(); + $s = "ALTER TABLE $tabname DROP("; + $s .= implode(', ',$flds).') CASCADE CONSTRAINTS'; + $sql[] = $s; + return $sql; + } + + function _DropAutoIncrement($t) + { + if (strpos($t,'.') !== false) { + $tarr = explode('.',$t); + return "drop sequence ".$tarr[0].".seq_".$tarr[1]; + } + return "drop sequence seq_".$t; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + + if ($fdefault == "''" && $fnotnull) {// this is null in oracle + $fnotnull = false; + if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle"); + } + + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + + if ($fautoinc) $this->seqField = $fname; + if ($fconstraint) $suffix .= ' '.$fconstraint; + + return $suffix; + } + +/* +CREATE or replace TRIGGER jaddress_insert +before insert on jaddress +for each row +begin +select seqaddress.nextval into :new.A_ID from dual; +end; +*/ + function _Triggers($tabname,$tableoptions) + { + if (!$this->seqField) return array(); + + if ($this->schema) { + $t = strpos($tabname,'.'); + if ($t !== false) $tab = substr($tabname,$t+1); + else $tab = $tabname; + $seqname = $this->schema.'.'.$this->seqPrefix.$tab; + $trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab; + } else { + $seqname = $this->seqPrefix.$tabname; + $trigname = $this->trigPrefix.$seqname; + } + + if (strlen($seqname) > 30) { + $seqname = $this->seqPrefix.uniqid(''); + } // end if + if (strlen($trigname) > 30) { + $trigname = $this->trigPrefix.uniqid(''); + } // end if + + if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname"; + $seqCache = ''; + if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];} + $seqIncr = ''; + if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];} + $seqStart = ''; + if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];} + $sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache"; + $sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;"; + + $this->seqField = false; + return $sql; + } + + /* + CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] + [table_options] [select_statement] + create_definition: + col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] + [PRIMARY KEY] [reference_definition] + or PRIMARY KEY (index_col_name,...) + or KEY [index_name] (index_col_name,...) + or INDEX [index_name] (index_col_name,...) + or UNIQUE [INDEX] [index_name] (index_col_name,...) + or FULLTEXT [INDEX] [index_name] (index_col_name,...) + or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) + [reference_definition] + or CHECK (expr) + */ + + + + function _IndexSQL($idxname, $tabname, $flds,$idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + if (isset($idxoptions['BITMAP'])) { + $unique = ' BITMAP'; + } elseif (isset($idxoptions['UNIQUE'])) { + $unique = ' UNIQUE'; + } else { + $unique = ''; + } + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if (isset($idxoptions['oci8'])) + $s .= $idxoptions['oci8']; + + + $sql[] = $s; + + return $sql; + } + + function GetCommentSQL($table,$col) + { + $table = $this->connection->qstr($table); + $col = $this->connection->qstr($col); + return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col"; + } + + function SetCommentSQL($table,$col,$cmt) + { + $cmt = $this->connection->qstr($cmt); + return "COMMENT ON COLUMN $table.$col IS $cmt"; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-postgres.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-postgres.inc.php new file mode 100644 index 000000000..f31bdd758 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-postgres.inc.php @@ -0,0 +1,448 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_postgres extends ADODB_DataDict { + + var $databaseType = 'postgres'; + var $seqField = false; + var $seqPrefix = 'SEQ_'; + var $addCol = ' ADD COLUMN'; + var $quote = '"'; + var $renameTable = 'ALTER TABLE %s RENAME TO %s'; // at least since 7.1 + var $dropTable = 'DROP TABLE %s CASCADE'; + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + $is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique && + $fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval('; + + switch (strtoupper($t)) { + case 'INTERVAL': + case 'CHAR': + case 'CHARACTER': + case 'VARCHAR': + case 'NAME': + case 'BPCHAR': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + return 'X'; + + case 'IMAGE': // user defined type + case 'BLOB': // user defined type + case 'BIT': // This is a bit string, not a single bit, so don't return 'L' + case 'VARBIT': + case 'BYTEA': + return 'B'; + + case 'BOOL': + case 'BOOLEAN': + return 'L'; + + case 'DATE': + return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + case 'TIMESTAMPTZ': + return 'T'; + + case 'INTEGER': return !$is_serial ? 'I' : 'R'; + case 'SMALLINT': + case 'INT2': return !$is_serial ? 'I2' : 'R'; + case 'INT4': return !$is_serial ? 'I4' : 'R'; + case 'BIGINT': + case 'INT8': return !$is_serial ? 'I8' : 'R'; + + case 'OID': + case 'SERIAL': + return 'R'; + + case 'FLOAT4': + case 'FLOAT8': + case 'DOUBLE PRECISION': + case 'REAL': + return 'F'; + + default: + return 'N'; + } + } + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'TEXT'; + + case 'C2': return 'VARCHAR'; + case 'X2': return 'TEXT'; + + case 'B': return 'BYTEA'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'TIMESTAMP'; + + case 'L': return 'BOOLEAN'; + case 'I': return 'INTEGER'; + case 'I1': return 'SMALLINT'; + case 'I2': return 'INT2'; + case 'I4': return 'INT4'; + case 'I8': return 'INT8'; + + case 'F': return 'FLOAT8'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + /** + * Adding a new Column + * + * reimplementation of the default function as postgres does NOT allow to set the default in the same statement + * + * @param string $tabname table-name + * @param string $flds column-names and types for the changed columns + * @return array with SQL strings + */ + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; + foreach($lines as $v) { + if (($not_null = preg_match('/NOT NULL/i',$v))) { + $v = preg_replace('/NOT NULL/i','',$v); + } + if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) { + list(,$colname,$default) = $matches; + $sql[] = $alter . str_replace('DEFAULT '.$default,'',$v); + $sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default; + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default; + } else { + $sql[] = $alter . $v; + } + if ($not_null) { + list($colname) = explode(' ',$v); + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL'; + } + } + return $sql; + } + + + function DropIndexSQL ($idxname, $tabname = NULL) + { + return array(sprintf($this->dropIndex, $this->TableName($idxname), $this->TableName($tabname))); + } + + /** + * Change the definition of one column + * + * Postgres can't do that on it's own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds complete defintion of the new table, eg. for postgres, default '' + * @param array/ $tableoptions options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + /* + function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + if (!$tableflds) { + if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL"); + return array(); + } + return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions); + }*/ + + function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + // Check if alter single column datatype available - works with 8.0+ + $has_alter_column = 8.0 <= (float) @$this->serverInfo['version']; + + if ($has_alter_column) { + $tabname = $this->TableName($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; + foreach($lines as $v) { + if ($not_null = preg_match('/NOT NULL/i',$v)) { + $v = preg_replace('/NOT NULL/i','',$v); + } + // this next block doesn't work - there is no way that I can see to + // explicitly ask a column to be null using $flds + else if ($set_null = preg_match('/NULL/i',$v)) { + // if they didn't specify not null, see if they explicitely asked for null + $v = preg_replace('/\sNULL/i','',$v); + } + + if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) { + list(,$colname,$default) = $matches; + $v = preg_replace('/^' . preg_quote($colname) . '\s/', '', $v); + $sql[] = $alter . $colname . ' TYPE ' . str_replace('DEFAULT '.$default,'',$v); + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default; + } + else { + // drop default? + preg_match ('/^\s*(\S+)\s+(.*)$/',$v,$matches); + list (,$colname,$rest) = $matches; + $sql[] = $alter . $colname . ' TYPE ' . $rest; + } + + list($colname) = explode(' ',$v); + if ($not_null) { + // this does not error out if the column is already not null + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL'; + } + if ($set_null) { + // this does not error out if the column is already null + $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' DROP NOT NULL'; + } + } + return $sql; + } + + // does not have alter column + if (!$tableflds) { + if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL"); + return array(); + } + return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions); + } + + /** + * Drop one column + * + * Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds complete defintion of the new table, eg. for postgres, default '' + * @param array/ $tableoptions options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + $has_drop_column = 7.3 <= (float) @$this->serverInfo['version']; + if (!$has_drop_column && !$tableflds) { + if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3"); + return array(); + } + if ($has_drop_column) { + return ADODB_DataDict::DropColumnSQL($tabname, $flds); + } + return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions); + } + + /** + * Save the content into a temp. table, drop and recreate the original table and copy the content back in + * + * We also take care to set the values of the sequenz and recreate the indexes. + * All this is done in a transaction, to not loose the content of the table, if something went wrong! + * @internal + * @param string $tabname table-name + * @param string $dropflds column-names to drop + * @param string $tableflds complete defintion of the new table, eg. for postgres + * @param array/string $tableoptions options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='') + { + if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds); + $copyflds = array(); + foreach($this->MetaColumns($tabname) as $fld) { + if (!$dropflds || !in_array($fld->name,$dropflds)) { + // we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one + if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) && + in_array($fld->type,array('varchar','char','text','bytea'))) { + $copyflds[] = "to_number($fld->name,'S9999999999999D99')"; + } else { + $copyflds[] = $fld->name; + } + // identify the sequence name and the fld its on + if ($fld->primary_key && $fld->has_default && + preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) { + $seq_name = $matches[1]; + $seq_fld = $fld->name; + } + } + } + $copyflds = implode(', ',$copyflds); + + $tempname = $tabname.'_tmp'; + $aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table + $aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname"; + $aSql = array_merge($aSql,$this->DropTableSQL($tabname)); + $aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions)); + $aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname"; + if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again + $seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence + $aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname"; + } + $aSql[] = "DROP TABLE $tempname"; + // recreate the indexes, if they not contain one of the droped columns + foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data) + { + if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) { + $aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'], + $idx_data['unique'] ? array('UNIQUE') : False)); + } + } + $aSql[] = 'COMMIT'; + return $aSql; + } + + function DropTableSQL($tabname) + { + $sql = ADODB_DataDict::DropTableSQL($tabname); + + $drop_seq = $this->_DropAutoIncrement($tabname); + if ($drop_seq) $sql[] = $drop_seq; + + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + if ($fautoinc) { + $ftype = 'SERIAL'; + return ''; + } + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + // search for a sequece for the given table (asumes the seqence-name contains the table-name!) + // if yes return sql to drop it + // this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!! + function _DropAutoIncrement($tabname) + { + $tabname = $this->connection->quote('%'.$tabname.'%'); + + $seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'"); + + // check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly + if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) { + return False; + } + return "DROP SEQUENCE ".$seq; + } + + function RenameTableSQL($tabname,$newname) + { + if (!empty($this->schema)) { + $rename_from = $this->TableName($tabname); + $schema_save = $this->schema; + $this->schema = false; + $rename_to = $this->TableName($newname); + $this->schema = $schema_save; + return array (sprintf($this->renameTable, $rename_from, $rename_to)); + } + + return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); + } + + /* + CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( + { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ] + | table_constraint } [, ... ] + ) + [ INHERITS ( parent_table [, ... ] ) ] + [ WITH OIDS | WITHOUT OIDS ] + where column_constraint is: + [ CONSTRAINT constraint_name ] + { NOT NULL | NULL | UNIQUE | PRIMARY KEY | + CHECK (expression) | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ] + [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + and table_constraint is: + [ CONSTRAINT constraint_name ] + { UNIQUE ( column_name [, ... ] ) | + PRIMARY KEY ( column_name [, ... ] ) | + CHECK ( expression ) | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + */ + + + /* + CREATE [ UNIQUE ] INDEX index_name ON table +[ USING acc_method ] ( column [ ops_name ] [, ...] ) +[ WHERE predicate ] +CREATE [ UNIQUE ] INDEX index_name ON table +[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] ) +[ WHERE predicate ] + */ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; + + if (isset($idxoptions['HASH'])) + $s .= 'USING HASH '; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s .= '(' . $flds . ')'; + $sql[] = $s; + + return $sql; + } + + function _GetSize($ftype, $ty, $fsize, $fprec) + { + if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) { + $ftype .= "(".$fsize; + if (strlen($fprec)) $ftype .= ",".$fprec; + $ftype .= ')'; + } + return $ftype; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-sapdb.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-sapdb.inc.php new file mode 100644 index 000000000..d4143d103 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-sapdb.inc.php @@ -0,0 +1,122 @@ +<?php + +/** + V4.50 6 July 2004 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + + Modified from datadict-generic.inc.php for sapdb by RalfBecker-AT-outdoor-training.de +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_sapdb extends ADODB_DataDict { + + var $databaseType = 'sapdb'; + var $seqField = false; + var $renameColumn = 'RENAME COLUMN %s.%s TO %s'; + + function ActualType($meta) + { + switch($meta) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'LONG'; + + case 'C2': return 'VARCHAR UNICODE'; + case 'X2': return 'LONG UNICODE'; + + case 'B': return 'LONG'; + + case 'D': return 'DATE'; + case 'TS': + case 'T': return 'TIMESTAMP'; + + case 'L': return 'BOOLEAN'; + case 'I': return 'INTEGER'; + case 'I1': return 'FIXED(3)'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INTEGER'; + case 'I8': return 'FIXED(20)'; + + case 'F': return 'FLOAT(38)'; + case 'N': return 'FIXED'; + default: + return $meta; + } + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + static $maxdb_type2adodb = array( + 'VARCHAR' => 'C', + 'CHARACTER' => 'C', + 'LONG' => 'X', // no way to differ between 'X' and 'B' :-( + 'DATE' => 'D', + 'TIMESTAMP' => 'T', + 'BOOLEAN' => 'L', + 'INTEGER' => 'I4', + 'SMALLINT' => 'I2', + 'FLOAT' => 'F', + 'FIXED' => 'N', + ); + $type = isset($maxdb_type2adodb[$t]) ? $maxdb_type2adodb[$t] : 'C'; + + // convert integer-types simulated with fixed back to integer + if ($t == 'FIXED' && !$fieldobj->scale && ($len == 20 || $len == 3)) { + $type = $len == 20 ? 'I8' : 'I1'; + } + if ($fieldobj->auto_increment) $type = 'R'; + + return $type; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if ($funsigned) $suffix .= ' UNSIGNED'; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fautoinc) $suffix .= ' DEFAULT SERIAL'; + elseif (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + return array( 'ALTER TABLE ' . $tabname . ' ADD (' . implode(', ',$lines) . ')' ); + } + + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + return array( 'ALTER TABLE ' . $tabname . ' MODIFY (' . implode(', ',$lines) . ')' ); + } + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + foreach($flds as $k => $v) { + $flds[$k] = $this->NameQuote($v); + } + return array( 'ALTER TABLE ' . $tabname . ' DROP (' . implode(', ',$flds) . ')' ); + } +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/datadict/datadict-sybase.inc.php b/pos/is4c-nf/lib/adodb5/datadict/datadict-sybase.inc.php new file mode 100644 index 000000000..075bd7148 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/datadict/datadict-sybase.inc.php @@ -0,0 +1,229 @@ +<?php + +/** + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB2_sybase extends ADODB_DataDict { + var $databaseType = 'sybase'; + + var $dropIndex = 'DROP INDEX %2$s.%1$s'; + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + + case 'INT': + case 'INTEGER': return 'I'; + case 'BIT': + case 'TINYINT': return 'I1'; + case 'SMALLINT': return 'I2'; + case 'BIGINT': return 'I8'; + + case 'REAL': + case 'FLOAT': return 'F'; + default: return parent::MetaType($t,$len,$fieldobj); + } + } + + function ActualType($meta) + { + switch(strtoupper($meta)) { + case 'C': return 'VARCHAR'; + case 'XL': + case 'X': return 'TEXT'; + + case 'C2': return 'NVARCHAR'; + case 'X2': return 'NTEXT'; + + case 'B': return 'IMAGE'; + + case 'D': return 'DATETIME'; + case 'TS': + case 'T': return 'DATETIME'; + case 'L': return 'BIT'; + + case 'I': return 'INT'; + case 'I1': return 'TINYINT'; + case 'I2': return 'SMALLINT'; + case 'I4': return 'INT'; + case 'I8': return 'BIGINT'; + + case 'F': return 'REAL'; + case 'N': return 'NUMERIC'; + default: + return $meta; + } + } + + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $f = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $s = "ALTER TABLE $tabname $this->addCol"; + foreach($lines as $v) { + $f[] = "\n $v"; + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + + return $sql; + } + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + $f = array(); + $s = "ALTER TABLE $tabname"; + foreach($flds as $v) { + $f[] = "\n$this->dropCol ".$this->NameQuote($v); + } + $s .= implode(', ',$f); + $sql[] = $s; + return $sql; + } + + // return string must begin with space + function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT'; + if ($fnotnull) $suffix .= ' NOT NULL'; + else if ($suffix == '') $suffix .= ' NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + /* +CREATE TABLE + [ database_name.[ owner ] . | owner. ] table_name + ( { < column_definition > + | column_name AS computed_column_expression + | < table_constraint > ::= [ CONSTRAINT constraint_name ] } + + | [ { PRIMARY KEY | UNIQUE } [ ,...n ] + ) + +[ ON { filegroup | DEFAULT } ] +[ TEXTIMAGE_ON { filegroup | DEFAULT } ] + +< column_definition > ::= { column_name data_type } + [ COLLATE < collation_name > ] + [ [ DEFAULT constant_expression ] + | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] + ] + [ ROWGUIDCOL] + [ < column_constraint > ] [ ...n ] + +< column_constraint > ::= [ CONSTRAINT constraint_name ] + { [ NULL | NOT NULL ] + | [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + [ WITH FILLFACTOR = fillfactor ] + [ON {filegroup | DEFAULT} ] ] + ] + | [ [ FOREIGN KEY ] + REFERENCES ref_table [ ( ref_column ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + ] + | CHECK [ NOT FOR REPLICATION ] + ( logical_expression ) + } + +< table_constraint > ::= [ CONSTRAINT constraint_name ] + { [ { PRIMARY KEY | UNIQUE } + [ CLUSTERED | NONCLUSTERED ] + { ( column [ ASC | DESC ] [ ,...n ] ) } + [ WITH FILLFACTOR = fillfactor ] + [ ON { filegroup | DEFAULT } ] + ] + | FOREIGN KEY + [ ( column [ ,...n ] ) ] + REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] + [ ON DELETE { CASCADE | NO ACTION } ] + [ ON UPDATE { CASCADE | NO ACTION } ] + [ NOT FOR REPLICATION ] + | CHECK [ NOT FOR REPLICATION ] + ( search_conditions ) + } + + + */ + + /* + CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name + ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) + [ WITH < index_option > [ ,...n] ] + [ ON filegroup ] + < index_option > :: = + { PAD_INDEX | + FILLFACTOR = fillfactor | + IGNORE_DUP_KEY | + DROP_EXISTING | + STATISTICS_NORECOMPUTE | + SORT_IN_TEMPDB + } +*/ + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + $sql[] = $s; + + return $sql; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-active-record.htm b/pos/is4c-nf/lib/adodb5/docs/docs-active-record.htm new file mode 100644 index 000000000..236dbb875 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-active-record.htm @@ -0,0 +1,1079 @@ +<html> +<style> +pre { + background-color: #eee; + padding: 0.75em 1.5em; + font-size: 12px; + border: 1px solid #ddd; +} + +li,p { +font-family: Arial, Helvetica, sans-serif ; +} +</style> +<title>ADOdb Active Record</title> +<body> +<h1>ADOdb Active Record</h1> +<p> (c) 2000-2009 John Lim (jlim#natsoft.com)</p> +<p><font size="1">This software is dual licensed using BSD-Style and LGPL. This + means you can use it in compiled proprietary and commercial products.</font></p> +<p><hr> +<ol> + +<h3><li>Introduction</h3> +<p> +ADOdb_Active_Record is an Object Relation Mapping (ORM) implementation using PHP. In an ORM system, the tables and rows of the database are abstracted into native PHP objects. This allows the programmer to focus more on manipulating the data and less on writing SQL queries. +<p> +This implementation differs from Zend Framework's implementation in the following ways: +<ul> +<li>Works with PHP4 and PHP5 and provides equivalent functionality in both versions of PHP.<p> +<li>ADOdb_Active_Record works when you are connected to multiple databases. Zend's only works when connected to a default database.<p> +<li>Support for $ADODB_ASSOC_CASE. The field names are upper-cased, lower-cased or left in natural case depending on this setting.<p> +<li>No field name conversion to camel-caps style, unlike Zend's implementation which will convert field names such as 'first_name' to 'firstName'.<p> +<li>NewADOConnection::GetActiveRecords() and ADOConnection::GetActiveRecordsClass() functions in adodb.inc.php.<p> +<li>Caching of table metadata so it is only queried once per table, no matter how many Active Records are created.<p> +<li>PHP5 version of ADOdb_Active_Record now supports <a href=#onetomany>one-to-many</a> relationships.<p> +<li>New adodb-active-recordx.inc.php, which is an <a href=#recordx>Active Record eXtended</a> implementation that support JOINs for higher performance when loading children, and other nice features.<p> +<li>Lots of <a href=#additional>additional functionality</a>.<p> +</ul> +<P> +ADOdb_Active_Record is designed upon the principles of the "ActiveRecord" design pattern, which was first described by Martin Fowler. The ActiveRecord pattern has been implemented in many forms across the spectrum of programming languages. ADOdb_Active_Record attempts to represent the database as closely to native PHP objects as possible. +<p> +ADOdb_Active_Record maps a database table to a PHP class, and each instance of that class represents a table row. Relations between tables can also be defined, allowing the ADOdb_Active_Record objects to be nested. +<p> + +<h3><li>Setting the Database Connection</h3> +<p> +The first step to using ADOdb_Active_Record is to set the default connection that an ADOdb_Active_Record objects will use to connect to a database. + +<pre> +require_once('adodb/adodb-active-record.inc.php'); + +$db = NewADOConnection('mysql://root:pwd@localhost/dbname'); +ADOdb_Active_Record::SetDatabaseAdapter($db); +</pre> + +<h3><li>Table Rows as Objects</h3> +<p> +First, let's create a temporary table in our MySQL database that we can use for demonstrative purposes throughout the rest of this tutorial. We can do this by sending a CREATE query: + +<pre> +$db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + </pre> +<p> +ADOdb_Active_Records are object representations of table rows. Each table in the database is represented by a class in PHP. To begin working with a table as a ADOdb_Active_Record, a class that extends ADOdb_Active_Record needs to be created for it. + +<pre> +class person extends ADOdb_Active_Record{} +$person = new person(); +</pre> + +<p> +In the above example, a new ADOdb_Active_Record object $person was created to access the "persons" table. Zend_Db_DataObject takes the name of the class, pluralizes it (according to American English rules), and assumes that this is the name of the table in the database. Also note that with MySQL, table names are case-sensitive, so your class name must match the table name's case. With other databases with case-insensitive tables, your class can be capitalized differently. +<p> +This kind of behavior is typical of ADOdb_Active_Record. It will assume as much as possible by convention rather than explicit configuration. In situations where it isn't possible to use the conventions that ADOdb_Active_Record expects, options can be overridden as we'll see later. + +<h3><li>Table Columns as Object Properties</h3> +<p> +When the $person object was instantiated, ADOdb_Active_Record read the table metadata from the database itself, and then exposed the table's columns (fields) as object properties. +<p> +Our "persons" table has three fields: "name_first", "name_last", and "favorite_color". Each of these fields is now a property of the $person object. To see all these properties, use the ADOdb_Active_Record::getAttributeNames() method: +<pre> +var_dump($person->getAttributeNames()); + +/** + * Outputs the following: + * array(4) { + * [0]=> + * string(2) "id" + * [1]=> + * string(9) "name_first" + * [2]=> + * string(8) "name_last" + * [3]=> + * string(13) "favorite_color" + * } + */ + </pre> +<p> +One big difference between ADOdb and Zend's implementation is we do not automatically convert to camelCaps style. +<p> +<h3><li>Inserting and Updating a Record</h3><p> + +An ADOdb_Active_Record object is a representation of a single table row. However, when our $person object is instantiated, it does not reference any particular row. It is a blank record that does not yet exist in the database. An ADOdb_Active_Record object is considered blank when its primary key is NULL. The primary key in our persons table is "id". +<p> +To insert a new record into the database, change the object's properties and then call the ADOdb_Active_Record::save() method: +<pre> +$person = new person(); +$person->name_first = 'Andi'; +$person->name_last = 'Gutmans'; +$person->save(); + </pre> +<p> +Oh, no! The above code snippet does not insert a new record into the database. Instead, outputs an error: +<pre> +1048: Column 'favorite_color' cannot be null + </pre> +<p> +This error occurred because MySQL rejected the INSERT query that was generated by ADOdb_Active_Record. If exceptions are enabled in ADOdb and you are using PHP5, an error will be thrown. In the definition of our table, we specified all of the fields as NOT NULL; i.e., they must contain a value. +<p> +ADOdb_Active_Records are bound by the same contraints as the database tables they represent. If the field in the database cannot be NULL, the corresponding property in the ADOdb_Active_Record also cannot be NULL. In the example above, we failed to set the property $person->favoriteColor, which caused the INSERT to be rejected by MySQL. +<p> +To insert a new ADOdb_Active_Record in the database, populate all of ADOdb_Active_Record's properties so that they satisfy the constraints of the database table, and then call the save() method: +<pre> +/** + * Calling the save() method will successfully INSERT + * this $person into the database table. + */ +$person = new person(); +$person->name_first = 'Andi'; +$person->name_last = 'Gutmans'; +$person->favorite_color = 'blue'; +$person->save(); +</pre> +<p> +Once this $person has been INSERTed into the database by calling save(), the primary key can now be read as a property. Since this is the first row inserted into our temporary table, its "id" will be 1: +<pre> +var_dump($person->id); + +/** + * Outputs the following: + * string(1) + */ + </pre> +<p> +From this point on, updating it is simply a matter of changing the object's properties and calling the save() method again: + +<pre> +$person->favorite_color = 'red'; +$person->save(); + </pre> +<p> +The code snippet above will change the favorite color to red, and then UPDATE the record in the database. + +<a name=additional> +<h2>ADOdb Specific Functionality</h2> +<h3><li>Setting the Table Name</h3> +<p>The default behaviour on creating an ADOdb_Active_Record is to "pluralize" the class name and + use that as the table name. Often, this is not the case. For example, the person class could be reading + from the "People" table. +<p>We provide two ways to define your own table: +<p>1. Use a constructor parameter to override the default table naming behaviour. +<pre> + class person extends ADOdb_Active_Record{} + $person = new person('People'); +</pre> +<p>2. Define it in a class declaration: +<pre> + class person extends ADOdb_Active_Record + { + var $_table = 'People'; + } + $person = new person(); +</pre> + +<h3><li>$ADODB_ASSOC_CASE</h3> +<p>This allows you to control the case of field names and properties. For example, all field names in Oracle are upper-case by default. So you +can force field names to be lowercase using $ADODB_ASSOC_CASE. Legal values are as follows: +<pre> + 0: lower-case + 1: upper-case + 2: native-case +</pre> +<p>So to force all Oracle field names to lower-case, use +<pre> +$ADODB_ASSOC_CASE = 0; +$person = new person('People'); +$person->name = 'Lily'; +$ADODB_ASSOC_CASE = 2; +$person2 = new person('People'); +$person2->NAME = 'Lily'; +</pre> + +<p>Also see <a href=http://phplens.com/adodb/reference.constants.adodb_assoc_case.html>$ADODB_ASSOC_CASE</a>. + +<h3><li>ADOdb_Active_Record::Save()</h3> +<p> +Saves a record by executing an INSERT or UPDATE SQL statement as appropriate. +<p>Returns false on unsuccessful INSERT, true if successsful INSERT. +<p>Returns 0 on failed UPDATE, and 1 on UPDATE if data has changed, and -1 if no data was changed, so no UPDATE statement was executed. + +<h3><li>ADOdb_Active_Record::Replace()</h3> +<p> +ADOdb supports replace functionality, whereby the record is inserted if it does not exists, or updated otherwise. +<pre> +$rec = new ADOdb_Active_Record("product"); +$rec->name = 'John'; +$rec->tel_no = '34111145'; +$ok = $rec->replace(); // 0=failure, 1=update, 2=insert +</pre> + + +<h3><li>ADOdb_Active_Record::Load($where)</h3> +<p>Sometimes, we want to load a single record into an Active Record. We can do so using: +<pre> +$person->load("id=3"); + +// or using bind parameters + +$person->load("id=?", array(3)); +</pre> +<p>Returns false if an error occurs. + +<h3><li>ADOdb_Active_Record::Find($whereOrderBy, $bindarr=false, $pkeyArr=false)</h3> +<p>We want to retrieve an array of active records based on some search criteria. For example: +<pre> +class person extends ADOdb_Active_Record { +var $_table = 'people'; +} + +$person = new person(); +$peopleArray = $person->Find("name like ? order by age", array('Sm%')); +</pre> + +<h3><li>Quoting Identifiers</h3> +<p>You can force column names to be quoted in INSERT and UPDATE statements, typically because you are using reserved words as column names by setting +<pre> +ADODB_Active_Record::$_quoteNames = true; +</pre> +<p>Default is false. + +<h3><li>Error Handling and Debugging</h3> +<p> +In PHP5, if adodb-exceptions.inc.php is included, then errors are thrown. Otherwise errors are handled by returning a value. False by default means an error has occurred. You can get the last error message using the ErrorMsg() function. +<p> +To check for errors in ADOdb_Active_Record, do not poll ErrorMsg() as the last error message will always be returned, even if it occurred several operations ago. Do this instead: +<pre> +# right! +$ok = $rec->Save(); +if (!$ok) $err = $rec->ErrorMsg(); + +# wrong :( +$rec->Save(); +if ($rec->ErrorMsg()) echo "Wrong way to detect error"; +</pre> +<p>The ADOConnection::Debug property is obeyed. So +if $db->debug is enabled, then ADOdb_Active_Record errors are also outputted to standard output and written to the browser. + +<h3><li>ADOdb_Active_Record::Set()</h3> +<p>You can convert an array to an ADOdb_Active_Record using Set(). The array must be numerically indexed, and have all fields of the table defined in the array. The elements of the array must be in the table's natural order too. +<pre> +$row = $db->GetRow("select * from tablex where id=$id"); + +# PHP4 or PHP5 without enabling exceptions +$obj = new ADOdb_Active_Record('Products'); +if ($obj->ErrorMsg()){ + echo $obj->ErrorMsg(); +} else { + $obj->Set($row); +} + +# in PHP5, with exceptions enabled: + +include('adodb-exceptions.inc.php'); +try { + $obj = new ADOdb_Active_Record('Products'); + $obj->Set($row); +} catch(exceptions $e) { + echo $e->getMessage(); +} +</pre> +<p> +<h3><li>Primary Keys</h3> +<p> +ADOdb_Active_Record does not require the table to have a primary key. You can insert records for such a table, but you will not be able to update nor delete. +<p>Sometimes you are retrieving data from a view or table that has no primary key, but has a unique index. You can dynamically set the primary key of a table through the constructor, or using ADOdb_Active_Record::SetPrimaryKeys(): +<pre> + $pkeys = array('category','prodcode'); + + // set primary key using constructor + $rec = new ADOdb_Active_Record('Products', $pkeys); + + // or use method + $rec->SetPrimaryKeys($pkeys); +</pre> + + +<h3><li>Retrieval of Auto-incrementing ID</h3> +When creating a new record, the retrieval of the last auto-incrementing ID is not reliable for databases that do not support the Insert_ID() function call (check $connection->hasInsertID). In this case we perform a <b>SELECT MAX($primarykey) FROM $table</b>, which will not work reliably in a multi-user environment. You can override the ADOdb_Active_Record::LastInsertID() function in this case. + +<h3><li>Dealing with Multiple Databases</h3> +<p> +Sometimes we want to load data from one database and insert it into another using ActiveRecords. This can be done using the optional parameter of the ADOdb_Active_Record constructor. In the following example, we read data from db.table1 and store it in db2.table2: +<pre> +$db = NewADOConnection(...); +$db2 = NewADOConnection(...); + +ADOdb_Active_Record::SetDatabaseAdapter($db2); + +$activeRecs = $db->GetActiveRecords('table1'); + +foreach($activeRecs as $rec) { + $rec2 = new ADOdb_Active_Record('table2',$db2); + $rec2->id = $rec->id; + $rec2->name = $rec->name; + + $rec2->Save(); +} +</pre> +<p> +If you have to pass in a primary key called "id" and the 2nd db connection in the constructor, you can do so too: +<pre> +$rec = new ADOdb_Active_Record("table1",array("id"),$db2); +</pre> +<p>You can now give a named label in SetDatabaseAdapter, allowing to determine in your class definition which database to load, using var $_dbat. +<pre> +$db1 = NewADOConnection(...); // some ADOdb DB +ADOdb_Active_Record::SetDatabaseAdapter($db1, 'mysql'); +$db2 = NewADOConnection(...); // some ADOdb DB +ADOdb_Active_Record::SetDatabaseAdapter($db2, 'oracle'); + +class FooRecord extends ADOdb_Active_Record +{ +<b>var $_dbat = 'mysql';</b> // uses 'mysql' connection +... +} +</pre> +<h3><li>$ADODB_ACTIVE_CACHESECS</h3> +<p>You can cache the table metadata (field names, types, and other info such primary keys) in $ADODB_CACHE_DIR (which defaults to /tmp) by setting +the global variable $ADODB_ACTIVE_CACHESECS to a value greater than 0. This will be the number of seconds to cache. + You should set this to a value of 30 seconds or greater for optimal performance. + +<h3><li>Active Record Considered Bad?</h3> +<p>Although the Active Record concept is useful, you have to be aware of some pitfalls when using Active Record. The level of granularity of Active Record is individual records. It encourages code like the following, used to increase the price of all furniture products by 10%: +<pre> + $recs = $db->GetActiveRecords("Products","category='Furniture'"); + foreach($recs as $rec) { + $rec->price *= 1.1; // increase price by 10% for all Furniture products + $rec->save(); + } +</pre> +Of course an UPDATE statement is superior because it's simpler and much more efficient (probably by a factor of x10 or more): +<pre> + $db->Execute("update Products set price = price * 1.1 where category='Furniture'"); +</pre> +<p>For performance sensitive code, using direct SQL will always be faster than using Active Records due to overhead and the fact that all fields in a row are retrieved (rather than only the subset you need) whenever an Active Record is loaded. + +<h3><li>Transactions</h3> +<p> +The default transaction mode in ADOdb is autocommit. So that is the default with active record too. +The general rules for managing transactions still apply. Active Record to the database is a set of insert/update/delete statements, and the db has no knowledge of active records. +<p> +Smart transactions, that does an auto-rollback if an error occurs, is still the best method to multiple activities (inserts/updates/deletes) that need to be treated as a single transaction: +<pre> +$conn->StartTrans(); +$parent->save(); +$child->save(); +$conn->CompleteTrans(); +</pre> + +<a name=onetomany> +<h2>One to Many Relations</h3> +<p>Since ADOdb 5.06, we support parent child relationships. This is done using the ClassBelongsTo() and ClassHasMany() functions. +<a name=tablehasmany> +<h3><li>ClassHasMany</h3> +<p>To globally define a one-to-many relationship we use the static function ADODB_Active_Record::ClassHasMany($class, $relation, $foreignKey = '', $foreignClass = 'ADODB_Active_Record'). For example, we have 2 tables, <strong>persons</strong> (parent table) and <strong>children</strong> (child table) +linked by <strong>persons.id = children.person_id</strong>. The variable $person->children is an array that holds the children. To define this relationship: +<pre> + class person extends ADOdb_Active_Record{} + ADODB_Active_Record::ClassHasMany('person', 'children','person_id'); + + $person = new person(); + $person->Load("id=1"); + foreach($person->children as $c) { + echo " $c->name_first "; + $c->name_first .= ' K.'; + $c->Save(); ## each child record must be saved individually + } +</pre> +<p>If no data is loaded, then children is set to an empty array: +<pre> + $person2 = new person(); + $p = $person2->children; ## $p is an empty array() +</pre> +<P>By default, data returned by HasMany() is unsorted. To define an order by clause (or define a SELECT LIMIT window), see <a href=#loadrelations>LoadRelations()</a> below. Another point is that all children are loaded only when the child member is accessed (in __get), and not when the Load() function of the parent object is called. This helps to conserve memory. + +<p>To create and save new parent and child records: +<pre> + + class person extends ADOdb_Active_Record{} + class children extends ADOdb_Active_Record{} + ADODB_Active_Record::ClassHasMany('person', 'children','person_id'); + + $person = new person(); + + for ($i=0; $i<10; $i++) + $person->children[0] = new children('children'); + + // modify fields of $person, then... + $person->save(); + + foreach($person->children as $c) { + // modify fields of $c then... + $c->save(); + } +</pre> +<p>You can have multiple relationships (warning: relations are case-sensitive, 'Children' !== 'children'): +<pre> + ADODB_Active_Record::ClassHasMany('person', 'children','person_id'); + ADODB_Active_Record::ClassHasMany('person', 'siblings','person_id'); + $person = new person(); + $person->Load('id=1'); + var_dump($person->children); + var_dump($person->siblings); +</pre> +<p>By default, the child class is ADOdb_Active_Record. Sometimes you might want the child class to be based on your own class which has additional functions. You can do so using the last parameter: +<pre> + class person extends ADOdb_Active_Record{} + class child extends ADOdb_Active_Record { .... some modifications here ... } + ADODB_Active_Record::ClassHasMany('person', 'children','person_id', 'child'); +</pre> +<p>Lastly some troubleshooting issues. We use the __get() method to set +$p->children below. So once $p->children is defined by accessing it, we don't change the child reference, as shown below: +<pre> + ADODB_Active_Record::ClassHasMany('person', 'children','person_id'); + $p = new person(); + $p->Load('id=1'); + # $p->children points to person_id = 1 + var_dump($p->children); + + $p->Load('id=2'); + # $p->children still points to person_id = 1 + var_dump($p->children); +</pre> +<p>The solution to the above is to unset($p->children) before $p->Load('id=2'). +<h3><li>TableHasMany</h3> +For some classes, the mapping between class name and table name (which is the pluralised version) might not match. For example, +the class name might be <b>person</b>, but the table name might be <b>people</b>. So we have 2 tables, <strong>people</strong> (parent table) and <strong>children</strong> (child table) +linked by <strong>people.id = children.person_id</strong>. +<p>Then you use the following static function + ADODB_Active_Record::TableHasMany($table, $relation, $foreignKey = '', $foreignClass = 'ADODB_Active_Record') like this: +<pre> +ADODB_Active_Record::TableHasMany('people', 'children', 'person_id') +</pre> +<h3><li>TableKeyHasMany</h3> +For some classes, the mapping between class name and table name (which is the pluralised version) might not match or the primary key is not the default <b>id</b>. For example, +the class name might be <b>person</b>, but the table name might be <b>people</b>. So we have 2 tables, <strong>people</strong> (parent table) and <strong>children</strong> (child table) +linked by <strong>people.pid = children.person_id</strong>. +<p>Then you use the following static function + ADODB_Active_Record::TableKeyHasMany($table, $tablePKey, $relation, $foreignKey = '', $foreignClass = 'ADODB_Active_Record') like this: +<pre> +ADODB_Active_Record::TableKeyHasMany('people', 'pid', 'children', 'person_id') +</pre> + + +<h3><li>A Complete ClassHasMany example</h3> +<p>Here is sample usage using mysql: +<pre> + include_once('../adodb.inc.php'); + include_once('../adodb-active-record.inc.php'); + + $db = NewADOConnection('mysql://root@localhost/northwind'); + ADOdb_Active_Record::SetDatabaseAdapter($db); + + $db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TEMPORARY TABLE `children` ( + `id` int(10) unsigned NOT NULL auto_increment, + `person_id` int(10) unsigned NOT NULL, + `gender` varchar(10) default 'F', + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Jill','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')"); + + class person extends ADOdb_Active_Record{} + ADODB_Active_Record::ClassHasMany('person', 'children','person_id'); + + $person = new person(); + + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + $person2 = new person(); # no need to define HasMany() again, adodb remembers definition + $person2->Load('id=1'); + + $c = $person2->children; + if (is_array($c) && sizeof($c) == 3 && $c[0]->name_first=='Jill' && $c[1]->name_first=='Joan' + && $c[2]->name_first == 'JAMIE') echo "OK Loaded HasMany&lt;br>"; + else { + echo "Error loading hasMany should have 3 array elements Jill Joan Jamie&lt;br>"; + } +</pre> + +<h3><li>HasMany</h3> +<p>This older method is deprecated and ClassHasMany/TableHasMany/TableKeyHasMany should be used. +<p>The older way to define a one-to-many relationship is to use $parentobj->HasMany($relation, $foreignKey = ''). For example, we have 2 tables, <strong>persons</strong> (parent table) and <strong>children</strong> (child table) +linked by <strong>persons.id = children.person_id</strong>. The variable $person->children is an array that holds the children. To define this relationship: +<pre> + class person extends ADOdb_Active_Record{} + + $person = new person(); + $person->HasMany('children','person_id'); + $person->Load("id=1"); + foreach($person->children as $c) { + echo " $c->name_first "; + $c->name_first .= ' K.'; + $c->Save(); ## each child record must be saved individually + } +</pre> +<p>This HasMany() definition is global for the current script. This means that you only need to define it once. In the following example, $person2 knows about <em>children</em>. +<pre> + $person = new person(); + $person->HasMany('children','person_id'); + + $person2 = new person(); + $person->Load("id=1"); + $p = $person2->children; +</pre> + + +<h3><li>ClassBelongsTo</h3> +<p>You can define the parent of the current object using ADODB_Active_Record::ClassBelongsTo($class, $relationName, $foreignKey, $parentPrimaryKey = 'id', $parentClass = 'ADODB_Active_Record'). In the example below, +we have a child table <strong>kids</strong>, and a parent table <strong>person</strong>. We have a link <strong>kids.person_id = persons.id</strong>. We create a child first, then link it to the parent: +<pre> + class kid extends ADOdb_Active_Record{}; + ADODB_Active_Record::ClassBelongsTo('kid','person','person_id','id'); + + $ch = new kid(); // default tablename will be 'kids', with primary key 'id' + $ch->Load('id=1'); + $p = $ch->person; + if (!$p || $p->name_first != 'John') echo "Error loading belongsTo&lt;br>"; + else echo "OK loading BelongTo&lt;br>"; +</pre> +<p> +<p>Note that relationships are case-sensitive, so ClassBelongsTo('kid','PARENT', 'parent_id') and ClassBelongsTo('kid', 'parent', 'parent_id') are not the same. +<p>Also if no data is loaded into the child instance, then $p will return null; +<pre> + ADODB_Active_Record::ClassBelongsTo('kid','person','person_id','id'); + + $ch = new kid(); + $p = $ch->person; # $p is null +</pre> +<p>Another way to define the class of the parent (which otherwise defaults to ADODB_Active_Record) as follows: +<pre> + + class kid extends ADOdb_Active_Record{}; + class person extends ADOdb_Active_Record{... your modifications ... }; + ADODB_Active_Record::ClassBelongsTo('kid','person','person_id','id', 'person'); +</pre> +<h3><li>TableBelongsTo</h3> +<p>If the child table differs from the convention that the child table name is the plural of the child class name, use this function: +ADODB_Active_Record::TableBelongsTo($childTable, $relationName, $foreignKey, $parentPrimaryKey = 'id', $parentClass = 'ADODB_Active_Record'). +<p>E.g. the class is <b>child</b>, but the table name is <b>children</b>, and the link between the two tables is children.person_id = person.id: +<pre> + ADODB_Active_Record::TableBelongsTo('children','person','person_id','id'); +</pre> +<h3><li>TableKeyBelongsTo</h3> +<p>If the child table differs from the convention that the child table name is the plural of the child class name or the primary key is not 'id', use this function: +ADODB_Active_Record::TableKeyBelongsTo($childTable, $childKey, $relationName, $foreignKey, $parentPrimaryKey = 'id', $parentClass = 'ADODB_Active_Record'). +<p>E.g. the class is <b>child</b>, but the table name is <b>children</b> and primary key is <b>ch_id</b>, and the link between the two tables is children.person_id = person.id: +<pre> + ADODB_Active_Record::TableKeyBelongsTo('children','ch_id', 'person','person_id','id'); +</pre> +<h3><li>BelongsTo</h3> +<p>The following is deprecated. Use ClassBelongsTo/TableBelongsTo/TableKeyBelongsTo instead. +<p>The older way to define the parent of the current object is using BelongsTo($relationName, $foreignKey, $parentPrimaryKey = 'id'). In the example below, +we have a child table <strong>children</strong>, and a parent table <strong>person</strong>. We have a link <strong>children.person_id = persons.id</strong>. We create a child first, then link it to the parent: +<pre> + class Child extends ADOdb_Active_Record{}; + $ch = new Child('children',array('id')); + $ch->BelongsTo('person','person_id','id'); ## this can be simplified to $ch->BelongsTo('person') + ## as foreign key defaults to $table.'_id' and + ## parent pkey defaults to 'id' + $ch->Load('id=1'); + $p = $ch->person; + if (!$p || $p->name_first != 'John') echo "Error loading belongsTo&lt;br>"; + else echo "OK loading BelongTo&lt;br>"; +</pre> +<p>You only need to define BelongsTo() once in a script as it is global for all instances. +<a name=loadrelations> +<h3><li>LoadRelations</h3> +<p>Sometimes you want to load only a subset of data in a relationship. For example, you could load all female children sorted by children.name +using LoadRelations($relation, $whereOrderBy = '', $offset = -1, $limit = -1): +<pre> + # assume this has been called: + # ADODB_Active_Record::ClassHasMany('person', 'children','person_id'); + $person = new person(); + $person->Load('id=23'); + # Load doesn't load children until $person->children is accessed or LoadRelations is called: + $person->LoadRelations('children',"gender='F' order by name"); +</pre> +<p>Lastly, if you have lots of child data, you can define a window of data of records to load. In the following +example, we load a window of 100 records at a time: +<pre> + + # assume this has been called: + # ADODB_Active_Record::ClassHasMany('Account', 'transactions','account_id'); + $acc = new Account(); + $acc->Load('id=23'); + while(true) { + $start = 0; + $acc->LoadRelations('transactions',"tx_done=0 order by trxdate", $start, $start+100); + if (!$acc->transactions) break; + foreach ($acc->transactions as $k => $trx) { + ## process + $trx->tx_done = 1; + $trx->save(); + } + $start += 100; + } +</pre> +<p>The $offset is 0-based, and $limit is the number of records to retrieve. The default is to ignore $offset (-1) and $limit (-1). +<h3><li>Acknowledgements</h3> +<p>Thanks to Chris Ravenscroft for original one-to-many code (chris#voilaweb.com). +<h2>ADOConnection Supplement</h2> + +<h3><li>ADOConnection::GetActiveRecords()</h3> +<p> +This allows you to retrieve an array of ADOdb_Active_Records. Returns false if an error occurs. +<pre> +$table = 'products'; +$whereOrderBy = "name LIKE 'A%' ORDER BY Name"; +$activeRecArr = $db->GetActiveRecords($table, $whereOrderBy); +foreach($activeRecArr as $rec) { + $rec->id = rand(); + $rec->save(); +} +</pre> +<p> +And to retrieve all records ordered by specific fields: +<pre> +$whereOrderBy = "1=1 ORDER BY Name"; +$activeRecArr = $db->GetActiveRecords($table); +</pre> +<p> +To use bind variables (assuming ? is the place-holder for your database): +<pre> +$activeRecArr = $db->GetActiveRecords($tableName, 'name LIKE ?', + array('A%')); +</pre> +<p>You can also define the primary keys of the table by passing an array of field names: +<pre> +$activeRecArr = $db->GetActiveRecords($tableName, 'name LIKE ?', + array('A%'), array('id')); +</pre> + +<h3><li>ADOConnection::GetActiveRecordsClass()</h3> +<p> +This allows you to retrieve an array of objects derived from ADOdb_Active_Records. Returns false if an error occurs. +<pre> +class Product extends ADOdb_Active_Record{}; +$table = 'products'; +$whereOrderBy = "name LIKE 'A%' ORDER BY Name"; +$activeRecArr = $db->GetActiveRecordsClass('Product',$table, $whereOrderBy); + +# the objects in $activeRecArr are of class 'Product' +foreach($activeRecArr as $rec) { + $rec->id = rand(); + $rec->save(); +} +</pre> +<p> +To use bind variables (assuming ? is the place-holder for your database): +<pre> +$activeRecArr = $db->GetActiveRecordsClass($className,$tableName, 'name LIKE ?', + array('A%')); +</pre> +<p>You can also define the primary keys of the table by passing an array of field names: +<pre> +$activeRecArr = $db->GetActiveRecordsClass($className,$tableName, 'name LIKE ?', + array('A%'), array('id')); +</pre> + +</ol> + +<h3><li>ADOConnection::ErrorMsg()</h3> +<p>Returns last error message. +<h3><li>ADOConnection::ErrorNo()</h3> +<p>Returns last error number. + +<h2>ActiveRecord Code Sample</h2> +<p>The following works with PHP4 and PHP5 +<pre> +include('../adodb.inc.php'); +include('../adodb-active-record.inc.php'); + +// uncomment the following if you want to test exceptions +#if (PHP_VERSION >= 5) include('../adodb-exceptions.inc.php'); + +$db = NewADOConnection('mysql://root@localhost/northwind'); +$db->debug=1; +ADOdb_Active_Record::SetDatabaseAdapter($db); + +$db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + +class person extends ADOdb_Active_Record{} +$person = new person(); + +echo "&lt;p>Output of getAttributeNames: "; +var_dump($person->getAttributeNames()); + +/** + * Outputs the following: + * array(4) { + * [0]=> + * string(2) "id" + * [1]=> + * string(9) "name_first" + * [2]=> + * string(8) "name_last" + * [3]=> + * string(13) "favorite_color" + * } + */ + +$person = new person(); +$person->name_first = 'Andi'; +$person->name_last = 'Gutmans'; +$person->save(); // this save() will fail on INSERT as favorite_color is a must fill... + + +$person = new person(); +$person->name_first = 'Andi'; +$person->name_last = 'Gutmans'; +$person->favorite_color = 'blue'; +$person->save(); // this save will perform an INSERT successfully + +echo "&lt;p>The Insert ID generated:"; print_r($person->id); + +$person->favorite_color = 'red'; +$person->save(); // this save() will perform an UPDATE + +$person = new person(); +$person->name_first = 'John'; +$person->name_last = 'Lim'; +$person->favorite_color = 'lavender'; +$person->save(); // this save will perform an INSERT successfully + +// load record where id=2 into a new ADOdb_Active_Record +$person2 = new person(); +$person2->Load('id=2'); +var_dump($person2); + +// retrieve an array of records +$activeArr = $db->GetActiveRecordsClass($class = "person",$table = "persons","id=".$db->Param(0),array(2)); +$person2 = $activeArr[0]; +echo "&lt;p>Name first (should be John): ",$person->name_first, "&lt;br>Class = ",get_class($person2); +</pre> + + + +<a name=recordx> +<h2>Active Record eXtended</h2> +<p>This is the original one-to-many Active Record implementation submitted by +Chris Ravenscroft (chris#voilaweb.com). The reason why we are offering both versions is that the Extended version +is more powerful but more complex. My personal preference is to keep it simpler, but your view may vary. +<p>To use, just include adodb-active-recordx.inc.php instead of adodb-active-record.inc.php. +<p>It provides a new function called Find() that is quite intuitive to use as shown in the example below. It also supports loading all relationships using a single query (using joins). +<pre> +&lt;?php + function ar_assert($obj, $cond) + { + global $err_count; + $res = var_export($obj, true); + return (strpos($res, $cond)); + } + + include_once('../adodb.inc.php'); + include_once('../adodb-active-recordx.inc.php'); + + + $db = NewADOConnection('mysql://root@localhost/northwind'); + $db->debug=0; + ADOdb_Active_Record::SetDatabaseAdapter($db); + echo "&lt;pre>\n"; + echo "\n\n---------------------------------------------------------------------------\n"; + echo "Preparing database using SQL queries (creating 'people', 'children')\n"; + + $db->Execute("DROP TABLE `people`"); + $db->Execute("DROP TABLE `children`"); + + $db->Execute("CREATE TABLE `people` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + $db->Execute("CREATE TABLE `children` ( + `id` int(10) unsigned NOT NULL auto_increment, + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + + $db->Execute("insert into children (person_id,name_first,name_last,favorite_pet) values (1,'Jill','Lim','tortoise')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')"); + + // This class _implicitely_ relies on the 'people' table (pluralized form of 'person') + class Person extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct(); + $this->hasMany('children'); + } + } + // This class _implicitely_ relies on the 'children' table + class Child extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct(); + $this->belongsTo('person'); + } + } + // This class _explicitely_ relies on the 'children' table and shares its metadata with Child + class Kid extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('children'); + $this->belongsTo('person'); + } + } + // This class _explicitely_ relies on the 'children' table but does not share its metadata + class Rugrat extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('children', false, false, array('new' => true)); + } + } + + echo "Inserting person in 'people' table ('John Lim, he likes lavender')\n"; + echo "---------------------------------------------------------------------------\n"; + $person = new Person(); + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + $err_count = 0; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "person->Find('id=1') [Lazy Method]\n"; + echo "person is loaded but its children will be loaded on-demand later on\n"; + echo "---------------------------------------------------------------------------\n"; + $person5 = new Person(); + $people5 = $person5->Find('id=1'); + echo (ar_assert($people5, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n"; + echo (ar_assert($people5, "'favorite_pet' => 'tortoise'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation yet\n"; + foreach($people5 as $person) + { + foreach($person->children as $child) + { + if($child->name_first); + } + } + echo (ar_assert($people5, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "person->Find('id=1' ... ADODB_WORK_AR) [Worker Method]\n"; + echo "person is loaded, and so are its children\n"; + echo "---------------------------------------------------------------------------\n"; + $person6 = new Person(); + $people6 = $person6->Find('id=1', false, false, array('loading' => ADODB_WORK_AR)); + echo (ar_assert($people6, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n"; + echo (ar_assert($people6, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "person->Find('id=1' ... ADODB_JOIN_AR) [Join Method]\n"; + echo "person and its children are loaded using a single query\n"; + echo "---------------------------------------------------------------------------\n"; + $person7 = new Person(); + // When I specifically ask for a join, I have to specify which table id I am looking up + // otherwise the SQL parser will wonder which table's id that would be. + $people7 = $person7->Find('people.id=1', false, false, array('loading' => ADODB_JOIN_AR)); + echo (ar_assert($people7, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n"; + echo (ar_assert($people7, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "person->Load('people.id=1') [Join Method]\n"; + echo "Load() always uses the join method since it returns only one row\n"; + echo "---------------------------------------------------------------------------\n"; + $person2 = new Person(); + // Under the hood, Load(), since it returns only one row, always perform a join + // Therefore we need to clarify which id we are talking about. + $person2->Load('people.id=1'); + echo (ar_assert($person2, "'name_first' => 'John'")) ? "[OK] Found John\n" : "[!!] Find failed\n"; + echo (ar_assert($person2, "'favorite_pet' => 'tortoise'")) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "child->Load('children.id=1') [Join Method]\n"; + echo "We are now loading from the 'children' table, not from 'people'\n"; + echo "---------------------------------------------------------------------------\n"; + $ch = new Child(); + $ch->Load('children.id=1'); + echo (ar_assert($ch, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ch, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "child->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"; + echo "---------------------------------------------------------------------------\n"; + $ch2 = new Child(); + $ach2 = $ch2->Find('id=1', false, false, array('loading' => ADODB_WORK_AR)); + echo (ar_assert($ach2, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ach2, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"; + echo "Where we see that kid shares relationships with child because they are stored\n"; + echo "in the common table's metadata structure.\n"; + echo "---------------------------------------------------------------------------\n"; + $ch3 = new Kid('children'); + $ach3 = $ch3->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + echo (ar_assert($ach3, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ach3, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "kid->Find('children.id=1' ... ADODB_LAZY_AR) [Lazy Method]\n"; + echo "Of course, lazy loading also retrieve medata information...\n"; + echo "---------------------------------------------------------------------------\n"; + $ch32 = new Kid('children'); + $ach32 = $ch32->Find('children.id=1', false, false, array('loading' => ADODB_LAZY_AR)); + echo (ar_assert($ach32, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ach32, "'favorite_color' => 'lavender'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation yet\n"; + foreach($ach32 as $akid) + { + if($akid->person); + } + echo (ar_assert($ach32, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"; + echo "In rugrat's constructor it is specified that\nit must forget any existing relation\n"; + echo "---------------------------------------------------------------------------\n"; + $ch4 = new Rugrat('children'); + $ach4 = $ch4->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + echo (ar_assert($ach4, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ach4, "'favorite_color' => 'lavender'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation found\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"; + echo "Note how only rugrat forgot its relations - kid is fine.\n"; + echo "---------------------------------------------------------------------------\n"; + $ch5 = new Kid('children'); + $ach5 = $ch5->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + echo (ar_assert($ach5, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ach5, "'favorite_color' => 'lavender'")) ? "[OK] I did not forget relation: person\n" : "[!!] I should not have forgotten relation: person\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"; + echo "---------------------------------------------------------------------------\n"; + $ch6 = new Rugrat('children'); + $ch6s = $ch6->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + $ach6 = $ch6s[0]; + echo (ar_assert($ach6, "'name_first' => 'Jill'")) ? "[OK] Found Jill\n" : "[!!] Find failed\n"; + echo (ar_assert($ach6, "'favorite_color' => 'lavender'")) ? "[!!] Found relation when I shouldn't\n" : "[OK] No relation yet\n"; + echo "\nLoading relations:\n"; + $ach6->belongsTo('person'); + $ach6->LoadRelations('person', 'order by id', 0, 2); + echo (ar_assert($ach6, "'favorite_color' => 'lavender'")) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"; + + echo "\n\n---------------------------------------------------------------------------\n"; + echo "Test suite complete.\n"; + echo "---------------------------------------------------------------------------\n"; +?> +</pre> + <h3>Todo (Code Contributions welcome)</h3> + <p>Check _original and current field values before update, only update changes. Also if the primary key value is changed, then on update, we should save and use the original primary key values in the WHERE clause! + + <p>PHP5 specific: Make GetActiveRecords*() return an Iterator. + <p>PHP5 specific: Change PHP5 implementation of Active Record to use __get() and __set() for better performance. + +<h3> Change Log</h3> +<p>0.93 +<p>You can force column names to be quoted in INSERT and UPDATE statements, typically because you are using reserved words as column names by setting +ADODB_Active_Record::$_quoteNames = true; + +<p>0.92 +<p>Fixed some issues with incompatible fetch modes (ADODB_FETCH_ASSOC) causing problems in UpdateActiveTable. +<p>Added support for functions that support predefining one-to-many relationships:<br> +&nbsp; <i>ClassHasMany ClassBelongsTo TableHasMany TableBelongsTo TableKeyHasMany TableKeyBelongsTo</i>. <br> +<p>You can also define your child/parent class in these functions, instead of the default ADODB_Active_Record. + +<P>0.91 +<p>HasMany hardcoded primary key field name to "id". Fixed. + +<p>0.90 +<p>Support for belongsTo and hasMany. Thanks to Chris Ravenscroft (chris#voilaweb.com). +<p>Added LoadRelations(). + +<p>0.08 +Added support for assoc arrays in Set(). + +<p>0.07 +<p>$ADODB_ASSOC_CASE=2 did not work properly. Fixed. +<p>Added === check in ADODB_SetDatabaseAdapter for $db, adodb-active-record.inc.php. Thx Christian Affolter. + +<p>0.06 +<p>Added ErrorNo(). +<p>Fixed php 5.2.0 compat issues. + +<p>0.05 +<p>If inserting a record and the value of a primary key field is null, then we do not insert that field in as +we assume it is an auto-increment field. Needed by mssql. + +<p>0.04 5 June 2006 <br> +<p>Added support for declaring table name in $_table in class declaration. Thx Bill Dueber for idea. +<p>Added find($where,$bindarr=false) method to retrieve an array of active record objects. + +<p>0.03 <br> +- Now we only update fields that have changed, using $this->_original.<br> +- We do not include auto_increment fields in replace(). Thx Travis Cline<br> +- Added ADODB_ACTIVE_CACHESECS.<br> + +<p>0.02 <br> +- Much better error handling. ErrorMsg() implemented. Throw implemented if adodb-exceptions.inc.php detected.<br> +- You can now define the primary keys of the view or table you are accessing manually.<br> +- The Active Record allows you to create an object which does not have a primary key. You can INSERT but not UPDATE in this case. +- Set() documented.<br> +- Fixed _pluralize bug with y suffix. + +<p> + 0.01 6 Mar 2006<br> +- Fixed handling of nulls when saving (it didn't save nulls, saved them as '').<br> +- Better error handling messages.<br> +- Factored out a new method GetPrimaryKeys().<br> + <p> + 0.00 5 Mar 2006<br> + 1st release +</body> +</html> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-adodb.htm b/pos/is4c-nf/lib/adodb5/docs/docs-adodb.htm new file mode 100644 index 000000000..40057389a --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-adodb.htm @@ -0,0 +1,7731 @@ +<html xmlns:v="urn:schemas-microsoft-com:vml" +xmlns:o="urn:schemas-microsoft-com:office:office" +xmlns:w="urn:schemas-microsoft-com:office:word" +xmlns:st1="urn:schemas-microsoft-com:office:smarttags" +xmlns="http://www.w3.org/TR/REC-html40"> + +<head> +<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1"> +<meta name=ProgId content=Word.Document> +<meta name=Generator content="Microsoft Word 11"> +<meta name=Originator content="Microsoft Word 11"> +<link rel=File-List href="docs-adodb_files/filelist.xml"> +<link rel=Edit-Time-Data href="docs-adodb_files/editdata.mso"> +<!--[if !mso]> +<style> +v\:* {behavior:url(#default#VML);} +o\:* {behavior:url(#default#VML);} +w\:* {behavior:url(#default#VML);} +.shape {behavior:url(#default#VML);} +</style> +<![endif]--> +<title>ADODB Manual</title> +<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" + name="State"/> +<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" + name="PlaceType"/> +<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" + name="PlaceName"/> +<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" + name="country-region"/> +<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" + name="City"/> +<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" + name="place"/> +<!--[if gte mso 9]><xml> + <o:DocumentProperties> + <o:Author>John</o:Author> + <o:LastAuthor>John</o:LastAuthor> + <o:Revision>3</o:Revision> + <o:TotalTime>3</o:TotalTime> + <o:Created>2008-12-24T10:43:00Z</o:Created> + <o:LastSaved>2008-12-24T10:46:00Z</o:LastSaved> + <o:Pages>73</o:Pages> + <o:Words>30239</o:Words> + <o:Characters>172366</o:Characters> + <o:Company> </o:Company> + <o:Lines>1436</o:Lines> + <o:Paragraphs>404</o:Paragraphs> + <o:CharactersWithSpaces>202201</o:CharactersWithSpaces> + <o:Version>11.9999</o:Version> + </o:DocumentProperties> +</xml><![endif]--><!--[if gte mso 9]><xml> + <w:WordDocument> + <w:Zoom>140</w:Zoom> + <w:FormsDesign/> + <w:ValidateAgainstSchemas/> + <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> + <w:IgnoreMixedContent>false</w:IgnoreMixedContent> + <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> + <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> + </w:WordDocument> +</xml><![endif]--><!--[if gte mso 9]><xml> + <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> + </w:LatentStyles> +</xml><![endif]--><!--[if !mso]><object + classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object> +<style> +st1\:*{behavior:url(#ieooui) } +</style> +<![endif]--> +<style> +<!-- +f + + + /* Font Definitions */ + @font-face + {font-family:Helvetica; + panose-1:2 11 6 4 2 2 2 2 2 4; + mso-font-charset:0; + mso-generic-font-family:swiss; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:Courier; + panose-1:2 7 4 9 2 2 5 2 4 4; + mso-font-charset:0; + mso-generic-font-family:modern; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:"Tms Rmn"; + panose-1:2 2 6 3 4 5 5 2 3 4; + mso-font-charset:0; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:Helv; + panose-1:2 11 6 4 2 2 2 3 2 4; + mso-font-charset:0; + mso-generic-font-family:swiss; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:"New York"; + panose-1:2 4 5 3 6 5 6 2 3 4; + mso-font-charset:0; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:System; + panose-1:0 0 0 0 0 0 0 0 0 0; + mso-font-charset:0; + mso-generic-font-family:swiss; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:Wingdings; + panose-1:5 0 0 0 0 0 0 0 0 0; + mso-font-charset:2; + mso-generic-font-family:auto; + mso-font-pitch:variable; + mso-font-signature:0 268435456 0 0 -2147483648 0;} +@font-face + {font-family:"MS Mincho"; + panose-1:2 2 6 9 4 2 5 8 3 4; + mso-font-alt:"\FF2D\FF33 \660E\671D"; + mso-font-charset:128; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 134676480 16 0 131072 0;} +@font-face + {font-family:Batang; + panose-1:2 3 6 0 0 1 1 1 1 1; + mso-font-alt:\BC14\D0D5; + mso-font-charset:129; + mso-generic-font-family:auto; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 151388160 16 0 524288 0;} +@font-face + {font-family:SimSun; + panose-1:2 1 6 0 3 1 1 1 1 1; + mso-font-alt:\5B8B\4F53; + mso-font-charset:134; + mso-generic-font-family:auto; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:1 135135232 16 0 262144 0;} +@font-face + {font-family:PMingLiU; + panose-1:2 2 3 0 0 0 0 0 0 0; + mso-font-alt:\65B0\7D30\660E\9AD4; + mso-font-charset:136; + mso-generic-font-family:auto; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:1 134742016 16 0 1048576 0;} +@font-face + {font-family:"MS Gothic"; + panose-1:2 11 6 9 7 2 5 8 2 4; + mso-font-alt:"\FF2D\FF33 \30B4\30B7\30C3\30AF"; + mso-font-charset:128; + mso-generic-font-family:modern; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 134676480 16 0 131072 0;} +@font-face + {font-family:Dotum; + panose-1:2 11 6 0 0 1 1 1 1 1; + mso-font-alt:\B3CB\C6C0; + mso-font-charset:129; + mso-generic-font-family:modern; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 151388160 16 0 524288 0;} +@font-face + {font-family:SimHei; + panose-1:2 1 6 0 3 1 1 1 1 1; + mso-font-alt:\9ED1\4F53; + mso-font-charset:134; + mso-generic-font-family:modern; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 135135232 16 0 262144 0;} +@font-face + {font-family:MingLiU; + panose-1:2 2 3 9 0 0 0 0 0 0; + mso-font-alt:\7D30\660E\9AD4; + mso-font-charset:136; + mso-generic-font-family:modern; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 134742016 16 0 1048576 0;} +@font-face + {font-family:Mincho; + panose-1:2 2 6 9 4 3 5 8 3 5; + mso-font-alt:\660E\671D; + mso-font-charset:128; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 134676480 16 0 131072 0;} +@font-face + {font-family:Gulim; + panose-1:2 11 6 0 0 1 1 1 1 1; + mso-font-alt:\AD74\B9BC; + mso-font-charset:129; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:fixed; + mso-font-signature:1 151388160 16 0 524288 0;} +@font-face + {font-family:Century; + panose-1:2 4 6 4 5 5 5 2 3 4; + mso-font-charset:0; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:"Angsana New"; + panose-1:2 2 6 3 5 4 5 2 3 4; + mso-font-charset:222; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:16777217 0 0 0 65536 0;} +@font-face + {font-family:"Cordia New"; + panose-1:2 11 3 4 2 2 2 2 2 4; + mso-font-charset:222; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:16777217 0 0 0 65536 0;} +@font-face + {font-family:Mangal; + panose-1:0 0 4 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:32768 0 0 0 0 0;} +@font-face + {font-family:Latha; + panose-1:2 0 4 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:1048576 0 0 0 0 0;} +@font-face + {font-family:Sylfaen; + panose-1:1 10 5 2 5 3 6 3 3 3; + mso-font-charset:0; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:16778883 0 512 0 13 0;} +@font-face + {font-family:Vrinda; + panose-1:0 0 4 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:Raavi; + panose-1:2 0 5 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:Shruti; + panose-1:2 0 5 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:Sendnya; + panose-1:0 0 4 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:Gautami; + panose-1:2 0 5 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:Tunga; + panose-1:0 0 4 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:"Estrangelo Edessa"; + panose-1:0 0 0 0 0 0 0 0 0 0; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:Kartika; + panose-1:1 1 1 0 1 1 1 1 1 1; + mso-font-charset:1; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:0 0 0 0 0 0;} +@font-face + {font-family:"Arial Unicode MS"; + panose-1:2 11 6 4 2 2 2 2 2 4; + mso-font-charset:0; + mso-generic-font-family:roman; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} +@font-face + {font-family:Tahoma; + panose-1:2 11 6 4 3 5 4 4 2 4; + mso-font-charset:0; + mso-generic-font-family:swiss; + mso-font-format:other; + mso-font-pitch:variable; + mso-font-signature:3 0 0 0 1 0;} + /* Style Definitions */ + p.MsoNormal, li.MsoNormal, div.MsoNormal + {mso-style-parent:""; + margin:0cm; + margin-bottom:.0001pt; + mso-pagination:widow-orphan; + font-size:12.0pt; + font-family:"Times New Roman"; + mso-fareast-font-family:"Times New Roman"; + color:black;} +h1 + {mso-margin-top-alt:auto; + margin-right:0cm; + mso-margin-bottom-alt:auto; + margin-left:0cm; + mso-pagination:widow-orphan; + mso-outline-level:1; + font-size:24.0pt; + font-family:"Times New Roman"; + color:black; + font-weight:bold;} +h2 + {mso-margin-top-alt:auto; + margin-right:0cm; + mso-margin-bottom-alt:auto; + margin-left:0cm; + mso-pagination:widow-orphan; + mso-outline-level:2; + font-size:18.0pt; + font-family:"Times New Roman"; + color:black; + font-weight:bold;} +h3 + {mso-margin-top-alt:auto; + margin-right:0cm; + mso-margin-bottom-alt:auto; + margin-left:0cm; + mso-pagination:widow-orphan; + mso-outline-level:3; + font-size:13.5pt; + font-family:"Times New Roman"; + color:black; + font-weight:bold;} +h4 + {mso-margin-top-alt:auto; + margin-right:0cm; + mso-margin-bottom-alt:auto; + margin-left:0cm; + mso-pagination:widow-orphan; + mso-outline-level:4; + font-size:12.0pt; + font-family:"Times New Roman"; + color:black; + font-weight:bold;} +a:link, span.MsoHyperlink + {color:blue; + text-decoration:underline; + text-underline:single;} +a:visited, span.MsoHyperlinkFollowed + {color:blue; + text-decoration:underline; + text-underline:single;} +p + {font-size:12.0pt; + font-family:"Times New Roman"; + mso-fareast-font-family:"Times New Roman"; + color:black;} +code + {font-family:"Courier New"; + mso-ascii-font-family:"Courier New"; + mso-fareast-font-family:"Times New Roman"; + mso-hansi-font-family:"Courier New"; + mso-bidi-font-family:"Courier New";} +pre + {margin:0cm; + margin-bottom:.0001pt; + mso-pagination:widow-orphan; + tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; + background:#EEEEEE; + border:none; + mso-border-alt:solid #DDDDDD .75pt; + padding:0cm; + mso-padding-alt:9.0pt 18.0pt 9.0pt 18.0pt; + font-size:9.0pt; + font-family:"Courier New"; + mso-fareast-font-family:"Times New Roman"; + color:black;} +span.msoIns + {mso-style-type:export-only; + mso-style-name:""; + text-decoration:underline; + text-underline:single; + color:teal;} +span.msoDel + {mso-style-type:export-only; + mso-style-name:""; + text-decoration:line-through; + color:red;} +span.msoChangeProp + {mso-style-type:export-only; + mso-style-name:"";} +@page Section1 + {size:612.0pt 792.0pt; + margin:72.0pt 90.0pt 72.0pt 90.0pt; + mso-header-margin:35.4pt; + mso-footer-margin:35.4pt; + mso-paper-source:0;} +div.Section1 + {page:Section1;} + /* List Definitions */ + @list l0 + {mso-list-id:3098366; + mso-list-template-ids:-1654113918;} +@list l0:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l1 + {mso-list-id:118686534; + mso-list-template-ids:1789952844;} +@list l1:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l2 + {mso-list-id:325595838; + mso-list-template-ids:-924547596;} +@list l2:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l3 + {mso-list-id:577053254; + mso-list-template-ids:1006266472;} +@list l3:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l4 + {mso-list-id:584261941; + mso-list-template-ids:1672376844;} +@list l4:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l5 + {mso-list-id:678311197; + mso-list-template-ids:-1025849406;} +@list l5:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l6 + {mso-list-id:993068284; + mso-list-template-ids:-1149100626;} +@list l6:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l7 + {mso-list-id:1120344907; + mso-list-template-ids:-1732590280;} +@list l7:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l8 + {mso-list-id:1134718884; + mso-list-template-ids:-1854392276;} +@list l8:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l9 + {mso-list-id:1289897560; + mso-list-template-ids:-1284101662;} +@list l9:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +@list l10 + {mso-list-id:1461026030; + mso-list-template-ids:65944450;} +@list l11 + {mso-list-id:1566380536; + mso-list-template-ids:395727058;} +@list l11:level1 + {mso-level-number-format:bullet; + mso-level-text:\F0B7; + mso-level-tab-stop:36.0pt; + mso-level-number-position:left; + text-indent:-18.0pt; + mso-ansi-font-size:10.0pt; + font-family:Symbol;} +ol + {margin-bottom:0cm;} +ul + {margin-bottom:0cm;} +--> +</style> +<!--[if gte mso 10]> +<style> + /* Style Definitions */ + table.MsoNormalTable + {mso-style-name:"Table Normal"; + mso-tstyle-rowband-size:0; + mso-tstyle-colband-size:0; + mso-style-noshow:yes; + mso-style-parent:""; + mso-padding-alt:0cm 5.4pt 0cm 5.4pt; + mso-para-margin:0cm; + mso-para-margin-bottom:.0001pt; + mso-pagination:widow-orphan; + font-size:10.0pt; + font-family:"Times New Roman"; + mso-ansi-language:#0400; + mso-fareast-language:#0400; + mso-bidi-language:#0400;} +</style> +<![endif]--><!--[if gte mso 9]><xml> + <o:shapedefaults v:ext="edit" spidmax="1026"/> +</xml><![endif]--><!--[if gte mso 9]><xml> + <o:shapelayout v:ext="edit"> + <o:idmap v:ext="edit" data="1"/> + </o:shapelayout></xml><![endif]--> +</head> + +<body bgcolor=white lang=EN-US link=blue vlink=blue style='tab-interval:36.0pt'> + +<div class=Section1> + +<h2>ADOdb Library for PHP</h2> + +<p>V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com)</p> + +<p><span style='font-size:7.5pt'>This software is dual licensed using BSD-Style +and LGPL. This means you can use it in compiled proprietary and commercial +products.</span></p> + +<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a> +&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a> </p> + +<p><a href="#intro"><b>Introduction</b></a><b><br> +<a href="#features">Unique Features</a><br> +<a href="#users">How People are using ADOdb</a><br> +<a href="#bugs">Feature Requests and Bug Reports</a><br> +<a href="#install">Installation</a><br> +<a href="#mininstall">Minimum Install</a><br> +<a href="#coding">Initializing Code and Connectioning to Databases</a><br> +</b><span style='font-size:10.0pt'>&nbsp; <a href="#dsnsupport">Data Source +Name (DSN) Support</a></span> &nbsp; <a href="#connect_ex">Connection Examples</a> +<br> +<b><a href="#speed">High Speed ADOdb - tuning tips</a></b><br> +<b><a href="#hack">Hacking and Modifying ADOdb Safely</a><br> +<a href="#php5">PHP5 Features</a></b><br> +<span style='font-size:10.0pt'><a href="#php5iterators">foreach iterators</a> <a +href="#php5exceptions">exceptions</a></span><br> +<b><a href="#drivers">Supported Databases</a></b><br> +<b><a href="#quickstart">Tutorials</a></b><br> +<a href="#ex1">Example 1: Select</a><br> +<a href="#ex2">Example 2: Advanced Select</a><br> +<a href="#ex3">Example 3: Insert</a><br> +<a href="#ex4">Example 4: Debugging</a> &nbsp;<a href="#exrs2html">rs2html +example</a><br> +<a href="#ex5">Example 5: MySQL and Menus</a><br> +<a href="#ex6">Example 6: Connecting to Multiple Databases at once</a> <br> +<a href="#ex7">Example 7: Generating Update and Insert SQL</a> <br> +<a href="#ex8">Example 8: Implementing Scrolling with Next and Previous</a><br> +<a href="#ex9">Example 9: Exporting in CSV or Tab-Delimited Format</a> <br> +<a href="#ex10">Example 10: Custom filters</a><br> +<a href="#ex11">Example 11: Smart Transactions</a><br> +<br> +<b><a href="#errorhandling">Using Custom Error Handlers and PEAR_Error</a><br> +<a href="#DSN">Data Source Names</a><br> +<a href="#caching">Caching</a></b><br> +&nbsp; &nbsp; <a href="#memcache">MemCache</a><br> +&nbsp; &nbsp; <a href="#cacheapi">Caching API</a><br> +<b><a href="#pivot">Pivot Tables</a></b> </p> + +<p><a href="#ref"><b>REFERENCE</b></a> </p> + +<p><span style='font-size:10.0pt'>Variables: <a href="#adodb_countrecs">$ADODB_COUNTRECS</a> +<a href="#adodb_ansi_padding_off">$ADODB_ANSI_PADDING_OFF</a> <a +href="#adodb_cache_dir">$ADODB_CACHE_DIR</a> <br> +&nbsp; &nbsp; &nbsp; &nbsp; <a href="#force_type">$ADODB_FORCE_TYPE</a> <a +href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a> <a href="#adodb_lang">$ADODB_LANG</a> +<a href="#adodb_auto_quote">ADODB_QUOTE_FIELDNAMES</a> <br> +Constants: <a href="#adodb_assoc_case">ADODB_ASSOC_CASE</a> </span><br> +<a href="#ADOConnection"><b>ADOConnection</b></a><br> +<span style='font-size:10.0pt'>Connections: <a href="#connect">Connect</a> <a +href="#pconnect">PConnect</a> <a href="#nconnect">NConnect</a> <a +href="#isconnected">IsConnected</a><br> +Executing SQL: <a href="#execute">Execute</a> <a href="#cacheexecute"><i>CacheExecute</i></a> +<a href="#selectlimit">SelectLimit</a> <a href="#cacheSelectLimit"><i>CacheSelectLimit</i></a> +<a href="#param">Param</a> <a href="#prepare">Prepare</a> <a href="#preparesp">PrepareSP</a> +<a href="#inparameter">InParameter</a> <a href="#outparameter">OutParameter</a> +<a href="#autoexecute">AutoExecute</a> <br> +&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a +href="#getone">GetOne</a> <a href="#cachegetone"><i>CacheGetOne</i></a> <a +href="#getrow">GetRow</a> <a href="#cachegetrow"><i>CacheGetRow</i></a> <a +href="#getall">GetAll</a> <a href="#cachegetall"><i>CacheGetAll</i></a> <a +href="#getcol">GetCol</a> <a href="#cachegetcol"><i>CacheGetCol</i></a> <a +href="#getassoc1">GetAssoc</a> <a href="#cachegetassoc"><i>CacheGetAssoc</i></a> +<a href="#replace">Replace</a> <a href="#getmedian">GetMedian</a> <br> +&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a +href="#executecursor">ExecuteCursor</a> (oci8 only)<br> +Generates SQL strings: <a href="#getupdatesql">GetUpdateSQL</a> <a +href="#getinsertsql">GetInsertSQL</a> <a href="#concat">Concat</a> <a +href="#ifnull">IfNull</a> <a href="#length">length</a> <a href="#random">random</a> +<a href="#substr">substr</a> <a href="#qstr">qstr</a> <a href="#param">Param</a> +<a href="#OffsetDate">OffsetDate</a> <a href="#sqldate">SQLDate</a> <a +href="#dbdate">DBDate</a> <a href="#dbtimestamp">DBTimeStamp</a> <a +href="#binddate">BindDate</a> <a href="#bindtimestamp">BindTimeStamp</a> <br> +Blobs: <a href="#updateblob">UpdateBlob</a> <a href="#updateclob">UpdateClob</a> +<a href="#updateblobfile">UpdateBlobFile</a> <a href="#blobencode">BlobEncode</a> +<a href="#blobdecode">BlobDecode</a><br> +Paging/Scrolling: <a href="#pageexecute">PageExecute</a> <a +href="#cachepageexecute">CachePageExecute</a><br> +Cleanup: <a href="#cacheflush">CacheFlush</a> <a href="#Close">Close</a><br> +Transactions: <a href="#starttrans">StartTrans</a> <a href="#completetrans">CompleteTrans</a> +<a href="#failtrans">FailTrans</a> <a href="#hasfailedtrans">HasFailedTrans</a> +<a href="#begintrans">BeginTrans</a> <a href="#committrans">CommitTrans</a> <a +href="#rollbacktrans">RollbackTrans</a> <a href="#SetTransactionMode">SetTransactionMode</a><br> +Fetching Data: <a href="#setfetchmode">SetFetchMode</a><br> +Strings: <a href="#concat">concat</a> <a href="#length">length</a> <a +href="#qstr">qstr</a> <a href="#quote">quote</a> <a href="#substr">substr</a><br> +Dates: <a href="#dbdate">DBDate</a> <a href="#dbtimestamp">DBTimeStamp</a> <a +href="#unixdate">UnixDate</a> <a href="#binddate">BindDate</a> <a +href="#bindtimestamp">BindTimeStamp</a> <a href="#unixtimestamp">UnixTimeStamp</a> +<a href="#OffsetDate">OffsetDate</a> <a href="#SQLDate">SQLDate</a> <br> +Row Management: <a href="#affected_rows">Affected_Rows</a> <a +href="#inserted_id">Insert_ID</a> <a href="#rowlock">RowLock</a> <a +href="#genid">GenID</a> <a href="#createseq">CreateSequence</a> <a +href="#dropseq">DropSequence</a> <br> +Error Handling: <a href="#errormsg">ErrorMsg</a> <a href="#errorno">ErrorNo</a> +<a href="#metaerror">MetaError</a> <a href="#metaerrormsg">MetaErrorMsg</a> <a +href="#ignoreerrors">IgnoreErrors</a><br> +Data Dictionary (metadata): <a href="#metadatabases">MetaDatabases</a> <a +href="#metatables">MetaTables</a> <a href="#metacolumns">MetaColumns</a> <a +href="#metacolumnames">MetaColumnNames</a> <a href="#metaprimarykeys">MetaPrimaryKeys</a> +<a href="#metaforeignkeys">MetaForeignKeys</a> <a href="#serverinfo">ServerInfo</a> +<br> +Statistics and Query-Rewriting: <a href="#logsql">LogSQL</a> <a +href="#fnexecute">fnExecute and fnCacheExecute</a><br> +Deprecated: <a href="#bind">Bind</a> <a href="#blankrecordset">BlankRecordSet</a> +<a href="#parameter">Parameter</a></span> <a href="#adorecordSet"><b><br> +ADORecordSet</b></a><br> +<span style='font-size:10.0pt'>Returns one field: <a href="#fields">Fields</a><br> +Returns one row:<a href="#fetchrow">FetchRow</a> <a href="#fetchinto">FetchInto</a> +<a href="#fetchobject">FetchObject</a> <a href="#fetchnextobject">FetchNextObject</a> +<a href="#fetchobj">FetchObj</a> <a href="#fetchnextobj">FetchNextObj</a> <a +href="#getrowassoc">GetRowAssoc</a> <br> +Returns all rows:<a href="#getarray">GetArray</a> <a href="#getrows">GetRows</a> +<a href="#getassoc">GetAssoc</a><br> +Scrolling:<a href="#move">Move</a> <a href="#movenext">MoveNext</a> <a +href="#movefirst">MoveFirst</a> <a href="#movelast">MoveLast</a> <a +href="#abspos">AbsolutePosition</a> <a href="#currentrow">CurrentRow</a> <a +href="#atfirstpage">AtFirstPage</a> <a href="#atlastpage">AtLastPage</a> <a +href="#absolutepage">AbsolutePage</a> <br> +Menu generation:<a href="#getmenu">GetMenu</a> <a href="#getmenu2">GetMenu2</a><br> +Dates:<a href="#userdate">UserDate</a> <a href="#usertimestamp">UserTimeStamp</a> +<a href="#unixdate">UnixDate</a> <a href="#unixtimestamp">UnixTimeStamp<br> +</a>Recordset Info:<a href="#recordcount">RecordCount</a> <a +href="#po_recordcount">PO_RecordCount</a> <a href="#nextrecordset">NextRecordSet</a><br> +Field Info:<a href="#fieldcount">FieldCount</a> <a href="#fetchfield">FetchField</a> +<a href="#metatype">MetaType</a><br> +Cleanup: <a href="#rsclose">Close</a></span> </p> + +<p><span style='font-size:10.0pt'><a href="#rs2html"><b>rs2html</b></a>&nbsp; <a +href="#exrs2html">example</a></span><br> +<a href="#adodiff">Differences between ADOdb and ADO</a><br> +<a href="#driverguide"><b>Database Driver Guide<br> +</b></a><b><a href="#changes">Change Log</a></b></p> + +<h2>Introduction<a name=intro></a></h2> + +<p>PHP's database access functions are not standardised. This creates a need +for a database class library to hide the differences between the different +database API's (encapsulate the differences) so we can easily switch databases. +PHP 4.0.5 or later is now required (because we use array-based str_replace).</p> + +<p>We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL +Anywhere, Informix, PostgreSQL, FrontBase, SQLite, Interbase (Firebird and +Borland variants), Foxpro, Access, <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>, +DB2, SAP DB and ODBC. We have had successful reports of connecting to Progress +and CacheLite via ODBC. We hope more people will contribute drivers to support +other databases.</p> + +<p>PHP4 supports session variables. You can store your session information +using ADOdb for true portability and scalability. See adodb-session.php for +more information.</p> + +<p>Also read <a href="http://phplens.com/lens/adodb/tips_portable_sql.htm">tips_portable_sql.htm</a> +for tips on writing portable SQL.</p> + +<h2>Unique Features of ADOdb<a name=features></a></h2> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Easy for Windows + programmers</b> to adapt to because many of the conventions are similar to + Microsoft's <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'>Unlike other PHP database + classes which focus only on select statements, <b>we provide support code + to handle inserts and updates which can be adapted to multiple databases + quickly.</b> Methods are provided for date handling, string concatenation + and string quoting characters for differing databases.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'>A<b> metatype system </b>is + built in so that we can figure out that types such as CHAR, TEXT and + STRING are equivalent in different databases.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Easy to port</b> because + all the database dependant code are stored in stub functions. You do not + need to port the core logic of the classes.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Portable table and index + creation</b> with the <a href="docs-datadict.htm">datadict</a> classes. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Database performance + monitoring and SQL tuning</b> with the <a href="docs-perf.htm">performance + monitoring</a> classes. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Database-backed sessions</b> + with the <a href="docs-session.htm">session management</a> classes. + Supports session expiry notification. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Object-Relational + Mapping</b> using <a href="docs-active-record.htm">ADOdb_Active_Record</a> + classes. </li> +</ul> + +<h2>How People are using ADOdb<a name=users></a></h2> + +<p class=MsoNormal>Here are some examples of how people are using ADOdb (for a +much longer list, visit <a +href="http://phplens.com/phpeverywhere/adodb-cool-apps">adodb-cool-apps</a>): </p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a + href="http://phplens.com/">PhpLens</a> is a commercial data grid component + that allows both cool Web designers and serious unshaved programmers to + develop and maintain databases on the Web easily. Developed by the author + of ADOdb.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a + href="http://www.interakt.ro/phakt/">PHAkt: PHP Extension for DreamWeaver + Ultradev</a> allows you to script PHP in the popular Web page editor. + Database handling provided by ADOdb.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a + href="http://www.andrew.cmu.edu/%7Erdanyliw/snort/snortacid.html">Analysis + Console for Intrusion Databases</a> (ACID): PHP-based analysis engine to + search and process a database of security incidents generated by + security-related software such as IDSes and firewalls (e.g. Snort, + ipchains). By Roman Danyliw.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a + href="http://www.postnuke.com/">PostNuke</a> is a very popular free + content management system and weblog system. It offers full CSS support, + HTML 4.01 transitional compliance throughout, an advanced blocks system, + and is fully multi-lingual enabled. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a + href="http://www.auto-net.no/easypublish.php?page=index&amp;lang_id=2">EasyPublish + CMS</a> is another free content management system for managing information + and integrated modules on your internet, intranet- and extranet-sites. + From <st1:country-region w:st="on"><st1:place w:st="on">Norway</st1:place></st1:country-region>.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a + href="http://nola.noguska.com/">NOLA</a> is a full featured accounting, + inventory, and job tracking application. It is licensed under the GPL, and + developed by Noguska. </li> +</ul> + +<h2>Feature Requests and Bug Reports<a name=bugs></a></h2> + +<p>Feature requests and bug reports can be emailed to <a +href="mailto:jlim#natsoft.com">jlim#natsoft.com</a> or posted to the ADOdb Help +forums at <a href="http://phplens.com/lens/lensforum/topics.php?id=4">http://phplens.com/lens/lensforum/topics.php?id=4</a>.</p> + +<h2>Installation Guide<a name=install></a></h2> + +<p>Make sure you are running PHP 4.0.5 or later. Unpack all the files into a +directory accessible by your webserver.</p> + +<p>To test, try modifying some of the tutorial examples. Make sure you +customize the connection settings correctly. You can debug using <i>$db-&gt;debug += true</i> as shown below:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>&lt;?php<br> +<span style='mso-tab-count:1'>         </span>include('adodb/adodb.inc.php');<br> +<span style='mso-tab-count:1'>         </span>$db = <a href="#adonewconnection">ADONewConnection</a>($dbdriver); # eg 'mysql' or 'postgres'<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;debug = true;<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;<a href="#connect">Connect</a>($server, $user, $password, $database);<br> +<span style='mso-tab-count:1'>         </span>$rs = $db-&gt;<a href="#execute">Execute</a>('select * from some_small_table');<br> +<span style='mso-tab-count:1'>         </span>print &quot;&lt;pre&gt;&quot;;<br> +<span style='mso-tab-count:1'>         </span>print_r($rs-&gt;<a href="#getrows">GetRows</a>());<br> +<span style='mso-tab-count:1'>         </span>print &quot;&lt;/pre&gt;&quot;;<br> +?&gt;</pre></div> + +<h3>Minimum Install<a name=mininstall></a></h3> + +<p>For developers who want to release a minimal install of ADOdb, you will +need: </p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb.inc.php </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-lib.inc.php </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-time.inc.php </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>drivers/adodb-$database.inc.php + </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>license.txt (for legal + reasons) </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-php4.inc.php </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-iterator.inc.php + (php5 functionality) </li> +</ul> + +<p class=MsoNormal>Optional: </p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-error.inc.php and + lang/adodb-$lang.inc.php (if you use MetaError()) </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-csvlib.inc.php (if + you use cached recordsets - CacheExecute(), etc) </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-exceptions.inc.php + and adodb-errorhandler.inc.php (if you use adodb error handler or php5 + exceptions). </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-active-record.inc.php + if you use <a href="docs-active-record.htm">Active Records</a>. </li> +</ul> + +<h3>Code Initialization Examples<a name=coding></a></h3> + +<p>When running ADOdb, at least two files are loaded. First is +adodb/adodb.inc.php, which contains all functions used by all database classes. +The code specific to a particular database is in the +adodb/driver/adodb-????.inc.php file.</p> + +<p><a name=adonewconnection></a>For example, to connect to a mysql database:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>include('/path/to/set/here/adodb.inc.php');<br> +$conn = &amp;ADONewConnection('mysql');</pre></div> + +<p>Whenever you need to connect to a database, you create a Connection object +using the <b>ADONewConnection</b>($driver) function. <b>NewADOConnection</b>($driver) +is an alternative name for the same function.</p> + +<p>At this point, you are not connected to the database (no longer true if you +pass in a <a href="#dsnsupport">dsn</a>). You will first need to decide whether +to use <i>persistent</i> or <i>non-persistent</i> connections. The advantage of +<i>persistent</i> connections is that they are faster, as the database +connection is never closed (even when you call Close()). <i>Non-persistent </i>connections +take up much fewer resources though, reducing the risk of your database and +your web-server becoming overloaded. </p> + +<p>For persistent connections, use $conn-&gt;<a href="#pconnect">PConnect()</a>, +or $conn-&gt;<a href="#connect">Connect()</a> for non-persistent connections. +Some database drivers also support <a href="#nconnect">NConnect()</a>, which +forces the creation of a new connection. <a name="connection_gotcha"></a></p> + +<p><b>Connection Gotcha</b>: If you create two connections, but both use the +same userid and password, PHP will share the same connection. This can cause +problems if the connections are meant to different databases. The solution is +to always use different userid's for different databases, or use NConnect(). <a +name=dsnsupport></a></p> + +<h3>Data Source Name (DSN) Support</h3> + +<p>Since ADOdb 4.51, you can connect to a database by passing a dsn to +NewADOConnection() (or ADONewConnection, which is the same function). The dsn +format is: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$driver://$username:$password@hostname/$database?options[=value]</pre></div> + +<p>NewADOConnection() calls Connect() or PConnect() internally for you. If the +connection fails, false is returned. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span><span style='color:green'># non-persistent connection</span></pre><pre><span +style='mso-tab-count:1'>         </span>$dsn = 'mysql://root:pwd@localhost/mydb'; </pre><pre><span +style='mso-tab-count:1'>         </span>$db = NewADOConnection($dsn);</pre><pre><span +style='mso-tab-count:1'>         </span>if (!$db) die(&quot;Connection failed&quot;);<span style='mso-spacerun:yes'>   </span></pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><span style='mso-tab-count: +1'>         </span><span style='color:green'># no need to call connect/pconnect!</span></pre><pre><span +style='mso-tab-count:1'>         </span>$arr = $db-&gt;GetArray(&quot;select * from table&quot;);</pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><span style='mso-tab-count: +1'>         </span><span style='color:green'># persistent connection</span></pre> +<pre><span +style='mso-tab-count:1'>         </span>$dsn2 = 'mysql://root:pwd@localhost/mydb?persist'; +<span +style='mso-tab-count:1'></span></pre> +<pre><span style='mso-tab-count: +1'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style='color:green'># non-persistent connection on port 3000</span></pre> +<pre><span +style='mso-tab-count:1'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>$dsn2 = 'mysqli://root:pwd@localhost/mydb?persist=0&amp;port=3000';</pre> +</div> + +<p>If you have special characters such as /:?_ in your dsn, then you need to +rawurlencode them first: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$pwd = rawurlencode($pwd);<br> +<span style='mso-tab-count:1'>         </span>$dsn = &quot;mysql://root:$pwd@localhost/mydb&quot;;</pre><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$dsn2=rawurlencode(&quot;sybase_ase&quot;).&quot;://user:pass@host/path?query&quot;;</pre></div> + +<p>Legal options are: </p> + +<div align=center> + +<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>For all drivers</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>'persist', 'persistent', 'debug', 'fetchmode', 'new' , 'cachesecs', 'memcache'</p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Interbase/Firebird </p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>'dialect','charset','buffers','role' </p> + </td> + </tr> + <tr style='mso-yfti-irow:2'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>M'soft <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City></p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>'charpage' </p> + </td> + </tr> + <tr style='mso-yfti-irow:3'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>MySQL</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>'clientflags' </p> + </td> + </tr> + <tr style='mso-yfti-irow:4'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>MySQLi</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>'port', 'socket', 'clientflags' </p> + </td> + </tr> + <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Oci8</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>'nls_date_format','charset' </p> + </td> + </tr> +</table> + +</div> + +<p>For all drivers, when the options <i>persist</i> or <i>persistent</i> are +set, a persistent connection is forced; similarly, when <i>new</i> is set, then +a new connection will be created using NConnect if the underlying driver +supports it. The <i>debug</i> option enables debugging. The <i>fetchmode</i> +calls <a href="#setfetchmode">SetFetchMode()</a>. If no value is defined for an +option, then the value is set to 1. </p> + +<p>Since ADOdb 5.09, we added 2 new parameters:</p> +<ul> +<li class=MsoNormal><i>cachesecs</i> which globally determines how many seconds to cache recordsets (default is 3600 secs if not defined) when +CacheExecute() and CacheSelectLimit() are called and no cache-time parameter is passed into these functions. +<li class=MsoNormal><i>memcache</i> which defines the memcache host, port and whether to use compression. For example: +<pre> + # we have a memcache server at 10.1.1.22 using default port 11211, no compression + $dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22'; + + # we have a memcache server 10.1.1.22 port 8888, compression=on + $dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22:8888:1'; + + # we have a memcache servers mem1,mem2 on port 8888, compression=off + $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0'; + + # we have a memcache servers mem1,mem2 on port 8888, compression=off and cachesecs=120 + $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0&cachesecs=120'; +</pre> +</ul> + +<p>ADOdb DSN's are compatible with version 1.0 of PEAR DB's DSN format. <a +name="connect_ex"></a></p> + +<h3><span style='mso-bookmark:connect_ex'>Examples of Connecting to Databases</span></h3> + +<h4><span style='mso-bookmark:connect_ex'>MySQL and Most Other Database Drivers</span></h4> + +<p><span style='mso-bookmark:connect_ex'>MySQL connections are very +straightforward, and the parameters are identical to mysql_connect:</span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$conn = &amp;ADONewConnection('mysql'); <br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;PConnect('localhost','userid','password','database');<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span></span><span style='mso-bookmark: +connect_ex'><span style='color:green'># or dsn </span></span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$dsn = 'mysql://user:pwd@localhost/mydb'; </span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for Connect()</span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span></span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span></span><span +style='mso-bookmark:connect_ex'><span style='color:green'># or persistent dsn</span></span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$dsn = 'mysql://user:pwd@localhost/mydb?persist'; </span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for PConnect()</span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span></span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span></span><span +style='mso-bookmark:connect_ex'><span style='color:green'># a more complex example:</span></span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$pwd = urlencode($pwd);</span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$flags =<span style='mso-spacerun:yes'>  </span>MYSQL_CLIENT_COMPRESS;</span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$dsn = &quot;mysql://user:$pwd@localhost/mydb?persist&amp;clientflags=$flags&quot;;</span></pre><pre><span +style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for PConnect()</span></pre><pre +style='background:#EEEEEE'><span style='mso-bookmark:connect_ex'> </span></pre></div> + +<p><span style='mso-bookmark:connect_ex'>For most drivers, you can use the +standard function: Connect($server, $user, $password, $database), or a </span><a +href="dsnsupport">DSN</a> since ADOdb 4.51. Exceptions to this are listed +below. </p> + +<h4><a name=pdo>PDO</a></h4> + +<p><span style='mso-bookmark:pdo'>PDO, which only works with PHP5, accepts a +driver specific connection string: </span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-bookmark:pdo'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:pdo'><span style='mso-tab-count:1'>         </span>$conn =&amp; NewADConnection('pdo');</span></pre><pre><span +style='mso-bookmark:pdo'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect('mysql:host=localhost',$user,$pwd,$mydb);</span></pre><pre><span +style='mso-bookmark:pdo'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect('mysql:host=localhost;dbname=mydb',$user,$pwd);</span></pre><pre><span +style='mso-bookmark:pdo'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect(&quot;mysql:host=localhost;dbname=mydb;username=$user;password=$pwd&quot;);</span></pre></div> + +<p><span style='mso-bookmark:pdo'>The DSN mechanism is also supported: </span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-bookmark:pdo'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:pdo'><span style='mso-tab-count:1'>         </span>$conn =&amp; NewADConnection(&quot;pdo_mysql://user:pwd@localhost/mydb?persist&quot;); # persist is optional</span></pre></div> + +<h4><span style='mso-bookmark:pdo'>PostgreSQL</span></h4> + +<p><span style='mso-bookmark:pdo'>PostgreSQL 7 and 8 accepts connections using: +</span></p> + +<p><span style='mso-bookmark:pdo'>a. the standard connection string:</span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span +style='mso-tab-count:1'>         </span>$conn = &amp;ADONewConnection('postgres');<span style='mso-spacerun:yes'>  </span><br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;PConnect('host=localhost port=5432 dbname=mary');</span></pre></div> + +<p><span style='mso-bookmark:pdo'>b. the classical 4 parameters:</span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span +style='mso-tab-count:1'>         </span>$conn-&gt;PConnect('localhost','userid','password','database');<br> +<span style='mso-spacerun:yes'> </span></span></pre></div> + +<p><span style='mso-bookmark:pdo'>c. dsn: </span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-bookmark:pdo'><span style='mso-tab-count:1'>         </span>$dsn = 'postgres://user:pwd@localhost/mydb?persist';<span style='mso-spacerun:yes'>  </span># persist is optional</span></pre><pre +style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span +style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for Connect/PConnect</span></pre></div> + +<span style='mso-bookmark:pdo'></span> + +<h4><a name=ldap></a>LDAP</h4> + +<p>Here is an example of querying a LDAP server. Thanks to Josh Eldridge for +the driver and this example: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>require('/path/to/adodb.inc.php');</pre><pre><o:p>&nbsp;</o:p></pre><pre>/* Make sure to set this BEFORE calling Connect() */</pre><pre>$LDAP_CONNECT_OPTIONS = Array(</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_DEREF, &quot;OPTION_VALUE&quot;=&gt;2),</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_SIZELIMIT,&quot;OPTION_VALUE&quot;=&gt;100),</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_TIMELIMIT,&quot;OPTION_VALUE&quot;=&gt;30),</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_PROTOCOL_VERSION,&quot;OPTION_VALUE&quot;=&gt;3),</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_ERROR_NUMBER,&quot;OPTION_VALUE&quot;=&gt;13),</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_REFERRALS,&quot;OPTION_VALUE&quot;=&gt;FALSE),</pre><pre><span +style='mso-tab-count:1'>         </span>Array (&quot;OPTION_NAME&quot;=&gt;LDAP_OPT_RESTART,&quot;OPTION_VALUE&quot;=&gt;FALSE)</pre><pre>);</pre><pre>$host = 'ldap.baylor.edu';</pre><pre>$ldapbase = 'ou=People,o=<st1:place +w:st="on"><st1:PlaceName w:st="on">Baylor</st1:PlaceName> <st1:PlaceType w:st="on">University</st1:PlaceType></st1:place>,c=US';</pre><pre><o:p>&nbsp;</o:p></pre><pre>$ldap = NewADOConnection( 'ldap' );</pre><pre>$ldap-&gt;Connect( $host, $user_name='', $password='', $ldapbase );</pre><pre><o:p>&nbsp;</o:p></pre><pre>echo &quot;&lt;pre&gt;&quot;;</pre><pre><o:p>&nbsp;</o:p></pre><pre>print_r( $ldap-&gt;ServerInfo() );</pre><pre>$ldap-&gt;SetFetchMode(ADODB_FETCH_ASSOC);</pre><pre>$userName = 'eldridge';</pre><pre>$filter=&quot;(|(CN=$userName*)(sn=$userName*)(givenname=$userName*)(uid=$userName*))&quot;;</pre><pre><o:p>&nbsp;</o:p></pre><pre>$rs = $ldap-&gt;Execute( $filter );</pre><pre>if ($rs)</pre><pre><span +style='mso-tab-count:1'>         </span>while ($arr = $rs-&gt;FetchRow()) {</pre><pre><span +style='mso-tab-count:1'>         </span><span style='mso-spacerun:yes'>     </span>print_r($arr);<span +style='mso-tab-count:1'>       </span></pre><pre><span style='mso-tab-count: +1'>         </span>}</pre><pre><o:p>&nbsp;</o:p></pre><pre>$rs = $ldap-&gt;Execute( $filter );</pre><pre>if ($rs) </pre><pre><span +style='mso-tab-count:1'>         </span>while (!$rs-&gt;EOF) {</pre><pre> <span +style='mso-tab-count:2'>                </span>print_r($rs-&gt;fields);<span +style='mso-tab-count:1'>     </span></pre><pre><span style='mso-tab-count:2'>                 </span>$rs-&gt;MoveNext();</pre><pre><span +style='mso-tab-count:1'>         </span>} </pre><pre><span style='mso-tab-count: +1'>         </span></pre><pre>print_r( $ldap-&gt;GetArray( $filter ) );</pre><pre>print_r( $ldap-&gt;GetRow( $filter ) );</pre><pre><o:p>&nbsp;</o:p></pre><pre>$ldap-&gt;Close();</pre><pre>echo &quot;&lt;/pre&gt;&quot;;</pre></div> + +<p>Using DSN: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$dsn = &quot;ldap://ldap.baylor.edu/ou=People,o=<st1:place +w:st="on"><st1:PlaceName w:st="on">Baylor</st1:PlaceName> <st1:PlaceType w:st="on">University</st1:PlaceType></st1:place>,c=US&quot;;</pre><pre>$db = NewADOConnection($dsn);</pre></div> + +<h4>Interbase/Firebird</h4> + +<p class=MsoNormal>You define the database in the $host parameter: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn = &amp;ADONewConnection('ibase'); <br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;PConnect('localhost:c:\ibase\employee.gdb','sysdba','masterkey');</pre></div> + +<p>Or dsn: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$dsn = 'firebird://user:pwd@localhost/mydb?persist&amp;dialect=3';<span style='mso-spacerun:yes'>  </span># persist is optional<br> +<span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for Connect/PConnect</pre></div> + +<h4>SQLite</h4> + +<p class=MsoNormal>Sqlite will create the database file if it does not exist. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$conn = &amp;ADONewConnection('sqlite');</pre><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;PConnect('c:\path\to\sqlite.db'); # sqlite will create if does not exist</pre></div> + +<p>Or dsn: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$path = urlencode('c:\path\to\sqlite.db');</pre><pre><span +style='mso-tab-count:1'>         </span>$dsn = &quot;sqlite://$path/?persist&quot;;<span style='mso-spacerun:yes'>  </span># persist is optional</pre><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for Connect/PConnect</pre></div> + +<h4>Oracle (oci8)</h4> + +<p>With oci8, you can connect in multiple ways. Note that oci8 works fine with +newer versions of the Oracle, eg. 9i and 10g.</p> + +<p>a. PHP and Oracle reside on the same machine, use default SID.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect(false, 'scott', 'tiger');</pre></div> + +<p>b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS'</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;PConnect(false, 'scott', 'tiger', 'myTNS');</pre></div> + +<p>or</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span><span +style='mso-tab-count:1'>        </span>$conn-&gt;PConnect('myTNS', 'scott', 'tiger');</pre></div> + +<p>c. Host Address and SID</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span># with adodb 5.06 or 4.991 and later</pre><pre><span +style='mso-tab-count:1'>         </span>$conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', &quot;SID=$SID&quot;);</pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><span style='mso-tab-count: +1'>         </span># OR with all versions of ADOdb</pre><pre><span +style='mso-tab-count:1'>         </span>$conn-&gt;connectSID = true;</pre><pre><span +style='mso-tab-count:1'>         </span>$conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', $SID);</pre><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span></pre></div> + +<p>d. Host Address and Service Name</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'servicename');</pre></div> + +<p>e. Oracle connection string: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$cstr = &quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))<br> +<span style='mso-tab-count:3'>                          </span>(CONNECT_DATA=(SID=$sid)))&quot;;<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Connect($cstr, 'scott', 'tiger');</pre></div> + +<p>f. ADOdb dsn: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$dsn = 'oci8://user:pwd@tnsname/?persist';<span style='mso-spacerun:yes'>  </span># persist is optional<br> +<span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'>  </span># no need for Connect/PConnect<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span>$dsn = 'oci8://user:pwd@host/sid';<br> +<span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span>$dsn = 'oci8://user:pwd@/';<span style='mso-spacerun:yes'>   </span># oracle on local machine<br> +<span style='mso-tab-count:1'>         </span>$conn = ADONewConnection($dsn);</pre></div> + +<p>You can also set the charSet for Oracle 9.2 and later, supported since PHP +4.3.2, ADOdb 4.54: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;charSet = 'we8iso8859p1';<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Connect(...);<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span># or<br> +<span style='mso-tab-count:1'>         </span>$dsn = 'oci8://user:pwd@tnsname/?charset=WE8MSWIN1252';<br> +<span style='mso-tab-count:1'>         </span>$db = ADONewConnection($dsn);</pre></div> + +<h4><a name=dsnless></a>DSN-less ODBC ( Access, MSSQL and DB2 examples)</h4> + +<p>ODBC DSN's can be created in the ODBC control panel, or you can use a +DSN-less connection.To use DSN-less connections with ODBC you need PHP 4.3 or +later. </p> + +<p>For Microsoft Access:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$db =&amp; ADONewConnection('access');<br> +<span style='mso-tab-count:1'>         </span>$dsn = <strong><span +style='font-family:"Courier New"'>&quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\\northwind.mdb;Uid=Admin;Pwd=;&quot;;</span></strong></pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;Connect($dsn);</pre></div> + +<p class=MsoNormal>For Microsoft SQL Server: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$db =&amp; ADONewConnection('odbc_mssql');<br> +<span style='mso-tab-count:1'>         </span>$dsn = <strong><span +style='font-family:"Courier New"'>&quot;Driver={SQL Server};Server=localhost;Database=northwind;&quot;</span></strong>;<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;Connect($dsn,'userid','password');</pre></div> + +<p class=MsoNormal>or if you prefer to use the mssql extension (which is +limited to mssql 6.5 functionality): </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$db =&amp; ADONewConnection('mssql');<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;Execute('localhost', 'userid', 'password', 'northwind');</pre></div> + +<p class=MsoNormal>For DB2: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>$dbms = 'db2'; # or 'odbc_db2' if db2 extension not available</pre><pre><span +style='mso-tab-count:1'>         </span>$db =&amp; ADONewConnection($dbms);</pre><pre><span +style='mso-tab-count:1'>         </span>$dsn = &quot;driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP;&quot;.</pre><pre><span +style='mso-tab-count:4'>                                   </span>&quot;uid=root; pwd=secret&quot;;<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;Connect($dsn);</pre></div> + +<p class=MsoNormal><b>DSN-less Connections with <st1:City w:st="on">ADO</st1:City></b><br> +If you are using versions of PHP earlier than PHP 4.3.0, DSN-less connections +only work with Microsoft's <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>, +which is Microsoft's COM based API. An example using the ADOdb library and +Microsoft's <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>: +</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?php<br> +<span style='mso-tab-count:1'>         </span>include('adodb.inc.php'); <br> +<span style='mso-tab-count:1'>         </span>$db = &amp;ADONewConnection(&quot;ado_mssql&quot;);<br> +<span style='mso-tab-count:1'>         </span>print &quot;&lt;h1&gt;Connecting DSN-less $db-&gt;databaseType...&lt;/h1&gt;&quot;;<br> +<span style='mso-tab-count:2'>                 </span><br> +<span style='mso-tab-count:1'>         </span><b>$myDSN=&quot;PROVIDER=MSDASQL;DRIVER={SQL Server};&quot;<br> +<span style='mso-tab-count:2'>                 </span>. &quot;SERVER=flipper;DATABASE=ai;UID=sa;PWD=;&quot;<span style='mso-spacerun:yes'>  </span>;</b></pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;Connect($myDSN);</pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><span style='mso-tab-count: +1'>         </span>$rs = $db-&gt;Execute(&quot;select * from table&quot;);</pre><pre><span +style='mso-tab-count:1'>         </span>$arr = $rs-&gt;GetArray();</pre><pre><span +style='mso-tab-count:1'>         </span>print_r($arr);</pre><pre>?&gt;</pre></div> + +<h2><a name=speed></a>High Speed ADOdb - tuning tips</h2> + +<p>ADOdb is a big class library, yet it <a href="http://phplens.com/lens/adodb/">consistently +beats</a> all other PHP class libraries in performance. This is because it is +designed in a layered fashion, like an onion, with the fastest functions in the +innermost layer. Stick to the following functions for best performance:</p> + +<div align=center> + +<table class=MsoNormalTable border=1 cellpadding=0 width="40%" + style='width:40.0%;mso-cellspacing:1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b>Innermost Layer</b></p> + </td> + </tr> + <tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p align=center style='text-align:center'>Connect, PConnect, NConnect<br> + Execute, CacheExecute<br> + SelectLimit, CacheSelectLimit<br> + MoveNext, Close <br> + qstr, Affected_Rows, Insert_ID</p> + </td> + </tr> +</table> + +</div> + +<p>The fastest way to access the field data is by accessing the array +$recordset-&gt;fields directly. Also set the global variables <a +href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a> = ADODB_FETCH_NUM, and (for +oci8, ibase/firebird and odbc) <a href="#adodb_countrecs">$ADODB_COUNTRECS</a> += false before you connect to your database.</p> + +<p>Consider using bind parameters if your database supports it, as it improves +query plan reuse. Use ADOdb's performance tuning system to identify bottlenecks +quickly. At the time of writing (Dec 2003), this means oci8 and odbc drivers.</p> + +<p>Lastly make sure you have a PHP accelerator cache installed such as APC, +Turck MMCache, Zend Accelerator or ionCube.</p> + +<p>Some examples:</p> + +<div align=center> + +<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Fastest data retrieval using PHP</b></p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Fastest data retrieval using ADOdb extension</b></p> + </td> + </tr> + <tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt; + mso-border-alt:solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt; + background:#EEEEEE'><pre style='background:#EEEEEE'>$rs =&amp; $rs-&gt;Execute($sql);<br> +while (!$rs-&gt;EOF) {<br> + <span style='mso-tab-count:1'>         </span>var_dump($rs-&gt;fields);<br> + <span style='mso-tab-count:1'>         </span>$rs-&gt;MoveNext();<br> +}</pre></div> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt; + mso-border-alt:solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt; + background:#EEEEEE'><pre style='margin-bottom:12.0pt;background:#EEEEEE'>$rs =&amp; $rs-&gt;Execute($sql);<br> +$array = adodb_getall($rs);<br> +var_dump($array);<br style='mso-special-character:line-break'> + <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'> + <![endif]></pre></div> + </td> + </tr> +</table> + +</div> + +<p><b>Advanced Tips</b> </p> + +<p>If you have the <a href="http://adodb.sourceforge.net/#extension">ADOdb C +extension</a> installed, you can replace your calls to $rs-&gt;MoveNext() with +adodb_movenext($rs). This doubles the speed of this operation. For retrieving +entire recordsets at once, use GetArray(), which uses the high speed extension +function adodb_getall($rs) internally. </p> + +<p>Execute() is the default way to run queries. You can use the low-level +functions _Execute() and _query() to reduce query overhead. Both these +functions share the same parameters as Execute(). </p> + +<p>If you do not have any bind parameters or your database supports binding +(without emulation), then you can call _Execute() directly. Calling this +function bypasses bind emulation. Debugging is still supported in _Execute(). </p> + +<p>If you do not require debugging facilities nor emulated binding, and do not +require a recordset to be returned, then you can call _query. This is great for +inserts, updates and deletes. Calling this function bypasses emulated binding, +debugging, and recordset handling. Either the resultid, true or false are +returned by _query(). </p> + +<p>For Informix, you can disable scrollable cursors with $db-&gt;cursorType = +0. </p> + +<h2><a name=hack></a>Hacking ADOdb Safely</h2> + +<p>You might want to modify ADOdb for your own purposes. Luckily you can still +maintain backward compatibility by sub-classing ADOdb and using the +$ADODB_NEWCONNECTION variable. $ADODB_NEWCONNECTION allows you to override the +behaviour of ADONewConnection(). ADOConnection() checks for this variable and +will call the function-name stored in this variable if it is defined. </p> + +<p>In the following example, new functionality for the connection object is +placed in the <i>hack_mysql</i> and <i>hack_postgres7</i> classes. The +recordset class naming convention can be controlled using $rsPrefix. Here we +set it to 'hack_rs_', which will make ADOdb use <i>hack_rs_mysql</i> and <i>hack_rs_postgres7</i> +as the recordset classes. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>class hack_mysql extends adodb_mysql {<br> +var $rsPrefix = 'hack_rs_';<br> +<span style='mso-spacerun:yes'>  </span>/* Your mods here */<br> +}<br> +<br> +class hack_rs_mysql extends ADORecordSet_mysql {<br> +<span style='mso-tab-count:1'>         </span><span style='mso-spacerun:yes'> </span>/* Your mods here */<br> +}<br> +<br> +class hack_postgres7 extends adodb_postgres7 {<br> +var $rsPrefix = 'hack_rs_';<br> +<span style='mso-spacerun:yes'>  </span>/* Your mods here */<br> +}<br> +<br> +class hack_rs_postgres7 extends ADORecordSet_postgres7 {<br> +<span style='mso-spacerun:yes'> </span>/* Your mods here */<br> +}<br> +<br> +$ADODB_NEWCONNECTION = 'hack_factory';<br> +<br> +function&amp; hack_factory($driver)<br> +{<br> +<span style='mso-tab-count:1'>         </span>if ($driver !== 'mysql' &amp;&amp; $driver !== 'postgres7') return false;<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span>$driver = 'hack_'.$driver;<br> +<span style='mso-tab-count:1'>         </span>$obj = new $driver();<br> +<span style='mso-tab-count:1'>         </span>return $obj;<br> +}<br> +<br> +include_once('adodb.inc.php');</pre></div> + +<p>Don't forget to call the constructor of the parent class in your +constructor. If you want to use the default ADOdb drivers return false in the +above hack_factory() function. Also you can define your own +ADORecordSet_empty() class, by defining a class $$this-&gt;rsPrefix.'empty' +since 4.96/5.02. <a name=php5></a></p> + +<h2>PHP5 Features</h2> + +<p class=MsoNormal>ADOdb 4.02 or later will transparently determine which +version of PHP you are using. If PHP5 is detected, the following features become +available: </p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt; + mso-list:l11 level1 lfo5;tab-stops:list 36.0pt'><b>PDO</b>: PDO drivers + are available. See the <a href="#pdo">connection examples</a>. Currently + PDO drivers are not as powerful as native drivers, and should be treated + as experimental.<a name=php5iterators></a></li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l11 level1 lfo5;tab-stops:list 36.0pt'><b>Foreach iterators</b>: + This is a very natural way of going through a recordset: </li> +</ul> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE; +margin-left:36.0pt;margin-right:0cm'><pre style='background:#EEEEEE'><span +style='mso-tab-count:1'>  </span>$ADODB_FETCH_MODE = ADODB_FETCH_NUM;<br> +<span style='mso-tab-count:1'>  </span>$rs = $db-&gt;Execute($sql);<br> +<span style='mso-tab-count:1'>  </span>foreach($rs as $k =&gt; $row) {<br> +<span style='mso-tab-count:2'>           </span>echo &quot;r1=&quot;.$row[0].&quot; r2=&quot;.$row[1].&quot;&lt;br&gt;&quot;;<br> +<span style='mso-tab-count:1'>  </span>}</pre></div> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l11 level1 lfo5;tab-stops:list 36.0pt'><a name=php5exceptions></a><b>Exceptions</b>: + Just include <i>adodb-exceptions.inc.php</i> and you can now catch + exceptions on errors as they occur. </li> +</ul> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE; +margin-left:36.0pt;margin-right:0cm'><pre style='background:#EEEEEE'><span +style='mso-tab-count:1'>  </span><b>include(&quot;../adodb-exceptions.inc.php&quot;);</b> <br> +<span style='mso-tab-count:1'>  </span>include(&quot;../adodb.inc.php&quot;);<span +style='mso-tab-count:1'>       </span> <br> +<span style='mso-tab-count:1'>  </span>try { <br> +<span style='mso-tab-count:2'>           </span>$db = NewADOConnection(&quot;oci8&quot;); <br> +<span style='mso-tab-count:2'>           </span>$db-&gt;Connect('','scott','bad-password'); <br> +<span style='mso-tab-count:1'>  </span>} catch (exception $e) { <br> +<span style='mso-tab-count:2'>           </span>var_dump($e); <br> +<span style='mso-tab-count:2'>           </span>adodb_backtrace($e-&gt;gettrace());<br> +<span style='mso-tab-count:1'>  </span>} </pre></div> + +<p style='margin-left:36.0pt'>Note that reaching EOF is <b>not</b> considered +an error nor an exception. </p> + +<h3><a name=drivers></a>Databases Supported</h3> + +<p class=MsoNormal>The <i>name</i> below is the value you pass to +NewADOConnection($name) to create a connection object for that database. </p> + +<table class=MsoNormalTable border=1 cellpadding=0 width="100%" + style='width:100.0%;mso-cellspacing:1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Name</b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Tested</b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Database</b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>RecordCount() usable</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Prerequisites</b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b>Operating Systems</b></p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>access</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Microsoft Access/Jet. You + need to create an ODBC DSN.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>ODBC </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:2'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>ado</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>Generic <st1:City w:st="on"><st1:place + w:st="on">ADO</st1:place></st1:City>, not tuned for specific databases. + Allows DSN-less connections. For best performance, use an OLEDB provider. + This is the base class for all ado drivers.</span></p> + <p><span style='font-size:10.0pt'>You can set $db-&gt;codePage before + connecting.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>? depends on database</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><st1:City w:st="on"><st1:place w:st="on"><span + style='font-size:10.0pt'>ADO</span></st1:place></st1:City><span + style='font-size:10.0pt'> or OLEDB provider</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:3'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>ado_access</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Microsoft Access/Jet using <st1:City + w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>. Allows DSN-less + connections. For best performance, use an OLEDB provider.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><st1:City w:st="on"><st1:place w:st="on"><span + style='font-size:10.0pt'>ADO</span></st1:place></st1:City><span + style='font-size:10.0pt'> or OLEDB provider</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:4'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>ado_mssql</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Microsoft SQL Server using <st1:City + w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>. Allows DSN-less + connections. For best performance, use an OLEDB provider.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><st1:City w:st="on"><st1:place w:st="on"><span + style='font-size:10.0pt'>ADO</span></st1:place></st1:City><span + style='font-size:10.0pt'> or OLEDB provider</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:5;height:40.5pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>db2</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Uses PHP's db2-specific + extension for better performance.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>DB2 CLI/ODBC interface</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p><span style='font-size:10.0pt'>Unix and Windows. Requires IBM DB2 + Universal Database client.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:6;height:40.5pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>odbc_db2</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Connects to DB2 using + generic ODBC extension.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>DB2 CLI/ODBC interface</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p><span style='font-size:10.0pt'>Unix and Windows. <a + href="http://www.faqts.com/knowledge_base/view.phtml/aid/6283/fid/14">Unix + install hints</a>. I have had reports that the $host and $database params + have to be reversed in Connect() when using the CLI interface.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:7'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>vfp</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Microsoft Visual FoxPro. + You need to create an ODBC DSN.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:8'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>fbsql</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>FrontBase. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>?</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:9'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>ibase</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Interbase 6 or earlier. + Some users report you might need to use this<br> + $db-&gt;PConnect('localhost:c:/ibase/employee.gdb', &quot;sysdba&quot;, + &quot;masterkey&quot;) to connect. Lacks Affected_Rows currently.<br> + <br> + You can set $db-&gt;role, $db-&gt;dialect, $db-&gt;buffers and + $db-&gt;charSet before connecting.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Interbase client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:10'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><i><span style='font-size:10.0pt'>firebird</span></i></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Firebird version of + interbase.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Interbase client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:11'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><i><span style='font-size:10.0pt'>borland_ibase</span></i></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Borland version of + Interbase 6.5 or later. Very sad that the forks differ.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Interbase client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:12'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>informix</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Generic informix driver. + Use this if you are using Informix 7.3 or later.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Informix client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:13'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>informix72</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Informix databases before + Informix 7.3 that do no support SELECT FIRST.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Informix client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:14'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>ldap</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>LDAP driver. See this + example for usage information.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>&nbsp;</p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>LDAP extension</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>?</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:15;height:54.75pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>mssql</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p><span style='font-size:10.0pt'>Microsoft SQL Server 7 and later. Works + with Microsoft SQL Server 2000 also. Note that date formating is problematic + with this driver. For example, the PHP mssql extension does not return the + seconds for datetime!</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Mssql client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p><span style='font-size:10.0pt'>Unix and Windows. <br> + <a href="http://phpbuilder.com/columns/alberto20000919.php3">Unix install + howto</a> and <a + href="http://linuxjournal.com/article.php?sid=6636&amp;mode=thread&amp;order=0">another + one</a>. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:16;height:54.75pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>mssqlpo</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p><span style='font-size:10.0pt'>Portable mssql driver. Identical to above mssql + driver, except that '||', the concatenation operator, is converted to '+'. + Useful for porting scripts from most other sql variants that use ||.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Mssql client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p><span style='font-size:10.0pt'>Unix and Windows. <a + href="http://phpbuilder.com/columns/alberto20000919.php3"><br> + Unix install howto</a>.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:17;height:54.75pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>mssqlnative</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p><span style='font-size:10.0pt'>Native mssql driver from M'soft. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>?</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>?</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'> + <p><span style='font-size:10.0pt'>Windows. Tq Garrett Serack of M'soft.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:18'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><o:p>&nbsp;</o:p></p> + </td> + <td style='border:none;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p>&nbsp;</o:p></span></p> + </td> + <td style='border:none;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p>&nbsp;</o:p></span></p> + </td> + <td style='border:none;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p>&nbsp;</o:p></span></p> + </td> + <td style='border:none;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p>&nbsp;</o:p></span></p> + </td> + <td style='border:none;padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p>&nbsp;</o:p></span></p> + </td> + </tr> + <tr style='mso-yfti-irow:19'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>mysql</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>MySQL without transaction + support. You can also set $db-&gt;clientFlags before connecting.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>MySQL client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:20'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>mysqlt</span></b><span + style='font-size:10.0pt'> or <b>maxsql</b></span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>MySQL with transaction support. We + recommend using || as the concat operator for best portability. This can be + done by running MySQL using: <br> + <i>mysqld --ansi</i> or <i>mysqld --sql-mode=PIPES_AS_CONCAT</i></span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>MySQL client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:21'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>oci8</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Oracle 8/9. Has more + functionality than <i>oracle</i> driver (eg. Affected_Rows). You might have + to putenv('ORACLE_HOME=...') before Connect/PConnect. </span></p> + <p><span style='font-size:10.0pt'>There are 2 ways of connecting - with + server IP and service name: <br> + <i>PConnect('serverip:1521','scott','tiger','service'</i>)<br> + or using an entry in TNSNAMES.ORA or ONAMES or HOSTNAMES: <br> + <i>PConnect(false, 'scott', 'tiger', $oraname)</i>. </span></p> + <p><span style='font-size:10.0pt'>Since 2.31, we support Oracle REF cursor + variables directly (see <a href="#executecursor">ExecuteCursor</a>).</span> </p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:22'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>oci805</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Supports reduced Oracle + functionality for Oracle 8.0.5. SelectLimit is not as efficient as in the + oci8 or oci8po drivers.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:23'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>oci8po</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Oracle 8/9 portable driver. + This is nearly identical with the oci8 driver except (a) bind variables in + Prepare() use the ? convention, instead of :bindvar, (b) field names use the + more common PHP convention of lowercase names. </span></p> + <p><span style='font-size:10.0pt'>Use this driver if porting from other + databases is important. Otherwise the oci8 driver offers better performance. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:24'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>odbc</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Generic ODBC, not tuned for + specific databases. To connect, use <br> + PConnect('DSN','user','pwd'). This is the base class for all odbc derived + drivers.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>? depends on database</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. <a + href="http://phpbuilder.com/columns/alberto20000919.php3?page=4">Unix hints.</a></span></p> + </td> + </tr> + <tr style='mso-yfti-irow:25'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>odbc_mssql</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Uses ODBC to connect to + MSSQL</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:26'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>odbc_oracle</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Uses ODBC to connect to + Oracle</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:27'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>odbtp</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Generic odbtp driver. <a + href="http://odbtp.sourceforge.net/">Odbtp</a> is a software for accessing + Windows ODBC data sources from other operating systems.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>odbtp</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:28'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>odbtp_unicode</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Odtbp with unicode support</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>odbtp</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:29;height:25.5pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>oracle</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Implements old Oracle 7 + client API. Use oci8 driver if possible for better performance.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:30;height:25.5pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>netezza</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Netezza driver. Netezza is + based on postgres code-base.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>?</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>?</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:31'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>pdo</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Generic PDO driver for + PHP5. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PDO extension and database + specific drivers</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:32'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>postgres</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Generic PostgreSQL driver. + Currently identical to postgres7 driver.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:33'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>postgres64</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>For PostgreSQL 6.4 and + earlier which does not support LIMIT internally.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:34'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>postgres7</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL which supports + LIMIT and other version 7 functionality.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:35'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>postgres8</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>A</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL which supports + version 8 functionality.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p> + </td> + </tr> + <tr style='mso-yfti-irow:36'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>sapdb</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>SAP DB. Should work + reliably as based on ODBC driver.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>SAP ODBC client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>?</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:37'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>sqlanywhere</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Sybase SQL Anywhere. Should + work reliably as based on ODBC driver.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>SQL Anywhere ODBC client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>?</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:38;height:40.5pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>sqlite</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>SQLite.</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>-</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p><span style='font-size:10.0pt'>Unix and Windows.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:39;height:40.5pt'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>sqlitepo</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>B</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Portable SQLite driver. This + is because assoc mode does not work like other drivers in sqlite. Namely, + when selecting (joining) multiple tables, the table names are included in the + assoc keys in the &quot;sqlite&quot; driver.</span></p> + <p><span style='font-size:10.0pt'>In &quot;sqlitepo&quot; driver, the table + names are stripped from the returned column names. When this results in a + conflict, the first field get preference. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>-</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'> + <p><span style='font-size:10.0pt'>Unix and Windows.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:40'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>sybase</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Sybase. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Sybase client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>Unix and Windows.</span></p> + </td> + </tr> + <tr style='mso-yfti-irow:41;mso-yfti-lastrow:yes'> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><b><span style='font-size:10.0pt'>sybase_ase</span></b></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>C</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Sybase ASE. </span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Sybase client</span></p> + </td> + <td valign=top style='padding:.75pt .75pt .75pt .75pt'> + <p><span style='font-size:10.0pt'>Unix and Windows.</span></p> + </td> + </tr> +</table> + +<p>The &quot;Tested&quot; column indicates how extensively the code has been +tested and used. <br> +A = well tested and used by many people<br> +B = tested and usable, but some features might not be implemented<br> +C = user contributed or experimental driver. Might not fully support all of the +latest features of ADOdb. </p> + +<p>The column &quot;RecordCount() usable&quot; indicates whether RecordCount() +return the number of rows, or returns -1 when a SELECT statement is executed. +If this column displays Y/N then the RecordCount() is emulated when the global +variable $ADODB_COUNTRECS=true (this is the default). Note that for large +recordsets, it might be better to disable RecordCount() emulation because +substantial amounts of memory are required to cache the recordset for counting. +Also there is a speed penalty of 40-50% if emulation is required. This is +emulated in most databases except for PostgreSQL and MySQL. This variable is +checked every time a query is executed, so you can selectively choose which +recordsets to count.</p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h1>Tutorials<a name=quickstart></a></h1> + +<h3>Example 1: Select Statement<a name=ex1></a></h3> + +<p>Task: Connect to the Access Northwind DSN, display the first 2 columns of +each row.</p> + +<p>In this example, we create a ADOConnection object, which represents the +connection to the database. The connection is initiated with <a href="#pconnect"><span +style='font-family:"Courier New"'>PConnect</span></a>, which is a persistent +connection. Whenever we want to query the database, we call the <span +style='font-family:"Courier New"'>ADOConnection.<a href="#execute">Execute</a>()</span> +function. This returns an ADORecordSet object which is actually a cursor that +holds the current row in the array <span style='font-family:"Courier New"'>fields[]</span>. +We use <span style='font-family:"Courier New"'><a href="#movenext">MoveNext</a>()</span> +to move from row to row.</p> + +<p>NB: A useful function that is not used in this example is <span +style='font-family:"Courier New"'><a href="#selectlimit">SelectLimit</a></span>, +which allows us to limit the number of rows shown. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?<br> +<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'>   </span># load code common to ADOdb<br> +$<span style='color:#660000'>conn</span> = &amp;ADONewConnection('access');<span +style='mso-tab-count:1'>        </span># create a connection<br> +$<span style='color:#660000'>conn</span>-&gt;PConnect('northwind');<span style='mso-spacerun:yes'>   </span># connect to MS-Access, northwind DSN<br> +$<span style='color:#660000'>recordSet</span> = &amp;$<span style='color:#660000'>conn</span>-&gt;Execute('select * from products');<br> +if (!$<span style='color:#660000'>recordSet</span>) <br> +<span style='mso-tab-count:1'>         </span>print $<span style='color:#660000'>conn</span>-&gt;ErrorMsg();<br> +else<br> +<b>while</b> (!$<span style='color:#660000'>recordSet</span>-&gt;EOF) {<br> +<span style='mso-tab-count:1'>         </span><b>print</b> $<span +style='color:#660000'>recordSet</span>-&gt;fields[0].' '.$<span +style='color:#660000'>recordSet</span>-&gt;fields[1].'&lt;BR&gt;';<br> +<span style='mso-tab-count:1'>         </span>$<span style='color:#660000'>recordSet</span>-&gt;MoveNext();<br> +}</pre><pre><o:p>&nbsp;</o:p></pre><pre>$<span style='color:#660000'>recordSet</span>-&gt;Close(); # optional<br> +$<span style='color:#660000'>conn</span>-&gt;Close(); # optional<br +style='mso-special-character:line-break'> +<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'> +<![endif]></pre><pre>?&gt;</pre></div> + +<p>The $<span style='font-family:"Courier New"'>recordSet</span> returned +stores the current row in the <span style='font-family:"Courier New"'>$recordSet-&gt;fields</span> +array, indexed by column number (starting from zero). We use the <span +style='font-family:"Courier New"'><a href="#movenext">MoveNext</a>()</span> +function to move to the next row. The <span style='font-family:"Courier New"'>EOF</span> +property is set to true when end-of-file is reached. If an error occurs in +Execute(), we return false instead of a recordset.</p> + +<p>The <code><span style='font-size:10.0pt'>$recordSet-&gt;fields[]</span></code> +array is generated by the PHP database extension. Some database extensions only +index by number and do not index the array by field name. To force indexing by +name - that is associative arrays - use the SetFetchMode function. Each +recordset saves and uses whatever fetch mode was set when the recordset was +created in Execute() or SelectLimit(). </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;SetFetchMode(ADODB_FETCH_NUM);<br> +<span style='mso-tab-count:1'>         </span>$rs1 = $db-&gt;Execute('select * from table');<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;SetFetchMode(ADODB_FETCH_ASSOC);<br> +<span style='mso-tab-count:1'>         </span>$rs2 = $db-&gt;Execute('select * from table');<br> +<span style='mso-tab-count:1'>         </span>print_r($rs1-&gt;fields); # shows <i>array([0]=&gt;'v0',[1] =&gt;'v1')</i></pre><pre><span +style='mso-tab-count:1'>         </span>print_r($rs2-&gt;fields); # shows <i>array(['col1']=&gt;'v0',['col2'] =&gt;'v1')</i></pre></div> + +<p>To get the number of rows in the select statement, you can use <span +style='font-family:"Courier New"'>$recordSet-&gt;<a href="#recordcount">RecordCount</a>()</span>. +Note that it can return -1 if the number of rows returned cannot be determined.</p> + +<h3>Example 2: Advanced Select with Field Objects<a name=ex2></a></h3> + +<p>Select a table, display the first two columns. If the second column is a +date or timestamp, reformat the date to <st1:country-region w:st="on"><st1:place + w:st="on">US</st1:place></st1:country-region> format.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?<br> +<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'>   </span># load code common to ADOdb<br> +$<span style='color:#660000'>conn</span> = &amp;ADONewConnection('access');<span +style='mso-tab-count:1'>        </span># create a connection<br> +$<span style='color:#660000'>conn</span>-&gt;PConnect('northwind');<span style='mso-spacerun:yes'>   </span># connect to MS-Access, northwind dsn<br> +$<span style='color:#660000'>recordSet</span> = &amp;$<span style='color:#660000'>conn</span>-&gt;Execute('select CustomerID,OrderDate from Orders');<br> +if (!$<span style='color:#660000'>recordSet</span>) <br> +<span style='mso-tab-count:1'>         </span>print $<span style='color:#660000'>conn</span>-&gt;ErrorMsg();<br> +else<br> +<b>while</b> (!$<span style='color:#660000'>recordSet</span>-&gt;EOF) {<br> +<span style='mso-tab-count:1'>         </span>$<span style='color:#660000'>fld</span> = <b><span +style='color:#336600'>$</span></b><span style='color:#660000'>recordSet</span><b><span +style='color:#336600'>-&gt;FetchField</span></b><span style='color:#006600'>(</span>1<span +style='color:#006600'>);</span></pre><pre><span style='mso-tab-count:1'>         </span>$<span +style='color:#660000'>type</span> = <b><span style='color:#336600'>$</span></b><span +style='color:#660000'>recordSet</span><b><span style='color:#336600'>-&gt;MetaType</span></b>($fld-&gt;type);<br> +<br> +<span style='mso-tab-count:1'>         </span><b>if</b> ( $<span +style='color:#660000'>type</span> == 'D' || $<span style='color:#660000'>type</span> == 'T') <br> +<span style='mso-tab-count:2'>                 </span><b>print</b> $<span +style='color:#660000'>recordSet</span>-&gt;fields[0].' '.<br> +<span style='mso-tab-count:3'>                          </span><b><span +style='color:#336600'>$</span></b><span style='color:#660000'>recordSet</span><b><span +style='color:#336600'>-&gt;UserDate</span></b>($<span style='color:#660000'>recordSet</span>-&gt;fields[1],'<b>m/d/Y</b>').'&lt;BR&gt;';<br> +<span style='mso-tab-count:1'>         </span><b>else </b></pre><pre><span +style='mso-tab-count:2'>                 </span><b>print</b> $<span +style='color:#660000'>recordSet</span>-&gt;fields[0].' '.$<span +style='color:#660000'>recordSet</span>-&gt;fields[1].'&lt;BR&gt;';<br> +<br> +<span style='mso-tab-count:1'>         </span>$<span style='color:#660000'>recordSet</span>-&gt;MoveNext();<br> +}</pre><pre>$<span style='color:#660000'>recordSet</span>-&gt;Close(); # optional<br> +$<span style='color:#660000'>conn</span>-&gt;Close(); # optional<br +style='mso-special-character:line-break'> +<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'> +<![endif]></pre><pre>?&gt;</pre></div> + +<p>In this example, we check the field type of the second column using <span +style='font-family:"Courier New"'><a href="#fetchfield">FetchField</a>().</span> +This returns an object with at least 3 fields.</p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l6 level1 lfo6;tab-stops:list 36.0pt'><b>name</b>: name of column</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l6 level1 lfo6;tab-stops:list 36.0pt'><b>type</b>: native field + type of column</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l6 level1 lfo6;tab-stops:list 36.0pt'><b>max_length</b>: maximum + length of field. Some databases such as MySQL do not return the maximum + length of the field correctly. In these cases max_length will be set to + -1.</li> +</ul> + +<p>We then use <span style='font-family:"Courier New"'><a href="#metatype">MetaType</a>()</span> +to translate the native type to a <i>generic</i> type. Currently the following <i>generic</i> +types are defined:</p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>C</b>: character fields + that should be shown in a &lt;input type=&quot;text&quot;&gt; tag.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>X</b>: TeXt, large text + fields that should be shown in a &lt;textarea&gt;</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>B</b>: Blobs, or Binary + Large Objects. Typically images. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>D</b>: Date field</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>T</b>: Timestamp field</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>L</b>: Logical field + (boolean or bit-field)</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>I</b>:&nbsp; Integer + field</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>N</b>: Numeric field. + Includes autoincrement, numeric, floating point, real and integer. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>R</b>: Serial field. + Includes serial, autoincrement integers. This works for selected + databases. </li> +</ul> + +<p>If the metatype is of type date or timestamp, then we print it using the +user defined date format with <span style='font-family:"Courier New"'><a +href="#userdate">UserDate</a>(),</span> which converts the PHP SQL date string +format to a user defined one. Another use for <span style='font-family:"Courier New"'><a +href="#metatype">MetaType</a>()</span> is data validation before doing an SQL +insert or update.</p> + +<h3>Example 3: Inserting<a name=ex3></a></h3> + +<p>Insert a row to the Orders table containing dates and strings that need to +be quoted before they can be accepted by the database, eg: the single-quote in +the word <i>John's</i>.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>&lt;?<br> +<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'>   </span># load code common to ADOdb<br> +$<span style='color:#660000'>conn</span> = &amp;ADONewConnection('access');<span +style='mso-tab-count:1'>        </span># create a connection<br> +<br> +$<span style='color:#660000'>conn</span>-&gt;PConnect('northwind');<span style='mso-spacerun:yes'>   </span># connect to MS-Access, northwind dsn<br> +$<span style='color:#660000'>shipto</span> = <b><span style='color:#006600'>$conn-&gt;qstr</span></b>(&quot;<i>John's Old Shoppe</i>&quot;);<br> +<br> +$<span style='color:#660000'>sql</span> = &quot;insert into orders (customerID,EmployeeID,OrderDate,ShipName) &quot;;<br> +$<span style='color:#660000'>sql</span> .= &quot;values ('ANATR',2,&quot;.<b><span +style='color:#006600'>$conn-&gt;DBDate(</span>time()</b><b><span +style='color:#006600'>)</span></b><span style='color:#006600'>.</span>&quot;,$<span +style='color:#660000'>shipto</span>)&quot;;<br> +<br> +<b>if</b> ($<span style='color:#660000'>conn</span>-&gt;Execute($<span +style='color:#660000'>sql</span>) <b><span style='color:#336600'>=== false</span></b>) {<br> +<span style='mso-tab-count:1'>         </span><b>print</b> 'error inserting: '.<b><span +style='color:#336600'>$conn-&gt;ErrorMsg()</span></b>.'&lt;BR&gt;';<br> +}<br> +?&gt;</pre></div> + +<p>In this example, we see the advanced date and quote handling facilities of +ADOdb. The unix timestamp (which is a long integer) is appropriately formated +for Access with <span style='font-family:"Courier New"'><a href="#dbdate">DBDate</a>()</span>, +and the right escape character is used for quoting the <i>John's Old Shoppe</i>, +which is<b> </b><i>John'<b>'</b>s Old Shoppe</i> and not PHP's default <i>John<b>'</b>s +Old Shoppe</i> with <span style='font-family:"Courier New"'><a href="#qstr">qstr</a>()</span>. +</p> + +<p>Observe the error-handling of the Execute statement. False is returned by<span +style='font-family:"Courier New"'> <a href="#execute">Execute</a>() </span>if +an error occured. The error message for the last error that occurred is +displayed in <span style='font-family:"Courier New"'><a href="#errormsg">ErrorMsg</a>()</span>. +Note: <i>php_track_errors</i> might have to be enabled for error messages to be +saved.</p> + +<h3>Example 4: Debugging<a name=ex4></a></h3> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?<br> +<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'>   </span># load code common to ADOdb<br> +$<span style='color:#663300'>conn</span> = &amp;ADONewConnection('access');<span +style='mso-tab-count:1'>        </span># create a connection<br> +$<span style='color:#663300'>conn</span>-&gt;PConnect('northwind');<span style='mso-spacerun:yes'>   </span># connect to MS-Access, northwind dsn<br> +$<span style='color:#663300'>shipto</span> = <b>$conn-&gt;qstr</b>(&quot;John's Old Shoppe&quot;);<br> +$<span style='color:#663300'>sql</span> = &quot;insert into orders (customerID,EmployeeID,OrderDate,ShipName) &quot;;<br> +$<span style='color:#663300'>sql</span> .= &quot;values ('ANATR',2,&quot;.$<span +style='color:#663300'>conn</span>-&gt;FormatDate(time()).&quot;,$shipto)&quot;;<br> +<b><span style='color:#336600'>$</span></b><b><span style='color:#663300'>conn</span></b><b><span +style='color:#336600'>-&gt;debug = true;</span></b></pre><pre><b>if</b> ($<span +style='color:#663300'>conn</span>-&gt;Execute($sql) <b>=== false</b>) <b>print</b> 'error inserting';</pre><pre>?&gt;</pre></div> + +<p>In the above example, we have turned on debugging by setting <b>debug = true</b>. +This will display the SQL statement before execution, and also show any error +messages. There is no need to call <span style='font-family:"Courier New"'><a +href="#errormsg">ErrorMsg</a>()</span> in this case. For displaying the +recordset, see the <span style='font-family:"Courier New"'><a href="#exrs2html">rs2html</a>() +</span>example.</p> + +<p>Also see the section on <a href="#errorhandling">Custom Error Handlers</a>.</p> + +<h3>Example 5: MySQL and Menus<a name=ex5></a></h3> + +<p>Connect to MySQL database <i>agora</i>, and generate a &lt;select&gt; menu +from an SQL statement where the &lt;option&gt; captions are in the 1st column, +and the value to send back to the server is in the 2nd column.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>&lt;?<br> +<b>include</b>('adodb.inc.php'); # load code common to ADOdb<br> +$<span style='color:#663300'>conn</span> = &amp;ADONewConnection('mysql');<span style='mso-spacerun:yes'>  </span># create a connection<br> +$<span style='color:#663300'>conn</span>-&gt;PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br> +$<span style='color:#663300'>sql</span> = 'select CustomerName, CustomerID from customers';<br> +$<span style='color:#663300'>rs</span> = $<span style='color:#663300'>conn</span>-&gt;Execute($sql);<br> +<b>print</b> <b><span style='color:#336600'>$</span></b><b><span +style='color:#663300'>rs</span></b><b><span style='color:#336600'>-&gt;GetMenu('GetCust','Mary Rosli');<br> +?&gt;</span></b></pre></div> + +<p>Here we define a menu named GetCust, with the menu option 'Mary Rosli' +selected. See <a href="#getmenu"><span style='font-family:"Courier New"'>GetMenu</span></a><span +style='font-family:"Courier New"'>()</span>. We also have functions that return +the recordset as an array: <span style='font-family:"Courier New"'><a +href="#getarray">GetArray</a>()</span>, and as an associative array with the +key being the first column: <a href="#getassoc1">GetAssoc</a>().</p> + +<h3>Example 6: Connecting to 2 Databases At Once<a name=ex6></a></h3> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>&lt;?<br> +<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span> # load code common to ADOdb<br> +$<span style='color:#663300'>conn1</span> = &amp;ADONewConnection('mysql');<span style='mso-spacerun:yes'>  </span># create a mysql connection<br> +$<span style='color:#663300'>conn2</span> = &amp;ADONewConnection('oracle');<span style='mso-spacerun:yes'>  </span># create a oracle connection<br> +<br> +$conn1-&gt;PConnect($server, $userid, $password, $database);<br> +$conn2-&gt;PConnect(false, $ora_userid, $ora_pwd, $oraname);<br> +<br> +$conn1-&gt;Execute('insert ...');<br> +$conn2-&gt;Execute('update ...');<br> +?&gt;</pre></div> + +<h3>Example 7: Generating Update and Insert SQL<a name=ex7></a></h3> + +<p>Since ADOdb 4.56, we support <a +href="reference.functions.getupdatesql.html#autoexecute">AutoExecute()</a>, +which simplifies things by providing an advanced wrapper for GetInsertSQL() and +GetUpdateSQL(). For example, an INSERT can be carried out with: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span style='mso-spacerun:yes'>    </span>$record[&quot;firstname&quot;] = &quot;Bob&quot;; </pre><pre><span style='mso-spacerun:yes'>    </span>$record[&quot;lastname&quot;] = &quot;Smith&quot;; </pre><pre><span style='mso-spacerun:yes'>    </span>$record[&quot;created&quot;] = time(); </pre><pre><span style='mso-spacerun:yes'>    </span>$insertSQL = $conn-&gt;AutoExecute($rs, $record, 'INSERT'); </pre></div> + +<p class=MsoNormal>and an UPDATE with: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span style='mso-spacerun:yes'>    </span>$record[&quot;firstname&quot;] = &quot;Caroline&quot;; </pre><pre><span style='mso-spacerun:yes'>    </span>$record[&quot;lastname&quot;] = &quot;Smith&quot;; # Update Caroline's lastname from Miranda to Smith </pre><pre><span style='mso-spacerun:yes'>    </span>$insertSQL = $conn-&gt;AutoExecute($rs, $record, 'UPDATE', 'id = 1'); </pre></div> + +<p>The rest of this section is out-of-date: </p> + +<p>ADOdb 1.31 and later supports two new recordset functions: GetUpdateSQL( ) +and GetInsertSQL( ). This allow you to perform a &quot;SELECT * FROM table +query WHERE...&quot;, make a copy of the $rs-&gt;fields, modify the fields, and +then generate the SQL to update or insert into the table automatically. </p> + +<p>We show how the functions can be used when accessing a table with the +following fields: (ID, FirstName, LastName, Created). </p> + +<p>Before these functions can be called, you need to initialize the recordset by +performing a select on the table. Idea and code by Jonathan Younger +jyounger#unilab.com. Since ADOdb 2.42, you can pass a table name instead of a +recordset into GetInsertSQL (in $rs), and it will generate an insert statement +for that table. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>&lt;?<br> +#==============================================<br> +# SAMPLE GetUpdateSQL() and GetInsertSQL() code<br> +#==============================================<br> +include('adodb.inc.php');<br> +include('tohtml.inc.php');<br> +<br> +#==========================<br> +# This code tests an insert<br> +<br> +$sql = &quot;SELECT * FROM ADOXYZ WHERE id = -1&quot;; <br> +# Select an empty record from the database<br> +<br> +$conn = &amp;ADONewConnection(&quot;mysql&quot;);<span style='mso-spacerun:yes'>  </span># create a connection<br> +$conn-&gt;debug=1;<br> +$conn-&gt;PConnect(&quot;localhost&quot;, &quot;admin&quot;, &quot;&quot;, &quot;test&quot;); # connect to MySQL, testdb<br> +$rs = $conn-&gt;Execute($sql); # Execute the query and get the empty recordset<br> +<br> +$record = array(); # Initialize an array to hold the record data to insert<br> +<br> +# Set the values for the fields in the record<br> +# Note that field names are case-insensitive<br> +$record[&quot;firstname&quot;] = &quot;Bob&quot;;<br> +$record[&quot;lastNamE&quot;] = &quot;Smith&quot;;<br> +$record[&quot;creaTed&quot;] = time();<br> +<br> +# Pass the empty recordset and the array containing the data to insert<br> +# into the GetInsertSQL function. The function will process the data and return<br> +# a fully formatted insert sql statement.<br> +$insertSQL = $conn-&gt;GetInsertSQL($rs, $record);<br> +<br> +$conn-&gt;Execute($insertSQL); # Insert the record into the database<br> +<br> +#==========================<br> +# This code tests an update<br> +<br> +$sql = &quot;SELECT * FROM ADOXYZ WHERE id = 1&quot;; <br> +# Select a record to update<br> +<br> +$rs = $conn-&gt;Execute($sql); # Execute the query and get the existing record to update<br> +<br> +$record = array(); # Initialize an array to hold the record data to update<br> +<br> +# Set the values for the fields in the record<br> +# Note that field names are case-insensitive<br> +$record[&quot;firstname&quot;] = &quot;Caroline&quot;;<br> +$record[&quot;LasTnAme&quot;] = &quot;Smith&quot;; # Update Caroline's lastname from Miranda to Smith<br> +<br> +# Pass the single record recordset and the array containing the data to update<br> +# into the GetUpdateSQL function. The function will process the data and return<br> +# a fully formatted update sql statement with the correct WHERE clause.<br> +# If the data has not changed, no recordset is returned<br> +$updateSQL = $conn-&gt;GetUpdateSQL($rs, $record);<br> +<br> +$conn-&gt;Execute($updateSQL); # Update the record in the database<br> +$conn-&gt;Close();<br> +?&gt;</pre></div> + +<p class=MsoNormal><a name="ADODB_FORCE_TYPE"></a><b>$ADODB_FORCE_TYPE</b></p> + +<p>The behaviour of AutoExecute(), GetUpdateSQL() and GetInsertSQL() when +converting empty or null PHP variables to SQL is controlled by the global +$ADODB_FORCE_TYPE variable. Set it to one of the values below. Default is +ADODB_FORCE_VALUE (3): </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>0 = ignore empty fields. All empty fields in array are ignored.<br> +1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values.<br> +2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values.<br> +3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and <br> +<span style='mso-spacerun:yes'>    </span>empty fields '' are set to empty '' sql values.<br> +<br> +define('ADODB_FORCE_IGNORE',0);<br> +define('ADODB_FORCE_NULL',1);<br> +define('ADODB_FORCE_EMPTY',2);<br> +define('ADODB_FORCE_VALUE',3);</pre></div> + +<p>Thanks to Niko (nuko#mbnet.fi) for the $ADODB_FORCE_TYPE code. </p> + +<p>Note: the constant ADODB_FORCE_NULLS is obsolete since 4.52 and is ignored. +Set $ADODB_FORCE_TYPE = ADODB_FORCE_NULL for equivalent behaviour. </p> + +<p>Since 4.62, the table name to be used can be overridden by setting +$rs-&gt;tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called. </p> + +<h3>Example 8: Implementing Scrolling with Next and Previous<a name=ex8></a></h3> + +<p>The following code creates a very simple recordset pager, where you can +scroll from page to page of a recordset.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>include_once('../adodb.inc.php');<br> +include_once('../adodb-pager.inc.php');<br> +session_start();<br> +<br> +$db = NewADOConnection('mysql');<br> +<br> +$db-&gt;Connect('localhost','root','','xphplens');<br> +<br> +$sql = &quot;select * from adoxyz &quot;;<br> +<br> +$pager = new ADODB_Pager($db,$sql);<br> +$pager-&gt;Render($rows_per_page=5);</pre></div> + +<p>This will create a basic record pager that looks like this: <a name=scr></a></p> + +<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:1.5pt; + background:beige'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><a href="#scr"><code><span style='font-size:10.0pt'>|&lt;</span></code></a> + &nbsp; <a href="#scr"><code><span style='font-size:10.0pt'>&lt;&lt;</span></code></a> + &nbsp; <a href="#scr"><code><span style='font-size:10.0pt'>&gt;&gt;</span></code></a> + &nbsp; <a href="#scr"><code><span style='font-size:10.0pt'>&gt;|</span></code></a> + &nbsp; </p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <table class=MsoNormalTable border=1 cellpadding=0 width="100%" + style='width:100.0%;mso-cellspacing:1.5pt;background:white' cols=4> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b>ID<o:p></o:p></b></p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b>First Name<o:p></o:p></b></p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b>Last Name<o:p></o:p></b></p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=center style='text-align:center'><b>Date Created<o:p></o:p></b></p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=right style='text-align:right'>36&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Alan&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Turing&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Sat 06, Oct 2001&nbsp;</p> + </td> + </tr> + <tr style='mso-yfti-irow:2'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=right style='text-align:right'>37&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Serena&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Williams&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Sat 06, Oct 2001&nbsp;</p> + </td> + </tr> + <tr style='mso-yfti-irow:3'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=right style='text-align:right'>38&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Yat Sun&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Sun&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Sat 06, Oct 2001&nbsp;</p> + </td> + </tr> + <tr style='mso-yfti-irow:4'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=right style='text-align:right'>39&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Wai Hun&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>See&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Sat 06, Oct 2001&nbsp;</p> + </td> + </tr> + <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal align=right style='text-align:right'>40&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Steven&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Oey&nbsp;</p> + </td> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal>Sat 06, Oct 2001&nbsp;</p> + </td> + </tr> + </table> + <p class=MsoNormal><o:p></o:p></p> + </td> + </tr> + <tr style='mso-yfti-irow:2;mso-yfti-lastrow:yes'> + <td style='padding:.75pt .75pt .75pt .75pt'> + <p class=MsoNormal><span style='font-size:10.0pt'>Page 8/10</span></p> + </td> + </tr> +</table> + +<p>The number of rows to display at one time is controled by the Render($rows) +method. If you do not pass any value to Render(), ADODB_Pager will default to +10 records per page. </p> + +<p>You can control the column titles by modifying your SQL (supported by most +databases): </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$sql = 'select id as &quot;ID&quot;, firstname as &quot;First Name&quot;, <br> +<span style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>lastname as &quot;Last Name&quot;, created as &quot;Date Created&quot; <br> +<span style='mso-tab-count:2'>                 </span>from adoxyz';</pre></div> + +<p>The above code can be found in the <i>adodb/tests/testpaging.php</i> example +included with this release, and the class ADODB_Pager in <i>adodb/adodb-pager.inc.php</i>. +The ADODB_Pager code can be adapted by a programmer so that the text links can +be replaced by images, and the dull white background be replaced with more +interesting colors. </p> + +<p>You can also allow display of html by setting $pager-&gt;htmlSpecialChars = +false. </p> + +<p>Some of the code used here was contributed by Iván Oliva and Cornel G. </p> + +<h3><a name=ex9></a>Example 9: Exporting in CSV or Tab-Delimited Format</h3> + +<p>We provide some helper functions to export in comma-separated-value (CSV) +and tab-delimited formats:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><b>include_once('/path/to/adodb/toexport.inc.php');</b><br> +include_once('/path/to/adodb/adodb.inc.php');<br style='mso-special-character: +line-break'> +<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'> +<![endif]></pre><pre style='background:#EEEEEE'>$db = &amp;NewADOConnection('mysql');<br> +$db-&gt;Connect($server, $userid, $password, $database);<br> +<br> +$rs = $db-&gt;Execute('select fname as &quot;First Name&quot;, surname as &quot;Surname&quot; from table');<br> +<br> +print &quot;&lt;pre&gt;&quot;;<br> +print <b>rs2csv</b>($rs); # return a string, CSV format</pre> + +<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; +background:#EEEEEE;border:none;mso-border-alt:solid #DDDDDD .75pt;padding:0cm; +mso-padding-alt:9.0pt 18.0pt 9.0pt 18.0pt'><span style='font-size:9.0pt; +font-family:"Courier New"'>print '&lt;hr&gt;';<br> +<br> +$rs-&gt;MoveFirst(); # note, some databases do not support MoveFirst<br> +print <b>rs2tab</b>($rs,<i>false</i>); # return a string, tab-delimited<br> +<span style='mso-tab-count:6'>                                                    </span><span +style='mso-spacerun:yes'> </span># false == suppress field names in first line<o:p></o:p></span></p> + +<pre style='background:#EEEEEE'>print '&lt;hr&gt;';<br> +$rs-&gt;MoveFirst();<br> +<b>rs2tabout</b>($rs); # send to stdout directly (there is also an rs2csvout function)<br> +print &quot;&lt;/pre&gt;&quot;;<br> +<br> +$rs-&gt;MoveFirst();<br> +$fp = fopen($path, &quot;w&quot;);<br> +if ($fp) {<br> +<span style='mso-spacerun:yes'>  </span><b>rs2csvfile</b>($rs, $fp); # write to file (there is also an rs2tabfile function)<br> +<span style='mso-spacerun:yes'>  </span>fclose($fp);<br> +}</pre></div> + +<p>Carriage-returns or newlines are converted to spaces. Field names are +returned in the first line of text. Strings containing the delimiter character +are quoted with double-quotes. Double-quotes are double-quoted again. This +conforms to Excel import and export guide-lines. </p> + +<p>All the above functions take as an optional last parameter, $addtitles which +defaults to <i>true</i>. When set to <i>false</i> field names in the first line +are suppressed. </p> + +<h3>Example 10: Recordset Filters<a name=ex10></a></h3> + +<p>Sometimes we want to pre-process all rows in a recordset before we use it. +For example, we want to ucwords all text in recordset. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>include_once('adodb/rsfilter.inc.php');<br> +include_once('adodb/adodb.inc.php');<br> +<br> +// ucwords() every element in the recordset<br> +function do_ucwords(&amp;$arr,$rs)<br> +{<br> +<span style='mso-tab-count:1'>         </span>foreach($arr as $k =&gt; $v) {<br> +<span style='mso-tab-count:2'>                 </span>$arr[$k] = ucwords($v);<br> +<span style='mso-tab-count:1'>         </span>}<br> +}<br> +<br> +$db = NewADOConnection('mysql');<br> +$db-&gt;PConnect('server','user','pwd','db');<br> +<br> +$rs = $db-&gt;Execute('select ... from table');<br> +$rs = <b>RSFilter</b>($rs,'do_ucwords');</pre></div> + +<p>The <i>RSFilter</i> function takes 2 parameters, the recordset, and the name +of the <i>filter</i> function. It returns the processed recordset scrolled to +the first record. The <i>filter</i> function takes two parameters, the current +row as an array, and the recordset object. For future compatibility, you should +not use the original recordset object. </p> + +<h3>Example 11:<a name=ex11></a> Smart Transactions</h3> + +<p class=MsoNormal>The old way of doing transactions required you to use </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$conn-&gt;<b>BeginTrans</b>();<br> +$ok = $conn-&gt;Execute($sql);<br> +if ($ok) $ok = $conn-&gt;Execute($sql2);<br> +if (!$ok) $conn-&gt;<b>RollbackTrans</b>();<br> +else $conn-&gt;<b>CommitTrans</b>();</pre></div> + +<p class=MsoNormal>This is very complicated for large projects because you have +to track the error status. Smart Transactions is much simpler. You start a +smart transaction by calling StartTrans(): </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$conn-&gt;<b>StartTrans</b>();<br> +$conn-&gt;Execute($sql);<br> +$conn-&gt;Execute($Sql2);<br> +$conn-&gt;<b>CompleteTrans</b>();</pre></div> + +<p class=MsoNormal>CompleteTrans() detects when an SQL error occurs, and will +Rollback/Commit as appropriate. To specificly force a rollback even if no error +occured, use FailTrans(). Note that the rollback is done in CompleteTrans(), +and not in FailTrans(). </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$conn-&gt;<b>StartTrans</b>();<br> +$conn-&gt;Execute($sql);<br> +if (!CheckRecords()) $conn-&gt;<strong><span style='font-family:"Courier New"'>FailTrans</span></strong>();<br> +$conn-&gt;Execute($Sql2);<br> +$conn-&gt;<b>CompleteTrans</b>();</pre></div> + +<p>You can also check if a transaction has failed, using HasFailedTrans(), +which returns true if FailTrans() was called, or there was an error in the SQL +execution. Make sure you call HasFailedTrans() before you call CompleteTrans(), +as it is only works between StartTrans/CompleteTrans. </p> + +<p>Lastly, StartTrans/CompleteTrans is nestable, and only the outermost block +is executed. In contrast, BeginTrans/CommitTrans/RollbackTrans is NOT nestable. +</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>$conn-&gt;<strong><span +style='font-family:"Courier New"'>StartTrans</span></strong>();<br> +$conn-&gt;Execute($sql);<br> +<span style='mso-spacerun:yes'>  </span>$conn-&gt;<strong><span +style='font-family:"Courier New"'>StartTrans</span></strong>();<span style='mso-spacerun:yes'>    </span><span +style='color:#006600'># ignored</span></pre><pre><span style='mso-spacerun:yes'>  </span>if (!CheckRecords()) $conn-&gt;FailTrans();</pre><pre><span style='mso-spacerun:yes'>  </span>$conn-&gt;<strong><span +style='font-family:"Courier New"'>CompleteTrans</span></strong>(); <span +style='color:#006600'># ignored</span></pre><pre>$conn-&gt;Execute($Sql2);</pre><pre +style='background:#EEEEEE'>$conn-&gt;<strong><span style='font-family:"Courier New"'>CompleteTrans</span></strong>();</pre></div> + +<p>Note: Savepoints are currently not supported. </p> + +<h2><a name=errorhandling></a>Using Custom Error Handlers and PEAR_Error</h2> + +<p>ADOdb supports PHP5 exceptions. Just include <i>adodb-exceptions.inc.php</i> +and you can now catch exceptions on errors as they occur. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span><b>include(&quot;../adodb-exceptions.inc.php&quot;);</b> <br> +<span style='mso-tab-count:1'>         </span>include(&quot;../adodb.inc.php&quot;);<span +style='mso-tab-count:1'>       </span> <br> +<span style='mso-tab-count:1'>         </span>try { <br> +<span style='mso-tab-count:2'>                 </span>$db = NewADOConnection(&quot;oci8://scott:bad-password@mytns/&quot;); <br> +<span style='mso-tab-count:1'>         </span>} catch (exception $e) { <br> +<span style='mso-tab-count:2'>                 </span>var_dump($e); <br> +<span style='mso-tab-count:2'>                 </span>adodb_backtrace($e-&gt;gettrace());<br> +<span style='mso-tab-count:1'>         </span>} </pre></div> + +<p>ADOdb also provides two custom handlers which you can modify for your needs. +The first one is in the <b>adodb-errorhandler.inc.php</b> file. This makes use +of the standard PHP functions <a href="http://php.net/error_reporting">error_reporting</a> +to control what error messages types to display, and <a +href="http://php.net/trigger_error">trigger_error</a> which invokes the default +PHP error handler. </p> + +<p>Including the above file will cause <i>trigger_error($errorstring,E_USER_ERROR)</i> +to be called when<br> +(a) Connect() or PConnect() fails, or <br> +(b) a function that executes SQL statements such as Execute() or SelectLimit() +has an error.<br> +(c) GenID() appears to go into an infinite loop. </p> + +<p>The $errorstring is generated by ADOdb and will contain useful debugging +information similar to the error.log data generated below. This file +adodb-errorhandler.inc.php should be included before you create any +ADOConnection objects. </p> + +<p>If you define error_reporting(0), no errors will be passed to the error +handler. If you set error_reporting(E_ALL), all errors will be passed to the +error handler. You still need to use <b>ini_set(&quot;display_errors&quot;, +&quot;0&quot; or &quot;1&quot;)</b> to control the display of errors. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?php<br> +<b>error_reporting(E_ALL); # pass any error messages triggered to error handler<br> +include('adodb-errorhandler.inc.php');</b></pre><pre>include('adodb.inc.php');</pre><pre>include('tohtml.inc.php');</pre><pre>$c = NewADOConnection('mysql');</pre><pre>$c-&gt;PConnect('localhost','root','','northwind');</pre><pre>$rs=$c-&gt;Execute('select * from productsz'); #invalid table productsz');</pre><pre>if ($rs) rs2html($rs);</pre><pre>?&gt;</pre></div> + +<p>If you want to log the error message, you can do so by defining the +following optional constants ADODB_ERROR_LOG_TYPE and ADODB_ERROR_LOG_DEST. +ADODB_ERROR_LOG_TYPE is the error log message type (see <a +href="http://php.net/error_log">error_log</a> in the PHP manual). In this case +we set it to 3, which means log to the file defined by the constant +ADODB_ERROR_LOG_DEST. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?php<br> +<b>error_reporting(E_ALL); # report all errors<br> +ini_set(&quot;display_errors&quot;, &quot;0&quot;); # but do not echo the errors<br> +define('ADODB_ERROR_LOG_TYPE',3);<br> +define('ADODB_ERROR_LOG_DEST','C:/errors.log');<br> +include('adodb-errorhandler.inc.php');</b></pre><pre>include('adodb.inc.php');</pre><pre>include('tohtml.inc.php');</pre><pre><o:p>&nbsp;</o:p></pre><pre>$c = NewADOConnection('mysql');</pre><pre>$c-&gt;PConnect('localhost','root','','northwind');</pre><pre>$rs=$c-&gt;Execute('select * from productsz'); ## invalid table productsz</pre><pre>if ($rs) rs2html($rs);</pre><pre>?&gt;</pre></div> + +<p class=MsoNormal>The following message will be logged in the error.log file: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>(2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' doesn't exist] in<br> +<span style='mso-spacerun:yes'> </span>EXECUTE(&quot;select * from productsz&quot;)</pre></div> + +<h3>PEAR_ERROR</h3> + +<p class=MsoNormal>The second error handler is <b>adodb-errorpear.inc.php</b>. +This will create a PEAR_Error derived object whenever an error occurs. The last +PEAR_Error object created can be retrieved using ADODB_Pear_Error(). </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>&lt;?php<br> +<b>include('adodb-errorpear.inc.php');</b></pre><pre>include('adodb.inc.php');</pre><pre>include('tohtml.inc.php');</pre><pre>$c = NewADOConnection('mysql');</pre><pre>$c-&gt;PConnect('localhost','root','','northwind');</pre><pre>$rs=$c-&gt;Execute('select * from productsz'); #invalid table productsz');</pre><pre>if ($rs) rs2html($rs);</pre><pre>else {</pre><pre><span +style='mso-tab-count:1'>         </span><b>$e = ADODB_Pear_Error();<br> +<span style='mso-tab-count:1'>         </span>echo '&lt;p&gt;',$e-&gt;message,'&lt;/p&gt;';</b></pre><pre>}</pre><pre>?&gt;</pre></div> + +<p>You can use a PEAR_Error derived class by defining the constant +ADODB_PEAR_ERROR_CLASS before the adodb-errorpear.inc.php file is included. For +easy debugging, you can set the default error handler in the beginning of the +PHP script to PEAR_ERROR_DIE, which will cause an error message to be printed, +then halt script execution: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>include('PEAR.php');<br> +PEAR::setErrorHandling('PEAR_ERROR_DIE');</pre></div> + +<p>Note that we do not explicitly return a PEAR_Error object to you when an +error occurs. We return false instead. You have to call ADODB_Pear_Error() to +get the last error or use the PEAR_ERROR_DIE technique. </p> + +<h3>MetaError and MetaErrMsg</h3> + +<p>If you need error messages that work across multiple databases, then use <a +href="#metaerror">MetaError()</a>, which returns a virtualized error number, +based on PEAR DB's error number system, and <a href="#metaerrmsg">MetaErrMsg()</a>. +</p> + +<h4>Error Messages</h4> + +<p>Error messages are outputted using the static method +ADOConnnection::outp($msg,$newline=true). By default, it sends the messages to +the client. You can override this to perform error-logging. </p> + +<h2><a name=dsn></a>Data Source Names</h2> + +<p>We now support connecting using PEAR style DSN's. A DSN is a connection +string of the form:</p> + +<p>$dsn = <i>&quot;$driver://$username:$password@$hostname/$databasename&quot;</i>;</p> + +<p>An example:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>   </span>$username = 'root';<br> +<span style='mso-spacerun:yes'>   </span>$password = '';<br> +<span style='mso-spacerun:yes'>   </span>$hostname = 'localhost';<br> +<span style='mso-spacerun:yes'>   </span>$databasename = 'xphplens';<br> +<span style='mso-spacerun:yes'>   </span>$driver = 'mysql';<br> +<span style='mso-spacerun:yes'>   </span>$dsn = &quot;$driver://$username:$password@$hostname/$databasename&quot;<br> +<span style='mso-spacerun:yes'>   </span>$db = NewADOConnection(); <br> +<span style='mso-spacerun:yes'>   </span># DB::Connect($dsn) also works if you include 'adodb/adodb-pear.inc.php' at the top<br> +<span style='mso-spacerun:yes'>   </span>$rs = $db-&gt;query('select firstname,lastname from adoxyz');<br> +<span style='mso-spacerun:yes'>   </span>$cnt = 0;<br> +<span style='mso-spacerun:yes'>   </span>while ($arr = $rs-&gt;fetchRow()) {<br> +<span style='mso-tab-count:2'>                 </span>print_r($arr); print &quot;&lt;br&gt;&quot;;<br> +<span style='mso-spacerun:yes'>   </span>}</pre></div> + +<p><a href="#dsnsupport">More info and connection examples</a> on the DSN +format. </p> + +<h2><a name=pear></a>PEAR Compatibility</h2> + +<p class=MsoNormal>We support DSN's (see above), and the following functions: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><b><span style='mso-spacerun:yes'> </span>DB_Common</b></pre><pre> <span +style='mso-tab-count:1'>        </span>query - returns PEAR_Error on error</pre><pre><span +style='mso-tab-count:1'>         </span>limitQuery - return PEAR_Error on error</pre><pre><span +style='mso-tab-count:1'>         </span>prepare - does not return PEAR_Error on error</pre><pre><span +style='mso-tab-count:1'>         </span>execute - does not return PEAR_Error on error</pre><pre><span +style='mso-tab-count:1'>         </span>setFetchMode - supports ASSOC and ORDERED</pre><pre><span +style='mso-tab-count:1'>         </span>errorNative</pre><pre><span +style='mso-tab-count:1'>         </span>quote</pre><pre><span style='mso-tab-count: +1'>         </span>nextID</pre><pre><span style='mso-tab-count:1'>         </span>disconnect</pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><span style='mso-tab-count: +1'>         </span>getOne</pre><pre><span style='mso-tab-count:1'>         </span>getAssoc</pre><pre><span +style='mso-tab-count:1'>         </span>getRow</pre><pre><span +style='mso-tab-count:1'>         </span>getCol</pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><b> DB_Result</b></pre><pre> <span +style='mso-tab-count:1'>        </span>numRows - returns -1 if not supported</pre><pre><span +style='mso-tab-count:1'>         </span>numCols</pre><pre><span +style='mso-tab-count:1'>         </span>fetchInto - does not support passing of fetchmode</pre><pre><span +style='mso-tab-count:1'>         </span>fetchRows - does not support passing of fetchmode</pre><pre><span +style='mso-tab-count:1'>         </span>free</pre></div> + +<h2><a name=caching></a>Caching of Recordsets</h2> + +<p>ADOdb now supports caching of recordsets in the file system using the +CacheExecute( ), CachePageExecute( ) and CacheSelectLimit( ) functions. There +are similar to the non-cache functions, except that they take a new first +parameter, $secs2cache. </p> + +<p>An example: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br> +$ADODB_CACHE_DIR = '/usr/ADODB_cache';<br> +$<span style='color:#663300'>conn</span> = &amp;ADONewConnection('mysql');<span style='mso-spacerun:yes'>  </span># create a connection<br> +$<span style='color:#663300'>conn</span>-&gt;PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br> +$<span style='color:#663300'>sql</span> = 'select CustomerName, CustomerID from customers';<br> +$<span style='color:#663300'>rs</span> = $<span style='color:#663300'>conn</span>-&gt;CacheExecute(15,$sql);</pre></div> + +<p>The first parameter is the number of seconds to cache the query. Subsequent +calls to that query will used the cached version stored in $ADODB_CACHE_DIR. To +force a query to execute and flush the cache, call CacheExecute() with the +first parameter set to zero. Alternatively, use the CacheFlush($sql) call. </p> + +<p>For the sake of security, we recommend you set <i>register_globals=off</i> in +php.ini if you are using $ADODB_CACHE_DIR.</p> + +<p>In ADOdb 1.80 onwards, the secs2cache parameter is optional in +CacheSelectLimit() and CacheExecute(). If you leave it out, it will use the +$connection-&gt;cacheSecs parameter, which defaults to 60 minutes. The following +are equivalent: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span style='mso-spacerun:yes'>  </span># (1)</pre><pre><span style='mso-spacerun:yes'>  </span>$rs = $db-&gt;SelectLimit(30, 'select * from table', 10);</pre><pre><span style='mso-spacerun:yes'>  </span></pre><pre><span style='mso-spacerun:yes'>  </span># (2)</pre><pre><span style='mso-spacerun:yes'>  </span>$db-&gt;cacheSsecs = 30;</pre><pre><span style='mso-spacerun:yes'>  </span>$rs = $db-&gt;SelectLimit('select * from table', 10);</pre><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>  </span></pre><pre><span +style='mso-tab-count:1'>         </span>$conn-&gt;Connect(...);<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;cacheSecs = 3600*24; # cache 24 hours<br> +<span style='mso-tab-count:1'>         </span>$rs = $conn-&gt;CacheExecute('select * from table');</pre></div> + +<p>Please note that magic_quotes_runtime should be turned off. Do not change +$ADODB_FETCH_MODE (or SetFetchMode) as the cached recordset will use the +$ADODB_FETCH_MODE set when the query was executed. <a name=memcache></a></p> + +<h3><span style='mso-bookmark:memcache'>MemCache support</span></h3> + +<p><span style='mso-bookmark:memcache'>You can also share cached recordsets on +a memcache server. The memcache API supports one or more pooled hosts. Only if +none of the pooled servers can be contacted will a connect error be generated. +Example below: </span></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-bookmark:memcache'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:memcache'>$db = NewADOConnection($driver='mysql');</span></pre><pre><span +style='mso-bookmark:memcache'>$db-&gt;memCache = true;</span></pre><pre><span +style='mso-bookmark:memcache'>$db-&gt;memCacheHost = array($ip1, $ip2, $ip3); /// $db-&gt;memCacheHost = $ip1; will work too</span></pre><pre><span +style='mso-bookmark:memcache'>$db-&gt;memCachePort = 11211; /// this is default memCache port</span></pre><pre><span +style='mso-bookmark:memcache'>$db-&gt;memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)</span></pre><pre><span +style='mso-bookmark:memcache'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:memcache'>$db-&gt;Connect(...);</span></pre><pre><span +style='mso-bookmark:memcache'>$db-&gt;CacheExecute($sql);</span></pre></div> + +<p><span style='mso-bookmark:memcache'>More info on memcache can be found at </span><a +href="http://www.danga.com/memcached/">http://www.danga.com/memcached/</a>. <a +name=cacheapi></a></p> + +<h3><span style='mso-bookmark:cacheapi'>Caching API</span></h3> + +<p><span style='mso-bookmark:cacheapi'>There is also a caching API since +4.99/5.05. Two implementations of the API are already available providing file +and memcache support. </span></p> + +<p><span style='mso-bookmark:cacheapi'>The new API for creating your custom +caching class uses 2 globals: </span></p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l8 level1 lfo8;tab-stops:list 36.0pt'><span style='mso-bookmark: + cacheapi'>$ADODB_CACHE_CLASS: name of caching class </span></li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l8 level1 lfo8;tab-stops:list 36.0pt'><span style='mso-bookmark: + cacheapi'>$ADODB_CACHE: instance of $ADODB_CACHE_CLASS </span></li> +</ul> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-bookmark:cacheapi'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:cacheapi'>include &quot;/path/to/adodb.inc.php&quot;;</span></pre><pre><span +style='mso-bookmark:cacheapi'>$ADODB_CACHE_CLASS = 'MyCacheClass';</span></pre><pre><span +style='mso-bookmark:cacheapi'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:cacheapi'>class MyCacheClass extends ADODB_Cache_File</span></pre><pre><span +style='mso-bookmark:cacheapi'>{</span></pre><pre><span style='mso-bookmark: +cacheapi'><span style='mso-tab-count:1'>         </span>var $createdir = false; // do not set this to true unless you use temp directories in cache path</span></pre><pre><span +style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'>         </span>function writecache($filename, $contents,$debug=false){...}</span></pre><pre><span +style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'>         </span>function &amp;readcache($filename, &amp;$err, $secs2cache, $rsClass){ ...}</span></pre><pre><span +style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'>         </span> :</span></pre><pre><span +style='mso-bookmark:cacheapi'>}</span></pre><pre><span style='mso-bookmark: +cacheapi'><o:p>&nbsp;</o:p></span></pre><pre><span style='mso-bookmark:cacheapi'>$DB = NewADOConnection($driver);</span></pre><pre><span +style='mso-bookmark:cacheapi'>$DB-&gt;Connect(...);<span style='mso-spacerun:yes'>  </span>## MyCacheClass created here and stored in $ADODB_CACHE global variable.</span></pre><pre><span +style='mso-bookmark:cacheapi'><o:p>&nbsp;</o:p></span></pre><pre><span +style='mso-bookmark:cacheapi'>$data = $rs-&gt;CacheGetOne($sql); ## MyCacheClass is used here for caching...</span></pre></div> + +<span style='mso-bookmark:cacheapi'></span> + +<h2><a name=pivot></a>Pivot Tables</h2> + +<p>Since ADOdb 2.30, we support the generation of SQL to create pivot tables, +also known as cross-tabulations. For further explanation read this DevShed <a +href="http://www.devshed.com/Server_Side/MySQL/MySQLWiz/">Cross-Tabulation tutorial</a>. +We assume that your database supports the SQL case-when expression. </p> + +<p>In this example, we will use the Northwind database from Microsoft. In the +database, we have a products table, and we want to analyze this table by <i>suppliers +versus product categories</i>. We will place the suppliers on each row, and +pivot on categories. So from the table on the left, we generate the pivot-table +on the right:</p> + +<div align=center> + +<table class=MsoNormalTable border=0 cellpadding=0 style='mso-cellspacing:1.5pt; + mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <div align=center> + <table class=MsoNormalTable border=1 cellpadding=0 width=142 + style='width:106.5pt;mso-cellspacing:1.5pt;mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>Supplier</i></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>Category</i></p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>supplier1</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>category1</p> + </td> + </tr> + <tr style='mso-yfti-irow:2'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>supplier2</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>category1</p> + </td> + </tr> + <tr style='mso-yfti-irow:3;mso-yfti-lastrow:yes'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>supplier2</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>category2</p> + </td> + </tr> + </table> + </div> + <p class=MsoNormal><o:p></o:p></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><span style='font-family:"Courier New"'>--&gt;</span></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <div align=center> + <table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing: + 1.5pt;mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'> + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal>&nbsp;</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>category1</i></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>category2</i></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>total</i></p> + </td> + </tr> + <tr style='mso-yfti-irow:1'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>supplier1</i></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal align=right style='text-align:right'>1</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal align=right style='text-align:right'>0</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal align=right style='text-align:right'>1</p> + </td> + </tr> + <tr style='mso-yfti-irow:2;mso-yfti-lastrow:yes'> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal><i>supplier2</i></p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal align=right style='text-align:right'>1</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal align=right style='text-align:right'>1</p> + </td> + <td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'> + <p class=MsoNormal align=right style='text-align:right'>2</p> + </td> + </tr> + </table> + </div> + <p class=MsoNormal><o:p></o:p></p> + </td> + </tr> +</table> + +</div> + +<p>The following code will generate the SQL for a cross-tabulation: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'># Query the main &quot;product&quot; table<br> +# Set the rows to SupplierName<br> +# and the columns to the values of Categories<br> +# and define the joins to link to lookup tables <br> +# &quot;categories&quot; and &quot;suppliers&quot;<br> +#<br> +<span style='mso-spacerun:yes'> </span>include &quot;adodb/pivottable.inc.php&quot;;<br> +<span style='mso-spacerun:yes'> </span>$sql = PivotTableSQL(<br> +<span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'>        </span>$gDB,<span style='mso-spacerun:yes'>                                      </span># adodb connection<br> +<span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'>        </span>'products p ,categories c ,suppliers s',<span style='mso-spacerun:yes'>   </span># tables<br> +<span style='mso-tab-count:1'>         </span>'SupplierName',<span style='mso-spacerun:yes'>                             </span># rows (multiple fields allowed)<br> +<span style='mso-tab-count:1'>         </span>'CategoryName',<span style='mso-spacerun:yes'>                            </span># column to pivot on <br> +<span style='mso-tab-count:1'>         </span>'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where<br> +);</pre></div> + +<p>This will generate the following SQL:</p> + +<p><code><span style='font-size:10.0pt'>SELECT SupplierName, </span></code><span +style='font-size:10.0pt;font-family:"Courier New"'><br> +<code>SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS +&quot;Beverages&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS +&quot;Condiments&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS +&quot;Confections&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS +&quot;Dairy Products&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS +&quot;Grains/Cereals&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS +&quot;Meat/Poultry&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS +&quot;Produce&quot;, </code><br> +<code>SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS +&quot;Seafood&quot;, </code><br> +<code>SUM(1) as Total </code><br> +<code>FROM products p ,categories c ,suppliers s WHERE p.CategoryID = +c.CategoryID and s.SupplierID= p.SupplierID </code><br> +<code>GROUP BY SupplierName</code></span></p> + +<p>You can also pivot on <i>numerical columns</i> and <i>generate totals</i> by +using ranges. This code was revised in ADODB 2.41 and is not backward +compatible. The second example shows this:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span style='mso-spacerun:yes'> </span>$sql = PivotTableSQL(<br> +<span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'>        </span>$gDB,<span style='mso-spacerun:yes'>                                       </span># adodb connection<br> +<span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'>        </span>'products p ,categories c ,suppliers s',<span style='mso-spacerun:yes'>    </span># tables<br> +<span style='mso-tab-count:1'>         </span>'SupplierName',<span style='mso-spacerun:yes'>                              </span># rows (multiple fields allowed)</pre><pre><span style='mso-spacerun:yes'>   </span>array(<span style='mso-spacerun:yes'>                       </span><span style='mso-spacerun:yes'>                </span># column ranges</pre><pre><span +style='mso-tab-count:1'>         </span>' 0 '<span style='mso-spacerun:yes'>      </span>=&gt; 'UnitsInStock &lt;= 0',</pre><pre><span +style='mso-tab-count:1'>         </span>&quot;1 to 5&quot;<span style='mso-spacerun:yes'>   </span>=&gt; '0 &lt; UnitsInStock and UnitsInStock &lt;= 5',</pre><pre><span +style='mso-tab-count:1'>         </span>&quot;6 to 10&quot;<span style='mso-spacerun:yes'>  </span>=&gt; '5 &lt; UnitsInStock and UnitsInStock &lt;= 10',</pre><pre><span +style='mso-tab-count:1'>         </span>&quot;11 to 15&quot; =&gt; '10 &lt; UnitsInStock and UnitsInStock &lt;= 15',</pre><pre><span +style='mso-tab-count:1'>         </span>&quot;16+&quot;<span style='mso-spacerun:yes'>      </span>=&gt; '15 &lt; UnitsInStock'</pre><pre><span +style='mso-tab-count:1'>         </span>),</pre><pre><span style='mso-tab-count: +1'>         </span>' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where</pre><pre><span +style='mso-tab-count:1'>         </span>'UnitsInStock',<span style='mso-spacerun:yes'>                             </span># sum this field</pre><pre><span +style='mso-tab-count:1'>         </span>'Sum '<span style='mso-spacerun:yes'>                                      </span># sum label prefix</pre><pre>);</pre></div> + +<p>Which generates: </p> + +<p><code><span style='font-size:10.0pt'>SELECT SupplierName, </span></code><span +style='font-size:10.0pt;font-family:"Courier New"'><br> +<code>SUM(CASE WHEN UnitsInStock &lt;= 0 THEN UnitsInStock ELSE 0 END) AS +&quot;Sum 0 &quot;, </code><br> +<code>SUM(CASE WHEN 0 &lt; UnitsInStock and UnitsInStock &lt;= 5 THEN +UnitsInStock ELSE 0 END) AS &quot;Sum 1 to 5&quot;,</code><br> +<code>SUM(CASE WHEN 5 &lt; UnitsInStock and UnitsInStock &lt;= 10 THEN UnitsInStock +ELSE 0 END) AS &quot;Sum 6 to 10&quot;,</code><br> +<code>SUM(CASE WHEN 10 &lt; UnitsInStock and UnitsInStock &lt;= 15 THEN +UnitsInStock ELSE 0 END) AS &quot;Sum 11 to 15&quot;, </code><br> +<code>SUM(CASE WHEN 15 &lt; UnitsInStock THEN UnitsInStock ELSE 0 END) AS +&quot;Sum 16+&quot;, </code><br> +<code>SUM(UnitsInStock) AS &quot;Sum UnitsInStock&quot;, </code><br> +<code>SUM(1) as Total,</code><br> +<code>FROM products p ,categories c ,suppliers s WHERE p.CategoryID = +c.CategoryID and s.SupplierID= p.SupplierID </code><br> +<code>GROUP BY SupplierName</code></span></p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h1>Class Reference<a name=ref></a></h1> + +<p>Function parameters with [ ] around them are optional.</p> + +<h2>Global Variables</h2> + +<h3><a name="adodb_countrecs"></a>$ADODB_COUNTRECS</h3> + +<p>If the database driver API does not support counting the number of records +returned in a SELECT statement, the function RecordCount() is emulated when the +global variable $ADODB_COUNTRECS is set to true, which is the default. We +emulate this by buffering the records, which can take up large amounts of +memory for big recordsets. Set this variable to false for the best performance. +This variable is checked every time a query is executed, so you can selectively +choose which recordsets to count.</p> + +<h3><a name="adodb_cache_dir"></a>$ADODB_CACHE_DIR</h3> + +<p>If you are using recordset caching, this is the directory to save your +recordsets in. Define this before you call any caching functions such as +CacheExecute( ). We recommend setting <i>register_globals=off</i> in php.ini if +you use this feature for security reasons.</p> + +<p>If you are using Unix and apache, you might need to set your cache directory +permissions to something similar to the following:</p> + +<p>chown -R apache /path/to/adodb/cache<br> +chgrp -R apache /path/to/adodb/cache </p> + +<h3><a name="adodb_ansi_padding_off"></a>$ADODB_ANSI_PADDING_OFF</h3> + +<p>Determines whether to right trim CHAR fields (and also VARCHAR for +ibase/firebird). Set to true to trim. Default is false. Currently works for +oci8po, ibase and firebird drivers. Added in ADOdb 4.01. </p> + +<h3><a name="adodb_lang"></a>$ADODB_LANG</h3> + +<p>Determines the language used in MetaErrorMsg(). The default is 'en', for +English. To find out what languages are supported, see the files in +adodb/lang/adodb-$lang.inc.php, where $lang is the supported langauge. </p> + +<h3><a name="adodb_fetch_mode"></a>$ADODB_FETCH_MODE</h3> + +<p>This is a global variable that determines how arrays are retrieved by recordsets. +The recordset saves this value on creation (eg. in Execute( ) or SelectLimit( +)), and any subsequent changes to $ADODB_FETCH_MODE have no affect on existing +recordsets, only on recordsets created in the future.</p> + +<p>The following constants are defined:</p> + +<p>define('ADODB_FETCH_DEFAULT',0);<br> +define('ADODB_FETCH_NUM',1);<br> +define('ADODB_FETCH_ASSOC',2);<br> +define('ADODB_FETCH_BOTH',3); </p> + +<p>An example: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_NUM;<br> +<span style='mso-tab-count:1'>         </span>$rs1 = $db-&gt;Execute('select * from table');<br> +<span style='mso-tab-count:1'>         </span>$ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_ASSOC;<br> +<span style='mso-tab-count:1'>         </span>$rs2 = $db-&gt;Execute('select * from table');<br> +<span style='mso-tab-count:1'>         </span>print_r($rs1-&gt;fields); # shows <i>array([0]=&gt;'v0',[1] =&gt;'v1')</i></pre><pre><span +style='mso-tab-count:1'>         </span>print_r($rs2-&gt;fields); # shows <i>array(['col1']=&gt;'v0',['col2'] =&gt;'v1')</i></pre></div> + +<p>As you can see in the above example, both recordsets store and use different +fetch modes based on the $ADODB_FETCH_MODE setting when the recordset was +created by Execute().</p> + +<p>If no fetch mode is predefined, the fetch mode defaults to +ADODB_FETCH_DEFAULT. The behaviour of this default mode varies from driver to +driver, so do not rely on ADODB_FETCH_DEFAULT. For portability, we recommend +sticking to ADODB_FETCH_NUM or ADODB_FETCH_ASSOC. Many drivers do not support +ADODB_FETCH_BOTH.</p> + +<p><strong>SetFetchMode Function</strong></p> + +<p>If you have multiple connection objects, and want to have different fetch +modes for each connection, then use <a href="#setfetchmode">SetFetchMode</a>. +Once this function is called for a connection object, that connection object +will ignore the global variable $ADODB_FETCH_MODE and will use the internal +fetchMode property exclusively.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;SetFetchMode(ADODB_FETCH_NUM);<br> +<span style='mso-tab-count:1'>         </span>$rs1 = $db-&gt;Execute('select * from table');<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;SetFetchMode(ADODB_FETCH_ASSOC);<br> +<span style='mso-tab-count:1'>         </span>$rs2 = $db-&gt;Execute('select * from table');<br> +<span style='mso-tab-count:1'>         </span>print_r($rs1-&gt;fields); # shows <i>array([0]=&gt;'v0',[1] =&gt;'v1')</i></pre><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>print_r($rs2-&gt;fields); # shows <i>array(['col1']=&gt;'v0',['col2'] =&gt;'v1')</i></pre></div> + +<p>To retrieve the previous fetch mode, you can use check the $db-&gt;fetchMode +property, or use the return value of SetFetchMode( ). </p> + +<p><a name="adodb_assoc_case"></a><strong>ADODB_ASSOC_CASE</strong></p> + +<p>You can control the associative fetch case for certain drivers which behave +differently. For the sybase, oci8po, mssql, odbc and ibase drivers and all +drivers derived from them, ADODB_ASSOC_CASE will by default generate recordsets +where the field name keys are lower-cased. Use the constant ADODB_ASSOC_CASE to +change the case of the keys. There are 3 possible values:</p> + +<p>0 = assoc lowercase field names. $rs-&gt;fields['orderid']<br> +1 = assoc uppercase field names. $rs-&gt;fields['ORDERID']<br> +2 = use native-case field names. $rs-&gt;fields['OrderID'] -- this is the +default since ADOdb 2.90</p> + +<p>To use it, declare it before you incldue adodb.inc.php.</p> + +<p>define('ADODB_ASSOC_CASE', 2); # use native-case for ADODB_FETCH_ASSOC<br> +include('adodb.inc.php'); </p> + +<h3><a name="force_type"></a>$ADODB_FORCE_TYPE</h3> + +<p>See the <a href="#ADODB_FORCE_TYPE">GetUpdateSQL tutorial</a>. </p> + +<h3><a name="adodb_auto_quote"></a>$ADODB_QUOTE_FIELDNAMES</h3> + +<p>Auto-quotes field names when using AutoExecute() when set to true. </p> + +<p>&nbsp;</p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h2>ADOConnection<a name=adoconnection></a></h2> + +<p>Object that performs the connection to the database, executes SQL statements +and has a set of utility functions for standardising the format of SQL +statements for issues such as concatenation and date formats.</p> + +<h3>ADOConnection Fields</h3> + +<p><b>databaseType</b>: Name of the database system we are connecting to. Eg. <b>odbc</b> +or <b>mssql</b> or <b>mysql</b>.</p> + +<p><b>dataProvider</b>: The underlying mechanism used to connect to the +database. Normally set to <b>native</b>, unless using <b>odbc</b> or <b>ado</b>.</p> + +<p><b>host: </b>Name of server or data source name (DSN) to connect to.</p> + +<p><b>database</b>: Name of the database or to connect to. If ado is used, it +will hold the ado data provider.</p> + +<p><b>user</b>: Login id to connect to database. Password is not saved for +security reasons.</p> + +<p><b>raiseErrorFn</b>: Allows you to define an error handling function. See +adodb-errorhandler.inc.php for an example.</p> + +<p><b>debug</b>: Set to <i>true</i> to make debug statements to appear.</p> + +<p><b>concat_operator</b>: Set to '+' or '||' normally. The operator used to +concatenate strings in SQL. Used by the <b><a href="#concat">Concat</a></b> +function.</p> + +<p><b>fmtDate</b>: The format used by the <b><a href="#dbdate">DBDate</a></b> +function to send dates to the database. is '#Y-m-d#' for Microsoft Access, and +''Y-m-d'' for MySQL.</p> + +<p><b>fmtTimeStamp: </b>The format used by the <b><a href="#dbtimestamp">DBTimeStamp</a></b> +function to send timestamps to the database. </p> + +<p><b>true</b>: The value used to represent true.Eg. '.T.'. for Foxpro, '1' for +Microsoft SQL.</p> + +<p><b>false: </b>The value used to represent false. Eg. '.F.'. for Foxpro, '0' +for Microsoft SQL.</p> + +<p><b>replaceQuote</b>: The string used to escape quotes. Eg. double +single-quotes for Microsoft SQL, and backslash-quote for MySQL. Used by <a +href="#qstr">qstr</a>.</p> + +<p><b>autoCommit</b>: indicates whether automatic commit is enabled. Default is +true.</p> + +<p><b>charSet</b>: set the default charset to use. Currently only +interbase/firebird supports this.</p> + +<p><b>dialect</b>: set the default sql dialect to use. Currently only interbase/firebird +supports this.</p> + +<p><b>role</b>: set the role. Currently only interbase/firebird supports this.</p> + +<p><b>metaTablesSQL</b>: SQL statement to return a list of available tables. +Eg. <i>SHOW TABLES</i> in MySQL.</p> + +<p><b>genID</b>: The latest id generated by GenID() if supported by the +database.</p> + +<p><b>cacheSecs</b>: The number of seconds to cache recordsets if +CacheExecute() or CacheSelectLimit() omit the $secs2cache parameter. Defaults +to 60 minutes.</p> + +<p><b>sysDate</b>: String that holds the name of the database function to call +to get the current date. Useful for inserts and updates.</p> + +<p><b>sysTimeStamp</b>: String that holds the name of the database function to +call to get the current timestamp/datetime value.</p> + +<p><b>leftOuter</b>: String that holds operator for left outer join, if known. +Otherwise set to false.</p> + +<p><b>rightOuter</b>: String that holds operator for left outer join, if known. +Otherwise set to false.</p> + +<p><b>ansiOuter</b>: Boolean that if true indicates that ANSI style outer joins +are permitted. Eg. <i>select * from table1 left join table2 on p1=p2.</i></p> + +<p><b>connectSID</b>: Boolean that indicates whether to treat the $database +parameter in connects as the SID for the oci8 driver. Defaults to false. Useful +for Oracle 8.0.5 and earlier.</p> + +<p><b>autoRollback</b>: Persistent connections are auto-rollbacked in PConnect( +) if this is set to true. Default is false.</p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h3>ADOConnection Main Functions</h3> + +<p><b>ADOConnection( )</b></p> + +<p>Constructor function. Do not call this directly. Use ADONewConnection( ) +instead.</p> + +<p><b>Connect<a name=connect></a>($host,[$user],[$password],[$database])</b></p> + +<p>Non-persistent connect to data source or server $<b>host</b>, using userid $<b>user +</b>and password $<b>password</b>. If the server supports multiple databases, +connect to database $<b>database</b>. </p> + +<p>Returns true/false depending on connection success. Since 4.23, null is +returned if the extension is not loaded.</p> + +<p><st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City> Note: If +you are using a Microsoft ADO and not OLEDB, you can set the $database +parameter to the OLEDB data provider you are using.</p> + +<p>PostgreSQL: An alternative way of connecting to the database is to pass the +standard PostgreSQL connection string in the first parameter $host, and the +other parameters will be ignored.</p> + +<p>For Oracle and Oci8, there are two ways to connect. First is to use the TNS +name defined in your local tnsnames.ora (or ONAMES or HOSTNAMES). Place the +name in the $database field, and set the $host field to false. Alternatively, +set $host to the server, and $database to the database SID, this bypassed +tnsnames.ora. </p> + +<p>Examples: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span># $oraname in tnsnames.ora/ONAMES/HOSTNAMES<br> +<span style='mso-spacerun:yes'> </span>$conn-&gt;Connect(false, 'scott', 'tiger', $oraname); <br> +<span style='mso-spacerun:yes'> </span>$conn-&gt;Connect('server:1521', 'scott', 'tiger', 'ServiceName'); # bypass tnsnames.ora</pre></div> + +<p>There are many examples of connecting to a database. See <a +href="#connect_ex">Connection Examples</a> for many examples. </p> + +<p><b>PConnect<a name=pconnect></a>($host,[$user],[$password],[$database])</b></p> + +<p>Persistent connect to data source or server $<b>host</b>, using userid $<b>user</b> +and password $<b>password</b>. If the server supports multiple databases, +connect to database $<b>database</b>.</p> + +<p>We now perform a rollback on persistent connection for selected databases +since 2.21, as advised in the PHP manual. See change log or source code for +which databases are affected. </p> + +<p>Returns true/false depending on connection. Since 4.23, 0 is returned if the +extension is not loaded. See Connect( ) above for more info.</p> + +<p>Since ADOdb 2.21, we also support autoRollback. If you set:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span>$conn = &amp;NewADOConnection('mysql');<br> +<span style='mso-spacerun:yes'> </span>$conn-&gt;autoRollback = true; # default is false<br> +<span style='mso-spacerun:yes'> </span>$conn-&gt;PConnect(...); # rollback here</pre></div> + +<p>Then when doing a persistent connection with PConnect( ), ADOdb will perform +a rollback first. This is because it is documented that PHP is not guaranteed +to rollback existing failed transactions when persistent connections are used. +This is implemented in Oracle, MySQL, PgSQL, MSSQL, ODBC currently. </p> + +<p>Since ADOdb 3.11, you can force non-persistent connections even if PConnect +is called by defining the constant ADODB_NEVER_PERSIST before you call +PConnect. </p> + +<p>Since 4.23, null is returned if the extension is not loaded. </p> + +<p><b>NConnect<a name=nconnect></a>($host,[$user],[$password],[$database])</b></p> + +<p>Always force a new connection. In contrast, PHP sometimes reuses connections +when you use Connect() or PConnect(). Currently works only on mysql (PHP 4.3.0 +or later), postgresql and oci8-derived drivers. For other drivers, NConnect() +works like Connect().</p> + +<p><b>IsConnected( )</b><a name=isconnected></a></p> + +<p>Returns true if connected to database. Added in 4.53. </p> + +<p><b>Execute<a name=execute></a>($sql,$inputarr=false)</b></p> + +<p>Execute SQL statement $<b>sql</b> and return derived class of ADORecordSet +if successful. Note that a record set is always returned on success, even if we +are executing an insert or update statement. You can also pass in $sql a +statement prepared in <a href="#prepare">Prepare()</a>.</p> + +<p>Returns derived class of ADORecordSet. Eg. if connecting via mysql, then +ADORecordSet_mysql would be returned. False is returned if there was an error +in executing the sql.</p> + +<p>The $inputarr parameter can be used for binding variables to parameters. +Below is an Oracle example:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span>$conn-&gt;Execute(&quot;SELECT * FROM TABLE WHERE COND=:val&quot;, array('val'=&gt; $val));<br> +<span style='mso-spacerun:yes'> </span></pre></div> + +<p>Another example, using ODBC,which uses the ? convention:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>  </span>$conn-&gt;Execute(&quot;SELECT * FROM TABLE WHERE COND=?&quot;, array($val));</pre></div> + +<p class=MsoNormal><a name=binding></a><i>Binding variables</i></p> + +<p>Variable binding speeds the compilation and caching of SQL statements, +leading to higher performance. Currently Oracle, Interbase and ODBC supports +variable binding. Interbase/ODBC style ? binding is emulated in databases that +do not support binding. Note that you do not have to quote strings if you use +binding. </p> + +<p>Variable binding in the odbc, interbase and oci8po drivers. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute('select * from table where val=?', array('10'));</pre></div> + +<p class=MsoNormal>Variable binding in the oci8 driver: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute('select name from table where val=:key', <br> +<span style='mso-spacerun:yes'>  </span>array('key' =&gt; 10));</pre></div> + +<p class=MsoNormal><a name=bulkbind></a><i>Bulk binding</i> </p> + +<p>Since ADOdb 3.80, we support bulk binding in Execute(), in which you pass in +a 2-dimensional array to be bound to an INSERT/UPDATE or DELETE statement. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$arr = array(<br> +<span style='mso-tab-count:1'>         </span>array('Ahmad',32),<br> +<span style='mso-tab-count:1'>         </span>array('Zulkifli', 24),<br> +<span style='mso-tab-count:1'>         </span>array('Rosnah', 21)<br> +<span style='mso-tab-count:1'>         </span>);<br> +$ok = $db-&gt;Execute('insert into table (name,age) values (?,?)',$arr);</pre></div> + +<p>This provides very high performance as the SQL statement is prepared first. +The prepared statement is executed repeatedly for each array row until all rows +are completed, or until the first error. Very useful for importing data. </p> + +<p><b>CacheExecute<a name=cacheexecute></a>([$secs2cache,]$sql,$inputarr=false)</b></p> + +<p>Similar to Execute, except that the recordset is cached for $secs2cache +seconds in the $ADODB_CACHE_DIR directory, and $inputarr only accepts +1-dimensional arrays. If CacheExecute() is called again with the same $sql, +$inputarr, and also the same database, same userid, and the cached recordset +has not expired, the cached recordset is returned. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>  </span>include('adodb.inc.php'); <br> +<span style='mso-spacerun:yes'>  </span>include('tohtml.inc.php');<br> +<span style='mso-spacerun:yes'>  </span>$ADODB_<b>CACHE_DIR</b> = '/usr/local/ADOdbcache';<br> +<span style='mso-spacerun:yes'>  </span>$conn = &amp;ADONewConnection('mysql'); <br> +<span style='mso-spacerun:yes'>  </span>$conn-&gt;PConnect('localhost','userid','password','database');<br> +<span style='mso-spacerun:yes'>  </span>$rs = $conn-&gt;<b>CacheExecute</b>(15, 'select * from table'); # cache 15 secs<br> +<span style='mso-spacerun:yes'>  </span>rs2html($rs); /* recordset to html table */<span style='mso-spacerun:yes'>  </span></pre></div> + +<p>Alternatively, since ADOdb 1.80, the $secs2cache parameter is optional:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect(...);<br> +<span style='mso-spacerun:yes'>   </span><span style='mso-tab-count:1'>      </span>$conn-&gt;cacheSecs = 3600*24; // cache 24 hours<br> +<span style='mso-tab-count:1'>         </span>$rs = $conn-&gt;CacheExecute('select * from table');</pre></div> + +<p class=MsoNormal>If $secs2cache is omitted, we use the value in +$connection-&gt;cacheSecs (default is 3600 seconds, or 1 hour). Use +CacheExecute() only with SELECT statements. </p> + +<p>Performance note: I have done some benchmarks and found that they vary so +greatly that it's better to talk about when caching is of benefit. When your +database server is <i>much slower </i>than your Web server or the database is <i>very +overloaded </i>then ADOdb's caching is good because it reduces the load on your +database server. If your database server is lightly loaded or much faster than +your Web server, then caching could actually reduce performance. </p> + +<p><b>ExecuteCursor<a name=executecursor></a>($sql,$cursorName='rs',$parameters=false)</b></p> + +<p>Execute an Oracle stored procedure, and returns an Oracle REF cursor +variable as a regular ADOdb recordset. Does not work with any other database +except oci8. Thanks to Robert Tuttle for the design. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>    </span>$db = ADONewConnection(&quot;oci8&quot;); <br> +<span style='mso-spacerun:yes'>    </span>$db-&gt;Connect(&quot;foo.com:1521&quot;, &quot;uid&quot;, &quot;pwd&quot;, &quot;FOO&quot;); <br> +<span style='mso-spacerun:yes'>    </span>$rs = $db-&gt;ExecuteCursor(&quot;begin :cursorvar := getdata(:param1); end;&quot;, <br> +<span style='mso-tab-count:5'>                                            </span>'cursorvar',<br> +<span style='mso-tab-count:5'>                                            </span>array('param1'=&gt;10)); <br> +<span style='mso-spacerun:yes'>    </span># $rs is now just like any other ADOdb recordset object<br> +<span style='mso-spacerun:yes'>    </span>rs2html($rs);</pre></div> + +<p>ExecuteCursor() is a helper function that does the following internally: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$stmt = $db-&gt;Prepare(&quot;begin :cursorvar := getdata(:param1); end;&quot;, true); <br> +<span style='mso-tab-count:1'>         </span>$db-&gt;Parameter($stmt, $cur, 'cursorvar', false, -1, OCI_B_CURSOR);<br> +<span style='mso-tab-count:1'>         </span>$rs = $db-&gt;Execute($stmt,$bindarr);</pre></div> + +<p>ExecuteCursor only accepts 1 out parameter. So if you have 2 out parameters, +use: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$vv = 'A%';<br> +<span style='mso-tab-count:1'>         </span>$stmt = $db-&gt;PrepareSP(&quot;BEGIN list_tabs(:crsr,:tt); END;&quot;);<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;OutParameter($stmt, $cur, 'crsr', -1, OCI_B_CURSOR);<br> +<span style='mso-tab-count:1'>         </span>$db-&gt;OutParameter($stmt, $vv, 'tt', 32); # return varchar(32)<br> +<span style='mso-tab-count:1'>         </span>$arr = $db-&gt;GetArray($stmt);<br> +<span style='mso-tab-count:1'>         </span>print_r($arr);<br> +<span style='mso-tab-count:1'>         </span>echo &quot; val = $vv&quot;; ## outputs 'TEST'</pre></div> + +<p class=MsoNormal>for the following PL/SQL: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;<br> +<br> +<span style='mso-tab-count:1'>         </span>PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS<br> +<span style='mso-tab-count:1'>         </span>BEGIN<br> +<span style='mso-tab-count:2'>                 </span>OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;<br> +<span style='mso-tab-count:2'>                 </span>tablenames := 'TEST';<br> +<span style='mso-tab-count:1'>         </span>END list_tabs;</pre></div> + +<p><b>SelectLimit<a name=selectlimit></a>($sql,$numrows=-1,$offset=-1,$inputarr=false)</b></p> + +<p>Returns a recordset if successful. Returns false otherwise. Performs a +select statement, simulating PostgreSQL's SELECT statement, LIMIT $numrows +OFFSET $offset clause.</p> + +<p>In PostgreSQL, SELECT * FROM TABLE LIMIT 3 will return the first 3 records +only. The equivalent is <code><span style='font-size:10.0pt'>$connection-&gt;SelectLimit('SELECT +* FROM TABLE',3)</span></code>. This functionality is simulated for databases +that do not possess this feature.</p> + +<p>And SELECT * FROM TABLE LIMIT 3 OFFSET 2 will return records 3, 4 and 5 (eg. +after record 2, return 3 rows). The equivalent in ADOdb is <code><span +style='font-size:10.0pt'>$connection-&gt;SelectLimit('SELECT * FROM TABLE',3,2)</span></code>.</p> + +<p>Note that this is the <i>opposite</i> of MySQL's LIMIT clause. You can also +set <code><span style='font-size:10.0pt'>$connection-&gt;SelectLimit('SELECT * +FROM TABLE',-1,10)</span></code> to get rows 11 to the last row.</p> + +<p>The last parameter $inputarr is for databases that support variable binding +such as Oracle oci8. This substantially reduces SQL compilation overhead. Below +is an Oracle example:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span>$conn-&gt;SelectLimit(&quot;SELECT * FROM TABLE WHERE COND=:val&quot;, 100,-1,array('val'=&gt; $val));<br> +<span style='mso-spacerun:yes'> </span></pre></div> + +<p>The oci8po driver (oracle portable driver) uses the more standard bind +variable of ?: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span>$conn-&gt;SelectLimit(&quot;SELECT * FROM TABLE WHERE COND=?&quot;, 100,-1,array('val'=&gt; $val));</pre></div> + +<p>Ron Wilson reports that SelectLimit does not work with UNIONs. </p> + +<p><b>CacheSelectLimit<a name=cacheselectlimit></a>([$secs2cache,] $sql, +$numrows=-1,$offset=-1,$inputarr=false)</b></p> + +<p>Similar to SelectLimit, except that the recordset returned is cached for +$secs2cache seconds in the $ADODB_CACHE_DIR directory. </p> + +<p>Since 1.80, $secs2cache has been optional, and you can define the caching +time in $connection-&gt;cacheSecs.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;Connect(...);<br> +<span style='mso-spacerun:yes'>   </span>$conn-&gt;cacheSecs = 3600*24; // cache 24 hours<br> +<span style='mso-tab-count:1'>         </span>$rs = $conn-&gt;CacheSelectLimit('select * from table',10);</pre></div> + +<p><b>CacheFlush<a name=cacheflush></a>($sql=false,$inputarr=false)</b></p> + +<p>Flush (delete) any cached recordsets for the SQL statement $sql in +$ADODB_CACHE_DIR. </p> + +<p>If no parameter is passed in, then all adodb_*.cache files are deleted. </p> + +<p>CacheSelectLimit() rewrites the SQL query, so you won't be able to pass the +SQL to CacheFlush. In this case, to flush the cached SQL recordset returned by +CacheSelectLimit(), set $secs2cache to -1: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;CacheSelectLimit(-1, $sql, $nrows);</pre></div> + +<p>If you want to flush all cached recordsets manually, execute the following +PHP code (works only under Unix): <br> +<code><span style='font-size:10.0pt'>&nbsp; system(&quot;rm -f `find +&quot;.$ADODB_CACHE_DIR.&quot; -name adodb_*.cache`&quot;);</span></code></p> + +<p>For general cleanup of all expired files, you should use <a +href="http://www.superscripts.com/tutorial/crontab.html">crontab</a> on Unix, +or at.exe on Windows, and a shell script similar to the following:<span +style='font-family:"Courier New"'><br> +#------------------------------------------------------ <br> +# This particular example deletes files in the TMPPATH <br> +# directory with the string &quot;.cache&quot; in their name that <br> +# are more than 7 days old. <br> +#------------------------------------------------------ <br> +AGED=7 <br> +find ${TMPPATH} -mtime +$AGED | grep &quot;\.cache&quot; | xargs rm -f </span></p> + +<p><b>MetaError<a name=metaerror></a>($errno=false)</b></p> + +<p>Returns a virtualized error number, based on PEAR DB's error number system. +You might need to include adodb-error.inc.php before you call this function. +The parameter $errno is the native error number you want to convert. If you do +not pass any parameter, MetaError will call ErrorNo() for you and convert it. +If the error number cannot be virtualized, MetaError will return -1 (DB_ERROR).</p> + +<p><b>MetaErrorMsg<a name=metaerrormsg></a>($errno)</b></p> + +<p>Pass the error number returned by MetaError() for the equivalent textual +error message.</p> + +<p><b>ErrorMsg<a name=errormsg></a>()</b></p> + +<p>Returns the last status or error message. The error message is reset after +every call to Execute(). </p> + +<p>This can return a string even if no error occurs. In general you do not need +to call this function unless an ADOdb function returns false on an error. </p> + +<p>Note: If <b>debug</b> is enabled, the SQL error message is always displayed +when the <b>Execute</b> function is called.</p> + +<p><b>ErrorNo<a name=errorno></a>()</b></p> + +<p>Returns the last error number. The error number is reset after every call to +Execute(). If 0 is returned, no error occurred. </p> + +<p>Note that old versions of PHP (pre 4.0.6) do not support error number for +ODBC. In general you do not need to call this function unless an ADOdb function +returns false on an error.</p> + +<p><b>IgnoreErrors<a name=ignoreerrors></a>($saveErrHandlers)</b></p> + +<p>Allows you to ignore errors so that StartTrans()/CompleteTrans() is not +affected, nor is the default error handler called if an error occurs. Useful +when you want to check if a field or table exists in a database without +invoking an error if it does not exist. </p> + +<p>Usage: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$saveErrHandlers = $conn-&gt;IgnoreErrors();</pre><pre>$rs = $conn-&gt;Execute(&quot;select field from some_table_that_might_not_exist&quot;);</pre><pre>$conn-&gt;IgnoreErrors($saveErrHandlers);</pre></div> + +<p>Warning: do not call StartTrans()/CompleteTrans() inside a code block that +is using IgnoreErrors(). </p> + +<p><b>SetFetchMode<a name=setfetchmode></a>($mode)</b></p> + +<p>Sets the current fetch mode for the connection and stores it in +$db-&gt;fetchMode. Legal modes are ADODB_FETCH_ASSOC and ADODB_FETCH_NUM. For +more info, see <a href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>.</p> + +<p>Returns the previous fetch mode, which could be false if SetFetchMode( ) has +not been called before.</p> + +<p><b>CreateSequence<a name=createseq></a>($seqName = 'adodbseq',$startID=1)</b></p> + +<p>Create a sequence. The next time GenID( ) is called, the value returned will +be $startID. Added in 2.60. </p> + +<p><b>DropSequence<a name=dropseq></a>($seqName = 'adodbseq')</b></p> + +<p>Delete a sequence. Added in 2.60. </p> + +<p><b>GenID<a name=genid></a>($seqName = 'adodbseq',$startID=1)</b></p> + +<p>Generate a sequence number . Works for interbase, mysql, postgresql, oci8, +oci8po, mssql, ODBC based (access,vfp,db2,etc) drivers currently. Uses $seqName +as the name of the sequence. GenID() will automatically create the sequence for +you if it does not exist (provided the userid has permission to do so). +Otherwise you will have to create the sequence yourself. </p> + +<p>If your database driver emulates sequences, the name of the table is the +sequence name. The table has one column, &quot;id&quot; which should be of type +integer, or if you need something larger - numeric(16). </p> + +<p>For ODBC and databases that do not support sequences natively (eg mssql, +mysql), we create a table for each sequence. If the sequence has not been +defined earlier, it is created with the starting value set in $startID.</p> + +<p>Note that the mssql driver's GenID() before 1.90 used to generate 16 byte +GUID's.</p> + +<p><b>UpdateBlob<a name=updateblob></a>($table,$column,$val,$where)</b></p> + +<p class=MsoNormal>Allows you to store a blob (in $val) into $table into +$column in a row at $where. </p> + +<p>Usage: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span># for oracle<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())');<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span># non oracle databases<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');</pre></div> + +<p>Returns true if succesful, false otherwise. Supported by MySQL, PostgreSQL, +Oci8, Oci8po and Interbase drivers. Other drivers might work, depending on the +state of development.</p> + +<p>Note that when an Interbase blob is retrieved using SELECT, it still needs +to be decoded using $connection-&gt;DecodeBlob($blob); to derive the original +value in versions of PHP before 4.1.0. </p> + +<p>For PostgreSQL, you can store your blob using blob oid's or as a bytea field. +You can use bytea fields but not blob oid's currently with UpdateBlob( ). +Conversely UpdateBlobFile( ) supports oid's, but not bytea data.<br> +<br> +If you do not pass in an oid, then UpdateBlob() assumes that you are storing in +bytea fields. </p> + +<p>If you do not have any blob fields, you can improve you can improve general +SQL query performance by disabling blob handling with +$connection-&gt;disableBlobs = true. </p> + +<p><b>UpdateClob<a name=updateclob></a>($table,$column,$val,$where)</b></p> + +<p class=MsoNormal>Allows you to store a clob (in $val) into $table into +$column in a row at $where. Similar to UpdateBlob (see above), but for +Character Large OBjects. </p> + +<p>Usage: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span># for oracle<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())');<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span># non oracle databases<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');</pre></div> + +<p><b>UpdateBlobFile<a name=updateblobfile></a>($table,$column,$path,$where,$blobtype='BLOB')</b></p> + +<p>Similar to UpdateBlob, except that we pass in a file path to where the blob +resides. </p> + +<p>For PostgreSQL, if you are using blob oid's, use this interface. This +interface does not support bytea fields. </p> + +<p>Returns true if successful, false otherwise. </p> + +<p><b>BlobEncode<a name=blobencode id=blobencode></a>($blob)</b> </p> + +<p>Some databases require blob's to be encoded manually before upload. Note if +you use UpdateBlob( ) or UpdateBlobFile( ) the conversion is done automatically +for you and you do not have to call this function. For PostgreSQL, currently, +BlobEncode() can only be used for bytea fields. </p> + +<p>Returns the encoded blob value. </p> + +<p>Note that there is a connection property called <em>blobEncodeType</em> +which has 3 legal values: </p> + +<p>false - no need to perform encoding or decoding.<br> +'I' - blob encoding required, and returned encoded blob is a numeric value (no +need to quote).<br> +'C' - blob encoding required, and returned encoded blob is a character value +(requires quoting). </p> + +<p>This is purely for documentation purposes, so that programs that accept +multiple database drivers know what is the right thing to do when processing +blobs. </p> + +<p><strong>BlobDecode<a name=blobdecode></a>($blob, $maxblobsize = false)</strong> +</p> + +<p>Some databases require blob's to be decoded manually after doing a select +statement. If the database does not require decoding, then this function will +return the blob unchanged. Currently BlobDecode is only required for one +database, PostgreSQL, and only if you are using blob oid's (if you are using +bytea fields, we auto-decode for you). The default maxblobsize is set in +$connection-&gt;maxblobsize, which is set to 256K in adodb 4.54. </p> + +<p>In ADOdb 4.54 and later, the blob is the return value. In earlier versions, +the blob data is sent to stdout.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute(&quot;select bloboid from postgres_table where id=$key&quot;);<br> +$blob = $db-&gt;BlobDecode( reset($rs-&gt;fields) );</pre></div> + +<p><b>Replace<a name=replace></a>($table, $arrFields, +$keyCols,$autoQuote=false)</b></p> + +<p>Try to update a record, and if the record is not found, an insert statement +is generated and executed. Returns 0 on failure, 1 if update statement worked, +2 if no record was found and the insert was executed successfully. This differs +from MySQL's replace which deletes the record and inserts a new record. This +also means you cannot update the primary key. The only exception to this is +Interbase and its derivitives, which uses delete and insert because of some +Interbase API limitations. </p> + +<p>The parameters are $table which is the table name, the $arrFields which is +an associative array where the keys are the field names, and $keyCols is the +name of the primary key, or an array of field names if it is a compound key. If +$autoQuote is set to true, then Replace() will quote all values that are +non-numeric; auto-quoting will not quote nulls. Note that auto-quoting will not +work if you use SQL functions or operators. </p> + +<p>Examples: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'># single field primary key<br> +$ret = $db-&gt;Replace('atable', <br> +<span style='mso-tab-count:1'>         </span>array('id'=&gt;1000,'firstname'=&gt;'Harun','lastname'=&gt;'Al-Rashid'),<br> +<span style='mso-tab-count:1'>         </span>'id',$autoquote = true);<span +style='mso-tab-count:1'>  </span><br> +# generates UPDATE atable SET firstname='Harun',lastname='Al-Rashid' WHERE id=1000<br> +# or INSERT INTO atable (id,firstname,lastname) VALUES (1000,'Harun','Al-Rashid')<br> +<br> +# compound key<br> +$ret = $db-&gt;Replace('atable2', <br> +<span style='mso-tab-count:1'>         </span>array('firstname'=&gt;'Harun','lastname'=&gt;'Al-Rashid', 'age' =&gt; 33, 'birthday' =&gt; 'null'),<br> +<span style='mso-tab-count:1'>         </span>array('lastname','firstname'),<br> +<span style='mso-tab-count:1'>         </span>$autoquote = true);<br> +<br> +# no auto-quoting<br> +$ret = $db-&gt;Replace('atable2', <br> +<span style='mso-tab-count:1'>         </span>array('firstname'=&gt;&quot;'Harun'&quot;,'lastname'=&gt;&quot;'Al-Rashid'&quot;, 'age' =&gt; 'null'),<br> +<span style='mso-tab-count:1'>         </span>array('lastname','firstname'));<span +style='mso-tab-count:1'>    </span></pre></div> + +<p><b>AutoExecute<a name=autoexecute></a>($table, $arrFields, $mode, +$where=false, $forceUpdate=true,$magicq=false)</b></p> + +<p>Since ADOdb 4.56, you can automatically generate and execute INSERTs and +UPDATEs on a given table with this function, which is a wrapper for +GetInsertSQL() and GetUpdateSQL(). </p> + +<p>AutoExecute() inserts or updates $table given an array of $arrFields, where +the keys are the field names and the array values are the field values to +store. Note that there is some overhead because the table is first queried to +extract key information before the SQL is generated. We generate an INSERT or +UPDATE based on $mode (see below). </p> + +<p>Legal values for $mode are </p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l5 level1 lfo9;tab-stops:list 36.0pt'>'INSERT' or 1 or DB_AUTOQUERY_INSERT + </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l5 level1 lfo9;tab-stops:list 36.0pt'>'UPDATE' or 2 or + DB_AUTOQUERY_UPDATE </li> +</ul> + +<p>You have to define the constants DB_AUTOQUERY_UPDATE and DB_AUTOQUERY_INSERT +yourself or include adodb-pear.inc.php. </p> + +<p>The $where clause is required if $mode == 'UPDATE'. If $forceUpdate=false +then we will query the database first and check if the field value returned by +the query matches the current field value; only if they differ do we update +that field. </p> + +<p>Returns true on success, false on error. </p> + +<p>An example of its use is: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$record[&quot;firstName&quot;] = &quot;Carol&quot;;</pre><pre>$record[&quot;lasTname&quot;] = &quot;Smith&quot;; </pre><pre>$conn-&gt;AutoExecute($table,$record,'INSERT');</pre><pre># executes <i>&quot;INSERT INTO $table (firstName,lasTname) values ('Carol',Smith')&quot;</i>;</pre><pre><o:p>&nbsp;</o:p></pre><pre>$record[&quot;firstName&quot;] = &quot;Carol&quot;;</pre><pre>$record[&quot;lasTname&quot;] = &quot;Jones&quot;; </pre><pre>$conn-&gt;AutoExecute($table,$record,'UPDATE', &quot;lastname like 'Sm%'&quot;);</pre><pre># executes <i>&quot;UPDATE $table SET firstName='Carol',lasTname='Jones' WHERE lastname like 'Sm%'&quot;</i>;</pre></div> + +<p>Note: One of the strengths of ADOdb's AutoExecute() is that only valid field +names for $table are updated. If $arrFields contains keys that are invalid +field names for $table, they are ignored. There is some overhead in doing this +as we have to query the database to get the field names, but given that you are +not directly coding the SQL yourself, you probably aren't interested in speed +at all, but convenience. </p> + +<p>Since 4.62, the table name to be used can be overridden by setting +$rs-&gt;tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called. </p> + +<p>Since 4.94, setting the global variable $ADODB_QUOTE_FIELDNAMES to true will +force field names to be auto-quoted in AutoExecute(), GetInsertSQL() and +GetUpdateSQL(). </p> + +<p><b>GetUpdateSQL<a name=getupdatesql></a>(&amp;$rs, $arrFields, +$forceUpdate=false,$magicq=false, $force=null)</b></p> + +<p>Generate SQL to update a table given a recordset $rs, and the modified +fields of the array $arrFields (which must be an associative array holding the +column names and the new values) are compared with the current recordset. If +$forceUpdate is true, then we also generate the SQL even if $arrFields is +identical to $rs-&gt;fields. Requires the recordset to be associative. $magicq +is used to indicate whether magic quotes are enabled (see qstr()). The field +names in the array are case-insensitive.</p> + +<p>Since 4.52, we allow you to pass the $force type parameter, and this +overrides the <a href="#ADODB_FORCE_TYPE">$ADODB_FORCE_TYPE</a> global +variable. </p> + +<p>Since 4.62, the table name to be used can be overridden by setting +$rs-&gt;tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called. </p> + +<p><b>GetInsertSQL<a name=getinsertsql></a>(&amp;$rs, $arrFields,$magicq=false,$force_type=false)</b></p> + +<p>Generate SQL to insert into a table given a recordset $rs. Requires the +query to be associative. $magicq is used to indicate whether magic quotes are +enabled (for qstr()). The field names in the array are case-insensitive.</p> + +<p>Since 2.42, you can pass a table name instead of a recordset into +GetInsertSQL (in $rs), and it will generate an insert statement for that table. +</p> + +<p>Since 4.52, we allow you to pass the $force_type parameter, and this +overrides the <a href="#ADODB_FORCE_TYPE">$ADODB_FORCE_TYPE</a> global +variable. </p> + +<p>Since 4.62, the table name to be used can be overridden by setting +$rs-&gt;tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is +called. </p> + +<p><b>PageExecute<a name=pageexecute></a>($sql, $nrows, $page, $inputarr=false)</b> +</p> + +<p>Used for pagination of recordset. $page is 1-based. See <a href="#ex8">Example +8</a>.</p> + +<p><b>CachePageExecute<a name=cachepageexecute></a>($secs2cache, $sql, $nrows, +$page, $inputarr=false)</b> </p> + +<p>Used for pagination of recordset. $page is 1-based. See <a href="#ex8">Example +8</a>. Caching version of PageExecute.</p> + +<p><b>Close<a name=close></a>( )</b></p> + +<p>Close the database connection. PHP4 proudly states that we no longer have to +clean up at the end of the connection because the reference counting mechanism +of PHP4 will automatically clean up for us.</p> + +<p><b>StartTrans<a name=starttrans></a>( )</b></p> + +<p>Start a monitored transaction. As SQL statements are executed, ADOdb will +monitor for SQL errors, and if any are detected, when CompleteTrans() is +called, we auto-rollback. </p> + +<p>To understand why StartTrans() is superior to BeginTrans(), let us examine a +few ways of using BeginTrans(). The following is the wrong way to use +transactions: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$DB-&gt;BeginTrans();<br> +$DB-&gt;Execute(&quot;update table1 set val=$val1 where id=$id&quot;);<br> +$DB-&gt;Execute(&quot;update table2 set val=$val2 where id=$id&quot;);<br> +$DB-&gt;CommitTrans();</pre></div> + +<p>because you perform no error checking. It is possible to update table1 and +for the update on table2 to fail. Here is a better way: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$DB-&gt;BeginTrans();<br> +$ok = $DB-&gt;Execute(&quot;update table1 set val=$val1 where id=$id&quot;);<br> +if ($ok) $ok = $DB-&gt;Execute(&quot;update table2 set val=$val2 where id=$id&quot;);<br> +if ($ok) $DB-&gt;CommitTrans();<br> +else $DB-&gt;RollbackTrans();</pre></div> + +<p>Another way is (since ADOdb 2.0): </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$DB-&gt;BeginTrans();<br> +$ok = $DB-&gt;Execute(&quot;update table1 set val=$val1 where id=$id&quot;);<br> +if ($ok) $ok = $DB-&gt;Execute(&quot;update table2 set val=$val2 where id=$id&quot;);<br> +$DB-&gt;CommitTrans($ok);</pre></div> + +<p>Now it is a headache monitoring $ok all over the place. StartTrans() is an +improvement because it monitors all SQL errors for you. This is particularly +useful if you are calling black-box functions in which SQL queries might be +executed. Also all BeginTrans, CommitTrans and RollbackTrans calls inside a +StartTrans block will be disabled, so even if the black box function does a +commit, it will be ignored. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$DB-&gt;StartTrans();<br> +CallBlackBox();<br> +$DB-&gt;Execute(&quot;update table1 set val=$val1 where id=$id&quot;);<br> +$DB-&gt;Execute(&quot;update table2 set val=$val2 where id=$id&quot;);<br> +$DB-&gt;CompleteTrans();</pre></div> + +<p>Note that a StartTrans blocks are nestable, the inner blocks are ignored. </p> + +<p><b>CompleteTrans<a name=completetrans></a>($autoComplete=true)</b></p> + +<p>Complete a transaction called with StartTrans(). This function monitors for +SQL errors, and will commit if no errors have occured, otherwise it will +rollback. Returns true on commit, false on rollback. If the parameter +$autoComplete is true monitor sql errors and commit and rollback as +appropriate. Set $autoComplete to false to force rollback even if no SQL error +detected. </p> + +<p><b>FailTrans<a name=failtrans></a>( )</b></p> + +<p>Fail a transaction started with StartTrans(). The rollback will only occur +when CompleteTrans() is called. </p> + +<p><b>HasFailedTrans<a name=hasfailedtrans></a>( )</b></p> + +<p>Check whether smart transaction has failed, eg. returns true if there was an +error in SQL execution or FailTrans() was called. If not within smart +transaction, returns false. </p> + +<p><b>BeginTrans<a name=begintrans></a>( )</b></p> + +<p>Begin a transaction. Turns off autoCommit. Returns true if successful. Some +databases will always return false if transaction support is not available. Any +open transactions will be rolled back when the connection is closed. Among the +databases that support transactions are Oracle, PostgreSQL, Interbase, MSSQL, +certain versions of MySQL, DB2, Informix, Sybase, etc.</p> + +<p>Note that <a href="#starttrans">StartTrans()</a> and CompleteTrans() is a +superior method of handling transactions, available since ADOdb 3.40. For a +explanation, see the <a href="#starttrans">StartTrans()</a> documentation. </p> + +<p>You can also use the ADOdb <a href="#errorhandling">error handler</a> to die +and rollback your transactions for you transparently. Some buggy database +extensions are known to commit all outstanding tranasactions, so you might want +to explicitly do a $DB-&gt;RollbackTrans() in your error handler for safety. </p> + +<h4>Detecting Transactions</h4> + +<p>Since ADOdb 2.50, you are able to detect when you are inside a transaction. +Check that $connection-&gt;transCnt &gt; 0. This variable is incremented whenever +BeginTrans() is called, and decremented whenever RollbackTrans() or +CommitTrans() is called. </p> + +<p><b>CommitTrans<a name=committrans></a>($ok=true)</b></p> + +<p>End a transaction successfully. Returns true if successful. If the database +does not support transactions, will return true also as data is always +committed. </p> + +<p>If you pass the parameter $ok=false, the data is rolled back. See example in +BeginTrans().</p> + +<p><b>RollbackTrans<a name=rollbacktrans></a>( )</b></p> + +<p>End a transaction, rollback all changes. Returns true if successful. If the +database does not support transactions, will return false as data is never +rollbacked. </p> + +<p><b>SetTransactionMode<a name=SetTransactionMode></a>($mode )</b></p> + +<p>SetTransactionMode allows you to pass in the transaction mode to use for all +subsequent transactions. Note: if you have persistent connections and using +mssql or mysql, you might have to explicitly reset your transaction mode at the +beginning of each page request. This is only supported in postgresql, mssql, +mysql with InnoDB and oci8 currently. For example: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$db-&gt;SetTransactionMode(&quot;SERIALIZABLE&quot;);</pre><pre>$db-&gt;BeginTrans();</pre><pre>$db-&gt;Execute(...); $db-&gt;Execute(...);</pre><pre>$db-&gt;CommiTrans();</pre><pre><o:p>&nbsp;</o:p></pre><pre>$db-&gt;SetTransactionMode(&quot;&quot;); // restore to default</pre><pre>$db-&gt;StartTrans();</pre><pre>$db-&gt;Execute(...); $db-&gt;Execute(...);</pre><pre>$db-&gt;CompleteTrans();</pre></div> + +<p>Supported values to pass in: </p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>READ UNCOMMITTED (allows + dirty reads, but fastest) </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>READ COMMITTED (default + postgres, mssql and oci8) </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>REPEATABLE READ (default + mysql) </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>SERIALIZABLE (slowest and + most restrictive) </li> +</ul> + +<p>You can also pass in database specific values such as 'SNAPSHOT' for mssql +or 'READ ONLY' for oci8/postgres. </p> + +<p>See transaction levels for <a +href="http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html">PostgreSQL</a>, +<a +href="http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm">Oracle</a>, +<a href="http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html">MySQL</a>, +and <a href="http://msdn2.microsoft.com/en-US/ms173763.aspx">MS SQL Server</a>. +</p> + +<p><b>GetAssoc<a name=getassoc1></a>($sql,$inputarr=false,$force_array=false,$first2cols=false)</b></p> + +<p>Returns an associative array for the given query $sql with optional bind +parameters in $inputarr. If the number of columns returned is greater to two, a +2-dimensional array is returned, with the first column of the recordset becomes +the keys to the rest of the rows. If the columns is equal to two, a 1-dimensional +array is created, where the the keys directly map to the values (unless +$force_array is set to true, when an array is created for each value). </p> + +<p>Examples:<a name=getassocex></a></p> + +<p>We have the following data in a recordset:</p> + +<p>row1: Apple, Fruit, Edible<br> +row2: Cactus, Plant, Inedible<br> +row3: Rose, Flower, Edible</p> + +<p>GetAssoc will generate the following 2-dimensional associative array:</p> + +<p>Apple =&gt; array[Fruit, Edible]<br> +Cactus =&gt; array[Plant, Inedible]<br> +Rose =&gt; array[Flower,Edible]</p> + +<p>If the dataset is:</p> + +<p>row1: Apple, Fruit<br> +row2: Cactus, Plant<br> +row3: Rose, Flower </p> + +<p>GetAssoc will generate the following 1-dimensional associative array (with +$force_array==false):</p> + +<p>Apple =&gt; Fruit<br> +Cactus=&gt;Plant<br> +Rose=&gt;Flower </p> + +<p>The function returns:</p> + +<p>The associative array, or false if an error occurs.</p> + +<p><b>CacheGetAssoc<a name=cachegetassoc></a>([$secs2cache,] $sql,$inputarr=false,$force_array=false,$first2cols=false)</b></p> + +<p>Caching version of <a href="#getassoc1">GetAssoc</a> function above. </p> + +<p><b>GetMedian<a name=getmedian></a>($table, $field, $where='')</b></p> + +<p>Returns the median value of $field for $table. The $where clause is +optional. If used, make sure the WHERE is included, as in &quot;WHERE name &gt; +'A'&quot;. If an error occurs, false is returned. Since ADOdb 5.06 and PHP +4.991. </p> + +<p><b>GetOne<a name=getone></a>($sql,$inputarr=false)</b></p> + +<p>Executes the SQL and returns the first field of the first row. The recordset +and remaining rows are discarded for you automatically. If an error occur, +false is returned; use ErrorNo() or ErrorMsg() to get the error details. Since +4.96/5.00, we return null if no records were found. And since 4.991/5.06, you +can have change the return value if no records are found using the global +variable $ADODB_GETONE_EOF: $ADODB_GETONE_EOF = false;</p> + +<p><b>GetRow<a name=getrow></a>($sql,$inputarr=false)</b></p> + +<p>Executes the SQL and returns the first row as an array. The recordset and +remaining rows are discarded for you automatically. If no records are returned, +an empty array is returned. If an error occurs, false is returned.</p> + +<p><b>GetAll<a name=getall></a>($sql,$inputarr=false)</b></p> + +<p>Executes the SQL and returns the all the rows as a 2-dimensional array. The +recordset is discarded for you automatically. If an error occurs, false is +returned. <i>GetArray</i> is a synonym for <i>GetAll</i>.</p> + +<p><b>GetCol<a name=getcol></a>($sql,$inputarr=false,$trim=false)</b></p> + +<p>Executes the SQL and returns all elements of the first column as a +1-dimensional array. The recordset is discarded for you automatically. If an +error occurs, false is returned.</p> + +<p><b>CacheGetOne<a name=cachegetone></a>([$secs2cache,] $sql,$inputarr=false), +CacheGetRow<a name=cachegetrow></a>([$secs2cache,] $sql,$inputarr=false), +CacheGetAll<a name=cachegetall></a>([$secs2cache,] $sql,$inputarr=false), +CacheGetCol<a name=cachegetcol></a>([$secs2cache,] +$sql,$inputarr=false,$trim=false)</b></p> + +<p>Similar to above Get* functions, except that the recordset is serialized and +cached in the $ADODB_CACHE_DIR directory for $secs2cache seconds. Good for +speeding up queries on rarely changing data. Note that the $secs2cache +parameter is optional. If omitted, we use the value in +$connection-&gt;cacheSecs (default is 3600 seconds, or 1 hour). </p> + +<p><b>Prepare<a name=prepare></a>($sql )</b></p> + +<p>Prepares (compiles) an SQL query for repeated execution. Bind parameters are +denoted by ?, except for the oci8 driver, which uses the traditional Oracle +:varname convention. </p> + +<p>Returns an array containing the original sql statement in the first array +element; the remaining elements of the array are driver dependent. If there is +an error, or we are emulating Prepare( ), we return the original $sql string. +This is because all error-handling has been centralized in Execute( ).</p> + +<p>Prepare( ) cannot be used with functions that use SQL query rewriting +techniques, e.g. PageExecute( ) and SelectLimit( ).</p> + +<p>Example:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$stmt = $DB-&gt;Prepare('insert into table (col1,col2) values (?,?)');<br> +for ($i=0; $i &lt; $max; $i++)<br> +<span style='mso-tab-count:1'>         </span>$DB-&gt;Execute($stmt,array((string) rand(), $i));</pre></div> + +<p>Also see InParameter(), OutParameter() and PrepareSP() below. Only supported +internally by interbase, oci8 and selected ODBC-based drivers, otherwise it is +emulated. There is no performance advantage to using Prepare() with emulation. </p> + +<p>Important: Due to limitations or bugs in PHP, if you are getting errors when +you using prepared queries, try setting $ADODB_COUNTRECS = false before +preparing. This behaviour has been observed with ODBC. </p> + +<p><b>IfNull<a name=ifnull></a>($field, $nullReplacementValue)</b></p> + +<p>Portable IFNULL function (NVL in Oracle). Returns a string that represents +the function that checks whether a $field is null for the given database, and +if null, change the value returned to $nullReplacementValue. Eg.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$sql = <span style='color:#993300'>'SELECT '</span>.$db-&gt;IfNull('name', <span +style='color:#993300'>&quot;'- unknown -'&quot;</span>).<span style='color: +#993300'> ' FROM table'</span>;</pre></div> + +<p><b>length</b><a name=length></a></p> + +<p>This is not a function, but a property. Some databases have +&quot;length&quot; and others &quot;len&quot; as the function to measure the +length of a string. To use this property: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>  </span>$sql = <span +style='color:#993300'>&quot;SELECT &quot;</span>.$db-&gt;length.<span +style='color:#993300'>&quot;(field) from table&quot;</span>;<br> +<span style='mso-spacerun:yes'>  </span>$rs = $db-&gt;Execute($sql);</pre></div> + +<p><b>random</b><a name=random></a></p> + +<p>This is not a function, but a property. This is a string that holds the sql +to generate a random number between 0.0 and 1.0 inclusive. </p> + +<p><b>substr</b><a name=substr></a></p> + +<p>This is not a function, but a property. Some databases have +&quot;substr&quot; and others &quot;substring&quot; as the function to retrieve +a sub-string. To use this property: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>  </span>$sql = <span +style='color:#993300'>&quot;SELECT &quot;</span>.$db-&gt;substr.<span +style='color:#993300'>&quot;(field, $offset, $length) from table&quot;</span>;<br> +<span style='mso-spacerun:yes'>  </span>$rs = $db-&gt;Execute($sql);</pre></div> + +<p>For all databases, the 1st parameter of <i>substr</i> is the field, the 2nd +is the offset (1-based) to the beginning of the sub-string, and the 3rd is the +length of the sub-string. </p> + +<p><b>Param<a name=param></a>($name)</b></p> + +<p>Generates a bind placeholder portably. For most databases, the bind +placeholder is &quot;?&quot;. However some databases use named bind parameters +such as Oracle, eg &quot;:somevar&quot;. This allows us to portably define an +SQL statement with bind parameters: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$sql = <span style='color:#993300'>'insert into table (col1,col2) values ('</span>.$DB-&gt;Param('a').<span +style='color:#993300'>','</span>.$DB-&gt;Param('b').<span style='color:#993300'>')'</span>;<br> +<span style='color:#006600'># generates 'insert into table (col1,col2) values (?,?)'<br> +# or<span style='mso-spacerun:yes'>        </span>'insert into table (col1,col2) values (:a,:b)</span>'<br> +$stmt = $DB-&gt;Prepare($sql);<br> +$stmt = $DB-&gt;Execute($stmt,array('one','two'));</pre></div> + +<p><b>PrepareSP<a name=preparesp></a>($sql, $cursor=false )</b></p> + +<p>When calling stored procedures in mssql and oci8 (oracle), and you might +want to directly bind to parameters that return values, or for special LOB +handling. PrepareSP() allows you to do so. </p> + +<p>Returns the same array or $sql string as Prepare( ) above. If you do not +need to bind to return values, you should use Prepare( ) instead.</p> + +<p>The 2nd parameter, $cursor is not used except with oci8. Setting it to true +will force OCINewCursor to be called; this is to support output REF CURSORs. </p> + +<p>For examples of usage of PrepareSP( ), see InParameter( ) below. </p> + +<p>Note: in the mssql driver, preparing stored procedures requires a special +function call, mssql_init( ), which is called by this function. PrepareSP( ) is +available in all other drivers, and is emulated by calling Prepare( ). </p> + +<p><b>InParameter<a name=inparameter></a>($stmt, $var, $name, $maxLen = 4000, +$type = false )</b></p> + +<p class=MsoNormal>Binds a PHP variable as input to a stored procedure +variable. The parameter <i>$stmt</i> is the value returned by PrepareSP(), <i>$var</i> +is the PHP variable you want to bind, $name is the name of the stored procedure +variable. Optional is <i>$maxLen</i>, the maximum length of the data to bind, +and $type which is database dependant. Consult <a +href="http://php.net/mssql_bind">mssql_bind</a> and <a +href="http://php.net/ocibindbyname">ocibindbyname</a> docs at php.net for more +info on legal values for $type. </p> + +<p>InParameter() is a wrapper function that calls Parameter() with +$isOutput=false. The advantage of this function is that it is self-documenting, +because the $isOutput parameter is no longer needed. Only for mssql and oci8 +currently. </p> + +<p>Here is an example using oci8: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='color:green'># For oracle, Prepare and PrepareSP are identical</span></pre><pre>$stmt = $db-&gt;PrepareSP(</pre><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span><span +style='color:#993300'>&quot;declare RETVAL integer; <br> +<span style='mso-tab-count:1'>         </span>begin<br> +<span style='mso-tab-count:1'>         </span>:RETVAL := SP_RUNSOMETHING(:myid,:group);<br> +<span style='mso-tab-count:1'>         </span>end;&quot;</span>);<br> +$db-&gt;InParameter($stmt,$id,'myid');<br> +$db-&gt;InParameter($stmt,$group,'group',64);<br> +$db-&gt;OutParameter($stmt,$ret,'RETVAL');<br> +$db-&gt;Execute($stmt);</pre></div> + +<p>The same example using mssql:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='color:green'># @RETVAL = SP_RUNSOMETHING @myid,@group</span></pre><pre>$stmt = $db-&gt;PrepareSP(<span +style='color:#993333'>'</span><span style='color:#993300'>SP_RUNSOMETHING</span><span +style='color:#993333'>'</span>); <br> +<span style='color:green'># note that the parameter name does not have @ in front!</span></pre><pre>$db-&gt;InParameter($stmt,$id,'myid');</pre><pre>$db-&gt;InParameter($stmt,$group,'group',64);</pre><pre +style='background:#EEEEEE'><span style='color:green'># return value in mssql - RETVAL is hard-coded name</span> <br> +$db-&gt;OutParameter($stmt,$ret,'RETVAL');<br> +$db-&gt;Execute($stmt); </pre></div> + +<p>Note that the only difference between the oci8 and mssql implementations is +$sql.</p> + +<p>If $type parameter is set to false, in mssql, $type will be dynamicly +determined based on the type of the PHP variable passed <span style='font-family: +"Courier New"'>(string =&gt; SQLCHAR, boolean =&gt;SQLINT1, integer +=&gt;SQLINT4 or float/double=&gt;SQLFLT8)</span>. </p> + +<p>In oci8, $type can be set to OCI_B_FILE (Binary-File), OCI_B_CFILE +(Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and +OCI_B_ROWID (ROWID). To pass in a null, use<span style='font-family:"Courier New"'> +$db-&gt;Parameter($stmt, $null=null, 'param')</span>. </p> + +<p><b>OutParameter<a name=outparameter></a>($stmt, $var, $name, $maxLen = 4000, +$type = false )</b></p> + +<p class=MsoNormal>Binds a PHP variable as output from a stored procedure +variable. The parameter <i>$stmt</i> is the value returned by PrepareSP(), <i>$var</i> +is the PHP variable you want to bind, <i>$name</i> is the name of the stored +procedure variable. Optional is <i>$maxLen</i>, the maximum length of the data +to bind, and <i>$type</i> which is database dependant. </p> + +<p>OutParameter() is a wrapper function that calls Parameter() with +$isOutput=true. The advantage of this function is that it is self-documenting, +because the $isOutput parameter is no longer needed. Only for mssql and oci8 +currently. </p> + +<p>For an example, see <a href="#inparameter">InParameter</a>. </p> + +<p><b>Parameter<a name=parameter></a>($stmt, $var, $name, $isOutput=false, +$maxLen = 4000, $type = false )</b></p> + +<p>Note: This function is deprecated, because of the new InParameter() and +OutParameter() functions. These are superior because they are self-documenting, +unlike Parameter(). </p> + +<p>Adds a bind parameter suitable for return values or special data handling +(eg. LOBs) after a statement has been prepared using PrepareSP(). Only for +mssql and oci8 currently. The parameters are:<br> +<br> +$<b><i>stmt</i></b> Statement returned by Prepare() or PrepareSP().<br> +$<b><i>var</i></b> PHP variable to bind to. Make sure you pre-initialize it!<br> +$<b><i>name</i></b> Name of stored procedure variable name to bind to.<br> +[$<b><i>isOutput</i></b>] Indicates direction of parameter 0/false=IN 1=OUT 2= +IN/OUT. This is ignored in oci8 as this driver auto-detects the direction.<br> +[$<b>maxLen</b>] Maximum length of the parameter variable.<br> +[$<b>type</b>] Consult <a href="http://php.net/mssql_bind">mssql_bind</a> and <a +href="http://php.net/ocibindbyname">ocibindbyname</a> docs at php.net for more +info on legal values for type.</p> + +<p>Lastly, in oci8, bind parameters can be reused without calling PrepareSP( ) or +Parameters again. This is not possible with mssql. An oci8 example:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>$id = 0; $i = 0;<br> +$stmt = $db-&gt;PrepareSP( <span style='color:#993300'>&quot;update table set val=:i where id=:id&quot;</span>);<br> +$db-&gt;Parameter($stmt,$id,'id');<br> +$db-&gt;Parameter($stmt,$i, 'i');<br> +for ($cnt=0; $cnt &lt; 1000; $cnt++) {<br> +<span style='mso-tab-count:1'>         </span>$id = $cnt; <br> +<span style='mso-tab-count:1'>         </span>$i = $cnt * $cnt; <span +style='color:green'># works with oci8!</span></pre><pre style='background:#EEEEEE'><span +style='mso-tab-count:1'>         </span>$db-&gt;Execute($stmt); <br> +}</pre></div> + +<p><b>Bind<a name=bind></a>($stmt, $var, $size=4001, $type=false, $name=false)</b></p> + +<p>This is a low-level function supported only by the oci8 driver. <b>Avoid +using</b> unless you only want to support Oracle. The Parameter( ) function is +the recommended way to go with bind variables.</p> + +<p>Bind( ) allows you to use bind variables in your sql statement. This binds a +PHP variable to a name defined in an Oracle sql statement that was previously +prepared using Prepare(). Oracle named variables begin with a colon, and ADOdb +requires the named variables be called :0, :1, :2, :3, etc. The first +invocation of Bind() will match :0, the second invocation will match :1, etc. +Binding can provide 100% speedups for insert, select and update statements. </p> + +<p>The other variables, $size sets the buffer size for data storage, $type is +the optional descriptor type OCI_B_FILE (Binary-File), OCI_B_CFILE +(Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and +OCI_B_ROWID (ROWID). Lastly, instead of using the default :0, :1, etc names, +you can define your own bind-name using $name. </p> + +<p>The following example shows 3 bind variables being used: p1, p2 and p3. +These variables are bound to :0, :1 and :2.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$stmt = $DB-&gt;Prepare(&quot;insert into table (col0, col1, col2) values (:0, :1, :2)&quot;);<br> +$DB-&gt;Bind($stmt, $p1);<br> +$DB-&gt;Bind($stmt, $p2);<br> +$DB-&gt;Bind($stmt, $p3);<br> +for ($i = 0; $i &lt; $max; $i++) { <br> +<span style='mso-spacerun:yes'>   </span>$p1 = ?; $p2 = ?; $p3 = ?;<br> +<span style='mso-spacerun:yes'>   </span>$DB-&gt;Execute($stmt);<br> +}</pre></div> + +<p>You can also use named variables:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$stmt = $DB-&gt;Prepare(&quot;insert into table (col0, col1, col2) values (:name0, :name1, :name2)&quot;);<br> +$DB-&gt;Bind($stmt, $p1, &quot;name0&quot;);<br> +$DB-&gt;Bind($stmt, $p2, &quot;name1&quot;);<br> +$DB-&gt;Bind($stmt, $p3, &quot;name2&quot;);<br> +for ($i = 0; $i &lt; $max; $i++) { <br> +<span style='mso-spacerun:yes'>   </span>$p1 = ?; $p2 = ?; $p3 = ?;<br> +<span style='mso-spacerun:yes'>   </span>$DB-&gt;Execute($stmt);<br> +}</pre></div> + +<p><b>LogSQL($enable=true)</b><a name=logsql></a></p> + +<p class=MsoNormal>Call this method to install a SQL logging and timing +function (using fnExecute). Then all SQL statements are logged into an +adodb_logsql table in a database. If the adodb_logsql table does not exist, +ADOdb will create the table if you have the appropriate permissions. Returns +the previous logging value (true for enabled, false for disabled). Here are +samples of the DDL for selected databases: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='mso-tab-count:2'>                 </span><b>mysql:</b></pre><pre><span +style='mso-tab-count:2'>                 </span>CREATE TABLE adodb_logsql (</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>created datetime NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql0 varchar(250) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql1 text NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>params text NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>tracer text NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>timer decimal(16,6) NOT NULL</pre><pre><span +style='mso-tab-count:2'>                 </span>)</pre><pre><span +style='mso-tab-count:2'>                 </span></pre><pre><span +style='mso-tab-count:2'>                 </span><b>postgres:</b></pre><pre><span +style='mso-tab-count:2'>                 </span>CREATE TABLE adodb_logsql (</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>created timestamp NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql0 varchar(250) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql1 text NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>params text NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>tracer text NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>timer decimal(16,6) NOT NULL</pre><pre><span +style='mso-tab-count:2'>                 </span>)</pre><pre><span +style='mso-tab-count:2'>                 </span></pre><pre><span +style='mso-tab-count:2'>                 </span><b>mssql:</b></pre><pre><span +style='mso-tab-count:2'>                 </span>CREATE TABLE adodb_logsql (</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>created datetime NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql0 varchar(250) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql1 varchar(4000) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>params varchar(3000) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>tracer varchar(500) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>timer decimal(16,6) NOT NULL</pre><pre><span +style='mso-tab-count:2'>                 </span>)</pre><pre><span +style='mso-tab-count:2'>                 </span></pre><pre><span +style='mso-tab-count:2'>                 </span><b>oci8:</b></pre><pre><span +style='mso-tab-count:2'>                 </span>CREATE TABLE adodb_logsql (</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>created date NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql0 varchar(250) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>sql1 varchar(4000) NOT NULL,</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>params varchar(4000),</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>tracer varchar(4000),</pre><pre><span +style='mso-tab-count:2'>                 </span><span style='mso-spacerun:yes'>  </span>timer decimal(16,6) NOT NULL</pre><pre><span +style='mso-tab-count:2'>                 </span>)</pre></div> + +<p class=MsoNormal>Usage: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$conn-&gt;LogSQL(); // turn on logging<br> +<span style='mso-tab-count:1'>         </span><span style='mso-spacerun:yes'>  </span>:<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;Execute(...);<br> +<span style='mso-tab-count:1'>         </span><span style='mso-spacerun:yes'>  </span>:<br> +<span style='mso-tab-count:1'>         </span>$conn-&gt;LogSQL(false); // turn off logging<br> +<span style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:1'>         </span># output summary of SQL logging results<br> +<span style='mso-tab-count:1'>         </span>$perf = NewPerfMonitor($conn);<br> +<span style='mso-tab-count:1'>         </span>echo $perf-&gt;SuspiciousSQL();<br> +<span style='mso-tab-count:1'>         </span>echo $perf-&gt;ExpensiveSQL();</pre></div> + +<p>One limitation of logging is that rollback also prevents SQL from being +logged. </p> + +<p>If you prefer to use another name for the table used to store the SQL, you +can override it by calling adodb_perf::table($tablename), where $tablename is +the new table name (you will still need to manually create the table yourself). +An example: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>include('adodb.inc.php');<br> +<span style='mso-tab-count:1'>         </span>include('adodb-perf.inc.php');<br> +<span style='mso-tab-count:1'>         </span>adodb_perf::table('my_logsql_table');</pre></div> + +<p class=MsoNormal>Also see <a href="docs-perf.htm">Performance Monitor</a>. </p> + +<p><b>fnExecute and fnCacheExecute properties</b><a name=fnexecute +id=fnexecute></a></p> + +<p>These two properties allow you to define bottleneck functions for all sql +statements processed by ADOdb. This allows you to perform statistical analysis +and query-rewriting of your sql. </p> + +<p><b>Examples of fnExecute</b></p> + +<p>Here is an example of using fnExecute, to count all cached queries and +non-cached queries, you can do this:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span +style='color:#006600'># $db is the connection object</span></pre><pre>function &amp;CountExecs($db, $sql, $inputarray)</pre><pre>{</pre><pre>global $EXECS;</pre><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>if (!is_array(inputarray)) $EXECS++;</pre><pre><span +style='mso-tab-count:1'>         </span><span style='color:#006600'># handle 2-dimensional input arrays</span></pre><pre><span +style='mso-tab-count:1'>         </span>else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);</pre><pre><span +style='mso-tab-count:1'>         </span>else $EXECS++;</pre><pre><span +style='mso-tab-count:1'>         </span></pre><pre><span style='mso-tab-count: +1'>         </span><span style='color:#006600'># in PHP4.4 and PHP5, we need to return a value by reference</span></pre><pre><span +style='mso-tab-count:1'>         </span>$null = null;</pre><pre><span +style='mso-tab-count:1'>         </span>return $null;</pre><pre>}</pre><pre><o:p>&nbsp;</o:p></pre><pre><span +style='color:#006600'># $db is the connection object</span></pre><pre>function CountCachedExecs($db, $secs2cache, $sql, $inputarray)</pre><pre +style='background:#EEEEEE'>{<br> +global $CACHED; $CACHED++;<br> +}<br> +<br> +$db = NewADOConnection('mysql');<br> +$db-&gt;Connect(...);<br> +$db-&gt;<strong><span style='font-family:"Courier New"'>fnExecute</span></strong> = 'CountExecs';<br> +$db-&gt;<strong><span style='font-family:"Courier New"'>fnCacheExecute</span></strong> = 'CountCachedExecs';<br> +<span style='mso-spacerun:yes'> </span>:<br> +<span style='mso-spacerun:yes'> </span>:<br> +<span style='color:#006600'># After many sql statements:</span>`<br> +printf(&quot;&lt;p&gt;Total queries=%d; total cached=%d&lt;/p&gt;&quot;,$EXECS+$CACHED, $CACHED);</pre></div> + +<p>The fnExecute function is called before the sql is parsed and executed, so +you can perform a query rewrite. If you are passing in a prepared statement, +then $sql is an array (see <a href="#prepare">Prepare</a>). The fnCacheExecute +function is only called if the recordset returned was cached. The function +parameters match the Execute and CacheExecute functions respectively, except +that $this (the connection object) is passed as the first parameter.</p> + +<p>Since ADOdb 3.91, the behaviour of fnExecute varies depending on whether the +defined function returns a value. If it does not return a value, then the $sql +is executed as before. This is useful for query rewriting or counting sql +queries. </p> + +<p>On the other hand, you might want to replace the Execute function with one +of your own design. If this is the case, then have your function return a +value. If a value is returned, that value is returned immediately, without any +further processing. This is used internally by ADOdb to implement LogSQL() +functionality. </p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h3>ADOConnection Utility Functions</h3> + +<p><b>BlankRecordSet<a name=blankrecordset></a>([$queryid])</b></p> + +<p>No longer available - removed since 1.99.</p> + +<p><b>Concat<a name=concat></a>($s1,$s2,....)</b></p> + +<p>Generates the sql string used to concatenate $s1, $s2, etc together. Uses +the string in the concat_operator field to generate the concatenation. Override +this function if a concatenation operator is not used, eg. MySQL.</p> + +<p>Returns the concatenated string.</p> + +<p><b>DBDate<a name=dbdate></a>($date)</b></p> + +<p>Format the $<b>date</b> in the format the database accepts - the return +string is also quoted. This is used when you are sending dates to the database +(eg INSERT, UPDATE or where clause of SELECT statement). The $<b>date</b> +parameter can be a PHP DateTime object (since ADOdb 5.09), a Unix integer timestamp or an ISO format Y-m-d. Uses the +fmtDate field, which holds the format to use. If null or false or '' is passed +in, it will be converted to an SQL null.</p> + +<p>Returns the date as a quoted string.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>$sql = &quot;select * from atable where created &gt; &quot;.$db-&gt;DBDate(&quot;$year-$month-$day&quot;);</pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;Execute($sql);</pre></div> + +<p>Note to retrieve a date column in a specific format, use <a href="#sqldate">SQLDate</a>. +</p> + +<p><b>BindDate<a name=binddate></a>($date)</b></p> + +<p>Format the $<b>date</b> in the bind format the database accepts. Normally +this means that the date string is not quoted, unlike DBDate, which quotes the +string. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>$sql = &quot;select * from atable where created &gt; &quot;.$db-&gt;Param('0');</pre><pre><span +style='mso-tab-count:1'>         </span>// or</pre><pre><span style='mso-tab-count: +1'>         </span>$sql = &quot;select * from atable where created &gt; ?&quot;;</pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;Execute($sql,array($db-&gt;BindDate(&quot;$year-$month-$day&quot;));</pre></div> + +<p><b>DBTimeStamp<a name=dbtimestamp></a>($ts)</b></p> + +<p>Format the timestamp $<b>ts</b> in the format the database accepts; this can +be a PHP DateTime object (since ADOdb 5.09), a Unix integer timestamp or an ISO format Y-m-d H:i:s. Uses the fmtTimeStamp +field, which holds the format to use. If null or false or '' is passed in, it +will be converted to an SQL null.</p> + +<p>Returns the timestamp as a quoted string.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>$sql = &quot;select * from atable where created &gt; &quot;.$db-&gt;DBTimeStamp(&quot;$year-$month-$day $hr:$min:$secs&quot;);</pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;Execute($sql);</pre></div> + +<p><b>BindTimeStamp<a name=bindtimestamp></a>($ts)</b></p> + +<p>Format the timestamp $<b>ts</b> in the bind format the database accepts. +Normally this means that the timestamp string is not quoted, unlike +DBTimeStamp, which quotes the string. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span +style='mso-tab-count:1'>         </span>$sql = &quot;select * from atable where created &gt; &quot;.$db-&gt;Param('0');</pre><pre><span +style='mso-tab-count:1'>         </span>// or</pre><pre><span style='mso-tab-count: +1'>         </span>$sql = &quot;select * from atable where created &gt; ?&quot;;</pre><pre><span +style='mso-tab-count:1'>         </span>$db-&gt;Execute($sql,array($db-&gt;BindTimeStamp(&quot;$year-$month-$day $hr:$min:$secs&quot;));</pre></div> + +<p><b>qstr<a name=qstr></a>($s,[$magic_quotes_enabled</b>=false]<b>)</b></p> + +<p>Quotes a string to be sent to the database. The $<b>magic_quotes_enabled</b> +parameter may look funny, but the idea is if you are quoting a string extracted +from a POST/GET variable, then pass get_magic_quotes_gpc() as the second +parameter. This will ensure that the variable is not quoted twice, once by <i>qstr</i> +and once by the <i>magic_quotes_gpc</i>.</p> + +<p>Eg.<span style='font-family:"Courier New"'> $s = $db-&gt;qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());</span></p> + +<p>Returns the quoted string.</p> + +<p><b>Quote<a name=quote></a>($s)</b></p> + +<p>Quotes the string $s, escaping the database specific quote character as +appropriate. Formerly checked magic quotes setting, but this was disabled since +3.31 for compatibility with PEAR DB. </p> + +<p><b>Affected_Rows<a name="affected_rows"></a>( )</b></p> + +<p>Returns the number of rows affected by a update or delete statement. Returns +false if function not supported.</p> + +<p>Not supported by interbase/firebird currently. </p> + +<p><b>Insert_ID<a name="inserted_id"></a>( )</b></p> + +<p>Returns the last autonumbering ID inserted. Returns false if function not +supported. </p> + +<p>Only supported by databases that support auto-increment or object id's, such +as PostgreSQL, MySQL and MS SQL Server currently. PostgreSQL returns the OID, +which can change on a database reload.</p> + +<p><b>RowLock<a name=rowlock></a>($table,$where)</b></p> + +<p>Lock a table row for the duration of a transaction. For example to lock +record $id in table1: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$DB-&gt;StartTrans();<br> +<span style='mso-tab-count:1'>         </span>$DB-&gt;RowLock(&quot;table1&quot;,&quot;rowid=$id&quot;);<br> +<span style='mso-tab-count:1'>         </span>$DB-&gt;Execute($sql1);<br> +<span style='mso-tab-count:1'>         </span>$DB-&gt;Execute($sql2);<br> +<span style='mso-tab-count:1'>         </span>$DB-&gt;CompleteTrans();</pre></div> + +<p>Supported in db2, interbase, informix, mssql, oci8, postgres, sybase. </p> + +<p><b>MetaDatabases<a name=metadatabases></a>()</b></p> + +<p>Returns a list of databases available on the server as an array. You have to +connect to the server first. Only available for ODBC, MySQL and ADO.</p> + +<p><b>MetaTables<a name=metatables></a>($ttype = false, $showSchema = false, +$mask=false)</b></p> + +<p>Returns an array of tables and views for the current database as an array. +The array should exclude system catalog tables if possible. To only show +tables, use $db-&gt;MetaTables('TABLES'). To show only views, use +$db-&gt;MetaTables('VIEWS'). The $showSchema parameter currently works only for +DB2, and when set to true, will add the schema name to the table, eg. +&quot;SCHEMA.TABLE&quot;. </p> + +<p>You can define a mask for matching. For example, setting $mask = 'TMP%' will +match all tables that begin with 'TMP'. Currently only mssql, oci8, odbc_mssql +and postgres* support $mask. </p> + +<p><b>MetaColumns<a name=metacolumns></a>($table,$notcasesensitive=true)</b></p> + +<p>Returns an array of ADOFieldObject's, one field object for every column of +$table. A field object is a class instance with (name, type, max_length) +defined. Currently Sybase does not recognise date types, and ADO cannot +identify the correct data type (so we default to varchar). </p> + +<p>The $notcasesensitive parameter determines whether we uppercase or lowercase +the table name to normalize it (required for some databases). Does not work +with MySQL ISAM tables. </p> + +<p>For schema support, pass in the $table parameter, +&quot;$schema.$tablename&quot;. This is only supported for selected databases. </p> + +<p><b>MetaColumnNames<a name=metacolumnames></a>($table,$numericIndex=false)</b></p> + +<p>Returns an array of column names for $table. Since ADOdb 4.22, this is an +associative array, with the keys in uppercase. Set $numericIndex=true if you +want the old behaviour of numeric indexes (since 4.23). </p> + +<p>e.g. array('FIELD1' =&gt; 'Field1', 'FIELD2'=&gt;'Field2') </p> + +<p><b>MetaPrimaryKeys<a name=metaprimarykeys></a>($table, $owner=false)</b> </p> + +<p>Returns an array containing column names that are the primary keys of +$table. Supported by mysql, odbc (including db2, odbc_mssql, etc), mssql, +postgres, interbase/firebird, oci8 currently. </p> + +<p>Views (and some tables) have primary keys, but sometimes this information is +not available from the database. You can define a function +ADODB_View_PrimaryKeys($databaseType, $database, $view, $owner) that should +return an array containing the fields that make up the primary key. If that +function exists, it will be called when MetaPrimaryKeys() cannot find a primary +key for a table or view. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>// In this example: dbtype = 'oci8', $db = 'mydb', $view = 'dataView', $owner = false <br> +function ADODB_View_PrimaryKeys($dbtype,$db,$view,$owner)<br> +{<br> +<span style='mso-tab-count:1'>         </span>switch(strtoupper($view)) {<br> +<span style='mso-tab-count:1'>         </span>case 'DATAVIEW': return array('DATAID');<br> +<span style='mso-tab-count:1'>         </span>default: return false;<br> +<span style='mso-tab-count:1'>         </span>}<br> +}<br> +<br> +$db = NewADOConnection('oci8');<br> +$db-&gt;Connect('localhost','root','','mydb'); <br> +$db-&gt;MetaPrimaryKeys('dataView');</pre></div> + +<p><b>ServerInfo<a name=serverinfo id=serverinfo></a>()</b> </p> + +<p>Returns an array of containing two elements 'description' and 'version'. The +'description' element contains the string description of the database. The +'version' naturally holds the version number (which is also a string).</p> + +<p><b>MetaForeignKeys<a name=metaforeignkeys></a>($table, $owner=false, +$upper=false)</b> </p> + +<p>Returns an associate array of foreign keys, or false if not supported. For +example, if table employee has a foreign key where employee.deptkey points to +dept_table.deptid, and employee.posn=posn_table.postionid and +employee.poscategory=posn_table.category, then +$conn-&gt;MetaForeignKeys('employee') will return </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>array(<br> +<span style='mso-tab-count:2'>                 </span>'dept_table' =&gt; array('deptkey=deptid'),<br> +<span style='mso-tab-count:2'>                 </span>'posn_table' =&gt; array('posn=positionid','poscategory=category')<br> +<span style='mso-tab-count:1'>         </span>)</pre></div> + +<p>The optional schema or owner can be defined in $owner. If $upper is true, +then the table names (array keys) are upper-cased. </p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h2>ADORecordSet<a name=adorecordset></a></h2> + +<p>When an SQL statement successfully is executed by <span style='font-family: +"Courier New"'>ADOConnection-&gt;Execute($sql),</span>an ADORecordSet object is +returned. This object contains a virtual cursor so we can move from row to row, +functions to obtain information about the columns and column types, and helper +functions to deal with formating the results to show to the user.</p> + +<h3>ADORecordSet Fields</h3> + +<p><b>fields: </b>Array containing the current row. This is not associative, +but is an indexed array from 0 to columns-1. See also the function <b><a +href="#fields">Fields</a></b>, which behaves like an associative array.</p> + +<p><b>dataProvider</b>: The underlying mechanism used to connect to the +database. Normally set to <b>native</b>, unless using <b>odbc</b> or <b>ado</b>.</p> + +<p><b>blobSize</b>: Maximum size of a char, string or varchar object before it +is treated as a Blob (Blob's should be shown with textarea's). See the <a +href="#metatype">MetaType</a> function.</p> + +<p><b>sql</b>: Holds the sql statement used to generate this record set.</p> + +<p><b>canSeek</b>: Set to true if Move( ) function works.</p> + +<p><b>EOF</b>: True if we have scrolled the cursor past the last record.</p> + +<h3>ADORecordSet Functions</h3> + +<p><b>ADORecordSet( )</b></p> + +<p>Constructer. Normally you never call this function yourself.</p> + +<p><b>GetAssoc<a name=getassoc></a>([$force_array])</b></p> + +<p>Generates an associative array from the recordset. Note that is this +function is also <a href="#getassoc1">available</a> in the connection object. +More details can be found there.</p> + +<p><b>GetArray<a name=getarray></a>([$number_of_rows])</b></p> + +<p>Generate a 2-dimensional array of records from the current cursor position, +indexed from 0 to $number_of_rows - 1. If $number_of_rows is undefined, till +EOF.</p> + +<p><b>GetRows<a name=getrows></a>([$number_of_rows])</b></p> + +<p class=MsoNormal>Generate a 2-dimensional array of records from the current +cursor position. Synonym for GetArray() for compatibility with Microsoft ADO. </p> + +<p><b>GetMenu<a name=getmenu></a>($name, [$default_str=''], +[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])</b></p> + +<p>Generate a HTML menu +(&lt;select&gt;&lt;option&gt;&lt;option&gt;&lt;/select&gt;). The first column +of the recordset (fields[0]) will hold the string to display in the option +tags. If the recordset has more than 1 column, the second column (fields[1]) is +the value to send back to the web server.. The menu will be given the name $<i>name</i>. +</p> + +<p>If $<i>default_str</i> is defined, then if $<i>default_str</i> == fields[0], +that field is selected. If $<i>blank1stItem</i> is true, the first option is +empty. You can also set the first option strings by setting $blank1stItem = +&quot;$value:$text&quot;.</p> + +<p>$<i>Default_str</i> can be array for a multiple select listbox.</p> + +<p>To get a listbox, set the $<i>size</i> to a non-zero value (or pass +$default_str as an array). If $<i>multiple_select</i> is true then a listbox +will be generated with $<i>size</i> items (or if $size==0, then 5 items) +visible, and we will return an array to a server. Lastly use $<i>moreAttr </i>to +add additional attributes such as javascript or styles. </p> + +<p>Menu Example 1: <code><span style='font-size:10.0pt'>GetMenu('menu1','A',true)</span></code> +will generate a menu: <SELECT NAME="menu1"> +<OPTION> +<OPTION SELECTED VALUE="1">A +<OPTION VALUE="2">B +<OPTION VALUE="3">C +</SELECT>for +the data (A,1), (B,2), (C,3). Also see <a href="#ex5">example 5</a>.</p> + +<p>Menu Example 2: For the same data, <code><span style='font-size:10.0pt'>GetMenu('menu1',array('A','B'),false)</span></code> +will generate a menu with both A and B selected: <br> +<SELECT MULTIPLE NAME="menu1" SIZE="3"> +<OPTION SELECTED VALUE="1">A +<OPTION SELECTED VALUE="2">B +<OPTION VALUE="3">C +</SELECT></p> + +<p><b>GetMenu2<a name=getmenu2></a>($name, [$default_str=''], +[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])</b></p> + +<p>This is nearly identical to GetMenu, except that the $<i>default_str</i> is +matched to fields[1] (the option values).</p> + +<p>Menu Example 3: Given the data in menu example 2, <code><span +style='font-size:10.0pt'>GetMenu2('menu1',array('1','2'),false)</span></code> +will generate a menu with both A and B selected in menu example 2, but this +time the selection is based on the 2nd column, which holds the values to return +to the Web server. </p> + +<p><b>UserDate<a name=userdate></a>($str, [$fmt])</b></p> + +<p>Converts the date string $<i>str</i> to another format. The date format is +Y-m-d, or Unix timestamp format. The default $<i>fmt</i> is Y-m-d.</p> + +<p><b>UserTimeStamp<a name=usertimestamp></a>($str, [$fmt])</b></p> + +<p>Converts the timestamp string $<b>str</b> to another format. The timestamp +format is Y-m-d H:i:s, as in '2002-02-28 23:00:12', or Unix timestamp format. +UserTimeStamp calls UnixTimeStamp to parse $<i>str</i>, and $<i>fmt</i> +defaults to Y-m-d H:i:s if not defined. </p> + +<p><b>UnixDate<a name=unixdate></a>($str)</b></p> + +<p>Parses the date string $<b>str</b> and returns it in unix mktime format (eg. +a number indicating the seconds after January 1st, 1970). Expects the date to +be in Y-m-d H:i:s format, except for Sybase and Microsoft SQL Server, where M d +Y is also accepted (the 3 letter month strings are controlled by a global +array, which might need localisation).</p> + +<p>This function is available in both ADORecordSet and ADOConnection since +1.91.</p> + +<p><b>UnixTimeStamp<a name=unixtimestamp></a>($str)</b></p> + +<p>Parses the timestamp string $<b>str</b> and returns it in unix mktime format +(eg. a number indicating the seconds after January 1st, 1970). Expects the date +to be in &quot;Y-m-d, H:i:s&quot; (1970-12-24, 00:00:00) or &quot;Y-m-d +H:i:s&quot; (1970-12-24 00:00:00) or &quot;YmdHis&quot; (19701225000000) +format, except for Sybase and Microsoft SQL Server, where &quot;M d Y +h:i:sA&quot; (Dec 25 1970 00:00:00AM) is also accepted (the 3 letter month +strings are controlled by a global array, which might need localisation).</p> + +<p>This function is available in both ADORecordSet and ADOConnection since +1.91. </p> + +<p><b>OffsetDate<a name=OffsetDate></a>($dayFraction, $basedate=false)</b></p> + +<p>Returns a string with the native SQL functions to calculate future and past +dates based on $basedate in a portable fashion. If $basedate is not defined, +then the current date (at 12 midnight) is used. Returns the SQL string that +performs the calculation when passed to Execute(). </p> + +<p>For example, in Oracle, to find the date and time that is 2.5 days from +today, you can use:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'># get date one week from now<br> +$fld = $conn-&gt;OffsetDate(7); // returns &quot;(trunc(sysdate)+7&quot;)</pre><pre># get date and time that is 60 hours from current date and time<br> +$fld = $conn-&gt;OffsetDate(2.5, $conn-&gt;sysTimeStamp);<span +style='mso-tab-count:1'> </span>// returns &quot;(sysdate+2.5)&quot;<br> +<br> +$conn-&gt;Execute(&quot;UPDATE TABLE SET dodate=$fld WHERE ID=$id&quot;);</pre></div> + +<p>This function is available for mysql, mssql, oracle, oci8 and postgresql +drivers since 2.13. It might work with other drivers provided they allow +performing numeric day arithmetic on dates.</p> + +<p><b>SQLDate<a name=sqldate></a>($dateFormat, $basedate=false)</b></p> + +<p class=MsoNormal>Returns a string which contains the native SQL functions to +format a date or date column $basedate. This is used when retrieving date +columns in SELECT statements. For sending dates to the database (eg. in UPDATE, +INSERT or the where clause of SELECT statements) use <a href="#dbdate">DBDate</a>. +It uses a case-sensitive $dateFormat, which supports: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span style='mso-spacerun:yes'> </span></pre><pre><span style='mso-spacerun:yes'>  </span>Y: 4-digit Year</pre><pre><span style='mso-spacerun:yes'>  </span>Q: Quarter (1-4)</pre><pre><span style='mso-spacerun:yes'>  </span>M: Month (Jan-Dec)</pre><pre><span style='mso-spacerun:yes'>  </span>m: Month (01-12)</pre><pre><span style='mso-spacerun:yes'>  </span>d: Day (01-31)</pre><pre><span style='mso-spacerun:yes'>  </span>H: Hour (00-23)</pre><pre><span style='mso-spacerun:yes'>  </span>h: Hour (1-12)</pre><pre><span style='mso-spacerun:yes'>  </span>i: Minute (00-59)</pre><pre><span style='mso-spacerun:yes'>  </span>s: Second (00-60)</pre><pre><span style='mso-spacerun:yes'>  </span>A: AM/PM indicator</pre><pre><span style='mso-spacerun:yes'>  </span>w: day of week (0-6 or 1-7 depending on DB)</pre><pre><span style='mso-spacerun:yes'>  </span>l: day of week (as string - lowercase L)</pre><pre><span style='mso-spacerun:yes'>  </span>W: week in year (0..53 for MySQL, 1..53 for PostgreSQL and Oracle)</pre><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>  </span></pre></div> + +<p>All other characters are treated as strings. You can also use \ to escape +characters. Available on selected databases, including mysql, postgresql, +mssql, oci8 and DB2. </p> + +<p>This is useful in writing portable sql statements that GROUP BY on dates. +For example to display total cost of goods sold broken by quarter (dates are +stored in a field called postdate): </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span>$sqlfn = $db-&gt;SQLDate('Y-\QQ','postdate'); # get sql that formats postdate to output 2002-Q1<br> +<span style='mso-spacerun:yes'> </span>$sql = &quot;SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc&quot;;<br> +<span style='mso-spacerun:yes'> </span></pre></div> + +<p><b>MoveNext<a name=movenext></a>( )</b></p> + +<p>Move the internal cursor to the next row. The <i>$this-&gt;fields</i> array +is automatically updated. Returns false if unable to do so (normally because +EOF has been reached), otherwise true. </p> + +<p>If EOF is reached, then the $this-&gt;fields array is set to false (this was +only implemented consistently in ADOdb 3.30). For the pre-3.30 behaviour of +$this-&gt;fields (at EOF), set the global variable $ADODB_COMPAT_FETCH = true.</p> + +<p>Example:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute($sql);<br> +if ($rs) <br> +<span style='mso-tab-count:1'>         </span>while (!$rs-&gt;EOF) {<br> +<span style='mso-spacerun:yes'> </span><span style='mso-tab-count:2'>                </span>ProcessArray($rs-&gt;fields);<span +style='mso-tab-count:1'>         </span><br> +<span style='mso-tab-count:2'>                 </span>$rs-&gt;MoveNext();<br> +<span style='mso-tab-count:1'>         </span>} </pre></div> + +<p><b>Move<a name=move></a>($to)</b></p> + +<p>Moves the internal cursor to a specific row $<b>to</b>. Rows are zero-based +eg. 0 is the first row. The <b>fields</b> array is automatically updated. For +databases that do not support scrolling internally, ADOdb will simulate forward +scrolling. Some databases do not support backward scrolling. If the $<b>to</b> +position is after the EOF, $<b>to</b> will move to the end of the RecordSet for +most databases. Some obscure databases using odbc might not behave this way.</p> + +<p>Note: This function uses <i>absolute positioning</i>, unlike Microsoft's +ADO.</p> + +<p>Returns true or false. If false, the internal cursor is not moved in most +implementations, so AbsolutePosition( ) will return the last cursor position +before the Move( ). </p> + +<p><b>MoveFirst<a name=movefirst></a>()</b></p> + +<p>Internally calls Move(0). Note that some databases do not support this function.</p> + +<p><b>MoveLast<a name=movelast></a>()</b></p> + +<p>Internally calls Move(RecordCount()-1). Note that some databases do not +support this function.</p> + +<p><b>GetRowAssoc</b><a name=getrowassoc></a>($toUpper=true)</p> + +<p>Returns an associative array containing the current row. The keys to the +array are the column names. The column names are upper-cased for easy access. +To get the next row, you will still need to call MoveNext(). </p> + +<p>For example:<br> +Array ( [ID] =&gt; 1 [FIRSTNAME] =&gt; Caroline [LASTNAME] =&gt; Miranda +[CREATED] =&gt; 2001-07-05 ) </p> + +<p>Note: do not use GetRowAssoc() with $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC. +Because they have the same functionality, they will interfere with each other.</p> + +<p><b>AbsolutePage<a name=absolutepage></a>($page=-1) </b></p> + +<p>Returns the current page. Requires PageExecute()/CachePageExecute() to be +called. See <a href="#ex8">Example 8</a>.</p> + +<p><b>AtFirstPage<a name=atfirstpage>($status='')</a></b><span +style='mso-bookmark:atfirstpage'></span></p> + +<p>Returns true if at first page (1-based). Requires +PageExecute()/CachePageExecute() to be called. See <a href="#ex8">Example 8</a>.</p> + +<p><b>AtLastPage<a name=atlastpage>($status='')</a></b><span style='mso-bookmark: +atlastpage'></span></p> + +<p>Returns true if at last page (1-based). Requires +PageExecute()/CachePageExecute() to be called. See <a href="#ex8">Example 8</a>.</p> + +<p><b>Fields</b><a name=fields></a>(<b>$colname</b>)</p> + +<p>Returns the value of the associated column $<b>colname</b> for the current +row. The column name is case-insensitive.</p> + +<p>This is a convenience function. For higher performance, use <a +href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>. </p> + +<p><b>FetchRow</b><a name=fetchrow></a>()</p> + +<p>Returns array containing current row, or false if EOF. FetchRow( ) +internally moves to the next record after returning the current row. </p> + +<p>Warning: Do not mix using FetchRow() with MoveNext().</p> + +<p>Usage:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute($sql);<br> +if ($rs)<br> +<span style='mso-tab-count:1'>         </span>while ($arr = $rs-&gt;FetchRow()) {<br> +<span style='mso-tab-count:1'>         </span><span style='mso-spacerun:yes'>   </span>&nbsp;&nbsp;# process $arr<span +style='mso-tab-count:1'>       </span><br> +<span style='mso-tab-count:1'>         </span>}</pre></div> + +<p><b>FetchInto</b><a name=fetchinto></a>(<b>&amp;$array</b>)</p> + +<p>Sets $array to the current row. Returns PEAR_Error object if EOF, 1 if ok +(DB_OK constant). If PEAR is undefined, false is returned when EOF. FetchInto( +) internally moves to the next record after returning the current row. </p> + +<p>FetchRow() is easier to use. See above.</p> + +<p><b>FetchField<a name=fetchfield></a>($column_number)</b></p> + +<p>Returns an object containing the <b>name</b>, <b>type</b> and <b>max_length</b> +of the associated field. If the max_length cannot be determined reliably, it +will be set to -1. The column numbers are zero-based. See <a href="#ex2">example +2.</a></p> + +<p><b>FieldCount<a name=fieldcount></a>( )</b></p> + +<p>Returns the number of fields (columns) in the record set.</p> + +<p><b>RecordCount<a name=recordcount></a>( )</b></p> + +<p>Returns the number of rows in the record set. If the number of records +returned cannot be determined from the database driver API, we will buffer all +rows and return a count of the rows after all the records have been retrieved. +This buffering can be disabled (for performance reasons) by setting the global +variable $ADODB_COUNTRECS = false. When disabled, RecordCount( ) will return -1 +for certain databases. See the supported databases list above for more details. +</p> + +<p>RowCount is a synonym for RecordCount.</p> + +<p><b>PO_RecordCount<a name="po_recordcount"></a>($table, $where)</b></p> + +<p>Returns the number of rows in the record set. If the database does not +support this, it will perform a SELECT COUNT(*) on the table $table, with the +given $where condition to return an estimate of the recordset size.</p> + +<p>$numrows = $rs-&gt;PO_RecordCount(&quot;articles_table&quot;, +&quot;group=$group&quot;);</p> + +<p class=MsoNormal><b>NextRecordSet<a name=nextrecordset id=nextrecordset></a>()</b> +</p> + +<p>For databases that allow multiple recordsets to be returned in one query, +this function allows you to switch to the next recordset. Currently only +supported by mssql driver.</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute('execute return_multiple_rs');<br> +$arr1 = $rs-&gt;GetArray();<br> +$rs-&gt;NextRecordSet();<br> +$arr2 = $rs-&gt;GetArray();</pre></div> + +<p><b>FetchObject<a name=fetchobject></a>($toupper=true)</b></p> + +<p>Returns the current row as an object. If you set $toupper to true, then the +object fields are set to upper-case. Note: The newer FetchNextObject() is the +recommended way of accessing rows as objects. See below.</p> + +<p><b>FetchNextObject<a name=fetchnextobject></a>($toupper=true)</b></p> + +<p>Gets the current row as an object and moves to the next row automatically. +Returns false if at end-of-file. If you set $toupper to true, then the object +fields are set to upper-case. Note that for some drivers such as mssql, you +need to SetFetchMode(ADODB_FETCH_ASSOC) or SetFetchMode(ADODB_FETCH_BOTH).</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'>$rs = $db-&gt;Execute('select firstname,lastname from table');<br> +if ($rs) {<br> +<span style='mso-tab-count:1'>         </span>while ($o = $rs-&gt;FetchNextObject()) {<br> +<span style='mso-tab-count:2'>                 </span>print &quot;$o-&gt;FIRSTNAME, $o-&gt;LASTNAME&lt;BR&gt;&quot;;<br> +<span style='mso-tab-count:1'>         </span>}<br> +}</pre></div> + +<p>There is some trade-off in speed in using FetchNextObject(). If performance +is important, you should access rows with the <code><span style='font-size: +10.0pt'>fields[]</span></code> array. <b>FetchObj<a name=fetchobj id=fetchobj></a>()</b> +</p> + +<p>Returns the current record as an object. Fields are not upper-cased, unlike +FetchObject. </p> + +<p><b>FetchNextObj<a name=fetchnextobj id=fetchnextobj></a>()</b> </p> + +<p>Returns the current record as an object and moves to the next record. If +EOF, false is returned. Fields are not upper-cased, unlike FetctNextObject. </p> + +<p><b>CurrentRow<a name=currentrow></a>( )</b></p> + +<p>Returns the current row of the record set. 0 is the first row.</p> + +<p><b>AbsolutePosition<a name=abspos></a>( )</b></p> + +<p>Synonym for <b>CurrentRow</b> for compatibility with ADO. Returns the +current row of the record set. 0 is the first row.</p> + +<p><b>MetaType<a name=metatype></a>($nativeDBType[,$field_max_length],[$fieldobj])</b></p> + +<p>Determine what <i>generic</i> meta type a database field type is given its +native type $<b>nativeDBType</b> as a string and the length of the field $<b>field_max_length</b>. +Note that field_max_length can be -1 if it is not known. The field object +returned by FetchField() can be passed in $<b>fieldobj</b> or as the 1st +parameter <b>$nativeDBType</b>. This is useful for databases such as <i>mysql</i> +which has additional properties in the field object such as <i>primary_key</i>. +</p> + +<p>Uses the field <b>blobSize</b> and compares it with $<b>field_max_length</b> +to determine whether the character field is actually a blob.</p> + +<p class=MsoNormal>For example, $db-&gt;MetaType('char') will return 'C'. </p> + +<p>Returns:</p> + +<ul type=disc> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>C</b>: Character fields + that should be shown in a &lt;input type=&quot;text&quot;&gt; tag. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>X</b>: Clob (character + large objects), or large text fields that should be shown in a + &lt;textarea&gt;</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>D</b>: Date field</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>T</b>: Timestamp field</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>L</b>: Logical field + (boolean or bit-field)</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>N</b>: Numeric field. + Includes decimal, numeric, floating point, and real. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>I</b>:&nbsp; Integer + field. </li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>R</b>: Counter or + Autoincrement field. Must be numeric.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>B</b>: Blob, or binary + large objects. </li> +</ul> + +<p>Since ADOdb 3.0, MetaType accepts $fieldobj as the first parameter, instead +of $nativeDBType. </p> + +<p><b>Close( )</b><a name=rsclose></a></p> + +<p>Closes the recordset, cleaning all memory and resources associated with the +recordset. </p> + +<p>If memory management is not an issue, you do not need to call this function +as recordsets are closed for you by PHP at the end of the script. SQL +statements such as INSERT/UPDATE/DELETE do not really return a recordset, so you +do not have to call Close() for such SQL statements.</p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h3>function rs2html<a name=rs2html></a>($adorecordset,[$tableheader_attributes], +[$col_titles])</h3> + +<p>This is a standalone function (rs2html = recordset to html) that is similar +to PHP's <i>odbc_result_all</i> function, it prints a ADORecordSet, $<b>adorecordset</b> +as a HTML table. $<b>tableheader_attributes</b> allow you to control the table <i>cellpadding</i>, +<i>cellspacing</i> and <i>border</i> attributes. Lastly you can replace the +database column names with your own column titles with the array $<b>col_titles</b>. +This is designed more as a quick debugging mechanism, not a production table +recordset viewer.</p> + +<p>You will need to include the file <i>tohtml.inc.php</i>.</p> + +<p>Example of rs2html:<a name=exrs2html></a></p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><b><span style='color:#336600'>&lt;?<br> +include('tohtml.inc.php')</span></b>; # load code common to ADOdb <br> +<b>include</b>('adodb.inc.php'); # load code common to ADOdb <br> +$<span style='color:#663300'>conn</span> = &amp;ADONewConnection('mysql');<span style='mso-spacerun:yes'>   </span># create a connection <br> +$<span style='color:#663300'>conn</span>-&gt;PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br> +$<span style='color:#663300'>sql</span> = 'select CustomerName, CustomerID from customers'; <br> +$<span style='color:#663300'>rs</span><span style='mso-spacerun:yes'>   </span>= $<span +style='color:#663300'>conn</span>-&gt;Execute($sql); <br> +<b><span style='color:#336600'>rs2html</span>($</b><b><span style='color:#663300'>rs</span>,'<i>border=2 cellpadding=3</i>',array('<i>Customer Name','Customer ID</i>'));<br> +?&gt;</b></pre></div> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h3>Differences between this ADOdb library and Microsoft ADO<a name=adodiff></a></h3> + +<ol start=1 type=1> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADOdb only supports + recordsets created by a connection object. Recordsets cannot be created + independently.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADO properties are implemented + as functions in ADOdb. This makes it easier to implement any enhanced ADO + functionality in the future.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADOdb's <span + style='font-family:"Courier New"'>ADORecordSet-&gt;Move()</span> uses + absolute positioning, not relative. Bookmarks are not supported.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'><span style='font-family: + "Courier New"'>ADORecordSet-&gt;AbsolutePosition() </span>cannot be used + to move the record cursor.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADO Parameter objects are + not supported. Instead we have the ADOConnection::<a href="#parameter">Parameter</a>( + ) function, which provides a simpler interface for calling preparing + parameters and calling stored procedures.</li> + <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto; + mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>Recordset properties for + paging records are available, but implemented as in <a href="#ex8">Example + 8</a>.</li> +</ol> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<h1>Database Driver Guide<a name=driverguide></a></h1> + +<p>This describes how to create a class to connect to a new database. To ensure +there is no duplication of work, kindly email me at jlim#natsoft.com if you +decide to create such a class.</p> + +<p>First decide on a name in lower case to call the database type. Let's say we +call it xbase. </p> + +<p>Then we need to create two classes ADODB_xbase and ADORecordSet_xbase in the +file adodb-xbase.inc.php.</p> + +<p>The simplest form of database driver is an adaptation of an existing ODBC +driver. Then we just need to create the class <i>ADODB_xbase extends ADODB_odbc</i> +to support the new <b>date</b> and <b>timestamp</b> formats, the <b>concatenation</b> +operator used, <b>true</b> and <b>false</b>. For the<i> ADORecordSet_xbase +extends ADORecordSet_odbc </i>we need to change the <b>MetaType</b> function. +See<b> adodb-vfp.inc.php</b> as an example.</p> + +<p>More complicated is a totally new database driver that connects to a new PHP +extension. Then you will need to implement several functions. Fortunately, you +do not have to modify most of the complex code. You only need to override a few +stub functions. See <b>adodb-mysql.inc.php</b> for example.</p> + +<p>The default date format of ADOdb internally is YYYY-MM-DD (Ansi-92). All +dates should be converted to that format when passing to an ADOdb date +function. See Oracle for an example how we use ALTER SESSION to change the +default date format in _pconnect _connect.</p> + +<p><b>ADOConnection Functions to Override</b></p> + +<p>Defining a constructor for your ADOConnection derived function is optional. +There is no need to call the base class constructor.</p> + +<p>_<b>connect</b>: Low level implementation of Connect. Returns true or false. +Should set the _<b>connectionID</b>.</p> + +<p>_<b>pconnect:</b> Low level implemention of PConnect. Returns true or false. +Should set the _<b>connectionID</b>.</p> + +<p>_<b>query</b>: Execute a query. Returns the queryID, or false.</p> + +<p>_<b>close: </b>Close the connection -- PHP should clean up all recordsets. </p> + +<p><b>ErrorMsg</b>: Stores the error message in the private variable _errorMsg. +</p> + +<p><b>ADOConnection Fields to Set</b></p> + +<p>_<b>bindInputArray</b>: Set to true if binding of parameters for SQL inserts +and updates is allowed using ?, eg. as with ODBC.</p> + +<p><b>fmtDate</b></p> + +<p><b>fmtTimeStamp</b></p> + +<p><b>true</b></p> + +<p><b>false</b></p> + +<p><b>concat_operator</b></p> + +<p><b>replaceQuote</b></p> + +<p><b>hasLimit</b> support SELECT * FROM TABLE LIMIT 10 of MySQL.</p> + +<p><b>hasTop</b> support Microsoft style SELECT TOP 10 * FROM TABLE.</p> + +<p><b>ADORecordSet Functions to Override</b></p> + +<p>You will need to define a constructor for your ADORecordSet derived class +that calls the parent class constructor.</p> + +<p><b>FetchField: </b>as documented above in ADORecordSet</p> + +<p>_<b>initrs</b>: low level initialization of the recordset: setup the _<b>numOfRows</b> +and _<b>numOfFields</b> fields -- called by the constructor.</p> + +<p>_<b>seek</b>: seek to a particular row. Do not load the data into the fields +array. This is done by _fetch. Returns true or false. Note that some +implementations such as Interbase do not support seek. Set canSeek to false.</p> + +<p>_<b>fetch</b>: fetch a row using the database extension function and then +move to the next row. Sets the <b>fields</b> array. If the parameter +$ignore_fields is true then there is no need to populate the <b>fields</b> +array, just move to the next row. then Returns true or false.</p> + +<p>_<b>close</b>: close the recordset</p> + +<p><b>Fields</b>: If the array row returned by the PHP extension is not an +associative one, you will have to override this. See adodb-odbc.inc.php for an +example. For databases such as MySQL and MSSQL where an associative array is +returned, there is no need to override this function.</p> + +<p><b>ADOConnection Fields to Set</b></p> + +<p>canSeek: Set to true if the _seek function works.</p> + +<h2>Optimizing PHP</h2> + +<p class=MsoNormal>For info on tuning PHP, read this article on <a +href="http://phplens.com/lens/php-book/optimizing-debugging-php.php">Optimizing +PHP</a>. </p> + +<h2>Change Log<a name=changes></a><a name=changelog></a></h2> + +<p><a name=5.09></a><b>5.09 25 June 2009</b> </p> +<p>Active Record: You can force column names to be quoted in INSERT and UPDATE statements, typically because you are using reserved words as column names by setting +ADODB_Active_Record::$_quoteNames = true; +<p>Added memcache and cachesecs to DSN. e.g. +<pre> + # we have a memcache servers mem1,mem2 on port 8888, compression=off and cachesecs=120 + $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0&cachesecs=120'; +</pre> +<p>Fixed up MetaColumns and MetaPrimaryIndexes() for php 5.3 compat. Thx http://adodb.pastebin.com/m52082b16 +<p>The postgresql driver's OffsetDate() apparently does not work with postgres 8.3. Fixed. +<p>Added support for magic_quotes_sybase in qstr() and addq(). Thanks Eloy and Sam Moffat. +<p>The oci8 driver did not handle LOBs properly when binding. Fixed. See http://phplens.com/lens/lensforum/msgs.php?id=17991. +<p>Datadict: In order to support TIMESTAMP with subsecond accuracy, added to datadict the new TS type. Supported by mssql, postgresql and oci8 (oracle). +Also changed oci8 $conn->sysTimeStamp to use 'SYSTIMESTAMP' instead of 'SYSDATE'. Should be backwards compat. +<p>Added support for PHP 5.1+ DateTime objects in DBDate and DBTimeStamp. This means that dates and timestamps will be managed by DateTime objects if you are running PHP 5.1+. +<p>Added new property to postgres64 driver to support returning I if type is unique int called $db->uniqueIisR, defaulting to true. See http://phplens.com/lens/lensforum/msgs.php?id=17963 +<p>Added support for bindarray in adodb_GetActiveRecordsClass with SelectLimit in adodb-active-record.inc.php. +<p>Transactions now allowed in ado_access driver. Thx to petar.petrov.georgiev#gmail.com. +<p>Sessions2 garbage collection is now much more robust. We perform ORDER BY to prevent deadlock in adodb-sessions2.inc.php. +<p>Fixed typo in pdo_sqlite driver. +<p><a name=5.08a></a><b>5.08a 17 Apr 2009</b> </p> +<p>Fixes wrong version number string. +<p>Incorrect + in adodb-datadict.inc.php removed. +<p>Fixes missing OffsetDate() function in pdo. Thx paul#mantisforge.org. +<p><a name=5.08></a><b>5.08 17 Apr 2009</b> </p> +<p>adodb-sybase.inc.php driver. Added $conn->charSet support. Thx Luis Henrique Mulinari (luis.mulinari#gmail.com) +<p>adodb-ado5.inc.php. Fixed some bind param issues. Thx Jirka Novak. +<p>adodb-ado5.inc.php. Now has improved error handling. +<p>Fixed typo in adodb-xmlschema03.inc.php. See XMLS_EXISTING_DATA, line 1501. Thx james johnson. +<p>Made $inputarr optional for _query() in all drivers. +<p>Fixed spelling mistake in flushall() in adodb.inc.ophp. +<p>Fixed handling of quotes in adodb_active_record::doquote. Thx Jonathan Hohle (jhohle#godaddy.com). +<p>Added new index parameter to adodb_active_record::setdatabaseadaptor. Thx Jonathan Hohle +<p>Fixed & readcache() reference compat problem with php 5.3 in adodb.Thx Jonathan Hohle. +<p>Some minor $ADODB_CACHE_CLASS definition issues in adodb.inc.php. +<p>Added Reset() function to adodb_active_record. Thx marcus. +<p>Minor dsn fix for pdo_sqlite in adodb.inc.php. Thx Sergey Chvalyuk. +<p>Fixed adodb-datadict _CreateSuffix() inconsistencies. Thx Chris Miller. +<p>Option to delete old fields $dropOldFlds in datadict ChangeTableSQL($table, $flds, $tableOptions, $dropOldFlds=false) added. Thx Philipp Niethammer. +<p>Memcache caching did not expire properly. Fixed. +<p>MetaForeignKeys for postgres7 driver changed from adodb_movenext to $rs->MoveNext (also in 4.99) +<p>Added support for ldap and ldaps url format in ldap driver. E.g. ldap://host:port/dn?attributes?scope?filter?extensions +<p><a name=5.07></a><b>5.07 26 Dec 2008</b> </p> + +<p>BeginTrans/CommitTrans/RollbackTrans return true/false correctly on +success/failure now for mssql, odbc, oci8, mysqlt, mysqli, postgres, pdo. </p> + +<p>Replace() now quotes all non-null values including numeric ones. </p> + +<p>Postgresql qstr() now returns booleans as <b>true</b> and <b>false</b> +without quotes. </p> + +<p>MetaForeignKeys in mysql and mysqli drivers had this problem: A table can +have two foreign keys pointing to the same column in the same table. The +original code will incorrectly report only the last column. Fixed. +https://sourceforge.net/tracker/index.php?func=detail&amp;aid=2287278&amp;group_id=42718&amp;atid=433976 +</p> + +<p>Passing in full ado connection string in $argHostname with ado drivers was +failing in adodb5 due to bug. Fixed. </p> + +<p>Fixed memcachelib flushcache and flushall bugs. Also fixed possible +timeCreated = 0 problem in readcache. (Also in adodb 4.992). Thanks AlexB_UK +(alexbarnes#hotmail.com). </p> + +<p>Fixed a notice in adodb-sessions2.inc.php, in _conn(). Thx bober +m.derlukiewicz#rocktech.remove_me.pl; </p> + +<p>ADOdb Active Record: Fixed some issues with incompatible fetch modes +(ADODB_FETCH_ASSOC) causing problems in UpdateActiveTable(). </p> + +<p>ADOdb Active Record: Added support for functions that support predefining +one-to-many relationships:<br> +&nbsp; <i>ClassHasMany ClassBelongsTo TableHasMany TableBelongsTo +TableKeyHasMany TableKeyBelongsTo</i>. <br> +You can also define your child/parent class in these functions, instead of the +default ADODB_Active_Record. Thx Arialdo Martini &amp; Chris R for idea. </p> + +<p>ADOdb Active Record: HasMany hardcoded primary key to &quot;id&quot;. Fixed. +</p> + +<p>Many pdo and pdo-sqlite fixes from Sid Dunayer [sdunayer#interserv.com]. </p> + +<p>CacheSelectLimit not working for mssql. Fixed. Thx AlexB. </p> + +<p>The rs2html function did not display hours in timestamps correctly. Now 24hr +clock used.</p> + +<p>Changed ereg* functions to use preg* functions as ereg* is deprecated in PHP 5.3. Modified sybase and postgresql drivers.</p> + +<p><a name=5.06></a><b>5.06 16 Oct 2008</b> </p> + +<p>Added driver adodb-pdo_sqlite.inc.php. Thanks Diogo Toscano +(diogo#scriptcase.net) for the code. </p> + +<p>Added support for <a href="docs-active-record.htm#onetomany">one-to-many relationships</a> +with BelongsTo() and HasMany() in adodb_active_record. </p> + +<p>Added BINARY type to mysql.inc.php (also in 4.991). </p> + +<p>Added support for SelectLimit($sql,-1,100) in oci8. (also in 4.991). </p> + +<p>New $conn-&gt;GetMedian($table, $field, $where='') to get median account no. +(also in 4.991) </p> + +<p>The rs2html() function in tohtml.inc.php did not handle dates with ':' in it +properly. Fixed. (also in 4.991) </p> + +<p>Added support for connecting to oci8 using $DB-&gt;Connect($ip, $user, $pwd, +&quot;SID=$sid&quot;); (also in 4.991) </p> + +<p>Added mysql type 'VAR_STRING' to MetaType(). (also in 4.991) </p> + +<p>The session and session2 code supports setfetchmode assoc properly now (also +in 4.991). </p> + +<p>Added concat support to pdo. Thx Andrea Baron. </p> + +<p>Changed db2 driver to use format &quot;Y-m-d H-i-s&quot; for datetime +instead of &quot;Y-m-d-H-i-s&quot; which was legacy from odbc_db2 conversion. </p> + +<p>Removed vestigal break on adodb_tz_offset in adodb-time.inc.php. </p> + +<p>MetaForeignKeys did not work for views in MySQL 5. Fixed. </p> + +<p>Changed error handling in GetActiveRecordsClass. </p> + +<p>Added better support for using existing driver when $ADODB_NEWCONNECTION +function returns false. </p> + +<p>In _CreateSuffix in adodb-datadict.inc.php, adding unsigned variable for +mysql. </p> + +<p>In adodb-xmlschema03.inc.php, changed addTableOpt to include db name. </p> + +<p>If bytea blob in postgresql is null, empty string was formerly returned. Now +null is returned. </p> + +<p>Changed db2 driver CreateSequence to support $start parameter. </p> + +<p>rs2html() now does not add nbsp to end if length of string &gt; 0 </p> + +<p>The oci8po FetchField() now only lowercases field names if ADODB_ASSOC_CASE +is set to 0. </p> + +<p>New mssqlnative drivers for php. TQ Garrett Serack of M'soft. <a +href="http://www.microsoft.com/downloads/details.aspx?FamilyId=61BF87E0-D031-466B-B09A-6597C21A2E2A&amp;displaylang=en">Download</a> +mssqlnative extension. Note that this is still in beta. </p> + +<p>Fixed bugs in memcache support. </p> + +<p>You can now change the return value of GetOne if no records are found using +the global variable $ADODB_GETONE_EOF. The default is null. To change it back +to the pre-4.99/5.00 behaviour of false, set $ADODB_GETONE_EOF = false; </p> + +<p>In Postgresql 8.2/8.3 MetaForeignkeys did not work. Fixed William Kolodny +William.Kolodny#gt-t.net </p> + +<p><a name=5.05></a><b>4.990/5.05 11 Jul 2008</b> </p> + +<p>Added support for multiple recordsets in mysqli &quot;Geisel Sierote&quot; +geisel#4up.com.br. See http://phplens.com/lens/lensforum/msgs.php?id=15917 </p> + +<p>Malcolm Cook added new Reload() function to Active Record. See +http://phplens.com/lens/lensforum/msgs.php?id=17474 </p> + +<p>Thanks Zoltan Monori [monzol#fotoprizma.hu] for bug fixes in iterator, +SelectLimit, GetRandRow, etc. </p> + +<p>Under heavy loads, the performance monitor for oci8 disables Ixora views. </p> + +<p>Fixed sybase driver SQLDate to use str_replace(). Also for adodb5, changed +sybase driver UnixDate and UnixTimeStamp calls to static. </p> + +<p>Changed oci8 lob handler to use &amp; reference +$this-&gt;_refLOBs[$numlob]['VAR'] = &amp;$var. </p> + +<p>We now strtolower the get_class() function in PEAR::isError() for php5 +compat. </p> + +<p>CacheExecute did not retrieve cache recordsets properly for 5.04 (worked in +4.98). Fixed. </p> + +<p>New ADODB_Cache_File class for file caching defined in adodb.inc.php. </p> + +<p>Farsi language file contribution by Peyman Hooshmandi Raad +(phooshmand#gmail.com) </p> + +<p>New API for creating your custom caching class which is stored in +$ADODB_CACHE: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>include &quot;/path/to/adodb.inc.php&quot;;</pre><pre>$ADODB_CACHE_CLASS = 'MyCacheClass';</pre><pre><o:p>&nbsp;</o:p></pre><pre>class MyCacheClass extends ADODB_Cache_File</pre><pre>{</pre><pre><span +style='mso-tab-count:1'>         </span>function writecache($filename, $contents,$debug=false){...}</pre><pre><span +style='mso-tab-count:1'>         </span>function &amp;readcache($filename, &amp;$err, $secs2cache, $rsClass){ ...}</pre><pre><span +style='mso-tab-count:1'>         </span> :</pre><pre>}</pre><pre><o:p>&nbsp;</o:p></pre><pre>$DB = NewADOConnection($driver);</pre><pre>$DB-&gt;Connect(...);<span style='mso-spacerun:yes'>  </span>## MyCacheClass created here and stored in $ADODB_CACHE global variable.</pre><pre><o:p>&nbsp;</o:p></pre><pre>$data = $rs-&gt;CacheGetOne($sql); ## MyCacheClass is used here for caching...</pre></div> + +<p>Memcache supports multiple pooled hosts now. Only if none of the pooled +servers can be contacted will a connect error be generated. Usage example +below: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$db = NewADOConnection($driver);</pre><pre>$db-&gt;memCache = true; /// should we use memCache instead of caching in files</pre><pre>$db-&gt;memCacheHost = array($ip1, $ip2, $ip3); /// $db-&gt;memCacheHost = $ip1; still works</pre><pre>$db-&gt;memCachePort = 11211; /// this is default memCache port</pre><pre>$db-&gt;memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)</pre><pre><o:p>&nbsp;</o:p></pre><pre>$db-&gt;Connect(...);</pre><pre>$db-&gt;CacheExecute($sql);</pre></div> + +<p><a name=4.98></a><b>4.98/5.04 13 Feb 2008</b> </p> + +<p>Fixed adodb_mktime problem which causes a performance bottleneck in $hrs. </p> + +<p>Added mysqli support to adodb_getcount(). </p> + +<p>Removed MYSQLI_TYPE_CHAR from MetaType(). </p> + +<p><a name=4.97></a><b>4.97/5.03 22 Jan 2008</b> </p> + +<p>Active Record: $ADODB_ASSOC_CASE=1 did not work properly. Fixed. </p> + +<p>Modified Fields() in recordset class to support display null fields in +FetchNextObject(). </p> + +<p>In ADOdb5, active record implementation, we now support column names with +spaces in them - we autoconvert the spaces to _ using __set(). Thx Daniel Cook. +http://phplens.com/lens/lensforum/msgs.php?id=17200 </p> + +<p>Removed $arg3 from mysqli SelectLimit. See +http://phplens.com/lens/lensforum/msgs.php?id=16243. Thx Zsolt Szeberenyi. </p> + +<p>Changed oci8 FetchField, which returns the max_length of BLOB/CLOB/NCLOB as +4000 (incorrectly) to -1. </p> + +<p>CacheExecute would sometimes return an error on Windows if it was unable to +lock the cache file. This is harmless and has been changed to a warning that +can be ignored. Also adodb_write_file() code revised. </p> + +<p>ADOdb perf code changed to only log sql if execution time &gt;= 0.05 +seconds. New $ADODB_PERF_MIN variable holds min sql timing. Any SQL with timing +value below this and is not causing an error is not logged. </p> + +<p>Also adodb_backtrace() now traces 1 level deeper as sometimes actual culprit +function is not displayed. </p> + +<p>Fixed a group by problem with adodb_getcount() for db's which are not +postgres/oci8 based. </p> + +<p>Changed mssql driver Parameter() from SQLCHAR to SQLVARCHAR: case 'string': +$type = SQLVARCHAR; break. </p> + +<p>Problem with mssql driver in php5 (for adodb 5.03) because some functions +are not static. Fixed. </p> + +<p><a name=4.96></a><b>4.96/5.02 24 Sept 2007</b> </p> + +<p>ADOdb perf for oci8 now has non-table-locking code when clearing the sql. +Slower but better transparency. Added in 4.96a and 5.02a. </p> + +<p>Fix adodb count optimisation. Preg_match did not work properly. Also rewrote +the ORDER BY stripping code in _adodb_getcount(), adodb-lib.inc.php. </p> + +<p>SelectLimit for oci8 not optimal for large recordsets when offset=0. Changed +$nrows check. </p> + +<p>Active record optimizations. Added support for assoc arrays in Set(). </p> + +<p>Now GetOne returns null if EOF (no records found), and false if error +occurs. Use ErrorMsg()/ErrorNo() to get the error. </p> + +<p>Also CacheGetRow and CacheGetCol will return false if error occurs, or empty +array() if EOF, just like GetRow and GetCol. </p> + +<p>Datadict now allows changing of types which are not resizable, eg. VARCHAR +to TEXT in ChangeTableSQL. -- Mateo Tibaquirá </p> + +<p>Added BIT data type support to adodb-ado.inc.php and adodb-ado5.inc.php. </p> + +<p>Ldap driver did not return actual ldap error messages. Fixed. </p> + +<p>Implemented GetRandRow($sql, $inputarr). Optimized for Oci8. </p> + +<p>Changed adodb5 active record to use static SetDatabaseAdapter() and removed +php4 constructor. Bas van Beek bas.vanbeek#gmail.com. </p> + +<p>Also in adodb5, changed adodb-session2 to use static function declarations +in class. Thx Daniel <st1:State w:st="on"><st1:place w:st="on">Berlin</st1:place></st1:State>. +</p> + +<p>Added &quot;Clear SQL Log&quot; to bottom of Performance screen. </p> + +<p>Sessions2 code echo'ed directly to the screen in debug mode. Now uses +ADOConnection::outp(). </p> + +<p>In mysql/mysqli, qstr(null) will return the string &quot;null&quot; instead +of empty quoted string &quot;''&quot;. </p> + +<p>postgresql optimizeTable in perf-postgres.inc.php added by Daniel Berlin +(mail#daniel-berlin.de) </p> + +<p>Added 5.2.1 compat code for oci8. </p> + +<p>Changed @@identity to SCOPE_IDENTITY() for multiple mssql drivers. Thx +Stefano Nari. </p> + +<p>Code sanitization introduced in 4.95 caused problems in European locales (as +float 3.2 was typecast to 3,2). Now we only sanitize if is_numeric fails. </p> + +<p>Added support for customizing ADORecordset_empty using +$this-&gt;rsPrefix.'empty'. By Josh Truwin. </p> + +<p>Added proper support for ALterColumnSQL for Postgresql in datadict code. +Thx. Josh Truwin. </p> + +<p>Added better support for MetaType() in mysqli when using an array recordset. +</p> + +<p>Changed parser for pgsql error messages in adodb-error.inc.php to +case-insensitive regex. </p> + +<p><a name=4.95></a><b>4.95/5.01 17 May 2007</b> </p> + +<p>CacheFlush debug outp() passed in invalid parameters. Fixed. </p> + +<p>Added Thai language file for adodb. Thx Trirat Petchsingh rosskouk#gmail.com +and Marcos Pont</p> + +<p>Added zerofill checking support to MetaColumns for mysql and mysqli. </p> + +<p>CacheFlush no longer deletes all files/directories. Only *.cache files +deleted.</p> + +<p>DB2 timestamp format changed to var $fmtTimeStamp = +&quot;'Y-m-d-H:i:s'&quot;;</p> + +<p>Added some code sanitization to AutoExecute in adodb-lib.inc.php.</p> + +<p>Due to typo, all connections in adodb-oracle.inc.php would become +persistent, even non-persistent ones. Fixed.</p> + +<p>Oci8 DBTimeStamp uses 24 hour time for input now, so you can perform string +comparisons between 2 DBTimeStamp values.</p> + +<p>Some PHP4.4 compat issues fixed in adodb-session2.inc.php</p> + +<p>For ADOdb 5.01, fixed some adodb-datadict.inc.php MetaType compat issues +with PHP5. </p> + +<p>The $argHostname was wiped out in adodb-ado5.inc.php. Fixed. </p> + +<p>Adodb5 version, added iterator support for adodb_recordset_empty. </p> + +<p>Adodb5 version,more error checking code now will use exceptions if +available. </p> + +<p><a name=4.94></a><b>4.94 23 Jan 2007</b> </p> + +<p>Active Record: $ADODB_ASSOC_CASE=2 did not work properly. Fixed. Thx +gmane#auxbuss.com. </p> + +<p>mysqli had bugs in BeginTrans() and EndTrans(). Fixed.</p> + +<p>Improved error handling when no database is connected for oci8. Thx Andy +Hassall.</p> + +<p>Names longer than 30 chars in oci8 datadict will be changed to random name. +Thx Eugenio. http://phplens.com/lens/lensforum/msgs.php?id=16182 </p> + +<p>Added var $upperCase = 'ucase' to access and ado_access drivers. Thx Renato +De Giovanni renato#cria.org.br</p> + +<p>Postgres64 driver, if preparing plan failed in _query, did not handle error +properly. Fixed. See http://phplens.com/lens/lensforum/msgs.php?id=16131. </p> + +<p>Fixed GetActiveRecordsClass() reference bug. See +http://phplens.com/lens/lensforum/msgs.php?id=16120 </p> + +<p>Added handling of nulls in adodb-ado_mssql.inc.php for qstr(). Thx to Felix +Rabinovich. </p> + +<p>Adodb-dict contributions by Gaetano: <br> ++ Support for INDEX in data-dict. Example: idx_ev1. The ability to define +indexes using the INDEX keyword was added in ADOdb 4.94. The following example +features mutiple indexes, including a compound index idx_ev1. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre><span style='mso-spacerun:yes'>  </span>event_id I(11) NOTNULL AUTOINCREMENT PRIMARY,</pre><pre><span style='mso-spacerun:yes'>  </span>event_type I(4) NOTNULL<span style='mso-spacerun:yes'>  </span><b>INDEX idx_evt</b>,</pre><pre><span style='mso-spacerun:yes'>  </span>event_start_date T DEFAULT NULL <b>INDEX id_esd</b>,</pre><pre><span style='mso-spacerun:yes'>  </span>event_end_date T DEFAULT '0000-00-00 00:00:00' <b>INDEX id_eted</b>,</pre><pre><span style='mso-spacerun:yes'>  </span>event_parent I(11) UNSIGNED NOTNULL DEFAULT 0 <b>INDEX id_evp</b>,</pre><pre><span style='mso-spacerun:yes'>  </span>event_owner I(11) DEFAULT 0 <b>INDEX idx_ev1</b>,</pre><pre><span style='mso-spacerun:yes'>  </span>event_project I(11) DEFAULT 0 <b>INDEX idx_ev1</b>,</pre><pre><span style='mso-spacerun:yes'>  </span>event_times_recuring I(11) UNSIGNED NOTNULL DEFAULT 0,</pre><pre><span style='mso-spacerun:yes'>  </span>event_icon C(20) DEFAULT 'obj/event',</pre><pre><span style='mso-spacerun:yes'>  </span>event_description X</pre></div> + +<p class=MsoNormal><br> ++ Prevents the generated SQL from including double drop-sequence statements for +REPLACE case of tables with autoincrement columns (on those dbs that emulate it +via sequences) <br> ++ makes any date defined as DEFAULT value for D and T columns work +cross-database, not just the &quot;sysdate&quot; value (as long as it is +specified using adodb standard format). See above example. </p> + +<p>Fixed pdo's GetInsertID() support. Thx Ricky Su. </p> + +<p>oci8 Prepare() now sets error messages if an error occurs. </p> + +<p>Added 'PT_BR' to SetDateLocale() -- brazilian portugese. </p> + +<p>charset in oci8 was not set correctly on *Connect() </p> + +<p>ADOConnection::Transpose() now appends as first column the field names. </p> + +<p>Added $ADODB_QUOTE_FIELDNAMES. If set to true, will autoquote field names in +AutoExecute(),GetInsertSQL(), GetUpdateSQL(). </p> + +<p>Transpose now adds the field names as the first column after transposition. </p> + +<p>Added === check in ADODB_SetDatabaseAdapter for $db, +adodb-active-record.inc.php. Thx Christian Affolter. </p> + +<p>Added ErrorNo() to adodb-active-record.inc.php. Thx ante#novisplet.com. </p> + +<p><a name=4.93></a><b>4.93 10 Oct 2006</b> </p> + +<p>Added support for multiple database connections in performance monitoring +code (adodb-perf.inc.php). Now all sql in multiple database connections can be +saved into one database ($ADODB_LOG_CONN). </p> + +<p>Added MetaIndexes() to odbc_mssql. </p> + +<p>Added connection property $db-&gt;null2null = 'null'. In +autoexecute/getinsertsql/getupdatesql, this value will be converted to a null. +Set this to a funny invalid value if you do not want null conversion. See +http://phplens.com/lens/lensforum/msgs.php?id=15902. </p> + +<p>Path disclosure problem in mysqli fixed. Thx Andy. </p> + +<p>Fixed typo in session_schema2.xml. </p> + +<p>Changed INT in oci8 to return correct precision in $fld-&gt;max_length, +MetaColumns(). <st1:place w:st="on"><st1:PlaceName w:st="on">Thx</st1:PlaceName> + <st1:PlaceName w:st="on">Eloy</st1:PlaceName> <st1:PlaceName w:st="on">Lafuente</st1:PlaceName> + <st1:PlaceType w:st="on">Plaza</st1:PlaceType></st1:place>. </p> + +<p>Patched postgres64 _connect to handle serverinfo(). see http://phplens.com/lens/lensforum/msgs.php?id=15887. +</p> + +<p>Added pdo fix for null columns. See +http://phplens.com/lens/lensforum/msgs.php?id=15889 </p> + +<p>For stored procedures, missing connection id now passed into mssql_query(). +Thx Ecsy (ecsy#freemail.hu). </p> + +<p><a name=4.92a></a><b>4.92a 30 Aug 2006</b> </p> + +<p>Syntax error in postgres7 driver. <st1:place w:st="on"><st1:PlaceName w:st="on">Thx</st1:PlaceName> + <st1:PlaceName w:st="on">Eloy</st1:PlaceName> <st1:PlaceName w:st="on">Lafuente</st1:PlaceName> + <st1:PlaceType w:st="on">Plaza</st1:PlaceType></st1:place>. </p> + +<p>Minor bug fixes - adodb informix 10 types added to adodb.inc.php. Thx +Fernando Ortiz. </p> + +<p><a name=4.92></a><b>4.92 29 Aug 2006</b> </p> + +<p>Better odbtp date support. </p> + +<p>Added IgnoreErrors() to bypass default error handling. </p> + +<p>The _adodb_getcount() function in adodb-lib.inc.php, some ORDER BY bug +fixes. </p> + +<p>For ibase and firebird, set $sysTimeStamp = &quot;CURRENT_TIMESTAMP&quot;. </p> + +<p>Fixed postgres connection bug: +http://phplens.com/lens/lensforum/msgs.php?id=11057. </p> + +<p>Changed CacheSelectLimit() to flush cache when $secs2cache==-1 due to +complaints from other users. </p> + +<p>Added support for using memcached with CacheExecute/CacheSelectLimit. +Requires memcache module PECL extension. Usage: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$db = NewADOConnection($driver);</pre><pre>$db-&gt;memCache = true; /// should we use memCache instead of caching in files</pre><pre>$db-&gt;memCacheHost = &quot;126.0.1.1&quot;; /// memCache host</pre><pre>$db-&gt;memCachePort = 11211; /// this is default memCache port</pre><pre>$db-&gt;memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)</pre><pre><o:p>&nbsp;</o:p></pre><pre>$db-&gt;Connect(...);</pre><pre>$db-&gt;CacheExecute($sql);</pre></div> + +<p>Implemented Transpose() for recordsets. Recordset must be retrieved using +ADODB_FETCH_NUM. First column becomes the column name. </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>$DB = NewADOConnection('mysql');</pre><pre>$DB-&gt;Connect(...);</pre><pre>$DB-&gt;SetFetchMode(ADODB_FETCH_NUM);</pre><pre>$rs = $DB-&gt;Execute('select productname,productid,unitprice from products limit 10');</pre><pre>$rs2 = $DB-&gt;Transpose($rs);</pre><pre>rs2html($rs2);</pre></div> + +<p><a name=4.91></a><b>4.91 2 Aug 2006</b> </p> + +<p>Major session code rewrite .... See session docs. </p> + +<p>PDO bindinputarray was not set properly for MySQL (changed from true to +false). </p> + +<p>Changed CacheSelectLimit() to re-cache when $secs2cache==0. This is one way +to flush the cache when SelectLimit is called. </p> + +<p>Added to quotes to mysql and mysqli: &quot;SHOW COLUMNS FROM `%s`&quot;; </p> + +<p>Removed accidental optgroup handling in GetMenu(). Fixed ibase _BlobDecode +for php5 compat, and also mem alloc issues for small blobs, thx +salvatori#interia.pl </p> + +<p>Mysql driver OffsetDate() speedup, useful for adodb-sessions. </p> + +<p>Fix for GetAssoc() PHP5 compat. See +http://phplens.com/lens/lensforum/msgs.php?id=15425 </p> + +<p>Active Record - If inserting a record and the value of a primary key field +is null, then we do not insert that field in as we assume it is an +auto-increment field. Needed by mssql. </p> + +<p>Changed postgres7 MetaForeignKeys() see http://phplens.com/lens/lensforum/msgs.php?id=15531 +</p> + +<p>DB2 will now return db2_conn_errormsg() when it is a connection error. </p> + +<p><a name=4.90></a><b>4.90 8 June 2006</b> </p> + +<p>Changed adodb_countrec() in adodb-lib.inc.php to allow LIMIT to be used as a +speedup to reduce no of records counted. </p> + +<p>Added support for transaction modes for postgres and oci8 with +SetTransactionMode(). These transaction modes affect all subsequent +transactions of that connection. </p> + +<p>Thanks to Halmai Csongor for suggestion. </p> + +<p>Removed $off = $fieldOffset - 1 line in db2 driver, FetchField(). Tx Larry +Menard. </p> + +<p>Added support for PHP5 objects as Execute() bind parameters using __toString +(eg. Simple-XML). Thx Carl-Christian Salvesen. </p> + +<p>Rounding in tohtml.inc.php did not work properly. Fixed. </p> + +<p>MetaIndexes in postgres fails when fields are deleted then added in again +because the attnum has gaps in it. See +http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1451245&amp;group_id=42718&amp;atid=433976. +Fixed. </p> + +<p>MetaForeignkeys in mysql and mysqli did not work when +fetchMode==ADODB_FETCH_ASSOC used. Fixed. </p> + +<p>Reference error in AutoExecute() fixed. </p> + +<p>Added macaddr postgres type to MetaType. Maps to 'C'. </p> + +<p>Added to _connect() in adodb-ado5.inc.php support for $database and +$dataProvider parameters. Thx Larry Menard. </p> + +<p>Added support for sequences in adodb-ado_mssql.inc.php. Thx Larry Menard. </p> + +<p>Added ADODB_SESSION_READONLY. </p> + +<p>Added session expiryref support to crc32 mode, and in LOB code. </p> + +<p>Clear _errorMsg in postgres7 driver, so that ErrorMsg() displays properly +when no error occurs. </p> + +<p>Added BindDate and BindTimeStamp </p> + +<p><a name=4.81></a><b>4.81 3 May 2006</b> </p> + +<p>Fixed variable ref errors in adodb-ado5.inc.php in _query(). </p> + +<p>Mysqli setcharset fix using method_exists(). </p> + +<p>The adodb-perf.inc.php CreateLogTable() code now works for user-defined +table names. </p> + +<p>Error in ibase_blob_open() fixed. See +http://phplens.com/lens/lensforum/msgs.php?id=14997 </p> + +<p><a name=4.80></a><b>4.80 8 Mar 2006</b> </p> + +<p>Added activerecord support. </p> + +<p>Added mysql $conn-&gt;compat323 = true if you want MySQL 3.23 compat +enabled. Fixes GetOne() Select-Limit problems. </p> + +<p>Added adodb-xmlschema03.inc.php to support XML Schema version 3 and updated +adodb-datadict.htm docs. </p> + +<p>Better memory management in Execute. Thx Mike Fedyk. </p> + +<p><a name=4.72></a><b>4.72 21 Feb 2006</b> </p> + +<p>Added 'new' DSN parameter for NConnect(). </p> + +<p>Pager now sanitizes $PHP_SELF to protect against XSS. Thx to James Bercegay +and others. </p> + +<p>ADOConnection::MetaType changed to setup $rs-&gt;connection correctly. </p> + +<p>New native DB2 driver contributed by Larry Menard, Dan Scott, Andy +Staudacher, Bharat Mediratta. </p> + +<p>The mssql CreateSequence() did not BEGIN TRANSACTION correctly. Fixed. Thx +Sean Lee. </p> + +<p>The _adodb_countrecs() function in adodb-lib.inc.php has been revised to +handle more ORDER BY variations. </p> + +<p><a name=4.71></a><b>4.71 24 Jan 2006</b> </p> + +<p>Fixes postgresql security issue related to binary strings. Thx to Andy +Staudacher. </p> + +<p>Several DSN bugs found: </p> + +<p>1. Fix bugs in DSN connections introduced in 4.70 when underscores are found +in the DSN. </p> + +<p>2. DSN with _ did not work properly in PHP5 (fine in PHP4). Fixed. </p> + +<p>3. Added support for PDO DSN connections in NewADOConnection(), and database +parameter in PDO::Connect(). </p> + +<p>The oci8 datetime flag not correctly implemented in ADORecordSet_array. +Fixed. </p> + +<p>Added BlobDelete() to postgres, as a counterpoint to UpdateBlobFile(). </p> + +<p>Fixed GetInsertSQL() to support oci8po. </p> + +<p>Fixed qstr() issue with postgresql with \0 in strings. </p> + +<p>Fixed some datadict driver loading issues in _adodb_getdriver(). </p> + +<p>Added register shutdown function session_write_close in +adodb-session.inc.php for PHP 5 compat. See +http://phplens.com/lens/lensforum/msgs.php?id=14200. </p> + +<p><a name=4.70></a><b>4.70 6 Jan 2006</b> </p> + +<p>Many fixes from Danila Ulyanov to ibase, oci8, postgres, mssql, odbc_oracle, +odbtp, etc drivers. </p> + +<p>Changed usage of binary hint in adodb-session.inc.php for mysql. See +http://phplens.com/lens/lensforum/msgs.php?id=14160 </p> + +<p>Fixed invalid variable reference problem in undomq(), adodb-perf.inc.php. </p> + +<p>Fixed http://phplens.com/lens/lensforum/msgs.php?id=14254 in +adodb-perf.inc.php, _DBParameter() settings of fetchmode was wrong. </p> + +<p>Fixed security issues in server.php and tmssql.php discussed by Andreas +Sandblad in a Secunia security advisory. Added $ACCEPTIP = 127.0.0.1 and +changed suggested root password to something more secure. </p> + +<p>Changed pager to close recordset after RenderLayout(). </p> + +<p><a name=4.68></a><b>4.68 25 Nov 2005</b> </p> + +<p>PHP 5 compat for mysqli. MetaForeignKeys repeated twice and +MYSQLI_BINARY_FLAG missing. </p> + +<p>PHP 5.1 support for postgresql bind parameters using ? did not work if &gt;= +10 parameters. Fixed. Thx to Stanislav Shramko. </p> + +<p>Lots of PDO improvements. </p> + +<p>Spelling error fixed in mysql MetaForeignKeys, $associative parameter. </p> + +<p><a name=4.67></a><b>4.67 16 Nov 2005</b> </p> + +<p>Postgresql not_null flag not set to false correctly. Thx Cristian MARIN. </p> + +<p>We now check in Replace() if key is in fieldArray. Thx Sébastien Vanvelthem. +</p> + +<p>_file_get_contents() function was missing in xmlschema. fixed. </p> + +<p>Added week in year support to SQLDate(), using 'W' flag. Thx Spider. </p> + +<p>In sqlite metacolumns was repeated twice, causing PHP 5 problems. Fixed. </p> + +<p>Made debug output XHTML compliant. </p> + +<p><a name=4.66></a><b>4.66 28 Sept 2005</b> </p> + +<p>ExecuteCursor() in oci8 did not clean up properly on failure. Fixed. </p> + +<p>Updated xmlschema.dtd, by &quot;Alec Smecher&quot; asmecher#smecher.bc.ca </p> + +<p>Hardened SelectLimit, typecasting nrows and offset to integer. </p> + +<p>Fixed misc bugs in AutoExecute() and GetInsertSQL(). </p> + +<p>Added $conn-&gt;database as the property holding the database name. The +older $conn-&gt;databaseName is retained for backward compat. </p> + +<p>Changed _adodb_backtrace() compat check to use function_exists(). </p> + +<p>Bug in postgresql MetaIndexes fixed. Thx Kevin Jamieson. </p> + +<p>Improved OffsetDate for MySQL, reducing rounding error. </p> + +<p>Metacolumns added to sqlite. Thx Mark Newnham. </p> + +<p>PHP 4.4 compat fixes for GetAssoc(). </p> + +<p>Added postgresql bind support for php 5.1. Thx Cristiano da Cunha Duarte </p> + +<p>OffsetDate() fixes for postgresql, typecasting strings to date or timestamp. +</p> + +<p>DBTimeStamp formats for mssql, odbc_mssql and postgresql made to conform +with other db's. </p> + +<p>Changed PDO constants from PDO_ to PDO:: to support latest spec. </p> + +<p><a name=4.65></a><b>4.65 22 July 2005</b> </p> + +<p>Reverted 'X' in mssql datadict to 'TEXT' to be compat with mssql driver. +However now you can set $datadict-&gt;typeX = 'varchar(4000)' or 'TEXT' or +'CLOB' for mssql and oci8 drivers. </p> + +<p>Added charset support when using DSN for Oracle. </p> + +<p>_adodb_getmenu did not use fieldcount() to get number of fields. Fixed. </p> + +<p>MetaForeignKeys() for mysql/mysqli contributed by Juan Carlos Gonzalez. </p> + +<p>MetaDatabases() now correctly returns an array for mysqli driver. Thx +Cristian MARIN. </p> + +<p>CompleteTrans(false) did not return false. Fixed. Thx to JMF. </p> + +<p>AutoExecute() did not work with Oracle. Fixed. Thx José Moreira. </p> + +<p>MetaType() added to connection object. </p> + +<p>More PHP 4.4 reference return fixes. Thx Ryan C Bonham and others. </p> + +<p><a name=4.64></a><b>4.64 20 June 2005</b> </p> + +<p>In datadict, if the default field value is set to '', then it is not applied +when the field is created. Fixed by Eugenio. </p> + +<p>MetaPrimaryKeys for postgres did not work because of true/false change in +4.63. Fixed. </p> + +<p>Tested ocifetchstatement in oci8. Rejected at the end. </p> + +<p>Added port to dsn handling. Supported in postgres, mysql, mysqli,ldap. </p> + +<p>Added 'w' and 'l' to mysqli SQLDate(). </p> + +<p>Fixed error handling in ldap _connect() to be more consistent. Also added +ErrorMsg() handling to ldap. </p> + +<p>Added support for union in _adodb_getcount, adodb-lib.inc.php for postgres +and oci8. </p> + +<p>rs2html() did not work with null dates properly. </p> + +<p>PHP 4.4 reference return fixes. </p> + +<p><a name=4.63></a><b>4.63 18 May 2005</b> </p> + +<p>Added $nrows<0 check to mysqli's SelectLimit(). +<p>Added OptimizeTable() and OptimizeTables() in adodb-perf.inc.php. By Markus Staab. +<p>PostgreSQL inconsistencies fixed. true and false set to TRUE and FALSE, and boolean type in datadict-postgres.inc.php set +to 'L' => 'BOOLEAN'. Thx Kevin Jamieson. +<p>New adodb_session_create_table() function in adodb-session.inc.php. By Markus Staab. +<p>Added null check to UserTimeStamp(). +<p>Fixed typo in mysqlt driver in adorecordset. Thx to Andy Staudacher. +<p>GenID() had a bug in the raiseErrorFn handling. Fixed. Thx Marcos Pont. +<p>Datadict name quoting now handles ( ) in index fields correctly - they aren't part of the index field. ></p> + +<p>Performance monitoring: (1) oci8 Ixora checks moved down; (2) expensive sql +changed so that only those sql with count(*)&gt;1 are shown; (3) changed sql1 +field to a length+crc32 checksum - this breaks backward compat. </p> + +<p>We remap firebird15 to firebird in data dictionary. </p> + +<p><a name=4.62></a><b>4.62 2 Apr 2005</b> </p> + +<p>Added 'w' (dow as 0-6 or 1-7) and 'l' (dow as string) for SQLDate for oci8, +postgres and mysql. </p> + +<p>Rolled back MetaType() changes for mysqli done in prev version. </p> + +<p>Datadict change by chris, cblin#tennaxia.com data mappings from: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>oci8:<span style='mso-spacerun:yes'>  </span>X-&gt;varchar(4000) XL-&gt;CLOB</pre><pre>mssql: X-&gt;XL-&gt;TEXT</pre><pre>mysql: X-&gt;XL-&gt;LONGTEXT</pre><pre>fbird: X-&gt;XL-&gt;varchar(4000)</pre></div> + +<p>to: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p>&nbsp;</o:p></pre><pre>oci8:<span style='mso-spacerun:yes'>  </span>X-&gt;varchar(4000) XL-&gt;CLOB</pre><pre>mssql: X-&gt;VARCHAR(4000) XL-&gt;TEXT</pre><pre>mysql: X-&gt;TEXT<span style='mso-spacerun:yes'>          </span>XL-&gt;LONGTEXT</pre><pre>fbird: X-&gt;VARCHAR(4000) XL-&gt;VARCHAR(32000)</pre></div> + +<p>Added $connection-&gt;disableBlobs to postgresql to improve performance when +no bytea is used (2-5% improvement). </p> + +<p>Removed all HTTP_* vars. </p> + +<p>Added $rs-&gt;tableName to be set before calling AutoExecute(). </p> + +<p>Alex Rootoff rootoff#pisem.net contributed ukrainian language file. </p> + +<p>Added new mysql_option() support using $conn-&gt;optionFlags array. </p> + +<p>Added support for ldap_set_option() using the $LDAP_CONNECT_OPTIONS global +variable. Contributed by Josh Eldridge. </p> + +<p>Added LDAP_* constant definitions to ldap. </p> + +<p>Added support for boolean bind variables. We use $conn-&gt;false and +$conn-&gt;true to hold values to set false/true to. </p> + +<p>We now do not close the session connection in adodb-session.inc.php as other +objects could be using this connection. </p> + +<p>We now strip off \0 at end of Ixora SQL strings in $perf-&gt;tohtml() for +oci8. </p> + +<p><a name=4.61></a><b>4.61 23 Feb 2005</b> </p> + +<p>MySQLi added support for mysqli_connect_errno() and mysqli_connect_error(). </p> + +<p>Massive improvements to alpha PDO driver. </p> + +<p>Quote string bind parameters logged by performance monitor for easy type +checking. Thx Jason Judge. </p> + +<p>Added support for $role when connecting with Interbase/firebird. </p> + +<p>Added support for enum recognition in MetaColumns() mysql and mysqli. Thx +Amedeo Petrella. </p> + +<p>The sybase_ase driver contributed by Interakt Online. Thx Cristian Marin +cristic#interaktonline.com. </p> + +<p>Removed not_null, has_default, and default_value from ADOFieldObject. </p> + +<p>Sessions code, fixed quoting of keys when handling LOBs in session write() +function. </p> + +<p>Sessions code, added adodb_session_regenerate_id(), to reduce risk of +session hijacking by changing session cookie dynamically. Thx Joe Li. </p> + +<p>Perf monitor, polling for CPU did not work for PHP 4.3.10 and 5.0.0-5.0.3 +due to PHP bugs, so we special case these versions. </p> + +<p>Postgresql, UpdateBlob() added code to handle type==CLOB. </p> + +<p><a name=4.60></a><b>4.60 24 Jan 2005</b> </p> + +<p>Implemented PEAR DB's autoExecute(). Simplified design because I don't like +using constants when strings work fine. </p> + +<p>_rs2serialize will now update $rs-&gt;sql and $rs-&gt;oldProvider. </p> + +<p>Added autoExecute(). </p> + +<p>Added support for postgres8 driver. Currently just remapped to postgres7 +driver. </p> + +<p>Changed oci8 _query(), so that OCIBindByName() sets the length to -1 if +element size is &gt; 4000. This provides better support for LONGs. </p> + +<p>Added SetDateLocale() support for <st1:country-region w:st="on"><st1:place + w:st="on">netherlands</st1:place></st1:country-region> (Nl). </p> + +<p>Spelling error in pivot code ($iff should be $iif). </p> + +<p>mysql insert_id() did not work with mysql 3.x. Fixed. </p> + +<p>&quot;\r\n&quot; not converted to spaces correctly in exporting data. Fixed. +</p> + +<p>_nconnect() in mysqli did not return value correctly. Fixed. </p> + +<p>Arne Eckmann contributed danish language file. </p> + +<p>Added clone() support to FetchObject() for PHP5.</p> + +<p>Removed SQL_CUR_USE_ODBC from odbc_mssql.</p> + +<p><a name=4.55></a><b>4.55 5 Jan 2005</b> </p> + +<p>Found bug in Execute() with bind params for db's that do not support binding +natively. </p> + +<p>DropSequence() now correctly uses default parameter. </p> + +<p>Now Execute() ignores locale for floats, so 1.23 is NEVER converted to 1,23. +</p> + +<p>SetFetchMode() not properly saved in adodb-perf, suspicious sql and +expensive sql. Fixed. </p> + +<p>Added INET to postgresql metatypes. Thx motzel. </p> + +<p>Allow oracle hints to work when counting with _adodb_getcount in +adodb-lib.inc.php. Thx Chris Wrye. </p> + +<p>Changed mysql insert_id() to use SELECT LAST_INSERT_ID(). </p> + +<p>If alter col in datadict does not modify col type/size of actual col, then +it is removed from alter col code. By Mark Newham. Not perfect as MetaType() +!== ActualType(). </p> + +<p>Added handling of view fields in metacolumns() for postgresql. Thx Renato De +Giovanni. </p> + +<p>Added to informix MetaPrimaryKeys and MetaColumns fixes for null bit. Thx to +Cecilio Albero. </p> + +<p>Removed obsolete connection_timeout() from perf code. </p> + +<p>Added support for arrayClass in adodb-csv.inc.php. </p> + +<p>RSFilter now accepts methods of the form $array($obj, 'methodname'). Thx to +blake#near-time.com. </p> + +<p>Changed CacheFlush to $cmd = 'rm -rf +'.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/'; </p> + +<p>For better cursor concurrency, added code to free ref cursors in oci8 when +$rs-&gt;Close() is called. Note that CLose() is called internally by the Get* +functions too. </p> + +<p>Added IIF support for access when pivoting. Thx Volodia Krupach. </p> + +<p>Added mssql datadict support for timestamp. Thx Alexios. </p> + +<p>Informix pager fix. By Mario Ramirez. </p> + +<p>ADODB_TABLE_REGEX now includes ':'. By Mario Ramirez. </p> + +<p>Mark Newnham contributed MetaIndexes for oci8 and db2. </p> + +<p><a name=4.54></a><b>4.54 5 Nov 2004</b> </p> + +<p>Now you can set $db-&gt;charSet = ?? before doing a Connect() in oci8. </p> + +<p>Added adodbFetchMode to sqlite. </p> + +<p>Perf code, added a string typecast to substr in adodb_log_sql(). </p> + +<p>Postgres: Changed BlobDecode() to use po_loread, added new $maxblobsize +parameter, and now it returns the blob instead of sending it to stdout - make +sure to mention that as a compat warning. Also added $db-&gt;IsOID($oid) +function; uses a heuristic, not guaranteed to work 100%. </p> + +<p>Contributed arabic language file by &quot;El-Shamaa, Khaled&quot; +k.el-shamaa#cgiar.org </p> + +<p>PHP5 exceptions did not handle @ protocol properly. Fixed. </p> + +<p>Added ifnull handling for postgresql (using coalesce). </p> + +<p>Added metatables() support for Postgresql 8.0 (no longer uses pg_% +dictionary tables). </p> + +<p>Improved Sybase ErrorMsg() function. By Gaetano Giunta. </p> + +<p>Improved oci8 SelectLimit() to use Prepare(). By Cristiano Duarte. </p> + +<p>Type-cast $row parameter in ifx_fetch_row() to int. Thx stefan bodgan. </p> + +<p>Ralf becker contributed improvements in postgresql, sapdb, mysql data +dictionary handling:<br> +- MySql and Postgres MetaType was reporting every int column which was part of +a primary key and unique as serial<br> +- Postgres was not reporting the scale of decimal types<br> +- MaxDB was padding the defaults of none-string types with spaces<br> +- MySql now correctly converts enum columns to varchar </p> + +<p>Ralf also changed Postgresql datadict:<br> +- you cant add NOT NULL columns in postgres in one go, they need to be added as +NULL and then altered to NOT NULL<br> +- AlterColumnSQL could not change a varchar column with numbers into an integer +column, postgres need an explicit conversation<br> +- a re-created sequence was not set to the correct value, if the name was the +old name (no implicit sequence), now always the new name of the implicit +sequence is used</p> + +<p>Sergio Strampelli added extra $intoken check to Lens_ParseArgs() in datadict +code. </p> + +<p><a name=4.53></a><b>4.53 28 Sept 2004</b> </p> + +<p>FetchMode cached in recordset is sometimes mapped to native db fetchMode. +Normally this does not matter, but when using cached recordsets, we need to +switch back to using adodb fetchmode. So we cache this in +$rs-&gt;adodbFetchMode if it differs from the db's fetchMode. </p> + +<p>For informix we now set canSeek = false driver because stefan bodgan tells +me that seeking doesn't work. </p> + +<p>SetDateLocale() never worked till now ;-) Thx david#tomato.it </p> + +<p>Set $_bindInputArray = true in sapdb driver. Required for clob support. </p> + +<p>Fixed some PEAR::DB emulation issues with isError() and isWarning. Thx to +Gert-Rainer Bitterlich. </p> + +<p>Empty() used in getupdatesql without strlen() check. Fixed.</p> + +<p>Added unsigned detection to mysql and mysqli drivers. Thx to dan cech. </p> + +<p>Added hungarian language file. Thx to Halászvári Gábor. </p> + +<p>Improved fieldname-type formatting of datadict SQL generated (adding +$widespacing parameter to _GenField). </p> + +<p>Datadict oci8 DROP CONSTRAINTS misspelt. Fixed. Thx Mark Newnham. </p> + +<p>Changed odbtp to dynamically change databaseType based on connection, eg. +from 'odbtp' to 'odbtp_mssql' when connecting to mssql database. </p> + +<p>In datadict, MySQL I4 was wrongly mapped to MEDIUMINT, which is actually I3. +Fixed. </p> + +<p>Fixed mysqli MetaType() recognition. Mysqli returns numeric types unlike +mysql extension. Thx Francesco Riosa. </p> + +<p>VFP odbc driver curmode set wrongly, causing problems with memo fields. +Fixed. </p> + +<p>Odbc driver did not recognize odbc version 2 driver date types properly. +Fixed. Thx Bostjan. </p> + +<p>ChangeTableSQL() fixes to datadict-db2.inc.php by Mark Newnham. </p> + +<p>Perf monitoring with odbc improved. Now we try in perf code to manually set +the sysTimeStamp using date() if sysTimeStamp is empty. </p> + +<p>All <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City> +errors are thrown as exceptions in PHP5. So we added exception handling to ado +in PHP5 by creating new adodb-ado5.inc.php driver. </p> + +<p>Added IsConnected(). Returns true if connection object connected. By +Luca.Gioppo. </p> + +<p>&quot;Ralf Becker&quot; RalfBecker#digitalROCK.de contributed new sapdb +data-dictionary driver and a large patch that implements field and table +renaming for oracle, mssql, postgresql, mysql and sapdb. See the new RenameTableSQL() +and RenameColumnSQL() functions. </p> + +<p>We now check ExecuteCursor to see if PrepareSP was initially called. </p> + +<p>Changed oci8 datadict to use MODIFY for $dd-&gt;alterCol. Thx Mark Newnham. </p> + +<p><a name=4.52></a><b>4.52 10 Aug 2004</b> </p> + +<p>Bug found in Replace() when performance logging enabled, introduced in ADOdb +4.50. Fixed. </p> + +<p>Replace() checks update stmt. If update stmt fails, we now return +immediately. Thx to alex. </p> + +<p>Added support for $ADODB_FORCE_TYPE in GetUpdateSQL/GetInsertSQL. Thx to +niko. </p> + +<p>Added ADODB_ASSOC_CASE support to postgres/postgres7 driver. </p> + +<p>Support for DECLARE stmt in oci8. Thx Lochbrunner. </p> + +<p><a name=4.51></a><b>4.51 29 July 2004</b> </p> + +<p>Added adodb-xmlschema 1.0.2. Thx dan and richard. </p> + +<p>Added new adorecordset_ext_* classes. If ADOdb extension installed for +mysql, mysqlt and oci8 (but not oci8po), we use the superfast ADOdb extension +code for movenext. </p> + +<p>Added schema support to mssql and odbc_mssql MetaPrimaryKeys(). </p> + +<p>Patched MSSQL driver to support PHP NULL and Boolean values while binding +the input array parameters in the _query() function. By Stephen Farmer. </p> + +<p>Added support for clob's for mssql, UpdateBlob(). Thx to +gfran#directa.com.br </p> + +<p>Added normalize support for postgresql (true=lowercase table name, or +false=case-sensitive table names) to MetaColumns($table, $normalize=true). </p> + +<p>PHP5 variant dates in <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City> +not working. Fixed in adodb-ado.inc.php. </p> + +<p>Constant ADODB_FORCE_NULLS was not working properly for many releases (for +GetUpdateSQL). Fixed. Also GetUpdateSQL strips off ORDER BY now - thx Elieser +Leão. </p> + +<p>Perf Monitor for oci8 now dynamically highlights optimizer_* params if too +high/low. </p> + +<p>Added dsn support to NewADOConnection/ADONewConnection. </p> + +<p>Fixed out of page bounds bug in _adodb_pageexecute_all_rows() Thx to +&quot;Sergio Strampelli&quot; sergio#rir.it </p> + +<p>Speedup of movenext for mysql and oci8 drivers. </p> + +<p>Moved debugging code _adodb_debug_execute() to adodb-lib.inc.php. </p> + +<p>Fixed postgresql bytea detection bug. See +http://phplens.com/lens/lensforum/msgs.php?id=9849. </p> + +<p>Fixed ibase datetimestamp typo in PHP5. Thx stefan. </p> + +<p>Removed whitespace at end of odbtp drivers. </p> + +<p>Added db2 metaprimarykeys fix. </p> + +<p>Optimizations to MoveNext() for mysql and oci8. Misc speedups to Get* +functions. </p> + +<p><a name=4.50></a><b>4.50 6 July 2004</b> </p> + +<p>Bumped it to 4.50 to avoid confusion with PHP 4.3.x series. </p> + +<p>Added db2 metatables and metacolumns extensions. </p> + +<p>Added alpha PDO driver. Very buggy, only works with odbc. </p> + +<p>Tested mysqli. Set poorAffectedRows = true. Cleaned up movenext() and +_fetch(). </p> + +<p>PageExecute does not work properly with php5 (return val not a variable). +Reported Dmytro Sychevsky sych#php.com.ua. Fixed. </p> + +<p>MetaTables() for mysql, $showschema parameter was not backward compatible +with older versions of adodb. Fixed. </p> + +<p>Changed mysql GetOne() to work with mysql 3.23 when using with non-select +stmts (e.g. SHOW TABLES). </p> + +<p>Changed TRIG_ prefix to a variable in datadict-oci8.inc.php. Thx to +Luca.Gioppo#csi.it. </p> + +<p>New to adodb-time code. We allow you to define your own daylights savings +function, adodb_daylight_sv for pre-1970 dates. If the function is defined +(somewhere in an include), then you can correct for daylights savings. See +http://phplens.com/phpeverywhere/node/view/16#daylightsavings for more info. </p> + +<p>New sqlitepo driver. This is because assoc mode does not work like other +drivers in sqlite. Namely, when selecting (joining) multiple tables, in assoc +mode the table names are included in the assoc keys in the &quot;sqlite&quot; +driver. In &quot;sqlitepo&quot; driver, the table names are stripped from the +returned column names. When this results in a conflict, the first field get +preference. Contributed by Herman Kuiper herman#ozuzo.net </p> + +<p>Added $forcenull parameter to GetInsertSQL/GetUpdateSQL. Idea by Marco +Aurelio Silva. </p> + +<p>More XHTML changes for GetMenu. By Jeremy Evans. </p> + +<p>Fixes some ibase date issues. Thx to stefan bogdan. </p> + +<p>Improvements to mysqli driver to support $ADODB_COUNTRECS. </p> + +<p>Fixed adodb-csvlib.inc.php problem when reading stream from socket. We need +to poll stream continiously. </p> + +<p><a name=4.23></a><b>4.23 16 June 2004</b> </p> + +<p>New interbase/firebird fixes thx to Lester Caine. Driver fixes a problem +with getting field names in the result array, and corrects a couple of data +conversions. Also we default to dialect3 for firebird. Also ibase sysDate +property was wrong. Changed to cast as timestamp. </p> + +<p>The datadict driver is set up to give quoted tables and fields as this was +the only way round reserved words being used as field names in TikiWiki. +TikiPro is tidying that up, and I hope to be able to produce a build of THAT +which uses what I consider proper UPPERCASE field and table names. The +conversion of TikiWiki to ADOdb helped in that, but until the database is +completely tidied up in TikiPro ... </p> + +<p>Modified _gencachename() to include fetchmode in name hash. This means you +should clear your cache directory after installing this release as the cache +name algorithm has changed. </p> + +<p>Now Cache* functions work in safe mode, because we do not create +sub-directories in the $ADODB_CACHE_DIR in safe mode. In non-safe mode we still +create sub-directories. Done by modifying _gencachename(). </p> + +<p>Added $gmt parameter (true/false) to UserDate and UserTimeStamp in +connection class, to force conversion of input (in local time) to be converted +to UTC/GMT. </p> + +<p>Mssql datadict did not support INT types properly (no size param allowed). +Added _GetSize() to datadict-mssql.inc.php. </p> + +<p>For borland_ibase, BeginTrans(), changed:</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>   </span>$this-&gt;_transactionID = $this-&gt;_connectionID;</pre></div> + +<p class=MsoNormal>to</p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'>   </span>$this-&gt;_transactionID = ibase_trans($this-&gt;ibasetrans, $this-&gt;_connectionID);</pre></div> + +<p>Fixed typo in mysqi_field_seek(). Thx to Sh4dow (sh4dow#php.pl). </p> + +<p>LogSQL did not work with Firebird/Interbase. Fixed. </p> + +<p>Postgres: made errorno() handling more consistent. Thx to Michael Jahn, +Michael.Jahn#mailbox.tu-dresden.de. </p> + +<p>Added informix patch to better support metatables, metacolumns by +&quot;Cecilio Albero&quot; c-albero#eos-i.com </p> + +<p>Cyril Malevanov contributed patch to oci8 to support passing of LOB +parameters: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-tab-count:1'>         </span>$text = 'test test test';<br> +<span style='mso-tab-count:1'>         </span>$sql = &quot;declare rs clob; begin :rs := lobinout(:sa0); end;&quot;;<br> +<span style='mso-tab-count:1'>         </span>$stmt = $conn -&gt; PrepareSP($sql);<br> +<span style='mso-tab-count:1'>         </span>$conn -&gt; InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB);<br> +<span style='mso-tab-count:1'>         </span>$rs = '';<br> +<span style='mso-tab-count:1'>         </span>$conn -&gt; OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB);<br> +<span style='mso-tab-count:1'>         </span>$conn -&gt; Execute($stmt);<br> +<span style='mso-tab-count:1'>         </span>echo &quot;return = &quot;.$rs.&quot;&lt;br&gt;&quot;;</pre></div> + +<p class=MsoNormal>As he says, the LOBs limitations are: </p> + +<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt: +solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre +style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span>- use OCINewDescriptor before binding<br> +<span style='mso-spacerun:yes'> </span>- if Param is IN, uses save() before each execute. This is done automatically for you.<br> +<span style='mso-spacerun:yes'> </span>- if Param is OUT, uses load() after each execute. This is done automatically for you.<br> +<span style='mso-spacerun:yes'> </span>- when we bind $var as LOB, we create new descriptor and return it as a<br> +<span style='mso-spacerun:yes'>  </span><span style='mso-spacerun:yes'> </span>Bind Result, so if we want to use OUT parameters, we have to store<br> +<span style='mso-spacerun:yes'>   </span>somewhere &amp;$var to load() data from LOB to it.<br> +<span style='mso-spacerun:yes'> </span>- IN OUT params are not working now (should not be a big problem to fix it)<br> +<span style='mso-spacerun:yes'> </span>- now mass binding not working too (I've wrote about it before)</pre></div> + +<p>Simplified Connect() and PConnect() error handling. </p> + +<p>When extension not loaded, Connect() and PConnect() will return null. On +connect error, the fns will return false. </p> + +<p>CacheGetArray() added to code. </p> + +<p>Added Init() to adorecordset_empty(). </p> + +<p>Changed postgres64 driver, MetaColumns() to not strip off quotes in default +value if :: detected (type-casting of default). </p> + +<p>Added test: if (!defined('ADODB_DIR')) die(). Useful to prevent hackers from +detecting file paths. </p> + +<p>Changed metaTablesSQL to ignore Postgres 7.4 information schemas (sql_*). </p> + +<p>New polish language file by Grzegorz Pacan </p> + +<p>Added support for <st1:place w:st="on">UNION</st1:place> in +_adodb_getcount(). </p> + +<p>Added security check for ADODB_DIR to limit path disclosure issues. +Requested by postnuke team. </p> + +<p>Added better error message support to oracle driver. Thx to Gaetano Giunta. </p> + +<p>Added showSchema support to mysql. </p> + +<p>Bind in oci8 did not handle $name=false properly. Fixed. </p> + +<p>If extension not loaded, Connect(), PConnect(), NConnect() will return null. +</p> + +<p><b>4.22 15 Apr 2004</b> </p> + +<p>Moved docs to own adodb/docs folder. </p> + +<p>Fixed session bug when quoting compressed/encrypted data in Replace(). </p> + +<p>Netezza Driver and LDAP drivers contributed by Josh Eldridge. </p> + +<p>GetMenu now uses rtrim() on values instead of trim(). </p> + +<p>Changed MetaColumnNames to return an associative array, keys being the field +names in uppercase. </p> + +<p>Suggested fix to adodb-ado.inc.php affected_rows to support PHP5 variants. +Thx to Alexios Fakos. </p> + +<p>Contributed bulgarian language file by Valentin Sheiretsky +valio#valio.eu.org. </p> + +<p>Contributed romanian language file by stefan bogdan. </p> + +<p>GetInsertSQL now checks for table name (string) in $rs, and will create a +recordset for that table automatically. Contributed by Walt Boring. Also added +OCI_B_BLOB in bind on Walt's request - hope it doesn't break anything :-) </p> + +<p>Some minor postgres speedups in _initrs(). </p> + +<p>ChangeTableSQL checks now if MetaColumns returns empty. Thx Jason Judge. </p> + +<p>Added ADOConnection::Time(), returns current database time in unix timestamp +format, or false. </p> + +<p><b>4.21 20 Mar 2004</b> </p> + +<p>We no longer in SelectLimit for VFP driver add SELECT TOP X unless an ORDER +BY exists. </p> + +<p>Pim Koeman contributed dutch language file adodb-nl.inc.php. </p> + +<p>Rick Hickerson added CLOB support to db2 datadict. </p> + +<p>Added odbtp driver. Thx to &quot;stefan bogdan&quot; sbogdan#rsb.ro. </p> + +<p>Changed PrepareSP() 2nd parameter, $cursor, to default to true (formerly +false). Fixes oci8 backward compat problems with OUT params. </p> + +<p>Fixed month calculation error in adodb-time.inc.php. 2102-June-01 appeared +as 2102-May-32. </p> + +<p>Updated PHP5 RC1 iterator support. API changed, hasMore() renamed to +valid(). </p> + +<p>Changed internal format of serialized cache recordsets. As we store a +version number, this should be backward compatible. </p> + +<p>Error handling when driver file not found was flawed in ADOLoadCode(). +Fixed. </p> + +<p><b>4.20 27 Feb 2004</b> </p> + +<p>Updated to AXMLS 1.01. </p> + +<p>MetaForeignKeys for postgres7 modified by Edward Jaramilla, works on pg 7.4. +</p> + +<p>Now numbers accepts function calls or sequences for +GetInsertSQL/GetUpdateSQL numeric fields. </p> + +<p>Changed quotes of 'delete from $perf_table' to &quot;&quot;. Thx Kehui +(webmaster#kehui.net) </p> + +<p>Added ServerInfo() for ifx, and putenv trim fix. Thx Fernando Ortiz. </p> + +<p>Added addq(), which is analogous to addslashes(). </p> + +<p>Tested with php5b4. Fix some php5 compat problems with exceptions and +sybase. </p> + +<p>Carl-Christian Salvesen added patch to mssql _query to support binds greater +than 4000 chars. </p> + +<p>Mike suggested patch to PHP5 exception handler. $errno must be numeric. </p> + +<p>Added double quotes (&quot;) to ADODB_TABLE_REGEX. </p> + +<p>For oci8, Prepare(...,$cursor), $cursor's meaning was accidentally inverted +in 4.11. This causes problems with ExecuteCursor() too, which calls Prepare() +internally. Thx to William Lovaton. </p> + +<p>Now dateHasTime property in connection object renamed to datetime for +consistency. This could break bc. </p> + +<p>Csongor Halmai reports that db2 SelectLimit with input array is not working. +Fixed.. </p> + +<p><b>4.11 27 Jan 2004</b> </p> + +<p>Csongor Halmai reports db2 binding not working. Reverted back to emulated +binding. </p> + +<p>Dan Cech modifies datadict code. Adds support for DropIndex. Minor cleanups. +</p> + +<p>Table misspelt in perf-oci8.inc.php. Changed v$conn_cache_advice to +v$db_cache_advice. Reported by Steve W. </p> + +<p>UserTimeStamp and DBTimeStamp did not handle YYYYMMDDHHMMSS format properly. +Reported by Mike Muir. Fixed. </p> + +<p>Changed oci8 Prepare(). Does not auto-allocate OCINewCursor automatically, +unless 2nd param is set to true. This will break backward compat, if +Prepare/Execute is used instead of ExecuteCursor. Reported by Chris Jones. </p> + +<p>Added InParameter() and OutParameter(). Wrapper functions to Parameter(), +but nicer because they are self-documenting. </p> + +<p>Added 'R' handling in ActualType() to datadict-mysql.inc.php </p> + +<p>Added ADOConnection::SerializableRS($rs). Returns a recordset that can be +serialized in a session. </p> + +<p>Added &quot;Run SQL&quot; to performance UI(). </p> + +<p>Misc spelling corrections in adodb-mysqli.inc.php, adodb-oci8.inc.php and +datadict-oci8.inc.php, from Heinz Hombergs. </p> + +<p>MetaIndexes() for ibase contributed by Heinz Hombergs. </p> + +<p><b>4.10 12 Jan 2004</b> </p> + +<p>Dan Cech contributed extensive changes to data dictionary to support name +quoting (with `), and drop table/index. </p> + +<p>Informix added cursorType property. Default remains IFX_SCROLL, but you can +change to 0 (non-scrollable cursor) for performance. </p> + +<p>Added ADODB_View_PrimaryKeys() for returning view primary keys to +MetaPrimaryKeys(). </p> + +<p>Simplified chinese file, adodb-cn.inc.php from cysoft. </p> + +<p>Added check for ctype_alnum in adodb-datadict.inc.php. Thx to Jason Judge. </p> + +<p>Added connection parameter to ibase Prepare(). Fix by Daniel Hassan. </p> + +<p>Added nameQuote for quoting identifiers and names to connection obj. +Requested by Jason Judge. Also the data dictionary parser now detects `field +name` and generates column names with spaces correctly. </p> + +<p>BOOL type not recognised correctly as L. Fixed. </p> + +<p>Fixed paths in ADODB_DIR for session files, and back-ported it to 4.05 (15 +Dec 2003) </p> + +<p>Added Schema to postgresql MetaTables. Thx to col#gear.hu </p> + +<p>Empty postgresql recordsets that had blob fields did not set EOF properly. +Fixed. </p> + +<p>CacheSelectLimit internal parameters to SelectLimit were wrong. Thx to Nio. </p> + +<p>Modified adodb_pr() and adodb_backtrace() to support command-line usage (eg. +no html). </p> + +<p>Fixed some fr and it lang errors. Thx to Gaetano G. </p> + +<p>Added contrib directory, with adodb rs to xmlrpc convertor by Gaetano G. </p> + +<p>Fixed array recordset bugs when _skiprow1 is true. Thx to Gaetano G. </p> + +<p>Fixed pivot table code when count is false. </p> + +<p><b>4.05 13 Dec 2003 </b></p> + +<p>Added MetaIndexes to data-dict code - thx to Dan Cech. </p> + +<p>Rewritten session code by Ross Smith. Moved code to adodb/session directory. +</p> + +<p>Added function exists check on connecting to most drivers, so we don't crash +with the unknown function error. </p> + +<p>Smart Transactions failed with GenID() when it no seq table has been created +because the sql statement fails. Fix by Mark Newnham. </p> + +<p>Added $db-&gt;length, which holds name of function that returns strlen. </p> + +<p>Fixed error handling for bad driver in ADONewConnection - passed too few +params to error-handler. </p> + +<p>Datadict did not handle types like 16.0 properly in _GetSize. Fixed. </p> + +<p>Oci8 driver SelectLimit() bug &amp;= instead of =&amp; used. Thx to Swen +Thümmler. </p> + +<p>Jesse Mullan suggested not flushing outp when output buffering enabled. Due +to Apache 2.0 bug. Added. </p> + +<p>MetaTables/MetaColumns return ref bug with PHP5 fixed in +adodb-datadict.inc.php. </p> + +<p>New mysqli driver contributed by Arjen de Rijke. Based on adodb 3.40 driver. +Then jlim added BeginTrans, CommitTrans, RollbackTrans, IfNull, SQLDate. Also +fixed return ref bug. </p> + +<p>$ADODB_FLUSH added, if true then force flush in debugging outp. Default is +false. In earlier versions, outp defaulted to flush, which is not compat with +apache 2.0. </p> + +<p>Mysql driver's GenID() function did not work when when sql logging is on. +Fixed. </p> + +<p>$ADODB_SESSION_TBL not declared as global var. Not available if +adodb-session.inc.php included in function. Fixed. </p> + +<p>The input array not passed to Execute() in _adodb_getcount(). Fixed. </p> + +<p><b>4.04 13 Nov 2003 </b></p> + +<p>Switched back to foreach - faster than list-each. </p> + +<p>Fixed bug in ado driver - wiping out $this-&gt;fields with date fields. </p> + +<p>Performance Monitor, View SQL, Explain Plan did not work if +strlen($SQL)&gt;max($_GET length). Fixed. </p> + +<p>Performance monitor, oci8 driver added memory sort ratio. </p> + +<p>Added random property, returns SQL to generate a floating point number +between 0 and 1; </p> + +<p><b>4.03 6 Nov 2003 </b></p> + +<p>The path to adodb-php4.inc.php and adodb-iterators.inc.php was not setup +properly. </p> + +<p>Patched SQLDate in interbase to support hours/mins/secs. Thx to ari +kuorikoski. </p> + +<p>Force autorollback for pgsql persistent connections - apparently pgsql did +not autorollback properly before 4.3.4. See http://bugs.php.net/bug.php?id=25404 +</p> + +<p><b>4.02 5 Nov 2003 </b></p> + +<p>Some errors in adodb_error_pg() fixed. Thx to Styve. </p> + +<p>Spurious Insert_ID() error was generated by LogSQL(). Fixed. </p> + +<p>Insert_ID was interfering with Affected_Rows() and Replace() when LogSQL() +enabled. Fixed. </p> + +<p>More foreach loops optimized with list/each. </p> + +<p>Null dates not handled properly in <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City> +driver (it becomes 31 Dec 1969!). </p> + +<p>Heinz Hombergs contributed patches for mysql MetaColumns - adding scale, +made interbase MetaColumns work with firebird/interbase, and added +lang/adodb-de.inc.php. </p> + +<p>Added INFORMIXSERVER environment variable. </p> + +<p>Added $ADODB_ANSI_PADDING_OFF for interbase/firebird. </p> + +<p>PHP 5 beta 2 compat check. Foreach (Iterator) support. Exceptions support. </p> + +<p><b>4.01 23 Oct 2003 </b></p> + +<p>Fixed bug in rs2html(), tohtml.inc.php, that generated blank table cells. </p> + +<p>Fixed insert_id() incorrectly generated when logsql() enabled. </p> + +<p>Modified PostgreSQL _fixblobs to use list/each instead of foreach. </p> + +<p>Informix ErrorNo() implemented correctly. </p> + +<p>Modified several places to use list/each, including GetRowAssoc(). </p> + +<p>Added UserTimeStamp() to connection class. </p> + +<p>Added $ADODB_ANSI_PADDING_OFF for oci8po. </p> + +<p><b>4.00 20 Oct 2003 </b></p> + +<p>Upgraded adodb-xmlschema to 1 Oct 2003 snapshot. </p> + +<p>Fix to rs2html warning message. Thx to Filo. </p> + +<p>Fix for odbc_mssql/mssql SQLDate(), hours was wrong. </p> + +<p>Added MetaColumns and MetaPrimaryKeys for sybase. Thx to Chris Phillipson. </p> + +<p>Added autoquoting to datadict for MySQL and PostgreSQL. Suggestion by +Karsten Dambekalns </p> + +<p><b>3.94 11 Oct 2003 </b></p> + +<p>Create trigger in datadict-oci8.inc.php did not work, because all cr/lf's +must be removed. </p> + +<p>ErrorMsg()/ErrorNo() did not work for many databases when logging enabled. +Fixed. </p> + +<p>Removed global variable $ADODB_LOGSQL as it does not work properly with +multiple connections. </p> + +<p>Added SQLDate support for sybase. Thx to Chris Phillipson </p> + +<p>Postgresql checking of pgsql resultset resource was incorrect. Fix by Bharat +Mediratta bharat#menalto.com. Same patch applied to _insertid and _affectedrows +for adodb-postgres64.inc.php. </p> + +<p>Added support for NConnect for postgresql. </p> + +<p>Added Sybase data dict support. Thx to Chris Phillipson </p> + +<p>Extensive improvements in $perf-&gt;UI(), eg. Explain now opens in new +window, we show scripts which call sql, etc. </p> + +<p>Perf Monitor UI works with magic quotes enabled. </p> + +<p>rsPrefix was declared twice. Removed. </p> + +<p>Oci8 stored procedure support, eg. &quot;begin func(); end;&quot; was +incorrect in _query. Fixed. </p> + +<p>Tiraboschi Massimiliano contributed italian language file. </p> + +<p>Fernando Ortiz, fortiz#lacorona.com.mx, contributed informix performance +monitor. </p> + +<p>Added _varchar (varchar arrays) support for postgresql. Reported by PREVOT +Stéphane.</p> + +<div class=MsoNormal align=center style='text-align:center'> + +<hr size=2 width="100%" align=center> + +</div> + +<p><strong>0.10 Sept 9 2000</strong> First release </p> + +<h3><strong>Old change log history moved to <a href="old-changelog.htm">old-changelog.htm</a>. +</strong></h3> + +<p>&nbsp;</p> + +</div> + +</body> + +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-datadict.htm b/pos/is4c-nf/lib/adodb5/docs/docs-datadict.htm new file mode 100644 index 000000000..ab2880565 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-datadict.htm @@ -0,0 +1,330 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title>ADOdb Data Dictionary Manual</title> + <meta http-equiv="Content-Type" + content="text/html; charset=iso-8859-1"> + <style type="text/css"> + body, td { + /*font-family: Arial, Helvetica, sans-serif;*/ + font-size: 11pt; + } + pre { + font-size: 9pt; + background-color: #EEEEEE; padding: .5em; margin: 0px; + } + .toplink { + font-size: 8pt; + } + </style> +</head> +<body style="background-color: rgb(255, 255, 255);"> +<h2>ADOdb Data Dictionary Library for PHP</h2> +<p>V5.06 16 Oct 2008 (c) 2000-2009 John Lim (<a + href="mailto:jlim#natsoft.com">jlim#natsoft.com</a>).<br> +AXMLS (c) 2004 ars Cognita, Inc</p> +<p><font size="1">This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products.</font></p> + +<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a> +&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a> +</p> +<p>This documentation describes a PHP class library to automate the +creation of tables, indexes and foreign key constraints portably for +multiple databases. Richard Tango-Lowy and Dan Cech have been kind +enough to contribute <a href="#xmlschema">AXMLS</a>, an XML schema +system for defining databases. You can contact them at +dcech#phpwerx.net and richtl#arscognita.com.</p> +<p>Currently the following databases are supported:</p> +<p> <b>Well-tested:</b> PostgreSQL, MySQL, Oracle, MSSQL.<br> +<b>Beta-quality:</b> DB2, Informix, Sybase, Interbase, Firebird.<br> +<b>Alpha-quality:</b> MS Access (does not support DEFAULT values) and +generic ODBC. +</p> +<h3>Example Usage</h3> +<pre> include_once('adodb.inc.php');<br> <font color="#006600"># First create a normal connection</font><br> $db = NewADOConnection('mysql');<br> $db-&gt;Connect(...);<br><br> <font + color="#006600"># Then create a data dictionary object, using this connection</font><br> $dict = <strong>NewDataDictionary</strong>($db);<br><br> <font + color="#006600"># We have a portable declarative data dictionary format in ADOdb, similar to SQL.<br> # Field types use 1 character codes, and fields are separated by commas.<br> # The following example creates three fields: "col1", "col2" and "col3":</font><br> $flds = " <br> <font + color="#663300"><strong> col1 C(32) NOTNULL DEFAULT 'abc',<br> col2 I DEFAULT 0,<br> col3 N(12.2)</strong></font><br> ";<br><br> <font + color="#006600"># We demonstrate creating tables and indexes</font><br> $sqlarray = $dict-&gt;<strong>CreateTableSQL</strong>($tabname, $flds, $taboptarray);<br> $dict-&gt;<strong>ExecuteSQLArray</strong>($sqlarray);<br><br> $idxflds = 'co11, col2';<br> $sqlarray = $dict-&gt;<strong>CreateIndexSQL</strong>($idxname, $tabname, $idxflds);<br> $dict-&gt;<strong>ExecuteSQLArray</strong>($sqlarray);<br></pre> +<h3>More Complex Table Sample</h3> +<p> +The following string will create a table with a primary key event_id and multiple indexes, including one compound index idx_ev1. The ability to define indexes using the INDEX keyword was added in ADOdb 4.94 by Gaetano Giunta. +<pre> +$flds = " + event_id I(11) NOTNULL AUTOINCREMENT PRIMARY, + event_type I(4) NOTNULL <b>INDEX idx_evt</b>, + event_start_date T DEFAULT NULL <b>INDEX id_esd</b>, + event_end_date T DEFAULT '0000-00-00 00:00:00' <b>INDEX id_eted</b>, + event_parent I(11) UNSIGNED NOTNULL DEFAULT 0 <b>INDEX id_evp</b>, + event_owner I(11) DEFAULT 0 <b>INDEX idx_ev1</b>, + event_project I(11) DEFAULT 0 <b>INDEX idx_ev1</b>, + event_times_recuring I(11) UNSIGNED NOTNULL DEFAULT 0, + event_icon C(20) DEFAULT 'obj/event', + event_description X +"; +$sqlarray = $db-><b>CreateTableSQL</b>($tablename, $flds); +$dict-><b>ExecuteSQLArray</b>($sqlarray); +</pre> +<h3>Class Factory</h3> +<h4>NewDataDictionary($connection, $drivername=false)</h4> +<p>Creates a new data dictionary object. You pass a database connection object in $connection. The $connection does not have to be actually connected to the database. Some database connection objects are generic (eg. odbtp and odbc). Since 4.53, you can tell ADOdb the actual database with $drivername. E.g.</p> +<pre> +$db = NewADOConnection('odbtp'); +$datadict = NewDataDictionary($db, 'mssql'); # force mssql +</pre> +<h3>Class Functions</h3> +<h4>function CreateDatabase($dbname, $optionsarray=false)</h4> +<p>Create a database with the name $dbname;</p> +<h4>function CreateTableSQL($tabname, $fldarray, $taboptarray=false)</h4> +<pre> RETURNS: an array of strings, the sql to be executed, or false<br> $tabname: name of table<br> $fldarray: string (or array) containing field info<br> $taboptarray: array containing table options<br></pre> +<p>The new format of $fldarray uses a free text format, where each +field is comma-delimited. +The first token for each field is the field name, followed by the type +and optional +field size. Then optional keywords in $otheroptions:</p> +<pre> "$fieldname $type $colsize $otheroptions"</pre> +<p>The older (and still supported) format of $fldarray is a +2-dimensional array, where each row in the 1st dimension represents one +field. Each row has this format:</p> +<pre> array($fieldname, $type, [,$colsize] [,$otheroptions]*)</pre> +<p>The first 2 fields must be the field name and the field type. The +field type can be a portable type codes or the actual type for that +database.</p> +<p>Legal portable type codes include:</p> +<pre> C: Varchar, capped to 255 characters.<br> X: Larger varchar, capped to 4000 characters (to be compatible with Oracle). <br> XL: For Oracle, returns CLOB, otherwise the largest varchar size.<br><br> C2: Multibyte varchar<br> X2: Multibyte varchar (largest size)<br><br> B: BLOB (binary large object)<br><br> D: Date (some databases do not support this, and we return a datetime type)<br> T: Datetime or Timestamp accurate to the second.<br> TS: Datetime or Timestamp supporting Sub-second accuracy.<br> Supported by Oracle, PostgreSQL and SQL Server currently. <br> Otherwise equivalent to T.<br> + L: Integer field suitable for storing booleans (0 or 1)<br> I: Integer (mapped to I4)<br> I1: 1-byte integer<br> I2: 2-byte integer<br> I4: 4-byte integer<br> I8: 8-byte integer<br> F: Floating point number<br> N: Numeric or decimal number<br></pre> +<p>The $colsize field represents the size of the field. If a decimal +number is used, then it is assumed that the number following the dot is +the precision, so 6.2 means a number of size 6 digits and 2 decimal +places. It is recommended that the default for number types be +represented as a string to avoid any rounding errors.</p> +<p>The $otheroptions include the following keywords (case-insensitive):</p> +<pre> AUTO For autoincrement number. Emulated with triggers if not available.<br> Sets NOTNULL also.<br> AUTOINCREMENT Same as auto.<br> KEY Primary key field. Sets NOTNULL also. Compound keys are supported.<br> PRIMARY Same as KEY.<br> DEF Synonym for DEFAULT for lazy typists.<br> DEFAULT The default value. Character strings are auto-quoted unless<br> the string begins and ends with spaces, eg ' SYSDATE '.<br> NOTNULL If field is not null.<br> DEFDATE Set default value to call function to get today's date.<br> DEFTIMESTAMP Set default to call function to get today's datetime.<br> NOQUOTE Prevents autoquoting of default string values.<br> CONSTRAINTS Additional constraints defined at the end of the field<br> definition.<br></pre> +<p>The Data Dictonary accepts two formats, the older array +specification:</p> +<pre> $flds = array(<br> array('COLNAME', 'DECIMAL', '8.4', 'DEFAULT' =gt; 0, 'NOTNULL'),<br> array('id', 'I' , 'AUTO'),<br> array('`MY DATE`', 'D' , 'DEFDATE'),<br> array('NAME', 'C' , '32', 'CONSTRAINTS' =gt; 'FOREIGN KEY REFERENCES reftable')<br> );<br></pre> +<p>Or the simpler declarative format:</p> +<pre> $flds = "<font color="#660000"><strong><br> COLNAME DECIMAL(8.4) DEFAULT 0 NOTNULL,<br> id I AUTO,<br> `MY DATE` D DEFDATE,<br> NAME C(32) CONSTRAINTS 'FOREIGN KEY REFERENCES reftable'</strong></font><br> ";<br></pre> +<p>Note that if you have special characters in the field name (e.g. My +Date), you should enclose it in back-quotes. Normally field names are +not case-sensitive, but if you enclose it in back-quotes, some +databases will treat the names as case-sensitive (eg. Oracle) , and +others won't. So be careful.</p> +<p>The $taboptarray is the 3rd parameter of the CreateTableSQL +function. This contains table specific settings. Legal keywords include:</p> +<ul> + <li><b>REPLACE</b><br> +Indicates that the previous table definition should be removed +(dropped)together with ALL data. See first example below. </li> + <li><b>DROP</b><br> +Drop table. Useful for removing unused tables. </li> + <li><b>CONSTRAINTS</b><br> +Define this as the key, with the constraint as the value. See the +postgresql <a href="#foreignkey">example</a> below. Additional constraints defined for the whole +table. You will probably need to prefix this with a comma. </li> +</ul> +<p>Database specific table options can be defined also using the name +of the database type as the array key. In the following example, <em>create +the table as ISAM with MySQL, and store the table in the "users" +tablespace if using Oracle</em>. And because we specified REPLACE, drop +the table first.</p> +<pre> $taboptarray = array('mysql' =gt; 'TYPE=ISAM', 'oci8' =gt; 'tablespace users', 'REPLACE');</pre> +<p><a name=foreignkey></a>You can also define foreign key constraints. The following is syntax +for postgresql: +</p> +<pre> $taboptarray = array('constraints' =gt; ', FOREIGN KEY (col1) REFERENCES reftable (refcol)');</pre> +<h4>function DropTableSQL($tabname)</h4> +<p>Returns the SQL to drop the specified table.</p> +<h4>function ChangeTableSQL($tabname, $flds, $tableOptions=false, $dropOldFlds=false)</h4> +<p>Checks to see if table exists, if table does not exist, behaves like +CreateTableSQL. If table exists, generates appropriate ALTER TABLE +MODIFY COLUMN commands if field already exists, or ALTER TABLE ADD +$column if field does not exist.</p> +<p>The class must be connected to the database for ChangeTableSQL to +detect the existence of the table. Idea and code contributed by Florian +Buzin.</p> +<p>Old fields not defined in $flds are not dropped by default. To drop old fields, set $dropOldFlds to true. +<h4>function RenameTableSQL($tabname,$newname)</h4> +<p>Rename a table. Returns the an array of strings, which is the SQL required to rename a table. Since ADOdb 4.53. Contributed by Ralf Becker.</p> +<h4> function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='')</h4> +<p>Rename a table field. Returns the an array of strings, which is the SQL required to rename a column. The optional $flds is a complete column-defintion-string like for AddColumnSQL, only used by mysql at the moment. Since ADOdb 4.53. Contributed by Ralf Becker.</p> +<h4>function CreateIndexSQL($idxname, $tabname, $flds, +$idxoptarray=false)</h4> +<pre> RETURNS: an array of strings, the sql to be executed, or false<br> $idxname: name of index<br> $tabname: name of table<br> $flds: list of fields as a comma delimited string or an array of strings<br> $idxoptarray: array of index creation options<br></pre> +<p>$idxoptarray is similar to $taboptarray in that index specific +information can be embedded in the array. Other options include:</p> +<pre> CLUSTERED Create clustered index (only mssql)<br> BITMAP Create bitmap index (only oci8)<br> UNIQUE Make unique index<br> FULLTEXT Make fulltext index (only mysql)<br> HASH Create hash index (only postgres)<br> DROP Drop legacy index<br></pre> +<h4>function DropIndexSQL ($idxname, $tabname = NULL)</h4> +<p>Returns the SQL to drop the specified index.</p> +<h4>function AddColumnSQL($tabname, $flds)</h4> +<p>Add one or more columns. Not guaranteed to work under all situations.</p> +<h4>function AlterColumnSQL($tabname, $flds)</h4> +<p>Warning, not all databases support this feature.</p> +<h4>function DropColumnSQL($tabname, $flds)</h4> +<p>Drop 1 or more columns.</p> +<h4>function SetSchema($schema)</h4> +<p>Set the schema.</p> +<h4>function MetaTables()</h4> +<h4>function MetaColumns($tab, $upper=true, $schema=false)</h4> +<h4>function MetaPrimaryKeys($tab,$owner=false,$intkey=false)</h4> +<h4>function MetaIndexes($table, $primary = false, $owner = false)</h4> +<p>These functions are wrappers for the corresponding functions in the +connection object. However, the table names will be autoquoted by the +TableName function (see below) before being passed to the connection +object.</p> +<h4>function NameQuote($name = NULL)</h4> +<p>If the provided name is quoted with backquotes (`) or contains +special characters, returns the name quoted with the appropriate quote +character, otherwise the name is returned unchanged.</p> +<h4>function TableName($name)</h4> +<p>The same as NameQuote, but will prepend the current schema if +specified</p> +<h4>function MetaType($t,$len=-1,$fieldobj=false)</h4> +<h4>function ActualType($meta)</h4> +<p>Convert between database-independent 'Meta' and database-specific +'Actual' type codes.</p> +<h4>function ExecuteSQLArray($sqlarray, $contOnError = true)</h4> +<pre> RETURNS: 0 if failed, 1 if executed all but with errors, 2 if executed successfully<br> $sqlarray: an array of strings with sql code (no semicolon at the end of string)<br> $contOnError: if true, then continue executing even if error occurs<br></pre> +<p>Executes an array of SQL strings returned by CreateTableSQL or +CreateIndexSQL.</p> +<hr /> +<a name="xmlschema"></a> +<h2>ADOdb XML Schema (AXMLS)</h2> +<p>This is a class contributed by Richard Tango-Lowy and Dan Cech that +allows the user to quickly +and easily build a database using the excellent ADODB database library +and a simple XML formatted file. +You can <a href="http://sourceforge.net/projects/adodb-xmlschema/">download +the latest version of AXMLS here</a>.</p> +<h3>Quick Start</h3> +<p>Adodb-xmlschema, or AXMLS, is a set of classes that allow the user +to quickly and easily build or upgrade a database on almost any RDBMS +using the excellent ADOdb database library and a simple XML formatted +schema file. Our goal is to give developers a tool that's simple to +use, but that will allow them to create a single file that can build, +upgrade, and manipulate databases on most RDBMS platforms.</p> +<span style="font-weight: bold;"> Installing axmls</span> +<p>The easiest way to install AXMLS to download and install any recent +version of the ADOdb database abstraction library. To install AXMLS +manually, simply copy the adodb-xmlschema.inc.php file and the xsl +directory into your adodb directory.</p> +<span style="font-weight: bold;"> Using AXMLS in Your Application</span> +<p>There are two steps involved in using AXMLS in your application: +first, you must create a schema, or XML representation of your +database, and second, you must create the PHP code that will parse and +execute the schema.</p> +<p>Let's begin with a schema that describes a typical, if simplistic +user management table for an application.</p> +<pre class="listing"><pre>&lt;?xml version="1.0"?&gt;<br>&lt;schema version="0.2"&gt;<br><br> &lt;table name="users"&gt;<br> &lt;desc&gt;A typical users table for our application.&lt;/desc&gt;<br> &lt;field name="userId" type="I"&gt;<br> &lt;descr&gt;A unique ID assigned to each user.&lt;/descr&gt;<br><br> &lt;KEY/&gt;<br> &lt;AUTOINCREMENT/&gt;<br> &lt;/field&gt;<br> <br> &lt;field name="userName" type="C" size="16"&gt;&lt;NOTNULL/&gt;&lt;/field&gt;<br><br> <br> &lt;index name="userName"&gt;<br> &lt;descr&gt;Put a unique index on the user name&lt;/descr&gt;<br> &lt;col&gt;userName&lt;/col&gt;<br> &lt;UNIQUE/&gt;<br><br> &lt;/index&gt;<br> &lt;/table&gt;<br> <br> &lt;sql&gt;<br> &lt;descr&gt;Insert some data into the users table.&lt;/descr&gt;<br> &lt;query&gt;insert into users (userName) values ( 'admin' )&lt;/query&gt;<br><br> &lt;query&gt;insert into users (userName) values ( 'Joe' )&lt;/query&gt;<br> &lt;/sql&gt;<br>&lt;/schema&gt; <br></pre></pre> +<p>Let's take a detailed look at this schema.</p> +<p>The opening &lt;?xml version="1.0"?&gt; tag is required by XML. The +&lt;schema&gt; tag tells the parser that the enclosed markup defines an +XML schema. The version="0.2" attribute sets <em>the version of the +AXMLS DTD used by the XML schema.</em> </p> +<p>All versions of AXMLS prior to version 1.0 have a schema version of +"0.1". The current schema version is "0.2".</p> +<pre class="listing"><pre>&lt;?xml version="1.0"?&gt;<br>&lt;schema version="0.2"&gt;<br> ...<br>&lt;/schema&gt;<br></pre></pre> +<p>Next we define one or more tables. A table consists of a fields (and +other objects) enclosed by &lt;table&gt; tags. The name="" attribute +specifies the name of the table that will be created in the database.</p> +<pre class="listing"><pre>&lt;table name="users"&gt;<br><br> &lt;desc&gt;A typical users table for our application.&lt;/desc&gt;<br> &lt;field name="userId" type="I"&gt;<br><br> &lt;descr&gt;A unique ID assigned to each user.&lt;/descr&gt;<br> &lt;KEY/&gt;<br> &lt;AUTOINCREMENT/&gt;<br> &lt;/field&gt;<br> <br> &lt;field name="userName" type="C" size="16"&gt;&lt;NOTNULL/&gt;&lt;/field&gt;<br><br> <br>&lt;/table&gt;<br></pre></pre> +<p>This table is called "users" and has a description and two fields. +The description is optional, and is currently only for your own +information; it is not applied to the database.</p> +<p>The first &lt;field&gt; tag will create a field named "userId" of +type "I", or integer. (See the ADOdb Data Dictionary documentation for +a list of valid types.) This &lt;field&gt; tag encloses two special +field options: &lt;KEY/&gt;, which specifies this field as a primary +key, and &lt;AUTOINCREMENT/&gt;, which specifies that the database +engine should automatically fill this field with the next available +value when a new row is inserted.</p> +<p>The second &lt;field&gt; tag will create a field named "userName" of +type "C", or character, and of length 16 characters. The +&lt;NOTNULL/&gt; option specifies that this field does not allow NULLs.</p> +<p>There are two ways to add indexes to a table. The simplest is to +mark a field with the &lt;KEY/&gt; option as described above; a primary +key is a unique index. The second and more powerful method uses the +&lt;index&gt; tags.</p> +<pre class="listing"><pre>&lt;table name="users"&gt;<br> ...<br> <br> &lt;index name="userName"&gt;<br> &lt;descr&gt;Put a unique index on the user name&lt;/descr&gt;<br> &lt;col&gt;userName&lt;/col&gt;<br><br> &lt;UNIQUE/&gt;<br> &lt;/index&gt;<br> <br>&lt;/table&gt;<br></pre></pre> +<p>The &lt;index&gt; tag specifies that an index should be created on +the enclosing table. The name="" attribute provides the name of the +index that will be created in the database. The description, as above, +is for your information only. The &lt;col&gt; tags list each column +that will be included in the index. Finally, the &lt;UNIQUE/&gt; tag +specifies that this will be created as a unique index.</p> +<p>Finally, AXMLS allows you to include arbitrary SQL that will be +applied to the database when the schema is executed.</p> +<pre class="listing"><pre>&lt;sql&gt;<br> &lt;descr&gt;Insert some data into the users table.&lt;/descr&gt;<br> &lt;query&gt;insert into users (userName) values ( 'admin' )&lt;/query&gt;<br><br> &lt;query&gt;insert into users (userName) values ( 'Joe' )&lt;/query&gt;<br>&lt;/sql&gt;<br></pre></pre> +<p>The &lt;sql&gt; tag encloses any number of SQL queries that you +define for your own use.</p> +<p>Now that we've defined an XML schema, you need to know how to apply +it to your database. Here's a simple PHP script that shows how to load +the schema.</p> +<pre class="listing"><pre>&lt;?PHP<br>/* You must tell the script where to find the ADOdb and<br> * the AXMLS libraries.<br> */ +require( "path_to_adodb/adodb.inc.php"); +require( "path_to_adodb/adodb-xmlschema.inc.php" ); # or adodb-xmlschema03.inc.php + +/* Configuration information. Define the schema filename,<br> * RDBMS platform (see the ADODB documentation for valid<br> * platform names), and database connection information here.<br> */<br>$schemaFile = 'example.xml';<br>$platform = 'mysql';<br>$dbHost = 'localhost';<br>$dbName = 'database';<br>$dbUser = 'username';<br>$dbPassword = 'password';<br><br>/* Start by creating a normal ADODB connection.<br> */<br>$db = ADONewConnection( $platform );<br>$db-&gt;Connect( $dbHost, $dbUser, $dbPassword, $dbName );<br><br>/* Use the database connection to create a new adoSchema object.<br> */<br>$schema = new adoSchema( $db );<br><br>/* Call ParseSchema() to build SQL from the XML schema file.<br> * Then call ExecuteSchema() to apply the resulting SQL to <br> * the database.<br> */<br>$sql = $schema-&gt;ParseSchema( $schemaFile );<br>$result = $schema-&gt;ExecuteSchema();<br>?&gt;<br></pre></pre> +<p>Let's look at each part of the example in turn. After you manually +create the database, there are three steps required to load (or +upgrade) your schema.</p> +<p>First, create a normal ADOdb connection. The variables and values +here should be those required to connect to your database.</p> +<pre class="listing"><pre>$db = ADONewConnection( 'mysql' );<br>$db-&gt;Connect( 'host', 'user', 'password', 'database' );<br></pre></pre> +<p>Second, create the adoSchema object that load and manipulate your +schema. You must pass an ADOdb database connection object in order to +create the adoSchema object.</p> +<pre class="listing">$schema = new adoSchema( $db );<br></pre> +<p>Third, call ParseSchema() to parse the schema and then +ExecuteSchema() to apply it to the database. You must pass +ParseSchema() the path and filename of your schema file.</p> +<pre class="listing">$schema-&gt;ParseSchema( $schemaFile ); <br>$schema-&gt;ExecuteSchema();</pre> +<p>Execute the above code and then log into your database. If you've +done all this right, you should see your tables, indexes, and SQL.</p> +<p>You can find the source files for this tutorial in the examples +directory as tutorial_shema.xml and tutorial.php. See the class +documentation for a more detailed description of the adoSchema methods, +including methods and schema elements that are not described in this +tutorial.</p> +<h3>XML Schema Version 3</h3> +<p>In March 2006, we added adodb-xmlschema03.inc.php to the release, which supports version 3 of XML Schema. +The adodb-xmlschema.inc.php remains the same as previous releases, and supports version 2 of XML Schema. +Version 3 provides some enhancements: + +<ul> + <li> Support for updating table data during an upgrade. + <li> Support for platform-specific table options and platform negation. + <li> Support for unsigned fields. + <li> Fixed opt and constraint support + <li> Many other fixes such as OPT tag, which allows you to set optional platform settings: +</ul> + +<p>Example usage: +<pre>&lt;?xml version="1.0"?> +<b>&lt;schema version="0.3"></b> + &lt;table name="ats_kb"> + &lt;descr>ATS KnowledgeBase&lt;/descr> + &lt;opt platform="mysql">TYPE=INNODB&lt;/opt> + &lt;field name="recid" type="I"/> + &lt;field name="organization_code" type="I4"/> + &lt;field name="sub_code" type="C" size="20"/> + etc... +</pre> +<p>To use it, change your code to include adodb-xmlschema03.inc.php. + +<h3>Upgrading</h3> +<p> +If your schema version is older, than XSLT is used to transform the +schema to the newest version. This means that if you are using an older +XML schema format, you need to have the XSLT extension installed. +If you do not want to require your users to have the XSLT extension +installed, make sure you modify your XML schema to conform to the +latest version. +<hr /> +<address>If you have any questions or comments, please email them to +Richard at richtl#arscognita.com. +</address> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-oracle.htm b/pos/is4c-nf/lib/adodb5/docs/docs-oracle.htm new file mode 100644 index 000000000..3ee27aae2 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-oracle.htm @@ -0,0 +1,542 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<style> +pre { + background-color: #eee; + padding: 0.75em 1.5em; + font-size: 12px; + border: 1px solid #ddd; +} +.greybg { + background-color: #eee; + padding: 0.75em 1.5em; + font-size: 12px; + border: 1px solid #ddd; +} +.style1 {color: #660000} +</style> +<title>ADOdb with PHP and Oracle</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</style> +</head> + +<body> +<table width=100%><tr><td> +<h2>Using ADOdb with PHP and Oracle: an advanced tutorial</h2> +</td><td><div align="right"><img src=cute_icons_for_site/adodb.gif width="88" height="31"></div></tr></table> +<p><font size="1">(c)2004-2005 John Lim. All rights reserved.</font></p> +<h3>1. Introduction</h3> +<p>Oracle is the most popular commercial database used with PHP. There are many ways of accessing Oracle databases in PHP. These include:</p> +<ul> + <li>The oracle extension</li> + <li>The oci8 extension</li> + <li>PEAR DB library</li> + <li>ADOdb library</li> +</ul> +<p>The wide range of choices is confusing to someone just starting with Oracle and PHP. I will briefly summarize the differences, and show you the advantages of using <a href="http://adodb.sourceforge.net/">ADOdb</a>. </p> +<p>First we have the C extensions which provide low-level access to Oracle functionality. These C extensions are precompiled into PHP, or linked in dynamically when the web server starts up. Just in case you need it, here's a <a href=http://www.oracle.com/technology/tech/opensource/php/apache/inst_php_apache_linux.html>guide to installing Oracle and PHP on Linux</a>.</p> +<table width="75%" border="1" align="center"> + <tr valign="top"> + <td nowrap><b>Oracle extension</b></td> + <td>Designed for Oracle 7 or earlier. This is obsolete.</td> + </tr> + <tr valign="top"> + <td nowrap><b>Oci8 extension</b></td> + <td> Despite it's name, which implies it is only for Oracle 8i, this is the standard method for accessing databases running Oracle 8i, 9i or 10g (and later).</td> + </tr> +</table> +<p>Here is an example of using the oci8 extension to query the <i>emp</i> table of the <i>scott</i> schema with bind parameters: +<pre> +$conn = OCILogon("scott","tiger", $tnsName); + +$stmt = OCIParse($conn,"select * from emp where empno > :emp order by empno"); +$emp = 7900; +OCIBindByName($stmt, ':emp', $emp); +$ok = OCIExecute($stmt); +while (OCIFetchInto($stmt,$arr)) { + print_r($arr); + echo "&lt;hr>"; +} +</pre> +<p>This generates the following output: +<div class=greybg> +Array ( [0] => 7902 [1] => FORD [2] => ANALYST [3] => 7566 [4] => 03/DEC/81 [5] => 3000 [7] => 20 ) +<hr /> + Array ( [0] => 7934 [1] => MILLER [2] => CLERK [3] => 7782 [4] => 23/JAN/82 [5] => 1300 [7] => 10 ) +</div> +<p>We also have many higher level PHP libraries that allow you to simplify the above code. The most popular are <a href="http://pear.php.net/">PEAR DB</a> and <a href="http://adodb.sourceforge.net/">ADOdb</a>. Here are some of the differences between these libraries:</p> +<table width="75%" border="1" align="center"> + <tr> + <td><b>Feature</b></td> + <td><b>PEAR DB 1.6</b></td> + <td><b>ADOdb 4.52</b></td> + </tr> + <tr valign="top"> + <td>General Style</td> + <td>Simple, easy to use. Lacks Oracle specific functionality.</td> + <td>Has multi-tier design. Simple high-level design for beginners, and also lower-level advanced Oracle functionality.</td> + </tr> + <tr valign="top"> + <td>Support for Prepare</td> + <td>Yes, but only on one statement, as the last prepare overwrites previous prepares.</td> + <td>Yes (multiple simultaneous prepare's allowed)</td> + </tr> + <tr valign="top"> + <td>Support for LOBs</td> + <td>No</td> + <td>Yes, using update semantics</td> + </tr> + <tr valign="top"> + <td>Support for REF Cursors</td> + <td>No</td> + <td>Yes</td> + </tr> + <tr valign="top"> + <td>Support for IN Parameters</td> + <td>Yes</td> + <td>Yes</td> + </tr> + <tr valign="top"> + <td>Support for OUT Parameters</td> + <td>No</td> + <td>Yes</td> + </tr> + <tr valign="top"> + <td>Schema creation using XML</td> + <td>No</td> + <td>Yes, including ability to define tablespaces and constraints</td> + </tr> + <tr valign="top"> + <td>Provides database portability features</td> + <td>No</td> + <td>Yes, has some ability to abstract features that differ between databases such as dates, bind parameters, and data types.</td> + </tr> + <tr valign="top"> + <td>Performance monitoring and tracing</td> + <td>No</td> + <td>Yes. SQL can be traced and linked to web page it was executed on. Explain plan support included.</td> + </tr> + <tr valign="top"> + <td>Recordset caching for frequently used queries</td> + <td>No</td> + <td>Yes. Provides great speedups for SQL involving complex <i>where, group-by </i>and <i>order-by</i> clauses.</td> + </tr> + <tr valign="top"> + <td>Popularity</td> + <td>Yes, part of PEAR release</td> + <td>Yes, many open source projects are using this software, including PostNuke, Xaraya, Mambo, Tiki Wiki.</td> + </tr> + <tr valign="top"> + <td>Speed</td> + <td>Medium speed.</td> + <td>Very high speed. Fastest database abstraction library available for PHP. <a href="http://phplens.com/lens/adodb/">Benchmarks are available</a>.</td> + </tr> + <tr valign="top"> + <td>High Speed Extension available</td> + <td>No</td> + <td>Yes. You can install the optional ADOdb extension, which reimplements the most frequently used parts of ADOdb as fast C code. Note that the source code version of ADOdb runs just fine without this extension, and only makes use of the extension if detected.</td> + </tr> +</table> +<p> PEAR DB is good enough for simple web apps. But if you need more power, you can see ADOdb offers more sophisticated functionality. The rest of this article will concentrate on using ADOdb with Oracle. You can find out more about <a href="#connecting">connecting to Oracle</a> later in this guide.</p> +<h4>ADOdb Example</h4> +<p>In ADOdb, the above oci8 example querying the <i>emp</i> table could be written as:</p> +<pre> +include "/path/to/adodb.inc.php"; +$db = NewADOConnection("oci8"); +$db->Connect($tnsName, "scott", "tiger"); + +$rs = $db->Execute("select * from emp where empno>:emp order by empno", + array('emp' => 7900)); +while ($arr = $rs->FetchRow()) { + print_r($arr); + echo "&lt;hr>"; +} +</pre> +<p>The Execute( ) function returns a recordset object, and you can retrieve the rows returned using $recordset-&gt;FetchRow( ). </p> +<p>If we ignore the initial connection preamble, we can see the ADOdb version is much easier and simpler:</p> +<table width="100%" border="1"> + <tr valign="top" bgcolor="#FFFFFF"> + <td width="50%" bgcolor="#e0e0e0"><b>Oci8</b></td> + <td bgcolor="#e0e0e0"><b>ADOdb</b></td> + </tr> + <tr valign="top" bgcolor="#CCCCCC"> + <td><pre><font size="1">$stmt = <b>OCIParse</b>($conn, + "select * from emp where empno > :emp"); +$emp = 7900; +<b>OCIBindByName</b>($stmt, ':emp', $emp); +$ok = <b>OCIExecute</b>($stmt); + +while (<b>OCIFetchInto</b>($stmt,$arr)) { + print_r($arr); + echo "&lt;hr>"; +} </font></pre></td> + <td><pre><font size="1">$recordset = $db-><b>Execute</b>("select * from emp where empno>:emp", + array('emp' => 7900)); + +while ($arr = $recordset-><b>FetchRow</b>()) { + print_r($arr); + echo "&lt;hr>"; +}</font></pre></td> + </tr> +</table> +<p>&nbsp;</p> +<h3>2. ADOdb Query Semantics</h3> +<p>You can also query the database using the standard Microsoft ADO MoveNext( ) metaphor. The data array for the current row is stored in the <i>fields</i> property of the recordset object, $rs. +MoveNext( ) offers the highest performance among all the techniques for iterating through a recordset: +<pre> +$rs = $db->Execute("select * from emp where empno>:emp", array('emp' => 7900)); +while (!$rs->EOF) { + print_r($rs->fields); + $rs->MoveNext(); +} +</pre> +<p>And if you are interested in having the data returned in a 2-dimensional array, you can use: +<pre> +$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900)); +</pre> +<p>Now to obtain only the first row as an array: +<pre> +$arr = $db->GetRow("select * from emp where empno=:emp", array('emp' => 7900)); +</pre> +<p>Or to retrieve only the first field of the first row: +<pre> +$arr = $db->GetOne("select ename from emp where empno=:emp", array('emp' => 7900)); +</pre> +<p>For easy pagination support, we provide the SelectLimit function. The following will perform a select query, limiting it to 100 rows, starting from row 201 (row 1 being the 1st row): +<pre> +$offset = 200; $limitrows = 100; +$rs = $db->SelectLimit('select * from table', $limitrows, $offset); +</pre> +<p>The $offset parameter is optional. +<h4>Array Fetch Mode</h4> +<p>When data is being returned in an array, you can choose the type of array the data is returned in. +<ol> + <li> Numeric indexes - use <font size="2" face="Courier New, Courier, mono">$connection-&gt;SetFetchMode(ADODB_FETCH_NUM).</font></li> + <li>Associative indexes - the keys of the array are the names of the fields (in upper-case). Use <font size="2" face="Courier New, Courier, mono">$connection-&gt;SetFetchMode(ADODB_FETCH_ASSOC)</font><font face="Courier New, Courier, mono">.</font></li> + <li>Both numeric and associative indexes - use <font size="2" face="Courier New, Courier, mono">$connection-&gt;SetFetchMode(ADODB_FETCH_BOTH).</font></li> +</ol> +<p>The default is ADODB_FETCH_BOTH for Oracle.</p> +<h4><b>Caching</b></h4> +<p>You can define a database cache directory using $ADODB_CACHE_DIR, and cache the results of frequently used queries that rarely change. This is particularly useful for SQL with complex where clauses and group-by's and order-by's. It is also good for relieving heavily-loaded database servers.</p> +<p>This example will cache the following select statement for 3600 seconds (1 hour):</p> +<pre> +$ADODB_CACHE_DIR = '/var/adodb/tmp'; +$rs = $db->CacheExecute(3600, "select names from allcountries order by 1"); +</pre> +There are analogous CacheGetArray( +), CacheGetRow( ), CacheGetOne( ) and CacheSelectLimit( ) functions. The first parameter is the number of seconds to cache. You can also pass a bind array as a 3rd parameter (not shown above). +<p>There is an alternative syntax for the caching functions. The first parameter is omitted, and you set the cacheSecs + property of the connection object: +<pre> +$ADODB_CACHE_DIR = '/var/adodb/tmp'; +$connection->cacheSecs = 3600; +$rs = $connection->CacheExecute($sql, array('id' => 1)); +</pre> +<h3>&nbsp;</h3> +<h3>3. Using Prepare( ) For Frequently Used Statements</h3> +<p>Prepare( ) is for compiling frequently used SQL statement for reuse. For example, suppose we have a large array which needs to be inserted into an Oracle database. The following will result in a massive speedup in query execution (at least 20-40%), as the SQL statement only needs to be compiled once:</p> +<pre> +$stmt = $db->Prepare('insert into table (field1, field2) values (:f1, :f2)'); +foreach ($arrayToInsert as $key => $value) { + $db->Execute($stmt, array('f1' => $key, 'f2' => $val); +} +</pre> +<p>&nbsp;</p> +<h3>4. Working With LOBs</h3> +<p>Oracle treats data which is more than 4000 bytes in length specially. These are called Large Objects, or LOBs for short. Binary LOBs are BLOBs, and character LOBs are CLOBs. In most Oracle libraries, you need to do a lot of work to process LOBs, probably because Oracle designed it to work in systems with little memory. ADOdb tries to make things easy by assuming the LOB can fit into main memory. </p> +<p>ADOdb will transparently handle LOBs in <i>select</i> statements. The LOBs are automatically converted to PHP variables without any special coding.</p> +<p>For updating records with LOBs, the functions UpdateBlob( ) and UpdateClob( ) are provided. Here's a BLOB example. The parameters should be self-explanatory: +<pre> +$ok = $db->Execute("insert into aTable (id, name, ablob) + values (aSequence.nextVal, 'Name', null)"); +if (!$ok) return LogError($db-&gt;ErrorMsg()); +<font color="#006600"># params: $tableName, $blobFieldName, $blobValue, $whereClause</font> +$db->UpdateBlob('aTable', 'ablob', $blobValue, 'id=aSequence.currVal'); +</pre> +<p>and the analogous CLOB example: +<pre> +$ok = $db->Execute("insert into aTable (id, name, aclob) + values (aSequence.nextVal, 'Name', null)"); +if (!$ok) return LogError($db-&gt;ErrorMsg()); +$db->UpdateClob('aTable', 'aclob', $clobValue, 'id=aSequence.currVal'); +</pre> +<p>Note that LogError( ) is a user-defined function, and not part of ADOdb. +<p>Inserting LOBs is more complicated. Since ADOdb 4.55, we allow you to do this + (assuming that the <em>photo</em> field is a BLOB, and we want to store $blob_data into + this field, and the primary key is the <em>id</em> field): +<pre> + $sql = <span class="style1">"INSERT INTO photos ( ID, photo) ". + "VALUES ( :id, empty_blob() )". + " RETURNING photo INTO :xx"</span>; + + $stmt = $db->PrepareSP($sql); + $db->InParameter($stmt, $<strong>id</strong>, <span class="style1">'id'</span>); + $blob = $db->InParameter($stmt, $<strong>blob_data</strong>, <span class="style1">'xx'</span>,-1, OCI_B_BLOB); + $db->StartTrans(); + $ok = $db->Execute($stmt); + $db->CompleteTrans(); +</pre> +<p> +<h3>5. REF CURSORs</h3> +<p>Oracle recordsets can be passed around as variables called REF Cursors. For example, in PL/SQL, we could define a function <i>open_tab</i> that returns a REF CURSOR in the first parameter:</p> +<pre> +TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE; + +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS + BEGIN + OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames; + END open_tab; +</pre> +<p>In ADOdb, we could access this REF Cursor using the ExecuteCursor() function. The following will find + all table names that begin with 'A' in the current schema: +<pre> +$rs = $db->ExecuteCursor("BEGIN open_tab(:refc,'A%'); END;",'refc'); +while ($arr = $rs->FetchRow()) print_r($arr); +</pre> +<p>The first parameter is the PL/SQL statement, and the second parameter is the name of the REF Cursor. +</p> +<p>&nbsp;</p> +<h3>6. In and Out Parameters</h3> +<p>The following PL/SQL +stored procedure requires an input variable, and returns a result into an output variable: +<pre> +PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS + BEGIN + output := 'I love '||input; + END; +</pre> +<p>The following ADOdb code allows you to call the stored procedure:</p> +<pre> +$stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;"); +$input = 'Sophia Loren'; +$db->InParameter($stmt,$input,'a1'); +$db->OutParameter($stmt,$output,'a2'); +$ok = $db->Execute($stmt); +if ($ok) echo ($output == 'I love Sophia Loren') ? 'OK' : 'Failed'; +</pre> +<p>PrepareSP( ) is a special function that knows about bind parameters. +The main limitation currently is that IN OUT parameters do not work. +<h4>Bind Parameters and REF CURSORs</h4> +<p>We could also rewrite the REF CURSOR example to use InParameter (requires ADOdb 4.53 or later): +<pre> +$stmt = $db->PrepareSP("BEGIN adodb.open_tab(:refc,:tabname); END;"); +$input = 'A%'; +$db->InParameter($stmt,$input,'tabname'); +$rs = $db->ExecuteCursor($stmt,'refc'); +while ($arr = $rs->FetchRow()) print_r($arr); +</pre> +<h4>Bind Parameters and LOBs</h4> +<p>You can also operate on LOBs. In this example, we have IN and OUT parameters using CLOBs. +<pre> + $text = 'test test test'; + $sql = "declare rs clob; begin :rs := lobinout(:sa0); end;"; + $stmt = $conn -> PrepareSP($sql); + $conn -> InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB); # -1 means variable length + $rs = ''; + $conn -> OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB); + $conn -> Execute($stmt); + echo "return = ".$rs."&lt;br>"; +</pre> +<p>Similarly, you can use the constant OCI_B_BLOB to indicate that you are using BLOBs. +<h4>Reusing Bind Parameters with CURSOR_SHARING=FORCE</h4> +<p>Many web programmers do not care to use bind parameters, and prefer to enter the SQL directly. So instead of:</p> +<pre> +$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900)); +</pre> +<p>They prefer entering the values inside the SQL: +<pre> +$arr = $db->GetArray("select * from emp where empno>7900"); +</pre> +<p>This reduces Oracle performance because Oracle will reuse compiled SQL which is identical to previously compiled SQL. The above example with the values inside the SQL +is unlikely to be reused. As an optimization, from Oracle 8.1 onwards, you can set the following session parameter after you login: +<pre> +ALTER SESSION SET CURSOR_SHARING=FORCE +</pre> +<p>This will force Oracle to convert all such variables (eg. the 7900 value) into constant bind parameters, improving SQL reuse.</p> +<p>More <a href="http://phplens.com/adodb/code.initialization.html#speed">speedup tips</a>.</p> +<p>&nbsp;</p> +<h3>7. Dates and Datetime in ADOdb</h3> +<p>There are two things you need to know about dates in ADOdb. </p> +<p>First, to ensure cross-database compability, ADOdb assumes that dates are returned in ISO format (YYYY-MM-DD H24:MI:SS).</p> +<p>Secondly, since Oracle treats dates and datetime as the same data type, we decided not to display the time in the default date format. So on login, ADOdb will set the NLS_DATE_FORMAT to 'YYYY-MM-DD'. If you prefer to show the date and time by default, do this:</p> +<pre> +$db = NewADOConnection('oci8'); +$db->NLS_DATE_FORMAT = 'RRRR-MM-DD HH24:MI:SS'; +$db->Connect($tns, $user, $pwd); +</pre> +<p>Or execute:</p> +<pre>$sql = quot;ALTER SESSION SET NLS_DATE_FORMAT = 'RRRR-MM-DD HH24:MI:SS'&quot;; +$db-&gt;Execute($sql); +</pre> +<p>If you are not concerned about date portability and do not use ADOdb's portability layer, you can use your preferred date format instead. +<p> +<h3>8. Database Portability Layer</h3> +<p>ADOdb provides the following functions for portably generating SQL functions + as strings to be merged into your SQL statements:</p> +<table width="75%" border="1" align=center> + <tr> + <td width=30%><b>Function</b></td> + <td><b>Description</b></td> + </tr> + <tr> + <td>DBDate($date)</td> + <td>Pass in a UNIX timestamp or ISO date and it will convert it to a date + string formatted for INSERT/UPDATE</td> + </tr> + <tr> + <td>DBTimeStamp($date)</td> + <td>Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp + string formatted for INSERT/UPDATE</td> + </tr> + <tr> + <td>SQLDate($date, $fmt)</td> + <td>Portably generate a date formatted using $fmt mask, for use in SELECT + statements.</td> + </tr> + <tr> + <td>OffsetDate($date, $ndays)</td> + <td>Portably generate a $date offset by $ndays.</td> + </tr> + <tr> + <td>Concat($s1, $s2, ...)</td> + <td>Portably concatenate strings. Alternatively, for mssql use mssqlpo driver, + which allows || operator.</td> + </tr> + <tr> + <td>IfNull($fld, $replaceNull)</td> + <td>Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.</td> + </tr> + <tr> + <td>Param($name)</td> + <td>Generates bind placeholders, using ? or named conventions as appropriate.</td> + </tr> + <tr><td>$db->sysDate</td><td>Property that holds the SQL function that returns today's date</td> +</tr> +<tr><td>$db->sysTimeStamp</td><td>Property that holds the SQL function that returns the current +timestamp (date+time). +</td> +</tr> +<tr> +<td>$db->concat_operator</td><td>Property that holds the concatenation operator +</td> +</tr> +<tr><td>$db->length</td><td>Property that holds the name of the SQL strlen function. +</td></tr> + +<tr><td>$db->upperCase</td><td>Property that holds the name of the SQL strtoupper function. +</td></tr> +<tr><td>$db->random</td><td>Property that holds the SQL to generate a random number between 0.00 and 1.00. +</td> +</tr> +<tr><td>$db->substr</td><td>Property that holds the name of the SQL substring function. +</td></tr> +</table> +<p>ADOdb also provides multiple oracle oci8 drivers for different scenarios:</p> +<table width="75%" border="1" align="center"> + <tr> + <td nowrap><b>Driver Name</b></td> + <td><b>Description</b></td> + </tr> + <tr> + <td>oci805 </td> + <td>Specifically for Oracle 8.0.5. This driver has a slower SelectLimit( ).</td> + </tr> + <tr> + <td>oci8</td> + <td>The default high performance driver. The keys of associative arrays returned in a recordset are upper-case.</td> + </tr> + <tr> + <td>oci8po</td> + <td> The portable Oracle driver. Slightly slower than oci8. This driver uses ? instead of :<i>bindvar</i> for binding variables, which is the standard for other databases. Also the keys of associative arrays are in lower-case like other databases.</td> + </tr> +</table> +<p>Here's an example of calling the <i>oci8po</i> driver. Note that the bind variables use question-mark:</p> +<pre>$db = NewADOConnection('oci8po'); +$db-&gt;Connect($tns, $user, $pwd); +$db-&gt;Execute(&quot;insert into atable (f1, f2) values (?,?)&quot;, array(12, 'abc'));</pre> +<p>&nbsp;<a name=connecting></a> +<h3>9. Connecting to Oracle</h3> +<p>Before you can use ADOdb, you need to have the Oracle client installed and setup the oci8 extension. This extension comes pre-compiled for Windows (but you still need to enable it in the php.ini file). For information on compiling the oci8 extension for PHP and Apache on Unix, there is an excellent guide at <a href="http://www.oracle.com/technology/tech/opensource/php/apache/inst_php_apache_linux.html">oracle.com</a>. </p> +<h4>Should You Use Persistent Connections</h4> +<p>One question that is frequently asked is should you use persistent connections to Oracle. Persistent connections allow PHP to recycle existing connections, reusing them after the previous web pages have completed. Non-persistent connections close automatically after the web page has completed. Persistent connections are faster because the cost of reconnecting is expensive, but there is additional resource overhead. As an alternative, Oracle allows you to pool and reuse server processes; this is called <a href="http://www.cise.ufl.edu/help/database/oracle-docs/server.920/a96521/manproc.htm#13132">Shared Server</a> (also known as MTS).</p> +<p>The author's benchmarks suggest that using non-persistent connections and the Shared Server configuration offer the best performance. If Shared Server is not an option, only then consider using persistent connections.</p> +<h4>Connection Examples</h4> +<p>Just in case you are having problems connecting to Oracle, here are some examples:</p> +<p>a. PHP and Oracle reside on the same machine, use default SID, with non-persistent connections:</p> +<pre> $conn = NewADOConnection('oci8'); + $conn-&gt;Connect(false, 'scott', 'tiger');</pre> +<p>b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS', using persistent connections:</p> +<pre> $conn = NewADOConnection('oci8'); + $conn-&gt;PConnect(false, 'scott', 'tiger', 'myTNS');</pre> +<p>or</p> +<pre> $conn-&gt;PConnect('myTNS', 'scott', 'tiger');</pre> +<p>c. Host Address and SID</p> +<pre> + $conn->connectSID = true; + $conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'SID');</pre> +<p>d. Host Address and Service Name</p> +<pre> $conn-&gt;Connect('192.168.0.1', 'scott', 'tiger', 'servicename');</pre> +<p>e. Oracle connection string: +<pre> $cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port)) + (CONNECT_DATA=(SID=$sid)))"; + $conn-&gt;Connect($cstr, 'scott', 'tiger'); +</pre> +<p>f. ADOdb data source names (dsn): +<pre> + $dsn = 'oci8://user:pwd@tnsname/?persist'; # persist is optional + $conn = ADONewConnection($dsn); # no need for Connect/PConnect + + $dsn = 'oci8://user:pwd@host/sid'; + $conn = ADONewConnection($dsn); + + $dsn = 'oci8://user:pwd@/'; # oracle on local machine + $conn = ADONewConnection($dsn);</pre> +<p>With ADOdb data source names, +you don't have to call Connect( ) or PConnect( ). +</p> +<p>&nbsp;</p> +<h3>10. Error Checking</h3> +<p>The examples in this article are easy to read but a bit simplistic because we ignore error-handling. Execute( ) and Connect( ) will return false on error. So a more realistic way to call Connect( ) and Execute( ) is: +<pre>function InvokeErrorHandler() +{<br>global $db; ## assume global + MyLogFunction($db-&gt;ErrorNo(), $db-&gt;ErrorMsg()); +} +if (!$db-&gt;Connect($tns, $usr, $pwd)) InvokeErrorHandler(); + +$rs = $db->Execute("select * from emp where empno>:emp order by empno", + array('emp' => 7900)); +if (!$rs) return InvokeErrorHandler(); +while ($arr = $rs->FetchRow()) { + print_r($arr); + echo "&lt;hr>"; +} +</pre> +<p>You can retrieve the error message and error number of the last SQL statement executed from ErrorMsg( ) and ErrorNo( ). You can also <a href=http://phplens.com/adodb/using.custom.error.handlers.and.pear_error.html>define a custom error handler function</a>. +ADOdb also supports throwing exceptions in PHP5. +<p>&nbsp;</p> +<h3>Handling Large Recordsets (added 27 May 2005)</h3> +The oci8 driver does not support counting the number of records returned in a SELECT statement, so the function RecordCount() +is emulated when the global variable $ADODB_COUNTRECS is set to true, which is the default. +We emulate this by buffering all the records. This can take up large amounts of memory for big recordsets. + Set $ADODB_COUNTRECS to false for the best performance. + <p> +This variable is checked every time a query is executed, so you can selectively choose which recordsets to count. +<p>&nbsp;</p> +<h3>11. Other ADOdb Features</h3> +<p><a href="http://phplens.com/lens/adodb/docs-datadict.htm">Schema generation</a>. This allows you to define a schema using XML and import it into different RDBMS systems portably.</p> +<p><a href="http://phplens.com/lens/adodb/docs-perf.htm">Performance monitoring and tracing</a>. Highlights of performance monitoring include identification of poor and suspicious SQL, with explain plan support, and identifying which web pages the SQL ran on.</p> +<p>&nbsp;</p> +<h3>12. Download</h3> +<p>You can <a href="http://adodb.sourceforge.net/#download">download ADOdb from sourceforge</a>. ADOdb uses a BSD style license. That means that it is free for commercial use, and redistribution without source code is allowed.</p> +<p>&nbsp;</p> +<h3>13. Resources</h3> +<ul> + <li>Oracle's <a href="http://www.oracle.com/technology/pub/articles/php_experts/index.html">Hitchhiker Guide to PHP</a></li> + <li>OTN article on <a href=http://www.oracle.com/technology/pub/articles/deployphp/lim_deployphp.html>Optimizing PHP and Oracle</a> by this author. + <li>Oracle has an excellent <a href="http://www.oracle.com/technology/tech/opensource/php/php_troubleshooting_faq.html">FAQ on PHP</a></li> + <li>PHP <a href="http://php.net/oci8">oci8</a> manual pages</li> + <li><a href=http://phplens.com/lens/lensforum/topics.php?id=4>ADOdb forums</a>. +</ul> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-perf.htm b/pos/is4c-nf/lib/adodb5/docs/docs-perf.htm new file mode 100644 index 000000000..fad67c761 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-perf.htm @@ -0,0 +1,965 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title>ADOdb Performance Monitoring Library</title> + <style type="text/css"> +body, td { +/*font-family: Arial, Helvetica, sans-serif;*/ +font-size: 11pt; +} +pre { +font-size: 9pt; +background-color: #EEEEEE; padding: .5em; margin: 0px; +} +.toplink { +font-size: 8pt; +} + </style> +</head> +<body> +<h3>The ADOdb Performance Monitoring Library</h3> +<p>V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com)</p> +<p><font size="1">This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products.</font></p> +<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a> +&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a> +</p> +<h3>Introduction</h3> +<p>This module, part of the ADOdb package, provides both CLI and HTML +interfaces for viewing key performance indicators of your database. +This is very useful because web apps such as the popular phpMyAdmin +currently do not provide effective database health monitoring tools. +The module provides the following: </p> +<ul> + <li>A quick health check of your database server using <code>$perf-&gt;HealthCheck()</code> +or <code>$perf-&gt;HealthCheckCLI()</code>. </li> + <li>User interface for performance monitoring, <code>$perf-&gt;UI()</code>. +This UI displays: + <ul> + <li>the health check, </li> + <li>all SQL logged and their query plans, </li> + <li>a list of all tables in the current database</li> + <li>an interface to continiously poll the server for key +performance indicators such as CPU, Hit Ratio, Disk I/O</li> + <li>a form where you can enter and run SQL interactively.</li> + </ul> + </li> + <li>Gives you an API to build database monitoring tools for a server +farm, for example calling <code>$perf-&gt;DBParameter('data cache hit +ratio')</code> returns this very important statistic in a database +independant manner. </li> +</ul> +<p>ADOdb also has the ability to log all SQL executed, using <a + href="docs-adodb.htm#logsql">LogSQL</a>. All SQL logged can be +analyzed through the performance monitor <a href="#ui">UI</a>. In the <i>View +SQL</i> mode, we categorize the SQL into 3 types: +</p> +<ul> + <li><b>Suspicious SQL</b>: queries with high average execution times, +and are potential candidates for rewriting</li> + <li><b>Expensive SQL</b>: queries with high total execution times +(#executions * avg execution time). Optimizing these queries will +reduce your database server load.</li> + <li><b>Invalid SQL</b>: queries that generate errors.</li> +</ul> +<p>Each query is hyperlinked to a description of the query plan, and +every PHP script that executed that query is also shown.</p> +<p>Please note that the information presented is a very basic database +health check, and does not provide a complete overview of database +performance. Although some attempt has been made to make it work across +multiple databases in the same way, it is impossible to do so. For the +health check, we do try to display the following key database +parameters for all drivers:</p> +<ul> + <li><b>data cache size</b> - The amount of memory allocated to the +cache.</li> + <li><b>data cache hit ratio</b> - A measure of how effective the +cache is, as a percentage. The higher, the better.</li> + <li><b>current connections</b> - The number of sessions currently +connected to the database. </li> +</ul> +<p>You will need to connect to the database as an administrator to view +most of the parameters. </p> +<p>Code improvements as very welcome, particularly adding new database +parameters and automated tuning hints.</p> +<a name="usage"></a> +<h3>Usage</h3> +<p>Currently, the following drivers: <em>mysql</em>, <em>postgres</em>, +<em>oci8</em>, <em>mssql</em>, <i>informix</i> and <em>db2</em> are +supported. To create a new performance monitor, call NewPerfMonitor( ) +as demonstrated below: </p> +<pre>&lt;?php<br>include_once('adodb.inc.php');<br>session_start(); <font + color="#006600"># session variables required for monitoring</font><br>$conn = ADONewConnection($driver);<br>$conn-&gt;Connect($server,$user,$pwd,$db);<br>$perf =&amp; NewPerfMonitor($conn);<br>$perf-&gt;UI($pollsecs=5);<br>?&gt;<br></pre> +<p>It is also possible to retrieve a single database parameter:</p> +<pre>$size = $perf-&gt;DBParameter('data cache size');<br></pre> +<p> +Thx to Fernando Ortiz for the informix module. </p> +<h3>Methods</h3> +<a name="ui"></a> +<p><font face="Courier New, Courier, mono">function <b>UI($pollsecs=5)</b></font></p> +<p>Creates a web-based user interface for performance monitoring. When +you click on Poll, server statistics will be displayed every $pollsecs +seconds. See <a href="#usage">Usage</a> above. </p> +<p>Since 4.11, we allow users to enter and run SQL interactively via +the "Run SQL" link. To disable this for security reasons, set this +constant before calling $perf-&gt;UI(). </p> +<p> </p> +<pre>define('ADODB_PERF_NO_RUN_SQL',1);</pre> +<p>Sample output follows below:</p> +<table bgcolor="lightyellow" border="1" width="100%"> + <tbody> + <tr> + <td> <b><a href="http://php.weblogs.com/adodb?perf=1">ADOdb</a> +Performance Monitor</b> for localhost, db=test<br> + <font size="-1">PostgreSQL 7.3.2 on i686-pc-cygwin, compiled by +GCC gcc (GCC) 3.2 20020927 (prerelease)</font></td> + </tr> + <tr> + <td> <a href="#">Performance Stats</a> &nbsp; <a href="#">View +SQL</a> &nbsp; <a href="#">View Tables</a> &nbsp; <a href="#">Poll +Stats</a></td> + </tr> + </tbody> +</table> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>postgres7</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Value</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr> + <td>statistics collector</td> + <td>TRUE</td> + <td>Value must be TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i> +and <i>stats_block_level</i> must be set to true in postgresql.conf)</td> + </tr> + <tr> + <td>data cache hit ratio</td> + <td>99.7967555299239</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>IO</i> &nbsp;</td> + </tr> + <tr> + <td>data reads</td> + <td>125</td> + <td>&nbsp; </td> + </tr> + <tr> + <td>data writes</td> + <td>21.78125000000000000</td> + <td>Count of inserts/updates/deletes * coef</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Data Cache</i> &nbsp;</td> + </tr> + <tr> + <td>data cache buffers</td> + <td>640</td> + <td>Number of cache buffers. <a + href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic">Tuning</a></td> + </tr> + <tr> + <td>cache blocksize</td> + <td>8192</td> + <td>(estimate)</td> + </tr> + <tr> + <td>data cache size</td> + <td>5M</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>operating system cache size</td> + <td>80M</td> + <td>(effective cache size)</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Memory Usage</i> &nbsp;</td> + </tr> + <tr> + <td>sort buffer size</td> + <td>1M</td> + <td>Size of sort buffer (per query)</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i> &nbsp;</td> + </tr> + <tr> + <td>current connections</td> + <td>0</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>max connections</td> + <td>32</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Parameters</i> &nbsp;</td> + </tr> + <tr> + <td>rollback buffers</td> + <td>8</td> + <td>WAL buffers</td> + </tr> + <tr> + <td>random page cost</td> + <td>4</td> + <td>Cost of doing a seek (default=4). See <a + href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#less">random_page_cost</a></td> + </tr> + </tbody> +</table> +<p><font face="Courier New, Courier, mono">function <b>HealthCheck</b>()</font></p> +<p>Returns database health check parameters as a HTML table. You will +need to echo or print the output of this function,</p> +<p><font face="Courier New, Courier, mono">function <b>HealthCheckCLI</b>()</font></p> +<p>Returns database health check parameters formatted for a command +line interface. You will need to echo or print the output of this +function. Sample output for mysql:</p> +<pre>-- Ratios -- <br> MyISAM cache hit ratio =gt; 56.5635738832 <br> InnoDB cache hit ratio =gt; 0 <br> sql cache hit ratio =gt; 0 <br> -- IO -- <br> data reads =gt; 2622 <br> data writes =gt; 2415.5 <br> -- Data Cache -- <br> MyISAM data cache size =gt; 512K <br> BDB data cache size =gt; 8388600<br> InnoDB data cache size =gt; 8M<br> -- Memory Pools -- <br> read buffer size =gt; 131072 <br> sort buffer size =gt; 65528 <br> table cache =gt; 4 <br> -- Connections -- <br> current connections =gt; 3<br> max connections =gt; 100</pre> +<p><font face="Courier New, Courier, mono">function <b>Poll</b>($pollSecs=5) +</font> </p> +<p> Run in infinite loop, displaying the following information every +$pollSecs. This will not work properly if output buffering is enabled. +In the example below, $pollSecs=3: +</p> +<pre>Accumulating statistics...<br> Time WS-CPU% Hit% Sess Reads/s Writes/s<br>11:08:30 0.7 56.56 1 0.0000 0.0000<br>11:08:33 1.8 56.56 2 0.0000 0.0000<br>11:08:36 11.1 56.55 3 2.5000 0.0000<br>11:08:39 9.8 56.55 2 3.1121 0.0000<br>11:08:42 2.8 56.55 1 0.0000 0.0000<br>11:08:45 7.4 56.55 2 0.0000 1.5000<br></pre> +<p><b>WS-CPU%</b> is the Web Server CPU load of the server that PHP is +running from (eg. the database client), and not the database. The <b>Hit%</b> +is the data cache hit ratio. <b>Sess</b> is the current number of +sessions connected to the database. If you are using persistent +connections, this should not change much. The <b>Reads/s</b> and <b>Writes/s</b> +are synthetic values to give the viewer a rough guide to I/O, and are +not to be taken literally. </p> +<p><font face="Courier New, Courier, mono">function <b>SuspiciousSQL</b>($numsql=10)</font></p> +<p>Returns SQL which have high average execution times as a HTML table. +Each sql statement +is hyperlinked to a new window which details the execution plan and the +scripts that execute this SQL. +</p> +<p> The number of statements returned is determined by $numsql. Data is +taken from the adodb_logsql table, where the sql statements are logged +when +$connection-&gt;LogSQL(true) is enabled. The adodb_logsql table is +populated using <a href="docs-adodb.htm#logsql">$conn-&gt;LogSQL</a>. +</p> +<p>For Oracle, Ixora Suspicious SQL returns a list of SQL statements +that are most cache intensive as a HTML table. These are data intensive +SQL statements that could benefit most from tuning. </p> +<p><font face="Courier New, Courier, mono">function <b>ExpensiveSQL</b>($numsql=10)</font></p> +<p>Returns SQL whose total execution time (avg time * #executions) is +high as a HTML table. Each sql statement +is hyperlinked to a new window which details the execution plan and the +scripts that execute this SQL. +</p> +<p> The number of statements returned is determined by $numsql. Data is +taken from the adodb_logsql table, where the sql statements are logged +when +$connection-&gt;LogSQL(true) is enabled. The adodb_logsql table is +populated using <a href="docs-adodb.htm#logsql">$conn-&gt;LogSQL</a>. +</p> +<p>For Oracle, Ixora Expensive SQL returns a list of SQL statements +that are taking the most CPU load when run. +</p> +<p><font face="Courier New, Courier, mono">function <b>InvalidSQL</b>($numsql=10)</font></p> +<p>Returns a list of invalid SQL as an HTML table. +</p> +<p>Data is taken from the adodb_logsql table, where the sql statements +are logged when +$connection-&gt;LogSQL(true) is enabled. +</p> +<p><font face="Courier New, Courier, mono">function <b>Tables</b>($orderby=1)</font></p> +<p>Returns information on all tables in a database, with the first two +fields containing the table name and table size, the remaining fields +depend on the database driver. If $orderby is set to 1, it will sort by +name. If $orderby is set to 2, then it will sort by table size. Some +database drivers (mssql and mysql) will ignore the $orderby clause. For +postgresql, the information is up-to-date since the last <i>vacuum</i>. +Not supported currently for db2.</p> +<h3>Raw Functions</h3> +<p>Raw functions return values without any formatting.</p> +<p><font face="Courier New, Courier, mono">function <b>DBParameter</b>($paramname)</font></p> +<p>Returns the value of a database parameter, such as +$this-&gt;DBParameter("data cache size").</p> +<p><font face="Courier New, Courier, mono">function <b>CPULoad</b>()</font></p> +<p>Returns the CPU load of the database client (NOT THE SERVER) as a +percentage. Only works for Linux and Windows. For Windows, WMI must be +available.</p> +<h3>$ADODB_PERF_MIN</h3> +<p>New in adodb 4.97/5.03 is this global variable, which controls whether sql timings which are too small are not saved. Currently it defaults +to 0.05 (seconds). This means that all sql's which are faster than 0.05 seconds to execute are not saved. +<h3>Format of $settings Property</h3> +<p> To create new database parameters, you need to understand +$settings. The $settings data structure is an associative array. Each +element of the array defines a database parameter. The key is the name +of the database parameter. If no key is defined, then it is assumed to +be a section break, and the value is the name of the section break. If +this is too confusing, looking at the source code will help a lot!</p> +<p> Each database parameter is itself an array consisting of the +following elements:</p> +<ol start="0"> + <li> Category code, used to group related db parameters. If the +category code is 'HIDE', then +the database parameter is not shown when HTML() is called. <br> + </li> + <li> either + <ol type="a"> + <li>sql string to retrieve value, eg. "select value from +v\$parameter where name='db_block_size'", </li> + <li>array holding sql string and field to look for, e.g. +array('show variables','table_cache'); optional 3rd parameter is the +$rs-&gt;fields[$index] to use (otherwise $index=1), and optional 4th +parameter is a constant to multiply the result with (typically 100 for +percentage calculations),</li> + <li>a string prefixed by =, then a PHP method of the class is +invoked, e.g. to invoke $this-&gt;GetIndexValue(), set this array +element to '=GetIndexValue', <br> + </li> + </ol> + </li> + <li> Description of database parameter. If description begins with an +=, then it is interpreted as a method call, just as in (1c) above, +taking one parameter, the current value. E.g. '=GetIndexDescription' +will invoke $this-&gt;GetIndexDescription($val). This is useful for +generating tuning suggestions. For an example, see WarnCacheRatio().</li> +</ol> +<p>Example from MySQL, table_cache database parameter:</p> +<pre>'table cache' =gt; array('CACHE', # category code<br> array("show variables", 'table_cache'), # array (type 1b)<br> 'Number of tables to keep open'), # description</pre> +<h3>Example Health Check Output</h3> +<p><a href="#db2">db2</a> <a href="#informix">informix</a> <a + href="#mysql">mysql</a> <a href="#mssql">mssql</a> <a href="#oci8">oci8</a> +<a href="#postgres">postgres</a></p> +<p><a name="db2"></a></p> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>db2</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Value</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr bgcolor="#ffffff"> + <td>data cache hit ratio</td> + <td>0 &nbsp; </td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Data Cache</i></td> + </tr> + <tr bgcolor="#ffffff"> + <td>data cache buffers</td> + <td>250 &nbsp; </td> + <td>See <a + href="http://www7b.boulder.ibm.com/dmdd/library/techarticle/anshum/0107anshum.html#bufferpoolsize">tuning +reference</a>.</td> + </tr> + <tr bgcolor="#ffffff"> + <td>cache blocksize</td> + <td>4096 &nbsp; </td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#ffffff"> + <td>data cache size</td> + <td>1000K &nbsp; </td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i></td> + </tr> + <tr bgcolor="#ffffff"> + <td>current connections</td> + <td>2 &nbsp; </td> + <td>&nbsp;</td> + </tr> + </tbody> +</table> +<p>&nbsp;</p> +<p><a name="informix"></a> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>informix</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Val +ue</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr> + <td>data cache hit +ratio</td> + <td>95.89</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>IO</i> &nbsp;</td> + </tr> + <tr> + <td>data +reads</td> + <td>1883884</td> + <td>Page reads</td> + </tr> + <tr> + <td>data writes</td> + <td>1716724</td> + <td>Page writes</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i> +&nbsp;</td> + </tr> + <tr> + <td>current connections</td> + <td>263.0</td> + <td>Number of +sessions</td> + </tr> + </tbody> +</table> +</p> +<p>&nbsp;</p> +<p><a name="mysql" id="mysql"></a></p> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>mysql</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Value</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr> + <td>MyISAM cache hit ratio</td> + <td>56.5658301822</td> + <td><font color="red"><b>Cache ratio should be at least 90%</b></font></td> + </tr> + <tr> + <td>InnoDB cache hit ratio</td> + <td>0</td> + <td><font color="red"><b>Cache ratio should be at least 90%</b></font></td> + </tr> + <tr> + <td>sql cache hit ratio</td> + <td>0</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>IO</i> &nbsp;</td> + </tr> + <tr> + <td>data reads</td> + <td>2622</td> + <td>Number of selects (Key_reads is not accurate)</td> + </tr> + <tr> + <td>data writes</td> + <td>2415.5</td> + <td>Number of inserts/updates/deletes * coef (Key_writes is not +accurate)</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Data Cache</i> &nbsp;</td> + </tr> + <tr> + <td>MyISAM data cache size</td> + <td>512K</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>BDB data cache size</td> + <td>8388600</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>InnoDB data cache size</td> + <td>8M</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Memory Pools</i> &nbsp;</td> + </tr> + <tr> + <td>read buffer size</td> + <td>131072</td> + <td>(per session)</td> + </tr> + <tr> + <td>sort buffer size</td> + <td>65528</td> + <td>Size of sort buffer (per session)</td> + </tr> + <tr> + <td>table cache</td> + <td>4</td> + <td>Number of tables to keep open</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i> &nbsp;</td> + </tr> + <tr> + <td>current connections</td> + <td>3</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>max connections</td> + <td>100</td> + <td>&nbsp;</td> + </tr> + </tbody> +</table> +<p>&nbsp;</p> +<p><a name="mssql" id="mssql"></a></p> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>mssql</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Value</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr> + <td>data cache hit ratio</td> + <td>99.9999694824</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>prepared sql hit ratio</td> + <td>99.7738579828</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>adhoc sql hit ratio</td> + <td>98.4540169133</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>IO</i> &nbsp;</td> + </tr> + <tr> + <td>data reads</td> + <td>2858</td> + <td>&nbsp; </td> + </tr> + <tr> + <td>data writes</td> + <td>1438</td> + <td>&nbsp; </td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Data Cache</i> &nbsp;</td> + </tr> + <tr> + <td>data cache size</td> + <td>4362</td> + <td>in K</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i> &nbsp;</td> + </tr> + <tr> + <td>current connections</td> + <td>14</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>max connections</td> + <td>32767</td> + <td>&nbsp;</td> + </tr> + </tbody> +</table> +<p>&nbsp;</p> +<p><a name="oci8" id="oci8"></a></p> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>oci8</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Value</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr> + <td>data cache hit ratio</td> + <td>96.98</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>sql cache hit ratio</td> + <td>99.96</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>IO</i> &nbsp;</td> + </tr> + <tr> + <td>data reads</td> + <td>842938</td> + <td>&nbsp; </td> + </tr> + <tr> + <td>data writes</td> + <td>16852</td> + <td>&nbsp; </td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Data Cache</i> &nbsp;</td> + </tr> + <tr> + <td>data cache buffers</td> + <td>3072</td> + <td>Number of cache buffers</td> + </tr> + <tr> + <td>data cache blocksize</td> + <td>8192</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>data cache size</td> + <td>48M</td> + <td>shared_pool_size</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Memory Pools</i> &nbsp;</td> + </tr> + <tr> + <td>java pool size</td> + <td>0</td> + <td>java_pool_size</td> + </tr> + <tr> + <td>sort buffer size</td> + <td>512K</td> + <td>sort_area_size (per query)</td> + </tr> + <tr> + <td>user session buffer size</td> + <td>8M</td> + <td>large_pool_size</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i> &nbsp;</td> + </tr> + <tr> + <td>current connections</td> + <td>1</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>max connections</td> + <td>170</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>data cache utilization ratio</td> + <td>88.46</td> + <td>Percentage of data cache actually in use</td> + </tr> + <tr> + <td>user cache utilization ratio</td> + <td>91.76</td> + <td>Percentage of user cache (large_pool) actually in use</td> + </tr> + <tr> + <td>rollback segments</td> + <td>11</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Transactions</i> &nbsp;</td> + </tr> + <tr> + <td>peak transactions</td> + <td>24</td> + <td>Taken from high-water-mark</td> + </tr> + <tr> + <td>max transactions</td> + <td>187</td> + <td>max transactions / rollback segments &lt; 3.5 (or +transactions_per_rollback_segment)</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Parameters</i> &nbsp;</td> + </tr> + <tr> + <td>cursor sharing</td> + <td>EXACT</td> + <td>Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR +(9i+). See <a + href="http://www.praetoriate.com/oracle_tips_cursor_sharing.htm">cursor_sharing</a>.</td> + </tr> + <tr> + <td>index cache cost</td> + <td>0</td> + <td>% of indexed data blocks expected in the cache. Recommended +is 20-80. Default is 0. See <a + href="http://www.dba-oracle.com/oracle_tips_cbo_part1.htm">optimizer_index_caching</a>.</td> + </tr> + <tr> + <td>random page cost</td> + <td>100</td> + <td>Recommended is 10-50 for TP, and 50 for data warehouses. +Default is 100. See <a + href="http://www.dba-oracle.com/oracle_tips_cost_adj.htm">optimizer_index_cost_adj</a>. + </td> + </tr> + </tbody> +</table> +<h3>Suspicious SQL</h3> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td><b>LOAD</b></td> + <td><b>EXECUTES</b></td> + <td><b>SQL_TEXT</b></td> + </tr> + <tr> + <td align="right"> .73%</td> + <td align="right">89</td> + <td>select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o, +sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576) +and o.obj#=t.obj# and o.owner# = u.user# select i.obj#, i.flags, +u.name, o.name from sys.obj$ o, sys.user$ u, sys.ind$ i where +(bitand(i.flags, 256) = 256 or bitand(i.flags, 512) = 512) and +(not((i.type# = 9) and bitand(i.flags,8) = 8)) and o.obj#=i.obj# and +o.owner# = u.user# </td> + </tr> + <tr> + <td align="right"> .84%</td> + <td align="right">3</td> + <td>select /*+ RULE */ distinct tabs.table_name, tabs.owner , +partitioned, iot_type , TEMPORARY, table_type, table_type_owner from +DBA_ALL_TABLES tabs where tabs.owner = :own </td> + </tr> + <tr> + <td align="right"> 3.95%</td> + <td align="right">6</td> + <td>SELECT round(count(1)*avg(buf.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.buffer_pool = buf.name and buf.name = +'DEFAULT' </td> + </tr> + <tr> + <td align="right"> 4.50%</td> + <td align="right">6</td> + <td>SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.tablespace_name = tsp.tablespace_name </td> + </tr> + <tr> + <td align="right">57.34%</td> + <td align="right">9267</td> + <td>select t.schema, t.name, t.flags, q.name from +system.aq$_queue_tables t, sys.aq$_queue_table_affinities aft, +system.aq$_queues q where aft.table_objno = t.objno and +aft.owner_instance = :1 and q.table_objno = t.objno and q.usage = 0 and +bitand(t.flags, 4+16+32+64+128+256) = 0 for update of t.name, +aft.table_objno skip locked </td> + </tr> + </tbody> +</table> +<h3>Expensive SQL</h3> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td><b>LOAD</b></td> + <td><b>EXECUTES</b></td> + <td><b>SQL_TEXT</b></td> + </tr> + <tr> + <td align="right"> 5.24%</td> + <td align="right">1</td> + <td>select round(sum(bytes)/1048576) from dba_segments </td> + </tr> + <tr> + <td align="right"> 6.89%</td> + <td align="right">6</td> + <td>SELECT round(count(1)*avg(buf.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.buffer_pool = buf.name and buf.name = +'DEFAULT' </td> + </tr> + <tr> + <td align="right"> 7.85%</td> + <td align="right">6</td> + <td>SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM +DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE +obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = +seg.owner and obj.object_name = seg.segment_name and obj.object_type = +seg.segment_type and seg.tablespace_name = tsp.tablespace_name </td> + </tr> + <tr> + <td align="right">33.69%</td> + <td align="right">89</td> + <td>select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o, +sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576) +and o.obj#=t.obj# and o.owner# = u.user# </td> + </tr> + <tr> + <td align="right">36.44%</td> + <td align="right">89</td> + <td>select i.obj#, i.flags, u.name, o.name from sys.obj$ o, +sys.user$ u, sys.ind$ i where (bitand(i.flags, 256) = 256 or +bitand(i.flags, 512) = 512) and (not((i.type# = 9) and +bitand(i.flags,8) = 8)) and o.obj#=i.obj# and o.owner# = u.user# </td> + </tr> + </tbody> +</table> +<p><a name="postgres" id="postgres"></a></p> +<table bgcolor="white" border="1"> + <tbody> + <tr> + <td colspan="3"> + <h3>postgres7</h3> + </td> + </tr> + <tr> + <td><b>Parameter</b></td> + <td><b>Value</b></td> + <td><b>Description</b></td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Ratios</i> &nbsp;</td> + </tr> + <tr> + <td>statistics collector</td> + <td>FALSE</td> + <td>Must be set to TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i> +and <i>stats_block_level</i> must be set to true in postgresql.conf)</td> + </tr> + <tr> + <td>data cache hit ratio</td> + <td>99.9666031916603</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>IO</i> &nbsp;</td> + </tr> + <tr> + <td>data reads</td> + <td>15</td> + <td>&nbsp; </td> + </tr> + <tr> + <td>data writes</td> + <td>0.000000000000000000</td> + <td>Count of inserts/updates/deletes * coef</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Data Cache</i> &nbsp;</td> + </tr> + <tr> + <td>data cache buffers</td> + <td>1280</td> + <td>Number of cache buffers. <a + href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic">Tuning</a></td> + </tr> + <tr> + <td>cache blocksize</td> + <td>8192</td> + <td>(estimate)</td> + </tr> + <tr> + <td>data cache size</td> + <td>10M</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>operating system cache size</td> + <td>80000K</td> + <td>(effective cache size)</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Memory Pools</i> &nbsp;</td> + </tr> + <tr> + <td>sort buffer size</td> + <td>1M</td> + <td>Size of sort buffer (per query)</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Connections</i> &nbsp;</td> + </tr> + <tr> + <td>current connections</td> + <td>13</td> + <td>&nbsp;</td> + </tr> + <tr> + <td>max connections</td> + <td>32</td> + <td>&nbsp;</td> + </tr> + <tr bgcolor="#f0f0f0"> + <td colspan="3"><i>Parameters</i> &nbsp;</td> + </tr> + <tr> + <td>rollback buffers</td> + <td>8</td> + <td>WAL buffers</td> + </tr> + <tr> + <td>random page cost</td> + <td>4</td> + <td>Cost of doing a seek (default=4). See <a + href="http://www.varlena.com/GeneralBits/Tidbits/perf.html#less">random_page_cost</a></td> + </tr> + </tbody> +</table> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-session.htm b/pos/is4c-nf/lib/adodb5/docs/docs-session.htm new file mode 100644 index 000000000..e6af53cfa --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-session.htm @@ -0,0 +1,336 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title>ADODB Session Management Manual</title> + <meta http-equiv="Content-Type" + content="text/html; charset=iso-8859-1"> + <style type="text/css"> +body, td { +/*font-family: Arial, Helvetica, sans-serif;*/ +font-size: 11pt; +} +pre { +font-size: 9pt; +background-color: #EEEEEE; padding: .5em; margin: 0px; +} +.toplink { +font-size: 8pt; +} + </style> +</head> +<body style="background-color: rgb(255, 255, 255);"> +<h1>ADODB Session 2 Management Manual</h1> +<p> +V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com) +</p> +<p> <font size="1">This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products. </font> +<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a> +&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a> +</p> +<h2>Introduction</h2> +<p> This document discusses the newer session handler adodb-session2.php. If + you have used the older adodb-session.php, then be forewarned that you will + need to alter your session table format. Otherwise everything is <a href="#compat">backward + compatible</a>. + Here are the <a href="docs-session.old.htm">older + docs</a> for + adodb-session.php.</p> +<h2>Why Session Variables in a Database? </h2> +<p>We store state information specific to a user or web + client in session variables. These session variables persist throughout a +session, as the user moves from page to page. </p> +<p>To use session variables, call session_start() at the beginning of +your web page, before your HTTP headers are sent. Then for every +variable you want to keep alive for the duration of the session, call +session_register($variable_name). By default, the session handler will +keep track of the session by using a cookie. You can save objects or +arrays in session variables also. +</p> +<p>The default method of storing sessions is to store it in a file. +However if you have special needs such as you: +</p> +<ul> + <li>Have multiple web servers that need to share session info</li> + <li>Need to do special processing of each session</li> + <li>Require notification when a session expires</li> +</ul> +<p>The ADOdb session handler provides you with the above +additional capabilities by storing the session information as records +in a database table that can be shared across multiple servers. </p> +<p>These records will be garbage collected based on the php.ini [session] timeout settings. +You can register a notification function to notify you when the record has expired and +is about to be freed by the garbage collector.</p> +<p>An alternative to using a database backed session handler is to use <a href="http://www.danga.com/memcached/">memcached</a>. + This is a distributed memory based caching system suitable for storing session + information. + </p> +<h2> The Improved Session Handler</h2> +<p>In ADOdb 4.91, we added a new session handler, in adodb-session2.php. +It features the following improvements: +<ul> +<li>Fully supports server farms using a new database table format. The + previous version used the web server time for timestamps, which can cause problems + on a system with multiple web servers with possibly inconsistent + times. The new version uses the database server time instead for all timestamps. +<li>The older database table format is obsolete. The database table must be modified + to support storage of the database server time mentioned above. Also the field + named DATA has been changed to SESSDATA. In some databases, DATA is a reserved + word. +<li>The functions dataFieldName() and syncSeconds() is obsolete. +</ul> + +<p>Usage is + +<pre> +include_once("adodb/session/adodb-session2.php"); +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false); +session_start(); + +<font + color="#004040">#<br># Test session vars, the following should increment on refresh<br>#<br>$_SESSION['AVAR'] += 1;<br>print "&lt;p&gt;\$_SESSION['AVAR']={$_SESSION['AVAR']}&lt;/p&gt;";</font> +</pre> + +<p>When the session is created in session_start( ), the global variable $<b>ADODB_SESS_CONN</b> holds +the connection object. +<p>The default name of the table is sessions2. If you want to override it: + +<pre> +include_once("adodb/session/adodb-session2.php"); +$options['table'] = 'mytablename'; +ADOdb_Session::config($driver, $host, $user, $password, $database,$options); +session_start(); +</pre> + + +<h3>ADOdb Session Handler Features</h3> +<ul> + <li>Ability to define a notification function that is called when a +session expires. Typically +used to detect session logout and release global resources. </li> + <li>Optimization of database writes. We crc32 the session data and +only perform an update +to the session data if there is a data change. </li> + <li>Support for large amounts of session data with CLOBs (see +adodb-session-clob2.php). Useful +for Oracle. </li> + <li>Support for encrypted session data, see +adodb-cryptsession2.php. Enabling encryption is simply a matter of +including adodb-cryptsession2.php instead of adodb-session2.php. </li> +</ul> +<h3>Session Handler Files </h3> +<p>There are 3 session management files that you can use: +</p> +<pre>adodb-session2.php : The default<br>adodb-cryptsession2.php : Use this if you want to store encrypted session data in the database<br>adodb-session-clob2.php : Use this if you are storing DATA in clobs and you are NOT using oci8 driver</pre> +<h2><strong>Usage Examples</strong></h2> +<p>To force non-persistent connections, call <font color="#004040"><b>Persist</b></font>() first before session_start(): + + +<pre> + <font color="#004040"> +include_once("adodb/session/adodb-session2.php"); +$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);<b><br>ADOdb_session::Persist($connectMode=false);</b> +session_start();<br> </font> +</pre> +<p> The parameter to the Persist( ) method sets the connection mode. You can + pass the following:</p> +<table width="50%" border="1"> + <tr> + <td><b>$connectMode</b></td> + <td><b>Connection Method</b></td> + </tr> + <tr> + <td>true</td> + <td><p>PConnect( )</p></td> + </tr> + <tr> + <td>false</td> + <td>Connect( )</td> + </tr> + <tr> + <td>'N'</td> + <td>NConnect( )</td> + </tr> + <tr> + <td>'P'</td> + <td>PConnect( )</td> + </tr> + <tr> + <td>'C'</td> + <td>Connect( )</td> + </tr> +</table> +<p>To use a encrypted sessions, simply replace the file adodb-session2.php:</p> + <pre> <font + color="#004040"><b><br>include('adodb/session/adodb-cryptsession2.php');</b><br>$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);<b><br>adodb_sess_open(false,false,$connectMode=false);</b> +session_start();<br></font></pre> + <p>And the same technique for adodb-session-clob2.php:</p> + <pre> <font + color="#004040"><br><b>include('adodb/session/adodb-session2-clob2.php');</b><br>$driver = 'oci8'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; +ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);<b><br>adodb_sess_open(false,false,$connectMode=false);</b> +session_start();</font></pre> + <h2>Installation</h2> +<p>1. Create this table in your database. Here is the MySQL version: +<pre> <a + name="sessiontab"></a> <font color="#004040"> +CREATE TABLE sessions2( + sesskey VARCHAR( 64 ) NOT NULL DEFAULT '', + expiry DATETIME NOT NULL , + expireref VARCHAR( 250 ) DEFAULT '', + created DATETIME NOT NULL , + modified DATETIME NOT NULL , + sessdata LONGTEXT, + PRIMARY KEY ( sesskey ) , + INDEX sess2_expiry( expiry ), + INDEX sess2_expireref( expireref ) +)</font></pre> + + <p> For PostgreSQL, use: + <pre>CREATE TABLE sessions2( + sesskey VARCHAR( 64 ) NOT NULL DEFAULT '', + expiry TIMESTAMP NOT NULL , + expireref VARCHAR( 250 ) DEFAULT '', + created TIMESTAMP NOT NULL , + modified TIMESTAMP NOT NULL , + sessdata TEXT DEFAULT '', + PRIMARY KEY ( sesskey ) + ); +</pre> + <pre>create INDEX sess2_expiry on sessions2( expiry ); +create INDEX sess2_expireref on sessions2 ( expireref );</pre> + <p>Here is the Oracle definition, which uses a CLOB for the SESSDATA field: + <pre> + <font + color="#004040">CREATE TABLE SESSIONS2<br>(<br> SESSKEY VARCHAR2(48 BYTE) NOT NULL,<br> EXPIRY DATE NOT NULL,<br> EXPIREREF VARCHAR2(200 BYTE),<br> CREATED DATE NOT NULL,<br> MODIFIED DATE NOT NULL,<br> SESSDATA CLOB,<br> PRIMARY KEY(SESSKEY)<br>); +<br>CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY); +CREATE INDEX SESS2_EXPIREREF ON SESSIONS2(EXPIREREF);</font></pre> +<p> We need to use a CLOB here because for text greater than 4000 bytes long, + Oracle requires you to use the CLOB data type. If you are using the oci8 driver, + ADOdb will automatically enable CLOB handling. So you can use either adodb-session2.php + or adodb-session-clob2.php - in this case it doesn't matter. <br> +<h2>Notifications</h2> +<p>You can receive notification when your session is cleaned up by the session garbage collector or +when you call session_destroy(). +<p>PHP's session extension will automatically run a special garbage collection function based on +your php.ini session.cookie_lifetime and session.gc_probability settings. This will in turn call +adodb's garbage collection function, which can be setup to do notification. +<p> +<pre> + PHP Session --> ADOdb Session --> Find all recs --> Send --> Delete queued + GC Function GC Function to be deleted notification records + executed at called by for all recs + random time Session Extension queued for deletion +</pre> +<p>When a session is created, we need to store a value in the session record (in the EXPIREREF field), typically +the userid of the session. Later when the session has expired, just before the record is deleted, +we reload the EXPIREREF field and call the notification function with the value of EXPIREREF, which +is the userid of the person being logged off. +<p>ADOdb uses a global variable $ADODB_SESSION_EXPIRE_NOTIFY that you must predefine before session +start to store the notification configuration. +$ADODB_SESSION_EXPIRE_NOTIFY is an array with 2 elements, the +first being the name of the session variable you would like to store in +the EXPIREREF field, and the 2nd is the notification function's name. </p> +<p>For example, suppose we want to be notified when a user's session has expired, +based on the userid. When the user logs in, we store the id in the global session variable +$USERID. The function name is 'NotifyFn'. +<p> +So we define (before session_start() is called): </p> +<pre> <font color="#004040"> + $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn'); +</font></pre> +And when the NotifyFn is called (when the session expires), the +$EXPIREREF holding the user id is passed in as the first parameter, eg. NotifyFn($userid, $sesskey). The +session key (which is the primary key of the record in the sessions +table) is the 2nd parameter. +<p> Here is an example of a Notification function that deletes some +records in the database and temporary files: </p> +<pre><font color="#004040"> + function NotifyFn($expireref, $sesskey) + { + global $ADODB_SESS_CONN; # the session connection object + $user = $ADODB_SESS_CONN-&gt;qstr($expireref); + + $ADODB_SESS_CONN-&gt;Execute("delete from shopping_cart where user=$user"); + system("rm /work/tmpfiles/$expireref/*"); + }</font> + </pre> +<p> NOTE 1: If you have register_globals disabled in php.ini, then you +will have to manually set the EXPIREREF. E.g. </p> +<pre> <font color="#004040"> +$GLOBALS['USERID'] = GetUserID(); +$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');</font> +</pre> +<p> NOTE 2: If you want to change the EXPIREREF after the session +record has been created, you will need to modify any session variable +to force a database record update. +</p> +<h3>Neat Notification Tricks</h3> +<p><i>ExpireRef</i> normally holds the user id of the current session. +</p> +<p>1. You can then write a session monitor, scanning expireref to see +who is currently logged on. +</p> +<p>2. If you delete the sessions record for a specific user, eg. +</p> +<pre>delete from sessions where expireref = '$USER'<br></pre> +then the user is logged out. Useful for ejecting someone from a +site. +<p>3. You can scan the sessions table to ensure no user +can be logged in twice. Useful for security reasons. +</p> +<h2>Compression/Encryption Schemes</h2> +Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and +compression schemes are supported. Currently, supported are: +<p> +<pre> MD5Crypt (crypt.inc.php)<br> MCrypt<br> Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)<br> GZip<br> BZip2<br></pre> +<p>These are stackable. E.g. +<pre>ADODB_Session::filter(new ADODB_Compress_Bzip2());<br>ADODB_Session::filter(new ADODB_Encrypt_MD5());<br></pre> +will compress and then encrypt the record in the database. +<h2>Session Cookie Regeneration: adodb_session_regenerate_id()</h2> +<p>Dynamically change the current session id with a newly generated one and update + database. Currently only works with cookies. Useful to improve security by + reducing the risk of session-hijacking. See this article on <a href=http://shiflett.org/articles/security-corner-feb2004>Session + Fixation</a> for more info +on the theory behind this feature. Usage:<pre> + include('path/to/adodb/session/adodb-session2.php'); + + session_start(); + # Approximately every 10 page loads, reset cookie for safety. + # This is extremely simplistic example, better + # to regenerate only when the user logs in or changes + # user privilege levels. + if ((rand()%10) == 0) adodb_session_regenerate_id(); +</pre> +<p>This function calls session_regenerate_id() internally or simulates it if the function does not exist. +<h2>Vacuum/Optimize Database</h2> +<p>During session garbage collection, if postgresql is detected, + ADOdb can be set to run VACUUM. If mysql is detected, then optimize database + could be called.You can turn this on or off using:</p> +<pre>$turnOn = true; # or false +ADODB_Session::optimize($turnOn); +</pre> +<p>The default is optimization is disabled.</p> +<h2><a name=compat></a>Backwards Compatability </h2> +<p>The older method of connecting to ADOdb using global variables is still supported:</p> +<pre> $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD ='abc'; + $ADODB_SESSION_DB ='phplens'; + + include('path/to/adodb/session/adodb-<strong>session2</strong>.php'); </pre> +<p>In the above example, the only things you need to change in your code to upgrade + is </p> +<ul> + <li>your session table format to the new one.</li> + <li>the include file from adodb-session.php to adodb-session2.php. </li> +</ul> +<h2>More Info</h2> +<p>Also see the <a href="docs-adodb.htm">core ADOdb documentation</a>. And if + you are interested in the obsolete adodb-session.php, see <a href="docs-session.old.htm">old + session documentation</a>. </p> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/docs-session.old.htm b/pos/is4c-nf/lib/adodb5/docs/docs-session.old.htm new file mode 100644 index 000000000..88eb6c7fb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/docs-session.old.htm @@ -0,0 +1,313 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title>ADODB Old Session Management Manual</title> + <meta http-equiv="Content-Type" + content="text/html; charset=iso-8859-1"> + <style type="text/css"> +body, td { +/*font-family: Arial, Helvetica, sans-serif;*/ +font-size: 11pt; +} +pre { +font-size: 9pt; +background-color: #EEEEEE; padding: .5em; margin: 0px; +} +.toplink { +font-size: 8pt; +} + </style> +</head> +<body style="background-color: rgb(255, 255, 255);"> +<h3>ADODB Session Management Manual</h3> +<p> +V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com) +</p> +<p> <font size="1">This software is dual licensed using BSD-Style and +LGPL. This means you can use it in compiled proprietary and commercial +products. </font> +<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a> +&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a> +</p> +<h3>Introduction</h3> +<p>This documentation discusses the old adodb-session.php. +Here is the <a href=docs-session.htm>new documentation</a> on the newer adodb-session2.php. +<p> We store state information specific to a user or web client in +session variables. These session variables persist throughout a +session, as the user moves from page to page. </p> +<p>To use session variables, call session_start() at the beginning of +your web page, before your HTTP headers are sent. Then for every +variable you want to keep alive for the duration of the session, call +session_register($variable_name). By default, the session handler will +keep track of the session by using a cookie. You can save objects or +arrays in session variables also. +</p> +<p>The default method of storing sessions is to store it in a file. +However if you have special needs such as you: +</p> +<ul> + <li>Have multiple web servers that need to share session info</li> + <li>Need to do special processing of each session</li> + <li>Require notification when a session expires</li> +</ul> +<p>The ADOdb session handler provides you with the above +additional capabilities by storing the session information as records +in a database table that can be shared across multiple servers. </p> +<p>These records will be garbage collected based on the php.ini [session] timeout settings. +You can register a notification function to notify you when the record has expired and +is about to be freed by the garbage collector.</p> +<p><b>Important Upgrade Notice:</b> Since ADOdb 4.05, the session files +have been moved to its own folder, adodb/session. This is a rewrite +of the session code by Ross Smith. The old session code is in +adodb/session/old. </p> +<h4>ADOdb Session Handler Features</h4> +<ul> + <li>Ability to define a notification function that is called when a +session expires. Typically +used to detect session logout and release global resources. </li> + <li>Optimization of database writes. We crc32 the session data and +only perform an update +to the session data if there is a data change. </li> + <li>Support for large amounts of session data with CLOBs (see +adodb-session-clob.php). Useful +for Oracle. </li> + <li>Support for encrypted session data, see +adodb-cryptsession.php. Enabling encryption is simply a matter of +including adodb-cryptsession.php instead of adodb-session.php. </li> +</ul> +<h3>Setup</h3> +<p>There are 3 session management files that you can use: +</p> +<pre>adodb-session.php : The default<br>adodb-session-clob.php : Use this if you are storing DATA in clobs<br>adodb-cryptsession.php : Use this if you want to store encrypted session data in the database<br><br> +</pre> +<p><strong>Examples</strong> +<p><pre> + <font + color="#004040"> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';</b><br> <br> <b>include('adodb/session/adodb-session.php');</b><br> session_start();<br> <br> #<br> # Test session vars, the following should increment on refresh<br> #<br> $_SESSION['AVAR'] += 1;<br> print "&lt;p&gt;\$_SESSION['AVAR']={$_SESSION['AVAR']}&lt;/p&gt;";<br></font></pre> + +<p>To force non-persistent connections, call adodb_session_open() first before session_start(): +<p> + <pre> + <font color="#004040"><br> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';</b><br> <br> <b>include('adodb/session/adodb-session.php');<br> adodb_sess_open(false,false,false);</b><br> session_start();<br> </font> + </pre> +<p> The 3rd parameter to adodb_sess_open($path, $sessname, $connectMode) sets the connection method. You can pass in the following:</p> +<table width="50%" border="1"> + <tr> + <td><b>$connectMode</b></td> + <td><b>Connection Method</b></td> + </tr> + <tr> + <td>true</td> + <td><p>PConnect( )</p></td> + </tr> + <tr> + <td>false</td> + <td>Connect( )</td> + </tr> + <tr> + <td>'N'</td> + <td>NConnect( )</td> + </tr> + <tr> + <td>'P'</td> + <td>PConnect( )</td> + </tr> + <tr> + <td>'C'</td> + <td>Connect( )</td> + </tr> +</table> +<p>To use a encrypted sessions, simply replace the file adodb-session.php:</p> + <pre> <font + color="#004040"><br> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';<br> <br> include('adodb/session/adodb-cryptsession.php');</b><br> session_start();</font><br> + </pre> + <p>And the same technique for adodb-session-clob.php:</p> + <pre> <font + color="#004040"><br> include('adodb/adodb.inc.php');<br> <br><b> $ADODB_SESSION_DRIVER='mysql';<br> $ADODB_SESSION_CONNECT='localhost';<br> $ADODB_SESSION_USER ='scott';<br> $ADODB_SESSION_PWD ='tiger';<br> $ADODB_SESSION_DB ='sessiondb';<br> <br> include('adodb/session/adodb-session-clob.php');</b><br> session_start();</font> + </pre> + <p>An alternative way to set persistant or non-persistent connections is to call the following function before session_start() is called. + <pre> + ADODB_Session::persist('P'); # 'C' for non-persistent connections + </pre> + <h4>Installation</h4> +<p>1. Create this table in your database (MySQL syntax): +<p><pre> <a + name="sessiontab"></a> <font color="#004040"> + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA text not null, + primary key (sesskey) + );</font> + </pre> + + <p>You may want to rename the 'data' field to 'session_data' as + 'data' appears to be a reserved word for one or more of the following: + <ul> + <li> ANSI SQL + <li> IBM DB2 + <li> MS SQL Server + <li> Postgres + <li> SAP + </ul> +<p> + If you do, then execute: +<pre> + ADODB_Session::dataFieldName('session_data'); +</pre> + <p> For the adodb-session-clob.php version, create this: +<p> <pre> + <font + color="#004040"><br> create table sessions (<br> SESSKEY char(32) not null,<br> EXPIRY int(11) unsigned not null,<br> EXPIREREF varchar(64),<br> DATA CLOB,<br> primary key (sesskey)<br> );</font> + </pre> + <p>2. Then define the following parameters. You can either modify this file, or define them before this file is included: + <pre> <font + color="#004040"><br> $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';<br> $ADODB_SESSION_CONNECT='server to connect to';<br> $ADODB_SESSION_USER ='user';<br> $ADODB_SESSION_PWD ='password';<br> $ADODB_SESSION_DB ='database';<br> $ADODB_SESSION_TBL = 'sessions'; # setting this is optional<br> </font> + </pre><p> + When the session is created, $<b>ADODB_SESS_CONN</b> holds the connection object.<br> <br> 3. Recommended is PHP 4.0.6 or later. There are documented session bugs in earlier versions of PHP. +<h3>Notifications</h3> +<p>You can receive notification when your session is cleaned up by the session garbage collector or +when you call session_destroy(). +<p>PHP's session extension will automatically run a special garbage collection function based on +your php.ini session.cookie_lifetime and session.gc_probability settings. This will in turn call +adodb's garbage collection function, which can be setup to do notification. +<p> +<pre> + PHP Session --> ADOdb Session --> Find all recs --> Send --> Delete queued + GC Function GC Function to be deleted notification records + executed at called by for all recs + random time Session Extension queued for deletion +</pre> +<p>When a session is created, we need to store a value in the session record (in the EXPIREREF field), typically +the userid of the session. Later when the session has expired, just before the record is deleted, +we reload the EXPIREREF field and call the notification function with the value of EXPIREREF, which +is the userid of the person being logged off. +<p>ADOdb uses a global variable $ADODB_SESSION_EXPIRE_NOTIFY that you must predefine before session +start to store the notification configuration. +$ADODB_SESSION_EXPIRE_NOTIFY is an array with 2 elements, the +first being the name of the session variable you would like to store in +the EXPIREREF field, and the 2nd is the notification function's name. </p> +<p>For example, suppose we want to be notified when a user's session has expired, +based on the userid. When the user logs in, we store the id in the global session variable +$USERID. The function name is 'NotifyFn'. +<p> +So we define (before session_start() is called): </p> +<pre> <font color="#004040"> + $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn'); +</font></pre> +And when the NotifyFn is called (when the session expires), the +$USERID is passed in as the first parameter, eg. NotifyFn($userid, $sesskey). The +session key (which is the primary key of the record in the sessions +table) is the 2nd parameter. +<p> Here is an example of a Notification function that deletes some +records in the database and temporary files: </p> +<pre><font color="#004040"> + function NotifyFn($expireref, $sesskey) + { + global $ADODB_SESS_CONN; # the session connection object + $user = $ADODB_SESS_CONN-&gt;qstr($expireref); + + $ADODB_SESS_CONN-&gt;Execute("delete from shopping_cart where user=$user"); + system("rm /work/tmpfiles/$expireref/*"); + }</font> + </pre> +<p> NOTE 1: If you have register_globals disabled in php.ini, then you +will have to manually set the EXPIREREF. E.g. </p> +<pre> <font color="#004040"> +$GLOBALS['USERID'] = GetUserID(); +$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');</font> +</pre> +<p> NOTE 2: If you want to change the EXPIREREF after the session +record has been created, you will need to modify any session variable +to force a database record update. +</p> +<h4>Neat Notification Tricks</h4> +<p><i>ExpireRef</i> normally holds the user id of the current session. +</p> +<p>1. You can then write a session monitor, scanning expireref to see +who is currently logged on. +</p> +<p>2. If you delete the sessions record for a specific user, eg. +</p> +<pre>delete from sessions where expireref = '$USER'<br></pre> +then the user is logged out. Useful for ejecting someone from a +site. +<p>3. You can scan the sessions table to ensure no user +can be logged in twice. Useful for security reasons. +</p> +<h3>Using Oracle CLOBs</h3> +<p>Suppose you are storing the DATA field in a CLOB: + <pre><font color="#004040"> + CREATE TABLE sessions ( + SESSKEY VARCHAR(32) NOT NULL, + EXPIRY NUMBER(16) NOT NULL, + EXPIREREF VARCHAR(64), + DATA CLOB, + PRIMARY KEY (sesskey) + );</font> + </pre> + <p>Then your PHP code could look like this: + <pre> + ADODB_SESSION_DRIVER='oci8'; + $ADODB_SESSION_CONNECT=$tnsname; + $ADODB_SESSION_USER ='scott'; + $ADODB_SESSION_PWD = 'tiger'; + $ADODB_SESSION_DB =''; + + $ADODB_SESSION_USE_LOBS = 'clob'; + $ADODB_SESSION_TBL = 'sessions'; + + $ADODB_SESS_DEBUG=0; + + include(ADODB_DIR.'/session/adodb-session.php'); + + ADODB_Session::persist('P'); # use 'C' for non-persistent connects + + session_start(); + </pre> + <p>Note that you can set persistance using ADODB_Session::persist('P'). + +<h3>Compression/Encryption Schemes</h3> +Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and +compression schemes are supported. Currently, supported are: +<p> +<pre> MD5Crypt (crypt.inc.php)<br> MCrypt<br> Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)<br> GZip<br> BZip2<br></pre> +<p>These are stackable. E.g. +<p><pre>ADODB_Session::filter(new ADODB_Compress_Bzip2());<br>ADODB_Session::filter(new ADODB_Encrypt_MD5());<br></pre> +will compress and then encrypt the record in the database. +<h3>adodb_session_regenerate_id()</h3> +<p>Dynamically change the current session id with a newly generated one and update database. Currently only +works with cookies. Useful to improve security by reducing the risk of session-hijacking. +See this article on <a href=http://shiflett.org/articles/security-corner-feb2004>Session Fixation</a> for more info +on the theory behind this feature. Usage: +<pre> + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD ='abc'; + $ADODB_SESSION_DB ='phplens'; + + include('path/to/adodb/session/adodb-session.php'); + + session_start(); + # Every 10 page loads, reset cookie for safety. + # This is extremely simplistic example, better + # to regenerate only when the user logs in or changes + # user privilege levels. + if ((rand()%10) == 0) adodb_session_regenerate_id(); +</pre> +<p>This function calls session_regenerate_id() internally or simulates it if the function does not exist. +<h3>Vacuum/Optimize Database</h3> +<p>During session garbage collection, if postgresql is detected, + ADOdb can be set to run VACUUM. If mysql is detected, then optimize database + could be called.You can turn this on or off using:</p> +<pre>$turnOn = true; # or false +ADODB_Session::optimize($turnOn); +</pre> +<p>The default for optimization is it is disabled.</p> +<h2>More Info</h2> +<p>Also see the <a href="docs-adodb.htm">core ADOdb documentation</a>. +</p> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/old-changelog.htm b/pos/is4c-nf/lib/adodb5/docs/old-changelog.htm new file mode 100644 index 000000000..bf8a1af26 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/old-changelog.htm @@ -0,0 +1,822 @@ +<html><title>Old Changelog: ADOdb</title><body> +<h3>Old Changelog</h3> + +</p><p><b>3.92 22 Sept 2003</b> +</p><p>Added GetAssoc and CacheGetAssoc to connection object. +</p><p>Removed TextMax and CharMax functions from adodb.inc.php. +</p><p>HasFailedTrans() returned false when trans failed. Fixed. +</p><p>Moved perf driver classes into adodb/perf/*.php. +</p><p>Misc improvements to performance monitoring, including UI(). +</p><p>RETVAL in mssql Parameter(), we do not append @ now. +</p><p>Added Param($name) to connection class, returns '?' or ":$name", for defining + bind parameters portably. +</p><p>LogSQL traps affected_rows() and saves its value properly now. Also fixed oci8 + _stmt and _affectedrows() bugs. +</p><p>Session code timestamp check for oci8 works now. Formerly default NLS_DATE_FORMAT + stripped off time portion. Thx to Tony Blair (tonanbarbarian#hotmail.com). Also + added new $conn-&gt;datetime field to oci8, controls whether MetaType() returns + 'D' ($this-&gt;datetime==false) or 'T' ($this-&gt;datetime == true) for DATE type. +</p><p>Fixed bugs in adodb-cryptsession.inc.php and adodb-session-clob.inc.php. +</p><p>Fixed misc bugs in adodb_key_exists, GetInsertSQL() and GetUpdateSQL(). +</p><p>Tuned include_once handling to reduce file-system checking overhead. +</p><p><b>3.91 9 Sept 2003</b> +</p><p>Only released to InterAkt +</p><p>Added LogSQL() for sql logging and $ADODB_NEWCONNECTION to override factory + for driver instantiation. +</p><p>Added IfNull($field,$ifNull) function, thx to johnwilk#juno.com +</p><p>Added portable substr support. +</p><p>Now rs2html() has new parameter, $echo. Set to false to return $html instead + of echoing it. +</p><p><b>3.90 5 Sept 2003</b> +</p><p>First beta of performance monitoring released. +</p><p>MySQL supports MetaTable() masking. +</p><p>Fixed key_exists() bug in adodb-lib.inc.php +</p><p>Added sp_executesql Prepare() support to mssql. +</p><p>Added bind support to db2. +</p><p>Added swedish language file - Christian Tiberg" christian#commsoft.nu +</p><p>Bug in drop index for mssql data dict fixed. Thx to Gert-Rainer Bitterlich. +</p><p>Left join setting for oci8 was wrong. Thx to johnwilk#juno.com +</p><p><b>3.80 27 Aug 2003</b> +</p><p>Patch for PHP 4.3.3 cached recordset csv2rs() fread loop incompatibility. +</p><p>Added matching mask for MetaTables. Only for oci8, mssql and postgres currently. +</p><p>Rewrite of "oracle" driver connection code, merging with "oci8", by Gaetano. +</p><p>Added better debugging for Smart Transactions. +</p><p>Postgres DBTimeStamp() was wrongly using TO_DATE. Changed to TO_TIMESTAMP. +</p><p>ADODB_FETCH_CASE check pushed to ADONewConnection to allow people to define + it after including adodb.inc.php. +</p><p>Added portugese (brazilian) to languages. Thx to "Levi Fukumori". +</p><p>Removed arg3 parameter from Execute/SelectLimit/Cache* functions. +</p><p>Execute() now accepts 2-d array as $inputarray. Also changed docs of fnExecute() + to note change in sql query counting with 2-d arrays. +</p><p>Added MONEY to MetaType in PostgreSQL. +</p><p>Added more debugging output to CacheFlush(). +</p><p><b>3.72 9 Aug 2003</b> +</p><p>Added qmagic($str), which is a qstr($str) that auto-checks for magic quotes + and does the right thing... +</p><p>Fixed CacheFlush() bug - Thx to martin#gmx.de +</p><p>Walt Boring contributed MetaForeignKeys for postgres7. +</p><p>_fetch() called _BlobDecode() wrongly in interbase. Fixed. +</p><p>adodb_time bug fixed with dates after 2038 fixed by Jason Pell. http://phplens.com/lens/lensforum/msgs.php?id=6980 +</p><p><b>3.71 4 Aug 2003</b> +</p><p>The oci8 driver, MetaPrimaryKeys() did not check the owner correctly when $owner + == false. +</p><p>Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru. +</p><p>Spanish language file contributed by "Horacio Degiorgi" horaciod#codigophp.com. +</p><p>Error handling in oci8 bugfix - if there was an error in Execute(), then when + calling ErrorNo() and/or ErrorMsg(), the 1st call would return the error, but + the 2nd call would return no error. +</p><p>Error handling in odbc bugfix. ODBC would always return the last error, even + if it happened 5 queries ago. Now we reset the errormsg to '' and errorno to + 0 everytime before CacheExecute() and Execute(). +</p><p><b>3.70 29 July 2003</b> +</p><p>Added new SQLite driver. Tested on PHP 4.3 and PHP 5. +</p><p>Added limited "sapdb" driver support - mainly date support. +</p><p>The oci8 driver did not identify NUMBER with no defined precision correctly. +</p><p>Added ADODB_FORCE_NULLS, if set, then PHP nulls are converted to SQL nulls + in GetInsertSQL/GetUpdateSQL. +</p><p>DBDate() and DBTimeStamp() format for postgresql had problems. Fixed. +</p><p>Added tableoptions to ChangeTableSQL(). Thx to Mike Benoit. +</p><p>Added charset support to postgresql. Thx to Julian Tarkhanov. +</p><p>Changed OS check for MS-Windows to prevent confusion with darWIN (MacOS) +</p><p>Timestamp format for db2 was wrong. Changed to yyyy-mm-dd-hh.mm.ss.nnnnnn. +</p><p>adodb-cryptsession.php includes wrong. Fixed. +</p><p>Added MetaForeignKeys(). Supported by mssql, odbc_mssql and oci8. +</p><p>Fixed some oci8 MetaColumns/MetaPrimaryKeys bugs. Thx to Walt Boring. +</p><p>adodb_getcount() did not init qryRecs to 0. Missing "WHERE" clause checking + in GetUpdateSQL fixed. Thx to Sebastiaan van Stijn. +</p><p>Added support for only 'VIEWS' and "TABLES" in MetaTables. From Walt Boring. +</p><p>Upgraded to adodb-xmlschema.inc.php 0.0.2. +</p><p>NConnect for mysql now returns value. Thx to Dennis Verspuij. +</p><p>ADODB_FETCH_BOTH support added to interbase/firebird. +</p><p>Czech language file contributed by Kamil Jakubovic jake#host.sk. +</p><p>PostgreSQL BlobDecode did not use _connectionID properly. Thx to Juraj Chlebec. +</p><p>Added some new initialization stuff for Informix. Thx to "Andrea Pinnisi" pinnisi#sysnet.it +</p><p>ADODB_ASSOC_CASE constant wrong in sybase _fetch(). Fixed. +</p><p><b>3.60 16 June 2003</b> +</p><p>We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with + mssql driver. +</p><p>The property $emptyDate missing from connection class. Also changed 1903 to + constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn. +</p><p>ADOdb speedup optimization - we now return all arrays by reference. +</p><p>Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter. + Suggested by vincent. +</p><p>Added GetArray() to connection class. +</p><p>Added not_null check in informix metacolumns(). +</p><p>Connection parameters for postgresql did not work correctly when port was defined. +</p><p>DB2 is now a tested driver, making adodb 100% compatible. Extensive changes + to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching + to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit() + fixes. +</p><p>The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed. +</p><p>Some bugs in adodb_backtrace() fixed. +</p><p>Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql + properly. +</p><p>MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions + to odbc MetaColumns() for vfp and db2 compat. +</p><p>Added unsigned support to mysql datadict class. Thx to iamsure. +</p><p>Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to + Josh R, Night_Wulfe#hotmail.com. +</p><p>ChangeTableSQL contributed by Florian Buzin. +</p><p>The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with + mssql driver. +</p> + +<p><b>3.50 19 May 2003</b></p> +<p>Fixed mssql compat with FreeTDS. FreeTDS does not implement mssql_fetch_assoc(). +<p>Merged back connection and recordset code into adodb.inc.php. +<p>ADOdb sessions using oracle clobs contributed by achim.gosse#ddd.de. See adodb-session-clob.php. +<p>Added /s modifier to preg_match everywhere, which ensures that regex does not + stop at /n. Thx Pao-Hsi Huang. +<p>Fixed error in metacolumns() for mssql. +<p>Added time format support for SQLDate. +<p>Image => B added to metatype. +<p>MetaType now checks empty($this->blobSize) instead of empty($this). +<p>Datadict has beta support for informix, sybase (mapped to mssql), db2 and generic + (which is a fudge). +<p>BlobEncode for postgresql uses pg_escape_bytea, if available. Needed for compat + with 7.3. +<p>Added $ADODB_LANG, to support multiple languages in MetaErrorMsg(). +<p>Datadict can now parse table definition as declarative text. +<p>For DataDict, oci8 autoincrement trigger missing semi-colon. Fixed. +<p>For DataDict, when REPLACE flag enabled, drop sequence in datadict for autoincrement + field in postgres and oci8.s +<p>Postgresql defaults to template1 database if no database defined in connect/pconnect. +<p>We now clear _resultid in postgresql if query fails. +<p><b>3.40 19 May 2003</b></p> +<p>Added insert_id for odbc_mssql. +<p>Modified postgresql UpdateBlobFile() because it did not work in safe mode. +<p>Now connection object is passed to raiseErrorFn as last parameter. Needed by + StartTrans(). +<p>Added StartTrans() and CompleteTrans(). It is recommended that you do not modify + transOff, but use the above functions. +<p>oci8po now obeys ADODB_ASSOC_CASE settings. +<p>Added virtualized error codes, using PEAR DB equivalents. Requires you to manually + include adodb-error.inc.php yourself, with MetaError() and MetaErrorMsg($errno). +<p>GetRowAssoc for mysql and pgsql were flawed. Fix by Ross Smith. +<p>Added to datadict types I1, I2, I4 and I8. Changed datadict type 'T' to map + to timestamp instead of datetime for postgresql. +<p>Error handling in ExecuteSQLArray(), adodb-datadict.inc.php did not work. +<p>We now auto-quote postgresql connection parameters when building connection + string. +<p>Added session expiry notification. +<p>We now test with odbc mysql - made some changes to odbc recordset constructor. +<p>MetaColumns now special cases access and other databases for odbc. +<p><b>3.31 17 March 2003</b></p> +<p>Added row checking for _fetch in postgres. +<p>Added Interval type to MetaType for postgres. +<p>Remapped postgres driver to call postgres7 driver internally. +<p>Adorecordset_array::getarray() did not return array when nRows >= 0. +<p>Postgresql: at times, no error message returned by pg_result_error() but error + message returned in pg_last_error(). Recoded again. +<p>Interbase blob's now use chunking for updateblob. +<p>Move() did not set EOF correctly. Reported by Jorma T. +<p>We properly support mysql timestamp fields when we are creating mysql tables + using the data-dict interface. +<p>Table regex includes backticks character now. +<p><b>3.30 3 March 2003</b></p> +<p>Added $ADODB_EXTENSION and $ADODB_COMPAT_FETCH constant. +<p>Made blank1stItem configurable using syntax "value:text" in GetMenu/GetMenu2. + Thx to Gabriel Birke. +<p>Previously ADOdb differed from the Microsoft standard because it did not define + what to set $this->fields when EOF was reached. Now at EOF, ADOdb sets $this->fields + to false for all databases, which is consist with Microsoft's implementation. + Postgresql and mysql have always worked this way (in 3.11 and earlier). If you + are experiencing compatibility problems (and you are not using postgresql nor + mysql) on upgrading to 3.30, try setting the global variables $ADODB_COUNTRECS + = true (which is the default) and $ADODB_FETCH_COMPAT = true (this is a new + global variable). +<p>We now check both pg_result_error and pg_last_error as sometimes pg_result_error + does not display anything. Iman Mayes +<p> We no longer check for magic quotes gpc in Quote(). +<p> Misc fixes for table creation in adodb-datadict.inc.php. Thx to iamsure. +<p> Time calculations use adodb_time library for all negative timestamps due to + problems in Red Hat 7.3 or later. Formerly, only did this for Windows. +<p> In mssqlpo, we now check if $sql in _query is a string before we change || + to +. This is to support prepared stmts. +<p> Move() and MoveLast() internals changed to support to support EOF and $this->fields + change. +<p> Added ADODB_FETCH_BOTH support to mssql. Thx to Angel Fradejas afradejas#mediafusion.es +<p> We now check if link resource exists before we run mysql_escape_string in + qstr(). +<p> Before we flock in csv code, we check that it is not a http url. +<p><b>3.20 17 Feb 2003</b></p> +<p>Added new Data Dictionary classes for creating tables and indexes. Warning + - this is very much alpha quality code. The API can still change. See adodb/tests/test-datadict.php + for more info. +<p>We now ignore $ADODB_COUNTRECS for mysql, because PHP truncates incomplete + recordsets when mysql_unbuffered_query() is called a second time. +<p>Now postgresql works correctly when $ADODB_COUNTRECS = false. +<p>Changed _adodb_getcount to properly support SELECT DISTINCT. +<p>Discovered that $ADODB_COUNTRECS=true has some problems with prepared queries + - suspect PHP bug. +<p>Now GetOne and GetRow run in $ADODB_COUNTRECS=false mode for better performance. +<p>Added support for mysql_real_escape_string() and pg_escape_string() in qstr(). +<p>Added an intermediate variable for mysql _fetch() and MoveNext() to store fields, + to prevent overwriting field array with boolean when mysql_fetch_array() returns + false. +<p>Made arrays for getinsertsql and getupdatesql case-insensitive. Suggested by + Tim Uckun" tim#diligence.com +<p><b>3.11 11 Feb 2003</b></p> +<p>Added check for ADODB_NEVER_PERSIST constant in PConnect(). If defined, then + PConnect() will actually call non-persistent Connect(). +<p>Modified interbase to properly work with Prepare(). +<p>Added $this->ibase_timefmt to allow you to change the date and time format. +<p>Added support for $input_array parameter in CacheFlush(). +<p>Added experimental support for dbx, which was then removed when i found that + it was slower than using native calls. +<p>Added MetaPrimaryKeys for mssql and ibase/firebird. +<p>Added new $trim parameter to GetCol and CacheGetCol +<p>Uses updated adodb-time.inc.php 0.06. +<p><b>3.10 27 Jan 2003</b> +<p>Added adodb_date(), adodb_getdate(), adodb_mktime() and adodb-time.inc.php. +<p>For interbase, added code to handle unlimited number of bind parameters. From + Daniel Hasan daniel#hasan.cl. +<p>Added BlobDecode and UpdateBlob for informix. Thx to Fernando Ortiz. +<p>Added constant ADODB_WINDOWS. If defined, means that running on Windows. +<p>Added constant ADODB_PHPVER which stores php version as a hex num. Removed + $ADODB_PHPVER variable. +<p>Felho Bacsi reported a minor white-space regular expression problem in GetInsertSQL. +<p>Modified ADO to use variant to store _affectedRows +<p>Changed ibase to use base class Replace(). Modified base class Replace() to + support ibase. +<p>Changed odbc to auto-detect when 0 records returned is wrong due to bad odbc + drivers. +<p>Changed mssql to use datetimeconvert ini setting only when 4.30 or later (does + not work in 4.23). +<p>ExecuteCursor($stmt, $cursorname, $params) now accepts a new $params array + of additional bind parameters -- William Lovaton walovaton#yahoo.com.mx. +<p>Added support for sybase_unbuffered_query if ADODB_COUNTRECS == false. Thx + to chuck may. +<p>Fixed FetchNextObj() bug. Thx to Jorma Tuomainen. +<p>We now use SCOPE_IDENTITY() instead of @@IDENTITY for mssql - thx to marchesini#eside.it +<p>Changed postgresql movenext logic to prevent illegal row number from being + passed to pg_fetch_array(). +<p>Postgresql initrs bug found by "Bogdan RIPA" bripa#interakt.ro $f1 accidentally + named $f +<p><b>3.00 6 Jan 2003</b> +<p>Fixed adodb-pear.inc.php syntax error. +<p>Improved _adodb_getcount() to use SELECT COUNT(*) FROM ($sql) for languages + that accept it. +<p>Fixed _adodb_getcount() caching error. +<p>Added sql to retrive table and column info for odbc_mssql. +<p><strong>2.91 3 Jan 2003</strong> +<p>Revised PHP version checking to use $ADODB_PHPVER with legal values 0x4000, + 0x4050, 0x4200, 0x4300. +<p>Added support for bytea fields and oid blobs in postgres by allowing BlobDecode() + to detect and convert non-oid fields. Also added BlobEncode to postgres when + you want to encode oid blobs. +<p>Added blobEncodeType property for connections to inform phpLens what encoding + method to use for blobs. +<p>Added BlobDecode() and BlobEncode() to base ADOConnection class. +<p>Added umask() to _gencachename() when creating directories. +<p>Added charPage for ado drivers, so you can set the code page. +<pre> +$conn->charPage = CP_UTF8; +$conn->Connect($dsn); +</pre> +<p>Modified _seek in mysql to check for num rows=0. +<p>Added to metatypes new informix types for IDS 9.30. Thx Fernando Ortiz. +<p>_maxrecordcount returned in CachePageExecute $rsreturn +<p>Fixed sybase cacheselectlimit( ) problems +<p>MetaColumns() max_length should use precision for types X and C for ms access. + Fixed. +<p>Speedup of odbc non-SELECT sql statements. +<p>Added support in MetaColumns for Wide Char types for ODBC. We halve max_length + if unicode/wide char. +<p>Added 'B' to types handled by GetUpdateSQL/GetInsertSQL. +<p>Fixed warning message in oci8 driver with $persist variable when using PConnect. +<p><b>2.90 11 Dec 2002</b> +<p>Mssql and mssqlpo and oci8po now support ADODB_ASSOC_CASE. +<p>Now MetaType() can accept a field object as the first parameter. +<p>New $arr = $db-&gt;ServerInfo( ) function. Returns $arr['description'] which + is the string description, and $arr['version']. +<p>PostgreSQL and MSSQL speedups for insert/updates. +<p> Implemented new SetFetchMode() that removes the need to use $ADODB_FETCH_MODE. + Each connection has independant fetchMode. +<p>ADODB_ASSOC_CASE now defaults to 2, use native defaults. This is because we + would break backward compat for too many applications otherwise. +<p>Patched encrypted sessions to use replace() +<p>The qstr function supports quoting of nulls when escape character is \ +<p>Rewrote bits and pieces of session code to check for time synch and improve + reliability. +<p>Added property ADOConnection::hasTransactions = true/false; +<p>Added CreateSequence and DropSequence functions +<p>Found misplaced MoveNext() in adodb-postgres.inc.php. Fixed. +<p>Sybase SelectLimit not reliable because 'set rowcount' not cached - fixed. +<p>Moved ADOConnection to adodb-connection.inc.php and ADORecordSet to adodb-recordset.inc.php. + This allows us to use doxygen to generate documentation. Doxygen doesn't like + the classes in the main adodb.inc.php file for some mysterious reason. +<p><b>2.50, 14 Nov 2002</b> +<p>Added transOff and transCnt properties for disabling (transOff = true) and + tracking transaction status (transCnt>0). +<p>Added inputarray handling into _adodb_pageexecute_all_rows - "Ross Smith" RossSmith#bnw.com. +<p>Fixed postgresql inconsistencies in date handling. +<p>Added support for mssql_fetch_assoc. +<p>Fixed $ADODB_FETCH_MODE bug in odbc MetaTables() and MetaPrimaryKeys(). +<p>Accidentally declared UnixDate() twice, making adodb incompatible with php + 4.3.0. Fixed. +<p>Fixed pager problems with some databases that returned -1 for _currentRow on + MoveLast() by switching to MoveNext() in adodb-lib.inc.php. +<p>Also fixed uninited $discard in adodb-lib.inc.php. +<p><b>2.43, 25 Oct 2002</b></p> +Added ADODB_ASSOC_CASE constant to better support ibase and odbc field names. +<p>Added support for NConnect() for oracle OCINLogin. +<p>Fixed NumCols() bug. +<p>Changed session handler to use Replace() on write. +<p>Fixed oci8 SelectLimit aggregate function bug again. +<p>Rewrote pivoting code. +<p><b>2.42, 4 Oct 2002</b></p> +<p>Fixed ibase_fetch() problem with nulls. Also interbase now does automatic blob + decoding, and is backward compatible. Suggested by Heinz Hombergs heinz#hhombergs.de. +<p>Fixed postgresql MoveNext() problems when called repeatedly after EOF. Also + suggested by Heinz Hombergs. +<p>PageExecute() does not rewrite queries if SELECT DISTINCT is used. Requested + by hans#velum.net +<p>Added additional fixes to oci8 SelectLimit handling with aggregate functions + - thx to Christian Bugge for reporting the problem. +<p><b>2.41, 2 Oct 2002</b></p> +<p>Fixed ADODB_COUNTRECS bug in odbc. Thx to Joshua Zoshi jzoshi#hotmail.com. +<p>Increased buffers for adodb-csvlib.inc.php for extremely long sql from 8192 + to 32000. +<p>Revised pivottable.inc.php code. Added better support for aggregate fields. +<p>Fixed mysql text/blob types problem in MetaTypes base class - thx to horacio + degiorgi. +<p>Added SQLDate($fmt,$date) function, which allows an sql date format string + to be generated - useful for group by's. +<p>Fixed bug in oci8 SelectLimit when offset>100. +<p><b>2.40 4 Sept 2002</b></p> +<p>Added new NLS_DATE_FORMAT property to oci8. Suggested by Laurent NAVARRO ln#altidev.com +<p>Now use bind parameters in oci8 selectlimit for better performance. +<p>Fixed interbase replaceQuote for dialect != 1. Thx to "BEGUIN Pierre-Henri + - INFOCOB" phb#infocob.com. +<p>Added white-space check to QA. +<p>Changed unixtimestamp to support fractional seconds (we always round down/floor + the seconds). Thanks to beezly#beezly.org.uk. +<p>Now you can set the trigger_error type your own user-defined type in adodb-errorhandler.inc.php. + Suggested by Claudio Bustos clbustos#entelchile.net. +<p>Added recordset filters with rsfilter.inc.php. +<p>$conn->_rs2rs does not create a new recordset when it detects it is of type + array. Some trickery there as there seems to be a bug in Zend Engine +<p>Added render_pagelinks to adodb-pager.inc.php. Code by "Pablo Costa" pablo#cbsp.com.br. +<p>MetaType() speedup in adodb.inc.php by using hashing instead of switch. Best + performance if constant arrays are supported, as they are in PHP5. +<p>adodb-session.php now updates only the expiry date if the crc32 check indicates + that the data has not been modified. +<p><b>2.31 20 Aug 2002</b></p> +<p>Made changes to pivottable.inc.php due to daniel lucuzaeu's suggestions (we sum the pivottable column if desired). +<p>Fixed ErrorNo() in postgres so it does not depend on _errorMsg property. +<p>Robert Tuttle added support for oracle cursors. See ExecuteCursor(). +<p>Fixed Replace() so it works with mysql when updating record where data has not changed. Reported by +Cal Evans (cal#calevans.com). +<p><b>2.30 1 Aug 2002</b></p> +<p>Added pivottable.inc.php. Thanks to daniel.lucazeau#ajornet.com for the original + concept. +<p>Added ADOConnection::outp($msg,$newline) to output error and debugging messages. Now +you can override this using the ADODB_OUTP constant and use your own output handler. +<p>Changed == to === for 'null' comparison. Reported by ericquil#yahoo.com +<p>Fixed mssql SelectLimit( ) bug when distinct used. +<p><b>2.30 1 Aug 2002</b></p> +<p>New GetCol() and CacheGetCol() from ross#bnw.com that returns the first field as a 1 dim array. +<p>We have an empty recordset, but RecordCount() could return -1. Fixed. Reported by "Jonathan Polansky" jonathan#polansky.com. +<p>We now check for session variable changes using strlen($sessval).crc32($sessval). +Formerly we only used crc32(). +<p>Informix SelectLimit() problem with $ADODB_COUNTRECS fixed. +<p>Fixed informix SELECT FIRST x DISTINCT, and not SELECT DISTINCT FIRST x - reported by F Riosa +<p>Now default adodb error handlers ignores error if @ used. +<p>If you set $conn->autoRollback=true, we auto-rollback persistent connections for odbc, mysql, oci8, mssql. +Default for autoRollback is false. No need to do so for postgres. +As interbase requires a transaction id (what a flawed api), we don't do it for interbase. +<p>Changed PageExecute() to use non-greedy preg_match when searching for "FROM" keyword. +<p><b>2.20 9 July 2002</b></p> +<p>Added CacheGetOne($secs2cache,$sql), CacheGetRow($secs2cache,$sql), CacheGetAll($secs2cache,$sql). +<p>Added $conn->OffsetDate($dayFraction,$date=false) to generate sql that calcs + date offsets. Useful for scheduling appointments. +<p>Added connection properties: leftOuter, rightOuter that hold left and right + outer join operators. +<p>Added connection property: ansiOuter to indicate whether ansi outer joins supported. +<p>New driver <i>mssqlpo</i>, the portable mssql driver, which converts string + concat operator from || to +. +<p>Fixed ms access bug - SelectLimit() did not support ties - fixed. +<p>Karsten Kraus (Karsten.Kraus#web.de), contributed error-handling code to ADONewConnection. + Unfortunately due to backward compat problems, had to rollback most of the changes. +<p>Added new parameter to GetAssoc() to allow returning an array of key-value pairs, +ignoring any additional columns in the recordset. Off by default. +<p>Corrected mssql $conn->sysDate to return only date using convert(). +<p>CacheExecute() improved debugging output. +<p>Changed rs2html() so newlines are converted to BR tags. Also optimized rs2html() based +on feedback by "Jerry Workman" jerry#mtncad.com. +<p>Added support for Replace() with Interbase, using DELETE and INSERT. +<p>Some minor optimizations (mostly removing & references when passing arrays). +<p>Changed GenID() to allows id's larger than the size of an integer. +<p>Added force_session property to oci8 for better updateblob() support. +<p>Fixed PageExecute() which did not work properly with sql containing GROUP BY. +<p><b>2.12 12 June 2002</b></p> +<p>Added toexport.inc.php to export recordsets in CSV and tab-delimited format. +<p>CachePageExecute() does not work - fixed - thx John Huong. +<p>Interbase aliases not set properly in FetchField() - fixed. Thx Stefan Goethals. +<p>Added cache property to adodb pager class. The number of secs to cache recordsets. +<p>SQL rewriting bug in pageexecute() due to skipping of newlines due to missing /s modifier. Fixed. +<p>Max size of cached recordset due to a bug was 256000 bytes. Fixed. +<p>Speedup of 1st invocation of CacheExecute() by tuning code. +<p>We compare $rewritesql with $sql in pageexecute code in case of rewrite failure. +<p><b>2.11 7 June 2002</b></p> +<p>Fixed PageExecute() rewrite sql problem - COUNT(*) and ORDER BY don't go together with + mssql, access and postgres. Thx to Alexander Zhukov alex#unipack.ru +<p>DB2 support for CHARACTER type added - thx John Huong huongch#bigfoot.com +<p>For ado, $argProvider not properly checked. Fixed - kalimero#ngi.it +<p>Added $conn->Replace() function for update with automatic insert if the record does not exist. + Supported by all databases except interbase. +<p><b>2.10 4 June 2002</b></p> +<p>Added uniqueSort property to indicate mssql ORDER BY cols must be unique. +<p>Optimized session handler by crc32 the data. We only write if session data has changed. +<p>adodb_sess_read in adodb-session.php now returns ''correctly - thanks to Jorma Tuomainen, webmaster#wizactive.com +<p>Mssql driver did not throw EXECUTE errors correctly because ErrorMsg() and ErrorNo() called in wrong order. +Pointed out by Alexios Fakos. Fixed. +<p>Changed ado to use client cursors. This fixes BeginTran() problems with ado. +<p>Added handling of timestamp type in ado. +<p>Added to ado_mssql support for insert_id() and affected_rows(). +<p>Added support for mssql.datetimeconvert=0, available since php 4.2.0. +<p>Made UnixDate() less strict, so that the time is ignored if present. +<p>Changed quote() so that it checks for magic_quotes_gpc. +<p>Changed maxblobsize for odbc to default to 64000. +<p><b>2.00 13 May 2002</b></p> +<p>Added drivers <i>informix72</i> for pre-7.3 versions, and <i>oci805</i> for + oracle 8.0.5, and postgres64 for postgresql 6.4 and earlier. The postgres and postgres7 drivers + are now identical. +<p>Interbase now partially supports ADODB_FETCH_BOTH, by defaulting to ASSOC mode. +<p>Proper support for blobs in mssql. Also revised blob support code +is base class. Now UpdateBlobFile() calls UpdateBlob() for consistency. +<p>Added support for changed odbc_fetch_into api in php 4.2.0 +with $conn-&gt;_has_stupid_odbc_fetch_api_change. +<p>Fixed spelling of tablock locking hint in GenID( ) for mssql. +<p>Added RowLock( ) to several databases, including oci8, informix, sybase, etc. + Fixed where error in mssql RowLock(). +<p>Added sysDate and sysTimeStamp properties to most database drivers. These are the sql +functions/constants for that database that return the current date and current timestamp, and +are useful for portable inserts and updates. +<p>Support for RecordCount() caused date handling in sybase and mssql to break. +Fixed, thanks to Toni Tunkkari, by creating derived classes for ADORecordSet_array for +both databases. Generalized using arrayClass property. Also to support RecordCount(), +changed metatype handling for ado drivers. Now the type returned in FetchField + is no longer a number, but the 1-char data type returned by MetaType. + At the same time, fixed a lot of date handling. Now mssql support dmy and mdy date formats. +Also speedups in sybase and mssql with preg_match and ^ in date/timestamp handling. +Added support in sybase and mssql for 24 hour clock in timestamps (no AM/PM). +<p>Extensive revisions to informix driver - thanks to Samuel CARRIERE samuel_carriere#hotmail.com +<p>Added $ok parameter to CommitTrans($ok) for easy rollbacks. +<p>Fixed odbc MetaColumns and MetaTables to save and restore $ADODB_FETCH_MODE. +<p>Some odbc drivers did not call the base connection class constructor. Fixed. +<p>Fixed regex for GetUpdateSQL() and GetInsertSQL() to support more legal character combinations. + +<p><b>1.99 21 April 2002</b></p> +<p>Added emulated RecordCount() to all database drivers if $ADODB_COUNTRECS = true + (which it is by default). Inspired by Cristiano Duarte (cunha17#uol.com.br). +<p>Unified stored procedure support for mssql and oci8. Parameter() and PrepareSP() + functions implemented. +<p>Added support for SELECT FIRST in informix, modified hasTop property to support + this. +<p>Changed csv driver to handle updates/deletes/inserts properly (when Execute() returns true). +Bind params also work now, and raiseErrorFn with csv driver. Added csv driver to QA process. +<p>Better error checking in oci8 UpdateBlob() and UpdateBlobFile(). +<p>Added TIME type to MySQL - patch by Manfred h9125297#zechine.wu-wien.ac.at +<p>Prepare/Execute implemented for Interbase/Firebird +<p>Changed some regular expressions to be anchored by /^ $/ for speed. +<p>Added UnixTimeStamp() and UnixDate() to ADOConnection(). Now these functions + are in both ADOConnection and ADORecordSet classes. +<p>Empty recordsets were not cached - fixed. +<p>Thanks to Gaetano Giunta (g.giunta#libero.it) for the oci8 code review. We + didn't agree on everything, but i hoped we agreed to disagree! +<p><b>1.90 6 April 2002</b></p> +<p>Now all database drivers support fetch modes ADODB_FETCH_NUM and ADODB_FETCH_ASSOC, though + still not fully tested. Eg. Frontbase, Sybase, Informix. +<p>NextRecordSet() support for mssql. Contributed by "Sven Axelsson" sven.axelsson#bokochwebb.se +<p>Added blob support for SQL Anywhere. Contributed by Wade Johnson wade#wadejohnson.de +<p>Fixed some security loopholes in server.php. Server.php also supports fetch mode. +<p>Generalized GenID() to support odbc and mssql drivers. Mssql no longer generates GUID's. +<p>Experimental RowLock($table,$where) for mssql. +<p>Properly implemented Prepare() in oci8 and ODBC. +<p>Added Bind() support to oci8 to support Prepare(). +<p>Improved error handler. Catches CacheExecute() and GenID() errors now. +<p>Now if you are running php from the command line, debugging messages do not output html formating. +Not 100% complete, but getting there. +<p><b>1.81 22 March 2002</b></p> +<p>Restored default $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT for backward compatibility. +<p>SelectLimit for oci8 improved - Our FIRST_ROWS optimization now does not overwrite existing hint. +<p>New Sybase SQL Anywhere driver. Contributed by Wade Johnson wade#wadejohnson.de +<p><b>1.80 15 March 2002</b></p> +<p>Redesigned directory structure of ADOdb files. Added new driver directory where +all database drivers reside. +<p>Changed caching algorithm to create subdirectories. Now we scale better. +<p>Informix driver now supports insert_id(). Contribution by "Andrea Pinnisi" pinnisi#sysnet.it +<p>Added experimental ISO date and FetchField support for informix. +<p>Fixed a quoting bug in Execute() with bind parameters, causing problems with blobs. +<p>Mssql driver speedup by 10-15%. +<p>Now in CacheExecute($secs2cache,$sql,...), $secs2cache is optional. If missing, it will +take the value defined in $connection->cacheSecs (default is 3600 seconds). Note that +CacheSelectLimit(), the secs2cache is still compulsory - sigh. +<p>Sybase SQL Anywhere driver (using ODBC) contributed by Wade Johnson wade#wadejohnson.de +<p><b>1.72 8 March 2002</b></p> +<p>Added @ when returning Fields() to prevent spurious error - "Michael William Miller" mille562#pilot.msu.edu +<p>MetaDatabases() for postgres contributed by Phil pamelant#nerim.net + <p>Mitchell T. Young (mitch#youngfamily.org) contributed informix driver. + <p>Fixed rs2html() problem. I cannot reproduce, so probably a problem with pre PHP 4.1.0 versions, + when supporting new ADODB_FETCH_MODEs. + <p>Mattia Rossi (mattia#technologist.com) contributed BlobDecode() and UpdateBlobFile() for postgresql + using the postgres specific pg_lo_import()/pg_lo_open() - i don't use them but hopefully others will + find this useful. See <a href="http://phplens.com/lens/lensforum/msgs.php?id=1262">this posting</a> + for an example of usage. + <p>Added UpdateBlobFile() for uploading files to a database. + <p>Made UpdateBlob() compatible with oci8po driver. + <p>Added noNullStrings support to oci8 driver. Oracle changes all ' ' strings to nulls, + so you need to set strings to ' ' to prevent the nullifying of strings. $conn->noNullStrings = true; + will do this for you automatically. This is useful when you define a char column as NOT NULL. + <p>Fixed UnixTimeStamp() bug - wasn't setting minutes and seconds properly. Patch from Agusti Fita i Borrell agusti#anglatecnic.com. + <p>Toni Tunkkari added patch for sybase dates. Problem with spaces in day part of date fixed. + <p><b>1.71 18 Jan 2002</b></p> + <p>Sequence start id support. Now $conn->Gen_ID('seqname', 50) to start sequence from 50. + <p>CSV driver fix for selectlimit, from Andreas - akaiser#vocote.de. +<P>Gam3r spotted that a global variable was undefined in the session handler. +<p>Mssql date regex had error. Fixed - reported by Minh Hoang vb_user#yahoo.com. +<p>DBTimeStamp() and DBDate() now accept iso dates and unix timestamps. This means +that the PostgreSQL handling of dates in GetInsertSQL() and GetUpdateSQL() can +be removed. Also if these functions are passed '' or null or false, we return a SQL null. +<p>GetInsertSQL() and GetUpdateSQL() now accept a new parameter, $magicq to +indicate whether quotes should be inserted based on magic quote settings - suggested by +dj#4ict.com. +<p>Reformated docs slightly based on suggestions by Chris Small. + <p><b>1.65 28 Dec 2001</b></p> + <p>Fixed borland_ibase class naming bug. + <p>Now instead of using $rs->fields[0] internally, we use reset($rs->fields) so + that we are compatible with ADODB_FETCH_ASSOC mode. Reported by Nico S. + <p>Changed recordset constructor and _initrs() for oci8 so that it returns the field definitions even + if no rows in the recordset. Reported by Rick Hickerson (rhickers#mv.mv.com). + <p>Improved support for postgresql in GetInsertSQL and GetUpdateSQL by + "mike" mike#partner2partner.com and "Ryan Bailey" rebel#windriders.com + <p><b>1.64 20 Dec 2001</b></p> +<p>Danny Milosavljevic &lt;danny.milo#gmx.net> added some patches for MySQL error handling +and displaying default values. +<p>Fixed some ADODB_FETCH_BOTH inconsistencies in odbc and interbase. +<p>Added more tests to test suite to cover ADODB_FETCH_* and ADODB_ERROR_HANDLER. +<p>Added firebird (ibase) driver +<p>Added borland_ibase driver for interbase 6.5 +<p><b>1.63 13 Dec 2001</b></p> +Absolute to the adodb-lib.inc.php file not set properly. Fixed.<p> + +<p><b>1.62 11 Dec 2001</b></p> +<p>Major speedup of ADOdb for low-end web sites by reducing the php code loading and compiling +cycle. We conditionally compile not so common functions. +Moved csv code to adodb-csvlib.inc.php to reduce adodb.inc.php parsing. This file +is loaded only when the csv/proxy driver is used, or CacheExecute() is run. +Also moved PageExecute(), GetSelectSQL() and GetUpdateSQL() core code to adodb-lib.inc.php. +This reduced the 70K main adodb.inc.php file to 55K, and since at least 20K of the file +is comments, we have reduced 50K of code in adodb.inc.php to 35K. There + should be 35% reduction in memory and thus 35% speedup in compiling the php code for the +main adodb.inc.php file. +<p>Highly tuned SelectLimit() for oci8 for massive speed improvements on large files. +Selecting 20 rows starting from the 20,000th row of a table is now 7 times faster. +Thx to Tomas V V Cox. +<p>Allow . and # in table definitions in GetInsertSQL and GetUpdateSQL. + See ADODB_TABLE_REGEX constant. Thx to Ari Kuorikoski. +<p>Added ADODB_PREFETCH_ROWS constant, defaulting to 10. This determines the number +of records to prefetch in a SELECT statement. Only used by oci8.</p> +<p>Added high portability Oracle class called oci8po. This uses ? for bind variables, and +lower cases column names.</p> +<p>Now all database drivers support $ADODB_FETCH_MODE, including interbase, ado, and odbc: +ADODB_FETCH_NUM and ADODB_FETCH_ASSOC. ADODB_FETCH_BOTH is not fully implemented for all +database drivers. +<p><b>1.61 Nov 2001</b></p> +<p>Added PO_RecordCount() and PO_Insert_ID(). PO stands for portable. Pablo Roca + [pabloroca#mvps.org]</p> +<p>GenID now returns 0 if not available. Safer is that you should check $conn->hasGenID + for availability.</p> +<p>M'soft ADO we now correctly close recordset in _close() peterd#telephonetics.co.uk</p> +<p>MSSQL now supports GenID(). It generates a 16-byte GUID from mssql newid() + function.</p> +<p>Changed ereg_replace to preg_replace in SelectLimit. This is a fix for mssql. + Ereg doesn't support t or n! Reported by marino Carlos xaplo#postnuke-espanol.org</p> +<p>Added $recordset->connection. This is the ADOConnection object for the recordset. +Works with cached and normal recordsets. Surprisingly, this had no affect on performance!</p> +<p><b>1.54 15 Nov 2001</b></p> +Fixed some more bugs in PageExecute(). I am getting sick of bug in this and will have to +reconsider my QA here. The main issue is that I don't use PageExecute() and +to check whether it is working requires a visual inspection of the html generated currently. +It is possible to write a test script but it would be quite complicated :( +<p> More speedups of SelectLimit() for DB2, Oci8, access, vfp, mssql. +<p> + +<p><b>1.53 7 Nov 2001</b></p> +Added support for ADODB_FETCH_ASSOC for ado and odbc drivers.<p> +Tuned GetRowAssoc(false) in postgresql and mysql.<p> +Stephen Van Dyke contributed ADOdb icon, accepted with some minor mods.<p> +Enabled Affected_Rows() for postgresql<p> +Speedup for Concat() using implode() - Benjamin Curtis ben_curtis#yahoo.com<p> +Fixed some more bugs in PageExecute() to prevent infinite loops<p> +<p><b>1.52 5 Nov 2001</b></p> +Spelling error in CacheExecute() caused it to fail. $ql should be $sql in line 625!<p> +Added fixes for parsing [ and ] in GetUpdateSQL(). +<p><b>1.51 5 Nov 2001</b></p> +<p>Oci8 SelectLimit() speedup by using OCIFetch(). +<p>Oci8 was mistakenly reporting errors when $db->debug = true. +<p>If a connection failed with ODBC, it was not correctly reported - fixed. +<p>_connectionID was inited to -1, changed to false. +<p>Added $rs->FetchRow(), to simplify API, ala PEAR DB +<p>Added PEAR DB compat mode, which is still faster than PEAR! See adodb-pear.inc.php. +<p>Removed postgres pconnect debugging statement. +<p><b>1.50 31 Oct 2001</b></p> +<p>ADOdbConnection renamed to ADOConnection, and ADOdbFieldObject to ADOFieldObject. +<p>PageExecute() now checks for empty $rs correctly, and the errors in the docs on this subject have been fixed. +<p>odbc_error() does not return 6 digit error correctly at times. Implemented workaround. +<p>Added ADORecordSet_empty class. This will speedup INSERTS/DELETES/UPDATES because the return +object created is much smaller. +<p>Added Prepare() to odbc, and oci8 (but doesn't work properly for oci8 still). +<p>Made pgsql a synonym for postgre7, and changed SELECT LIMIT to use OFFSET for compat with +postgres 7.2. +<p>Revised adodb-cryptsession.php thanks to Ari. +<p>Set resources to false on _close, to force freeing of resources. +<p>Added adodb-errorhandler.inc.php, adodb-errorpear.inc.php and raiseErrorFn on Freek's urging. +<p>GetRowAssoc($toUpper=true): $toUpper added as default. +<p>Errors when connecting to a database were not captured formerly. Now we do it correctly. +<p><b>1.40 19 September 2001</b></p> +<p>PageExecute() to implement page scrolling added. Code and idea by Iv&aacute;n Oliva.</p> +<p>Some minor postgresql fixes.</p> +<p>Added sequence support using GenID() for postgresql, oci8, mysql, interbase.</p> +<p>Added UpdateBlob support for interbase (untested).</p> +<p>Added encrypted sessions (see adodb-cryptsession.php). By Ari Kuorikoski &lt;kuoriari#finebyte.com></p> +<p><b>1.31 21 August 2001</b></p> +<p>Many bug fixes thanks to "GaM3R (Cameron)" &lt;gamr#outworld.cx>. Some session changes due to Gam3r. +<p>Fixed qstr() to quote also. +<p>rs2html() now pretty printed. +<p>Jonathan Younger jyounger#unilab.com contributed the great idea GetUpdateSQL() and GetInsertSQL() which +generates SQL to update and insert into a table from a recordset. Modify the recordset fields +array, then can this function to generate the SQL (the SQL is not executed). +<p>"Nicola Fankhauser" &lt;nicola.fankhauser#couniq.com> found some bugs in date handling for mssql.</p> +<p>Added minimal Oracle support for LOBs. Still under development.</p> +Added $ADODB_FETCH_MODE so you can control whether recordsets return arrays which are +numeric, associative or both. This is a global variable you set. Currently only MySQL, Oci8, Postgres +drivers support this. +<p>PostgreSQL properly closes recordsets now. Reported by several people. +<p> +Added UpdateBlob() for Oracle. A hack to make it easier to save blobs. +<p> +Oracle timestamps did not display properly. Fixed. +<p><b>1.20 6 June 2001</b></p> +<p>Now Oracle can connect using tnsnames.ora or server and service name</p> +<p>Extensive Oci8 speed optimizations. +Oci8 code revised to support variable binding, and /*+ FIRST_ROWS */ hint.</p> +<p>Worked around some 4.0.6 bugs in odbc_fetch_into().</p> +<p>Paolo S. Asioli paolo.asioli#libero.it suggested GetRowAssoc().</p> +<p>Escape quotes for oracle wrongly set to '. Now '' is used.</p> +<p>Variable binding now works in ODBC also.</p> +<p>Jumped to version 1.20 because I don't like 13 :-)</p> +<p><b>1.12 6 June 2001</b></p> +<p>Changed $ADODB_DIR to ADODB_DIR constant to plug a security loophole.</p> +<p>Changed _close() to close persistent connections also. Prevents connection leaks.</p> +<p>Major revision of oracle and oci8 drivers. +Added OCI_RETURN_NULLS and OCI_RETURN_LOBS to OCIFetchInto(). BLOB, CLOB and VARCHAR2 recognition +in MetaType() improved. MetaColumns() returns columns in correct sort order.</p> +<p>Interbase timestamp input format was wrong. Fixed.</p> +<p><b>1.11 20 May 2001</b></p> +<p>Improved file locking for Windows.</p> +<p>Probabilistic flushing of cache to avoid avalanche updates when cache timeouts.</p> +<p>Cached recordset timestamp not saved in some scenarios. Fixed.</p> +<p><b>1.10 19 May 2001</b></p> +<p>Added caching. CacheExecute() and CacheSelectLimit(). +<p>Added csv driver. See <a href="http://php.weblogs.com/adodb_csv">http://php.weblogs.com/ADODB_csv</a>. +<p>Fixed SelectLimit(), SELECT TOP not working under certain circumstances. +<p>Added better Frontbase support of MetaTypes() by Frank M. Kromann. +<p><b>1.01 24 April 2001</b></p> +<p>Fixed SelectLimit bug. not quoted properly. +<p>SelectLimit: SELECT TOP -1 * FROM TABLE not support by Microsoft. Fixed.</p> +<p>GetMenu improved by glen.davies#cce.ac.nz to support multiple hilited items<p> +<p>FetchNextObject() did not work with only 1 record returned. Fixed bug reported by $tim#orotech.net</p> +<p>Fixed mysql field max_length problem. Fix suggested by Jim Nicholson (jnich#att.com)</p> +<p><b>1.00 16 April 2001</b></p> +<p>Given some brilliant suggestions on how to simplify ADOdb by akul. You no longer need to +setup $ADODB_DIR yourself, and ADOLoadCode() is automatically called by ADONewConnection(), +simplifying the startup code.</p> +<p>FetchNextObject() added. Suggested by Jakub Marecek. This makes FetchObject() obsolete, as +this is more flexible and powerful.</p> +<p>Misc fixes to SelectLimit() to support Access (top must follow distinct) and Fields() +in the array recordset. From Reinhard Balling.</p> +<p><b>0.96 27 Mar 2001</b></p> +<p>ADOConnection Close() did not return a value correctly. Thanks to akul#otamedia.com.</p> +<p>When the horrible magic_quotes is enabled, back-slash () is changed to double-backslash (\). +This doesn't make sense for Microsoft/Sybase databases. We fix this in qstr().</p> +<p>Fixed Sybase date problem in UnixDate() thanks to Toni Tunkkari. Also fixed MSSQL problem +in UnixDate() - thanks to milhouse31#hotmail.com.</p> +<p>MoveNext() moved to leaf classes for speed in MySQL/PostgreSQL. 10-15% speedup.</p> +<p>Added null handling in bindInputArray in Execute() -- Ron Baldwin suggestion.</p> +<p>Fixed some option tags. Thanks to john#jrmstudios.com.</p> +<p><b>0.95 13 Mar 2001</b></p> +<p>Added postgres7 database driver which supports LIMIT and other version 7 stuff in the future.</p> +<p>Added SelectLimit to ADOConnection to simulate PostgreSQL's "select * from table limit 10 offset 3". +Added helper function GetArrayLimit() to ADORecordSet.</p> +<p>Fixed mysql metacolumns bug. Thanks to Freek Dijkstra (phpeverywhere#macfreek.com).</p> +<p>Also many PostgreSQL changes by Freek. He almost rewrote the whole PostgreSQL driver!</p> +<p>Added fix to input parameters in Execute for non-strings by Ron Baldwin.</p> +<p>Added new metatype, X for TeXt. Formerly, metatype B for Blob also included +text fields. Now 'B' is for binary/image data. 'X' for textual data.</p> +<p>Fixed $this->GetArray() in GetRows().</p> +<p>Oracle and OCI8: 1st parameter is always blank -- now warns if it is filled.</p> +<p>Now <i>hasLimit</i> and <i>hasTop</i> added to indicate whether +SELECT * FROM TABLE LIMIT 10 or SELECT TOP 10 * FROM TABLE are supported.</p> +<p><b>0.94 04 Feb 2001</b></p> +<p>Added ADORecordSet::GetRows() for compatibility with Microsoft ADO. Synonym for GetArray().</p> +<p>Added new metatype 'R' to represent autoincrement numbers.</p> +<p>Added ADORecordSet.FetchObject() to return a row as an object.</p> +<p>Finally got a Linux box to test PostgreSql. Many fixes.</p> +<p>Fixed copyright misspellings in 0.93.</p> +<p>Fixed mssql MetaColumns type bug.</p> +<p>Worked around odbc bug in PHP4 for sessions.</p> +<p>Fixed many documentation bugs (affected_rows, metadatabases, qstr).</p> +<p>Fixed MySQL timestamp format (removed comma).</p> +<p>Interbase driver did not call ibase_pconnect(). Fixed.</p> +<p><b>0.93 18 Jan 2002</b></p> +<p>Fixed GetMenu bug.</p> +<p>Simplified Interbase commit and rollback.</p> +<p>Default behaviour on closing a connection is now to rollback all active transactions.</p> +<p>Added field object handling for array recordset for future XML compatibility.</p> +<p>Added arr2html() to convert array to html table.</p> +<p><b>0.92 2 Jan 2002</b></p> +<p>Interbase Commit and Rollback should be working again.</p> +<p>Changed initialisation of ADORecordSet. This is internal and should not affect users. We +are doing this to support cached recordsets in the future.</p> + +<p>Implemented ADORecordSet_array class. This allows you to simulate a database recordset +with an array.</p> +<p>Added UnixDate() and UnixTimeStamp() to ADORecordSet.</p> +<p><b>0.91 21 Dec 2000</b></p> +<p>Fixed ODBC so ErrorMsg() is working.</p> +<p>Worked around ADO unrecognised null (0x1) value problem in COM.</p> +<p>Added Sybase support for FetchField() type</p> +<p>Removed debugging code and unneeded html from various files</p> +<p>Changed to javadoc style comments to adodb.inc.php.</p> +<p>Added maxsql as synonym for mysqlt</p> +<p>Now ODBC downloads first 8K of blob by default +<p><b>0.90 15 Nov 2000</b></p> +<p>Lots of testing of Microsoft ADO. Should be more stable now.</p> +<p>Added $ADODB_COUNTREC. Set to false for high speed selects.</p> +<p>Added Sybase support. Contributed by Toni Tunkkari (toni.tunkkari#finebyte.com). Bug in Sybase + API: GetFields is unable to determine date types.</p> +<p>Changed behaviour of RecordSet.GetMenu() to support size parameter (listbox) properly.</p> +<p>Added emptyDate and emptyTimeStamp to RecordSet class that defines how to represent + empty dates.</p> +<p>Added MetaColumns($table) that returns an array of ADOFieldObject's listing + the columns of a table.</p> +<p>Added transaction support for PostgresSQL -- thanks to "Eric G. Werk" egw#netguide.dk.</p> +<p>Added adodb-session.php for session support.</p> +<p><b>0.80 30 Nov 2000</b></p> +<p>Added support for charSet for interbase. Implemented MetaTables for most databases. + PostgreSQL more extensively tested.</p> +<p><b>0.71 22 Nov 2000</b></p> +<p>Switched from using require_once to include/include_once for backward compatability with PHP 4.02 and earlier.</p> +<p><b>0.70 15 Nov 2000</b></p> +<p>Calls by reference have been removed (call_time_pass_reference=Off) to ensure compatibility with future versions of PHP, +except in Oracle 7 driver due to a bug in php_oracle.dll.</p> +<p>PostgreSQL database driver contributed by Alberto Cerezal (acerezalp#dbnet.es). +</p> +<p>Oci8 driver for Oracle 8 contributed by George Fourlanos (fou#infomap.gr).</p> +<p>Added <i>mysqlt</i> database driver to support MySQL 3.23 which has transaction + support. </p> +<p>Oracle default date format (DD-MON-YY) did not match ADOdb default date format (which is YYYY-MM-DD). Use ALTER SESSION to force the default date.</p> +<p>Error message checking is now included in test suite.</p> +<p>MoveNext() did not check EOF properly -- fixed.</p> +<p><b>0.60 Nov 8 2000</b></p> +<p>Fixed some constructor bugs in ODBC and ADO. Added ErrorNo function to ADOConnection + class. </p> +<p><b>0.51 Oct 18 2000</b></p> +<p>Fixed some interbase bugs.</p> +<p><b>0.50 Oct 16 2000</b></p> +<p>Interbase commit/rollback changed to be compatible with PHP 4.03. </p> +<p>CommitTrans( ) will now return true if transactions not supported. </p> +<p>Conversely RollbackTrans( ) will return false if transactions not supported. +</p> +<p><b>0.46 Oct 12</b></p> +Many Oracle compatibility issues fixed. +<p><b>0.40 Sept 26</b></p> +<p>Many bug fixes</p> +<p>Now Code for BeginTrans, CommitTrans and RollbackTrans is working. So is the Affected_Rows +and Insert_ID. Added above functions to test.php.</p> +<p>ADO type handling was busted in 0.30. Fixed.</p> +<p>Generalised Move( ) so it works will all databases, including ODBC.</p> +<p><b>0.30 Sept 18</b></p> +<p>Renamed ADOLoadDB to ADOLoadCode. This is clearer.</p> +<p>Added BeginTrans, CommitTrans and RollbackTrans functions.</p> +<p>Added Affected_Rows() and Insert_ID(), _affectedrows() and _insertID(), ListTables(), + ListDatabases(), ListColumns().</p> +<p>Need to add New_ID() and hasInsertID and hasAffectedRows, autoCommit </p> +<p><b>0.20 Sept 12</b></p> +<p>Added support for Microsoft's ADO.</p> +<p>Added new field to ADORecordSet -- canSeek</p> +<p>Added new parameter to _fetch($ignore_fields = false). Setting to true will + not update fields array for faster performance.</p> +<p>Added new field to ADORecordSet/ADOConnection -- dataProvider to indicate whether + a class is derived from odbc or ado.</p> +<p>Changed class ODBCFieldObject to ADOFieldObject -- not documented currently.</p> +<p>Added benchmark.php and testdatabases.inc.php to the test suite.</p> +<p>Added to ADORecordSet FastForward( ) for future high speed scrolling. Not documented.</p> +<p>Realised that ADO's Move( ) uses relative positioning. ADOdb uses absolute. +</p> +<p><b>0.10 Sept 9 2000</b></p> +<p>First release</p> +</body></html> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/docs/readme.htm b/pos/is4c-nf/lib/adodb5/docs/readme.htm new file mode 100644 index 000000000..4780cb788 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/readme.htm @@ -0,0 +1,68 @@ +<html> +<head> +<title>ADODB Manual</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<XSTYLE + body,td {font-family:Arial,Helvetica,sans-serif;font-size:11pt} + pre {font-size:9pt} + .toplink {font-size:8pt} + /> +</head> +<body bgcolor="#FFFFFF"> + +<h3>ADOdb Library for PHP</h3> +<p>ADOdb is a suite of database libraries that allow you to connect to multiple + databases in a portable manner. Download from <a href=http://adodb.sourceforge.net/>http://adodb.sourceforge.net/</a>. +<ul><li>The ADOdb documentation has moved to <a href=docs-adodb.htm>docs-adodb.htm</a> + This allows you to query, update and insert records using a portable API. +<p><li>The ADOdb data dictionary docs are at <a href=docs-datadict.htm>docs-datadict.htm</a>. + This allows you to create database tables and indexes in a portable manner. +<p><li>The ADOdb database performance monitoring docs are at <a href=docs-perf.htm>docs-perf.htm</a>. + This allows you to perform health checks, tune and monitor your database. +<p><li>The ADOdb database-backed session docs are at <a href=docs-session.htm>docs-session.htm</a>. +</ul> +<p> +<h3>Installation</h3> +Make sure you are running PHP4.0.4 or later. Unpack all the files into a directory accessible by your webserver. +<p> +To test, try modifying some of the tutorial examples. Make sure you customize the connection settings correctly. You can debug using: +<pre> +&lt;?php +include('adodb/adodb.inc.php'); + +$db = <b>ADONewConnection</b>($driver); # eg. 'mysql' or 'oci8' +$db->debug = true; +$db-><b>Connect</b>($server, $user, $password, $database); +$rs = $db-><b>Execute</b>('select * from some_small_table'); +print "&lt;pre>"; +print_r($rs-><b>GetRows</b>()); +print "&lt;/pre>"; +?> +</pre> +<h3>How are people using ADOdb</h3> +Here are some examples of how people are using ADOdb: +<ul> + <li> <strong>PhpLens</strong> is a commercial data grid component that allows + both cool Web designers and serious unshaved programmers to develop and + maintain databases on the Web easily. Developed by the author of ADOdb. + </li> + <li> <strong>PHAkt</strong>: PHP Extension for DreamWeaver Ultradev allows + you to script PHP in the popular Web page editor. Database handling provided + by ADOdb. </li> + <li> <strong>Analysis Console for Intrusion Databases (ACID)</strong>: PHP-based + analysis engine to search and process a database of security incidents + generated by security-related software such as IDSes and firewalls (e.g. + Snort, ipchains). By Roman Danyliw. </li> + <li> <strong>PostNuke</strong> is a very popular free content management system + and weblog system. It offers full CSS support, HTML 4.01 transitional + compliance throughout, an advanced blocks system, and is fully multi-lingual + enabled. </li> + <li><strong> EasyPublish CMS</strong> is another free content management system + for managing information and integrated modules on your internet, intranet- + and extranet-sites. From Norway. </li> + <li> <strong>NOLA</strong> is a full featured accounting, inventory, and job + tracking application. It is licensed under the GPL, and developed by Noguska. + </li> +</ul> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/tips_portable_sql.htm b/pos/is4c-nf/lib/adodb5/docs/tips_portable_sql.htm new file mode 100644 index 000000000..aa75069ca --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/tips_portable_sql.htm @@ -0,0 +1,367 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> + +<html> +<head> + <title>Tips on Writing Portable SQL for Multiple Databases for PHP</title> +</head> + +<body bgcolor=white> +<table width=100% border=0><tr><td><h2>Tips on Writing Portable SQL &nbsp;</h2></td><td> + <div align=right><img src="cute_icons_for_site/adodb.gif"></div></td></tr></table> + <p>Updated 6 Oct 2006. Added OffsetDate example. + <p>Updated 18 Sep 2003. Added Portable Native SQL section. +<p> + + If you are writing an application that is used in multiple environments and + operating systems, you need to plan to support multiple databases. This article + is based on my experiences with multiple database systems, stretching from 4th + Dimension in my Mac days, to the databases I currently use, which are: Oracle, + FoxPro, Access, MS SQL Server and MySQL. Although most of the advice here applies + to using SQL with Perl, Python and other programming languages, I will focus on PHP and how + the <a href="http://adodb.sourceforge.net/">ADOdb</a> database abstraction library + offers some solutions.<p></p> +<p>Most database vendors practice product lock-in. The best or fastest way to + do things is often implemented using proprietary extensions to SQL. This makes + it extremely hard to write portable SQL code that performs well under all conditions. + When the first ANSI committee got together in 1984 to standardize SQL, the database + vendors had such different implementations that they could only agree on the + core functionality of SQL. Many important application specific requirements + were not standardized, and after so many years since the ANSI effort began, + it looks as if much useful database functionality will never be standardized. + Even though ANSI-92 SQL has codified much more, we still have to implement portability + at the application level.</p> +<h3><b>Selects</b></h3> +<p>The SELECT statement has been standardized to a great degree. Nearly every + database supports the following:</p> +<p>SELECT [cols] FROM [tables]<br> + &nbsp;&nbsp;[WHERE conditions]<br> + &nbsp; [GROUP BY cols]<br> + &nbsp; [HAVING conditions] <br> + &nbsp; [ORDER BY cols]</p> +<p>But so many useful techniques can only be implemented by using proprietary + extensions. For example, when writing SQL to retrieve the first 10 rows for + paging, you could write...</p> +<table width="80%" border="1" cellspacing="0" cellpadding="0" align="center"> + <tr> + <td><b>Database</b></td> + <td><b>SQL Syntax</b></td> + </tr> + <tr> + <td>DB2</td> + <td>select * from table fetch first 10 rows only</td> + </tr> + <tr> + <td>Informix</td> + <td>select first 10 * from table</td> + </tr> + <tr> + <td>Microsoft SQL Server and Access</td> + <td>select top 10 * from table</td> + </tr> + <tr> + <td>MySQL and PostgreSQL</td> + <td>select * from table limit 10</td> + </tr> + <tr> + <td>Oracle 8i</td> + <td>select * from (select * from table) where rownum &lt;= 10</td> + </tr> +</table> +<p>This feature of getting a subset of data is so useful that in the PHP class + library ADOdb, we have a SelectLimit( ) function that allows you to hide the + implementation details within a function that will rewrite your SQL for you:</p> +<pre>$connection-&gt;SelectLimit('select * from table', 10); +</pre> +<p><b>Selects: Fetch Modes</b></p> +<p>PHP allows you to retrieve database records as arrays. You can choose to have + the arrays indexed by field name or number. However different low-level PHP + database drivers are inconsistent in their indexing efforts. ADOdb allows you + to determine your prefered mode. You set this by setting the variable $ADODB_FETCH_MODE + to either of the constants ADODB_FETCH_NUM (for numeric indexes) or ADODB_FETCH_ASSOC + (using field names as an associative index).</p> +<p>The default behaviour of ADOdb varies depending on the database you are using. + For consistency, set the fetch mode to either ADODB_FETCH_NUM (for speed) or + ADODB_FETCH_ASSOC (for convenience) at the beginning of your code. </p> +<p><b>Selects: Counting Records</b></p> +<p>Another problem with SELECTs is that some databases do not return the number + of rows retrieved from a select statement. This is because the highest performance + databases will return records to you even before the last record has been found. +</p> +<p>In ADOdb, RecordCount( ) returns the number of rows returned, or will emulate + it by buffering the rows and returning the count after all rows have been returned. + This can be disabled for performance reasons when retrieving large recordsets + by setting the global variable $ADODB_COUNTRECS = false. This variable is checked + every time a query is executed, so you can selectively choose which recordsets + to count.</p> +<p>If you prefer to set $ADODB_COUNTRECS = false, ADOdb still has the PO_RecordCount( + ) function. This will return the number of rows, or if it is not found, it will + return an estimate using SELECT COUNT(*):</p> +<pre>$rs = $db-&gt;Execute(&quot;select * from table where state=$state&quot;); +$numrows = $rs-&gt;PO_RecordCount('table', &quot;state=$state&quot;);</pre> +<p><b>Selects: Locking</b> </p> +<p>SELECT statements are commonly used to implement row-level locking of tables. + Other databases such as Oracle, Interbase, PostgreSQL and MySQL with InnoDB + do not require row-level locking because they use versioning to display data + consistent with a specific point in time.</p> +<p>Currently, I recommend encapsulating the row-level locking in a separate function, + such as RowLock($table, $where):</p> +<pre>$connection-&gt;BeginTrans( ); +$connection-&gt;RowLock($table, $where); </pre> +<pre><font color=green># some operation</font></pre> +<pre>if ($ok) $connection-&gt;CommitTrans( ); +else $connection-&gt;RollbackTrans( ); +</pre> +<p><b>Selects: Outer Joins</b></p> +<p>Not all databases support outer joins. Furthermore the syntax for outer joins + differs dramatically between database vendors. One portable (and possibly slower) + method of implementing outer joins is using UNION.</p> +<p>For example, an ANSI-92 left outer join between two tables t1 and t2 could + look like:</p> +<pre>SELECT t1.col1, t1.col2, t2.cola <br> FROM t1 <i>LEFT JOIN</i> t2 ON t1.col = t2.col</pre> +<p>This can be emulated using:</p> +<pre>SELECT t1.col1, t1.col2, t2.cola FROM t1, t2 <br> WHERE t1.col = t2.col + UNION ALL +SELECT col1, col2, null FROM t1 <br> WHERE t1.col not in (select distinct col from t2) +</pre> +<p>Since ADOdb 2.13, we provide some hints in the connection object as to legal + join variations. This is still incomplete and sometimes depends on the database + version you are using, but is useful as a general guideline:</p> +<p><font face="Courier New, Courier, mono">$conn-&gt;leftOuter</font>: holds the + operator used for left outer joins (eg. '*='), or false if not known or not + available.<br> + <font face="Courier New, Courier, mono">$conn-&gt;rightOuter</font>: holds the + operator used for right outer joins (eg '=*'), or false if not known or not + available.<br> + <font face="Courier New, Courier, mono">$conn-&gt;ansiOuter</font>: boolean + that if true means that ANSI-92 style outer joins are supported, or false if + not known.</p> +<h3><b>Inserts</b> </h3> +<p>When you create records, you need to generate unique id's for each record. + There are two common techniques: (1) auto-incrementing columns and (2) sequences. +</p> +<p>Auto-incrementing columns are supported by MySQL, Sybase and Microsoft Access + and SQL Server. However most other databases do not support this feature. So + for portability, you have little choice but to use sequences. Sequences are + special functions that return a unique incrementing number every time you call + it, suitable to be used as database keys. In ADOdb, we use the GenID( ) function. + It has takes a parameter, the sequence name. Different tables can have different + sequences. </p> +<pre>$id = $connection-&gt;GenID('sequence_name');<br>$connection-&gt;Execute(&quot;insert into table (id, firstname, lastname) <br> values ($id, $firstname, $lastname)&quot;);</pre> +<p>For databases that do not support sequences natively, ADOdb emulates sequences + by creating a table for every sequence.</p> +<h3><b>Binding</b></h3> +<p>Binding variables in an SQL statement is another tricky feature. Binding is + useful because it allows pre-compilation of SQL. When inserting multiple records + into a database in a loop, binding can offer a 50% (or greater) speedup. However + many databases such as Access and MySQL do not support binding natively and + there is some overhead in emulating binding. Furthermore, different databases + (specificly Oracle!) implement binding differently. My recommendation is to + use binding if your database queries are too slow, but make sure you are using + a database that supports it like Oracle. </p> +<p>ADOdb supports portable Prepare/Execute with:</p> +<pre>$stmt = $db-&gt;Prepare('select * from customers where custid=? and state=?'); +$rs = $db-&gt;Execute($stmt, array($id,'New York'));</pre> +<p>Oracle uses named bind placeholders, not "?", so to support portable binding, we have Param() that generates +the correct placeholder (available since ADOdb 3.92): +<pre><font color="#000000">$sql = <font color="#993300">'insert into table (col1,col2) values ('</font>.$DB-&gt;Param('a').<font color="#993300">','</font>.$DB-&gt;Param('b').<font color="#993300">')'</font>; +<font color="#006600"># generates 'insert into table (col1,col2) values (?,?)' +# or 'insert into table (col1,col2) values (:a,:b)</font>' +$stmt = $DB-&gt;Prepare($sql); +$stmt = $DB-&gt;Execute($stmt,array('one','two')); +</font></pre> +<a name="native"></a> +<h2>Portable Native SQL</h2> +<p>ADOdb provides the following functions for portably generating SQL functions + as strings to be merged into your SQL statements (some are only available since + ADOdb 3.92): </p> +<table width="75%" border="1" align=center> + <tr> + <td width=30%><b>Function</b></td> + <td><b>Description</b></td> + </tr> + <tr> + <td>DBDate($date)</td> + <td>Pass in a UNIX timestamp or ISO date and it will convert it to a date + string formatted for INSERT/UPDATE</td> + </tr> + <tr> + <td>DBTimeStamp($date)</td> + <td>Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp + string formatted for INSERT/UPDATE</td> + </tr> + <tr> + <td>SQLDate($date, $fmt)</td> + <td>Portably generate a date formatted using $fmt mask, for use in SELECT + statements.</td> + </tr> + <tr> + <td>OffsetDate($date, $ndays)</td> + <td>Portably generate a $date offset by $ndays.</td> + </tr> + <tr> + <td>Concat($s1, $s2, ...)</td> + <td>Portably concatenate strings. Alternatively, for mssql use mssqlpo driver, + which allows || operator.</td> + </tr> + <tr> + <td>IfNull($fld, $replaceNull)</td> + <td>Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.</td> + </tr> + <tr> + <td>Param($name)</td> + <td>Generates bind placeholders, using ? or named conventions as appropriate.</td> + </tr> + <tr><td>$db->sysDate</td><td>Property that holds the SQL function that returns today's date</td> +</tr> +<tr><td>$db->sysTimeStamp</td><td>Property that holds the SQL function that returns the current +timestamp (date+time). +</td> +</tr> +<tr> +<td>$db->concat_operator</td><td>Property that holds the concatenation operator +</td> +</tr> +<tr><td>$db->length</td><td>Property that holds the name of the SQL strlen function. +</td></tr> + +<tr><td>$db->upperCase</td><td>Property that holds the name of the SQL strtoupper function. +</td></tr> +<tr><td>$db->random</td><td>Property that holds the SQL to generate a random number between 0.00 and 1.00. +</td> +</tr> +<tr><td>$db->substr</td><td>Property that holds the name of the SQL substring function. +</td></tr> +</table> +<p>&nbsp; </p> +<h2>DDL and Tuning</h2> +There are database design tools such as ERWin or Dezign that allow you to generate data definition language commands such as ALTER TABLE or CREATE INDEX from Entity-Relationship diagrams. +<p> +However if you prefer to use a PHP-based table creation scheme, adodb provides you with this feature. Here is the code to generate the SQL to create a table with: +<ol> + <li> Auto-increment primary key 'ID', </li> + <li>The person's 'NAME' VARCHAR(32) NOT NULL and defaults to '', </li> + <li>The date and time of record creation 'CREATED', </li> + <li> The person's 'AGE', defaulting to 0, type NUMERIC(16). </li> +</ol> +<p> +Also create a compound index consisting of 'NAME' and 'AGE': +<pre> +$datadict = <strong>NewDataDictionary</strong>($connection); +$flds = " +<font color="#660000"> ID I AUTOINCREMENT PRIMARY, + NAME C(32) DEFAULT '' NOTNULL, + CREATED T DEFTIMESTAMP, + AGE N(16) DEFAULT 0</font> +"; +$sql1 = $datadict-><strong>CreateTableSQL</strong>('tabname', $flds); +$sql2 = $datadict-><strong>CreateIndexSQL</strong>('idx_name_age', 'tabname', 'NAME,AGE'); +</pre> + +<h3>Data Types</h3> +<p>Stick to a few data types that are available in most databases. Char, varchar + and numeric/number are supported by most databases. Most other data types (including + integer, boolean and float) cannot be relied on being available. I recommend + using char(1) or number(1) to hold booleans. </p> +<p>Different databases have different ways of representing dates and timestamps/datetime. + ADOdb attempts to display all dates in ISO (YYYY-MM-DD) format. ADOdb also provides + DBDate( ) and DBTimeStamp( ) to convert dates to formats that are acceptable + to that database. Both functions accept Unix integer timestamps and date strings + in ISO format.</p> +<pre>$date1 = $connection-&gt;DBDate(time( ));<br>$date2 = $connection-&gt;DBTimeStamp('2002-02-23 13:03:33');</pre> +<p>We also provide functions to convert database dates to Unix timestamps:</p> +<pre>$unixts = $recordset-&gt;UnixDate('#2002-02-30#'); <font color="green"># MS Access date =gt; unix timestamp</font></pre> +<p>For date calculations, we have OffsetDate which allows you to calculate dates such as <i>yesterday</i> and <i>next week</i> in a RDBMS independant fashion. For example, if we want to set a field to 6 hour from now, use: +<pre> +$sql = 'update table set dtimefld='.$db-&gt;OffsetDate($db-&gtsysTimeStamp, 6/24).' where ...'; +</pre> +<p>The maximum length of a char/varchar field is also database specific. You can + only assume that field lengths of up to 250 characters are supported. This is + normally impractical for web based forum or content management systems. You + will need to be familiar with how databases handle large objects (LOBs). ADOdb + implements two functions, UpdateBlob( ) and UpdateClob( ) that allow you to + update fields holding Binary Large Objects (eg. pictures) and Character Large + Objects (eg. HTML articles):</p> +<pre><font color=green># for oracle </font> +$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1,empty_blob())'); +$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1'); + +<font color=green># non-oracle databases</font> +$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); +$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1'); +</pre> +<p>Null handling is another area where differences can occur. This is a mine-field, + because 3-value logic is tricky. +<p>In general, I avoid using nulls except for dates and default all my numeric + and character fields to 0 or the empty string. This maintains consistency with + PHP, where empty strings and zero are treated as equivalent, and avoids SQL + ambiguities when you use the ANY and EXISTS operators. However if your database + has significant amounts of missing or unknown data, using nulls might be a good + idea. + <p> + ADOdb also supports a portable <a href=http://phplens.com/adodb/reference.functions.concat.html#ifnull>IfNull</a> function, so you can define what to display + if the field contains a null. +<h3><b>Stored Procedures</b></h3> +<p>Stored procedures are another problem area. Some databases allow recordsets + to be returned in a stored procedure (Microsoft SQL Server and Sybase), and + others only allow output parameters to be returned. Stored procedures sometimes + need to be wrapped in special syntax. For example, Oracle requires such code + to be wrapped in an anonymous block with BEGIN and END. Also internal sql operators + and functions such as +, ||, TRIM( ), SUBSTR( ) or INSTR( ) vary between vendors. +</p> +<p>An example of how to call a stored procedure with 2 parameters and 1 return + value follows:</p> +<pre> switch ($db->databaseType) { + case '<font color="#993300">mssql</font>': + $sql = <font color="#000000"><font color="#993333">'<font color="#993300">SP_RUNSOMETHING</font>'</font></font>; break; + case '<font color="#993300">oci8</font>': + $sql = +<font color="#993300"> </font><font color="#000000"><font color="#993300">&quot;declare RETVAL integer;begin :RETVAL := </font><font color="#000000"><font color="#993333"><font color="#993300">SP_RUNSOMETHING</font></font></font><font color="#993300">(:myid,:group);end;&quot;; +</font> break;</font> + default: + die('<font color="#993300">Unsupported feature</font>'); + } +<font color="#000000"><font color="green"> # @RETVAL = SP_RUNSOMETHING @myid,@group</font> + $stmt = $db-&gt;PrepareSP($sql); <br> $db-&gt;Parameter($stmt,$id,'<font color="#993300">myid</font>'); + $db-&gt;Parameter($stmt,$group,'<font color="#993300">group</font>'); + <font color="green"># true indicates output parameter<br> </font>$db-&gt;Parameter($stmt,$ret,'<font color="#993300">RETVAL</font>',true); + $db-&gt;Execute($stmt); </font></pre> +<p>As you can see, the ADOdb API is the same for both databases. But the stored + procedure SQL syntax is quite different between databases and is not portable, + so be forewarned! However sometimes you have little choice as some systems only + allow data to be accessed via stored procedures. This is when the ultimate portability + solution might be the only solution: <i>treating portable SQL as a localization + exercise...</i></p> +<h3><b>SQL as a Localization Exercise</b></h3> +<p> In general to provide real portability, you will have to treat SQL coding + as a localization exercise. In PHP, it has become common to define separate + language files for English, Russian, Korean, etc. Similarly, I would suggest + you have separate Sybase, Intebase, MySQL, etc files, and conditionally include + the SQL based on the database. For example, each MySQL SQL statement would be + stored in a separate variable, in a file called 'mysql-lang.inc.php'.</p> +<pre>$sqlGetPassword = '<font color="#993300">select password from users where userid=%s</font>'; +$sqlSearchKeyword = quot;<font color="#993300">SELECT * FROM articles WHERE match (title,body) against (%s</font>)&quot;;</pre> +<p>In our main PHP file:</p> +<pre><font color=green># define which database to load...</font> +<b>$database = '<font color="#993300">mysql</font>'; +include_once(&quot;<font color="#993300">$database-lang.inc.php</font>&quot;);</b> + +$db = NewADOConnection($database); +$db->PConnect(...) or die('<font color="#993300">Failed to connect to database</font>'); + +<font color=green># search for a keyword $word</font> +$rs = $db-&gt;Execute(sprintf($sqlSearchKeyWord,$db-&gt;qstr($word)));</pre> +<p>Note that we quote the $word variable using the qstr( ) function. This is because + each database quotes strings using different conventions.</p> +<p> +<h3>Final Thoughts</h3> +<p>The best way to ensure that you have portable SQL is to have your data tables designed using +sound principles. Learn the theory of normalization and entity-relationship diagrams and model +your data carefully. Understand how joins and indexes work and how they are used to tune performance. +<p> Visit the following page for more references on database theory and vendors: + <a href="http://php.weblogs.com/sql_tutorial">http://php.weblogs.com/sql_tutorial</a>. + Also read this article on <a href=http://phplens.com/lens/php-book/optimizing-debugging-php.php>Optimizing PHP</a>. +<p> +<font size=1>(c) 2002-2003 John Lim.</font> + +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/docs/tute.htm b/pos/is4c-nf/lib/adodb5/docs/tute.htm new file mode 100644 index 000000000..408ba75cb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/docs/tute.htm @@ -0,0 +1,290 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> + +<html> +<head> + <title>Tutorial: Moving from MySQL to ADODB</title> +</head> + +<body bgcolor=white> +<h1>Tutorial: Moving from MySQL to ADODB</h1> + +<pre> You say eether and I say eyether, + You say neether and I say nyther; + Eether, eyether, neether, nyther - + Let's call the whole thing off ! +<br> + You like potato and I like po-tah-to, + You like tomato and I like to-mah-to; + Potato, po-tah-to, tomato, to-mah-to - + Let's call the whole thing off ! +</pre> +<p>I love this song, especially the version with Louis Armstrong and Ella singing + duet. It is all about how hard it is for two people in love to be compatible + with each other. It's about compromise and finding a common ground, and that's + what this article is all about. +<p>PHP is all about creating dynamic web-sites with the least fuss and the most + fun. To create these websites we need to use databases to retrieve login information, + to splash dynamic news onto the web page and store forum postings. So let's + say we were using the popular MySQL database for this. Your company has done + such a fantastic job that the Web site is more popular than your wildest dreams. + You find that MySQL cannot scale to handle the workload; time to switch databases. +<p> Unfortunately in PHP every database is accessed slightly differently. To connect + to MySQL, you would use <i>mysql_connect()</i>; when you decide to upgrade to + Oracle or Microsoft SQL Server, you would use <i>ocilogon() </i>or <i>mssql_connect()</i> + respectively. What is worse is that the parameters you use for the different + connect functions are different also.. One database says po-tato, the other + database says pota-to. Oh-oh. +<h3>Let's NOT call the whole thing off</h3> +<p>A database wrapper library such as ADODB comes in handy when you need to ensure portability. It provides + you with a common API to communicate with any supported database so you don't have to call things off. <p> + +<p>ADODB stands for Active Data Objects DataBase (sorry computer guys are sometimes + not very original). ADODB currently supports MySQL, PostgreSQL, Oracle, Interbase, + Microsoft SQL Server, Access, FoxPro, Sybase, ODBC and ADO. You can download + ADODB from <a href=http://php.weblogs.com/adodb></a><a href="http://php.weblogs.com/adodb">http://php.weblogs.com/adodb</a>. +<h3>MySQL Example</h3> +<p>The most common database used with PHP is MySQL, so I guess you should be familiar + with the following code. It connects to a MySQL server at <i>localhost</i>, + database <i>mydb</i>, and executes an SQL select statement. The results are + printed, one line per row. +<pre><font color="#666600">$db = <b>mysql_connect</b>(&quot;localhost&quot;, &quot;root&quot;, &quot;password&quot;); +<b>mysql_select_db</b>(&quot;mydb&quot;,$db);</font> +<font color="#660000">$result = <b>mysql_query</b>(&quot;SELECT * FROM employees&quot;,$db)</font><code><font color="#663300">; +if ($result === false) die(&quot;failed&quot;);</font></code> +<font color="#006666"><b>while</b> ($fields =<b> mysql_fetch_row</b>($result)) &#123; + <b>for</b> ($i=0, $max=sizeof($fields); $i &lt; $max; $i++) &#123; + <b>print</b> $fields[$i].' '; + &#125; + <b>print</b> &quot;&lt;br&gt;\n&quot;; +&#125;</font> +</pre> +<p>The above code has been color-coded by section. The first section is the connection + phase. The second is the execution of the SQL, and the last section is displaying + the fields. The <i>while</i> loop scans the rows of the result, while the <i>for</i> + loop scans the fields in one row.</p> +<p>Here is the equivalent code in ADODB</p> +<pre><b><font color="#666600"> include(&quot;adodb.inc.php&quot;);</font></b><font color="#666600"> + $db = <b>NewADOConnection</b>('mysql'); + $db-&gt;<b>Connect</b>(&quot;localhost&quot;, &quot;root&quot;, &quot;password&quot;, &quot;mydb&quot;);</font> + <font color="#663300">$result = $db-&gt;<b>Execute</b>(&quot;SELECT * FROM employees&quot;); + </font><font color="#663300"></font><code><font color="#663300">if ($result === false) die(&quot;failed&quot;)</font></code><code><font color="#663300">;</font></code> + <font color="#006666"><b>while</b> (!$result-&gt;EOF) &#123; + <b>for</b> ($i=0, $max=$result-&gt;<b>FieldCount</b>(); $i &lt; $max; $i++) + <b>print</b> $result-&gt;fields[$i].' '; + $result-&gt;<b>MoveNext</b>(); + <b>print</b> &quot;&lt;br&gt;\n&quot;; + &#125;</font> </pre> +<p></p> +<p>Now porting to Oracle is as simple as changing the second line to <code>NewADOConnection('oracle')</code>. + Let's walk through the code...</p> +<h3>Connecting to the Database</h3> +<p></p> +<pre><b><font color="#666600">include(&quot;adodb.inc.php&quot;);</font></b><font color="#666600"> +$db = <b>NewADOConnection</b>('mysql'); +$db-&gt;<b>Connect</b>(&quot;localhost&quot;, &quot;root&quot;, &quot;password&quot;, &quot;mydb&quot;);</font></pre> +<p>The connection code is a bit more sophisticated than MySQL's because our needs + are more sophisticated. In ADODB, we use an object-oriented approach to managing + the complexity of handling multiple databases. We have different classes to + handle different databases. If you aren't familiar with object-oriented programing, + don't worry -- the complexity is all hidden away in the<code> NewADOConnection()</code> + function.</p> +<p>To conserve memory, we only load the PHP code specific to the database you + are connecting to. We do this by calling <code>NewADOConnection(databasedriver)</code>. + Legal database drivers include <i>mysql, mssql, oracle, oci8, postgres, sybase, + vfp, access, ibase </i>and many others.</p> +<p>Then we create a new instance of the connection class by calling <code>NewADOConnection()</code>. + Finally we connect to the database using <code>$db-&gt;Connect(). </code></p> +<h3>Executing the SQL</h3> +<p><code><font color="#663300">$result = $db-&gt;<b>Execute</b>(&quot;SELECT * + FROM employees&quot;);<br> + if ($result === false) die(&quot;failed&quot;)</font></code><code><font color="#663300">;</font></code> + <br> +</p> +<p>Sending the SQL statement to the server is straight forward. Execute() will + return a recordset object on successful execution. You should check $result + as we do above. +<p>An issue that confuses beginners is the fact that we have two types of objects + in ADODB, the connection object and the recordset object. When do we use each? +<p>The connection object ($db) is responsible for connecting to the database, + formatting your SQL and querying the database server. The recordset object ($result) + is responsible for retrieving the results and formatting the reply as text or + as an array. +<p>The only thing I need to add is that ADODB provides several helper functions + for making INSERT and UPDATE statements easier, which we will cover in the Advanced + section. +<h3>Retrieving the Data<br> +</h3> +<pre><font color="#006666"><b>while</b> (!$result-&gt;EOF) &#123; + <b>for</b> ($i=0, $max=$result-&gt;<b>FieldCount</b>(); $i &lt; $max; $i++) + <b>print</b> $result-&gt;fields[$i].' '; + $result-&gt;<b>MoveNext</b>(); + <b>print</b> &quot;&lt;br&gt;\n&quot;; +&#125;</font></pre> +<p>The paradigm for getting the data is that it's like reading a file. For every + line, we check first whether we have reached the end-of-file (EOF). While not + end-of-file, loop through each field in the row. Then move to the next line + (MoveNext) and repeat. +<p>The <code>$result-&gt;fields[]</code> array is generated by the PHP database + extension. Some database extensions do not index the array by field name. + To force indexing by name - that is associative arrays - + use the $ADODB_FETCH_MODE global variable. +<pre> + $<b>ADODB_FETCH_MODE</b> = ADODB_FETCH_NUM; + $rs1 = $db->Execute('select * from table'); + $<b>ADODB_FETCH_MODE</b> = ADODB_FETCH_ASSOC; + $rs2 = $db->Execute('select * from table'); + print_r($rs1->fields); // shows <i>array([0]=>'v0',[1] =>'v1')</i> + print_r($rs2->fields); // shows <i>array(['col1']=>'v0',['col2'] =>'v1')</i> +</pre> +<p> +As you can see in the above example, both recordsets store and use different fetch modes +based on the $ADODB_FETCH_MODE setting when the recordset was created by Execute().</p> +<h2>ADOConnection<a name="ADOConnection"></a></h2> +<p>Object that performs the connection to the database, executes SQL statements + and has a set of utility functions for standardising the format of SQL statements + for issues such as concatenation and date formats.</p> + +<h3>Other Useful Functions</h3> +<p><code>$recordset-&gt;Move($pos)</code> scrolls to that particular row. ADODB supports forward + scrolling for all databases. Some databases will not support backwards scrolling. + This is normally not a problem as you can always cache records to simulate backwards + scrolling. +<p><code>$recordset-&gt;RecordCount()</code> returns the number of records accessed by the + SQL statement. Some databases will return -1 because it is not supported. +<p><code>$recordset-&gt;GetArray()</code> returns the result as an array. +<p><code>rs2html($recordset)</code> is a function that is generates a HTML table based on the + $recordset passed to it. An example with the relevant lines in bold: +<pre> include('adodb.inc.php'); + <b>include('tohtml.inc.php');</b> /* includes the rs2html function */ + $conn = ADONewConnection('mysql'); + $conn-&gt;PConnect('localhost','userid','password','database'); + $rs = $conn-&gt;Execute('select * from table'); + <b> rs2html($rs)</b>; /* recordset to html table */ </pre> +<p>There are many other helper functions that are listed in the documentation available at <a href="http://php.weblogs.com/adodb_manual"></a><a href="http://php.weblogs.com/adodb_manual">http://php.weblogs.com/adodb_manual</a>. +<h2>Advanced Material</h2> +<h3>Inserts and Updates </h3> +<p>Let's say you want to insert the following data into a database. +<p><b>ID</b> = 3<br> + <b>TheDate</b>=mktime(0,0,0,8,31,2001) /* 31st August 2001 */<br> + <b>Note</b>= sugar why don't we call it off +<p>When you move to another database, your insert might no longer work.</p> +<p>The first problem is that each database has a different default date format. + MySQL expects YYYY-MM-DD format, while other databases have different defaults. + ADODB has a function called DBDate() that addresses this issue by converting + converting the date to the correct format.</p> +<p>The next problem is that the <b>don't</b> in the Note needs to be quoted. In + MySQL, we use <b>don\'t</b> but in some other databases (Sybase, Access, Microsoft + SQL Server) we use <b>don''t. </b>The qstr() function addresses this issue.</p> +<p>So how do we use the functions? Like this:</p> +<pre>$sql = &quot;INSERT INTO table (id, thedate,note) values (&quot; + . $<b>ID</b> . ',' + . $db-&gt;DBDate($<b>TheDate</b>) .',' + . $db-&gt;qstr($<b>Note</b>).&quot;)&quot;; +$db-&gt;Execute($sql);</pre> +<p>ADODB also supports <code>$connection-&gt;Affected_Rows()</code> (returns the + number of rows affected by last update or delete) and <code>$recordset-&gt;Insert_ID()</code> + (returns last autoincrement number generated by an insert statement). Be forewarned + that not all databases support the two functions.<br> +</p> +<h3>MetaTypes</h3> +<p>You can find out more information about each of the fields (I use the words + fields and columns interchangebly) you are selecting by calling the recordset + method <code>FetchField($fieldoffset)</code>. This will return an object with + 3 properties: name, type and max_length. +<pre>For example:</pre> +<pre>$recordset = $conn-&gt;Execute(&quot;select adate from table&quot;);<br>$f0 = $recordset-&gt;FetchField(0); +</pre> +<p>Then <code>$f0-&gt;name</code> will hold <i>'adata'</i>, <code>$f0-&gt;type</code> + will be set to '<i>date'</i>. If the max_length is unknown, it will be set to + -1. +<p>One problem with handling different databases is that each database often calls + the same type by a different name. For example a <i>timestamp</i> type is called + <i>datetime</i> in one database and <i>time</i> in another. So ADODB has a special + <code>MetaType($type, $max_length)</code> function that standardises the types + to the following: +<p>C: character and varchar types<br> + X: text or long character (eg. more than 255 bytes wide).<br> + B: blob or binary image<br> + D: date<br> + T: timestamp<br> + L: logical (boolean)<br> + I: integer<br> + N: numeric (float, double, money) +<p>In the above date example, +<p><code>$recordset = $conn-&gt;Execute(&quot;select adate from table&quot;);<br> + $f0 = $recordset-&gt;FetchField(0);<br> + $type = $recordset-&gt;MetaType($f0-&gt;type, $f0-&gt;max_length);<br> + print $type; /* should print 'D'</code> */ +<p> +<p><b>Select Limit and Top Support</b> +<p>ADODB has a function called $connection->SelectLimit($sql,$nrows,$offset) that allows +you to retrieve a subset of the recordset. This will take advantage of native +SELECT TOP on Microsoft products and SELECT ... LIMIT with PostgreSQL and MySQL, and +emulated if the database does not support it. +<p><b>Caching Support</b> +<p>ADODB allows you to cache recordsets in your file system, and only requery the database +server after a certain timeout period with $connection->CacheExecute($secs2cache,$sql) and +$connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset). +<p><b>PHP4 Session Handler Support</b> +<p>ADODB also supports PHP4 session handlers. You can store your session variables + in a database for true scalability using ADODB. For further information, visit + <a href="http://php.weblogs.com/adodb-sessions"></a><a href="http://php.weblogs.com/adodb-sessions">http://php.weblogs.com/adodb-sessions</a> +<h3>Commercial Use Encouraged</h3> +<p>If you plan to write commercial PHP applications that you want to resell, you should consider ADODB. It has been released using the lesser GPL, which means you can legally include it in commercial applications, while keeping your code proprietary. Commercial use of ADODB is strongly encouraged! We are using it internally for this reason.<p> + +<h2>Conclusion</h2> +<p>As a thank you for finishing this article, here are the complete lyrics for + <i>let's call the whole thing off</i>.<br> + <br> +<pre> + Refrain +<br> + You say eether and I say eyether, + You say neether and I say nyther; + Eether, eyether, neether, nyther - + Let's call the whole thing off ! +<br> + You like potato and I like po-tah-to, + You like tomato and I like to-mah-to; + Potato, po-tah-to, tomato, to-mah-to - + Let's call the whole thing off ! +<br> +But oh, if we call the whole thing off, then we must part. +And oh, if we ever part, then that might break my heart. +<br> + So, if you like pajamas and I like pa-jah-mas, + I'll wear pajamas and give up pa-jah-mas. + For we know we + Need each other, so we + Better call the calling off off. + Let's call the whole thing off ! +<br> + Second Refrain +<br> + You say laughter and I say lawfter, + You say after and I say awfter; + Laughter, lawfter, after, awfter - + Let's call the whole thing off ! +<br> + You like vanilla and I like vanella, + You, sa's'parilla and I sa's'parella; + Vanilla, vanella, choc'late, strawb'ry - + Let's call the whole thing off ! +<br> +But oh, if we call the whole thing off, then we must part. +And oh, if we ever part, then that might break my heart. +<br> + So, if you go for oysters and I go for ersters, + I'll order oysters and cancel the ersters. + For we know we + Need each other, so we + Better call the calling off off. + Let's call the whole thing off ! + </pre> +<p><font size=2>Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers +in the film "Shall We Dance?" </font><p> +<p> +(c)2001-2002 John Lim. + +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-access.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-access.inc.php new file mode 100644 index 000000000..1e8ccaf0c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-access.inc.php @@ -0,0 +1,87 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Microsoft Access data driver. Requires ODBC. Works only on MS Windows. +*/ +if (!defined('_ADODB_ODBC_LAYER')) { + if (!defined('ADODB_DIR')) die(); + + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} + if (!defined('_ADODB_ACCESS')) { + define('_ADODB_ACCESS',1); + +class ADODB_access extends ADODB_odbc { + var $databaseType = 'access'; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $fmtDate = "#Y-m-d#"; + var $fmtTimeStamp = "#Y-m-d h:i:sA#"; // note not comma + var $_bindInputArray = false; // strangely enough, setting to true does not work reliably + var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; + var $sysTimeStamp = 'NOW'; + var $hasTransactions = false; + var $upperCase = 'ucase'; + + function ADODB_access() + { + global $ADODB_EXTENSION; + + $ADODB_EXTENSION = false; + $this->ADODB_odbc(); + } + + function Time() + { + return time(); + } + + function BeginTrans() { return false;} + + function IfNull( $field, $ifNull ) + { + return " IIF(IsNull($field), $ifNull, $field) "; // if Access + } +/* + function MetaTables() + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = odbc_tables($this->_connectionID); + $rs = new ADORecordSet_odbc($qid); + $ADODB_FETCH_MODE = $savem; + if (!$rs) return false; + + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + //print_pre($arr); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE') + $arr2[] = $arr[$i][2]; + } + return $arr2; + }*/ +} + + +class ADORecordSet_access extends ADORecordSet_odbc { + + var $databaseType = "access"; + + function ADORecordSet_access($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } +}// class +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ado.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado.inc.php new file mode 100644 index 000000000..4f99ac52a --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado.inc.php @@ -0,0 +1,660 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Microsoft ADO data driver. Requires ADO. Works only on MS Windows. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +define("_ADODB_ADO_LAYER", 1 ); +/*-------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------*/ + + +class ADODB_ado extends ADOConnection { + var $databaseType = "ado"; + var $_bindInputArray = false; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $dataProvider = "ado"; + var $hasAffectedRows = true; + var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary + var $_affectedRows = false; + var $_thisTransactions; + var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic + var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient; + var $_lock_type = -1; + var $_execute_option = -1; + var $poorAffectedRows = true; + var $charPage; + + function ADODB_ado() + { + $this->_affectedRows = new VARIANT; + } + + function ServerInfo() + { + if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; + return array('description' => $desc, 'version' => ''); + } + + function _affectedrows() + { + if (PHP_VERSION >= 5) return $this->_affectedRows; + + return $this->_affectedRows->value; + } + + // you can also pass a connection string like this: + // + // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); + function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL') + { + $u = 'UID'; + $p = 'PWD'; + + if (!empty($this->charPage)) + $dbc = new COM('ADODB.Connection',null,$this->charPage); + else + $dbc = new COM('ADODB.Connection'); + + if (! $dbc) return false; + + /* special support if provider is mssql or access */ + if ($argProvider=='mssql') { + $u = 'User Id'; //User parameter name for OLEDB + $p = 'Password'; + $argProvider = "SQLOLEDB"; // SQL Server Provider + + // not yet + //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; + + //use trusted conection for SQL if username not specified + if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; + } else if ($argProvider=='access') + $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider + + if ($argProvider) $dbc->Provider = $argProvider; + + if ($argUsername) $argHostname .= ";$u=$argUsername"; + if ($argPassword)$argHostname .= ";$p=$argPassword"; + + if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version"); + // @ added below for php 4.0.1 and earlier + @$dbc->Open((string) $argHostname); + + $this->_connectionID = $dbc; + + $dbc->CursorLocation = $this->_cursor_location; + return $dbc->State > 0; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') + { + return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); + } + +/* + adSchemaCatalogs = 1, + adSchemaCharacterSets = 2, + adSchemaCollations = 3, + adSchemaColumns = 4, + adSchemaCheckConstraints = 5, + adSchemaConstraintColumnUsage = 6, + adSchemaConstraintTableUsage = 7, + adSchemaKeyColumnUsage = 8, + adSchemaReferentialContraints = 9, + adSchemaTableConstraints = 10, + adSchemaColumnsDomainUsage = 11, + adSchemaIndexes = 12, + adSchemaColumnPrivileges = 13, + adSchemaTablePrivileges = 14, + adSchemaUsagePrivileges = 15, + adSchemaProcedures = 16, + adSchemaSchemata = 17, + adSchemaSQLLanguages = 18, + adSchemaStatistics = 19, + adSchemaTables = 20, + adSchemaTranslations = 21, + adSchemaProviderTypes = 22, + adSchemaViews = 23, + adSchemaViewColumnUsage = 24, + adSchemaViewTableUsage = 25, + adSchemaProcedureParameters = 26, + adSchemaForeignKeys = 27, + adSchemaPrimaryKeys = 28, + adSchemaProcedureColumns = 29, + adSchemaDBInfoKeywords = 30, + adSchemaDBInfoLiterals = 31, + adSchemaCubes = 32, + adSchemaDimensions = 33, + adSchemaHierarchies = 34, + adSchemaLevels = 35, + adSchemaMeasures = 36, + adSchemaProperties = 37, + adSchemaMembers = 38 + +*/ + + function MetaTables() + { + $arr= array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(20);//tables + if ($adors){ + $f = $adors->Fields(2);//table/view name + $t = $adors->Fields(3);//table type + while (!$adors->EOF){ + $tt=substr($t->value,0,6); + if ($tt!='SYSTEM' && $tt !='ACCESS') + $arr[]=$f->value; + //print $f->value . ' ' . $t->value.'<br>'; + $adors->MoveNext(); + } + $adors->Close(); + } + + return $arr; + } + + function MetaColumns($table, $normalize=true) + { + $table = strtoupper($table); + $arr = array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(4);//tables + + if ($adors){ + $t = $adors->Fields(2);//table/view name + while (!$adors->EOF){ + + + if (strtoupper($t->Value) == $table) { + + $fld = new ADOFieldObject(); + $c = $adors->Fields(3); + $fld->name = $c->Value; + $fld->type = 'CHAR'; // cannot discover type in ADO! + $fld->max_length = -1; + $arr[strtoupper($fld->name)]=$fld; + } + + $adors->MoveNext(); + } + $adors->Close(); + } + $false = false; + return empty($arr) ? $false : $arr; + } + + + + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + + $dbc = $this->_connectionID; + $false = false; + + // return rs + if ($inputarr) { + + if (!empty($this->charPage)) + $oCmd = new COM('ADODB.Command',null,$this->charPage); + else + $oCmd = new COM('ADODB.Command'); + $oCmd->ActiveConnection = $dbc; + $oCmd->CommandText = $sql; + $oCmd->CommandType = 1; + + // Map by http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcreateparam.asp + // Check issue http://bugs.php.net/bug.php?id=40664 !!! + while(list(, $val) = each($inputarr)) { + $type = gettype($val); + $len=strlen($val); + if ($type == 'boolean') + $this->adoParameterType = 11; + else if ($type == 'integer') + $this->adoParameterType = 3; + else if ($type == 'double') + $this->adoParameterType = 5; + elseif ($type == 'string') + $this->adoParameterType = 202; + else if (($val === null) || (!defined($val))) + $len=1; + else + $this->adoParameterType = 130; + + // name, type, direction 1 = input, len, + $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); + + $oCmd->Parameters->Append($p); + } + $p = false; + $rs = $oCmd->Execute(); + $e = $dbc->Errors; + if ($dbc->Errors->Count > 0) return $false; + return $rs; + } + + $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); + + if ($dbc->Errors->Count > 0) return $false; + if (! $rs) return $false; + + if ($rs->State == 0) { + $true = true; + return $true; // 0 = adStateClosed means no records returned + } + return $rs; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + + if (isset($this->_thisTransactions)) + if (!$this->_thisTransactions) return false; + else { + $o = $this->_connectionID->Properties("Transaction DDL"); + $this->_thisTransactions = $o ? true : false; + if (!$o) return false; + } + @$this->_connectionID->BeginTrans(); + $this->transCnt += 1; + return true; + } + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + + @$this->_connectionID->CommitTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + function RollbackTrans() { + if ($this->transOff) return true; + @$this->_connectionID->RollbackTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + + /* Returns: the last error message from previous database operation */ + + function ErrorMsg() + { + if (!$this->_connectionID) return "No connection established"; + $errc = $this->_connectionID->Errors; + if (!$errc) return "No Errors object found"; + if ($errc->Count == 0) return ''; + $err = $errc->Item($errc->Count-1); + return $err->Description; + } + + function ErrorNo() + { + $errc = $this->_connectionID->Errors; + if ($errc->Count == 0) return 0; + $err = $errc->Item($errc->Count-1); + return $err->NativeError; + } + + // returns true or false + function _close() + { + if ($this->_connectionID) $this->_connectionID->Close(); + $this->_connectionID = false; + return true; + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ado extends ADORecordSet { + + var $bind = false; + var $databaseType = "ado"; + var $dataProvider = "ado"; + var $_tarr = false; // caches the types + var $_flds; // and field objects + var $canSeek = true; + var $hideErrors = true; + + function ADORecordSet_ado($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + // returns the field object + function FetchField($fieldOffset = -1) { + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $rs = $this->_queryID; + $f = $rs->Fields($fieldOffset); + $o->name = $f->Name; + $t = $f->Type; + $o->type = $this->MetaType($t); + $o->max_length = $f->DefinedSize; + $o->ado_type = $t; + + //print "off=$off name=$o->name type=$o->type len=$o->max_length<br>"; + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + $rs = $this->_queryID; + $this->_numOfRows = $rs->RecordCount; + + $f = $rs->Fields; + $this->_numOfFields = $f->Count; + } + + + // should only be used to move forward as we normally use forward-only cursors + function _seek($row) + { + $rs = $this->_queryID; + // absoluteposition doesn't work -- my maths is wrong ? + // $rs->AbsolutePosition->$row-2; + // return true; + if ($this->_currentRow > $row) return false; + @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst + return true; + } + +/* + OLEDB types + + enum DBTYPEENUM + { DBTYPE_EMPTY = 0, + DBTYPE_NULL = 1, + DBTYPE_I2 = 2, + DBTYPE_I4 = 3, + DBTYPE_R4 = 4, + DBTYPE_R8 = 5, + DBTYPE_CY = 6, + DBTYPE_DATE = 7, + DBTYPE_BSTR = 8, + DBTYPE_IDISPATCH = 9, + DBTYPE_ERROR = 10, + DBTYPE_BOOL = 11, + DBTYPE_VARIANT = 12, + DBTYPE_IUNKNOWN = 13, + DBTYPE_DECIMAL = 14, + DBTYPE_UI1 = 17, + DBTYPE_ARRAY = 0x2000, + DBTYPE_BYREF = 0x4000, + DBTYPE_I1 = 16, + DBTYPE_UI2 = 18, + DBTYPE_UI4 = 19, + DBTYPE_I8 = 20, + DBTYPE_UI8 = 21, + DBTYPE_GUID = 72, + DBTYPE_VECTOR = 0x1000, + DBTYPE_RESERVED = 0x8000, + DBTYPE_BYTES = 128, + DBTYPE_STR = 129, + DBTYPE_WSTR = 130, + DBTYPE_NUMERIC = 131, + DBTYPE_UDT = 132, + DBTYPE_DBDATE = 133, + DBTYPE_DBTIME = 134, + DBTYPE_DBTIMESTAMP = 135 + + ADO Types + + adEmpty = 0, + adTinyInt = 16, + adSmallInt = 2, + adInteger = 3, + adBigInt = 20, + adUnsignedTinyInt = 17, + adUnsignedSmallInt = 18, + adUnsignedInt = 19, + adUnsignedBigInt = 21, + adSingle = 4, + adDouble = 5, + adCurrency = 6, + adDecimal = 14, + adNumeric = 131, + adBoolean = 11, + adError = 10, + adUserDefined = 132, + adVariant = 12, + adIDispatch = 9, + adIUnknown = 13, + adGUID = 72, + adDate = 7, + adDBDate = 133, + adDBTime = 134, + adDBTimeStamp = 135, + adBSTR = 8, + adChar = 129, + adVarChar = 200, + adLongVarChar = 201, + adWChar = 130, + adVarWChar = 202, + adLongVarWChar = 203, + adBinary = 128, + adVarBinary = 204, + adLongVarBinary = 205, + adChapter = 136, + adFileTime = 64, + adDBFileTime = 137, + adPropVariant = 138, + adVarNumeric = 139 +*/ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + if (!is_numeric($t)) return $t; + + switch ($t) { + case 0: + case 12: // variant + case 8: // bstr + case 129: //char + case 130: //wc + case 200: // varc + case 202:// varWC + case 128: // bin + case 204: // varBin + case 72: // guid + if ($len <= $this->blobSize) return 'C'; + + case 201: + case 203: + return 'X'; + case 128: + case 204: + case 205: + return 'B'; + case 7: + case 133: return 'D'; + + case 134: + case 135: return 'T'; + + case 11: return 'L'; + + case 16:// adTinyInt = 16, + case 2://adSmallInt = 2, + case 3://adInteger = 3, + case 4://adBigInt = 20, + case 17://adUnsignedTinyInt = 17, + case 18://adUnsignedSmallInt = 18, + case 19://adUnsignedInt = 19, + case 20://adUnsignedBigInt = 21, + return 'I'; + default: return 'N'; + } + } + + // time stamp not supported yet + function _fetch() + { + $rs = $this->_queryID; + if (!$rs or $rs->EOF) { + $this->fields = false; + return false; + } + $this->fields = array(); + + if (!$this->_tarr) { + $tarr = array(); + $flds = array(); + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + $f = $rs->Fields($i); + $flds[] = $f; + $tarr[] = $f->Type; + } + // bind types and flds only once + $this->_tarr = $tarr; + $this->_flds = $flds; + } + $t = reset($this->_tarr); + $f = reset($this->_flds); + + if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + //echo "<p>",$t,' ';var_dump($f->value); echo '</p>'; + switch($t) { + case 135: // timestamp + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); + // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 + $val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600; + else + $val = $f->value; + $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 133:// A date value (yyyymmdd) + if ($val = $f->value) { + $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); + } else + $this->fields[] = false; + break; + case 7: // adDate + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); + else $val = $f->value; + + if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); + else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 1: // null + $this->fields[] = false; + break; + case 6: // currency is not supported properly; + ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>'); + $this->fields[] = (float) $f->value; + break; + case 11: //BIT; + $val = ""; + if(is_bool($f->value)) { + if($f->value==true) $val = 1; + else $val = 0; + } + if(is_null($f->value)) $val = null; + + $this->fields[] = $val; + break; + default: + $this->fields[] = $f->value; + break; + } + //print " $f->value $t, "; + $f = next($this->_flds); + $t = next($this->_tarr); + } // for + if ($this->hideErrors) error_reporting($olde); + @$rs->MoveNext(); // @ needed for some versions of PHP! + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + + function NextRecordSet() + { + $rs = $this->_queryID; + $this->_queryID = $rs->NextRecordSet(); + //$this->_queryID = $this->_QueryId->NextRecordSet(); + if ($this->_queryID == null) return false; + + $this->_currentRow = -1; + $this->_currentPage = -1; + $this->bind = false; + $this->fields = false; + $this->_flds = false; + $this->_tarr = false; + + $this->_inited = false; + $this->Init(); + return true; + } + + function _close() { + $this->_flds = false; + @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) + $this->_queryID = false; + } + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ado5.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado5.inc.php new file mode 100644 index 000000000..2f61d8840 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado5.inc.php @@ -0,0 +1,704 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +define("_ADODB_ADO_LAYER", 1 ); +/*-------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------*/ + + +class ADODB_ado extends ADOConnection { + var $databaseType = "ado"; + var $_bindInputArray = false; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $dataProvider = "ado"; + var $hasAffectedRows = true; + var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary + var $_affectedRows = false; + var $_thisTransactions; + var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic + var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient; + var $_lock_type = -1; + var $_execute_option = -1; + var $poorAffectedRows = true; + var $charPage; + + function ADODB_ado() + { + $this->_affectedRows = new VARIANT; + } + + function ServerInfo() + { + if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; + return array('description' => $desc, 'version' => ''); + } + + function _affectedrows() + { + if (PHP_VERSION >= 5) return $this->_affectedRows; + + return $this->_affectedRows->value; + } + + // you can also pass a connection string like this: + // + // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); + function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '') + { + // two modes + // - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat + // - if $argProvider is not empty, then $argDBorProvider holds db + + + if ($argProvider) { + $argDatabasename = $argDBorProvider; + } else { + $argDatabasename = ''; + if ($argDBorProvider) $argProvider = $argDBorProvider; + else if (stripos($argHostname,'PROVIDER') === false) /* full conn string is not in $argHostname */ + $argProvider = 'MSDASQL'; + } + + + try { + $u = 'UID'; + $p = 'PWD'; + + if (!empty($this->charPage)) + $dbc = new COM('ADODB.Connection',null,$this->charPage); + else + $dbc = new COM('ADODB.Connection'); + + if (! $dbc) return false; + + /* special support if provider is mssql or access */ + if ($argProvider=='mssql') { + $u = 'User Id'; //User parameter name for OLEDB + $p = 'Password'; + $argProvider = "SQLOLEDB"; // SQL Server Provider + + // not yet + //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; + + //use trusted conection for SQL if username not specified + if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; + } else if ($argProvider=='access') + $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider + + if ($argProvider) $dbc->Provider = $argProvider; + + if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname"; + + + if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename"; + if ($argUsername) $argHostname .= ";$u=$argUsername"; + if ($argPassword)$argHostname .= ";$p=$argPassword"; + + if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version"); + // @ added below for php 4.0.1 and earlier + @$dbc->Open((string) $argHostname); + + $this->_connectionID = $dbc; + + $dbc->CursorLocation = $this->_cursor_location; + return $dbc->State > 0; + } catch (exception $e) { + if ($this->debug);echo "<pre>",$argHostname,"\n",$e,"</pre>\n"; + } + + return false; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') + { + return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); + } + +/* + adSchemaCatalogs = 1, + adSchemaCharacterSets = 2, + adSchemaCollations = 3, + adSchemaColumns = 4, + adSchemaCheckConstraints = 5, + adSchemaConstraintColumnUsage = 6, + adSchemaConstraintTableUsage = 7, + adSchemaKeyColumnUsage = 8, + adSchemaReferentialContraints = 9, + adSchemaTableConstraints = 10, + adSchemaColumnsDomainUsage = 11, + adSchemaIndexes = 12, + adSchemaColumnPrivileges = 13, + adSchemaTablePrivileges = 14, + adSchemaUsagePrivileges = 15, + adSchemaProcedures = 16, + adSchemaSchemata = 17, + adSchemaSQLLanguages = 18, + adSchemaStatistics = 19, + adSchemaTables = 20, + adSchemaTranslations = 21, + adSchemaProviderTypes = 22, + adSchemaViews = 23, + adSchemaViewColumnUsage = 24, + adSchemaViewTableUsage = 25, + adSchemaProcedureParameters = 26, + adSchemaForeignKeys = 27, + adSchemaPrimaryKeys = 28, + adSchemaProcedureColumns = 29, + adSchemaDBInfoKeywords = 30, + adSchemaDBInfoLiterals = 31, + adSchemaCubes = 32, + adSchemaDimensions = 33, + adSchemaHierarchies = 34, + adSchemaLevels = 35, + adSchemaMeasures = 36, + adSchemaProperties = 37, + adSchemaMembers = 38 + +*/ + + function MetaTables() + { + $arr= array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(20);//tables + if ($adors){ + $f = $adors->Fields(2);//table/view name + $t = $adors->Fields(3);//table type + while (!$adors->EOF){ + $tt=substr($t->value,0,6); + if ($tt!='SYSTEM' && $tt !='ACCESS') + $arr[]=$f->value; + //print $f->value . ' ' . $t->value.'<br>'; + $adors->MoveNext(); + } + $adors->Close(); + } + + return $arr; + } + + function MetaColumns($table, $normalize=true) + { + $table = strtoupper($table); + $arr= array(); + $dbc = $this->_connectionID; + + $adors=@$dbc->OpenSchema(4);//tables + + if ($adors){ + $t = $adors->Fields(2);//table/view name + while (!$adors->EOF){ + + + if (strtoupper($t->Value) == $table) { + + $fld = new ADOFieldObject(); + $c = $adors->Fields(3); + $fld->name = $c->Value; + $fld->type = 'CHAR'; // cannot discover type in ADO! + $fld->max_length = -1; + $arr[strtoupper($fld->name)]=$fld; + } + + $adors->MoveNext(); + } + $adors->Close(); + } + + return $arr; + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour... + + $dbc = $this->_connectionID; + + // return rs + + $false = false; + + if ($inputarr) { + + if (!empty($this->charPage)) + $oCmd = new COM('ADODB.Command',null,$this->charPage); + else + $oCmd = new COM('ADODB.Command'); + $oCmd->ActiveConnection = $dbc; + $oCmd->CommandText = $sql; + $oCmd->CommandType = 1; + + while(list(, $val) = each($inputarr)) { + $type = gettype($val); + $len=strlen($val); + if ($type == 'boolean') + $this->adoParameterType = 11; + else if ($type == 'integer') + $this->adoParameterType = 3; + else if ($type == 'double') + $this->adoParameterType = 5; + elseif ($type == 'string') + $this->adoParameterType = 202; + else if (($val === null) || (!defined($val))) + $len=1; + else + $this->adoParameterType = 130; + + // name, type, direction 1 = input, len, + $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); + + $oCmd->Parameters->Append($p); + } + + $p = false; + $rs = $oCmd->Execute(); + $e = $dbc->Errors; + if ($dbc->Errors->Count > 0) return $false; + return $rs; + } + + $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); + + if ($dbc->Errors->Count > 0) return $false; + if (! $rs) return $false; + + if ($rs->State == 0) { + $true = true; + return $true; // 0 = adStateClosed means no records returned + } + return $rs; + + } catch (exception $e) { + + } + return $false; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + + if (isset($this->_thisTransactions)) + if (!$this->_thisTransactions) return false; + else { + $o = $this->_connectionID->Properties("Transaction DDL"); + $this->_thisTransactions = $o ? true : false; + if (!$o) return false; + } + @$this->_connectionID->BeginTrans(); + $this->transCnt += 1; + return true; + } + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + + @$this->_connectionID->CommitTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + function RollbackTrans() { + if ($this->transOff) return true; + @$this->_connectionID->RollbackTrans(); + if ($this->transCnt) @$this->transCnt -= 1; + return true; + } + + /* Returns: the last error message from previous database operation */ + + function ErrorMsg() + { + if (!$this->_connectionID) return "No connection established"; + $errmsg = ''; + + try { + $errc = $this->_connectionID->Errors; + if (!$errc) return "No Errors object found"; + if ($errc->Count == 0) return ''; + $err = $errc->Item($errc->Count-1); + $errmsg = $err->Description; + }catch(exception $e) { + } + return $errmsg; + } + + function ErrorNo() + { + $errc = $this->_connectionID->Errors; + if ($errc->Count == 0) return 0; + $err = $errc->Item($errc->Count-1); + return $err->NativeError; + } + + // returns true or false + function _close() + { + if ($this->_connectionID) $this->_connectionID->Close(); + $this->_connectionID = false; + return true; + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ado extends ADORecordSet { + + var $bind = false; + var $databaseType = "ado"; + var $dataProvider = "ado"; + var $_tarr = false; // caches the types + var $_flds; // and field objects + var $canSeek = true; + var $hideErrors = true; + + function ADORecordSet_ado($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + // returns the field object + function FetchField($fieldOffset = -1) { + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $rs = $this->_queryID; + if (!$rs) return false; + + $f = $rs->Fields($fieldOffset); + $o->name = $f->Name; + $t = $f->Type; + $o->type = $this->MetaType($t); + $o->max_length = $f->DefinedSize; + $o->ado_type = $t; + + + //print "off=$off name=$o->name type=$o->type len=$o->max_length<br>"; + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + $rs = $this->_queryID; + + try { + $this->_numOfRows = $rs->RecordCount; + } catch (Exception $e) { + $this->_numOfRows = -1; + } + $f = $rs->Fields; + $this->_numOfFields = $f->Count; + } + + + // should only be used to move forward as we normally use forward-only cursors + function _seek($row) + { + $rs = $this->_queryID; + // absoluteposition doesn't work -- my maths is wrong ? + // $rs->AbsolutePosition->$row-2; + // return true; + if ($this->_currentRow > $row) return false; + @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst + return true; + } + +/* + OLEDB types + + enum DBTYPEENUM + { DBTYPE_EMPTY = 0, + DBTYPE_NULL = 1, + DBTYPE_I2 = 2, + DBTYPE_I4 = 3, + DBTYPE_R4 = 4, + DBTYPE_R8 = 5, + DBTYPE_CY = 6, + DBTYPE_DATE = 7, + DBTYPE_BSTR = 8, + DBTYPE_IDISPATCH = 9, + DBTYPE_ERROR = 10, + DBTYPE_BOOL = 11, + DBTYPE_VARIANT = 12, + DBTYPE_IUNKNOWN = 13, + DBTYPE_DECIMAL = 14, + DBTYPE_UI1 = 17, + DBTYPE_ARRAY = 0x2000, + DBTYPE_BYREF = 0x4000, + DBTYPE_I1 = 16, + DBTYPE_UI2 = 18, + DBTYPE_UI4 = 19, + DBTYPE_I8 = 20, + DBTYPE_UI8 = 21, + DBTYPE_GUID = 72, + DBTYPE_VECTOR = 0x1000, + DBTYPE_RESERVED = 0x8000, + DBTYPE_BYTES = 128, + DBTYPE_STR = 129, + DBTYPE_WSTR = 130, + DBTYPE_NUMERIC = 131, + DBTYPE_UDT = 132, + DBTYPE_DBDATE = 133, + DBTYPE_DBTIME = 134, + DBTYPE_DBTIMESTAMP = 135 + + ADO Types + + adEmpty = 0, + adTinyInt = 16, + adSmallInt = 2, + adInteger = 3, + adBigInt = 20, + adUnsignedTinyInt = 17, + adUnsignedSmallInt = 18, + adUnsignedInt = 19, + adUnsignedBigInt = 21, + adSingle = 4, + adDouble = 5, + adCurrency = 6, + adDecimal = 14, + adNumeric = 131, + adBoolean = 11, + adError = 10, + adUserDefined = 132, + adVariant = 12, + adIDispatch = 9, + adIUnknown = 13, + adGUID = 72, + adDate = 7, + adDBDate = 133, + adDBTime = 134, + adDBTimeStamp = 135, + adBSTR = 8, + adChar = 129, + adVarChar = 200, + adLongVarChar = 201, + adWChar = 130, + adVarWChar = 202, + adLongVarWChar = 203, + adBinary = 128, + adVarBinary = 204, + adLongVarBinary = 205, + adChapter = 136, + adFileTime = 64, + adDBFileTime = 137, + adPropVariant = 138, + adVarNumeric = 139 +*/ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + if (!is_numeric($t)) return $t; + + switch ($t) { + case 0: + case 12: // variant + case 8: // bstr + case 129: //char + case 130: //wc + case 200: // varc + case 202:// varWC + case 128: // bin + case 204: // varBin + case 72: // guid + if ($len <= $this->blobSize) return 'C'; + + case 201: + case 203: + return 'X'; + case 128: + case 204: + case 205: + return 'B'; + case 7: + case 133: return 'D'; + + case 134: + case 135: return 'T'; + + case 11: return 'L'; + + case 16:// adTinyInt = 16, + case 2://adSmallInt = 2, + case 3://adInteger = 3, + case 4://adBigInt = 20, + case 17://adUnsignedTinyInt = 17, + case 18://adUnsignedSmallInt = 18, + case 19://adUnsignedInt = 19, + case 20://adUnsignedBigInt = 21, + return 'I'; + default: return 'N'; + } + } + + // time stamp not supported yet + function _fetch() + { + $rs = $this->_queryID; + if (!$rs or $rs->EOF) { + $this->fields = false; + return false; + } + $this->fields = array(); + + if (!$this->_tarr) { + $tarr = array(); + $flds = array(); + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + $f = $rs->Fields($i); + $flds[] = $f; + $tarr[] = $f->Type; + } + // bind types and flds only once + $this->_tarr = $tarr; + $this->_flds = $flds; + } + $t = reset($this->_tarr); + $f = reset($this->_flds); + + if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null + for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { + //echo "<p>",$t,' ';var_dump($f->value); echo '</p>'; + switch($t) { + case 135: // timestamp + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); + // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 + $val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600; + else + $val = $f->value; + $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 133:// A date value (yyyymmdd) + if ($val = $f->value) { + $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); + } else + $this->fields[] = false; + break; + case 7: // adDate + if (!strlen((string)$f->value)) $this->fields[] = false; + else { + if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); + else $val = $f->value; + + if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); + else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); + } + break; + case 1: // null + $this->fields[] = false; + break; + case 6: // currency is not supported properly; + ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>'); + $this->fields[] = (float) $f->value; + break; + case 11: //BIT; + $val = ""; + if(is_bool($f->value)) { + if($f->value==true) $val = 1; + else $val = 0; + } + if(is_null($f->value)) $val = null; + + $this->fields[] = $val; + break; + default: + $this->fields[] = $f->value; + break; + } + //print " $f->value $t, "; + $f = next($this->_flds); + $t = next($this->_tarr); + } // for + if ($this->hideErrors) error_reporting($olde); + @$rs->MoveNext(); // @ needed for some versions of PHP! + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + + function NextRecordSet() + { + $rs = $this->_queryID; + $this->_queryID = $rs->NextRecordSet(); + //$this->_queryID = $this->_QueryId->NextRecordSet(); + if ($this->_queryID == null) return false; + + $this->_currentRow = -1; + $this->_currentPage = -1; + $this->bind = false; + $this->fields = false; + $this->_flds = false; + $this->_tarr = false; + + $this->_inited = false; + $this->Init(); + return true; + } + + function _close() { + $this->_flds = false; + try { + @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) + } catch (Exception $e) { + } + $this->_queryID = false; + } + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ado_access.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado_access.inc.php new file mode 100644 index 000000000..c0ac534e1 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado_access.inc.php @@ -0,0 +1,54 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. +Released under both BSD license and Lesser GPL library license. +Whenever there is any discrepancy between the two licenses, +the BSD license will take precedence. See License.txt. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Microsoft Access ADO data driver. Requires ADO and ODBC. Works only on MS Windows. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ADO_LAYER')) { + if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php"); + else include(ADODB_DIR."/drivers/adodb-ado.inc.php"); +} + +class ADODB_ado_access extends ADODB_ado { + var $databaseType = 'ado_access'; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $fmtDate = "#Y-m-d#"; + var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma + var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; + var $sysTimeStamp = 'NOW'; + var $upperCase = 'ucase'; + + function ADODB_ado_access() + { + $this->ADODB_ado(); + } + + /*function BeginTrans() { return false;} + + function CommitTrans() { return false;} + + function RollbackTrans() { return false;}*/ + +} + + +class ADORecordSet_ado_access extends ADORecordSet_ado { + + var $databaseType = "ado_access"; + + function ADORecordSet_ado_access($id,$mode=false) + { + return $this->ADORecordSet_ado($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ado_mssql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado_mssql.inc.php new file mode 100644 index 000000000..b30df95b4 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ado_mssql.inc.php @@ -0,0 +1,154 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Microsoft SQL Server ADO data driver. Requires ADO and MSSQL client. + Works only on MS Windows. + + Warning: Some versions of PHP (esp PHP4) leak memory when ADO/COM is used. + Please check http://bugs.php.net/ for more info. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ADO_LAYER')) { + if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php"); + else include(ADODB_DIR."/drivers/adodb-ado.inc.php"); +} + + +class ADODB_ado_mssql extends ADODB_ado { + var $databaseType = 'ado_mssql'; + var $hasTop = 'top'; + var $hasInsertID = true; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $ansiOuter = true; // for mssql7 or later + var $substr = "substring"; + var $length = 'len'; + var $_dropSeqSQL = "drop table %s"; + + //var $_inTransaction = 1; // always open recordsets, so no transaction problems. + + function ADODB_ado_mssql() + { + $this->ADODB_ado(); + } + + function _insertid() + { + return $this->GetOne('select SCOPE_IDENTITY()'); + } + + function _affectedrows() + { + return $this->GetOne('select @@rowcount'); + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + function qstr($s,$magic_quotes=false) + { + $s = ADOConnection::qstr($s, $magic_quotes); + return str_replace("\0", "\\\\000", $s); + } + + function MetaColumns($table, $normalize=true) + { + $table = strtoupper($table); + $arr= array(); + $dbc = $this->_connectionID; + + $osoptions = array(); + $osoptions[0] = null; + $osoptions[1] = null; + $osoptions[2] = $table; + $osoptions[3] = null; + + $adors=@$dbc->OpenSchema(4, $osoptions);//tables + + if ($adors){ + while (!$adors->EOF){ + $fld = new ADOFieldObject(); + $c = $adors->Fields(3); + $fld->name = $c->Value; + $fld->type = 'CHAR'; // cannot discover type in ADO! + $fld->max_length = -1; + $arr[strtoupper($fld->name)]=$fld; + + $adors->MoveNext(); + } + $adors->Close(); + } + $false = false; + return empty($arr) ? $false : $arr; + } + + function CreateSequence($seq='adodbseq',$start=1) + { + + $this->Execute('BEGIN TRANSACTION adodbseq'); + $start -= 1; + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return true; + } + + function GenID($seq='adodbseq',$start=1) + { + //$this->debug=1; + $this->Execute('BEGIN TRANSACTION adodbseq'); + $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); + if (!$ok) { + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $start; + } + $num = $this->GetOne("select id from $seq"); + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $num; + + // in old implementation, pre 1.90, we returned GUID... + //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'"); + } + + } // end class + + class ADORecordSet_ado_mssql extends ADORecordSet_ado { + + var $databaseType = 'ado_mssql'; + + function ADORecordSet_ado_mssql($id,$mode=false) + { + return $this->ADORecordSet_ado($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ads.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ads.inc.php new file mode 100644 index 000000000..0de57ca7a --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ads.inc.php @@ -0,0 +1,796 @@ +<?php +/* + (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. + Portions Copyright (c) 2007-2009, iAnywhere Solutions, Inc. + All rights reserved. All unpublished rights reserved. + + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + +Set tabs to 4 for best viewing. + + +NOTE: This driver requires the Advantage PHP client libraries, which + can be downloaded for free via: + http://devzone.advantagedatabase.com/dz/content.aspx?key=20 + +DELPHI FOR PHP USERS: + The following steps can be taken to utilize this driver from the + CodeGear Delphi for PHP product: + 1 - See note above, download and install the Advantage PHP client. + 2 - Copy the following files to the Delphi for PHP\X.X\php\ext directory: + ace32.dll + axcws32.dll + adsloc32.dll + php_advantage.dll (rename the existing php_advantage.dll.5.x.x file) + 3 - Add the following line to the Delphi for PHP\X.X\php\php.ini.template file: + extension=php_advantage.dll + 4 - To use: enter "ads" as the DriverName on a connection component, and set + a Host property similar to "DataDirectory=c:\". See the Advantage PHP + help file topic for ads_connect for details on connection path options + and formatting. + 5 - (optional) - Modify the Delphi for PHP\X.X\vcl\packages\database.packages.php + file and add ads to the list of strings returned when registering the + Database object's DriverName property. + +*/ +// security - hide paths +if (!defined('ADODB_DIR')) die(); + + define("_ADODB_ADS_LAYER", 2 ); + +/*-------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------*/ + + +class ADODB_ads extends ADOConnection { + var $databaseType = "ads"; + var $fmt = "'m-d-Y'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $concat_operator = ''; + var $replaceQuote = "''"; // string to use to replace quotes + var $dataProvider = "ads"; + var $hasAffectedRows = true; + var $binmode = ODBC_BINMODE_RETURN; + var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive + // breaking backward-compat + //var $longreadlen = 8000; // default number of chars to return for a Blob/Long field + var $_bindInputArray = false; + var $curmode = SQL_CUR_USE_DRIVER; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L + var $_genSeqSQL = "create table %s (id integer)"; + var $_autocommit = true; + var $_haserrorfunctions = true; + var $_has_stupid_odbc_fetch_api_change = true; + var $_lastAffectedRows = 0; + var $uCaseTables = true; // for meta* functions, uppercase table names + + + function ADODB_ads() + { + $this->_haserrorfunctions = ADODB_PHPVER >= 0x4050; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('ads_connect')) return null; + + if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') { + ADOConnection::outp("For Advantage Connect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + if (isset($php_errormsg)) $php_errormsg = ''; + if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword,$this->curmode); + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('ads_connect')) return null; + + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->debug && $argDatabasename) { + ADOConnection::outp("For PConnect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + // print "dsn=$argDSN u=$argUsername p=$argPassword<br>"; flush(); + if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = ads_pconnect($argDSN,$argUsername,$argPassword,$this->curmode); + + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->_connectionID && $this->autoRollback) @ads_rollback($this->_connectionID); + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns the Server version and Description + function ServerInfo() + { + + if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { + $stmt = $this->Prepare('EXECUTE PROCEDURE sp_mgGetInstallInfo()'); + $res = $this->Execute($stmt); + if(!$res) + print $this->ErrorMsg(); + else{ + $ret["version"]= $res->fields[3]; + $ret["description"]="Advantage Database Server"; + return $ret; + } + } + else { + return ADOConnection::ServerInfo(); + } + } + + + // returns true or false + function CreateSequence( $seqname,$start=1) + { + $res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE"); + if(!$res){ + print $this->ErrorMsg(); + return false; + } + else + return true; + + } + + // returns true or false + function DropSequence($seqname) + { + $res = $this->Execute("DROP TABLE $seqname"); + if(!$res){ + print $this->ErrorMsg(); + return false; + } + else + return true; + } + + + // returns the generated ID or false + // checks if the table already exists, else creates the table and inserts a record into the table + // and gets the ID number of the last inserted record. + function GenID($seqname,$start=1) + { + $go = $this->Execute("select * from $seqname"); + if (!$go){ + $res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE"); + if(!res){ + print $this->ErrorMsg(); + return false; + } + } + $res = $this->Execute("INSERT INTO $seqname VALUES( DEFAULT )"); + if(!$res){ + print $this->ErrorMsg(); + return false; + } + else{ + $gen = $this->Execute("SELECT LastAutoInc( STATEMENT ) FROM system.iota"); + $ret = $gen->fields[0]; + return $ret; + } + + } + + + + + function ErrorMsg() + { + if ($this->_haserrorfunctions) { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @ads_errormsg(); + return @ads_errormsg($this->_connectionID); + } else return ADOConnection::ErrorMsg(); + } + + + function ErrorNo() + { + + if ($this->_haserrorfunctions) { + if ($this->_errorCode !== false) { + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; + } + + if (empty($this->_connectionID)) $e = @ads_error(); + else $e = @ads_error($this->_connectionID); + + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + // so we check and patch + if (strlen($e)<=2) return 0; + return $e; + } else return ADOConnection::ErrorNo(); + } + + + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + return ads_autocommit($this->_connectionID,false); + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = ads_commit($this->_connectionID); + ads_autocommit($this->_connectionID,true); + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = ads_rollback($this->_connectionID); + ads_autocommit($this->_connectionID,true); + return $ret; + } + + + // Returns tables,Views or both on succesfull execution. Returns + // tables by default on succesfull execustion. + function &MetaTables($ttype) + { + $recordSet1 = $this->Execute("select * from system.tables"); + if(!$recordSet1){ + print $this->ErrorMsg(); + return false; + } + $recordSet2 = $this->Execute("select * from system.views"); + if(!$recordSet2){ + print $this->ErrorMsg(); + return false; + } + $i=0; + while (!$recordSet1->EOF){ + $arr["$i"] = $recordSet1->fields[0]; + $recordSet1->MoveNext(); + $i=$i+1; + } + if($ttype=='FALSE'){ + while (!$recordSet2->EOF){ + $arr["$i"] = $recordSet2->fields[0]; + $recordSet2->MoveNext(); + $i=$i+1; + } + return $arr; + } + elseif($ttype=='VIEWS'){ + while (!$recordSet2->EOF){ + $arrV["$i"] = $recordSet2->fields[0]; + $recordSet2->MoveNext(); + $i=$i+1; + } + return $arrV; + } + else{ + return $arr; + } + + } + + function &MetaPrimaryKeys($table) + { + $recordSet = $this->Execute("select table_primary_key from system.tables where name='$table'"); + if(!$recordSet){ + print $this->ErrorMsg(); + return false; + } + $i=0; + while (!$recordSet->EOF){ + $arr["$i"] = $recordSet->fields[0]; + $recordSet->MoveNext(); + $i=$i+1; + } + return $arr; + } + +/* +See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp +/ SQL data type codes / +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (ODBCVER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + + +/ One-parameter shortcuts for date/time data types / +#if (ODBCVER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 + +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +*/ + function ODBCTypes($t) + { + switch ((integer)$t) { + case 1: + case 12: + case 0: + case -95: + case -96: + return 'C'; + case -97: + case -1: //text + return 'X'; + case -4: //image + return 'B'; + + case 9: + case 91: + return 'D'; + + case 10: + case 11: + case 92: + case 93: + return 'T'; + + case 4: + case 5: + case -6: + return 'I'; + + case -11: // uniqidentifier + return 'R'; + case -7: //bit + return 'L'; + + default: + return 'N'; + } + } + + function &MetaColumns($table) + { + global $ADODB_FETCH_MODE; + + $false = false; + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + /*if (false) { // after testing, confirmed that the following does not work becoz of a bug + $qid2 = ads_tables($this->_connectionID); + $rs = new ADORecordSet_ads($qid2); + $ADODB_FETCH_MODE = $savem; + if (!$rs) return false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + while (!$rs->EOF) { + if ($table == strtoupper($rs->fields[2])) { + $q = $rs->fields[0]; + $o = $rs->fields[1]; + break; + } + $rs->MoveNext(); + } + $rs->Close(); + + $qid = ads_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); + } */ + + switch ($this->databaseType) { + case 'access': + case 'vfp': + $qid = ads_columns($this->_connectionID);#,'%','',strtoupper($table),'%'); + break; + + + case 'db2': + $colname = "%"; + $qid = ads_columns($this->_connectionID, "", $schema, $table, $colname); + break; + + default: + $qid = @ads_columns($this->_connectionID,'%','%',strtoupper($table),'%'); + if (empty($qid)) $qid = ads_columns($this->_connectionID); + break; + } + if (empty($qid)) return $false; + + $rs = new ADORecordSet_ads($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + $retarr = array(); + + /* + $rs->fields indices + 0 TABLE_QUALIFIER + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 DATA_TYPE + 5 TYPE_NAME + 6 PRECISION + 7 LENGTH + 8 SCALE + 9 RADIX + 10 NULLABLE + 11 REMARKS + */ + while (!$rs->EOF) { + // adodb_pr($rs->fields); + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $this->ODBCTypes($rs->fields[4]); + + // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp + // access uses precision to store length for char/varchar + if ($fld->type == 'C' or $fld->type == 'X') { + if ($this->databaseType == 'access') + $fld->max_length = $rs->fields[6]; + else if ($rs->fields[4] <= -95) // UNICODE + $fld->max_length = $rs->fields[7]/2; + else + $fld->max_length = $rs->fields[7]; + } else + $fld->max_length = $rs->fields[7]; + $fld->not_null = !empty($rs->fields[10]); + $fld->scale = $rs->fields[8]; + $retarr[strtoupper($fld->name)] = $fld; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); //-- crashes 4.03pl1 -- why? + + if (empty($retarr)) $retarr = false; + return $retarr; + } + + // Returns an array of columns names for a given table + function &MetaColumnNames($table) + { + $recordSet = $this->Execute("select name from system.columns where parent='$table'"); + if(!$recordSet){ + print $this->ErrorMsg(); + return false; + } + else{ + $i=0; + while (!$recordSet->EOF){ + $arr["FIELD$i"] = $recordSet->fields[0]; + $recordSet->MoveNext(); + $i=$i+1; + } + return $arr; + } + } + + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + $stmt = ads_prepare($this->_connectionID,$sql); + if (!$stmt) { + // we don't know whether odbc driver is parsing prepared stmts, so just return sql + return $sql; + } + return array($sql,$stmt,false); + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + GLOBAL $php_errormsg; + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_error = ''; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = ads_prepare($this->_connectionID,$sql); + + if ($stmtid == false) { + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + } + + if (! ads_execute($stmtid,$inputarr)) { + //@ads_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } + return false; + } + + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!ads_execute($stmtid)) { + //@ads_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } + return false; + } + } else + { + + $stmtid = ads_exec($this->_connectionID,$sql); + + } + + $this->_lastAffectedRows = 0; + + if ($stmtid) + { + + if (@ads_num_fields($stmtid) == 0) { + $this->_lastAffectedRows = ads_num_rows($stmtid); + $stmtid = true; + + } else { + + $this->_lastAffectedRows = 0; + ads_binmode($stmtid,$this->binmode); + ads_longreadlen($stmtid,$this->maxblobsize); + + } + + if ($this->_haserrorfunctions) + { + + $this->_errorMsg = ''; + $this->_errorCode = 0; + } + else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } + else + { + if ($this->_haserrorfunctions) { + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } + + return $stmtid; + + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + $sql = "UPDATE $table SET $column=? WHERE $where"; + $stmtid = ads_prepare($this->_connectionID,$sql); + if ($stmtid == false){ + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + if (! ads_execute($stmtid,array($val),array(SQL_BINARY) )){ + if ($this->_haserrorfunctions){ + $this->_errorMsg = ads_errormsg(); + $this->_errorCode = ads_error(); + } + return false; + } + return TRUE; + } + + // returns true or false + function _close() + { + $ret = @ads_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } + + function _affectedrows() + { + return $this->_lastAffectedRows; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ads extends ADORecordSet { + + var $bind = false; + var $databaseType = "ads"; + var $dataProvider = "ads"; + var $useFetchArray; + var $_has_stupid_odbc_fetch_api_change; + + function ADORecordSet_ads($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + + // the following is required for mysql odbc driver in 4.3.1 -- why? + $this->EOF = false; + $this->_currentRow = -1; + //$this->ADORecordSet($id); + } + + + // returns the field object + function &FetchField($fieldOffset = -1) + { + + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $o->name = @ads_field_name($this->_queryID,$off); + $o->type = @ads_field_type($this->_queryID,$off); + $o->max_length = @ads_field_len($this->_queryID,$off); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @ads_num_rows($this->_queryID) : -1; + $this->_numOfFields = @ads_num_fields($this->_queryID); + // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 + if ($this->_numOfRows == 0) $this->_numOfRows = -1; + //$this->useFetchArray = $this->connection->useFetchArray; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + function _seek($row) + { + return false; + } + + // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated + function &GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $rs =& $this->GetArray($nrows); + return $rs; + } + $savem = $this->fetchMode; + $this->fetchMode = ADODB_FETCH_NUM; + $this->Move($offset); + $this->fetchMode = $savem; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + function MoveNext() + { + if ($this->_numOfRows != 0 && !$this->EOF) { + $this->_currentRow++; + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @ads_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @ads_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + } + $this->fields = false; + $this->EOF = true; + return false; + } + + function _fetch() + { + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @ads_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @ads_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + $this->fields = false; + return false; + } + + function _close() + { + return @ads_free_result($this->_queryID); + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-borland_ibase.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-borland_ibase.inc.php new file mode 100644 index 000000000..349ed9af6 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-borland_ibase.inc.php @@ -0,0 +1,92 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Support Borland Interbase 6.5 and later + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php"); + +class ADODB_borland_ibase extends ADODB_ibase { + var $databaseType = "borland_ibase"; + + + function ADODB_borland_ibase() + { + $this->ADODB_ibase(); + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + $this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID); + return $this->_transactionID; + } + + function ServerInfo() + { + $arr['dialect'] = $this->dialect; + switch($arr['dialect']) { + case '': + case '1': $s = 'Interbase 6.5, Dialect 1'; break; + case '2': $s = 'Interbase 6.5, Dialect 2'; break; + default: + case '3': $s = 'Interbase 6.5, Dialect 3'; break; + } + $arr['version'] = '6.5'; + $arr['description'] = $s; + return $arr; + } + + // Note that Interbase 6.5 uses ROWS instead - don't you love forking wars! + // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows + // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 + // Firebird uses + // SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + if ($nrows > 0) { + if ($offset <= 0) $str = " ROWS $nrows "; + else { + $a = $offset+1; + $b = $offset+$nrows; + $str = " ROWS $a TO $b"; + } + } else { + // ok, skip + $a = $offset + 1; + $str = " ROWS $a TO 999999999"; // 999 million + } + $sql .= $str; + + return ($secs2cache) ? + $this->CacheExecute($secs2cache,$sql,$inputarr) + : + $this->Execute($sql,$inputarr); + } + +}; + + +class ADORecordSet_borland_ibase extends ADORecordSet_ibase { + + var $databaseType = "borland_ibase"; + + function ADORecordSet_borland_ibase($id,$mode=false) + { + $this->ADORecordSet_ibase($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-csv.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-csv.inc.php new file mode 100644 index 000000000..24f086646 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-csv.inc.php @@ -0,0 +1,207 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4. + + Currently unsupported: MetaDatabases, MetaTables and MetaColumns, and also inputarr in Execute. + Native types have been converted to MetaTypes. + Transactions not supported yet. + + Limitation of url length. For IIS, see MaxClientRequestBuffer registry value. + + http://support.microsoft.com/default.aspx?scid=kb;en-us;260694 +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (! defined("_ADODB_CSV_LAYER")) { + define("_ADODB_CSV_LAYER", 1 ); + +include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); + +class ADODB_csv extends ADOConnection { + var $databaseType = 'csv'; + var $databaseProvider = 'csv'; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $_affectedrows=0; + var $_insertid=0; + var $_url; + var $replaceQuote = "''"; // string to use to replace quotes + var $hasTransactions = false; + var $_errorNo = false; + + function ADODB_csv() + { + } + + function _insertid() + { + return $this->_insertid; + } + + function _affectedrows() + { + return $this->_affectedrows; + } + + function MetaDatabases() + { + return false; + } + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; + $this->_url = $argHostname; + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; + $this->_url = $argHostname; + return true; + } + + function MetaColumns($table, $normalize=true) + { + return false; + } + + + // parameters use PostgreSQL convention, not MySQL + function SelectLimit($sql,$nrows=-1,$offset=-1) + { + global $ADODB_FETCH_MODE; + + $url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=". + (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE). + "&offset=$offset"; + $err = false; + $rs = csv2rs($url,$err,false); + + if ($this->debug) print "$url<br><i>$err</i><br>"; + + $at = strpos($err,'::::'); + if ($at === false) { + $this->_errorMsg = $err; + $this->_errorNo = (integer)$err; + } else { + $this->_errorMsg = substr($err,$at+4,1024); + $this->_errorNo = -9999; + } + if ($this->_errorNo) + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,''); + } + + if (is_object($rs)) { + + $rs->databaseType='csv'; + $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; + $rs->connection = $this; + } + return $rs; + } + + // returns queryID or false + function _Execute($sql,$inputarr=false) + { + global $ADODB_FETCH_MODE; + + if (!$this->_bindInputArray && $inputarr) { + $sqlarr = explode('?',$sql); + $sql = ''; + $i = 0; + foreach($inputarr as $v) { + + $sql .= $sqlarr[$i]; + if (gettype($v) == 'string') + $sql .= $this->qstr($v); + else if ($v === null) + $sql .= 'NULL'; + else + $sql .= $v; + $i += 1; + + } + $sql .= $sqlarr[$i]; + if ($i+1 != sizeof($sqlarr)) + print "Input Array does not match ?: ".htmlspecialchars($sql); + $inputarr = false; + } + + $url = $this->_url.'?sql='.urlencode($sql)."&fetch=". + (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE); + $err = false; + + + $rs = csv2rs($url,$err,false); + if ($this->debug) print urldecode($url)."<br><i>$err</i><br>"; + $at = strpos($err,'::::'); + if ($at === false) { + $this->_errorMsg = $err; + $this->_errorNo = (integer)$err; + } else { + $this->_errorMsg = substr($err,$at+4,1024); + $this->_errorNo = -9999; + } + + if ($this->_errorNo) + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr); + } + if (is_object($rs)) { + $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; + + $this->_affectedrows = $rs->affectedrows; + $this->_insertid = $rs->insertid; + $rs->databaseType='csv'; + $rs->connection = $this; + } + return $rs; + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + return $this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + return $this->_errorNo; + } + + // returns true or false + function _close() + { + return true; + } +} // class + +class ADORecordset_csv extends ADORecordset { + function ADORecordset_csv($id,$mode=false) + { + $this->ADORecordset($id,$mode); + } + + function _close() + { + return true; + } +} + +} // define + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-db2.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-db2.inc.php new file mode 100644 index 000000000..c4ea39608 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-db2.inc.php @@ -0,0 +1,828 @@ +<?php +/* + V5.06 16 Oct 2008 (c) 2006 John Lim (jlim#natsoft.com). All rights reserved. + + This is a version of the ADODB driver for DB2. It uses the 'ibm_db2' PECL extension + for PHP (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2 or + higher. + + Originally tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2. + More recently tested with PHP 5.1.2 and Apache 2.0.55 on Windows XP SP2. + + This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard#rogers.com". + I ripped out what I believed to be a lot of redundant or obsolete code, but there are + probably still some remnants of the ODBC support in this file; I'm relying on reviewers + of this code to point out any other things that can be removed. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + + define("_ADODB_DB2_LAYER", 2 ); + +/*-------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------*/ + + +class ADODB_db2 extends ADOConnection { + var $databaseType = "db2"; + var $fmtDate = "'Y-m-d'"; + var $concat_operator = '||'; + + var $sysTime = 'CURRENT TIME'; + var $sysDate = 'CURRENT DATE'; + var $sysTimeStamp = 'CURRENT TIMESTAMP'; + + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $dataProvider = "db2"; + var $hasAffectedRows = true; + + var $binmode = DB2_BINARY; + + var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive + // breaking backward-compat + var $_bindInputArray = false; + var $_genIDSQL = "VALUES NEXTVAL FOR %s"; + var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s NO MAXVALUE NO CYCLE"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $_autocommit = true; + var $_haserrorfunctions = true; + var $_lastAffectedRows = 0; + var $uCaseTables = true; // for meta* functions, uppercase table names + var $hasInsertID = true; + + function _insertid() + { + return ADOConnection::GetOne('VALUES IDENTITY_VAL_LOCAL()'); + } + + function ADODB_db2() + { + $this->_haserrorfunctions = ADODB_PHPVER >= 0x4050; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('db2_connect')) { + ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension which is not installed."); + return null; + } + // This needs to be set before the connect(). + // Replaces the odbc_binmode() call that was in Execute() + ini_set('ibm_db2.binmode', $this->binmode); + + if ($argDatabasename) { + $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword); + } else { + $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword); + } + if (isset($php_errormsg)) $php_errormsg = ''; + + // For db2_connect(), there is an optional 4th arg. If present, it must be + // an array of valid options. So far, we don't use them. + + $this->_errorMsg = @db2_conn_errormsg(); + + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('db2_connect')) return null; + + // This needs to be set before the connect(). + // Replaces the odbc_binmode() call that was in Execute() + ini_set('ibm_db2.binmode', $this->binmode); + + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + + if ($argDatabasename) { + $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword); + } else { + $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword); + } + if (isset($php_errormsg)) $php_errormsg = ''; + + $this->_errorMsg = @db2_conn_errormsg(); + if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID); + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // format and return date string in database timestamp format + function DBTimeStamp($ts) + { + if (empty($ts) && $ts !== 0) return 'null'; + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')"; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + // use right() and replace() ? + if (!$col) $col = $this->sysDate; + + /* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */ + if ($fmt== 'Y-m-d H:i:s') + return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')"; + + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= $this->concat_operator; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + if ($len==1) return "year($col)"; + $s .= "char(year($col))"; + break; + case 'M': + if ($len==1) return "monthname($col)"; + $s .= "substr(monthname($col),1,3)"; + break; + case 'm': + if ($len==1) return "month($col)"; + $s .= "right(digits(month($col)),2)"; + break; + case 'D': + case 'd': + if ($len==1) return "day($col)"; + $s .= "right(digits(day($col)),2)"; + break; + case 'H': + case 'h': + if ($len==1) return "hour($col)"; + if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; + else $s .= "''"; + break; + case 'i': + case 'I': + if ($len==1) return "minute($col)"; + if ($col != $this->sysDate) + $s .= "right(digits(minute($col)),2)"; + else $s .= "''"; + break; + case 'S': + case 's': + if ($len==1) return "second($col)"; + if ($col != $this->sysDate) + $s .= "right(digits(second($col)),2)"; + else $s .= "''"; + break; + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + } + } + return $s; + } + + + function ServerInfo() + { + + if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { + $dsn = strtoupper($this->host); + $first = true; + $found = false; + + if (!function_exists('db2_data_source')) return false; + + while(true) { + + $rez = @db2_data_source($this->_connectionID, + $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); + $first = false; + if (!is_array($rez)) break; + if (strtoupper($rez['server']) == $dsn) { + $found = true; + break; + } + } + if (!$found) return ADOConnection::ServerInfo(); + if (!isset($rez['version'])) $rez['version'] = ''; + return $rez; + } else { + return ADOConnection::ServerInfo(); + } + } + + + function CreateSequence($seqname='adodbseq',$start=1) + { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$start)); + if (!$ok) return false; + return true; + } + + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /* + This algorithm is not very efficient, but works even if table locking + is not available. + + Will return false if unable to generate an ID after $MAXLOOPS attempts. + */ + function GenID($seq='adodbseq',$start=1) + { + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $num = $this->GetOne("VALUES NEXTVAL FOR $seq"); + return $num; + } + + + function ErrorMsg() + { + if ($this->_haserrorfunctions) { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @db2_conn_errormsg(); + return @db2_conn_errormsg($this->_connectionID); + } else return ADOConnection::ErrorMsg(); + } + + function ErrorNo() + { + + if ($this->_haserrorfunctions) { + if ($this->_errorCode !== false) { + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; + } + + if (empty($this->_connectionID)) $e = @db2_conn_error(); + else $e = @db2_conn_error($this->_connectionID); + + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + // so we check and patch + if (strlen($e)<=2) return 0; + return $e; + } else return ADOConnection::ErrorNo(); + } + + + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + return db2_autocommit($this->_connectionID,false); + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = db2_commit($this->_connectionID); + db2_autocommit($this->_connectionID,true); + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = db2_rollback($this->_connectionID); + db2_autocommit($this->_connectionID,true); + return $ret; + } + + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = @db2_primarykeys($this->_connectionID,'',$schema,$table); + + if (!$qid) { + $ADODB_FETCH_MODE = $savem; + return false; + } + $rs = new ADORecordSet_db2($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return false; + + $arr = $rs->GetArray(); + $rs->Close(); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3]) $arr2[] = $arr[$i][3]; + } + return $arr2; + } + + function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE ) + { + global $ADODB_FETCH_MODE; + + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table); + if (!$qid) { + $ADODB_FETCH_MODE = $savem; + return false; + } + $rs = new ADORecordSet_db2($qid); + + $ADODB_FETCH_MODE = $savem; + /* + $rs->fields indices + 0 PKTABLE_CAT + 1 PKTABLE_SCHEM + 2 PKTABLE_NAME + 3 PKCOLUMN_NAME + 4 FKTABLE_CAT + 5 FKTABLE_SCHEM + 6 FKTABLE_NAME + 7 FKCOLUMN_NAME + */ + if (!$rs) return false; + + $foreign_keys = array(); + while (!$rs->EOF) { + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]])) + $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array(); + $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3]; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $foreign_key; + } + + + function MetaTables($ttype=false,$schema=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = db2_tables($this->_connectionID); + + $rs = new ADORecordSet_db2($qid); + + $ADODB_FETCH_MODE = $savem; + if (!$rs) { + $false = false; + return $false; + } + + $arr = $rs->GetArray(); + + $rs->Close(); + $arr2 = array(); + + if ($ttype) { + $isview = strncmp($ttype,'V',1) === 0; + } + for ($i=0; $i < sizeof($arr); $i++) { + if (!$arr[$i][2]) continue; + $type = $arr[$i][3]; + $schemaval = ($schema) ? $arr[$i][1].'.' : ''; + if ($ttype) { + if ($isview) { + if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2]; + } + return $arr2; + } + +/* +See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp +/ SQL data type codes / +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (DB2VER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + + +/ One-parameter shortcuts for date/time data types / +#if (DB2VER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 + +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +*/ + function DB2Types($t) + { + switch ((integer)$t) { + case 1: + case 12: + case 0: + case -95: + case -96: + return 'C'; + case -97: + case -1: //text + return 'X'; + case -4: //image + return 'B'; + + case 9: + case 91: + return 'D'; + + case 10: + case 11: + case 92: + case 93: + return 'T'; + + case 4: + case 5: + case -6: + return 'I'; + + case -11: // uniqidentifier + return 'R'; + case -7: //bit + return 'L'; + + default: + return 'N'; + } + } + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $colname = "%"; + $qid = db2_columns($this->_connectionID, "", $schema, $table, $colname); + if (empty($qid)) return $false; + + $rs = new ADORecordSet_db2($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $false; + $rs->_fetch(); + + $retarr = array(); + + /* + $rs->fields indices + 0 TABLE_QUALIFIER + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 DATA_TYPE + 5 TYPE_NAME + 6 PRECISION + 7 LENGTH + 8 SCALE + 9 RADIX + 10 NULLABLE + 11 REMARKS + */ + while (!$rs->EOF) { + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $this->DB2Types($rs->fields[4]); + + // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp + // access uses precision to store length for char/varchar + if ($fld->type == 'C' or $fld->type == 'X') { + if ($rs->fields[4] <= -95) // UNICODE + $fld->max_length = $rs->fields[7]/2; + else + $fld->max_length = $rs->fields[7]; + } else + $fld->max_length = $rs->fields[7]; + $fld->not_null = !empty($rs->fields[10]); + $fld->scale = $rs->fields[8]; + $fld->primary_key = false; + $retarr[strtoupper($fld->name)] = $fld; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) $retarr = false; + + $qid = db2_primary_keys($this->_connectionID, "", $schema, $table); + if (empty($qid)) return $false; + + $rs = new ADORecordSet_db2($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $retarr; + $rs->_fetch(); + + /* + $rs->fields indices + 0 TABLE_CAT + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 KEY_SEQ + 5 PK_NAME + */ + while (!$rs->EOF) { + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $retarr[strtoupper($rs->fields[3])]->primary_key = true; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); + + if (empty($retarr)) $retarr = false; + return $retarr; + } + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + $stmt = db2_prepare($this->_connectionID,$sql); + if (!$stmt) { + // we don't know whether db2 driver is parsing prepared stmts, so just return sql + return $sql; + } + return array($sql,$stmt,false); + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + GLOBAL $php_errormsg; + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_error = ''; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = db2_prepare($this->_connectionID,$sql); + + if ($stmtid == false) { + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + } + + if (! db2_execute($stmtid,$inputarr)) { + if ($this->_haserrorfunctions) { + $this->_errorMsg = db2_stmt_errormsg(); + $this->_errorCode = db2_stmt_error(); + } + return false; + } + + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!db2_execute($stmtid)) { + if ($this->_haserrorfunctions) { + $this->_errorMsg = db2_stmt_errormsg(); + $this->_errorCode = db2_stmt_error(); + } + return false; + } + } else + $stmtid = @db2_exec($this->_connectionID,$sql); + + $this->_lastAffectedRows = 0; + if ($stmtid) { + if (@db2_num_fields($stmtid) == 0) { + $this->_lastAffectedRows = db2_num_rows($stmtid); + $stmtid = true; + } else { + $this->_lastAffectedRows = 0; + } + + if ($this->_haserrorfunctions) { + $this->_errorMsg = ''; + $this->_errorCode = 0; + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } else { + if ($this->_haserrorfunctions) { + $this->_errorMsg = db2_stmt_errormsg(); + $this->_errorCode = db2_stmt_error(); + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + + } + return $stmtid; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + // returns true or false + function _close() + { + $ret = @db2_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } + + function _affectedrows() + { + return $this->_lastAffectedRows; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_db2 extends ADORecordSet { + + var $bind = false; + var $databaseType = "db2"; + var $dataProvider = "db2"; + var $useFetchArray; + + function ADORecordSet_db2($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + } + + + // returns the field object + function FetchField($offset = -1) + { + $o= new ADOFieldObject(); + $o->name = @db2_field_name($this->_queryID,$offset); + $o->type = @db2_field_type($this->_queryID,$offset); + $o->max_length = db2_field_width($this->_queryID,$offset); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1; + $this->_numOfFields = @db2_num_fields($this->_queryID); + // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 + if ($this->_numOfRows == 0) $this->_numOfRows = -1; + } + + function _seek($row) + { + return false; + } + + // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $rs = $this->GetArray($nrows); + return $rs; + } + $savem = $this->fetchMode; + $this->fetchMode = ADODB_FETCH_NUM; + $this->Move($offset); + $this->fetchMode = $savem; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + function MoveNext() + { + if ($this->_numOfRows != 0 && !$this->EOF) { + $this->_currentRow++; + + $this->fields = @db2_fetch_array($this->_queryID); + if ($this->fields) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + } + $this->fields = false; + $this->EOF = true; + return false; + } + + function _fetch() + { + + $this->fields = db2_fetch_array($this->_queryID); + if ($this->fields) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + $this->fields = false; + return false; + } + + function _close() + { + return @db2_free_result($this->_queryID); + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-fbsql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-fbsql.inc.php new file mode 100644 index 000000000..13bbd86c4 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-fbsql.inc.php @@ -0,0 +1,266 @@ +<?php +/* + @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Contribution by Frank M. Kromann <frank@frontbase.com>. + Set tabs to 8. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (! defined("_ADODB_FBSQL_LAYER")) { + define("_ADODB_FBSQL_LAYER", 1 ); + +class ADODB_fbsql extends ADOConnection { + var $databaseType = 'fbsql'; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $metaTablesSQL = "SHOW TABLES"; + var $metaColumnsSQL = "SHOW COLUMNS FROM %s"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasLimit = false; + + function ADODB_fbsql() + { + } + + function _insertid() + { + return fbsql_insert_id($this->_connectionID); + } + + function _affectedrows() + { + return fbsql_affected_rows($this->_connectionID); + } + + function MetaDatabases() + { + $qid = fbsql_list_dbs($this->_connectionID); + $arr = array(); + $i = 0; + $max = fbsql_num_rows($qid); + while ($i < $max) { + $arr[] = fbsql_tablename($qid,$i); + $i += 1; + } + return $arr; + } + + // returns concatenated string + function Concat() + { + $s = ""; + $arr = func_get_args(); + $first = true; + + $s = implode(',',$arr); + if (sizeof($arr) > 0) return "CONCAT($s)"; + else return ''; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + function MetaColumns($table, $normalize=true) + { + if ($this->metaColumnsSQL) { + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + + if ($rs === false) return false; + + $retarr = array(); + while (!$rs->EOF){ + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + + // split type into type(length): + if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = $query_array[2]; + } else { + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($fld->type,'blob') !== false); + + $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return false; + } + + // returns true or false + function SelectDB($dbName) + { + $this->database = $dbName; + if ($this->_connectionID) { + return @fbsql_select_db($dbName,$this->_connectionID); + } + else return false; + } + + + // returns queryID or false + function _query($sql,$inputarr=false) + { + return fbsql_query("$sql;",$this->_connectionID); + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + $this->_errorMsg = @fbsql_error($this->_connectionID); + return $this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + return @fbsql_errno($this->_connectionID); + } + + // returns true or false + function _close() + { + return @fbsql_close($this->_connectionID); + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_fbsql extends ADORecordSet{ + + var $databaseType = "fbsql"; + var $canSeek = true; + + function ADORecordSet_fbsql($queryID,$mode=false) + { + if (!$mode) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) { + case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break; + case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break; + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = FBSQL_BOTH; break; + } + return $this->ADORecordSet($queryID); + } + + function _initrs() + { + GLOBAL $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1; + $this->_numOfFields = @fbsql_num_fields($this->_queryID); + } + + + + function FetchField($fieldOffset = -1) { + if ($fieldOffset != -1) { + $o = @fbsql_fetch_field($this->_queryID, $fieldOffset); + //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable + $f = @fbsql_field_flags($this->_queryID,$fieldOffset); + $o->binary = (strpos($f,'binary')!== false); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable + //$o->max_length = -1; + } + + return $o; + } + + function _seek($row) + { + return @fbsql_data_seek($this->_queryID,$row); + } + + function _fetch($ignore_fields=false) + { + $this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode); + return ($this->fields == true); + } + + function _close() { + return @fbsql_free_result($this->_queryID); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + $len = -1; // fbsql max_length is not accurate + switch (strtoupper($t)) { + case 'CHARACTER': + case 'CHARACTER VARYING': + case 'BLOB': + case 'CLOB': + case 'BIT': + case 'BIT VARYING': + if ($len <= $this->blobSize) return 'C'; + + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + return !empty($fieldobj->binary) ? 'B' : 'X'; + + case 'DATE': return 'D'; + + case 'TIME': + case 'TIME WITH TIME ZONE': + case 'TIMESTAMP': + case 'TIMESTAMP WITH TIME ZONE': return 'T'; + + case 'PRIMARY_KEY': + return 'R'; + case 'INTEGER': + case 'SMALLINT': + case 'BOOLEAN': + + if (!empty($fieldobj->primary_key)) return 'R'; + else return 'I'; + + default: return 'N'; + } + } + +} //class +} // defined +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-firebird.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-firebird.inc.php new file mode 100644 index 000000000..b551aa67a --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-firebird.inc.php @@ -0,0 +1,77 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php"); + +class ADODB_firebird extends ADODB_ibase { + var $databaseType = "firebird"; + var $dialect = 3; + + var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)"; + + function ADODB_firebird() + { + $this->ADODB_ibase(); + } + + function ServerInfo() + { + $arr['dialect'] = $this->dialect; + switch($arr['dialect']) { + case '': + case '1': $s = 'Firebird Dialect 1'; break; + case '2': $s = 'Firebird Dialect 2'; break; + default: + case '3': $s = 'Firebird Dialect 3'; break; + } + $arr['version'] = ADOConnection::_findvers($s); + $arr['description'] = $s; + return $arr; + } + + // Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars! + // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows + // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0) + { + $nrows = (integer) $nrows; + $offset = (integer) $offset; + $str = 'SELECT '; + if ($nrows >= 0) $str .= "FIRST $nrows "; + $str .=($offset>=0) ? "SKIP $offset " : ''; + + $sql = preg_replace('/^[ \t]*select/i',$str,$sql); + if ($secs) + $rs = $this->CacheExecute($secs,$sql,$inputarr); + else + $rs = $this->Execute($sql,$inputarr); + + return $rs; + } + + +}; + + +class ADORecordSet_firebird extends ADORecordSet_ibase { + + var $databaseType = "firebird"; + + function ADORecordSet_firebird($id,$mode=false) + { + $this->ADORecordSet_ibase($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ibase.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ibase.inc.php new file mode 100644 index 000000000..0997cb438 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ibase.inc.php @@ -0,0 +1,887 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Latest version is available at http://adodb.sourceforge.net + + Interbase data driver. Requires interbase client. Works on Windows and Unix. + + 3 Jan 2002 -- suggestions by Hans-Peter Oeri <kampfcaspar75@oeri.ch> + changed transaction handling and added experimental blob stuff + + Docs to interbase at the website + http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html + + To use gen_id(), see + http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen + + $rs = $conn->Execute('select gen_id(adodb,1) from rdb$database'); + $id = $rs->fields[0]; + $conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)"); +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB_ibase extends ADOConnection { + var $databaseType = "ibase"; + var $dataProvider = "ibase"; + var $replaceQuote = "''"; // string to use to replace quotes + var $ibase_datefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S'; + var $fmtDate = "'Y-m-d'"; + var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S"; + var $ibase_timefmt = "%H:%M:%S"; + var $fmtTimeStamp = "'Y-m-d, H:i:s'"; + var $concat_operator='||'; + var $_transactionID; + var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'"; + //OPN STUFF start + var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc"; + //OPN STUFF end + var $ibasetrans; + var $hasGenID = true; + var $_bindInputArray = true; + var $buffers = 0; + var $dialect = 1; + var $sysDate = "cast('TODAY' as timestamp)"; + var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)"; + var $ansiOuter = true; + var $hasAffectedRows = false; + var $poorAffectedRows = true; + var $blobEncodeType = 'C'; + var $role = false; + + function ADODB_ibase() + { + if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT; + } + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false) + { + if (!function_exists('ibase_pconnect')) return null; + if ($argDatabasename) $argHostname .= ':'.$argDatabasename; + $fn = ($persist) ? 'ibase_pconnect':'ibase_connect'; + if ($this->role) + $this->_connectionID = $fn($argHostname,$argUsername,$argPassword, + $this->charSet,$this->buffers,$this->dialect,$this->role); + else + $this->_connectionID = $fn($argHostname,$argUsername,$argPassword, + $this->charSet,$this->buffers,$this->dialect); + + if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html + $this->replaceQuote = "''"; + } + if ($this->_connectionID === false) { + $this->_handleerror(); + return false; + } + + // PHP5 change. + if (function_exists('ibase_timefmt')) { + ibase_timefmt($this->ibase_datefmt,IBASE_DATE ); + if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP ); + else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP ); + ibase_timefmt($this->ibase_timefmt,IBASE_TIME ); + + } else { + ini_set("ibase.timestampformat", $this->ibase_timestampfmt); + ini_set("ibase.dateformat", $this->ibase_datefmt); + ini_set("ibase.timeformat", $this->ibase_timefmt); + } + return true; + } + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true); + } + + + function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false) + { + if ($internalKey) return array('RDB$DB_KEY'); + + $table = strtoupper($table); + + $sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME + FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME + WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\' + ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION'; + + $a = $this->GetCol($sql,false,true); + if ($a && sizeof($a)>0) return $a; + return false; + } + + function ServerInfo() + { + $arr['dialect'] = $this->dialect; + switch($arr['dialect']) { + case '': + case '1': $s = 'Interbase 5.5 or earlier'; break; + case '2': $s = 'Interbase 5.6'; break; + default: + case '3': $s = 'Interbase 6.0'; break; + } + $arr['version'] = ADOConnection::_findvers($s); + $arr['description'] = $s; + return $arr; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + $this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID); + return $this->_transactionID; + } + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ret = false; + $this->autoCommit = true; + if ($this->_transactionID) { + //print ' commit '; + $ret = ibase_commit($this->_transactionID); + } + $this->_transactionID = false; + return $ret; + } + + // there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently. + // it appears that ibase extension cannot support multiple concurrent queryid's + function _Execute($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + if ($this->_logsql) { + $savecrecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = true; // force countrecs + $ret = ADOConnection::_Execute($sql,$inputarr); + $ADODB_COUNTRECS = $savecrecs; + } else { + $ret = ADOConnection::_Execute($sql,$inputarr); + } + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ret = false; + $this->autoCommit = true; + if ($this->_transactionID) + $ret = ibase_rollback($this->_transactionID); + $this->_transactionID = false; + + return $ret; + } + + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $table = strtoupper($table); + $sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'"; + if (!$primary) { + $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'"; + } else { + $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'"; + } + // get index details + $rs = $this->Execute($sql); + if (!is_object($rs)) { + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + return $false; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + $index = $row[0]; + if (!isset($indexes[$index])) { + if (is_null($row[3])) {$row[3] = 0;} + $indexes[$index] = array( + 'unique' => ($row[3] == 1), + 'columns' => array() + ); + } + $sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC"; + $rs1 = $this->Execute($sql); + while ($row1 = $rs1->FetchRow()) { + $indexes[$index]['columns'][$row1[2]] = $row1[1]; + } + } + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + return $indexes; + } + + + // See http://community.borland.com/article/0,1410,25844,00.html + function RowLock($tables,$where,$col) + { + if ($this->autoCommit) $this->BeginTrans(); + $this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim? + return 1; + } + + + function CreateSequence($seqname,$startID=1) + { + $ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); + if (!$ok) return false; + return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); + } + + function DropSequence($seqname) + { + $seqname = strtoupper($seqname); + $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'"); + } + + function GenID($seqname='adodbseq',$startID=1) + { + $getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE"); + $rs = @$this->Execute($getnext); + if (!$rs) { + $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); + $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); + $rs = $this->Execute($getnext); + } + if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields); + else $this->genID = 0; // false + + if ($rs) $rs->Close(); + + return $this->genID; + } + + function SelectDB($dbName) + { + return false; + } + + function _handleerror() + { + $this->_errorMsg = ibase_errmsg(); + } + + function ErrorNo() + { + if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1]; + else return 0; + } + + function ErrorMsg() + { + return $this->_errorMsg; + } + + function Prepare($sql) + { + $stmt = ibase_prepare($this->_connectionID,$sql); + if (!$stmt) return false; + return array($sql,$stmt); + } + + // returns query ID if successful, otherwise false + // there have been reports of problems with nested queries - the code is probably not re-entrant? + function _query($sql,$iarr=false) + { + + if (!$this->autoCommit && $this->_transactionID) { + $conn = $this->_transactionID; + $docommit = false; + } else { + $conn = $this->_connectionID; + $docommit = true; + } + if (is_array($sql)) { + $fn = 'ibase_execute'; + $sql = $sql[1]; + if (is_array($iarr)) { + if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 + if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack + $fnarr = array_merge( array($sql) , $iarr); + $ret = call_user_func_array($fn,$fnarr); + } else { + switch(sizeof($iarr)) { + case 1: $ret = $fn($sql,$iarr[0]); break; + case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break; + case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break; + case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; + case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; + case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; + case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; + default: ADOConnection::outp( "Too many parameters to ibase query $sql"); + case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; + } + } + } else $ret = $fn($sql); + } else { + $fn = 'ibase_query'; + + if (is_array($iarr)) { + if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 + if (sizeof($iarr) == 0) $iarr[0] = ''; // PHP5 compat hack + $fnarr = array_merge( array($conn,$sql) , $iarr); + $ret = call_user_func_array($fn,$fnarr); + } else { + switch(sizeof($iarr)) { + case 1: $ret = $fn($conn,$sql,$iarr[0]); break; + case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break; + case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break; + case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; + case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; + case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; + case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; + default: ADOConnection::outp( "Too many parameters to ibase query $sql"); + case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; + } + } + } else $ret = $fn($conn,$sql); + } + if ($docommit && $ret === true) ibase_commit($this->_connectionID); + + $this->_handleerror(); + return $ret; + } + + // returns true or false + function _close() + { + if (!$this->autoCommit) @ibase_rollback($this->_connectionID); + return @ibase_close($this->_connectionID); + } + + //OPN STUFF start + function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3) + { + $fscale = abs($fscale); + $fld->max_length = $flen; + $fld->scale = null; + switch($ftype){ + case 7: + case 8: + if ($dialect3) { + switch($fsubtype){ + case 0: + $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); + break; + case 1: + $fld->type = 'numeric'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + case 2: + $fld->type = 'decimal'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + } // switch + } else { + if ($fscale !=0) { + $fld->type = 'decimal'; + $fld->scale = $fscale; + $fld->max_length = ($ftype == 7 ? 4 : 9); + } else { + $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); + } + } + break; + case 16: + if ($dialect3) { + switch($fsubtype){ + case 0: + $fld->type = 'decimal'; + $fld->max_length = 18; + $fld->scale = 0; + break; + case 1: + $fld->type = 'numeric'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + case 2: + $fld->type = 'decimal'; + $fld->max_length = $fprecision; + $fld->scale = $fscale; + break; + } // switch + } + break; + case 10: + $fld->type = 'float'; + break; + case 14: + $fld->type = 'char'; + break; + case 27: + if ($fscale !=0) { + $fld->type = 'decimal'; + $fld->max_length = 15; + $fld->scale = 5; + } else { + $fld->type = 'double'; + } + break; + case 35: + if ($dialect3) { + $fld->type = 'timestamp'; + } else { + $fld->type = 'date'; + } + break; + case 12: + $fld->type = 'date'; + break; + case 13: + $fld->type = 'time'; + break; + case 37: + $fld->type = 'varchar'; + break; + case 40: + $fld->type = 'cstring'; + break; + case 261: + $fld->type = 'blob'; + $fld->max_length = -1; + break; + } // switch + } + //OPN STUFF end + // returns array of ADOFieldObjects for current table + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + + $ADODB_FETCH_MODE = $save; + $false = false; + if ($rs === false) { + return $false; + } + + $retarr = array(); + //OPN STUFF start + $dialect3 = ($this->dialect==3 ? true : false); + //OPN STUFF end + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = trim($rs->fields[0]); + //OPN STUFF start + $this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3); + if (isset($rs->fields[1]) && $rs->fields[1]) { + $fld->not_null = true; + } + if (isset($rs->fields[2])) { + + $fld->has_default = true; + $d = substr($rs->fields[2],strlen('default ')); + switch ($fld->type) + { + case 'smallint': + case 'integer': $fld->default_value = (int) $d; break; + case 'char': + case 'blob': + case 'text': + case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break; + case 'double': + case 'float': $fld->default_value = (float) $d; break; + default: $fld->default_value = $d; break; + } + // case 35:$tt = 'TIMESTAMP'; break; + } + if ((isset($rs->fields[5])) && ($fld->type == 'blob')) { + $fld->sub_type = $rs->fields[5]; + } else { + $fld->sub_type = null; + } + //OPN STUFF end + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + if ( empty($retarr)) return $false; + else return $retarr; + } + + function BlobEncode( $blob ) + { + $blobid = ibase_blob_create( $this->_connectionID); + ibase_blob_add( $blobid, $blob ); + return ibase_blob_close( $blobid ); + } + + // since we auto-decode all blob's since 2.42, + // BlobDecode should not do any transforms + function BlobDecode($blob) + { + return $blob; + } + + + + + // old blobdecode function + // still used to auto-decode all blob's + function _BlobDecode_old( $blob ) + { + $blobid = ibase_blob_open($this->_connectionID, $blob ); + $realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet <kevinboillet@yahoo.fr> + while($string = ibase_blob_get($blobid, 8192)){ + $realblob .= $string; + } + ibase_blob_close( $blobid ); + + return( $realblob ); + } + + function _BlobDecode( $blob ) + { + if (ADODB_PHPVER >= 0x5000) { + $blob_data = ibase_blob_info($this->_connectionID, $blob ); + $blobid = ibase_blob_open($this->_connectionID, $blob ); + } else { + + $blob_data = ibase_blob_info( $blob ); + $blobid = ibase_blob_open( $blob ); + } + + if( $blob_data[0] > $this->maxblobsize ) { + + $realblob = ibase_blob_get($blobid, $this->maxblobsize); + + while($string = ibase_blob_get($blobid, 8192)){ + $realblob .= $string; + } + } else { + $realblob = ibase_blob_get($blobid, $blob_data[0]); + } + + ibase_blob_close( $blobid ); + return( $realblob ); + } + + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + $fd = fopen($path,'rb'); + if ($fd === false) return false; + $blob_id = ibase_blob_create($this->_connectionID); + + /* fill with data */ + + while ($val = fread($fd,32768)){ + ibase_blob_add($blob_id, $val); + } + + /* close and get $blob_id_str for inserting into table */ + $blob_id_str = ibase_blob_close($blob_id); + + fclose($fd); + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + $blob_id = ibase_blob_create($this->_connectionID); + + // ibase_blob_add($blob_id, $val); + + // replacement that solves the problem by which only the first modulus 64K / + // of $val are stored at the blob field //////////////////////////////////// + // Thx Abel Berenstein aberenstein#afip.gov.ar + $len = strlen($val); + $chunk_size = 32768; + $tail_size = $len % $chunk_size; + $n_chunks = ($len - $tail_size) / $chunk_size; + + for ($n = 0; $n < $n_chunks; $n++) { + $start = $n * $chunk_size; + $data = substr($val, $start, $chunk_size); + ibase_blob_add($blob_id, $data); + } + + if ($tail_size) { + $start = $n_chunks * $chunk_size; + $data = substr($val, $start, $tail_size); + ibase_blob_add($blob_id, $data); + } + // end replacement ///////////////////////////////////////////////////////// + + $blob_id_str = ibase_blob_close($blob_id); + + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; + + } + + + function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + $blob_id = ibase_blob_create($this->_connectionID); + ibase_blob_add($blob_id, $val); + $blob_id_str = ibase_blob_close($blob_id); + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; + } + + // Format date column in sql string given an input format that understands Y M D + // Only since Interbase 6.0 - uses EXTRACT + // problem - does not zero-fill the day and month yet + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysDate; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '||'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "extract(year from $col)"; + break; + case 'M': + case 'm': + $s .= "extract(month from $col)"; + break; + case 'Q': + case 'q': + $s .= "cast(((extract(month from $col)+2) / 3) as integer)"; + break; + case 'D': + case 'd': + $s .= "(extract(day from $col))"; + break; + case 'H': + case 'h': + $s .= "(extract(hour from $col))"; + break; + case 'I': + case 'i': + $s .= "(extract(minute from $col))"; + break; + case 'S': + case 's': + $s .= "CAST((extract(second from $col)) AS INTEGER)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_ibase extends ADORecordSet +{ + + var $databaseType = "ibase"; + var $bind=false; + var $_cacheType; + + function ADORecordset_ibase($id,$mode=false) + { + global $ADODB_FETCH_MODE; + + $this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode; + $this->ADORecordSet($id); + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $ibf = ibase_field_info($this->_queryID,$fieldOffset); + switch (ADODB_ASSOC_CASE) { + case 2: // the default + $fld->name = ($ibf['alias']); + if (empty($fld->name)) $fld->name = ($ibf['name']); + break; + case 0: + $fld->name = strtoupper($ibf['alias']); + if (empty($fld->name)) $fld->name = strtoupper($ibf['name']); + break; + case 1: + $fld->name = strtolower($ibf['alias']); + if (empty($fld->name)) $fld->name = strtolower($ibf['name']); + break; + } + + $fld->type = $ibf['type']; + $fld->max_length = $ibf['length']; + + /* This needs to be populated from the metadata */ + $fld->not_null = false; + $fld->has_default = false; + $fld->default_value = 'null'; + return $fld; + } + + function _initrs() + { + $this->_numOfRows = -1; + $this->_numOfFields = @ibase_num_fields($this->_queryID); + + // cache types for blob decode check + for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { + $f1 = $this->FetchField($i); + $this->_cacheType[] = $f1->type; + } + } + + function _seek($row) + { + return false; + } + + function _fetch() + { + $f = @ibase_fetch_row($this->_queryID); + if ($f === false) { + $this->fields = false; + return false; + } + // OPN stuff start - optimized + // fix missing nulls and decode blobs automatically + + global $ADODB_ANSI_PADDING_OFF; + //$ADODB_ANSI_PADDING_OFF=1; + $rtrim = !empty($ADODB_ANSI_PADDING_OFF); + + for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { + if ($this->_cacheType[$i]=="BLOB") { + if (isset($f[$i])) { + $f[$i] = $this->connection->_BlobDecode($f[$i]); + } else { + $f[$i] = null; + } + } else { + if (!isset($f[$i])) { + $f[$i] = null; + } else if ($rtrim && is_string($f[$i])) { + $f[$i] = rtrim($f[$i]); + } + } + } + // OPN stuff end + + $this->fields = $f; + if ($this->fetchMode == ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } else if ($this->fetchMode == ADODB_FETCH_BOTH) { + $this->fields = array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE)); + } + return true; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + + } + + + function _close() + { + return @ibase_free_result($this->_queryID); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'CHAR': + return 'C'; + + case 'TEXT': + case 'VARCHAR': + case 'VARYING': + if ($len <= $this->blobSize) return 'C'; + return 'X'; + case 'BLOB': + return 'B'; + + case 'TIMESTAMP': + case 'DATE': return 'D'; + case 'TIME': return 'T'; + //case 'T': return 'T'; + + //case 'L': return 'L'; + case 'INT': + case 'SHORT': + case 'INTEGER': return 'I'; + default: return 'N'; + } + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-informix.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-informix.inc.php new file mode 100644 index 000000000..1b2643b2f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-informix.inc.php @@ -0,0 +1,40 @@ +<?php +/** +* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. +* Released under both BSD license and Lesser GPL library license. +* Whenever there is any discrepancy between the two licenses, +* the BSD license will take precedence. +* +* Set tabs to 4 for best viewing. +* +* Latest version is available at http://php.weblogs.com +* +* Informix 9 driver that supports SELECT FIRST +* +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR.'/drivers/adodb-informix72.inc.php'); + +class ADODB_informix extends ADODB_informix72 { + var $databaseType = "informix"; + var $hasTop = 'FIRST'; + var $ansiOuter = true; + + function IfNull( $field, $ifNull ) + { + return " NVL($field, $ifNull) "; // if Informix 9.X or 10.X + } +} + +class ADORecordset_informix extends ADORecordset_informix72 { + var $databaseType = "informix"; + + function ADORecordset_informix($id,$mode=false) + { + $this->ADORecordset_informix72($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-informix72.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-informix72.inc.php new file mode 100644 index 000000000..61ad344c9 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-informix72.inc.php @@ -0,0 +1,475 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim. All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Informix port by Mitchell T. Young (mitch@youngfamily.org) + + Further mods by "Samuel CARRIERE" <samuel_carriere@hotmail.com> + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1); + +class ADODB_informix72 extends ADOConnection { + var $databaseType = "informix72"; + var $dataProvider = "informix"; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $substr = 'substr'; + var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables + + + var $metaColumnsSQL = + "select c.colname, c.coltype, c.collength, d.default,c.colno + from syscolumns c, systables t,outer sysdefaults d + where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno + and tabname='%s' order by c.colno"; + + var $metaPrimaryKeySQL = + "select part1,part2,part3,part4,part5,part6,part7,part8 from + systables t,sysconstraints s,sysindexes i where t.tabname='%s' + and s.tabid=t.tabid and s.constrtype='P' + and i.idxname=s.idxname"; + + var $concat_operator = '||'; + + var $lastQuery = false; + var $has_insertid = true; + + var $_autocommit = true; + var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters. + var $sysDate = 'TODAY'; + var $sysTimeStamp = 'CURRENT'; + var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0 + + function ADODB_informix72() + { + // alternatively, use older method: + //putenv("DBDATE=Y4MD-"); + + // force ISO date format + putenv('GL_DATE=%Y-%m-%d'); + + if (function_exists('ifx_byteasvarchar')) { + ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. + ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. + ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file. + } + } + + function ServerInfo() + { + if (isset($this->version)) return $this->version; + + $arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1"); + $arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1"); + $this->version = $arr; + return $arr; + } + + + + function _insertid() + { + $sqlca =ifx_getsqlca($this->lastQuery); + return @$sqlca["sqlerrd1"]; + } + + function _affectedrows() + { + if ($this->lastQuery) { + return @ifx_affected_rows ($this->lastQuery); + } + return 0; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->Execute('BEGIN'); + $this->_autocommit = false; + return true; + } + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('COMMIT'); + $this->_autocommit = true; + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('ROLLBACK'); + $this->_autocommit = true; + return true; + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if ($this->_autocommit) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + /* Returns: the last error message from previous database operation + Note: This function is NOT available for Microsoft SQL Server. */ + + function ErrorMsg() + { + if (!empty($this->_logsql)) return $this->_errorMsg; + $this->_errorMsg = ifx_errormsg(); + return $this->_errorMsg; + } + + function ErrorNo() + { + preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse); + if (is_array($parse) && isset($parse[1])) return (int)$parse[1]; + return 0; + } + + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + if (!empty($this->metaColumnsSQL)) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs === false) return $false; + $rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items + + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; +/* //!eos. + $rs->fields[1] is not the correct adodb type + $rs->fields[2] is not correct max_length, because can include not-null bit + + $fld->type = $rs->fields[1]; + $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag + $fld->max_length = $rs->fields[2];*/ + $pr=ifx_props($rs->fields[1],$rs->fields[2]); //!eos + $fld->type = $pr[0] ;//!eos + $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); + $fld->max_length = $pr[1]; //!eos + $fld->precision = $pr[2] ;//!eos + $fld->not_null = $pr[3]=="N"; //!eos + + if (trim($rs->fields[3]) != "AAAAAA 0") { + $fld->has_default = 1; + $fld->default_value = $rs->fields[3]; + } else { + $fld->has_default = 0; + } + + $retarr[strtolower($fld->name)] = $fld; + $rs->MoveNext(); + } + + $rs->Close(); + $rspkey->Close(); //!eos + return $retarr; + } + + return $false; + } + + function xMetaColumns($table) + { + return ADOConnection::MetaColumns($table,false); + } + + function MetaForeignKeys($table, $owner=false, $upper=false) //!Eos + { + $sql = " + select tr.tabname,updrule,delrule, + i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4, + i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8 + from systables t,sysconstraints s,sysindexes i, + sysreferences r,systables tr,sysconstraints s2,sysindexes i2 + where t.tabname='$table' + and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid + and i.idxname=s.idxname and tr.tabid=r.ptabid + and s2.constrid=r.primary and i2.idxname=s2.idxname"; + + $rs = $this->Execute($sql); + if (!$rs || $rs->EOF) return false; + $arr = $rs->GetArray(); + $a = array(); + foreach($arr as $v) { + $coldest=$this->metaColumnNames($v["tabname"]); + $colorig=$this->metaColumnNames($table); + $colnames=array(); + for($i=1;$i<=8 && $v["o$i"] ;$i++) { + $colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1]; + } + if($upper) + $a[strtoupper($v["tabname"])] = $colnames; + else + $a[$v["tabname"]] = $colnames; + } + return $a; + } + + function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB') + { + $type = ($blobtype == 'TEXT') ? 1 : 0; + $blobid = ifx_create_blob($type,0,$val); + return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid)); + } + + function BlobDecode($blobid) + { + return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid); + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('ifx_connect')) return null; + + $dbs = $argDatabasename . "@" . $argHostname; + if ($argHostname) putenv("INFORMIXSERVER=$argHostname"); + putenv("INFORMIXSERVER=".trim($argHostname)); + $this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + #if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('ifx_connect')) return null; + + $dbs = $argDatabasename . "@" . $argHostname; + putenv("INFORMIXSERVER=".trim($argHostname)); + $this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + #if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } +/* + // ifx_do does not accept bind parameters - weird ??? + function Prepare($sql) + { + $stmt = ifx_prepare($sql); + if (!$stmt) return $sql; + else return array($sql,$stmt); + } +*/ + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + // String parameters have to be converted using ifx_create_char + if ($inputarr) { + foreach($inputarr as $v) { + if (gettype($v) == 'string') { + $tab[] = ifx_create_char($v); + } + else { + $tab[] = $v; + } + } + } + + // In case of select statement, we use a scroll cursor in order + // to be able to call "move", or "movefirst" statements + if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) { + if ($inputarr) { + $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab); + } + else { + $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType); + } + } + else { + if ($inputarr) { + $this->lastQuery = ifx_query($sql,$this->_connectionID, $tab); + } + else { + $this->lastQuery = ifx_query($sql,$this->_connectionID); + } + } + + // Following line have been commented because autocommit mode is + // not supported by informix SE 7.2 + + //if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID); + + return $this->lastQuery; + } + + // returns true or false + function _close() + { + $this->lastQuery = false; + return ifx_close($this->_connectionID); + } +} + + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_informix72 extends ADORecordSet { + + var $databaseType = "informix72"; + var $canSeek = true; + var $_fieldprops = false; + + function ADORecordset_informix72($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id); + } + + + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + function FetchField($fieldOffset = -1) + { + if (empty($this->_fieldprops)) { + $fp = ifx_fieldproperties($this->_queryID); + foreach($fp as $k => $v) { + $o = new ADOFieldObject; + $o->name = $k; + $arr = split(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE" + $o->type = $arr[0]; + $o->max_length = $arr[1]; + $this->_fieldprops[] = $o; + $o->not_null = $arr[4]=="N"; + } + } + $ret = $this->_fieldprops[$fieldOffset]; + return $ret; + } + + function _initrs() + { + $this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1; + $this->_numOfFields = ifx_num_fields($this->_queryID); + } + + function _seek($row) + { + return @ifx_fetch_row($this->_queryID, (int) $row); + } + + function MoveLast() + { + $this->fields = @ifx_fetch_row($this->_queryID, "LAST"); + if ($this->fields) $this->EOF = false; + $this->_currentRow = -1; + + if ($this->fetchMode == ADODB_FETCH_NUM) { + foreach($this->fields as $v) { + $arr[] = $v; + } + $this->fields = $arr; + } + + return true; + } + + function MoveFirst() + { + $this->fields = @ifx_fetch_row($this->_queryID, "FIRST"); + if ($this->fields) $this->EOF = false; + $this->_currentRow = 0; + + if ($this->fetchMode == ADODB_FETCH_NUM) { + foreach($this->fields as $v) { + $arr[] = $v; + } + $this->fields = $arr; + } + + return true; + } + + function _fetch($ignore_fields=false) + { + + $this->fields = @ifx_fetch_row($this->_queryID); + + if (!is_array($this->fields)) return false; + + if ($this->fetchMode == ADODB_FETCH_NUM) { + foreach($this->fields as $v) { + $arr[] = $v; + } + $this->fields = $arr; + } + return true; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + function _close() + { + return ifx_free_result($this->_queryID); + } + +} +/** !Eos +* Auxiliar function to Parse coltype,collength. Used by Metacolumns +* return: array ($mtype,$length,$precision,$nullable) (similar to ifx_fieldpropierties) +*/ +function ifx_props($coltype,$collength){ + $itype=fmod($coltype+1,256); + $nullable=floor(($coltype+1) /256) ?"N":"Y"; + $mtype=substr(" CIIFFNNDN TBXCC ",$itype,1); + switch ($itype){ + case 2: + $length=4; + case 6: + case 9: + case 14: + $length=floor($collength/256); + $precision=fmod($collength,256); + break; + default: + $precision=0; + $length=$collength; + } + return array($mtype,$length,$precision,$nullable); +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-ldap.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-ldap.inc.php new file mode 100644 index 000000000..0d5c8b8cd --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-ldap.inc.php @@ -0,0 +1,423 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + + Revision 1: (02/25/2005) Updated codebase to include the _inject_bind_options function. This allows + users to access the options in the ldap_set_option function appropriately. Most importantly + LDAP Version 3 is now supported. See the examples for more information. Also fixed some minor + bugs that surfaced when PHP error levels were set high. + + Joshua Eldridge (joshuae74#hotmail.com) +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('LDAP_ASSOC')) { + define('LDAP_ASSOC',ADODB_FETCH_ASSOC); + define('LDAP_NUM',ADODB_FETCH_NUM); + define('LDAP_BOTH',ADODB_FETCH_BOTH); +} + +class ADODB_ldap extends ADOConnection { + var $databaseType = 'ldap'; + var $dataProvider = 'ldap'; + + # Connection information + var $username = false; + var $password = false; + + # Used during searches + var $filter; + var $dn; + var $version; + var $port = 389; + + # Options configuration information + var $LDAP_CONNECT_OPTIONS; + + # error on binding, eg. "Binding: invalid credentials" + var $_bind_errmsg = "Binding: %s"; + + function ADODB_ldap() + { + } + + // returns true or false + + function _connect( $host, $username, $password, $ldapbase) + { + global $LDAP_CONNECT_OPTIONS; + + if ( !function_exists( 'ldap_connect' ) ) return null; + + if (strpos('ldap://',$host) === 0 || strpos('ldaps://',$host) === 0) { + $this->_connectionID = @ldap_connect($host); + } else { + $conn_info = array( $host,$this->port); + + if ( strstr( $host, ':' ) ) { + $conn_info = split( ':', $host ); + } + + $this->_connectionID = @ldap_connect( $conn_info[0], $conn_info[1] ); + } + if (!$this->_connectionID) { + $e = 'Could not connect to ' . $conn_info[0]; + $this->_errorMsg = $e; + if ($this->debug) ADOConnection::outp($e); + return false; + } + if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) { + $this->_inject_bind_options( $LDAP_CONNECT_OPTIONS ); + } + + if ($username) { + $bind = @ldap_bind( $this->_connectionID, $username, $password ); + } else { + $username = 'anonymous'; + $bind = @ldap_bind( $this->_connectionID ); + } + + if (!$bind) { + $e = sprintf($this->_bind_errmsg,ldap_error($this->_connectionID)); + $this->_errorMsg = $e; + if ($this->debug) ADOConnection::outp($e); + return false; + } + $this->_errorMsg = ''; + $this->database = $ldapbase; + return $this->_connectionID; + } + +/* + Valid Domain Values for LDAP Options: + + LDAP_OPT_DEREF (integer) + LDAP_OPT_SIZELIMIT (integer) + LDAP_OPT_TIMELIMIT (integer) + LDAP_OPT_PROTOCOL_VERSION (integer) + LDAP_OPT_ERROR_NUMBER (integer) + LDAP_OPT_REFERRALS (boolean) + LDAP_OPT_RESTART (boolean) + LDAP_OPT_HOST_NAME (string) + LDAP_OPT_ERROR_STRING (string) + LDAP_OPT_MATCHED_DN (string) + LDAP_OPT_SERVER_CONTROLS (array) + LDAP_OPT_CLIENT_CONTROLS (array) + + Make sure to set this BEFORE calling Connect() + + Example: + + $LDAP_CONNECT_OPTIONS = Array( + Array ( + "OPTION_NAME"=>LDAP_OPT_DEREF, + "OPTION_VALUE"=>2 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_SIZELIMIT, + "OPTION_VALUE"=>100 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_TIMELIMIT, + "OPTION_VALUE"=>30 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION, + "OPTION_VALUE"=>3 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER, + "OPTION_VALUE"=>13 + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_REFERRALS, + "OPTION_VALUE"=>FALSE + ), + Array ( + "OPTION_NAME"=>LDAP_OPT_RESTART, + "OPTION_VALUE"=>FALSE + ) + ); +*/ + + function _inject_bind_options( $options ) { + foreach( $options as $option ) { + ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] ) + or die( "Unable to set server option: " . $option["OPTION_NAME"] ); + } + } + + /* returns _queryID or false */ + function _query($sql,$inputarr=false) + { + $rs = @ldap_search( $this->_connectionID, $this->database, $sql ); + $this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql.': '.ldap_error($this->_connectionID); + return $rs; + } + + function ErrorMsg() + { + return $this->_errorMsg; + } + + function ErrorNo() + { + return @ldap_errno($this->_connectionID); + } + + /* closes the LDAP connection */ + function _close() + { + @ldap_close( $this->_connectionID ); + $this->_connectionID = false; + } + + function SelectDB($db) { + $this->database = $db; + return true; + } // SelectDB + + function ServerInfo() + { + if( !empty( $this->version ) ) return $this->version; + $version = array(); + /* + Determines how aliases are handled during search. + LDAP_DEREF_NEVER (0x00) + LDAP_DEREF_SEARCHING (0x01) + LDAP_DEREF_FINDING (0x02) + LDAP_DEREF_ALWAYS (0x03) + The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but + not when locating the base object of the search. The LDAP_DEREF_FINDING value means + aliases are dereferenced when locating the base object but not during the search. + Default: LDAP_DEREF_NEVER + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ; + switch ( $version['LDAP_OPT_DEREF'] ) { + case 0: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER'; + case 1: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING'; + case 2: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING'; + case 3: + $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS'; + } + + /* + A limit on the number of entries to return from a search. + LDAP_NO_LIMIT (0) means no limit. + Default: LDAP_NO_LIMIT + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] ); + if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) { + $version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT'; + } + + /* + A limit on the number of seconds to spend on a search. + LDAP_NO_LIMIT (0) means no limit. + Default: LDAP_NO_LIMIT + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] ); + if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) { + $version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT'; + } + + /* + Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not. + LDAP_OPT_ON + LDAP_OPT_OFF + Default: ON + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] ); + if ( $version['LDAP_OPT_REFERRALS'] == 0 ) { + $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF'; + } else { + $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON'; + + } + /* + Determines whether LDAP I/O operations are automatically restarted if they abort prematurely. + LDAP_OPT_ON + LDAP_OPT_OFF + Default: OFF + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] ); + if ( $version['LDAP_OPT_RESTART'] == 0 ) { + $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF'; + } else { + $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON'; + + } + /* + This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server. + LDAP_VERSION2 (2) + LDAP_VERSION3 (3) + Default: LDAP_VERSION2 (2) + */ + ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] ); + if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) { + $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2'; + } else { + $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3'; + + } + /* The host name (or list of hosts) for the primary LDAP server. */ + ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] ); + ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] ); + ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] ); + ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] ); + + return $this->version = $version; + + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_ldap extends ADORecordSet{ + + var $databaseType = "ldap"; + var $canSeek = false; + var $_entryID; /* keeps track of the entry resource identifier */ + + function ADORecordSet_ldap($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: + $this->fetchMode = LDAP_NUM; + break; + case ADODB_FETCH_ASSOC: + $this->fetchMode = LDAP_ASSOC; + break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = LDAP_BOTH; + break; + } + + $this->ADORecordSet($queryID); + } + + function _initrs() + { + /* + This could be teaked to respect the $COUNTRECS directive from ADODB + It's currently being used in the _fetch() function and the + GetAssoc() function + */ + $this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID ); + + } + + /* + Return whole recordset as a multi-dimensional associative array + */ + function GetAssoc($force_array = false, $first2cols = false) + { + $records = $this->_numOfRows; + $results = array(); + for ( $i=0; $i < $records; $i++ ) { + foreach ( $this->fields as $k=>$v ) { + if ( is_array( $v ) ) { + if ( $v['count'] == 1 ) { + $results[$i][$k] = $v[0]; + } else { + array_shift( $v ); + $results[$i][$k] = $v; + } + } + } + } + + return $results; + } + + function GetRowAssoc() + { + $results = array(); + foreach ( $this->fields as $k=>$v ) { + if ( is_array( $v ) ) { + if ( $v['count'] == 1 ) { + $results[$k] = $v[0]; + } else { + array_shift( $v ); + $results[$k] = $v; + } + } + } + + return $results; + } + + function GetRowNums() + { + $results = array(); + foreach ( $this->fields as $k=>$v ) { + static $i = 0; + if (is_array( $v )) { + if ( $v['count'] == 1 ) { + $results[$i] = $v[0]; + } else { + array_shift( $v ); + $results[$i] = $v; + } + $i++; + } + } + return $results; + } + + function _fetch() + { + if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 ) + return false; + + if ( $this->_currentRow == 0 ) { + $this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID ); + } else { + $this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID ); + } + + $this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID ); + $this->_numOfFields = $this->fields['count']; + switch ( $this->fetchMode ) { + + case LDAP_ASSOC: + $this->fields = $this->GetRowAssoc(); + break; + + case LDAP_NUM: + $this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc()); + break; + + case LDAP_BOTH: + default: + $this->fields = $this->GetRowNums(); + break; + } + return ( is_array( $this->fields ) ); + } + + function _close() { + @ldap_free_result( $this->_queryID ); + $this->_queryID = false; + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mssql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssql.inc.php new file mode 100644 index 000000000..e5c912638 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssql.inc.php @@ -0,0 +1,1102 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Native mssql driver. Requires mssql client. Works on Windows. + To configure for Unix, see + http://phpbuilder.com/columns/alberto20000919.php3 + +*/ + + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +//---------------------------------------------------------------- +// MSSQL returns dates with the format Oct 13 2002 or 13 Oct 2002 +// and this causes tons of problems because localized versions of +// MSSQL will return the dates in dmy or mdy order; and also the +// month strings depends on what language has been configured. The +// following two variables allow you to control the localization +// settings - Ugh. +// +// MORE LOCALIZATION INFO +// ---------------------- +// To configure datetime, look for and modify sqlcommn.loc, +// typically found in c:\mssql\install +// Also read : +// http://support.microsoft.com/default.aspx?scid=kb;EN-US;q220918 +// Alternatively use: +// CONVERT(char(12),datecol,120) +//---------------------------------------------------------------- + + +// has datetime converstion to YYYY-MM-DD format, and also mssql_fetch_assoc +if (ADODB_PHPVER >= 0x4300) { +// docs say 4.2.0, but testing shows only since 4.3.0 does it work! + ini_set('mssql.datetimeconvert',0); +} else { +global $ADODB_mssql_mths; // array, months must be upper-case + + + $ADODB_mssql_date_order = 'mdy'; + $ADODB_mssql_mths = array( + 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, + 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); +} + +//--------------------------------------------------------------------------- +// Call this to autoset $ADODB_mssql_date_order at the beginning of your code, +// just after you connect to the database. Supports mdy and dmy only. +// Not required for PHP 4.2.0 and above. +function AutoDetect_MSSQL_Date_Order($conn) +{ +global $ADODB_mssql_date_order; + $adate = $conn->GetOne('select getdate()'); + if ($adate) { + $anum = (int) $adate; + if ($anum > 0) { + if ($anum > 31) { + //ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently"); + } else + $ADODB_mssql_date_order = 'dmy'; + } else + $ADODB_mssql_date_order = 'mdy'; + } +} + +class ADODB_mssql extends ADOConnection { + var $databaseType = "mssql"; + var $dataProvider = "mssql"; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $substr = "substring"; + var $length = 'len'; + var $hasAffectedRows = true; + var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'"; + var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; + var $metaColumnsSQL = # xtype==61 is datetime +"select c.name,t.name,c.length, + (case when c.xusertype=61 then 0 else c.xprec end), + (case when c.xusertype=61 then 0 else c.xscale end) + from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $hasGenID = true; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + var $_has_mssql_init; + var $maxParameterLen = 4000; + var $arrayClass = 'ADORecordSet_array_mssql'; + var $uniqueSort = true; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $ansiOuter = true; // for mssql7 or later + var $poorAffectedRows = true; + var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 + var $uniqueOrderBy = true; + var $_bindInputArray = true; + var $forceNewConnect = false; + + function ADODB_mssql() + { + $this->_has_mssql_init = (strnatcmp(PHP_VERSION,'4.1.0')>=0); + } + + function ServerInfo() + { + global $ADODB_FETCH_MODE; + + + if ($this->fetchMode === false) { + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + } else + $savem = $this->SetFetchMode(ADODB_FETCH_NUM); + + if (0) { + $stmt = $this->PrepareSP('sp_server_info'); + $val = 2; + $this->Parameter($stmt,$val,'attribute_id'); + $row = $this->GetRow($stmt); + } + + $row = $this->GetRow("execute sp_server_info 2"); + + + if ($this->fetchMode === false) { + $ADODB_FETCH_MODE = $savem; + } else + $this->SetFetchMode($savem); + + $arr['description'] = $row[2]; + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " ISNULL($field, $ifNull) "; // if MS SQL Server + } + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + if ($this->lastInsID !== false) { + return $this->lastInsID; // InsID from sp_executesql call + } else { + return $this->GetOne($this->identitySQL); + } + } + + + + /** + * Correctly quotes a string so that all strings are escaped. We prefix and append + * to the string single-quotes. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + if (!$magic_quotes) { + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " unless sybase is on + $sybase = ini_get('magic_quotes_sybase'); + if (!$sybase) { + $s = str_replace('\\"','"',$s); + if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything + return "'$s'"; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } + } else { + return "'".$s."'"; + } + } +// moodle change end - see readme_moodle.txt + + function _affectedrows() + { + return $this->GetOne('select @@rowcount'); + } + + var $_dropSeqSQL = "drop table %s"; + + function CreateSequence($seq='adodbseq',$start=1) + { + + $this->Execute('BEGIN TRANSACTION adodbseq'); + $start -= 1; + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return true; + } + + function GenID($seq='adodbseq',$start=1) + { + //$this->debug=1; + $this->Execute('BEGIN TRANSACTION adodbseq'); + $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); + if (!$ok) { + $this->Execute("create table $seq (id float(53))"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + $this->Execute('ROLLBACK TRANSACTION adodbseq'); + return false; + } + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $start; + } + $num = $this->GetOne("select id from $seq"); + $this->Execute('COMMIT TRANSACTION adodbseq'); + return $num; + + // in old implementation, pre 1.90, we returned GUID... + //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'"); + } + + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($nrows > 0 && $offset <= 0) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); + + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); + else + $rs = $this->Execute($sql,$inputarr); + } else + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + + return $rs; + } + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yyyy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(quarter,$col)"; + break; + case 'D': + case 'd': + $s .= "replace(str(day($col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + case 'w': + $s .= "datepart(dw,$col)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $ok = $this->Execute('BEGIN TRAN'); + return $ok; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('COMMIT TRAN'); + return $ok; + } + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('ROLLBACK TRAN'); + return $ok; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + /* + Usage: + + $this->BeginTrans(); + $this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables + + # some operation on both tables table1 and table2 + + $this->CommitTrans(); + + See http://www.swynk.com/friends/achigrik/SQL70Locks.asp + */ + function RowLock($tables,$where,$flds='top 1 null as ignore') + { + if (!$this->transCnt) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where"); + } + + + function MetaIndexes($table,$primary=false, $owner=false) + { + $table = $this->qstr($table); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if ($primary && !$row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function MetaForeignKeys($table, $owner=false, $upper=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + + $sql = +"select object_name(constid) as constraint_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where upper(object_name(fkeyid)) = $table +order by constraint_name, referenced_table_name, keyno"; + + $constraints = $this->GetArray($sql); + + $ADODB_FETCH_MODE = $save; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; + } + if (!$arr) return false; + + $arr2 = false; + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + //From: Fernando Moreira <FMoreira@imediata.pt> + function MetaDatabases() + { + if(@mssql_select_db("master")) { + $qry=$this->metaDatabasesSQL; + if($rs=@mssql_query($qry,$this->_connectionID)){ + $tmpAr=$ar=array(); + while($tmpAr=@mssql_fetch_row($rs)) + $ar[]=$tmpAr[0]; + @mssql_select_db($this->database); + if(sizeof($ar)) + return($ar); + else + return(false); + } else { + @mssql_select_db($this->database); + return(false); + } + } + return(false); + } + + // "Stein-Aksel Basma" <basma@accelero.no> + // tested with MSSQL 2000 + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + $schema = ''; + $this->_findschema($table,$schema); + if (!$schema) $schema = $this->database; + if ($schema) $schema = "and k.table_catalog like '$schema%'"; + + $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, + information_schema.table_constraints tc + where tc.constraint_name = k.constraint_name and tc.constraint_type = + 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $a = $this->GetCol($sql); + $ADODB_FETCH_MODE = $savem; + + if ($a && sizeof($a)>0) return $a; + $false = false; + return $false; + } + + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(($mask)); + $this->metaTablesSQL .= " AND name like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + return @mssql_select_db($dbName); + } + else return false; + } + + function ErrorMsg() + { + if (empty($this->_errorMsg)){ + $this->_errorMsg = mssql_get_last_message(); + } + return $this->_errorMsg; + } + + function ErrorNo() + { + if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode; + if (empty($this->_errorMsg)) { + $this->_errorMsg = mssql_get_last_message(); + } + $id = @mssql_query("select @@ERROR",$this->_connectionID); + if (!$id) return false; + $arr = mssql_fetch_array($id); + @mssql_free_result($id); + if (is_array($arr)) return $arr[0]; + else return -1; + } + + // returns true or false, newconnect supported since php 5.1.0. + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$newconnect=false) + { + if (!function_exists('mssql_pconnect')) return null; + $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword,$newconnect); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('mssql_pconnect')) return null; + $this->_connectionID = mssql_pconnect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + + // persistent connections can forget to rollback on crash, so we do it here. + if ($this->autoRollback) { + $cnt = $this->GetOne('select @@TRANCOUNT'); + while (--$cnt >= 0) $this->Execute('ROLLBACK TRAN'); + } + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true); + } + + function Prepare($sql) + { + $sqlarr = explode('?',$sql); + if (sizeof($sqlarr) <= 1) return $sql; + $sql2 = $sqlarr[0]; + for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { + $sql2 .= '@P'.($i-1) . $sqlarr[$i]; + } + return array($sql,$this->qstr($sql2),$max,$sql2); + } + + function PrepareSP($sql) + { + if (!$this->_has_mssql_init) { + ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0"); + return $sql; + } + $stmt = mssql_init($sql,$this->_connectionID); + if (!$stmt) return $sql; + return array($sql,$stmt); + } + + // returns concatenated string + // MSSQL requires integers to be cast as strings + // automatically cast every datatype to VARCHAR(255) + // @author David Rogers (introspectshun) + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // Split single record on commas, if possible + if (sizeof($arr) == 1) { + foreach ($arr as $arg) { + $args = explode(',', $arg); + } + $arr = $args; + } + + array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";')); + $s = implode('+',$arr); + if (sizeof($arr) > 0) return "$s"; + + return ''; + } + + /* + Usage: + $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group + + # note that the parameter does not have @ in front! + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',false,64); + $db->Execute($stmt); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to. Can set to null (for isNull support). + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + See mssql_bind documentation at php.net. + */ + function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=4000, $type=false) + { + if (!$this->_has_mssql_init) { + ADOConnection::outp( "Parameter: mssql_bind only available since PHP 4.1.0"); + return false; + } + + $isNull = is_null($var); // php 4.0.4 and above... + + if ($type === false) + switch(gettype($var)) { + default: + case 'string': $type = SQLVARCHAR; break; + case 'double': $type = SQLFLT8; break; + case 'integer': $type = SQLINT4; break; + case 'boolean': $type = SQLINT1; break; # SQLBIT not supported in 4.1.0 + } + + if ($this->debug) { + $prefix = ($isOutput) ? 'Out' : 'In'; + $ztype = (empty($type)) ? 'false' : $type; + ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); + } + /* + See http://phplens.com/lens/lensforum/msgs.php?id=7231 + + RETVAL is HARD CODED into php_mssql extension: + The return value (a long integer value) is treated like a special OUTPUT parameter, + called "RETVAL" (without the @). See the example at mssql_execute to + see how it works. - type: one of this new supported PHP constants. + SQLTEXT, SQLVARCHAR,SQLCHAR, SQLINT1,SQLINT2, SQLINT4, SQLBIT,SQLFLT8 + */ + if ($name !== 'RETVAL') $name = '@'.$name; + return mssql_bind($stmt[1], $name, $var, $type, $isOutput, $isNull, $maxLen); + } + + /* + Unfortunately, it appears that mssql cannot handle varbinary > 255 chars + So all your blobs must be of type "image". + + Remember to set in php.ini the following... + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textlimit = 0 ; zero to pass through + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textsize = 0 ; zero to pass through + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + if (strtoupper($blobtype) == 'CLOB') { + $sql = "UPDATE $table SET $column='" . $val . "' WHERE $where"; + return $this->Execute($sql) != false; + } + $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; + return $this->Execute($sql) != false; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + $this->_errorMsg = false; + if (is_array($inputarr)) { + + # bind input params with sp_executesql: + # see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm + # works only with sql server 7 and newer + $getIdentity = false; + if (!is_array($sql) && preg_match('/^\\s*insert/i', $sql)) { + $getIdentity = true; + $sql .= (preg_match('/;\\s*$/i', $sql) ? ' ' : '; ') . $this->identitySQL; + } + if (!is_array($sql)) $sql = $this->Prepare($sql); + $params = ''; + $decl = ''; + $i = 0; + foreach($inputarr as $v) { + if ($decl) { + $decl .= ', '; + $params .= ', '; + } + if (is_string($v)) { + $len = strlen($v); + if ($len == 0) $len = 1; + + if ($len > 4000 ) { + // NVARCHAR is max 4000 chars. Let's use NTEXT + $decl .= "@P$i NTEXT"; + } else { + $decl .= "@P$i NVARCHAR($len)"; + } + + $params .= "@P$i=N". (strncmp($v,"'",1)==0? $v : $this->qstr($v)); + } else if (is_integer($v)) { + $decl .= "@P$i INT"; + $params .= "@P$i=".$v; + } else if (is_float($v)) { + $decl .= "@P$i FLOAT"; + $params .= "@P$i=".$v; + } else if (is_bool($v)) { + $decl .= "@P$i INT"; # Used INT just in case BIT in not supported on the user's MSSQL version. It will cast appropriately. + $params .= "@P$i=".(($v)?'1':'0'); # True == 1 in MSSQL BIT fields and acceptable for storing logical true in an int field + } else { + $decl .= "@P$i CHAR"; # Used char because a type is required even when the value is to be NULL. + $params .= "@P$i=NULL"; + } + $i += 1; + } + $decl = $this->qstr($decl); + if ($this->debug) ADOConnection::outp("<font size=-1>sp_executesql N{$sql[1]},N$decl,$params</font>"); + $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID); + if ($getIdentity) { + $arr = @mssql_fetch_row($rez); + $this->lastInsID = isset($arr[0]) ? $arr[0] : false; + @mssql_data_seek($rez, 0); + } + + } else if (is_array($sql)) { + # PrepareSP() + $rez = mssql_execute($sql[1]); + $this->lastInsID = false; + + } else { + $rez = mssql_query($sql,$this->_connectionID); + $this->lastInsID = false; + } + return $rez; + } + + // returns true or false + function _close() + { + if ($this->transCnt) $this->RollbackTrans(); + $rez = @mssql_close($this->_connectionID); + $this->_connectionID = false; + return $rez; + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssql::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssql::UnixTimeStamp($v); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_mssql extends ADORecordSet { + + var $databaseType = "mssql"; + var $canSeek = true; + var $hasFetchAssoc; // see http://phplens.com/lens/lensforum/msgs.php?id=6083 + // _mths works only in non-localised system + + function ADORecordset_mssql($id,$mode=false) + { + // freedts check... + $this->hasFetchAssoc = function_exists('mssql_fetch_assoc'); + + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + function _initrs() + { + GLOBAL $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS)? @mssql_num_rows($this->_queryID):-1; + $this->_numOfFields = @mssql_num_fields($this->_queryID); + } + + + //Contributed by "Sven Axelsson" <sven.axelsson@bokochwebb.se> + // get next resultset - requires PHP 4.0.5 or later + function NextRecordSet() + { + if (!mssql_next_result($this->_queryID)) return false; + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function FetchField($fieldOffset = -1) + { + if ($fieldOffset != -1) { + $f = @mssql_fetch_field($this->_queryID, $fieldOffset); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $f = @mssql_fetch_field($this->_queryID); + } + $false = false; + if (empty($f)) return $false; + return $f; + } + + function _seek($row) + { + return @mssql_data_seek($this->_queryID, $row); + } + + // speedup + function MoveNext() + { + if ($this->EOF) return false; + + $this->_currentRow++; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + if ($this->fetchMode & ADODB_FETCH_NUM) { + //ADODB_FETCH_BOTH mode + $this->fields = @mssql_fetch_array($this->_queryID); + } + else { + if ($this->hasFetchAssoc) {// only for PHP 4.2.0 or later + $this->fields = @mssql_fetch_assoc($this->_queryID); + } else { + $flds = @mssql_fetch_array($this->_queryID); + if (is_array($flds)) { + $fassoc = array(); + foreach($flds as $k => $v) { + if (is_numeric($k)) continue; + $fassoc[$k] = $v; + } + $this->fields = $fassoc; + } else + $this->fields = false; + } + } + + if (is_array($this->fields)) { + if (ADODB_ASSOC_CASE == 0) { + foreach($this->fields as $k=>$v) { + $this->fields[strtolower($k)] = $v; + } + } else if (ADODB_ASSOC_CASE == 1) { + foreach($this->fields as $k=>$v) { + $this->fields[strtoupper($k)] = $v; + } + } + } + } else { + $this->fields = @mssql_fetch_row($this->_queryID); + } + if ($this->fields) return true; + $this->EOF = true; + + return false; + } + + + // INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4 + // also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot! + function _fetch($ignore_fields=false) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + if ($this->fetchMode & ADODB_FETCH_NUM) { + //ADODB_FETCH_BOTH mode + $this->fields = @mssql_fetch_array($this->_queryID); + } else { + if ($this->hasFetchAssoc) // only for PHP 4.2.0 or later + $this->fields = @mssql_fetch_assoc($this->_queryID); + else { + $this->fields = @mssql_fetch_array($this->_queryID); + if (@is_array($$this->fields)) { + $fassoc = array(); + foreach($$this->fields as $k => $v) { + if (is_integer($k)) continue; + $fassoc[$k] = $v; + } + $this->fields = $fassoc; + } + } + } + + if (!$this->fields) { + } else if (ADODB_ASSOC_CASE == 0) { + foreach($this->fields as $k=>$v) { + $this->fields[strtolower($k)] = $v; + } + } else if (ADODB_ASSOC_CASE == 1) { + foreach($this->fields as $k=>$v) { + $this->fields[strtoupper($k)] = $v; + } + } + } else { + $this->fields = @mssql_fetch_row($this->_queryID); + } + return $this->fields; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + + function _close() + { + $rez = mssql_free_result($this->_queryID); + $this->_queryID = false; + return $rez; + } + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssql::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssql::UnixTimeStamp($v); + } + +} + + +class ADORecordSet_array_mssql extends ADORecordSet_array { + function ADORecordSet_array_mssql($id=-1,$mode=false) + { + $this->ADORecordSet_array($id,$mode); + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + + if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v); + + global $ADODB_mssql_mths,$ADODB_mssql_date_order; + + //Dec 30 2000 12:00AM + if ($ADODB_mssql_date_order == 'dmy') { + if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { + return parent::UnixDate($v); + } + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[1]; + $themth = substr(strtoupper($rr[2]),0,3); + } else { + if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { + return parent::UnixDate($v); + } + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[2]; + $themth = substr(strtoupper($rr[1]),0,3); + } + $themth = $ADODB_mssql_mths[$themth]; + if ($themth <= 0) return false; + // h-m-s-MM-DD-YY + return mktime(0,0,0,$themth,$theday,$rr[3]); + } + + static function UnixTimeStamp($v) + { + + if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v); + + global $ADODB_mssql_mths,$ADODB_mssql_date_order; + + //Dec 30 2000 12:00AM + if ($ADODB_mssql_date_order == 'dmy') { + if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[1]; + $themth = substr(strtoupper($rr[2]),0,3); + } else { + if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[2]; + $themth = substr(strtoupper($rr[1]),0,3); + } + + $themth = $ADODB_mssql_mths[$themth]; + if ($themth <= 0) return false; + + switch (strtoupper($rr[6])) { + case 'P': + if ($rr[4]<12) $rr[4] += 12; + break; + case 'A': + if ($rr[4]==12) $rr[4] = 0; + break; + default: + break; + } + // h-m-s-MM-DD-YY + return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]); + } +} + +/* +Code Example 1: + +select object_name(constid) as constraint_name, + object_name(fkeyid) as table_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where object_name(fkeyid) = x +order by constraint_name, table_name, referenced_table_name, keyno + +Code Example 2: +select constraint_name, + column_name, + ordinal_position +from information_schema.key_column_usage +where constraint_catalog = db_name() +and table_name = x +order by constraint_name, ordinal_position + +http://www.databasejournal.com/scripts/article.php/1440551 +*/ + +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mssql_n.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssql_n.inc.php new file mode 100644 index 000000000..199b10045 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssql_n.inc.php @@ -0,0 +1,171 @@ +<?php + +/// $Id $ + +/////////////////////////////////////////////////////////////////////////// +// // +// NOTICE OF COPYRIGHT // +// // +// ADOdb - Database Abstraction Library for PHP // +// http://adodb.sourceforge.net/ // +// // +// Copyright (C) 2000-2009 John Lim (jlim\@natsoft.com.my) // +// All rights reserved. // +// Released under both BSD license and LGPL library license. // +// Whenever there is any discrepancy between the two licenses, // +// the BSD license will take precedence // +// // +// Moodle - Modular Object-Oriented Dynamic Learning Environment // +// http://moodle.com // +// // +// Copyright (C) 2001-3001 Martin Dougiamas http://dougiamas.com // +// (C) 2001-3001 Eloy Lafuente (stronk7) http://contiento.com // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation; either version 2 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details: // +// // +// http://www.gnu.org/copyleft/gpl.html // +// // +/////////////////////////////////////////////////////////////////////////// + +/** +* MSSQL Driver with auto-prepended "N" for correct unicode storage +* of SQL literal strings. Intended to be used with MSSQL drivers that +* are sending UCS-2 data to MSSQL (FreeTDS and ODBTP) in order to get +* true cross-db compatibility from the application point of view. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +// one useful constant +if (!defined('SINGLEQUOTE')) define('SINGLEQUOTE', "'"); + +include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php'); + +class ADODB_mssql_n extends ADODB_mssql { + var $databaseType = "mssql_n"; + + function ADODB_mssqlpo() + { + ADODB_mssql::ADODB_mssql(); + } + + function _query($sql,$inputarr=false) + { + $sql = $this->_appendN($sql); + return ADODB_mssql::_query($sql,$inputarr); + } + + /** + * This function will intercept all the literals used in the SQL, prepending the "N" char to them + * in order to allow mssql to store properly data sent in the correct UCS-2 encoding (by freeTDS + * and ODBTP) keeping SQL compatibility at ADOdb level (instead of hacking every project to add + * the "N" notation when working against MSSQL. + * + * Note that this hack only must be used if ALL the char-based columns in your DB are of type nchar, + * nvarchar and ntext + */ + function _appendN($sql) { + + $result = $sql; + + /// Check we have some single quote in the query. Exit ok. + if (strpos($sql, SINGLEQUOTE) === false) { + return $sql; + } + + /// Check we haven't an odd number of single quotes (this can cause problems below + /// and should be considered one wrong SQL). Exit with debug info. + if ((substr_count($sql, SINGLEQUOTE) & 1)) { + if ($this->debug) { + ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Wrong number of quotes (odd)"); + } + return $sql; + } + + /// Check we haven't any backslash + single quote combination. It should mean wrong + /// backslashes use (bad magic_quotes_sybase?). Exit with debug info. + $regexp = '/(\\\\' . SINGLEQUOTE . '[^' . SINGLEQUOTE . '])/'; + if (preg_match($regexp, $sql)) { + if ($this->debug) { + ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Found bad use of backslash + single quote"); + } + return $sql; + } + + /// Remove pairs of single-quotes + $pairs = array(); + $regexp = '/(' . SINGLEQUOTE . SINGLEQUOTE . ')/'; + preg_match_all($regexp, $result, $list_of_pairs); + if ($list_of_pairs) { + foreach (array_unique($list_of_pairs[0]) as $key=>$value) { + $pairs['<@#@#@PAIR-'.$key.'@#@#@>'] = $value; + } + if (!empty($pairs)) { + $result = str_replace($pairs, array_keys($pairs), $result); + } + } + + /// Remove the rest of literals present in the query + $literals = array(); + $regexp = '/(N?' . SINGLEQUOTE . '.*?' . SINGLEQUOTE . ')/is'; + preg_match_all($regexp, $result, $list_of_literals); + if ($list_of_literals) { + foreach (array_unique($list_of_literals[0]) as $key=>$value) { + $literals['<#@#@#LITERAL-'.$key.'#@#@#>'] = $value; + } + if (!empty($literals)) { + $result = str_replace($literals, array_keys($literals), $result); + } + } + + + /// Analyse literals to prepend the N char to them if their contents aren't numeric + if (!empty($literals)) { + foreach ($literals as $key=>$value) { + if (!is_numeric(trim($value, SINGLEQUOTE))) { + /// Non numeric string, prepend our dear N + $literals[$key] = 'N' . trim($value, 'N'); //Trimming potentially existing previous "N" + } + } + } + + /// Re-apply literals to the text + if (!empty($literals)) { + $result = str_replace(array_keys($literals), $literals, $result); + } + + /// Any pairs followed by N' must be switched to N' followed by those pairs + /// (or strings beginning with single quotes will fail) + $result = preg_replace("/((<@#@#@PAIR-(\d+)@#@#@>)+)N'/", "N'$1", $result); + + /// Re-apply pairs of single-quotes to the text + if (!empty($pairs)) { + $result = str_replace(array_keys($pairs), $pairs, $result); + } + + /// Print transformation if debug = on + if ($result != $sql && $this->debug) { + ADOConnection::outp("{$this->databaseType} internal transformation:<br>{$sql}<br>to<br>{$result}"); + } + + return $result; + } +} + +class ADORecordset_mssql_n extends ADORecordset_mssql { + var $databaseType = "mssql_n"; + function ADORecordset_mssql_n($id,$mode=false) + { + $this->ADORecordset_mssql($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mssqlnative.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssqlnative.inc.php new file mode 100644 index 000000000..59f394425 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssqlnative.inc.php @@ -0,0 +1,922 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Native mssql driver. Requires mssql client. Works on Windows. + http://www.microsoft.com/sql/technologies/php/default.mspx + To configure for Unix, see + http://phpbuilder.com/columns/alberto20000919.php3 + + $stream = sqlsrv_get_field($stmt, $index, SQLSRV_SQLTYPE_STREAM(SQLSRV_ENC_BINARY)); + stream_filter_append($stream, "convert.iconv.ucs-2/utf-8"); // Voila, UTF-8 can be read directly from $stream + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!function_exists('sqlsrv_configure')) { + die("mssqlnative extension not installed"); +} + +if (!function_exists('sqlsrv_set_error_handling')) { + function sqlsrv_set_error_handling($constant) { + sqlsrv_configure("WarningsReturnAsErrors", $constant); + } +} +if (!function_exists('sqlsrv_log_set_severity')) { + function sqlsrv_log_set_severity($constant) { + sqlsrv_configure("LogSeverity", $constant); + } +} +if (!function_exists('sqlsrv_log_set_subsystems')) { + function sqlsrv_log_set_subsystems($constant) { + sqlsrv_configure("LogSubsystems", $constant); + } +} + + +//---------------------------------------------------------------- +// MSSQL returns dates with the format Oct 13 2002 or 13 Oct 2002 +// and this causes tons of problems because localized versions of +// MSSQL will return the dates in dmy or mdy order; and also the +// month strings depends on what language has been configured. The +// following two variables allow you to control the localization +// settings - Ugh. +// +// MORE LOCALIZATION INFO +// ---------------------- +// To configure datetime, look for and modify sqlcommn.loc, +// typically found in c:\mssql\install +// Also read : +// http://support.microsoft.com/default.aspx?scid=kb;EN-US;q220918 +// Alternatively use: +// CONVERT(char(12),datecol,120) +// +// Also if your month is showing as month-1, +// e.g. Jan 13, 2002 is showing as 13/0/2002, then see +// http://phplens.com/lens/lensforum/msgs.php?id=7048&x=1 +// it's a localisation problem. +//---------------------------------------------------------------- + + +// has datetime converstion to YYYY-MM-DD format, and also mssql_fetch_assoc +if (ADODB_PHPVER >= 0x4300) { +// docs say 4.2.0, but testing shows only since 4.3.0 does it work! + ini_set('mssql.datetimeconvert',0); +} else { + global $ADODB_mssql_mths; // array, months must be upper-case + $ADODB_mssql_date_order = 'mdy'; + $ADODB_mssql_mths = array( + 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, + 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); +} + +//--------------------------------------------------------------------------- +// Call this to autoset $ADODB_mssql_date_order at the beginning of your code, +// just after you connect to the database. Supports mdy and dmy only. +// Not required for PHP 4.2.0 and above. +function AutoDetect_MSSQL_Date_Order($conn) +{ + global $ADODB_mssql_date_order; + $adate = $conn->GetOne('select getdate()'); + if ($adate) { + $anum = (int) $adate; + if ($anum > 0) { + if ($anum > 31) { + //ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently"); + } else + $ADODB_mssql_date_order = 'dmy'; + } else + $ADODB_mssql_date_order = 'mdy'; + } +} + +class ADODB_mssqlnative extends ADOConnection { + var $databaseType = "mssqlnative"; + var $dataProvider = "mssqlnative"; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $substr = "substring"; + var $length = 'len'; + var $hasAffectedRows = true; + var $poorAffectedRows = false; + var $metaDatabasesSQL = "select name from sys.sysdatabases where name <> 'master'"; + var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; + var $metaColumnsSQL = # xtype==61 is datetime + "select c.name,t.name,c.length, + (case when c.xusertype=61 then 0 else c.xprec end), + (case when c.xusertype=61 then 0 else c.xscale end) + from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $hasGenID = true; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + var $maxParameterLen = 4000; + var $arrayClass = 'ADORecordSet_array_mssqlnative'; + var $uniqueSort = true; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $ansiOuter = true; // for mssql7 or later + var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 + var $uniqueOrderBy = true; + var $_bindInputArray = true; + var $_dropSeqSQL = "drop table %s"; + + function ADODB_mssqlnative() + { + if ($this->debug) { + error_log("<pre>"); + sqlsrv_set_error_handling( SQLSRV_ERRORS_LOG_ALL ); + sqlsrv_log_set_severity( SQLSRV_LOG_SEVERITY_ALL ); + sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL); + sqlsrv_configure('warnings_return_as_errors', 0); + } else { + sqlsrv_set_error_handling(0); + sqlsrv_log_set_severity(0); + sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL); + sqlsrv_configure('warnings_return_as_errors', 0); + } + } + + function ServerInfo() + { + global $ADODB_FETCH_MODE; + if ($this->fetchMode === false) { + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + } else + $savem = $this->SetFetchMode(ADODB_FETCH_NUM); + $arrServerInfo = sqlsrv_server_info($this->_connectionID); + $arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase']; + $arr['version'] = $arrServerInfo['SQLServerVersion'];//ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " ISNULL($field, $ifNull) "; // if MS SQL Server + } + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + return $this->GetOne($this->identitySQL); + } + + function _affectedrows() + { + return sqlsrv_rows_affected($this->_queryID); + } + + function CreateSequence($seq='adodbseq',$start=1) + { + if($this->debug) error_log("<hr>CreateSequence($seq,$start)"); + sqlsrv_begin_transaction($this->_connectionID); + $start -= 1; + $this->Execute("create table $seq (id int)");//was float(53) + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + if($this->debug) error_log("<hr>Error: ROLLBACK"); + sqlsrv_rollback($this->_connectionID); + return false; + } + sqlsrv_commit($this->_connectionID); + return true; + } + + function GenID($seq='adodbseq',$start=1) + { + if($this->debug) error_log("<hr>GenID($seq,$start)"); + sqlsrv_begin_transaction($this->_connectionID); + $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); + if (!$ok) { + $this->Execute("create table $seq (id int)"); + $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); + if (!$ok) { + if($this->debug) error_log("<hr>Error: ROLLBACK"); + sqlsrv_rollback($this->_connectionID); + return false; + } + sqlsrv_commit($this->_connectionID); + return $start; + } + $num = $this->GetOne("select id from $seq"); + sqlsrv_commit($this->_connectionID); + if($this->debug) error_log(" Returning: $num"); + return $num; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yyyy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(quarter,$col)"; + break; + case 'D': + case 'd': + $s .= "replace(str(day($col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + if ($this->debug) error_log('<hr>begin transaction'); + sqlsrv_begin_transaction($this->_connectionID); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if ($this->debug) error_log('<hr>commit transaction'); + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + sqlsrv_commit($this->_connectionID); + return true; + } + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->debug) error_log('<hr>rollback transaction'); + if ($this->transCnt) $this->transCnt -= 1; + sqlsrv_rollback($this->_connectionID); + return true; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + /* + Usage: + + $this->BeginTrans(); + $this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables + + # some operation on both tables table1 and table2 + + $this->CommitTrans(); + + See http://www.swynk.com/friends/achigrik/SQL70Locks.asp + */ + function RowLock($tables,$where,$flds='top 1 null as ignore') + { + if (!$this->transCnt) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where"); + } + + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + $rs = $this->Execute('USE '.$dbName); + if($rs) { + return true; + } else return false; + } + else return false; + } + + function ErrorMsg() + { + $retErrors = sqlsrv_errors(SQLSRV_ERR_ALL); + if($retErrors != null) { + foreach($retErrors as $arrError) { + $this->_errorMsg .= "SQLState: ".$arrError[ 'SQLSTATE']."\n"; + $this->_errorMsg .= "Error Code: ".$arrError[ 'code']."\n"; + $this->_errorMsg .= "Message: ".$arrError[ 'message']."\n"; + } + } else { + $this->_errorMsg = "No errors found"; + } + return $this->_errorMsg; + } + + function ErrorNo() + { + if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode; + $err = sqlsrv_errors(SQLSRV_ERR_ALL); + if($err[0]) return $err[0]['code']; + else return -1; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sqlsrv_connect')) return null; + $connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword); + if ($this->debug) error_log("<hr>connecting... hostname: $argHostname params: ".var_export($connectionInfo,true)); + //if ($this->debug) error_log("<hr>_connectionID before: ".serialize($this->_connectionID)); + if(!($this->_connectionID = sqlsrv_connect($argHostname,$connectionInfo))) { + if ($this->debug) error_log( "<hr><b>errors</b>: ".print_r( sqlsrv_errors(), true)); + return false; + } + //if ($this->debug) error_log(" _connectionID after: ".serialize($this->_connectionID)); + //if ($this->debug) error_log("<hr>defined functions: <pre>".var_export(get_defined_functions(),true)."</pre>"); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + //return null;//not implemented. NOTE: Persistent connections have no effect if PHP is used as a CGI program. (FastCGI!) + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); + } + + function Prepare($sql) + { + $stmt = sqlsrv_prepare( $this->_connectionID, $sql); + if (!$stmt) return $sql; + return array($sql,$stmt); + } + + // returns concatenated string + // MSSQL requires integers to be cast as strings + // automatically cast every datatype to VARCHAR(255) + // @author David Rogers (introspectshun) + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // Split single record on commas, if possible + if (sizeof($arr) == 1) { + foreach ($arr as $arg) { + $args = explode(',', $arg); + } + $arr = $args; + } + + array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";')); + $s = implode('+',$arr); + if (sizeof($arr) > 0) return "$s"; + + return ''; + } + + /* + Unfortunately, it appears that mssql cannot handle varbinary > 255 chars + So all your blobs must be of type "image". + + Remember to set in php.ini the following... + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textlimit = 0 ; zero to pass through + + ; Valid range 0 - 2147483647. Default = 4096. + mssql.textsize = 0 ; zero to pass through + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + if (strtoupper($blobtype) == 'CLOB') { + $sql = "UPDATE $table SET $column='" . $val . "' WHERE $where"; + return $this->Execute($sql) != false; + } + $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; + return $this->Execute($sql) != false; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + $this->_errorMsg = false; + if (is_array($inputarr)) { + $rez = sqlsrv_query($this->_connectionID,$sql,$inputarr); + } else if (is_array($sql)) { + $rez = sqlsrv_query($this->_connectionID,$sql[1],$inputarr); + } else { + $rez = sqlsrv_query($this->_connectionID,$sql); + } + if ($this->debug) error_log("<hr>running query: ".var_export($sql,true)."<hr>input array: ".var_export($inputarr,true)."<hr>result: ".var_export($rez,true));//"<hr>connection: ".serialize($this->_connectionID) + //fix for returning true on anything besides select statements + if (is_array($sql)) $sql = $sql[1]; + $sql = ltrim($sql); + if(stripos($sql, 'SELECT') !== 0 && $rez !== false) { + if ($this->debug) error_log(" isn't a select query, returning boolean true"); + return true; + } + //end fix + if(!$rez) $rez = false; + return $rez; + } + + // returns true or false + function _close() + { + if ($this->transCnt) $this->RollbackTrans(); + $rez = @sqlsrv_close($this->_connectionID); + $this->_connectionID = false; + return $rez; + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssql::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssql::UnixTimeStamp($v); + } + + function &MetaIndexes($table,$primary=false) + { + $table = $this->qstr($table); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if (!$primary && $row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function MetaForeignKeys($table, $owner=false, $upper=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + + $sql = + "select object_name(constid) as constraint_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name + from sysforeignkeys + where upper(object_name(fkeyid)) = $table + order by constraint_name, referenced_table_name, keyno"; + + $constraints =& $this->GetArray($sql); + + $ADODB_FETCH_MODE = $save; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; + } + if (!$arr) return false; + + $arr2 = false; + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + //From: Fernando Moreira <FMoreira@imediata.pt> + function MetaDatabases() + { + $this->SelectDB("master"); + $rs =& $this->Execute($this->metaDatabasesSQL); + $rows = $rs->GetRows(); + $ret = array(); + for($i=0;$i<count($rows);$i++) { + $ret[] = $rows[$i][0]; + } + $this->SelectDB($this->database); + if($ret) + return $ret; + else + return false; + } + + // "Stein-Aksel Basma" <basma@accelero.no> + // tested with MSSQL 2000 + function &MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + $schema = ''; + $this->_findschema($table,$schema); + if (!$schema) $schema = $this->database; + if ($schema) $schema = "and k.table_catalog like '$schema%'"; + + $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, + information_schema.table_constraints tc + where tc.constraint_name = k.constraint_name and tc.constraint_type = + 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $a = $this->GetCol($sql); + $ADODB_FETCH_MODE = $savem; + + if ($a && sizeof($a)>0) return $a; + $false = false; + return $false; + } + + + function &MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(($mask)); + $this->metaTablesSQL .= " AND name like $mask"; + } + $ret =& ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_mssqlnative extends ADORecordSet { + + var $databaseType = "mssqlnative"; + var $canSeek = false; + var $fieldOffset = 0; + // _mths works only in non-localised system + + function ADORecordset_mssqlnative($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + + } + $this->fetchMode = $mode; + return $this->ADORecordSet($id,$mode); + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + if ($this->connection->debug) error_log("(before) ADODB_COUNTRECS: {$ADODB_COUNTRECS} _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}"); + /*$retRowsAff = sqlsrv_rows_affected($this->_queryID);//"If you need to determine the number of rows a query will return before retrieving the actual results, appending a SELECT COUNT ... query would let you get that information, and then a call to next_result would move you to the "real" results." + error_log("rowsaff: ".serialize($retRowsAff)); + $this->_numOfRows = ($ADODB_COUNTRECS)? $retRowsAff:-1;*/ + $this->_numOfRows = -1;//not supported + $fieldmeta = sqlsrv_field_metadata($this->_queryID); + $this->_numOfFields = ($fieldmeta)? count($fieldmeta):-1; + if ($this->connection->debug) error_log("(after) _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}"); + } + + + //Contributed by "Sven Axelsson" <sven.axelsson@bokochwebb.se> + // get next resultset - requires PHP 4.0.5 or later + function NextRecordSet() + { + if (!sqlsrv_next_result($this->_queryID)) return false; + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function &FetchField($fieldOffset = -1) + { + if ($this->connection->debug) error_log("<hr>fetchfield: $fieldOffset, fetch array: <pre>".print_r($this->fields,true)."</pre> backtrace: ".adodb_backtrace(false)); + if ($fieldOffset != -1) $this->fieldOffset = $fieldOffset; + $arrKeys = array_keys($this->fields); + if(array_key_exists($this->fieldOffset,$arrKeys) && !array_key_exists($arrKeys[$this->fieldOffset],$this->fields)) { + $f = false; + } else { + $f = $this->fields[ $arrKeys[$this->fieldOffset] ]; + if($fieldOffset == -1) $this->fieldOffset++; + } + + if (empty($f)) { + $f = false;//PHP Notice: Only variable references should be returned by reference + } + return $f; + } + + function _seek($row) + { + return false;//There is no support for cursors in the driver at this time. All data is returned via forward-only streams. + } + + // speedup + function MoveNext() + { + if ($this->connection->debug) error_log("movenext()"); + //if ($this->connection->debug) error_log("eof (beginning): ".$this->EOF); + if ($this->EOF) return false; + + $this->_currentRow++; + if ($this->connection->debug) error_log("_currentRow: ".$this->_currentRow); + + if ($this->_fetch()) return true; + $this->EOF = true; + //if ($this->connection->debug) error_log("eof (end): ".$this->EOF); + + return false; + } + + + // INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4 + // also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot! + function _fetch($ignore_fields=false) + { + if ($this->connection->debug) error_log("_fetch()"); + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + if ($this->fetchMode & ADODB_FETCH_NUM) { + if ($this->connection->debug) error_log("fetch mode: both"); + $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_BOTH); + } else { + if ($this->connection->debug) error_log("fetch mode: assoc"); + $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_ASSOC); + } + + if (ADODB_ASSOC_CASE == 0) { + foreach($this->fields as $k=>$v) { + $this->fields[strtolower($k)] = $v; + } + } else if (ADODB_ASSOC_CASE == 1) { + foreach($this->fields as $k=>$v) { + $this->fields[strtoupper($k)] = $v; + } + } + } else { + if ($this->connection->debug) error_log("fetch mode: num"); + $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_NUMERIC); + } + if(is_array($this->fields) && array_key_exists(1,$this->fields) && !array_key_exists(0,$this->fields)) {//fix fetch numeric keys since they're not 0 based + $arrFixed = array(); + foreach($this->fields as $key=>$value) { + if(is_numeric($key)) { + $arrFixed[$key-1] = $value; + } else { + $arrFixed[$key] = $value; + } + } + //if($this->connection->debug) error_log("<hr>fixing non 0 based return array, old: ".print_r($this->fields,true)." new: ".print_r($arrFixed,true)); + $this->fields = $arrFixed; + } + if(is_array($this->fields)) { + foreach($this->fields as $key=>$value) { + if (is_object($value) && method_exists($value, 'format')) {//is DateTime object + $this->fields[$key] = $value->format("Y-m-d\TH:i:s\Z"); + } + } + } + if($this->fields === null) $this->fields = false; + if ($this->connection->debug) error_log("<hr>after _fetch, fields: <pre>".print_r($this->fields,true)." backtrace: ".adodb_backtrace(false)); + return $this->fields; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + function _close() + { + $rez = sqlsrv_free_stmt($this->_queryID); + $this->_queryID = false; + return $rez; + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_mssqlnative::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_mssqlnative::UnixTimeStamp($v); + } +} + + +class ADORecordSet_array_mssqlnative extends ADORecordSet_array { + function ADORecordSet_array_mssqlnative($id=-1,$mode=false) + { + $this->ADORecordSet_array($id,$mode); + } + + // mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + + if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v); + + global $ADODB_mssql_mths,$ADODB_mssql_date_order; + + //Dec 30 2000 12:00AM + if ($ADODB_mssql_date_order == 'dmy') { + if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { + return parent::UnixDate($v); + } + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[1]; + $themth = substr(strtoupper($rr[2]),0,3); + } else { + if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { + return parent::UnixDate($v); + } + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[2]; + $themth = substr(strtoupper($rr[1]),0,3); + } + $themth = $ADODB_mssql_mths[$themth]; + if ($themth <= 0) return false; + // h-m-s-MM-DD-YY + return mktime(0,0,0,$themth,$theday,$rr[3]); + } + + static function UnixTimeStamp($v) + { + + if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v); + + global $ADODB_mssql_mths,$ADODB_mssql_date_order; + + //Dec 30 2000 12:00AM + if ($ADODB_mssql_date_order == 'dmy') { + if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[1]; + $themth = substr(strtoupper($rr[2]),0,3); + } else { + if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $theday = $rr[2]; + $themth = substr(strtoupper($rr[1]),0,3); + } + + $themth = $ADODB_mssql_mths[$themth]; + if ($themth <= 0) return false; + + switch (strtoupper($rr[6])) { + case 'P': + if ($rr[4]<12) $rr[4] += 12; + break; + case 'A': + if ($rr[4]==12) $rr[4] = 0; + break; + default: + break; + } + // h-m-s-MM-DD-YY + return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]); + } +} + +/* +Code Example 1: + +select object_name(constid) as constraint_name, + object_name(fkeyid) as table_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where object_name(fkeyid) = x +order by constraint_name, table_name, referenced_table_name, keyno + +Code Example 2: +select constraint_name, + column_name, + ordinal_position +from information_schema.key_column_usage +where constraint_catalog = db_name() +and table_name = x +order by constraint_name, ordinal_position + +http://www.databasejournal.com/scripts/article.php/1440551 +*/ + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mssqlpo.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssqlpo.inc.php new file mode 100644 index 000000000..d10e1b845 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mssqlpo.inc.php @@ -0,0 +1,62 @@ +<?php +/** +* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. +* Released under both BSD license and Lesser GPL library license. +* Whenever there is any discrepancy between the two licenses, +* the BSD license will take precedence. +* +* Set tabs to 4 for best viewing. +* +* Latest version is available at http://php.weblogs.com +* +* Portable MSSQL Driver that supports || instead of + +* +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + + +/* + The big difference between mssqlpo and it's parent mssql is that mssqlpo supports + the more standard || string concatenation operator. +*/ + +include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php'); + +class ADODB_mssqlpo extends ADODB_mssql { + var $databaseType = "mssqlpo"; + var $concat_operator = '||'; + + function ADODB_mssqlpo() + { + ADODB_mssql::ADODB_mssql(); + } + + function PrepareSP($sql) + { + if (!$this->_has_mssql_init) { + ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0"); + return $sql; + } + if (is_string($sql)) $sql = str_replace('||','+',$sql); + $stmt = mssql_init($sql,$this->_connectionID); + if (!$stmt) return $sql; + return array($sql,$stmt); + } + + function _query($sql,$inputarr=false) + { + if (is_string($sql)) $sql = str_replace('||','+',$sql); + return ADODB_mssql::_query($sql,$inputarr); + } +} + +class ADORecordset_mssqlpo extends ADORecordset_mssql { + var $databaseType = "mssqlpo"; + function ADORecordset_mssqlpo($id,$mode=false) + { + $this->ADORecordset_mssql($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mysql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysql.inc.php new file mode 100644 index 000000000..a70c0bd7c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysql.inc.php @@ -0,0 +1,794 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + + MySQL code that does not support transactions. Use mysqlt if you need transactions. + Requires mysql client. Works on Windows and Unix. + + 28 Feb 2001: MetaColumns bug fix - suggested by Freek Dijkstra (phpeverywhere@macfreek.com) +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (! defined("_ADODB_MYSQL_LAYER")) { + define("_ADODB_MYSQL_LAYER", 1 ); + +class ADODB_mysql extends ADOConnection { + var $databaseType = 'mysql'; + var $dataProvider = 'mysql'; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $metaTablesSQL = "SHOW TABLES"; + var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasLimit = true; + var $hasMoveFirst = true; + var $hasGenID = true; + var $isoDates = true; // accepts dates in ISO format + var $sysDate = 'CURDATE()'; + var $sysTimeStamp = 'NOW()'; + var $hasTransactions = false; + var $forceNewConnect = false; + var $poorAffectedRows = true; + var $clientFlags = 0; + var $substr = "substring"; + var $nameQuote = '`'; /// string to use to quote identifiers and names + var $compat323 = false; // true if compat with mysql 3.23 + + function ADODB_mysql() + { + if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_'; + } + + function ServerInfo() + { + $arr['description'] = ADOConnection::GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " IFNULL($field, $ifNull) "; // if MySQL + } + + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $save = $this->metaTablesSQL; + if ($showSchema && is_string($showSchema)) { + $this->metaTablesSQL .= " from $showSchema"; + } + + if ($mask) { + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + $this->metaTablesSQL = $save; + return $ret; + } + + + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + // get index details + $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table)); + + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return $false; + } + + $indexes = array (); + + // parse index data into array + while ($row = $rs->FetchRow()) { + if ($primary == FALSE AND $row[2] == 'PRIMARY') { + continue; + } + + if (!isset($indexes[$row[2]])) { + $indexes[$row[2]] = array( + 'unique' => ($row[1] == 0), + 'columns' => array() + ); + } + + $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4]; + } + + // sort columns by order in the index + foreach ( array_keys ($indexes) as $index ) + { + ksort ($indexes[$index]['columns']); + } + + return $indexes; + } + + + // if magic quotes disabled, use mysql_real_escape_string() + function qstr($s,$magic_quotes=false) + { + if (is_null($s)) return 'NULL'; + if (!$magic_quotes) { + + if (ADODB_PHPVER >= 0x4300) { + if (is_resource($this->_connectionID)) + return "'".mysql_real_escape_string($s,$this->_connectionID)."'"; + } + if ($this->replaceQuote[0] == '\\'){ + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + return "'$s'"; + } + + function _insertid() + { + return ADOConnection::GetOne('SELECT LAST_INSERT_ID()'); + //return mysql_insert_id($this->_connectionID); + } + + function GetOne($sql,$inputarr=false) + { + if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) { + $rs = $this->SelectLimit($sql,1,-1,$inputarr); + if ($rs) { + $rs->Close(); + if ($rs->EOF) return false; + return reset($rs->fields); + } + } else { + return ADOConnection::GetOne($sql,$inputarr); + } + return false; + } + + function BeginTrans() + { + if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver"); + } + + function _affectedrows() + { + return mysql_affected_rows($this->_connectionID); + } + + // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html + // Reference on Last_Insert_ID on the recommended way to simulate sequences + var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);"; + var $_genSeqSQL = "create table %s (id int not null)"; + var $_genSeqCountSQL = "select count(*) from %s"; + var $_genSeq2SQL = "insert into %s values (%s)"; + var $_dropSeqSQL = "drop table %s"; + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if (empty($this->_genSeqSQL)) return false; + $u = strtoupper($seqname); + + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); + } + + + function GenID($seqname='adodbseq',$startID=1) + { + // post-nuke sets hasGenID to false + if (!$this->hasGenID) return false; + + $savelog = $this->_logsql; + $this->_logsql = false; + $getnext = sprintf($this->_genIDSQL,$seqname); + $holdtransOK = $this->_transOK; // save the current status + $rs = @$this->Execute($getnext); + if (!$rs) { + if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset + $u = strtoupper($seqname); + $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname)); + if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); + $rs = $this->Execute($getnext); + } + + if ($rs) { + $this->genID = mysql_insert_id($this->_connectionID); + $rs->Close(); + } else + $this->genID = 0; + + $this->_logsql = $savelog; + return $this->genID; + } + + function MetaDatabases() + { + $qid = mysql_list_dbs($this->_connectionID); + $arr = array(); + $i = 0; + $max = mysql_num_rows($qid); + while ($i < $max) { + $db = mysql_tablename($qid,$i); + if ($db != 'mysql') $arr[] = $db; + $i += 1; + } + return $arr; + } + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'DATE_FORMAT('.$col.",'"; + $concat = false; + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + /** FALL THROUGH */ + case '-': + case '/': + $s .= $ch; + break; + + case 'Y': + case 'y': + $s .= '%Y'; + break; + case 'M': + $s .= '%b'; + break; + + case 'm': + $s .= '%m'; + break; + case 'D': + case 'd': + $s .= '%d'; + break; + + case 'Q': + case 'q': + $s .= "'),Quarter($col)"; + + if ($len > $i+1) $s .= ",DATE_FORMAT($col,'"; + else $s .= ",('"; + $concat = true; + break; + + case 'H': + $s .= '%H'; + break; + + case 'h': + $s .= '%I'; + break; + + case 'i': + $s .= '%i'; + break; + + case 's': + $s .= '%s'; + break; + + case 'a': + case 'A': + $s .= '%p'; + break; + + case 'w': + $s .= '%w'; + break; + + case 'W': + $s .= '%U'; + break; + + case 'l': + $s .= '%W'; + break; + } + } + $s.="')"; + if ($concat) $s = "CONCAT($s)"; + return $s; + } + + + // returns concatenated string + // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // suggestion by andrew005@mnogo.ru + $s = implode(',',$arr); + if (strlen($s) > 0) return "CONCAT($s)"; + else return ''; + } + + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + + $fraction = $dayFraction * 24 * 3600; + return '('. $date . ' + INTERVAL ' . $fraction.' SECOND)'; + +// return "from_unixtime(unix_timestamp($date)+$fraction)"; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!empty($this->port)) $argHostname .= ":".$this->port; + + if (ADODB_PHPVER >= 0x4300) + $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword, + $this->forceNewConnect,$this->clientFlags); + else if (ADODB_PHPVER >= 0x4200) + $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword, + $this->forceNewConnect); + else + $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword); + + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!empty($this->port)) $argHostname .= ":".$this->port; + + if (ADODB_PHPVER >= 0x4300) + $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags); + else + $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($this->autoRollback) $this->RollbackTrans(); + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->forceNewConnect = true; + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); + } + + function MetaColumns($table, $normalize=true) + { + $this->_findschema($table,$schema); + if ($schema) { + $dbName = $this->database; + $this->SelectDB($schema); + } + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + + if ($schema) { + $this->SelectDB($dbName); + } + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!is_object($rs)) { + $false = false; + return $false; + } + + $retarr = array(); + while (!$rs->EOF){ + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $type = $rs->fields[1]; + + // split type into type(length): + $fld->scale = null; + if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; + } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { + $fld->type = $query_array[1]; + $arr = explode(",",$query_array[2]); + $fld->enums = $arr; + $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 + $fld->max_length = ($zlen > 0) ? $zlen : 1; + } else { + $fld->type = $type; + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false); + $fld->unsigned = (strpos($type,'unsigned') !== false); + $fld->zerofill = (strpos($type,'zerofill') !== false); + + if (!$fld->binary) { + $d = $rs->fields[4]; + if ($d != '' && $d != 'NULL') { + $fld->has_default = true; + $fld->default_value = $d; + } else { + $fld->has_default = false; + } + } + + if ($save == ADODB_FETCH_NUM) { + $retarr[] = $fld; + } else { + $retarr[strtoupper($fld->name)] = $fld; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $retarr; + } + + // returns true or false + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + return @mysql_select_db($dbName,$this->_connectionID); + } + else return false; + } + + // parameters use PostgreSQL convention, not MySQL + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) + { + $offsetStr =($offset>=0) ? ((integer)$offset)."," : ''; + // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220 + if ($nrows < 0) $nrows = '18446744073709551615'; + + if ($secs) + $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr); + else + $rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr); + return $rs; + } + + // returns queryID or false + function _query($sql,$inputarr=false) + { + //global $ADODB_COUNTRECS; + //if($ADODB_COUNTRECS) + return mysql_query($sql,$this->_connectionID); + //else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6 + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + + if ($this->_logsql) return $this->_errorMsg; + if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error(); + else $this->_errorMsg = @mysql_error($this->_connectionID); + return $this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + if ($this->_logsql) return $this->_errorCode; + if (empty($this->_connectionID)) return @mysql_errno(); + else return @mysql_errno($this->_connectionID); + } + + // returns true or false + function _close() + { + @mysql_close($this->_connectionID); + $this->_connectionID = false; + } + + + /* + * Maximum size of C field + */ + function CharMax() + { + return 255; + } + + /* + * Maximum size of X field + */ + function TextMax() + { + return 4294967295; + } + + // "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx> + function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE ) + { + global $ADODB_FETCH_MODE; + if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true; + + if ( !empty($owner) ) { + $table = "$owner.$table"; + } + $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table)); + if ($associative) { + $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"]; + } else $create_sql = $a_create_table[1]; + + $matches = array(); + + if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false; + $foreign_keys = array(); + $num_keys = count($matches[0]); + for ( $i = 0; $i < $num_keys; $i ++ ) { + $my_field = explode('`, `', $matches[1][$i]); + $ref_table = $matches[2][$i]; + $ref_field = explode('`, `', $matches[3][$i]); + + if ( $upper ) { + $ref_table = strtoupper($ref_table); + } + + // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976 + if (!isset($foreign_keys[$ref_table])) { + $foreign_keys[$ref_table] = array(); + } + $num_fields = count($my_field); + for ( $j = 0; $j < $num_fields; $j ++ ) { + if ( $associative ) { + $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j]; + } else { + $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}"; + } + } + } + + return $foreign_keys; + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + + +class ADORecordSet_mysql extends ADORecordSet{ + + var $databaseType = "mysql"; + var $canSeek = true; + + function ADORecordSet_mysql($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function _initrs() + { + //GLOBAL $ADODB_COUNTRECS; + // $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1; + $this->_numOfRows = @mysql_num_rows($this->_queryID); + $this->_numOfFields = @mysql_num_fields($this->_queryID); + } + + function FetchField($fieldOffset = -1) + { + if ($fieldOffset != -1) { + $o = @mysql_fetch_field($this->_queryID, $fieldOffset); + $f = @mysql_field_flags($this->_queryID,$fieldOffset); + if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com) + //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable + if ($o) $o->binary = (strpos($f,'binary')!== false); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $o = @mysql_fetch_field($this->_queryID); + if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com) + //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable + } + + return $o; + } + + function GetRowAssoc($upper=true) + { + if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields; + else $row = ADORecordSet::GetRowAssoc($upper); + return $row; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + // added @ by "Michael William Miller" <mille562@pilot.msu.edu> + if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _seek($row) + { + if ($this->_numOfRows == 0) return false; + return @mysql_data_seek($this->_queryID,$row); + } + + function MoveNext() + { + //return adodb_movenext($this); + //if (defined('ADODB_EXTENSION')) return adodb_movenext($this); + if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } + + function _fetch() + { + $this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode); + return is_array($this->fields); + } + + function _close() { + @mysql_free_result($this->_queryID); + $this->_queryID = false; + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + case 'BINARY': + return !empty($fieldobj->binary) ? 'B' : 'X'; + + case 'YEAR': + case 'DATE': return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': return 'T'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'TINYINT': + case 'MEDIUMINT': + case 'SMALLINT': + + if (!empty($fieldobj->primary_key)) return 'R'; + else return 'I'; + + default: return 'N'; + } + } + +} + +class ADORecordSet_ext_mysql extends ADORecordSet_mysql { + function ADORecordSet_ext_mysql($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + return @adodb_movenext($this); + } +} + + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqli.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqli.inc.php new file mode 100644 index 000000000..611d8bd63 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqli.inc.php @@ -0,0 +1,1187 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + + MySQL code that does not support transactions. Use mysqlt if you need transactions. + Requires mysql client. Works on Windows and Unix. + +21 October 2003: MySQLi extension implementation by Arjen de Rijke (a.de.rijke@xs4all.nl) +Based on adodb 3.40 +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (! defined("_ADODB_MYSQLI_LAYER")) { + define("_ADODB_MYSQLI_LAYER", 1 ); + + // PHP5 compat... + if (! defined("MYSQLI_BINARY_FLAG")) define("MYSQLI_BINARY_FLAG", 128); + if (!defined('MYSQLI_READ_DEFAULT_GROUP')) define('MYSQLI_READ_DEFAULT_GROUP',1); + + // disable adodb extension - currently incompatible. + global $ADODB_EXTENSION; $ADODB_EXTENSION = false; + +class ADODB_mysqli extends ADOConnection { + var $databaseType = 'mysqli'; + var $dataProvider = 'native'; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $metaTablesSQL = "SHOW TABLES"; + var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasLimit = true; + var $hasMoveFirst = true; + var $hasGenID = true; + var $isoDates = true; // accepts dates in ISO format + var $sysDate = 'CURDATE()'; + var $sysTimeStamp = 'NOW()'; + var $hasTransactions = true; + var $forceNewConnect = false; + var $poorAffectedRows = true; + var $clientFlags = 0; + var $substr = "substring"; + var $port = false; + var $socket = false; + var $_bindInputArray = false; + var $nameQuote = '`'; /// string to use to quote identifiers and names + var $optionFlags = array(array(MYSQLI_READ_DEFAULT_GROUP,0)); + var $arrayClass = 'ADORecordSet_array_mysqli'; + + function ADODB_mysqli() + { + // if(!extension_loaded("mysqli")) + ;//trigger_error("You must have the mysqli extension installed.", E_USER_ERROR); + + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); + } + + // returns true or false + // To add: parameter int $port, + // parameter string $socket + function _connect($argHostname = NULL, + $argUsername = NULL, + $argPassword = NULL, + $argDatabasename = NULL, $persist=false) + { + if(!extension_loaded("mysqli")) { + return null; + } + $this->_connectionID = @mysqli_init(); + + if (is_null($this->_connectionID)) { + // mysqli_init only fails if insufficient memory + if ($this->debug) + ADOConnection::outp("mysqli_init() failed : " . $this->ErrorMsg()); + return false; + } + /* + I suggest a simple fix which would enable adodb and mysqli driver to + read connection options from the standard mysql configuration file + /etc/my.cnf - "Bastien Duclaux" <bduclaux#yahoo.com> + */ + foreach($this->optionFlags as $arr) { + mysqli_options($this->_connectionID,$arr[0],$arr[1]); + } + + #if (!empty($this->port)) $argHostname .= ":".$this->port; + $ok = mysqli_real_connect($this->_connectionID, + $argHostname, + $argUsername, + $argPassword, + $argDatabasename, + $this->port, + $this->socket, + $this->clientFlags); + + if ($ok) { + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } else { + if ($this->debug) + ADOConnection::outp("Could't connect : " . $this->ErrorMsg()); + $this->_connectionID = null; + return false; + } + } + + // returns true or false + // How to force a persistent connection + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true); + + } + + // When is this used? Close old connection first? + // In _connect(), check $this->forceNewConnect? + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->forceNewConnect = true; + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); + } + + function IfNull( $field, $ifNull ) + { + return " IFNULL($field, $ifNull) "; // if MySQL + } + + // do not use $ADODB_COUNTRECS + function GetOne($sql,$inputarr=false) + { + $ret = false; + $rs = $this->Execute($sql,$inputarr); + if ($rs) { + if (!$rs->EOF) $ret = reset($rs->fields); + $rs->Close(); + } + return $ret; + } + + function ServerInfo() + { + $arr['description'] = $this->GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + + //$this->Execute('SET AUTOCOMMIT=0'); + mysqli_autocommit($this->_connectionID, false); + $this->Execute('BEGIN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('COMMIT'); + + //$this->Execute('SET AUTOCOMMIT=1'); + mysqli_autocommit($this->_connectionID, true); + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('ROLLBACK'); + //$this->Execute('SET AUTOCOMMIT=1'); + mysqli_autocommit($this->_connectionID, true); + return true; + } + + function RowLock($tables,$where='',$flds='1 as adodb_ignore') + { + if ($this->transCnt==0) $this->BeginTrans(); + if ($where) $where = ' where '.$where; + $rs = $this->Execute("select $flds from $tables $where for update"); + return !empty($rs); + } + + // if magic quotes disabled, use mysql_real_escape_string() + // From readme.htm: + // Quotes a string to be sent to the database. The $magic_quotes_enabled + // parameter may look funny, but the idea is if you are quoting a + // string extracted from a POST/GET variable, then + // pass get_magic_quotes_gpc() as the second parameter. This will + // ensure that the variable is not quoted twice, once by qstr and once + // by the magic_quotes_gpc. + // + //Eg. $s = $db->qstr(_GET['name'],get_magic_quotes_gpc()); + function qstr($s, $magic_quotes = false) + { + if (is_null($s)) return 'NULL'; + if (!$magic_quotes) { + if (PHP_VERSION >= 5) + return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'"; + + if ($this->replaceQuote[0] == '\\') + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + return "'$s'"; + } + + function _insertid() + { + $result = @mysqli_insert_id($this->_connectionID); + if ($result == -1){ + if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : " . $this->ErrorMsg()); + } + return $result; + } + + // Only works for INSERT, UPDATE and DELETE query's + function _affectedrows() + { + $result = @mysqli_affected_rows($this->_connectionID); + if ($result == -1) { + if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : " . $this->ErrorMsg()); + } + return $result; + } + + // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html + // Reference on Last_Insert_ID on the recommended way to simulate sequences + var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);"; + var $_genSeqSQL = "create table %s (id int not null)"; + var $_genSeqCountSQL = "select count(*) from %s"; + var $_genSeq2SQL = "insert into %s values (%s)"; + var $_dropSeqSQL = "drop table %s"; + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if (empty($this->_genSeqSQL)) return false; + $u = strtoupper($seqname); + + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); + } + + function GenID($seqname='adodbseq',$startID=1) + { + // post-nuke sets hasGenID to false + if (!$this->hasGenID) return false; + + $getnext = sprintf($this->_genIDSQL,$seqname); + $holdtransOK = $this->_transOK; // save the current status + $rs = @$this->Execute($getnext); + if (!$rs) { + if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset + $u = strtoupper($seqname); + $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname)); + if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); + $rs = $this->Execute($getnext); + } + + if ($rs) { + $this->genID = mysqli_insert_id($this->_connectionID); + $rs->Close(); + } else + $this->genID = 0; + + return $this->genID; + } + + function MetaDatabases() + { + $query = "SHOW DATABASES"; + $ret = $this->Execute($query); + if ($ret && is_object($ret)){ + $arr = array(); + while (!$ret->EOF){ + $db = $ret->Fields('Database'); + if ($db != 'mysql') $arr[] = $db; + $ret->MoveNext(); + } + return $arr; + } + return $ret; + } + + + function MetaIndexes ($table, $primary = FALSE) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + // get index details + $rs = $this->Execute(sprintf('SHOW INDEXES FROM %s',$table)); + + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return $false; + } + + $indexes = array (); + + // parse index data into array + while ($row = $rs->FetchRow()) { + if ($primary == FALSE AND $row[2] == 'PRIMARY') { + continue; + } + + if (!isset($indexes[$row[2]])) { + $indexes[$row[2]] = array( + 'unique' => ($row[1] == 0), + 'columns' => array() + ); + } + + $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4]; + } + + // sort columns by order in the index + foreach ( array_keys ($indexes) as $index ) + { + ksort ($indexes[$index]['columns']); + } + + return $indexes; + } + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'DATE_FORMAT('.$col.",'"; + $concat = false; + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= '%Y'; + break; + case 'Q': + case 'q': + $s .= "'),Quarter($col)"; + + if ($len > $i+1) $s .= ",DATE_FORMAT($col,'"; + else $s .= ",('"; + $concat = true; + break; + case 'M': + $s .= '%b'; + break; + + case 'm': + $s .= '%m'; + break; + case 'D': + case 'd': + $s .= '%d'; + break; + + case 'H': + $s .= '%H'; + break; + + case 'h': + $s .= '%I'; + break; + + case 'i': + $s .= '%i'; + break; + + case 's': + $s .= '%s'; + break; + + case 'a': + case 'A': + $s .= '%p'; + break; + + case 'w': + $s .= '%w'; + break; + + case 'l': + $s .= '%W'; + break; + + default: + + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $ch; + break; + } + } + $s.="')"; + if ($concat) $s = "CONCAT($s)"; + return $s; + } + + // returns concatenated string + // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // suggestion by andrew005@mnogo.ru + $s = implode(',',$arr); + if (strlen($s) > 0) return "CONCAT($s)"; + else return ''; + } + + // dayFraction is a day in floating point + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + + $fraction = $dayFraction * 24 * 3600; + return $date . ' + INTERVAL ' . $fraction.' SECOND'; + +// return "from_unixtime(unix_timestamp($date)+$fraction)"; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $save = $this->metaTablesSQL; + if ($showSchema && is_string($showSchema)) { + $this->metaTablesSQL .= " from $showSchema"; + } + + if ($mask) { + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + $this->metaTablesSQL = $save; + return $ret; + } + + // "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx> + function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE ) + { + global $ADODB_FETCH_MODE; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true; + + if ( !empty($owner) ) { + $table = "$owner.$table"; + } + $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table)); + if ($associative) { + $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"]; + } else $create_sql = $a_create_table[1]; + + $matches = array(); + + if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false; + $foreign_keys = array(); + $num_keys = count($matches[0]); + for ( $i = 0; $i < $num_keys; $i ++ ) { + $my_field = explode('`, `', $matches[1][$i]); + $ref_table = $matches[2][$i]; + $ref_field = explode('`, `', $matches[3][$i]); + + if ( $upper ) { + $ref_table = strtoupper($ref_table); + } + + // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976 + if (!isset($foreign_keys[$ref_table])) { + $foreign_keys[$ref_table] = array(); + } + $num_fields = count($my_field); + for ( $j = 0; $j < $num_fields; $j ++ ) { + if ( $associative ) { + $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j]; + } else { + $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}"; + } + } + } + + return $foreign_keys; + } + + function MetaColumns($table, $normalize=true) + { + $false = false; + if (!$this->metaColumnsSQL) + return $false; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) + $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!is_object($rs)) + return $false; + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $type = $rs->fields[1]; + + // split type into type(length): + $fld->scale = null; + if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; + } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { + $fld->type = $query_array[1]; + $arr = explode(",",$query_array[2]); + $fld->enums = $arr; + $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 + $fld->max_length = ($zlen > 0) ? $zlen : 1; + } else { + $fld->type = $type; + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($type,'blob') !== false); + $fld->unsigned = (strpos($type,'unsigned') !== false); + $fld->zerofill = (strpos($type,'zerofill') !== false); + + if (!$fld->binary) { + $d = $rs->fields[4]; + if ($d != '' && $d != 'NULL') { + $fld->has_default = true; + $fld->default_value = $d; + } else { + $fld->has_default = false; + } + } + + if ($save == ADODB_FETCH_NUM) { + $retarr[] = $fld; + } else { + $retarr[strtoupper($fld->name)] = $fld; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $retarr; + } + + // returns true or false + function SelectDB($dbName) + { +// $this->_connectionID = $this->mysqli_resolve_link($this->_connectionID); + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + + if ($this->_connectionID) { + $result = @mysqli_select_db($this->_connectionID, $dbName); + if (!$result) { + ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg()); + } + return $result; + } + return false; + } + + // parameters use PostgreSQL convention, not MySQL + function SelectLimit($sql, + $nrows = -1, + $offset = -1, + $inputarr = false, + $secs = 0) + { + $offsetStr = ($offset >= 0) ? "$offset," : ''; + if ($nrows < 0) $nrows = '18446744073709551615'; + + if ($secs) + $rs = $this->CacheExecute($secs, $sql . " LIMIT $offsetStr$nrows" , $inputarr ); + else + $rs = $this->Execute($sql . " LIMIT $offsetStr$nrows" , $inputarr ); + + return $rs; + } + + + function Prepare($sql) + { + return $sql; + $stmt = $this->_connectionID->prepare($sql); + if (!$stmt) { + echo $this->ErrorMsg(); + return $sql; + } + return array($sql,$stmt); + } + + + // returns queryID or false + function _query($sql, $inputarr) + { + global $ADODB_COUNTRECS; + // Move to the next recordset, or return false if there is none. In a stored proc + // call, mysqli_next_result returns true for the last "recordset", but mysqli_store_result + // returns false. I think this is because the last "recordset" is actually just the + // return value of the stored proc (ie the number of rows affected). + // Commented out for reasons of performance. You should retrieve every recordset yourself. + // if (!mysqli_next_result($this->connection->_connectionID)) return false; + + if (is_array($sql)) { + + // Prepare() not supported because mysqli_stmt_execute does not return a recordset, but + // returns as bound variables. + + $stmt = $sql[1]; + $a = ''; + foreach($inputarr as $k => $v) { + if (is_string($v)) $a .= 's'; + else if (is_integer($v)) $a .= 'i'; + else $a .= 'd'; + } + + $fnarr = array_merge( array($stmt,$a) , $inputarr); + $ret = call_user_func_array('mysqli_stmt_bind_param',$fnarr); + $ret = mysqli_stmt_execute($stmt); + return $ret; + } + + /* + if (!$mysql_res = mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) { + if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg()); + return false; + } + + return $mysql_res; + */ + + if( $rs = mysqli_multi_query($this->_connectionID, $sql.';') )//Contributed by "Geisel Sierote" <geisel#4up.com.br> + { + $rs = ($ADODB_COUNTRECS) ? @mysqli_store_result( $this->_connectionID ) : @mysqli_use_result( $this->_connectionID ); + return $rs ? $rs : true; // mysqli_more_results( $this->_connectionID ) + } else { + if($this->debug) + ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg()); + return false; + } + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + if (empty($this->_connectionID)) + $this->_errorMsg = @mysqli_connect_error(); + else + $this->_errorMsg = @mysqli_error($this->_connectionID); + return $this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + if (empty($this->_connectionID)) + return @mysqli_connect_errno(); + else + return @mysqli_errno($this->_connectionID); + } + + // returns true or false + function _close() + { + @mysqli_close($this->_connectionID); + $this->_connectionID = false; + } + + /* + * Maximum size of C field + */ + function CharMax() + { + return 255; + } + + /* + * Maximum size of X field + */ + function TextMax() + { + return 4294967295; + } + + + + // this is a set of functions for managing client encoding - very important if the encodings + // of your database and your output target (i.e. HTML) don't match + // for instance, you may have UTF8 database and server it on-site as latin1 etc. + // GetCharSet - get the name of the character set the client is using now + // Under Windows, the functions should work with MySQL 4.1.11 and above, the set of charsets supported + // depends on compile flags of mysql distribution + + function GetCharSet() + { + //we will use ADO's builtin property charSet + if (!method_exists($this->_connectionID,'character_set_name')) + return false; + + $this->charSet = @$this->_connectionID->character_set_name(); + if (!$this->charSet) { + return false; + } else { + return $this->charSet; + } + } + + // SetCharSet - switch the client encoding + function SetCharSet($charset_name) + { + if (!method_exists($this->_connectionID,'set_charset')) + return false; + + if ($this->charSet !== $charset_name) { + $if = @$this->_connectionID->set_charset($charset_name); + if ($if == "0" & $this->GetCharSet() == $charset_name) { + return true; + } else return false; + } else return true; + } + + + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_mysqli extends ADORecordSet{ + + var $databaseType = "mysqli"; + var $canSeek = true; + + function ADORecordSet_mysqli($queryID, $mode = false) + { + if ($mode === false) + { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + + switch ($mode) + { + case ADODB_FETCH_NUM: + $this->fetchMode = MYSQLI_NUM; + break; + case ADODB_FETCH_ASSOC: + $this->fetchMode = MYSQLI_ASSOC; + break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQLI_BOTH; + break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function _initrs() + { + global $ADODB_COUNTRECS; + + $this->_numOfRows = $ADODB_COUNTRECS ? @mysqli_num_rows($this->_queryID) : -1; + $this->_numOfFields = @mysqli_num_fields($this->_queryID); + } + +/* +1 = MYSQLI_NOT_NULL_FLAG +2 = MYSQLI_PRI_KEY_FLAG +4 = MYSQLI_UNIQUE_KEY_FLAG +8 = MYSQLI_MULTIPLE_KEY_FLAG +16 = MYSQLI_BLOB_FLAG +32 = MYSQLI_UNSIGNED_FLAG +64 = MYSQLI_ZEROFILL_FLAG +128 = MYSQLI_BINARY_FLAG +256 = MYSQLI_ENUM_FLAG +512 = MYSQLI_AUTO_INCREMENT_FLAG +1024 = MYSQLI_TIMESTAMP_FLAG +2048 = MYSQLI_SET_FLAG +32768 = MYSQLI_NUM_FLAG +16384 = MYSQLI_PART_KEY_FLAG +32768 = MYSQLI_GROUP_FLAG +65536 = MYSQLI_UNIQUE_FLAG +131072 = MYSQLI_BINCMP_FLAG +*/ + + function FetchField($fieldOffset = -1) + { + $fieldnr = $fieldOffset; + if ($fieldOffset != -1) { + $fieldOffset = @mysqli_field_seek($this->_queryID, $fieldnr); + } + $o = @mysqli_fetch_field($this->_queryID); + if (!$o) return false; + /* Properties of an ADOFieldObject as set by MetaColumns */ + $o->primary_key = $o->flags & MYSQLI_PRI_KEY_FLAG; + $o->not_null = $o->flags & MYSQLI_NOT_NULL_FLAG; + $o->auto_increment = $o->flags & MYSQLI_AUTO_INCREMENT_FLAG; + $o->binary = $o->flags & MYSQLI_BINARY_FLAG; + // $o->blob = $o->flags & MYSQLI_BLOB_FLAG; /* not returned by MetaColumns */ + $o->unsigned = $o->flags & MYSQLI_UNSIGNED_FLAG; + + return $o; + } + + function GetRowAssoc($upper = true) + { + if ($this->fetchMode == MYSQLI_ASSOC && !$upper) + return $this->fields; + $row = ADORecordSet::GetRowAssoc($upper); + return $row; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != MYSQLI_NUM) + return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i = 0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _seek($row) + { + if ($this->_numOfRows == 0) + return false; + + if ($row < 0) + return false; + + mysqli_data_seek($this->_queryID, $row); + $this->EOF = false; + return true; + } + + + function NextRecordSet() + { + global $ADODB_COUNTRECS; + + mysqli_free_result($this->_queryID); + $this->_queryID = -1; + // Move to the next recordset, or return false if there is none. In a stored proc + // call, mysqli_next_result returns true for the last "recordset", but mysqli_store_result + // returns false. I think this is because the last "recordset" is actually just the + // return value of the stored proc (ie the number of rows affected). + if(!mysqli_next_result($this->connection->_connectionID)) { + return false; + } + // CD: There is no $this->_connectionID variable, at least in the ADO version I'm using + $this->_queryID = ($ADODB_COUNTRECS) ? @mysqli_store_result( $this->connection->_connectionID ) + : @mysqli_use_result( $this->connection->_connectionID ); + if(!$this->_queryID) { + return false; + } + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + // 10% speedup to move MoveNext to child class + // This is the only implementation that works now (23-10-2003). + // Other functions return no or the wrong results. + function MoveNext() + { + if ($this->EOF) return false; + $this->_currentRow++; + $this->fields = @mysqli_fetch_array($this->_queryID,$this->fetchMode); + + if (is_array($this->fields)) return true; + $this->EOF = true; + return false; + } + + function _fetch() + { + $this->fields = mysqli_fetch_array($this->_queryID,$this->fetchMode); + return is_array($this->fields); + } + + function _close() + { + mysqli_free_result($this->_queryID); + $this->_queryID = false; + } + +/* + +0 = MYSQLI_TYPE_DECIMAL +1 = MYSQLI_TYPE_CHAR +1 = MYSQLI_TYPE_TINY +2 = MYSQLI_TYPE_SHORT +3 = MYSQLI_TYPE_LONG +4 = MYSQLI_TYPE_FLOAT +5 = MYSQLI_TYPE_DOUBLE +6 = MYSQLI_TYPE_NULL +7 = MYSQLI_TYPE_TIMESTAMP +8 = MYSQLI_TYPE_LONGLONG +9 = MYSQLI_TYPE_INT24 +10 = MYSQLI_TYPE_DATE +11 = MYSQLI_TYPE_TIME +12 = MYSQLI_TYPE_DATETIME +13 = MYSQLI_TYPE_YEAR +14 = MYSQLI_TYPE_NEWDATE +247 = MYSQLI_TYPE_ENUM +248 = MYSQLI_TYPE_SET +249 = MYSQLI_TYPE_TINY_BLOB +250 = MYSQLI_TYPE_MEDIUM_BLOB +251 = MYSQLI_TYPE_LONG_BLOB +252 = MYSQLI_TYPE_BLOB +253 = MYSQLI_TYPE_VAR_STRING +254 = MYSQLI_TYPE_STRING +255 = MYSQLI_TYPE_GEOMETRY +*/ + + function MetaType($t, $len = -1, $fieldobj = false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + + case MYSQLI_TYPE_TINY_BLOB : + #case MYSQLI_TYPE_CHAR : + case MYSQLI_TYPE_STRING : + case MYSQLI_TYPE_ENUM : + case MYSQLI_TYPE_SET : + case 253 : + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + + case MYSQLI_TYPE_BLOB : + case MYSQLI_TYPE_LONG_BLOB : + case MYSQLI_TYPE_MEDIUM_BLOB : + + return !empty($fieldobj->binary) ? 'B' : 'X'; + case 'YEAR': + case 'DATE': + case MYSQLI_TYPE_DATE : + case MYSQLI_TYPE_YEAR : + + return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + + case MYSQLI_TYPE_DATETIME : + case MYSQLI_TYPE_NEWDATE : + case MYSQLI_TYPE_TIME : + case MYSQLI_TYPE_TIMESTAMP : + + return 'T'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'TINYINT': + case 'MEDIUMINT': + case 'SMALLINT': + + case MYSQLI_TYPE_INT24 : + case MYSQLI_TYPE_LONG : + case MYSQLI_TYPE_LONGLONG : + case MYSQLI_TYPE_SHORT : + case MYSQLI_TYPE_TINY : + + if (!empty($fieldobj->primary_key)) return 'R'; + + return 'I'; + + + // Added floating-point types + // Maybe not necessery. + case 'FLOAT': + case 'DOUBLE': + // case 'DOUBLE PRECISION': + case 'DECIMAL': + case 'DEC': + case 'FIXED': + default: + //if (!is_numeric($t)) echo "<p>--- Error in type matching $t -----</p>"; + return 'N'; + } + } // function + + +} // rs class + +} + +class ADORecordSet_array_mysqli extends ADORecordSet_array { + + function ADORecordSet_array_mysqli($id=-1,$mode=false) + { + $this->ADORecordSet_array($id,$mode); + } + + function MetaType($t, $len = -1, $fieldobj = false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + + case MYSQLI_TYPE_TINY_BLOB : + #case MYSQLI_TYPE_CHAR : + case MYSQLI_TYPE_STRING : + case MYSQLI_TYPE_ENUM : + case MYSQLI_TYPE_SET : + case 253 : + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + + case MYSQLI_TYPE_BLOB : + case MYSQLI_TYPE_LONG_BLOB : + case MYSQLI_TYPE_MEDIUM_BLOB : + + return !empty($fieldobj->binary) ? 'B' : 'X'; + case 'YEAR': + case 'DATE': + case MYSQLI_TYPE_DATE : + case MYSQLI_TYPE_YEAR : + + return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + + case MYSQLI_TYPE_DATETIME : + case MYSQLI_TYPE_NEWDATE : + case MYSQLI_TYPE_TIME : + case MYSQLI_TYPE_TIMESTAMP : + + return 'T'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'TINYINT': + case 'MEDIUMINT': + case 'SMALLINT': + + case MYSQLI_TYPE_INT24 : + case MYSQLI_TYPE_LONG : + case MYSQLI_TYPE_LONGLONG : + case MYSQLI_TYPE_SHORT : + case MYSQLI_TYPE_TINY : + + if (!empty($fieldobj->primary_key)) return 'R'; + + return 'I'; + + + // Added floating-point types + // Maybe not necessery. + case 'FLOAT': + case 'DOUBLE': + // case 'DOUBLE PRECISION': + case 'DECIMAL': + case 'DEC': + case 'FIXED': + default: + //if (!is_numeric($t)) echo "<p>--- Error in type matching $t -----</p>"; + return 'N'; + } + } // function + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqlpo.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqlpo.inc.php new file mode 100644 index 000000000..811510b02 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqlpo.inc.php @@ -0,0 +1,138 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + + MySQL code that supports transactions. For MySQL 3.23 or later. + Code from James Poon <jpoon88@yahoo.com> + + Requires mysql client. Works on Windows and Unix. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php"); + + +class ADODB_mysqlt extends ADODB_mysql { + var $databaseType = 'mysqlt'; + var $ansiOuter = true; // for Version 3.23.17 or later + var $hasTransactions = true; + var $autoRollback = true; // apparently mysql does not autorollback properly + + function ADODB_mysqlt() + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_'; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->Execute('SET AUTOCOMMIT=0'); + $this->Execute('BEGIN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('COMMIT'); + $this->Execute('SET AUTOCOMMIT=1'); + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->Execute('ROLLBACK'); + $this->Execute('SET AUTOCOMMIT=1'); + return true; + } + + function RowLock($tables,$where='',$flds='1 as adodb_ignore') + { + if ($this->transCnt==0) $this->BeginTrans(); + if ($where) $where = ' where '.$where; + $rs = $this->Execute("select $flds from $tables $where for update"); + return !empty($rs); + } + +} + +class ADORecordSet_mysqlt extends ADORecordSet_mysql{ + var $databaseType = "mysqlt"; + + function ADORecordSet_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = MYSQL_BOTH; break; + } + + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } +} + +class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt { + + function ADORecordSet_ext_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + return adodb_movenext($this); + } +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqlt.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqlt.inc.php new file mode 100644 index 000000000..47b52a779 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-mysqlt.inc.php @@ -0,0 +1,155 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + + MySQL code that supports transactions. For MySQL 3.23 or later. + Code from James Poon <jpoon88@yahoo.com> + + Requires mysql client. Works on Windows and Unix. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php"); + + +class ADODB_mysqlt extends ADODB_mysql { + var $databaseType = 'mysqlt'; + var $ansiOuter = true; // for Version 3.23.17 or later + var $hasTransactions = true; + var $autoRollback = true; // apparently mysql does not autorollback properly + + function ADODB_mysqlt() + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_'; + } + + /* set transaction mode + + SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL +{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } + + */ + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->Execute('SET AUTOCOMMIT=0'); + $this->Execute('BEGIN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('COMMIT'); + $this->Execute('SET AUTOCOMMIT=1'); + return $ok ? true : false; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ok = $this->Execute('ROLLBACK'); + $this->Execute('SET AUTOCOMMIT=1'); + return $ok ? true : false; + } + + function RowLock($tables,$where='',$flds='1 as adodb_ignore') + { + if ($this->transCnt==0) $this->BeginTrans(); + if ($where) $where = ' where '.$where; + $rs = $this->Execute("select $flds from $tables $where for update"); + return !empty($rs); + } + +} + +class ADORecordSet_mysqlt extends ADORecordSet_mysql{ + var $databaseType = "mysqlt"; + + function ADORecordSet_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = MYSQL_BOTH; break; + } + + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } +} + +class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt { + + function ADORecordSet_ext_mysqlt($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + return adodb_movenext($this); + } +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-netezza.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-netezza.inc.php new file mode 100644 index 000000000..72e72f40b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-netezza.inc.php @@ -0,0 +1,170 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + + First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com + Based on the previous postgres drivers. + http://www.netezza.com/ + Major Additions/Changes: + MetaDatabasesSQL, MetaTablesSQL, MetaColumnsSQL + Note: You have to have admin privileges to access the system tables + Removed non-working keys code (Netezza has no concept of keys) + Fixed the way data types and lengths are returned in MetaColumns() + as well as added the default lengths for certain types + Updated public variables for Netezza + Still need to remove blob functions, as Netezza doesn't suppport blob +*/ +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR.'/drivers/adodb-postgres64.inc.php'); + +class ADODB_netezza extends ADODB_postgres64 { + var $databaseType = 'netezza'; + var $dataProvider = 'netezza'; + var $hasInsertID = false; + var $_resultid = false; + var $concat_operator='||'; + var $random = 'random'; + var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1"; + var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1"; + var $isoDates = true; // accepts dates in ISO format + var $sysDate = "CURRENT_DATE"; + var $sysTimeStamp = "CURRENT_TIMESTAMP"; + var $blobEncodeType = 'C'; + var $metaColumnsSQL = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum"; + var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum"; + // netezza doesn't have keys. it does have distributions, so maybe this is + // something that can be pulled from the system tables + var $metaKeySQL = ""; + var $hasAffectedRows = true; + var $hasLimit = true; + var $true = 't'; // string that represents TRUE for a database + var $false = 'f'; // string that represents FALSE for a database + var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt. + var $ansiOuter = true; + var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4 + // http://bugs.php.net/bug.php?id=25404 + + + function ADODB_netezza() + { + + } + + function MetaColumns($table,$upper=true) + { + + // Changed this function to support Netezza which has no concept of keys + // could posisbly work on other things from the system table later. + + global $ADODB_FETCH_MODE; + + $table = strtolower($table); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) return false; + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + + // since we're returning type and length as one string, + // split them out here. + + if ($first = strstr($rs->fields[1], "(")) { + $fld->max_length = trim($first, "()"); + } else { + $fld->max_length = -1; + } + + if ($first = strpos($rs->fields[1], "(")) { + $fld->type = substr($rs->fields[1], 0, $first); + } else { + $fld->type = $rs->fields[1]; + } + + switch ($fld->type) { + case "byteint": + case "boolean": + $fld->max_length = 1; + break; + case "smallint": + $fld->max_length = 2; + break; + case "integer": + case "numeric": + case "date": + $fld->max_length = 4; + break; + case "bigint": + case "time": + case "timestamp": + $fld->max_length = 8; + break; + case "timetz": + case "time with time zone": + $fld->max_length = 12; + break; + } + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_netezza extends ADORecordSet_postgres64 +{ + var $databaseType = "netezza"; + var $canSeek = true; + + function ADORecordSet_netezza($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = PGSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + // _initrs modified to disable blob handling + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($this->_queryID):-1; + $this->_numOfFields = @pg_numfields($this->_queryID); + } + +} +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-oci8.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-oci8.inc.php new file mode 100644 index 000000000..95fa799bf --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-oci8.inc.php @@ -0,0 +1,1616 @@ +<?php +/* + + version V5.06 16 Oct 2008 (c) 2000-2009 John Lim. All rights reserved. + + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Latest version is available at http://adodb.sourceforge.net + + Code contributed by George Fourlanos <fou@infomap.gr> + + 13 Nov 2000 jlim - removed all ora_* references. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* +NLS_Date_Format +Allows you to use a date format other than the Oracle Lite default. When a literal +character string appears where a date value is expected, the Oracle Lite database +tests the string to see if it matches the formats of Oracle, SQL-92, or the value +specified for this parameter in the POLITE.INI file. Setting this parameter also +defines the default format used in the TO_CHAR or TO_DATE functions when no +other format string is supplied. + +For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is +yy-mm-dd or yyyy-mm-dd. + +Using 'RR' in the format forces two-digit years less than or equal to 49 to be +interpreted as years in the 21st century (2000–2049), and years over 50 as years in +the 20th century (1950–1999). Setting the RR format as the default for all two-digit +year entries allows you to become year-2000 compliant. For example: +NLS_DATE_FORMAT='RR-MM-DD' + +You can also modify the date format using the ALTER SESSION command. +*/ + +# define the LOB descriptor type for the given type +# returns false if no LOB descriptor +function oci_lob_desc($type) { + switch ($type) { + case OCI_B_BFILE: $result = OCI_D_FILE; break; + case OCI_B_CFILEE: $result = OCI_D_FILE; break; + case OCI_B_CLOB: $result = OCI_D_LOB; break; + case OCI_B_BLOB: $result = OCI_D_LOB; break; + case OCI_B_ROWID: $result = OCI_D_ROWID; break; + default: $result = false; break; + } + return $result; +} + +class ADODB_oci8 extends ADOConnection { + var $databaseType = 'oci8'; + var $dataProvider = 'oci8'; + var $replaceQuote = "''"; // string to use to replace quotes + var $concat_operator='||'; + var $sysDate = "TRUNC(SYSDATE)"; + var $sysTimeStamp = 'SYSDATE'; // requires oracle 9 or later, otherwise use SYSDATE + var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1"; + var $_stmt; + var $_commit = OCI_COMMIT_ON_SUCCESS; + var $_initdate = true; // init date to YYYY-MM-DD + var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW') and table_name not like 'BIN\$%'"; // bin$ tables are recycle bin tables + var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net + var $_bindInputArray = true; + var $hasGenID = true; + var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL"; + var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $hasAffectedRows = true; + var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)"; + var $noNullStrings = false; + var $connectSID = false; + var $_bind = false; + var $_nestedSQL = true; + var $_hasOCIFetchStatement = false; + var $_getarray = false; // currently not working + var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER + var $session_sharing_force_blob = false; // alter session on updateblob if set to true + var $firstrows = true; // enable first rows optimization on SelectLimit() + var $selectOffsetAlg1 = 1000; // when to use 1st algorithm of selectlimit. + var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS' + var $dateformat = 'YYYY-MM-DD'; // DBDate format + var $useDBDateFormatForTextInput=false; + var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true) + var $_refLOBs = array(); + + // var $ansiOuter = true; // if oracle9 + + function ADODB_oci8() + { + $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; + if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_'; + } + + /* function MetaColumns($table, $normalize=true) added by smondino@users.sourceforge.net*/ + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!$rs) { + return $false; + } + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + $fld->scale = $rs->fields[3]; + if ($rs->fields[1] == 'NUMBER') { + if ($rs->fields[3] == 0) $fld->type = 'INT'; + $fld->max_length = $rs->fields[4]; + } + $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); + $fld->binary = (strpos($fld->type,'BLOB') !== false); + $fld->default_value = $rs->fields[6]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) + return $false; + else + return $retarr; + } + + function Time() + { + $rs = $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual"); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + +/* + + Multiple modes of connection are supported: + + a. Local Database + $conn->Connect(false,'scott','tiger'); + + b. From tnsnames.ora + $conn->Connect(false,'scott','tiger',$tnsname); + $conn->Connect($tnsname,'scott','tiger'); + + c. Server + service name + $conn->Connect($serveraddress,'scott,'tiger',$service_name); + + d. Server + SID + $conn->connectSID = true; + $conn->Connect($serveraddress,'scott,'tiger',$SID); + + +Example TNSName: +--------------- +NATSOFT.DOMAIN = + (DESCRIPTION = + (ADDRESS_LIST = + (ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523)) + ) + (CONNECT_DATA = + (SERVICE_NAME = natsoft.domain) + ) + ) + + There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection + +*/ + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0) + { + if (!function_exists('OCIPLogon')) return null; + #adodb_backtrace(); + + $this->_errorMsg = false; + $this->_errorCode = false; + + if($argHostname) { // added by Jorma Tuomainen <jorma.tuomainen@ppoy.fi> + if (empty($argDatabasename)) $argDatabasename = $argHostname; + else { + if(strpos($argHostname,":")) { + $argHostinfo=explode(":",$argHostname); + $argHostname=$argHostinfo[0]; + $argHostport=$argHostinfo[1]; + } else { + $argHostport = empty($this->port)? "1521" : $this->port; + } + + if (strncasecmp($argDatabasename,'SID=',4) == 0) { + $argDatabasename = substr($argDatabasename,4); + $this->connectSID = true; + } + + if ($this->connectSID) { + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; + } else + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; + } + } + + //if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>"; + if ($mode==1) { + $this->_connectionID = ($this->charSet) ? + OCIPLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) + : + OCIPLogon($argUsername,$argPassword, $argDatabasename) + ; + if ($this->_connectionID && $this->autoRollback) OCIrollback($this->_connectionID); + } else if ($mode==2) { + $this->_connectionID = ($this->charSet) ? + OCINLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) + : + OCINLogon($argUsername,$argPassword, $argDatabasename); + + } else { + $this->_connectionID = ($this->charSet) ? + OCILogon($argUsername,$argPassword, $argDatabasename,$this->charSet) + : + OCILogon($argUsername,$argPassword, $argDatabasename); + } + if (!$this->_connectionID) return false; + if ($this->_initdate) { + $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); + } + + // looks like: + // Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production + // $vers = OCIServerVersion($this->_connectionID); + // if (strpos($vers,'8i') !== false) $this->ansiOuter = true; + return true; + } + + function ServerInfo() + { + $arr['compat'] = $this->GetOne('select value from sys.database_compatible_level'); + $arr['description'] = @OCIServerVersion($this->_connectionID); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1); + } + + // returns true or false + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,2); + } + + function _affectedrows() + { + if (is_resource($this->_stmt)) return @OCIRowCount($this->_stmt); + return 0; + } + + function IfNull( $field, $ifNull ) + { + return " NVL($field, $ifNull) "; // if Oracle + } + + // format and return date string in database date format + function DBDate($d,$isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return 'TO_DATE('.$d.",'".$this->dateformat."')"; + + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + + if (is_object($d)) $ds = $d->format($this->fmtDate); + else $ds = adodb_date($this->fmtDate,$d); + + return "TO_DATE(".$ds.",'".$this->dateformat."')"; + } + + function BindDate($d) + { + $d = ADOConnection::DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($ts) + { + if (empty($ts) && $ts !== 0) return 'null'; + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + + if (is_object($ts)) $tss = $ts->format("'Y-m-d H:i:s'"); + else $tss = adodb_date("'Y-m-d H:i:s'",$ts); + + return $tss; + } + + // format and return date string in database timestamp format + function DBTimeStamp($ts,$isfld=false) + { + if (empty($ts) && $ts !== 0) return 'null'; + if ($isfld) return 'TO_DATE(substr('.$ts.",1,19),'RRRR-MM-DD, HH24:MI:SS')"; + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + + if (is_object($ts)) $tss = $ts->format("'Y-m-d H:i:s'"); + else $tss = adodb_date("'Y-m-d H:i:s'",$ts); + + return 'TO_DATE('.$tss.",'RRRR-MM-DD, HH24:MI:SS')"; + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if ($this->autoCommit) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtoupper($mask)); + $this->metaTablesSQL .= " AND upper(table_name) like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + // Mark Newnham + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + // get index details + $table = strtoupper($table); + + // get Primary index + $primary_key = ''; + + $false = false; + $rs = $this->Execute(sprintf("SELECT * FROM ALL_CONSTRAINTS WHERE UPPER(TABLE_NAME)='%s' AND CONSTRAINT_TYPE='P'",$table)); + if ($row = $rs->FetchRow()) + $primary_key = $row[1]; //constraint_name + + if ($primary==TRUE && $primary_key=='') { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; //There is no primary key + } + + $rs = $this->Execute(sprintf("SELECT ALL_INDEXES.INDEX_NAME, ALL_INDEXES.UNIQUENESS, ALL_IND_COLUMNS.COLUMN_POSITION, ALL_IND_COLUMNS.COLUMN_NAME FROM ALL_INDEXES,ALL_IND_COLUMNS WHERE UPPER(ALL_INDEXES.TABLE_NAME)='%s' AND ALL_IND_COLUMNS.INDEX_NAME=ALL_INDEXES.INDEX_NAME",$table)); + + + if (!is_object($rs)) { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; + } + + $indexes = array (); + // parse index data into array + + while ($row = $rs->FetchRow()) { + if ($primary && $row[0] != $primary_key) continue; + if (!isset($indexes[$row[0]])) { + $indexes[$row[0]] = array( + 'unique' => ($row[1] == 'UNIQUE'), + 'columns' => array() + ); + } + $indexes[$row[0]]['columns'][$row[2] - 1] = $row[3]; + } + + // sort columns by order in the index + foreach ( array_keys ($indexes) as $index ) { + ksort ($indexes[$index]['columns']); + } + + if (isset($savem)) { + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + } + return $indexes; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + $this->_commit = OCI_DEFAULT; + + if ($this->_transmode) $ok = $this->Execute("SET TRANSACTION ".$this->_transmode); + else $ok = true; + + return $ok ? true : false; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + if ($this->transCnt) $this->transCnt -= 1; + $ret = OCIcommit($this->_connectionID); + $this->_commit = OCI_COMMIT_ON_SUCCESS; + $this->autoCommit = true; + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $ret = OCIrollback($this->_connectionID); + $this->_commit = OCI_COMMIT_ON_SUCCESS; + $this->autoCommit = true; + return $ret; + } + + + function SelectDB($dbName) + { + return false; + } + + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + + if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); + if (empty($arr)) { + if (is_resource($this->_connectionID)) $arr = @OCIError($this->_connectionID); + else $arr = @OCIError(); + if ($arr === false) return ''; + } + $this->_errorMsg = $arr['message']; + $this->_errorCode = $arr['code']; + return $this->_errorMsg; + } + + function ErrorNo() + { + if ($this->_errorCode !== false) return $this->_errorCode; + + if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); + if (empty($arr)) { + $arr = @OCIError($this->_connectionID); + if ($arr == false) $arr = @OCIError(); + if ($arr == false) return ''; + } + + $this->_errorMsg = $arr['message']; + $this->_errorCode = $arr['code']; + + return $arr['code']; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'TO_CHAR('.$col.",'"; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= 'YYYY'; + break; + case 'Q': + case 'q': + $s .= 'Q'; + break; + + case 'M': + $s .= 'Mon'; + break; + + case 'm': + $s .= 'MM'; + break; + case 'D': + case 'd': + $s .= 'DD'; + break; + + case 'H': + $s.= 'HH24'; + break; + + case 'h': + $s .= 'HH'; + break; + + case 'i': + $s .= 'MI'; + break; + + case 's': + $s .= 'SS'; + break; + + case 'a': + case 'A': + $s .= 'AM'; + break; + + case 'w': + $s .= 'D'; + break; + + case 'l': + $s .= 'DAY'; + break; + + case 'W': + $s .= 'WW'; + break; + + default: + // handle escape characters... + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; + else $s .= '"'.$ch.'"'; + + } + } + return $s. "')"; + } + + function GetRandRow($sql, $arr = false) + { + $sql = "SELECT * FROM ($sql ORDER BY dbms_random.value) WHERE rownum = 1"; + + return $this->GetRow($sql,$arr); + } + + /* + This algorithm makes use of + + a. FIRST_ROWS hint + The FIRST_ROWS hint explicitly chooses the approach to optimize response time, + that is, minimum resource usage to return the first row. Results will be returned + as soon as they are identified. + + b. Uses rownum tricks to obtain only the required rows from a given offset. + As this uses complicated sql statements, we only use this if the $offset >= 100. + This idea by Tomas V V Cox. + + This implementation does not appear to work with oracle 8.0.5 or earlier. Comment + out this function then, and the slower SelectLimit() in the base class will be used. + */ + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + // seems that oracle only supports 1 hint comment in 8i + if ($this->firstrows) { + if (strpos($sql,'/*+') !== false) + $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); + else + $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); + } + + if ($offset == -1 || ($offset < $this->selectOffsetAlg1 && 0 < $nrows && $nrows < 1000)) { + if ($nrows > 0) { + if ($offset > 0) $nrows += $offset; + //$inputarr['adodb_rownum'] = $nrows; + if ($this->databaseType == 'oci8po') { + $sql = "select * from (".$sql.") where rownum <= ?"; + } else { + $sql = "select * from (".$sql.") where rownum <= :adodb_offset"; + } + $inputarr['adodb_offset'] = $nrows; + $nrows = -1; + } + // note that $nrows = 0 still has to work ==> no rows returned + + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $rs; + + } else { + // Algorithm by Tomas V V Cox, from PEAR DB oci8.php + + // Let Oracle return the name of the columns + $q_fields = "SELECT * FROM (".$sql.") WHERE NULL = NULL"; + + $false = false; + if (! $stmt_arr = $this->Prepare($q_fields)) { + return $false; + } + $stmt = $stmt_arr[1]; + + if (is_array($inputarr)) { + foreach($inputarr as $k => $v) { + if (is_array($v)) { + if (sizeof($v) == 2) // suggested by g.giunta@libero. + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); + else + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); + } else { + $len = -1; + if ($v === ' ') $len = 1; + if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again + $bindarr[$k] = $v; + } else { // dynamic sql, so rebind every time + OCIBindByName($stmt,":$k",$inputarr[$k],$len); + + } + } + } + } + + if (!OCIExecute($stmt, OCI_DEFAULT)) { + OCIFreeStatement($stmt); + return $false; + } + + $ncols = OCINumCols($stmt); + for ( $i = 1; $i <= $ncols; $i++ ) { + $cols[] = '"'.OCIColumnName($stmt, $i).'"'; + } + $result = false; + + OCIFreeStatement($stmt); + $fields = implode(',', $cols); + if ($nrows <= 0) $nrows = 999999999999; + else $nrows += $offset; + $offset += 1; // in Oracle rownum starts at 1 + + if ($this->databaseType == 'oci8po') { + $sql = "SELECT /*+ FIRST_ROWS */ $fields FROM". + "(SELECT rownum as adodb_rownum, $fields FROM". + " ($sql) WHERE rownum <= ?". + ") WHERE adodb_rownum >= ?"; + } else { + $sql = "SELECT /*+ FIRST_ROWS */ $fields FROM". + "(SELECT rownum as adodb_rownum, $fields FROM". + " ($sql) WHERE rownum <= :adodb_nrows". + ") WHERE adodb_rownum >= :adodb_offset"; + } + $inputarr['adodb_nrows'] = $nrows; + $inputarr['adodb_offset'] = $offset; + + if ($secs2cache>0) $rs = $this->CacheExecute($secs2cache, $sql,$inputarr); + else $rs = $this->Execute($sql,$inputarr); + return $rs; + } + + } + + /** + * Usage: + * Store BLOBs and CLOBs + * + * Example: to store $var in a blob + * + * $conn->Execute('insert into TABLE (id,ablob) values(12,empty_blob())'); + * $conn->UpdateBlob('TABLE', 'ablob', $varHoldingBlob, 'ID=12', 'BLOB'); + * + * $blobtype supports 'BLOB' and 'CLOB', but you need to change to 'empty_clob()'. + * + * to get length of LOB: + * select DBMS_LOB.GETLENGTH(ablob) from TABLE + * + * If you are using CURSOR_SHARING = force, it appears this will case a segfault + * under oracle 8.1.7.0. Run: + * $db->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); + * before UpdateBlob() then... + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + //if (strlen($val) < 4000) return $this->Execute("UPDATE $table SET $column=:blob WHERE $where",array('blob'=>$val)) != false; + + switch(strtoupper($blobtype)) { + default: ADOConnection::outp("<b>UpdateBlob</b>: Unknown blobtype=$blobtype"); return false; + case 'BLOB': $type = OCI_B_BLOB; break; + case 'CLOB': $type = OCI_B_CLOB; break; + } + + if ($this->databaseType == 'oci8po') + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; + else + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; + + $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); + $arr['blob'] = array($desc,-1,$type); + if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); + $commit = $this->autoCommit; + if ($commit) $this->BeginTrans(); + $rs = $this->_Execute($sql,$arr); + if ($rez = !empty($rs)) $desc->save($val); + $desc->free(); + if ($commit) $this->CommitTrans(); + if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=FORCE'); + + if ($rez) $rs->Close(); + return $rez; + } + + /** + * Usage: store file pointed to by $val in a blob + */ + function UpdateBlobFile($table,$column,$val,$where,$blobtype='BLOB') + { + switch(strtoupper($blobtype)) { + default: ADOConnection::outp( "<b>UpdateBlob</b>: Unknown blobtype=$blobtype"); return false; + case 'BLOB': $type = OCI_B_BLOB; break; + case 'CLOB': $type = OCI_B_CLOB; break; + } + + if ($this->databaseType == 'oci8po') + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; + else + $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; + + $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); + $arr['blob'] = array($desc,-1,$type); + + $this->BeginTrans(); + $rs = ADODB_oci8::Execute($sql,$arr); + if ($rez = !empty($rs)) $desc->savefile($val); + $desc->free(); + $this->CommitTrans(); + + if ($rez) $rs->Close(); + return $rez; + } + + /** + * Execute SQL + * + * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) + * @param [inputarr] holds the input data to bind to. Null elements will be set to null. + * @return RecordSet or false + */ + function Execute($sql,$inputarr=false) + { + if ($this->fnExecute) { + $fn = $this->fnExecute; + $ret = $fn($this,$sql,$inputarr); + if (isset($ret)) return $ret; + } + if ($inputarr) { + #if (!is_array($inputarr)) $inputarr = array($inputarr); + + $element0 = reset($inputarr); + + if (!$this->_bindInputArray) { + # is_object check because oci8 descriptors can be passed in + if (is_array($element0) && !is_object(reset($element0))) { + if (is_string($sql)) + $stmt = $this->Prepare($sql); + else + $stmt = $sql; + + foreach($inputarr as $arr) { + $ret = $this->_Execute($stmt,$arr); + if (!$ret) return $ret; + } + } else { + $sqlarr = explode(':',$sql); + $sql = ''; + $lastnomatch = -2; + #var_dump($sqlarr);echo "<hr>";var_dump($inputarr);echo"<hr>"; + foreach($sqlarr as $k => $str) { + if ($k == 0) { $sql = $str; continue; } + // we need $lastnomatch because of the following datetime, + // eg. '10:10:01', which causes code to think that there is bind param :10 and :1 + $ok = preg_match('/^([0-9]*)/', $str, $arr); + + if (!$ok) $sql .= $str; + else { + $at = $arr[1]; + if (isset($inputarr[$at]) || is_null($inputarr[$at])) { + if ((strlen($at) == strlen($str) && $k < sizeof($arr)-1)) { + $sql .= ':'.$str; + $lastnomatch = $k; + } else if ($lastnomatch == $k-1) { + $sql .= ':'.$str; + } else { + if (is_null($inputarr[$at])) $sql .= 'null'; + else $sql .= $this->qstr($inputarr[$at]); + $sql .= substr($str, strlen($at)); + } + } else { + $sql .= ':'.$str; + } + + } + } + $inputarr = false; + } + } + $ret = $this->_Execute($sql,$inputarr); + + + } else { + $ret = $this->_Execute($sql,false); + } + + return $ret; + } + + /* + Example of usage: + + $stmt = $this->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); + */ + function Prepare($sql,$cursor=false) + { + static $BINDNUM = 0; + + $stmt = OCIParse($this->_connectionID,$sql); + + if (!$stmt) { + $this->_errorMsg = false; + $this->_errorCode = false; + $arr = @OCIError($this->_connectionID); + if ($arr === false) return false; + + $this->_errorMsg = $arr['message']; + $this->_errorCode = $arr['code']; + return false; + } + + $BINDNUM += 1; + + $sttype = @OCIStatementType($stmt); + if ($sttype == 'BEGIN' || $sttype == 'DECLARE') { + return array($sql,$stmt,0,$BINDNUM, ($cursor) ? OCINewCursor($this->_connectionID) : false); + } + return array($sql,$stmt,0,$BINDNUM); + } + + /* + Call an oracle stored procedure and returns a cursor variable as a recordset. + Concept by Robert Tuttle robert@ud.com + + Example: + Note: we return a cursor variable in :RS2 + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS2); END;",'RS2'); + + $rs = $db->ExecuteCursor( + "BEGIN :RS2 = adodb.getdata(:VAR1); END;", + 'RS2', + array('VAR1' => 'Mr Bean')); + + */ + function ExecuteCursor($sql,$cursorName='rs',$params=false) + { + if (is_array($sql)) $stmt = $sql; + else $stmt = ADODB_oci8::Prepare($sql,true); # true to allocate OCINewCursor + + if (is_array($stmt) && sizeof($stmt) >= 5) { + $hasref = true; + $ignoreCur = false; + $this->Parameter($stmt, $ignoreCur, $cursorName, false, -1, OCI_B_CURSOR); + if ($params) { + foreach($params as $k => $v) { + $this->Parameter($stmt,$params[$k], $k); + } + } + } else + $hasref = false; + + $rs = $this->Execute($stmt); + if ($rs) { + if ($rs->databaseType == 'array') OCIFreeCursor($stmt[4]); + else if ($hasref) $rs->_refcursor = $stmt[4]; + } + return $rs; + } + + /* + Bind a variable -- very, very fast for executing repeated statements in oracle. + Better than using + for ($i = 0; $i < $max; $i++) { + $p1 = ?; $p2 = ?; $p3 = ?; + $this->Execute("insert into table (col0, col1, col2) values (:0, :1, :2)", + array($p1,$p2,$p3)); + } + + Usage: + $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)"); + $DB->Bind($stmt, $p1); + $DB->Bind($stmt, $p2); + $DB->Bind($stmt, $p3); + for ($i = 0; $i < $max; $i++) { + $p1 = ?; $p2 = ?; $p3 = ?; + $DB->Execute($stmt); + } + + Some timings: + ** Test table has 3 cols, and 1 index. Test to insert 1000 records + Time 0.6081s (1644.60 inserts/sec) with direct OCIParse/OCIExecute + Time 0.6341s (1577.16 inserts/sec) with ADOdb Prepare/Bind/Execute + Time 1.5533s ( 643.77 inserts/sec) with pure SQL using Execute + + Now if PHP only had batch/bulk updating like Java or PL/SQL... + + Note that the order of parameters differs from OCIBindByName, + because we default the names to :0, :1, :2 + */ + function Bind(&$stmt,&$var,$size=4000,$type=false,$name=false,$isOutput=false) + { + + if (!is_array($stmt)) return false; + + if (($type == OCI_B_CURSOR) && sizeof($stmt) >= 5) { + return OCIBindByName($stmt[1],":".$name,$stmt[4],$size,$type); + } + + if ($name == false) { + if ($type !== false) $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size,$type); + else $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size); // +1 byte for null terminator + $stmt[2] += 1; + } else if (oci_lob_desc($type)) { + if ($this->debug) { + ADOConnection::outp("<b>Bind</b>: name = $name"); + } + //we have to create a new Descriptor here + $numlob = count($this->_refLOBs); + $this->_refLOBs[$numlob]['LOB'] = OCINewDescriptor($this->_connectionID, oci_lob_desc($type)); + $this->_refLOBs[$numlob]['TYPE'] = $isOutput; + + $tmp = $this->_refLOBs[$numlob]['LOB']; + $rez = OCIBindByName($stmt[1], ":".$name, $tmp, -1, $type); + if ($this->debug) { + ADOConnection::outp("<b>Bind</b>: descriptor has been allocated, var (".$name.") binded"); + } + + // if type is input then write data to lob now + if ($isOutput == false) { + $var = $this->BlobEncode($var); + $tmp->WriteTemporary($var); + $this->_refLOBs[$numlob]['VAR'] = &$var; + if ($this->debug) { + ADOConnection::outp("<b>Bind</b>: LOB has been written to temp"); + } + } else { + $this->_refLOBs[$numlob]['VAR'] = $var; + } + $rez = $tmp; + } else { + if ($this->debug) + ADOConnection::outp("<b>Bind</b>: name = $name"); + + if ($type !== false) $rez = OCIBindByName($stmt[1],":".$name,$var,$size,$type); + else $rez = OCIBindByName($stmt[1],":".$name,$var,$size); // +1 byte for null terminator + } + + return $rez; + } + + function Param($name,$type=false) + { + return ':'.$name; + } + + /* + Usage: + $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group'); + $db->Execute($stmt); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + See OCIBindByName documentation at php.net. + */ + function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) + { + if ($this->debug) { + $prefix = ($isOutput) ? 'Out' : 'In'; + $ztype = (empty($type)) ? 'false' : $type; + ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); + } + return $this->Bind($stmt,$var,$maxLen,$type,$name,$isOutput); + } + + /* + returns query ID if successful, otherwise false + this version supports: + + 1. $db->execute('select * from table'); + + 2. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); + $db->execute($prepared_statement, array(1,2,3)); + + 3. $db->execute('insert into table (a,b,c) values (:a,:b,:c)',array('a'=>1,'b'=>2,'c'=>3)); + + 4. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); + $db->bind($stmt,1); $db->bind($stmt,2); $db->bind($stmt,3); + $db->execute($stmt); + */ + function _query($sql,$inputarr=false) + { + if (is_array($sql)) { // is prepared sql + $stmt = $sql[1]; + + // we try to bind to permanent array, so that OCIBindByName is persistent + // and carried out once only - note that max array element size is 4000 chars + if (is_array($inputarr)) { + $bindpos = $sql[3]; + if (isset($this->_bind[$bindpos])) { + // all tied up already + $bindarr = $this->_bind[$bindpos]; + } else { + // one statement to bind them all + $bindarr = array(); + foreach($inputarr as $k => $v) { + $bindarr[$k] = $v; + OCIBindByName($stmt,":$k",$bindarr[$k],is_string($v) && strlen($v)>4000 ? -1 : 4000); + } + $this->_bind[$bindpos] = $bindarr; + } + } + } else { + $stmt=OCIParse($this->_connectionID,$sql); + } + + $this->_stmt = $stmt; + if (!$stmt) return false; + + if (defined('ADODB_PREFETCH_ROWS')) @OCISetPrefetch($stmt,ADODB_PREFETCH_ROWS); + + if (is_array($inputarr)) { + foreach($inputarr as $k => $v) { + if (is_array($v)) { + if (sizeof($v) == 2) // suggested by g.giunta@libero. + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); + else + OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); + + if ($this->debug==99) { + if (is_object($v[0])) + echo "name=:$k",' len='.$v[1],' type='.$v[2],'<br>'; + else + echo "name=:$k",' var='.$inputarr[$k][0],' len='.$v[1],' type='.$v[2],'<br>'; + + } + } else { + $len = -1; + if ($v === ' ') $len = 1; + if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again + $bindarr[$k] = $v; + } else { // dynamic sql, so rebind every time + OCIBindByName($stmt,":$k",$inputarr[$k],$len); + } + } + } + } + + $this->_errorMsg = false; + $this->_errorCode = false; + if (OCIExecute($stmt,$this->_commit)) { +//OCIInternalDebug(1); + if (count($this -> _refLOBs) > 0) { + + foreach ($this -> _refLOBs as $key => $value) { + if ($this -> _refLOBs[$key]['TYPE'] == true) { + $tmp = $this -> _refLOBs[$key]['LOB'] -> load(); + if ($this -> debug) { + ADOConnection::outp("<b>OUT LOB</b>: LOB has been loaded. <br>"); + } + //$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp; + $this -> _refLOBs[$key]['VAR'] = $tmp; + } else { + $this->_refLOBs[$key]['LOB']->save($this->_refLOBs[$key]['VAR']); + $this -> _refLOBs[$key]['LOB']->free(); + unset($this -> _refLOBs[$key]); + if ($this->debug) { + ADOConnection::outp("<b>IN LOB</b>: LOB has been saved. <br>"); + } + } + } + } + + switch (@OCIStatementType($stmt)) { + case "SELECT": + return $stmt; + + case 'DECLARE': + case "BEGIN": + if (is_array($sql) && !empty($sql[4])) { + $cursor = $sql[4]; + if (is_resource($cursor)) { + $ok = OCIExecute($cursor); + return $cursor; + } + return $stmt; + } else { + if (is_resource($stmt)) { + OCIFreeStatement($stmt); + return true; + } + return $stmt; + } + break; + default : + // ociclose -- no because it could be used in a LOB? + return true; + } + } + return false; + } + + // From Oracle Whitepaper: PHP Scalability and High Availability + function IsConnectionError($err) + { + switch($err) { + case 378: /* buffer pool param incorrect */ + case 602: /* core dump */ + case 603: /* fatal error */ + case 609: /* attach failed */ + case 1012: /* not logged in */ + case 1033: /* init or shutdown in progress */ + case 1043: /* Oracle not available */ + case 1089: /* immediate shutdown in progress */ + case 1090: /* shutdown in progress */ + case 1092: /* instance terminated */ + case 3113: /* disconnect */ + case 3114: /* not connected */ + case 3122: /* closing window */ + case 3135: /* lost contact */ + case 12153: /* TNS: not connected */ + case 27146: /* fatal or instance terminated */ + case 28511: /* Lost RPC */ + return true; + } + return false; + } + + // returns true or false + function _close() + { + if (!$this->_connectionID) return; + + if (!$this->autoCommit) OCIRollback($this->_connectionID); + if (count($this->_refLOBs) > 0) { + foreach ($this ->_refLOBs as $key => $value) { + $this->_refLOBs[$key]['LOB']->free(); + unset($this->_refLOBs[$key]); + } + } + OCILogoff($this->_connectionID); + + $this->_stmt = false; + $this->_connectionID = false; + } + + function MetaPrimaryKeys($table, $owner=false,$internalKey=false) + { + if ($internalKey) return array('ROWID'); + + // tested with oracle 8.1.7 + $table = strtoupper($table); + if ($owner) { + $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))"; + $ptab = 'ALL_'; + } else { + $owner_clause = ''; + $ptab = 'USER_'; + } + $sql = " +SELECT /*+ RULE */ distinct b.column_name + FROM {$ptab}CONSTRAINTS a + , {$ptab}CONS_COLUMNS b + WHERE ( UPPER(b.table_name) = ('$table')) + AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P') + $owner_clause + AND (a.constraint_name = b.constraint_name)"; + + $rs = $this->Execute($sql); + if ($rs && !$rs->EOF) { + $arr = $rs->GetArray(); + $a = array(); + foreach($arr as $v) { + $a[] = reset($v); + } + return $a; + } + else return false; + } + + // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html + function MetaForeignKeys($table, $owner=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + if (!$owner) { + $owner = $this->user; + $tabp = 'user_'; + } else + $tabp = 'all_'; + + $owner = ' and owner='.$this->qstr(strtoupper($owner)); + + $sql = +"select constraint_name,r_owner,r_constraint_name + from {$tabp}constraints + where constraint_type = 'R' and table_name = $table $owner"; + + $constraints = $this->GetArray($sql); + $arr = false; + foreach($constraints as $constr) { + $cons = $this->qstr($constr[0]); + $rowner = $this->qstr($constr[1]); + $rcons = $this->qstr($constr[2]); + $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position"); + $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position"); + + if ($cols && $tabcol) + for ($i=0, $max=sizeof($cols); $i < $max; $i++) { + $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1]; + } + } + $ADODB_FETCH_MODE = $save; + + return $arr; + } + + + function CharMax() + { + return 4000; + } + + function TextMax() + { + return 4000; + } + + /** + * Quotes a string. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + //$nofixquotes=false; + + if ($this->noNullStrings && strlen($s)==0)$s = ' '; + if (!$magic_quotes) { + if ($this->replaceQuote[0] == '\\'){ + $s = str_replace('\\','\\\\',$s); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " unless sybase is on + if (!ini_get('magic_quotes_sybase')) { + $s = str_replace('\\"','"',$s); + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } else { + return "'".$s."'"; + } + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_oci8 extends ADORecordSet { + + var $databaseType = 'oci8'; + var $bind=false; + var $_fieldobjs; + + //var $_arr = false; + + function ADORecordset_oci8($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_NUM: + default: + $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + } + + $this->adodbFetchMode = $mode; + $this->_queryID = $queryID; + } + + + function Init() + { + if ($this->_inited) return; + + $this->_inited = true; + if ($this->_queryID) { + + $this->_currentRow = 0; + @$this->_initrs(); + $this->EOF = !$this->_fetch(); + + /* + // based on idea by Gaetano Giunta to detect unusual oracle errors + // see http://phplens.com/lens/lensforum/msgs.php?id=6771 + $err = OCIError($this->_queryID); + if ($err && $this->connection->debug) ADOConnection::outp($err); + */ + + if (!is_array($this->fields)) { + $this->_numOfRows = 0; + $this->fields = array(); + } + } else { + $this->fields = array(); + $this->_numOfRows = 0; + $this->_numOfFields = 0; + $this->EOF = true; + } + } + + function _initrs() + { + $this->_numOfRows = -1; + $this->_numOfFields = OCInumcols($this->_queryID); + if ($this->_numOfFields>0) { + $this->_fieldobjs = array(); + $max = $this->_numOfFields; + for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i); + } + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function _FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fieldOffset += 1; + $fld->name =OCIcolumnname($this->_queryID, $fieldOffset); + $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); + $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); + switch($fld->type) { + case 'NUMBER': + $p = OCIColumnPrecision($this->_queryID, $fieldOffset); + $sc = OCIColumnScale($this->_queryID, $fieldOffset); + if ($p != 0 && $sc == 0) $fld->type = 'INT'; + break; + + case 'CLOB': + case 'NCLOB': + case 'BLOB': + $fld->max_length = -1; + break; + } + return $fld; + } + + /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */ + function FetchField($fieldOffset = -1) + { + return $this->_fieldobjs[$fieldOffset]; + } + + + /* + // 10% speedup to move MoveNext to child class + function _MoveNext() + { + //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this); + + if ($this->EOF) return false; + + $this->_currentRow++; + if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) + return true; + $this->EOF = true; + + return false; + } */ + + + function MoveNext() + { + if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } + + /* + # does not work as first record is retrieved in _initrs(), so is not included in GetArray() + function GetArray($nRows = -1) + { + global $ADODB_OCI8_GETARRAY; + + if (true || !empty($ADODB_OCI8_GETARRAY)) { + # does not support $ADODB_ANSI_PADDING_OFF + + //OCI_RETURN_NULLS and OCI_RETURN_LOBS is set by OCIfetchstatement + switch($this->adodbFetchMode) { + case ADODB_FETCH_NUM: + + $ncols = @OCIfetchstatement($this->_queryID, $results, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW+OCI_NUM); + $results = array_merge(array($this->fields),$results); + return $results; + + case ADODB_FETCH_ASSOC: + if (ADODB_ASSOC_CASE != 2 || $this->databaseType != 'oci8') break; + + $ncols = @OCIfetchstatement($this->_queryID, $assoc, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW); + $results = array_merge(array($this->fields),$assoc); + return $results; + + default: + break; + } + } + + $results = ADORecordSet::GetArray($nRows); + return $results; + + } */ + + /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr = $this->GetArray($nrows); + return $arr; + } + $arr = array(); + for ($i=1; $i < $offset; $i++) + if (!@OCIFetch($this->_queryID)) return $arr; + + if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return $arr;; + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + /* Use associative array to get fields array */ + function Fields($colname) + { + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + + function _seek($row) + { + return false; + } + + function _fetch() + { + return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + + function _close() + { + if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false; + if (!empty($this->_refcursor)) { + OCIFreeCursor($this->_refcursor); + $this->_refcursor = false; + } + @OCIFreeStatement($this->_queryID); + $this->_queryID = false; + + } + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'VARCHAR': + case 'VARCHAR2': + case 'CHAR': + case 'VARBINARY': + case 'BINARY': + case 'NCHAR': + case 'NVARCHAR': + case 'NVARCHAR2': + if ($len <= $this->blobSize) return 'C'; + + case 'NCLOB': + case 'LONG': + case 'LONG VARCHAR': + case 'CLOB': + return 'X'; + + case 'LONG RAW': + case 'LONG VARBINARY': + case 'BLOB': + return 'B'; + + case 'DATE': + return ($this->connection->datetime) ? 'T' : 'D'; + + + case 'TIMESTAMP': return 'T'; + + case 'INT': + case 'SMALLINT': + case 'INTEGER': + return 'I'; + + default: return 'N'; + } + } +} + +class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 { + function ADORecordSet_ext_oci8($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + case ADODB_FETCH_NUM: + default: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; + } + $this->adodbFetchMode = $mode; + $this->_queryID = $queryID; + } + + function MoveNext() + { + return adodb_movenext($this); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-oci805.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-oci805.inc.php new file mode 100644 index 000000000..30518721e --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-oci805.inc.php @@ -0,0 +1,59 @@ +<?php +/** + * @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * + * Oracle 8.0.5 driver +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php'); + +class ADODB_oci805 extends ADODB_oci8 { + var $databaseType = "oci805"; + var $connectSID = true; + + function ADODB_oci805() + { + $this->ADODB_oci8(); + } + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + // seems that oracle only supports 1 hint comment in 8i + if (strpos($sql,'/*+') !== false) + $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); + else + $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); + + /* + The following is only available from 8.1.5 because order by in inline views not + available before then... + http://www.jlcomp.demon.co.uk/faq/top_sql.html + if ($nrows > 0) { + if ($offset > 0) $nrows += $offset; + $sql = "select * from ($sql) where rownum <= $nrows"; + $nrows = -1; + } + */ + + return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + } +} + +class ADORecordset_oci805 extends ADORecordset_oci8 { + var $databaseType = "oci805"; + function ADORecordset_oci805($id,$mode=false) + { + $this->ADORecordset_oci8($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-oci8po.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-oci8po.inc.php new file mode 100644 index 000000000..30f997714 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-oci8po.inc.php @@ -0,0 +1,218 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim. All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Latest version is available at http://adodb.sourceforge.net + + Portable version of oci8 driver, to make it more similar to other database drivers. + The main differences are + + 1. that the OCI_ASSOC names are in lowercase instead of uppercase. + 2. bind variables are mapped using ? instead of :<bindvar> + + Should some emulation of RecordCount() be implemented? + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php'); + +class ADODB_oci8po extends ADODB_oci8 { + var $databaseType = 'oci8po'; + var $dataProvider = 'oci8'; + var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net + var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')"; + + function ADODB_oci8po() + { + $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; + # oci8po does not support adodb extension: adodb_movenext() + } + + function Param($name) + { + return '?'; + } + + function Prepare($sql,$cursor=false) + { + $sqlarr = explode('?',$sql); + $sql = $sqlarr[0]; + for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { + $sql .= ':'.($i-1) . $sqlarr[$i]; + } + return ADODB_oci8::Prepare($sql,$cursor); + } + + // emulate handling of parameters ? ?, replacing with :bind0 :bind1 + function _query($sql,$inputarr=false) + { + if (is_array($inputarr)) { + $i = 0; + if (is_array($sql)) { + foreach($inputarr as $v) { + $arr['bind'.$i++] = $v; + } + } else { + $sqlarr = explode('?',$sql); + $sql = $sqlarr[0]; + foreach($inputarr as $k => $v) { + $sql .= ":$k" . $sqlarr[++$i]; + } + } + } + return ADODB_oci8::_query($sql,$inputarr); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_oci8po extends ADORecordset_oci8 { + + var $databaseType = 'oci8po'; + + function ADORecordset_oci8po($queryID,$mode=false) + { + $this->ADORecordset_oci8($queryID,$mode); + } + + function Fields($colname) + { + if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + // lowercase field names... + function _FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fieldOffset += 1; + $fld->name = OCIcolumnname($this->_queryID, $fieldOffset); + if (ADODB_ASSOC_CASE == 0) $fld->name = strtolower($fld->name); + $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); + $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); + if ($fld->type == 'NUMBER') { + //$p = OCIColumnPrecision($this->_queryID, $fieldOffset); + $sc = OCIColumnScale($this->_queryID, $fieldOffset); + if ($sc == 0) $fld->type = 'INT'; + } + return $fld; + } + /* + function MoveNext() + { + if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + }*/ + + // 10% speedup to move MoveNext to child class + function MoveNext() + { + if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + global $ADODB_ANSI_PADDING_OFF; + $this->_currentRow++; + + if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); + if (!empty($ADODB_ANSI_PADDING_OFF)) { + foreach($this->fields as $k => $v) { + if (is_string($v)) $this->fields[$k] = rtrim($v); + } + } + return true; + } + if (!$this->EOF) { + $this->EOF = true; + $this->_currentRow++; + } + return false; + } + + /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr = $this->GetArray($nrows); + return $arr; + } + for ($i=1; $i < $offset; $i++) + if (!@OCIFetch($this->_queryID)) { + $arr = array(); + return $arr; + } + if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { + $arr = array(); + return $arr; + } + if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + // Create associative array + function _updatefields() + { + if (ADODB_ASSOC_CASE == 2) return; // native + + $arr = array(); + $lowercase = (ADODB_ASSOC_CASE == 0); + + foreach($this->fields as $k => $v) { + if (is_integer($k)) $arr[$k] = $v; + else { + if ($lowercase) + $arr[strtolower($k)] = $v; + else + $arr[strtoupper($k)] = $v; + } + } + $this->fields = $arr; + } + + function _fetch() + { + $ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); + if ($ret) { + global $ADODB_ANSI_PADDING_OFF; + + if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); + if (!empty($ADODB_ANSI_PADDING_OFF)) { + foreach($this->fields as $k => $v) { + if (is_string($v)) $this->fields[$k] = rtrim($v); + } + } + } + return $ret; + } + +} + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc.inc.php new file mode 100644 index 000000000..e7591cd7f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc.inc.php @@ -0,0 +1,738 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Requires ODBC. Works on Windows and Unix. +*/ +// security - hide paths +if (!defined('ADODB_DIR')) die(); + + define("_ADODB_ODBC_LAYER", 2 ); + +/*-------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------*/ + + +class ADODB_odbc extends ADOConnection { + var $databaseType = "odbc"; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $dataProvider = "odbc"; + var $hasAffectedRows = true; + var $binmode = ODBC_BINMODE_RETURN; + var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive + // breaking backward-compat + //var $longreadlen = 8000; // default number of chars to return for a Blob/Long field + var $_bindInputArray = false; + var $curmode = SQL_CUR_USE_DRIVER; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L + var $_genSeqSQL = "create table %s (id integer)"; + var $_autocommit = true; + var $_haserrorfunctions = true; + var $_has_stupid_odbc_fetch_api_change = true; + var $_lastAffectedRows = 0; + var $uCaseTables = true; // for meta* functions, uppercase table names + + function ADODB_odbc() + { + $this->_haserrorfunctions = ADODB_PHPVER >= 0x4050; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('odbc_connect')) return null; + + if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') { + ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + if (isset($php_errormsg)) $php_errormsg = ''; + if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode); + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + if (!function_exists('odbc_connect')) return null; + + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->debug && $argDatabasename) { + ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter."); + } + // print "dsn=$argDSN u=$argUsername p=$argPassword<br>"; flush(); + if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword); + else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode); + + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID); + if (isset($this->connectStmt)) $this->Execute($this->connectStmt); + + return $this->_connectionID != false; + } + + + function ServerInfo() + { + + if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { + $dsn = strtoupper($this->host); + $first = true; + $found = false; + + if (!function_exists('odbc_data_source')) return false; + + while(true) { + + $rez = @odbc_data_source($this->_connectionID, + $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); + $first = false; + if (!is_array($rez)) break; + if (strtoupper($rez['server']) == $dsn) { + $found = true; + break; + } + } + if (!$found) return ADOConnection::ServerInfo(); + if (!isset($rez['version'])) $rez['version'] = ''; + return $rez; + } else { + return ADOConnection::ServerInfo(); + } + } + + + function CreateSequence($seqname='adodbseq',$start=1) + { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + $start -= 1; + return $this->Execute("insert into $seqname values($start)"); + } + + var $_dropSeqSQL = 'drop table %s'; + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /* + This algorithm is not very efficient, but works even if table locking + is not available. + + Will return false if unable to generate an ID after $MAXLOOPS attempts. + */ + function GenID($seq='adodbseq',$start=1) + { + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $MAXLOOPS = 100; + //$this->debug=1; + while (--$MAXLOOPS>=0) { + $num = $this->GetOne("select id from $seq"); + if ($num === false) { + $this->Execute(sprintf($this->_genSeqSQL ,$seq)); + $start -= 1; + $num = '0'; + $ok = $this->Execute("insert into $seq values($start)"); + if (!$ok) return false; + } + $this->Execute("update $seq set id=id+1 where id=$num"); + + if ($this->affected_rows() > 0) { + $num += 1; + $this->genID = $num; + return $num; + } + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + + function ErrorMsg() + { + if ($this->_haserrorfunctions) { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @odbc_errormsg(); + return @odbc_errormsg($this->_connectionID); + } else return ADOConnection::ErrorMsg(); + } + + function ErrorNo() + { + + if ($this->_haserrorfunctions) { + if ($this->_errorCode !== false) { + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; + } + + if (empty($this->_connectionID)) $e = @odbc_error(); + else $e = @odbc_error($this->_connectionID); + + // bug in 4.0.6, error number can be corrupted string (should be 6 digits) + // so we check and patch + if (strlen($e)<=2) return 0; + return $e; + } else return ADOConnection::ErrorNo(); + } + + + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + return odbc_autocommit($this->_connectionID,false); + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = odbc_commit($this->_connectionID); + odbc_autocommit($this->_connectionID,true); + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + $ret = odbc_rollback($this->_connectionID); + odbc_autocommit($this->_connectionID,true); + return $ret; + } + + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table); + + if (!$qid) { + $ADODB_FETCH_MODE = $savem; + return false; + } + $rs = new ADORecordSet_odbc($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + $rs->Close(); + //print_r($arr); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3]) $arr2[] = $arr[$i][3]; + } + return $arr2; + } + + + + function MetaTables($ttype=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = odbc_tables($this->_connectionID); + + $rs = new ADORecordSet_odbc($qid); + + $ADODB_FETCH_MODE = $savem; + if (!$rs) { + $false = false; + return $false; + } + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + //print_r($arr); + + $rs->Close(); + $arr2 = array(); + + if ($ttype) { + $isview = strncmp($ttype,'V',1) === 0; + } + for ($i=0; $i < sizeof($arr); $i++) { + if (!$arr[$i][2]) continue; + $type = $arr[$i][3]; + if ($ttype) { + if ($isview) { + if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; + } + return $arr2; + } + +/* +See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp +/ SQL data type codes / +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (ODBCVER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + + +/ One-parameter shortcuts for date/time data types / +#if (ODBCVER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 + +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +*/ + function ODBCTypes($t) + { + switch ((integer)$t) { + case 1: + case 12: + case 0: + case -95: + case -96: + return 'C'; + case -97: + case -1: //text + return 'X'; + case -4: //image + return 'B'; + + case 9: + case 91: + return 'D'; + + case 10: + case 11: + case 92: + case 93: + return 'T'; + + case 4: + case 5: + case -6: + return 'I'; + + case -11: // uniqidentifier + return 'R'; + case -7: //bit + return 'L'; + + default: + return 'N'; + } + } + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + if ($this->uCaseTables) $table = strtoupper($table); + $schema = ''; + $this->_findschema($table,$schema); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + /*if (false) { // after testing, confirmed that the following does not work becoz of a bug + $qid2 = odbc_tables($this->_connectionID); + $rs = new ADORecordSet_odbc($qid2); + $ADODB_FETCH_MODE = $savem; + if (!$rs) return false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + while (!$rs->EOF) { + if ($table == strtoupper($rs->fields[2])) { + $q = $rs->fields[0]; + $o = $rs->fields[1]; + break; + } + $rs->MoveNext(); + } + $rs->Close(); + + $qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); + } */ + + switch ($this->databaseType) { + case 'access': + case 'vfp': + $qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%'); + break; + + + case 'db2': + $colname = "%"; + $qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname); + break; + + default: + $qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%'); + if (empty($qid)) $qid = odbc_columns($this->_connectionID); + break; + } + if (empty($qid)) return $false; + + $rs = new ADORecordSet_odbc($qid); + $ADODB_FETCH_MODE = $savem; + + if (!$rs) return $false; + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + $rs->_fetch(); + + $retarr = array(); + + /* + $rs->fields indices + 0 TABLE_QUALIFIER + 1 TABLE_SCHEM + 2 TABLE_NAME + 3 COLUMN_NAME + 4 DATA_TYPE + 5 TYPE_NAME + 6 PRECISION + 7 LENGTH + 8 SCALE + 9 RADIX + 10 NULLABLE + 11 REMARKS + */ + while (!$rs->EOF) { + // adodb_pr($rs->fields); + if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $this->ODBCTypes($rs->fields[4]); + + // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp + // access uses precision to store length for char/varchar + if ($fld->type == 'C' or $fld->type == 'X') { + if ($this->databaseType == 'access') + $fld->max_length = $rs->fields[6]; + else if ($rs->fields[4] <= -95) // UNICODE + $fld->max_length = $rs->fields[7]/2; + else + $fld->max_length = $rs->fields[7]; + } else + $fld->max_length = $rs->fields[7]; + $fld->not_null = !empty($rs->fields[10]); + $fld->scale = $rs->fields[8]; + $retarr[strtoupper($fld->name)] = $fld; + } else if (sizeof($retarr)>0) + break; + $rs->MoveNext(); + } + $rs->Close(); //-- crashes 4.03pl1 -- why? + + if (empty($retarr)) $retarr = false; + return $retarr; + } + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + $stmt = odbc_prepare($this->_connectionID,$sql); + if (!$stmt) { + // we don't know whether odbc driver is parsing prepared stmts, so just return sql + return $sql; + } + return array($sql,$stmt,false); + } + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + GLOBAL $php_errormsg; + if (isset($php_errormsg)) $php_errormsg = ''; + $this->_error = ''; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = odbc_prepare($this->_connectionID,$sql); + + if ($stmtid == false) { + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + return false; + } + } + + if (! odbc_execute($stmtid,$inputarr)) { + //@odbc_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = odbc_errormsg(); + $this->_errorCode = odbc_error(); + } + return false; + } + + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!odbc_execute($stmtid)) { + //@odbc_free_result($stmtid); + if ($this->_haserrorfunctions) { + $this->_errorMsg = odbc_errormsg(); + $this->_errorCode = odbc_error(); + } + return false; + } + } else + $stmtid = odbc_exec($this->_connectionID,$sql); + + $this->_lastAffectedRows = 0; + if ($stmtid) { + if (@odbc_num_fields($stmtid) == 0) { + $this->_lastAffectedRows = odbc_num_rows($stmtid); + $stmtid = true; + } else { + $this->_lastAffectedRows = 0; + odbc_binmode($stmtid,$this->binmode); + odbc_longreadlen($stmtid,$this->maxblobsize); + } + + if ($this->_haserrorfunctions) { + $this->_errorMsg = ''; + $this->_errorCode = 0; + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } else { + if ($this->_haserrorfunctions) { + $this->_errorMsg = odbc_errormsg(); + $this->_errorCode = odbc_error(); + } else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; + } + return $stmtid; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + // returns true or false + function _close() + { + $ret = @odbc_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } + + function _affectedrows() + { + return $this->_lastAffectedRows; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_odbc extends ADORecordSet { + + var $bind = false; + var $databaseType = "odbc"; + var $dataProvider = "odbc"; + var $useFetchArray; + var $_has_stupid_odbc_fetch_api_change; + + function ADORecordSet_odbc($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + + // the following is required for mysql odbc driver in 4.3.1 -- why? + $this->EOF = false; + $this->_currentRow = -1; + //$this->ADORecordSet($id); + } + + + // returns the field object + function FetchField($fieldOffset = -1) + { + + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $o->name = @odbc_field_name($this->_queryID,$off); + $o->type = @odbc_field_type($this->_queryID,$off); + $o->max_length = @odbc_field_len($this->_queryID,$off); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1; + $this->_numOfFields = @odbc_num_fields($this->_queryID); + // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 + if ($this->_numOfRows == 0) $this->_numOfRows = -1; + //$this->useFetchArray = $this->connection->useFetchArray; + $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; + } + + function _seek($row) + { + return false; + } + + // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated + function GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $rs = $this->GetArray($nrows); + return $rs; + } + $savem = $this->fetchMode; + $this->fetchMode = ADODB_FETCH_NUM; + $this->Move($offset); + $this->fetchMode = $savem; + + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + function MoveNext() + { + if ($this->_numOfRows != 0 && !$this->EOF) { + $this->_currentRow++; + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @odbc_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + } + $this->fields = false; + $this->EOF = true; + return false; + } + + function _fetch() + { + + if ($this->_has_stupid_odbc_fetch_api_change) + $rez = @odbc_fetch_into($this->_queryID,$this->fields); + else { + $row = 0; + $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields); + } + if ($rez) { + if ($this->fetchMode & ADODB_FETCH_ASSOC) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + } + return true; + } + $this->fields = false; + return false; + } + + function _close() + { + return @odbc_free_result($this->_queryID); + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_db2.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_db2.inc.php new file mode 100644 index 000000000..4baca7013 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_db2.inc.php @@ -0,0 +1,368 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + DB2 data driver. Requires ODBC. + +From phpdb list: + +Hi Andrew, + +thanks a lot for your help. Today we discovered what +our real problem was: + +After "playing" a little bit with the php-scripts that try +to connect to the IBM DB2, we set the optional parameter +Cursortype when calling odbc_pconnect(....). + +And the exciting thing: When we set the cursor type +to SQL_CUR_USE_ODBC Cursor Type, then +the whole query speed up from 1 till 10 seconds +to 0.2 till 0.3 seconds for 100 records. Amazing!!! + +Therfore, PHP is just almost fast as calling the DB2 +from Servlets using JDBC (don't take too much care +about the speed at whole: the database was on a +completely other location, so the whole connection +was made over a slow network connection). + +I hope this helps when other encounter the same +problem when trying to connect to DB2 from +PHP. + +Kind regards, +Christian Szardenings + +2 Oct 2001 +Mark Newnham has discovered that the SQL_CUR_USE_ODBC is not supported by +IBM's DB2 ODBC driver, so this must be a 3rd party ODBC driver. + +From the IBM CLI Reference: + +SQL_ATTR_ODBC_CURSORS (DB2 CLI v5) +This connection attribute is defined by ODBC, but is not supported by DB2 +CLI. Any attempt to set or get this attribute will result in an SQLSTATE of +HYC00 (Driver not capable). + +A 32-bit option specifying how the Driver Manager uses the ODBC cursor +library. + +So I guess this means the message [above] was related to using a 3rd party +odbc driver. + +Setting SQL_CUR_USE_ODBC +======================== +To set SQL_CUR_USE_ODBC for drivers that require it, do this: + +$db = NewADOConnection('odbc_db2'); +$db->curMode = SQL_CUR_USE_ODBC; +$db->Connect($dsn, $userid, $pwd); + + + +USING CLI INTERFACE +=================== + +I have had reports that the $host and $database params have to be reversed in +Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu: + +> The symptom is that if I change the database engine from postgres or any other to DB2 then the following +> connection command becomes wrong despite being described this version to be correct in the docs. +> +> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME ) +> +> In case of DB2 I had to swap the first and last arguments in order to connect properly. + + +System Error 5 +============== +IF you get a System Error 5 when trying to Connect/Load, it could be a permission problem. Give the user connecting +to DB2 full rights to the DB2 SQLLIB directory, and place the user in the DBUSERS group. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} +if (!defined('ADODB_ODBC_DB2')){ +define('ADODB_ODBC_DB2',1); + +class ADODB_ODBC_DB2 extends ADODB_odbc { + var $databaseType = "db2"; + var $concat_operator = '||'; + var $sysTime = 'CURRENT TIME'; + var $sysDate = 'CURRENT DATE'; + var $sysTimeStamp = 'CURRENT TIMESTAMP'; + // The complete string representation of a timestamp has the form + // yyyy-mm-dd-hh.mm.ss.nnnnnn. + var $fmtTimeStamp = "'Y-m-d-H.i.s'"; + var $ansiOuter = true; + var $identitySQL = 'values IDENTITY_VAL_LOCAL()'; + var $_bindInputArray = true; + var $hasInsertID = true; + var $rsPrefix = 'ADORecordset_odbc_'; + + function ADODB_DB2() + { + if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC; + $this->ADODB_odbc(); + } + + function IfNull( $field, $ifNull ) + { + return " COALESCE($field, $ifNull) "; // if DB2 UDB + } + + function ServerInfo() + { + //odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/); + $vers = $this->GetOne('select versionnumber from sysibm.sysversions'); + //odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/); + return array('description'=>'DB2 ODBC driver', 'version'=>$vers); + } + + function _insertid() + { + return $this->GetOne($this->identitySQL); + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if ($this->_autocommit) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + function MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%") + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, ""); + + $rs = new ADORecordSet_odbc($qid); + + $ADODB_FETCH_MODE = $savem; + if (!$rs) { + $false = false; + return $false; + } + $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; + + $arr = $rs->GetArray(); + //print_r($arr); + + $rs->Close(); + $arr2 = array(); + + if ($ttype) { + $isview = strncmp($ttype,'V',1) === 0; + } + for ($i=0; $i < sizeof($arr); $i++) { + + if (!$arr[$i][2]) continue; + if (strncmp($arr[$i][1],'SYS',3) === 0) continue; + + $type = $arr[$i][3]; + + if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2]; + + if ($ttype) { + if ($isview) { + if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2]; + } else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2]; + } + return $arr2; + } + + function MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $false = false; + // get index details + $table = strtoupper($table); + $SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'"; + if ($primary) + $SQL.= " AND UNIQUERULE='P'"; + $rs = $this->Execute($SQL); + if (!is_object($rs)) { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; + } + $indexes = array (); + // parse index data into array + while ($row = $rs->FetchRow()) { + $indexes[$row[0]] = array( + 'unique' => ($row[1] == 'U' || $row[1] == 'P'), + 'columns' => array() + ); + $cols = ltrim($row[2],'+'); + $indexes[$row[0]]['columns'] = explode('+', $cols); + } + if (isset($savem)) { + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + } + return $indexes; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + // use right() and replace() ? + if (!$col) $col = $this->sysDate; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '||'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "char(year($col))"; + break; + case 'M': + $s .= "substr(monthname($col),1,3)"; + break; + case 'm': + $s .= "right(digits(month($col)),2)"; + break; + case 'D': + case 'd': + $s .= "right(digits(day($col)),2)"; + break; + case 'H': + case 'h': + if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; + else $s .= "''"; + break; + case 'i': + case 'I': + if ($col != $this->sysDate) + $s .= "right(digits(minute($col)),2)"; + else $s .= "''"; + break; + case 'S': + case 's': + if ($col != $this->sysDate) + $s .= "right(digits(second($col)),2)"; + else $s .= "''"; + break; + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + } + } + return $s; + } + + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false) + { + $nrows = (integer) $nrows; + if ($offset <= 0) { + // could also use " OPTIMIZE FOR $nrows ROWS " + if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY "; + $rs = $this->Execute($sql,$inputArr); + } else { + if ($offset > 0 && $nrows < 0); + else { + $nrows += $offset; + $sql .= " FETCH FIRST $nrows ROWS ONLY "; + } + $rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr); + } + + return $rs; + } + +}; + + +class ADORecordSet_odbc_db2 extends ADORecordSet_odbc { + + var $databaseType = "db2"; + + function ADORecordSet_db2($id,$mode=false) + { + $this->ADORecordSet_odbc($id,$mode); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + switch (strtoupper($t)) { + case 'VARCHAR': + case 'CHAR': + case 'CHARACTER': + case 'C': + if ($len <= $this->blobSize) return 'C'; + + case 'LONGCHAR': + case 'TEXT': + case 'CLOB': + case 'DBCLOB': // double-byte + case 'X': + return 'X'; + + case 'BLOB': + case 'GRAPHIC': + case 'VARGRAPHIC': + return 'B'; + + case 'DATE': + case 'D': + return 'D'; + + case 'TIME': + case 'TIMESTAMP': + case 'T': + return 'T'; + + //case 'BOOLEAN': + //case 'BIT': + // return 'L'; + + //case 'COUNTER': + // return 'R'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'SMALLINT': + case 'I': + return 'I'; + + default: return 'N'; + } + } +} + +} //define +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_mssql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_mssql.inc.php new file mode 100644 index 000000000..a118be845 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_mssql.inc.php @@ -0,0 +1,306 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + MSSQL support via ODBC. Requires ODBC. Works on Windows and Unix. + For Unix configuration, see http://phpbuilder.com/columns/alberto20000919.php3 +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} + + +class ADODB_odbc_mssql extends ADODB_odbc { + var $databaseType = 'odbc_mssql'; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $_bindInputArray = true; + var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE'))"; + var $metaColumnsSQL = "select c.name,t.name,c.length from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; + var $hasTop = 'top'; // support mssql/interbase SELECT TOP 10 * FROM TABLE + var $sysDate = 'GetDate()'; + var $sysTimeStamp = 'GetDate()'; + var $leftOuter = '*='; + var $rightOuter = '=*'; + var $substr = 'substring'; + var $length = 'len'; + var $ansiOuter = true; // for mssql7 or later + var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 + var $hasInsertID = true; + var $connectStmt = 'SET CONCAT_NULL_YIELDS_NULL OFF'; # When SET CONCAT_NULL_YIELDS_NULL is ON, + # concatenating a null value with a string yields a NULL result + + function ADODB_odbc_mssql() + { + $this->ADODB_odbc(); + //$this->curmode = SQL_CUR_USE_ODBC; + } + + // crashes php... + function ServerInfo() + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $row = $this->GetRow("execute sp_server_info 2"); + $ADODB_FETCH_MODE = $save; + if (!is_array($row)) return false; + $arr['description'] = $row[2]; + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " ISNULL($field, $ifNull) "; // if MS SQL Server + } + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + return $this->GetOne($this->identitySQL); + } + + + function MetaForeignKeys($table, $owner=false, $upper=false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $table = $this->qstr(strtoupper($table)); + + $sql = +"select object_name(constid) as constraint_name, + col_name(fkeyid, fkey) as column_name, + object_name(rkeyid) as referenced_table_name, + col_name(rkeyid, rkey) as referenced_column_name +from sysforeignkeys +where upper(object_name(fkeyid)) = $table +order by constraint_name, referenced_table_name, keyno"; + + $constraints = $this->GetArray($sql); + + $ADODB_FETCH_MODE = $save; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; + } + if (!$arr) return false; + + $arr2 = false; + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) {$this->debug=1; + $save = $this->metaTablesSQL; + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " AND name like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function MetaColumns($table, $normalize=true) + { + $arr = ADOConnection::MetaColumns($table); + return $arr; + } + + + function MetaIndexes($table,$primary=false, $owner=false) + { + $table = $this->qstr($table); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if (!$primary && $row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function _query($sql,$inputarr=false) + { + if (is_string($sql)) $sql = str_replace('||','+',$sql); + return ADODB_odbc::_query($sql,$inputarr); + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + // "Stein-Aksel Basma" <basma@accelero.no> + // tested with MSSQL 2000 + function MetaPrimaryKeys($table) + { + global $ADODB_FETCH_MODE; + + $schema = ''; + $this->_findschema($table,$schema); + //if (!$schema) $schema = $this->database; + if ($schema) $schema = "and k.table_catalog like '$schema%'"; + + $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, + information_schema.table_constraints tc + where tc.constraint_name = k.constraint_name and tc.constraint_type = + 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $a = $this->GetCol($sql); + $ADODB_FETCH_MODE = $savem; + + if ($a && sizeof($a)>0) return $a; + $false = false; + return $false; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($nrows > 0 && $offset <= 0) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); + $rs = $this->Execute($sql,$inputarr); + } else + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + + return $rs; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yyyy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(quarter,$col)"; + break; + case 'D': + case 'd': + $s .= "replace(str(day($col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + +} + +class ADORecordSet_odbc_mssql extends ADORecordSet_odbc { + + var $databaseType = 'odbc_mssql'; + + function ADORecordSet_odbc_mssql($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_oracle.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_oracle.inc.php new file mode 100644 index 000000000..7c52c5fec --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbc_oracle.inc.php @@ -0,0 +1,115 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Oracle support via ODBC. Requires ODBC. Works on Windows. +*/ +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} + + +class ADODB_odbc_oracle extends ADODB_odbc { + var $databaseType = 'odbc_oracle'; + var $replaceQuote = "''"; // string to use to replace quotes + var $concat_operator='||'; + var $fmtDate = "'Y-m-d 00:00:00'"; + var $fmtTimeStamp = "'Y-m-d h:i:sA'"; + var $metaTablesSQL = 'select table_name from cat'; + var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno"; + var $sysDate = "TRUNC(SYSDATE)"; + var $sysTimeStamp = 'SYSDATE'; + + //var $_bindInputArray = false; + + function ADODB_odbc_oracle() + { + $this->ADODB_odbc(); + } + + function MetaTables() + { + $false = false; + $rs = $this->Execute($this->metaTablesSQL); + if ($rs === false) return $false; + $arr = $rs->GetArray(); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + $arr2[] = $arr[$i][0]; + } + $rs->Close(); + return $arr2; + } + + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + if ($rs === false) { + $false = false; + return $false; + } + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + + $php_errormsg = ''; + $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC ); + $this->_errorMsg = $php_errormsg; + + $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); + //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true); + return $this->_connectionID != false; + } + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + global $php_errormsg; + $php_errormsg = ''; + $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC ); + $this->_errorMsg = $php_errormsg; + + $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); + //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true); + return $this->_connectionID != false; + } +} + +class ADORecordSet_odbc_oracle extends ADORecordSet_odbc { + + var $databaseType = 'odbc_oracle'; + + function ADORecordSet_odbc_oracle($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-odbtp.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbtp.inc.php new file mode 100644 index 000000000..100f7a0ba --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbtp.inc.php @@ -0,0 +1,836 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + Latest version is available at http://adodb.sourceforge.net +*/ +// Code contributed by "stefan bogdan" <sbogdan#rsb.ro> + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +define("_ADODB_ODBTP_LAYER", 2 ); + +class ADODB_odbtp extends ADOConnection{ + var $databaseType = "odbtp"; + var $dataProvider = "odbtp"; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $odbc_driver = 0; + var $hasAffectedRows = true; + var $hasInsertID = false; + var $hasGenID = true; + var $hasMoveFirst = true; + + var $_genSeqSQL = "create table %s (seq_name char(30) not null unique , seq_value integer not null)"; + var $_dropSeqSQL = "delete from adodb_seq where seq_name = '%s'"; + var $_bindInputArray = false; + var $_useUnicodeSQL = false; + var $_canPrepareSP = false; + var $_dontPoolDBC = true; + + function ADODB_odbtp() + { + } + + function ServerInfo() + { + return array('description' => @odbtp_get_attr( ODB_ATTR_DBMSNAME, $this->_connectionID), + 'version' => @odbtp_get_attr( ODB_ATTR_DBMSVER, $this->_connectionID)); + } + + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (empty($this->_connectionID)) return @odbtp_last_error(); + return @odbtp_last_error($this->_connectionID); + } + + function ErrorNo() + { + if ($this->_errorCode !== false) return $this->_errorCode; + if (empty($this->_connectionID)) return @odbtp_last_error_state(); + return @odbtp_last_error_state($this->_connectionID); + } +/* + function DBDate($d,$isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return "convert(date, $d, 120)"; + + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + $d = adodb_date($this->fmtDate,$d); + return "convert(date, $d, 120)"; + } + + function DBTimeStamp($d,$isfld=false) + { + if (empty($d) && $d !== 0) return 'null'; + if ($isfld) return "convert(datetime, $d, 120)"; + + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + $d = adodb_date($this->fmtDate,$d); + return "convert(datetime, $d, 120)"; + } +*/ + + function _insertid() + { + // SCOPE_IDENTITY() + // Returns the last IDENTITY value inserted into an IDENTITY column in + // the same scope. A scope is a module -- a stored procedure, trigger, + // function, or batch. Thus, two statements are in the same scope if + // they are in the same stored procedure, function, or batch. + return $this->GetOne($this->identitySQL); + } + + function _affectedrows() + { + if ($this->_queryID) { + return @odbtp_affected_rows ($this->_queryID); + } else + return 0; + } + + function CreateSequence($seqname='adodbseq',$start=1) + { + //verify existence + $num = $this->GetOne("select seq_value from adodb_seq"); + $seqtab='adodb_seq'; + if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) { + $path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID ); + //if using vfp dbc file + if( !strcasecmp(strrchr($path, '.'), '.dbc') ) + $path = substr($path,0,strrpos($path,'\/')); + $seqtab = $path . '/' . $seqtab; + } + if($num == false) { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL ,$seqtab)); + } + $num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seqname'"); + if ($num) { + return false; + } + $start -= 1; + return $this->Execute("insert into adodb_seq values('$seqname',$start)"); + } + + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + function GenID($seq='adodbseq',$start=1) + { + $seqtab='adodb_seq'; + if( $this->odbc_driver == ODB_DRIVER_FOXPRO) { + $path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID ); + //if using vfp dbc file + if( !strcasecmp(strrchr($path, '.'), '.dbc') ) + $path = substr($path,0,strrpos($path,'\/')); + $seqtab = $path . '/' . $seqtab; + } + $MAXLOOPS = 100; + while (--$MAXLOOPS>=0) { + $num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seq'"); + if ($num === false) { + //verify if abodb_seq table exist + $ok = $this->GetOne("select seq_value from adodb_seq "); + if(!$ok) { + //creating the sequence table adodb_seq + $this->Execute(sprintf($this->_genSeqSQL ,$seqtab)); + } + $start -= 1; + $num = '0'; + $ok = $this->Execute("insert into adodb_seq values('$seq',$start)"); + if (!$ok) return false; + } + $ok = $this->Execute("update adodb_seq set seq_value=seq_value+1 where seq_name='$seq'"); + if($ok) { + $num += 1; + $this->genID = $num; + return $num; + } + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + //example for $UserOrDSN + //for visual fox : DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=c:\YourDbfFileDir;EXCLUSIVE=NO; + //for visual fox dbc: DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBC;SOURCEDB=c:\YourDbcFileDir\mydb.dbc;EXCLUSIVE=NO; + //for access : DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\path_to_access_db\base_test.mdb;UID=root;PWD=; + //for mssql : DRIVER={SQL Server};SERVER=myserver;UID=myuid;PWD=mypwd;DATABASE=OdbtpTest; + //if uid & pwd can be separate + function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') + { + $this->_connectionID = odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase); + if ($this->_connectionID === false) { + $this->_errorMsg = $this->ErrorMsg() ; + return false; + } + + odbtp_convert_datetime($this->_connectionID,true); + + if ($this->_dontPoolDBC) { + if (function_exists('odbtp_dont_pool_dbc')) + @odbtp_dont_pool_dbc($this->_connectionID); + } + else { + $this->_dontPoolDBC = true; + } + $this->odbc_driver = @odbtp_get_attr(ODB_ATTR_DRIVER, $this->_connectionID); + $dbms = strtolower(@odbtp_get_attr(ODB_ATTR_DBMSNAME, $this->_connectionID)); + $this->odbc_name = $dbms; + + // Account for inconsistent DBMS names + if( $this->odbc_driver == ODB_DRIVER_ORACLE ) + $dbms = 'oracle'; + else if( $this->odbc_driver == ODB_DRIVER_SYBASE ) + $dbms = 'sybase'; + + // Set DBMS specific attributes + switch( $dbms ) { + case 'microsoft sql server': + $this->databaseType = 'odbtp_mssql'; + $this->fmtDate = "'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d h:i:sA'"; + $this->sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + $this->sysTimeStamp = 'GetDate()'; + $this->ansiOuter = true; + $this->leftOuter = '*='; + $this->rightOuter = '=*'; + $this->hasTop = 'top'; + $this->hasInsertID = true; + $this->hasTransactions = true; + $this->_bindInputArray = true; + $this->_canSelectDb = true; + $this->substr = "substring"; + $this->length = 'len'; + $this->identitySQL = 'select SCOPE_IDENTITY()'; + $this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'"; + $this->_canPrepareSP = true; + break; + case 'access': + $this->databaseType = 'odbtp_access'; + $this->fmtDate = "#Y-m-d#"; + $this->fmtTimeStamp = "#Y-m-d h:i:sA#"; + $this->sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; + $this->sysTimeStamp = 'NOW'; + $this->hasTop = 'top'; + $this->hasTransactions = false; + $this->_canPrepareSP = true; // For MS Access only. + break; + case 'visual foxpro': + $this->databaseType = 'odbtp_vfp'; + $this->fmtDate = "{^Y-m-d}"; + $this->fmtTimeStamp = "{^Y-m-d, h:i:sA}"; + $this->sysDate = 'date()'; + $this->sysTimeStamp = 'datetime()'; + $this->ansiOuter = true; + $this->hasTop = 'top'; + $this->hasTransactions = false; + $this->replaceQuote = "'+chr(39)+'"; + $this->true = '.T.'; + $this->false = '.F.'; + + break; + case 'oracle': + $this->databaseType = 'odbtp_oci8'; + $this->fmtDate = "'Y-m-d 00:00:00'"; + $this->fmtTimeStamp = "'Y-m-d h:i:sA'"; + $this->sysDate = 'TRUNC(SYSDATE)'; + $this->sysTimeStamp = 'SYSDATE'; + $this->hasTransactions = true; + $this->_bindInputArray = true; + $this->concat_operator = '||'; + break; + case 'sybase': + $this->databaseType = 'odbtp_sybase'; + $this->fmtDate = "'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + $this->sysDate = 'GetDate()'; + $this->sysTimeStamp = 'GetDate()'; + $this->leftOuter = '*='; + $this->rightOuter = '=*'; + $this->hasInsertID = true; + $this->hasTransactions = true; + $this->identitySQL = 'select SCOPE_IDENTITY()'; + break; + default: + $this->databaseType = 'odbtp'; + if( @odbtp_get_attr(ODB_ATTR_TXNCAPABLE, $this->_connectionID) ) + $this->hasTransactions = true; + else + $this->hasTransactions = false; + } + @odbtp_set_attr(ODB_ATTR_FULLCOLINFO, TRUE, $this->_connectionID ); + + if ($this->_useUnicodeSQL ) + @odbtp_set_attr(ODB_ATTR_UNICODESQL, TRUE, $this->_connectionID); + + return true; + } + + function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') + { + $this->_dontPoolDBC = false; + return $this->_connect($HostOrInterface, $UserOrDSN, $argPassword, $argDatabase); + } + + function SelectDB($dbName) + { + if (!@odbtp_select_db($dbName, $this->_connectionID)) { + return false; + } + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + return true; + } + + function MetaTables($ttype='',$showSchema=false,$mask=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false); + + $arr = $this->GetArray("||SQLTables||||$ttype"); + + if (isset($savefm)) $this->SetFetchMode($savefm); + $ADODB_FETCH_MODE = $savem; + + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3] == 'SYSTEM TABLE' ) continue; + if ($arr[$i][2]) + $arr2[] = $showSchema && $arr[$i][1]? $arr[$i][1].'.'.$arr[$i][2] : $arr[$i][2]; + } + return $arr2; + } + + function MetaColumns($table,$upper=true) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $this->_findschema($table,$schema); + if ($upper) $table = strtoupper($table); + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false); + + $rs = $this->Execute( "||SQLColumns||$schema|$table" ); + + if (isset($savefm)) $this->SetFetchMode($savefm); + $ADODB_FETCH_MODE = $savem; + + if (!$rs || $rs->EOF) { + $false = false; + return $false; + } + $retarr = array(); + while (!$rs->EOF) { + //print_r($rs->fields); + if (strtoupper($rs->fields[2]) == $table) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[3]; + $fld->type = $rs->fields[5]; + $fld->max_length = $rs->fields[6]; + $fld->not_null = !empty($rs->fields[9]); + $fld->scale = $rs->fields[7]; + if (isset($rs->fields[12])) // vfp does not have field 12 + if (!is_null($rs->fields[12])) { + $fld->has_default = true; + $fld->default_value = $rs->fields[12]; + } + $retarr[strtoupper($fld->name)] = $fld; + } else if (!empty($retarr)) + break; + $rs->MoveNext(); + } + $rs->Close(); + + return $retarr; + } + + function MetaPrimaryKeys($table, $owner='') + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $arr = $this->GetArray("||SQLPrimaryKeys||$owner|$table"); + $ADODB_FETCH_MODE = $savem; + + //print_r($arr); + $arr2 = array(); + for ($i=0; $i < sizeof($arr); $i++) { + if ($arr[$i][3]) $arr2[] = $arr[$i][3]; + } + return $arr2; + } + + function MetaForeignKeys($table, $owner='', $upper=false) + { + global $ADODB_FETCH_MODE; + + $savem = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $constraints = $this->GetArray("||SQLForeignKeys|||||$owner|$table"); + $ADODB_FETCH_MODE = $savem; + + $arr = false; + foreach($constraints as $constr) { + //print_r($constr); + $arr[$constr[11]][$constr[2]][] = $constr[7].'='.$constr[3]; + } + if (!$arr) { + $false = false; + return $false; + } + + $arr2 = array(); + + foreach($arr as $k => $v) { + foreach($v as $a => $b) { + if ($upper) $a = strtoupper($a); + $arr2[$a] = $b; + } + } + return $arr2; + } + + function BeginTrans() + { + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->autoCommit = false; + if (defined('ODB_TXN_DEFAULT')) + $txn = ODB_TXN_DEFAULT; + else + $txn = ODB_TXN_READUNCOMMITTED; + $rs = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS,$txn,$this->_connectionID); + if(!$rs) return false; + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->autoCommit = true; + if( ($ret = @odbtp_commit($this->_connectionID)) ) + $ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off + return $ret; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->autoCommit = true; + if( ($ret = @odbtp_rollback($this->_connectionID)) ) + $ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off + return $ret; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + // TOP requires ORDER BY for Visual FoxPro + if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) { + if (!preg_match('/ORDER[ \t\r\n]+BY/is',$sql)) $sql .= ' ORDER BY 1'; + } + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + function Prepare($sql) + { + if (! $this->_bindInputArray) return $sql; // no binding + + $this->_errorMsg = false; + $this->_errorCode = false; + + $stmt = @odbtp_prepare($sql,$this->_connectionID); + if (!$stmt) { + // print "Prepare Error for ($sql) ".$this->ErrorMsg()."<br>"; + return $sql; + } + return array($sql,$stmt,false); + } + + function PrepareSP($sql) + { + if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures + + $this->_errorMsg = false; + $this->_errorCode = false; + + $stmt = @odbtp_prepare_proc($sql,$this->_connectionID); + if (!$stmt) return false; + return array($sql,$stmt); + } + + /* + Usage: + $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group + + # note that the parameter does not have @ in front! + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',false,64); + $db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY); + $db->Execute($stmt); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to. Can set to null (for isNull support). + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + See odbtp_attach_param documentation at http://odbtp.sourceforge.net. + */ + function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0) + { + if ( $this->odbc_driver == ODB_DRIVER_JET ) { + $name = '['.$name.']'; + if( !$type && $this->_useUnicodeSQL + && @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR ) + { + $type = ODB_WCHAR; + } + } + else { + $name = '@'.$name; + } + return @odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen); + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='image') + { + $sql = "UPDATE $table SET $column = ? WHERE $where"; + if( !($stmt = @odbtp_prepare($sql, $this->_connectionID)) ) + return false; + if( !@odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) ) + return false; + if( !@odbtp_set( $stmt, 1, $val ) ) + return false; + return @odbtp_execute( $stmt ) != false; + } + + function MetaIndexes($table,$primary=false, $owner=false) + { + switch ( $this->odbc_driver) { + case ODB_DRIVER_MSSQL: + return $this->MetaIndexes_mssql($table, $primary); + default: + return array(); + } + } + + function MetaIndexes_mssql($table,$primary=false) + { + $table = strtolower($this->qstr($table)); + + $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, + CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, + CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique + FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id + INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid + INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid + WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND lower(O.Name) = $table + ORDER BY O.name, I.Name, K.keyno"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + if ($primary && !$row[5]) continue; + + $indexes[$row[0]]['unique'] = $row[6]; + $indexes[$row[0]]['columns'][] = $row[1]; + } + return $indexes; + } + + function IfNull( $field, $ifNull ) + { + switch( $this->odbc_driver ) { + case ODB_DRIVER_MSSQL: + return " ISNULL($field, $ifNull) "; + case ODB_DRIVER_JET: + return " IIF(IsNull($field), $ifNull, $field) "; + } + return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; + } + + function _query($sql,$inputarr=false) + { + global $php_errormsg; + + $this->_errorMsg = false; + $this->_errorCode = false; + + if ($inputarr) { + if (is_array($sql)) { + $stmtid = $sql[1]; + } else { + $stmtid = @odbtp_prepare($sql,$this->_connectionID); + if ($stmtid == false) { + $this->_errorMsg = $php_errormsg; + return false; + } + } + $num_params = @odbtp_num_params( $stmtid ); + /* + for( $param = 1; $param <= $num_params; $param++ ) { + @odbtp_input( $stmtid, $param ); + @odbtp_set( $stmtid, $param, $inputarr[$param-1] ); + }*/ + + $param = 1; + foreach($inputarr as $v) { + @odbtp_input( $stmtid, $param ); + @odbtp_set( $stmtid, $param, $v ); + $param += 1; + if ($param > $num_params) break; + } + + if (!@odbtp_execute($stmtid) ) { + return false; + } + } else if (is_array($sql)) { + $stmtid = $sql[1]; + if (!@odbtp_execute($stmtid)) { + return false; + } + } else { + $stmtid = odbtp_query($sql,$this->_connectionID); + } + $this->_lastAffectedRows = 0; + if ($stmtid) { + $this->_lastAffectedRows = @odbtp_affected_rows($stmtid); + } + return $stmtid; + } + + function _close() + { + $ret = @odbtp_close($this->_connectionID); + $this->_connectionID = false; + return $ret; + } +} + +class ADORecordSet_odbtp extends ADORecordSet { + + var $databaseType = 'odbtp'; + var $canSeek = true; + + function ADORecordSet_odbtp($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function _initrs() + { + $this->_numOfFields = @odbtp_num_fields($this->_queryID); + if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID))) + $this->_numOfRows = -1; + + if (!$this->connection->_useUnicodeSQL) return; + + if ($this->connection->odbc_driver == ODB_DRIVER_JET) { + if (!@odbtp_get_attr(ODB_ATTR_MAPCHARTOWCHAR, + $this->connection->_connectionID)) + { + for ($f = 0; $f < $this->_numOfFields; $f++) { + if (@odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR) + @odbtp_bind_field($this->_queryID, $f, ODB_WCHAR); + } + } + } + } + + function FetchField($fieldOffset = 0) + { + $off=$fieldOffset; // offsets begin at 0 + $o= new ADOFieldObject(); + $o->name = @odbtp_field_name($this->_queryID,$off); + $o->type = @odbtp_field_type($this->_queryID,$off); + $o->max_length = @odbtp_field_length($this->_queryID,$off); + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + function _seek($row) + { + return @odbtp_data_seek($this->_queryID, $row); + } + + function fields($colname) + { + if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $name = @odbtp_field_name( $this->_queryID, $i ); + $this->bind[strtoupper($name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _fetch_odbtp($type=0) + { + switch ($this->fetchMode) { + case ADODB_FETCH_NUM: + $this->fields = @odbtp_fetch_row($this->_queryID, $type); + break; + case ADODB_FETCH_ASSOC: + $this->fields = @odbtp_fetch_assoc($this->_queryID, $type); + break; + default: + $this->fields = @odbtp_fetch_array($this->_queryID, $type); + } + if ($this->databaseType = 'odbtp_vfp') { + if ($this->fields) + foreach($this->fields as $k => $v) { + if (strncmp($v,'1899-12-30',10) == 0) $this->fields[$k] = ''; + } + } + return is_array($this->fields); + } + + function _fetch() + { + return $this->_fetch_odbtp(); + } + + function MoveFirst() + { + if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false; + $this->EOF = false; + $this->_currentRow = 0; + return true; + } + + function MoveLast() + { + if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false; + $this->EOF = false; + $this->_currentRow = $this->_numOfRows - 1; + return true; + } + + function NextRecordSet() + { + if (!@odbtp_next_result($this->_queryID)) return false; + $this->_inited = false; + $this->bind = false; + $this->_currentRow = -1; + $this->Init(); + return true; + } + + function _close() + { + return @odbtp_free_query($this->_queryID); + } +} + +class ADORecordSet_odbtp_mssql extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_mssql'; + + function ADORecordSet_odbtp_mssql($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_access extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_access'; + + function ADORecordSet_odbtp_access($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_vfp extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_vfp'; + + function ADORecordSet_odbtp_vfp($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_oci8 extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_oci8'; + + function ADORecordSet_odbtp_oci8($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} + +class ADORecordSet_odbtp_sybase extends ADORecordSet_odbtp { + + var $databaseType = 'odbtp_sybase'; + + function ADORecordSet_odbtp_sybase($id,$mode=false) + { + return $this->ADORecordSet_odbtp($id,$mode); + } +} +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-odbtp_unicode.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbtp_unicode.inc.php new file mode 100644 index 000000000..4943cb5fa --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-odbtp_unicode.inc.php @@ -0,0 +1,39 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + Latest version is available at http://adodb.sourceforge.net +*/ + +// Code contributed by "Robert Twitty" <rtwitty#neutron.ushmm.org> + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* + Because the ODBTP server sends and reads UNICODE text data using UTF-8 + encoding, the following HTML meta tag must be included within the HTML + head section of every HTML form and script page: + + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + + Also, all SQL query strings must be submitted as UTF-8 encoded text. +*/ + +if (!defined('_ADODB_ODBTP_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbtp.inc.php"); +} + +class ADODB_odbtp_unicode extends ADODB_odbtp { + var $databaseType = 'odbtp'; + var $_useUnicodeSQL = true; + + function ADODB_odbtp_unicode() + { + $this->ADODB_odbtp(); + } +} +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-oracle.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-oracle.inc.php new file mode 100644 index 000000000..abe3643ec --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-oracle.inc.php @@ -0,0 +1,342 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Latest version is available at http://adodb.sourceforge.net + + Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7. + + If you are using Oracle 8 or later, use the oci8 driver which is much better and more reliable. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB_oracle extends ADOConnection { + var $databaseType = "oracle"; + var $replaceQuote = "''"; // string to use to replace quotes + var $concat_operator='||'; + var $_curs; + var $_initdate = true; // init date to YYYY-MM-DD + var $metaTablesSQL = 'select table_name from cat'; + var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno"; + var $sysDate = "TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')"; + var $sysTimeStamp = 'SYSDATE'; + var $connectSID = true; + + function ADODB_oracle() + { + } + + // format and return date string in database date format + function DBDate($d) + { + if (is_string($d)) $d = ADORecordSet::UnixDate($d); + if (is_object($d)) $ds = $d->format($this->fmtDate); + else $ds = adodb_date($this->fmtDate,$d); + return 'TO_DATE('.$ds.",'YYYY-MM-DD')"; + } + + // format and return date string in database timestamp format + function DBTimeStamp($ts) + { + + if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); + if (is_object($ts)) $ds = $ts->format($this->fmtDate); + else $ds = adodb_date($this->fmtTimeStamp,$ts); + return 'TO_DATE('.$ds.",'RRRR-MM-DD, HH:MI:SS AM')"; + } + + + function BindDate($d) + { + $d = ADOConnection::DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($d) + { + $d = ADOConnection::DBTimeStamp($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + + + function BeginTrans() + { + $this->autoCommit = false; + ora_commitoff($this->_connectionID); + return true; + } + + + function CommitTrans($ok=true) + { + if (!$ok) return $this->RollbackTrans(); + $ret = ora_commit($this->_connectionID); + ora_commiton($this->_connectionID); + return $ret; + } + + + function RollbackTrans() + { + $ret = ora_rollback($this->_connectionID); + ora_commiton($this->_connectionID); + return $ret; + } + + + /* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */ + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + + if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs); + if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID); + return $this->_errorMsg; + } + + + function ErrorNo() + { + if ($this->_errorCode !== false) return $this->_errorCode; + + if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs); + if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID); + return $this->_errorCode; + } + + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0) + { + if (!function_exists('ora_plogon')) return null; + + // <G. Giunta 2003/03/03/> Reset error messages before connecting + $this->_errorMsg = false; + $this->_errorCode = false; + + // G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set + // the oracle home to the host name of remote DB? +// if ($argHostname) putenv("ORACLE_HOME=$argHostname"); + + if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen <jorma.tuomainen@ppoy.fi> + if (empty($argDatabasename)) $argDatabasename = $argHostname; + else { + if(strpos($argHostname,":")) { + $argHostinfo=explode(":",$argHostname); + $argHostname=$argHostinfo[0]; + $argHostport=$argHostinfo[1]; + } else { + $argHostport="1521"; + } + + + if ($this->connectSID) { + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; + } else + $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname + .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; + } + + } + + if ($argDatabasename) $argUsername .= "@$argDatabasename"; + + //if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>"; + if ($mode == 1) + $this->_connectionID = ora_plogon($argUsername,$argPassword); + else + $this->_connectionID = ora_logon($argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($this->autoCommit) ora_commiton($this->_connectionID); + if ($this->_initdate) { + $rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'"); + if ($rs) ora_close($rs); + } + + return true; + } + + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1); + } + + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + // <G. Giunta 2003/03/03/> Reset error messages before executing + $this->_errorMsg = false; + $this->_errorCode = false; + + $curs = ora_open($this->_connectionID); + + if ($curs === false) return false; + $this->_curs = $curs; + if (!ora_parse($curs,$sql)) return false; + if (ora_exec($curs)) return $curs; + // <G. Giunta 2004/03/03> before we close the cursor, we have to store the error message + // that we can obtain ONLY from the cursor (and not from the connection) + $this->_errorCode = @ora_errorcode($curs); + $this->_errorMsg = @ora_error($curs); + // </G. Giunta 2004/03/03> + @ora_close($curs); + return false; + } + + + // returns true or false + function _close() + { + return @ora_logoff($this->_connectionID); + } + + + +} + + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_oracle extends ADORecordSet { + + var $databaseType = "oracle"; + var $bind = false; + + function ADORecordset_oracle($queryID,$mode=false) + { + + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->fetchMode = $mode; + + $this->_queryID = $queryID; + + $this->_inited = true; + $this->fields = array(); + if ($queryID) { + $this->_currentRow = 0; + $this->EOF = !$this->_fetch(); + @$this->_initrs(); + } else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + $this->EOF = true; + } + + return $this->_queryID; + } + + + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + + function FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fld->name = ora_columnname($this->_queryID, $fieldOffset); + $fld->type = ora_columntype($this->_queryID, $fieldOffset); + $fld->max_length = ora_columnsize($this->_queryID, $fieldOffset); + return $fld; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _initrs() + { + $this->_numOfRows = -1; + $this->_numOfFields = @ora_numcols($this->_queryID); + } + + + function _seek($row) + { + return false; + } + + function _fetch($ignore_fields=false) { +// should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1 + if ($this->fetchMode & ADODB_FETCH_ASSOC) + return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC); + else + return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS); + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + + function _close() +{ + return @ora_close($this->_queryID); + } + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + switch (strtoupper($t)) { + case 'VARCHAR': + case 'VARCHAR2': + case 'CHAR': + case 'VARBINARY': + case 'BINARY': + if ($len <= $this->blobSize) return 'C'; + case 'LONG': + case 'LONG VARCHAR': + case 'CLOB': + return 'X'; + case 'LONG RAW': + case 'LONG VARBINARY': + case 'BLOB': + return 'B'; + + case 'DATE': return 'D'; + + //case 'T': return 'T'; + + case 'BIT': return 'L'; + case 'INT': + case 'SMALLINT': + case 'INTEGER': return 'I'; + default: return 'N'; + } + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo.inc.php new file mode 100644 index 000000000..d6af754ba --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo.inc.php @@ -0,0 +1,626 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Requires ODBC. Works on Windows and Unix. + + Problems: + Where is float/decimal type in pdo_param_type + LOB handling for CLOB/BLOB differs significantly +*/ +// security - hide paths +if (!defined('ADODB_DIR')) die(); + + +/* +enum pdo_param_type { +PDO::PARAM_NULL, 0 + +/* int as in long (the php native int type). + * If you mark a column as an int, PDO expects get_col to return + * a pointer to a long +PDO::PARAM_INT, 1 + +/* get_col ptr should point to start of the string buffer +PDO::PARAM_STR, 2 + +/* get_col: when len is 0 ptr should point to a php_stream *, + * otherwise it should behave like a string. Indicate a NULL field + * value by setting the ptr to NULL +PDO::PARAM_LOB, 3 + +/* get_col: will expect the ptr to point to a new PDOStatement object handle, + * but this isn't wired up yet +PDO::PARAM_STMT, 4 /* hierarchical result set + +/* get_col ptr should point to a zend_bool +PDO::PARAM_BOOL, 5 + + +/* magic flag to denote a parameter as being input/output +PDO::PARAM_INPUT_OUTPUT = 0x80000000 +}; +*/ + +function adodb_pdo_type($t) +{ + switch($t) { + case 2: return 'VARCHAR'; + case 3: return 'BLOB'; + default: return 'NUMERIC'; + } +} + +/*-------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------*/ + +//////////////////////////////////////////////// + + + + + + +class ADODB_pdo extends ADOConnection { + var $databaseType = "pdo"; + var $dataProvider = "pdo"; + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; + var $replaceQuote = "''"; // string to use to replace quotes + var $hasAffectedRows = true; + var $_bindInputArray = true; + var $_genSeqSQL = "create table %s (id integer)"; + var $_autocommit = true; + var $_haserrorfunctions = true; + var $_lastAffectedRows = 0; + + var $_errormsg = false; + var $_errorno = false; + + var $dsnType = ''; + var $stmt = false; + + function ADODB_pdo() + { + } + + function _UpdatePDO() + { + $d = $this->_driver; + $this->fmtDate = $d->fmtDate; + $this->fmtTimeStamp = $d->fmtTimeStamp; + $this->replaceQuote = $d->replaceQuote; + $this->sysDate = $d->sysDate; + $this->sysTimeStamp = $d->sysTimeStamp; + $this->random = $d->random; + $this->concat_operator = $d->concat_operator; + $this->nameQuote = $d->nameQuote; + + $this->hasGenID = $d->hasGenID; + $this->_genIDSQL = $d->_genIDSQL; + $this->_genSeqSQL = $d->_genSeqSQL; + $this->_dropSeqSQL = $d->_dropSeqSQL; + + $d->_init($this); + } + + function Time() + { + if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual"; + else $sql = "select $this->sysTimeStamp"; + + $rs = $this->_Execute($sql); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + + // returns true or false + function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false) + { + $at = strpos($argDSN,':'); + $this->dsnType = substr($argDSN,0,$at); + + if ($argDatabasename) { + $argDSN .= ';dbname='.$argDatabasename; + } + try { + $this->_connectionID = new PDO($argDSN, $argUsername, $argPassword); + } catch (Exception $e) { + $this->_connectionID = false; + $this->_errorno = -1; + //var_dump($e); + $this->_errormsg = 'Connection attempt failed: '.$e->getMessage(); + return false; + } + + if ($this->_connectionID) { + switch(ADODB_ASSOC_CASE){ + case 0: $m = PDO::CASE_LOWER; break; + case 1: $m = PDO::CASE_UPPER; break; + default: + case 2: $m = PDO::CASE_NATURAL; break; + } + + //$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT ); + $this->_connectionID->setAttribute(PDO::ATTR_CASE,$m); + + $class = 'ADODB_pdo_'.$this->dsnType; + //$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); + switch($this->dsnType) { + case 'oci': + case 'mysql': + case 'pgsql': + case 'mssql': + case 'sqlite': + include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php'); + break; + } + if (class_exists($class)) + $this->_driver = new $class(); + else + $this->_driver = new ADODB_pdo_base(); + + $this->_driver->_connectionID = $this->_connectionID; + $this->_UpdatePDO(); + return true; + } + $this->_driver = new ADODB_pdo_base(); + return false; + } + + function Concat() + { + $args = func_get_args(); + if(method_exists($this->_driver, 'Concat')) + return call_user_func_array(array($this->_driver, 'Concat'), $args); + + return call_user_func_array(array($this,'parent::Concat'), $args); + } + + // returns true or false + function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) + { + return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true); + } + + /*------------------------------------------------------------------------------*/ + + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $save = $this->_driver->fetchMode; + $this->_driver->fetchMode = $this->fetchMode; + $this->_driver->debug = $this->debug; + $ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + $this->_driver->fetchMode = $save; + return $ret; + } + + + function ServerInfo() + { + return $this->_driver->ServerInfo(); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + return $this->_driver->MetaTables($ttype,$showSchema,$mask); + } + + function MetaColumns($table,$normalize=true) + { + return $this->_driver->MetaColumns($table,$normalize); + } + + function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + $obj = $stmt[1]; + if ($type) $obj->bindParam($name,$var,$type,$maxLen); + else $obj->bindParam($name, $var); + } + + function OffsetDate($dayFraction,$date=false) + { + return $this->_driver->OffsetDate($dayFraction,$date); + } + + function ErrorMsg() + { + if ($this->_errormsg !== false) return $this->_errormsg; + if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo(); + else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo(); + else return 'No Connection Established'; + + + if ($arr) { + if (sizeof($arr)<2) return ''; + if ((integer)$arr[1]) return $arr[2]; + else return ''; + } else return '-1'; + } + + + function ErrorNo() + { + if ($this->_errorno !== false) return $this->_errorno; + if (!empty($this->_stmt)) $err = $this->_stmt->errorCode(); + else if (!empty($this->_connectionID)) { + $arr = $this->_connectionID->errorInfo(); + if (isset($arr[0])) $err = $arr[0]; + else $err = -1; + } else + return 0; + + if ($err == '00000') return 0; // allows empty check + return $err; + } + + function SetTransactionMode($transaction_mode) + { + if(method_exists($this->_driver, 'SetTransactionMode')) + return $this->_driver->SetTransactionMode($transaction_mode); + + return parent::SetTransactionMode($seqname); + } + + function BeginTrans() + { + if(method_exists($this->_driver, 'BeginTrans')) + return $this->_driver->BeginTrans(); + + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + $this->transCnt += 1; + $this->_autocommit = false; + $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false); + return $this->_connectionID->beginTransaction(); + } + + function CommitTrans($ok=true) + { + if(method_exists($this->_driver, 'CommitTrans')) + return $this->_driver->CommitTrans($ok); + + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + + $ret = $this->_connectionID->commit(); + $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); + return $ret; + } + + function RollbackTrans() + { + if(method_exists($this->_driver, 'RollbackTrans')) + return $this->_driver->RollbackTrans(); + + if (!$this->hasTransactions) return false; + if ($this->transOff) return true; + if ($this->transCnt) $this->transCnt -= 1; + $this->_autocommit = true; + + $ret = $this->_connectionID->rollback(); + $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); + return $ret; + } + + function Prepare($sql) + { + $this->_stmt = $this->_connectionID->prepare($sql); + if ($this->_stmt) return array($sql,$this->_stmt); + + return false; + } + + function PrepareStmt($sql) + { + $stmt = $this->_connectionID->prepare($sql); + if (!$stmt) return false; + $obj = new ADOPDOStatement($stmt,$this); + return $obj; + } + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if(method_exists($this->_driver, 'CreateSequence')) + return $this->_driver->CreateSequence($seqname, $startID); + + return parent::CreateSequence($seqname, $startID); + } + + function DropSequence($seqname='adodbseq') + { + if(method_exists($this->_driver, 'DropSequence')) + return $this->_driver->DropSequence($seqname); + + return parent::DropSequence($seqname); + } + + function GenID($seqname='adodbseq',$startID=1) + { + if(method_exists($this->_driver, 'GenID')) + return $this->_driver->GenID($seqname, $startID); + + return parent::GenID($seqname, $startID); + } + + + /* returns queryID or false */ + function _query($sql,$inputarr=false) + { + if (is_array($sql)) { + $stmt = $sql[1]; + } else { + $stmt = $this->_connectionID->prepare($sql); + } + #adodb_backtrace(); + #var_dump($this->_bindInputArray); + if ($stmt) { + $this->_driver->debug = $this->debug; + if ($inputarr) $ok = $stmt->execute($inputarr); + else $ok = $stmt->execute(); + } + + + $this->_errormsg = false; + $this->_errorno = false; + + if ($ok) { + $this->_stmt = $stmt; + return $stmt; + } + + if ($stmt) { + + $arr = $stmt->errorinfo(); + if ((integer)$arr[1]) { + $this->_errormsg = $arr[2]; + $this->_errorno = $arr[1]; + } + + } else { + $this->_errormsg = false; + $this->_errorno = false; + } + return false; + } + + // returns true or false + function _close() + { + $this->_stmt = false; + return true; + } + + function _affectedrows() + { + return ($this->_stmt) ? $this->_stmt->rowCount() : 0; + } + + function _insertid() + { + return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0; + } +} + +class ADODB_pdo_base extends ADODB_pdo { + + var $sysDate = "'?'"; + var $sysTimeStamp = "'?'"; + + + function _init($parentDriver) + { + $parentDriver->_bindInputArray = true; + #$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); + } + + function ServerInfo() + { + return ADOConnection::ServerInfo(); + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + function MetaTables() + { + return false; + } + + function MetaColumns() + { + return false; + } +} + +class ADOPDOStatement { + + var $databaseType = "pdo"; + var $dataProvider = "pdo"; + var $_stmt; + var $_connectionID; + + function ADOPDOStatement($stmt,$connection) + { + $this->_stmt = $stmt; + $this->_connectionID = $connection; + } + + function Execute($inputArr=false) + { + $savestmt = $this->_connectionID->_stmt; + $rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr); + $this->_connectionID->_stmt = $savestmt; + return $rs; + } + + function InParameter(&$var,$name,$maxLen=4000,$type=false) + { + + if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen); + else $this->_stmt->bindParam($name, $var); + } + + function Affected_Rows() + { + return ($this->_stmt) ? $this->_stmt->rowCount() : 0; + } + + function ErrorMsg() + { + if ($this->_stmt) $arr = $this->_stmt->errorInfo(); + else $arr = $this->_connectionID->errorInfo(); + + if (is_array($arr)) { + if ((integer) $arr[0] && isset($arr[2])) return $arr[2]; + else return ''; + } else return '-1'; + } + + function NumCols() + { + return ($this->_stmt) ? $this->_stmt->columnCount() : 0; + } + + function ErrorNo() + { + if ($this->_stmt) return $this->_stmt->errorCode(); + else return $this->_connectionID->errorInfo(); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_pdo extends ADORecordSet { + + var $bind = false; + var $databaseType = "pdo"; + var $dataProvider = "pdo"; + + function ADORecordSet_pdo($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + $this->adodbFetchMode = $mode; + switch($mode) { + case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break; + case ADODB_FETCH_ASSOC: $mode = PDO::FETCH_ASSOC; break; + + case ADODB_FETCH_BOTH: + default: $mode = PDO::FETCH_BOTH; break; + } + $this->fetchMode = $mode; + + $this->_queryID = $id; + $this->ADORecordSet($id); + } + + + function Init() + { + if ($this->_inited) return; + $this->_inited = true; + if ($this->_queryID) @$this->_initrs(); + else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + } + if ($this->_numOfRows != 0 && $this->_currentRow == -1) { + $this->_currentRow = 0; + if ($this->EOF = ($this->_fetch() === false)) { + $this->_numOfRows = 0; // _numOfRows could be -1 + } + } else { + $this->EOF = true; + } + } + + function _initrs() + { + global $ADODB_COUNTRECS; + + $this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1; + if (!$this->_numOfRows) $this->_numOfRows = -1; + $this->_numOfFields = $this->_queryID->columnCount(); + } + + // returns the field object + function FetchField($fieldOffset = -1) + { + $off=$fieldOffset+1; // offsets begin at 1 + + $o= new ADOFieldObject(); + $arr = @$this->_queryID->getColumnMeta($fieldOffset); + if (!$arr) { + $o->name = 'bad getColumnMeta()'; + $o->max_length = -1; + $o->type = 'VARCHAR'; + $o->precision = 0; + # $false = false; + return $o; + } + //adodb_pr($arr); + $o->name = $arr['name']; + if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type']; + else $o->type = adodb_pdo_type($arr['pdo_type']); + $o->max_length = $arr['len']; + $o->precision = $arr['precision']; + + if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); + else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); + return $o; + } + + function _seek($row) + { + return false; + } + + function _fetch() + { + if (!$this->_queryID) return false; + + $this->fields = $this->_queryID->fetch($this->fetchMode); + return !empty($this->fields); + } + + function _close() + { + $this->_queryID = false; + } + + function Fields($colname) + { + if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_mssql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_mssql.inc.php new file mode 100644 index 000000000..f57dd2956 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_mssql.inc.php @@ -0,0 +1,61 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + +*/ + +class ADODB_pdo_mssql extends ADODB_pdo { + + var $hasTop = 'top'; + var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; + var $sysTimeStamp = 'GetDate()'; + + + function _init($parentDriver) + { + + $parentDriver->hasTransactions = false; ## <<< BUG IN PDO mssql driver + $parentDriver->_bindInputArray = false; + $parentDriver->hasInsertID = true; + } + + function ServerInfo() + { + return ADOConnection::ServerInfo(); + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET TRANSACTION ".$transaction_mode); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + return false; + } + + function MetaColumns($table,$normalize=true) + { + return false; + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_mysql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_mysql.inc.php new file mode 100644 index 000000000..3e5e6a8d4 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_mysql.inc.php @@ -0,0 +1,182 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + +*/ + +class ADODB_pdo_mysql extends ADODB_pdo { + var $metaTablesSQL = "SHOW TABLES"; + var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`"; + var $sysDate = 'CURDATE()'; + var $sysTimeStamp = 'NOW()'; + var $hasGenID = true; + var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);"; + var $_dropSeqSQL = "drop table %s"; + var $fmtTimeStamp = "'Y-m-d, H:i:s'"; + var $nameQuote = '`'; + + function _init($parentDriver) + { + + $parentDriver->hasTransactions = false; + #$parentDriver->_bindInputArray = false; + $parentDriver->hasInsertID = true; + $parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); + } + + // dayFraction is a day in floating point + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + + $fraction = $dayFraction * 24 * 3600; + return $date . ' + INTERVAL ' . $fraction.' SECOND'; + +// return "from_unixtime(unix_timestamp($date)+$fraction)"; + } + + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // suggestion by andrew005#mnogo.ru + $s = implode(',',$arr); + if (strlen($s) > 0) return "CONCAT($s)"; return ''; + } + + function ServerInfo() + { + $arr['description'] = ADOConnection::GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $save = $this->metaTablesSQL; + if ($showSchema && is_string($showSchema)) { + $this->metaTablesSQL .= " from $showSchema"; + } + + if ($mask) { + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + $this->metaTablesSQL = $save; + return $ret; + } + + function SetTransactionMode( $transaction_mode ) + { + $this->_transmode = $transaction_mode; + if (empty($transaction_mode)) { + $this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ'); + return; + } + if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; + $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); + } + + function MetaColumns($table,$normalize=true) + { + $this->_findschema($table,$schema); + if ($schema) { + $dbName = $this->database; + $this->SelectDB($schema); + } + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + + if ($schema) { + $this->SelectDB($dbName); + } + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!is_object($rs)) { + $false = false; + return $false; + } + + $retarr = array(); + while (!$rs->EOF){ + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $type = $rs->fields[1]; + + // split type into type(length): + $fld->scale = null; + if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; + } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { + $fld->type = $query_array[1]; + $arr = explode(",",$query_array[2]); + $fld->enums = $arr; + $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 + $fld->max_length = ($zlen > 0) ? $zlen : 1; + } else { + $fld->type = $type; + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($type,'blob') !== false); + $fld->unsigned = (strpos($type,'unsigned') !== false); + + if (!$fld->binary) { + $d = $rs->fields[4]; + if ($d != '' && $d != 'NULL') { + $fld->has_default = true; + $fld->default_value = $d; + } else { + $fld->has_default = false; + } + } + + if ($save == ADODB_FETCH_NUM) { + $retarr[] = $fld; + } else { + $retarr[strtoupper($fld->name)] = $fld; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $retarr; + } + + + // parameters use PostgreSQL convention, not MySQL + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) + { + $offsetStr =($offset>=0) ? "$offset," : ''; + // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220 + if ($nrows < 0) $nrows = '18446744073709551615'; + + if ($secs) + $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr); + else + $rs = $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr); + return $rs; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_oci.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_oci.inc.php new file mode 100644 index 000000000..4ba017a0b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_oci.inc.php @@ -0,0 +1,93 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + +*/ + +class ADODB_pdo_oci extends ADODB_pdo_base { + + var $concat_operator='||'; + var $sysDate = "TRUNC(SYSDATE)"; + var $sysTimeStamp = 'SYSDATE'; + var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS' + var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)"; + var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW')"; + var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; + + var $_initdate = true; + var $_hasdual = true; + + function _init($parentDriver) + { + $parentDriver->_bindInputArray = true; + $parentDriver->_nestedSQL = true; + if ($this->_initdate) { + $parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); + } + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtoupper($mask)); + $this->metaTablesSQL .= " AND table_name like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!$rs) { + return $false; + } + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + $fld->scale = $rs->fields[3]; + if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) { + $fld->type ='INT'; + $fld->max_length = $rs->fields[4]; + } + $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); + $fld->binary = (strpos($fld->type,'BLOB') !== false); + $fld->default_value = $rs->fields[6]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) + return $false; + else + return $retarr; + } +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_pgsql.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_pgsql.inc.php new file mode 100644 index 000000000..8c67a8491 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_pgsql.inc.php @@ -0,0 +1,230 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + +*/ + +class ADODB_pdo_pgsql extends ADODB_pdo { + var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1"; + var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages', + 'sql_packages', 'sql_sizing', 'sql_sizing_profiles') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%'"; + //"select tablename from pg_tables where tablename not like 'pg_%' order by 1"; + var $isoDates = true; // accepts dates in ISO format + var $sysDate = "CURRENT_DATE"; + var $sysTimeStamp = "CURRENT_TIMESTAMP"; + var $blobEncodeType = 'C'; + var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum + FROM pg_class c, pg_attribute a,pg_type t + WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%' +AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // used when schema defined + var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum +FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n +WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) + and c.relnamespace=n.oid and n.nspname='%s' + and a.attname not like '....%%' AND a.attnum > 0 + AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // get primary key etc -- from Freek Dijkstra + var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key + FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'"; + + var $hasAffectedRows = true; + var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + // below suggested by Freek Dijkstra + var $true = 't'; // string that represents TRUE for a database + var $false = 'f'; // string that represents FALSE for a database + var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt. + var $hasMoveFirst = true; + var $hasGenID = true; + var $_genIDSQL = "SELECT NEXTVAL('%s')"; + var $_genSeqSQL = "CREATE SEQUENCE %s START %s"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum"; + var $random = 'random()'; /// random function + var $concat_operator='||'; + + function _init($parentDriver) + { + + $parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver + $parentDriver->hasInsertID = true; + $parentDriver->_nestedSQL = true; + } + + function ServerInfo() + { + $arr['description'] = ADOConnection::GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; + $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ''; + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $info = $this->ServerInfo(); + if ($info['version'] >= 7.3) { + $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and schemaname not in ( 'pg_catalog','information_schema') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') "; + } + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtolower($mask)); + if ($info['version']>=7.3) + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema') + union +select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') "; + else + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask + union +select viewname,'V' from pg_views where viewname like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $this->_findschema($table,$schema); + + if ($normalize) $table = strtolower($table); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema)); + else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) { + $false = false; + return $false; + } + if (!empty($this->metaKeySQL)) { + // If we want the primary keys, we have to issue a separate query + // Of course, a modified version of the metaColumnsSQL query using a + // LEFT JOIN would have been much more elegant, but postgres does + // not support OUTER JOINS. So here is the clumsy way. + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + $rskey = $this->Execute(sprintf($this->metaKeySQL,($table))); + // fetch all result in once for performance. + $keys = $rskey->GetArray(); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + $rskey->Close(); + unset($rskey); + } + + $rsdefa = array(); + if (!empty($this->metaDefaultsSQL)) { + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $sql = sprintf($this->metaDefaultsSQL, ($table)); + $rsdef = $this->Execute($sql); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rsdef) { + while (!$rsdef->EOF) { + $num = $rsdef->fields['num']; + $s = $rsdef->fields['def']; + if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */ + $s = substr($s, 1); + $s = substr($s, 0, strlen($s) - 1); + } + + $rsdefa[$num] = $s; + $rsdef->MoveNext(); + } + } else { + ADOConnection::outp( "==> SQL => " . $sql); + } + unset($rsdef); + } + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4; + if ($fld->max_length <= 0) $fld->max_length = -1; + if ($fld->type == 'numeric') { + $fld->scale = $fld->max_length & 0xFFFF; + $fld->max_length >>= 16; + } + // dannym + // 5 hasdefault; 6 num-of-column + $fld->has_default = ($rs->fields[5] == 't'); + if ($fld->has_default) { + $fld->default_value = $rsdefa[$rs->fields[6]]; + } + + //Freek + if ($rs->fields[4] == $this->true) { + $fld->not_null = true; + } + + // Freek + if (is_array($keys)) { + foreach($keys as $key) { + if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true) + $fld->primary_key = true; + if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true) + $fld->unique = true; // What name is more compatible? + } + } + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) { + $false = false; + return $false; + } else return $retarr; + + } + +} + +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_sqlite.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_sqlite.inc.php new file mode 100644 index 000000000..af2d64caf --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-pdo_sqlite.inc.php @@ -0,0 +1,190 @@ +<?php + +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Thanks Diogo Toscano (diogo#scriptcase.net) for the code. + And also Sid Dunayer [sdunayer#interserv.com] for extensive fixes. +*/ + +class ADODB_pdo_sqlite extends ADODB_pdo { + var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table'"; + var $sysDate = 'current_date'; + var $sysTimeStamp = 'current_timestamp'; + var $nameQuote = '`'; + var $replaceQuote = "''"; + var $hasGenID = true; + var $_genIDSQL = "UPDATE %s SET id=id+1 WHERE id=%s"; + var $_genSeqSQL = "CREATE TABLE %s (id integer)"; + var $_genSeqCountSQL = 'SELECT COUNT(*) FROM %s'; + var $_genSeq2SQL = 'INSERT INTO %s VALUES(%s)'; + var $_dropSeqSQL = 'DROP TABLE %s'; + var $concat_operator = '||'; + var $pdoDriver = false; + + function _init($parentDriver) + { + $this->pdoDriver = $parentDriver; + $parentDriver->_bindInputArray = true; + $parentDriver->hasTransactions = true; + $parentDriver->hasInsertID = true; + } + + function ServerInfo() + { + $parent = $this->pdoDriver; + @($ver = array_pop($parent->GetCol("SELECT sqlite_version()"))); + @($end = array_pop($parent->GetCol("PRAGMA encoding"))); + + $arr['version'] = $ver; + $arr['description'] = 'SQLite '; + $arr['encoding'] = $enc; + + return $arr; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $parent = $this->pdoDriver; + $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; + $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : ''); + if ($secs2cache) + $rs = $parent->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $parent->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + + function GenID($seq='adodbseq',$start=1) + { + $parent = $this->pdoDriver; + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $MAXLOOPS = 100; + while (--$MAXLOOPS>=0) { + @($num = array_pop($parent->GetCol("SELECT id FROM {$seq}"))); + if ($num === false || !is_numeric($num)) { + @$parent->Execute(sprintf($this->_genSeqSQL ,$seq)); + $start -= 1; + $num = '0'; + $cnt = $parent->GetOne(sprintf($this->_genSeqCountSQL,$seq)); + if (!$cnt) { + $ok = $parent->Execute(sprintf($this->_genSeq2SQL,$seq,$start)); + } + if (!$ok) return false; + } + $parent->Execute(sprintf($this->_genIDSQL,$seq,$num)); + + if ($parent->affected_rows() > 0) { + $num += 1; + $parent->genID = intval($num); + return intval($num); + } + } + if ($fn = $parent->raiseErrorFn) { + $fn($parent->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + function CreateSequence($seqname='adodbseq',$start=1) + { + $parent = $this->pdoDriver; + $ok = $parent->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + $start -= 1; + return $parent->Execute("insert into $seqname values($start)"); + } + + function SetTransactionMode($transaction_mode) + { + $parent = $this->pdoDriver; + $parent->_transmode = strtoupper($transaction_mode); + } + + function BeginTrans() + { + $parent = $this->pdoDriver; + if ($parent->transOff) return true; + $parent->transCnt += 1; + $parent->_autocommit = false; + return $parent->Execute("BEGIN {$parent->_transmode}"); + } + + function CommitTrans($ok=true) + { + $parent = $this->pdoDriver; + if ($parent->transOff) return true; + if (!$ok) return $parent->RollbackTrans(); + if ($parent->transCnt) $parent->transCnt -= 1; + $parent->_autocommit = true; + + $ret = $parent->Execute('COMMIT'); + return $ret; + } + + function RollbackTrans() + { + $parent = $this->pdoDriver; + if ($parent->transOff) return true; + if ($parent->transCnt) $parent->transCnt -= 1; + $parent->_autocommit = true; + + $ret = $parent->Execute('ROLLBACK'); + return $ret; + } + + + // mark newnham + function MetaColumns($tab,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $parent = $this->pdoDriver; + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($parent->fetchMode !== false) $savem = $parent->SetFetchMode(false); + $rs = $parent->Execute("PRAGMA table_info('$tab')"); + if (isset($savem)) $parent->SetFetchMode($savem); + if (!$rs) { + $ADODB_FETCH_MODE = $save; + return $false; + } + $arr = array(); + while ($r = $rs->FetchRow()) { + $type = explode('(',$r['type']); + $size = ''; + if (sizeof($type)==2) + $size = trim($type[1],')'); + $fn = strtoupper($r['name']); + $fld = new ADOFieldObject; + $fld->name = $r['name']; + $fld->type = $type[0]; + $fld->max_length = $size; + $fld->not_null = $r['notnull']; + $fld->primary_key = $r['pk']; + $fld->default_value = $r['dflt_value']; + $fld->scale = 0; + if ($save == ADODB_FETCH_NUM) $arr[] = $fld; + else $arr[strtoupper($fld->name)] = $fld; + } + $rs->Close(); + $ADODB_FETCH_MODE = $save; + return $arr; + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $parent = $this->pdoDriver; + return $parent->GetCol($this->metaTablesSQL); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres.inc.php new file mode 100644 index 000000000..491e4ccdb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres.inc.php @@ -0,0 +1,14 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4. + + NOTE: Since 3.31, this file is no longer used, and the "postgres" driver is + remapped to "postgres7". Maintaining multiple postgres drivers is no easy + job, so hopefully this will ensure greater consistency and fewer bugs. +*/ + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres64.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres64.inc.php new file mode 100644 index 000000000..1444d02dc --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres64.inc.php @@ -0,0 +1,1071 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + + Original version derived from Alberto Cerezal (acerezalp@dbnet.es) - DBNet Informatica & Comunicaciones. + 08 Nov 2000 jlim - Minor corrections, removing mysql stuff + 09 Nov 2000 jlim - added insertid support suggested by "Christopher Kings-Lynne" <chriskl@familyhealth.com.au> + jlim - changed concat operator to || and data types to MetaType to match documented pgsql types + see http://www.postgresql.org/devel-corner/docs/postgres/datatype.htm + 22 Nov 2000 jlim - added changes to FetchField() and MetaTables() contributed by "raser" <raser@mail.zen.com.tw> + 27 Nov 2000 jlim - added changes to _connect/_pconnect from ideas by "Lennie" <leen@wirehub.nl> + 15 Dec 2000 jlim - added changes suggested by Additional code changes by "Eric G. Werk" egw@netguide.dk. + 31 Jan 2002 jlim - finally installed postgresql. testing + 01 Mar 2001 jlim - Freek Dijkstra changes, also support for text type + + See http://www.varlena.com/varlena/GeneralBits/47.php + + -- What indexes are on my table? + select * from pg_indexes where tablename = 'tablename'; + + -- What triggers are on my table? + select c.relname as "Table", t.tgname as "Trigger Name", + t.tgconstrname as "Constraint Name", t.tgenabled as "Enabled", + t.tgisconstraint as "Is Constraint", cc.relname as "Referenced Table", + p.proname as "Function Name" + from pg_trigger t, pg_class c, pg_class cc, pg_proc p + where t.tgfoid = p.oid and t.tgrelid = c.oid + and t.tgconstrrelid = cc.oid + and c.relname = 'tablename'; + + -- What constraints are on my table? + select r.relname as "Table", c.conname as "Constraint Name", + contype as "Constraint Type", conkey as "Key Columns", + confkey as "Foreign Columns", consrc as "Source" + from pg_class r, pg_constraint c + where r.oid = c.conrelid + and relname = 'tablename'; + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +function adodb_addslashes($s) +{ + $len = strlen($s); + if ($len == 0) return "''"; + if (strncmp($s,"'",1) === 0 && substr($s,$len-1) == "'") return $s; // already quoted + + return "'".addslashes($s)."'"; +} + +class ADODB_postgres64 extends ADOConnection{ + var $databaseType = 'postgres64'; + var $dataProvider = 'postgres'; + var $hasInsertID = true; + var $_resultid = false; + var $concat_operator='||'; + var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1"; + var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages', + 'sql_packages', 'sql_sizing', 'sql_sizing_profiles') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%'"; + //"select tablename from pg_tables where tablename not like 'pg_%' order by 1"; + var $isoDates = true; // accepts dates in ISO format + var $sysDate = "CURRENT_DATE"; + var $sysTimeStamp = "CURRENT_TIMESTAMP"; + var $blobEncodeType = 'C'; + var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum + FROM pg_class c, pg_attribute a,pg_type t + WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%' +AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // used when schema defined + var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum +FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n +WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) + and c.relnamespace=n.oid and n.nspname='%s' + and a.attname not like '....%%' AND a.attnum > 0 + AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; + + // get primary key etc -- from Freek Dijkstra + var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key + FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'"; + + var $hasAffectedRows = true; + var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + // below suggested by Freek Dijkstra + var $true = 'TRUE'; // string that represents TRUE for a database + var $false = 'FALSE'; // string that represents FALSE for a database + var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d H:i:s'"; // used by DBTimeStamp as the default timestamp fmt. + var $hasMoveFirst = true; + var $hasGenID = true; + var $_genIDSQL = "SELECT NEXTVAL('%s')"; + var $_genSeqSQL = "CREATE SEQUENCE %s START %s"; + var $_dropSeqSQL = "DROP SEQUENCE %s"; + var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum"; + var $random = 'random()'; /// random function + var $autoRollback = true; // apparently pgsql does not autorollback properly before php 4.3.4 + // http://bugs.php.net/bug.php?id=25404 + + var $uniqueIisR = true; + var $_bindInputArray = false; // requires postgresql 7.3+ and ability to modify database + var $disableBlobs = false; // set to true to disable blob checking, resulting in 2-5% improvement in performance. + + // The last (fmtTimeStamp is not entirely correct: + // PostgreSQL also has support for time zones, + // and writes these time in this format: "2001-03-01 18:59:26+02". + // There is no code for the "+02" time zone information, so I just left that out. + // I'm not familiar enough with both ADODB as well as Postgres + // to know what the concequences are. The other values are correct (wheren't in 0.94) + // -- Freek Dijkstra + + function ADODB_postgres64() + { + // changes the metaColumnsSQL, adds columns: attnum[6] + } + + function ServerInfo() + { + if (isset($this->version)) return $this->version; + + $arr['description'] = $this->GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + $this->version = $arr; + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " coalesce($field, $ifNull) "; + } + + // get the last id - never tested + function pg_insert_id($tablename,$fieldname) + { + $result=pg_exec($this->_connectionID, "SELECT last_value FROM ${tablename}_${fieldname}_seq"); + if ($result) { + $arr = @pg_fetch_row($result,0); + pg_freeresult($result); + if (isset($arr[0])) return $arr[0]; + } + return false; + } + +/* Warning from http://www.php.net/manual/function.pg-getlastoid.php: +Using a OID as a unique identifier is not generally wise. +Unless you are very careful, you might end up with a tuple having +a different OID if a database must be reloaded. */ + function _insertid($table,$column) + { + if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false; + $oid = pg_getlastoid($this->_resultid); + // to really return the id, we need the table and column-name, else we can only return the oid != id + return empty($table) || empty($column) ? $oid : $this->GetOne("SELECT $column FROM $table WHERE oid=".(int)$oid); + } + +// I get this error with PHP before 4.0.6 - jlim +// Warning: This compilation does not support pg_cmdtuples() in adodb-postgres.inc.php on line 44 + function _affectedrows() + { + if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false; + return pg_cmdtuples($this->_resultid); + } + + + // returns true/false + function BeginTrans() + { + if ($this->transOff) return true; + $this->transCnt += 1; + return @pg_Exec($this->_connectionID, "begin ".$this->_transmode); + } + + function RowLock($tables,$where,$flds='1 as ignore') + { + if (!$this->transCnt) $this->BeginTrans(); + return $this->GetOne("select $flds from $tables where $where for update"); + } + + // returns true/false. + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + + $this->transCnt -= 1; + return @pg_Exec($this->_connectionID, "commit"); + } + + // returns true/false + function RollbackTrans() + { + if ($this->transOff) return true; + $this->transCnt -= 1; + return @pg_Exec($this->_connectionID, "rollback"); + } + + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $info = $this->ServerInfo(); + if ($info['version'] >= 7.3) { + $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' + and schemaname not in ( 'pg_catalog','information_schema') + union + select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') "; + } + if ($mask) { + $save = $this->metaTablesSQL; + $mask = $this->qstr(strtolower($mask)); + if ($info['version']>=7.3) + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema') + union +select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') "; + else + $this->metaTablesSQL = " +select tablename,'T' from pg_tables where tablename like $mask + union +select viewname,'V' from pg_views where viewname like $mask"; + } + $ret = ADOConnection::MetaTables($ttype,$showSchema); + + if ($mask) { + $this->metaTablesSQL = $save; + } + return $ret; + } + + + // if magic quotes disabled, use pg_escape_string() + function qstr($s,$magic_quotes=false) + { + if (is_bool($s)) return $s ? 'true' : 'false'; + + if (!$magic_quotes) { + if (ADODB_PHPVER >= 0x5200) { + return "'".pg_escape_string($this->_connectionID,$s)."'"; + } + if (ADODB_PHPVER >= 0x4200) { + return "'".pg_escape_string($s)."'"; + } + if ($this->replaceQuote[0] == '\\'){ + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\\000"),$s); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + return "'$s'"; + } + + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'TO_CHAR('.$col.",'"; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= 'YYYY'; + break; + case 'Q': + case 'q': + $s .= 'Q'; + break; + + case 'M': + $s .= 'Mon'; + break; + + case 'm': + $s .= 'MM'; + break; + case 'D': + case 'd': + $s .= 'DD'; + break; + + case 'H': + $s.= 'HH24'; + break; + + case 'h': + $s .= 'HH'; + break; + + case 'i': + $s .= 'MI'; + break; + + case 's': + $s .= 'SS'; + break; + + case 'a': + case 'A': + $s .= 'AM'; + break; + + case 'w': + $s .= 'D'; + break; + + case 'l': + $s .= 'DAY'; + break; + + case 'W': + $s .= 'WW'; + break; + + default: + // handle escape characters... + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; + else $s .= '"'.$ch.'"'; + + } + } + return $s. "')"; + } + + + + /* + * Load a Large Object from a file + * - the procedure stores the object id in the table and imports the object using + * postgres proprietary blob handling routines + * + * contributed by Mattia Rossi mattia@technologist.com + * modified for safe mode by juraj chlebec + */ + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + pg_exec ($this->_connectionID, "begin"); + + $fd = fopen($path,'r'); + $contents = fread($fd,filesize($path)); + fclose($fd); + + $oid = pg_lo_create($this->_connectionID); + $handle = pg_lo_open($this->_connectionID, $oid, 'w'); + pg_lo_write($handle, $contents); + pg_lo_close($handle); + + // $oid = pg_lo_import ($path); + pg_exec($this->_connectionID, "commit"); + $rs = ADOConnection::UpdateBlob($table,$column,$oid,$where,$blobtype); + $rez = !empty($rs); + return $rez; + } + + /* + * Deletes/Unlinks a Blob from the database, otherwise it + * will be left behind + * + * Returns TRUE on success or FALSE on failure. + * + * contributed by Todd Rogers todd#windfox.net + */ + function BlobDelete( $blob ) + { + pg_exec ($this->_connectionID, "begin"); + $result = @pg_lo_unlink($blob); + pg_exec ($this->_connectionID, "commit"); + return( $result ); + } + + /* + Hueristic - not guaranteed to work. + */ + function GuessOID($oid) + { + if (strlen($oid)>16) return false; + return is_numeric($oid); + } + + /* + * If an OID is detected, then we use pg_lo_* to open the oid file and read the + * real blob from the db using the oid supplied as a parameter. If you are storing + * blobs using bytea, we autodetect and process it so this function is not needed. + * + * contributed by Mattia Rossi mattia@technologist.com + * + * see http://www.postgresql.org/idocs/index.php?largeobjects.html + * + * Since adodb 4.54, this returns the blob, instead of sending it to stdout. Also + * added maxsize parameter, which defaults to $db->maxblobsize if not defined. + */ + function BlobDecode($blob,$maxsize=false,$hastrans=true) + { + if (!$this->GuessOID($blob)) return $blob; + + if ($hastrans) @pg_exec($this->_connectionID,"begin"); + $fd = @pg_lo_open($this->_connectionID,$blob,"r"); + if ($fd === false) { + if ($hastrans) @pg_exec($this->_connectionID,"commit"); + return $blob; + } + if (!$maxsize) $maxsize = $this->maxblobsize; + $realblob = @pg_loread($fd,$maxsize); + @pg_loclose($fd); + if ($hastrans) @pg_exec($this->_connectionID,"commit"); + return $realblob; + } + + /* + See http://www.postgresql.org/idocs/index.php?datatype-binary.html + + NOTE: SQL string literals (input strings) must be preceded with two backslashes + due to the fact that they must pass through two parsers in the PostgreSQL + backend. + */ + function BlobEncode($blob) + { + if (ADODB_PHPVER >= 0x5200) return pg_escape_bytea($this->_connectionID, $blob); + if (ADODB_PHPVER >= 0x4200) return pg_escape_bytea($blob); + + /*92=backslash, 0=null, 39=single-quote*/ + $badch = array(chr(92),chr(0),chr(39)); # \ null ' + $fixch = array('\\\\134','\\\\000','\\\\047'); + return adodb_str_replace($badch,$fixch,$blob); + + // note that there is a pg_escape_bytea function only for php 4.2.0 or later + } + + // assumes bytea for blob, and varchar for clob + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + + if ($blobtype == 'CLOB') { + return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where"); + } + // do not use bind params which uses qstr(), as blobencode() already quotes data + return $this->Execute("UPDATE $table SET $column='".$this->BlobEncode($val)."'::bytea WHERE $where"); + } + + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + else if (strncmp($date,"'",1) == 0) { + $len = strlen($date); + if (10 <= $len && $len <= 12) $date = 'date '.$date; + else $date = 'timestamp '.$date; + } + + + return "($date+interval'".($dayFraction * 1440)." minutes')"; + #return "($date+interval'$dayFraction days')"; + } + + + // for schema support, pass in the $table param "$schema.$tabname". + // converts field names to lowercase, $upper is ignored + // see http://phplens.com/lens/lensforum/msgs.php?id=14018 for more info + function MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $false = false; + $this->_findschema($table,$schema); + + if ($normalize) $table = strtolower($table); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema)); + else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) { + return $false; + } + if (!empty($this->metaKeySQL)) { + // If we want the primary keys, we have to issue a separate query + // Of course, a modified version of the metaColumnsSQL query using a + // LEFT JOIN would have been much more elegant, but postgres does + // not support OUTER JOINS. So here is the clumsy way. + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + $rskey = $this->Execute(sprintf($this->metaKeySQL,($table))); + // fetch all result in once for performance. + $keys = $rskey->GetArray(); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + $rskey->Close(); + unset($rskey); + } + + $rsdefa = array(); + if (!empty($this->metaDefaultsSQL)) { + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $sql = sprintf($this->metaDefaultsSQL, ($table)); + $rsdef = $this->Execute($sql); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rsdef) { + while (!$rsdef->EOF) { + $num = $rsdef->fields['num']; + $s = $rsdef->fields['def']; + if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */ + $s = substr($s, 1); + $s = substr($s, 0, strlen($s) - 1); + } + + $rsdefa[$num] = $s; + $rsdef->MoveNext(); + } + } else { + ADOConnection::outp( "==> SQL => " . $sql); + } + unset($rsdef); + } + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + $fld->max_length = $rs->fields[2]; + $fld->attnum = $rs->fields[6]; + + if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4; + if ($fld->max_length <= 0) $fld->max_length = -1; + if ($fld->type == 'numeric') { + $fld->scale = $fld->max_length & 0xFFFF; + $fld->max_length >>= 16; + } + // dannym + // 5 hasdefault; 6 num-of-column + $fld->has_default = ($rs->fields[5] == 't'); + if ($fld->has_default) { + $fld->default_value = $rsdefa[$rs->fields[6]]; + } + + //Freek + $fld->not_null = $rs->fields[4] == 't'; + + + // Freek + if (is_array($keys)) { + foreach($keys as $key) { + if ($fld->name == $key['column_name'] AND $key['primary_key'] == 't') + $fld->primary_key = true; + if ($fld->name == $key['column_name'] AND $key['unique_key'] == 't') + $fld->unique = true; // What name is more compatible? + } + } + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld; + + $rs->MoveNext(); + } + $rs->Close(); + if (empty($retarr)) + return $false; + else + return $retarr; + + } + + function MetaIndexes ($table, $primary = FALSE) + { + global $ADODB_FETCH_MODE; + + $schema = false; + $this->_findschema($table,$schema); + + if ($schema) { // requires pgsql 7.3+ - pg_namespace used. + $sql = ' +SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns" +FROM pg_catalog.pg_class c +JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid +JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid + ,pg_namespace n +WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\')) and c.relnamespace=c2.relnamespace and c.relnamespace=n.oid and n.nspname=\'%s\''; + } else { + $sql = ' +SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns" +FROM pg_catalog.pg_class c +JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid +JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid +WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))'; + } + + if ($primary == FALSE) { + $sql .= ' AND i.indisprimary=false;'; + } + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute(sprintf($sql,$table,$table,$schema)); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + $false = false; + return $false; + } + + $col_names = $this->MetaColumnNames($table,true,true); + //3rd param is use attnum, + // see http://sourceforge.net/tracker/index.php?func=detail&aid=1451245&group_id=42718&atid=433976 + $indexes = array(); + while ($row = $rs->FetchRow()) { + $columns = array(); + foreach (explode(' ', $row[2]) as $col) { + $columns[] = $col_names[$col]; + } + + $indexes[$row[0]] = array( + 'unique' => ($row[1] == 't'), + 'columns' => $columns + ); + } + return $indexes; + } + + // returns true or false + // + // examples: + // $db->Connect("host=host1 user=user1 password=secret port=4341"); + // $db->Connect('host1','user1','secret'); + function _connect($str,$user='',$pwd='',$db='',$ctype=0) + { + + if (!function_exists('pg_connect')) return null; + + $this->_errorMsg = false; + + if ($user || $pwd || $db) { + $user = adodb_addslashes($user); + $pwd = adodb_addslashes($pwd); + if (strlen($db) == 0) $db = 'template1'; + $db = adodb_addslashes($db); + if ($str) { + $host = split(":", $str); + if ($host[0]) $str = "host=".adodb_addslashes($host[0]); + else $str = ''; + if (isset($host[1])) $str .= " port=$host[1]"; + else if (!empty($this->port)) $str .= " port=".$this->port; + } + if ($user) $str .= " user=".$user; + if ($pwd) $str .= " password=".$pwd; + if ($db) $str .= " dbname=".$db; + } + + //if ($user) $linea = "user=$user host=$linea password=$pwd dbname=$db port=5432"; + + if ($ctype === 1) { // persistent + $this->_connectionID = pg_pconnect($str); + } else { + if ($ctype === -1) { // nconnect, we trick pgsql ext by changing the connection str + static $ncnt; + + if (empty($ncnt)) $ncnt = 1; + else $ncnt += 1; + + $str .= str_repeat(' ',$ncnt); + } + $this->_connectionID = pg_connect($str); + } + if ($this->_connectionID === false) return false; + $this->Execute("set datestyle='ISO'"); + + $info = $this->ServerInfo(); + $this->pgVersion = (float) substr($info['version'],0,3); + if ($this->pgVersion >= 7.1) { // good till version 999 + $this->_nestedSQL = true; + } + return true; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName,-1); + } + + // returns true or false + // + // examples: + // $db->PConnect("host=host1 user=user1 password=secret port=4341"); + // $db->PConnect('host1','user1','secret'); + function _pconnect($str,$user='',$pwd='',$db='') + { + return $this->_connect($str,$user,$pwd,$db,1); + } + + + // returns queryID or false + function _query($sql,$inputarr=false) + { + $this->_errorMsg = false; + if ($inputarr) { + /* + It appears that PREPARE/EXECUTE is slower for many queries. + + For query executed 1000 times: + "select id,firstname,lastname from adoxyz + where firstname not like ? and lastname not like ? and id = ?" + + with plan = 1.51861286163 secs + no plan = 1.26903700829 secs + + + + */ + $plan = 'P'.md5($sql); + + $execp = ''; + foreach($inputarr as $v) { + if ($execp) $execp .= ','; + if (is_string($v)) { + if (strncmp($v,"'",1) !== 0) $execp .= $this->qstr($v); + } else { + $execp .= $v; + } + } + + if ($execp) $exsql = "EXECUTE $plan ($execp)"; + else $exsql = "EXECUTE $plan"; + + + $rez = @pg_exec($this->_connectionID,$exsql); + if (!$rez) { + # Perhaps plan does not exist? Prepare/compile plan. + $params = ''; + foreach($inputarr as $v) { + if ($params) $params .= ','; + if (is_string($v)) { + $params .= 'VARCHAR'; + } else if (is_integer($v)) { + $params .= 'INTEGER'; + } else { + $params .= "REAL"; + } + } + $sqlarr = explode('?',$sql); + //print_r($sqlarr); + $sql = ''; + $i = 1; + foreach($sqlarr as $v) { + $sql .= $v.' $'.$i; + $i++; + } + $s = "PREPARE $plan ($params) AS ".substr($sql,0,strlen($sql)-2); + //adodb_pr($s); + $rez = pg_exec($this->_connectionID,$s); + //echo $this->ErrorMsg(); + } + if ($rez) + $rez = pg_exec($this->_connectionID,$exsql); + } else { + //adodb_backtrace(); + $rez = pg_exec($this->_connectionID,$sql); + } + // check if no data returned, then no need to create real recordset + if ($rez && pg_numfields($rez) <= 0) { + if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') { + pg_freeresult($this->_resultid); + } + $this->_resultid = $rez; + return true; + } + + return $rez; + } + + function _errconnect() + { + if (defined('DB_ERROR_CONNECT_FAILED')) return DB_ERROR_CONNECT_FAILED; + else return 'Database connection failed'; + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + if ($this->_errorMsg !== false) return $this->_errorMsg; + if (ADODB_PHPVER >= 0x4300) { + if (!empty($this->_resultid)) { + $this->_errorMsg = @pg_result_error($this->_resultid); + if ($this->_errorMsg) return $this->_errorMsg; + } + + if (!empty($this->_connectionID)) { + $this->_errorMsg = @pg_last_error($this->_connectionID); + } else $this->_errorMsg = $this->_errconnect(); + } else { + if (empty($this->_connectionID)) $this->_errconnect(); + else $this->_errorMsg = @pg_errormessage($this->_connectionID); + } + return $this->_errorMsg; + } + + function ErrorNo() + { + $e = $this->ErrorMsg(); + if (strlen($e)) { + return ADOConnection::MetaError($e); + } + return 0; + } + + // returns true or false + function _close() + { + if ($this->transCnt) $this->RollbackTrans(); + if ($this->_resultid) { + @pg_freeresult($this->_resultid); + $this->_resultid = false; + } + @pg_close($this->_connectionID); + $this->_connectionID = false; + return true; + } + + + /* + * Maximum size of C field + */ + function CharMax() + { + return 1000000000; // should be 1 Gb? + } + + /* + * Maximum size of X field + */ + function TextMax() + { + return 1000000000; // should be 1 Gb? + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_postgres64 extends ADORecordSet{ + var $_blobArr; + var $databaseType = "postgres64"; + var $canSeek = true; + function ADORecordSet_postgres64($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break; + + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: $this->fetchMode = PGSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function GetRowAssoc($upper=true) + { + if ($this->fetchMode == PGSQL_ASSOC && !$upper) return $this->fields; + $row = ADORecordSet::GetRowAssoc($upper); + return $row; + } + + function _initrs() + { + global $ADODB_COUNTRECS; + $qid = $this->_queryID; + $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($qid):-1; + $this->_numOfFields = @pg_numfields($qid); + + // cache types for blob decode check + // apparently pg_fieldtype actually performs an sql query on the database to get the type. + if (empty($this->connection->noBlobs)) + for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { + if (pg_fieldtype($qid,$i) == 'bytea') { + $this->_blobArr[$i] = pg_fieldname($qid,$i); + } + } + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + if ($this->fetchMode != PGSQL_NUM) return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function FetchField($off = 0) + { + // offsets begin at 0 + + $o= new ADOFieldObject(); + $o->name = @pg_fieldname($this->_queryID,$off); + $o->type = @pg_fieldtype($this->_queryID,$off); + $o->max_length = @pg_fieldsize($this->_queryID,$off); + return $o; + } + + function _seek($row) + { + return @pg_fetch_row($this->_queryID,$row); + } + + function _decode($blob) + { + if ($blob === NULL) return NULL; + eval('$realblob="'.adodb_str_replace(array('"','$'),array('\"','\$'),$blob).'";'); + return $realblob; + } + + function _fixblobs() + { + if ($this->fetchMode == PGSQL_NUM || $this->fetchMode == PGSQL_BOTH) { + foreach($this->_blobArr as $k => $v) { + $this->fields[$k] = ADORecordSet_postgres64::_decode($this->fields[$k]); + } + } + if ($this->fetchMode == PGSQL_ASSOC || $this->fetchMode == PGSQL_BOTH) { + foreach($this->_blobArr as $k => $v) { + $this->fields[$v] = ADORecordSet_postgres64::_decode($this->fields[$v]); + } + } + } + + // 10% speedup to move MoveNext to child class + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + if (is_array($this->fields) && $this->fields) { + if (isset($this->_blobArr)) $this->_fixblobs(); + return true; + } + } + $this->fields = false; + $this->EOF = true; + } + return false; + } + + function _fetch() + { + + if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) + return false; + + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); + + return (is_array($this->fields)); + } + + function _close() + { + return @pg_freeresult($this->_queryID); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'MONEY': // stupid, postgres expects money to be a string + case 'INTERVAL': + case 'CHAR': + case 'CHARACTER': + case 'VARCHAR': + case 'NAME': + case 'BPCHAR': + case '_VARCHAR': + case 'INET': + case 'MACADDR': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + return 'X'; + + case 'IMAGE': // user defined type + case 'BLOB': // user defined type + case 'BIT': // This is a bit string, not a single bit, so don't return 'L' + case 'VARBIT': + case 'BYTEA': + return 'B'; + + case 'BOOL': + case 'BOOLEAN': + return 'L'; + + case 'DATE': + return 'D'; + + + case 'TIMESTAMP WITHOUT TIME ZONE': + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': + case 'TIMESTAMPTZ': + return 'T'; + + case 'SMALLINT': + case 'BIGINT': + case 'INTEGER': + case 'INT8': + case 'INT4': + case 'INT2': + if (isset($fieldobj) && + empty($fieldobj->primary_key) && (!$this->uniqueIisR || empty($fieldobj->unique))) return 'I'; + + case 'OID': + case 'SERIAL': + return 'R'; + + default: + return 'N'; + } + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres7.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres7.inc.php new file mode 100644 index 000000000..191ee3608 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres7.inc.php @@ -0,0 +1,313 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4. + + Postgres7 support. + 28 Feb 2001: Currently indicate that we support LIMIT + 01 Dec 2001: dannym added support for default values +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR."/drivers/adodb-postgres64.inc.php"); + +class ADODB_postgres7 extends ADODB_postgres64 { + var $databaseType = 'postgres7'; + var $hasLimit = true; // set to true for pgsql 6.5+ only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + var $ansiOuter = true; + var $charSet = true; //set to true for Postgres 7 and above - PG client supports encodings + + function ADODB_postgres7() + { + $this->ADODB_postgres64(); + if (ADODB_ASSOC_CASE !== 2) { + $this->rsPrefix .= 'assoc_'; + } + $this->_bindInputArray = PHP_VERSION >= 5.1; + } + + + // the following should be compat with postgresql 7.2, + // which makes obsolete the LIMIT limit,offset syntax + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : ''; + $limitStr = ($nrows >= 0) ? " LIMIT ".((integer)$nrows) : ''; + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + /* + function Prepare($sql) + { + $info = $this->ServerInfo(); + if ($info['version']>=7.3) { + return array($sql,false); + } + return $sql; + } + */ + + /* + I discovered that the MetaForeignKeys method no longer worked for Postgres 8.3. + I went ahead and modified it to work for both 8.2 and 8.3. + Please feel free to include this change in your next release of adodb. + William Kolodny [William.Kolodny#gt-t.net] + */ + function MetaForeignKeys($table, $owner=false, $upper=false) + { + $sql=" + SELECT fum.ftblname AS lookup_table, split_part(fum.rf, ')'::text, 1) AS lookup_field, + fum.ltable AS dep_table, split_part(fum.lf, ')'::text, 1) AS dep_field + FROM ( + SELECT fee.ltable, fee.ftblname, fee.consrc, split_part(fee.consrc,'('::text, 2) AS lf, + split_part(fee.consrc, '('::text, 3) AS rf + FROM ( + SELECT foo.relname AS ltable, foo.ftblname, + pg_get_constraintdef(foo.oid) AS consrc + FROM ( + SELECT c.oid, c.conname AS name, t.relname, ft.relname AS ftblname + FROM pg_constraint c + JOIN pg_class t ON (t.oid = c.conrelid) + JOIN pg_class ft ON (ft.oid = c.confrelid) + JOIN pg_namespace nft ON (nft.oid = ft.relnamespace) + LEFT JOIN pg_description ds ON (ds.objoid = c.oid) + JOIN pg_namespace n ON (n.oid = t.relnamespace) + WHERE c.contype = 'f'::\"char\" + ORDER BY t.relname, n.nspname, c.conname, c.oid + ) foo + ) fee) fum + WHERE fum.ltable='".strtolower($table)."' + ORDER BY fum.ftblname, fum.ltable, split_part(fum.lf, ')'::text, 1) + "; + $rs = $this->Execute($sql); + + if (!$rs || $rs->EOF) return false; + + $a = array(); + while (!$rs->EOF) { + if ($upper) { + $a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'))); + } else { + $a[$rs->Fields('lookup_table')][] = str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')); + } + $rs->MoveNext(); + } + + return $a; + + } + + // from Edward Jaramilla, improved version - works on pg 7.4 + function _old_MetaForeignKeys($table, $owner=false, $upper=false) + { + $sql = 'SELECT t.tgargs as args + FROM + pg_trigger t,pg_class c,pg_proc p + WHERE + t.tgenabled AND + t.tgrelid = c.oid AND + t.tgfoid = p.oid AND + p.proname = \'RI_FKey_check_ins\' AND + c.relname = \''.strtolower($table).'\' + ORDER BY + t.tgrelid'; + + $rs = $this->Execute($sql); + + if (!$rs || $rs->EOF) return false; + + $arr = $rs->GetArray(); + $a = array(); + foreach($arr as $v) { + $data = explode(chr(0), $v['args']); + $size = count($data)-1; //-1 because the last node is empty + for($i = 4; $i < $size; $i++) { + if ($upper) + $a[strtoupper($data[2])][] = strtoupper($data[$i].'='.$data[++$i]); + else + $a[$data[2]][] = $data[$i].'='.$data[++$i]; + } + } + return $a; + } + + function _query($sql,$inputarr=false) + { + if (! $this->_bindInputArray) { + // We don't have native support for parameterized queries, so let's emulate it at the parent + return ADODB_postgres64::_query($sql, $inputarr); + } + $this->_errorMsg = false; + // -- added Cristiano da Cunha Duarte + if ($inputarr) { + $sqlarr = explode('?',trim($sql)); + $sql = ''; + $i = 1; + $last = sizeof($sqlarr)-1; + foreach($sqlarr as $v) { + if ($last < $i) $sql .= $v; + else $sql .= $v.' $'.$i; + $i++; + } + + $rez = pg_query_params($this->_connectionID,$sql, $inputarr); + } else { + $rez = pg_query($this->_connectionID,$sql); + } + // check if no data returned, then no need to create real recordset + if ($rez && pg_numfields($rez) <= 0) { + if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') { + pg_freeresult($this->_resultid); + } + $this->_resultid = $rez; + return true; + } + return $rez; + } + + // this is a set of functions for managing client encoding - very important if the encodings + // of your database and your output target (i.e. HTML) don't match + //for instance, you may have UNICODE database and server it on-site as WIN1251 etc. + // GetCharSet - get the name of the character set the client is using now + // the functions should work with Postgres 7.0 and above, the set of charsets supported + // depends on compile flags of postgres distribution - if no charsets were compiled into the server + // it will return 'SQL_ANSI' always + function GetCharSet() + { + //we will use ADO's builtin property charSet + $this->charSet = @pg_client_encoding($this->_connectionID); + if (!$this->charSet) { + return false; + } else { + return $this->charSet; + } + } + + // SetCharSet - switch the client encoding + function SetCharSet($charset_name) + { + $this->GetCharSet(); + if ($this->charSet !== $charset_name) { + $if = pg_set_client_encoding($this->_connectionID, $charset_name); + if ($if == "0" & $this->GetCharSet() == $charset_name) { + return true; + } else return false; + } else return true; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordSet_postgres7 extends ADORecordSet_postgres64{ + + var $databaseType = "postgres7"; + + + function ADORecordSet_postgres7($queryID,$mode=false) + { + $this->ADORecordSet_postgres64($queryID,$mode); + } + + // 10% speedup to move MoveNext to child class + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if (is_array($this->fields)) { + if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); + return true; + } + } + $this->fields = false; + $this->EOF = true; + } + return false; + } + +} + +class ADORecordSet_assoc_postgres7 extends ADORecordSet_postgres64{ + + var $databaseType = "postgres7"; + + + function ADORecordSet_assoc_postgres7($queryID,$mode=false) + { + $this->ADORecordSet_postgres64($queryID,$mode); + } + + function _fetch() + { + if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) + return false; + + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if ($this->fields) { + if (isset($this->_blobArr)) $this->_fixblobs(); + $this->_updatefields(); + } + + return (is_array($this->fields)); + } + + // Create associative array + function _updatefields() + { + if (ADODB_ASSOC_CASE == 2) return; // native + + $arr = array(); + $lowercase = (ADODB_ASSOC_CASE == 0); + + foreach($this->fields as $k => $v) { + if (is_integer($k)) $arr[$k] = $v; + else { + if ($lowercase) + $arr[strtolower($k)] = $v; + else + $arr[strtoupper($k)] = $v; + } + } + $this->fields = $arr; + } + + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { + $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); + + if (is_array($this->fields)) { + if ($this->fields) { + if (isset($this->_blobArr)) $this->_fixblobs(); + + $this->_updatefields(); + } + return true; + } + } + + + $this->fields = false; + $this->EOF = true; + } + return false; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres8.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres8.inc.php new file mode 100644 index 000000000..05a705eb8 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-postgres8.inc.php @@ -0,0 +1,12 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4. + + NOTE: The "postgres8" driver is remapped to "postgres7". +*/ + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-proxy.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-proxy.inc.php new file mode 100644 index 000000000..f7c5c4c78 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-proxy.inc.php @@ -0,0 +1,33 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4. + + Synonym for csv driver. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (! defined("_ADODB_PROXY_LAYER")) { + define("_ADODB_PROXY_LAYER", 1 ); + include(ADODB_DIR."/drivers/adodb-csv.inc.php"); + + class ADODB_proxy extends ADODB_csv { + var $databaseType = 'proxy'; + var $databaseProvider = 'csv'; + } + class ADORecordset_proxy extends ADORecordset_csv { + var $databaseType = "proxy"; + + function ADORecordset_proxy($id,$mode=false) + { + $this->ADORecordset($id,$mode); + } + }; +} // define + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-sapdb.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-sapdb.inc.php new file mode 100644 index 000000000..5a9aa6a74 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-sapdb.inc.php @@ -0,0 +1,184 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + SAPDB data driver. Requires ODBC. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} +if (!defined('ADODB_SAPDB')){ +define('ADODB_SAPDB',1); + +class ADODB_SAPDB extends ADODB_odbc { + var $databaseType = "sapdb"; + var $concat_operator = '||'; + var $sysDate = 'DATE'; + var $sysTimeStamp = 'TIMESTAMP'; + var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d H:i:s'"; /// used by DBTimeStamp as the default timestamp fmt. + var $hasInsertId = true; + var $_bindInputArray = true; + + function ADODB_SAPDB() + { + //if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC; + $this->ADODB_odbc(); + } + + function ServerInfo() + { + $info = ADODB_odbc::ServerInfo(); + if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) { + $info['version'] = $matches[1]; + } + return $info; + } + + function MetaPrimaryKeys($table) + { + $table = $this->Quote(strtoupper($table)); + + return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"); + } + + function MetaIndexes ($table, $primary = FALSE) + { + $table = $this->Quote(strtoupper($table)); + + $sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ". + " WHERE TABLENAME=$table". + " ORDER BY INDEXNAME,COLUMNNO"; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + $rs = $this->Execute($sql); + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return FALSE; + } + + $indexes = array(); + while ($row = $rs->FetchRow()) { + $indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE'; + $indexes[$row[0]]['columns'][] = $row[2]; + } + if ($primary) { + $indexes['SYSPRIMARYKEYINDEX'] = array( + 'unique' => True, // by definition + 'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"), + ); + } + return $indexes; + } + + function MetaColumns ($table) + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $table = $this->Quote(strtoupper($table)); + + $retarr = array(); + foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column) + { + $fld = new ADOFieldObject(); + $fld->name = $column[0]; + $fld->type = $column[1]; + $fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2]; + $fld->scale = $column[3]; + $fld->not_null = $column[4] == 'NO'; + $fld->primary_key = $column[5] == 'KEY'; + if ($fld->has_default = $column[7]) { + if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') { + $fld->auto_increment = true; + $fld->has_default = false; + } else { + $fld->default_value = $column[6]; + switch($fld->type) { + case 'VARCHAR': + case 'CHARACTER': + case 'LONG': + $fld->default_value = $column[6]; + break; + default: + $fld->default_value = trim($column[6]); + break; + } + } + } + $retarr[$fld->name] = $fld; + } + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + return $retarr; + } + + function MetaColumnNames($table) + { + $table = $this->Quote(strtoupper($table)); + + return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos"); + } + + // unlike it seems, this depends on the db-session and works in a multiuser environment + function _insertid($table,$column) + { + return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL"); + } + + /* + SelectLimit implementation problems: + + The following will return random 10 rows as order by performed after "WHERE rowno<10" + which is not ideal... + + select * from table where rowno < 10 order by 1 + + This means that we have to use the adoconnection base class SelectLimit when + there is an "order by". + + See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html + */ + +}; + + +class ADORecordSet_sapdb extends ADORecordSet_odbc { + + var $databaseType = "sapdb"; + + function ADORecordSet_sapdb($id,$mode=false) + { + $this->ADORecordSet_odbc($id,$mode); + } +} + +} //define +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlanywhere.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlanywhere.inc.php new file mode 100644 index 000000000..222932308 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlanywhere.inc.php @@ -0,0 +1,169 @@ +<?php +/* +version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights +reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + 21.02.2002 - Wade Johnson wade@wadejohnson.de + Extended ODBC class for Sybase SQLAnywhere. + 1) Added support to retrieve the last row insert ID on tables with + primary key column using autoincrement function. + + 2) Added blob support. Usage: + a) create blob variable on db server: + + $dbconn->create_blobvar($blobVarName); + + b) load blob var from file. $filename must be complete path + + $dbcon->load_blobvar_from_file($blobVarName, $filename); + + c) Use the $blobVarName in SQL insert or update statement in the values + clause: + + $recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) ' + . + 'VALUES (\'test\', ' . $blobVarName . ')'); + + instead of loading blob from a file, you can also load from + an unformatted (raw) blob variable: + $dbcon->load_blobvar_from_var($blobVarName, $varName); + + d) drop blob variable on db server to free up resources: + $dbconn->drop_blobvar($blobVarName); + + Sybase_SQLAnywhere data driver. Requires ODBC. + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} + +if (!defined('ADODB_SYBASE_SQLANYWHERE')){ + + define('ADODB_SYBASE_SQLANYWHERE',1); + + class ADODB_sqlanywhere extends ADODB_odbc { + var $databaseType = "sqlanywhere"; + var $hasInsertID = true; + + function ADODB_sqlanywhere() + { + $this->ADODB_odbc(); + } + + function _insertid() { + return $this->GetOne('select @@identity'); + } + + function create_blobvar($blobVarName) { + $this->Execute("create variable $blobVarName long binary"); + return; + } + + function drop_blobvar($blobVarName) { + $this->Execute("drop variable $blobVarName"); + return; + } + + function load_blobvar_from_file($blobVarName, $filename) { + $chunk_size = 1000; + + $fd = fopen ($filename, "rb"); + + $integer_chunks = (integer)filesize($filename) / $chunk_size; + $modulus = filesize($filename) % $chunk_size; + if ($modulus != 0){ + $integer_chunks += 1; + } + + for($loop=1;$loop<=$integer_chunks;$loop++){ + $contents = fread ($fd, $chunk_size); + $contents = bin2hex($contents); + + $hexstring = ''; + + for($loop2=0;$loop2<strlen($contents);$loop2+=2){ + $hexstring .= '\x' . substr($contents,$loop2,2); + } + + $hexstring = $this->qstr($hexstring); + + $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); + } + + fclose ($fd); + return; + } + + function load_blobvar_from_var($blobVarName, &$varName) { + $chunk_size = 1000; + + $integer_chunks = (integer)strlen($varName) / $chunk_size; + $modulus = strlen($varName) % $chunk_size; + if ($modulus != 0){ + $integer_chunks += 1; + } + + for($loop=1;$loop<=$integer_chunks;$loop++){ + $contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size); + $contents = bin2hex($contents); + + $hexstring = ''; + + for($loop2=0;$loop2<strlen($contents);$loop2+=2){ + $hexstring .= '\x' . substr($contents,$loop2,2); + } + + $hexstring = $this->qstr($hexstring); + + $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); + } + + return; + } + + /* + Insert a null into the blob field of the table first. + Then use UpdateBlob to store the blob. + + Usage: + + $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB') + { + $blobVarName = 'hold_blob'; + $this->create_blobvar($blobVarName); + $this->load_blobvar_from_var($blobVarName, $val); + $this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where"); + $this->drop_blobvar($blobVarName); + return true; + } + }; //class + + class ADORecordSet_sqlanywhere extends ADORecordSet_odbc { + + var $databaseType = "sqlanywhere"; + + function ADORecordSet_sqlanywhere($id,$mode=false) + { + $this->ADORecordSet_odbc($id,$mode); + } + + + }; //class + + +} //define +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlite.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlite.inc.php new file mode 100644 index 000000000..94fb156bb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlite.inc.php @@ -0,0 +1,398 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Latest version is available at http://adodb.sourceforge.net + + SQLite info: http://www.hwaci.com/sw/sqlite/ + + Install Instructions: + ==================== + 1. Place this in adodb/drivers + 2. Rename the file, remove the .txt prefix. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB_sqlite extends ADOConnection { + var $databaseType = "sqlite"; + var $replaceQuote = "''"; // string to use to replace quotes + var $concat_operator='||'; + var $_errorNo = 0; + var $hasLimit = true; + var $hasInsertID = true; /// supports autoincrement ID? + var $hasAffectedRows = true; /// supports affected rows for update/delete? + var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"; + var $sysDate = "adodb_date('Y-m-d')"; + var $sysTimeStamp = "adodb_date('Y-m-d H:i:s')"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + + function ADODB_sqlite() + { + } + +/* + function __get($name) + { + switch($name) { + case 'sysDate': return "'".date($this->fmtDate)."'"; + case 'sysTimeStamp' : return "'".date($this->sysTimeStamp)."'"; + } + }*/ + + function ServerInfo() + { + $arr['version'] = sqlite_libversion(); + $arr['description'] = 'SQLite '; + $arr['encoding'] = sqlite_libencoding(); + return $arr; + } + + function BeginTrans() + { + if ($this->transOff) return true; + $ret = $this->Execute("BEGIN TRANSACTION"); + $this->transCnt += 1; + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + if (!$ok) return $this->RollbackTrans(); + $ret = $this->Execute("COMMIT"); + if ($this->transCnt>0)$this->transCnt -= 1; + return !empty($ret); + } + + function RollbackTrans() + { + if ($this->transOff) return true; + $ret = $this->Execute("ROLLBACK"); + if ($this->transCnt>0)$this->transCnt -= 1; + return !empty($ret); + } + + // mark newnham + function MetaColumns($table, $normalize=true) + { + global $ADODB_FETCH_MODE; + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute("PRAGMA table_info('$table')"); + if (isset($savem)) $this->SetFetchMode($savem); + if (!$rs) { + $ADODB_FETCH_MODE = $save; + return $false; + } + $arr = array(); + while ($r = $rs->FetchRow()) { + $type = explode('(',$r['type']); + $size = ''; + if (sizeof($type)==2) + $size = trim($type[1],')'); + $fn = strtoupper($r['name']); + $fld = new ADOFieldObject; + $fld->name = $r['name']; + $fld->type = $type[0]; + $fld->max_length = $size; + $fld->not_null = $r['notnull']; + $fld->default_value = $r['dflt_value']; + $fld->scale = 0; + if ($save == ADODB_FETCH_NUM) $arr[] = $fld; + else $arr[strtoupper($fld->name)] = $fld; + } + $rs->Close(); + $ADODB_FETCH_MODE = $save; + return $arr; + } + + function _init($parentDriver) + { + + $parentDriver->hasTransactions = false; + $parentDriver->hasInsertID = true; + } + + function _insertid() + { + return sqlite_last_insert_rowid($this->_connectionID); + } + + function _affectedrows() + { + return sqlite_changes($this->_connectionID); + } + + function ErrorMsg() + { + if ($this->_logsql) return $this->_errorMsg; + return ($this->_errorNo) ? sqlite_error_string($this->_errorNo) : ''; + } + + function ErrorNo() + { + return $this->_errorNo; + } + + function SQLDate($fmt, $col=false) + { + $fmt = $this->qstr($fmt); + return ($col) ? "adodb_date2($fmt,$col)" : "adodb_date($fmt)"; + } + + + function _createFunctions() + { + @sqlite_create_function($this->_connectionID, 'adodb_date', 'adodb_date', 1); + @sqlite_create_function($this->_connectionID, 'adodb_date2', 'adodb_date2', 2); + } + + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sqlite_open')) return null; + if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename; + + $this->_connectionID = sqlite_open($argHostname); + if ($this->_connectionID === false) return false; + $this->_createFunctions(); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sqlite_open')) return null; + if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename; + + $this->_connectionID = sqlite_popen($argHostname); + if ($this->_connectionID === false) return false; + $this->_createFunctions(); + return true; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + $rez = sqlite_query($sql,$this->_connectionID); + if (!$rez) { + $this->_errorNo = sqlite_last_error($this->_connectionID); + } + + return $rez; + } + + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; + $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : ''); + if ($secs2cache) + $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); + else + $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); + + return $rs; + } + + /* + This algorithm is not very efficient, but works even if table locking + is not available. + + Will return false if unable to generate an ID after $MAXLOOPS attempts. + */ + var $_genSeqSQL = "create table %s (id integer)"; + + function GenID($seq='adodbseq',$start=1) + { + // if you have to modify the parameter below, your database is overloaded, + // or you need to implement generation of id's yourself! + $MAXLOOPS = 100; + //$this->debug=1; + while (--$MAXLOOPS>=0) { + @($num = $this->GetOne("select id from $seq")); + if ($num === false) { + $this->Execute(sprintf($this->_genSeqSQL ,$seq)); + $start -= 1; + $num = '0'; + $ok = $this->Execute("insert into $seq values($start)"); + if (!$ok) return false; + } + $this->Execute("update $seq set id=id+1 where id=$num"); + + if ($this->affected_rows() > 0) { + $num += 1; + $this->genID = $num; + return $num; + } + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); + } + return false; + } + + function CreateSequence($seqname='adodbseq',$start=1) + { + if (empty($this->_genSeqSQL)) return false; + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + $start -= 1; + return $this->Execute("insert into $seqname values($start)"); + } + + var $_dropSeqSQL = 'drop table %s'; + function DropSequence($seqname) + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + // returns true or false + function _close() + { + return @sqlite_close($this->_connectionID); + } + + function MetaIndexes($table, $primary = FALSE, $owner=false) + { + $false = false; + // save old fetch mode + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + $SQL=sprintf("SELECT name,sql FROM sqlite_master WHERE type='index' AND tbl_name='%s'", strtolower($table)); + $rs = $this->Execute($SQL); + if (!is_object($rs)) { + if (isset($savem)) + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + return $false; + } + + $indexes = array (); + while ($row = $rs->FetchRow()) { + if ($primary && preg_match("/primary/i",$row[1]) == 0) continue; + if (!isset($indexes[$row[0]])) { + + $indexes[$row[0]] = array( + 'unique' => preg_match("/unique/i",$row[1]), + 'columns' => array()); + } + /** + * There must be a more elegant way of doing this, + * the index elements appear in the SQL statement + * in cols[1] between parentheses + * e.g CREATE UNIQUE INDEX ware_0 ON warehouse (org,warehouse) + */ + $cols = explode("(",$row[1]); + $cols = explode(")",$cols[1]); + array_pop($cols); + $indexes[$row[0]]['columns'] = $cols; + } + if (isset($savem)) { + $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + } + return $indexes; + } + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_sqlite extends ADORecordSet { + + var $databaseType = "sqlite"; + var $bind = false; + + function ADORecordset_sqlite($queryID,$mode=false) + { + + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch($mode) { + case ADODB_FETCH_NUM: $this->fetchMode = SQLITE_NUM; break; + case ADODB_FETCH_ASSOC: $this->fetchMode = SQLITE_ASSOC; break; + default: $this->fetchMode = SQLITE_BOTH; break; + } + $this->adodbFetchMode = $mode; + + $this->_queryID = $queryID; + + $this->_inited = true; + $this->fields = array(); + if ($queryID) { + $this->_currentRow = 0; + $this->EOF = !$this->_fetch(); + @$this->_initrs(); + } else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + $this->EOF = true; + } + + return $this->_queryID; + } + + + function FetchField($fieldOffset = -1) + { + $fld = new ADOFieldObject; + $fld->name = sqlite_field_name($this->_queryID, $fieldOffset); + $fld->type = 'VARCHAR'; + $fld->max_length = -1; + return $fld; + } + + function _initrs() + { + $this->_numOfRows = @sqlite_num_rows($this->_queryID); + $this->_numOfFields = @sqlite_num_fields($this->_queryID); + } + + function Fields($colname) + { + if ($this->fetchMode != SQLITE_NUM) return $this->fields[$colname]; + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _seek($row) + { + return sqlite_seek($this->_queryID, $row); + } + + function _fetch($ignore_fields=false) + { + $this->fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); + return !empty($this->fields); + } + + function _close() + { + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlitepo.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlitepo.inc.php new file mode 100644 index 000000000..5f3fe34fd --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-sqlitepo.inc.php @@ -0,0 +1,62 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Portable version of sqlite driver, to make it more similar to other database drivers. + The main differences are + + 1. When selecting (joining) multiple tables, in assoc mode the table + names are included in the assoc keys in the "sqlite" driver. + + In "sqlitepo" driver, the table names are stripped from the returned column names. + When this results in a conflict, the first field get preference. + + Contributed by Herman Kuiper herman#ozuzo.net +*/ + +if (!defined('ADODB_DIR')) die(); + +include_once(ADODB_DIR.'/drivers/adodb-sqlite.inc.php'); + +class ADODB_sqlitepo extends ADODB_sqlite { + var $databaseType = 'sqlitepo'; + + function ADODB_sqlitepo() + { + $this->ADODB_sqlite(); + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + +class ADORecordset_sqlitepo extends ADORecordset_sqlite { + + var $databaseType = 'sqlitepo'; + + function ADORecordset_sqlitepo($queryID,$mode=false) + { + $this->ADORecordset_sqlite($queryID,$mode); + } + + // Modified to strip table names from returned fields + function _fetch($ignore_fields=false) + { + $this->fields = array(); + $fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); + if(is_array($fields)) + foreach($fields as $n => $v) + { + if(($p = strpos($n, ".")) !== false) + $n = substr($n, $p+1); + $this->fields[$n] = $v; + } + + return !empty($this->fields); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-sybase.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-sybase.inc.php new file mode 100644 index 000000000..b2a17fb5f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-sybase.inc.php @@ -0,0 +1,428 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim. All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Sybase driver contributed by Toni (toni.tunkkari@finebyte.com) + + - MSSQL date patch applied. + + Date patch by Toni 15 Feb 2002 +*/ + + // security - hide paths +if (!defined('ADODB_DIR')) die(); + +class ADODB_sybase extends ADOConnection { + var $databaseType = "sybase"; + var $dataProvider = 'sybase'; + var $replaceQuote = "''"; // string to use to replace quotes + var $fmtDate = "'Y-m-d'"; + var $fmtTimeStamp = "'Y-m-d H:i:s'"; + var $hasInsertID = true; + var $hasAffectedRows = true; + var $metaTablesSQL="select name from sysobjects where type='U' or type='V'"; + // see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 + var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'"; + /* + "select c.name,t.name,c.length from + syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id + where o.name='%s'"; + */ + var $concat_operator = '+'; + var $arrayClass = 'ADORecordSet_array_sybase'; + var $sysDate = 'GetDate()'; + var $leftOuter = '*='; + var $rightOuter = '=*'; + + function ADODB_sybase() + { + } + + // might require begintrans -- committrans + function _insertid() + { + return $this->GetOne('select @@identity'); + } + // might require begintrans -- committrans + function _affectedrows() + { + return $this->GetOne('select @@rowcount'); + } + + + function BeginTrans() + { + + if ($this->transOff) return true; + $this->transCnt += 1; + + $this->Execute('BEGIN TRAN'); + return true; + } + + function CommitTrans($ok=true) + { + if ($this->transOff) return true; + + if (!$ok) return $this->RollbackTrans(); + + $this->transCnt -= 1; + $this->Execute('COMMIT TRAN'); + return true; + } + + function RollbackTrans() + { + if ($this->transOff) return true; + $this->transCnt -= 1; + $this->Execute('ROLLBACK TRAN'); + return true; + } + + // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4 + function RowLock($tables,$where,$flds='top 1 null as ignore') + { + if (!$this->_hastrans) $this->BeginTrans(); + $tables = str_replace(',',' HOLDLOCK,',$tables); + return $this->GetOne("select $flds from $tables HOLDLOCK where $where"); + + } + + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + return @sybase_select_db($dbName); + } + else return false; + } + + /* Returns: the last error message from previous database operation + Note: This function is NOT available for Microsoft SQL Server. */ + + + function ErrorMsg() + { + if ($this->_logsql) return $this->_errorMsg; + if (function_exists('sybase_get_last_message')) + $this->_errorMsg = sybase_get_last_message(); + else + $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform'; + return $this->_errorMsg; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sybase_connect')) return null; + + if ($this->charSet) { + $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword, $this->charSet); + } else { + $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); + } + + $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!function_exists('sybase_connect')) return null; + + if ($this->charSet) { + $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword, $this->charSet); + } else { + $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword); + } + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns query ID if successful, otherwise false + function _query($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300) + return sybase_unbuffered_query($sql,$this->_connectionID); + else + return sybase_query($sql,$this->_connectionID); + } + + // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12 + function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) + { + if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $rs; + } + + $nrows = (integer) $nrows; + $offset = (integer) $offset; + + $cnt = ($nrows >= 0) ? $nrows : 999999999; + if ($offset > 0 && $cnt) $cnt += $offset; + + $this->Execute("set rowcount $cnt"); + $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0); + $this->Execute("set rowcount 0"); + + return $rs; + } + + // returns true or false + function _close() + { + return @sybase_close($this->_connectionID); + } + + static function UnixDate($v) + { + return ADORecordSet_array_sybase::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_sybase::UnixTimeStamp($v); + } + + + + # Added 2003-10-05 by Chris Phillipson + # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25 + # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = ''; + + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + if ($s) $s .= '+'; + $ch = $fmt[$i]; + switch($ch) { + case 'Y': + case 'y': + $s .= "datename(yy,$col)"; + break; + case 'M': + $s .= "convert(char(3),$col,0)"; + break; + case 'm': + $s .= "str_replace(str(month($col),2),' ','0')"; + break; + case 'Q': + case 'q': + $s .= "datename(qq,$col)"; + break; + case 'D': + case 'd': + $s .= "str_replace(str(datepart(dd,$col),2),' ','0')"; + break; + case 'h': + $s .= "substring(convert(char(14),$col,0),13,2)"; + break; + + case 'H': + $s .= "str_replace(str(datepart(hh,$col),2),' ','0')"; + break; + + case 'i': + $s .= "str_replace(str(datepart(mi,$col),2),' ','0')"; + break; + case 's': + $s .= "str_replace(str(datepart(ss,$col),2),' ','0')"; + break; + case 'a': + case 'A': + $s .= "substring(convert(char(19),$col,0),18,2)"; + break; + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + $s .= $this->qstr($ch); + break; + } + } + return $s; + } + + # Added 2003-10-07 by Chris Phillipson + # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 + # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version + function MetaPrimaryKeys($table) + { + $sql = "SELECT c.column_name " . + "FROM syscolumn c, systable t " . + "WHERE t.table_name='$table' AND c.table_id=t.table_id " . + "AND t.table_type='BASE' " . + "AND c.pkey = 'Y' " . + "ORDER BY c.column_id"; + + $a = $this->GetCol($sql); + if ($a && sizeof($a)>0) return $a; + return false; + } +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ +global $ADODB_sybase_mths; +$ADODB_sybase_mths = array( + 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, + 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); + +class ADORecordset_sybase extends ADORecordSet { + + var $databaseType = "sybase"; + var $canSeek = true; + // _mths works only in non-localised system + var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); + + function ADORecordset_sybase($id,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC; + else $this->fetchMode = $mode; + $this->ADORecordSet($id,$mode); + } + + /* Returns: an object containing field information. + Get column information in the Recordset object. fetchField() can be used in order to obtain information about + fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by + fetchField() is retrieved. */ + function FetchField($fieldOffset = -1) + { + if ($fieldOffset != -1) { + $o = @sybase_fetch_field($this->_queryID, $fieldOffset); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $o = @sybase_fetch_field($this->_queryID); + } + // older versions of PHP did not support type, only numeric + if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar'; + return $o; + } + + function _initrs() + { + global $ADODB_COUNTRECS; + $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1; + $this->_numOfFields = @sybase_num_fields($this->_queryID); + } + + function _seek($row) + { + return @sybase_data_seek($this->_queryID, $row); + } + + function _fetch($ignore_fields=false) + { + if ($this->fetchMode == ADODB_FETCH_NUM) { + $this->fields = @sybase_fetch_row($this->_queryID); + } else if ($this->fetchMode == ADODB_FETCH_ASSOC) { + $this->fields = @sybase_fetch_row($this->_queryID); + if (is_array($this->fields)) { + $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); + return true; + } + return false; + } else { + $this->fields = @sybase_fetch_array($this->_queryID); + } + if ( is_array($this->fields)) { + return true; + } + + return false; + } + + /* close() only needs to be called if you are worried about using too much memory while your script + is running. All associated result memory for the specified result identifier will automatically be freed. */ + function _close() { + return @sybase_free_result($this->_queryID); + } + + // sybase/mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + return ADORecordSet_array_sybase::UnixDate($v); + } + + static function UnixTimeStamp($v) + { + return ADORecordSet_array_sybase::UnixTimeStamp($v); + } +} + +class ADORecordSet_array_sybase extends ADORecordSet_array { + function ADORecordSet_array_sybase($id=-1) + { + $this->ADORecordSet_array($id); + } + + // sybase/mssql uses a default date like Dec 30 2000 12:00AM + static function UnixDate($v) + { + global $ADODB_sybase_mths; + + //Dec 30 2000 12:00AM + if (!preg_match( "/([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})/" + ,$v, $rr)) return parent::UnixDate($v); + + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $themth = substr(strtoupper($rr[1]),0,3); + $themth = $ADODB_sybase_mths[$themth]; + if ($themth <= 0) return false; + // h-m-s-MM-DD-YY + return mktime(0,0,0,$themth,$rr[2],$rr[3]); + } + + static function UnixTimeStamp($v) + { + global $ADODB_sybase_mths; + //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com + //Changed [0-9] to [0-9 ] in day conversion + if (!preg_match( "/([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})/" + ,$v, $rr)) return parent::UnixTimeStamp($v); + if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; + + $themth = substr(strtoupper($rr[1]),0,3); + $themth = $ADODB_sybase_mths[$themth]; + if ($themth <= 0) return false; + + switch (strtoupper($rr[6])) { + case 'P': + if ($rr[4]<12) $rr[4] += 12; + break; + case 'A': + if ($rr[4]==12) $rr[4] = 0; + break; + default: + break; + } + // h-m-s-MM-DD-YY + return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]); + } +} +?> diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-sybase_ase.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-sybase_ase.inc.php new file mode 100644 index 000000000..fbaedeaf2 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-sybase_ase.inc.php @@ -0,0 +1,119 @@ +<?php +/* + V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4. + + Contributed by Interakt Online. Thx Cristian MARIN cristic#interaktonline.com +*/ + + +require_once ADODB_DIR."/drivers/adodb-sybase.inc.php"; + +class ADODB_sybase_ase extends ADODB_sybase { + var $databaseType = "sybase_ase"; + + var $metaTablesSQL="SELECT sysobjects.name FROM sysobjects, sysusers WHERE sysobjects.type='U' AND sysobjects.uid = sysusers.uid"; + var $metaColumnsSQL = "SELECT syscolumns.name AS field_name, systypes.name AS type, systypes.length AS width FROM sysobjects, syscolumns, systypes WHERE sysobjects.name='%s' AND syscolumns.id = sysobjects.id AND systypes.type=syscolumns.type"; + var $metaDatabasesSQL ="SELECT a.name FROM master.dbo.sysdatabases a, master.dbo.syslogins b WHERE a.suid = b.suid and a.name like '%' and a.name != 'tempdb' and a.status3 != 256 order by 1"; + + function ADODB_sybase_ase() + { + } + + // split the Views, Tables and procedures. + function MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $false = false; + if ($this->metaTablesSQL) { + // complicated state saving by the need for backward compat + + if ($ttype == 'VIEWS'){ + $sql = str_replace('U', 'V', $this->metaTablesSQL); + }elseif (false === $ttype){ + $sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL); + }else{ // TABLES OR ANY OTHER + $sql = $this->metaTablesSQL; + } + $rs = $this->Execute($sql); + + if ($rs === false || !method_exists($rs, 'GetArray')){ + return $false; + } + $arr = $rs->GetArray(); + + $arr2 = array(); + foreach($arr as $key=>$value){ + $arr2[] = trim($value['name']); + } + return $arr2; + } + return $false; + } + + function MetaDatabases() + { + $arr = array(); + if ($this->metaDatabasesSQL!='') { + $rs = $this->Execute($this->metaDatabasesSQL); + if ($rs && !$rs->EOF){ + while (!$rs->EOF){ + $arr[] = $rs->Fields('name'); + $rs->MoveNext(); + } + return $arr; + } + } + return false; + } + + // fix a bug which prevent the metaColumns query to be executed for Sybase ASE + function MetaColumns($table,$upper=false) + { + $false = false; + if (!empty($this->metaColumnsSQL)) { + + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + if ($rs === false) return $false; + + $retarr = array(); + while (!$rs->EOF) { + $fld = new ADOFieldObject(); + $fld->name = $rs->Fields('field_name'); + $fld->type = $rs->Fields('type'); + $fld->max_length = $rs->Fields('width'); + $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return $false; + } + + function getProcedureList($schema) + { + return false; + } + + function ErrorMsg() + { + if (!function_exists('sybase_connect')){ + return 'Your PHP doesn\'t contain the Sybase connection module!'; + } + return parent::ErrorMsg(); + } +} + +class adorecordset_sybase_ase extends ADORecordset_sybase { +var $databaseType = "sybase_ase"; +function ADORecordset_sybase_ase($id,$mode=false) + { + $this->ADORecordSet_sybase($id,$mode); + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/drivers/adodb-vfp.inc.php b/pos/is4c-nf/lib/adodb5/drivers/adodb-vfp.inc.php new file mode 100644 index 000000000..501928c21 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/drivers/adodb-vfp.inc.php @@ -0,0 +1,107 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows. +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +if (!defined('_ADODB_ODBC_LAYER')) { + include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); +} +if (!defined('ADODB_VFP')){ +define('ADODB_VFP',1); +class ADODB_vfp extends ADODB_odbc { + var $databaseType = "vfp"; + var $fmtDate = "{^Y-m-d}"; + var $fmtTimeStamp = "{^Y-m-d, h:i:sA}"; + var $replaceQuote = "'+chr(39)+'" ; + var $true = '.T.'; + var $false = '.F.'; + var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE + var $_bindInputArray = false; // strangely enough, setting to true does not work reliably + var $sysTimeStamp = 'datetime()'; + var $sysDate = 'date()'; + var $ansiOuter = true; + var $hasTransactions = false; + var $curmode = false ; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L + + function ADODB_vfp() + { + $this->ADODB_odbc(); + } + + function Time() + { + return time(); + } + + function BeginTrans() { return false;} + + // quote string to be sent back to database + function qstr($s,$nofixquotes=false) + { + if (!$nofixquotes) return "'".str_replace("\r\n","'+chr(13)+'",str_replace("'",$this->replaceQuote,$s))."'"; + return "'".$s."'"; + } + + + // TOP requires ORDER BY for VFP + function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + $this->hasTop = preg_match('/ORDER[ \t\r\n]+BY/is',$sql) ? 'top' : false; + $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + return $ret; + } + + + +}; + + +class ADORecordSet_vfp extends ADORecordSet_odbc { + + var $databaseType = "vfp"; + + + function ADORecordSet_vfp($id,$mode=false) + { + return $this->ADORecordSet_odbc($id,$mode); + } + + function MetaType($t,$len=-1) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + switch (strtoupper($t)) { + case 'C': + if ($len <= $this->blobSize) return 'C'; + case 'M': + return 'X'; + + case 'D': return 'D'; + + case 'T': return 'T'; + + case 'L': return 'L'; + + case 'I': return 'I'; + + default: return 'N'; + } + } +} + +} //define +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-ar.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-ar.inc.php new file mode 100644 index 000000000..4b7509527 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-ar.inc.php @@ -0,0 +1,33 @@ +<?php +// by "El-Shamaa, Khaled" <k.el-shamaa#cgiar.org> +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'ar', + DB_ERROR => 'ÎØÃ ÛíÑ ãÍÏÏ', + DB_ERROR_ALREADY_EXISTS => 'ãæÌæÏ ãÓÈÞÇ', + DB_ERROR_CANNOT_CREATE => 'áÇ íãßä ÅäÔÇÁ', + DB_ERROR_CANNOT_DELETE => 'áÇ íãßä ÍÐÝ', + DB_ERROR_CANNOT_DROP => 'áÇ íãßä ÍÐÝ', + DB_ERROR_CONSTRAINT => 'ÚãáíÉ ÅÏÎÇá ããäæÚÉ', + DB_ERROR_DIVZERO => 'ÚãáíÉ ÇáÊÞÓíã Úáì ÕÝÑ', + DB_ERROR_INVALID => 'ÛíÑ ÕÍíÍ', + DB_ERROR_INVALID_DATE => 'ÕíÛÉ æÞÊ Ãæ ÊÇÑíÎ ÛíÑ ÕÍíÍÉ', + DB_ERROR_INVALID_NUMBER => 'ÕíÛÉ ÑÞã ÛíÑ ÕÍíÍÉ', + DB_ERROR_MISMATCH => 'ÛíÑ ãÊØÇÈÞ', + DB_ERROR_NODBSELECTED => 'áã íÊã ÅÎÊíÇÑ ÞÇÚÏÉ ÇáÈíÇäÇÊ ÈÚÏ', + DB_ERROR_NOSUCHFIELD => 'áíÓ åäÇáß ÍÞá ÈåÐÇ ÇáÇÓã', + DB_ERROR_NOSUCHTABLE => 'áíÓ åäÇáß ÌÏæá ÈåÐÇ ÇáÇÓã', + DB_ERROR_NOT_CAPABLE => 'ÞÇÚÏÉ ÇáÈíÇäÇÊ ÇáãÑÊÈØ ÈåÇ ÛíÑ ÞÇÏÑÉ', + DB_ERROR_NOT_FOUND => 'áã íÊã ÅíÌÇÏå', + DB_ERROR_NOT_LOCKED => 'ÛíÑ ãÞÝæá', + DB_ERROR_SYNTAX => 'ÎØÃ Ýí ÇáÕíÛÉ', + DB_ERROR_UNSUPPORTED => 'ÛíÑ ãÏÚæã', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ÚÏÏ ÇáÞíã Ýí ÇáÓÌá', + DB_ERROR_INVALID_DSN => 'DSN ÛíÑ ÕÍíÍ', + DB_ERROR_CONNECT_FAILED => 'ÝÔá ÚãáíÉ ÇáÅÊÕÇá', + 0 => 'áíÓ åäÇáß ÃÎØÇÁ', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ÇáÈíÇäÇÊ ÇáãÒæÏÉ ÛíÑ ßÇÝíÉ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'áã íÊã ÅíÌÇÏ ÇáÅÖÇÝÉ ÇáãÊÚáÞÉ', + DB_ERROR_NOSUCHDB => 'áíÓ åäÇáß ÞÇÚÏÉ ÈíÇäÇÊ ÈåÐÇ ÇáÇÓã', + DB_ERROR_ACCESS_VIOLATION => 'ÓãÇÍíÇÊ ÛíÑ ßÇÝíÉ' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-bg.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-bg.inc.php new file mode 100644 index 000000000..ee307c13f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-bg.inc.php @@ -0,0 +1,37 @@ +<?php +/* + Bulgarian language, v1.0, 25.03.2004, encoding by Windows-1251 charset + contributed by Valentin Sheiretsky <valio#valio.eu.org> +*/ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'bg', + DB_ERROR => 'íåèçâåñòíà ãðåøêà', + DB_ERROR_ALREADY_EXISTS => 'âå÷å ñúùåñòâóâà', + DB_ERROR_CANNOT_CREATE => 'íå ìîæå äà áúäå ñúçäàäåíà', + DB_ERROR_CANNOT_DELETE => 'íå ìîæå äà áúäå èçòðèòà', + DB_ERROR_CANNOT_DROP => 'íå ìîæå äà áúäå óíèùîæåíà', + DB_ERROR_CONSTRAINT => 'íàðóøåíî óñëîâèå', + DB_ERROR_DIVZERO => 'äåëåíèå íà íóëà', + DB_ERROR_INVALID => 'íåïðàâèëíî', + DB_ERROR_INVALID_DATE => 'íåêîðåêòíà äàòà èëè ÷àñ', + DB_ERROR_INVALID_NUMBER => 'íåâàëèäåí íîìåð', + DB_ERROR_MISMATCH => 'ïîãðåøíà óïîòðåáà', + DB_ERROR_NODBSELECTED => 'íå å èçáðàíà áàçà äàííè', + DB_ERROR_NOSUCHFIELD => 'íåñúùåñòâóâàùî ïîëå', + DB_ERROR_NOSUCHTABLE => 'íåñúùåñòâóâàùà òàáëèöà', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'íå å íàìåðåíà', + DB_ERROR_NOT_LOCKED => 'íå å çàêëþ÷åíà', + DB_ERROR_SYNTAX => 'ãðåøåí ñèíòàêñèñ', + DB_ERROR_UNSUPPORTED => 'íå ñå ïîääúðæà', + DB_ERROR_VALUE_COUNT_ON_ROW => 'íåêîðåêòåí áðîé êîëîíè â ðåäà', + DB_ERROR_INVALID_DSN => 'íåâàëèäåí DSN', + DB_ERROR_CONNECT_FAILED => 'âðúçêàòà íå ìîæå äà áúäå îñúùåñòâåíà', + 0 => 'íÿìà ãðåøêè', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ïðåäîñòàâåíèòå äàííè ñà íåäîñòàòú÷íè', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ðàçøèðåíèåòî íå å íàìåðåíî', + DB_ERROR_NOSUCHDB => 'íåñúùåñòâóâàùà áàçà äàííè', + DB_ERROR_ACCESS_VIOLATION => 'íÿìàòå äîñòàòú÷íî ïðàâà' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-bgutf8.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-bgutf8.inc.php new file mode 100644 index 000000000..5281ed53b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-bgutf8.inc.php @@ -0,0 +1,37 @@ +<?php +/* + Bulgarian language, v1.0, 25.03.2004, encoding by UTF-8 charset + contributed by Valentin Sheiretsky <valio#valio.eu.org> +*/ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'bgutf8', + DB_ERROR => 'неизвеÑтна грешка', + DB_ERROR_ALREADY_EXISTS => 'вече ÑъщеÑтвува', + DB_ERROR_CANNOT_CREATE => 'не може да бъде Ñъздадена', + DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита', + DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена', + DB_ERROR_CONSTRAINT => 'нарушено уÑловие', + DB_ERROR_DIVZERO => 'деление на нула', + DB_ERROR_INVALID => 'неправилно', + DB_ERROR_INVALID_DATE => 'некоректна дата или чаÑ', + DB_ERROR_INVALID_NUMBER => 'невалиден номер', + DB_ERROR_MISMATCH => 'погрешна употреба', + DB_ERROR_NODBSELECTED => 'не е избрана база данни', + DB_ERROR_NOSUCHFIELD => 'неÑъщеÑтвуващо поле', + DB_ERROR_NOSUCHTABLE => 'неÑъщеÑтвуваща таблица', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'не е намерена', + DB_ERROR_NOT_LOCKED => 'не е заключена', + DB_ERROR_SYNTAX => 'грешен ÑинтакÑиÑ', + DB_ERROR_UNSUPPORTED => 'не Ñе поддържа', + DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда', + DB_ERROR_INVALID_DSN => 'невалиден DSN', + DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде оÑъщеÑтвена', + 0 => 'нÑма грешки', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'предоÑтавените данни Ñа недоÑтатъчни', + DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено', + DB_ERROR_NOSUCHDB => 'неÑъщеÑтвуваща база данни', + DB_ERROR_ACCESS_VIOLATION => 'нÑмате доÑтатъчно права' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-ca.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-ca.inc.php new file mode 100644 index 000000000..3640ebd0b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-ca.inc.php @@ -0,0 +1,34 @@ +<?php +// Catalan language +// contributed by "Josep Lladonosa" jlladono#pie.xtec.es +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'ca', + DB_ERROR => 'error desconegut', + DB_ERROR_ALREADY_EXISTS => 'ja existeix', + DB_ERROR_CANNOT_CREATE => 'no es pot crear', + DB_ERROR_CANNOT_DELETE => 'no es pot esborrar', + DB_ERROR_CANNOT_DROP => 'no es pot eliminar', + DB_ERROR_CONSTRAINT => 'violació de constraint', + DB_ERROR_DIVZERO => 'divisió per zero', + DB_ERROR_INVALID => 'no és vàlid', + DB_ERROR_INVALID_DATE => 'la data o l\'hora no són vàlides', + DB_ERROR_INVALID_NUMBER => 'el nombre no és vàlid', + DB_ERROR_MISMATCH => 'no hi ha coincidència', + DB_ERROR_NODBSELECTED => 'cap base de dades seleccionada', + DB_ERROR_NOSUCHFIELD => 'camp inexistent', + DB_ERROR_NOSUCHTABLE => 'taula inexistent', + DB_ERROR_NOT_CAPABLE => 'l\'execució secundària de DB no pot', + DB_ERROR_NOT_FOUND => 'no trobat', + DB_ERROR_NOT_LOCKED => 'no blocat', + DB_ERROR_SYNTAX => 'error de sintaxi', + DB_ERROR_UNSUPPORTED => 'no suportat', + DB_ERROR_VALUE_COUNT_ON_ROW => 'el nombre de columnes no coincideix amb el nombre de valors en la fila', + DB_ERROR_INVALID_DSN => 'el DSN no és vàlid', + DB_ERROR_CONNECT_FAILED => 'connexió fallida', + 0 => 'cap error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'les dades subministrades són insuficients', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensió no trobada', + DB_ERROR_NOSUCHDB => 'base de dades inexistent', + DB_ERROR_ACCESS_VIOLATION => 'permisos insuficients' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-cn.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-cn.inc.php new file mode 100644 index 000000000..eb8c7de55 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-cn.inc.php @@ -0,0 +1,35 @@ +<?php +// Chinese language file contributed by "Cuiyan (cysoft)" cysoft#php.net. +// Encode by GB2312 +// Simplified Chinese +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'cn', + DB_ERROR => 'δ֪´íÎó', + DB_ERROR_ALREADY_EXISTS => 'ÒѾ­´æÔÚ', + DB_ERROR_CANNOT_CREATE => '²»ÄÜ´´½¨', + DB_ERROR_CANNOT_DELETE => '²»ÄÜɾ³ý', + DB_ERROR_CANNOT_DROP => '²»ÄܶªÆú', + DB_ERROR_CONSTRAINT => 'Ô¼ÊøÏÞÖÆ', + DB_ERROR_DIVZERO => '±»0³ý', + DB_ERROR_INVALID => 'ÎÞЧ', + DB_ERROR_INVALID_DATE => 'ÎÞЧµÄÈÕÆÚ»òÕßʱ¼ä', + DB_ERROR_INVALID_NUMBER => 'ÎÞЧµÄÊý×Ö', + DB_ERROR_MISMATCH => '²»Æ¥Åä', + DB_ERROR_NODBSELECTED => 'ûÓÐÊý¾Ý¿â±»Ñ¡Ôñ', + DB_ERROR_NOSUCHFIELD => 'ûÓÐÏàÓ¦µÄ×Ö¶Î', + DB_ERROR_NOSUCHTABLE => 'ûÓÐÏàÓ¦µÄ±í', + DB_ERROR_NOT_CAPABLE => 'Êý¾Ý¿âºǫ́²»¼æÈÝ', + DB_ERROR_NOT_FOUND => 'ûÓз¢ÏÖ', + DB_ERROR_NOT_LOCKED => 'ûÓб»Ëø¶¨', + DB_ERROR_SYNTAX => 'Óï·¨´íÎó', + DB_ERROR_UNSUPPORTED => '²»Ö§³Ö', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ÔÚÐÐÉÏÀÛ¼ÆÖµ', + DB_ERROR_INVALID_DSN => 'ÎÞЧµÄÊý¾ÝÔ´ (DSN)', + DB_ERROR_CONNECT_FAILED => 'Á¬½Óʧ°Ü', + 0 => 'ûÓдíÎó', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ÌṩµÄÊý¾Ý²»ÄÜ·ûºÏÒªÇó', + DB_ERROR_EXTENSION_NOT_FOUND=> 'À©Õ¹Ã»Óб»·¢ÏÖ', + DB_ERROR_NOSUCHDB => 'ûÓÐÏàÓ¦µÄÊý¾Ý¿â', + DB_ERROR_ACCESS_VIOLATION => 'ûÓкÏÊʵÄȨÏÞ' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-cz.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-cz.inc.php new file mode 100644 index 000000000..2424c2446 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-cz.inc.php @@ -0,0 +1,40 @@ +<?php + +# Czech language, encoding by ISO 8859-2 charset (Iso Latin-2) +# For convert to MS Windows use shell command: +# iconv -f ISO_8859-2 -t CP1250 < adodb-cz.inc.php +# For convert to ASCII use shell command: +# unaccent ISO_8859-2 < adodb-cz.inc.php +# v1.0, 19.06.2003 Kamil Jakubovic <jake@host.sk> + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'cz', + DB_ERROR => 'neznámá chyba', + DB_ERROR_ALREADY_EXISTS => 'ji? existuje', + DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it', + DB_ERROR_CANNOT_DELETE => 'nelze smazat', + DB_ERROR_CANNOT_DROP => 'nelze odstranit', + DB_ERROR_CONSTRAINT => 'poru?ení omezující podmínky', + DB_ERROR_DIVZERO => 'd?lení nulou', + DB_ERROR_INVALID => 'neplatné', + DB_ERROR_INVALID_DATE => 'neplatné datum nebo ?as', + DB_ERROR_INVALID_NUMBER => 'neplatné ?íslo', + DB_ERROR_MISMATCH => 'nesouhlasí', + DB_ERROR_NODBSELECTED => '?ádná databáze není vybrána', + DB_ERROR_NOSUCHFIELD => 'pole nenalezeno', + DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena', + DB_ERROR_NOT_CAPABLE => 'nepodporováno', + DB_ERROR_NOT_FOUND => 'nenalezeno', + DB_ERROR_NOT_LOCKED => 'nezam?eno', + DB_ERROR_SYNTAX => 'syntaktická chyba', + DB_ERROR_UNSUPPORTED => 'nepodporováno', + DB_ERROR_VALUE_COUNT_ON_ROW => '', + DB_ERROR_INVALID_DSN => 'neplatné DSN', + DB_ERROR_CONNECT_FAILED => 'p?ipojení selhalo', + 0 => 'bez chyb', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'málo zdrojových dat', + DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?í?ení nenalezeno', + DB_ERROR_NOSUCHDB => 'databáze neexistuje', + DB_ERROR_ACCESS_VIOLATION => 'nedostate?ná práva' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-da.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-da.inc.php new file mode 100644 index 000000000..ca0e72d61 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-da.inc.php @@ -0,0 +1,33 @@ +<?php +// Arne Eckmann bananstat#users.sourceforge.net +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'da', + DB_ERROR => 'ukendt fejl', + DB_ERROR_ALREADY_EXISTS => 'eksisterer allerede', + DB_ERROR_CANNOT_CREATE => 'kan ikke oprette', + DB_ERROR_CANNOT_DELETE => 'kan ikke slette', + DB_ERROR_CANNOT_DROP => 'kan ikke droppe', + DB_ERROR_CONSTRAINT => 'begr&aelig;nsning kr&aelig;nket', + DB_ERROR_DIVZERO => 'division med nul', + DB_ERROR_INVALID => 'ugyldig', + DB_ERROR_INVALID_DATE => 'ugyldig dato eller klokkeslet', + DB_ERROR_INVALID_NUMBER => 'ugyldigt tal', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'ingen database valgt', + DB_ERROR_NOSUCHFIELD => 'felt findes ikke', + DB_ERROR_NOSUCHTABLE => 'tabel findes ikke', + DB_ERROR_NOT_CAPABLE => 'DB backend opgav', + DB_ERROR_NOT_FOUND => 'ikke fundet', + DB_ERROR_NOT_LOCKED => 'ikke l&aring;st', + DB_ERROR_SYNTAX => 'syntaksfejl', + DB_ERROR_UNSUPPORTED => 'ikke underst&oslash;ttet', + DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til foresp&oslash;rgslens antal felter', + DB_ERROR_INVALID_DSN => 'ugyldig DSN', + DB_ERROR_CONNECT_FAILED => 'tilslutning mislykkedes', + 0 => 'ingen fejl', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'utilstr&aelig;kkelige data angivet', + DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet', + DB_ERROR_NOSUCHDB => 'database ikke fundet', + DB_ERROR_ACCESS_VIOLATION => 'utilstr&aelig;kkelige rettigheder' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-de.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-de.inc.php new file mode 100644 index 000000000..244cb2f66 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-de.inc.php @@ -0,0 +1,33 @@ +<?php +// contributed by "Heinz Hombergs" <opn@hhombergs.de> +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'de', + DB_ERROR => 'Unbekannter Fehler', + DB_ERROR_ALREADY_EXISTS => 'existiert bereits', + DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen', + DB_ERROR_CANNOT_DELETE => 'kann nicht l&ouml;schen', + DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gel&ouml;scht werden', + DB_ERROR_CONSTRAINT => 'Constraint Verletzung', + DB_ERROR_DIVZERO => 'Division durch Null', + DB_ERROR_INVALID => 'ung&uml;ltig', + DB_ERROR_INVALID_DATE => 'ung&uml;ltiges Datum oder Zeit', + DB_ERROR_INVALID_NUMBER => 'ung&uml;ltige Zahl', + DB_ERROR_MISMATCH => 'Unvertr&auml;glichkeit', + DB_ERROR_NODBSELECTED => 'keine Dantebank ausgew&auml;hlt', + DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden', + DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden', + DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert', + DB_ERROR_NOT_FOUND => 'nicht gefunden', + DB_ERROR_NOT_LOCKED => 'nicht gesperrt', + DB_ERROR_SYNTAX => 'Syntaxfehler', + DB_ERROR_UNSUPPORTED => 'nicht Unterst&uml;tzt', + DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur&uml;ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage', + DB_ERROR_INVALID_DSN => 'ung&uml;ltiger DSN', + DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden', + 0 => 'kein Fehler', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'Nicht gen&uml;gend Daten geliefert', + DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden', + DB_ERROR_NOSUCHDB => 'keine Datenbank', + DB_ERROR_ACCESS_VIOLATION => 'ungen&uml;gende Rechte' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-en.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-en.inc.php new file mode 100644 index 000000000..6895995ef --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-en.inc.php @@ -0,0 +1,33 @@ +<?php + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'en', + DB_ERROR => 'unknown error', + DB_ERROR_ALREADY_EXISTS => 'already exists', + DB_ERROR_CANNOT_CREATE => 'can not create', + DB_ERROR_CANNOT_DELETE => 'can not delete', + DB_ERROR_CANNOT_DROP => 'can not drop', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_DIVZERO => 'division by zero', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'invalid date or time', + DB_ERROR_INVALID_NUMBER => 'invalid number', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'no database selected', + DB_ERROR_NOSUCHFIELD => 'no such field', + DB_ERROR_NOSUCHTABLE => 'no such table', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'not found', + DB_ERROR_NOT_LOCKED => 'not locked', + DB_ERROR_SYNTAX => 'syntax error', + DB_ERROR_UNSUPPORTED => 'not supported', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_CONNECT_FAILED => 'connect failed', + 0 => 'no error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', + DB_ERROR_NOSUCHDB => 'no such database', + DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-es.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-es.inc.php new file mode 100644 index 000000000..1e0afbb40 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-es.inc.php @@ -0,0 +1,33 @@ +<?php +// contributed by "Horacio Degiorgi" <horaciod@codigophp.com> +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'es', + DB_ERROR => 'error desconocido', + DB_ERROR_ALREADY_EXISTS => 'ya existe', + DB_ERROR_CANNOT_CREATE => 'imposible crear', + DB_ERROR_CANNOT_DELETE => 'imposible borrar', + DB_ERROR_CANNOT_DROP => 'imposible hacer drop', + DB_ERROR_CONSTRAINT => 'violacion de constraint', + DB_ERROR_DIVZERO => 'division por cero', + DB_ERROR_INVALID => 'invalido', + DB_ERROR_INVALID_DATE => 'fecha u hora invalida', + DB_ERROR_INVALID_NUMBER => 'numero invalido', + DB_ERROR_MISMATCH => 'error', + DB_ERROR_NODBSELECTED => 'no hay base de datos seleccionada', + DB_ERROR_NOSUCHFIELD => 'campo invalido', + DB_ERROR_NOSUCHTABLE => 'tabla no existe', + DB_ERROR_NOT_CAPABLE => 'capacidad invalida para esta DB', + DB_ERROR_NOT_FOUND => 'no encontrado', + DB_ERROR_NOT_LOCKED => 'no bloqueado', + DB_ERROR_SYNTAX => 'error de sintaxis', + DB_ERROR_UNSUPPORTED => 'no soportado', + DB_ERROR_VALUE_COUNT_ON_ROW => 'la cantidad de columnas no corresponden a la cantidad de valores', + DB_ERROR_INVALID_DSN => 'DSN invalido', + DB_ERROR_CONNECT_FAILED => 'fallo la conexion', + 0 => 'sin error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'insuficientes datos', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension no encontrada', + DB_ERROR_NOSUCHDB => 'base de datos no encontrada', + DB_ERROR_ACCESS_VIOLATION => 'permisos insuficientes' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-esperanto.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-esperanto.inc.php new file mode 100644 index 000000000..16ca00e2f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-esperanto.inc.php @@ -0,0 +1,35 @@ +<?php +// Vivu Esperanto cxiam! +// Traduko fare de Antono Vasiljev (anders[#]brainactive.org) + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'eo', + DB_ERROR => 'nekonata eraro', + DB_ERROR_ALREADY_EXISTS => 'jam ekzistas', + DB_ERROR_CANNOT_CREATE => 'maleblas krei', + DB_ERROR_CANNOT_DELETE => 'maleblas elimini', + DB_ERROR_CANNOT_DROP => 'maleblas elimini (drop)', + DB_ERROR_CONSTRAINT => 'rompo de kondicxoj de provo', + DB_ERROR_DIVZERO => 'divido per 0 (nul)', + DB_ERROR_INVALID => 'malregule', + DB_ERROR_INVALID_DATE => 'malregula dato kaj tempo', + DB_ERROR_INVALID_NUMBER => 'malregula nombro', + DB_ERROR_MISMATCH => 'eraro', + DB_ERROR_NODBSELECTED => 'datumbazo ne elektita', + DB_ERROR_NOSUCHFIELD => 'ne ekzistas kampo', + DB_ERROR_NOSUCHTABLE => 'ne ekzistas tabelo', + DB_ERROR_NOT_CAPABLE => 'DBMS ne povas', + DB_ERROR_NOT_FOUND => 'ne trovita', + DB_ERROR_NOT_LOCKED => 'ne blokita', + DB_ERROR_SYNTAX => 'sintaksa eraro', + DB_ERROR_UNSUPPORTED => 'ne apogata', + DB_ERROR_VALUE_COUNT_ON_ROW => 'nombrilo de valoroj en linio', + DB_ERROR_INVALID_DSN => 'malregula DSN-o', + DB_ERROR_CONNECT_FAILED => 'konekto malsukcesa', + 0 => 'cxio bone', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ne suficxe da datumo', + DB_ERROR_EXTENSION_NOT_FOUND=> 'etendo ne trovita', + DB_ERROR_NOSUCHDB => 'datumbazo ne ekzistas', + DB_ERROR_ACCESS_VIOLATION => 'ne suficxe da rajto por atingo' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-fa.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-fa.inc.php new file mode 100644 index 000000000..559431357 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-fa.inc.php @@ -0,0 +1,35 @@ +<?php + +/* Farsi - by "Peyman Hooshmandi Raad" <phooshmand#gmail.com> */ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'fa', + DB_ERROR => 'خطای ناشناخته', + DB_ERROR_ALREADY_EXISTS => 'وجود دارد', + DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد', + DB_ERROR_CANNOT_DELETE => 'امکان حذ٠وجود ندارد', + DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد', + DB_ERROR_CONSTRAINT => 'نقض شرط', + DB_ERROR_DIVZERO => 'تقسیم بر ØµÙØ±', + DB_ERROR_INVALID => 'نامعتبر', + DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر', + DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر', + DB_ERROR_MISMATCH => 'عدم مطابقت', + DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است', + DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد', + DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد', + DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست', + DB_ERROR_NOT_FOUND => 'پیدا نشد', + DB_ERROR_NOT_LOCKED => 'Ù‚ÙÙ„ نشده', + DB_ERROR_SYNTAX => 'خطای دستوری', + DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود', + DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیÙ', + DB_ERROR_INVALID_DSN => 'DSN نامعتبر', + DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد', + 0 => 'بدون خطا', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'داده ناکاÙÛŒ است', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد', + DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد', + DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکاÙÛŒ' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-fr.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-fr.inc.php new file mode 100644 index 000000000..066a2a5e5 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-fr.inc.php @@ -0,0 +1,33 @@ +<?php + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'fr', + DB_ERROR => 'erreur inconnue', + DB_ERROR_ALREADY_EXISTS => 'existe d&eacute;j&agrave;', + DB_ERROR_CANNOT_CREATE => 'cr&eacute;tion impossible', + DB_ERROR_CANNOT_DELETE => 'effacement impossible', + DB_ERROR_CANNOT_DROP => 'suppression impossible', + DB_ERROR_CONSTRAINT => 'violation de contrainte', + DB_ERROR_DIVZERO => 'division par z&eacute;ro', + DB_ERROR_INVALID => 'invalide', + DB_ERROR_INVALID_DATE => 'date ou heure invalide', + DB_ERROR_INVALID_NUMBER => 'nombre invalide', + DB_ERROR_MISMATCH => 'erreur de concordance', + DB_ERROR_NODBSELECTED => 'pas de base de donn&eacute;ess&eacute;lectionn&eacute;e', + DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide', + DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante', + DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non install&eacute;e', + DB_ERROR_NOT_FOUND => 'pas trouv&eacute;', + DB_ERROR_NOT_LOCKED => 'non verrouill&eacute;', + DB_ERROR_SYNTAX => 'erreur de syntaxe', + DB_ERROR_UNSUPPORTED => 'non support&eacute;', + DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur ins&eacute;r&eacute;e trop grande pour colonne', + DB_ERROR_INVALID_DSN => 'DSN invalide', + DB_ERROR_CONNECT_FAILED => '&eacute;chec &agrave; la connexion', + 0 => "pas d'erreur", // DB_OK + DB_ERROR_NEED_MORE_DATA => 'donn&eacute;es fournies insuffisantes', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouv&eacute;e', + DB_ERROR_NOSUCHDB => 'base de donn&eacute;es inconnue', + DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-hu.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-hu.inc.php new file mode 100644 index 000000000..d6f0ef82d --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-hu.inc.php @@ -0,0 +1,34 @@ +<?php +# Hungarian language, encoding by ISO 8859-2 charset (Iso Latin-2) +# Halászvári Gábor <g.halaszvari#portmax.hu> +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'hu', + DB_ERROR => 'ismeretlen hiba', + DB_ERROR_ALREADY_EXISTS => 'már létezik', + DB_ERROR_CANNOT_CREATE => 'nem sikerült létrehozni', + DB_ERROR_CANNOT_DELETE => 'nem sikerült törölni', + DB_ERROR_CANNOT_DROP => 'nem sikerült eldobni', + DB_ERROR_CONSTRAINT => 'szabályok megszegése', + DB_ERROR_DIVZERO => 'osztás nullával', + DB_ERROR_INVALID => 'érvénytelen', + DB_ERROR_INVALID_DATE => 'érvénytelen dátum vagy idõ', + DB_ERROR_INVALID_NUMBER => 'érvénytelen szám', + DB_ERROR_MISMATCH => 'nem megfelelõ', + DB_ERROR_NODBSELECTED => 'nincs kiválasztott adatbázis', + DB_ERROR_NOSUCHFIELD => 'nincs ilyen mezõ', + DB_ERROR_NOSUCHTABLE => 'nincs ilyen tábla', + DB_ERROR_NOT_CAPABLE => 'DB backend nem támogatja', + DB_ERROR_NOT_FOUND => 'nem található', + DB_ERROR_NOT_LOCKED => 'nincs lezárva', + DB_ERROR_SYNTAX => 'szintaktikai hiba', + DB_ERROR_UNSUPPORTED => 'nem támogatott', + DB_ERROR_VALUE_COUNT_ON_ROW => 'soron végzett érték számlálás', + DB_ERROR_INVALID_DSN => 'hibás DSN', + DB_ERROR_CONNECT_FAILED => 'sikertelen csatlakozás', + 0 => 'nincs hiba', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'túl kevés az adat', + DB_ERROR_EXTENSION_NOT_FOUND=> 'bõvítmény nem található', + DB_ERROR_NOSUCHDB => 'nincs ilyen adatbázis', + DB_ERROR_ACCESS_VIOLATION => 'nincs jogosultság' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-it.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-it.inc.php new file mode 100644 index 000000000..20c5b93b6 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-it.inc.php @@ -0,0 +1,34 @@ +<?php +// Italian language file contributed by Tiraboschi Massimiliano aka TiMax +// www.maxdev.com timax@maxdev.com +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'it', + DB_ERROR => 'errore sconosciuto', + DB_ERROR_ALREADY_EXISTS => 'esiste gi&agrave;', + DB_ERROR_CANNOT_CREATE => 'non posso creare', + DB_ERROR_CANNOT_DELETE => 'non posso cancellare', + DB_ERROR_CANNOT_DROP => 'non posso eliminare', + DB_ERROR_CONSTRAINT => 'violazione constraint', + DB_ERROR_DIVZERO => 'divisione per zero', + DB_ERROR_INVALID => 'non valido', + DB_ERROR_INVALID_DATE => 'data od ora non valida', + DB_ERROR_INVALID_NUMBER => 'numero non valido', + DB_ERROR_MISMATCH => 'diversi', + DB_ERROR_NODBSELECTED => 'nessun database selezionato', + DB_ERROR_NOSUCHFIELD => 'nessun campo trovato', + DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata', + DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato', + DB_ERROR_NOT_FOUND => 'non trovato', + DB_ERROR_NOT_LOCKED => 'non bloccato', + DB_ERROR_SYNTAX => 'errore di sintassi', + DB_ERROR_UNSUPPORTED => 'non supportato', + DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna', + DB_ERROR_INVALID_DSN => 'DSN non valido', + DB_ERROR_CONNECT_FAILED => 'connessione fallita', + 0 => 'nessun errore', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti', + DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata', + DB_ERROR_NOSUCHDB => 'database non trovato', + DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-nl.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-nl.inc.php new file mode 100644 index 000000000..abe77b528 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-nl.inc.php @@ -0,0 +1,33 @@ +<?php +// Translated by Pim Koeman (pim#wittenborg-university.com) +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'nl', + DB_ERROR => 'onbekende fout', + DB_ERROR_ALREADY_EXISTS => 'bestaat al', + DB_ERROR_CANNOT_CREATE => 'kan niet aanmaken', + DB_ERROR_CANNOT_DELETE => 'kan niet wissen', + DB_ERROR_CANNOT_DROP => 'kan niet verwijderen', + DB_ERROR_CONSTRAINT => 'constraint overtreding', + DB_ERROR_DIVZERO => 'poging tot delen door nul', + DB_ERROR_INVALID => 'ongeldig', + DB_ERROR_INVALID_DATE => 'ongeldige datum of tijd', + DB_ERROR_INVALID_NUMBER => 'ongeldig nummer', + DB_ERROR_MISMATCH => 'is incorrect', + DB_ERROR_NODBSELECTED => 'geen database geselecteerd', + DB_ERROR_NOSUCHFIELD => 'onbekend veld', + DB_ERROR_NOSUCHTABLE => 'onbekende tabel', + DB_ERROR_NOT_CAPABLE => 'database systeem is niet tot uitvoer in staat', + DB_ERROR_NOT_FOUND => 'niet gevonden', + DB_ERROR_NOT_LOCKED => 'niet vergrendeld', + DB_ERROR_SYNTAX => 'syntaxis fout', + DB_ERROR_UNSUPPORTED => 'niet ondersteund', + DB_ERROR_VALUE_COUNT_ON_ROW => 'waarde telling op rij', + DB_ERROR_INVALID_DSN => 'ongeldige DSN', + DB_ERROR_CONNECT_FAILED => 'connectie mislukt', + 0 => 'geen fout', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'onvoldoende data gegeven', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie niet gevonden', + DB_ERROR_NOSUCHDB => 'onbekende database', + DB_ERROR_ACCESS_VIOLATION => 'onvoldoende rechten' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-pl.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-pl.inc.php new file mode 100644 index 000000000..9d9e39067 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-pl.inc.php @@ -0,0 +1,35 @@ +<?php + +// Contributed by Grzegorz Pacan <gp#dione.cc> + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'pl', + DB_ERROR => 'niezidentyfikowany b³±d', + DB_ERROR_ALREADY_EXISTS => 'ju¿ istniej±', + DB_ERROR_CANNOT_CREATE => 'nie mo¿na stworzyæ', + DB_ERROR_CANNOT_DELETE => 'nie mo¿na usun±æ', + DB_ERROR_CANNOT_DROP => 'nie mo¿na porzuciæ', + DB_ERROR_CONSTRAINT => 'pogwa³cenie uprawnieñ', + DB_ERROR_DIVZERO => 'dzielenie przez zero', + DB_ERROR_INVALID => 'b³êdny', + DB_ERROR_INVALID_DATE => 'b³êdna godzina lub data', + DB_ERROR_INVALID_NUMBER => 'b³êdny numer', + DB_ERROR_MISMATCH => 'niedopasowanie', + DB_ERROR_NODBSELECTED => 'baza danych nie zosta³a wybrana', + DB_ERROR_NOSUCHFIELD => 'nie znaleziono pola', + DB_ERROR_NOSUCHTABLE => 'nie znaleziono tabeli', + DB_ERROR_NOT_CAPABLE => 'nie zdolny', + DB_ERROR_NOT_FOUND => 'nie znaleziono', + DB_ERROR_NOT_LOCKED => 'nie zakmniêty', + DB_ERROR_SYNTAX => 'b³±d sk³adni', + DB_ERROR_UNSUPPORTED => 'nie obs³uguje', + DB_ERROR_VALUE_COUNT_ON_ROW => 'warto¶æ liczona w szeregu', + DB_ERROR_INVALID_DSN => 'b³êdny DSN', + DB_ERROR_CONNECT_FAILED => 'po³±czenie nie zosta³o zrealizowane', + 0 => 'brak b³êdów', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'niedostateczna ilo¶æ informacji', + DB_ERROR_EXTENSION_NOT_FOUND=> 'nie znaleziono rozszerzenia', + DB_ERROR_NOSUCHDB => 'nie znaleziono bazy', + DB_ERROR_ACCESS_VIOLATION => 'niedostateczne uprawnienia' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-pt-br.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-pt-br.inc.php new file mode 100644 index 000000000..cd28f7e55 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-pt-br.inc.php @@ -0,0 +1,35 @@ +<?php +// contributed by "Levi Fukumori" levi _AT_ fukumori _DOT_ com _DOT_ br +// portugese (brazilian) +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'pt-br', + DB_ERROR => 'erro desconhecido', + DB_ERROR_ALREADY_EXISTS => 'já existe', + DB_ERROR_CANNOT_CREATE => 'impossível criar', + DB_ERROR_CANNOT_DELETE => 'impossível excluír', + DB_ERROR_CANNOT_DROP => 'impossível remover', + DB_ERROR_CONSTRAINT => 'violação do confinamente', + DB_ERROR_DIVZERO => 'divisão por zero', + DB_ERROR_INVALID => 'inválido', + DB_ERROR_INVALID_DATE => 'data ou hora inválida', + DB_ERROR_INVALID_NUMBER => 'número inválido', + DB_ERROR_MISMATCH => 'erro', + DB_ERROR_NODBSELECTED => 'nenhum banco de dados selecionado', + DB_ERROR_NOSUCHFIELD => 'campo inválido', + DB_ERROR_NOSUCHTABLE => 'tabela inexistente', + DB_ERROR_NOT_CAPABLE => 'capacidade inválida para este BD', + DB_ERROR_NOT_FOUND => 'não encontrado', + DB_ERROR_NOT_LOCKED => 'não bloqueado', + DB_ERROR_SYNTAX => 'erro de sintaxe', + DB_ERROR_UNSUPPORTED => +'não suportado', + DB_ERROR_VALUE_COUNT_ON_ROW => 'a quantidade de colunas não corresponde ao de valores', + DB_ERROR_INVALID_DSN => 'DSN inválido', + DB_ERROR_CONNECT_FAILED => 'falha na conexão', + 0 => 'sem erro', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'dados insuficientes', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensão não encontrada', + DB_ERROR_NOSUCHDB => 'banco de dados não encontrado', + DB_ERROR_ACCESS_VIOLATION => 'permissão insuficiente' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-ro.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-ro.inc.php new file mode 100644 index 000000000..bcd7d1322 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-ro.inc.php @@ -0,0 +1,35 @@ +<?php + +/* Romanian - by "bogdan stefan" <sbogdan#rsb.ro> */ + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'ro', + DB_ERROR => 'eroare necunoscuta', + DB_ERROR_ALREADY_EXISTS => 'deja exista', + DB_ERROR_CANNOT_CREATE => 'nu se poate creea', + DB_ERROR_CANNOT_DELETE => 'nu se poate sterge', + DB_ERROR_CANNOT_DROP => 'nu se poate executa drop', + DB_ERROR_CONSTRAINT => 'violare de constrain', + DB_ERROR_DIVZERO => 'se divide la zero', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'data sau timp invalide', + DB_ERROR_INVALID_NUMBER => 'numar invalid', + DB_ERROR_MISMATCH => 'nepotrivire-mismatch', + DB_ERROR_NODBSELECTED => 'nu exista baza de date selectata', + DB_ERROR_NOSUCHFIELD => 'camp inexistent', + DB_ERROR_NOSUCHTABLE => 'tabela inexistenta', + DB_ERROR_NOT_CAPABLE => 'functie optionala neinstalata', + DB_ERROR_NOT_FOUND => 'negasit', + DB_ERROR_NOT_LOCKED => 'neblocat', + DB_ERROR_SYNTAX => 'eroare de sintaxa', + DB_ERROR_UNSUPPORTED => 'nu e suportat', + DB_ERROR_VALUE_COUNT_ON_ROW => 'valoare prea mare pentru coloana', + DB_ERROR_INVALID_DSN => 'DSN invalid', + DB_ERROR_CONNECT_FAILED => 'conectare esuata', + 0 => 'fara eroare', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'data introduse insuficiente', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie negasita', + DB_ERROR_NOSUCHDB => 'nu exista baza de date', + DB_ERROR_ACCESS_VIOLATION => 'permisiuni insuficiente' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-ru1251.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-ru1251.inc.php new file mode 100644 index 000000000..3a20538a0 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-ru1251.inc.php @@ -0,0 +1,35 @@ +<?php + +// Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru. + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'ru1251', + DB_ERROR => 'íåèçâåñòíàÿ îøèáêà', + DB_ERROR_ALREADY_EXISTS => 'óæå ñóùåñòâóåò', + DB_ERROR_CANNOT_CREATE => 'íåâîçìîæíî ñîçäàòü', + DB_ERROR_CANNOT_DELETE => 'íåâîçìîæíî óäàëèòü', + DB_ERROR_CANNOT_DROP => 'íåâîçìîæíî óäàëèòü (drop)', + DB_ERROR_CONSTRAINT => 'íàðóøåíèå óñëîâèé ïðîâåðêè', + DB_ERROR_DIVZERO => 'äåëåíèå íà 0', + DB_ERROR_INVALID => 'íåïðàâèëüíî', + DB_ERROR_INVALID_DATE => 'íåêîððåêòíàÿ äàòà èëè âðåìÿ', + DB_ERROR_INVALID_NUMBER => 'íåêîððåêòíîå ÷èñëî', + DB_ERROR_MISMATCH => 'îøèáêà', + DB_ERROR_NODBSELECTED => 'ÁÄ íå âûáðàíà', + DB_ERROR_NOSUCHFIELD => 'íå ñóùåñòâóåò ïîëå', + DB_ERROR_NOSUCHTABLE => 'íå ñóùåñòâóåò òàáëèöà', + DB_ERROR_NOT_CAPABLE => 'ÑÓÁÄ íå â ñîñòîÿíèè', + DB_ERROR_NOT_FOUND => 'íå íàéäåíî', + DB_ERROR_NOT_LOCKED => 'íå çàáëîêèðîâàíî', + DB_ERROR_SYNTAX => 'ñèíòàêñè÷åñêàÿ îøèáêà', + DB_ERROR_UNSUPPORTED => 'íå ïîääåðæèâàåòñÿ', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ñ÷åò÷èê çíà÷åíèé â ñòðîêå', + DB_ERROR_INVALID_DSN => 'íåïðàâèëüíàÿ DSN', + DB_ERROR_CONNECT_FAILED => 'ñîåäèíåíèå íåóñïåøíî', + 0 => 'íåò îøèáêè', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ïðåäîñòàâëåíî íåäîñòàòî÷íî äàííûõ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ðàñøèðåíèå íå íàéäåíî', + DB_ERROR_NOSUCHDB => 'íå ñóùåñòâóåò ÁÄ', + DB_ERROR_ACCESS_VIOLATION => 'íåäîñòàòî÷íî ïðàâ äîñòóïà' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-sv.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-sv.inc.php new file mode 100644 index 000000000..a9fd69816 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-sv.inc.php @@ -0,0 +1,33 @@ +<?php +// Christian Tiberg" christian@commsoft.nu +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'en', + DB_ERROR => 'Okänt fel', + DB_ERROR_ALREADY_EXISTS => 'finns redan', + DB_ERROR_CANNOT_CREATE => 'kan inte skapa', + DB_ERROR_CANNOT_DELETE => 'kan inte ta bort', + DB_ERROR_CANNOT_DROP => 'kan inte släppa', + DB_ERROR_CONSTRAINT => 'begränsning kränkt', + DB_ERROR_DIVZERO => 'division med noll', + DB_ERROR_INVALID => 'ogiltig', + DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid', + DB_ERROR_INVALID_NUMBER => 'ogiltigt tal', + DB_ERROR_MISMATCH => 'felaktig matchning', + DB_ERROR_NODBSELECTED => 'ingen databas vald', + DB_ERROR_NOSUCHFIELD => 'inget sådant fält', + DB_ERROR_NOSUCHTABLE => 'ingen sådan tabell', + DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte', + DB_ERROR_NOT_FOUND => 'finns inte', + DB_ERROR_NOT_LOCKED => 'inte låst', + DB_ERROR_SYNTAX => 'syntaxfel', + DB_ERROR_UNSUPPORTED => 'stöds ej', + DB_ERROR_VALUE_COUNT_ON_ROW => 'värde räknat på rad', + DB_ERROR_INVALID_DSN => 'ogiltig DSN', + DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades', + 0 => 'inget fel', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'otillräckligt med data angivet', + DB_ERROR_EXTENSION_NOT_FOUND=> 'utökning hittades ej', + DB_ERROR_NOSUCHDB => 'ingen sådan databas', + DB_ERROR_ACCESS_VIOLATION => 'otillräckliga rättigheter' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb-uk1251.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb-uk1251.inc.php new file mode 100644 index 000000000..675016d12 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb-uk1251.inc.php @@ -0,0 +1,35 @@ +<?php + +// Ukrainian language file contributed by Alex Rootoff rootoff{AT}pisem.net. + +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'uk1251', + DB_ERROR => 'íåâ³äîìà ïîìèëêà', + DB_ERROR_ALREADY_EXISTS => 'âæå ³ñíóº', + DB_ERROR_CANNOT_CREATE => 'íåìîæëèâî ñòâîðèòè', + DB_ERROR_CANNOT_DELETE => 'íåìîæëèâî âèäàëèòè', + DB_ERROR_CANNOT_DROP => 'íåìîæëèâî çíèùèòè (drop)', + DB_ERROR_CONSTRAINT => 'ïîðóøåííÿ óìîâ ïåðåâ³ðêè', + DB_ERROR_DIVZERO => 'ä³ëåííÿ íà 0', + DB_ERROR_INVALID => 'íåïðàâèëüíî', + DB_ERROR_INVALID_DATE => 'íåïðàâèëüíà äàòà ÷è ÷àñ', + DB_ERROR_INVALID_NUMBER => 'íåïðàâèëüíå ÷èñëî', + DB_ERROR_MISMATCH => 'ïîìèëêà', + DB_ERROR_NODBSELECTED => 'íå âèáðàíî ÁÄ', + DB_ERROR_NOSUCHFIELD => 'íå ³ñíóº ïîëå', + DB_ERROR_NOSUCHTABLE => 'íå ³ñíóº òàáëèöÿ', + DB_ERROR_NOT_CAPABLE => 'ÑÓÁÄ íå â ñòàí³', + DB_ERROR_NOT_FOUND => 'íå çíàéäåíî', + DB_ERROR_NOT_LOCKED => 'íå çàáëîêîâàíî', + DB_ERROR_SYNTAX => 'ñèíòàêñè÷íà ïîìèëêà', + DB_ERROR_UNSUPPORTED => 'íå ï³äòðèìóºòüñÿ', + DB_ERROR_VALUE_COUNT_ON_ROW => 'ðàõ³âíèê çíà÷åíü â ñòð³÷ö³', + DB_ERROR_INVALID_DSN => 'íåïðàâèëüíà DSN', + DB_ERROR_CONNECT_FAILED => 'ç\'ºäíàííÿ íåóñï³øíå', + 0 => 'âñå ãàðàçä', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'íàäàíî íåäîñòàòíüî äàíèõ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ðîçøèðåííÿ íå çíàéäåíî', + DB_ERROR_NOSUCHDB => 'íå ³ñíóº ÁÄ', + DB_ERROR_ACCESS_VIOLATION => 'íåäîñòàòíüî ïðàâ äîñòóïà' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/lang/adodb_th.inc.php b/pos/is4c-nf/lib/adodb5/lang/adodb_th.inc.php new file mode 100644 index 000000000..3fdd99705 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/lang/adodb_th.inc.php @@ -0,0 +1,33 @@ +<?php +// by Trirat Petchsingh <rosskouk#gmail.com> +$ADODB_LANG_ARRAY = array ( + 'LANG' => 'th', + DB_ERROR => 'error ไม่รู้สาเหตุ', + DB_ERROR_ALREADY_EXISTS => 'มีà¹?ล้ว', + DB_ERROR_CANNOT_CREATE => 'สร้างไม่ได้', + DB_ERROR_CANNOT_DELETE => 'ลบไม่ได้', + DB_ERROR_CANNOT_DROP => 'drop ไม่ได้', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_DIVZERO => 'หาà¸?ด้วยสูà¸?', + DB_ERROR_INVALID => 'ไม่ valid', + DB_ERROR_INVALID_DATE => 'วันที่ เวลา ไม่ valid', + DB_ERROR_INVALID_NUMBER => 'เลขไม่ valid', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'ไม่ได้เลือà¸?à¸?านข้อมูล', + DB_ERROR_NOSUCHFIELD => 'ไม่มีฟีลด์นี้', + DB_ERROR_NOSUCHTABLE => 'ไม่มีตารางนี้', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'ไม่พบ', + DB_ERROR_NOT_LOCKED => 'ไม่ได้ล๊อà¸?', + DB_ERROR_SYNTAX => 'ผิด syntax', + DB_ERROR_UNSUPPORTED => 'ไม่ support', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_CONNECT_FAILED => 'ไม่สามารถ connect', + 0 => 'no error', // DB_OK + DB_ERROR_NEED_MORE_DATA => 'ข้อมูลไม่เพียงพอ', + DB_ERROR_EXTENSION_NOT_FOUND=> 'ไม่พบ extension', + DB_ERROR_NOSUCHDB => 'ไม่มีข้อมูลนี้', + DB_ERROR_ACCESS_VIOLATION => 'permissions ไม่พอ' +); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/license.txt b/pos/is4c-nf/lib/adodb5/license.txt new file mode 100644 index 000000000..2353871c0 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/license.txt @@ -0,0 +1,182 @@ +ADOdb is dual licensed using BSD and LGPL. + +In plain English, you do not need to distribute your application in source code form, nor do you need to distribute ADOdb source code, provided you follow the rest of terms of the BSD license. + +For more info about ADOdb, visit http://adodb.sourceforge.net/ + +BSD Style-License +================= + +Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list +of conditions and the following disclaimer in the documentation and/or other materials +provided with the distribution. + +Neither the name of the John Lim nor the names of its contributors may be used to +endorse or promote products derived from this software without specific prior written +permission. + +DISCLAIMER: +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +JOHN LIM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +========================================================== +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[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. + + +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 \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/pear/Auth/Container/ADOdb.php b/pos/is4c-nf/lib/adodb5/pear/Auth/Container/ADOdb.php new file mode 100644 index 000000000..c7b961e44 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/pear/Auth/Container/ADOdb.php @@ -0,0 +1,413 @@ +<?php +// +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Authors: Martin Jansen <mj@php.net> +// | Richard Tango-Lowy <richtl@arscognita.com> | +// +----------------------------------------------------------------------+ +// +// $Id: ADOdb.php,v 1.3 2005/05/18 06:58:47 jlim Exp $ +// + +require_once 'Auth/Container.php'; +require_once 'adodb.inc.php'; +require_once 'adodb-pear.inc.php'; +require_once 'adodb-errorpear.inc.php'; + +/** + * Storage driver for fetching login data from a database using ADOdb-PHP. + * + * This storage driver can use all databases which are supported + * by the ADBdb DB abstraction layer to fetch login data. + * See http://php.weblogs.com/adodb for information on ADOdb. + * NOTE: The ADOdb directory MUST be in your PHP include_path! + * + * @author Richard Tango-Lowy <richtl@arscognita.com> + * @package Auth + * @version $Revision: 1.3 $ + */ +class Auth_Container_ADOdb extends Auth_Container +{ + + /** + * Additional options for the storage container + * @var array + */ + var $options = array(); + + /** + * DB object + * @var object + */ + var $db = null; + var $dsn = ''; + + /** + * User that is currently selected from the DB. + * @var string + */ + var $activeUser = ''; + + // {{{ Constructor + + /** + * Constructor of the container class + * + * Initate connection to the database via PEAR::ADOdb + * + * @param string Connection data or DB object + * @return object Returns an error object if something went wrong + */ + function Auth_Container_ADOdb($dsn) + { + $this->_setDefaults(); + + if (is_array($dsn)) { + $this->_parseOptions($dsn); + + if (empty($this->options['dsn'])) { + PEAR::raiseError('No connection parameters specified!'); + } + } else { + // Extract db_type from dsn string. + $this->options['dsn'] = $dsn; + } + } + + // }}} + // {{{ _connect() + + /** + * Connect to database by using the given DSN string + * + * @access private + * @param string DSN string + * @return mixed Object on error, otherwise bool + */ + function _connect($dsn) + { + if (is_string($dsn) || is_array($dsn)) { + if(!$this->db) { + $this->db = ADONewConnection($dsn); + if( $err = ADODB_Pear_error() ) { + return PEAR::raiseError($err); + } + } + + } else { + return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__, + 41, + PEAR_ERROR_RETURN, + null, + null + ); + } + + if(!$this->db) { + return PEAR::raiseError(ADODB_Pear_error()); + } else { + return true; + } + } + + // }}} + // {{{ _prepare() + + /** + * Prepare database connection + * + * This function checks if we have already opened a connection to + * the database. If that's not the case, a new connection is opened. + * + * @access private + * @return mixed True or a DB error object. + */ + function _prepare() + { + if(!$this->db) { + $res = $this->_connect($this->options['dsn']); + } + return true; + } + + // }}} + // {{{ query() + + /** + * Prepare query to the database + * + * This function checks if we have already opened a connection to + * the database. If that's not the case, a new connection is opened. + * After that the query is passed to the database. + * + * @access public + * @param string Query string + * @return mixed a DB_result object or DB_OK on success, a DB + * or PEAR error on failure + */ + function query($query) + { + $err = $this->_prepare(); + if ($err !== true) { + return $err; + } + return $this->db->query($query); + } + + // }}} + // {{{ _setDefaults() + + /** + * Set some default options + * + * @access private + * @return void + */ + function _setDefaults() + { + $this->options['db_type'] = 'mysql'; + $this->options['table'] = 'auth'; + $this->options['usernamecol'] = 'username'; + $this->options['passwordcol'] = 'password'; + $this->options['dsn'] = ''; + $this->options['db_fields'] = ''; + $this->options['cryptType'] = 'md5'; + } + + // }}} + // {{{ _parseOptions() + + /** + * Parse options passed to the container class + * + * @access private + * @param array + */ + function _parseOptions($array) + { + foreach ($array as $key => $value) { + if (isset($this->options[$key])) { + $this->options[$key] = $value; + } + } + + /* Include additional fields if they exist */ + if(!empty($this->options['db_fields'])){ + if(is_array($this->options['db_fields'])){ + $this->options['db_fields'] = join($this->options['db_fields'], ', '); + } + $this->options['db_fields'] = ', '.$this->options['db_fields']; + } + } + + // }}} + // {{{ fetchData() + + /** + * Get user information from database + * + * This function uses the given username to fetch + * the corresponding login data from the database + * table. If an account that matches the passed username + * and password is found, the function returns true. + * Otherwise it returns false. + * + * @param string Username + * @param string Password + * @return mixed Error object or boolean + */ + function fetchData($username, $password) + { + // Prepare for a database query + $err = $this->_prepare(); + if ($err !== true) { + return PEAR::raiseError($err->getMessage(), $err->getCode()); + } + + // Find if db_fields contains a *, i so assume all col are selected + if(strstr($this->options['db_fields'], '*')){ + $sql_from = "*"; + } + else{ + $sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields']; + } + + $query = "SELECT ".$sql_from. + " FROM ".$this->options['table']. + " WHERE ".$this->options['usernamecol']." = " . $this->db->Quote($username); + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rset = $this->db->Execute( $query ); + $res = $rset->fetchRow(); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } + if (!is_array($res)) { + $this->activeUser = ''; + return false; + } + if ($this->verifyPassword(trim($password, "\r\n"), + trim($res[$this->options['passwordcol']], "\r\n"), + $this->options['cryptType'])) { + // Store additional field values in the session + foreach ($res as $key => $value) { + if ($key == $this->options['passwordcol'] || + $key == $this->options['usernamecol']) { + continue; + } + // Use reference to the auth object if exists + // This is because the auth session variable can change so a static call to setAuthData does not make sence + if(is_object($this->_auth_obj)){ + $this->_auth_obj->setAuthData($key, $value); + } else { + Auth::setAuthData($key, $value); + } + } + + return true; + } + + $this->activeUser = $res[$this->options['usernamecol']]; + return false; + } + + // }}} + // {{{ listUsers() + + function listUsers() + { + $err = $this->_prepare(); + if ($err !== true) { + return PEAR::raiseError($err->getMessage(), $err->getCode()); + } + + $retVal = array(); + + // Find if db_fileds contains a *, i so assume all col are selected + if(strstr($this->options['db_fields'], '*')){ + $sql_from = "*"; + } + else{ + $sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields']; + } + + $query = sprintf("SELECT %s FROM %s", + $sql_from, + $this->options['table'] + ); + $res = $this->db->getAll($query, null, DB_FETCHMODE_ASSOC); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } else { + foreach ($res as $user) { + $user['username'] = $user[$this->options['usernamecol']]; + $retVal[] = $user; + } + } + return $retVal; + } + + // }}} + // {{{ addUser() + + /** + * Add user to the storage container + * + * @access public + * @param string Username + * @param string Password + * @param mixed Additional information that are stored in the DB + * + * @return mixed True on success, otherwise error object + */ + function addUser($username, $password, $additional = "") + { + if (function_exists($this->options['cryptType'])) { + $cryptFunction = $this->options['cryptType']; + } else { + $cryptFunction = 'md5'; + } + + $additional_key = ''; + $additional_value = ''; + + if (is_array($additional)) { + foreach ($additional as $key => $value) { + $additional_key .= ', ' . $key; + $additional_value .= ", '" . $value . "'"; + } + } + + $query = sprintf("INSERT INTO %s (%s, %s%s) VALUES ('%s', '%s'%s)", + $this->options['table'], + $this->options['usernamecol'], + $this->options['passwordcol'], + $additional_key, + $username, + $cryptFunction($password), + $additional_value + ); + + $res = $this->query($query); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } else { + return true; + } + } + + // }}} + // {{{ removeUser() + + /** + * Remove user from the storage container + * + * @access public + * @param string Username + * + * @return mixed True on success, otherwise error object + */ + function removeUser($username) + { + $query = sprintf("DELETE FROM %s WHERE %s = '%s'", + $this->options['table'], + $this->options['usernamecol'], + $username + ); + + $res = $this->query($query); + + if (DB::isError($res)) { + return PEAR::raiseError($res->getMessage(), $res->getCode()); + } else { + return true; + } + } + + // }}} +} + +function showDbg( $string ) { + print " +-- $string</P>"; +} +function dump( $var, $str, $vardump = false ) { + print "<H4>$str</H4><pre>"; + ( !$vardump ) ? ( print_r( $var )) : ( var_dump( $var )); + print "</pre>"; +} +?> diff --git a/pos/is4c-nf/lib/adodb5/pear/readme.Auth.txt b/pos/is4c-nf/lib/adodb5/pear/readme.Auth.txt new file mode 100644 index 000000000..db2831976 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/pear/readme.Auth.txt @@ -0,0 +1,20 @@ +From: Rich Tango-Lowy (richtl#arscognita.com) +Date: Sat, May 29, 2004 11:20 am + +OK, I hacked out an ADOdb container for PEAR-Auth. The error handling's +a bit of a mess, but all the methods work. + +Copy ADOdb.php to your pear/Auth/Container/ directory. + +Use the ADOdb container exactly as you would the DB +container, but specify 'ADOdb' instead of 'DB': + +$dsn = "mysql://myuser:mypass@localhost/authdb"; +$a = new Auth("ADOdb", $dsn, "loginFunction"); + + +------------------- + +John Lim adds: + +See http://pear.php.net/manual/en/package.authentication.php diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-db2.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-db2.inc.php new file mode 100644 index 000000000..1bbb86a8d --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-db2.inc.php @@ -0,0 +1,102 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +// Simple guide to configuring db2: so-so http://www.devx.com/gethelpon/10MinuteSolution/16575 + +// SELECT * FROM TABLE(SNAPSHOT_APPL('SAMPLE', -1)) as t +class perf_db2 extends adodb_perf{ + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created TIMESTAMP NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 varchar(4000) NOT NULL, + params varchar(3000) NOT NULL, + tracer varchar(500) NOT NULL, + timer decimal(16,6) NOT NULL + )"; + + var $settings = array( + 'Ratios', + 'data cache hit ratio' => array('RATIO', + "SELECT + case when sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)=0 then 0 + else 100*(1-sum(POOL_DATA_P_READS+POOL_INDEX_P_READS)/sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)) end + FROM TABLE(SNAPSHOT_APPL('',-2)) as t", + '=WarnCacheRatio'), + + 'Data Cache', + 'data cache buffers' => array('DATAC', + 'select sum(npages) from SYSCAT.BUFFERPOOLS', + 'See <a href=http://www7b.boulder.ibm.com/dmdd/library/techarticle/anshum/0107anshum.html#bufferpoolsize>tuning reference</a>.' ), + 'cache blocksize' => array('DATAC', + 'select avg(pagesize) from SYSCAT.BUFFERPOOLS', + '' ), + 'data cache size' => array('DATAC', + 'select sum(npages*pagesize) from SYSCAT.BUFFERPOOLS', + '' ), + 'Connections', + 'current connections' => array('SESS', + "SELECT count(*) FROM TABLE(SNAPSHOT_APPL_INFO('',-2)) as t", + ''), + + false + ); + + + function perf_db2(&$conn) + { + $this->conn = $conn; + } + + function Explain($sql,$partial=false) + { + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + $qno = rand(); + $ok = $this->conn->Execute("EXPLAIN PLAN SET QUERYNO=$qno FOR $sql"); + ob_start(); + if (!$ok) echo "<p>Have EXPLAIN tables been created?</p>"; + else { + $rs = $this->conn->Execute("select * from explain_statement where queryno=$qno"); + if ($rs) rs2html($rs); + } + $s = ob_get_contents(); + ob_end_clean(); + $this->conn->LogSQL($save); + + $s .= $this->Tracer($sql); + return $s; + } + + + function Tables() + { + $rs = $this->conn->Execute("select tabschema,tabname,card as rows, + npages pages_used,fpages pages_allocated, tbspace tablespace + from syscat.tables where tabschema not in ('SYSCAT','SYSIBM','SYSSTAT') order by 1,2"); + return rs2html($rs,false,false,false,false); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-informix.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-informix.inc.php new file mode 100644 index 000000000..b534e5d20 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-informix.inc.php @@ -0,0 +1,70 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +// +// Thx to Fernando Ortiz, mailto:fortiz#lacorona.com.mx +// With info taken from http://www.oninit.com/oninit/sysmaster/index.html +// +class perf_informix extends adodb_perf{ + + // Maximum size on varchar upto 9.30 255 chars + // better truncate varchar to 255 than char(4000) ? + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created datetime year to second NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 varchar(255) NOT NULL, + params varchar(255) NOT NULL, + tracer varchar(255) NOT NULL, + timer decimal(16,6) NOT NULL + )"; + + var $tablesSQL = "select a.tabname tablename, ti_nptotal*2 size_in_k, ti_nextns extents, ti_nrows records from systables c, sysmaster:systabnames a, sysmaster:systabinfo b where c.tabname not matches 'sys*' and c.partnum = a.partnum and c.partnum = b.ti_partnum"; + + var $settings = array( + 'Ratios', + 'data cache hit ratio' => array('RATIOH', + "select round((1-(wt.value / (rd.value + wr.value)))*100,2) + from sysmaster:sysprofile wr, sysmaster:sysprofile rd, sysmaster:sysprofile wt + where rd.name = 'pagreads' and + wr.name = 'pagwrites' and + wt.name = 'buffwts'", + '=WarnCacheRatio'), + 'IO', + 'data reads' => array('IO', + "select value from sysmaster:sysprofile where name='pagreads'", + 'Page reads'), + + 'data writes' => array('IO', + "select value from sysmaster:sysprofile where name='pagwrites'", + 'Page writes'), + + 'Connections', + 'current connections' => array('SESS', + 'select count(*) from sysmaster:syssessions', + 'Number of sessions'), + + false + + ); + + function perf_informix(&$conn) + { + $this->conn = $conn; + } + +} +?> diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-mssql.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-mssql.inc.php new file mode 100644 index 000000000..0f97fa228 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-mssql.inc.php @@ -0,0 +1,164 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* + MSSQL has moved most performance info to Performance Monitor +*/ +class perf_mssql extends adodb_perf{ + var $sql1 = 'cast(sql1 as text)'; + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created datetime NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 varchar(4000) NOT NULL, + params varchar(3000) NOT NULL, + tracer varchar(500) NOT NULL, + timer decimal(16,6) NOT NULL + )"; + + var $settings = array( + 'Ratios', + 'data cache hit ratio' => array('RATIO', + "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'", + '=WarnCacheRatio'), + 'prepared sql hit ratio' => array('RATIO', + array('dbcc cachestats','Prepared',1,100), + ''), + 'adhoc sql hit ratio' => array('RATIO', + array('dbcc cachestats','Adhoc',1,100), + ''), + 'IO', + 'data reads' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"), + 'data writes' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"), + + 'Data Cache', + 'data cache size' => array('DATAC', + "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'", + '' ), + 'data cache blocksize' => array('DATAC', + "select 8192",'page size'), + 'Connections', + 'current connections' => array('SESS', + '=sp_who', + ''), + 'max connections' => array('SESS', + "SELECT @@MAX_CONNECTIONS", + ''), + + false + ); + + + function perf_mssql(&$conn) + { + if ($conn->dataProvider == 'odbc') { + $this->sql1 = 'sql1'; + //$this->explain = false; + } + $this->conn = $conn; + } + + function Explain($sql,$partial=false) + { + + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + + $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>'; + $this->conn->Execute("SET SHOWPLAN_ALL ON;"); + $sql = str_replace('?',"''",$sql); + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $this->conn->Execute($sql); + //adodb_printr($rs); + $ADODB_FETCH_MODE = $save; + if ($rs) { + $rs->MoveNext(); + $s .= '<table bgcolor=white border=0 cellpadding="1" callspacing=0><tr><td nowrap align=center> Rows<td nowrap align=center> IO<td nowrap align=center> CPU<td align=left> &nbsp; &nbsp; Plan</tr>'; + while (!$rs->EOF) { + $s .= '<tr><td>'.round($rs->fields[8],1).'<td>'.round($rs->fields[9],3).'<td align=right>'.round($rs->fields[10],3).'<td nowrap><pre>'.htmlspecialchars($rs->fields[0])."</td></pre></tr>\n"; ## NOTE CORRUPT </td></pre> tag is intentional!!!! + $rs->MoveNext(); + } + $s .= '</table>'; + + $rs->NextRecordSet(); + } + + $this->conn->Execute("SET SHOWPLAN_ALL OFF;"); + $this->conn->LogSQL($save); + $s .= $this->Tracer($sql); + return $s; + } + + function Tables() + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + //$this->conn->debug=1; + $s = '<table border=1 bgcolor=white><tr><td><b>tablename</b></td><td><b>size_in_k</b></td><td><b>index size</b></td><td><b>reserved size</b></td></tr>'; + $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'"); + if ($rs1) { + while (!$rs1->EOF) { + $tab = $rs1->fields[0]; + $tabq = $this->conn->qstr($tab); + $rs2 = $this->conn->Execute("sp_spaceused $tabq"); + if ($rs2) { + $s .= '<tr><td>'.$tab.'</td><td align=right>'.$rs2->fields[3].'</td><td align=right>'.$rs2->fields[4].'</td><td align=right>'.$rs2->fields[2].'</td></tr>'; + $rs2->Close(); + } + $rs1->MoveNext(); + } + $rs1->Close(); + } + $ADODB_FETCH_MODE = $save; + return $s.'</table>'; + } + + function sp_who() + { + $arr = $this->conn->GetArray('sp_who'); + return sizeof($arr); + } + + function HealthCheck($cli=false) + { + + $this->conn->Execute('dbcc traceon(3604)'); + $html = adodb_perf::HealthCheck($cli); + $this->conn->Execute('dbcc traceoff(3604)'); + return $html; + } + + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-mssqlnative.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-mssqlnative.inc.php new file mode 100644 index 000000000..e6fb481a7 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-mssqlnative.inc.php @@ -0,0 +1,164 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* + MSSQL has moved most performance info to Performance Monitor +*/ +class perf_mssqlnative extends adodb_perf{ + var $sql1 = 'cast(sql1 as text)'; + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created datetime NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 varchar(4000) NOT NULL, + params varchar(3000) NOT NULL, + tracer varchar(500) NOT NULL, + timer decimal(16,6) NOT NULL + )"; + + var $settings = array( + 'Ratios', + 'data cache hit ratio' => array('RATIO', + "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'", + '=WarnCacheRatio'), + 'prepared sql hit ratio' => array('RATIO', + array('dbcc cachestats','Prepared',1,100), + ''), + 'adhoc sql hit ratio' => array('RATIO', + array('dbcc cachestats','Adhoc',1,100), + ''), + 'IO', + 'data reads' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"), + 'data writes' => array('IO', + "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"), + + 'Data Cache', + 'data cache size' => array('DATAC', + "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'", + '' ), + 'data cache blocksize' => array('DATAC', + "select 8192",'page size'), + 'Connections', + 'current connections' => array('SESS', + '=sp_who', + ''), + 'max connections' => array('SESS', + "SELECT @@MAX_CONNECTIONS", + ''), + + false + ); + + + function perf_mssqlnative(&$conn) + { + if ($conn->dataProvider == 'odbc') { + $this->sql1 = 'sql1'; + //$this->explain = false; + } + $this->conn =& $conn; + } + + function Explain($sql,$partial=false) + { + + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + + $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>'; + $this->conn->Execute("SET SHOWPLAN_ALL ON;"); + $sql = str_replace('?',"''",$sql); + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs =& $this->conn->Execute($sql); + //adodb_printr($rs); + $ADODB_FETCH_MODE = $save; + if ($rs) { + $rs->MoveNext(); + $s .= '<table bgcolor=white border=0 cellpadding="1" callspacing=0><tr><td nowrap align=center> Rows<td nowrap align=center> IO<td nowrap align=center> CPU<td align=left> &nbsp; &nbsp; Plan</tr>'; + while (!$rs->EOF) { + $s .= '<tr><td>'.round($rs->fields[8],1).'<td>'.round($rs->fields[9],3).'<td align=right>'.round($rs->fields[10],3).'<td nowrap><pre>'.htmlspecialchars($rs->fields[0])."</td></pre></tr>\n"; ## NOTE CORRUPT </td></pre> tag is intentional!!!! + $rs->MoveNext(); + } + $s .= '</table>'; + + $rs->NextRecordSet(); + } + + $this->conn->Execute("SET SHOWPLAN_ALL OFF;"); + $this->conn->LogSQL($save); + $s .= $this->Tracer($sql); + return $s; + } + + function Tables() + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + //$this->conn->debug=1; + $s = '<table border=1 bgcolor=white><tr><td><b>tablename</b></td><td><b>size_in_k</b></td><td><b>index size</b></td><td><b>reserved size</b></td></tr>'; + $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'"); + if ($rs1) { + while (!$rs1->EOF) { + $tab = $rs1->fields[0]; + $tabq = $this->conn->qstr($tab); + $rs2 = $this->conn->Execute("sp_spaceused $tabq"); + if ($rs2) { + $s .= '<tr><td>'.$tab.'</td><td align=right>'.$rs2->fields[3].'</td><td align=right>'.$rs2->fields[4].'</td><td align=right>'.$rs2->fields[2].'</td></tr>'; + $rs2->Close(); + } + $rs1->MoveNext(); + } + $rs1->Close(); + } + $ADODB_FETCH_MODE = $save; + return $s.'</table>'; + } + + function sp_who() + { + $arr = $this->conn->GetArray('sp_who'); + return sizeof($arr); + } + + function HealthCheck($cli=false) + { + + $this->conn->Execute('dbcc traceon(3604)'); + $html = adodb_perf::HealthCheck($cli); + $this->conn->Execute('dbcc traceoff(3604)'); + return $html; + } + + +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-mysql.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-mysql.inc.php new file mode 100644 index 000000000..dc574da28 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-mysql.inc.php @@ -0,0 +1,315 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class perf_mysql extends adodb_perf{ + + var $tablesSQL = 'show table status'; + + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created datetime NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 text NOT NULL, + params text NOT NULL, + tracer text NOT NULL, + timer decimal(16,6) NOT NULL + )"; + + var $settings = array( + 'Ratios', + 'MyISAM cache hit ratio' => array('RATIO', + '=GetKeyHitRatio', + '=WarnCacheRatio'), + 'InnoDB cache hit ratio' => array('RATIO', + '=GetInnoDBHitRatio', + '=WarnCacheRatio'), + 'data cache hit ratio' => array('HIDE', # only if called + '=FindDBHitRatio', + '=WarnCacheRatio'), + 'sql cache hit ratio' => array('RATIO', + '=GetQHitRatio', + ''), + 'IO', + 'data reads' => array('IO', + '=GetReads', + 'Number of selects (Key_reads is not accurate)'), + 'data writes' => array('IO', + '=GetWrites', + 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'), + + 'Data Cache', + 'MyISAM data cache size' => array('DATAC', + array("show variables", 'key_buffer_size'), + '' ), + 'BDB data cache size' => array('DATAC', + array("show variables", 'bdb_cache_size'), + '' ), + 'InnoDB data cache size' => array('DATAC', + array("show variables", 'innodb_buffer_pool_size'), + '' ), + 'Memory Usage', + 'read buffer size' => array('CACHE', + array("show variables", 'read_buffer_size'), + '(per session)'), + 'sort buffer size' => array('CACHE', + array("show variables", 'sort_buffer_size'), + 'Size of sort buffer (per session)' ), + 'table cache' => array('CACHE', + array("show variables", 'table_cache'), + 'Number of tables to keep open'), + 'Connections', + 'current connections' => array('SESS', + array('show status','Threads_connected'), + ''), + 'max connections' => array( 'SESS', + array("show variables",'max_connections'), + ''), + + false + ); + + function perf_mysql(&$conn) + { + $this->conn = $conn; + } + + function Explain($sql,$partial=false) + { + + if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '<p>Unable to EXPLAIN non-select statement</p>'; + $save = $this->conn->LogSQL(false); + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + $sql = str_replace('?',"''",$sql); + + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq"); + } + + $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>'; + $rs = $this->conn->Execute('EXPLAIN '.$sql); + $s .= rs2html($rs,false,false,false,false); + $this->conn->LogSQL($save); + $s .= $this->Tracer($sql); + return $s; + } + + function Tables() + { + if (!$this->tablesSQL) return false; + + $rs = $this->conn->Execute($this->tablesSQL); + if (!$rs) return false; + + $html = rs2html($rs,false,false,false,false); + return $html; + } + + function GetReads() + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs) return 0; + $val = 0; + while (!$rs->EOF) { + switch($rs->fields[0]) { + case 'Com_select': + $val = $rs->fields[1]; + $rs->Close(); + return $val; + } + $rs->MoveNext(); + } + + $rs->Close(); + + return $val; + } + + function GetWrites() + { + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs) return 0; + $val = 0.0; + while (!$rs->EOF) { + switch($rs->fields[0]) { + case 'Com_insert': + $val += $rs->fields[1]; break; + case 'Com_delete': + $val += $rs->fields[1]; break; + case 'Com_update': + $val += $rs->fields[1]/2; + $rs->Close(); + return $val; + } + $rs->MoveNext(); + } + + $rs->Close(); + + return $val; + } + + function FindDBHitRatio() + { + // first find out type of table + //$this->conn->debug=1; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show table status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs) return ''; + $type = strtoupper($rs->fields[1]); + $rs->Close(); + switch($type){ + case 'MYISAM': + case 'ISAM': + return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)'; + case 'INNODB': + return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)'; + default: + return $type.' not supported'; + } + + } + + function GetQHitRatio() + { + //Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached + $hits = $this->_DBParameter(array("show status","Qcache_hits")); + $total = $this->_DBParameter(array("show status","Qcache_inserts")); + $total += $this->_DBParameter(array("show status","Qcache_not_cached")); + + $total += $hits; + if ($total) return round(($hits*100)/$total,2); + return 0; + } + + /* + Use session variable to store Hit percentage, because MySQL + does not remember last value of SHOW INNODB STATUS hit ratio + + # 1st query to SHOW INNODB STATUS + 0.00 reads/s, 0.00 creates/s, 0.00 writes/s + Buffer pool hit rate 1000 / 1000 + + # 2nd query to SHOW INNODB STATUS + 0.00 reads/s, 0.00 creates/s, 0.00 writes/s + No buffer pool activity since the last printout + */ + function GetInnoDBHitRatio() + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute('show innodb status'); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if (!$rs || $rs->EOF) return 0; + $stat = $rs->fields[0]; + $rs->Close(); + $at = strpos($stat,'Buffer pool hit rate'); + $stat = substr($stat,$at,200); + if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) { + $val = 100*$arr[1]/$arr[2]; + $_SESSION['INNODB_HIT_PCT'] = $val; + return round($val,2); + } else { + if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT']; + return 0; + } + return 0; + } + + function GetKeyHitRatio() + { + $hits = $this->_DBParameter(array("show status","Key_read_requests")); + $reqs = $this->_DBParameter(array("show status","Key_reads")); + if ($reqs == 0) return 0; + + return round(($hits/($reqs+$hits))*100,2); + } + + // start hack + var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK'; + var $optimizeTableHigh = 'OPTIMIZE TABLE %s'; + + /** + * @see adodb_perf#optimizeTable + */ + function optimizeTable( $table, $mode = ADODB_OPT_LOW) + { + if ( !is_string( $table)) return false; + + $conn = $this->conn; + if ( !$conn) return false; + + $sql = ''; + switch( $mode) { + case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; + case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break; + default : + { + // May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0) + ADOConnection::outp( sprintf( "<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, __FUNCTION__, $mode)); + return false; + } + } + $sql = sprintf( $sql, $table); + + return $conn->Execute( $sql) !== false; + } + // end hack +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-oci8.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-oci8.inc.php new file mode 100644 index 000000000..41a3fdd0e --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-oci8.inc.php @@ -0,0 +1,570 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +class perf_oci8 extends ADODB_perf{ + + var $noShowIxora = 15; // if the sql for suspicious sql is taking too long, then disable ixora + + var $tablesSQL = "select segment_name as \"tablename\", sum(bytes)/1024 as \"size_in_k\",tablespace_name as \"tablespace\",count(*) \"extents\" from sys.user_extents + group by segment_name,tablespace_name"; + + var $version; + + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created date NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 varchar(4000) NOT NULL, + params varchar(4000), + tracer varchar(4000), + timer decimal(16,6) NOT NULL + )"; + + var $settings = array( + 'Ratios', + 'data cache hit ratio' => array('RATIOH', + "select round((1-(phy.value / (cur.value + con.value)))*100,2) + from v\$sysstat cur, v\$sysstat con, v\$sysstat phy + where cur.name = 'db block gets' and + con.name = 'consistent gets' and + phy.name = 'physical reads'", + '=WarnCacheRatio'), + + 'sql cache hit ratio' => array( 'RATIOH', + 'select round(100*(sum(pins)-sum(reloads))/sum(pins),2) from v$librarycache', + 'increase <i>shared_pool_size</i> if too ratio low'), + + 'datadict cache hit ratio' => array('RATIOH', + "select + round((1 - (sum(getmisses) / (sum(gets) + + sum(getmisses))))*100,2) + from v\$rowcache", + 'increase <i>shared_pool_size</i> if too ratio low'), + + 'memory sort ratio' => array('RATIOH', + "SELECT ROUND((100 * b.VALUE) /DECODE ((a.VALUE + b.VALUE), + 0,1,(a.VALUE + b.VALUE)),2) +FROM v\$sysstat a, + v\$sysstat b +WHERE a.name = 'sorts (disk)' +AND b.name = 'sorts (memory)'", + "% of memory sorts compared to disk sorts - should be over 95%"), + + 'IO', + 'data reads' => array('IO', + "select value from v\$sysstat where name='physical reads'"), + + 'data writes' => array('IO', + "select value from v\$sysstat where name='physical writes'"), + + 'Data Cache', + + 'data cache buffers' => array( 'DATAC', + "select a.value/b.value from v\$parameter a, v\$parameter b + where a.name = 'db_cache_size' and b.name= 'db_block_size'", + 'Number of cache buffers. Tune <i>db_cache_size</i> if the <i>data cache hit ratio</i> is too low.'), + 'data cache blocksize' => array('DATAC', + "select value from v\$parameter where name='db_block_size'", + '' ), + + 'Memory Pools', + 'SGA Max Size' => array( 'DATAC', + "select value from v\$parameter where name = 'sga_max_size'", + 'The sga_max_size is the maximum value to which sga_target can be set.' ), + 'SGA target' => array( 'DATAC', + "select value from v\$parameter where name = 'sga_target'", + 'If sga_target is defined then data cache, shared, java and large pool size can be 0. This is because all these pools are consolidated into one sga_target.' ), + 'data cache size' => array('DATAC', + "select value from v\$parameter where name = 'db_cache_size'", + 'db_cache_size' ), + 'shared pool size' => array('DATAC', + "select value from v\$parameter where name = 'shared_pool_size'", + 'shared_pool_size, which holds shared sql, stored procedures, dict cache and similar shared structs' ), + 'java pool size' => array('DATAJ', + "select value from v\$parameter where name = 'java_pool_size'", + 'java_pool_size' ), + 'large pool buffer size' => array('CACHE', + "select value from v\$parameter where name='large_pool_size'", + 'this pool is for large mem allocations (not because it is larger than shared pool), for MTS sessions, parallel queries, io buffers (large_pool_size) ' ), + + 'pga buffer size' => array('CACHE', + "select value from v\$parameter where name='pga_aggregate_target'", + 'program global area is private memory for sorting, and hash and bitmap merges - since oracle 9i (pga_aggregate_target)' ), + + + 'Connections', + 'current connections' => array('SESS', + 'select count(*) from sys.v_$session where username is not null', + ''), + 'max connections' => array( 'SESS', + "select value from v\$parameter where name='sessions'", + ''), + + 'Memory Utilization', + 'data cache utilization ratio' => array('RATIOU', + "select round((1-bytes/sgasize)*100, 2) + from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f + where name = 'free memory' and pool = 'shared pool'", + 'Percentage of data cache actually in use - should be over 85%'), + + 'shared pool utilization ratio' => array('RATIOU', + 'select round((sga.bytes/case when p.value=0 then sga.bytes else to_number(p.value) end)*100,2) + from v$sgastat sga, v$parameter p + where sga.name = \'free memory\' and sga.pool = \'shared pool\' + and p.name = \'shared_pool_size\'', + 'Percentage of shared pool actually used - too low is bad, too high is worse'), + + 'large pool utilization ratio' => array('RATIOU', + "select round((1-bytes/sgasize)*100, 2) + from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f + where name = 'free memory' and pool = 'large pool'", + 'Percentage of large_pool actually in use - too low is bad, too high is worse'), + 'sort buffer size' => array('CACHE', + "select value from v\$parameter where name='sort_area_size'", + 'max in-mem sort_area_size (per query), uses memory in pga' ), + + 'pga usage at peak' => array('RATIOU', + '=PGA','Mb utilization at peak transactions (requires Oracle 9i+)'), + 'Transactions', + 'rollback segments' => array('ROLLBACK', + "select count(*) from sys.v_\$rollstat", + ''), + + 'peak transactions' => array('ROLLBACK', + "select max_utilization tx_hwm + from sys.v_\$resource_limit + where resource_name = 'transactions'", + 'Taken from high-water-mark'), + 'max transactions' => array('ROLLBACK', + "select value from v\$parameter where name = 'transactions'", + 'max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)'), + 'Parameters', + 'cursor sharing' => array('CURSOR', + "select value from v\$parameter where name = 'cursor_sharing'", + 'Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See <a href=http://www.praetoriate.com/oracle_tips_cursor_sharing.htm>cursor_sharing</a>.'), + /* + 'cursor reuse' => array('CURSOR', + "select count(*) from (select sql_text_wo_constants, count(*) + from t1 + group by sql_text_wo_constants +having count(*) > 100)",'These are sql statements that should be using bind variables'),*/ + 'index cache cost' => array('COST', + "select value from v\$parameter where name = 'optimizer_index_caching'", + '=WarnIndexCost'), + 'random page cost' => array('COST', + "select value from v\$parameter where name = 'optimizer_index_cost_adj'", + '=WarnPageCost'), + + 'Backup', + 'Achivelog Mode' => array('BACKUP', 'select log_mode from v$database', 'To turn on archivelog:<br> + <pre> + SQLPLUS> connect sys as sysdba; + SQLPLUS> shutdown immediate; + + SQLPLUS> startup mount exclusive; + SQLPLUS> alter database archivelog; + SQLPLUS> archive log start; + SQLPLUS> alter database open; +</pre>'), + + 'DBID' => array('BACKUP','select dbid from v$database','Primary key of database, used for recovery with an RMAN Recovery Catalog'), + 'Archive Log Dest' => array('BACKUP', "SELECT NVL(v1.value,v2.value) +FROM v\$parameter v1, v\$parameter v2 WHERE v1.name='log_archive_dest' AND v2.name='log_archive_dest_10'", ''), + + 'Flashback Area' => array('BACKUP', "select nvl(value,'Flashback Area not used') from v\$parameter where name=lower('DB_RECOVERY_FILE_DEST')", 'Flashback area is a folder where all backup data and logs can be stored and managed by Oracle. If Error: message displayed, then it is not in use.'), + 'Control File Keep Time' => array('BACKUP', "select value from v\$parameter where name='control_file_record_keep_time'",'No of days to keep RMAN info in control file. I recommend it be set to x2 or x3 times the frequency of your full backup.'), + false + + ); + + + function perf_oci8(&$conn) + { + $savelog = $conn->LogSQL(false); + $this->version = $conn->ServerInfo(); + $conn->LogSQL($savelog); + $this->conn = $conn; + } + + function WarnPageCost($val) + { + if ($val == 100) $s = '<font color=red><b>Too High</b>. </font>'; + else $s = ''; + + return $s.'Recommended is 20-50 for TP, and 50 for data warehouses. Default is 100. See <a href=http://www.dba-oracle.com/oracle_tips_cost_adj.htm>optimizer_index_cost_adj</a>. '; + } + + function WarnIndexCost($val) + { + if ($val == 0) $s = '<font color=red><b>Too Low</b>. </font>'; + else $s = ''; + + return $s.'Percentage of indexed data blocks expected in the cache. + Recommended is 20 (fast disk array) to 30 (slower hard disks). Default is 0. + See <a href=http://www.dba-oracle.com/oracle_tips_cbo_part1.htm>optimizer_index_caching</a>.'; + } + + function PGA() + { + if ($this->version['version'] < 9) return 'Oracle 9i or later required'; + + $rs = $this->conn->Execute("select a.mb,a.targ as pga_size_pct,a.pct from + (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb, + pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r + from v\$pga_target_advice) a left join + (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb, + pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r + from v\$pga_target_advice) b on + a.r = b.r+1 where + b.pct < 100"); + if (!$rs) return "Only in 9i or later"; + $rs->Close(); + if ($rs->EOF) return "PGA could be too big"; + + return reset($rs->fields); + } + + function Explain($sql,$partial=false) + { + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->SelectLimit("select ID FROM PLAN_TABLE"); + if (!$rs) { + echo "<p><b>Missing PLAN_TABLE</b></p> +<pre> +CREATE TABLE PLAN_TABLE ( + STATEMENT_ID VARCHAR2(30), + TIMESTAMP DATE, + REMARKS VARCHAR2(80), + OPERATION VARCHAR2(30), + OPTIONS VARCHAR2(30), + OBJECT_NODE VARCHAR2(128), + OBJECT_OWNER VARCHAR2(30), + OBJECT_NAME VARCHAR2(30), + OBJECT_INSTANCE NUMBER(38), + OBJECT_TYPE VARCHAR2(30), + OPTIMIZER VARCHAR2(255), + SEARCH_COLUMNS NUMBER, + ID NUMBER(38), + PARENT_ID NUMBER(38), + POSITION NUMBER(38), + COST NUMBER(38), + CARDINALITY NUMBER(38), + BYTES NUMBER(38), + OTHER_TAG VARCHAR2(255), + PARTITION_START VARCHAR2(255), + PARTITION_STOP VARCHAR2(255), + PARTITION_ID NUMBER(38), + OTHER LONG, + DISTRIBUTION VARCHAR2(30) +); +</pre>"; + return false; + } + + $rs->Close(); + // $this->conn->debug=1; + + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + + $s = "<p><b>Explain</b>: ".htmlspecialchars($sql)."</p>"; + + $this->conn->BeginTrans(); + $id = "ADODB ".microtime(); + + $rs = $this->conn->Execute("EXPLAIN PLAN SET STATEMENT_ID='$id' FOR $sql"); + $m = $this->conn->ErrorMsg(); + if ($m) { + $this->conn->RollbackTrans(); + $this->conn->LogSQL($savelog); + $s .= "<p>$m</p>"; + return $s; + } + $rs = $this->conn->Execute(" + select + '<pre>'||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'</pre>' as Operation, + object_name,COST,CARDINALITY,bytes + FROM plan_table +START WITH id = 0 and STATEMENT_ID='$id' +CONNECT BY prior id=parent_id and statement_id='$id'"); + + $s .= rs2html($rs,false,false,false,false); + $this->conn->RollbackTrans(); + $this->conn->LogSQL($savelog); + $s .= $this->Tracer($sql,$partial); + return $s; + } + + + function CheckMemory() + { + if ($this->version['version'] < 9) return 'Oracle 9i or later required'; + + $rs = $this->conn->Execute(" +select a.size_for_estimate as cache_mb_estimate, + case when a.size_factor=1 then + '&lt;&lt;= current' + when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then + '- BETTER - ' + else ' ' end as currsize, + a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0 + from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a , + (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1"); + if (!$rs) return false; + + /* + The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size + */ + $s = "<h3>Data Cache Estimate</h3>"; + if ($rs->EOF) { + $s .= "<p>Cache that is 50% of current size is still too big</p>"; + } else { + $s .= "Ideal size of Data Cache is when \"best_when_0\" changes from a positive number and becomes zero."; + $s .= rs2html($rs,false,false,false,false); + } + return $s; + } + + /* + Generate html for suspicious/expensive sql + */ + function tohtml(&$rs,$type) + { + $o1 = $rs->FetchField(0); + $o2 = $rs->FetchField(1); + $o3 = $rs->FetchField(2); + if ($rs->EOF) return '<p>None found</p>'; + $check = ''; + $sql = ''; + $s = "\n\n<table border=1 bgcolor=white><tr><td><b>".$o1->name.'</b></td><td><b>'.$o2->name.'</b></td><td><b>'.$o3->name.'</b></td></tr>'; + while (!$rs->EOF) { + if ($check != $rs->fields[0].'::'.$rs->fields[1]) { + if ($check) { + $carr = explode('::',$check); + $prefix = "<a href=\"?$type=1&sql=".rawurlencode($sql).'&x#explain">'; + $suffix = '</a>'; + if (strlen($prefix)>2000) { + $prefix = ''; + $suffix = ''; + } + + $s .= "\n<tr><td align=right>".$carr[0].'</td><td align=right>'.$carr[1].'</td><td>'.$prefix.$sql.$suffix.'</td></tr>'; + } + $sql = $rs->fields[2]; + $check = $rs->fields[0].'::'.$rs->fields[1]; + } else + $sql .= $rs->fields[2]; + if (substr($sql,strlen($sql)-1) == "\0") $sql = substr($sql,0,strlen($sql)-1); + $rs->MoveNext(); + } + $rs->Close(); + + $carr = explode('::',$check); + $prefix = "<a target=".rand()." href=\"?&hidem=1&$type=1&sql=".rawurlencode($sql).'&x#explain">'; + $suffix = '</a>'; + if (strlen($prefix)>2000) { + $prefix = ''; + $suffix = ''; + } + $s .= "\n<tr><td align=right>".$carr[0].'</td><td align=right>'.$carr[1].'</td><td>'.$prefix.$sql.$suffix.'</td></tr>'; + + return $s."</table>\n\n"; + } + + // code thanks to Ixora. + // http://www.ixora.com.au/scripts/query_opt.htm + // requires oracle 8.1.7 or later + function SuspiciousSQL($numsql=10) + { + $sql = " +select + substr(to_char(s.pct, '99.00'), 2) || '%' load, + s.executions executes, + p.sql_text +from + ( + select + address, + buffer_gets, + executions, + pct, + rank() over (order by buffer_gets desc) ranking + from + ( + select + address, + buffer_gets, + executions, + 100 * ratio_to_report(buffer_gets) over () pct + from + sys.v_\$sql + where + command_type != 47 and module != 'T.O.A.D.' + ) + where + buffer_gets > 50 * executions + ) s, + sys.v_\$sqltext p +where + s.ranking <= $numsql and + p.address = s.address +order by + 1 desc, s.address, p.piece"; + + global $ADODB_CACHE_MODE; + if (isset($_GET['expsixora']) && isset($_GET['sql'])) { + $partial = empty($_GET['part']); + echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n"; + } + + if (isset($_GET['sql'])) return $this->_SuspiciousSQL($numsql); + + $s = ''; + $timer = time(); + $s .= $this->_SuspiciousSQL($numsql); + $timer = time() - $timer; + + if ($timer > $this->noShowIxora) return $s; + $s .= '<p>'; + + $save = $ADODB_CACHE_MODE; + $ADODB_CACHE_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->SelectLimit($sql); + $this->conn->LogSQL($savelog); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_CACHE_MODE = $save; + if ($rs) { + $s .= "\n<h3>Ixora Suspicious SQL</h3>"; + $s .= $this->tohtml($rs,'expsixora'); + } + + return $s; + } + + // code thanks to Ixora. + // http://www.ixora.com.au/scripts/query_opt.htm + // requires oracle 8.1.7 or later + function ExpensiveSQL($numsql = 10) + { + $sql = " +select + substr(to_char(s.pct, '99.00'), 2) || '%' load, + s.executions executes, + p.sql_text +from + ( + select + address, + disk_reads, + executions, + pct, + rank() over (order by disk_reads desc) ranking + from + ( + select + address, + disk_reads, + executions, + 100 * ratio_to_report(disk_reads) over () pct + from + sys.v_\$sql + where + command_type != 47 and module != 'T.O.A.D.' + ) + where + disk_reads > 50 * executions + ) s, + sys.v_\$sqltext p +where + s.ranking <= $numsql and + p.address = s.address +order by + 1 desc, s.address, p.piece +"; + global $ADODB_CACHE_MODE; + if (isset($_GET['expeixora']) && isset($_GET['sql'])) { + $partial = empty($_GET['part']); + echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n"; + } + if (isset($_GET['sql'])) { + $var = $this->_ExpensiveSQL($numsql); + return $var; + } + + $s = ''; + $timer = time(); + $s .= $this->_ExpensiveSQL($numsql); + $timer = time() - $timer; + if ($timer > $this->noShowIxora) return $s; + + $s .= '<p>'; + $save = $ADODB_CACHE_MODE; + $ADODB_CACHE_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($sql); + $this->conn->LogSQL($savelog); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_CACHE_MODE = $save; + + if ($rs) { + $s .= "\n<h3>Ixora Expensive SQL</h3>"; + $s .= $this->tohtml($rs,'expeixora'); + } + + return $s; + } + + function clearsql() + { + $perf_table = adodb_perf::table(); + // using the naive "delete from $perf_table where created<".$this->conn->sysTimeStamp will cause the table to lock, possibly + // for a long time + $sql = +"DECLARE cnt pls_integer; +BEGIN + cnt := 0; + FOR rec IN (SELECT ROWID AS rr FROM $perf_table WHERE created<SYSDATE) + LOOP + cnt := cnt + 1; + DELETE FROM $perf_table WHERE ROWID=rec.rr; + IF cnt = 1000 THEN + COMMIT; + cnt := 0; + END IF; + END LOOP; + commit; +END;"; + + $ok = $this->conn->Execute($sql); + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/perf/perf-postgres.inc.php b/pos/is4c-nf/lib/adodb5/perf/perf-postgres.inc.php new file mode 100644 index 000000000..b0894ab3e --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/perf/perf-postgres.inc.php @@ -0,0 +1,153 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. See License.txt. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net + + Library for basic performance monitoring and tuning + +*/ + +// security - hide paths +if (!defined('ADODB_DIR')) die(); + +/* + Notice that PostgreSQL has no sql query cache +*/ +class perf_postgres extends adodb_perf{ + + var $tablesSQL = + "select a.relname as tablename,(a.relpages+CASE WHEN b.relpages is null THEN 0 ELSE b.relpages END+CASE WHEN c.relpages is null THEN 0 ELSE c.relpages END)*8 as size_in_K,a.relfilenode as \"OID\" from pg_class a left join pg_class b + on b.relname = 'pg_toast_'||trim(a.relfilenode) + left join pg_class c on c.relname = 'pg_toast_'||trim(a.relfilenode)||'_index' + where a.relname in (select tablename from pg_tables where tablename not like 'pg_%')"; + + var $createTableSQL = "CREATE TABLE adodb_logsql ( + created timestamp NOT NULL, + sql0 varchar(250) NOT NULL, + sql1 text NOT NULL, + params text NOT NULL, + tracer text NOT NULL, + timer decimal(16,6) NOT NULL + )"; + + var $settings = array( + 'Ratios', + 'statistics collector' => array('RATIO', + "select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ", + 'Value must be TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i> and <i>stats_block_level</i> must be set to true in postgresql.conf)'), + 'data cache hit ratio' => array('RATIO', + "select case when blks_hit=0 then 0 else round( ((1-blks_read::float/blks_hit)*100)::numeric, 2) end from pg_stat_database where datname='\$DATABASE'", + '=WarnCacheRatio'), + 'IO', + 'data reads' => array('IO', + 'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables', + ), + 'data writes' => array('IO', + 'select round((sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16)::numeric,2) from pg_stat_user_tables', + 'Count of inserts/updates/deletes * coef'), + + 'Data Cache', + 'data cache buffers' => array('DATAC', + "select setting from pg_settings where name='shared_buffers'", + 'Number of cache buffers. <a href=http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic>Tuning</a>'), + 'cache blocksize' => array('DATAC', + 'select 8192', + '(estimate)' ), + 'data cache size' => array( 'DATAC', + "select setting::integer*8192 from pg_settings where name='shared_buffers'", + '' ), + 'operating system cache size' => array( 'DATA', + "select setting::integer*8192 from pg_settings where name='effective_cache_size'", + '(effective cache size)' ), + 'Memory Usage', + # Postgres 7.5 changelog: Rename server parameters SortMem and VacuumMem to work_mem and maintenance_work_mem; + 'sort/work buffer size' => array('CACHE', + "select setting::integer*1024 from pg_settings where name='sort_mem' or name = 'work_mem' order by name", + 'Size of sort buffer (per query)' ), + 'Connections', + 'current connections' => array('SESS', + 'select count(*) from pg_stat_activity', + ''), + 'max connections' => array('SESS', + "select setting from pg_settings where name='max_connections'", + ''), + 'Parameters', + 'rollback buffers' => array('COST', + "select setting from pg_settings where name='wal_buffers'", + 'WAL buffers'), + 'random page cost' => array('COST', + "select setting from pg_settings where name='random_page_cost'", + 'Cost of doing a seek (default=4). See <a href=http://www.varlena.com/GeneralBits/Tidbits/perf.html#less>random_page_cost</a>'), + false + ); + + function perf_postgres(&$conn) + { + $this->conn = $conn; + } + + var $optimizeTableLow = 'VACUUM %s'; + var $optimizeTableHigh = 'VACUUM ANALYZE %s'; + +/** + * @see adodb_perf#optimizeTable + */ + + function optimizeTable($table, $mode = ADODB_OPT_LOW) + { + if(! is_string($table)) return false; + + $conn = $this->conn; + if (! $conn) return false; + + $sql = ''; + switch($mode) { + case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; + case ADODB_OPT_HIGH: $sql = $this->optimizeTableHigh; break; + default : + { + ADOConnection::outp(sprintf("<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, 'optimizeTable', $mode)); + return false; + } + } + $sql = sprintf($sql, $table); + + return $conn->Execute($sql) !== false; + } + + function Explain($sql,$partial=false) + { + $save = $this->conn->LogSQL(false); + + if ($partial) { + $sqlq = $this->conn->qstr($sql.'%'); + $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq"); + if ($arr) { + foreach($arr as $row) { + $sql = reset($row); + if (crc32($sql) == $partial) break; + } + } + } + $sql = str_replace('?',"''",$sql); + $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>'; + $rs = $this->conn->Execute('EXPLAIN '.$sql); + $this->conn->LogSQL($save); + $s .= '<pre>'; + if ($rs) + while (!$rs->EOF) { + $s .= reset($rs->fields)."\n"; + $rs->MoveNext(); + } + $s .= '</pre>'; + $s .= $this->Tracer($sql,$partial); + return $s; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/pivottable.inc.php b/pos/is4c-nf/lib/adodb5/pivottable.inc.php new file mode 100644 index 000000000..89789030d --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/pivottable.inc.php @@ -0,0 +1,187 @@ +<?php +/** + * @version V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * +*/ + +/* + * Concept from daniel.lucazeau@ajornet.com. + * + * @param db Adodb database connection + * @param tables List of tables to join + * @rowfields List of fields to display on each row + * @colfield Pivot field to slice and display in columns, if we want to calculate + * ranges, we pass in an array (see example2) + * @where Where clause. Optional. + * @aggfield This is the field to sum. Optional. + * Since 2.3.1, if you can use your own aggregate function + * instead of SUM, eg. $aggfield = 'fieldname'; $aggfn = 'AVG'; + * @sumlabel Prefix to display in sum columns. Optional. + * @aggfn Aggregate function to use (could be AVG, SUM, COUNT) + * @showcount Show count of records + * + * @returns Sql generated + */ + + function PivotTableSQL(&$db,$tables,$rowfields,$colfield, $where=false, + $aggfield = false,$sumlabel='Sum ',$aggfn ='SUM', $showcount = true) + { + if ($aggfield) $hidecnt = true; + else $hidecnt = false; + + $iif = strpos($db->databaseType,'access') !== false; + // note - vfp 6 still doesn' work even with IIF enabled || $db->databaseType == 'vfp'; + + //$hidecnt = false; + + if ($where) $where = "\nWHERE $where"; + if (!is_array($colfield)) $colarr = $db->GetCol("select distinct $colfield from $tables $where order by 1"); + if (!$aggfield) $hidecnt = false; + + $sel = "$rowfields, "; + if (is_array($colfield)) { + foreach ($colfield as $k => $v) { + $k = trim($k); + if (!$hidecnt) { + $sel .= $iif ? + "\n\t$aggfn(IIF($v,1,0)) AS \"$k\", " + : + "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", "; + } + if ($aggfield) { + $sel .= $iif ? + "\n\t$aggfn(IIF($v,$aggfield,0)) AS \"$sumlabel$k\", " + : + "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", "; + } + } + } else { + foreach ($colarr as $v) { + if (!is_numeric($v)) $vq = $db->qstr($v); + else $vq = $v; + $v = trim($v); + if (strlen($v) == 0 ) $v = 'null'; + if (!$hidecnt) { + $sel .= $iif ? + "\n\t$aggfn(IIF($colfield=$vq,1,0)) AS \"$v\", " + : + "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", "; + } + if ($aggfield) { + if ($hidecnt) $label = $v; + else $label = "{$v}_$aggfield"; + $sel .= $iif ? + "\n\t$aggfn(IIF($colfield=$vq,$aggfield,0)) AS \"$label\", " + : + "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", "; + } + } + } + if ($aggfield && $aggfield != '1'){ + $agg = "$aggfn($aggfield)"; + $sel .= "\n\t$agg as \"$sumlabel$aggfield\", "; + } + + if ($showcount) + $sel .= "\n\tSUM(1) as Total"; + else + $sel = substr($sel,0,strlen($sel)-2); + + + // Strip aliases + $rowfields = preg_replace('/ AS (\w+)/i', '', $rowfields); + + $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields"; + + return $sql; + } + +/* EXAMPLES USING MS NORTHWIND DATABASE */ +if (0) { + +# example1 +# +# Query the main "product" table +# Set the rows to CompanyName and QuantityPerUnit +# and the columns to the Categories +# and define the joins to link to lookup tables +# "categories" and "suppliers" +# + + $sql = PivotTableSQL( + $gDB, # adodb connection + 'products p ,categories c ,suppliers s', # tables + 'CompanyName,QuantityPerUnit', # row fields + 'CategoryName', # column fields + 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where +); + print "<pre>$sql"; + $rs = $gDB->Execute($sql); + rs2html($rs); + +/* +Generated SQL: + +SELECT CompanyName,QuantityPerUnit, + SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages", + SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments", + SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections", + SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products", + SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals", + SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry", + SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce", + SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood", + SUM(1) as Total +FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID +GROUP BY CompanyName,QuantityPerUnit +*/ +//===================================================================== + +# example2 +# +# Query the main "product" table +# Set the rows to CompanyName and QuantityPerUnit +# and the columns to the UnitsInStock for diiferent ranges +# and define the joins to link to lookup tables +# "categories" and "suppliers" +# + $sql = PivotTableSQL( + $gDB, # adodb connection + 'products p ,categories c ,suppliers s', # tables + 'CompanyName,QuantityPerUnit', # row fields + # column ranges +array( +' 0 ' => 'UnitsInStock <= 0', +"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5', +"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10', +"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15', +"16+" =>'15 < UnitsInStock' +), + ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where + 'UnitsInStock', # sum this field + 'Sum' # sum label prefix +); + print "<pre>$sql"; + $rs = $gDB->Execute($sql); + rs2html($rs); + /* + Generated SQL: + +SELECT CompanyName,QuantityPerUnit, + SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ", + SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5", + SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10", + SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15", + SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+", + SUM(UnitsInStock) AS "Sum UnitsInStock", + SUM(1) as Total +FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID +GROUP BY CompanyName,QuantityPerUnit + */ +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/readme.txt b/pos/is4c-nf/lib/adodb5/readme.txt new file mode 100644 index 000000000..97bdd9eab --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/readme.txt @@ -0,0 +1,62 @@ +>> ADODB Library for PHP4 + +(c) 2000-2004 John Lim (jlim@natsoft.com.my) + +Released under both BSD and GNU Lesser GPL library license. +This means you can use it in proprietary products. + + +>> Introduction + +PHP's database access functions are not standardised. This creates a +need for a database class library to hide the differences between the +different databases (encapsulate the differences) so we can easily +switch databases. + +We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle, +Microsoft SQL server, Foxpro ODBC, Access ODBC, Informix, DB2, +Sybase SQL Anywhere, generic ODBC and Microsoft's ADO. + +We hope more people will contribute drivers to support other databases. + + +>> Documentation and Examples + +Refer to the adodb/docs directory for full documentation and examples. +There is also a tutorial tute.htm that contrasts ADODB code with +mysql code. + + +>>> Files +Adodb.inc.php is the main file. You need to include only this file. + +Adodb-*.inc.php are the database specific driver code. + +Test.php contains a list of test commands to exercise the class library. + +Adodb-session.php is the PHP4 session handling code. + +Testdatabases.inc.php contains the list of databases to apply the tests on. + +Benchmark.php is a simple benchmark to test the throughput of a simple SELECT +statement for databases described in testdatabases.inc.php. The benchmark +tables are created in test.php. + +readme.htm is the main documentation. + +tute.htm is the tutorial. + + +>> More Info + +For more information, including installation see readme.htm +or visit + http://adodb.sourceforge.net/ + + +>> Feature Requests and Bug Reports + +Email to jlim@natsoft.com.my + + + \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/rsfilter.inc.php b/pos/is4c-nf/lib/adodb5/rsfilter.inc.php new file mode 100644 index 000000000..6f3d646d7 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/rsfilter.inc.php @@ -0,0 +1,61 @@ +<?php +/** + * @version V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * + * Requires PHP4.01pl2 or later because it uses include_once +*/ + +/* + Filter all fields and all rows in a recordset and returns the + processed recordset. We scroll to the beginning of the new recordset + after processing. + + We pass a recordset and function name to RSFilter($rs,'rowfunc'); + and the function will be called multiple times, once + for each row in the recordset. The function will be passed + an array containing one row repeatedly. + + Example: + + // ucwords() every element in the recordset + function do_ucwords(&$arr,$rs) + { + foreach($arr as $k => $v) { + $arr[$k] = ucwords($v); + } + } + $rs = RSFilter($rs,'do_ucwords'); + */ +function RSFilter($rs,$fn) +{ + if ($rs->databaseType != 'array') { + if (!$rs->connection) return false; + + $rs = $rs->connection->_rs2rs($rs); + } + $rows = $rs->RecordCount(); + for ($i=0; $i < $rows; $i++) { + if (is_array ($fn)) { + $obj = $fn[0]; + $method = $fn[1]; + $obj->$method ($rs->_array[$i],$rs); + } else { + $fn($rs->_array[$i],$rs); + } + + } + if (!$rs->EOF) { + $rs->_currentRow = 0; + $rs->fields = $rs->_array[0]; + } + + return $rs; +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/server.php b/pos/is4c-nf/lib/adodb5/server.php new file mode 100644 index 000000000..c696f3997 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/server.php @@ -0,0 +1,100 @@ +<?php + +/** + * @version V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + */ + +/* Documentation on usage is at http://php.weblogs.com/adodb_csv + * + * Legal query string parameters: + * + * sql = holds sql string + * nrows = number of rows to return + * offset = skip offset rows of data + * fetch = $ADODB_FETCH_MODE + * + * example: + * + * http://localhost/php/server.php?select+*+from+table&nrows=10&offset=2 + */ + + +/* + * Define the IP address you want to accept requests from + * as a security measure. If blank we accept anyone promisciously! + */ +$ACCEPTIP = '127.0.0.1'; + +/* + * Connection parameters + */ +$driver = 'mysql'; +$host = 'localhost'; // DSN for odbc +$uid = 'root'; +$pwd = 'garbase-it-is'; +$database = 'test'; + +/*============================ DO NOT MODIFY BELOW HERE =================================*/ +// $sep must match csv2rs() in adodb.inc.php +$sep = ' :::: '; + +include('./adodb.inc.php'); +include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); + +function err($s) +{ + die('**** '.$s.' '); +} + +// undo stupid magic quotes +function undomq(&$m) +{ + if (get_magic_quotes_gpc()) { + // undo the damage + $m = str_replace('\\\\','\\',$m); + $m = str_replace('\"','"',$m); + $m = str_replace('\\\'','\'',$m); + + } + return $m; +} + +///////////////////////////////////////// DEFINITIONS + + +$remote = $_SERVER["REMOTE_ADDR"]; + + +if (!empty($ACCEPTIP)) + if ($remote != '127.0.0.1' && $remote != $ACCEPTIP) + err("Unauthorised client: '$remote'"); + + +if (empty($_REQUEST['sql'])) err('No SQL'); + + +$conn = ADONewConnection($driver); + +if (!$conn->Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg()); +$sql = undomq($_REQUEST['sql']); + +if (isset($_REQUEST['fetch'])) + $ADODB_FETCH_MODE = $_REQUEST['fetch']; + +if (isset($_REQUEST['nrows'])) { + $nrows = $_REQUEST['nrows']; + $offset = isset($_REQUEST['offset']) ? $_REQUEST['offset'] : -1; + $rs = $conn->SelectLimit($sql,$nrows,$offset); +} else + $rs = $conn->Execute($sql); +if ($rs){ + //$rs->timeToLive = 1; + echo _rs2serialize($rs,$conn,$sql); + $rs->Close(); +} else + err($conn->ErrorNo(). $sep .$conn->ErrorMsg()); + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-compress-bzip2.php b/pos/is4c-nf/lib/adodb5/session/adodb-compress-bzip2.php new file mode 100644 index 000000000..f7de61c80 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-compress-bzip2.php @@ -0,0 +1,118 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + +*/ + +if (!function_exists('bzcompress')) { + trigger_error('bzip2 functions are not available', E_USER_ERROR); + return 0; +} + +/* +*/ +class ADODB_Compress_Bzip2 { + /** + */ + var $_block_size = null; + + /** + */ + var $_work_level = null; + + /** + */ + var $_min_length = 1; + + /** + */ + function getBlockSize() { + return $this->_block_size; + } + + /** + */ + function setBlockSize($block_size) { + assert('$block_size >= 1'); + assert('$block_size <= 9'); + $this->_block_size = (int) $block_size; + } + + /** + */ + function getWorkLevel() { + return $this->_work_level; + } + + /** + */ + function setWorkLevel($work_level) { + assert('$work_level >= 0'); + assert('$work_level <= 250'); + $this->_work_level = (int) $work_level; + } + + /** + */ + function getMinLength() { + return $this->_min_length; + } + + /** + */ + function setMinLength($min_length) { + assert('$min_length >= 0'); + $this->_min_length = (int) $min_length; + } + + /** + */ + function ADODB_Compress_Bzip2($block_size = null, $work_level = null, $min_length = null) { + if (!is_null($block_size)) { + $this->setBlockSize($block_size); + } + + if (!is_null($work_level)) { + $this->setWorkLevel($work_level); + } + + if (!is_null($min_length)) { + $this->setMinLength($min_length); + } + } + + /** + */ + function write($data, $key) { + if (strlen($data) < $this->_min_length) { + return $data; + } + + if (!is_null($this->_block_size)) { + if (!is_null($this->_work_level)) { + return bzcompress($data, $this->_block_size, $this->_work_level); + } else { + return bzcompress($data, $this->_block_size); + } + } + + return bzcompress($data); + } + + /** + */ + function read($data, $key) { + return $data ? bzdecompress($data) : $data; + } + +} + +return 1; + +?> diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-compress-gzip.php b/pos/is4c-nf/lib/adodb5/session/adodb-compress-gzip.php new file mode 100644 index 000000000..0eb80990b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-compress-gzip.php @@ -0,0 +1,93 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + +*/ + +if (!function_exists('gzcompress')) { + trigger_error('gzip functions are not available', E_USER_ERROR); + return 0; +} + +/* +*/ +class ADODB_Compress_Gzip { + /** + */ + var $_level = null; + + /** + */ + var $_min_length = 1; + + /** + */ + function getLevel() { + return $this->_level; + } + + /** + */ + function setLevel($level) { + assert('$level >= 0'); + assert('$level <= 9'); + $this->_level = (int) $level; + } + + /** + */ + function getMinLength() { + return $this->_min_length; + } + + /** + */ + function setMinLength($min_length) { + assert('$min_length >= 0'); + $this->_min_length = (int) $min_length; + } + + /** + */ + function ADODB_Compress_Gzip($level = null, $min_length = null) { + if (!is_null($level)) { + $this->setLevel($level); + } + + if (!is_null($min_length)) { + $this->setMinLength($min_length); + } + } + + /** + */ + function write($data, $key) { + if (strlen($data) < $this->_min_length) { + return $data; + } + + if (!is_null($this->_level)) { + return gzcompress($data, $this->_level); + } else { + return gzcompress($data); + } + } + + /** + */ + function read($data, $key) { + return $data ? gzuncompress($data) : $data; + } + +} + +return 1; + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-cryptsession.php b/pos/is4c-nf/lib/adodb5/session/adodb-cryptsession.php new file mode 100644 index 000000000..13fe77bc3 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-cryptsession.php @@ -0,0 +1,27 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. +*/ + +/* + +This file is provided for backwards compatibility purposes + +*/ + +if (!defined('ADODB_SESSION')) { + require_once dirname(__FILE__) . '/adodb-session.php'; +} + +require_once ADODB_SESSION . '/adodb-encrypt-md5.php'; + +ADODB_Session::filter(new ADODB_Encrypt_MD5()); + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-cryptsession2.php b/pos/is4c-nf/lib/adodb5/session/adodb-cryptsession2.php new file mode 100644 index 000000000..d53f5a1a9 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-cryptsession2.php @@ -0,0 +1,27 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. +*/ + +/* + +This file is provided for backwards compatibility purposes + +*/ + +if (!defined('ADODB_SESSION')) { + require_once dirname(__FILE__) . '/adodb-session2.php'; +} + +require_once ADODB_SESSION . '/adodb-encrypt-md5.php'; + +ADODB_Session::filter(new ADODB_Encrypt_MD5()); + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-mcrypt.php b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-mcrypt.php new file mode 100644 index 000000000..8ffdb6249 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-mcrypt.php @@ -0,0 +1,109 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + +*/ + +if (!function_exists('mcrypt_encrypt')) { + trigger_error('Mcrypt functions are not available', E_USER_ERROR); + return 0; +} + +/** + */ +class ADODB_Encrypt_MCrypt { + /** + */ + var $_cipher; + + /** + */ + var $_mode; + + /** + */ + var $_source; + + /** + */ + function getCipher() { + return $this->_cipher; + } + + /** + */ + function setCipher($cipher) { + $this->_cipher = $cipher; + } + + /** + */ + function getMode() { + return $this->_mode; + } + + /** + */ + function setMode($mode) { + $this->_mode = $mode; + } + + /** + */ + function getSource() { + return $this->_source; + } + + /** + */ + function setSource($source) { + $this->_source = $source; + } + + /** + */ + function ADODB_Encrypt_MCrypt($cipher = null, $mode = null, $source = null) { + if (!$cipher) { + $cipher = MCRYPT_RIJNDAEL_256; + } + if (!$mode) { + $mode = MCRYPT_MODE_ECB; + } + if (!$source) { + $source = MCRYPT_RAND; + } + + $this->_cipher = $cipher; + $this->_mode = $mode; + $this->_source = $source; + } + + /** + */ + function write($data, $key) { + $iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode); + $iv = mcrypt_create_iv($iv_size, $this->_source); + return mcrypt_encrypt($this->_cipher, $key, $data, $this->_mode, $iv); + } + + /** + */ + function read($data, $key) { + $iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode); + $iv = mcrypt_create_iv($iv_size, $this->_source); + $rv = mcrypt_decrypt($this->_cipher, $key, $data, $this->_mode, $iv); + return rtrim($rv, "\0"); + } + +} + +return 1; + +?> diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-md5.php b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-md5.php new file mode 100644 index 000000000..24b8e18de --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-md5.php @@ -0,0 +1,39 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + +*/ + +// security - hide paths +if (!defined('ADODB_SESSION')) die(); + +include_once ADODB_SESSION . '/crypt.inc.php'; + +/** + */ +class ADODB_Encrypt_MD5 { + /** + */ + function write($data, $key) { + $md5crypt = new MD5Crypt(); + return $md5crypt->encrypt($data, $key); + } + + /** + */ + function read($data, $key) { + $md5crypt = new MD5Crypt(); + return $md5crypt->decrypt($data, $key); + } + +} + +return 1; + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-secret.php b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-secret.php new file mode 100644 index 000000000..ed185a8b3 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-secret.php @@ -0,0 +1,48 @@ +<?php + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + +*/ + +@define('HORDE_BASE', dirname(dirname(dirname(__FILE__))) . '/horde'); + +if (!is_dir(HORDE_BASE)) { + trigger_error(sprintf('Directory not found: \'%s\'', HORDE_BASE), E_USER_ERROR); + return 0; +} + +include_once HORDE_BASE . '/lib/Horde.php'; +include_once HORDE_BASE . '/lib/Secret.php'; + +/** + +NOTE: On Windows 2000 SP4 with PHP 4.3.1, MCrypt 2.4.x, and Apache 1.3.28, +the session didn't work properly. + +This may be resolved with 4.3.3. + + */ +class ADODB_Encrypt_Secret { + /** + */ + function write($data, $key) { + return Secret::write($key, $data); + } + + /** + */ + function read($data, $key) { + return Secret::read($key, $data); + } + +} + +return 1; + +?> diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-sha1.php b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-sha1.php new file mode 100644 index 000000000..16f603e33 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-encrypt-sha1.php @@ -0,0 +1,32 @@ +<?php +if (!defined('ADODB_SESSION')) die(); + +include_once ADODB_SESSION . '/crypt.inc.php'; + + +/** + + */ + +class ADODB_Encrypt_SHA1 { + + function write($data, $key) + { + $sha1crypt = new SHA1Crypt(); + return $sha1crypt->encrypt($data, $key); + + } + + + function read($data, $key) + { + $sha1crypt = new SHA1Crypt(); + return $sha1crypt->decrypt($data, $key); + + } +} + + + +return 1; +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-sess.txt b/pos/is4c-nf/lib/adodb5/session/adodb-sess.txt new file mode 100644 index 000000000..d23dac42d --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-sess.txt @@ -0,0 +1,131 @@ +John, + +I have been an extremely satisfied ADODB user for several years now. + +To give you something back for all your hard work, I've spent the last 3 +days rewriting the adodb-session.php code. + +---------- +What's New +---------- + +Here's a list of the new code's benefits: + +* Combines the functionality of the three files: + +adodb-session.php +adodb-session-clob.php +adodb-cryptsession.php + +each with very similar functionality, into a single file adodb-session.php. +This will ease maintenance and support issues. + +* Supports multiple encryption and compression schemes. + Currently, we support: + + MD5Crypt (crypt.inc.php) + MCrypt + Secure (Horde's emulation of MCrypt, if MCrypt module is not available.) + GZip + BZip2 + +These can be stacked, so if you want to compress and then encrypt your +session data, it's easy. +Also, the built-in MCrypt functions will be *much* faster, and more secure, +than the MD5Crypt code. + +* adodb-session.php contains a single class ADODB_Session that encapsulates +all functionality. + This eliminates the use of global vars and defines (though they are +supported for backwards compatibility). + +* All user defined parameters are now static functions in the ADODB_Session +class. + +New parameters include: + +* encryptionKey(): Define the encryption key used to encrypt the session. +Originally, it was a hard coded string. + +* persist(): Define if the database will be opened in persistent mode. +Originally, the user had to call adodb_sess_open(). + +* dataFieldName(): Define the field name used to store the session data, as +'DATA' appears to be a reserved word in the following cases: + ANSI SQL + IBM DB2 + MS SQL Server + Postgres + SAP + +* filter(): Used to support multiple, simulataneous encryption/compression +schemes. + +* Debug support is improved thru _rsdump() function, which is called after +every database call. + +------------ +What's Fixed +------------ + +The new code includes several bug fixes and enhancements: + +* sesskey is compared in BINARY mode for MySQL, to avoid problems with +session keys that differ only by case. + Of course, the user should define the sesskey field as BINARY, to +correctly fix this problem, otherwise performance will suffer. + +* In ADODB_Session::gc(), if $expire_notify is true, the multiple DELETES in +the original code have been optimized to a single DELETE. + +* In ADODB_Session::destroy(), since "SELECT expireref, sesskey FROM $table +WHERE sesskey = $qkey" will only return a single value, we don't loop on the +result, we simply process the row, if any. + +* We close $rs after every use. + +--------------- +What's the Same +--------------- + +I know backwards compatibility is *very* important to you. Therefore, the +new code is 100% backwards compatible. + +If you like my code, but don't "trust" it's backwards compatible, maybe we +offer it as beta code, in a new directory for a release or two? + +------------ +What's To Do +------------ + +I've vascillated over whether to use a single function to get/set +parameters: + +$user = ADODB_Session::user(); // get +ADODB_Session::user($user); // set + +or to use separate functions (which is the PEAR/Java way): + +$user = ADODB_Session::getUser(); +ADODB_Session::setUser($user); + +I've chosen the former as it's makes for a simpler API, and reduces the +amount of code, but I'd be happy to change it to the latter. + +Also, do you think the class should be a singleton class, versus a static +class? + +Let me know if you find this code useful, and will be including it in the +next release of ADODB. + +If so, I will modify the current documentation to detail the new +functionality. To that end, what file(s) contain the documentation? Please +send them to me if they are not publically available. + +Also, if there is *anything* in the code that you like to see changed, let +me know. + +Thanks, + +Ross + diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-session-clob.php b/pos/is4c-nf/lib/adodb5/session/adodb-session-clob.php new file mode 100644 index 000000000..664a39afe --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-session-clob.php @@ -0,0 +1,24 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. +*/ + +/* + +This file is provided for backwards compatibility purposes + +*/ + +if (!defined('ADODB_SESSION')) { + require_once dirname(__FILE__) . '/adodb-session.php'; +} +ADODB_Session::clob('CLOB'); + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-session-clob2.php b/pos/is4c-nf/lib/adodb5/session/adodb-session-clob2.php new file mode 100644 index 000000000..7e8eb6cb5 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-session-clob2.php @@ -0,0 +1,24 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. +*/ + +/* + +This file is provided for backwards compatibility purposes + +*/ + +if (!defined('ADODB_SESSION')) { + require_once dirname(__FILE__) . '/adodb-session2.php'; +} +ADODB_Session::clob('CLOB'); + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-session.php b/pos/is4c-nf/lib/adodb5/session/adodb-session.php new file mode 100644 index 000000000..49e35bf73 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-session.php @@ -0,0 +1,934 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. +*/ + +/* + You may want to rename the 'data' field to 'session_data' as + 'data' appears to be a reserved word for one or more of the following: + ANSI SQL + IBM DB2 + MS SQL Server + Postgres + SAP + + If you do, then execute: + + ADODB_Session::dataFieldName('session_data'); + +*/ + +if (!defined('_ADODB_LAYER')) { + require realpath(dirname(__FILE__) . '/../adodb.inc.php'); +} + +if (defined('ADODB_SESSION')) return 1; + +define('ADODB_SESSION', dirname(__FILE__)); + + +/* + Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821 + + From Kerr Schere, to unserialize session data stored via ADOdb. + 1. Pull the session data from the db and loop through it. + 2. Inside the loop, you will need to urldecode the data column. + 3. After urldecode, run the serialized string through this function: + +*/ +function adodb_unserialize( $serialized_string ) +{ + $variables = array( ); + $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); + for( $i = 0; $i < count( $a ); $i = $i+2 ) { + $variables[$a[$i]] = unserialize( $a[$i+1] ); + } + return( $variables ); +} + +/* + Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1 + Since adodb 4.61. +*/ +function adodb_session_regenerate_id() +{ + $conn = ADODB_Session::_conn(); + if (!$conn) return false; + + $old_id = session_id(); + if (function_exists('session_regenerate_id')) { + session_regenerate_id(); + } else { + session_id(md5(uniqid(rand(), true))); + $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + //@session_start(); + } + $new_id = session_id(); + $ok = $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id)); + + /* it is possible that the update statement fails due to a collision */ + if (!$ok) { + session_id($old_id); + if (empty($ck)) $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + return false; + } + + return true; +} + +/* + Generate database table for session data + @see http://phplens.com/lens/lensforum/msgs.php?id=12280 + @return 0 if failure, 1 if errors, 2 if successful. + @author Markus Staab http://www.public-4u.de +*/ +function adodb_session_create_table($schemaFile=null,$conn = null) +{ + // set default values + if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema.xml'; + if ($conn===null) $conn = ADODB_Session::_conn(); + + if (!$conn) return 0; + + $schema = new adoSchema($conn); + $schema->ParseSchema($schemaFile); + return $schema->ExecuteSchema(); +} + +/*! + \static +*/ +class ADODB_Session { + ///////////////////// + // getter/setter methods + ///////////////////// + + /* + + function Lock($lock=null) + { + static $_lock = false; + + if (!is_null($lock)) $_lock = $lock; + return $lock; + } + */ + /*! + */ + function driver($driver = null) { + static $_driver = 'mysql'; + static $set = false; + + if (!is_null($driver)) { + $_driver = trim($driver); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) { + return $GLOBALS['ADODB_SESSION_DRIVER']; + } + } + + return $_driver; + } + + /*! + */ + function host($host = null) { + static $_host = 'localhost'; + static $set = false; + + if (!is_null($host)) { + $_host = trim($host); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) { + return $GLOBALS['ADODB_SESSION_CONNECT']; + } + } + + return $_host; + } + + /*! + */ + function user($user = null) { + static $_user = 'root'; + static $set = false; + + if (!is_null($user)) { + $_user = trim($user); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USER'])) { + return $GLOBALS['ADODB_SESSION_USER']; + } + } + + return $_user; + } + + /*! + */ + function password($password = null) { + static $_password = ''; + static $set = false; + + if (!is_null($password)) { + $_password = $password; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_PWD'])) { + return $GLOBALS['ADODB_SESSION_PWD']; + } + } + + return $_password; + } + + /*! + */ + function database($database = null) { + static $_database = 'xphplens_2'; + static $set = false; + + if (!is_null($database)) { + $_database = trim($database); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_DB'])) { + return $GLOBALS['ADODB_SESSION_DB']; + } + } + + return $_database; + } + + /*! + */ + function persist($persist = null) + { + static $_persist = true; + + if (!is_null($persist)) { + $_persist = trim($persist); + } + + return $_persist; + } + + /*! + */ + function lifetime($lifetime = null) { + static $_lifetime; + static $set = false; + + if (!is_null($lifetime)) { + $_lifetime = (int) $lifetime; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_LIFE'])) { + return $GLOBALS['ADODB_SESS_LIFE']; + } + } + if (!$_lifetime) { + $_lifetime = ini_get('session.gc_maxlifetime'); + if ($_lifetime <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>"; + $_lifetime = 1440; + } + } + + return $_lifetime; + } + + /*! + */ + function debug($debug = null) { + static $_debug = false; + static $set = false; + + if (!is_null($debug)) { + $_debug = (bool) $debug; + + $conn = ADODB_Session::_conn(); + if ($conn) { + $conn->debug = $_debug; + } + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_DEBUG'])) { + return $GLOBALS['ADODB_SESS_DEBUG']; + } + } + + return $_debug; + } + + /*! + */ + function expireNotify($expire_notify = null) { + static $_expire_notify; + static $set = false; + + if (!is_null($expire_notify)) { + $_expire_notify = $expire_notify; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) { + return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY']; + } + } + + return $_expire_notify; + } + + /*! + */ + function table($table = null) { + static $_table = 'sessions'; + static $set = false; + + if (!is_null($table)) { + $_table = trim($table); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_TBL'])) { + return $GLOBALS['ADODB_SESSION_TBL']; + } + } + + return $_table; + } + + /*! + */ + function optimize($optimize = null) { + static $_optimize = false; + static $set = false; + + if (!is_null($optimize)) { + $_optimize = (bool) $optimize; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (defined('ADODB_SESSION_OPTIMIZE')) { + return true; + } + } + + return $_optimize; + } + + /*! + */ + function syncSeconds($sync_seconds = null) { + static $_sync_seconds = 60; + static $set = false; + + if (!is_null($sync_seconds)) { + $_sync_seconds = (int) $sync_seconds; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (defined('ADODB_SESSION_SYNCH_SECS')) { + return ADODB_SESSION_SYNCH_SECS; + } + } + + return $_sync_seconds; + } + + /*! + */ + function clob($clob = null) { + static $_clob = false; + static $set = false; + + if (!is_null($clob)) { + $_clob = strtolower(trim($clob)); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) { + return $GLOBALS['ADODB_SESSION_USE_LOBS']; + } + } + + return $_clob; + } + + /*! + */ + function dataFieldName($data_field_name = null) { + static $_data_field_name = 'data'; + + if (!is_null($data_field_name)) { + $_data_field_name = trim($data_field_name); + } + + return $_data_field_name; + } + + /*! + */ + function filter($filter = null) { + static $_filter = array(); + + if (!is_null($filter)) { + if (!is_array($filter)) { + $filter = array($filter); + } + $_filter = $filter; + } + + return $_filter; + } + + /*! + */ + function encryptionKey($encryption_key = null) { + static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!'; + + if (!is_null($encryption_key)) { + $_encryption_key = $encryption_key; + } + + return $_encryption_key; + } + + ///////////////////// + // private methods + ///////////////////// + + /*! + */ + function _conn($conn=null) { + return $GLOBALS['ADODB_SESS_CONN']; + } + + /*! + */ + function _crc($crc = null) { + static $_crc = false; + + if (!is_null($crc)) { + $_crc = $crc; + } + + return $_crc; + } + + /*! + */ + function _init() { + session_module_name('user'); + session_set_save_handler( + array('ADODB_Session', 'open'), + array('ADODB_Session', 'close'), + array('ADODB_Session', 'read'), + array('ADODB_Session', 'write'), + array('ADODB_Session', 'destroy'), + array('ADODB_Session', 'gc') + ); + } + + + /*! + */ + function _sessionKey() { + // use this function to create the encryption key for crypted sessions + // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt + return crypt(ADODB_Session::encryptionKey(), session_id()); + } + + /*! + */ + function _dumprs($rs) { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + + if (!$conn) { + return; + } + + if (!$debug) { + return; + } + + if (!$rs) { + echo "<br />\$rs is null or false<br />\n"; + return; + } + + //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n"; + + if (!is_object($rs)) { + return; + } + + require_once ADODB_SESSION.'/../tohtml.inc.php'; + rs2html($rs); + } + + ///////////////////// + // public methods + ///////////////////// + + function config($driver, $host, $user, $password, $database=false,$options=false) + { + ADODB_Session::driver($driver); + ADODB_Session::host($host); + ADODB_Session::user($user); + ADODB_Session::password($password); + ADODB_Session::database($database); + + if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB'; + + if (isset($options['table'])) ADODB_Session::table($options['table']); + if (isset($options['lob'])) ADODB_Session::clob($options['lob']); + if (isset($options['debug'])) ADODB_Session::debug($options['debug']); + } + + /*! + Create the connection to the database. + + If $conn already exists, reuse that connection + */ + function open($save_path, $session_name, $persist = null) + { + $conn = ADODB_Session::_conn(); + + if ($conn) { + return true; + } + + $database = ADODB_Session::database(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $host = ADODB_Session::host(); + $password = ADODB_Session::password(); + $user = ADODB_Session::user(); + + if (!is_null($persist)) { + ADODB_Session::persist($persist); + } else { + $persist = ADODB_Session::persist(); + } + +# these can all be defaulted to in php.ini +# assert('$database'); +# assert('$driver'); +# assert('$host'); + + $conn = ADONewConnection($driver); + + if ($debug) { + $conn->debug = true; +// ADOConnection::outp( " driver=$driver user=$user pwd=$password db=$database "); + } + + if ($persist) { + switch($persist) { + default: + case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break; + case 'C': $ok = $conn->Connect($host, $user, $password, $database); break; + case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break; + } + } else { + $ok = $conn->Connect($host, $user, $password, $database); + } + + if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn; + else + ADOConnection::outp('<p>Session: connection failed</p>', false); + + + return $ok; + } + + /*! + Close the connection + */ + function close() + { +/* + $conn = ADODB_Session::_conn(); + if ($conn) $conn->Close(); +*/ + return true; + } + + /* + Slurp in the session variables and return the serialized string + */ + function read($key) + { + $conn = ADODB_Session::_conn(); + $data = ADODB_Session::dataFieldName(); + $filter = ADODB_Session::filter(); + $table = ADODB_Session::table(); + + if (!$conn) { + return ''; + } + + //assert('$table'); + + $qkey = $conn->quote($key); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + $sql = "SELECT $data FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . time(); + /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if + developer has commited elsewhere... :( + */ + #if (ADODB_Session::Lock()) + # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), $data); + #else + + $rs = $conn->Execute($sql); + //ADODB_Session::_dumprs($rs); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else { + $v = reset($rs->fields); + $filter = array_reverse($filter); + foreach ($filter as $f) { + if (is_object($f)) { + $v = $f->read($v, ADODB_Session::_sessionKey()); + } + } + $v = rawurldecode($v); + } + + $rs->Close(); + + ADODB_Session::_crc(strlen($v) . crc32($v)); + return $v; + } + + return ''; + } + + /*! + Write the serialized data to a database. + + If the data has not been modified since the last read(), we do not write. + */ + function write($key, $val) + { + global $ADODB_SESSION_READONLY; + + if (!empty($ADODB_SESSION_READONLY)) return; + + $clob = ADODB_Session::clob(); + $conn = ADODB_Session::_conn(); + $crc = ADODB_Session::_crc(); + $data = ADODB_Session::dataFieldName(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $expire_notify = ADODB_Session::expireNotify(); + $filter = ADODB_Session::filter(); + $lifetime = ADODB_Session::lifetime(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + $qkey = $conn->qstr($key); + + //assert('$table'); + + $expiry = time() + $lifetime; + + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($crc !== false && $crc == (strlen($val) . crc32($val))) { + if ($debug) { + ADOConnection::outp( '<p>Session: Only updating date - crc32 not changed</p>'); + } + + $expirevar = ''; + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $expirevar = $$var; + } + } + + + $sql = "UPDATE $table SET expiry = ".$conn->Param('0').",expireref=".$conn->Param('1')." WHERE $binary sesskey = ".$conn->Param('2')." AND expiry >= ".$conn->Param('3'); + $rs = $conn->Execute($sql,array($expiry,$expirevar,$key,time())); + return true; + } + $val = rawurlencode($val); + foreach ($filter as $f) { + if (is_object($f)) { + $val = $f->write($val, ADODB_Session::_sessionKey()); + } + } + + $arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => ''); + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $arr['expireref'] = $$var; + } + } + + if (!$clob) { // no lobs, simply use replace() + $arr[$data] = $val; + $rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true); + + } else { + // what value shall we insert/update for lob row? + switch ($driver) { + // empty_clob or empty_lob for oracle dbs + case 'oracle': + case 'oci8': + case 'oci8po': + case 'oci805': + $lob_value = sprintf('empty_%s()', strtolower($clob)); + break; + + // null for all other + default: + $lob_value = 'null'; + break; + } + + $conn->StartTrans(); + $expiryref = $conn->qstr($arr['expireref']); + // do we insert or update? => as for sesskey + $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey"); + if ($rs && reset($rs->fields) > 0) { + $sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value, expireref=$expiryref WHERE sesskey = $qkey"; + } else { + $sql = "INSERT INTO $table (expiry, $data, sesskey,expireref) VALUES ($expiry, $lob_value, $qkey,$expiryref)"; + } + if ($rs)$rs->Close(); + + + $err = ''; + $rs1 = $conn->Execute($sql); + if (!$rs1) $err = $conn->ErrorMsg()."\n"; + + $rs2 = $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob)); + if (!$rs2) $err .= $conn->ErrorMsg()."\n"; + + $rs = ($rs && $rs2) ? true : false; + $conn->CompleteTrans(); + } + + if (!$rs) { + ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false); + return false; + } else { + // bug in access driver (could be odbc?) means that info is not committed + // properly unless select statement executed in Win2000 + if ($conn->databaseType == 'access') { + $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + if ($rs) { + $rs->Close(); + } + } + }/* + if (ADODB_Session::Lock()) { + $conn->CommitTrans(); + }*/ + return $rs ? true : false; + } + + /*! + */ + function destroy($key) { + $conn = ADODB_Session::_conn(); + $table = ADODB_Session::table(); + $expire_notify = ADODB_Session::expireNotify(); + + if (!$conn) { + return false; + } + + //assert('$table'); + + $qkey = $conn->quote($key); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + $conn->SetFetchMode($savem); + if (!$rs) { + return false; + } + if (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + //assert('$ref'); + //assert('$key'); + $fn($ref, $key); + } + $rs->Close(); + } + + $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + + return $rs ? true : false; + } + + /*! + */ + function gc($maxlifetime) + { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + $expire_notify = ADODB_Session::expireNotify(); + $optimize = ADODB_Session::optimize(); + $sync_seconds = ADODB_Session::syncSeconds(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + + + $time = time(); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + $conn->SetFetchMode($savem); + if ($rs) { + $conn->StartTrans(); + $keys = array(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref, $key); + $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key)); + $rs->MoveNext(); + } + $rs->Close(); + + $conn->CompleteTrans(); + } + } else { + + if (1) { + $sql = "SELECT sesskey FROM $table WHERE expiry < $time"; + $arr = $conn->GetAll($sql); + foreach ($arr as $row) { + $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0'); + $conn->Execute($sql2,array(reset($row))); + } + } else { + $sql = "DELETE FROM $table WHERE expiry < $time"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + if ($rs) $rs->Close(); + } + if ($debug) { + ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>"); + } + } + + // suggested by Cameron, "GaM3R" <gamr@outworld.cx> + if ($optimize) { + $driver = ADODB_Session::driver(); + + if (preg_match('/mysql/i', $driver)) { + $sql = "OPTIMIZE TABLE $table"; + } + if (preg_match('/postgres/i', $driver)) { + $sql = "VACUUM $table"; + } + if (!empty($sql)) { + $conn->Execute($sql); + } + } + + if ($sync_seconds) { + $sql = 'SELECT '; + if ($conn->dataProvider === 'oci8') { + $sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')"; + } else { + $sql .= $conn->sysTimeStamp; + } + $sql .= " FROM $table"; + + $rs = $conn->SelectLimit($sql, 1); + if ($rs && !$rs->EOF) { + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $conn->UnixTimeStamp($dbts); + $t = time(); + + if (abs($dbt - $t) >= $sync_seconds) { + $msg = __FILE__ . + ": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " . + " database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 60) . ' minutes)'; + error_log($msg); + if ($debug) { + ADOConnection::outp("<p>$msg</p>"); + } + } + } + } + + return true; + } +} + +ADODB_Session::_init(); +if (empty($ADODB_SESSION_READONLY)) + register_shutdown_function('session_write_close'); + +// for backwards compatability only +function adodb_sess_open($save_path, $session_name, $persist = true) { + return ADODB_Session::open($save_path, $session_name, $persist); +} + +// for backwards compatability only +function adodb_sess_gc($t) +{ + return ADODB_Session::gc($t); +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-session2.php b/pos/is4c-nf/lib/adodb5/session/adodb-session2.php new file mode 100644 index 000000000..7a8abe8d6 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-session2.php @@ -0,0 +1,945 @@ +<?php + + +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Contributed by Ross Smith (adodb@netebb.com). + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + +*/ + +/* + +CREATE Table SCripts + +Oracle +====== + +CREATE TABLE SESSIONS2 +( + SESSKEY VARCHAR2(48 BYTE) NOT NULL, + EXPIRY DATE NOT NULL, + EXPIREREF VARCHAR2(200 BYTE), + CREATED DATE NOT NULL, + MODIFIED DATE NOT NULL, + SESSDATA CLOB, + PRIMARY KEY(SESSKEY) +); + + +CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY); +CREATE UNIQUE INDEX SESS2_PK ON SESSIONS2(SESSKEY); +CREATE INDEX SESS2_EXP_REF ON SESSIONS2(EXPIREREF); + + + + MySQL + ===== + +CREATE TABLE sessions2( + sesskey VARCHAR( 64 ) NOT NULL DEFAULT '', + expiry TIMESTAMP NOT NULL , + expireref VARCHAR( 250 ) DEFAULT '', + created TIMESTAMP NOT NULL , + modified TIMESTAMP NOT NULL , + sessdata LONGTEXT DEFAULT '', + PRIMARY KEY ( sesskey ) , + INDEX sess2_expiry( expiry ), + INDEX sess2_expireref( expireref ) +) + + +*/ + +if (!defined('_ADODB_LAYER')) { + require realpath(dirname(__FILE__) . '/../adodb.inc.php'); +} + +if (defined('ADODB_SESSION')) return 1; + +define('ADODB_SESSION', dirname(__FILE__)); +define('ADODB_SESSION2', ADODB_SESSION); + +/* + Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821 + + From Kerr Schere, to unserialize session data stored via ADOdb. + 1. Pull the session data from the db and loop through it. + 2. Inside the loop, you will need to urldecode the data column. + 3. After urldecode, run the serialized string through this function: + +*/ +function adodb_unserialize( $serialized_string ) +{ + $variables = array( ); + $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); + for( $i = 0; $i < count( $a ); $i = $i+2 ) { + $variables[$a[$i]] = unserialize( $a[$i+1] ); + } + return( $variables ); +} + +/* + Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1 + Since adodb 4.61. +*/ +function adodb_session_regenerate_id() +{ + $conn = ADODB_Session::_conn(); + if (!$conn) return false; + + $old_id = session_id(); + if (function_exists('session_regenerate_id')) { + session_regenerate_id(); + } else { + session_id(md5(uniqid(rand(), true))); + $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + //@session_start(); + } + $new_id = session_id(); + $ok = $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id)); + + /* it is possible that the update statement fails due to a collision */ + if (!$ok) { + session_id($old_id); + if (empty($ck)) $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + return false; + } + + return true; +} + +/* + Generate database table for session data + @see http://phplens.com/lens/lensforum/msgs.php?id=12280 + @return 0 if failure, 1 if errors, 2 if successful. + @author Markus Staab http://www.public-4u.de +*/ +function adodb_session_create_table($schemaFile=null,$conn = null) +{ + // set default values + if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml'; + if ($conn===null) $conn = ADODB_Session::_conn(); + + if (!$conn) return 0; + + $schema = new adoSchema($conn); + $schema->ParseSchema($schemaFile); + return $schema->ExecuteSchema(); +} + +/*! + \static +*/ +class ADODB_Session { + ///////////////////// + // getter/setter methods + ///////////////////// + + /* + + function Lock($lock=null) + { + static $_lock = false; + + if (!is_null($lock)) $_lock = $lock; + return $lock; + } + */ + /*! + */ + static function driver($driver = null) + { + static $_driver = 'mysql'; + static $set = false; + + if (!is_null($driver)) { + $_driver = trim($driver); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) { + return $GLOBALS['ADODB_SESSION_DRIVER']; + } + } + + return $_driver; + } + + /*! + */ + static function host($host = null) { + static $_host = 'localhost'; + static $set = false; + + if (!is_null($host)) { + $_host = trim($host); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) { + return $GLOBALS['ADODB_SESSION_CONNECT']; + } + } + + return $_host; + } + + /*! + */ + static function user($user = null) + { + static $_user = 'root'; + static $set = false; + + if (!is_null($user)) { + $_user = trim($user); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USER'])) { + return $GLOBALS['ADODB_SESSION_USER']; + } + } + + return $_user; + } + + /*! + */ + static function password($password = null) + { + static $_password = ''; + static $set = false; + + if (!is_null($password)) { + $_password = $password; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_PWD'])) { + return $GLOBALS['ADODB_SESSION_PWD']; + } + } + + return $_password; + } + + /*! + */ + static function database($database = null) + { + static $_database = ''; + static $set = false; + + if (!is_null($database)) { + $_database = trim($database); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_DB'])) { + return $GLOBALS['ADODB_SESSION_DB']; + } + } + return $_database; + } + + /*! + */ + static function persist($persist = null) + { + static $_persist = true; + + if (!is_null($persist)) { + $_persist = trim($persist); + } + + return $_persist; + } + + /*! + */ + static function lifetime($lifetime = null) + { + static $_lifetime; + static $set = false; + + if (!is_null($lifetime)) { + $_lifetime = (int) $lifetime; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_LIFE'])) { + return $GLOBALS['ADODB_SESS_LIFE']; + } + } + if (!$_lifetime) { + $_lifetime = ini_get('session.gc_maxlifetime'); + if ($_lifetime <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>"; + $_lifetime = 1440; + } + } + + return $_lifetime; + } + + /*! + */ + static function debug($debug = null) + { + static $_debug = false; + static $set = false; + + if (!is_null($debug)) { + $_debug = (bool) $debug; + + $conn = ADODB_Session::_conn(); + if ($conn) { + #$conn->debug = $_debug; + } + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESS_DEBUG'])) { + return $GLOBALS['ADODB_SESS_DEBUG']; + } + } + + return $_debug; + } + + /*! + */ + static function expireNotify($expire_notify = null) + { + static $_expire_notify; + static $set = false; + + if (!is_null($expire_notify)) { + $_expire_notify = $expire_notify; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) { + return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY']; + } + } + + return $_expire_notify; + } + + /*! + */ + static function table($table = null) + { + static $_table = 'sessions2'; + static $set = false; + + if (!is_null($table)) { + $_table = trim($table); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_TBL'])) { + return $GLOBALS['ADODB_SESSION_TBL']; + } + } + + return $_table; + } + + /*! + */ + static function optimize($optimize = null) + { + static $_optimize = false; + static $set = false; + + if (!is_null($optimize)) { + $_optimize = (bool) $optimize; + $set = true; + } elseif (!$set) { + // backwards compatibility + if (defined('ADODB_SESSION_OPTIMIZE')) { + return true; + } + } + + return $_optimize; + } + + /*! + */ + static function syncSeconds($sync_seconds = null) { + //echo ("<p>WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code</p>"); + + return 0; + } + + /*! + */ + static function clob($clob = null) { + static $_clob = false; + static $set = false; + + if (!is_null($clob)) { + $_clob = strtolower(trim($clob)); + $set = true; + } elseif (!$set) { + // backwards compatibility + if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) { + return $GLOBALS['ADODB_SESSION_USE_LOBS']; + } + } + + return $_clob; + } + + /*! + */ + static function dataFieldName($data_field_name = null) { + //echo ("<p>WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code</p>"); + return ''; + } + + /*! + */ + static function filter($filter = null) { + static $_filter = array(); + + if (!is_null($filter)) { + if (!is_array($filter)) { + $filter = array($filter); + } + $_filter = $filter; + } + + return $_filter; + } + + /*! + */ + static function encryptionKey($encryption_key = null) { + static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!'; + + if (!is_null($encryption_key)) { + $_encryption_key = $encryption_key; + } + + return $_encryption_key; + } + + ///////////////////// + // private methods + ///////////////////// + + /*! + */ + static function _conn($conn=null) { + return isset($GLOBALS['ADODB_SESS_CONN']) ? $GLOBALS['ADODB_SESS_CONN'] : false; + } + + /*! + */ + static function _crc($crc = null) { + static $_crc = false; + + if (!is_null($crc)) { + $_crc = $crc; + } + + return $_crc; + } + + /*! + */ + static function _init() { + session_module_name('user'); + session_set_save_handler( + array('ADODB_Session', 'open'), + array('ADODB_Session', 'close'), + array('ADODB_Session', 'read'), + array('ADODB_Session', 'write'), + array('ADODB_Session', 'destroy'), + array('ADODB_Session', 'gc') + ); + } + + + /*! + */ + static function _sessionKey() { + // use this function to create the encryption key for crypted sessions + // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt + return crypt(ADODB_Session::encryptionKey(), session_id()); + } + + /*! + */ + static function _dumprs(&$rs) { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + + if (!$conn) { + return; + } + + if (!$debug) { + return; + } + + if (!$rs) { + echo "<br />\$rs is null or false<br />\n"; + return; + } + + //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n"; + + if (!is_object($rs)) { + return; + } + $rs = $conn->_rs2rs($rs); + + require_once ADODB_SESSION.'/../tohtml.inc.php'; + rs2html($rs); + $rs->MoveFirst(); + } + + ///////////////////// + // public methods + ///////////////////// + + static function config($driver, $host, $user, $password, $database=false,$options=false) + { + ADODB_Session::driver($driver); + ADODB_Session::host($host); + ADODB_Session::user($user); + ADODB_Session::password($password); + ADODB_Session::database($database); + + if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB'; + + if (isset($options['table'])) ADODB_Session::table($options['table']); + if (isset($options['lob'])) ADODB_Session::clob($options['lob']); + if (isset($options['debug'])) ADODB_Session::debug($options['debug']); + } + + /*! + Create the connection to the database. + + If $conn already exists, reuse that connection + */ + static function open($save_path, $session_name, $persist = null) + { + $conn = ADODB_Session::_conn(); + + if ($conn) { + return true; + } + + $database = ADODB_Session::database(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $host = ADODB_Session::host(); + $password = ADODB_Session::password(); + $user = ADODB_Session::user(); + + if (!is_null($persist)) { + ADODB_Session::persist($persist); + } else { + $persist = ADODB_Session::persist(); + } + +# these can all be defaulted to in php.ini +# assert('$database'); +# assert('$driver'); +# assert('$host'); + + $conn = ADONewConnection($driver); + + if ($debug) { + $conn->debug = true; + ADOConnection::outp( " driver=$driver user=$user db=$database "); + } + + if ($persist) { + switch($persist) { + default: + case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break; + case 'C': $ok = $conn->Connect($host, $user, $password, $database); break; + case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break; + } + } else { + $ok = $conn->Connect($host, $user, $password, $database); + } + + if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn; + else + ADOConnection::outp('<p>Session: connection failed</p>', false); + + + return $ok; + } + + /*! + Close the connection + */ + static function close() + { +/* + $conn = ADODB_Session::_conn(); + if ($conn) $conn->Close(); +*/ + return true; + } + + /* + Slurp in the session variables and return the serialized string + */ + static function read($key) + { + $conn = ADODB_Session::_conn(); + $filter = ADODB_Session::filter(); + $table = ADODB_Session::table(); + + if (!$conn) { + return ''; + } + + //assert('$table'); + + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary ".$conn->Param(0)." AND expiry >= " . $conn->sysTimeStamp; + /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if + developer has commited elsewhere... :( + */ + #if (ADODB_Session::Lock()) + # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata); + #else + $rs = $conn->Execute($sql, array($key)); + //ADODB_Session::_dumprs($rs); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else { + $v = reset($rs->fields); + $filter = array_reverse($filter); + foreach ($filter as $f) { + if (is_object($f)) { + $v = $f->read($v, ADODB_Session::_sessionKey()); + } + } + $v = rawurldecode($v); + } + + $rs->Close(); + + ADODB_Session::_crc(strlen($v) . crc32($v)); + return $v; + } + + return ''; + } + + /*! + Write the serialized data to a database. + + If the data has not been modified since the last read(), we do not write. + */ + static function write($key, $oval) + { + global $ADODB_SESSION_READONLY; + + if (!empty($ADODB_SESSION_READONLY)) return; + + $clob = ADODB_Session::clob(); + $conn = ADODB_Session::_conn(); + $crc = ADODB_Session::_crc(); + $debug = ADODB_Session::debug(); + $driver = ADODB_Session::driver(); + $expire_notify = ADODB_Session::expireNotify(); + $filter = ADODB_Session::filter(); + $lifetime = ADODB_Session::lifetime(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + if ($debug) $conn->debug = 1; + $sysTimeStamp = $conn->sysTimeStamp; + + //assert('$table'); + + $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp); + + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($crc !== false && $crc == (strlen($oval) . crc32($oval))) { + if ($debug) { + echo '<p>Session: Only updating date - crc32 not changed</p>'; + } + + $expirevar = ''; + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $expirevar = $$var; + } + } + + + $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp"; + $rs = $conn->Execute($sql,array($expirevar,$key)); + return true; + } + $val = rawurlencode($oval); + foreach ($filter as $f) { + if (is_object($f)) { + $val = $f->write($val, ADODB_Session::_sessionKey()); + } + } + + $expireref = ''; + if ($expire_notify) { + $var = reset($expire_notify); + global $$var; + if (isset($$var)) { + $expireref = $$var; + } + } + + if (!$clob) { // no lobs, simply use replace() + $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key)); + if ($rs) $rs->Close(); + + if ($rs && reset($rs->fields) > 0) { + $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2'); + + } else { + $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) + VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)"; + } + + + $rs = $conn->Execute($sql,array($val,$expireref,$key)); + + } else { + // what value shall we insert/update for lob row? + switch ($driver) { + // empty_clob or empty_lob for oracle dbs + case 'oracle': + case 'oci8': + case 'oci8po': + case 'oci805': + $lob_value = sprintf('empty_%s()', strtolower($clob)); + break; + + // null for all other + default: + $lob_value = 'null'; + break; + } + + $conn->StartTrans(); + + $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key)); + if ($rs) $rs->Close(); + + if ($rs && reset($rs->fields) > 0) { + $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1'); + + } else { + $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) + VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)"; + } + + $rs = $conn->Execute($sql,array($expireref,$key)); + + $qkey = $conn->qstr($key); + $rs2 = $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob)); + if ($debug) echo "<hr>",htmlspecialchars($oval), "<hr>"; + $rs = @$conn->CompleteTrans(); + + + } + + if (!$rs) { + ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false); + return false; + } else { + // bug in access driver (could be odbc?) means that info is not committed + // properly unless select statement executed in Win2000 + if ($conn->databaseType == 'access') { + $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + if ($rs) { + $rs->Close(); + } + } + }/* + if (ADODB_Session::Lock()) { + $conn->CommitTrans(); + }*/ + return $rs ? true : false; + } + + /*! + */ + static function destroy($key) { + $conn = ADODB_Session::_conn(); + $table = ADODB_Session::table(); + $expire_notify = ADODB_Session::expireNotify(); + + if (!$conn) { + return false; + } + $debug = ADODB_Session::debug(); + if ($debug) $conn->debug = 1; + //assert('$table'); + + $qkey = $conn->quote($key); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + ADODB_Session::_dumprs($rs); + $conn->SetFetchMode($savem); + if (!$rs) { + return false; + } + if (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + //assert('$ref'); + //assert('$key'); + $fn($ref, $key); + } + $rs->Close(); + } + + $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey"; + $rs = $conn->Execute($sql); + if ($rs) { + $rs->Close(); + } + + return $rs ? true : false; + } + + /*! + */ + static function gc($maxlifetime) + { + $conn = ADODB_Session::_conn(); + $debug = ADODB_Session::debug(); + $expire_notify = ADODB_Session::expireNotify(); + $optimize = ADODB_Session::optimize(); + $table = ADODB_Session::table(); + + if (!$conn) { + return false; + } + + + $debug = ADODB_Session::debug(); + if ($debug) { + $conn->debug = 1; + $COMMITNUM = 2; + } else { + $COMMITNUM = 20; + } + + //assert('$table'); + + $time = $conn->OffsetDate(-$maxlifetime/24/3600,$conn->sysTimeStamp); + $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; + + if ($expire_notify) { + reset($expire_notify); + $fn = next($expire_notify); + } else { + $fn = false; + } + + $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); + $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time ORDER BY 2"; # add order by to prevent deadlock + $rs = $conn->SelectLimit($sql,1000); + ADODB_Session::_dumprs($rs); + if ($debug) $conn->SetFetchMode($savem); + if ($rs) { + $tr = $conn->hasTransactions; + if ($tr) $conn->BeginTrans(); + $keys = array(); + $ccnt = 0; + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + if ($fn) $fn($ref, $key); + $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key)); + $rs->MoveNext(); + $ccnt += 1; + if ($tr && $ccnt % $COMMITNUM == 0) { + if ($debug) echo "Commit<br>\n"; + $conn->CommitTrans(); + $conn->BeginTrans(); + } + } + $rs->Close(); + + if ($tr) $conn->CommitTrans(); + } + + + // suggested by Cameron, "GaM3R" <gamr@outworld.cx> + if ($optimize) { + $driver = ADODB_Session::driver(); + + if (preg_match('/mysql/i', $driver)) { + $sql = "OPTIMIZE TABLE $table"; + } + if (preg_match('/postgres/i', $driver)) { + $sql = "VACUUM $table"; + } + if (!empty($sql)) { + $conn->Execute($sql); + } + } + + + return true; + } +} + +ADODB_Session::_init(); +if (empty($ADODB_SESSION_READONLY)) + register_shutdown_function('session_write_close'); + +// for backwards compatability only +function adodb_sess_open($save_path, $session_name, $persist = true) { + return ADODB_Session::open($save_path, $session_name, $persist); +} + +// for backwards compatability only +function adodb_sess_gc($t) +{ + return ADODB_Session::gc($t); +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-sessions.mysql.sql b/pos/is4c-nf/lib/adodb5/session/adodb-sessions.mysql.sql new file mode 100644 index 000000000..f90de4493 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-sessions.mysql.sql @@ -0,0 +1,16 @@ +-- $CVSHeader$ + +CREATE DATABASE /*! IF NOT EXISTS */ adodb_sessions; + +USE adodb_sessions; + +DROP TABLE /*! IF EXISTS */ sessions; + +CREATE TABLE /*! IF NOT EXISTS */ sessions ( + sesskey CHAR(32) /*! BINARY */ NOT NULL DEFAULT '', + expiry INT(11) /*! UNSIGNED */ NOT NULL DEFAULT 0, + expireref VARCHAR(64) DEFAULT '', + data LONGTEXT DEFAULT '', + PRIMARY KEY (sesskey), + INDEX expiry (expiry) +); diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-sessions.oracle.clob.sql b/pos/is4c-nf/lib/adodb5/session/adodb-sessions.oracle.clob.sql new file mode 100644 index 000000000..c5c4f2d07 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-sessions.oracle.clob.sql @@ -0,0 +1,15 @@ +-- $CVSHeader$ + +DROP TABLE adodb_sessions; + +CREATE TABLE sessions ( + sesskey CHAR(32) DEFAULT '' NOT NULL, + expiry INT DEFAULT 0 NOT NULL, + expireref VARCHAR(64) DEFAULT '', + data CLOB DEFAULT '', + PRIMARY KEY (sesskey) +); + +CREATE INDEX ix_expiry ON sessions (expiry); + +QUIT; diff --git a/pos/is4c-nf/lib/adodb5/session/adodb-sessions.oracle.sql b/pos/is4c-nf/lib/adodb5/session/adodb-sessions.oracle.sql new file mode 100644 index 000000000..8fd5a3423 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/adodb-sessions.oracle.sql @@ -0,0 +1,16 @@ +-- $CVSHeader$ + +DROP TABLE adodb_sessions; + +CREATE TABLE sessions ( + sesskey CHAR(32) DEFAULT '' NOT NULL, + expiry INT DEFAULT 0 NOT NULL, + expireref VARCHAR(64) DEFAULT '', + data VARCHAR(4000) DEFAULT '', + PRIMARY KEY (sesskey), + INDEX expiry (expiry) +); + +CREATE INDEX ix_expiry ON sessions (expiry); + +QUIT; diff --git a/pos/is4c-nf/lib/adodb5/session/crypt.inc.php b/pos/is4c-nf/lib/adodb5/session/crypt.inc.php new file mode 100644 index 000000000..41cb06a5a --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/crypt.inc.php @@ -0,0 +1,161 @@ +<?php +// Session Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com> +class MD5Crypt{ + function keyED($txt,$encrypt_key) + { + $encrypt_key = md5($encrypt_key); + $ctr=0; + $tmp = ""; + for ($i=0;$i<strlen($txt);$i++){ + if ($ctr==strlen($encrypt_key)) $ctr=0; + $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1); + $ctr++; + } + return $tmp; + } + + function Encrypt($txt,$key) + { + srand((double)microtime()*1000000); + $encrypt_key = md5(rand(0,32000)); + $ctr=0; + $tmp = ""; + for ($i=0;$i<strlen($txt);$i++) + { + if ($ctr==strlen($encrypt_key)) $ctr=0; + $tmp.= substr($encrypt_key,$ctr,1) . + (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1)); + $ctr++; + } + return base64_encode($this->keyED($tmp,$key)); + } + + function Decrypt($txt,$key) + { + $txt = $this->keyED(base64_decode($txt),$key); + $tmp = ""; + for ($i=0;$i<strlen($txt);$i++){ + $md5 = substr($txt,$i,1); + $i++; + $tmp.= (substr($txt,$i,1) ^ $md5); + } + return $tmp; + } + + function RandPass() + { + $randomPassword = ""; + srand((double)microtime()*1000000); + for($i=0;$i<8;$i++) + { + $randnumber = rand(48,120); + + while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) + { + $randnumber = rand(48,120); + } + + $randomPassword .= chr($randnumber); + } + return $randomPassword; + } + +} + + +class SHA1Crypt{ + + function keyED($txt,$encrypt_key) + { + + $encrypt_key = sha1($encrypt_key); + $ctr=0; + $tmp = ""; + + for ($i=0;$i<strlen($txt);$i++){ + if ($ctr==strlen($encrypt_key)) $ctr=0; + $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1); + $ctr++; + } + return $tmp; + + } + + + + function Encrypt($txt,$key) + { + + srand((double)microtime()*1000000); + $encrypt_key = sha1(rand(0,32000)); + $ctr=0; + $tmp = ""; + + for ($i=0;$i<strlen($txt);$i++) + + { + + if ($ctr==strlen($encrypt_key)) $ctr=0; + + $tmp.= substr($encrypt_key,$ctr,1) . + + (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1)); + + $ctr++; + + } + + return base64_encode($this->keyED($tmp,$key)); + + } + + + + function Decrypt($txt,$key) + { + + $txt = $this->keyED(base64_decode($txt),$key); + + $tmp = ""; + + for ($i=0;$i<strlen($txt);$i++){ + + $sha1 = substr($txt,$i,1); + + $i++; + + $tmp.= (substr($txt,$i,1) ^ $sha1); + + } + + return $tmp; + } + + + + function RandPass() + { + $randomPassword = ""; + srand((double)microtime()*1000000); + + for($i=0;$i<8;$i++) + { + + $randnumber = rand(48,120); + + while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) + { + $randnumber = rand(48,120); + } + + $randomPassword .= chr($randnumber); + } + + return $randomPassword; + + } + + + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/old/adodb-cryptsession.php b/pos/is4c-nf/lib/adodb5/session/old/adodb-cryptsession.php new file mode 100644 index 000000000..ee5b627c2 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/old/adodb-cryptsession.php @@ -0,0 +1,324 @@ +<?php +/* +V5.09 25 June 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Made table name configurable - by David Johnson djohnson@inpro.net + Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com> + + Set tabs to 4 for best viewing. + + Latest version of ADODB is available at http://php.weblogs.com/adodb + ====================================================================== + + This file provides PHP4 session management using the ADODB database +wrapper library. + + Example + ======= + + include('adodb.inc.php'); + #---------------------------------# + include('adodb-cryptsession.php'); + #---------------------------------# + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>"; + + + Installation + ============ + 1. Create a new database in MySQL or Access "sessions" like +so: + + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA CLOB, + primary key (sesskey) + ); + + 2. Then define the following parameters. You can either modify + this file, or define them before this file is included: + + $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; + $ADODB_SESSION_CONNECT='server to connect to'; + $ADODB_SESSION_USER ='user'; + $ADODB_SESSION_PWD ='password'; + $ADODB_SESSION_DB ='database'; + $ADODB_SESSION_TBL = 'sessions' + + 3. Recommended is PHP 4.0.2 or later. There are documented +session bugs in earlier versions of PHP. + +*/ + + +include_once('crypt.inc.php'); + +if (!defined('_ADODB_LAYER')) { + include (dirname(__FILE__).'/adodb.inc.php'); +} + + /* if database time and system time is difference is greater than this, then give warning */ + define('ADODB_SESSION_SYNCH_SECS',60); + +if (!defined('ADODB_SESSION')) { + + define('ADODB_SESSION',1); + +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESS_DEBUG, + $ADODB_SESS_INSERT, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_TBL; + + //$ADODB_SESS_DEBUG = true; + + /* SET THE FOLLOWING PARAMETERS */ +if (empty($ADODB_SESSION_DRIVER)) { + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD =''; + $ADODB_SESSION_DB ='xphplens_2'; +} + +if (empty($ADODB_SESSION_TBL)){ + $ADODB_SESSION_TBL = 'sessions'; +} + +if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) { + $ADODB_SESSION_EXPIRE_NOTIFY = false; +} + +function ADODB_Session_Key() +{ +$ADODB_CRYPT_KEY = 'CRYPTED ADODB SESSIONS ROCK!'; + + /* USE THIS FUNCTION TO CREATE THE ENCRYPTION KEY FOR CRYPTED SESSIONS */ + /* Crypt the used key, $ADODB_CRYPT_KEY as key and session_ID as SALT */ + return crypt($ADODB_CRYPT_KEY, session_ID()); +} + +$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); +if ($ADODB_SESS_LIFE <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>"; + $ADODB_SESS_LIFE=1440; +} + +function adodb_sess_open($save_path, $session_name) +{ +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_DEBUG; + + $ADODB_SESS_INSERT = false; + + if (isset($ADODB_SESS_CONN)) return true; + + $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); + if (!empty($ADODB_SESS_DEBUG)) { + $ADODB_SESS_CONN->debug = true; + print" conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "; + } + return $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + +} + +function adodb_sess_close() +{ +global $ADODB_SESS_CONN; + + if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); + return true; +} + +function adodb_sess_read($key) +{ +$Crypt = new MD5Crypt; +global $ADODB_SESS_CONN,$ADODB_SESS_INSERT,$ADODB_SESSION_TBL; + $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); + if ($rs) { + if ($rs->EOF) { + $ADODB_SESS_INSERT = true; + $v = ''; + } else { + // Decrypt session data + $v = rawurldecode($Crypt->Decrypt(reset($rs->fields), ADODB_Session_Key())); + } + $rs->Close(); + return $v; + } + else $ADODB_SESS_INSERT = true; + + return ''; +} + +function adodb_sess_write($key, $val) +{ +$Crypt = new MD5Crypt; + global $ADODB_SESS_INSERT,$ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + $expiry = time() + $ADODB_SESS_LIFE; + + // encrypt session data.. + $val = $Crypt->Encrypt(rawurlencode($val), ADODB_Session_Key()); + + $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val); + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + $var = reset($ADODB_SESSION_EXPIRE_NOTIFY); + global $$var; + $arr['expireref'] = $$var; + } + $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL, + $arr, + 'sesskey',$autoQuote = true); + + if (!$rs) { + ADOConnection::outp( ' +-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false); + } else { + // bug in access driver (could be odbc?) means that info is not commited + // properly unless select statement executed in Win2000 + + if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); + } + return isset($rs); +} + +function adodb_sess_destroy($key) +{ + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; + $rs = $ADODB_SESS_CONN->Execute($qry); + } + return $rs ? true : false; +} + + +function adodb_sess_gc($maxlifetime) { + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY,$ADODB_SESS_DEBUG; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $t = time(); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + //$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $rs->Close(); + + $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time(); + $ADODB_SESS_CONN->Execute($qry); + } + + // suggested by Cameron, "GaM3R" <gamr@outworld.cx> + if (defined('ADODB_SESSION_OPTIMIZE')) + { + global $ADODB_SESSION_DRIVER; + + switch( $ADODB_SESSION_DRIVER ) { + case 'mysql': + case 'mysqlt': + $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; + break; + case 'postgresql': + case 'postgresql7': + $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; + break; + } + } + + if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL; + else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL; + + $rs = $ADODB_SESS_CONN->SelectLimit($sql,1); + if ($rs && !$rs->EOF) { + + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts); + $t = time(); + if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { + $msg = + __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)"; + error_log($msg); + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- $msg</p>"); + } + } + + return true; +} + +session_module_name('user'); +session_set_save_handler( + "adodb_sess_open", + "adodb_sess_close", + "adodb_sess_read", + "adodb_sess_write", + "adodb_sess_destroy", + "adodb_sess_gc"); +} + +/* TEST SCRIPT -- UNCOMMENT */ +/* +if (0) { + + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>"; +} +*/ +?> diff --git a/pos/is4c-nf/lib/adodb5/session/old/adodb-session-clob.php b/pos/is4c-nf/lib/adodb5/session/old/adodb-session-clob.php new file mode 100644 index 000000000..6b8572deb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/old/adodb-session-clob.php @@ -0,0 +1,448 @@ +<?php +/* + V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version of ADODB is available at http://php.weblogs.com/adodb + ====================================================================== + + This file provides PHP4 session management using the ADODB database + wrapper library, using Oracle CLOB's to store data. Contributed by achim.gosse@ddd.de. + + Example + ======= + + include('adodb.inc.php'); + include('adodb-session.php'); + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>"; + +To force non-persistent connections, call adodb_session_open first before session_start(): + + include('adodb.inc.php'); + include('adodb-session.php'); + adodb_session_open(false,false,false); + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>"; + + + Installation + ============ + 1. Create this table in your database (syntax might vary depending on your db): + + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA CLOB, + primary key (sesskey) + ); + + + 2. Then define the following parameters in this file: + $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; + $ADODB_SESSION_CONNECT='server to connect to'; + $ADODB_SESSION_USER ='user'; + $ADODB_SESSION_PWD ='password'; + $ADODB_SESSION_DB ='database'; + $ADODB_SESSION_TBL = 'sessions' + $ADODB_SESSION_USE_LOBS = false; (or, if you wanna use CLOBS (= 'CLOB') or ( = 'BLOB') + + 3. Recommended is PHP 4.1.0 or later. There are documented + session bugs in earlier versions of PHP. + + 4. If you want to receive notifications when a session expires, then + you can tag a session with an EXPIREREF, and before the session + record is deleted, we can call a function that will pass the EXPIREREF + as the first parameter, and the session key as the second parameter. + + To do this, define a notification function, say NotifyFn: + + function NotifyFn($expireref, $sesskey) + { + } + + Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY. + This is an array with 2 elements, the first being the name of the variable + you would like to store in the EXPIREREF field, and the 2nd is the + notification function's name. + + In this example, we want to be notified when a user's session + has expired, so we store the user id in the global variable $USERID, + store this value in the EXPIREREF field: + + $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn'); + + Then when the NotifyFn is called, we are passed the $USERID as the first + parameter, eg. NotifyFn($userid, $sesskey). +*/ + +if (!defined('_ADODB_LAYER')) { + include (dirname(__FILE__).'/adodb.inc.php'); +} + +if (!defined('ADODB_SESSION')) { + + define('ADODB_SESSION',1); + + /* if database time and system time is difference is greater than this, then give warning */ + define('ADODB_SESSION_SYNCH_SECS',60); + +/****************************************************************************************\ + Global definitions +\****************************************************************************************/ +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_CRC, + $ADODB_SESSION_USE_LOBS, + $ADODB_SESSION_TBL; + + if (!isset($ADODB_SESSION_USE_LOBS)) $ADODB_SESSION_USE_LOBS = 'CLOB'; + + $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); + if ($ADODB_SESS_LIFE <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>"; + $ADODB_SESS_LIFE=1440; + } + $ADODB_SESSION_CRC = false; + //$ADODB_SESS_DEBUG = true; + + ////////////////////////////////// + /* SET THE FOLLOWING PARAMETERS */ + ////////////////////////////////// + + if (empty($ADODB_SESSION_DRIVER)) { + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD =''; + $ADODB_SESSION_DB ='xphplens_2'; + } + + if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) { + $ADODB_SESSION_EXPIRE_NOTIFY = false; + } + // Made table name configurable - by David Johnson djohnson@inpro.net + if (empty($ADODB_SESSION_TBL)){ + $ADODB_SESSION_TBL = 'sessions'; + } + + + // defaulting $ADODB_SESSION_USE_LOBS + if (!isset($ADODB_SESSION_USE_LOBS) || empty($ADODB_SESSION_USE_LOBS)) { + $ADODB_SESSION_USE_LOBS = false; + } + + /* + $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER; + $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT; + $ADODB_SESS['user'] = $ADODB_SESSION_USER; + $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD; + $ADODB_SESS['db'] = $ADODB_SESSION_DB; + $ADODB_SESS['life'] = $ADODB_SESS_LIFE; + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + $ADODB_SESS['table'] = $ADODB_SESS_TBL; + */ + +/****************************************************************************************\ + Create the connection to the database. + + If $ADODB_SESS_CONN already exists, reuse that connection +\****************************************************************************************/ +function adodb_sess_open($save_path, $session_name,$persist=true) +{ +GLOBAL $ADODB_SESS_CONN; + if (isset($ADODB_SESS_CONN)) return true; + +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_DEBUG; + + // cannot use & below - do not know why... + $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); + if (!empty($ADODB_SESS_DEBUG)) { + $ADODB_SESS_CONN->debug = true; + ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "); + } + if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + + if (!$ok) ADOConnection::outp( " +-- Session: connection failed</p>",false); +} + +/****************************************************************************************\ + Close the connection +\****************************************************************************************/ +function adodb_sess_close() +{ +global $ADODB_SESS_CONN; + + if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); + return true; +} + +/****************************************************************************************\ + Slurp in the session variables and return the serialized string +\****************************************************************************************/ +function adodb_sess_read($key) +{ +global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC; + + $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else + $v = rawurldecode(reset($rs->fields)); + + $rs->Close(); + + // new optimization adodb 2.1 + $ADODB_SESSION_CRC = strlen($v).crc32($v); + + return $v; + } + + return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com +} + +/****************************************************************************************\ + Write the serialized data to a database. + + If the data has not been modified since adodb_sess_read(), we do not write. +\****************************************************************************************/ +function adodb_sess_write($key, $val) +{ + global + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESSION_TBL, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_CRC, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_DRIVER, // added + $ADODB_SESSION_USE_LOBS; // added + + $expiry = time() + $ADODB_SESS_LIFE; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) { + if ($ADODB_SESS_DEBUG) echo " +-- Session: Only updating date - crc32 not changed</p>"; + $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time(); + $rs = $ADODB_SESS_CONN->Execute($qry); + return true; + } + $val = rawurlencode($val); + + $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val); + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + $var = reset($ADODB_SESSION_EXPIRE_NOTIFY); + global $$var; + $arr['expireref'] = $$var; + } + + + if ($ADODB_SESSION_USE_LOBS === false) { // no lobs, simply use replace() + $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr, 'sesskey',$autoQuote = true); + if (!$rs) { + $err = $ADODB_SESS_CONN->ErrorMsg(); + } + } else { + // what value shall we insert/update for lob row? + switch ($ADODB_SESSION_DRIVER) { + // empty_clob or empty_lob for oracle dbs + case "oracle": + case "oci8": + case "oci8po": + case "oci805": + $lob_value = sprintf("empty_%s()", strtolower($ADODB_SESSION_USE_LOBS)); + break; + + // null for all other + default: + $lob_value = "null"; + break; + } + + // do we insert or update? => as for sesskey + $res = $ADODB_SESS_CONN->Execute("select count(*) as cnt from $ADODB_SESSION_TBL where sesskey = '$key'"); + if ($res && reset($res->fields) > 0) { + $qry = sprintf("update %s set expiry = %d, data = %s where sesskey = '%s'", $ADODB_SESSION_TBL, $expiry, $lob_value, $key); + } else { + // insert + $qry = sprintf("insert into %s (sesskey, expiry, data) values ('%s', %d, %s)", $ADODB_SESSION_TBL, $key, $expiry, $lob_value); + } + + $err = ""; + $rs1 = $ADODB_SESS_CONN->Execute($qry); + if (!$rs1) { + $err .= $ADODB_SESS_CONN->ErrorMsg()."\n"; + } + $rs2 = $ADODB_SESS_CONN->UpdateBlob($ADODB_SESSION_TBL, 'data', $val, "sesskey='$key'", strtoupper($ADODB_SESSION_USE_LOBS)); + if (!$rs2) { + $err .= $ADODB_SESS_CONN->ErrorMsg()."\n"; + } + $rs = ($rs1 && $rs2) ? true : false; + } + + if (!$rs) { + ADOConnection::outp( ' +-- Session Replace: '.nl2br($err).'</p>',false); + } else { + // bug in access driver (could be odbc?) means that info is not commited + // properly unless select statement executed in Win2000 + if ($ADODB_SESS_CONN->databaseType == 'access') + $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); + } + return !empty($rs); +} + +function adodb_sess_destroy($key) +{ + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; + $rs = $ADODB_SESS_CONN->Execute($qry); + } + return $rs ? true : false; +} + +function adodb_sess_gc($maxlifetime) +{ + global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $t = time(); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $rs->Close(); + + //$ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->CommitTrans(); + + } + } else { + $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time()); + + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- <b>Garbage Collection</b>: $qry</p>"); + } + // suggested by Cameron, "GaM3R" <gamr@outworld.cx> + if (defined('ADODB_SESSION_OPTIMIZE')) { + global $ADODB_SESSION_DRIVER; + + switch( $ADODB_SESSION_DRIVER ) { + case 'mysql': + case 'mysqlt': + $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; + break; + case 'postgresql': + case 'postgresql7': + $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; + break; + } + if (!empty($opt_qry)) { + $ADODB_SESS_CONN->Execute($opt_qry); + } + } + if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL; + else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL; + + $rs = $ADODB_SESS_CONN->SelectLimit($sql,1); + if ($rs && !$rs->EOF) { + + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts); + $t = time(); + if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { + $msg = + __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)"; + error_log($msg); + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- $msg</p>"); + } + } + + return true; +} + +session_module_name('user'); +session_set_save_handler( + "adodb_sess_open", + "adodb_sess_close", + "adodb_sess_read", + "adodb_sess_write", + "adodb_sess_destroy", + "adodb_sess_gc"); +} + +/* TEST SCRIPT -- UNCOMMENT */ + +if (0) { + + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + ADOConnection::outp( " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false); +} + +?> diff --git a/pos/is4c-nf/lib/adodb5/session/old/adodb-session.php b/pos/is4c-nf/lib/adodb5/session/old/adodb-session.php new file mode 100644 index 000000000..31b48e5a9 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/old/adodb-session.php @@ -0,0 +1,439 @@ +<?php +/* +V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version of ADODB is available at http://php.weblogs.com/adodb + ====================================================================== + + This file provides PHP4 session management using the ADODB database +wrapper library. + + Example + ======= + + include('adodb.inc.php'); + include('adodb-session.php'); + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>"; + +To force non-persistent connections, call adodb_session_open first before session_start(): + + include('adodb.inc.php'); + include('adodb-session.php'); + adodb_sess_open(false,false,false); + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + print " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>"; + + + Installation + ============ + 1. Create this table in your database (syntax might vary depending on your db): + + create table sessions ( + SESSKEY char(32) not null, + EXPIRY int(11) unsigned not null, + EXPIREREF varchar(64), + DATA text not null, + primary key (sesskey) + ); + + For oracle: + create table sessions ( + SESSKEY char(32) not null, + EXPIRY DECIMAL(16) not null, + EXPIREREF varchar(64), + DATA varchar(4000) not null, + primary key (sesskey) + ); + + + 2. Then define the following parameters. You can either modify + this file, or define them before this file is included: + + $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; + $ADODB_SESSION_CONNECT='server to connect to'; + $ADODB_SESSION_USER ='user'; + $ADODB_SESSION_PWD ='password'; + $ADODB_SESSION_DB ='database'; + $ADODB_SESSION_TBL = 'sessions' + + 3. Recommended is PHP 4.1.0 or later. There are documented + session bugs in earlier versions of PHP. + + 4. If you want to receive notifications when a session expires, then + you can tag a session with an EXPIREREF, and before the session + record is deleted, we can call a function that will pass the EXPIREREF + as the first parameter, and the session key as the second parameter. + + To do this, define a notification function, say NotifyFn: + + function NotifyFn($expireref, $sesskey) + { + } + + Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY. + This is an array with 2 elements, the first being the name of the variable + you would like to store in the EXPIREREF field, and the 2nd is the + notification function's name. + + In this example, we want to be notified when a user's session + has expired, so we store the user id in the global variable $USERID, + store this value in the EXPIREREF field: + + $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn'); + + Then when the NotifyFn is called, we are passed the $USERID as the first + parameter, eg. NotifyFn($userid, $sesskey). +*/ + +if (!defined('_ADODB_LAYER')) { + include (dirname(__FILE__).'/adodb.inc.php'); +} + +if (!defined('ADODB_SESSION')) { + + define('ADODB_SESSION',1); + + /* if database time and system time is difference is greater than this, then give warning */ + define('ADODB_SESSION_SYNCH_SECS',60); + + /* + Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1 +*/ +function adodb_session_regenerate_id() +{ + $conn = ADODB_Session::_conn(); + if (!$conn) return false; + + $old_id = session_id(); + if (function_exists('session_regenerate_id')) { + session_regenerate_id(); + } else { + session_id(md5(uniqid(rand(), true))); + $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + //@session_start(); + } + $new_id = session_id(); + $ok = $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id)); + + /* it is possible that the update statement fails due to a collision */ + if (!$ok) { + session_id($old_id); + if (empty($ck)) $ck = session_get_cookie_params(); + setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); + return false; + } + + return true; +} + +/****************************************************************************************\ + Global definitions +\****************************************************************************************/ +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_EXPIRE_NOTIFY, + $ADODB_SESSION_CRC, + $ADODB_SESSION_TBL; + + + $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); + if ($ADODB_SESS_LIFE <= 1) { + // bug in PHP 4.0.3 pl 1 -- how about other versions? + //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>"; + $ADODB_SESS_LIFE=1440; + } + $ADODB_SESSION_CRC = false; + //$ADODB_SESS_DEBUG = true; + + ////////////////////////////////// + /* SET THE FOLLOWING PARAMETERS */ + ////////////////////////////////// + + if (empty($ADODB_SESSION_DRIVER)) { + $ADODB_SESSION_DRIVER='mysql'; + $ADODB_SESSION_CONNECT='localhost'; + $ADODB_SESSION_USER ='root'; + $ADODB_SESSION_PWD =''; + $ADODB_SESSION_DB ='xphplens_2'; + } + + if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) { + $ADODB_SESSION_EXPIRE_NOTIFY = false; + } + // Made table name configurable - by David Johnson djohnson@inpro.net + if (empty($ADODB_SESSION_TBL)){ + $ADODB_SESSION_TBL = 'sessions'; + } + + /* + $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER; + $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT; + $ADODB_SESS['user'] = $ADODB_SESSION_USER; + $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD; + $ADODB_SESS['db'] = $ADODB_SESSION_DB; + $ADODB_SESS['life'] = $ADODB_SESS_LIFE; + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + + $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG; + $ADODB_SESS['table'] = $ADODB_SESS_TBL; + */ + +/****************************************************************************************\ + Create the connection to the database. + + If $ADODB_SESS_CONN already exists, reuse that connection +\****************************************************************************************/ +function adodb_sess_open($save_path, $session_name,$persist=true) +{ +GLOBAL $ADODB_SESS_CONN; + if (isset($ADODB_SESS_CONN)) return true; + +GLOBAL $ADODB_SESSION_CONNECT, + $ADODB_SESSION_DRIVER, + $ADODB_SESSION_USER, + $ADODB_SESSION_PWD, + $ADODB_SESSION_DB, + $ADODB_SESS_DEBUG; + + // cannot use & below - do not know why... + $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); + if (!empty($ADODB_SESS_DEBUG)) { + $ADODB_SESS_CONN->debug = true; + ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "); + } + if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT, + $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); + + if (!$ok) ADOConnection::outp( " +-- Session: connection failed</p>",false); +} + +/****************************************************************************************\ + Close the connection +\****************************************************************************************/ +function adodb_sess_close() +{ +global $ADODB_SESS_CONN; + + if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); + return true; +} + +/****************************************************************************************\ + Slurp in the session variables and return the serialized string +\****************************************************************************************/ +function adodb_sess_read($key) +{ +global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC; + + $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); + if ($rs) { + if ($rs->EOF) { + $v = ''; + } else + $v = rawurldecode(reset($rs->fields)); + + $rs->Close(); + + // new optimization adodb 2.1 + $ADODB_SESSION_CRC = strlen($v).crc32($v); + + return $v; + } + + return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com +} + +/****************************************************************************************\ + Write the serialized data to a database. + + If the data has not been modified since adodb_sess_read(), we do not write. +\****************************************************************************************/ +function adodb_sess_write($key, $val) +{ + global + $ADODB_SESS_CONN, + $ADODB_SESS_LIFE, + $ADODB_SESSION_TBL, + $ADODB_SESS_DEBUG, + $ADODB_SESSION_CRC, + $ADODB_SESSION_EXPIRE_NOTIFY; + + $expiry = time() + $ADODB_SESS_LIFE; + + // crc32 optimization since adodb 2.1 + // now we only update expiry date, thx to sebastian thom in adodb 2.32 + if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) { + if ($ADODB_SESS_DEBUG) echo " +-- Session: Only updating date - crc32 not changed</p>"; + $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time(); + $rs = $ADODB_SESS_CONN->Execute($qry); + return true; + } + $val = rawurlencode($val); + + $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val); + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + $var = reset($ADODB_SESSION_EXPIRE_NOTIFY); + global $$var; + $arr['expireref'] = $$var; + } + $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr, + 'sesskey',$autoQuote = true); + + if (!$rs) { + ADOConnection::outp( ' +-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false); + } else { + // bug in access driver (could be odbc?) means that info is not commited + // properly unless select statement executed in Win2000 + if ($ADODB_SESS_CONN->databaseType == 'access') + $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); + } + return !empty($rs); +} + +function adodb_sess_destroy($key) +{ + global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $ADODB_SESS_CONN->CommitTrans(); + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; + $rs = $ADODB_SESS_CONN->Execute($qry); + } + return $rs ? true : false; +} + +function adodb_sess_gc($maxlifetime) +{ + global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY; + + if ($ADODB_SESSION_EXPIRE_NOTIFY) { + reset($ADODB_SESSION_EXPIRE_NOTIFY); + $fn = next($ADODB_SESSION_EXPIRE_NOTIFY); + $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM); + $t = time(); + $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t"); + $ADODB_SESS_CONN->SetFetchMode($savem); + if ($rs) { + $ADODB_SESS_CONN->BeginTrans(); + while (!$rs->EOF) { + $ref = $rs->fields[0]; + $key = $rs->fields[1]; + $fn($ref,$key); + $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'"); + $rs->MoveNext(); + } + $rs->Close(); + + $ADODB_SESS_CONN->CommitTrans(); + + } + } else { + $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time(); + $ADODB_SESS_CONN->Execute($qry); + + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- <b>Garbage Collection</b>: $qry</p>"); + } + // suggested by Cameron, "GaM3R" <gamr@outworld.cx> + if (defined('ADODB_SESSION_OPTIMIZE')) { + global $ADODB_SESSION_DRIVER; + + switch( $ADODB_SESSION_DRIVER ) { + case 'mysql': + case 'mysqlt': + $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; + break; + case 'postgresql': + case 'postgresql7': + $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; + break; + } + if (!empty($opt_qry)) { + $ADODB_SESS_CONN->Execute($opt_qry); + } + } + if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL; + else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL; + + $rs = $ADODB_SESS_CONN->SelectLimit($sql,1); + if ($rs && !$rs->EOF) { + + $dbts = reset($rs->fields); + $rs->Close(); + $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts); + $t = time(); + + if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { + + $msg = + __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)"; + error_log($msg); + if ($ADODB_SESS_DEBUG) ADOConnection::outp(" +-- $msg</p>"); + } + } + + return true; +} + +session_module_name('user'); +session_set_save_handler( + "adodb_sess_open", + "adodb_sess_close", + "adodb_sess_read", + "adodb_sess_write", + "adodb_sess_destroy", + "adodb_sess_gc"); +} + +/* TEST SCRIPT -- UNCOMMENT */ + +if (0) { + + session_start(); + session_register('AVAR'); + $_SESSION['AVAR'] += 1; + ADOConnection::outp( " +-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false); +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/old/crypt.inc.php b/pos/is4c-nf/lib/adodb5/session/old/crypt.inc.php new file mode 100644 index 000000000..b99bbba55 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/old/crypt.inc.php @@ -0,0 +1,64 @@ +<?php +// Session Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com> +class MD5Crypt{ + function keyED($txt,$encrypt_key) + { + $encrypt_key = md5($encrypt_key); + $ctr=0; + $tmp = ""; + for ($i=0;$i<strlen($txt);$i++){ + if ($ctr==strlen($encrypt_key)) $ctr=0; + $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1); + $ctr++; + } + return $tmp; + } + + function Encrypt($txt,$key) + { + srand((double)microtime()*1000000); + $encrypt_key = md5(rand(0,32000)); + $ctr=0; + $tmp = ""; + for ($i=0;$i<strlen($txt);$i++) + { + if ($ctr==strlen($encrypt_key)) $ctr=0; + $tmp.= substr($encrypt_key,$ctr,1) . + (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1)); + $ctr++; + } + return base64_encode($this->keyED($tmp,$key)); + } + + function Decrypt($txt,$key) + { + $txt = $this->keyED(base64_decode($txt),$key); + $tmp = ""; + for ($i=0;$i<strlen($txt);$i++){ + $md5 = substr($txt,$i,1); + $i++; + $tmp.= (substr($txt,$i,1) ^ $md5); + } + return $tmp; + } + + function RandPass() + { + $randomPassword = ""; + srand((double)microtime()*1000000); + for($i=0;$i<8;$i++) + { + $randnumber = rand(48,120); + + while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) + { + $randnumber = rand(48,120); + } + + $randomPassword .= chr($randnumber); + } + return $randomPassword; + } + +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/session/session_schema.xml b/pos/is4c-nf/lib/adodb5/session/session_schema.xml new file mode 100644 index 000000000..3c61ff645 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/session_schema.xml @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<schema version="0.2"> + <table name="sessions"> + <desc>table for ADOdb session-management</desc> + + <field name="SESSKEY" type="C" size="32"> + <descr>session key</descr> + <KEY/> + <NOTNULL/> + </field> + + <field name="EXPIRY" type="I" size="11"> + <descr></descr> + <NOTNULL/> + </field> + + <field name="EXPIREREF" type="C" size="64"> + <descr></descr> + </field> + + <field name="DATA" type="XL"> + <descr></descr> + <NOTNULL/> + </field> + </table> +</schema> diff --git a/pos/is4c-nf/lib/adodb5/session/session_schema2.xml b/pos/is4c-nf/lib/adodb5/session/session_schema2.xml new file mode 100644 index 000000000..22f8dafed --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/session/session_schema2.xml @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<schema version="0.3"> + <table name="sessions2"> + <desc>table for ADOdb session-management</desc> + + <field name="SESSKEY" type="C" size="64"> + <descr>session key</descr> + <KEY/> + <NOTNULL/> + </field> + + + + <field name="EXPIRY" type="T"> + <descr></descr> + <NOTNULL/> + </field> + + <field name="CREATED" type="T"> + <descr></descr> + <NOTNULL/> + </field> + + <field name="MODIFIED" type="T"> + <descr></descr> + <NOTNULL/> + </field> + + <field name="EXPIREREF" type="C" size="250"> + <descr></descr> + </field> + + <field name="SESSDATA" type="XL"> + <descr></descr> + <NOTNULL/> + </field> + </table> +</schema> diff --git a/pos/is4c-nf/lib/adodb5/tests/benchmark.php b/pos/is4c-nf/lib/adodb5/tests/benchmark.php new file mode 100644 index 000000000..936821ed3 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/benchmark.php @@ -0,0 +1,84 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> + +<html> +<head> + <title>ADODB Benchmarks</title> +</head> + +<body> +<?php +/* +V4.81 3 May 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Benchmark code to test the speed to the ADODB library with different databases. + This is a simplistic benchmark to be used as the basis for further testing. + It should not be used as proof of the superiority of one database over the other. +*/ + +$testmssql = true; +//$testvfp = true; +$testoracle = true; +$testado = true; +$testibase = true; +$testaccess = true; +$testmysql = true; +$testsqlite = true;; + +set_time_limit(240); // increase timeout + +include("../tohtml.inc.php"); +include("../adodb.inc.php"); + +function testdb(&$db,$createtab="create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)") +{ +GLOBAL $ADODB_version,$ADODB_FETCH_MODE; + + adodb_backtrace(); + + $max = 100; + $sql = 'select * from ADOXYZ'; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + //print "<h3>ADODB Version: $ADODB_version Host: <i>$db->host</i> &nbsp; Database: <i>$db->database</i></h3>"; + + // perform query once to cache results so we are only testing throughput + $rs = $db->Execute($sql); + if (!$rs){ + print "Error in recordset<p>"; + return; + } + $arr = $rs->GetArray(); + //$db->debug = true; + global $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $start = microtime(); + for ($i=0; $i < $max; $i++) { + $rs = $db->Execute($sql); + $arr = $rs->GetArray(); + // print $arr[0][1]; + } + $end = microtime(); + $start = explode(' ',$start); + $end = explode(' ',$end); + + //print_r($start); + //print_r($end); + + // print_r($arr); + $total = $end[0]+trim($end[1]) - $start[0]-trim($start[1]); + printf ("<p>seconds = %8.2f for %d iterations each with %d records</p>",$total,$max, sizeof($arr)); + flush(); + + + //$db->Close(); +} +include("testdatabases.inc.php"); + +?> + + +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/tests/client.php b/pos/is4c-nf/lib/adodb5/tests/client.php new file mode 100644 index 000000000..7bf145e7f --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/client.php @@ -0,0 +1,198 @@ +<html> +<body bgcolor=white> +<?php +/** + * V4.50 6 July 2004 (c) 2001-2002 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + * + * set tabs to 8 + */ + + // documentation on usage is at http://php.weblogs.com/adodb_csv + + echo PHP_VERSION,'<br>'; + var_dump(parse_url('odbc_mssql://userserver/')); + die(); + +include('../adodb.inc.php'); +include('../tohtml.inc.php'); + + function send2server($url,$sql) + { + $url .= '?sql='.urlencode($sql); + print "<p>$url</p>"; + $rs = csv2rs($url,$err); + if ($err) print $err; + return $rs; + } + + function print_pre($s) + { + print "<pre>";print_r($s);print "</pre>"; + } + + +$serverURL = 'http://localhost/php/phplens/adodb/server.php'; +$testhttp = false; + +$sql1 = "insertz into products (productname) values ('testprod 1')"; +$sql2 = "insert into products (productname) values ('testprod 1')"; +$sql3 = "insert into products (productname) values ('testprod 2')"; +$sql4 = "delete from products where productid>80"; +$sql5 = 'select * from products'; + +if ($testhttp) { + print "<a href=#c>Client Driver Tests</a><p>"; + print "<h3>Test Error</h3>"; + $rs = send2server($serverURL,$sql1); + print_pre($rs); + print "<hr />"; + + print "<h3>Test Insert</h3>"; + + $rs = send2server($serverURL,$sql2); + print_pre($rs); + print "<hr />"; + + print "<h3>Test Insert2</h3>"; + + $rs = send2server($serverURL,$sql3); + print_pre($rs); + print "<hr />"; + + print "<h3>Test Delete</h3>"; + + $rs = send2server($serverURL,$sql4); + print_pre($rs); + print "<hr />"; + + + print "<h3>Test Select</h3>"; + $rs = send2server($serverURL,$sql5); + if ($rs) rs2html($rs); + + print "<hr />"; +} + + +print "<a name=c><h1>CLIENT Driver Tests</h1>"; +$conn = ADONewConnection('csv'); +$conn->Connect($serverURL); +$conn->debug = true; + +print "<h3>Bad SQL</h3>"; + +$rs = $conn->Execute($sql1); + +print "<h3>Insert SQL 1</h3>"; +$rs = $conn->Execute($sql2); + +print "<h3>Insert SQL 2</h3>"; +$rs = $conn->Execute($sql3); + +print "<h3>Select SQL</h3>"; +$rs = $conn->Execute($sql5); +if ($rs) rs2html($rs); + +print "<h3>Delete SQL</h3>"; +$rs = $conn->Execute($sql4); + +print "<h3>Select SQL</h3>"; +$rs = $conn->Execute($sql5); +if ($rs) rs2html($rs); + + +/* EXPECTED RESULTS FOR HTTP TEST: + +Test Insert +http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29 + +adorecordset Object +( + [dataProvider] => native + [fields] => + [blobSize] => 64 + [canSeek] => + [EOF] => 1 + [emptyTimeStamp] => + [emptyDate] => + [debug] => + [timeToLive] => 0 + [bind] => + [_numOfRows] => -1 + [_numOfFields] => 0 + [_queryID] => 1 + [_currentRow] => -1 + [_closed] => + [_inited] => + [sql] => insert into products (productname) values ('testprod') + [affectedrows] => 1 + [insertid] => 81 +) + + +-------------------------------------------------------------------------------- + +Test Insert2 +http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29 + +adorecordset Object +( + [dataProvider] => native + [fields] => + [blobSize] => 64 + [canSeek] => + [EOF] => 1 + [emptyTimeStamp] => + [emptyDate] => + [debug] => + [timeToLive] => 0 + [bind] => + [_numOfRows] => -1 + [_numOfFields] => 0 + [_queryID] => 1 + [_currentRow] => -1 + [_closed] => + [_inited] => + [sql] => insert into products (productname) values ('testprod') + [affectedrows] => 1 + [insertid] => 82 +) + + +-------------------------------------------------------------------------------- + +Test Delete +http://localhost/php/adodb/server.php?sql=delete+from+products+where+productid%3E80 + +adorecordset Object +( + [dataProvider] => native + [fields] => + [blobSize] => 64 + [canSeek] => + [EOF] => 1 + [emptyTimeStamp] => + [emptyDate] => + [debug] => + [timeToLive] => 0 + [bind] => + [_numOfRows] => -1 + [_numOfFields] => 0 + [_queryID] => 1 + [_currentRow] => -1 + [_closed] => + [_inited] => + [sql] => delete from products where productid>80 + [affectedrows] => 2 + [insertid] => 0 +) + +[more stuff deleted] + . + . + . +*/ +?> diff --git a/pos/is4c-nf/lib/adodb5/tests/pdo.php b/pos/is4c-nf/lib/adodb5/tests/pdo.php new file mode 100644 index 000000000..e4c1a4630 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/pdo.php @@ -0,0 +1,94 @@ +<?php +error_reporting(E_ALL); +include('../adodb.inc.php'); + +echo "<pre>"; +try { + echo "New Connection\n"; + + + $dsn = 'pdo_mysql://root:@localhost/northwind?persist'; + + if (!empty($dsn)) { + $DB = NewADOConnection($dsn) || die("CONNECT FAILED"); + $connstr = $dsn; + } else { + + $DB = NewADOConnection('pdo'); + + echo "Connect\n"; + + $u = ''; $p = ''; + /* + $connstr = 'odbc:nwind'; + + $connstr = 'oci:'; + $u = 'scott'; + $p = 'natsoft'; + + + $connstr ="sqlite:d:\inetpub\adodb\sqlite.db"; + */ + + $connstr = "mysql:dbname=northwind"; + $u = 'root'; + + $connstr = "pgsql:dbname=test"; + $u = 'tester'; + $p = 'test'; + + $DB->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + + } + + echo "connection string=$connstr\n Execute\n"; + + //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $DB->Execute("select * from ADOXYZ where id<3"); + if ($DB->ErrorNo()) echo "*** errno=".$DB->ErrorNo() . " ".($DB->ErrorMsg())."\n"; + + + //print_r(get_class_methods($DB->_stmt)); + + if (!$rs) die("NO RS"); + + echo "Meta\n"; + for ($i=0; $i < $rs->NumCols(); $i++) { + var_dump($rs->FetchField($i)); + echo "<br>"; + } + + echo "FETCH\n"; + $cnt = 0; + while (!$rs->EOF) { + adodb_pr($rs->fields); + $rs->MoveNext(); + if ($cnt++ > 1000) break; + } + + echo "<br>--------------------------------------------------------<br>\n\n\n"; + + $stmt = $DB->PrepareStmt("select * from ADOXYZ"); + + $rs = $stmt->Execute(); + $cols = $stmt->NumCols(); // execute required + + echo "COLS = $cols"; + for($i=1;$i<=$cols;$i++) { + $v = $stmt->_stmt->getColumnMeta($i); + var_dump($v); + } + + echo "e=".$stmt->ErrorNo() . " ".($stmt->ErrorMsg())."\n"; + while ($arr = $rs->FetchRow()) { + adodb_pr($arr); + } + die("DONE\n"); + +} catch (exception $e) { + echo "<pre>"; + echo $e; + echo "</pre>"; +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-active-record.php b/pos/is4c-nf/lib/adodb5/tests/test-active-record.php new file mode 100644 index 000000000..1811049d9 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-active-record.php @@ -0,0 +1,141 @@ +<?php + + include_once('../adodb.inc.php'); + include_once('../adodb-active-record.inc.php'); + + // uncomment the following if you want to test exceptions + if (@$_GET['except']) { + if (PHP_VERSION >= 5) { + include('../adodb-exceptions.inc.php'); + echo "<h3>Exceptions included</h3>"; + } + } + + $db = NewADOConnection('mysql://root@localhost/northwind?persist'); + $db->debug=1; + ADOdb_Active_Record::SetDatabaseAdapter($db); + + + $db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TEMPORARY TABLE `children` ( + `id` int(10) unsigned NOT NULL auto_increment, + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + class Person extends ADOdb_Active_Record{} + $person = new Person(); + ADOdb_Active_Record::$_quoteNames = '111'; + + echo "<p>Output of getAttributeNames: "; + var_dump($person->getAttributeNames()); + + /** + * Outputs the following: + * array(4) { + * [0]=> + * string(2) "id" + * [1]=> + * string(9) "name_first" + * [2]=> + * string(8) "name_last" + * [3]=> + * string(13) "favorite_color" + * } + */ + + $person = new Person(); + $person->name_first = 'Andi'; + $person->name_last = 'Gutmans'; + $person->save(); // this save() will fail on INSERT as favorite_color is a must fill... + + + $person = new Person(); + $person->name_first = 'Andi'; + $person->name_last = 'Gutmans'; + $person->favorite_color = 'blue'; + $person->save(); // this save will perform an INSERT successfully + + echo "<p>The Insert ID generated:"; print_r($person->id); + + $person->favorite_color = 'red'; + $person->save(); // this save() will perform an UPDATE + + $person = new Person(); + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + // load record where id=2 into a new ADOdb_Active_Record + $person2 = new Person(); + $person2->Load('id=2'); + + $activeArr = $db->GetActiveRecordsClass($class = "Person",$table = "Persons","id=".$db->Param(0),array(2)); + $person2 = $activeArr[0]; + echo "<p>Name (should be John): ",$person->name_first, " <br> Class (should be Person): ",get_class($person2),"<br>"; + + $db->Execute("insert into children (person_id,name_first,name_last) values (2,'Jill','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (2,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (2,'JAMIE','Lim')"); + + $newperson2 = new Person(); + $person2->HasMany('children','person_id'); + $person2->Load('id=2'); + $person2->name_last='green'; + $c = $person2->children; + $person2->save(); + + if (is_array($c) && sizeof($c) == 3 && $c[0]->name_first=='Jill' && $c[1]->name_first=='Joan' + && $c[2]->name_first == 'JAMIE') echo "OK Loaded HasMany</br>"; + else { + var_dump($c); + echo "error loading hasMany should have 3 array elements Jill Joan Jamie<br>"; + } + + class Child extends ADOdb_Active_Record{}; + $ch = new Child('children',array('id')); + $ch->BelongsTo('person','person_id','id'); + $ch->Load('id=1'); + if ($ch->name_first !== 'Jill') echo "error in Loading Child<br>"; + + $p = $ch->person; + if ($p->name_first != 'John') echo "Error loading belongsTo<br>"; + else echo "OK loading BelongTo<br>"; + + $p->hasMany('children','person_id'); + $p->LoadRelations('children', " Name_first like 'J%' order by id",1,2); + if (sizeof($p->children) == 2 && $p->children[1]->name_first == 'JAMIE') echo "OK LoadRelations<br>"; + else echo "error LoadRelations<br>"; + + $db->Execute("CREATE TEMPORARY TABLE `persons2` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $p = new adodb_active_record('persons2'); + $p->name_first = 'James'; + + $p->name_last = 'James'; + + $p->HasMany('children','person_id'); + $p->children; + var_dump($p); + $p->Save(); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-active-recs2.php b/pos/is4c-nf/lib/adodb5/tests/test-active-recs2.php new file mode 100644 index 000000000..72168d80b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-active-recs2.php @@ -0,0 +1,75 @@ +<?php +error_reporting(E_ALL); +include('../adodb.inc.php'); + +include('../adodb-active-record.inc.php'); + +########################### + +$ADODB_ACTIVE_CACHESECS = 36; + +$DBMS = @$_GET['db']; +if ($DBMS == 'mysql') { + $db = NewADOConnection('mysql://root@localhost/northwind'); +} else if ($DBMS == 'postgres') { + $db = NewADOConnection('postgres'); + $db->Connect("localhost","tester","test","test"); +} else + $db = NewADOConnection('oci8://scott:natsoft@/'); + + +$arr = $db->ServerInfo(); +echo "<h3>$db->dataProvider: {$arr['description']}</h3>"; + +$arr = $db->GetActiveRecords('products',' productid<10'); +adodb_pr($arr); + +ADOdb_Active_Record::SetDatabaseAdapter($db); +if (!$db) die('failed'); + + + + +$rec = new ADODB_Active_Record('photos'); + +$rec = new ADODB_Active_Record('products'); + + +adodb_pr($rec->getAttributeNames()); + +echo "<hr>"; + + +$rec->load('productid=2'); +adodb_pr($rec); + +$db->debug=1; + + +$rec->productname = 'Changie Chan'.rand(); + +$rec->insert(); +$rec->update(); + +$rec->productname = 'Changie Chan 99'; +$rec->replace(); + + +$rec2 = new ADODB_Active_Record('products'); +$rec->load('productid=3'); +$rec->save(); + +$rec = new ADODB_Active_record('products'); +$rec->productname = 'John ActiveRec'; +$rec->notes = 22; +#$rec->productid=0; +$rec->discontinued=1; +$rec->Save(); +$rec->supplierid=33; +$rec->Save(); +$rec->discontinued=0; +$rec->Save(); +$rec->Delete(); + +echo "<p>Affected Rows after delete=".$db->Affected_Rows()."</p>"; +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-active-relations.php b/pos/is4c-nf/lib/adodb5/tests/test-active-relations.php new file mode 100644 index 000000000..eb0f636db --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-active-relations.php @@ -0,0 +1,87 @@ +<?php + + include_once('../adodb.inc.php'); + include_once('../adodb-active-record.inc.php'); + + + $db = NewADOConnection('mysql://root@localhost/northwind'); + $db->debug=1; + ADOdb_Active_Record::SetDatabaseAdapter($db); + + $db->Execute("CREATE TEMPORARY TABLE `persons` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TEMPORARY TABLE `children` ( + `id` int(10) unsigned NOT NULL auto_increment, + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Jill','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')"); + + ADODB_Active_Record::TableHasMany('persons', 'children','person_id'); + class person extends ADOdb_Active_Record{} + + $person = new person(); +# $person->HasMany('children','person_id'); ## this is affects all other instances of Person + + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + $person2 = new person(); + $person2->Load('id=1'); + + $c = $person2->children; + if (is_array($c) && sizeof($c) == 3 && $c[0]->name_first=='Jill' && $c[1]->name_first=='Joan' + && $c[2]->name_first == 'JAMIE') echo "OK Loaded HasMany</br>"; + else { + var_dump($c); + echo "error loading hasMany should have 3 array elements Jill Joan Jamie<br>"; + } + + class child extends ADOdb_Active_Record{}; + ADODB_Active_Record::TableBelongsTo('children','person','person_id','id'); + $ch = new Child('children',array('id')); + + $ch->Load('id=1'); + if ($ch->name_first !== 'Jill') echo "error in Loading Child<br>"; + + $p = $ch->person; + if (!$p || $p->name_first != 'John') echo "Error loading belongsTo<br>"; + else echo "OK loading BelongTo<br>"; + + if ($p) { + #$p->HasMany('children','person_id'); ## this is affects all other instances of Person + $p->LoadRelations('children', 'order by id',1,2); + if (sizeof($p->children) == 2 && $p->children[1]->name_first == 'JAMIE') echo "OK LoadRelations<br>"; + else { + var_dump($p->children); + echo "error LoadRelations<br>"; + } + + unset($p->children); + $p->LoadRelations('children', " name_first like 'J%' order by id",1,2); + } + if ($p) + foreach($p->children as $c) { + echo " Saving $c->name_first <br>"; + $c->name_first .= ' K.'; + $c->Save(); + } + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-active-relationsx.php b/pos/is4c-nf/lib/adodb5/tests/test-active-relationsx.php new file mode 100644 index 000000000..fbfddf661 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-active-relationsx.php @@ -0,0 +1,419 @@ +<?php +global $err_count; +$err_count = 0; + + function found($obj, $cond) + { + $res = var_export($obj, true); + return (strpos($res, $cond)); + } + + function notfound($obj, $cond) + { + return !found($obj, $cond); + } + + function ar_assert($bool) + { + global $err_count; + if(!$bool) + $err_count ++; + return $bool; + } + + define('WEB', true); + function ar_echo($txt) + { + if(WEB) + $txt = str_replace("\n", "<br />\n", $txt); + echo $txt; + } + + include_once('../adodb.inc.php'); + include_once('../adodb-active-recordx.inc.php'); + + + $db = NewADOConnection('mysql://root@localhost/test'); + $db->debug=0; + ADOdb_Active_Record::SetDatabaseAdapter($db); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("Preparing database using SQL queries (creating 'people', 'children')\n"); + + $db->Execute("DROP TABLE `people`"); + $db->Execute("DROP TABLE `children`"); + $db->Execute("DROP TABLE `artists`"); + $db->Execute("DROP TABLE `songs`"); + + $db->Execute("CREATE TABLE `people` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_color` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + $db->Execute("CREATE TABLE `children` ( + `person_id` int(10) unsigned NOT NULL, + `name_first` varchar(100) NOT NULL default '', + `name_last` varchar(100) NOT NULL default '', + `favorite_pet` varchar(100) NOT NULL default '', + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TABLE `artists` ( + `name` varchar(100) NOT NULL default '', + `artistuniqueid` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`artistuniqueid`) + ) ENGINE=MyISAM; + "); + + $db->Execute("CREATE TABLE `songs` ( + `name` varchar(100) NOT NULL default '', + `artistid` int(10) NOT NULL, + `recordid` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`recordid`) + ) ENGINE=MyISAM; + "); + + $db->Execute("insert into children (person_id,name_first,name_last,favorite_pet) values (1,'Jill','Lim','tortoise')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'Joan','Lim')"); + $db->Execute("insert into children (person_id,name_first,name_last) values (1,'JAMIE','Lim')"); + + $db->Execute("insert into artists (artistuniqueid, name) values(1,'Elvis Costello')"); + $db->Execute("insert into songs (recordid, name, artistid) values(1,'No Hiding Place', 1)"); + $db->Execute("insert into songs (recordid, name, artistid) values(2,'American Gangster Time', 1)"); + + // This class _implicitely_ relies on the 'people' table (pluralized form of 'person') + class Person extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct(); + $this->hasMany('children'); + } + } + // This class _implicitely_ relies on the 'children' table + class Child extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct(); + $this->belongsTo('person'); + } + } + // This class _explicitely_ relies on the 'children' table and shares its metadata with Child + class Kid extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('children'); + $this->belongsTo('person'); + } + } + // This class _explicitely_ relies on the 'children' table but does not share its metadata + class Rugrat extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('children', false, false, array('new' => true)); + } + } + + class Artist extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('artists', array('artistuniqueid')); + $this->hasMany('songs', 'artistid'); + } + } + class Song extends ADOdb_Active_Record + { + function __construct() + { + parent::__construct('songs', array('recordid')); + $this->belongsTo('artist', 'artistid'); + } + } + + ar_echo("Inserting person in 'people' table ('John Lim, he likes lavender')\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $person->name_first = 'John'; + $person->name_last = 'Lim'; + $person->favorite_color = 'lavender'; + $person->save(); // this save will perform an INSERT successfully + + $person = new Person(); + $person->name_first = 'Lady'; + $person->name_last = 'Cat'; + $person->favorite_color = 'green'; + $person->save(); + + $child = new Child(); + $child->name_first = 'Fluffy'; + $child->name_last = 'Cat'; + $child->favorite_pet = 'Cat Lady'; + $child->person_id = $person->id; + $child->save(); + + $child = new Child(); + $child->name_first = 'Sun'; + $child->name_last = 'Cat'; + $child->favorite_pet = 'Cat Lady'; + $child->person_id = $person->id; + $child->save(); + + $err_count = 0; + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('id=1') [Lazy Method]\n"); + ar_echo("person is loaded but its children will be loaded on-demand later on\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $people = $person->Find('id=1'); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo("\n-- Lazily Loading Children:\n\n"); + foreach($people as $aperson) + { + foreach($aperson->children as $achild) + { + if($achild->name_first); + } + } + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("person is loaded, and so are its children\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $people = $person->Find('id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('id=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("person and its children are loaded using a single query\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + // When I specifically ask for a join, I have to specify which table id I am looking up + // otherwise the SQL parser will wonder which table's id that would be. + $people = $person->Find('people.id=1', false, false, array('loading' => ADODB_JOIN_AR)); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Load('people.id=1') [Join Method]\n"); + ar_echo("Load() always uses the join method since it returns only one row\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + // Under the hood, Load(), since it returns only one row, always perform a join + // Therefore we need to clarify which id we are talking about. + $person->Load('people.id=1'); + ar_echo((ar_assert(found($person, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($person, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($person, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($person, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("child->Load('children.id=1') [Join Method]\n"); + ar_echo("We are now loading from the 'children' table, not from 'people'\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $child = new Child(); + $child->Load('children.id=1'); + ar_echo((ar_assert(found($child, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($child, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("child->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $child = new Child(); + $children = $child->Find('id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($children, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($children, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(notfound($children, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($children, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("Where we see that kid shares relationships with child because they are stored\n"); + ar_echo("in the common table's metadata structure.\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $kid = new Kid('children'); + $kids = $kid->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($kids, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($kids, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("kid->Find('children.id=1' ... ADODB_LAZY_AR) [Lazy Method]\n"); + ar_echo("Of course, lazy loading also retrieve medata information...\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $kid = new Kid('children'); + $kids = $kid->Find('children.id=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($kids, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($kids, "'favorite_color' => 'lavender'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo("\n-- Lazily Loading People:\n\n"); + foreach($kids as $akid) + { + if($akid->person); + } + ar_echo((ar_assert(found($kids, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("In rugrat's constructor it is specified that\nit must forget any existing relation\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $rugrat = new Rugrat('children'); + $rugrats = $rugrat->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($rugrats, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($rugrats, "'favorite_color' => 'lavender'"))) ? "[OK] No relation found\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($rugrats, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($rugrats, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("kid->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("Note how only rugrat forgot its relations - kid is fine.\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $kid = new Kid('children'); + $kids = $kid->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($kids, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($kids, "'favorite_color' => 'lavender'"))) ? "[OK] I did not forget relation: person\n" : "[!!] I should not have forgotten relation: person\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($kids, "'name_first' => 'JAMIE'"))) ? "[OK] No JAMIE relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("rugrat->Find('children.id=1' ... ADODB_WORK_AR) [Worker Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $rugrat = new Rugrat('children'); + $rugrats = $rugrat->Find('children.id=1', false, false, array('loading' => ADODB_WORK_AR)); + $arugrat = $rugrats[0]; + ar_echo((ar_assert(found($arugrat, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($arugrat, "'favorite_color' => 'lavender'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n-- Loading relations:\n\n"); + $arugrat->belongsTo('person'); + $arugrat->LoadRelations('person', 'order by id', 0, 2); + ar_echo((ar_assert(found($arugrat, "'favorite_color' => 'lavender'"))) ? "[OK] Found relation: person\n" : "[!!] Missing relation: person\n"); + ar_echo((ar_assert(found($arugrat, "'name_first' => 'Jill'"))) ? "[OK] Found Jill\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($arugrat, "'name_first' => 'Joan'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($arugrat, "'name_first' => 'JAMIE'"))) ? "[OK] No Joan relation\n" : "[!!] Found relation when I shouldn't\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("person->Find('1=1') [Lazy Method]\n"); + ar_echo("And now for our finale...\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $person = new Person(); + $people = $person->Find('1=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($people, "'name_first' => 'John'"))) ? "[OK] Found John\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + ar_echo((ar_assert(notfound($people, "'name_first' => 'Fluffy'"))) ? "[OK] No Fluffy yet\n" : "[!!] Found Fluffy relation when I shouldn't\n"); + ar_echo("\n-- Lazily Loading Everybody:\n\n"); + foreach($people as $aperson) + { + foreach($aperson->children as $achild) + { + if($achild->name_first); + } + } + ar_echo((ar_assert(found($people, "'favorite_pet' => 'tortoise'"))) ? "[OK] Found relation: child\n" : "[!!] Missing relation: child\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Joan'"))) ? "[OK] Found Joan\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'JAMIE'"))) ? "[OK] Found JAMIE\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Lady'"))) ? "[OK] Found Cat Lady\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Fluffy'"))) ? "[OK] Found Fluffy\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($people, "'name_first' => 'Sun'"))) ? "[OK] Found Sun\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Load('artistuniqueid=1') [Join Method]\n"); + ar_echo("Yes, we are dabbling in the musical field now..\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artist->Load('artistuniqueid=1'); + ar_echo((ar_assert(found($artist, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($artist, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Load('recordid=1') [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $song->Load('recordid=1'); + ar_echo((ar_assert(found($song, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Find('artistuniqueid=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artists = $artist->Find('artistuniqueid=1', false, false, array('loading' => ADODB_JOIN_AR)); + ar_echo((ar_assert(found($artists, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($artists, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Find('recordid=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $songs = $song->Find('recordid=1', false, false, array('loading' => ADODB_JOIN_AR)); + ar_echo((ar_assert(found($songs, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Find('artistuniqueid=1' ... ADODB_WORK_AR) [Work Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artists = $artist->Find('artistuniqueid=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($artists, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(found($artists, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Find('recordid=1' ... ADODB_JOIN_AR) [Join Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $songs = $song->Find('recordid=1', false, false, array('loading' => ADODB_WORK_AR)); + ar_echo((ar_assert(found($songs, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("artist->Find('artistuniqueid=1' ... ADODB_LAZY_AR) [Lazy Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $artist = new Artist(); + $artists = $artist->Find('artistuniqueid=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($artists, "'name' => 'Elvis Costello'"))) ? "[OK] Found Elvis Costello\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($artists, "'name' => 'No Hiding Place'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + foreach($artists as $anartist) + { + foreach($anartist->songs as $asong) + { + if($asong->name); + } + } + ar_echo((ar_assert(found($artists, "'name' => 'No Hiding Place'"))) ? "[OK] Found relation: song\n" : "[!!] Missing relation: song\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("song->Find('recordid=1' ... ADODB_LAZY_AR) [Lazy Method]\n"); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); + $song = new Song(); + $songs = $song->Find('recordid=1', false, false, array('loading' => ADODB_LAZY_AR)); + ar_echo((ar_assert(found($songs, "'name' => 'No Hiding Place'"))) ? "[OK] Found song\n" : "[!!] Find failed\n"); + ar_echo((ar_assert(notfound($songs, "'name' => 'Elvis Costello'"))) ? "[OK] No relation yet\n" : "[!!] Found relation when I shouldn't\n"); + foreach($songs as $asong) + { + if($asong->artist); + } + ar_echo((ar_assert(found($songs, "'name' => 'Elvis Costello'"))) ? "[OK] Found relation: artist\n" : "[!!] Missing relation: artist\n"); + + ar_echo("\n\n-------------------------------------------------------------------------------------------------------------------\n"); + ar_echo("Test suite complete. " . (($err_count > 0) ? "$err_count errors found.\n" : "Success.\n")); + ar_echo("-------------------------------------------------------------------------------------------------------------------\n"); +?> diff --git a/pos/is4c-nf/lib/adodb5/tests/test-datadict.php b/pos/is4c-nf/lib/adodb5/tests/test-datadict.php new file mode 100644 index 000000000..f821f8b5c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-datadict.php @@ -0,0 +1,250 @@ +<?php +/* + + V4.81 3 May 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Set tabs to 4 for best viewing. + +*/ + +error_reporting(E_ALL); +include_once('../adodb.inc.php'); + +foreach(array('sapdb','sybase','mysql','access','oci8po','odbc_mssql','odbc','db2','firebird','postgres','informix') as $dbType) { + echo "<h3>$dbType</h3><p>"; + $db = NewADOConnection($dbType); + $dict = NewDataDictionary($db); + + if (!$dict) continue; + $dict->debug = 1; + + $opts = array('REPLACE','mysql' => 'ENGINE=INNODB', 'oci8' => 'TABLESPACE USERS'); + +/* $flds = array( + array('id', 'I', + 'AUTO','KEY'), + + array('name' => 'firstname', 'type' => 'varchar','size' => 30, + 'DEFAULT'=>'Joan'), + + array('lastname','varchar',28, + 'DEFAULT'=>'Chen','key'), + + array('averylonglongfieldname','X',1024, + 'NOTNULL','default' => 'test'), + + array('price','N','7.2', + 'NOTNULL','default' => '0.00'), + + array('MYDATE', 'D', + 'DEFDATE'), + array('TS','T', + 'DEFTIMESTAMP') + );*/ + + $flds = " +ID I AUTO KEY, +FIRSTNAME VARCHAR(30) DEFAULT 'Joan' INDEX idx_name, +LASTNAME VARCHAR(28) DEFAULT 'Chen' key INDEX idx_name INDEX idx_lastname, +averylonglongfieldname X(1024) DEFAULT 'test', +price N(7.2) DEFAULT '0.00', +MYDATE D DEFDATE INDEX idx_date, +BIGFELLOW X NOTNULL, +TS_SECS T DEFTIMESTAMP, +TS_SUBSEC TS DEFTIMESTAMP +"; + + + $sqla = $dict->CreateDatabase('KUTU',array('postgres'=>"LOCATION='/u01/postdata'")); + $dict->SetSchema('KUTU'); + + $sqli = ($dict->CreateTableSQL('testtable',$flds, $opts)); + $sqla = array_merge($sqla,$sqli); + + $sqli = $dict->CreateIndexSQL('idx','testtable','price,firstname,lastname',array('BITMAP','FULLTEXT','CLUSTERED','HASH')); + $sqla = array_merge($sqla,$sqli); + $sqli = $dict->CreateIndexSQL('idx2','testtable','price,lastname');//,array('BITMAP','FULLTEXT','CLUSTERED')); + $sqla = array_merge($sqla,$sqli); + + $addflds = array(array('height', 'F'),array('weight','F')); + $sqli = $dict->AddColumnSQL('testtable',$addflds); + $sqla = array_merge($sqla,$sqli); + $addflds = array(array('height', 'F','NOTNULL'),array('weight','F','NOTNULL')); + $sqli = $dict->AlterColumnSQL('testtable',$addflds); + $sqla = array_merge($sqla,$sqli); + + + printsqla($dbType,$sqla); + + if (file_exists('d:\inetpub\wwwroot\php\phplens\adodb\adodb.inc.php')) + if ($dbType == 'mysqlt') { + $db->Connect('localhost', "root", "", "test"); + $dict->SetSchema(''); + $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds); + if ($sqla2) printsqla($dbType,$sqla2); + } + if ($dbType == 'postgres') { + if (@$db->Connect('localhost', "tester", "test", "test")); + $dict->SetSchema(''); + $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds); + if ($sqla2) printsqla($dbType,$sqla2); + } + + if ($dbType == 'odbc_mssql') { + $dsn = $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=localhost;Database=northwind;"; + if (@$db->Connect($dsn, "sa", "natsoft", "test")); + $dict->SetSchema(''); + $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds); + if ($sqla2) printsqla($dbType,$sqla2); + } + + + + adodb_pr($dict->databaseType); + printsqla($dbType, $dict->DropColumnSQL('table',array('my col','`col2_with_Quotes`','A_col3','col3(10)'))); + printsqla($dbType, $dict->ChangeTableSQL('adoxyz','LASTNAME varchar(32)')); + +} + +function printsqla($dbType,$sqla) +{ + print "<pre>"; + //print_r($dict->MetaTables()); + foreach($sqla as $s) { + $s = htmlspecialchars($s); + print "$s;\n"; + if ($dbType == 'oci8') print "/\n"; + } + print "</pre><hr />"; +} + +/*** + +Generated SQL: + +mysql + +CREATE DATABASE KUTU; +DROP TABLE KUTU.testtable; +CREATE TABLE KUTU.testtable ( +id INTEGER NOT NULL AUTO_INCREMENT, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) NOT NULL DEFAULT 'Chen', +averylonglongfieldname LONGTEXT NOT NULL, +price NUMERIC(7,2) NOT NULL DEFAULT 0.00, +MYDATE DATE DEFAULT CURDATE(), + PRIMARY KEY (id, lastname) +)TYPE=ISAM; +CREATE FULLTEXT INDEX idx ON KUTU.testtable (firstname,lastname); +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +ALTER TABLE KUTU.testtable ADD height DOUBLE; +ALTER TABLE KUTU.testtable ADD weight DOUBLE; +ALTER TABLE KUTU.testtable MODIFY COLUMN height DOUBLE NOT NULL; +ALTER TABLE KUTU.testtable MODIFY COLUMN weight DOUBLE NOT NULL; + + +-------------------------------------------------------------------------------- + +oci8 + +CREATE USER KUTU IDENTIFIED BY tiger; +/ +GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO KUTU; +/ +DROP TABLE KUTU.testtable CASCADE CONSTRAINTS; +/ +CREATE TABLE KUTU.testtable ( +id NUMBER(16) NOT NULL, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL, +averylonglongfieldname CLOB NOT NULL, +price NUMBER(7,2) DEFAULT 0.00 NOT NULL, +MYDATE DATE DEFAULT TRUNC(SYSDATE), + PRIMARY KEY (id, lastname) +)TABLESPACE USERS; +/ +DROP SEQUENCE KUTU.SEQ_testtable; +/ +CREATE SEQUENCE KUTU.SEQ_testtable; +/ +CREATE OR REPLACE TRIGGER KUTU.TRIG_SEQ_testtable BEFORE insert ON KUTU.testtable + FOR EACH ROW + BEGIN + select KUTU.SEQ_testtable.nextval into :new.id from dual; + END; +/ +CREATE BITMAP INDEX idx ON KUTU.testtable (firstname,lastname); +/ +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +/ +ALTER TABLE testtable ADD ( + height NUMBER, + weight NUMBER); +/ +ALTER TABLE testtable MODIFY( + height NUMBER NOT NULL, + weight NUMBER NOT NULL); +/ + + +-------------------------------------------------------------------------------- + +postgres +AlterColumnSQL not supported for PostgreSQL + + +CREATE DATABASE KUTU LOCATION='/u01/postdata'; +DROP TABLE KUTU.testtable; +CREATE TABLE KUTU.testtable ( +id SERIAL, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL, +averylonglongfieldname TEXT NOT NULL, +price NUMERIC(7,2) DEFAULT 0.00 NOT NULL, +MYDATE DATE DEFAULT CURRENT_DATE, + PRIMARY KEY (id, lastname) +); +CREATE INDEX idx ON KUTU.testtable USING HASH (firstname,lastname); +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +ALTER TABLE KUTU.testtable ADD height FLOAT8; +ALTER TABLE KUTU.testtable ADD weight FLOAT8; + + +-------------------------------------------------------------------------------- + +odbc_mssql + +CREATE DATABASE KUTU; +DROP TABLE KUTU.testtable; +CREATE TABLE KUTU.testtable ( +id INT IDENTITY(1,1) NOT NULL, +firstname VARCHAR(30) DEFAULT 'Joan', +lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL, +averylonglongfieldname TEXT NOT NULL, +price NUMERIC(7,2) DEFAULT 0.00 NOT NULL, +MYDATE DATETIME DEFAULT GetDate(), + PRIMARY KEY (id, lastname) +); +CREATE CLUSTERED INDEX idx ON KUTU.testtable (firstname,lastname); +CREATE INDEX idx2 ON KUTU.testtable (price,lastname); +ALTER TABLE KUTU.testtable ADD + height REAL, + weight REAL; +ALTER TABLE KUTU.testtable ALTER COLUMN height REAL NOT NULL; +ALTER TABLE KUTU.testtable ALTER COLUMN weight REAL NOT NULL; + + +-------------------------------------------------------------------------------- +*/ + + +echo "<h1>Test XML Schema</h1>"; +$ff = file('xmlschema.xml'); +echo "<pre>"; +foreach($ff as $xml) echo htmlspecialchars($xml); +echo "</pre>"; +include_once('test-xmlschema.php'); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-perf.php b/pos/is4c-nf/lib/adodb5/tests/test-perf.php new file mode 100644 index 000000000..37406d2dc --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-perf.php @@ -0,0 +1,50 @@ +<?php + +include_once('../adodb-perf.inc.php'); + +error_reporting(E_ALL); +session_start(); + +if (isset($_GET)) { + foreach($_GET as $k => $v) { + if (strncmp($k,'test',4) == 0) $_SESSION['_db'] = $k; + } +} + +if (isset($_SESSION['_db'])) { + $_db = $_SESSION['_db']; + $_GET[$_db] = 1; + $$_db = 1; +} + +echo "<h1>Performance Monitoring</h1>"; +include_once('testdatabases.inc.php'); + + +function testdb($db) +{ + if (!$db) return; + echo "<font size=1>";print_r($db->ServerInfo()); echo " user=".$db->user."</font>"; + + $perf = NewPerfMonitor($db); + + # unit tests + if (0) { + //$DB->debug=1; + echo "Data Cache Size=".$perf->DBParameter('data cache size').'<p>'; + echo $perf->HealthCheck(); + echo($perf->SuspiciousSQL()); + echo($perf->ExpensiveSQL()); + echo($perf->InvalidSQL()); + echo $perf->Tables(); + + echo "<pre>"; + echo $perf->HealthCheckCLI(); + $perf->Poll(3); + die(); + } + + if ($perf) $perf->UI(3); +} + +?> diff --git a/pos/is4c-nf/lib/adodb5/tests/test-pgblob.php b/pos/is4c-nf/lib/adodb5/tests/test-pgblob.php new file mode 100644 index 000000000..c190e5b85 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-pgblob.php @@ -0,0 +1,88 @@ +<?php + +function getmicrotime() +{ + $t = microtime(); + $t = explode(' ',$t); + return (float)$t[1]+ (float)$t[0]; +} + +function doloop() +{ +global $db,$MAX; + + $sql = "select id,firstname,lastname from adoxyz where + firstname not like ? and lastname not like ? and id=?"; + $offset = 0; + /*$sql = "select * from juris9.employee join juris9.emp_perf_plan on epp_empkey = emp_id + where emp_name not like ? and emp_name not like ? and emp_id=28000+?"; + $offset = 28000;*/ + for ($i=1; $i <= $MAX; $i++) { + $db->Param(false); + $x = (rand() % 10) + 1; + $db->debug= ($i==1); + $id = $db->GetOne($sql, + array('Z%','Z%',$x)); + if($id != $offset+$x) { + print "<p>Error at $x"; + break; + } + } +} + +include_once('../adodb.inc.php'); +$db = NewADOConnection('postgres7'); +$db->PConnect('localhost','tester','test','test') || die("failed connection"); + +$enc = "GIF89a%01%00%01%00%80%FF%00%C0%C0%C0%00%00%00%21%F9%04%01%00%00%00%00%2C%00%00%00%00%01%00%01%00%00%01%012%00%3Bt_clear.gif%0D"; +$val = rawurldecode($enc); + +$MAX = 1000; + +adodb_pr($db->ServerInfo()); + +echo "<h4>Testing PREPARE/EXECUTE PLAN</h4>"; + + +$db->_bindInputArray = true; // requires postgresql 7.3+ and ability to modify database +$t = getmicrotime(); +doloop(); +echo '<p>',$MAX,' times, with plan=',getmicrotime() - $t,'</p>'; + + +$db->_bindInputArray = false; +$t = getmicrotime(); +doloop(); +echo '<p>',$MAX,' times, no plan=',getmicrotime() - $t,'</p>'; + + + +echo "<h4>Testing UPDATEBLOB</h4>"; +$db->debug=1; + +### TEST BEGINS + +$db->Execute("insert into photos (id,name) values(9999,'dot.gif')"); +$db->UpdateBlob('photos','photo',$val,'id=9999'); +$v = $db->GetOne('select photo from photos where id=9999'); + + +### CLEANUP + +$db->Execute("delete from photos where id=9999"); + +### VALIDATION + +if ($v !== $val) echo "<b>*** ERROR: Inserted value does not match downloaded val<b>"; +else echo "<b>*** OK: Passed</b>"; + +echo "<pre>"; +echo "INSERTED: ", $enc; +echo "<hr />"; +echo"RETURNED: ", rawurlencode($v); +echo "<hr /><p>"; +echo "INSERTED: ", $val; +echo "<hr />"; +echo "RETURNED: ", $v; + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-php5.php b/pos/is4c-nf/lib/adodb5/tests/test-php5.php new file mode 100644 index 000000000..689aeea78 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-php5.php @@ -0,0 +1,115 @@ +<?php +/* + V4.81 3 May 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + */ + + +error_reporting(E_ALL); + +$path = dirname(__FILE__); + +include("$path/../adodb-exceptions.inc.php"); +include("$path/../adodb.inc.php"); + +echo "<h3>PHP ".PHP_VERSION."</h3>\n"; +try { + +$dbt = 'oci8po'; + +try { +switch($dbt) { +case 'oci8po': + $db = NewADOConnection("oci8po"); + + $db->Connect('localhost','scott','natsoft','sherkhan'); + break; +default: +case 'mysql': + $db = NewADOConnection("mysql"); + $db->Connect('localhost','root','','northwind'); + break; + +case 'mysqli': + $db = NewADOConnection("mysqli://root:@localhost/northwind"); + //$db->Connect('localhost','root','','test'); + break; +} +} catch (exception $e){ + echo "Connect Failed"; + adodb_pr($e); + die(); +} + +$db->debug=1; + +$cnt = $db->GetOne("select count(*) from adoxyz where ?<id and id<?",array(10,20)); +$stmt = $db->Prepare("select * from adoxyz where ?<id and id<?"); +if (!$stmt) echo $db->ErrorMsg(),"\n"; +$rs = $db->Execute($stmt,array(10,20)); + +echo "<hr /> Foreach Iterator Test (rand=".rand().")<hr />"; +$i = 0; +foreach($rs as $v) { + $i += 1; + echo "rec $i: "; $s1 = adodb_pr($v,true); $s2 = adodb_pr($rs->fields,true); + if ($s1 != $s2 && !empty($v)) {adodb_pr($s1); adodb_pr($s2);} + else echo "passed<br>"; + flush(); +} + +$rs = new ADORecordSet_empty(); +foreach($rs as $v) { + echo "<p>empty ";var_dump($v); +} + + +if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); +else echo "Count $i is correct<br>"; + +$rs = $db->Execute("select bad from badder"); + +} catch (exception $e) { + adodb_pr($e); + echo "<h3>adodb_backtrace:</h3>\n"; + $e = adodb_backtrace($e->gettrace()); +} + +$rs = $db->Execute("select distinct id, firstname,lastname from adoxyz order by id"); +echo "Result=\n",$rs,"</p>"; + +echo "<h3>Active Record</h3>"; + + include_once("../adodb-active-record.inc.php"); + ADOdb_Active_Record::SetDatabaseAdapter($db); + +try { + class City extends ADOdb_Active_Record{}; + $a = new City(); + +} catch(exception $e){ + echo $e->getMessage(); +} + +try { + + $a = new City(); + + echo "<p>Successfully created City()<br>"; + #var_dump($a->GetPrimaryKeys()); + $a->city = 'Kuala Lumpur'; + $a->Save(); + $a->Update(); + #$a->SetPrimaryKeys(array('city')); + $a->country = "M'sia"; + $a->save(); + $a->Delete(); +} catch(exception $e){ + echo $e->getMessage(); +} + +//include_once("test-active-record.php"); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test-xmlschema.php b/pos/is4c-nf/lib/adodb5/tests/test-xmlschema.php new file mode 100644 index 000000000..2d15c111b --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test-xmlschema.php @@ -0,0 +1,54 @@ +<?PHP + +// V4.50 6 July 2004 + +error_reporting(E_ALL); +include_once( "../adodb.inc.php" ); +include_once( "../adodb-xmlschema03.inc.php" ); + +// To build the schema, start by creating a normal ADOdb connection: +$db = ADONewConnection( 'mysql' ); +$db->Connect( 'localhost', 'root', '', 'test' ) || die('fail connect1'); + +// To create a schema object and build the query array. +$schema = new adoSchema( $db ); + +// To upgrade an existing schema object, use the following +// To upgrade an existing database to the provided schema, +// uncomment the following line: +#$schema->upgradeSchema(); + +print "<b>SQL to build xmlschema.xml</b>:\n<pre>"; +// Build the SQL array +$sql = $schema->ParseSchema( "xmlschema.xml" ); + +var_dump( $sql ); +print "</pre>\n"; + +// Execute the SQL on the database +//$result = $schema->ExecuteSchema( $sql ); + +// Finally, clean up after the XML parser +// (PHP won't do this for you!) +//$schema->Destroy(); + + + +print "<b>SQL to build xmlschema-mssql.xml</b>:\n<pre>"; + +$db2 = ADONewConnection('mssql'); +$db2->Connect('','adodb','natsoft','northwind') || die("Fail 2"); + +$db2->Execute("drop table simple_table"); + +$schema = new adoSchema( $db2 ); +$sql = $schema->ParseSchema( "xmlschema-mssql.xml" ); + +print_r( $sql ); +print "</pre>\n"; + +$db2->debug=1; + +foreach ($sql as $s) +$db2->Execute($s); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test.php b/pos/is4c-nf/lib/adodb5/tests/test.php new file mode 100644 index 000000000..baa73a579 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test.php @@ -0,0 +1,1748 @@ +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + + +//if (!defined('E_STRICT')) define('E_STRICT',0); +error_reporting(E_ALL|E_STRICT); + +$ADODB_FLUSH = true; + +define('ADODB_ASSOC_CASE',0); + + +function getmicrotime() +{ + $t = microtime(); + $t = explode(' ',$t); + return (float)$t[1]+ (float)$t[0]; +} + + +if (PHP_VERSION < 5) include_once('../adodb-pear.inc.php'); +//-------------------------------------------------------------------------------------- +//define('ADODB_ASSOC_CASE',1); +// +function Err($msg) +{ + print "<b>$msg</b><br>"; + flush(); +} + +function CheckWS($conn) +{ +global $ADODB_EXTENSION; + + include_once('../session/adodb-session.php'); + if (defined('CHECKWSFAIL')){ echo " TESTING $conn ";flush();} + $saved = $ADODB_EXTENSION; + $db = ADONewConnection($conn); + $ADODB_EXTENSION = $saved; + if (headers_sent()) { + print "<p><b>White space detected in adodb-$conn.inc.php or include file...</b></p>"; + //die(); + } +} + +function do_strtolower(&$arr) +{ + foreach($arr as $k => $v) { + if (is_object($v)) $arr[$k] = adodb_pr($v,true); + else $arr[$k] = strtolower($v); + } +} + + +function CountExecs($db, $sql, $inputarray) +{ +global $EXECS; $EXECS++; +} + +function CountCachedExecs($db, $secs2cache, $sql, $inputarray) +{ +global $CACHED; $CACHED++; +} + +// the table creation code is specific to the database, so we allow the user +// to define their own table creation stuff + +function testdb(&$db,$createtab="create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)") +{ +GLOBAL $ADODB_vers,$ADODB_CACHE_DIR,$ADODB_FETCH_MODE,$ADODB_COUNTRECS; + + //adodb_pr($db); + +?> <form method=GET> + </p> + <table width=100% ><tr><td bgcolor=beige>&nbsp;</td></tr></table> + </p> +<?php + $create =false; + /*$ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $rs = $db->Execute('select lastname,firstname,lastname,id from ADOXYZ'); + $arr = $rs->GetAssoc(); + echo "<pre>";print_r($arr); + die();*/ + + if (!$db) die("testdb: database not inited"); + GLOBAL $EXECS, $CACHED; + + $EXECS = 0; + $CACHED = 0; + //$db->Execute("drop table adodb_logsql"); + if ((rand()%3) == 0) @$db->Execute("delete from adodb_logsql"); + $db->debug=1; + + $db->fnExecute = 'CountExecs'; + $db->fnCacheExecute = 'CountCachedExecs'; + + if (empty($_GET['nolog'])) { + echo "<h3>SQL Logging enabled</h3>"; + $db->LogSQL();/* + $sql = +"SELECT t1.sid, t1.sid, t1.title, t1.hometext, t1.notes, t1.aid, t1.informant, +t2.url, t2.email, t1.catid, t3.title, t1.topic, t4.topicname, t4.topicimage, +t4.topictext, t1.score, t1.ratings, t1.counter, t1.comments, t1.acomm +FROM `nuke_stories` `t1`, `nuke_authors` `t2`, `nuke_stories_cat` `t3`, `nuke_topics` `t4` + WHERE ((t2.aid=t1.aid) AND (t3.catid=t1.catid) AND (t4.topicid=t1.topic) + AND ((t1.alanguage='german') OR (t1.alanguage='')) AND (t1.ihome='0')) + ORDER BY t1.time DESC"; + $db->SelectLimit($sql); + echo $db->ErrorMsg();*/ + } + $ADODB_CACHE_DIR = dirname(TempNam('/tmp','testadodb')); + $db->debug = false; + //print $db->UnixTimeStamp('2003-7-22 23:00:00'); + + $phpv = phpversion(); + if (defined('ADODB_EXTENSION')) $ext = ' &nbsp; Extension '.ADODB_EXTENSION.' installed'; + else $ext = ''; + print "<h3>ADODB Version: $ADODB_vers Host: <i>$db->host</i> &nbsp; Database: <i>$db->database</i> &nbsp; PHP: $phpv $ext</h3>"; + + flush(); + + if (function_exists('date_default_timezone_set')) date_default_timezone_set('Asia/Kuala_Lumpur'); + + $arr = $db->ServerInfo(); + print_r($arr); + echo E_ALL,' ',E_STRICT, "<br>"; + $e = error_reporting(E_ALL | E_STRICT); + echo error_reporting(),'<p>'; + flush(); + #$db->debug=1; + $tt = $db->Time(); + if ($tt == 0) echo '<br><b>$db->Time failed</b>'; + else echo "<br>db->Time: ".date('d-m-Y H:i:s',$tt); + echo '<br>'; + + echo "Date=",$db->UserDate('2002-04-07'),'<br>'; + print "<i>date1</i> (1969-02-20) = ".$db->DBDate('1969-2-20'); + print "<br><i>date1</i> (1999-02-20) = ".$db->DBDate('1999-2-20'); + print "<br><i>date1.1</i> 1999 = ".$db->DBDate("'1999'"); + print "<br><i>date2</i> (1970-1-2) = ".$db->DBDate(24*3600)."<p>"; + print "<i>ts1</i> (1999-02-20 13:40:50) = ".$db->DBTimeStamp('1999-2-20 1:40:50 pm'); + print "<br><i>ts1.1</i> (1999-02-20 13:40:00) = ".$db->DBTimeStamp('1999-2-20 13:40'); + print "<br><i>ts2</i> (1999-02-20) = ".$db->DBTimeStamp('1999-2-20'); + print "<br><i>ts3</i> (1970-1-2 +/- timezone) = ".$db->DBTimeStamp(24*3600); + print "<br> Fractional TS (1999-2-20 13:40:50.91): ".$db->DBTimeStamp($db->UnixTimeStamp('1999-2-20 13:40:50.91+1')); + $dd = $db->UnixDate('1999-02-20'); + print "<br>unixdate</i> 1999-02-20 = ".date('Y-m-d',$dd)."<p>"; + print "<br><i>ts4</i> =".($db->UnixTimeStamp("19700101000101")+8*3600); + print "<br><i>ts5</i> =".$db->DBTimeStamp($db->UnixTimeStamp("20040110092123")); + print "<br><i>ts6</i> =".$db->UserTimeStamp("20040110092123"); + print "<br><i>ts7</i> =".$db->DBTimeStamp("20040110092123"); + flush(); + // mssql too slow in failing bad connection + if (false && $db->databaseType != 'mssql') { + print "<p>Testing bad connection. Ignore following error msgs:<br>"; + $db2 = ADONewConnection(); + $rez = $db2->Connect("bad connection"); + $err = $db2->ErrorMsg(); + print "<i>Error='$err'</i></p>"; + if ($rez) print "<b>Cannot check if connection failed.</b> The Connect() function returned true.</p>"; + } + #error_reporting($e); + flush(); + + //$ADODB_COUNTRECS=false; + $rs=$db->Execute('select * from ADOXYZ order by id'); + if($rs === false) $create = true; + else $rs->Close(); + + //if ($db->databaseType !='vfp') $db->Execute("drop table ADOXYZ"); + + if ($create) { + if (false && $db->databaseType == 'ibase') { + print "<b>Please create the following table for testing:</b></p>$createtab</p>"; + return; + } else { + $db->debug = 99; + # $e = error_reporting(E_ALL-E_WARNING); + $db->Execute($createtab); + # error_reporting($e); + } + } + #error_reporting(E_ALL); + echo "<p>Testing Metatypes</p>"; + $t = $db->MetaType('varchar'); + if ($t != 'C') Err("Bad Metatype for varchar"); + + $rs = $db->Execute("delete from ADOXYZ"); // some ODBC drivers will fail the drop so we delete + if ($rs) { + if(! $rs->EOF) print "<b>Error: </b>RecordSet returned by Execute('delete...') should show EOF</p>"; + $rs->Close(); + } else print "err=".$db->ErrorMsg(); + + print "<p>Test select on empty table, FetchField when EOF, and GetInsertSQL</p>"; + $rs = $db->Execute("select id,firstname from ADOXYZ where id=9999"); + if ($rs && !$rs->EOF) print "<b>Error: </b>RecordSet returned by Execute(select...') on empty table should show EOF</p>"; + if ($rs->EOF && (($ox = $rs->FetchField(0)) && !empty($ox->name))) { + $record['id'] = 99; + $record['firstname'] = 'John'; + $sql = $db->GetInsertSQL($rs, $record); + if (strtoupper($sql) != strtoupper("INSERT INTO ADOXYZ ( id, firstname ) VALUES ( 99, 'John' )")) Err("GetInsertSQL does not work on empty table: $sql"); + } else { + Err("FetchField does not work on empty recordset, meaning GetInsertSQL will fail..."); + } + if ($rs) $rs->Close(); + flush(); + //$db->debug=true; + print "<p>Testing Commit: "; + $time = $db->DBDate(time()); + if (!$db->BeginTrans()) { + print '<b>Transactions not supported</b></p>'; + if ($db->hasTransactions) Err("hasTransactions should be false"); + } else { /* COMMIT */ + if (!$db->hasTransactions) Err("hasTransactions should be true"); + if ($db->transCnt != 1) Err("Invalid transCnt = $db->transCnt (should be 1)"); + $rs = $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (99,'Should Not','Exist (Commit)',$time)"); + if ($rs && $db->CommitTrans()) { + $rs->Close(); + $rs = $db->Execute("select * from ADOXYZ where id=99"); + if ($rs === false || $rs->EOF) { + print '<b>Data not saved</b></p>'; + $rs = $db->Execute("select * from ADOXYZ where id=99"); + print_r($rs); + die(); + } else print 'OK</p>'; + if ($rs) $rs->Close(); + } else { + if (!$rs) { + print "<b>Insert failed</b></p>"; + $db->RollbackTrans(); + } else print "<b>Commit failed</b></p>"; + } + if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)"); + + /* ROLLBACK */ + if (!$db->BeginTrans()) print "<p><b>Error in BeginTrans</b>()</p>"; + print "<p>Testing Rollback: "; + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (100,'Should Not','Exist (Rollback)',$time)"); + if ($db->RollbackTrans()) { + $rs = $db->Execute("select * from ADOXYZ where id=100"); + if ($rs && !$rs->EOF) print '<b>Fail: Data should rollback</b></p>'; + else print 'OK</p>'; + if ($rs) $rs->Close(); + } else + print "<b>Commit failed</b></p>"; + + $rs = $db->Execute('delete from ADOXYZ where id>50'); + if ($rs) $rs->Close(); + + if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)"); + } + + if (1) { + print "<p>Testing MetaDatabases()</p>"; + print_r( $db->MetaDatabases()); + + print "<p>Testing MetaTables() and MetaColumns()</p>"; + $a = $db->MetaTables(); + if ($a===false) print "<b>MetaTables not supported</b></p>"; + else { + print "Array of tables and views: "; + foreach($a as $v) print " ($v) "; + print '</p>'; + } + + $a = $db->MetaTables('VIEW'); + if ($a===false) print "<b>MetaTables not supported (views)</b></p>"; + else { + print "Array of views: "; + foreach($a as $v) print " ($v) "; + print '</p>'; + } + + $a = $db->MetaTables(false,false,'aDo%'); + if ($a===false) print "<b>MetaTables not supported (mask)</b></p>"; + else { + print "Array of ado%: "; + foreach($a as $v) print " ($v) "; + print '</p>'; + } + + $a = $db->MetaTables('TABLE'); + if ($a===false) print "<b>MetaTables not supported</b></p>"; + else { + print "Array of tables: "; + foreach($a as $v) print " ($v) "; + print '</p>'; + } + + $db->debug=0; + $rez = $db->MetaColumns("NOSUCHTABLEHERE"); + if ($rez !== false) { + Err("MetaColumns error handling failed"); + var_dump($rez); + } + $db->debug=1; + $a = $db->MetaColumns('ADOXYZ'); + if ($a===false) print "<b>MetaColumns not supported</b></p>"; + else { + print "<p>Columns of ADOXYZ: <font size=1><br>"; + foreach($a as $v) {print_r($v); echo "<br>";} + echo "</font>"; + } + + print "<p>Testing MetaIndexes</p>"; + + $a = $db->MetaIndexes(('ADOXYZ'),true); + if ($a===false) print "<b>MetaIndexes not supported</b></p>"; + else { + print "<p>Indexes of ADOXYZ: <font size=1><br>"; + adodb_pr($a); + echo "</font>"; + } + print "<p>Testing MetaPrimaryKeys</p>"; + $a = $db->MetaPrimaryKeys('ADOXYZ'); + var_dump($a); + } + $rs = $db->Execute('delete from ADOXYZ'); + if ($rs) $rs->Close(); + + $db->debug = false; + + + switch ($db->databaseType) { + case 'vfp': + + if (0) { + // memo test + $rs = $db->Execute("select data from memo"); + rs2html($rs); + } + break; + + case 'postgres7': + case 'postgres64': + case 'postgres': + case 'ibase': + print "<p>Encode=".$db->BlobEncode("abc\0d\"' +ef")."</p>";//' + + print "<p>Testing Foreign Keys</p>"; + $arr = $db->MetaForeignKeys('ADOXYZ',false,true); + print_r($arr); + if (!$arr) Err("No MetaForeignKeys"); + break; + + case 'odbc_mssql': + case 'mssqlpo': + print "<p>Testing Foreign Keys</p>"; + $arr = $db->MetaForeignKeys('Orders',false,true); + print_r($arr); + if (!$arr) Err("Bad MetaForeignKeys"); + if ($db->databaseType == 'odbc_mssql') break; + + case 'mssql': + + +/* +ASSUME Northwind available... + +CREATE PROCEDURE SalesByCategory + @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998' +AS +IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' +BEGIN + SELECT @OrdYear = '1998' +END + +SELECT ProductName, + TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0) +FROM [Order Details] OD, Orders O, Products P, Categories C +WHERE OD.OrderID = O.OrderID + AND OD.ProductID = P.ProductID + AND P.CategoryID = C.CategoryID + AND C.CategoryName = @CategoryName + AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear +GROUP BY ProductName +ORDER BY ProductName +GO + + +CREATE PROCEDURE ADODBTestSP +@a nvarchar(25) +AS +SELECT GETDATE() AS T, @a AS A +GO +*/ + print "<h4>Testing Stored Procedures for mssql</h4>"; + $saved = $db->debug; + $db->debug=true; + $assoc = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $cmd = $db->PrepareSP('ADODBTestSP'); + $ss = "You should see me in the output."; + $db->InParameter($cmd,$ss,'a'); + $rs = $db->Execute($cmd); + #var_dump($rs->fields); + echo $rs->fields['T']." --- ".$rs->fields['A']."---<br>"; + + $cat = 'Dairy Products'; + $yr = '1998'; + + $stmt = $db->PrepareSP('SalesByCategory'); + $db->InParameter($stmt,$cat,'CategoryName'); + $db->InParameter($stmt,$yr,'OrdYear'); + $rs = $db->Execute($stmt); + rs2html($rs); + + $cat = 'Grains/Cereals'; + $yr = 1998; + + $stmt = $db->PrepareSP('SalesByCategory'); + $db->InParameter($stmt,$cat,'CategoryName'); + $db->InParameter($stmt,$yr,'OrdYear'); + $rs = $db->Execute($stmt); + rs2html($rs); + + $ADODB_FETCH_MODE = $assoc; + + /* + Test out params - works in PHP 4.2.3 and 4.3.3 and 4.3.8 but not 4.3.0: + + CREATE PROCEDURE at_date_interval + @days INTEGER, + @start VARCHAR(20) OUT, + @end VARCHAR(20) OUT + AS + BEGIN + set @start = CONVERT(VARCHAR(20), getdate(), 101) + set @end =CONVERT(VARCHAR(20), dateadd(day, @days, getdate()), 101 ) + END + GO + */ + $db->debug=1; + $stmt = $db->PrepareSP('at_date_interval'); + $days = 10; + $begin_date = ''; + $end_date = ''; + $db->InParameter($stmt,$days,'days', 4, SQLINT4); + $db->OutParameter($stmt,$begin_date,'start', 20, SQLVARCHAR ); + $db->OutParameter($stmt,$end_date,'end', 20, SQLVARCHAR ); + $db->Execute($stmt); + if (empty($begin_date) or empty($end_date) or $begin_date == $end_date) { + Err("MSSQL SP Test for OUT Failed"); + print "begin=$begin_date end=$end_date<p>"; + } else print "(Today +10days) = (begin=$begin_date end=$end_date)<p>"; + + $db->debug = $saved; + break; + case 'oci8': + case 'oci8po': + + if (0) { + $t = getmicrotime(); + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $arr = $db->GetArray('select * from abalone_tree'); + $arr = $db->GetArray('select * from abalone_tree'); + $arr = $db->GetArray('select * from abalone_tree'); + echo "<p>t = ",getmicrotime() - $t,"</p>"; + die(); + } + + # cleanup + $db->Execute("delete from photos where id=99 or id=1"); + $db->Execute("insert into photos (id) values(1)"); + $db->Execute("update photos set photo=null,descclob=null where id=1"); + + $saved = $db->debug; + $db->debug=true; + + + + /* + CREATE TABLE PHOTOS + ( + ID NUMBER(16) primary key, + PHOTO BLOB, + DESCRIPTION VARCHAR2(4000 BYTE), + DESCCLOB CLOB + ); + + INSERT INTO PHOTOS (ID) VALUES(1); + */ + $s = ''; + for ($i = 0; $i <= 500; $i++) { + $s .= '1234567890'; + } + + $sql = "INSERT INTO photos ( ID, photo) ". + "VALUES ( :id, empty_blob() )". + " RETURNING photo INTO :xx"; + + + $blob_data = $s; + $id = 99; + + $stmt = $db->PrepareSP($sql); + $db->InParameter($stmt, $id, 'id'); + $blob = $db->InParameter($stmt, $s, 'xx',-1, OCI_B_BLOB); + $db->StartTrans(); + $result = $db->Execute($stmt); + $db->CompleteTrans(); + + $s2= $db->GetOne("select photo from photos where id=99"); + echo "<br>---$s2"; + if ($s !== $s2) Err("insert blob does not match"); + + print "<h4>Testing Blob: size=".strlen($s)."</h4>"; + $ok = $db->Updateblob('photos','photo',$s,'id=1'); + if (!$ok) Err("Blob failed 1"); + else { + $s2= $db->GetOne("select photo from photos where id=1"); + if ($s !== $s2) Err("updateblob does not match"); + } + + print "<h4>Testing Clob: size=".strlen($s)."</h4>"; + $ok = $db->UpdateClob('photos','descclob',$s,'id=1'); + if (!$ok) Err("Clob failed 1"); + else { + $s2= $db->GetOne("select descclob from photos where id=1"); + if ($s !== $s2) Err("updateclob does not match"); + } + + + $s = ''; + $s2 = ''; + print "<h4>Testing Foreign Keys</h4>"; + $arr = $db->MetaForeignKeys('emp','scott'); + print_r($arr); + if (!$arr) Err("Bad MetaForeignKeys"); +/* +-- TEST PACKAGE +-- "Set scan off" turns off substitution variables. +Set scan off; + +CREATE OR REPLACE PACKAGE Adodb AS +TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE; +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR); +PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) ; +PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR); +PROCEDURE data_in(input IN VARCHAR); +PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER); +END Adodb; +/ + + +CREATE OR REPLACE PACKAGE BODY Adodb AS +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS + BEGIN + OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames; + END open_tab; + + PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS + BEGIN + OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames; + tablenames := 'TEST'; + END open_tab2; + +PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS + BEGIN + output := 'Cinta Hati '||input; + END; + +PROCEDURE data_in(input IN VARCHAR) IS + ignore varchar(1000); + BEGIN + ignore := input; + END; + +PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER) AS +BEGIN +p2 := p1; +END; +END Adodb; +/ + +*/ + + print "<h4>Testing Cursor Variables</h4>"; + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:zz,'A%'); END;",'zz'); + + if ($rs && !$rs->EOF) { + $v = $db->GetOne("SELECT count(*) FROM tab where tname like 'A%'"); + if ($v == $rs->RecordCount()) print "Test 1 RowCount: OK<p>"; + else Err("Test 1 RowCount ".$rs->RecordCount().", actual = $v"); + } else { + print "<b>Error in using Cursor Variables 1</b><p>"; + } + $rs->Close(); + + print "<h4>Testing Stored Procedures for oci8</h4>"; + + $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;"); + $a1 = 'Malaysia'; + //$a2 = ''; # a2 doesn't even need to be defined! + $db->InParameter($stmt,$a1,'a1'); + $db->OutParameter($stmt,$a2,'a2'); + $rs = $db->Execute($stmt); + if ($rs) { + if ($a2 !== 'Cinta Hati Malaysia') print "<b>Stored Procedure Error: a2 = $a2</b><p>"; + else echo "OK: a2=$a2<p>"; + } else { + print "<b>Error in using Stored Procedure IN/Out Variables</b><p>"; + } + + $tname = 'A%'; + + $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); + $db->Parameter($stmt,$tname,'tablename'); + $rs = $db->Execute($stmt); + rs2html($rs); + + $stmt = $db->PrepareSP("begin adodb.data_in(:a1); end;"); + $db->InParameter($stmt,$a1,'a1'); + $db->Execute($stmt); + + $db->debug = $saved; + break; + + default: + break; + } + $arr = array( + array(1,'Caroline','Miranda'), + array(2,'John','Lim'), + array(3,'Wai Hun','See') + ); + //$db->debug=1; + print "<p>Testing Bulk Insert of 3 rows</p>"; + + $sql = "insert into ADOXYZ (id,firstname,lastname) values (".$db->Param('0').",".$db->Param('1').",".$db->Param('2').")"; + $db->StartTrans(); + $db->Execute($sql,$arr); + $db->CompleteTrans(); + $rs = $db->Execute('select * from ADOXYZ order by id'); + if (!$rs || $rs->RecordCount() != 3) Err("Bad bulk insert"); + + rs2html($rs); + + $db->Execute('delete from ADOXYZ'); + + print "<p>Inserting 50 rows</p>"; + + for ($i = 0; $i < 5; $i++) { + + $time = $db->DBDate(time()); + if (empty($_GET['hide'])) $db->debug = true; + switch($db->databaseType){ + case 'mssqlpo': + case 'mssql': + $sqlt = "CREATE TABLE mytable ( + row1 INT IDENTITY(1,1) NOT NULL, + row2 varchar(16), + PRIMARY KEY (row1))"; + //$db->debug=1; + if (!$db->Execute("delete from mytable")) + $db->Execute($sqlt); + + $ok = $db->Execute("insert into mytable (row2) values ('test')"); + $ins_id=$db->Insert_ID(); + echo "Insert ID=";var_dump($ins_id); + if ($ins_id == 0) Err("Bad Insert_ID()"); + $ins_id2 = $db->GetOne("select row1 from mytable"); + if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2"); + + $arr = array(0=>'Caroline',1=>'Miranda'); + $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)"; + break; + case 'mysqli': + case 'mysqlt': + case 'mysql': + $sqlt = "CREATE TABLE `mytable` ( + `row1` int(11) NOT NULL auto_increment, + `row2` varchar(16) NOT NULL default '', + PRIMARY KEY (`row1`), + KEY `myindex` (`row1`,`row2`) +) "; + if (!$db->Execute("delete from mytable")) + $db->Execute($sqlt); + + $ok = $db->Execute("insert into mytable (row2) values ('test')"); + $ins_id=$db->Insert_ID(); + echo "Insert ID=";var_dump($ins_id); + if ($ins_id == 0) Err("Bad Insert_ID()"); + $ins_id2 = $db->GetOne("select row1 from mytable"); + if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2"); + + default: + $arr = array(0=>'Caroline',1=>'Miranda'); + $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)"; + break; + + case 'oci8': + case 'oci805': + $arr = array('first'=>'Caroline','last'=>'Miranda'); + $amt = rand() % 100; + $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,:first,:last,$time)"; + break; + } + if ($i & 1) { + $sql = $db->Prepare($sql); + } + $rs = $db->Execute($sql,$arr); + + if ($rs === false) Err( 'Error inserting with parameters'); + else $rs->Close(); + $db->debug = false; + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+1,'John','Lim',$time)"); + /*$ins_id=$db->Insert_ID(); + echo "Insert ID=";var_dump($ins_id);*/ + if ($db->databaseType == 'mysql') if ($ins_id == 0) Err('Bad Insert_ID'); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+2,'Mary','Lamb',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+3,'George','Washington',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+4,'Mr. Alan','Tam',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+5,'Alan',".$db->quote("Turing'ton").",$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created)values ($i*10+6,'Serena','Williams',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+7,'Yat Sun','Sun',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+8,'Wai Hun','See',$time )"); + $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+9,'Steven','Oey',$time )"); + } // for + if (1) { + $db->debug=1; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $cnt = $db->GetOne("select count(*) from ADOXYZ"); + $rs = $db->Execute('update ADOXYZ set id=id+1'); + if (!is_object($rs)) { + print_r($rs); + err("Update should return object"); + } + if (!$rs) err("Update generated error"); + + $nrows = $db->Affected_Rows(); + if ($nrows === false) print "<p><b>Affected_Rows() not supported</b></p>"; + else if ($nrows != $cnt) print "<p><b>Affected_Rows() Error: $nrows returned (should be 50) </b></p>"; + else print "<p>Affected_Rows() passed</p>"; + } + + if ($db->dataProvider == 'oci8') $array = array('zid'=>1,'zdate'=>date('Y-m-d',time())); + else $array=array(1,date('Y-m-d',time())); + + + #$array = array(1,date('Y-m-d',time())); + $id = $db->GetOne("select id from ADOXYZ + where id=".$db->Param('zid')." and created>=".$db->Param('ZDATE')."", + $array); + if ($id != 1) Err("Bad bind; id=$id"); + else echo "<br>Bind date/integer 1 passed"; + + $array =array(1,$db->BindDate(time())); + $id = $db->GetOne("select id from ADOXYZ + where id=".$db->Param('0')." and created>=".$db->Param('1')."", + $array); + if ($id != 1) Err("Bad bind; id=$id"); + else echo "<br>Bind date/integer 2 passed"; + + $db->debug = false; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + ////////////////////////////////////////////////////////////////////////////////////////// + + $rs = $db->Execute("select * from ADOXYZ where firstname = 'not known'"); + if (!$rs || !$rs->EOF) print "<p><b>Error on empty recordset</b></p>"; + else if ($rs->RecordCount() != 0) { + print "<p><b>Error on RecordCount. Should be 0. Was ".$rs->RecordCount()."</b></p>"; + print_r($rs->fields); + } + if ($db->databaseType !== 'odbc') { + $rs = $db->Execute("select id,firstname,lastname,created,".$db->random." from ADOXYZ order by id"); + if ($rs) { + if ($rs->RecordCount() != 50) { + print "<p><b>RecordCount returns ".$rs->RecordCount().", should be 50</b></p>"; + adodb_pr($rs->GetArray()); + $poc = $rs->PO_RecordCount('ADOXYZ'); + if ($poc == 50) print "<p> &nbsp; &nbsp; PO_RecordCount passed</p>"; + else print "<p><b>PO_RecordCount returns wrong value: $poc</b></p>"; + } else print "<p>RecordCount() passed</p>"; + if (isset($rs->fields['firstname'])) print '<p>The fields columns can be indexed by column name.</p>'; + else { + Err( '<p>The fields columns <i>cannot</i> be indexed by column name.</p>'); + print_r($rs->fields); + } + if (empty($_GET['hide'])) rs2html($rs); + } + else print "<p><b>Error in Execute of SELECT with random</b></p>"; + } + $val = $db->GetOne("select count(*) from ADOXYZ"); + if ($val == 50) print "<p>GetOne returns ok</p>"; + else print "<p><b>Fail: GetOne returns $val</b></p>"; + + echo "<b>GetRow Test</b>"; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $val1 = $db->GetRow("select count(*) from ADOXYZ"); + $val2 = $db->GetRow("select count(*) from ADOXYZ"); + if ($val1[0] == 50 and sizeof($val1) == 1 and $val2[0] == 50 and sizeof($val2) == 1) print "<p>GetRow returns ok</p>"; + else { + print_r($val); + print "<p><b>Fail: GetRow returns {$val2[0]}</b></p>"; + } + + print "<p>FetchObject/FetchNextObject Test</p>"; + $rs = $db->Execute('select * from ADOXYZ'); + if ($rs) { + if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>"; + + while ($o = $rs->FetchNextObject()) { // calls FetchObject internally + if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) { + print_r($o); + print "<p><b>Firstname is not string</b></p>"; + break; + } + } + } else { + print "<p><b>Failed rs</b></p>"; + die("<p>ADOXYZ table cannot be read - die()"); + } + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + print "<p>FetchObject/FetchNextObject Test 2</p>"; + #$db->debug=99; + $rs = $db->Execute('select * from ADOXYZ'); + if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>"; + print_r($rs->fields); + while ($o = $rs->FetchNextObject()) { // calls FetchObject internally + if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) { + print_r($o); + print "<p><b>Firstname is not string</b></p>"; + break; + } + } + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + $savefetch = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + print "<p>CacheSelectLimit Test...</p>"; + $db->debug=1; + $rs = $db->CacheSelectLimit('select id, firstname from ADOXYZ order by id',2); + + if ($rs && !$rs->EOF) { + if (isset($rs->fields[0])) { + Err("ASSOC has numeric fields"); + print_r($rs->fields); + } + if ($rs->fields['id'] != 1) {Err("Error"); print_r($rs->fields);}; + if (trim($rs->fields['firstname']) != 'Caroline') {print Err("Error 2"); print_r($rs->fields);}; + + $rs->MoveNext(); + if ($rs->fields['id'] != 2) {Err("Error 3"); print_r($rs->fields);}; + $rs->MoveNext(); + if (!$rs->EOF) { + Err("Error EOF"); + print_r($rs); + } + } + + print "<p>FETCH_MODE = ASSOC: Should get 1, Caroline</p>"; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',2); + if ($rs && !$rs->EOF) { + if (ADODB_ASSOC_CASE == 2) { + $id = 'ID'; + $fname = 'FIRSTNAME'; + }else { + $id = 'id'; + $fname = 'firstname'; + } + if ($rs->fields[$id] != 1) {Err("Error 1"); print_r($rs->fields);}; + if (trim($rs->fields[$fname]) != 'Caroline') {Err("Error 2"); print_r($rs->fields);}; + $rs->MoveNext(); + if ($rs->fields[$id] != 2) {Err("Error 3"); print_r($rs->fields);}; + $rs->MoveNext(); + if (!$rs->EOF) Err("Error EOF"); + else if (is_array($rs->fields) || $rs->fields) { + Err("Error: ## fields should be set to false on EOF"); + print_r($rs->fields); + } + } + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + print "<p>FETCH_MODE = NUM: Should get 1, Caroline</p>"; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1); + if ($rs && !$rs->EOF) { + if (isset($rs->fields['id'])) Err("FETCH_NUM has ASSOC fields"); + if ($rs->fields[0] != 1) {Err("Error 1"); print_r($rs->fields);}; + if (trim($rs->fields[1]) != 'Caroline') {Err("Error 2");print_r($rs->fields);}; + $rs->MoveNext(); + if (!$rs->EOF) Err("Error EOF"); + + } + $ADODB_FETCH_MODE = $savefetch; + + $db->debug = false; + print "<p>GetRowAssoc Upper: Should get 1, Caroline</p>"; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1); + if ($rs && !$rs->EOF) { + $arr = $rs->GetRowAssoc(); + if ($arr['ID'] != 1) {Err("Error 1");print_r($arr);}; + if (trim($arr['FIRSTNAME']) != 'Caroline') {Err("Error 2"); print_r($arr);}; + $rs->MoveNext(); + if (!$rs->EOF) Err("Error EOF"); + + } + print "<p>GetRowAssoc Lower: Should get 1, Caroline</p>"; + $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1); + if ($rs && !$rs->EOF) { + $arr = $rs->GetRowAssoc(false); + if ($arr['id'] != 1) {Err("Error 1"); print_r($arr);}; + if (trim($arr['firstname']) != 'Caroline') {Err("Error 2"); print_r($arr);}; + + } + + print "<p>GetCol Test</p>"; + $col = $db->GetCol('select distinct firstname from ADOXYZ order by 1'); + if (!is_array($col)) Err("Col size is wrong"); + if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong"); + + + $col = $db->CacheGetCol('select distinct firstname from ADOXYZ order by 1'); + if (!is_array($col)) Err("Col size is wrong"); + if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong"); + + $db->debug = true; + + + echo "<p>Date Update Test</p>"; + $zdate = date('Y-m-d',time()+3600*24); + $zdate = $db->DBDate($zdate); + $db->Execute("update ADOXYZ set created=$zdate where id=1"); + $row = $db->GetRow("select created,firstname from ADOXYZ where id=1"); + print_r($row); echo "<br>"; + + + + print "<p>SelectLimit Distinct Test 1: Should see Caroline, John and Mary</p>"; + $rs = $db->SelectLimit('select distinct * from ADOXYZ order by id',3); + + + if ($rs && !$rs->EOF) { + if (trim($rs->fields[1]) != 'Caroline') Err("Error 1 (exp Caroline), ".$rs->fields[1]); + $rs->MoveNext(); + + if (trim($rs->fields[1]) != 'John') Err("Error 2 (exp John), ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'Mary') Err("Error 3 (exp Mary),".$rs->fields[1]); + $rs->MoveNext(); + if (! $rs->EOF) Err("Error EOF"); + //rs2html($rs); + } else Err("Failed SelectLimit Test 1"); + + print "<p>SelectLimit Test 2: Should see Mary, George and Mr. Alan</p>"; + $rs = $db->SelectLimit('select * from ADOXYZ order by id',3,2); + if ($rs && !$rs->EOF) { + if (trim($rs->fields[1]) != 'Mary') Err("Error 1 - No Mary, instead: ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'George')Err("Error 2 - No George, instead: ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'Mr. Alan') Err("Error 3 - No Mr. Alan, instead: ".$rs->fields[1]); + $rs->MoveNext(); + if (! $rs->EOF) Err("Error EOF"); + // rs2html($rs); + } + else Err("Failed SelectLimit Test 2 ". ($rs ? 'EOF':'no RS')); + + print "<p>SelectLimit Test 3: Should see Wai Hun and Steven</p>"; + $db->debug=1; + global $A; $A=1; + $rs = $db->SelectLimit('select * from ADOXYZ order by id',-1,48); + $A=0; + if ($rs && !$rs->EOF) { + if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>"; + if (trim($rs->fields[1]) != 'Wai Hun') Err("Error 1 ".$rs->fields[1]); + $rs->MoveNext(); + if (trim($rs->fields[1]) != 'Steven') Err("Error 2 ".$rs->fields[1]); + $rs->MoveNext(); + if (! $rs->EOF) { + Err("Error EOF"); + } + //rs2html($rs); + } + else Err("Failed SelectLimit Test 3"); + $db->debug = false; + + + $rs = $db->Execute("select * from ADOXYZ order by id"); + print "<p>Testing Move()</p>"; + if (!$rs)Err( "Failed Move SELECT"); + else { + if (!$rs->Move(2)) { + if (!$rs->canSeek) print "<p>$db->databaseType: <b>Move(), MoveFirst() nor MoveLast() not supported.</b></p>"; + else print '<p><b>RecordSet->canSeek property should be set to false</b></p>'; + } else { + $rs->MoveFirst(); + if (trim($rs->Fields("firstname")) != 'Caroline') { + print "<p><b>$db->databaseType: MoveFirst failed -- probably cannot scroll backwards</b></p>"; + } + else print "MoveFirst() OK<BR>"; + + // Move(3) tests error handling -- MoveFirst should not move cursor + $rs->Move(3); + if (trim($rs->Fields("firstname")) != 'George') { + print '<p>'.$rs->Fields("id")."<b>$db->databaseType: Move(3) failed</b></p>"; + } else print "Move(3) OK<BR>"; + + $rs->Move(7); + if (trim($rs->Fields("firstname")) != 'Yat Sun') { + print '<p>'.$rs->Fields("id")."<b>$db->databaseType: Move(7) failed</b></p>"; + print_r($rs); + } else print "Move(7) OK<BR>"; + if ($rs->EOF) Err("Move(7) is EOF already"); + $rs->MoveLast(); + if (trim($rs->Fields("firstname")) != 'Steven'){ + print '<p>'.$rs->Fields("id")."<b>$db->databaseType: MoveLast() failed</b></p>"; + print_r($rs); + }else print "MoveLast() OK<BR>"; + $rs->MoveNext(); + if (!$rs->EOF) err("Bad MoveNext"); + if ($rs->canSeek) { + $rs->Move(3); + if (trim($rs->Fields("firstname")) != 'George') { + print '<p>'.$rs->Fields("id")."<b>$db->databaseType: Move(3) after MoveLast failed</b></p>"; + + } else print "Move(3) after MoveLast() OK<BR>"; + } + + print "<p>Empty Move Test"; + $rs = $db->Execute("select * from ADOXYZ where id > 0 and id < 0"); + $rs->MoveFirst(); + if (!$rs->EOF || $rs->fields) Err("Error in empty move first"); + } + } + + $rs = $db->Execute('select * from ADOXYZ where id = 2'); + if ($rs->EOF || !is_array($rs->fields)) Err("Error in select"); + $rs->MoveNext(); + if (!$rs->EOF) Err("Error in EOF (xx) "); + // $db->debug=true; + print "<p>Testing ADODB_FETCH_ASSOC and concat: concat firstname and lastname</p>"; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($db->dataProvider == 'postgres') { + $sql = "select ".$db->Concat('cast(firstname as varchar)',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ"; + $rs = $db->Execute($sql); + } else { + $sql = "select distinct ".$db->Concat('firstname',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ"; + $rs = $db->Execute($sql); + } + if ($rs) { + if (empty($_GET['hide'])) rs2html($rs); + } else { + Err( "Failed Concat:".$sql); + } + $ADODB_FETCH_MODE = $save; + print "<hr />Testing GetArray() "; + //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + $rs = $db->Execute("select * from ADOXYZ order by id"); + if ($rs) { + $arr = $rs->GetArray(10); + if (sizeof($arr) != 10 || trim($arr[1][1]) != 'John' || trim($arr[1][2]) != 'Lim') print $arr[1][1].' '.$arr[1][2]."<b> &nbsp; ERROR</b><br>"; + else print " OK<BR>"; + } + + $arr = $db->GetArray("select x from ADOXYZ"); + $e = $db->ErrorMsg(); $e2 = $db->ErrorNo(); + echo "Testing error handling, should see illegal column 'x' error=<i>$e ($e2) </i><br>"; + if (!$e || !$e2) Err("Error handling did not work"); + print "Testing FetchNextObject for 1 object "; + $rs = $db->Execute("select distinct lastname,firstname from ADOXYZ where firstname='Caroline'"); + $fcnt = 0; + if ($rs) + while ($o = $rs->FetchNextObject()) { + $fcnt += 1; + } + if ($fcnt == 1) print " OK<BR>"; + else print "<b>FAILED</b><BR>"; + + $stmt = $db->Prepare("select * from ADOXYZ where id < 3"); + $rs = $db->Execute($stmt); + if (!$rs) Err("Prepare failed"); + else { + $arr = $rs->GetArray(); + if (!$arr) Err("Prepare failed 2"); + if (sizeof($arr) != 2) Err("Prepare failed 3"); + } + print "Testing GetAssoc() "; + $savecrecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + //$arr = $db->GetArray("select lastname,firstname from ADOXYZ"); + //print_r($arr); + print "<hr />"; + $rs = $db->Execute("select distinct lastname,firstname,created from ADOXYZ"); + + if ($rs) { + $arr = $rs->GetAssoc(); + //print_r($arr); + if (empty($arr['See']) || trim(reset($arr['See'])) != 'Wai Hun') print $arr['See']." &nbsp; <b>ERROR</b><br>"; + else print " OK 1"; + } + + $arr = $db->GetAssoc("select distinct lastname,firstname from ADOXYZ"); + if ($arr) { + //print_r($arr); + if (empty($arr['See']) || trim($arr['See']) != 'Wai Hun') print $arr['See']." &nbsp; <b>ERROR</b><br>"; + else print " OK 2<BR>"; + } + // Comment this out to test countrecs = false + $ADODB_COUNTRECS = $savecrecs; + $db->debug=1; + $query = $db->Prepare("select count(*) from ADOXYZ"); + $rs = $db->CacheExecute(10,$query); + if (reset($rs->fields) != 50) echo Err("$cnt wrong for Prepare/CacheGetOne"); + + for ($loop=0; $loop < 1; $loop++) { + print "Testing GetMenu() and CacheExecute<BR>"; + $db->debug = true; + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + + + + + if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu('menu','Steven').'<BR>'; + else print " Fail<BR>"; + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + + if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu('menu','Steven',false).'<BR>'; + else print " Fail<BR>"; + + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + + if ($rs) print ' 1st line set to **** , Steven selected: '. $rs->GetMenu('menu','Steven','1st:****').'<BR>'; + else print " Fail<BR>"; + + + + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) print ' Multiple, Alan selected: '. $rs->GetMenu('menu','Alan',false,true).'<BR>'; + else print " Fail<BR>"; + print '</p><hr />'; + + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) { + print ' Multiple, Alan and George selected: '. $rs->GetMenu('menu',array('Alan','George'),false,true); + if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>"; + } else print " Fail<BR>"; + print '</p><hr />'; + + print "Testing GetMenu3()<br>"; + $rs = $db->Execute("select ".$db->Concat('firstname',"'-'",'id').",id, lastname from ADOXYZ order by lastname,id"); + if ($rs) print "Grouped Menu: ".$rs->GetMenu3('name'); + else Err('Grouped Menu GetMenu3()'); + print "<hr />"; + + print "Testing GetMenu2() <BR>"; + $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu2('menu',('Oey')).'<BR>'; + else print " Fail<BR>"; + $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ"); + if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu2('menu',('Oey'),false).'<BR>'; + else print " Fail<BR>"; + } + echo "<h3>CacheExecute</h3>"; + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ"); + print_r($rs->fields); echo $rs->fetchMode;echo "<br>"; + echo $rs->Fields('firstname'); + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ"); + print_r($rs->fields);echo "<br>"; + echo $rs->Fields('firstname'); + $db->debug = false; + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + // phplens + + $sql = 'select * from ADOXYZ where 0=1'; + echo "<p>**Testing '$sql' (phplens compat 1)</p>"; + $rs = $db->Execute($sql); + if (!$rs) err( "<b>No recordset returned for '$sql'</b>"); + if (!$rs->FieldCount()) err( "<b>No fields returned for $sql</b>"); + if (!$rs->FetchField(1)) err( "<b>FetchField failed for $sql</b>"); + + $sql = 'select * from ADOXYZ order by 1'; + echo "<p>**Testing '$sql' (phplens compat 2)</p>"; + $rs = $db->Execute($sql); + if (!$rs) err( "<b>No recordset returned for '$sql'<br>".$db->ErrorMsg()."</b>"); + + + $sql = 'select * from ADOXYZ order by 1,1'; + echo "<p>**Testing '$sql' (phplens compat 3)</p>"; + $rs = $db->Execute($sql); + if (!$rs) err( "<b>No recordset returned for '$sql'<br>".$db->ErrorMsg()."</b>"); + + + // Move + $rs1 = $db->Execute("select id from ADOXYZ where id <= 2 order by 1"); + $rs2 = $db->Execute("select id from ADOXYZ where id = 3 or id = 4 order by 1"); + + if ($rs1) $rs1->MoveLast(); + if ($rs2) $rs2->MoveLast(); + + if (empty($rs1) || empty($rs2) || $rs1->fields[0] != 2 || $rs2->fields[0] != 4) { + $a = $rs1->fields[0]; + $b = $rs2->fields[0]; + print "<p><b>Error in multiple recordset test rs1=$a rs2=$b (should be rs1=2 rs2=4)</b></p>"; + } else + print "<p>Testing multiple recordsets OK</p>"; + + + echo "<p> GenID test: "; + for ($i=1; $i <= 10; $i++) + echo "($i: ",$val = $db->GenID($db->databaseType.'abcseq7' ,5), ") "; + if ($val == 0) Err("GenID not supported"); + + if ($val) { + $db->DropSequence('abc_seq2'); + $db->CreateSequence('abc_seq2'); + $val = $db->GenID('abc_seq2'); + $db->DropSequence('abc_seq2'); + $db->CreateSequence('abc_seq2'); + $val = $db->GenID('abc_seq2'); + if ($val != 1) Err("Drop and Create Sequence not supported ($val)"); + } + echo "<p>"; + + if (substr($db->dataProvider,0,3) != 'notused') { // used to crash ado + $sql = "select firstnames from ADOXYZ"; + print "<p>Testing execution of illegal statement: <i>$sql</i></p>"; + if ($db->Execute($sql) === false) { + print "<p>This returns the following ErrorMsg(): <i>".$db->ErrorMsg()."</i> and ErrorNo(): ".$db->ErrorNo().'</p>'; + } else + print "<p><b>Error in error handling -- Execute() should return false</b></p>"; + } else + print "<p><b>ADO skipped error handling of bad select statement</b></p>"; + + print "<p>ASSOC TEST 2<br>"; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->query('select * from ADOXYZ order by id'); + if ($ee = $db->ErrorMsg()) { + Err("Error message=$ee"); + } + if ($ee = $db->ErrorNo()) { + Err("Error No = $ee"); + } + print_r($rs->fields); + for($i=0;$i<$rs->FieldCount();$i++) + { + $fld=$rs->FetchField($i); + print "<br> Field name is ".$fld->name; + print " ".$rs->Fields($fld->name); + } + + + print "<p>BOTH TEST 2<br>"; + if ($db->dataProvider == 'ado') { + print "<b>ADODB_FETCH_BOTH not supported</b> for dataProvider=".$db->dataProvider."<br>"; + } else { + $ADODB_FETCH_MODE = ADODB_FETCH_BOTH; + $rs = $db->query('select * from ADOXYZ order by id'); + for($i=0;$i<$rs->FieldCount();$i++) + { + $fld=$rs->FetchField($i); + print "<br> Field name is ".$fld->name; + print " ".$rs->Fields($fld->name); + } + } + + print "<p>NUM TEST 2<br>"; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $db->query('select * from ADOXYZ order by id'); + for($i=0;$i<$rs->FieldCount();$i++) + { + $fld=$rs->FetchField($i); + print "<br> Field name is ".$fld->name; + print " ".$rs->Fields($fld->name); + } + + print "<p>ASSOC Test of SelectLimit<br>"; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->selectlimit('select * from ADOXYZ order by id',3,4); + $cnt = 0; + while ($rs && !$rs->EOF) { + $cnt += 1; + if (!isset($rs->fields['firstname'])) { + print "<br><b>ASSOC returned numeric field</b></p>"; + break; + } + $rs->MoveNext(); + } + if ($cnt != 3) print "<br><b>Count should be 3, instead it was $cnt</b></p>"; + + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($db->sysDate) { + $saved = $db->debug; + $db->debug = 1; + $rs = $db->Execute("select {$db->sysDate} from ADOXYZ where id=1"); + if (ADORecordSet::UnixDate(date('Y-m-d')) != $rs->UnixDate($rs->fields[0])) { + print "<p><b>Invalid date {$rs->fields[0]}</b></p>"; + } else + print "<p>Passed \$sysDate test ({$rs->fields[0]})</p>"; + + print_r($rs->FetchField(0)); + print time(); + $db->debug=$saved; + } else { + print "<p><b>\$db->sysDate not defined</b></p>"; + } + + print "<p>Test CSV</p>"; + include_once('../toexport.inc.php'); + //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $rs = $db->SelectLimit('select id,firstname,lastname,created,\'He, he\' he,\'"\' q from ADOXYZ',10); + + print "<pre>"; + print rs2csv($rs); + print "</pre>"; + + $rs = $db->SelectLimit('select id,firstname,lastname,created,\'The "young man", he said\' from ADOXYZ',10); + + if (PHP_VERSION < 5) { + print "<pre>"; + rs2tabout($rs); + print "</pre>"; + } + #print " CacheFlush "; + #$db->CacheFlush(); + + $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A'); + $sql = "SELECT $date from ADOXYZ"; + print "<p>Test SQLDate: ".htmlspecialchars($sql)."</p>"; + $rs = $db->SelectLimit($sql,1); + $d = date('d-m-M-Y-').'Q'.(ceil(date('m')/3.0)).date(' h:i:s A'); + if (!$rs) Err("SQLDate query returned no recordset"); + else if ($d != $rs->fields[0]) Err("SQLDate 1 failed expected: <br>act:$d <br>sql:".$rs->fields[0]); + + $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A',$db->DBDate("1974-02-25")); + $sql = "SELECT $date from ADOXYZ"; + print "<p>Test SQLDate: ".htmlspecialchars($sql)."</p>"; + $db->debug=1; + $rs = $db->SelectLimit($sql,1); + $ts = ADOConnection::UnixDate('1974-02-25'); + $d = date('d-m-M-Y-',$ts).'Q'.(ceil(date('m',$ts)/3.0)).date(' h:i:s A',$ts); + if (!$rs) { + Err("SQLDate query returned no recordset"); + echo $db->ErrorMsg(),'<br>'; + } else if ($d != reset($rs->fields)) { + Err("SQLDate 2 failed expected: <br>act:$d <br>sql:".$rs->fields[0].' <br>'.$db->ErrorMsg()); + } + + + print "<p>Test Filter</p>"; + $db->debug = 1; + + $rs = $db->SelectLimit('select * from ADOXYZ where id < 3 order by id'); + + $rs = RSFilter($rs,'do_strtolower'); + if (trim($rs->fields[1]) != 'caroline' && trim($rs->fields[2]) != 'miranda') { + err('**** RSFilter failed'); + print_r($rs->fields); + } + + rs2html($rs); + + $db->debug=1; + + + print "<p>Test Replace</p>"; + + $ret = $db->Replace('ADOXYZ', + array('id'=>1,'firstname'=>'Caroline','lastname'=>'Miranda'), + array('id'), + $autoq = true); + if (!$ret) echo "<p>Error in replacing existing record</p>"; + else { + $saved = $db->debug; + $db->debug = 0; + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = true; + $rs = $db->Execute('select * FROM ADOXYZ where id=1'); + $db->debug = $saved; + if ($rs->RecordCount() != 1) { + $cnt = $rs->RecordCount(); + rs2html($rs); + print "<b>Error - Replace failed, count=$cnt</b><p>"; + } + $ADODB_COUNTRECS = $savec; + } + $ret = $db->Replace('ADOXYZ', + array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'), + array('id','firstname'), + $autoq = true); + if ($ret != 2) print "<b>Replace failed: </b>"; + print "test A return value=$ret (2 expected) <p>"; + + $ret = $db->Replace('ADOXYZ', + array('id'=>1000,'firstname'=>'Sherazade','lastname'=>'Al-Rashid'), + 'id', + $autoq = true); + if ($ret != 1) + if ($db->dataProvider == 'ibase' && $ret == 2); + else print "<b>Replace failed: </b>"; + print "test B return value=$ret (1 or if ibase then 2 expected) <p>"; + + print "<h3>rs2rs Test</h3>"; + + $rs = $db->Execute('select * from ADOXYZ where id>= 1 order by id'); + $rs = $db->_rs2rs($rs); + $rs->valueX = 'X'; + $rs->MoveNext(); + $rs = $db->_rs2rs($rs); + if (!isset($rs->valueX)) err("rs2rs does not preserve array recordsets"); + if (reset($rs->fields) != 1) err("rs2rs does not move to first row: id=".reset($rs->fields)); + + ///////////////////////////////////////////////////////////// + include_once('../pivottable.inc.php'); + print "<h3>Pivot Test</h3>"; + $db->debug=true; + $sql = PivotTableSQL( + $db, # adodb connection + 'ADOXYZ', # tables + 'firstname', # row fields + 'lastname', # column fields + false, # join + 'ID', # sum + 'Sum ', # label for sum + 'sum', # aggregate function + true + ); + $rs = $db->Execute($sql); + if ($rs) rs2html($rs); + else Err("Pivot sql error"); + + $pear = false; //true; + $db->debug=false; + + if ($pear) { + // PEAR TESTS BELOW + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + include_once "PEAR.php"; + $rs = $db->query('select * from ADOXYZ where id>0 and id<10 order by id'); + + $i = 0; + if ($rs && !$rs->EOF) { + while ($arr = $rs->fetchRow()) { + $i++; + //print "$i "; + if ($arr[0] != $i) { + print_r($arr); + print "<p><b>PEAR DB emulation error 1.</b></p>"; + $pear = false; + break; + } + } + $rs->Close(); + } + + + if ($i != $db->GetOne('select count(*) from ADOXYZ where id>0 and id<10')) { + print "<p><b>PEAR DB emulation error 1.1 EOF ($i)</b></p>"; + $pear = false; + } + + $rs = $db->limitQuery('select * from ADOXYZ where id>0 order by id',$i=3,$top=3); + $i2 = $i; + if ($rs && !$rs->EOF) { + + while (!is_object($rs->fetchInto($arr))) { + $i2++; + + // print_r($arr); + // print "$i ";print_r($arr); + if ($arr[0] != $i2) { + print "<p><b>PEAR DB emulation error 2.</b></p>"; + $pear = false; + break; + } + } + $rs->Close(); + } + if ($i2 != $i+$top) { + print "<p><b>PEAR DB emulation error 2.1 EOF (correct=$i+$top, actual=$i2)</b></p>"; + $pear = false; + } + } + if ($pear) print "<p>PEAR DB emulation passed.</p>"; + flush(); + + + $rs = $db->SelectLimit("select ".$db->sysDate." from ADOXYZ",1); + $date = $rs->fields[0]; + if (!$date) Err("Bad sysDate"); + else { + $ds = $db->UserDate($date,"d m Y"); + if ($ds != date("d m Y")) Err("Bad UserDate: ".$ds.' expected='.date("d m Y")); + else echo "Passed UserDate: $ds<p>"; + } + $db->debug=1; + if ($db->dataProvider == 'oci8') + $rs = $db->SelectLimit("select to_char(".$db->sysTimeStamp.",'YYYY-MM-DD HH24:MI:SS') from ADOXYZ",1); + else + $rs = $db->SelectLimit("select ".$db->sysTimeStamp." from ADOXYZ",1); + $date = $rs->fields[0]; + if (!$date) Err("Bad sysTimeStamp"); + else { + $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y"); + if ($ds != date("H \\h\\r\\s-d m Y")) Err("Bad UserTimeStamp: ".$ds.", correct is ".date("H \\h\\r\\s-d m Y")); + else echo "Passed UserTimeStamp: $ds<p>"; + + $date = 100; + $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y"); + $ds2 = date("H \\h\\r\\s-d m Y",$date); + if ($ds != $ds2) Err("Bad UserTimeStamp 2: $ds: $ds2"); + else echo "Passed UserTimeStamp 2: $ds<p>"; + } + flush(); + + if ($db->hasTransactions) { + $db->debug=1; + echo "<p>Testing StartTrans CompleteTrans</p>"; + $db->raiseErrorFn = false; + + $db->SetTransactionMode('SERIALIZABLE'); + $db->StartTrans(); + $rs = $db->Execute('select * from notable'); + $db->StartTrans(); + $db->BeginTrans(); + $db->Execute("update ADOXYZ set firstname='Carolx' where id=1"); + $db->CommitTrans(); + $db->CompleteTrans(); + $rez = $db->CompleteTrans(); + $db->SetTransactionMode(''); + $db->debug=0; + if ($rez !== false) { + if (is_null($rez)) Err("Error: _transOK not modified"); + else Err("Error: CompleteTrans (1) should have failed"); + } else { + $name = $db->GetOne("Select firstname from ADOXYZ where id=1"); + if ($name == "Carolx") Err("Error: CompleteTrans (2) should have failed"); + else echo "<p> -- Passed StartTrans test1 - rolling back</p>"; + } + + $db->StartTrans(); + $db->BeginTrans(); + $db->Execute("update ADOXYZ set firstname='Carolx' where id=1"); + $db->RollbackTrans(); + $rez = $db->CompleteTrans(); + if ($rez !== true) Err("Error: CompleteTrans (1) should have succeeded"); + else { + $name = $db->GetOne("Select firstname from ADOXYZ where id=1"); + if (trim($name) != "Carolx") Err("Error: CompleteTrans (2) should have succeeded, returned name=$name"); + else echo "<p> -- Passed StartTrans test2 - commiting</p>"; + } + } + flush(); + $saved = $db->debug; + $db->debug=1; + $cnt = _adodb_getcount($db, 'select * from ADOXYZ where firstname in (select firstname from ADOXYZ)'); + echo "<b>Count=</b> $cnt"; + $db->debug=$saved; + + global $TESTERRS; + $debugerr = true; + + global $ADODB_LANG;$ADODB_LANG = 'fr'; + $db->debug = false; + $TESTERRS = 0; + $db->raiseErrorFn = 'adodb_test_err'; + global $ERRNO; // from adodb_test_err + $db->Execute('select * from nowhere'); + $metae = $db->MetaError($ERRNO); + if ($metae !== DB_ERROR_NOSUCHTABLE) print "<p><b>MetaError=".$metae." wrong</b>, should be ".DB_ERROR_NOSUCHTABLE."</p>"; + else print "<p>MetaError ok (".DB_ERROR_NOSUCHTABLE."): ".$db->MetaErrorMsg($metae)."</p>"; + if ($TESTERRS != 1) print "<b>raiseErrorFn select nowhere failed</b><br>"; + $rs = $db->Execute('select * from ADOXYZ'); + if ($debugerr) print " Move"; + $rs->Move(100); + $rs->_queryID = false; + if ($debugerr) print " MoveNext"; + $rs->MoveNext(); + if ($debugerr) print " $rs=false"; + $rs = false; + + flush(); + + print "<p>SetFetchMode() tests</p>"; + $db->SetFetchMode(ADODB_FETCH_ASSOC); + $rs = $db->SelectLimit('select firstname from ADOXYZ',1); + if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC"); + + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + $rs = $db->SelectLimit('select firstname from ADOXYZ',1); + //var_dump($rs->fields); + if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC"); + + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $db->SetFetchMode(ADODB_FETCH_NUM); + $rs = $db->SelectLimit('select firstname from ADOXYZ',1); + if (!isset($rs->fields[0])) Err("BAD FETCH NUM"); + + flush(); + + print "<p>Test MetaTables again with SetFetchMode()</p>"; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + $db->SetFetchMode(ADODB_FETCH_ASSOC); + print_r($db->MetaTables()); + print "<p>"; + + //////////////////////////////////////////////////////////////////// + + print "<p>Testing Bad Connection</p>"; + flush(); + + if (true || PHP_VERSION < 5) { + if ($db->dataProvider == 'odbtp') $db->databaseType = 'odbtp'; + $conn = NewADOConnection($db->databaseType); + $conn->raiseErrorFn = 'adodb_test_err'; + if (1) $conn->PConnect('abc','baduser','badpassword'); + if ($TESTERRS == 2) print "raiseErrorFn tests passed<br>"; + else print "<b>raiseErrorFn tests failed ($TESTERRS)</b><br>"; + + flush(); + } + //////////////////////////////////////////////////////////////////// + + global $nocountrecs; + + if (isset($nocountrecs) && $ADODB_COUNTRECS) err("Error: \$ADODB_COUNTRECS is set"); + if (empty($nocountrecs) && $ADODB_COUNTRECS==false) err("Error: \$ADODB_COUNTRECS is not set"); + + flush(); +?> + </p> + <table width=100% ><tr><td bgcolor=beige>&nbsp;</td></tr></table> + </p></form> +<?php + + if ($rs1) $rs1->Close(); + if ($rs2) $rs2->Close(); + if ($rs) $rs->Close(); + $db->Close(); + + if ($db->transCnt != 0) Err("Error in transCnt=$db->transCnt (should be 0)"); + + + printf("<p>Total queries=%d; total cached=%d</p>",$EXECS+$CACHED, $CACHED); + flush(); +} + +function adodb_test_err($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false) +{ +global $TESTERRS,$ERRNO; + + $ERRNO = $errno; + $TESTERRS += 1; + print "<i>** $dbms ($fn): errno=$errno &nbsp; errmsg=$errmsg ($p1,$p2)</i><br>"; +} + +//-------------------------------------------------------------------------------------- + + +@set_time_limit(240); // increase timeout + +include("../tohtml.inc.php"); +include("../adodb.inc.php"); +include("../rsfilter.inc.php"); + +/* White Space Check */ + +if (isset($_SERVER['argv'][1])) { + //print_r($_SERVER['argv']); + $_GET[$_SERVER['argv'][1]] = 1; +} + +if (@$_SERVER['COMPUTERNAME'] == 'TIGRESS') { + CheckWS('mysqlt'); + CheckWS('postgres'); + CheckWS('oci8po'); + + CheckWS('firebird'); + CheckWS('sybase'); + if (!ini_get('safe_mode')) CheckWS('informix'); + + CheckWS('ado_mssql'); + CheckWS('ado_access'); + CheckWS('mssql'); + + CheckWS('vfp'); + CheckWS('sqlanywhere'); + CheckWS('db2'); + CheckWS('access'); + CheckWS('odbc_mssql'); + CheckWS('firebird15'); + // + CheckWS('oracle'); + CheckWS('proxy'); + CheckWS('fbsql'); + print "White Space Check complete<p>"; +} +if (sizeof($_GET) == 0) $testmysql = true; + + +foreach($_GET as $k=>$v) { + //global $$k; + $$k = $v; +} + +?> +<html> +<title>ADODB Testing</title> +<body bgcolor=white> +<H1>ADODB Test</H1> + +This script tests the following databases: Interbase, Oracle, Visual FoxPro, Microsoft Access (ODBC and ADO), MySQL, MSSQL (ODBC, native, ADO). +There is also support for Sybase, PostgreSQL.</p> +For the latest version of ADODB, visit <a href=http://adodb.sourceforge.net/>adodb.sourceforge.net</a>.</p> + +Test <a href=test4.php>GetInsertSQL/GetUpdateSQL</a> &nbsp; + <a href=testsessions.php>Sessions</a> &nbsp; + <a href=testpaging.php>Paging</a> &nbsp; + <a href=test-perf.php>Perf Monitor</a><p> +<?php + + +include_once('../adodb-time.inc.php'); +if (isset($_GET['time'])) adodb_date_test(); +flush(); + +include_once('./testdatabases.inc.php'); + +echo "<br>vers=",ADOConnection::Version(); + + + +?> +<p><i>ADODB Database Library (c) 2000-2009 John Lim. All rights reserved. Released under BSD and LGPL, PHP <?php echo PHP_VERSION ?>.</i></p> +</body> +</html> diff --git a/pos/is4c-nf/lib/adodb5/tests/test2.php b/pos/is4c-nf/lib/adodb5/tests/test2.php new file mode 100644 index 000000000..ff9e969b3 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test2.php @@ -0,0 +1,26 @@ +<?php + +// BASIC ADO test + + include_once('../adodb.inc.php'); + + $db = ADONewConnection("ado_access"); + $db->debug=1; + $access = 'd:\inetpub\wwwroot\php\NWIND.MDB'; + $myDSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;' + . 'DATA SOURCE=' . $access . ';'; + + echo "<p>PHP ",PHP_VERSION,"</p>"; + + $db->Connect($myDSN) || die('fail'); + + print_r($db->ServerInfo()); + + try { + $rs = $db->Execute("select $db->sysTimeStamp,* from adoxyz where id>02xx"); + print_r($rs->fields); + } catch(exception $e) { + print_r($e); + echo "<p> Date m/d/Y =",$db->UserDate($rs->fields[4],'m/d/Y'); + } +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test3.php b/pos/is4c-nf/lib/adodb5/tests/test3.php new file mode 100644 index 000000000..3269c17f8 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test3.php @@ -0,0 +1,44 @@ +<?php +/* + V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 8. + */ + + +error_reporting(E_ALL); + +$path = dirname(__FILE__); + +include("$path/../adodb-exceptions.inc.php"); +include("$path/../adodb.inc.php"); + +try { +$db = NewADOConnection("oci8"); +$db->Connect('','scott','natsoft'); +$db->debug=1; + +$cnt = $db->GetOne("select count(*) from adoxyz"); +$rs = $db->Execute("select * from adoxyz order by id"); + +$i = 0; +foreach($rs as $k => $v) { + $i += 1; + echo $k; adodb_pr($v); + flush(); +} + +if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); + + + +$rs = $db->Execute("select bad from badder"); + +} catch (exception $e) { + adodb_pr($e); + $e = adodb_backtrace($e->trace); +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test4.php b/pos/is4c-nf/lib/adodb5/tests/test4.php new file mode 100644 index 000000000..d377f84a7 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test4.php @@ -0,0 +1,143 @@ +<?php + +/** + * @version V4.50 6 July 2004 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * + * Test GetUpdateSQL and GetInsertSQL. + */ + +error_reporting(E_ALL); +function testsql() +{ + + +include('../adodb.inc.php'); +include('../tohtml.inc.php'); + +global $ADODB_FORCE_TYPE; + + +//========================== +// This code tests an insert + +$sql = " +SELECT * +FROM ADOXYZ WHERE id = -1"; +// Select an empty record from the database + + +#$conn = ADONewConnection("mssql"); // create a connection +#$conn->PConnect("", "sa", "natsoft", "northwind"); // connect to MySQL, testdb + +$conn = ADONewConnection("mysql"); // create a connection +$conn->PConnect("localhost", "root", "", "test"); // connect to MySQL, testdb + + +#$conn = ADONewConnection('oci8po'); +#$conn->Connect('','scott','natsoft'); + +if (PHP_VERSION >= 5) { + $connstr = "mysql:dbname=northwind"; + $u = 'root';$p=''; + $conn = ADONewConnection('pdo'); + $conn->Connect($connstr, $u, $p); +} +//$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + + +$conn->debug=1; +$conn->Execute("delete from adoxyz where lastname like 'Smi%'"); + +$rs = $conn->Execute($sql); // Execute the query and get the empty recordset +$record = array(); // Initialize an array to hold the record data to insert + +if (strpos($conn->databaseType,'mysql')===false) $record['id'] = 751; +$record["firstname"] = 'Jann'; +$record["lastname"] = "Smitts"; +$record["created"] = time(); + +$insertSQL = $conn->GetInsertSQL($rs, $record); +$conn->Execute($insertSQL); // Insert the record into the database + +if (strpos($conn->databaseType,'mysql')===false) $record['id'] = 752; +// Set the values for the fields in the record +$record["firstname"] = 'anull'; +$record["lastname"] = "Smith\$@//"; +$record["created"] = time(); + +if (isset($_GET['f'])) $ADODB_FORCE_TYPE = $_GET['f']; + +//$record["id"] = -1; + +// Pass the empty recordset and the array containing the data to insert +// into the GetInsertSQL function. The function will process the data and return +// a fully formatted insert sql statement. +$insertSQL = $conn->GetInsertSQL($rs, $record); +$conn->Execute($insertSQL); // Insert the record into the database + + + +$insertSQL2 = $conn->GetInsertSQL($table='ADOXYZ', $record); +if ($insertSQL != $insertSQL2) echo "<p><b>Walt's new stuff failed</b>: $insertSQL2</p>"; +//========================== +// This code tests an update + +$sql = " +SELECT * +FROM ADOXYZ WHERE lastname=".$conn->Param('var'). " ORDER BY 1"; +// Select a record to update + +$varr = array('var'=>$record['lastname'].''); +$rs = $conn->Execute($sql,$varr); // Execute the query and get the existing record to update +if (!$rs || $rs->EOF) print "<p><b>No record found!</b></p>"; + +$record = array(); // Initialize an array to hold the record data to update + + +// Set the values for the fields in the record +$record["firstName"] = "Caroline".rand(); +//$record["lasTname"] = ""; // Update Caroline's lastname from Miranda to Smith +$record["creAted"] = '2002-12-'.(rand()%30+1); +$record['num'] = ''; +// Pass the single record recordset and the array containing the data to update +// into the GetUpdateSQL function. The function will process the data and return +// a fully formatted update sql statement. +// If the data has not changed, no recordset is returned + +$updateSQL = $conn->GetUpdateSQL($rs, $record); +$conn->Execute($updateSQL,$varr); // Update the record in the database +if ($conn->Affected_Rows() != 1)print "<p><b>Error1 </b>: Rows Affected=".$conn->Affected_Rows().", should be 1</p>"; + +$record["firstName"] = "Caroline".rand(); +$record["lasTname"] = "Smithy Jones"; // Update Caroline's lastname from Miranda to Smith +$record["creAted"] = '2002-12-'.(rand()%30+1); +$record['num'] = 331; +$updateSQL = $conn->GetUpdateSQL($rs, $record); +$conn->Execute($updateSQL,$varr); // Update the record in the database +if ($conn->Affected_Rows() != 1)print "<p><b>Error 2</b>: Rows Affected=".$conn->Affected_Rows().", should be 1</p>"; + +$rs = $conn->Execute("select * from ADOXYZ where lastname like 'Sm%'"); +//adodb_pr($rs); +rs2html($rs); + +$record["firstName"] = "Carol-new-".rand(); +$record["lasTname"] = "Smithy"; // Update Caroline's lastname from Miranda to Smith +$record["creAted"] = '2002-12-'.(rand()%30+1); +$record['num'] = 331; + +$conn->AutoExecute('ADOXYZ',$record,'UPDATE', "lastname like 'Sm%'"); +$rs = $conn->Execute("select * from ADOXYZ where lastname like 'Sm%'"); +//adodb_pr($rs); +rs2html($rs); +} + + +testsql(); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/test5.php b/pos/is4c-nf/lib/adodb5/tests/test5.php new file mode 100644 index 000000000..cc9b7a6a6 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test5.php @@ -0,0 +1,47 @@ +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + + +// Select an empty record from the database + +include('../adodb.inc.php'); +include('../tohtml.inc.php'); + +include('../adodb-errorpear.inc.php'); + +if (0) { + $conn = ADONewConnection('mysql'); + $conn->debug=1; + $conn->PConnect("localhost","root","","xphplens"); + print $conn->databaseType.':'.$conn->GenID().'<br>'; +} + +if (0) { + $conn = ADONewConnection("oci8"); // create a connection + $conn->debug=1; + $conn->PConnect("falcon", "scott", "tiger", "juris8.ecosystem.natsoft.com.my"); // connect to MySQL, testdb + print $conn->databaseType.':'.$conn->GenID(); +} + +if (0) { + $conn = ADONewConnection("ibase"); // create a connection + $conn->debug=1; + $conn->Connect("localhost:c:\\Interbase\\Examples\\Database\\employee.gdb", "sysdba", "masterkey", ""); // connect to MySQL, testdb + print $conn->databaseType.':'.$conn->GenID().'<br>'; +} + +if (0) { + $conn = ADONewConnection('postgres'); + $conn->debug=1; + @$conn->PConnect("susetikus","tester","test","test"); + print $conn->databaseType.':'.$conn->GenID().'<br>'; +} +?> diff --git a/pos/is4c-nf/lib/adodb5/tests/test_rs_array.php b/pos/is4c-nf/lib/adodb5/tests/test_rs_array.php new file mode 100644 index 000000000..1de37b223 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/test_rs_array.php @@ -0,0 +1,47 @@ +<?php + +include_once('../adodb.inc.php'); +$rs = new ADORecordSet_array(); + +$array = array( +array ('Name', 'Age'), +array ('John', '12'), +array ('Jill', '8'), +array ('Bill', '49') +); + +$typearr = array('C','I'); + + +$rs->InitArray($array,$typearr); + +while (!$rs->EOF) { + print_r($rs->fields);echo "<br>"; + $rs->MoveNext(); +} + +echo "<hr /> 1 Seek<br>"; +$rs->Move(1); +while (!$rs->EOF) { + print_r($rs->fields);echo "<br>"; + $rs->MoveNext(); +} + +echo "<hr /> 2 Seek<br>"; +$rs->Move(2); +while (!$rs->EOF) { + print_r($rs->fields);echo "<br>"; + $rs->MoveNext(); +} + +echo "<hr /> 3 Seek<br>"; +$rs->Move(3); +while (!$rs->EOF) { + print_r($rs->fields);echo "<br>"; + $rs->MoveNext(); +} + + + +die(); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testcache.php b/pos/is4c-nf/lib/adodb5/tests/testcache.php new file mode 100644 index 000000000..6a8ac4a26 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testcache.php @@ -0,0 +1,29 @@ +<html> +<body> +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + +$ADODB_CACHE_DIR = dirname(tempnam('/tmp','')); +include("../adodb.inc.php"); + +if (isset($access)) { + $db=ADONewConnection('access'); + $db->PConnect('nwind'); +} else { + $db = ADONewConnection('mysql'); + $db->PConnect('mangrove','root','','xphplens'); +} +if (isset($cache)) $rs = $db->CacheExecute(120,'select * from products'); +else $rs = $db->Execute('select * from products'); + +$arr = $rs->GetArray(); +print sizeof($arr); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testdatabases.inc.php b/pos/is4c-nf/lib/adodb5/tests/testdatabases.inc.php new file mode 100644 index 000000000..473a06f3c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testdatabases.inc.php @@ -0,0 +1,452 @@ +<?php + +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. +*/ + + /* this file is used by the ADODB test program: test.php */ + ?> + +<table><tr valign=top><td> +<form method=get> +<input type=checkbox name="testaccess" value=1 <?php echo !empty($testaccess) ? 'checked' : '' ?>> <b>Access</b><br> +<input type=checkbox name="testibase" value=1 <?php echo !empty($testibase) ? 'checked' : '' ?>> <b>Interbase</b><br> +<input type=checkbox name="testmssql" value=1 <?php echo !empty($testmssql) ? 'checked' : '' ?>> <b>MSSQL</b><br> + <input type=checkbox name="testmysql" value=1 <?php echo !empty($testmysql) ? 'checked' : '' ?>> <b>MySQL</b><br> +<input type=checkbox name="testmysqlodbc" value=1 <?php echo !empty($testmysqlodbc) ? 'checked' : '' ?>> <b>MySQL ODBC</b><br> +<input type=checkbox name="testmysqli" value=1 <?php echo !empty($testmysqli) ? 'checked' : '' ?>> <b>MySQLi</b> +<br> +<td><input type=checkbox name="testsqlite" value=1 <?php echo !empty($testsqlite) ? 'checked' : '' ?>> <b>SQLite</b><br> +<input type=checkbox name="testproxy" value=1 <?php echo !empty($testproxy) ? 'checked' : '' ?>> <b>MySQL Proxy</b><br> +<input type=checkbox name="testoracle" value=1 <?php echo !empty($testoracle) ? 'checked' : '' ?>> <b>Oracle (oci8)</b> <br> +<input type=checkbox name="testpostgres" value=1 <?php echo !empty($testpostgres) ? 'checked' : '' ?>> <b>PostgreSQL</b><br> +<input type=checkbox name="testpgodbc" value=1 <?php echo !empty($testpgodbc) ? 'checked' : '' ?>> <b>PostgreSQL ODBC</b><br> +<td> +<input type=checkbox name="testpdopgsql" value=1 <?php echo !empty($testpdopgsql) ? 'checked' : '' ?>> <b>PgSQL PDO</b><br> +<input type=checkbox name="testpdomysql" value=1 <?php echo !empty($testpdomysql) ? 'checked' : '' ?>> <b>MySQL PDO</b><br> +<input type=checkbox name="testpdosqlite" value=1 <?php echo !empty($testpdosqlite) ? 'checked' : '' ?>> <b>SQLite PDO</b><br> +<input type=checkbox name="testpdoaccess" value=1 <?php echo !empty($testpdoaccess) ? 'checked' : '' ?>> <b>Access PDO</b><br> +<input type=checkbox name="testpdomssql" value=1 <?php echo !empty($testpdomssql) ? 'checked' : '' ?>> <b>MSSQL PDO</b><br> + +<input type=checkbox name="testpdoora" value=1 <?php echo !empty($testpdoora) ? 'checked' : '' ?>> <b>OCI PDO</b><br> + +<td><input type=checkbox name="testdb2" value=1 <?php echo !empty($testdb2) ? 'checked' : '' ?>> DB2<br> +<input type=checkbox name="testvfp" value=1 <?php echo !empty($testvfp) ? 'checked' : '' ?>> VFP+ODBTP<br> +<input type=checkbox name="testado" value=1 <?php echo !empty($testado) ? 'checked' : '' ?>> ADO (for mssql and access)<br> +<input type=checkbox name="nocountrecs" value=1 <?php echo !empty($nocountrecs) ? 'checked' : '' ?>> $ADODB_COUNTRECS=false<br> +<input type=checkbox name="nolog" value=1 <?php echo !empty($nolog) ? 'checked' : '' ?>> No SQL Logging<br> +<input type=checkbox name="time" value=1 <?php echo !empty($_GET['time']) ? 'checked' : '' ?>> ADOdb time test +</table> +<input type=submit> +</form> + +<?php + +if ($ADODB_FETCH_MODE != ADODB_FETCH_DEFAULT) print "<h3>FETCH MODE IS NOT ADODB_FETCH_DEFAULT</h3>"; + +if (isset($nocountrecs)) $ADODB_COUNTRECS = false; + +// cannot test databases below, but we include them anyway to check +// if they parse ok... + +if (sizeof($_GET) || !isset($_SERVER['HTTP_HOST'])) { + echo "<BR>"; + ADOLoadCode2("sybase"); + ADOLoadCode2("postgres"); + ADOLoadCode2("postgres7"); + ADOLoadCode2("firebird"); + ADOLoadCode2("borland_ibase"); + ADOLoadCode2("informix"); + ADOLoadCode2("sqlanywhere"); + ADOLoadCode2('mysqli'); + ADOLoadCode2("access"); + ADOLoadCode2("mysql"); + ADOLoadCode2("oci8"); +} + +function ADOLoadCode2($d) +{ + ADOLoadCode($d); + $c = ADONewConnection($d); + echo "Loaded $d ",($c ? 'ok' : 'extension not installed'),"<br>"; +} + +flush(); +if (!empty($testpostgres)) { + //ADOLoadCode("postgres"); + + $db = ADONewConnection('postgres'); + print "<h1>Connecting $db->databaseType...</h1>"; + if ($db->Connect("localhost","tester","test","test")) { + testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname varchar,created date)"); + }else + print "ERROR: PostgreSQL requires a database called test on server, user tester, password test.<BR>".$db->ErrorMsg(); +} + +if (!empty($testpgodbc)) { + + $db = ADONewConnection('odbc'); + $db->hasTransactions = false; + print "<h1>Connecting $db->databaseType...</h1>"; + + if ($db->PConnect('Postgresql')) { + $db->hasTransactions = true; + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) type=innodb"); + } else print "ERROR: PostgreSQL requires a database called test on server, user tester, password test.<BR>".$db->ErrorMsg(); +} + +if (!empty($testibase)) { + //$_GET['nolog'] = true; + $db = ADONewConnection('firebird'); + print "<h1>Connecting $db->databaseType...</h1>"; + if ($db->PConnect("localhost:d:\\firebird\\151\\examples\\EMPLOYEE.fdb", "sysdba", "masterkey", "")) + testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname char(24),price numeric(12,2),created date)"); + else print "ERROR: Interbase test requires a database called employee.gdb".'<BR>'.$db->ErrorMsg(); + +} + + +if (!empty($testsqlite)) { + $path =urlencode('d:\inetpub\adodb\sqlite.db'); + $dsn = "sqlite://$path/"; + $db = ADONewConnection($dsn); + //echo $dsn; + + //$db = ADONewConnection('sqlite'); + + + if ($db && $db->PConnect("d:\\inetpub\\adodb\\sqlite.db", "", "", "")) { + print "<h1>Connecting $db->databaseType...</h1>"; + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + } else + print "ERROR: SQLite"; + +} + +if (!empty($testpdopgsql)) { + $connstr = "pgsql:dbname=test"; + $u = 'tester';$p='test'; + $db = ADONewConnection('pdo'); + print "<h1>Connecting $db->databaseType...</h1>"; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdomysql)) { + $connstr = "mysql:dbname=northwind"; + $u = 'root';$p=''; + $db = ADONewConnection('pdo'); + print "<h1>Connecting $db->databaseType...</h1>"; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdomssql)) { + $connstr = "mssql:dbname=northwind"; + $u = 'sa';$p='natsoft'; + $db = ADONewConnection('pdo'); + print "<h1>Connecting $db->databaseType...</h1>"; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdosqlite)) { + $connstr = "sqlite:d:/inetpub/adodb/sqlite-pdo.db3"; + $u = '';$p=''; + $db = ADONewConnection('pdo'); + $db->hasTransactions = false; + print "<h1>Connecting $db->databaseType...</h1>"; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdoaccess)) { + $connstr = 'odbc:nwind'; + $u = '';$p=''; + $db = ADONewConnection('pdo'); + $db->hasTransactions = false; + print "<h1>Connecting $db->databaseType...</h1>"; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +if (!empty($testpdoora)) { + $connstr = 'oci:'; + $u = 'scott';$p='natsoft'; + $db = ADONewConnection('pdo'); + #$db->hasTransactions = false; + print "<h1>Connecting $db->databaseType...</h1>"; + $db->Connect($connstr,$u,$p) || die("CONNECT FAILED"); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); +} + +// REQUIRES ODBC DSN CALLED nwind +if (!empty($testaccess)) { + $db = ADONewConnection('access'); + print "<h1>Connecting $db->databaseType...</h1>"; + $access = 'd:\inetpub\wwwroot\php\NWIND.MDB'; + $dsn = "nwind"; + $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=$access;Uid=Admin;Pwd=;"; + + //$dsn = 'Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=' . $access . ';'; + if ($db->PConnect($dsn, "", "", "")) + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + else print "ERROR: Access test requires a Windows ODBC DSN=nwind, Access driver"; + +} + +if (!empty($testaccess) && !empty($testado)) { // ADO ACCESS + + $db = ADONewConnection("ado_access"); + print "<h1>Connecting $db->databaseType...</h1>"; + + $access = 'd:\inetpub\wwwroot\php\NWIND.MDB'; + $myDSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;' + . 'DATA SOURCE=' . $access . ';'; + //. 'USER ID=;PASSWORD=;'; + $_GET['nolog'] = 1; + if ($db->PConnect($myDSN, "", "", "")) { + print "ADO version=".$db->_connectionID->version."<br>"; + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + } else print "ERROR: Access test requires a Access database $access".'<BR>'.$db->ErrorMsg(); + +} + +if (!empty($testvfp)) { // ODBC + $db = ADONewConnection('vfp'); + print "<h1>Connecting $db->databaseType...</h1>";flush(); + + if ( $db->PConnect("vfp-adoxyz")) { + testdb($db,"create table d:\\inetpub\\adodb\\ADOXYZ (id int, firstname char(24), lastname char(24),created date)"); + } else print "ERROR: Visual FoxPro test requires a Windows ODBC DSN=vfp-adoxyz, VFP driver"; + + echo "<hr />"; + $db = ADONewConnection('odbtp'); + + if ( $db->PConnect('localhost','DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=d:\inetpub\adodb;EXCLUSIVE=NO;')) { + print "<h1>Connecting $db->databaseType...</h1>";flush(); + testdb($db,"create table d:\\inetpub\\adodb\\ADOXYZ (id int, firstname char(24), lastname char(24),created date)"); + } else print "ERROR: Visual FoxPro odbtp requires a Windows ODBC DSN=vfp-adoxyz, VFP driver"; + +} + + +// REQUIRES MySQL server at localhost with database 'test' +if (!empty($testmysql)) { // MYSQL + + + if (PHP_VERSION >= 5 || $_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + else $server = "mangrove"; + $user = 'root'; $password = ''; $database = 'northwind'; + $db = ADONewConnection("mysqlt://$user:$password@$server/$database?persist"); + print "<h1>Connecting $db->databaseType...</h1>"; + + if (true || $db->PConnect($server, "root", "", "northwind")) { + //$db->Execute("DROP TABLE ADOXYZ") || die('fail drop'); + //$db->debug=1;$db->Execute('drop table ADOXYZ'); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) Type=InnoDB"); + } else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'<BR>'.$db->ErrorMsg(); +} + +// REQUIRES MySQL server at localhost with database 'test' +if (!empty($testmysqli)) { // MYSQL + + $db = ADONewConnection('mysqli'); + print "<h1>Connecting $db->databaseType...</h1>"; + if (PHP_VERSION >= 5 || $_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + else $server = "mangrove"; + if ($db->PConnect($server, "root", "", "northwind")) { + //$db->debug=1;$db->Execute('drop table ADOXYZ'); + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); + } else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'<BR>'.$db->ErrorMsg(); +} + + +// REQUIRES MySQL server at localhost with database 'test' +if (!empty($testmysqlodbc)) { // MYSQL + + $db = ADONewConnection('odbc'); + $db->hasTransactions = false; + print "<h1>Connecting $db->databaseType...</h1>"; + if ($_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + else $server = "mangrove"; + if ($db->PConnect('mysql', "root", "")) + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) type=innodb"); + else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'<BR>'.$db->ErrorMsg(); +} + +if (!empty($testproxy)){ + $db = ADONewConnection('proxy'); + print "<h1>Connecting $db->databaseType...</h1>"; + if ($_SERVER['HTTP_HOST'] == 'localhost') $server = 'localhost'; + + if ($db->PConnect('http://localhost/php/phplens/adodb/server.php')) + testdb($db, + "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date) type=innodb"); + else print "ERROR: MySQL test requires a MySQL server on localhost, userid='admin', password='', database='test'".'<BR>'.$db->ErrorMsg(); + +} + +ADOLoadCode('oci805'); +ADOLoadCode("oci8po"); + +if (!empty($testoracle)) { + $dsn = "oci8po";//://scott:natsoft@kk2?persist"; + $db = ADONewConnection($dsn );//'oci8'); + + //$db->debug=1; + print "<h1>Connecting $db->databaseType...</h1>"; + if ($db->Connect('', "scott", "natsoft",'condor')) + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + else + print "ERROR: Oracle test requires an Oracle server setup with scott/natsoft".'<BR>'.$db->ErrorMsg(); + +} +ADOLoadCode("oracle"); // no longer supported +if (false && !empty($testoracle)) { + + $db = ADONewConnection(); + print "<h1>Connecting $db->databaseType...</h1>"; + if ($db->PConnect("", "scott", "tiger", "natsoft.domain")) + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + else print "ERROR: Oracle test requires an Oracle server setup with scott/tiger".'<BR>'.$db->ErrorMsg(); + +} + +ADOLoadCode("odbc_db2"); // no longer supported +if (!empty($testdb2)) { + if (PHP_VERSION>=5.1) { + $db = ADONewConnection("db2"); + print "<h1>Connecting $db->databaseType...</h1>"; + + #$db->curMode = SQL_CUR_USE_ODBC; + #$dsn = "driver={IBM db2 odbc DRIVER};Database=test;hostname=localhost;port=50000;protocol=TCPIP; uid=natsoft; pwd=guest"; + if ($db->Connect('localhost','natsoft','guest','test')) { + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + } else print "ERROR: DB2 test requires an server setup with odbc data source db2_sample".'<BR>'.$db->ErrorMsg(); + } else { + $db = ADONewConnection("odbc_db2"); + print "<h1>Connecting $db->databaseType...</h1>"; + + $dsn = "db2test"; + #$db->curMode = SQL_CUR_USE_ODBC; + #$dsn = "driver={IBM db2 odbc DRIVER};Database=test;hostname=localhost;port=50000;protocol=TCPIP; uid=natsoft; pwd=guest"; + if ($db->Connect($dsn)) { + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + } else print "ERROR: DB2 test requires an server setup with odbc data source db2_sample".'<BR>'.$db->ErrorMsg(); + } +echo "<hr />"; +flush(); + $dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP; uid=root; pwd=natsoft"; + + $db = ADONewConnection('odbtp'); + if ($db->Connect('127.0.0.1',$dsn)) { + + $db->debug=1; + $arr = $db->GetArray( "||SQLProcedures" ); adodb_pr($arr); + $arr = $db->GetArray( "||SQLProcedureColumns|||GET_ROUTINE_SAR" );adodb_pr($arr); + + testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); + } else echo ("ERROR Connection"); + echo $db->ErrorMsg(); +} + + +$server = 'localhost'; + + + +ADOLoadCode("mssqlpo"); +if (false && !empty($testmssql)) { // MS SQL Server -- the extension is buggy -- probably better to use ODBC + $db = ADONewConnection("mssqlpo"); + //$db->debug=1; + print "<h1>Connecting $db->databaseType...</h1>"; + + $ok = $db->Connect('','sa','natsoft','northwind'); + echo $db->ErrorMsg(); + if ($ok /*or $db->PConnect("mangrove", "sa", "natsoft", "ai")*/) { + AutoDetect_MSSQL_Date_Order($db); + // $db->Execute('drop table adoxyz'); + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + } else print "ERROR: MSSQL test 2 requires a MS SQL 7 on a server='$server', userid='adodb', password='natsoft', database='ai'".'<BR>'.$db->ErrorMsg(); + +} + + +ADOLoadCode('odbc_mssql'); +if (!empty($testmssql)) { // MS SQL Server via ODBC + $db = ADONewConnection(); + + print "<h1>Connecting $db->databaseType...</h1>"; + + $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=$server;Database=northwind;"; + $dsn = 'condor'; + if ($db->PConnect($dsn, "sa", "natsoft", "")) { + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + } + else print "ERROR: MSSQL test 1 requires a MS SQL 7 server setup with DSN setup"; + +} + +ADOLoadCode("ado_mssql"); +if (!empty($testmssql) && !empty($testado) ) { // ADO ACCESS MSSQL -- thru ODBC -- DSN-less + + $db = ADONewConnection("ado_mssql"); + //$db->debug=1; + print "<h1>Connecting DSN-less $db->databaseType...</h1>"; + + $myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};" + . "SERVER=$server;DATABASE=NorthWind;UID=adodb;PWD=natsoft;Trusted_Connection=No"; + + + if ($db->PConnect($myDSN, "", "", "")) + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + else print "ERROR: MSSQL test 2 requires MS SQL 7"; + +} + +if (!empty($testmssql) && !empty($testado)) { // ADO ACCESS MSSQL with OLEDB provider + + $db = ADONewConnection("ado_mssql"); + print "<h1>Connecting DSN-less OLEDB Provider $db->databaseType...</h1>"; + //$db->debug=1; + $myDSN="SERVER=localhost;DATABASE=northwind;Trusted_Connection=yes"; + if ($db->PConnect($myDSN, "adodb", "natsoft", 'SQLOLEDB')) { + testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); + } else print "ERROR: MSSQL test 2 requires a MS SQL 7 on a server='mangrove', userid='sa', password='', database='ai'"; + +} + + +if (extension_loaded('odbtp') && !empty($testmssql)) { // MS SQL Server via ODBC + $db = ADONewConnection('odbtp'); + + $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=$server;Database=northwind;uid=adodb;pwd=natsoft"; + + if ($db->PConnect('localhost',$dsn, "", "")) { + print "<h1>Connecting $db->databaseType...</h1>"; + testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); + } + else print "ERROR: MSSQL test 1 requires a MS SQL 7 server setup with DSN setup"; + +} + + +print "<h3>Tests Completed</h3>"; + +?> diff --git a/pos/is4c-nf/lib/adodb5/tests/testgenid.php b/pos/is4c-nf/lib/adodb5/tests/testgenid.php new file mode 100644 index 000000000..14b48ce3c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testgenid.php @@ -0,0 +1,36 @@ +<?php +/* + V4.50 6 July 2004 + + Run multiple copies of this php script at the same time + to test unique generation of id's in multiuser mode +*/ +include_once('../adodb.inc.php'); +$testaccess = true; +include_once('testdatabases.inc.php'); + +function testdb(&$db,$createtab="create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)") +{ + $table = 'adodbseq'; + + $db->Execute("drop table $table"); + //$db->debug=true; + + $ctr = 5000; + $lastnum = 0; + + while (--$ctr >= 0) { + $num = $db->GenID($table); + if ($num === false) { + print "GenID returned false"; + break; + } + if ($lastnum + 1 == $num) print " $num "; + else { + print " <font color=red>$num</font> "; + flush(); + } + $lastnum = $num; + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testmssql.php b/pos/is4c-nf/lib/adodb5/tests/testmssql.php new file mode 100644 index 000000000..b858481c4 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testmssql.php @@ -0,0 +1,76 @@ +<?php + +/** + * @version V4.50 6 July 2004 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Set tabs to 4 for best viewing. + * + * Latest version is available at http://php.weblogs.com + * + * Test GetUpdateSQL and GetInsertSQL. + */ + +error_reporting(E_ALL); + + +include('../adodb.inc.php'); +include('../tohtml.inc.php'); + +//========================== +// This code tests an insert + + + +$conn = ADONewConnection("mssql"); // create a connection +$conn->Connect('127.0.0.1','adodb','natsoft','northwind') or die('Fail'); + +$conn->debug =1; +$query = 'select * from products'; +$conn->SetFetchMode(ADODB_FETCH_ASSOC); +$rs = $conn->Execute($query); +echo "<pre>"; +while( !$rs->EOF ) { + $output[] = $rs->fields; + var_dump($rs->fields); + $rs->MoveNext(); + print "<p>"; +} +die(); + + +$p = $conn->Prepare('insert into products (productname,unitprice,dcreated) values (?,?,?)'); +echo "<pre>"; +print_r($p); + +$conn->debug=1; +$conn->Execute($p,array('John'.rand(),33.3,$conn->DBDate(time()))); + +$p = $conn->Prepare('select * from products where productname like ?'); +$arr = $conn->getarray($p,array('V%')); +print_r($arr); +die(); + +//$conn = ADONewConnection("mssql"); +//$conn->Connect('mangrove','sa','natsoft','ai'); + +//$conn->Connect('mangrove','sa','natsoft','ai'); +$conn->debug=1; +$conn->Execute('delete from blobtest'); + +$conn->Execute('insert into blobtest (id) values(1)'); +$conn->UpdateBlobFile('blobtest','b1','../cute_icons_for_site/adodb.gif','id=1'); +$rs = $conn->Execute('select b1 from blobtest where id=1'); + +$output = "c:\\temp\\test_out-".date('H-i-s').".gif"; +print "Saving file <b>$output</b>, size=".strlen($rs->fields[0])."<p>"; +$fd = fopen($output, "wb"); +fwrite($fd, $rs->fields[0]); +fclose($fd); + +print " <a href=file://$output>View Image</a>"; +//$rs = $conn->Execute('SELECT id,SUBSTRING(b1, 1, 10) FROM blobtest'); +//rs2html($rs); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testoci8.php b/pos/is4c-nf/lib/adodb5/tests/testoci8.php new file mode 100644 index 000000000..2886ccf22 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testoci8.php @@ -0,0 +1,83 @@ +<html> +<body> +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ +error_reporting(E_ALL | E_STRICT); +include("../adodb.inc.php"); +include("../tohtml.inc.php"); + +if (0) { + $db = ADONewConnection('oci8po'); + + $db->PConnect('','scott','natsoft'); + if (!empty($testblob)) { + $varHoldingBlob = 'ABC DEF GEF John TEST'; + $num = time()%10240; + // create table atable (id integer, ablob blob); + $db->Execute('insert into ATABLE (id,ablob) values('.$num.',empty_blob())'); + $db->UpdateBlob('ATABLE', 'ablob', $varHoldingBlob, 'id='.$num, 'BLOB'); + + $rs = $db->Execute('select * from atable'); + + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); + } + $stmt = $db->Prepare('select * from adoxyz where id=?'); + for ($i = 1; $i <= 10; $i++) { + $rs = $db->Execute( + $stmt, + array($i)); + + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); + } +} +if (1) { + $db = ADONewConnection('oci8'); + $db->PConnect('','scott','natsoft'); + $db->debug = true; + $db->Execute("delete from emp where ename='John'"); + print $db->Affected_Rows().'<BR>'; + $stmt = $db->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); + $rs = $db->Execute($stmt,array('empno'=>4321,'ename'=>'John')); + // prepare not quite ready for prime time + //$rs = $db->Execute($stmt,array('empno'=>3775,'ename'=>'John')); + if (!$rs) die("Empty RS"); + + $db->setfetchmode(ADODB_FETCH_NUM); + + $vv = 'A%'; + $stmt = $db->PrepareSP("BEGIN adodb.open_tab2(:rs,:tt); END;",true); + $db->OutParameter($stmt, $cur, 'rs', -1, OCI_B_CURSOR); + $db->OutParameter($stmt, $vv, 'tt'); + $rs = $db->Execute($stmt); + while (!$rs->EOF) { + adodb_pr($rs->fields); + $rs->MoveNext(); + } + echo " val = $vv"; + +} + +if (0) { + $db = ADONewConnection('odbc_oracle'); + if (!$db->PConnect('local_oracle','scott','tiger')) die('fail connect'); + $db->debug = true; + $rs = $db->Execute( + 'select * from adoxyz where firstname=? and trim(lastname)=?', + array('first'=>'Caroline','last'=>'Miranda')); + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testoci8cursor.php b/pos/is4c-nf/lib/adodb5/tests/testoci8cursor.php new file mode 100644 index 000000000..a75f27dbe --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testoci8cursor.php @@ -0,0 +1,111 @@ +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + +/* + Test for Oracle Variable Cursors, which are treated as ADOdb recordsets. + + We have 2 examples. The first shows us using the Parameter statement. + The second shows us using the new ExecuteCursor($sql, $cursorName) + function. + +------------------------------------------------------------------ +-- TEST PACKAGE YOU NEED TO INSTALL ON ORACLE - run from sql*plus +------------------------------------------------------------------ + + +-- TEST PACKAGE +CREATE OR REPLACE PACKAGE adodb AS +TYPE TabType IS REF CURSOR RETURN tab%ROWTYPE; +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames in varchar); +PROCEDURE data_out(input IN varchar, output OUT varchar); + +procedure myproc (p1 in number, p2 out number); +END adodb; +/ + +CREATE OR REPLACE PACKAGE BODY adodb AS +PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames in varchar) IS + BEGIN + OPEN tabcursor FOR SELECT * FROM tab where tname like tablenames; + END open_tab; + +PROCEDURE data_out(input IN varchar, output OUT varchar) IS + BEGIN + output := 'Cinta Hati '||input; + END; + +procedure myproc (p1 in number, p2 out number) as +begin +p2 := p1; +end; +END adodb; +/ + +------------------------------------------------------------------ +-- END PACKAGE +------------------------------------------------------------------ + +*/ + +include('../adodb.inc.php'); +include('../tohtml.inc.php'); + + error_reporting(E_ALL); + $db = ADONewConnection('oci8'); + $db->PConnect('','scott','natsoft'); + $db->debug = 99; + + +/* +*/ + + define('MYNUM',5); + + + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS,'A%'); END;"); + + if ($rs && !$rs->EOF) { + print "Test 1 RowCount: ".$rs->RecordCount()."<p>"; + } else { + print "<b>Error in using Cursor Variables 1</b><p>"; + } + + print "<h4>Testing Stored Procedures for oci8</h4>"; + + $stid = $db->PrepareSP('BEGIN adodb.myproc('.MYNUM.', :myov); END;'); + $db->OutParameter($stid, $myov, 'myov'); + $db->Execute($stid); + if ($myov != MYNUM) print "<p><b>Error with myproc</b></p>"; + + + $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;",true); + $a1 = 'Malaysia'; + //$a2 = ''; # a2 doesn't even need to be defined! + $db->InParameter($stmt,$a1,'a1'); + $db->OutParameter($stmt,$a2,'a2'); + $rs = $db->Execute($stmt); + if ($rs) { + if ($a2 !== 'Cinta Hati Malaysia') print "<b>Stored Procedure Error: a2 = $a2</b><p>"; + else echo "OK: a2=$a2<p>"; + } else { + print "<b>Error in using Stored Procedure IN/Out Variables</b><p>"; + } + + + $tname = 'A%'; + + $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); + $db->Parameter($stmt,$tname,'tablename'); + $rs = $db->Execute($stmt); + rs2html($rs); + + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testpaging.php b/pos/is4c-nf/lib/adodb5/tests/testpaging.php new file mode 100644 index 000000000..85ab5e286 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testpaging.php @@ -0,0 +1,86 @@ +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + +error_reporting(E_ALL); + + +include_once('../adodb.inc.php'); +include_once('../adodb-pager.inc.php'); + +$driver = 'oci8'; +$sql = 'select ID, firstname as "First Name", lastname as "Last Name" from adoxyz order by id'; +//$sql = 'select count(*),firstname from adoxyz group by firstname order by 2 '; +//$sql = 'select distinct firstname, lastname from adoxyz order by firstname'; + +if ($driver == 'postgres') { + $db = NewADOConnection('postgres'); + $db->PConnect('localhost','tester','test','test'); +} + +if ($driver == 'access') { + $db = NewADOConnection('access'); + $db->PConnect("nwind", "", "", ""); +} + +if ($driver == 'ibase') { + $db = NewADOConnection('ibase'); + $db->PConnect("localhost:e:\\firebird\\examples\\employee.gdb", "sysdba", "masterkey", ""); + $sql = 'select distinct firstname, lastname from adoxyz order by firstname'; + +} +if ($driver == 'mssql') { + $db = NewADOConnection('mssql'); + $db->Connect('JAGUAR\vsdotnet','adodb','natsoft','northwind'); +} +if ($driver == 'oci8') { + $db = NewADOConnection('oci8'); + $db->Connect('','scott','natsoft'); + +$sql = "select * from (select ID, firstname as \"First Name\", lastname as \"Last Name\" from adoxyz + order by 1)"; +} + +if ($driver == 'access') { + $db = NewADOConnection('access'); + $db->Connect('nwind'); +} + +if (empty($driver) or $driver == 'mysql') { + $db = NewADOConnection('mysql'); + $db->Connect('localhost','root','','test'); +} + +//$db->pageExecuteCountRows = false; + +$db->debug = true; + +if (0) { +$rs = $db->Execute($sql); +include_once('../toexport.inc.php'); +print "<pre>"; +print rs2csv($rs); # return a string + +print '<hr />'; +$rs->MoveFirst(); # note, some databases do not support MoveFirst +print rs2tab($rs); # return a string + +print '<hr />'; +$rs->MoveFirst(); +rs2tabout($rs); # send to stdout directly +print "</pre>"; +} + +$pager = new ADODB_Pager($db,$sql); +$pager->showPageLinks = true; +$pager->linksPerPage = 10; +$pager->cache = 60; +$pager->Render($rows=7); +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testpear.php b/pos/is4c-nf/lib/adodb5/tests/testpear.php new file mode 100644 index 000000000..d1a4ef91d --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testpear.php @@ -0,0 +1,34 @@ +<?php +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + +error_reporting(E_ALL); + +include_once('../adodb-pear.inc.php'); +$username = 'root'; +$password = ''; +$hostname = 'localhost'; +$databasename = 'xphplens'; +$driver = 'mysql'; + +$dsn = "$driver://$username:$password@$hostname/$databasename"; + +$db = DB::Connect($dsn); +$db->setFetchMode(ADODB_FETCH_ASSOC); +$rs = $db->Query('select firstname,lastname from adoxyz'); +$cnt = 0; +while ($arr = $rs->FetchRow()) { + print_r($arr); + print "<br>"; + $cnt += 1; +} + +if ($cnt != 50) print "<b>Error in \$cnt = $cnt</b>"; +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/testsessions.php b/pos/is4c-nf/lib/adodb5/tests/testsessions.php new file mode 100644 index 000000000..e8b59f22e --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/testsessions.php @@ -0,0 +1,98 @@ +<?php + +/* +V4.80 8 Mar 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + Set tabs to 4 for best viewing. + + Latest version is available at http://adodb.sourceforge.net +*/ + +function NotifyExpire($ref,$key) +{ + print "<p><b>Notify Expiring=$ref, sessionkey=$key</b></p>"; +} + +//------------------------------------------------------------------- + +error_reporting(E_ALL); + + +ob_start(); +include('../session/adodb-cryptsession2.php'); + +$options['debug'] = 1; +$db = 'oci8'; + +#### CONNECTION +switch($db) { +case 'oci8': + $options['table'] = 'adodb_sessions2'; + ADOdb_Session::config('oci8', '', 'jcollect_bkrm', 'natsoft', '',$options); + break; + +case 'postgres': + $options['table'] = 'sessions2'; + ADOdb_Session::config('postgres', 'localhost', 'tester', 'test', 'test',$options); + break; + +case 'mysql': +default: + $options['table'] = 'sessions2'; + ADOdb_Session::config('mysql', 'localhost', 'root', '', 'xphplens_2',$options); + break; + + +} + + + +#### SETUP NOTIFICATION + $USER = 'JLIM'.rand(); + $ADODB_SESSION_EXPIRE_NOTIFY = array('USER','NotifyExpire'); + + adodb_session_create_table(); + session_start(); + + adodb_session_regenerate_id(); + +### SETUP SESSION VARIABLES + if (empty($_SESSION['MONKEY'])) $_SESSION['MONKEY'] = array(1,'abc',44.41); + else $_SESSION['MONKEY'][0] += 1; + if (!isset($_GET['nochange'])) @$_SESSION['AVAR'] += 1; + + +### START DISPLAY + print "<h3>PHP ".PHP_VERSION."</h3>"; + print "<p><b>\$_SESSION['AVAR']={$_SESSION['AVAR']}</b></p>"; + + print "<hr /> <b>Cookies</b>: "; + print_r($_COOKIE); + + var_dump($_SESSION['MONKEY']); + +### RANDOMLY PERFORM Garbage Collection +### In real-production environment, this is done for you +### by php's session extension, which calls adodb_sess_gc() +### automatically for you. See php.ini's +### session.cookie_lifetime and session.gc_probability + + if (rand() % 5 == 0) { + + print "<hr /><p><b>Garbage Collection</b></p>"; + adodb_sess_gc(10); + + if (rand() % 2 == 0) { + print "<p>Random own session destroy</p>"; + session_destroy(); + } + } else { + $DB = ADODB_Session::_conn(); + $sessk = $DB->qstr('%AZ'.rand().time()); + $olddate = $DB->DBTimeStamp(time()-30*24*3600); + $rr = $DB->qstr(rand()); + $DB->Execute("insert into {$options['table']} (sesskey,expiry,expireref,sessdata,created,modified) values ($sessk,$olddate, $rr,'',$olddate,$olddate)"); + } +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/time.php b/pos/is4c-nf/lib/adodb5/tests/time.php new file mode 100644 index 000000000..65e9e08ff --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/time.php @@ -0,0 +1,18 @@ +<?php + +include_once('../adodb-time.inc.php'); +adodb_date_test(); +?> +<?php +//require("adodb-time.inc.php"); + +$datestring = "2063-12-24"; // string normally from mySQL +$stringArray = explode("-", $datestring); +$date = adodb_mktime(0,0,0,$stringArray[1],$stringArray[2],$stringArray[0]); + +$convertedDate = adodb_date("d-M-Y", $date); // converted string to UK style date + +echo( "Original: $datestring<br>" ); +echo( "Converted: $convertedDate" ); //why is string returned as one day (3 not 4) less for this example?? + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/tmssql.php b/pos/is4c-nf/lib/adodb5/tests/tmssql.php new file mode 100644 index 000000000..4975787da --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/tmssql.php @@ -0,0 +1,80 @@ +<?php +error_reporting(E_ALL); +ini_set('mssql.datetimeconvert',0); + +function tmssql() +{ + print "<h3>mssql</h3>"; + $db = mssql_connect('JAGUAR\vsdotnet','adodb','natsoft') or die('No Connection'); + mssql_select_db('northwind',$db); + + $rs = mssql_query('select getdate() as date',$db); + $o = mssql_fetch_row($rs); + print_r($o); + mssql_free_result($rs); + + print "<p>Delete</p>"; flush(); + $rs2 = mssql_query('delete from adoxyz',$db); + $p = mssql_num_rows($rs2); + mssql_free_result($rs2); + +} + +function tpear() +{ +include_once('DB.php'); + + print "<h3>PEAR</h3>"; + $username = 'adodb'; + $password = 'natsoft'; + $hostname = 'JAGUAR\vsdotnet'; + $databasename = 'northwind'; + + $dsn = "mssql://$username:$password@$hostname/$databasename"; + $conn = DB::connect($dsn); + print "date=".$conn->GetOne('select getdate()')."<br>"; + @$conn->query('create table tester (id integer)'); + print "<p>Delete</p>"; flush(); + $rs = $conn->query('delete from tester'); + print "date=".$conn->GetOne('select getdate()')."<br>"; +} + +function tadodb() +{ +include_once('../adodb.inc.php'); + + print "<h3>ADOdb</h3>"; + $conn = NewADOConnection('mssql'); + $conn->Connect('JAGUAR\vsdotnet','adodb','natsoft','northwind'); +// $conn->debug=1; + print "date=".$conn->GetOne('select getdate()')."<br>"; + $conn->Execute('create table tester (id integer)'); + print "<p>Delete</p>"; flush(); + $rs = $conn->Execute('delete from tester'); + print "date=".$conn->GetOne('select getdate()')."<br>"; +} + + +$ACCEPTIP = '127.0.0.1'; + +$remote = $_SERVER["REMOTE_ADDR"]; + +if (!empty($ACCEPTIP)) + if ($remote != '127.0.0.1' && $remote != $ACCEPTIP) + die("Unauthorised client: '$remote'"); + +?> +<a href=tmssql.php?do=tmssql>mssql</a> +<a href=tmssql.php?do=tpear>pear</a> +<a href=tmssql.php?do=tadodb>adodb</a> +<?php +if (!empty($_GET['do'])) { + $do = $_GET['do']; + switch($do) { + case 'tpear': + case 'tadodb': + case 'tmssql': + $do(); + } +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/xmlschema-mssql.xml b/pos/is4c-nf/lib/adodb5/tests/xmlschema-mssql.xml new file mode 100644 index 000000000..db2c34328 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/xmlschema-mssql.xml @@ -0,0 +1,34 @@ +<?xml version="1.0"?> +<schema version="0.3"> +<table name="simple_table"> +<field name="id" type="I" size="11"> +<KEY/> +<AUTOINCREMENT/> +</field> +<field name="name" type="C" size="3"> +<DEFAULT value="no"/> +</field> +<field name="description" type="X"></field> +<index name="id"> +<UNIQUE/> +<col>id</col> +</index> +<index name="id_2"> +<col>id</col> +</index> +<data> +</data> +</table> + <sql> + <descr>SQL to be executed only on specific platforms</descr> + <query platform="postgres|postgres7"> + insert into mytable ( row1, row2 ) values ( 12, 'postgres stuff' ) + </query> + <query platform="mysql"> + insert into mytable ( row1, row2 ) values ( 12, 'mysql stuff' ) + </query> + <query platform="mssql"> + INSERT into simple_table ( name, description ) values ( '12', 'Microsoft stuff' ) + </query> + </sql> +</schema> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tests/xmlschema.xml b/pos/is4c-nf/lib/adodb5/tests/xmlschema.xml new file mode 100644 index 000000000..ea48ae2bb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tests/xmlschema.xml @@ -0,0 +1,33 @@ +<?xml version="1.0"?> +<schema version="0.3"> + <table name="mytable"> + <field name="row1" type="I"> + <descr>An integer row that's a primary key and autoincrements</descr> + <KEY/> + <AUTOINCREMENT/> + </field> + <field name="row2" type="C" size="16"> + <descr>A 16 character varchar row that can't be null</descr> + <NOTNULL/> + </field> + <index name="myindex"> + <col>row1</col> + <col>row2</col> + </index> + </table> + <sql> + <descr>SQL to be executed only on specific platforms</descr> + <query platform="postgres|postgres7"> + insert into mytable ( row1, row2 ) values ( 12, 'postgres stuff' ) + </query> + <query platform="mysql"> + insert into mytable ( row1, row2 ) values ( 12, 'mysql stuff' ) + </query> + <query platform="mssql"> + insert into mytable ( row1, row2 ) values ( 12, 'Microsoft stuff' ) + </query> + </sql> + <table name="obsoletetable"> + <DROP/> + </table> +</schema> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/toexport.inc.php b/pos/is4c-nf/lib/adodb5/toexport.inc.php new file mode 100644 index 000000000..57b8bd1eb --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/toexport.inc.php @@ -0,0 +1,134 @@ +<?php + +/** + * @version V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + * Released under both BSD license and Lesser GPL library license. + * Whenever there is any discrepancy between the two licenses, + * the BSD license will take precedence. + * + * Code to export recordsets in several formats: + * + * AS VARIABLE + * $s = rs2csv($rs); # comma-separated values + * $s = rs2tab($rs); # tab delimited + * + * TO A FILE + * $f = fopen($path,'w'); + * rs2csvfile($rs,$f); + * fclose($f); + * + * TO STDOUT + * rs2csvout($rs); + */ + +// returns a recordset as a csv string +function rs2csv(&$rs,$addtitles=true) +{ + return _adodb_export($rs,',',',',false,$addtitles); +} + +// writes recordset to csv file +function rs2csvfile(&$rs,$fp,$addtitles=true) +{ + _adodb_export($rs,',',',',$fp,$addtitles); +} + +// write recordset as csv string to stdout +function rs2csvout(&$rs,$addtitles=true) +{ + $fp = fopen('php://stdout','wb'); + _adodb_export($rs,',',',',true,$addtitles); + fclose($fp); +} + +function rs2tab(&$rs,$addtitles=true) +{ + return _adodb_export($rs,"\t",',',false,$addtitles); +} + +// to file pointer +function rs2tabfile(&$rs,$fp,$addtitles=true) +{ + _adodb_export($rs,"\t",',',$fp,$addtitles); +} + +// to stdout +function rs2tabout(&$rs,$addtitles=true) +{ + $fp = fopen('php://stdout','wb'); + _adodb_export($rs,"\t",' ',true,$addtitles); + if ($fp) fclose($fp); +} + +function _adodb_export(&$rs,$sep,$sepreplace,$fp=false,$addtitles=true,$quote = '"',$escquote = '"',$replaceNewLine = ' ') +{ + if (!$rs) return ''; + //---------- + // CONSTANTS + $NEWLINE = "\r\n"; + $BUFLINES = 100; + $escquotequote = $escquote.$quote; + $s = ''; + + if ($addtitles) { + $fieldTypes = $rs->FieldTypesArray(); + reset($fieldTypes); + $i = 0; + while(list(,$o) = each($fieldTypes)) { + + $v = ($o) ? $o->name : 'Field'.($i++); + if ($escquote) $v = str_replace($quote,$escquotequote,$v); + $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); + $elements[] = $v; + + } + $s .= implode($sep, $elements).$NEWLINE; + } + $hasNumIndex = isset($rs->fields[0]); + + $line = 0; + $max = $rs->FieldCount(); + + while (!$rs->EOF) { + $elements = array(); + $i = 0; + + if ($hasNumIndex) { + for ($j=0; $j < $max; $j++) { + $v = $rs->fields[$j]; + if (!is_object($v)) $v = trim($v); + else $v = 'Object'; + if ($escquote) $v = str_replace($quote,$escquotequote,$v); + $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); + + if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; + else $elements[] = $v; + } + } else { // ASSOCIATIVE ARRAY + foreach($rs->fields as $v) { + if ($escquote) $v = str_replace($quote,$escquotequote,trim($v)); + $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); + + if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; + else $elements[] = $v; + } + } + $s .= implode($sep, $elements).$NEWLINE; + $rs->MoveNext(); + $line += 1; + if ($fp && ($line % $BUFLINES) == 0) { + if ($fp === true) echo $s; + else fwrite($fp,$s); + $s = ''; + } + } + + if ($fp) { + if ($fp === true) echo $s; + else fwrite($fp,$s); + $s = ''; + } + + return $s; +} +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/tohtml.inc.php b/pos/is4c-nf/lib/adodb5/tohtml.inc.php new file mode 100644 index 000000000..6a4e3ba47 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/tohtml.inc.php @@ -0,0 +1,201 @@ +<?php +/* + V4.93 10 Oct 2006 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. + Released under both BSD license and Lesser GPL library license. + Whenever there is any discrepancy between the two licenses, + the BSD license will take precedence. + + Some pretty-printing by Chris Oxenreider <oxenreid@state.net> +*/ + +// specific code for tohtml +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; + +$ADODB_ROUND=4; // rounding +$gSQLMaxRows = 1000; // max no of rows to download +$gSQLBlockRows=20; // max no of rows per table block + +// RecordSet to HTML Table +//------------------------------------------------------------ +// Convert a recordset to a html table. Multiple tables are generated +// if the number of rows is > $gSQLBlockRows. This is because +// web browsers normally require the whole table to be downloaded +// before it can be rendered, so we break the output into several +// smaller faster rendering tables. +// +// $rs: the recordset +// $ztabhtml: the table tag attributes (optional) +// $zheaderarray: contains the replacement strings for the headers (optional) +// +// USAGE: +// include('adodb.inc.php'); +// $db = ADONewConnection('mysql'); +// $db->Connect('mysql','userid','password','database'); +// $rs = $db->Execute('select col1,col2,col3 from table'); +// rs2html($rs, 'BORDER=2', array('Title1', 'Title2', 'Title3')); +// $rs->Close(); +// +// RETURNS: number of rows displayed + + +function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true) +{ +$s ='';$rows=0;$docnt = false; +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; + + if (!$rs) { + printf(ADODB_BAD_RS,'rs2html'); + return false; + } + + if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'"; + //else $docnt = true; + $typearr = array(); + $ncols = $rs->FieldCount(); + $hdr = "<TABLE COLS=$ncols $ztabhtml><tr>\n\n"; + for ($i=0; $i < $ncols; $i++) { + $field = $rs->FetchField($i); + if ($field) { + if ($zheaderarray) $fname = $zheaderarray[$i]; + else $fname = htmlspecialchars($field->name); + $typearr[$i] = $rs->MetaType($field->type,$field->max_length); + //print " $field->name $field->type $typearr[$i] "; + } else { + $fname = 'Field '.($i+1); + $typearr[$i] = 'C'; + } + if (strlen($fname)==0) $fname = '&nbsp;'; + $hdr .= "<TH>$fname</TH>"; + } + $hdr .= "\n</tr>"; + if ($echo) print $hdr."\n\n"; + else $html = $hdr; + + // smart algorithm - handles ADODB_FETCH_MODE's correctly by probing... + $numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]); + while (!$rs->EOF) { + + $s .= "<TR valign=top>\n"; + + for ($i=0; $i < $ncols; $i++) { + if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields); + else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields); + + $type = $typearr[$i]; + switch($type) { + case 'D': + if (strpos($v,':') !== false); + else { + if (empty($v)) { + $s .= "<TD> &nbsp; </TD>\n"; + } else { + $s .= " <TD>".$rs->UserDate($v,"D d, M Y") ."</TD>\n"; + } + break; + } + case 'T': + if (empty($v)) $s .= "<TD> &nbsp; </TD>\n"; + else $s .= " <TD>".$rs->UserTimeStamp($v,"D d, M Y, H:i:s") ."</TD>\n"; + break; + + case 'N': + if (abs(abs($v) - round($v,0)) < 0.00000001) + $v = round($v); + else + $v = round($v,$ADODB_ROUND); + case 'I': + $vv = stripslashes((trim($v))); + if (strlen($vv) == 0) $vv .= '&nbsp;'; + $s .= " <TD align=right>".$vv ."</TD>\n"; + + break; + /* + case 'B': + if (substr($v,8,2)=="BM" ) $v = substr($v,8); + $mtime = substr(str_replace(' ','_',microtime()),2); + $tmpname = "tmp/".uniqid($mtime).getmypid(); + $fd = @fopen($tmpname,'a'); + @ftruncate($fd,0); + @fwrite($fd,$v); + @fclose($fd); + if (!function_exists ("mime_content_type")) { + function mime_content_type ($file) { + return exec("file -bi ".escapeshellarg($file)); + } + } + $t = mime_content_type($tmpname); + $s .= (substr($t,0,5)=="image") ? " <td><img src='$tmpname' alt='$t'></td>\\n" : " <td><a + href='$tmpname'>$t</a></td>\\n"; + break; + */ + + default: + if ($htmlspecialchars) $v = htmlspecialchars(trim($v)); + $v = trim($v); + if (strlen($v) == 0) $v = '&nbsp;'; + $s .= " <TD>". str_replace("\n",'<br>',stripslashes($v)) ."</TD>\n"; + + } + } // for + $s .= "</TR>\n\n"; + + $rows += 1; + if ($rows >= $gSQLMaxRows) { + $rows = "<p>Truncated at $gSQLMaxRows</p>"; + break; + } // switch + + $rs->MoveNext(); + + // additional EOF check to prevent a widow header + if (!$rs->EOF && $rows % $gSQLBlockRows == 0) { + + //if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP + if ($echo) print $s . "</TABLE>\n\n"; + else $html .= $s ."</TABLE>\n\n"; + $s = $hdr; + } + } // while + + if ($echo) print $s."</TABLE>\n\n"; + else $html .= $s."</TABLE>\n\n"; + + if ($docnt) if ($echo) print "<H2>".$rows." Rows</H2>"; + + return ($echo) ? $rows : $html; + } + +// pass in 2 dimensional array +function arr2html(&$arr,$ztabhtml='',$zheaderarray='') +{ + if (!$ztabhtml) $ztabhtml = 'BORDER=1'; + + $s = "<TABLE $ztabhtml>";//';print_r($arr); + + if ($zheaderarray) { + $s .= '<TR>'; + for ($i=0; $i<sizeof($zheaderarray); $i++) { + $s .= " <TH>{$zheaderarray[$i]}</TH>\n"; + } + $s .= "\n</TR>"; + } + + for ($i=0; $i<sizeof($arr); $i++) { + $s .= '<TR>'; + $a = $arr[$i]; + if (is_array($a)) + for ($j=0; $j<sizeof($a); $j++) { + $val = $a[$j]; + if (empty($val)) $val = '&nbsp;'; + $s .= " <TD>$val</TD>\n"; + } + else if ($a) { + $s .= ' <TD>'.$a."</TD>\n"; + } else $s .= " <TD>&nbsp;</TD>\n"; + $s .= "\n</TR>\n"; + } + $s .= '</TABLE>'; + print $s; +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xmlschema.dtd b/pos/is4c-nf/lib/adodb5/xmlschema.dtd new file mode 100644 index 000000000..4a055da4e --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xmlschema.dtd @@ -0,0 +1,39 @@ +<?xml version="1.0"?> +<!DOCTYPE adodb_schema [ +<!ELEMENT schema (table*, sql*)> +<!ATTLIST schema version CDATA #REQUIRED> +<!ELEMENT table ((field+|DROP), CONSTRAINT*, descr?, index*, data*)> +<!ELEMENT field ((NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, +NOQUOTE?, CONSTRAINT*, descr?)> +<!ELEMENT data (row+)> +<!ELEMENT row (f+)> +<!ELEMENT f (#CDATA)> +<!ELEMENT descr (#CDATA)> +<!ELEMENT NOTNULL EMPTY> +<!ELEMENT KEY EMPTY> +<!ELEMENT PRIMARY EMPTY> +<!ELEMENT AUTO EMPTY> +<!ELEMENT AUTOINCREMENT EMPTY> +<!ELEMENT DEFAULT EMPTY> +<!ELEMENT DEFDATE EMPTY> +<!ELEMENT DEFTIMESTAMP EMPTY> +<!ELEMENT NOQUOTE EMPTY> +<!ELEMENT DROP EMPTY> +<!ELEMENT CONSTRAINT (#CDATA)> +<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED> +<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED> +<!ATTLIST data platform CDATA #IMPLIED> +<!ATTLIST f name CDATA #IMPLIED> +<!ATTLIST DEFAULT VALUE CDATA #REQUIRED> +<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)> +<!ELEMENT col (#CDATA)> +<!ELEMENT CLUSTERED EMPTY> +<!ELEMENT BITMAP EMPTY> +<!ELEMENT UNIQUE EMPTY> +<!ELEMENT FULLTEXT EMPTY> +<!ELEMENT HASH EMPTY> +<!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED> +<!ELEMENT sql (query+, descr?)> +<!ELEMENT query (#CDATA)> +<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE) > +] > \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xmlschema03.dtd b/pos/is4c-nf/lib/adodb5/xmlschema03.dtd new file mode 100644 index 000000000..a7c8864ff --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xmlschema03.dtd @@ -0,0 +1,43 @@ +<?xml version="1.0"?> +<!DOCTYPE adodb_schema [ +<!ELEMENT schema (table*, sql*)> +<!ATTLIST schema version CDATA #REQUIRED> +<!ELEMENT table (descr?, (field+|DROP), constraint*, opt*, index*, data*)> +<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED> +<!ELEMENT field (descr?, (NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, NOQUOTE?, UNSIGNED?, constraint*, opt*)> +<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED opts CDATA #IMPLIED> +<!ELEMENT data (descr?, row+)> +<!ATTLIST data platform CDATA #IMPLIED> +<!ELEMENT row (f+)> +<!ELEMENT f (#CDATA)> +<!ATTLIST f name CDATA #IMPLIED> +<!ELEMENT descr (#CDATA)> +<!ELEMENT NOTNULL EMPTY> +<!ELEMENT KEY EMPTY> +<!ELEMENT PRIMARY EMPTY> +<!ELEMENT AUTO EMPTY> +<!ELEMENT AUTOINCREMENT EMPTY> +<!ELEMENT DEFAULT EMPTY> +<!ATTLIST DEFAULT value CDATA #REQUIRED> +<!ELEMENT DEFDATE EMPTY> +<!ELEMENT DEFTIMESTAMP EMPTY> +<!ELEMENT NOQUOTE EMPTY> +<!ELEMENT UNSIGNED EMPTY> +<!ELEMENT DROP EMPTY> +<!ELEMENT constraint (#CDATA)> +<!ATTLIST constraint platform CDATA #IMPLIED> +<!ELEMENT opt (#CDATA)> +<!ATTLIST opt platform CDATA #IMPLIED> +<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)> +<!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED> +<!ELEMENT col (#CDATA)> +<!ELEMENT CLUSTERED EMPTY> +<!ELEMENT BITMAP EMPTY> +<!ELEMENT UNIQUE EMPTY> +<!ELEMENT FULLTEXT EMPTY> +<!ELEMENT HASH EMPTY> +<!ELEMENT sql (query+, descr?)> +<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE)> +<!ELEMENT query (#CDATA)> +<!ATTLIST query platform CDATA #IMPLIED> +]> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xsl/convert-0.1-0.2.xsl b/pos/is4c-nf/lib/adodb5/xsl/convert-0.1-0.2.xsl new file mode 100644 index 000000000..6cd9e5bf1 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xsl/convert-0.1-0.2.xsl @@ -0,0 +1,205 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/> + + <!-- Schema --> + <xsl:template match="/"> + <xsl:comment> +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net +</xsl:comment> + + <xsl:element name="schema"> + <xsl:attribute name="version">0.2</xsl:attribute> + + <xsl:apply-templates select="schema/table|schema/sql"/> + </xsl:element> + </xsl:template> + + <!-- Table --> + <xsl:template match="table"> + <xsl:variable name="table_name" select="@name"/> + + <xsl:element name="table"> + <xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute> + + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@version) > 0"> + <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="field"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select="constraint"/> + + <xsl:apply-templates select="../index[@table=$table_name]"/> + </xsl:element> + </xsl:template> + + <!-- Field --> + <xsl:template match="field"> + <xsl:element name="field"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute> + + <xsl:if test="string-length(@size) > 0"> + <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute> + </xsl:if> + + <xsl:choose> + <xsl:when test="count(PRIMARY) > 0"> + <xsl:element name="PRIMARY"/> + </xsl:when> + <xsl:when test="count(KEY) > 0"> + <xsl:element name="KEY"/> + </xsl:when> + <xsl:when test="count(NOTNULL) > 0"> + <xsl:element name="NOTNULL"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(AUTO) > 0"> + <xsl:element name="AUTO"/> + </xsl:when> + <xsl:when test="count(AUTOINCREMENT) > 0"> + <xsl:element name="AUTOINCREMENT"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(DEFAULT) > 0"> + <xsl:element name="DEFAULT"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFAULT[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFDATE) > 0"> + <xsl:element name="DEFDATE"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFDATE[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFTIMESTAMP) > 0"> + <xsl:element name="DEFTIMESTAMP"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFTIMESTAMP[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + </xsl:choose> + + <xsl:if test="count(NOQUOTE) > 0"> + <xsl:element name="NOQUOTE"/> + </xsl:if> + + <xsl:apply-templates select="constraint"/> + </xsl:element> + </xsl:template> + + <!-- Constraint --> + <xsl:template match="constraint"> + <xsl:element name="constraint"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Index --> + <xsl:template match="index"> + <xsl:element name="index"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:if test="count(CLUSTERED) > 0"> + <xsl:element name="CLUSTERED"/> + </xsl:if> + + <xsl:if test="count(BITMAP) > 0"> + <xsl:element name="BITMAP"/> + </xsl:if> + + <xsl:if test="count(UNIQUE) > 0"> + <xsl:element name="UNIQUE"/> + </xsl:if> + + <xsl:if test="count(FULLTEXT) > 0"> + <xsl:element name="FULLTEXT"/> + </xsl:if> + + <xsl:if test="count(HASH) > 0"> + <xsl:element name="HASH"/> + </xsl:if> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="col"/> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:template> + + <!-- Index Column --> + <xsl:template match="col"> + <xsl:element name="col"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- SQL QuerySet --> + <xsl:template match="sql"> + <xsl:element name="sql"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@key) > 0"> + <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@prefixmethod) > 0"> + <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + <xsl:apply-templates select="query"/> + </xsl:element> + </xsl:template> + + <!-- Query --> + <xsl:template match="query"> + <xsl:element name="query"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Description --> + <xsl:template match="descr"> + <xsl:element name="descr"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> +</xsl:stylesheet> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xsl/convert-0.1-0.3.xsl b/pos/is4c-nf/lib/adodb5/xsl/convert-0.1-0.3.xsl new file mode 100644 index 000000000..381aa4fe7 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xsl/convert-0.1-0.3.xsl @@ -0,0 +1,221 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/> + + <!-- Schema --> + <xsl:template match="/"> + <xsl:comment> +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net +</xsl:comment> + + <xsl:element name="schema"> + <xsl:attribute name="version">0.3</xsl:attribute> + + <xsl:apply-templates select="schema/table|schema/sql"/> + </xsl:element> + </xsl:template> + + <!-- Table --> + <xsl:template match="table"> + <xsl:variable name="table_name" select="@name"/> + + <xsl:element name="table"> + <xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute> + + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@version) > 0"> + <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="field"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select="constraint"/> + + <xsl:apply-templates select="../index[@table=$table_name]"/> + </xsl:element> + </xsl:template> + + <!-- Field --> + <xsl:template match="field"> + <xsl:element name="field"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute> + + <xsl:if test="string-length(@size) > 0"> + <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute> + </xsl:if> + + <xsl:choose> + <xsl:when test="string-length(@opts) = 0"/> + <xsl:when test="@opts = 'UNSIGNED'"> + <xsl:element name="UNSIGNED"/> + </xsl:when> + <xsl:when test="contains(@opts,'UNSIGNED')"> + <xsl:attribute name="opts"> + <xsl:value-of select="concat(substring-before(@opts,'UNSIGNED'),substring-after(@opts,'UNSIGNED'))"/> + </xsl:attribute> + <xsl:element name="UNSIGNED"/> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="opts"><xsl:value-of select="@opts"/></xsl:attribute> + </xsl:otherwise> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(PRIMARY) > 0"> + <xsl:element name="PRIMARY"/> + </xsl:when> + <xsl:when test="count(KEY) > 0"> + <xsl:element name="KEY"/> + </xsl:when> + <xsl:when test="count(NOTNULL) > 0"> + <xsl:element name="NOTNULL"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(AUTO) > 0"> + <xsl:element name="AUTO"/> + </xsl:when> + <xsl:when test="count(AUTOINCREMENT) > 0"> + <xsl:element name="AUTOINCREMENT"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(DEFAULT) > 0"> + <xsl:element name="DEFAULT"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFAULT[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFDATE) > 0"> + <xsl:element name="DEFDATE"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFDATE[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFTIMESTAMP) > 0"> + <xsl:element name="DEFTIMESTAMP"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFTIMESTAMP[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + </xsl:choose> + + <xsl:if test="count(NOQUOTE) > 0"> + <xsl:element name="NOQUOTE"/> + </xsl:if> + + <xsl:apply-templates select="constraint"/> + </xsl:element> + </xsl:template> + + <!-- Constraint --> + <xsl:template match="constraint"> + <xsl:element name="constraint"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Index --> + <xsl:template match="index"> + <xsl:element name="index"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:if test="count(CLUSTERED) > 0"> + <xsl:element name="CLUSTERED"/> + </xsl:if> + + <xsl:if test="count(BITMAP) > 0"> + <xsl:element name="BITMAP"/> + </xsl:if> + + <xsl:if test="count(UNIQUE) > 0"> + <xsl:element name="UNIQUE"/> + </xsl:if> + + <xsl:if test="count(FULLTEXT) > 0"> + <xsl:element name="FULLTEXT"/> + </xsl:if> + + <xsl:if test="count(HASH) > 0"> + <xsl:element name="HASH"/> + </xsl:if> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="col"/> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:template> + + <!-- Index Column --> + <xsl:template match="col"> + <xsl:element name="col"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- SQL QuerySet --> + <xsl:template match="sql"> + <xsl:element name="sql"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@key) > 0"> + <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@prefixmethod) > 0"> + <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + <xsl:apply-templates select="query"/> + </xsl:element> + </xsl:template> + + <!-- Query --> + <xsl:template match="query"> + <xsl:element name="query"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Description --> + <xsl:template match="descr"> + <xsl:element name="descr"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> +</xsl:stylesheet> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xsl/convert-0.2-0.1.xsl b/pos/is4c-nf/lib/adodb5/xsl/convert-0.2-0.1.xsl new file mode 100644 index 000000000..61841b483 --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xsl/convert-0.2-0.1.xsl @@ -0,0 +1,207 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/> + + <!-- Schema --> + <xsl:template match="/"> + <xsl:comment> +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net +</xsl:comment> + + <xsl:element name="schema"> + <xsl:attribute name="version">0.1</xsl:attribute> + + <xsl:apply-templates select="schema/table|schema/sql"/> + </xsl:element> + </xsl:template> + + <!-- Table --> + <xsl:template match="table"> + <xsl:variable name="table_name" select="@name"/> + + <xsl:element name="table"> + <xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute> + + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@version) > 0"> + <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="field"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select="constraint"/> + + </xsl:element> + + <xsl:apply-templates select="index"/> + </xsl:template> + + <!-- Field --> + <xsl:template match="field"> + <xsl:element name="field"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute> + + <xsl:if test="string-length(@size) > 0"> + <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute> + </xsl:if> + + <xsl:choose> + <xsl:when test="count(PRIMARY) > 0"> + <xsl:element name="PRIMARY"/> + </xsl:when> + <xsl:when test="count(KEY) > 0"> + <xsl:element name="KEY"/> + </xsl:when> + <xsl:when test="count(NOTNULL) > 0"> + <xsl:element name="NOTNULL"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(AUTO) > 0"> + <xsl:element name="AUTO"/> + </xsl:when> + <xsl:when test="count(AUTOINCREMENT) > 0"> + <xsl:element name="AUTOINCREMENT"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(DEFAULT) > 0"> + <xsl:element name="DEFAULT"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFAULT[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFDATE) > 0"> + <xsl:element name="DEFDATE"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFDATE[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFTIMESTAMP) > 0"> + <xsl:element name="DEFDTIMESTAMP"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFTIMESTAMP[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + </xsl:choose> + + <xsl:if test="count(NOQUOTE) > 0"> + <xsl:element name="NOQUOTE"/> + </xsl:if> + + <xsl:apply-templates select="constraint"/> + </xsl:element> + </xsl:template> + + <!-- Constraint --> + <xsl:template match="constraint"> + <xsl:element name="constraint"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Index --> + <xsl:template match="index"> + <xsl:element name="index"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + <xsl:attribute name="table"><xsl:value-of select="../@name"/></xsl:attribute> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:if test="count(CLUSTERED) > 0"> + <xsl:element name="CLUSTERED"/> + </xsl:if> + + <xsl:if test="count(BITMAP) > 0"> + <xsl:element name="BITMAP"/> + </xsl:if> + + <xsl:if test="count(UNIQUE) > 0"> + <xsl:element name="UNIQUE"/> + </xsl:if> + + <xsl:if test="count(FULLTEXT) > 0"> + <xsl:element name="FULLTEXT"/> + </xsl:if> + + <xsl:if test="count(HASH) > 0"> + <xsl:element name="HASH"/> + </xsl:if> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="col"/> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:template> + + <!-- Index Column --> + <xsl:template match="col"> + <xsl:element name="col"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- SQL QuerySet --> + <xsl:template match="sql"> + <xsl:element name="sql"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@key) > 0"> + <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@prefixmethod) > 0"> + <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + <xsl:apply-templates select="query"/> + </xsl:element> + </xsl:template> + + <!-- Query --> + <xsl:template match="query"> + <xsl:element name="query"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Description --> + <xsl:template match="descr"> + <xsl:element name="descr"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> +</xsl:stylesheet> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xsl/convert-0.2-0.3.xsl b/pos/is4c-nf/lib/adodb5/xsl/convert-0.2-0.3.xsl new file mode 100644 index 000000000..26bd9e9aa --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xsl/convert-0.2-0.3.xsl @@ -0,0 +1,281 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/> + + <!-- Schema --> + <xsl:template match="/"> + <xsl:comment> +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net +</xsl:comment> + + <xsl:element name="schema"> + <xsl:attribute name="version">0.3</xsl:attribute> + + <xsl:apply-templates select="schema/table|schema/sql"/> + </xsl:element> + </xsl:template> + + <!-- Table --> + <xsl:template match="table"> + <xsl:element name="table"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@version) > 0"> + <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="field"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select="constraint"/> + + <xsl:apply-templates select="opt"/> + + <xsl:apply-templates select="index"/> + + <xsl:apply-templates select="data"/> + </xsl:element> + </xsl:template> + + <!-- Field --> + <xsl:template match="field"> + <xsl:element name="field"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute> + + <xsl:if test="string-length(@size) > 0"> + <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute> + </xsl:if> + + <xsl:choose> + <xsl:when test="string-length(@opts) = 0"> + <xsl:if test="count(UNSIGNED) > 0"> + <xsl:element name="UNSIGNED"/> + </xsl:if> + </xsl:when> + <xsl:when test="@opts = 'UNSIGNED'"> + <xsl:element name="UNSIGNED"/> + </xsl:when> + <xsl:when test="contains(@opts,'UNSIGNED')"> + <xsl:attribute name="opts"> + <xsl:value-of select="concat(substring-before(@opts,'UNSIGNED'),substring-after(@opts,'UNSIGNED'))"/> + </xsl:attribute> + <xsl:element name="UNSIGNED"/> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="opts"><xsl:value-of select="@opts"/></xsl:attribute> + <xsl:if test="count(UNSIGNED) > 0"> + <xsl:element name="UNSIGNED"/> + </xsl:if> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:choose> + <xsl:when test="count(PRIMARY) > 0"> + <xsl:element name="PRIMARY"/> + </xsl:when> + <xsl:when test="count(KEY) > 0"> + <xsl:element name="KEY"/> + </xsl:when> + <xsl:when test="count(NOTNULL) > 0"> + <xsl:element name="NOTNULL"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(AUTO) > 0"> + <xsl:element name="AUTO"/> + </xsl:when> + <xsl:when test="count(AUTOINCREMENT) > 0"> + <xsl:element name="AUTOINCREMENT"/> + </xsl:when> + </xsl:choose> + + <xsl:choose> + <xsl:when test="count(DEFAULT) > 0"> + <xsl:element name="DEFAULT"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFAULT[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFDATE) > 0"> + <xsl:element name="DEFDATE"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFDATE[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + <xsl:when test="count(DEFTIMESTAMP) > 0"> + <xsl:element name="DEFTIMESTAMP"> + <xsl:attribute name="value"> + <xsl:value-of select="DEFTIMESTAMP[1]/@value"/> + </xsl:attribute> + </xsl:element> + </xsl:when> + </xsl:choose> + + <xsl:if test="count(NOQUOTE) > 0"> + <xsl:element name="NOQUOTE"/> + </xsl:if> + + <xsl:apply-templates select="constraint"/> + + <xsl:apply-templates select="opt"/> + </xsl:element> + </xsl:template> + + <!-- Constraint --> + <xsl:template match="constraint"> + <xsl:element name="constraint"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Opt --> + <xsl:template match="opt"> + <xsl:element name="opt"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Index --> + <xsl:template match="index"> + <xsl:element name="index"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:if test="count(CLUSTERED) > 0"> + <xsl:element name="CLUSTERED"/> + </xsl:if> + + <xsl:if test="count(BITMAP) > 0"> + <xsl:element name="BITMAP"/> + </xsl:if> + + <xsl:if test="count(UNIQUE) > 0"> + <xsl:element name="UNIQUE"/> + </xsl:if> + + <xsl:if test="count(FULLTEXT) > 0"> + <xsl:element name="FULLTEXT"/> + </xsl:if> + + <xsl:if test="count(HASH) > 0"> + <xsl:element name="HASH"/> + </xsl:if> + + <xsl:choose> + <xsl:when test="count(DROP) > 0"> + <xsl:element name="DROP"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="col"/> + </xsl:otherwise> + </xsl:choose> + </xsl:element> + </xsl:template> + + <!-- Index Column --> + <xsl:template match="col"> + <xsl:element name="col"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- SQL QuerySet --> + <xsl:template match="sql"> + <xsl:element name="sql"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@key) > 0"> + <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@prefixmethod) > 0"> + <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:apply-templates select="query"/> + </xsl:element> + </xsl:template> + + <!-- Query --> + <xsl:template match="query"> + <xsl:element name="query"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Description --> + <xsl:template match="descr"> + <xsl:element name="descr"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> + + <!-- Data --> + <xsl:template match="data"> + <xsl:element name="data"> + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:apply-templates select="row"/> + </xsl:element> + </xsl:template> + + <!-- Data Row --> + <xsl:template match="row"> + <xsl:element name="row"> + <xsl:apply-templates select="f"/> + </xsl:element> + </xsl:template> + + <!-- Data Field --> + <xsl:template match="f"> + <xsl:element name="f"> + <xsl:if test="string-length(@name) > 0"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + </xsl:if> + + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> +</xsl:stylesheet> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xsl/remove-0.2.xsl b/pos/is4c-nf/lib/adodb5/xsl/remove-0.2.xsl new file mode 100644 index 000000000..9b10a528c --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xsl/remove-0.2.xsl @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/> + + <!-- Schema --> + <xsl:template match="/"> + <xsl:comment> +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net +</xsl:comment> + + <xsl:comment> +Uninstallation Schema +</xsl:comment> + + <xsl:element name="schema"> + <xsl:attribute name="version">0.2</xsl:attribute> + + <xsl:apply-templates select="schema/table"> + <xsl:sort select="position()" data-type="number" order="descending"/> + </xsl:apply-templates> + </xsl:element> + </xsl:template> + + <!-- Table --> + <xsl:template match="table"> + <xsl:if test="count(DROP) = 0"> + <xsl:element name="table"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@version) > 0"> + <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:element name="DROP"/> + </xsl:element> + </xsl:if> + </xsl:template> + + <!-- Description --> + <xsl:template match="descr"> + <xsl:element name="descr"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> +</xsl:stylesheet> \ No newline at end of file diff --git a/pos/is4c-nf/lib/adodb5/xsl/remove-0.3.xsl b/pos/is4c-nf/lib/adodb5/xsl/remove-0.3.xsl new file mode 100644 index 000000000..768e092bf --- /dev/null +++ b/pos/is4c-nf/lib/adodb5/xsl/remove-0.3.xsl @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +> + <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/> + + <!-- Schema --> + <xsl:template match="/"> + <xsl:comment> +ADODB XMLSchema +http://adodb-xmlschema.sourceforge.net +</xsl:comment> + + <xsl:comment> +Uninstallation Schema +</xsl:comment> + + <xsl:element name="schema"> + <xsl:attribute name="version">0.3</xsl:attribute> + + <xsl:apply-templates select="schema/table"> + <xsl:sort select="position()" data-type="number" order="descending"/> + </xsl:apply-templates> + </xsl:element> + </xsl:template> + + <!-- Table --> + <xsl:template match="table"> + <xsl:if test="count(DROP) = 0"> + <xsl:element name="table"> + <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute> + + <xsl:if test="string-length(@platform) > 0"> + <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute> + </xsl:if> + + <xsl:if test="string-length(@version) > 0"> + <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute> + </xsl:if> + + <xsl:apply-templates select="descr[1]"/> + + <xsl:element name="DROP"/> + </xsl:element> + </xsl:if> + </xsl:template> + + <!-- Description --> + <xsl:template match="descr"> + <xsl:element name="descr"> + <xsl:value-of select="normalize-space(text())"/> + </xsl:element> + </xsl:template> +</xsl:stylesheet> \ No newline at end of file diff --git a/pos/is4c-nf/lib/array_to_json.php.obsolete b/pos/is4c-nf/lib/array_to_json.php.obsolete new file mode 100644 index 000000000..3117fb2ab --- /dev/null +++ b/pos/is4c-nf/lib/array_to_json.php.obsolete @@ -0,0 +1,85 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @file + @brief Functions for JSON support in PHP < 5.3 + @deprecated See JsonLib +*/ + +/** + Convert an array to a JSON string + @param $arr an array of values + @return A JSON string representing the array +*/ +function array_to_json($arr){ + $ret = "["; + for($i=0;$i<count($arr);$i++){ + if (isset($arr[$i])) + $ret .= encode_value_json($arr[$i]).","; + else { + $ret = ""; + break; // not a numeric indexed array + } + } + if (!empty($ret)){ + $ret = substr($ret,0,strlen($ret)-1)."]"; + return $ret; + } + + $ret = "{"; + foreach($arr as $k=>$v){ + $ret .= '"'.$k.'":'; + $ret .= encode_value_json($v).","; + } + $ret = substr($ret,0,strlen($ret)-1)."}"; + return $ret; +} + +/** + Convert a variable to a JSON string + @param $val a single variable + @return A JSON string representing the variable +*/ +function encode_value_json($val){ + if (is_array($val)) return array_to_json($val); + if (is_numeric($val)) return $val; + if ($val === true) return 'true'; + if ($val === false) return 'false'; + else return '"'.addcslashes($val,"\\\"\r\n\t").'"'; +} + +/** + Remove newlines, carriage returns, and tabs + from the string (some browser don't like these + in JSON strings) + @str a string + @return the modified string +*/ +function fixstring($str){ + $str = str_replace("\n","",$str); + $str = str_replace("\r","",$str); + $str = str_replace("\t","",$str); +} + +?> diff --git a/pos/is4c-nf/lib/clientscripts.php.obsolete b/pos/is4c-nf/lib/clientscripts.php.obsolete new file mode 100644 index 000000000..e8535fbf9 --- /dev/null +++ b/pos/is4c-nf/lib/clientscripts.php.obsolete @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +function boxMsgscreen() { + global $CORE_PATH; + changeCurrentPageJS("{$CORE_PATH}gui-modules/boxMsg2.php"); +} + + +function receipt($arg) { + global $CORE_LOCAL,$CORE_PATH; + $CORE_LOCAL->set("receiptType",$arg); + echo "<script type=\"text/javascript\">\n"; + echo "window.top.end.location = '{$CORE_PATH}end.php';\n"; + echo "</script>\n"; +} + +?> diff --git a/pos/is4c-nf/lib/connect.php.obsolete b/pos/is4c-nf/lib/connect.php.obsolete new file mode 100644 index 000000000..825938572 --- /dev/null +++ b/pos/is4c-nf/lib/connect.php.obsolete @@ -0,0 +1,415 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @file + @brief Functions related to the database + @deprecated see Database +*/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!class_exists("SQLManager")) include($CORE_PATH."lib/SQLManager.php"); + +if (!function_exists("setglobalflags")) include($CORE_PATH."lib/loadconfig.php"); +if (!function_exists("pingport")) include($CORE_PATH."lib/lib.php"); +if (!function_exists("wmdiscount")) include($CORE_PATH."lib/prehkeys.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + + +/*********************************************************************************************** + + Functions transcribed from connect.asp on 07.13.03 by Brandon. + +***********************************************************************************************/ + +/** + Connect to the transaction database (local) + @return a SQLManager object +*/ +function tDataConnect() +{ + global $CORE_LOCAL; + + $sql = new SQLManager($CORE_LOCAL->get("localhost"),$CORE_LOCAL->get("DBMS"),$CORE_LOCAL->get("tDatabase"), + $CORE_LOCAL->get("localUser"),$CORE_LOCAL->get("localPass"),False); + return $sql; +} + +/** + Connect to the operational database (local) + @return a SQLManager object +*/ +function pDataConnect() +{ + global $CORE_LOCAL; + + $sql = new SQLManager($CORE_LOCAL->get("localhost"),$CORE_LOCAL->get("DBMS"),$CORE_LOCAL->get("pDatabase"), + $CORE_LOCAL->get("localUser"),$CORE_LOCAL->get("localPass"),False); + return $sql; +} + +/** + Connect to the remote server database + @return a SQLManager object +*/ +function mDataConnect() +{ + global $CORE_LOCAL; + + $sql = new SQLManager($CORE_LOCAL->get("mServer"),$CORE_LOCAL->get("mDBMS"),$CORE_LOCAL->get("mDatabase"), + $CORE_LOCAL->get("mUser"),$CORE_LOCAL->get("mPass"),False); + return $sql; +} + +// ----------getsubtotals()---------- + +// getsubtotals() updates the values held in our session variables. + +/** + Load values from subtotals view into $CORE_LOCAL. + Essentially refreshes totals in the session. +*/ +function getsubtotals() { + global $CORE_LOCAL; + + $query = "SELECT * FROM subtotals"; + $connection = tDataConnect(); + $result = $connection->query($query); + $row = $connection->fetch_array($result); + + // reset a few variables + if (!$row || $row["LastID"] == 0) { + $CORE_LOCAL->set("ttlflag",0); + $CORE_LOCAL->set("fntlflag",0); + setglobalflags(0); + } + + $CORE_LOCAL->set("LastID", (!$row || !isset($row['LastID'])) ? 0 : (double)$row["LastID"] ); + $cn = (!$row || !isset($row['card_no'])) ? "0" : trim($row["card_no"]); + if ($cn != "0" || $CORE_LOCAL->get("memberID") == "") + $CORE_LOCAL->set("memberID",$cn); + $CORE_LOCAL->set("runningTotal", (!$row || !isset($row['runningTotal'])) ? 0 : (double)$row["runningTotal"] ); + $CORE_LOCAL->set("taxTotal", (!$row || !isset($row['taxTotal'])) ? 0 : (double)$row["taxTotal"] ); + $CORE_LOCAL->set("discounttotal", (!$row || !isset($row['discountTTL'])) ? 0 : (double)$row["discountTTL"] ); + $CORE_LOCAL->set("tenderTotal", (!$row || !isset($row['tenderTotal'])) ? 0 : (double)$row["tenderTotal"] ); + $CORE_LOCAL->set("memSpecial", (!$row || !isset($row['memSpecial'])) ? 0 : (double)$row["memSpecial"] ); + $CORE_LOCAL->set("staffSpecial", (!$row || !isset($row['staffSpecial'])) ? 0 : (double)$row["staffSpecial"] ); + $CORE_LOCAL->set("percentDiscount", (!$row || !isset($row['percentDiscount'])) ? 0 : (double)$row["percentDiscount"] ); + $CORE_LOCAL->set("transDiscount", (!$row || !isset($row['transDiscount'])) ? 0 : (double)$row["transDiscount"] ); + $CORE_LOCAL->set("fsTaxExempt", (!$row || !isset($row['fsTaxExempt'])) ? 0 : (double)$row["fsTaxExempt"] ); + $CORE_LOCAL->set("fsEligible", (!$row || !isset($row['fsEligible'])) ? 0 : (double)$row["fsEligible"] ); + $CORE_LOCAL->set("memCouponTTL", (!$row || !isset($row['couponTotal']) || !isset($row['memCoupon'])) ? 0 : -1 * ((double) $row["couponTotal"]) + ((double) $row["memCoupon"])); + $CORE_LOCAL->set("refundTotal", (!$row || !isset($row['refundTotal'])) ? 0 : (double)$row["refundTotal"] ); + $CORE_LOCAL->set("chargeTotal", (!$row || !isset($row['chargeTotal'])) ? 0 : (double)$row["chargeTotal"] ); + $CORE_LOCAL->set("ccTotal", (!$row || !isset($row['ccTotal'])) ? 0 : (double)$row["ccTotal"] ); + $CORE_LOCAL->set("memChargeTotal", (!$row || !isset($row['memChargeTotal'])) ? 0 : (double)$row["memChargeTotal"] ); + $CORE_LOCAL->set("madCoup", (!$row || !isset($row['madCoupon'])) ? 0 : (double)$row["madCoupon"] ); + $CORE_LOCAL->set("scTaxTotal", (!$row || !isset($row['scTaxTotal'])) ? 0 : (double)$row["scTaxTotal"] ); + $CORE_LOCAL->set("scDiscount", (!$row || !isset($row['scDiscount'])) ? 0 : (double)$row["scDiscount"] ); + $CORE_LOCAL->set("paymentTotal", (!$row || !isset($row['paymentTotal'])) ? 0 : (double)$row["paymentTotal"] ); + $CORE_LOCAL->set("discountableTotal", (!$row || !isset($row['discountableTotal'])) ? 0 : (double)$row["discountableTotal"] ); + $CORE_LOCAL->set("localTotal", (!$row || !isset($row['localTotal'])) ? 0 : (double)$row["localTotal"] ); + $CORE_LOCAL->set("voidTotal", (!$row || !isset($row['voidTotal'])) ? 0 : (double)$row["voidTotal"] ); + + if ($CORE_LOCAL->get("memberID") == "0" && $CORE_LOCAL->get("runningTotal") > 0) { + if ($CORE_LOCAL->get("SSI") != 0 && ($CORE_LOCAL->get("isStaff") == 3 || $CORE_LOCAL->get("isStaff") == 6)) wmdiscount(); + } + + if ($CORE_LOCAL->get("sc") == 1) { + $CORE_LOCAL->set("taxTotal",$CORE_LOCAL->get("scTaxTotal")); + } + + if ( $CORE_LOCAL->get("TaxExempt") == 1 ) { + $CORE_LOCAL->set("taxable",0); + $CORE_LOCAL->set("taxTotal",0); + $CORE_LOCAL->set("fsTaxable",0); + $CORE_LOCAL->set("fsTaxExempt",0); + } + + $CORE_LOCAL->set("subtotal",number_format($CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("transDiscount"), 2)); + /* using a string for amtdue behaves strangely for + * values > 1000, so use floating point */ + $CORE_LOCAL->set("amtdue",(double)round($CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("taxTotal"), 2)); + + if ( $CORE_LOCAL->get("fsEligible") > $CORE_LOCAL->get("subtotal") ) { + $CORE_LOCAL->set("fsEligible",$CORE_LOCAL->get("subtotal")); + } + + + $connection->close(); + +} + +// ----------gettransno($CashierNo /int)---------- +// +// Given $CashierNo, gettransno() will look up the number of the most recent transaction. + +/** + Get the next transaction number for a given cashier + @param $CashierNo cashier number (emp_no in tables) + @return integer transaction number +*/ +function gettransno($CashierNo) { + global $CORE_LOCAL; + + $database = $CORE_LOCAL->get("tDatabase"); + $register_no = $CORE_LOCAL->get("laneno"); + $query = "SELECT max(trans_no) as maxtransno from localtranstoday where emp_no = '" + .$CashierNo."' and register_no = '" + .$register_no."' GROUP by register_no, emp_no"; + $connection = tDataConnect(); + $result = $connection->query($query); + $row = $connection->fetch_array($result); + if (!$row || !$row["maxtransno"]) { + $trans_no = 1; + } + else { + $trans_no = $row["maxtransno"] + 1; + } + $connection->close(); + return $trans_no; +} + +// ------------------------------------------------------------------ + +/** + See if the remote database is available + This function calls uploadtoServer() if + the initial test works. + @return integer + - 1 server available + - 0 server down +*/ +function testremote() { + global $CORE_LOCAL; + + + $intConnected = pingport($CORE_LOCAL->get("mServer"), $CORE_LOCAL->get("mDBMS")); + if ($intConnected == 1) { + + uploadtoServer(); + + } else { + $CORE_LOCAL->set("standalone",1); + } + + return ($CORE_LOCAL->get("standalone") + 1) % 2; +} + +// ------------------------------------------------------------------ +/** + Copy tables from the lane to the remote server + The following tables are copied: + - dtransactions + - alog + - suspended + - efsnetRequest + - efsnetResponse + - efsnetRequestMod + + On success the local tables are truncated. The efsnet tables + are copied in the uploadCCdata() function but that gets called + automatically. + + @return + - 1 upload succeeded + - 0 upload failed +*/ +function uploadtoServer() +{ + global $CORE_LOCAL; + + $uploaded = 0; + + // new upload method makes use of SQLManager's transfer method + // to simulate cross-server queries + $connect = tDataConnect(); + $connect->add_connection($CORE_LOCAL->get("mServer"), + $CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"), + $CORE_LOCAL->get("mUser"), + $CORE_LOCAL->get("mPass"), + False); + if (!isset($connect->connections[$CORE_LOCAL->get("mDatabase")]) || + $connect->connections[$CORE_LOCAL->get("mDatabase")] === False){ + $CORE_LOCAL->set("standalone",1); + return 0; + } + + $dt_matches = getMatchingColumns($connect,"dtransactions"); + + if ($connect->transfer($CORE_LOCAL->get("tDatabase"), + "select {$dt_matches} from dtransactions", + $CORE_LOCAL->get("mDatabase"),"insert into dtransactions ({$dt_matches})")){ + + $al_matches = getMatchingColumns($connect,"alog"); + // interval is a mysql reserved word + // so it needs to be escaped + $local_columns = $al_matches; + $server_columns = $al_matches; + if ($CORE_LOCAL->get("DBMS") == "mysql") + $local_columns = str_replace("Interval","`Interval`",$al_matches); + if ($CORE_LOCAL->get("mDBMS") == "mysql") + $server_columns = str_replace("Interval","`Interval`",$al_matches); + $al_success = $connect->transfer($CORE_LOCAL->get("tDatabase"), + "select $local_columns FROM alog", + $CORE_LOCAL->get("mDatabase"), + "insert into alog ($server_columns)"); + + $su_matches = getMatchingColumns($connect,"suspended"); + $su_success = $connect->transfer($CORE_LOCAL->get("tDatabase"), + "select {$su_matches} from suspended", + $CORE_LOCAL->get("mDatabase"), + "insert into suspended ({$su_matches})"); + + $connect->query("truncate table dtransactions", + $CORE_LOCAL->get("tDatabase")); + if ($al_success){ + $connect->query("truncate table alog", + $CORE_LOCAL->get("tDatabase")); + } + if ($su_success){ + $connect->query("truncate table suspended", + $CORE_LOCAL->get("tDatabase")); + } + + $uploaded = 1; + $CORE_LOCAL->set("standalone",0); + } + else { + $uploaded = 0; + $CORE_LOCAL->set("standalone",1); + } + + $connect->close($CORE_LOCAL->get("mDatabase")); + $connect->close($CORE_LOCAL->get("tDatabase")); + + uploadCCdata(); + + return $uploaded; +} + +/** + Get a list of columns that exist on the local db + and the server db for the given table. + @param $connection a SQLManager object that's + already connected + @param $table_name the table + @param $table2 is provided, it match columns from + local.table_name against remote.table2 + @return an array of column names +*/ +function getMatchingColumns($connection,$table_name,$table2=""){ + global $CORE_LOCAL; + + $local_poll = $connection->table_definition($table_name,$CORE_LOCAL->get("tDatabase")); + $local_cols = array(); + foreach($local_poll as $name=>$v) + $local_cols[$name] = True; + $remote_poll = $connection->table_definition((!empty($table2)?$table2:$table_name), + $CORE_LOCAL->get("mDatabase")); + $matching_cols = array(); + foreach($remote_poll as $name=>$v){ + if (isset($local_cols[$name])) + $matching_cols[] = $name; + } + + $ret = ""; + foreach($matching_cols as $col) + $ret .= $col.","; + return rtrim($ret,","); +} + +/** Get a list of columns in both tables. + @param $connection a SQLManager object that's + already connected + @param $table1 a database table + @param $table2 a database table + @return an array of column names common to both tables + */ +function localMatchingColumns($connection,$table1,$table2){ + $poll1 = $connection->table_definition($table1); + $cols1 = array(); + foreach($poll1 as $name=>$v) + $cols1[$name] = True; + $poll2 = $connection->table_definition($table2); + $matching_cols = array(); + foreach($poll2 as $name=>$v){ + if (isset($cols1[$name])) + $matching_cols[] = $name; + } + + $ret = ""; + foreach($matching_cols as $col) + $ret .= $col.","; + return rtrim($ret,","); +} + +/** + Transfer credit card tables to the server. + See uploadtoServer(). +*/ +function uploadCCdata(){ + global $CORE_LOCAL; + + $sql = tDataConnect(); + $sql->add_connection($CORE_LOCAL->get("mServer"), + $CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"), + $CORE_LOCAL->get("mUser"), + $CORE_LOCAL->get("mPass"), + False); + + $req_cols = getMatchingColumns($sql,"efsnetRequest"); + if ($sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$req_cols} from efsnetRequest", + $CORE_LOCAL->get("mDatabase"),"insert into efsnetRequest ({$req_cols})")){ + + $sql->query("truncate table efsnetRequest", + $CORE_LOCAL->get("tDatabase")); + + $res_cols = getMatchingColumns($sql,"efsnetResponse"); + $res_success = $sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$res_cols} from efsnetResponse", + $CORE_LOCAL->get("mDatabase"), + "insert into efsnetResponse ({$res_cols})"); + if ($res_success){ + $sql->query("truncate table efsnetResponse", + $CORE_LOCAL->get("tDatabase")); + } + + $mod_cols = getMatchingColumns($sql,"efsnetRequestMod"); + $mod_success = $sql->transfer($CORE_LOCAL->get("tDatabase"), + "select {$mod_cols} from efsnetRequestMod", + $CORE_LOCAL->get("mDatabase"), + "insert into efsnetRequestMod ({$mod_cols})"); + if ($mod_success){ + $sql->query("truncate table efsnetRequestMod", + $CORE_LOCAL->get("tDatabase")); + } + } +} + +?> diff --git a/pos/is4c-nf/lib/drawscreen.php.obsolete b/pos/is4c-nf/lib/drawscreen.php.obsolete new file mode 100644 index 000000000..0fd1214f2 --- /dev/null +++ b/pos/is4c-nf/lib/drawscreen.php.obsolete @@ -0,0 +1,614 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("rePoll")) include($CORE_PATH."lib/lib.php"); +if (!class_exists("FooterBox")) include($CORE_PATH."lib/FooterBoxes/FooterBox.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief Functions for drawing display elements + @deprecated see DisplayLib +*/ + +/** + Print just the form from the regular footer + but entirely hidden. + @deprecated + Only used with the old VB scale driver +*/ +function printfooterb() { + $ret = "<form name='hidden'>\n"; + $ret .= "<input Type='hidden' name='alert' value='noBeep'>\n"; + $ret .= "<input Type='hidden' name='scan' value='scan'>\n"; + $ret .= "</form>"; + return $ret; +} + +/** + Get the standard footer with total and + amount(s) saved + @param $readOnly don't update any session info + This would be set when rendering a separate, + different customer display + @return A string of HTML +*/ +function printfooter($readOnly=False) { + global $CORE_LOCAL,$CORE_PATH; + + $FOOTER_MODULES = $CORE_LOCAL->get("FooterModules"); + // use defaults if modules haven't been configured + // properly + if (!is_array($FOOTER_MODULES) || count($FOOTER_MODULES) != 5){ + $FOOTER_MODULES = array( + 'SavedOrCouldHave', + 'TransPercentDiscount', + 'MemSales', + 'EveryoneSales', + 'MultiTotal' + ); + } + + $modchain = array(); + foreach($FOOTER_MODULES as $MOD){ + if (!class_exists($MOD)) + include($CORE_PATH.'lib/FooterBoxes/'.$MOD.'.php'); + $modchain[] = new $MOD; + } + + if (!$readOnly) { + $CORE_LOCAL->set("runningTotal",$CORE_LOCAL->get("amtdue")); + } + + if ($CORE_LOCAL->get("End") == 1 && !$readOnly) { + $CORE_LOCAL->set("runningTotal",-1 * $CORE_LOCAL->get("change")); + } + + if ($CORE_LOCAL->get("scale") == 1) { + $weight = number_format($CORE_LOCAL->get("weight"), 2)."lb."; + } + else { + $weight = "_ _ _ _"; + } + + /* 5/11/12 + if (is_numeric($CORE_LOCAL->get("discounttotal"))) { + $dbldiscounttotal = number_format($CORE_LOCAL->get("discounttotal"), 2); + } + else { + $dbldiscounttotal = 0.00; + if (!$readOnly) + $CORE_LOCAL->set("runningTotal",0); + } + */ + + /* + if ($CORE_LOCAL->get("runningTotal") == "" && !$readOnly) { + $CORE_LOCAL->set("runningTotal",0); + } + + if ($CORE_LOCAL->get("isMember") == 1 || $CORE_LOCAL->get("sc") == 1) { + $labelyousaved = "You Saved"; + } + else { + $labelyousaved = "Could Have Saved"; + } + + if ($CORE_LOCAL->get("percentDiscount") == 0) { + $strpercentdisclabel = "% Discount"; + } + else { + $strpercentdisclabel = $CORE_LOCAL->get("percentDiscount")."% Discount"; + } + */ + + $ret = "<table>"; + $ret .= "<tr class=\"heading\">"; + $label = $modchain[0]->header_content(); + $ret .= sprintf('<td class="first" style="%s">%s</td>',$modchain[0]->header_css,$label); + $label = $modchain[1]->header_content(); + $ret .= sprintf('<td class="reg" style="%s">%s</td>',$modchain[1]->header_css,$label); + $label = $modchain[2]->header_content(); + $ret .= sprintf('<td class="reg" style="%s">%s</td>',$modchain[2]->header_css,$label); + $label = $modchain[3]->header_content(); + $ret .= sprintf('<td class="reg" style="%s">%s</td>',$modchain[3]->header_css,$label); + $label = $modchain[4]->header_content(); + $ret .= sprintf('<td class="total" style="%s">%s</td>',$modchain[4]->header_css,$label); + /* 5/11/12 + $ret .= "<td class=\"first\">$labelyousaved</td>"; + $ret .= "<td class=\"reg\">$strpercentdisclabel</td>"; + $ret .= "<td class=\"reg\">Mbr Special</td>"; + $ret .= "<td class=\"reg\">Special</td>"; + if ( $CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") != 1 ) { + if ($CORE_LOCAL->get("fntlflag") == 1) { + $ret .= "<td class=\"fs\">fs Amount Due</td>"; + } else { + $ret .= "<td class=\"due\">Amount Due</td>"; + } + } + elseif ($CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") == 1 ) { + $ret .= "<td class=\"change\">Change</td>"; + } + else { + $ret .= "<td class=\"total\">Total</td>"; + } + */ + $ret .= "</tr>"; + + $special = $CORE_LOCAL->get("memSpecial") + $CORE_LOCAL->get("staffSpecial"); + $dbldiscounttotal = number_format($CORE_LOCAL->get("discounttotal"), 2); + if ($CORE_LOCAL->get("isMember") == 1) { + $dblyousaved = number_format( $CORE_LOCAL->get("transDiscount") + $dbldiscounttotal + $special + $CORE_LOCAL->get("memCouponTTL"), 2); + if (!$readOnly){ + $CORE_LOCAL->set("yousaved",$dblyousaved); + $CORE_LOCAL->set("couldhavesaved",0); + $CORE_LOCAL->set("specials",number_format($dbldiscounttotal + $special, 2)); + } + } + else { + $dblyousaved = number_format($CORE_LOCAL->get("memSpecial"),2); + if (!$readOnly){ + $CORE_LOCAL->set("yousaved",$dbldiscounttotal + $CORE_LOCAL->get("staffSpecial")); + $CORE_LOCAL->set("couldhavesaved",$dblyousaved); + $CORE_LOCAL->set("specials",$dbldiscounttotal + $CORE_LOCAL->get("staffSpecial")); + } + } + if ($CORE_LOCAL->get("sc") == 1) { + if (!$readOnly){ + $CORE_LOCAL->set("yousaved",$CORE_LOCAL->get("yousaved") + $CORE_LOCAL->get("scDiscount")); + } + $dblyousaved = $CORE_LOCAL->get("yousaved"); + } + + /* 5/11/12 + $strperdiscount = "n/a"; + if ($CORE_LOCAL->get("percentDiscount") != 0 || $CORE_LOCAL->get("memCouponTTL") > 0) { + $strperdiscount = number_format($CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("memCouponTTL"), 2); + } + + $strmemSpecial = "n/a"; + if ($CORE_LOCAL->get("isMember") == 1) { + $strmemSpecial = number_format($CORE_LOCAL->get("memSpecial"), 2); + } + */ + + if (!$readOnly){ + if ($CORE_LOCAL->get("End") == 1) { + rePoll(); + } + if (strlen($CORE_LOCAL->get("endorseType")) > 0 || $CORE_LOCAL->get("waitforScale") == 1) { + $CORE_LOCAL->set("waitforScale",0); + $CORE_LOCAL->set("beep","noBeep"); + } + if ($CORE_LOCAL->get("scale") == 0 && $CORE_LOCAL->get("SNR") == 1) { + rePoll(); + } + if ($CORE_LOCAL->get("cashOverAmt") <> 0) { + twoPairs(); + $CORE_LOCAL->set("cashOverAmt",0); + } + } + + $ret .= "<tr class=\"values\">"; + $box = $modchain[0]->display_content(); + $ret .= sprintf('<td class="first" style="%s">%s</td>',$modchain[0]->display_css,$box); + $box = $modchain[1]->display_content(); + $ret .= sprintf('<td class="reg" style="%s">%s</td>',$modchain[1]->display_css,$box); + $box = $modchain[2]->display_content(); + $ret .= sprintf('<td class="reg" style="%s">%s</td>',$modchain[2]->display_css,$box); + $box = $modchain[3]->display_content(); + $ret .= sprintf('<td class="reg" style="%s">%s</td>',$modchain[3]->display_css,$box); + $box = $modchain[4]->display_content(); + $ret .= sprintf('<td class="total" style="%s">%s</td>',$modchain[4]->display_css,$box); + /* 5/11/12 + $ret .= "<td class=\"first\">".number_format($dblyousaved,2)."</td>"; + $ret .= "<td class=\"reg\">".$strperdiscount."</td>"; + $ret .= "<td class=\"reg\">".$strmemSpecial."</td>"; + $ret .= "<td class=\"reg\">".number_format($dbldiscounttotal,2)."</td>"; + if ($CORE_LOCAL->get("ttlflag") == 1 && $CORE_LOCAL->get("End") != 1) { + if ($CORE_LOCAL->get("fntlflag") == 1) { + $ret .= "<td class=\"fs\">".number_format($CORE_LOCAL->get("fsEligible"), 2)."</td>"; + } else { + $ret .= "<td class=\"due\">".number_format($CORE_LOCAL->get("runningTotal"), 2)."</td>"; + } + } + elseif ($CORE_LOCAL->get("ttlflag") == 1 && $CORE_LOCAL->get("End") == 1) { + $ret .= "<td class=\"change\">".number_format($CORE_LOCAL->get("runningTotal"), 2)."</td>"; + } + else { + $ret .= "<td class=\"total\">".number_format($CORE_LOCAL->get("runningTotal"), 2)."</td>"; + } + */ + $ret .= "</tr>"; + $ret .= "</table>"; + + if (!$readOnly){ + $ret .= "<form name='hidden'>\n"; + $ret .= "<input type='hidden' id='alert' name='alert' value='".$CORE_LOCAL->get("beep")."'>\n"; + $ret .= "<input type='hidden' id='scan' name='scan' value='".$CORE_LOCAL->get("scan")."'>\n"; + $ret .= "<input type='hidden' id='screset' name='screset' value='".$CORE_LOCAL->get("screset")."'>\n"; + $ret .= "<input type='hidden' id='ccTermOut' name='ccTermOut' value=\"".$CORE_LOCAL->get("ccTermOut")."\">\n"; + $ret .= "</form>"; + $CORE_LOCAL->set("beep","noBeep"); + $CORE_LOCAL->set("scan","scan"); + $CORE_LOCAL->set("screset","stayCool"); + $CORE_LOCAL->set("ccTermOut","idle"); + } + + return $ret; +} + +//--------------------------------------------------------------------// + +/** + Wrap a message in a id="plainmsg" div + @param $strmsg the message + @return An HTML string +*/ +function plainmsg($strmsg) { + return "<div id=\"plainmsg\">$strmsg</div>"; +} + + +//-------------------------------------------------------------------// + +/** + Get a centered message box + @param $strmsg the message + @param $icon graphic icon file + @param $noBeep don't send a scale beep + @return An HTML string + + This function will include the header + printheaderb(). +*/ +function msgbox($strmsg, $icon,$noBeep=False) { + global $CORE_LOCAL; + + $ret = printheaderb(); + $ret .= "<div id=\"boxMsg\" class=\"centeredDisplay\">"; + $ret .= "<div class=\"boxMsgAlert\">"; + $ret .= $CORE_LOCAL->get("alertBar"); + $ret .= "</div>"; + $ret .= "<div class=\"boxMsgBody\">"; + $ret .= "<div class=\"msgicon\"><img src=\"$icon\" /></div>"; + $ret .= "<div class=\"msgtext\">"; + $ret .= $strmsg; + $ret .= "</div><div class=\"clear\"></div></div>"; + $ret .= "</div>"; + + $CORE_LOCAL->set("strRemembered",$CORE_LOCAL->get("strEntered")); + if ($CORE_LOCAL->get("warned") == 0 && !$noBeep) + errorBeep(); + //$_SESSION["scan"] = "noScan"; + $CORE_LOCAL->set("msgrepeat",1); + //$_SESSION["toggletax"] = 0; + //$_SESSION["togglefoodstamp"] = 0; + //$_SESSION["away"] = 1; + + return $ret; +} +//--------------------------------------------------------------------// + +/** + Get a centered message box with "crossD" graphic + @param $strmsg the message + @return An HTML string + + An alias for msgbox(). +*/ +function xboxMsg($strmsg) { + global $CORE_PATH; + return msgbox($strmsg, $CORE_PATH."graphics/crossD.gif"); +} + +/** + Get a centered message box with "exclaimC" graphic + @param $strmsg the message + @param $header does nothing... + @param $noBeep don't beep scale + @return An HTML string + + An alias for msgbox(). +*/ +function boxMsg($strmsg,$header="",$noBeep=False) { + global $CORE_PATH; + return msgbox($strmsg, $CORE_PATH."graphics/exclaimC.gif",$noBeep); +} + +/** + Get a centered message box with input unknown message. + @return An HTML string + + An alias for msgbox(). +*/ +function inputUnknown() { + global $CORE_PATH; + return msgbox("<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input unknown</b>", $CORE_PATH."graphics/exclaimC.gif"); +} + +//--------------------------------------------------------------------// + +/** + Get the standard header row with CASHIER + and MEMBER info + @return An HTML string +*/ +function printheaderb() { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("memberID") == "0") { + $strmemberID = ""; + } + else { + $strmemberID = $CORE_LOCAL->get("memMsg"); + if ($CORE_LOCAL->get("isMember") == 0){ + $strmemberID = str_replace("(0)", "(n/a)", $strmemberID); + } + } + + $ret = ' + <div id="headerb"> + <div class="left"> + <span class="bigger">M E M B E R &nbsp;&nbsp;</span> + <span class="smaller"> + '.$strmemberID.' + </span> + </div> + <div class="right"> + <span class="bigger">C A S H I E R &nbsp;&nbsp;</span> + <span class="smaller"> + '.$CORE_LOCAL->get("cashier").' + </span> + </div> + <div class="clear"></div> + </div> + '; + return $ret; +} + +//-------------------------------------------------------------------// + +/** + Get a transaction line item + @param $field2 typically description + @param $field3 comment section. Used for things + like "0.59@1.99" on weight items. + @param $total the right-hand number + @param $field5 flags after the number + @param $trans_id value from localtemptrans. Including + the trans_id makes the lines selectable via mouseclick + (or touchscreen). + @return An HTML string +*/ +function printitem($field2, $field3, $total, $field5, $trans_id=-1) { + global $CORE_LOCAL; + + $onclick = ""; + if ($trans_id != -1){ + $curID = $CORE_LOCAL->get("currentid"); + $diff = $trans_id - $curID; + if ($diff > 0){ + $onclick="onclick=\"parseWrapper('D$diff');\""; + } + else if ($diff < 0){ + $diff *= -1; + $onclick="onclick=\"parseWrapper('U$diff');\""; + } + } + + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($field2 == "") $field2 = "&nbsp;"; + if (trim($field3) == "") $field3 = "&nbsp;"; + if ($field5 == "") $field5 = "&nbsp;"; + + $ret = "<div class=\"item\">"; + $ret .= "<div $onclick class=\"desc\">$field2</div>"; + $ret .= "<div $onclick class=\"comments\">$field3</div>"; + $ret .= "<div $onclick class=\"total\">$total</div>"; + $ret .= "<div $onclick class=\"suffix\">$field5</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//------------------------------------------------------------------// + +/** + Get a transaction line item in a specific color + @param $color is a hex color code (do not include a '#') + @param $description typically description + @param $comments comment section. Used for things + like "0.59@1.99" on weight items. + @param $total the right-hand number + @param $suffix flags after the number + @param $trans_id value from localtemptrans. Including + the trans_id makes the lines selectable via mouseclick + (or touchscreen). + @return An HTML string +*/ +function printitemcolor($color, $description, $comments, $total, $suffix,$trans_id=-1) { + global $CORE_LOCAL; + + $onclick = ""; + if ($trans_id != -1){ + $curID = $CORE_LOCAL->get("currentid"); + $diff = $trans_id - $curID; + if ($diff > 0){ + $onclick="onclick=\"parseWrapper('D$diff');\""; + } + else if ($diff < 0){ + $diff *= -1; + $onclick="onclick=\"parseWrapper('U$diff');\""; + } + } + + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($total == 0 && $color == "408080") $total = "&nbsp;"; + if ($description == "") $description = "&nbsp;"; + if (trim($comments) == "") $comments = "&nbsp;"; + if ($suffix == "") $suffix = "&nbsp;"; + + $style = "style=\"color:#$color;\""; + $ret = "<div class=\"item\">"; + $ret .= "<div $onclick class=\"desc\" $style>$description</div>"; + $ret .= "<div $onclick class=\"comments\" $style>$comments</div>"; + $ret .= "<div $onclick class=\"total\" $style>$total</div>"; + $ret .= "<div $onclick class=\"suffix\" $style>$suffix</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//----------------------------------------------------------------// + +/** + Get a transaction line item in a specific color + @param $color is a hex color code (do not include a '#') + @param $description typically description + @param $comments comment section. Used for things + like "0.59@1.99" on weight items. + @param $total the right-hand number + @param $suffix flags after the number + @return An HTML string + + This could probably be combined with printitemcolor(). They're + separate because no one has done that yet. +*/ +function printitemcolorhilite($color, $description, $comments, $total, $suffix) { + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($total == 0 && $color == "408080") $total = "&nbsp;"; + if ($description == "") $description="&nbsp;"; + if (trim($comments) == "") $comments="&nbsp;"; + if ($suffix == "") $suffix="&nbsp;"; + + $style = "style=\"background:#$color;color:#ffffff;\""; + $ret = "<div class=\"item\">"; + $ret .= "<div class=\"desc\" $style>$description</div>"; + $ret .= "<div class=\"comments\" $style>$comments</div>"; + $ret .= "<div class=\"total\" $style>$total</div>"; + $ret .= "<div class=\"suffix\" $style>$suffix</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//----------------------------------------------------------------// + +/** + Alias for printitemcolorhilite(). +*/ +function printItemHilite($description, $comments, $total, $suffix) { + return printitemcolorhilite("004080", $description, $comments, $total, $suffix); +} + +/** + Get the scale display box + @param $input message from scale + @return An HTML string + + If $input is specified, weight information + in the session gets updated before returning + the current value. + + Known input values are: + - S11WWWW where WWWW is weight in hundreths + (i.e., 1lb = 0100) + - S141 not settled on a weight yet + - S143 zero weight + - S145 an error condition + - S142 an error condition +*/ +function scaledisplaymsg($input=""){ + global $CORE_LOCAL; + $reginput = trim(strtoupper($input)); + + // return early; all other cases simplified + // by resetting session "weight" + if (strlen($reginput) == 0) { + if (is_numeric($CORE_LOCAL->get("weight"))) + return number_format($CORE_LOCAL->get("weight"), 2)." lb"; + else + return $CORE_LOCAL->get("weight")." lb"; + } + + $display_weight = ""; + $weight = 0; + $CORE_LOCAL->set("scale",0); + $CORE_LOCAL->set("weight",0); + + $prefix = "NonsenseThatWillNotEverHappen"; + if (substr($reginput, 0, 3) == "S11") + $prefix = "S11"; + else if (substr($reginput,0,4)=="S144") + $prefix = "S144"; + + if (strpos($reginput, $prefix) === 0){ + $len = strlen($prefix); + if (!substr($reginput, $len) || + !is_numeric(substr($reginput, $len))) { + $display_weight = "_ _ _ _"; + } + else { + $weight = number_format(substr($reginput, $len)/100, 2); + $CORE_LOCAL->set("weight",$weight); + $display_weight = $weight." lb"; + $CORE_LOCAL->set("scale",1); + } + } + elseif (substr($reginput, 0, 4) == "S143") { + $display_weight = "0.00 lb"; + $CORE_LOCAL->set("scale",1); + } + elseif (substr($reginput, 0, 4) == "S141") { + $display_weight = "_ _ _ _"; + } + elseif (substr($reginput, 0, 4) == "S145") { + $display_weight = "err -0"; + } + elseif (substr($reginput, 0, 4) == "S142") { + $display_weight = "error"; + } + else { + $display_weight = "? ? ? ?"; + } + + return $display_weight; +} + +?> diff --git a/pos/is4c-nf/lib/lib.php.obsolete b/pos/is4c-nf/lib/lib.php.obsolete new file mode 100644 index 000000000..cde289fdd --- /dev/null +++ b/pos/is4c-nf/lib/lib.php.obsolete @@ -0,0 +1,269 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief A collection of very basic functions with nowhere else to go. + @deprecated See MiscLib +*/ + +// These functions have been translated from lib.asp by Brandon on 07.13.03. +// The "/blah" notation in the function heading indicates the Type of argument that should be given. + +// ----------int($num /numeric)---------- +// +// Given $num, detemine if it is numeric. +// If so, int returns the integral part of $num. +// Else generate a fatal error. + +/** + Cast value to integer + @param $num must be numeric + @return integer +*/ +function int($num) { + if(is_numeric($num)) { + return (int) $num; + } + else { + die("FATAL ERROR: Argument, '".$num.",' given to int() is not numeric."); + } +} + +// -----------nullwrap($num /numeric)---------- +// +// Given $num, if it is empty or of length less than one, nullwrap becomes "0". +// If the argument is a non-numeric, generate a fatal error. +// Else nullwrap becomes the number. + +/** + Sanitizes values + @param $num a value + @return a sanitized value + + Probably an artifact of ASP implementation. + In practice any argument that evaluates to False + get translated to integer zero. +*/ +function nullwrap($num) { + + + if ( !$num ) { + return 0; + } + elseif (!is_numeric($num) && strlen($num) < 1) { + return " "; + } + else { + return $num; + } +} + +// ----------truncate2($num /numeric)---------- +// +// Round $num to two (2) digits after the decimal and return it as a STRING. + +/** + Convert number to string with two decimal digits + @param $num a number + @return formatted string +*/ +function truncate2($num) { + return number_format($num, 2); +} + +// ----------pinghost($host /string)---------- +// +// Given $host, pinghost() looks up that host name or IP address. +// If it can connect function returned as true, else false. + +/** + Ping a host + @param $host the name or IP + @return + - 1 on success + - 0 on failure + @deprecated + Doesn't work reliably in all environments. + Use pingport(). +*/ +function pinghost($host) +{ + global $CORE_LOCAL; + + $host = str_replace("[", "", $host); + $host = str_replace("]", "", $host); + + if (strstr($host,"\\")){ + $tmp = explode("\\",$host); + $host = $tmp[0]; + } + + $intConnected = 0; + if ($CORE_LOCAL->get("OS") == "win32") { + $pingReturn = exec("ping -n 1 $host", $aPingReturn); + $packetLoss = "(0% loss"; + } else { + $pingReturn = exec("ping -c 1 $host", $aPingReturn); + $packetLoss = "1 received, 0% packet loss"; + } + + foreach($aPingReturn as $returnLine) + + { $pos = strpos($returnLine, $packetLoss); + if ($pos) { + $intConnected = 1; + break; + } + } + return $intConnected; +} + +/** + Connect to a host briefly + @param $host name or IP + @param $dbms database type (supported: mysql, mssql) + @return + - 1 on success + - 0 on failure + + This still works if the environment doesn't have + ping or ping has odd output. It also verifies the + database is running as well as the host is up. +*/ +function pingport($host,$dbms){ + $port = ($dbms == 'mysql') ? 3306 : 1433; + if (strstr($host,":")) + list($host,$port) = explode(":",$host); + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0)); + socket_set_block($sock); + $test = socket_connect($sock,$host,$port); + socket_close($sock); + return ($test ? 1 : 0); +} + +/** + Guess whether PHP is running on windows + @return + 1 - windows + 0 - not windows +*/ +function win32() { + $winos = 0; + if (substr(PHP_OS, 0, 3) == "WIN") $winos = 1; + return $winos; +} + +/** + Get the scale wrapper object + @return An ScaleDriverWrapper object + + The driver is chosen via "scaleDriver" + in $CORE_LOCAL. If the object cannot be + found this returns zero +*/ +function scaleObject(){ + global $CORE_LOCAL, $CORE_PATH; + $scaleDriver = $CORE_LOCAL->get("scaleDriver"); + $sd = 0; + if ($scaleDriver != "" && !class_exists($scaleDriver)){ + include($CORE_PATH.'scale-drivers/php-wrappers/'.$scaleDriver.'.php'); + $sd = new $scaleDriver(); + } + return $sd; +} + +/** + Get the signature capture wrapper object + @return An ScaleDriverWrapper object + + The driver is chosen via "termDriver" + in $CORE_LOCAL. If the object cannot be + found this returns zero. + + Signature capture support is very alpha. +*/ +function sigTermObject(){ + global $CORE_LOCAL, $CORE_PATH; + $termDriver = $CORE_LOCAL->get("termDriver"); + $st = 0; + if ($termDriver != ""){ + if (!class_exists($termDriver)) + include($CORE_PATH.'scale-drivers/php-wrappers/'.$termDriver.'.php'); + $st = new $termDriver(); + } + return $st; +} + +/** + Send good beep message to the scale +*/ +function goodBeep() { + global $CORE_LOCAL; + $CORE_LOCAL->set("beep","goodBeep"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("goodBeep"); +} + +/** + Send re-poll message to the scale +*/ +function rePoll() { + global $CORE_LOCAL; + $CORE_LOCAL->set("beep","rePoll"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("rePoll"); +} + +/** + Send error beep message to the scale +*/ +function errorBeep() { + global $CORE_LOCAL; + $CORE_LOCAL->set("beep","errorBeep"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("errorBeep"); +} + +/** + Send two pairs beep message to the scale +*/ +function twoPairs() { + global $CORE_LOCAL; + $CORE_LOCAL->set("beep","twoPairs"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("twoPairs"); +} + +?> diff --git a/pos/is4c-nf/lib/listitems.php.obsolete b/pos/is4c-nf/lib/listitems.php.obsolete new file mode 100755 index 000000000..d47118c7c --- /dev/null +++ b/pos/is4c-nf/lib/listitems.php.obsolete @@ -0,0 +1,274 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("getsubtotals")) include($CORE_PATH."lib/connect.php"); +if (!function_exists("printheaderb")) include($CORE_PATH."lib/drawscreen.php"); +if (!function_exists("term_object")) include($CORE_PATH."cc-modules/lib/term.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief Functions for drawing the lines in the current transaction + @deprecated see DisplayLib +*/ + +/** + Get the items currently on screen + @param $top_item is trans_id (localtemptrans) + of the first item to display + @param $highlight is the trans_id (localtemptrans) + of the currently selected item + @return An HTML string + + If you just want to show the most recently + scanned items, use lastpage(). +*/ +function listitems($top_item, $highlight) { + global $CORE_LOCAL; + + getsubtotals(); + $LastID = $CORE_LOCAL->get("LastID"); + +//----------------Boundary Top ------------------ + + if ($highlight < 1) { + $highlight = 1; + $top_item = 1; + } + + if ($highlight > $LastID) { + $highlight = $LastID; + } + + if ($highlight < $top_item) { + $top_item = $highlight; + } + + if ($highlight > ($top_item + 11)) { + $top_item = ($highlight - 11); + } + + $CORE_LOCAL->set("currenttopid",$top_item); + $CORE_LOCAL->set("currentid",$highlight); + +//------------------Boundary Bottom---------------- + + return drawitems($top_item, 11, $highlight); + $CORE_LOCAL->set("currentid",$highlight); +} + + + +/** + Show some items and farewell message + @param $readOnly don't update totals + @return An HTML string + + Show a few recent items and the + "Thank you for shopping" messaging. + + Yes, this function should be renamed. It + has nothing to do with receipts. +*/ +function printReceiptfooter($readOnly=False) { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("sc") == 1) { + return lastpage(); + } + else { + + if (!$readOnly) + getsubtotals(); + $last_id = $CORE_LOCAL->get("LastID"); + + if (($last_id - 7) < 0) { + $top_id = 1; + } + else { + $top_id = $last_id - 7; + } + + $ret = drawitems($top_id, 7, 0); + + $ret .= "<div class=\"farewellMsg\">"; + for($i=0;$i<=$CORE_LOCAL->get("farewellMsgCount");$i++){ + $ret .= $CORE_LOCAL->get("farewellMsg".$i)."<br />"; + } + $ret .= "</div>"; + return $ret; + } +} + + + +/** + Get the currently displayed items + @param $top_item is the trans_id of the first item to display + @param $rows is the number of items to display + @param $highlight is the trans_id of the selected item + @return An HTML string + + This function probably shouldn't be used directly. + Call listitems() or lastpage() instead. +*/ +function drawitems($top_item, $rows, $highlight) { + global $CORE_LOCAL; + + $ret = printheaderb(); + + $query = "select count(*) as count from localtemptrans"; + $db = tDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + $rowCount = $row["count"]; + + $db->close(); + + $last_item = array(); + + if ($rowCount == 0) { + $ret .= "<div class=\"centerOffset\">"; + $msg_text = ""; + if ($CORE_LOCAL->get("training") != 1) { + for($i=1; $i<=$CORE_LOCAL->get("welcomeMsgCount");$i++){ + $msg_text .= $CORE_LOCAL->get("welcomeMsg".$i)."<br />"; + } + } + else { + for($i=1; $i<=$CORE_LOCAL->get("trainingMsgCount");$i++){ + $msg_text .= $CORE_LOCAL->get("trainingMsg".$i)."<br />"; + } + } + $ret .= plainmsg($msg_text); + $ret .= "</div>"; + } + else { + + $query_range = "select trans_id,description,total,comment,status,lineColor + from screendisplay where trans_id >= ".$top_item." and trans_id <= " + .($top_item + $rows)." order by trans_id"; + $db_range = tDataConnect(); + $result_range = $db_range->query($query_range); + $num_rows = $db_range->num_rows($result_range); + + for ($i = 0; $i < $num_rows; $i++) { + $row = $db_range->fetch_array($result_range); + + $trans_id = $row["trans_id"]; + $description = $row["description"]; + $total = $row["total"]; + $comment = $row["comment"]; + $tf = $row["status"]; + $color = $row["lineColor"]; + + + if ($trans_id == $highlight) { + if ($color == "004080") { + $ret .= printitemhilite($description, $comment, $total, $tf); + } + else { + $ret .= printitemcolorhilite($color, $description, $comment, $total, $tf); + } + } + else + { + if ($color == "004080") { + $ret .= printitem($description, $comment, $total, $tf,$trans_id); + } + else { + $ret .= printitemcolor($color, $description, $comment, $total, $tf,$trans_id); + } + } + + if (!strstr($description,'Subtotal')){ + $fixed_desc = str_replace(":"," ",$description); + if (strlen($fixed_desc) > 24){ + $fixed_desc = substr($fixed_desc,0,24); + } + $fixed_price = empty($total)?'':sprintf('%.2f',$total); + $spaces = str_pad('',30-strlen($fixed_desc)-strlen($fixed_price),' '); + $last_item[] = $fixed_desc.$spaces.$fixed_price; + } + } + $db_range->close(); + } + + $td = term_object(); + if (is_object($td) && !empty($last_item)){ + $due = sprintf('%.2f',$CORE_LOCAL->get("amtdue")); + $dueline = 'Subtotal' + .str_pad('',22-strlen($due),' ') + .$due; + $items = ""; + $count = 0; + for($i=count($last_item)-1;$i>=0;$i--){ + $items = ":".$last_item[$i].$items; + $count++; + if ($count >= 3) break; + } + for($i=$count;$i<3;$i++) + $items = ": ".$items; + $td->WriteToScale("display".$items.":".$dueline); + } + + return $ret; +} + + + +/** + Get the currently displayed items + @param $readOnly don't update session + @return An HTML string + + This will always display the most recently + scanned items. If you want a specific subset, + use listitems(). +*/ +function lastpage($readOnly=False) { + global $CORE_LOCAL; + + if (!$readOnly){ + getsubtotals(); + } + $last_id = $CORE_LOCAL->get("LastID"); + + if (($last_id - 11) < 0) { + $top_id = 1; + } + else { + $top_id = $last_id - 11; + } + + if (!$readOnly){ + $CORE_LOCAL->set("currentid",$last_id); + $CORE_LOCAL->set("currenttopid",$top_id); + } + return drawitems($top_id, 11, $last_id); +} + +?> diff --git a/pos/is4c-nf/lib/loadconfig.php.obsolete b/pos/is4c-nf/lib/loadconfig.php.obsolete new file mode 100644 index 000000000..8f985a5ee --- /dev/null +++ b/pos/is4c-nf/lib/loadconfig.php.obsolete @@ -0,0 +1,145 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("pDataConnect")) include($CORE_PATH."lib/connect.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief Functions dealing with the globalvalues table + @deprecated See Database +*/ + +/** + Read globalvalues settings into $CORE_LOCAL. +*/ +function loadglobalvalues() { + global $CORE_LOCAL; + + $query = "select CashierNo,Cashier,LoggedIn,TransNo,TTLFlag, + FntlFlag,TaxExempt from globalvalues"; + $db = pDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + + $CORE_LOCAL->set("CashierNo",$row["CashierNo"]); + $CORE_LOCAL->set("cashier",$row["Cashier"]); + $CORE_LOCAL->set("LoggedIn",$row["LoggedIn"]); + $CORE_LOCAL->set("transno",$row["TransNo"]); + $CORE_LOCAL->set("ttlflag",$row["TTLFlag"]); + $CORE_LOCAL->set("fntlflag",$row["FntlFlag"]); + $CORE_LOCAL->set("TaxExempt",$row["TaxExempt"]); + + $db->close(); +} + +/** + Set new value in $CORE_LOCAL. + @param $param keycode + @param $val new value +*/ +function loadglobalvalue($param,$val){ + global $CORE_LOCAL; + switch(strtoupper($param)){ + case 'CASHIERNO': + $CORE_LOCAL->set("CashierNo",$val); + break; + case 'CASHIER': + $CORE_LOCAL->set("cashier",$val); + break; + case 'LOGGEDIN': + $CORE_LOCAL->set("LoggedIn",$val); + break; + case 'TRANSNO': + $CORE_LOCAL->set("transno",$val); + break; + case 'TTLFLAG': + $CORE_LOCAL->set("ttlflag",$val); + break; + case 'FNTLFLAG': + $CORE_LOCAL->set("fntlflag",$val); + break; + case 'TAXEXEMPT': + $CORE_LOCAL->set("TaxExempt",$val); + break; + } +} + +/** + Update setting in globalvalues table. + @param $param keycode + @param $value new value +*/ +function setglobalvalue($param, $value) { + global $CORE_LOCAL; + + $db = pDataConnect(); + + if (!is_numeric($value)) { + $value = "'".$value."'"; + } + + $strUpdate = "update globalvalues set ".$param." = ".$value; + + $db->query($strUpdate); + $db->close(); +} + +/** + Update many settings in globalvalues table + and in $CORE_LOCAL + @param $arr An array of keys and values +*/ +function setglobalvalues($arr){ + $setStr = ""; + foreach($arr as $param => $value){ + $setStr .= $param." = "; + if (!is_numeric($value)) + $setStr .= "'".$value."',"; + else + $setStr .= $value.","; + loadglobalvalue($param,$value); + } + $setStr = rtrim($setStr,","); + + $db = pDataConnect(); + $upQ = "UPDATE globalvalues SET ".$setStr; + $db->query($upQ); + $db->close(); +} + +/** + Sets TTLFlag and FntlFlag in globalvalues table + @param $value value for both fields. +*/ +function setglobalflags($value) { + $db = pDataConnect(); + + $db->query("update globalvalues set TTLFlag = ".$value.", FntlFlag = ".$value); + $db->close(); +} + +?> diff --git a/pos/is4c-nf/lib/prehkeys.php.obsolete b/pos/is4c-nf/lib/prehkeys.php.obsolete new file mode 100755 index 000000000..a64dc7aab --- /dev/null +++ b/pos/is4c-nf/lib/prehkeys.php.obsolete @@ -0,0 +1,1188 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("addItem")) include($CORE_PATH."lib/additem.php"); +if (!function_exists("truncate2")) include_once($CORE_PATH."lib/lib.php"); +if (!function_exists("lastpage")) include($CORE_PATH."lib/listitems.php"); +if (!function_exists("paycard_reset")) include($CORE_PATH."cc-modules/lib/paycardLib.php"); +if (!function_exists("blueLine")) include($CORE_PATH."lib/session.php"); +if (!function_exists("boxMsgscreen")) include($CORE_PATH."lib/clientscripts.php"); + +/** + @file + @brief A horrible, horrible catch-all clutter of functions + @deprecated see PrehLib +*/ + +/** + Remove member number from current transaction +*/ +function clearMember(){ + global $CORE_LOCAL; + + memberReset(); + $db = tDataConnect(); + $db->query("UPDATE localtemptrans SET card_no=0,percentDiscount=NULL"); + $CORE_LOCAL->set("ttlflag",0); +} + +/** + Set member number for transaction + @param $member_number CardNo from custdata + @return An array. See Parser::default_json() + for format. + + This function will either assign the number + to the current transaction or return a redirect + request to get more input. If you want the + cashier to verify member name from a list, use + this function. If you want to force the number + to be set immediately, use setMember(). +*/ +function memberID($member_number) { + global $CORE_LOCAL,$CORE_PATH; + + $query = "select CardNo,personNum,LastName,FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type,memType,staff, + SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown,id from custdata + where CardNo = '".$member_number."'"; + + $ret = array( + "main_frame"=>false, + "output"=>"", + "target"=>".baseHeight", + "redraw_footer"=>false + ); + + $db = pDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + + if ($num_rows == 1 && + ($member_number == $CORE_LOCAL->get("defaultNonMem") + || ($member_number == 5607 && + $CORE_LOCAL->get("requestType") == "member gift"))) { + $row = $db->fetch_array($result); + setMember($row["CardNo"], $row["personNum"],$row); + $ret['redraw_footer'] = True; + $ret['output'] = lastpage(); + } + + // special hard coding for member 5607 WFC + // needs to go away + if ($member_number == "5607"){ + if ($CORE_LOCAL->get("requestType") == ""){ + $CORE_LOCAL->set("requestType","member gift"); + $CORE_LOCAL->set("requestMsg","Card for which member?"); + $ret['main_frame'] = $CORE_PATH."gui-modules/requestInfo.php"; + $CORE_LOCAL->set("strEntered","5607id"); + } + else if ($CORE_LOCAL->get("requestType") == "member gift"){ + addcomment("CARD FOR #".$CORE_LOCAL->get("requestMsg")); + $CORE_LOCAL->set("requestType",""); + } + } + + $CORE_LOCAL->set("idSearch",$member_number); + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("memType",0); + $CORE_LOCAL->set("percentDiscount",0); + $CORE_LOCAL->set("memMsg",""); + + if (empty($ret['output']) && $ret['main_frame'] == false) + $ret['main_frame'] = $CORE_PATH."gui-modules/memlist.php"; + + return $ret; +} + +//------------------------------------------------- + +/** + Assign a member number to a transaction + @param $member CardNo from custdata + @param $personNumber personNum from custdata + @param $row a record from custdata + + See memberID() for more information. +*/ +function setMember($member, $personNumber, $row) { + global $CORE_LOCAL; + + $conn = pDataConnect(); + + $CORE_LOCAL->set("memMsg",blueLine($row)); + $chargeOk = chargeOk(); + if ($CORE_LOCAL->get("balance") != 0 && $member != $CORE_LOCAL->get("defaultNonMem")) + $CORE_LOCAL->set("memMsg",$CORE_LOCAL->get("memMsg")." AR"); + + $CORE_LOCAL->set("memberID",$member); + $CORE_LOCAL->set("memType",$row["memType"]); + $CORE_LOCAL->set("lname",$row["LastName"]); + $CORE_LOCAL->set("fname",$row["FirstName"]); + $CORE_LOCAL->set("Type",$row["Type"]); + $CORE_LOCAL->set("percentDiscount",$row["Discount"]); + + $CORE_LOCAL->set('inactMem',0); + if ($CORE_LOCAL->get("Type") == "PC") { + $CORE_LOCAL->set("isMember",1); + } else { + $CORE_LOCAL->set("isMember",0); + if ($CORE_LOCAL->get('Type') != 'REG') + $CORE_LOCAL->set('inactMem',1); + } + + $CORE_LOCAL->set("isStaff",$row["staff"]); + $CORE_LOCAL->set("SSI",$row["SSI"]); + + if ($CORE_LOCAL->get("SSI") == 1) + $CORE_LOCAL->set("memMsg",$CORE_LOCAL->get("memMsg")." #"); + + $conn2 = tDataConnect(); + $memquery = "update localtemptrans set card_no = '".$member."', + memType = ".$CORE_LOCAL->get("memType").", + staff = ".$CORE_LOCAL->get("isStaff"); + if ($CORE_LOCAL->get("DBMS") == "mssql" && $CORE_LOCAL->get("store") == "wfc") + $memquery = str_replace("staff","isStaff",$memquery); + + if ($CORE_LOCAL->get("store") == "wedge") { + if ($CORE_LOCAL->get("isMember") == 0 && $CORE_LOCAL->get("percentDiscount") == 10) { + $memquery .= " , percentDiscount = 0 "; + } + elseif ($CORE_LOCAL->get("isStaff") != 1 && $CORE_LOCAL->get("percentDiscount") == 15) { + $memquery .= " , percentDiscount = 0 "; + } + } + + if ($CORE_LOCAL->get("discountEnforced") != 0) { + if ($CORE_LOCAL->get("percentDiscount") > 0) { + discountnotify($CORE_LOCAL->get("percentDiscount")); + } + $memquery .= " , percentDiscount = ".$CORE_LOCAL->get("percentDiscount")." "; + } + else if ($CORE_LOCAL->get("discountEnforced") == 0 && $CORE_LOCAL->get("tenderTotal") == 0) { + $memquery .= " , percentDiscount = 0 "; + } + + $conn2->query($memquery); + + if ($CORE_LOCAL->get("isStaff") == 0) { + $CORE_LOCAL->set("staffSpecial",0); + } + + ttl(); + $CORE_LOCAL->set("unlock",0); + + if ($CORE_LOCAL->get("mirequested") == 1) { + $CORE_LOCAL->set("mirequested",0); + $CORE_LOCAL->set("runningTotal",$CORE_LOCAL->get("amtdue")); + tender("SC", $CORE_LOCAL->get("runningTotal") * 100); + } + +} + +/** + Check if the member has overdue store charge balance + @param $cardno member number + @return True or False + + The logic for what constitutes past due has to be built + into the unpaid_ar_today view. Without that this function + doesn't really do much. +*/ +function check_unpaid_ar($cardno){ + global $CORE_LOCAL; + + // only attempt if server is available + // and not the default non-member + if ($cardno == $CORE_LOCAL->get("defaultNonMem")) return False; + if ($CORE_LOCAL->get("balance") == 0) return False; + + $db = pDataConnect(); + + if (!$db->table_exists("unpaid_ar_today")) return False; + + $query = "SELECT old_balance,recent_payments FROM unpaid_ar_today + WHERE card_no = $cardno"; + $result = $db->query($query); + + // should always be a row, but just in case + if ($db->num_rows($result) == 0) return False; + $row = $db->fetch_row($result); + + $bal = $row["old_balance"]; + $paid = $row["recent_payments"]; + if ($CORE_LOCAL->get("memChargeTotal") > 0) + $paid += $CORE_LOCAL->get("memChargeTotal"); + + if ($bal <= 0) return False; + if ($paid >= $bal) return False; + + // only case where customer prompt should appear + if ($bal > 0 && $paid < $bal){ + $CORE_LOCAL->set("old_ar_balance",$bal - $paid); + return True; + } + + // just in case i forgot anything... + return False; +} + + +//------------------------------------------------- + +/** + Check if an item is voided or a refund + @param $num item trans_id in localtemptrans + @return None + All discovered info is set in $CORE_LOCAL variables + @todo fix the above nonsense +*/ +function checkstatus($num) { + global $CORE_LOCAL; + + if (!$num) { + $num = 0; + } + + $query = "select voided,unitPrice,discountable, + discounttype,trans_status + from localtemptrans where trans_id = ".$num; + + $db = tDataConnect(); + $result = $db->query($query); + + + $num_rows = $db->num_rows($result); + + if ($num_rows > 0) { + $row = $db->fetch_array($result); + $CORE_LOCAL->set("voided",$row["voided"]); + $CORE_LOCAL->set("scaleprice",$row["unitPrice"]); + $CORE_LOCAL->set("discountable",$row["discountable"]); + $CORE_LOCAL->set("discounttype",$row["discounttype"]); + $CORE_LOCAL->set("caseprice",$row["unitPrice"]); + + if ($row["trans_status"] == "V") { + $CORE_LOCAL->set("transstatus","V"); + } + +// added by apbw 6/04/05 to correct voiding of refunded items + + if ($row["trans_status"] == "R") { + $CORE_LOCAL->set("refund",1); + $CORE_LOCAL->set("autoReprint",1); + } + + } + + $db->close(); +} + +//--------------------------------------------------- + +/** + Add a tender to the transaction + @right tender amount in cents (100 = $1) + @strl tender code from tenders table + @return An array see Parser::default_json() + for format explanation. + + This function will automatically end a transaction + if the amount due becomes <= zero. +*/ +function tender($right, $strl) { + global $CORE_LOCAL,$CORE_PATH; + $tender_upc = ""; + + $ret = array('main_frame'=>false, + 'redraw_footer'=>false, + 'target'=>'.baseHeight', + 'output'=>""); + + if ($CORE_LOCAL->get("LastID") == 0){ + $ret['output'] = boxMsg("No transaction in progress"); + return $ret; + } + elseif ($strl > 999999){ + $ret['output'] = xboxMsg("Tender amount of ".truncate2($strl/100)."<BR>exceeds allowable limit"); + return $ret; + } + elseif ($right == "WT"){ + $ret['output'] = xboxMsg("WIC tender not applicable"); + return $ret; + } + elseif ($right == "CK" && $CORE_LOCAL->get("ttlflag") == 1 && ($CORE_LOCAL->get("isMember") != 0 || $CORE_LOCAL->get("isStaff") != 0) && (($strl/100 - $CORE_LOCAL->get("amtdue") - 0.005) > $CORE_LOCAL->get("dollarOver")) && ($CORE_LOCAL->get("cashOverLimit") == 1)){ + $ret['output'] = boxMsg("Member or staff check tender cannot + exceed total purchase by over $".$CORE_LOCAL->get("dollarOver")); + return $ret; + } + elseif ((($right == "CC" || $right == "TB" || $right == "GD") && $strl/100 > ($CORE_LOCAL->get("amtdue") + 0.005)) && $CORE_LOCAL->get("amtdue") >= 0){ + $ret['output'] = xboxMsg("Tender cannot exceed purchase amount"); + return $ret; + } + elseif($right == "EC" && $strl/100 > $CORE_LOCAL->get("amtdue")){ + $ret['output'] = xboxMsg("No cash back with EBT cash tender"); + return $ret; + } + elseif($right == "CK" && $CORE_LOCAL->get("ttlflag") == 1 && $CORE_LOCAL->get("isMember") == 0 and $CORE_LOCAL->get("isStaff") == 0 && ($strl/100 - $CORE_LOCAL->get("amtdue") - 0.005) > 5){ + $ret['output'] = xboxMsg("Non-member check tender cannot exceed total purchase by over $5.00"); + return $ret; + } + + getsubtotals(); + + if ($CORE_LOCAL->get("ttlflag") == 1 && ($right == "CX" || $right == "SC" || $right == "MI")) { + + $charge_ok = chargeOk(); + if ($right == "CX" && $charge_ok == 1 && strlen($CORE_LOCAL->get("memberID")) == 5 && substr($CORE_LOCAL->get("memberID"), 0, 1) == "5") $charge_ok = 1; + elseif (($right == "SC" || $right == "MI") && $charge_ok == 1) $charge_ok = 1; + else $charge_ok = 0; + } + + /* when processing as strings, weird things happen + * in excess of 1000, so use floating point */ + $strl .= ""; // force type to string + $mult = 1; + if ($strl[0] == "-"){ + $mult = -1; + $strl = substr($strl,1,strlen($strl)); + } + $dollars = (int)substr($strl,0,strlen($strl)-2); + $cents = ((int)substr($strl,-2))/100.0; + $strl = (double)($dollars+round($cents,2)); + $strl *= $mult; + + if ($CORE_LOCAL->get("ttlflag") == 0) { + $ret['output'] = boxMsg("Transaction must be totaled before tender can be accepted"); + return $ret; + } + elseif (($right == "FS" || $right == "EF") && $CORE_LOCAL->get("fntlflag") == 0) { + $ret['output'] = boxMsg("Eligble amount must be totaled before foodstamp tender can be accepted"); + return $ret; + } + elseif (($right == "EB" || $right == "EF") && $CORE_LOCAL->get("fntlflag") == 1 && $CORE_LOCAL->get("fsEligible") + 10 <= $strl) { + $ret['output'] = xboxMsg("Foodstamp tender cannot exceed eligible amount by pver $10.00"); + return $ret; + } + elseif ($right == "CX" && $charge_ok == 0) { + $ret['output'] = xboxMsg("Member ".$CORE_LOCAL->get("memberID")."<BR>is not authorized<BR>to make corporate charges"); + return $ret; + } + //alert customer that charge exceeds avail balance + elseif ($right == "MI" && $charge_ok == 0 && $CORE_LOCAL->get("availBal") < 0) { + $ret['output'] = xboxMsg("Member ".$CORE_LOCAL->get("memberID")."<BR> has $" . $CORE_LOCAL->get("availBal") . " available."); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 1 && $CORE_LOCAL->get("availBal") < 0) { + $ret['output'] = xboxMsg("Member ".$CORE_LOCAL->get("memberID")."<BR>is overlimit"); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 0) { + $ret['output'] = xboxMsg("Member ".$CORE_LOCAL->get("memberID")."<BR>is not authorized to make employee charges"); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 1 && ($CORE_LOCAL->get("availBal") + $CORE_LOCAL->get("memChargeTotal") - $strl) < 0) { + $ret['output'] = xboxMsg("Member ".$CORE_LOCAL->get("memberID")."<br> bhas exceeded charge limit"); + return $ret; + } + elseif (($right == "MI" || $right == "SC") && $charge_ok == 1 && (ABS($CORE_LOCAL->get("memChargeTotal"))+ $strl) >= ($CORE_LOCAL->get("availBal") + 0.005) && $CORE_LOCAL->get("store")=="WFC") { + $memChargeRemain = $CORE_LOCAL->get("availBal"); + $memChargeCommitted = $memChargeRemain + $CORE_LOCAL->get("memChargeTotal"); + $ret['output'] = xboxMsg("Available balance for charge <br>is only $" .$memChargeCommitted. ".<br><b><font size = 5>$" . number_format($memChargeRemain,2) . "</font></b><br>may still be used on this purchase."); + return $ret; + } + elseif(($right == "SC" || $right == "CX" || $right == "MI") && truncate2($CORE_LOCAL->get("amtdue")) < truncate2($strl)) { + $ret['output'] = xboxMsg("charge tender exceeds purchase amount"); + elseif(($right == "MI" || $right == "CX") && truncate2($CORE_LOCAL->get("amtdue")) < truncate2($strl)) { + $ret['output'] = xboxMsg("Charge tender exceeds purchase amount"); + return $ret; + } + + $db = pDataConnect(); + $query = "select TenderID,TenderCode,TenderName,TenderType, + ChangeMessage,MinAmount,MaxAmount,MaxRefund from + tenders where tendercode = '".$right."'"; + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) { + $ret['output'] = inputUnknown(); + return $ret; + } + + $row = $db->fetch_array($result); + $tender_code = $right; + $tendered = -1 * $strl; + + if($tender_code == "CC" && $CORE_LOCAL->get("CCintegrate") == 1) { + $tender_upc = $CORE_LOCAL->get("troutd"); + } + $tender_desc = $row["TenderName"]; + $CORE_LOCAL->set("tenderamt",$strl); + $unit_price = 0; + + if ($tender_code == "FS") { + $CORE_LOCAL->set("boxMsg","WFC no longer excepts paper foods stamps. Please choose a different tender type"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($tender_code == "CP" && $strl > $row["MaxAmount"] && $CORE_LOCAL->get("msgrepeat") == 0){ + $CORE_LOCAL->set("boxMsg","$".$strl." is greater than coupon limit<P>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($strl > $row["MaxAmount"] && $CORE_LOCAL->get("msgrepeat") == 0){ + $CORE_LOCAL->set("boxMsg","$".$strl." is greater than tender limit " + ."for ".$row['TenderName']."<p>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "GD" || $right == "TC"){ + $CORE_LOCAL->set("autoReprint",1); + } + + if ($strl - $CORE_LOCAL->get("amtdue") > 0) { + $CORE_LOCAL->set("change",$strl - $CORE_LOCAL->get("amtdue")); + } + else { + $CORE_LOCAL->set("change",0); + } + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-" + .trim($CORE_LOCAL->get("laneno"))."-" + .trim($CORE_LOCAL->get("transno")); + if($CORE_LOCAL->get("enableFranking") == 1) { + if ($right == "CK" && $CORE_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $CORE_LOCAL->set("endorseType","check"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "TV" && $CORE_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert travelers check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $CORE_LOCAL->set("endorseType","check"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "RC" && $CORE_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert rebate check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $CORE_LOCAL->set("endorseType","check"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "TC" && $CORE_LOCAL->get("msgrepeat") == 0) { + $CORE_LOCAL->set("boxMsg","<B> insert gift certificate<B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"); + $CORE_LOCAL->set("endorseType","check"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + return $ret; + } + } + + if ($tender_code == "TV") + addItem($tender_upc, $tender_desc, "T", "CK", "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + elseif ($tender_code == "RC"){ + addItem($tender_upc, $tender_desc, "T", "CK", "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + else + addItem($tender_upc, $tender_desc, "T", $tender_code, "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("TenderType",$tender_code); /***added by apbw 2/1/05 SCR ***/ + + if ($CORE_LOCAL->get("TenderType") == "SC" || $CORE_LOCAL->get("TenderType") == "CX" + || $CORE_LOCAL->get("TenderType") == "MI" ) { + $CORE_LOCAL->set("chargetender",1); // apbw 2/28/05 SCR + } // apbw 2/28/05 SCR + + getsubtotals(); + + if ($right == "FS" || $right == "EB" || $right == "XE" || $right == "EF") { + addfsTaxExempt(); + } + + if ($right == "FS" || $right == "EB") { + $fs = -1 * $CORE_LOCAL->get("fsEligible"); + $fs_ones = (($fs * 100) - (($fs * 100) % 100))/100; + $fs_change = $fs - $fs_ones; + + if ($fs_ones > 0) { + addfsones($fs_ones); + } + + if ($fs_change > 0) { + addchange($fs_change); + } + getsubtotals(); + } + + if ($CORE_LOCAL->get("amtdue") <= 0.005) { + if ($CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_AUTH + && ($right == "CC" || $right == "GD")){ + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("fntlflag",0); + $chk = ttl(); + if ($chk === True) + $ret['output'] = lastpage(); + else + $ret['main_frame'] = $chk; + return $ret; + } + + $CORE_LOCAL->set("change",-1 * $CORE_LOCAL->get("amtdue")); + $cash_return = $CORE_LOCAL->get("change"); + + if ($right != "FS") { + addchange($cash_return); + } + + if ($right == "CK" && $cash_return > 0) + $CORE_LOCAL->set("cashOverAmt",1); // apbw/cvr 3/5/05 cash back beep + + $CORE_LOCAL->set("End",1); + $CORE_LOCAL->set("beep","rePoll"); + $CORE_LOCAL->set("receiptType","full"); + $ret['receipt'] = 'full'; + $ret['output'] = printReceiptfooter(); + } + else { + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("fntlflag",0); + $chk = ttl(); + if ($chk === True) + $ret['output'] = lastpage(); + else + $ret['main_frame'] = $chk; + } + $ret['redraw_footer'] = true; + return $ret; +} + +//------------------------------------------------------- + +/** + Add an open ring to a department + @param $price amount in cents (100 = $1) + @param $dept POS department + @ret an array of return values + @returns An array. See Parser::default_json() + for format explanation. +*/ +function deptkey($price, $dept,$ret=array()) { + global $CORE_LOCAL; + + $intvoided = 0; + + if ($CORE_LOCAL->get("quantity") == 0 && $CORE_LOCAL->get("multiple") == 0) { + $CORE_LOCAL->set("quantity",1); + } + + if (!is_numeric($dept) || !is_numeric($price) || strlen($price) < 1 || strlen($dept) < 2) { + $ret['output'] = inputUnknown(); + $CORE_LOCAL->set("quantity",1); + $ret['udpmsg'] = 'errorBeep'; + return $ret; + } + + $strprice = $price; + $strdept = $dept; + $price = $price/100; + $dept = $dept/10; + + /* auto reprint on ar */ + if ($dept == 990){ + $CORE_LOCAL->set("autoReprint",1); + } + /* auto reprint on gift card sales */ + if ($dept == 902) + $CORE_LOCAL->set("autoReprint",1); + + if ($CORE_LOCAL->get("casediscount") > 0 && $CORE_LOCAL->get("casediscount") <= 100) { + $case_discount = (100 - $CORE_LOCAL->get("casediscount"))/100; + $price = $case_discount * $price; + } + $total = $price * $CORE_LOCAL->get("quantity"); + $intdept = $dept; + + $query = "select dept_no,dept_name,dept_tax,dept_fs,dept_limit, + dept_minimum,dept_discount from departments where dept_no = ".$intdept; + $db = pDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + if ($num_rows == 0) { + $ret['output'] = boxMsg("department unknown"); + $ret['udpmsg'] = 'errorBeep'; + $CORE_LOCAL->set("quantity",1); + } + elseif ($CORE_LOCAL->get("mfcoupon") == 1) { + $row = $db->fetch_array($result); + $CORE_LOCAL->set("mfcoupon",0); + $query2 = "select department, sum(total) as total from localtemptrans where department = " + .$dept." group by department"; + + $db2 = tDataConnect(); + $result2 = $db2->query($query2); + + $num_rows2 = $db2->num_rows($result2); + if ($num_rows2 == 0) { + $ret['output'] = boxMsg("no item found in<BR>".$row["dept_name"]); + $ret['udpmsg'] = 'errorBeep'; + } + else { + $row2 = $db2->fetch_array($result2); + if ($price > $row2["total"]) { + $ret['output'] = boxMsg("coupon amount greater than department total"); + $ret['udpmsg'] = 'errorBeep'; + } + else { + addItem("", $row["dept_name"]." Coupon", "I", "CP", "C", $dept, 1, -1 * $price, -1 * $price, -1 * $price, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, $intvoided); + $CORE_LOCAL->set("ttlflag",0); + //$CORE_LOCAL->set("ttlrequested",0); + $CORE_LOCAL->set("beep","goodBeep"); + $ret['output'] = lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + } + } + } + else { + $row = $db->fetch_array($result); + if (!$row["dept_limit"]) $deptmax = 0; + else $deptmax = $row["dept_limit"]; + + if (!$row["dept_minimum"]) $deptmin = 0; + else $deptmin = $row["dept_minimum"]; + $tax = $row["dept_tax"]; + + if ($row["dept_fs"] != 0) $foodstamp = 1; + else $foodstamp = 0; + + $deptDiscount = $row["dept_discount"]; + + if ($CORE_LOCAL->get("toggleDiscountable") == 1) { + $CORE_LOCAL->set("toggleDiscountable",0); + if ($deptDiscount == 0) { + $deptDiscount = 1; + } else { + $deptDiscount = 0; + } + } + + if ($CORE_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = ($foodstamp + 1) % 2; + $CORE_LOCAL->set("togglefoodstamp",0); + } + + // Hard coding starts + if ($dept == 606) { + $price = -1 * $price; + $total = -1 * $total; + } + // Hard coding ends + + if ($CORE_LOCAL->get("ddNotify") != 0 && $CORE_LOCAL->get("itemPD") == 10) { + $CORE_LOCAL->set("itemPD",0); + $deptDiscount = 7; + $intvoided = 22; + } + + if ($price > $deptmax && $CORE_LOCAL->get("msgrepeat") == 0) { + + $CORE_LOCAL->set("boxMsg","$".$price." is greater than department limit<P>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + } + elseif ($price < $deptmin && $CORE_LOCAL->get("msgrepeat") == 0) { + $CORE_LOCAL->set("boxMsg","$".$price." is lower than department minimum<P>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = $CORE_PATH.'gui-modules/boxMsg2.php'; + } + else { + if ($CORE_LOCAL->get("casediscount") > 0) { + addcdnotify(); + $CORE_LOCAL->set("casediscount",0); + } + + if ($CORE_LOCAL->get("toggletax") == 1) { + if ($tax > 0) $tax = 0; + else $tax = 1; + $CORE_LOCAL->set("toggletax",0); + } + + if ($dept == "77"){ + $db2 = tDataConnect(); + $taxratesQ = "SELECT rate FROM taxrates WHERE id=$tax"; + $taxratesR = $db2->query($taxratesQ); + $rate = array_pop($db2->fetch_row($taxratesR)); + + $price /= (1+$rate); + $price = truncate2($price); + $total = $price * $CORE_LOCAL->get("quantity"); + } + + addItem($price."DP".$dept, $row["dept_name"], "D", " ", " ", $dept, $CORE_LOCAL->get("quantity"), $price, $total, $price, 0 ,$tax, $foodstamp, 0, 0, $deptDiscount, 0, $CORE_LOCAL->get("quantity"), 0, 0, 0, 0, 0, $intvoided); + $CORE_LOCAL->set("ttlflag",0); + //$CORE_LOCAL->set("ttlrequested",0); + $ret['output'] = lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + $CORE_LOCAL->set("msgrepeat",0); + } + } + + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("itemPD",0); + + return $ret; +} + +//------------------------------------------------- + +/** + Total the transaction + @return + True - total successfully + String - URL + + If ttl() returns a string, go to that URL for + more information on the error or to resolve the + problem. + + The most common error, by far, is no + member number in which case the return value + is the member-entry page. +*/ +function ttl() { + global $CORE_LOCAL,$CORE_PATH; + + if ($CORE_LOCAL->get("memberID") == "0") { + return $CORE_PATH."gui-modules/memlist.php"; + } + else { + $mconn = tDataConnect(); + $query = ""; + $query2 = ""; + if ($CORE_LOCAL->get("isMember") == 1) { + $cols = localMatchingColumns($mconn,"localtemptrans","memdiscountadd"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountadd"; + } else { + $cols = localMatchingColumns($mconn,"localtemptrans","memdiscountremove"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountremove"; + } + + if ($CORE_LOCAL->get("isStaff") != 0) { + $cols = localMatchingColumns($mconn,"localtemptrans","staffdiscountadd"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountadd"; + } else { + $cols = localMatchingColumns($mconn,"localtemptrans","staffdiscountremove"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountremove"; + } + + $result = $mconn->query($query); + $result2 = $mconn->query($query2); + + $CORE_LOCAL->set("ttlflag",1); + setglobalvalue("TTLFlag", 1); + $temp = chargeOk(); + if ($CORE_LOCAL->get("balance") < $CORE_LOCAL->get("memChargeTotal") && $CORE_LOCAL->get("memChargeTotal") > 0){ + if ($CORE_LOCAL->get("warned") == 1 and $CORE_LOCAL->get("warnBoxType") == "warnOverpay"){ + $CORE_LOCAL->set("warned",0); + $CORE_LOCAL->set("warnBoxType",""); + } + else { + $CORE_LOCAL->set("warned",1); + $CORE_LOCAL->set("warnBoxType","warnOverpay"); + $CORE_LOCAL->set("boxMsg",sprintf("<b>A/R Imbalance</b><br />Total AR payments $%.2f exceeds AR balance %.2f<br /><font size=-1>[enter] to continue, [clear] to cancel</font>", + $CORE_LOCAL->get("memChargeTotal"), + $CORE_LOCAL->get("balance"))); + $CORE_LOCAL->set("strEntered","TL"); + return $CORE_PATH."gui-modules/boxMsg2.php"; + } + } + else { + $CORE_LOCAL->set("warned",0); + $CORE_LOCAL->set("warnBoxType",""); + } + + if ($CORE_LOCAL->get("percentDiscount") > 0) { + addItem("", $CORE_LOCAL->get("percentDiscount")."% Discount", "C", "", "D", 0, 0, truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + $amtDue = str_replace(",", "", $CORE_LOCAL->get("amtdue")); + + // check in case something else like an + // approval code is already being sent + // to the cc terminal + //if ($CORE_LOCAL->get("ccTermOut")=="idle"){ + $CORE_LOCAL->set("ccTermOut","total:". + str_replace(".","",sprintf("%.2f",$amtDue))); + /* + $st = sigTermObject(); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); + */ + //} + + $peek = peekItem(); + if (substr($peek,0,9) != "Subtotal "){ + addItem("", "Subtotal ".truncate2($CORE_LOCAL->get("subtotal")).", Tax ".truncate2($CORE_LOCAL->get("taxTotal")), "C", "", "D", 0, 0, $amtDue, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3); + } + + if ($CORE_LOCAL->get("fntlflag") == 1) { + addItem("", "Foodstamps Eligible", "", "", "D", 0, 0, truncate2($CORE_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + } + return True; +} + +/** + See what the last item in the transaction is currently + @return localtemptrans.description for the last item +*/ +function peekItem(){ + $db = tDataConnect(); + $q = "SELECT description FROM localtemptrans ORDER BY trans_id DESC"; + $r = $db->query($q); + $w = $db->fetch_row($r); + return (isset($w['description'])?$w['description']:''); +} + +//--------------------------------------- + +/** + Add tax and transaction discount records. + This is called at the end of a transaction. + There's probably no other place where calling + this function is appropriate. +*/ +function finalttl() { + global $CORE_LOCAL; + if ($CORE_LOCAL->get("percentDiscount") > 0) { + addItem("", "Discount", "C", "", "D", 0, 0, truncate2(-1 * $CORE_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + + addItem("Subtotal", "Subtotal", "C", "", "D", 0, 0, truncate2($CORE_LOCAL->get("taxTotal") - $CORE_LOCAL->get("fsTaxExempt")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11); + + + if ($CORE_LOCAL->get("fsTaxExempt") != 0) { + addItem("Tax", truncate2($CORE_LOCAL->get("fstaxable"))." Taxable", "C", "", "D", 0, 0, truncate2($CORE_LOCAL->get("fsTaxExempt")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + addItem("Total", "Total", "C", "", "D", 0, 0, truncate2($CORE_LOCAL->get("amtdue")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11); + +} + +//--------------------------------------- + +//------------------------------------------- + +/** + Add foodstamp elgibile total record +*/ +function fsEligible() { + global $CORE_LOCAL; + getsubtotals(); + if ($CORE_LOCAL->get("fsEligible") < 0 && False) { + $CORE_LOCAL->set("boxMsg","Foodstamp eligible amount inapplicable<P>Please void out earlier tender and apply foodstamp first"); + return $CORE_PATH."gui-modules/boxMsg2.php"; + } + else { + $CORE_LOCAL->set("fntlflag",1); + setglobalvalue("FntlFlag", 1); + if ($CORE_LOCAL->get("ttlflag") != 1) return ttl(); + else addItem("", "Foodstamps Eligible", "" , "", "D", 0, 0, truncate2($CORE_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + + return True; + } +} + +//------------------------------------------ + +/** + Add a percent discount notification + @param $strl discount percentage + @param $json keyed array + @return An array see Parser::default_json() + @deprecated + Use discountnotify() instead. This just adds + hard-coded percentages and PLUs that likely + aren't applicable anywhere but the Wedge. +*/ +function percentDiscount($strl,$json=array()) { + if ($strl == 10.01) $strl = 10; + + if (!is_numeric($strl) || $strl > 100 || $strl < 0) $json['output'] = boxMsg("discount invalid"); + else { + $query = "select sum(total) as total from localtemptrans where upc = '0000000008005' group by upc"; + + $db = tDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + if ($num_rows == 0) $couponTotal = 0; + else { + $row = $db->fetch_array($result); + $couponTotal = nullwrap($row["total"]); + } + if ($couponTotal == 0 || $strl == 0) { + + if ($strl != 0) discountnotify($strl); + $db->query("update localtemptrans set percentDiscount = ".$strl); + $chk = ttl(); + if ($chk !== True) + $json['main_frame'] = $chk; + $json['output'] = lastpage(); + } + else $json['output'] = xboxMsg("10% discount already applied"); + $db->close(); + } + return $json; +} + +//------------------------------------------ + +/** + Check whether the current member has store + charge balance available. + @return + 1 - Yes + 0 - No + + Sets current balance in $CORE_LOCAL as "balance". + Sets available balance in $CORE_LOCAL as "availBal". +*/ +function chargeOk() { + global $CORE_LOCAL; + + getsubtotals(); + + $conn = pDataConnect(); + $query = "select m.availBal,m.balance,c.ChargeOk from memchargebalance as m + left join custdata AS c ON m.CardNo=c.CardNo AND c.personNum=1 + where m.CardNo = '".$CORE_LOCAL->get("memberID")."'"; + + $result = $conn->query($query); + $num_rows = $conn->num_rows($result); + $row = $conn->fetch_array($result); + + $availBal = $row["availBal"] + $CORE_LOCAL->get("memChargeTotal"); + + $CORE_LOCAL->set("balance",$row["balance"]); + $CORE_LOCAL->set("availBal",number_format($availBal,2,'.','')); + + $chargeOk = 1; + if ($num_rows == 0 || !$row["ChargeOk"]) { + $chargeOk = 0; + } + elseif ( $row["ChargeOk"] == 0 ) { + $chargeOk = 0; + } + + return $chargeOk; + +} + +//---------------------------------------------------------- + +/** + Add WFC virtual coupon + @deprecated +*/ +function madCoupon(){ + getsubtotals(); + addMadCoup(); + lastpage(); + +} + +/** + Add a comment + @deprecated + Use addcomment(). +*/ +function comment($comment){ + addComment($comment); + lastpage(); +} +//---------------------------------------------------------- + +/** + Wedge staff charge related + @deprecated +*/ +function staffCharge($arg,$json=array()) { + global $CORE_LOCAL; + + $CORE_LOCAL->set("sc",1); + $staffID = substr($arg, 0, 4); + + $pQuery = "select staffID,chargecode,blueLine from chargecodeview where chargecode = '".$arg."'"; + $pConn = pDataConnect(); + $result = $pConn->query($pQuery); + $num_rows = $pConn->num_rows($result); + $row = $pConn->fetch_array($result); + + if ($num_rows == 0) { + $json['output'] = xboxMsg("Unable to authenticate staff ".$staffID); + $CORE_LOCAL->set("isStaff",0); // apbw 03/05/05 SCR + return $json; + } + else { + $CORE_LOCAL->set("isStaff",1); // apbw 03/05/05 SCR + $CORE_LOCAL->set("memMsg",$row["blueLine"]); + $tQuery = "update localtemptrans set card_no = '".$staffID."', percentDiscount = 15"; + $tConn = tDataConnect(); + + addscDiscount(); + discountnotify(15); + $tConn->query($tQuery); + getsubtotals(); + + $chk = ttl(); + if ($chk !== True){ + $json['main_frame'] = $chk; + return $json; + } + $CORE_LOCAL->set("runningTotal",$CORE_LOCAL->get("amtdue")); + return tender("SC", $CORE_LOCAL->get("runningTotal") * 100); + + } + +} + +/** + End of Shift functionality isn't in use + @deprecated +*/ +function endofShift($json) { + global $CORE_LOCAL; + + $CORE_LOCAL->set("memberID","99999"); + $CORE_LOCAL->set("memMsg","End of Shift"); + addEndofShift(); + getsubtotals(); + $chk = ttl(); + if ($chk !== True){ + $json['main_frame'] = $chk; + return $json; + } + $CORE_LOCAL->set("runningtotal",$CORE_LOCAL->get("amtdue")); + return tender("CA", $CORE_LOCAL->get("runningtotal") * 100); +} + +//--------------------------- WORKING MEMBER DISCOUNT -------------------------- +/** + Add a working member discount + @deprecated + Do not use this. The memType structure in custdata + is a far better solution. +*/ +function wmdiscount() { + global $CORE_LOCAL; + + $sconn = mDataConnect(); + $conn2 = tDataConnect(); + + $volQ = "SELECT * FROM is4c_op.volunteerDiscounts WHERE CardNo = ".$CORE_LOCAL->get("memberID"); + + $volR = $sconn->query($volQ); + $row = $sconn->fetch_array($volR); + $total = $row["total"]; + + if ($row["staff"] == 3) { + if ($CORE_LOCAL->get("discountableTotal") > $total) { + $a = $total * .15; // apply 15% disocunt + $b = ($CORE_LOCAL->get("discountableTotal") - $total) * .02 ; // apply 2% discount + $c = $a + $b; + $aggdisc = number_format(($c / $CORE_LOCAL->get("discountableTotal")) * 100,2); // aggregate discount + + $CORE_LOCAL->set("transDiscount",$c); + $CORE_LOCAL->set("percentDiscount",$aggdisc); + } + elseif ($CORE_LOCAL->get("discountableTotal") <= $total) { + $CORE_LOCAL->set("percentDiscount",15); + $CORE_LOCAL->set("transDiscount",$CORE_LOCAL->get("discountableTotal") * .15); + } + } + elseif ($row["staff"] == 6) { + if ($CORE_LOCAL->get("discountableTotal") > $total) { + $a = $total * .05; // apply 15% disocunt + $aggdisc = number_format(($a / $CORE_LOCAL->get("discountableTotal")) * 100,2); // aggregate discount + + $CORE_LOCAL->set("transDiscount",$a); + $CORE_LOCAL->set("percentDiscount",$aggdisc); + } + elseif ($CORE_LOCAL->get("discountableTotal") <= $total) { + $CORE_LOCAL->set("percentDiscount",5); + $CORE_LOCAL->set("transDiscount",$CORE_LOCAL->get("discountableTotal") * .05); + } + } + +// discountnotify($CORE_LOCAL->get("percentDiscount")); + $conn2->query("update localtemptrans set percentDiscount = ".$CORE_LOCAL->get("percentDiscount")); + + if ($CORE_LOCAL->get("discountableTotal") < $total) { + $a = number_format($CORE_LOCAL->get("discountableTotal") / 20,2); + $arr = explode(".",$a); + if ($arr[1] >= 75 && $arr[1] != 00) $dec = 75; + elseif ($arr[1] >= 50 && $arr[1] < 75) $dec = 50; + elseif ($arr[1] >= 25 && $arr[1] < 50) $dec = 25; + elseif ($arr[1] >= 00 && $arr[1] < 25) $dec = 00; + + $CORE_LOCAL->set("volunteerDiscount",$arr[0]. "." .$dec); + } + else { + $CORE_LOCAL->set("volunteerDiscount",$total / 20); + } + +// echo "voldisc: " .$CORE_LOCAL->get("volunteerDiscount"); +} +//------------------------- END WORKING MEMBER DISCOUNT ------------------------- +?> diff --git a/pos/is4c-nf/lib/printLib.php.obsolete b/pos/is4c-nf/lib/printLib.php.obsolete new file mode 100755 index 000000000..f0d5a6960 --- /dev/null +++ b/pos/is4c-nf/lib/printLib.php.obsolete @@ -0,0 +1,942 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("truncate2")) include_once($CORE_PATH."lib/lib.php"); +if (!function_exists("chargeOK")) include_once($CORE_PATH."lib/prehkeys.php"); + +if (!class_exists("ESCPOSPrintHandler")) include_once($CORE_PATH."lib/PrintHandlers/ESCPOSPrintHandler.php"); +if (!class_exists("Bitmap")) include_once($CORE_PATH."lib/Bitmap.php"); + +if (!isset($CORE_LOCAL)) include_once($CORE_PATH."lib/LocalStorage/conf.php"); + +// -------------------------------------------------------------- +function build_time($timestamp) { + + return strftime("%m/%d/%y %I:%M %p", $timestamp); +} +// -------------------------------------------------------------- +function centerString($text) { + + return center($text, 59); +} +// -------------------------------------------------------------- +function writeLine($text) { + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("print") != 0) { + /* check fails on LTP1: in PHP4 + suppress open errors and check result + instead + */ + //if (is_writable($CORE_LOCAL->get("printerPort"))){ + $fp = fopen($CORE_LOCAL->get("printerPort"), "w"); + fwrite(chr(33).'='.chr(1)); // printer only (bypass pole display) + fwrite($fp, $text); + fclose($fp); + } +} +// -------------------------------------------------------------- +function center_check($text) { + +// return str_repeat(" ", 22).center($text, 60); // apbw 03/24/05 Wedge printer swap patch + return center($text, 60); // apbw 03/24/05 Wedge printer swap patch +} + +// -------------------------------------------------------------- +// concatenated by tt/apbw 3/16/05 old wedge printer Franking Patch II + +function endorse($text) { + + writeLine(chr(27).chr(64).chr(27).chr(99).chr(48).chr(4) + // .chr(27).chr(33).chr(10) + .$text + .chr(27).chr(99).chr(48).chr(1) + .chr(12) + .chr(27).chr(33).chr(5)); +} +// ------------------------------------------------------------- + +function center($text, $linewidth) { + $blank = str_repeat(" ", 59); + $text = trim($text); + $lead = (int) (($linewidth - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +// ------------------------------------------------------------- +function drawerKick() { + writeLine(chr(27).chr(112).chr(0).chr(250).chr(0)); +} + +// ------------------------------------------------------------- +function printReceiptHeader($dateTimeStamp, $ref) { + global $CORE_LOCAL,$CORE_PATH, $PRINT_OBJ; + + $receipt = $PRINT_OBJ->TextStyle(True); + + $i = 2; // for headers below + if ($CORE_LOCAL->get("newReceipt")==1 && $CORE_LOCAL->get("store") != "wfc"){ + $receipt .= $PRINT_OBJ->TextStyle(True, False, True); + $receipt .= $PRINT_OBJ->centerString($CORE_LOCAL->get("receiptHeader1"),True); + $receipt .= $PRINT_OBJ->TextStyle(True); + $receipt .= "\n\n"; + } + else if ($CORE_LOCAL->get("newReceipt")==1 && $CORE_LOCAL->get("store") == "wfc"){ + $img = $PRINT_OBJ->RenderBitmapFromFile($CORE_PATH."graphics/WFC_Logo.bmp"); + $receipt .= $img."\n"; + $i=4; + $receipt .= "\n"; + } + else if ($CORE_LOCAL->get("newReceipt")==1 && ($CORE_LOCAL->get("store") == "harvest-cb" || $CORE_LOCAL->get("store") == "harvest-jp")){ + $img = $PRINT_OBJ->RenderBitmapFromFile($CORE_PATH."graphics/rcpt_hdr.bmp"); + $receipt .= $img."\n"; + $i=45; // skip any headers that happen to be in the database + $receipt .= "\n"; + } + else{ + // zero-indexing the receipt header and footer list + $receipt .= $PRINT_OBJ->TextStyle(True, False, True); + $receipt .= $PRINT_OBJ->centerString($CORE_LOCAL->get("receiptHeader1"),True); + $receipt .= $PRINT_OBJ->TextStyle(True); + $receipt .= "\n"; + } + + // and continuing on + for (; $i <= $CORE_LOCAL->get("receiptHeaderCount"); $i++){ + $receipt .= $PRINT_OBJ->centerString($CORE_LOCAL->get("receiptHeader$i")); + $receipt .= "\n"; + } + + $receipt .= "\n"; + $receipt .= "Cashier: ".$CORE_LOCAL->get("cashier")."\n\n"; + + $time = build_time($dateTimeStamp); + $time = str_replace(" "," ",$time); + $spaces = 55 - strlen($time) - strlen($ref); + $receipt .= $time.str_repeat(' ',$spaces).$ref."\n"; + + return $receipt; +} +// ------------------------------------------------------------- +function promoMsg() { + +} + +// Charge Footer split into two functions by apbw 2/1/05 + +function printChargeFooterCust($dateTimeStamp, $ref) { // apbw 2/14/05 SCR + global $CORE_LOCAL; + + $chgName = getChgName(); // added by apbw 2/14/05 SCR + + $date = build_time($dateTimeStamp); + + $receipt = chr(27).chr(33).chr(5)."\n\n\n".centerString("C U S T O M E R C O P Y")."\n" + .centerString("................................................")."\n" + .centerString($CORE_LOCAL->get("chargeSlip1"))."\n\n" + ."CUSTOMER CHARGE ACCOUNT\n" + ."Name: ".trim($CORE_LOCAL->get("ChgName"))."\n" // changed by apbw 2/14/05 SCR + ."Member Number: ".trim($CORE_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."Charge Amount: $".number_format(-1 * $CORE_LOCAL->get("chargeTotal"), 2)."\n" + .centerString("................................................")."\n" + ."\n\n\n\n\n\n\n" + .chr(27).chr(105); + + return $receipt; + +} + +// Charge Footer split into two functions by apbw 2/1/05 + +function printChargeFooterStore($dateTimeStamp, $ref) { // apbw 2/14/05 SCR + global $CORE_LOCAL; + + + $chgName = getChgName(); // added by apbw 2/14/05 SCR + + $date = build_time($dateTimeStamp); + + $receipt = "\n\n\n\n\n\n\n" + .chr(27).chr(105) + .chr(27).chr(33).chr(5) // apbw 3/18/05 + ."\n".centerString($CORE_LOCAL->get("chargeSlip2"))."\n" + .centerString("................................................")."\n" + .centerString($CORE_LOCAL->get("chargeSlip1"))."\n\n" + ."CUSTOMER CHARGE ACCOUNT\n" + ."Name: ".trim($CORE_LOCAL->get("ChgName"))."\n" // changed by apbw 2/14/05 SCR + ."Member Number: ".trim($CORE_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."Charge Amount: $".number_format(-1 * $CORE_LOCAL->get("chargeTotal"), 2)."\n" + ."I AGREE TO PAY THE ABOVE AMOUNT\n" + ."TO MY CHARGE ACCOUNT\n" + ."Purchaser Sign Below\n\n\n" + ."X____________________________________________\n" + .$CORE_LOCAL->get("fname")." ".$CORE_LOCAL->get("lname")."\n\n" + .centerString(".................................................")."\n\n"; + $CORE_LOCAL->set("chargetender",0); // apbw 2/14/05 SCR (moved up a line for Reprint patch on 3/10/05) + + return $receipt; + + +} + +function printCabCoupon($dateTimeStamp, $ref){ + global $CORE_LOCAL; + + /* no cut + $receipt = "\n\n\n\n\n\n\n" + .chr(27).chr(105) + .chr(27).chr(33).chr(5) + ."\n"; + */ + $receipt = "\n"; + + $receipt .= biggerFont(centerBig("WHOLE FOODS COMMUNITY CO-OP"))."\n\n"; + $receipt .= centerString("(218) 728-0884")."\n"; + $receipt .= centerString("MEMBER OWNED SINCE 1970")."\n"; + $receipt .= centerString(build_time($dateTimeStamp))."\n"; + $receipt .= centerString('Effective this date ONLY')."\n"; + $parts = explode("-",$ref); + $receipt .= centerString("Cashier: $parts[0]")."\n"; + $receipt .= centerString("Transaction: $ref")."\n"; + $receipt .= "\n"; + $receipt .= "Your net purchase today of at least $30.00"."\n"; + $receipt .= "qualifies you for a WFC CAB COUPON"."\n"; + $receipt .= "in the amount of $3.00"; + $receipt .= " with\n\n"; + $receipt .= "GO GREEN TAXI (722-8090) or"."\n"; + $receipt .= "YELLOW CAB OF DULUTH (727-1515)"."\n"; + $receipt .= "from WFC toward the destination of\n"; + $receipt .= "your choice TODAY"."\n\n"; + + + $receipt .= "" + ."This coupon is not transferable.\n" + ."One coupon/day/customer.\n" + ."Any amount of fare UNDER the value of this coupon\n" + ."is the property of the cab company.\n" + ."Any amount of fare OVER the value of this coupon\n" + ."is your responsibility.\n" + ."Tips are NOT covered by this coupon.\n" + ."Acceptance of this coupon by the cab driver is\n" + ."subject to the terms and conditions noted above.\n"; + + return $receipt; +} + +// ------------- frank.php incorporated into printlib on 3/24/05 apbw (from here to eof) ------- + +function frank() { + global $CORE_LOCAL; + + $date = strftime("%m/%d/%y %I:%M %p", time()); + $ref = trim($CORE_LOCAL->get("memberID"))." ".trim($CORE_LOCAL->get("CashierNo"))." ".trim($CORE_LOCAL->get("laneno"))." ".trim($CORE_LOCAL->get("transno")); + $tender = "AMT: ".truncate2($CORE_LOCAL->get("tenderamt"))." CHANGE: ".truncate2($CORE_LOCAL->get("change")); + $output = center_check($ref)."\n" + .center_check($date)."\n" + .center_check($CORE_LOCAL->get("ckEndorse1"))."\n" + .center_check($CORE_LOCAL->get("ckEndorse2"))."\n" + .center_check($CORE_LOCAL->get("ckEndorse3"))."\n" + .center_check($CORE_LOCAL->get("ckEndorse4"))."\n" + .center_check($tender)."\n"; + + + + endorse($output); +} + +// ----------------------------------------------------- + +function frankgiftcert() { + global $CORE_LOCAL; + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + $next_year_stamp = mktime(0,0,0,date("m"), date("d"), date("Y")+1); + $next_year = strftime("%m/%d/%y", $next_year_stamp); // apbw 3/10/05 "%D" didn't work - Franking patch + // lines 200-207 edited 03/24/05 apbw Wedge Printer Swap Patch + $output = ""; + $output .= str_repeat("\n", 6); + $output .= "ref: " .$ref. "\n"; + $output .= str_repeat(" ", 5).$time_now; + $output .= str_repeat(" ", 12).$next_year; + $output .= str_repeat("\n", 3); + $output .= str_repeat(" ", 75); + $output .= "$".truncate2($CORE_LOCAL->get("tenderamt")); + endorse($output); + +} + +// ----------------------------------------------------- + +function frankstock() { + global $CORE_LOCAL; + + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + /* pointless + if ($CORE_LOCAL->get("franking") == 0) { + $CORE_LOCAL->set("franking",1); + } + */ + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + $output = ""; + $output .= str_repeat("\n", 40); // 03/24/05 apbw Wedge Printer Swap Patch + if ($CORE_LOCAL->get("equityAmt")){ + $output = "Equity Payment ref: ".$ref." ".$time_now; // WFC + $CORE_LOCAL->set("equityAmt",""); + $CORE_LOCAL->set("LastEquityReference",$ref); + } + else { + $output .= "Stock Payment $".$CORE_LOCAL->get("tenderamt")." ref: ".$ref." ".$time_now; // apbw 3/24/05 Wedge Printer Swap Patch + } + + endorse($output); +} +//------------------------------------------------------- + + +function frankclassreg() { + global $CORE_LOCAL; + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + $output = ""; + $output .= str_repeat("\n", 11); // apbw 3/24/05 Wedge Printer Swap Patch + $output .= str_repeat(" ", 5); // apbw 3/24/05 Wedge Printer Swap Patch + $output .= "Validated: ".$time_now." ref: ".$ref; // apbw 3/24/05 Wedge Printer Swap Patch + + endorse($output); + +} + +//----------------------------------Credit Card footer----by CvR + +function printCCFooter($dateTimeStamp, $ref) { + global $CORE_LOCAL; + + $date = build_time($dateTimeStamp); + + + + $receipt = "\n".centerString("C U S T O M E R C O P Y")."\n" + .centerString("................................................")."\n" + .centerString($CORE_LOCAL->get("chargeSlip1"))."\n\n" + .centerString("Cardholder acknowledges receipt of goods/services")."\n" + .centerString("in the amount shown and agrees to pay for them")."\n" + .centerString("according to card issuer agreement.")."\n\n" + ."CREDIT CARD CHARGE\n" + ."Name: ".trim($CORE_LOCAL->get("ccName"))."\n" + ."Member Number: ".trim($CORE_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."TROUTD: ".trim($CORE_LOCAL->get("troutd"))."\n" + ."Charge Amount: $".number_format(-1*$CORE_LOCAL->get("ccTotal"), 2)."\n" //changed 04/01/05 Tak & CvR + .centerString("................................................")."\n" + ."\n\n\n\n\n\n\n" + .chr(27).chr(105) + + // writeLine($receipt1.chr(27).chr(105)); + // writeLine(chr(27).chr(105)); + + // $receipt2 ="" + + .centerString($CORE_LOCAL->get("chargeSlip2"))."\n" + .centerString("................................................")."\n" + .centerString($CORE_LOCAL->get("chargeSlip1"))."\n\n" + ."CREDIT CARD CHARGE\n" + ."Name: ".trim($CORE_LOCAL->get("ccName"))."\n" + ."Member Number: ".trim($CORE_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."TROUTD: ".trim($CORE_LOCAL->get("troutd"))."\n" + ."Charge Amount: $".number_format(-1*$CORE_LOCAL->get("ccTotal"), 2)."\n\n" //changed 04/01/05 Tak and CvR + .centerString("I agree to pay the above total amount")."\n" + .centerString("according to card issuer agreement.")."\n\n" + ."Purchaser Sign Below\n\n\n" + ."X____________________________________________\n\n" + .centerString(".................................................")."\n\n"; + + + + + // writeLine(chr(27).chr(105)); + + return $receipt; + +} + +/***** jqh 09/29/05 functions added for new receipt *****/ +function biggerFont($str) { + $receipt=chr(29).chr(33).chr(17); + $receipt.=$str; + $receipt.=chr(29).chr(33).chr(00); + + return $receipt; +} +function centerBig($text) { + $blank = str_repeat(" ", 30); + $text = trim($text); + $lead = (int) ((30 - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +/***** jqh end change *****/ + +/***** CvR 06/28/06 calculate current balance for receipt ****/ +function chargeBalance($receipt){ + global $CORE_LOCAL; + chargeOK(); + + $db = tDataConnect(); + $checkQ = "select trans_id from localtemptrans where department=990 or trans_subtype='MI'"; + $checkR = $db->query($checkQ); + $num_rows = $db->num_rows($checkR); + + $currActivity = $CORE_LOCAL->get("memChargeTotal"); + $currBalance = $CORE_LOCAL->get("balance") - $currActivity; + + if(($num_rows > 0 || $currBalance != 0) && $CORE_LOCAL->get("memberID") != 11){ + $chargeString = "Current IOU Balance: $".sprintf("%.2f",$currBalance); + $receipt = $receipt."\n\n".biggerFont(centerBig($chargeString)); + } + + return $receipt; +} + +function storeCreditIssued($second){ + global $CORE_LOCAL; + if ($second) return ""; + + $db = tDataConnect(); + $checkQ = "select sum(total) from localtemptrans where trans_subtype='SC' and trans_type='T'"; + $checkR = $db->query($checkQ); + + $num_rows = $db->num_rows($checkR); + if ($num_rows == 0) return ""; + + $row = $db->fetch_row($checkR); + $issued = $row[0]; + if ($issued <= 0) return ""; + + + $slip = centerString("................................................")."\n\n"; + $slip .= centerString("( C U S T O M E R C O P Y )")."\n"; + $slip .= biggerFont("Store credit issued")."\n\n"; + $slip .= biggerFont(sprintf("Amount \$%.2f",$issued))."\n\n"; + + if ( $CORE_LOCAL->get("fname") != "" && $CORE_LOCAL->get("lname") != ""){ + $slip .= "Name: ".$CORE_LOCAL->get("fname")." ".$CORE_LOCAL->get("lname")."\n\n"; + } + else { + $slip .= "Name: ____________________________________________\n\n"; + } + $slip .= "Ph #: ____________________________________________\n\n"; + + $slip .= " * no cash back on store credit refunds\n"; + $slip .= " * change amount is not transferable to\n another store credit\n"; + $slip .= centerString("................................................")."\n"; + return $slip; +} + +function getChgName() { + /* + the name that appears beneath the signature + line on the customer copy is pulled from $CORE_LOCAL. + Pulling the name here from custdata w/o respecting + personNum can cause this name to differ from the + signature line, so I'm using $CORE_LOCAL here too. I'm + leaving the query in place as a check that memberID + is valid; shouldn't slow anything down noticably. + + I also changed the memberID strlen qualifier because the + != 4 or == 4 decision was causing inconsistent behavior + with older memberships that have memberIDs shorter than + 4 digits. + + andy + */ + global $CORE_LOCAL; + $query = "select LastName, FirstName from custdata where CardNo = '" .$CORE_LOCAL->get("memberID") ."'"; + $connection = pDataConnect(); + $result = $connection->query($query); + $num_rows = $connection->num_rows($result); + + if ($num_rows > 0) { + $LastInit = substr($CORE_LOCAL->get("lname"), 0, 1)."."; + $CORE_LOCAL->set("ChgName",trim($CORE_LOCAL->get("fname")) ." ". $LastInit); + } + else{ + $CORE_LOCAL->set("ChgName",$CORE_LOCAL->get("memMsg")); + } + + $connection->close(); +} + +function printCCSigSlip($dateTimeStamp,$ref,$storeCopy=True,$rp=0){ + global $CORE_LOCAL; + normalFont(); + + $date = build_time($dateTimeStamp); + $ert = explode("-",$ref); + $emp = $ert[0]; + $reg = $ert[1]; + $trans = $ert[2]; + $slip = ""; + $db = -1; + $idclause = ""; + $limit = ""; + $sort = ""; + + if ( $rp != 0 ) { // if this is a reprint of a previous transaction, loop through all cc slips for that transaction + $db = mDataConnect(); + } else { // else if current transaction, just grab most recent + if ($storeCopy){ + $idclause = " and transID = ".$CORE_LOCAL->get("paycard_id"); + $limit = " TOP 1 "; + } + $sort = " desc "; + $db = tDataConnect(); + } + // query database for cc receipt info + $query = "select ".$limit." tranType, amount, PAN, entryMethod, issuer, xResultMessage, xApprovalNumber, xTransactionID, name, " + ." datetime from ccReceiptView where [date]=".date('Ymd',$dateTimeStamp) + ." and cashierNo = ".$emp." and laneNo = ".$reg + ." and transNo = ".$trans ." ".$idclause + ." order by datetime, cashierNo, laneNo, transNo, xTransactionID, transID ".$sort.", sortorder ".$sort; + if ($CORE_LOCAL->get("DBMS") == "mysql" && $rp == 0){ + $query = str_replace("[date]","date",$query); + if ($limit != ""){ + $query = str_replace($limit,"",$query); + $query .= " LIMIT 1"; + } + } + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + for ($i=0;$i<$num_rows;$i++) { + $row = $db->fetch_array($result); + $trantype = $row['tranType']; + if ($row['amount'] < 0) { + $amt = "-$".number_format(-1*$row['amount'],2); + } else { + $amt = "$".number_format($row['amount'],2); + } + $pan = $row['PAN']; // already masked in the database + $entryMethod = $row['entryMethod']; + $cardBrand = $row['issuer']; + $approvalPhrase = $row['xResultMessage']; + $authCode = "#".$row['xApprovalNumber']; + $sequenceNum = $row['xTransactionID']; + $name = $row["name"]; + + // store copy is 22 lines long + if (!$storeCopy){ + //$slip .= "CC".centerString("C U S T O M E R C O P Y")."\n"; // "wedge copy" + } + else { + $slip .= "CC".substr(centerString($CORE_LOCAL->get("chargeSlip2")),2)."\n"; // "wedge copy" + } + $slip .= centerString("................................................")."\n"; + if ($storeCopy){ + $slip .= centerString($CORE_LOCAL->get("chargeSlip1"))."\n" // store name + .centerString($CORE_LOCAL->get("chargeSlip3").", ".$CORE_LOCAL->get("chargeSlip4"))."\n" // address + .centerString($CORE_LOCAL->get("chargeSlip5"))."\n" // merchant code + .centerString($CORE_LOCAL->get("receiptHeader2"))."\n\n"; // phone + } + + if ($storeCopy){ + $slip .= $trantype."\n" // trans type: purchase, canceled purchase, refund or canceled refund + ."Card: ".$cardBrand." ".$pan."\n" + ."Reference: ".$ref."\n" + ."Date & Time: ".$date."\n" + ."Entry Method: ".$entryMethod."\n" // swiped or manual entry + ."Sequence Number: ".$sequenceNum."\n" // their sequence # + //."Authorization: ".$approvalPhrase." ".$authCode."\n" // result + auth number + ."Authorization: ".$approvalPhrase."\n" // result + auth number + .boldFont() // change to bold font for the total + ."Amount: ".$amt."\n" + .normalFont(); + } + else { + // use columns instead + $c1 = array(); + $c2 = array(); + $c1[] = $trantype; + $c1[] = "Entry Method: ".$entryMethod; + $c1[] = "Sequence Number: ".$sequenceNum; + $c2[] = $cardBrand." ".$pan; + $c2[] = "Authorization: ".$approvalPhrase; + $c2[] = boldFont()."Amount: ".$amt.normalFont(); + $slip .= twoColumns($c1,$c2); + } + if ($storeCopy){ + $slip .= centerString("I agree to pay above total amount")."\n" + .centerString("according to card issuer agreement.")."\n\n" + + .centerString("X____________________________________________")."\n" + .centerString($name)."\n"; + } + $slip .= centerString(".................................................")."\n" + ."\n"; + // if more than one sig slip, cut after each one (except the last) + if ($num_rows > 1 && $i < $num_rows-1 && $storeCopy) { + $slip .= "\n\n\n\n".chr(27).chr(105); + } + } + + if ($CORE_LOCAL->get("SigCapture") != "" && $CORE_LOCAL->get("SigSlipType") == "ccSlip"){ + $sig_file = $_SESSION["INCLUDE_PATH"]."/graphics/SigImages/" + .$CORE_LOCAL->get("CapturedSigFile"); + + $bmp = new Bitmap(); + $bmp->Load($sig_file); + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $printer = new ESCPOSPrintHandler(); + $stripes = $printer->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $printer->InlineBitmap($stripes[$i], $bmpWidth); + + $slip .= $printer->AlignCenter(); + if (count($stripes) > 1) + $slip .= $printer->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $printer->ResetLineSpacing()."\n"; + $slip .= $printer->AlignLeft(); + } + + return $slip; +} + +function normalFont() { + return chr(27).chr(33).chr(5); +} +function boldFont() { + return chr(27).chr(33).chr(9); +} + +function localTTL(){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("localTotal") == 0) return ""; + + $str = sprintf("LOCAL PURCHASES = \$%.2f", + $CORE_LOCAL->get("localTotal")); + return $str."\n"; +} + +function receiptDetail($reprint=False,$trans_num='') { // put into its own function to make it easier to follow, and slightly modified for wider-spread use of joe's "new" receipt format --- apbw 7/3/2007 + global $CORE_LOCAL,$PRINT_OBJ; + + $detail = ""; + $empNo=0;$laneNo=0;$transNo=0; + if ($reprint){ + $temp = explode("-",$trans_num); + $empNo= $temp[0]; + $laneNo = $temp[1]; + $transNo = $temp[2]; + } + + if ($CORE_LOCAL->get("newReceipt") == 0 ) { + // if old style has been specifically requested + // for a partial or reprint, use old format + $query="select linetoprint from receipt"; + if ($reprint){ + $query = "select linetoprint from rp_receipt + where emp_no=$empNo and register_no=$laneNo + and trans_no=$transNo order by trans_id"; + } + $db = tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + // loop through the results to generate the items listing. + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + $detail .= $row[0]."\n"; + } + } + else { + // otherwise use new format + $query = "select linetoprint,sequence,dept_name,ordered, 0 as [local] " + ." from receipt_reorder_unions_g order by ordered,dept_name, " + ." case when ordered=4 then '' else upc end, [sequence]"; + if ($reprint){ + $query = "select linetoprint,sequence,dept_name,ordered, 0 as [local] " + ." from rp_receipt_reorder_unions_g where emp_no=$empNo and " + ." register_no=$laneNo and trans_no=$transNo " + ." order by ordered,dept_name, " + ." case when ordered=4 then '' else upc end, [sequence]"; + } + + $db = tDataConnect(); + if ($CORE_LOCAL->get("DBMS") == "mysql"){ + $query = str_replace("[","",$query); + $query = str_replace("]","",$query); + } + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + // loop through the results to generate the items listing. + $lastDept=""; + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + if ($row[2]!=$lastDept){ // department header + + if ($row['2']==''){ + $detail .= "\n"; + } + else{ + $detail .= $PRINT_OBJ->TextStyle(True,True); + $detail .= $row[2]; + $detail .= $PRINT_OBJ->TextStyle(True,False); + $detail .= "\n"; + } + } + /***** jqh 12/14/05 fix tax exempt on receipt *****/ + if ($row[1]==2 and $CORE_LOCAL->get("TaxExempt")==1){ + $detail .= " TAX 0.00\n"; + } + elseif ($row[1]==1 and $CORE_LOCAL->get("TaxExempt")==1){ + $queryExempt="select + right((space(44) + upper(rtrim('SUBTOTAL'))), 44) + + right((space(8) + convert(varchar,runningTotal-tenderTotal)), 8) + + right((space(4) + ''), 4) as linetoprint,1 as sequence,null as dept_name,3 as ordered,'' as upc + from lttSummary"; + $resultExempt = $db->query($queryExempt); + $rowExempt = $db->fetch_array($resultExempt); + $detail .= $rowExempt[0]."\n"; + } + else{ + if ($CORE_LOCAL->get("promoMsg") == 1 && $row[4] == 1 ){ + // '*' added to local items 8/15/2007 apbw for eat local challenge + $detail .= '*'.$row[0]."\n"; + } else { + if ( strpos($row[0]," TOTAL") ) { + // if it's the grand total line . . . + $detail .= $PRINT_OBJ->TextStyle(True,True); + $detail .= $row[0]."\n"; + $detail .= $PRINT_OBJ->TextStyle(True,False); + } else { + $detail .= $row[0]."\n"; + } + } + } + /***** jqh end change *****/ + + $lastDept=$row[2]; + } // end for loop + } + + return $detail; +} + +/* + * gift card receipt functions --atf 10/8/07 + */ +function printGCSlip($dateTimeStamp, $ref, $storeCopy=true, $rp=0) { + global $CORE_LOCAL; + + $date = build_time($dateTimeStamp); + $ert = explode("-",$ref); + $emp = $ert[0]; + $reg = $ert[1]; + $trans = $ert[2]; + $slip = ""; + + // query database for gc receipt info + $limit = ""; + $order = ""; + $where = "[date]=".date('Ymd',$dateTimeStamp)." AND cashierNo=".$emp." AND laneNo=".$reg." AND transNo=".$trans; + if( $rp == 0) { + $limit = " TOP 1"; + $order = " desc"; + $where .= " AND transID=".$CORE_LOCAL->get("paycard_id"); + } + $sql = "SELECT".$limit." * FROM gcReceiptView WHERE ".$where." ORDER BY [datetime]".$order.", sortorder".$order; + $db = tDataConnect(); + if ($CORE_LOCAL->get("DBMS") == "mysql"){ + $sql = "SELECT * FROM gcReceiptView WHERE ".$where." ORDER BY [datetime]".$order.", sortorder".$order." ".$limit; + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + $sql = str_replace("TOP","LIMIT",$sql); + } + $result = $db->query($sql); + $num = $db->num_rows($result); + + // print a receipt for each row returned + for( $x = 0; $row = $db->fetch_array($result); $x++) { + // special stuff for the store copy only + if( $storeCopy) { + // cut before each slip after the first + if( $x > 0) + $slip .= "\n\n\n\n".chr(27).chr(105); + // reprint header + if( $rp != 0) + $slip .= chr(27).chr(33).chr(5).centerString("*** R E P R I N T ***")."\n"; + // store header + $slip .= "GC".substr(centerString($CORE_LOCAL->get("chargeSlip2")),2)."\n" // "wedge copy" + . centerString("................................................")."\n" + . centerString($CORE_LOCAL->get("chargeSlip1"))."\n" // store name + . centerString($CORE_LOCAL->get("chargeSlip3").", ".$CORE_LOCAL->get("chargeSlip4"))."\n" // address + . centerString($CORE_LOCAL->get("receiptHeader2"))."\n" // phone + . "\n"; + } else { + if( $x == 0) { + if( $num > 1) $slip .= centerString("------- C A R D H O L D E R C O P I E S -------")."\n"; + else $slip .= centerString("--------- C A R D H O L D E R C O P Y ---------")."\n"; + //$slip .= centerString("................................................")."\n"; + } + } + // transaction data + if( true) { // two-column layout + $col1 = array(); + $col2 = array(); + $col1[] = $row['tranType']; + $col2[] = "Date: ".date('m/d/y h:i a', strtotime($row['datetime'])); + $col1[] = "Terminal ID: ".$row['terminalID']; + $col2[] = "Reference: ".$ref."-".$row['transID']; + $col1[] = "Card: ".$row['PAN']; + $col2[] = "Entry Method: ".$row['entryMethod']; + if( ((int)$row['xVoidCode']) > 0) { + $col1[] = "Void Auth: ".$row['xVoidCode']; + $col2[] = "Orig Auth: ".$row['xAuthorizationCode']; + } else { + $col1[] = "Authorization: ".$row['xAuthorizationCode']; + $col2[] = ""; + } + $col1[] = boldFont()."Amount: ".paycard_moneyFormat($row['amount']).normalFont(); // bold ttls apbw 11/3/07 + $col2[] = "New Balance: ".paycard_moneyFormat($row['xBalance']); + $slip .= twoColumns($col1, $col2); + } else { // all-left layout + $slip .= $row['tranType']."\n" + . "Card: ".$row['PAN']."\n" + . "Date: ".date('m/d/y h:i a', strtotime($row['datetime']))."\n" + . "Terminal ID: ".$row['terminalID']."\n" + . "Reference: ".$ref."-".$row['transID']."\n" + . "Entry Method: ".$row['entryMethod']."\n"; + if( ((int)$row['xVoidCode']) > 0) { + $slip .= "Original Authorization: ".$row['xAuthorizationCode']."\n" + . "Void Authorization: ".$row['xVoidCode']."\n"; + } else { + $slip .= "Authorization: ".$row['xAuthorizationCode']."\n"; + } + $slip .= boldFont()."Amount: ".paycard_moneyFormat($row['amount']).normalFont()."\n" // bold ttls apbw 11/3/07 + . "New Balance: ".paycard_moneyFormat($row['xBalance'])."\n"; + } + // name/phone on activation only + if( $row['tranType'] == 'Gift Card Activation' && $storeCopy) { + $slip .= "\n".centerString("Name: ___________________________________")."\n" + ."\n".centerString("Phone: ___________________________________")."\n"; + } + $slip .= centerString(".................................................")."\n"; + // reprint footer + if( $storeCopy && $rp != 0) + $slip .= chr(27).chr(33).chr(5).centerString("*** R E P R I N T ***")."\n"; + } // foreach row + + // add normal font ONLY IF we printed something else, too + if( strlen($slip) > 0) + $slip = normalFont() . $slip; + + return $slip; +} // printGCSlip() + +function printGCBalSlip() { + global $CORE_LOCAL; + + // balance inquiries are not logged and have no meaning in a reprint, + // so we can assume that it just happened now and all data is still in session vars + $tempArr = $CORE_LOCAL->get("paycard_response"); + $bal = "$".number_format($tempArr["Balance"],2); + $pan = $CORE_LOCAL->get("paycard_PAN"); // no need to mask gift card numbers + $slip = normalFont() + .centerString(".................................................")."\n" + .centerString($CORE_LOCAL->get("chargeSlip1"))."\n" // store name + .centerString($CORE_LOCAL->get("chargeSlip3").", ".$CORE_LOCAL->get("chargeSlip4"))."\n" // address + .centerString($CORE_LOCAL->get("receiptHeader2"))."\n" // phone + ."\n" + ."Gift Card Balance\n" + ."Card: ".$pan."\n" + ."Date: ".date('m/d/y h:i a')."\n" + .boldFont() // change to bold font for the total + ."Balance: ".$bal."\n" + .normalFont() + .centerString(".................................................")."\n" + ."\n"; + return $slip; +} // printGCBalSlip() + +function twoColumns($col1, $col2) { + // init + $max = 56; + $text = ""; + // find longest string in each column, ignoring font change strings + $c1max = 0; + $col1s = array(); + foreach( $col1 as $c1) { + $c1s = trim(str_replace(array(boldFont(),normalFont()), "", $c1)); + $col1s[] = $c1s; + $c1max = max($c1max, strlen($c1s)); + } + $c2max = 0; + $col2s = array(); + foreach( $col2 as $c2) { + $c2s = trim(str_replace(array(boldFont(),normalFont()), "", $c2)); + $col2s[] = $c2s; + $c2max = max($c2max, strlen($c2s)); + } + // space the columns as much as they'll fit + $spacer = $max - $c1max - $c2max; + // scan both columns + for( $x=0; isset($col1[$x]) && isset($col2[$x]); $x++) { + $c1 = trim($col1[$x]); $c1l = strlen($col1s[$x]); + $c2 = trim($col2[$x]); $c2l = strlen($col2s[$x]); + if( ($c1max+$spacer+$c2l) <= $max) { + $text .= $c1 . @str_repeat(" ", ($c1max+$spacer)-$c1l) . $c2 . "\n"; + } else { + $text .= $c1 . "\n" . str_repeat(" ", $c1max+$spacer) . $c2 . "\n"; + } + } + // if one column is longer than the other, print the extras + // (only one of these should happen since the loop above runs as long as both columns still have rows) + for( $y=$x; isset($col1[$y]); $y++) { + $text .= trim($col1[$y]) . "\n"; + } // col1 extras + for( $y=$x; isset($col2[$y]); $y++) { + $text .= str_repeat(" ", $c1max+$spacer) . trim($col2[$y]) . "\n"; + } // col2 extras + return $text; +} + +?> diff --git a/pos/is4c-nf/lib/printReceipt.php.obsolete b/pos/is4c-nf/lib/printReceipt.php.obsolete new file mode 100755 index 000000000..5e216cb7b --- /dev/null +++ b/pos/is4c-nf/lib/printReceipt.php.obsolete @@ -0,0 +1,226 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("setDrawerKick")) include($CORE_PATH."lib/setDrawerKick.php"); // apbw 03/29/05 Drawer Kick Patch +if (!function_exists("writeLine")) include_once($CORE_PATH."lib/printLib.php"); // apbw 03/26/05 Wedge Printer Swap Patch +if (!class_exists("ESCPOSPrintHandler")) include_once($CORE_PATH."lib/PrintHandlers/ESCPOSPrintHandler.php"); // apbw 03/26/05 Wedge Printer Swap Patch +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +// ----------------------------------------------------------- +// printReceipt.php is the main page for printing receipts. +// It invokes the following functions from other pages: +// ----------------------------------------------------------- + +$PRINT_OBJ; + +function printReceipt($arg1,$second=False) { + global $CORE_LOCAL, $PRINT_OBJ; + + $PRINT_OBJ = new ESCPOSPrintHandler(); + + $dokick = setDrawerKickLater(); + $receipt = ""; + + if ($arg1 == "full" and $dokick != 0) { // ---- apbw 03/29/05 Drawer Kick Patch + $kick_cmd = $PRINT_OBJ->DrawerKick(2,48*2,30*2); + $PRINT_OBJ->writeLine($kick_cmd); + //writeLine(chr(27).chr(112).chr(0).chr(48)."0"); + } + +/* -------------------------------------------------------------- + turn off staff charge receipt printing if toggled - apbw 2/1/05 + ---------------------------------------------------------------- */ + + $noreceipt = ($CORE_LOCAL->get("receiptToggle")==1 ? 0 : 1); + + $dateTimeStamp = time(); // moved by apbw 2/15/05 SCR + +// -- Our Reference number for the transaction. + + $ref = trim($CORE_LOCAL->get("CashierNo"))."-".trim($CORE_LOCAL->get("laneno"))."-".trim($CORE_LOCAL->get("transno")); + + if ($noreceipt != 1){ // moved by apbw 2/15/05 SCR + $receipt = printReceiptHeader($dateTimeStamp, $ref); + + if ($second){ + $ins = $PRINT_OBJ->centerString("( S T O R E C O P Y )")."\n"; + $receipt = substr($receipt,0,3).$ins.substr($receipt,3); + } + + // The Nitty Gritty: + /***** jqh 09/29/05 changes made to following if statement so if the receipt is full, then print new receipt, + if not full, then print old style receipt *****/ + if ($arg1 == "full") { + + $receipt .= receiptDetail(); + $member = "Member ".trim($CORE_LOCAL->get("memberID")); + $your_discount = $CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("memCouponTTL"); + + if ($CORE_LOCAL->get("transDiscount") + + $CORE_LOCAL->get("memCouponTTL") + + $CORE_LOCAL->get("specials") > 0 ) { + $receipt .= 'TODAY YOU SAVED = $'. + number_format($your_discount + $CORE_LOCAL->get("specials"),2). + "\n"; + } + $receipt .= localTTL(); + $receipt .= "\n"; + + if (trim($CORE_LOCAL->get("memberID")) != $CORE_LOCAL->get("defaultNonMem")) { + if ($CORE_LOCAL->get("newReceipt")==1){ + $receipt .= $PRINT_OBJ->TextStyle(True,False,True); + $receipt .= $PRINT_OBJ->centerString("thank you - owner ".$member,True); + $receipt .= $PRINT_OBJ->TextStyle(True); + $receipt .= "\n\n"; + } + else{ + $receipt .= $PRINT_OBJ->centerString("Thank You - ".$member); + $receipt .= "\n"; + } + } + else { + if ($CORE_LOCAL->get("newReceipt")==1){ + $receipt .= $PRINT_OBJ->TextStyle(True,False,True); + $receipt .= $PRINT_OBJ->centerString("thank you",True); + $receipt .= $PRINT_OBJ->TextStyle(True); + $receipt .= "\n\n"; + } + else{ + $receipt .= $PRINT_OBJ->centerString("Thank You!"); + $receipt .= "\n"; + } + } + + for ($i = 1; $i <= $CORE_LOCAL->get("receiptFooterCount"); $i++){ + $receipt .= $PRINT_OBJ->centerString($CORE_LOCAL->get("receiptFooter$i")); + $receipt .= "\n"; + } + + if ($CORE_LOCAL->get("store")=="wfc"){ + $refund_date = date("m/d/Y",mktime(0,0,0,date("n"),date("j")+30,date("Y"))); + $receipt .= $PRINT_OBJ->centerString("returns accepted with this receipt through ".$refund_date); + $receipt .= "\n"; + } + + /***** CvR add charge total to receipt bottom ****/ + $receipt = chargeBalance($receipt); + /**** CvR end ****/ + + // append customer copy to actual lane receipt + if ($CORE_LOCAL->get('standalone') == 0) + $receipt .= printCCSigSlip($dateTimeStamp, $ref, false, 0); + + if ($CORE_LOCAL->get("autoReprint") == 1) + $receipt .= printGCSlip($dateTimeStamp, $ref, false, 1); + else + $receipt .= printGCSlip($dateTimeStamp, $ref, true, 1); + + if ($CORE_LOCAL->get("promoMsg") == 1) { + promoMsg(); + } + + $receipt .= storeCreditIssued($second); + + $CORE_LOCAL->set("headerprinted",0); + } + else if ($arg1 == "cab"){ + $ref = $CORE_LOCAL->get("cabReference"); + $receipt = printCabCoupon($dateTimeStamp, $ref); + $CORE_LOCAL->set("cabReference",""); + } + else { + /***** jqh 09/29/05 if receipt isn't full, then display receipt in old style *****/ + $query="select linetoprint from receipt"; + $db = tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + // loop through the results to generate the items listing. + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + $receipt .= $row[0]."\n"; + } + /***** jqh end change *****/ + + $dashes = "\n".centerString("----------------------------------------------")."\n"; + + if ($arg1 == "partial") { + $receipt .= $dashes.centerString("* P A R T I A L T R A N S A C T I O N *").$dashes; + } + elseif ($arg1 == "cancelled") { + $receipt .= $dashes.centerString("* T R A N S A C T I O N C A N C E L L E D *").$dashes; + } + elseif ($arg1 == "resume") { + $receipt .= $dashes.centerString("* T R A N S A C T I O N R E S U M E D *").$dashes + .centerString("A complete receipt will be printed\n") + .centerString("at the end of the transaction"); + } + elseif ($arg1 == "suspended") { + $receipt .= $dashes.centerString("* T R A N S A C T I O N S U S P E N D E D *").$dashes + .centerString($ref); + } + elseif ($arg1 == "ccSlip") { + $receipt = printCCSigSlip($dateTimeStamp,$ref,True); + } + else if ($arg1 == "gcSlip") { // --atf 10/8/07 + if ($CORE_LOCAL->get("autoReprint") == 1){ + $receipt = printGCSlip($dateTimeStamp,$ref,true); + } + else { + $receipt = printGCSlip($dateTimeStamp,$ref,false); + } + } + else if ($arg1 == "gcBalSlip") { // --atf 10/8/07 + $receipt = printGCBalSlip(); + } + + } /***** jqh end big if statement change *****/ + } + else { + $receipt = chargeBalance($receipt); + } + + /* -------------------------------------------------------------- + print store copy of charge slip regardless of receipt print setting - apbw 2/14/05 + ---------------------------------------------------------------- */ + if ($CORE_LOCAL->get("chargetender") == 1 && $CORE_LOCAL->get("End") == 1) { + if ($noreceipt == 1) { + $receipt = $receipt.printChargeFooterStore($dateTimeStamp, $ref); + } else { + $receipt = $receipt.printChargeFooterStore($dateTimeStamp, $ref); + } + } + + if ($receipt !== ""){ + $receipt = $receipt."\n\n\n\n\n\n\n"; + //$receipt .= $PRINT_OBJ->LineFeed(7); + + $PRINT_OBJ->writeLine($receipt.chr(27).chr(105)); + } + + $receipt = ""; +} + +?> diff --git a/pos/is4c-nf/lib/reprint.php.obsolete b/pos/is4c-nf/lib/reprint.php.obsolete new file mode 100644 index 000000000..026dc53f6 --- /dev/null +++ b/pos/is4c-nf/lib/reprint.php.obsolete @@ -0,0 +1,179 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +// ----------------------------------------------------------- +// reprint the specified receipt +// ----------------------------------------------------------- + +if (!function_exists("pDataConnect")) include($CORE_PATH."lib/connect.php"); +if (!function_exists("writeLine")) include($CORE_PATH."lib/printLib.php"); +if (!class_exists("ESCPOSPrintHandler")) include_once($CORE_PATH."lib/PrintHandlers/ESCPOSPrintHandler.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +$PRINT_OBJ; + +function reprintReceipt($trans_num=""){ + global $CORE_LOCAL, $PRINT_OBJ; + + $PRINT_OBJ = new ESCPOSPrintHandler(); + + if (strlen($trans_num) >= 1) { + $title = chr(27).chr(33).chr(5).centerString("*** R E P R I N T ***")."\n\n\n"; + + $arpspec = explode("::", $trans_num); + $laneno = $arpspec[0]; + $cashierNo = $arpspec[1]; + $transno = $arpspec[2]; + + $ref = trim($cashierNo)."-".trim($laneno)."-".trim($transno); + + $queryHeader = "select * from rp_receipt_header where register_no = ".$laneno." and emp_no = ".$cashierNo." and trans_no = ".$transno; + + $connect = tDataConnect(); + $header = $connect->query($queryHeader); + $headerRow = $connect->fetch_array($header); + + $dateTimeStamp = $headerRow["dateTimeStamp"]; + $dateTimeStamp = strtotime($dateTimeStamp); + + $CORE_LOCAL->set("memberID",$headerRow["memberID"]); + $CORE_LOCAL->set("memCouponTLL",$headerRow["couponTotal"]); + $CORE_LOCAL->set("transDiscount",$headerRow["transDiscount"]); + $CORE_LOCAL->set("chargeTotal",-1*$headerRow["chargeTotal"]); + + if ($CORE_LOCAL->get("chargeTotal") != 0) { + $CORE_LOCAL->set("chargetender",1); + } else { + $CORE_LOCAL->set("chargetender",0); + } + + $CORE_LOCAL->set("discounttotal",$headerRow["discountTTL"]); + $CORE_LOCAL->set("memSpecial",$headerRow["memSpecial"]); + + $connect->close(); + + $connID = pDataConnect(); + $queryID = "select LastName,FirstName,Type,blueLine from custdata + where CardNo = '".$CORE_LOCAL->get("memberID")."' and personNum=1"; + $result = $connID->query($queryID); + $row = $connID->fetch_array($result); + + // restore names for charge slips + $CORE_LOCAL->set("lname",$row["LastName"]); + $CORE_LOCAL->set("fname",$row["FirstName"]); + + if ($row["Type"] == "PC") { + $CORE_LOCAL->set("isMember",1); + } + else { + $CORE_LOCAL->set("isMember",0); + } + $CORE_LOCAL->set("memMsg",$row["blueLine"]); + + $connID->close(); + + if ($CORE_LOCAL->get("isMember") == 1) { + $CORE_LOCAL->set("yousaved",number_format( $CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("discounttotal") + $CORE_LOCAL->get("memSpecial") + $CORE_LOCAL->get("memCouponTTL"), 2)); + $CORE_LOCAL->set("couldhavesaved",0); + $CORE_LOCAL->set("specials",number_format($CORE_LOCAL->get("discounttotal") + $CORE_LOCAL->get("memSpecial"), 2)); + } + else { + $dblyousaved = number_format($CORE_LOCAL->get("memSpecial"), 2); + $CORE_LOCAL->set("yousaved",$CORE_LOCAL->get("discounttotal")); + $CORE_LOCAL->set("couldhavesaved",number_format($CORE_LOCAL->get("memSpecial"), 2)); + $CORE_LOCAL->set("specials",$CORE_LOCAL->get("discounttotal")); + } + + + // call to transLog, the body of the receipt comes from the view 'receipt' + $receipt = $title.printReceiptHeader($dateTimeStamp, $ref); + + $receipt .= receiptDetail(True,$ref); + + // The Nitty Gritty: + $member = "Member ".trim($CORE_LOCAL->get("memberID")); + if ($member == 0) $member = $CORE_LOCAL->get("defaultNonMem"); + $your_discount = $CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("memCouponTTL"); + + if ($CORE_LOCAL->get("transDiscount") + $CORE_LOCAL->get("memCouponTTL") + $CORE_LOCAL->get("specials") > 0) { + $receipt .= "\n".centerString("------------------ YOUR SAVINGS -------------------")."\n"; + + if ($your_discount > 0) { + $receipt .= " DISCOUNTS: $".number_format($your_discount, 2)."\n"; + } + + if ($CORE_LOCAL->get("specials") > 0) { + $receipt .= " SPECIALS: $".number_format($CORE_LOCAL->get("specials"), 2)."\n"; + } + + $receipt .= centerString("---------------------------------------------------")."\n"; + } + $receipt .= "\n"; + + if (trim($CORE_LOCAL->get("memberID")) != $CORE_LOCAL->get("defaultNonMem")) { + $receipt .= centerString("Thank You - ".$member)."\n"; + } + else { + $receipt .= centerString("Thank You!")."\n"; + } + + if ($CORE_LOCAL->get("yousaved") > 0) { + $receipt .= centerString("You Saved $".number_format($CORE_LOCAL->get("yousaved"), 2))."\n"; + } + + if ($CORE_LOCAL->get("couldhavesaved") > 0 && $CORE_LOCAL->get("yousaved") > 0) { + $receipt .= centerString("You could have saved an additional $" + .number_format($CORE_LOCAL->get("couldhavesaved"), 2))."\n"; + } + elseif ($CORE_LOCAL->get("couldhavesaved") > 0) { + $receipt .= centerString("You could have saved $" + .number_format($CORE_LOCAL->get("couldhavesaved"), 2))."\n"; + } + + for ($i = 1; $i <= $CORE_LOCAL->get("receiptFooterCount"); $i++){ + $receipt .= $PRINT_OBJ->centerString($CORE_LOCAL->get("receiptFooter$i")); + $receipt .= "\n"; + } + + + if ($CORE_LOCAL->get("chargetender") != 0 ) { // apbw 03/10/05 Reprint patch + $receipt = $receipt.printChargeFooterStore($dateTimeStamp, $ref); // apbw 03/10/05 Reprint patch + } // apbw 03/10/05 Reprint patch + + $receipt .= printGCSlip($dateTimeStamp, $ref, true, 1); + $receipt .= printCCSigSlip($dateTimeStamp, $ref, False, 1); + + $receipt = $receipt."\n\n\n\n\n\n\n"; // apbw 03/10/05 Reprint patch + writeLine($receipt.chr(27).chr(105)); // apbw 03/10/05 Reprint patch + $receipt = ""; // apbw 03/10/05 Reprint patch + + $CORE_LOCAL->set("memMsg",""); + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("percentDiscount",0); + } +} + +?> diff --git a/pos/is4c-nf/lib/session.php.obsolete b/pos/is4c-nf/lib/session.php.obsolete new file mode 100644 index 000000000..ffcc0b743 --- /dev/null +++ b/pos/is4c-nf/lib/session.php.obsolete @@ -0,0 +1,317 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +include_once($CORE_PATH."ini.php"); +if (!function_exists("pDataConnect")) include($CORE_PATH."lib/connect.php"); +if (!function_exists("loadglobalvalues")) include($CORE_PATH."lib/loadconfig.php"); +if (!function_exists("paycard_reset")) include($CORE_PATH."cc-modules/lib/paycardLib.php"); +if (!function_exists("term_object")) include($CORE_PATH."cc-modules/lib/term.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief Setup session variables + @depreacted see CoreState +*/ + +/** + Populates $CORE_LOCAL with default values. + Short-hand for calling every other function + in this file. Normally called once on + startup. +*/ +function initiate_session() { + system_init(); + memberReset(); + transReset(); + printReset(); + paycard_reset(); + + getsubtotals(); + loadglobalvalues(); + loaddata(); + customreceipt(); +} + +/** + Initialize system default values in + $CORE_LOCAL. Variables defined here + should always exist but won't be reset + to these values on a regular basis. +*/ +function system_init() { + global $CORE_LOCAL; + + //$CORE_LOCAL->set("datetimestamp",strftime("%Y-%m-%m/%d/%y %T",time())); + $CORE_LOCAL->set("beep","noBeep"); + $CORE_LOCAL->set("scan","scan"); + $CORE_LOCAL->set("standalone",0); + $CORE_LOCAL->set("SNR",0); + $CORE_LOCAL->set("screset","staycool"); + $CORE_LOCAL->set("currentid",1); + $CORE_LOCAL->set("currenttopid",1); + $CORE_LOCAL->set("training",0); + $CORE_LOCAL->set("adminRequest",""); + $CORE_LOCAL->set("weight",0); + $CORE_LOCAL->set("scale",1); + $CORE_LOCAL->set("msg",0); + $CORE_LOCAL->set("plainmsg",""); + //$CORE_LOCAL->set("alert",""); + $CORE_LOCAL->set("away",0); + $CORE_LOCAL->set("waitforScale",0); + $CORE_LOCAL->set("ccRemoteServerUp",1); + $CORE_LOCAL->set("search_or_list",0); + $CORE_LOCAL->set("ccTermOut","idle"); + $td = term_object(); + if (is_object($td)) + $td->WriteToScale("reset"); +} + +/** + Initialize transaction variable in $CORE_LOCAL. + This function is called after the end of every + transaction so these values will be the + the defaults every time. +*/ +function transReset() { + global $CORE_LOCAL; + + $CORE_LOCAL->set("End",0); + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("TaxExempt",0); + $CORE_LOCAL->set("fstaxable",0); + $CORE_LOCAL->set("yousaved",0); + $CORE_LOCAL->set("couldhavesaved",0); + //$CORE_LOCAL->set("void",0); + $CORE_LOCAL->set("voided",0); + $CORE_LOCAL->set("voidTTL",0); + $CORE_LOCAL->set("tare",0); + $CORE_LOCAL->set("tenderamt",0); + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("transstatus",""); + $CORE_LOCAL->set("ccTender",0); + $CORE_LOCAL->set("ccAmtEntered",0); + $CORE_LOCAL->set("ccAmt",0); + $CORE_LOCAL->set("TenderType","XX"); + $CORE_LOCAL->set("ChgName","Charge Account"); + $CORE_LOCAL->set("cashOverAmt",0); + $CORE_LOCAL->set("chargetender",0); + $CORE_LOCAL->set("mirequested",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $CORE_LOCAL->set("toggleDiscountable",0); + //$CORE_LOCAL->set("ttlrequested",0); + $CORE_LOCAL->set("discounttype",0); + $CORE_LOCAL->set("discountable",0); + $CORE_LOCAL->set("refund",0); + //$CORE_LOCAL->set("istaxable",0); + $CORE_LOCAL->set("mfcoupon",0); + $CORE_LOCAL->set("casediscount",0); + //$CORE_LOCAL->set("ondiscount",0); + $CORE_LOCAL->set("multiple",0); + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("nd",0); // negates default 10% discount at the charge book + $CORE_LOCAL->set("sc",0); // marks transaction as a staff charge at the charge book + $CORE_LOCAL->set("idSearch",""); + //$CORE_LOCAL->set("repeat",0); + $CORE_LOCAL->set("strEntered",""); + $CORE_LOCAL->set("strRemembered",""); + $CORE_LOCAL->set("msgrepeat",0); // when set to 1, pos2.php takes the previous strEntered + $CORE_LOCAL->set("boxMsg",""); + $CORE_LOCAL->set("itemPD",0); // Item percent discount for the charge book + $CORE_LOCAL->set("specials",0); + $CORE_LOCAL->set("ccSwipe",""); + $CORE_LOCAL->set("ccName",""); + $CORE_LOCAL->set("ccType",""); + $CORE_LOCAL->set("troutd",""); + $CORE_LOCAL->set("ouxWait",0); + + $CORE_LOCAL->set("warned",0); + $CORE_LOCAL->set("warnBoxType",""); + $CORE_LOCAL->set("requestType",""); +} + +/** + Initialize print related variables in $CORE_LOCAL. + This function is called after the end of + every transaction. +*/ +function printReset() { + global $CORE_LOCAL; + + //$CORE_LOCAL->set("franking",0); + //$CORE_LOCAL->set("noreceipt",0); + $CORE_LOCAL->set("receiptToggle",1); + $CORE_LOCAL->set("receiptType",""); + $CORE_LOCAL->set("endorseType",""); + //$CORE_LOCAL->set("kick",1); + + $CORE_LOCAL->set("autoReprint",0); + $CORE_LOCAL->set("reprintNameLookup",0); +} + +/** + Initialize member related variables in $CORE_LOCAL. + This function is called after the end of + every transaction. +*/ +function memberReset() { + global $CORE_LOCAL; + + $CORE_LOCAL->set("memberID","0"); + $CORE_LOCAL->set("isMember",0); + $CORE_LOCAL->set("isStaff",0); + $CORE_LOCAL->set("SSI",0); + //$CORE_LOCAL->set("discountcap",0); + $CORE_LOCAL->set("memMsg",""); + $CORE_LOCAL->set("memType",0); + $CORE_LOCAL->set("balance",0); + $CORE_LOCAL->set("availBal",0); + $CORE_LOCAL->set("percentDiscount",0); + + $CORE_LOCAL->set("ar_paid",0); + $CORE_LOCAL->set("inactMem",0); + $CORE_LOCAL->set("memAge",date('Ymd')); +} + +/** + Get member information line for a given member + @param $row a record from custdata + @return string + @deprecated + Just define blueLine in custdata. +*/ +function blueLine($row) { + $status = array('Non-Owner', 'Shareholder', 'Subscriber', 'Inactive', 'Refund', 'On Hold', 'Sister Org.', 'Other Co-ops'); + if ($row["blueLine"]) { // custom blueLine as defined by db + return $row["blueLine"]; + } elseif (isset($row["blueLine"])) { // 0 - default blueLine with out name + return '#'.$row['CardNo'].' - '.$row['Discount'].'% - '.$status[$row['memType']]; + } else { // NULL - default blueLine including name + return '#'.$row['CardNo'].' - '.$status[$row['memType']].': '.$row['FirstName'].' '.$row['LastName']; + } +} + +/** + If there are records in localtemptrans, get the + member number and initialize $CORE_LOCAL member + variables. + + The only time this function does anything is + in crash recovery - if a browser is closed and + re-opened or the computer is rebooted in the + middle of a transaction. +*/ +function loaddata() { + global $CORE_LOCAL; + + $query_local = "select card_no from localtemptrans"; + + $db_local = tDataConnect(); + $result_local = $db_local->query($query_local); + $num_rows_local = $db_local->num_rows($result_local); + + if ($num_rows_local > 0) { + $row_local = $db_local->fetch_array($result_local); + + if ($row_local["card_no"] && strlen($row_local["card_no"]) > 0) { + $CORE_LOCAL->set("memberID",$row_local["card_no"]); + } + } + // moved, no need to stay open - andy 4/12/07 + $db_local->close(); + + if ($CORE_LOCAL->get("memberID") == "0") { + // not used - andy 4/12/07 + $CORE_LOCAL->set("percentDiscount",0); + $CORE_LOCAL->set("memType",0); + } + else { + $query_member = "select CardNo,memType,Type,Discount,staff,SSI, + MemDiscountLimit,blueLine,FirstName,LastName + from custdata where CardNo = '".$CORE_LOCAL->get("memberID")."'"; + $db_product = pDataConnect(); + $result = $db_product->query($query_member); + if ($db_product->num_rows($result) > 0) { + $row = $db_product->fetch_array($result); + $CORE_LOCAL->set("memMsg",blueLine($row)); + $CORE_LOCAL->set("memType",$row["memType"]); + $CORE_LOCAL->set("percentDiscount",$row["Discount"]); + + if ($row["Type"] == "PC") $CORE_LOCAL->set("isMember",1); + else $CORE_LOCAL->set("isMember",0); + + $CORE_LOCAL->set("isStaff",$row["staff"]); + $CORE_LOCAL->set("SSI",$row["SSI"]); + $CORE_LOCAL->set("discountcap",$row["MemDiscountLimit"]); + + if ($CORE_LOCAL->get("SSI") == 1) + $CORE_LOCAL->set("memMsg",$CORE_LOCAL->get("memMsg")." #"); + } + // moved for proper scope - andy 4/12/07 + $db_product->close(); + } +} + +/** + Fetch text fields from the customReceipt table + These fields are used for various messages that + invariably must be customized at every store. + */ +function customreceipt(){ + global $CORE_LOCAL; + + $db = pDataConnect(); + $headerQ = "select text,type,seq from customReceipt order by seq"; + $headerR = $db->query($headerQ); + $counts = array(); + while($headerW = $db->fetch_row($headerR)){ + $typeStr = $headerW['type']; + $numeral = $headerW['seq']+1; + $text = $headerW['text']; + + // translation for really old data + if (strtolower($typeStr)=="header") + $typeStr = "receiptHeader"; + elseif(strtolower($typeStr)=="footer") + $typeStr = "receiptFooter"; + + $CORE_LOCAL->set($typeStr.$numeral,$text); + + if (!isset($counts[$typeStr])) + $counts[$typeStr] = 1; + else + $counts[$typeStr]++; + } + + foreach($counts as $key => $num){ + $CORE_LOCAL->set($key."Count",$num); + } + + $db->db_close(); +} + +?> diff --git a/pos/is4c-nf/lib/setDrawerKick.php.obsolete b/pos/is4c-nf/lib/setDrawerKick.php.obsolete new file mode 100644 index 000000000..1b8bcab50 --- /dev/null +++ b/pos/is4c-nf/lib/setDrawerKick.php.obsolete @@ -0,0 +1,97 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief Functions for opening the till drawer + @deprecated See ReceiptLib +*/ + +/** + Check whether drawer should open on this transaction + @return + - 1 open drawer + - 0 do not open +*/ +function setDrawerKick() + +{ + global $CORE_LOCAL; + +// this, the simplest version, kicks the drawer for every tender *except* staff charge & business charge (MI, CX) +// apbw 05/03/05 KickFix added !=0 criteria + + if ($CORE_LOCAL->get("chargeTotal") == $CORE_LOCAL->get("tenderTotal") && $CORE_LOCAL->get("chargeTotal") != 0 && $CORE_LOCAL->get("tenderTotal") != 0 ) { + //$_SESSION["kick"] = 0; + return 0; + } else { + //$_SESSION["kick"] = 1; + return 1; + } +} + +/** + Variant check for when to open cash drawer + @return + - 1 open drawer + - 0 do not open + + Opens on cash transactions, credit card + transactions > $25, and stamp sales. + + @todo This functionality needs to be more modular + and customizable. +*/ +function setDrawerKickLater() + +{ + +// this more complex version can be modified to kick the drawer under whatever circumstances the FE Mgr sees fit +// it currently kicks the drawer *only* for cash in & out +// and credit card - andy + + + $db = tDataConnect(); + + $query = "select * from localtemptrans where (trans_subtype = 'CA' and total <> 0) or (trans_subtype = 'CC' AND (total < -25 or total > 0)) or upc='0000000001065'"; + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + $row = $db->fetch_array($result); + + if ($num_rows != 0) { + //$_SESSION["kick"] = 1; + return 1; + } else { + //$_SESSION["kick"] = 0; + return 0; + } + +} + +?> diff --git a/pos/is4c-nf/lib/special.php.obsolete b/pos/is4c-nf/lib/special.php.obsolete new file mode 100644 index 000000000..40b9cfa89 --- /dev/null +++ b/pos/is4c-nf/lib/special.php.obsolete @@ -0,0 +1,108 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."pos.css")) $CORE_PATH .= "../"; } + +if (!function_exists("receipt")) include($CORE_PATH."lib/clientscripts.php"); +if (!function_exists("getMatchingColumns")) include($CORE_PATH."lib/connect.php"); +if (!isset($CORE_LOCAL)) include($CORE_PATH."lib/LocalStorage/conf.php"); + +/** + @file + @brief Functions related to suspend and resume transaction + @deprecated see SuspendLib +*/ + +/** + Suspends the current transaction + If the remote server is available, it will be suspended + there. Otherwise it is suspended locally. +*/ +function suspendorder() { + global $CORE_LOCAL; + + //testremote(); + $query_a = "select emp_no, trans_no from localtemptrans"; + $db_a = tDataConnect(); + $result_a = $db_a->query($query_a); + $row_a = $db_a->fetch_array($result_a); + $cashier_no = substr("000".$row_a["emp_no"], -2); + $trans_no = substr("0000".$row_a["trans_no"], -4); + + if ($CORE_LOCAL->get("standalone") == 0) { + $db_a->add_connection($CORE_LOCAL->get("mServer"),$CORE_LOCAL->get("mDBMS"), + $CORE_LOCAL->get("mDatabase"),$CORE_LOCAL->get("mUser"),$CORE_LOCAL->get("mPass")); + $cols = getMatchingColumns($db_a,"localtemptrans","suspended"); + $db_a->transfer($CORE_LOCAL->get("tDatabase"),"select {$cols} from localtemptrans", + $CORE_LOCAL->get("mDatabase"),"insert into suspended ($cols)"); + $db_a->close($CORE_LOCAL->get("mDatabase")); + } + else { + $query = "insert into suspended select * from localtemptrans"; + $result = $db_a->query($query); + } + + $CORE_LOCAL->set("plainmsg","transaction suspended"); + $CORE_LOCAL->set("msg",2); + receipt("suspended"); + $recall_line = $CORE_LOCAL->get("standalone")." ".$CORE_LOCAL->get("laneno")." ".$cashier_no." ".$trans_no; + + $db_a->close(); +} + +/** + Check whether there are suspended transactions + @return + - 1 Yes + - 0 No + + This function ignores any transactions that + are not from the current day. +*/ +function checksuspended() { + global $CORE_LOCAL; + + //testremote(); + + $db_a = tDataConnect(); + $query_local = "select * from suspendedtoday"; + + $result = ""; + if ($CORE_LOCAL->get("standalone") == 1) { + $result = $db_a->query($query_local); + } else { + $db_a->close(); + $db_a = mDataConnect(); + $result = $db_a->query($query_local); + } + + $num_rows = $db_a->num_rows($result); + + if ($num_rows == 0) return 0; + else return 1; + + $db_a->close(); +} + +?> diff --git a/pos/is4c-nf/lib/udpSend.php.obsolete b/pos/is4c-nf/lib/udpSend.php.obsolete new file mode 100644 index 000000000..eeac636a5 --- /dev/null +++ b/pos/is4c-nf/lib/udpSend.php.obsolete @@ -0,0 +1,40 @@ +<?php + +/** + Send a message via UDP + @param $msg the message + @param $port integer port +*/ +function udpSend($msg,$port=9450){ + if (!function_exists("socket_create")) return; + $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + $res = socket_sendto($sock, $msg, strlen($msg), 0, '127.0.0.1',$port); + socket_close($sock); +} + +/** + Bi-directional UDP communication + @param $msg the message + @param $port integer port + @return the response or an empty string + + Whatever program is listening on the other + end cannot respond on the same port. It must + send the response on (port+1). +*/ +function udpPoke($msg,$port=9450){ + $socket = stream_socket_server("udp://127.0.0.1:".($port+1), + $errno, $errstr, STREAM_SERVER_BIND); + udpSend($msg,$port); + $read = array($socket); + $write = null; + $except = null; + $ready = stream_select($read,$write,$except,0,500); + $buf = ""; + if ($ready > 0) + $buf = stream_socket_recvfrom($socket, 1024, 0, $peer); + stream_socket_shutdown($socket,STREAM_SHUT_RDWR); + return $buf; +} + +?> diff --git a/pos/is4c-nf/license.txt b/pos/is4c-nf/license.txt new file mode 100644 index 000000000..9f8d190e3 --- /dev/null +++ b/pos/is4c-nf/license.txt @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details Type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; Type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/pos/is4c-nf/locale/en_US/LC_MESSAGES/pos-nf.mo b/pos/is4c-nf/locale/en_US/LC_MESSAGES/pos-nf.mo new file mode 100644 index 000000000..f519a772e Binary files /dev/null and b/pos/is4c-nf/locale/en_US/LC_MESSAGES/pos-nf.mo differ diff --git a/pos/is4c-nf/locale/pos-nf.pot b/pos/is4c-nf/locale/pos-nf.pot new file mode 100644 index 000000000..9f3d64188 --- /dev/null +++ b/pos/is4c-nf/locale/pos-nf.pot @@ -0,0 +1,805 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-28 15:31-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/PrehLib.php:322 parser-class-lib/parse/SimpleTender.php:49 +#: parser-class-lib/parse/SimpleTender.php:70 +#: parser-class-lib/parse/SimpleTender.php:104 +#: parser-class-lib/parse/SimpleTender.php:114 gui-modules/adminlist.php:41 +#: lib/Tenders/TenderModule.php:81 parser-class-lib/parse/TenderOut.php:35 +#: lib/PrehLib.php:322 lib/Tenders/TenderModule.php:81 +#: parser-class-lib/parse/TenderOut.php:35 +#: parser-class-lib/parse/SimpleTender.php:49 +#: parser-class-lib/parse/SimpleTender.php:70 +#: parser-class-lib/parse/SimpleTender.php:104 +#: parser-class-lib/parse/SimpleTender.php:114 gui-modules/adminlist.php:41 +msgid "no transaction in progress" +msgstr "No transction in progress" + +#: lib/PrehLib.php:330 lib/PrehLib.php:330 +msgid "WIC tender not applicable" +msgstr "" + +#: lib/PrehLib.php:334 lib/PrehLib.php:334 +msgid "" +"member or staff check tender cannot \n" +"\t\t\texceed total purchase by over $" +msgstr "Member or staff check tender cannot exceed total purchase by over $" + +#: lib/PrehLib.php:339 lib/Tenders/GiftCardTender.php:38 +#: lib/Tenders/CreditCardTender.php:38 lib/PrehLib.php:339 +#: lib/Tenders/GiftCardTender.php:38 lib/Tenders/CreditCardTender.php:38 +msgid "tender cannot exceed purchase amount" +msgstr "Tender cannot exceed purchase amount" + +#: lib/PrehLib.php:343 lib/Tenders/FoodstampTender.php:40 lib/PrehLib.php:343 +#: lib/Tenders/FoodstampTender.php:40 +msgid "no cash back with EBT cash tender" +msgstr "No cash back with EBT cash tender" + +#: lib/PrehLib.php:347 lib/Tenders/CheckTender.php:41 +#: lib/Tenders/CheckTender.php:40 lib/PrehLib.php:347 +#: lib/Tenders/CheckTender.php:40 +msgid "non-member check tender cannot exceed total purchase by over $5.00" +msgstr "Non-member check tender cannot exceed total purchase by over $5.00" + +#: lib/PrehLib.php:375 lib/Tenders/TenderModule.php:87 lib/PrehLib.php:375 +#: lib/Tenders/TenderModule.php:87 +msgid "transaction must be totaled before tender can be accepted" +msgstr "Transaction must be totaled before tender can be accepted" + +#: lib/PrehLib.php:379 lib/Tenders/FoodstampTender.php:37 lib/PrehLib.php:379 +#: lib/Tenders/FoodstampTender.php:37 +msgid "eligible amount must be totaled before foodstamp tender can be accepted" +msgstr "Eligible amount must be totaled before foodstamp tender can be accepted" + +#: lib/PrehLib.php:383 lib/Tenders/FoodstampTender.php:43 lib/PrehLib.php:383 +#: lib/Tenders/FoodstampTender.php:43 +msgid "Foodstamp tender cannot exceed eligible amount by over $10.00" +msgstr "Foodstamp tender cannot exceed eligible amount by over $10.00" + +#: lib/PrehLib.php:396 lib/PrehLib.php:396 +msgid "is overlimit" +msgstr "is overlimit" + +#: lib/PrehLib.php:400 parser-class-lib/parse/SimpleTender.php:122 +#: lib/PrehLib.php:400 parser-class-lib/parse/SimpleTender.php:122 +msgid "is not authorized to make employee charges" +msgstr "is not authorized to make employee charges" + +#: lib/PrehLib.php:404 lib/PrehLib.php:404 +msgid "has exceeded charge limit" +msgstr "" + +#: lib/PrehLib.php:414 lib/Tenders/StoreChargeTender.php:51 +#: lib/PrehLib.php:414 lib/Tenders/StoreChargeTender.php:51 +msgid "charge tender exceeds purchase amount" +msgstr "Charge tender exceeds purchase amount" + +#: lib/PrehLib.php:443 lib/PrehLib.php:443 +msgid "WFC no longer excepts paper foods stamps. Please choose a different tender type" +msgstr "" + +#: lib/PrehLib.php:448 lib/PrehLib.php:448 +msgid "is greater than coupon limit" +msgstr "" + +#: lib/PrehLib.php:449 lib/PrehLib.php:456 lib/PrehLib.php:855 +#: lib/PrehLib.php:860 parser-class-lib/parse/UPC.php:135 +#: parser-class-lib/parse/UPC.php:261 parser-class-lib/parse/UPC.php:274 +#: parser-class-lib/parse/SimpleTender.php:80 lib/Tenders/TenderModule.php:105 +#: lib/Tenders/CheckTender.php:63 lib/Tenders/GiftCertificateTender.php:55 +#: gui-modules/memlist.php:205 gui-modules/deptlist.php:123 +#: gui-modules/productlist.php:180 gui-modules/rplist.php:105 +#: gui-modules/suspendedlist.php:130 gui-modules/tenderlist.php:124 +#: gui-modules/adminlist.php:126 lib/Tenders/CheckTender.php:62 +#: lib/PrehLib.php:449 lib/PrehLib.php:456 lib/PrehLib.php:855 +#: lib/PrehLib.php:860 lib/Tenders/TenderModule.php:105 +#: lib/Tenders/CheckTender.php:62 lib/Tenders/GiftCertificateTender.php:55 +#: parser-class-lib/parse/UPC.php:135 parser-class-lib/parse/UPC.php:261 +#: parser-class-lib/parse/UPC.php:274 +#: parser-class-lib/parse/SimpleTender.php:80 gui-modules/memlist.php:205 +#: gui-modules/deptlist.php:123 gui-modules/productlist.php:180 +#: gui-modules/rplist.php:105 gui-modules/suspendedlist.php:130 +#: gui-modules/tenderlist.php:124 gui-modules/adminlist.php:126 +msgid "clear to cancel" +msgstr "[clear] to cancel" + +#: lib/PrehLib.php:449 lib/PrehLib.php:456 lib/PrehLib.php:855 +#: lib/PrehLib.php:860 lib/Tenders/TenderModule.php:105 lib/PrehLib.php:449 +#: lib/PrehLib.php:456 lib/PrehLib.php:855 lib/PrehLib.php:860 +#: lib/Tenders/TenderModule.php:105 +msgid "enter to proceed" +msgstr "[enter] to proceed" + +#: lib/PrehLib.php:454 lib/PrehLib.php:454 +msgid "is greater than tender limit" +msgstr "" + +#: lib/PrehLib.php:662 lib/PrehLib.php:662 +msgid "tender is misconfigured" +msgstr "Tender is misconfigured" + +#: lib/PrehLib.php:776 lib/PrehLib.php:776 +msgid "department unknown" +msgstr "Department unknown" + +#: lib/PrehLib.php:791 lib/PrehLib.php:791 +msgid "no item found in" +msgstr "No item found in" + +#: lib/PrehLib.php:797 lib/PrehLib.php:797 +msgid "coupon amount greater than department total" +msgstr "Coupon amount greater than department total" + +#: lib/PrehLib.php:854 lib/PrehLib.php:854 +msgid "is greater than department limit" +msgstr "" + +#: lib/PrehLib.php:859 lib/PrehLib.php:859 +msgid "is lower than department minimum" +msgstr "" + +#: lib/DisplayLib.php:339 test.php:7 lib/DisplayLib.php:339 +msgid "input unknown" +msgstr "Input unknown" + +#: parser-class-lib/parse/UPC.php:110 parser-class-lib/parse/UPC.php:110 +msgid "is not a valid item" +msgstr "" + +#: parser-class-lib/parse/UPC.php:134 parser-class-lib/parse/UPC.php:134 +msgid "Item not for sale" +msgstr "" + +#: parser-class-lib/parse/UPC.php:135 parser-class-lib/parse/UPC.php:135 +msgid "enter to continue sale" +msgstr "[enter] to continue sale" + +#: parser-class-lib/parse/UPC.php:162 parser-class-lib/parse/UPC.php:162 +msgid "product cannot be sold right now" +msgstr "Product cannot be sold right now" + +#: parser-class-lib/parse/UPC.php:198 parser-class-lib/parse/UPC.php:198 +msgid "Claims to be more than $100,000" +msgstr "" + +#: parser-class-lib/parse/UPC.php:211 parser-class-lib/parse/UPC.php:211 +msgid "please put item on scale" +msgstr "Please put item on scale" + +#: parser-class-lib/parse/UPC.php:227 parser-class-lib/parse/UPC.php:227 +msgid "item weight must be greater than tare weight" +msgstr "Item weight must be greater than tare weight" + +#: parser-class-lib/parse/UPC.php:235 parser-class-lib/parse/UPC.php:235 +msgid "fractional quantity cannot be accepted for this item" +msgstr "Fractional quantity cannot be accepted for this item" + +#: parser-class-lib/parse/UPC.php:260 parser-class-lib/parse/UPC.php:260 +msgid "insert document" +msgstr "Insert document" + +#: parser-class-lib/parse/UPC.php:260 parser-class-lib/parse/UPC.php:273 +#: parser-class-lib/parse/SimpleTender.php:80 lib/Tenders/CheckTender.php:62 +#: lib/Tenders/GiftCertificateTender.php:54 lib/Tenders/CheckTender.php:61 +#: lib/Tenders/CheckTender.php:61 lib/Tenders/GiftCertificateTender.php:54 +#: parser-class-lib/parse/UPC.php:260 parser-class-lib/parse/UPC.php:273 +#: parser-class-lib/parse/SimpleTender.php:80 +msgid "press enter to endorse" +msgstr "Press [enter] to endorse" + +#: parser-class-lib/parse/UPC.php:273 parser-class-lib/parse/UPC.php:273 +msgid "insert form" +msgstr "Insert form" + +#: parser-class-lib/parse/SimpleTender.php:38 +#: parser-class-lib/parse/SimpleTender.php:38 +msgid "EBT tender must specify amount" +msgstr "" + +#: parser-class-lib/parse/SimpleTender.php:62 +#: parser-class-lib/parse/SimpleTender.php:95 +#: parser-class-lib/parse/SimpleTender.php:108 +#: parser-class-lib/parse/Steering.php:178 +#: parser-class-lib/parse/Steering.php:178 +#: parser-class-lib/parse/SimpleTender.php:62 +#: parser-class-lib/parse/SimpleTender.php:95 +#: parser-class-lib/parse/SimpleTender.php:108 +msgid "transaction must be totaled" +msgstr "Transaction must be totaled" + +#: parser-class-lib/parse/SimpleTender.php:63 +#: parser-class-lib/parse/SimpleTender.php:96 +#: parser-class-lib/parse/SimpleTender.php:109 +#: parser-class-lib/parse/Steering.php:179 +#: parser-class-lib/parse/Steering.php:179 +#: parser-class-lib/parse/SimpleTender.php:63 +#: parser-class-lib/parse/SimpleTender.php:96 +#: parser-class-lib/parse/SimpleTender.php:109 +msgid "before tender can be accepted" +msgstr "" + +#: gui-modules/suspendedlist.php:100 gui-modules/adminlist.php:68 +#: gui-modules/suspendedlist.php:100 gui-modules/adminlist.php:68 +msgid "no suspended transaction" +msgstr "No suspended transaction" + +#: gui-modules/adminlist.php:64 gui-modules/adminlist.php:64 +msgid "transaction in progress" +msgstr "Transaction in progress" + +#: lib/FooterBoxes/EveryoneSales.php:30 lib/FooterBoxes/EveryoneSales.php:30 +msgid "Special" +msgstr "" + +#: lib/FooterBoxes/SavedOrCouldHave.php:32 +#: lib/FooterBoxes/SavedOrCouldHave.php:32 +msgid "You Saved" +msgstr "" + +#: lib/FooterBoxes/SavedOrCouldHave.php:34 +#: lib/FooterBoxes/SavedOrCouldHave.php:34 +msgid "Could Have Saved" +msgstr "" + +#: lib/FooterBoxes/TransPercentDiscount.php:32 +#: lib/FooterBoxes/TransPercentDiscount.php:34 +#: lib/FooterBoxes/TransPercentDiscount.php:32 +#: lib/FooterBoxes/TransPercentDiscount.php:34 +msgid "% Discount" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:34 lib/FooterBoxes/MultiTotal.php:34 +msgid "fs Amount Due" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:38 lib/FooterBoxes/MultiTotal.php:38 +msgid "Amount Due" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:43 lib/FooterBoxes/MultiTotal.php:43 +msgid "Change" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:47 lib/FooterBoxes/MultiTotal.php:47 +msgid "Total" +msgstr "" + +#: lib/FooterBoxes/MemSales.php:30 lib/FooterBoxes/MemSales.php:30 +msgid "Mbr Special" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:66 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:66 +msgid "coupon not found" +msgstr "Coupon not found" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:72 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:72 +msgid "coupon expired" +msgstr "Coupon expired" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:87 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:87 +msgid "coupon already applied" +msgstr "Coupon already applied" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:96 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:96 +msgid "Member only coupon" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:97 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:97 +msgid "Apply member number first" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:108 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:108 +msgid "Coupon already used" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:109 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:109 +msgid "on this membership" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:129 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:145 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:161 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:177 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:208 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:218 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:228 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:129 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:145 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:161 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:177 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:208 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:218 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:228 +msgid "coupon requirements not met" +msgstr "Coupon requirements not met" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:236 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:236 +msgid "unknown minimum type" +msgstr "Unknown minimum type" + +#: lib/Scanning/SpecialUPCs/SpecialOrder.php:57 +#: lib/Scanning/SpecialUPCs/SpecialOrder.php:57 +msgid "Not a valid order" +msgstr "" + +#: lib/Scanning/SpecialUPCs/SpecialOrder.php:71 +#: lib/Scanning/SpecialUPCs/SpecialOrder.php:71 +msgid "Order not found" +msgstr "" + +#: lib/Scanning/SpecialUPCs/MemberCard.php:52 +#: lib/Scanning/SpecialUPCs/MemberCard.php:52 +msgid "Card not assigned" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:69 +#: lib/Scanning/SpecialUPCs/CouponCode.php:69 +msgid "coupon type unknown" +msgstr "Coupon type unknown" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:69 +#: lib/Scanning/SpecialUPCs/CouponCode.php:69 +msgid "enter coupon manually" +msgstr "Enter coupon manually" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:136 +#: lib/Scanning/SpecialUPCs/CouponCode.php:136 +msgid "product not found" +msgstr "Product not found" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:136 +#: lib/Scanning/SpecialUPCs/CouponCode.php:136 +msgid "in transaction" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:164 +#: lib/Scanning/SpecialUPCs/CouponCode.php:164 +msgid "Coupon already applied" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:164 +#: lib/Scanning/SpecialUPCs/CouponCode.php:164 +msgid "for this item" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:170 +#: lib/Scanning/SpecialUPCs/CouponCode.php:170 +#, php-format +msgid "coupon requires %d items" +msgstr "Coupon requires %d items" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:171 +#: lib/Scanning/SpecialUPCs/CouponCode.php:171 +#, php-format +msgid "there are only %d item(s)" +msgstr "There are only %d item(s)" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:171 +#: lib/Scanning/SpecialUPCs/CouponCode.php:171 +msgid "in this transaction" +msgstr "" + +#: lib/DisplayLib.php:365 lib/DisplayLib.php:365 +msgid "M E M B E R" +msgstr "" + +#: lib/DisplayLib.php:371 lib/DisplayLib.php:371 +msgid "C A S H I E R" +msgstr "" + +#: lib/SuspendLib.php:59 lib/SuspendLib.php:59 +msgid "transaction suspended" +msgstr "Transaction suspended" + +#: lib/Tenders/StoreChargeTender.php:39 lib/Tenders/StoreChargeTender.php:43 +#: lib/Tenders/StoreChargeTender.php:39 lib/Tenders/StoreChargeTender.php:43 +msgid "member" +msgstr "Member" + +#: lib/Tenders/StoreChargeTender.php:40 lib/Tenders/StoreChargeTender.php:40 +msgid "is not authorized" +msgstr "" + +#: lib/Tenders/StoreChargeTender.php:40 lib/Tenders/StoreChargeTender.php:40 +msgid "to make charges" +msgstr "" + +#: lib/Tenders/StoreChargeTender.php:43 lib/Tenders/StoreChargeTender.php:43 +msgid "is over limit" +msgstr "" + +#: lib/Tenders/StoreChargeTender.php:48 lib/Tenders/StoreChargeTender.php:48 +msgid "available balance for charge" +msgstr "Available balance for charge" + +#: lib/Tenders/StoreChargeTender.php:48 lib/Tenders/StoreChargeTender.php:48 +msgid "is only $" +msgstr "" + +#: lib/Tenders/DisabledTender.php:34 lib/Tenders/DisabledTender.php:34 +msgid "tender disabled" +msgstr "Tender disabled" + +#: lib/Tenders/TenderModule.php:84 lib/Tenders/TenderModule.php:84 +msgid "tender amount of" +msgstr "Tender amount of" + +#: lib/Tenders/TenderModule.php:84 lib/Tenders/TenderModule.php:84 +msgid "exceeds allowable limit" +msgstr "" + +#: lib/Tenders/TenderModule.php:103 lib/Tenders/TenderModule.php:103 +msgid "is greater than tender limit for" +msgstr "" + +#: lib/Tenders/CheckTender.php:62 lib/Tenders/GiftCertificateTender.php:54 +#: lib/Tenders/CheckTender.php:61 lib/Tenders/CheckTender.php:61 +#: lib/Tenders/GiftCertificateTender.php:54 +msgid "insert" +msgstr "Insert" + +#: lib/Tenders/StoreTransferTender.php:39 +#: lib/Tenders/StoreTransferTender.php:39 +msgid "store transfer exceeds purchase amount" +msgstr "Store transfer exceeds purchase amount" + +#: lib/Tenders/StoreTransferTender.php:55 +#: lib/Tenders/StoreTransferTender.php:55 +msgid "Login for store transfer" +msgstr "" + +#: parser-class-lib/parse/BalanceCheck.php:36 +#: parser-class-lib/parse/BalanceCheck.php:36 +msgid "Member" +msgstr "" + +#: parser-class-lib/parse/BalanceCheck.php:37 +#: parser-class-lib/parse/BalanceCheck.php:37 +msgid "Current AR balance is" +msgstr "" + +#: parser-class-lib/parse/BalanceCheck.php:38 +#: parser-class-lib/parse/BalanceCheck.php:38 +msgid "Available AR balance is" +msgstr "" + +#: parser-class-lib/parse/Steering.php:76 +#: parser-class-lib/parse/Steering.php:76 +msgid "Login to void transactions" +msgstr "" + +#: parser-class-lib/parse/Steering.php:92 +#: parser-class-lib/parse/Steering.php:92 +msgid "Login to suspend/resume transactions" +msgstr "" + +#: parser-class-lib/parse/Steering.php:134 +#: parser-class-lib/parse/Steering.php:147 +#: parser-class-lib/parse/Steering.php:134 +#: parser-class-lib/parse/Steering.php:147 +msgid "Transaction in Progress" +msgstr "" + +#: parser-class-lib/parse/Steering.php:169 gui-modules/mgrlogin.php:154 +#: parser-class-lib/parse/Steering.php:169 gui-modules/mgrlogin.php:154 +msgid "transaction cancelled" +msgstr "Transaction cancelled" + +#: parser-class-lib/parse/Steering.php:187 +#: parser-class-lib/parse/Steering.php:187 +msgid "Login to alter price" +msgstr "" + +#: parser-class-lib/parse/Steering.php:200 +#: parser-class-lib/parse/Steering.php:200 +msgid "processor error" +msgstr "Processor error" + +#: parser-class-lib/parse/Void.php:37 parser-class-lib/parse/ItemPD.php:35 +#: parser-class-lib/parse/Void.php:37 parser-class-lib/parse/ItemPD.php:35 +msgid "No Item on Order" +msgstr "" + +#: parser-class-lib/parse/Void.php:47 parser-class-lib/parse/Void.php:47 +msgid "Cannot void this entry" +msgstr "" + +#: parser-class-lib/parse/Void.php:54 parser-class-lib/parse/Void.php:88 +#: parser-class-lib/parse/Void.php:244 parser-class-lib/parse/Void.php:54 +#: parser-class-lib/parse/Void.php:88 parser-class-lib/parse/Void.php:244 +msgid "Item already voided" +msgstr "" + +#: parser-class-lib/parse/Void.php:82 parser-class-lib/parse/Void.php:227 +#: parser-class-lib/parse/ItemPD.php:64 parser-class-lib/parse/ItemPD.php:130 +#: parser-class-lib/parse/LineItemDiscount.php:49 +#: parser-class-lib/parse/Void.php:82 parser-class-lib/parse/Void.php:227 +#: parser-class-lib/parse/ItemPD.php:64 parser-class-lib/parse/ItemPD.php:130 +#: parser-class-lib/parse/LineItemDiscount.php:49 +msgid "Item not found" +msgstr "" + +#: parser-class-lib/parse/Void.php:245 parser-class-lib/parse/Void.php:245 +msgid "Items already voided" +msgstr "" + +#: parser-class-lib/parse/Void.php:246 parser-class-lib/parse/Void.php:246 +msgid "tare weight cannot be greater than item weight" +msgstr "Tare weight cannot be greater than item weight" + +#: parser-class-lib/parse/Void.php:248 parser-class-lib/parse/Void.php:253 +#: parser-class-lib/parse/Void.php:248 parser-class-lib/parse/Void.php:253 +msgid "Void request exceeds" +msgstr "" + +#: parser-class-lib/parse/Void.php:248 parser-class-lib/parse/Void.php:248 +msgid "weight of item rung in" +msgstr "" + +#: parser-class-lib/parse/Void.php:249 parser-class-lib/parse/Void.php:249 +#, php-format +msgid "You can void up to %.2f lb" +msgstr "" + +#: parser-class-lib/parse/Void.php:253 parser-class-lib/parse/Void.php:253 +msgid "number of items rung in" +msgstr "" + +#: parser-class-lib/parse/Void.php:254 parser-class-lib/parse/Void.php:254 +#, php-format +msgid "You can void up to %d" +msgstr "" + +#: parser-class-lib/parse/Void.php:382 parser-class-lib/parse/Void.php:386 +#: parser-class-lib/parse/ClubCard.php:76 +#: parser-class-lib/parse/ClubCard.php:78 parser-class-lib/parse/Void.php:382 +#: parser-class-lib/parse/Void.php:386 parser-class-lib/parse/ClubCard.php:76 +#: parser-class-lib/parse/ClubCard.php:78 +msgid "Item already paid for" +msgstr "" + +#: parser-class-lib/parse/DiscountApplied.php:36 +#: parser-class-lib/parse/StackableDiscount.php:34 +#: parser-class-lib/parse/DiscountApplied.php:36 +#: parser-class-lib/parse/StackableDiscount.php:34 +msgid "discount not applicable after tender" +msgstr "Discount not applicable after tender" + +#: parser-class-lib/parse/DiscountApplied.php:38 +#: parser-class-lib/parse/StackableDiscount.php:36 +#: parser-class-lib/parse/DiscountApplied.php:38 +#: parser-class-lib/parse/StackableDiscount.php:36 +msgid "discount exceeds maximum" +msgstr "Discount exceeds maximum" + +#: parser-class-lib/parse/DiscountApplied.php:40 +#: parser-class-lib/parse/StackableDiscount.php:38 +#: parser-class-lib/parse/DiscountApplied.php:40 +#: parser-class-lib/parse/StackableDiscount.php:38 +msgid "discount must be greater than zero" +msgstr "Discount must be greater than zero" + +#: parser-class-lib/parse/DiscountApplied.php:42 +#: parser-class-lib/parse/DiscountApplied.php:42 +msgid "Staff discount not applicable" +msgstr "" + +#: parser-class-lib/parse/DiscountApplied.php:44 +#: parser-class-lib/parse/DiscountApplied.php:44 +msgid "Member discount not applicable" +msgstr "" + +#: parser-class-lib/parse/UPC.php:51 parser-class-lib/parse/DeptKey.php:62 +#: parser-class-lib/parse/UPC.php:51 parser-class-lib/parse/DeptKey.php:62 +msgid "Login to issue refund" +msgstr "" + +#: parser-class-lib/parse/ClubCard.php:70 +#: parser-class-lib/parse/ClubCard.php:70 +msgid "Discount already taken" +msgstr "" + +#: parser-class-lib/parse/ClubCard.php:74 +#: parser-class-lib/parse/ClubCard.php:74 +msgid "Item cannot be discounted" +msgstr "" + +#: parser-class-lib/parse/CaseDiscMsgs.php:38 +#: parser-class-lib/parse/CaseDiscMsgs.php:38 +#, php-format +msgid "% case discount invalid" +msgstr "" + +#: parser-class-lib/parse/CaseDiscMsgs.php:40 +#: parser-class-lib/parse/CaseDiscMsgs.php:40 +msgid "case discount not applicable to staff" +msgstr "Case discount not applicable to staff" + +#: parser-class-lib/parse/CaseDiscMsgs.php:42 +#: parser-class-lib/parse/CaseDiscMsgs.php:42 +msgid "hit 10% key to apply case discount for member" +msgstr "Hit 10% key to apply case discount for member" + +#: parser-class-lib/parse/LineItemDiscount.php:55 +#: parser-class-lib/parse/LineItemDiscount.php:55 +msgid "Line is not discountable" +msgstr "" + +#: parser-class-lib/parse/LineItemDiscount.php:61 +#: parser-class-lib/parse/LineItemDiscount.php:61 +msgid "Item already discounted" +msgstr "" + +#: parser-class-lib/parse/AutoTare.php:43 +#: parser-class-lib/parse/AutoTare.php:43 +msgid "tare not supported" +msgstr "Tare not supported" + +#: parser-class-lib/parse/AutoTare.php:45 +#: parser-class-lib/parse/AutoTare.php:45 +msgid "Tare cannot be" +msgstr "" + +#: parser-class-lib/parse/AutoTare.php:45 +#: parser-class-lib/parse/AutoTare.php:45 +msgid "greater than item weight" +msgstr "" + +#: gui-modules/nslogin.php:34 gui-modules/nslogin.php:34 +msgid "enter manager password" +msgstr "Enter manager password" + +#: gui-modules/nslogin.php:35 gui-modules/nslogin.php:35 +msgid "confirm no sales" +msgstr "Confirm no sales" + +#: gui-modules/nslogin.php:48 gui-modules/mgrlogin.php:116 +#: gui-modules/nslogin.php:48 gui-modules/mgrlogin.php:116 +msgid "re-enter manager password" +msgstr "Re-enter manager password" + +#: gui-modules/nslogin.php:49 gui-modules/nslogin.php:49 +msgid "invalid password" +msgstr "Invalid password" + +#: gui-modules/adminlogin.php:40 gui-modules/adminlogin.php:40 +msgid "enter admin password" +msgstr "Enter admin password" + +#: gui-modules/adminlogin.php:54 gui-modules/adminlogin.php:71 +#: gui-modules/adminlogin.php:54 gui-modules/adminlogin.php:71 +msgid "re-enter admin password" +msgstr "Re-enter admin password" + +#: gui-modules/memlist.php:171 gui-modules/memlist.php:171 +msgid "member search" +msgstr "Member Search" + +#: gui-modules/memlist.php:171 gui-modules/memlist.php:171 +msgid "enter member number or name" +msgstr "Enter member number or name" + +#: gui-modules/memlist.php:173 gui-modules/productlist.php:148 +#: gui-modules/memlist.php:173 gui-modules/productlist.php:148 +msgid "no match found" +msgstr "No match found" + +#: gui-modules/memlist.php:173 gui-modules/memlist.php:173 +msgid "next search or member number" +msgstr "Next search or member number" + +#: gui-modules/memlist.php:205 gui-modules/rplist.php:103 +#: gui-modules/suspendedlist.php:130 gui-modules/memlist.php:205 +#: gui-modules/rplist.php:103 gui-modules/suspendedlist.php:130 +msgid "use arrow keys to navigate" +msgstr "Use arrow keys to navigate" + +#: gui-modules/login2.php:35 gui-modules/login2.php:35 +msgid "please enter your password" +msgstr "Please enter your password" + +#: gui-modules/login2.php:48 gui-modules/login3.php:49 +#: gui-modules/login2.php:48 gui-modules/login3.php:49 +msgid "password invalid, please re-enter" +msgstr "Password invalid, please re-enter" + +#: gui-modules/login2.php:76 gui-modules/login2.php:76 +msgid "W E L C O M E" +msgstr "" + +#: gui-modules/login2.php:80 gui-modules/login2.php:80 +msgid "log in" +msgstr "Log In" + +#: gui-modules/login2.php:91 gui-modules/login2.php:91 +msgid "EXIT" +msgstr "" + +#: gui-modules/login3.php:37 gui-modules/login3.php:37 +msgid "please enter password" +msgstr "Please enter password" + +#: gui-modules/qtty2.php:35 gui-modules/qtty2.php:35 +msgid "quantity required" +msgstr "Quantity required" + +#: gui-modules/qtty2.php:62 gui-modules/qtty2.php:62 +msgid "invalid quantity" +msgstr "Invalid quantity" + +#: gui-modules/qtty2.php:78 gui-modules/qtty2.php:78 +msgid "enter number or clear to cancel" +msgstr "Enter number or [clear] to cancel" + +#: gui-modules/productlist.php:148 gui-modules/productlist.php:148 +msgid "next search or enter upc" +msgstr "Next search or enter UPC" + +#: gui-modules/rplist.php:104 gui-modules/rplist.php:104 +msgid "enter to reprint receipt" +msgstr "Enter to reprint receipt" + +#: gui-modules/mgrlogin.php:92 gui-modules/mgrlogin.php:92 +msgid "confirm cancellation" +msgstr "Confirm cancellation" + +#: gui-modules/mgrlogin.php:100 gui-modules/mgrlogin.php:100 +msgid "please enter manager password" +msgstr "Please enter manager password" + +#: gui-modules/mgrlogin.php:115 gui-modules/mgrlogin.php:115 +msgid "password invalid" +msgstr "Password Invalid" + +#: gui-modules/adminlist.php:116 gui-modules/adminlist.php:116 +msgid "administrative tasks" +msgstr "Administrative Tasks" + +#: gui-modules/adminlist.php:121 gui-modules/adminlist.php:121 +msgid "Suspend Transaction" +msgstr "" + +#: gui-modules/adminlist.php:122 gui-modules/adminlist.php:122 +msgid "Resume Transaction" +msgstr "" + +#: gui-modules/adminlist.php:123 gui-modules/adminlist.php:123 +msgid "Tender Reports" +msgstr "" + +#: gui-class-lib/BasicPage.php:220 gui-class-lib/BasicPage.php:304 +#: gui-class-lib/BasicPage.php:220 gui-class-lib/BasicPage.php:304 +msgid "training" +msgstr "" + +#: gui-class-lib/BasicPage.php:339 gui-class-lib/BasicPage.php:339 +msgid "weight" +msgstr "" + +#: lib/Tenders/CheckTender.php:37 lib/Tenders/CheckTender.php:37 +msgid "member or staff check tender cannot exceed total purchase by over $" +msgstr "Member or staff check tender cannot exceed total purchase by over $" diff --git a/pos/is4c-nf/locale/pos-nf_en_US.po b/pos/is4c-nf/locale/pos-nf_en_US.po new file mode 100644 index 000000000..ff1e2e020 --- /dev/null +++ b/pos/is4c-nf/locale/pos-nf_en_US.po @@ -0,0 +1,717 @@ +# English translations for is package. +# Copyright (C) 2012 THE is'S COPYRIGHT HOLDER +# This file is distributed under the same license as the is package. +# Andy Theuninck <andy@wholefoods.coop>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: is 4c-nf\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-28 15:31-0500\n" +"PO-Revision-Date: 2012-06-28 12:42-0500\n" +"Last-Translator: Andy Theuninck <andy@wholefoods.coop>\n" +"Language-Team: English\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/PrehLib.php:322 parser-class-lib/parse/SimpleTender.php:49 +#: parser-class-lib/parse/SimpleTender.php:70 +#: parser-class-lib/parse/SimpleTender.php:104 +#: parser-class-lib/parse/SimpleTender.php:114 gui-modules/adminlist.php:41 +#: lib/Tenders/TenderModule.php:81 parser-class-lib/parse/TenderOut.php:35 +msgid "no transaction in progress" +msgstr "No transction in progress" + +#: lib/PrehLib.php:330 +msgid "WIC tender not applicable" +msgstr "" + +#: lib/PrehLib.php:334 +msgid "" +"member or staff check tender cannot \n" +"\t\t\texceed total purchase by over $" +msgstr "Member or staff check tender cannot exceed total purchase by over $" + +#: lib/PrehLib.php:339 lib/Tenders/GiftCardTender.php:38 +#: lib/Tenders/CreditCardTender.php:38 +msgid "tender cannot exceed purchase amount" +msgstr "Tender cannot exceed purchase amount" + +#: lib/PrehLib.php:343 lib/Tenders/FoodstampTender.php:40 +msgid "no cash back with EBT cash tender" +msgstr "No cash back with EBT cash tender" + +#: lib/PrehLib.php:347 lib/Tenders/CheckTender.php:41 +#: lib/Tenders/CheckTender.php:40 +msgid "non-member check tender cannot exceed total purchase by over $5.00" +msgstr "Non-member check tender cannot exceed total purchase by over $5.00" + +#: lib/PrehLib.php:375 lib/Tenders/TenderModule.php:87 +msgid "transaction must be totaled before tender can be accepted" +msgstr "Transaction must be totaled before tender can be accepted" + +#: lib/PrehLib.php:379 lib/Tenders/FoodstampTender.php:37 +msgid "eligible amount must be totaled before foodstamp tender can be accepted" +msgstr "" +"Eligible amount must be totaled before foodstamp tender can be accepted" + +#: lib/PrehLib.php:383 lib/Tenders/FoodstampTender.php:43 +msgid "Foodstamp tender cannot exceed eligible amount by over $10.00" +msgstr "Foodstamp tender cannot exceed eligible amount by over $10.00" + +#: lib/PrehLib.php:396 +msgid "is overlimit" +msgstr "is overlimit" + +#: lib/PrehLib.php:400 parser-class-lib/parse/SimpleTender.php:122 +msgid "is not authorized to make employee charges" +msgstr "is not authorized to make employee charges" + +#: lib/PrehLib.php:404 +msgid "has exceeded charge limit" +msgstr "" + +#: lib/PrehLib.php:414 lib/Tenders/StoreChargeTender.php:51 +msgid "charge tender exceeds purchase amount" +msgstr "Charge tender exceeds purchase amount" + +#: lib/PrehLib.php:443 +msgid "" +"WFC no longer excepts paper foods stamps. Please choose a different tender " +"type" +msgstr "" + +#: lib/PrehLib.php:448 +msgid "is greater than coupon limit" +msgstr "" + +#: lib/PrehLib.php:449 lib/PrehLib.php:456 lib/PrehLib.php:855 +#: lib/PrehLib.php:860 parser-class-lib/parse/UPC.php:135 +#: parser-class-lib/parse/UPC.php:261 parser-class-lib/parse/UPC.php:274 +#: parser-class-lib/parse/SimpleTender.php:80 lib/Tenders/TenderModule.php:105 +#: lib/Tenders/CheckTender.php:63 lib/Tenders/GiftCertificateTender.php:55 +#: gui-modules/memlist.php:205 gui-modules/deptlist.php:123 +#: gui-modules/productlist.php:180 gui-modules/rplist.php:105 +#: gui-modules/suspendedlist.php:130 gui-modules/tenderlist.php:124 +#: gui-modules/adminlist.php:126 lib/Tenders/CheckTender.php:62 +msgid "clear to cancel" +msgstr "[clear] to cancel" + +#: lib/PrehLib.php:449 lib/PrehLib.php:456 lib/PrehLib.php:855 +#: lib/PrehLib.php:860 lib/Tenders/TenderModule.php:105 +msgid "enter to proceed" +msgstr "[enter] to proceed" + +#: lib/PrehLib.php:454 +msgid "is greater than tender limit" +msgstr "" + +#: lib/PrehLib.php:662 +msgid "tender is misconfigured" +msgstr "Tender is misconfigured" + +#: lib/PrehLib.php:776 +#, fuzzy +msgid "department unknown" +msgstr "Input unknown" + +#: lib/PrehLib.php:791 +msgid "no item found in" +msgstr "No item found in" + +#: lib/PrehLib.php:797 +msgid "coupon amount greater than department total" +msgstr "Coupon amount greater than department total" + +#: lib/PrehLib.php:854 +msgid "is greater than department limit" +msgstr "" + +#: lib/PrehLib.php:859 +msgid "is lower than department minimum" +msgstr "" + +#: lib/DisplayLib.php:339 test.php:7 +msgid "input unknown" +msgstr "Input unknown" + +#: parser-class-lib/parse/UPC.php:110 +msgid "is not a valid item" +msgstr "" + +#: parser-class-lib/parse/UPC.php:134 +msgid "Item not for sale" +msgstr "" + +#: parser-class-lib/parse/UPC.php:135 +msgid "enter to continue sale" +msgstr "[enter] to continue sale" + +#: parser-class-lib/parse/UPC.php:162 +msgid "product cannot be sold right now" +msgstr "product cannot be sold right now" + +#: parser-class-lib/parse/UPC.php:198 +msgid "Claims to be more than $100,000" +msgstr "" + +#: parser-class-lib/parse/UPC.php:211 +msgid "please put item on scale" +msgstr "Please put item on scale" + +#: parser-class-lib/parse/UPC.php:227 +msgid "item weight must be greater than tare weight" +msgstr "Item weight must be greater than tare weight" + +#: parser-class-lib/parse/UPC.php:235 +msgid "fractional quantity cannot be accepted for this item" +msgstr "Fractional quantity cannot be accepted for this item" + +#: parser-class-lib/parse/UPC.php:260 +msgid "insert document" +msgstr "Insert document" + +#: parser-class-lib/parse/UPC.php:260 parser-class-lib/parse/UPC.php:273 +#: parser-class-lib/parse/SimpleTender.php:80 lib/Tenders/CheckTender.php:62 +#: lib/Tenders/GiftCertificateTender.php:54 lib/Tenders/CheckTender.php:61 +msgid "press enter to endorse" +msgstr "Press [enter] to endorse" + +#: parser-class-lib/parse/UPC.php:273 +msgid "insert form" +msgstr "Insert form" + +#: parser-class-lib/parse/SimpleTender.php:38 +msgid "EBT tender must specify amount" +msgstr "" + +#: parser-class-lib/parse/SimpleTender.php:62 +#: parser-class-lib/parse/SimpleTender.php:95 +#: parser-class-lib/parse/SimpleTender.php:108 +#: parser-class-lib/parse/Steering.php:178 +msgid "transaction must be totaled" +msgstr "Transaction must be totaled" + +#: parser-class-lib/parse/SimpleTender.php:63 +#: parser-class-lib/parse/SimpleTender.php:96 +#: parser-class-lib/parse/SimpleTender.php:109 +#: parser-class-lib/parse/Steering.php:179 +msgid "before tender can be accepted" +msgstr "" + +#: gui-modules/suspendedlist.php:100 gui-modules/adminlist.php:68 +msgid "no suspended transaction" +msgstr "No suspended transaction" + +#: gui-modules/adminlist.php:64 +msgid "transaction in progress" +msgstr "Transaction in progress" + +#: lib/FooterBoxes/EveryoneSales.php:30 +msgid "Special" +msgstr "" + +#: lib/FooterBoxes/SavedOrCouldHave.php:32 +msgid "You Saved" +msgstr "" + +#: lib/FooterBoxes/SavedOrCouldHave.php:34 +msgid "Could Have Saved" +msgstr "" + +#: lib/FooterBoxes/TransPercentDiscount.php:32 +#: lib/FooterBoxes/TransPercentDiscount.php:34 +msgid "% Discount" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:34 +msgid "fs Amount Due" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:38 +msgid "Amount Due" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:43 +msgid "Change" +msgstr "" + +#: lib/FooterBoxes/MultiTotal.php:47 +msgid "Total" +msgstr "" + +#: lib/FooterBoxes/MemSales.php:30 +msgid "Mbr Special" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:66 +msgid "coupon not found" +msgstr "Coupon not found" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:72 +msgid "coupon expired" +msgstr "Coupon expired" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:87 +msgid "coupon already applied" +msgstr "Coupon already applied" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:96 +msgid "Member only coupon" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:97 +msgid "Apply member number first" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:108 +msgid "Coupon already used" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:109 +msgid "on this membership" +msgstr "" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:129 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:145 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:161 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:177 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:208 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:218 +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:228 +msgid "coupon requirements not met" +msgstr "Coupon requirements not met" + +#: lib/Scanning/SpecialUPCs/HouseCoupon.php:236 +msgid "unknown minimum type" +msgstr "Unknown minimum type" + +#: lib/Scanning/SpecialUPCs/SpecialOrder.php:57 +msgid "Not a valid order" +msgstr "" + +#: lib/Scanning/SpecialUPCs/SpecialOrder.php:71 +msgid "Order not found" +msgstr "" + +#: lib/Scanning/SpecialUPCs/MemberCard.php:52 +msgid "Card not assigned" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:69 +#, fuzzy +msgid "coupon type unknown" +msgstr "Input unknown" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:69 +#, fuzzy +msgid "enter coupon manually" +msgstr "[enter] to continue sale" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:136 +msgid "product not found" +msgstr "Product not found" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:136 +#, fuzzy +msgid "in transaction" +msgstr "No suspended transaction" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:164 +msgid "Coupon already applied" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:164 +msgid "for this item" +msgstr "" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:170 +#, php-format +msgid "coupon requires %d items" +msgstr "Coupon requires %d items" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:171 +#, php-format +msgid "there are only %d item(s)" +msgstr "There are only %d item(s)" + +#: lib/Scanning/SpecialUPCs/CouponCode.php:171 +#, fuzzy +msgid "in this transaction" +msgstr "No suspended transaction" + +#: lib/DisplayLib.php:365 +msgid "M E M B E R" +msgstr "" + +#: lib/DisplayLib.php:371 +msgid "C A S H I E R" +msgstr "" + +#: lib/SuspendLib.php:59 +#, fuzzy +msgid "transaction suspended" +msgstr "Transaction must be totaled" + +#: lib/Tenders/StoreChargeTender.php:39 lib/Tenders/StoreChargeTender.php:43 +msgid "member" +msgstr "Member" + +#: lib/Tenders/StoreChargeTender.php:40 +msgid "is not authorized" +msgstr "" + +#: lib/Tenders/StoreChargeTender.php:40 +msgid "to make charges" +msgstr "" + +#: lib/Tenders/StoreChargeTender.php:43 +#, fuzzy +msgid "is over limit" +msgstr "is overlimit" + +#: lib/Tenders/StoreChargeTender.php:48 +msgid "available balance for charge" +msgstr "Available balance for charge" + +#: lib/Tenders/StoreChargeTender.php:48 +msgid "is only $" +msgstr "" + +#: lib/Tenders/DisabledTender.php:34 +msgid "tender disabled" +msgstr "Tender disabled" + +#: lib/Tenders/TenderModule.php:84 +msgid "tender amount of" +msgstr "Tender amount of" + +#: lib/Tenders/TenderModule.php:84 +msgid "exceeds allowable limit" +msgstr "" + +#: lib/Tenders/TenderModule.php:103 +msgid "is greater than tender limit for" +msgstr "" + +#: lib/Tenders/CheckTender.php:62 lib/Tenders/GiftCertificateTender.php:54 +#: lib/Tenders/CheckTender.php:61 +#, fuzzy +msgid "insert" +msgstr "Insert form" + +#: lib/Tenders/StoreTransferTender.php:39 +#, fuzzy +msgid "store transfer exceeds purchase amount" +msgstr "Charge tender exceeds purchase amount" + +#: lib/Tenders/StoreTransferTender.php:55 +msgid "Login for store transfer" +msgstr "" + +#: parser-class-lib/parse/BalanceCheck.php:36 +msgid "Member" +msgstr "" + +#: parser-class-lib/parse/BalanceCheck.php:37 +msgid "Current AR balance is" +msgstr "" + +#: parser-class-lib/parse/BalanceCheck.php:38 +msgid "Available AR balance is" +msgstr "" + +#: parser-class-lib/parse/Steering.php:76 +#, fuzzy +msgid "Login to void transactions" +msgstr "No suspended transaction" + +#: parser-class-lib/parse/Steering.php:92 +#, fuzzy +msgid "Login to suspend/resume transactions" +msgstr "No suspended transaction" + +#: parser-class-lib/parse/Steering.php:134 +#: parser-class-lib/parse/Steering.php:147 +#, fuzzy +msgid "Transaction in Progress" +msgstr "Transaction in progress" + +#: parser-class-lib/parse/Steering.php:169 gui-modules/mgrlogin.php:154 +#, fuzzy +msgid "transaction cancelled" +msgstr "Transaction must be totaled" + +#: parser-class-lib/parse/Steering.php:187 +msgid "Login to alter price" +msgstr "" + +#: parser-class-lib/parse/Steering.php:200 +msgid "processor error" +msgstr "Processor error" + +#: parser-class-lib/parse/Void.php:37 parser-class-lib/parse/ItemPD.php:35 +msgid "No Item on Order" +msgstr "" + +#: parser-class-lib/parse/Void.php:47 +msgid "Cannot void this entry" +msgstr "" + +#: parser-class-lib/parse/Void.php:54 parser-class-lib/parse/Void.php:88 +#: parser-class-lib/parse/Void.php:244 +msgid "Item already voided" +msgstr "" + +#: parser-class-lib/parse/Void.php:82 parser-class-lib/parse/Void.php:227 +#: parser-class-lib/parse/ItemPD.php:64 parser-class-lib/parse/ItemPD.php:130 +#: parser-class-lib/parse/LineItemDiscount.php:49 +#, fuzzy +msgid "Item not found" +msgstr "No item found in" + +#: parser-class-lib/parse/Void.php:245 +msgid "Items already voided" +msgstr "" + +#: parser-class-lib/parse/Void.php:246 +#, fuzzy +msgid "tare weight cannot be greater than item weight" +msgstr "Item weight must be greater than tare weight" + +#: parser-class-lib/parse/Void.php:248 parser-class-lib/parse/Void.php:253 +msgid "Void request exceeds" +msgstr "" + +#: parser-class-lib/parse/Void.php:248 +#, fuzzy +msgid "weight of item rung in" +msgstr "No item found in" + +#: parser-class-lib/parse/Void.php:249 +#, php-format +msgid "You can void up to %.2f lb" +msgstr "" + +#: parser-class-lib/parse/Void.php:253 +#, fuzzy +msgid "number of items rung in" +msgstr "No item found in" + +#: parser-class-lib/parse/Void.php:254 +#, php-format +msgid "You can void up to %d" +msgstr "" + +#: parser-class-lib/parse/Void.php:382 parser-class-lib/parse/Void.php:386 +#: parser-class-lib/parse/ClubCard.php:76 +#: parser-class-lib/parse/ClubCard.php:78 +msgid "Item already paid for" +msgstr "" + +#: parser-class-lib/parse/DiscountApplied.php:36 +#: parser-class-lib/parse/StackableDiscount.php:34 +msgid "discount not applicable after tender" +msgstr "Discount not applicable after tender" + +#: parser-class-lib/parse/DiscountApplied.php:38 +#: parser-class-lib/parse/StackableDiscount.php:36 +msgid "discount exceeds maximum" +msgstr "Discount exceeds maximum" + +#: parser-class-lib/parse/DiscountApplied.php:40 +#: parser-class-lib/parse/StackableDiscount.php:38 +#, fuzzy +msgid "discount must be greater than zero" +msgstr "Coupon amount greater than department total" + +#: parser-class-lib/parse/DiscountApplied.php:42 +msgid "Staff discount not applicable" +msgstr "" + +#: parser-class-lib/parse/DiscountApplied.php:44 +msgid "Member discount not applicable" +msgstr "" + +#: parser-class-lib/parse/UPC.php:51 parser-class-lib/parse/DeptKey.php:62 +msgid "Login to issue refund" +msgstr "" + +#: parser-class-lib/parse/ClubCard.php:70 +msgid "Discount already taken" +msgstr "" + +#: parser-class-lib/parse/ClubCard.php:74 +msgid "Item cannot be discounted" +msgstr "" + +#: parser-class-lib/parse/CaseDiscMsgs.php:38 +#, php-format +msgid "% case discount invalid" +msgstr "" + +#: parser-class-lib/parse/CaseDiscMsgs.php:40 +msgid "case discount not applicable to staff" +msgstr "Case discount not applicable to staff" + +#: parser-class-lib/parse/CaseDiscMsgs.php:42 +msgid "hit 10% key to apply case discount for member" +msgstr "Hit 10% key to apply case discount for member" + +#: parser-class-lib/parse/LineItemDiscount.php:55 +msgid "Line is not discountable" +msgstr "" + +#: parser-class-lib/parse/LineItemDiscount.php:61 +msgid "Item already discounted" +msgstr "" + +#: parser-class-lib/parse/AutoTare.php:43 +msgid "tare not supported" +msgstr "Tare not supported" + +#: parser-class-lib/parse/AutoTare.php:45 +msgid "Tare cannot be" +msgstr "" + +#: parser-class-lib/parse/AutoTare.php:45 +#, fuzzy +msgid "greater than item weight" +msgstr "Item weight must be greater than tare weight" + +#: gui-modules/nslogin.php:34 +msgid "enter manager password" +msgstr "Enter manager password" + +#: gui-modules/nslogin.php:35 +msgid "confirm no sales" +msgstr "Confirm no sales" + +#: gui-modules/nslogin.php:48 gui-modules/mgrlogin.php:116 +msgid "re-enter manager password" +msgstr "Re-enter manager password" + +#: gui-modules/nslogin.php:49 +msgid "invalid password" +msgstr "Invalid password" + +#: gui-modules/adminlogin.php:40 +msgid "enter admin password" +msgstr "Enter admin password" + +#: gui-modules/adminlogin.php:54 gui-modules/adminlogin.php:71 +msgid "re-enter admin password" +msgstr "Re-enter admin password" + +#: gui-modules/memlist.php:171 +msgid "member search" +msgstr "Member Search" + +#: gui-modules/memlist.php:171 +msgid "enter member number or name" +msgstr "Enter member number or name" + +#: gui-modules/memlist.php:173 gui-modules/productlist.php:148 +#, fuzzy +msgid "no match found" +msgstr "No item found in" + +#: gui-modules/memlist.php:173 +msgid "next search or member number" +msgstr "Next search or member number" + +#: gui-modules/memlist.php:205 gui-modules/rplist.php:103 +#: gui-modules/suspendedlist.php:130 +msgid "use arrow keys to navigate" +msgstr "Use arrow keys to navigate" + +#: gui-modules/login2.php:35 +msgid "please enter your password" +msgstr "Please enter your password" + +#: gui-modules/login2.php:48 gui-modules/login3.php:49 +msgid "password invalid, please re-enter" +msgstr "Password invalid, please re-enter" + +#: gui-modules/login2.php:76 +msgid "W E L C O M E" +msgstr "" + +#: gui-modules/login2.php:80 +msgid "log in" +msgstr "Log In" + +#: gui-modules/login2.php:91 +msgid "EXIT" +msgstr "" + +#: gui-modules/login3.php:37 +msgid "please enter password" +msgstr "Please enter password" + +#: gui-modules/qtty2.php:35 +msgid "quantity required" +msgstr "Quantity required" + +#: gui-modules/qtty2.php:62 +msgid "invalid quantity" +msgstr "Invalid quantity" + +#: gui-modules/qtty2.php:78 +#, fuzzy +msgid "enter number or clear to cancel" +msgstr "[clear] to cancel" + +#: gui-modules/productlist.php:148 +msgid "next search or enter upc" +msgstr "Next search or enter UPC" + +#: gui-modules/rplist.php:104 +#, fuzzy +msgid "enter to reprint receipt" +msgstr "[enter] to proceed" + +#: gui-modules/mgrlogin.php:92 +msgid "confirm cancellation" +msgstr "Confirm cancellation" + +#: gui-modules/mgrlogin.php:100 +msgid "please enter manager password" +msgstr "Please enter manager password" + +#: gui-modules/mgrlogin.php:115 +msgid "password invalid" +msgstr "Password Invalid" + +#: gui-modules/adminlist.php:116 +msgid "administrative tasks" +msgstr "Administrative Tasks" + +#: gui-modules/adminlist.php:121 +#, fuzzy +msgid "Suspend Transaction" +msgstr "No suspended transaction" + +#: gui-modules/adminlist.php:122 +#, fuzzy +msgid "Resume Transaction" +msgstr "No suspended transaction" + +#: gui-modules/adminlist.php:123 +msgid "Tender Reports" +msgstr "" + +#: gui-class-lib/BasicPage.php:220 gui-class-lib/BasicPage.php:304 +msgid "training" +msgstr "" + +#: gui-class-lib/BasicPage.php:339 +msgid "weight" +msgstr "" + +#: lib/Tenders/CheckTender.php:37 +#, fuzzy +msgid "member or staff check tender cannot exceed total purchase by over $" +msgstr "Member or staff check tender cannot exceed total purchase by over $" diff --git a/pos/is4c-nf/log/.gitignore b/pos/is4c-nf/log/.gitignore new file mode 100644 index 000000000..397b4a762 --- /dev/null +++ b/pos/is4c-nf/log/.gitignore @@ -0,0 +1 @@ +*.log diff --git a/pos/is4c-nf/login.php b/pos/is4c-nf/login.php new file mode 100644 index 000000000..5ace8b0fb --- /dev/null +++ b/pos/is4c-nf/login.php @@ -0,0 +1,39 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("AutoLoader")) include("lib/AutoLoader.php"); + +$CORE_LOCAL->set("parse_chain",''); +$CORE_LOCAL->set("preparse_chain",''); + +AutoLoader::LoadMap(); + +CoreState::initiate_session(); + +if ($CORE_LOCAL->get("SessionFirstRun") == "") + $CORE_LOCAL->set("SessionFirstRun",1); + +$my_url = MiscLib::base_url(); +header("Location: {$my_url}gui-modules/login2.php"); +?> + diff --git a/pos/is4c-nf/parser-class-lib/Parser.php b/pos/is4c-nf/parser-class-lib/Parser.php new file mode 100755 index 000000000..9644ca80d --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/Parser.php @@ -0,0 +1,184 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class Parser + The base module for parsing input + + Enabled Parser modules are checked + until one matches the input. Input processing + ceases and the matching module must decide + what to do next. +*/ +class Parser { + + /** + Check whether the module handles this input + @param $str The input string + @return + - True The module handles this input. + The parse method() will be called next. + - False The module does not handle this input. + The parse method() will not be called and + processing will proceed to the next Parser module. + + */ + function check($str){ + + } + + /** + Deal with the input + @param $str The input string + @return mixed + + Parse modules a keyed array: + - main_frame If set, change page to this URL + - output HTML output to be displayed + - target Javascript selector string describing which + element should contain the output + - redraw_footer True or False. Set to True if + totals have changed. + - receipt False or string type. Print a receipt with + the given type. + - scale Update the scale display and session variables + - udpmsg False or string. Send a message to hardware + device(s) + - retry False or string. Try the input again shortly. + + The utility method default_json() provides an array + with the proper keys and sane default values. + */ + function parse($str){ + + } + + /** + A return array for parse() with proper keys + @return array + + See parse() method + */ + function default_json(){ + return array( + 'main_frame'=>false, + 'target'=>'.baseHeight', + 'output'=>false, + 'redraw_footer'=>false, + 'receipt'=>false, + 'scale'=>false, + 'udpmsg'=>false, + 'retry'=>false + ); + } + + /** + Make this module last + @return True or False + + Modules are not run in any guaranteed order. + Return True will force this module to be last. + + BE VERY VERY CAREFUL IF YOU OVERRIDE THIS. + Quantity is the last preparse module and + DefaultTender is the last parse module. Making + your own module last will break one of these + and probably make a mess. + */ + function isLast(){ + return False; + } + + /** + Make this module first + @return True or False + + Modules are not run in any guaranteed order. + Return True will force this module to be first + (or nearly first if multiple modules override + this method) + */ + function isFirst(){ + return False; + } + + /** + Display documentation + @return A string describing the module + + Ideally you should note what your module it does + and what the input format is. + */ + function doc(){ + return "Developer didn't document this module very well"; + } + + /** + Gather parse modules + @return array of Parser class names + + Scan the parse directory for module files. + Return an array of available modules. + */ + static public function get_parse_chain(){ + + $set = AutoLoader::ListModules('Parser'); + $set = array_reverse($set); + + $parse_chain = array(); + $first = ""; + foreach($set as $classname){ + $instance = new $classname(); + if ($instance->isLast()){ + array_push($parse_chain,$classname); + } + elseif ($instance->isFirst()) + $first = $classname; + else + array_unshift($parse_chain,$classname); + } + if ($first != "") + array_unshift($parse_chain,$first); + + return $parse_chain; + } + +} + +/** + @example HW_Parser.php + + check() looks for input the module can handle. In this case + the module simply watches for the string "HW". + + parse() demonstrates a couple options when the correct input + is detected. If a transaction is in progress, it displays + an error message. Otherwise, it sends the browser to + a different display script. + + N.B. the HelloWorld display module is just an example; that + file does not exist in the gui-modules directory. +*/ + + +?> diff --git a/pos/is4c-nf/parser-class-lib/PreParser.php b/pos/is4c-nf/parser-class-lib/PreParser.php new file mode 100755 index 000000000..78fd4e5df --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/PreParser.php @@ -0,0 +1,136 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class PreParser + The base module for preparsing input + + Preparse modules + are all checked for every input. These + modueles may modify the input string. + +*/ +class PreParser { + + /** + Check whether the module handles this input + @param $str The input string + @return + - True The module handles this input. + The parse method() will be called next. + - False The module does not handle this input. + The parse method() will not be called and + processing will proceed to the next Parser module. + + */ + function check($str){ + + } + + /** + Deal with the input + @param $str The input string + @return mixed + + Preparse modules should return a string. This + value will replace the input string for remaining + parsing. + + */ + function parse($str){ + + } + + /** + Make this module last + @return True or False + + Modules are not run in any guaranteed order. + Return True will force this module to be last. + + BE VERY VERY CAREFUL IF YOU OVERRIDE THIS. + Quantity is the last preparse module and + DefaultTender is the last parse module. Making + your own module last will break one of these + and probably make a mess. + */ + function isLast(){ + return False; + } + + /** + Make this module first + @return True or False + + Modules are not run in any guaranteed order. + Return True will force this module to be first + (or nearly first if multiple modules override + this method) + */ + function isFirst(){ + return False; + } + + /** + Display documentation + @return A string describing the module + + Ideally you should note what your module it does + and what the input format is. + */ + function doc(){ + return "Developer didn't document this module very well"; + } + + /** + Gather preparse modules + @return array of Parser class names + + Scan the preparse directory for module files. + Return an array of available modules. + */ + static public function get_preparse_chain(){ + + $set = AutoLoader::ListModules('PreParser'); + $set = array_reverse($set); + + $preparse_chain = array(); + $first = ""; + foreach($set as $classname){ + $instance = new $classname(); + if ($instance->isLast()) + array_push($preparse_chain,$classname); + elseif ($instance->isFirst()) + $first = $classname; + else + array_unshift($preparse_chain,$classname); + } + if ($first != "") + array_unshift($preparse_chain,$first); + + return $preparse_chain; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/AutoDeposit.php b/pos/is4c-nf/parser-class-lib/parse/AutoDeposit.php new file mode 100644 index 000000000..ae03f52aa --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/AutoDeposit.php @@ -0,0 +1,150 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + * This class is a bit of a hack + * It doesn't change the input string and it relies on + * quantity, so it doesn't belong in the first parse chain + * + * It also isn't a stopping point, so it ALWAYS returns false + * If the correct UPC is being parsed, the matching deposit gets + * added on. + * + * MUST preceed UPC in the 2nd parse chain + */ +class AutoDeposit extends Parser { + function check($str){ + return False; + if (ltrim($str,"0") == "1090"){ + $this->process("0000000001091"); + } + elseif (ltrim($str,"0") == "1031" || + ltrim($str,"0") == "1032" || + ltrim($str,"0") == "1033" || + ltrim($str,"0") == "1034"){ + $this->process("0000009999905"); + } + return False; + } + + // add the item. This extremely abbreviated version + // of UPC only handles a few things: quantity, price + // tax/foodstamp, discountable, and department + function process($upc){ + global $CORE_LOCAL; + + $db = Database::pDataConnect(); + $query = "select description,scale,tax,foodstamp,discounttype, + discount,department,normal_price + from products where upc='".$upc."'"; + $result = $db->query($query); + + if ($db->num_rows($result) <= 0) return; + + $row = $db->fetch_array($result); + + $description = $row["description"]; + $description = str_replace("'", "", $description); + $description = str_replace(",", "", $description); + + $scale = 0; + if ($row["scale"] != 0) $scale = 1; + + $tax = 0; + if ($row["tax"] > 0 && $CORE_LOCAL->get("toggletax") == 0) $tax = $row["tax"]; + elseif ($row["tax"] > 0 && $CORE_LOCAL->get("toggletax") == 1) { + $tax = 0; + $CORE_LOCAL->set("toggletax",0); + } + elseif ($row["tax"] == 0 && $CORE_LOCAL->get("toggletax") == 1) { + $tax = 1; + $CORE_LOCAL->set("toggletax",0); + } + + $foodstamp = 0; + if ($row["foodstamp"] != 0 && $CORE_LOCAL->get("togglefoodstamp") == 0) $foodstamp = 1; + elseif ($row["foodstamp"] != 0 && $CORE_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = 0; + $CORE_LOCAL->set("togglefoodstamp",0); + } + elseif ($row["foodstamp"] == 0 && $CORE_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = 1; + $CORE_LOCAL->set("togglefoodstamp",0); + } + + $discounttype = MiscLib::nullwrap($row["discounttype"]); + $discountable = $row["discount"]; + + $quantity = 1; + if ($CORE_LOCAL->get("quantity") != 0) $quantity = $CORE_LOCAL->get("quantity"); + + $save_refund = $CORE_LOCAL->get("refund"); + + TransRecord::addItem($upc,$description,"I"," "," ",$row["department"], + $quantity,$row["normal_price"], + $quantity*$row["normal_price"],$row["normal_price"], + $scale,$tax,$foodstamp,0,0,$discountable,$discounttype, + $quantity,0,0,0,0,0,0); + + $CORE_LOCAL->set("refund",$save_refund); + } + + function parse($str){ + return False; + } + + function isFirst(){ + return True; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>1090</td><td>Automatically add item 1091</td> + </tr> + <tr> + <td>1031</td><td>Automatically add item 9999905</td> + </tr> + <tr> + <td>1032</td><td>Automatically add item 9999905</td> + </tr> + <tr> + <td>1033</td><td>Automatically add item 9999905</td> + </tr> + <tr> + <td>1034</td><td>Automatically add item 9999905</td> + </tr> + <tr> + <td colspan=2><i> + This module is deprecated and disabled. Use the deposit field in the products table to tie deposit PLUs to items + </i></td> + </tr> + </table>"; + + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/AutoTare.php b/pos/is4c-nf/parser-class-lib/parse/AutoTare.php new file mode 100644 index 000000000..3fa8d2d4c --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/AutoTare.php @@ -0,0 +1,72 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AutoTare extends Parser { + function check($str){ + if (substr($str,-2) == "TW"){ + $left = substr($str,0,strlen($str)-2); + if ($left == "" || is_numeric($left)) + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + + $left = substr($str,0,strlen($str)-2); + if ($left == "") + $left = 1; + + if (strlen($left) > 4) + $ret['output'] = DisplayLib::boxMsg(MiscLib::truncate2($left/100)." "._("tare not supported")); + elseif ($left/100 > $CORE_LOCAL->get("weight") && $CORE_LOCAL->get("weight") > 0) + $ret['output'] = DisplayLib::boxMsg(_("Tare cannot be")."<br />"._("greater than item weight")); + else { + TransRecord::addTare($left); + $ret['output'] = DisplayLib::lastpage(); + } + + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>number</i>TW</td> + <td>Set tare weight to <i>number</i></td> + </tr> + <tr> + <td>TW</td> + <td>Set tare weight 1. Same as 1TW</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/BalanceCheck.php b/pos/is4c-nf/parser-class-lib/parse/BalanceCheck.php new file mode 100644 index 000000000..719875a9a --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/BalanceCheck.php @@ -0,0 +1,57 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class BalanceCheck extends Parser { + function check($str){ + if ($str == "BQ") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + PrehLib::chargeOk(); + $memChargeCommitted=$CORE_LOCAL->get("availBal") - $CORE_LOCAL->get("memChargeTotal"); + $ret['output'] = DisplayLib::boxMsg(_("Member")." #". $CORE_LOCAL->get("memberID")."<br />". + _("Current AR balance is")." " . $CORE_LOCAL->get("balance") . "<br />". + _("Available AR balance is")." ".$CORE_LOCAL->get("availBal"). "</b>","",True); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>BQ</td> + <td>Display store charge balance for + currently entered member</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/CaseDiscMsgs.php b/pos/is4c-nf/parser-class-lib/parse/CaseDiscMsgs.php new file mode 100644 index 000000000..92a9f48d9 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/CaseDiscMsgs.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CaseDiscMsgs extends Parser { + function check($str){ + if ($str == "cdinvalid" || + $str == "cdStaffNA" || + $str == "cdSSINA"){ + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if ($str == "cdInvalid") + $ret['output'] = DisplayLib::boxMsg($CORE_LOCAL->get("casediscount")._("% case discount invalid")); + elseif ($str == "cdStaffNA") + $ret['output'] = DisplayLib::boxMsg(_("case discount not applicable to staff")); + elseif ($str == "cdSSINA") + $ret['output'] = DisplayLib::boxMsg(_("hit 10% key to apply case discount for member")." ".$CORE_LOCAL->get("memberID")); + + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>cdInvalid</td> + <td>Display error message</td> + </tr> + <tr> + <td>cdStaffNA</td> + <td>Display error message</td> + </tr> + <tr> + <td>cdSSINA</td> + <td>Display instructional message</td> + </tr> + <tr> + <td colspan=2><i>I'm not entirely sure + what this one's for. It's just here + to reproduce original pos2.php + functionality</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/CheckKey.php b/pos/is4c-nf/parser-class-lib/parse/CheckKey.php new file mode 100644 index 000000000..394bbc5a0 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/CheckKey.php @@ -0,0 +1,75 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CheckKey extends Parser { + function check($str){ + if (strstr($str,"CQ") && strlen($str) > 3 && + substr($str,0,2) != "VD") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + + $split = explode("CQ",$str); + $tender = $split[1]; + $amt = $split[0]; + $ret = $this->default_json(); + + /** + This "if" is the new addition to trigger the + department select screen + */ + if (empty($split[1])){ + // no department specified, just amount followed by DP + + // save entered amount + $CORE_LOCAL->set("tenderTotal",$amt); + + // go to the department select screen + $ret['main_frame'] = $my_url.'gui-modules/checklist.php'; + } + + if (!$ret['main_frame']) + $ret = PrehLib::tender($split[1],$split[0]); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>amount</i>DP<i>department</i>0</td> + <td>Ring up <i>amount</i> to the specified + <i>department</i>. The trailing zero is + necessary for historical purposes</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Clear.php b/pos/is4c-nf/parser-class-lib/parse/Clear.php new file mode 100644 index 000000000..575863753 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Clear.php @@ -0,0 +1,64 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Clear extends Parser { + function check($str){ + if ($str == "CL") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("strendered",""); + $CORE_LOCAL->set("strRemembered",""); + $CORE_LOCAL->set("SNR",0); + // added by apbw 6/04/05 to correct voiding of refunded items + $CORE_LOCAL->set("refund",0); + //$CORE_LOCAL->set("autoReprint",0); + if ($CORE_LOCAL->get("tare") > 0) + TransRecord::addTare(0); + + $ret = $this->default_json(); + $ret['main_frame'] = MiscLib::base_url()."gui-modules/pos2.php"; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>CL</td> + <td>Try to clear the screen of any + messages</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/ClubCard.php b/pos/is4c-nf/parser-class-lib/parse/ClubCard.php new file mode 100644 index 000000000..f6b7971a2 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/ClubCard.php @@ -0,0 +1,111 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ClubCard extends Parser { + function check($str){ + if ($str == "50JC"){ + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $query = "select upc,description,VolSpecial,quantity, + total,discount,memDiscount,discountable, + unitPrice,scale,foodstamp,voided,discounttype, + trans_type,trans_status,department,regPrice, + tax,volume,volDiscType + from localtemptrans where + trans_id = " . $CORE_LOCAL->get("currentid"); + $connection = Database::tDataConnect(); + $result = $connection->query($query); + $num_rows = $connection->num_rows($result); + + if ($num_rows > 0) { + $row = $connection->fetch_array($result); + $strUPC = $row["upc"]; + $strDescription = $row["description"]; + $dblVolSpecial = $row["VolSpecial"]; + $dblquantity = -0.5 * $row["quantity"]; + + $dblTotal = MiscLib::truncate2(-1 * 0.5 * $row["total"]); // invoked truncate2 rounding function to fix half-penny errors apbw 3/7/05 + + $strCardNo = $CORE_LOCAL->get("memberID"); + $dblDiscount = $row["discount"]; + $dblmemDiscount = $row["memDiscount"]; + $intDiscountable = $row["discountable"]; + $dblUnitPrice = $row["unitPrice"]; + $intScale = MiscLib::nullwrap($row["scale"]); + + if ($row["foodstamp"] <> 0) { + $intFoodStamp = 1; + } else { + $intFoodStamp = 0; + } + + $intdiscounttype = MiscLib::nullwrap($row["discounttype"]); + + if ($row["voided"] == 20) { + DisplayLib::boxMsg(_("Discount already taken")); + } elseif ($row["trans_type"] == "T" or $row["trans_status"] == "D" or $row["trans_status"] == "V" or $row["trans_status"] == "C") { + DisplayLib::boxMsg("Item cannot be discounted"); + } elseif (strncasecmp($strDescription, "Club Card", 9) == 0 ) { //----- edited by abpw 2/15/05 ----- + DisplayLib::boxMsg(_("Item cannot be discounted")); + } elseif ($CORE_LOCAL->get("tenderTotal") < 0 and $intFoodStamp == 1 and (-1 * $dblTotal) > $CORE_LOCAL->get("fsEligible")) { + DisplayLib::boxMsg(_("Item already paid for")); + } elseif ($CORE_LOCAL->get("tenderTotal") < 0 and (-1 * $dblTotal) > ($CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("taxTotal"))) { + DisplayLib::boxMsg(_("Item already paid for")); + } + else { + // --- added partial item desc to club card description - apbw 2/15/05 --- + TransRecord::addItem($strUPC, "Club Card: " . substr($strDescription, 0, 19), "I", "", "J", $row["department"], $dblquantity, $dblUnitPrice, $dblTotal, 0.5 * $row["regPrice"], $intScale, $row["tax"], $intFoodStamp, $dblDiscount, $dblmemDiscount, $intDiscountable, $intdiscounttype, $dblquantity, $row["volDiscType"], $row["volume"], $dblVolSpecial, 0, 0, 0); + + $update = "update localtemptrans set voided = 20 where trans_id = " . $CORE_LOCAL->get("currentid"); + $connection = Database::tDataConnect(); + $connection->query($update); + + $CORE_LOCAL->set("TTLflag",0); + $CORE_LOCAL->set("TTLRequested",0); + + DisplayLib::lastpage(); + } + } + return False; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>50JC</td> + <td>Some kind of card special. I don't + actually use this one myself</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Comment.php b/pos/is4c-nf/parser-class-lib/parse/Comment.php new file mode 100644 index 000000000..8cf17f0e1 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Comment.php @@ -0,0 +1,58 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Comment extends Parser { + function check($str){ + if (substr($str,0,2) == "CM") + return True; + return False; + } + + function parse($str){ + $ret = $this->default_json(); + if (strlen($str) > 2){ + $comment = substr($str,2); + TransRecord::addcomment($comment); + $ret['output'] = DisplayLib::lastpage(); + } + else { + $ret['main_frame'] = MiscLib::base_url().'gui-modules/bigComment.php'; + } + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>CM<i>text</i></td> + <td>Add <i>text</i> to the transaction + as a comment line</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/DefaultTender.php b/pos/is4c-nf/parser-class-lib/parse/DefaultTender.php new file mode 100644 index 000000000..66c00f927 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/DefaultTender.php @@ -0,0 +1,115 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DefaultTender extends Parser { + + function check($str){ + if (!is_numeric(substr($str,-2)) && + is_numeric(substr($str,0,strlen($str)-2))) + return True; + elseif (strlen($str) == 2 && !is_numeric($str)){ + $db = Database::pDataConnect(); + $q = "SELECT TenderCode FROM tenders WHERE TenderCode='$str'"; + $r = $db->query($q); + if ($db->num_rows($r) > 0) + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + if (strlen($str) > 2){ + $left = substr($str,0,strlen($str)-2); + $right = substr($str,-2); + $ret = PrehLib::tender($right,$left); + return $ret; + } + else { + $ret = $this->default_json(); + + $base_object = new TenderModule($str, False); + $tender_object = 0; + $map = $CORE_LOCAL->get("TenderMap"); + if (is_array($map) && isset($map[$str])){ + $class = $map[$str]; + $tender_object = new $class($str, False); + } + + $errors = $base_object->ErrorCheck(); + if ($errors !== True){ + $ret['output'] = $errors; + return $ret; + } + + if (is_object($tender_object)){ + $errors = $tender_object->ErrorCheck(); + if ($errors !== True){ + $ret['output'] = $errors; + return $ret; + } + } + + if (is_object($tender_object) && !$tender_object->AllowDefault()){ + $ret['output'] = $tender_object->DisabledPrompt(); + return $ret; + } + elseif(is_object($tender_object) && $tender_object->AllowDefault()){ + $ret['main_frame'] = $tender_object->DefaultPrompt(); + return $ret; + } + else if ($base_object->AllowDefault()){ + $ret['main_frame'] = $base_object->DefaultPrompt(); + return $ret; + } + else { + $ret['output'] = $base_object->DisabledPrompt(); + return $ret; + } + } + } + + function isLast(){ + return True; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><b>ANYTHING</b></td> + <td>If all else fails, assume the last + two letters are a tender code and the + rest is an amount</td> + </tr> + <tr> + <td colspan=2><i>This module is last. Cashier training + can ignore this completely</i></td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/DeptKey.php b/pos/is4c-nf/parser-class-lib/parse/DeptKey.php new file mode 100644 index 000000000..8260289f3 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/DeptKey.php @@ -0,0 +1,97 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DeptKey extends Parser { + function check($str){ + if (strstr($str,"DP") && strlen($str) > 3 && + substr($str,0,2) != "VD") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + + $split = explode("DP",$str); + $dept = $split[1]; + $amt = $split[0]; + $ret = $this->default_json(); + + /** + This "if" is the new addition to trigger the + department select screen + */ + if (empty($split[1])){ + // no department specified, just amount followed by DP + + // maintain refund if needed + if ($CORE_LOCAL->get("refund")) + $amt = "RF".$amt; + + // save entered amount + $CORE_LOCAL->set("departmentAmount",$amt); + + // go to the department select screen + $ret['main_frame'] = $my_url.'gui-modules/deptlist.php'; + } + elseif ($CORE_LOCAL->get("refund")==1 && $CORE_LOCAL->get("refundComment") == ""){ + if ($CORE_LOCAL->get("SecurityRefund") > 20){ + $ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=RefundAdminLogin"; + } + else + $ret['main_frame'] = $my_url.'gui-modules/refundComment.php'; + $CORE_LOCAL->set("refundComment",$CORE_LOCAL->get("strEntered")); + } + + /* apply any appropriate special dept modules */ + $deptmods = $CORE_LOCAL->get('SpecialDeptMap'); + $index = (int)($dept/10); + if (is_array($deptmods) && isset($deptmods[$index])){ + foreach($deptmods[$index] as $mod){ + $obj = new $mod(); + $ret = $obj->handle($dept,$split[1]/100,$ret); + } + } + + if (!$ret['main_frame']) + $ret = PrehLib::deptkey($split[0],$split[1],$ret); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>amount</i>DP<i>department</i>0</td> + <td>Ring up <i>amount</i> to the specified + <i>department</i>. The trailing zero is + necessary for historical purposes</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/DiscountApplied.php b/pos/is4c-nf/parser-class-lib/parse/DiscountApplied.php new file mode 100644 index 000000000..95a213ad4 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/DiscountApplied.php @@ -0,0 +1,72 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DiscountApplied extends Parser { + var $ret; + function check($str){ + global $CORE_LOCAL; + $this->ret = $this->default_json(); + if (substr($str,-2) == "DA"){ + $strl = substr($str,0,strlen($str)-2); + if (substr($str,0,2) == "VD") + $this->ret = PrehLib::percentDiscount(0,$this->ret); + elseif (!is_numeric($strl)) + return False; + elseif ($CORE_LOCAL->get("tenderTotal") != 0) + $this->ret['output'] = DisplayLib::boxMsg(_("discount not applicable after tender")); + elseif ($strl > 50) + $this->ret['output'] = DisplayLib::boxMsg(_("discount exceeds maximum")); + elseif ($strl <= 0) + $this->ret['output'] = DisplayLib::boxMsg(_("discount must be greater than zero")); + elseif ($strl == 15 && $CORE_LOCAL->get("isStaff") == 0 && (substr($CORE_LOCAL->get("memberID"), 0, 1) != "9" || strlen($CORE_LOCAL->get("memberID")) != 6)) + $this->ret['output'] = DisplayLib::boxMsg(_("Staff discount not applicable")); + elseif ($strl == 10 && $CORE_LOCAL->get("isMember") == 0) + $this->ret['output'] = DisplayLib::boxMsg(_("Member discount not applicable")); + elseif ($strl <= 50 and $strl > 0) + $this->ret = PrehLib::percentDiscount($strl,$this->ret); + else + return False; + return True; + } + return False; + } + + function parse($str){ + return $this->ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>number</i>DA</td> + <td>Add a percent discount of the specified + amount <i>number</i></td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/DonationKey.php b/pos/is4c-nf/parser-class-lib/parse/DonationKey.php new file mode 100644 index 000000000..2d94a9fe3 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/DonationKey.php @@ -0,0 +1,64 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DonationKey extends Parser { + function check($str){ + if ($str == "RU" || substr($str,-2)=="RU") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if ($str == "RU"){ + Database::getsubtotals(); + $ttl = $CORE_LOCAL->get("amtdue"); + $next = ceil($ttl); + $amt = sprintf('%.2f',(($ttl == $next) ? 1.00 : ($next - $ttl))); + $ret = PrehLib::deptkey($amt*100, 7010, $ret); + } + else { + $amt = substr($str,0,strlen($str)-2); + $ret = PrehLib::deptkey($amt, 7010, $ret); + } + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>DONATE</td> + <td> + Round transaction up to next dollar + with open ring to donation department. + </td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/EndOfShift.php b/pos/is4c-nf/parser-class-lib/parse/EndOfShift.php new file mode 100644 index 000000000..e5b3ee454 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/EndOfShift.php @@ -0,0 +1,51 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class EndOfShift extends Parser { + function check($str){ + if ($str == "ES") + return True; + return False; + } + + function parse($str){ + $json = $this->default_json(); + return PrehLib::endofShift($json); + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>ES</td> + <td>Runs an end of shift, whatever + that is. Wedge function I think.</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/ItemPD.php b/pos/is4c-nf/parser-class-lib/parse/ItemPD.php new file mode 100644 index 000000000..a0d77aa2a --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/ItemPD.php @@ -0,0 +1,227 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ItemPD extends Parser { + function check($str){ + if (substr($str,-2) == "PD" && is_numeric(substr($str,0,strlen($str)-2))) + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if ($CORE_LOCAL->get("currentid") == 0) + $ret['output'] = DisplayLib::boxMsg(_("No Item on Order")); + else { + $str = $CORE_LOCAL->get("currentid"); + $pd = substr($str,0,strlen($str)-2); + + $ret['output'] = $this->discountitem($str,$pd); + } + if (empty($ret['output'])){ + $ret['output'] = DisplayPage::lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + } + else { + $ret['udpmsg'] = 'errorBeep'; + } + return $ret; + } + + function discountitem($item_num,$pd) { + global $CORE_LOCAL; + + if ($item_num) { + $query = "select upc, quantity, ItemQtty, foodstamp, total, voided, charflag from localtemptrans where " + ."trans_id = ".$item_num; + + $db = Database::tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) return DisplayLib::boxMsg(_("Item not found")); + else { + $row = $db->fetch_array($result); + + if (!$row["upc"] || strlen($row["upc"]) < 1 || $row['charflag'] == 'SO') + return DisplayLib::boxMsg("Not a valid item"); + else + return $this->discountupc($row["ItemQtty"]."*".$row["upc"],$item_num,$pd); + } + } + return ""; + } + + function discountupc($upc,$item_num=-1,$pd=0) { + global $CORE_LOCAL; + + $lastpageflag = 1; + $deliflag = 0; + $quantity = 0; + + if (strpos($upc, "*") && (strpos($upc, "**") || strpos($upc, "*") == 0 || + strpos($upc, "*") == strlen($upc)-1)) + $upc = "stop"; + + elseif (strpos($upc, "*")) { + + $voidupc = explode("*", $upc); + if (!is_numeric($voidupc[0])) $upc = "stop"; + else { + $quantity = $voidupc[0]; + $upc = $voidupc[1]; + $weight = 0; + + } + } + elseif (!is_numeric($upc) && !strpos($upc, "DP")) $upc = "stop"; + else { + $quantity = 1; + $weight = $CORE_LOCAL->get("weight"); + } + + $scaleprice = 0; + if (is_numeric($upc)) { + $upc = substr("0000000000000".$upc, -13); + if (substr($upc, 0, 3) == "002" && substr($upc, -5) != "00000") { + $scaleprice = substr($upc, 10, 4)/100; + $upc = substr($upc, 0, 8)."0000"; + $deliflag = 1; + } + elseif (substr($upc, 0, 3) == "002" && substr($upc, -5) == "00000") { + $deliflag = 1; + } + } + + if ($upc == "stop") return DisplayLib::inputUnknown(); + + $db = Database::tDataConnect(); + + $query = "select sum(ItemQtty) as voidable, sum(quantity) as vquantity, max(scale) as scale, " + ."max(volDiscType) as volDiscType from localtemptrans where upc = '".$upc + ."' and unitPrice = ".$scaleprice." and discounttype <> 3 group by upc"; + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + if ($num_rows == 0 ){ + return DisplayLib::boxMsg(_("Item not found").": ".$upc); + } + + $row = $db->fetch_array($result); + + if (($row["scale"] == 1) && $weight > 0) { + $quantity = $weight - $CORE_LOCAL->get("tare"); + $CORE_LOCAL->set("tare",0); + } + + $volDiscType = $row["volDiscType"]; + $voidable = MiscLib::nullwrap($row["voidable"]); + + $VolSpecial = 0; + $volume = 0; + $scale = MiscLib::nullwrap($row["scale"]); + + //----------------------Void Item------------------ + $query_upc = "select ItemQtty,foodstamp,discounttype,mixMatch,cost, + numflag,charflag,unitPrice,discounttype,regPrice,discount, + memDiscount,discountable,description,trans_type,trans_subtype, + department,tax,VolSpecial + from localtemptrans where upc = '".$upc."' and unitPrice = " + .$scaleprice." and trans_id=$item_num"; + + $result = $db->query($query_upc); + $row = $db->fetch_array($result); + + $ItemQtty = $row["ItemQtty"]; + $foodstamp = MiscLib::nullwrap($row["foodstamp"]); + $discounttype = MiscLib::nullwrap($row["discounttype"]); + $mixMatch = MiscLib::nullwrap($row["mixMatch"]); + $cost = isset($row["cost"])?-1*$row["cost"]:0; + $numflag = isset($row["numflag"])?$row["numflag"]:0; + $charflag = isset($row["charflag"])?$row["charflag"]:0; + + $unitPrice = $row["unitPrice"]; + if (($CORE_LOCAL->get("isMember") != 1 && $row["discounttype"] == 2) || + ($CORE_LOCAL->get("isStaff") == 0 && $row["discounttype"] == 4)) + $unitPrice = $row["regPrice"]; + elseif ((($CORE_LOCAL->get("isMember") == 1 && $row["discounttype"] == 2) || + ($CORE_LOCAL->get("isStaff") != 0 && $row["discounttype"] == 4)) && + ($row["unitPrice"] == $row["regPrice"])) { + $db_p = Database::pDataConnect(); + $query_p = "select special_price from products where upc = '".$upc."'"; + $result_p = $db_p->query($query_p); + $row_p = $db_p->fetch_array($result_p); + + $unitPrice = $row_p["special_price"]; + + } + + $discount = -1 * $row["discount"]; + $memDiscount = -1 * $row["memDiscount"]; + $discountable = $row["discountable"]; + + $CardNo = $CORE_LOCAL->get("memberID"); + + $discounttype = MiscLib::nullwrap($row["discounttype"]); + if ($discounttype == 3) + $quantity = -1 * $ItemQtty; + + elseif ($quantity != 0) { + TransRecord::addItem($upc, $row["description"], $row["trans_type"], $row["trans_subtype"], "V", $row["department"], $quantity, $unitPrice, $total, $row["regPrice"], $scale, $row["tax"], $foodstamp, $discount, $memDiscount, $discountable, $discounttype, $quantity, $volDiscType, $volume, $VolSpecial, $mixMatch, 0, 1, $cost, $numflag, $charflag); + + if ($row["trans_type"] != "T") { + $CORE_LOCAL->set("ttlflag",0); + } + + $db = Database::pDataConnect(); + $chk = $db->query("SELECT deposit FROM products WHERE upc='$upc'"); + if ($db->num_rows($chk) > 0){ + $dpt = array_pop($db->fetch_row($chk)); + if ($dpt > 0){ + $dupc = (int)$dpt; + return $this->voidupc((-1*$quantity)."*".$dupc,True); + } + } + } + return ""; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>VD<i>ringable</i></td> + <td>Void <i>ringable</i>, which + may be a product number or an + open department ring</td> + </tr> + </table>"; + } +} + + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/LineItemDiscount.php b/pos/is4c-nf/parser-class-lib/parse/LineItemDiscount.php new file mode 100644 index 000000000..1d9d0358e --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/LineItemDiscount.php @@ -0,0 +1,115 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class LineItemDiscount extends Parser { + + /* Parse module matches input LD */ + function check($str){ + if ($str == "LD") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + + $ret = $this->default_json(); + + // this is the currently selected item + $transID = $CORE_LOCAL->get("currentid"); + + // get info about the current item + $db = Database::tDataConnect(); + $q = "SELECT trans_type,discounttype,department,regPrice,quantity + FROM localtemptrans WHERE trans_id=".((int)$transID); + $r = $db->query($q); + + if ($db->num_rows($r) == 0){ + // this shouldn't happen unless there's some weird session problem + $ret['output'] = DisplayLib::boxMsg(_("Item not found")); + } + else { + $w = $db->fetch_row($r); + if ($w['trans_type'] != 'I' && $w['trans_type'] != 'D'){ + // only items & open rings are discountable + $ret['output'] = DisplayLib::boxMsg(_("Line is not discountable")); + } + else if ($w['discounttype'] != 0){ + // for simplicity, sale items cannot be discounted + // this also prevents using this function more than + // once on a single item + $ret['output'] = DisplayLib::boxMsg(_("Item already discounted")); + } + else { + // discount is simply the total times the + // non-member discount percentage + // total is discounted immediately using + // the non-member percentage + // memDiscount is the difference between total + // member discount and the non-member discount + // since the non-member discount is applied + // immediately + // setting discounttype=2 makes the member discount + // apply when a [valid] member number is entered + $discQ = sprintf("UPDATE localtemptrans SET + discount=(regPrice * quantity * %f), + total=(total-(regPrice*quantity*%f)), + memDiscount=((regPrice*quantity*%f) - (regPrice*quantity*%f)), + discounttype=2 + WHERE trans_id=%d", + $CORE_LOCAL->get("LineItemDiscountNonMem"), + $CORE_LOCAL->get("LineItemDiscountNonMem"), + $CORE_LOCAL->get("LineItemDiscountMem"), + $CORE_LOCAL->get("LineItemDiscountNonMem"), + $transID); + $discR = $db->query($discQ); + + // add notification line for nonMem discount + TransRecord::adddiscount($w['regPrice']*$w['quantity']*$CORE_LOCAL->get("LineItemDiscountNonMem"), + $w['department']); + + // footer should be redrawn since savings and totals + // have changed. Output is the list of items + $ret['redraw_footer'] = True; + $ret['output'] = DisplayLib::lastpage(); + } + } + + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>LD</td> + <td>Apply line item percent discount based on membership status</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Lock.php b/pos/is4c-nf/parser-class-lib/parse/Lock.php new file mode 100644 index 000000000..0bbe69eb2 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Lock.php @@ -0,0 +1,50 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Lock extends Parser { + function check($str){ + if ($str == "LOCK") + return True; + return False; + } + + function parse($str){ + $ret = $this->default_json(); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/login3.php'; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>LOCK</td> + <td>Lock the screen</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/MemberID.php b/pos/is4c-nf/parser-class-lib/parse/MemberID.php new file mode 100644 index 000000000..27cf1f359 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/MemberID.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class MemberID extends Parser { + function check($str){ + if (substr($str,-2) == "ID") + return True; + return False; + } + + function parse($str){ + if ($str == "0ID"){ + PrehLib::clearMember(); + $ret = array("main_frame"=>false, + "output"=>DisplayLib::lastpage(), + "target"=>".baseHeight", + "redraw_footer"=>true + ); + return $ret; + } + else{ + $ret = PrehLib::memberID(substr($str,0,strlen($str)-2)); + return $ret; + } + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>number</i>ID</td> + <td>Set member <i>number</i></td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/PartialReceipt.php b/pos/is4c-nf/parser-class-lib/parse/PartialReceipt.php new file mode 100644 index 000000000..5517ac593 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/PartialReceipt.php @@ -0,0 +1,52 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PartialReceipt extends Parser { + function check($str){ + if ($str == "PP") + return True; + return False; + } + + function parse($str){ + $ret = $this->default_json(); + $ret['receipt'] = 'partial'; + $ret['output'] = DisplayLib::lastpage(); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>PP</td> + <td>Print a partial receipt</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/RRR.php b/pos/is4c-nf/parser-class-lib/parse/RRR.php new file mode 100644 index 000000000..dc55e4ffb --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/RRR.php @@ -0,0 +1,79 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class RRR extends Parser { + function check($str){ + if ($str == "RRR" || substr($str,-4)=="*RRR"){ + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + $qty = 1; + if ($str != "RRR"){ + $split = explode("*",$str); + if (!is_numeric($split[0])) return True; + $qty = $split[0]; + } + $this->add($qty); + + $ret['output'] = DisplayLib::lastpage(); + $ret['udpmsg'] = 'goodBeep'; + + Database::getsubtotals(); + if ($CORE_LOCAL->get("runningTotal") == 0){ + $CORE_LOCAL->set("End",2); + $ret['receipt'] = 'none'; + } + return $ret; + } + + // gross misuse of field! + // quantity is getting shoved into the volume special + // column so that basket-size stats aren't skewed + function add($qty) { + TransRecord::addItem("RRR", "$qty RRR DONATED", "I", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $qty, 0, 0, 0); + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>RRR</td> + <td>Add donated RRR card punch</td> + </tr> + <tr> + <td><i>number</i>*RRR</td> + <td>Add multiple donated punches</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/ScaleInput.php b/pos/is4c-nf/parser-class-lib/parse/ScaleInput.php new file mode 100644 index 000000000..a240f4bfc --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/ScaleInput.php @@ -0,0 +1,73 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ScaleInput extends Parser { + function check($str){ + if (substr($str,0,3) == "S11" || + substr($str,0,4) == "S143") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + if (substr($str,0,3) == "S11"){ + $weight = substr($str,3); + if (is_numeric($weight) || $weight < 9999){ + $CORE_LOCAL->set("scale",1); + $CORE_LOCAL->set("weight",$weight / 100); + } + } + else + $CORE_LOCAL->set("scale",0); + + $ret = $this->default_json(); + $ret['scale'] = $str; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>S11</td> + <td>Catch scale's input</td> + </tr> + <tr> + <td>S143</td> + <td>Catch scale's input</td> + </tr> + <tr> + <td colspan=2>These are so the scanner-scale + can talk to IT CORE. Users wouldn't use these + key strokes</td> + </tr> + </table>"; + + } + +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/ScrollItems.php b/pos/is4c-nf/parser-class-lib/parse/ScrollItems.php new file mode 100644 index 000000000..0248cea2e --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/ScrollItems.php @@ -0,0 +1,109 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ScrollItems extends Parser { + function check($str){ + if ($str == "U" || $str == "D") + return True; + elseif(($str[0] == "U" || $str[0] == "D") + && is_numeric(substr($str,1))) + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if ($str == "U") + $ret["output"] = DisplayLib::listitems($CORE_LOCAL->get("currenttopid"), $this->next_valid($CORE_LOCAL->get("currentid"),True)); + elseif ($str == "D") + $ret["output"] = DisplayLib::listitems($CORE_LOCAL->get("currenttopid"), $this->next_valid($CORE_LOCAL->get("currentid"),False)); + else { + $change = (int)substr($str,1); + $curID = $CORE_LOCAL->get("currenttopid"); + $newID = $CORE_LOCAL->get("currentid"); + if ($str[0] == "U") + $newID -= $change; + else + $newID += $change; + if ($newID == $curID || $newID == $curID+11) + $curID = $newID-5; + if ($curID < 1) $curID = 1; + $ret["output"] = DisplayLib::listitems($curID, $newID); + } + return $ret; + } + + /** + New function: log rows don't appear in screendisplay + so scrolling by simplying incrementing trans_id + can land on a "blank" line. It still works if you + keep scrolling but the cursor disappears from the screen. + This function finds the next visible line instead. + + @param $id the current id + @param $up bool + [True] => scroll towards top of screen + [False] => scroll towards bottom of screen + */ + function next_valid($id,$up=True){ + $db = Database::tDataConnect(); + $next = $id; + while(True){ + $prev = $next; + $next = ($up) ? $next-1 : $next+1; + if ($next <= 0) return $prev; + + $r = $db->query("SELECT MAX(trans_id) as max, + SUM(CASE WHEN trans_id=$next THEN 1 ELSE 0 END) as present + FROM screendisplay"); + if ($db->num_rows($r) == 0) return 1; + $w = $db->fetch_row($r); + if ($w['max']=='') return 1; + if ($w['present'] > 0) return $next; + if ($w['max'] <= $next) return $w['max']; + + // failsafe; shouldn't happen + if ($next > 1000) break; + } + return $id; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>U</td> + <td>Scroll up</td> + </tr> + <tr> + <td>D</td> + <td>Scroll down</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/SigTermCommands.php b/pos/is4c-nf/parser-class-lib/parse/SigTermCommands.php new file mode 100755 index 000000000..3e9339035 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/SigTermCommands.php @@ -0,0 +1,159 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class SigTermCommands extends Parser { + + var $cb_error; + + function check($str){ + global $CORE_LOCAL; + if ($str == "TERMMANUAL"){ + UdpComm::udpSend("termManual"); + $CORE_LOCAL->set("paycard_keyed",True); + return True; + } + elseif ($str == "TERMRESET" || $str == "TERMREBOOT"){ + if ($str == "TERMRESET") + UdpComm::udpSend("termReset"); + else + UdpComm::udpSend("termReboot"); + $CORE_LOCAL->set("paycard_keyed",False); + $CORE_LOCAL->set("CachePanEncBlock",""); + $CORE_LOCAL->set("CachePinEncBlock",""); + $CORE_LOCAL->set("CacheCardType",""); + $CORE_LOCAL->set("CacheCardCashBack",0); + $CORE_LOCAL->set('ccTermState','swipe'); + return True; + } + elseif ($str == "CCFROMCACHE"){ + return True; + } + else if (substr($str,0,9) == "PANCACHE:"){ + $CORE_LOCAL->set("CachePanEncBlock",substr($str,9)); + $CORE_LOCAL->set('ccTermState','type'); + return True; + } + else if (substr($str,0,9) == "PINCACHE:"){ + $CORE_LOCAL->set("CachePinEncBlock",substr($str,9)); + $CORE_LOCAL->set('ccTermState','ready'); + return True; + } + else if (substr($str,0,6) == "VAUTH:"){ + $CORE_LOCAL->set("paycard_voiceauthcode",substr($str,6)); + return True; + } + else if (substr($str,0,8) == "EBTAUTH:"){ + $CORE_LOCAL->set("ebt_authcode",substr($str,8)); + return True; + } + else if (substr($str,0,5) == "EBTV:"){ + $CORE_LOCAL->set("ebt_vnum",substr($str,5)); + return True; + } + else if ($str == "TERMCLEARALL"){ + $CORE_LOCAL->set("CachePanEncBlock",""); + $CORE_LOCAL->set("CachePinEncBlock",""); + $CORE_LOCAL->set("CacheCardType",""); + $CORE_LOCAL->set("CacheCardCashBack",0); + return True; + } + else if (substr($str,0,5) == "TERM:"){ + $CORE_LOCAL->set("CacheCardType",substr($str,5)); + switch($CORE_LOCAL->get('CacheCardType')){ + case 'CREDIT': + $CORE_LOCAL->set('ccTermState','ready'); + break; + case 'DEBIT': + $CORE_LOCAL->set('ccTermState','cashback'); + break; + case 'EBTFOOD': + $CORE_LOCAL->set('ccTermState','pin'); + break; + case 'EBTCASH': + $CORE_LOCAL->set('ccTermState','cashback'); + break; + } + return True; + } + else if (substr($str,0,7) == "TERMCB:"){ + $cashback = substr($str,7); + if ($cashback <= 40){ + $this->cb_error = False; + $CORE_LOCAL->set("CacheCardCashBack",$cashback); + } + else { + $this->cb_error = True; + } + $CORE_LOCAL->set('ccTermState','pin'); + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + $ret['scale'] = ''; // redraw righthand column + if ($str == "CCFROMCACHE"){ + $ret['retry'] = $CORE_LOCAL->get("CachePanEncBlock"); + } + if ($this->cb_error){ + $CORE_LOCAL->set('boxMsg','Warning: Invalid cash back<br /> + selection ignored'); + $ret['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + } + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>TERMMANUAL</td> + <td> + Send CC terminal to manual entry mode + </td> + </tr> + <tr> + <td>TERMRESET</td> + <td>Reset CC terminal to begin transaction</td> + </tr> + <tr> + <td>CCFROMCACHE</td> + <td>Charge the card cached earlier</td> + </tr> + <tr> + <td>PANCACHE:<encrypted block></td> + <td>Cache an encrypted block on swipe</td> + </tr> + <tr> + <td>PINCACHE:<encrypted block></td> + <td>Cache an encrypted block on PIN entry</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/SimpleTender.php b/pos/is4c-nf/parser-class-lib/parse/SimpleTender.php new file mode 100644 index 000000000..b4bf87f17 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/SimpleTender.php @@ -0,0 +1,172 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + 13Aug13 - AT + + Disabling this parser. The TenderModule system now has a notion of + allowing default amounts and prompting for confirmation. There's no + good reason to have two Parsers that do essentially the same thing + and duplicate a bunch of common code +*/ + +class SimpleTender extends Parser { + var $stored_ret; + function check($str){ + // on purpose. deprecated + return False; + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + $this->stored_ret = $this->default_json(); + switch($str){ + case "TA": + $this->stored_ret = PrehLib::tender("TA", 100 * $CORE_LOCAL->get("runningTotal")); + return True; + /* + case "EC": + $this->stored_ret = PrehLib::tender("EC", 100 * $CORE_LOCAL->get("runningTotal")); + return True; + case "EF": + $this->stored_ret = PrehLib::tender("EF", 100 * $CORE_LOCAL->get("fsEligible")); + return True; + */ + case "EC": + case "EF": + case "FS": + $this->stored_ret['output'] = DisplayLib::boxMsg(_("EBT tender must specify amount")); + return True; + case "TB": + case "MCC": + /* if just CC is entered without an amount, assume + * the entire purchase will be CC. Throw up a + * proceed / cancel box, then do the tender */ + if ($CORE_LOCAL->get("LastID") == 0) + $this->stored_ret['output'] = DisplayLib::boxMsg(_("no transaction in progress")); + elseif ($CORE_LOCAL->get("warned") == 1 and $CORE_LOCAL->get("warnBoxType")== "warnCC"){ + $CORE_LOCAL->set("warnBoxType",""); + $CORE_LOCAL->set("warned",0); + $this->stored_ret = PrehLib::tender("CC", "".$CORE_LOCAL->get("runningTotal") * 100); + } + elseif ($CORE_LOCAL->get("ttlflag") == 1){ + $CORE_LOCAL->set("warnBoxType","warnCC"); + $CORE_LOCAL->set("warned",1); + $CORE_LOCAL->set("boxMsg","<BR>charge $".$CORE_LOCAL->get("runningTotal")." to credit card</B><BR>press [enter] to continue<P><FONT size='-1'>[clear] to cancel</FONT>"); + $this->stored_ret['main_frame'] = $my_url.'gui-modules/boxMsg2.php'; + } + else { + $this->stored_ret['output'] = DisplayLib::boxMsg(_("transaction must be totaled"). + "<br />"._("before tender can be accepted")); + } + return True; + case "CK": + /* same as CC above but for CK + set endorseType for check franking to work */ + if ($CORE_LOCAL->get("LastID") == 0) + $this->stored_ret['output'] = DisplayLib::boxMsg(_("no transaction in progress")); + elseif ($CORE_LOCAL->get("warned") == 1 and $CORE_LOCAL->get("warnBoxType") == "warnCK"){ + $CORE_LOCAL->set("warnBoxType",""); + $CORE_LOCAL->set("warned",0); + } + elseif ($CORE_LOCAL->get("ttlflag") == 1){ + $ref = trim($CORE_LOCAL->get("CashierNo"))."-" + .trim($CORE_LOCAL->get("laneno"))."-" + .trim($CORE_LOCAL->get("transno")); + $msg = '<br />insert check for $'.$CORE_LOCAL->get("amtdue")."<br /> + "._("press enter to endorse")."<br /><font size='-1'>"._("clear to cancel")."</font>"; + if ($CORE_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $CORE_LOCAL->set("boxMsg",$msg); + $CORE_LOCAL->set("strEntered",$CORE_LOCAL->get("amtdue")*100); + $CORE_LOCAL->set("strEntered",$CORE_LOCAL->get("strEntered")."CK"); + $this->stored_ret['main_frame'] = $my_url.'gui-modules/boxMsg2.php?endorse=check&endorseAmt='.$CORE_LOCAL->get('amtdue'); + } + else { + $this->stored_ret['output'] = DisplayLib::boxMsg(_("transaction must be totaled"). + "<br />"._("before tender can be accepted")); + } + return True; + case "CX": + $this->stored_ret = PrehLib::tender("CX", $CORE_LOCAL->get("runningTotal") * 100); + return True; + case "SC": + if ($CORE_LOCAL->get("LastID") == 0 ) + $this->stored_ret['output'] = DisplayLib::boxMsg(_("no transaction in progress")); + elseif ($CORE_LOCAL->get("warned") == 1 and $CORE_LOCAL->get("warnBoxType")== "warnSC"){ + $CORE_LOCAL->set("warnBoxType",""); + $CORE_LOCAL->set("warned",0); + $this->stored_ret = PrehLib::tender("SC", "".$CORE_LOCAL->get("runningTotal") * 100); + } + elseif ($CORE_LOCAL->get("ttlflag") == 1){ + $CORE_LOCAL->set("warnBoxType","warnSC"); + $CORE_LOCAL->set("warned",1); + $CORE_LOCAL->set("boxMsg","<BR>tender $".$CORE_LOCAL->get("runningTotal")." as store credit</B><BR>press [enter] to continue<P><FONT size='-1'>[clear] to cancel</FONT>"); + $this->stored_ret['main_frame'] = $my_url.'gui-modules/boxMsg2.php'; + } + else { + $this->stored_ret['output'] = DisplayLib::boxMsg(_("transaction must be totaled"). + "<br />"._("before tender can be accepted")); + } + return True; + case "MI": + if ($CORE_LOCAL->get("LastID") == 0 ) + $this->stored_ret['output'] = DisplayLib::boxMsg(_("no transaction in progress")); + elseif ($CORE_LOCAL->get("ttlflag") == 1) + $this->stored_ret = PrehLib::tender("MI", "".$CORE_LOCAL->get("runningTotal") * 100); + elseif ($CORE_LOCAL->get("memberID") != "0" && $CORE_LOCAL->get("isStaff") == 1) { + $this->stored_ret = PrehLib::tender("MI", "".$CORE_LOCAL->get("runningTotal") * 100); + } + elseif ($CORE_LOCAL->get("memberID") != "0" && $CORE_LOCAL->get("isStaff") == 0){ + $this->stored_ret = DisplayLib::xboxMsg("member ".$CORE_LOCAL->get("memberID"). + "<br />"._("is not authorized to make employee charges")); + } + else { + $this->stored_ret['main_frame'] = $my_url.'gui-modules/memlist.php'; + } + return True; + } + return False; + } + + function parse($str){ + return $this->stored_ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>tender code</i></td> + <td>Try to tender the current total + to the specified tender (e.g., CC)</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/StackableDiscount.php b/pos/is4c-nf/parser-class-lib/parse/StackableDiscount.php new file mode 100644 index 000000000..ec3853bda --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/StackableDiscount.php @@ -0,0 +1,70 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class StackableDiscount extends Parser { + var $ret; + function check($str){ + global $CORE_LOCAL; + $this->ret = $this->default_json(); + if (substr($str,-2) == "SD"){ + $strl = substr($str,0,strlen($str)-2); + if (!is_numeric($strl)) + return False; + elseif ($CORE_LOCAL->get("tenderTotal") != 0) + $this->ret['output'] = DisplayLib::boxMsg(_("discount not applicable after tender")); + elseif ($strl > 50) + $this->ret['output'] = DisplayLib::boxMsg(_("discount exceeds maximum")); + elseif ($strl <= 0) + $this->ret['output'] = DisplayLib::boxMsg(_("discount must be greater than zero")); + elseif ($strl <= 50 and $strl > 0) { + $existingPD = $CORE_LOCAL->get("percentDiscount"); + $stackablePD = $strl; + $equivalentPD = ($existingPD + $stackablePD); // sum discounts + $this->ret = PrehLib::percentDiscount($equivalentPD,$this->ret); + } + else + return False; + return True; + } + return False; + } + + function parse($str){ + return $this->ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>number</i>SD</td> + <td>Add percent discount in amount + <i>number</i></td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Steering.php b/pos/is4c-nf/parser-class-lib/parse/Steering.php new file mode 100644 index 000000000..d636919eb --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Steering.php @@ -0,0 +1,264 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * + * 17Feb2013 Eric Lee Support argument to PV, either before or after. + * See also gui-modules/productlist.php +*/ + +/* + * This class is for any input designed to set processing + * to an alternate gui module. That's how the particular + * olio of seemingly unrelated inputs gets caught here + */ +class Steering extends Parser { + var $dest_input_page; + var $dest_main_page; + var $dest_scale; + var $ret; + + function check($str){ + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + + $this->dest_input_page = ""; + $this->dest_main_page = ""; + $this->dest_scale = False; + $this->ret = $this->default_json(); + + // Argument to PV, either before or after. + if ( substr($str,-2,2) == "PV" ) { + $pvsearch = substr($str,0,-2); + $str = "PV"; + } elseif ( substr($str,0,2) == "PV" ) { + $pvsearch = substr($str,2); + $str = "PV"; + } else { 1; } + + switch($str){ + + case 'CAB': + if ($CORE_LOCAL->get("LastID") != "0") + $this->ret['output'] = DisplayLib::boxMsg("transaction in progress"); + else { + $this->ret['main_frame'] = $my_url."gui-modules/cablist.php"; + } + return True; + case "PV": + $CORE_LOCAL->set("pvsearch","$pvsearch"); + $this->ret['main_frame'] = $my_url."gui-modules/productlist.php"; + return True; + /* + case "PV2": + $CORE_LOCAL->set("pvsearch",""); + $this->ret['main_frame'] = "/gui-modules/smartItemList.php"; + return True; + */ + /* + case "PROD": + $this->ret['main_frame'] = "/gui-modules/productDump.php"; + return True; + */ + case "UNDO": + if ($CORE_LOCAL->get("LastID") != "0") + $this->ret['output'] = DisplayLib::boxMsg("transaction in progress"); + else { + $this->ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=UndoAdminLogin"; + } + return True; + case "DDD": + $this->ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=DDDAdminLogin"; + return True; + case 'MG': + if ($CORE_LOCAL->get("SecuritySR") > 20){ + $this->ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=SusResAdminLogin"; + } + else + $this->ret['main_frame'] = $my_url."gui-modules/adminlist.php"; + + return True; + case 'RP': + if ($CORE_LOCAL->get("LastID") != "0"){ + //$this->ret['output'] = DisplayLib::boxMsg("transaction in progress"); + $tr = $CORE_LOCAL->get("receiptToggle"); + if ($tr == 1) $CORE_LOCAL->set("receiptToggle",0); + else $CORE_LOCAL->set("receiptToggle",1); + $this->ret['main_frame'] = $my_url."gui-modules/pos2.php"; + } + else { + $query = "select register_no, emp_no, trans_no, " + ."sum((case when trans_type = 'T' then -1 * total else 0 end)) as total " + ."from localtranstoday where register_no = ".$CORE_LOCAL->get("laneno") + ." and emp_no = ".$CORE_LOCAL->get("CashierNo") + ." group by register_no, emp_no, trans_no order by 1000 - trans_no"; + $db = Database::tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + $db->close(); + + if ($num_rows == 0) + $this->ret['output'] = DisplayLib::boxMsg("no receipt found"); + else { + $this->ret['main_frame'] = $my_url."gui-modules/rplist.php"; + } + } + return True; + case 'ID': + $this->ret['main_frame'] = $my_url."gui-modules/memlist.php"; + return True; + case 'DDM': + $this->ret['main_frame'] = $my_url.'gui-modules/drawerPage.php'; + return True; + case 'SS': + case 'SO': + // sign off and suspend shift are identical except for + // drawer behavior + if ($CORE_LOCAL->get("LastID") != 0) + $this->ret['output'] = DisplayLib::boxMsg(_("Transaction in Progress")); + else { + Database::setglobalvalue("LoggedIn", 0); + $CORE_LOCAL->set("LoggedIn",0); + if ($str == 'SO'){ + ReceiptLib::drawerKick(); + ReceiptLib::freeDrawer(ReceiptLib::currentDrawer()); + } + $CORE_LOCAL->set("training",0); + $CORE_LOCAL->set("gui-scale","no"); + $this->ret['main_frame'] = $my_url."login.php"; + } + return True; + case 'NS': + if ($CORE_LOCAL->get("LastID") != 0) + $this->ret['output'] = DisplayLib::boxMsg(_("Transaction in Progress")); + else { + $this->ret['main_frame'] = $my_url."gui-modules/nslogin.php"; + } + return True; + case 'GD': + $CORE_LOCAL->set("msgrepeat",0); + $this->ret['main_frame'] = $my_url."gui-modules/giftcardlist.php"; + return True; + /* + case 'CCM': + $CORE_LOCAL->set("msgrepeat",0); + $this->ret['main_frame'] = "/gui-modules/cclist.php"; + return True; + */ + case "CN": + if ($CORE_LOCAL->get("runningTotal") == 0) { + $this->ret['receipt'] = 'cancelled'; + $this->ret['output'] = DisplayLib::printheaderb(); + $this->ret['output'] .= DisplayLib::plainmsg(_("transaction cancelled")); + } + else { + $this->ret['main_frame'] = $my_url."gui-modules/mgrlogin.php"; + } + return True; + case "CC": + if ($CORE_LOCAL->get("ttlflag") != 1){ + $this->ret['output'] = DisplayLib::boxMsg(_("transaction must be totaled")."<br />". + _("before tender can be accepted")); + } + else + $this->ret['main_frame'] = $my_url."cc-modules/gui/ProcessPage.php"; + return True; + case "PO": + $this->ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=PriceOverrideAdminLogin"; + return True; + case "HC": + $module = new HostedCheckout(); + $test = $module->entered(False,array()); + var_dump($test); + if (isset($test['main_frame'])) + $this->ret['main_frame'] = $test['main_frame']; + elseif (isset($test['output'])) + $this->ret['output'] = $test['output']; + else + $this->ret['output'] = DisplayLib::boxMsg(_("processor error")); + return True; + } + return False; + } + + function parse($str){ + return $this->ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <td colspan=2>This module gets used + for a lot of seemingly disparate things. + What they have in common is they all involve + going to a different display page</td> + </tr> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>PV</td> + <td>Search for a product</td> + </tr> + <tr> + <td>PROD</td> + <td>Dump status of a product</td> + </tr> + <tr> + <td>UNDO</td> + <td>Reverse an entire transaction</td> + </tr> + <tr> + <td>MG</td> + <td>Suspend/resume transactions, + print tender reports</td> + </tr> + <tr> + <td>RP</td> + <td>Reprint a receipt</td> + </tr> + <tr> + <td>ID</td> + <td>Search for a member</td> + </tr> + <tr> + <td>SO</td> + <td>Sign out register</td> + </tr> + <tr> + <td>NS</td> + <td>No sale</td> + </tr> + <tr> + <td>GD</td> + <td>Integrated gift card menu</td> + </tr> + <tr> + <td>CN</td> + <td>Cancel transaction</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/TaxFoodShift.php b/pos/is4c-nf/parser-class-lib/parse/TaxFoodShift.php new file mode 100755 index 000000000..2d7623943 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/TaxFoodShift.php @@ -0,0 +1,86 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class TaxFoodShift extends Parser { + + function check($str){ + global $CORE_LOCAL; + $id = $CORE_LOCAL->get("currentid"); + if ($str == "TFS" && $id > 0){ + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $id = $CORE_LOCAL->get("currentid"); + + $db = Database::tDataConnect(); + + $q = "SELECT trans_type,tax,foodstamp FROM localtemptrans WHERE trans_id=$id"; + $r = $db->query($q); + if ($db->num_rows($r) == 0) return True; // shouldn't ever happen + $row = $db->fetch_row($r); + + $q = "SELECT MAX(id) FROM taxrates"; + $r = $db->query($q); + $tax_cap = 0; + if ($db->num_rows($r)>0){ + $max = array_pop($db->fetch_row($r)); + if (!empty($max)) $tax_cap = $max; + } + $db->query($q); + + $next_tax = $row['tax']+1; + $next_fs = 0; + if ($next_tax > $max){ + $next_tax = 0; + $next_fs = 1; + } + + $q = "UPDATE localtemptrans + set tax=$next_tax,foodstamp=$next_fs + WHERE trans_id=$id"; + $db->query($q); + + $ret = $this->default_json(); + $ret['output'] = DisplayLib::listitems($CORE_LOCAL->get("currenttopid"),$id); + return $ret; // maintain item cursor position + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>TFS</td> + <td>Roll through tax/foodstamp settings + on the current item</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/TenderKey.php b/pos/is4c-nf/parser-class-lib/parse/TenderKey.php new file mode 100644 index 000000000..9b3984b90 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/TenderKey.php @@ -0,0 +1,65 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class TenderKey extends Parser { + + function check($str){ + if (strstr($str,"TT") && strlen($str) >= 3 && + substr($str,0,2) != "VD") + return True; + else if ($str == "TT") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + + $amt = substr($str,0,strlen($str)-2); + if ($amt === "") + $amt = 100*$CORE_LOCAL->get("amtdue"); + $ret = $this->default_json(); + + $CORE_LOCAL->set("tenderTotal",$amt); + $ret['main_frame'] = $my_url.'gui-modules/tenderlist.php'; + + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>amount</i>DP<i>department</i>0</td> + <td>Ring up <i>amount</i> to the specified + <i>department</i>. The trailing zero is + necessary for historical purposes</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/TenderOut.php b/pos/is4c-nf/parser-class-lib/parse/TenderOut.php new file mode 100644 index 000000000..f20b09d90 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/TenderOut.php @@ -0,0 +1,80 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class TenderOut extends Parser { + function check($str){ + if ($str == "TO") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("LastID") == 0){ + $ret = $this->default_json(); + $ret['output'] = DisplayLib::boxMsg(_("no transaction in progress")); + return $ret; + } + else { + return $this->tender_out(""); + } + } + + function tender_out($asTender){ + global $CORE_LOCAL; + $ret = $this->default_json(); + Database::getsubtotals(); + if ($CORE_LOCAL->get("amtdue") <= 0.005) { + $CORE_LOCAL->set("change",-1 * $CORE_LOCAL->get("amtdue")); + $cash_return = $CORE_LOCAL->get("change"); + if ($asTender != "FS") { + TransRecord::addchange($cash_return,'CA'); + } + $CORE_LOCAL->set("End",1); + $ret['output'] = DisplayLib::printReceiptFooter(); + $ret['redraw_footer'] = true; + $ret['receipt'] = 'full'; + } else { + $CORE_LOCAL->set("change",0); + $CORE_LOCAL->set("fntlflag",0); + PrehLib::ttl(); + $ret['output'] = DisplayLib::lastpage(); + } + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>TO</td> + <td>Tender out. Not a WFC function; just + reproduced for compatibility</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/ToggleReceipt.php b/pos/is4c-nf/parser-class-lib/parse/ToggleReceipt.php new file mode 100644 index 000000000..831d04e6c --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/ToggleReceipt.php @@ -0,0 +1,59 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ToggleReceipt extends Parser { + + function check($str){ + if ($str == "NR") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $rt = $CORE_LOCAL->get("receiptToggle"); + if ($rt == 1) + $CORE_LOCAL->set("receiptToggle",0); + else + $CORE_LOCAL->set("receiptToggle",1); + $ret = $this->default_json(); + // redirect to main screen so receipt icon reloads + $ret['main_frame'] = MiscLib::base_url().'gui-modules/pos2.php'; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>NR</td> + <td>Disable receipt printing. + </td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Totals.php b/pos/is4c-nf/parser-class-lib/parse/Totals.php new file mode 100644 index 000000000..3c04a33a9 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Totals.php @@ -0,0 +1,103 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 13Jan2013 Eric Lee Added MTL for Ontario Meal Tax Rebate + +*/ + +class Totals extends Parser { + + function check($str){ + if ($str == "FNTL" || $str == "TETL" || + $str == "FTTL" || $str == "TL" || + $str == "MTL" || + substr($str,0,2) == "FN") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if ($str == "FNTL"){ + $ret['main_frame'] = MiscLib::base_url().'gui-modules/fsTotalConfirm.php'; + } + elseif ($str == "TETL"){ + $ret['main_frame'] = MiscLib::base_url().'gui-modules/requestInfo.php?class=Totals'; + } + elseif ($str == "FTTL") + PrehLib::finalttl(); + elseif ($str == "TL"){ + $chk = PrehLib::ttl(); + if ($chk !== True) + $ret['main_frame'] = $chk; + } + elseif ($str == "MTL"){ + $chk = PrehLib::omtr_ttl(); + if ($chk !== True) + $ret['main_frame'] = $chk; + } + + if (!$ret['main_frame']){ + $ret['output'] = DisplayLib::lastpage(); + $ret['redraw_footer'] = True; + } + return $ret; + } + + static $requestInfoHeader = 'tax exempt'; + static $requestInfoMsg = 'Enter the tax exempt ID'; + static function requestInfoCallback($info){ + TransRecord::addTaxExempt(); + TransRecord::addcomment("Tax Ex ID# ".$info); + return True; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>FNTL</td> + <td>Foodstamp eligible total</td> + </tr> + <tr> + <td>TETL</td> + <td>Tax exempt total</td> + </tr> + <tr> + <td>FTTL</td> + <td>Final total</td> + </tr> + <tr> + <td>TL</td> + <td>Re-calculate total</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/UPC.php b/pos/is4c-nf/parser-class-lib/parse/UPC.php new file mode 100644 index 000000000..81a3874d5 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/UPC.php @@ -0,0 +1,521 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class UPC extends Parser { + function check($str){ + if (is_numeric($str) && strlen($str) < 16) + return True; + else if (substr($str,0,4) == "GS1~") + return True; + return False; + } + + function parse($str){ + if (substr($str,0,4) == "GS1~") + $str = $this->fixGS1($str); + + return $this->upcscanned($str); + } + + function upcscanned($entered) { + global $CORE_LOCAL; + $my_url = MiscLib::base_url(); + $ret = $this->default_json(); + + /* force cashiers to enter a comment on refunds */ + if ($CORE_LOCAL->get("refund")==1 && $CORE_LOCAL->get("refundComment") == ""){ + $ret['udpmsg'] = 'twoPairs'; + if ($CORE_LOCAL->get("SecurityRefund") > 20){ + $ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=RefundAdminLogin"; + } + else + $ret['main_frame'] = $my_url.'gui-modules/refundComment.php'; + $CORE_LOCAL->set("refundComment",$CORE_LOCAL->get("strEntered")); + return $ret; + } + + $entered = str_replace(".", " ", $entered); + + $quantity = $CORE_LOCAL->get("quantity"); + if ($CORE_LOCAL->get("quantity") == 0 && $CORE_LOCAL->get("multiple") == 0) $quantity = 1; + + /* exapnd UPC-E */ + if (substr($entered, 0, 1) == 0 && strlen($entered) == 7) { + $p6 = substr($entered, -1); + if ($p6 == 0) $entered = substr($entered, 0, 3)."00000".substr($entered, 3, 3); + elseif ($p6 == 1) $entered = substr($entered, 0, 3)."10000".substr($entered, 3, 3); + elseif ($p6 == 2) $entered = substr($entered, 0, 3)."20000".substr($entered, 3, 3); + elseif ($p6 == 3) $entered = substr($entered, 0, 4)."00000".substr($entered, 4, 2); + elseif ($p6 == 4) $entered = substr($entered, 0, 5)."00000".substr($entered, 5, 1); + else $entered = substr($entered, 0, 6)."0000".$p6; + } + + /* make sure upc length is 13 */ + $upc = ""; + if (strlen($entered) == 13 && substr($entered, 0, 1) != 0) $upc = "0".substr($entered, 0, 12); + else $upc = substr("0000000000000".$entered, -13); + + /* extract scale-sticker prices */ + $scaleprice = 0; + if (substr($upc, 0, 3) == "002") { + $scaleprice = MiscLib::truncate2(substr($upc, -4)/100); + $upc = substr($upc, 0, 8)."00000"; + if ($upc == "0020006000000" || $upc == "0020010000000") $scaleprice *= -1; + } + + $db = Database::pDataConnect(); + $query = "select inUse,upc,description,normal_price,scale,deposit, + qttyEnforced,department,local,cost,tax,foodstamp,discount, + discounttype,specialpricemethod,special_price,groupprice, + pricemethod,quantity,specialgroupprice,specialquantity, + mixmatchcode,idEnforced,tareweight + from products where upc = '".$upc."'"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + /* check for special upcs that aren't really products */ + if ($num_rows == 0){ + $objs = $CORE_LOCAL->get("SpecialUpcClasses"); + foreach($objs as $class_name){ + $instance = new $class_name(); + if ($instance->is_special($upc)){ + return $instance->handle($upc,$ret); + } + } + // no match; not a product, not special + + $opts = array('upc'=>$upc,'description'=>'BADSCAN'); + TransRecord::add_log_record($opts); + $CORE_LOCAL->set("boxMsg",$upc." "._("not a valid item")); + //$ret['udpmsg'] = 'errorBeep'; // 12/12/12 this seems to stack with DisplayLib::msgbox + $ret['main_frame'] = $my_url."gui-modules/boxMsg2.php"; + return $ret; + } + + /* product exists + BEGIN error checking round #1 + */ + $row = $db->fetch_array($result); + + /* Implementation of inUse flag + * if the flag is not set, display a warning dialog noting this + * and allowing the sale to be confirmed or canceled + */ + if ($row["inUse"] == 0){ + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("strEntered",$row["upc"]); + $CORE_LOCAL->set("boxMsg","<b>".$row["upc"]." - ".$row["description"]."</b> + <br />"._("Item not for sale")." + <br /><font size=-1>"._("enter to continue sale").", "._("clear to cancel")."</font>"); + $ret['main_frame'] = $my_url."gui-modules/boxMsg2.php?quiet=1"; + return $ret; + } + } + + /** + Apply special department handlers + based on item's department + */ + $deptmods = $CORE_LOCAL->get('SpecialDeptMap'); + if (is_array($deptmods) && isset($deptmods[$row['department']])){ + foreach($deptmods[$index] as $mod){ + $obj = new $mod(); + $ret = $obj->handle($row['department'],$row['normal_price'],$ret); + if ($ret['main_frame']) + return $ret; + } + } + + /** + Detect if a by-weight item has the same weight as the last by-weight + item. This can indicate a stuck scale. + The giant if determines whether the item is scalable, that we + know the weight, and that we know the previous weight (lastWeight) + + Pre-weighed items (upc starts with 002) are ignored because they're not + weighed here. Scalable items that cost one cent are ignored as a special + case; they're normally entered by keying a quantity multiplier + */ + if ($num_rows > 0 && $row['scale'] == 1 + && $CORE_LOCAL->get("lastWeight") > 0 && $CORE_LOCAL->get("weight") > 0 + && abs($CORE_LOCAL->get("weight") - $CORE_LOCAL->get("lastWeight")) < 0.0005 + && substr($upc,0,3) != "002" && abs($row['normal_price']) > 0.01){ + if ($CORE_LOCAL->get('msgrepeat') == 0){ + $CORE_LOCAL->set("strEntered",$row["upc"]); + $CORE_LOCAL->set("boxMsg","<b>Same weight as last item</b> + <br><font size=-1>[enter] to confirm correct, [clear] to cancel</font>"); + $ret['main_frame'] = $my_url."gui-modules/boxMsg2.php?quiet=1"; + return $ret; + } + } + + if ($row["idEnforced"] > 0){ + + $restrictQ = "SELECT upc,dept_ID FROM dateRestrict WHERE + ( upc='{$row['upc']}' AND + ( ".$db->datediff($db->now(),'restrict_date')."=0 OR + ".$db->dayofweek($db->now())."=restrict_dow + ) AND + ( (restrict_start IS NULL AND restrict_end IS NULL) OR + ".$db->curtime()." BETWEEN restrict_start AND restrict_end + ) + ) OR + ( dept_ID='{$row['department']}' AND + ( ".$db->datediff($db->now(),'restrict_date')."=0 OR + ".$db->dayofweek($db->now())."=restrict_dow + ) AND + ( (restrict_start IS NULL AND restrict_end IS NULL) OR + ".$db->curtime()." BETWEEN restrict_start AND restrict_end + ) + )"; + $restrictR = $db->query($restrictQ); + if ($db->num_rows($restrictR) > 0){ + $CORE_LOCAL->set("boxMsg",_("product cannot be sold right now")); + $ret['main_frame'] = $my_url."gui-modules/boxMsg2.php"; + return $ret; + } + + if ($CORE_LOCAL->get("cashierAge") < 18 && $CORE_LOCAL->get("cashierAgeOverride") != 1){ + $ret['main_frame'] = $my_url."gui-modules/adminlogin.php?class=AgeApproveAdminLogin"; + return $ret; + } + + if ($CORE_LOCAL->get("memAge")=="") + $CORE_LOCAL->set("memAge",date('Ymd')); + $diff = time() - ((int)strtotime($CORE_LOCAL->get("memAge"))); + $age = floor($diff / (365*60*60*24)); + if ($age < $row['idEnforced']){ + $ret['udpmsg'] = 'twoPairs'; + $ret['main_frame'] = $my_url.'gui-modules/requestInfo.php?class=UPC'; + return $ret; + } + } + + if ($row['tareweight'] > 0){ + $peek = PrehLib::peekItem(); + if (strstr($peek,"** Tare Weight") === False) + TransRecord::addTare($row['tareweight']*100); + } + + /* sanity check - ridiculous price + (can break db column if it doesn't fit + */ + if (strlen($row["normal_price"]) > 8){ + $ret['output'] = DisplayLib::boxMsg("$upc<br />"._("Claims to be more than $100,000")); + return $ret; + } + + $scale = ($row["scale"] == 0) ? 0 : 1; + + /* need a weight with this item + retry the UPC in a few milliseconds and see + */ + if ($scale != 0 && $CORE_LOCAL->get("weight") == 0 && + $CORE_LOCAL->get("quantity") == 0 && substr($upc,0,3) != "002") { + + $CORE_LOCAL->set("SNR",$CORE_LOCAL->get('strEntered')); + $ret['output'] = DisplayLib::boxMsg(_("please put item on scale"),'',True); + //$ret['retry'] = $CORE_LOCAL->get("strEntered"); + + return $ret; + } + + /* got a scale weight, make sure the tare + is valid */ + if ($scale != 0 and substr($upc,0,3) != "002"){ + $quantity = $CORE_LOCAL->get("weight") - $CORE_LOCAL->get("tare"); + if ($CORE_LOCAL->get("quantity") != 0) + $quantity = $CORE_LOCAL->get("quantity") - $CORE_LOCAL->get("tare"); + + if ($quantity <= 0){ + $ret['output'] = DisplayLib::boxMsg(_("item weight must be greater than tare weight")); + return $ret; + } + $CORE_LOCAL->set("tare",0); + } + + /* non-scale items need integer quantities */ + if ($row["scale"] == 0 && (int) $CORE_LOCAL->get("quantity") != $CORE_LOCAL->get("quantity") ) { + $ret['output'] = DisplayLib::boxMsg(_("fractional quantity cannot be accepted for this item")); + return $ret; + } + + /* quantity required for this item. Send to + entry page if one wasn't provided */ + $qttyEnforced = $row["qttyEnforced"]; + if (($qttyEnforced == 1) && ($CORE_LOCAL->get("multiple") == 0) && ($CORE_LOCAL->get("msgrepeat") == 0)) { + $ret['main_frame'] = $my_url."gui-modules/qtty2.php"; + return $ret; + } + else + $CORE_LOCAL->set("qttyvalid",1); // this may be unnecessary + + /* wedge I assume + I don't like this being hard-coded, but since these UPCs + are entries in products they can't go in a SpecialUPC + object (unless SpecialUPC checks take place on every + scan, but that's more overhead than I want on such a common + operation + */ + if ($upc == "0000000008010" && $CORE_LOCAL->get("msgrepeat") == 0) { + $CORE_LOCAL->set("boxMsg","<b>".$total." gift certificate</b><br /> + "._("insert document")."<br />"._("press enter to endorse")." + <p><font size='-1'>"._("clear to cancel")."</font>"); + $ret["main_frame"] = $my_url."gui-modules/boxMsg2.php?endorse=giftcert&endorseAmt=".$total; + return $ret; + } + + /* wedge I assume + see 0000000008010 above + */ + if ($upc == "0000000008011" && $CORE_LOCAL->get("msgrepeat") == 0) { + $CORE_LOCAL->set("boxMsg","<b>".$total." class registration</b><br /> + "._("insert form")."<br />"._("press enter to endorse")." + <p><font size='-1'>"._("clear to cancel")."</font>"); + $ret["main_frame"] = $my_url."gui-modules/boxMsg2.php?endorse=classreg&endorseAmt=".$total; + return $ret; + } + + /* + END error checking round #1 + */ + + // wfc uses deposit field to link another upc + if (isset($row["deposit"]) && $row["deposit"] > 0){ + $dupc = (int)$row["deposit"]; + $this->add_deposit($dupc); + } + + $upc = $row["upc"]; + $row['numflag'] = isset($row["local"])?$row["local"]:0; + $row['description'] = str_replace("'","",$row['description']); + + /* do tax shift */ + $tax = $row['tax']; + if ($CORE_LOCAL->get("toggletax") != 0) { + $tax = ($tax==0) ? 1 : 0; + $CORE_LOCAL->set("toggletax",0); + } + $row['tax'] = $tax; + + /* do foodstamp shift */ + $foodstamp = $row["foodstamp"]; + if ($CORE_LOCAL->get("togglefoodstamp") != 0){ + $CORE_LOCAL->set("togglefoodstamp",0); + $foodstamp = ($foodstamp==0) ? 1 : 0; + } + $row['foodstamp'] = $foodstamp; + + /* do discount shifts */ + $discountable = $row["discount"]; + if ($CORE_LOCAL->get("toggleDiscountable") == 1) { + $CORE_LOCAL->set("toggleDiscountable",0); + $discountable = ($discountable == 0) ? 1 : 0; + } + $row['discount'] = $discountable; + + /* + BEGIN: figure out discounts by type + */ + + /* get discount object */ + $discounttype = MiscLib::nullwrap($row["discounttype"]); + $DTClasses = $CORE_LOCAL->get("DiscountTypeClasses"); + $DiscountObject = new $DTClasses[$discounttype]; + + /* add in sticker price and calculate a quantity + if the item is stickered, scaled, and on sale + if it's not scaled or on sale, there's no need + to back-calculate weight and adjust so just use + sticker price as normal_price + */ + if (substr($upc,0,3) == "002"){ + if ($DiscountObject->isSale() && $scale == 1) + $quantity = MiscLib::truncate2($scaleprice / $row["normal_price"]); + else + $row['normal_price'] = $scaleprice; + } + + /* + END: figure out discounts by type + */ + + /* get price method object & add item*/ + $pricemethod = MiscLib::nullwrap($row["pricemethod"]); + if ($DiscountObject->isSale()) + $pricemethod = MiscLib::nullwrap($row["specialpricemethod"]); + $PMClasses = $CORE_LOCAL->get("PriceMethodClasses"); + $PriceMethodObject = new $PMClasses[$pricemethod]; + // prefetch: otherwise object members + // pass out of scope in addItem() + $prefetch = $DiscountObject->priceInfo($row,$quantity); + $PriceMethodObject->addItem($row, $quantity, $DiscountObject); + + /* add discount notifications lines, if applicable */ + $DiscountObject->addDiscountLine(); + + // cleanup, reset flags and beep + if ($quantity != 0) { + // ddNotify is legacy/unknown. likely doesn't work + if ($CORE_LOCAL->get("ddNotify") == 1 && $CORE_LOCAL->get("itemPD") == 10) { + $CORE_LOCAL->set("itemPD",0); + $discountable = 7; + } + $intvoided = 0; + if ($CORE_LOCAL->get("ddNotify") == 1 && $discountable == 7) + $intvoided = 22; + + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("qttyvalid",0); + + $ret['udpmsg'] = 'goodBeep'; + } + + /* reset various flags and variables */ + if ($CORE_LOCAL->get("tare") != 0) $CORE_LOCAL->set("tare",0); + $CORE_LOCAL->set("ttlflag",0); + $CORE_LOCAL->set("fntlflag",0); + $CORE_LOCAL->set("quantity",0); + $CORE_LOCAL->set("itemPD",0); + Database::setglobalflags(0); + + /* output item list, update totals footer */ + $ret['redraw_footer'] = True; + $ret['output'] = DisplayLib::lastpage(); + + if ($prefetch['unitPrice']==0 && $discounttype == 0){ + $ret['main_frame'] = $my_url.'gui-modules/priceOverride.php'; + } + + return $ret; + } + + function add_deposit($upc){ + global $CORE_LOCAL; + + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $db = Database::pDataConnect(); + $query = "select description,scale,tax,foodstamp,discounttype, + discount,department,normal_price + from products where upc='".$upc."'"; + $result = $db->query($query); + + if ($db->num_rows($result) <= 0) return; + + $row = $db->fetch_array($result); + + $description = $row["description"]; + $description = str_replace("'", "", $description); + $description = str_replace(",", "", $description); + + $scale = 0; + if ($row["scale"] != 0) $scale = 1; + + $tax = 0; + if ($row["tax"] > 0 && $CORE_LOCAL->get("toggletax") == 0) $tax = $row["tax"]; + elseif ($row["tax"] > 0 && $CORE_LOCAL->get("toggletax") == 1) { + $tax = 0; + $CORE_LOCAL->set("toggletax",0); + } + elseif ($row["tax"] == 0 && $CORE_LOCAL->get("toggletax") == 1) { + $tax = 1; + $CORE_LOCAL->set("toggletax",0); + } + + $foodstamp = 0; + if ($row["foodstamp"] != 0 && $CORE_LOCAL->get("togglefoodstamp") == 0) $foodstamp = 1; + elseif ($row["foodstamp"] != 0 && $CORE_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = 0; + $CORE_LOCAL->set("togglefoodstamp",0); + } + elseif ($row["foodstamp"] == 0 && $CORE_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = 1; + $CORE_LOCAL->set("togglefoodstamp",0); + } + + $discounttype = MiscLib::nullwrap($row["discounttype"]); + $discountable = $row["discount"]; + + $quantity = 1; + if ($CORE_LOCAL->get("quantity") != 0) $quantity = $CORE_LOCAL->get("quantity"); + + $save_refund = $CORE_LOCAL->get("refund"); + + TransRecord::addItem($upc,$description,"I"," "," ",$row["department"], + $quantity,$row["normal_price"], + $quantity*$row["normal_price"],$row["normal_price"], + $scale,$tax,$foodstamp,0,0,$discountable,$discounttype, + $quantity,0,0,0,0,0,0); + + $CORE_LOCAL->set("refund",$save_refund); + } + + function fixGS1($str){ + // remove GS1~ prefix + two additional characters + $str = substr($str,6); + + // check application identifier + + // coupon; return whole thing + if (substr($str,0,4) == "8110") + return $str; + + // GTIN-14; return w/o check digit, + // ignore any other fields for now + if (substr($str,0,1) == "10") + return substr($str,2,13); + + // application identifier not recognized + // will likely cause no such item error + return $str; + } + + public static $requestInfoHeader = 'customer age'; + public static $requestInfoMsg = 'Type customer birthdate YYYYMMDD'; + public static function requestInfoCallback($info){ + global $CORE_LOCAL; + if ((is_numeric($info) && strlen($info)==8) || $info == 1){ + $CORE_LOCAL->set("memAge",$info); + $CORE_LOCAL->set('strRemembered', $CORE_LOCAL->get('strEntered')); + $CORE_LOCAL->set('msgrepeat', 1); + return True; + } + return False; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>product number</i></td> + <td>Try to ring up the specified product. + Coupon handling is included here</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Void.php b/pos/is4c-nf/parser-class-lib/parse/Void.php new file mode 100644 index 000000000..d22f7ac9d --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Void.php @@ -0,0 +1,443 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Void extends Parser { + + function check($str){ + if (substr($str,0,2) == "VD" && strlen($str) <= 15) + return True; + return False; + } + + private $discounttype = 0; + private $discountable = 0; + private $caseprice = 0; + private $scaleprice = 0; + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if (strlen($str) > 2) + $ret['output'] = $this->voidupc(substr($str,2)); + elseif ($CORE_LOCAL->get("currentid") == 0) + $ret['output'] = DisplayLib::boxMsg(_("No Item on Order")); + else { + $str = $CORE_LOCAL->get("currentid"); + + $status = PrehLib::checkstatus($str); + $this->discounttype = $status['discounttype']; + $this->discountable = $status['discountable']; + $this->caseprice = $status['caseprice']; + $this->scaleprice = $status['scaleprice']; + + if ($status['voided'] == 2) { + $ret['output'] = $this->voiditem($str -1); + } + elseif ($status['voided'] == 3 || $status['voided'] == 6 || $status['voided'] == 8) + $ret['output'] = DisplayLib::boxMsg(_("Cannot void this entry")); + elseif ($status['voided'] == 4 || $status['voided'] == 5) + PrehLib::percentDiscount(0); + elseif ($status['voided'] == 10) { + TransRecord::reverseTaxExempt(); + } + elseif ($status['status'] == "V") { + $ret['output'] = DisplayLib::boxMsg(_("Item already voided")); + } + else + $ret['output'] = $this->voiditem($str); + } + if (empty($ret['output'])){ + $ret['output'] = DisplayLib::lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + } + else { + $ret['udpmsg'] = 'errorBeep'; + } + return $ret; + } + + function voiditem($item_num) { + global $CORE_LOCAL; + + if ($item_num) { + $query = "select upc, quantity, ItemQtty, foodstamp, discountable, + total, voided, charflag, discounttype from localtemptrans where " + ."trans_id = ".$item_num; + + $db = Database::tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) return DisplayLib::boxMsg(_("Item not found")); + else { + $row = $db->fetch_array($result); + + $this->discounttype = $row['discounttype']; + $this->discountable = $row['discountable']; + + if ((!$row["upc"] || strlen($row["upc"]) < 1) && $row["voided"] == 1) + + return DisplayLib::boxMsg(_("Item already voided")); + elseif (!$row["upc"] || strlen($row["upc"]) < 1 || $row['charflag'] == 'SO') + return $this->voidid($item_num); + elseif ($row["discounttype"] == 3){ + return $this->voidupc($row["quantity"]."*".$row["upc"],$item_num); + } + else + return $this->voidupc($row["ItemQtty"]."*".$row["upc"],$item_num); + } + } + return ""; + } + + function voidid($item_num) { + global $CORE_LOCAL; + + $query = "select upc,VolSpecial,quantity,trans_subtype,unitPrice, + discount,memDiscount,discountable,scale,numflag,charflag, + foodstamp,discounttype,total,cost,description,trans_type, + department,regPrice,tax,volDiscType,volume,mixMatch,matched + from localtemptrans where trans_id = ".$item_num; + $db = Database::tDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + + $upc = $row["upc"]; + $VolSpecial = $row["VolSpecial"]; + $quantity = -1 * $row["quantity"]; + + $total = -1 * $row["total"]; + if ($row["trans_subtype"] == "FS") + $total = -1 * $row["unitPrice"]; + + $CardNo = $CORE_LOCAL->get("memberID"); + $discount = -1 * $row["discount"]; + $memDiscount = -1 * $row["memDiscount"]; + $discountable = $row["discountable"]; + $unitPrice = $row["unitPrice"]; + $scale = MiscLib::nullwrap($row["scale"]); + $cost = isset($row["cost"])?-1*$row["cost"]:0; + $numflag = isset($row["numflag"])?$row["numflag"]:0; + $charflag = isset($row["charflag"])?$row["charflag"]:0; + $mm = $row['mixMatch']; + $matched = $row['matched']; + + $foodstamp = 0; + if ($row["foodstamp"] != 0) $foodstamp = 1; + + $discounttype = MiscLib::nullwrap($row["discounttype"]); + + if ($CORE_LOCAL->get("tenderTotal") < 0 && $foodstamp = 1 && (-1 * $total) > $CORE_LOCAL->get("fsEligible")) { + return DisplayLib::boxMsg("Item already paid for"); + } + elseif ($CORE_LOCAL->get("tenderTotal") < 0 && (-1 * $total) > $CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("taxTotal")) { + return DisplayLib::boxMsg("Item already paid for"); + } + + $update = "update localtemptrans set voided = 1 where trans_id = ".$item_num; + $db->query($update); + TransRecord::addItem($upc, $row["description"], $row["trans_type"], $row["trans_subtype"], "V", $row["department"], $quantity, $unitPrice, $total, $row["regPrice"], $scale, $row["tax"], $foodstamp, $discount, $memDiscount, $discountable, $discounttype, $quantity, $row["volDiscType"], $row["volume"], $VolSpecial, $mm, $matched, 1, $cost, $numflag, $charflag); + if ($row["trans_type"] != "T") { + $CORE_LOCAL->set("ttlflag",0); + } + else PrehLib::ttl(); + + return ""; + } + + function voidupc($upc,$item_num=-1,$silent=False) { + global $CORE_LOCAL; + + $lastpageflag = 1; + $deliflag = 0; + $quantity = 0; + + if (strpos($upc, "*") && (strpos($upc, "**") || strpos($upc, "*") == 0 || + strpos($upc, "*") == strlen($upc)-1)) + $upc = "stop"; + + elseif (strpos($upc, "*")) { + + $voidupc = explode("*", $upc); + if (!is_numeric($voidupc[0])) $upc = "stop"; + else { + $quantity = $voidupc[0]; + $upc = $voidupc[1]; + $weight = 0; + + } + } + elseif (!is_numeric($upc) && !strpos($upc, "DP")) $upc = "stop"; + else { + $quantity = 1; + $weight = $CORE_LOCAL->get("weight"); + } + + $scaleprice = 0; + if (is_numeric($upc)) { + $upc = substr("0000000000000".$upc, -13); + if (substr($upc, 0, 3) == "002" && substr($upc, -5) != "00000") { + $scaleprice = substr($upc, 10, 4)/100; + $upc = substr($upc, 0, 8)."0000"; + $deliflag = 1; + } + elseif (substr($upc, 0, 3) == "002" && substr($upc, -5) == "00000") { + $scaleprice = $this->scaleprice; + $deliflag = 1; + } + } + + if ($upc == "stop") return DisplayLib::inputUnknown(); + + $db = Database::tDataConnect(); + + $query = "select sum(ItemQtty) as voidable, sum(quantity) as vquantity, max(scale) as scale, " + ."max(volDiscType) as volDiscType from localtemptrans where upc = '".$upc + ."' and unitPrice = ".$scaleprice." and discounttype <> 3 group by upc"; + if ($this->discounttype == 3) { + $query = "select sum(quantity) as voidable, max(scale), as scale, " + ."max(volDiscType) as volDiscType from localtemptrans where " + ."upc = '".$upc."' and discounttype = 3 and unitPrice = " + .$this->caseprice." group by upc"; + } + elseif ($deliflag == 0) { + $query = "select sum(ItemQtty) as voidable, sum(quantity) as vquantity, " + ."max(scale) as scale, max(volDiscType) as volDiscType from " + ."localtemptrans where upc = '".$upc + ."' and discounttype <> 3 group by upc, discounttype"; + } + elseif ($CORE_LOCAL->get("ddNotify") == 1) { + $query = "select sum(ItemQtty) as voidable, sum(quantity) as vquantity," + ."max(scale) as scale, max(volDiscType) as volDiscType from " + ."localtemptrans where upc = '".$upc."' and discounttype <> 3 " + ."and discountable = ".$this->discountable." group by upc, " + ."discounttype, discountable"; + } + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + if ($num_rows == 0 ){ + return DisplayLib::boxMsg(_("Item not found").": ".$upc); + } + + $row = $db->fetch_array($result); + + if (($row["scale"] == 1) && $weight > 0) { + $quantity = $weight - $CORE_LOCAL->get("tare"); + $CORE_LOCAL->set("tare",0); + } + + $volDiscType = $row["volDiscType"]; + $voidable = MiscLib::nullwrap($row["voidable"]); + + $VolSpecial = 0; + $volume = 0; + $scale = MiscLib::nullwrap($row["scale"]); + + if ($voidable == 0 && $quantity == 1) return DisplayLib::boxMsg(_("Item already voided")); + elseif ($voidable == 0 && $quantity > 1) return DisplayLib::boxMsg(_("Items already voided")); + elseif ($scale == 1 && $quantity < 0) return DisplayLib::boxMsg(_("tare weight cannot be greater than item weight")); + elseif ($voidable < $quantity && $row["scale"] == 1) { + $message = _("Void request exceeds")."<br />"._("weight of item rung in")."<p><b>". + sprintf(_("You can void up to %.2f lb"),$row['voidable'])."</b>"; + return DisplayLib::boxMsg($message); + } + elseif ($voidable < $quantity) { + $message = _("Void request exceeds")."<br />"._("number of items rung in")."<p><b>". + sprintf(_("You can void up to %d"),$row['voidable'])."</b>"; + return DisplayLib::boxMsg($message); + } + + unset($result); + //----------------------Void Item------------------ + $query_upc = "select ItemQtty,foodstamp,discounttype,mixMatch,cost, + numflag,charflag,unitPrice,total,discounttype,regPrice,discount, + memDiscount,discountable,description,trans_type,trans_subtype, + department,tax,VolSpecial,trans_id + from localtemptrans where upc = '".$upc."' and unitPrice = " + .$scaleprice." and trans_id=$item_num"; + if ($this->discounttype == 3) { + $query_upc = "select ItemQtty,foodstamp,discounttype,mixMatch,cost, + numflag,charflag,unitPrice,total,discounttype,regPrice,discount, + memDiscount,discountable,description,trans_type,trans_subtype, + department,tax,VolSpecial,trans_id + from localtemptrans where upc = '".$upc + ."' and discounttype = 3 and unitPrice = ".$this->caseprice + ." and trans_id=$item_num"; + } + elseif ($deliflag == 0) { + $query_upc = "select ItemQtty,foodstamp,discounttype,mixMatch,cost, + numflag,charflag,unitPrice,total,discounttype,regPrice,discount, + memDiscount,discountable,description,trans_type,trans_subtype, + department,tax,VolSpecial,trans_id + from localtemptrans where upc = '".$upc + ."' and discounttype <> 3" + ." and trans_id=$item_num"; + } + if ($item_num == -1) + $query_upc = str_replace(" trans_id=$item_num"," voided=0",$query_upc); + + $result = $db->query($query_upc); + $row = $db->fetch_array($result); + + $ItemQtty = $row["ItemQtty"]; + $foodstamp = MiscLib::nullwrap($row["foodstamp"]); + $discounttype = MiscLib::nullwrap($row["discounttype"]); + $mixMatch = MiscLib::nullwrap($row["mixMatch"]); + $item_num = $row['trans_id']; + $cost = isset($row["cost"])?-1*$row["cost"]:0; + $numflag = isset($row["numflag"])?$row["numflag"]:0; + $charflag = isset($row["charflag"])?$row["charflag"]:0; + + $unitPrice = $row["unitPrice"]; + if (($CORE_LOCAL->get("isMember") != 1 && $row["discounttype"] == 2) || + ($CORE_LOCAL->get("isStaff") == 0 && $row["discounttype"] == 4)) + $unitPrice = $row["regPrice"]; + elseif ((($CORE_LOCAL->get("isMember") == 1 && $row["discounttype"] == 2) || + ($CORE_LOCAL->get("isStaff") != 0 && $row["discounttype"] == 4)) && + ($row["unitPrice"] == $row["regPrice"])) { + $db_p = Database::pDataConnect(); + $query_p = "select special_price from products where upc = '".$upc."'"; + $result_p = $db_p->query($query_p); + $row_p = $db_p->fetch_array($result_p); + + $unitPrice = $row_p["special_price"]; + + } + + $discount = -1 * $row["discount"]; + $memDiscount = -1 * $row["memDiscount"]; + $discountable = $row["discountable"]; + + //----------------------mix match--------------------- + if ($volDiscType >= 1 && $volDiscType != 3) { + $db_mm = Database::tDataConnect(); + $query_mm = "select sum(ItemQtty) as mmqtty from localtemptrans " + ."where mixMatch = ".$mixMatch; + + $result_mm = $db_mm->query($query_mm); + $row_mm = $db_mm->fetch_array($result_mm); + + $mmqtty = MiscLib::nullwrap($row_mm["mmqtty"]); + + $db_pq = Database::pDataConnect(); + $query_pq = "select normal_price,groupprice,quantity,specialquantity, + specialgroupprice + from products where upc = '".$upc."'"; + $result_pq = $db_pq->query($query_pq); + $row_pq = $db_pq->fetch_array($result_pq); + + $unitPrice = $row_pq["normal_price"]; + $VolSpecial = MiscLib::nullwrap($row_pq["groupprice"]); + $volume = MiscLib::nullwrap($row_pq["quantity"]); + if ($discounttype == 1) { + $volume = MiscLib::nullwrap($row_pq['specialquantity']); + $VolSpecial = MiscLib::nullwrap($row_pq["specialgroupprice"]); + } + + $volmulti = (int) ($quantity/$volume); + $vmremainder = $quantity % $volume; + $mm = (int) ($mmqtty/$volume); + $mmremainder = $mmqtty % $volume; + if ($mixMatch == 0) { + $mm = (int) ($voidable/$volume); + $mmremainder = $voidable % $volume; + } + + if ($volmulti > 0) { + TransRecord::addItem($upc, $row["description"], $row["trans_type"], $row["trans_subtype"], "V", $row["department"], -1* $volmulti, $VolSpecial, -1 * $volmulti * $VolSpecial, $VolSpecial, 0, $row["tax"], $foodstamp, $discount, $memDiscount, $discountable, $discounttype, -1 * $volmulti * $volume, $volDiscType, $volume, $VolSpecial, $mixMatch, -1 * $volume * $volmulti, 1, $cost, $numflag, $charflag); + $quantity = $vmremainder; + } + if ($vmremainder > $mmremainder) { + $voladj = $row["VolSpecial"] - ($unitPrice * ($volume - 1)); + TransRecord::addItem($upc, $row["description"], $row["trans_type"], $row["trans_subtype"], "V", $row["department"], -1, $voladj, -1 * $voladj, $voladj, 0, $row["tax"], $foodstamp, $discount, $memDiscount, $discountable, $discounttype, -1, $volDiscType, $volume, $VolSpecial, $mixMatch, -1 * $volume, 1, $cost, $numflag, $charflag); + $quantity = $quantity - 1; + } + } + + $quantity = -1 * $quantity; + $total = $quantity * $unitPrice; + if ($row['unitPrice'] == 0) $total = $quantity * $row['total']; + else if ($row['total'] != $total) $total = -1*$row['total']; + + $CardNo = $CORE_LOCAL->get("memberID"); + + $discounttype = MiscLib::nullwrap($row["discounttype"]); + if ($discounttype == 3) + $quantity = -1 * $ItemQtty; + + if ($CORE_LOCAL->get("tenderTotal") < 0 && $foodstamp == 1 && + (-1 * $total) > $CORE_LOCAL->get("fsEligible")) { + return DisplayLib::boxMsg(_("Item already paid for")); + } + elseif ($CORE_LOCAL->get("tenderTotal") < 0 && (-1 * $total) > + $CORE_LOCAL->get("runningTotal") - $CORE_LOCAL->get("taxTotal")) { + return DisplayLib::boxMsg(_("Item already paid for")); + } + elseif ($quantity != 0) { + $update = "update localtemptrans set voided = 1 where trans_id = ".$item_num; + $db->query($update); + TransRecord::addItem($upc, $row["description"], $row["trans_type"], $row["trans_subtype"], "V", $row["department"], $quantity, $unitPrice, $total, $row["regPrice"], $scale, $row["tax"], $foodstamp, $discount, $memDiscount, $discountable, $discounttype, $quantity, $volDiscType, $volume, $VolSpecial, $mixMatch, 0, 1, $cost, $numflag, $charflag); + + if ($row["trans_type"] != "T") { + $CORE_LOCAL->set("ttlflag",0); + $CORE_LOCAL->set("discounttype",0); + } + + $db = Database::pDataConnect(); + $chk = $db->query("SELECT deposit FROM products WHERE upc='$upc'"); + if ($db->num_rows($chk) > 0){ + $dpt = array_pop($db->fetch_row($chk)); + if ($dpt <= 0) return ''; // no deposit found + $db = Database::tDataConnect(); + $dupc = str_pad((int)$dpt,13,'0',STR_PAD_LEFT); + $id = $db->query(sprintf("SELECT trans_id FROM localtemptrans + WHERE upc='%s' AND voided=0 AND quantity=%d", + $dupc,(-1*$quantity))); + if ($db->num_rows($id) > 0){ + $trans_id = array_pop($db->fetch_row($id)); + return $this->voidupc((-1*$quantity)."*".$dupc,$trans_id,True); + } + } + } + return ""; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>VD<i>ringable</i></td> + <td>Void <i>ringable</i>, which + may be a product number or an + open department ring</td> + </tr> + </table>"; + } +} + + +?> diff --git a/pos/is4c-nf/parser-class-lib/parse/Wakeup.php b/pos/is4c-nf/parser-class-lib/parse/Wakeup.php new file mode 100644 index 000000000..25b003fbd --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/parse/Wakeup.php @@ -0,0 +1,57 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Wakeup extends Parser { + function check($str){ + global $CORE_LOCAL; + if ($str == "WAKEUP"){ + return True; + } + return False; + } + + function parse($str){ + $ret = $this->default_json(); + $ret['udpmsg'] = 'rePoll'; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>WAKEUP</td> + <td>Try to coax a stuck scale back + into operation</td> + </tr> + <tr> + <td>WAKEUP2</td> + <td>Different method, same goal</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/CCMenu.php b/pos/is4c-nf/parser-class-lib/preparse/CCMenu.php new file mode 100755 index 000000000..594f29639 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/CCMenu.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CCMenu extends PreParser { + var $remainder; + + function check($str){ + global $CORE_LOCAL; + if ($str == "CC"){ + $this->remainder = "QM1"; + return True; + } + elseif ($str == "MANUALCC"){ + $this->remainder = ("".$CORE_LOCAL->get("runningTotal") * 100)."CC"; + return True; + } + return False; + } + + function parse($str){ + return $this->remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>discount</i>DI<i>item</i></td> + <td>Set a percent discount <i>discount</i> + for just one item <i>item</i></td> + </tr> + <tr> + <td><i>discount</i>PD<i>item</i></td> + <td>Same as DI above</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/CaseDiscount.php b/pos/is4c-nf/parser-class-lib/preparse/CaseDiscount.php new file mode 100644 index 000000000..ad8d12835 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/CaseDiscount.php @@ -0,0 +1,75 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CaseDiscount extends PreParser { + + function check($str){ + // force quantity == 1 + if (strstr($str,"CT") && !strstr($str,"*")) + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $split = explode("CT", $str); + $remainder = ""; + if (is_numeric($split[0]) && strlen($split[0] > 1) && strlen($split[1] > 1)){ + if ($split[0] != 5 && $split[0] != 10){ + $remainder = "cdinvalid"; + $CORE_LOCAL->set("casediscount",$split[0]); + } + elseif ($CORE_LOCAL->get("isStaff") == 1) + $remainder = "cdStaffNA"; + elseif ($CORE_LOCAL->get("SSI") == 1) + $remainder = "cdSSINA"; + elseif ($CORE_LOCAL->get("isMember") == 1){ + $CORE_LOCAL->set("casediscount",10); + $remainder = $split[1]; + } + elseif ($CORE_LOCAL->get("isMember") != 1){ + $CORE_LOCAL->set("casediscount",5); + $remainder = $split[1]; + } + } + return $remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>discount</i>CT<i>item</i></td> + <td>Sets case discount <i>discount</i> + for the item. <i>Discount</i> should be a + number, <i>item</i> can be any valid ring + (e.g., UPC or open-ring to a department). + </td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/NoReceiptPreParse.php b/pos/is4c-nf/parser-class-lib/preparse/NoReceiptPreParse.php new file mode 100755 index 000000000..36d78d6f4 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/NoReceiptPreParse.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class NoReceiptPreParse extends PreParser { + var $remainder; + + function check($str){ + if (substr($str,-2) == 'NR'){ + $this->remainder = substr($str,0,strlen($str)-2); + return True; + } + elseif (substr($str,0,2) == "NR"){ + $this->remainder = substr($str,2); + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $CORE_LOCAL->set('receiptToggle', 0); + return $this->remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>tender command</i>NR<i>item</i></td> + <td>Apply tender with receipt disabled</td> + </tr> + <tr> + <td>NR<i>tender command</i></td> + <td>Same as above</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/PercentDiscount.php b/pos/is4c-nf/parser-class-lib/preparse/PercentDiscount.php new file mode 100644 index 000000000..5c2ac84b8 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/PercentDiscount.php @@ -0,0 +1,70 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PercentDiscount extends PreParser { + var $remainder; + + function check($str){ + global $CORE_LOCAL; + if (strstr($str,"DI")){ + $split = explode("DI",$str); + if (is_numeric($split[0])){ + $this->remainder = $split[1]; + $CORE_LOCAL->set("itemPD",(int)$split[0]); + return True; + } + } + else if (strpos($str,"PD") > 0){ + $split = explode("PD",$str); + if (is_numeric($split[0]) && strlen($split[1]) > 0){ + $this->remainder = $split[1]; + $CORE_LOCAL->set("itemPD",(int)$split[0]); + return True; + } + } + return False; + } + + function parse($str){ + return $this->remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>discount</i>DI<i>item</i></td> + <td>Set a percent discount <i>discount</i> + for just one item <i>item</i></td> + </tr> + <tr> + <td><i>discount</i>PD<i>item</i></td> + <td>Same as DI above</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/Quantity.php b/pos/is4c-nf/parser-class-lib/preparse/Quantity.php new file mode 100644 index 000000000..dc76be2c7 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/Quantity.php @@ -0,0 +1,66 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Quantity extends PreParser { + + function check($str){ + if (strstr($str,"*")) + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + if (!strpos($str,"**") && strpos($str,"*") != 0 && + strpos($str,"*") != strlen($str)-1){ + $split = explode("*",$str); + if (is_numeric($split[0]) && + (strpos($split[1],"DP") || is_numeric($split[1]))){ + $CORE_LOCAL->set("quantity",$split[0]); + $CORE_LOCAL->set("multiple",1); + $str = $split[1]; + } + } + return $str; + } + + function isLast(){ + return True; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>number</i>*<i>item</i></td> + <td>Enter <i>item</i> <i>number</i> times + (e.g., 2*item to ring up two of the same + item)</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/Refund.php b/pos/is4c-nf/parser-class-lib/preparse/Refund.php new file mode 100644 index 000000000..a2d94f74c --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/Refund.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Refund extends PreParser { + + function check($str){ + if (substr($str,0,2) == "RF") + return True; + elseif (substr($str,-2) == "RF") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $remainder = ""; + if (substr($str,0,2) == "RF") + $remainder = substr($str,2); + else + $remainder = substr($str,0,-2); + $CORE_LOCAL->set("refund",1); + return $remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>RF<i>ringable</i> + OR <i>ringable</i>RF + </td> + <td>Refund the specified item(s). <i>Ringable + </i> can be a single UPC, an open-department + ring, or a multiple using *</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/ToggleTaxFSDisc.php b/pos/is4c-nf/parser-class-lib/preparse/ToggleTaxFSDisc.php new file mode 100644 index 000000000..a5c2d9516 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/ToggleTaxFSDisc.php @@ -0,0 +1,106 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class ToggleTaxFSDisc extends PreParser { + var $tfd; + var $remainder; + + var $TAX = 4; + var $FS = 2; + var $DISC = 1; + + // use bit-masks to determine the which toggles + // should be enabled + function check($str){ + global $CORE_LOCAL; + $this->tfd = 0; + if (substr($str,0,5) == "1TNFN" || substr($str,0,5) == "FN1TN"){ + $this->remainder = substr($str,5); + $this->tfd = $this->tfd | $this->TAX; + $this->tfd = $this->tfd | $this->FS; + return True; + } + elseif (substr($str,0,4) == "FNDN" || substr($str,0,4) == "DNFN"){ + $this->remainder = substr($str,4); + $this->tfd = $this->tfd | $this->DISC; + $this->tfd = $this->tfd | $this->FS; + return True; + } + elseif (substr($str,0,3) == "1TN"){ + $this->remainder = substr($str,3); + $this->tfd = $this->tfd | $this->TAX; + return True; + + } + elseif (substr($str,0,2) == "FN" && substr($str,2,2) != "TL"){ + $this->remainder = substr($str,2); + $this->tfd = $this->tfd | $this->FS; + return True; + } + elseif (substr($str,0,2) == "DN"){ + $this->remainder = substr($str,2); + $this->tfd = $this->tfd | $this->DISC; + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + if ($this->tfd & $this->TAX) + $CORE_LOCAL->set("toggletax",1); + if ($this->tfd & $this->FS) + $CORE_LOCAL->set("togglefoodstamp",1); + if ($this->tfd & $this->DISC) + $CORE_LOCAL->set("toggleDiscountable",1); + return $this->remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>1TN<i>ringable</i></td> + <td>Toggle tax setting for <i>ringable</i> + which may be an item or group of same items + using *</td> + </tr> + <tr> + <td>FN<i>ringable</i></td> + <td>Toggle foodstamp setting for <i>ringable</i> + which may be an item or group of same items + using *</td> + </tr> + <tr> + <td>DN<i>ringable</i></td> + <td>Toggle discount setting for <i>ringable</i> + which may be an item or group of same items + using *</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/parser-class-lib/preparse/WFCFixup.php b/pos/is4c-nf/parser-class-lib/preparse/WFCFixup.php new file mode 100755 index 000000000..9104597f4 --- /dev/null +++ b/pos/is4c-nf/parser-class-lib/preparse/WFCFixup.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class WFCFixup extends PreParser { + var $remainder; + + function check($str){ + global $CORE_LOCAL; + if (substr($str,-3) == "QK9"){ + $this->remainder = str_replace("QK9","QM9",$str); + return True; + } + elseif (substr($str,-4) == "QK10"){ + $this->remainder = str_replace("QK10","QM10",$str); + return True; + } + return False; + } + + function parse($str){ + return $this->remainder; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>discount</i>DI<i>item</i></td> + <td>Set a percent discount <i>discount</i> + for just one item <i>item</i></td> + </tr> + <tr> + <td><i>discount</i>PD<i>item</i></td> + <td>Same as DI above</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/AllItemSearch/AllItemProductSearch.php b/pos/is4c-nf/plugins/AllItemSearch/AllItemProductSearch.php new file mode 100644 index 000000000..35ce6078b --- /dev/null +++ b/pos/is4c-nf/plugins/AllItemSearch/AllItemProductSearch.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op. + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AllItemProductSearch extends ProductSearch { + + public function search($str){ + $ret = array(); + $sql = Database::pDataConnect(); + $query = "select upc, description, normal_price, special_price, " + ."advertised, scale from products where " + ."description like '%".$str."%' " + ."and inUse='1' " + ."order by description"; + $result = $sql->query($query); + while($row = $sql->fetch_row($result)){ + $ret[$row['upc']] = $row; + } + return $ret; + } +} + +?> diff --git a/pos/is4c-nf/plugins/AllItemSearch/AllItemSearch.php b/pos/is4c-nf/plugins/AllItemSearch/AllItemSearch.php new file mode 100644 index 000000000..d6f4d1e31 --- /dev/null +++ b/pos/is4c-nf/plugins/AllItemSearch/AllItemSearch.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AllItemSearch extends Plugin { + + public $plugin_settings = array( + ); + + public $plugin_description = 'Include all items in product searches instead of + just PLU items'; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFoodstampTotal.php b/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFoodstampTotal.php new file mode 100644 index 000000000..1aaa1e6b7 --- /dev/null +++ b/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFoodstampTotal.php @@ -0,0 +1,33 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AlwaysFoodstampTotal extends Plugin { + + public $plugin_description = 'Always display foodstamp total. Provides + two new footer boxes. AlwaysFsTotalFooter should probably + replace the defaultMultiTotal to show Total/Due/Change. + AlwaysFsEligibleFooter can go in one of the other slots + to show the foodstamp eligible total.'; + + public $plugin_settings = array(); +} diff --git a/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFsEligibleFooter.php b/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFsEligibleFooter.php new file mode 100644 index 000000000..c56caec4f --- /dev/null +++ b/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFsEligibleFooter.php @@ -0,0 +1,50 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AlwaysFsEligibleFooter extends FooterBox { + + public $header_css_class = 'fsLine'; + public $display_css_class = 'fsLine'; + + function AlwaysFsEligibleFooter() { + global $CORE_LOCAL; + if ($CORE_LOCAL->get('fntlflag') == 0 && $CORE_LOCAL->get('End') != 1){ + $CORE_LOCAL->set("fntlflag",1); + Database::setglobalvalue("FntlFlag", 1); + } + } + + function header_content(){ + global $CORE_LOCAL; + return _("FS Eligible"); + } + + function display_content(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get('End') != 1) + return number_format((double)$CORE_LOCAL->get("fsEligible"),2); + else + return '0.00'; + } + +} diff --git a/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFsTotalFooter.php b/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFsTotalFooter.php new file mode 100644 index 000000000..eadf3a9b1 --- /dev/null +++ b/pos/is4c-nf/plugins/AlwaysFoodstampTotal/AlwaysFsTotalFooter.php @@ -0,0 +1,61 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AlwaysFsTotalFooter extends FooterBox { + + public $display_css = "font-weight:bold;font-size:150%;"; + + function header_content(){ + global $CORE_LOCAL; + if ( $CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") != 1 ) { + $this->header_css_class = 'errorColoredArea'; + return _("Amount Due"); + } + elseif ($CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") == 1 ) { + $this->header_css_class = 'coloredArea'; + return _("Change"); + } + else { + $this->header_css_class = 'totalArea'; + return _("Total"); + } + } + + function display_content(){ + global $CORE_LOCAL; + if ( $CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") != 1 ) { + $this->display_css_class = 'errorColoredText'; + return number_format($CORE_LOCAL->get("runningTotal"),2); + } + elseif ($CORE_LOCAL->get("ttlflag") == 1 and $CORE_LOCAL->get("End") == 1 ) { + $this->display_css_class = 'coloredText'; + return number_format($CORE_LOCAL->get("runningTotal"),2); + } + else { + $this->display_css_class = 'totalLine'; + return number_format((double)$CORE_LOCAL->get("runningTotal"),2); + } + } +} + +?> diff --git a/pos/is4c-nf/plugins/AnnualMeeting/AnnualMeeting.php b/pos/is4c-nf/plugins/AnnualMeeting/AnnualMeeting.php new file mode 100644 index 000000000..bc3457d0f --- /dev/null +++ b/pos/is4c-nf/plugins/AnnualMeeting/AnnualMeeting.php @@ -0,0 +1,29 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AnnualMeeting extends Plugin { + + public $plugin_description = 'Support for WFC Annual Meeting signup at POS'; + + public $plugin_settings = array(); +} diff --git a/pos/is4c-nf/plugins/AnnualMeeting/AnnualMeetingParser.php b/pos/is4c-nf/plugins/AnnualMeeting/AnnualMeetingParser.php new file mode 100644 index 000000000..3e543ee77 --- /dev/null +++ b/pos/is4c-nf/plugins/AnnualMeeting/AnnualMeetingParser.php @@ -0,0 +1,89 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class AnnualMeetingParser extends Parser { + + var $plus = array('1042','1041'); + var $descriptions = array( + '1042' => 'OWNER MEAL', + '1041' => 'GUEST MEAL' + ); + + function check($str){ + if (strlen($str) < 4) return False; + $plu = substr($str,0,4); + if (in_array($plu, $this->plus)){ + if (strlen($str)==4) + return True; + elseif(strtoupper($str[4])=='M') + return True; + elseif(strtoupper($str[4])=='V') + return True; + elseif(strtoupper($str[4])=='K') + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if (strlen($str)==4){ + $CORE_LOCAL->set('qmInput',$str); + $desc = $this->descriptions[$str]; + $opts = array( + $desc.' (Meat)' => 'M', + $desc.' (Veg)' => 'V' + ); + if ($str == 1041){ + $opts[$desc.' (Kids)'] = 'K'; + } + $CORE_LOCAL->set('qmNumber', $opts); + $plugin_info = new QuickMenus(); + $ret['main_frame'] = $plugin_info->plugin_url().'/QMDisplay.php'; + return $ret; + } + else { + $flag = strtoupper($str[4]); + $plu = substr($str,0,4); + $price = ($flag == 'K') ? 5.00 : 20.00; + TransRecord::addItem( + str_pad($plu,13,'0',STR_PAD_LEFT), + $this->descriptions[$plu].' ('.$flag.')', + 'I','','', + 235, 1.0, + $price, $price, $price, + 0, 0, 0, + 0.00, 0.00, + 0, 0, + 1.0, 0, 0, 0.00, + 0, 0, 0, + 0.00, 0, $flag + ); + $ret['output'] = DisplayLib::lastpage(); + $ret['redraw_footer'] = True; + return $ret; + } + } + +} diff --git a/pos/is4c-nf/plugins/CashDrop/CashDrop.php b/pos/is4c-nf/plugins/CashDrop/CashDrop.php new file mode 100644 index 000000000..00cccaffc --- /dev/null +++ b/pos/is4c-nf/plugins/CashDrop/CashDrop.php @@ -0,0 +1,41 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CashDrop extends Plugin { + + public $plugin_settings = array( + 'cashDropThreshold' => array( + 'default' => '500', + 'label' => 'Threshold', + 'description' => 'Prompt for cashdrop when drawer has gained this much' + ) + ); + + public $plugin_description = 'Track cash in drawer. Trigger cash drop prompt when + amount surpasses threshold value'; + + public function plugin_transaction_reset(){ + global $CORE_LOCAL; + $CORE_LOCAL->set('cashDropWarned',False); + } +} diff --git a/pos/is4c-nf/plugins/CashDrop/CashDropParser.php b/pos/is4c-nf/plugins/CashDrop/CashDropParser.php new file mode 100644 index 000000000..3d9b20965 --- /dev/null +++ b/pos/is4c-nf/plugins/CashDrop/CashDropParser.php @@ -0,0 +1,65 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CashDropParser extends Parser { + + function check($str){ + if (substr($str,0,8) == 'DROPDROP'){ + return True; + } + else if (substr($str,0,4) == 'DROP' && is_numeric(substr($str,4))){ + return True; + } + else if (substr($str,-4) == 'DROP' && is_numeric(substr($str,0,strlen($str)-4))){ + return True; + } + else{ + return False; + } + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + if (substr($str,0,8) == 'DROPDROP'){ + // go to warning page. save input. + $CORE_LOCAL->set('cashDropSaveInput',substr($str,8)); + $plugin_info = new CashDrop(); + $ret['main_frame'] = $plugin_info->plugin_url().'/CashDropWarningPage.php'; + return $ret; + } + else { + // add drop record to transaction + $amt = 0; + if (substr($str,0,4) == 'DROP') + $amt = substr($str,4); + else + $amt = substr($str,0,strlen($str)-4); + TransRecord::addItem('CASHDROP', 'CASHDROP', "L", 'CA', '', + 0, 0, 0, ($amt/100.00), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, ''); + $ret['main_frame'] = MiscLib::base_url()."gui-modules/pos2.php"; + return $ret; + } + } +} diff --git a/pos/is4c-nf/plugins/CashDrop/CashDropPreParser.php b/pos/is4c-nf/plugins/CashDrop/CashDropPreParser.php new file mode 100644 index 000000000..44c01310a --- /dev/null +++ b/pos/is4c-nf/plugins/CashDrop/CashDropPreParser.php @@ -0,0 +1,57 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class CashDropPreParser extends PreParser { + + function check($str){ + global $CORE_LOCAL; + // only check & warn once per transaction + if ($CORE_LOCAL->get('cashDropWarned') == True) return False; + + // checking one time + $CORE_LOCAL->set('cashDropWarned',True); + + // cannot check in standalone + if ($CORE_LOCAL->get('standalone') == 1) return False; + + // lookup cashier total + $db = Database::mDataConnect(); + $q = sprintf("SELECT sum(-total) FROM dtransactions WHERE + trans_subtype='CA' AND trans_status <> 'X' AND emp_no=%d", + $CORE_LOCAL->get('CashierNo')); + $r = $db->query($q); + $ttl = 0; + if ($db->num_rows($r) > 0) + $ttl = array_pop($db->fetch_row($r)); + + if ($ttl > $CORE_LOCAL->get('cashDropThreshold')) + return True; + else + return False; + } + + function parse($str){ + // modify input to trigger CashDropParser + return 'DROPDROP'.$str; + } +} diff --git a/pos/is4c-nf/plugins/CashDrop/CashDropWarningPage.php b/pos/is4c-nf/plugins/CashDrop/CashDropWarningPage.php new file mode 100644 index 000000000..a8a1a5eb4 --- /dev/null +++ b/pos/is4c-nf/plugins/CashDrop/CashDropWarningPage.php @@ -0,0 +1,66 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../lib/AutoLoader.php'); + +class CashDropWarningPage extends InputPage { + + function preprocess(){ + global $CORE_LOCAL; + if (isset($_REQUEST['reginput'])){ + $in = strtoupper($_REQUEST['reginput']); + if ($in != '' && $in != 'CL') return True; + + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$CORE_LOCAL->get('cashDropSaveInput')); + $CORE_LOCAL->set('cashDropSaveInput',''); + + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + return True; + } + + function body_content(){ + global $CORE_LOCAL; + echo '<div class="baseHeight">'; + $ret = "<div id=\"boxMsg\" style=\"background:red;\" + class=\"centeredDisplay\">"; + $ret .= "<div class=\"boxMsgAlert coloredArea\">"; + $ret .= $CORE_LOCAL->get("alertBar"); + $ret .= "</div>"; + $ret .= "<div class=\"boxMsgBody\">"; + $ret .= "<div class=\"msgicon\"></div>"; + $ret .= "<div class=\"msgtext\">"; + $ret .= '1.83 jigawatts'; + $ret .= "</div><div class=\"clear\"></div></div>"; + $ret .= "</div>"; + echo $ret; + echo "</div>"; + } // END body_content() FUNCTION +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new CashDropWarningPage(); + +?> diff --git a/pos/is4c-nf/plugins/MemberCard/MemberBarcode.php b/pos/is4c-nf/plugins/MemberCard/MemberBarcode.php new file mode 100644 index 000000000..723b25550 --- /dev/null +++ b/pos/is4c-nf/plugins/MemberCard/MemberBarcode.php @@ -0,0 +1,63 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class MemberBarcode + WFC barcoded member ID implementation + + Checks for UPC prefix specified + by memberUpcPrefix in $CORE_LOCAL. + + Looks up member number via memberCards table +*/ +class MemberBarcode extends SpecialUPC { + + function is_special($upc){ + global $CORE_LOCAL; + $prefix = $CORE_LOCAL->get("memberUpcPrefix"); + if (substr($upc,0,strlen($prefix)) == $prefix) + return true; + + return false; + } + + function handle($upc,$json){ + global $CORE_LOCAL; + + $db = Database::pDataConnect(); + $query = "select card_no from memberCards where upc='$upc'"; + $result = $db->query($query); + + if ($db->num_rows($result) < 1){ + $json['output'] = DisplayLib::boxMsg(_("Card not assigned")); + return $json; + } + + $row = $db->fetch_array($result); + $CORE_LOCAL->set("memberCardUsed",1); + $json = PrehLib::memberID($row[0]); + return $json; + } +} + +?> diff --git a/pos/is4c-nf/plugins/MemberCard/MemberCard.php b/pos/is4c-nf/plugins/MemberCard/MemberCard.php new file mode 100644 index 000000000..57ba54914 --- /dev/null +++ b/pos/is4c-nf/plugins/MemberCard/MemberCard.php @@ -0,0 +1,45 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class MemberCard extends Plugin { + + public $plugin_settings = array( + 'memberUpcPrefix' => array( + 'default' => '', + 'label' => 'UPC Prefix', + 'description' => 'Barcode prefix for member cards (including leading zeroes)' + ) + ); + + public $plugin_description = 'Allows UPC based membercards. Set a prefix, load data into + the memberCards table, then just scan barcodes to use.'; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/NeedBasedDiscount/NeedBasedDiscount.php b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedBasedDiscount.php new file mode 100644 index 000000000..3f02d6084 --- /dev/null +++ b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedBasedDiscount.php @@ -0,0 +1,34 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class NeedBasedDiscount extends Plugin { + + public $plugin_settings = array(); + + function plugin_transaction_reset(){ + global $CORE_LOCAL; + $CORE_LOCAL->set('NeedDiscountFlag', 0); + } +} + +?> diff --git a/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountFooter.php b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountFooter.php new file mode 100644 index 000000000..4f44fc420 --- /dev/null +++ b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountFooter.php @@ -0,0 +1,46 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class NeedDiscountFooter extends TransPercentDiscount { + + function header_content(){ + global $CORE_LOCAL; + $percent = $CORE_LOCAL->get('percentDiscount'); + if ($CORE_LOCAL->get('NeedDiscountFlag')===1) + $percent += 5; + if ($percent == 0) + return _("% Discount"); + else + return $percent._("% Discount"); + } + + function display_content(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("transDiscount") != 0 ) + return number_format($CORE_LOCAL->get("transDiscount"), 2); + else + return "n/a"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountModule.php b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountModule.php new file mode 100644 index 000000000..820ba1503 --- /dev/null +++ b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountModule.php @@ -0,0 +1,36 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class NeedDiscountModule extends DiscountModule { + function calculate(){ + global $CORE_LOCAL; + $discount = parent::calculate(); + if ($CORE_LOCAL->get('NeedDiscountFlag')===1){ + $extra = 0.05 * $CORE_LOCAL->get('discountableTotal'); + $discount = MiscLib::truncate2($discount + $extra); + } + return $discount; + } +} + +?> diff --git a/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountParser.php b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountParser.php new file mode 100644 index 000000000..c26eedf24 --- /dev/null +++ b/pos/is4c-nf/plugins/NeedBasedDiscount/NeedDiscountParser.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +class NeedDiscountParser extends Parser { + function check($str){ + if ($str == "FF") return True; + else return False; + } + function parse($str){ + global $CORE_LOCAL; + $CORE_LOCAL->set('NeedDiscountFlag',1); + // add comment/informational line to transaction? + $ret = $this->default_json(); + // re-calculate the discount + Database::getsubtotals(); + // show new discount in footer + $ret['redraw_footer'] = True; + return $ret; + } +} +?> diff --git a/pos/is4c-nf/plugins/Paycards/.gitignore b/pos/is4c-nf/plugins/Paycards/.gitignore new file mode 100644 index 000000000..498f0105e --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/.gitignore @@ -0,0 +1 @@ +MercuryE2E.php diff --git a/pos/is4c-nf/plugins/Paycards/AuthorizeDotNet.php b/pos/is4c-nf/plugins/Paycards/AuthorizeDotNet.php new file mode 100755 index 000000000..beaf31205 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/AuthorizeDotNet.php @@ -0,0 +1,650 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("BasicCCModule")) include_once(realpath(dirname(__FILE__)."/BasicCCModule.php")); +if (!class_exists("xmlData")) include_once(realpath(dirname(__FILE__)."/lib/xmlData.php")); +if (!class_exists("PaycardLib")) include_once(realpath(dirname(__FILE__)."/lib/PaycardLib.php")); + +if (!isset($CORE_LOCAL)){ + include(realpath(dirname(__FILE__)."/lib/LS_Access.php")); + $CORE_LOCAL = new LS_Access(); +} + +if (!class_exists("AutoLoader")) include_once(realpath(dirname(__FILE__).'/../../lib/AutoLoader.php')); + +define('AUTHDOTNET_LOGIN','6Jc5c8QcB'); +define('AUTHDOTNET_TRANS_KEY','68j46u5S3RL4CCbX'); + +class AuthorizeDotNet extends BasicCCModule { + + function handlesType($type){ + if ($type == PaycardLib::PAYCARD_TYPE_CREDIT) return True; + else return False; + } + + function entered($validate,$json){ + global $CORE_LOCAL; + // error checks based on card type + if( $CORE_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + switch( $CORE_LOCAL->get("paycard_mode")) { + case PaycardLib::PAYCARD_MODE_VOID: + // use the card number to find the trans_id + $dbTrans = PaycardLib::paycard_db(); + $today = date('Ymd'); + $pan4 = substr($this->trans_pan['pan'],-4); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + $sql = "SELECT transID FROM efsnetRequest WHERE ".$dbTrans->identifier_escape('date')."='".$today."' AND (PAN LIKE '%".$pan4."') " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Card Not Used", + "That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Multiple Uses", + "That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = PaycardLib::paycard_db_fetch_row($search); + return $this->paycard_void($payment['transID'],$lane,$trans,$json); + + case PaycardLib::PAYCARD_MODE_AUTH: + if( $validate) { + if( PaycardLib::paycard_validNumber($this->trans_pan['pan']) != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Invalid Card Number", + "Swipe again or type in manually", + "[clear] to cancel"); + return $json; + } else if( PaycardLib::paycard_accepted($this->trans_pan['pan'], !PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_CREDIT)) != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Unsupported Card Type", + "We cannot process " . $CORE_LOCAL->get("paycard_issuer") . " cards", + "[clear] to cancel"); + return $json; + } else if( PaycardLib::paycard_validExpiration($CORE_LOCAL->get("paycard_exp")) != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Invalid Expiration Date", + "The expiration date has passed or was not recognized", + "[clear] to cancel"); + return $json; + } + } + // set initial variables + //getsubtotals(); + $CORE_LOCAL->set("paycard_amount",$CORE_LOCAL->get("amtdue")); + $CORE_LOCAL->set("paycard_id",$CORE_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgAuth.php'; + return $json; + break; + } // switch mode + + // if we're still here, it's an error + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Invalid Mode", + "This card type does not support that processing mode","[clear] to cancel"); + return $json; + } + + function paycard_void($transID,$laneNo=-1,$transNo=-1,$json=array()) { + global $CORE_LOCAL; + // situation checking + if( $CORE_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = PaycardLib::paycard_db(); + $today = date('Ymd'); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + if ($laneNo != -1) $lane = $laneNo; + if ($transNo != -1) $trans = $transNo; + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount,name FROM efsnetRequest + WHERE ".$dbTrans->identifier_escape('date')."='".$today."' AND cashierNo=".$cashier." + AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = PaycardLib::paycard_db_fetch_row($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xResponseCode, + xTransactionID FROM efsnetResponse WHERE ".$dbTrans->identifier_escape('date')."='".$today."' + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM efsnetRequestMod WHERE " + .$dbTrans->identifier_escape('date')."=".$today + ." AND cashierNo=".$cashier." AND laneNo=".$lane + ." AND transNo=".$trans." AND transID=".$transID + ." AND mode='void' AND xResponseCode=0"; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $voided = PaycardLib::paycard_db_num_rows($search); + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = PaycardLib::paycard_db_fetch_row($search); + + // make sure the payment is applicable to void + if( $response['commErr'] != 0 || $response['httpCode'] != 200 || $response['validResponse'] != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $voided > 0) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } else if( $request['live'] != PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_CREDIT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xResponseCode'] != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Credit card transaction not approved<br>The result code was " . $response['xResponseCode'],"[clear] to cancel"); + return $json; + } else if( $response['xTransactionID'] < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Invalid reference number","[clear] to cancel"); + return $json; + } + + // make sure the tender line-item is applicable to void + if( $lineitem['trans_type'] != "T" || $lineitem['trans_subtype'] != "CC" ){ + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Authorization and tender records do not match $transID","[clear] to cancel"); + return $json; + } else if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $CORE_LOCAL->set("paycard_amount",(($request['mode']=='refund') ? -1 : 1) * $request['amount']); + $CORE_LOCAL->set("paycard_id",$transID); + $CORE_LOCAL->set("paycard_type",PaycardLib::PAYCARD_TYPE_CREDIT); + $CORE_LOCAL->set("paycard_mode",PaycardLib::PAYCARD_MODE_VOID); + $CORE_LOCAL->set("paycard_name",$request["name"]); + + // display FEC code box + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgVoid.php'; + return $json; + } + + function handleResponse($authResult){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_AUTH: + return $this->handleResponseAuth($authResult); + case PaycardLib::PAYCARD_MODE_VOID: + return $this->handleResponseVoid($authResult); + } + } + + function handleResponseAuth($authResult){ + global $CORE_LOCAL; + $xml = new xmlData($authResult['response']); + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $dbTrans = PaycardLib::paycard_db(); + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime'). + ",seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s',", $now ) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + $validResponse = ($xml->isValid()) ? 1 : 0; + + $refNum = $xml->get("USERREF"); + if ($refNum){ + $sqlColumns .= ",refNum"; + $sqlValues .= sprintf(",'%s'",$refNum); + } + $responseCode = $xml->get("RESPONSECODE"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + $resultCode = $xml->get_first("CODE"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("DESCRIPTION"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $sqlValues .= sprintf(",'%s'",$resultMsg); + } + $xTransID = $xml->get("TRANSID"); + if ($xTransID){ + $sqlColumns .= ",xTransactionID"; + $sqlValues .= sprintf(",'%s'",$xTransID); + } + else $validResponse = -3; + $apprNumber = $xml->get("AUTHCODE"); + if ($apprNumber){ + $sqlColumns .= ",xApprovalNumber"; + $sqlValues .= sprintf(",'%s'",$apprNumber); + } + else $validResponse = -3; + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $sql = "INSERT INTO efsnetResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + PaycardLib::paycard_db_query($sql, $dbTrans); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); + } + + switch ($xml->get("RESPONSECODE")){ + case 1: // APPROVED + $CORE_LOCAL->set("ccTermOut","approval:".str_pad($xml->get("AUTH_CODE"),6,'0',STR_PAD_RIGHT)); + return PaycardLib::PAYCARD_ERR_OK; + case 2: // DECLINED + $CORE_LOCAL->set("ccTermOut","approval:denied"); + $CORE_LOCAL->set("boxMsg","Transaction declined"); + if ($xml->get_first("ERRORCODE") == 4) + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL.get("boxMsg")."<br />Pick up card)"); + break; + case 3: // ERROR + $CORE_LOCAL->set("ccTermOut","resettotal"); + $CORE_LOCAL->set("boxMsg",""); + $codes = $xml->get("ERRORCODE"); + $texts = $xml->get("ERRORTEXT"); + if (!is_array($codes)) + $CORE_LOCAL->set("boxMsg","EC$codes: $texts"); + else{ + for($i=0; $i<count($codes);$i++){ + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."EC".$codes[$i].": ".$texts[$i]); + if ($i != count($codes)-1) + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<br />"); + } + } + break; + default: + $CORE_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PaycardLib::PAYCARD_ERROR_PROC; + } + + function handleResponseVoid($authResult){ + global $CORE_LOCAL; + $xml = new xmlData($authResult['response']); + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + + // prepare some fields to store the request and the parsed response; we'll add more as we verify it + $dbTrans = PaycardLib::paycard_db(); + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID,". + $dbTrans->identifier_escape('datetime'). + ",origAmount,mode,altRoute," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("%s,'%s',%d,", $amountText, "VOID", 0) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + + $refNum = $xml->get("USERREF"); + if ($refNum){ + $sqlColumns .= ",origRefNum"; + $sqlValues .= sprintf(",'%s'",$refNum); + } + $responseCode = $xml->get("RESPONSECODE"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + $resultCode = $xml->get_first("CODE"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("DESCRIPTION"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $sqlValues .= sprintf(",'%s'",$resultMsg); + } + $refID = $xml->get("REFTRANSID"); + if ($refID){ + $sqlColumns .= ",origTransactionID"; + $sqlValues .= sprintf(",'%s'",$refID); + } + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $sql = "INSERT INTO efsnetRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + PaycardLib::paycard_db_query($sql, $dbTrans); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); + } + + switch ($xml->get("RESPONSECODE")){ + case 1: // APPROVED + return PaycardLib::PAYCARD_ERR_OK; + case 2: // DECLINED + $CORE_LOCAL->set("boxMsg","Transaction declined"); + if ($xml->get_first("ERRORCODE") == 4) + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<br />Pick up card"); + break; + case 3: // ERROR + $CORE_LOCAL->set("boxMsg",""); + $codes = $xml->get("ERRORCODE"); + $texts = $xml->get("ERRORTEXT"); + if (!is_array($codes)) + $CORE_LOCAL->set("boxMsg","EC$codes: $texts"); + else{ + for($i=0; $i<count($codes);$i++){ + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."EC".$codes[$i].": ".$texts[$i]); + if ($i != count($codes)-1) + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<br />"); + } + } + break; + default: + $CORE_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PaycardLib::PAYCARD_ERROR_PROC; + } + + function cleanup($json){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_AUTH: + // cast to string. tender function expects string input + // numeric input screws up parsing on negative values > $0.99 + $amt = "".($CORE_LOCAL->get("paycard_amount")*100); + PrehLib::tender("CC", $amt); + $CORE_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Please verify cardholder signature<p>[enter] to continue<br>\"rp\" to reprint slip<br>[clear] to cancel and void</font>"); + break; + case PaycardLib::PAYCARD_MODE_VOID: + $v = new Void(); + $v->voidid($CORE_LOCAL->get("paycard_id")); + $CORE_LOCAL->set("boxMsg","<b>Voided</b><p><font size=-1>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + $CORE_LOCAL->set("ccCustCopy",0); + if ($CORE_LOCAL->get("SigCapture") == "" && $CORE_LOCAL->get("paycard_amount") > $CORE_LOCAL->get("CCSigLimit")) + $json['receipt'] = "ccSlip"; + return $json; + } + + function doSend($type){ + switch($type){ + case PaycardLib::PAYCARD_MODE_AUTH: return $this->send_auth(); + case PaycardLib::PAYCARD_MODE_VOID: return $this->send_void(); + default: + PaycardLib::paycard_reset(); + return $this->setErrorMsg(0); + } + } + + function send_auth(){ + global $CORE_LOCAL; + // initialize + $dbTrans = PaycardLib::paycard_db(); + if( !$dbTrans){ + PaycardLib::paycard_reset(); + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + } + + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = (($amount < 0) ? 'refund' : 'tender'); + $manual = ($CORE_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $this->trans_pan['pan']; + $cardPANmasked = PaycardLib::paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $CORE_LOCAL->get("paycard_issuer"); + $cardExM = substr($CORE_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($CORE_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $this->trans_pan['tr1']; + $cardTr2 = $this->trans_pan['tr2']; + $cardName = $CORE_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + + // x_login & x_tran_key need to be + // filled in to work + $postValues = array( + "x_login" => AUTHDOTNET_LOGIN, + "x_tran_key" => AUTHDOTNET_TRANS_KEY, + "x_market_type" => "2", + "x_device_type" => "5", + "cp_version" => "1.0", + "x_test_request"=> "0", + "x_amount" => $amount, + "x_user_ref" => $refNum + ); + if ($CORE_LOCAL->get("training") == 1) + $postValues["x_test_request"] = "1"; + + if ($mode == "refund") + $postValues["x_type"] = "CREDIT"; + else + $postValues["x_type"] = "AUTH_CAPTURE"; + + $sqlCols = "sentPAN,sentExp,sentTr1,sentTr2"; + $sqlVals = ""; + if ((!$cardTr1 && !$cardTr2) || $mode == "refund"){ + $postValues["x_card_num"] = $cardPAN; + $postValues["x_exp_date"] = $cardExM.$cardExY; + $sqlVals = "1,1,0,0"; + } + elseif ($cardTr1){ + $postValues["x_track1"] = $cardTr1; + $sqlVals = "0,0,1,0"; + } + elseif ($cardTr2){ + $postValues["x_track2"] = $cardTr2; + $sqlVals = "0,0,0,1"; + } + + // store request in the database before sending it + $sqlCols .= "," . // already defined some sent* columns + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",refNum,live,mode,amount," . + "PAN,issuer,manual,name"; + $sqlVals .= "," . // already defined some sent* values + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',%d,'%s',%s,", $now, $refNum, $live, $mode, $amountText) . + sprintf("'%s','%s',%d,'%s'", $cardPANmasked, $cardIssuer, $manual, $name); + $sql = "INSERT INTO efsnetRequest (" . $sqlCols . ") VALUES (" . $sqlVals . ")"; + + if( !PaycardLib::paycard_db_query($sql, $dbTrans) ) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + $postData = $this->array2post($postValues); + $this->GATEWAY = "https://test.authorize.net/gateway/transact.dll"; + return $this->curlSend($postData,'POST',False); + } + + function send_void(){ + global $CORE_LOCAL; + // initialize + $dbTrans = PaycardLib::paycard_db(); + if( !$dbTrans){ + PaycardLib::paycard_reset(); + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); + } + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // new timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $manual = ($CORE_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $this->trans_pan['pan']; + $cardPANmasked = PaycardLib::paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $CORE_LOCAL->get("paycard_issuer"); + $cardExM = substr($CORE_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($CORE_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $this->trans_pan['tr1']; + $cardTr2 = $this->trans_pan['tr2']; + $cardName = $CORE_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + + // x_login and x_tran_key need to + // be filled in to work + $postValues = array( + "x_login" => AUTHDOTNET_LOGIN, + "x_tran_key" => AUTHDOTNET_TRANS_KEY, + "x_market_type" => "2", + "x_device_type" => "5", + "cp_version" => "1.0", + "x_text_request"=> "1", + "x_amount" => $amount, + "x_user_ref" => $refNum, + "x_type" => "VOID", + "x_card_num" => $cardPAN, + "x_exp_date" => $cardExM.$cardExY + ); + + // look up the TransactionID from the original response (card number and amount should already be in session vars) + $sql = "SELECT xTransactionID FROM efsnetResponse WHERE ".$dbTrans->identifier_escape('date')."='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND transNo=".$transNo." AND transID=".$transID; + $result = PaycardLib::paycard_db_query($sql, $dbTrans); + if( !$result || PaycardLib::paycard_db_num_rows($result) != 1) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); + $res = PaycardLib::paycard_db_fetch_row($result); + $TransactionID = $res['xTransactionID']; + + $postValues["x_ref_trans_id"] = $TransactionID; + + $postData = $this->array2post($postValues); + $this->GATEWAY = "https://test.authorize.net/gateway/transact.dll"; + return $this->curlSend($postData,'POST',False); + } +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/BasicCCModule.php b/pos/is4c-nf/plugins/Paycards/BasicCCModule.php new file mode 100755 index 000000000..b7db83eaa --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/BasicCCModule.php @@ -0,0 +1,399 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class BasicCCModule + Generic Credit Card processing module + + All payment processing modules should descend + from this class. Required methods are: + - handlesType() + - doSend() + - cleanup() + + Additionally, while they technically may be + omitted in the subclass, it is strongly + recommended that module implement its own: + - entered() + - paycard_void() + + The rest is utility methods that are often helpful. + */ + +if (!class_exists("PaycardLib")) include_once(realpath(dirname(__FILE__)."/lib/paycardLib.php")); +if (!isset($CORE_LOCAL)){ + include_once(realpath(dirname(__FILE__)."/lib/LS_Access.php")); + $CORE_LOCAL = new LS_Access(); +} + +define("LOCAL_CERT_PATH",realpath(dirname(__FILE__)).'/cacert.pem'); + +class BasicCCModule { + + /** + Constructor + takes no arguments + otherwise, do whatever you want here + */ + function BasicCCModule(){ + + } + + // BEGIN INTERFACE METHODS + + /** + Check whether module handles this paycard type + @param $type the type + @return True or False + + Type constants are defined in paycardLib.php. + */ + function handlesType($type){ + return False; + } + + /** + Set up transaction and validate if desired + @param $validate boolean + @param $json A keyed array + @return An array see Parser::default_json() + for formatting. + + This function typically does some validation + and sets some values in the session. + + If you have 'output' defined in the return + array, that gets shown as an error message. + If you set a URL in 'main_frame', POS + might go there but it's not guaranteed. + */ + function entered($validate,$json){ + if(!isset($json['output'])) $json['output'] = ''; + if(!isset($json['main_frame'])) $json['main_frame'] = False; + return $json; + } + + /** + Process the paycard request and return + an error value as defined in paycardLib.php. + @param $type paycard type + @return + - On success, return PaycardLib::PAYCARD_ERR_OK. + - On failure, return anything else and set any + error messages to be displayed in + $CORE_LOCAL->["boxMsg"]. + + This function should submit a request to the + gateway and process the result. By convention + credit card request and response info is stored + in the efsnet* tables and gift card request and + response info is stored in the valutec* tables. + + <b>Do not store full card number when logging + request and response info</b>. + */ + function doSend($type){ + return $this->setErrorMsg(0); + } + + /** + This function is called when doSend() returns + PaycardLib::PAYCARD_ERR_OK. + + I use it for tendering, printing + receipts, etc, but it's really only for code + cleanliness. You could leave this as is and + do all the everything inside doSend() + */ + function cleanup($json){ + + } + + /** + Validation and setup for void transactions + @param $transID original transaction ID + @param $laneNo original transaction laneNo value + @param $transNo original transaction transNo value + @param $json keyed array + @return An array see Parser::default_json() for + formatting + + This function is similar to entered(). Typically + with a void there is additional validation to + check the status of the original transaction before + proceeding. + */ + function paycard_void($transID, $laneNo=-1, $transNo=-1, $json=array()){ + if(!isset($json['output'])) $json['output'] = ''; + if(!isset($json['main_frame'])) $json['main_frame'] = False; + return $json; + } + + // END INTERFACE METHODS + + // These are utility methods I found useful + // in implementing subclasses + // They don't need to be defined or used. Any class + // that implements the interface methods above + // will work modularly + + protected $GATEWAY; + protected $SOAPACTION; + + /** + Send a curl request with the specified data. + @param $data string of data + @param $type 'GET', 'POST', or 'SOAP' + @param $xml True or False + @return integer error code + + The url should be specified in $this->GATEWAY. + SOAP requests should aso set $this->$SOAPACTION. + + Data is usually a string of XML or an HTTP + argument like key1=val1&key2=val2... + Setting xml to True adds an content-type header + + This function calls the handleResponse method + and returns the result of that call. + */ + function curlSend($data=False,$type='POST',$xml=False){ + global $CORE_LOCAL; + if($data && $type == 'GET') + $this->GATEWAY .= $data; + + $curl_handle = curl_init($this->GATEWAY); + + curl_setopt($curl_handle, CURLOPT_HEADER, 0); + curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,15); + curl_setopt($curl_handle, CURLOPT_FAILONERROR,false); + curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,false); + curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT,true); + curl_setopt($curl_handle, CURLOPT_TIMEOUT,30); + curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + if($CORE_LOCAL->get("OS")=="win32") + curl_setopt($curl_handle, CURLOPT_CAINFO, LOCAL_CERT_PATH); + if ($type == 'SOAP'){ + curl_setopt($curl_handle, CURLOPT_HTTPHEADER, + array("SOAPAction: ".$this->SOAPACTION, + "Content-type: text/xml")); + } + elseif ($xml){ + curl_setopt($curl_handle, CURLOPT_HTTPHEADER, + array("Content-type: text/xml")); + } + + if ($data && ($type == 'POST' || $type == 'SOAP')) + curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data); + + set_time_limit(60); + + $response = curl_exec($curl_handle); + + // request sent; get rid of PAN info + $this->setPAN(array()); + + if ($type == "SOAP"){ + $response = str_replace("&lt;","<",$response); + $response = str_replace("&gt;",">",$response); + } + + $funcReturn = array( + 'curlErr' => curl_errno($curl_handle), + 'curlErrText' => curl_error($curl_handle), + 'curlTime' => curl_getinfo($curl_handle, + CURLINFO_TOTAL_TIME), + 'curlHTTP' => curl_getinfo($curl_handle, + CURLINFO_HTTP_CODE), + 'response' => $response + ); + + curl_close($curl_handle); + + return $this->handleResponse($funcReturn); + } + + /** + Processes data fetched by $this->curlSend() + @param $response is a keyed array with: + - curlErr cURL error code + - curlErrText cURL error message + - curlTime time spent fetching response + - curlHTTP response HTTP code + - response is the actual text result + @return An error code. Constants are specified + in paycardLib.php. PaycardLib::PAYCARD_ERR_OK should be + return on success. + */ + function handleResponse($response){ + return False; + } + + /** + Create a reference number from + session variables. + @param $transID current trans_id in localtemptrans + @return A string CCCCLLNNNIII where + - CCCC is cashier number + - LL is lane number + - NNN is transaction number + - III is transaction ID + */ + function refnum($transID){ + global $CORE_LOCAL; + $transNo = (int)$CORE_LOCAL->get("transno"); + $cashierNo = (int)$CORE_LOCAL->get("CashierNo"); + $laneNo = (int)$CORE_LOCAL->get("laneno"); + // fail if any field is too long (we don't want to truncate, since that might produce a non-unique refnum and cause bigger problems) + if( $transID > 999 || $transNo > 999 || $laneNo > 99 || $cashierNo > 9999) + return ""; + // assemble string + $ref = ""; + $ref .= str_pad($cashierNo, 4, "0", STR_PAD_LEFT); + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } + + /** + urlencodes the given array for use with curl + @param $parray keyed array + @return formatted string + */ + function array2post($parray){ + $postData = ""; + foreach($parray as $k=>$v) + $postData .= "$k=".urlencode($v)."&"; + $postData = rtrim($postData,"&"); + return $postData; + } + + /** + Envelope attributes for SOAP. + */ + protected $SOAP_ENVELOPE_ATTRS = array( + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"", + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + ); + + /** Put objects into a soap envelope + @param $action top level tag in the soap body + @param $objs keyed array of values + @param $namespace include an xmlns attribute + @return soap string + */ + function soapify($action,$objs,$namespace="",$encode_tags=True){ + $ret = "<?xml version=\"1.0\"?> + <soap:Envelope"; + foreach ($this->SOAP_ENVELOPE_ATTRS as $attr){ + $ret .= " ".$attr; + } + $ret .= "> + <soap:Body> + <".$action; + if ($namespace != "") + $ret .= " xmlns=\"".$namespace."\""; + $ret .= ">\n"; + foreach($objs as $key=>$value){ + $ret .= "<".$key.">"; + if ($encode_tags){ + $value = str_replace("<","&lt;",$value); + $value = str_replace(">","&gt;",$value); + } + $ret .= $value; + $ret .= "</".$key.">\n"; + } + $ret .= "</".$action."> + </soap:Body> + </soap:Envelope>"; + + return $ret; + } + + /** + Extract response from a soap envelope + @param $action is the top level tag in the soap body + @param $soaptext is the full soap response + */ + function desoapify($action,$soaptext){ + preg_match("/<$action.*?>(.*?)<\/$action>/s", + $soaptext,$groups); + return isset($groups[1]) ? $groups[1] : ""; + } + + /** + @param $errorCode error code contstant from paycardLib.php + + Set $CORE_LOCAL->["boxMsg"] appropriately for + the given error code. I find this easier + than manually setting an appropriate message + every time I return a common error like + PaycardLib::PAYCARD_ERR_NOSEND. I think everything but + PaycardLib::PAYCARD_ERR_PROC can have one default message + assigned here + */ + function setErrorMsg($errorCode){ + global $CORE_LOCAL; + switch ($errorCode){ + case PaycardLib::PAYCARD_ERR_NOSEND: + $CORE_LOCAL->set("boxMsg",PaycardLib::paycard_errorText("Internal Error",$errorCode,"",1,1,0,0,1,$CORE_LOCAL->get("paycard_type"))); + break; + case PaycardLib::PAYCARD_ERR_COMM: + $CORE_LOCAL->set("boxMsg",PaycardLib::paycard_errorText("Communication Error",$errorCode,"",1,1,0,0,0,$CORE_LOCAL->get("paycard_type"))); + break; + case PaycardLib::PAYCARD_ERR_TIMEOUT: + $CORE_LOCAL->set("boxMsg",PaycardLib::paycard_errorText("Timeout Error",$errorCode,"",0,0,0,1,0,$CORE_LOCAL->get("paycard_type"))); + break; + case PaycardLib::PAYCARD_ERR_DATA: + $CORE_LOCAL->set("boxMsg",PaycardLib::paycard_errorText("System Error",$errorCode,"",0,0,0,1,1,$CORE_LOCAL->get("paycard_type"))); + break; + default: + $CORE_LOCAL->set("boxMsg",PaycardLib::paycard_errorText("Internal Error",$errorCode,"",1,1,0,0,1,$CORE_LOCAL->get("paycard_type"))); + break; + return $errorCode; + } + } + + protected $trans_pan; + /** + Store card data in class member $trans_pan. + @param $in is a keyed array: + - pan is the card number + - tr1 is magnetic stripe track 1, if available + - tr2 is magnetic stripe track 2, if available + - tr3 is magnetic stripe track 3, if available + + Recommended for credit card modules. Card data + can be populated at the last possible moment + before calling doSend and expunged again once + the request has been submitted to the gateway. + */ + function setPAN($in){ + $this->trans_pan = $in; + } +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/GoEMerchant.php b/pos/is4c-nf/plugins/Paycards/GoEMerchant.php new file mode 100755 index 000000000..aa11c8780 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/GoEMerchant.php @@ -0,0 +1,760 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("BasicCCModule")) include_once(realpath(dirname(__FILE__)."/BasicCCModule.php")); +if (!class_exists("xmlData")) include_once(realpath(dirname(__FILE__)."/lib/xmlData.php")); +if (!class_exists("PaycardLib")) include_once(realpath(dirname(__FILE__)."/lib/PaycardLib.php")); + +if (!isset($CORE_LOCAL)){ + include(realpath(dirname(__FILE__)."/lib/LS_Access.php")); + $CORE_LOCAL = new LS_Access(); +} + +if (!class_exists("AutoLoader")) include_once(realpath(dirname(__FILE__).'/../../lib/AutoLoader.php')); + +define('GOEMERCH_ID',''); +define('GOEMERCH_PASSWD',''); +define('GOEMERCH_GATEWAY_ID',''); +// True - settle transactions immediately +// False - just get authorizations. MUST SETTLE MANUALLY LATER! +define('GOEMERCH_SETTLE_IMMEDIATE',True); + +/* test credentials +define('GOEMERCH_ID','1264'); +define('GOEMERCH_PASSWD','password'); +define('GOEMERCH_GATEWAY_ID','a91c38c3-7d7f-4d29-acc7-927b4dca0dbe'); +*/ + +class GoEMerchant extends BasicCCModule { + + var $voidTrans; + var $voidRef; + + function handlesType($type){ + if ($type == PaycardLib::PAYCARD_TYPE_CREDIT) return True; + else return False; + } + + function entered($validate,$json){ + global $CORE_LOCAL; + // error checks based on card type + if( $CORE_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + $this->trans_pan['pan'] = $CORE_LOCAL->get("paycard_PAN"); + + // error checks based on processing mode + switch( $CORE_LOCAL->get("paycard_mode")) { + case PaycardLib::PAYCARD_MODE_VOID: + // use the card number to find the trans_id + $dbTrans = PaycardLib::paycard_db(); + $today = date('Ymd'); + $pan4 = substr($this->trans_pan['pan'],-4); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + $sql = "SELECT transID,cashierNo,laneNo,transNo FROM efsnetRequest WHERE " + .$dbTrans->identifier_escape('date')."='".$today."' AND (PAN LIKE '%".$pan4."')"; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Card Not Used", + "That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Multiple Uses", + "That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = PaycardLib::paycard_db_fetch_row($search); + return $this->paycard_void($payment['transID'],$lane,$trans,$json); + break; + + case PaycardLib::PAYCARD_MODE_AUTH: + if( $validate) { + if( PaycardLib::paycard_validNumber($this->trans_pan['pan']) != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Invalid Card Number", + "Swipe again or type in manually", + "[clear] to cancel"); + return $json; + } else if( PaycardLib::paycard_accepted($this->trans_pan['pan'], !PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_CREDIT)) != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Unsupported Card Type", + "We cannot process " . $CORE_LOCAL->get("paycard_issuer") . " cards", + "[clear] to cancel"); + return $json; + } else if( PaycardLib::paycard_validExpiration($CORE_LOCAL->get("paycard_exp")) != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Invalid Expiration Date", + "The expiration date has passed or was not recognized", + "[clear] to cancel"); + return $json; + } + } + // set initial variables + //Database::getsubtotals(); + if ($CORE_LOCAL->get("paycard_amount") == 0) + $CORE_LOCAL->set("paycard_amount",$CORE_LOCAL->get("amtdue")); + $CORE_LOCAL->set("paycard_id",$CORE_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgAuth.php'; + $json['output'] = ''; + return $json; + break; + } // switch mode + + // if we're still here, it's an error + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Invalid Mode", + "This card type does not support that processing mode","[clear] to cancel"); + return $json; + + } + + function paycard_void($transID,$laneNo=-1,$transNo=-1,$json=array()) { + global $CORE_LOCAL; + $this->voidTrans = ""; + $this->voidRef = ""; + // situation checking + if( $CORE_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = PaycardLib::paycard_db(); + $today = date('Ymd'); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + if ($laneNo != -1) $lane = $laneNo; + if ($transNo != -1) $trans = $transNo; + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount,name FROM efsnetRequest + WHERE ".$dbTrans->identifier_escape('date')."='".$today."' AND cashierNo=".$cashier." AND + laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = PaycardLib::paycard_db_fetch_row($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xResponseCode, + xTransactionID FROM efsnetResponse WHERE ".$dbTrans->identifier_escape('date')."='".$today."' + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = PaycardLib::paycard_db_fetch_row($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM efsnetRequestMod WHERE " + .$dbTrans->identifier_escape('date')."=".$today + ." AND cashierNo=".$cashier." AND laneNo=".$lane + ." AND transNo=".$trans." AND transID=".$transID + ." AND mode='void' AND xResponseCode=0"; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $voided = PaycardLib::paycard_db_num_rows($search); + if( $voided > 0) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } + + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if( $num < 1) { + $sql = "SELECT * FROM localtranstoday WHERE trans_id=".$transID." and emp_no=".$cashier + ." and register_no=".$lane." and trans_no=".$trans; + $search = PaycardLib::paycard_db_query($sql, $dbTrans); + $num = PaycardLib::paycard_db_num_rows($search); + if ($num != 1){ + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } + } else if( $num > 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = PaycardLib::paycard_db_fetch_row($search); + + // make sure the payment is applicable to void + if( $response['commErr'] != 0 || $response['httpCode'] != 200 || $response['validResponse'] != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $request['live'] != PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_CREDIT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xResponseCode'] != 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Unable to Void", + "Credit card transaction not approved<br>The result code was " . $response['xResponseCode'],"[clear] to cancel"); + return $json; + } else if( $response['xTransactionID'] < 1) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Invalid reference number","[clear] to cancel"); + return $json; + } + + // make sure the tender line-item is applicable to void + if( $lineitem['trans_type'] != "T" || $lineitem['trans_subtype'] != "CC" ){ + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Authorization and tender records do not match $transID","[clear] to cancel"); + return $json; + } else if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_CREDIT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $CORE_LOCAL->set("paycard_amount",(($request['mode']=='retail_alone_credit') ? -1 : 1) * $request['amount']); + $CORE_LOCAL->set("paycard_id",$transID); + $CORE_LOCAL->set("paycard_trans",$cashier."-".$lane."-".$trans); + $CORE_LOCAL->set("paycard_type",PaycardLib::PAYCARD_TYPE_CREDIT); + $CORE_LOCAL->set("paycard_mode",PaycardLib::PAYCARD_MODE_VOID); + $CORE_LOCAL->set("paycard_name",$request['name']); + + // display FEC code box + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgVoid.php'; + return $json; + } + + function handleResponse($authResult){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_AUTH: + return $this->handleResponseAuth($authResult); + case PaycardLib::PAYCARD_MODE_VOID: + return $this->handleResponseVoid($authResult); + } + } + + function handleResponseAuth($authResult){ + global $CORE_LOCAL; + $xml = new xmlData($authResult['response']); + $dbTrans = PaycardLib::paycard_db(); + + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $cvv2 = $CORE_LOCAL->get("paycard_cvv2"); + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime'). + ",seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s',", $now ) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + $validResponse = ($xml->isValid()) ? 1 : 0; + + $refNum = $xml->get("ORDER_ID"); + if ($refNum){ + $sqlColumns .= ",refNum"; + $sqlValues .= sprintf(",'%s'",$refNum); + } + $responseCode = $xml->get("STATUS"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + // aren't two separate codes from goemerchant + $resultCode = $xml->get_first("STATUS"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("AUTH_RESPONSE"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $rMsg = $resultMsg; + if (strlen($rMsg) > 100){ + $rMsg = substr($rMsg,0,100); + } + $sqlValues .= sprintf(",'%s'",$rMsg); + } + $xTransID = $xml->get("REFERENCE_NUMBER"); + if ($xTransID){ + $sqlColumns .= ",xTransactionID"; + $sqlValues .= sprintf(",'%s'",$xTransID); + } + else $validResponse = -3; + $apprNumber = $xml->get("AUTH_CODE"); + if ($apprNumber){ + $sqlColumns .= ",xApprovalNumber"; + $sqlValues .= sprintf(",'%s'",$apprNumber); + } + //else $validResponse = -3; + // valid credit transactions don't have an approval number + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $sql = "INSERT INTO efsnetResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + PaycardLib::paycard_db_query($sql, $dbTrans); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + TransRecord::addcomment(""); + if ($authResult['curlHTTP'] == '0'){ + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); + } + + switch ($xml->get("STATUS")){ + case 1: // APPROVED + $CORE_LOCAL->set("ccTermOut","approval:".str_pad($xml->get("AUTH_CODE"),6,'0',STR_PAD_RIGHT)); + return PaycardLib::PAYCARD_ERR_OK; + case 2: // DECLINED + $CORE_LOCAL->set("ccTermOut","approval:denied"); + $CORE_LOCAL->set("boxMsg",$resultMsg); + break; + case 0: // ERROR + $CORE_LOCAL->set("ccTermOut","resettotal"); + $CORE_LOCAL->set("boxMsg",""); + $texts = $xml->get_first("ERROR"); + $CORE_LOCAL->set("boxMsg","Error: $texts"); + break; + default: + $CORE_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PaycardLib::PAYCARD_ERR_PROC; + } + + function handleResponseVoid($authResult){ + global $CORE_LOCAL; + $xml = new xmlData($authResult['response']); + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $refNum = $this->refnum($transID); + + $dbTrans = PaycardLib::paycard_db(); + // prepare some fields to store the request and the parsed response; we'll add more as we verify it + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," + .$dbTrans->identifier_escape('datetime'). + ",origAmount,mode,altRoute," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("%s,'%s',%d,", $amountText, "VOID", 0) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + + $responseCode = $xml->get("STATUS1"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + $resultCode = $xml->get_first("STATUS1"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("RESPONSE1"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $rMsg = $resultMsg; + if (strlen($rMsg) > 100){ + $rMsg = substr($rMsg,0,100); + } + $sqlValues .= sprintf(",'%s'",$rMsg); + } + $sqlColumns .= ",origTransactionID"; + $sqlValues .= sprintf(",'%s'",$this->voidTrans); + $sqlColumns .= ",origRefNum"; + $sqlValues .= sprintf(",'%s'",$this->voidRef); + + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $sql = "INSERT INTO efsnetRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + PaycardLib::paycard_db_query($sql, $dbTrans); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); + } + + switch ($xml->get("STATUS1")){ + case 1: // APPROVED + return PaycardLib::PAYCARD_ERR_OK; + case 2: // DECLINED + $CORE_LOCAL->set("boxMsg","$resultMsg"); + break; + case 0: // ERROR + $CORE_LOCAL->set("boxMsg",""); + $texts = $xml->get_first("ERROR1"); + $CORE_LOCAL->set("boxMsg","Error: $texts"); + break; + default: + $CORE_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PaycardLib::PAYCARD_ERR_PROC; + } + + function cleanup($json){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_AUTH: + // cast to string. tender function expects string input + // numeric input screws up parsing on negative values > $0.99 + $amt = "".(-1*($CORE_LOCAL->get("paycard_amount"))); + TransRecord::addtender("Credit Card", "CC", $amt); + $CORE_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Please verify cardholder signature<p>[enter] to continue<br>\"rp\" to reprint slip<br>[void] to cancel and void</font>"); + if ($CORE_LOCAL->get("paycard_amount") <= $CORE_LOCAL->get("CCSigLimit") && $CORE_LOCAL->get("paycard_amount") >= 0){ + $CORE_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>No signature required<p>[enter] to continue<br>[void] to cancel and void</font>"); + } + break; + case PaycardLib::PAYCARD_MODE_VOID: + $v = new Void(); + $v->voidid($CORE_LOCAL->get("paycard_id")); + $CORE_LOCAL->set("boxMsg","<b>Voided</b><p><font size=-1>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + $CORE_LOCAL->set("ccCustCopy",0); + if ($CORE_LOCAL->get("paycard_amount") > $CORE_LOCAL->get("CCSigLimit") || $CORE_LOCAL->get("paycard_amount") < 0) + $json['receipt'] = "ccSlip"; + return $json; + } + + function doSend($type){ + global $CORE_LOCAL; + switch($type){ + case PaycardLib::PAYCARD_MODE_AUTH: + return $this->send_auth(); + case PaycardLib::PAYCARD_MODE_VOID: + return $this->send_void(); + default: + PaycardLib::paycard_reset(); + return $this->setErrorMsg(0); + } + } + + function send_auth(){ + global $CORE_LOCAL; + // initialize + $dbTrans = PaycardLib::paycard_db(); + if( !$dbTrans){ + PaycardLib::paycard_reset(); + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + } + + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = (($amount < 0) ? 'retail_alone_credit' : 'retail_sale'); + if ($mode == 'retail_sale' && !GOEMERCH_SETTLE_IMMEDIATE) + $mode = 'retail_auth'; + $manual = ($CORE_LOCAL->get("paycard_manual") ? 1 : 0); + $this->trans_pan['pan'] = $CORE_LOCAL->get("paycard_PAN"); + $cardPAN = $this->trans_pan['pan']; + $cardPANmasked = PaycardLib::paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $CORE_LOCAL->get("paycard_issuer"); + $cardExM = substr($CORE_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($CORE_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $CORE_LOCAL->get("paycard_tr1"); + $cardTr2 = $CORE_LOCAL->get("paycard_tr2"); + $cardTr3 = $CORE_LOCAL->get("paycard_tr3"); + $cardName = $CORE_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + $cvv2 = $CORE_LOCAL->get("paycard_cvv2"); + + $merchantID = GOEMERCH_ID; + $password = GOEMERCH_PASSWD; + $gatewayID = GOEMERCH_GATEWAY_ID; + if ($CORE_LOCAL->get("training") == 1){ + $merchantID = "1264"; + $password = "password"; + $gatewayID = "a91c38c3-7d7f-4d29-acc7-927b4dca0dbe"; + $cardPAN = "4111111111111111"; + $cardPANmasked = "xxxxxxxxxxxxTEST"; + $cardIssuer = "Visa"; + $cardTr1 = False; + $cardTr2 = False; + $cardName = "Just Testing"; + $nextyear = mktime(0,0,0,date("m"),date("d"),date("Y")+1); + $cardExM = date("m",$nextyear); + $cardExY = date("y",$nextyear); + $live = 0; + } + + $sendPAN = 0; + $sendExp = 0; + $sendTr1 = 0; + $sendTr2 = 0; + $magstripe = ""; + if (!$cardTr1 && !$cardTr2){ + $sendPAN = 1; + $sendExp = 1; + } + if ($cardTr1) { + $sendTr1 = 1; + $magstripe .= "%".$cardTr1."?"; + } + if ($cardTr2){ + $sendTr2 = 1; + $magstripe .= ";".$cardTr2."?"; + } + if ($cardTr2 && $cardTr3){ + $sendPAN = 1; + $magstripe .= ";".$cardTr3."?"; + } + + $sqlCols = "sentPAN,sentExp,sentTr1,sentTr2"; + $sqlVals = "$sendPAN,$sendExp,$sendTr1,$sendTr2"; + // store request in the database before sending it + $sqlCols .= "," . // already defined some sent* columns + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",refNum,live,mode,amount," . + "PAN,issuer,manual,name"; + $fixedName = PaycardLib::paycard_db_escape($cardName, $dbTrans); + $sqlVals .= "," . // already defined some sent* values + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',%d,'%s',%s,", $now, $refNum, $live, $mode, $amountText) . + sprintf("'%s','%s',%d,'%s'", $cardPANmasked, $cardIssuer, $manual,$fixedName); + $sql = "INSERT INTO efsnetRequest (" . $sqlCols . ") VALUES (" . $sqlVals . ")"; + + if( !PaycardLib::paycard_db_query($sql, $dbTrans) ) { + PaycardLib::paycard_reset(); + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + } + + $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; + $xml .= "<TRANSACTION>"; + $xml .= "<FIELDS>"; + $xml .= "<FIELD KEY=\"merchant\">$merchantID</FIELD>"; + if( $password != "" ) + $xml .= "<FIELD KEY=\"password\">$password</FIELD>"; + $xml .= "<FIELD KEY=\"gateway_id\">$gatewayID</FIELD>"; + $xml .= "<FIELD KEY=\"operation_type\">$mode</FIELD>"; + $xml .= "<FIELD KEY=\"order_id\">$refNum</FIELD>"; + $xml .= "<FIELD KEY=\"total\">$amountText</FIELD>"; + if ($magstripe == ""){ + $xml .= "<FIELD KEY=\"card_name\">$cardIssuer</FIELD>"; + $xml .= "<FIELD KEY=\"card_number\">$cardPAN</FIELD>"; + $xml .= "<FIELD KEY=\"card_exp\">".$cardExM.$cardExY."</FIELD>"; + } + else{ + $xml .= "<FIELD KEY=\"mag_data\">$magstripe</FIELD>"; + } + if (!empty($cvv2)){ + $xml .= "<FIELD KEY=\"cvv2\">$cvv2</FIELD>"; + } + if ($cardName != "Customer"){ + $xml .= "<FIELD KEY=\"owner_name\">$cardName</FIELD>"; + } + $xml .= "<FIELD KEY=\"recurring\">0</FIELD>"; + $xml .= "<FIELD KEY=\"recurring_type\"></FIELD>"; + $xml .= "</FIELDS>"; + $xml .= "</TRANSACTION>"; + + $this->GATEWAY = "https://secure.goemerchant.com/secure/gateway/xmlgateway.aspx"; + return $this->curlSend($xml,'POST',True); + } + + function send_void(){ + global $CORE_LOCAL; + // initialize + $dbTrans = PaycardLib::paycard_db(); + if( !$dbTrans){ + PaycardLib::paycard_reset(); + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); + } + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // new timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $manual = ($CORE_LOCAL->get("paycard_manual") ? 1 : 0); + $this->trans_pan['pan'] = $CORE_LOCAL->get("paycard_PAN"); + $cardPAN = $this->trans_pan['pan']; + $cardPANmasked = PaycardLib::paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $CORE_LOCAL->get("paycard_issuer"); + $cardExM = substr($CORE_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($CORE_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $this->trans_pan['tr1']; + $cardTr2 = $this->trans_pan['tr2']; + $cardName = $CORE_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + + $this->voidTrans = $transID; + $this->voidRef = $CORE_LOCAL->get("paycard_trans"); + $temp = explode("-",$this->voidRef); + $laneNo = $temp[1]; + $transNo = $temp[2]; + + $merchantID = GOEMERCH_ID; + $password = GOEMERCH_PASSWD; + $gatewayID = GOEMERCH_GATEWAY_ID; + if ($CORE_LOCAL->get("training") == 1){ + $merchantID = "1264"; + $password = "password"; + $cardPAN = "4111111111111111"; + $gatewayID = "a91c38c3-7d7f-4d29-acc7-927b4dca0dbe"; + $cardPANmasked = "xxxxxxxxxxxxTEST"; + $cardIssuer = "Visa"; + $cardName = "Just Testing"; + $nextyear = mktime(0,0,0,date("m"),date("d"),date("Y")+1); + $cardExM = date("m",$nextyear); + $cardExY = date("y",$nextyear); + $live = 0; + } + + // look up the TransactionID from the original response (card number and amount should already be in session vars) + $sql = "SELECT refNum,xTransactionID FROM efsnetResponse WHERE ".$dbTrans->identifier_escape('date')."='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND transNo=".$transNo." AND transID=".$transID; + $result = PaycardLib::paycard_db_query($sql, $dbTrans); + if( !$result || PaycardLib::paycard_db_num_rows($result) != 1){ + PaycardLib::paycard_reset(); + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); + } + $res = PaycardLib::paycard_db_fetch_row($result); + $TransactionID = $res['xTransactionID']; + + $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; + $xml .= "<TRANSACTION>"; + $xml .= "<FIELDS>"; + $xml .= "<FIELD KEY=\"merchant\">$merchantID</FIELD>"; + if ($password != "") + $xml .= "<FIELD KEY=\"password\">$password</FIELD>"; + $xml .= "<FIELD KEY=\"gateway_id\">$gatewayID</FIELD>"; + $xml .= "<FIELD KEY=\"operation_type\">$mode</FIELD>"; + $xml .= "<FIELD KEY=\"total_number_transactions\">1</FIELD>"; + $xml .= "<FIELD KEY=\"reference_number1\">$TransactionID</FIELD>"; + $xml .= "<FIELD KEY=\"credit_amount1\">$amountText</FIELD>"; + $xml .= "</FIELDS>"; + $xml .= "</TRANSACTION>"; + + $this->GATEWAY = "https://secure.goemerchant.com/secure/gateway/xmlgateway.aspx"; + return $this->curlSend($xml,'POST',True); + } + + // tack time onto reference number for goemerchant order_id + // field. requires uniqueness, doesn't seem to cycle daily + function refnum($transID){ + global $CORE_LOCAL; + $transNo = (int)$CORE_LOCAL->get("transno"); + $cashierNo = (int)$CORE_LOCAL->get("CashierNo"); + $laneNo = (int)$CORE_LOCAL->get("laneno"); + + // assemble string + $ref = ""; + $ref .= date("ymdHis"); + $ref .= "-"; + $ref .= str_pad($cashierNo, 4, "0", STR_PAD_LEFT); + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/MercuryGift.php b/pos/is4c-nf/plugins/Paycards/MercuryGift.php new file mode 100755 index 000000000..392515666 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/MercuryGift.php @@ -0,0 +1,882 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + * Mercury Gift Card processing module + * + */ + +if (!class_exists("AutoLoader")) include_once(realpath(dirname(__FILE__).'/../../lib/AutoLoader.php')); + +if (!class_exists("PaycardLib")) include_once(realpath(dirname(__FILE__)."/lib/PaycardLib.php")); + +define('MERCURY_GTERMINAL_ID',""); +define('MERCURY_GPASSWORD',""); + +class MercuryGift extends BasicCCModule { + var $temp; + var $SOAPACTION = "http://www.mercurypay.com/GiftTransaction"; + var $second_try; + // BEGIN INTERFACE METHODS + + /* handlesType($type) + * $type is a constant as defined in paycardLib.php. + * If you class can handle the given type, return + * True + */ + function handlesType($type){ + if ($type == PaycardLib::PAYCARD_TYPE_GIFT) return True; + else return False; + } + + /* entered($validate) + * This function is called in paycardEntered() + * [paycardEntered.php]. This function exists + * to move all type-specific handling code out + * of the paycard* files + */ + function entered($validate,$json){ + global $CORE_LOCAL; + // error checks based on card type + if( $CORE_LOCAL->get("gcIntegrate") != 1) { // credit card integration must be enabled + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Card Integration Disabled","Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + if( $CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_VOID) { + // use the card number to find the trans_id + $dbTrans = Database::tDataConnect(); + $today = date('Ymd'); // numeric date only, in an int field + $pan = $this->getPAN(); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + $sql = "SELECT transID FROM valutecRequest WHERE ".$dbTrans->identifier_escape('date')."=".$today." AND PAN='".$pan."' " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Card Not Used","That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Multiple Uses","That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = $dbTrans->fetch_array($search); + return $this->paycard_void($payment['transID'],$json); + } + + // check card data for anything else + if( $validate) { + if( PaycardLib::paycard_validNumber($CORE_LOCAL->get("paycard_PAN")) != 1 && substr($CORE_LOCAL->get("paycard_PAN"),0,7) != "6050110") { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Invalid Card Number", + "Swipe again or type in manually","[clear] to cancel"); + return $json; + } else if( PaycardLib::paycard_accepted($CORE_LOCAL->get("paycard_PAN"), !PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_GIFT)) != 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unsupported Card Type", + "We cannot process " . $CORE_LOCAL->get("paycard_issuer") . " cards","[clear] to cancel"); + return $json; + } + } + + // other modes + switch( $CORE_LOCAL->get("paycard_mode")) { + case PaycardLib::PAYCARD_MODE_AUTH: + $CORE_LOCAL->set("paycard_amount",$CORE_LOCAL->get("amtdue")); + $CORE_LOCAL->set("paycard_id",$CORE_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgAuth.php'; + return $json; + + case PaycardLib::PAYCARD_MODE_ACTIVATE: + case PaycardLib::PAYCARD_MODE_ADDVALUE: + $CORE_LOCAL->set("paycard_amount",0); + $CORE_LOCAL->set("paycard_id",$CORE_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgGift.php'; + return $json; + + case PaycardLib::PAYCARD_MODE_BALANCE: + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgBalance.php'; + return $json; + } // switch mode + + // if we're still here, it's an error + PaycardLib::paycard_reset(); + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Invalid Mode", + "This card type does not support that processing mode", + "[clear] to cancel"); + return $json; + } + + /* doSend() + * Process the paycard request and return + * an error value as defined in paycardLib.php. + * + * On success, return PaycardLib::PAYCARD_ERR_OK. + * On failure, return anything else and set any + * error messages to be displayed in + * $CORE_LOCAL->["boxMsg"]. + */ + function doSend($type){ + $this->second_try = False; + switch($type){ + case PaycardLib::PAYCARD_MODE_ACTIVATE: + case PaycardLib::PAYCARD_MODE_ADDVALUE: + case PaycardLib::PAYCARD_MODE_AUTH: + return $this->send_auth(); + case PaycardLib::PAYCARD_MODE_VOID: + case PaycardLib::PAYCARD_MODE_VOIDITEM: + return $this->send_void(); + case PaycardLib::PAYCARD_MODE_BALANCE: + return $this->send_balance(); + default: + return $this->setErrorMsg(0); + } + } + + /* cleanup() + * This function is called when doSend() returns + * PaycardLib::PAYCARD_ERR_OK. (see paycardAuthorize.php) + * I use it for tendering, printing + * receipts, etc, but it's really only for code + * cleanliness. You could leave this as is and + * do all the everything inside doSend() + */ + function cleanup($json){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_BALANCE: + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>Gift card balance: $".$resp["Balance"]."<p>\"rp\" to print<br>[enter] to continue</font>"); + break; + case PaycardLib::PAYCARD_MODE_ADDVALUE: + case PaycardLib::PAYCARD_MODE_ACTIVATE: + $CORE_LOCAL->set("autoReprint",1); + $ttl = $CORE_LOCAL->get("paycard_amount"); + PrehLib::deptkey($ttl*100,9020); + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>New card balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + case PaycardLib::PAYCARD_MODE_AUTH: + $CORE_LOCAL->set("autoReprint",1); + PrehLib::tender("GD", ($CORE_LOCAL->get("paycard_amount")*100)); + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Used: $".$CORE_LOCAL->get("paycard_amount")."<br />New balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + if( !strcasecmp($CORE_LOCAL->get("paycard_PAN"),"7018525757980004481")) // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<br><b>REMEMBER TO VOID THIS</b><br>(ask IT for details)"); + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip<br>[clear] to cancel and void</font>"); + break; + case PaycardLib::PAYCARD_MODE_VOID: + case PaycardLib::PAYCARD_MODE_VOIDITEM: + $CORE_LOCAL->set("autoReprint",1); + $v = new Void(); + $v->voidid($CORE_LOCAL->get("paycard_id")); + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Voided</b><font size=-1><p>New balance: $".$resp["Balance"]."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + return $json; + } + + /* paycard_void($transID) + * Argument is trans_id to be voided + * Again, this is for removing type-specific + * code from paycard*.php files. + */ + function paycard_void($transID,$laneNo=-1,$transNo=-1,$json=array()) { + global $CORE_LOCAL; + // situation checking + if( $CORE_LOCAL->get("gcIntegrate") != 1) { // gift card integration must be enabled + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Card Integration Disabled", + "Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = Database::tDataConnect(); + $today = date('Ymd'); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount FROM valutecRequest WHERE ".$dbTrans->identifier_escape('date')."=".$today + ." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = $dbTrans->fetch_array($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xAuthorized, + xAuthorizationCode FROM valutecResponse WHERE ".$dbTrans->identifier_escape('date')."=".$today." + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM valutecRequestMod WHERE ".$dbTrans->identifier_escape('date')."=".$today + ." AND cashierNo=".$cashier." AND laneNo=".$lane + ." AND transNo=".$trans." AND transID=".$transID + ." AND mode='void' AND (xAuthorized='true' or xAuthorized='Appro')"; + $search = $dbTrans->query($sql); + $voided = $dbTrans->num_rows($search); + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = $dbTrans->fetch_array($search); + + // make sure the gift card transaction is applicable to void + if( !$response || $response['commErr'] != 0 || + $response['httpCode'] != 200 || $response['validResponse'] != 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $voided > 0) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } else if( $request['live'] != PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_GIFT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xAuthorized'] != 'true' + && $response['xAuthorized'] != 'Appro') { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not approved","[clear] to cancel"); + return $json; + } else if( $response['xAuthorizationCode'] < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Invalid authorization number","[clear] to cancel"); + return $json; + } + + // make sure the transaction line-item is applicable to void + if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $CORE_LOCAL->set("paycard_PAN",$request['PAN']); + if( $request['mode'] == 'refund') + $CORE_LOCAL->set("paycard_amount",-$request['amount']); + else + $CORE_LOCAL->set("paycard_amount",$request['amount']); + $CORE_LOCAL->set("paycard_id",$transID); + $CORE_LOCAL->set("paycard_type",PaycardLib::PAYCARD_TYPE_GIFT); + if( $lineitem['trans_type'] == "T" && $lineitem['trans_subtype'] == "GD") { + $CORE_LOCAL->set("paycard_mode",PaycardLib::PAYCARD_MODE_VOID); + } else { + $CORE_LOCAL->set("paycard_mode",PaycardLib::PAYCARD_MODE_VOIDITEM); + } + + // display FEC code box + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgVoid.php'; + return $json; + } + + // END INTERFACE METHODS + + function send_auth($domain="w1.mercurypay.com"){ + global $CORE_LOCAL; + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = ""; + switch( $CORE_LOCAL->get("paycard_mode")) { + case PaycardLib::PAYCARD_MODE_AUTH: $mode = (($amount < 0) ? 'refund' : 'tender'); break; + case PaycardLib::PAYCARD_MODE_ADDVALUE: $mode = 'addvalue'; break; + case PaycardLib::PAYCARD_MODE_ACTIVATE: $mode = 'activate'; break; + default: return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); + } + $termID = $this->getTermID(); + $password = $this->getPw(); + $live = 0; + $manual = ($CORE_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // store request in the database before sending it + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",identifier,terminalID,live," . + "mode,amount,PAN,manual"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s','%s',%d,", $now, $identifier, $termID, $live) . + sprintf("'%s',%s,'%s',%d", $mode, $amountText, $cardPAN, $manual); + $sql = "INSERT INTO valutecRequest (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if( !$dbTrans->query($sql)){ + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + } + + // assemble and send request + $authMethod = ""; + switch( $mode) { + case 'tender': $authMethod = 'NoNSFSale'; break; + case 'refund': $authMethod = 'Return'; break; + case 'addvalue': $authMethod = 'Reload'; break; + case 'activate': $authMethod = 'Issue'; break; + } + + $msgXml = "<?xml version=\"1.0\"".'?'."> + <TStream> + <Transaction> + <IpPort>9100</IpPort> + <MerchantID>$termID</MerchantID> + <TranType>PrePaid</TranType> + <TranCode>$authMethod</TranCode> + <InvoiceNo>$identifier</InvoiceNo> + <RefNo>$identifier</RefNo> + <Memo>CORE POS 1.0.0</Memo> + <Account>"; + if ($cardTr2) + $msgXml .= "<Track2>$cardTr2</Track2>"; + else + $msgXml .= "<AcctNo>$cardPAN</AcctNo>"; + $msgXml .= "</Account> + <Amount> + <Purchase>$amountText</Purchase> + </Amount> + </Transaction> + </TStream>"; + + + $soaptext = $this->soapify("GiftTransaction", + array("tran"=>$msgXml,"pw"=>$password), + "http://www.mercurypay.com"); + + if ($CORE_LOCAL->get("training") == 1) + $this->GATEWAY = "https://w1.mercurydev.net/ws/ws.asmx"; + else + $this->GATEWAY = "https://$domain/ws/ws.asmx"; + + return $this->curlSend($soaptext,'SOAP'); + } + + function send_void($domain="w1.mercurypay.com"){ + global $CORE_LOCAL; + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $cardPAN = $this->getPAN(); + $identifier = date('mdHis'); // the void itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + + // look up the auth code from the original response + // (card number and amount should already be in session vars) + $sql = "SELECT xAuthorizationCode FROM valutecResponse WHERE " + .$dbTrans->identifier_escape('date')."='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND + transNo=".$transNo." AND transID=".$transID; + $search = $dbTrans->query($sql); + if( !$search || $dbTrans->num_rows($search) != 1) + return PaycardLib::PAYCARD_ERR_NOSEND; // database error, nothing sent (ok to retry) + $log = $dbTrans->fetch_array($search); + $authcode = $log['xAuthorizationCode']; + $this->temp = $authcode; + + // look up original transaction type + $sql = "SELECT mode FROM valutecRequest WHERE " + .$dbTrans->identifier_escape('date')."='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND + transNo=".$transNo." AND transID=".$transID; + $search = $dbTrans->query($sql); + if( !$search || $dbTrans->num_rows($search) != 1) + return PaycardLib::PAYCARD_ERR_NOSEND; // database error, nothing sent (ok to retry) + $row = $dbTrans->fetch_array($search); + $vdMethod = ""; + switch($row[0]){ + case 'tender': $vdMethod='VoidSale'; break; + case 'refund': $vdMethod='VoidReturn'; break; + case 'addvalue': $vdMethod='VoidReload'; break; + case 'activate': $vdMethod='VoidIssue'; break; + } + + + $msgXml = "<?xml version=\"1.0\"".'?'."> + <TStream> + <Transaction> + <IpPort>9100</IpPort> + <MerchantID>$termID</MerchantID> + <TranType>PrePaid</TranType> + <TranCode>$vdMethod</TranCode> + <InvoiceNo>$identifier</InvoiceNo> + <RefNo>$authcode</RefNo> + <Memo>CORE POS 1.0.0</Memo> + <Account>"; + if ($cardTr2) + $msgXml .= "<Track2>$cardTr2</Track2>"; + else + $msgXml .= "<AcctNo>$cardPAN</AcctNo>"; + $msgXml .= "</Account> + <Amount> + <Purchase>$amountText</Purchase> + </Amount> + </Transaction> + </TStream>"; + + $soaptext = $this->soapify("GiftTransaction", + array("tran"=>$msgXml,"pw"=>$password), + "http://www.mercurypay.com"); + + if ($CORE_LOCAL->get("training") == 1) + $this->GATEWAY = "https://w1.mercurydev.net/ws/ws.asmx"; + else + $this->GATEWAY = "https://$domain/ws/ws.asmx"; + + return $this->curlSend($soaptext,'SOAP'); + } + + function send_balance($domain="w1.mercurypay.com"){ + global $CORE_LOCAL; + // prepare data for the request + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = date('mdHis'); // the balance check itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + $password = $this->getPw(); + + $msgXml = "<?xml version=\"1.0\"?> + <TStream> + <Transaction> + <IpPort>9100</IpPort> + <MerchantID>$termID</MerchantID> + <TranType>PrePaid</TranType> + <TranCode>Balance</TranCode> + <InvoiceNo>$identifier</InvoiceNo> + <RefNo>$identifier</RefNo> + <Memo>CORE POS</Memo> + <Account>"; + if ($cardTr2) + $msgXml .= "<Track2>$cardTr2</Track2>"; + else + $msgXml .= "<AcctNo>$cardPAN</AcctNo>"; + $msgXml .= "</Account> + </Transaction> + </TStream>"; + + $soaptext = $this->soapify("GiftTransaction", + array("tran"=>$msgXml,"pw"=>$password), + "http://www.mercurypay.com"); + + //echo $soaptext; exit; + //$soaptext = str_replace("<pw>$password</pw>","",$soaptext); + //$soaptext = str_replace("</GiftTransaction>", + // "</GiftTransaction><pw>$password</pw>",$soaptext); + + if ($CORE_LOCAL->get("training") == 1) + $this->GATEWAY = "https://w1.mercurydev.net/ws/ws.asmx"; + else + $this->GATEWAY = "https://$domain/ws/ws.asmx"; + + return $this->curlSend($soaptext,'SOAP'); + } + + function handleResponse($authResult){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_AUTH: + case PaycardLib::PAYCARD_MODE_ACTIVATE: + case PaycardLib::PAYCARD_MODE_ADDVALUE: + return $this->handleResponseAuth($authResult); + case PaycardLib::PAYCARD_MODE_VOID: + case PaycardLib::PAYCARD_MODE_VOIDITEM: + return $this->handleResponseVoid($authResult); + case PaycardLib::PAYCARD_MODE_BALANCE: + return $this->handleResponseBalance($authResult); + } + } + + function handleResponseAuth($authResult){ + global $CORE_LOCAL; + $resp = $this->desoapify("GiftTransactionResult", + $authResult["response"]); + $xml = new xmlData($resp); + + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $program = 'Gift'; + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // prepare some fields to store the parsed response; we'll add more as we verify it + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",identifier," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',", $now, $identifier) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + $errorMsg = $xml->get_first("TEXTRESPONSE"); + $balance = $xml->get_first("BALANCE"); + + + if ($validResponse){ + // verify that echo'd fields match our request + if( $xml->get('TRANTYPE') && $xml->get('TRANTYPE') == "PrePaid" + && $xml->get('INVOICENO') && $xml->get('INVOICENO') == $identifier + && $xml->get('CMDSTATUS') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else{ + if (!$xml->get('CMDSTATUS')) + $validResponse = -2; // response was parsed as XML but fields didn't match + if (!$xml->get('TRANTYPE')) + $validResponse = -3; // response was parsed as XML but fields didn't match + if (!$xml->get('INVOICENO')) + $validResponse = -4; // response was parsed as XML but fields didn't match + } + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".substr($xml->get("CMDSTATUS"),0,5)."'"; + $sqlValues .= ",'".$xml->get("REFNO")."'"; + $sqlValues .= ",'".$balance."'"; + $sqlValues .= ",'".str_replace("'","",$errorMsg)."'"; + } + + // finish storing the response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + $dbTrans->query($sql); + + // check for communication errors (any cURL error or any HTTP code besides 200) + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + if (!$this->second_try){ + $this->second_try = True; + return $this->send_auth("w2.backuppay.com"); + } + else { + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); + } + + // check for data errors (any failure to parse response XML or echo'd field mismatch + if( $validResponse != 1) { + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was processed (use carbon) + } + + // put the parsed response into $CORE_LOCAL so the caller, receipt printer, etc can get the data they need + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $CORE_LOCAL->get("paycard_response"); + $temp["Balance"] = isset($temp['BALANCE']) ? $temp["BALANCE"] : 0; + $CORE_LOCAL->set("paycard_response",$temp); + /** + Update authorized amount based on response. If + the transaction was a refund ("Return") then the + amount needs to be negative for POS to handle + it correctly. + */ + if ($xml->get_first("AUTHORIZE")){ + $CORE_LOCAL->set("paycard_amount",$xml->get_first("AUTHORIZE")); + if ($xml->get_first('TRANCODE') && $xml->get_first('TRANCODE') == 'Return') + $CORE_LOCAL->set("paycard_amount",-1*$xml->get_first("AUTHORIZE")); + $correctionQ = sprintf("UPDATE valutecRequest SET amount=%f WHERE + date=%s AND identifier='%s'", + $xml->get_first("AUTHORIZE"),date("Ymd"),$identifier); + $dbTrans->query($correctionQ); + } + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('CMDSTATUS') == 'Approved' && $xml->get('REFNO') != '' ){ + return PaycardLib::PAYCARD_ERR_OK; // authorization approved, no error + } + + // the authorizor gave us some failure code + $CORE_LOCAL->set("boxMsg","Processor error: ".$errorMsg); + return PaycardLib::PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + function handleResponseVoid($vdResult){ + global $CORE_LOCAL; + $resp = $this->desoapify("GiftTransactionResult", + $vdResult["response"]); + $xml = new xmlData($resp); + + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $authcode = $this->temp; + $program = "Gift"; + + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID,". + $dbTrans->identifier_escape('datetime'). + ",mode,origAuthCode," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("'%s','%s',", $mode, $authcode) . + sprintf("%f,%d,%d", $vdResult['curlTime'], $vdResult['curlErr'], $vdResult['curlHTTP']); + + $validResponse = 0; + // verify that echo'd fields match our request + if( $xml->get('TRANTYPE') + && $xml->get('CMDSTATUS') + && $xml->get('BALANCE') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else + $validResponse = -2; // response was parsed as XML but fields didn't match + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".substr($xml->get("CMDSTATUS"),0,5)."'"; + $sqlValues .= ",'".$xml->get("REFNO")."'"; + $sqlValues .= ",'".$xml->get("BALANCE")."'"; + $sqlValues .= ",'".$xml->get_first("TEXTRESPONSE")."'"; + + // finish storing the request and response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + $dbTrans->query($sql); + + if( $vdResult['curlErr'] != CURLE_OK || $vdResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + if (!$this->second_try){ + $this->second_try = True; + return $this->send_void("w2.backuppay.com"); + } + else { + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); // comm error, try again + } + // check for data errors (any failure to parse response XML or echo'd field mismatch) + if( $validResponse != 1) { + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was voided (use carbon) + } + + // put the parsed response into $CORE_LOCAL so the caller, receipt printer, etc can get the data they need + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $CORE_LOCAL->get("paycard_response"); + $temp["Balance"] = isset($temp['BALANCE']) ? $temp["BALANCE"] : 0; + $CORE_LOCAL->set("paycard_response",$temp); + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('CMDSTATUS') == 'Approved' && $xml->get('REFNO') != '' ){ + return PaycardLib::PAYCARD_ERR_OK; // void successful, no error + } + + // the authorizor gave us some failure code + $CORE_LOCAL->set("boxMsg","PROCESSOR ERROR: ".$xml->get_first("ERRORMSG")); + return PaycardLib::PAYCARD_ERR_PROC; + } + + function handleResponseBalance($balResult){ + global $CORE_LOCAL; + $resp = $this->desoapify("GiftTransactionResult", + $balResult["response"]); + $xml = new xmlData($resp); + $program = 'Gift'; + + if( $balResult['curlErr'] != CURLE_OK || $balResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + if (!$this->second_try){ + $this->second_try = True; + return $this->send_balance("w2.backuppay.com"); + } + else { + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); // comm error, try again + } + + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_response",$xml->array_dump()); + $resp = $CORE_LOCAL->get("paycard_response"); + if (isset($resp["BALANCE"])){ + $resp["Balance"] = $resp["BALANCE"]; + $CORE_LOCAL->set("paycard_response",$resp); + } + + // there's less to verify for balance checks, just make sure all the fields are there + if( $xml->isValid() && + $xml->get('TRANTYPE') && $xml->get('TRANTYPE') == 'PrePaid' + && $xml->get('CMDSTATUS') && $xml->get('CMDSTATUS') == 'Approved' + && $xml->get('BALANCE') + ) { + return PaycardLib::PAYCARD_ERR_OK; // balance checked, no error + } + + // the authorizor gave us some failure code + $CORE_LOCAL->set("boxMsg","Processor error: ".$xml->get_first("TEXTRESPONSE")); + return PaycardLib::PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + // generate a partially-daily-unique identifier number according to the gift card processor's limitations + // along with their CashierID field, it will be a daily-unique identifier on the transaction + function valutec_identifier($transID) { + global $CORE_LOCAL; + $transNo = (int)$CORE_LOCAL->get("transno"); + $laneNo = (int)$CORE_LOCAL->get("laneno"); + // fail if any field is too long (we don't want to truncate, since that might produce a non-unique refnum and cause bigger problems) + if( $transID > 999 || $transNo > 999 || $laneNo > 99) + return ""; + // assemble string + $ref = "00"; // fill all 10 digits, since they will if we don't and we want to compare with == later + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } // valutec_identifier() + + function getTermID(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("training") == 1) + return "595901"; + else + return MERCURY_GTERMINAL_ID; + } + + function getPw(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("training") == 1){ + return "xyz"; + } + else + return MERCURY_GPASSWORD; + } + + function getPAN(){ + global $CORE_LOCAL; + if (False && $CORE_LOCAL->get("training") == 1) + return "6050110000000296951"; + else + return $CORE_LOCAL->get("paycard_PAN"); + } + + function getTrack2(){ + global $CORE_LOCAL; + if (False && $CORE_LOCAL->get("training") == 1) + return False; + else + return $CORE_LOCAL->get("paycard_tr2"); + } +} diff --git a/pos/is4c-nf/plugins/Paycards/Paycards.php b/pos/is4c-nf/plugins/Paycards/Paycards.php new file mode 100755 index 000000000..b6ef6aca2 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/Paycards.php @@ -0,0 +1,57 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class Paycards extends Plugin { + + public $description = 'Plugin for integrated payment cards'; + + public $plugin_settings = array( + 'ccLive' => array( + 'label' => 'Live', + 'description' => 'Enable live integrated transactions', + 'default' => 1, + 'options' => array( + 'Yes' => 1, + 'No' => 0 + ) + ), + 'PaycardsCashierFacing' => array( + 'label' => 'Mode', + 'description' => 'Who is swiping the card?', + 'default' => 1, + 'options' => array( + 'Cashier' => 1, + 'Customer' => 0 + ) + ) + ); + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/Paycards/Valutec.php b/pos/is4c-nf/plugins/Paycards/Valutec.php new file mode 100755 index 000000000..b526c95ee --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/Valutec.php @@ -0,0 +1,809 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + * Valutec processing module + * + */ +if (!class_exists("AutoLoader")) include_once(realpath(dirname(__FILE__).'/../../lib/AutoLoader.php')); + +if (!class_exists("PaycardLib")) include_once(realpath(dirname(__FILE__)."/lib/PaycardLib.php")); + +class Valutec extends BasicCCModule { + var $temp; + // BEGIN INTERFACE METHODS + + /* handlesType($type) + * $type is a constant as defined in paycardLib.php. + * If you class can handle the given type, return + * True + */ + function handlesType($type){ + if ($type == PaycardLib::PAYCARD_TYPE_GIFT) return True; + else return False; + } + + /* entered($validate) + * This function is called in paycardEntered() + * [paycardEntered.php]. This function exists + * to move all type-specific handling code out + * of the paycard* files + */ + function entered($validate,$json){ + global $CORE_LOCAL; + // error checks based on card type + if( $CORE_LOCAL->get("gcIntegrate") != 1) { // credit card integration must be enabled + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Card Integration Disabled","Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + if( $CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_VOID) { + // use the card number to find the trans_id + $dbTrans = Database::tDataConnect(); + $today = date('Ymd'); // numeric date only, in an int field + $pan = $this->getPAN(); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + $sql = "SELECT transID FROM valutecRequest WHERE " + .$dbTrans->identifier_escape('date')."=".$today." AND PAN='".$pan."' " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Card Not Used","That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Multiple Uses","That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = $dbTrans->fetch_array($search); + return $this->paycard_void($payment['transID'],$json); + } + + // check card data for anything else + if( $validate) { + if( PaycardLib::paycard_validNumber($CORE_LOCAL->get("paycard_PAN")) != 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Invalid Card Number", + "Swipe again or type in manually","[clear] to cancel"); + return $json; + } else if( PaycardLib::paycard_accepted($CORE_LOCAL->get("paycard_PAN"), !PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_GIFT)) != 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unsupported Card Type", + "We cannot process " . $CORE_LOCAL->get("paycard_issuer") . " cards","[clear] to cancel"); + return $json; + } + } + + // other modes + switch( $CORE_LOCAL->get("paycard_mode")) { + case PaycardLib::PAYCARD_MODE_AUTH: + $CORE_LOCAL->set("paycard_amount",$CORE_LOCAL->get("amtdue")); + $CORE_LOCAL->set("paycard_id",$CORE_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgAuth.php'; + return $json; + + case PaycardLib::PAYCARD_MODE_ACTIVATE: + case PaycardLib::PAYCARD_MODE_ADDVALUE: + $CORE_LOCAL->set("paycard_amount",0); + $CORE_LOCAL->set("paycard_id",$CORE_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgGift.php'; + return $json; + + case PaycardLib::PAYCARD_MODE_BALANCE: + // forbid balance check on testcard2, because it prevents voiding of anything before (like activation), + // and we want testcard2 to remain inactive so that we can use it to test activations + if( !strcasecmp($CORE_LOCAL->get("paycard_PAN"),"7018525757980004481")) { // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Not Allowed", + "The second test gift card may not be Balance-Checked<br>Ask IT for details", + "[clear] to cancel"); + return $json; + } + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgBalance.php'; + return $json; + } // switch mode + + // if we're still here, it's an error + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Invalid Mode", + "This card type does not support that processing mode", + "[clear] to cancel"); + return $json; + } + + /* doSend() + * Process the paycard request and return + * an error value as defined in paycardLib.php. + * + * On success, return PaycardLib::PAYCARD_ERR_OK. + * On failure, return anything else and set any + * error messages to be displayed in + * $CORE_LOCAL->["boxMsg"]. + */ + function doSend($type){ + switch($type){ + case PaycardLib::PAYCARD_MODE_ACTIVATE: + case PaycardLib::PAYCARD_MODE_ADDVALUE: + case PaycardLib::PAYCARD_MODE_AUTH: + return $this->send_auth(); + case PaycardLib::PAYCARD_MODE_VOID: + case PaycardLib::PAYCARD_MODE_VOIDITEM: + return $this->send_void(); + case PaycardLib::PAYCARD_MODE_BALANCE: + return $this->send_balance(); + default: + return $this->setErrorMsg(0); + } + } + + /* cleanup() + * This function is called when doSend() returns + * PaycardLib::PAYCARD_ERR_OK. (see paycardAuthorize.php) + * I use it for tendering, printing + * receipts, etc, but it's really only for code + * cleanliness. You could leave this as is and + * do all the everything inside doSend() + */ + function cleanup($json){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_BALANCE: + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>Gift card balance: $".$resp["Balance"]."<p>\"rp\" to print<br>[enter] to continue</font>"); + break; + case PaycardLib::PAYCARD_MODE_ADDVALUE: + case PaycardLib::PAYCARD_MODE_ACTIVATE: + $CORE_LOCAL->set("autoReprint",1); + $ttl = $CORE_LOCAL->get("paycard_amount"); + PrehLib::deptkey($ttl*100,9020); + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>New card balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + if( !strcasecmp($CORE_LOCAL->get("paycard_PAN"),"7018525757980004481")) // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<br><b>REMEMBER TO VOID THIS</b><br>(ask IT for details)"); + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + case PaycardLib::PAYCARD_MODE_AUTH: + $CORE_LOCAL->set("autoReprint",1); + PrehLib::tender("GD", ($CORE_LOCAL->get("paycard_amount")*100)); + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Used: $".$CORE_LOCAL->get("paycard_amount")."<br />New balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + if( !strcasecmp($CORE_LOCAL->get("paycard_PAN"),"7018525757980004481")) // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<br><b>REMEMBER TO VOID THIS</b><br>(ask IT for details)"); + $CORE_LOCAL->set("boxMsg",$CORE_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip<br>[void] to cancel and void</font>"); + break; + case PaycardLib::PAYCARD_MODE_VOID: + case PaycardLib::PAYCARD_MODE_VOIDITEM: + $CORE_LOCAL->set("autoReprint",1); + $v = new Void(); + $v->voidid($CORE_LOCAL->get("paycard_id")); + $resp = $CORE_LOCAL->get("paycard_response"); + $CORE_LOCAL->set("boxMsg","<b>Voided</b><font size=-1><p>New balance: $".$resp["Balance"]."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + return $json; + } + + /* paycard_void($transID) + * Argument is trans_id to be voided + * Again, this is for removing type-specific + * code from paycard*.php files. + */ + function paycard_void($transID,$laneNo=-1,$transNo=-1,$json=array()) { + global $CORE_LOCAL; + // situation checking + if( $CORE_LOCAL->get("gcIntegrate") != 1) { // gift card integration must be enabled + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Card Integration Disabled", + "Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = Database::tDataConnect(); + $today = date('Ymd'); + $cashier = $CORE_LOCAL->get("CashierNo"); + $lane = $CORE_LOCAL->get("laneno"); + $trans = $CORE_LOCAL->get("transno"); + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount FROM valutecRequest WHERE " + .$dbTrans->identifier_escape('date')."=".$today." AND cashierNo=" + .$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = $dbTrans->fetch_array($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xAuthorized, + xAuthorizationCode FROM valutecResponse WHERE " + .$dbTrans->identifier_escape('date')."=".$today." + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] =PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM valutecRequestMod WHERE " + .$dbTrans->identifier_escape('date')."=".$today." AND cashierNo=" + .$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=" + .$transID." AND mode='void' AND xAuthorized='true'"; + $search = $dbTrans->query($sql); + $voided = $dbTrans->num_rows($search); + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] =PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = $dbTrans->fetch_array($search); + + // make sure the gift card transaction is applicable to void + if( !$response || $response['commErr'] != 0 || + $response['httpCode'] != 200 || $response['validResponse'] != 1) { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $voided > 0) { + $json['output'] =PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } else if( $request['live'] != PaycardLib::paycard_live(PaycardLib::PAYCARD_TYPE_GIFT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xAuthorized'] != 'true') { + $json['output'] = PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not approved","[clear] to cancel"); + return $json; + } else if( $response['xAuthorizationCode'] < 1) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Invalid authorization number","[clear] to cancel"); + return $json; + } + + // make sure the transaction line-item is applicable to void + if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + $json['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_GIFT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $CORE_LOCAL->set("paycard_PAN",$request['PAN']); + if( $request['mode'] == 'refund') + $CORE_LOCAL->set("paycard_amount",-$request['amount']); + else + $CORE_LOCAL->set("paycard_amount",$request['amount']); + $CORE_LOCAL->set("paycard_id",$transID); + $CORE_LOCAL->set("paycard_type",PaycardLib::PAYCARD_TYPE_GIFT); + if( $lineitem['trans_type'] == "T" && $lineitem['trans_subtype'] == "GD") { + $CORE_LOCAL->set("paycard_mode",PaycardLib::PAYCARD_MODE_VOID); + } else { + $CORE_LOCAL->set("paycard_mode",PaycardLib::PAYCARD_MODE_VOIDITEM); + } + + // display FEC code box + $plugin_info = new Paycards(); + $json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardboxMsgVoid.php'; + return $json; + } + + // END INTERFACE METHODS + + function send_auth(){ + global $CORE_LOCAL; + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = ""; + switch( $CORE_LOCAL->get("paycard_mode")) { + case PaycardLib::PAYCARD_MODE_AUTH: $mode = (($amount < 0) ? 'refund' : 'tender'); break; + case PaycardLib::PAYCARD_MODE_ADDVALUE: $mode = 'addvalue'; break; + case PaycardLib::PAYCARD_MODE_ACTIVATE: $mode = 'activate'; break; + default: return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); + } + $termID = $this->getTermID(); + $live = $this->isLive(); + $manual = ($CORE_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // store request in the database before sending it + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",identifier,terminalID,live," . + "mode,amount,PAN,manual"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s','%s',%d,", $now, $identifier, $termID, $live) . + sprintf("'%s',%s,'%s',%d", $mode, $amountText, $cardPAN, $manual); + $sql = "INSERT INTO valutecRequest (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if( !$dbTrans->query($sql)){ + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + } + + // assemble and send request + $authMethod = ""; + switch( $mode) { + case 'tender': $authMethod = 'Sale'; break; + case 'refund': + case 'addvalue': $authMethod = 'AddValue'; break; + case 'activate': $authMethod = 'ActivateCard'; break; + } + + $authFields = array( + 'ProgramType' => $program, + 'CardNumber' => (($cardTr2) ? $cardTr2 : $cardPAN), + 'Amount' => $amountText, + 'ServerID' => $cashierNo, + 'Identifier' => $identifier + ); + + $this->GATEWAY = "https://www.valutec.net/customers/transactions/valutec.asmx/"; + + $getData = urlencode($authMethod)."?"; + $getData .= "TerminalID=".urlencode($termID); + foreach ($authFields as $field => $value) + $getData .= "&".urlencode($field)."=".urlencode($value); + + return $this->curlSend($getData,'GET'); + } + + function send_void(){ + global $CORE_LOCAL; + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $cardPAN = $this->getPAN(); + $identifier = date('mdHis'); // the void itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + + // look up the auth code from the original response + // (card number and amount should already be in session vars) + $sql = "SELECT xAuthorizationCode FROM valutecResponse WHERE " + .$dbTrans->identifier_escape('date')."='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND + transNo=".$transNo." AND transID=".$transID; + $search = $dbTrans->query($sql); + if( !$search || $dbTrans->num_rows($search) != 1) + return PaycardLib::PAYCARD_ERR_NOSEND; // database error, nothing sent (ok to retry) + $log = $dbTrans->fetch_array($search); + $authcode = $log['xAuthorizationCode']; + $this->temp = $authcode; + + // assemble and send void request + $vdMethod = 'Void'; + $vdFields = array( + 'ProgramType' => $program, + 'CardNumber' => $cardPAN, + 'RequestAuthCode' => $authcode, + 'ServerID' => $cashierNo, + 'Identifier' => $identifier + ); + + $this->GATEWAY = "https://www.valutec.net/customers/transactions/valutec.asmx/"; + + $getData = urlencode($vdMethod)."?"; + $getData .= "TerminalID=".urlencode($termID); + foreach($vdFields as $field=>$value) + $getData .= "&".urlencode($field)."=".urlencode($value); + + return $this->curlSend($getData,'GET'); + + return $this->setErrorMsg(0); + } + + function send_balance(){ + global $CORE_LOCAL; + // prepare data for the request + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = date('mdHis'); // the balance check itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + + // assemble and send balance check + $balMethod = 'CardBalance'; + $balFields = array( + 'ProgramType' => $program, + 'CardNumber' => (($cardTr2) ? $cardTr2 : $cardPAN), + 'ServerID' => $cashierNo, + 'Identifier' => $identifier + ); + + $this->GATEWAY = "https://www.valutec.net/customers/transactions/valutec.asmx/"; + + $getData = urlencode($balMethod)."?"; + $getData .= "TerminalID=".urlencode($termID); + foreach($balFields as $field=>$value) + $getData .= "&".urlencode($field)."=".urlencode($value); + + return $this->curlSend($getData,'GET'); + } + + function handleResponse($authResult){ + global $CORE_LOCAL; + switch($CORE_LOCAL->get("paycard_mode")){ + case PaycardLib::PAYCARD_MODE_AUTH: + case PaycardLib::PAYCARD_MODE_ACTIVATE: + case PaycardLib::PAYCARD_MODE_ADDVALUE: + return $this->handleResponseAuth($authResult); + case PaycardLib::PAYCARD_MODE_VOID: + case PaycardLib::PAYCARD_MODE_VOIDITEM: + return $this->handleResponseVoid($authResult); + case PaycardLib::PAYCARD_MODE_BALANCE: + return $this->handleResponseBalance($authResult); + } + } + + function handleResponseAuth($authResult){ + global $CORE_LOCAL; + $xml = new xmlData($authResult["response"]); + + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $program = 'Gift'; + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // prepare some fields to store the parsed response; we'll add more as we verify it + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",identifier," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',", $now, $identifier) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + $errorMsg = $xml->get_first("ERRORMSG"); + $balance = $xml->get("BALANCE"); + + if ($validResponse){ + /* + tendering more than the available balance returns an "NSF" error message, + but no Balance field however, the available balance is buried in the + RawOutput field, so we can dig it out and fill in the missing Balance field + -- as of 1/22/08, valutec appears to now be returning the Balance field normally + (in its own XML field, not in RawOutput), but we still need to append it to + the Message so the cashier can see it + */ + if ($errorMsg && substr($errorMsg,0,3) == "NSF"){ + if (!$balance || $balance === ""){ + $rawOutput = $xml->get("RAWOUTPUT"); + $begin = strpos($rawOutput, "%1cBAL%3a"); + if( $begin !== false) { + $end = strpos($rawOutput, "%1c", $begin+1); + if( $end !== false && $end > $begin) { + $balance = trim(urldecode(substr($rawOutput,$begin+9,($end-$begin)-9))); + } + } + } + elseif ($balance && $balance !== ""){ + $errorMsg = "NSF, BAL: ".PaycardLib::paycard_moneyFormat($balance); + } + } + + // verify that echo'd fields match our request + if( $xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program + && $xml->get('IDENTIFIER') && $xml->get('IDENTIFIER') == $identifier + && $xml->get('AUTHORIZED') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else + $validResponse = -2; // response was parsed as XML but fields didn't match + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".$xml->get("AUTHORIZED")."'"; + $sqlValues .= ",'".$xml->get("AUTHORIZATIONCODE")."'"; + $sqlValues .= ",'".$balance."'"; + $sqlValues .= ",'".str_replace("'","",$errorMsg)."'"; + } + + // finish storing the response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + $dbTrans->query($sql); + + // check for communication errors (any cURL error or any HTTP code besides 200) + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); + } + + // check for data errors (any failure to parse response XML or echo'd field mismatch + if( $validResponse != 1) { + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was processed (use carbon) + } + + $amtUsed = $xml->get('CARDAMOUNTUSED'); + if ($amtUsed){ + $CORE_LOCAL->set("paycard_amount",$amtUsed); + $amtFixQ = "UPDATE valutecRequest SET amount=$amtUsed WHERE + identifier='$identifier' AND " + .$dbTrans->datediff($dbTrans->now(),'datetime')."=0"; + $dbTrans->query($amtFixQ); + } + + // put the parsed response into $CORE_LOCAL so the caller, receipt printer, etc can get the data they need + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $CORE_LOCAL->get("paycard_response"); + $temp["Balance"] = $temp["BALANCE"]; + $CORE_LOCAL->set("paycard_response",$temp); + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('AUTHORIZED') == 'true' && $xml->get('AUTHORIZATIONCODE') != '' && + $xml->get_first('ERRORMSG') == '') { + return PaycardLib::PAYCARD_ERR_OK; // authorization approved, no error + } + + // the authorizor gave us some failure code + $CORE_LOCAL->set("boxMsg","Processor error: ".$errorMsg); + return PaycardLib::PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + function handleResponseVoid($vdResult){ + global $CORE_LOCAL; + $xml = new xmlData($vdResult["response"]); + + // initialize + $dbTrans = Database::tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $CORE_LOCAL->get("CashierNo"); + $laneNo = $CORE_LOCAL->get("laneno"); + $transNo = $CORE_LOCAL->get("transno"); + $transID = $CORE_LOCAL->get("paycard_id"); + $amount = $CORE_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $authcode = $this->temp; + $program = "Gift"; + + $sqlColumns = + $dbTrans->identifier_escape('date').",cashierNo,laneNo,transNo,transID," . + $dbTrans->identifier_escape('datetime').",mode,origAuthCode," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("'%s','%s',", $mode, $authcode) . + sprintf("%f,%d,%d", $vdResult['curlTime'], $vdResult['curlErr'], $vdResult['curlHTTP']); + + $validResponse = 0; + // verify that echo'd fields match our request + if( $xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program + && $xml->get('AUTHORIZED') + && $xml->get('AUTHORIZATIONCODE') + && $xml->get('BALANCE') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else + $validResponse = -2; // response was parsed as XML but fields didn't match + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".$xml->get("AUTHORIZED")."'"; + $sqlValues .= ",'".$xml->get("AUTHORIZATIONCODE")."'"; + $sqlValues .= ",'".$xml->get("BALANCE")."'"; + $sqlValues .= ",'".$xml->get_first("ERRORMSG")."'"; + + // finish storing the request and response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + $dbTrans->query($sql); + + if( $vdResult['curlErr'] != CURLE_OK || $vdResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); // comm error, try again + } + // check for data errors (any failure to parse response XML or echo'd field mismatch) + if( $validResponse != 1) { + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was voided (use carbon) + } + + // put the parsed response into $CORE_LOCAL so the caller, receipt printer, etc can get the data they need + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $CORE_LOCAL->get("paycard_response"); + $temp["Balance"] = $temp["BALANCE"]; + $CORE_LOCAL->set("paycard_response",$temp); + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('AUTHORIZED') == 'true' && $xml->get('AUTHORIZATIONCODE') != '' + && $xml->get_first('ERRORMSG') == '') { + return PaycardLib::PAYCARD_ERR_OK; // void successful, no error + } + + // the authorizor gave us some failure code + $CORE_LOCAL->set("boxMsg","PROCESSOR ERROR: ".$xml->get_first("ERRORMSG")); + return PaycardLib::PAYCARD_ERR_PROC; + } + + function handleResponseBalance($balResult){ + global $CORE_LOCAL; + $xml = new xmlData($balResult["response"]); + $program = 'Gift'; + + if( $balResult['curlErr'] != CURLE_OK || $balResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + $CORE_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PaycardLib::PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PaycardLib::PAYCARD_ERR_COMM); // comm error, try again + } + + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_response",$xml->array_dump()); + $resp = $CORE_LOCAL->get("paycard_response"); + if (isset($resp["BALANCE"])){ + $resp["Balance"] = $resp["BALANCE"]; + $CORE_LOCAL->set("paycard_response",$resp); + } + + // there's less to verify for balance checks, just make sure all the fields are there + if( $xml->isValid() && + $xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program + && $xml->get('AUTHORIZED') && $xml->get('AUTHORIZED') == 'true' + && (!$xml->get('ERRORMSG') || $xml->get_first('ERRORMSG') == '') + && $xml->get('BALANCE') + ) { + return PaycardLib::PAYCARD_ERR_OK; // balance checked, no error + } + + // the authorizor gave us some failure code + $CORE_LOCAL->set("boxMsg","Processor error: ".$xml->get_first("ERRORMSG")); + return PaycardLib::PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + // generate a partially-daily-unique identifier number according to the gift card processor's limitations + // along with their CashierID field, it will be a daily-unique identifier on the transaction + function valutec_identifier($transID) { + global $CORE_LOCAL; + $transNo = (int)$CORE_LOCAL->get("transno"); + $laneNo = (int)$CORE_LOCAL->get("laneno"); + // fail if any field is too long (we don't want to truncate, since that might produce a non-unique refnum and cause bigger problems) + if( $transID > 999 || $transNo > 999 || $laneNo > 99) + return ""; + // assemble string + $ref = "00"; // fill all 10 digits, since they will if we don't and we want to compare with == later + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } // valutec_identifier() + + function getTermID(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("training") == 1) + return "45095"; + else + return $CORE_LOCAL->get("gcTermID"); + } + + function getPAN(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("training") == 1) + return "7018525936200000012"; + else + return $CORE_LOCAL->get("paycard_PAN"); + } + + function isLive(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("training") == 1) + return 0; + else + return 1; + } + + function getTrack2(){ + global $CORE_LOCAL; + if ($CORE_LOCAL->get("training") == 1) + return "7018525936200000012=68893620"; + else + return $CORE_LOCAL->get("paycard_tr2"); + } +} diff --git a/pos/is4c-nf/plugins/Paycards/ajax/ajax-paycard-auth.php b/pos/is4c-nf/plugins/Paycards/ajax/ajax-paycard-auth.php new file mode 100755 index 000000000..93bf7d214 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/ajax/ajax-paycard-auth.php @@ -0,0 +1,64 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (basename($_SERVER['PHP_SELF']) != basename(__FILE__)){ + return; +} + +ini_set('display_errors','Off'); +include_once(dirname(__FILE__).'/../../../lib/AutoLoader.php'); + +// send the request +$result = 0; // 0 is never returned, so we use it to make sure it changes +$myObj = 0; +$json = array(); +$plugin_info = new Paycards(); +$json['main_frame'] = $plugin_info->plugin_url().'/gui/paycardSuccess.php'; +$json['receipt'] = false; +foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + $myObj = new $rpc(); + if ($myObj->handlesType($CORE_LOCAL->get("paycard_type"))){ + break; + } +} + +$st = MiscLib::sigTermObject(); + +$result = $myObj->doSend($CORE_LOCAL->get("paycard_mode")); +if ($result === PaycardLib::PAYCARD_ERR_OK){ + PaycardLib::paycard_wipe_pan(); + $json = $myObj->cleanup($json); + $CORE_LOCAL->set("strRemembered",""); + $CORE_LOCAL->set("msgrepeat",0); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); +} +else { + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("msgrepeat",0); + $json['main_frame'] = MiscLib::base_url().'gui-modules/boxMsg2.php'; + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); +} + +echo JsonLib::array_to_json($json); diff --git a/pos/is4c-nf/plugins/Paycards/cacert.pem b/pos/is4c-nf/plugins/Paycards/cacert.pem new file mode 100755 index 000000000..9ae5c7f29 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/cacert.pem @@ -0,0 +1,3571 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Converted at: Wed Jan 26 04:12:05 2011 UTC +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## '/mozilla/security/nss/lib/ckfw/builtins/certdata.txt' +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Netscape security libraries. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1994-2000 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.53 $ $Date: 2009/05/21 19:50:28 $ + +Verisign/RSA Secure Server CA +============================= +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +IDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVow +XzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQL +EyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUA +A4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1Xp +sSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJ +VCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw4jrg7HFG +mhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2 +qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- + +GTE CyberTrust Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAw +WhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9u +MRwwGgYDVQQDExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH +6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswk +wB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEP +I2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGvU9oUtCG4 +1tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Personal Basic CA +======================== +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs +dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMY +VGhhd3RlIFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0 +aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhh +d3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +ITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29u +YWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C +FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJ +l+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY +0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAt4plrsD16 +iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7c8a914phXAPjLSeoF+CEhULcXpvG +t7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN +92NWod8isQ== +-----END CERTIFICATE----- + +Thawte Personal Premium CA +========================== +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs +dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMa +VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1p +dW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQG +EwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoT +EVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlz +aW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYb +cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ +Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ +8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicR +FTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GB +AGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIHb4Vnjt4rueIXsDqg8A6iAJrf8xQV +brvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+W +jS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- + +Thawte Personal Freemail CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs +dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMb +VGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVl +bWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNV +BAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJ +ARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC +gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6W +ZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgk +CGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjPMPuoSpaKH2JCI4wXD/S6ZJwXrEcp +352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK +/qarigd1iwzdUYRr5PjRzneigQ== +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +ABAecom (sub., Am. Bankers Assn.) Root CA +========================================= +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAwgYkxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3RvbjEXMBUGA1UEChMOQUJBLkVD +T00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWlu +QGRpZ3NpZ3RydXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5F +Q09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1p +bkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVD +BwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1j +Vv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNf +WiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtx +A6k4ShZsiSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94 +Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQgwDQYJKoZI +hvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0kqS8Kfv2kRLD4VAe9G52dyntQJHsR +W0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJh +koHWG9YA8A6eKHegTYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm +/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ +O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 2 +======================================= +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1 +czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0 +YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBS +b290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4 +NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE +BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER +MA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEW +EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLGJrbn +pT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZ +PdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGA +vqPYUrBEzUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5y +P4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn7pTKBBMFYgZw +I7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAojeyP2n714Z5 +VEkxlTMr89EJFEliYIalsBHiUMIdBlc+LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2 +vAd5ZWRzfdd5ynvVWlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX +8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q +gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2kYtdo+o56T9II +2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 4 +======================================= +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1 +czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0 +YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBS +b290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2 +MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE +BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER +MA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEW +EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANx18IzA +dZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva +3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9 +kVySVGkl5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP +17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCvbK4iNC7Va26D +unm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtTYOXeFhKFoR +ZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT +4EOvkTvRyyzYdFQ6HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV +6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q +10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK +1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTla +MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg +MSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw +0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7 +NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf +7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnx +giJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0A +NACY89FxlA== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAy +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6 +Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/ +S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIobK/o5wXTX +XtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUY +YAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2 +lw0Xd8rY +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd +k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq +WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM +XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC +lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx +nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC +wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK +1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk +LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4 +xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH +qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF +WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB +ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E +bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ +rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ +Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB +FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h +a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc +D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y +azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug +b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 +tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 +C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS +0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs +Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 +JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx +JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j +GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Secure Personal CA +============================== +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8v +Q1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1 +c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJV +UzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRf +Q0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5 +OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdv +kHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGp +OZ5V+Pux5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTm +T173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkwggEVMIHkoIHh +oIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3 +dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBs +aWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 +cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNVHRAEJDAigA8x +OTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU +xPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1Ud +EwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K +8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6h +URzzwy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYG +JqibGapEPHayXOw= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +Visa International Global Root 2 +================================ +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMxDTALBgNVBAoT +BFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIw +EAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYD +VQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZp +Y2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW +73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1 +t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm7Igbthkn +GziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhl +V7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYE +FJ59SzS/ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0G +CSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdpNSYx/scuhMKZ +YdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQkIqUs38oW26sTTMs7WXcFsziza6k +PWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOe +yti12HvOdUVmB/RtLdh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 +ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- + +beTRUSTed Root CA +================= +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJXVzESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBDQXMxGjAYBgNVBAMTEWJlVFJV +U1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMC +V1cxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYD +VQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0 +c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgz +eubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCg +c0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNn +mrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5 +c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8w +ggFZBgNVHSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFS +ZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFu +Y2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBv +ZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJl +IGZvdW5kIGF0IGJlVFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t +L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 +L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQxCzAJBgNVBAYT +AldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3e +KjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR ++csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/b +ow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ +1gMe1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWu +GVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpGEK5BV2Vs +PyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Verisign Time Stamping Authority CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCBwTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZl +cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWdu +IFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UE +ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNV +BAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSww +KgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhj +zCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6o +v8uQjI11S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEA +MEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl +cmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20v +cGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRw +Oi8vb2NzcC52ZXJpc2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 +DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea +w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU58dzq6wf7iWb +wBbtt8pb8BQ= +-----END CERTIFICATE----- + +Thawte Time Stamping CA +======================= +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg +Q0EwHhcNOTcwMTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEd +MBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBp +bmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+o +J9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9 +nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCo +uqoEiYbC9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCe +d/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJSdM= +-----END CERTIFICATE----- + +Entrust.net Global Secure Server CA +=================================== +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGluY29ycC4gYnkgcmVmLiAobGlt +aXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE +AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0w +MDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0G +A1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh +Yi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRy +dXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55l +xyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439P +mrkDQYC2dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEB +BAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0 +cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMT +MUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr +47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbv +H9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3 +a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- + +Entrust.net Global Secure Personal CA +===================================== +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcx +NjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQl +hK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKkl +Wb1m9fkn5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNV +HR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAwPgYDVQQLFDd3 +d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUw +IwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5l +dCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAM +BgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQF +AAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xK +p9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQ +Gof4T4HHdguEOnKdzmVml64mXg== +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +AOL Time Warner Root Certification Authority 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT +FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD +VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAy +MDUyOTA2MDAwMFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg +VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu +QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8 +hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkG +IBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93 +f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQI +fHNlIAqhBC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNj +MGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+XxIwHwYDVR0j +BBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA +A4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u +0FIy2VkyvNp5ctZ7CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf +WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoWH1iCC+GWaQVL +juyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- + +AOL Time Warner Root Certification Authority 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT +FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD +VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAy +MDUyOTA2MDAwMFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg +VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu +QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8 +TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWsi4SVqBax +7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17n +OirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2w +TPDaRrbqJS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rS +AG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxmlJ85per5n0/xQ +pCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFhEVsVS6kkUfykXPcXnbDS+gfpj1bk +GoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuW +CpTehTacyH+BCQJJKg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex +MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7 ++z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI +5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcC +tQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ +68W/ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3 +p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5O8t1wswv +ziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD062KRffaJ00psUjf5BHklka9 +bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4o +GKQWDzH9OmwjkyB24f0HhdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2 +uBOLZ8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- + +beTRUSTed Root CA-Baltimore Implementation +========================================== +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx +GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Et +QmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVow +ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV +BAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ ++2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8Co +Cd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9fHBOB1Bir +lNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNe +DsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOC +Ah4wggIaMA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJ +KIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNlIG9mIHRoaXMg +Q2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVudCBhbmQgYWNjZXB0YW5jZSBvZiB0 +aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwg +dGhlIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 +eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDBB +BggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2lu +ZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR +3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6s +vfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyX +EHu67RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfq +jjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5dUX2xZ/2j +vTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py05yc493EG931t3GzUwWJBtDL +SoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- + +beTRUSTed Root CA - Entrust Implementation +========================================== +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx +GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Eg +LSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1ow +ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV +BAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0c +S12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE7 +0mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkbhepxKYhB +MvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1i +JAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOC +AwUwggMBMIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYB +BQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNyZWF0 +ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9u +IFByYWN0aWNlIFN0YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj +aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUFBwIBFjZodHRw +czovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZI +AYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEb +MBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAt +IEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0 +MTEwODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44 +iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNVHRMEBTAD +AQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEAKrgX +zh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevd +kObRVlTa4y0MnxEylCIBevZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/ +T220Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2kXgCl +zMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYhxKlkqu9FNtEaZnz4 +6TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- + +beTRUSTed Root CA - RSA Implementation +====================================== +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBiMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMmYmVUUlVT +VGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEy +MTEwNzI1WjBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRuj +brWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTu +lh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xs +N+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQh +hlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMB +AAGjggIYMIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAAD +CSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNf +c2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIBOhqCATZSZWxpYW5jZSBvbiBvciB1 +c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2Nl +cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv +bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNU +ZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9p +bmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAd +BgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTB +mMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05 +pmuKmET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqN +Wz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNMm2+fG8oe +qqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8ymmFei74pnykkiFY5LKjSq5YD +WtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +RSA Security 1024 v3 +==================== +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAy +MjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV +3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4m +mdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1Blq +FikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAf +BgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUM +X96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBD +leMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNu +mU4/iXgDmMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +UTN-USER First-Network Applications +=================================== +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp +BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 +WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T +YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB +cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug +mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj +DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu +Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi +P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE +j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w +HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j +cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK +RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp +xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq +DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +TC TrustCenter, Germany, Class 2 CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI +EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD +bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 +ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt +YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy +aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg +MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs +qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N +u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy +LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf +/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2 +9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac +ASZ4smZHcFFk +-----END CERTIFICATE----- + +TC TrustCenter, Germany, Class 3 CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI +EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD +bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 +ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt +YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy +aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg +MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN +2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7 +7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy +LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B +u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm +5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS +CdS7kjXvD9s0 +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +IPS Chained CAs root +==================== +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEy +MjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJ +QmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwu +MSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJ +UFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBD +QSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBz +QG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQgvJhPUOtopKdJ +C7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCBhYEFcYGdtJUZqV92NC5jNzVXjrQf +Qj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQID +AQABo4IEQzCCBD8wHQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC +AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBw +dWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNV +HQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF +BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGC +NwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZp +Y2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8v +d3d3Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5l +cy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5p +cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz +L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw +Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hAK+/b +lkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M9 +2GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- + +IPS CLASE1 root +=============== +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG +SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFow +ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU +Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT +RTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5BlmvXSHU0lq4 +oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBSYmL9Yzt9fuzuOOpi9GyocY3h6YvJ +P8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQW +BBTrsxl588GlHKzcuh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb +adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz +LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL +EyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg +Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB +BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R +BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB +hvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l +cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB +BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCGSAGG ++EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTEuaHRtbD8w +PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5o +dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw +MDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l +cy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1urxUq2 +ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmO +DszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9UkE6tsSU= +-----END CERTIFICATE----- + +IPS CLASE3 root +=============== +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG +SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFow +ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU +Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT +RTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49NzjaY2uQARIwo +2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY8jjsbJ0gA8DvqqPGZARRLXgNo9Ko +OtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQW +BBS4k/8uy9wsjqLnev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj +mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz +LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL +EyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg +Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB +BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R +BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB +hvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l +cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB +BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCGSAGG ++EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTMuaHRtbD8w +PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5o +dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw +MDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l +cy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc4gYt +fibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUE +NPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkOE7LFRVA= +-----END CERTIFICATE----- + +IPS CLASEA1 root +================ +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMy +WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u +YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM +QVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2mdd81u4D/u6zJf +X5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4WwdByOgF9H5fahGRpEiqLJpxq339fWU +oTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNV +HQ4EFgQUZyaW56G/2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 +3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj +ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G +A1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ +UyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG +AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3 +dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg +hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmww +QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF +QTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh +bENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw +Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINmyq0e +B81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5bi +KcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- + +IPS CLASEA3 root +================ +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUw +WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u +YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM +QVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uGBiJ2MwwSbUhW +YdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHUVqLyjRGZ/fZ98cfEXgIqmuJKtROK +AP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNV +HQ4EFgQUHp9XUEe2YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 +2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj +ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G +A1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ +UyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG +AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3 +dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg +hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmww +QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF +QTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh +bENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw +Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB/MjD +81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9S +KcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- + +IPS Servidores root +=================== +-----BEGIN CERTIFICATE----- +MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJD +RUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYG +A1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMx +CzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcG +A1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD +Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3PqHILVik +gDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Eh +im51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GB +ACzzw3lYJN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2 +/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58GNCr+Lh3B0Zx +8coLY1xq+XKU1QFPoNtC +-----END CERTIFICATE----- + +IPS Timestamping root +===================== +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1 +MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQH +EwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu +bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsT +K0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQ +UyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEW +D2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLjuVqWajOY2ycJi +oGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4Efdo/BdApWgnMjvEp+ZCccWZ73b/ +K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0Gm +qaMCAwEAAaOCBIAwggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC +AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5J +LkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB +/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK +KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVz +MBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5n +IENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8vd3d3 +Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCGSAGG+EIBAwQ4FjZo +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJ +YIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu +Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lU +aW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMv +aXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH +MAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoe +FAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWT +s/zif/WN87GphV+I3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 1 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw +NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 +7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 +EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl +0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 +2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa +HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT +iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 +28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV +yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR +vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P +qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z +IRlXvVWa +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Email Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 +BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 +OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx +FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz +dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx +B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 +om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG +TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl +yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE +AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV +HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne +xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ +5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV +NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ +w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +UTN USERFirst Object Root CA +============================ +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb +BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz +NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx +HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy +dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR +loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ +w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu +lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 +RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL +BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 +ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly +c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO +PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE +qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG +hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Qualified (Class QA) Root +================================= +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn +eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 +bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 +LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 +dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP +aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV +CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e +8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb +m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ +0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM +0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 +YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p +a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz +YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg +YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg +ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov +L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr +Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 +aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg +YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 +IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 +DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN +wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg +W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc +R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR +5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Ltd. +============= +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsT +EUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoX +DTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcT +BUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVw +LjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0B +CQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOe +yEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+ +o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2 +IhULpNYILzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1Ud +DgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+MtUNjIExtpid +jShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWls +YXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw +JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIB +DQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0 +cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9y +Zy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhB +OlP1ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6w +NnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjnfg== +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Platinum CA - G2 +========================== +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw +HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM +U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu +669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF +eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne +WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo +j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 +8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T +aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy +domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D ++m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV +CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv +zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 +Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 +NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 +U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 +KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl +9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B +aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs +OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY +Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci +IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +DigiNotar Root CA +================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQG +EwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEgMB4G +CSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwHhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgx +OTIxWjBfMQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90 +YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B8cp86Yxq +7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXYtsMW2YiwsYcdcNqGtA8U +i3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIlHgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8 +ZkqQfioLBQftFl9VkHXYRskbg+IIvvEjzJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEq +bYRAhU52mXyC8/O3AlnUJgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4 +iHomGgVMktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXva5pk +XuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57pK6kwe6AYHw4YC+Vb +qdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMipuih2TkGl/VujQKQjBR7P4DNG5y6 +xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovTyD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHc +BmfFlHqabWJMfczgZICynkeOowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC +jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXyfJ9oHbtdzno5 +wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBoY6pFITlIYXg23PFDk9Qlx/KA +ZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHoM/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedT +FLJgQT2EkTFoPSdE2+Xe9PpjRchMPpj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKf +yvBovWsdst+Nbwed2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoA +ZbwH/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQlnQ7KN+ZQ +/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jEO1hZibCMjFCz2IbLaKPE +CudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU9jQZjHkJNsphFyUXC4KYcwx3dMPVDceo +EkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +MD5 Collisions Forged Rogue CA 25c3 +=================================== +-----BEGIN CERTIFICATE----- +MIIEMjCCA5ugAwIBAgIBQjANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTA0MDczMTAwMDAwMVoXDTA0MDkwMjAwMDAwMVowPDE6MDgGA1UEAxMxTUQ1 +IENvbGxpc2lvbnMgSW5jLiAoaHR0cDovL3d3dy5waHJlZWRvbS5vcmcvbWQ1KTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEAuqZZySwo1iqw+O2fRqSkN+4OGWhZ0bMDmVHWFppeN2sV4A5L9YRk ++KPbQW811ZsVH9vEOFJwgZdej6C193458DKsHq1E0rP6SMPOkZvs9Jx84Vr1yDdrmoPe58oglzFC +cxWRaPSIr/koKMXpD3OwF0sTTJl10ETmfghsGvJPG0ECAwEAAaOCAiQwggIgMAsGA1UdDwQEAwIB +xjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSnBGAfq3JDCMV/CJBVVhzWzuY46zAfBgNVHSME +GDAWgBS+qKB0clBrRLfJI9j7qP+zV2tobDCCAb4GCWCGSAGG+EIBDQSCAa8WggGrMwAAACdeOeCJ +YQ9Oo8VFCza7AdFTqsMIj2/4Tz6Hh0QR3GDg35JV+bhzG1STxZ/QRsRgtjVizbmvHKhpGslbPJY3 +wO1n77v+wIucUC8pvYMino4I+qwTcKJYf2JiihH3ifbftmdZcxb7YxaKtJE4zi71tr5MpJRJ5GUR +CkIVycEw4mnVRX2lJru5YexiZPA54ee8aNhQUZ4dYNPRo6cK+AMgoXABF5E2TwJwMYaD3fcP2Acd +EbMTBKXc8K5QsSgOY2kqDIJvj0cz32yiBpLxT0W+2TA2oyuM1neuNWN/Tkyak0g22Z8CAwEAAaOB +vTCBujAOBgNVHQ8BAf8EBAMCBPAwHQYDVR0OBBYEFM2mg/qlYDf3ljcXKd5BePGHiVXnMDsGA1Ud +HwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwuZ2VvdHJ1c3QuY29tL2NybHMvZ2xvYmFsY2ExLmNybDAf +BgNVHSMEGDAWgBS+qKB0clBrRLfJI9j7qP+zV2tobDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB +BQUHAwIwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQQFAAOBgQCnIQKN0Q6igHcl/UNgFY/s75BH +1IRCFSYRHM3CPBApqbbfq1d1kdrlK7OQRRwwY1Y/itlQ+u1YbMBlrGZX3hzGdjv1AA6ORc5/TJDs +K8bNs7SPYtD+t8UmckTt9phbrsvRlfXaCL5oRrF1yOwdjx56lPGqU3iiRa5U6tGedMh2Zw== +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +S-TRUST Authentication and Encryption Root CA 2005 PN +===================================================== +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh +cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT +LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w +NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk +ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj +aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp +b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob +4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL +g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf +eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 +KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB +/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv +bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU +D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 +P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA +nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit +F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b +Hz2eBIPdltkdOpQ= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra+¡z Certic+ímara S.A. +========================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign CA +========== +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD +EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy +MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp +Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q +ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy +P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN +GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk +YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM +rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy +oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P +AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ +VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 +QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI +mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb +/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG +zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF7DCCBNSgAwIBAgIQbsx6pacDIAm4zrz06VLUkTANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMTAwMjA4MDAwMDAwWhcNMjAwMjA3MjM1OTU5WjCBtTEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQg +aHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDEvMC0GA1UEAxMmVmVy +aVNpZ24gQ2xhc3MgMyBTZWN1cmUgU2VydmVyIENBIC0gRzMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCxh4QfwgxF9byrJZenraI+nLr2wTm4i8rCrFbG +5btljkRPTc5v7QlK1K9OEJxoiy6Ve4mbE8riNDTB81vzSXtig0iBdNGIeGwCU/m8 +f0MmV1gzgzszChew0E6RJK2GfWQS3HRKNKEdCuqWHQsV/KNLO85jiND4LQyUhhDK +tpo9yus3nABINYYpUHjoRWPNGUFP9ZXse5jUxHGzUL4os4+guVOc9cosI6n9FAbo +GLSa6Dxugf3kzTU2s1HTaewSulZub5tXxYsU5w7HnO1KVGrJTcW/EbGuHGeBy0RV +M5l/JJs/U0V/hhrzPPptf4H1uErT9YU3HLWm0AnkGHs4TvoPAgMBAAGjggHfMIIB +2zA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlz +aWduLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMHAGA1UdIARpMGcwZQYLYIZIAYb4 +RQEHFwMwVjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2Nw +czAqBggrBgEFBQcCAjAeGhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMDQG +A1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwudmVyaXNpZ24uY29tL3BjYTMtZzUu +Y3JsMA4GA1UdDwEB/wQEAwIBBjBtBggrBgEFBQcBDARhMF+hXaBbMFkwVzBVFglp +bWFnZS9naWYwITAfMAcGBSsOAwIaBBSP5dMahqyNjmvDz4Bq1EgYLHsZLjAlFiNo +dHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvLmdpZjAoBgNVHREEITAfpB0w +GzEZMBcGA1UEAxMQVmVyaVNpZ25NUEtJLTItNjAdBgNVHQ4EFgQUDURcFlNEwYJ+ +HSCrJfQBY9i+eaUwHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6Aq8zMTMwDQYJ +KoZIhvcNAQEFBQADggEBAAyDJO/dwwzZWJz+NrbrioBL0aP3nfPMU++CnqOh5pfB +WJ11bOAdG0z60cEtBcDqbrIicFXZIDNAMwfCZYP6j0M3m+oOmmxw7vacgDvZN/R6 +bezQGH1JSsqZxxkoor7YdyT3hSaGbYcFQEFn0Sc67dxIHSLNCwuLvPSxe/20majp +dirhGi2HbnTTiN0eIsbfFrYrghQKlFzyUOyvzv9iNw2tZdMGQVPtAhTItVgooazg +W+yzf5VK+wPIrSbb5mZ4EkrZn0L74ZjmQoObj49nJOhhGbXdzbULJgWOw27EyHW4 +Rs/iGAZeqa6ogZpHFt4MKGwlJ7net4RYxh84HqTEy2Y= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0DCCBDmgAwIBAgIQJQzo4DBhLp8rifcFTXz4/TANBgkqhkiG9w0BAQUFADBf +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT +LkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMDYxMTA4MDAwMDAwWhcNMjExMTA3MjM1OTU5WjCByjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZv +ciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8 +RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbext0uz/o9+B1fs70Pb +ZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhDY2pSS9KP6HBR +TdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNH +iDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMB +AAGjggGbMIIBlzAPBgNVHRMBAf8EBTADAQH/MDEGA1UdHwQqMCgwJqAkoCKGIGh0 +dHA6Ly9jcmwudmVyaXNpZ24uY29tL3BjYTMuY3JsMA4GA1UdDwEB/wQEAwIBBjA9 +BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVy +aXNpZ24uY29tL2NwczAdBgNVHQ4EFgQUf9Nlp8Ld7LvwMAnzQzn6Aq8zMTMwbQYI +KwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQU +j+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29t +L3ZzbG9nby5naWYwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v +b2NzcC52ZXJpc2lnbi5jb20wPgYDVR0lBDcwNQYIKwYBBQUHAwEGCCsGAQUFBwMC +BggrBgEFBQcDAwYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEBBQUA +A4GBABMC3fjohgDyWvj4IAxZiGIHzs73Tvm7WaGY5eE43U68ZhjTresY8g3JbT5K +lCDDPLq9ZVTGr0SzEK0saz6r1we2uIFjxfleLuUqZ87NMwwq14lWAyMfs77oOghZ +tOxFNfeKW/9mz1Cvxm1XjRl4t7mi0VfqH5pLr7rJjhJ+xr3/ +-----END CERTIFICATE----- diff --git a/pos/is4c-nf/plugins/Paycards/gui/paycardSuccess.php b/pos/is4c-nf/plugins/Paycards/gui/paycardSuccess.php new file mode 100755 index 000000000..dea649300 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/gui/paycardSuccess.php @@ -0,0 +1,222 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../../lib/AutoLoader.php'); + +class paycardSuccess extends BasicPage { + + function preprocess(){ + global $CORE_LOCAL; + + /* ajax poll to check for sig img */ + if (isset($_REQUEST['poll'])){ + $attempt = $this->sig_check(); + if ($attempt === False) + echo "notfound"; + else + echo $attempt; + return False; + } + + // check for input + if(isset($_REQUEST["reginput"])) { + $input = strtoupper(trim($_POST["reginput"])); + + $mode = $CORE_LOCAL->get("paycard_mode"); + $type = $CORE_LOCAL->get("paycard_type"); + $tender_id = $CORE_LOCAL->get("paycard_id"); + if( $input == "" || $input == "CL") { // [enter] or [clear] exits this screen + // remember the mode, type and transid before we reset them + $CORE_LOCAL->set("boxMsg",""); + // store signature if present + // if this is just a signature request, not + // a full cc/gift transaction, associate + // it with last trans_id + if ($CORE_LOCAL->get("SigCapture") != "" && + $CORE_LOCAL->get("paycard_amount") >= $CORE_LOCAL->get("CCSigLimit")){ + $db = Database::tDataConnect(); + if ($tender_id == 0) $tender_id = $CORE_LOCAL->get("LastID"); + $sigQ = sprintf("INSERT INTO CapturedSignature VALUES + (%s,%d,%d,%d,%d,'%s','%s')", + $db->now(),$CORE_LOCAL->get("CashierNo"), + $CORE_LOCAL->get("laneno"), + $CORE_LOCAL->get("transno"), + $tender_id, + substr($CORE_LOCAL->get("CapturedSigFile"),-3), + $db->escape(file_get_contents($CORE_LOCAL->get("CapturedSigFile"))) + ); + $db->query($sigQ); + $CORE_LOCAL->set("CapturedSigFile",""); + $CORE_LOCAL->set("SigSlipType",""); + $this->sig_check(True); + } + + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("strRemembered","TO"); + $CORE_LOCAL->set("msgrepeat",1); + + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if ($mode == PaycardLib::PAYCARD_MODE_AUTH && $input == "VD" + && ($CORE_LOCAL->get('CacheCardType') == 'CREDIT' || $CORE_LOCAL->get('CacheCardType') == '')){ + $plugin_info = new Paycards(); + $this->change_page($plugin_info->plugin_url()."/gui/paycardboxMsgVoid.php"); + return False; + } + } + /* shouldn't happen unless session glitches + but getting here implies the transaction + succeeded */ + $var = $CORE_LOCAL->get("boxMsg"); + if (empty($var)){ + $CORE_LOCAL->set("boxMsg", + "<b>Approved</b><font size=-1> + <p>&nbsp; + <p>[enter] to continue + <br>[void] to cancel and void + </font>"); + } + return True; + } + + function sig_check($clear=False){ + global $CORE_LOCAL; + + if ($CORE_LOCAL->get("SigCapture")=="") return False; + + $deviceClass = $CORE_LOCAL->get("SigCapture"); + $device = new $deviceClass(); + if (!is_object($device)) return False; + + if ($clear) + $device->WriteToScale("reset"); + else { + $img = $device->poll("getsig"); + $img = str_replace("\\","/",$img); + $CORE_LOCAL->set("CapturedSigFile",$device->getpath().$img); + } + + return $CORE_LOCAL->get("CapturedSigFile"); + } + + function head_content(){ + ?> + <script type="text/javascript"> + function submitWrapper(){ + var str = $('#reginput').val(); + if (str.toUpperCase() == 'RP'){ + $.ajax({url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-end.php', + cache: false, + type: 'post', + data: 'receiptType='+$('#rp_type').val(), + success: function(data){} + }); + $('#reginput').val(''); + return false; + } + return true; + } + function getImg(){ + $.ajax({url: 'paycardSuccess.php', + cache: false, + type: 'post', + data: 'poll=1', + success: setImg + }); + } + function setImg(ret_data){ + if (ret_data){ + var ext = ret_data.substr(ret_data.lastIndexOf('.') + 1); + if (ext == "bmp"){ + $('#sigimg').attr('src',ret_data); + } + else{ + setTimeout('getImg()',500); + } + } + else + setTimeout('getImg()',500); + } + </script> + <?php + } + + function body_content(){ + global $CORE_LOCAL; + $this->input_header("onsubmit=\"return submitWrapper();\" action=\"".$_SERVER['PHP_SELF']."\""); + ?> + <div class="baseHeight"> + <?php + /* + $header = "Wedge - Payment Card"; + if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_CREDIT) $header = "Wedge - Credit Card"; + else if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_GIFT) $header = "Wedge - Gift Card"; + else $CORE_LOCAL->set("boxMsg","Please verify cardholder signature"); + */ + // show signature if available + if ($CORE_LOCAL->get("SigCapture") != "" && + $CORE_LOCAL->get("paycard_amount") >= $CORE_LOCAL->get("CCSigLimit")){ + $img = $CORE_LOCAL->get("CapturedSigFile"); + if(!is_file($img)) $img=""; + $newstr = "<img src=\"$img\" width=200 id=\"sigimg\" style=\"border:solid 1px black;\" />"; + $msg = "<b>Approved</b><font size=-1> + <p>$newstr + <p>[enter] to continue"; + if ($CORE_LOCAL->get('CacheCardType') == 'CREDIT' || $CORE_LOCAL->get('CacheCardType') == '') + $msg .= "<br>[void] to cancel and void"; + $CORE_LOCAL->set("boxMsg",$msg); + $this->add_onload_command("setTimeout('getImg()',500);"); + } + echo DisplayLib::boxMsg($CORE_LOCAL->get("boxMsg"),"",True); + $CORE_LOCAL->set("msgrepeat",2); + //UdpComm::udpSend('goodBeep'); + UdpComm::udpSend('termApproved'); + ?> + </div> + <?php + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + + $rp_type = ''; + if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_GIFT) { + if( $CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_BALANCE) { + $rp_type = "gcBalSlip"; + } + else { + $rp_type ="gcSlip"; + } + } + else if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_CREDIT) { + $rp_type = "ccSlip"; + } + else if( $CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_ENCRYPTED) { + $rp_type = "ccSlip"; + } + printf("<input type=\"hidden\" id=\"rp_type\" value=\"%s\" />",$rp_type); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new paycardSuccess(); diff --git a/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgAuth.php b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgAuth.php new file mode 100755 index 000000000..20f886b1f --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgAuth.php @@ -0,0 +1,133 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + Modifications copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../../lib/AutoLoader.php'); + +class paycardboxMsgAuth extends PaycardProcessPage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $CORE_LOCAL->set("ccTermOut","resettotal:". + str_replace(".","",sprintf("%.2f",$CORE_LOCAL->get("amtdue")))); + $st = MiscLib::sigTermObject(); + if (is_object($st)) + $st->WriteToScale($CORE_LOCAL->get("ccTermOut")); + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("CachePanEncBlock",""); + $CORE_LOCAL->set("CachePinEncBlock",""); + $CORE_LOCAL->set("CacheCardType",""); + $CORE_LOCAL->set("CacheCardCashBack",0); + UdpComm::udpSend("termReset"); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if ($input == ""){ + if ($this->validate_amount()){ + $this->action = "onsubmit=\"return false;\""; + $this->add_onload_command("paycard_submitWrapper();"); + } + } + else if( $input != "" && substr($input,-2) != "CL") { + // any other input is an alternate amount + $CORE_LOCAL->set("paycard_amount","invalid"); + if( is_numeric($input)){ + $CORE_LOCAL->set("paycard_amount",$input/100); + if ($CORE_LOCAL->get('CacheCardCashBack') > 0 && $CORE_LOCAL->get('CacheCardCashBack') <= 40) + $CORE_LOCAL->set('paycard_amount',($input/100)+$CORE_LOCAL->get('CacheCardCashBack')); + } + } + // if we're still here, we haven't accepted a valid amount yet; display prompt again + } // post? + return True; + } + + function validate_amount(){ + global $CORE_LOCAL; + $amt = $CORE_LOCAL->get("paycard_amount"); + $due = $CORE_LOCAL->get("amtdue"); + $type = $CORE_LOCAL->get("CacheCardType"); + if( !is_numeric($amt) || abs($amt) < 0.005) { + } else if( $amt > 0 && $due < 0) { + } else if( $amt < 0 && $due > 0) { + } else if ( ($amt-$due)>0.005 && $type != 'DEBIT' && $type != 'EBTCASH'){ + } else { + return True; + } + return False; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + // generate message to print + $type = $CORE_LOCAL->get("paycard_type"); + $mode = $CORE_LOCAL->get("paycard_mode"); + $amt = $CORE_LOCAL->get("paycard_amount"); + $due = $CORE_LOCAL->get("amtdue"); + $cb = $CORE_LOCAL->get('CacheCardCashBack'); + if ($cb > 0) $amt -= $cb; + if( !is_numeric($amt) || abs($amt) < 0.005) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount: $amt $due", + "Enter a different amount","[clear] to cancel"); + } else if( $amt > 0 && $due < 0) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a negative amount","[clear] to cancel"); + } else if( $amt < 0 && $due > 0) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a positive amount","[clear] to cancel"); + } else if ( ($amt-$due)>0.005 && $type != 'DEBIT' && $type != 'EBTCASH'){ + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Cannot exceed amount due","[clear] to cancel"); + } else if( $amt > 0) { + $msg = "Tender ".PaycardLib::paycard_moneyFormat($amt); + if ($CORE_LOCAL->get("CacheCardType") != "") + $msg .= " as ".$CORE_LOCAL->get("CacheCardType"); + if ($cb > 0) + $msg .= ' (CB:'.PaycardLib::paycard_moneyFormat($cb).')'; + echo PaycardLib::paycard_msgBox($type,$msg."?","","[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } else if( $amt < 0) { + echo PaycardLib::paycard_msgBox($type,"Refund ".PaycardLib::paycard_moneyFormat($amt)."?","","[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } else { + echo PaycardLib::paycard_errBox($type,"Invalid Entry", + "Enter a different amount","[clear] to cancel"); + } + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new paycardboxMsgAuth(); diff --git a/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgBalance.php b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgBalance.php new file mode 100755 index 000000000..5d8416c4b --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgBalance.php @@ -0,0 +1,69 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../../lib/AutoLoader.php'); + +class paycardboxMsgBalance extends PaycardProcessPage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + PaycardLib::paycard_reset(); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // when checking balance, no input is confirmation to proceed + if( $input == "") { + $this->add_onload_command("paycard_submitWrapper();"); + $this->action = "onsubmit=\"return false;\""; + } + // any other input is unrecognized, display prompt again + } // post? + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + echo PaycardLib::paycard_msgBox(PaycardLib::PAYCARD_TYPE_GIFT,"Check Card Balance?", + "If you proceed, you <b>cannot void</b> any previous action on this card!", + "[enter] to continue<br>[clear] to cancel"); + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new paycardboxMsgBalance(); diff --git a/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgGift.php b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgGift.php new file mode 100755 index 000000000..1e234d9e4 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgGift.php @@ -0,0 +1,106 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../../lib/AutoLoader.php'); + +class paycardboxMsgGift extends PaycardProcessPage { + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + $CORE_LOCAL->set("msgrepeat",0); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + PaycardLib::paycard_reset(); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + // when (de)activating/adding-value, double check that the current amount is acceptable + // before checking input (similar logic is later when generating the message) + $amtValid = false; + $amt = $CORE_LOCAL->get("paycard_amount"); + if( !is_numeric($amt) || $amt < 0.005) { + } else { + // all errors are caught above; here, the amount is okay + $amtValid = true; + } + + // no input is confirmation to proceed + if( $input == "" && $amtValid) { + $this->add_onload_command("paycard_submitWrapper();"); + $this->action = "onsubmit=\"return false;\""; + } + else if( $input != "" && substr($input,-2) != "CL") { + // any other input is an alternate amount + $CORE_LOCAL->set("paycard_amount","invalid"); + if( is_numeric($input)) + $CORE_LOCAL->set("paycard_amount",$input/100); + } + // if we're still here, we haven't accepted a valid amount yet; display prompt again + } // post? + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + // generate message to print + $type = $CORE_LOCAL->get("paycard_type"); + $mode = $CORE_LOCAL->get("paycard_mode"); + $amt = $CORE_LOCAL->get("paycard_amount"); + if( $amt == 0) { + if( $mode == PaycardLib::PAYCARD_MODE_ACTIVATE) + echo PaycardLib::paycard_msgBox($type,"Enter Activation Amount", + "Enter the amount to put on the card", + "[clear] to cancel"); + else if( $mode == PaycardLib::PAYCARD_MODE_ADDVALUE) + echo PaycardLib::paycard_msgBox($type,"Enter Add-Value Amount", + "Enter the amount to put on the card", + "[clear] to cancel"); + } else if( !is_numeric($amt) || $amt < 0.005) { + echo PaycardLib::paycard_msgBox($type,"Invalid Amount", + "Enter a positive amount to put on the card", + "[clear] to cancel"); + } else if( $mode == PaycardLib::PAYCARD_MODE_ACTIVATE) { + echo PaycardLib::paycard_msgBox($type,"Activate ".PaycardLib::paycard_moneyFormat($amt)."?","", + "[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } else if( $mode == PaycardLib::PAYCARD_MODE_ADDVALUE) { + echo PaycardLib::paycard_msgBox($type,"Add Value ".PaycardLib::paycard_moneyFormat($amt)."?","", + "[enter] to continue if correct<br>Enter a different amount if incorrect<br>[clear] to cancel"); + } + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new paycardboxMsgGift(0,1); diff --git a/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgVoid.php b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgVoid.php new file mode 100755 index 000000000..8ad88246f --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/gui/paycardboxMsgVoid.php @@ -0,0 +1,113 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../../lib/AutoLoader.php'); + +class paycardboxMsgVoid extends PaycardProcessPage { + + protected $mask_input = True; + + function preprocess(){ + global $CORE_LOCAL; + // check for posts before drawing anything, so we can redirect + if( isset($_REQUEST['reginput'])) { + $input = strtoupper(trim($_REQUEST['reginput'])); + // CL always exits + if( $input == "CL") { + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",'TO'); + $CORE_LOCAL->set("toggletax",0); + $CORE_LOCAL->set("togglefoodstamp",0); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + + $continue = false; + // when voiding tenders, the input must be an FEC's passcode + if( $CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_VOID && $input != "" && substr($input,-2) != "CL") { + $sql = "select emp_no, FirstName, LastName from employees" . + " where EmpActive=1 and frontendsecurity>=11 and AdminPassword=".(int)$input; + $db = Database::pDataConnect(); + $result = $db->query($sql); + if( $db->num_rows($result) > 0) { + $CORE_LOCAL->set("adminP",$input); + $continue = true; + } + } + // when voiding items, no code is necessary, only confirmation + if( $CORE_LOCAL->get("paycard_mode") != PaycardLib::PAYCARD_MODE_VOID && $input == "") + $continue = true; + // go? + if( $continue) { + // send the request, then disable the form + $this->add_onload_command('paycard_submitWrapper();'); + $this->action = "onsubmit=\"return false;\""; + } + // if we're still here, display prompt again + } // post? + else if ($CORE_LOCAL->get("paycard_mode") == PaycardLib::PAYCARD_MODE_AUTH){ + // call paycard_void on first load to set up + // transaction and check for problems + $id = $CORE_LOCAL->get("paycard_id"); + foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + $myObj = new $rpc(); + if ($myObj->handlesType($CORE_LOCAL->get("paycard_type"))){ + $ret = $myObj->paycard_void($id); + if (isset($ret['output']) && !empty($ret['output'])){ + $CORE_LOCAL->set("boxMsg",$ret['output']); + $this->change_page($this->page_url."gui-modules/boxMsg2.php"); + return False; + } + break; + } + } + } + return True; + } + + function body_content(){ + global $CORE_LOCAL; + ?> + <div class="baseHeight"> + <?php + // generate message to print + $type = $CORE_LOCAL->get("paycard_type"); + $mode = $CORE_LOCAL->get("paycard_mode"); + $amt = $CORE_LOCAL->get("paycard_amount"); + if( $mode == PaycardLib::PAYCARD_MODE_VOIDITEM) { + echo PaycardLib::paycard_msgBox($type,"Void " . PaycardLib::paycard_moneyFormat($amt) . " Gift Card?","","[enter] to continue voiding<br>[clear] to cancel the void"); + } else if( $amt > 0) { + echo PaycardLib::paycard_msgBox($type,"Void " . PaycardLib::paycard_moneyFormat($amt) . " Payment?","Please enter password then","[enter] to continue voiding or<br>[clear] to cancel the void"); + } else { + echo PaycardLib::paycard_msgBox($type,"Void " . PaycardLib::paycard_moneyFormat($amt) . " Refund?","Please enter password then","[enter] to continue voiding or<br>[clear] to cancel the void"); + } + $CORE_LOCAL->set("msgrepeat",2); + ?> + </div> + <?php + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new paycardboxMsgVoid(); diff --git a/pos/is4c-nf/plugins/Paycards/lib/LS_Access.php b/pos/is4c-nf/plugins/Paycards/lib/LS_Access.php new file mode 100755 index 000000000..1482b4d5b --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/lib/LS_Access.php @@ -0,0 +1,44 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class LS_Access + Alternate for LocalStorage to + simplify auditing cc-handling code +*/ +class LS_Access { + + function get($str){ + if (!isset($_SESSION["$str"])) return ""; + return $_SESSION["$str"]; + } + + function set($k, $v){ + $_SESSION["$k"] = $v; + } +} + +if(ini_get('session.auto_start')==0 && !headers_sent()) + @session_start(); + +?> diff --git a/pos/is4c-nf/plugins/Paycards/lib/PaycardLib.php b/pos/is4c-nf/plugins/Paycards/lib/PaycardLib.php new file mode 100755 index 000000000..dced8f305 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/lib/PaycardLib.php @@ -0,0 +1,580 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!isset($CORE_LOCAL)){ + include(realpath(dirname(__FILE__)."/LS_Access.php")); + $CORE_LOCAL = new LS_Access(); +} + +/** + @class PaycardLib + @brief Defines constants and functions for card processing. +*/ + +class PaycardLib { + + const PAYCARD_MODE_BALANCE =1; + const PAYCARD_MODE_AUTH =2; + const PAYCARD_MODE_VOID =3; // for voiding tenders/credits, rung in as T + const PAYCARD_MODE_ACTIVATE =4; + const PAYCARD_MODE_ADDVALUE =5; + const PAYCARD_MODE_VOIDITEM =6; // for voiding sales/addvalues, rung in as I + const PAYCARD_MODE_CASHOUT =7; // for cashing out a wedgecard + + const PAYCARD_TYPE_UNKNOWN =0; + const PAYCARD_TYPE_CREDIT =1; + const PAYCARD_TYPE_GIFT =2; + const PAYCARD_TYPE_STORE =3; + const PAYCARD_TYPE_ENCRYPTED =4; + + const PAYCARD_ERR_OK =1; + const PAYCARD_ERR_NOSEND =-1; + const PAYCARD_ERR_COMM =-2; + const PAYCARD_ERR_TIMEOUT =-3; + const PAYCARD_ERR_DATA =-4; + const PAYCARD_ERR_PROC =-5; + const PAYCARD_ERR_CONTINUE =-6; + +// identify payment card type, issuer and acceptance based on card number +// individual functions are based on this one +/** + Identify card based on number + @param $pan card number + @return array with keys: + - 'type' paycard type constant + - 'issuer' Vista, MasterCard, etc + - 'accepted' boolean, whether card is accepted + - 'test' boolean, whether number is a testing card +*/ +static public function paycard_info($pan) { + $len = strlen($pan); + $iin = (int)substr($pan,0,7); + $issuer = "Unknown"; + $type = self::PAYCARD_TYPE_UNKNOWN; + $accepted = false; + $test = false; + if( $len >= 13 && $len <= 16) { + $type = self::PAYCARD_TYPE_CREDIT; + if( $iin>=3000000 && $iin<=3099999) { $issuer="Diners Club"; } + else if( $iin>=3400000 && $iin<=3499999) { $issuer="American Express"; $accepted=true; } + else if( $iin>=3528000 && $iin<=3589999) { $issuer="JCB"; $accepted=true; } // Japan Credit Bureau, accepted via Discover + else if( $iin>=3600000 && $iin<=3699999) { $issuer="MasterCard"; $accepted=true; } // Diners Club issued as MC in the US + else if( $iin>=3700000 && $iin<=3799999) { $issuer="American Express"; $accepted=true; } + else if( $iin>=3800000 && $iin<=3899999) { $issuer="Diners Club"; } // might be obsolete? + else if( $iin>=4000000 && $iin<=4999999) { $issuer="Visa"; $accepted=true; } + else if( $iin>=5100000 && $iin<=5599999) { $issuer="MasterCard"; $accepted=true; } + else if( $iin>=6011000 && $iin<=6011999) { $issuer="Discover"; $accepted=true; } + else if( $iin>=6221260 && $iin<=6229259) { $issuer="UnionPay"; $accepted=true; } // China UnionPay, accepted via Discover + else if( $iin>=6500000 && $iin<=6599999) { $issuer="Discover"; $accepted=true; } + } else if( $len == 19) { + $type = self::PAYCARD_TYPE_GIFT; + if( $iin>=7019208 && $iin<=7019208) { $issuer="Co-op Gift"; $accepted=true; } // NCGA gift cards + else if( $iin>=7018525 && $iin<=7018525) { $issuer="Valutec Gift"; $test=true; } // valutec test cards (linked to test merchant/terminal ID) + else if ($iin>=6050110 && $iin<=6050110) { + $issuer="Co-Plus Gift Card"; $accepted=true; + } + } + else if (substr($pan,0,8) == "02E60080"){ + $type = self::PAYCARD_TYPE_ENCRYPTED; + $accepted = true; + } + return array('type'=>$type, 'issuer'=>$issuer, 'accepted'=>$accepted, 'test'=>$test); +} // paycard_info() + + +// determine if we accept the card given the number; return 1 if yes, 0 if no +/** + Check whether a given card is accepted + @param $pan the card number + @param $acceptTest boolean + @return + - 1 if accepted + - 0 if not accepted + + $acceptTest controls the behavior with + testing cards. True makes test cards + accepted. +*/ +static public function paycard_accepted($pan, $acceptTest) { + $info = self::paycard_info($pan); + /* + if( $info['test'] && $acceptTest) + return 1; + */ + return ($info['accepted'] ? 1 : 0); +} // paycard_accepted() + + +/** + Determine card type + @param $pan the card number + @return a paycard type constant +*/ +static public function paycard_type($pan) { + $info = self::paycard_info($pan); + return $info['type']; +} // paycard_type() + + +// determine who issued a payment card given the number; return the issuer as a string or "Unknown" +/** + Get paycard issuer + @param $pan the card number + @return string issuer + + Issuers include "Visa", "American Express", "MasterCard", + and "Discover". Unrecognized cards will return "Unknown". +*/ +static public function paycard_issuer($pan) { + $info = self::paycard_info($pan); + return $info['issuer']; +} // paycard_issuer() + + +/** + Check whether paycards of a given type are enabled + @param $type is a paycard type constant + @return + - 1 if type is enabled + - 0 if type is disabled +*/ +static public function paycard_live($type = self::PAYCARD_TYPE_UNKNOWN) { + global $CORE_LOCAL; + + // these session vars require training mode no matter what card type + if( $CORE_LOCAL->get("training") != 0 || $CORE_LOCAL->get("CashierNo") == 9999) + return 0; + // special session vars for each card type + if( $type === self::PAYCARD_TYPE_CREDIT) { + if( $CORE_LOCAL->get("ccLive") != 1) + return 0; + } else if( $type === self::PAYCARD_TYPE_GIFT) { + if( $CORE_LOCAL->get("training") == 1) + return 0; + } else if( $type === self::PAYCARD_TYPE_STORE) { + if( $CORE_LOCAL->get("storecardLive") != 1) + return 0; + } + return 1; +} // paycard_live() + + +/** + Clear paycard variables from $CORE_LOCAL. +*/ +static public function paycard_reset() { + global $CORE_LOCAL; + + // make sure this matches session.php!!! + $CORE_LOCAL->set("paycard_manual",0); + $CORE_LOCAL->set("paycard_amount",0.00); + $CORE_LOCAL->set("paycard_mode",0); + $CORE_LOCAL->set("paycard_id",0); + $CORE_LOCAL->set("paycard_PAN",''); + $CORE_LOCAL->set("paycard_exp",''); + $CORE_LOCAL->set("paycard_name",'Customer'); + $CORE_LOCAL->set("paycard_tr1",false); + $CORE_LOCAL->set("paycard_tr2",false); + $CORE_LOCAL->set("paycard_tr3",false); + $CORE_LOCAL->set("paycard_type",0); + $CORE_LOCAL->set("paycard_issuer",'Unknown'); + $CORE_LOCAL->set("paycard_response",array()); + $CORE_LOCAL->set("paycard_trans",''); + $CORE_LOCAL->set("paycard_cvv2",''); +} // paycard_reset() + +/** + Clear card data variables from $CORE_LOCAL. + + <b>Storing card data in $CORE_LOCAL is + not recommended</b>. +*/ +static public function paycard_wipe_pan(){ + global $CORE_LOCAL; + $CORE_LOCAL->set("paycard_tr1",false); + $CORE_LOCAL->set("paycard_tr2",false); + $CORE_LOCAL->set("paycard_tr3",false); + $CORE_LOCAL->set("paycard_PAN",''); + $CORE_LOCAL->set("paycard_exp",''); +} + + +/** + Validate number using Luhn's Algorithm + @param $pan the card number + @return + - 1 if the number is valid + - 0 if the number is invalid +*/ +static public function paycard_validNumber($pan) { +/* Luhn Algorithm <en.wikipedia.org/wiki/Luhn_algorithm> +1. Starting with the rightmost digit (which is the check digit) and moving left, double the value of every second digit. For any + digits that thus become 10 or more, add their digits together as if casting out nines. For example, 1111 becomes 2121, while + 8763 becomes 7733 (from 2*6=12 -> 1+2=3 and 2*8=16 -> 1+6=7). +2. Add all these digits together. For example, if 1111 becomes 2121, then 2+1+2+1 is 6; and 8763 becomes 7733, so 7+7+3+3 is 20. +3. If the total ends in 0 (put another way, if the total modulus 10 is congruent to 0), then the number is valid according to the + Luhn formula; else it is not valid. So, 1111 is not valid (as shown above, it comes out to 6), while 8763 is valid (as shown above, + it comes out to 20). +*/ + // prepare the doubling-summing conversion array + $doublesum = array(0=>0,1=>2,2=>4,3=>6,4=>8,5=>1,6=>3,7=>5,8=>7,9=>9); + // turn the number into a string, reverse it, and split it into an array of characters (which are digits) + /* php5 */ //$digits = str_split(strrev((string)$pan)); + /* php4 */ $digits = preg_split('//', strrev((string)$pan), -1, PREG_SPLIT_NO_EMPTY); + // run the sum + $sum = 0; + foreach( $digits as $index => $digit) { + // $index starts at 0 but counts from the right, so we double any digit with an odd index + if( ($index % 2) == 1) $sum += $doublesum[(int)$digit]; + else $sum += (int)$digit; + } + // it has to end in 0 (meaning modulo:10 == 0) + if( ($sum % 10) != 0) + return 0; + // ok + return 1; +} // paycard_validNumber() + + +// determine if the expiration date (passed as a string, MMYY) is a valid date and is not in the past +// return 1 if ok, error code < 0 if not +/** + Validate expiration date + @param $exp expiration formatted MMYY + @return + - 1 if ok + - -1 if the argument is malformed + - -2 if the month is smarch-y + - -3 if the date is in the past +*/ +static public function paycard_validExpiration($exp) { + // verify expiration format (MMYY) + if( strlen($exp) != 4 || !ctype_digit($exp)) + return -1; + // extract expiration parts (month, then year) + $eM = (int)substr($exp,0,2); + $eY = (int)substr($exp,2,2); + // check month range + if( $eM < 1 || $eM > 12) + return -2; + // get today's date + $cM = (int)date('n'); // Numeric representation of a month, without leading zeros (1 through 12) + $cY = (int)date('y'); // A two digit representation of a year (99 or 03) + // check date + if( $eY < $cY) + return -3; + if( $eY == $cY && $eM < $cM) + return -3; + // ok + return 1; +} // paycard_validExpiration() + + +/** + Extract information from a magnetic stripe + @param $data the stripe data + @return An array with keys: + - 'pan' the card number + - 'exp' the expiration as MMYY + - 'name' the cardholder name + - 'tr1' data from track 1 + - 'tr2' data from track 1 + - 'tr3' data from track 1 + + Not all values will be found in every track. + Keys with no data will be set to False. + + If the data is really malformed, the return + will be an error code instead of an array. +*/ +static public function paycard_magstripe($data) { + global $CORE_LOCAL; + + // initialize + $tr1 = false; + $weirdTr1 = false; + $tr2 = false; + $tr3 = false; + $pan = false; + $exp = false; + $name = false; + + // track types are identified by start-sentinel values, but all track types end in '?' + $tracks = explode('?', $data); + foreach( $tracks as $track) { + if( substr($track,0,1) == '%') { // track1 start-sentinel + if( substr($track,1,1) != 'B') { // payment cards must have format code 'B' + $weirdTr1 = substr($track,1); + //return -1; // unknown track1 format code + } else if( $tr1 === false) { + $tr1 = substr($track,1); + } else { + return -2; // there should only be one track with the track1 start-sentinel + } + } else if( substr($track,0,1) == ';') { // track2/3 start sentinel + if( $tr2 === false) { + $tr2 = substr($track,1); + } else if( $tr3 === false) { + $tr3 = substr($track,1); + } else { + return -3; // there should only be one or two tracks with the track2/3 start-sentinel + } + } + else if (substr($track,0,1) == "T"){ + // tender amount. not really a standard + // sentinel, but need the value sent + // from cc-terminal if in case it differs + $amt = str_pad(substr($track,1),3,'0',STR_PAD_LEFT); + $amt = substr($amt,0,strlen($amt)-2).".".substr($amt,-2); + $CORE_LOCAL->set("paycard_amount",$amt); + } + // ignore tracks with unrecognized start sentinels + // readers often put E? or something similar if they have trouble reading, + // even when they also provide entire usable tracks + } // foreach magstripe track + + // if we have track1, parse it + if( $tr1) { + $tr1a = explode('^', $tr1); + if( count($tr1a) != 3) + return -5; // can't parse track1 + $pan = substr($tr1a[0],1); + $exp = substr($tr1a[2],2,2) . substr($tr1a[2],0,2); // month and year are reversed on the track data + $tr1name = explode('/', $tr1a[1]); + if( count($tr1name) == 1) { + $name = trim($tr1a[1]); + } else { + $name = ""; + for( $x=1; isset($tr1name[$x]); $x++) + $name .= trim($tr1name[$x]) . " "; + $name = trim($name . trim($tr1name[0])); + } + } + + // if we have track2, parse it + if( $tr2) { + $tr2a = explode('=', $tr2); + if( count($tr2a) != 2) + return -6; // can't parse track2 + // if we don't have track1, just use track2's data + if( !$tr1) { + $pan = $tr2a[0]; + $exp = substr($tr2a[1],2,2) . substr($tr2a[1],0,2); // month and year are reversed on the track data + $name = "Customer"; + } else { + // if we have both, make sure they match + if( $tr2a[0] != $pan) + return -7; // PAN mismatch + else if( (substr($tr2a[1],2,2).substr($tr2a[1],0,2)) != $exp) + return -8; // exp mismatch + } + } + + if ($tr3){ + // format not well documented, very + // basic check for validity + if (strstr($tr3,"=")) $tr3 = false; + } + + // if we never got what we need (no track1 or track2), fail + if( !$pan || !$exp) + return -4; + + // ok + $output = array(); + $output['pan'] = $pan; + $output['exp'] = $exp; + $output['name'] = $name; + $output['tr1'] = $tr1; + $output['tr2'] = $tr2; + $output['tr3'] = $tr3; + return $output; +} // paycard_magstripe() + + + +// return a card number with digits replaced by *s, except for some number of leading or tailing digits as requested +static public function paycard_maskPAN($pan,$first,$last) { + $mask = ""; + // sanity check + $len = strlen($pan); + if( $first + $last >= $len) + return $pan; + // prepend requested digits + if( $first > 0) + $mask .= substr($pan, 0, $first); + // mask middle + $mask .= str_repeat("*", $len - ($first+$last)); + // append requested digits + if( $last > 0) + $mask .= substr($pan, -$last); + + return $mask; +} // paycard_maskPAN() + + +// helper static public function to format money amounts pre-php5 +static public function paycard_moneyFormat($amt) { + $sign = ""; + if( $amt < 0) { + $sign = "-"; + $amt = -$amt; + } + return $sign."$".number_format($amt,2); +} // paycard_moneyFormat + + +// helper static public function to build error messages +static public function paycard_errorText($title, $code, $text, $retry, $standalone, $refuse, $carbon, $tellIT, $type) { + global $CORE_LOCAL; + + // pick the icon + if( $carbon) + $msg = "<img src='graphics/blacksquare.gif'> "; + else if( $refuse) + $msg = "<img src='graphics/bluetri.gif'> "; + else + $msg = "<img src='graphics/redsquare.gif'> "; + // write the text + $msg .= "<b>".trim($title)."</b>"; + //if( $code) + $msg .= "<br><font size=-2>(#R.".$code.")</font>"; + $msg .= "<font size=-1><br><br>"; + if( $text) + $msg .= $text."<br>"; + // write the options + $opt = ""; + if( $refuse) { $opt .= ($opt ? ", or" : "") . " request <b>other payment</b>"; } + if( $retry) { $opt .= ($opt ? ", or" : "") . " <b>retry</b>"; } + if( $standalone) { $opt .= ($opt ? ", or" : "") . " process in <b>standalone</b>"; } + if( $carbon) { + if( $type == self::PAYCARD_TYPE_CREDIT) { $opt .= ($opt ? ", or" : "") . " take a <b>carbon</b>"; } + else { $opt .= ($opt ? ", or" : "") . " process <b>manually</b>"; } + } + if( $opt) { $opt = "Please " . $opt . "."; } + if( $tellIT) { $opt = trim($opt." <i>(Notify IT)</i>"); } + if( $opt) + $msg .= $opt."<br>"; + $msg .= "<br>"; + // retry option? + if( $retry) { + $msg .= "[enter] to retry<br>"; + } else { + $CORE_LOCAL->set("strEntered",""); + $CORE_LOCAL->set("strRemembered",""); + } + $msg .= "[clear] to cancel</font>"; + return $msg; +} // paycard_errorText() + + +// display a paycard-related error due to cashier mistake +static public function paycard_msgBox($type, $title, $msg, $action) { + global $CORE_LOCAL; + $header = "IT CORE - Payment Card"; + if( $CORE_LOCAL->get("paycard_type") == self::PAYCARD_TYPE_CREDIT) $header = "Wedge - Credit Card"; + else if( $CORE_LOCAL->get("paycard_type") == self::PAYCARD_TYPE_GIFT) $header = "Wedge - Gift Card"; + else if( $CORE_LOCAL->get("paycard_type") == self::PAYCARD_TYPE_STORE) $header = "Wedge - Wedge Card"; + $boxmsg = "<span class=\"larger\">".trim($title)."</span><p />"; + $boxmsg .= trim($msg)."<p />".trim($action); + return DisplayLib::boxMsg($boxmsg,$header,True); +} // paycard_msgBox() + + +// display a paycard-related error due to system, network or other non-cashier mistake +static public function paycard_errBox($type, $title, $msg, $action) { + global $CORE_LOCAL; + + $header = "Wedge - Payment Card"; + if( $CORE_LOCAL->get("paycard_type") == self::PAYCARD_TYPE_CREDIT) $header = "Wedge - Credit Card"; + else if( $CORE_LOCAL->get("paycard_type") == self::PAYCARD_TYPE_GIFT) $header = "Wedge - Gift Card"; + else if( $CORE_LOCAL->get("paycard_type") == self::PAYCARD_TYPE_STORE) $header = "Wedge - Wedge Card"; + return DisplayLib::xboxMsg("<b>".trim($title)."</b><p><font size=-1>".trim($msg)."<p>".trim($action)."</font>", $header); +} // paycard_errBox() + +static private $paycardDB = null; + +static public function paycard_db(){ + global $CORE_LOCAL; + + if (self::$paycardDB === null){ + self::$paycardDB = new SQLManager('127.0.0.1',$CORE_LOCAL->get('DBMS'), + $CORE_LOCAL->get('tDatabase'),$CORE_LOCAL->get('localUser'), + $CORE_LOCAL->get('localPass')); + } + return self::$paycardDB; +} + +static public function paycard_db_query($query_text,$link){ + return self::$paycardDB->query($query_text); +} + +static public function paycard_db_num_rows($result){ + return self::$paycardDB->num_rows($result); +} + +static public function paycard_db_fetch_row($result){ + return self::$paycardDB->fetch_row($result); +} + +static public function paycard_db_escape($str, $link){ + return self::$paycardDB->escape($str); +} + +/* +summary of ISO standards for credit card magnetic stripe data tracks: +http://www.cyberd.co.uk/support/technotes/isocards.htm +(hex codes and character representations do not match ASCII - they are defined in the ISO spec) + +TRACK 1 + {S} start sentinel: 0x05 '%' + {C} format code: for credit cards, 0x22 'B' + {F} field seperator: 0x3F '^' + {E} end sentinel: 0x1F '?' + {V} checksum character + format: {S}{C}cardnumber{F}cardholdername{F}extra{E}{V} + 'extra' begins with expiration date as YYMM, then service code CCC, then unregulated extra data + length: 79 characters total + +TRACK 2 + {S} start sentinel: 0x0B ';' + {F} field seperator: 0x0D '=' + {E} end sentinel: 0x0F '?' + {V} checksum character + format: {S}cardnumber{F}extra{E}{V} + 'extra' begins with expiration date as YYMM, then service code CCC, then unregulated extra data + length: 40 characters total + +TRACK 3 + {S} start sentinel: 0x0B ';' + {C} format code: varies + {F} field seperator: 0x0D '=' + {E} end sentinel: 0x0F '?' + {V} checksum character + format: {S}{C}{C}data{F}data{E}{V} + length: 107 characters +*/ + +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/lib/PaycardProcessPage.php b/pos/is4c-nf/plugins/Paycards/lib/PaycardProcessPage.php new file mode 100755 index 000000000..8fb1c37b0 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/lib/PaycardProcessPage.php @@ -0,0 +1,146 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** @class PaycardProcessPage + + This class automatically includes the header and footer + and also defines some useful javascript functions + + Normally the submit process looks like this: + - Cashier presses enter, POST-ing to the page + - In preprocess(), the included javascript function + paycard_submitWrapper() is queued using + BasicPage:add_onload_command() + - The $action property get set to something "safe" + like onsubmit="return false;" so that repeatedly + pressing enter won't cause multiple submits + */ + +class PaycardProcessPage extends BasicPage { + + var $onload_commands; + + /** + The input form action. See BasicPage::input_header() + for format information + */ + var $action; + + function PaycardProcessPage(){ + $this->action = ""; + parent::BasicPage(); + } + + /** + Include some paycard submission javascript functions. + Automatically called during page print. + */ + function paycard_jscript_functions(){ + $plugin_info = new Paycards(); + ?> + <script type="text/javascript"> + function paycard_submitWrapper(){ + $.ajax({url: '<?php echo $plugin_info->plugin_url(); ?>/ajax/ajax-paycard-auth.php', + cache: false, + type: 'post', + dataType: 'json', + success: function(data){ + var destination = data.main_frame; + if (data.receipt){ + $.ajax({url: '<?php echo $this->page_url; ?>ajax-callbacks/ajax-end.php', + cache: false, + type: 'post', + data: 'receiptType='+data.receipt, + error: function(){ + location = destination; + }, + success: function(data){ + location = destination; + } + }); + } + else + location = destination; + }, + error: function(){ + location = '<?php echo $plugin_info->plugin_url(); ?>/gui/paycardboxMsgAuth.php'; + } + }); + paycard_processingDisplay(); + return false; + } + function paycard_processingDisplay(){ + var content = $('div.baseHeight').html(); + if (content.length >= 23) + content = 'Waiting for response.'; + else + content += '.'; + $('div.baseHeight').html(content); + setTimeout('paycard_processingDisplay()',1000); + } + </script> + <?php + } + + function print_page(){ + $my_url = $this->page_url; + ?> + <!DOCTYPE html> + <html> + <?php + echo "<head>"; + echo "<title>COREPOS</title>"; + // 18Aug12 EL Add content/charset. + echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$my_url}css/pos.css\">"; + echo "<script type=\"text/javascript\" + src=\"{$my_url}js/jquery.js\"></script>"; + $this->paycard_jscript_functions(); + $this->head_content(); + echo "</head>"; + echo '<body class="'.$this->body_class.'">'; + echo "<div id=\"boundingBox\">"; + $this->input_header($this->action); + $this->body_content(); + echo "<div id=\"footer\">"; + echo DisplayLib::printfooter(); + echo "</div>"; + echo "</div>"; + $this->scale_box(); + $this->scanner_scale_polling(false); + if (!empty($this->onload_commands)){ + echo "\n<script type=\"text/javascript\">\n"; + echo "\$(document).ready(function(){\n"; + echo $this->onload_commands; + echo "});\n"; + echo "</script>\n"; + } + // 18Aug12 EL Moved after ready-script. + echo "</body>\n"; + echo "</html>"; + } + +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/lib/SigCapture.php b/pos/is4c-nf/plugins/Paycards/lib/SigCapture.php new file mode 100755 index 000000000..1cbacea5d --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/lib/SigCapture.php @@ -0,0 +1,41 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class SigCapture { + +static public function term_object(){ + global $CORE_LOCAL; + $termDriver = $CORE_LOCAL->get("SigCapture"); + $td = 0; + if ($termDriver != "" && !class_exists($termDriver)){ + include(realpath(dirname(__FILE__). + '/../scale-drivers/php-wrappers/'.$termDriver.'.php')); + $td = new $termDriver(); + } + if (is_object($td)) return $td; + return False; +} + +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/lib/paycardEntered.php b/pos/is4c-nf/plugins/Paycards/lib/paycardEntered.php new file mode 100755 index 000000000..cfd7be9c5 --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/lib/paycardEntered.php @@ -0,0 +1,231 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("PaycardLib")) + include_once(realpath(dirname(__FILE__)."/paycardLib.php")); +if (!isset($CORE_LOCAL)){ + include_once(realpath(dirname(__FILE__)."/LS_Access.php")); + $CORE_LOCAL = new LS_Access(); +} + +class paycardEntered extends Parser { + var $swipestr; + var $swipetype; + var $manual; + + function check($str){ + if (substr($str,-1,1) == "?"){ + $this->swipestr = $str; + $this->swipetype = PaycardLib::PAYCARD_TYPE_UNKNOWN; + $this->manual = False; + return True; + } + elseif (substr($str,0,8) == "02E60080" || substr($str,0,7)=="2E60080"){ + $this->swipestr = $str; + $this->swipetype = PaycardLib::PAYCARD_TYPE_ENCRYPTED; + $this->manual = False; + return True; + } + elseif (is_numeric($str) && strlen($str) >= 16){ + $this->swipestr = $str; + $this->swipetype = PaycardLib::PAYCARD_TYPE_UNKNOWN; + $this->manual = True; + return True; + } + elseif (is_numeric(substr($str,2)) && strlen($str) >= 18){ + $this->swipestr = $str; + $this->swipetype = PaycardLib::PAYCARD_TYPE_UNKNOWN; + $this->manual = True; + return True; + } + return False; + } + + function parse($str){ + $ret = array(); + $str = $this->swipestr; + if( substr($str,0,2) == "PV") { + $ret = $this->paycard_entered(PaycardLib::PAYCARD_MODE_BALANCE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "AV") { + $ret = $this->paycard_entered(PaycardLib::PAYCARD_MODE_ADDVALUE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "AC") { + $ret = $this->paycard_entered(PaycardLib::PAYCARD_MODE_ACTIVATE, substr($str,2), $this->manual, $this->swipetype); + } else { + $ret = $this->paycard_entered(PaycardLib::PAYCARD_MODE_AUTH, $str, $this->manual, $this->swipetype); + } + // if successful, paycard_entered() redirects to a confirmation page and exit()s; if we're still here, there was an error, so reset all data + if ($ret['main_frame'] == false) + PaycardLib::paycard_reset(); + return $ret; + } + + function paycard_entered($mode,$card,$manual,$type){ + global $CORE_LOCAL; + $ret = $this->default_json(); + // initialize + $validate = true; // run Luhn's on PAN, check expiration date + PaycardLib::paycard_reset(); + $CORE_LOCAL->set("paycard_mode",$mode); + $CORE_LOCAL->set("paycard_manual",($manual ? 1 : 0)); + + // error checks based on transaction + if( $mode == PaycardLib::PAYCARD_MODE_AUTH) { + if( $CORE_LOCAL->get("ttlflag") != 1) { // must subtotal before running card + $ret['output'] = PaycardLib::paycard_msgBox($type,"No Total", + "Transaction must be totaled before tendering or refunding","[clear] to cancel"); + return $ret; + } else if( abs($CORE_LOCAL->get("amtdue")) < 0.005) { // can't tender for more than due + $ret['output'] = PaycardLib::paycard_msgBox($type,"No Total", + "Nothing to tender or refund","[clear] to cancel"); + return $ret; + } + } + + // check for pre-validation override + if( strtoupper(substr($card,0,1)) == 'O') { + $validate = false; + $card = substr($card, 1); + } + + // parse card data + if( $CORE_LOCAL->get("paycard_manual")) { + // make sure it's numeric + if( !ctype_digit($card) || strlen($card) < 18) { // shortest known card # is 14 digits, plus MMYY + $ret['output'] = PaycardLib::paycard_msgBox($type,"Manual Entry Unknown", + "Please enter card data like:<br>CCCCCCCCCCCCCCCCMMYY","[clear] to cancel"); + return $ret; + } + // split up input (and check for the Concord test card) + if ($type == PaycardLib::PAYCARD_TYPE_UNKNOWN){ + $type = PaycardLib::paycard_type($card); + } + if( $type == PaycardLib::PAYCARD_TYPE_GIFT) { + $CORE_LOCAL->set("paycard_PAN",$card); // our gift cards have no expiration date or conf code + } else { + $CORE_LOCAL->set("paycard_PAN",substr($card,0,-4)); + $CORE_LOCAL->set("paycard_exp",substr($card,-4,4)); + } + } + else if ($type == PaycardLib::PAYCARD_TYPE_ENCRYPTED){ + // add leading zero back to fix hex encoding, if needed + if (substr($card,0,7)=="2E60080") + $card = "0".$card; + $CORE_LOCAL->set("paycard_PAN",$card); + } + else { + // swiped magstripe (reference to ISO format at end of this file) + $stripe = PaycardLib::paycard_magstripe($card); + if( !is_array($stripe)) { + $ret['output'] = PaycardLib::paycard_errBox($type,$CORE_LOCAL->get("paycard_manual")."Card Data Invalid","Please swipe again or type in manually","[clear] to cancel"); + return $ret; + } + $CORE_LOCAL->set("paycard_PAN",$stripe["pan"]); + $CORE_LOCAL->set("paycard_exp",$stripe["exp"]); + $CORE_LOCAL->set("paycard_name",$stripe["name"]); + $CORE_LOCAL->set("paycard_tr1",$stripe["tr1"]); + $CORE_LOCAL->set("paycard_tr2",$stripe["tr2"]); + $CORE_LOCAL->set("paycard_tr3",$stripe["tr3"]); + } // manual/swiped + + // determine card issuer and type + $CORE_LOCAL->set("paycard_type",PaycardLib::paycard_type($CORE_LOCAL->get("paycard_PAN"))); + $CORE_LOCAL->set("paycard_issuer",PaycardLib::paycard_issuer($CORE_LOCAL->get("paycard_PAN"))); + + /* check card type. Credit is default. */ + $type = $CORE_LOCAL->get("CacheCardType"); + if ($type == ''){ + $type = 'CREDIT'; + $CORE_LOCAL->set("CacheCardType","CREDIT"); + } + + /* assign amount due. EBT food should use eligible amount */ + $CORE_LOCAL->set("paycard_amount",$CORE_LOCAL->get("amtdue")); + if ($type == 'EBTFOOD'){ + if ($CORE_LOCAL->get('fntlflag') == 0){ + /* try to automatically do fs total */ + $try = PrehLib::fsEligible(); + if ($try !== True){ + $ret['output'] = PaycardLib::paycard_msgBox($type,"Type Mismatch", + "Foodstamp eligible amount inapplicable","[clear] to cancel"); + return $ret; + } + } + $CORE_LOCAL->set("paycard_amount",$CORE_LOCAL->get("fsEligible")); + } + if (($type == 'EBTCASH' || $type == 'DEBIT') && $CORE_LOCAL->get('CacheCardCashBack') > 0){ + $CORE_LOCAL->set('paycard_amount', + $CORE_LOCAL->get('amtdue') + $CORE_LOCAL->get('CacheCardCashBack')); + } + + // if we knew the type coming in, make sure it agrees + if( $type != PaycardLib::PAYCARD_TYPE_UNKNOWN && $type != $CORE_LOCAL->get("paycard_type")) { + $ret['output'] = PaycardLib::paycard_msgBox($type,"Type Mismatch", + "Card number does not match card type","[clear] to cancel"); + return $ret; + } + + /* + if ($CORE_LOCAL->get("paycard_type") == PaycardLib::PAYCARD_TYPE_CREDIT){ + PaycardLib::paycard_reset(); + $ret['main_frame'] = MiscLib::base_url().'cc-modules/gui/ProcessPage.php'; + return $ret; + } + */ + + foreach($CORE_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + if (!class_exists($rpc)) include_once(MiscLib::base_url()."cc-modules/$rpc.php"); + $myObj = new $rpc(); + if ($myObj->handlesType($CORE_LOCAL->get("paycard_type"))) + return $myObj->entered($validate,$ret); + } + + $ret['output'] = PaycardLib::paycard_errBox(PaycardLib::PAYCARD_TYPE_UNKNOWN,"Unknown Card Type ".$CORE_LOCAL->get("paycard_type"),"","[clear] to cancel"); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>Card swipe or card number</td> + <td>Try to charge amount to card</td> + </tr> + <tr> + <td>PV<i>swipe</i> or PV<i>number</i></td> + <td>Check balance of gift card</td> + </tr> + <tr> + <td>AC<i>swipe</i> or AC<i>number</i></td> + <td>Activate gift card</td> + </tr> + <tr> + <td>AV<i>swipe</i> or AV<i>number</i></td> + <td>Add value to gift card</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/Paycards/lib/xmlData.php b/pos/is4c-nf/plugins/Paycards/lib/xmlData.php new file mode 100755 index 000000000..472c0f63c --- /dev/null +++ b/pos/is4c-nf/plugins/Paycards/lib/xmlData.php @@ -0,0 +1,128 @@ +<?php + +/** + A very generic parser class for XML data +*/ +class xmlData { + + var $parser; + var $DATA; + var $curTag; + var $valid; + + /** + Constructor + Create parser from XML + @param $str an XML string + */ + function xmlData($str){ + $this->valid = False; + $this->parser = xml_parser_create(); + xml_set_object($this->parser,$this); + xml_set_element_handler($this->parser,"startTag","endTag"); + xml_set_character_data_handler($this->parser,"tagData"); + xml_parse($this->parser,$str,True); + xml_parser_free($this->parser); + } + + /** + xml_parser callback for an opening tag + */ + function startTag($parser,$name,$attr){ + $name = strtoupper($name); + if (isset($attr["KEY"])) + $name = strtoupper($attr["KEY"]); + $this->curTag = array("tag"=>$name,"attributes"=>$attr,"chardata"=>""); + } + + /** + xml_parser callback for a closing tag + */ + function endTag($parser,$name){ + $name = $this->curTag["tag"]; + if (!isset($this->DATA["$name"])) + $this->DATA["$name"] = array(); + array_push($this->DATA["$name"],$this->curTag); + $this->valid = True; + } + + /** + xml_parser callback for data between tags + */ + function tagData($parser,$data){ + $this->curTag["chardata"] = $data; + } + + /** + Get a value by tag name + @param $tagname the tag name + @return + - string value if one tag has the given name + - an array if multiple tags have the given name + - False if no such tag + */ + function get($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + if (count($this->DATA["$tagname"]) == 1){ + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + + } + else { + $ret = array(); + foreach ($this->DATA["$tagname"] as $d) + array_push($ret,$d["chardata"]); + return $ret; + } + } + + /** + Check if at least some xml parsed successfully. + @return True or False + */ + function isValid(){ return $this->valid; } + + /** + Get a value by tag name + @param $tagname the tag name + @return + - String value if the tag exists + - False if the tag doesn't exist + + This method works a tad more reliably + than get(). + */ + function get_first($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + else { + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + } + } + + /** + Export XML content to an array + @return an array + + Debugging method + */ + function array_dump(){ + $ret = array(); + foreach ($this->DATA as $field=>$value){ + if (isset($value[0]) && + isset($value[0]["chardata"])) + $ret[$field] = $value[0]["chardata"]; + } + return $ret; + } +} + +?> diff --git a/pos/is4c-nf/plugins/PhoneLookup/ByPhoneMemberLookup.php b/pos/is4c-nf/plugins/PhoneLookup/ByPhoneMemberLookup.php new file mode 100644 index 000000000..c68452164 --- /dev/null +++ b/pos/is4c-nf/plugins/PhoneLookup/ByPhoneMemberLookup.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + @class ByPhoneMemberLookup + + Search for member using phone number + + Looks up phone + member number via meminfo table +*/ + +class ByPhoneMemberLookup extends MemberLookup { + + public function handle_text(){ + return False; + } + + public function lookup_by_number($num){ + $db = Database::pDataConnect(); + $ret = $this->default_value(); + + // need table for lookup + if (!$db->table_exists('meminfo')) + return $ret; + + $query = 'SELECT CardNo,personNum, + LastName,FirstName,phone + FROM custdata AS c LEFT JOIN + meminfo AS m ON c.CardNo=m.card_no + WHERE m.phone='.((int)$num); + $result = $db->query($query); + while($row = $db->fetch_row($result)){ + $key = $row['CardNo'].'::'.$row['personNum']; + $label = $row['LastName'].', '.$row['FirstName'] + .' ('.$row['phone'].')'; + $ret['results'][$key] = $label; + } + return $ret; + } +} + +?> \ No newline at end of file diff --git a/pos/is4c-nf/plugins/PhoneLookup/PhoneLookup.php b/pos/is4c-nf/plugins/PhoneLookup/PhoneLookup.php new file mode 100644 index 000000000..e04b53ea6 --- /dev/null +++ b/pos/is4c-nf/plugins/PhoneLookup/PhoneLookup.php @@ -0,0 +1,39 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PhoneLookup extends Plugin { + + public $plugin_settings = ""; + + public $plugin_description = 'Use phone numbers to lookup members. Extends current + options of member number and last name.'; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/Plugin.php b/pos/is4c-nf/plugins/Plugin.php new file mode 100644 index 000000000..b42e81420 --- /dev/null +++ b/pos/is4c-nf/plugins/Plugin.php @@ -0,0 +1,140 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/** + Plugin class + + Plugins are collections of modules. Each collection should + contain one module that subclasses 'Plugin'. This module + provides meta-information about the plugin like settings + and enable/disable hooks +*/ +class Plugin { + + /** + Desired settings. These are automatically exposed + on the 'Plugins' area of the install page and + written to ini.php + */ + public $plugin_settings = array( + 'example1' => array('default'=>'','label'=>'Setting #1', + 'description'=>'Text goes here'), + 'example2' => array('default'=>1, + 'options'=>array('Yes'=>1,'No'=>0) + ) + ); + + public $plugin_description = 'This author didn\'t provide anything. Shame!'; + + /** + Callback. Triggered when plugin is enabled + */ + public function plugin_enable(){ + + } + + /** + Callback. Triggered when plugin is disabled + */ + public function plugin_disable(){ + + } + + /** + Callback. Triggered after every transaction. + Use for reseting any session/state info. + */ + public function plugin_transaction_reset(){ + + } + + public function plugin_draw_icon(){ + return ''; + } + + /** + Get a URL for the plugin's directory + */ + public function plugin_url(){ + $info = new ReflectionClass($this); + return MiscLib::base_url().'plugins/'.basename(dirname($info->getFileName())); + } + + /** + Find the plugin containing a given file + @param $file string filename + @return plugin name or boolean False + */ + public static function MemberOf($file){ + $file = realpath($file); + $sep = '/'; + if (strstr($file,'/')) + $sep = '/'; + elseif (strstr($file,'\\')) + $sep = '\\'; + else + return False; + + $dirs = explode($sep, $file); + for($i=0;$i<count($dirs);$i++){ + if ($dirs[$i] == "plugins" && isset($dirs[$i+1])) + return $dirs[$i+1]; + } + + return False; + } + + /** + Check whether a given plugin is enabled + @param $plugin string plugin name + @return True or False + */ + public static function IsEnabled($plugin){ + global $CORE_LOCAL; + $list = $CORE_LOCAL->get("PluginList"); + if (!is_array($list)) return False; + + return (in_array($plugin, $list)) ? True : False; + } + + /** + Find potential class files in a given directory + @param $path starting directory + @return array of class name => full file name + */ + public static function PluginMap($path="",$in=array()){ + if($path=="") $path = dirname(__FILE__); + $dh = opendir($path); + while( ($file = readdir($dh)) !== False){ + if ($file[0] == ".") continue; + if (is_dir($path."/".$file)) + $in = self::PluginMap(realpath($path.'/'.$file),$in); + if (substr($file,-4)==".php" && $file != "Plugin.php") + $in[substr($file,0,strlen($file)-4)] = realpath($path.'/'.$file); + } + closedir($dh); + return $in; + } +} + +?> diff --git a/pos/is4c-nf/plugins/PriceCheck/PriceCheck.php b/pos/is4c-nf/plugins/PriceCheck/PriceCheck.php new file mode 100644 index 000000000..ee98a0d05 --- /dev/null +++ b/pos/is4c-nf/plugins/PriceCheck/PriceCheck.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PriceCheck extends Plugin { + + public $plugin_settings = array( + ); + + public $plugin_description = 'Check an item\'s price without ringing it. Type "PC" to + and then scan an item or hit enter to use this feature.'; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/PriceCheck/PriceCheckPage.php b/pos/is4c-nf/plugins/PriceCheck/PriceCheckPage.php new file mode 100644 index 000000000..7680e1ee7 --- /dev/null +++ b/pos/is4c-nf/plugins/PriceCheck/PriceCheckPage.php @@ -0,0 +1,199 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include_once(dirname(__FILE__).'/../../lib/AutoLoader.php'); + +class PriceCheckPage extends NoInputPage { + + var $upc; + var $found; + var $pricing; + + function preprocess(){ + global $CORE_LOCAL; + + $this->upc = ""; + $this->found = False; + $this->pricing = array('sale'=>False,'price'=>'','memPrice'=>'', + 'description','department'); + + if (isset($_REQUEST['reginput']) && strtoupper($_REQUEST['reginput'])=="CL"){ + // cancel + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if (isset($_REQUEST['reginput']) || isset($_REQUEST['upc'])){ + // use reginput as UPC unless it's empty + $this->upc = isset($_REQUEST['reginput']) ? $_REQUEST['reginput'] : ''; + if ($this->upc == '' && isset($_REQUEST['upc'])) + $this->upc = $_REQUEST['upc']; + $this->upc = str_pad($this->upc,13,'0',STR_PAD_LEFT); + + $db = Database::pDataConnect(); + $query = "select inUse,upc,description,normal_price,scale,deposit, + qttyEnforced,department,local,cost,tax,foodstamp,discount, + discounttype,specialpricemethod,special_price,groupprice, + pricemethod,quantity,specialgroupprice,specialquantity, + mixmatchcode,idEnforced,tareweight + from products where upc = '".$db->escape($this->upc)."'"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + // lookup item info + if ($num_rows > 0){ + $this->found = True; + $row = $db->fetch_row($result); + + $discounttype = MiscLib::nullwrap($row["discounttype"]); + $DTClasses = $CORE_LOCAL->get("DiscountTypeClasses"); + $DiscountObject = new $DTClasses[$discounttype]; + + if ($DiscountObject->isSale()) + $this->pricing['sale'] = True; + $info = $DiscountObject->priceInfo($row,1); + $this->pricing['price'] = sprintf('$%.2f%s', + $info['unitPrice'],($row['scale']>0?' /lb':'')); + if ($info['memDiscount'] > 0){ + $this->pricing['memPrice'] = sprintf('$%.2f%s', + ($info['unitPrice']-$info['memDiscount']), + ($row['scale']>0?' /lb':'')); + } + $this->pricing['description'] = $row['description']; + $this->pricing['department'] = $row['department']; + + MiscLib::goodBeep(); + } + + // user hit enter and there is a valid UPC present + if (isset($_REQUEST['reginput']) && $_REQUEST['reginput']=='' && $this->found){ + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$this->upc); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + + return True; + } + + function head_content(){ + $this->default_parsewrapper_js(); + $this->scanner_scale_polling(True); + } + + function body_content(){ + global $CORE_LOCAL; + $this->add_onload_command("\$('#reginput').focus();\n"); + $info = _("price check"); + $inst = array( + _("[scan] item"), + _("[clear] to cancel"), + ); + if (!empty($this->upc)){ + if (!$this->found){ + $info = _("not a valid item"); + $inst = array( + _("[scan] another item"), + _("[clear] to cancel"), + ); + $this->upc = ""; + } + else { + $info = $this->pricing['description'].' :: '.$this->pricing['department'].'<br />'; + $info .= _("Price").": ".$this->pricing['price']; + if (!empty($this->pricing['memPrice'])){ + $info .= "<br />("._("Member Price").": ".$this->pricing['memPrice'].")"; + } + + $inst = array( + _("[scan] another item"), + _("[enter] to ring this item"), + _("[clear] to cancel"), + ); + } + } + ?> + <div class="baseHeight"> + <div class="coloredArea centeredDisplay"> + <span class="larger"> + <?php echo $info ?> + </span><br /> + <form name="form" id="formlocal" method="post" + autocomplete="off" action="<?php echo $_SERVER['PHP_SELF']; ?>"> + <input type="text" name="reginput" tabindex="0" + onblur="$('#reginput').focus();" id="reginput" /> + <input type="hidden" name="upc" value="<?php echo $this->upc; ?>" /> + </form> + <p> + <span id="localmsg"><?php foreach($inst as $i) echo $i."<br />" ?></span> + </p> + </div> + </div> + <?php + } // END true_body() FUNCTION + + function mgrauthenticate($password){ + global $CORE_LOCAL; + + $ret = array( + 'cancelOrder'=>false, + 'color'=>'#800000', + 'msg'=>_('password invalid'), + 'heading'=>_('re-enter manager password'), + 'giveUp'=>false + ); + + $password = strtoupper($password); + $password = str_replace("'","",$password); + + if (!isset($password) || strlen($password) < 1 || $password == "CL") { + $ret['giveUp'] = true; + return $ret; + } + elseif (!is_numeric($password)) { + return $ret; + } + elseif ($password > 9999 || $password < 1) { + return $ret; + } + + $db = Database::pDataConnect(); + $priv = sprintf("%d",$CORE_LOCAL->get("SecurityCancel")); + $query = "select emp_no, FirstName, LastName from employees where EmpActive = 1 and frontendsecurity >= $priv " + ."and (CashierPassword = ".$password." or AdminPassword = ".$password.")"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows != 0) { + $this->cancelorder(); + $ret['cancelOrder'] = true; + } + + return $ret; + } + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new PriceCheckPage(); +?> diff --git a/pos/is4c-nf/plugins/PriceCheck/PriceCheckParser.php b/pos/is4c-nf/plugins/PriceCheck/PriceCheckParser.php new file mode 100644 index 000000000..046f7d8f7 --- /dev/null +++ b/pos/is4c-nf/plugins/PriceCheck/PriceCheckParser.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PriceCheckParser extends Parser { + function check($str){ + if ($str == "PC") + return True; + else if (substr($str,0,2)=="PC" && is_numeric(substr($str,2))) + return True; + return False; + } + + function parse($str){ + $ret = $this->default_json(); + $plugin_info = new PriceCheck(); + $ret['main_frame'] = $plugin_info->plugin_url().'/PriceCheckPage.php'; + if (strlen($str)>2) + $ret['main_frame'] .= "?upc=".substr($str,2); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>PC</td> + <td>Do a price check</td> + </tr> + <tr> + <td>PC<UPC></td> + <td>Price check the specified UPC</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/QKDisplay.php b/pos/is4c-nf/plugins/QuickKeys/QKDisplay.php new file mode 100644 index 000000000..9956cd6e5 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/QKDisplay.php @@ -0,0 +1,182 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../../lib/AutoLoader.php'); + +class QKDisplay extends NoInputPage { + + var $offset; + + function head_content(){ + ?> + <script type="text/javascript" > + var prevKey = -1; + var prevPrevKey = -1; + var selectedId = 0; + function keyCheck(e) { + var jsKey; + if(!e)e = window.event; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + // Options: + // 1: Clear - go back to pos2 w/o selecting anything + // 2: Select button corresponding to 1-9 + // 3: Page Up - go to previous page of buttons + // 4: Page Down - go to next page of buttons + // (Paging wraps) + if ( (jsKey==108 || jsKey == 76) && + (prevKey == 99 || prevKey == 67) ){ + document.getElementById('doClear').value='1'; + } + else if (jsKey >= 49 && jsKey <= 57){ + setSelected(jsKey-48); + } + else if (jsKey >= 97 && jsKey <= 105){ + setSelected(jsKey-96); + } + else if (jsKey == 33 || jsKey == 38){ + location = + '<?php echo $this->plugin_url; ?>QKDisplay.php?offset=<?php echo ($this->offset - 1)?>'; + } + else if (jsKey == 34 || jsKey == 40){ + location = + '<?php echo $this->plugin_url; ?>QKDisplay.php?offset=<?php echo ($this->offset + 1)?>'; + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + + document.onkeyup = keyCheck; + + function setSelected(num){ + var row = Math.floor((num-1) / 3); + var id = 0; + if (row == 2) id = num - 7; + else if (row == 1) id = num - 1; + else if (row == 0) id = num + 5; + if ($('#qkDiv'+id)){ + $('#qkDiv'+selectedId).css('border','0'); + $('#qkDiv'+id).css('border','solid 3px #004080'); + $('#qkButton'+id).focus(); + selectedId = id; + } + } + </script> + <?php + } // END head() FUNCTION + + var $plugin_url; + function preprocess(){ + global $CORE_LOCAL; + $plugin_info = new QuickKeys(); + $this->plugin_url = $plugin_info->plugin_url().'/'; + + $this->offset = isset($_REQUEST['offset'])?$_REQUEST['offset']:0; + + if (count($_POST) > 0){ + $output = ""; + if ($_REQUEST["clear"] == 0){ + // submit process changes line break + // depending on platform + // apostrophes pick up slashes + $choice = str_replace("\r","",$_REQUEST["quickkey_submit"]); + $choice = stripslashes($choice); + + $value = $_REQUEST[md5($choice)]; + + $output = $CORE_LOCAL->get("qkInput").$value; + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$output); + $CORE_LOCAL->set("currentid",$CORE_LOCAL->get("qkCurrentId")); + } + if (substr(strtoupper($output),0,2) == "QK"){ + $CORE_LOCAL->set("qkNumber",substr($output,2)); + return True; + } + else { + $this->change_page($this->page_url."gui-modules/pos2.php"); + } + return False; + } + return True; + } // END preprocess() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + + $this->add_onload_command("setSelected(7);"); + + echo "<div class=\"baseHeight\" style=\"border: solid 1px black;\">"; + echo "<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"post\">"; + + include(realpath(dirname(__FILE__)."/quickkeys/keys/" + .$CORE_LOCAL->get("qkNumber").".php")); + + $num_pages = ceil(count($my_keys)/9.0); + $page = $this->offset % $num_pages; + if ($page < 0) $page = $num_pages + $page; + + $count = 0; + for($i=$page*9; $i < count($my_keys); $i++){ + $key = $my_keys[$i]; + if ($count % 3 == 0){ + if ($count != 0){ + if ($num_pages > 1 && $count == 3){ + echo "<div class=\"qkArrowBox\">"; + echo "<input type=submit value=Up class=qkArrow + onclick=\"location='{$this->plugin_url}QKDisplay.php?offset=".($page-1)."'; return false;\" />"; + echo "</div>"; + } + echo "</div>"; + } + echo "<div class=\"qkRow\">"; + } + echo "<div class=\"qkBox\"><div id=\"qkDiv$count\">"; + echo $key->display("qkButton$count"); + echo "</div></div>"; + $count++; + if ($count > 8) break; + } + if ($num_pages > 1){ + echo "<div class=\"qkArrowBox\">"; + echo "<input type=submit value=Down class=qkArrow + onclick=\"location='{$this->plugin_url}QKDisplay.php?offset=".($page+1)."'; return false;\" />"; + echo "</div>"; + + } + echo "</div>"; + echo "<input type=\"hidden\" value=\"0\" name=\"clear\" id=\"doClear\" />"; + echo "</form>"; + echo "</div>"; + } // END body_content() FUNCTION + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new QKDisplay(); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/QuickKeyLauncher.php b/pos/is4c-nf/plugins/QuickKeys/QuickKeyLauncher.php new file mode 100644 index 000000000..40bfb4241 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/QuickKeyLauncher.php @@ -0,0 +1,68 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class QuickKeyLauncher extends Parser { + + function check($str){ + if (strstr($str,"QK")){ + $tmp = explode("QK",$str); + $ct = count($tmp); + if ($ct <= 2 && is_numeric($tmp[$ct-1])) + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $tmp = explode("QK",$str); + if (count($tmp) == 2) + $CORE_LOCAL->set("qkInput",$tmp[0]); + else + $CORE_LOCAL->set("qkInput",""); + $CORE_LOCAL->set("qkNumber",$tmp[count($tmp)-1]); + $CORE_LOCAL->set("qkCurrentId",$CORE_LOCAL->get("currentid")); + $ret = $this->default_json(); + + $plugin_info = new QuickKeys(); + $ret['main_frame'] = $plugin_info->plugin_url().'/QKDisplay.php'; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>anything</i>QK<i>number</i></td> + <td> + Go to quick key with the given number. + Save any provided input. + </td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/QuickKeys.php b/pos/is4c-nf/plugins/QuickKeys/QuickKeys.php new file mode 100644 index 000000000..2cdb49a42 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/QuickKeys.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class QuickKeys extends Plugin { + + public $plugin_settings = array( + ); + + public $plugin_description = 'A plugin for building menus. Menus are defined in numbered + PHP files within the plugin. Type "QK" followed by the menu + number to launch that menu. QuickKeys render options as a + 3x3 grid of buttons for touchscreen accessibility.'; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/0 ITEM b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/0 ITEM new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/0.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/0.php new file mode 100644 index 000000000..6f3aa8e5f --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/0.php @@ -0,0 +1,14 @@ +<?php + +$my_keys = array( + new quickkey("Products","QK3"), + new quickkey("Depart-\nments","QK1"), + new quickkey("Item\nSearch","PV"), + new quickkey("Tare","TW"), + new quickkey("Tax Shift","1TN"), + new quickkey("FS Shift","FN"), + new quickkey("Void","VD"), + new quickkey("Refund","RF") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/1 DEPT b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/1 DEPT new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/1.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/1.php new file mode 100644 index 000000000..246470886 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/1.php @@ -0,0 +1,27 @@ +<?php + +$my_keys = array( + new quickkey("Grocery","DP100"), + new quickkey("Tax\nGroc","DP110"), + new quickkey("Bulk","DP120"), + new quickkey("Refrig","DP130"), + new quickkey("Frozen","DP140"), + new quickkey("Bread\nGroc","DP150"), + new quickkey("Beer","DP160"), + new quickkey("Wine","DP170"), + new quickkey("Spices\nCoffee","DP190"), + new quickkey("Vitamin","DP200"), + new quickkey("Gen\nMerch","DP210"), + new quickkey("Pers.\nCare","DP220"), + new quickkey("Deli","DP300"), + new quickkey("Tax\nDeli","DP310"), + new quickkey("Hot\nCase","DP320"), + new quickkey("Meat","DP400"), + new quickkey("Seafood","DP410"), + new quickkey("Sushi","420"), + new quickkey("Cheese","500"), + new quickkey("Bread\nDeli","510"), + new quickkey("Produce\nConv.","600"), + new quickkey("Produce\nOrg.","610") +); +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/2 TENDER b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/2 TENDER new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/2.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/2.php new file mode 100644 index 000000000..f82bf4ff1 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/2.php @@ -0,0 +1,27 @@ +<?php + +$my_keys = array( + new quickkey("Cash","CA"), + new quickkey("Check\nPaper","PE"), + new quickkey("Check\nBusiness","BU"), + new quickkey("ACH","EL"), + new quickkey("Debit","DB"), + new quickkey("Store\nCharge","SC"), + new quickkey("Gift\nCert.","GI"), + new quickkey("Food\nStamp","FS"), + new quickkey("Instore\nCoupon","SU"), + new quickkey("Manuf.\nCoupon","MU"), + new quickkey("EBT","EB"), + new quickkey("Gift\nCard","GD"), + new quickkey("Check\nPayroll","PY"), + new quickkey("Check\nTraveler","TV"), + new quickkey("Tech\nCash","TE"), + new quickkey("Dept.\nTransfer","TR"), + new quickkey("External","XT"), + new quickkey("Crimson\nCash","CR"), + new quickkey("External\nEBT","XE"), + new quickkey("Ext. Cash\nBack","XB") +); + +?> + diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/3 CHECKTENDERS b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/3 CHECKTENDERS new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/3.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/3.php new file mode 100644 index 000000000..73e97a966 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/3.php @@ -0,0 +1,10 @@ +<?php + +$my_keys = array( + new quickkey("Check\nPaper","PE"), + new quickkey("Check\nBusiness","BU"), + new quickkey("Check\nPayroll","PY"), + new quickkey("Check\nTraveler","TV") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/4 TOTAL b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/4 TOTAL new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/4.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/4.php new file mode 100644 index 000000000..5ed7b9116 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/4.php @@ -0,0 +1,11 @@ +<?php + +$my_keys = array( + new quickkey("Member","ID"), + new quickkey("Non\nMember","11ID"), + new quickkey("Subtotal","TL"), + new quickkey("FS","FNTL"), + new quickkey("Tax\nExempt","TETL") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/5 MEMBER b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/5 MEMBER new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/5.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/5.php new file mode 100644 index 000000000..ac935c868 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/5.php @@ -0,0 +1,10 @@ +<?php + +$my_keys = array( + new quickkey("AR\nPayment","DP990"), + new quickkey("Equity A","DP9920"), + new quickkey("Equity B","DP9910"), + new quickkey("Balance","BQ") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/6 MISC b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/6 MISC new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/6.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/6.php new file mode 100644 index 000000000..db1a2e9b6 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/6.php @@ -0,0 +1,11 @@ +<?php + +$my_keys = array( + new quickkey("Lock","LOCK"), + new quickkey("Sign\nOff","SO"), + new quickkey("Suspend\nResume","MG"), + new quickkey("Cancel","CN"), + new quickkey("Reprint","RP") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/7 EGGS b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/7 EGGS new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/7.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/7.php new file mode 100644 index 000000000..e382512b0 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/7.php @@ -0,0 +1,15 @@ +<?php + +$my_keys = array( + new quickkey("Local\nJumbo","1012"), + new quickkey("Local\nXL","1011"), + new quickkey("Local\nLarge","1010"), + new quickkey("Local\nMedium","1009"), + new quickkey("Local\nSmall","1008"), + new quickkey("Whole\nFarm\nLarge","1013"), + new quickkey("Whole\nFarm\nMedium","1016"), + new quickkey("Larry's\nLarge","1133"), + new quickkey("Larry's\nMedium","1132") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/8 MILK b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/8 MILK new file mode 100644 index 000000000..e69de29bb diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/8.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/8.php new file mode 100644 index 000000000..81b09ee82 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/keys/8.php @@ -0,0 +1,11 @@ +<?php + +$my_keys = array( + new quickkey("Milk\nReturn","9999904"), + new quickkey("Dahl's\nWhole","1034"), + new quickkey("Dahl's\n2%","1033"), + new quickkey("Dahl's\n1%","1032"), + new quickkey("Dahl's\nSkim","1031") +); + +?> diff --git a/pos/is4c-nf/plugins/QuickKeys/quickkeys/quickkey.php b/pos/is4c-nf/plugins/QuickKeys/quickkeys/quickkey.php new file mode 100644 index 000000000..2f75ea480 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickKeys/quickkeys/quickkey.php @@ -0,0 +1,96 @@ +<?php + +/** + @class quickkey + A class for building menus from buttons + + This class just displays a button that maps + to an input string - essentially a virtual + programmable key. If you define an array + of these buttons, POS can build a menu + automatically. + + These arrays should be defined in .php files + in the quickkeys/keys/ directory. The files + must have numeric names. 0.php will be triggered + by QK0, 1.php will be triggered by QK1, etc. + The array must be named $my_keys. +*/ + +/** + @example 271828.php + + $my_keys defines the menu. Pretty basic, but a couple notes: + - Some button description include newlines. The text + doesn't wrap automatically and weird stuff can happen + if you don't break long strings. Exact weirdness + is browser dependent + - The second argument can be any POS input including + the command for a different menu like "QK3" here. This + is how you build nested menus. +*/ + +class quickkey { + /** + The button text. + */ + var $title; + /** + An image name. + */ + var $img; + /** + What the button does + */ + var $output_text; + + /** + Constructor + @param $t is the button text. There's no + automatic wrapping to include newline(s) + if needed + @param $o is what the button does. When the + button is selected, this string is fed + back into POS as input. + @param $i an image filename. Support for + images on buttons instead of text is + theoretical and not yet tested. + */ + function quickkey($t,$o,$i=""){ + $this->title = $t; + $this->output_text = $o; + $this->img = $i; + } + + function display($id=""){ + $ret = sprintf("<form action=\"%s\" method=\"post\" + style=\"display:inline;\">", + $_SERVER["PHP_SELF"]); + $ret = ""; + if ($this->img == ""){ + $ret .= sprintf("<input type=\"submit\" + name=\"quickkey_submit\" id=\"%s\" + value=\"%s\" class=\"quick_button\" /> + <input type=\"hidden\" name=\"%s\" + value=\"%s\" />",$id,$this->title, + md5($this->title), + $this->output_text); + } + else { + $ret .= sprintf("<input type=\"submit\" + name=\"quickkey_submit\" id=\"%s\" + value=\"%s\" class=\"quick_button\" + src=\"%s\" /> + <input type=\"hidden\" name=\"%s\" + value=\"%s\" />",$id,$this->title, + MiscLib::base_url(). + "quickkeys/imgs/".$this->img, + md5($this->title), + $this->output_text); + } + //$ret .= "</form>"; + return $ret; + } +} + +?> diff --git a/pos/is4c-nf/plugins/QuickMenus/QMDisplay.php b/pos/is4c-nf/plugins/QuickMenus/QMDisplay.php new file mode 100644 index 000000000..454803ca1 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickMenus/QMDisplay.php @@ -0,0 +1,159 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../../lib/AutoLoader.php'); + +class QMDisplay extends NoInputPage { + + var $offset; + + function head_content(){ + ?> + <script type="text/javascript" > + /* + var prevKey = -1; + var prevPrevKey = -1; + var selectedId = 0; + var form_disabled = 0; + function keyCheck(e) { + var jsKey; + if(!e)e = window.event; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + // Options: + // 1: Clear - go back to pos2 w/o selecting anything + // (Paging wraps) + if ( (jsKey==108 || jsKey == 76) && + (prevKey == 99 || prevKey == 67) ){ + document.getElementById('doClear').value='1'; + } + else if (jsKey==13 && form_disabled == 0){ + form_disabled=1; + $('#qmform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + + document.onkeyup = keyCheck; + */ + $(document).ready(function(){ + var prevKey = -1; + var prevPrevKey = -1; + var selectedId = 0; + var form_disabled = 0; + $(document).keyup(function (event){ + if ( + (event.which==108 || event.which==76) + && + (prevKey==99 || prevKey==67) + ){ + $('#doClear').val('1'); + } + else if (event.which==13 && form_disabled == 0){ + form_disabled=1; + $('#qmform').submit(); + } + prevPrevKey = prevKey; + prevKey = event.which; + }); + }); + + </script> + <?php + } // END head() FUNCTION + + var $plugin_url; + function preprocess(){ + global $CORE_LOCAL; + $plugin_info = new QuickMenus(); + $this->plugin_url = $plugin_info->plugin_url().'/'; + + $this->offset = isset($_REQUEST['offset'])?$_REQUEST['offset']:0; + + if (count($_POST) > 0){ + $output = ""; + if ($_REQUEST["clear"] == 0){ + $value = $_REQUEST['ddQKselect']; + + $output = $CORE_LOCAL->get("qmInput").$value; + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$output); + $CORE_LOCAL->set("currentid",$CORE_LOCAL->get("qmCurrentId")); + } + if (substr(strtoupper($output),0,2) == "QM"){ + $CORE_LOCAL->set("qmNumber",substr($output,2)); + return True; + } + else { + $this->change_page($this->page_url."gui-modules/pos2.php"); + } + return False; + } + return True; + } // END preprocess() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + + $this->add_onload_command('$(\'#ddQKselect\').focus()'); + + echo "<div class=\"baseHeight\" style=\"border: solid 1px black;\">"; + echo "<form id=\"qmform\" action=\"".$_SERVER["PHP_SELF"]."\" method=\"post\">"; + + $my_menu = array(); + if (is_array($CORE_LOCAL->get('qmNumber'))){ + $my_menu = $CORE_LOCAL->get('qmNumber'); + } + else { + include(realpath(dirname(__FILE__)."/quickmenus/" + .$CORE_LOCAL->get("qmNumber").".php")); + } + + echo '<br /><br />'; + echo '<select name="ddQKselect" id="ddQKselect" style="width:200px;" size="10" + onblur="$(\'#ddQKselect\').focus();" >'; + $i=1; + foreach($my_menu as $label => $value){ + printf('<option value="%s" %s>%d. %s</option>',$value, + ($i==1?'selected':''),$i,$label); + $i++; + } + echo '</select>'; + + echo "</div>"; + echo "<input type=\"hidden\" value=\"0\" name=\"clear\" id=\"doClear\" />"; + echo "</form>"; + echo "</div>"; + } // END body_content() FUNCTION + +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new QMDisplay(); + +?> diff --git a/pos/is4c-nf/plugins/QuickMenus/QuickMenuLauncher.php b/pos/is4c-nf/plugins/QuickMenus/QuickMenuLauncher.php new file mode 100644 index 000000000..9a4b6510d --- /dev/null +++ b/pos/is4c-nf/plugins/QuickMenus/QuickMenuLauncher.php @@ -0,0 +1,68 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class QuickMenuLauncher extends Parser { + + function check($str){ + if (strstr($str,"QM")){ + $tmp = explode("QM",$str); + $ct = count($tmp); + if ($ct <= 2 && is_numeric($tmp[$ct-1])) + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $tmp = explode("QM",$str); + if (count($tmp) == 2) + $CORE_LOCAL->set("qmInput",$tmp[0]); + else + $CORE_LOCAL->set("qmInput",""); + $CORE_LOCAL->set("qmNumber",$tmp[count($tmp)-1]); + $CORE_LOCAL->set("qmCurrentId",$CORE_LOCAL->get("currentid")); + $ret = $this->default_json(); + + $plugin_info = new QuickMenus(); + $ret['main_frame'] = $plugin_info->plugin_url().'/QMDisplay.php'; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>anything</i>QM<i>number</i></td> + <td> + Go to quick menu with the given number. + Save any provided input. + </td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/QuickMenus/QuickMenus.php b/pos/is4c-nf/plugins/QuickMenus/QuickMenus.php new file mode 100644 index 000000000..b515e150e --- /dev/null +++ b/pos/is4c-nf/plugins/QuickMenus/QuickMenus.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class QuickMenus extends Plugin { + + public $plugin_settings = array( + ); + + public $plugin_description = 'A plugin for building menus. Menus are defined in numbered + PHP files within the plugin. Type "QM" followed by the menu + number to launch that menu. QuickMenus render options as a + scrolling list.'; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/QuickMenus/quickmenus/1.php b/pos/is4c-nf/plugins/QuickMenus/quickmenus/1.php new file mode 100755 index 000000000..a80183093 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickMenus/quickmenus/1.php @@ -0,0 +1,9 @@ +<?php + +$my_menu = array( + "Charge Available Card" => "CCFROMCACHE", + "Reboot Terminal" => "TERMREBOOT", + "Tender External CC" => "MANUALCC" +); + +?> diff --git a/pos/is4c-nf/plugins/QuickMenus/quickmenus/10.php b/pos/is4c-nf/plugins/QuickMenus/quickmenus/10.php new file mode 100755 index 000000000..bd6b5c97f --- /dev/null +++ b/pos/is4c-nf/plugins/QuickMenus/quickmenus/10.php @@ -0,0 +1,16 @@ +<?php + +$my_menu = array( + "Outside Bakery" => "DP1500", + "Ashland Baking" => "*15001", + "Great Harvest" => "*15002", + "Positively 3rd Street" => "*15003", + "Red Mug Bakeshop" => "*150004", + "St Paul Bagelry" => "*15005", + "Turtle Bread" => "*15006", + "Biscotti" => "7011", + "Single Bagel" => "99DP1500", + "Cream Cheese" => "0020104000050" +); + +?> diff --git a/pos/is4c-nf/plugins/QuickMenus/quickmenus/9.php b/pos/is4c-nf/plugins/QuickMenus/quickmenus/9.php new file mode 100755 index 000000000..d8297b000 --- /dev/null +++ b/pos/is4c-nf/plugins/QuickMenus/quickmenus/9.php @@ -0,0 +1,9 @@ +<?php + +$my_menu = array( + "8 oz Soup" => "20120000229", + "12 oz Soup" => "20130000325", + "16 oz Soup" => "20140000399", +); + +?> diff --git a/pos/is4c-nf/plugins/VirtualCoupon/VirtCoupDisplay.php b/pos/is4c-nf/plugins/VirtualCoupon/VirtCoupDisplay.php new file mode 100644 index 000000000..b21e1207c --- /dev/null +++ b/pos/is4c-nf/plugins/VirtualCoupon/VirtCoupDisplay.php @@ -0,0 +1,167 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +ini_set('display_errors','1'); + +include_once(dirname(__FILE__).'/../../lib/AutoLoader.php'); + +class VirtCoupDisplay extends NoInputPage { + + var $temp_result; + var $temp_num_rows; + var $entered; + var $db; + + function preprocess(){ + global $CORE_LOCAL; + + /** + Handle user input + + If input is blank or clear, return to the main page + + If input is numeric, build an appropriate coupon UPC + and set that to repeat as the next pos2 input + */ + if(isset($_REQUEST['search'])){ + $input = strtoupper($_REQUEST['search']); + if ($input === "" || $input === "CL"){ + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + else if (is_numeric($input)){ + $upc = "00499999".str_pad((int)$input,5,'0',STR_PAD_LEFT); + $CORE_LOCAL->set("msgrepeat",1); + $CORE_LOCAL->set("strRemembered",$upc); + $this->change_page($this->page_url."gui-modules/pos2.php"); + return False; + } + } + + /** + Lookup coupons by member number + */ + $memberID = $CORE_LOCAL->get("memberID"); + $sql = Database::pDataConnect(); + + $query = "select coupID,description FROM houseVirtualCoupons + WHERE card_no=".$memberID." AND ". + $sql->now()." > start_date AND ". + $sql->now()." < end_date"; + $result = $sql->query($query); + $num_rows = $sql->num_rows($result); + + $this->temp_result = $result; + $this->temp_num_rows = $num_rows; + $this->db = $sql; + return True; + } // END preprocess() FUNCTION + + function head_content(){ + global $CORE_LOCAL; + if ($this->temp_num_rows > 0){ + $this->add_onload_command("\$('#search').keypress(processkeypress);\n"); + $this->add_onload_command("\$('#search').focus();\n"); + } else { + $this->default_parsewrapper_js('reginput','selectform'); + $this->add_onload_command("\$('#reginput').focus();\n"); + } + ?> + <script type="text/javascript"> + var prevKey = -1; + var prevPrevKey = -1; + function processkeypress(e) { + var jsKey; + if (e.keyCode) // IE + jsKey = e.keyCode; + else if(e.which) // Netscape/Firefox/Opera + jsKey = e.which; + if (jsKey==13) { + if ( (prevPrevKey == 99 || prevPrevKey == 67) && + (prevKey == 108 || prevKey == 76) ){ //CL<enter> + $('#search option:selected').each(function(){ + $(this).val(''); + }); + } + $('#selectform').submit(); + } + prevPrevKey = prevKey; + prevKey = jsKey; + } + </script> + <?php + } // END head() FUNCTION + + function body_content(){ + global $CORE_LOCAL; + $num_rows = $this->temp_num_rows; + $result = $this->temp_result; + $db = $this->db; + + echo "<div class=\"baseHeight\">" + ."<form id=\"selectform\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">"; + + /* No results. Just enter or CL to cancel + */ + if ($num_rows < 1){ + echo " + <div class=\"colored centeredDisplay\"> + <span class=\"larger\">"; + echo _("virtual coupons")."<br />"._("no coupons available"); + echo "</span> + <input type=\"text\" name=\"search\" size=\"15\" + onblur=\"\$('#reginput').focus();\" id=\"reginput\" /> + <br /> + press [enter] to cancel + </div>"; + } + else { + /* select box with available coupons */ + echo "<div class=\"listbox\">" + ."<select name=\"search\" size=\"15\" " + ."onblur=\"\$('#search').focus();\" ondblclick=\"document.forms['selectform'].submit();\" id=\"search\">"; + + $selectFlag = (isset($selectFlag)?$selectFlag:0); + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + if( $i == 0 && $selectFlag == 0) { + $selected = "selected"; + } else { + $selected = ""; + } + echo "<option value='".$row["coupID"]."' ".$selected.">" + .$row["description"]."\n"; + } + echo "</select></div>" + ."<div class=\"listboxText coloredText centerOffset\">" + ._("use arrow keys to navigate")."<p>"._("clear to cancel")."</div>" + ."<div class=\"clear\"></div>"; + } + echo "</form></div>"; + } // END body_content() FUNCTION +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) + new VirtCoupDisplay(); + +?> diff --git a/pos/is4c-nf/plugins/VirtualCoupon/VirtualCoupon.php b/pos/is4c-nf/plugins/VirtualCoupon/VirtualCoupon.php new file mode 100644 index 000000000..7ad217d19 --- /dev/null +++ b/pos/is4c-nf/plugins/VirtualCoupon/VirtualCoupon.php @@ -0,0 +1,41 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class VirtualCoupon extends Plugin { + + public $plugin_settings = array( + ); + + public $plugin_description = 'A plugin for managing coupons assigned to + members. Type "VC" to use. + '; + + public function plugin_enable(){ + + } + + public function plugin_disable(){ + + } + +} diff --git a/pos/is4c-nf/plugins/VirtualCoupon/VirtualCouponParser.php b/pos/is4c-nf/plugins/VirtualCoupon/VirtualCouponParser.php new file mode 100644 index 000000000..5b8b05139 --- /dev/null +++ b/pos/is4c-nf/plugins/VirtualCoupon/VirtualCouponParser.php @@ -0,0 +1,63 @@ +<?php +/******************************************************************************* + + Copyright 2012 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class VirtualCouponParser extends Parser { + + function check($str){ + if ($str == "VC"){ + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $ret = $this->default_json(); + + if ($CORE_LOCAL->get("memberID") == 0){ + $ret['output'] = DisplayLib::boxMsg(_("No member selected")."<br />". + _("Apply member number first")); + } + else { + $plugin_info = new VirtualCoupon(); + $ret['main_frame'] = $plugin_info->plugin_url().'/VirtCoupDisplay.php'; + } + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>VC</td> + <td> + View virtual coupons for the current member + </td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/WedgeStaffCharge/WedgeScParser.php b/pos/is4c-nf/plugins/WedgeStaffCharge/WedgeScParser.php new file mode 100644 index 000000000..30152870f --- /dev/null +++ b/pos/is4c-nf/plugins/WedgeStaffCharge/WedgeScParser.php @@ -0,0 +1,95 @@ +<?php +/******************************************************************************* + + Copyright 2007,2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class WedgeScParser extends Parser { + var $left; + + function check($str){ + if (substr($str,-2) == "SC"){ + $left = substr($str,0,strlen($str)-2); + $left = str_replace($left,"."," "); + $left = str_replace($left,","," "); + if (!is_numeric($left) || strlen($left != 6)) + return False; + $this->left = $left; + return True; + } + return False; + } + + function parse($str){ + global $CORE_LOCAL; + $json = $this->default_json(); + $arg = $this->left; + + $CORE_LOCAL->set("sc",1); + $staffID = substr($arg, 0, 4); + + $pQuery = "select staffID,chargecode,blueLine from chargecodeview where chargecode = '".$arg."'"; + $pConn = Database::pDataConnect(); + $result = $pConn->query($pQuery); + $num_rows = $pConn->num_rows($result); + $row = $pConn->fetch_array($result); + + if ($num_rows == 0) { + $json['output'] = DisplayLib::xboxMsg("unable to authenticate staff ".$staffID); + $CORE_LOCAL->set("isStaff",0); // apbw 03/05/05 SCR + return $json; + } + else { + $CORE_LOCAL->set("isStaff",1); // apbw 03/05/05 SCR + $CORE_LOCAL->set("memMsg",$row["blueLine"]); + $tQuery = "update localtemptrans set card_no = '".$staffID."', percentDiscount = 15"; + $tConn = Database::tDataConnect(); + + TransRecord::addscDiscount(); + TransRecord::discountnotify(15); + $tConn->query($tQuery); + Database::getsubtotals(); + + $chk = self::ttl(); + if ($chk !== True){ + $json['main_frame'] = $chk; + return $json; + } + $CORE_LOCAL->set("runningTotal",$CORE_LOCAL->get("amtdue")); + return self::tender("MI", $CORE_LOCAL->get("runningTotal") * 100); + + } + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td><i>amount</i>SC</td> + <td>Tender <i>amount</i> to staff + charge</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-nf/plugins/WedgeStaffCharge/WedgeStaffCharge.php b/pos/is4c-nf/plugins/WedgeStaffCharge/WedgeStaffCharge.php new file mode 100644 index 000000000..011344036 --- /dev/null +++ b/pos/is4c-nf/plugins/WedgeStaffCharge/WedgeStaffCharge.php @@ -0,0 +1,60 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class WedgeStaffCharge extends Plugin { + + public $plugin_description = 'Legacy staff charge functionality that does not + belong in main code base'; + + public function plugin_enable(){ + // create database structures + $db = Database::pDataConnect(); + if (!$db->table_exists('chargecode')){ + $chargeCodeQ = "CREATE TABLE chargecode ( + staffID varchar(4), + chargecode varchar(6))"; + $db->query($chargeCodeQ); + } + if (!$db->table_exists('chargecodeview')){ + $ccView = "CREATE VIEW chargecodeview AS + SELECT c.staffID, c.chargecode, d.blueLine + FROM chargecode AS c, custdata AS d + WHERE c.staffID = d.CardNo"; + $db->query($ccView); + } + } + + public function plugin_disable(){ + $db = Database::pDataConnect(); + // always remove view + if ($db->table_exists('chargecodeview')){ + $db->query('DROP VIEW chargecodeview'); + } + // only remove table if it's empty + if ($db->table_exists('chargecode')){ + $chk = $db->query('SELECT staffID FROM chargecode'); + if ($db->num_rows($chk) == 0) + $db->query('DROP TABLE chargecode'); + } + } +} diff --git a/pos/is4c-nf/plugins/WfcMadCoupon/WfcMadCoupon.php b/pos/is4c-nf/plugins/WfcMadCoupon/WfcMadCoupon.php new file mode 100644 index 000000000..e72508bb0 --- /dev/null +++ b/pos/is4c-nf/plugins/WfcMadCoupon/WfcMadCoupon.php @@ -0,0 +1,28 @@ +<?php +/******************************************************************************* + + Copyright 2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class WfcMadCoupon extends Plugin { + + public $plugin_description = "WFC's quarterly member appreciation discount. Very + co-op specific and shouldn't be in the main code."; +} diff --git a/pos/is4c-nf/plugins/WfcMadCoupon/WfcMadCouponParser.php b/pos/is4c-nf/plugins/WfcMadCoupon/WfcMadCouponParser.php new file mode 100644 index 000000000..e1077c16c --- /dev/null +++ b/pos/is4c-nf/plugins/WfcMadCoupon/WfcMadCouponParser.php @@ -0,0 +1,61 @@ +<?php +/******************************************************************************* + + Copyright 2007,2013 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class WfcMadCouponParser extends Parser { + + function check($str){ + if ($str == "MA") + return True; + return False; + } + + function parse($str){ + global $CORE_LOCAL; + Database::getsubtotals(); + $amt = $CORE_LOCAL->get('runningTotal') - $CORE_LOCAL->get('transDiscount'); + $madCoup = number_format($amt * 0.05, 2); + if ($madCoup > 2.50) $madCoup = 2.50; + TransRecord::addItem("MAD Coupon", "Member Appreciation Coupon", "I", "CP", "C", 0, 1, + -1*$madCoup, -1*$madCoup, -1*$madCoup, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 17); + $ret = $this->default_json(); + $ret['output'] = DisplayLib::lastpage(); + $ret['redraw_footer'] = True; + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>MA</td> + <td>Add quarterly member coupon + (WFC specific)</td> + </tr> + </table>"; + } + +} + +?> diff --git a/pos/is4c-nf/qkFooter.php b/pos/is4c-nf/qkFooter.php new file mode 100644 index 000000000..fd8f3d1eb --- /dev/null +++ b/pos/is4c-nf/qkFooter.php @@ -0,0 +1,66 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +if (!isset($CORE_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +if ($CORE_LOCAL->get("gui-scale") == "no") + return; + +?> +<html> +<head> +<link rel="stylesheet" type="text/css" href="/css/pos.css"> +<script type="text/javascript"> +function trySubmit(inputstr){ + if (window.top.input.document.forms[0]){ + var cur = window.top.input.document.forms[0].reginput.value; + window.top.input.document.forms[0].reginput.value=cur+inputstr; + window.top.input.document.forms[0].submit(); + } +} +</script> +</head> +<body style="background: none;"> +<div style="text-align: center;"> +<input type="submit" value="Items" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="trySubmit('QK0');" /> +<input type="submit" value="Total" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="trySubmit('QK4');" /> +<input type="submit" value="Tender" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="trySubmit('QK2');" /> +<input type="submit" value="Member" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="trySubmit('QK5');" /> +<input type="submit" value="Misc" + class="quick_button" + style="margin: 0 10px 0 0;" + onclick="trySubmit('QK6');" /> +</div> +</body> +</html> diff --git a/pos/is4c-nf/scale-drivers/c-wrappers/Makefile b/pos/is4c-nf/scale-drivers/c-wrappers/Makefile new file mode 100644 index 000000000..cf6f0469c --- /dev/null +++ b/pos/is4c-nf/scale-drivers/c-wrappers/Makefile @@ -0,0 +1,4 @@ +CC=gcc + +all: NewMagellan.c + $(CC) -o nm NewMagellan.c diff --git a/pos/is4c-nf/scale-drivers/c-wrappers/NewMagellan.c b/pos/is4c-nf/scale-drivers/c-wrappers/NewMagellan.c new file mode 100644 index 000000000..6b761fb84 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/c-wrappers/NewMagellan.c @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <sys/types.h> +#include <dirent.h> +#include <string.h> +#include <unistd.h> + +int main(int argc, char** argv){ + DIR *dh;//directory handle + DIR *dh_tester; + char fn_buffer[1024]; + struct dirent *file;//a 'directory entity' AKA file + char * input_dir; + FILE* fp; + char fc_buffer[512]; + int eof_check; + + // no directory provided + if (argc < 2) + return 1; + + input_dir = argv[1]; + dh=opendir(input_dir); + + // bad directory + if (dh == NULL) + return 1; + + // default: no input + strcpy(fc_buffer,""); + while(file=readdir(dh)){ + // skip ., .., hidden stuff + if (file->d_name[0] == '.') + continue; + + // build full file name + strcpy(fn_buffer,input_dir); + strcat(fn_buffer,file->d_name); + + // check if entry is a directory + dh_tester = opendir(fn_buffer); + if (dh_tester != NULL){ + closedir(dh_tester); + continue; + } + + // get file contents + fp = fopen(fn_buffer,"r"); + eof_check = fscanf(fp,"%s",fc_buffer); + fclose(fp); + + // blank contents on empty files + if (eof_check == EOF) + strcpy(fc_buffer,""); + unlink(fn_buffer); + break; + } + closedir(dh); + + // determine output + if (strlen(fc_buffer) == 0){ + printf("{}\n"); + } + else if (fc_buffer[0] == 'S'){ + printf("{\"scale\":\"%s\"}\n",fc_buffer); + } + else { + printf("{\"scans\":\"%s\"}\n",fc_buffer); + } + + return 0; +} diff --git a/pos/is4c-nf/scale-drivers/c-wrappers/NewMagellan.cwrapper.php b/pos/is4c-nf/scale-drivers/c-wrappers/NewMagellan.cwrapper.php new file mode 100644 index 000000000..3214922ac --- /dev/null +++ b/pos/is4c-nf/scale-drivers/c-wrappers/NewMagellan.cwrapper.php @@ -0,0 +1,159 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +$CORE_PATH = isset($CORE_PATH)?$CORE_PATH:""; +if (empty($CORE_PATH)){ while(!file_exists($CORE_PATH."css/pos.css")) $CORE_PATH .= "../"; } + +if (!isset($CORE_LOCAL)) include($CORE_PATH.'lib/LocalStorage/conf.php'); +if (!class_exists("ScaleDriverWrapper")) include($CORE_PATH."scale-drivers/php-wrappers/ScaleDriverWrapper.php"); +if (!function_exists('scaledisplaymsg')) include($CORE_PATH.'lib/drawscreen.php'); +if (!function_exists('array_to_json')) include($CORE_PATH.'lib/array_to_json.php'); +if (!function_exists('udpSend')) include($CORE_PATH.'lib/udpSend.php'); + +class NewMagellan extends ScaleDriverWrapper { + + function SavePortConfiguration($portName){ + global $CORE_PATH; + + /* read in config file */ + $fp = fopen($CORE_PATH."scale-drivers/drivers/NewMagellan/ports.conf","r"); + $lines = array(); + while(!feof($fp)) $lines[] = fgets($fp); + fclose($fp); + + /* replace port setting */ + $fp = fopen($CORE_PATH."scale-drivers/drivers/NewMagellan/ports.conf","w"); + foreach($lines as $l){ + if (strstr($l,"SPH_Magellan_Scale") === False) fwrite($fp,$l); + else { + fwrite($fp,sprintf('%s SPH_Magellan_Scale',$portName)); + fwrite($fp,"\n"); + } + } + fclose($fp); + } + + function SaveDirectoryConfiguration($absPath){ + global $CORE_PATH; + + /* read in c# code file */ + $fp = fopen($CORE_PATH."scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs","r"); + $lines = array(); + while(!feof($fp)) $lines[] = fgets($fp); + fclose($fp); + + /* replace file location #defines */ + $fp = fopen($CORE_PATH."scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs","w"); + foreach($lines as $l){ + if (strstr($l,"static String MAGELLAN_OUTPUT_FILE ") !== False){ + fwrite($fp,sprintf('private static String MAGELLAN_OUTPUT_FILE = "%s";', + $absPath."scale-drivers/drivers/NewMagellan/scanner-scale.data")); + fwrite($fp,"\n"); + } + elseif (strstr($l,"static String MAGELLAN_LOCK_FILE ") !== False){ + fwrite($fp,sprintf('private static String MAGELLAN_LOCK_FILE = "%s";', + $absPath."scale-drivers/drivers/NewMagellan/scanner-scale.lock")); + fwrite($fp,"\n"); + } + else fwrite($fp,$l); + } + fclose($fp); + } + + function ReadFromScale(){ + global $CORE_LOCAL,$CORE_PATH; + + $readfile = $CORE_PATH.'scale-drivers/drivers/NewMagellan/scanner-scale'; + $readdir = $CORE_PATH.'scale-drivers/drivers/NewMagellan/ss-output'; + $scale_display = ""; + $scans = array(); + /* + if (file_exists($readfile.".data") && !file_exists($readfile.".lock")){ + + $fp = fopen($readfile.".lock","w"); + fclose($fp); + + $data = file_get_contents($readfile.".data"); + + unlink($readfile.".data"); + unlink($readfile.".lock"); + + foreach(explode("\n",$data) as $line){ + $line = rtrim($line,"\r"); // in case OS adds it + if (empty($line)) continue; + if ($line[0] == 'S'){ + $scale_display = scaledisplaymsg($line); + } + else { + $scans[] = $line; + } + } + } + */ + $dh = opendir($readdir); + while (false !== ($fn = readdir($dh))) { + if (is_dir($readdir."/".$fn)) continue; + $data = file_get_contents($readdir."/".$fn); + unlink($readdir."/".$fn); + $line = rtrim($data,"\r\n"); + if (empty($line)) continue; + if ($line[0] == 'S'){ + $scale_display = scaledisplaymsg($line); + } + else { + $scans[] = $line; + } + break; + } + + $output = array(); + if (!empty($scale_display)) $output['scale'] = $scale_display; + if (!empty($scans)) $output['scans'] = $scans[0]; + + if (!empty($output)) echo array_to_json($output); + else echo "{}"; + } + + /* just wraps UDP send because commands + ARE case-sensitive on the c# side */ + function WriteToScale($str){ + switch(strtolower($str)){ + case 'goodbeep': + udpSend('goodBeep'); + break; + case 'errorbeep': + udpSend('errorBeep'); + break; + case 'twopairs': + udpSend('twoPairs'); + break; + case 'repoll': + udpSend('rePoll'); + break; + case 'wakeup': + udpSend('wakeup'); + break; + } + } +} + +?> diff --git a/pos/is4c-nf/scale-drivers/c-wrappers/nm b/pos/is4c-nf/scale-drivers/c-wrappers/nm new file mode 100755 index 000000000..36857e39e Binary files /dev/null and b/pos/is4c-nf/scale-drivers/c-wrappers/nm differ diff --git a/pos/is4c-nf/scale-drivers/drivers/Magellan/Form1.frm b/pos/is4c-nf/scale-drivers/drivers/Magellan/Form1.frm new file mode 100644 index 000000000..07afc378f --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/Magellan/Form1.frm @@ -0,0 +1,456 @@ +VERSION 5.00 +Object = "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0"; "shdocvw.dll" +Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX" +Begin VB.Form Form1 + BorderStyle = 0 'None + Caption = "Form1" + ClientHeight = 6810 + ClientLeft = 0 + ClientTop = 0 + ClientWidth = 7005 + LinkTopic = "Form1" + ScaleHeight = 6810 + ScaleWidth = 7005 + ShowInTaskbar = 0 'False + StartUpPosition = 3 'Windows Default + Begin MSCommLib.MSComm MSComm1 + Left = 240 + Top = 240 + _ExtentX = 1005 + _ExtentY = 1005 + _Version = 393216 + DTREnable = -1 'True + End + Begin SHDocVwCtl.WebBrowser WebBrowser1 + Height = 855 + Left = 960 + TabIndex = 0 + Top = 360 + Width = 735 + ExtentX = 1296 + ExtentY = 1508 + ViewMode = 0 + Offline = 0 + Silent = 0 + RegisterAsBrowser= 0 + RegisterAsDropTarget= 1 + AutoArrange = 0 'False + NoClientEdge = 0 'False + AlignLeft = 0 'False + NoWebView = 0 'False + HideFileNames = 0 'False + SingleClick = 0 'False + SingleSelection = 0 'False + NoFolders = 0 'False + Transparent = 0 'False + ViewID = "{0057D0E0-3573-11CF-AE69-08002B2E1262}" + Location = "" + End +End +Attribute VB_Name = "Form1" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +' Copyright 2001, 2004 Wedge Community Co-op + +' This file is part of IS4C. + +' IS4C is free software; you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation; either version 2 of the License, or +' (at your option) any later version. + +' IS4C is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +' GNU General Public License for more details. + +' You should have received a copy of the GNU General Public License +' in the file license.txt along with IS4C; if not, write to the Free Software +' Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + +Public shellReturn +Public InBuffer +Public intI +Public sendKeyFlag +Public strLocation +Public intJ +Public intK +Public intMov +Public beeped +Public one44 +Public intZero +Public repoll +Public onefourone +Public elevenReceived + + + + + +Private Sub Form_Load() + + + Me.Caption = "Integrated Systems for Co-operatives" + Form1.Width = Screen.Width + Form1.Height = Screen.Height + Form1.Left = 0 + Form1.Top = 0 + + + WebBrowser1.Navigate "localhost" + + WebBrowser1.Width = Screen.Width + WebBrowser1.Height = Screen.Height + WebBrowser1.Left = 0 + WebBrowser1.Top = 0 + + intK = 0 + intMov = 0 + beeped = 0 + repoll = 1 + onefourone = 0 + elevenReceived = 0 + InBuffer = "" + preBuffer = "" + ReDim aWeight(1) + aWeight(0) = 0 + intI = 0 + sendKeyFlag = 0 + ReDim Preserve aWeight(intI + 1) + With MSComm1 + .CommPort = 1 + .Handshaking = 2 - comRTS + .RThreshold = 1 + .RTSEnable = True + .Settings = "9600,o,7,1" + .SThreshold = 1 + .PortOpen = True + ' Leave all other settings as default values. + End With + Do + clearbuffer = MSComm1.Input + If Len(clearbuffer) < 1 Then Exit Do + Loop + + +End Sub + + Private Sub Form_Unload(Cancel As Integer) + + On Error GoTo error_handler + + InBuffer = "" + Do + clearbuffer = MSComm1.Input + If Len(clearbuffer) < 1 Then Exit Do + Loop + MSComm1.PortOpen = False + +error_handler: + + End Sub + + + Private Sub MSComm1_OnComm() + + On Error GoTo error_handler + + If MSComm1.CommEvent = comEvReceive Then + preBuffer = MSComm1.Input + + If Len(preBuffer) < 8 Then + preBuffer = Left(preBuffer & " ", 8) + End If + + + InBuffer = InBuffer & preBuffer + + If intK = 1 Then + intB = InStr(InBuffer, Chr$(13)) + + + If intB > 0 Then + + aInBuffer = Split(InBuffer, Chr$(13)) + InBuffer = aInBuffer(0) + + intA = InStr(InBuffer, "S08A") + intE = InStr(InBuffer, "S08E") + intF = InStr(InBuffer, "S08F") + If intA > 0 Then + intScan = intA + ElseIf intE > 0 Then + intScan = intE + ElseIf intF > 0 Then + intScan = intF + Else + intScan = 0 + End If + + If intScan > 0 Then + InBuffer = Mid(InBuffer, intScan, Len(InBuffer)) + End If + + If Left(InBuffer, 1) = "S" Then + + Call HandleInBuffer(InBuffer) + + Else + InBuffer = "" + MSComm1.Output = "S11" & Chr$(13) + End If + + InBuffer = "" + + End If + + End If + + + + + End If +error_handler: + + End Sub + + Sub HandleInBuffer(InBuffer) + BytesIn = InBuffer + InBuffer = "" + strPrefix = Left(BytesIn, 4) + + + On Error GoTo error_handler + + Dim dblWeight + + + If strPrefix = "S08A" And InStr(strLocation, "List") = 0 And InStr(strLocation, "Search") = 0 Then + + If WebBrowser1.Document.frames(1).Document.Hidden.scan.Value <> "noScan" Then + WebBrowser1.Document.frames(0).Document.All("reginput").Value = WebBrowser1.Document.frames(0).Document.All("reginput").Value & Mid(BytesIn, 5, 11) & Chr$(13) + WebBrowser1.Document.frames(0).Document.All("form").submit + + + + End If + 'WebBrowser1.Refresh + ElseIf strPrefix = "S08F" And InStr(strLocation, "List") = 0 And InStr(strLocation, "Search") = 0 Then + If WebBrowser1.Document.frames(1).Document.Hidden.scan.Value <> "noScan" Then + WebBrowser1.Document.frames(0).Document.All("reginput").Value = WebBrowser1.Document.frames(0).Document.All("reginput").Value & Mid(BytesIn, 5, 12) & Chr$(13) + WebBrowser1.Document.frames(0).Document.All("form").submit + + + End If + ElseIf strPrefix = "S08E" And InStr(strLocation, "List") = 0 And InStr(strLocation, "Search") = 0 Then + If WebBrowser1.Document.frames(1).Document.Hidden.scan.Value <> "noScan" Then + upcE = Mid(BytesIn, 5, 7) + P6 = Right(upcE, 1) + If P6 = 0 Then + upcE = Left(upcE, 3) & "00000" & Mid(upcE, 4, 3) + ElseIf P6 = 1 Then + upcE = Left(upcE, 3) & "10000" & Mid(upcE, 4, 3) + ElseIf P6 = 2 Then + upcE = Left(upcE, 3) & "20000" & Mid(upcE, 4, 3) + ElseIf P6 = 3 Then + upcE = Left(upcE, 4) & "00000" & Mid(upcE, 5, 2) + ElseIf P6 = 4 Then + upcE = Left(upcE, 5) & "00000" & Mid(upcE, 6, 1) + Else + upcE = Left(upcE, 6) & "0000" & P6 + End If + + WebBrowser1.Document.frames(0).Document.All("reginput").Value = WebBrowser1.Document.frames(0).Document.All("reginput").Value & upcE & Chr$(13) + WebBrowser1.Document.frames(0).Document.All("form").submit + + + + End If + + + ElseIf Left(BytesIn, 3) = "S11" Then + onefourone = 0 + 'WebBrowser1.Document.frames(2).Document.All("reginput").Value = Left(BytesIn, 7) & Chr$(13) + 'WebBrowser1.Document.frames(2).Document.All("form").submit + intZero = 0 + If elevenSent = 0 Then + intMov = 0 + End If + 'Call timeDelay(0.2) + MSComm1.Output = "S14" & Chr$(13) + + ElseIf strPrefix = "S143" Then + onefourone = 0 + WebBrowser1.Document.frames(2).Document.All("reginput").Value = "S110000" & Chr$(13) + WebBrowser1.Document.frames(2).Document.All("form").submit + sendKeyFlag = 1 + + elevenSent = 0 + MSComm1.Output = "S11" & Chr$(13) + + + ElseIf strPrefix = "S141" Then + elevenSent = 0 + If onefourone = 0 Then + + WebBrowser1.Document.frames(2).Document.All("reginput").Value = "S141" & Chr$(13) + WebBrowser1.Document.frames(2).Document.All("form").submit + End If + onefourone = 1 + intMove = 0 + Call timeDelay(0.2) + MSComm1.Output = "S14" & Chr$(13) + + ElseIf strPrefix = "S145" Or strPrefix = "S142" Then + onefourone = 0 + elevenSent = 0 + WebBrowser1.Document.frames(2).Document.All("reginput").Value = strPrefix & Chr$(13) + WebBrowser1.Document.frames(2).Document.All("form").submit + + Call timeDelay(0.2) + MSComm1.Output = "S11" & Chr$(13) + + ElseIf strPrefix = "S144" Then + + If Abs(CInt(Mid(BytesIn, 5, 4)) - one44) > 1 Or (CInt(Mid(BytesIn, 5, 4)) - one44) = -1 Or onefourone = 1 Then + intMov = 0 + End If + one44 = CInt(Mid(BytesIn, 5, 4)) + onefourone = 0 + If intMov = 0 Then + + intMov = 1 + WebBrowser1.Document.frames(2).Document.All("reginput").Value = "S11" & Mid(BytesIn, 5, 4) & Chr$(13) + WebBrowser1.Document.frames(2).Document.All("form").submit + elevenSent = 1 + End If + Call timeDelay(0.2) + MSComm1.Output = "S14" & Chr$(13) + + Else + onefourone = 0 + elevenSent = 0 + Call timeDelay(0.2) + MSComm1.Output = "S11" & Chr$(13) + + End If + BytesIn = "" + +error_handler: + BytesIn = "" + +End Sub + + + +Private Sub WebBrowser1_DownloadComplete() + + 'WebBrowser1.SetFocus + +End Sub + +Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant) + On Error GoTo error_handler + + WebBrowser1.SetFocus + strLocation = URL + + If URL = "http://localhost/bye.html" Then + Unload Form1 + End If + +error_handler: + +End Sub + +Public Sub timeDelay(sngDelay As Single) +On Error GoTo error_handler + +Const cSecondsInDay = 86400 ' # of seconds in a day. + +Dim sngStart As Single ' Start time. +Dim sngStop As Single ' Stop time. +Dim sngNow As Single ' Current time. + +sngStart = Timer ' Get current timer. +sngStop = sngStart + sngDelay ' Set up stop time based on + ' delay. + +Do + sngNow = Timer ' Get current timer again. + If sngNow < sngStart Then ' Has midnight passed? + sngStop = sngStart - cSecondsInDay ' If yes, reset end. + End If + DoEvents ' Let OS process other events. + +Loop While sngNow < sngStop ' Has time elapsed? + +error_handler: + +End Sub + +Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL1 As Variant) + On Error GoTo error_handler + + If (InStr(URL1, "pos") > 0 Or InStr(URL1, "product") > 0) Or InStr(URL1, "boxMsg") > 0 Or InStr(URL1, "qtty") > 0 Then + Dim Beepstatus + Beepstatus = WebBrowser1.Document.frames(1).Document.Hidden.alert.Value + scResetStatus = WebBrowser1.Document.frames(1).Document.Hidden.scReset.Value + + If Beepstatus = "errorBeep" Then + Call beeps(3) + + ElseIf Beepstatus = "beepTwice" Then + Call beeps(2) + + ElseIf Beepstatus = "goodBeep" Then + Call beeps(1) + + ElseIf Beepstatus = "twoPairs" Then + Call timeDelay(0.3) + Call beeps(2) + Call timeDelay(0.3) + Call beeps(2) + + ElseIf Beepstatus = "rePoll" Or scResetStatus = "rePoll" Then + intMov = 0 + elevenSent = 0 + Call timeDelay(0.25) + MSComm1.Output = "S14" & Chr$(13) + + End If + End If + + If (pDisp Is WebBrowser1.Object) Then + intK = 1 + intMov = 0 + + End If + +error_handler: + + +End Sub + +Private Sub beeps(ByVal beepNum) + +On Error GoTo error_handler + +intBeepN = 1 + MSComm1.Output = "S334" & Chr$(13) +While intBeepN < beepNum + Call timeDelay(0.15) + MSComm1.Output = "S334" & Chr$(13) + intBeepN = intBeepN + 1 +Wend + +error_handler: + +End Sub + + + diff --git a/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.exe b/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.exe new file mode 100644 index 000000000..9a2cce89c Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.exe differ diff --git a/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.vbp b/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.vbp new file mode 100644 index 000000000..e62ef21d5 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.vbp @@ -0,0 +1,36 @@ +Type=Exe +Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#E:\WINNT\system32\stdole2.tlb#OLE Automation +Object={EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0; shdocvw.dll +Object={3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}#4.0#0; mshtml.dll +Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0; MSCOMM32.OCX +Form=Form1.frm +Startup="Form1" +ExeName32="pos.exe" +Command32="" +Name="Project1" +HelpContextID="0" +CompatibleMode="0" +MajorVer=1 +MinorVer=0 +RevisionVer=0 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionCompanyName="Wedge Co-op" +CompilationType=0 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=0 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 + +[MS Transaction Server] +AutoRefresh=1 diff --git a/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.vbw b/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.vbw new file mode 100644 index 000000000..856f0bdf9 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/Magellan/pos.vbw @@ -0,0 +1 @@ +Form1 = -94, -1, 520, 574, Z, 66, 75, 500, 355, C diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/.gitignore b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/.gitignore new file mode 100644 index 000000000..960bcf029 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/.gitignore @@ -0,0 +1 @@ +ports.conf diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/BitmapConverter.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/BitmapConverter.cs new file mode 100644 index 000000000..d7acf917f --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/BitmapConverter.cs @@ -0,0 +1,153 @@ +using System; + +namespace BitmapBPP { + +public class BitmapConverter { + + /* Input: filename of a bitmap file + Output: byte array of the same bitmap with 1 bit per pixel + + Theoretically works with 8, 16, 24, or 32 bit input files; + I've only tested with 32. Returns null on 4bpp, file itself + if image is already 1bpp. + + Uncompressed DIB3 only. Returns null otherwise. + + May not deal well with an existing color palette. + + No support for endianess or negative height. + */ + public static byte[] To1bpp(string filename){ + byte[] data = System.IO.File.ReadAllBytes(filename); + + int raw_loc = BitmapConverter.GetInt(data,0xa,0xd); + int width = BitmapConverter.GetInt(data,0x12,0x15); + int height = BitmapConverter.GetInt(data,0x16,0x19); + int bpp = BitmapConverter.GetInt(data,0x1c,0x1d); + int comp = BitmapConverter.GetInt(data,0x1e,0x21); + + // 1 bpp => done + // 4 bpp => unimplemented + if (bpp == 1) return data; + if (bpp == 4) return null; + // compression => unimplemented + if (comp != 0) return null; + + byte[,] pixels = new byte[width,height]; + + int raw_size = data.Length - raw_loc; + int bytesPerRow = raw_size / height; + + /* read the existing pixel values into a + * 2-dimensional array. */ + int x = 0; + int y = 0; + int pix_size = bpp/8; + int pixcount = 0; + for (int i=0; i < raw_size; i+=0){ + if (i > 0 && i % bytesPerRow == 0){ + x = 0; + y++; + } + if (x < width){ + int pixel = BitmapConverter.GetInt(data, + i+raw_loc,i+raw_loc+pix_size-1); + i += pix_size; + pixel = pixel & 0xffffff; // no alpha + if (pixel < 0xeeeeee) pixels[x,y] = 1; + else pixels[x,y] = 0; + pixcount++; + } + else { + i++; // row padding + } + x++; + } + + /* create a new byte array to hold 1 bit pixels + * and add them all to it*/ + int newRowBytes = (int)((width+31)/32.0) * 4; + byte[] newdata = new byte[newRowBytes*height]; + int bits = 0; + for(int i=0; i<newdata.Length; i++){ + int x1 = (i % newRowBytes)*8; + int y1 = i / newRowBytes; + int val = 0; + for(int j=0; j<8; j++){ + if(x1+j >= width) // end of pixel row, rest gets padded + break; + val = val | ((pixels[x1+j,y1]) << (7-j)); + bits++; + } + newdata[i] = (byte)val; + } + + byte[] newbmp = new byte[14+40+8+newdata.Length]; + + // BMP Header + newbmp[0x0] = 0x42; + newbmp[0x1] = 0x4D; + BitmapConverter.PutInt(ref newbmp, newbmp.Length, 0x2, 0x5); // filesize + BitmapConverter.PutInt(ref newbmp, 0, 0x6, 0x9); // irrelevant + BitmapConverter.PutInt(ref newbmp, 14+40+8, 0xa, 0xd); // image data offset + + // DIB Header + BitmapConverter.PutInt(ref newbmp, 40, 0xe, 0x11); // DIB3 + BitmapConverter.PutInt(ref newbmp, width, 0x12, 0x15); + BitmapConverter.PutInt(ref newbmp, height, 0x16, 0x19); + BitmapConverter.PutInt(ref newbmp, 1, 0x1a, 0x1b); // planes, always 1 + BitmapConverter.PutInt(ref newbmp, 1, 0x1c, 0x1d); // bpp + BitmapConverter.PutInt(ref newbmp, 0, 0x1e, 0x21); // no compression + BitmapConverter.PutInt(ref newbmp, newdata.Length, 0x22, 0x25); // image data size + int dpi = (int)(72*39.97 + 0.5); + BitmapConverter.PutInt(ref newbmp, dpi, 0x26, 0x29); // horizontal dpi + BitmapConverter.PutInt(ref newbmp, dpi, 0x2a, 0x2d); // vertical dpi + BitmapConverter.PutInt(ref newbmp, 2, 0x2e, 0x31); // number of colors + BitmapConverter.PutInt(ref newbmp, 0, 0x32, 0x35); // usually ignored + + // Color Palette + newbmp[0x36] = 0xff; // white + newbmp[0x37] = 0xff; + newbmp[0x38] = 0xff; + newbmp[0x39] = 0x0; + newbmp[0x3a] = 0x0; // black + newbmp[0x3b] = 0x0; + newbmp[0x3c] = 0x0; + newbmp[0x3d] = 0x0; + + // raw image data + Array.Copy(newdata,0,newbmp,0x3e,newdata.Length); + + return newbmp; + } + + // read an integer from a byte array + private static int GetInt(byte[] data, int start, int end){ + int val = 0; + for(int i=start; i<=end; i++){ + val = val | (data[i] << (8*(i-start))); + } + return val; + } + + // write an integer into a byte array + private static void PutInt(ref byte[] ret, int val, int start, int end){ + for(int i=start; i<end; i++){ + ret[i] = (byte)(val & 0xff); + val = val >> 8; + } + } + + // just static methods + public BitmapConverter(){} + + // for testing + /* + static public void Main(){ + byte[] newbmp = BitmapConverter.To1bpp("1721f71e2a40be4fd58cb1292cc0f0cc.bmp"); + System.IO.File.WriteAllBytes("out.bmp",newbmp); + } + */ +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/DelegateBrowserForm.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/DelegateBrowserForm.cs new file mode 100644 index 000000000..f7c17430f --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/DelegateBrowserForm.cs @@ -0,0 +1,137 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * DelegateBrowserForm + * A Form with a WebBrowser object and a set of delegates + * to access than object. + * + * Delegates: + * string CheckDelegate(int FrameNumber, string FieldName) + * returns "value" attribute of the given tag, generally + * an <input>, in the given frame + * + * void SetDelegate(int FrameNumber, string FieldName, string FieldValue) + * updates the "value" attribute of the given tag in + * the given frame + * + * void SubmitDelegate(int FrameNumber, int FormNumber) + * submits the given form in the given frame + * + * Uri UrlDelegate(int FrameNumber) + * returns the Url currently loaded in the given frame. Since + * frames aren't referenceable by name, this can help find + * determine which frame is the one you want + * +*************************************************************/ +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Threading; + +namespace CustomForms { + +public class DelegateBrowserForm : Form { + + public delegate string CheckValue(string FieldName); + public CheckValue CheckDelegate; + + public delegate void SetValue(string FieldName, string NewValue); + public SetValue SetDelegate; + + public delegate void SubmitForm(string FormName); + public SubmitForm SubmitDelegate; + + public delegate void RunScript(string source); + public RunScript ScriptDelegate; + + public delegate Uri GetUrl(); + public GetUrl UrlDelegate; + + public delegate void MsgRecv(string msg); + public MsgRecv MsgDelegate; + + protected WebBrowser wb; + + public DelegateBrowserForm(){ + wb = new WebBrowser(); + + CheckDelegate = new CheckValue(this.CheckValueMethod); + SetDelegate = new SetValue(this.SetValueMethod); + SubmitDelegate = new SubmitForm(this.SubmitFormMethod); + ScriptDelegate = new RunScript(this.RunScriptMethod); + UrlDelegate = new GetUrl(this.GetUrlMethod); + } + + public string CheckValueMethod(string FieldName){ + HtmlDocument doc = wb.Document; + if (doc == null) return ""; + + HtmlElement tag = GetElementByName(doc, FieldName); + if (tag == null) return ""; + + return tag.GetAttribute("value"); + } + + public void SetValueMethod(string FieldName, string NewValue){ + HtmlDocument doc = wb.Document; + if (doc != null){ + HtmlElement tag = GetElementByName(doc, FieldName); + if (tag != null){ + tag.SetAttribute("value", NewValue); + } + } + } + + public void SubmitFormMethod(string FormName){ + HtmlDocument doc = wb.Document; + if (doc != null){ + HtmlElementCollection forms = doc.Forms; + if (forms[FormName] != null){ + forms[FormName].InvokeMember("submit"); + } + } + } + + public void RunScriptMethod(string source){ + HtmlDocument doc = wb.Document; + if (doc != null){ + doc.InvokeScript(source); + } + } + + public Uri GetUrlMethod(){ + HtmlDocument doc = wb.Document; + if (doc == null) return null; + else return doc.Url; + } + + protected HtmlElement GetElementByName(HtmlDocument doc, string name){ + HtmlElementCollection alltags = doc.All; + HtmlElementCollection validtags = alltags.GetElementsByName(name); + if (validtags.Count < 1) return null; + else return validtags[0]; + } + +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/DelegateForm.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/DelegateForm.cs new file mode 100644 index 000000000..9d8cc6461 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/DelegateForm.cs @@ -0,0 +1,39 @@ +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * DelegateForm + * A form with delegate to call from separate threads + * + * +*************************************************************/ +using System; +using System.Threading; + +namespace CustomForms { + +public abstract class DelegateForm { + + public abstract void MsgRecv(string msg); +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/Magellan.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/Magellan.cs new file mode 100644 index 000000000..d0cef93bd --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/Magellan.cs @@ -0,0 +1,179 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * Magellan + * Main app. Starts all requested Serial Port Handlers + * and monitors UDP for messages + * + * Note that exit won't work cleanly if a SerialPortHandler + * blocks indefinitely. Use timeouts in polling reads. +*************************************************************/ +using System; +using System.Threading; +using System.IO; +using System.Collections; + +using CustomForms; +using CustomUDP; +using SPH; + +public class Magellan : DelegateForm { + + private SerialPortHandler[] sph; + private UDPMsgBox u; + + // read deisred modules from config file + public Magellan(int verbosity){ + ArrayList conf = ReadConfig(); + sph = new SerialPortHandler[conf.Count]; + for(int i = 0; i < conf.Count; i++){ + string port = ((string[])conf[i])[0]; + string module = ((string[])conf[i])[1]; + try { + Type t = Type.GetType("SPH."+module+", SPH, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"); + + sph[i] = (SerialPortHandler)Activator.CreateInstance(t, new Object[]{ port }); + sph[i].SetParent(this); + sph[i].SetVerbose(verbosity); + } + catch (Exception){ + System.Console.WriteLine("Warning: could not initialize "+port); + System.Console.WriteLine("Ensure the device is connected and you have permission to access it."); + sph[i] = null; + } + } + FinishInit(); + } + + // alternate constructor for specifying + // desired modules at compile-time + public Magellan(SerialPortHandler[] args){ + this.sph = args; + FinishInit(); + } + + private void FinishInit(){ + MonitorSerialPorts(); + + u = new UDPMsgBox(9450); + u.SetParent(this); + u.My_Thread.Start(); + } + + private void MonitorSerialPorts(){ + foreach(SerialPortHandler s in sph){ + if (s == null) continue; + s.SPH_Thread.Start(); + } + } + + public override void MsgRecv(string msg){ + if (msg == "exit"){ + this.ShutDown(); + } + else { + foreach(SerialPortHandler s in sph){ + s.HandleMsg(msg); + } + } + } + + public void ShutDown(){ + try { + foreach(SerialPortHandler s in sph){ + s.Stop(); + } + u.Stop(); + } + catch(Exception ex){ + System.Console.WriteLine(ex); + } + } + + /* + private void PageChange(object sender, WebBrowserDocumentCompletedEventArgs e){ + if (e.Url == new Uri("http://localhost/bye.html")){ + try { + u.Stop(); + foreach(SerialPortHandler s in sph){ + s.Stop(); + } + } + catch(Exception ex){ + System.Console.WriteLine(ex); + } + + this.Dispose(); + Application.Exit(); + } + } + */ + + private ArrayList ReadConfig(){ + StreamReader fp = new StreamReader("ports.conf"); + ArrayList al = new ArrayList(); + Hashtable ht = new Hashtable(); + string line; + while( (line = fp.ReadLine()) != null){ + line = line.TrimStart(null); + if (line == "" || line[0] == '#') continue; + string[] pieces = line.Split(null); + if (pieces.Length != 2){ + System.Console.WriteLine("Warning: malformed port.conf line: "+line); + System.Console.WriteLine("Format: <port_string> <handler_class_name>"); + } + else if (ht.ContainsKey(pieces[0])){ + System.Console.WriteLine("Warning: device already has a module attached."); + System.Console.WriteLine("Line will be ignored: "+line); + } + else { + al.Add(pieces); + ht.Add(pieces[0], pieces[1]); + } + } + return al; + } + + static public void Main(string[] args){ + int verbosity = 0; + for(int i=0;i<args.Length;i++){ + if (args[i] == "-v"){ + verbosity = 1; + if (i+1 < args.Length){ + try { verbosity = Int32.Parse(args[i+1]); } + catch{} + } + } + } + Magellan m = new Magellan(verbosity); + bool exiting = false; + while(!exiting){ + string user_in = System.Console.ReadLine(); + if (user_in == "exit"){ + System.Console.WriteLine("stopping"); + m.ShutDown(); + exiting = true; + } + } + } +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/MagellanWinSVC.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/MagellanWinSVC.cs new file mode 100644 index 000000000..348664790 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/MagellanWinSVC.cs @@ -0,0 +1,74 @@ +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * Magellan + * + * Wraps Magellan in a Windows Service. + * Use installutil.exe posSVC.exe to install. When prompted + * for a username and password, a fully qualified name + * (i.e., %COMPUTER%\%USER%) is required. + * +*************************************************************/ +using System; +using System.ServiceProcess; +using System.Configuration.Install; +using System.ComponentModel; + +using SPH; + +public class MagellanWinSVC : ServiceBase { + + protected Magellan my_obj; + + public MagellanWinSVC(){ + this.ServiceName = "IT CORE Scale Monitor"; + } + + override protected void OnStart(String[] args){ + SerialPortHandler[] sph = new SerialPortHandler[1]; + sph[0] = new SPH_Magellan_Scale("COM1"); + this.my_obj = new Magellan(sph); + } + + override protected void OnStop(){ + if (this.my_obj != null) + this.my_obj.ShutDown(); + } + + public static void Main(){ + ServiceBase.Run(new MagellanWinSVC()); + } +} + +[RunInstallerAttribute(true)] +public class MyInstaller : ServiceProcessInstaller { + private ServiceInstaller s; + + public MyInstaller(){ + this.s = new ServiceInstaller(); + this.s.ServiceName = "IT CORE Scale Monitor"; + this.Installers.AddRange(new Installer[] { + this.s + }); + } +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/MagellanWithoutWebBrowserObject.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/MagellanWithoutWebBrowserObject.cs new file mode 100644 index 000000000..ad1d753c2 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/MagellanWithoutWebBrowserObject.cs @@ -0,0 +1,141 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * Magellan + * Main app. Starts the thread for each SerialPortHandler + * and passes them WebBrowser load event Urls. + * + * Otherwise, minor details - sizing the window, watching + * for the Url http://localhost/bye.html that indicates it's + * time to exit. + * + * Note that exit won't work cleanly if a SerialPortHandler + * blocks indefinitely. Use timeouts in polling reads. +*************************************************************/ +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Threading; +using System.IO; +using System.Collections; +using System.Diagnostics; + +using CustomForms; +using CustomUDP; +using SPH; + +class Magellan : DelegateForm { + + private SerialPortHandler[] sph; + private UDPMsgBox u; + private Process browser_window; + + + public Magellan(){ + + MsgDelegate = new MsgRecv(this.MsgRecvMethod); + this.FormClosing += new FormClosingEventHandler(FormClosingMethod); + + ArrayList conf = ReadConfig(); + sph = new SerialPortHandler[conf.Count]; + for(int i = 0; i < conf.Count; i++){ + string port = ((string[])conf[i])[0]; + string module = ((string[])conf[i])[1]; + + Type t = Type.GetType("SPH."+module+", SPH, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"); + + sph[i] = (SerialPortHandler)Activator.CreateInstance(t, new Object[]{ port }); + sph[i].SetParent(this); + } + MonitorSerialPorts(); + + browser_window = Process.Start("iexplore.exe", + "http://localhost/"); + + u = new UDPMsgBox(9450); + u.SetParent(this); + u.My_Thread.Start(); + + + } + + private void MonitorSerialPorts(){ + foreach(SerialPortHandler s in sph){ + s.SPH_Thread.Start(); + } + } + + public void MsgRecvMethod(string msg){ + if (msg == "exit"){ + this.ShutDown(); + } + else { + foreach(SerialPortHandler s in sph){ + s.HandleMsg(msg); + } + } + } + + private void FormClosingMethod(Object sender, FormClosingEventArgs e) { + this.ShutDown(); + } + + private void ShutDown(){ + try { + browser_window.CloseMainWindow(); + u.Stop(); + foreach(SerialPortHandler s in sph){ + s.Stop(); + } + } + catch(Exception ex){ + System.Console.WriteLine(ex); + } + + this.Dispose(); + Application.Exit(); + } + + private ArrayList ReadConfig(){ + StreamReader fp = new StreamReader("ports.conf"); + ArrayList al = new ArrayList(); + string line; + while( (line = fp.ReadLine()) != null){ + line = line.TrimStart(null); + if (line == "" || line[0] == '#') continue; + string[] pieces = line.Split(null); + if (pieces.Length != 2){ + System.Console.WriteLine("Warning: malformed port.conf line: "+line); + System.Console.WriteLine("Format: <port_string> <handler_class_name>"); + } + else { + al.Add(pieces); + } + } + return al; + } + + static public void Main(){ + Application.Run(new Magellan()); + } +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/Makefile b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/Makefile new file mode 100644 index 000000000..d82b52150 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/Makefile @@ -0,0 +1,27 @@ +CC=gmcs +RM=rm -f +BASE_LIBS= + +all: DelegateForm.dll USBLayer.dll SPH.dll UDPMsgBox.dll Magellan.cs + $(CC) -target:exe $(BASE_LIBS) -r:SPH.dll -r:DelegateForm.dll -r:UDPMsgBox.dll -out:pos.exe Magellan.cs + +UDPMsgBox.dll: DelegateForm.dll UDPMsgBox.cs + $(CC) -target:library $(BASE_LIBS) -r:DelegateForm.dll -out:UDPMsgBox.dll UDPMsgBox.cs + +DelegateForm.dll: DelegateForm.cs + $(CC) -target:library $(BASE_LIBS) -out:DelegateForm.dll DelegateForm.cs + +USBLayer.dll: USBLayer.cs USB-Posix.cs + $(CC) -target:library $(BASE_LIBS) -r:Mono.Posix.dll -out:USBLayer.dll USBLayer.cs USB-Posix.cs + +SPH.dll: DelegateForm.dll USBLayer.dll SerialPortHandler.cs SPH_Magellan_Scale.cs SPH_SignAndPay_USB.cs + $(CC) -define:MONO -target:library $(BASE_LIBS) -r:DelegateForm.dll -r:USBLayer.dll -out:SPH.dll SerialPortHandler.cs SPH_Magellan_Scale.cs SPH_SignAndPay_USB.cs + +Magellan.dll: DelegateForm.dll SPH.dll UDPMsgBox.dll Magellan.cs + $(CC) -target:library $(BASE_LIBS) -r:SPH.dll -r:DelegateForm.dll -r:UDPMsgBox.dll -out:Magellan.dll Magellan.cs + +posSVC.exe: Magellan.dll MagellanWinSVC.cs + $(CC) -target:exe $(BASE_LIBS) -r:System.ServiceProcess.dll -r:System.Configuration.Install.dll -r:SPH.dll -r:DelegateForm.dll -r:UDPMsgBox.dll -r:Magellan.dll -out:posSVC.exe MagellanWinSVC.cs + +clean: + $(RM) pos.exe SPH.dll DelegateForm.dll UDPMsgBox.dll USBLayer.dll diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/README b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/README new file mode 100644 index 000000000..0d9165d87 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/README @@ -0,0 +1,85 @@ +Make sure ss-output is writable by the driver: +$ sudo chmod -R 777 ss-output + +Check the assignment of MAGELLAN_OUTPUT_DIR in SPH_Magellan_Scales.cs +$ grep MAGELLAN_OUTPUT_DIR SPH_Magellan_Scales.cs +It should be "ss-output/", the same as the directory above. + +If it isn't, open SPH_Magellan_Scales.cs in a text editor and change it. +Then re-compile pos.exe: +$ make clean +$ make + +Run the driver in the forground: +$ sudo mono pos.exe +If it starts OK it will immediately say: +Reading serial data +and there may be another line of scale or scanner data such as S110000 + +Now scan a barcode. It should be echoed to the window running pos.exe. E.g.: +03120044618 +Then put something on the scale. Expect to see something like: +S110023 +where "23" is the weight, 23/100ths of a pound in this case. +Remove the thing from the scale and two more lines will probably appear: +S141 +S1100000 +the second indicating the scale is back to zero. +To stop the driver: ^C + +You can run the driver in the foreground and use the PoS at the same time. +The items you scan and weigh (if you also enter product codes) will appear +in the transaction in the usual way. + +A second attempt to run the driver in the foreground may get a message like: +$ sudo mono pos.exe + +Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object + at System.TermInfoDriver.CheckWindowDimensions () [0x00000] + at System.TermInfoDriver.get_WindowWidth () [0x00000] + at System.TermInfoDriver.IncrementX () [0x00000] + at System.TermInfoDriver.IsSpecialKey (ConsoleKeyInfo key) [0x00000] + at System.TermInfoDriver.IsSpecialKey (Char c) [0x00000] + at System.IO.CStreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] + at System.IO.CStreamWriter.Write (System.Char[] val) [0x00000] + at System.IO.CStreamWriter.Write (System.String val) [0x00000] + at System.IO.TextWriter.WriteLine (System.String value) [0x00000] + at System.IO.SynchronizedWriter.WriteLine (System.String value) [0x00000] + at System.Console.WriteLine (System.String value) [0x00000] + at SPH.SPH_Magellan_Scale.Read () [0x00000] + +I don't know what to do about this. +Doing again gets the same message. +Start the driver in the background, do a couple scans, stop it; +then running it in foreground may work again. + +Open another terminal window and go to ss-ouput. +$ls -l will show something like: +-rwxrwxrwx 1 nobody nogroup 8 2012-10-27 17:14 13930410 +-rw-r--r-- 1 root root 8 2012-10-27 17:34 15184740 +-rw-r--r-- 1 root root 12 2012-10-27 17:35 15206202 +-rw-r--r-- 1 root root 12 2012-10-27 17:35 15210526 +-rw-r--r-- 1 root root 8 2012-10-27 17:35 15216206 +-rw-r--r-- 1 root root 5 2012-10-27 17:35 15217402 + +Each file contains output like that echoed to the screen. + +While the driver is running in the background, +scan and scale events are also logged to +a file named in the driver start script, posdriver-sph, for example: +/var/run/posdriver-sph/sph.log +You can watch this as it accumulates with: +$ tail -f /var/run/posdriver-sph/sph.log +Reading serial data +S110000 +Received: rePoll +S110000 +03120044618 +Received: goodBeep +S110024 +Received: goodBeep +S141 +S110000 +85794100187 +^C to stop the display. + diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Ingenico_i6550.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Ingenico_i6550.cs new file mode 100644 index 000000000..7c00ba396 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Ingenico_i6550.cs @@ -0,0 +1,941 @@ +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * SPH_Ingenico_i6550 + * SerialPortHandler implementation for the Ingenico + * signature capture devices using Retail Base + * Application (RBA). Tested with i6550, should work + * with i6580, i6770, and i6780 as well. Two other devices, + * i3070 and i6510, speak the same language but minor + * tweaking would need to be done to account for those + * devices not doing signature capture. + * + * Sets up a serial connection in the constructor + * + * Polls for data in Read(), writing responses back to the + * device as needed + * +*************************************************************/ +using System; +using System.IO.Ports; +using System.Threading; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Net; +using System.Net.Sockets; + +using BitmapBPP; + +namespace SPH { + +public class Signature { + private int sig_length; + private byte[][] sig_blocks; + + public Signature(int l){ + sig_length = l; + sig_blocks = new byte[sig_length][]; + } + + public bool WriteBlock(int num, byte[] data){ + if (num >= sig_length) return false; + sig_blocks[num] = data; + return true; + } + + public bool SigFull(){ + for(int i=0; i<sig_length;i++){ + if(sig_blocks[i] == null) + return false; + } + return true; + } + + // helpful example provided @ + // http://combustibleknowledge.com/2009/08/29/3-byte-ascii-format-deciphered/ + public string BuildImage(string path){ + List<Point> points = new List<Point>(); + List<byte> byteList = new List<byte>(); + + for(int i=0;i<sig_length;i++){ + for(int j=0; j<sig_blocks[i].Length;j++){ + //Mask out most significant bit + byte value = (byte)(sig_blocks[i][j] & 0x7f); + byteList.Add(value); + } + } + + byte[] image = byteList.ToArray(); + Point lastPoint = new Point(); + int hiX, hiY; + + for (int i = 0; i < image.Length; i++){ + if (image[i] >= 96 && image[i] <= 111){ + hiX = (image[i] & 0x0C) * 128; + hiY = (image[i] & 0x03) * 512; + + byte n1 = (byte)(image[i + 1] - 32); + byte n2 = (byte)(image[i + 2] - 32); + byte n3 = (byte)(image[i + 3] - 32); + + lastPoint.X = hiX + (n1 * 8) + + (n3 >> 3); + lastPoint.Y = hiY + (n2 * 8) + + (n3 & 0x07); + + points.Add(lastPoint); + i = i + 3; + } + else if (image[i] == 112){ + points.Add(new Point()); + } + else { + if (image[i] != 10 && image[i] != 13){ + int a, b; + Point p = new Point(); + + byte m1 = (byte)(image[i] - 32); + byte m2 = (byte)(image[i + 1] - 32); + byte m3 = (byte)(image[i + 2] - 32); + + a = (m1 * 8) + (m3 >> 3); + b = (m2 * 8) + (m3 & 0x07); + + if (a > 256) + p.X = lastPoint.X + (a - 512); + else + p.X = lastPoint.X + a; + + if (b > 256) + p.Y = lastPoint.Y + (b - 512); + else + p.Y = lastPoint.Y + b; + + lastPoint.X = p.X; + lastPoint.Y = p.Y; + + points.Add(p); + i = i + 2; + } + } + } + + return DrawSignatureImage(points,path); + } + + private string DrawSignatureImage(List<Point> Points,string path){ + int width=2048; + int height=512; + Bitmap bmp = new Bitmap(width, height); + + Graphics g = Graphics.FromImage(bmp); + Brush whiteBrush = new SolidBrush(Color.White); + Brush blackBrush = new SolidBrush(Color.Black); + Pen p = new Pen(blackBrush); + + bmp.SetResolution(height/2, width/2); + g.TranslateTransform(0f, height); + g.ScaleTransform(1f, -1f); + g.FillRegion(whiteBrush, + new Region(new Rectangle(0, 0, width, height))); + + p.Width = 10; + p.StartCap = System.Drawing.Drawing2D.LineCap.Round; + p.EndCap = System.Drawing.Drawing2D.LineCap.Round; + p.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; + + List<Point> line = new List<Point>(); + foreach (Point point in Points){ + if (point.IsEmpty){ + g.DrawLines(p, line.ToArray()); + line.Clear(); + } + else{ + line.Add(point); + } + } + + Image newImage = bmp.GetThumbnailImage(width/5, height/5, null, IntPtr.Zero); + + // silly rigamarole to get a unique file name + System.Security.Cryptography.MD5 hasher = System.Security.Cryptography.MD5.Create(); + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + byte[] hash = hasher.ComputeHash(enc.GetBytes(DateTime.Now.ToString())); + System.Text.StringBuilder sBuilder = new System.Text.StringBuilder(); + for (int i = 0; i < hash.Length; i++) + sBuilder.Append(hash[i].ToString("x2")); + string base_fn = path + "\\" + sBuilder.ToString()+".bmp"; + + newImage.Save(base_fn, System.Drawing.Imaging.ImageFormat.Bmp); + + // pass through 1bpp conversion + byte[] fixbpp = BitmapBPP.BitmapConverter.To1bpp(base_fn); + System.IO.File.WriteAllBytes(base_fn,fixbpp); + + return base_fn; + } + +} + +public class SPH_Ingenico_i6550 : SerialPortHandler { + private const int application_id = 230; + private const int parameter_id = 230; + private const bool VERBOSE = true; + private byte[] last_message; + private string terminal_serial_number; + private string pos_trans_no; + private bool getting_signature; + private Signature sig_object; + private string output_mag; + private string output_sigfile; + + private static String INGENICO_OUTPUT_DIR = "cc-output"; + + public SPH_Ingenico_i6550(string p) : base(p){ + last_message = null; + getting_signature = false; + output_mag = ""; + output_sigfile = ""; + + sp = new SerialPort(); + sp.PortName = this.port; + sp.BaudRate = 19200; + sp.DataBits = 8; + sp.StopBits = StopBits.One; + sp.Parity = Parity.None; + sp.RtsEnable = true; + sp.Handshake = Handshake.None; + sp.ReadTimeout = 500; + + sp.Open(); + + ConfirmedWrite(GetLRC(OfflineMessage())); + ConfirmedWrite(GetLRC(OnlineMessage())); + HandleMsg("reset"); + } + + private void ByteWrite(byte[] b){ + sp.Write(b,0,b.Length); + } + + // Waits for acknowledgement from device & resends + // if necessary. Should probably be used instead + // of ByteWrite for most messages. + private void ConfirmedWrite(byte[] b){ + if (VERBOSE) + System.Console.WriteLine("Tried to write"); + + int count=0; + while(last_message != null && count++ < 5) + Thread.Sleep(10); + last_message = b; + ByteWrite(b); + + if (VERBOSE) + System.Console.WriteLine("wrote"); + } + + // computes check character and appends it + // to the array + private byte[] GetLRC(byte[] b){ + byte[] ret = new byte[b.Length+1]; + ret[0] = b[0]; // STX + byte lrc = 0; + for(int i=1; i < b.Length; i++){ + lrc ^= b[i]; + ret[i] = b[i]; + } + ret[b.Length] = lrc; + + return ret; + } + + // see if array has a valid check character + private bool CheckLRC(byte[] b){ + byte lrc = 0; + for(int i=1; i < b.Length-1; i++) + lrc ^= b[i]; + return (lrc == b[b.Length-1])?true:false; + } + + + // main read loop + override public void Read(){ + ArrayList bytes = new ArrayList(); + while(SPH_Running){ + try { + int b = sp.ReadByte(); + if (b == 0x06){ + // ACK + if (VERBOSE) + System.Console.WriteLine("ACK!"); + last_message = null; + } + else if (b == 0x15){ + // NAK + // re-send + if (VERBOSE) + System.Console.WriteLine("NAK!"); + ByteWrite(last_message); + } + else { + // part of a message + // force to be byte-sized + bytes.Add(b & 0xff); + } + if (bytes.Count > 2 && (int)bytes[bytes.Count-2] == 0x3){ + // end of message, send ACK + ByteWrite(new byte[1]{0x6}); + // convoluted casting required to get + // values out of ArrayList and into + // a byte array + byte[] buffer = new byte[bytes.Count]; + for(int i=0; i<bytes.Count; i++){ + buffer[i] = (byte)((int)bytes[i] & 0xff); + } + // deal with message, clear arraylist for the + // next one + HandleMessage(buffer); + bytes.Clear(); + } + } + catch{} + } + + if (VERBOSE) + System.Console.WriteLine("Crashed?"); + } + + // deal to messages from the device + void HandleMessage(byte[] buffer){ + if (VERBOSE){ + System.Console.WriteLine("Received:"); + foreach(byte b in buffer){ + if (b < 10) + System.Console.Write("0{0} ",b); + else + System.Console.Write("{0} ",b); + } + System.Console.WriteLine(); + + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + System.Console.WriteLine(enc.GetString(buffer)); + + System.Console.WriteLine("LRC "+(CheckLRC(buffer)?"Valid":"Invalid")); + System.Console.WriteLine(); + } + + int code = ((buffer[1]-0x30)*10) + (buffer[2]-0x30); + switch(code){ + case 1: break; // online response from device + case 4: break; // set payment response from device + case 11: // status response from device + int status = ((buffer[4]-0x30)*10) + (buffer[5]-0x30); + if (status == 11){ // signature ready + ConfirmedWrite(GetLRC(GetVariableMessage("000712"))); + } + else if (status == 6){ + ConfirmedWrite(GetLRC(GetVariableMessage("000712"))); + } + else if (status == 10){ + Thread.Sleep(500); + ConfirmedWrite(GetLRC(StatusRequestMessage())); + } + break; + case 29: // get variable response from device + status = buffer[4] - 0x30; + int var_code = 0; + for(int i=0;i<6;i++) + var_code = var_code*10 + (buffer[i+6]-0x30); + if (var_code == 712) + ParseSigLengthMessage(status,buffer); + else if (var_code >= 700 && var_code <= 709) + ParseSigBlockMessage(status,buffer); + break; + case 50: // auth request from device + ParseAuthMessage(buffer); + break; + } + } + + // VALUES: + // * total:xxx => new transaction amount + // * reset => start the transaction over + // * resettotal:xxx => start over but immediately re-total + // (so the cashier doesn't have to do it again) + // * sig => request a signature + // * approval:xxx => pass back approval code + override public void HandleMsg(String msg){ + if (!getting_signature && msg.Length > 6 && msg.Substring(0,6) == "total:"){ + string amount = msg.Substring(6); + for(int i=0; i<amount.Length; i++){ + if ( (int)amount[i] < 0x30 || (int)amount[i] > 0x39 ) + return; // not a number + } + ConfirmedWrite(GetLRC(AmountMessage(amount))); + + if (VERBOSE) + System.Console.WriteLine("Sent amount: "+amount); + } + else if (msg == "reset"){ + last_message = null; + getting_signature = false; + output_mag = ""; + output_sigfile = ""; + ByteWrite(GetLRC(HardResetMessage())); // force, no matter what + ConfirmedWrite(GetLRC(SetPaymentTypeMessage("2"))); + + if (VERBOSE) + System.Console.WriteLine("Sent reset"); + } + else if (!getting_signature && msg.Length > 11 && msg.Substring(0,11) == "resettotal:"){ + ConfirmedWrite(GetLRC(HardResetMessage())); + ConfirmedWrite(GetLRC(SetPaymentTypeMessage("2"))); + output_mag = ""; + output_sigfile = ""; + + if (VERBOSE) + System.Console.WriteLine("Sent reset"); + + string amount = msg.Substring(11); + for(int i=0; i<amount.Length; i++){ + if ( (int)amount[i] < 0x30 || (int)amount[i] > 0x39 ) + return; // not a number + } + ConfirmedWrite(GetLRC(AmountMessage(amount))); + + if (VERBOSE) + System.Console.WriteLine("Sent amount: "+amount); + } + else if (!getting_signature && msg.Length > 9 && msg.Substring(0,9) == "approval:"){ + string approval_code = msg.Substring(9); + ConfirmedWrite(GetLRC(AuthMessage(approval_code))); + getting_signature = true; + last_message = null; + ConfirmedWrite(GetLRC(StatusRequestMessage())); + } + else if (!getting_signature && msg == "sig"){ + ConfirmedWrite(GetLRC(SigRequestMessage())); + getting_signature = true; + last_message = null; + ConfirmedWrite(GetLRC(StatusRequestMessage())); + } + else if (msg == "getmag" && output_mag != ""){ + if (VERBOSE) + System.Console.WriteLine(output_mag); + UdpClient u = new UdpClient("127.0.0.1",9451); + Byte[] sendb = System.Text.Encoding.ASCII.GetBytes(output_mag); + u.Send(sendb, sendb.Length); + } + else if (msg == "getsig" && output_sigfile != ""){ + UdpClient u = new UdpClient("127.0.0.1",9451); + Byte[] sendb = System.Text.Encoding.ASCII.GetBytes(output_sigfile); + u.Send(sendb, sendb.Length); + } + else if (!getting_signature && msg.Length > 8 && msg.Substring(0,8) == "display:"){ + string[] lines = msg.Split(new Char[]{':'}); + if (lines.Length==5){ + if (VERBOSE) + System.Console.WriteLine(lines[1]); + ConfirmedWrite(GetLRC(SetVariableMessage("000112",lines[1]))); + ConfirmedWrite(GetLRC(SetVariableMessage("000113",lines[2]))); + ConfirmedWrite(GetLRC(SetVariableMessage("000114",lines[3]))); + ConfirmedWrite(GetLRC(SetVariableMessage("000104",lines[4]))); + } + } + + if (VERBOSE) + System.Console.WriteLine(msg); + } + + /*********************************************** + * Messages + ***********************************************/ + + private byte[] OnlineMessage(){ + byte[] msg = new byte[13]; + msg[0] = 0x2; // STX + + msg[1] = 0x30; // Online Code + msg[2] = 0x31; + msg[3] = 0x2e; + + /* + msg[4] = (application_id >> 24) & 0xff; + msg[5] = (application_id >> 16) & 0xff; + msg[6] = (application_id >> 8) & 0xff; + msg[7] = application_id & 0xff; + + msg[8] = (parameter_id >> 24) & 0xff; + msg[9] = (parameter_id >> 16) & 0xff; + msg[10] = (parameter_id >> 8) & 0xff; + msg[11] = parameter_id & 0xff; + */ + msg[4] = 0x30; + msg[5] = 0x30; + msg[6] = 0x30; + msg[7] = 0x30; + msg[8] = 0x30; + msg[9] = 0x30; + msg[10] = 0x30; + msg[11] = 0x30; + + msg[12] = 0x3; // ETX + + return msg; + } + + private byte[] OfflineMessage(){ + byte[] msg = new byte[9]; + msg[0] = 0x2; // STX + + msg[1] = 0x30; // Offline Code + msg[2] = 0x30; + msg[3] = 0x2e; + + msg[4] = 0x30; + msg[5] = 0x30; + msg[6] = 0x30; + msg[7] = 0x30; + + msg[8] = 0x3; // ETX + + return msg; + } + + private byte[] HardResetMessage(){ + byte[] msg = new byte[5]; + msg[0] = 0x2; // STX + + msg[1] = 0x31; // Reset Code + msg[2] = 0x30; + msg[3] = 0x2e; + + msg[4] = 0x3; // ETX + + return msg; + } + + private byte[] StatusRequestMessage(){ + byte[] msg = new byte[5]; + msg[0] = 0x2; // STX + + msg[1] = 0x31; // Status Code + msg[2] = 0x31; + msg[3] = 0x2e; + + msg[4] = 0x3; // ETX + + return msg; + } + + // valid ptypes: 1 through 5 -OR- A through P + private byte[] SetPaymentTypeMessage(string ptype){ + byte[] p = new System.Text.ASCIIEncoding().GetBytes(ptype); + byte[] msg = new byte[7]; + msg[0] = 0x2; // STX + + msg[1] = 0x30; // Set Payment Code + msg[2] = 0x34; + msg[3] = 0x2e; + + msg[4] = 0x30; // unconditional force + msg[5] = p[0]; + + msg[6] = 0x3; // ETX + + return msg; + } + + // amount format: 5.99 = 599 (just like POS input) + private byte[] AmountMessage(string amt){ + byte[] a = new System.Text.ASCIIEncoding().GetBytes(amt); + byte[] msg = new byte[4 + a.Length + 1]; + msg[0] = 0x2; // STX + + msg[1] = 0x31; // Amount Code + msg[2] = 0x33; + msg[3] = 0x2e; + + for(int i=0; i < a.Length; i++) + msg[i+4] = a[i]; + + msg[msg.Length-1] = 0x3; // ETX + + return msg; + } + + private byte[] SigRequestMessage(){ + string display = "Please sign"; + byte[] m = new System.Text.ASCIIEncoding().GetBytes(display); + byte[] msg = new byte[4 + m.Length + 1]; + + msg[0] = 0x2; // STX + + msg[1] = 0x32; // Sig Request Code + msg[2] = 0x30; + msg[3] = 0x2e; + + for(int i=0; i < m.Length; i++) + msg[i+4] = m[i]; + + msg[msg.Length-1] = 0x3; // ETX + + return msg; + } + + // var_code should be length 6 + private byte[] GetVariableMessage(string var_code){ + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + + byte[] msg = new byte[13]; + + msg[0] = 0x2; // STX + msg[1] = 0x32; // get var code + msg[2] = 0x39; + msg[3] = 0x2e; + + msg[4] = 0x31; // documentation says this should be ASII 00, + msg[5] = 0x30; // but example says it should be ASII 10 + + byte[] tmp = enc.GetBytes(var_code); + for(int i=0; i<tmp.Length;i++) + msg[i+6] = tmp[i]; + + msg[12] = 0x3; // ETX + + if (VERBOSE) + System.Console.WriteLine("Sent: "+enc.GetString(msg)); + + return msg; + } + + // again var_code should have length 6 + private byte[] SetVariableMessage(string var_code, string var_value){ + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + + byte[] valbytes = enc.GetBytes(var_value); + byte[] msg = new byte[12 + valbytes.Length + 1]; + + msg[0] = 0x2; // STX + msg[1] = 0x32; // set var code + msg[2] = 0x38; + msg[3] = 0x2e; + + msg[4] = 0x39; // no response + msg[5] = 0x31; // constant + + byte[] tmp = enc.GetBytes(var_code); + for(int i=0; i<tmp.Length;i++) + msg[i+6] = tmp[i]; + + for(int i=0; i<valbytes.Length;i++) + msg[i+12] = valbytes[i]; + + msg[msg.Length-1] = 0x3; //ETX + + if (VERBOSE) + System.Console.WriteLine("Sent: "+enc.GetString(msg)); + + return msg; + } + + private byte[] AuthMessage(string approval_code){ + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + string display_message = "Thank You!"; + + byte[] msg = new byte[31 + display_message.Length + 2]; + + msg[0] = 0x2; // STX + msg[1] = 0x35; // Auth Code + msg[2] = 0x30; + msg[3] = 0x2e; + + byte[] tmp = enc.GetBytes(terminal_serial_number); + for(int i=0; i<8; i++) + msg[i+4] = tmp[i]; + + msg[12] = 0x0; + + tmp = enc.GetBytes(pos_trans_no); + for(int i=0; i<4; i++) + msg[i+13] = tmp[i]; + + if(approval_code == "denied"){ + msg[17] = 0x45; + msg[18] = 0x3f; + } + else{ + msg[17] = 0x41; + msg[18] = 0x3f; + } + + tmp = enc.GetBytes(approval_code); + for(int i=0;i<6;i++) + msg[i+19] = tmp[i]; + + string today = String.Format("(0:yyMMdd)",DateTime.Today); + tmp = enc.GetBytes(today); + for(int i=0;i<4;i++) + msg[i+25] = tmp[i]; + + tmp = enc.GetBytes(display_message); + for(int i=0;i<tmp.Length;i++) + msg[i+31] = tmp[i]; + + msg[msg.Length-2] = 0x1c; // ASCII FS delimiter + + msg[msg.Length-1] = 0x3; // ETX + + return msg; + } + + // write DFS configuration values + private byte[] ConfigWriteMessage(string group_num, string index_num, string val){ + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + byte[] gb = enc.GetBytes(group_num); + byte[] ib = enc.GetBytes(index_num); + byte[] vb = enc.GetBytes(val); + + byte[] msg = new byte[4 + gb.Length + ib.Length + vb.Length + 2]; + + msg[0] = 0x2; // STX + msg[1] = 0x30; // Write Code + msg[2] = 0x30; + msg[3] = 0x2e; + + int pos = 4; + + // write group + for(int i=0; i<gb.Length; i++) + msg[pos++] = gb[i]; + + msg[pos++] = 0x1d; // ASII GS delimiter + + // write index + for(int i=0; i<ib.Length; i++) + msg[pos++] = ib[i]; + + // write value + msg[pos++] = 0x1d; // ASII GS delimiter + + for(int i=0; i<vb.Length; i++) + msg[pos++] = vb[i]; + + msg[msg.Length-2] = 0x1c; // ASCII FS delimiter + + msg[msg.Length-1] = 0x3; // ETX + return msg; + } + + private void ParseSigLengthMessage(int status, byte[] msg){ + if (status == 2){ + int num_blocks = 0; + int pos = 12; + while(msg[pos] != 0x3){ + num_blocks = (num_blocks*10) + (msg[pos]-0x30); + pos++; + } + if (num_blocks == 0){ + // should never happen, but just in case... + ConfirmedWrite(GetLRC(StatusRequestMessage())); + } + else { + sig_object = new Signature(num_blocks); + ConfirmedWrite(GetLRC(GetVariableMessage("000700"))); + } + } + else { + // didn't get data; re-request + ConfirmedWrite(GetLRC(GetVariableMessage("000712"))); + } + } + + private void ParseSigBlockMessage(int status, byte[] msg){ + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + + if (status == 2){ + byte[] var_data = new byte[msg.Length-14]; + for(int i=0;i<var_data.Length;i++){ + var_data[i] = msg[i+12]; + } + sig_object.WriteBlock(msg[11]-0x30,var_data); + msg[11]++; // move to next sig block + } + + if(sig_object.SigFull()){ + // signature capture complete + string sigfile=""; + try{ + char sep = System.IO.Path.DirectorySeparatorChar; + sigfile = sig_object.BuildImage(INGENICO_OUTPUT_DIR+sep+"sig"); + }catch(Exception e){ + if (VERBOSE) + System.Console.WriteLine(e); + } + getting_signature = false; + PushOutput(sigfile); + ConfirmedWrite(GetLRC(HardResetMessage())); + } + else { + // get the next sig block or re-request the + // current one + string var_num = enc.GetString(new byte[6] + {msg[6],msg[7],msg[8],msg[9],msg[10],msg[11]}); + ConfirmedWrite(GetLRC(GetVariableMessage(var_num))); + } + } + + private void ParseAuthMessage(byte[] msg){ + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + + // skipping 0 (stx), 1-3 (message #) + + string aquirer = enc.GetString(new byte[6]{msg[4],msg[5],msg[6],msg[7],msg[8],msg[9]}); + + string merch_id = enc.GetString(new byte[12]{msg[10],msg[11],msg[12],msg[13], + msg[14],msg[15],msg[16],msg[17], + msg[18],msg[19],msg[20],msg[21]}); + + string store_id = enc.GetString(new byte[4]{msg[22],msg[23],msg[24],msg[25]}); + + string pinpad_id = enc.GetString(new byte[4]{msg[26],msg[27],msg[28],msg[29]}); + + string std_ind_class = enc.GetString(new byte[4]{msg[30],msg[31],msg[32],msg[33]}); + + string country = enc.GetString(new byte[3]{msg[34],msg[35],msg[36]}); + + string zipcode = enc.GetString(new byte[5]{msg[37],msg[38],msg[39],msg[40],msg[41]}); + + string timezone = enc.GetString(new byte[3]{msg[42],msg[43],msg[44]}); + + string trans_code = enc.GetString(new byte[2]{msg[45],msg[46]}); + + terminal_serial_number = enc.GetString(new byte[8]{msg[47],msg[48],msg[49],msg[50], + msg[51],msg[52],msg[53],msg[54]}); + + // skipping 55 (constant 0) + + pos_trans_no = enc.GetString(new byte[4]{msg[56],msg[57],msg[58],msg[59]}); + + // skipping 60 (constant @) + + int data_source = (int)msg[61]; + + // variable length from here on, fields termed by 0x1c + + int pos = 62; + while(msg[pos] != 0x1c) pos++; + byte[] stripe_bytes = new byte[pos-62]; + Array.Copy(msg,62,stripe_bytes,0,pos-62); + string stripe = enc.GetString(stripe_bytes); + + pos++; // sitting at the 0x1c; + + // read PIN info + int pin_start = pos; + while(msg[pos] != 0x1c) pos++; + byte[] pin_bytes = new byte[pos-pin_start]; + Array.Copy(msg,pin_start,pin_bytes,0,pos-pin_start); + string pin_enc_block = ""; + string pin_ksi = ""; + string pin_device_id = ""; + string pin_enc_counter = ""; + // M/S or DUKPT + if (pin_bytes.Length == 23 || pin_bytes.Length == 43){ + byte[] block = new byte[16]; + Array.Copy(pin_bytes,7,block,0,16); + pin_enc_block = enc.GetString(block); + } + // only DUKPT + if (pin_bytes.Length == 43){ + byte[] ksi = new byte[6]; + Array.Copy(pin_bytes,27,ksi,0,6); + pin_ksi = enc.GetString(ksi); + + byte[] did = new byte[5]; + Array.Copy(pin_bytes,33,did,0,5); + pin_device_id = enc.GetString(did); + + byte[] ec = new byte[5]; + Array.Copy(pin_bytes,38,ec,0,5); + pin_enc_counter = enc.GetString(ec); + } + + pos++; // should be at next 0x1c; + + int amount = 0; + while(msg[pos] != 0x1c){ + amount = (amount*10) + ((int)msg[pos] - 0x30); + pos++; + } + + if (data_source == 0x48 || data_source == 0x58){ + // track 1 + stripe = "%"+stripe+"?"; + } + else if (data_source == 0x44 || data_source == 0x54){ + // track 2 + stripe = ";"+stripe+"?"; + } + stripe = "T"+amount+"?"+stripe; + if (pin_bytes.Length == 23){ + stripe += "PM"+pin_enc_block+"?"; + } + else if (pin_bytes.Length == 43){ + stripe += "PD"+pin_enc_block; + stripe += ((char)0x1e)+pin_ksi; + stripe += ((char)0x1e)+pin_device_id; + stripe += ((char)0x1e)+pin_enc_counter; + stripe += "?"; + } + + PushOutput(stripe); + + if (VERBOSE) + System.Console.WriteLine(stripe); + stripe = null; + } + + private void PushOutput(string s){ + if (s.Contains("?")) output_mag = s; + else output_sigfile = s; + /* + int ticks = Environment.TickCount; + char sep = System.IO.Path.DirectorySeparatorChar; + while(File.Exists(INGENICO_OUTPUT_DIR+sep+ticks)) + ticks++; + + TextWriter sw = new StreamWriter(INGENICO_OUTPUT_DIR+sep+"tmp"+sep+ticks); + sw = TextWriter.Synchronized(sw); + sw.WriteLine(s); + sw.Close(); + File.Move(INGENICO_OUTPUT_DIR+sep+"tmp"+sep+ticks, + INGENICO_OUTPUT_DIR+sep+ticks); + */ + } +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs new file mode 100644 index 000000000..599b9b631 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs @@ -0,0 +1,217 @@ +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * SPH_Magellan_Scale + * SerialPortHandler implementation for the magellan scale + * + * Sets up a serial connection in the constructor + * + * Polls for data in Read(), writing responses back to the + * scale as needed and pushing data into the correct + * WebBrowser frame + * + * Sends beep requests to the scale in PageLoaded(Uri) as + * determined by frame #1 +*************************************************************/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 27Oct2012 Eric Lee Added Code 39 handling to ParseData() + +*/ + +using System; +using System.IO; +using System.IO.Ports; +using System.Threading; + +namespace SPH { + +public class SPH_Magellan_Scale : SerialPortHandler { + private bool got_weight; +private static String MAGELLAN_OUTPUT_DIR = "ss-output/"; + + public SPH_Magellan_Scale(string p) : base(p){ + sp = new SerialPort(); + sp.PortName = this.port; + sp.BaudRate = 9600; + sp.DataBits = 7; + sp.StopBits = StopBits.One; + sp.Parity = Parity.Odd; + sp.RtsEnable = true; + sp.Handshake = Handshake.None; + sp.ReadTimeout = 500; + + got_weight = false; + + sp.Open(); + } + + override public void HandleMsg(string msg){ + if (msg == "errorBeep"){ + Beeps(3); + } + else if (msg == "beepTwice"){ + Beeps(2); + } + else if (msg == "goodBeep"){ + Beeps(1); + } + else if (msg == "twoPairs"){ + Thread.Sleep(300); + Beeps(2); + Thread.Sleep(300); + Beeps(2); + } + else if (msg == "rePoll"){ + got_weight = false; + sp.Write("S14\r"); + } + } + + private void Beeps(int num){ + int count = 0; + while(count < num){ + sp.Write("S334\r"); + Thread.Sleep(150); + count++; + } + } + + override public void Read(){ + string buffer = ""; + if (this.verbose_mode > 0) + System.Console.WriteLine("Reading serial data"); + sp.Write("S14\r"); + while(SPH_Running){ + try { + int b = sp.ReadByte(); + if (b == 13){ + if (this.verbose_mode > 0) + System.Console.WriteLine("RECV FROM SCALE: "+buffer); + buffer = this.ParseData(buffer); + if (buffer != null){ + if (this.verbose_mode > 0) + System.Console.WriteLine("PASS TO POS: "+buffer); + this.PushOutput(buffer); + } + buffer = ""; + } + else{ + buffer += ((char)b).ToString(); + } + + } + catch{} + } + } + + private void PushOutput(string s){ + /* trying to maintain thread safety between + * two apps in different languages.... + * + * 1. Create a new file for each bit of output + * 2. Give each file a unique name (i.e., don't + * overwrite earlier output) + * 3. Generate files in a temporary directory, then + * move the finished files to the output directory + * (i.e., so they aren't read too early) + */ + int ticks = Environment.TickCount; + char sep = System.IO.Path.DirectorySeparatorChar; + while(File.Exists(MAGELLAN_OUTPUT_DIR+sep+ticks)) + ticks++; + + TextWriter sw = new StreamWriter(MAGELLAN_OUTPUT_DIR+sep+"tmp"+sep+ticks); + sw = TextWriter.Synchronized(sw); + sw.WriteLine(s); + sw.Close(); + File.Move(MAGELLAN_OUTPUT_DIR+sep+"tmp"+sep+ticks, + MAGELLAN_OUTPUT_DIR+sep+ticks); + } + + private string ParseData(string s){ + if (s.Substring(0,3) == "S11") + sp.Write("S14\r"); + else if(s.Substring(0,4) == "S141"){ + sp.Write("S14\r"); + if(got_weight){ + got_weight = false; + return "S141"; + } + } + else if(s.Substring(0,4) == "S142"){ + sp.Write("S11\r"); + return "S142"; + } + else if(s.Substring(0,4) == "S143"){ + sp.Write("S11\r"); + got_weight = false; + return "S110000"; + } + else if(s.Substring(0,4) == "S144"){ + sp.Write("S14\r"); + if (!got_weight){ + got_weight = true; + return "S11"+s.Substring(4); + } + } + else if(s.Substring(0,4) == "S145"){ + sp.Write("S11\r"); + return "S145"; + } + else if (s.Substring(0,3) == "S14"){ + sp.Write("S11\r"); + return s; + } + else if (s.Substring(0,4) == "S08A" || + s.Substring(0,4) == "S08F") + return s.Substring(4); + else if (s.Substring(0,4) == "S08E") + return this.ExpandUPCE(s.Substring(4)); + else if (s.Substring(0,4) == "S08R") + return "GS1~"+s.Substring(3); + else if (s.Substring(0,5) == "S08B1") + return s.Substring(5); + else + return s; + + return null; + } + + private string ExpandUPCE(string upc){ + string lead = upc.Substring(0,upc.Length-1); + string tail = upc.Substring(upc.Length-1); + + if (tail == "0" || tail == "1" || tail == "2") + return lead.Substring(0,3)+tail+"0000"+lead.Substring(3); + else if (tail == "3") + return lead.Substring(0,4)+"00000"+lead.Substring(4); + else if (tail == "4") + return lead.Substring(0,5)+"00000"+lead.Substring(5); + else + return lead+"0000"+tail; + } +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_SignAndPay_USB.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_SignAndPay_USB.cs new file mode 100755 index 000000000..9ea030780 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SPH_SignAndPay_USB.cs @@ -0,0 +1,1585 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * SerialPortHandler + * Abstract class to manage a serial port in a separate + * thread. Allows top-level app to interact with multiple, + * different serial devices through one class interface. + * + * Provides Stop() and SetParent(DelegateBrowserForm) functions. + * + * Subclasses must implement Read() and PageLoaded(Uri). + * Read() is the main polling loop, if reading serial data is + * required. PageLoaded(Uri) is called on every WebBrowser + * load event and provides the Url that was just loaded. + * +*************************************************************/ +using System; +using System.IO; +using System.IO.Ports; +using System.Threading; +using CustomForms; + +using USBLayer; + +namespace SPH { + +public class SPH_SignAndPay_USB : SerialPortHandler { + + private static String MAGELLAN_OUTPUT_DIR = "ss-output/"; + + private USBWrapper usb_port; + private bool read_continues; + private byte[] long_buffer; + private int long_length; + private int long_pos; + private FileStream usb_fs; + private int usb_report_size; + + private const int LCD_X_RES = 320; + private const int LCD_Y_RES = 240; + + private const int STATE_START_TRANSACTION = 1; + private const int STATE_SELECT_CARD_TYPE = 2; + private const int STATE_ENTER_PIN = 3; + private const int STATE_WAIT_FOR_CASHIER = 4; + private const int STATE_SELECT_EBT_TYPE = 5; + private const int STATE_SELECT_CASHBACK = 6; + private const int STATE_MANUAL_PAN = 11; + private const int STATE_MANUAL_EXP = 12; + private const int STATE_MANUAL_CVV = 13; + + private const int BUTTON_CREDIT = 5; + private const int BUTTON_DEBIT = 6; + private const int BUTTON_EBT = 7; + private const int BUTTON_GIFT = 8; + private const int BUTTON_EBT_FOOD = 9; + private const int BUTTON_EBT_CASH = 10; + private const int BUTTON_000 = 0; + private const int BUTTON_500 = 5; + private const int BUTTON_1000 = 10; + private const int BUTTON_2000 = 20; + private const int BUTTON_3000 = 30; + private const int BUTTON_4000 = 40; + private const int BUTTON_HARDWARE_BUTTON = 0xff; + + private const int DEFAULT_WAIT_TIMEOUT = 1000; + + private int current_state; + private int ack_counter; + + private string usb_devicefile; + private System.Object usb_lock; + + public SPH_SignAndPay_USB(string p) : base(p){ + read_continues = false; + long_length = 0; + long_pos = 0; + ack_counter = 0; + usb_fs = null; + usb_lock = new System.Object(); + + #if MONO + usb_devicefile = p; + #else + int vid = 0xacd; + int pid = 0x2310; + usb_devicefile = string.Format("{0}&{1}",vid,pid); + #endif + } + + private void GetHandle(){ + usb_fs = null; + #if MONO + usb_port = new USBWrapper_Posix(); + usb_report_size = 64; + #else + usb_port = new USBWrapper_Win32(); + usb_report_size = 65; + #endif + while(usb_fs == null){ + usb_fs = usb_port.GetUSBHandle(usb_devicefile,usb_report_size); + if (usb_fs == null){ + if (this.verbose_mode > 0) + System.Console.WriteLine("No device"); + System.Threading.Thread.Sleep(5000); + } + else { + if (this.verbose_mode > 0) + System.Console.WriteLine("USB device found"); + } + + } + + } + + public override void Read(){ + GetHandle(); + SendReport(BuildCommand(LcdSetBacklightTimeout(0))); + SendReport(BuildCommand(EnableAudio())); + SetStateStart(); + #if MONO + MonoRead(); + #else + ReRead(); + #endif + } + + private void RebootTerminal(){ + try { + SendReport(BuildCommand(ResetDevice())); + } + catch (Exception ex){ + if (this.verbose_mode > 0){ + System.Console.WriteLine("Reboot error:"); + System.Console.WriteLine(ex); + } + } + try { + usb_fs.Dispose(); + } + catch (Exception ex){ + if (this.verbose_mode > 0){ + System.Console.WriteLine("Dispose error:"); + System.Console.WriteLine(ex); + } + } + try { + usb_port.CloseUSBHandle(); + } + catch (Exception ex){ + if (this.verbose_mode > 0){ + System.Console.WriteLine("Dispose error:"); + System.Console.WriteLine(ex); + } + } + System.Threading.Thread.Sleep(DEFAULT_WAIT_TIMEOUT); + GetHandle(); + SetStateStart(); + #if MONO + //MonoRead(); + #else + ReRead(); + #endif + } + + private void SetStateStart(){ + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(PinpadCancelGetPIN())); + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdTextFont(3,12,14))); + SendReport(BuildCommand(LcdTextColor(0,0,0))); + SendReport(BuildCommand(LcdTextBackgroundColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdTextBackgroundMode(false))); + SendReport(BuildCommand(LcdDrawText("Swipe Card",75,100))); + + current_state = STATE_START_TRANSACTION; + } + + private void SetStateReStart(){ + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(PinpadCancelGetPIN())); + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdTextFont(3,12,14))); + SendReport(BuildCommand(LcdTextColor(0,0,0))); + SendReport(BuildCommand(LcdTextBackgroundColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdTextBackgroundMode(false))); + SendReport(BuildCommand(LcdDrawText("Swipe Card Again",55,100))); + + current_state = STATE_START_TRANSACTION; + } + + private void SetStateCardType(){ + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(LcdClearSignature())); + SendReport(BuildCommand(LcdSetClipArea(0,0,1,1))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_CREDIT,"Credit",5,5,95,95))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_DEBIT,"Debit",224,5,314,95))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_EBT,"EBT",5,144,95,234))); + //SendReport(BuildCommand(LcdCreateButton(BUTTON_GIFT,"Gift",224,144,314,234))); + SendReport(BuildCommand(LcdStartCapture(4))); + + current_state = STATE_SELECT_CARD_TYPE; + } + + private void SetStateEbtType(){ + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(LcdClearSignature())); + SendReport(BuildCommand(LcdSetClipArea(0,0,1,1))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_EBT_FOOD,"Food Side",5,5,115,95))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_EBT_CASH,"Cash Side",204,5,314,95))); + SendReport(BuildCommand(LcdStartCapture(4))); + + current_state = STATE_SELECT_EBT_TYPE; + } + + private void SetStateCashBack(){ + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(LcdClearSignature())); + SendReport(BuildCommand(LcdSetClipArea(0,0,1,1))); + SendReport(BuildCommand(LcdTextFont(3,12,14))); + SendReport(BuildCommand(LcdDrawText("Select Cash Back",60,5))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_000,"None",5,40,95,130))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_500,"5.00",113,40,208,130))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_1000,"10.00",224,40,314,130))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_2000,"20.00",5,144,95,234))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_3000,"30.00",113,144,208,234))); + SendReport(BuildCommand(LcdCreateButton(BUTTON_4000,"40.00",224,144,314,234))); + SendReport(BuildCommand(LcdStartCapture(4))); + + current_state = STATE_SELECT_CASHBACK; + } + + private void SetStateGetPin(){ + SendReport(BuildCommand(LcdStopCapture())); + ack_counter = 0; + + SendReport(BuildCommand(PinpadGetPIN())); + current_state = STATE_ENTER_PIN; + } + + private void SetStateWaitForCashier(){ + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdTextFont(3,12,14))); + SendReport(BuildCommand(LcdTextColor(0,0,0))); + SendReport(BuildCommand(LcdTextBackgroundColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdTextBackgroundMode(false))); + SendReport(BuildCommand(LcdDrawText("wait for cashier",75,100))); + + current_state = STATE_WAIT_FOR_CASHIER; + } + + private void SetStateApproved(){ + SendReport(BuildCommand(LcdStopCapture())); + SendReport(BuildCommand(LcdFillColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdFillRectangle(0,0,LCD_X_RES-1,LCD_Y_RES-1))); + + SendReport(BuildCommand(LcdTextFont(3,12,14))); + SendReport(BuildCommand(LcdTextColor(0,0,0))); + SendReport(BuildCommand(LcdTextBackgroundColor(0xff,0xff,0xff))); + SendReport(BuildCommand(LcdTextBackgroundMode(false))); + SendReport(BuildCommand(LcdDrawText("approved",75,100))); + } + + private void SetStateGetManualPan(){ + SendReport(BuildCommand(LcdStopCapture())); + ack_counter = 0; + SendReport(BuildCommand(ManualEntryPAN())); + current_state = STATE_MANUAL_PAN; + } + + private void SetStateGetManualExp(){ + ack_counter = 0; + SendReport(BuildCommand(ManualEntryExp())); + current_state = STATE_MANUAL_EXP; + } + + private void SetStateGetManualCVV(){ + ack_counter = 0; + SendReport(BuildCommand(ManualEntryCVV())); + current_state = STATE_MANUAL_CVV; + } + + private void HandleReadData(byte[] input){ + int msg_sum = 0; + if (usb_report_size == 64){ + byte[] temp_in = new byte[65]; + temp_in[0] = 0; + for (int i=0; i < input.Length; i++){ + temp_in[i+1] = input[i]; + msg_sum += input[i]; + } + input = temp_in; + } + + /* Data received, as bytes + */ + if (this.verbose_mode > 1){ + System.Console.WriteLine(""); + System.Console.WriteLine("IN BYTES:"); + for(int i=0;i<input.Length;i++){ + if (i>0 && i %16==0) System.Console.WriteLine(""); + System.Console.Write("{0:x} ",input[i]); + } + System.Console.WriteLine(""); + System.Console.WriteLine(""); + } + + int report_length = input[1] & (0x80-1); + /* + * Bit 7 turned on means a multi-report message + */ + if ( (input[1] & 0x80) != 0){ + read_continues = true; + } + + byte[] data = null; + if (report_length > 3 && (long_pos > 0 || input[2] == 0x02)){ // protcol messages + int data_length = input[3] + (input[4] << 8); + + int d_start = 5; + if (input[d_start] == 0x6 && data_length > 1){ + d_start++; // ACK byte + data_length--; + } + + /* + * New multi-report message; init class members + */ + if (read_continues && long_length == 0){ + long_length = data_length; + long_pos = 0; + long_buffer = new byte[data_length]; + if (data_length > report_length) + data_length = report_length-3; + } + else if (read_continues){ + // subsequent messages start immediately after + // report ID & length fields + d_start = 2; + } + + if (data_length > report_length) data_length = report_length; + + data = new byte[data_length]; + for (int i=0; i<data_length && i+d_start<report_length+2;i++) + data[i] = input[i+d_start]; + + /** + * Append data from multi-report messages to the + * class member byte buffer + */ + if (read_continues){ + // last message will contain checksum bytes and + // End Tx byte, so don't copy entire data array + int d_len = ((input[1]&0x80)!=0) ? data.Length : data.Length-3; + for(int i=0;i<d_len;i++){ + long_buffer[long_pos++] = data[i]; + } + } + + if (this.verbose_mode > 1){ + System.Console.Write("Received: "); + foreach(byte b in data) + System.Console.Write((char)b); + System.Console.WriteLine(""); + } + } + else if (report_length > 3){ // non-protcol messages + data = new byte[report_length]; + for(int i=0; i<report_length && i+2<input.Length; i++){ + data[i] = input[i+2]; + } + } + + if ( (input[1] & 0x80) == 0){ + if (long_buffer != null){ + if (this.verbose_mode > 0){ + System.Console.Write("Big Msg: "); + foreach(byte b in long_buffer) + System.Console.Write((char)b); + System.Console.WriteLine(""); + } + + HandleDeviceMessage(long_buffer); + } + else { + HandleDeviceMessage(data); + } + read_continues = false; + long_length = 0; + long_pos = 0; + long_buffer = null; + } + } + + /** + Proper async version. Call ReRead at the end to + start another async read. + */ + private void ReadCallback(IAsyncResult iar){ + byte[] input = (byte[])iar.AsyncState; + try { + usb_fs.EndRead(iar); + HandleReadData(input); + } + catch (Exception ex){ + if (this.verbose_mode > 0) + System.Console.WriteLine(ex); + } + + ReRead(); + } + + /** + Synchronous version. Do not automatically start + another read. The calling method will handle that. + + The wait on excpetion is important. Exceptions + are generally the result of a write that occurs + during a blocking read. Waiting a second lets any + subsequent writes complete without more blocking. + */ + private void MonoReadCallback(IAsyncResult iar){ + byte[] input = (byte[])iar.AsyncState; + usb_fs.EndRead(iar); + HandleReadData(input); + /* Revision: 7May13 - use locks instead + try { + usb_fs.EndRead(iar); + HandleReadData(input); + } + catch (Exception ex){ + if (this.verbose_mode > 0) + System.Console.WriteLine(ex); + System.Threading.Thread.Sleep(DEFAULT_WAIT_TIMEOUT); + } + */ + } + + private void HandleDeviceMessage(byte[] msg){ + if (this.verbose_mode > 0) + System.Console.Write("DMSG: {0}: ",current_state); + + //if (msg == null) return; + + if (this.verbose_mode > 0){ + foreach(byte b in msg) + System.Console.Write("{0:x} ",b); + System.Console.WriteLine(); + } + switch(current_state){ + case STATE_SELECT_CARD_TYPE: + if (msg.Length == 4 && msg[0] == 0x7a){ + SendReport(BuildCommand(DoBeep())); + if (msg[1] == BUTTON_CREDIT){ + PushOutput("TERM:Credit"); + SetStateWaitForCashier(); + } + else if (msg[1] == BUTTON_DEBIT){ + PushOutput("TERM:Debit"); + SetStateCashBack(); + } + else if (msg[1] == BUTTON_EBT){ + SetStateEbtType(); + } + else if (msg[1] == BUTTON_GIFT){ + PushOutput("TERM:Gift"); + SetStateWaitForCashier(); + } + else if (msg[1] == BUTTON_HARDWARE_BUTTON && msg[3] == 0x43){ + SetStateStart(); + } + } + break; + case STATE_SELECT_EBT_TYPE: + if (msg.Length == 4 && msg[0] == 0x7a){ + SendReport(BuildCommand(DoBeep())); + if (msg[1] == BUTTON_EBT_FOOD){ + PushOutput("TERM:EbtFood"); + SetStateGetPin(); + } + else if (msg[1] == BUTTON_EBT_CASH){ + PushOutput("TERM:EbtCash"); + SetStateCashBack(); + } + else if (msg[1] == BUTTON_HARDWARE_BUTTON && msg[3] == 0x43){ + SetStateStart(); + } + } + break; + case STATE_SELECT_CASHBACK: + if (msg.Length == 4 && msg[0] == 0x7a){ + SendReport(BuildCommand(DoBeep())); + if (msg[1] == BUTTON_HARDWARE_BUTTON && msg[3] == 0x43){ + SetStateStart(); + } + else if(msg[1] != 0x6){ + // 0x6 might be a serial protocol ACK + // timing issue means we got here too soon + // and should wait for next input + + // Pressed green or yellow button + // Proceed to PIN entry but don't + // request 0xFF as cash back + if (msg[1] != BUTTON_HARDWARE_BUTTON) + PushOutput("TERMCB:"+msg[1]); + SetStateGetPin(); + } + } + break; + case STATE_ENTER_PIN: + if (msg.Length == 3 && msg[0] == 0x15){ + SetStateStart(); + } + else if (msg.Length == 36){ + string pinhex = ""; + foreach(byte b in msg) + pinhex += ((char)b); + PushOutput("PINCACHE:"+pinhex); + SetStateWaitForCashier(); + } + break; + case STATE_MANUAL_PAN: + if (msg.Length == 1 && msg[0] == 0x6){ + ack_counter++; + if (this.verbose_mode > 0) + System.Console.WriteLine(ack_counter); + if (ack_counter == 1) + SetStateGetManualExp(); + } + else if (msg.Length == 3 && msg[0] == 0x15){ + SetStateStart(); + } + break; + case STATE_MANUAL_EXP: + if (msg.Length == 1 && msg[0] == 0x6){ + ack_counter++; + if (this.verbose_mode > 0) + System.Console.WriteLine(ack_counter); + if (ack_counter == 2) + SetStateGetManualCVV(); + } + else if (msg.Length == 3 && msg[0] == 0x15){ + SetStateStart(); + } + break; + case STATE_MANUAL_CVV: + if (msg.Length > 63 && msg[0] == 0x80){ + string block = FixupCardBlock(msg); + PushOutput("PANCACHE:"+block); + SetStateCardType(); + } + + else if (msg.Length == 3 && msg[0] == 0x15){ + SetStateStart(); + } + break; + case STATE_START_TRANSACTION: + if (msg.Length > 63 && msg[0] == 0x80 ){ + SendReport(BuildCommand(DoBeep())); + string block = FixupCardBlock(msg); + if (block.Length == 0){ + SetStateReStart(); + } + else { + PushOutput("PANCACHE:"+block); + SetStateCardType(); + } + } + else if (msg.Length > 1){ + if (this.verbose_mode > 0) + System.Console.WriteLine(msg.Length+" "+msg[0]+" "+msg[1]); + } + break; + default: + break; + } + } + + /** + * Convert encrypted card block to a hex string + * and add the serial protcol controcl characters back + * to the beginning and end. PHP-side software expects + * this format + */ + private string FixupCardBlock(byte[] data){ + // no track 2 means bad read + if (data.Length < 3 || data[3] == 0) return ""; + string hex = BitConverter.ToString(data).Replace("-",""); + hex = "02E600"+hex+"XXXX03"; + if (hex.Length < 24) return ""; + // something went wrong with the KSN/key + if(hex.Substring(hex.Length-16,10) == "0000000000") return ""; + if (this.verbose_mode > 0) + System.Console.WriteLine(hex); + return hex; + } + + private void ReRead(){ + byte[] buf = new byte[usb_report_size]; + try { + usb_fs.BeginRead(buf, 0, usb_report_size, new AsyncCallback(ReadCallback), buf); + } + catch(Exception ex){ + if (this.verbose_mode > 0){ + System.Console.WriteLine("Read exception:"); + System.Console.WriteLine(ex); + } + } + } + + /** + Mono doesn't support asynchronous reads correctly. + BeginRead will block. Using ReRead with Mono will + eventually make the stack blow up as ReRead and + ReadCallback calls build up one after the other. + */ + private void MonoRead(){ + while(SPH_Running){ + byte[] buf = new byte[usb_report_size]; + try { + usb_fs.BeginRead(buf, 0, usb_report_size, new AsyncCallback(MonoReadCallback), buf); + } + catch(Exception ex){ + if (this.verbose_mode > 0){ + System.Console.WriteLine("Read exception:"); + System.Console.WriteLine(ex); + } + // 7May13 use locks + // wait until writes are complete + lock(usb_lock){} + } + } + } + + public override void HandleMsg(string msg){ + // 7May13 use locks + switch(msg){ + case "termReset": + lock(usb_lock){ + SetStateStart(); + } + break; + case "termReboot": + lock(usb_lock){ + RebootTerminal(); + } + break; + case "termManual": + lock(usb_lock){ + SetStateGetManualPan(); + } + break; + case "termApproved": + lock(usb_lock){ + SetStateApproved(); + } + break; + } + } + + /** + * Wrap command in proper leading and ending bytes + */ + private byte[] BuildCommand(byte[] data){ + int size = data.Length + 6; + if (data.Length > 0x8000) size++; + + byte[] cmd = new byte[size]; + + int pos = 0; + cmd[pos] = 0x2; + pos++; + + if (data.Length > 0x8000){ + cmd[pos] = (byte)(data.Length & 0xff); + pos++; + cmd[pos] = (byte)((data.Length >> 8) & 0xff); + pos++; + cmd[pos] = (byte)((data.Length >> 16) & 0xff); + pos++; + } + else { + cmd[pos] = (byte)(data.Length & 0xff); + pos++; + cmd[pos] = (byte)((data.Length >> 8) & 0xff); + pos++; + } + + for (int i=0; i < data.Length; i++){ + cmd[pos+i] = data[i]; + } + pos += data.Length; + + cmd[pos] = LrcXor(data); + pos++; + + cmd[pos] = LrcSum(data); + pos++; + + cmd[pos] = 0x3; + + return cmd; + } + + /** + * LRC type 1: sum of data bytes + */ + private byte LrcSum(byte[] data){ + int lrc = 0; + foreach(byte b in data) + lrc = (lrc + b) & 0xff; + return (byte)lrc; + } + + /** + * LRC type 2: xor of data bytes + */ + private byte LrcXor(byte[] data){ + byte lrc = 0; + foreach(byte b in data) + lrc = (byte)(lrc ^ b); + return lrc; + } + + /** + * Write to device in formatted reports + */ + private void SendReport(byte[] data){ + if (this.verbose_mode > 0){ + System.Console.WriteLine("Full Report "+data.Length); + for(int j=0;j<data.Length;j++){ + if (j % 16 == 0 && j > 0) + System.Console.WriteLine(""); + System.Console.Write("{0:x} ",data[j]); + } + System.Console.WriteLine(""); + System.Console.WriteLine(""); + } + + byte[] report = new byte[usb_report_size]; + int size_field = (usb_report_size == 65) ? 1 : 0; + + for(int j=0;j<usb_report_size;j++) report[j] = 0; + int size=0; + + for (int i=0;i<data.Length;i++){ + if (i > 0 && i % 63 == 0){ + report[size_field] = 63 | 0x80; + + if (this.verbose_mode > 1){ + for(int j=0;j<usb_report_size;j++){ + if (j % 16 == 0 && j > 0) + System.Console.WriteLine(""); + System.Console.Write("{0:x} ", report[j]); + } + System.Console.WriteLine(""); + System.Console.WriteLine(""); + } + + usb_fs.Write(report,0,usb_report_size); + System.Threading.Thread.Sleep(100); + + for(int j=0;j<usb_report_size;j++) report[j] = 0; + size=0; + } + report[(i%63)+size_field+1] = data[i]; + size++; + } + + report[size_field] = (byte)size; + + if (this.verbose_mode > 1){ + for(int i=0;i<usb_report_size;i++){ + if (i % 16 == 0 && i > 0) + System.Console.WriteLine(""); + System.Console.Write("{0:x} ", report[i]); + } + System.Console.WriteLine(""); + System.Console.WriteLine(""); + } + + usb_fs.Write(report,0,usb_report_size); + System.Threading.Thread.Sleep(100); + } + + private void PushOutput(string s){ + int ticks = Environment.TickCount; + char sep = System.IO.Path.DirectorySeparatorChar; + while(File.Exists(MAGELLAN_OUTPUT_DIR+sep+ticks)) + ticks++; + + TextWriter sw = new StreamWriter(MAGELLAN_OUTPUT_DIR+sep+"tmp"+sep+ticks); + sw = TextWriter.Synchronized(sw); + sw.WriteLine(s); + sw.Close(); + File.Move(MAGELLAN_OUTPUT_DIR+sep+"tmp"+sep+ticks, + MAGELLAN_OUTPUT_DIR+sep+ticks); + } + + /** + * Device Command Functions + */ + + private byte[] LcdTextFont(int charset, int width, int height){ + byte[] ret = new byte[9]; + + // command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x40; + + ret[3] = (byte)(0xff & height); + ret[4] = (byte)(0xff & width); + ret[5] = 0x0; // bold + ret[6] = 0x0; // italic + ret[7] = 0x0; // underlined + ret[8] = (charset > 6) ? (byte)6 : (byte)charset; + + return ret; + } + + private byte[] LcdTextColor(int red, int green, int blue){ + byte[] ret = new byte[6]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x41; + + ret[3] = (byte)(red & 0xff); + ret[4] = (byte)(green & 0xff); + ret[5] = (byte)(blue & 0xff); + + return ret; + } + + private byte[] LcdTextBackgroundColor(int red, int green, int blue){ + byte[] ret = new byte[6]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x42; + + ret[3] = (byte)(red & 0xff); + ret[4] = (byte)(green & 0xff); + ret[5] = (byte)(blue & 0xff); + + return ret; + } + + private byte[] LcdTextBackgroundMode(bool is_transparent){ + byte[] ret = new byte[4]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x43; + + ret[3] = (is_transparent) ? (byte)1 : (byte)0; + + return ret; + } + + private byte[] LcdDrawText(string text, int x, int y){ + byte[] ret = new byte[9 + text.Length]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x4f; + + ret[3] = (byte)(x & 0xff); + ret[4] = (byte)( (x >> 8) & 0xff); + + ret[5] = (byte)(y & 0xff); + ret[6] = (byte)( (y >> 8) & 0xff); + + ret[7] = (byte)(text.Length & 0xff); + ret[8] = (byte)( (text.Length >> 8) & 0xff); + + int pos = 9; + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(text)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] LcdDrawTextInRectangle(string text, int x_top_left, int y_top_left, + int x_bottom_right, int y_bottom_right){ + + byte[] ret = new byte[13 + text.Length]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x4e; + + ret[3] = (byte)(x_top_left & 0xff); + ret[4] = (byte)( (x_top_left >> 8) & 0xff); + + ret[5] = (byte)(y_top_left & 0xff); + ret[6] = (byte)( (y_top_left >> 8) & 0xff); + + ret[7] = (byte)(x_bottom_right & 0xff); + ret[8] = (byte)( (x_bottom_right >> 8) & 0xff); + + ret[9] = (byte)(y_bottom_right & 0xff); + ret[10] = (byte)( (y_bottom_right >> 8) & 0xff); + + ret[11] = (byte)(text.Length & 0xff); + ret[12] = (byte)( (text.Length >> 8) & 0xff); + + int pos = 13; + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(text)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] LcdFillColor(int red, int green, int blue){ + byte[] ret = new byte[6]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x20; + + ret[3] = (byte)(0xff & red); + ret[4] = (byte)(0xff & green); + ret[5] = (byte)(0xff & blue); + + return ret; + } + + private byte[] LcdFillRectangle(int x_top_left, int y_top_left, + int x_bottom_right, int y_bottom_right){ + byte[] ret = new byte[11]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x46; + ret[2] = 0x22; + + ret[3] = (byte)(x_top_left & 0xff); + ret[4] = (byte)( (x_top_left >> 8) & 0xff); + + ret[5] = (byte)(y_top_left & 0xff); + ret[6] = (byte)( (y_top_left >> 8) & 0xff); + + ret[7] = (byte)(x_bottom_right & 0xff); + ret[8] = (byte)( (x_bottom_right >> 8) & 0xff); + + ret[9] = (byte)(y_bottom_right & 0xff); + ret[10] = (byte)( (y_bottom_right >> 8) & 0xff); + + return ret; + } + + /** + * @param interval is five second periods. + * 1=> 5 seconds, 2=> 10 seconds, etc + * 0=> always on + */ + private byte[] LcdSetBacklightTimeout(int interval){ + byte[] ret = new byte[5]; + + // Command head + ret[0] = 0x8a; + ret[1] = 0x53; + ret[2] = 0x80; + + ret[3] = 0x1; + ret[4] = (byte)(interval & 0xff); + + return ret; + } + + private byte[] LcdSetClipArea(int x_top_left, int y_top_left, int x_bottom_right, int y_bottom_right){ + byte[] ret = new byte[15]; + + // Command head + ret[0] = 0x7a; + ret[1] = 0x46; + ret[2] = 0x03; + + ret[3] = (byte)(x_top_left & 0xff); + ret[4] = (byte)( (x_top_left >> 8) & 0xff); + + ret[5] = (byte)(y_top_left & 0xff); + ret[6] = (byte)( (y_top_left >> 8) & 0xff); + + ret[7] = (byte)(x_bottom_right & 0xff); + ret[8] = (byte)( (x_bottom_right >> 8) & 0xff); + + ret[9] = (byte)(y_bottom_right & 0xff); + ret[10] = (byte)( (y_bottom_right >> 8) & 0xff); + + ret[11] = 0x0; // don't show lines around area + + // rgb for border lines + ret[12] = 0x0; + ret[13] = 0x0; + ret[14] = 0x0; + + return ret; + } + + private byte[] LcdCreateButton(int id, string label, int x_top_left, int y_top_left, + int x_bottom_right, int y_bottom_right){ + + byte[] ret = new byte[16 + label.Length]; + + // Command head + ret[0] = 0x7a; + ret[1] = 0x46; + ret[2] = 0x04; + + ret[3] = (byte)(id & 0xff); + ret[4] = 0x1; // button is type 1 + ret[5] = 0xf; + + ret[6] = (byte)(x_top_left & 0xff); + ret[7] = (byte)( (x_top_left >> 8) & 0xff); + + ret[8] = (byte)(y_top_left & 0xff); + ret[9] = (byte)( (y_top_left >> 8) & 0xff); + + ret[10] = (byte)(x_bottom_right & 0xff); + ret[11] = (byte)( (x_bottom_right >> 8) & 0xff); + + ret[12] = (byte)(y_bottom_right & 0xff); + ret[13] = (byte)( (y_bottom_right >> 8) & 0xff); + + ret[14] = (byte)(label.Length & 0xff); + ret[15] = (byte)( (label.Length >> 8) & 0xff); + + int pos = 16; + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(label)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] LcdCalibrateTouch(){ + return new byte[3]{ 0x7a, 0x46, 0x1 }; + } + + /** + * Mode 5 => buffered + * Mode < 5 => streaming data + */ + private byte[] LcdStartCapture(int mode){ + byte[] ret = new byte[11]; + + ret[0] = 0x7a; + ret[1] = 0x46; + ret[2] = 0x10; + + ret[3] = (byte)(0xff & mode); + + ret[4] = 0x7a; + + ret[5] = 0x0; + ret[6] = 0x0; + ret[7] = 0x0; + + ret[8] = 0xff; + ret[9] = 0xff; + ret[10] = 0xff; + + return ret; + } + + private byte[] LcdClearSignature(){ + return new byte[3]{ 0x7a, 0x46, 0x19 }; + } + + private byte[] LcdStopCapture(){ + return new byte[3]{ 0x7a, 0x46, 0x1f }; + } + + private byte[] PinpadGetPIN(){ + byte[] ret = new byte[112]; + int pos = 0; + + // Command head + ret[pos++] = 0x75; + ret[pos++] = 0x46; + ret[pos++] = 0x07; + + ret[pos++] = 0x31; // key type DUKPT + ret[pos++] = 0xc; // max pin length + ret[pos++] = 0x4; // min pin length + ret[pos++] = 0x0; // no account # + ret[pos++] = 0x3; // clear display, show messages + + // background color + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xcc; + + // font setting + ret[pos++] = 0x16; + ret[pos++] = 0x18; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 5; + + // color for something + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + + ret[pos++] = 0x1; // transparent + + // text color + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // xy set 1 + ret[pos++] = 0x20; + ret[pos++] = 0; + ret[pos++] = 0x60; + ret[pos++] = 0; + + // xy set 2 + ret[pos++] = 0x10; + ret[pos++] = 0x1; + ret[pos++] = 0x90; + ret[pos++] = 0; + + ret[pos++] = 0xf; // show 4 lines + ret[pos++] = 2; // 2 messages follow + ret[pos++] = 0; + ret[pos++] = 0x1f; // message length + ret[pos++] = 0; + + // another font + ret[pos++] = 0x10; + ret[pos++] = 0x10; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x3; + + // text rgb + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0xff; + + ret[pos++] = 0x1; // transparent + + // background rgb + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // text xy + ret[pos++] = 0x40; + ret[pos++] = 0x0; + ret[pos++] = 0x20; + ret[pos++] = 0x0; + + // text length + ret[pos++] = 0xa; + ret[pos++] = 0; + + string msg = "Enter PIN:"; + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(msg)){ + ret[pos] = b; + pos++; + } + + // next message length + ret[pos++] = 0x2e; + ret[pos++] = 0x0; + + // another font + ret[pos++] = 0xc; + ret[pos++] = 0xc; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x3; + + // another rgb + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0xff; + + ret[pos++] = 1; // transparent + + // background rgb + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // xy + ret[pos++] = 0x6; + ret[pos++] = 0x0; + ret[pos++] = 0xb4; + ret[pos++] = 0x0; + + // text length + ret[pos++] = 0x19; + ret[pos++] = 0x0; + + msg = "Press Enter Key When Done"; + + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(msg)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] PinpadCancelGetPIN(){ + return new byte[3]{ 0x75, 0x46, 0x9 }; + } + + private byte[] ManualEntryPAN(){ + byte[] ret = new byte[68]; + + int pos = 0; + ret[pos++] = 0x75; + ret[pos++] = 0x46; + ret[pos++] = 0x40; + + ret[pos++] = 0x0; // card type + ret[pos++] = 0x1; // PAN mode + ret[pos++] = 23; // max length + ret[pos++] = 6; // min length + ret[pos++] = 0x3; // redraw screen + + // rgb background + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // font setting + ret[pos++] = 0x16; + ret[pos++] = 0x18; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 5; + + // color for something + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + + ret[pos++] = 0x1; // transparent + + // text color + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // xy set 1 + ret[pos++] = 0x20; + ret[pos++] = 0; + ret[pos++] = 0x60; + ret[pos++] = 0; + + // xy set 2 + ret[pos++] = 0x10; + ret[pos++] = 0x1; + ret[pos++] = 0x90; + ret[pos++] = 0; + + ret[pos++] = 0xf; // show 4 lines + ret[pos++] = 1; // 1 messages follow + ret[pos++] = 0; + ret[pos++] = 33; + ret[pos++] = 0; + + // another font + ret[pos++] = 0x10; + ret[pos++] = 0x10; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x3; + + // text rgb + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0xff; + + ret[pos++] = 0x1; // transparent + + // background rgb + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // text xy + ret[pos++] = 0x40; + ret[pos++] = 0x0; + ret[pos++] = 0x20; + ret[pos++] = 0x0; + + string msg = "Enter Card #"; + ret[pos++] = 12; + ret[pos++] = 0; + + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(msg)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] ManualEntryExp(){ + byte[] ret = new byte[70]; + + int pos = 0; + ret[pos++] = 0x75; + ret[pos++] = 0x46; + ret[pos++] = 0x40; + + ret[pos++] = 0x0; // card type + ret[pos++] = 0x2; // exp mode + ret[pos++] = 4; // max length + ret[pos++] = 4; // min length + ret[pos++] = 0x3; // redraw screen + + // rgb background + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // font setting + ret[pos++] = 0x16; + ret[pos++] = 0x18; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 5; + + // color for something + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + + ret[pos++] = 0x1; // transparent + + // text color + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // xy set 1 + ret[pos++] = 0x20; + ret[pos++] = 0; + ret[pos++] = 0x60; + ret[pos++] = 0; + + // xy set 2 + ret[pos++] = 0x10; + ret[pos++] = 0x1; + ret[pos++] = 0x90; + ret[pos++] = 0; + + ret[pos++] = 0xf; // show 4 lines + ret[pos++] = 1; // 1 messages follow + ret[pos++] = 0; + ret[pos++] = 35; + ret[pos++] = 0; + + // another font + ret[pos++] = 0x10; + ret[pos++] = 0x10; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x3; + + // text rgb + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0xff; + + ret[pos++] = 0x1; // transparent + + // background rgb + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // text xy + ret[pos++] = 0x40; + ret[pos++] = 0x0; + ret[pos++] = 0x20; + ret[pos++] = 0x0; + + string msg = "Enter Exp MMYY"; + ret[pos++] = 14; + ret[pos++] = 0; + + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(msg)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] ManualEntryCVV(){ + byte[] ret = new byte[75]; + + int pos = 0; + ret[pos++] = 0x75; + ret[pos++] = 0x46; + ret[pos++] = 0x40; + + ret[pos++] = 0x0; // card type + ret[pos++] = 0x3; // CVV mode + ret[pos++] = 4; // max length + ret[pos++] = 3; // min length + ret[pos++] = 0x3; // redraw screen + + // rgb background + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // font setting + ret[pos++] = 0x16; + ret[pos++] = 0x18; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 5; + + // color for something + ret[pos++] = 0; + ret[pos++] = 0; + ret[pos++] = 0; + + ret[pos++] = 0x1; // transparent + + // text color + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // xy set 1 + ret[pos++] = 0x20; + ret[pos++] = 0; + ret[pos++] = 0x60; + ret[pos++] = 0; + + // xy set 2 + ret[pos++] = 0x10; + ret[pos++] = 0x1; + ret[pos++] = 0x90; + ret[pos++] = 0; + + ret[pos++] = 0xf; // show 4 lines + ret[pos++] = 1; // 1 messages follow + ret[pos++] = 0; + ret[pos++] = 40; + ret[pos++] = 0; + + // another font + ret[pos++] = 0x10; + ret[pos++] = 0x10; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0x3; + + // text rgb + ret[pos++] = 0x0; + ret[pos++] = 0x0; + ret[pos++] = 0xff; + + ret[pos++] = 0x1; // transparent + + // background rgb + ret[pos++] = 0xff; + ret[pos++] = 0xff; + ret[pos++] = 0xff; + + // text xy + ret[pos++] = 0x40; + ret[pos++] = 0x0; + ret[pos++] = 0x20; + ret[pos++] = 0x0; + + string msg = "Enter Security Code"; + ret[pos++] = 19; + ret[pos++] = 0; + + foreach(byte b in System.Text.Encoding.ASCII.GetBytes(msg)){ + ret[pos] = b; + pos++; + } + + return ret; + } + + private byte[] ResetDevice(){ + return new byte[7]{0x78, 0x46, 0x0a, 0x49, 0x52, 0x46, 0x57}; + } + + private byte[] EnableAudio(){ + return new byte[4]{0x7b, 0x46, 0x1, 0x1}; + } + + private byte[] DoBeep(){ + return new byte[7]{0x7b, 0x46, 0x02, 0xff, 0x0, 0xff, 0}; + } + + /* + private byte[] GetAmount(){ + byte[] ret = new byte[]; + int pos = 0; + + // command head + ret[pos++] = 0x75; + ret[pos++] = 0x46; + ret[pos++] = 0x23; + + // min length + ret[pos++] = 1; + // max length + ret[pos++] = 2; + + // serious manual translation breakdown occurs here + } + */ +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SerialPortHandler.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SerialPortHandler.cs new file mode 100644 index 000000000..a5c68dc47 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/SerialPortHandler.cs @@ -0,0 +1,73 @@ +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * SerialPortHandler + * Abstract class to manage a serial port in a separate + * thread. Allows top-level app to interact with multiple, + * different serial devices through one class interface. + * + * Provides Stop() and SetParent(DelegateBrowserForm) functions. + * + * Subclasses must implement Read() and PageLoaded(Uri). + * Read() is the main polling loop, if reading serial data is + * required. PageLoaded(Uri) is called on every WebBrowser + * load event and provides the Url that was just loaded. + * +*************************************************************/ +using System; +using System.IO.Ports; +using System.Threading; +using CustomForms; + +namespace SPH { + +public class SerialPortHandler { + public Thread SPH_Thread; + protected bool SPH_Running; + protected SerialPort sp; + protected CustomForms.DelegateForm parent; + protected string port; + protected int verbose_mode; + + public SerialPortHandler(string p){ + this.SPH_Thread = new Thread(new ThreadStart(this.Read)); + this.SPH_Running = true; + this.port = p; + this.verbose_mode = 0; + } + + public void SetParent(DelegateForm p){ parent = p; } + public void SetVerbose(int v){ verbose_mode = v; } + + public virtual void Read(){ } + public virtual void HandleMsg(string msg){ } + + public void Stop(){ + SPH_Running = false; + SPH_Thread.Join(); + System.Console.WriteLine("SPH Stopped"); + } + +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/UDPMsgBox.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/UDPMsgBox.cs new file mode 100644 index 000000000..0137a4ad4 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/UDPMsgBox.cs @@ -0,0 +1,97 @@ +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************************* + * SerialPortHandler + * Abstract class to manage a serial port in a separate + * thread. Allows top-level app to interact with multiple, + * different serial devices through one class interface. + * + * Provides Stop() and SetParent(DelegateBrowserForm) functions. + * + * Subclasses must implement Read() and PageLoaded(Uri). + * Read() is the main polling loop, if reading serial data is + * required. PageLoaded(Uri) is called on every WebBrowser + * load event and provides the Url that was just loaded. + * +*************************************************************/ +using System; +using System.Threading; +using System.Net; +using System.Net.Sockets; +using CustomForms; + +namespace CustomUDP { + +public class UdpState{ + public IPEndPoint e ; + public UdpClient u ; +} + + +public class UDPMsgBox { + public Thread My_Thread; + protected bool running; + protected DelegateForm parent; + protected int port; + protected UdpClient u; + + + public UDPMsgBox(int p){ + this.My_Thread = new Thread(new ThreadStart(this.Read)); + this.running = true; + this.port = p; + } + + public void SetParent(DelegateForm p){ parent = p; } + + public void Read(){ + IPEndPoint e = new IPEndPoint(IPAddress.Any, 0); + u = new UdpClient(this.port); + + while(running){ + try { + Byte[] b = u.Receive(ref e); + this.SendBytes(b); + } + catch (Exception ex){ + System.Console.WriteLine(ex.ToString()); + } + } + } + + private void SendBytes(Byte[] receiveBytes){ + string receiveString = System.Text.Encoding.ASCII.GetString(receiveBytes); + + Console.WriteLine("Received: "+ receiveString); + parent.MsgRecv(receiveString); + } + + public void Stop(){ + running = false; + u.Close(); + My_Thread.Join(); + } + +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USB-Posix.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USB-Posix.cs new file mode 100755 index 000000000..bf0507ac1 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USB-Posix.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; + +namespace USBLayer { + +public class USBWrapper_Posix : USBWrapper { + + /** + * Get a handle for USB device file + * @param filename the name of the file OR vendor and device ids formatted as "vid&pid" + * @param report_size [optional] report size in bytes + * @return open read/write FileStream + */ + public override FileStream GetUSBHandle(string filename, int report_size){ + if (!File.Exists(filename)) return null; + return new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, report_size, FileOptions.Asynchronous); + } + + public override void CloseUSBHandle(){ } + +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USB-Win32.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USB-Win32.cs new file mode 100755 index 000000000..3f413d112 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USB-Win32.cs @@ -0,0 +1,185 @@ +using System; +using System.Text; +using System.IO; +using System.Runtime.InteropServices; + +namespace USBLayer { + +public class USBWrapper_Win32 : USBWrapper { + [StructLayout(LayoutKind.Sequential, Pack = 1)] + protected struct Overlapped { + public uint Internal; + public uint InternalHigh; + public uint Offset; + public uint OffsetHigh; + public IntPtr Event; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + protected struct DeviceInterfaceData { + public int Size; + public Guid InterfaceClassGuid; + public int Flags; + public IntPtr Reserved; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + protected struct HidCaps { + public short Usage; + public short UsagePage; + public short InputReportByteLength; + public short OutputReportByteLength; + public short FeatureReportByteLength; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] + public short[] Reserved; + public short NumberLinkCollectionNodes; + public short NumberInputButtonCaps; + public short NumberInputValueCaps; + public short NumberInputDataIndices; + public short NumberOutputButtonCaps; + public short NumberOutputValueCaps; + public short NumberOutputDataIndices; + public short NumberFeatureButtonCaps; + public short NumberFeatureValueCaps; + public short NumberFeatureDataIndices; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct DeviceInterfaceDetailData { + public int Size; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] + public string DevicePath; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] + public class DeviceBroadcastInterface { + public int Size; + public int DeviceType; + public int Reserved; + public Guid ClassGuid; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] + public string Name; + } + + public const int WM_DEVICECHANGE = 0x0219; + public const int DEVICE_ARRIVAL = 0x8000; + public const int DEVICE_REMOVECOMPLETE = 0x8004; + protected const int DIGCF_PRESENT = 0x02; + protected const int DIGCF_DEVICEINTERFACE = 0x10; + protected const int DEVTYP_DEVICEINTERFACE = 0x05; + protected const int DEVICE_NOTIFY_WINDOW_HANDLE = 0; + protected const uint PURGE_TXABORT = 0x01; + protected const uint PURGE_RXABORT = 0x02; + protected const uint PURGE_TXCLEAR = 0x04; + protected const uint PURGE_RXCLEAR = 0x08; + protected const uint GENERIC_READ = 0x80000000; + protected const uint GENERIC_WRITE = 0x40000000; + protected const uint FILE_FLAG_OVERLAPPED = 0x40000000; + protected const uint OPEN_EXISTING = 3; + protected const uint ERROR_IO_PENDING = 997; + protected const uint INFINITE = 0xFFFFFFFF; + public static IntPtr NullHandle = IntPtr.Zero; + protected static IntPtr InvalidHandleValue = new IntPtr(-1); + + private IntPtr native_handle; + + [DllImport("hid.dll", SetLastError = true)] protected static extern void HidD_GetHidGuid(out Guid gHid); + [DllImport("setupapi.dll", SetLastError = true)] protected static extern IntPtr SetupDiGetClassDevs(ref Guid gClass, [MarshalAs(UnmanagedType.LPStr)] string strEnumerator, IntPtr hParent, uint nFlags); + [DllImport("setupapi.dll", SetLastError = true)] protected static extern int SetupDiDestroyDeviceInfoList(IntPtr lpInfoSet); + [DllImport("setupapi.dll", SetLastError = true)] protected static extern bool SetupDiEnumDeviceInterfaces(IntPtr lpDeviceInfoSet, uint nDeviceInfoData, ref Guid gClass, uint nIndex, ref DeviceInterfaceData oInterfaceData); + [DllImport("setupapi.dll", SetLastError = true)] protected static extern bool SetupDiGetDeviceInterfaceDetail(IntPtr lpDeviceInfoSet, ref DeviceInterfaceData oInterfaceData, IntPtr lpDeviceInterfaceDetailData, uint nDeviceInterfaceDetailDataSize, ref uint nRequiredSize, IntPtr lpDeviceInfoData); + [DllImport("setupapi.dll", SetLastError = true)] protected static extern bool SetupDiGetDeviceInterfaceDetail(IntPtr lpDeviceInfoSet, ref DeviceInterfaceData oInterfaceData, ref DeviceInterfaceDetailData oDetailData, uint nDeviceInterfaceDetailDataSize, ref uint nRequiredSize, IntPtr lpDeviceInfoData); + [DllImport("user32.dll", SetLastError = true)] protected static extern IntPtr RegisterDeviceNotification(IntPtr hwnd, DeviceBroadcastInterface oInterface, uint nFlags); + [DllImport("user32.dll", SetLastError = true)] protected static extern bool UnregisterDeviceNotification(IntPtr hHandle); + [DllImport("hid.dll", SetLastError = true)] protected static extern bool HidD_GetPreparsedData(IntPtr hFile, out IntPtr lpData); + [DllImport("hid.dll", SetLastError = true)] protected static extern bool HidD_FreePreparsedData(ref IntPtr pData); + [DllImport("hid.dll", SetLastError = true)] protected static extern int HidP_GetCaps(IntPtr lpData, out HidCaps oCaps); + [DllImport("kernel32.dll", SetLastError = true)] protected static extern IntPtr CreateFile([MarshalAs(UnmanagedType.LPStr)] string strName, uint nAccess, uint nShareMode, IntPtr lpSecurity, uint nCreationFlags, uint nAttributes, IntPtr lpTemplate); + [DllImport("kernel32.dll", SetLastError = true)] protected static extern int CloseHandle(IntPtr hFile); + + /** + * Get a handle for USB device file + * @param filename the name of the file OR vendor and device ids formatted as "vid&pid" + * @param report_size [optional] report size in bytes + * @return open read/write FileStream + */ + public override FileStream GetUSBHandle(string filename, int report_size){ + if (filename.IndexOf("&") > 0){ + String[] parts = filename.Split(new Char[]{'&'}); + if (parts.Length != 2){ + System.Console.WriteLine(filename); + return null; + } + try { + filename = GetDeviceFilename(Convert.ToInt32(parts[0]),Convert.ToInt32(parts[1])); + } + catch(Exception ex){ + System.Console.WriteLine(ex.ToString()); + return null; + } + } + native_handle = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero); + if (native_handle != InvalidHandleValue){ + IntPtr lpData; + if (HidD_GetPreparsedData(native_handle, out lpData)){ + HidCaps oCaps; + HidP_GetCaps(lpData, out oCaps); // extract the device capabilities from the internal buffer + int inp = oCaps.InputReportByteLength; // get the input... + int outp = oCaps.OutputReportByteLength; // ... and output report length + HidD_FreePreparsedData(ref lpData); + System.Console.WriteLine("Input: {0}, Output: {1}",inp, outp); + } + return new FileStream(native_handle, FileAccess.Read | FileAccess.Write, true, report_size, true); + } + return null; + } + + public override void CloseUSBHandle(){ + try { + CloseHandle(native_handle); + } + catch(Exception ex){} + } + + private String GetDeviceFilename(int vid, int pid){ + string devname = string.Format("vid_{0:x4}&pid_{1:x4}", vid, pid); + string filename = null; + + Guid gHid; + HidD_GetHidGuid(out gHid); + + IntPtr hInfoSet = SetupDiGetClassDevs(ref gHid, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); + + DeviceInterfaceData oInterface = new DeviceInterfaceData(); + oInterface.Size = Marshal.SizeOf(oInterface); + int nIndex = 0; + while (SetupDiEnumDeviceInterfaces(hInfoSet, 0, ref gHid, (uint)nIndex, ref oInterface)) { + string strDevicePath = GetDevicePath(hInfoSet, ref oInterface); + System.Console.WriteLine(strDevicePath); + if (strDevicePath.IndexOf(devname) >= 0){ + filename = strDevicePath; + break; + } + nIndex++; + } + + SetupDiDestroyDeviceInfoList(hInfoSet); + + return filename; + } + + private static string GetDevicePath(IntPtr hInfoSet, ref DeviceInterfaceData oInterface){ + uint nRequiredSize = 0; + if (!SetupDiGetDeviceInterfaceDetail(hInfoSet, ref oInterface, IntPtr.Zero, 0, ref nRequiredSize, IntPtr.Zero)) { + DeviceInterfaceDetailData oDetail = new DeviceInterfaceDetailData(); + oDetail.Size = (IntPtr.Size==8) ? 8 : 5; + if (SetupDiGetDeviceInterfaceDetail(hInfoSet, ref oInterface, ref oDetail, nRequiredSize, ref nRequiredSize, IntPtr.Zero)){ + return oDetail.DevicePath; + } + } + return null; + } + +} // end class + +} // end namespace diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USBLayer.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USBLayer.cs new file mode 100755 index 000000000..76c111660 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/USBLayer.cs @@ -0,0 +1,21 @@ +using System.IO; + +namespace USBLayer { + +public class USBWrapper { + + /** + * Get a handle for USB device file + * @param filename the name of the file OR vendor and device ids formatted as "vid&pid" + * @param report_size [optional] report size in bytes + * @return open read/write FileStream + */ + public virtual FileStream GetUSBHandle(string filename, int report_size){ + return null; + } + + public virtual void CloseUSBHandle(){ } + +} + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/cc-output/sig/366cf5467083fc65b60af45fbcd0a414.bmp b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/cc-output/sig/366cf5467083fc65b60af45fbcd0a414.bmp new file mode 100644 index 000000000..a7767cd72 Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/cc-output/sig/366cf5467083fc65b60af45fbcd0a414.bmp differ diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/logo.bmp b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/logo.bmp new file mode 100644 index 000000000..a980a7a2d Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/logo.bmp differ diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/make.bat b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/make.bat new file mode 100644 index 000000000..ef0ec55f7 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/make.bat @@ -0,0 +1,8 @@ +csc /target:library /out:DelegateForm.dll DelegateBrowserForm.cs DelegateForm.cs +csc /target:library /out:Bitmap.dll BitmapConverter.cs +csc /target:library /out:USBLayer.dll USBLayer.cs USB-Win32.cs +csc /target:library /r:DelegateForm.dll /out:UDPMsgBox.dll UDPMsgBox.cs +csc /target:library /r:DelegateForm.dll /r:Bitmap.dll /r:USBLayer.dll /out:SPH.dll SerialPortHandler.cs SPH_Magellan_Scale.cs SPH_Ingenico_i6550.cs SPH_SignAndPay_USB.cs +csc /target:exe /r:DelegateForm.dll /r:UDPMsgBox.dll /r:SPH.dll /out:pos.exe Magellan.cs +csc /target:library /r:DelegateForm.dll /r:UDPMsgBox.dll /r:SPH.dll /out:Magellan.dll Magellan.cs +csc /target:exe /r:DelegateForm.dll /r:UDPMsgBox.dll /r:SPH.dll /r:Magellan.dll /out:posSVC.exe MagellanWinSVC.cs diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/newer pos.bat b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/newer pos.bat new file mode 100755 index 000000000..2872a9af7 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/newer pos.bat @@ -0,0 +1,4 @@ +cd "C:\is4c-nf\scale-drivers\drivers\NewMagellan\" +start pos.exe + +start firefox.exe \ No newline at end of file diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/out.bmp b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/out.bmp new file mode 100644 index 000000000..aa5957d08 Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/out.bmp differ diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/ports.conf b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/ports.conf new file mode 100644 index 000000000..229dd2e47 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/ports.conf @@ -0,0 +1,18 @@ +# port configuration file +# +# Format: +# <name of port> <name of handler class> +# + + +# typical linux config, scale +#/dev/ttyS0 SPH_Magellan_Scale + +# typical linux config, USB IDtech +#/dev/hidraw0 SPH_SignAndPay_USB + +# typical windows config, scale +#COM1 SPH_Magellan_Scale + +# typical windows config, USB IDtech +#USB SPH_SignAndPay_USB diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posSVC.InstallState b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posSVC.InstallState new file mode 100644 index 000000000..8c4849187 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posSVC.InstallState @@ -0,0 +1,97 @@ +<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> +<SOAP-ENV:Body> +<a1:Hashtable id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<LoadFactor>0.72</LoadFactor> +<Version>2</Version> +<Comparer xsi:null="1"/> +<HashCodeProvider xsi:null="1"/> +<HashSize>11</HashSize> +<Keys href="#ref-2"/> +<Values href="#ref-3"/> +</a1:Hashtable> +<SOAP-ENC:Array id="ref-2" SOAP-ENC:arrayType="xsd:anyType[2]"> +<item id="ref-4" xsi:type="SOAP-ENC:string">_reserved_nestedSavedStates</item> +<item id="ref-5" xsi:type="SOAP-ENC:string">_reserved_lastInstallerAttempted</item> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-3" SOAP-ENC:arrayType="xsd:anyType[2]"> +<item href="#ref-6"/> +<item xsi:type="xsd:int">0</item> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-6" SOAP-ENC:arrayType="a1:IDictionary[1]" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<item href="#ref-7"/> +</SOAP-ENC:Array> +<a1:Hashtable id="ref-7" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<LoadFactor>0.72</LoadFactor> +<Version>5</Version> +<Comparer xsi:null="1"/> +<HashCodeProvider xsi:null="1"/> +<HashSize>11</HashSize> +<Keys href="#ref-8"/> +<Values href="#ref-9"/> +</a1:Hashtable> +<SOAP-ENC:Array id="ref-8" SOAP-ENC:arrayType="xsd:anyType[5]"> +<item href="#ref-4"/> +<item href="#ref-5"/> +<item id="ref-10" xsi:type="SOAP-ENC:string">Username</item> +<item id="ref-11" xsi:type="SOAP-ENC:string">Account</item> +<item id="ref-12" xsi:type="SOAP-ENC:string">hadServiceLogonRight</item> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-9" SOAP-ENC:arrayType="xsd:anyType[5]"> +<item href="#ref-13"/> +<item xsi:type="xsd:int">0</item> +<item id="ref-14" xsi:type="SOAP-ENC:string">POS5\sqlexec</item> +<item xsi:type="a3:ServiceAccount" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/System.ServiceProcess/System.ServiceProcess%2C%20Version%3D2.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Db03f5f7f11d50a3a">User</item> +<item xsi:type="xsd:boolean">false</item> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-13" SOAP-ENC:arrayType="a1:IDictionary[1]" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<item href="#ref-16"/> +</SOAP-ENC:Array> +<a1:Hashtable id="ref-16" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<LoadFactor>0.72</LoadFactor> +<Version>3</Version> +<Comparer xsi:null="1"/> +<HashCodeProvider xsi:null="1"/> +<HashSize>11</HashSize> +<Keys href="#ref-17"/> +<Values href="#ref-18"/> +</a1:Hashtable> +<SOAP-ENC:Array id="ref-17" SOAP-ENC:arrayType="xsd:anyType[3]"> +<item href="#ref-4"/> +<item id="ref-19" xsi:type="SOAP-ENC:string">installed</item> +<item href="#ref-5"/> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-18" SOAP-ENC:arrayType="xsd:anyType[3]"> +<item href="#ref-20"/> +<item xsi:type="xsd:boolean">true</item> +<item xsi:type="xsd:int">0</item> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-20" SOAP-ENC:arrayType="a1:IDictionary[1]" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<item href="#ref-21"/> +</SOAP-ENC:Array> +<a1:Hashtable id="ref-21" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +<LoadFactor>0.72</LoadFactor> +<Version>5</Version> +<Comparer xsi:null="1"/> +<HashCodeProvider xsi:null="1"/> +<HashSize>11</HashSize> +<Keys href="#ref-22"/> +<Values href="#ref-23"/> +</a1:Hashtable> +<SOAP-ENC:Array id="ref-22" SOAP-ENC:arrayType="xsd:anyType[5]"> +<item id="ref-24" xsi:type="SOAP-ENC:string">logExists</item> +<item href="#ref-4"/> +<item id="ref-25" xsi:type="SOAP-ENC:string">alreadyRegistered</item> +<item id="ref-26" xsi:type="SOAP-ENC:string">baseInstalledAndPlatformOK</item> +<item href="#ref-5"/> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-23" SOAP-ENC:arrayType="xsd:anyType[5]"> +<item xsi:type="xsd:boolean">true</item> +<item href="#ref-27"/> +<item xsi:type="xsd:boolean">false</item> +<item xsi:type="xsd:boolean">true</item> +<item xsi:type="xsd:int">-1</item> +</SOAP-ENC:Array> +<SOAP-ENC:Array id="ref-27" SOAP-ENC:arrayType="a1:IDictionary[0]" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections"> +</SOAP-ENC:Array> +</SOAP-ENV:Body> +</SOAP-ENV:Envelope> diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/pos_1.ico b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/pos_1.ico new file mode 100755 index 000000000..f95f437a3 Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/pos_1.ico differ diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posd.sh b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posd.sh new file mode 100755 index 000000000..215f1179f --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posd.sh @@ -0,0 +1,188 @@ +#!/bin/bash +# posd.sh + +# Usage: posd.sh stop|start|restart|status|clean|swap|remove + +if [ $# -lt 1 -o "$1" = "-h" -o "$1" = "--help" ] ; then + echo "Usage: posd.sh stop|start|restart|status|clean|install|swap|remove" + exit 0 +fi + +# --FUNCTIONALITY- - - - - - - - - - - - - - - - - - + +# + Run the functions of the scanner-scale driver/daemon wrapper. +# + Swap in new versions of the scanner-scale driver/daemon wrapper. +# + Remove the scanner-scale driver/daemon wrapper. + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - + +# 2Nov12 EL Add -h and --help handling. +# Add install option. +# Add update-rc.d to remove. +# 27Oct12 EL Add remove option. +# 26Oct12 EL Adapted for sph / pos.exe from ../rs232/posd.sh + +# Re Original: +# 9Sep12 EL Check that the named wrapper exists. +# Change to posdriver-ssd-debian +# 14Apr12 EL Add swap for swapping in new versions of posdriver-ssd +# 13Apr12 EL As wrapper for service posdriver-ssd + +# --FUNCTIONS- - - - - - - - - - - - - - - - - - - - + +# See if the script is set to start at runlevel 3. +# Is assumed to imply whether the script is set for any runlevel activity. +function checkrc() { + INRC=`ls /etc/rc3.d/S* | grep $POSD` +} + +# --CONSTANTS- - - - - - - - - - - - - - - - - - - - + +POSD=posdriver-sph-debian +SPH=/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/NewMagellan +DHOME=/var/run/$POSD + +# --VARIABLES- - - - - - - - - - - - - - - - - - - - + +NOW=`date "+%H:%M:%S"` + +# --MAIN - - - - - - - - - - - - - - - - - - - - - - + +if [ "$1" = "swap" ] ; then + if [ ! -f $SPH/$POSD ] ; then + echo "$POSD does not exist at $SPH." + exit 1 + fi + if [ -f ${DHOME}/sphp.pid ] ; then + ANS= + printf "$POSD seems to be running. OK to stop it? [y/N] > "; read ANS + if [ "$ANS" = "y" ] ; then + sudo service $POSD stop + echo "Stopped." + else + echo "OK. Bye." + exit 0 + fi + fi + cat $POSD | sudo tee /etc/init.d/$POSD > /dev/null + RETVAL=$? + if [ $RETVAL -eq 0 ] ; then + echo "swap OK. now: $NOW" + sudo chmod 755 /etc/init.d/$POSD + ls -l /etc/init.d/$POSD + ANS= + printf "Do you want to start it now? [y/N] > "; read ANS + if [ "$ANS" = "y" ] ; then + sudo service $POSD start + echo "Started. Bye." + else + echo "OK. Bye." + exit 0 + fi + else + printf "swap failed because: >${RETVAL}<\n"; + fi + exit +elif [ "$1" = "install" ] ; then + if [ ! -f $SPH/$POSD ] ; then + echo "$POSD does not exist to install from $SPH." + exit 1 + fi + if [ -f /etc/init.d/$POSD ] ; then + echo "The wrapper: /etc/init.d/$POSD is already in place." + checkrc; + if [ "$INRC" != "" ] ; then + echo " It is also set to start at boot." + else + ANS= + printf " It is not set to start at boot. Do you want to do that now? [y/N] > " + read ANS + if [ "$ANS" = "y" ] ; then + sudo update-rc.d $POSD defaults + R1=$? + if [ $R1 -eq 0 ] ; then + echo "Done. Bye." + exit 0 + else + echo "Start-at-boot failed: $R1" + exit 1 + fi + else + echo "OK. You may want to use this utility with the remove option. Bye." + exit 0 + fi + fi + exit 1 + fi + cat $POSD | sudo tee /etc/init.d/$POSD > /dev/null + RETVAL=$? + if [ $RETVAL -eq 0 ] ; then + echo "Copied to /etc/init.d OK." + sudo chmod 755 /etc/init.d/$POSD + sudo update-rc.d $POSD defaults + R2=$? + if [ $R2 -eq 0 ] ; then + echo "Set to start at boot OK." + else + echo "Start-at-boot failed: $R2." + fi + ANS= + printf "Do you want to start it now? [y/N] > "; read ANS + if [ "$ANS" = "y" ] ; then + sudo service $POSD start + echo "Started. Bye." + else + echo "OK. Bye." + exit 0 + fi + else + printf "install failed because: >${RETVAL}<\n"; + fi + exit +elif [ "$1" = "remove" ] ; then + if [ ! -f /etc/init.d/$POSD ] ; then + echo "The wrapper: /etc/init.d/$POSD doesn't exist." + checkrc; + if [ "$INRC" != "" ] ; then + echo " But it's start-at-boot is set up. Remove that now? [y/N] > " + if [ "$ANS" = "y" ] ; then + sudo update-rc.d $POSD remove + echo "Removed. Bye." + exit 0 + fi + fi + exit 1 + fi + if [ -f ${DHOME}/sphp.pid ] ; then + ANS= + printf "$POSD seems to be running. OK to stop it? [y/N] > "; read ANS + if [ "$ANS" = "y" ] ; then + sudo service $POSD stop + echo "Stopped." + else + echo "OK. Bye." + exit 0 + fi + fi + if [ ! -f $SPH/$POSD ] ; then + echo "There is no local copy of $POSD at $SPH" + echo " Will not rm from /etc/init.d/"; + exit 1; + else + sudo rm /etc/init.d/$POSD + sudo update-rc.d $POSD remove + echo "Removed. Bye." + exit 0 + fi +else + if [ ! -f /etc/init.d/$POSD ] ; then + echo "The wrapper: /etc/init.d/$POSD doesn't exist." + if [ -f $SPH/$POSD ] ; then + echo "It does exist at $SPH." + echo "You could try using this utility with the install option to install it." + fi + exit 1 + fi + sudo service $POSD $1 + exit +fi diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph new file mode 100755 index 000000000..d7eba6196 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph @@ -0,0 +1,88 @@ +#!/bin/bash +# +### BEGIN INIT INFO +# Provides: sph +# Required-Start: $local_fs +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/stop sph scanner-scale driver +### END INIT INFO +# +# posdriver-sph Startup script for pos.exe +# +# chkconfig: - 80 20 +# description: runs pos.exe scale driver as a daemon +# IMPORTANT: change path in start() to correct driver location! + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# +# 2Nov2012 EL Add LSB header, needed to start at boot. +# Also needs: update-rc.d podriver-sph defaults +# 26Oct2012 Eric Lee Change path to driver. +# For Debian systems, posdriver-sph-debian may be better. + +# --MAIN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# This doesn't exist in Ubuntu 10.04 at least in this location. +. /etc/rc.d/init.d/functions + +NAME=posdriver-sph + +mkdir -p /var/run/posdriver-sph + +start(){ + echo "Starting $NAME" + if [ ! -f /var/run/posdriver-sph/pos.pid ]; then + cd /var/www/html/git/IS4C/pos/is4c-nf/scale-drivers/drivers/NewMagellan + #cd /usr/share/it-core/is4c-nf/scale-drivers/drivers/NewMagellan + mono pos.exe &> /var/run/posdriver-sph/pos.log & + echo $! > /var/run/posdriver-sph/pos.pid + RETVAL=$? + if [ $RETVAL = 0 ]; then + success; + else + failure; + fi + else + echo "$NAME is already running" + failure; + fi + echo +} + +stop(){ + echo "Stoping $NAME" + if [ -f /var/run/posdriver-sph/pos.pid ]; then + MYPID=`cat /var/run/posdriver-sph/pos.pid` + kill $MYPID + RETVAL=$? + if [ $RETVAL = 0 ]; then + rm /var/run/posdriver-sph/pos.pid + success; + else + failure; + fi + else + echo "$NAME is not running" + fi + echo +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + *) + echo $"Usage: $NAME {start|stop|restart}" + exit 1 +esac + +exit 0 diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph-debian b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph-debian new file mode 100755 index 000000000..1efa1b977 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/posdriver-sph-debian @@ -0,0 +1,292 @@ +#!/bin/bash +# +### BEGIN INIT INFO +# Provides: sph +# Required-Start: $local_fs +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/stop sph scanner-scale driver +### END INIT INFO +# +# posdriver-sph-debian Startup script for sph / pos.exe + +# --FUNCTIONALITY- - - - - - - - - - - - - - - - - - - - - - - + +# + Service start/stop script for pos.exe +# + This must be installed in /etc/init.d +# After copying to /etc/init.d: +# sudo update-rc.d posdriver-sph-debian defaults +# Consider using posd.sh to install it. + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - +# +# 2Nov12 EL Remove chkconfig-line +# Add checking start-at-boot to status. +# 28Oct12 EL Add LSB header, needed to start at boot. +# Add chmod 666 serial port at start(). +# +# 27Oct12 EL cd to driver home for start(); it assumes you are there. +# Display log after start, which can show errors. +# 26Oct12 EL Adapt from ../rs232/posdriver-ssd-debian for sph / pos.exe +# "ssd" changed to "sph" in some cases and "pos.exe" in others. +# var DHOME for where the driver is. +# get_pidp() because the technique used to check for ssd +# won't work; pos.exe is an argument to cli. +# You might want to use posd.sh to install and manage this. +# +# 8Apr12 EL Get PID of the ssd process after startup and record as ssdp.pid. +# Add killing of the process to "stop" +# Add "clean" option to rm ssdp.pid if process is gone in +# order to allow start. +# Add "status" option to show pid and ssdp.pid. +# Added functions success() and failure(). +# In start(), changed initial test from -z to ! -f +# Build on original posdriver-ssd + +# --CONSTANTS - - - - - - - - - - - - - - - - - - - - - - - - - + +NAME=posdriver-sph-debian +LHOME=/var/run/${NAME} +KILL=/bin/kill +DHOME=/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/NewMagellan + +# --FUNCTIONS - - - - - - - - - - - - - - - - - - - - - - - - - + +function noop() +{ + NOOP="" +} +function failure() +{ + echo "failure"; +} +function success() +{ + echo "success"; +} + +# Make the directory to contain the posdriver-sph pid and log +# if it doesn't exist, which it doesn't to begin with. +# It apparently does not survive reboot. +function makelogdir () +{ + if [ ! -d $LHOME ]; then + mkdir -p $LHOME + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Made log home: $LHOME"; + success; + else + echo "Could not make log home: ${LHOME} : $RETVAL"; + failure; + exit 1; + fi + else + echo "Log home: ${LHOME} (already) exists." + #echo "${LHOME} does not need to be created." + fi + +# makelogdir +} + +# Get the pid of the driver process, if the driver started. +function get_mypidp() { + OWNER= + MYPIDP= + REST= + BUF=`ps -ef | grep "pos.exe" | grep -v grep` + if [ "$BUF" != "" ] ; then + echo "$BUF" > /tmp/buf.txt + read OWNER MYPIDP REST < /tmp/buf.txt + fi +} + +start(){ + echo "Starting $NAME" + if [ ! -f ${LHOME}/sphp.pid ]; then + + # Make the directory where the PID and log files are kept if it + # doesn't exist. + makelogdir + + # Driver assumes you are in it's home. + cd $DHOME + + # Be sure the port is writable + chmod 666 /dev/ttyS0 + + # Start the driver in the background + mono pos.exe &> ${LHOME}/pos.log & + # Store the PID of the startup process. + MYPID=$! + echo $MYPID > ${LHOME}/sph.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Started: $NAME as PID: ${MYPID}" + # See if the pos.exe process is actually running. + # It is not the same pid as the startup returned, + # and the startup process is no longer alive. + # Apparently takes a bit of time for the daemon to start, or be known to ps. + sleep 2 + get_mypidp + if [ "$MYPIDP" ] ; then + echo "Running: $NAME as PIDP: ${MYPIDP}" + echo "$MYPIDP" > ${LHOME}/sphp.pid + success; + echo "At startup, ${LHOME}/pos.log shows:" + cat ${LHOME}/pos.log + echo "--End of log" + else + echo "$NAME PIDP: >${MYPIDP}< is not running." + echo "At failure to startup, ${LHOME}/pos.log shows:" + cat ${LHOME}/pos.log + echo "--End of log" + failure; + fi + else + echo "Could not start: ${NAME} : $RETVAL" + echo "At failure to startup, ${LHOME}/pos.log shows:" + cat ${LHOME}/pos.log + echo "--End of log" + failure; + fi + else + echo "$NAME is already running" + failure; + fi + echo + + # start +} + +stop(){ + echo "Stopping $NAME" + # Look for the pid of the actual daemon, not the startup process. + if [ -f ${LHOME}/sphp.pid ]; then + MYPIDP=`cat ${LHOME}/sphp.pid` + # This works but reports "No such process" - why? + #kill $MYPIDP + $KILL `cat ${LHOME}/sphp.pid` + RETVAL=$? + # In bash, quoting and " = " vs. -eq don't seem to matter. + if [ "$RETVAL" = "0" ]; then + # EL: Added rm. + rm ${LHOME}/sphp.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Killed ${MYPIDP} and rm'd ${LHOME}/sphp.pid" + success; + else + echo "Killed ${MYPIDP} but could not rm ${LHOME}/sphp.pid" + failure; + fi + else + echo "Could not kill ${MYPIDP} because: >$RETVAL<" + failure; + fi + else + echo "$NAME is not running" + fi + echo + # stop +} + +clean(){ + + echo "Cleaning $NAME" + get_mypidp + if [ -z "$MYPIDP" ] ; then + if [ -f ${LHOME}/sphp.pid ]; then + rm ${LHOME}/sphp.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "pos.exe is not running. rm'd ${LHOME}/sphp.pid" + noop; + else + echo "Could not rm ${LHOME}/sphp.pid" + echo "Since pos.exe is not running normal start should be possible." + noop; + fi + else + echo "pos.exe is not running. No ${LHOME}/sphp.pid to rm." + fi + else + printf "The pos.exe is still running >${MYPIDP}< so did not rm ${LHOME}/sphp.pid which " + if [ -f ${LHOME}/sphp.pid ]; then + printf "does" + else + printf "does not" + fi + echo " exist." + noop; + fi + + # clean +} + +status(){ + + echo "Status of ${NAME}:" + + get_mypidp + if [ "$MYPIDP" ] ; then + echo "The pos.exe is running as >${MYPIDP}<" + else + echo "The pos.exe is not running." + if [ -f ${LHOME}/pos.log ]; then + echo "At not running, ${LHOME}/pos.log of:" + ls -l ${LHOME}/pos.log + echo "shows head:" + head -5 ${LHOME}/pos.log + echo "shows tail:" + tail -5 ${LHOME}/pos.log + echo "--End of log" + else + echo "No ${LHOME}/pos.log to show." + fi + fi + makelogdir; + if [ -f ${LHOME}/sphp.pid ]; then + MYPIDF=`cat ${LHOME}/sphp.pid` + printf "${LHOME}/sphp.pid exists and contains: >${MYPIDF}<\n" + if [ "$MYPIDP" != "$MYPIDF" ] ; then + printf "*** Alert: They don't agree!\n"; + fi + else + echo "${LHOME}/sphp.pid does not exist." + fi + INRC=`ls /etc/rc3.d/S* | grep $NAME` + if [ "$INRC" ] ; then + echo "$NAME should start at boot." + else + echo "$NAME not expected to start at boot." + fi + + # status +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + sleep 2 + start + ;; + clean) + clean + ;; + status) + status + ;; + *) + echo $"Usage: $NAME {start|stop|restart|clean|status}" + exit 1 +esac + +exit 0 diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/ss-output/tmp/blah.txt b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/ss-output/tmp/blah.txt new file mode 100755 index 000000000..dfab60210 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/ss-output/tmp/blah.txt @@ -0,0 +1 @@ +3*4068 \ No newline at end of file diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/sscom.sh b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/sscom.sh new file mode 100755 index 000000000..a9929e7b7 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/sscom.sh @@ -0,0 +1,129 @@ +#!/bin/bash +# sscom.sh + +# Usage: sscom.sh + +if [ "" -a $# -lt 1 ] ; then + echo "Usage: sscom.sh " + exit 0 +fi + +# --FUNCTIONALITY- - - - - - - - - - - - - - - - - - + +# Menu of scanner-scale commands +# with crude response-display and better some day. + +# Reads responses from raw.txt, from: +# cat /dev/ttyS0 | tee raw.txt +# ?Which needs to be running in another terminal window? +# There may be better ways to do this. + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - + +# 14Apr12 EL + +# --CONSTANTS- - - - - - - - - - - - - - - - - - - - + +ECHO=/bin/echo +# Terminator +T="\r" +# Prefix +P=S +# Address=Scanner +N=${P}0 +# Address=Scale +L=${P}1 +# The port the ss is on. +PORT=/dev/ttyS0 + + +# --VARIABLES- - - - - - - - - - - - - - - - - - - - + +#NOW=`date "+%H:%M:%S"` + +# --MAIN - - - - - - - - - - - - - - - - - - - - - - + +RAW=`ps -ef | fgrep "tee raw.txt" | grep -v fgrep` +CAT=`ps -ef | fgrep "cat $PORT" | grep -v fgrep` +#if [ "1" -a "$RAW" = "" ] ; then +if [ "$CAT" = "" -o "$RAW" = "" ] ; then + printf "raw.txt is not being gathered.\n" + printf " In another window: cat $PORT | tee raw.txt\n" + exit 0 +else + echo "CAT: >${CAT}<" + echo "RAW: >${RAW}<" + ps -ef | fgrep "tee raw.txt" + echo "catting $PORT is OK" + ls -l raw.txt +fi + +printf "\nBe sure that in another window: cat $PORT | tee raw.txt\n\n" + +while [ "1" ] ; do + +# Display a list of Commands +echo "" +echo "1. GoodBeep" +echo "2. Scanner Status" +echo "3. Scale Status" +echo "4. Scale Monitor" +echo "5. Scale Weight Request" +echo "q. Quit" +echo "" +ANS= +printf " > "; read ANS + +# Perform the Command and possibly display the results + +case "$ANS" in + 1) + # goodBeep. Works. + $ECHO -e "${P}334${T}" > $PORT + #$ECHO -e "${P}334${T}" + ;; + 2) +# Scanner Status. + $ECHO -e "${P}03${T}" > $PORT + $ECHO "Response:" + sleep 1 + tail -1 raw.txt + ;; + 3) +# Scale Status. + $ECHO -e "${L}3${T}" > $PORT + $ECHO "Scale Status Response:" + sleep 1 + tail -1 raw.txt + ;; + 4) +# Scale Monitor. + CODE=${L}4 + $ECHO -e "${L}4${T}" > $PORT + $ECHO "Scale Monitor Response ^${CODE}:" + sleep 1 + tail -1 raw.txt + # Check until you get one with the right heading. + #RESP=`tail -1 raw.txt | grep "^$CODE"` + ;; + 5) +# Scale Weight Request. + CODE=${L}1 + $ECHO -e "${L}1${T}" > $PORT + $ECHO "Scale Weight Response ^${CODE}...:" + sleep 1 + tail -1 raw.txt + # Check until you get one with the right heading. + #RESP=`tail -1 raw.txt | grep "^$CODE"` + ;; + q) + break + ;; + *) + $ECHO "Unknown command" +esac + +done + +printf "Goodbye.\n" +exit diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/Makefile b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/Makefile new file mode 100644 index 000000000..66b2a6c7a --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/Makefile @@ -0,0 +1,9 @@ +CC=gmcs +RM=rm -f +BASE_LIBS=-r:System.Drawing -r:System.Windows.Forms + +all: test.cs + $(CC) -target:exe $(BASE_LIBS) -out:test.exe test.cs + +clean: + $(RM) test.exe diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frame-a.html b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frame-a.html new file mode 100644 index 000000000..5ac247343 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frame-a.html @@ -0,0 +1,5 @@ +<html> + <head> + </head> + <body>Frame A</body> +</html> diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frame-b.html b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frame-b.html new file mode 100644 index 000000000..712ae86d8 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frame-b.html @@ -0,0 +1,5 @@ +<html> + <head> + </head> + <body>Frame B</body> +</html> diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frames.html b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frames.html new file mode 100644 index 000000000..0a5f79e7f --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/frames.html @@ -0,0 +1,18 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> +<html> + <head> + </head> +<frameset cols='675,118,*' frameborder='0'> + <frameset rows="40,440,*" frameborder=0 scrolling=no> + <frame src='frame-a.html' name='input' border='0' scrolling='no'> + <frame src='frame-b.html' name='main_frame' border='0' scrolling='no'> + </frameset> + <!-- + <frameset rows="345,50,50,*" frameborder=0 scrolling=no> + <frame src="scale.php" name="scale" border=0 scrolling=no> + <frame src="endorse.php" name="endorse" border=0 scrolling=no> + <frame src="end.php" name="end" border=0 scrolling=no> + </frameset> + --> +</frameset> +</html> diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/make.bat b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/make.bat new file mode 100644 index 000000000..424f5d2be --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/make.bat @@ -0,0 +1 @@ +csc /target:exe /out:test.exe test.cs diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/test.cs b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/test.cs new file mode 100644 index 000000000..8b9c7ab29 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/test.cs @@ -0,0 +1,31 @@ +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +class FramesTest : Form { + private WebBrowser wb; + + public FramesTest(){ + int width = 800; + int height = 600; + this.Size = new Size(width,height); + + wb = new WebBrowser(); + wb.Parent = this; + wb.Size = new Size(width,height); + wb.Url = new Uri(Path.GetFullPath("frames.html")); + wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(PrintStatus); + } + + public void PrintStatus(object sender, WebBrowserDocumentCompletedEventArgs e){ + HtmlWindow currWin = wb.Document.Window; + HtmlWindowCollection frames = currWin.Frames; + System.Console.WriteLine("Frame count: "+frames.Count); + } + + [STAThread] + static public void Main(){ + Application.Run(new FramesTest()); + } +} diff --git a/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/test.exe b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/test.exe new file mode 100644 index 000000000..ed3bdb865 Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/NewMagellan/test/test.exe differ diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/.gitignore b/pos/is4c-nf/scale-drivers/drivers/rs232/.gitignore new file mode 100644 index 000000000..401fd5cb8 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/.gitignore @@ -0,0 +1,5 @@ +/scale +/scanner +/ssd +/ssd.log +/ssd.pid diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/Makefile b/pos/is4c-nf/scale-drivers/drivers/rs232/Makefile new file mode 100644 index 000000000..afecb069d --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/Makefile @@ -0,0 +1,8 @@ +CC=gcc +FILES=ssd.c + +all: $(FILES) + $(CC) -o ssd $(FILES) + +clean: + rm ssd diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/README_wefc b/pos/is4c-nf/scale-drivers/drivers/rs232/README_wefc new file mode 100644 index 000000000..21db5b51a --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/README_wefc @@ -0,0 +1,209 @@ +The contents of the directories are the files that constitute +the IS4C scanner scale driver for *nix + +# --COMMENTS { - - - - - - - - - - - - - - - - - - - - - - - +# +# 17Aug12 EL cp -p ssd.c ssd_wefc.c , and add to flathat repo, hopefully will protect. +# ssd.c seems to constantly be getting overwritten in git pulls. +# 16May12 EL git merge of what was Andy's origin and is now upstream overwrote +# the executable, not to mention ssd.c, scale and scanner. +# Don't merge upstream[again] until you figure out how to protect those. +# merge of WEFC fork s/b OK. +# 7Apr12 EL Added notes about what I did: # EL done: + +# --comments } - - - - - - - - - - - - - - - - - - - - - - - + +The different kinds of files are: + +SOURCE FILES +----------------------------------------- + +scannerscale.c and ssd.c are source files in C. +scannerscale.c is the original program that sets communication +parameters for the serial port to communicate with the +scanner scale. + +ssd.c applies the necessary wrappers on +# EL "scannerscale*" does not exist. +scannerscale.c to turn it into a daemon. When compiled, +scannerscale.c therefore becomes a child process of ssd.c + +To compile ssd.c on my system (Slackware): +# gcc ssd.c -o ssd +#EL Results: +posadmin@lane3:SSD$ cp -p ssd ssd_orig +posadmin@lane3:SSD$ make clean +rm ssd +posadmin@lane3:SSD$ make +gcc -o ssd ssd.c +posadmin@lane3:SSD$ ls -l ss* +-rwxr-xr-x 1 posadmin posadmin 12111 2012-04-07 18:24 ssd +-rw-r--r-- 1 posadmin posadmin 7667 2012-03-31 00:30 ssd.c +-rw-r--r-- 1 posadmin posadmin 10441 2012-03-31 00:30 ssd_orig +#EL Later discovered that locations of scanner and scale files +# were wrong, fixed and re-compiled. + +#EL Reformatted: +Incoming data from the scanner-scale is then written to either the file: +"scanner" or +"scale" +depending on the prefix of the character strings. +#EL new: +# These two must be writable by the Apache/PHP user (www-data) +# EL done: +#chmod 666 scanner scale + +COMPILED EXECUTABLE +----------------------------------------- + +There is only one. +ssd.c is compiled as ssd, which runs as a daemon +and should be set to start up at boot time in +production. + +For Slackware, the process I follow is to make a soft link first: + +# ln -s /pos/is4c/rs232/ssd /etc/rc.d/rc.ssd +# EL: The above path is outdated and not Ubuntu: +# sudo ln -s /var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232 /etc/init.d/rc.ssd +# EL: mschersten does the above in a different way. +# Is it applicable here? +#EL: symlink approach does not work. Complains: "too many levels of symlink" when you +# try to run it. +# mschersten style, for ssd: +# copies driver startup service, fixes path to driver, and runs it on boot +#sudo cp /var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd /etc/init.d/posdriver-ssd +# EL done: +sudo cp posdriver-ssd /etc/init.d/posdriver-ssd +# Should then be able to: +# sudo service posdriver-ssd start|stop|restart|clean|status +# Yes. +# After this? goodBeep no longer gets a beep. +# Restarted. goodBeep restored +# Ran ssd again, goodBeep gone. +# +# Did this in the version here. +#sudo sed -i 's^/usr/share/it-core/^/var/www/IS4C/pos/^' /etc/init.d/posdriver-ssd +#EL done: +# What does it actually do? Puts start and stop instructions in /etc/rc?.d +sudo rcconf --on posdriver-ssd +#EL restart. Is everything still there, scan still work? Yes! +#EL Apr8:19:30 weighing not configured yet. +#EL Apr8:19:30 goodBeep does not work. + +Afterwards, add the following to either: +[/etc/]rc.local +# EL This also exists and has been changed more recently: +[/etc/init.d/]rc.local +or +# Does not exist on ubuntu. +rc.M + +#EL: And then run this? Or reboot to start it? +# Or: service rc.ssd start +/etc/init.d/rc.ssd +#/etc/rc.d/rc.ssd + + +SHELL SCRIPTS +----------------------------------------- + +goodBeep, errorBeep, wakeup, rePoll and twoPairs +are shell scripts that send signals to the +scanner scale. They are invoked by the php scripts +on an "as needed" basis. + +setport sets the serial port communication +parameters so that they are compatible with +the factory default settings for the Magellan +scanner scale. It is not necessary to run +setport when ssd is running, and setport is mainly +used for testing. + +As these files are invoked by php, and therefore +run from Apache, write permission for /dev/ttyS0 +has to be set accordingly before they will work. +(On a related note, as a reminder, +write permission for /dev/lp0 +also has to be set properly before the system +can print receipts) + +# EL done: +# This is adequate for the beep tests: +# sudo chmod 666 /dev/ttyS0 /dev/lp0 +# mschersten uses: +# sudo chmod 777 /dev/ttyS0 /devlp0 +# EL However, as mschersten notes, these changes are reverted +# on reboot, so, under Ubuntu anyway: +# See: /etc/udev/rules.d/README, and then: +# creates a file to open permissions on /dev/lp0 upon startup +# What does mschersten achieve with this elaborate syntax? +# The sudo has to be in the second part of the command. +# EL done: +#echo 'KERNEL=="ttyS0",MODE=="0666"' | sudo tee /etc/udev/rules.d/serial-port.rules > /dev/null +#echo 'KERNEL=="lp0",MODE=="0666"' | sudo tee /etc/udev/rules.d/parallel-port.rules > /dev/null +# Cannot: +#sudo echo 'KERNEL=="ttyS0",MODE=="0666"' > /etc/udev/rules.d/serial-port.rules +#sudo echo 'KERNEL=="lp0",MODE=="0666"' > /etc/udev/rules.d/parallel-port.rules +#because the redirect is in a separate, non-sudo shell. +# Then restart to see that the perms stick. Try goodBeep +# Yes, they stick. goodBeep works (again). + + +goodBeep = One beep. +called whenever a record is inserted into localtemptrans +to indicate a good scan. The scanner scale, by factory default, +also gives a "good scan beep" when an item is successfully +scanned. The Wedge disables the default factory beep because +IS4C does not consider an item as scanned if is is not entered +into localtemptrans. +WFC has decided to keep the factory beep, so that a fully +successful scan results in two beeps. + +errorBeep = A series of 3 beeps in quick succession, +usually called in association with error screens. + +twoPairs = two sets of two quick beeps +Used to call attention to cash over amount + +wakeup = sends scale status signals to initiate +responses from the scanner scale. Called +manually when the string "wakeup" is entered into +the input form, usually by a hotkey. + +rePoll = similar to wakeup. Sends only one +signal, and is called by php as needed. + +*** check that all scripts are made executable *** + +# EL added and done: +#chmod 755 goodBeep errorBeep wakeup rePoll twoPairs +# EL added and done: +# EL Also remove ^M from these, esp in #!/bin/sh, +# which will prevent them from executing. +# In vi: :s/ctrlVctrlM// +# Beeping commands tested OK! + +DATA FILES +-------------------------------------------- + +scanner stores the last scanned input that +has not been processed by IS4C. + +scale stores the last weight input + +These are read and processed by the file +/pos/is4c/chkserial.php +"scanner" is cleared every time it is read by chkserial.php, +but the record in "scale" +persists, and is regulated only by ssd. + +IMPORTANT +----------------------------------------------- +To re-emphasize: Write permission for /dev/ttyS0 [and /dev/lp0] +has to be set properly: +# EL noted and done above. +before the shell scripts (and therefore the scanner scale) +will work properly with IS4C. + +Last updated: Dec 8, 2005 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/errorBeep b/pos/is4c-nf/scale-drivers/drivers/rs232/errorBeep new file mode 100644 index 000000000..efdeb07ce --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/errorBeep @@ -0,0 +1,7 @@ +#!/bin/sh + +echo -e "S334\r" > /dev/ttyS0 +sleep 0.1 +echo -e "S334\r" > /dev/ttyS0 +sleep 0.1 +echo -e "S334\r" > /dev/ttyS0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/goodBeep b/pos/is4c-nf/scale-drivers/drivers/rs232/goodBeep new file mode 100644 index 000000000..a32ad6ba6 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/goodBeep @@ -0,0 +1,3 @@ +#!/bin/sh + +echo -e "S334\r" > /dev/ttyS0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/lptty b/pos/is4c-nf/scale-drivers/drivers/rs232/lptty new file mode 100644 index 000000000..937a82e03 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/lptty @@ -0,0 +1,4 @@ +#!/bin/sh + +chmod 777 /dev/lp0 +chmod 777 /dev/ttyS0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/posd b/pos/is4c-nf/scale-drivers/drivers/rs232/posd new file mode 120000 index 000000000..953567c9b --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/posd @@ -0,0 +1 @@ +posd.sh \ No newline at end of file diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/posd.sh b/pos/is4c-nf/scale-drivers/drivers/rs232/posd.sh new file mode 100755 index 000000000..eb06c3c2f --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/posd.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# posd.sh + +# Usage: posd.sh stop|start|restart|status|clean|swap + +if [ $# -lt 1 ] ; then + echo "Usage: posd.sh stop|start|restart|status|clean|swap" + exit 0 +fi + +# --FUNCTIONALITY- - - - - - - - - - - - - - - - - - + +# + Run the functions of the scanner-scale driver/daemon wrapper. +# + Swap in new versions of the scanner-scale driver/daemon wrapper. + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - + +# 9Sep12 EL Check that the named wrapper exists. +# Change to posdriver-ssd-debian +# 13May12 EL Change POSD from posdriver-ssd to posdriver2-ssd to be +# different from the git upstream version, WFC. +# 14Apr12 EL Add swap for swapping in new versions of posdriver-ssd +# 13Apr12 EL As wrapper for service posdriver-ssd + +# --CONSTANTS- - - - - - - - - - - - - - - - - - - - + +#POSD=posdriver2-ssd +POSD=posdriver-ssd-debian +SSD=/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232 + +# --VARIABLES- - - - - - - - - - - - - - - - - - - - + +NOW=`date "+%H:%M:%S"` + +# --MAIN - - - - - - - - - - - - - - - - - - - - - - + +if [ "$1" = "swap" ] ; then + if [ ! -f $SSD/$POSD ] ; then + echo "$POSD does not exist at $SSD." + exit 1 + fi + cat $POSD | sudo tee /etc/init.d/$POSD > /dev/null + RETVAL=$? + if [ $? -eq 0 ] ; then + echo "swap OK. now: $NOW" + sudo chmod 755 /etc/init.d/$POSD + ls -l /etc/init.d/$POSD + else + printf "swap failed because: >${RETVAL}<\n"; + fi + exit +else + if [ ! -f /etc/init.d/$POSD ] ; then + echo "The wrapper: /etc/init.d/$POSD doesn't exist." + if [ -f $SSD/$POSD ] ; then + echo "It does exist at $SSD." + echo "You could try using this utility with the swap option to install it." + fi + exit 1 + fi + sudo service $POSD $1 + exit +fi diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd-debian b/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd-debian new file mode 100755 index 000000000..a516a2a84 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd-debian @@ -0,0 +1,224 @@ +#!/bin/bash +# +# posdriver-ssd-debian Startup script for ssd +# +# chkconfig: - 80 20 +# description: runs ssd scale driver as a daemon + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - +# +# 16May12 EL Remove some of the superseded, commented code. +# 13May12 EL Change name to posdriver2-ssd to not conflict with upstream version. +# 8Apr12 EL Get PID of the ssd process after startup and record as ssdp.pid. +# Add killing of the process to "stop" +# Add "clean" option to rm ssdp.pid if process is gone in +# order to allow start. +# Add "status" option to show pid and ssdp.pid. +# ? Is something needed to prevent multiple starts, +# i.e. check if daemon already running before starting another? +# 7Apr12 EL In "start" change the location of the driver. +# What do "success" and "failure" do? Added functions for them. +# In start(), changed initial test from -z to ! -f + +# --CONSTANTS - - - - - - - - - - - - - - - - - - - - - - - - - + +NAME=posdriver-ssd-debian +DHOME=/var/run/${NAME} +KILL=/bin/kill + +# --FUNCTIONS - - - - - - - - - - - - - - - - - - - - - - - - - + +function noop() +{ + NOOP="" +} +function failure() +{ + echo "failure"; +} +function success() +{ + echo "success"; +} + +# Make the directory to contain the posdriver2-ssd pid and log +# if it doesn't exist, which it doesn't to begin with. +# It apparently does not survive reboot. +function makelogdir () +{ + if [ ! -d $DHOME ]; then + #echo "Would make: $DHOME"; + /usr/bin/sudo mkdir -p $DHOME + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Made: $DHOME"; + success; + else + echo "Could not make: ${DHOME} : $RETVAL"; + failure; + exit 1; + fi + else + echo "${DHOME} (already) exists." + #echo "${DHOME} does not need to be created." + fi + + # makelogdir +} + +start(){ + echo "Starting $NAME" + if [ ! -f ${DHOME}/ssdp.pid ]; then + + # Make the directory where the PID and log files are kept if it + # doesn't exist. + makelogdir + + # Start the driver in the background as user nobody. + /usr/bin/sudo -u nobody /var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/ssd &> ${DHOME}/ssd.log & + # Store the PID of the startup process. + MYPID=$! + echo $MYPID > ${DHOME}/ssd.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Started: $NAME as PID: ${MYPID}" + # See if the ssd process is actually running. + # It is not the same pid as the startup returned, + # and the startup process is no longer alive. + # Apparently takes a bit of time for the daemon to start, or be known to ps. + sleep 2 + MYPIDP=`/bin/ps --no-headers -C ssd -o pid=` + if [ "$MYPIDP" ] ; then + echo "Running: $NAME as PIDP: ${MYPIDP}" + echo "$MYPIDP" > ${DHOME}/ssdp.pid + success; + else + echo "$NAME PIDP: >${MYPIDP}< is not running." + failure; + fi + else + echo "Could not start: ${NAME} : $RETVAL" + failure; + fi + else + echo "$NAME is already running" + failure; + fi + echo + + # start +} + +stop(){ + echo "Stopping $NAME" + # Look for the pid of the actual daemon, not the startup process. + if [ -f ${DHOME}/ssdp.pid ]; then + MYPIDP=`cat ${DHOME}/ssdp.pid` + # This works but reports "No such process" - why? + #kill $MYPIDP + $KILL `cat ${DHOME}/ssdp.pid` + RETVAL=$? + # In bash, quoting and " = " vs. -eq don't seem to matter. + if [ "$RETVAL" = "0" ]; then + # EL: Added rm. + rm ${DHOME}/ssdp.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Killed ${MYPIDP} and rm'd ${DHOME}/ssdp.pid" + success; + else + echo "Killed ${MYPIDP} but could not rm ${DHOME}/ssdp.pid" + failure; + fi + else + echo "Could not kill ${MYPIDP} because: >$RETVAL<" + failure; + fi + else + echo "$NAME is not running" + fi + echo + # stop +} + +clean(){ + + echo "Cleaning $NAME" + MYPIDP=`/bin/ps --no-headers -C ssd -o pid=` + if [ -z "$MYPIDP" ] ; then + if [ -f ${DHOME}/ssdp.pid ]; then + rm ${DHOME}/ssdp.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "ssd is not running. rm'd ${DHOME}/ssdp.pid" + noop; + else + echo "Could not rm ${DHOME}/ssdp.pid" + echo "Since ssd is not running normal start should be possible." + noop; + fi + else + echo "ssd is not running. No ${DHOME}/ssdp.pid to rm." + fi + else + printf "The ssd is still running >${MYPIDP}< so did not rm ${DHOME}/ssdp.pid which " + if [ -f ${DHOME}/ssdp.pid ]; then + printf "does" + else + printf "does not" + fi + echo " exist." + noop; + fi + + # clean +} + +status(){ + + echo "Status of $NAME" + + MYPIDP=`/bin/ps --no-headers -C ssd -o pid=` + if [ "$MYPIDP" ] ; then + echo "The ssd is running as >${MYPIDP}<" + else + echo "The ssd is not running." + fi + makelogdir; + if [ -f ${DHOME}/ssdp.pid ]; then + MYPIDF=`cat ${DHOME}/ssdp.pid` + printf "${DHOME}/ssdp.pid exists and contains: >${MYPIDF}<\n" + if [ "$MYPIDP" != "$MYPIDF" ] ; then + printf "*** Alert: They don't agree!\n"; + fi + else + echo "${DHOME}/ssdp.pid does not exist." + fi + + # status +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + sleep 2 + start + ;; + clean) + clean + ;; + status) + status + ;; + *) + echo $"Usage: $NAME {start|stop|restart|clean|status}" + exit 1 +esac + +exit 0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd-redhat b/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd-redhat new file mode 100755 index 000000000..c57022d05 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver-ssd-redhat @@ -0,0 +1,64 @@ +#!/bin/bash +# +# posdriver-ssd-redhat Startup script for ssd +# +# chkconfig: - 80 20 +# description: runs ssd scale driver as a daemon + +. /etc/rc.d/init.d/functions + +NAME=posdriver-ssd-redhat + +start(){ + echo "Starting $NAME" + if [ -z /var/run/posdriver-ssd/ssd.pid ]; then + cd /usr/share/it-core/is4c-nf/scale-drivers/drivers/rs232 + /usr/bin/sudo -u nobody ssd &> /var/run/posdriver-ssd/ssd.log & + echo $! > /var/run/posdriver-ssd/ssd.pid + RETVAL=$? + if [ $RETVAL = 0 ]; then + success; + else + failure; + fi + else + echo "$NAME is already running" + failure; + fi + echo +} + +stop(){ + echo "Stoping $NAME" + if [ -f /var/run/posdriver-ssd/ssd.pid ]; then + MYPID=`cat /var/run/posdriver-ssd/ssd.pid` + kill $MYPID + RETVAL=$? + if [ $RETVAL = 1 ]; then + success; + else + failure; + fi + else + echo "$NAME is not running" + fi + echo +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + *) + echo $"Usage: $NAME {start|stop|restart}" + exit 1 +esac + +exit 0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver2-ssd b/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver2-ssd new file mode 100755 index 000000000..feb22b4f6 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/posdriver2-ssd @@ -0,0 +1,224 @@ +#!/bin/bash +# +# posdriver-ssd2 Startup script for ssd +# +# chkconfig: - 80 20 +# description: runs ssd scale driver as a daemon + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - +# +# 16May12 EL Remove some of the superseded, commented code. +# 13May12 EL Change name to posdriver2-ssd to not conflict with upstream version. +# 8Apr12 EL Get PID of the ssd process after startup and record as ssdp.pid. +# Add killing of the process to "stop" +# Add "clean" option to rm ssdp.pid if process is gone in +# order to allow start. +# Add "status" option to show pid and ssdp.pid. +# ? Is something needed to prevent multiple starts, +# i.e. check if daemon already running before starting another? +# 7Apr12 EL In "start" change the location of the driver. +# What do "success" and "failure" do? Added functions for them. +# In start(), changed initial test from -z to ! -f + +# --CONSTANTS - - - - - - - - - - - - - - - - - - - - - - - - - + +NAME=posdriver2-ssd +DHOME=/var/run/${NAME} +KILL=/bin/kill + +# --FUNCTIONS - - - - - - - - - - - - - - - - - - - - - - - - - + +function noop() +{ + NOOP="" +} +function failure() +{ + echo "failure"; +} +function success() +{ + echo "success"; +} + +# Make the directory to contain the posdriver2-ssd pid and log +# if it doesn't exist, which it doesn't to begin with. +# It apparently does not survive reboot. +function makelogdir () +{ + if [ ! -d $DHOME ]; then + #echo "Would make: $DHOME"; + /usr/bin/sudo mkdir -p $DHOME + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Made: $DHOME"; + success; + else + echo "Could not make: ${DHOME} : $RETVAL"; + failure; + exit 1; + fi + else + echo "${DHOME} (already) exists." + #echo "${DHOME} does not need to be created." + fi + +# makelogdir +} + +start(){ + echo "Starting $NAME" + if [ ! -f ${DHOME}/ssdp.pid ]; then + + # Make the directory where the PID and log files are kept if it + # doesn't exist. + makelogdir + + # Start the driver in the background as user nobody. + /usr/bin/sudo -u nobody /var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/ssd &> ${DHOME}/ssd.log & + # Store the PID of the startup process. + MYPID=$! + echo $MYPID > ${DHOME}/ssd.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Started: $NAME as PID: ${MYPID}" + # See if the ssd process is actually running. + # It is not the same pid as the startup returned, + # and the startup process is no longer alive. + # Apparently takes a bit of time for the daemon to start, or be known to ps. + sleep 2 + MYPIDP=`/bin/ps --no-headers -C ssd -o pid=` + if [ "$MYPIDP" ] ; then + echo "Running: $NAME as PIDP: ${MYPIDP}" + echo "$MYPIDP" > ${DHOME}/ssdp.pid + success; + else + echo "$NAME PIDP: >${MYPIDP}< is not running." + failure; + fi + else + echo "Could not start: ${NAME} : $RETVAL" + failure; + fi + else + echo "$NAME is already running" + failure; + fi + echo + +# start +} + +stop(){ + echo "Stopping $NAME" + # Look for the pid of the actual daemon, not the startup process. + if [ -f ${DHOME}/ssdp.pid ]; then + MYPIDP=`cat ${DHOME}/ssdp.pid` + # This works but reports "No such process" - why? + #kill $MYPIDP + $KILL `cat ${DHOME}/ssdp.pid` + RETVAL=$? + # In bash, quoting and " = " vs. -eq don't seem to matter. + if [ "$RETVAL" = "0" ]; then + # EL: Added rm. + rm ${DHOME}/ssdp.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "Killed ${MYPIDP} and rm'd ${DHOME}/ssdp.pid" + success; + else + echo "Killed ${MYPIDP} but could not rm ${DHOME}/ssdp.pid" + failure; + fi + else + echo "Could not kill ${MYPIDP} because: >$RETVAL<" + failure; + fi + else + echo "$NAME is not running" + fi + echo +# stop +} + +clean(){ + + echo "Cleaning $NAME" + MYPIDP=`/bin/ps --no-headers -C ssd -o pid=` + if [ -z "$MYPIDP" ] ; then + if [ -f ${DHOME}/ssdp.pid ]; then + rm ${DHOME}/ssdp.pid + RETVAL=$? + if [ "$RETVAL" = "0" ]; then + echo "ssd is not running. rm'd ${DHOME}/ssdp.pid" + noop; + else + echo "Could not rm ${DHOME}/ssdp.pid" + echo "Since ssd is not running normal start should be possible." + noop; + fi + else + echo "ssd is not running. No ${DHOME}/ssdp.pid to rm." + fi + else + printf "The ssd is still running >${MYPIDP}< so did not rm ${DHOME}/ssdp.pid which " + if [ -f ${DHOME}/ssdp.pid ]; then + printf "does" + else + printf "does not" + fi + echo " exist." + noop; + fi + +# clean +} + +status(){ + + echo "Status of $NAME" + + MYPIDP=`/bin/ps --no-headers -C ssd -o pid=` + if [ "$MYPIDP" ] ; then + echo "The ssd is running as >${MYPIDP}<" + else + echo "The ssd is not running." + fi + makelogdir; + if [ -f ${DHOME}/ssdp.pid ]; then + MYPIDF=`cat ${DHOME}/ssdp.pid` + printf "${DHOME}/ssdp.pid exists and contains: >${MYPIDF}<\n" + if [ "$MYPIDP" != "$MYPIDF" ] ; then + printf "*** Alert: They don't agree!\n"; + fi + else + echo "${DHOME}/ssdp.pid does not exist." + fi + +# status +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + sleep 2 + start + ;; + clean) + clean + ;; + status) + status + ;; + *) + echo $"Usage: $NAME {start|stop|restart|clean|status}" + exit 1 +esac + +exit 0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/rePoll b/pos/is4c-nf/scale-drivers/drivers/rs232/rePoll new file mode 100644 index 000000000..0e46a3f27 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/rePoll @@ -0,0 +1,2 @@ +#!/bin/sh +echo -e "S14\r" > /dev/ttyS0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/setport b/pos/is4c-nf/scale-drivers/drivers/rs232/setport new file mode 100755 index 000000000..f5b0f83e7 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/setport @@ -0,0 +1,5 @@ +#!/bin/sh + +stty 9600 oddp -cstopb crtscts -F /dev/ttyS0 + + diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/ssd b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd new file mode 100755 index 000000000..748805d36 Binary files /dev/null and b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd differ diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/ssd.c b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd.c new file mode 100644 index 000000000..b09d596e4 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd.c @@ -0,0 +1,325 @@ +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + This is the preliminary daemon that effectively acts as part of the + driver for the single cable Magellan scanner scale on the Linux platform. + The settings for the serial port communication parameters are + based on the factory defaults for Magellan. The polling behaviour, + likewise is based on the technical specs for the Magellan. + Details are listed in the document scrs232.doc in the installation directory. + + In brief, what the daemon does is to listen in on the serial port + for in-coming data. It puts the last scanned input in + the file "/pos/is4c/rs232/scanner". + Similiarly it puts the last weight input in the + file "/pos/is4c/rs232/scale". + The pages chkscale.php and chkscanner check these + files and assign their contents to the appropriate global variables. + + To set up the daemon, compile ssd.c and arrange for it + to run at boot time. +*/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 5Aug12 EL Resolve conflict from merge from CORE. Hope I didn't wreck it. + * 18Apr12 EL This file must be writable by Apache/PHP because + * the lane Install page, Extra Config section: + * http://localhost/IS4C/pos/is4c-nf/install/extra_config.php + * removes "/var/www/IS4C/pos/is4c-nf/" from the scale and scanner + * paths to reduce them to the equivalent of ./, i.e. + * scale-drivers/drivers/rs232/ + * But the driver cannot be started/won't-run configured this way, + * so restore from commented versions below and re-compile. + * I wonder if this is why the lane app hasn't been able to do + * anything with scans and weights yet, i.e. doesn't seem to be + * aware of them. + * 14Apr12 EL Add comments. + * scale and scanner must exist, 666; this does not create them. + * 7Apr12 EL Remove ^M's + * Change locations of scale and scanner files. + +*/ + + +#include <sys/types.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <syslog.h> +#include <string.h> +#include <termios.h> /* POSIX terminal control definitions */ +#include <ctype.h> +/* is signal.h needed? */ + +#define SSD_SERIAL_PORT "/dev/ttyS0" +// +#define SCALE_OUTPUT_FILE "scale-drivers/drivers/rs232/scale" +//Restore this if the install page removes the path. +//define SCALE_OUTPUT_FILE "/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/scale" +#define SCANNER_OUTPUT_FILE "scale-drivers/drivers/rs232/scanner" +// +//Restore this if the install page removes the path. +//define SCANNER_OUTPUT_FILE "/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/scanner" + +int main(void) { + /* Our process ID and Session ID */ + pid_t pid, sid; + + /* Fork off the parent process */ + pid = fork(); + if (pid < 0) { + exit(EXIT_FAILURE); + } + + /* If we got a good PID, then we can exit the parent process. */ + if (pid > 0) { + exit(EXIT_SUCCESS); + } + + /* Change the file mode mask */ + umask(0); + + /* Create a new SID for the child process */ + sid = setsid(); + if (sid < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + /* Change the current working directory */ + if ((chdir("/")) < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + /* Close out the standard file descriptors */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + int open_port(void) { + int fd; /* File descriptor for the port */ + + fd = open(SSD_SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY); + + if (fd == -1) { + fprintf(stderr, "open_port: Unable to open /dev/ttyS0 - %s\n", + strerror(errno)); + } + + return (fd); + } + + int mainfd = 0; + int num, n; // File descriptor + char chout[16]; + char serialBuffer[100]; + char preBuffer[16]; // not used + char scannerInput[100]; + char scaleInput[9]; // not used + char scaleBuffer[9] = "000000000"; + struct termios options; + char serialInput; + mainfd = open_port(); + fcntl(mainfd, F_SETFL, FNDELAY); // Configure port reading + /* Get the current options for the port */ + tcgetattr(mainfd, &options); + cfsetispeed(&options, B9600); // Set the baud rates to 9600 + cfsetospeed(&options, B9600); + // Enable the receiver and set local mode + options.c_cflag |= (CLOCAL | CREAD); + /* 7 bits, odd parity */ + options.c_cflag |= PARENB; + options.c_cflag |= PARODD; // odd parity + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS7; + options.c_cflag |= CRTSCTS; + /* Enable data to be processed as raw input */ + options.c_lflag &= ~(ICANON | ECHO | ISIG); + /* Set the new options for the port */ + tcsetattr(mainfd, TCSANOW, &options); + FILE *fp_scanner; + FILE *fp_scale; + int in_buffer = 0; + int i; + n = 0; + num = 0; + + /* Poll the ss for weight data: */ + /* Send Scale Weight Request Command to ss. */ + write(mainfd, "S11\r", 5); + /* Send Scale Monitor Command to ss. */ + write(mainfd, "S14\r", 5); + + while (1) { + + /* Read 1, the next, character from ABU. EL: What is ABU? */ + // I don't understand the ampersand-chout syntax. + in_buffer = read(mainfd, &chout, 1); + + // if data could be read from the serial port ... + // '-1' is "error", apparently implies nothing in the port/handle to read. + if (in_buffer != -1) { + + /* If first char is S: + - Could be either scanner or scale + - Set index to accumulation buffer to origin + */ + if (chout[0] == 'S') { + num = 0; + } + + /* Put that char at the beginning of the input buffer. + Point to the next position in the input buffer. + */ + serialBuffer[num] = chout[0]; + num++; + + /* If the current char is LF, a termination, and + the accumulated response, including it, in serialBuffer is already 3+ chars. + -> Should this not also test for \r? + */ + if (chout[0] == '\n' && num > 2) { + + /* Terminate the input buffer with NUL + i.e. replace \n with NUL + */ + serialBuffer[num] = '\0'; + + /* If 2nd char in input buffer is "0" the data is from a barcode. */ + if (serialBuffer[1] == '0') { + + /**************** process scanned data ****************/ + /* What kind of a code is it? */ + if (serialBuffer[3] == 'A' || serialBuffer[3] == 'E' || serialBuffer[3] == 'F'){ + /* familar UPC A/E/F */ + /* Starting from the 5th byte of the raw scan + copy up to 17 chars into the scanner buffer. E.g. + Of: S08F789678545021, copy 789678545021 to the scanner buffer. + */ + for (i = 0; i < 17; i++) { + scannerInput[i] = serialBuffer[i+4]; + } + } + else if (serialBuffer[3] == 'R') { + + /* GS1 databar */ + scannerInput[0] = 'G'; + scannerInput[1] = 'S'; + scannerInput[2] = '1'; + scannerInput[3] = '~'; + scannerInput[4] = serialBuffer[3]; + scannerInput[5] = serialBuffer[4]; + + // Copy the rest of the input to the scanner buffer. + for (i=5; i <= num; i++) { + scannerInput[i+1] = serialBuffer[i]; + } + + } + else { + /* unknown barcode type */ + // Set scanner buffer to nul, empty. + scannerInput[0] = '\0'; + } + + // Write whatever is in the scanner buffer to the scanner file. + fp_scanner = fopen(SCANNER_OUTPUT_FILE, "w"); + fprintf(fp_scanner, "%s\n", scannerInput); + fclose(fp_scanner); + + // End of barcode handling. + } + + /* If 2nd input char is "1" the data is from a + Scale Weight or Scale Monitor Response. + */ + if (serialBuffer[1] == '1') { + + /**************** process weight data ******************/ + /* If 3rd char is 1 it is a Weight Request Response */ + if (serialBuffer[2] == '1') { + /* Send a Scale Monitor Command to the ss */ + write(mainfd, "S14\r", 5); + } + /* If 3rd char is 4 it is a Scale Monitor Request Response + and if 4th char is 3 the weight is Stable Zero + */ + else if (serialBuffer[2] == '4' && serialBuffer[3] == '3') { + /* Send a Scale Weight Request Command to the ss */ + write(mainfd, "S11\r", 5); + /* If x and y are not the same ... */ + if (strcmp(scaleBuffer, serialBuffer) != 0) { + /* ... write y to the scale-data file. */ + fp_scale = fopen(SCALE_OUTPUT_FILE, "w"); + fprintf(fp_scale, "%s\n", serialBuffer); + fclose(fp_scale); + } + } + /* If 3rd char is 4 it is a Scale Monitor Request Response + and the type-of-response is anything other than Stable Zero ... + */ + else if (serialBuffer[2] == '4') { + /* Send a Scale Monitor Command to the ss */ + write(mainfd, "S14\r", 5); + /* If x and y are not the same ... */ + if (strcmp(scaleBuffer, serialBuffer) != 0) { + /* ... write y to the scale-data file. */ + fp_scale = fopen(SCALE_OUTPUT_FILE, "w"); + fprintf(fp_scale, "%s\n", serialBuffer); + fclose(fp_scale); + } + } + + /* Then, for any type of Response + copy y into x. + */ + for (i = 0; i < 10; i++) { + scaleBuffer[i] = serialBuffer[i]; + } + + } /* weight data processing ends */ + + } /* termination-of-data processing ends */ + + } /* non-empty port buffer data processing ends */ + + // Why do this? + in_buffer = -1; + + /* sleep for 1 microsecond. One millionth. Not much sleep! + In fact no time, per http://www.delorie.com/djgpp/doc/libc/libc_844.html + Wonder what it is for. + */ + usleep(1); + + /* End of monitoring loop */ + } + + close(mainfd); + exit(EXIT_SUCCESS); + + +} diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/ssd.conf b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd.conf new file mode 100644 index 000000000..588608e9e --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd.conf @@ -0,0 +1,6 @@ +ConfFile ssd.conf +SerialPort /dev/ttyS0 +ScannerFile scanner +ScaleFile scale +LogFile ssd.log +PIDFile ssd.pid diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/ssd_wefc.c b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd_wefc.c new file mode 100644 index 000000000..b8ae700f1 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/ssd_wefc.c @@ -0,0 +1,323 @@ +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +******************************************************************************** + + This is the preliminary daemon that effectively acts as part of the + driver for the single cable Magellan scanner scale on the Linux platform. + The settings for the serial port communication parameters are + based on the factory defaults for Magellan. The polling behaviour, + likewise is based on the technical specs for the Magellan. + Details are listed in the document scrs232.doc in the installation directory. + + In brief, what the daemon does is to listen in on the serial port + for in-coming data. It puts the last scanned input in + the file "/pos/is4c/rs232/scanner". + Similiarly it puts the last weight input in the + file "/pos/is4c/rs232/scale". + The pages chkscale.php and chkscanner check these + files and assign their contents to the appropriate global variables. + + To set up the daemon, compile ssd.c and arrange for it + to run at boot time. +*/ + +/* --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - - + + * 18Apr12 EL This file must be writable by Apache/PHP because + * the lane Install page, Extra Config section: + * http://localhost/IS4C/pos/is4c-nf/install/extra_config.php + * removes "/var/www/IS4C/pos/is4c-nf/" from the scale and scanner + * paths to reduce them to the equivalent of ./, i.e. + * scale-drivers/drivers/rs232/ + * But the driver cannot be started/won't-run configured this way, + * so restore from commented versions below and re-compile. + * I wonder if this is why the lane app hasn't been able to do + * anything with scans and weights yet, i.e. doesn't seem to be + * aware of them. + * 14Apr12 EL Add comments. + * scale and scanner must exist, 666; this does not create them. + * 7Apr12 EL Remove ^M's + * Change locations of scale and scanner files. + +*/ + + +#include <sys/types.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <syslog.h> +#include <string.h> +#include <termios.h> /* POSIX terminal control definitions */ +#include <ctype.h> + +#define SSD_SERIAL_PORT "/dev/ttyS0" +// +#define SCALE_OUTPUT_FILE "scale-drivers/drivers/rs232/scale" +//Restore this if the install page removes the path. +//define SCALE_OUTPUT_FILE "/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/scale" +#define SCANNER_OUTPUT_FILE "scale-drivers/drivers/rs232/scanner" +// +//Restore this if the install page removes the path. +//define SCANNER_OUTPUT_FILE "/var/www/IS4C/pos/is4c-nf/scale-drivers/drivers/rs232/scanner" + +int main(void) { + /* Our process ID and Session ID */ + pid_t pid, sid; + + /* Fork off the parent process */ + pid = fork(); + if (pid < 0) { + exit(EXIT_FAILURE); + } + + /* If we got a good PID, then we can exit the parent process. */ + if (pid > 0) { + exit(EXIT_SUCCESS); + } + + /* Change the file mode mask */ + umask(0); + + /* Create a new SID for the child process */ + sid = setsid(); + if (sid < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + /* Change the current working directory */ + if ((chdir("/")) < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + /* Close out the standard file descriptors */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + int open_port(void) { + int fd; /* File descriptor for the port */ + + fd = open(SSD_SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY); + + if (fd == -1) { + fprintf(stderr, "open_port: Unable to open /dev/ttyS0 - %s\n", + strerror(errno)); + } + + return (fd); + } + + int mainfd = 0; + int num, n; // File descriptor + char chout[16]; + char serialBuffer[100]; + char preBuffer[16]; // not used + char scannerInput[100]; + char scaleInput[9]; // not used + char scaleBuffer[9] = "000000000"; + struct termios options; + char serialInput; + mainfd = open_port(); + fcntl(mainfd, F_SETFL, FNDELAY); // Configure port reading + /* Get the current options for the port */ + tcgetattr(mainfd, &options); + cfsetispeed(&options, B9600); // Set the baud rates to 9600 + cfsetospeed(&options, B9600); + // Enable the receiver and set local mode + options.c_cflag |= (CLOCAL | CREAD); + /* 7 bits, odd parity */ + options.c_cflag |= PARENB; + options.c_cflag |= PARODD; // odd parity + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS7; + options.c_cflag |= CRTSCTS; + /* Enable data to be processed as raw input */ + options.c_lflag &= ~(ICANON | ECHO | ISIG); + /* Set the new options for the port */ + tcsetattr(mainfd, TCSANOW, &options); + FILE *fp_scanner; + FILE *fp_scale; + int in_buffer = 0; + int i; + n = 0; + num = 0; + + /* Poll the ss for weight data: */ + /* Send Scale Weight Request Command to ss. */ + write(mainfd, "S11\r", 5); + /* Send Scale Monitor Command to ss. */ + write(mainfd, "S14\r", 5); + + while (1) { + + /* Read 1, the next, character from ABU. EL: What is ABU? */ + // I don't understand the ampersand-chout syntax. + in_buffer = read(mainfd, &chout, 1); + + // if data could be read from the serial port ... + // '-1' is "error", apparently implies nothing in the port/handle to read. + if (in_buffer != -1) { + + /* If first char is S: + - Could be either scanner or scale + - Set index to accumulation buffer to origin + */ + if (chout[0] == 'S') { + num = 0; + } + + /* Put that char at the beginning of the input buffer. + Point to the next position in the input buffer. + */ + serialBuffer[num] = chout[0]; + num++; + + /* If the current char is LF, a termination, and + the accumulated response, including it, in serialBuffer is already 3+ chars. + -> Should this not also test for \r? + */ + if (chout[0] == '\n' && num > 2) { + + /* Terminate the input buffer with NUL + i.e. replace \n with NUL + */ + serialBuffer[num] = '\0'; + + /* If 2nd char in input buffer is "0" the data is from a barcode. */ + if (serialBuffer[1] == '0') { + + /**************** process scanned data ****************/ + /* What kind of a code is it? */ + if (serialBuffer[3] == 'A' || serialBuffer[3] == 'E' || serialBuffer[3] == 'F'){ + /* familar UPC A/E/F */ + /* Starting from the 5th byte of the raw scan + copy up to 17 chars into the scanner buffer. E.g. + Of: S08F789678545021, copy 789678545021 to the scanner buffer. + /* + for (i = 0; i < 17; i++) { + scannerInput[i] = serialBuffer[i+4]; + } + } + else if (serialBuffer[3] == 'R') { + + /* GS1 databar */ + scannerInput[0] = 'G'; + scannerInput[1] = 'S'; + scannerInput[2] = '1'; + scannerInput[3] = '~'; + scannerInput[4] = serialBuffer[3]; + scannerInput[5] = serialBuffer[4]; + + // Copy the rest of the input to the scanner buffer. + for (i=5; i <= num; i++) { + scannerInput[i+1] = serialBuffer[i]; + } + + } + else { + /* unknown barcode type */ + // Set scanner buffer to nul, empty. + scannerInput[0] = '\0'; + } + + // Write whatever is in the scanner buffer to the scanner file. + fp_scanner = fopen(SCANNER_OUTPUT_FILE, "w"); + fprintf(fp_scanner, "%s\n", scannerInput); + fclose(fp_scanner); + + // End of barcode handling. + } + + /* If 2nd input char is "1" the data is from a + Scale Weight or Scale Monitor Response. + */ + if (serialBuffer[1] == '1') { + + /**************** process weight data ******************/ + /* If 3rd char is 1 it is a Weight Request Response */ + if (serialBuffer[2] == '1') { + /* Send a Scale Monitor Command to the ss */ + write(mainfd, "S14\r", 5); + } + /* If 3rd char is 4 it is a Scale Monitor Request Response + and if 4th char is 3 the weight is Stable Zero + */ + else if (serialBuffer[2] == '4' && serialBuffer[3] == '3') { + /* Send a Scale Weight Request Command to the ss */ + write(mainfd, "S11\r", 5); + /* If x and y are not the same ... */ + if (strcmp(scaleBuffer, serialBuffer) != 0) { + /* ... write y to the scale-data file. */ + fp_scale = fopen(SCALE_OUTPUT_FILE, "w"); + fprintf(fp_scale, "%s\n", serialBuffer); + fclose(fp_scale); + } + } + /* If 3rd char is 4 it is a Scale Monitor Request Response + and the type-of-response is anything other than Stable Zero ... + */ + else if (serialBuffer[2] == '4') { + /* Send a Scale Monitor Command to the ss */ + write(mainfd, "S14\r", 5); + /* If x and y are not the same ... */ + if (strcmp(scaleBuffer, serialBuffer) != 0) { + /* ... write y to the scale-data file. */ + fp_scale = fopen(SCALE_OUTPUT_FILE, "w"); + fprintf(fp_scale, "%s\n", serialBuffer); + fclose(fp_scale); + } + } + + /* Then, for any type of Response + copy y into x. + */ + for (i = 0; i < 10; i++) { + scaleBuffer[i] = serialBuffer[i]; + } + + } /* weight data processing ends */ + + } /* termination-of-data processing ends */ + + } /* non-empty port buffer data processing ends */ + + // Why do this? + in_buffer = -1; + + /* sleep for 1 microsecond. One millionth. Not much sleep! + In fact no time, per http://www.delorie.com/djgpp/doc/libc/libc_844.html + Wonder what it is for. + */ + usleep(1); + + /* End of monitoring loop */ + } + + close(mainfd); + exit(EXIT_SUCCESS); +} diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/twoPairs b/pos/is4c-nf/scale-drivers/drivers/rs232/twoPairs new file mode 100644 index 000000000..ed8bff572 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/twoPairs @@ -0,0 +1,10 @@ +#!/bin/sh + +sleep 0.3 +echo -e "S334\r" > /dev/ttyS0 +sleep 0.1 +echo -e "S334\r" > /dev/ttyS0 +sleep 0.3 +echo -e "S334\r" > /dev/ttyS0 +sleep 0.1 +echo -e "S334\r" > /dev/ttyS0 diff --git a/pos/is4c-nf/scale-drivers/drivers/rs232/wakeup b/pos/is4c-nf/scale-drivers/drivers/rs232/wakeup new file mode 100644 index 000000000..5422d21ed --- /dev/null +++ b/pos/is4c-nf/scale-drivers/drivers/rs232/wakeup @@ -0,0 +1,4 @@ +#!/bin/sh + +echo -e "S11\r" > /dev/ttyS0 +echo -e "S14\r" > /dev/ttyS0 diff --git a/pos/is4c-nf/scale-drivers/php-wrappers/NM_Ingenico.php b/pos/is4c-nf/scale-drivers/php-wrappers/NM_Ingenico.php new file mode 100644 index 000000000..325b0c51a --- /dev/null +++ b/pos/is4c-nf/scale-drivers/php-wrappers/NM_Ingenico.php @@ -0,0 +1,83 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +class NM_Ingenico extends ScaleDriverWrapper { + + function ReadFromScale(){ + global $CORE_LOCAL; + $rel = MiscLib::base_url(); + + $input = ""; + $readdir = $rel.'scale-drivers/drivers/NewMagellan/cc-output'; + $dh = opendir($readdir); + + while (false !== ($fn = readdir($dh))) { + if (is_dir($readdir."/".$fn)) continue; + $data = file_get_contents($readdir."/".$fn); + unlink($readdir."/".$fn); + $line = rtrim($data,"\r\n"); + if (empty($line)) continue; + $input = $line; + break; + } + + $output = array(); + if (!empty($input)) $output['scans'] = $input; + + if (!empty($output)) echo JsonLib::array_to_json($output); + else echo "{}"; + } + + function poll($msg){ + $res = UdpConn::udpPoke($msg); + return $res; + } + + function getpath(){ + $rel = MiscLib::base_url(); + return $rel.'scale-drivers/drivers/NewMagellan/'; + } + + /* just wraps UDP send because commands + ARE case-sensitive on the c# side */ + function WriteToScale($str){ + + if (strlen($str) > 8 && substr($str,0,8)=="display:"){} + else // don't change case on display messages + $str = strtolower($str); + + if (substr($str,0,6) == "total:" && strlen($str) > 6) + UdpConn::udpSend($str); + elseif (substr($str,0,11) == "resettotal:" && strlen($str) > 11) + UdpConn::udpSend($str); + elseif (substr($str,0,9) == "approval:" && strlen($str) > 9) + UdpConn::udpSend($str); + elseif (substr($str,0,8) == "display:" && strlen($str) > 8) + UdpConn::udpSend($str); + elseif ($str == "reset") + UdpConn::udpSend($str); + elseif ($str == "sig") + UdpConn::udpSend($str); + } +} + +?> diff --git a/pos/is4c-nf/scale-drivers/php-wrappers/NewMagellan.php b/pos/is4c-nf/scale-drivers/php-wrappers/NewMagellan.php new file mode 100644 index 000000000..f37bbed45 --- /dev/null +++ b/pos/is4c-nf/scale-drivers/php-wrappers/NewMagellan.php @@ -0,0 +1,172 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +class NewMagellan extends ScaleDriverWrapper { + + function SavePortConfiguration($portName){ + $rel = MiscLib::base_url(); + + /* read in config file */ + $fp = fopen($rel."scale-drivers/drivers/NewMagellan/ports.conf","r"); + $lines = array(); + while(!feof($fp)) $lines[] = fgets($fp); + fclose($fp); + + /* replace port setting */ + $fp = fopen($rel."scale-drivers/drivers/NewMagellan/ports.conf","w"); + if ($fp){ + foreach($lines as $l){ + if (strstr($l,"SPH_Magellan_Scale") === False) fwrite($fp,$l); + else { + fwrite($fp,sprintf('%s SPH_Magellan_Scale',$portName)); + fwrite($fp,"\n"); + } + } + fclose($fp); + } + } + + function SaveDirectoryConfiguration($absPath){ + $rel = MiscLib::base_url(); + + /* read in c# code file */ + $fp = fopen($rel."scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs","r"); + $lines = array(); + while(!feof($fp)) $lines[] = fgets($fp); + fclose($fp); + + /* replace file location #defines */ + $fp = fopen($rel."scale-drivers/drivers/NewMagellan/SPH_Magellan_Scale.cs","w"); + if ($fp){ + foreach($lines as $l){ + if (strstr($l,"static String MAGELLAN_OUTPUT_FILE ") !== False){ + fwrite($fp,sprintf('private static String MAGELLAN_OUTPUT_FILE = "%s";', + $absPath."scale-drivers/drivers/NewMagellan/scanner-scale.data")); + fwrite($fp,"\n"); + } + elseif (strstr($l,"static String MAGELLAN_LOCK_FILE ") !== False){ + fwrite($fp,sprintf('private static String MAGELLAN_LOCK_FILE = "%s";', + $absPath."scale-drivers/drivers/NewMagellan/scanner-scale.lock")); + fwrite($fp,"\n"); + } + else fwrite($fp,$l); + } + fclose($fp); + } + } + + function ReadFromScale(){ + global $CORE_LOCAL; + $rel = MiscLib::base_url(); + + $readfile = $rel.'scale-drivers/drivers/NewMagellan/scanner-scale'; + $readdir = $rel.'scale-drivers/drivers/NewMagellan/ss-output'; + $scale_display = ""; + $scans = array(); + /* + if (file_exists($readfile.".data") && !file_exists($readfile.".lock")){ + + $fp = fopen($readfile.".lock","w"); + fclose($fp); + + $data = file_get_contents($readfile.".data"); + + unlink($readfile.".data"); + unlink($readfile.".lock"); + + foreach(explode("\n",$data) as $line){ + $line = rtrim($line,"\r"); // in case OS adds it + if (empty($line)) continue; + if ($line[0] == 'S'){ + $scale_display = scaledisplaymsg($line); + } + else { + $scans[] = $line; + } + } + } + */ + $files = scandir($readdir); + foreach($files as $fn){ + if (is_dir($readdir."/".$fn)) continue; + $data = file_get_contents($readdir."/".$fn); + unlink($readdir."/".$fn); + $line = rtrim($data,"\r\n"); + if (empty($line)) continue; + if ($line[0] == 'S'){ + $scale_display = DisplayLib::scaledisplaymsg($line); + if (is_array($scale_display)){ + if (isset($scale_display['upc'])) + $scans[] = $scale_display['upc']; + $scale_display = $scale_display['display']; + } + } + else { + $scans[] = $line; + } + break; + } + + $output = array(); + if (!empty($scale_display)) $output['scale'] = $scale_display; + if (!empty($scans)) $output['scans'] = ltrim($scans[0],'0'); + + if (!empty($output)) echo JsonLib::array_to_json($output); + else echo "{}"; + } + + function ReadReset(){ + $rel = MiscLib::base_url(); + $readdir = $rel.'scale-drivers/drivers/NewMagellan/ss-output'; + $dh = opendir($readdir); + while (false !== ($fn = readdir($dh))) { + if (is_dir($readdir."/".$fn)) continue; + unlink($readdir."/".$fn); + } + closedir($dh); + $this->WriteToScale('rePoll'); + } + + /* just wraps UDP send because commands + ARE case-sensitive on the c# side */ + function WriteToScale($str){ + switch(strtolower($str)){ + case 'goodbeep': + UdpComm::udpSend('goodBeep'); + break; + case 'errorbeep': + UdpComm::udpSend('errorBeep'); + break; + case 'twopairs': + UdpComm::udpSend('twoPairs'); + break; + case 'repoll': + UdpComm::udpSend('rePoll'); + break; + case 'wakeup': + UdpComm::udpSend('wakeup'); + break; + } + } +} + +?> diff --git a/pos/is4c-nf/scale-drivers/php-wrappers/ScaleDriverWrapper.php b/pos/is4c-nf/scale-drivers/php-wrappers/ScaleDriverWrapper.php new file mode 100644 index 000000000..0f0a2f71a --- /dev/null +++ b/pos/is4c-nf/scale-drivers/php-wrappers/ScaleDriverWrapper.php @@ -0,0 +1,98 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/** @class ScaleDriverWrapper + PHP Module for talking to hardware + + This class deals with reading and writing + to hardware devices that PHP can't talk to + directly. Normally this means "scanner scale". + All drivers should provide a ScaleDriverWrapper + subclass. + + Modules that extend this class must at least define + ReadFromScale and WriteToScale. +*/ + +class ScaleDriverWrapper { + + /** + This method updates the driver code + or configuration with the specified port name. + @param $portName a serial port device name + e.g., /dev/ttyS0 or COM1 + <b>Not used much</b> + In practice it's kind of a mess. The driver code + has to be browser-writable for this to work + and in many cases the driver also needs to be + recompiled. Browser-based driver configuration + just doesn't work very well, so if your + implementation skips this method that's probably + fine. + */ + function SavePortConfiguration($portName){} + + /** + This method updates the driver code or configuration + with the specified path + @param $absPath is the top of IT CORE, should have + trailing slash + <b>not used much</b> + See the SavePortConfiguration() method for details. + */ + function SaveDirectoryConfiguration($absPath){} + + /** + Reads available scale and scanner input + Function should print a JSON object with two fields: + 'scale' is an HTML string to display current scale weight/status + 'scans' is a string representing a UPC + Use scaledisplaymsg() to generate scale HTML. This ensures + appropriate weight-related session variables are + updated. + */ + function ReadFromScale(){} + + /** + Sends output to the scale. + @param $str the output + Currently supported messages (not case sensitive): + 1. goodBeep + 2. errorBeep + 3. twoPairs + 4. rePoll + 5. wakeup + */ + function WriteToScale($str){} + + /** Clear all pending input + + If the driver has been running in the backgounrd + and the browser hasn't, there could be a lot of + accumulated weight data. POS uses this method + to discard everything on startup. + */ + function ReadReset(){} + +} + +?> diff --git a/pos/is4c-nf/scale-drivers/php-wrappers/ssd.php b/pos/is4c-nf/scale-drivers/php-wrappers/ssd.php new file mode 100644 index 000000000..416b4290c --- /dev/null +++ b/pos/is4c-nf/scale-drivers/php-wrappers/ssd.php @@ -0,0 +1,146 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IT CORE. + + IT CORE is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IT CORE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IT CORE; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +class ssd extends ScaleDriverWrapper { + + function SavePortConfiguration($portName){ + $rel = MiscLib::base_url(); + + if (!file_exists($rel."scale-drivers/drivers/rs232/ssd.conf")) return; + + /* read in config file */ + $fp = fopen($rel."scale-drivers/drivers/rs232/ssd.conf","r"); + $lines = array(); + while(!feof($fp)) $lines[] = fgets($fp); + fclose($fp); + + /* replace SerialPort config */ + $fp = fopen($rel."scale-drivers/drivers/rs232/ssd.conf","w"); + foreach($lines as $l){ + if (strstr($l,"SerialPort ") === False) fwrite($fp,$l); + else { + fwrite($fp,sprintf('SerialPort %s',$portName)); + fwrite($fp,"\n"); + } + } + fclose($fp); + } + + function SaveDirectoryConfiguration($absPath){ + $rel = MiscLib::base_url(); + + if (!file_exists($rel."scale-drivers/drivers/rs232/ssd.conf")) return; + + /* read in config file */ + $fp = fopen($rel."scale-drivers/drivers/rs232/ssd.conf","r"); + + $lines = array(); + while(!feof($fp)) $lines[] = fgets($fp); + fclose($fp); + + /* replace file location config */ + $fp = fopen($rel."scale-drivers/drivers/rs232/ssd.conf","w"); + foreach($lines as $l){ + if (strstr($l,"ScannerFile ") !== False){ + fwrite($fp,sprintf('ScannerFile %s', + $absPath."scale-drivers/drivers/rs232/scale")); + fwrite($fp,"\n"); + } + elseif (strstr($l,"ScaleFile ") !== False){ + fwrite($fp,sprintf('ScaleFile %s', + $absPath."scale-drivers/drivers/rs232/scanner")); + fwrite($fp,"\n"); + } + else fwrite($fp,$l); + } + fclose($fp); + } + + function ReadFromScale(){ + global $CORE_LOCAL; + $rel = MiscLib::base_url(); + + $scale_data = file_get_contents($rel.'scale-drivers/drivers/rs232/scale'); + $fp = fopen($rel.'scale-drivers/drivers/rs232/scale','w'); + fclose($fp); + + $scan_data = file_get_contents($rel.'scale-drivers/drivers/rs232/scanner'); + $fp = fopen($rel.'scale-drivers/drivers/rs232/scanner','w'); + fclose($fp); + + $scale_display = ''; + $scans = array(); + if ($scale_data !== False && !empty($scale_data)){ + $scale_display = DisplayLib::scaledisplaymsg($scale_data); + if (is_array($scale_display)){ + if (isset($scale_display['upc'])) + $scans[] = $scale_display['upc']; + $scale_display = $scale_display['display']; + } + } + if ($scan_data !== False && !empty($scan_data)) + $scans[] = $scan_data; + + $output = array(); + if (!empty($scale_display)) $output['scale'] = $scale_display; + if (!empty($scans)) $output['scans'] = ltrim($scans[0],'0'); + + if (!empty($output)) echo JsonLib::array_to_json($output); + else echo "{}"; + } + + function WriteToScale($str){ + global $CORE_LOCAL; + $port = $CORE_LOCAL->get("scalePort"); + + switch(strtolower($str)){ + case 'goodbeep': + system('echo -e "S334\r" > '.$port); + break; + case 'errorbeep': + system('echo -e "S334\r" > '.$port); + usleep(100); + system('echo -e "S334\r" > '.$port); + usleep(100); + system('echo -e "S334\r" > '.$port); + break; + case 'twopairs': + system('echo -e "S334\r" > '.$port); + usleep(100); + system('echo -e "S334\r" > '.$port); + usleep(300); + system('echo -e "S334\r" > '.$port); + usleep(100); + system('echo -e "S334\r" > '.$port); + break; + case 'repoll': + system('echo -e "S14\r" > '.$port); + break; + case 'wakeup': + system('echo -e "S11\r" > '.$port); + system('echo -e "S14\r" > '.$port); + break; + } + } +} + +?> diff --git a/pos/is4c-nf/sync.bat b/pos/is4c-nf/sync.bat new file mode 100644 index 000000000..1784d976e --- /dev/null +++ b/pos/is4c-nf/sync.bat @@ -0,0 +1,3 @@ +cls + +C:\PHP\php-cli C:\IS4C\sync.php diff --git a/pos/is4c-nf/test/apc.php b/pos/is4c-nf/test/apc.php new file mode 100755 index 000000000..9795bf21c --- /dev/null +++ b/pos/is4c-nf/test/apc.php @@ -0,0 +1,1362 @@ +<?php +/* + +----------------------------------------------------------------------+ + | APC | + +----------------------------------------------------------------------+ + | Copyright (c) 2006-2011 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Ralf Becker <beckerr@php.net> | + | Rasmus Lerdorf <rasmus@php.net> | + | Ilia Alshanetsky <ilia@prohost.org> | + +----------------------------------------------------------------------+ + + All other licensing and usage conditions are those of the PHP Group. + + */ + +$VERSION='$Id: apc.php 307048 2011-01-03 23:53:17Z kalle $'; + +////////// READ OPTIONAL CONFIGURATION FILE //////////// +if (file_exists("apc.conf.php")) include("apc.conf.php"); +//////////////////////////////////////////////////////// + +////////// BEGIN OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////// + +defaults('USE_AUTHENTICATION',1); // Use (internal) authentication - best choice if + // no other authentication is available + // If set to 0: + // There will be no further authentication. You + // will have to handle this by yourself! + // If set to 1: + // You need to change ADMIN_PASSWORD to make + // this work! +defaults('ADMIN_USERNAME','apc'); // Admin Username +defaults('ADMIN_PASSWORD','a8j8'); // Admin Password - CHANGE THIS TO ENABLE!!! + +// (beckerr) I'm using a clear text password here, because I've no good idea how to let +// users generate a md5 or crypt password in a easy way to fill it in above + +//defaults('DATE_FORMAT', "d.m.Y H:i:s"); // German +defaults('DATE_FORMAT', 'Y/m/d H:i:s'); // US + +defaults('GRAPH_SIZE',200); // Image size + +//defaults('PROXY', 'tcp://127.0.0.1:8080'); + +////////// END OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////// + + +// "define if not defined" +function defaults($d,$v) { + if (!defined($d)) define($d,$v); // or just @define(...) +} + +// rewrite $PHP_SELF to block XSS attacks +// +$PHP_SELF= isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'],''), ENT_QUOTES, 'UTF-8') : ''; +$time = time(); +$host = php_uname('n'); +if($host) { $host = '('.$host.')'; } +if (isset($_SERVER['SERVER_ADDR'])) { + $host .= ' ('.$_SERVER['SERVER_ADDR'].')'; +} + +// operation constants +define('OB_HOST_STATS',1); +define('OB_SYS_CACHE',2); +define('OB_USER_CACHE',3); +define('OB_SYS_CACHE_DIR',4); +define('OB_VERSION_CHECK',9); + +// check validity of input variables +$vardom=array( + 'OB' => '/^\d+$/', // operational mode switch + 'CC' => '/^[01]$/', // clear cache requested + 'DU' => '/^.*$/', // Delete User Key + 'SH' => '/^[a-z0-9]+$/', // shared object description + + 'IMG' => '/^[123]$/', // image to generate + 'LO' => '/^1$/', // login requested + + 'COUNT' => '/^\d+$/', // number of line displayed in list + 'SCOPE' => '/^[AD]$/', // list view scope + 'SORT1' => '/^[AHSMCDTZ]$/', // first sort key + 'SORT2' => '/^[DA]$/', // second sort key + 'AGGR' => '/^\d+$/', // aggregation by dir level + 'SEARCH' => '~^[a-zA-Z0-1/_.-]*$~' // aggregation by dir level +); + +// default cache mode +$cache_mode='opcode'; + +// cache scope +$scope_list=array( + 'A' => 'cache_list', + 'D' => 'deleted_list' +); + +// handle POST and GET requests +if (empty($_REQUEST)) { + if (!empty($_GET) && !empty($_POST)) { + $_REQUEST = array_merge($_GET, $_POST); + } else if (!empty($_GET)) { + $_REQUEST = $_GET; + } else if (!empty($_POST)) { + $_REQUEST = $_POST; + } else { + $_REQUEST = array(); + } +} + +// check parameter syntax +foreach($vardom as $var => $dom) { + if (!isset($_REQUEST[$var])) { + $MYREQUEST[$var]=NULL; + } else if (!is_array($_REQUEST[$var]) && preg_match($dom.'D',$_REQUEST[$var])) { + $MYREQUEST[$var]=$_REQUEST[$var]; + } else { + $MYREQUEST[$var]=$_REQUEST[$var]=NULL; + } +} + +// check parameter sematics +if (empty($MYREQUEST['SCOPE'])) $MYREQUEST['SCOPE']="A"; +if (empty($MYREQUEST['SORT1'])) $MYREQUEST['SORT1']="H"; +if (empty($MYREQUEST['SORT2'])) $MYREQUEST['SORT2']="D"; +if (empty($MYREQUEST['OB'])) $MYREQUEST['OB']=OB_HOST_STATS; +if (!isset($MYREQUEST['COUNT'])) $MYREQUEST['COUNT']=20; +if (!isset($scope_list[$MYREQUEST['SCOPE']])) $MYREQUEST['SCOPE']='A'; + +$MY_SELF= + "$PHP_SELF". + "?SCOPE=".$MYREQUEST['SCOPE']. + "&SORT1=".$MYREQUEST['SORT1']. + "&SORT2=".$MYREQUEST['SORT2']. + "&COUNT=".$MYREQUEST['COUNT']; +$MY_SELF_WO_SORT= + "$PHP_SELF". + "?SCOPE=".$MYREQUEST['SCOPE']. + "&COUNT=".$MYREQUEST['COUNT']; + +// authentication needed? +// +if (!USE_AUTHENTICATION) { + $AUTHENTICATED=1; +} else { + $AUTHENTICATED=0; + if (ADMIN_PASSWORD!='password' && ($MYREQUEST['LO'] == 1 || isset($_SERVER['PHP_AUTH_USER']))) { + + if (!isset($_SERVER['PHP_AUTH_USER']) || + !isset($_SERVER['PHP_AUTH_PW']) || + $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME || + $_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) { + Header("WWW-Authenticate: Basic realm=\"APC Login\""); + Header("HTTP/1.0 401 Unauthorized"); + + echo <<<EOB + <html><body> + <h1>Rejected!</h1> + <big>Wrong Username or Password!</big><br/>&nbsp;<br/>&nbsp; + <big><a href='$PHP_SELF?OB={$MYREQUEST['OB']}'>Continue...</a></big> + </body></html> +EOB; + exit; + + } else { + $AUTHENTICATED=1; + } + } +} + +// select cache mode +if ($AUTHENTICATED && $MYREQUEST['OB'] == OB_USER_CACHE) { + $cache_mode='user'; +} +// clear cache +if ($AUTHENTICATED && isset($MYREQUEST['CC']) && $MYREQUEST['CC']) { + apc_clear_cache($cache_mode); +} + +if ($AUTHENTICATED && !empty($MYREQUEST['DU'])) { + apc_delete($MYREQUEST['DU']); +} + +if(!function_exists('apc_cache_info') || !($cache=@apc_cache_info($cache_mode))) { + echo "No cache info available. APC does not appear to be running."; + exit; +} + +$cache_user = apc_cache_info('user', 1); +$mem=apc_sma_info(); +if(!$cache['num_hits']) { $cache['num_hits']=1; $time++; } // Avoid division by 0 errors on a cache clear + +// don't cache this page +// +header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1 +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); // HTTP/1.0 + +function duration($ts) { + global $time; + $years = (int)((($time - $ts)/(7*86400))/52.177457); + $rem = (int)(($time-$ts)-($years * 52.177457 * 7 * 86400)); + $weeks = (int)(($rem)/(7*86400)); + $days = (int)(($rem)/86400) - $weeks*7; + $hours = (int)(($rem)/3600) - $days*24 - $weeks*7*24; + $mins = (int)(($rem)/60) - $hours*60 - $days*24*60 - $weeks*7*24*60; + $str = ''; + if($years==1) $str .= "$years year, "; + if($years>1) $str .= "$years years, "; + if($weeks==1) $str .= "$weeks week, "; + if($weeks>1) $str .= "$weeks weeks, "; + if($days==1) $str .= "$days day,"; + if($days>1) $str .= "$days days,"; + if($hours == 1) $str .= " $hours hour and"; + if($hours>1) $str .= " $hours hours and"; + if($mins == 1) $str .= " 1 minute"; + else $str .= " $mins minutes"; + return $str; +} + +// create graphics +// +function graphics_avail() { + return extension_loaded('gd'); +} +if (isset($MYREQUEST['IMG'])) +{ + if (!graphics_avail()) { + exit(0); + } + + function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$color2,$text='',$placeindex=0) { + $r=$diameter/2; + $w=deg2rad((360+$start+($end-$start)/2)%360); + + + if (function_exists("imagefilledarc")) { + // exists only if GD 2.0.1 is avaliable + imagefilledarc($im, $centerX+1, $centerY+1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE); + imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE); + imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL|IMG_ARC_EDGED); + } else { + imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start+1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end-1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2); + imagefill($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2, $color2); + } + if ($text) { + if ($placeindex>0) { + imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); + imagestring($im,4,$diameter, $placeindex*12,$text,$color1); + + } else { + imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); + } + } + } + + function text_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$text,$placeindex=0) { + $r=$diameter/2; + $w=deg2rad((360+$start+($end-$start)/2)%360); + + if ($placeindex>0) { + imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); + imagestring($im,4,$diameter, $placeindex*12,$text,$color1); + + } else { + imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); + } + } + + function fill_box($im, $x, $y, $w, $h, $color1, $color2,$text='',$placeindex='') { + global $col_black; + $x1=$x+$w-1; + $y1=$y+$h-1; + + imagerectangle($im, $x, $y1, $x1+1, $y+1, $col_black); + if($y1>$y) imagefilledrectangle($im, $x, $y, $x1, $y1, $color2); + else imagefilledrectangle($im, $x, $y1, $x1, $y, $color2); + imagerectangle($im, $x, $y1, $x1, $y, $color1); + if ($text) { + if ($placeindex>0) { + + if ($placeindex<16) + { + $px=5; + $py=$placeindex*12+6; + imagefilledrectangle($im, $px+90, $py+3, $px+90-4, $py-3, $color2); + imageline($im,$x,$y+$h/2,$px+90,$py,$color2); + imagestring($im,2,$px,$py-6,$text,$color1); + + } else { + if ($placeindex<31) { + $px=$x+40*2; + $py=($placeindex-15)*12+6; + } else { + $px=$x+40*2+100*intval(($placeindex-15)/15); + $py=($placeindex%15)*12+6; + } + imagefilledrectangle($im, $px, $py+3, $px-4, $py-3, $color2); + imageline($im,$x+$w,$y+$h/2,$px,$py,$color2); + imagestring($im,2,$px+2,$py-6,$text,$color1); + } + } else { + imagestring($im,4,$x+5,$y1-16,$text,$color1); + } + } + } + + + $size = GRAPH_SIZE; // image size + if ($MYREQUEST['IMG']==3) + $image = imagecreate(2*$size+150, $size+10); + else + $image = imagecreate($size+50, $size+10); + + $col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); + $col_red = imagecolorallocate($image, 0xD0, 0x60, 0x30); + $col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60); + $col_black = imagecolorallocate($image, 0, 0, 0); + imagecolortransparent($image,$col_white); + + switch ($MYREQUEST['IMG']) { + + case 1: + $s=$mem['num_seg']*$mem['seg_size']; + $a=$mem['avail_mem']; + $x=$y=$size/2; + $fuzz = 0.000001; + + // This block of code creates the pie chart. It is a lot more complex than you + // would expect because we try to visualize any memory fragmentation as well. + $angle_from = 0; + $string_placement=array(); + for($i=0; $i<$mem['num_seg']; $i++) { + $ptr = 0; + $free = $mem['block_lists'][$i]; + uasort($free, 'block_sort'); + foreach($free as $block) { + if($block['offset']!=$ptr) { // Used block + $angle_to = $angle_from+($block['offset']-$ptr)/$s; + if(($angle_to+$fuzz)>1) $angle_to = 1; + if( ($angle_to*360) - ($angle_from*360) >= 1) { + fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red); + if (($angle_to-$angle_from)>0.05) { + array_push($string_placement, array($angle_from,$angle_to)); + } + } + $angle_from = $angle_to; + } + $angle_to = $angle_from+($block['size'])/$s; + if(($angle_to+$fuzz)>1) $angle_to = 1; + if( ($angle_to*360) - ($angle_from*360) >= 1) { + fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_green); + if (($angle_to-$angle_from)>0.05) { + array_push($string_placement, array($angle_from,$angle_to)); + } + } + $angle_from = $angle_to; + $ptr = $block['offset']+$block['size']; + } + if ($ptr < $mem['seg_size']) { // memory at the end + $angle_to = $angle_from + ($mem['seg_size'] - $ptr)/$s; + if(($angle_to+$fuzz)>1) $angle_to = 1; + fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red); + if (($angle_to-$angle_from)>0.05) { + array_push($string_placement, array($angle_from,$angle_to)); + } + } + } + foreach ($string_placement as $angle) { + text_arc($image,$x,$y,$size,$angle[0]*360,$angle[1]*360,$col_black,bsize($s*($angle[1]-$angle[0]))); + } + break; + + case 2: + $s=$cache['num_hits']+$cache['num_misses']; + $a=$cache['num_hits']; + + fill_box($image, 30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s)); + fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s)); + break; + + case 3: + $s=$mem['num_seg']*$mem['seg_size']; + $a=$mem['avail_mem']; + $x=130; + $y=1; + $j=1; + + // This block of code creates the bar chart. It is a lot more complex than you + // would expect because we try to visualize any memory fragmentation as well. + for($i=0; $i<$mem['num_seg']; $i++) { + $ptr = 0; + $free = $mem['block_lists'][$i]; + uasort($free, 'block_sort'); + foreach($free as $block) { + if($block['offset']!=$ptr) { // Used block + $h=(GRAPH_SIZE-5)*($block['offset']-$ptr)/$s; + if ($h>0) { + $j++; + if($j<75) fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($block['offset']-$ptr),$j); + else fill_box($image,$x,$y,50,$h,$col_black,$col_red); + } + $y+=$h; + } + $h=(GRAPH_SIZE-5)*($block['size'])/$s; + if ($h>0) { + $j++; + if($j<75) fill_box($image,$x,$y,50,$h,$col_black,$col_green,bsize($block['size']),$j); + else fill_box($image,$x,$y,50,$h,$col_black,$col_green); + } + $y+=$h; + $ptr = $block['offset']+$block['size']; + } + if ($ptr < $mem['seg_size']) { // memory at the end + $h = (GRAPH_SIZE-5) * ($mem['seg_size'] - $ptr) / $s; + if ($h > 0) { + fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($mem['seg_size']-$ptr),$j++); + } + } + } + break; + case 4: + $s=$cache['num_hits']+$cache['num_misses']; + $a=$cache['num_hits']; + + fill_box($image, 30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s)); + fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s)); + break; + + } + header("Content-type: image/png"); + imagepng($image); + exit; +} + +// pretty printer for byte values +// +function bsize($s) { + foreach (array('','K','M','G') as $i => $k) { + if ($s < 1024) break; + $s/=1024; + } + return sprintf("%5.1f %sBytes",$s,$k); +} + +// sortable table header in "scripts for this host" view +function sortheader($key,$name,$extra='') { + global $MYREQUEST, $MY_SELF_WO_SORT; + + if ($MYREQUEST['SORT1']==$key) { + $MYREQUEST['SORT2'] = $MYREQUEST['SORT2']=='A' ? 'D' : 'A'; + } + return "<a class=sortable href=\"$MY_SELF_WO_SORT$extra&SORT1=$key&SORT2=".$MYREQUEST['SORT2']."\">$name</a>"; + +} + +// create menu entry +function menu_entry($ob,$title) { + global $MYREQUEST,$MY_SELF; + if ($MYREQUEST['OB']!=$ob) { + return "<li><a href=\"$MY_SELF&OB=$ob\">$title</a></li>"; + } else if (empty($MYREQUEST['SH'])) { + return "<li><span class=active>$title</span></li>"; + } else { + return "<li><a class=\"child_active\" href=\"$MY_SELF&OB=$ob\">$title</a></li>"; + } +} + +function put_login_link($s="Login") +{ + global $MY_SELF,$MYREQUEST,$AUTHENTICATED; + // needs ADMIN_PASSWORD to be changed! + // + if (!USE_AUTHENTICATION) { + return; + } else if (ADMIN_PASSWORD=='password') + { + print <<<EOB + <a href="#" onClick="javascript:alert('You need to set a password at the top of apc.php before this will work!');return false";>$s</a> +EOB; + } else if ($AUTHENTICATED) { + print <<<EOB + '{$_SERVER['PHP_AUTH_USER']}'&nbsp;logged&nbsp;in! +EOB; + } else{ + print <<<EOB + <a href="$MY_SELF&LO=1&OB={$MYREQUEST['OB']}">$s</a> +EOB; + } +} + +function block_sort($array1, $array2) +{ + if ($array1['offset'] > $array2['offset']) { + return 1; + } else { + return -1; + } +} + + +?> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head><title>APC INFO <?php echo $host ?></title> +<style><!-- +body { background:white; font-size:100.01%; margin:0; padding:0; } +body,p,td,th,input,submit { font-size:0.8em;font-family:arial,helvetica,sans-serif; } +* html body {font-size:0.8em} +* html p {font-size:0.8em} +* html td {font-size:0.8em} +* html th {font-size:0.8em} +* html input {font-size:0.8em} +* html submit {font-size:0.8em} +td { vertical-align:top } +a { color:black; font-weight:none; text-decoration:none; } +a:hover { text-decoration:underline; } +div.content { padding:1em 1em 1em 1em; position:absolute; width:97%; z-index:100; } + + +div.head div.login { + position:absolute; + right: 1em; + top: 1.2em; + color:white; + width:6em; + } +div.head div.login a { + position:absolute; + right: 0em; + background:rgb(119,123,180); + border:solid rgb(102,102,153) 2px; + color:white; + font-weight:bold; + padding:0.1em 0.5em 0.1em 0.5em; + text-decoration:none; + } +div.head div.login a:hover { + background:rgb(193,193,244); + } + +h1.apc { background:rgb(153,153,204); margin:0; padding:0.5em 1em 0.5em 1em; } +* html h1.apc { margin-bottom:-7px; } +h1.apc a:hover { text-decoration:none; color:rgb(90,90,90); } +h1.apc div.logo span.logo { + background:rgb(119,123,180); + color:black; + border-right: solid black 1px; + border-bottom: solid black 1px; + font-style:italic; + font-size:1em; + padding-left:1.2em; + padding-right:1.2em; + text-align:right; + } +h1.apc div.logo span.name { color:white; font-size:0.7em; padding:0 0.8em 0 2em; } +h1.apc div.nameinfo { color:white; display:inline; font-size:0.4em; margin-left: 3em; } +h1.apc div.copy { color:black; font-size:0.4em; position:absolute; right:1em; } +hr.apc { + background:white; + border-bottom:solid rgb(102,102,153) 1px; + border-style:none; + border-top:solid rgb(102,102,153) 10px; + height:12px; + margin:0; + margin-top:1px; + padding:0; +} + +ol,menu { margin:1em 0 0 0; padding:0.2em; margin-left:1em;} +ol.menu li { display:inline; margin-right:0.7em; list-style:none; font-size:85%} +ol.menu a { + background:rgb(153,153,204); + border:solid rgb(102,102,153) 2px; + color:white; + font-weight:bold; + margin-right:0em; + padding:0.1em 0.5em 0.1em 0.5em; + text-decoration:none; + margin-left: 5px; + } +ol.menu a.child_active { + background:rgb(153,153,204); + border:solid rgb(102,102,153) 2px; + color:white; + font-weight:bold; + margin-right:0em; + padding:0.1em 0.5em 0.1em 0.5em; + text-decoration:none; + border-left: solid black 5px; + margin-left: 0px; + } +ol.menu span.active { + background:rgb(153,153,204); + border:solid rgb(102,102,153) 2px; + color:black; + font-weight:bold; + margin-right:0em; + padding:0.1em 0.5em 0.1em 0.5em; + text-decoration:none; + border-left: solid black 5px; + } +ol.menu span.inactive { + background:rgb(193,193,244); + border:solid rgb(182,182,233) 2px; + color:white; + font-weight:bold; + margin-right:0em; + padding:0.1em 0.5em 0.1em 0.5em; + text-decoration:none; + margin-left: 5px; + } +ol.menu a:hover { + background:rgb(193,193,244); + text-decoration:none; + } + + +div.info { + background:rgb(204,204,204); + border:solid rgb(204,204,204) 1px; + margin-bottom:1em; + } +div.info h2 { + background:rgb(204,204,204); + color:black; + font-size:1em; + margin:0; + padding:0.1em 1em 0.1em 1em; + } +div.info table { + border:solid rgb(204,204,204) 1px; + border-spacing:0; + width:100%; + } +div.info table th { + background:rgb(204,204,204); + color:white; + margin:0; + padding:0.1em 1em 0.1em 1em; + } +div.info table th a.sortable { color:black; } +div.info table tr.tr-0 { background:rgb(238,238,238); } +div.info table tr.tr-1 { background:rgb(221,221,221); } +div.info table td { padding:0.3em 1em 0.3em 1em; } +div.info table td.td-0 { border-right:solid rgb(102,102,153) 1px; white-space:nowrap; } +div.info table td.td-n { border-right:solid rgb(102,102,153) 1px; } +div.info table td h3 { + color:black; + font-size:1.1em; + margin-left:-0.3em; + } + +div.graph { margin-bottom:1em } +div.graph h2 { background:rgb(204,204,204);; color:black; font-size:1em; margin:0; padding:0.1em 1em 0.1em 1em; } +div.graph table { border:solid rgb(204,204,204) 1px; color:black; font-weight:normal; width:100%; } +div.graph table td.td-0 { background:rgb(238,238,238); } +div.graph table td.td-1 { background:rgb(221,221,221); } +div.graph table td { padding:0.2em 1em 0.4em 1em; } + +div.div1,div.div2 { margin-bottom:1em; width:35em; } +div.div3 { position:absolute; left:40em; top:1em; width:580px; } +//div.div3 { position:absolute; left:37em; top:1em; right:1em; } + +div.sorting { margin:1.5em 0em 1.5em 2em } +.center { text-align:center } +.aright { position:absolute;right:1em } +.right { text-align:right } +.ok { color:rgb(0,200,0); font-weight:bold} +.failed { color:rgb(200,0,0); font-weight:bold} + +span.box { + border: black solid 1px; + border-right:solid black 2px; + border-bottom:solid black 2px; + padding:0 0.5em 0 0.5em; + margin-right:1em; +} +span.green { background:#60F060; padding:0 0.5em 0 0.5em} +span.red { background:#D06030; padding:0 0.5em 0 0.5em } + +div.authneeded { + background:rgb(238,238,238); + border:solid rgb(204,204,204) 1px; + color:rgb(200,0,0); + font-size:1.2em; + font-weight:bold; + padding:2em; + text-align:center; + } + +input { + background:rgb(153,153,204); + border:solid rgb(102,102,153) 2px; + color:white; + font-weight:bold; + margin-right:1em; + padding:0.1em 0.5em 0.1em 0.5em; + } +//--> +</style> +</head> +<body> +<div class="head"> + <h1 class="apc"> + <div class="logo"><span class="logo"><a href="http://pecl.php.net/package/APC">APC</a></span></div> + <div class="nameinfo">Opcode Cache</div> + </h1> + <div class="login"> + <?php put_login_link(); ?> + </div> + <hr class="apc"> +</div> +<?php + + +// Display main Menu +echo <<<EOB + <ol class=menu> + <li><a href="$MY_SELF&OB={$MYREQUEST['OB']}&SH={$MYREQUEST['SH']}">Refresh Data</a></li> +EOB; +echo + menu_entry(1,'View Host Stats'), + menu_entry(2,'System Cache Entries'); +if ($AUTHENTICATED) { + echo menu_entry(4,'Per-Directory Entries'); +} +echo + menu_entry(3,'User Cache Entries'), + menu_entry(9,'Version Check'); + +if ($AUTHENTICATED) { + echo <<<EOB + <li><a class="aright" href="$MY_SELF&CC=1&OB={$MYREQUEST['OB']}" onClick="javascript:return confirm('Are you sure?');">Clear $cache_mode Cache</a></li> +EOB; +} +echo <<<EOB + </ol> +EOB; + + +// CONTENT +echo <<<EOB + <div class=content> +EOB; + +// MAIN SWITCH STATEMENT + +switch ($MYREQUEST['OB']) { + + + + + +// ----------------------------------------------- +// Host Stats +// ----------------------------------------------- +case OB_HOST_STATS: + $mem_size = $mem['num_seg']*$mem['seg_size']; + $mem_avail= $mem['avail_mem']; + $mem_used = $mem_size-$mem_avail; + $seg_size = bsize($mem['seg_size']); + $req_rate = sprintf("%.2f",($cache['num_hits']+$cache['num_misses'])/($time-$cache['start_time'])); + $hit_rate = sprintf("%.2f",($cache['num_hits'])/($time-$cache['start_time'])); + $miss_rate = sprintf("%.2f",($cache['num_misses'])/($time-$cache['start_time'])); + $insert_rate = sprintf("%.2f",($cache['num_inserts'])/($time-$cache['start_time'])); + $req_rate_user = sprintf("%.2f",($cache_user['num_hits']+$cache_user['num_misses'])/($time-$cache_user['start_time'])); + $hit_rate_user = sprintf("%.2f",($cache_user['num_hits'])/($time-$cache_user['start_time'])); + $miss_rate_user = sprintf("%.2f",($cache_user['num_misses'])/($time-$cache_user['start_time'])); + $insert_rate_user = sprintf("%.2f",($cache_user['num_inserts'])/($time-$cache_user['start_time'])); + $apcversion = phpversion('apc'); + $phpversion = phpversion(); + $number_files = $cache['num_entries']; + $size_files = bsize($cache['mem_size']); + $number_vars = $cache_user['num_entries']; + $size_vars = bsize($cache_user['mem_size']); + $i=0; + echo <<< EOB + <div class="info div1"><h2>General Cache Information</h2> + <table cellspacing=0><tbody> + <tr class=tr-0><td class=td-0>APC Version</td><td>$apcversion</td></tr> + <tr class=tr-1><td class=td-0>PHP Version</td><td>$phpversion</td></tr> +EOB; + + if(!empty($_SERVER['SERVER_NAME'])) + echo "<tr class=tr-0><td class=td-0>APC Host</td><td>{$_SERVER['SERVER_NAME']} $host</td></tr>\n"; + if(!empty($_SERVER['SERVER_SOFTWARE'])) + echo "<tr class=tr-1><td class=td-0>Server Software</td><td>{$_SERVER['SERVER_SOFTWARE']}</td></tr>\n"; + + echo <<<EOB + <tr class=tr-0><td class=td-0>Shared Memory</td><td>{$mem['num_seg']} Segment(s) with $seg_size + <br/> ({$cache['memory_type']} memory, {$cache['locking_type']} locking) + </td></tr> +EOB; + echo '<tr class=tr-1><td class=td-0>Start Time</td><td>',date(DATE_FORMAT,$cache['start_time']),'</td></tr>'; + echo '<tr class=tr-0><td class=td-0>Uptime</td><td>',duration($cache['start_time']),'</td></tr>'; + echo '<tr class=tr-1><td class=td-0>File Upload Support</td><td>',$cache['file_upload_progress'],'</td></tr>'; + echo <<<EOB + </tbody></table> + </div> + + <div class="info div1"><h2>File Cache Information</h2> + <table cellspacing=0><tbody> + <tr class=tr-0><td class=td-0>Cached Files</td><td>$number_files ($size_files)</td></tr> + <tr class=tr-1><td class=td-0>Hits</td><td>{$cache['num_hits']}</td></tr> + <tr class=tr-0><td class=td-0>Misses</td><td>{$cache['num_misses']}</td></tr> + <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate cache requests/second</td></tr> + <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate cache requests/second</td></tr> + <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate cache requests/second</td></tr> + <tr class=tr-0><td class=td-0>Insert Rate</td><td>$insert_rate cache requests/second</td></tr> + <tr class=tr-1><td class=td-0>Cache full count</td><td>{$cache['expunges']}</td></tr> + </tbody></table> + </div> + + <div class="info div1"><h2>User Cache Information</h2> + <table cellspacing=0><tbody> + <tr class=tr-0><td class=td-0>Cached Variables</td><td>$number_vars ($size_vars)</td></tr> + <tr class=tr-1><td class=td-0>Hits</td><td>{$cache_user['num_hits']}</td></tr> + <tr class=tr-0><td class=td-0>Misses</td><td>{$cache_user['num_misses']}</td></tr> + <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate_user cache requests/second</td></tr> + <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate_user cache requests/second</td></tr> + <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate_user cache requests/second</td></tr> + <tr class=tr-0><td class=td-0>Insert Rate</td><td>$insert_rate_user cache requests/second</td></tr> + <tr class=tr-1><td class=td-0>Cache full count</td><td>{$cache_user['expunges']}</td></tr> + + </tbody></table> + </div> + + <div class="info div2"><h2>Runtime Settings</h2><table cellspacing=0><tbody> +EOB; + + $j = 0; + foreach (ini_get_all('apc') as $k => $v) { + echo "<tr class=tr-$j><td class=td-0>",$k,"</td><td>",str_replace(',',',<br />',$v['local_value']),"</td></tr>\n"; + $j = 1 - $j; + } + + if($mem['num_seg']>1 || $mem['num_seg']==1 && count($mem['block_lists'][0])>1) + $mem_note = "Memory Usage<br /><font size=-2>(multiple slices indicate fragments)</font>"; + else + $mem_note = "Memory Usage"; + + echo <<< EOB + </tbody></table> + </div> + + <div class="graph div3"><h2>Host Status Diagrams</h2> + <table cellspacing=0><tbody> +EOB; + $size='width='.(GRAPH_SIZE+50).' height='.(GRAPH_SIZE+10); + echo <<<EOB + <tr> + <td class=td-0>$mem_note</td> + <td class=td-1>Hits &amp; Misses</td> + </tr> +EOB; + + echo + graphics_avail() ? + '<tr>'. + "<td class=td-0><img alt=\"\" $size src=\"$PHP_SELF?IMG=1&$time\"></td>". + "<td class=td-1><img alt=\"\" $size src=\"$PHP_SELF?IMG=2&$time\"></td></tr>\n" + : "", + '<tr>', + '<td class=td-0><span class="green box">&nbsp;</span>Free: ',bsize($mem_avail).sprintf(" (%.1f%%)",$mem_avail*100/$mem_size),"</td>\n", + '<td class=td-1><span class="green box">&nbsp;</span>Hits: ',$cache['num_hits'].sprintf(" (%.1f%%)",$cache['num_hits']*100/($cache['num_hits']+$cache['num_misses'])),"</td>\n", + '</tr>', + '<tr>', + '<td class=td-0><span class="red box">&nbsp;</span>Used: ',bsize($mem_used ).sprintf(" (%.1f%%)",$mem_used *100/$mem_size),"</td>\n", + '<td class=td-1><span class="red box">&nbsp;</span>Misses: ',$cache['num_misses'].sprintf(" (%.1f%%)",$cache['num_misses']*100/($cache['num_hits']+$cache['num_misses'])),"</td>\n"; + echo <<< EOB + </tr> + </tbody></table> + + <br/> + <h2>Detailed Memory Usage and Fragmentation</h2> + <table cellspacing=0><tbody> + <tr> + <td class=td-0 colspan=2><br/> +EOB; + + // Fragementation: (freeseg - 1) / total_seg + $nseg = $freeseg = $fragsize = $freetotal = 0; + for($i=0; $i<$mem['num_seg']; $i++) { + $ptr = 0; + foreach($mem['block_lists'][$i] as $block) { + if ($block['offset'] != $ptr) { + ++$nseg; + } + $ptr = $block['offset'] + $block['size']; + /* Only consider blocks <5M for the fragmentation % */ + if($block['size']<(5*1024*1024)) $fragsize+=$block['size']; + $freetotal+=$block['size']; + } + $freeseg += count($mem['block_lists'][$i]); + } + + if ($freeseg > 1) { + $frag = sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize/$freetotal)*100,bsize($fragsize),bsize($freetotal),$freeseg); + } else { + $frag = "0%"; + } + + if (graphics_avail()) { + $size='width='.(2*GRAPH_SIZE+150).' height='.(GRAPH_SIZE+10); + echo <<<EOB + <img alt="" $size src="$PHP_SELF?IMG=3&$time"> +EOB; + } + echo <<<EOB + </br>Fragmentation: $frag + </td> + </tr> +EOB; + if(isset($mem['adist'])) { + foreach($mem['adist'] as $i=>$v) { + $cur = pow(2,$i); $nxt = pow(2,$i+1)-1; + if($i==0) $range = "1"; + else $range = "$cur - $nxt"; + echo "<tr><th align=right>$range</th><td align=right>$v</td></tr>\n"; + } + } + echo <<<EOB + </tbody></table> + </div> +EOB; + + break; + + +// ----------------------------------------------- +// User Cache Entries +// ----------------------------------------------- +case OB_USER_CACHE: + if (!$AUTHENTICATED) { + echo '<div class="error">You need to login to see the user values here!<br/>&nbsp;<br/>'; + put_login_link("Login now!"); + echo '</div>'; + break; + } + $fieldname='info'; + $fieldheading='User Entry Label'; + $fieldkey='info'; + +// ----------------------------------------------- +// System Cache Entries +// ----------------------------------------------- +case OB_SYS_CACHE: + if (!isset($fieldname)) + { + $fieldname='filename'; + $fieldheading='Script Filename'; + if(ini_get("apc.stat")) $fieldkey='inode'; + else $fieldkey='filename'; + } + if (!empty($MYREQUEST['SH'])) + { + echo <<< EOB + <div class="info"><table cellspacing=0><tbody> + <tr><th>Attribute</th><th>Value</th></tr> +EOB; + + $m=0; + foreach($scope_list as $j => $list) { + foreach($cache[$list] as $i => $entry) { + if (md5($entry[$fieldkey])!=$MYREQUEST['SH']) continue; + foreach($entry as $k => $value) { + if (!$AUTHENTICATED) { + // hide all path entries if not logged in + $value=preg_replace('/^.*(\\/|\\\\)/','<i>&lt;hidden&gt;</i>/',$value); + } + + if ($k == "num_hits") { + $value=sprintf("%s (%.2f%%)",$value,$value*100/$cache['num_hits']); + } + if ($k == 'deletion_time') { + if(!$entry['deletion_time']) $value = "None"; + } + echo + "<tr class=tr-$m>", + "<td class=td-0>",ucwords(preg_replace("/_/"," ",$k)),"</td>", + "<td class=td-last>",(preg_match("/time/",$k) && $value!='None') ? date(DATE_FORMAT,$value) : htmlspecialchars($value, ENT_QUOTES, 'UTF-8'),"</td>", + "</tr>"; + $m=1-$m; + } + if($fieldkey=='info') { + echo "<tr class=tr-$m><td class=td-0>Stored Value</td><td class=td-last><pre>"; + $output = var_export(apc_fetch($entry[$fieldkey]),true); + echo htmlspecialchars($output, ENT_QUOTES, 'UTF-8'); + echo "</pre></td></tr>\n"; + } + break; + } + } + + echo <<<EOB + </tbody></table> + </div> +EOB; + break; + } + + $cols=6; + echo <<<EOB + <div class=sorting><form>Scope: + <input type=hidden name=OB value={$MYREQUEST['OB']}> + <select name=SCOPE> +EOB; + echo + "<option value=A",$MYREQUEST['SCOPE']=='A' ? " selected":"",">Active</option>", + "<option value=D",$MYREQUEST['SCOPE']=='D' ? " selected":"",">Deleted</option>", + "</select>", + ", Sorting:<select name=SORT1>", + "<option value=H",$MYREQUEST['SORT1']=='H' ? " selected":"",">Hits</option>", + "<option value=Z",$MYREQUEST['SORT1']=='Z' ? " selected":"",">Size</option>", + "<option value=S",$MYREQUEST['SORT1']=='S' ? " selected":"",">$fieldheading</option>", + "<option value=A",$MYREQUEST['SORT1']=='A' ? " selected":"",">Last accessed</option>", + "<option value=M",$MYREQUEST['SORT1']=='M' ? " selected":"",">Last modified</option>", + "<option value=C",$MYREQUEST['SORT1']=='C' ? " selected":"",">Created at</option>", + "<option value=D",$MYREQUEST['SORT1']=='D' ? " selected":"",">Deleted at</option>"; + if($fieldname=='info') echo + "<option value=D",$MYREQUEST['SORT1']=='T' ? " selected":"",">Timeout</option>"; + echo + '</select>', + '<select name=SORT2>', + '<option value=D',$MYREQUEST['SORT2']=='D' ? ' selected':'','>DESC</option>', + '<option value=A',$MYREQUEST['SORT2']=='A' ? ' selected':'','>ASC</option>', + '</select>', + '<select name=COUNT onChange="form.submit()">', + '<option value=10 ',$MYREQUEST['COUNT']=='10' ? ' selected':'','>Top 10</option>', + '<option value=20 ',$MYREQUEST['COUNT']=='20' ? ' selected':'','>Top 20</option>', + '<option value=50 ',$MYREQUEST['COUNT']=='50' ? ' selected':'','>Top 50</option>', + '<option value=100',$MYREQUEST['COUNT']=='100'? ' selected':'','>Top 100</option>', + '<option value=150',$MYREQUEST['COUNT']=='150'? ' selected':'','>Top 150</option>', + '<option value=200',$MYREQUEST['COUNT']=='200'? ' selected':'','>Top 200</option>', + '<option value=500',$MYREQUEST['COUNT']=='500'? ' selected':'','>Top 500</option>', + '<option value=0 ',$MYREQUEST['COUNT']=='0' ? ' selected':'','>All</option>', + '</select>', + '&nbsp; Search: <input name=SEARCH value="',$MYREQUEST['SEARCH'],'" type=text size=25/>', + '&nbsp;<input type=submit value="GO!">', + '</form></div>'; + + if (isset($MYREQUEST['SEARCH'])) { + // Don't use preg_quote because we want the user to be able to specify a + // regular expression subpattern. + $MYREQUEST['SEARCH'] = '/'.str_replace('/', '\\/', $MYREQUEST['SEARCH']).'/i'; + if (preg_match($MYREQUEST['SEARCH'], 'test') === false) { + echo '<div class="error">Error: enter a valid regular expression as a search query.</div>'; + break; + } + } + + echo + '<div class="info"><table cellspacing=0><tbody>', + '<tr>', + '<th>',sortheader('S',$fieldheading, "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('H','Hits', "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('Z','Size', "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('A','Last accessed',"&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('M','Last modified',"&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('C','Created at', "&OB=".$MYREQUEST['OB']),'</th>'; + + if($fieldname=='info') { + $cols+=2; + echo '<th>',sortheader('T','Timeout',"&OB=".$MYREQUEST['OB']),'</th>'; + } + echo '<th>',sortheader('D','Deleted at',"&OB=".$MYREQUEST['OB']),'</th></tr>'; + + // builds list with alpha numeric sortable keys + // + $list = array(); + foreach($cache[$scope_list[$MYREQUEST['SCOPE']]] as $i => $entry) { + switch($MYREQUEST['SORT1']) { + case 'A': $k=sprintf('%015d-',$entry['access_time']); break; + case 'H': $k=sprintf('%015d-',$entry['num_hits']); break; + case 'Z': $k=sprintf('%015d-',$entry['mem_size']); break; + case 'M': $k=sprintf('%015d-',$entry['mtime']); break; + case 'C': $k=sprintf('%015d-',$entry['creation_time']); break; + case 'T': $k=sprintf('%015d-',$entry['ttl']); break; + case 'D': $k=sprintf('%015d-',$entry['deletion_time']); break; + case 'S': $k=''; break; + } + if (!$AUTHENTICATED) { + // hide all path entries if not logged in + $list[$k.$entry[$fieldname]]=preg_replace('/^.*(\\/|\\\\)/','*hidden*/',$entry); + } else { + $list[$k.$entry[$fieldname]]=$entry; + } + } + + if ($list) { + + // sort list + // + switch ($MYREQUEST['SORT2']) { + case "A": krsort($list); break; + case "D": ksort($list); break; + } + + // output list + $i=0; + foreach($list as $k => $entry) { + if(!$MYREQUEST['SEARCH'] || preg_match($MYREQUEST['SEARCH'], $entry[$fieldname]) != 0) { + $field_value = htmlentities(strip_tags($entry[$fieldname],''), ENT_QUOTES, 'UTF-8'); + echo + '<tr class=tr-',$i%2,'>', + "<td class=td-0><a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&SH=",md5($entry[$fieldkey]),"\">",$field_value,'</a></td>', + '<td class="td-n center">',$entry['num_hits'],'</td>', + '<td class="td-n right">',$entry['mem_size'],'</td>', + '<td class="td-n center">',date(DATE_FORMAT,$entry['access_time']),'</td>', + '<td class="td-n center">',date(DATE_FORMAT,$entry['mtime']),'</td>', + '<td class="td-n center">',date(DATE_FORMAT,$entry['creation_time']),'</td>'; + + if($fieldname=='info') { + if($entry['ttl']) + echo '<td class="td-n center">'.$entry['ttl'].' seconds</td>'; + else + echo '<td class="td-n center">None</td>'; + } + if ($entry['deletion_time']) { + + echo '<td class="td-last center">', date(DATE_FORMAT,$entry['deletion_time']), '</td>'; + } else if ($MYREQUEST['OB'] == OB_USER_CACHE) { + + echo '<td class="td-last center">'; + echo '[<a href="', $MY_SELF, '&OB=', $MYREQUEST['OB'], '&DU=', urlencode($entry[$fieldkey]), '">Delete Now</a>]'; + echo '</td>'; + } else { + echo '<td class="td-last center"> &nbsp; </td>'; + } + echo '</tr>'; + $i++; + if ($i == $MYREQUEST['COUNT']) + break; + } + } + + } else { + echo '<tr class=tr-0><td class="center" colspan=',$cols,'><i>No data</i></td></tr>'; + } + echo <<< EOB + </tbody></table> +EOB; + + if ($list && $i < count($list)) { + echo "<a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&COUNT=0\"><i>",count($list)-$i,' more available...</i></a>'; + } + + echo <<< EOB + </div> +EOB; + break; + + +// ----------------------------------------------- +// Per-Directory System Cache Entries +// ----------------------------------------------- +case OB_SYS_CACHE_DIR: + if (!$AUTHENTICATED) { + break; + } + + echo <<<EOB + <div class=sorting><form>Scope: + <input type=hidden name=OB value={$MYREQUEST['OB']}> + <select name=SCOPE> +EOB; + echo + "<option value=A",$MYREQUEST['SCOPE']=='A' ? " selected":"",">Active</option>", + "<option value=D",$MYREQUEST['SCOPE']=='D' ? " selected":"",">Deleted</option>", + "</select>", + ", Sorting:<select name=SORT1>", + "<option value=H",$MYREQUEST['SORT1']=='H' ? " selected":"",">Total Hits</option>", + "<option value=Z",$MYREQUEST['SORT1']=='Z' ? " selected":"",">Total Size</option>", + "<option value=T",$MYREQUEST['SORT1']=='T' ? " selected":"",">Number of Files</option>", + "<option value=S",$MYREQUEST['SORT1']=='S' ? " selected":"",">Directory Name</option>", + "<option value=A",$MYREQUEST['SORT1']=='A' ? " selected":"",">Avg. Size</option>", + "<option value=C",$MYREQUEST['SORT1']=='C' ? " selected":"",">Avg. Hits</option>", + '</select>', + '<select name=SORT2>', + '<option value=D',$MYREQUEST['SORT2']=='D' ? ' selected':'','>DESC</option>', + '<option value=A',$MYREQUEST['SORT2']=='A' ? ' selected':'','>ASC</option>', + '</select>', + '<select name=COUNT onChange="form.submit()">', + '<option value=10 ',$MYREQUEST['COUNT']=='10' ? ' selected':'','>Top 10</option>', + '<option value=20 ',$MYREQUEST['COUNT']=='20' ? ' selected':'','>Top 20</option>', + '<option value=50 ',$MYREQUEST['COUNT']=='50' ? ' selected':'','>Top 50</option>', + '<option value=100',$MYREQUEST['COUNT']=='100'? ' selected':'','>Top 100</option>', + '<option value=150',$MYREQUEST['COUNT']=='150'? ' selected':'','>Top 150</option>', + '<option value=200',$MYREQUEST['COUNT']=='200'? ' selected':'','>Top 200</option>', + '<option value=500',$MYREQUEST['COUNT']=='500'? ' selected':'','>Top 500</option>', + '<option value=0 ',$MYREQUEST['COUNT']=='0' ? ' selected':'','>All</option>', + '</select>', + ", Group By Dir Level:<select name=AGGR>", + "<option value='' selected>None</option>"; + for ($i = 1; $i < 10; $i++) + echo "<option value=$i",$MYREQUEST['AGGR']==$i ? " selected":"",">$i</option>"; + echo '</select>', + '&nbsp;<input type=submit value="GO!">', + '</form></div>', + + '<div class="info"><table cellspacing=0><tbody>', + '<tr>', + '<th>',sortheader('S','Directory Name', "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('T','Number of Files',"&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('H','Total Hits', "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('Z','Total Size', "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('C','Avg. Hits', "&OB=".$MYREQUEST['OB']),'</th>', + '<th>',sortheader('A','Avg. Size', "&OB=".$MYREQUEST['OB']),'</th>', + '</tr>'; + + // builds list with alpha numeric sortable keys + // + $tmp = $list = array(); + foreach($cache[$scope_list[$MYREQUEST['SCOPE']]] as $entry) { + $n = dirname($entry['filename']); + if ($MYREQUEST['AGGR'] > 0) { + $n = preg_replace("!^(/?(?:[^/\\\\]+[/\\\\]){".($MYREQUEST['AGGR']-1)."}[^/\\\\]*).*!", "$1", $n); + } + if (!isset($tmp[$n])) { + $tmp[$n] = array('hits'=>0,'size'=>0,'ents'=>0); + } + $tmp[$n]['hits'] += $entry['num_hits']; + $tmp[$n]['size'] += $entry['mem_size']; + ++$tmp[$n]['ents']; + } + + foreach ($tmp as $k => $v) { + switch($MYREQUEST['SORT1']) { + case 'A': $kn=sprintf('%015d-',$v['size'] / $v['ents']);break; + case 'T': $kn=sprintf('%015d-',$v['ents']); break; + case 'H': $kn=sprintf('%015d-',$v['hits']); break; + case 'Z': $kn=sprintf('%015d-',$v['size']); break; + case 'C': $kn=sprintf('%015d-',$v['hits'] / $v['ents']);break; + case 'S': $kn = $k; break; + } + $list[$kn.$k] = array($k, $v['ents'], $v['hits'], $v['size']); + } + + if ($list) { + + // sort list + // + switch ($MYREQUEST['SORT2']) { + case "A": krsort($list); break; + case "D": ksort($list); break; + } + + // output list + $i = 0; + foreach($list as $entry) { + echo + '<tr class=tr-',$i%2,'>', + "<td class=td-0>",$entry[0],'</a></td>', + '<td class="td-n center">',$entry[1],'</td>', + '<td class="td-n center">',$entry[2],'</td>', + '<td class="td-n center">',$entry[3],'</td>', + '<td class="td-n center">',round($entry[2] / $entry[1]),'</td>', + '<td class="td-n center">',round($entry[3] / $entry[1]),'</td>', + '</tr>'; + + if (++$i == $MYREQUEST['COUNT']) break; + } + + } else { + echo '<tr class=tr-0><td class="center" colspan=6><i>No data</i></td></tr>'; + } + echo <<< EOB + </tbody></table> +EOB; + + if ($list && $i < count($list)) { + echo "<a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&COUNT=0\"><i>",count($list)-$i,' more available...</i></a>'; + } + + echo <<< EOB + </div> +EOB; + break; + +// ----------------------------------------------- +// Version check +// ----------------------------------------------- +case OB_VERSION_CHECK: + echo <<<EOB + <div class="info"><h2>APC Version Information</h2> + <table cellspacing=0><tbody> + <tr> + <th></th> + </tr> +EOB; + if (defined('PROXY')) { + $ctxt = stream_context_create( array( 'http' => array( 'proxy' => PROXY, 'request_fulluri' => True ) ) ); + $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apc.rss", False, $ctxt); + } else { + $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apc.rss"); + } + if (!$rss) { + echo '<tr class="td-last center"><td>Unable to fetch version information.</td></tr>'; + } else { + $apcversion = phpversion('apc'); + + preg_match('!<title>APC ([0-9.]+)</title>!', $rss, $match); + echo '<tr class="tr-0 center"><td>'; + if (version_compare($apcversion, $match[1], '>=')) { + echo '<div class="ok">You are running the latest version of APC ('.$apcversion.')</div>'; + $i = 3; + } else { + echo '<div class="failed">You are running an older version of APC ('.$apcversion.'), + newer version '.$match[1].' is available at <a href="http://pecl.php.net/package/APC/'.$match[1].'"> + http://pecl.php.net/package/APC/'.$match[1].'</a> + </div>'; + $i = -1; + } + echo '</td></tr>'; + echo '<tr class="tr-0"><td><h3>Change Log:</h3><br/>'; + + preg_match_all('!<(title|description)>([^<]+)</\\1>!', $rss, $match); + next($match[2]); next($match[2]); + + while (list(,$v) = each($match[2])) { + list(,$ver) = explode(' ', $v, 2); + if ($i < 0 && version_compare($apcversion, $ver, '>=')) { + break; + } else if (!$i--) { + break; + } + echo "<b><a href=\"http://pecl.php.net/package/APC/$ver\">".htmlspecialchars($v, ENT_QUOTES, 'UTF-8')."</a></b><br><blockquote>"; + echo nl2br(htmlspecialchars(current($match[2]), ENT_QUOTES, 'UTF-8'))."</blockquote>"; + next($match[2]); + } + echo '</td></tr>'; + } + echo <<< EOB + </tbody></table> + </div> +EOB; + break; + +} + +echo <<< EOB + </div> +EOB; + +?> + +<!-- <?php echo "\nBased on APCGUI By R.Becker\n$VERSION\n"?> --> +</body> +</html> diff --git a/pos/is4c-nf/test/index.php b/pos/is4c-nf/test/index.php new file mode 100644 index 000000000..9fe5543ce --- /dev/null +++ b/pos/is4c-nf/test/index.php @@ -0,0 +1,19 @@ +<html> +<head><title>Available Tests</title></head> +<body> +<ul> + <li><a href="parsingTest.php">Input Parsing</a><br /> + (Displays JSON output for a given input) + </li> + <li><a href="receiptTest.php">Receipt Output</a><br /> + (Displays raw output for a tender report module) + </li> + <li><a href="testTenderReport.php">Tender Report</a><br /> + (Displays raw output for a tender report module) + </li> + <li><a href="phpinfo.php">PHP Environment</a><br /> + (Displays phpinfo() output) + </li> +</ul> +</body> +</html> diff --git a/pos/is4c-nf/test/mcache.php b/pos/is4c-nf/test/mcache.php new file mode 100755 index 000000000..223c00aab --- /dev/null +++ b/pos/is4c-nf/test/mcache.php @@ -0,0 +1,8 @@ +<?php +include('../lib/LocalStorage/MemcacheStorage.php'); + +$ms = new MemcacheStorage(); + +$ms->set("asdf",array(100)); + +?> diff --git a/pos/is4c-nf/test/parsingTest.php b/pos/is4c-nf/test/parsingTest.php new file mode 100644 index 000000000..5cba6a550 --- /dev/null +++ b/pos/is4c-nf/test/parsingTest.php @@ -0,0 +1,8 @@ +<html> +<?php include('test_env.php'); ?> +<fieldset> +<legend>Parser Test</legend> +<form action="../ajax-callbacks/ajax-parser.php" method="get"> +Input: <input type="text" name="input" /> +<input type="submit" value="Test Parser" /> +</fieldset> diff --git a/pos/is4c-nf/test/phpinfo.php b/pos/is4c-nf/test/phpinfo.php new file mode 100644 index 000000000..d413e3cf3 --- /dev/null +++ b/pos/is4c-nf/test/phpinfo.php @@ -0,0 +1,3 @@ +<?php +phpinfo(); +?> diff --git a/pos/is4c-nf/test/printKick.sh b/pos/is4c-nf/test/printKick.sh new file mode 100755 index 000000000..8d400e7a7 --- /dev/null +++ b/pos/is4c-nf/test/printKick.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# printKick.sh +# 14Apr12 EL Print something and open cash drawer via Epson TM88 printer. + +# Refer to: Epson Technical Guide "Opening the drawer kickout" +# https://docs.google.com/a/westendfood.coop/file/d/1Q1QhwLa_2ujCBfL-ikLrO10hYMkCf_Jqjy27G6O0Nl-m6dkN1ln-5Kr11v-U/edit + +# --COMMENTS - - - - - - - - - - - - - - - - - - - - - - - - - - + +# 7Jun12 EL ESC as a var. +# 24May12 EL Bug: quoted assignment of SCROLL. + +# --VARIALBLES and --CONSTANTS - - - - - - - - - - - - - - - - - + +# Scroll printer paper so you can see the message. +SCROLL="\n\n\n\n\n\n\n\n" +PRINTER=/dev/lp0 +ESC="\x1B" + +# Use pin 2 +P2=0 +# Use pin 5 +# Does not work on the APG S100 BL1616 with serial connector. +P5=1 +# +# Pulse control. +# I don't know the significance of the values. +# These "work". I haven't tried others. +# Pulse duration. +# ASCII value of char * 2ms +T1=y +# Wait duration (before next pulse). +# ASCII value of char * 2ms +T2=z + +# --MAIN - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +printf "Open sesame!" > $PRINTER + +printf "${ESC}${P2}${T1}${T2}" > $PRINTER + +printf "${SCROLL}" > $PRINTER diff --git a/pos/is4c-nf/test/receiptTest.php b/pos/is4c-nf/test/receiptTest.php new file mode 100644 index 000000000..05581cf93 --- /dev/null +++ b/pos/is4c-nf/test/receiptTest.php @@ -0,0 +1,36 @@ +<?php +include('test_env.php'); +?> +<html> +<head>Test Receipt</head> +<body> +<em>You need an inprogress transaction to use this</em> +<form action="receiptTest.php" method="get"> +<b>Receipt Type</b>: +<select name="rtype"> + <option value="full">Normal Transaction</option> + <option value="cab">Cab Coupon</option> + <option value="partial">Partial Transaction</option> + <option value="cancelled">Cancelled Transaction</option> + <option value="resume">Resumed Transaction</option> + <option value="suspended">Suspended Transaction</option> + <option value="ccSlip">Credit Card Slip</option> + <option value="gcSlip">Gift Card Slip</option> + <option value="gcBalSlip">Gift Card Balance</option> +</select> +<input type="submit" value="Get Receipt"> +</form> +<hr /> +<?php +if (isset($_REQUEST['rtype'])){ + echo '<b>Results</b><br /><pre>'; + $receipt = ReceiptLib::printReceipt($_REQUEST['rtype'],False,False); + if (is_array($receipt)) + echo $receipt['print']; + else + echo $receipt; + echo '</pre>'; +} +?> +</body> +</html> diff --git a/pos/is4c-nf/test/testTenderReport.php b/pos/is4c-nf/test/testTenderReport.php new file mode 100644 index 000000000..a878c6fe2 --- /dev/null +++ b/pos/is4c-nf/test/testTenderReport.php @@ -0,0 +1,26 @@ +<?php +include('test_env.php'); +$mods = AutoLoader::ListModules('TenderReport'); +?> +<form action="testTenderReport.php"> +<select name='t_mod'> +<?php foreach ($mods as $m){ ?> +<option><?php echo $m; ?></option> +<?php } ?> +</select> + +Emp# <input type="text" size="3" name="emp_no" /> + +<input type="submit" value="Get Output" /> +</form> +<hr /> +<?php +if (isset($_REQUEST['t_mod']) && isset($_REQUEST['emp_no'])){ + $CORE_LOCAL->set('CashierNo',$_REQUEST['emp_no']); + $tmod = $_REQUEST['t_mod']; + echo "Output for $tmod:<br />"; + echo '<pre>'; + var_dump($tmod::get()); + echo '</pre>'; +} +?> diff --git a/pos/is4c-nf/test/test_env.php b/pos/is4c-nf/test/test_env.php new file mode 100644 index 000000000..c19024e8b --- /dev/null +++ b/pos/is4c-nf/test/test_env.php @@ -0,0 +1,15 @@ +<?php + +/** + Initialize environment & session so testing behaves + correctly +*/ +if (!class_exists('AutoLoader')) include(dirname(__FILE__).'/../lib/AutoLoader.php'); + +$CORE_LOCAL->set("parse_chain",''); +$CORE_LOCAL->set("preparse_chain",''); + +AutoLoader::LoadMap(); +CoreState::initiate_session(); + +?> diff --git a/pos/is4c-nf/test/variables.php b/pos/is4c-nf/test/variables.php new file mode 100644 index 000000000..df52ade78 --- /dev/null +++ b/pos/is4c-nf/test/variables.php @@ -0,0 +1,9 @@ +<?php + +include('../lib/AutoLoader.php'); + +echo '<ul>'; + +echo '</ul>'; + +?> diff --git a/pos/is4c-web/ajax-callbacks/ajax-add-item.php b/pos/is4c-web/ajax-callbacks/ajax-add-item.php new file mode 100644 index 000000000..25b1c72ab --- /dev/null +++ b/pos/is4c-web/ajax-callbacks/ajax-add-item.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); +if (!function_exists("addUPC")) include($IS4C_PATH."lib/additem.php"); + +if (!isset($_REQUEST['upc'])){ + echo "0"; +} +else { + $success = addUPC($_REQUEST['upc']); + if ($success) + echo "1"; + else + echo "0"; +} + +?> diff --git a/pos/is4c-web/auth/README b/pos/is4c-web/auth/README new file mode 100644 index 000000000..4a7847100 --- /dev/null +++ b/pos/is4c-web/auth/README @@ -0,0 +1,54 @@ +========================================= + Andy's Fannie Authentication Module +========================================= + +This collection of functions is authenticates +users and assigns them privileges either +individually or in groups. Authentication can +be done via SQL, *nix shadow passwords, or +LDAP. Privileges are always stored in SQL so +the database tables are required. See +$FANNIE/auth/doc/ for table structure & API. + +========================================= + Disabling Authentication +========================================= + +Not everyone wants or needs authentication. +To bypass all authentication checking, +create this file: +$FANNIE/auth/init.php + +Content of the file is irrelevant. +Removing read permission from +$FANNIE/auth/ui/ is probably a good idea +from a security standpoint. + +========================================= + Installation / Setup +========================================= +1. Create a file $FANNIE/auth/init.php + This gives you all options without logging in. +2. Go to $FANNIE/auth/ui/menu.php and create + a new [SQL] user. Because you're in the + init mode, the necessary tables are created + automatically. +3. Give your user the authorization "Admin" + (with subs "all" and "all"). Admin users + can create other users, groups, and alter + authorizations. +4. Delete $FANNIE/auth/init.php. Authentication + is now enforced; create other users with + your admin user as needed. + +OPTIONAL: Add *nix shadow authentication +5. cd $FANNIE/auth/shadowread + make + sudo make install + +OPTIONAL: Add LDAP authentication +6. Edit the setup variables in ldap_login() + in login.php. You have to declare where + your LDAP host is and how the data is + layed out, essentially. The defaults + will probably work with openldap's defaults. diff --git a/pos/is4c-web/auth/doc/index.html b/pos/is4c-web/auth/doc/index.html new file mode 100644 index 000000000..6905db9be --- /dev/null +++ b/pos/is4c-web/auth/doc/index.html @@ -0,0 +1,185 @@ +<html> +<head><title>Auth Module Documentation</title></head> +<body> +This document is to detail the API and functionality of the Auth module. +The requirements and workings will be explained, followed by function documentation. +<p /> +<h3>Requirements</h3> +<li>PHP and a webserver</li> +<li>A SQL database (currently uses Sybase; code would need tweaking to use something else)</li> +<br /> +<b>Database Layout</b> +There are 4 database tables used by Auth. There is no install script, so these would need to be +created manually. +<ol> +<li><i>users</i> - contains basic information about users. Columns as follows: +<ul> +<li><i>name</i> [varchar 50, primary key] - the user's name</li> +<li><i>password</i> [varchar 50] - the password, stored crypt-ed</li> +<li><i>salt</i> [varchar 10] - a timestamp used as a salt value for crypt-ing the password</li> +<li><i>uid</i> [varchar 4] - a numeric user id, randomly generated and non-sequential</li> +<li><i>session_id</i> [varchar 50] - a random key generated when a user logs in and stored in a cookie on the client side</li> +<li><i>real_name</i> [varchar 75] - the user's real name</li> +</ul> +</li> +<li><i>userPrivs</i> - a list of permissions for users. Each record essentiallys says user X may do Y. +The subclass start and end allow finer tuned control; i.e., user X may do Y provided Z falls within the +acceptable range. Thus anything can be used for these values so long as it is comparable on the SQL +server being used. The keyword 'all' is reserved for indicating that there is no subclass. +<ul> +<li><i>uid</i> [varchar 4] - identifies the user</li> +<li><i>auth_class</i> [varchar 50] - names the allowed task</li> +<li><i>sub_start</i> [varchar 50] - defines the beginning of a subclass</li> +<li><i>sub_end</i> [varchar 50] - defines the end of a subclass</li> +</ul> +</li> +<li><i>userGroups</i> - defines groups of users. Each record indicates one member of one group. +<ul> +<li><i>gid</i> [int 4] - a group id number. Sequential.</li> +<li><i>name</i> [varchar 50] - the name of the group</li> +<li><i>username</i> [varchar 50] - the name of the user</li> +</ul> +</li> +<li><i>userGroupPrivs</i> - similar to <i>userPrivs</i>, but for groups. See that table for details. +<ul> +<li><i>gid</i> [int 4]</li> +<li><i>auth</i> [varchar 50]</li> +<li><i>sub_start</i> [varchar 50]</li> +<li><i>sub_end</i> [varchar 50]</li> +</ul> +</li> +</ol> +<h3>API</h3> +<b>auth/login.php</b> - this is the main file. Include this to use the auth module.<p /> +bool <b>changePassword</b> ( string username, string oldpassword, string newpassword )<br /> +Updates the users password. Returns true on success, false on failure. +<p /> +mixed <b>checkLogin</b> ( )<br /> +Examines cookies to determine if any user is logged in. Returns the name of the logged in user +if there is one, otherwise returns false. +<p /> +bool <b>createLogin</b> ( string name, string password )<br /> +Enters a new username / password combination into the database. Returns true on success, false + on failure. Requires 'admin' authorization. +<p /> +bool <b>deleteLogin</b> ( string name )<br /> +Deletes the given user. Returns true on success, false on failure. Requires 'admin' authorization. +<p /> +bool <b>login</b> ( string name, string password )<br /> +Checks the username and password, then logs in the user if credentials are correct. Returns + true on success, false on failure. Note this function sets a cookie, so no output can be +sent to the browser prior to calling it. +<p /> +bool <b>logout</b> ( )<br /> +Logs out the currently logged in user and returns true. Note this function sets a cookie, so no +output can be sent to the browser prior to calling it. +<p /> +void <b>showUsers</b> ( )<br /> +Prints out a table of information about current users. Requires 'admin' authorization. +<p /> +mixed <b>validateUser</b> ( string authorization [, string subclass ] )<br /> +Determines who, if anyone, is logged in, and checks to see whether that user has the given +authorization. Returns the logged in user's name on success, or <i>prints error messages</i> AND +returns false on failure. +<p /> +mixed <b>validateUserQuiet</b> ( string authorization [, string subclass ] )<br /> +Identical to above except no error messages are printed. +<p /> +<hr /> +<b>auth/privileges.php</b> +<p /> +bool <b>addAuth</b> ( string username, string authorization [, string subclass_start, string subclass_end ] )<br /> +Adds the given authorization for the given user. Returns true on success, false on failure. +Requires 'admin' authorization. +<p /> +bool <b>checkAuth</b> ( string username, string authorization [, string subclass ] )<br /> +Checks if the given user has the specified authorization. Returns true or false accordingly. +<p /> +bool <b>deleteAuth</b> ( string username, string authorization )<Br /> +Deletes ALL matching authorizations for the user. There is currently no way to delete just a single +subclass span within an authorization. Returns true on success, false on failure. Requires +'admin' authorization. +<p /> +bool <b>showAuths</b> ( string username )<br /> +Prints a table of authorization information for the given user. Returns true on success, false on failure. +Requires 'admin' authorization. +<p /> +<hr /> +<b>auth/groups.php</b> +<p /> +bool <b>addAuthToGroup</b> ( string groupname, string authorization [, string subclass_start, string subclass_end ] )<br /> +Adds the authorization to the given group. Returns true on success, false on failure. +<p /> +bool <b>addGroup</b> ( string groupname, string username )<Br /> +Creates a group AND adds the user to it. Because of the database structure, a group without users isn't +feasible, but such a group isn't particularly useful. Returns true on success, false on failure. +<p /> +bool <b>addUserToGroup</b> ( string groupname, string username )<Br /> +Adds the given user to the given group. Returns true on success false on failure. +<p /> +bool <b>checkGroupAuth</b> ( string groupname, string authrization [, string subclass ] )<br /> +Checks if the group has the given authorization and returns true or false accordingly. +<p /> +bool <b>deleteAuthFromGroup</b> ( string groupname, string authorization )<br /> +Deletes ALL instances of the given authorization from the given group. Returns true on success, +false on failure. +<p /> +bool <b>deleteGroup</b> ( string groupname )<br /> +Deletes the given group. Returns true on success, false on failure. +<p /> +bool <b>deleteUserFromGroup</b> ( string groupname, string username )<br /> +Deletes the given user from the given group. Returns true on success, false on failure. +<p /> +void <b>detailGroup</b> ( string groupname )<br /> +Prints tabled information about the given group including users and authorizations. +<p /> +bool <b>showGroups</b> ( )<br /> +Prints a table of group information. Returns true. +<p /> +<hr /> +<b>auth/utilities.php</b> - useful functions that don't belong anywhere else +<p /> +resource <b>dbconnect</b> ( )<Br /> +Connects to the database and returns a MS SQL link identifier. Doesn't do any error checking. This is +really only useful for moving the database, since the location and database are specified in the one +spot. Actual code doesn't abstract other calls, so the mssql_* functions would have to all be +replaced to switch DB providers. +<p /> +mixed <b>getGID</b> ( string groupname )<br /> +Returns the group id number of the given group if it exists, otherwise returns false. +<p /> +mixed <b>getUID</b> ( string username )<br /> +Returns the user id number of the given user if it exists, otherwise returns false. +<p /> +bool <b>isAlphanumeric</b> ( string input )<br /> +Verifies that the string doesn't contain anything other than letters, numbers, and underscores. All user +input should really be checked with this before being sent to the database to prevent SQL injection. Returns +true or false accordingly. +<p /> +<hr /> +<b>auth/doc</b> This. You're reading it. +<p /> +<hr /> +<b>auth/ui</b> - A user interface for logging in and out and administering the system. Mostly straightforward. +Notably, the auth module is self enforcing. A user must have the authorization 'admin' to perform many of the +administrative tasks, enforced on the base level or the user interface level (or both). I <i>think</i> that adding +a user with an empty password field to the table <i>users</i> and giving that user an 'admin' 'all' 'all' authorization +in the table <i>userPrivs</i> would give you an intial admin to login with, but I haven't actually tried it. It depends +how crypt deals with an empty string. +<p /> +<b>auth/ui/loginform.php</b> - the big kahuna for the GUI. This logs in users, but does a couple other tricks +via GET. Giving a get parameter of logout=yes will logout the user. A get parameter of redirect=[url] will +automatically send the user to the specified url after a successful login. Note the redirect url itself can only +contain one get parameter because the ampersand would end 'redirect'; this is a known limitation. +<p /> +<b>auth/ui/index.php</b> - auto-redirects users to either the login page or the menu based on whether or not +they're logged in. Handy in that just 'auth/ui' can be given to users as a single, all purpose bookmark. +<p /> +<h3>Usage</h3> +Or, how do I plug this thing into my code? Well, just use <i>validateUser</i> or <i>validateUserQuiet</i> to +check your user's permissions. Use <b>auth/ui/loginform.php</b> with the 'redirect' get parameter to provide users +with a login link that will take them back to the current page - or where ever you want them to go. You could also +zap them there automagically with &lt;?php header("Location: /path/to/auth/ui/loginform.php?redirect=...") ?&gt; +And that's about that. +</body> +</html> diff --git a/pos/is4c-web/auth/groups.php b/pos/is4c-web/auth/groups.php new file mode 100644 index 000000000..a8a6a935f --- /dev/null +++ b/pos/is4c-web/auth/groups.php @@ -0,0 +1,266 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + These functions manage user groups and groups authorizations. + Groups are stored in two tables: userGroups and userGroupPrivs + + userGroups contains a list of the members of a group. Each record + is (group id, group name, user name). Hence, there is one record + in userGroups for each user. Yes, the id/name data gets duplicated. + It's not a big deal. + + userGroupPrivs contains a list of authorizations for groups. Each + record is (group id, authorization class, subclass start, subclass end). + Authorizations function identically to the per-user ones in + privileges.php, just for all members of a group. + + Functions return true on success, false on failure. +*/ + +require_once('privileges.php'); + +/* addGroup(groupname, username) + creates a new group and adds the user to it + a user is required because of db structuring and + because an empty group makes little sense +*/ +function addGroup($group,$user){ + $sql = dbconnect(); + + if (!isAlphaNumeric($group) || !isAlphaNumeric($user)){ + return false; + } + + $gid = getGID($group); + if ($gid > 0){ + echo "Group $group already exists<p />"; + return false; + } + + $gidQ = "select max(gid) from userGroups"; + $gidR = $sql->query($gidQ); + $row = $sql->fetch_array($gidR); + $gid = $row[0] + 1; + + $addQ = "insert into userGroups values ($gid,'$group','$user')"; + $addR = $sql->query($addQ); + return true; +} + +/* delteGroup(groupname) + deletes the given group, removing all + users and all authorizations +*/ +function deleteGroup($group){ + $sql = dbconnect(); + if (!isAlphaNumeric($group)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist<p />"; + return false; + } + + $delQ = "delete from userGroupPrivs where gid=$gid"; + $delR = $sql->query($delQ); + + $delQ = "delete from userGroups where gid=$gid"; + $delR = $sql->query($delQ); + return true; +} + +/* addUSerToGroup(groupname, username) + adds the given user to the given group +*/ +function addUserToGroup($group,$user){ + $sql = dbconnect(); + + if (!isAlphaNumeric($group) || !isAlphaNumeric($user)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist<p />"; + return false; + } + + $checkQ = "select gid from userGroups where gid=$gid and username='$user'"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) > 0){ + echo "User $user is already a member of group $group<p />"; + return false; + } + + $addQ = "insert into userGroups values ($gid,'$group','$user')"; + $addR = $sql->query($addQ); + return true; +} + +/* deleteUserFromGroup(groupname, username) + removes the given user from the given group +*/ +function deleteUserFromGroup($group,$user){ + $sql = dbconnect(); + if (!isAlphaNumeric($group) || !isAlphaNumeric($user)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist<p />"; + return false; + } + + $delQ = "delete from userGroups where gid = $gid and username='$user'"; + $delR = $sql->query($delQ); + return true; + +} + +/* addAuthToGroup(groupname, authname, subclass boundaries) + adds the authorization to the given group +*/ +function addAuthToGroup($group,$auth,$start='admin',$end='admin'){ + $sql = dbconnect(); + + if (!isAlphaNumeric($group) || !isAlphaNumeric($auth) || + !isAlphaNumeric($start) || !isAlphaNumeric($end)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist<p />"; + return false; + } + + $addQ = "insert into userGroupPrivs values ($gid,'$auth','$start','$end')"; + $addR = $sql->query($addQ); + return true; +} + +/* checkGroupAuth(username, authorization class, subclass) + checks to see if the user is in a group that has + authorization in the given class +*/ +function checkGroupAuth($user,$auth,$sub='all'){ + $sql = dbconnect(); + if (!isAlphaNumeric($user) || !isAlphaNumeric($auth) || + !isAlphaNumeric($sub)){ + return false; + } + + $checkQ = "select g.gid from userGroups as g, userGroupPrivs as p where + g.gid = p.gid and g.username='$user' + and p.auth='$auth' and + (('$sub' between p.sub_start and p.sub_end) or + (p.sub_start='all' and p.sub_end='all'))"; + $checkR = $sql->query($checkQ); + + if ($sql->num_rows($checkR) == 0){ + return false; + } + return true; +} + +/* deleteAuthFromGroup(groupname, authname) + deletes the given authorization class from the given + group. Note that it doesn't take into account + subclasses, so ALL authorizations in the base + class will be deleted. +*/ +function deleteAuthFromGroup($group,$auth){ + $sql = dbconnect(); + if (!isAlphaNumeric($group,$auth)){ + return false; + } + + $gid = getGID($group); + if (!$gid){ + echo "Group $group doesn't exist<p />"; + return false; + } + + $delQ = "delete from userGroupPrivs where gid=$gid and auth='$auth'"; + $delR = $sql->query($delQ); + return true; +} + +/* showGroups() + prints a table of all the groups +*/ +function showGroups(){ + $sql = dbconnect(); + + $fetchQ = "select distinct gid, name from userGroups order by name"; + $fetchR = $sql->query($fetchQ); + + echo "<table cellspacing=2 cellpadding=2 border=1>"; + echo "<tr><th>Group ID</th><th>Group Name</th></tr>"; + while ($row=$sql->fetch_array($fetchR)){ + echo "<tr><td>$row[0]</td><td>$row[1]</td></tr>"; + } + echo "</table>"; + + return true; +} + +/* detailGroup(groupname) + prints out all the users and authorizations in + the given group +*/ +function detailGroup($group){ + if (!isAlphaNumeric($group)){ + return false; + } + + $sql = dbconnect(); + + $usersQ = "select gid,username from userGroups where name='$group' order by username"; + $usersR = $sql->query($usersQ); + + $gid = 0; + echo "<table cellspacing=2 cellpadding=2 border=1>"; + echo "<tr><th>Users</th></tr>"; + while ($row = $sql->fetch_array($usersR)){ + $gid = $row[0]; + echo "<tr><td>$row[1]</td></tr>"; + } + echo "</table>"; + + $authsQ = "select auth,sub_start,sub_end from userGroupPrivs where gid=$gid order by auth"; + $authsR = $sql->query($authsQ); + echo "<table cellspacing=2 cellpadding=2 border=1>"; + echo "<tr><th>Authorization Class</th><th>Subclass start</th><th>Subclass End</th></tr>"; + while ($row = $sql->fetch_array($authsR)){ + echo "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>"; + } + echo "</table>"; +} + + +?> diff --git a/pos/is4c-web/auth/login.php b/pos/is4c-web/auth/login.php new file mode 100644 index 000000000..1a85436ee --- /dev/null +++ b/pos/is4c-web/auth/login.php @@ -0,0 +1,393 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* +this file contains user authentication-related functions +all functions return true on success, false on failure +unless otherwise noted +*/ + +require_once('groups.php'); + +/* +a user is logged in using cookies +when a user logs in, a cookie name 'session_data' is created containing +two pieces of data: the user's name and a session_id which is +a 50 character random string of digits and capital letters +to access this data, unserialize the cookie's value and use +keys 'name' and 'session_id' to access the array +because this function sets a cookie, nothing before this function +call can produce output +*/ +function login($name,$password,$testing=false){ + $name = isEmail($name); + if (!$name){ + return false; + } + + $sql = dbconnect(); + $name = $sql->escape($name); + $gatherQ = "select password,salt from Users where name='$name'"; + $gatherR = $sql->query($gatherQ); + if ($sql->num_rows($gatherR) == 0){ + return false; + } + + $gatherRow = $sql->fetch_array($gatherR); + $crypt_pass = $gatherRow[0]; + $salt = $gatherRow[1]; + if (crypt($password,$salt) != $crypt_pass){ + return false; + } + + if (!$testing) + doLogin($name); + + return true; +} + +/* + Revised login for use with UNIX system + + shadowread searches the shadow password file + and returns the user's password hash +*/ + +function shadow_login($name,$passwd){ + if (!isAlphanumeric($name)) + return false; + + $output = array(); + $return_value = -1; + exec("../shadowread/shadowread \"$name\"",$output,$return_value); + if ($return_value != 0) + return false; + + $pwhash = $output[0]; + if (crypt($passwd,$pwhash) == $pwhash){ + syncUserShadow($name); + doLogin($name); + return true; + } + return false; +} + +/* login using an ldap server + * + * Constants need to be defined: + * $LDAP_HOST => hostname or url of ldap server + * $LDAP_PORT => ldap port on server + * $LDAP_BASE_DN => DN to search for users + * $LDAP_SEARCH_FIELD => entry containing the username + * + * Optional constants for importing LDAP users + * into SQL automatically: + * $LDAP_UID_FIELD => entry containing the user ID number + * $LDAP_FULLNAME_FIELDS => entry or entries containing + the user's full name + * + * Tested against openldap 2.3.27 + */ +function ldap_login($name,$passwd){ + $LDAP_HOST = "locke.wfco-op.store"; + $LDAP_PORT = 389; + $LDAP_BASE_DN = "ou=People,dc=wfco-op,dc=store"; + $LDAP_SEARCH_FIELD = "uid"; + + $LDAP_UID_FIELD = "uidnumber"; + $LDAP_FULLNAME_FIELDS = array("cn"); + + $conn = ldap_connect($LDAP_HOST,$LDAP_PORT); + if (!$conn) return false; + + $search_result = ldap_search($conn,$LDAP_BASE_DN, + $LDAP_SEARCH_FIELD."=".$name); + if (!$search_result) return false; + + $ldap_info = ldap_get_entries($conn,$search_result); + if (!$ldap_info) return false; + + $user_dn = $ldap_info[0]["dn"]; + $uid = $ldap_info[0][$LDAP_UID_FIELD][0]; + $fullname = ""; + foreach($LDAP_FULLNAME_FIELDS as $f) + $fullname .= $ldap_info[0][$f][0]." "; + $fullname = rtrim($fullname); + + if (ldap_bind($conn,$user_dn,$passwd)){ + syncUserLDAP($name,$uid,$fullname); + doLogin($name); + return true; + } + return false; +} + +/* +sets a cookie. nothing before this function call can have output +*/ +function logout(){ + $name = checkLogin(); + if (!$name){ + return true; + } + setcookie('is4c-web','',0,'/'); + unset($_COOKIE['is4c-web']); + return true; +} + +/* +logins are stored in a table called users +information in the table includes an alphanumeric +user name, an alphanumeric password (stored in crypted form), +the salt used to crypt the password (time of user creation), +and a unique user-id number between 0001 and 9999 +a session id is also stored in this table, but that is created +when the user actually logs in +*/ +function createLogin($name,$password,$fn="",$owner=0){ + table_check(); + + $sql = dbconnect(); + $checkQ = "select name from Users where name='$name'"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) != 0){ + return false; + } + + $salt = time(); + $crypt_pass = crypt($password,$salt); + + $addQ = sprintf("insert into Users (name,password,salt,real_name,owner) + values ('%s','%s','%s','%s',%d)", + $sql->escape($name),$sql->escape($crypt_pass), + $sql->escape($salt),$sql->escape($fn),$owner); + $addR = $sql->query($addQ); + + return true; +} + +function deleteLogin($name){ + if (!isAlphanumeric($name)){ + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $sql=dbconnect(); + $uid = getUID($name); + $delQ = "delete from userPrivs where uid=$uid"; + $delR = $sql->query($delQ); + + $deleteQ = "delete from Users where name='$name'"; + $deleteR = $sql->query($deleteQ); + + $groupQ = "DELETE FROM userGroups WHERE name='$name'"; + $groupR = $sql->query($groupQ); + + return true; +} + +/* +this function returns the name of the logged in +user on success, false on failure +*/ +function checkLogin(){ + if (!auth_enabled()) return 'null'; + + if (init_check()) + return 'init'; + + if (!isset($_COOKIE['is4c-web'])){ + return false; + } + + $cookie_data = base64_decode($_COOKIE['is4c-web']); + $session_data = unserialize($cookie_data); + + $name = $session_data['name']; + $session_id = $session_data['session_id']; + + if (!isEmail($name) or !isAlphanumeric($session_id)){ + return false; + } + + $sql = dbconnect(); + $name = $sql->escape($name); + $session_id = $sql->escape($session_id); + $checkQ = "select * from Users where name='$name' and session_id='$session_id'"; + $checkR = $sql->query($checkQ); + + if ($sql->num_rows($checkR) == 0){ + return false; + } + + return $name; +} + +function showUsers(){ + if (!validateUser('admin')){ + return false; + } + echo "Displaying current users"; + echo "<table cellspacing=2 cellpadding=2 border=1>"; + echo "<tr><th>Name</th><th>User ID</th></tr>"; + $sql = dbconnect(); + $usersQ = "select name,uid from Users order by name"; + $usersR = $sql->query($usersQ); + while ($row = $sql->fetch_array($usersR)){ + echo "<tr>"; + echo "<td>$row[0]</td>"; + echo "<td>$row[1]</td>"; + echo "</tr>"; + } + echo "</table>"; +} + +/* +this function uses login to verify the user's presented +name and password (thus creating a new session) rather +than using checkLogin to verify the correct user is +logged in. This is nonstandard usage. Normally checkLogin +should be used to determine who (if anyone) is logged in +(this way users don't have to constantly provide passwords) +However, since the current password is provided, checking +it is slightly more secure than checking a cookie +*/ +function changePassword($name,$oldpassword,$newpassword){ + $sql = dbconnect(); + if (!login($name,$oldpassword,true)){ + return false; + } + + $salt = time(); + $crypt_pass = crypt($newpassword,$salt); + + $name = $sql->escape($name); + $updateQ = "update Users set password='$crypt_pass',salt='$salt' where name='$name'"; + $updateR = $sql->query($updateQ); + + return true; +} + +function changeAnyPassword($name,$newpassword){ + $salt = time(); + $crypt_pass = crypt($newpassword,$salt); + + $sql = dbconnect(); + $name = $sql->escape($name); + $updateQ = "update Users set password='$crypt_pass',salt='$salt' where name='$name'"; + $updateR = $sql->query($updateQ); + + return true; +} + +/* +this function is here to reduce user validation checks to +a single function call. since this task happens ALL the time, +it just makes code cleaner. It returns the current user on +success just because that information might be useful +*/ +function validateUser($auth,$sub='all'){ + if (!auth_enabled()) return 'null'; + + if (init_check()) + return 'init'; + + $current_user = checkLogin(); + if (!$current_user){ + echo "You must be logged in to use this function"; + return false; + } + + $groupPriv = checkGroupAuth($current_user,$auth,$sub); + if ($groupPriv){ + return $current_user; + } + + $priv = checkAuth($current_user,$auth,$sub); + if (!$priv){ + echo "Your account doesn't have permission to use this function"; + return false; + } + return $current_user; +} + +function validateUserQuiet($auth,$sub='all'){ + if (!auth_enabled()) return 'null'; + + if (init_check()) + return 'init'; + + $current_user = checkLogin(); + if (!$current_user){ + return false; + } + + $groupPriv = checkGroupAuth($current_user,$auth,$sub); + if ($groupPriv){ + return $current_user; + } + + $priv = checkAuth($current_user,$auth,$sub); + if (!$priv){ + return false; + } + return $current_user; +} + +// re-sets expires timer on the cookie if the +// user is currently logged in +// must be called prior to any output +function refreshSession(){ + if (!isset($_COOKIE['is4c-web'])) + return false; + setcookie('is4c-web',$_COOKIE['is4c-web'],time()+(60*40),'/'); + return true; +} + +function pose($username){ + if (!isset($_COOKIE['is4c-web'])) + return false; + if (!isAlphanumeric($username)) + return false; + + $cookie_data = base64_decode($_COOKIE['is4c-web']); + $session_data = unserialize($cookie_data); + + $session_id = $session_data['session_id']; + + $sql = dbconnect(); + $sessionQ = "update Users set session_id = '$session_id' where name='$username'"; + $sessionR = $sql->query($sessionQ); + + $session_data = array("name"=>$username,"session_id"=>$session_id); + $cookie_data = serialize($session_data); + + setcookie('is4c-web',base64_encode($cookie_data),time()+(60*40),'/'); + + return true; +} + +?> diff --git a/pos/is4c-web/auth/privileges.php b/pos/is4c-web/auth/privileges.php new file mode 100644 index 000000000..e0cb8d7bf --- /dev/null +++ b/pos/is4c-web/auth/privileges.php @@ -0,0 +1,135 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* +these functions manage user priviledges which are stored in +a table called userPrivs. Records in the table specify a user id +number (uid), authorization class, and a sub-class start and end +authorization class will probably be like admin, addproducts, +updateproducts,editmembers, etc. sub-class start and end are +in place to potentially add finer-grained control (subset of member +numbers, range of departments). The standard (for now) will be +to set both start and end to 'all' if full access is desired. + +Unless otherwise noted, functions return true on success +and false on failure +*/ + +require_once('utilities.php'); + +function addAuth($name,$auth_class,$sub_start='all',$sub_end='all'){ + $sql = dbconnect(); + if (!isAlphanumeric($name) or !isAlphanumeric($auth_class) or + !isAlphanumeric($sub_start) or !isAlphanumeric($sub_end)){ + return false; + } + $uid = getUID($name); + if (!$uid){ + return $uid; + } + + if (!validateUser('admin')){ + return false; + } + + $addQ = "insert into userPrivs values ('$uid','$auth_class','$sub_start','$sub_end')"; + $addR = $sql->query($addQ); + return true; +} + +function deleteAuth($name,$auth_class){ + if (!isAlphanumeric($name) or !isAlphanumeric($auth_class)){ + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $uid = getUID($name); + if (!$uid){ + return false; + } + $sql = dbconnect(); + $delQ = "delete from userPrivs where uid='$uid' and auth_class='$auth_class'"; + $delR = $sql->query($delQ); + return true; +} + +function showAuths($name){ + if (!isAlphanumeric($name)){ + echo "Invalid name<p />"; + return false; + } + + if (!validateUser('admin')){ + return false; + } + + $uid = getUID($name); + if (!$uid){ + echo "No such user '$name'<p />"; + return false; + } + echo "Showing authorizations for $name"; + echo "<table cellspacing=2 cellpadding=2 border=1><tr>"; + echo "<th>Authorization class</th><th>Subclass start</th><th>Subclass end</th>"; + echo "</tr>"; + $sql = dbconnect(); + $fetchQ = "select auth_class,sub_start,sub_end from userPrivs where uid='$uid'"; + $fetchR = $sql->query($fetchQ); + while ($row = $sql->fetch_array($fetchR)){ + echo "<tr>"; + echo "<td>$row[0]</td><td>$row[1]</td><td>$row[2]</td>"; + echo "</tr>"; + } + echo "</table>"; + return true; +} + +/* +with how authorization checking currently works, sub classes +must be countable (i.e., a sub class must be able to be +tested as to whether or not it's 'between' start and end +*/ +function checkAuth($name,$auth_class,$sub='all'){ + if (init_check()) + return 'init'; + if (!isAlphanumeric($name) or !isAlphanumeric($auth_class) or !isAlphanumeric($sub)){ + return false; + } + $uid = getUID($name); + if (!$uid){ + return false; + } + $sql = dbconnect(); + $checkQ = "select * from userPrivs where uid='$uid' and auth_class='$auth_class' and + (('$sub' between sub_start and sub_end) or (sub_start='all' and sub_end='all'))"; + $checkR = $sql->query($checkQ); + if ($sql->num_rows($checkR) == 0){ + return false; + } + return true; +} + +?> diff --git a/pos/is4c-web/auth/shadowread/Makefile b/pos/is4c-web/auth/shadowread/Makefile new file mode 100644 index 000000000..1f20a1fd2 --- /dev/null +++ b/pos/is4c-web/auth/shadowread/Makefile @@ -0,0 +1,9 @@ +CC=gcc +FLAGS= + +shadowread: shadowread.c + $(CC) $(FLAGS) -o shadowread shadowread.c + +install: + chown root:root shadowread + chmod u+s shadowread diff --git a/pos/is4c-web/auth/shadowread/README b/pos/is4c-web/auth/shadowread/README new file mode 100644 index 000000000..b687da942 --- /dev/null +++ b/pos/is4c-web/auth/shadowread/README @@ -0,0 +1,22 @@ +This is a simple program to read password hashes from +a shadowed password file. I originally wanted to use PAM, +but the "offical" PHP PAM suggestion was "make the shadow +password file group readable", which frankly doesn't seem +any more secure than this. I'm using the setuid bit instead +to grant this program restricted access to the shadow file. + +USAGE: +shadowread requires one argument: a username + +RETURNS: + 0 if a hash is found for the user; + 1 in all other cases + +NOTES: +* shadowread will not honor requests for user 'root' +* If the password hash field has a length less than 5, + shadowread assumes the user has no password + +INSTALL: +$ make +# make install diff --git a/pos/is4c-web/auth/shadowread/shadowread b/pos/is4c-web/auth/shadowread/shadowread new file mode 100755 index 000000000..8eea18c22 Binary files /dev/null and b/pos/is4c-web/auth/shadowread/shadowread differ diff --git a/pos/is4c-web/auth/shadowread/shadowread.c b/pos/is4c-web/auth/shadowread/shadowread.c new file mode 100644 index 000000000..dc1d60ef0 --- /dev/null +++ b/pos/is4c-web/auth/shadowread/shadowread.c @@ -0,0 +1,78 @@ +/******************************************************************************* + * + * Copyright 2009 Whole Foods Co-op + * + * This file is part of Fannie. + * + * Fannie is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Fannie is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * in the file license.txt along with IS4C; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * *********************************************************************************/ + +#include <sys/types.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> + +const char* SHADOW_FILE = "/etc/shadow"; + +int main(int argc, char** argv){ + FILE* fp; + char buffer[1024]; + char* name; + char* tmp_name; + char* tmp_passwd; + + if (argc != 2){ + printf("Usage: shadowread <name>\n"); + return 1; + } + + name = argv[1]; + + if (strcmp(name,"root") == 0){ + printf("Error: invalid user\n"); + return 1; + } + + fp = fopen(SHADOW_FILE,"r"); + if (fp == NULL){ + printf("Couldn't open %s\n",SHADOW_FILE); + return 1; + } + + while( fgets(buffer,1024,fp) != NULL){ + tmp_name = strtok(buffer,":"); + if (tmp_name == NULL) continue; + if (strcmp(name,tmp_name) == 0){ + tmp_passwd = strtok(NULL,":"); + if (tmp_passwd == NULL){ + printf("No password found\n"); + return 1; + } + else if (strlen(tmp_passwd)<5){ + printf("Doesn't appear to be a password\n"); + return 1; + } + else { + printf("%s\n",tmp_passwd); + return 0; + } + } + } + + fclose(fp); + + return 1; +} diff --git a/pos/is4c-web/auth/ui/addAuth.php b/pos/is4c-web/auth/ui/addAuth.php new file mode 100644 index 000000000..47c933b2e --- /dev/null +++ b/pos/is4c-web/auth/ui/addAuth.php @@ -0,0 +1,63 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Add Authorization'; +$header = 'IS4C : Auth : Add Authorization'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['name'])){ + $name = $_POST['name']; + $class = $_POST['class']; + $start = $_POST['start']; + $end = $_POST['end']; + + $success = addAuth($name,$class,$start,$end); + if (!$success){ + echo "Authorization could not be added. Make sure user '$name' exists<p />"; + echo "<a href=menu.php>Main menu</a> | <a href=addAuth.php>Try again</a>?"; + return; + } + echo "Authorization added<p />"; + echo "<a href=menu.php>Main menu</a>"; +} +else { + echo "<form action=addAuth.php method=post>"; + echo "<table cellspacing=3 cellpadding=3>"; + echo "<tr><td>Username:</td><td><input type=text name=name></td></tr>"; + echo "<tr><td>Authorization class:</td><td><input type=text name=class></td></tr>"; + echo "<tr><td>Subclass start:</td><td><input type=text name=start value=all></td></tr>"; + echo "<tr><td>Subclass end:</td><td><input type=text name=end value=all></td></tr>"; + echo "<tr><td><input type=submit value=Add></td><td><input type=reset value=reset></td></tr>"; + echo "</table></form>"; + echo "<p /><a href=menu.php>Main menu</a>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/addGroup.php b/pos/is4c-web/auth/ui/addGroup.php new file mode 100644 index 000000000..e08be309a --- /dev/null +++ b/pos/is4c-web/auth/ui/addGroup.php @@ -0,0 +1,54 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Add Group'; +$header = 'IS4C : Auth : Add Group'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_GET['group'])){ + $group=$_GET['group']; + $user = $_GET['user']; + if (addGroup($group,$user)){ + echo "Group $group added succesfully<p />"; + } +} +else { + echo "<form method=get action=addGroup.php>"; + echo "Group name: <input type=text name=group /><Br /> "; + echo "First user: <input type=text name=user /><br />"; + echo "<input type=submit value=Submit /></form>"; +} +?> +<p /> +<a href=menu.php>Main menu</a> +<?php +include($path."src/footer.html"); +?> + diff --git a/pos/is4c-web/auth/ui/addGroupAuth.php b/pos/is4c-web/auth/ui/addGroupAuth.php new file mode 100644 index 000000000..451913583 --- /dev/null +++ b/pos/is4c-web/auth/ui/addGroupAuth.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Add Group Authorization'; +$header = 'IS4C : Auth : Add Group Authorization'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['name'])){ + $name = $_POST['name']; + $class = $_POST['class']; + $start = $_POST['start']; + $end = $_POST['end']; + + $success = addAuthToGroup($name,$class,$start,$end); + if (!$success){ + echo "<a href=menu.php>Main menu</a> | <a href=addGroupAuth.php>Try again</a>?"; + return; + } + echo "Authorization added<p />"; + echo "<a href=menu.php>Main menu</a>"; +} +else { + echo "<form action=addGroupAuth.php method=post>"; + echo "<table cellspacing=3 cellpadding=3>"; + echo "<tr><td>Group name:</td><td><input type=text name=name></td></tr>"; + echo "<tr><td>Authorization class:</td><td><input type=text name=class></td></tr>"; + echo "<tr><td>Subclass start:</td><td><input type=text name=start value=all></td></tr>"; + echo "<tr><td>Subclass end:</td><td><input type=text name=end value=all></td></tr>"; + echo "<tr><td><input type=submit value=Add></td><td><input type=reset value=reset></td></tr>"; + echo "</table></form>"; + echo "<p /><a href=menu.php>Main menu</a>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/addGroupUser.php b/pos/is4c-web/auth/ui/addGroupUser.php new file mode 100644 index 000000000..c92790366 --- /dev/null +++ b/pos/is4c-web/auth/ui/addGroupUser.php @@ -0,0 +1,53 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Add User to Group'; +$header = 'IS4C : Auth : Add User to Group'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_GET['group'])){ + $group=$_GET['group']; + $user = $_GET['user']; + if (addUserToGroup($group,$user)){ + echo "User $user added to $group succesfully<p />"; + } +} +else { + echo "<form method=get action=addGroupUser.php>"; + echo "Group name: <input type=text name=group /><Br /> "; + echo "Add user: <input type=text name=user /><br />"; + echo "<input type=submit value=Submit /></form>"; +} +?> +<p /> +<a href=menu.php>Main menu</a> +<?php +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/changepass.php b/pos/is4c-web/auth/ui/changepass.php new file mode 100644 index 000000000..1fe88610d --- /dev/null +++ b/pos/is4c-web/auth/ui/changepass.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Change Password'; +$header = 'IS4C : Auth : Change Password'; + +$name = checkLogin(); +if (!$name){ + echo "<html><body bgcolor=cabb1e>"; + echo "Somehow you ended up logged out. <a href=loginform.php>Login</a>?"; +} +else { + if (isset($_POST['name'])){ + $name = $_POST['name']; + $oldpass = $_POST['oldpass']; + $newpass1 = $_POST['newpass1']; + $newpass2 = $_POST['newpass2']; + if ($newpass1 != $newpass2){ + echo "<html><body bgcolor=cabb1e>"; + echo "Passwords don't match<p />"; + echo "<a href=changepass.php>Try again</a> | <a href=menu.php>Main menu</a>"; + } + else { + $success = changePassword($name,$oldpass,$newpass1); + echo "<html><body bgcolor=cabb1e>"; + if (!$success){ + echo "Password change failed. Ensure the old password is correct and that the new password is alphanumeric<p />"; + echo "<a href=changepass.php>Try again</a> | <a href=menu.php>Main menu</a>"; + } + else { + echo "Password changed successfully<p />"; + echo "<a href=menu.php>Continue</a>"; + } + } + } + else { + echo "<html><body bgcolor=cabb1e>"; + echo "<form action=changepass.php method=post>"; + echo "<table cellspacing=2 cellpadding=2"; + echo "<tr><td>Username:</td><td>$name <input type=hidden name=name value=$name></td></tr>"; + echo "<tr><td>Old password:</td><td><input type=password name=oldpass></td></tr>"; + echo "<tr><td>New password:</td><td><input type=password name=newpass1></td></tr>"; + echo "<tr><td>New password, again:</td><td><input type=password name=newpass2></td></tr>"; + echo "<tr><td><input type=submit value=Change></td><td><input type=reset value=Clear></td></tr>"; + echo "</table></form>"; + } +} + +?> + +</body> +</html> diff --git a/pos/is4c-web/auth/ui/createUser.php b/pos/is4c-web/auth/ui/createUser.php new file mode 100644 index 000000000..15ca9e66d --- /dev/null +++ b/pos/is4c-web/auth/ui/createUser.php @@ -0,0 +1,64 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Add User'; +$header = 'IS4C : Auth : Add User'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['name'])){ + $name = $_POST['name']; + $pass1 = $_POST['pass1']; + $pass2 = $_POST['pass2']; + if ($pass1 != $pass2){ + echo "Passwords don't match.<p />"; + echo "<a href=menu.php>Main menu</a> | <a href=createUser.php>Try again</a>?"; + return; + } + $success = createLogin($name,$pass1); + if (!$success){ + echo "Unable to create user. Another user probably already has username '$name'<p />"; + echo "<a href=menu.php>Main menu</a> | <a href=createUser.php>Try again</a>?"; + return; + } + echo "User '$name' created succesfully<p />"; + echo "<a href=menu.php>Main menu</a>"; +} +else { + echo "<form action=createUser.php method=post>"; + echo "<table cellspacing=4 cellpadding=4>"; + echo "<tr><td>Username:</td><td><input type=text name=name></td></tr>"; + echo "<tr><td>Password:</td><td><input type=password name=pass1></td></tr>"; + echo "<tr><td>Password, again:</td><td><input type=password name=pass2></td></tr>"; + echo "<tr><td><input type=submit value=Create></td><td><input type=reset value=Reset></td></tr>"; + echo "</table</form>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/deleteAuth.php b/pos/is4c-web/auth/ui/deleteAuth.php new file mode 100644 index 000000000..5a5d5902f --- /dev/null +++ b/pos/is4c-web/auth/ui/deleteAuth.php @@ -0,0 +1,84 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Delete Authorization'; +$header = 'IS4C : Auth : Delete Authorization'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['yes'])){ + $name = $_POST['name']; + $class = $_POST['class']; + + $success = deleteAuth($name,$class); + + if (!$success){ + echo "Could not remove authorizations. Make sure user '$name' exists'<p />"; + echo "<a href=menu.php>Main menu</a> | <a href=deleteAuth.php>Try again</a>?"; + return; + } + echo "Authorizations deleted<p />"; + echo "<a href=menu.php>Main menu</a>"; + +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + $class = $_POST['class']; + echo "Are you sure you want to delete ALL authorizations for $name in class $class?<p />"; + if ($class == 'admin'){ + echo "<h1>IF YOU DELETE ADMIN AUTHORIZATIONS FROM A USER, THEY WILL NO LONGER BE ABLE "; + echo "TO EDIT USERS OR AUTHORIZATIONS. BE SURE YOU'RE NOT DELETING YOUR OWN "; + echo "ADMIN AUTHORIZATIONS (UNLESS YOU REALLY MEAN TO)</h1>"; + } + echo "<table cellspacing=3 cellpadding=3><tr>"; + echo "<td><form action=deleteAuth.php method=post>"; + echo "<input type=submit value=Yes name=yes>"; + echo "<input type=hidden name=name value=$name>"; + echo "<input type=hidden name=class value=$class>"; + echo "</form</td>"; + echo "<td><form method=post action=menu.php>"; + echo "<input type=submit name=no value=No>"; + echo "</form></td></tr></table>"; +} +else { + echo "WARNING: this will delete ALL authorizations for a user in a given authorization class. "; + echo "If you need finer-grained control over a user with multiple authorizations in the "; + echo "same class (e.g., multiple sub-class ranges) you should edit in SQL<p />"; + echo "<form method=post action=deleteAuth.php>"; + echo "<table cellspacing=3 cellpadding=3>"; + echo "<tr><td>Username:</td><td><input type=text name=name></td></tr>"; + echo "<tr><td>Authorization class</td><td><input type=text name=class></td></tr>"; + echo "<tr><td><input type=submit value=Delete></td><td><input type=reset value=Reset></td></tr>"; + echo "<input type=hidden value=warn name=warn>"; + echo "</table></form>"; + echo "<p /><a href=menu.php>Main menu</a>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/deleteGroup.php b/pos/is4c-web/auth/ui/deleteGroup.php new file mode 100644 index 000000000..0b482bfe8 --- /dev/null +++ b/pos/is4c-web/auth/ui/deleteGroup.php @@ -0,0 +1,67 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Delete Group'; +$header = 'IS4C : Auth : Delete Group'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['yes'])){ + $name = $_POST['name']; + $success = deleteGroup($name); + if (!$success){ + echo "<a href=menu.php>Main menu</a> | <a href=deleteGroup.php>Try again</a>?"; + return; + } + echo "Group $name deleted<p />"; + echo "<a href=menu.php>Main menu</a>"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + echo "Are you sure you want to delete group '$name'?<p />"; + echo "<table cellspacing=3 cellpadding=3><tr>"; + echo "<td><form action=deleteGroup.php method=post>"; + echo "<input type=submit name=yes value=Yes>"; + echo "<input type=hidden name=name value=$name>"; + echo "</form</td>"; + echo "<td><form action=menu.php method=post>"; + echo "<input type=submit name=no value=No>"; + echo "</form></td></tr></table>"; +} +else { + echo "<form action=deleteGroup.php method=post>"; + echo "Group name: <input type=text name=name> <input type=submit value=Delete>"; + echo "<input type=hidden name=warn value=warn>"; + echo "</form>"; + echo "<p /><a href=menu.php>Main menu</a>"; +} + +include($path."src/footer.html"); +?> + diff --git a/pos/is4c-web/auth/ui/deleteGroupAuth.php b/pos/is4c-web/auth/ui/deleteGroupAuth.php new file mode 100644 index 000000000..6ba87fa78 --- /dev/null +++ b/pos/is4c-web/auth/ui/deleteGroupAuth.php @@ -0,0 +1,78 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Delete Group Authorization'; +$header = 'IS4C : Auth : Delete Group Authorization'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['yes'])){ + $name = $_POST['name']; + $class = $_POST['class']; + + $success = deleteAuthFromGroup($name,$class); + + if (!$success){ + echo "<a href=menu.php>Main menu</a> | <a href=deleteGroupAuth.php>Try again</a>?"; + return; + } + echo "Authorizations deleted<p />"; + echo "<a href=menu.php>Main menu</a>"; + +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + $class = $_POST['class']; + echo "Are you sure you want to delete ALL authorizations for $name in class $class?<p />"; + echo "<table cellspacing=3 cellpadding=3><tr>"; + echo "<td><form action=deleteGroupAuth.php method=post>"; + echo "<input type=submit value=Yes name=yes>"; + echo "<input type=hidden name=name value=$name>"; + echo "<input type=hidden name=class value=$class>"; + echo "</form</td>"; + echo "<td><form method=post action=menu.php>"; + echo "<input type=submit name=no value=No>"; + echo "</form></td></tr></table>"; +} +else { + echo "WARNING: this will delete ALL authorizations for a group in a given authorization class. "; + echo "If you need finer-grained control over a group with multiple authorizations in the "; + echo "same class (e.g., multiple sub-class ranges) you should edit in SQL<p />"; + echo "<form method=post action=deleteGroupAuth.php>"; + echo "<table cellspacing=3 cellpadding=3>"; + echo "<tr><td>Group name:</td><td><input type=text name=name></td></tr>"; + echo "<tr><td>Authorization class</td><td><input type=text name=class></td></tr>"; + echo "<tr><td><input type=submit value=Delete></td><td><input type=reset value=Reset></td></tr>"; + echo "<input type=hidden value=warn name=warn>"; + echo "</table></form>"; + echo "<p /><a href=menu.php>Main menu</a>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/deleteGroupUser.php b/pos/is4c-web/auth/ui/deleteGroupUser.php new file mode 100644 index 000000000..968098072 --- /dev/null +++ b/pos/is4c-web/auth/ui/deleteGroupUser.php @@ -0,0 +1,72 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Delete User from Group'; +$header = 'IS4C : Auth : Delete User from Group'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['yes'])){ + $name = $_POST['name']; + $user = $_POST['user']; + $success = deleteUserFromGroup($name,$user); + if (!$success){ + echo "<a href=menu.php>Main menu</a> | <a href=deleteGroupUser.php>Try again</a>?"; + return; + } + echo "User $user deleted from $name<p />"; + echo "<a href=menu.php>Main menu</a>"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + $user = $_POST['user']; + echo "Are you sure you want to delete user $user from group '$name'?<p />"; + echo "<table cellspacing=3 cellpadding=3><tr>"; + echo "<td><form action=deleteGroupUser.php method=post>"; + echo "<input type=submit name=yes value=Yes>"; + echo "<input type=hidden name=name value=$name>"; + echo "<input type=hidden name=user value=$user>"; + echo "</form</td>"; + echo "<td><form action=menu.php method=post>"; + echo "<input type=submit name=no value=No>"; + echo "</form></td></tr></table>"; +} +else { + echo "<form action=deleteGroupUser.php method=post>"; + echo "Group name: <input type=text name=name><br />"; + echo "User name: <input type=text name=user /><br />"; + echo "<input type=submit value=Delete>"; + echo "<input type=hidden name=warn value=warn>"; + echo "</form>"; + echo "<p /><a href=menu.php>Main menu</a>"; + +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/deleteUser.php b/pos/is4c-web/auth/ui/deleteUser.php new file mode 100644 index 000000000..09769a4ac --- /dev/null +++ b/pos/is4c-web/auth/ui/deleteUser.php @@ -0,0 +1,67 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Delete User'; +$header = 'IS4C : Auth : Delete User'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['yes'])){ + $name = $_POST['name']; + $success = deleteLogin($name); + if (!$success){ + echo "User '$name' does not exist<p />"; + echo "<a href=menu.php>Main menu</a> | <a href=deleteUser.php>Try again</a>?"; + return; + } + echo "User $name deleted<p />"; + echo "<a href=menu.php>Main menu</a>"; +} +else if (isset($_POST['warn'])){ + $name = $_POST['name']; + echo "Are you sure you want to delete user '$name'?<p />"; + echo "<table cellspacing=3 cellpadding=3><tr>"; + echo "<td><form action=deleteUser.php method=post>"; + echo "<input type=submit name=yes value=Yes>"; + echo "<input type=hidden name=name value=$name>"; + echo "</form</td>"; + echo "<td><form action=menu.php method=post>"; + echo "<input type=submit name=no value=No>"; + echo "</form></td></tr></table>"; +} +else { + echo "<form action=deleteUser.php method=post>"; + echo "Username: <input type=text name=name> <input type=submit value=Delete>"; + echo "<input type=hidden name=warn value=warn>"; + echo "</form>"; + echo "<p /><a href=menu.php>Main menu</a>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/groupDetail.php b/pos/is4c-web/auth/ui/groupDetail.php new file mode 100644 index 000000000..7136ee66e --- /dev/null +++ b/pos/is4c-web/auth/ui/groupDetail.php @@ -0,0 +1,48 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Group Details'; +$header = 'IS4C : Auth : Group Details'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_GET['group'])){ + $group=$_GET['group']; + detailGroup($group); +} +echo "<form method=get action=groupDetail.php>"; +echo "Group name: <input type=text name=group /> "; +echo "<input type=submit value=Sumit /></form>"; + +?> +<p /> +<a href=menu.php>Main menu</a> +<?php +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/index.php b/pos/is4c-web/auth/ui/index.php new file mode 100644 index 000000000..ac326ace1 --- /dev/null +++ b/pos/is4c-web/auth/ui/index.php @@ -0,0 +1,36 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); + +$current_user = checkLogin(); + +if (!$current_user){ + header("Location: loginform.php"); +} +else { + header("Location: menu.php"); +} + +?> + diff --git a/pos/is4c-web/auth/ui/loginform.php b/pos/is4c-web/auth/ui/loginform.php new file mode 100644 index 000000000..040fc0336 --- /dev/null +++ b/pos/is4c-web/auth/ui/loginform.php @@ -0,0 +1,108 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +include('../../config.php'); +require('../login.php'); +if (isset($_GET["redirect"]) && init_check()){ + header("Location:".$_GET['redirect']); + return; +} + +$page_title = 'IS4C : Auth'; +$header = 'IS4C : Auth'; + +$current_user = checkLogin(); + +if (isset($_GET['logout'])){ + logout(); + $current_user = false; +} + + +$auth_path = guesspath(); +include($auth_path."config.php"); + +if ($current_user){ + include($auth_path."src/header.html"); + echo "<html><body bgcolor=cabb1e>"; + echo "You are logged in as $current_user<p />"; + if (isset($_GET['redirect'])){ + echo "<b style=\"font-size:1.5em;\">It looks like you don't have permission to access this page</b><p />"; + } + echo "<a href=menu.php>Main menu</a> | <a href=loginform.php?logout=yes>Logout</a>?"; + include($auth_path."src/footer.html"); +} +else { + if (isset($_POST['name'])){ + $name = $_POST['name']; + $password = $_POST['password']; + $login = login($name,$password); + $redirect = $_POST['redirect']; + + if (!$login) + $login = ldap_login($name,$password); + + if (!$login) + $login = shadow_login($name,$password); + + if ($login){ + header("Location: $redirect"); + } + else { + include($auth_path."src/header.html"); + echo "<html><body bgcolor=cabb1e>"; + echo "Login failed. <a href=loginform.php?redirect=$redirect>Try again</a>?"; + include($auth_path."src/footer.html"); + } + } + else { + $redirect = 'menu.php'; + if (isset($_GET['redirect'])){ + $redirect = $_GET['redirect']; + } + include($auth_path."src/header.html"); + if (isset($_GET['logout'])) + echo "<blockquote><i>You've logged out</i></blockquote>"; + echo "<form action=loginform.php method=post>"; + echo "<table cellspacing=2 cellpadding=4><tr>"; + echo "<td>Name:</td><td><input type=text name=name></td>"; + echo "</tr><tr>"; + echo "<td>Password:</td><td><input type=password name=password></td>"; + echo "</tr><tr>"; + echo "<td><input type=submit value=Login></td><td><input type=reset value=Clear></td>"; + echo "</tr></table>"; + echo "<input type=hidden value=$redirect name=redirect />"; + echo "</form>"; + echo "<blockquote><i>I'm trying to unify logins a bit. If you're seeing + this instead of the old yellowish page, that's normal. + - Andy</i></blockquote>"; + echo "<script type=text/javascript>"; + echo "document.forms[0].name.focus();"; + echo "</script>"; + include($auth_path."src/footer.html"); + } +} + + +?> + diff --git a/pos/is4c-web/auth/ui/logout.php b/pos/is4c-web/auth/ui/logout.php new file mode 100644 index 000000000..f186be3ec --- /dev/null +++ b/pos/is4c-web/auth/ui/logout.php @@ -0,0 +1,35 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); + +$current_user = checkLogin(); + +if ($current_user) + logout(); + +echo "<html><body bgcolor=cabb1e>"; +echo "You have logged out successfully"; +echo "</body></html>"; + +?> diff --git a/pos/is4c-web/auth/ui/menu.php b/pos/is4c-web/auth/ui/menu.php new file mode 100644 index 000000000..3fa29cebe --- /dev/null +++ b/pos/is4c-web/auth/ui/menu.php @@ -0,0 +1,71 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Menu'; +$header = 'IS4C : Auth : Menu'; +include($path."src/header.html"); + +$name = checkLogin(); +if (!$name){ + echo "You must be <a href=loginform.php>logged in</a> to use this</a>"; +} +else { + $priv = checkAuth($name,'admin'); + $options = 'all'; + if (!$priv){ + $options = 'limited'; + } + + /* commented out options don't apply + when using UNIX or LDAP passwords */ + echo "Welcome $name<p />"; + echo "<ul>"; + if ($options == 'all'){ + echo "<li><a href=viewUsers.php>View users</a></li>"; + echo "<li><a href=createUser.php>Create user</a></li>"; + //echo "<li><a href=resetUserPassword.php>Reset user password</a></li>"; + echo "<li><a href=deleteUser.php>Delete user</a></li>"; + echo "<li><a href=viewAuths.php>View authorizations</a></li>"; + echo "<li><a href=addAuth.php>Add new authorization</a></li>"; + echo "<li><a href=deleteAuth.php>Delete user's authorizations</a></li>"; + echo "<br />"; + echo "<li><a href=addGroup.php>Add a Group</a></li>"; + echo "<li><a href=deleteGroup.php>Delete a Group</a></li>"; + echo "<li><a href=addGroupUser.php>Add User to Group</a></li>"; + echo "<li><A href=deleteGroupUser.php>Delete User from Group</a></li>"; + echo "<li><a href=addGroupAuth.php>Add Group authorization</a></li>"; + echo "<li><A href=deleteGroupAuth.php>Delete Group authorizations</a></li>"; + echo "<li><a href=viewGroups.php>View Groups</a></li>"; + echo "<li><a href=groupDetail.php>View Group Details</a></li>"; + echo "<br />"; + echo "<li><a href=pose.php>Switch User</a></li>"; + } + //echo "<li><a href=changepass.php>Change password</a></li>"; + echo "<li><a href=loginform.php?logout=yes>Logout</a></li>"; + echo "</ul>"; +} + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/pose.php b/pos/is4c-web/auth/ui/pose.php new file mode 100644 index 000000000..f54fda89d --- /dev/null +++ b/pos/is4c-web/auth/ui/pose.php @@ -0,0 +1,51 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : Pose'; +$header = 'IS4C : Auth : Pose'; + +$name = checkLogin(); +if (validateUserQuiet('admin')){ + if (isset($_POST["newname"])){ + pose($_POST["newname"]); + header("Location: menu.php"); + return; + } + else { + include($path."src/header.html"); +?> +<form method=post action=pose.php> +<input type=text name=newname /> <input type=submit value=Pose /> +</form> +<?php + include($path."src/footer.html"); + } +} +else { + include($path."src/header.html"); + echo "You aren't authorized to use this feature"; + include($path."src/footer.html"); +} +?> diff --git a/pos/is4c-web/auth/ui/resetUserPassword.php b/pos/is4c-web/auth/ui/resetUserPassword.php new file mode 100644 index 000000000..3111f6d43 --- /dev/null +++ b/pos/is4c-web/auth/ui/resetUserPassword.php @@ -0,0 +1,53 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +?> +<html> +<body bgcolor=cabb1e> +<?php + +$DEFAULT_PASSWORD = 'password'; + +require('../login.php'); + +if (!validateUser('admin')){ + return; +} + +if (isset($_GET['name'])){ + $name = $_GET['name']; + if (changeAnyPassword($name,$DEFAULT_PASSWORD)){ + echo "User $name's password reset succesfully<p />"; + } +} +else { + echo "<form method=get action=resetUserPassword.php>"; + echo "User name: <input type=text name=name /><br />"; + echo "<input type=submit value=Submit /></form>"; +} +?> +<p /> +<a href=menu.php>Main menu</a> + +</body> +</html> + diff --git a/pos/is4c-web/auth/ui/viewAuths.php b/pos/is4c-web/auth/ui/viewAuths.php new file mode 100644 index 000000000..a662a36cd --- /dev/null +++ b/pos/is4c-web/auth/ui/viewAuths.php @@ -0,0 +1,46 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : View Authorizations'; +$header = 'IS4C : Auth : View Authorizations'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +if (isset($_POST['name'])){ + $name = $_POST['name']; + showAuths($name); +} +echo "<p />"; +echo "<form action=viewAuths.php method=post>"; +echo "Username: <input type=text name=name> <input type=submit value=View>"; +echo "</form>"; +echo "<a href=menu.php>Main menu</a>"; + +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/viewGroups.php b/pos/is4c-web/auth/ui/viewGroups.php new file mode 100644 index 000000000..15c064880 --- /dev/null +++ b/pos/is4c-web/auth/ui/viewGroups.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : View Groups'; +$header = 'IS4C : Auth : View Groups'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +showGroups(); + +?> +<p /> +<a href=menu.php>Main menu</a> +<?php +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/ui/viewUsers.php b/pos/is4c-web/auth/ui/viewUsers.php new file mode 100644 index 000000000..508c3c2e9 --- /dev/null +++ b/pos/is4c-web/auth/ui/viewUsers.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +require('../login.php'); +$path = guesspath(); +$page_title = 'IS4C : Auth : View Users'; +$header = 'IS4C : Auth : View Users'; + +include($path."src/header.html"); + +if (!validateUser('admin')){ + return; +} + +showUsers(); + +?> +<p /> +<a href=menu.php>Main menu</a> +<?php +include($path."src/footer.html"); +?> diff --git a/pos/is4c-web/auth/utilities.php b/pos/is4c-web/auth/utilities.php new file mode 100644 index 000000000..890f8172c --- /dev/null +++ b/pos/is4c-web/auth/utilities.php @@ -0,0 +1,251 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* +utility functions +*/ + +/* +connect to the database +having this as a separate function makes changing +the database easier +*/ +function dbconnect(){ + global $IS4C_PATH; + if (!class_exists("SQLManager")){ + include($IS4C_PATH."lib/connect.php"); + } + $dbc = pDataConnect(); + return $dbc; +} + +function guesspath(){ + $path = ""; + $found = False; + $uri = $_SERVER["REQUEST_URI"]; + $tmp = explode("?",$uri); + if (count($tmp) > 1) $uri = $tmp[0]; + foreach(explode("/",$uri) as $x){ + if (strpos($x,".php") === False + && strlen($x) != 0){ + $path .= "../"; + } + if (!$found && stripos($x,"fannie") !== False){ + $found = True; + $path = ""; + } + + } + return $path; +} + +function init_check(){ + $path = guesspath(); + return file_exists($path."auth/init.php"); +} + +/* +checking whether a string is alphanumeric is +a good idea to prevent sql injection +*/ +function isAlphanumeric($str){ + if (preg_match("/^\\w*$/",$str) == 0){ + return false; + } + return true; +} + +function isEmail($str){ + if (!preg_match('/@.+\./', $str)) return false; + return filter_var($str,FILTER_VALIDATE_EMAIL); +} + +function getUID($name){ + if (!auth_enabled()) return '0000'; + + $sql = dbconnect(); + $name = $sql->escape($name); + $fetchQ = "select uid from Users where name='$name'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + return false; + } + $uid = $sql->fetch_array($fetchR); + $uid = $uid[0]; + return $uid; +} + +function getRealName($name){ + if (!auth_enabled()) return ''; + + $sql = dbconnect(); + $name = $sql->escape($name); + $fetchQ = "select real_name from Users where name='$name'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0){ + return false; + } + $rn = $sql->fetch_array($fetchR); + $rn = $rn[0]; + return $rn; +} + +function getOwner($name){ + $sql = dbconnect(); + $name = $sql->escape($name); + $fetchQ = "select owner from Users where name='$name'"; + $fetchR = $sql->query($fetchQ); + if ($sql->num_rows($fetchR) == 0) + return false; + return array_pop($sql->fetch_array($fetchR)); +} + +function getGID($group){ + if (!isAlphaNumeric($group)) + return false; + $sql = dbconnect(); + + $gidQ = "select top 1 gid from userGroups where name='$group'"; + $gidR = $sql->query($gidQ); + + if ($sql->num_rows($gidR) == 0) + return false; + + $row = $sql->fetch_array($gidR); + return $row[0]; +} + +function genSessID(){ + $session_id = ''; + srand(time()); + for ($i = 0; $i < 50; $i++){ + $digit = (rand() % 35) + 48; + if ($digit > 57){ + $digit+=7; + } + $session_id .= chr($digit); + } + return $session_id; +} + +function doLogin($name){ + $session_id = genSessID(); + + $sql = dbconnect(); + $name = $sql->escape($name); + $sessionQ = "update Users set session_id = '$session_id' where name='$name'"; + $sessionR = $sql->query($sessionQ); + + $session_data = array("name"=>$name,"session_id"=>$session_id); + $cookie_data = serialize($session_data); + + setcookie('is4c-web',base64_encode($cookie_data),0,'/'); +} + +function syncUserShadow($name){ + $localdata = posix_getpwnam($name); + + $currentUID = getUID($name); + $posixUID = str_pad($localdata['uid'],4,"0",STR_PAD_LEFT); + $realname = str_replace("'","''",$localdata['gecos']); + $sql = dbconnect(); + + if (!$currentUID){ + $addQ = sprintf("INSERT INTO Users + (name,password,salt,uid,session_id,real_name) + VALUES ('%s','','','%s','','%s')", + $name,$posixUID,$realname); + $sql->query($addQ); + } + else { + $upQ1 = sprintf("UPDATE Users SET real_name='%s' + WHERE name='%s'", + $realname,$name); + $sql->query($upQ1); + } +} + +function syncUserLDAP($name,$uid,$fullname){ + $currentUID = getUID($name); + $sql = dbconnect(); + + if (!$currentUID){ + $addQ = sprintf("INSERT INTO Users + (name,password,salt,uid,session_id,real_name) + VALUES ('%s','','','%s','','%s')", + $name,$uid,$fullname); + $sql->query($addQ); + } + else { + $upQ1 = sprintf("UPDATE Users SET real_name='%s' + WHERE name='%s'", + $fullname,$name); + $sql->query($upQ1); + } +} + +function auth_enabled(){ + return True; +} + +function table_check(){ + $sql = dbconnect(); + if (!$sql->table_exists('Users')){ + $sql->query("CREATE TABLE Users ( + name varchar(50) NOT NULL, + password varchar(50), + salt varchar(10), + uid int NOT NULL AUTO_INCREMENT, + session_id varchar(50), + real_name varchar(75), + owner int, + PRIMARY KEY (name), + INDEX (uid) + )"); + } + if (!$sql->table_exists('userPrivs')){ + $sql->query("CREATE TABLE userPrivs ( + uid varchar(4), + auth_class varchar(50), + sub_start varchar(50), + sub_end varchar(50) + )"); + } + if (!$sql->table_exists('userGroups')){ + $sql->query("CREATE TABLE userGroups ( + gid int, + name varchar(50), + username varchar(50) + )"); + } + if (!$sql->table_exists('userGroupPrivs')){ + $sql->query("CREATE TABLE userGroupPrivs ( + gid int, + auth varchar(50), + sub_start varchar(50), + sub_end varchar(50) + )"); + } +} + +?> diff --git a/pos/is4c-web/cc-modules/AuthorizeDotNet.php b/pos/is4c-web/cc-modules/AuthorizeDotNet.php new file mode 100644 index 000000000..eb41dc172 --- /dev/null +++ b/pos/is4c-web/cc-modules/AuthorizeDotNet.php @@ -0,0 +1,682 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("BasicCCModule")) include_once($IS4C_PATH."cc-modules/BasicCCModule.php"); + +if (!class_exists("xmlData")) include_once($IS4C_PATH."lib/xmlData.php"); +if (!class_exists("Void")) include_once($IS4C_PATH."parser-class-lib/parse/Void.php"); +if (!function_exists("truncate2")) include_once($IS4C_PATH."lib/lib.php"); +if (!function_exists("paycard_reset")) include_once($IS4C_PATH."lib/paycardLib.php"); +if (!function_exists("tDataConnect")) include_once($IS4C_PATH."lib/connect.php"); +if (!function_exists("tender")) include_once($IS4C_PATH."lib/prehkeys.php"); +if (!function_exists("receipt")) include_once($IS4C_PATH."lib/clientscripts.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +define('AUTHDOTNET_LOGIN','6Jc5c8QcB'); +define('AUTHDOTNET_TRANS_KEY','68j46u5S3RL4CCbX'); + +class AuthorizeDotNet extends BasicCCModule { + + function handlesType($type){ + if ($type == PAYCARD_TYPE_CREDIT) return True; + else return False; + } + + function entered($validate,$json){ + global $IS4C_LOCAL; + // error checks based on card type + if( $IS4C_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + switch( $IS4C_LOCAL->get("paycard_mode")) { + case PAYCARD_MODE_VOID: + // use the card number to find the trans_id + $dbTrans = tDataConnect(); + $today = date('Ymd'); + $pan4 = substr($IS4C_LOCAL->get("paycard_PAN"),-4); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + $sql = "SELECT transID FROM efsnetRequest WHERE [date]='".$today."' AND (PAN LIKE '%".$pan4."') " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Card Not Used", + "That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Multiple Uses", + "That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = $dbTrans->fetch_array($search); + return $this->paycard_void($payment['transID'],$lane,$trans,$json); + + case PAYCARD_MODE_AUTH: + if( $validate) { + if( paycard_validNumber($IS4C_LOCAL->get("paycard_PAN")) != 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT, + "Invalid Card Number", + "Swipe again or type in manually", + "[clear] to cancel"); + return $json; + } else if( paycard_accepted($IS4C_LOCAL->get("paycard_PAN"), !paycard_live(PAYCARD_TYPE_CREDIT)) != 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT, + "Unsupported Card Type", + "We cannot process " . $IS4C_LOCAL->get("paycard_issuer") . " cards", + "[clear] to cancel"); + return $json; + } else if( paycard_validExpiration($IS4C_LOCAL->get("paycard_exp")) != 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT, + "Invalid Expiration Date", + "The expiration date has passed or was not recognized", + "[clear] to cancel"); + return $json; + } + } + // set initial variables + getsubtotals(); + $IS4C_LOCAL->set("paycard_amount",$IS4C_LOCAL->get("amtdue")); + $IS4C_LOCAL->set("paycard_id",$IS4C_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgAuth.php'); + return $json; + break; + } // switch mode + + // if we're still here, it's an error + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Invalid Mode", + "This card type does not support that processing mode","[clear] to cancel"); + return $json; + } + + function paycard_void($transID,$laneNo=-1,$transNo=-1,$json=array()) { + global $IS4C_LOCAL; + // situation checking + if( $IS4C_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = tDataConnect(); + $today = date('Ymd'); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + if ($laneNo != -1) $lane = $laneNo; + if ($transNo != -1) $trans = $transNo; + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount,name FROM efsnetRequest + WHERE [date]='".$today."' AND cashierNo=".$cashier." + AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = $dbTrans->fetch_array($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xResponseCode, + xTransactionID FROM efsnetResponse WHERE [date]='".$today."' + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM efsnetRequestMod WHERE [date]=".$today." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID + ." AND mode='void' AND xResponseCode=0"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $voided = $dbTrans->num_rows($search); + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = $dbTrans->fetch_array($search); + + // make sure the payment is applicable to void + if( $response['commErr'] != 0 || $response['httpCode'] != 200 || $response['validResponse'] != 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $voided > 0) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } else if( $request['live'] != paycard_live(PAYCARD_TYPE_CREDIT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xResponseCode'] != 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Credit card transaction not approved<br>The result code was " . $response['xResponseCode'],"[clear] to cancel"); + return $json; + } else if( $response['xTransactionID'] < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Invalid reference number","[clear] to cancel"); + return $json; + } + + // make sure the tender line-item is applicable to void + if( $lineitem['trans_type'] != "T" || $lineitem['trans_subtype'] != "CC" ){ + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Authorization and tender records do not match $transID","[clear] to cancel"); + return $json; + } else if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $IS4C_LOCAL->set("paycard_PAN",$request['PAN']); + $IS4C_LOCAL->set("paycard_amount",(($request['mode']=='refund') ? -1 : 1) * $request['amount']); + $IS4C_LOCAL->set("paycard_id",$transID); + $IS4C_LOCAL->set("paycard_type",PAYCARD_TYPE_CREDIT); + $IS4C_LOCAL->set("paycard_mode",PAYCARD_MODE_VOID); + $IS4C_LOCAL->set("paycard_name",$request["name"]); + + // display FEC code box + $IS4C_LOCAL->set("inputMasked",1); + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgVoid.php'; + return $json; + } + + function handleResponse($authResult){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_AUTH: + return $this->handleResponseAuth($authResult); + case PAYCARD_MODE_VOID: + return $this->handleResponseVoid($authResult); + } + } + + function handleResponseAuth($authResult){ + global $IS4C_LOCAL; + $xml = new xmlData($authResult['response']); + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime]," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s',", $now ) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + $validResponse = ($xml->isValid()) ? 1 : 0; + + $refNum = $xml->get("USERREF"); + if ($refNum){ + $sqlColumns .= ",refNum"; + $sqlValues .= sprintf(",'%s'",$refNum); + } + $responseCode = $xml->get("RESPONSECODE"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + $resultCode = $xml->get_first("CODE"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("DESCRIPTION"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $sqlValues .= sprintf(",'%s'",$resultMsg); + } + $xTransID = $xml->get("TRANSID"); + if ($xTransID){ + $sqlColumns .= ",xTransactionID"; + $sqlValues .= sprintf(",'%s'",$xTransID); + } + else $validResponse = -3; + $apprNumber = $xml->get("AUTHCODE"); + if ($apprNumber){ + $sqlColumns .= ",xApprovalNumber"; + $sqlValues .= sprintf(",'%s'",$apprNumber); + } + else $validResponse = -3; + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $dbTrans = tDataConnect(); + $sql = "INSERT INTO efsnetResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); + } + + switch ($xml->get("RESPONSECODE")){ + case 1: // APPROVED + $IS4C_LOCAL->set("ccTermOut","approval:".str_pad($xml->get("AUTH_CODE"),6,'0',STR_PAD_RIGHT)); + return PAYCARD_ERR_OK; + case 2: // DECLINED + $IS4C_LOCAL->set("ccTermOut","approval:denied"); + $IS4C_LOCAL->set("boxMsg","Transaction declined"); + if ($xml->get_first("ERRORCODE") == 4) + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL.get("boxMsg")."<br />Pick up card)"); + break; + case 3: // ERROR + $IS4C_LOCAL->set("ccTermOut","resettotal"); + $IS4C_LOCAL->set("boxMsg",""); + $codes = $xml->get("ERRORCODE"); + $texts = $xml->get("ERRORTEXT"); + if (!is_array($codes)) + $IS4C_LOCAL->set("boxMsg","EC$codes: $texts"); + else{ + for($i=0; $i<count($codes);$i++){ + $IS4C_LOCAl->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."EC".$codes[$i].": ".$texts[$i]); + if ($i != count($codes)-1) + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<br />"); + } + } + break; + default: + $IS4C_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PAYCARD_ERROR_PROC; + } + + function handleResponseVoid($authResult){ + global $IS4C_LOCAL; + $xml = new xmlData($authResult['response']); + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + + // prepare some fields to store the request and the parsed response; we'll add more as we verify it + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID,[datetime]," . + "origAmount,mode,altRoute," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("%s,'%s',%d,", $amountText, "VOID", 0) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + + $refNum = $xml->get("USERREF"); + if ($refNum){ + $sqlColumns .= ",origRefNum"; + $sqlValues .= sprintf(",'%s'",$refNum); + } + $responseCode = $xml->get("RESPONSECODE"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + $resultCode = $xml->get_first("CODE"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("DESCRIPTION"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $sqlValues .= sprintf(",'%s'",$resultMsg); + } + $refID = $xml->get("REFTRANSID"); + if ($refID){ + $sqlColumns .= ",origTransactionID"; + $sqlValues .= sprintf(",'%s'",$refID); + } + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $dbTrans = tDataConnect(); + $sql = "INSERT INTO efsnetRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + return $this->setErrorMsg(PAYCARD_ERR_COMM); + } + + switch ($xml->get("RESPONSECODE")){ + case 1: // APPROVED + return PAYCARD_ERR_OK; + case 2: // DECLINED + $IS4C_LOCAL->set("boxMsg","Transaction declined"); + if ($xml->get_first("ERRORCODE") == 4) + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<br />Pick up card"); + break; + case 3: // ERROR + $IS4C_LOCAL->set("boxMsg",""); + $codes = $xml->get("ERRORCODE"); + $texts = $xml->get("ERRORTEXT"); + if (!is_array($codes)) + $IS4C_LOCAL->set("boxMsg","EC$codes: $texts"); + else{ + for($i=0; $i<count($codes);$i++){ + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."EC".$codes[$i].": ".$texts[$i]); + if ($i != count($codes)-1) + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<br />"); + } + } + break; + default: + $IS4C_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PAYCARD_ERROR_PROC; + } + + function cleanup($json){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_AUTH: + $IS4C_LOCAL->set("ccTender",1); + // cast to string. tender function expects string input + // numeric input screws up parsing on negative values > $0.99 + $amt = "".($IS4C_LOCAL->get("paycard_amount")*100); + tender("CC", $amt); + $IS4C_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Please verify cardholder signature<p>[enter] to continue<br>\"rp\" to reprint slip<br>[clear] to cancel and void</font>"); + break; + case PAYCARD_MODE_VOID: + $v = new Void(); + $v->voidid($IS4C_LOCAL->get("paycard_id")); + $IS4C_LOCAL->set("boxMsg","<b>Voided</b><p><font size=-1>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + $IS4C_LOCAL->set("ccCustCopy",0); + if ($IS4C_LOCAL->get("SigCapture") == "") + $json['receipt'] = "ccSlip"; + return $json; + } + + function doSend($type){ + switch($type){ + case PAYCARD_MODE_AUTH: return $this->send_auth(); + case PAYCARD_MODE_VOID: return $this->send_void(); + default: + paycard_reset(); + return $this->setErrorMsg(0); + } + } + + function send_auth(){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans){ + paycard_reset(); + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + } + + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = (($amount < 0) ? 'refund' : 'tender'); + $manual = ($IS4C_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $IS4C_LOCAL->get("paycard_PAN"); + $cardPANmasked = paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $IS4C_LOCAL->get("paycard_issuer"); + $cardExM = substr($IS4C_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($IS4C_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $IS4C_LOCAL->get("paycard_tr1"); + $cardTr2 = $IS4C_LOCAL->get("paycard_tr2"); + $cardName = $IS4C_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + + // x_login & x_tran_key need to be + // filled in to work + $postValues = array( + "x_login" => AUTHDOTNET_LOGIN, + "x_tran_key" => AUTHDOTNET_TRANS_KEY, + "x_market_type" => "2", + "x_device_type" => "5", + "cp_version" => "1.0", + "x_test_request"=> "0", + "x_amount" => $amount, + "x_user_ref" => $refNum + ); + if ($IS4C_LOCAL->get("training") == 1) + $postValues["x_test_request"] = "1"; + + if ($mode == "refund") + $postValues["x_type"] = "CREDIT"; + else + $postValues["x_type"] = "AUTH_CAPTURE"; + + $sqlCols = "sentPAN,sentExp,sentTr1,sentTr2"; + $sqlVals = ""; + if ((!$cardTr1 && !$cardTr2) || $mode == "refund"){ + $postValues["x_card_num"] = $cardPAN; + $postValues["x_exp_date"] = $cardExM.$cardExY; + $sqlVals = "1,1,0,0"; + } + elseif ($cardTr1){ + $postValues["x_track1"] = $cardTr1; + $sqlVals = "0,0,1,0"; + } + elseif ($cardTr2){ + $postValues["x_track2"] = $cardTr2; + $sqlVals = "0,0,0,1"; + } + + // store request in the database before sending it + $sqlCols .= "," . // already defined some sent* columns + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime],refNum,live,mode,amount," . + "PAN,issuer,manual,name"; + $sqlVals .= "," . // already defined some sent* values + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',%d,'%s',%s,", $now, $refNum, $live, $mode, $amountText) . + sprintf("'%s','%s',%d,'%s'", $cardPANmasked, $cardIssuer, $manual, $name); + $sql = "INSERT INTO efsnetRequest (" . $sqlCols . ") VALUES (" . $sqlVals . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + + if( !$dbTrans->query($sql) ) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + $postData = $this->array2post($postValues); + $this->GATEWAY = "https://test.authorize.net/gateway/transact.dll"; + return $this->curlSend($postData,'POST',False); + } + + function send_void(){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans){ + paycard_reset(); + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); + } + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // new timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $manual = ($IS4C_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $IS4C_LOCAL->get("paycard_PAN"); + $cardPANmasked = paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $IS4C_LOCAL->get("paycard_issuer"); + $cardExM = substr($IS4C_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($IS4C_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $IS4C_LOCAL->get("paycard_tr1"); + $cardTr2 = $IS4C_LOCAL->get("paycard_tr2"); + $cardName = $IS4C_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + + // x_login and x_tran_key need to + // be filled in to work + $postValues = array( + "x_login" => AUTHDOTNET_LOGIN, + "x_tran_key" => AUTHDOTNET_TRANS_KEY, + "x_market_type" => "2", + "x_device_type" => "5", + "cp_version" => "1.0", + "x_text_request"=> "1", + "x_amount" => $amount, + "x_user_ref" => $refNum, + "x_type" => "VOID", + "x_card_num" => $cardPAN, + "x_exp_date" => $cardExM.$cardExY + ); + + // look up the TransactionID from the original response (card number and amount should already be in session vars) + $sql = "SELECT xTransactionID FROM efsnetResponse WHERE [date]='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND transNo=".$transNo." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $result = $dbTrans->query($sql); + if( !$result || $dbTrans->num_rows($result) != 1) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); + $res = $dbTrans->fetch_array($result); + $TransactionID = $res['xTransactionID']; + + $postValues["x_ref_trans_id"] = $TransactionID; + + $postData = $this->array2post($postValues); + $this->GATEWAY = "https://test.authorize.net/gateway/transact.dll"; + return $this->curlSend($postData,'POST',False); + } +} + +?> diff --git a/pos/is4c-web/cc-modules/BasicCCModule.php b/pos/is4c-web/cc-modules/BasicCCModule.php new file mode 100644 index 000000000..4f5fa58f1 --- /dev/null +++ b/pos/is4c-web/cc-modules/BasicCCModule.php @@ -0,0 +1,293 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* + * Generic Credit Card processing module + * + * The idea here is to have a general module for + * processing via HTTPS & curl + * + */ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("paycard_errorText")) include_once($IS4C_PATH."lib/paycardLib.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +class BasicCCModule { + /* constructor + * takes no arguments + * otherwise, do whatever you want here + */ + function BasicCCModule(){ + + } + + // BEGIN INTERFACE METHODS + + /* handlesType($type) + * $type is a constant as defined in paycardLib.php. + * If you class can handle the given type, return + * True + */ + function handlesType($type){ + return False; + } + + /* entered($validate) + * This function is called in paycardEntered() + * [paycardEntered.php]. This function exists + * to move all type-specific handling code out + * of the paycard* files + */ + function entered($validate,$json=array()){ + return False; + } + + /* doSend() + * Process the paycard request and return + * an error value as defined in paycardLib.php. + * + * On success, return PAYCARD_ERR_OK. + * On failure, return anything else and set any + * error messages to be displayed in + * $IS4C_LOCAL->["boxMsg"]. + */ + function doSend($type){ + return $this->setErrorMsg(0); + } + + /* cleanup() + * This function is called when doSend() returns + * PAYCARD_ERR_OK. (see paycardAuthorize.php) + * I use it for tendering, printing + * receipts, etc, but it's really only for code + * cleanliness. You could leave this as is and + * do all the everything inside doSend() + */ + function cleanup($json=array()){ + + } + + /* paycard_void($transID) + * Argument is trans_id to be voided + * Again, this is for removing type-specific + * code from paycard*.php files. + */ + function paycard_void($transID){ + + } + + // END INTERFACE METHODS + + // These are utility methods I found useful + // in implementing subclasses + // They don't need to be defined or used. Any class + // that implements the interface methods above + // will work modularly + + /* curlSend($data,$type) + * Send a curl request with the specified + * POST data. The url should be specified in + * $this->GATEWAY. + * Passes an array containing curl error number, + * curl error message, curl processing time, http + * code, and response text to the handleResponse() + * method + * + * Valid types: GET, POST, SOAP + * Setting xml to True adds an content-type header + */ + var $GATEWAY; + var $SOAPACTION; + function curlSend($data=False,$type='POST',$xml=False){ + global $IS4C_PATH; + if($data && $type == 'GET') + $this->GATEWAY .= $data; + + $curl_handle = curl_init($this->GATEWAY); + + curl_setopt($curl_handle, CURLOPT_HEADER, 0); + curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,15); + curl_setopt($curl_handle, CURLOPT_FAILONERROR,false); + curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,false); + curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT,true); + curl_setopt($curl_handle, CURLOPT_TIMEOUT,30); + //curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl_handle, CURLOPT_CAINFO, + $IS4C_PATH."cc-modules/cacert.pem"); + if ($type == 'SOAP'){ + curl_setopt($curl_handle, CURLOPT_HTTPHEADER, + array("SOAPAction: ".$this->SOAPACTION, + "Content-type: text/xml")); + } + elseif ($xml){ + curl_setopt($curl_handle, CURLOPT_HTTPHEADER, + array("Content-type: text/xml")); + } + + if ($data && ($type == 'POST' || $type == 'SOAP')) + curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $data); + + set_time_limit(60); + + $response = curl_exec($curl_handle); + + if ($type == "SOAP"){ + $response = str_replace("&lt;","<",$response); + $response = str_replace("&gt;",">",$response); + } + + $funcReturn = array( + 'curlErr' => curl_errno($curl_handle), + 'curlErrText' => curl_error($curl_handle), + 'curlTime' => curl_getinfo($curl_handle, + CURLINFO_TOTAL_TIME), + 'curlHTTP' => curl_getinfo($curl_handle, + CURLINFO_HTTP_CODE), + 'response' => $response + ); + + curl_close($curl_handle); + + return $this->handleResponse($funcReturn); + } + + /* handleResponse($response) + * Takes care of data fetched by + * $this->curlSend() + */ + function handleResponse($response){ + return False; + } + + /* refnum($transID) + * Create a reference number from + * session variables. Taken straight from + * efsnet.php + */ + function refnum($transID){ + global $IS4C_LOCAL; + $transNo = (int)$IS4C_LOCAL->get("transno"); + $cashierNo = (int)$IS4C_LOCAL->get("CashierNo"); + $laneNo = (int)$IS4C_LOCAL->get("laneno"); + // fail if any field is too long (we don't want to truncate, since that might produce a non-unique refnum and cause bigger problems) + if( $transID > 999 || $transNo > 999 || $laneNo > 99 || $cashierNo > 9999) + return ""; + // assemble string + $ref = ""; + $ref .= str_pad($cashierNo, 4, "0", STR_PAD_LEFT); + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } + + /* array2post($parray) + * urlencodes the given array for use with curl + */ + function array2post($parray){ + $postData = ""; + foreach($parray as $k=>$v) + $postData .= "$k=".urlencode($v)."&"; + $postData = rtrim($postData,"&"); + return $postData; + } + + // put objects into a soap envelope + // action is top level tag in the soap body + // Envelope attributes can be overridden by a subclass + // if needed + var $SOAP_ENVELOPE_ATTRS = array( + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"", + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + ); + function soapify($action,$objs,$namespace=""){ + $ret = "<?xml version=\"1.0\"?> + <soap:Envelope"; + foreach ($this->SOAP_ENVELOPE_ATTRS as $attr){ + $ret .= " ".$attr; + } + $ret .= "> + <soap:Body> + <".$action; + if ($namespace != "") + $ret .= " xmlns=\"".$namespace."\""; + $ret .= ">\n"; + foreach($objs as $key=>$value){ + $ret .= "<".$key.">"; + $value = str_replace("<","&lt;",$value); + $value = str_replace(">","&gt;",$value); + $ret .= $value; + $ret .= "</".$key.">\n"; + } + $ret .= "</".$action."> + </soap:Body> + </soap:Envelope>"; + + return $ret; + } + + // extract response from soap envelope + function desoapify($action,$soaptext){ + preg_match("/<$action.*?>(.*?)<\/$action>/s", + $soaptext,$groups); + return $groups[1]; + } + + /* setErrorMsg($errorCode) + * Set $IS4C_LOCAL->["boxMsg"] appropriately for + * the given error code. I find this easier + * than manually setting an appropriate message + * every time I return a common error like + * PAYCARD_ERR_NOSEND. I think everything but + * PAYCARD_ERR_PROC can have one default message + * assigned here + */ + function setErrorMsg($errorCode){ + global $IS4C_LOCAL; + switch ($errorCode){ + case PAYCARD_ERR_NOSEND: + $IS4C_LOCAL->set("boxMsg",paycard_errorText("Internal Error",$errorCode,"",1,1,0,0,1,$IS4C_LOCAL->get("paycard_type"))); + break; + case PAYCARD_ERR_COMM: + $IS4C_LOCAL->set("boxMsg",paycard_errorText("Communication Error",$errorCode,"",1,1,0,0,0,$IS4C_LOCAL->get("paycard_type"))); + break; + case PAYCARD_ERR_TIMEOUT: + $IS4C_LOCAL->set("boxMsg",paycard_errorText("Timeout Error",$errorCode,"",0,0,0,1,0,$IS4C_LOCAL->get("paycard_type"))); + break; + case PAYCARD_ERR_DATA: + $IS4C_LOCAL->set("boxMsg",paycard_errorText("System Error",$errorCode,"",0,0,0,1,1,$IS4C_LOCAL->get("paycard_type"))); + break; + default: + $IS4C_LOCAL->set("boxMsg",paycard_errorText("Internal Error",$errorCode,"",1,1,0,0,1,$IS4C_LOCAL->get("paycard_type"))); + break; + return $errorCode; + } + } +} + +?> diff --git a/pos/is4c-web/cc-modules/GoEMerchant.php b/pos/is4c-web/cc-modules/GoEMerchant.php new file mode 100644 index 000000000..422676b3d --- /dev/null +++ b/pos/is4c-web/cc-modules/GoEMerchant.php @@ -0,0 +1,796 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("BasicCCModule")) include_once($IS4C_PATH."cc-modules/BasicCCModule.php"); + +if (!class_exists("xmlData")) include_once($IS4C_PATH."lib/xmlData.php"); +if (!class_exists("Void")) include_once($IS4C_PATH."parser-class-lib/parse/Void.php"); +if (!function_exists("truncate2")) include_once($IS4C_PATH."lib/lib.php"); +if (!function_exists("paycard_reset")) include_once($IS4C_PATH."lib/paycardLib.php"); +if (!function_exists("tDataConnect")) include_once($IS4C_PATH."lib/connect.php"); +if (!function_exists("tender")) include_once($IS4C_PATH."lib/prehkeys.php"); +if (!function_exists("receipt")) include_once($IS4C_PATH."lib/clientscripts.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +define('GOEMERCH_ID',''); +define('GOEMERCH_PASSWD',''); +define('GOEMERCH_GATEWAY_ID',''); +// True - settle transactions immediately +// False - just get authorizations. MUST SETTLE MANUALLY LATER! +define('GOEMERCH_SETTLE_IMMEDIATE',True); + +/* test credentials +define('GOEMERCH_ID','1264'); +define('GOEMERCH_PASSWD','password'); +define('GOEMERCH_GATEWAY_ID','a91c38c3-7d7f-4d29-acc7-927b4dca0dbe'); + */ + +class GoEMerchant extends BasicCCModule { + + var $voidTrans; + var $voidRef; + + function handlesType($type){ + if ($type == PAYCARD_TYPE_CREDIT) return True; + else return False; + } + + function entered($validate,$json){ + global $IS4C_LOCAL,$IS4C_PATH; + // error checks based on card type + if( $IS4C_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + switch( $IS4C_LOCAL->get("paycard_mode")) { + case PAYCARD_MODE_VOID: + // use the card number to find the trans_id + $dbTrans = tDataConnect(); + $today = date('Ymd'); + $pan4 = substr($IS4C_LOCAL->get("paycard_PAN"),-4); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + $sql = "SELECT transID FROM efsnetRequest WHERE [date]='".$today."' AND (PAN LIKE '%".$pan4."') " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + $sql = "SELECT transID,cashierNo,laneNo,transNo FROM efsnetRequest WHERE [date]='".$today."' AND (PAN LIKE '%".$pan4."')"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Card Not Used", + "That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Multiple Uses", + "That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = $dbTrans->fetch_array($search); + return $this->paycard_void($payment['transID'],$lane,$trans,$json); + break; + + case PAYCARD_MODE_AUTH: + if( $validate) { + if( paycard_validNumber($IS4C_LOCAL->get("paycard_PAN")) != 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT, + "Invalid Card Number", + "Swipe again or type in manually", + "[clear] to cancel"); + return $json; + } else if( paycard_accepted($IS4C_LOCAL->get("paycard_PAN"), !paycard_live(PAYCARD_TYPE_CREDIT)) != 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT, + "Unsupported Card Type", + "We cannot process " . $IS4C_LOCAL->get("paycard_issuer") . " cards", + "[clear] to cancel"); + return $json; + } else if( paycard_validExpiration($IS4C_LOCAL->get("paycard_exp")) != 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT, + "Invalid Expiration Date", + "The expiration date has passed or was not recognized", + "[clear] to cancel"); + return $json; + } + } + // set initial variables + getsubtotals(); + if ($IS4C_LOCAL->get("paycard_amount") == 0) + $IS4C_LOCAL->set("paycard_amount",$IS4C_LOCAL->get("amtdue")); + $IS4C_LOCAL->set("paycard_id",$IS4C_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgAuth.php'; + return $json; + break; + } // switch mode + + // if we're still here, it's an error + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Invalid Mode", + "This card type does not support that processing mode","[clear] to cancel"); + return $json; + + } + + function paycard_void($transID,$laneNo=-1,$transNo=-1,$json=array()) { + global $IS4C_LOCAL,$IS4C_PATH; + $this->voidTrans = ""; + $this->voidRef = ""; + // situation checking + if( $IS4C_LOCAL->get("CCintegrate") != 1) { // credit card integration must be enabled + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT, + "Card Integration Disabled", + "Please process credit cards in standalone", + "[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = tDataConnect(); + $today = date('Ymd'); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + if ($laneNo != -1) $lane = $laneNo; + if ($transNo != -1) $trans = $transNo; + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount,name FROM efsnetRequest + WHERE [date]='".$today."' AND cashierNo=".$cashier." AND + laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = $dbTrans->fetch_array($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xResponseCode, + xTransactionID FROM efsnetResponse WHERE [date]='".$today."' + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM efsnetRequestMod WHERE [date]=".$today." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID + ." AND mode='void' AND xResponseCode=0"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $voided = $dbTrans->num_rows($search); + if( $voided > 0) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } + + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $sql = "SELECT * FROM localtranstoday WHERE trans_id=".$transID." and emp_no=".$cashier + ." and register_no=".$lane." and trans_no=".$trans; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if ($num != 1){ + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } + } else if( $num > 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = $dbTrans->fetch_array($search); + + // make sure the payment is applicable to void + if( $response['commErr'] != 0 || $response['httpCode'] != 200 || $response['validResponse'] != 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $request['live'] != paycard_live(PAYCARD_TYPE_CREDIT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xResponseCode'] != 1) { + paycard_reset(); + $json['output'] = paycard_msgBox(PAYCARD_TYPE_CREDIT,"Unable to Void", + "Credit card transaction not approved<br>The result code was " . $response['xResponseCode'],"[clear] to cancel"); + return $json; + } else if( $response['xTransactionID'] < 1) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Invalid reference number","[clear] to cancel"); + return $json; + } + + // make sure the tender line-item is applicable to void + if( $lineitem['trans_type'] != "T" || $lineitem['trans_subtype'] != "CC" ){ + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Authorization and tender records do not match $transID","[clear] to cancel"); + return $json; + } else if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_CREDIT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $IS4C_LOCAL->set("paycard_PAN",$request['PAN']); + $IS4C_LOCAL->set("paycard_amount",(($request['mode']=='retail_alone_credit') ? -1 : 1) * $request['amount']); + $IS4C_LOCAL->set("paycard_id",$transID); + $IS4C_LOCAL->set("paycard_trans",$cashier."-".$lane."-".$trans); + $IS4C_LOCAL->set("paycard_type",PAYCARD_TYPE_CREDIT); + $IS4C_LOCAL->set("paycard_mode",PAYCARD_MODE_VOID); + $IS4C_LOCAL->set("paycard_name",$request['name']); + + // display FEC code box + $IS4C_LOCAL->set("inputMasked",1); + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgVoid.php'; + return $json; + } + + function handleResponse($authResult){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_AUTH: + return $this->handleResponseAuth($authResult); + case PAYCARD_MODE_VOID: + return $this->handleResponseVoid($authResult); + } + } + + function handleResponseAuth($authResult){ + global $IS4C_LOCAL; + $xml = new xmlData($authResult['response']); + + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $cvv2 = $IS4C_LOCAL->get("paycard_cvv2"); + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime]," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s',", $now ) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + $validResponse = ($xml->isValid()) ? 1 : 0; + + $refNum = $xml->get("ORDER_ID"); + if ($refNum){ + $sqlColumns .= ",refNum"; + $sqlValues .= sprintf(",'%s'",$refNum); + } + $responseCode = $xml->get("STATUS"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + // aren't two separate codes from goemerchant + $resultCode = $xml->get_first("STATUS"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("AUTH_RESPONSE"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $rMsg = $resultMsg; + if (strlen($rMsg) > 100){ + $rMsg = substr($rMsg,0,100); + } + $sqlValues .= sprintf(",'%s'",$rMsg); + } + $xTransID = $xml->get("REFERENCE_NUMBER"); + if ($xTransID){ + $sqlColumns .= ",xTransactionID"; + $sqlValues .= sprintf(",'%s'",$xTransID); + } + else $validResponse = -3; + $apprNumber = $xml->get("AUTH_CODE"); + if ($apprNumber){ + $sqlColumns .= ",xApprovalNumber"; + $sqlValues .= sprintf(",'%s'",$apprNumber); + } + //else $validResponse = -3; + // valid credit transactions don't have an approval number + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $dbTrans = tDataConnect(); + $sql = "INSERT INTO efsnetResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); + } + + switch ($xml->get("STATUS")){ + case 1: // APPROVED + $IS4C_LOCAL->set("ccTermOut","approval:".str_pad($xml->get("AUTH_CODE"),6,'0',STR_PAD_RIGHT)); + return PAYCARD_ERR_OK; + case 2: // DECLINED + $IS4C_LOCAL->set("ccTermOut","approval:denied"); + $IS4C_LOCAL->set("boxMsg",$resultMsg); + break; + case 0: // ERROR + $IS4C_LOCAL->set("ccTermOut","resettotal"); + $IS4C_LOCAL->set("boxMsg",""); + $texts = $xml->get_first("ERROR"); + $IS4C_LOCAL->set("boxMsg","Error: $texts"); + break; + default: + $IS4C_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PAYCARD_ERR_PROC; + } + + function handleResponseVoid($authResult){ + global $IS4C_LOCAL; + $xml = new xmlData($authResult['response']); + // prepare some fields to store the parsed response; we'll add more as we verify it + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $refNum = $this->refnum($transID); + + // prepare some fields to store the request and the parsed response; we'll add more as we verify it + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID,[datetime]," . + "origAmount,mode,altRoute," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("%s,'%s',%d,", $amountText, "VOID", 0) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + + $responseCode = $xml->get("STATUS1"); + if ($responseCode){ + $sqlColumns .= ",xResponseCode"; + $sqlValues .= sprintf(",%d",$responseCode); + } + else $validResponse = -3; + $resultCode = $xml->get_first("STATUS1"); + if ($resultCode){ + $sqlColumns .= ",xResultCode"; + $sqlValues .= sprintf(",%d",$resultCode); + } + $resultMsg = $xml->get_first("RESPONSE1"); + if ($resultMsg){ + $sqlColumns .= ",xResultMessage"; + $rMsg = $resultMsg; + if (strlen($rMsg) > 100){ + $rMsg = substr($rMsg,0,100); + } + $sqlValues .= sprintf(",'%s'",$rMsg); + } + $sqlColumns .= ",origTransactionID"; + $sqlValues .= sprintf(",'%s'",$this->voidTrans); + $sqlColumns .= ",origRefNum"; + $sqlValues .= sprintf(",'%s'",$this->voidRef); + + $sqlColumns .= ",validResponse"; + $sqlValues .= sprintf(",%d",$validResponse); + + $dbTrans = tDataConnect(); + $sql = "INSERT INTO efsnetRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); + } + + switch ($xml->get("STATUS1")){ + case 1: // APPROVED + return PAYCARD_ERR_OK; + case 2: // DECLINED + $IS4C_LOCAL->set("boxMsg","$resultMsg"); + break; + case 0: // ERROR + $IS4C_LOCAL->set("boxMsg",""); + $texts = $xml->get_first("ERROR1"); + $IS4C_LOCAL->set("boxMsg","Error: $texts"); + break; + default: + $IS4C_LOCAL->set("boxMsg","An unknown error occurred<br />at the gateway"); + } + return PAYCARD_ERR_PROC; + } + + function cleanup($json){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_AUTH: + $IS4C_LOCAL->set("ccTender",1); + // cast to string. tender function expects string input + // numeric input screws up parsing on negative values > $0.99 + $amt = "".($IS4C_LOCAL->get("paycard_amount")*100); + tender("CC", $amt); + $IS4C_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Please verify cardholder signature<p>[enter] to continue<br>\"rp\" to reprint slip<br>[void] to cancel and void</font>"); + break; + case PAYCARD_MODE_VOID: + $v = new Void(); + $v->voidid($IS4C_LOCAL->get("paycard_id")); + $IS4C_LOCAL->set("boxMsg","<b>Voided</b><p><font size=-1>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + $IS4C_LOCAL->set("ccCustCopy",0); + if ($IS4C_LOCAL->get("SigCapture") == "") + $json['receipt'] = "ccSlip"; + return $json; + } + + function doSend($type){ + global $IS4C_LOCAL; + switch($type){ + case PAYCARD_MODE_AUTH: + return $this->send_auth(); + case PAYCARD_MODE_VOID: + return $this->send_void(); + default: + paycard_reset(); + return $this->setErrorMsg(0); + } + } + + function send_auth(){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans){ + paycard_reset(); + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + } + + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = (($amount < 0) ? 'retail_alone_credit' : 'retail_sale'); + if ($mode == 'retail_sale' && !GOEMERCH_SETTLE_IMMEDIATE) + $mode = 'retail_auth'; + $manual = ($IS4C_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $IS4C_LOCAL->get("paycard_PAN"); + $cardPANmasked = paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $IS4C_LOCAL->get("paycard_issuer"); + $cardExM = substr($IS4C_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($IS4C_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $IS4C_LOCAL->get("paycard_tr1"); + $cardTr2 = $IS4C_LOCAL->get("paycard_tr2"); + $cardTr3 = $IS4C_LOCAL->get("paycard_tr3"); + $cardName = $IS4C_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + $cvv2 = $IS4C_LOCAL->get("paycard_cvv2"); + + $merchantID = GOEMERCH_ID; + $password = GOEMERCH_PASSWD; + $gatewayID = GOEMERCH_GATEWAY_ID; + if ($IS4C_LOCAL->get("training") == 1){ + $merchantID = "1264"; + $password = "password"; + $gatewayID = "a91c38c3-7d7f-4d29-acc7-927b4dca0dbe"; + $cardPAN = "4111111111111111"; + $cardPANmasked = "xxxxxxxxxxxxTEST"; + $cardIssuer = "Visa"; + $cardTr1 = False; + $cardTr2 = False; + $cardName = "Just Testing"; + $nextyear = mktime(0,0,0,date("m"),date("d"),date("Y")+1); + $cardExM = date("m",$nextyear); + $cardExY = date("y",$nextyear); + $live = 0; + } + + $sendPAN = 0; + $sendExp = 0; + $sendTr1 = 0; + $sendTr2 = 0; + $magstripe = ""; + if (!$cardTr1 && !$cardTr2){ + $sendPAN = 1; + $sendExp = 1; + } + if ($cardTr1) { + $sendTr1 = 1; + $magstripe .= "%".$cardTr1."?"; + } + if ($cardTr2){ + $sendTr2 = 1; + $magstripe .= ";".$cardTr2."?"; + } + if ($cardTr2 && $cardTr3){ + $sendPAN = 1; + $magstripe .= ";".$cardTr3."?"; + } + + $sqlCols = "sentPAN,sentExp,sentTr1,sentTr2"; + $sqlVals = "$sendPAN,$sendExp,$sendTr1,$sendTr2"; + // store request in the database before sending it + $sqlCols .= "," . // already defined some sent* columns + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime],refNum,live,mode,amount," . + "PAN,issuer,manual,name"; + $fixedName = $dbTrans->escape($cardName); + $sqlVals .= "," . // already defined some sent* values + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',%d,'%s',%s,", $now, $refNum, $live, $mode, $amountText) . + sprintf("'%s','%s',%d,'%s'", $cardPANmasked, $cardIssuer, $manual,$fixedName); + $sql = "INSERT INTO efsnetRequest (" . $sqlCols . ") VALUES (" . $sqlVals . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + + if( !$dbTrans->query($sql) ) { + paycard_reset(); + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + } + + $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; + $xml .= "<TRANSACTION>"; + $xml .= "<FIELDS>"; + $xml .= "<FIELD KEY=\"merchant\">$merchantID</FIELD>"; + if( $password != "" ) + $xml .= "<FIELD KEY=\"password\">$password</FIELD>"; + $xml .= "<FIELD KEY=\"gateway_id\">$gatewayID</FIELD>"; + $xml .= "<FIELD KEY=\"operation_type\">$mode</FIELD>"; + $xml .= "<FIELD KEY=\"order_id\">$refNum</FIELD>"; + $xml .= "<FIELD KEY=\"total\">$amountText</FIELD>"; + if ($magstripe == ""){ + $xml .= "<FIELD KEY=\"card_name\">$cardIssuer</FIELD>"; + $xml .= "<FIELD KEY=\"card_number\">$cardPAN</FIELD>"; + $xml .= "<FIELD KEY=\"card_exp\">".$cardExM.$cardExY."</FIELD>"; + } + else{ + $xml .= "<FIELD KEY=\"mag_data\">$magstripe</FIELD>"; + } + if (!empty($cvv2)){ + $xml .= "<FIELD KEY=\"cvv2\">$cvv2</FIELD>"; + } + if ($cardName != "Customer"){ + $xml .= "<FIELD KEY=\"owner_name\">$cardName</FIELD>"; + } + $xml .= "<FIELD KEY=\"recurring\">0</FIELD>"; + $xml .= "<FIELD KEY=\"recurring_type\"></FIELD>"; + $xml .= "</FIELDS>"; + $xml .= "</TRANSACTION>"; + + $IS4C_LOCAL->set("paycard_PAN",$cardPANmasked); + $IS4C_LOCAL->set("paycard_tr1",False); + $IS4C_LOCAL->set("paycard_tr2",False); + $IS4C_LOCAL->set("paycard_tr3",False); + + $this->GATEWAY = "https://secure.goemerchant.com/secure/gateway/xmlgateway.aspx"; + return $this->curlSend($xml,'POST',True); + } + + function send_void(){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans){ + paycard_reset(); + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); + } + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // new timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $manual = ($IS4C_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $IS4C_LOCAL->get("paycard_PAN"); + $cardPANmasked = paycard_maskPAN($cardPAN,0,4); + $cardIssuer = $IS4C_LOCAL->get("paycard_issuer"); + $cardExM = substr($IS4C_LOCAL->get("paycard_exp"),0,2); + $cardExY = substr($IS4C_LOCAL->get("paycard_exp"),2,2); + $cardTr1 = $IS4C_LOCAL->get("paycard_tr1"); + $cardTr2 = $IS4C_LOCAL->get("paycard_tr2"); + $cardName = $IS4C_LOCAL->get("paycard_name"); + $refNum = $this->refnum($transID); + $live = 1; + + $this->voidTrans = $transID; + $this->voidRef = $IS4C_LOCAL->get("paycard_trans"); + $temp = explode("-",$this->voidRef); + $laneNo = $temp[1]; + $transNo = $temp[2]; + + $merchantID = GOEMERCH_ID; + $password = GOEMERCH_PASSWD; + $gatewayID = GOEMERCH_GATEWAY_ID; + if ($IS4C_LOCAL->get("training") == 1){ + $merchantID = "1264"; + $password = "password"; + $cardPAN = "4111111111111111"; + $gatewayID = "a91c38c3-7d7f-4d29-acc7-927b4dca0dbe"; + $cardPANmasked = "xxxxxxxxxxxxTEST"; + $cardIssuer = "Visa"; + $cardName = "Just Testing"; + $nextyear = mktime(0,0,0,date("m"),date("d"),date("Y")+1); + $cardExM = date("m",$nextyear); + $cardExY = date("y",$nextyear); + $live = 0; + } + + // look up the TransactionID from the original response (card number and amount should already be in session vars) + $sql = "SELECT refNum,xTransactionID FROM efsnetResponse WHERE [date]='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND transNo=".$transNo." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $result = $dbTrans->query($sql); + if( !$result || $dbTrans->num_rows($result) != 1){ + paycard_reset(); + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); + } + $res = $dbTrans->fetch_array($result); + $TransactionID = $res['xTransactionID']; + + $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; + $xml .= "<TRANSACTION>"; + $xml .= "<FIELDS>"; + $xml .= "<FIELD KEY=\"merchant\">$merchantID</FIELD>"; + if ($password != "") + $xml .= "<FIELD KEY=\"password\">$password</FIELD>"; + $xml .= "<FIELD KEY=\"gateway_id\">$gatewayID</FIELD>"; + $xml .= "<FIELD KEY=\"operation_type\">$mode</FIELD>"; + $xml .= "<FIELD KEY=\"total_number_transactions\">1</FIELD>"; + $xml .= "<FIELD KEY=\"reference_number1\">$TransactionID</FIELD>"; + $xml .= "<FIELD KEY=\"credit_amount1\">$amountText</FIELD>"; + $xml .= "</FIELDS>"; + $xml .= "</TRANSACTION>"; + + $IS4C_LOCAL->set("paycard_PAN",$cardPANmasked); + $IS4C_LOCAL->set("paycard_tr1",False); + $IS4C_LOCAL->set("paycard_tr2",False); + $IS4C_LOCAL->set("paycard_tr3",False); + + $this->GATEWAY = "https://secure.goemerchant.com/secure/gateway/xmlgateway.aspx"; + return $this->curlSend($xml,'POST',True); + } + + // tack time onto reference number for goemerchant order_id + // field. requires uniqueness, doesn't seem to cycle daily + function refnum($transID){ + global $IS4C_LOCAL; + $transNo = (int)$IS4C_LOCAL->get("transno"); + $cashierNo = (int)$IS4C_LOCAL->get("CashierNo"); + $laneNo = (int)$IS4C_LOCAL->get("laneno"); + + // assemble string + $ref = ""; + $ref .= date("ymdHis"); + $ref .= "-"; + $ref .= str_pad($cashierNo, 4, "0", STR_PAD_LEFT); + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } + +} + +?> diff --git a/pos/is4c-web/cc-modules/MercuryGift.php b/pos/is4c-web/cc-modules/MercuryGift.php new file mode 100644 index 000000000..26aee6ce6 --- /dev/null +++ b/pos/is4c-web/cc-modules/MercuryGift.php @@ -0,0 +1,912 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +/* + * Mercury Gift Card processing module + * + */ + +if (!class_exists("BasicCCModule")) include_once($IS4C_PATH."cc-modules/BasicCCModule.php"); + +if (!class_exists("xmlData")) include_once($IS4C_PATH."lib/xmlData.php"); +if (!function_exists("paycard_reset")) include_once($IS4C_PATH."lib/paycardLib.php"); +if (!function_exists("receipt")) include_once($IS4C_PATH."lib/clientscripts.php"); +if (!function_exists("deptkey")) include_once($IS4C_PATH."lib/prehkeys.php"); +if (!function_exists("tDataConnect")) include_once($IS4C_PATH."lib/connect.php"); +if (!class_exists("Void")) include_once($IS4C_PATH."parser-class-lib/parse/Void.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +define('MERCURY_TERMINAL_ID',""); +define('MERCURY_PASSWORD',""); + +class MercuryGift extends BasicCCModule { + var $temp; + var $SOAPACTION = "http://www.mercurypay.com/GiftTransaction"; + var $second_try; + // BEGIN INTERFACE METHODS + + /* handlesType($type) + * $type is a constant as defined in paycardLib.php. + * If you class can handle the given type, return + * True + */ + function handlesType($type){ + if ($type == PAYCARD_TYPE_GIFT) return True; + else return False; + } + + /* entered($validate) + * This function is called in paycardEntered() + * [paycardEntered.php]. This function exists + * to move all type-specific handling code out + * of the paycard* files + */ + function entered($validate,$json){ + global $IS4C_LOCAL,$IS4C_PATH; + // error checks based on card type + if( $IS4C_LOCAL->get("gcIntegrate") != 1) { // credit card integration must be enabled + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Card Integration Disabled","Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + if( $IS4C_LOCAL->get("paycard_mode") == PAYCARD_MODE_VOID) { + // use the card number to find the trans_id + $dbTrans = tDataConnect(); + $today = date('Ymd'); // numeric date only, in an int field + $pan = $this->getPAN(); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + $sql = "SELECT transID FROM valutecRequest WHERE [date]=".$today." AND PAN='".$pan."' " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Card Not Used","That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Multiple Uses","That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = $dbTrans->fetch_array($search); + return $this->paycard_void($payment['transID'],$json); + } + + // check card data for anything else + if( $validate) { + if( paycard_validNumber($IS4C_LOCAL->get("paycard_PAN")) != 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Invalid Card Number", + "Swipe again or type in manually","[clear] to cancel"); + return $json; + } else if( paycard_accepted($IS4C_LOCAL->get("paycard_PAN"), !paycard_live(PAYCARD_TYPE_GIFT)) != 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Unsupported Card Type", + "We cannot process " . $IS4C_LOCAL->get("paycard_issuer") . " cards","[clear] to cancel"); + return $json; + } + } + + // other modes + switch( $IS4C_LOCAL->get("paycard_mode")) { + case PAYCARD_MODE_AUTH: + $IS4C_LOCAL->set("paycard_amount",$IS4C_LOCAL->get("amtdue")); + $IS4C_LOCAL->set("paycard_id",$IS4C_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgAuth.php'; + return $json; + + case PAYCARD_MODE_ACTIVATE: + case PAYCARD_MODE_ADDVALUE: + $IS4C_LOCAL->set("paycard_amount",0); + $IS4C_LOCAL->set("paycard_id",$IS4C_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgGift.php'; + return $json; + + case PAYCARD_MODE_BALANCE: + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgBalance.php'; + return $json; + } // switch mode + + // if we're still here, it's an error + paycard_reset(); + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Invalid Mode", + "This card type does not support that processing mode", + "[clear] to cancel"); + return $json; + } + + /* doSend() + * Process the paycard request and return + * an error value as defined in paycardLib.php. + * + * On success, return PAYCARD_ERR_OK. + * On failure, return anything else and set any + * error messages to be displayed in + * $IS4C_LOCAL->["boxMsg"]. + */ + function doSend($type){ + $this->second_try = False; + switch($type){ + case PAYCARD_MODE_ACTIVATE: + case PAYCARD_MODE_ADDVALUE: + case PAYCARD_MODE_AUTH: + return $this->send_auth(); + case PAYCARD_MODE_VOID: + case PAYCARD_MODE_VOIDITEM: + return $this->send_void(); + case PAYCARD_MODE_BALANCE: + return $this->send_balance(); + default: + return $this->setErrorMsg(0); + } + } + + /* cleanup() + * This function is called when doSend() returns + * PAYCARD_ERR_OK. (see paycardAuthorize.php) + * I use it for tendering, printing + * receipts, etc, but it's really only for code + * cleanliness. You could leave this as is and + * do all the everything inside doSend() + */ + function cleanup($json){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_BALANCE: + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>Gift card balance: $".$resp["Balance"]."<p>\"rp\" to print<br>[enter] to continue</font>"); + break; + case PAYCARD_MODE_ADDVALUE: + case PAYCARD_MODE_ACTIVATE: + //receipt("gcSlip"); + $IS4C_LOCAL->set("autoReprint",1); + $ttl = $IS4C_LOCAL->get("paycard_amount"); + deptkey($ttl*100,9020); + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>New card balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + case PAYCARD_MODE_AUTH: + //receipt("gcSlip"); + $IS4C_LOCAL->set("autoReprint",1); + tender("GD", ($IS4C_LOCAL->get("paycard_amount")*100)); + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Used: $".$IS4C_LOCAL->get("paycard_amount")."<br />New balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + if( !strcasecmp($IS4C_LOCAL->get("paycard_PAN"),"7018525757980004481")) // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<br><b>REMEMBER TO VOID THIS</b><br>(ask IT for details)"); + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip<br>[clear] to cancel and void</font>"); + break; + case PAYCARD_MODE_VOID: + case PAYCARD_MODE_VOIDITEM: + //receipt("gcSlip"); + $IS4C_LOCAL->set("autoReprint",1); + $v = new Void(); + $v->voidid($IS4C_LOCAL->get("paycard_id")); + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Voided</b><font size=-1><p>New balance: $".$resp["Balance"]."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + return $json; + } + + /* paycard_void($transID) + * Argument is trans_id to be voided + * Again, this is for removing type-specific + * code from paycard*.php files. + */ + function paycard_void($transID,$json=array()){ + global $IS4C_LOCAL,$IS4C_PATH; + // situation checking + if( $IS4C_LOCAL->get("gcIntegrate") != 1) { // gift card integration must be enabled + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Card Integration Disabled", + "Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = tDataConnect(); + $today = date('Ymd'); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount FROM valutecRequest WHERE [date]=".$today." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = $dbTrans->fetch_array($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xAuthorized, + xAuthorizationCode FROM valutecResponse WHERE [date]=".$today." + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM valutecRequestMod WHERE [date]=".$today." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID." AND mode='void' AND (xAuthorized='true' or xAuthorized='Appro')"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $voided = $dbTrans->num_rows($search); + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = $dbTrans->fetch_array($search); + + // make sure the gift card transaction is applicable to void + if( !$response || $response['commErr'] != 0 || + $response['httpCode'] != 200 || $response['validResponse'] != 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $voided > 0) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } else if( $request['live'] != paycard_live(PAYCARD_TYPE_GIFT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xAuthorized'] != 'true' + && $response['xAuthorized'] != 'Appro') { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not approved","[clear] to cancel"); + return $json; + } else if( $response['xAuthorizationCode'] < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Invalid authorization number","[clear] to cancel"); + return $json; + } + + // make sure the transaction line-item is applicable to void + if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $IS4C_LOCAL->set("paycard_PAN",$request['PAN']); + if( $request['mode'] == 'refund') + $IS4C_LOCAL->set("paycard_amount",-$request['amount']); + else + $IS4C_LOCAL->set("paycard_amount",$request['amount']); + $IS4C_LOCAL->set("paycard_id",$transID); + $IS4C_LOCAL->set("paycard_type",PAYCARD_TYPE_GIFT); + if( $lineitem['trans_type'] == "T" && $lineitem['trans_subtype'] == "GD") { + $IS4C_LOCAL->set("paycard_mode",PAYCARD_MODE_VOID); + } else { + $IS4C_LOCAL->set("paycard_mode",PAYCARD_MODE_VOIDITEM); + } + + // display FEC code box + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgVoid.php'; + return $json; + } + + // END INTERFACE METHODS + + function send_auth($domain="w1.mercurypay.com"){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = ""; + switch( $IS4C_LOCAL->get("paycard_mode")) { + case PAYCARD_MODE_AUTH: $mode = (($amount < 0) ? 'refund' : 'tender'); break; + case PAYCARD_MODE_ADDVALUE: $mode = 'addvalue'; break; + case PAYCARD_MODE_ACTIVATE: $mode = 'activate'; break; + default: return $this->setErrorMsg(PAYCARD_ERR_NOSEND); + } + $termID = $this->getTermID(); + $password = $this->getPw(); + $live = 0; + $manual = ($IS4C_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // store request in the database before sending it + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime],identifier,terminalID,live," . + "mode,amount,PAN,manual"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s','%s',%d,", $now, $identifier, $termID, $live) . + sprintf("'%s',%s,'%s',%d", $mode, $amountText, $cardPAN, $manual); + $sql = "INSERT INTO valutecRequest (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + if( !$dbTrans->query($sql)){ + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + } + + // assemble and send request + $authMethod = ""; + switch( $mode) { + case 'tender': $authMethod = 'NoNSFSale'; break; + case 'refund': + case 'addvalue': $authMethod = 'Reload'; break; + case 'activate': $authMethod = 'Issue'; break; + } + + $msgXml = "<?xml version=\"1.0\"?> + <TStream> + <Transaction> + <IpPort>9100</IpPort> + <MerchantID>$termID</MerchantID> + <TranType>PrePaid</TranType> + <TranCode>$authMethod</TranCode> + <InvoiceNo>$identifier</InvoiceNo> + <RefNo>$identifier</RefNo> + <Memo>IS4C (WFC)</Memo> + <Account>"; + if ($cardTr2) + $msgXml .= "<Track2>$cardTr2</Track2>"; + else + $msgXml .= "<AcctNo>$cardPAN</AcctNo>"; + $msgXml .= "</Account> + <Amount> + <Purchase>$amountText</Purchase> + </Amount> + </Transaction> + </TStream>"; + + + $soaptext = $this->soapify("GiftTransaction", + array("tran"=>$msgXml,"pw"=>$password), + "http://www.mercurypay.com"); + + + if ($IS4C_LOCAL->get("training") == 1) + $this->GATEWAY = "https://w1.mercurydev.net/ws/ws.asmx"; + else + $this->GATEWAY = "https://$domain/ws/ws.asmx"; + + return $this->curlSend($soaptext,'SOAP'); + } + + function send_void($domain="w1.mercurypay.com"){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $cardPAN = $this->getPAN(); + $identifier = date('mdHis'); // the void itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + + // look up the auth code from the original response + // (card number and amount should already be in session vars) + $sql = "SELECT xAuthorizationCode FROM valutecResponse WHERE [date]='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND + transNo=".$transNo." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + if( !$search || $dbTrans->num_rows($search) != 1) + return PAYCARD_ERR_NOSEND; // database error, nothing sent (ok to retry) + $log = $dbTrans->fetch_array($search); + $authcode = $log['xAuthorizationCode']; + $this->temp = $authcode; + + // look up original transaction type + $sql = "SELECT mode FROM valutecRequest WHERE [date]='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND + transNo=".$transNo." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + if( !$search || $dbTrans->num_rows($search) != 1) + return PAYCARD_ERR_NOSEND; // database error, nothing sent (ok to retry) + $row = $dbTrans->fetch_array($search); + $vdMethod = ""; + switch($row[0]){ + case 'tender': $vdMethod='VoidSale'; break; + case 'refund': $vdMethod='VoidReturn'; break; + case 'addvalue': $vdMethod='VoidReload'; break; + case 'activate': $vdMethod='VoidIssue'; break; + } + + + $msgXml = "<?xml version=\"1.0\"?> + <TStream> + <Transaction> + <IpPort>9100</IpPort> + <MerchantID>$termID</MerchantID> + <TranType>PrePaid</TranType> + <TranCode>$vdMethod</TranCode> + <InvoiceNo>$identifier</InvoiceNo> + <RefNo>$authcode</RefNo> + <Memo>IS4C (WFC)</Memo> + <Account>"; + if ($cardTr2) + $msgXml .= "<Track2>$cardTr2</Track2>"; + else + $msgXml .= "<AcctNo>$cardPAN</AcctNo>"; + $msgXml .= "</Account> + <Amount> + <Purchase>$amountText</Purchase> + </Amount> + </Transaction> + </TStream>"; + + $soaptext = $this->soapify("GiftTransaction", + array("tran"=>$msgXml,"pw"=>$password), + "http://www.mercurypay.com"); + + if ($IS4C_LOCAL->get("training") == 1) + $this->GATEWAY = "https://w1.mercurydev.net/ws/ws.asmx"; + else + $this->GATEWAY = "https://$domain/ws/ws.asmx"; + + return $this->curlSend($soaptext,'SOAP'); + } + + function send_balance($domain="w1.mercurypay.com"){ + global $IS4C_LOCAL; + // prepare data for the request + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = date('mdHis'); // the balance check itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + $password = $this->getPw(); + + $msgXml = "<?xml version=\"1.0\"?> + <TStream> + <Transaction> + <IpPort>9100</IpPort> + <MerchantID>$termID</MerchantID> + <TranType>PrePaid</TranType> + <TranCode>Balance</TranCode> + <InvoiceNo>$identifier</InvoiceNo> + <RefNo>$identifier</RefNo> + <Memo>IS4C (WFC)</Memo> + <Account>"; + if ($cardTr2) + $msgXml .= "<Track2>$cardTr2</Track2>"; + else + $msgXml .= "<AcctNo>$cardPAN</AcctNo>"; + $msgXml .= "</Account> + </Transaction> + </TStream>"; + + $soaptext = $this->soapify("GiftTransaction", + array("tran"=>$msgXml,"pw"=>$password), + "http://www.mercurypay.com"); + + //echo $soaptext; exit; + //$soaptext = str_replace("<pw>$password</pw>","",$soaptext); + //$soaptext = str_replace("</GiftTransaction>", + // "</GiftTransaction><pw>$password</pw>",$soaptext); + + if ($IS4C_LOCAL->get("training") == 1) + $this->GATEWAY = "https://w1.mercurydev.net/ws/ws.asmx"; + else + $this->GATEWAY = "https://$domain/ws/ws.asmx"; + + return $this->curlSend($soaptext,'SOAP'); + } + + function handleResponse($authResult){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_AUTH: + case PAYCARD_MODE_ACTIVATE: + case PAYCARD_MODE_ADDVALUE: + return $this->handleResponseAuth($authResult); + case PAYCARD_MODE_VOID: + case PAYCARD_MODE_VOIDITEM: + return $this->handleResponseVoid($authResult); + case PAYCARD_MODE_BALANCE: + return $this->handleResponseBalance($authResult); + } + } + + function handleResponseAuth($authResult){ + global $IS4C_LOCAL; + $resp = $this->desoapify("GiftTransactionResult", + $authResult["response"]); + $xml = new xmlData($resp); + + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $program = 'Gift'; + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // prepare some fields to store the parsed response; we'll add more as we verify it + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime],identifier," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',", $now, $identifier) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + $errorMsg = $xml->get_first("TEXTRESPONSE"); + $balance = $xml->get_first("BALANCE"); + + + if ($validResponse){ + // verify that echo'd fields match our request + if( $xml->get('TRANTYPE') && $xml->get('TRANTYPE') == "PrePaid" + && $xml->get('INVOICENO') && $xml->get('INVOICENO') == $identifier + && $xml->get('CMDSTATUS') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else{ + if (!$xml->get('CMDSTATUS')) + $validResponse = -2; // response was parsed as XML but fields didn't match + if (!$xml->get('TRANTYPE')) + $validResponse = -3; // response was parsed as XML but fields didn't match + if (!$xml->get('INVOICENO')) + $validResponse = -4; // response was parsed as XML but fields didn't match + } + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".substr($xml->get("CMDSTATUS"),0,5)."'"; + $sqlValues .= ",'".$xml->get("REFNO")."'"; + $sqlValues .= ",'".$balance."'"; + $sqlValues .= ",'".str_replace("'","",$errorMsg)."'"; + } + + // finish storing the response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + // check for communication errors (any cURL error or any HTTP code besides 200) + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + if (!$this->second_try){ + $this->second_try = True; + return $this->send_auth("w2.backuppay.com"); + } + else { + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); + } + + // check for data errors (any failure to parse response XML or echo'd field mismatch + if( $validResponse != 1) { + return $this->setErrorMsg(PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was processed (use carbon) + } + + // put the parsed response into $IS4C_LOCAL so the caller, receipt printer, etc can get the data they need + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $IS4C_LOCAL->get("paycard_response"); + $temp["Balance"] = $temp["BALANCE"]; + $IS4C_LOCAL->set("paycard_response",$temp); + if ($xml->get_first("AUTHORIZE")){ + $IS4C_LOCAL->set("paycard_amount",$xml->get_first("AUTHORIZE")); + $correctionQ = sprintf("UPDATE valutecRequest SET amount=%f WHERE + date=%s AND identifier='%s'", + $xml->get_first("AUTHORIZE"),date("Ymd"),$identifier); + $dbTrans->query($correctionQ); + } + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('CMDSTATUS') == 'Approved' && $xml->get('REFNO') != '' ){ + return PAYCARD_ERR_OK; // authorization approved, no error + } + + // the authorizor gave us some failure code + $IS4C_LOCAL->set("boxMsg","Processor error: ".$errorMsg); + return PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + function handleResponseVoid($vdResult){ + global $IS4C_LOCAL; + $resp = $this->desoapify("GiftTransactionResult", + $vdResult["response"]); + $xml = new xmlData($resp); + + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $authcode = $this->temp; + $program = "Gift"; + + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID,[datetime]," . + "mode,origAuthCode," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("'%s','%s',", $mode, $authcode) . + sprintf("%f,%d,%d", $vdResult['curlTime'], $vdResult['curlErr'], $vdResult['curlHTTP']); + + $validResponse = 0; + // verify that echo'd fields match our request + if( $xml->get('TRANTYPE') + && $xml->get('CMDSTATUS') + && $xml->get('BALANCE') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else + $validResponse = -2; // response was parsed as XML but fields didn't match + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".substr($xml->get("CMDSTATUS"),0,5)."'"; + $sqlValues .= ",'".$xml->get("REFNO")."'"; + $sqlValues .= ",'".$xml->get("BALANCE")."'"; + $sqlValues .= ",'".$xml->get_first("TEXTRESPONSE")."'"; + + // finish storing the request and response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + if( $vdResult['curlErr'] != CURLE_OK || $vdResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + if (!$this->second_try){ + $this->second_try = True; + return $this->send_void("w2.backuppay.com"); + } + else { + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); // comm error, try again + } + // check for data errors (any failure to parse response XML or echo'd field mismatch) + if( $validResponse != 1) { + return $this->setErrorMsg(PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was voided (use carbon) + } + + // put the parsed response into $IS4C_LOCAL so the caller, receipt printer, etc can get the data they need + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $IS4C_LOCAL->get("paycard_response"); + $temp["Balance"] = $temp["BALANCE"]; + $IS4C_LOCAL->set("paycard_response",$temp); + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('CMDSTATUS') == 'Approved' && $xml->get('REFNO') != '' ){ + return PAYCARD_ERR_OK; // void successful, no error + } + + // the authorizor gave us some failure code + $IS4C_LOCAL->set("boxMsg","PROCESSOR ERROR: ".$xml->get_first("ERRORMSG")); + return PAYCARD_ERR_PROC; + } + + function handleResponseBalance($balResult){ + global $IS4C_LOCAL; + $resp = $this->desoapify("GiftTransactionResult", + $balResult["response"]); + $xml = new xmlData($resp); + $program = 'Gift'; + + if( $balResult['curlErr'] != CURLE_OK || $balResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + if (!$this->second_try){ + $this->second_try = True; + return $this->send_balance("w2.backuppay.com"); + } + else { + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); // comm error, try again + } + + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_response",$xml->array_dump()); + $resp = $IS4C_LOCAL->get("paycard_response"); + if (isset($resp["BALANCE"])){ + $resp["Balance"] = $resp["BALANCE"]; + $IS4C_LOCAL->set("paycard_response",$resp); + } + + // there's less to verify for balance checks, just make sure all the fields are there + if( $xml->isValid() && + $xml->get('TRANTYPE') && $xml->get('TRANTYPE') == 'PrePaid' + && $xml->get('CMDSTATUS') && $xml->get('CMDSTATUS') == 'Approved' + && $xml->get('BALANCE') + ) { + return PAYCARD_ERR_OK; // balance checked, no error + } + + // the authorizor gave us some failure code + $IS4C_LOCAL->set("boxMsg","Processor error: ".$xml->get_first("TEXTRESPONSE")); + return PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + // generate a partially-daily-unique identifier number according to the gift card processor's limitations + // along with their CashierID field, it will be a daily-unique identifier on the transaction + function valutec_identifier($transID) { + global $IS4C_LOCAL; + $transNo = (int)$IS4C_LOCAL->get("transno"); + $laneNo = (int)$IS4C_LOCAL->get("laneno"); + // fail if any field is too long (we don't want to truncate, since that might produce a non-unique refnum and cause bigger problems) + if( $transID > 999 || $transNo > 999 || $laneNo > 99) + return ""; + // assemble string + $ref = "00"; // fill all 10 digits, since they will if we don't and we want to compare with == later + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } // valutec_identifier() + + function getTermID(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return "595901"; + else + return MERCURY_TERMINAL_ID; + } + + function getPw(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1){ + return "xyz"; + } + else + return MERCURY_PASSWORD; + } + + function getPAN(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return "6050110000000296951"; + else + return $IS4C_LOCAL->get("paycard_PAN"); + } + + function getTrack2(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return False; + else + return $IS4C_LOCAL->get("paycard_tr2"); + } +} diff --git a/pos/is4c-web/cc-modules/Valutec.php b/pos/is4c-web/cc-modules/Valutec.php new file mode 100644 index 000000000..d0b8ffe6c --- /dev/null +++ b/pos/is4c-web/cc-modules/Valutec.php @@ -0,0 +1,840 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +/* + * Valutec processing module + * + */ + +if (!class_exists("BasicCCModule")) include_once($IS4C_PATH."cc-modules/BasicCCModule.php"); + +if (!class_exists("xmlData")) include_once($IS4C_PATH."lib/xmlData.php"); +if (!function_exists("paycard_reset")) include_once($IS4C_PATH."lib/paycardLib.php"); +if (!function_exists("receipt")) include_once($IS4C_PATH."lib/clientscripts.php"); +if (!function_exists("deptkey")) include_once($IS4C_PATH."lib/prehkeys.php"); +if (!function_exists("tDataConnect")) include_once($IS4C_PATH."lib/connect.php"); +if (!class_exists("Void")) include_once($IS4C_PATH."parser-class-lib/parse/Void.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +class Valutec extends BasicCCModule { + var $temp; + // BEGIN INTERFACE METHODS + + /* handlesType($type) + * $type is a constant as defined in paycardLib.php. + * If you class can handle the given type, return + * True + */ + function handlesType($type){ + if ($type == PAYCARD_TYPE_GIFT) return True; + else return False; + } + + /* entered($validate) + * This function is called in paycardEntered() + * [paycardEntered.php]. This function exists + * to move all type-specific handling code out + * of the paycard* files + */ + function entered($validate,$json){ + global $IS4C_LOCAL,$IS4C_PATH; + // error checks based on card type + if( $IS4C_LOCAL->get("gcIntegrate") != 1) { // credit card integration must be enabled + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Card Integration Disabled","Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // error checks based on processing mode + if( $IS4C_LOCAL->get("paycard_mode") == PAYCARD_MODE_VOID) { + // use the card number to find the trans_id + $dbTrans = tDataConnect(); + $today = date('Ymd'); // numeric date only, in an int field + $pan = $this->getPAN(); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + $sql = "SELECT transID FROM valutecRequest WHERE [date]=".$today." AND PAN='".$pan."' " . + "AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Card Not Used","That card number was not used in this transaction","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Multiple Uses","That card number was used more than once in this transaction; select the payment and press VOID","[clear] to cancel"); + return $json; + } + $payment = $dbTrans->fetch_array($search); + return $this->paycard_void($payment['transID'],$json); + } + + // check card data for anything else + if( $validate) { + if( paycard_validNumber($IS4C_LOCAL->get("paycard_PAN")) != 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Invalid Card Number", + "Swipe again or type in manually","[clear] to cancel"); + return $json; + } else if( paycard_accepted($IS4C_LOCAL->get("paycard_PAN"), !paycard_live(PAYCARD_TYPE_GIFT)) != 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Unsupported Card Type", + "We cannot process " . $IS4C_LOCAL->get("paycard_issuer") . " cards","[clear] to cancel"); + return $json; + } + } + + // other modes + switch( $IS4C_LOCAL->get("paycard_mode")) { + case PAYCARD_MODE_AUTH: + $IS4C_LOCAL->set("paycard_amount",$IS4C_LOCAL->get("amtdue")); + $IS4C_LOCAL->set("paycard_id",$IS4C_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgAuth.php'; + return $json; + + case PAYCARD_MODE_ACTIVATE: + case PAYCARD_MODE_ADDVALUE: + $IS4C_LOCAL->set("paycard_amount",0); + $IS4C_LOCAL->set("paycard_id",$IS4C_LOCAL->get("LastID")+1); // kind of a hack to anticipate it this way.. + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgGift.php'; + return $json; + + case PAYCARD_MODE_BALANCE: + // forbid balance check on testcard2, because it prevents voiding of anything before (like activation), + // and we want testcard2 to remain inactive so that we can use it to test activations + if( !strcasecmp($IS4C_LOCAL->get("paycard_PAN"),"7018525757980004481")) { // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Not Allowed", + "The second test gift card may not be Balance-Checked<br>Ask IT for details", + "[clear] to cancel"); + return $json; + } + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgBalance.php'; + return $json; + } // switch mode + + // if we're still here, it's an error + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Invalid Mode", + "This card type does not support that processing mode", + "[clear] to cancel"); + return $json; + } + + /* doSend() + * Process the paycard request and return + * an error value as defined in paycardLib.php. + * + * On success, return PAYCARD_ERR_OK. + * On failure, return anything else and set any + * error messages to be displayed in + * $IS4C_LOCAL->["boxMsg"]. + */ + function doSend($type){ + switch($type){ + case PAYCARD_MODE_ACTIVATE: + case PAYCARD_MODE_ADDVALUE: + case PAYCARD_MODE_AUTH: + return $this->send_auth(); + case PAYCARD_MODE_VOID: + case PAYCARD_MODE_VOIDITEM: + return $this->send_void(); + case PAYCARD_MODE_BALANCE: + return $this->send_balance(); + default: + return $this->setErrorMsg(0); + } + } + + /* cleanup() + * This function is called when doSend() returns + * PAYCARD_ERR_OK. (see paycardAuthorize.php) + * I use it for tendering, printing + * receipts, etc, but it's really only for code + * cleanliness. You could leave this as is and + * do all the everything inside doSend() + */ + function cleanup($json){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_BALANCE: + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>Gift card balance: $".$resp["Balance"]."<p>\"rp\" to print<br>[enter] to continue</font>"); + break; + case PAYCARD_MODE_ADDVALUE: + case PAYCARD_MODE_ACTIVATE: + $IS4C_LOCAL->set("autoReprint",1); + $ttl = $IS4C_LOCAL->get("paycard_amount"); + deptkey($ttl*100,9020); + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Success</b><font size=-1><p>New card balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + if( !strcasecmp($IS4C_LOCAL->get("paycard_PAN"),"7018525757980004481")) // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<br><b>REMEMBER TO VOID THIS</b><br>(ask IT for details)"); + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + case PAYCARD_MODE_AUTH: + $IS4C_LOCAL->set("autoReprint",1); + tender("GD", ($IS4C_LOCAL->get("paycard_amount")*100)); + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Approved</b><font size=-1><p>Used: $".$IS4C_LOCAL->get("paycard_amount")."<br />New balance: $".$resp["Balance"]); + // reminder to void everything on testgift2, so that it remains inactive to test activations + if( !strcasecmp($IS4C_LOCAL->get("paycard_PAN"),"7018525757980004481")) // == doesn't work because the string is numeric and very large, so PHP has trouble turning it into an (int) for comparison + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<br><b>REMEMBER TO VOID THIS</b><br>(ask IT for details)"); + $IS4C_LOCAL->set("boxMsg",$IS4C_LOCAL->get("boxMsg")."<p>[enter] to continue<br>\"rp\" to reprint slip<br>[void] to cancel and void</font>"); + break; + case PAYCARD_MODE_VOID: + case PAYCARD_MODE_VOIDITEM: + $IS4C_LOCAL->set("autoReprint",1); + $v = new Void(); + $v->voidid($IS4C_LOCAL->get("paycard_id")); + $resp = $IS4C_LOCAL->get("paycard_response"); + $IS4C_LOCAL->set("boxMsg","<b>Voided</b><font size=-1><p>New balance: $".$resp["Balance"]."<p>[enter] to continue<br>\"rp\" to reprint slip</font>"); + break; + } + return $json; + } + + /* paycard_void($transID) + * Argument is trans_id to be voided + * Again, this is for removing type-specific + * code from paycard*.php files. + */ + function paycard_void($transID,$json=array()){ + global $IS4C_LOCAL,$IS4C_PATH; + // situation checking + if( $IS4C_LOCAL->get("gcIntegrate") != 1) { // gift card integration must be enabled + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Card Integration Disabled", + "Please process gift cards in standalone","[clear] to cancel"); + return $json; + } + + // initialize + $dbTrans = tDataConnect(); + $today = date('Ymd'); + $cashier = $IS4C_LOCAL->get("CashierNo"); + $lane = $IS4C_LOCAL->get("laneno"); + $trans = $IS4C_LOCAL->get("transno"); + + // look up the request using transID (within this transaction) + $sql = "SELECT live,PAN,mode,amount FROM valutecRequest WHERE [date]=".$today." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card request not distinct, unable to void","[clear] to cancel"); + return $json; + } + $request = $dbTrans->fetch_array($search); + + // look up the response + $sql = "SELECT commErr,httpCode,validResponse,xAuthorized, + xAuthorizationCode FROM valutecResponse WHERE [date]=".$today." + AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] =paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Card response not distinct, unable to void","[clear] to cancel"); + return $json; + } + $response = $dbTrans->fetch_array($search); + + // look up any previous successful voids + $sql = "SELECT transID FROM valutecRequestMod WHERE [date]=".$today." AND cashierNo=".$cashier." AND laneNo=".$lane." AND transNo=".$trans." AND transID=".$transID." AND mode='void' AND xAuthorized='true'"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + $voided = $dbTrans->num_rows($search); + // look up the transaction tender line-item + $sql = "SELECT trans_type,trans_subtype,trans_status,voided + FROM localtemptrans WHERE trans_id=" . $transID; + $search = $dbTrans->query($sql); + $num = $dbTrans->num_rows($search); + if( $num < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not found, unable to void","[clear] to cancel"); + return $json; + } else if( $num > 1) { + $json['output'] =paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Transaction item not distinct, unable to void","[clear] to cancel"); + return $json; + } + $lineitem = $dbTrans->fetch_array($search); + + // make sure the gift card transaction is applicable to void + if( !$response || $response['commErr'] != 0 || + $response['httpCode'] != 200 || $response['validResponse'] != 1) { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not successful","[clear] to cancel"); + return $json; + } else if( $voided > 0) { + $json['output'] =paycard_errBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction already voided","[clear] to cancel"); + return $json; + } else if( $request['live'] != paycard_live(PAYCARD_TYPE_GIFT)) { + // this means the transaction was submitted to the test platform, but we now think we're in live mode, or vice-versa + // I can't imagine how this could happen (short of serious $_SESSION corruption), but worth a check anyway.. --atf 7/26/07 + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Processor platform mismatch","[clear] to cancel"); + return $json; + } else if( $response['xAuthorized'] != 'true') { + $json['output'] = paycard_msgBox(PAYCARD_TYPE_GIFT,"Unable to Void", + "Card transaction not approved","[clear] to cancel"); + return $json; + } else if( $response['xAuthorizationCode'] < 1) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Invalid authorization number","[clear] to cancel"); + return $json; + } + + // make sure the transaction line-item is applicable to void + if( $lineitem['trans_status'] == "V" || $lineitem['voided'] != 0) { + $json['output'] = paycard_errBox(PAYCARD_TYPE_GIFT,"Internal Error", + "Void records do not match","[clear] to cancel"); + return $json; + } + + // save the details + $IS4C_LOCAL->set("paycard_PAN",$request['PAN']); + if( $request['mode'] == 'refund') + $IS4C_LOCAL->set("paycard_amount",-$request['amount']); + else + $IS4C_LOCAL->set("paycard_amount",$request['amount']); + $IS4C_LOCAL->set("paycard_id",$transID); + $IS4C_LOCAL->set("paycard_type",PAYCARD_TYPE_GIFT); + if( $lineitem['trans_type'] == "T" && $lineitem['trans_subtype'] == "GD") { + $IS4C_LOCAL->set("paycard_mode",PAYCARD_MODE_VOID); + } else { + $IS4C_LOCAL->set("paycard_mode",PAYCARD_MODE_VOIDITEM); + } + + // display FEC code box + $json['main_frame'] = $IS4C_PATH.'gui-modules/paycardboxMsgVoid.php'; + return $json; + } + + // END INTERFACE METHODS + + function send_auth(){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = ""; + switch( $IS4C_LOCAL->get("paycard_mode")) { + case PAYCARD_MODE_AUTH: $mode = (($amount < 0) ? 'refund' : 'tender'); break; + case PAYCARD_MODE_ADDVALUE: $mode = 'addvalue'; break; + case PAYCARD_MODE_ACTIVATE: $mode = 'activate'; break; + default: return $this->setErrorMsg(PAYCARD_ERR_NOSEND); + } + $termID = $this->getTermID(); + $live = $this->isLive(); + $manual = ($IS4C_LOCAL->get("paycard_manual") ? 1 : 0); + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // store request in the database before sending it + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime],identifier,terminalID,live," . + "mode,amount,PAN,manual"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s','%s',%d,", $now, $identifier, $termID, $live) . + sprintf("'%s',%s,'%s',%d", $mode, $amountText, $cardPAN, $manual); + $sql = "INSERT INTO valutecRequest (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + if( !$dbTrans->query($sql)){ + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + } + + // assemble and send request + $authMethod = ""; + switch( $mode) { + case 'tender': $authMethod = 'Sale'; break; + case 'refund': + case 'addvalue': $authMethod = 'AddValue'; break; + case 'activate': $authMethod = 'ActivateCard'; break; + } + + $authFields = array( + 'ProgramType' => $program, + 'CardNumber' => (($cardTr2) ? $cardTr2 : $cardPAN), + 'Amount' => $amountText, + 'ServerID' => $cashierNo, + 'Identifier' => $identifier + ); + + $this->GATEWAY = "https://www.valutec.net/customers/transactions/valutec.asmx/"; + + $getData = urlencode($authMethod)."?"; + $getData .= "TerminalID=".urlencode($termID); + foreach ($authFields as $field => $value) + $getData .= "&".urlencode($field)."=".urlencode($value); + + return $this->curlSend($getData,'GET'); + } + + function send_void(){ + global $IS4C_LOCAL; + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $cardPAN = $this->getPAN(); + $identifier = date('mdHis'); // the void itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + + // look up the auth code from the original response + // (card number and amount should already be in session vars) + $sql = "SELECT xAuthorizationCode FROM valutecResponse WHERE [date]='".$today."'" . + " AND cashierNo=".$cashierNo." AND laneNo=".$laneNo." AND + transNo=".$transNo." AND transID=".$transID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $search = $dbTrans->query($sql); + if( !$search || $dbTrans->num_rows($search) != 1) + return PAYCARD_ERR_NOSEND; // database error, nothing sent (ok to retry) + $log = $dbTrans->fetch_array($search); + $authcode = $log['xAuthorizationCode']; + $this->temp = $authcode; + + // assemble and send void request + $vdMethod = 'Void'; + $vdFields = array( + 'ProgramType' => $program, + 'CardNumber' => $cardPAN, + 'RequestAuthCode' => $authcode, + 'ServerID' => $cashierNo, + 'Identifier' => $identifier + ); + + $this->GATEWAY = "https://www.valutec.net/customers/transactions/valutec.asmx/"; + + $getData = urlencode($vdMethod)."?"; + $getData .= "TerminalID=".urlencode($termID); + foreach($vdFields as $field=>$value) + $getData .= "&".urlencode($field)."=".urlencode($value); + + return $this->curlSend($getData,'GET'); + + return $this->setErrorMsg(0); + } + + function send_balance(){ + global $IS4C_LOCAL; + // prepare data for the request + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $program = 'Gift'; // valutec also has 'Loyalty' cards which store arbitrary point values + $cardPAN = $this->getPAN(); + $cardTr2 = $this->getTrack2(); + $identifier = date('mdHis'); // the balance check itself needs a unique identifier, so just use a timestamp minus the year (10 digits only) + $termID = $this->getTermID(); + + // assemble and send balance check + $balMethod = 'CardBalance'; + $balFields = array( + 'ProgramType' => $program, + 'CardNumber' => (($cardTr2) ? $cardTr2 : $cardPAN), + 'ServerID' => $cashierNo, + 'Identifier' => $identifier + ); + + $this->GATEWAY = "https://www.valutec.net/customers/transactions/valutec.asmx/"; + + $getData = urlencode($balMethod)."?"; + $getData .= "TerminalID=".urlencode($termID); + foreach($balFields as $field=>$value) + $getData .= "&".urlencode($field)."=".urlencode($value); + + return $this->curlSend($getData,'GET'); + } + + function handleResponse($authResult){ + global $IS4C_LOCAL; + switch($IS4C_LOCAL->get("paycard_mode")){ + case PAYCARD_MODE_AUTH: + case PAYCARD_MODE_ACTIVATE: + case PAYCARD_MODE_ADDVALUE: + return $this->handleResponseAuth($authResult); + case PAYCARD_MODE_VOID: + case PAYCARD_MODE_VOIDITEM: + return $this->handleResponseVoid($authResult); + case PAYCARD_MODE_BALANCE: + return $this->handleResponseBalance($authResult); + } + } + + function handleResponseAuth($authResult){ + global $IS4C_LOCAL; + $xml = new xmlData($authResult["response"]); + + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // internal error, nothing sent (ok to retry) + + // prepare data for the request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $program = 'Gift'; + $identifier = $this->valutec_identifier($transID); // valutec allows 10 digits; this uses lanenum-transnum-transid since we send cashiernum in another field + + // prepare some fields to store the parsed response; we'll add more as we verify it + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID," . + "[datetime],identifier," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,", $today, $cashierNo, $laneNo, $transNo, $transID) . + sprintf("'%s','%s',", $now, $identifier) . + sprintf("%f,%d,%d", $authResult['curlTime'], $authResult['curlErr'], $authResult['curlHTTP']); + + $validResponse = ($xml->isValid()) ? 1 : 0; + $errorMsg = $xml->get_first("ERRORMSG"); + $balance = $xml->get("BALANCE"); + + if ($validResponse){ + /* + tendering more than the available balance returns an "NSF" error message, + but no Balance field however, the available balance is buried in the + RawOutput field, so we can dig it out and fill in the missing Balance field + -- as of 1/22/08, valutec appears to now be returning the Balance field normally + (in its own XML field, not in RawOutput), but we still need to append it to + the Message so the cashier can see it + */ + if ($errorMsg && substr($errorMsg,0,3) == "NSF"){ + if (!$balance || $balance === ""){ + $rawOutput = $xml->get("RAWOUTPUT"); + $begin = strpos($rawOutput, "%1cBAL%3a"); + if( $begin !== false) { + $end = strpos($rawOutput, "%1c", $begin+1); + if( $end !== false && $end > $begin) { + $balance = trim(urldecode(substr($rawOutput,$begin+9,($end-$begin)-9))); + } + } + } + elseif ($balance && $balance !== ""){ + $errorMsg = "NSF, BAL: ".paycard_moneyFormat($balance); + } + } + + // verify that echo'd fields match our request + if( $xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program + && $xml->get('IDENTIFIER') && $xml->get('IDENTIFIER') == $identifier + && $xml->get('AUTHORIZED') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else + $validResponse = -2; // response was parsed as XML but fields didn't match + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".$xml->get("AUTHORIZED")."'"; + $sqlValues .= ",'".$xml->get("AUTHORIZATIONCODE")."'"; + $sqlValues .= ",'".$balance."'"; + $sqlValues .= ",'".str_replace("'","",$errorMsg)."'"; + } + + // finish storing the response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecResponse (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + // check for communication errors (any cURL error or any HTTP code besides 200) + if( $authResult['curlErr'] != CURLE_OK || $authResult['curlHTTP'] != 200){ + if ($authResult['curlHTTP'] == '0'){ + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); + } + + // check for data errors (any failure to parse response XML or echo'd field mismatch + if( $validResponse != 1) { + return $this->setErrorMsg(PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was processed (use carbon) + } + + $amtUsed = $xml->get('CARDAMOUNTUSED'); + if ($amtUsed){ + $IS4C_LOCAL->set("paycard_amount",$amtUsed); + $amtFixQ = "UPDATE valutecRequest SET amount=$amtUsed WHERE + identifier='$identifier' AND datediff(dd,getdate(),datetime)=0"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $amtFixQ = str_replace("dd,getdate()","now()",$amtFixQ); + $dbTrans->query($amtFixQ); + } + + // put the parsed response into $IS4C_LOCAL so the caller, receipt printer, etc can get the data they need + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $IS4C_LOCAL->get("paycard_response"); + $temp["Balance"] = $temp["BALANCE"]; + $IS4C_LOCAL->set("paycard_response",$temp); + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('AUTHORIZED') == 'true' && $xml->get('AUTHORIZATIONCODE') != '' && + $xml->get_first('ERRORMSG') == '') { + return PAYCARD_ERR_OK; // authorization approved, no error + } + + // the authorizor gave us some failure code + $IS4C_LOCAL->set("boxMsg","Processor error: ".$errorMsg); + return PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + function handleResponseVoid($vdResult){ + global $IS4C_LOCAL; + $xml = new xmlData($vdResult["response"]); + + // initialize + $dbTrans = tDataConnect(); + if( !$dbTrans) + return $this->setErrorMsg(PAYCARD_ERR_NOSEND); // database error, nothing sent (ok to retry) + + // prepare data for the void request + $today = date('Ymd'); // numeric date only, it goes in an 'int' field as part of the primary key + $now = date('Y-m-d H:i:s'); // full timestamp + $cashierNo = $IS4C_LOCAL->get("CashierNo"); + $laneNo = $IS4C_LOCAL->get("laneno"); + $transNo = $IS4C_LOCAL->get("transno"); + $transID = $IS4C_LOCAL->get("paycard_id"); + $amount = $IS4C_LOCAL->get("paycard_amount"); + $amountText = number_format(abs($amount), 2, '.', ''); + $mode = 'void'; + $authcode = $this->temp; + $program = "Gift"; + + $sqlColumns = + "[date],cashierNo,laneNo,transNo,transID,[datetime]," . + "mode,origAuthCode," . + "seconds,commErr,httpCode"; + $sqlValues = + sprintf("%d,%d,%d,%d,%d,'%s',", $today, $cashierNo, $laneNo, $transNo, $transID, $now) . + sprintf("'%s','%s',", $mode, $authcode) . + sprintf("%f,%d,%d", $vdResult['curlTime'], $vdResult['curlErr'], $vdResult['curlHTTP']); + + $validResponse = 0; + // verify that echo'd fields match our request + if( $xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program + && $xml->get('AUTHORIZED') + && $xml->get('AUTHORIZATIONCODE') + && $xml->get('BALANCE') + ) + $validResponse = 1; // response was parsed normally, echo'd fields match, and other required fields are present + else + $validResponse = -2; // response was parsed as XML but fields didn't match + + $sqlColumns .= ",xAuthorized,xAuthorizationCode,xBalance,xErrorMsg"; + $sqlValues .= ",'".$xml->get("AUTHORIZED")."'"; + $sqlValues .= ",'".$xml->get("AUTHORIZATIONCODE")."'"; + $sqlValues .= ",'".$xml->get("BALANCE")."'"; + $sqlValues .= ",'".$xml->get_first("ERRORMSG")."'"; + + // finish storing the request and response in the database before reacting to it + $sqlColumns .= ",validResponse"; + $sqlValues .= ",".$validResponse; + $sql = "INSERT INTO valutecRequestMod (" . $sqlColumns . ") VALUES (" . $sqlValues . ")"; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + } + $dbTrans->query($sql); + + if( $vdResult['curlErr'] != CURLE_OK || $vdResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); // comm error, try again + } + // check for data errors (any failure to parse response XML or echo'd field mismatch) + if( $validResponse != 1) { + return $this->setErrorMsg(PAYCARD_ERR_DATA); // invalid server response, we don't know if the transaction was voided (use carbon) + } + + // put the parsed response into $IS4C_LOCAL so the caller, receipt printer, etc can get the data they need + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_response",$xml->array_dump()); + $temp = $IS4C_LOCAL->get("paycard_response"); + $temp["Balance"] = $temp["BALANCE"]; + $IS4C_LOCAL->set("paycard_response",$temp); + + // comm successful, check the Authorized, AuthorizationCode and ErrorMsg fields + if( $xml->get('AUTHORIZED') == 'true' && $xml->get('AUTHORIZATIONCODE') != '' + && $xml->get_first('ERRORMSG') == '') { + return PAYCARD_ERR_OK; // void successful, no error + } + + // the authorizor gave us some failure code + $IS4C_LOCAL->set("boxMsg","PROCESSOR ERROR: ".$xml->get_first("ERRORMSG")); + return PAYCARD_ERR_PROC; + } + + function handleResponseBalance($balResult){ + global $IS4C_LOCAL; + $xml = new xmlData($balResult["response"]); + $program = 'Gift'; + + if( $balResult['curlErr'] != CURLE_OK || $balResult['curlHTTP'] != 200) { + if ($authResult['curlHTTP'] == '0'){ + $IS4C_LOCAL->set("boxMsg","No response from processor<br /> + The transaction did not go through"); + return PAYCARD_ERR_PROC; + } + return $this->setErrorMsg(PAYCARD_ERR_COMM); // comm error, try again + } + + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_response",$xml->array_dump()); + $resp = $IS4C_LOCAL->get("paycard_response"); + if (isset($resp["BALANCE"])){ + $resp["Balance"] = $resp["BALANCE"]; + $IS4C_LOCAL->set("paycard_response",$resp); + } + + // there's less to verify for balance checks, just make sure all the fields are there + if( $xml->isValid() && + $xml->get('TRANSACTIONTYPE') && $xml->get('TRANSACTIONTYPE') == $program + && $xml->get('AUTHORIZED') && $xml->get('AUTHORIZED') == 'true' + && (!$xml->get('ERRORMSG') || $xml->get_first('ERRORMSG') == '') + && $xml->get('BALANCE') + ) { + return PAYCARD_ERR_OK; // balance checked, no error + } + + // the authorizor gave us some failure code + $IS4C_LOCAL->set("boxMsg","Processor error: ".$xml->get_first("ERRORMSG")); + return PAYCARD_ERR_PROC; // authorization failed, response fields in $_SESSION["paycard_response"] + } + + // generate a partially-daily-unique identifier number according to the gift card processor's limitations + // along with their CashierID field, it will be a daily-unique identifier on the transaction + function valutec_identifier($transID) { + global $IS4C_LOCAL; + $transNo = (int)$IS4C_LOCAL->get("transno"); + $laneNo = (int)$IS4C_LOCAL->get("laneno"); + // fail if any field is too long (we don't want to truncate, since that might produce a non-unique refnum and cause bigger problems) + if( $transID > 999 || $transNo > 999 || $laneNo > 99) + return ""; + // assemble string + $ref = "00"; // fill all 10 digits, since they will if we don't and we want to compare with == later + $ref .= str_pad($laneNo, 2, "0", STR_PAD_LEFT); + $ref .= str_pad($transNo, 3, "0", STR_PAD_LEFT); + $ref .= str_pad($transID, 3, "0", STR_PAD_LEFT); + return $ref; + } // valutec_identifier() + + function getTermID(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return "45095"; + else + return $IS4C_LOCAL->get("gcTermID"); + } + + function getPAN(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return "7018525936200000012"; + else + return $IS4C_LOCAL->get("paycard_PAN"); + } + + function isLive(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return 0; + else + return 1; + } + + function getTrack2(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("training") == 1) + return "7018525936200000012=68893620"; + else + return $IS4C_LOCAL->get("paycard_tr2"); + } +} diff --git a/pos/is4c-web/cc-modules/cacert.pem b/pos/is4c-web/cc-modules/cacert.pem new file mode 100644 index 000000000..10cd6b98b --- /dev/null +++ b/pos/is4c-web/cc-modules/cacert.pem @@ -0,0 +1,3113 @@ +## +## cacert.pem-foo -- Bundle of CA Root Certificates +## +## Converted at: Sat Aug 23 21:39:56 2008 UTC +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## '/mozilla/security/nss/lib/ckfw/builtins/certdata.txt' +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Netscape security libraries. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1994-2000 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.49 $ $Date: 2008/08/14 18:15:56 $ + +Verisign/RSA Secure Server CA +============================= +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +IDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVow +XzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQL +EyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUA +A4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1Xp +sSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJ +VCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw4jrg7HFG +mhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2 +qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- + +GTE CyberTrust Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAw +WhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9u +MRwwGgYDVQQDExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH +6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswk +wB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEP +I2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGvU9oUtCG4 +1tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Personal Basic CA +======================== +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs +dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMY +VGhhd3RlIFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0 +aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhh +d3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +ITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29u +YWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C +FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJ +l+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY +0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAt4plrsD16 +iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7c8a914phXAPjLSeoF+CEhULcXpvG +t7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN +92NWod8isQ== +-----END CERTIFICATE----- + +Thawte Personal Premium CA +========================== +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs +dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMa +VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1p +dW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQG +EwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoT +EVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlz +aW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYb +cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ +Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ +8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicR +FTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GB +AGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIHb4Vnjt4rueIXsDqg8A6iAJrf8xQV +brvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+W +jS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- + +Thawte Personal Freemail CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs +dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMb +VGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVl +bWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNV +BAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJ +ARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC +gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6W +ZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgk +CGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjPMPuoSpaKH2JCI4wXD/S6ZJwXrEcp +352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK +/qarigd1iwzdUYRr5PjRzneigQ== +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +ABAecom (sub., Am. Bankers Assn.) Root CA +========================================= +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAwgYkxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3RvbjEXMBUGA1UEChMOQUJBLkVD +T00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWlu +QGRpZ3NpZ3RydXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5F +Q09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1p +bkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVD +BwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1j +Vv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNf +WiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtx +A6k4ShZsiSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94 +Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQgwDQYJKoZI +hvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0kqS8Kfv2kRLD4VAe9G52dyntQJHsR +W0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJh +koHWG9YA8A6eKHegTYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm +/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ +O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 2 +======================================= +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1 +czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0 +YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBS +b290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4 +NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE +BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER +MA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEW +EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLGJrbn +pT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZ +PdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGA +vqPYUrBEzUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5y +P4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn7pTKBBMFYgZw +I7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAojeyP2n714Z5 +VEkxlTMr89EJFEliYIalsBHiUMIdBlc+LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2 +vAd5ZWRzfdd5ynvVWlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX +8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q +gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2kYtdo+o56T9II +2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 4 +======================================= +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1 +czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0 +YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBS +b290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2 +MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE +BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER +MA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEW +EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANx18IzA +dZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva +3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9 +kVySVGkl5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP +17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCvbK4iNC7Va26D +unm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtTYOXeFhKFoR +ZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT +4EOvkTvRyyzYdFQ6HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV +6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q +10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK +1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTla +MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg +MSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw +0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7 +NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf +7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnx +giJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0A +NACY89FxlA== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAy +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6 +Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/ +S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIobK/o5wXTX +XtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUY +YAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2 +lw0Xd8rY +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd +k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq +WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM +XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC +lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx +nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC +wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK +1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk +LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4 +xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH +qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF +WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB +ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E +bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ +rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ +Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB +FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h +a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc +D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y +azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug +b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 +tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 +C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS +0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs +Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 +JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx +JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j +GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Secure Personal CA +============================== +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8v +Q1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1 +c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJV +UzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRf +Q0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5 +OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdv +kHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGp +OZ5V+Pux5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTm +T173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkwggEVMIHkoIHh +oIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3 +dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBs +aWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 +cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNVHRAEJDAigA8x +OTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU +xPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1Ud +EwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K +8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6h +URzzwy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYG +JqibGapEPHayXOw= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +Visa International Global Root 2 +================================ +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMxDTALBgNVBAoT +BFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIw +EAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYD +VQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZp +Y2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW +73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1 +t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm7Igbthkn +GziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhl +V7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYE +FJ59SzS/ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0G +CSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdpNSYx/scuhMKZ +YdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQkIqUs38oW26sTTMs7WXcFsziza6k +PWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOe +yti12HvOdUVmB/RtLdh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 +ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- + +beTRUSTed Root CA +================= +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJXVzESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBDQXMxGjAYBgNVBAMTEWJlVFJV +U1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMC +V1cxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYD +VQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0 +c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgz +eubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCg +c0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNn +mrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5 +c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8w +ggFZBgNVHSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFS +ZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFu +Y2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBv +ZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJl +IGZvdW5kIGF0IGJlVFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t +L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 +L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQxCzAJBgNVBAYT +AldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3e +KjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR ++csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/b +ow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ +1gMe1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWu +GVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpGEK5BV2Vs +PyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Verisign Time Stamping Authority CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCBwTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZl +cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWdu +IFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UE +ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNV +BAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSww +KgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhj +zCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6o +v8uQjI11S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEA +MEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl +cmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20v +cGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRw +Oi8vb2NzcC52ZXJpc2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 +DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea +w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU58dzq6wf7iWb +wBbtt8pb8BQ= +-----END CERTIFICATE----- + +Thawte Time Stamping CA +======================= +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg +Q0EwHhcNOTcwMTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEd +MBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBp +bmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+o +J9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9 +nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCo +uqoEiYbC9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCe +d/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJSdM= +-----END CERTIFICATE----- + +Entrust.net Global Secure Server CA +=================================== +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGluY29ycC4gYnkgcmVmLiAobGlt +aXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE +AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0w +MDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0G +A1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh +Yi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRy +dXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55l +xyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439P +mrkDQYC2dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEB +BAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0 +cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMT +MUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr +47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbv +H9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3 +a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- + +Entrust.net Global Secure Personal CA +===================================== +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcx +NjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQl +hK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKkl +Wb1m9fkn5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNV +HR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAwPgYDVQQLFDd3 +d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUw +IwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5l +dCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAM +BgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQF +AAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xK +p9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQ +Gof4T4HHdguEOnKdzmVml64mXg== +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +AOL Time Warner Root Certification Authority 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT +FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD +VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAy +MDUyOTA2MDAwMFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg +VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu +QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8 +hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkG +IBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93 +f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQI +fHNlIAqhBC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNj +MGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+XxIwHwYDVR0j +BBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA +A4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u +0FIy2VkyvNp5ctZ7CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf +WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoWH1iCC+GWaQVL +juyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- + +AOL Time Warner Root Certification Authority 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT +FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD +VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAy +MDUyOTA2MDAwMFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg +VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu +QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8 +TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWsi4SVqBax +7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17n +OirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2w +TPDaRrbqJS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rS +AG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxmlJ85per5n0/xQ +pCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFhEVsVS6kkUfykXPcXnbDS+gfpj1bk +GoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuW +CpTehTacyH+BCQJJKg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex +MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7 ++z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI +5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcC +tQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ +68W/ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3 +p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5O8t1wswv +ziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD062KRffaJ00psUjf5BHklka9 +bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4o +GKQWDzH9OmwjkyB24f0HhdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2 +uBOLZ8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- + +beTRUSTed Root CA-Baltimore Implementation +========================================== +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx +GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Et +QmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVow +ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV +BAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ ++2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8Co +Cd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9fHBOB1Bir +lNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNe +DsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOC +Ah4wggIaMA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJ +KIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNlIG9mIHRoaXMg +Q2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVudCBhbmQgYWNjZXB0YW5jZSBvZiB0 +aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwg +dGhlIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 +eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDBB +BggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2lu +ZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR +3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6s +vfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyX +EHu67RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfq +jjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5dUX2xZ/2j +vTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py05yc493EG931t3GzUwWJBtDL +SoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- + +beTRUSTed Root CA - Entrust Implementation +========================================== +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx +GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Eg +LSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1ow +ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV +BAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0c +S12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE7 +0mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkbhepxKYhB +MvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1i +JAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOC +AwUwggMBMIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYB +BQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNyZWF0 +ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9u +IFByYWN0aWNlIFN0YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj +aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUFBwIBFjZodHRw +czovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZI +AYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEb +MBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAt +IEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0 +MTEwODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44 +iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNVHRMEBTAD +AQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEAKrgX +zh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevd +kObRVlTa4y0MnxEylCIBevZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/ +T220Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2kXgCl +zMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYhxKlkqu9FNtEaZnz4 +6TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- + +beTRUSTed Root CA - RSA Implementation +====================================== +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBiMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMmYmVUUlVT +VGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEy +MTEwNzI1WjBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRuj +brWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTu +lh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xs +N+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQh +hlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMB +AAGjggIYMIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAAD +CSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNf +c2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIBOhqCATZSZWxpYW5jZSBvbiBvciB1 +c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2Nl +cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv +bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNU +ZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9p +bmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAd +BgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTB +mMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05 +pmuKmET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqN +Wz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNMm2+fG8oe +qqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8ymmFei74pnykkiFY5LKjSq5YD +WtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +RSA Security 1024 v3 +==================== +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAy +MjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV +3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4m +mdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1Blq +FikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAf +BgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUM +X96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBD +leMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNu +mU4/iXgDmMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +UTN-USER First-Network Applications +=================================== +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp +BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 +WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T +YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB +cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug +mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj +DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu +Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi +P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE +j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w +HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j +cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK +RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp +xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq +DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +TC TrustCenter, Germany, Class 2 CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI +EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD +bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 +ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt +YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy +aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg +MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs +qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N +u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy +LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf +/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2 +9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac +ASZ4smZHcFFk +-----END CERTIFICATE----- + +TC TrustCenter, Germany, Class 3 CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI +EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD +bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 +ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt +YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy +aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg +MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN +2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7 +7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy +LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B +u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm +5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS +CdS7kjXvD9s0 +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +IPS Chained CAs root +==================== +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEy +MjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJ +QmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwu +MSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJ +UFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBD +QSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBz +QG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQgvJhPUOtopKdJ +C7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCBhYEFcYGdtJUZqV92NC5jNzVXjrQf +Qj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQID +AQABo4IEQzCCBD8wHQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC +AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBw +dWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNV +HQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF +BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGC +NwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZp +Y2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8v +d3d3Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5l +cy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5p +cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz +L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw +Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hAK+/b +lkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M9 +2GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- + +IPS CLASE1 root +=============== +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG +SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFow +ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU +Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT +RTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5BlmvXSHU0lq4 +oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBSYmL9Yzt9fuzuOOpi9GyocY3h6YvJ +P8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQW +BBTrsxl588GlHKzcuh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb +adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz +LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL +EyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg +Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB +BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R +BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB +hvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l +cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB +BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCGSAGG ++EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTEuaHRtbD8w +PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5o +dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw +MDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l +cy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1urxUq2 +ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmO +DszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9UkE6tsSU= +-----END CERTIFICATE----- + +IPS CLASE3 root +=============== +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG +SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFow +ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU +Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT +RTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49NzjaY2uQARIwo +2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY8jjsbJ0gA8DvqqPGZARRLXgNo9Ko +OtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQW +BBS4k/8uy9wsjqLnev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj +mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz +LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL +EyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg +Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB +BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R +BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB +hvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l +cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB +BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCGSAGG ++EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTMuaHRtbD8w +PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5o +dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw +MDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l +cy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc4gYt +fibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUE +NPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkOE7LFRVA= +-----END CERTIFICATE----- + +IPS CLASEA1 root +================ +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMy +WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u +YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM +QVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2mdd81u4D/u6zJf +X5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4WwdByOgF9H5fahGRpEiqLJpxq339fWU +oTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNV +HQ4EFgQUZyaW56G/2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 +3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj +ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G +A1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ +UyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG +AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3 +dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg +hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmww +QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF +QTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh +bENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw +Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINmyq0e +B81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5bi +KcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- + +IPS CLASEA3 root +================ +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUw +WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u +YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM +QVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uGBiJ2MwwSbUhW +YdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHUVqLyjRGZ/fZ98cfEXgIqmuJKtROK +AP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNV +HQ4EFgQUHp9XUEe2YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 +2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj +ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G +A1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ +UyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG +AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3 +dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg +hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmww +QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF +QTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh +bENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw +Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB/MjD +81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9S +KcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- + +IPS Servidores root +=================== +-----BEGIN CERTIFICATE----- +MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJD +RUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYG +A1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMx +CzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcG +A1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD +Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3PqHILVik +gDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Eh +im51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GB +ACzzw3lYJN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2 +/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58GNCr+Lh3B0Zx +8coLY1xq+XKU1QFPoNtC +-----END CERTIFICATE----- + +IPS Timestamping root +===================== +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVTMRIwEAYDVQQI +EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1 +Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg +Qi02MDkyOTQ1MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1 +MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQH +EwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu +bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsT +K0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQ +UyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEW +D2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLjuVqWajOY2ycJi +oGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4Efdo/BdApWgnMjvEp+ZCccWZ73b/ +K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0Gm +qaMCAwEAAaOCBIAwggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC +AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5J +LkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB +/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK +KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVz +MBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5n +IENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8vd3d3 +Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCGSAGG+EIBAwQ4FjZo +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJ +YIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu +Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lU +aW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMv +aXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH +MAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoe +FAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWT +s/zif/WN87GphV+I3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 1 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw +NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 +7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 +EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl +0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 +2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa +HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT +iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 +28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV +yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR +vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P +qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z +IRlXvVWa +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Email Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 +BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 +OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx +FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz +dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx +B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 +om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG +TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl +yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE +AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV +HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne +xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ +5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV +NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ +w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +UTN USERFirst Object Root CA +============================ +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb +BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz +NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx +HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy +dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR +loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ +w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu +lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 +RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL +BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 +ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly +c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO +PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE +qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG +hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Qualified (Class QA) Root +================================= +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn +eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 +bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 +LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 +dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP +aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV +CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e +8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb +m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ +0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM +0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 +YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p +a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz +YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg +YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg +ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov +L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr +Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 +aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg +YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 +IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 +DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN +wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg +W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc +R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR +5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Ltd. +============= +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsT +EUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoX +DTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcT +BUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVw +LjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0B +CQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOe +yEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+ +o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2 +IhULpNYILzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1Ud +DgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+MtUNjIExtpid +jShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWls +YXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw +JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIB +DQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0 +cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9y +Zy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhB +OlP1ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6w +NnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjnfg== +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Platinum CA - G2 +========================== +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw +HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM +U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu +669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF +eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne +WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo +j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 +8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T +aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy +domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D ++m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV +CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv +zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 +Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 +NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 +U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 +KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl +9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B +aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs +OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY +Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci +IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +DigiNotar Root CA +================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQG +EwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEgMB4G +CSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwHhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgx +OTIxWjBfMQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90 +YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B8cp86Yxq +7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXYtsMW2YiwsYcdcNqGtA8U +i3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIlHgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8 +ZkqQfioLBQftFl9VkHXYRskbg+IIvvEjzJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEq +bYRAhU52mXyC8/O3AlnUJgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4 +iHomGgVMktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXva5pk +XuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57pK6kwe6AYHw4YC+Vb +qdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMipuih2TkGl/VujQKQjBR7P4DNG5y6 +xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovTyD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHc +BmfFlHqabWJMfczgZICynkeOowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC +jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXyfJ9oHbtdzno5 +wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBoY6pFITlIYXg23PFDk9Qlx/KA +ZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHoM/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedT +FLJgQT2EkTFoPSdE2+Xe9PpjRchMPpj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKf +yvBovWsdst+Nbwed2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoA +ZbwH/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQlnQ7KN+ZQ +/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jEO1hZibCMjFCz2IbLaKPE +CudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU9jQZjHkJNsphFyUXC4KYcwx3dMPVDceo +EkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- diff --git a/pos/is4c-web/cc-modules/lib/paycardEntered-old.php b/pos/is4c-web/cc-modules/lib/paycardEntered-old.php new file mode 100644 index 000000000..83bd58e00 --- /dev/null +++ b/pos/is4c-web/cc-modules/lib/paycardEntered-old.php @@ -0,0 +1,218 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +if (!class_exists("Parser")) include_once($_SESSION["INCLUDE_PATH"]."/parser-class-lib/Parser.php"); +if (!function_exists("paycard_reset")) include_once($_SESSION["INCLUDE_PATH"]."/lib/paycardLib.php"); +if (!isset($IS4C_LOCAL)) include($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/conf.php"); + +class paycardEntered extends Parser { + var $swipestr; + var $swipetype; + var $manual; + function check($str){ + if (substr($str,-1,1) == "?"){ + $this->swipestr = $str; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = False; + return True; + } + elseif (is_numeric($str) && strlen($str) >= 16){ + $this->swipestr = $str; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = True; + return True; + } + elseif (is_numeric(substr($str,2)) && strlen($str) >= 18){ + $this->swipestr = $str; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = True; + return True; + } + elseif (strstr($str,"?") !== False && strstr($str,"%") !== False){ + // most likely track data plus garbage + // make sure it doesn't get passed on to + // the other parse modules + $this->swipestr = "BAD CARD"; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = False; + return True; + } + return False; + } + + function parse($str){ + $success = False; + $str = $this->swipestr; + if( substr($str,0,2) == "PV") { + $success = $this->paycard_entered(PAYCARD_MODE_BALANCE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "AV") { + $success = $this->paycard_entered(PAYCARD_MODE_ADDVALUE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "AC") { + $success = $this->paycard_entered(PAYCARD_MODE_ACTIVATE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "VD") { + $success = $this->paycard_entered(PAYCARD_MODE_VOID, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "FC") { + $success = $this->paycard_entered(PAYCARD_MODE_NONPOS_AUTH, substr($str,2), $this->manual, $this->swipetype); + } else { + $success = $this->paycard_entered(PAYCARD_MODE_AUTH, $str, $this->manual, $this->swipetype); + } + // if successful, paycard_entered() redirects to a confirmation page and exit()s; if we're still here, there was an error, so reset all data + if (!$success) + paycard_reset(); + return False; + } + + function paycard_entered($mode,$card,$manual,$type){ + global $IS4C_LOCAL; + // initialize + $validate = true; // run Luhn's on PAN, check expiration date + paycard_reset(); + $IS4C_LOCAL->set("paycard_mode",$mode); + $IS4C_LOCAL->set("paycard_manual",($manual ? 1 : 0)); + + // error checks based on transaction + if( $mode == PAYCARD_MODE_AUTH) { + if( $IS4C_LOCAL->get("ttlflag") != 1) { // must subtotal before running card + return paycard_msgBox($type,"No Total", + "Transaction must be totaled before tendering or refunding","[clear] to cancel"); + } else if( abs($IS4C_LOCAL->get("amtdue")) < 0.005) { // can't tender for more than due + return paycard_msgBox($type,"No Total", + "Nothing to tender or refund","[clear] to cancel"); + } + } + + // check for pre-validation override + if( strtoupper(substr($card,0,1)) == 'O') { + $validate = false; + $card = substr($card, 1); + } + + // parse card data + if( $IS4C_LOCAL->get("paycard_manual")) { + if( strtoupper(substr($card,0,4)) == "TEST" && !paycard_live($type)) { + // in testing mode, we have shorthand for various training card numbers + if( $type == PAYCARD_TYPE_CREDIT) { + switch( strtoupper(substr($card,4))) { + case "VISA": $card = "4455010000000001" . "12" . "09"; break; + case "MC": $card = "5233272716340016" . "05" . "08"; break; + case "AMEX": $card = "371449635398431" . "05" . "08"; break; + case "DISC": $card = "6011031100333334" . "06" . "08"; break; + case "DC": $card = "38555565010005" . "11" . "07"; break; + case "DCMC": $card = "36555501890009" . "11" . "07"; break; + } // switch test credit card name + } else if( $type == PAYCARD_TYPE_GIFT) { + switch( strtoupper(substr($card,4))) { + case "GIFT1": $card = "7018525757980004473"; break; // valutec test card, no expiration/conf code + case "GIFT2": $card = "7018525757980004481"; break; // valutec test card, no expiration/conf code + } // switch test gift card name + } // switch test card name + } // test card shortcuts + // now make sure it's numeric + if( !ctype_digit($card) || strlen($card) < 18) { // shortest known card # is 14 digits, plus MMYY + return paycard_msgBox($type,"Manual Entry Unknown", + "Please enter card data like:<br>CCCCCCCCCCCCCCCCMMYY","[clear] to cancel"); + } + // split up input (and check for the Concord test card) + if ($type == PAYCARD_TYPE_UNKNOWN){ + $type = paycard_type($card); + } + if( $type == PAYCARD_TYPE_GIFT) { + $IS4C_LOCAL->set("paycard_PAN",$card); // our gift cards have no expiration date or conf code + } else if( !paycard_live($type) && substr($card,0,7) == "9999999") { + // fill in EFSnet's test visa account, since the physical test cards only work in standalone + $IS4C_LOCAL->set("paycard_PAN","4455010000000001"); + $IS4C_LOCAL->set("paycard_exp","1209"); + } else { + $IS4C_LOCAL->set("paycard_PAN",substr($card,0,-4)); + $IS4C_LOCAL->set("paycard_exp",substr($card,-4,4)); + } + } else { + // swiped magstripe (reference to ISO format at end of this file) + $stripe = paycard_magstripe($card); + if( !is_array($stripe)) { + return paycard_errBox($type,$IS4C_LOCAL->get("paycard_manual")."Card Data Invalid","Please swipe again or type in manually","[clear] to cancel"); + } + // check for the Concord test card + if( !paycard_live(PAYCARD_TYPE_CREDIT) && substr($stripe["pan"],0,7) == "9999999") { + $stripe = paycard_magstripe("%B4455010000000001^TEST/VISA^0912101?;4455010000000001=0912101?"); + if( !is_array($stripe)) { + return paycard_errBox($type, + "Test Card Malfunction","Please contact IT","[clear] to cancel"); + } + } + $IS4C_LOCAL->set("paycard_PAN",$stripe["pan"]); + $IS4C_LOCAL->set("paycard_exp",$stripe["exp"]); + $IS4C_LOCAL->set("paycard_name",$stripe["name"]); + $IS4C_LOCAL->set("paycard_tr1",$stripe["tr1"]); + $IS4C_LOCAL->set("paycard_tr2",$stripe["tr2"]); + $IS4C_LOCAL->set("paycard_tr3",$stripe["tr3"]); + } // manual/swiped + + // determine card issuer and type + $IS4C_LOCAL->set("paycard_type",paycard_type($IS4C_LOCAL->get("paycard_PAN"))); + $IS4C_LOCAL->set("paycard_issuer",paycard_issuer($IS4C_LOCAL->get("paycard_PAN"))); + + // if we knew the type coming in, make sure it agrees + if( $type != PAYCARD_TYPE_UNKNOWN && $type != $IS4C_LOCAL->get("paycard_type")) { + paycard_reset(); + return paycard_msgBox($type,"Type Mismatch", + "Card number does not match card type","[clear] to cancel"); + } + + foreach($IS4C_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + if (!class_exists($rpc)) include_once($_SESSION["INCLUDE_PATH"]."/cc-modules/$rpc.php"); + $myObj = new $rpc(); + if ($myObj->handlesType($IS4C_LOCAL->get("paycard_type"))) + return $myObj->entered($validate); + } + + paycard_reset(); + return paycard_errBox(PAYCARD_TYPE_UNKNOWN,"Unknown Card Type ".$IS4C_LOCAL->get("paycard_type"),"","[clear] to cancel"); + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>Card swipe or card number</td> + <td>Try to charge amount to card</td> + </tr> + <tr> + <td>PV<i>swipe</i> or PV<i>number</i></td> + <td>Check balance of gift card</td> + </tr> + <tr> + <td>AC<i>swipe</i> or AC<i>number</i></td> + <td>Activate gift card</td> + </tr> + <tr> + <td>AV<i>swipe</i> or AV<i>number</i></td> + <td>Add value to gift card</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-web/cc-modules/lib/paycardEntered.php b/pos/is4c-web/cc-modules/lib/paycardEntered.php new file mode 100644 index 000000000..46a279b00 --- /dev/null +++ b/pos/is4c-web/cc-modules/lib/paycardEntered.php @@ -0,0 +1,184 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("Parser")) include_once($IS4C_PATH."parser-class-lib/Parser.php"); +if (!function_exists("paycard_reset")) include_once($IS4C_PATH."lib/paycardLib.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +class paycardEntered extends Parser { + var $swipestr; + var $swipetype; + var $manual; + + function check($str){ + if (substr($str,-1,1) == "?"){ + $this->swipestr = $str; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = False; + return True; + } + elseif (is_numeric($str) && strlen($str) >= 16){ + $this->swipestr = $str; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = True; + return True; + } + elseif (is_numeric(substr($str,2)) && strlen($str) >= 18){ + $this->swipestr = $str; + $this->swipetype = PAYCARD_TYPE_UNKNOWN; + $this->manual = True; + return True; + } + return False; + } + + function parse($str){ + $ret = array(); + $str = $this->swipestr; + if( substr($str,0,2) == "PV") { + $ret = $this->paycard_entered(PAYCARD_MODE_BALANCE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "AV") { + $ret = $this->paycard_entered(PAYCARD_MODE_ADDVALUE, substr($str,2), $this->manual, $this->swipetype); + } else if( substr($str,0,2) == "AC") { + $ret = $this->paycard_entered(PAYCARD_MODE_ACTIVATE, substr($str,2), $this->manual, $this->swipetype); + } else { + $ret = $this->paycard_entered(PAYCARD_MODE_AUTH, $str, $this->manual, $this->swipetype); + } + // if successful, paycard_entered() redirects to a confirmation page and exit()s; if we're still here, there was an error, so reset all data + if ($ret['main_frame'] == false) + paycard_reset(); + return $ret; + } + + function paycard_entered($mode,$card,$manual,$type){ + global $IS4C_LOCAL,$IS4C_PATH; + $ret = $this->default_json(); + // initialize + $validate = true; // run Luhn's on PAN, check expiration date + paycard_reset(); + $IS4C_LOCAL->set("paycard_mode",$mode); + $IS4C_LOCAL->set("paycard_manual",($manual ? 1 : 0)); + + // error checks based on transaction + if( $mode == PAYCARD_MODE_AUTH) { + if( $IS4C_LOCAL->get("ttlflag") != 1) { // must subtotal before running card + $ret['output'] = paycard_msgBox($type,"No Total", + "Transaction must be totaled before tendering or refunding","[clear] to cancel"); + return $ret; + } else if( abs($IS4C_LOCAL->get("amtdue")) < 0.005) { // can't tender for more than due + $ret['output'] = paycard_msgBox($type,"No Total", + "Nothing to tender or refund","[clear] to cancel"); + return $ret; + } + } + + // check for pre-validation override + if( strtoupper(substr($card,0,1)) == 'O') { + $validate = false; + $card = substr($card, 1); + } + + // parse card data + if( $IS4C_LOCAL->get("paycard_manual")) { + // make sure it's numeric + if( !ctype_digit($card) || strlen($card) < 18) { // shortest known card # is 14 digits, plus MMYY + $ret['output'] = paycard_msgBox($type,"Manual Entry Unknown", + "Please enter card data like:<br>CCCCCCCCCCCCCCCCMMYY","[clear] to cancel"); + return $ret; + } + // split up input (and check for the Concord test card) + if ($type == PAYCARD_TYPE_UNKNOWN){ + $type = paycard_type($card); + } + if( $type == PAYCARD_TYPE_GIFT) { + $IS4C_LOCAL->set("paycard_PAN",$card); // our gift cards have no expiration date or conf code + } else { + $IS4C_LOCAL->set("paycard_PAN",substr($card,0,-4)); + $IS4C_LOCAL->set("paycard_exp",substr($card,-4,4)); + } + } else { + // swiped magstripe (reference to ISO format at end of this file) + $stripe = paycard_magstripe($card); + if( !is_array($stripe)) { + $ret['output'] = paycard_errBox($type,$IS4C_LOCAL->get("paycard_manual")."Card Data Invalid","Please swipe again or type in manually","[clear] to cancel"); + return $ret; + } + $IS4C_LOCAL->set("paycard_PAN",$stripe["pan"]); + $IS4C_LOCAL->set("paycard_exp",$stripe["exp"]); + $IS4C_LOCAL->set("paycard_name",$stripe["name"]); + $IS4C_LOCAL->set("paycard_tr1",$stripe["tr1"]); + $IS4C_LOCAL->set("paycard_tr2",$stripe["tr2"]); + $IS4C_LOCAL->set("paycard_tr3",$stripe["tr3"]); + } // manual/swiped + + // determine card issuer and type + $IS4C_LOCAL->set("paycard_type",paycard_type($IS4C_LOCAL->get("paycard_PAN"))); + $IS4C_LOCAL->set("paycard_issuer",paycard_issuer($IS4C_LOCAL->get("paycard_PAN"))); + + // if we knew the type coming in, make sure it agrees + if( $type != PAYCARD_TYPE_UNKNOWN && $type != $IS4C_LOCAL->get("paycard_type")) { + $ret['output'] = paycard_msgBox($type,"Type Mismatch", + "Card number does not match card type","[clear] to cancel"); + return $ret; + } + + foreach($IS4C_LOCAL->get("RegisteredPaycardClasses") as $rpc){ + if (!class_exists($rpc)) include_once($IS4C_PATH."cc-modules/$rpc.php"); + $myObj = new $rpc(); + if ($myObj->handlesType($IS4C_LOCAL->get("paycard_type"))) + return $myObj->entered($validate,$ret); + } + + $ret['output'] = paycard_errBox(PAYCARD_TYPE_UNKNOWN,"Unknown Card Type ".$IS4C_LOCAL->get("paycard_type"),"","[clear] to cancel"); + return $ret; + } + + function doc(){ + return "<table cellspacing=0 cellpadding=3 border=1> + <tr> + <th>Input</th><th>Result</th> + </tr> + <tr> + <td>Card swipe or card number</td> + <td>Try to charge amount to card</td> + </tr> + <tr> + <td>PV<i>swipe</i> or PV<i>number</i></td> + <td>Check balance of gift card</td> + </tr> + <tr> + <td>AC<i>swipe</i> or AC<i>number</i></td> + <td>Activate gift card</td> + </tr> + <tr> + <td>AV<i>swipe</i> or AV<i>number</i></td> + <td>Add value to gift card</td> + </tr> + </table>"; + } +} + +?> diff --git a/pos/is4c-web/cron/expireProducts.php b/pos/is4c-web/cron/expireProducts.php new file mode 100644 index 000000000..56386b578 --- /dev/null +++ b/pos/is4c-web/cron/expireProducts.php @@ -0,0 +1,16 @@ +<html> +<head></head> +<body> +<?php +include('../ini.php'); +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); + +$query = "UPDATE products AS p INNER JOIN productExpires AS e + ON p.upc=e.upc + SET p.inUse=0 + WHERE datediff(now(),e.expires) >= 0"; +$db = pDataConnect(); +$r = $db->query($query); + +?> +</body></html> diff --git a/pos/is4c-web/cron/nightly.php b/pos/is4c-web/cron/nightly.php new file mode 100644 index 000000000..ea9685210 --- /dev/null +++ b/pos/is4c-web/cron/nightly.php @@ -0,0 +1,19 @@ +<html> +<head></head> +<body> +<?php +include('../ini.php'); +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); + +$db = tDataConnect(); +/* +$oldCartsQ = "DELETE FROM localtemptrans WHERE datediff(curdate(),datetime) > 1"; +$db->query($oldCartsQ); +*/ + +$clearQ = "DELETE FROM localtrans_today WHERE datediff(curdate(),datetime) <> 0"; +$db->query($clearQ); + +?> +</body> +</html> diff --git a/pos/is4c-web/cron/pending.php b/pos/is4c-web/cron/pending.php new file mode 100644 index 000000000..cf2cb4c8a --- /dev/null +++ b/pos/is4c-web/cron/pending.php @@ -0,0 +1,47 @@ +<html> +<head></head> +<body> +<?php +include('../ini.php'); +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); + +$db = tDataConnect(); + +$db->query("LOCK TABLES pendingtrans WRITE, dtransactions WRITE, + localtrans_today WRITE"); + +// get upcs & quantities from pending +$data = array(); +$result = $db->query("SELECT upc,sum(quantity) as qty FROM pendingtrans + WHERE trans_type='I'"); +while($row = $db->fetch_row($result)){ + $data[$row['upc']] = $row['qty']; +} + +// shuffle contents to final trans tables +$db->query("INSERT INTO dtransactions SELECT * FROM pendingtrans"); +$db->query("INSERT INTO localtrans_today SELECT * FROM pendingtrans"); + +// clear pending +$db->query("DELETE FROM pendingtrans"); + +$db->query("UNLOCK TABLES"); + +// update limits based on amounts sold +$db2 = pDataConnect(); +foreach($data as $upc=>$qty){ + $q = sprintf("UPDATE productOrderLimits + SET available=available-%d + WHERE upc='%s'",$qty,$upc); + $r = $db2->query($q); +} + +$endQ = "UPDATE products AS p INNER JOIN + productOrderLimits AS l ON p.upc=l.upc + SET p.inUse=0 + WHERE l.available <= 0"; +$db2->query($endQ); + +?> +</body> +</html> diff --git a/pos/is4c-web/documentation/end-user/basics.html b/pos/is4c-web/documentation/end-user/basics.html new file mode 100644 index 000000000..f7958cd5d --- /dev/null +++ b/pos/is4c-web/documentation/end-user/basics.html @@ -0,0 +1,90 @@ +<html> +<head> + <title>Basics</title> +</head> +<body> +Alright, let's sell some products! This document lists full +commands, but IS4C is normally used with a programmable keyboard +so cashiers don't have to memorize commands. Unless otherwise noted, +commands are <b>not</b> case sensitive. +<h3>The [clear] command</h3> +One very important command to know is clear: type CL then press enter. +This key sequence will dismiss most errors and warnings and cancel +most procedures taking you back to the "main" screen. +<h3>Logging in</h3> +The first screen is a login screen. A cashier must enter a numeric +password to begin. Type the password and press enter. +If you're just testing, 9999 is the built in +training password, and 52 and 7000 are the passwords provided +in the sample employee data. +<p /> +By default, if a logged in register is idle for awhile, it will +automatically lock. To unlock a register, type the same password you +used to log in and press enter. +<h3>Ringing Up Items</h3> +<ul> +<li><i>By UPC/PLU</i> type in the item's UPC or PLU and hit enter. +Leading zeroes may be omitted. Whether or not to include check +digits is a store-specific decision (I think most don't). If you +include check digits in your product table, they should be included +here and vice versa</li> +<li><i>Open Rings</i> type the amount, DP, the department's number, +zero, and hit enter. Amounts in IS4C typically do not include a +decimal point and are measured in <b>cents</b>. So to ring up one +dollar to department number one, you would type "100DP10" then +press enter.</li> +<li><i>Made a mistake?</i> there are two ways to void an item +that was already entered. First, scroll up or down using the arrow +keys until the item is highlighted. Then type VD and press enter. +Alternately, you can type VD then the item's UPC or PLU and +press enter.</li> +<li><i>Buying more than one?</i> if a customer is buying lots +of the same product, you can enter the quantity they're buying, +an asterisk, and the UPC or PLU then press enter. With items +that are sold by weight, you can also enter fractional quantities. +This is one situation where a decimal point is used. +It can be useful for testing without a scale present.</li> +</ul> +<h3>Entering the member number</h3> +IS4C is built for co-ops, and with that in mind every transaction +requires a member number. Non-member transactions require a number, too, +but you can use the same number for all non-member transactions. Which +number is up to you. The setting is located in +<a href="configuration.html">Additional Configuration</a>. +<ul> +<li><i>If the member number is known</i>, type the member number, then +ID, and press enter. This takes you to a list of names on the membership. +Scroll up or down with the arrow keys, then press enter to select one. +The name selection step is omitted for the generic non-member number, +but otherwise always included - even for memberships with just one name +on the account. Confirming the member's name helps catch occasional typos +when entering the member number.</li> +<li><i>If the member number is not known</i>, type ID and press enter. +The member search accepts both member numbers and last names. Partial +last names are permitted but are matched from the beginning - i.e., +searching for "john" will find a member whose last name is Johnson, +but searching for "ohnson" will not.</li> +</ul> +<h3>Accepting tender</h3> +The most common error with tenders will state "transaction must be totaled" +or some variation of that. Entering the member number (see above) totals +the transaction. However, if you continue ringing up items after entering +the member number, the transaction must be re-totaled. To re-total a transaction, +type TL then press enter. +<p /> +The default to enter tender is to type the amount (in cents) and the two +character tender code, then press enter. For example, to tender $2.50 in cash, +you would type 250CA and press enter. You can add as many as you like, but +common tenders in the default installation include: +<ul> +<li>CA - Cash</li> +<li>CK - Check</li> +<li>CC - Credit Card</li> +<li>DC - Debit Card</li> +<li>CP - Coupon</li> +<li>GD - Gift Card</li> +</ul> +If peripherals are present, at this point the receipt prints and +the till drawer opens. +</body> +</html> diff --git a/pos/is4c-web/documentation/end-user/commands.html b/pos/is4c-web/documentation/end-user/commands.html new file mode 100644 index 000000000..5d1689dc2 --- /dev/null +++ b/pos/is4c-web/documentation/end-user/commands.html @@ -0,0 +1,50 @@ +<html> +<head> + <title>Other commands</title> +</head> +<body> +<h3>Other Keyboard Commands</h3> +This document lists full commands, but IS4C is normally used with a programmable keyboard +so cashiers don't have to memorize commands. Unless otherwise noted, +commands are <b>not</b> case sensitive. + +<h3>Sign out the current cashier</h3> +Type SO then press enter. This returns to the log in screen and opens +the till drawer if present. You can not sign out in the middle of a transaction. + +<h3>Lock the register</h3> +Type LOCK then press enter. You must re-enter the cashier password to unlock +the register before proceeding with any other actions. + +<h3>Cancel the current transaction</h3> +Type CN then press enter. Canceling a +transaction requires an actual cashier's password. You cannot use the 9999 +training password here. + +<h3>Accept foodstamps</h3> +Before foodstamps can be tendered, you must generate a foodstamp total. Type +FNTL then press enter. This total is all items on the current transaction that +are marked as foodstampable. Sales tax is not collected on items purchased +using foodstamps. Proper procedure may well vary from state to state, so +check your local regulations. + +<h3>Disable sales tax for this transaction</h3> +Type TETL then press enter. You will be prompted for an optional tax exemption +ID. This is added to the transaction as a comment for the sake of +record keeping. + +<h3>Suspend/Resume</h3> +If you want to finish the current transaction later, the transaction can be suspended. +If a server database is available, the suspended transaction is sent there +and can be resumed from any register. If no server is available, the transaction +is suspended locally and must be resumed from the same register. +<p /> +To suspend the current transaction, type MG then press enter. Scroll down to +"Suspend Transaction" using the arrow keys, then press enter again. +<p /> +To resume the a transaction, type MG then press enter. Scroll down to +"Resume Transaction" using the arrow keys, then press enter again. Scroll +through the list of available suspended transactions, and press enter on +more time to select the one you'd like to resume. Note +that you may not resume a transaction if another transaction is currently +in progress. diff --git a/pos/is4c-web/documentation/end-user/configuration.html b/pos/is4c-web/documentation/end-user/configuration.html new file mode 100644 index 000000000..e34dbd896 --- /dev/null +++ b/pos/is4c-web/documentation/end-user/configuration.html @@ -0,0 +1,45 @@ +<html> +<head> + <title>IS4C Configuration Options</title> +</head> +<body> +The installation script for IS4C also servers as a configuration +page. It's broken into three sections (links at the top): +<i>Necessities</i>, which is the bare minimum to get a lane up and running, +<i>Additional Configuration</i>, which deals with per-store +customizations and peripheral configuration, and <i>Sample Data</i>, +which populates part of the database for quick testing. +<h3>Necessities</h3> +<ul> +<li><i>ini.php</i> status. This file is IS4C's configuration. It must be writable +or you can't save changes. On Unix-style systems, the best option is +to change ownership of the file to whichever user is running apache (the install +script will try to determine who that is for you). On Windows, the whole file system +is probably writable.</li> +<li><i>OS</i> choices are Windows (for Windows) and *nix (for anything else). If this +isn't set correctly, database connections will likely fail.</li> +<li><i>Lane Number</i> transactions logs include a lane number. Having a unique number +for each production lane is probably a good idea.</li> +<li><i>Lane Databases</i> connection requires a host, DBMS type, username, and password. +The two lane database are traditionally called opdata and translog, but do not +have to be. Once the correct connection information is entered, the install script will +automatically create any missing databases, tables, and views.</li> +<li><i>Server Database</i> connection has similar requirements to the lane database +connection. Again the install script will create missing databases, tables, and views. +If you skip this configuration, the lane will operate in standalone mode. For testing +purposes, that's probably fine. Note: it is highly recommended that the server +<b>database name</b> differ from the lane database names. The default is is4c_op.</li> +<li><i>Taxes</i> is for sales tax rates. Bear in mind that a given item can only have +one tax rate. If, for example, you have a state sales tax of 5% and a city sales tax +of 3%, you may need to enter tax rates of 3%, 5%, <b>and</b> 8%, depending on how +the rates overlap.</li> +<h3>Additional Configuration</h3> +These options are all labeled pretty clearly on the install page. +<h3>Sample Data</h3> +This page lets you load employees, customers (custdata), products, and departments. +Customers and products are the only items strictly necessary to get going. +There is a training login number, 9999, built into IS4C. Departments don't actually +have to exist at the register unless you're doing open rings. +</ul> +</body> +</html> diff --git a/pos/is4c-web/documentation/end-user/index.html b/pos/is4c-web/documentation/end-user/index.html new file mode 100644 index 000000000..9011dc1e1 --- /dev/null +++ b/pos/is4c-web/documentation/end-user/index.html @@ -0,0 +1,12 @@ +<html> +<head> + <title>End User Documentation</title> +</head> +<body> +<ul> +<li><a href="installation.html">Installing IS4C</a></li> +<li><a href="configuration.html">Configuration</a></li> +<li><a href="basics.html">Basic Front End Operations</a></li> +</ul> +</body> +</html> diff --git a/pos/is4c-web/documentation/end-user/installation.html b/pos/is4c-web/documentation/end-user/installation.html new file mode 120000 index 000000000..f3b9e5a53 --- /dev/null +++ b/pos/is4c-web/documentation/end-user/installation.html @@ -0,0 +1 @@ +../developer/installation.html \ No newline at end of file diff --git a/pos/is4c-web/documentation/keyboard.php b/pos/is4c-web/documentation/keyboard.php new file mode 100644 index 000000000..b129214e8 --- /dev/null +++ b/pos/is4c-web/documentation/keyboard.php @@ -0,0 +1,25 @@ +<?php + +print_docs($_SESSION["INCLUDE_PATH"]."/parser-class-lib/preparse/"); +print_docs($_SESSION["INCLUDE_PATH"]."/parser-class-lib/parse/"); + + +function print_docs($dir){ + $dh = opendir($dir); + while(False !== ($file=readdir($dh))){ + if (substr($file,-4) != ".php") continue; + + $cn = substr($file,0,strlen($file)-4); + + if (!class_exists($cn)) + include_once($dir."/".$cn.".php"); + + $instance = new $cn(); + print "<h3>$cn</h3>"; + print $instance->doc(); + print "<hr />"; + } + closedir($dh); +} + +?> diff --git a/pos/is4c-web/favicon.ico b/pos/is4c-web/favicon.ico new file mode 100644 index 000000000..4f2ba4fcb Binary files /dev/null and b/pos/is4c-web/favicon.ico differ diff --git a/pos/is4c-web/gui-class-lib/BasicPage.php b/pos/is4c-web/gui-class-lib/BasicPage.php new file mode 100644 index 000000000..2952a237d --- /dev/null +++ b/pos/is4c-web/gui-class-lib/BasicPage.php @@ -0,0 +1,125 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* BasicPage + * + * This is the base class for all display scripts + * When instantiated, it calls the following functions + * in this order: + * + * preprocess() + * if preprocess() returns True + * js_content() + * main_content() + * + * Any of these functions may be overriden by subclasses + * is4c.css and jquery.js are automatically included + * TODO: templating + */ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); + +class BasicPage { + + var $title; + + function BasicPage($arg="IS4C Online"){ + $this->title = $arg; + if ($this->preprocess()){ + ob_start(); + $this->print_page(); + while (ob_get_level() > 0) + ob_end_flush(); + } + } + + function js_content(){ + + } + + function main_content(){ + + } + + function preprocess(){ + return True; + } + + function print_page(){ + global $IS4C_PATH; + $this->streamTemplateFile('doctype.html'); + echo '<title>'.$this->title.'</title>'; + echo "<link rel=\"stylesheet\" type=\"text/css\" + href=\"{$IS4C_PATH}is4c.css\">"; + echo "<script type=\"text/javascript\" + src=\"{$IS4C_PATH}js/jquery.js\"></script>"; + echo "<script type=\"text/javascript\">"; + $this->js_content(); + echo "</script>"; + $this->streamTemplateFile('header.html'); + $this->top_menu(); + echo "<div id=\"boundingBox\">\n"; + $this->main_content(); + echo "\n</div>\n"; + $this->streamTemplateFile('footer.html'); + } + + function top_menu(){ + global $IS4C_PATH; + echo '<div id="topMenuRunner">'; + $user = checkLogin(); + if (!$user){ + printf('<ul> + <li><a href="%sgui-modules/storefront.php">Browse Store</a> + <li><a href="%sgui-modules/loginPage.php">Login</a></li> + </ul>', + $IS4C_PATH,$IS4C_PATH); + } + else { + printf('<ul> + <li><a href="%sgui-modules/storefront.php">Browse Store</a> + <li><a href="%sgui-modules/manageAccount.php">%s</a></li> + <li><a href="%sgui-modules/cart.php">Shopping Cart</a></li> + <li><a href="%sgui-modules/loginPage.php?logout=yes">Logout</a></li> + </ul>', + $IS4C_PATH,$IS4C_PATH,$user,$IS4C_PATH,$IS4C_PATH); + } + echo '</div>'; + } + + function streamTemplateFile($fn){ + global $IS4C_LOCAL, $IS4C_PATH; + $full_name = $IS4C_PATH.'src/template/'; + $full_name .= $IS4C_LOCAL->get("Template").'/'; + $full_name .= $fn; + $str = file_get_contents($full_name); + echo str_replace('"/','"'.$IS4C_PATH,$str); + } +} + +?> diff --git a/pos/is4c-web/gui-class-lib/NoMenuPage.php b/pos/is4c-web/gui-class-lib/NoMenuPage.php new file mode 100644 index 000000000..5862014db --- /dev/null +++ b/pos/is4c-web/gui-class-lib/NoMenuPage.php @@ -0,0 +1,43 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* NoMenuPage + * + * Page with an empty top menu + */ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); + +class NoMenuPage extends BasicPage { + + function top_menu(){ + + } +} + +?> diff --git a/pos/is4c-web/gui-class-lib/UserPage.php b/pos/is4c-web/gui-class-lib/UserPage.php new file mode 100644 index 000000000..3ac6870eb --- /dev/null +++ b/pos/is4c-web/gui-class-lib/UserPage.php @@ -0,0 +1,54 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* UserPage + * + * Adds a login check to BasicPage. Many gui-modules + * Require a logged in user. + */ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); + +class UserPage extends BasicPage { + + function UserPage(){ + global $IS4C_PATH; + if (!checkLogin()){ + header("Location: {$IS4C_PATH}gui-modules/loginPage.php"); + } + else if ($this->preprocess()){ + ob_start(); + $this->print_page(); + while (ob_get_level() > 0) + ob_end_flush(); + } + } +} + +?> diff --git a/pos/is4c-web/gui-modules/cart.php b/pos/is4c-web/gui-modules/cart.php new file mode 100644 index 000000000..5ec141efc --- /dev/null +++ b/pos/is4c-web/gui-modules/cart.php @@ -0,0 +1,170 @@ +<?php +/******************************************************************************* + + Copyright 2007,2011 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('pDataConnect')) include($IS4C_PATH.'lib/connect.php'); +if (!function_exists('getUID')) include($IS4C_PATH.'auth/login.php'); +if (!function_exists('addUPC')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('SetExpressCheckout')) include($IS4C_PATH.'lib/paypal.php'); + +class cart extends BasicPage { + + + var $notices; + + function js_content(){ + ?> + $(document).ready(function(){ + $('#searchbox').focus(); + }); + <?php + } + + function main_content(){ + global $IS4C_PATH,$IS4C_LOCAL; + $db = tDataConnect(); + $empno = getUID(checkLogin()); + + $q = "SELECT * FROM cart WHERE emp_no=$empno"; + $r = $db->query($q); + + if (!PAYPAL_LIVE){ + echo '<h2>This store is in test mode; orders will not be processed</h2>'; + } + + + echo '<blockquote><em>'.$this->notices.'</em></blockquote>'; + echo '<form action="cart.php" method="post">'; + echo "<table id=\"carttable\" cellspacing='0' cellpadding='4' border='1'>"; + echo "<tr><th>&nbsp;</th><th>Item</th><th>Qty</th><th>Price</th> + <th>Total</th><th>&nbsp;</th></tr>"; + $ttl = 0.0; + while($w = $db->fetch_row($r)){ + printf('<tr> + <td><input type="checkbox" name="selections[]" value="%s" /></td> + <td>%s %s</td> + <td><input type="hidden" name="upcs[]" value="%s" /><input type="text" + size="4" name="qtys[]" value="%.2f" /><input type="hidden" name="scales[]" + value="%d" /><input type="hidden" name="orig[]" value="%.2f" /></td> + <td>$%.2f</td><td>$%.2f</td><td>%s</td></tr>', + $w['upc'], + $w['brand'],$w['description'], + $w['upc'],$w['quantity'],$w['scale'],$w['quantity'], + $w['unitPrice'],$w['total'], + (empty($w['saleMsg'])?'&nbsp;':$w['saleMsg']) + ); + $ttl += $w['total']; + } + printf('<tr><th colspan="4" align="right">Subtotal</th> + <td>$%.2f</td><td>&nbsp;</td></tr>',$ttl); + $taxQ = "SELECT taxes FROM taxTTL WHERE emp_no=$empno"; + $taxR = $db->query($taxQ); + $taxes = 0; + if ($db->num_rows($taxR) > 0) + $taxes = round(array_pop($db->fetch_row($taxR)),2); + printf('<tr><th colspan="4" align="right">Taxes</th> + <td>$%.2f</td><td>&nbsp;</td></tr>',$taxes); + printf('<tr><th colspan="4" align="right">Total</th> + <td>$%.2f</td><td>&nbsp;</td></tr>',$taxes+$ttl); + echo '<tr><td colspan="6" valign="top">'; + echo '<input type="submit" name="delbtn" style="" value="Delete Selected Items" />'; + echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; + echo '<input type="submit" name="qtybtn" value="Update Quantities" />'; + echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; + //echo '<input type="submit" name="cobtn" value="Proceed to Checkout" />'; + echo '<input type="image" name="cobtn" height="30px;" style="vertical-align:bottom;" src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif" />'; + echo "</td></tr>"; + echo "</table><br />"; + } + + function preprocess(){ + global $IS4C_LOCAL; + $db = tDataConnect(); + $empno = getUID(checkLogin()); + + if (isset($_REQUEST['qtybtn'])){ + for($i=0; $i<count($_REQUEST['qtys']);$i++){ + if (!is_numeric($_REQUEST['qtys'][$i])) continue; + if ($_REQUEST['qtys'][$i] == $_REQUEST['orig'][$i]) continue; + + $upc = $db->escape($_REQUEST['upcs'][$i]); + $qty = round($_REQUEST['qtys'][$i]); + if ($_REQUEST['scales'][$i] == 1) + $qty = number_format(round($_REQUEST['qtys'][$i]*4)/4,2); + if ($qty == $_REQUEST['orig'][$i]) continue; + + $availQ = sprintf("SELECT available FROM productOrderLimits WHERE upc='%s'", + $upc); + $availR = $db->query($availQ); + $limit = 999; + if ($db->num_rows($availR) > 0) + $limit = array_pop($db->fetch_row($availR)); + if ($qty > $limit && $qty > 0){ + $qty = $limit; + if ($qty <= 0) $qty=1; + $this->notices = "Due to limited availability, requested quantity + cannot be provided"; + } + + $q1 = sprintf("DELETE FROM localtemptrans WHERE + upc='%s' AND emp_no=%d",$upc,$empno); + $db->query($q1); + if ($qty > 0) + addUPC($upc,$qty); + } + } + if (isset($_REQUEST['delbtn'])){ + if (isset($_REQUEST['selections'])){ + foreach($_REQUEST['selections'] as $upc){ + $upc = $db->escape($upc); + $q1 = sprintf("DELETE FROM localtemptrans WHERE + upc='%s' AND emp_no=%d",$upc,$empno); + $db->query($q1); + } + } + } + if (isset($_REQUEST['cobtn_x'])){ + $dbc = tDataConnect(); + $email = checkLogin(); + $empno = getUID($email); + $sub = $dbc->query("SELECT sum(total) FROM cart WHERE emp_no=".$empno); + $sub = array_pop($dbc->fetch_row($sub)); + $tax = $dbc->query("SELECT taxes FROM taxTTL WHERE emp_no=$empno"); + $tax = array_pop($dbc->fetch_row($tax)); + + return SetExpressCheckout(round($sub+$tax,2), + round($tax,2),$email); + } + + return True; + } +} + +new cart(); + +?> diff --git a/pos/is4c-web/gui-modules/changePassword.php b/pos/is4c-web/gui-modules/changePassword.php new file mode 100644 index 000000000..f43da8a90 --- /dev/null +++ b/pos/is4c-web/gui-modules/changePassword.php @@ -0,0 +1,129 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('UserPage')) include($IS4C_PATH.'gui-class-lib/UserPage.php'); +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); + +class changePassword extends UserPage { + + function js_content(){ + ?> + $(document).ready(function(){ + $('#oldpasswd').focus(); + }); + <?php + } + + var $logged_in_user; + var $changed; + + function main_content(){ + global $IS4C_PATH; + if (!$this->changed){ + ?> + <div id="loginTitle">Change Account Password<br /> + <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> + <table cellspacing="4" cellpadding="4"> + <tr> + <th>E-mail address</th> + <td><?php echo $this->logged_in_user; ?></td> + </tr><tr> + <th>Old Password</th> + <td><input type="password" name="old" id="oldpasswd" /></td> + </tr><tr> + <th>New Password</th> + <td><input type="password" name="passwd" /></td> + </tr><tr> + <th>Re-Type New Password</th> + <td><input type="password" name="passwd2" /></td> + </tr><tr> + <th><input type="submit" value="Change Password" name="submit" /></th> + <td>&nbsp;</td> + </tr> + </table> + </form> + </div> + <?php + } + else { + echo '<div class="successMsg">'; + echo 'Your password has been changed'; + echo '</div>'; + } + } + + function preprocess(){ + global $IS4C_PATH; + $this->logged_in_user = checkLogin(); + $this->changed = False; + + $dbc = pDataConnect(); + + $q = sprintf("SELECT name FROM Users WHERE name='%s'", + $dbc->escape($this->logged_in_user)); + $r = $dbc->query($q); + if ($dbc->num_rows($r) == 0){ + // sanity check; shouldn't ever happen + header("Location: {$IS4C_PATH}gui-modules/loginPage.php"); + return False; + } + + if (isset($_REQUEST['submit'])){ + // validate + + if ($_REQUEST['passwd'] !== $_REQUEST['passwd2']){ + echo '<div class="errorMsg">'; + echo 'New passwords do not match'; + echo '</div>'; + return True; + } + else if (empty($_REQUEST['passwd'])){ + echo '<div class="errorMsg">'; + echo 'New passwords cannot be blank'; + echo '</div>'; + return True; + } + else { + $this->changed = changePassword($this->logged_in_user, + $_REQUEST['old'],$_REQUEST['passwd']); + if (!$this->changed) { + echo '<div class="errorMsg">'; + echo 'Old password is incorrect'; + echo '</div>'; + return True; + } + } + } + + return True; + } +} + +new changePassword(); + +?> diff --git a/pos/is4c-web/gui-modules/confirm.php b/pos/is4c-web/gui-modules/confirm.php new file mode 100644 index 000000000..3944da719 --- /dev/null +++ b/pos/is4c-web/gui-modules/confirm.php @@ -0,0 +1,201 @@ +<?php +/******************************************************************************* + + Copyright 2007,2011 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('pDataConnect')) include($IS4C_PATH.'lib/connect.php'); +if (!function_exists('getUID')) include($IS4C_PATH.'auth/login.php'); +if (!function_exists('addUPC')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('customer_confirmation')) include($IS4C_PATH.'lib/notices.php'); +if (!function_exists('GetExpressCheckoutDetails')) include($IS4C_PATH.'lib/paypal.php'); + +class confirm extends BasicPage { + + var $mode; + var $msgs; + + function js_content(){ + ?> + $(document).ready(function(){ + $('#searchbox').focus(); + }); + <?php + } + + function main_content(){ + if ($this->mode == 0) + $this->confirm_content(False); + else + $this->confirm_content(True); + } + + function confirm_content($receiptMode=False){ + global $IS4C_PATH,$IS4C_LOCAL; + $db = tDataConnect(); + $empno = getUID(checkLogin()); + + $q = "SELECT * FROM cart WHERE emp_no=$empno"; + $r = $db->query($q); + + if (!$receiptMode){ + echo '<form action="confirm.php" method="post">'; + } + else { + echo '<blockquote>Your order has been processed</blockquote>'; + } + if (!empty($this->msgs)){ + echo '<blockquote>'.$this->msgs.'</blockquote>'; + } + echo "<table id=\"carttable\" cellspacing='0' cellpadding='4' border='1'>"; + echo "<tr><th>Item</th><th>Qty</th><th>Price</th> + <th>Total</th><th>&nbsp;</th></tr>"; + $ttl = 0.0; + while($w = $db->fetch_row($r)){ + printf('<tr> + <td>%s %s</td> + <td><input type="hidden" name="upcs[]" value="%s" />%.2f + <input type="hidden" name="scales[]" + value="%d" /><input type="hidden" name="orig[]" value="%.2f" /></td> + <td>$%.2f</td><td>$%.2f</td><td>%s</td></tr>', + $w['brand'],$w['description'], + $w['upc'],$w['quantity'],$w['scale'],$w['quantity'], + $w['unitPrice'],$w['total'], + (empty($w['saleMsg'])?'&nbsp;':$w['saleMsg']) + ); + $ttl += $w['total']; + } + printf('<tr><th colspan="3" align="right">Subtotal</th> + <td>$%.2f</td><td>&nbsp;</td></tr>',$ttl); + $taxQ = "SELECT taxes FROM taxTTL WHERE emp_no=$empno"; + $taxR = $db->query($taxQ); + $taxes = round(array_pop($db->fetch_row($taxR)),2); + printf('<tr><th colspan="3" align="right">Taxes</th> + <td>$%.2f</td><td>&nbsp;</td></tr>',$taxes); + printf('<tr><th colspan="3" align="right">Total</th> + <td>$%.2f</td><td>&nbsp;</td></tr>',$taxes+$ttl); + echo "</table><br />"; + if (!$receiptMode){ + printf('<input type="hidden" name="token" value="%s" />',$_REQUEST['token']); + echo '<b>Phone Number (incl. area code)</b>: '; + echo '<input type="text" name="ph_contact" /> (<span style="color:red;">Required</span>)<br />'; + echo '<blockquote>We require a phone number because some email providers + have trouble handling .coop email addresses. A phone number ensures + we can reach you if there are any questions about your order.</blockquote>'; + echo '<b>Additional attendees</b>: '; + echo '<input type="text" name="attendees" /><br />'; + echo '<blockquote>If you are purchasing a ticket for someone else, please + enter their name(s) so we know to put them on the list.</blockquote>'; + echo '<input type="submit" name="confbtn" value="Finalize Order" />'; + echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; + echo '<input type="submit" name="backbtn" value="Go Back" />'; + } + else { + /* refactor idea: clear in preprocess() + and print receipt from a different script + */ + $endQ = "INSERT INTO localtrans SELECT l.* FROM + localtemptrans AS l WHERE emp_no=$empno"; + $endR = $db->query($endQ); + $endQ = "INSERT INTO pendingtrans SELECT l.* FROM + localtemptrans AS l WHERE emp_no=$empno"; + $endR = $db->query($endQ); + if ($endR !== False){ + $clearQ = "DELETE FROM localtemptrans WHERE emp_no=$empno"; + $db->query($clearQ); + } + } + } + + function preprocess(){ + global $IS4C_LOCAL; + $this->mode = 0; + $this->msgs = ""; + + if (isset($_REQUEST['backbtn'])){ + header("Location: cart.php"); + return False; + } + else if (isset($_REQUEST['confbtn'])){ + /* confirm payment with paypal + if it succeeds, add tax and tender + shuffle order to pendingtrans table + send order notifications + */ + $ph = $_REQUEST['ph_contact']; + $ph = preg_replace("/[^\d]/","",$ph); + if (strlen($ph) != 10){ + $this->msgs = 'Phone number with area code is required'; + return True; + } + $attend = isset($_REQUEST['attendees']) ? $_REQUEST['attendees'] : ''; + if (isset($_REQUEST['token'])){ + $pp1 = GetExpressCheckoutDetails($_REQUEST['token']); + + $pp2 = DoExpressCheckoutPayment($pp1['TOKEN'], + $pp1['PAYERID'], + $pp1['PAYMENTREQUEST_0_AMT']); + + if ($pp2['ACK'] == 'Success') { + $this->mode=1; + + /* get tax from db and add */ + $db = tDataConnect(); + $email = checkLogin(); + $empno = getUID($email); + $taxQ = "SELECT taxes FROM taxTTL WHERE emp_no=$empno"; + $taxR = $db->query($taxQ); + $taxes = round(array_pop($db->fetch_row($taxR)),2); + addtax($taxes); + + /* add paypal tender */ + addtender("Paypal","PP",-1*$pp1['PAYMENTREQUEST_0_AMT']); + + /* send notices */ + $cart = customer_confirmation($empno,$email,$pp1['PAYMENTREQUEST_0_AMT']); + admin_notification($empno,$email,$ph,$pp1['PAYMENTREQUEST_0_AMT'],$cart); + + $addrQ = sprintf("SELECT e.email_address FROM localtemptrans + as l INNER JOIN superdepts AS s ON l.department=s.dept_ID + INNER JOIN superDeptEmails AS e ON s.superID=e.superID + WHERE l.emp_no=%d GROUP BY e.email_address",$empno); + $addrR = $db->query($addrQ); + $addr = array(); + while($addrW = $db->fetch_row($addrR)) + $addr[] = $addrW[0]; + if (count($addr) > 0) + mgr_notification($addr,$email,$ph,$pp1['PAYMENTREQUEST_0_AMT'],$attend,$cart); + } + } + } + + return True; + } +} + +new confirm(); + +?> diff --git a/pos/is4c-web/gui-modules/createAccount.php b/pos/is4c-web/gui-modules/createAccount.php new file mode 100644 index 000000000..fd6f7477f --- /dev/null +++ b/pos/is4c-web/gui-modules/createAccount.php @@ -0,0 +1,148 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); + +class createAccount extends BasicPage { + + function js_content(){ + ?> + $(document).ready(function(){ + $('#fullname').focus(); + }); + <?php + } + + var $entries; + + function main_content(){ + global $IS4C_PATH; + ?> + <div id="loginTitle">Create an Account<br /> + <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> + <table cellspacing="4" cellpadding="4"> + <tr> + <th>Full Name</th> + <td><input id="fullname" type="text" name="fn" value="<?php echo $this->entries['name']; ?>" /></td> + </tr><tr> + <th>E-mail address</th> + <td><input type="text" name="email" value="<?php echo $this->entries['email']; ?>" /></td> + </tr><tr> + <th>Password</th> + <td><input type="password" name="passwd" value="<?php echo $this->entries['passwd']; ?>" /></td> + </tr><tr> + <th>Re-Type Password</th> + <td><input type="password" name="passwd2" value="<?php echo $this->entries['passwd']; ?>" /></td> + </tr><tr> + <th>Member-Owner</th> + <td><select name="owner"> + <option value="0" <?php echo $this->entries['owner']==0?'selected':''?>>No</option> + <option value="1" <?php echo $this->entries['owner']==1?'selected':''?>>Yes</option> + </select></td> + </tr><tr> + <th><input type="submit" value="Create Account" name="submit" /></th> + <td>&nbsp;</td> + </tr> + </table> + </form> + </div> + <?php + } + + function preprocess(){ + global $IS4C_PATH; + $this->entries = array( + 'name'=>(isset($_REQUEST['fn'])?$_REQUEST['fn']:''), + 'email'=>(isset($_REQUEST['email'])?$_REQUEST['email']:''), + 'passwd'=>(isset($_REQUEST['passwd'])?$_REQUEST['passwd']:''), + 'owner'=>(isset($_REQUEST['owner'])?$_REQUEST['owner']:0) + ); + + if (isset($_REQUEST['submit'])){ + // validate + $errors = False; + + if (!isEmail($this->entries['email'],FILTER_VALIDATE_EMAIL)){ + echo '<div class="errorMsg">'; + echo 'Not a valid e-mail address: '.$this->entries['email']; + echo '</div>'; + $this->entries['email'] = ''; + $errors = True; + } + + if ($_REQUEST['passwd'] !== $_REQUEST['passwd2']){ + echo '<div class="errorMsg">'; + echo 'Passwords do not match'; + echo '</div>'; + $this->entries['passwd'] = ''; + $errors = True; + } + + if (empty($_REQUEST['passwd'])){ + echo '<div class="errorMsg">'; + echo 'Password is required'; + echo '</div>'; + $this->entries['passwd'] = ''; + $errors = True; + } + + if (empty($this->entries['name'])){ + echo '<div class="errorMsg">'; + echo 'Name is required'; + echo '</div>'; + $this->entries['name'] = ''; + $errors = True; + } + + if (!$errors){ + $created = createLogin($this->entries['email'], + $this->entries['passwd'], + $this->entries['name'], + $this->entries['owner']); + + if ($created){ + login($this->entries['email'],$this->entries['passwd']); + header("Location: {$IS4C_PATH}gui-modules/storefront.php"); + return False; + } + else { + echo '<div class="errorMsg">'; + echo 'Account already exists: '.$this->entries['email']; + echo '</div>'; + $this->entries['email'] = ''; + } + } + } + return True; + } +} + +new createAccount(); + +?> diff --git a/pos/is4c-web/gui-modules/forgotPassword.php b/pos/is4c-web/gui-modules/forgotPassword.php new file mode 100644 index 000000000..2cff872da --- /dev/null +++ b/pos/is4c-web/gui-modules/forgotPassword.php @@ -0,0 +1,121 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); +include($IS4C_PATH.'ini.php'); + + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); + +class forgotPassword extends BasicPage { + + var $reset; + var $errors; + + function js_content(){ + ?> + $(document).ready(function(){ + $('#loginEmail').focus(); + }); + <?php + } + + function main_content(){ + global $IS4C_PATH; + if (!$this->reset){ + echo $this->errors; + ?> + <div id="loginTitle">Password Reset<br /> + <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> + <table cellspacing="4" cellpadding="4"> + <tr> + <th>E-mail address</th> + <td><input id="loginEmail" type="text" name="email" /></td> + </tr><tr> + <th><input type="submit" value="Login" /></th> + <td>&nbsp;</td> + </tr> + </table> + </form> + </div> + <?php + } + else { + echo '<div class="successMsg">'; + echo 'Your password has been reset. A copy of your new + password has been e-mailed to '.$_REQUEST['email']; + echo '</div>'; + } + } + + function preprocess(){ + global $IS4C_PATH; + $this->reset = False; + $this->errors = ''; + + if (isset($_REQUEST['email'])){ + if (!isEmail($_REQUEST['email'])){ + $this->errors .= '<div class="errorMsg">'; + $this->errors .= 'Not a valid e-mail address: '.$_REQUEST['email']; + $this->errors .= '</div>'; + return True; + } + else if (!getUID($_REQUEST['email'])){ + $this->errors .= '<div class="errorMsg">'; + $this->errors .= 'No account found with e-mail address: '.$_REQUEST['email']; + $this->errors .= '</div>'; + return True; + } + else { + // generate a new random password, omitting + // the ` character as a possibility + srand((double) microtime() * 1000000); + $pw = ""; + while(strlen($pw) < 12){ + $i = rand(40,125); + if ($i != 96) $pw .= chr($i); + } + + changeAnyPassword($_REQUEST['email'],$pw); + $this->reset = True; + $msg = "Your password has been reset\n"; + $msg .= "Your new password is: {$pw}\n"; + $headers = "From: useradmin@wholefoods.coop\r\n"; + + mail($_REQUEST['email'], + 'Password Reset Request', + $msg, + $headers); + } + } + return True; + } +} + +new forgotPassword(); + +?> diff --git a/pos/is4c-web/gui-modules/item.php b/pos/is4c-web/gui-modules/item.php new file mode 100644 index 000000000..29f68a3b4 --- /dev/null +++ b/pos/is4c-web/gui-modules/item.php @@ -0,0 +1,141 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('pDataConnect')) include($IS4C_PATH.'lib/connect.php'); +if (!function_exists('getUID')) include($IS4C_PATH.'auth/login.php'); + +class itemPage extends BasicPage { + + function js_content(){ + ?> + function addItem(upc){ + $.ajax({ + url: '../ajax-callbacks/ajax-add-item.php', + type: 'post', + data: 'upc='+upc, + success: function(resp){ + $('#btn'+upc).html('<a href="cart.php">In Cart</a>'); + } + }); + } + <?php + } + + function main_content(){ + global $IS4C_PATH; + $upc = $_REQUEST['upc']; + $upc = str_pad($upc,13,'0',STR_PAD_LEFT); + + $empno = getUID(checkLogin()); + if ($empno===False) $empno=-999; + + $dbc = pDataConnect(); + $q = sprintf("SELECT p.upc,p.normal_price,p.special_price, + p.discounttype,u.description,u.brand,u.long_text, + p.inUse, + CASE WHEN o.available IS NULL then 99 ELSE o.available END as available + FROM products AS p INNER JOIN productUser AS u + ON p.upc=u.upc LEFT JOIN productOrderLimits AS o + ON p.upc=o.upc WHERE p.upc='%s'", + $dbc->escape($upc)); + $r = $dbc->query($q); + + if ($dbc->num_rows($r)==0){ + echo "Item not found"; + return; + } + + $w = $dbc->fetch_row($r); + + echo '<div class="itemBox">'; + + echo '<div class="itemMain">'; + echo '<span class="itemDesc">'.$w['description'].'</span><br />'; + echo '<span class="itemBrand">by '.$w['brand'].'</span>'; + echo '<p />'; + echo $w['long_text']; + echo '</div>'; + + echo '<div class="itemPrice">'; + echo '<span class="itemPriceNormal">'; + printf('$%.2f',($w['discounttype']==1?$w['special_price']:$w['normal_price'])); + echo '</span><br />'; + echo '<span class="itemPriceAddOn">'; + if ($w['discounttype']==1) echo 'On Sale!'; + else if ($w['discounttype']==2) + printf('Owner price: $%.2f',$w['special_price']); + echo '</span>'; + echo '<br /><br />'; + if ($w['inUse'] == 0 || $w['available'] <= 0){ + echo 'This product is expired, out of stock, or otherwise + no longer available to order'; + } + else if ($empno == -999){ + echo '<a href="loginPage.php">Login</a> or '; + echo '<a href="createAccount.php">Create an Account</a> '; + echo 'to add items to your cart.'; + } + else { + $chkQ = sprintf("SELECT upc FROM localtemptrans WHERE + upc='%s' AND emp_no=%d",$dbc->escape($w['upc']),$empno); + $chkR = $dbc->query($chkQ); + if ($dbc->num_rows($chkR) == 0){ + printf('<span id="btn%s"> + <input type="submit" value="Add to cart" onclick="addItem(\'%s\');" /> + </span>', + $w['upc'],$w['upc']); + } + else { + printf('<span id="btn%s"> + <a href="cart.php">In Cart</a> + </span>',$w['upc']); + } + } + echo '</div>'; + + echo '</div>'; // end itemBox + + echo '<div class="itemCart">'; + + echo '</div>'; + } + + function preprocess(){ + global $IS4C_PATH; + if (!isset($_REQUEST['upc'])){ + header("Location: {$IS4C_PATH}gui-modules/storefront.php"); + return False; + } + return True; + } +} + +new itemPage(); + +?> diff --git a/pos/is4c-web/gui-modules/loginPage.php b/pos/is4c-web/gui-modules/loginPage.php new file mode 100644 index 000000000..bf2ab794c --- /dev/null +++ b/pos/is4c-web/gui-modules/loginPage.php @@ -0,0 +1,99 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); +include($IS4C_PATH.'ini.php'); + + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); + +class loginPage extends BasicPage { + + function js_content(){ + ?> + $(document).ready(function(){ + $('#loginEmail').focus(); + }); + <?php + } + + function main_content(){ + global $IS4C_PATH; + ?> + <div id="loginTitle"><!--IS4C Online Version 1.0--><br /> + <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> + <table cellspacing="4" cellpadding="4"> + <tr> + <th>E-mail address</th> + <td><input id="loginEmail" type="text" name="email" /></td> + </tr><tr> + <th>Password</th> + <td><input type="password" name="passwd" /></td> + </tr><tr> + <th><input type="submit" value="Login" /></th> + <td><a href="<?php echo $IS4C_PATH;?>gui-modules/forgotPassword.php">Forget your password</a>?</td> + </tr> + </table> + <br /> + <a href="<?php echo $IS4C_PATH;?>gui-modules/createAccount.php">Create an account</a> + </form> + </div> + <?php + } + + function preprocess(){ + global $IS4C_PATH; + if (isset($_REQUEST['logout'])){ + logout(); + return True; + } + + if (isset($_REQUEST['email'])){ + if (!isEmail($_REQUEST['email'])){ + echo '<div class="errorMsg">'; + echo 'Not a valid e-mail address: '.$_REQUEST['email']; + echo '</div>'; + return True; + } + else if (!login($_REQUEST['email'],$_REQUEST['passwd'])){ + echo '<div class="errorMsg">'; + echo 'Incorrect e-mail address or password'; + echo '</div>'; + return True; + } + else { + header("Location: {$IS4C_PATH}gui-modules/storefront.php"); + return False; + } + } + return True; + } +} + +new loginPage(); + +?> diff --git a/pos/is4c-web/gui-modules/manageAccount.php b/pos/is4c-web/gui-modules/manageAccount.php new file mode 100644 index 000000000..5c55f307a --- /dev/null +++ b/pos/is4c-web/gui-modules/manageAccount.php @@ -0,0 +1,157 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('UserPage')) include($IS4C_PATH.'gui-class-lib/UserPage.php'); +if (!function_exists('checkLogin')) include($IS4C_PATH.'auth/login.php'); +if (!function_exists('pDataConnect')) include($IS4C_PATH.'lib/connect.php'); + +class manageAccount extends BasicPage { + + function js_content(){ + ?> + $(document).ready(function(){ + $('#fullname').focus(); + }); + <?php + } + + var $entries; + var $logged_in_user; + + function main_content(){ + global $IS4C_PATH; + ?> + <div id="loginTitle">Manage your Account<br /> + <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> + <table cellspacing="4" cellpadding="4"> + <tr> + <th>Full Name</th> + <td><input id="fullname" type="text" name="fn" value="<?php echo $this->entries['name']; ?>" /></td> + </tr><tr> + <th>E-mail address</th> + <td><input type="text" name="email" value="<?php echo $this->entries['email']; ?>" /></td> + </tr><tr> + <th>Member-Owner</th> + <td><select name="owner"> + <option value="0" <?php echo $this->entries['owner']==0?'selected':''?>>No</option> + <option value="1" <?php echo $this->entries['owner']==1?'selected':''?>>Yes</option> + </select></td> + </tr><tr> + <th><input type="submit" value="Update Account" name="submit" /></th> + <td><a href="<?php echo $IS4C_PATH;?>gui-modules/changePassword.php">Change Password</a></td> + </tr> + </table> + </form> + </div> + <?php + } + + function preprocess(){ + global $IS4C_PATH; + $this->logged_in_user = checkLogin(); + + $dbc = pDataConnect(); + + $q = sprintf("SELECT name,real_name,owner FROM Users WHERE + name='%s'",$dbc->escape($this->logged_in_user)); + $r = $dbc->query($q); + if ($dbc->num_rows($r) == 0){ + // sanity check; shouldn't ever happen + header("Location: {$IS4C_PATH}gui-modules/loginPage.php"); + return False; + } + $w = $dbc->fetch_row($r); + + $this->entries = array( + 'name'=>$w['real_name'], + 'email'=>$w['name'], + 'owner'=>$w['owner'] + ); + + if (isset($_REQUEST['submit'])){ + // validate + + if ($_REQUEST['email'] != $this->entries['email']){ + if (!isEmail($_REQUEST['email'],FILTER_VALIDATE_EMAIL)){ + echo '<div class="errorMsg">'; + echo 'Not a valid e-mail address: '.$_REQUEST['email']; + echo '</div>'; + } + else { + $newemail = $_REQUEST['email']; + $upQ = sprintf("UPDATE Users SET name='%s' WHERE name='%s'", + $dbc->escape($newemail), + $dbc->escape($this->logged_in_user)); + $dbc->query($upQ); + doLogin($newemail); + $this->logged_in_user = $newemail; + $this->entries['email'] = $newemail; + echo '<div class="successMsg">'; + echo 'E-mail address has been updated'; + echo '</div>'; + } + } + + if ($_REQUEST['fn'] != $this->entries['name']){ + if (empty($_REQUEST['fn'])){ + echo '<div class="errorMsg">'; + echo 'Name is required'; + echo '</div>'; + } + else { + $upQ = sprintf("UPDATE Users SET real_name='%s' WHERE name='%s'", + $dbc->escape($_REQUEST['fn']), + $dbc->escape($this->logged_in_user)); + $dbc->query($upQ); + $this->entries['name'] = $_REQUEST['fn']; + echo '<div class="successMsg">'; + echo 'Name has been updated'; + echo '</div>'; + } + } + + if ($_REQUEST['owner'] != $this->entries['owner']){ + $upQ = sprintf("UPDATE Users SET owner=%d WHERE name='%s'", + $dbc->escape($_REQUEST['owner']), + $dbc->escape($this->logged_in_user)); + $dbc->query($upQ); + $this->entries['owner'] = $_REQUEST['owner']; + echo '<div class="successMsg">'; + echo 'Owner status has been updated'; + echo '</div>'; + } + + } + + return True; + } +} + +new manageAccount(); + +?> diff --git a/pos/is4c-web/gui-modules/storefront.php b/pos/is4c-web/gui-modules/storefront.php new file mode 100644 index 000000000..2b6ac0e9d --- /dev/null +++ b/pos/is4c-web/gui-modules/storefront.php @@ -0,0 +1,266 @@ +<?php +/******************************************************************************* + + Copyright 2007,2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!class_exists('BasicPage')) include($IS4C_PATH.'gui-class-lib/BasicPage.php'); +if (!function_exists('pDataConnect')) include($IS4C_PATH.'lib/connect.php'); +if (!function_exists('getUID')) include($IS4C_PATH.'auth/login.php'); + +class storefront extends BasicPage { + + function js_content(){ + ?> + $(document).ready(function(){ + $('#searchbox').focus(); + }); + function addItem(upc){ + $.ajax({ + url: '../ajax-callbacks/ajax-add-item.php', + type: 'post', + data: 'upc='+upc, + success: function(resp){ + $('#btn'+upc).html('<a href="cart.php">In Cart</a>'); + } + }); + } + <?php + } + + function main_content(){ + global $IS4C_PATH; + echo '<div id="sidebar">'; + echo $this->sidebar(); + echo '</div>'; + echo '<div id="browsearea">'; + echo $this->itemlist(); + echo '</div>'; + echo '<div style="clear:both;"></div>'; + } + + function itemlist(){ + global $IS4C_LOCAL; + $super = isset($_REQUEST['sup'])?$_REQUEST['sup']:-1; + $sub = isset($_REQUEST['sub'])?$_REQUEST['sub']:-1; + $d = isset($_REQUEST['d'])?$_REQUEST['d']:-1; + $brand = isset($_REQUEST['bid'])?base64_decode($_REQUEST['bid']):-1; + + $limit = 50; + $page = isset($_REQUEST['pg'])?((int)$_REQUEST['pg']):0; + $offset = $page*$limit; + + $sort = "u.brand,u.description"; + + $dbc = pDataConnect(); + $empno = getUID(checkLogin()); + if ($empno===False) $empno=-999; + + $q = "SELECT p.upc,p.normal_price, + CASE WHEN p.discounttype IN (1) then p.special_price + ELSE 0 + END as sale_price, + u.description,u.brand, + CASE WHEN l.upc IS NULL THEN 0 ELSE 1 END AS inCart + FROM products AS p INNER JOIN productUser + AS u ON p.upc=u.upc LEFT JOIN ".$IS4C_LOCAL->get("tDatabase").".localtemptrans + AS l ON p.upc=l.upc AND l.emp_no=$empno + LEFT JOIN productOrderLimits AS o ON p.upc=o.upc "; + if ($super != -1) + $q .= "INNER JOIN superdepts AS s ON p.department=s.dept_ID "; + if ($sub != -1) + $q .= "INNER JOIN subdepts AS b ON p.department=b.dept_ID "; + $q .= "WHERE p.inUse=1 AND u.enableOnline=1 AND (o.available IS NULL or o.available > 0) "; + if ($super != -1) + $q .= sprintf("AND s.superID=%d ",$super); + if ($d != -1) + $q .= sprintf("AND p.department=%d ",$d); + if ($sub != -1) + $q .= sprintf("AND b.subdept_no=%d ",$sub); + if ($brand != -1) + $q .= sprintf("AND u.brand='%s' ",$dbc->escape($brand)); + $q .= "ORDER BY $sort LIMIT $offset,$limit"; + + $ret = '<table cellspacing="4" cellpadding="4" id="browsetable">'; + $ret .= '<tr><th>Brand</th><th>Product</th><th>Price</th><th>&nbsp;</th></tr>'; + $r = $dbc->query($q); + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf('<tr><td>%s</td> + <td><a href="item.php?upc=%s">%s</a></td> + <td>$%.2f</td> + <td>%s</td>', + $w['brand'], + $w['upc'],$w['description'], + ($w['sale_price']==0?$w['normal_price']:$w['sale_price']), + ($w['sale_price']==0?'&nbsp;':'ON SALE!') + ); + if ($w['inCart'] == 0 && $empno != -999){ + $ret .= sprintf('<td id="btn%s"> + <input type="submit" value="Add to cart" onclick="addItem(\'%s\');" /> + </td></tr>', + $w['upc'],$w['upc']); + } + else if ($empno != -999){ + $ret .= sprintf('<td id="btn%s"> + <a href="cart.php">In Cart</a> + </td></tr>', + $w['upc']); + } + else $ret .= '<td></td></tr>'; + } + $ret .= '</table>'; + return $ret; + } + + function sidebar(){ + $super = isset($_REQUEST['sup'])?$_REQUEST['sup']:-1; + $sub = isset($_REQUEST['sub'])?$_REQUEST['sub']:-1; + $d = isset($_REQUEST['d'])?$_REQUEST['d']:-1; + + $ret = '<ul id="superList">'; + $dbc = pDataConnect(); + $r = $dbc->query("SELECT superID,super_name FROM + superDeptNames ORDER BY super_name"); + $sids = array(); + while($w = $dbc->fetch_row($r)){ + $sids[$w['superID']] = $w['super_name']; + } + if (count($sids)==1) + $super = array_pop(array_keys($sids)); + + if ($sub != -1 && $d != -1 && $super != -1){ + // browsing subdept + + } + else if ($d != -1 && $super != -1){ + // browsing dept + $q = sprintf("SELECT subdept_no,subdept_name FROM subdepts + WHERE dept_ID=%d",$d); + $r = $dbc->query($q); + $subs = True; + if ($dbc->num_rows($r) == 0){ + // no subdepts; skip straight to brands + $subs = False; + $q = sprintf("SELECT u.brand FROM products AS p + INNER JOIN productUser AS u ON p.upc=u.upc + WHERE p.department=%d AND u.brand <> '' + AND u.brand IS NOT NULL GROUP BY u.brand",$d); + $r = $dbc->query($q); + } + + foreach($sids as $id=>$name){ + $ret .= sprintf('<li><a href="%s?sup=%d">%s</a>', + $_SERVER['PHP_SELF'],$id,$name); + if ($id == $super){ + $ret .= '<ul id="deptlist">'; + $dR = $dbc->query(sprintf("SELECT dept_no,dept_name FROM departments + as d INNER JOIN superdepts as s ON d.dept_no=s.dept_ID + WHERE s.superID=%d",$super)); + while($w = $dbc->fetch_row($dR)){ + $ret .= sprintf('<li><a href="%s?sup=%d&d=%d">%s</a>', + $_SERVER['PHP_SELF'],$id,$w['dept_no'],$w['dept_name']); + if ($w['dept_no'] == $d){ + $ret .= '<ul id="sidebar3">'; + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf('<li><a href="%s?sup=%d&d=%d', + $_SERVER['PHP_SELF'],$id,$d); + if ($subs){ + $ret .= sprintf('&sub=%d">%s</a></li>', + $w['subdept_no'],$w['subdept_name']); + } + else { + $ret .= sprintf('&bid=%s">%s</a></li>', + base64_encode($w['brand']), + $w['brand']); + } + } + $ret .= '</ul>'; + } + $ret .= '</li>'; + } + $ret .= '</ul>'; + } + } + + } + else if ($super != -1){ + // browsing super + foreach($sids as $id=>$name){ + $ret .= sprintf('<li><a href="%s?sup=%d">%s</a>', + $_SERVER['PHP_SELF'],$id,$name); + if ($id == $super){ + $ret .= '<ul id="deptlist">'; + $r = $dbc->query(sprintf("SELECT dept_no,dept_name FROM departments + as d INNER JOIN superdepts as s ON d.dept_no=s.dept_ID + WHERE s.superID=%d",$super)); + while($w = $dbc->fetch_row($r)){ + $ret .= sprintf('<li><a href="%s?sup=%d&d=%d">%s</a></li>', + $_SERVER['PHP_SELF'],$id,$w['dept_no'],$w['dept_name']); + } + $ret .= '</ul>'; + } + $ret .= '</li>'; + } + } + else { + // top level browsing + foreach($sids as $id=>$name){ + $ret .= sprintf('<li><a href="%s?sup=%d">%s</a></li>', + $_SERVER['PHP_SELF'],$id,$name); + } + } + + $ret .= '</ul>'; + + return $ret; + } + + function preprocess(){ + global $IS4C_PATH; + if (isset($_REQUEST['email'])){ + if (!isEmail($_REQUEST['email'])){ + echo '<div class="errorMsg">'; + echo 'Not a valid e-mail address: '.$_REQUEST['email']; + echo '</div>'; + return True; + } + else if (!login($_REQUEST['email'],$_REQUEST['passwd'])){ + echo '<div class="errorMsg">'; + echo 'Incorrect e-mail address or password'; + echo '</div>'; + return True; + } + else { + header("Location: {$IS4C_PATH}gui-modules/storefront.php"); + return False; + } + } + return True; + } +} + +new storefront(); + +?> diff --git a/pos/is4c-web/index.php b/pos/is4c-web/index.php new file mode 100644 index 000000000..889084ec2 --- /dev/null +++ b/pos/is4c-web/index.php @@ -0,0 +1,3 @@ +<?php +header('Location: gui-modules/storefront.php'); +?> diff --git a/pos/is4c-web/install/README b/pos/is4c-web/install/README new file mode 100644 index 000000000..99401a0ec --- /dev/null +++ b/pos/is4c-web/install/README @@ -0,0 +1,6 @@ +Put IS4C in apache's root directory. Have PHP installed. +Have a MySQL or SQL Server somewhere accessible. + +Navigate to this directory. Configuration is web-based. +ini.php (in the above directory) must be writeable +by apache to save your config. diff --git a/pos/is4c-web/install/buildLTTViews.php b/pos/is4c-web/install/buildLTTViews.php new file mode 100644 index 000000000..42b31edf4 --- /dev/null +++ b/pos/is4c-web/install/buildLTTViews.php @@ -0,0 +1,462 @@ +<?php +/******************************************************************************* + + Copyright 2009 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function buildLTTViews($db,$type){ + if ($type == 'mysql') buildLTTViewsMySQL($db); + elseif($type == 'mssql') buildLTTViewsMSSQL($db); +} + +function buildLTTViewsMySQL($db){ + +//-------------------------------------------------------------- +// CREATE lttSummary VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view lttsummary as + select + (case when min(datetime) is null then now() else min(datetime) end) as tdate, + max(card_no) as card_no, + convert(sum(total),decimal(10,2)) as runningTotal, + convert(sum(case when discounttype = 1 then discount else 0 end),decimal(10,2)) as discountTTL, + convert(sum(case when discountable <> 0 and tax <> 0 then total else 0 end),decimal(10,2)) as discTaxable, + convert(sum(case when discounttype in (2,3) then memDiscount else 0 end),decimal(10,2)) as memSpecial, + case when (min(datetime) is null) then 0 else + sum(CASE WHEN discounttype = 4 THEN memDiscount ELSE 0 END) + end as staffSpecial, + convert(sum(case when discountable = 0 then 0 else total end),decimal(10,2)) as discountableTTL, + convert(sum(case when discountable = 7 then total else 0 end),decimal(10,2)) as scDiscountableTTL, + "; + +$taxRatesQ = "select id,description from taxrates order by id"; +$taxRatesR = $db->query($taxRatesQ); +while ($taxRatesW = $db->fetch_row($taxRatesR)){ + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 then total else 0 end),decimal(10,2)) as noDiscTaxable".$taxRatesW[1].",\n"; + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 then total else 0 end),decimal(10,2)) as discTaxable".$taxRatesW[1].",\n"; + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 and foodstamp=1 then total else 0 end),decimal(10,2)) as fsTaxable".$taxRatesW[1].",\n"; + $createStr .= "convert(sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 and foodstamp=1 then total else 0 end),decimal(10,2)) as fsDiscTaxable".$taxRatesW[1].",\n"; +} + +$createStr .= "convert(sum( + case + when (trans_type = 'I' or trans_type = 'D') and tax = 1 and discountable <> 7 then total + when (trans_type = 'I' or trans_type = 'D') and tax = 1 and discountable = 7 then (total * 0.9) + else 0 end),decimal(10,2)) as scTaxable, + +convert(sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end),decimal(10,2)) as chargeTotal, +convert(sum(case when trans_subtype = 'CC' then total else 0 end),decimal(10,2)) as ccTotal, +convert(sum(case when department = 990 then total else 0 end),decimal(10,2)) as paymentTotal, +convert(sum(case when trans_subtype = 'MI' or department = 990 then total else 0 end),decimal(10,2)) as memChargeTotal, +convert(sum(case when trans_type = 'T' then total else 0 end),decimal(10,2)) as tenderTotal,\n"; +$createStr .= "convert(sum(case when trans_subtype = 'FS' or trans_subtype = 'EF' then total else 0 end),decimal(10,2)) as fsTendered, +convert(sum(case when (foodstamp = 1 or trans_subtype='FS' or trans_subtype='EF') then total else 0 end),decimal(10,2)) as fsTotal, +convert(sum(case when foodstamp = 1 and discountable = 0 then total else 0 end),decimal(10,2)) as fsItems, +convert(sum(case when foodstamp = 1 and discountable <> 0 then total else 0 end),decimal(10,2)) as fsDiscItems, +convert(sum(case when trans_status = 'R' then total else 0 end),decimal(10,2)) as refundTotal, +convert(sum(case when upc = '0000000008005' then total else 0 end),decimal(10,2)) as couponTotal, +convert(sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end),decimal(10,2)) as memCoupon, +(case when (max(percentDiscount) is null or max(percentDiscount) < 0) then 0.00 else max(convert(percentDiscount,decimal)) end) as percentDiscount, +convert(sum(case when numflag=1 THEN total ELSE 0 END),decimal(10,2)) as localTotal, +max(trans_id) as LastID +from localtemptrans\n"; + +$db->query("DROP VIEW lttsummary"); +$db->query($createStr); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("localtemptrans","localtranstoday",$rpQ); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ .= " GROUP BY emp_no,register_no,trans_no"; +$db->query("DROP VIEW rp_lttsummary"); +$db->query($rpQ); +//echo str_replace("\n","<br />",$createStr)."<br />"; +//echo "<hr />"; + + +//-------------------------------------------------------------- +// CREATE lttSubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE VIEW lttsubtotals AS + select tdate,\n"; +$ratesQ = "select description,rate from taxrates"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +if (count($rates) > 0){ + $createStr .= "convert("; + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "(noDiscTaxable".$desc[$i]." * ".$rates[$i].") + "; + $createStr .= "(discTaxable".$desc[$i]." * ((100-percentDiscount)/100) * ".$rates[$i].") + "; + } + $createStr = substr($createStr,0,strlen($createStr)-2); + $createStr .= ",decimal(10,2)) as taxTotal,\n"; +} +else $createStr .= "0 as taxTotal,\n"; + +$createStr .= "convert(discTaxable * (100 - percentDiscount/100),decimal(10,2)) as ADtaxable, + convert(scTaxable * ((100 - percentDiscount)/100) * 0.09,decimal(10,2)) as scTaxTotal, +fsTendered, +(fsDiscItems - convert((fsDiscItems * (percentDiscount)/100),decimal(10,2)) +fsItems + fsTendered) as fsEligible, +convert(fsTendered * 0.075,decimal(10,2)) as fsTendered07, +convert(fsTendered * 0.09,decimal(10,2)) as fsTendered085,\n"; +if(count($rates) > 0){ + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "convert((fsDiscTaxable".$desc[$i]."*((100-percentDiscount)/100)) + fsTaxable".$desc[$i].",decimal(10,2)) as fsTaxable".$desc[$i].","; + $createStr .= "convert((fsDiscTaxable".$desc[$i]."*((100-percentDiscount)/100)*".$rates[$i].")+(fsTaxable".$desc[$i]."*".$rates[$i]."),decimal(10,2)) as fsTax".$desc[$i].",\n"; + } +} +else $createStr .= "0 as fsTax,\n"; + +$createStr .= "convert(scDiscountableTTL * 0.1,decimal(10,2)) as scDiscount, +convert(discountableTTL * percentDiscount / 100,decimal(10,2)) as transDiscount, +convert((discountableTTL - (scDiscountableTTL * 0.1)) * percentDiscount / 100,decimal(10,2)) as scTransDiscount + +from lttsummary\n"; +$db->query("DROP VIEW lttsubtotals"); +$db->query($createStr); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$db->query("DROP VIEW rp_lttsubtotals"); +$db->query($rpQ); +//echo str_replace("\n","<br />",$createStr)."<br />"; +//echo "<hr />"; + +//-------------------------------------------------------------- +// CREATE SubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view subtotals as +select +(case when l.LastID is null then 0 else l.LastID end) as LastID, +l.card_no as card_no, +l.runningTotal as runningTotal, +convert((l.runningTotal - s.transDiscount),decimal(10,2)) as subTotal, +l.discountableTTL as discountableTotal, +l.tenderTotal, +l.chargeTotal, +l.ccTotal, +l.paymentTotal, +l.memChargeTotal, +l.discountTTL, +l.memSpecial, +l.staffSpecial, +l.refundTotal as refundTotal, +l.couponTotal as couponTotal, +l.memCoupon as memCoupon, +case when convert(l.runningTotal - s.transDiscount,decimal(10,2)) * .05 > 2.5 then 2.5 +else convert (l.runningTotal - s.transDiscount,decimal(10,2)) * .05 end as madCoupon, +s.fsEligible as fsEligible,\n"; + +$ratesQ = "select description,rate from taxRates order by rate desc"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +$fsTaxStr = "convert(CASE WHEN "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " = 0 THEN 0 ELSE CASE WHEN l.fsTendered <> 0 AND -1 * l.fsTendered >= "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " THEN -1 * ("; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTax".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= ") ELSE CASE "; +for ($i = 0; $i < count($rates); $i++){ + $fsTaxStr .= "WHEN -1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable".$desc[$j]; + $fsTaxStr .= "<= s.fsTaxable".$desc[$i]; + $fsTaxStr .= " THEN -("; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "s.fsTax".$desc[$j]."+"; + $fsTaxStr .= "((-1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable".$desc[$j]; + $fsTaxStr .= ") * ".$rates[$i]."))"; +} +$fsTaxStr .= " END END END,decimal(10,2))\n"; + +if(count($rates) > 0){ + $createStr .= $fsTaxStr." as fsTaxExempt,\n"; + $createStr .= "convert(s.taxTotal+".$fsTaxStr.",decimal(10,2)) as taxTotal,\n"; +} +else { + $createStr .= "0 as fsTaxExempt,\n"; + $createStr .= "0 as taxTotal,\n"; +} +$createStr .= "s.scTaxTotal,\n"; +if(count($rates) > 0){ + $createStr .= "convert((l.runningTotal - s.transdiscount) + s.taxTotal + ".$fsTaxStr.",decimal(10,2)) as AmtDue,\n"; + $createStr .= "convert((l.runningTotal - s.sctransdiscount) + s.taxTotal + ".$fsTaxStr.",decimal(10,2)) as scAmtDue,\n"; +} +else { + $createStr .= "convert((l.runningTotal - s.transdiscount) + s.taxTotal ,decimal(10,2)) as AmtDue,\n"; + $createStr .= "convert((l.runningTotal - s.sctransdiscount) + s.taxTotal ,decimal(10,2)) as scAmtDue,\n"; +} +$createStr .= "s.scDiscount, +s.transDiscount, +s.scTransDiscount, +l.percentDiscount, +l.localTotal +from lttsummary l, lttsubtotals s where l.tdate = s.tdate\n"; + +$db->query("DROP VIEW subtotals"); +$db->query($createStr); +$rpQ = str_replace("select","select l.emp_no,l.register_no,l.trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$rpQ = str_replace("view subtotals","view rp_subtotals",$rpQ); +$rpQ .= " AND l.emp_no=s.emp_no AND + l.register_no=s.register_no AND + l.trans_no=s.trans_no"; +$db->query("DROP VIEW rp_subtotals"); +$db->query($rpQ); +//echo str_replace("\n","<br />",$createStr)."<br />"; + +} + +function buildLTTViewsMSSQL($db){ + +//-------------------------------------------------------------- +// CREATE lttSummary VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view lttsummary as + select + (case when min(datetime) is null then getdate() else min(datetime) end) as tdate, + max(card_no) as card_no, + convert(numeric(10,2),sum(total)) as runningTotal, + convert(numeric(10,2),sum(case when discounttype = 1 then discount else 0 end)) as discountTTL, + convert(numeric(10,2),sum(case when discounttype in (2,3) then memDiscount else 0 end)) as memSpecial, + case when (min(datetime) is null) then 0 else + sum(CASE WHEN discounttype = 4 THEN memDiscount ELSE 0 END) + end as staffSpecial, + convert(numeric(10,2),sum(case when discountable = 0 then 0 else total end)) as discountableTTL, + convert(numeric(10,2),sum(case when discountable = 7 then total else 0 end)) as scDiscountableTTL, + "; + +$taxRatesQ = "select id,description from taxRates order by id"; +$taxRatesR = $db->query($taxRatesQ); +while ($taxRatesW = $db->fetch_row($taxRatesR)){ + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 then total else 0 end)) as noDiscTaxable".$taxRatesW[1].","; + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 then total else 0 end)) as discTaxable".$taxRatesW[1].","; + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable = 0 and foodstamp=1 then total else 0 end)) as fsTaxable".$taxRatesW[1].","; + $createStr .= "convert(numeric(10,2),sum(case when (trans_type = 'I' or trans_type = 'D') and tax = ".$taxRatesW[0]." and discountable <> 0 and foodstamp=1 then total else 0 end)) as fsDiscTaxable".$taxRatesW[1].","; +} + +$createStr .= "convert(numeric(10,2),sum( + case + when (trans_type = 'I' or trans_type = 'D') and tax = 1 and discountable <> 7 then total + when (trans_type = 'I' or trans_type = 'D') and tax = 1 and discountable = 7 then (total * 0.9) + else 0 end)) as scTaxable, + +convert(numeric(10,2),sum(case when trans_subtype = 'MI' or trans_subtype = 'CX' then total else 0 end)) as chargeTotal, +convert(numeric(10,2),sum(case when trans_subtype = 'CC' then total else 0 end)) as ccTotal, +convert(numeric(10,2),sum(case when department = 990 then total else 0 end)) as paymentTotal, +convert(numeric(10,2),sum(case when trans_subtype = 'MI' or department = 990 then total else 0 end)) as memChargeTotal, +convert(numeric(10,2),sum(case when trans_type = 'T' then total else 0 end)) as tenderTotal,"; +$createStr .= "convert(numeric(10,2),sum(case when trans_subtype = 'FS' or trans_subtype = 'EF' then total else 0 end)) as fsTendered, +convert(numeric(10,2),sum(case when (foodstamp = 1 or trans_subtype='FS' or trans_subtype='EF') then total else 0 end)) as fsTotal, +convert(numeric(10,2),sum(case when foodstamp = 1 and discountable = 0 then total else 0 end)) as fsItems, +convert(numeric(10,2),sum(case when foodstamp = 1 and discountable <> 0 then total else 0 end)) as fsDiscItems, +convert(numeric(10,2),sum(case when trans_status = 'R' then total else 0 end)) as refundTotal, +convert(numeric(10,2),sum(case when upc = '0000000008005' then total else 0 end)) as couponTotal, +convert(numeric(10,2),sum(case when upc = 'MEMCOUPON' then unitPrice else 0 end)) as memCoupon, +(case when (max(percentDiscount) is null or max(percentDiscount) < 0) then 0.00 else max(convert(numeric(10,2),percentDiscount)) end) as percentDiscount, +convert(numeric(10,2),sum(case when numflag=1 then total else 0 end)) as localTotal, +max(trans_id) as LastID +from localtemptrans"; + +$db->query("DROP VIEW lttsummary"); +$db->query($createStr); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("localtemptrans","localtranstoday",$rpQ); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ .= " GROUP BY emp_no,register_no,trans_no"; +$db->query("DROP VIEW rp_lttsummary"); +$db->query($rpQ); +//echo $createStr."<br />"; +//echo "lttSummary view created<br />"; + + +//-------------------------------------------------------------- +// CREATE lttSubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE VIEW lttsubtotals AS + select tdate,"; +$ratesQ = "select description,rate from taxRates"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +if(count($rates) > 0){ + $createStr .= "convert(numeric(10,2),"; + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "(noDiscTaxable".$desc[$i]." * ".$rates[$i].") + "; + $createStr .= "(discTaxable".$desc[$i]." * ((100-percentDiscount)/100) * ".$rates[$i].") + "; + } + $createStr = substr($createStr,0,strlen($createStr)-2); + $createStr .= ") as taxTotal,"; +} +else $createStr .= "0 as taxTotal,"; + +$createStr .= "convert(numeric(10,2),scTaxable * ((100 - percentDiscount)/100) * 0.09) as scTaxTotal, +fsTendered, +(fsDiscItems - convert(numeric(10,2),(fsDiscItems * (percentDiscount)/100)) +fsItems + fsTendered) as fsEligible, +convert(numeric(10,2),fsTendered * 0.075) as fsTendered07, +convert(numeric(10,2),fsTendered * 0.09) as fsTendered085,"; +if(count($rates) > 0){ + for ($i = 0; $i < count($rates); $i++){ + $createStr .= "convert(numeric(10,2),(fsDiscTaxable".$desc[$i]."*((100-percentDiscount)/100)) + fsTaxable".$desc[$i].") as fsTaxable".$desc[$i].","; + $createStr .= "convert(numeric(10,2),(fsDiscTaxable".$desc[$i]."*((100-percentDiscount)/100)*".$rates[$i].")+(fsTaxable".$desc[$i]."*".$rates[$i].")) as fsTax".$desc[$i].","; + } +} +else $createStr .= "0 as fsTax,"; + +$createStr .= "convert(numeric(10,2),scDiscountableTTL * 0.1) as scDiscount, +convert(numeric(10,2),discountableTTL * percentDiscount / 100) as transDiscount, +convert(numeric(10,2),(discountableTTL - (scDiscountableTTL * 0.1)) * percentDiscount / 100) as scTransDiscount + +from lttsummary"; +$db->query("DROP VIEW lttsubtotals"); +$db->query($createStr); +$rpQ = str_replace("select","select emp_no,register_no,trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$db->query("DROP VIEW rp_lttsubtotals"); +$db->query($rpQ); +//echo $createStr."<br />"; +//echo "lttSubTotals view created<br />"; + +//-------------------------------------------------------------- +// CREATE SubTotals VIEW +//-------------------------------------------------------------- + +$createStr = "CREATE view subtotals as +select +(case when l.LastID is null then 0 else l.LastID end) as LastID, +l.card_no as card_no, +l.runningTotal as runningTotal, +convert(numeric(10,2),(l.runningTotal - s.transDiscount)) as subTotal, +l.discountableTTL as discountableTotal, +l.tenderTotal, +l.chargeTotal, +l.ccTotal, +l.paymentTotal, +l.memChargeTotal, +l.discountTTL, +l.memSpecial, +l.staffSpecial, +l.refundTotal as refundTotal, +l.couponTotal as couponTotal, +l.memCoupon as memCoupon, +case when convert(numeric(10,2),l.runningTotal - s.transDiscount) * .05 > 2.5 then 2.5 +else convert(numeric(10,2),l.runningTotal - s.transDiscount) * .05 end as madCoupon, +s.fsEligible as fsEligible,"; + +$ratesQ = "select description,rate from taxRates order by rate desc"; +$ratesR = $db->query($ratesQ); +$desc = array(); +$rates = array(); +while ($ratesW = $db->fetch_row($ratesR)){ + array_push($desc,$ratesW[0]); + array_push($rates,$ratesW[1]); +} +$fsTaxStr = "convert(numeric(10,2),CASE WHEN "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " = 0 THEN 0 ELSE CASE WHEN -1 * l.fsTendered >= "; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTaxable".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= " THEN -1 * ("; +for ($i = 0; $i < count($rates); $i++) + $fsTaxStr .= "s.fsTax".$desc[$i]."+"; +$fsTaxStr = substr($fsTaxStr,0,strlen($fsTaxStr)-1); +$fsTaxStr .= ") ELSE CASE "; +for ($i = 0; $i < count($rates); $i++){ + $fsTaxStr .= "WHEN -1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable".$desc[$j]; + $fsTaxStr .= "<= s.fsTaxable".$desc[$i]; + $fsTaxStr .= " THEN -("; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "s.fsTax".$desc[$j]."+"; + $fsTaxStr .= "((-1*l.fsTendered "; + for ($j = $i-1; $j >= 0; $j--) + $fsTaxStr .= "-s.fsTaxable".$desc[$j]; + $fsTaxStr .= ") * ".$rates[$i]."))"; +} +$fsTaxStr .= " END END END)"; + +if(count($rates) > 0){ + $createStr .= $fsTaxStr." as fsTaxExempt,"; + $createStr .= "convert(numeric(10,2),s.taxTotal+".$fsTaxStr.") as taxTotal,"; +} +else { + $createStr .= "0 as fsTaxExempt,"; + $createStr .= "0 as taxTotal,"; +} +$createStr .= "s.scTaxTotal,"; +$createStr .= "convert(numeric(10,2),(l.runningTotal - s.transdiscount) + s.taxTotal + ".$fsTaxStr.") as AmtDue,"; +$createStr .= "convert(numeric(10,2),(l.runningTotal - s.sctransdiscount) + s.taxTotal + ".$fsTaxStr.") as scAmtDue,"; +$createStr .= "s.scDiscount, +s.transDiscount, +s.scTransDiscount, +l.percentDiscount, +l.localTotal +from lttsummary l, lttsubtotals s where l.tdate = s.tdate"; + +$db->query("DROP VIEW subtotals"); +$db->query($createStr); +$rpQ = str_replace("select","select l.emp_no,l.register_no,l.trans_no,",$createStr); +$rpQ = str_replace("lttsummary","rp_lttsummary",$rpQ); +$rpQ = str_replace("lttsubtotals","rp_lttsubtotals",$rpQ); +$rpQ = str_replace("view subtotals","view rp_subtotals",$rpQ); +$rpQ .= " AND l.emp_no=s.emp_no AND + l.register_no=s.register_no AND + l.trans_no=s.trans_no"; +$db->query("DROP VIEW rp_subtotals"); +$db->query($rpQ); +//echo $createStr."<br />"; +//echo "SubTotals view created<br />"; + +} + +?> diff --git a/pos/is4c-web/install/data/couponcode.sql b/pos/is4c-web/install/data/couponcode.sql new file mode 100644 index 000000000..05b06bdfb --- /dev/null +++ b/pos/is4c-web/install/data/couponcode.sql @@ -0,0 +1,95 @@ +('01',1,0) +('14',2,0) +('16',3,0) +('19',4,0) +('02',5,0) +('10',1,-0.1) +('13',4,-1) +('09',3,-2) +('07',3,-1.5) +('42',3,-1) +('52',3,-0.55) +('41',3,-0.5) +('38',3,-0.3) +('37',3,-0.25) +('08',2,-3) +('51',2,-2) +('48',2,-1.85) +('47',2,-1.75) +('46',2,-1.6) +('36',2,-1.5) +('44',2,-1.35) +('34',2,-1.25) +('43',2,-1.1) +('32',2,-0.75) +('98',2,-0.65) +('31',2,-0.6) +('23',2,-0.45) +('22',2,-0.4) +('21',2,-0.35) +('56',2,-0.2) +('54',2,-0.15) +('53',2,-0.1) +('33',2,-1) +('28',2,-0.55) +('24',2,-0.5) +('58',2,-0.3) +('57',2,-0.25) +('61',1,-10) +('62',1,-9.5) +('63',1,-9) +('64',1,-8.5) +('66',1,-8) +('67',1,-7.5) +('68',1,-7) +('71',1,-6.5) +('72',1,-6) +('73',1,-5.5) +('74',1,-5) +('96',1,-4.5) +('93',1,-4) +('92',1,-3.75) +('91',1,-3.5) +('88',1,-3.25) +('87',1,-3) +('26',1,-2.85) +('86',1,-2.75) +('18',1,-2.6) +('84',1,-2.5) +('83',1,-2.25) +('82',1,-2) +('11',1,-1.85) +('81',1,-1.75) +('06',1,-1.6) +('78',1,-1.5) +('05',1,-1.4) +('04',1,-1.35) +('77',1,-1.25) +('03',1,-1.1) +('76',1,-1) +('99',1,-0.99) +('95',1,-0.95) +('90',1,-0.9) +('85',1,-0.85) +('89',1,-0.89) +('80',1,-0.8) +('79',1,-0.79) +('75',1,-0.75) +('70',1,-0.7) +('69',1,-0.69) +('65',1,-0.65) +('60',1,-0.6) +('59',1,-0.59) +('55',1,-0.55) +('50',1,-0.5) +('49',1,-0.49) +('45',1,-0.45) +('40',1,-0.4) +('39',1,-0.39) +('35',1,-0.35) +('30',1,-0.3) +('29',1,-0.29) +('20',1,-0.2) +('25',1,-0.25) +('15',1,-0.15) +('12',1,-0.12) diff --git a/pos/is4c-web/install/data/couponcodes.sql b/pos/is4c-web/install/data/couponcodes.sql new file mode 100644 index 000000000..05b06bdfb --- /dev/null +++ b/pos/is4c-web/install/data/couponcodes.sql @@ -0,0 +1,95 @@ +('01',1,0) +('14',2,0) +('16',3,0) +('19',4,0) +('02',5,0) +('10',1,-0.1) +('13',4,-1) +('09',3,-2) +('07',3,-1.5) +('42',3,-1) +('52',3,-0.55) +('41',3,-0.5) +('38',3,-0.3) +('37',3,-0.25) +('08',2,-3) +('51',2,-2) +('48',2,-1.85) +('47',2,-1.75) +('46',2,-1.6) +('36',2,-1.5) +('44',2,-1.35) +('34',2,-1.25) +('43',2,-1.1) +('32',2,-0.75) +('98',2,-0.65) +('31',2,-0.6) +('23',2,-0.45) +('22',2,-0.4) +('21',2,-0.35) +('56',2,-0.2) +('54',2,-0.15) +('53',2,-0.1) +('33',2,-1) +('28',2,-0.55) +('24',2,-0.5) +('58',2,-0.3) +('57',2,-0.25) +('61',1,-10) +('62',1,-9.5) +('63',1,-9) +('64',1,-8.5) +('66',1,-8) +('67',1,-7.5) +('68',1,-7) +('71',1,-6.5) +('72',1,-6) +('73',1,-5.5) +('74',1,-5) +('96',1,-4.5) +('93',1,-4) +('92',1,-3.75) +('91',1,-3.5) +('88',1,-3.25) +('87',1,-3) +('26',1,-2.85) +('86',1,-2.75) +('18',1,-2.6) +('84',1,-2.5) +('83',1,-2.25) +('82',1,-2) +('11',1,-1.85) +('81',1,-1.75) +('06',1,-1.6) +('78',1,-1.5) +('05',1,-1.4) +('04',1,-1.35) +('77',1,-1.25) +('03',1,-1.1) +('76',1,-1) +('99',1,-0.99) +('95',1,-0.95) +('90',1,-0.9) +('85',1,-0.85) +('89',1,-0.89) +('80',1,-0.8) +('79',1,-0.79) +('75',1,-0.75) +('70',1,-0.7) +('69',1,-0.69) +('65',1,-0.65) +('60',1,-0.6) +('59',1,-0.59) +('55',1,-0.55) +('50',1,-0.5) +('49',1,-0.49) +('45',1,-0.45) +('40',1,-0.4) +('39',1,-0.39) +('35',1,-0.35) +('30',1,-0.3) +('29',1,-0.29) +('20',1,-0.2) +('25',1,-0.25) +('15',1,-0.15) +('12',1,-0.12) diff --git a/pos/is4c-web/install/data/custdata.sql b/pos/is4c-web/install/data/custdata.sql new file mode 100644 index 000000000..c99555cec --- /dev/null +++ b/pos/is4c-web/install/data/custdata.sql @@ -0,0 +1,15257 @@ +('6456','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',427.83,'999','1','"6456 MEMBER','1','1') +('9018','1','LASTNAME','FIRSTNAME',999.99,78.13,'0',0.00,'1','1','1','TERM','0','0','0',187.50,'999','0','"9018 MEMBER','1','2') +('4462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',843.09,'999','0','"4462 MEMBER','1','3') +('7651','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7651 MEMBER','1','4') +('2644','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',740.92,'999','0','"2644 MEMBER','1','5') +('24','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"24 MEMBER','1','6') +('1640','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"1640 MEMBER','1','7') +('172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"172 MEMBER','1','8') +('1561','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',153.93,'999','1','"1561 MEMBER','1','9') +('5408','4','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5408 MEMBER','1','10') +('6486','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1253.66,'999','0','"6486 MEMBER','1','11') +('5049','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5049 MEMBER','1','12') +('6500','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',182.80,'999','1','"6500 MEMBER','1','13') +('3031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.78,'999','1','"3031 MEMBER','1','14') +('5006','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5006 MEMBER','1','15') +('4715','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5227.10,'999','1','"4715 MEMBER','1','16') +('537','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"537 MEMBER','1','17') +('254','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1812.79,'999','0','"254 MEMBER','1','18') +('6545','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1420.23,'999','0','"6545 MEMBER','1','19') +('6655','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1108.69,'999','1','"6655 MEMBER','1','20') +('4141','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3176.14,'999','0','"4141 MEMBER','1','21') +('3089','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',160.36,'999','1','"3089 MEMBER','1','22') +('2692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',26.71,'999','1','"2692 MEMBER','1','23') +('6803','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6803 MEMBER','1','24') +('4971','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2711.61,'999','0','"4971 MEMBER','1','25') +('8818','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8818 MEMBER','1','26') +('6003','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','0','1','REG','2','0','0',546.54,'999','0','"6003 MEMBER','1','27') +('255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',229.97,'999','1','"255 MEMBER','1','28') +('6428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',198.84,'999','0','"6428 MEMBER','1','29') +('6462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',922.06,'999','1','"6462 MEMBER','1','30') +('9036','2','LASTNAME','FIRSTNAME',999.99,56.25,'0',0.00,'1','0','1','TERM','0','0','0',393.75,'999','0','"9036 MEMBER','1','31') +('4176','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4176 MEMBER','1','32') +('3081','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3348.21,'999','0','"3081 MEMBER','1','33') +('4136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',27.12,'999','1','"4136 MEMBER','1','34') +('1586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1586 MEMBER','1','35') +('9102','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9102 MEMBER','1','36') +('6390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1504.39,'999','1','"6390 MEMBER','1','37') +('3065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1229.98,'999','1','"3065 MEMBER','1','38') +('409','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"409 MEMBER','1','39') +('6830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6830 MEMBER','1','40') +('6780','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',144.69,'999','0','"6780 MEMBER','1','41') +('4176','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4176 MEMBER','1','42') +('7320','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7320 MEMBER','1','43') +('6856','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','0','"6856 MEMBER','1','44') +('6618','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1042.63,'999','0','"6618 MEMBER','1','45') +('305','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"305 MEMBER','1','46') +('1693','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"1693 MEMBER','1','47') +('1611','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1247.58,'999','0','"1611 MEMBER','1','48') +('6614','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',25.64,'999','0','"6614 MEMBER','1','49') +('6462','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',922.06,'999','1','"6462 MEMBER','1','50') +('6755','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.52,'999','1','"6755 MEMBER','1','51') +('9066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9066 MEMBER','1','52') +('4196','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',179.71,'999','0','"4196 MEMBER','1','53') +('1030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1967.59,'999','1','"1030 MEMBER','1','54') +('550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"550 MEMBER','1','55') +('5015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5015 MEMBER','1','56') +('6176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',587.21,'999','0','"6176 MEMBER','1','57') +('2168','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2168 MEMBER','1','58') +('1030','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1967.59,'999','1','"1030 MEMBER','1','59') +('4791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',612.05,'999','0','"4791 MEMBER','1','60') +('9025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9025 MEMBER','1','61') +('6201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1473.83,'999','0','"6201 MEMBER','1','62') +('4060','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',880.72,'999','0','"4060 MEMBER','1','63') +('7003','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"7003 MEMBER','1','64') +('4775','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',257.54,'999','1','"4775 MEMBER','1','65') +('5033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',0.00,'999','0','"5033 MEMBER','1','66') +('9069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9069 MEMBER','1','67') +('6869','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6869 MEMBER','1','68') +('7011','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"7011 MEMBER','1','69') +('7437','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7437 MEMBER','1','70') +('177','4','LASTNAME','FIRSTNAME',999.99,5.76,'0',20.00,'1','0','1','PC','1','0','0',1369.41,'999','0','"177 MEMBER','1','71') +('5064','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5064 MEMBER','1','72') +('4580','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4580 MEMBER','1','73') +('64','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2296.83,'999','0','"64 MEMBER','1','74') +('6325','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',163.36,'999','1','"6325 MEMBER','1','75') +('4342','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4342 MEMBER','1','76') +('4847','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4847 MEMBER','1','77') +('6594','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',145.76,'999','1','"6594 MEMBER','1','78') +('6816','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6816 MEMBER','1','79') +('4828','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.75,'999','1','"4828 MEMBER','1','80') +('6604','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',15.78,'999','0','"6604 MEMBER','1','81') +('9007','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9007 MEMBER','1','82') +('947','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1723.51,'999','0','"947 MEMBER','1','83') +('2552','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1036.08,'999','0','"2552 MEMBER','1','84') +('6206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',541.04,'999','1','"6206 MEMBER','1','85') +('476','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"476 MEMBER','1','86') +('466','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',815.41,'999','1','"466 MEMBER','1','87') +('457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3039.84,'999','0','"457 MEMBER','1','88') +('4409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3.82,'999','1','"4409 MEMBER','1','89') +('6669','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',98.47,'999','1','"6669 MEMBER','1','90') +('2139','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7321.86,'999','0','"2139 MEMBER','1','91') +('58','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',428.21,'999','1','"58 MEMBER','1','92') +('2201','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',204.10,'999','1','"2201 MEMBER','1','93') +('6008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'0','1','1','TERM','0','0','0',3022.74,'999','0','"6008 MEMBER','1','94') +('6832','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6832 MEMBER','1','95') +('6390','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1504.39,'999','1','"6390 MEMBER','1','96') +('4596','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4596 MEMBER','1','97') +('4344','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',977.83,'999','1','"4344 MEMBER','1','98') +('6774','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.31,'999','1','"6774 MEMBER','1','99') +('166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.17,'999','1','"166 MEMBER','1','100') +('4216','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',981.69,'999','1','"4216 MEMBER','1','101') +('2672','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2672 MEMBER','1','102') +('6806','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6806 MEMBER','1','103') +('6791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6791 MEMBER','1','104') +('6260','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2801.51,'999','0','"6260 MEMBER','1','105') +('86','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2735.64,'999','0','"86 MEMBER','1','106') +('6852','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6852 MEMBER','1','107') +('6326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9019.21,'999','1','"6326 MEMBER','1','108') +('4145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',716.24,'999','0','"4145 MEMBER','1','109') +('6839','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6839 MEMBER','1','110') +('4649','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2963.16,'999','0','"4649 MEMBER','1','111') +('29','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',419.45,'999','1','"29 MEMBER','1','112') +('9054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',393.75,'999','0','"9054 MEMBER','1','113') +('6556','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',64.07,'999','1','"6556 MEMBER','1','114') +('5800','1','LASTNAME','FIRSTNAME',999.99,73.50,'0',700.00,'1','1','1','REG','0','0','0',2502.05,'999','0','"5800 MEMBER','1','115') +('5081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5081 MEMBER','1','116') +('4991','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4991 MEMBER','1','117') +('2751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',13.30,'999','1','"2751 MEMBER','1','118') +('5131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',155.32,'999','0','"5131 MEMBER','1','119') +('2459','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2459 MEMBER','1','120') +('444','1','LASTNAME','FIRSTNAME',999.99,5.74,'0',20.00,'1','1','1','PC','1','0','0',3385.63,'999','0','"444 MEMBER','1','121') +('4178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',557.50,'999','0','"4178 MEMBER','1','122') +('4484','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1842.53,'999','1','"4484 MEMBER','1','123') +('6254','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',745.21,'999','0','"6254 MEMBER','1','124') +('6435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',458.81,'999','0','"6435 MEMBER','1','125') +('6193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2265.68,'999','1','"6193 MEMBER','1','126') +('6621','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',237.71,'999','1','"6621 MEMBER','1','127') +('476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"476 MEMBER','1','128') +('9055','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9055 MEMBER','1','129') +('2967','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2797.40,'999','1','"2967 MEMBER','1','130') +('7004','2','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"7004 MEMBER','1','131') +('6900','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6900 MEMBER','1','132') +('6915','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6915 MEMBER','1','133') +('5178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5178 MEMBER','1','134') +('6950','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6950 MEMBER','1','135') +('6969','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6969 MEMBER','1','136') +('6941','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6941 MEMBER','1','137') +('6998','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6998 MEMBER','1','138') +('7022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7022 MEMBER','1','139') +('6972','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6972 MEMBER','1','140') +('5190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5190 MEMBER','1','141') +('4130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4130 MEMBER','1','142') +('4213','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',625.92,'999','0','"4213 MEMBER','1','143') +('5020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5020 MEMBER','1','144') +('357','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',137.05,'999','1','"357 MEMBER','1','145') +('4671','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',836.11,'999','1','"4671 MEMBER','1','146') +('2121','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',882.06,'999','1','"2121 MEMBER','1','147') +('6706','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',413.39,'999','0','"6706 MEMBER','1','148') +('2799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2799 MEMBER','1','149') +('6808','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6808 MEMBER','1','150') +('4372','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1843.23,'999','0','"4372 MEMBER','1','151') +('4658','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7321.57,'999','0','"4658 MEMBER','1','152') +('3293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3293 MEMBER','1','153') +('4220','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',194.90,'999','1','"4220 MEMBER','1','154') +('4910','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1315.76,'999','0','"4910 MEMBER','1','155') +('1594','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5152.12,'999','0','"1594 MEMBER','1','156') +('4305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',517.10,'999','1','"4305 MEMBER','1','157') +('1594','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5152.12,'999','0','"1594 MEMBER','1','158') +('1709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1709 MEMBER','1','159') +('2380','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',244.92,'999','1','"2380 MEMBER','1','160') +('1903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1903 MEMBER','1','161') +('2370','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',719.46,'999','1','"2370 MEMBER','1','162') +('4744','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',245.01,'999','0','"4744 MEMBER','1','163') +('5096','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5096 MEMBER','1','164') +('6414','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1778.34,'999','0','"6414 MEMBER','1','165') +('4649','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2963.16,'999','0','"4649 MEMBER','1','166') +('9080','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',55.00,'999','0','"9080 MEMBER','1','167') +('159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1225.25,'999','1','"159 MEMBER','1','168') +('10413','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10413 MEMBER','1','169') +('4497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',476.52,'999','0','"4497 MEMBER','1','170') +('6547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2559.02,'999','0','"6547 MEMBER','1','171') +('4850','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2045.75,'999','0','"4850 MEMBER','1','172') +('9004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9004 MEMBER','1','173') +('4042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',879.35,'999','0','"4042 MEMBER','1','174') +('1423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1225.53,'999','0','"1423 MEMBER','1','175') +('6142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4612.19,'999','0','"6142 MEMBER','1','176') +('4556','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',979.00,'999','1','"4556 MEMBER','1','177') +('2276','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',542.57,'999','0','"2276 MEMBER','1','178') +('972','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',561.71,'999','1','"972 MEMBER','1','179') +('3192','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3192 MEMBER','1','180') +('6212','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"6212 MEMBER','1','181') +('1316','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',844.09,'999','0','"1316 MEMBER','1','182') +('6645','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',220.02,'999','0','"6645 MEMBER','1','183') +('1','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4186.88,'999','0','"1 MEMBER','1','184') +('4697','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',683.15,'999','1','"4697 MEMBER','1','185') +('6196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',453.10,'999','0','"6196 MEMBER','1','186') +('9049','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9049 MEMBER','1','187') +('2329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',907.58,'999','0','"2329 MEMBER','1','188') +('466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',815.41,'999','1','"466 MEMBER','1','189') +('4061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',557.60,'999','1','"4061 MEMBER','1','190') +('6537','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',256.73,'999','0','"6537 MEMBER','1','191') +('2646','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5089.26,'999','0','"2646 MEMBER','1','192') +('4775','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',257.54,'999','1','"4775 MEMBER','1','193') +('6829','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6829 MEMBER','1','194') +('5700','1','LASTNAME','FIRSTNAME',999.99,2379.05,'0',3500.00,'1','1','1','REG','0','0','0',48802.02,'999','0','"5700 MEMBER','1','195') +('647','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4585.10,'999','0','"647 MEMBER','1','196') +('6841','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6841 MEMBER','1','197') +('2459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2459 MEMBER','1','198') +('6843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6843 MEMBER','1','199') +('6626','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',385.16,'999','0','"6626 MEMBER','1','200') +('2163','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2145.66,'999','0','"2163 MEMBER','1','201') +('6891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6891 MEMBER','1','202') +('2342','2','LASTNAME','FIRSTNAME',999.99,17.71,'0',20.00,'1','0','1','PC','1','0','0',888.76,'999','1','"2342 MEMBER','1','203') +('627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"627 MEMBER','1','204') +('7035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7035 MEMBER','1','205') +('7066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7066 MEMBER','1','206') +('7034','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7034 MEMBER','1','207') +('7048','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7048 MEMBER','1','208') +('7077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7077 MEMBER','1','209') +('7087','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7087 MEMBER','1','210') +('7149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7149 MEMBER','1','211') +('4967','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1212.42,'999','0','"4967 MEMBER','1','212') +('4507','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2266.60,'999','0','"4507 MEMBER','1','213') +('10220','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10220 MEMBER','1','214') +('6621','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',237.71,'999','1','"6621 MEMBER','1','215') +('9968','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9968 MEMBER','1','216') +('398','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"398 MEMBER','1','217') +('6192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',510.74,'999','0','"6192 MEMBER','1','218') +('3276','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',103.29,'999','0','"3276 MEMBER','1','219') +('6857','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6857 MEMBER','1','220') +('33','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1302.33,'999','1','"33 MEMBER','1','221') +('2623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2623 MEMBER','1','222') +('4257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1095.16,'999','0','"4257 MEMBER','1','223') +('4513','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2863.61,'999','0','"4513 MEMBER','1','224') +('392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"392 MEMBER','1','225') +('3248','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',243.49,'999','1','"3248 MEMBER','1','226') +('7144','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7144 MEMBER','1','227') +('4168','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3241.05,'999','0','"4168 MEMBER','1','228') +('5092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5092 MEMBER','1','229') +('6148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',295.71,'999','0','"6148 MEMBER','1','230') +('4757','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',79.44,'999','0','"4757 MEMBER','1','231') +('4986','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3120.36,'999','0','"4986 MEMBER','1','232') +('9067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9067 MEMBER','1','233') +('9035','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9035 MEMBER','1','234') +('279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',281.99,'999','1','"279 MEMBER','1','235') +('64','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2296.83,'999','0','"64 MEMBER','1','236') +('3163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3163 MEMBER','1','237') +('2977','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',512.27,'999','0','"2977 MEMBER','1','238') +('6712','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',512.31,'999','1','"6712 MEMBER','1','239') +('4165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4165 MEMBER','1','240') +('6337','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4480.02,'999','0','"6337 MEMBER','1','241') +('6580','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1087.08,'999','1','"6580 MEMBER','1','242') +('1999','1','LASTNAME','FIRSTNAME',999.99,15.44,'10',20.00,'1','1','1','PC','3','1','0',3006.78,'999','0','"1999 MEMBER','1','243') +('4906','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4462.60,'999','0','"4906 MEMBER','1','244') +('2853','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2853 MEMBER','1','245') +('5107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',2095.28,'999','0','"5107 MEMBER','1','246') +('6189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3530.17,'999','0','"6189 MEMBER','1','247') +('10222','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10222 MEMBER','1','248') +('4866','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',224.91,'999','0','"4866 MEMBER','1','249') +('73','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1966.11,'999','0','"73 MEMBER','1','250') +('6341','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1985.00,'999','0','"6341 MEMBER','1','251') +('7006','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'1','1','1','INACT','0','0','0',NULL,'999','0','"7006 MEMBER','1','252') +('3218','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',209.13,'999','1','"3218 MEMBER','1','253') +('3008','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4670.15,'999','0','"3008 MEMBER','1','254') +('244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"244 MEMBER','1','255') +('1195','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1003.51,'999','0','"1195 MEMBER','1','256') +('4177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',47.29,'999','0','"4177 MEMBER','1','257') +('3116','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1379.93,'999','0','"3116 MEMBER','1','258') +('1417','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1417 MEMBER','1','259') +('1182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1182 MEMBER','1','260') +('4571','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',1160.55,'999','1','"4571 MEMBER','1','261') +('6583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',133.84,'999','0','"6583 MEMBER','1','262') +('992','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"992 MEMBER','1','263') +('6427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',411.84,'999','1','"6427 MEMBER','1','264') +('4505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',176.62,'999','0','"4505 MEMBER','1','265') +('2298','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',470.72,'999','0','"2298 MEMBER','1','266') +('6369','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5021.22,'999','0','"6369 MEMBER','1','267') +('462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"462 MEMBER','1','268') +('2350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2350 MEMBER','1','269') +('43','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.67,'999','1','"43 MEMBER','1','270') +('6818','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6818 MEMBER','1','271') +('4980','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',318.97,'999','1','"4980 MEMBER','1','272') +('6589','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',377.07,'999','0','"6589 MEMBER','1','273') +('4438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4438 MEMBER','1','274') +('7105','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7105 MEMBER','1','275') +('7120','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7120 MEMBER','1','276') +('7110','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7110 MEMBER','1','277') +('7131','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7131 MEMBER','1','278') +('7161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7161 MEMBER','1','279') +('7163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7163 MEMBER','1','280') +('7165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7165 MEMBER','1','281') +('5055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5055 MEMBER','1','282') +('5122','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',2004.80,'999','0','"5122 MEMBER','1','283') +('7004','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"7004 MEMBER','1','284') +('4429','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4392.03,'999','0','"4429 MEMBER','1','285') +('4811','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',304.43,'999','1','"4811 MEMBER','1','286') +('4209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',522.98,'999','0','"4209 MEMBER','1','287') +('4950','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',14.11,'999','0','"4950 MEMBER','1','288') +('10188','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10188 MEMBER','1','289') +('9048','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9048 MEMBER','1','290') +('1404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"1404 MEMBER','1','291') +('6710','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',50.51,'999','1','"6710 MEMBER','1','292') +('2475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2475 MEMBER','1','293') +('6289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',23.88,'999','0','"6289 MEMBER','1','294') +('4708','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2169.83,'999','0','"4708 MEMBER','1','295') +('4702','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2005.39,'999','0','"4702 MEMBER','1','296') +('433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"433 MEMBER','1','297') +('1535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1535 MEMBER','1','298') +('4961','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6452.86,'999','0','"4961 MEMBER','1','299') +('581','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',49.25,'999','1','"581 MEMBER','1','300') +('212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4961.79,'999','0','"212 MEMBER','1','301') +('958','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',238.70,'999','0','"958 MEMBER','1','302') +('7002','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',NULL,'999','0','"7002 MEMBER','1','303') +('6818','2','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6818 MEMBER','1','304') +('6597','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1704.77,'999','0','"6597 MEMBER','1','305') +('3258','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1567.98,'999','0','"3258 MEMBER','1','306') +('4041','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',385.68,'999','1','"4041 MEMBER','1','307') +('9692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9692 MEMBER','1','308') +('117','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3308.11,'999','0','"117 MEMBER','1','309') +('251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1380.80,'999','0','"251 MEMBER','1','310') +('6109','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1286.49,'999','0','"6109 MEMBER','1','311') +('532','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2922.98,'999','1','"532 MEMBER','1','312') +('4793','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',295.77,'999','0','"4793 MEMBER','1','313') +('6297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',315.20,'999','1','"6297 MEMBER','1','314') +('3350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',110.36,'999','1','"3350 MEMBER','1','315') +('10300','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10300 MEMBER','1','316') +('4448','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',232.47,'999','1','"4448 MEMBER','1','317') +('1200','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',498.37,'999','1','"1200 MEMBER','1','318') +('9087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9087 MEMBER','1','319') +('5031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5031 MEMBER','1','320') +('2239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2239 MEMBER','1','321') +('2448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','1','0',753.77,'999','1','"2448 MEMBER','1','322') +('6254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',745.21,'999','0','"6254 MEMBER','1','323') +('2608','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2608 MEMBER','1','324') +('2761','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2761 MEMBER','1','325') +('6165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4632.34,'999','0','"6165 MEMBER','1','326') +('289','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2926.92,'999','0','"289 MEMBER','1','327') +('6388','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',785.33,'999','1','"6388 MEMBER','1','328') +('4258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2786.70,'999','0','"4258 MEMBER','1','329') +('3114','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1530.89,'999','1','"3114 MEMBER','1','330') +('6863','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6863 MEMBER','1','331') +('4411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4411 MEMBER','1','332') +('9057','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9057 MEMBER','1','333') +('5014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5014 MEMBER','1','334') +('4588','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2804.03,'999','0','"4588 MEMBER','1','335') +('5104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1276.52,'999','0','"5104 MEMBER','1','336') +('484','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5359.41,'999','0','"484 MEMBER','1','337') +('2672','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2672 MEMBER','1','338') +('6247','1','LASTNAME','FIRSTNAME',999.99,4.78,'10',20.00,'1','1','1','PC','3','1','0',1086.72,'999','0','"6247 MEMBER','1','339') +('402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3111.05,'999','1','"402 MEMBER','1','340') +('5086','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5086 MEMBER','1','341') +('4969','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2842.52,'999','0','"4969 MEMBER','1','342') +('7116','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7116 MEMBER','1','343') +('7158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7158 MEMBER','1','344') +('7166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7166 MEMBER','1','345') +('7167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7167 MEMBER','1','346') +('7172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7172 MEMBER','1','347') +('7177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7177 MEMBER','1','348') +('7185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7185 MEMBER','1','349') +('7189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7189 MEMBER','1','350') +('7152','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7152 MEMBER','1','351') +('6171','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2503.34,'999','0','"6171 MEMBER','1','352') +('9044','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',67.50,'999','0','"9044 MEMBER','1','353') +('2050','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2050 MEMBER','1','354') +('7008','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',NULL,'999','1','"7008 MEMBER','1','355') +('2668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',429.74,'999','1','"2668 MEMBER','1','356') +('6737','1','LASTNAME','FIRSTNAME',999.99,18.70,'0',20.00,'1','1','1','PC','1','0','0',89.28,'999','0','"6737 MEMBER','1','357') +('1365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1539.80,'999','0','"1365 MEMBER','1','358') +('539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4545.56,'999','0','"539 MEMBER','1','359') +('6323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',438.11,'999','0','"6323 MEMBER','1','360') +('9060','2','LASTNAME','FIRSTNAME',999.99,130.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9060 MEMBER','1','361') +('4317','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4012.19,'999','0','"4317 MEMBER','1','362') +('2131','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2131 MEMBER','1','363') +('6831','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6831 MEMBER','1','364') +('6861','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6861 MEMBER','1','365') +('4904','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',1532.68,'999','0','"4904 MEMBER','1','366') +('4379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2687.99,'999','0','"4379 MEMBER','1','367') +('4586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1571.12,'999','0','"4586 MEMBER','1','368') +('1689','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1689 MEMBER','1','369') +('173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',167.49,'999','1','"173 MEMBER','1','370') +('2129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',164.31,'999','0','"2129 MEMBER','1','371') +('6824','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6824 MEMBER','1','372') +('9001','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"9001 MEMBER','1','373') +('4595','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',345.48,'999','0','"4595 MEMBER','1','374') +('2210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',127.09,'999','1','"2210 MEMBER','1','375') +('6338','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',145.02,'999','1','"6338 MEMBER','1','376') +('2606','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2606 MEMBER','1','377') +('4715','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5227.10,'999','1','"4715 MEMBER','1','378') +('9029','2','LASTNAME','FIRSTNAME',999.99,56.25,'0',0.00,'1','0','1','TERM','0','0','0',225.00,'999','0','"9029 MEMBER','1','379') +('5085','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5085 MEMBER','1','380') +('3120','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4126.34,'999','0','"3120 MEMBER','1','381') +('3265','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',368.07,'999','1','"3265 MEMBER','1','382') +('4686','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',190.25,'999','0','"4686 MEMBER','1','383') +('1728','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',117.79,'999','1','"1728 MEMBER','1','384') +('6400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',278.63,'999','0','"6400 MEMBER','1','385') +('4113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4113 MEMBER','1','386') +('6492','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1724.38,'999','0','"6492 MEMBER','1','387') +('6215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6215 MEMBER','1','388') +('4238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4238 MEMBER','1','389') +('164','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',686.35,'999','0','"164 MEMBER','1','390') +('4189','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4189 MEMBER','1','391') +('6809','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6809 MEMBER','1','392') +('6855','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6855 MEMBER','1','393') +('286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"286 MEMBER','1','394') +('4868','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2692.16,'999','0','"4868 MEMBER','1','395') +('6810','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6810 MEMBER','1','396') +('4126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4126 MEMBER','1','397') +('6846','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','0','"6846 MEMBER','1','398') +('265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"265 MEMBER','1','399') +('4323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.01,'999','1','"4323 MEMBER','1','400') +('6341','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1985.00,'999','0','"6341 MEMBER','1','401') +('1740','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"1740 MEMBER','1','402') +('7000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',NULL,'999','0','"7000 MEMBER','1','403') +('6835','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6835 MEMBER','1','404') +('4118','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8027.10,'999','0','"4118 MEMBER','1','405') +('6857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6857 MEMBER','1','406') +('6871','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6871 MEMBER','1','407') +('6886','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6886 MEMBER','1','408') +('6900','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6900 MEMBER','1','409') +('6928','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6928 MEMBER','1','410') +('2807','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1027.20,'999','0','"2807 MEMBER','1','411') +('4866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',224.91,'999','0','"4866 MEMBER','1','412') +('4741','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4741 MEMBER','1','413') +('7125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7125 MEMBER','1','414') +('7131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7131 MEMBER','1','415') +('7137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7137 MEMBER','1','416') +('7148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7148 MEMBER','1','417') +('7150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7150 MEMBER','1','418') +('7106','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7106 MEMBER','1','419') +('5178','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',NULL,'999','0','"5178 MEMBER','1','420') +('7124','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7124 MEMBER','1','421') +('2567','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',14.93,'999','0','"2567 MEMBER','1','422') +('7140','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7140 MEMBER','1','423') +('4362','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',622.27,'999','1','"4362 MEMBER','1','424') +('6805','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6805 MEMBER','1','425') +('2417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',147.89,'999','1','"2417 MEMBER','1','426') +('6447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2053.08,'999','0','"6447 MEMBER','1','427') +('10158','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10158 MEMBER','1','428') +('1230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1592.57,'999','1','"1230 MEMBER','1','429') +('647','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4585.10,'999','0','"647 MEMBER','1','430') +('6755','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.52,'999','1','"6755 MEMBER','1','431') +('4685','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',37.44,'999','0','"4685 MEMBER','1','432') +('6502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',168.69,'999','0','"6502 MEMBER','1','433') +('6194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2159.14,'999','1','"6194 MEMBER','1','434') +('6859','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6859 MEMBER','1','435') +('10372','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10372 MEMBER','1','436') +('4348','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',97.14,'999','1','"4348 MEMBER','1','437') +('4502','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.20,'999','1','"4502 MEMBER','1','438') +('9058','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9058 MEMBER','1','439') +('6630','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',472.73,'999','0','"6630 MEMBER','1','440') +('4033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',577.72,'999','1','"4033 MEMBER','1','441') +('6821','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6821 MEMBER','1','442') +('6407','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',674.32,'999','0','"6407 MEMBER','1','443') +('2880','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1004.25,'999','0','"2880 MEMBER','1','444') +('3223','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',129.92,'999','0','"3223 MEMBER','1','445') +('6708','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',92.83,'999','0','"6708 MEMBER','1','446') +('1206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1206 MEMBER','1','447') +('6285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',129.05,'999','1','"6285 MEMBER','1','448') +('9834','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9834 MEMBER','1','449') +('10437','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10437 MEMBER','1','450') +('4859','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',817.17,'999','1','"4859 MEMBER','1','451') +('1928','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1928 MEMBER','1','452') +('6827','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6827 MEMBER','1','453') +('6860','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6860 MEMBER','1','454') +('1471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',210.31,'999','0','"1471 MEMBER','1','455') +('4772','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4772 MEMBER','1','456') +('6509','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1129.76,'999','0','"6509 MEMBER','1','457') +('1200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',498.37,'999','1','"1200 MEMBER','1','458') +('9076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',250.00,'1','1','1','TERM','0','0','0',63.75,'999','0','"9076 MEMBER','1','459') +('340','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2226.71,'999','0','"340 MEMBER','1','460') +('4354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3015.95,'999','0','"4354 MEMBER','1','461') +('6020','1','LASTNAME','FIRSTNAME',999.99,21.71,'0',200.00,'1','1','1','PC','2','0','0',1429.82,'999','0','"6020 MEMBER','1','462') +('402','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3111.05,'999','1','"402 MEMBER','1','463') +('6315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',124.24,'999','0','"6315 MEMBER','1','464') +('2137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',818.10,'999','0','"2137 MEMBER','1','465') +('6822','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6822 MEMBER','1','466') +('4089','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2287.33,'999','0','"4089 MEMBER','1','467') +('6507','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',107.73,'999','1','"6507 MEMBER','1','468') +('1801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1801 MEMBER','1','469') +('4686','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',190.25,'999','0','"4686 MEMBER','1','470') +('6413','1','LASTNAME','FIRSTNAME',999.99,3.17,'0',20.00,'1','1','1','PC','1','0','0',1093.46,'999','0','"6413 MEMBER','1','471') +('7007','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"7007 MEMBER','1','472') +('9081','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',33.75,'999','0','"9081 MEMBER','1','473') +('2380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',244.92,'999','1','"2380 MEMBER','1','474') +('4213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',625.92,'999','0','"4213 MEMBER','1','475') +('4503','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',194.41,'999','1','"4503 MEMBER','1','476') +('177','1','LASTNAME','FIRSTNAME',999.99,5.76,'0',20.00,'1','1','1','PC','1','0','0',1369.41,'999','0','"177 MEMBER','1','477') +('5104','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',1276.52,'999','0','"5104 MEMBER','1','478') +('5127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5127 MEMBER','1','479') +('117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3308.11,'999','0','"117 MEMBER','1','480') +('5005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5005 MEMBER','1','481') +('5007','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5007 MEMBER','1','482') +('9091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9091 MEMBER','1','483') +('7117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7117 MEMBER','1','484') +('7143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"7143 MEMBER','1','485') +('7147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7147 MEMBER','1','486') +('7107','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7107 MEMBER','1','487') +('7117','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7117 MEMBER','1','488') +('7122','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7122 MEMBER','1','489') +('4341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3075.18,'999','0','"4341 MEMBER','1','490') +('7134','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7134 MEMBER','1','491') +('7157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7157 MEMBER','1','492') +('6823','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6823 MEMBER','1','493') +('5150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1033.02,'999','0','"5150 MEMBER','1','494') +('6561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',245.91,'999','1','"6561 MEMBER','1','495') +('170','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"170 MEMBER','1','496') +('4827','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4827 MEMBER','1','497') +('2010','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2010 MEMBER','1','498') +('945','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',947.22,'999','0','"945 MEMBER','1','499') +('407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4193.19,'999','0','"407 MEMBER','1','500') +('111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',587.60,'999','1','"111 MEMBER','1','501') +('4414','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2459.51,'999','1','"4414 MEMBER','1','502') +('1027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1027 MEMBER','1','503') +('9073','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',48.75,'999','0','"9073 MEMBER','1','504') +('6855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6855 MEMBER','1','505') +('4516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',205.58,'999','0','"4516 MEMBER','1','506') +('6682','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',56.53,'999','1','"6682 MEMBER','1','507') +('4567','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',28.95,'999','0','"4567 MEMBER','1','508') +('4215','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',482.93,'999','0','"4215 MEMBER','1','509') +('58','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',428.21,'999','1','"58 MEMBER','1','510') +('2563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1679.84,'999','0','"2563 MEMBER','1','511') +('6813','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','0','"6813 MEMBER','1','512') +('1312','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4601.11,'999','0','"1312 MEMBER','1','513') +('4474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1453.75,'999','1','"4474 MEMBER','1','514') +('6796','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.62,'999','0','"6796 MEMBER','1','515') +('2470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.93,'999','1','"2470 MEMBER','1','516') +('6194','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2159.14,'999','1','"6194 MEMBER','1','517') +('98','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',141.25,'999','0','"98 MEMBER','1','518') +('6469','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1137.21,'999','0','"6469 MEMBER','1','519') +('111','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',587.60,'999','1','"111 MEMBER','1','520') +('887','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"887 MEMBER','1','521') +('2346','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',188.68,'999','1','"2346 MEMBER','1','522') +('6813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6813 MEMBER','1','523') +('1358','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1652.84,'999','0','"1358 MEMBER','1','524') +('6843','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',NULL,'999','0','"6843 MEMBER','1','525') +('4571','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',1160.55,'999','1','"4571 MEMBER','1','526') +('4816','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',582.29,'999','0','"4816 MEMBER','1','527') +('568','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"568 MEMBER','1','528') +('770','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',529.59,'999','0','"770 MEMBER','1','529') +('4342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4342 MEMBER','1','530') +('9074','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',123.75,'999','0','"9074 MEMBER','1','531') +('197','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"197 MEMBER','1','532') +('6167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',413.70,'999','0','"6167 MEMBER','1','533') +('6666','1','LASTNAME','FIRSTNAME',999.99,17.48,'0',20.00,'1','1','1','PC','1','0','0',222.09,'999','1','"6666 MEMBER','1','534') +('4901','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',313.33,'999','0','"4901 MEMBER','1','535') +('9054','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',393.75,'999','0','"9054 MEMBER','1','536') +('2916','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2916 MEMBER','1','537') +('179','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2950.04,'999','0','"179 MEMBER','1','538') +('33','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1302.33,'999','1','"33 MEMBER','1','539') +('4895','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',245.29,'999','0','"4895 MEMBER','1','540') +('6817','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',NULL,'999','0','"6817 MEMBER','1','541') +('4268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',727.01,'999','0','"4268 MEMBER','1','542') +('6853','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6853 MEMBER','1','543') +('6888','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6888 MEMBER','1','544') +('6897','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6897 MEMBER','1','545') +('6920','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6920 MEMBER','1','546') +('6931','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6931 MEMBER','1','547') +('6916','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6916 MEMBER','1','548') +('6922','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6922 MEMBER','1','549') +('4152','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',302.37,'999','1','"4152 MEMBER','1','550') +('453','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.25,'999','1','"453 MEMBER','1','551') +('6811','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6811 MEMBER','1','552') +('6509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1129.76,'999','0','"6509 MEMBER','1','553') +('9028','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9028 MEMBER','1','554') +('9013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9013 MEMBER','1','555') +('7114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7114 MEMBER','1','556') +('7119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7119 MEMBER','1','557') +('7121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7121 MEMBER','1','558') +('7122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7122 MEMBER','1','559') +('7130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7130 MEMBER','1','560') +('7133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7133 MEMBER','1','561') +('7142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7142 MEMBER','1','562') +('7114','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7114 MEMBER','1','563') +('7125','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7125 MEMBER','1','564') +('8486','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8486 MEMBER','1','15242') +('4912','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',394.24,'999','1','"4912 MEMBER','1','15262') +('10519','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10519 MEMBER','1','15243') +('540','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1453.04,'999','0','"540 MEMBER','1','15244') +('540','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1453.04,'999','0','"540 MEMBER','1','15245') +('540','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1453.04,'999','0','"540 MEMBER','1','15246') +('10520','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10520 MEMBER','1','15247') +('10198','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10198 MEMBER','1','15248') +('10521','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10521 MEMBER','1','15249') +('10521','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10521 MEMBER','1','15250') +('10521','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10521 MEMBER','1','15251') +('10522','2','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','0','1','PC','3','1','0',0.00,'999','1','"10522 MEMBER','1','15252') +('7782','2','LASTNAME','FIRSTNAME',999.99,0.73,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7782 MEMBER','1','15254') +('10523','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10523 MEMBER','1','15255') +('10345','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10345 MEMBER','1','15256') +('419','2','LASTNAME','FIRSTNAME',999.99,7.97,'0',20.00,'1','1','1','PC','1','0','0',3321.32,'999','1','"419 MEMBER','1','15257') +('419','3','LASTNAME','FIRSTNAME',999.99,7.97,'0',20.00,'1','1','1','PC','1','0','0',3321.32,'999','1','"419 MEMBER','1','15258') +('419','4','LASTNAME','FIRSTNAME',999.99,7.97,'0',20.00,'1','1','1','PC','1','0','0',3321.32,'999','1','"419 MEMBER','1','15259') +('10524','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10524 MEMBER','1','15260') +('10525','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10525 MEMBER','1','15261') +('561','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"561 MEMBER','1','15263') +('6832','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6832 MEMBER','1','15264') +('2550','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3351.96,'999','1','"2550 MEMBER','1','15265') +('9996','2','LASTNAME','FIRSTNAME',999.99,6.79,'10',25.00,'1','0','1','PC','3','1','0',0.00,'999','1','"9996 MEMBER','1','15277') +('6197','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',743.40,'999','0','"6197 MEMBER','1','15267') +('6197','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',743.40,'999','0','"6197 MEMBER','1','15268') +('9684','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9684 MEMBER','1','15272') +('9684','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9684 MEMBER','1','15273') +('9684','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9684 MEMBER','1','15274') +('9996','3','LASTNAME','FIRSTNAME',999.99,6.79,'10',25.00,'1','0','1','PC','3','1','0',0.00,'999','1','"9996 MEMBER','1','15278') +('10531','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10531 MEMBER','1','15279') +('9235','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9235 MEMBER','1','15280') +('8210','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8210 MEMBER','1','15281') +('8210','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8210 MEMBER','1','15282') +('8210','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8210 MEMBER','1','15283') +('9510','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9510 MEMBER','1','15284') +('10533','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10533 MEMBER','1','15285') +('7739','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7739 MEMBER','1','15286') +('7739','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7739 MEMBER','1','15288') +('8109','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8109 MEMBER','1','15289') +('10505','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10505 MEMBER','1','15290') +('10505','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10505 MEMBER','1','15291') +('6734','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',475.40,'999','0','"6734 MEMBER','1','15292') +('5410','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5410 MEMBER','1','15294') +('5411','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5411 MEMBER','1','15295') +('10538','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10538 MEMBER','1','15297') +('10000','3','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','PC','3','1','0',0.00,'999','1','"10000 MEMBER','1','15318') +('7102','3','LASTNAME','FIRSTNAME',999.99,23.23,'10',80.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7102 MEMBER','1','15309') +('7102','4','LASTNAME','FIRSTNAME',999.99,23.23,'10',80.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7102 MEMBER','1','15310') +('10540','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10540 MEMBER','1','15319') +('10540','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10540 MEMBER','1','15320') +('6703','3','LASTNAME','FIRSTNAME',999.99,43.37,'10',80.00,'1','1','1','PC','3','1','0',591.96,'999','0','"6703 MEMBER','1','15322') +('6703','4','LASTNAME','FIRSTNAME',999.99,43.37,'10',80.00,'1','1','1','PC','3','1','0',591.96,'999','0','"6703 MEMBER','1','15323') +('6093','2','LASTNAME','FIRSTNAME',NULL,75.00,'0',20.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'1','"6093 MEMBER','1','15324') +('6092','2','LASTNAME','FIRSTNAME',NULL,75.00,'0',20.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'1','"6092 MEMBER','1','15325') +('6094','2','LASTNAME','FIRSTNAME',NULL,150.00,'0',20.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'1','"6094 MEMBER','1','15326') +('6095','2','LASTNAME','FIRSTNAME',NULL,110.00,'0',20.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'1','"6095 MEMBER','1','15327') +('6096','2','LASTNAME','FIRSTNAME',NULL,110.00,'0',20.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'1','"6096 MEMBER','1','15328') +('10541','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10541 MEMBER','1','15329') +('10542','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10542 MEMBER','1','15330') +('10542','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10542 MEMBER','1','15331') +('10542','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10542 MEMBER','1','15332') +('10543','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10543 MEMBER','1','15333') +('10168','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10168 MEMBER','1','15334') +('10544','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10544 MEMBER','1','15335') +('10545','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10545 MEMBER','1','15336') +('10545','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10545 MEMBER','1','15337') +('10545','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10545 MEMBER','1','15338') +('6183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',20.24,'999','0','"6183 MEMBER','1','565') +('6005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',100.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6005 MEMBER','1','566') +('6006','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6006 MEMBER','1','567') +('9022','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"9022 MEMBER','1','568') +('4950','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',14.11,'999','0','"4950 MEMBER','1','569') +('6181','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5227.25,'999','0','"6181 MEMBER','1','570') +('5102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',4134.17,'999','0','"5102 MEMBER','1','571') +('2440','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',150.11,'999','0','"2440 MEMBER','1','572') +('1328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',85.83,'999','1','"1328 MEMBER','1','573') +('6451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',736.58,'999','1','"6451 MEMBER','1','574') +('2377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',473.00,'999','1','"2377 MEMBER','1','575') +('38','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1490.60,'999','0','"38 MEMBER','1','576') +('6659','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',242.06,'999','0','"6659 MEMBER','1','577') +('6529','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',737.78,'999','0','"6529 MEMBER','1','578') +('6785','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.23,'999','1','"6785 MEMBER','1','579') +('4455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2339.38,'999','0','"4455 MEMBER','1','580') +('6637','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',505.52,'999','1','"6637 MEMBER','1','581') +('4304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',59.76,'999','1','"4304 MEMBER','1','582') +('4904','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1532.68,'999','0','"4904 MEMBER','1','583') +('33','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1302.33,'999','1','"33 MEMBER','1','584') +('6298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',524.26,'999','0','"6298 MEMBER','1','585') +('4155','1','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','1','1','PC','1','0','0',2379.57,'999','0','"4155 MEMBER','1','586') +('627','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"627 MEMBER','1','587') +('2602','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"2602 MEMBER','1','588') +('256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',844.93,'999','0','"256 MEMBER','1','589') +('4612','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2926.47,'999','1','"4612 MEMBER','1','590') +('3239','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',202.18,'999','1','"3239 MEMBER','1','591') +('3114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1530.89,'999','1','"3114 MEMBER','1','592') +('4956','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',40.35,'999','0','"4956 MEMBER','1','593') +('4566','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1406.98,'999','0','"4566 MEMBER','1','594') +('424','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',625.03,'999','1','"424 MEMBER','1','595') +('5023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',260.30,'999','0','"5023 MEMBER','1','596') +('3370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1000.14,'999','0','"3370 MEMBER','1','597') +('4655','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',132.56,'999','0','"4655 MEMBER','1','598') +('4980','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',318.97,'999','1','"4980 MEMBER','1','599') +('4944','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5466.21,'999','0','"4944 MEMBER','1','600') +('4860','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1578.71,'999','0','"4860 MEMBER','1','601') +('2168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2168 MEMBER','1','602') +('2342','1','LASTNAME','FIRSTNAME',999.99,17.71,'0',20.00,'1','1','1','PC','1','0','0',888.76,'999','1','"2342 MEMBER','1','603') +('2470','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',51.93,'999','1','"2470 MEMBER','1','604') +('6807','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6807 MEMBER','1','605') +('4371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',725.87,'999','0','"4371 MEMBER','1','606') +('9050','1','LASTNAME','FIRSTNAME',999.99,84.37,'0',0.00,'1','1','1','TERM','0','0','0',236.25,'999','0','"9050 MEMBER','1','607') +('519','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',428.94,'999','1','"519 MEMBER','1','608') +('6861','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6861 MEMBER','1','609') +('107','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6050.68,'999','0','"107 MEMBER','1','610') +('6134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',347.65,'999','1','"6134 MEMBER','1','611') +('6470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',901.86,'999','0','"6470 MEMBER','1','612') +('6849','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6849 MEMBER','1','613') +('6684','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',27.62,'999','0','"6684 MEMBER','1','614') +('4513','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2863.61,'999','0','"4513 MEMBER','1','615') +('5127','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5127 MEMBER','1','616') +('382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"382 MEMBER','1','617') +('231','2','LASTNAME','FIRSTNAME',999.99,39.82,'10',50.00,'1','0','1','PC','3','1','0',113.16,'999','0','"231 MEMBER','1','618') +('4628','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4628 MEMBER','1','619') +('68','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3755.61,'999','0','"68 MEMBER','1','620') +('1346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1346 MEMBER','1','621') +('9065','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',296.25,'999','0','"9065 MEMBER','1','622') +('6844','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6844 MEMBER','1','623') +('4967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1212.42,'999','0','"4967 MEMBER','1','624') +('2253','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',15.72,'999','1','"2253 MEMBER','1','625') +('6706','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',413.39,'999','0','"6706 MEMBER','1','626') +('4455','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2339.38,'999','0','"4455 MEMBER','1','627') +('7094','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7094 MEMBER','1','628') +('7095','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7095 MEMBER','1','629') +('7115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7115 MEMBER','1','630') +('7118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7118 MEMBER','1','631') +('7120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7120 MEMBER','1','632') +('7127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7127 MEMBER','1','633') +('7128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7128 MEMBER','1','634') +('4421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1137.61,'999','0','"4421 MEMBER','1','635') +('6812','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6812 MEMBER','1','636') +('75','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8901.37,'999','0','"75 MEMBER','1','637') +('6241','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',221.76,'999','0','"6241 MEMBER','1','638') +('6375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',912.53,'999','1','"6375 MEMBER','1','639') +('4412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',713.41,'999','1','"4412 MEMBER','1','640') +('6420','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2015.21,'999','0','"6420 MEMBER','1','641') +('1093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1093 MEMBER','1','643') +('9052','2','LASTNAME','FIRSTNAME',999.99,45.00,'0',0.00,'1','0','1','TERM','0','0','0',45.00,'999','0','"9052 MEMBER','1','644') +('4762','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',737.43,'999','0','"4762 MEMBER','1','645') +('9041','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9041 MEMBER','1','646') +('3079','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1057.93,'999','0','"3079 MEMBER','1','647') +('4517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4145.42,'999','0','"4517 MEMBER','1','648') +('6609','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',150.41,'999','1','"6609 MEMBER','1','649') +('4192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4192 MEMBER','1','650') +('6111','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',406.20,'999','1','"6111 MEMBER','1','651') +('5011','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5011 MEMBER','1','652') +('374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"374 MEMBER','1','653') +('6182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2669.05,'999','0','"6182 MEMBER','1','654') +('581','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',49.25,'999','1','"581 MEMBER','1','655') +('4373','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1909.21,'999','0','"4373 MEMBER','1','656') +('6155','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5545.22,'999','0','"6155 MEMBER','1','657') +('6001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6001 MEMBER','1','658') +('4710','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4710 MEMBER','1','659') +('4779','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2155.79,'999','0','"4779 MEMBER','1','660') +('2988','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2988 MEMBER','1','661') +('4127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',153.40,'999','0','"4127 MEMBER','1','662') +('469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',90.83,'999','0','"469 MEMBER','1','663') +('4433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8122.49,'999','0','"4433 MEMBER','1','664') +('2696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2696 MEMBER','1','665') +('4314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4314 MEMBER','1','666') +('9063','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',112.50,'999','0','"9063 MEMBER','1','667') +('165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"165 MEMBER','1','668') +('9077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',135.00,'999','0','"9077 MEMBER','1','669') +('5161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',285.85,'999','0','"5161 MEMBER','1','670') +('398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"398 MEMBER','1','671') +('4281','2','LASTNAME','FIRSTNAME',999.99,11.64,'0',20.00,'1','1','1','PC','1','0','0',12448.27,'999','0','"4281 MEMBER','1','672') +('6860','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6860 MEMBER','1','673') +('148','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2107.15,'999','0','"148 MEMBER','1','674') +('6862','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6862 MEMBER','1','675') +('4019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4019 MEMBER','1','676') +('291','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"291 MEMBER','1','677') +('4448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',232.47,'999','1','"4448 MEMBER','1','678') +('4054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5062.35,'999','0','"4054 MEMBER','1','679') +('318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"318 MEMBER','1','680') +('6297','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',315.20,'999','1','"6297 MEMBER','1','681') +('426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',556.22,'999','1','"426 MEMBER','1','682') +('537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"537 MEMBER','1','683') +('6226','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3808.21,'999','1','"6226 MEMBER','1','684') +('4516','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',205.58,'999','0','"4516 MEMBER','1','685') +('6867','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6867 MEMBER','1','686') +('6878','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6878 MEMBER','1','687') +('6901','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6901 MEMBER','1','688') +('6913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6913 MEMBER','1','689') +('6918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6918 MEMBER','1','690') +('9060','1','LASTNAME','FIRSTNAME',999.99,130.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9060 MEMBER','1','691') +('7001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"7001 MEMBER','1','692') +('210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',102.46,'999','1','"210 MEMBER','1','693') +('6284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',66.21,'999','1','"6284 MEMBER','1','694') +('7092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7092 MEMBER','1','695') +('7134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7134 MEMBER','1','696') +('7103','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7103 MEMBER','1','697') +('7103','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7103 MEMBER','1','698') +('7129','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7129 MEMBER','1','699') +('7130','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7130 MEMBER','1','700') +('7153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7153 MEMBER','1','701') +('7154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7154 MEMBER','1','702') +('7156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7156 MEMBER','1','703') +('7160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7160 MEMBER','1','704') +('6343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1552.13,'999','0','"6343 MEMBER','1','705') +('4325','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',92.25,'999','0','"4325 MEMBER','1','706') +('4948','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',32.93,'999','1','"4948 MEMBER','1','707') +('4344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',977.83,'999','1','"4344 MEMBER','1','708') +('458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2085.45,'999','1','"458 MEMBER','1','709') +('4287','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.13,'999','1','"4287 MEMBER','1','710') +('4157','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',597.29,'999','1','"4157 MEMBER','1','711') +('2094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2094.95,'999','0','"2094 MEMBER','1','712') +('6273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.48,'999','0','"6273 MEMBER','1','713') +('2780','1','LASTNAME','FIRSTNAME',999.99,19.99,'0',20.00,'1','1','1','PC','1','0','0',688.50,'999','1','"2780 MEMBER','1','714') +('6458','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1499.81,'999','0','"6458 MEMBER','1','715') +('6586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',787.99,'999','0','"6586 MEMBER','1','716') +('1236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',84.39,'999','0','"1236 MEMBER','1','717') +('2664','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"2664 MEMBER','1','718') +('1836','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1836 MEMBER','1','719') +('152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"152 MEMBER','1','720') +('4351','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4351 MEMBER','1','721') +('186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',18.50,'999','1','"186 MEMBER','1','722') +('2975','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2975 MEMBER','1','723') +('4725','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.90,'999','1','"4725 MEMBER','1','724') +('6837','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6837 MEMBER','1','725') +('2163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2145.66,'999','0','"2163 MEMBER','1','726') +('6288','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',350.47,'999','0','"6288 MEMBER','1','727') +('937','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"937 MEMBER','1','728') +('4470','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4470 MEMBER','1','729') +('9057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9057 MEMBER','1','730') +('453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.25,'999','1','"453 MEMBER','1','731') +('1213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4522.61,'999','0','"1213 MEMBER','1','732') +('6472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',817.75,'999','1','"6472 MEMBER','1','733') +('2018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1313.51,'999','1','"2018 MEMBER','1','734') +('376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',654.23,'999','0','"376 MEMBER','1','735') +('462','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"462 MEMBER','1','736') +('2364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.28,'999','0','"2364 MEMBER','1','737') +('6848','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6848 MEMBER','1','738') +('136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"136 MEMBER','1','739') +('3120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4126.34,'999','0','"3120 MEMBER','1','740') +('9075','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9075 MEMBER','1','741') +('4946','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',205.95,'999','0','"4946 MEMBER','1','742') +('1264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1264 MEMBER','1','743') +('6856','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6856 MEMBER','1','744') +('6828','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6828 MEMBER','1','745') +('2008','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2008 MEMBER','1','746') +('4274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',260.42,'999','1','"4274 MEMBER','1','747') +('6185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',356.59,'999','1','"6185 MEMBER','1','748') +('4488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',212.04,'999','1','"4488 MEMBER','1','749') +('4673','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1367.22,'999','0','"4673 MEMBER','1','750') +('1276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',53.45,'999','0','"1276 MEMBER','1','751') +('4615','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2595.08,'999','0','"4615 MEMBER','1','752') +('188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',695.16,'999','1','"188 MEMBER','1','753') +('589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1679.73,'999','0','"589 MEMBER','1','754') +('2845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5.70,'999','1','"2845 MEMBER','1','755') +('6850','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6850 MEMBER','1','756') +('9059','2','LASTNAME','FIRSTNAME',999.99,84.37,'0',0.00,'1','0','1','TERM','0','0','0',401.25,'999','0','"9059 MEMBER','1','757') +('3368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3368 MEMBER','1','758') +('4427','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',861.98,'999','0','"4427 MEMBER','1','759') +('5133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',1600.92,'999','0','"5133 MEMBER','1','760') +('4168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3241.05,'999','0','"4168 MEMBER','1','761') +('6814','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6814 MEMBER','1','762') +('6908','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6908 MEMBER','1','763') +('5026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',0.00,'999','0','"5026 MEMBER','1','764') +('4036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',476.91,'999','1','"4036 MEMBER','1','765') +('1052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1052 MEMBER','1','766') +('4982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',167.20,'999','1','"4982 MEMBER','1','767') +('6266','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',54.21,'999','1','"6266 MEMBER','1','768') +('6882','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6882 MEMBER','1','769') +('6911','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6911 MEMBER','1','770') +('7083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7083 MEMBER','1','771') +('7084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7084 MEMBER','1','772') +('7100','1','LASTNAME','FIRSTNAME',999.99,11.97,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7100 MEMBER','1','773') +('2567','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',14.93,'999','0','"2567 MEMBER','1','774') +('6706','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',413.39,'999','0','"6706 MEMBER','1','775') +('6680','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',722.60,'999','0','"6680 MEMBER','1','776') +('6820','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6820 MEMBER','1','777') +('3246','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',309.17,'999','1','"3246 MEMBER','1','778') +('49','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',176.21,'999','1','"49 MEMBER','1','779') +('5122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',2004.80,'999','0','"5122 MEMBER','1','780') +('158','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"158 MEMBER','1','781') +('219','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"219 MEMBER','1','782') +('1760','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',434.26,'999','0','"1760 MEMBER','1','783') +('9034','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9034 MEMBER','1','784') +('9053','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9053 MEMBER','1','785') +('133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"133 MEMBER','1','786') +('82','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"82 MEMBER','1','787') +('6749','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',34.05,'999','0','"6749 MEMBER','1','788') +('4208','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3594.87,'999','0','"4208 MEMBER','1','789') +('4373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1909.21,'999','0','"4373 MEMBER','1','790') +('4390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',93.14,'999','1','"4390 MEMBER','1','791') +('150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1082.50,'999','1','"150 MEMBER','1','792') +('5373','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5373 MEMBER','1','793') +('4006','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1001.00,'999','0','"4006 MEMBER','1','794') +('4414','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2459.51,'999','1','"4414 MEMBER','1','795') +('6863','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6863 MEMBER','1','796') +('209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',896.28,'999','1','"209 MEMBER','1','797') +('2960','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2960 MEMBER','1','798') +('4916','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3156.90,'999','0','"4916 MEMBER','1','799') +('957','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.90,'999','0','"957 MEMBER','1','800') +('6305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',645.29,'999','1','"6305 MEMBER','1','801') +('131','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2229.22,'999','0','"131 MEMBER','1','802') +('4567','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',28.95,'999','0','"4567 MEMBER','1','803') +('5122','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',2004.80,'999','0','"5122 MEMBER','1','804') +('5153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1745.41,'999','0','"5153 MEMBER','1','805') +('4964','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',513.74,'999','1','"4964 MEMBER','1','806') +('265','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"265 MEMBER','1','807') +('4217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',321.52,'999','1','"4217 MEMBER','1','808') +('4390','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',93.14,'999','1','"4390 MEMBER','1','809') +('4336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1874.66,'999','1','"4336 MEMBER','1','810') +('10014','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10014 MEMBER','1','811') +('4833','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2269.98,'999','0','"4833 MEMBER','1','812') +('4249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4249 MEMBER','1','813') +('4335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.16,'999','1','"4335 MEMBER','1','814') +('244','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"244 MEMBER','1','815') +('9022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"9022 MEMBER','1','816') +('9989','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9989 MEMBER','1','817') +('6544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',161.89,'999','1','"6544 MEMBER','1','818') +('6706','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',413.39,'999','0','"6706 MEMBER','1','819') +('6313','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',1622.67,'999','0','"6313 MEMBER','1','820') +('6773','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',173.19,'999','0','"6773 MEMBER','1','821') +('3276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',103.29,'999','0','"3276 MEMBER','1','822') +('6248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10.00,'999','1','"6248 MEMBER','1','823') +('1224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1224 MEMBER','1','824') +('6800','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6800 MEMBER','1','825') +('7002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"7002 MEMBER','1','826') +('3340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1006.50,'999','1','"3340 MEMBER','1','827') +('6329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2035.87,'999','0','"6329 MEMBER','1','828') +('6803','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6803 MEMBER','1','829') +('9014','1','LASTNAME','FIRSTNAME',999.99,196.87,'0',0.00,'1','1','1','TERM','0','0','0',382.50,'999','0','"9014 MEMBER','1','830') +('4855','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',314.08,'999','1','"4855 MEMBER','1','831') +('1274','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',83.38,'999','1','"1274 MEMBER','1','832') +('4136','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',27.12,'999','1','"4136 MEMBER','1','833') +('2430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2430 MEMBER','1','834') +('9086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9086 MEMBER','1','835') +('4655','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',132.56,'999','0','"4655 MEMBER','1','836') +('4969','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',2842.52,'999','0','"4969 MEMBER','1','837') +('4010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',404.84,'999','0','"4010 MEMBER','1','838') +('4530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',66.76,'999','0','"4530 MEMBER','1','839') +('6819','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6819 MEMBER','1','840') +('6470','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',901.86,'999','0','"6470 MEMBER','1','841') +('2519','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5144.51,'999','0','"2519 MEMBER','1','842') +('258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"258 MEMBER','1','843') +('2951','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',52.95,'999','0','"2951 MEMBER','1','844') +('6117','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"6117 MEMBER','1','845') +('5163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',60.82,'999','0','"5163 MEMBER','1','847') +('6375','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',912.53,'999','1','"6375 MEMBER','1','848') +('5090','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',124.97,'999','0','"5090 MEMBER','1','849') +('75','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8901.37,'999','0','"75 MEMBER','1','850') +('923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',67.73,'999','0','"923 MEMBER','1','851') +('6405','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.27,'999','0','"6405 MEMBER','1','852') +('4932','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1579.16,'999','1','"4932 MEMBER','1','853') +('3204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4013.51,'999','0','"3204 MEMBER','1','854') +('4334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4334 MEMBER','1','855') +('2907','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2907 MEMBER','1','856') +('157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2495.69,'999','0','"157 MEMBER','1','857') +('4642','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',477.94,'999','1','"4642 MEMBER','1','858') +('4197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1343.82,'999','0','"4197 MEMBER','1','859') +('1255','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1255 MEMBER','1','860') +('4724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2120.30,'999','1','"4724 MEMBER','1','861') +('4455','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2339.38,'999','0','"4455 MEMBER','1','862') +('6546','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',761.11,'999','1','"6546 MEMBER','1','863') +('4020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2382.09,'999','0','"4020 MEMBER','1','864') +('368','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"368 MEMBER','1','865') +('3289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',113.32,'999','1','"3289 MEMBER','1','866') +('4794','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',406.30,'999','0','"4794 MEMBER','1','867') +('6198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.05,'999','1','"6198 MEMBER','1','868') +('5094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5094 MEMBER','1','869') +('12','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3824.19,'999','0','"12 MEMBER','1','870') +('4458','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4458 MEMBER','1','871') +('4057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4057 MEMBER','1','872') +('402','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3111.05,'999','1','"402 MEMBER','1','873') +('309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"309 MEMBER','1','874') +('4369','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1333.50,'999','1','"4369 MEMBER','1','875') +('2174','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"2174 MEMBER','1','876') +('2325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1.49,'999','1','"2325 MEMBER','1','877') +('4077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4077 MEMBER','1','878') +('2544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',738.48,'999','0','"2544 MEMBER','1','879') +('4501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1967.94,'999','0','"4501 MEMBER','1','880') +('2364','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.28,'999','0','"2364 MEMBER','1','881') +('4064','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"4064 MEMBER','1','882') +('6266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',54.21,'999','1','"6266 MEMBER','1','883') +('6288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',350.47,'999','0','"6288 MEMBER','1','884') +('4831','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',262.09,'999','0','"4831 MEMBER','1','885') +('4041','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',385.68,'999','1','"4041 MEMBER','1','886') +('6814','2','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6814 MEMBER','1','887') +('4217','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',321.52,'999','1','"4217 MEMBER','1','888') +('6522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',676.61,'999','0','"6522 MEMBER','1','889') +('3042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',527.66,'999','1','"3042 MEMBER','1','890') +('173','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',167.49,'999','1','"173 MEMBER','1','891') +('3122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',501.54,'999','1','"3122 MEMBER','1','892') +('3091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2733.95,'999','0','"3091 MEMBER','1','893') +('4644','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',128.19,'999','0','"4644 MEMBER','1','894') +('4406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1625.55,'999','0','"4406 MEMBER','1','895') +('1931','2','LASTNAME','FIRSTNAME',999.99,'-2.69','0',20.00,'1','1','1','PC','1','0','0',3874.75,'999','0','"1931 MEMBER','1','896') +('6491','1','LASTNAME','FIRSTNAME',999.99,19.00,'0',20.00,'1','1','1','PC','1','1','0',2521.26,'999','0','"6491 MEMBER','1','897') +('4769','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.66,'999','1','"4769 MEMBER','1','898') +('4556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',979.00,'999','1','"4556 MEMBER','1','899') +('4462','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',843.09,'999','0','"4462 MEMBER','1','900') +('6654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',812.93,'999','1','"6654 MEMBER','1','901') +('2121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',882.06,'999','1','"2121 MEMBER','1','902') +('9037','2','LASTNAME','FIRSTNAME',999.99,185.62,'0',0.00,'1','0','1','TERM','0','0','0',446.25,'999','0','"9037 MEMBER','1','903') +('4261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4261 MEMBER','1','904') +('6866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6866 MEMBER','1','905') +('7079','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7079 MEMBER','1','906') +('7105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7105 MEMBER','1','907') +('7109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7109 MEMBER','1','908') +('7116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7116 MEMBER','1','909') +('7123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7123 MEMBER','1','910') +('7141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7141 MEMBER','1','911') +('7099','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7099 MEMBER','1','912') +('7112','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7112 MEMBER','1','913') +('6278','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',167.94,'999','0','"6278 MEMBER','1','914') +('4308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',76.78,'999','1','"4308 MEMBER','1','915') +('1537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1537 MEMBER','1','916') +('6726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',121.24,'999','0','"6726 MEMBER','1','917') +('4736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',512.30,'999','1','"4736 MEMBER','1','918') +('3267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2242.08,'999','1','"3267 MEMBER','1','919') +('5162','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',375.02,'999','0','"5162 MEMBER','1','920') +('4714','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',756.89,'999','0','"4714 MEMBER','1','921') +('4088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',0.00,'999','1','"4088 MEMBER','1','922') +('6553','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2307.59,'999','0','"6553 MEMBER','1','923') +('6862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6862 MEMBER','1','924') +('4025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',393.21,'999','0','"4025 MEMBER','1','925') +('4729','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',210.85,'999','1','"4729 MEMBER','1','926') +('6763','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',127.95,'999','0','"6763 MEMBER','1','927') +('6353','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',285.64,'999','1','"6353 MEMBER','1','928') +('1427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1427 MEMBER','1','929') +('6325','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',163.36,'999','1','"6325 MEMBER','1','930') +('4338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1686.84,'999','1','"4338 MEMBER','1','931') +('9045','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',165.00,'999','0','"9045 MEMBER','1','932') +('4457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2232.25,'999','0','"4457 MEMBER','1','933') +('341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',231.75,'999','1','"341 MEMBER','1','934') +('4210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1832.76,'999','0','"4210 MEMBER','1','935') +('2311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1716.07,'999','0','"2311 MEMBER','1','936') +('4328','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4328 MEMBER','1','937') +('17','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','0','0','0',57.43,'999','0','"17 MEMBER','1','938') +('6108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',592.56,'999','0','"6108 MEMBER','1','939') +('6791','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6791 MEMBER','1','940') +('4355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4355 MEMBER','1','941') +('4966','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',9497.93,'999','0','"4966 MEMBER','1','942') +('4152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',302.37,'999','1','"4152 MEMBER','1','943') +('7005','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"7005 MEMBER','1','944') +('6803','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6803 MEMBER','1','945') +('6124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1192.04,'999','0','"6124 MEMBER','1','946') +('4082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4082 MEMBER','1','947') +('2397','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2397 MEMBER','1','948') +('6845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6845 MEMBER','1','949') +('3340','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1006.50,'999','1','"3340 MEMBER','1','950') +('2612','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2612 MEMBER','1','951') +('2742','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',93.42,'999','1','"2742 MEMBER','1','952') +('2674','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',605.77,'999','0','"2674 MEMBER','1','953') +('6604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',15.78,'999','0','"6604 MEMBER','1','954') +('6408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',711.74,'999','0','"6408 MEMBER','1','955') +('857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"857 MEMBER','1','956') +('2548','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',3.74,'999','0','"2548 MEMBER','1','957') +('2641','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5924.80,'999','0','"2641 MEMBER','1','958') +('4578','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4578 MEMBER','1','959') +('6809','2','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6809 MEMBER','1','960') +('488','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2169.47,'999','0','"488 MEMBER','1','961') +('6357','2','LASTNAME','FIRSTNAME',999.99,5.34,'0',20.00,'1','0','1','PC','1','0','0',1528.18,'999','0','"6357 MEMBER','1','962') +('6736','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',49.98,'999','1','"6736 MEMBER','1','963') +('2260','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1991.52,'999','1','"2260 MEMBER','1','964') +('6258','3','LASTNAME','FIRSTNAME',999.99,11.27,'0',20.00,'1','0','1','PC','1','0','0',1798.12,'999','0','"6258 MEMBER','1','965') +('9033','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9033 MEMBER','1','966') +('4596','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4596 MEMBER','1','968') +('4834','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4834 MEMBER','1','969') +('4594','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4594 MEMBER','1','970') +('4141','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3176.14,'999','0','"4141 MEMBER','1','971') +('4773','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2399.38,'999','0','"4773 MEMBER','1','972') +('7089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7089 MEMBER','1','973') +('7106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7106 MEMBER','1','974') +('7096','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7096 MEMBER','1','975') +('7146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7146 MEMBER','1','976') +('7152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7152 MEMBER','1','977') +('7127','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7127 MEMBER','1','978') +('7138','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7138 MEMBER','1','979') +('7159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7159 MEMBER','1','980') +('7173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7173 MEMBER','1','981') +('7176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7176 MEMBER','1','982') +('4653','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',147.86,'999','1','"4653 MEMBER','1','983') +('6817','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',NULL,'999','0','"6817 MEMBER','1','984') +('9051','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',333.75,'999','0','"9051 MEMBER','1','985') +('9019','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9019 MEMBER','1','986') +('9005','1','LASTNAME','FIRSTNAME',999.99,63.75,'0',0.00,'1','1','1','TERM','0','0','0',63.75,'999','0','"9005 MEMBER','1','987') +('4106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2921.51,'999','0','"4106 MEMBER','1','988') +('4527','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',369.57,'999','0','"4527 MEMBER','1','989') +('236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"236 MEMBER','1','990') +('478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',985.40,'999','1','"478 MEMBER','1','991') +('4202','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',172.09,'999','1','"4202 MEMBER','1','992') +('3239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.18,'999','1','"3239 MEMBER','1','993') +('4012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4012 MEMBER','1','994') +('4564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1575.65,'999','1','"4564 MEMBER','1','995') +('4605','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',581.81,'999','0','"4605 MEMBER','1','996') +('4351','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4351 MEMBER','1','997') +('958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',238.70,'999','0','"958 MEMBER','1','998') +('2955','3','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','1','1','PC','1','0','0',791.17,'999','1','"2955 MEMBER','1','999') +('4537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2068.09,'999','0','"4537 MEMBER','1','1000') +('2662','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',0.00,'999','1','"2662 MEMBER','1','1001') +('93','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"93 MEMBER','1','1002') +('5137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1061.69,'999','0','"5137 MEMBER','1','1003') +('6677','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',884.17,'999','1','"6677 MEMBER','1','1004') +('6216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2421.68,'999','0','"6216 MEMBER','1','1005') +('297','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',63.08,'999','1','"297 MEMBER','1','1006') +('3054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3054 MEMBER','1','1007') +('6260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2801.51,'999','0','"6260 MEMBER','1','1008') +('2953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',323.42,'999','0','"2953 MEMBER','1','1009') +('4702','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2005.39,'999','0','"4702 MEMBER','1','1010') +('2967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2797.40,'999','1','"2967 MEMBER','1','1011') +('6435','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',458.81,'999','0','"6435 MEMBER','1','1012') +('236','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"236 MEMBER','1','1013') +('4397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"4397 MEMBER','1','1014') +('4516','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',205.58,'999','0','"4516 MEMBER','1','1015') +('6401','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',191.68,'999','0','"6401 MEMBER','1','1016') +('6223','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',563.80,'999','0','"6223 MEMBER','1','1017') +('4114','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4114 MEMBER','1','1018') +('4667','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4667 MEMBER','1','1019') +('6802','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6802 MEMBER','1','1020') +('7011','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"7011 MEMBER','1','1021') +('174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',84.33,'999','1','"174 MEMBER','1','1022') +('3319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2102.82,'999','0','"3319 MEMBER','1','1023') +('153','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2624.64,'999','0','"153 MEMBER','1','1024') +('359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"359 MEMBER','1','1025') +('4989','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4989 MEMBER','1','1026') +('9009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',112.50,'999','0','"9009 MEMBER','1','1027') +('2050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2050 MEMBER','1','1028') +('165','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"165 MEMBER','1','1029') +('192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1431.22,'999','0','"192 MEMBER','1','1030') +('4961','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6452.86,'999','0','"4961 MEMBER','1','1031') +('4459','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4459 MEMBER','1','1032') +('56','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"56 MEMBER','1','1033') +('5167','1','LASTNAME','FIRSTNAME',999.00,0.00,'10',0.00,'1','1','1','REG','9','1','0',NULL,'999','0','"5167 MEMBER','1','1034') +('6904','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6904 MEMBER','1','1035') +('6935','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6935 MEMBER','1','1036') +('6925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6925 MEMBER','1','1037') +('3031','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',21.78,'999','1','"3031 MEMBER','1','1038') +('6276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',795.87,'999','1','"6276 MEMBER','1','1039') +('6870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6870 MEMBER','1','1040') +('6890','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6890 MEMBER','1','1041') +('2331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',368.81,'999','0','"2331 MEMBER','1','1042') +('7057','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7057 MEMBER','1','1043') +('7058','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7058 MEMBER','1','1044') +('7059','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7059 MEMBER','1','1045') +('7068','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7068 MEMBER','1','1046') +('7085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7085 MEMBER','1','1047') +('7086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7086 MEMBER','1','1048') +('7091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7091 MEMBER','1','1049') +('7112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7112 MEMBER','1','1050') +('7088','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7088 MEMBER','1','1051') +('7124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7124 MEMBER','1','1052') +('7126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7126 MEMBER','1','1053') +('7140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7140 MEMBER','1','1054') +('1417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1417 MEMBER','1','1055') +('5043','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5043 MEMBER','1','1056') +('5127','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5127 MEMBER','1','1057') +('9051','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',333.75,'999','0','"9051 MEMBER','1','1058') +('6638','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1991.89,'999','0','"6638 MEMBER','1','1059') +('255','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',229.97,'999','1','"255 MEMBER','1','1060') +('2201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',204.10,'999','1','"2201 MEMBER','1','1061') +('4951','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',8962.38,'999','0','"4951 MEMBER','1','1062') +('3085','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',473.13,'999','0','"3085 MEMBER','1','1063') +('6745','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',251.83,'999','0','"6745 MEMBER','1','1064') +('2579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',477.31,'999','1','"2579 MEMBER','1','1065') +('4828','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.75,'999','1','"4828 MEMBER','1','1066') +('1583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"1583 MEMBER','1','1067') +('446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',124.51,'999','1','"446 MEMBER','1','1068') +('4157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',597.29,'999','1','"4157 MEMBER','1','1069') +('2664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2664 MEMBER','1','1070') +('4925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',57.14,'999','0','"4925 MEMBER','1','1071') +('6369','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5021.22,'999','0','"6369 MEMBER','1','1072') +('3265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',368.07,'999','1','"3265 MEMBER','1','1073') +('2303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.73,'999','1','"2303 MEMBER','1','1074') +('349','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"349 MEMBER','1','1075') +('6218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',435.27,'999','1','"6218 MEMBER','1','1076') +('381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',47.49,'999','1','"381 MEMBER','1','1077') +('6237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',692.56,'999','0','"6237 MEMBER','1','1078') +('4317','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4012.19,'999','0','"4317 MEMBER','1','1079') +('548','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6484.89,'999','0','"548 MEMBER','1','1080') +('6808','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6808 MEMBER','1','1081') +('6721','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',252.15,'999','0','"6721 MEMBER','1','1082') +('73','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1966.11,'999','0','"73 MEMBER','1','1083') +('1213','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4522.61,'999','0','"1213 MEMBER','1','1084') +('1650','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"1650 MEMBER','1','1085') +('4218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',913.61,'999','0','"4218 MEMBER','1','1086') +('929','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"929 MEMBER','1','1087') +('4579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3589.97,'999','0','"4579 MEMBER','1','1088') +('4095','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',719.68,'999','0','"4095 MEMBER','1','1089') +('6704','1','LASTNAME','FIRSTNAME',999.99,'-0.01','0',20.00,'1','1','1','PC','1','0','0',383.27,'999','1','"6704 MEMBER','1','1090') +('5071','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5071 MEMBER','1','1091') +('3010','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1071.83,'999','0','"3010 MEMBER','1','1092') +('6774','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',32.31,'999','1','"6774 MEMBER','1','1093') +('854','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.16,'999','1','"854 MEMBER','1','1094') +('6540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',525.87,'999','1','"6540 MEMBER','1','1095') +('6226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3808.21,'999','1','"6226 MEMBER','1','1096') +('4645','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4645 MEMBER','1','1097') +('9062','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9062 MEMBER','1','1098') +('1659','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',62.63,'999','1','"1659 MEMBER','1','1099') +('231','1','LASTNAME','FIRSTNAME',999.99,39.82,'10',50.00,'1','1','1','PC','3','1','0',113.16,'999','0','"231 MEMBER','1','1100') +('4065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',90.89,'999','0','"4065 MEMBER','1','1101') +('9081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',33.75,'999','0','"9081 MEMBER','1','1102') +('5017','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5017 MEMBER','1','1103') +('3227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1598.06,'999','1','"3227 MEMBER','1','1104') +('3331','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2796.68,'999','0','"3331 MEMBER','1','1105') +('4959','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1417.26,'999','1','"4959 MEMBER','1','1106') +('6357','1','LASTNAME','FIRSTNAME',999.99,5.34,'0',20.00,'1','1','1','PC','1','0','0',1528.18,'999','0','"6357 MEMBER','1','1107') +('6819','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6819 MEMBER','1','1108') +('6','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',782.64,'999','0','"6 MEMBER','1','1109') +('6780','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',144.69,'999','0','"6780 MEMBER','1','1110') +('6902','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6902 MEMBER','1','1111') +('6799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6799 MEMBER','1','1112') +('6915','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6915 MEMBER','1','1113') +('6924','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6924 MEMBER','1','1114') +('6932','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6932 MEMBER','1','1115') +('6453','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',403.06,'999','0','"6453 MEMBER','1','1116') +('9067','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9067 MEMBER','1','1117') +('148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2107.15,'999','0','"148 MEMBER','1','1118') +('213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"213 MEMBER','1','1119') +('7067','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7067 MEMBER','1','1120') +('7082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7082 MEMBER','1','1121') +('7110','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7110 MEMBER','1','1122') +('7111','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7111 MEMBER','1','1123') +('7164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7164 MEMBER','1','1124') +('4178','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',557.50,'999','0','"4178 MEMBER','1','1125') +('5092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5092 MEMBER','1','1126') +('6148','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',295.71,'999','0','"6148 MEMBER','1','1127') +('1398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1622.13,'999','0','"1398 MEMBER','1','1128') +('4245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4245 MEMBER','1','1129') +('2085','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',66.39,'999','1','"2085 MEMBER','1','1130') +('6523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2308.22,'999','0','"6523 MEMBER','1','1131') +('5047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5047 MEMBER','1','1132') +('338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"338 MEMBER','1','1133') +('6373','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',8092.90,'999','0','"6373 MEMBER','1','1134') +('2062','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"2062 MEMBER','1','1136') +('5053','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5053 MEMBER','1','1137') +('336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"336 MEMBER','1','1138') +('4395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4561.78,'999','0','"4395 MEMBER','1','1139') +('9075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9075 MEMBER','1','1140') +('8388','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8388 MEMBER','1','1141') +('6157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',347.14,'999','0','"6157 MEMBER','1','1142') +('4293','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4293 MEMBER','1','1143') +('8831','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8831 MEMBER','1','1144') +('6363','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1382.40,'999','0','"6363 MEMBER','1','1145') +('1112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6087.82,'999','0','"1112 MEMBER','1','1146') +('4951','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',8962.38,'999','0','"4951 MEMBER','1','1147') +('862','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.50,'999','0','"862 MEMBER','1','1148') +('465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1246.35,'999','0','"465 MEMBER','1','1149') +('286','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"286 MEMBER','1','1150') +('6657','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',730.29,'999','0','"6657 MEMBER','1','1151') +('5400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5400 MEMBER','1','1152') +('6208','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.62,'999','1','"6208 MEMBER','1','1153') +('5126','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5126 MEMBER','1','1154') +('9102','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9102 MEMBER','1','1155') +('9047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',408.75,'999','0','"9047 MEMBER','1','1156') +('4828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.75,'999','1','"4828 MEMBER','1','1157') +('5370','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5370 MEMBER','1','1158') +('1547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',790.44,'999','1','"1547 MEMBER','1','1159') +('6816','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','0','"6816 MEMBER','1','1160') +('1894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',295.47,'999','1','"1894 MEMBER','1','1161') +('1830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1830 MEMBER','1','1162') +('4821','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1058.96,'999','0','"4821 MEMBER','1','1163') +('2684','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2684 MEMBER','1','1164') +('9043','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9043 MEMBER','1','1165') +('4153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2247.55,'999','0','"4153 MEMBER','1','1166') +('7247','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7247 MEMBER','1','1167') +('4584','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',63.28,'999','1','"4584 MEMBER','1','1168') +('4871','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',76.49,'999','0','"4871 MEMBER','1','1169') +('4401','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4401 MEMBER','1','1170') +('4114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4114 MEMBER','1','1171') +('9017','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9017 MEMBER','1','1172') +('6480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',615.31,'999','1','"6480 MEMBER','1','1173') +('6158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',46.60,'999','1','"6158 MEMBER','1','1174') +('4504','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',156.25,'999','1','"4504 MEMBER','1','1175') +('2170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1651.49,'999','0','"2170 MEMBER','1','1176') +('4332','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4332 MEMBER','1','1177') +('4122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',576.45,'999','1','"4122 MEMBER','1','1178') +('4198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4198 MEMBER','1','1179') +('2894','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2894 MEMBER','1','1180') +('6303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',71.51,'999','0','"6303 MEMBER','1','1181') +('6514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',220.07,'999','1','"6514 MEMBER','1','1182') +('4774','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',281.62,'999','1','"4774 MEMBER','1','1183') +('241','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',300.51,'999','1','"241 MEMBER','1','1184') +('222','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',88.06,'999','1','"222 MEMBER','1','1185') +('6301','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',74.07,'999','0','"6301 MEMBER','1','1186') +('495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',304.83,'999','1','"495 MEMBER','1','1187') +('6422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','1',1678.68,'999','0','"6422 MEMBER','1','1188') +('4923','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',47.45,'999','0','"4923 MEMBER','1','1189') +('4835','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',585.11,'999','0','"4835 MEMBER','1','1190') +('6682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',56.53,'999','1','"6682 MEMBER','1','1191') +('3412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3412 MEMBER','1','1192') +('321','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',30.34,'999','1','"321 MEMBER','1','1193') +('2280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1884.75,'999','0','"2280 MEMBER','1','1194') +('347','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"347 MEMBER','1','1195') +('4687','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4687 MEMBER','1','1196') +('6622','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"6622 MEMBER','1','1197') +('2614','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2614 MEMBER','1','1198') +('6346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2373.46,'999','0','"6346 MEMBER','1','1199') +('6526','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',269.06,'999','0','"6526 MEMBER','1','1200') +('2973','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2973 MEMBER','1','1201') +('1795','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5.64,'999','1','"1795 MEMBER','1','1202') +('6741','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',99.05,'999','1','"6741 MEMBER','1','1203') +('4884','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',272.43,'999','0','"4884 MEMBER','1','1204') +('310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',452.44,'999','0','"310 MEMBER','1','1205') +('1298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',168.64,'999','0','"1298 MEMBER','1','1206') +('937','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"937 MEMBER','1','1207') +('4489','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4655.74,'999','0','"4489 MEMBER','1','1208') +('4826','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',307.49,'999','0','"4826 MEMBER','1','1209') +('4724','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2120.30,'999','1','"4724 MEMBER','1','1210') +('3002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1221.50,'999','0','"3002 MEMBER','1','1211') +('2990','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',255.23,'999','0','"2990 MEMBER','1','1212') +('1600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',985.93,'999','0','"1600 MEMBER','1','1213') +('6395','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',566.19,'999','0','"6395 MEMBER','1','1214') +('4343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4343 MEMBER','1','1215') +('4588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2804.03,'999','0','"4588 MEMBER','1','1216') +('18','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"18 MEMBER','1','1217') +('4924','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',124.65,'999','0','"4924 MEMBER','1','1218') +('6198','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.05,'999','1','"6198 MEMBER','1','1219') +('4166','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4166 MEMBER','1','1220') +('6532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',229.18,'999','1','"6532 MEMBER','1','1221') +('4283','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1381.97,'999','0','"4283 MEMBER','1','1222') +('3424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1234.83,'999','0','"3424 MEMBER','1','1223') +('391','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.53,'999','1','"391 MEMBER','1','1224') +('5048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5048 MEMBER','1','1225') +('6792','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.23,'999','1','"6792 MEMBER','1','1226') +('5037','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',100.00,'1','1','1','REG','9','1','0',362.29,'999','0','"5037 MEMBER','1','1227') +('9012','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',393.75,'999','0','"9012 MEMBER','1','1228') +('6828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6828 MEMBER','1','1229') +('2577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1017.33,'999','0','"2577 MEMBER','1','1230') +('6242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',445.49,'999','1','"6242 MEMBER','1','1231') +('6174','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6174 MEMBER','1','1232') +('177','3','LASTNAME','FIRSTNAME',999.99,5.76,'0',20.00,'1','0','1','PC','1','0','0',1369.41,'999','0','"177 MEMBER','1','1233') +('6630','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',472.73,'999','0','"6630 MEMBER','1','1234') +('9011','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9011 MEMBER','1','1235') +('473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.86,'999','1','"473 MEMBER','1','1236') +('2992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',131.73,'999','0','"2992 MEMBER','1','1237') +('4220','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',194.90,'999','1','"4220 MEMBER','1','1238') +('6453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',403.06,'999','0','"6453 MEMBER','1','1239') +('4029','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4029 MEMBER','1','1240') +('1776','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',346.28,'999','1','"1776 MEMBER','1','1241') +('4987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1466.10,'999','0','"4987 MEMBER','1','1242') +('4278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',563.57,'999','1','"4278 MEMBER','1','1243') +('6372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2196.42,'999','0','"6372 MEMBER','1','1244') +('6522','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',676.61,'999','0','"6522 MEMBER','1','1245') +('4067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1337.50,'999','1','"4067 MEMBER','1','1246') +('6134','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',347.65,'999','1','"6134 MEMBER','1','1247') +('6007','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',388.04,'999','0','"6007 MEMBER','1','1248') +('4107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4107 MEMBER','1','1249') +('6261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',842.05,'999','1','"6261 MEMBER','1','1250') +('4098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',898.29,'999','0','"4098 MEMBER','1','1251') +('9066','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9066 MEMBER','1','1252') +('3208','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',59.50,'999','1','"3208 MEMBER','1','1253') +('6834','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6834 MEMBER','1','1254') +('6458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1499.81,'999','0','"6458 MEMBER','1','1255') +('3335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',302.13,'999','0','"3335 MEMBER','1','1256') +('4864','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.98,'999','0','"4864 MEMBER','1','1257') +('7050','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7050 MEMBER','1','1258') +('7074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7074 MEMBER','1','1259') +('7087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7087 MEMBER','1','1260') +('7103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7103 MEMBER','1','1261') +('7072','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7072 MEMBER','1','1262') +('7074','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7074 MEMBER','1','1263') +('1129','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1129 MEMBER','1','1264') +('4525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',396.18,'999','0','"4525 MEMBER','1','1265') +('6212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6212 MEMBER','1','1266') +('2153','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2979.04,'999','0','"2153 MEMBER','1','1267') +('5018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5018 MEMBER','1','1268') +('9691','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9691 MEMBER','1','1269') +('921','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"921 MEMBER','1','1270') +('4935','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',298.60,'999','0','"4935 MEMBER','1','1271') +('1596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1596 MEMBER','1','1272') +('3333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3333 MEMBER','1','1273') +('223','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',794.50,'999','0','"223 MEMBER','1','1274') +('449','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',651.27,'999','0','"449 MEMBER','1','1275') +('2936','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',22.96,'999','1','"2936 MEMBER','1','1276') +('4029','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4029 MEMBER','1','1277') +('9027','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9027 MEMBER','1','1278') +('4694','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',626.81,'999','0','"4694 MEMBER','1','1279') +('4651','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4651 MEMBER','1','1280') +('1923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3601.80,'999','0','"1923 MEMBER','1','1281') +('4880','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',23.35,'999','0','"4880 MEMBER','1','1282') +('222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',88.06,'999','1','"222 MEMBER','1','1283') +('4624','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',18.79,'999','1','"4624 MEMBER','1','1284') +('4119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2789.39,'999','1','"4119 MEMBER','1','1285') +('4046','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',77.85,'999','1','"4046 MEMBER','1','1286') +('4861','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',134.74,'999','1','"4861 MEMBER','1','1287') +('6511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','1','0',937.11,'999','1','"6511 MEMBER','1','1288') +('948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"948 MEMBER','1','1289') +('623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.44,'999','1','"623 MEMBER','1','1290') +('5091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5091 MEMBER','1','1291') +('3392','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2842.21,'999','0','"3392 MEMBER','1','1292') +('6346','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',2373.46,'999','0','"6346 MEMBER','1','1293') +('6244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',5714.61,'999','0','"6244 MEMBER','1','1294') +('4884','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',272.43,'999','0','"4884 MEMBER','1','1295') +('4389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',142.32,'999','0','"4389 MEMBER','1','1296') +('2100','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2730.72,'999','0','"2100 MEMBER','1','1297') +('6166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',87.16,'999','1','"6166 MEMBER','1','1298') +('218','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',130.99,'999','1','"218 MEMBER','1','1299') +('6157','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',347.14,'999','0','"6157 MEMBER','1','1300') +('5148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',759.19,'999','0','"5148 MEMBER','1','1301') +('6426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',466.03,'999','0','"6426 MEMBER','1','1302') +('261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',110.16,'999','1','"261 MEMBER','1','1303') +('110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4608.56,'999','0','"110 MEMBER','1','1304') +('4822','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4822 MEMBER','1','1305') +('6368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',129.23,'999','1','"6368 MEMBER','1','1306') +('6492','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1724.38,'999','0','"6492 MEMBER','1','1307') +('6697','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',16.33,'999','0','"6697 MEMBER','1','1308') +('2705','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',124.09,'999','0','"2705 MEMBER','1','1309') +('2022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',418.47,'999','0','"2022 MEMBER','1','1310') +('6175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',171.05,'999','1','"6175 MEMBER','1','1311') +('4068','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"4068 MEMBER','1','1312') +('5144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',590.53,'999','0','"5144 MEMBER','1','1313') +('6414','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1778.34,'999','0','"6414 MEMBER','1','1314') +('3220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3220 MEMBER','1','1315') +('5106','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',834.11,'999','0','"5106 MEMBER','1','1316') +('2612','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2612 MEMBER','1','1317') +('3081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3348.21,'999','0','"3081 MEMBER','1','1318') +('4622','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',282.84,'999','1','"4622 MEMBER','1','1319') +('631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"631 MEMBER','1','1320') +('295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"295 MEMBER','1','1321') +('4594','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4594 MEMBER','1','1322') +('1535','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1535 MEMBER','1','1323') +('7001','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',NULL,'999','0','"7001 MEMBER','1','1324') +('4722','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4722 MEMBER','1','1325') +('6721','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',252.15,'999','0','"6721 MEMBER','1','1326') +('6440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',509.17,'999','0','"6440 MEMBER','1','1327') +('6252','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',3107.81,'999','0','"6252 MEMBER','1','1328') +('1533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',14.04,'999','1','"1533 MEMBER','1','1329') +('6552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',338.96,'999','0','"6552 MEMBER','1','1330') +('5149','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',489.64,'999','0','"5149 MEMBER','1','1331') +('4773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2399.38,'999','0','"4773 MEMBER','1','1332') +('979','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',11.00,'999','1','"979 MEMBER','1','1333') +('1186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1003.47,'999','0','"1186 MEMBER','1','1334') +('242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"242 MEMBER','1','1335') +('4380','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',201.19,'999','1','"4380 MEMBER','1','1336') +('9068','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9068 MEMBER','1','1337') +('586','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1409.77,'999','0','"586 MEMBER','1','1338') +('1304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1007.99,'999','0','"1304 MEMBER','1','1339') +('4768','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',397.07,'999','0','"4768 MEMBER','1','1340') +('9045','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',165.00,'999','0','"9045 MEMBER','1','1341') +('6129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',355.54,'999','1','"6129 MEMBER','1','1342') +('6614','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',25.64,'999','0','"6614 MEMBER','1','1343') +('3008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4670.15,'999','0','"3008 MEMBER','1','1344') +('6379','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',353.62,'999','0','"6379 MEMBER','1','1345') +('6208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.62,'999','1','"6208 MEMBER','1','1346') +('445','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',2739.43,'999','0','"445 MEMBER','1','1347') +('4730','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',699.18,'999','0','"4730 MEMBER','1','1348') +('4763','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1035.29,'999','0','"4763 MEMBER','1','1349') +('4938','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',611.21,'999','0','"4938 MEMBER','1','1350') +('2355','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',1803.03,'999','0','"2355 MEMBER','1','1351') +('6132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',31.49,'999','0','"6132 MEMBER','1','1352') +('6126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1164.22,'999','0','"6126 MEMBER','1','1353') +('146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1561.98,'999','0','"146 MEMBER','1','1354') +('4543','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4543 MEMBER','1','1355') +('6319','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',733.01,'999','0','"6319 MEMBER','1','1356') +('4633','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.44,'999','0','"4633 MEMBER','1','1357') +('8821','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8821 MEMBER','1','1358') +('5072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5072 MEMBER','1','1359') +('6208','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.62,'999','1','"6208 MEMBER','1','1360') +('6178','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',354.19,'999','0','"6178 MEMBER','1','1361') +('2182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2182 MEMBER','1','1362') +('6227','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.33,'999','1','"6227 MEMBER','1','1363') +('2720','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1833.32,'999','0','"2720 MEMBER','1','1364') +('4596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4596 MEMBER','1','1365') +('1455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1455 MEMBER','1','1366') +('488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2169.47,'999','0','"488 MEMBER','1','1367') +('403','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"403 MEMBER','1','1368') +('2294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',83.86,'999','1','"2294 MEMBER','1','1369') +('1274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',83.38,'999','1','"1274 MEMBER','1','1370') +('2519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5144.51,'999','0','"2519 MEMBER','1','1371') +('4968','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',372.15,'999','0','"4968 MEMBER','1','1372') +('4664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',981.52,'999','0','"4664 MEMBER','1','1373') +('1888','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3421.89,'999','0','"1888 MEMBER','1','1374') +('1170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1170 MEMBER','1','1375') +('204','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',607.19,'999','1','"204 MEMBER','1','1376') +('74','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"74 MEMBER','1','1377') +('6588','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',420.08,'999','0','"6588 MEMBER','1','1378') +('1421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',239.04,'999','1','"1421 MEMBER','1','1379') +('6436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',221.13,'999','1','"6436 MEMBER','1','1380') +('6376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3599.91,'999','0','"6376 MEMBER','1','1381') +('56','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"56 MEMBER','1','1382') +('2743','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2743 MEMBER','1','1383') +('3145','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5269.99,'999','0','"3145 MEMBER','1','1384') +('6842','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6842 MEMBER','1','1385') +('113','1','LASTNAME','FIRSTNAME',999.99,2.99,'10',100.00,'1','1','1','PC','3','1','0',6130.74,'999','0','"113 MEMBER','1','1386') +('4202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',172.09,'999','1','"4202 MEMBER','1','1387') +('4123','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2100.06,'999','0','"4123 MEMBER','1','1388') +('378','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',39.40,'999','1','"378 MEMBER','1','1389') +('3246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',309.17,'999','1','"3246 MEMBER','1','1390') +('4839','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',126.96,'999','0','"4839 MEMBER','1','1391') +('458','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2085.45,'999','1','"458 MEMBER','1','1392') +('7599','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7599 MEMBER','1','1393') +('3313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',467.81,'999','0','"3313 MEMBER','1','1394') +('6563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',937.13,'999','0','"6563 MEMBER','1','1395') +('4957','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3015.95,'999','0','"4957 MEMBER','1','1396') +('2598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',41.43,'999','1','"2598 MEMBER','1','1397') +('4611','1','LASTNAME','FIRSTNAME',999.99,63.27,'10',100.00,'1','1','1','PC','3','1','0',184.27,'999','1','"4611 MEMBER','1','1398') +('126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.04,'999','1','"126 MEMBER','1','1399') +('615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1062.46,'999','0','"615 MEMBER','1','1400') +('7052','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7052 MEMBER','1','1401') +('7061','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7061 MEMBER','1','1402') +('119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1058.17,'999','0','"119 MEMBER','1','1403') +('4815','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',47.38,'999','1','"4815 MEMBER','1','1404') +('6718','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',58.60,'999','0','"6718 MEMBER','1','1405') +('1789','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',54.78,'999','0','"1789 MEMBER','1','1406') +('200','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3423.74,'999','0','"200 MEMBER','1','1407') +('1480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6466.87,'999','0','"1480 MEMBER','1','1408') +('2635','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2635 MEMBER','1','1409') +('4449','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',410.35,'999','1','"4449 MEMBER','1','1410') +('2963','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2963 MEMBER','1','1411') +('298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',33.17,'999','1','"298 MEMBER','1','1412') +('6569','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',566.82,'999','1','"6569 MEMBER','1','1413') +('8820','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8820 MEMBER','1','1414') +('9207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9207 MEMBER','1','1415') +('4733','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',877.96,'999','0','"4733 MEMBER','1','1416') +('2255','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',792.34,'999','1','"2255 MEMBER','1','1417') +('1339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',307.30,'999','1','"1339 MEMBER','1','1418') +('3342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1310.90,'999','0','"3342 MEMBER','1','1419') +('1109','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1109 MEMBER','1','1420') +('866','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1858.56,'999','0','"866 MEMBER','1','1421') +('4937','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4937 MEMBER','1','1422') +('4287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.13,'999','1','"4287 MEMBER','1','1423') +('6438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',130.68,'999','0','"6438 MEMBER','1','1424') +('2016','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2016 MEMBER','1','1425') +('4475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',39.41,'999','0','"4475 MEMBER','1','1426') +('6415','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',419.08,'999','0','"6415 MEMBER','1','1427') +('6365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1323.01,'999','1','"6365 MEMBER','1','1428') +('1591','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',155.40,'999','1','"1591 MEMBER','1','1429') +('6513','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1001.62,'999','0','"6513 MEMBER','1','1430') +('6755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.52,'999','1','"6755 MEMBER','1','1431') +('4459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4459 MEMBER','1','1432') +('4023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',336.92,'999','0','"4023 MEMBER','1','1433') +('4751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2431.23,'999','0','"4751 MEMBER','1','1434') +('6268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1437.39,'999','0','"6268 MEMBER','1','1435') +('3149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3149 MEMBER','1','1436') +('6317','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6863.77,'999','0','"6317 MEMBER','1','1437') +('3411','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1244.36,'999','0','"3411 MEMBER','1','1438') +('4746','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1760.75,'999','0','"4746 MEMBER','1','1439') +('3267','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2242.08,'999','1','"3267 MEMBER','1','1440') +('4602','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4602 MEMBER','1','1441') +('135','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5622.04,'999','0','"135 MEMBER','1','1442') +('1293','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.06,'999','1','"1293 MEMBER','1','1443') +('5032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5032 MEMBER','1','1444') +('4713','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2286.45,'999','0','"4713 MEMBER','1','1445') +('220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8.98,'999','1','"220 MEMBER','1','1446') +('2353','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',177.03,'999','0','"2353 MEMBER','1','1447') +('6491','2','LASTNAME','FIRSTNAME',999.99,19.00,'0',20.00,'1','0','1','PC','1','1','0',2521.26,'999','0','"6491 MEMBER','1','1448') +('4941','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',199.37,'999','0','"4941 MEMBER','1','1449') +('112','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',591.68,'999','1','"112 MEMBER','1','1450') +('9031','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9031 MEMBER','1','1451') +('6547','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2559.02,'999','0','"6547 MEMBER','1','1452') +('4751','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2431.23,'999','0','"4751 MEMBER','1','1453') +('3280','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2335.12,'999','1','"3280 MEMBER','1','1454') +('4433','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8122.49,'999','0','"4433 MEMBER','1','1455') +('1950','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1908.41,'999','0','"1950 MEMBER','1','1456') +('6183','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',20.24,'999','0','"6183 MEMBER','1','1457') +('3204','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4013.51,'999','0','"3204 MEMBER','1','1458') +('4397','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"4397 MEMBER','1','1459') +('214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3376.61,'999','0','"214 MEMBER','1','1460') +('185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',759.29,'999','1','"185 MEMBER','1','1461') +('7044','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7044 MEMBER','1','1462') +('7093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7093 MEMBER','1','1463') +('7094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7094 MEMBER','1','1464') +('7093','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7093 MEMBER','1','1465') +('7135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7135 MEMBER','1','1466') +('7104','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7104 MEMBER','1','1467') +('7113','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7113 MEMBER','1','1468') +('7118','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7118 MEMBER','1','1469') +('7121','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7121 MEMBER','1','1470') +('7105','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7105 MEMBER','1','1471') +('7128','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7128 MEMBER','1','1472') +('4734','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',17.61,'999','0','"4734 MEMBER','1','1473') +('2813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2813 MEMBER','1','1474') +('456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5372.18,'999','0','"456 MEMBER','1','1475') +('3311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',207.79,'999','1','"3311 MEMBER','1','1476') +('9056','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9056 MEMBER','1','1477') +('4963','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',381.44,'999','1','"4963 MEMBER','1','1478') +('3035','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3035 MEMBER','1','1479') +('6979','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6979 MEMBER','1','1480') +('355','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1373.45,'999','1','"355 MEMBER','1','1481') +('455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"455 MEMBER','1','1482') +('6540','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',525.87,'999','1','"6540 MEMBER','1','1483') +('234','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.28,'999','1','"234 MEMBER','1','1484') +('4273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4391.44,'999','0','"4273 MEMBER','1','1485') +('6511','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','1','0',937.11,'999','1','"6511 MEMBER','1','1486') +('1040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1040 MEMBER','1','1487') +('2444','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2444 MEMBER','1','1488') +('9062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9062 MEMBER','1','1489') +('4786','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1776.21,'999','0','"4786 MEMBER','1','1490') +('6696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',162.40,'999','0','"6696 MEMBER','1','1491') +('127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2074.79,'999','0','"127 MEMBER','1','1492') +('6455','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',488.01,'999','0','"6455 MEMBER','1','1493') +('4246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1802.09,'999','1','"4246 MEMBER','1','1494') +('4270','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4920.65,'999','0','"4270 MEMBER','1','1495') +('4209','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',522.98,'999','0','"4209 MEMBER','1','1496') +('4846','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',452.00,'999','1','"4846 MEMBER','1','1497') +('6571','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',562.17,'999','1','"6571 MEMBER','1','1498') +('1228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',722.90,'999','1','"1228 MEMBER','1','1499') +('472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"472 MEMBER','1','1500') +('4845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',3154.73,'999','1','"4845 MEMBER','1','1501') +('411','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4367.47,'999','0','"411 MEMBER','1','1502') +('4432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4432 MEMBER','1','1503') +('7008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','1','"7008 MEMBER','1','1504') +('6734','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',475.40,'999','0','"6734 MEMBER','1','1505') +('3409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',47.17,'999','1','"3409 MEMBER','1','1506') +('4299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4299 MEMBER','1','1507') +('1471','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',210.31,'999','0','"1471 MEMBER','1','1508') +('359','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"359 MEMBER','1','1509') +('5093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5093 MEMBER','1','1510') +('4951','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',8962.38,'999','0','"4951 MEMBER','1','1511') +('548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6484.89,'999','0','"548 MEMBER','1','1512') +('109','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2819.31,'999','0','"109 MEMBER','1','1513') +('16','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1273.01,'999','0','"16 MEMBER','1','1514') +('526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"526 MEMBER','1','1515') +('6655','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1108.69,'999','1','"6655 MEMBER','1','1516') +('4031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',838.23,'999','1','"4031 MEMBER','1','1517') +('157','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2495.69,'999','0','"157 MEMBER','1','1518') +('4635','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',296.10,'999','1','"4635 MEMBER','1','1519') +('490','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"490 MEMBER','1','1520') +('1151','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8796.44,'999','0','"1151 MEMBER','1','1521') +('4502','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.20,'999','1','"4502 MEMBER','1','1522') +('2880','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1004.25,'999','0','"2880 MEMBER','1','1523') +('3269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',623.30,'999','1','"3269 MEMBER','1','1524') +('6160','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1398.61,'999','1','"6160 MEMBER','1','1525') +('4103','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6007.43,'999','0','"4103 MEMBER','1','1526') +('4602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4602 MEMBER','1','1527') +('6758','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',352.95,'999','0','"6758 MEMBER','1','1528') +('2042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3209.59,'999','0','"2042 MEMBER','1','1529') +('4755','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1341.32,'999','1','"4755 MEMBER','1','1530') +('4757','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',79.44,'999','0','"4757 MEMBER','1','1531') +('4317','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4012.19,'999','0','"4317 MEMBER','1','1532') +('6109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1286.49,'999','0','"6109 MEMBER','1','1533') +('1931','1','LASTNAME','FIRSTNAME',999.99,'-2.69','0',20.00,'1','1','1','PC','1','0','0',3874.75,'999','0','"1931 MEMBER','1','1534') +('6558','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',444.54,'999','0','"6558 MEMBER','1','1535') +('2170','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1651.49,'999','0','"2170 MEMBER','1','1536') +('4082','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4082 MEMBER','1','1537') +('4829','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',242.15,'999','1','"4829 MEMBER','1','1538') +('4208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3594.87,'999','0','"4208 MEMBER','1','1539') +('3061','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',825.00,'999','0','"3061 MEMBER','1','1540') +('9016','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9016 MEMBER','1','1541') +('4312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4312 MEMBER','1','1542') +('4954','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7144.89,'999','0','"4954 MEMBER','1','1543') +('6195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',29.41,'999','0','"6195 MEMBER','1','1544') +('4880','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',23.35,'999','0','"4880 MEMBER','1','1545') +('399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"399 MEMBER','1','1546') +('4272','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.16,'999','1','"4272 MEMBER','1','1547') +('4576','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1487.44,'999','0','"4576 MEMBER','1','1548') +('4985','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1294.87,'999','1','"4985 MEMBER','1','1549') +('301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',639.76,'999','1','"301 MEMBER','1','1550') +('3284','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2948.72,'999','1','"3284 MEMBER','1','1551') +('5122','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',2004.80,'999','0','"5122 MEMBER','1','1552') +('6164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',790.40,'999','1','"6164 MEMBER','1','1553') +('6740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',38.77,'999','0','"6740 MEMBER','1','1554') +('6761','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',75.56,'999','0','"6761 MEMBER','1','1555') +('37','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',336.80,'999','0','"37 MEMBER','1','1556') +('4384','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',75.95,'999','1','"4384 MEMBER','1','1557') +('2936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',22.96,'999','1','"2936 MEMBER','1','1558') +('4429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4392.03,'999','0','"4429 MEMBER','1','1559') +('4938','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',611.21,'999','0','"4938 MEMBER','1','1560') +('4264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',810.36,'999','0','"4264 MEMBER','1','1561') +('3298','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2113.57,'999','0','"3298 MEMBER','1','1562') +('6841','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6841 MEMBER','1','1563') +('4220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',194.90,'999','1','"4220 MEMBER','1','1564') +('2604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',430.61,'999','1','"2604 MEMBER','1','1565') +('4266','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',260.19,'999','1','"4266 MEMBER','1','1566') +('32','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6440.66,'999','0','"32 MEMBER','1','1567') +('4906','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4462.60,'999','0','"4906 MEMBER','1','1568') +('445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2739.43,'999','0','"445 MEMBER','1','1569') +('1687','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1722.55,'999','1','"1687 MEMBER','1','1570') +('6550','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1241.57,'999','1','"6550 MEMBER','1','1571') +('4823','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',220.64,'999','0','"4823 MEMBER','1','1572') +('368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"368 MEMBER','1','1573') +('6137','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',153.48,'999','1','"6137 MEMBER','1','1574') +('1127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1639.17,'999','1','"1127 MEMBER','1','1575') +('9025','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9025 MEMBER','1','1576') +('191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',524.34,'999','1','"191 MEMBER','1','1577') +('6110','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3605.70,'999','0','"6110 MEMBER','1','1578') +('2233','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2233 MEMBER','1','1579') +('253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',286.05,'999','1','"253 MEMBER','1','1580') +('4578','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4578 MEMBER','1','1581') +('4281','3','LASTNAME','FIRSTNAME',999.99,11.64,'0',20.00,'1','1','1','PC','1','0','0',12448.27,'999','0','"4281 MEMBER','1','1582') +('4260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4260 MEMBER','1','1583') +('957','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.90,'999','0','"957 MEMBER','1','1584') +('2855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.54,'999','1','"2855 MEMBER','1','1585') +('2395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2395 MEMBER','1','1586') +('6743','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',80.17,'999','0','"6743 MEMBER','1','1587') +('4362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',622.27,'999','1','"4362 MEMBER','1','1588') +('1726','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1726 MEMBER','1','1589') +('1589','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1589 MEMBER','1','1590') +('9046','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9046 MEMBER','1','1591') +('4335','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.16,'999','1','"4335 MEMBER','1','1592') +('4226','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4226 MEMBER','1','1593') +('43','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.67,'999','1','"43 MEMBER','1','1594') +('6879','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6879 MEMBER','1','1595') +('6893','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6893 MEMBER','1','1596') +('6923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6923 MEMBER','1','1597') +('6933','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6933 MEMBER','1','1598') +('4474','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1453.75,'999','1','"4474 MEMBER','1','1599') +('33','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1302.33,'999','1','"33 MEMBER','1','1600') +('7041','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7041 MEMBER','1','1601') +('5181','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5181 MEMBER','1','1602') +('7088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7088 MEMBER','1','1603') +('7090','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7090 MEMBER','1','1604') +('7096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7096 MEMBER','1','1605') +('7108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7108 MEMBER','1','1606') +('7080','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7080 MEMBER','1','1607') +('7132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7132 MEMBER','1','1608') +('7144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7144 MEMBER','1','1609') +('7151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7151 MEMBER','1','1610') +('158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"158 MEMBER','1','1611') +('6121','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2194.54,'999','0','"6121 MEMBER','1','1612') +('60','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2970.90,'999','1','"60 MEMBER','1','1613') +('6238','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',140.07,'999','1','"6238 MEMBER','1','1614') +('3344','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',354.81,'999','1','"3344 MEMBER','1','1615') +('6003','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','0','1','REG','2','0','0',546.54,'999','0','"6003 MEMBER','1','1616') +('6677','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',884.17,'999','1','"6677 MEMBER','1','1617') +('9017','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9017 MEMBER','1','1618') +('6481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',234.37,'999','0','"6481 MEMBER','1','1619') +('130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1979.64,'999','1','"130 MEMBER','1','1620') +('682','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3593.24,'999','1','"682 MEMBER','1','1621') +('4711','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',45.87,'999','1','"4711 MEMBER','1','1622') +('5150','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1033.02,'999','0','"5150 MEMBER','1','1623') +('4120','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4120 MEMBER','1','1624') +('5077','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5077 MEMBER','1','1625') +('6502','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',168.69,'999','0','"6502 MEMBER','1','1626') +('6664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',156.56,'999','0','"6664 MEMBER','1','1627') +('6389','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',768.95,'999','0','"6389 MEMBER','1','1628') +('4466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',476.42,'999','1','"4466 MEMBER','1','1629') +('4812','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1.95,'999','1','"4812 MEMBER','1','1630') +('4173','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',563.76,'999','1','"4173 MEMBER','1','1631') +('4873','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1248.76,'999','1','"4873 MEMBER','1','1632') +('2098','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2098 MEMBER','1','1633') +('3331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2796.68,'999','0','"3331 MEMBER','1','1634') +('4988','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',500.97,'999','1','"4988 MEMBER','1','1635') +('192','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1431.22,'999','0','"192 MEMBER','1','1636') +('6738','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',160.56,'999','0','"6738 MEMBER','1','1637') +('2901','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5289.37,'999','0','"2901 MEMBER','1','1638') +('123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1012.75,'999','1','"123 MEMBER','1','1639') +('2436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2415.72,'999','0','"2436 MEMBER','1','1640') +('2344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2344 MEMBER','1','1641') +('2282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1270.13,'999','1','"2282 MEMBER','1','1642') +('2325','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1.49,'999','1','"2325 MEMBER','1','1643') +('4328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4328 MEMBER','1','1644') +('6124','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1192.04,'999','0','"6124 MEMBER','1','1645') +('2579','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',477.31,'999','1','"2579 MEMBER','1','1646') +('342','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',757.91,'999','1','"342 MEMBER','1','1647') +('4569','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',394.49,'999','0','"4569 MEMBER','1','1648') +('2083','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3626.12,'999','1','"2083 MEMBER','1','1649') +('4754','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',787.41,'999','0','"4754 MEMBER','1','1650') +('4608','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4608 MEMBER','1','1651') +('2588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1324.64,'999','0','"2588 MEMBER','1','1652') +('4085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1327.63,'999','0','"4085 MEMBER','1','1653') +('6749','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.05,'999','0','"6749 MEMBER','1','1654') +('5165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',269.84,'999','0','"5165 MEMBER','1','1655') +('6366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',212.24,'999','1','"6366 MEMBER','1','1656') +('7007','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"7007 MEMBER','1','1657') +('4232','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',557.66,'999','0','"4232 MEMBER','1','1658') +('118','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"118 MEMBER','1','1659') +('6507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.73,'999','1','"6507 MEMBER','1','1660') +('5039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',376.04,'999','0','"5039 MEMBER','1','1661') +('163','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',983.06,'999','0','"163 MEMBER','1','1662') +('4943','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',95.90,'999','1','"4943 MEMBER','1','1663') +('5080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5080 MEMBER','1','1664') +('2233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2233 MEMBER','1','1665') +('6623','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',108.50,'999','1','"6623 MEMBER','1','1666') +('2219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',688.09,'999','0','"2219 MEMBER','1','1667') +('5155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',357.20,'999','0','"5155 MEMBER','1','1668') +('6858','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6858 MEMBER','1','1669') +('4895','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',245.29,'999','0','"4895 MEMBER','1','1670') +('7025','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7025 MEMBER','1','1671') +('7043','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7043 MEMBER','1','1672') +('7047','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7047 MEMBER','1','1673') +('7086','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7086 MEMBER','1','1674') +('7136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7136 MEMBER','1','1675') +('7139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7139 MEMBER','1','1676') +('7101','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7101 MEMBER','1','1677') +('7109','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7109 MEMBER','1','1678') +('7107','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7107 MEMBER','1','1679') +('6269','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1004.56,'999','1','"6269 MEMBER','1','1680') +('9082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9082 MEMBER','1','1681') +('3309','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.18,'999','1','"3309 MEMBER','1','1682') +('9069','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9069 MEMBER','1','1683') +('4101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4101 MEMBER','1','1684') +('645','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1273.06,'999','0','"645 MEMBER','1','1685') +('4665','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',575.48,'999','1','"4665 MEMBER','1','1686') +('6174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6174 MEMBER','1','1687') +('12','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3824.19,'999','0','"12 MEMBER','1','1688') +('1760','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',434.26,'999','0','"1760 MEMBER','1','1689') +('1226','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',36.83,'999','1','"1226 MEMBER','1','1690') +('410','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',354.15,'999','1','"410 MEMBER','1','1691') +('6187','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',109.39,'999','0','"6187 MEMBER','1','1692') +('8819','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8819 MEMBER','1','1693') +('2604','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',430.61,'999','1','"2604 MEMBER','1','1694') +('4452','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.40,'999','1','"4452 MEMBER','1','1695') +('3420','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1693.31,'999','1','"3420 MEMBER','1','1696') +('6425','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',800.23,'999','0','"6425 MEMBER','1','1697') +('2237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',108.38,'999','1','"2237 MEMBER','1','1698') +('4644','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',128.19,'999','0','"4644 MEMBER','1','1699') +('4084','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',197.32,'999','0','"4084 MEMBER','1','1700') +('6546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',761.11,'999','1','"6546 MEMBER','1','1701') +('4064','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"4064 MEMBER','1','1702') +('1352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',259.99,'999','0','"1352 MEMBER','1','1703') +('645','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1273.06,'999','0','"645 MEMBER','1','1704') +('277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"277 MEMBER','1','1705') +('4658','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7321.57,'999','0','"4658 MEMBER','1','1706') +('4159','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',226.98,'999','1','"4159 MEMBER','1','1707') +('6764','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"6764 MEMBER','1','1708') +('7199','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7199 MEMBER','1','1710') +('4794','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',406.30,'999','0','"4794 MEMBER','1','1711') +('2546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',924.95,'999','1','"2546 MEMBER','1','1712') +('4299','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4299 MEMBER','1','1713') +('1494','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','REG','0','0','0',0.00,'999','0','"1494 MEMBER','1','1714') +('1352','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',259.99,'999','0','"1352 MEMBER','1','1715') +('9024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9024 MEMBER','1','1716') +('7248','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7248 MEMBER','1','1717') +('6401','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',191.68,'999','0','"6401 MEMBER','1','1718') +('7763','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7763 MEMBER','1','1719') +('4089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2287.33,'999','0','"4089 MEMBER','1','1720') +('4922','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',59.34,'999','0','"4922 MEMBER','1','1721') +('4597','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1432.07,'999','0','"4597 MEMBER','1','1722') +('4112','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3726.04,'999','0','"4112 MEMBER','1','1723') +('397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"397 MEMBER','1','1724') +('4580','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4580 MEMBER','1','1725') +('2903','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2903 MEMBER','1','1726') +('2362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2362 MEMBER','1','1727') +('1611','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1247.58,'999','0','"1611 MEMBER','1','1728') +('217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1328.45,'999','0','"217 MEMBER','1','1729') +('10425','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10425 MEMBER','1','1730') +('3333','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3333 MEMBER','1','1731') +('3218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',209.13,'999','1','"3218 MEMBER','1','1732') +('4760','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3394.86,'999','0','"4760 MEMBER','1','1733') +('6325','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',163.36,'999','1','"6325 MEMBER','1','1734') +('4725','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',43.90,'999','1','"4725 MEMBER','1','1735') +('565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',699.06,'999','0','"565 MEMBER','1','1736') +('631','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"631 MEMBER','1','1737') +('6341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1985.00,'999','0','"6341 MEMBER','1','1738') +('1044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',80.92,'999','1','"1044 MEMBER','1','1739') +('4503','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',194.41,'999','1','"4503 MEMBER','1','1740') +('9096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9096 MEMBER','1','1741') +('2172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2172 MEMBER','1','1742') +('6812','2','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6812 MEMBER','1','1743') +('6723','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',199.77,'999','1','"6723 MEMBER','1','1744') +('6842','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',NULL,'999','0','"6842 MEMBER','1','1745') +('3124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4927.54,'999','0','"3124 MEMBER','1','1746') +('9032','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9032 MEMBER','1','1747') +('7028','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7028 MEMBER','1','1748') +('297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.08,'999','1','"297 MEMBER','1','1749') +('6569','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',566.82,'999','1','"6569 MEMBER','1','1750') +('8371','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8371 MEMBER','1','1751') +('1356','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',6.14,'999','0','"1356 MEMBER','1','1752') +('432','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"432 MEMBER','1','1753') +('6755','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.52,'999','1','"6755 MEMBER','1','1754') +('654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',778.45,'999','1','"654 MEMBER','1','1755') +('4900','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6411.43,'999','0','"4900 MEMBER','1','1756') +('520','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',111.60,'999','1','"520 MEMBER','1','1757') +('9040','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9040 MEMBER','1','1758') +('197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"197 MEMBER','1','1759') +('4205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4205 MEMBER','1','1760') +('4892','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',71.08,'999','0','"4892 MEMBER','1','1761') +('4317','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4012.19,'999','0','"4317 MEMBER','1','1762') +('4597','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1432.07,'999','0','"4597 MEMBER','1','1763') +('4660','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1535.04,'999','0','"4660 MEMBER','1','1764') +('3122','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',501.54,'999','1','"3122 MEMBER','1','1765') +('6786','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',39.16,'999','0','"6786 MEMBER','1','1766') +('10140','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10140 MEMBER','1','1767') +('356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"356 MEMBER','1','1768') +('4524','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3273.11,'999','0','"4524 MEMBER','1','1769') +('353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"353 MEMBER','1','1770') +('6160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1398.61,'999','1','"6160 MEMBER','1','1771') +('4259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1878.28,'999','0','"4259 MEMBER','1','1772') +('5387','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5387 MEMBER','1','1773') +('7141','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7141 MEMBER','1','1774') +('1652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5915.57,'999','0','"1652 MEMBER','1','1775') +('1374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1374 MEMBER','1','1776') +('6326','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',9019.21,'999','1','"6326 MEMBER','1','1777') +('6360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',444.35,'999','0','"6360 MEMBER','1','1778') +('6317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6863.77,'999','0','"6317 MEMBER','1','1779') +('2548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',3.74,'999','0','"2548 MEMBER','1','1780') +('4418','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',24.12,'999','1','"4418 MEMBER','1','1781') +('5317','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5317 MEMBER','1','1782') +('4990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',789.43,'999','1','"4990 MEMBER','1','1783') +('4721','2','LASTNAME','FIRSTNAME',999.99,15.01,'0',20.00,'1','0','1','PC','1','0','0',250.22,'999','0','"4721 MEMBER','1','1784') +('4724','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2120.30,'999','1','"4724 MEMBER','1','1785') +('4846','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',452.00,'999','1','"4846 MEMBER','1','1786') +('1316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',844.09,'999','0','"1316 MEMBER','1','1787') +('6120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1049.26,'999','0','"6120 MEMBER','1','1788') +('2824','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2824 MEMBER','1','1789') +('2759','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',137.11,'999','1','"2759 MEMBER','1','1790') +('6508','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','1','0',1052.80,'999','1','"6508 MEMBER','1','1791') +('4323','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.01,'999','1','"4323 MEMBER','1','1792') +('660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4016.30,'999','0','"660 MEMBER','1','1793') +('4703','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',601.93,'999','0','"4703 MEMBER','1','1794') +('4139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',537.24,'999','0','"4139 MEMBER','1','1795') +('4547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',349.71,'999','0','"4547 MEMBER','1','1796') +('4955','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2430.82,'999','0','"4955 MEMBER','1','1797') +('2584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1342.71,'999','0','"2584 MEMBER','1','1798') +('4664','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',981.52,'999','0','"4664 MEMBER','1','1799') +('9026','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9026 MEMBER','1','1800') +('6805','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6805 MEMBER','1','1801') +('4500','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',59.00,'999','0','"4500 MEMBER','1','1802') +('846','2','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','0','1','PC','3','1','0',482.04,'999','0','"846 MEMBER','1','1803') +('6589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',377.07,'999','0','"6589 MEMBER','1','1804') +('4048','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',109.56,'999','1','"4048 MEMBER','1','1805') +('4635','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',296.10,'999','1','"4635 MEMBER','1','1806') +('3145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5269.99,'999','0','"3145 MEMBER','1','1807') +('4716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1399.87,'999','0','"4716 MEMBER','1','1808') +('252','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',71.29,'999','0','"252 MEMBER','1','1809') +('5027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5027 MEMBER','1','1810') +('7037','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7037 MEMBER','1','1811') +('7046','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7046 MEMBER','1','1812') +('7080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7080 MEMBER','1','1813') +('7107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7107 MEMBER','1','1814') +('7111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7111 MEMBER','1','1815') +('7081','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7081 MEMBER','1','1816') +('7084','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7084 MEMBER','1','1817') +('4187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4187 MEMBER','1','1818') +('4681','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1218.93,'999','0','"4681 MEMBER','1','1819') +('9527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9527 MEMBER','1','1821') +('4713','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2286.45,'999','0','"4713 MEMBER','1','1822') +('6670','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',205.59,'999','0','"6670 MEMBER','1','1823') +('2081','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2081 MEMBER','1','1824') +('6538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',469.79,'999','0','"6538 MEMBER','1','1825') +('6567','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',10.93,'999','0','"6567 MEMBER','1','1826') +('507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2471.34,'999','0','"507 MEMBER','1','1827') +('857','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"857 MEMBER','1','1828') +('1125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1742.25,'999','1','"1125 MEMBER','1','1829') +('1746','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',681.46,'999','1','"1746 MEMBER','1','1831') +('6627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',112.78,'999','1','"6627 MEMBER','1','1832') +('2855','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7.54,'999','1','"2855 MEMBER','1','1833') +('194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',22.13,'999','0','"194 MEMBER','1','1834') +('3384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3384 MEMBER','1','1835') +('1208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1734.85,'999','0','"1208 MEMBER','1','1836') +('328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.35,'999','1','"328 MEMBER','1','1837') +('1746','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',681.46,'999','1','"1746 MEMBER','1','1838') +('3405','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"3405 MEMBER','1','1839') +('682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3593.24,'999','1','"682 MEMBER','1','1840') +('6657','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"6657 MEMBER','1','1841') +('6719','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',286.44,'999','0','"6719 MEMBER','1','1842') +('4048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',109.56,'999','1','"4048 MEMBER','1','1843') +('325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1298.09,'999','0','"325 MEMBER','1','1844') +('4919','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4919 MEMBER','1','1845') +('441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2077.12,'999','0','"441 MEMBER','1','1846') +('7757','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7757 MEMBER','1','1847') +('2619','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',952.12,'999','0','"2619 MEMBER','1','1848') +('3327','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3327 MEMBER','1','1849') +('6323','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',438.11,'999','0','"6323 MEMBER','1','1850') +('6153','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',256.03,'999','0','"6153 MEMBER','1','1851') +('2637','1','LASTNAME','FIRSTNAME',999.99,21.72,'10',100.00,'1','1','1','PC','3','1','0',3933.75,'999','0','"2637 MEMBER','1','1852') +('3169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3169 MEMBER','1','1853') +('1691','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1285.15,'999','0','"1691 MEMBER','1','1854') +('4271','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4271 MEMBER','1','1855') +('9003','1','LASTNAME','FIRSTNAME',999.99,'-63.74','0',0.00,'1','1','1','TERM','0','0','0',656.25,'999','0','"9003 MEMBER','1','1857') +('2237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',108.38,'999','1','"2237 MEMBER','1','1858') +('2010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2010 MEMBER','1','1859') +('4946','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',205.95,'999','0','"4946 MEMBER','1','1860') +('9047','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',408.75,'999','0','"9047 MEMBER','1','1861') +('4578','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4578 MEMBER','1','1862') +('308','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"308 MEMBER','1','1863') +('5116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5116 MEMBER','1','1864') +('9019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9019 MEMBER','1','1865') +('4642','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',477.94,'999','1','"4642 MEMBER','1','1866') +('4935','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',298.60,'999','0','"4935 MEMBER','1','1867') +('6107','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',495.52,'999','0','"6107 MEMBER','1','1868') +('4671','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',836.11,'999','1','"4671 MEMBER','1','1869') +('6449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',122.32,'999','0','"6449 MEMBER','1','1870') +('6153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',256.03,'999','0','"6153 MEMBER','1','1871') +('6690','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',776.04,'999','0','"6690 MEMBER','1','1872') +('5017','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5017 MEMBER','1','1873') +('6585','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',288.35,'999','1','"6585 MEMBER','1','1874') +('1891','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1891 MEMBER','1','1875') +('4397','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"4397 MEMBER','1','1876') +('6605','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',240.80,'999','1','"6605 MEMBER','1','1877') +('1547','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',790.44,'999','1','"1547 MEMBER','1','1878') +('7071','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7071 MEMBER','1','1879') +('7042','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7042 MEMBER','1','1880') +('7056','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7056 MEMBER','1','1881') +('7097','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7097 MEMBER','1','1882') +('7076','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7076 MEMBER','1','1883') +('7092','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7092 MEMBER','1','1884') +('7129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7129 MEMBER','1','1885') +('7145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7145 MEMBER','1','1886') +('6342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3146.04,'999','0','"6342 MEMBER','1','1887') +('1318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1318 MEMBER','1','1888') +('1575','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',908.41,'999','1','"1575 MEMBER','1','1889') +('4599','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2646.51,'999','0','"4599 MEMBER','1','1890') +('9099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9099 MEMBER','1','1891') +('4430','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1112.98,'999','0','"4430 MEMBER','1','1892') +('4786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1776.21,'999','0','"4786 MEMBER','1','1893') +('1850','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1850 MEMBER','1','1894') +('4701','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',271.40,'999','1','"4701 MEMBER','1','1895') +('150','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1082.50,'999','1','"150 MEMBER','1','1896') +('5084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5084 MEMBER','1','1897') +('2932','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2932 MEMBER','1','1898') +('4589','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',593.54,'999','0','"4589 MEMBER','1','1899') +('262','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"262 MEMBER','1','1900') +('4899','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',262.28,'999','1','"4899 MEMBER','1','1901') +('4992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4992 MEMBER','1','1902') +('6150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1378.67,'999','0','"6150 MEMBER','1','1903') +('3083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1830.34,'999','1','"3083 MEMBER','1','1904') +('2375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1189.87,'999','0','"2375 MEMBER','1','1905') +('6695','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',224.73,'999','0','"6695 MEMBER','1','1906') +('4681','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1218.93,'999','0','"4681 MEMBER','1','1907') +('6526','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',269.06,'999','0','"6526 MEMBER','1','1908') +('4161','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',411.66,'999','1','"4161 MEMBER','1','1909') +('1435','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"1435 MEMBER','1','1910') +('1857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1857 MEMBER','1','1911') +('6331','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',458.81,'999','0','"6331 MEMBER','1','1912') +('9092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9092 MEMBER','1','1913') +('4256','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1054.32,'999','0','"4256 MEMBER','1','1914') +('1494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','REG','0','0','0',0.00,'999','0','"1494 MEMBER','1','1915') +('2475','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2475 MEMBER','1','1916') +('6623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',108.50,'999','1','"6623 MEMBER','1','1917') +('6619','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',955.13,'999','1','"6619 MEMBER','1','1918') +('4173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',563.76,'999','1','"4173 MEMBER','1','1919') +('4743','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',69.47,'999','1','"4743 MEMBER','1','1920') +('4204','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3065.96,'999','0','"4204 MEMBER','1','1921') +('9030','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9030 MEMBER','1','1922') +('4398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.21,'999','1','"4398 MEMBER','1','1923') +('2903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2903 MEMBER','1','1924') +('6632','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',394.43,'999','0','"6632 MEMBER','1','1925') +('4719','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',55.78,'999','1','"4719 MEMBER','1','1926') +('105','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"105 MEMBER','1','1927') +('4277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',61.70,'999','1','"4277 MEMBER','1','1928') +('4293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4293 MEMBER','1','1929') +('5086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5086 MEMBER','1','1930') +('4564','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1575.65,'999','1','"4564 MEMBER','1','1931') +('4403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.69,'999','1','"4403 MEMBER','1','1932') +('5077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5077 MEMBER','1','1933') +('990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"990 MEMBER','1','1934') +('9041','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9041 MEMBER','1','1935') +('5123','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5123 MEMBER','1','1936') +('4843','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2743.97,'999','1','"4843 MEMBER','1','1937') +('770','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',529.59,'999','0','"770 MEMBER','1','1938') +('4081','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5807.50,'999','0','"4081 MEMBER','1','1939') +('4697','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',683.15,'999','1','"4697 MEMBER','1','1940') +('5010','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5010 MEMBER','1','1941') +('6771','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',54.86,'999','0','"6771 MEMBER','1','1942') +('4613','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4613 MEMBER','1','1943') +('965','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"965 MEMBER','1','1944') +('6821','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6821 MEMBER','1','1945') +('6768','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',224.83,'999','0','"6768 MEMBER','1','1946') +('6270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',208.73,'999','1','"6270 MEMBER','1','1947') +('6217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3872.43,'999','0','"6217 MEMBER','1','1948') +('2761','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2761 MEMBER','1','1949') +('7069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7069 MEMBER','1','1950') +('7072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7072 MEMBER','1','1951') +('7014','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7014 MEMBER','1','1952') +('7024','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7024 MEMBER','1','1953') +('7031','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7031 MEMBER','1','1954') +('7062','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7062 MEMBER','1','1955') +('6299','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',963.05,'999','1','"6299 MEMBER','1','1956') +('5004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5004 MEMBER','1','1957') +('2213','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2213 MEMBER','1','1958') +('203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',184.90,'999','0','"203 MEMBER','1','1959') +('2419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3016.81,'999','1','"2419 MEMBER','1','1960') +('256','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',844.93,'999','0','"256 MEMBER','1','1961') +('3056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',62.59,'999','1','"3056 MEMBER','1','1962') +('4137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2723.03,'999','0','"4137 MEMBER','1','1963') +('2864','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4381.63,'999','0','"2864 MEMBER','1','1964') +('3311','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',207.79,'999','1','"3311 MEMBER','1','1965') +('4780','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',8.36,'999','0','"4780 MEMBER','1','1966') +('3046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3046 MEMBER','1','1967') +('1636','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1636 MEMBER','1','1968') +('4050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',167.24,'999','0','"4050 MEMBER','1','1969') +('75','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8901.37,'999','0','"75 MEMBER','1','1970') +('2159','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2159 MEMBER','1','1971') +('6149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9285.23,'999','0','"6149 MEMBER','1','1972') +('4533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1436.71,'999','1','"4533 MEMBER','1','1973') +('520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',111.60,'999','1','"520 MEMBER','1','1974') +('378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',39.40,'999','1','"378 MEMBER','1','1975') +('1255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1255 MEMBER','1','1976') +('1629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',705.25,'999','0','"1629 MEMBER','1','1977') +('6422','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','1',1678.68,'999','0','"6422 MEMBER','1','1978') +('2305','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2305 MEMBER','1','1979') +('4534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',691.66,'999','0','"4534 MEMBER','1','1980') +('4933','2','LASTNAME','FIRSTNAME',999.99,'-19.99','0',0.00,'1','0','1','INACT','0','0','0',925.09,'999','1','"4933 MEMBER','1','1981') +('4444','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4444 MEMBER','1','1982') +('6764','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',43.27,'999','0','"6764 MEMBER','1','1983') +('6395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',566.19,'999','0','"6395 MEMBER','1','1984') +('6298','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',524.26,'999','0','"6298 MEMBER','1','1985') +('1409','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1409 MEMBER','1','1986') +('4903','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1017.22,'999','1','"4903 MEMBER','1','1987') +('6801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6801 MEMBER','1','1988') +('4248','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',489.39,'999','0','"4248 MEMBER','1','1989') +('1589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1589 MEMBER','1','1990') +('4129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',119.56,'999','1','"4129 MEMBER','1','1991') +('4768','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',397.07,'999','0','"4768 MEMBER','1','1992') +('3375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3375 MEMBER','1','1993') +('6455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',488.01,'999','0','"6455 MEMBER','1','1994') +('904','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"904 MEMBER','1','1995') +('4480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.53,'999','1','"4480 MEMBER','1','1996') +('6789','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',21.73,'999','0','"6789 MEMBER','1','1997') +('1550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1217.90,'999','1','"1550 MEMBER','1','1998') +('4639','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',193.17,'999','0','"4639 MEMBER','1','1999') +('234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.28,'999','1','"234 MEMBER','1','2000') +('4910','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1315.76,'999','0','"4910 MEMBER','1','2001') +('4018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4018 MEMBER','1','2002') +('2375','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1189.87,'999','0','"2375 MEMBER','1','2003') +('6580','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1087.08,'999','1','"6580 MEMBER','1','2004') +('972','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',561.71,'999','1','"972 MEMBER','1','2005') +('9006','1','LASTNAME','FIRSTNAME',999.99,103.12,'0',0.00,'1','1','1','TERM','0','0','0',393.75,'999','0','"9006 MEMBER','1','2006') +('2333','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4346.02,'999','0','"2333 MEMBER','1','2007') +('4336','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1874.66,'999','1','"4336 MEMBER','1','2008') +('2955','2','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','1','1','PC','1','0','0',791.17,'999','1','"2955 MEMBER','1','2009') +('6769','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',163.13,'999','0','"6769 MEMBER','1','2010') +('6149','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9285.23,'999','0','"6149 MEMBER','1','2011') +('6296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1809.90,'999','0','"6296 MEMBER','1','2012') +('6487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1362.64,'999','0','"6487 MEMBER','1','2013') +('9024','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9024 MEMBER','1','2014') +('4278','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',563.57,'999','1','"4278 MEMBER','1','2015') +('4770','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2740.33,'999','0','"4770 MEMBER','1','2016') +('4145','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',716.24,'999','0','"4145 MEMBER','1','2017') +('4821','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1058.96,'999','0','"4821 MEMBER','1','2018') +('3102','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',505.35,'999','0','"3102 MEMBER','1','2019') +('6192','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',510.74,'999','0','"6192 MEMBER','1','2020') +('7044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7044 MEMBER','1','2021') +('7051','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7051 MEMBER','1','2022') +('7053','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7053 MEMBER','1','2023') +('6999','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6999 MEMBER','1','2024') +('4963','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',381.44,'999','1','"4963 MEMBER','1','2025') +('5057','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5057 MEMBER','1','2026') +('6208','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.62,'999','1','"6208 MEMBER','1','2027') +('4211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4211 MEMBER','1','2028') +('4384','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',75.95,'999','1','"4384 MEMBER','1','2029') +('4036','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',476.91,'999','1','"4036 MEMBER','1','2030') +('4175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2778.78,'999','0','"4175 MEMBER','1','2031') +('6444','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',511.48,'999','0','"6444 MEMBER','1','2032') +('187','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1804.51,'999','0','"187 MEMBER','1','2033') +('6715','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',387.73,'999','0','"6715 MEMBER','1','2034') +('5162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',375.02,'999','0','"5162 MEMBER','1','2035') +('589','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1679.73,'999','0','"589 MEMBER','1','2036') +('232','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1902.51,'999','0','"232 MEMBER','1','2037') +('4030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',361.26,'999','0','"4030 MEMBER','1','2038') +('4724','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2120.30,'999','1','"4724 MEMBER','1','2039') +('9038','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9038 MEMBER','1','2040') +('6155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5545.22,'999','0','"6155 MEMBER','1','2041') +('4090','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',345.57,'999','0','"4090 MEMBER','1','2042') +('9028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9028 MEMBER','1','2043') +('4611','2','LASTNAME','FIRSTNAME',NULL,63.27,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"4611 MEMBER','1','2044') +('4532','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',942.85,'999','0','"4532 MEMBER','1','2045') +('465','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1246.35,'999','0','"465 MEMBER','1','2046') +('4095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',719.68,'999','0','"4095 MEMBER','1','2047') +('3342','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1310.90,'999','0','"3342 MEMBER','1','2048') +('4331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',384.26,'999','0','"4331 MEMBER','1','2049') +('4957','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3015.95,'999','0','"4957 MEMBER','1','2050') +('4439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1606.71,'999','0','"4439 MEMBER','1','2051') +('4582','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4641.01,'999','1','"4582 MEMBER','1','2052') +('2635','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2635 MEMBER','1','2053') +('30','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4240.90,'999','1','"30 MEMBER','1','2054') +('321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',30.34,'999','1','"321 MEMBER','1','2055') +('4507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2266.60,'999','0','"4507 MEMBER','1','2056') +('2581','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',116.75,'999','1','"2581 MEMBER','1','2057') +('2707','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1465.95,'999','1','"2707 MEMBER','1','2058') +('473','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',44.86,'999','1','"473 MEMBER','1','2059') +('519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',428.94,'999','1','"519 MEMBER','1','2060') +('509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',366.72,'999','0','"509 MEMBER','1','2061') +('6168','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2062.16,'999','0','"6168 MEMBER','1','2062') +('4407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',116.77,'999','1','"4407 MEMBER','1','2063') +('1564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',851.14,'999','1','"1564 MEMBER','1','2064') +('7012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"7012 MEMBER','1','2065') +('6376','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3599.91,'999','0','"6376 MEMBER','1','2066') +('6708','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',92.83,'999','0','"6708 MEMBER','1','2067') +('4567','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',28.95,'999','0','"4567 MEMBER','1','2068') +('6594','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',145.76,'999','1','"6594 MEMBER','1','2069') +('9098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9098 MEMBER','1','2070') +('4060','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',880.72,'999','0','"4060 MEMBER','1','2071') +('2843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2843 MEMBER','1','2072') +('4226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4226 MEMBER','1','2073') +('2522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5.86,'999','1','"2522 MEMBER','1','2074') +('2155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2155 MEMBER','1','2075') +('294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"294 MEMBER','1','2076') +('9038','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9038 MEMBER','1','2077') +('539','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4545.56,'999','0','"539 MEMBER','1','2078') +('2159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2159 MEMBER','1','2079') +('4164','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1481.63,'999','0','"4164 MEMBER','1','2080') +('4547','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',349.71,'999','0','"4547 MEMBER','1','2081') +('561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"561 MEMBER','1','2082') +('2795','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',158.63,'999','0','"2795 MEMBER','1','2083') +('76','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2845.06,'999','0','"76 MEMBER','1','2084') +('7048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7048 MEMBER','1','2085') +('7067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7067 MEMBER','1','2086') +('7036','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7036 MEMBER','1','2087') +('7070','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7070 MEMBER','1','2088') +('7081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7081 MEMBER','1','2089') +('7095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7095 MEMBER','1','2090') +('7098','1','LASTNAME','FIRSTNAME',999.99,39.75,'10',80.00,'1','1','1','PC','3','1','0',0.00,'999','1','"7098 MEMBER','1','2091') +('7102','1','LASTNAME','FIRSTNAME',999.99,23.23,'10',80.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7102 MEMBER','1','2092') +('7075','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7075 MEMBER','1','2093') +('7113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7113 MEMBER','1','2094') +('4607','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4607 MEMBER','1','2095') +('2213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2213 MEMBER','1','2096') +('4261','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4261 MEMBER','1','2097') +('2114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2114 MEMBER','1','2098') +('3004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',253.34,'999','0','"3004 MEMBER','1','2099') +('9014','2','LASTNAME','FIRSTNAME',999.99,196.87,'0',0.00,'1','0','1','TERM','0','0','0',382.50,'999','0','"9014 MEMBER','1','2100') +('4843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2743.97,'999','1','"4843 MEMBER','1','2101') +('6612','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',542.60,'999','0','"6612 MEMBER','1','2102') +('26','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1940.89,'999','0','"26 MEMBER','1','2103') +('6432','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',274.37,'999','1','"6432 MEMBER','1','2104') +('1627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',515.59,'999','0','"1627 MEMBER','1','2105') +('4356','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4356 MEMBER','1','2106') +('4888','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',21.69,'999','0','"4888 MEMBER','1','2107') +('6619','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',955.13,'999','1','"6619 MEMBER','1','2108') +('92','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',2875.65,'999','1','"92 MEMBER','1','2109') +('6672','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',56.57,'999','0','"6672 MEMBER','1','2110') +('2866','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',388.08,'999','0','"2866 MEMBER','1','2111') +('2350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2350 MEMBER','1','2112') +('335','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.70,'999','1','"335 MEMBER','1','2113') +('2373','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4797.82,'999','0','"2373 MEMBER','1','2114') +('6627','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',112.78,'999','1','"6627 MEMBER','1','2115') +('1230','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1592.57,'999','1','"1230 MEMBER','1','2116') +('4851','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',98.47,'999','0','"4851 MEMBER','1','2117') +('1300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1300 MEMBER','1','2118') +('6680','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',722.60,'999','0','"6680 MEMBER','1','2119') +('9126','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9126 MEMBER','1','2120') +('2052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2052 MEMBER','1','2121') +('4637','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4637 MEMBER','1','2122') +('4648','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1560.27,'999','0','"4648 MEMBER','1','2123') +('112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',591.68,'999','1','"112 MEMBER','1','2124') +('2866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',388.08,'999','0','"2866 MEMBER','1','2125') +('281','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"281 MEMBER','1','2126') +('6295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1508.64,'999','0','"6295 MEMBER','1','2127') +('1538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1538 MEMBER','1','2128') +('1008','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2.69,'999','0','"1008 MEMBER','1','2129') +('6498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',488.89,'999','0','"6498 MEMBER','1','2130') +('6744','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',211.80,'999','0','"6744 MEMBER','1','2131') +('92','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2875.65,'999','1','"92 MEMBER','1','2132') +('9008','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9008 MEMBER','1','2133') +('229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7249.90,'999','0','"229 MEMBER','1','2134') +('2129','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',164.31,'999','0','"2129 MEMBER','1','2135') +('2366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3953.34,'999','0','"2366 MEMBER','1','2136') +('4532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',942.85,'999','0','"4532 MEMBER','1','2137') +('4285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1080.78,'999','0','"4285 MEMBER','1','2138') +('4679','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',78.06,'999','1','"4679 MEMBER','1','2139') +('4051','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4051 MEMBER','1','2140') +('6801','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6801 MEMBER','1','2141') +('6647','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',610.23,'999','0','"6647 MEMBER','1','2142') +('4830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',944.33,'999','1','"4830 MEMBER','1','2143') +('6712','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',512.31,'999','1','"6712 MEMBER','1','2144') +('355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1373.45,'999','1','"355 MEMBER','1','2145') +('4317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4012.19,'999','0','"4317 MEMBER','1','2146') +('6854','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',NULL,'999','0','"6854 MEMBER','1','2147') +('206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"206 MEMBER','1','2148') +('2996','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2996 MEMBER','1','2149') +('6439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',752.00,'999','1','"6439 MEMBER','1','2150') +('3','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3 MEMBER','1','2151') +('4897','3','LASTNAME','FIRSTNAME',999.99,27.34,'10',100.00,'1','0','1','PC','3','1','0',4164.27,'999','0','"4897 MEMBER','1','2152') +('7039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7039 MEMBER','1','2153') +('7023','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7023 MEMBER','1','2154') +('7076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7076 MEMBER','1','2155') +('7104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7104 MEMBER','1','2156') +('7071','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7071 MEMBER','1','2157') +('7082','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7082 MEMBER','1','2158') +('7091','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7091 MEMBER','1','2159') +('7138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7138 MEMBER','1','2160') +('7105','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7105 MEMBER','1','2161') +('6515','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1375.41,'999','0','"6515 MEMBER','1','2162') +('5178','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5178 MEMBER','1','2163') +('134','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1379.87,'999','0','"134 MEMBER','1','2164') +('2089','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"2089 MEMBER','1','2165') +('341','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',231.75,'999','1','"341 MEMBER','1','2166') +('2205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2205 MEMBER','1','2167') +('3023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5593.46,'999','0','"3023 MEMBER','1','2168') +('4189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4189 MEMBER','1','2169') +('4064','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"4064 MEMBER','1','2170') +('9169','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9169 MEMBER','1','2171') +('232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1902.51,'999','0','"232 MEMBER','1','2172') +('931','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',214.61,'999','1','"931 MEMBER','1','2173') +('4806','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.83,'999','0','"4806 MEMBER','1','2174') +('40','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',489.85,'999','1','"40 MEMBER','1','2175') +('3302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2371.18,'999','0','"3302 MEMBER','1','2176') +('4296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',69.99,'999','1','"4296 MEMBER','1','2177') +('6392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',722.16,'999','0','"6392 MEMBER','1','2178') +('5162','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',375.02,'999','0','"5162 MEMBER','1','2179') +('166','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.17,'999','1','"166 MEMBER','1','2180') +('3356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3356 MEMBER','1','2181') +('9076','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',250.00,'1','0','1','TERM','0','0','0',63.75,'999','0','"9076 MEMBER','1','2182') +('6582','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',495.56,'999','0','"6582 MEMBER','1','2183') +('1698','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1698 MEMBER','1','2184') +('6703','1','LASTNAME','FIRSTNAME',999.99,43.37,'10',80.00,'1','1','1','PC','3','1','0',591.96,'999','0','"6703 MEMBER','1','2185') +('6478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',654.24,'999','0','"6478 MEMBER','1','2186') +('9018','2','LASTNAME','FIRSTNAME',999.99,78.13,'0',0.00,'1','0','1','TERM','0','0','0',187.50,'999','0','"9018 MEMBER','1','2187') +('6854','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6854 MEMBER','1','2188') +('6643','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',214.73,'999','0','"6643 MEMBER','1','2189') +('1865','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2033.08,'999','0','"1865 MEMBER','1','2190') +('4553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2910.84,'999','0','"4553 MEMBER','1','2191') +('6355','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',875.47,'999','0','"6355 MEMBER','1','2192') +('6766','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',95.43,'999','0','"6766 MEMBER','1','2193') +('4141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3176.14,'999','0','"4141 MEMBER','1','2194') +('4733','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',877.96,'999','0','"4733 MEMBER','1','2195') +('6666','2','LASTNAME','FIRSTNAME',999.99,17.48,'0',20.00,'1','0','1','PC','1','0','0',222.09,'999','1','"6666 MEMBER','1','2196') +('1112','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6087.82,'999','0','"1112 MEMBER','1','2197') +('4348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',97.14,'999','1','"4348 MEMBER','1','2198') +('6826','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6826 MEMBER','1','2199') +('3350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',110.36,'999','1','"3350 MEMBER','1','2200') +('9044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',67.50,'999','0','"9044 MEMBER','1','2201') +('4430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1112.98,'999','0','"4430 MEMBER','1','2202') +('428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',152.12,'999','1','"428 MEMBER','1','2203') +('6121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2194.54,'999','0','"6121 MEMBER','1','2204') +('9020','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9020 MEMBER','1','2205') +('477','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"477 MEMBER','1','2206') +('2094','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2094.95,'999','0','"2094 MEMBER','1','2207') +('238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"238 MEMBER','1','2208') +('4769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.66,'999','1','"4769 MEMBER','1','2209') +('4522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',205.95,'999','1','"4522 MEMBER','1','2210') +('433','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"433 MEMBER','1','2211') +('1372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2522.94,'999','0','"1372 MEMBER','1','2212') +('5149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',489.64,'999','0','"5149 MEMBER','1','2213') +('6729','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',26.02,'999','1','"6729 MEMBER','1','2214') +('3208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',59.50,'999','1','"3208 MEMBER','1','2215') +('41','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',3.24,'999','1','"41 MEMBER','1','2216') +('1636','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"1636 MEMBER','1','2217') +('6338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',145.02,'999','1','"6338 MEMBER','1','2218') +('4653','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',147.86,'999','1','"4653 MEMBER','1','2219') +('6269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1004.56,'999','1','"6269 MEMBER','1','2220') +('2988','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2988 MEMBER','1','2221') +('4619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2151.67,'999','0','"4619 MEMBER','1','2222') +('6815','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6815 MEMBER','1','2223') +('4606','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1368.05,'999','0','"4606 MEMBER','1','2224') +('4633','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.44,'999','0','"4633 MEMBER','1','2225') +('5191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5191 MEMBER','1','2226') +('6986','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6986 MEMBER','1','2227') +('7037','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7037 MEMBER','1','2228') +('7061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7061 MEMBER','1','2229') +('7065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7065 MEMBER','1','2230') +('7013','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7013 MEMBER','1','2231') +('7029','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7029 MEMBER','1','2232') +('4641','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4641 MEMBER','1','2233') +('4599','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2646.51,'999','0','"4599 MEMBER','1','2234') +('4592','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"4592 MEMBER','1','2235') +('6253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',300.39,'999','1','"6253 MEMBER','1','2236') +('7744','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7744 MEMBER','1','2237') +('6240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1748.47,'999','0','"6240 MEMBER','1','2238') +('9035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9035 MEMBER','1','2239') +('5064','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5064 MEMBER','1','2240') +('2561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',977.15,'999','0','"2561 MEMBER','1','2241') +('4987','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1466.10,'999','0','"4987 MEMBER','1','2242') +('9484','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9484 MEMBER','1','2243') +('7052','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7052 MEMBER','1','2244') +('4451','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5236.55,'999','0','"4451 MEMBER','1','2245') +('5096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5096 MEMBER','1','2246') +('5066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5066 MEMBER','1','2247') +('1808','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1808 MEMBER','1','2248') +('5147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',47.08,'999','0','"5147 MEMBER','1','2249') +('4531','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',423.66,'999','1','"4531 MEMBER','1','2250') +('6163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1517.26,'999','0','"6163 MEMBER','1','2251') +('4759','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',510.40,'999','1','"4759 MEMBER','1','2252') +('6292','1','LASTNAME','FIRSTNAME',999.99,19.82,'0',20.00,'1','1','1','PC','1','0','0',405.34,'999','0','"6292 MEMBER','1','2253') +('4047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4047 MEMBER','1','2254') +('6529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',737.78,'999','0','"6529 MEMBER','1','2255') +('4131','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1706.40,'999','0','"4131 MEMBER','1','2256') +('4329','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4329 MEMBER','1','2257') +('6200','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3794.61,'999','0','"6200 MEMBER','1','2258') +('2639','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2639 MEMBER','1','2259') +('4486','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',924.31,'999','1','"4486 MEMBER','1','2260') +('2815','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2815 MEMBER','1','2261') +('2749','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2057.59,'999','1','"2749 MEMBER','1','2262') +('6208','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.62,'999','1','"6208 MEMBER','1','2263') +('6790','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4.95,'999','0','"6790 MEMBER','1','2264') +('6777','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',20.44,'999','0','"6777 MEMBER','1','2265') +('1848','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1848 MEMBER','1','2266') +('1021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',378.35,'999','1','"1021 MEMBER','1','2267') +('690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"690 MEMBER','1','2268') +('4976','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',42.37,'999','1','"4976 MEMBER','1','2269') +('4875','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7519.87,'999','0','"4875 MEMBER','1','2270') +('6741','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',99.05,'999','1','"6741 MEMBER','1','2271') +('2227','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1828.63,'999','0','"2227 MEMBER','1','2272') +('4434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4434 MEMBER','1','2273') +('4025','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',393.21,'999','0','"4025 MEMBER','1','2274') +('507','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2471.34,'999','0','"507 MEMBER','1','2275') +('6418','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2034.68,'999','1','"6418 MEMBER','1','2276') +('534','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3113.71,'999','0','"534 MEMBER','1','2277') +('4325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',92.25,'999','0','"4325 MEMBER','1','2278') +('6223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',563.80,'999','0','"6223 MEMBER','1','2279') +('4788','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',284.46,'999','1','"4788 MEMBER','1','2280') +('6373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8092.90,'999','0','"6373 MEMBER','1','2281') +('2773','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2773 MEMBER','1','2282') +('2581','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',116.75,'999','1','"2581 MEMBER','1','2283') +('5098','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',4370.95,'999','0','"5098 MEMBER','1','2284') +('2853','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2853 MEMBER','1','2285') +('6389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',768.95,'999','0','"6389 MEMBER','1','2286') +('1028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',714.08,'999','1','"1028 MEMBER','1','2287') +('843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1434.56,'999','0','"843 MEMBER','1','2288') +('2483','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2483 MEMBER','1','2289') +('4991','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4991 MEMBER','1','2290') +('4674','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',69.18,'999','0','"4674 MEMBER','1','2291') +('49','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',176.21,'999','1','"49 MEMBER','1','2292') +('3385','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',280.74,'999','0','"3385 MEMBER','1','2293') +('4876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',438.20,'999','0','"4876 MEMBER','1','2294') +('4634','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',283.23,'999','0','"4634 MEMBER','1','2295') +('3116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1379.93,'999','0','"3116 MEMBER','1','2296') +('4888','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',21.69,'999','0','"4888 MEMBER','1','2297') +('5193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5193 MEMBER','1','2298') +('7033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7033 MEMBER','1','2299') +('7042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7042 MEMBER','1','2300') +('7056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7056 MEMBER','1','2301') +('7057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7057 MEMBER','1','2302') +('4944','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5466.21,'999','0','"4944 MEMBER','1','2303') +('4337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',275.79,'999','1','"4337 MEMBER','1','2304') +('2400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',185.64,'999','1','"2400 MEMBER','1','2305') +('4684','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',397.54,'999','0','"4684 MEMBER','1','2306') +('4017','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',974.27,'999','1','"4017 MEMBER','1','2307') +('337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.96,'999','0','"337 MEMBER','1','2308') +('1751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.88,'999','1','"1751 MEMBER','1','2309') +('489','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',166.77,'999','1','"489 MEMBER','1','2310') +('6386','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6386 MEMBER','1','2311') +('2639','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2639 MEMBER','1','2312') +('4916','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3156.90,'999','0','"4916 MEMBER','1','2313') +('6720','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',302.09,'999','0','"6720 MEMBER','1','2314') +('1510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1510 MEMBER','1','2315') +('4170','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4170 MEMBER','1','2316') +('2485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.87,'999','1','"2485 MEMBER','1','2317') +('330','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',90.75,'999','1','"330 MEMBER','1','2318') +('376','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',654.23,'999','0','"376 MEMBER','1','2319') +('6262','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',733.95,'999','0','"6262 MEMBER','1','2320') +('370','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.55,'999','1','"370 MEMBER','1','2321') +('3212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8761.06,'999','0','"3212 MEMBER','1','2322') +('3063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3063 MEMBER','1','2323') +('10233','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10233 MEMBER','1','2324') +('1174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',336.88,'999','1','"1174 MEMBER','1','2325') +('4886','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',128.62,'999','0','"4886 MEMBER','1','2326') +('1579','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',170.20,'999','1','"1579 MEMBER','1','2327') +('1354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1510.68,'999','1','"1354 MEMBER','1','2328') +('4565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',653.64,'999','1','"4565 MEMBER','1','2329') +('4705','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',102.20,'999','0','"4705 MEMBER','1','2330') +('917','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"917 MEMBER','1','2331') +('4329','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4329 MEMBER','1','2332') +('6386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1675.09,'999','1','"6386 MEMBER','1','2333') +('4229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',136.45,'999','1','"4229 MEMBER','1','2334') +('6553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2307.59,'999','0','"6553 MEMBER','1','2335') +('3091','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2733.95,'999','0','"3091 MEMBER','1','2336') +('3079','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1057.93,'999','0','"3079 MEMBER','1','2337') +('6340','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',734.83,'999','0','"6340 MEMBER','1','2338') +('1437','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2500.06,'999','0','"1437 MEMBER','1','2339') +('484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5359.41,'999','0','"484 MEMBER','1','2340') +('2701','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2701 MEMBER','1','2341') +('2930','1','LASTNAME','FIRSTNAME',999.99,11.64,'0',20.00,'1','1','1','PC','1','0','0',78.69,'999','1','"2930 MEMBER','1','2342') +('3273','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.13,'999','1','"3273 MEMBER','1','2343') +('2121','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',882.06,'999','1','"2121 MEMBER','1','2344') +('6630','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',472.73,'999','0','"6630 MEMBER','1','2345') +('6494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3591.07,'999','0','"6494 MEMBER','1','2346') +('9012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',393.75,'999','0','"9012 MEMBER','1','2347') +('4506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3551.94,'999','1','"4506 MEMBER','1','2348') +('5065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5065 MEMBER','1','2349') +('6646','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',622.62,'999','0','"6646 MEMBER','1','2350') +('540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1453.04,'999','0','"540 MEMBER','1','2351') +('4803','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',33.30,'999','0','"4803 MEMBER','1','2352') +('927','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"927 MEMBER','1','2353') +('5145','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',962.79,'999','0','"5145 MEMBER','1','2354') +('2684','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2684 MEMBER','1','2355') +('4322','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.16,'999','1','"4322 MEMBER','1','2356') +('1372','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2522.94,'999','0','"1372 MEMBER','1','2357') +('4404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',91.37,'999','0','"4404 MEMBER','1','2358') +('208','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"208 MEMBER','1','2359') +('6110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3605.70,'999','0','"6110 MEMBER','1','2360') +('6291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',32.71,'999','0','"6291 MEMBER','1','2361') +('478','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',985.40,'999','1','"478 MEMBER','1','2362') +('6549','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',739.91,'999','1','"6549 MEMBER','1','2363') +('6717','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',172.43,'999','1','"6717 MEMBER','1','2364') +('1102','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3852.69,'999','0','"1102 MEMBER','1','2365') +('6427','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',411.84,'999','1','"6427 MEMBER','1','2366') +('4258','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2786.70,'999','0','"4258 MEMBER','1','2367') +('397','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"397 MEMBER','1','2368') +('1894','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',295.47,'999','1','"1894 MEMBER','1','2369') +('6367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',529.53,'999','0','"6367 MEMBER','1','2370') +('4802','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',345.64,'999','1','"4802 MEMBER','1','2371') +('109','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2819.31,'999','0','"109 MEMBER','1','2372') +('3329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',75.55,'999','1','"3329 MEMBER','1','2373') +('1314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1314 MEMBER','1','2374') +('4525','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',396.18,'999','0','"4525 MEMBER','1','2375') +('2284','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2284 MEMBER','1','2376') +('6631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',48.67,'999','1','"6631 MEMBER','1','2377') +('186','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',18.50,'999','1','"186 MEMBER','1','2378') +('1288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1092.41,'999','0','"1288 MEMBER','1','2379') +('2980','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2980 MEMBER','1','2380') +('4329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4329 MEMBER','1','2381') +('6653','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',114.50,'999','1','"6653 MEMBER','1','2382') +('494','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8843.42,'999','0','"494 MEMBER','1','2383') +('2373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4797.82,'999','0','"2373 MEMBER','1','2384') +('6228','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',628.96,'999','0','"6228 MEMBER','1','2385') +('4353','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4353 MEMBER','1','2386') +('6564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',220.79,'999','0','"6564 MEMBER','1','2387') +('4129','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',119.56,'999','1','"4129 MEMBER','1','2388') +('424','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',625.03,'999','1','"424 MEMBER','1','2389') +('1306','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7747.11,'999','0','"1306 MEMBER','1','2390') +('1600','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',985.93,'999','0','"1600 MEMBER','1','2391') +('6745','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',251.83,'999','0','"6745 MEMBER','1','2392') +('160','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"160 MEMBER','1','2393') +('9072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9072 MEMBER','1','2394') +('6638','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1991.89,'999','0','"6638 MEMBER','1','2395') +('387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"387 MEMBER','1','2396') +('3260','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3260 MEMBER','1','2397') +('5','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"5 MEMBER','1','2398') +('4243','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4243 MEMBER','1','2399') +('4933','1','LASTNAME','FIRSTNAME',999.99,'-19.99','0',0.00,'1','1','1','INACT','0','0','0',925.09,'999','1','"4933 MEMBER','1','2400') +('5099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5099 MEMBER','1','2401') +('4677','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1289.16,'999','1','"4677 MEMBER','1','2402') +('6151','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2439.53,'999','0','"6151 MEMBER','1','2403') +('456','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5372.18,'999','0','"456 MEMBER','1','2404') +('6112','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',364.90,'999','1','"6112 MEMBER','1','2405') +('4873','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1248.76,'999','1','"4873 MEMBER','1','2406') +('1621','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1621 MEMBER','1','2407') +('1048','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1048 MEMBER','1','2408') +('4771','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',4145.28,'999','0','"4771 MEMBER','1','2409') +('6274','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2197.14,'999','0','"6274 MEMBER','1','2410') +('214','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3376.61,'999','0','"214 MEMBER','1','2411') +('4439','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1606.71,'999','0','"4439 MEMBER','1','2412') +('153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2624.64,'999','0','"153 MEMBER','1','2413') +('4796','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4258.06,'999','1','"4796 MEMBER','1','2414') +('180','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4389.96,'999','0','"180 MEMBER','1','2415') +('6322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',267.76,'999','0','"6322 MEMBER','1','2416') +('7137','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7137 MEMBER','1','2417') +('360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"360 MEMBER','1','2418') +('5062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1609.40,'999','0','"5062 MEMBER','1','2419') +('4539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4.19,'999','1','"4539 MEMBER','1','2420') +('3065','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1229.98,'999','1','"3065 MEMBER','1','2421') +('6325','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',163.36,'999','1','"6325 MEMBER','1','2422') +('9135','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9135 MEMBER','1','2423') +('4441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4441 MEMBER','1','2424') +('4563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2075.38,'999','0','"4563 MEMBER','1','2425') +('6827','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',NULL,'999','0','"6827 MEMBER','1','2426') +('443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"443 MEMBER','1','2427') +('6003','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','0','1','REG','2','0','0',546.54,'999','0','"6003 MEMBER','1','2428') +('6736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',49.98,'999','1','"6736 MEMBER','1','2429') +('6846','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6846 MEMBER','1','2430') +('6833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6833 MEMBER','1','2431') +('9031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9031 MEMBER','1','2432') +('6844','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6844 MEMBER','1','2433') +('6982','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6982 MEMBER','1','2434') +('6990','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6990 MEMBER','1','2435') +('6997','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6997 MEMBER','1','2436') +('6998','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6998 MEMBER','1','2437') +('7040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7040 MEMBER','1','2438') +('7045','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7045 MEMBER','1','2439') +('7047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7047 MEMBER','1','2440') +('7050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7050 MEMBER','1','2441') +('2241','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2241 MEMBER','1','2442') +('319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"319 MEMBER','1','2443') +('3315','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1853.74,'999','1','"3315 MEMBER','1','2444') +('304','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3549.64,'999','0','"304 MEMBER','1','2445') +('4720','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1893.27,'999','0','"4720 MEMBER','1','2446') +('4160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1073.81,'999','1','"4160 MEMBER','1','2447') +('654','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',778.45,'999','1','"654 MEMBER','1','2448') +('4107','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4107 MEMBER','1','2449') +('6673','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',217.76,'999','1','"6673 MEMBER','1','2450') +('6788','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',70.78,'999','0','"6788 MEMBER','1','2451') +('489','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',166.77,'999','1','"489 MEMBER','1','2452') +('2210','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',127.09,'999','1','"2210 MEMBER','1','2453') +('4214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2657.90,'999','0','"4214 MEMBER','1','2454') +('467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2168.32,'999','0','"467 MEMBER','1','2455') +('6581','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',211.69,'999','1','"6581 MEMBER','1','2456') +('2692','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',26.71,'999','1','"2692 MEMBER','1','2457') +('4650','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',2561.04,'999','1','"4650 MEMBER','1','2458') +('394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"394 MEMBER','1','2459') +('6733','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',215.74,'999','0','"6733 MEMBER','1','2460') +('6638','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1991.89,'999','0','"6638 MEMBER','1','2461') +('9002','1','LASTNAME','FIRSTNAME',999.99,159.37,'0',0.00,'0','1','1','TERM','0','0','0',337.50,'999','0','"9002 MEMBER','1','2462') +('1533','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',14.04,'999','1','"1533 MEMBER','1','2463') +('6166','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',87.16,'999','1','"6166 MEMBER','1','2464') +('4683','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1662.47,'999','0','"4683 MEMBER','1','2465') +('1262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1262 MEMBER','1','2466') +('5109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5109 MEMBER','1','2467') +('6588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',420.08,'999','0','"6588 MEMBER','1','2468') +('45','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2249.53,'999','0','"45 MEMBER','1','2469') +('9003','2','LASTNAME','FIRSTNAME',999.99,'-63.74','0',0.00,'1','0','1','TERM','0','0','0',656.25,'999','0','"9003 MEMBER','1','2470') +('203','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',184.90,'999','0','"203 MEMBER','1','2471') +('4959','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1417.26,'999','1','"4959 MEMBER','1','2472') +('4179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',67.73,'999','1','"4179 MEMBER','1','2473') +('324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.34,'999','0','"324 MEMBER','1','2474') +('9043','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9043 MEMBER','1','2475') +('6442','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',845.69,'999','0','"6442 MEMBER','1','2476') +('4099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4099 MEMBER','1','2477') +('1429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"1429 MEMBER','1','2478') +('4204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3065.96,'999','0','"4204 MEMBER','1','2479') +('4908','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3201.91,'999','0','"4908 MEMBER','1','2480') +('1166','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2812.23,'999','0','"1166 MEMBER','1','2481') +('4140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',635.71,'999','0','"4140 MEMBER','1','2482') +('7','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"7 MEMBER','1','2483') +('6313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1622.67,'999','0','"6313 MEMBER','1','2484') +('3134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3134 MEMBER','1','2485') +('426','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',556.22,'999','1','"426 MEMBER','1','2486') +('4120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4120 MEMBER','1','2487') +('4540','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',658.27,'999','1','"4540 MEMBER','1','2488') +('6140','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1762.80,'999','0','"6140 MEMBER','1','2489') +('62','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1025.02,'999','0','"62 MEMBER','1','2490') +('3258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1567.98,'999','0','"3258 MEMBER','1','2491') +('2103','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1276.15,'999','0','"2103 MEMBER','1','2492') +('945','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',947.22,'999','0','"945 MEMBER','1','2493') +('1865','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2033.08,'999','0','"1865 MEMBER','1','2494') +('1008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2.69,'999','0','"1008 MEMBER','1','2495') +('6550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1241.57,'999','1','"6550 MEMBER','1','2496') +('5060','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5060 MEMBER','1','2497') +('4839','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',126.96,'999','0','"4839 MEMBER','1','2498') +('6420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2015.21,'999','0','"6420 MEMBER','1','2499') +('135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5622.04,'999','0','"135 MEMBER','1','2500') +('4388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4388 MEMBER','1','2501') +('4869','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1019.54,'999','0','"4869 MEMBER','1','2502') +('4617','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.01,'999','1','"4617 MEMBER','1','2503') +('5187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5187 MEMBER','1','2504') +('7010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"7010 MEMBER','1','2505') +('7019','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7019 MEMBER','1','2506') +('5181','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5181 MEMBER','1','2507') +('7053','2','LASTNAME','FIRSTNAME',999.00,0.00,'10',0.00,'1','0','1','PC','3','1','0',0.00,'999','0','"7053 MEMBER','1','2508') +('7110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7110 MEMBER','1','2509') +('7077','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7077 MEMBER','1','2510') +('7078','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7078 MEMBER','1','2511') +('4979','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6985.77,'999','0','"4979 MEMBER','1','2512') +('2','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2 MEMBER','1','2513') +('6238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',140.07,'999','1','"6238 MEMBER','1','2514') +('8568','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8568 MEMBER','1','2515') +('1751','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.88,'999','1','"1751 MEMBER','1','2516') +('4405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4405 MEMBER','1','2517') +('5600','1','LASTNAME','FIRSTNAME',999.99,2.32,'0',4000.00,'1','1','1','REG','0','0','0',5450.20,'999','0','"5600 MEMBER','1','2518') +('1433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3392.54,'999','0','"1433 MEMBER','1','2519') +('6587','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',336.30,'999','0','"6587 MEMBER','1','2520') +('257','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"257 MEMBER','1','2521') +('6636','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.18,'999','1','"6636 MEMBER','1','2522') +('3390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1002.78,'999','1','"3390 MEMBER','1','2523') +('4440','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4440 MEMBER','1','2524') +('6633','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',571.20,'999','0','"6633 MEMBER','1','2525') +('1356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',6.14,'999','0','"1356 MEMBER','1','2526') +('4170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4170 MEMBER','1','2527') +('4917','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',958.09,'999','0','"4917 MEMBER','1','2528') +('1804','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1804 MEMBER','1','2529') +('4180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4180 MEMBER','1','2530') +('1621','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1621 MEMBER','1','2531') +('1348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1348 MEMBER','1','2532') +('4698','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',83.68,'999','1','"4698 MEMBER','1','2533') +('6676','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',275.26,'999','1','"6676 MEMBER','1','2534') +('4983','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',652.24,'999','1','"4983 MEMBER','1','2535') +('383','2','LASTNAME','FIRSTNAME',999.99,45.56,'10',50.00,'1','0','1','PC','3','1','0',662.26,'999','0','"383 MEMBER','1','2536') +('2030','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',748.34,'999','1','"2030 MEMBER','1','2537') +('4028','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4028 MEMBER','1','2538') +('4848','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',934.50,'999','0','"4848 MEMBER','1','2539') +('6309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4392.96,'999','0','"6309 MEMBER','1','2540') +('1095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1095 MEMBER','1','2541') +('395','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"395 MEMBER','1','2542') +('109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2819.31,'999','0','"109 MEMBER','1','2543') +('4573','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6.00,'999','1','"4573 MEMBER','1','2544') +('6479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',216.88,'999','1','"6479 MEMBER','1','2545') +('4069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2195.36,'999','1','"4069 MEMBER','1','2546') +('650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"650 MEMBER','1','2547') +('2292','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',82.90,'999','1','"2292 MEMBER','1','2548') +('4865','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1297.15,'999','0','"4865 MEMBER','1','2549') +('59','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',171.18,'999','1','"59 MEMBER','1','2550') +('4391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',412.86,'999','1','"4391 MEMBER','1','2551') +('6347','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',317.95,'999','1','"6347 MEMBER','1','2552') +('6404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2189.04,'999','1','"6404 MEMBER','1','2553') +('1863','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1863 MEMBER','1','2554') +('3385','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',280.74,'999','0','"3385 MEMBER','1','2555') +('4111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',164.66,'999','0','"4111 MEMBER','1','2556') +('2139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7321.86,'999','0','"2139 MEMBER','1','2557') +('4354','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3015.95,'999','0','"4354 MEMBER','1','2558') +('2541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3346.71,'999','0','"2541 MEMBER','1','2559') +('3177','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5373.11,'999','0','"3177 MEMBER','1','2560') +('6401','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',191.68,'999','0','"6401 MEMBER','1','2561') +('6465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',585.35,'999','1','"6465 MEMBER','1','2562') +('47','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',893.80,'999','1','"47 MEMBER','1','2563') +('4573','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.00,'999','1','"4573 MEMBER','1','2564') +('6106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',309.34,'999','0','"6106 MEMBER','1','2565') +('4639','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',193.17,'999','0','"4639 MEMBER','1','2566') +('4529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',37.98,'999','1','"4529 MEMBER','1','2567') +('6349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',667.99,'999','0','"6349 MEMBER','1','2568') +('6762','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.17,'999','0','"6762 MEMBER','1','2569') +('6776','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',116.27,'999','0','"6776 MEMBER','1','2570') +('3313','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',467.81,'999','0','"3313 MEMBER','1','2571') +('4034','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1020.59,'999','0','"4034 MEMBER','1','2572') +('1744','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1744 MEMBER','1','2573') +('4398','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',38.21,'999','1','"4398 MEMBER','1','2574') +('4738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4738 MEMBER','1','2575') +('4141','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3176.14,'999','0','"4141 MEMBER','1','2576') +('6787','1','LASTNAME','FIRSTNAME',999.99,31.62,'10',40.00,'1','1','1','PC','3','1','0',28.33,'999','0','"6787 MEMBER','1','2577') +('2453','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',112.95,'999','0','"2453 MEMBER','1','2578') +('6565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1004.48,'999','0','"6565 MEMBER','1','2579') +('5180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5180 MEMBER','1','2580') +('4190','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4190 MEMBER','1','2581') +('4237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.48,'999','1','"4237 MEMBER','1','2582') +('6451','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',736.58,'999','1','"6451 MEMBER','1','2583') +('4832','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',278.74,'999','1','"4832 MEMBER','1','2584') +('2550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3351.96,'999','1','"2550 MEMBER','1','2585') +('1791','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1830.28,'999','0','"1791 MEMBER','1','2586') +('3252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'1','1','1','REG','0','0','0',28.18,'999','0','"3252 MEMBER','1','2587') +('6277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1045.60,'999','1','"6277 MEMBER','1','2588') +('6442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',845.69,'999','0','"6442 MEMBER','1','2589') +('6428','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',198.84,'999','0','"6428 MEMBER','1','2590') +('280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"280 MEMBER','1','2591') +('212','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4961.79,'999','0','"212 MEMBER','1','2592') +('2355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',1803.03,'999','0','"2355 MEMBER','1','2593') +('6379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',353.62,'999','0','"6379 MEMBER','1','2594') +('4225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6630.46,'999','0','"4225 MEMBER','1','2595') +('6794','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8.43,'999','0','"6794 MEMBER','1','2596') +('941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"941 MEMBER','1','2597') +('278','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"278 MEMBER','1','2598') +('921','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"921 MEMBER','1','2599') +('2788','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2788 MEMBER','1','2600') +('4790','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',189.68,'999','1','"4790 MEMBER','1','2601') +('6705','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',10.72,'999','0','"6705 MEMBER','1','2602') +('4689','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',692.62,'999','0','"4689 MEMBER','1','2603') +('5500','1','LASTNAME','FIRSTNAME',999.99,389.43,'0',2500.00,'1','1','1','REG','0','0','0',5462.40,'999','0','"5500 MEMBER','1','2604') +('2016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2016 MEMBER','1','2605') +('4643','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',386.73,'999','1','"4643 MEMBER','1','2606') +('6707','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',614.51,'999','0','"6707 MEMBER','1','2607') +('4942','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.36,'999','1','"4942 MEMBER','1','2608') +('2174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2174 MEMBER','1','2609') +('1478','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1327.20,'999','0','"1478 MEMBER','1','2610') +('4180','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4180 MEMBER','1','2611') +('6399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',752.99,'999','0','"6399 MEMBER','1','2612') +('6154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',457.18,'999','1','"6154 MEMBER','1','2613') +('6184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',651.71,'999','1','"6184 MEMBER','1','2614') +('6690','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',776.04,'999','0','"6690 MEMBER','1','2615') +('9023','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','REG','0','0','0',0.00,'999','0','"9023 MEMBER','1','2616') +('2255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',792.34,'999','1','"2255 MEMBER','1','2617') +('3157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3157 MEMBER','1','2618') +('7005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"7005 MEMBER','1','2619') +('1237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1237 MEMBER','1','2620') +('6612','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',542.60,'999','0','"6612 MEMBER','1','2621') +('4427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',861.98,'999','0','"4427 MEMBER','1','2622') +('4191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',367.44,'999','0','"4191 MEMBER','1','2623') +('4481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',967.89,'999','0','"4481 MEMBER','1','2624') +('2596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',301.63,'999','1','"2596 MEMBER','1','2625') +('2534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2534 MEMBER','1','2626') +('1786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',247.03,'999','0','"1786 MEMBER','1','2627') +('6683','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',97.04,'999','0','"6683 MEMBER','1','2628') +('846','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',482.04,'999','0','"846 MEMBER','1','2629') +('334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"334 MEMBER','1','2630') +('107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6050.68,'999','0','"107 MEMBER','1','2631') +('6530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',73.42,'999','1','"6530 MEMBER','1','2632') +('6549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',739.91,'999','1','"6549 MEMBER','1','2633') +('6139','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1488.19,'999','0','"6139 MEMBER','1','2634') +('1850','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1850 MEMBER','1','2635') +('4105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3026.38,'999','0','"4105 MEMBER','1','2636') +('6700','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',823.80,'999','0','"6700 MEMBER','1','2637') +('2100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2730.72,'999','0','"2100 MEMBER','1','2638') +('6184','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',651.71,'999','1','"6184 MEMBER','1','2639') +('6980','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6980 MEMBER','1','2640') +('5182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5182 MEMBER','1','2641') +('7043','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7043 MEMBER','1','2642') +('7049','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7049 MEMBER','1','2643') +('7062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7062 MEMBER','1','2644') +('7015','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7015 MEMBER','1','2645') +('5181','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5181 MEMBER','1','2646') +('7051','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7051 MEMBER','1','2647') +('7054','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7054 MEMBER','1','2648') +('7073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7073 MEMBER','1','2649') +('7075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7075 MEMBER','1','2650') +('9058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9058 MEMBER','1','2651') +('544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"544 MEMBER','1','2652') +('4545','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',470.86,'999','0','"4545 MEMBER','1','2653') +('975','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',96.50,'999','0','"975 MEMBER','1','2654') +('142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2459.40,'999','0','"142 MEMBER','1','2655') +('4380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',201.19,'999','1','"4380 MEMBER','1','2656') +('2857','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2857 MEMBER','1','2657') +('3071','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',71.63,'999','1','"3071 MEMBER','1','2658') +('1000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',318.81,'999','1','"1000 MEMBER','1','2659') +('4650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2561.04,'999','1','"4650 MEMBER','1','2660') +('2627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',432.67,'999','1','"2627 MEMBER','1','2661') +('4068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4068 MEMBER','1','2662') +('9030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9030 MEMBER','1','2663') +('6464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6464 MEMBER','1','2664') +('413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1200.35,'999','0','"413 MEMBER','1','2665') +('4368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4368 MEMBER','1','2666') +('4259','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1878.28,'999','0','"4259 MEMBER','1','2667') +('204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',607.19,'999','1','"204 MEMBER','1','2668') +('6746','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2.99,'999','0','"6746 MEMBER','1','2669') +('3375','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"3375 MEMBER','1','2670') +('4590','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',393.80,'999','0','"4590 MEMBER','1','2671') +('6700','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',823.80,'999','0','"6700 MEMBER','1','2672') +('4366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',405.23,'999','1','"4366 MEMBER','1','2673') +('6372','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2196.42,'999','0','"6372 MEMBER','1','2674') +('3179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3179 MEMBER','1','2675') +('2742','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',93.42,'999','1','"2742 MEMBER','1','2676') +('5067','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5067 MEMBER','1','2677') +('6646','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',622.62,'999','0','"6646 MEMBER','1','2678') +('83','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',916.84,'999','0','"83 MEMBER','1','2679') +('380','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1528.51,'999','0','"380 MEMBER','1','2680') +('6565','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1004.48,'999','0','"6565 MEMBER','1','2681') +('4844','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',605.56,'999','0','"4844 MEMBER','1','2682') +('9000','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',656.25,'999','0','"9000 MEMBER','1','2683') +('3298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2113.57,'999','0','"3298 MEMBER','1','2684') +('4589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',593.54,'999','0','"4589 MEMBER','1','2685') +('1496','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2403.69,'999','1','"1496 MEMBER','1','2686') +('6750','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',218.44,'999','0','"6750 MEMBER','1','2687') +('2243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2243 MEMBER','1','2688') +('2650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',446.60,'999','1','"2650 MEMBER','1','2689') +('6111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',406.20,'999','1','"6111 MEMBER','1','2690') +('510','1','LASTNAME','FIRSTNAME',999.99,7.24,'0',20.00,'1','1','1','PC','1','0','0',4652.69,'999','0','"510 MEMBER','1','2691') +('4318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4318 MEMBER','1','2692') +('1302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','REG','0','0','0',0.00,'999','0','"1302 MEMBER','1','2693') +('4171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4171 MEMBER','1','2694') +('5138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',3958.77,'999','0','"5138 MEMBER','1','2695') +('6531','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',130.70,'999','0','"6531 MEMBER','1','2696') +('495','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',304.83,'999','1','"495 MEMBER','1','2697') +('2199','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.35,'999','1','"2199 MEMBER','1','2698') +('1797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.12,'999','1','"1797 MEMBER','1','2699') +('6557','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',44.93,'999','0','"6557 MEMBER','1','2700') +('891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1336.45,'999','0','"891 MEMBER','1','2701') +('4608','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4608 MEMBER','1','2702') +('2024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3767.75,'999','0','"2024 MEMBER','1','2703') +('2773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2773 MEMBER','1','2704') +('4990','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',789.43,'999','1','"4990 MEMBER','1','2705') +('1478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1327.20,'999','0','"1478 MEMBER','1','2706') +('3243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3243 MEMBER','1','2707') +('5129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',3949.27,'999','0','"5129 MEMBER','1','2708') +('6210','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1205.07,'999','0','"6210 MEMBER','1','2709') +('5106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',834.11,'999','0','"5106 MEMBER','1','2710') +('3344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',354.81,'999','1','"3344 MEMBER','1','2711') +('4316','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1408.28,'999','1','"4316 MEMBER','1','2712') +('450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1612.42,'999','1','"450 MEMBER','1','2713') +('7027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7027 MEMBER','1','2714') +('7032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7032 MEMBER','1','2715') +('6978','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6978 MEMBER','1','2716') +('5189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5189 MEMBER','1','2717') +('5198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5198 MEMBER','1','2718') +('7055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7055 MEMBER','1','2719') +('7039','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7039 MEMBER','1','2720') +('4387','2','LASTNAME','FIRSTNAME',999.99,5.95,'10',100.00,'1','0','1','PC','3','1','0',2109.83,'999','0','"4387 MEMBER','1','2721') +('1891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1891 MEMBER','1','2722') +('4970','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',376.85,'999','1','"4970 MEMBER','1','2723') +('2719','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2719 MEMBER','1','2724') +('852','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"852 MEMBER','1','2725') +('4672','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2.52,'999','0','"4672 MEMBER','1','2726') +('2913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1871.34,'999','1','"2913 MEMBER','1','2727') +('4703','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',601.93,'999','0','"4703 MEMBER','1','2728') +('155','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3809.65,'999','0','"155 MEMBER','1','2729') +('4420','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4420 MEMBER','1','2730') +('4154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',429.22,'999','1','"4154 MEMBER','1','2731') +('2878','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2878 MEMBER','1','2732') +('4038','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3806.94,'999','0','"4038 MEMBER','1','2733') +('6279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',296.16,'999','1','"6279 MEMBER','1','2734') +('3417','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3417 MEMBER','1','2735') +('4878','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4878 MEMBER','1','2736') +('34','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1390.34,'999','0','"34 MEMBER','1','2737') +('122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',74.43,'999','1','"122 MEMBER','1','2738') +('6141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2327.85,'999','0','"6141 MEMBER','1','2739') +('1412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1412 MEMBER','1','2740') +('4714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',756.89,'999','0','"4714 MEMBER','1','2741') +('2920','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2920 MEMBER','1','2742') +('2784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',129.42,'999','0','"2784 MEMBER','1','2743') +('9013','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9013 MEMBER','1','2744') +('529','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1227.07,'999','1','"529 MEMBER','1','2745') +('4207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.70,'999','1','"4207 MEMBER','1','2746') +('3143','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3143 MEMBER','1','2747') +('46','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',9.49,'999','0','"46 MEMBER','1','2748') +('377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',9.47,'999','0','"377 MEMBER','1','2749') +('4446','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5878.03,'999','1','"4446 MEMBER','1','2750') +('4034','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1020.59,'999','0','"4034 MEMBER','1','2751') +('668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"668 MEMBER','1','2752') +('2502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2502 MEMBER','1','2753') +('9027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9027 MEMBER','1','2754') +('9000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',656.25,'999','0','"9000 MEMBER','1','2755') +('2786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2786 MEMBER','1','2756') +('6637','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',505.52,'999','1','"6637 MEMBER','1','2757') +('4720','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1893.27,'999','0','"4720 MEMBER','1','2758') +('6713','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.99,'999','1','"6713 MEMBER','1','2759') +('1517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',237.80,'999','0','"1517 MEMBER','1','2760') +('137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3235.21,'999','0','"137 MEMBER','1','2761') +('4303','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4303 MEMBER','1','2762') +('3021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3021 MEMBER','1','2763') +('4195','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4195 MEMBER','1','2764') +('6602','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',64.14,'999','0','"6602 MEMBER','1','2765') +('4759','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',510.40,'999','1','"4759 MEMBER','1','2766') +('6340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',734.83,'999','0','"6340 MEMBER','1','2767') +('2149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2149 MEMBER','1','2768') +('4215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',482.93,'999','0','"4215 MEMBER','1','2769') +('5108','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5108 MEMBER','1','2770') +('6182','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2669.05,'999','0','"6182 MEMBER','1','2771') +('6405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.27,'999','0','"6405 MEMBER','1','2772') +('1795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5.64,'999','1','"1795 MEMBER','1','2773') +('6224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2019.42,'999','0','"6224 MEMBER','1','2774') +('1066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1066 MEMBER','1','2775') +('6358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',506.16,'999','0','"6358 MEMBER','1','2776') +('3192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3192 MEMBER','1','2777') +('4659','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3396.48,'999','1','"4659 MEMBER','1','2778') +('1591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',155.40,'999','1','"1591 MEMBER','1','2779') +('4562','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2274.87,'999','0','"4562 MEMBER','1','2780') +('5012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5012 MEMBER','1','2781') +('874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1040.16,'999','1','"874 MEMBER','1','2782') +('6973','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6973 MEMBER','1','2783') +('5179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5179 MEMBER','1','2784') +('5197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5197 MEMBER','1','2785') +('6984','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6984 MEMBER','1','2786') +('6992','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6992 MEMBER','1','2787') +('7036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7036 MEMBER','1','2788') +('7058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7058 MEMBER','1','2789') +('7063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7063 MEMBER','1','2790') +('1102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3852.69,'999','0','"1102 MEMBER','1','2791') +('169','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1666.28,'999','0','"169 MEMBER','1','2792') +('412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',30.52,'999','0','"412 MEMBER','1','2793') +('4968','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',372.15,'999','0','"4968 MEMBER','1','2794') +('4006','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1001.00,'999','0','"4006 MEMBER','1','2795') +('4059','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4049.17,'999','0','"4059 MEMBER','1','2796') +('4035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',67.57,'999','0','"4035 MEMBER','1','2797') +('3077','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3077 MEMBER','1','2798') +('6524','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',539.61,'999','0','"6524 MEMBER','1','2799') +('6716','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',264.04,'999','0','"6716 MEMBER','1','2800') +('4759','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',510.40,'999','1','"4759 MEMBER','1','2801') +('9811','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9811 MEMBER','1','2802') +('1982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5333.00,'999','0','"1982 MEMBER','1','2803') +('3098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1745.71,'999','0','"3098 MEMBER','1','2804') +('4381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1531.33,'999','0','"4381 MEMBER','1','2805') +('1962','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1962 MEMBER','1','2806') +('4787','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1008.88,'999','0','"4787 MEMBER','1','2807') +('216','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',226.43,'999','0','"216 MEMBER','1','2808') +('6690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',776.04,'999','0','"6690 MEMBER','1','2809') +('2799','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2799 MEMBER','1','2810') +('161','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1700.58,'999','1','"161 MEMBER','1','2811') +('9001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"9001 MEMBER','1','2812') +('4046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.85,'999','1','"4046 MEMBER','1','2813') +('4386','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4386 MEMBER','1','2814') +('3025','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2853.54,'999','0','"3025 MEMBER','1','2815') +('4509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',528.84,'999','1','"4509 MEMBER','1','2816') +('2736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2736 MEMBER','1','2817') +('4389','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',142.32,'999','0','"4389 MEMBER','1','2818') +('4091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',520.84,'999','1','"4091 MEMBER','1','2819') +('4112','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3726.04,'999','0','"4112 MEMBER','1','2820') +('4303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4303 MEMBER','1','2821') +('2807','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1027.20,'999','0','"2807 MEMBER','1','2822') +('3230','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1498.43,'999','0','"3230 MEMBER','1','2823') +('6506','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',419.11,'999','0','"6506 MEMBER','1','2824') +('2001','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',9072.75,'999','0','"2001 MEMBER','1','2825') +('4553','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2910.84,'999','0','"4553 MEMBER','1','2826') +('9042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9042 MEMBER','1','2827') +('4643','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',386.73,'999','1','"4643 MEMBER','1','2828') +('512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4536.06,'999','0','"512 MEMBER','1','2829') +('4682','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5699.40,'999','0','"4682 MEMBER','1','2830') +('1487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1487 MEMBER','1','2831') +('340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2226.71,'999','0','"340 MEMBER','1','2832') +('4243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3539.04,'999','0','"4243 MEMBER','1','2833') +('4682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5699.40,'999','0','"4682 MEMBER','1','2834') +('1031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',14.32,'999','0','"1031 MEMBER','1','2835') +('5142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',904.46,'999','0','"5142 MEMBER','1','2836') +('91','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"91 MEMBER','1','2837') +('4928','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',627.68,'999','1','"4928 MEMBER','1','2838') +('2432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',141.08,'999','1','"2432 MEMBER','1','2839') +('2534','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2534 MEMBER','1','2840') +('6583','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',133.84,'999','0','"6583 MEMBER','1','2841') +('975','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',96.50,'999','0','"975 MEMBER','1','2842') +('201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',242.99,'999','1','"201 MEMBER','1','2843') +('99','2','LASTNAME','FIRSTNAME',999.99,3.35,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"99 MEMBER','1','2844') +('2455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',118.79,'999','1','"2455 MEMBER','1','2845') +('2425','1','LASTNAME','FIRSTNAME',999.99,19.08,'0',20.00,'1','1','1','PC','1','0','0',1581.71,'999','0','"2425 MEMBER','1','2846') +('6710','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',50.51,'999','1','"6710 MEMBER','1','2847') +('4582','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4641.01,'999','1','"4582 MEMBER','1','2848') +('6988','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6988 MEMBER','1','2849') +('6994','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6994 MEMBER','1','2850') +('6995','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6995 MEMBER','1','2851') +('7026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7026 MEMBER','1','2852') +('6963','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6963 MEMBER','1','2853') +('6970','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6970 MEMBER','1','2854') +('6989','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6989 MEMBER','1','2855') +('7034','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7034 MEMBER','1','2856') +('7068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7068 MEMBER','1','2857') +('7032','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7032 MEMBER','1','2858') +('7035','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7035 MEMBER','1','2859') +('172','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"172 MEMBER','1','2860') +('1527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1527 MEMBER','1','2861') +('6251','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',104.11,'999','0','"6251 MEMBER','1','2862') +('3010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1071.83,'999','0','"3010 MEMBER','1','2863') +('6361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2340.11,'999','0','"6361 MEMBER','1','2864') +('4786','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1776.21,'999','0','"4786 MEMBER','1','2865') +('4979','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6985.77,'999','0','"4979 MEMBER','1','2866') +('6607','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',170.54,'999','0','"6607 MEMBER','1','2867') +('4771','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',4145.28,'999','0','"4771 MEMBER','1','2868') +('1978','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',16.39,'999','1','"1978 MEMBER','1','2869') +('6585','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',288.35,'999','1','"6585 MEMBER','1','2870') +('4922','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',59.34,'999','0','"4922 MEMBER','1','2871') +('6105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1452.57,'999','1','"6105 MEMBER','1','2872') +('6691','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.68,'999','1','"6691 MEMBER','1','2873') +('6631','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',48.67,'999','1','"6631 MEMBER','1','2874') +('4585','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',28.79,'999','0','"4585 MEMBER','1','2875') +('4774','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',281.62,'999','1','"4774 MEMBER','1','2876') +('3287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',276.27,'999','0','"3287 MEMBER','1','2877') +('4452','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.40,'999','1','"4452 MEMBER','1','2878') +('98','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',141.25,'999','0','"98 MEMBER','1','2879') +('343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4240.97,'999','0','"343 MEMBER','1','2880') +('344','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1305.13,'999','0','"344 MEMBER','1','2881') +('2600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2600 MEMBER','1','2882') +('6396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4922.47,'999','1','"6396 MEMBER','1','2883') +('6168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2062.16,'999','0','"6168 MEMBER','1','2884') +('4572','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7408.90,'999','0','"4572 MEMBER','1','2885') +('5155','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',357.20,'999','0','"5155 MEMBER','1','2886') +('6202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2523.98,'999','0','"6202 MEMBER','1','2887') +('2303','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.73,'999','1','"2303 MEMBER','1','2888') +('4708','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2169.83,'999','0','"4708 MEMBER','1','2889') +('6907','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6907 MEMBER','1','2890') +('6306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',257.21,'999','0','"6306 MEMBER','1','2891') +('1334','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"1334 MEMBER','1','2892') +('4484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1842.53,'999','1','"4484 MEMBER','1','2893') +('6185','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',356.59,'999','1','"6185 MEMBER','1','2894') +('5082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',6647.84,'999','0','"5082 MEMBER','1','2895') +('4105','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3026.38,'999','0','"4105 MEMBER','1','2896') +('4524','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3273.11,'999','0','"4524 MEMBER','1','2897') +('4266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',260.19,'999','1','"4266 MEMBER','1','2898') +('6259','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',422.62,'999','1','"6259 MEMBER','1','2899') +('2217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',14.93,'999','1','"2217 MEMBER','1','2900') +('5079','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5079 MEMBER','1','2901') +('5074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5074 MEMBER','1','2902') +('475','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',688.85,'999','0','"475 MEMBER','1','2903') +('1928','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1928 MEMBER','1','2904') +('4658','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7321.57,'999','0','"4658 MEMBER','1','2905') +('1195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1003.51,'999','0','"1195 MEMBER','1','2906') +('2199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.35,'999','1','"2199 MEMBER','1','2907') +('3354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',134.86,'999','1','"3354 MEMBER','1','2908') +('2083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3626.12,'999','1','"2083 MEMBER','1','2909') +('4871','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',76.49,'999','0','"4871 MEMBER','1','2910') +('1249','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1249 MEMBER','1','2911') +('6013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6013 MEMBER','1','2912') +('2389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3752.29,'999','0','"2389 MEMBER','1','2913') +('2924','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2114.22,'999','0','"2924 MEMBER','1','2914') +('2577','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1017.33,'999','0','"2577 MEMBER','1','2915') +('1943','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',441.97,'999','1','"1943 MEMBER','1','2916') +('2004','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2004 MEMBER','1','2917') +('4161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',411.66,'999','1','"4161 MEMBER','1','2918') +('271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"271 MEMBER','1','2919') +('383','1','LASTNAME','FIRSTNAME',999.99,45.56,'10',50.00,'1','1','1','PC','3','1','0',662.26,'999','0','"383 MEMBER','1','2920') +('4242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4242 MEMBER','1','2921') +('9061','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',236.25,'999','0','"9061 MEMBER','1','2922') +('6958','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6958 MEMBER','1','2923') +('6987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6987 MEMBER','1','2924') +('7018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"7018 MEMBER','1','2925') +('7024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7024 MEMBER','1','2926') +('7030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7030 MEMBER','1','2927') +('5181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5181 MEMBER','1','2928') +('1476','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"1476 MEMBER','1','2929') +('2828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2828 MEMBER','1','2930') +('2353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',177.03,'999','0','"2353 MEMBER','1','2931') +('6140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1762.80,'999','0','"6140 MEMBER','1','2932') +('2786','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2786 MEMBER','1','2933') +('6330','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6135.33,'999','0','"6330 MEMBER','1','2934') +('4239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4239 MEMBER','1','2935') +('4911','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',104.66,'999','1','"4911 MEMBER','1','2936') +('6608','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',289.35,'999','1','"6608 MEMBER','1','2937') +('4854','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4854 MEMBER','1','2938') +('4079','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5.04,'999','1','"4079 MEMBER','1','2939') +('2918','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2239.00,'999','0','"2918 MEMBER','1','2940') +('139','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2826.39,'999','0','"139 MEMBER','1','2941') +('4819','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1524.42,'999','0','"4819 MEMBER','1','2942') +('2610','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','1',66.86,'999','1','"2610 MEMBER','1','2943') +('47','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',893.80,'999','1','"47 MEMBER','1','2944') +('208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"208 MEMBER','1','2945') +('241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',300.51,'999','1','"241 MEMBER','1','2946') +('8823','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8823 MEMBER','1','2947') +('6400','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',278.63,'999','0','"6400 MEMBER','1','2948') +('2522','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2522 MEMBER','1','2949') +('5401','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5401 MEMBER','1','2950') +('6500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',182.80,'999','1','"6500 MEMBER','1','2951') +('3071','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',71.63,'999','1','"3071 MEMBER','1','2952') +('6205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',106.73,'999','1','"6205 MEMBER','1','2953') +('4206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4206 MEMBER','1','2954') +('6443','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',148.91,'999','1','"6443 MEMBER','1','2955') +('6572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',322.93,'999','1','"6572 MEMBER','1','2956') +('6179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',527.88,'999','1','"6179 MEMBER','1','2957') +('1629','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',705.25,'999','0','"1629 MEMBER','1','2958') +('3063','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"3063 MEMBER','1','2959') +('866','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1858.56,'999','0','"866 MEMBER','1','2960') +('2116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',824.90,'999','0','"2116 MEMBER','1','2961') +('1068','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1068 MEMBER','1','2962') +('6538','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',469.79,'999','0','"6538 MEMBER','1','2963') +('6661','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',870.79,'999','0','"6661 MEMBER','1','2964') +('4777','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1194.97,'999','1','"4777 MEMBER','1','2965') +('4279','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4279 MEMBER','1','2966') +('1222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1222 MEMBER','1','2967') +('9007','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9007 MEMBER','1','2968') +('4723','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1618.78,'999','1','"4723 MEMBER','1','2969') +('4396','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3039.25,'999','0','"4396 MEMBER','1','2970') +('4788','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',284.46,'999','1','"4788 MEMBER','1','2971') +('115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1416.14,'999','0','"115 MEMBER','1','2972') +('4945','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',569.51,'999','1','"4945 MEMBER','1','2973') +('6588','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',420.08,'999','0','"6588 MEMBER','1','2974') +('1857','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"1857 MEMBER','1','2975') +('4166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4166 MEMBER','1','2976') +('477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"477 MEMBER','1','2977') +('4570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',641.16,'999','1','"4570 MEMBER','1','2978') +('9005','2','LASTNAME','FIRSTNAME',999.99,63.75,'0',0.00,'1','0','1','TERM','0','0','0',63.75,'999','0','"9005 MEMBER','1','2979') +('6278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',167.94,'999','0','"6278 MEMBER','1','2980') +('1834','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',234.12,'999','0','"1834 MEMBER','1','2981') +('4971','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2711.61,'999','0','"4971 MEMBER','1','2982') +('118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"118 MEMBER','1','2983') +('6145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3041.29,'999','1','"6145 MEMBER','1','2984') +('115','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1416.14,'999','0','"115 MEMBER','1','2985') +('6511','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','1','0',937.11,'999','1','"6511 MEMBER','1','2986') +('696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2649.48,'999','0','"696 MEMBER','1','2987') +('4837','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1514.97,'999','0','"4837 MEMBER','1','2988') +('386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1371.22,'999','0','"386 MEMBER','1','2989') +('4365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4365 MEMBER','1','2990') +('4823','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',220.64,'999','0','"4823 MEMBER','1','2991') +('543','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',222.84,'999','1','"543 MEMBER','1','2992') +('6946','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6946 MEMBER','1','2993') +('6982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6982 MEMBER','1','2994') +('6985','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6985 MEMBER','1','2995') +('6990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6990 MEMBER','1','2996') +('7016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','REG','0','0','0',0.00,'999','0','"7016 MEMBER','1','2997') +('7017','1','LASTNAME','FIRSTNAME',999.99,19.87,'10',100.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7017 MEMBER','1','2998') +('1040','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1040 MEMBER','1','2999') +('4731','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1045.64,'999','1','"4731 MEMBER','1','3000') +('6648','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',931.71,'999','1','"6648 MEMBER','1','3001') +('2839','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2839 MEMBER','1','3002') +('6429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',91.69,'999','1','"6429 MEMBER','1','3003') +('124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"124 MEMBER','1','3004') +('512','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4536.06,'999','0','"512 MEMBER','1','3005') +('6657','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',730.29,'999','0','"6657 MEMBER','1','3006') +('2166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2166 MEMBER','1','3007') +('6608','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',289.35,'999','1','"6608 MEMBER','1','3008') +('5150','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1033.02,'999','0','"5150 MEMBER','1','3009') +('6762','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.17,'999','0','"6762 MEMBER','1','3010') +('2434','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2434 MEMBER','1','3011') +('6519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',726.02,'999','0','"6519 MEMBER','1','3012') +('2180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2180 MEMBER','1','3013') +('164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',686.35,'999','0','"164 MEMBER','1','3014') +('4058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1049.77,'999','0','"4058 MEMBER','1','3015') +('4067','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1337.50,'999','1','"4067 MEMBER','1','3016') +('272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',56.68,'999','1','"272 MEMBER','1','3017') +('460','1','LASTNAME','FIRSTNAME',999.99,19.97,'0',20.00,'1','1','1','PC','1','0','0',134.72,'999','1','"460 MEMBER','1','3018') +('4863','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',110.87,'999','1','"4863 MEMBER','1','3019') +('4263','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6060.64,'999','0','"4263 MEMBER','1','3020') +('2195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2195 MEMBER','1','3021') +('2901','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5289.37,'999','0','"2901 MEMBER','1','3022') +('4084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',197.32,'999','0','"4084 MEMBER','1','3023') +('4619','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2151.67,'999','0','"4619 MEMBER','1','3024') +('1021','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',378.35,'999','1','"1021 MEMBER','1','3025') +('6667','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1166.20,'999','1','"6667 MEMBER','1','3026') +('245','1','LASTNAME','FIRSTNAME',999.99,'-0.01','0',20.00,'1','1','1','PC','1','0','0',1540.87,'999','0','"245 MEMBER','1','3027') +('301','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',639.76,'999','1','"301 MEMBER','1','3028') +('3408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3.99,'999','1','"3408 MEMBER','1','3029') +('2450','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"2450 MEMBER','1','3030') +('1272','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6014.70,'999','1','"1272 MEMBER','1','3031') +('6257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',287.22,'999','0','"6257 MEMBER','1','3032') +('315','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"315 MEMBER','1','3033') +('6203','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1691.56,'999','0','"6203 MEMBER','1','3034') +('2219','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',688.09,'999','0','"2219 MEMBER','1','3035') +('6782','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',225.36,'999','0','"6782 MEMBER','1','3036') +('6591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',645.80,'999','0','"6591 MEMBER','1','3037') +('2333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4346.02,'999','0','"2333 MEMBER','1','3038') +('6237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',692.56,'999','0','"6237 MEMBER','1','3039') +('6783','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.70,'999','0','"6783 MEMBER','1','3040') +('1314','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1314 MEMBER','1','3041') +('1918','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1918 MEMBER','1','3042') +('4949','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',121.32,'999','0','"4949 MEMBER','1','3043') +('6443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',148.91,'999','1','"6443 MEMBER','1','3044') +('6597','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1704.77,'999','0','"6597 MEMBER','1','3045') +('4186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"4186 MEMBER','1','3046') +('6347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',317.95,'999','1','"6347 MEMBER','1','3047') +('6568','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',303.32,'999','1','"6568 MEMBER','1','3048') +('450','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1612.42,'999','1','"450 MEMBER','1','3049') +('3248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',243.49,'999','1','"3248 MEMBER','1','3050') +('4671','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',836.11,'999','1','"4671 MEMBER','1','3051') +('4294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4294 MEMBER','1','3052') +('2172','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2172 MEMBER','1','3053') +('6472','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',817.75,'999','1','"6472 MEMBER','1','3054') +('3153','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',454.01,'999','1','"3153 MEMBER','1','3055') +('6779','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',15.80,'999','0','"6779 MEMBER','1','3056') +('6634','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',111.74,'999','1','"6634 MEMBER','1','3057') +('2062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2062 MEMBER','1','3058') +('266','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4071.61,'999','0','"266 MEMBER','1','3059') +('4305','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',517.10,'999','1','"4305 MEMBER','1','3060') +('4326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4326 MEMBER','1','3061') +('6960','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6960 MEMBER','1','3062') +('6981','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6981 MEMBER','1','3063') +('5186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5186 MEMBER','1','3064') +('7052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7052 MEMBER','1','3065') +('7060','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7060 MEMBER','1','3066') +('7040','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7040 MEMBER','1','3067') +('7063','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7063 MEMBER','1','3068') +('5025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5025 MEMBER','1','3069') +('6170','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2444.53,'999','1','"6170 MEMBER','1','3070') +('97','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6248.79,'999','1','"97 MEMBER','1','3071') +('1','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4186.88,'999','0','"1 MEMBER','1','3072') +('21','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',993.51,'999','0','"21 MEMBER','1','3073') +('3392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2842.21,'999','0','"3392 MEMBER','1','3074') +('6645','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',220.02,'999','0','"6645 MEMBER','1','3075') +('4288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4288 MEMBER','1','3076') +('4333','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',146.85,'999','0','"4333 MEMBER','1','3077') +('4914','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4914 MEMBER','1','3078') +('267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"267 MEMBER','1','3079') +('4366','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',405.23,'999','1','"4366 MEMBER','1','3080') +('4838','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',413.16,'999','0','"4838 MEMBER','1','3081') +('4695','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4695 MEMBER','1','3082') +('1068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1068 MEMBER','1','3083') +('1499','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1499 MEMBER','1','3084') +('6230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',120.84,'999','1','"6230 MEMBER','1','3085') +('9009','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',112.50,'999','0','"9009 MEMBER','1','3086') +('4822','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4822 MEMBER','1','3087') +('6222','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',216.59,'999','1','"6222 MEMBER','1','3088') +('3204','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4013.51,'999','0','"3204 MEMBER','1','3089') +('1724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"1724 MEMBER','1','3090') +('4502','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.20,'999','1','"4502 MEMBER','1','3091') +('6519','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',726.02,'999','0','"6519 MEMBER','1','3092') +('4347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4347 MEMBER','1','3093') +('1575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',908.41,'999','1','"1575 MEMBER','1','3094') +('2889','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1323.80,'999','1','"2889 MEMBER','1','3095') +('3173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',136.38,'999','0','"3173 MEMBER','1','3096') +('1736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1736 MEMBER','1','3097') +('6672','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',56.57,'999','0','"6672 MEMBER','1','3098') +('1838','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',91.61,'999','0','"1838 MEMBER','1','3099') +('569','1','LASTNAME','FIRSTNAME',999.99,21.53,'10',50.00,'1','1','1','PC','3','1','0',0.00,'999','0','"569 MEMBER','1','3100') +('2951','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',52.95,'999','0','"2951 MEMBER','1','3101') +('6399','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',752.99,'999','0','"6399 MEMBER','1','3102') +('9033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9033 MEMBER','1','3103') +('4161','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',411.66,'999','1','"4161 MEMBER','1','3104') +('6757','1','LASTNAME','FIRSTNAME',999.99,91.27,'10',100.00,'1','1','1','PC','3','1','0',54.22,'999','0','"6757 MEMBER','1','3105') +('5086','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5086 MEMBER','1','3106') +('3356','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3356 MEMBER','1','3107') +('4215','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',482.93,'999','0','"4215 MEMBER','1','3108') +('9015','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9015 MEMBER','1','3109') +('6301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',74.07,'999','0','"6301 MEMBER','1','3110') +('9073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',48.75,'999','0','"9073 MEMBER','1','3111') +('4727','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2624.80,'999','0','"4727 MEMBER','1','3112') +('1517','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',237.80,'999','0','"1517 MEMBER','1','3113') +('4844','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',605.56,'999','0','"4844 MEMBER','1','3114') +('6366','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',212.24,'999','1','"6366 MEMBER','1','3115') +('6126','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1164.22,'999','0','"6126 MEMBER','1','3116') +('5106','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',834.11,'999','0','"5106 MEMBER','1','3117') +('6506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',419.11,'999','0','"6506 MEMBER','1','3118') +('6628','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',230.32,'999','0','"6628 MEMBER','1','3119') +('4291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4291 MEMBER','1','3120') +('4049','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4049 MEMBER','1','3121') +('1843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5480.29,'999','0','"1843 MEMBER','1','3122') +('6858','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6858 MEMBER','1','3123') +('6005','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',100.00,'1','0','1','REG','2','0','0',0.00,'999','0','"6005 MEMBER','1','3124') +('51','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1072.23,'999','1','"51 MEMBER','1','3125') +('60','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2970.90,'999','1','"60 MEMBER','1','3126') +('4369','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1333.50,'999','1','"4369 MEMBER','1','3127') +('4572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7408.90,'999','0','"4572 MEMBER','1','3128') +('6959','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6959 MEMBER','1','3129') +('7020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7020 MEMBER','1','3130') +('6966','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6966 MEMBER','1','3131') +('5194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5194 MEMBER','1','3132') +('5196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5196 MEMBER','1','3133') +('6981','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6981 MEMBER','1','3134') +('6993','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6993 MEMBER','1','3135') +('7041','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7041 MEMBER','1','3136') +('7054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7054 MEMBER','1','3137') +('7064','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7064 MEMBER','1','3138') +('42','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1243.40,'999','1','"42 MEMBER','1','3139') +('5120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',23.92,'999','0','"5120 MEMBER','1','3140') +('6280','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',571.07,'999','0','"6280 MEMBER','1','3141') +('1657','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',972.22,'999','0','"1657 MEMBER','1','3142') +('6191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1018.13,'999','1','"6191 MEMBER','1','3143') +('1771','1','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','1','1','PC','1','0','0',898.75,'999','0','"1771 MEMBER','1','3144') +('927','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"927 MEMBER','1','3145') +('2718','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',149.52,'999','1','"2718 MEMBER','1','3146') +('4375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4375 MEMBER','1','3147') +('482','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"482 MEMBER','1','3148') +('6503','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',696.46,'999','1','"6503 MEMBER','1','3149') +('6147','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',510.04,'999','1','"6147 MEMBER','1','3150') +('9080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',55.00,'999','0','"9080 MEMBER','1','3151') +('9010','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9010 MEMBER','1','3152') +('6336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1287.87,'999','0','"6336 MEMBER','1','3153') +('6653','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',114.50,'999','1','"6653 MEMBER','1','3154') +('4970','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',376.85,'999','1','"4970 MEMBER','1','3155') +('339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"339 MEMBER','1','3156') +('4799','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1416.72,'999','0','"4799 MEMBER','1','3157') +('6527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',95.04,'999','0','"6527 MEMBER','1','3158') +('6788','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',70.78,'999','0','"6788 MEMBER','1','3159') +('7326','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7326 MEMBER','1','3160') +('5117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',245.26,'999','0','"5117 MEMBER','1','3161') +('400','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"400 MEMBER','1','3162') +('4452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.40,'999','1','"4452 MEMBER','1','3163') +('4363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',593.85,'999','1','"4363 MEMBER','1','3164') +('6145','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3041.29,'999','1','"6145 MEMBER','1','3165') +('287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',154.80,'999','0','"287 MEMBER','1','3166') +('2294','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',83.86,'999','1','"2294 MEMBER','1','3167') +('6587','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',336.30,'999','0','"6587 MEMBER','1','3168') +('6180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2699.03,'999','1','"6180 MEMBER','1','3169') +('4265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5408.35,'999','0','"4265 MEMBER','1','3170') +('6241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',221.76,'999','0','"6241 MEMBER','1','3171') +('1564','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',851.14,'999','1','"1564 MEMBER','1','3172') +('6205','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',106.73,'999','1','"6205 MEMBER','1','3173') +('4627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4627 MEMBER','1','3174') +('5126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5126 MEMBER','1','3175') +('6768','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',224.83,'999','0','"6768 MEMBER','1','3176') +('2730','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4780.56,'999','0','"2730 MEMBER','1','3177') +('2884','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2884 MEMBER','1','3178') +('2602','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',403.72,'999','1','"2602 MEMBER','1','3179') +('6432','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',274.37,'999','1','"6432 MEMBER','1','3180') +('4253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2226.48,'999','0','"4253 MEMBER','1','3181') +('6125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',33.49,'999','0','"6125 MEMBER','1','3182') +('9095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9095 MEMBER','1','3183') +('6219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',113.43,'999','1','"6219 MEMBER','1','3184') +('255','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',229.97,'999','1','"255 MEMBER','1','3185') +('4248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',489.39,'999','0','"4248 MEMBER','1','3186') +('919','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1779.28,'999','1','"919 MEMBER','1','3187') +('6639','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1028.49,'999','1','"6639 MEMBER','1','3188') +('6695','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',224.73,'999','0','"6695 MEMBER','1','3189') +('3261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',629.98,'999','0','"3261 MEMBER','1','3190') +('123','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1012.75,'999','1','"123 MEMBER','1','3191') +('4211','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4211 MEMBER','1','3192') +('2106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1132.32,'999','1','"2106 MEMBER','1','3193') +('2740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2066.00,'999','0','"2740 MEMBER','1','3194') +('5028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5028 MEMBER','1','3195') +('6515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1375.41,'999','0','"6515 MEMBER','1','3196') +('6271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',471.07,'999','0','"6271 MEMBER','1','3197') +('6772','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',167.82,'999','1','"6772 MEMBER','1','3198') +('6187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',109.39,'999','0','"6187 MEMBER','1','3199') +('3124','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4927.54,'999','0','"3124 MEMBER','1','3200') +('4625','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',144.24,'999','1','"4625 MEMBER','1','3201') +('6257','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',287.22,'999','0','"6257 MEMBER','1','3202') +('1109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1109 MEMBER','1','3203') +('253','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',286.05,'999','1','"253 MEMBER','1','3204') +('6591','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',645.80,'999','0','"6591 MEMBER','1','3205') +('4617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.01,'999','1','"4617 MEMBER','1','3206') +('1510','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1510 MEMBER','1','3207') +('6953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6953 MEMBER','1','3208') +('6944','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6944 MEMBER','1','3209') +('4139','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',537.24,'999','0','"4139 MEMBER','1','3210') +('4538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4538 MEMBER','1','3211') +('1663','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1663 MEMBER','1','3212') +('5120','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',23.92,'999','0','"5120 MEMBER','1','3213') +('516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"516 MEMBER','1','3214') +('4267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',778.89,'999','1','"4267 MEMBER','1','3215') +('4228','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4228 MEMBER','1','3216') +('4216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',981.69,'999','1','"4216 MEMBER','1','3217') +('1186','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1003.47,'999','0','"1186 MEMBER','1','3218') +('1131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1131 MEMBER','1','3219') +('4320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1104.95,'999','1','"4320 MEMBER','1','3220') +('515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',276.14,'999','1','"515 MEMBER','1','3221') +('6189','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3530.17,'999','0','"6189 MEMBER','1','3222') +('1925','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1925 MEMBER','1','3223') +('4461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.73,'999','0','"4461 MEMBER','1','3224') +('4380','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',201.19,'999','1','"4380 MEMBER','1','3225') +('2782','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',283.31,'999','0','"2782 MEMBER','1','3226') +('4803','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',33.30,'999','0','"4803 MEMBER','1','3227') +('6228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',628.96,'999','0','"6228 MEMBER','1','3228') +('6371','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1129.61,'999','0','"6371 MEMBER','1','3229') +('230','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2524.91,'999','0','"230 MEMBER','1','3230') +('437','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10328.36,'999','0','"437 MEMBER','1','3231') +('5152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1357.60,'999','0','"5152 MEMBER','1','3232') +('1962','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1962 MEMBER','1','3233') +('4028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4028 MEMBER','1','3234') +('1661','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1133.84,'999','1','"1661 MEMBER','1','3235') +('9053','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9053 MEMBER','1','3236') +('6611','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',300.34,'999','1','"6611 MEMBER','1','3237') +('6717','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',172.43,'999','1','"6717 MEMBER','1','3238') +('6211','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3663.16,'999','0','"6211 MEMBER','1','3239') +('270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',548.85,'999','1','"270 MEMBER','1','3240') +('6112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',364.90,'999','1','"6112 MEMBER','1','3241') +('915','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"915 MEMBER','1','3242') +('2619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',952.12,'999','0','"2619 MEMBER','1','3243') +('4487','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',252.57,'999','1','"4487 MEMBER','1','3244') +('2366','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3953.34,'999','0','"2366 MEMBER','1','3245') +('2260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1991.52,'999','1','"2260 MEMBER','1','3246') +('2753','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.29,'999','1','"2753 MEMBER','1','3247') +('4374','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4374 MEMBER','1','3248') +('5040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',9137.77,'999','0','"5040 MEMBER','1','3249') +('1740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1740 MEMBER','1','3250') +('1648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"1648 MEMBER','1','3251') +('6310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2744.08,'999','0','"6310 MEMBER','1','3252') +('6','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',782.64,'999','0','"6 MEMBER','1','3253') +('2282','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1270.13,'999','1','"2282 MEMBER','1','3254') +('4232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',557.66,'999','0','"4232 MEMBER','1','3255') +('5141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5141 MEMBER','1','3256') +('2089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2089 MEMBER','1','3257') +('4923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',47.45,'999','0','"4923 MEMBER','1','3258') +('9094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9094 MEMBER','1','3259') +('4833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2269.98,'999','0','"4833 MEMBER','1','3260') +('9021','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9021 MEMBER','1','3261') +('2612','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2612 MEMBER','1','3262') +('6487','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1362.64,'999','0','"6487 MEMBER','1','3263') +('6771','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',54.86,'999','0','"6771 MEMBER','1','3264') +('6585','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',288.35,'999','1','"6585 MEMBER','1','3265') +('6730','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',473.28,'999','0','"6730 MEMBER','1','3266') +('2331','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',368.81,'999','0','"2331 MEMBER','1','3267') +('6510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',813.34,'999','0','"6510 MEMBER','1','3268') +('6951','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6951 MEMBER','1','3269') +('6955','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6955 MEMBER','1','3270') +('6960','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6960 MEMBER','1','3271') +('6970','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6970 MEMBER','1','3272') +('6980','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6980 MEMBER','1','3273') +('6989','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6989 MEMBER','1','3274') +('6992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6992 MEMBER','1','3275') +('7021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7021 MEMBER','1','3276') +('7025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7025 MEMBER','1','3277') +('7029','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7029 MEMBER','1','3278') +('3112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3112 MEMBER','1','3279') +('2709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',731.62,'999','0','"2709 MEMBER','1','3280') +('9029','1','LASTNAME','FIRSTNAME',999.99,56.25,'0',0.00,'1','1','1','TERM','0','0','0',225.00,'999','0','"9029 MEMBER','1','3281') +('7430','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7430 MEMBER','1','3282') +('6715','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',387.73,'999','0','"6715 MEMBER','1','3283') +('151','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1266.83,'999','0','"151 MEMBER','1','3284') +('4142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1154.13,'999','0','"4142 MEMBER','0','3285') +('5146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1392.99,'999','0','"5146 MEMBER','1','3286') +('6318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2154.99,'999','0','"6318 MEMBER','1','3287') +('225','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3213.55,'999','0','"225 MEMBER','1','3288') +('364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.32,'999','1','"364 MEMBER','1','3289') +('10190','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10190 MEMBER','1','3290') +('4263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6060.64,'999','0','"4263 MEMBER','1','3291') +('4195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4195 MEMBER','1','3292') +('4413','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2155.80,'999','0','"4413 MEMBER','1','3293') +('4024','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',27.69,'999','0','"4024 MEMBER','1','3294') +('463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1254.33,'999','0','"463 MEMBER','1','3295') +('226','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4016.43,'999','1','"226 MEMBER','1','3296') +('6526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',269.06,'999','0','"6526 MEMBER','1','3297') +('4458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4458 MEMBER','1','3298') +('3405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3405 MEMBER','1','3299') +('3280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2335.12,'999','1','"3280 MEMBER','1','3300') +('444','2','LASTNAME','FIRSTNAME',999.99,5.74,'0',20.00,'1','1','1','PC','1','0','0',3385.63,'999','0','"444 MEMBER','1','3301') +('4691','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.93,'999','1','"4691 MEMBER','1','3302') +('2176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2125.90,'999','0','"2176 MEMBER','1','3303') +('2481','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',5.97,'999','0','"2481 MEMBER','1','3304') +('2940','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2940 MEMBER','1','3305') +('320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3480.40,'999','0','"320 MEMBER','1','3306') +('2208','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2208 MEMBER','1','3307') +('2782','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.31,'999','0','"2782 MEMBER','1','3308') +('3161','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3161 MEMBER','1','3309') +('2127','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1023.28,'999','0','"2127 MEMBER','1','3310') +('6355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',875.47,'999','0','"6355 MEMBER','1','3311') +('3098','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1745.71,'999','0','"3098 MEMBER','1','3312') +('500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4956.17,'999','0','"500 MEMBER','1','3313') +('696','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2649.48,'999','0','"696 MEMBER','1','3314') +('2984','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2604.88,'999','0','"2984 MEMBER','1','3315') +('4360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',46.33,'999','0','"4360 MEMBER','1','3316') +('4678','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',234.80,'999','0','"4678 MEMBER','1','3317') +('9055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9055 MEMBER','1','3318') +('3155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3155 MEMBER','1','3319') +('275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',72.71,'999','0','"275 MEMBER','1','3320') +('4374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4374 MEMBER','1','3321') +('1093','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1093 MEMBER','1','3322') +('4729','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',210.85,'999','1','"4729 MEMBER','1','3323') +('202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3671.17,'999','0','"202 MEMBER','1','3324') +('4116','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1800.40,'999','0','"4116 MEMBER','1','3325') +('4855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',314.08,'999','1','"4855 MEMBER','1','3326') +('97','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6248.79,'999','1','"97 MEMBER','1','3327') +('343','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4240.97,'999','0','"343 MEMBER','1','3328') +('4428','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4428 MEMBER','1','3329') +('6344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',846.68,'999','0','"6344 MEMBER','1','3330') +('4037','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4603.57,'999','0','"4037 MEMBER','1','3331') +('4710','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4710 MEMBER','1','3332') +('1151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8796.44,'999','0','"1151 MEMBER','1','3333') +('5152','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',1357.60,'999','0','"5152 MEMBER','1','3334') +('534','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3113.71,'999','0','"534 MEMBER','1','3335') +('34','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1390.34,'999','0','"34 MEMBER','1','3336') +('6956','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6956 MEMBER','1','3337') +('6993','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6993 MEMBER','1','3338') +('5184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5184 MEMBER','1','3339') +('5195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5195 MEMBER','1','3340') +('6996','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6996 MEMBER','1','3341') +('7070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7070 MEMBER','1','3342') +('7030','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7030 MEMBER','1','3343') +('7078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7078 MEMBER','1','3344') +('7099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7099 MEMBER','1','3345') +('7101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7101 MEMBER','1','3346') +('7073','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7073 MEMBER','1','3347') +('3233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',164.57,'999','1','"3233 MEMBER','1','3348') +('86','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2735.64,'999','0','"86 MEMBER','1','3349') +('6383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',319.31,'999','0','"6383 MEMBER','1','3350') +('6430','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',309.45,'999','0','"6430 MEMBER','1','3351') +('3035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3035 MEMBER','1','3352') +('226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4016.43,'999','1','"226 MEMBER','1','3353') +('4920','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1280.78,'999','0','"4920 MEMBER','1','3354') +('493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',227.43,'999','0','"493 MEMBER','1','3355') +('2660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2660 MEMBER','1','3356') +('4872','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1244.83,'999','0','"4872 MEMBER','1','3357') +('4139','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',537.24,'999','0','"4139 MEMBER','1','3358') +('4092','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1182.39,'999','1','"4092 MEMBER','1','3359') +('1553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3785.45,'999','0','"1553 MEMBER','1','3360') +('4194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4194 MEMBER','1','3361') +('4792','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',317.49,'999','1','"4792 MEMBER','1','3362') +('909','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"909 MEMBER','1','3363') +('1099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',11.62,'999','1','"1099 MEMBER','1','3364') +('1808','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1808 MEMBER','1','3365') +('3233','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',164.57,'999','1','"3233 MEMBER','1','3366') +('4372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1843.23,'999','0','"4372 MEMBER','1','3367') +('4802','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',345.64,'999','1','"4802 MEMBER','1','3368') +('463','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1254.33,'999','0','"463 MEMBER','1','3369') +('4450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4450 MEMBER','1','3370') +('4574','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4574 MEMBER','1','3371') +('4614','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4614 MEMBER','1','3372') +('4077','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4077 MEMBER','1','3373') +('4419','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.53,'999','1','"4419 MEMBER','1','3374') +('6191','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1018.13,'999','1','"6191 MEMBER','1','3375') +('1695','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',161.63,'999','1','"1695 MEMBER','1','3376') +('4700','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',762.40,'999','0','"4700 MEMBER','1','3377') +('2851','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2851 MEMBER','1','3378') +('6004','1','LASTNAME','FIRSTNAME',999.99,92.61,'0',200.00,'1','1','1','REG','2','0','0',882.21,'999','0','"6004 MEMBER','1','3379') +('5147','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',47.08,'999','0','"5147 MEMBER','1','3380') +('4953','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1247.04,'999','0','"4953 MEMBER','1','3381') +('4985','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',1294.87,'999','1','"4985 MEMBER','1','3382') +('1322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',553.29,'999','1','"1322 MEMBER','1','3383') +('607','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',985.98,'999','0','"607 MEMBER','1','3384') +('470','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',96.02,'999','1','"470 MEMBER','1','3385') +('163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',983.06,'999','0','"163 MEMBER','1','3386') +('2481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',5.97,'999','0','"2481 MEMBER','1','3387') +('3385','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',280.74,'999','0','"3385 MEMBER','1','3388') +('1941','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1941 MEMBER','1','3389') +('6123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1312.28,'999','0','"6123 MEMBER','1','3390') +('4727','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2624.80,'999','0','"4727 MEMBER','1','3391') +('4169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',79.02,'999','1','"4169 MEMBER','1','3392') +('1061','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',309.47,'999','0','"1061 MEMBER','1','3393') +('2552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1036.08,'999','0','"2552 MEMBER','1','3394') +('6170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2444.53,'999','1','"6170 MEMBER','1','3395') +('4237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.48,'999','1','"4237 MEMBER','1','3396') +('6439','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',752.00,'999','1','"6439 MEMBER','1','3397') +('6551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',123.68,'999','1','"6551 MEMBER','1','3398') +('2500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',49.29,'999','1','"2500 MEMBER','1','3399') +('6602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',64.14,'999','0','"6602 MEMBER','1','3400') +('2918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2239.00,'999','0','"2918 MEMBER','1','3401') +('39','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.53,'999','0','"39 MEMBER','1','3402') +('412','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',30.52,'999','0','"412 MEMBER','1','3403') +('2835','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2835 MEMBER','1','3404') +('586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1409.77,'999','0','"586 MEMBER','1','3405') +('2818','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',980.27,'999','0','"2818 MEMBER','1','3406') +('144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',105.87,'999','1','"144 MEMBER','1','3407') +('6765','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',10.29,'999','0','"6765 MEMBER','1','3408') +('3223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',129.92,'999','0','"3223 MEMBER','1','3409') +('6515','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1375.41,'999','0','"6515 MEMBER','1','3410') +('4146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4146 MEMBER','1','3411') +('61','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',437.16,'999','0','"61 MEMBER','1','3412') +('6735','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',53.75,'999','1','"6735 MEMBER','1','3413') +('6437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',320.37,'999','0','"6437 MEMBER','1','3414') +('5089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5089 MEMBER','1','3415') +('1139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',282.49,'999','1','"1139 MEMBER','1','3416') +('4313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4313 MEMBER','1','3417') +('2024','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2024 MEMBER','1','3418') +('160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"160 MEMBER','1','3419') +('8311','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8311 MEMBER','1','3420') +('1953','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',400.76,'999','1','"1953 MEMBER','1','3421') +('577','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',588.05,'999','0','"577 MEMBER','1','3422') +('6574','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',710.42,'999','0','"6574 MEMBER','1','3423') +('4203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4203 MEMBER','1','3424') +('8487','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8487 MEMBER','1','3425') +('10104','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10104 MEMBER','1','3426') +('6267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',846.84,'999','0','"6267 MEMBER','1','3427') +('4832','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',278.74,'999','1','"4832 MEMBER','1','3428') +('9040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9040 MEMBER','1','3429') +('3029','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',150.12,'999','1','"3029 MEMBER','1','3430') +('4308','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',76.78,'999','1','"4308 MEMBER','1','3431') +('5111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5111 MEMBER','1','3432') +('116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"116 MEMBER','1','3433') +('2327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2327 MEMBER','1','3434') +('6756','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',49.92,'999','0','"6756 MEMBER','1','3435') +('5003','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5003 MEMBER','1','3436') +('6759','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.51,'999','1','"6759 MEMBER','1','3437') +('2348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',686.04,'999','0','"2348 MEMBER','1','3438') +('1855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1855 MEMBER','1','3439') +('4508','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4508 MEMBER','1','3440') +('4921','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',182.71,'999','1','"4921 MEMBER','1','3441') +('6783','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.70,'999','0','"6783 MEMBER','1','3442') +('925','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.02,'999','1','"925 MEMBER','1','3443') +('2565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4685.11,'999','0','"2565 MEMBER','1','3444') +('4282','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',15458.96,'999','0','"4282 MEMBER','1','3445') +('104','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"104 MEMBER','1','3446') +('4820','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3618.61,'999','0','"4820 MEMBER','1','3447') +('2994','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',43.15,'999','1','"2994 MEMBER','1','3448') +('21','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',993.51,'999','0','"21 MEMBER','1','3449') +('6548','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',1042.55,'999','0','"6548 MEMBER','1','3450') +('227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1584.60,'999','0','"227 MEMBER','1','3451') +('538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1420.54,'999','1','"538 MEMBER','1','3452') +('4764','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3533.55,'999','0','"4764 MEMBER','1','3453') +('1716','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4785.14,'999','0','"1716 MEMBER','1','3454') +('2223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1878.99,'999','0','"2223 MEMBER','1','3455') +('68','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3755.61,'999','0','"68 MEMBER','1','3456') +('6392','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',722.16,'999','0','"6392 MEMBER','1','3457') +('4831','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',262.09,'999','0','"4831 MEMBER','1','3458') +('4251','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',866.32,'999','1','"4251 MEMBER','1','3459') +('2430','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2430 MEMBER','1','3460') +('1941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1941 MEMBER','1','3461') +('6457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',405.07,'999','0','"6457 MEMBER','1','3462') +('4269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4269 MEMBER','1','3463') +('6605','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',240.80,'999','1','"6605 MEMBER','1','3464') +('6415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',419.08,'999','0','"6415 MEMBER','1','3465') +('538','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1420.54,'999','1','"538 MEMBER','1','3466') +('4949','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',121.32,'999','0','"4949 MEMBER','1','3467') +('6397','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1302.94,'999','0','"6397 MEMBER','1','3468') +('6505','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',123.90,'999','0','"6505 MEMBER','1','3469') +('1638','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',209.25,'999','0','"1638 MEMBER','1','3470') +('4235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1030.84,'999','0','"4235 MEMBER','1','3471') +('4512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',199.51,'999','1','"4512 MEMBER','1','3472') +('4945','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',569.51,'999','1','"4945 MEMBER','1','3473') +('6528','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',986.18,'999','0','"6528 MEMBER','1','3474') +('3140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3140 MEMBER','1','3475') +('1036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1488.69,'999','0','"1036 MEMBER','1','3476') +('6948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"6948 MEMBER','1','3477') +('6964','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6964 MEMBER','1','3478') +('6965','1','LASTNAME','FIRSTNAME',999.99,16.50,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6965 MEMBER','1','3479') +('6978','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6978 MEMBER','1','3480') +('6957','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6957 MEMBER','1','3481') +('6983','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6983 MEMBER','1','3482') +('6999','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6999 MEMBER','1','3483') +('7014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7014 MEMBER','1','3484') +('6961','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6961 MEMBER','1','3485') +('5192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5192 MEMBER','1','3486') +('1733','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',79.22,'999','1','"1733 MEMBER','1','3487') +('3365','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5108.11,'999','0','"3365 MEMBER','1','3488') +('3132','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',439.54,'999','0','"3132 MEMBER','1','3489') +('6452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2606.79,'999','1','"6452 MEMBER','1','3490') +('5114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',147.25,'999','0','"5114 MEMBER','1','3491') +('6007','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',388.04,'999','0','"6007 MEMBER','1','3492') +('6639','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1028.49,'999','1','"6639 MEMBER','1','3493') +('4784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3369.92,'999','0','"4784 MEMBER','1','3494') +('8333','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8333 MEMBER','1','3495') +('6009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',1875.26,'999','0','"6009 MEMBER','1','3496') +('5035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5035 MEMBER','1','3497') +('6294','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',271.86,'999','1','"6294 MEMBER','1','3498') +('8131','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8131 MEMBER','1','3499') +('8242','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8242 MEMBER','1','3500') +('6705','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',10.72,'999','0','"6705 MEMBER','1','3501') +('4288','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4288 MEMBER','1','3502') +('2971','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2971 MEMBER','1','3503') +('1492','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',276.81,'999','1','"1492 MEMBER','1','3504') +('872','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',114.41,'999','1','"872 MEMBER','1','3505') +('6391','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1924.24,'999','1','"6391 MEMBER','1','3506') +('6433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',994.01,'999','0','"6433 MEMBER','1','3507') +('1123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1123 MEMBER','1','3508') +('1685','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',64.36,'999','0','"1685 MEMBER','1','3509') +('619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10773.60,'999','1','"619 MEMBER','1','3510') +('4684','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',397.54,'999','0','"4684 MEMBER','1','3511') +('2143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2143 MEMBER','1','3512') +('438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9192.32,'999','0','"438 MEMBER','1','3513') +('6479','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',216.88,'999','1','"6479 MEMBER','1','3514') +('1689','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1689 MEMBER','1','3515') +('3408','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3.99,'999','1','"3408 MEMBER','1','3516') +('1714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1714 MEMBER','1','3517') +('1435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1435 MEMBER','1','3518') +('4805','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',336.42,'999','0','"4805 MEMBER','1','3519') +('5118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',1593.19,'999','0','"5118 MEMBER','1','3520') +('281','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"281 MEMBER','1','3521') +('427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.44,'999','1','"427 MEMBER','1','3522') +('5134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5134 MEMBER','1','3523') +('6383','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',319.31,'999','0','"6383 MEMBER','1','3524') +('3197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2249.59,'999','0','"3197 MEMBER','1','3525') +('413','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1200.35,'999','0','"413 MEMBER','1','3526') +('6661','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',870.79,'999','0','"6661 MEMBER','1','3527') +('2243','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2243 MEMBER','1','3528') +('4891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',335.38,'999','0','"4891 MEMBER','1','3529') +('91','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"91 MEMBER','1','3530') +('2413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2413 MEMBER','1','3531') +('125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',37.11,'999','1','"125 MEMBER','1','3532') +('4466','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',476.42,'999','1','"4466 MEMBER','1','3533') +('307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"307 MEMBER','1','3534') +('6279','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',296.16,'999','1','"6279 MEMBER','1','3535') +('1339','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',307.30,'999','1','"1339 MEMBER','1','3536') +('4801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',127.75,'999','0','"4801 MEMBER','1','3537') +('6689','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1054.53,'999','0','"6689 MEMBER','1','3538') +('4868','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2692.16,'999','0','"4868 MEMBER','1','3539') +('4848','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',934.50,'999','0','"4848 MEMBER','1','3540') +('4441','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4441 MEMBER','1','3541') +('5059','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5059 MEMBER','1','3542') +('63','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"63 MEMBER','1','3543') +('9034','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9034 MEMBER','1','3544') +('5174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5174 MEMBER','1','3545') +('6945','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6945 MEMBER','1','3546') +('6952','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6952 MEMBER','1','3547') +('6962','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6962 MEMBER','1','3548') +('6973','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6973 MEMBER','1','3549') +('6942','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6942 MEMBER','1','3550') +('6900','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6900 MEMBER','1','3551') +('6947','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6947 MEMBER','1','3552') +('7023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7023 MEMBER','1','3553') +('6977','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6977 MEMBER','1','3554') +('7038','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7038 MEMBER','1','3555') +('7059','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7059 MEMBER','1','3556') +('2319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2319 MEMBER','1','3557') +('2958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',51.27,'999','0','"2958 MEMBER','1','3558') +('3132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',439.54,'999','0','"3132 MEMBER','1','3559') +('4112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3726.04,'999','0','"4112 MEMBER','1','3560') +('6374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3034.77,'999','0','"6374 MEMBER','1','3561') +('4668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',638.30,'999','0','"4668 MEMBER','1','3562') +('5056','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5056 MEMBER','1','3563') +('4078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2089.76,'999','1','"4078 MEMBER','1','3564') +('4290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',943.19,'999','0','"4290 MEMBER','1','3565') +('4267','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',778.89,'999','1','"4267 MEMBER','1','3566') +('6222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',216.59,'999','1','"6222 MEMBER','1','3567') +('4973','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',166.71,'999','0','"4973 MEMBER','1','3568') +('588','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',47.82,'999','1','"588 MEMBER','1','3569') +('71','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',146.50,'999','0','"71 MEMBER','1','3570') +('312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"312 MEMBER','1','3571') +('4840','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1728.15,'999','0','"4840 MEMBER','1','3572') +('3420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1693.31,'999','1','"3420 MEMBER','1','3573') +('4131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1706.40,'999','0','"4131 MEMBER','1','3574') +('4549','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4549 MEMBER','1','3575') +('3252','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'1','1','1','REG','0','0','0',28.18,'999','0','"3252 MEMBER','1','3576') +('521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',168.09,'999','1','"521 MEMBER','1','3577') +('1005','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1201.06,'999','1','"1005 MEMBER','1','3578') +('2197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2534.27,'999','0','"2197 MEMBER','1','3579') +('4265','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5408.35,'999','0','"4265 MEMBER','1','3580') +('4577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',40.65,'999','0','"4577 MEMBER','1','3581') +('4495','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4495 MEMBER','1','3582') +('2446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2446 MEMBER','1','3583') +('1120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1120 MEMBER','1','3584') +('5071','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5071 MEMBER','1','3585') +('6133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',300.05,'999','0','"6133 MEMBER','1','3586') +('4542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4741.76,'999','0','"4542 MEMBER','1','3587') +('2492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',451.99,'999','1','"2492 MEMBER','1','3588') +('9032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9032 MEMBER','1','3589') +('6348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1756.92,'999','0','"6348 MEMBER','1','3590') +('4498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4498 MEMBER','1','3591') +('6429','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',91.69,'999','1','"6429 MEMBER','1','3592') +('1476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"1476 MEMBER','1','3593') +('5075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5075 MEMBER','1','3594') +('6584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',114.72,'999','0','"6584 MEMBER','1','3595') +('4297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',6069.43,'999','1','"4297 MEMBER','1','3596') +('2755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2.11,'999','1','"2755 MEMBER','1','3597') +('4219','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',530.78,'999','0','"4219 MEMBER','1','3598') +('2517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2517 MEMBER','1','3599') +('2600','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2600 MEMBER','1','3600') +('4384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',75.95,'999','1','"4384 MEMBER','1','3601') +('2757','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',1919.28,'999','1','"2757 MEMBER','1','3602') +('6707','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',614.51,'999','0','"6707 MEMBER','1','3603') +('4767','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4767 MEMBER','1','3604') +('326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"326 MEMBER','1','3605') +('2839','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2839 MEMBER','1','3606') +('2085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',66.39,'999','1','"2085 MEMBER','1','3607') +('4707','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',594.64,'999','0','"4707 MEMBER','1','3608') +('4470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4470 MEMBER','1','3609') +('1538','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1538 MEMBER','1','3610') +('4302','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6536.51,'999','0','"4302 MEMBER','1','3611') +('6718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',58.60,'999','0','"6718 MEMBER','1','3612') +('3409','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',47.17,'999','1','"3409 MEMBER','1','3613') +('6644','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',41.44,'999','0','"6644 MEMBER','1','3614') +('4908','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3201.91,'999','0','"4908 MEMBER','1','3615') +('4000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1497.59,'999','1','"4000 MEMBER','1','3616') +('3282','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',353.72,'999','1','"3282 MEMBER','1','3617') +('460','2','LASTNAME','FIRSTNAME',999.99,19.97,'0',20.00,'1','0','1','PC','1','0','0',134.72,'999','1','"460 MEMBER','1','3618') +('5113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5113 MEMBER','1','3619') +('6977','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6977 MEMBER','1','3620') +('6979','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6979 MEMBER','1','3621') +('6948','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"6948 MEMBER','1','3622') +('6954','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6954 MEMBER','1','3623') +('6988','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6988 MEMBER','1','3624') +('5185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5185 MEMBER','1','3625') +('7046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7046 MEMBER','1','3626') +('6620','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',823.98,'999','0','"6620 MEMBER','1','3627') +('5120','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',23.92,'999','0','"5120 MEMBER','1','3628') +('8827','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8827 MEMBER','1','3629') +('2745','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"2745 MEMBER','1','3630') +('396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"396 MEMBER','1','3631') +('2073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2494.99,'999','1','"2073 MEMBER','1','3632') +('8249','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8249 MEMBER','1','3633') +('4083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2347.84,'999','0','"4083 MEMBER','1','3634') +('8279','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8279 MEMBER','1','3635') +('6724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',124.98,'999','0','"6724 MEMBER','1','3636') +('6766','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',95.43,'999','0','"6766 MEMBER','1','3637') +('9070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',97.50,'999','0','"9070 MEMBER','1','3638') +('8828','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8828 MEMBER','1','3639') +('6180','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2699.03,'999','1','"6180 MEMBER','1','3640') +('4977','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',679.07,'999','0','"4977 MEMBER','1','3641') +('3077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3077 MEMBER','1','3642') +('175','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5191.89,'999','0','"175 MEMBER','1','3643') +('1076','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1076 MEMBER','1','3644') +('26','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1940.89,'999','0','"26 MEMBER','1','3645') +('4043','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',569.92,'999','1','"4043 MEMBER','1','3646') +('4753','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',8.79,'999','0','"4753 MEMBER','1','3647') +('474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"474 MEMBER','1','3648') +('228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1474.99,'999','0','"228 MEMBER','1','3649') +('4893','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2523.50,'999','1','"4893 MEMBER','1','3650') +('4001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4001 MEMBER','1','3651') +('4520','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1207.80,'999','0','"4520 MEMBER','1','3652') +('931','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',214.61,'999','1','"931 MEMBER','1','3653') +('1306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7747.11,'999','0','"1306 MEMBER','1','3654') +('4097','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4097 MEMBER','1','3655') +('3012','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1478.83,'999','1','"3012 MEMBER','1','3656') +('1249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1249 MEMBER','1','3657') +('6394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1326.17,'999','0','"6394 MEMBER','1','3658') +('620','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7.44,'999','1','"620 MEMBER','1','3659') +('4469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',294.17,'999','1','"4469 MEMBER','1','3660') +('4973','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',166.71,'999','0','"4973 MEMBER','1','3661') +('4531','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',423.66,'999','1','"4531 MEMBER','1','3662') +('4230','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',757.56,'999','1','"4230 MEMBER','1','3663') +('4324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',267.15,'999','1','"4324 MEMBER','1','3664') +('1061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',309.47,'999','0','"1061 MEMBER','1','3665') +('4174','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',5183.33,'999','0','"4174 MEMBER','1','3666') +('4300','2','LASTNAME','FIRSTNAME',999.99,25.04,'10',100.00,'1','0','1','PC','3','1','0',2663.63,'999','0','"4300 MEMBER','1','3667') +('2788','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2788 MEMBER','1','3668') +('4879','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1052.02,'999','1','"4879 MEMBER','1','3669') +('6587','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',336.30,'999','0','"6587 MEMBER','1','3670') +('4808','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',630.56,'999','1','"4808 MEMBER','1','3671') +('247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"247 MEMBER','1','3672') +('4037','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4603.57,'999','0','"4037 MEMBER','1','3673') +('4512','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',199.51,'999','1','"4512 MEMBER','1','3674') +('4652','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.64,'999','1','"4652 MEMBER','1','3675') +('4851','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',98.47,'999','0','"4851 MEMBER','1','3676') +('4485','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5894.72,'999','0','"4485 MEMBER','1','3677') +('4790','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',189.68,'999','1','"4790 MEMBER','1','3678') +('2753','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.29,'999','1','"2753 MEMBER','1','3679') +('9021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9021 MEMBER','1','3680') +('6235','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.74,'999','1','"6235 MEMBER','1','3681') +('1437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2500.06,'999','0','"1437 MEMBER','1','3682') +('4672','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2.52,'999','0','"4672 MEMBER','1','3683') +('1419','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1851.89,'999','1','"1419 MEMBER','1','3684') +('6557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',44.93,'999','0','"6557 MEMBER','1','3685') +('4705','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',102.20,'999','0','"4705 MEMBER','1','3686') +('2178','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2178 MEMBER','1','3687') +('6784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',70.38,'999','0','"6784 MEMBER','1','3688') +('6934','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6934 MEMBER','1','3689') +('6961','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6961 MEMBER','1','3690') +('6963','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6963 MEMBER','1','3691') +('6971','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6971 MEMBER','1','3692') +('6986','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6986 MEMBER','1','3693') +('7019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7019 MEMBER','1','3694') +('5183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5183 MEMBER','1','3695') +('5188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',0.00,'999','0','"5188 MEMBER','1','3696') +('4874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1767.63,'999','1','"4874 MEMBER','1','3697') +('10293','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10293 MEMBER','1','3698') +('8623','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8623 MEMBER','1','3699') +('6418','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6418 MEMBER','1','3700') +('4893','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2523.50,'999','1','"4893 MEMBER','1','3701') +('3365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5108.11,'999','0','"3365 MEMBER','1','3702') +('4872','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1244.83,'999','0','"4872 MEMBER','1','3703') +('2557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1760.81,'999','0','"2557 MEMBER','1','3704') +('10045','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10045 MEMBER','1','3705') +('6767','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',54.31,'999','1','"6767 MEMBER','1','3706') +('1993','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1993 MEMBER','1','3707') +('3100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3100 MEMBER','1','3708') +('6387','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',264.11,'999','0','"6387 MEMBER','1','3709') +('4092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1182.39,'999','1','"4092 MEMBER','1','3710') +('4446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5878.03,'999','1','"4446 MEMBER','1','3711') +('2701','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2701 MEMBER','1','3712') +('215','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1838.06,'999','0','"215 MEMBER','1','3713') +('4172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4172 MEMBER','1','3714') +('1781','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',93.84,'999','0','"1781 MEMBER','1','3715') +('551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"551 MEMBER','1','3716') +('1086','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1086 MEMBER','1','3717') +('5158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',25.20,'999','0','"5158 MEMBER','1','3718') +('2428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2428 MEMBER','1','3719') +('6654','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',812.93,'999','1','"6654 MEMBER','1','3720') +('8658','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8658 MEMBER','1','3721') +('9056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9056 MEMBER','1','3722') +('6325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',163.36,'999','1','"6325 MEMBER','1','3723') +('169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1666.28,'999','0','"169 MEMBER','1','3724') +('4450','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4450 MEMBER','1','3725') +('2208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2208 MEMBER','1','3726') +('4624','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',18.79,'999','1','"4624 MEMBER','1','3727') +('2189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2189 MEMBER','1','3728') +('1650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1650 MEMBER','1','3729') +('6511','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','1','0',937.11,'999','1','"6511 MEMBER','1','3730') +('883','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.51,'999','1','"883 MEMBER','1','3731') +('522','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',202.66,'999','1','"522 MEMBER','1','3732') +('909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"909 MEMBER','1','3733') +('5124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5124 MEMBER','1','3734') +('4496','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4496 MEMBER','1','3735') +('1552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1552 MEMBER','1','3736') +('6299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',963.05,'999','1','"6299 MEMBER','1','3737') +('1295','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.33,'999','1','"1295 MEMBER','1','3738') +('3073','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2567.94,'999','0','"3073 MEMBER','1','3739') +('6262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',733.95,'999','0','"6262 MEMBER','1','3740') +('6171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2503.34,'999','0','"6171 MEMBER','1','3741') +('3130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.43,'999','1','"3130 MEMBER','1','3742') +('6294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',271.86,'999','1','"6294 MEMBER','1','3743') +('3130','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.43,'999','1','"3130 MEMBER','1','3744') +('4964','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',513.74,'999','1','"4964 MEMBER','1','3745') +('4426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',421.04,'999','1','"4426 MEMBER','1','3746') +('4228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4228 MEMBER','1','3747') +('4875','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7519.87,'999','0','"4875 MEMBER','1','3748') +('5135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1897.01,'999','0','"5135 MEMBER','1','3749') +('4739','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',97.82,'999','1','"4739 MEMBER','1','3750') +('180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4389.96,'999','0','"180 MEMBER','1','3751') +('4451','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5236.55,'999','0','"4451 MEMBER','1','3752') +('5044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5044 MEMBER','1','3753') +('5083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',735.58,'999','0','"5083 MEMBER','1','3754') +('3016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3016 MEMBER','1','3755') +('4878','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4878 MEMBER','1','3756') +('6923','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6923 MEMBER','1','3757') +('5176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5176 MEMBER','1','3758') +('6954','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6954 MEMBER','1','3759') +('6951','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6951 MEMBER','1','3760') +('6955','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6955 MEMBER','1','3761') +('6991','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6991 MEMBER','1','3762') +('6996','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6996 MEMBER','1','3763') +('7028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7028 MEMBER','1','3764') +('6994','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6994 MEMBER','1','3765') +('4785','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',344.92,'999','1','"4785 MEMBER','1','3766') +('4132','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',265.22,'999','1','"4132 MEMBER','1','3767') +('250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.10,'999','1','"250 MEMBER','1','3768') +('1451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5485.55,'999','0','"1451 MEMBER','1','3769') +('4941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',199.37,'999','0','"4941 MEMBER','1','3770') +('4132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',265.22,'999','1','"4132 MEMBER','1','3771') +('9167','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9167 MEMBER','1','3772') +('6707','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',614.51,'999','0','"6707 MEMBER','1','3773') +('923','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',67.73,'999','0','"923 MEMBER','1','3774') +('6576','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',80.26,'999','0','"6576 MEMBER','1','3775') +('2670','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2670 MEMBER','1','3776') +('5013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5013 MEMBER','1','3777') +('10188','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10188 MEMBER','1','3778') +('4340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1840.78,'999','0','"4340 MEMBER','1','3779') +('4376','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1062.86,'999','0','"4376 MEMBER','1','3780') +('379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"379 MEMBER','1','3781') +('4527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',369.57,'999','0','"4527 MEMBER','1','3782') +('459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"459 MEMBER','1','3783') +('2625','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1285.34,'999','0','"2625 MEMBER','1','3784') +('391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.53,'999','1','"391 MEMBER','1','3785') +('1773','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',355.78,'999','0','"1773 MEMBER','1','3786') +('4393','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2901.20,'999','0','"4393 MEMBER','1','3787') +('1421','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',239.04,'999','1','"1421 MEMBER','1','3788') +('6268','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1437.39,'999','0','"6268 MEMBER','1','3789') +('2749','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2057.59,'999','1','"2749 MEMBER','1','3790') +('201','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',242.99,'999','1','"201 MEMBER','1','3791') +('494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8843.42,'999','0','"494 MEMBER','1','3792') +('6746','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2.99,'999','0','"6746 MEMBER','1','3793') +('6466','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2097.30,'999','0','"6466 MEMBER','1','3794') +('5061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1797.33,'999','0','"5061 MEMBER','1','3795') +('4854','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4854 MEMBER','1','3796') +('4862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',719.62,'999','0','"4862 MEMBER','1','3797') +('992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"992 MEMBER','1','3798') +('2137','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',818.10,'999','0','"2137 MEMBER','1','3799') +('475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',688.85,'999','0','"475 MEMBER','1','3800') +('4495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4495 MEMBER','1','3801') +('4988','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',500.97,'999','1','"4988 MEMBER','1','3802') +('6236','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',817.36,'999','0','"6236 MEMBER','1','3803') +('388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',737.98,'999','0','"388 MEMBER','1','3804') +('5101','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1848.24,'999','0','"5101 MEMBER','1','3805') +('4784','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3369.92,'999','0','"4784 MEMBER','1','3806') +('3212','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8761.06,'999','0','"3212 MEMBER','1','3807') +('4723','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1618.78,'999','1','"4723 MEMBER','1','3808') +('5112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',46.35,'999','0','"5112 MEMBER','1','3809') +('4200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',98.60,'999','0','"4200 MEMBER','1','3810') +('2275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2275 MEMBER','1','3811') +('6411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2064.03,'999','0','"6411 MEMBER','1','3812') +('3291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3573.66,'999','0','"3291 MEMBER','1','3813') +('3201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3201 MEMBER','1','3814') +('2187','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.27,'999','1','"2187 MEMBER','1','3815') +('406','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4081.09,'999','0','"406 MEMBER','1','3816') +('6608','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',289.35,'999','1','"6608 MEMBER','1','3817') +('3037','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',816.48,'999','0','"3037 MEMBER','1','3818') +('5158','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',25.20,'999','0','"5158 MEMBER','1','3819') +('4110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3418.60,'999','0','"4110 MEMBER','1','3820') +('273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"273 MEMBER','1','3821') +('4511','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',517.48,'999','0','"4511 MEMBER','1','3822') +('3241','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',12.61,'999','0','"3241 MEMBER','1','3823') +('132','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7556.40,'999','0','"132 MEMBER','1','3824') +('4777','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1194.97,'999','1','"4777 MEMBER','1','3825') +('864','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"864 MEMBER','1','3826') +('4463','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',409.10,'999','1','"4463 MEMBER','1','3827') +('2301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2301 MEMBER','1','3828') +('1168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1168 MEMBER','1','3829') +('4565','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',653.64,'999','1','"4565 MEMBER','1','3830') +('9071','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9071 MEMBER','1','3831') +('4789','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2588.55,'999','0','"4789 MEMBER','1','3832') +('6681','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',176.54,'999','0','"6681 MEMBER','1','3833') +('6905','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6905 MEMBER','1','3834') +('6946','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6946 MEMBER','1','3835') +('351','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3902.48,'999','0','"351 MEMBER','1','3836') +('6434','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',153.80,'999','0','"6434 MEMBER','1','3837') +('6656','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',322.24,'999','1','"6656 MEMBER','1','3838') +('6169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1293.53,'999','0','"6169 MEMBER','1','3839') +('4302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6536.51,'999','0','"4302 MEMBER','1','3840') +('4609','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',631.57,'999','0','"4609 MEMBER','1','3841') +('490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"490 MEMBER','1','3842') +('4740','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7174.26,'999','0','"4740 MEMBER','1','3843') +('6128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',18.52,'999','0','"6128 MEMBER','1','3844') +('37','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',336.80,'999','0','"37 MEMBER','1','3845') +('6616','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',690.11,'999','0','"6616 MEMBER','1','3846') +('209','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',896.28,'999','1','"209 MEMBER','1','3847') +('4563','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2075.38,'999','0','"4563 MEMBER','1','3848') +('1859','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1859 MEMBER','1','3849') +('6290','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',238.09,'999','0','"6290 MEMBER','1','3850') +('3346','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',707.68,'999','0','"3346 MEMBER','1','3851') +('4894','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',365.33,'999','0','"4894 MEMBER','1','3852') +('6501','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1479.31,'999','0','"6501 MEMBER','1','3853') +('4002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4002 MEMBER','1','3854') +('9280','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9280 MEMBER','1','3855') +('6265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1313.48,'999','0','"6265 MEMBER','1','3856') +('4188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',299.42,'999','1','"4188 MEMBER','1','3857') +('3307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1018.30,'999','0','"3307 MEMBER','1','3858') +('6012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',94.56,'999','0','"6012 MEMBER','1','3859') +('5097','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5097 MEMBER','1','3860') +('306','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',346.59,'999','1','"306 MEMBER','1','3861') +('577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',588.05,'999','0','"577 MEMBER','1','3862') +('10472','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10472 MEMBER','1','3863') +('2305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2305 MEMBER','1','3864') +('1873','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',604.49,'999','1','"1873 MEMBER','1','3865') +('1863','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1863 MEMBER','1','3866') +('6391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1924.24,'999','1','"6391 MEMBER','1','3867') +('3096','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3922.62,'999','0','"3096 MEMBER','1','3868') +('4438','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4438 MEMBER','1','3869') +('4346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3118.67,'999','1','"4346 MEMBER','1','3870') +('6493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',202.84,'999','1','"6493 MEMBER','1','3871') +('4814','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',831.39,'999','0','"4814 MEMBER','1','3872') +('4924','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',124.65,'999','0','"4924 MEMBER','1','3873') +('4704','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',274.79,'999','1','"4704 MEMBER','1','3874') +('4444','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4444 MEMBER','1','3875') +('4323','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.01,'999','1','"4323 MEMBER','1','3876') +('4352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',258.20,'999','0','"4352 MEMBER','1','3877') +('4072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',8.96,'999','0','"4072 MEMBER','1','3878') +('1848','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1848 MEMBER','1','3879') +('4691','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.93,'999','1','"4691 MEMBER','1','3880') +('522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.66,'999','1','"522 MEMBER','1','3881') +('6172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',92.10,'999','0','"6172 MEMBER','1','3882') +('6319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',733.01,'999','0','"6319 MEMBER','1','3883') +('4883','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1872.55,'999','0','"4883 MEMBER','1','3884') +('2227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1828.63,'999','0','"2227 MEMBER','1','3885') +('4449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',410.35,'999','1','"4449 MEMBER','1','3886') +('2189','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2189 MEMBER','1','3887') +('1266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1266 MEMBER','1','3888') +('4327','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2053.44,'999','0','"4327 MEMBER','1','3889') +('7691','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7691 MEMBER','1','3890') +('4943','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',95.90,'999','1','"4943 MEMBER','1','3891') +('4978','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',426.10,'999','1','"4978 MEMBER','1','3892') +('438','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',9192.32,'999','0','"438 MEMBER','1','3893') +('2498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2498 MEMBER','1','3894') +('866','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1858.56,'999','0','"866 MEMBER','1','3895') +('6175','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',171.05,'999','1','"6175 MEMBER','1','3896') +('6361','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2340.11,'999','0','"6361 MEMBER','1','3897') +('6191','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1018.13,'999','1','"6191 MEMBER','1','3898') +('104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"104 MEMBER','1','3899') +('350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"350 MEMBER','1','3900') +('534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3113.71,'999','0','"534 MEMBER','1','3901') +('6607','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',170.54,'999','0','"6607 MEMBER','1','3902') +('6909','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6909 MEMBER','1','3903') +('6931','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6931 MEMBER','1','3904') +('6935','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6935 MEMBER','1','3905') +('2103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1276.15,'999','0','"2103 MEMBER','1','3906') +('429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1081.59,'999','0','"429 MEMBER','1','3907') +('2833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3631.81,'999','0','"2833 MEMBER','1','3908') +('4031','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',838.23,'999','1','"4031 MEMBER','1','3909') +('4598','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',256.63,'999','1','"4598 MEMBER','1','3910') +('1925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1925 MEMBER','1','3911') +('4790','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',189.68,'999','1','"4790 MEMBER','1','3912') +('6763','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',127.95,'999','0','"6763 MEMBER','1','3913') +('9020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9020 MEMBER','1','3914') +('4638','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',119.72,'999','0','"4638 MEMBER','1','3915') +('287','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',154.80,'999','0','"287 MEMBER','1','3916') +('6783','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.70,'999','0','"6783 MEMBER','1','3917') +('2847','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',514.84,'999','1','"2847 MEMBER','1','3918') +('1370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',310.95,'999','1','"1370 MEMBER','1','3919') +('6747','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',109.42,'999','0','"6747 MEMBER','1','3920') +('1553','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3785.45,'999','0','"1553 MEMBER','1','3921') +('277','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"277 MEMBER','1','3922') +('1482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',657.06,'999','1','"1482 MEMBER','1','3923') +('4809','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4809 MEMBER','1','3924') +('233','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"233 MEMBER','1','3925') +('10511','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10511 MEMBER','1','3926') +('6432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',274.37,'999','1','"6432 MEMBER','1','3927') +('1698','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1698 MEMBER','1','3928') +('4024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',27.69,'999','0','"4024 MEMBER','1','3929') +('866','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1858.56,'999','0','"866 MEMBER','1','3930') +('886','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1832.06,'999','0','"886 MEMBER','1','3931') +('1490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1484.98,'999','0','"1490 MEMBER','1','3932') +('6143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',658.90,'999','1','"6143 MEMBER','1','3933') +('1433','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3392.54,'999','0','"1433 MEMBER','1','3934') +('5042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5042 MEMBER','1','3935') +('492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1124.45,'999','0','"492 MEMBER','1','3936') +('4279','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4279 MEMBER','1','3937') +('6616','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',690.11,'999','0','"6616 MEMBER','1','3938') +('2012','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2012 MEMBER','1','3939') +('9271','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9271 MEMBER','1','3940') +('4696','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',469.91,'999','0','"4696 MEMBER','1','3941') +('6291','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',32.71,'999','0','"6291 MEMBER','1','3942') +('4674','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',69.18,'999','0','"4674 MEMBER','1','3943') +('5126','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5126 MEMBER','1','3944') +('1383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',245.18,'999','1','"1383 MEMBER','1','3945') +('4053','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',8341.38,'999','0','"4053 MEMBER','1','3946') +('84','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"84 MEMBER','1','3947') +('3151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3151 MEMBER','1','3948') +('4188','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',299.42,'999','1','"4188 MEMBER','1','3949') +('4737','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7666.38,'999','0','"4737 MEMBER','1','3950') +('4377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4377 MEMBER','1','3951') +('498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',360.97,'999','1','"498 MEMBER','1','3952') +('342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',757.91,'999','1','"342 MEMBER','1','3953') +('6636','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7.18,'999','1','"6636 MEMBER','1','3954') +('3354','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',134.86,'999','1','"3354 MEMBER','1','3955') +('3417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3417 MEMBER','1','3956') +('4427','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',861.98,'999','0','"4427 MEMBER','1','3957') +('4164','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1481.63,'999','0','"4164 MEMBER','1','3958') +('9093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9093 MEMBER','1','3959') +('4475','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',39.41,'999','0','"4475 MEMBER','1','3960') +('6287','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3252.58,'999','0','"6287 MEMBER','1','3961') +('4410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',117.16,'999','1','"4410 MEMBER','1','3962') +('4525','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',396.18,'999','0','"4525 MEMBER','1','3963') +('4055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1482.37,'999','1','"4055 MEMBER','1','3964') +('1378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',599.78,'999','0','"1378 MEMBER','1','3965') +('4744','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',245.01,'999','0','"4744 MEMBER','1','3966') +('6888','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6888 MEMBER','1','3967') +('6903','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6903 MEMBER','1','3968') +('6909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6909 MEMBER','1','3969') +('6907','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6907 MEMBER','1','3970') +('6915','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6915 MEMBER','1','3971') +('5175','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',50.00,'1','1','1','REG','9','1','0',NULL,'999','0','"5175 MEMBER','1','3972') +('6958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6958 MEMBER','1','3973') +('6968','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6968 MEMBER','1','3974') +('10254','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10254 MEMBER','1','3975') +('1474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5981.85,'999','0','"1474 MEMBER','1','3976') +('6738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',160.56,'999','0','"6738 MEMBER','1','3977') +('4292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',963.40,'999','1','"4292 MEMBER','1','3978') +('1504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1504 MEMBER','1','3979') +('363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',472.18,'999','1','"363 MEMBER','1','3980') +('9010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9010 MEMBER','1','3981') +('6554','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1022.16,'999','0','"6554 MEMBER','1','3982') +('2362','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2362 MEMBER','1','3983') +('4548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',286.03,'999','0','"4548 MEMBER','1','3984') +('1722','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1722 MEMBER','1','3985') +('6739','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',71.11,'999','0','"6739 MEMBER','1','3986') +('2955','1','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','1','1','PC','1','0','0',791.17,'999','1','"2955 MEMBER','1','3987') +('1918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1918 MEMBER','1','3988') +('4718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',137.09,'999','0','"4718 MEMBER','1','3989') +('4247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4247 MEMBER','1','3990') +('52','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"52 MEMBER','1','3991') +('4158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4158 MEMBER','1','3992') +('4500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',59.00,'999','0','"4500 MEMBER','1','3993') +('6328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',694.48,'999','0','"6328 MEMBER','1','3994') +('6019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1072.47,'999','0','"6019 MEMBER','1','3995') +('1226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',36.83,'999','1','"1226 MEMBER','1','3996') +('4281','1','LASTNAME','FIRSTNAME',999.99,11.64,'0',20.00,'1','1','1','PC','1','0','0',12448.27,'999','0','"4281 MEMBER','1','3997') +('5095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5095 MEMBER','1','3998') +('866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1858.56,'999','0','"866 MEMBER','1','3999') +('1617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1697.87,'999','0','"1617 MEMBER','1','4000') +('404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"404 MEMBER','1','4001') +('2392','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2392 MEMBER','1','4002') +('3096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3922.62,'999','0','"3096 MEMBER','1','4003') +('4200','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',98.60,'999','0','"4200 MEMBER','1','4004') +('217','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1328.45,'999','0','"217 MEMBER','1','4005') +('4125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4269.18,'999','0','"4125 MEMBER','1','4006') +('6485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2060.11,'999','0','"6485 MEMBER','1','4007') +('6578','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',406.69,'999','0','"6578 MEMBER','1','4008') +('4295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1138.43,'999','0','"4295 MEMBER','1','4009') +('1987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8.84,'999','1','"1987 MEMBER','1','4010') +('5001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',9065.69,'999','0','"5001 MEMBER','1','4011') +('2020','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',5757.95,'999','0','"2020 MEMBER','1','4012') +('291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"291 MEMBER','1','4013') +('6790','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4.95,'999','0','"6790 MEMBER','1','4014') +('4652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.64,'999','1','"4652 MEMBER','1','4015') +('4636','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',232.25,'999','0','"4636 MEMBER','1','4016') +('4520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1207.80,'999','0','"4520 MEMBER','1','4017') +('4977','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',679.07,'999','0','"4977 MEMBER','1','4018') +('2795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',158.63,'999','0','"2795 MEMBER','1','4019') +('4436','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1024.57,'999','0','"4436 MEMBER','1','4020') +('2346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',188.68,'999','1','"2346 MEMBER','1','4021') +('6003','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',546.54,'999','0','"6003 MEMBER','1','4022') +('4319','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',478.72,'999','0','"4319 MEMBER','1','4023') +('4150','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',203.45,'999','1','"4150 MEMBER','1','4024') +('4443','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6610.43,'999','0','"4443 MEMBER','1','4025') +('6760','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.28,'999','1','"6760 MEMBER','1','4026') +('4978','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',426.10,'999','1','"4978 MEMBER','1','4027') +('4557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',11.85,'999','1','"4557 MEMBER','1','4028') +('6776','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',116.27,'999','0','"6776 MEMBER','1','4029') +('6127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',417.23,'999','1','"6127 MEMBER','1','4030') +('4132','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',265.22,'999','1','"4132 MEMBER','1','4031') +('2870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10.26,'999','1','"2870 MEMBER','1','4032') +('4468','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3534.88,'999','0','"4468 MEMBER','1','4033') +('620','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.44,'999','1','"620 MEMBER','1','4034') +('4550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',33.22,'999','0','"4550 MEMBER','1','4035') +('263','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"263 MEMBER','1','4036') +('6370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1314.60,'999','0','"6370 MEMBER','1','4037') +('144','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',105.87,'999','1','"144 MEMBER','1','4038') +('4380','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',201.19,'999','1','"4380 MEMBER','1','4039') +('1358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1652.84,'999','0','"1358 MEMBER','1','4040') +('316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1005.61,'999','1','"316 MEMBER','1','4041') +('6615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.18,'999','1','"6615 MEMBER','1','4042') +('2811','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2811 MEMBER','1','4043') +('9237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9237 MEMBER','1','4044') +('1609','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',5839.97,'999','0','"1609 MEMBER','1','4045') +('2682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2682 MEMBER','1','4046') +('4817','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',59.74,'999','0','"4817 MEMBER','1','4047') +('216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',226.43,'999','0','"216 MEMBER','1','4048') +('4890','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4890 MEMBER','1','4049') +('2301','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2301 MEMBER','1','4050') +('2932','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"2932 MEMBER','1','4051') +('459','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"459 MEMBER','1','4052') +('467','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2168.32,'999','0','"467 MEMBER','1','4053') +('87','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"87 MEMBER','1','4054') +('6761','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',75.56,'999','0','"6761 MEMBER','1','4055') +('221','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"221 MEMBER','1','4056') +('3021','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3021 MEMBER','1','4057') +('6622','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6622 MEMBER','1','4058') +('2284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2284 MEMBER','1','4059') +('2077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',39.74,'999','1','"2077 MEMBER','1','4060') +('9059','1','LASTNAME','FIRSTNAME',999.99,84.37,'0',0.00,'1','1','1','TERM','0','0','0',401.25,'999','0','"9059 MEMBER','1','4061') +('1631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',45.90,'999','0','"1631 MEMBER','1','4062') +('5164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',124.86,'999','0','"5164 MEMBER','1','4063') +('2411','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',198.22,'999','1','"2411 MEMBER','1','4064') +('2432','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',141.08,'999','1','"2432 MEMBER','1','4065') +('2008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2008 MEMBER','1','4066') +('5085','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5085 MEMBER','1','4067') +('6220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',102.68,'999','1','"6220 MEMBER','1','4068') +('4551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',51.24,'999','0','"4551 MEMBER','1','4069') +('19','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2827.05,'999','0','"19 MEMBER','1','4070') +('2004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2004 MEMBER','1','4071') +('6386','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1675.09,'999','1','"6386 MEMBER','1','4072') +('6406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',537.33,'999','0','"6406 MEMBER','1','4073') +('6773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',173.19,'999','0','"6773 MEMBER','1','4074') +('886','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1832.06,'999','0','"886 MEMBER','1','4075') +('370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.55,'999','1','"370 MEMBER','1','4076') +('4601','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4601 MEMBER','1','4077') +('6441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2367.15,'999','0','"6441 MEMBER','1','4078') +('6714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',124.17,'999','0','"6714 MEMBER','1','4079') +('4038','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3806.94,'999','0','"4038 MEMBER','1','4080') +('4227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',864.88,'999','1','"4227 MEMBER','1','4081') +('1453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.10,'999','1','"1453 MEMBER','1','4082') +('2492','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','1',451.99,'999','1','"2492 MEMBER','1','4083') +('4627','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4627 MEMBER','1','4084') +('6756','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',49.92,'999','0','"6756 MEMBER','1','4085') +('925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.02,'999','1','"925 MEMBER','1','4086') +('3143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3143 MEMBER','1','4087') +('6601','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',69.86,'999','1','"6601 MEMBER','1','4088') +('2759','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',137.11,'999','1','"2759 MEMBER','1','4089') +('6262','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',733.95,'999','0','"6262 MEMBER','1','4090') +('2994','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.15,'999','1','"2994 MEMBER','1','4091') +('4706','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',504.03,'999','0','"4706 MEMBER','1','4092') +('5016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5016 MEMBER','1','4093') +('1873','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',604.49,'999','1','"1873 MEMBER','1','4094') +('1000','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',318.81,'999','1','"1000 MEMBER','1','4095') +('6235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.74,'999','1','"6235 MEMBER','1','4096') +('2251','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2251 MEMBER','1','4097') +('4396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3039.25,'999','0','"4396 MEMBER','1','4098') +('4595','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',345.48,'999','0','"4595 MEMBER','1','4099') +('4030','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',361.26,'999','0','"4030 MEMBER','1','4100') +('6408','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',711.74,'999','0','"6408 MEMBER','1','4101') +('9070','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',97.50,'999','0','"9070 MEMBER','1','4102') +('6181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5227.25,'999','0','"6181 MEMBER','1','4103') +('4932','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1579.16,'999','1','"4932 MEMBER','1','4104') +('6190','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2791.99,'999','0','"6190 MEMBER','1','4105') +('2707','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1465.95,'999','1','"2707 MEMBER','1','4106') +('44','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',256.98,'999','0','"44 MEMBER','1','4107') +('2502','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2502 MEMBER','1','4108') +('9039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9039 MEMBER','1','4109') +('6830','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6830 MEMBER','1','4110') +('51','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1072.23,'999','1','"51 MEMBER','1','4111') +('6884','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6884 MEMBER','1','4112') +('6335','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',105.89,'999','1','"6335 MEMBER','1','4113') +('5105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5105 MEMBER','1','4114') +('4758','1','LASTNAME','FIRSTNAME',999.99,14.71,'0',20.00,'1','1','1','PC','1','0','0',3167.26,'999','0','"4758 MEMBER','1','4115') +('451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"451 MEMBER','1','4116') +('289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2926.92,'999','0','"289 MEMBER','1','4117') +('2897','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2897 MEMBER','1','4118') +('6351','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',352.04,'999','0','"6351 MEMBER','1','4119') +('4219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',530.78,'999','0','"4219 MEMBER','1','4120') +('864','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"864 MEMBER','1','4121') +('511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1105.23,'999','0','"511 MEMBER','1','4122') +('3033','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',293.99,'999','1','"3033 MEMBER','1','4123') +('3110','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',778.65,'999','0','"3110 MEMBER','1','4124') +('2771','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',962.03,'999','0','"2771 MEMBER','1','4125') +('3171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3171 MEMBER','1','4126') +('4393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2901.20,'999','0','"4393 MEMBER','1','4127') +('489','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',166.77,'999','1','"489 MEMBER','1','4128') +('4551','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',51.24,'999','0','"4551 MEMBER','1','4129') +('4059','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4049.17,'999','0','"4059 MEMBER','1','4130') +('489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',166.77,'999','1','"489 MEMBER','1','4131') +('5108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5108 MEMBER','1','4132') +('2747','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2747 MEMBER','1','4133') +('6713','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.99,'999','1','"6713 MEMBER','1','4134') +('263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"263 MEMBER','1','4135') +('193','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',93.82,'999','1','"193 MEMBER','1','4137') +('122','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',74.43,'999','1','"122 MEMBER','1','4138') +('4870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4870 MEMBER','1','4139') +('4045','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1596.16,'999','0','"4045 MEMBER','1','4140') +('5030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',0.00,'999','0','"5030 MEMBER','1','4141') +('4290','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',943.19,'999','0','"4290 MEMBER','1','4142') +('1950','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1908.41,'999','0','"1950 MEMBER','1','4143') +('6203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1691.56,'999','0','"6203 MEMBER','1','4144') +('6142','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4612.19,'999','0','"6142 MEMBER','1','4145') +('4504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',156.25,'999','1','"4504 MEMBER','1','4146') +('189','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',789.28,'999','0','"189 MEMBER','1','4147') +('1806','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1806 MEMBER','1','4148') +('6596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',551.33,'999','0','"6596 MEMBER','1','4149') +('1755','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1755 MEMBER','1','4150') +('6239','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',342.89,'999','1','"6239 MEMBER','1','4151') +('4075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',479.95,'999','1','"4075 MEMBER','1','4152') +('4100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',503.05,'999','1','"4100 MEMBER','1','4153') +('4169','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',79.02,'999','1','"4169 MEMBER','1','4154') +('4464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',310.66,'999','1','"4464 MEMBER','1','4155') +('2377','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',473.00,'999','1','"2377 MEMBER','1','4156') +('4230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',757.56,'999','1','"4230 MEMBER','1','4157') +('2450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2450 MEMBER','1','4158') +('2631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2631 MEMBER','1','4159') +('6658','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4.90,'999','1','"6658 MEMBER','1','4160') +('3006','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1676.59,'999','0','"3006 MEMBER','1','4161') +('3260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3260 MEMBER','1','4162') +('2913','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1871.34,'999','1','"2913 MEMBER','1','4163') +('4174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',5183.33,'999','0','"4174 MEMBER','1','4164') +('5145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',962.79,'999','0','"5145 MEMBER','1','4165') +('6579','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',642.66,'999','1','"6579 MEMBER','1','4166') +('588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',47.82,'999','1','"588 MEMBER','1','4167') +('6104','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1414.31,'999','0','"6104 MEMBER','1','4168') +('6367','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',529.53,'999','0','"6367 MEMBER','1','4169') +('4053','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8341.38,'999','0','"4053 MEMBER','1','4170') +('584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',469.05,'999','1','"584 MEMBER','1','4171') +('4489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4655.74,'999','0','"4489 MEMBER','1','4172') +('323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"323 MEMBER','1','4173') +('1602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1602 MEMBER','1','4174') +('4737','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7666.38,'999','0','"4737 MEMBER','1','4175') +('267','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"267 MEMBER','1','4176') +('6872','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6872 MEMBER','1','4177') +('6903','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6903 MEMBER','1','4178') +('1485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',800.18,'999','1','"1485 MEMBER','1','4179') +('6940','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6940 MEMBER','1','4180') +('6913','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6913 MEMBER','1','4181') +('2775','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',175.50,'999','0','"2775 MEMBER','1','4182') +('4370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',158.95,'999','1','"4370 MEMBER','1','4183') +('9547','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9547 MEMBER','1','4184') +('6525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',250.45,'999','1','"6525 MEMBER','1','4185') +('1722','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1722 MEMBER','1','4186') +('6473','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',586.24,'999','1','"6473 MEMBER','1','4187') +('4315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3588.07,'999','0','"4315 MEMBER','1','4188') +('4863','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',110.87,'999','1','"4863 MEMBER','1','4189') +('542','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',405.51,'999','0','"542 MEMBER','1','4190') +('221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"221 MEMBER','1','4191') +('6525','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',250.45,'999','1','"6525 MEMBER','1','4192') +('516','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"516 MEMBER','1','4193') +('2111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.69,'999','1','"2111 MEMBER','1','4194') +('2734','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2734 MEMBER','1','4195') +('6444','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',511.48,'999','0','"6444 MEMBER','1','4196') +('6615','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.18,'999','1','"6615 MEMBER','1','4197') +('2926','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',41.37,'999','1','"2926 MEMBER','1','4198') +('2157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2261.12,'999','0','"2157 MEMBER','1','4199') +('2221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1956.97,'999','0','"2221 MEMBER','1','4200') +('4631','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',217.84,'999','1','"4631 MEMBER','1','4201') +('4568','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',35.44,'999','1','"4568 MEMBER','1','4202') +('4764','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3533.55,'999','0','"4764 MEMBER','1','4203') +('3004','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',253.34,'999','0','"3004 MEMBER','1','4204') +('6778','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',97.89,'999','0','"6778 MEMBER','1','4205') +('1953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',400.76,'999','1','"1953 MEMBER','1','4206') +('142','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2459.40,'999','0','"142 MEMBER','1','4207') +('6321','1','LASTNAME','FIRSTNAME',999.99,68.15,'10',100.00,'1','1','1','PC','3','1','0',3469.19,'999','0','"6321 MEMBER','1','4208') +('2030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',748.34,'999','1','"2030 MEMBER','1','4209') +('6539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',264.78,'999','0','"6539 MEMBER','1','4210') +('63','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"63 MEMBER','1','4211') +('4482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4482 MEMBER','1','4212') +('1834','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',234.12,'999','0','"1834 MEMBER','1','4213') +('6210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1205.07,'999','0','"6210 MEMBER','1','4214') +('1207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',186.67,'999','1','"1207 MEMBER','1','4215') +('1543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',391.15,'999','0','"1543 MEMBER','1','4216') +('464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2830.20,'999','0','"464 MEMBER','1','4217') +('941','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"941 MEMBER','1','4218') +('4546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4546 MEMBER','1','4219') +('1190','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"1190 MEMBER','1','4220') +('4858','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',344.70,'999','0','"4858 MEMBER','1','4221') +('193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',93.82,'999','1','"193 MEMBER','1','4222') +('6720','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',302.09,'999','0','"6720 MEMBER','1','4223') +('6693','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',15.93,'999','0','"6693 MEMBER','1','4224') +('6214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',594.69,'999','0','"6214 MEMBER','1','4225') +('6697','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',16.33,'999','0','"6697 MEMBER','1','4226') +('4585','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',28.79,'999','0','"4585 MEMBER','1','4227') +('6320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',352.26,'999','0','"6320 MEMBER','1','4228') +('4879','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',1052.02,'999','1','"4879 MEMBER','1','4229') +('413','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1200.35,'999','0','"413 MEMBER','1','4230') +('6582','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',495.56,'999','0','"6582 MEMBER','1','4231') +('3415','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',311.72,'999','0','"3415 MEMBER','1','4232') +('4463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',409.10,'999','1','"4463 MEMBER','1','4233') +('6371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1129.61,'999','0','"6371 MEMBER','1','4234') +('2114','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2114 MEMBER','1','4235') +('6169','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1293.53,'999','0','"6169 MEMBER','1','4236') +('4575','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6267.07,'999','0','"4575 MEMBER','1','4237') +('474','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"474 MEMBER','1','4238') +('529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1227.07,'999','1','"529 MEMBER','1','4239') +('4464','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',310.66,'999','1','"4464 MEMBER','1','4240') +('6274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2197.14,'999','0','"6274 MEMBER','1','4241') +('6722','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',19.90,'999','0','"6722 MEMBER','1','4242') +('306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',346.59,'999','1','"306 MEMBER','1','4243') +('2336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2336 MEMBER','1','4244') +('6932','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6932 MEMBER','1','4245') +('6937','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6937 MEMBER','1','4246') +('6997','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6997 MEMBER','1','4247') +('7031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7031 MEMBER','1','4248') +('6965','2','LASTNAME','FIRSTNAME',999.00,16.50,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6965 MEMBER','1','4249') +('6962','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6962 MEMBER','1','4250') +('6555','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',568.95,'999','0','"6555 MEMBER','1','4251') +('2591','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2591 MEMBER','1','4252') +('1400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1220.07,'999','0','"1400 MEMBER','1','4253') +('282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',339.16,'999','0','"282 MEMBER','1','4254') +('6686','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',297.16,'999','1','"6686 MEMBER','1','4255') +('6620','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',823.98,'999','0','"6620 MEMBER','1','4256') +('6122','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"6122 MEMBER','1','4257') +('6351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',352.04,'999','0','"6351 MEMBER','1','4258') +('6463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2819.55,'999','0','"6463 MEMBER','1','4259') +('4558','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',334.00,'999','1','"4558 MEMBER','1','4260') +('1280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','REG','0','0','0',0.00,'999','0','"1280 MEMBER','1','4261') +('6598','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1066.04,'999','1','"6598 MEMBER','1','4262') +('8284','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8284 MEMBER','1','4263') +('8443','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8443 MEMBER','1','4264') +('1543','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',391.15,'999','0','"1543 MEMBER','1','4265') +('308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"308 MEMBER','1','4266') +('4063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4063 MEMBER','1','4267') +('545','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"545 MEMBER','1','4268') +('302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',933.23,'999','0','"302 MEMBER','1','4269') +('6628','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',230.32,'999','0','"6628 MEMBER','1','4270') +('456','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5372.18,'999','0','"456 MEMBER','1','4271') +('6765','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',10.29,'999','0','"6765 MEMBER','1','4272') +('4071','3','LASTNAME','FIRSTNAME',999.99,43.10,'10',125.00,'1','0','1','PC','3','1','0',2103.69,'999','1','"4071 MEMBER','1','4273') +('4543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4543 MEMBER','1','4274') +('6795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',46.84,'999','0','"6795 MEMBER','1','4275') +('4818','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',668.45,'999','1','"4818 MEMBER','1','4276') +('6381','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1939.86,'999','0','"6381 MEMBER','1','4277') +('6581','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',211.69,'999','1','"6581 MEMBER','1','4278') +('4032','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"4032 MEMBER','1','4279') +('4981','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',319.15,'999','0','"4981 MEMBER','1','4280') +('4726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1592.01,'999','0','"4726 MEMBER','1','4281') +('5016','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5016 MEMBER','1','4282') +('3067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3067 MEMBER','1','4283') +('1458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1458 MEMBER','1','4284') +('514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',478.66,'999','1','"514 MEMBER','1','4285') +('6316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1235.78,'999','0','"6316 MEMBER','1','4286') +('6348','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1756.92,'999','0','"6348 MEMBER','1','4287') +('4201','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3583.43,'999','0','"4201 MEMBER','1','4288') +('10276','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10276 MEMBER','1','4289') +('4027','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4027 MEMBER','1','4290') +('3300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3300 MEMBER','1','4291') +('9364','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9364 MEMBER','1','4292') +('6675','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',39.06,'999','1','"6675 MEMBER','1','4293') +('134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1379.87,'999','0','"134 MEMBER','1','4294') +('3403','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3887.03,'999','0','"3403 MEMBER','1','4295') +('9088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9088 MEMBER','1','4296') +('6606','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',331.23,'999','0','"6606 MEMBER','1','4297') +('532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2922.98,'999','1','"532 MEMBER','1','4298') +('6474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',792.18,'999','0','"6474 MEMBER','1','4299') +('6286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',399.24,'999','0','"6286 MEMBER','1','4300') +('6526','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',269.06,'999','0','"6526 MEMBER','1','4301') +('4010','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',404.84,'999','0','"4010 MEMBER','1','4302') +('4918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"4918 MEMBER','1','4303') +('2565','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4685.11,'999','0','"2565 MEMBER','1','4304') +('6716','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',264.04,'999','0','"6716 MEMBER','1','4305') +('2223','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1878.99,'999','0','"2223 MEMBER','1','4306') +('4256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1054.32,'999','0','"4256 MEMBER','1','4307') +('4148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3165.01,'999','0','"4148 MEMBER','1','4308') +('1293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.06,'999','1','"1293 MEMBER','1','4309') +('6730','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',473.28,'999','0','"6730 MEMBER','1','4310') +('2940','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2940 MEMBER','1','4311') +('6876','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6876 MEMBER','1','4312') +('6798','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6798 MEMBER','1','4313') +('4176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4176 MEMBER','1','4314') +('6911','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6911 MEMBER','1','4315') +('6933','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6933 MEMBER','1','4316') +('5172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5172 MEMBER','1','4317') +('6943','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6943 MEMBER','1','4318') +('7013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7013 MEMBER','1','4319') +('6968','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6968 MEMBER','1','4320') +('1234','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',787.88,'999','1','"1234 MEMBER','1','4321') +('6114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',532.48,'999','0','"6114 MEMBER','1','4322') +('2193','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2193 MEMBER','1','4323') +('4244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',217.28,'999','1','"4244 MEMBER','1','4324') +('2434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2434 MEMBER','1','4325') +('650','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"650 MEMBER','1','4326') +('6596','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',551.33,'999','0','"6596 MEMBER','1','4327') +('2403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.17,'999','1','"2403 MEMBER','1','4328') +('5126','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5126 MEMBER','1','4329') +('3033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',293.99,'999','1','"3033 MEMBER','1','4330') +('1619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',35.85,'999','1','"1619 MEMBER','1','4331') +('4431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4431 MEMBER','0','4332') +('4229','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',136.45,'999','1','"4229 MEMBER','1','4333') +('2116','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',824.90,'999','0','"2116 MEMBER','1','4334') +('6732','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',265.91,'999','1','"6732 MEMBER','1','4335') +('6354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1367.63,'999','0','"6354 MEMBER','1','4336') +('9015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9015 MEMBER','1','4337') +('4919','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',960.16,'999','0','"4919 MEMBER','1','4338') +('6611','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',300.34,'999','1','"6611 MEMBER','1','4339') +('1166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2812.23,'999','0','"1166 MEMBER','1','4340') +('9127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9127 MEMBER','1','4341') +('2081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2081 MEMBER','1','4342') +('4311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.17,'999','1','"4311 MEMBER','1','4343') +('4045','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1596.16,'999','0','"4045 MEMBER','1','4344') +('2718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',149.52,'999','1','"2718 MEMBER','1','4345') +('1665','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3504.02,'999','0','"1665 MEMBER','1','4346') +('2075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2075 MEMBER','1','4347') +('4419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.53,'999','1','"4419 MEMBER','1','4348') +('2714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1924.47,'999','0','"2714 MEMBER','1','4349') +('3061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',825.00,'999','0','"3061 MEMBER','1','4350') +('4103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6007.43,'999','0','"4103 MEMBER','1','4351') +('1123','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1123 MEMBER','1','4352') +('1726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1726 MEMBER','1','4353') +('1074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1074 MEMBER','1','4354') +('4382','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.17,'999','1','"4382 MEMBER','1','4355') +('4952','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',907.35,'999','1','"4952 MEMBER','1','4356') +('4762','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',737.43,'999','0','"4762 MEMBER','1','4357') +('80','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',530.01,'999','0','"80 MEMBER','1','4358') +('349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"349 MEMBER','1','4359') +('4766','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',58.40,'999','1','"4766 MEMBER','1','4360') +('4272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.16,'999','1','"4272 MEMBER','1','4361') +('6652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',224.47,'999','1','"6652 MEMBER','1','4362') +('2882','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',523.67,'999','1','"2882 MEMBER','1','4363') +('4078','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2089.76,'999','1','"4078 MEMBER','1','4364') +('3167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3167 MEMBER','1','4365') +('9023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','0','0','0',0.00,'999','0','"9023 MEMBER','1','4366') +('6527','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',95.04,'999','0','"6527 MEMBER','1','4367') +('4428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4428 MEMBER','1','4368') +('6128','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',18.52,'999','0','"6128 MEMBER','1','4369') +('327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"327 MEMBER','1','4370') +('4440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4440 MEMBER','1','4371') +('6219','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',113.43,'999','1','"6219 MEMBER','1','4372') +('6402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',813.97,'999','0','"6402 MEMBER','1','4373') +('74','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"74 MEMBER','1','4374') +('4436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1024.57,'999','0','"4436 MEMBER','1','4375') +('4568','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',35.44,'999','1','"4568 MEMBER','1','4376') +('243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1322.02,'999','0','"243 MEMBER','1','4377') +('4669','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',197.29,'999','0','"4669 MEMBER','1','4378') +('3315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1853.74,'999','1','"3315 MEMBER','1','4379') +('4451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5236.55,'999','0','"4451 MEMBER','1','4380') +('6877','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6877 MEMBER','1','4381') +('3319','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2102.82,'999','0','"3319 MEMBER','1','4382') +('6912','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6912 MEMBER','1','4383') +('9050','2','LASTNAME','FIRSTNAME',999.99,84.37,'0',0.00,'1','0','1','TERM','0','0','0',236.25,'999','0','"9050 MEMBER','1','4384') +('6882','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6882 MEMBER','1','4385') +('6885','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6885 MEMBER','1','4386') +('6975','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6975 MEMBER','1','4387') +('6976','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6976 MEMBER','1','4388') +('6943','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6943 MEMBER','1','4389') +('6945','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6945 MEMBER','1','4390') +('4338','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1686.84,'999','1','"4338 MEMBER','1','4391') +('455','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"455 MEMBER','1','4392') +('4070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',585.60,'999','1','"4070 MEMBER','1','4393') +('3104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3104 MEMBER','1','4394') +('4842','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1316.52,'999','1','"4842 MEMBER','1','4395') +('4865','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1297.15,'999','0','"4865 MEMBER','1','4396') +('6151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2439.53,'999','0','"6151 MEMBER','1','4397') +('4737','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7666.38,'999','0','"4737 MEMBER','1','4398') +('224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4328.59,'999','0','"224 MEMBER','1','4399') +('3194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',234.85,'999','0','"3194 MEMBER','1','4400') +('3019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2607.47,'999','0','"3019 MEMBER','1','4401') +('6161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',263.37,'999','1','"6161 MEMBER','1','4402') +('1978','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.39,'999','1','"1978 MEMBER','1','4403') +('6619','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',955.13,'999','1','"6619 MEMBER','1','4404') +('4035','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',67.57,'999','0','"4035 MEMBER','1','4405') +('145','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',800.35,'999','0','"145 MEMBER','1','4406') +('4244','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',217.28,'999','1','"4244 MEMBER','1','4407') +('4138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2811.05,'999','0','"4138 MEMBER','1','4408') +('184','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',2792.31,'999','1','"184 MEMBER','1','4409') +('1239','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1165.67,'999','0','"1239 MEMBER','1','4410') +('427','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.44,'999','1','"427 MEMBER','1','4411') +('5046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5046 MEMBER','1','4412') +('441','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2077.12,'999','0','"441 MEMBER','1','4413') +('6311','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',383.67,'999','0','"6311 MEMBER','1','4414') +('5063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5063 MEMBER','1','4415') +('6524','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',539.61,'999','0','"6524 MEMBER','1','4416') +('4976','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',42.37,'999','1','"4976 MEMBER','1','4417') +('5056','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5056 MEMBER','1','4418') +('189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',789.28,'999','0','"189 MEMBER','1','4419') +('6558','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',444.54,'999','0','"6558 MEMBER','1','4420') +('472','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"472 MEMBER','1','4421') +('3010','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1071.83,'999','0','"3010 MEMBER','1','4422') +('2311','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1716.07,'999','0','"2311 MEMBER','1','4423') +('316','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1005.61,'999','1','"316 MEMBER','1','4424') +('6354','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1367.63,'999','0','"6354 MEMBER','1','4425') +('3100','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3100 MEMBER','1','4426') +('1923','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3601.80,'999','0','"1923 MEMBER','1','4427') +('4382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.17,'999','1','"4382 MEMBER','1','4428') +('4494','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',53.02,'999','1','"4494 MEMBER','1','4429') +('6528','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',986.18,'999','0','"6528 MEMBER','1','4430') +('4017','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',974.27,'999','1','"4017 MEMBER','1','4431') +('4766','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',58.40,'999','1','"4766 MEMBER','1','4432') +('432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"432 MEMBER','1','4433') +('6551','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',123.68,'999','1','"6551 MEMBER','1','4434') +('4385','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1022.39,'999','0','"4385 MEMBER','1','4435') +('4931','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.95,'999','1','"4931 MEMBER','1','4436') +('4606','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1368.05,'999','0','"4606 MEMBER','1','4437') +('1716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4785.14,'999','0','"1716 MEMBER','1','4438') +('4810','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2330.62,'999','1','"4810 MEMBER','1','4439') +('1172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',49.29,'999','1','"1172 MEMBER','1','4440') +('483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"483 MEMBER','1','4441') +('6280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',571.07,'999','0','"6280 MEMBER','1','4442') +('10493','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10493 MEMBER','1','4443') +('4637','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4637 MEMBER','1','4444') +('4752','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',374.28,'999','1','"4752 MEMBER','1','4445') +('2466','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',598.13,'999','0','"2466 MEMBER','1','4446') +('6200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3794.61,'999','0','"6200 MEMBER','1','4447') +('1661','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1133.84,'999','1','"1661 MEMBER','1','4448') +('4737','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7666.38,'999','0','"4737 MEMBER','1','4449') +('6485','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2060.11,'999','0','"6485 MEMBER','1','4450') +('6239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',342.89,'999','1','"6239 MEMBER','1','4451') +('4123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2100.06,'999','0','"4123 MEMBER','1','4452') +('4911','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',104.66,'999','1','"4911 MEMBER','1','4453') +('2455','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',118.79,'999','1','"2455 MEMBER','1','4454') +('14','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3487.90,'999','0','"14 MEMBER','1','4455') +('6471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',321.25,'999','0','"6471 MEMBER','1','4456') +('4337','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',275.79,'999','1','"4337 MEMBER','1','4457') +('417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"417 MEMBER','1','4458') +('4332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4332 MEMBER','1','4459') +('4931','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',793.95,'999','1','"4931 MEMBER','1','4460') +('6387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',264.11,'999','0','"6387 MEMBER','1','4461') +('1253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.44,'999','1','"1253 MEMBER','1','4462') +('500','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4956.17,'999','0','"500 MEMBER','1','4463') +('85','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',268.57,'999','1','"85 MEMBER','1','4464') +('3069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3069 MEMBER','1','4465') +('183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"183 MEMBER','1','4466') +('2268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5499.94,'999','0','"2268 MEMBER','1','4467') +('5085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5085 MEMBER','1','4468') +('6619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',955.13,'999','1','"6619 MEMBER','1','4469') +('3108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1771.10,'999','1','"3108 MEMBER','1','4470') +('4662','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1215.76,'999','0','"4662 MEMBER','1','4471') +('6523','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2308.22,'999','0','"6523 MEMBER','1','4472') +('6431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',407.19,'999','1','"6431 MEMBER','1','4473') +('4927','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1705.81,'999','1','"4927 MEMBER','1','4474') +('1617','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1697.87,'999','0','"1617 MEMBER','1','4475') +('1496','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2403.69,'999','1','"1496 MEMBER','1','4476') +('5016','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5016 MEMBER','1','4477') +('1823','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1823 MEMBER','1','4478') +('1270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1270 MEMBER','1','4479') +('4135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4135 MEMBER','1','4480') +('4071','1','LASTNAME','FIRSTNAME',999.99,43.10,'10',125.00,'1','1','1','PC','3','1','0',2103.69,'999','1','"4071 MEMBER','1','4481') +('4155','2','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','0','1','PC','1','0','0',2379.57,'999','0','"4155 MEMBER','1','4482') +('4331','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',384.26,'999','0','"4331 MEMBER','1','4483') +('4835','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',585.11,'999','0','"4835 MEMBER','1','4484') +('4917','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',958.09,'999','0','"4917 MEMBER','1','4485') +('1234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',787.88,'999','1','"1234 MEMBER','1','4486') +('200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3423.74,'999','0','"200 MEMBER','1','4487') +('1082','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1082 MEMBER','1','4488') +('1681','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',681.01,'999','0','"1681 MEMBER','1','4489') +('6702','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',157.62,'999','0','"6702 MEMBER','1','4490') +('6161','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',263.37,'999','1','"6161 MEMBER','1','4491') +('4540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',658.27,'999','1','"4540 MEMBER','1','4492') +('4743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',69.47,'999','1','"4743 MEMBER','1','4493') +('6510','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',813.34,'999','0','"6510 MEMBER','1','4494') +('2251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2251 MEMBER','1','4495') +('6245','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',8205.37,'999','0','"6245 MEMBER','1','4496') +('1217','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1589.93,'999','0','"1217 MEMBER','1','4497') +('6610','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',30.58,'999','0','"6610 MEMBER','1','4498') +('1046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1046 MEMBER','1','4499') +('2726','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2726 MEMBER','1','4500') +('4467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1969.93,'999','0','"4467 MEMBER','1','4501') +('6362','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',671.03,'999','1','"6362 MEMBER','1','4502') +('4696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',469.91,'999','0','"4696 MEMBER','1','4503') +('2633','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',419.31,'999','1','"2633 MEMBER','1','4504') +('6786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',39.16,'999','0','"6786 MEMBER','1','4505') +('175','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5191.89,'999','0','"175 MEMBER','1','4506') +('1312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4601.11,'999','0','"1312 MEMBER','1','4507') +('6177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',15.15,'999','0','"6177 MEMBER','1','4508') +('4806','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.83,'999','0','"4806 MEMBER','1','4509') +('6566','1','LASTNAME','FIRSTNAME',999.99,19.99,'0',0.00,'1','1','1','INACT','0','0','0',728.55,'999','1','"6566 MEMBER','1','4510') +('198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"198 MEMBER','1','4511') +('4480','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.53,'999','1','"4480 MEMBER','1','4512') +('1499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1499 MEMBER','1','4513') +('2835','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2835 MEMBER','1','4514') +('6737','2','LASTNAME','FIRSTNAME',999.99,18.70,'0',20.00,'1','0','1','PC','1','0','0',89.28,'999','0','"6737 MEMBER','1','4515') +('4386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4386 MEMBER','1','4516') +('465','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1246.35,'999','0','"465 MEMBER','1','4517') +('266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4071.61,'999','0','"266 MEMBER','1','4518') +('5100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5100 MEMBER','1','4519') +('4609','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',631.57,'999','0','"4609 MEMBER','1','4520') +('6542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',248.72,'999','1','"6542 MEMBER','1','4521') +('2641','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5924.80,'999','0','"2641 MEMBER','1','4522') +('4289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"4289 MEMBER','1','4523') +('4181','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1862.88,'999','1','"4181 MEMBER','1','4524') +('170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"170 MEMBER','1','4525') +('6927','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6927 MEMBER','1','4526') +('6939','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6939 MEMBER','1','4527') +('5171','1','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5171 MEMBER','1','4528') +('6880','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6880 MEMBER','1','4529') +('6895','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6895 MEMBER','1','4530') +('4224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',426.95,'999','1','"4224 MEMBER','1','4531') +('6258','2','LASTNAME','FIRSTNAME',999.99,11.27,'0',20.00,'1','0','1','PC','1','0','0',1798.12,'999','0','"6258 MEMBER','1','4532') +('100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',343.18,'999','1','"100 MEMBER','1','4533') +('4898','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3933.48,'999','0','"4898 MEMBER','1','4534') +('79','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"79 MEMBER','1','4535') +('6252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3107.81,'999','0','"6252 MEMBER','1','4536') +('199','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5473.39,'999','0','"199 MEMBER','1','4537') +('2771','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',962.03,'999','0','"2771 MEMBER','1','4538') +('4300','1','LASTNAME','FIRSTNAME',999.99,25.04,'10',100.00,'1','1','1','PC','3','1','0',2663.63,'999','0','"4300 MEMBER','1','4539') +('4912','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',394.24,'999','1','"4912 MEMBER','1','4540') +('4350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2833.11,'999','0','"4350 MEMBER','1','4541') +('3410','1','LASTNAME','FIRSTNAME',999.99,2.21,'0',20.00,'1','1','1','PC','1','0','0',3639.50,'999','0','"3410 MEMBER','1','4542') +('4252','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4252 MEMBER','1','4543') +('260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8.41,'999','1','"260 MEMBER','1','4544') +('9122','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9122 MEMBER','1','4545') +('3012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1478.83,'999','1','"3012 MEMBER','1','4546') +('6475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',288.08,'999','0','"6475 MEMBER','1','4547') +('250','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.10,'999','1','"250 MEMBER','1','4548') +('6671','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.91,'999','1','"6671 MEMBER','1','4549') +('664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.21,'999','1','"664 MEMBER','1','4550') +('6678','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',211.61,'999','0','"6678 MEMBER','1','4551') +('4080','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4080 MEMBER','1','4552') +('1832','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1832 MEMBER','1','4553') +('3338','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2757.07,'999','0','"3338 MEMBER','1','4554') +('10016','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10016 MEMBER','1','4555') +('215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1838.06,'999','0','"215 MEMBER','1','4556') +('3163','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3163 MEMBER','1','4557') +('4241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4241 MEMBER','1','4558') +('4921','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',182.71,'999','1','"4921 MEMBER','1','4559') +('4814','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',831.39,'999','0','"4814 MEMBER','1','4560') +('4604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4604 MEMBER','1','4561') +('497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"497 MEMBER','1','4562') +('10200','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10200 MEMBER','1','4563') +('4889','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1.30,'999','0','"4889 MEMBER','1','4564') +('4417','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',42.29,'999','1','"4417 MEMBER','1','4565') +('4422','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1348.93,'999','0','"4422 MEMBER','1','4566') +('9744','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9744 MEMBER','1','4567') +('5070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5070 MEMBER','1','4568') +('4477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',216.52,'999','1','"4477 MEMBER','1','4569') +('5143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5143 MEMBER','1','4570') +('81','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2084.28,'999','0','"81 MEMBER','1','4571') +('4222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4222 MEMBER','1','4572') +('2654','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1489.04,'999','0','"2654 MEMBER','1','4573') +('4147','1','LASTNAME','FIRSTNAME',999.99,'-13.37','0',20.00,'1','1','1','PC','1','0','0',1273.67,'999','1','"4147 MEMBER','1','4574') +('4511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',517.48,'999','0','"4511 MEMBER','1','4575') +('4704','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',274.79,'999','1','"4704 MEMBER','1','4576') +('284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"284 MEMBER','1','4577') +('6334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',436.25,'999','0','"6334 MEMBER','1','4578') +('4327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2053.44,'999','0','"4327 MEMBER','1','4579') +('4083','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2347.84,'999','0','"4083 MEMBER','1','4580') +('2984','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2604.88,'999','0','"2984 MEMBER','1','4581') +('502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"502 MEMBER','1','4582') +('895','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',856.87,'999','0','"895 MEMBER','1','4583') +('4351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4351 MEMBER','1','4584') +('6154','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',457.18,'999','1','"6154 MEMBER','1','4585') +('617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',273.61,'999','0','"617 MEMBER','1','4586') +('2221','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1956.97,'999','0','"2221 MEMBER','1','4587') +('7120','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7120 MEMBER','1','4588') +('5103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5103 MEMBER','1','4589') +('1665','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3504.02,'999','0','"1665 MEMBER','1','4590') +('6253','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',300.39,'999','1','"6253 MEMBER','1','4591') +('1072','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1072 MEMBER','1','4592') +('9079','1','LASTNAME','FIRSTNAME',999.99,140.62,'0',0.00,'1','1','1','TERM','0','0','0',56.25,'999','0','"9079 MEMBER','1','4593') +('6412','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',89.58,'999','1','"6412 MEMBER','1','4594') +('4121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4121 MEMBER','1','4595') +('6190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2791.99,'999','0','"6190 MEMBER','1','4596') +('6685','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',482.19,'999','1','"6685 MEMBER','1','4597') +('6938','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6938 MEMBER','1','4598') +('5169','1','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5169 MEMBER','1','4599') +('4133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',268.19,'999','1','"4133 MEMBER','1','4600') +('6699','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',222.97,'999','1','"6699 MEMBER','1','4601') +('4662','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1215.76,'999','0','"4662 MEMBER','1','4602') +('4640','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',17.31,'999','0','"4640 MEMBER','1','4603') +('1326','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',22.80,'999','0','"1326 MEMBER','1','4604') +('6687','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',83.86,'999','0','"6687 MEMBER','1','4605') +('3197','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2249.59,'999','0','"3197 MEMBER','1','4606') +('4066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4066 MEMBER','1','4607') +('4134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4134 MEMBER','1','4608') +('5098','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',4370.95,'999','0','"5098 MEMBER','1','4609') +('2358','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1397.80,'999','1','"2358 MEMBER','1','4610') +('4583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4583 MEMBER','1','4611') +('1149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1941.42,'999','1','"1149 MEMBER','1','4612') +('4350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2833.11,'999','0','"4350 MEMBER','1','4613') +('6417','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.65,'999','1','"6417 MEMBER','1','4614') +('6334','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',436.25,'999','0','"6334 MEMBER','1','4615') +('4919','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',960.16,'999','0','"4919 MEMBER','1','4616') +('4675','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',989.60,'999','0','"4675 MEMBER','1','4617') +('1154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1567.78,'999','0','"1154 MEMBER','1','4618') +('4193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4193 MEMBER','1','4619') +('4456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"4456 MEMBER','1','4620') +('6723','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',199.77,'999','1','"6723 MEMBER','1','4621') +('6249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',124.91,'999','1','"6249 MEMBER','1','4622') +('1394','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',193.86,'999','1','"1394 MEMBER','1','4623') +('4755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1341.32,'999','1','"4755 MEMBER','1','4624') +('4008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4008 MEMBER','1','4625') +('1050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',327.86,'999','1','"1050 MEMBER','1','4626') +('3237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',316.54,'999','0','"3237 MEMBER','1','4627') +('326','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"326 MEMBER','1','4628') +('6570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',129.19,'999','1','"6570 MEMBER','1','4629') +('1738','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1738 MEMBER','1','4630') +('3382','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6005.76,'999','0','"3382 MEMBER','1','4631') +('501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2563.65,'999','1','"501 MEMBER','1','4632') +('4231','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.40,'999','1','"4231 MEMBER','1','4633') +('1295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.33,'999','1','"1295 MEMBER','1','4634') +('4149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1042.72,'999','0','"4149 MEMBER','1','4635') +('2818','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',980.27,'999','0','"2818 MEMBER','1','4636') +('4333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',146.85,'999','0','"4333 MEMBER','1','4637') +('6176','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',587.21,'999','0','"6176 MEMBER','1','4638') +('3087','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3488.18,'999','0','"3087 MEMBER','1','4639') +('4947','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1038.24,'999','1','"4947 MEMBER','1','4640') +('5057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5057 MEMBER','1','4641') +('4857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',450.48,'999','1','"4857 MEMBER','1','4642') +('6207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',800.87,'999','1','"6207 MEMBER','1','4643') +('1272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6014.70,'999','1','"1272 MEMBER','1','4644') +('4478','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',894.94,'999','1','"4478 MEMBER','1','4645') +('4112','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3726.04,'999','0','"4112 MEMBER','1','4646') +('6747','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',109.42,'999','0','"6747 MEMBER','1','4647') +('9065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',296.25,'999','0','"9065 MEMBER','1','4648') +('4907','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1544.87,'999','0','"4907 MEMBER','1','4649') +('2479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',85.81,'999','1','"2479 MEMBER','1','4650') +('28','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',329.72,'999','1','"28 MEMBER','1','4651') +('4117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',35.59,'999','0','"4117 MEMBER','1','4652') +('6286','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',399.24,'999','0','"6286 MEMBER','1','4653') +('461','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"461 MEMBER','1','4654') +('1215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2486.61,'999','0','"1215 MEMBER','1','4655') +('4231','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.40,'999','1','"4231 MEMBER','1','4656') +('4003','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4003 MEMBER','1','4657') +('224','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4328.59,'999','0','"224 MEMBER','1','4658') +('1570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',19.88,'999','1','"1570 MEMBER','1','4659') +('168','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',381.58,'999','0','"168 MEMBER','1','4660') +('1948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',183.64,'999','0','"1948 MEMBER','1','4661') +('6919','1','LASTNAME','FIRSTNAME',999.99,9.21,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6919 MEMBER','1','4662') +('4283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1381.97,'999','0','"4283 MEMBER','1','4663') +('6868','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6868 MEMBER','1','4664') +('6905','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6905 MEMBER','1','4665') +('6917','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6917 MEMBER','1','4666') +('6941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6941 MEMBER','1','4667') +('6959','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6959 MEMBER','1','4668') +('6967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6967 MEMBER','1','4669') +('3181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',190.49,'999','0','"3181 MEMBER','1','4670') +('6363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1382.40,'999','0','"6363 MEMBER','1','4671') +('2764','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',402.46,'999','0','"2764 MEMBER','1','4672') +('1697','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',89.98,'999','0','"1697 MEMBER','1','4673') +('4254','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4254 MEMBER','1','4674') +('9688','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9688 MEMBER','1','4675') +('4663','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1775.17,'999','0','"4663 MEMBER','1','4676') +('2358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1397.80,'999','1','"2358 MEMBER','1','4678') +('36','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"36 MEMBER','1','4679') +('5098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',4370.95,'999','0','"5098 MEMBER','1','4680') +('6152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',41.71,'999','1','"6152 MEMBER','1','4681') +('155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3809.65,'999','0','"155 MEMBER','1','4682') +('62','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1025.02,'999','0','"62 MEMBER','1','4683') +('3048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',59.92,'999','1','"3048 MEMBER','1','4684') +('366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"366 MEMBER','1','4685') +('5132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5132 MEMBER','1','4686') +('4026','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',58.10,'999','1','"4026 MEMBER','1','4687') +('2087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',804.82,'999','1','"2087 MEMBER','1','4688') +('54','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',9156.49,'999','0','"54 MEMBER','1','4689') +('1769','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2993.60,'999','0','"1769 MEMBER','1','4690') +('285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"285 MEMBER','1','4691') +('5077','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5077 MEMBER','1','4692') +('4740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7174.26,'999','0','"4740 MEMBER','1','4693') +('4631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',217.84,'999','1','"4631 MEMBER','1','4694') +('405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',165.51,'999','1','"405 MEMBER','1','4695') +('4742','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1444.63,'999','0','"4742 MEMBER','1','4696') +('6423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',32.57,'999','0','"6423 MEMBER','1','4697') +('119','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1058.17,'999','0','"119 MEMBER','1','4698') +('6560','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1029.08,'999','0','"6560 MEMBER','1','4699') +('2307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2307 MEMBER','1','4700') +('6115','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',371.88,'999','0','"6115 MEMBER','1','4701') +('2678','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',256.92,'999','0','"2678 MEMBER','1','4702') +('6489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',70.35,'999','1','"6489 MEMBER','1','4703') +('4670','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4670 MEMBER','1','4704') +('4718','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',137.09,'999','0','"4718 MEMBER','1','4705') +('4201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3583.43,'999','0','"4201 MEMBER','1','4706') +('351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3902.48,'999','0','"351 MEMBER','1','4707') +('1811','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1811 MEMBER','1','4708') +('6229','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',652.69,'999','0','"6229 MEMBER','1','4709') +('6751','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',139.16,'999','0','"6751 MEMBER','1','4710') +('3159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3159 MEMBER','1','4711') +('6725','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',82.85,'999','1','"6725 MEMBER','1','4712') +('4248','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',489.39,'999','0','"4248 MEMBER','1','4713') +('4541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1417.93,'999','1','"4541 MEMBER','1','4714') +('2197','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2534.27,'999','0','"2197 MEMBER','1','4715') +('545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"545 MEMBER','1','4716') +('883','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.51,'999','1','"883 MEMBER','1','4717') +('4770','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2740.33,'999','0','"4770 MEMBER','1','4718') +('4062','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.49,'999','1','"4062 MEMBER','1','4719') +('2868','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2868 MEMBER','1','4720') +('4135','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4135 MEMBER','1','4721') +('4903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1017.22,'999','1','"4903 MEMBER','1','4722') +('4316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1408.28,'999','1','"4316 MEMBER','1','4723') +('1744','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1744 MEMBER','1','4724') +('4367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4367 MEMBER','1','4725') +('22','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',277.85,'999','0','"22 MEMBER','1','4726') +('4603','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5889.82,'999','0','"4603 MEMBER','1','4727') +('470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',96.02,'999','1','"470 MEMBER','1','4728') +('6664','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',156.56,'999','0','"6664 MEMBER','1','4729') +('190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',382.94,'999','1','"190 MEMBER','1','4730') +('6903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6903 MEMBER','1','4731') +('6875','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6875 MEMBER','1','4732') +('6902','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6902 MEMBER','1','4733') +('5173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5173 MEMBER','1','4734') +('6972','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6972 MEMBER','1','4735') +('6949','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6949 MEMBER','1','4736') +('6952','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6952 MEMBER','1','4737') +('6984','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6984 MEMBER','1','4738') +('7015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7015 MEMBER','1','4739') +('6674','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',276.36,'999','1','"6674 MEMBER','1','4740') +('2421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2421 MEMBER','1','4741') +('6679','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',106.27,'999','1','"6679 MEMBER','1','4742') +('5139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',2526.64,'999','0','"5139 MEMBER','1','4743') +('4536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4536 MEMBER','1','4744') +('6424','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',133.31,'999','1','"6424 MEMBER','1','4745') +('4013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4013 MEMBER','1','4746') +('6625','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',109.24,'999','1','"6625 MEMBER','1','4747') +('6483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',18.30,'999','0','"6483 MEMBER','1','4748') +('6231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1575.58,'999','0','"6231 MEMBER','1','4749') +('2911','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2911 MEMBER','1','4750') +('4962','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',499.81,'999','1','"4962 MEMBER','1','4751') +('6633','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',571.20,'999','0','"6633 MEMBER','1','4752') +('629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1929.66,'999','0','"629 MEMBER','1','4753') +('2413','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2413 MEMBER','1','4754') +('4902','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',982.70,'999','1','"4902 MEMBER','1','4755') +('833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"833 MEMBER','1','4756') +('83','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',916.84,'999','0','"83 MEMBER','1','4757') +('4894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',365.33,'999','0','"4894 MEMBER','1','4758') +('4370','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',158.95,'999','1','"4370 MEMBER','1','4759') +('4322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.16,'999','1','"4322 MEMBER','1','4760') +('105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"105 MEMBER','1','4761') +('6490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',518.88,'999','0','"6490 MEMBER','1','4762') +('2678','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',256.92,'999','0','"2678 MEMBER','1','4763') +('6684','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',27.62,'999','0','"6684 MEMBER','1','4764') +('4420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4420 MEMBER','1','4765') +('8828','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8828 MEMBER','1','4766') +('3225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3225 MEMBER','1','4767') +('4199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2371.20,'999','0','"4199 MEMBER','1','4768') +('4096','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3384.71,'999','1','"4096 MEMBER','1','4769') +('6716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',264.04,'999','0','"6716 MEMBER','1','4770') +('6658','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4.90,'999','1','"6658 MEMBER','1','4771') +('2555','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"2555 MEMBER','1','4772') +('4163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4163 MEMBER','1','4773') +('1005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1201.06,'999','1','"1005 MEMBER','1','4774') +('8831','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8831 MEMBER','1','4775') +('101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',68.57,'999','1','"101 MEMBER','1','4776') +('161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1700.58,'999','1','"161 MEMBER','1','4777') +('6353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',285.64,'999','1','"6353 MEMBER','1','4778') +('4549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4549 MEMBER','1','4779') +('4666','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3267.45,'999','1','"4666 MEMBER','1','4780') +('6394','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1326.17,'999','0','"6394 MEMBER','1','4781') +('4015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4015 MEMBER','1','4782') +('320','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3480.40,'999','0','"320 MEMBER','1','4783') +('6080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6080 MEMBER','1','4784') +('4728','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4728 MEMBER','1','4785') +('2656','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4607.56,'999','0','"2656 MEMBER','1','4786') +('6644','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',41.44,'999','0','"6644 MEMBER','1','4787') +('3199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',179.14,'999','1','"3199 MEMBER','1','4788') +('4809','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4809 MEMBER','1','4789') +('4500','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',59.00,'999','0','"4500 MEMBER','1','4790') +('4817','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',59.74,'999','0','"4817 MEMBER','1','4791') +('6178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',354.19,'999','0','"6178 MEMBER','1','4792') +('9849','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9849 MEMBER','1','4793') +('390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"390 MEMBER','1','4794') +('4610','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1028.73,'999','0','"4610 MEMBER','1','4795') +('6430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',309.45,'999','0','"6430 MEMBER','1','4796') +('1324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1324 MEMBER','1','4797') +('6555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',568.95,'999','0','"6555 MEMBER','1','4798') +('406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4081.09,'999','0','"406 MEMBER','1','4799') +('4693','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',263.87,'999','0','"4693 MEMBER','1','4800') +('1346','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1346 MEMBER','1','4801') +('3241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',12.61,'999','0','"3241 MEMBER','1','4802') +('6836','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6836 MEMBER','1','4803') +('6910','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6910 MEMBER','1','4804') +('530','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',2785.43,'999','0','"530 MEMBER','1','4805') +('6903','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6903 MEMBER','1','4806') +('6926','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6926 MEMBER','1','4807') +('6893','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6893 MEMBER','1','4808') +('6916','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6916 MEMBER','1','4809') +('2572','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2572 MEMBER','1','4810') +('4151','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',685.15,'999','1','"4151 MEMBER','1','4811') +('1817','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',129.42,'999','1','"1817 MEMBER','1','4812') +('6503','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',696.46,'999','1','"6503 MEMBER','1','4813') +('4620','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2086.97,'999','1','"4620 MEMBER','1','4814') +('4613','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4613 MEMBER','1','4815') +('4009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2743.67,'999','0','"4009 MEMBER','1','4816') +('4233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',652.04,'999','0','"4233 MEMBER','1','4817') +('3027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5445.21,'999','0','"3027 MEMBER','1','4818') +('6104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1414.31,'999','0','"6104 MEMBER','1','4819') +('219','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',201.35,'999','1','"219 MEMBER','1','4820') +('2916','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2916 MEMBER','1','4821') +('632','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',639.05,'999','0','"632 MEMBER','1','4822') +('2899','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',556.85,'999','0','"2899 MEMBER','1','4823') +('211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',14.21,'999','1','"211 MEMBER','1','4824') +('10149','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10149 MEMBER','1','4825') +('156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',53.84,'999','0','"156 MEMBER','1','4826') +('4460','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4460 MEMBER','1','4827') +('4442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1590.40,'999','0','"4442 MEMBER','1','4828') +('6441','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2367.15,'999','0','"6441 MEMBER','1','4829') +('527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"527 MEMBER','1','4830') +('4726','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1592.01,'999','0','"4726 MEMBER','1','4831') +('2348','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',686.04,'999','0','"2348 MEMBER','1','4832') +('4974','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',157.13,'999','0','"4974 MEMBER','1','4833') +('471','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.56,'999','1','"471 MEMBER','1','4834') +('4358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3441.09,'999','1','"4358 MEMBER','1','4835') +('81','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2084.28,'999','0','"81 MEMBER','1','4836') +('4044','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1281.11,'999','0','"4044 MEMBER','1','4837') +('4889','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1.30,'999','0','"4889 MEMBER','1','4838') +('1504','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1504 MEMBER','1','4839') +('6552','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',338.96,'999','0','"6552 MEMBER','1','4840') +('1724','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"1724 MEMBER','1','4841') +('2559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',135.63,'999','1','"2559 MEMBER','1','4842') +('6404','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2189.04,'999','1','"6404 MEMBER','1','4843') +('6725','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',82.85,'999','1','"6725 MEMBER','1','4844') +('175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5191.89,'999','0','"175 MEMBER','1','4845') +('6625','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',109.24,'999','1','"6625 MEMBER','1','4846') +('4984','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',383.41,'999','0','"4984 MEMBER','1','4847') +('2724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2724 MEMBER','1','4848') +('5058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5058 MEMBER','1','4849') +('1239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1165.67,'999','0','"1239 MEMBER','1','4850') +('6243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',362.40,'999','1','"6243 MEMBER','1','4851') +('4623','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10.48,'999','1','"4623 MEMBER','1','4852') +('2766','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',38.06,'999','1','"2766 MEMBER','1','4853') +('6246','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1086.45,'999','1','"6246 MEMBER','1','4854') +('6750','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',218.44,'999','0','"6750 MEMBER','1','4855') +('2668','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',429.74,'999','1','"2668 MEMBER','1','4856') +('2055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3401.14,'999','0','"2055 MEMBER','1','4858') +('5021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5021 MEMBER','1','4859') +('6732','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',265.91,'999','1','"6732 MEMBER','1','4860') +('6606','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',331.23,'999','0','"6606 MEMBER','1','4861') +('1480','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6466.87,'999','0','"1480 MEMBER','1','4862') +('4545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',470.86,'999','0','"4545 MEMBER','1','4863') +('9004','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9004 MEMBER','1','4864') +('4364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',603.81,'999','1','"4364 MEMBER','1','4865') +('6847','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6847 MEMBER','1','4866') +('3153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',454.01,'999','1','"3153 MEMBER','1','4867') +('6216','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2421.68,'999','0','"6216 MEMBER','1','4868') +('6218','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',435.27,'999','1','"6218 MEMBER','1','4869') +('6793','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6793 MEMBER','1','4870') +('6877','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6877 MEMBER','1','4871') +('6887','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6887 MEMBER','1','4872') +('6894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6894 MEMBER','1','4873') +('6885','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6885 MEMBER','1','4874') +('6891','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6891 MEMBER','1','4875') +('6898','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6898 MEMBER','1','4876') +('6015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',1154.13,'999','0','"6015 MEMBER','1','4877') +('6949','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6949 MEMBER','1','4878') +('6957','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6957 MEMBER','1','4879') +('4284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1883.54,'999','0','"4284 MEMBER','1','4880') +('4257','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1095.16,'999','0','"4257 MEMBER','1','4881') +('4394','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4394 MEMBER','1','4882') +('4514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4514 MEMBER','1','4883') +('6632','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',394.43,'999','0','"6632 MEMBER','1','4884') +('2712','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1958.65,'999','1','"2712 MEMBER','1','4885') +('2323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',181.64,'999','1','"2323 MEMBER','1','4886') +('536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.34,'999','0','"536 MEMBER','1','4887') +('9078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',112.50,'999','0','"9078 MEMBER','1','4888') +('4840','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1728.15,'999','0','"4840 MEMBER','1','4889') +('6207','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',800.87,'999','1','"6207 MEMBER','1','4890') +('4134','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4134 MEMBER','1','4891') +('1396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',109.85,'999','1','"1396 MEMBER','1','4892') +('143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"143 MEMBER','1','4893') +('2686','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2686 MEMBER','1','4894') +('5000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5000 MEMBER','1','4895') +('4254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4254 MEMBER','1','4896') +('10253','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10253 MEMBER','1','4897') +('3027','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5445.21,'999','0','"3027 MEMBER','1','4898') +('2087','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',804.82,'999','1','"2087 MEMBER','1','4899') +('2184','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',42.00,'999','1','"2184 MEMBER','1','4900') +('4909','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.90,'999','1','"4909 MEMBER','1','4901') +('9127','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9127 MEMBER','1','4902') +('4484','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1842.53,'999','1','"4484 MEMBER','1','4903') +('1738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1738 MEMBER','1','4904') +('374','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"374 MEMBER','1','4905') +('6685','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',482.19,'999','1','"6685 MEMBER','1','4906') +('3410','2','LASTNAME','FIRSTNAME',999.99,2.21,'0',20.00,'1','1','1','PC','1','0','0',3639.50,'999','0','"3410 MEMBER','1','4907') +('4027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4027 MEMBER','1','4908') +('4167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3414.14,'999','0','"4167 MEMBER','1','4909') +('6417','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.65,'999','1','"6417 MEMBER','1','4910') +('3305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3305 MEMBER','1','4911') +('4721','1','LASTNAME','FIRSTNAME',999.99,15.01,'0',20.00,'1','1','1','PC','1','0','0',250.22,'999','0','"4721 MEMBER','1','4912') +('4469','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',294.17,'999','1','"4469 MEMBER','1','4913') +('2400','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',185.64,'999','1','"2400 MEMBER','1','4914') +('1330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',94.17,'999','0','"1330 MEMBER','1','4915') +('175','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5191.89,'999','0','"175 MEMBER','1','4916') +('2153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2979.04,'999','0','"2153 MEMBER','1','4918') +('4554','1','LASTNAME','FIRSTNAME',999.99,0.28,'0',20.00,'1','1','1','PC','1','0','0',4801.81,'999','0','"4554 MEMBER','1','4919') +('5101','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1848.24,'999','0','"5101 MEMBER','1','4920') +('4830','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',944.33,'999','1','"4830 MEMBER','1','4921') +('1194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',20.21,'999','1','"1194 MEMBER','1','4922') +('5900','1','LASTNAME','FIRSTNAME',999.99,119.49,'0',300.00,'1','1','1','REG','0','0','0',87.64,'999','0','"5900 MEMBER','1','4923') +('8913','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8913 MEMBER','1','4924') +('3019','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2607.47,'999','0','"3019 MEMBER','1','4925') +('6434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',153.80,'999','0','"6434 MEMBER','1','4926') +('6518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',584.29,'999','1','"6518 MEMBER','1','4927') +('114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',385.42,'999','0','"114 MEMBER','1','4928') +('6595','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',468.97,'999','0','"6595 MEMBER','1','4929') +('131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2229.22,'999','0','"131 MEMBER','1','4930') +('2851','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2851 MEMBER','1','4931') +('3235','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.48,'999','0','"3235 MEMBER','1','4932') +('4688','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4688 MEMBER','1','4933') +('410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',354.15,'999','1','"410 MEMBER','1','4934') +('4306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1607.95,'999','0','"4306 MEMBER','1','4935') +('4','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1342.44,'999','0','"4 MEMBER','1','4936') +('6302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2472.54,'999','0','"6302 MEMBER','1','4937') +('6759','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',32.51,'999','1','"6759 MEMBER','1','4938') +('4292','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',963.40,'999','1','"4292 MEMBER','1','4939') +('996','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1298.19,'999','0','"996 MEMBER','1','4940') +('4810','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2330.62,'999','1','"4810 MEMBER','1','4941') +('913','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"913 MEMBER','1','4942') +('6517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',759.25,'999','0','"6517 MEMBER','1','4943') +('2602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',403.72,'999','1','"2602 MEMBER','1','4944') +('6914','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6914 MEMBER','1','4945') +('6927','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"6927 MEMBER','1','4946') +('5177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5177 MEMBER','1','4947') +('6947','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6947 MEMBER','1','4948') +('4424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1261.35,'999','0','"4424 MEMBER','1','4949') +('6125','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',33.49,'999','0','"6125 MEMBER','1','4950') +('4298','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',61.35,'999','1','"4298 MEMBER','1','4951') +('3181','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',190.49,'999','0','"3181 MEMBER','1','4952') +('6641','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',67.40,'999','0','"6641 MEMBER','1','4953') +('6130','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',56.14,'999','1','"6130 MEMBER','1','4954') +('4417','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',42.29,'999','1','"4417 MEMBER','1','4955') +('2586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4666.44,'999','0','"2586 MEMBER','1','4956') +('913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"913 MEMBER','1','4957') +('6504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',887.83,'999','1','"6504 MEMBER','1','4958') +('4927','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1705.81,'999','1','"4927 MEMBER','1','4959') +('5052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5052 MEMBER','1','4960') +('4519','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1788.52,'999','0','"4519 MEMBER','1','4961') +('4918','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"4918 MEMBER','1','4962') +('7908','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7908 MEMBER','1','4963') +('4453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3898.54,'999','0','"4453 MEMBER','1','4964') +('6448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',353.56,'999','0','"6448 MEMBER','1','4965') +('6495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2604.75,'999','0','"6495 MEMBER','1','4967') +('4478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',894.94,'999','1','"4478 MEMBER','1','4968') +('2268','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5499.94,'999','0','"2268 MEMBER','1','4969') +('9052','1','LASTNAME','FIRSTNAME',999.99,45.00,'0',0.00,'1','1','1','TERM','0','0','0',45.00,'999','0','"9052 MEMBER','1','4970') +('4890','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4890 MEMBER','1','4971') +('1821','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1821 MEMBER','1','4972') +('6668','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1315.16,'999','0','"6668 MEMBER','1','4973') +('4499','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',158.85,'999','1','"4499 MEMBER','1','4974') +('4905','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',585.42,'999','0','"4905 MEMBER','1','4975') +('8824','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8824 MEMBER','1','4976') +('4306','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1607.95,'999','0','"4306 MEMBER','1','4977') +('4137','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2723.03,'999','0','"4137 MEMBER','1','4978') +('4085','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1327.63,'999','0','"4085 MEMBER','1','4979') +('48','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2240.56,'999','0','"48 MEMBER','1','4980') +('6535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2049.72,'999','1','"6535 MEMBER','1','4981') +('4616','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',120.13,'999','0','"4616 MEMBER','1','4982') +('249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',977.07,'999','1','"249 MEMBER','1','4983') +('417','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"417 MEMBER','1','4984') +('6574','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',710.42,'999','0','"6574 MEMBER','1','4985') +('4902','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',982.70,'999','1','"4902 MEMBER','1','4986') +('4063','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4063 MEMBER','1','4987') +('1132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1132 MEMBER','1','4988') +('4691','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.93,'999','1','"4691 MEMBER','1','4989') +('6466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2097.30,'999','0','"6466 MEMBER','1','4990') +('6264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',23.19,'999','0','"6264 MEMBER','1','4991') +('6473','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',586.24,'999','1','"6473 MEMBER','1','4992') +('145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',800.35,'999','0','"145 MEMBER','1','4993') +('6251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',104.11,'999','0','"6251 MEMBER','1','4994') +('6164','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',790.40,'999','1','"6164 MEMBER','1','4995') +('4443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6610.43,'999','0','"4443 MEMBER','1','4996') +('5154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',664.61,'999','0','"5154 MEMBER','1','4997') +('4345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4345 MEMBER','1','4998') +('523','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',179.76,'999','1','"523 MEMBER','1','4999') +('4388','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4388 MEMBER','1','5000') +('4519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1788.52,'999','0','"4519 MEMBER','1','5001') +('4748','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',120.26,'999','0','"4748 MEMBER','1','5002') +('1836','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1836 MEMBER','1','5003') +('4711','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',45.87,'999','1','"4711 MEMBER','1','5004') +('10422','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10422 MEMBER','1','5005') +('6767','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',54.31,'999','1','"6767 MEMBER','1','5006') +('2563','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1679.84,'999','0','"2563 MEMBER','1','5007') +('6304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2708.70,'999','0','"6304 MEMBER','1','5008') +('6567','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',10.93,'999','0','"6567 MEMBER','1','5009') +('5010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5010 MEMBER','1','5010') +('6825','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6825 MEMBER','1','5011') +('7009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"7009 MEMBER','1','5012') +('6921','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6921 MEMBER','1','5013') +('6922','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6922 MEMBER','1','5014') +('6944','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6944 MEMBER','1','5015') +('6966','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6966 MEMBER','1','5016') +('6974','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6974 MEMBER','1','5017') +('9084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9084 MEMBER','1','5018') +('3269','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',623.30,'999','1','"3269 MEMBER','1','5019') +('6324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1772.47,'999','1','"6324 MEMBER','1','5020') +('1018','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1018 MEMBER','1','5021') +('6425','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',800.23,'999','0','"6425 MEMBER','1','5022') +('3044','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',226.51,'999','0','"3044 MEMBER','1','5023') +('124','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"124 MEMBER','1','5024') +('4542','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4741.76,'999','0','"4542 MEMBER','1','5025') +('4640','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',17.31,'999','0','"4640 MEMBER','1','5026') +('6635','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',457.36,'999','0','"6635 MEMBER','1','5027') +('4526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',150.26,'999','1','"4526 MEMBER','1','5028') +('329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"329 MEMBER','1','5029') +('4115','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4115 MEMBER','1','5030') +('6488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6488 MEMBER','1','5031') +('423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"423 MEMBER','1','5032') +('6651','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',68.41,'999','0','"6651 MEMBER','1','5033') +('1350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.45,'999','1','"1350 MEMBER','1','5034') +('852','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"852 MEMBER','1','5035') +('4321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4119.94,'999','0','"4321 MEMBER','1','5036') +('434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"434 MEMBER','1','5037') +('4897','2','LASTNAME','FIRSTNAME',999.99,27.34,'10',100.00,'1','0','1','PC','3','1','0',4164.27,'999','0','"4897 MEMBER','1','5038') +('4940','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',798.83,'999','1','"4940 MEMBER','1','5039') +('211','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',14.21,'999','1','"211 MEMBER','1','5040') +('2833','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3631.81,'999','0','"2833 MEMBER','1','5041') +('411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4367.47,'999','0','"411 MEMBER','1','5042') +('1753','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1753 MEMBER','1','5043') +('6236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',817.36,'999','0','"6236 MEMBER','1','5044') +('4727','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2624.80,'999','0','"4727 MEMBER','1','5045') +('2352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',853.16,'999','1','"2352 MEMBER','1','5046') +('6468','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6468 MEMBER','1','5047') +('6139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1488.19,'999','0','"6139 MEMBER','1','5048') +('4772','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4772 MEMBER','1','5049') +('4487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',252.57,'999','1','"4487 MEMBER','1','5050') +('299','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',445.14,'999','0','"299 MEMBER','1','5051') +('442','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',181.60,'999','1','"442 MEMBER','1','5052') +('2319','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2319 MEMBER','1','5053') +('1447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1447 MEMBER','1','5054') +('6579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',642.66,'999','1','"6579 MEMBER','1','5055') +('1188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1188 MEMBER','1','5056') +('4423','1','LASTNAME','FIRSTNAME',999.99,16.65,'0',20.00,'1','1','1','PC','1','0','0',2163.23,'999','0','"4423 MEMBER','1','5057') +('2654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1489.04,'999','0','"2654 MEMBER','1','5058') +('1149','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1941.42,'999','1','"1149 MEMBER','1','5059') +('4416','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2085.42,'999','0','"4416 MEMBER','1','5060') +('4376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1062.86,'999','0','"4376 MEMBER','1','5061') +('4457','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2232.25,'999','0','"4457 MEMBER','1','5062') +('6229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',652.69,'999','0','"6229 MEMBER','1','5063') +('1419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1851.89,'999','1','"1419 MEMBER','1','5064') +('4798','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1409.21,'999','1','"4798 MEMBER','1','5065') +('4604','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4604 MEMBER','1','5066') +('506','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',65.43,'999','1','"506 MEMBER','1','5067') +('6599','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',199.83,'999','1','"6599 MEMBER','1','5068') +('4739','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',97.82,'999','1','"4739 MEMBER','1','5069') +('6784','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',70.38,'999','0','"6784 MEMBER','1','5070') +('4853','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1149.62,'999','0','"4853 MEMBER','1','5071') +('1328','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',85.83,'999','1','"1328 MEMBER','1','5072') +('4215','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',482.93,'999','0','"4215 MEMBER','1','5073') +('491','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"491 MEMBER','1','5074') +('4952','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',907.35,'999','1','"4952 MEMBER','1','5075') +('4145','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',716.24,'999','0','"4145 MEMBER','1','5076') +('9002','2','LASTNAME','FIRSTNAME',999.99,159.37,'0',0.00,'0','0','1','TERM','0','0','0',337.50,'999','0','"9002 MEMBER','1','5077') +('42','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1243.40,'999','1','"42 MEMBER','1','5078') +('2276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',542.57,'999','0','"2276 MEMBER','1','5079') +('9039','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9039 MEMBER','1','5080') +('6369','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5021.22,'999','0','"6369 MEMBER','1','5081') +('6823','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6823 MEMBER','1','5082') +('5166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5166 MEMBER','1','5083') +('6912','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6912 MEMBER','1','5084') +('6899','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6899 MEMBER','1','5085') +('6900','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6900 MEMBER','1','5086') +('6892','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6892 MEMBER','1','5087') +('2538','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',677.69,'999','0','"2538 MEMBER','1','5088') +('5151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',8.52,'999','0','"5151 MEMBER','1','5089') +('6179','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',527.88,'999','1','"6179 MEMBER','1','5090') +('1843','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5480.29,'999','0','"1843 MEMBER','1','5091') +('4934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2096.10,'999','0','"4934 MEMBER','1','5092') +('1797','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.12,'999','1','"1797 MEMBER','1','5093') +('4898','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3933.48,'999','0','"4898 MEMBER','1','5094') +('230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2524.91,'999','0','"230 MEMBER','1','5095') +('218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',130.99,'999','1','"218 MEMBER','1','5096') +('6534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1089.41,'999','0','"6534 MEMBER','1','5097') +('419','1','LASTNAME','FIRSTNAME',999.99,7.97,'0',20.00,'1','1','1','PC','1','0','0',3321.32,'999','1','"419 MEMBER','1','5098') +('6671','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',43.91,'999','1','"6671 MEMBER','1','5099') +('4185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4185 MEMBER','1','5100') +('71','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',146.50,'999','0','"71 MEMBER','1','5101') +('6445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','INACT','0','0','0',3421.55,'999','0','"6445 MEMBER','1','5102') +('167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',3299.10,'999','0','"167 MEMBER','1','5103') +('4732','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',91.97,'999','1','"4732 MEMBER','1','5104') +('9101','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9101 MEMBER','1','5105') +('4559','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',2151.61,'999','0','"4559 MEMBER','1','5106') +('6417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.65,'999','1','"6417 MEMBER','1','5107') +('2909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2909 MEMBER','1','5108') +('4400','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',598.71,'999','0','"4400 MEMBER','1','5109') +('6327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',819.40,'999','1','"6327 MEMBER','1','5110') +('4856','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1119.47,'999','0','"4856 MEMBER','1','5111') +('2982','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1138.38,'999','0','"2982 MEMBER','1','5112') +('4983','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',652.24,'999','1','"4983 MEMBER','1','5113') +('179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2950.04,'999','0','"179 MEMBER','1','5114') +('1733','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',79.22,'999','1','"1733 MEMBER','1','5115') +('2860','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',575.27,'999','0','"2860 MEMBER','1','5116') +('4083','6','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2347.84,'999','0','"4083 MEMBER','1','5117') +('4076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3345.02,'999','0','"4076 MEMBER','1','5118') +('3273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.13,'999','1','"3273 MEMBER','1','5119') +('4271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4271 MEMBER','1','5120') +('3278','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3278 MEMBER','1','5121') +('4819','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',1524.42,'999','0','"4819 MEMBER','1','5122') +('505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.61,'999','1','"505 MEMBER','1','5123') +('2920','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2920 MEMBER','1','5124') +('3136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1059.46,'999','0','"3136 MEMBER','1','5125') +('1679','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1679 MEMBER','1','5126') +('2127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1023.28,'999','0','"2127 MEMBER','1','5127') +('6245','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',8205.37,'999','0','"6245 MEMBER','1','5128') +('4754','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',787.41,'999','0','"4754 MEMBER','1','5129') +('1066','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"1066 MEMBER','1','5130') +('1350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.45,'999','1','"1350 MEMBER','1','5131') +('6593','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',183.78,'999','0','"6593 MEMBER','1','5132') +('6311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',383.67,'999','0','"6311 MEMBER','1','5133') +('4096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3384.71,'999','1','"4096 MEMBER','1','5134') +('4492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',812.15,'999','0','"4492 MEMBER','1','5135') +('5138','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',3958.77,'999','0','"5138 MEMBER','1','5136') +('4109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.73,'999','0','"4109 MEMBER','1','5137') +('4735','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2087.68,'999','0','"4735 MEMBER','1','5138') +('4328','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4328 MEMBER','1','5139') +('6159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6159 MEMBER','1','5140') +('6204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',108.60,'999','0','"6204 MEMBER','1','5141') +('4172','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4172 MEMBER','1','5142') +('4883','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1872.55,'999','0','"4883 MEMBER','1','5143') +('2227','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1828.63,'999','0','"2227 MEMBER','1','5144') +('171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',357.27,'999','1','"171 MEMBER','1','5145') +('979','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',11.00,'999','1','"979 MEMBER','1','5146') +('9026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9026 MEMBER','1','5147') +('3256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3256 MEMBER','1','5148') +('2020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',5757.95,'999','0','"2020 MEMBER','1','5149') +('225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3213.55,'999','0','"225 MEMBER','1','5150') +('2610','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',66.86,'999','1','"2610 MEMBER','1','5151') +('6476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',102.00,'999','1','"6476 MEMBER','1','5152') +('4143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',4.07,'999','1','"4143 MEMBER','1','5153') +('126','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',32.04,'999','1','"126 MEMBER','1','5154') +('4033','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',577.72,'999','1','"4033 MEMBER','1','5155') +('6876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6876 MEMBER','1','5156') +('867','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',159.26,'999','1','"867 MEMBER','1','5157') +('6635','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',457.36,'999','0','"6635 MEMBER','1','5158') +('114','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',385.42,'999','0','"114 MEMBER','1','5159') +('182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1356.60,'999','0','"182 MEMBER','1','5160') +('10320','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10320 MEMBER','1','5161') +('6598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1066.04,'999','1','"6598 MEMBER','1','5162') +('2680','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',191.28,'999','1','"2680 MEMBER','1','5163') +('6355','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',875.47,'999','0','"6355 MEMBER','1','5164') +('62','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1025.02,'999','0','"62 MEMBER','1','5165') +('6417','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.65,'999','1','"6417 MEMBER','1','5166') +('4440','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4440 MEMBER','1','5167') +('311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"311 MEMBER','1','5168') +('103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4074.53,'999','0','"103 MEMBER','1','5169') +('5101','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1848.24,'999','0','"5101 MEMBER','1','5170') +('4330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4330 MEMBER','1','5171') +('623','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',16.44,'999','1','"623 MEMBER','1','5172') +('101','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',68.57,'999','1','"101 MEMBER','1','5173') +('6770','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',225.77,'999','1','"6770 MEMBER','1','5174') +('2411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',198.22,'999','1','"2411 MEMBER','1','5175') +('4109','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.73,'999','0','"4109 MEMBER','1','5176') +('4700','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',762.40,'999','0','"4700 MEMBER','1','5177') +('2415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',746.92,'999','0','"2415 MEMBER','1','5178') +('4835','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',585.11,'999','0','"4835 MEMBER','1','5179') +('4102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',628.55,'999','0','"4102 MEMBER','1','5180') +('4618','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4618 MEMBER','1','5181') +('4416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2085.42,'999','0','"4416 MEMBER','1','5182') +('5101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1848.24,'999','0','"5101 MEMBER','1','5183') +('2529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',153.27,'999','0','"2529 MEMBER','1','5184') +('3216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.06,'999','1','"3216 MEMBER','1','5185') +('4926','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4018.95,'999','0','"4926 MEMBER','1','5186') +('4071','2','LASTNAME','FIRSTNAME',999.99,43.10,'10',125.00,'1','0','1','PC','3','1','0',2103.69,'999','1','"4071 MEMBER','1','5187') +('4241','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"4241 MEMBER','1','5188') +('6539','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',264.78,'999','0','"6539 MEMBER','1','5189') +('1819','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1084.89,'999','0','"1819 MEMBER','1','5190') +('6113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0','-60.94','999','1','"6113 MEMBER','1','5191') +('57','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1440.10,'999','0','"57 MEMBER','1','5192') +('2924','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2114.22,'999','0','"2924 MEMBER','1','5193') +('44','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',256.98,'999','0','"44 MEMBER','1','5194') +('541','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',352.59,'999','0','"541 MEMBER','1','5195') +('3325','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1491.31,'999','1','"3325 MEMBER','1','5196') +('542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',405.51,'999','0','"542 MEMBER','1','5197') +('18','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"18 MEMBER','1','5198') +('4472','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',407.60,'999','1','"4472 MEMBER','1','5199') +('6638','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1991.89,'999','0','"6638 MEMBER','1','5200') +('6282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',21.98,'999','0','"6282 MEMBER','1','5201') +('1099','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',11.62,'999','1','"1099 MEMBER','1','5202') +('2938','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',539.34,'999','1','"2938 MEMBER','1','5203') +('1474','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5981.85,'999','0','"1474 MEMBER','1','5204') +('4276','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4276 MEMBER','1','5205') +('4555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4555 MEMBER','1','5206') +('4926','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4018.95,'999','0','"4926 MEMBER','1','5207') +('6300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',596.30,'999','0','"6300 MEMBER','1','5208') +('1813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1813 MEMBER','1','5209') +('2633','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',419.31,'999','1','"2633 MEMBER','1','5210') +('76','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2845.06,'999','0','"76 MEMBER','1','5211') +('2012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2012 MEMBER','1','5212') +('4310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',72.96,'999','0','"4310 MEMBER','1','5213') +('3147','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',618.50,'999','1','"3147 MEMBER','1','5214') +('6413','2','LASTNAME','FIRSTNAME',999.99,3.17,'0',20.00,'1','1','1','PC','1','0','0',1093.46,'999','0','"6413 MEMBER','1','5215') +('4288','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4288 MEMBER','1','5216') +('2813','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2813 MEMBER','1','5217') +('6246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1086.45,'999','1','"6246 MEMBER','1','5218') +('6934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6934 MEMBER','1','5219') +('6937','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6937 MEMBER','1','5220') +('6884','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6884 MEMBER','1','5221') +('6900','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6900 MEMBER','1','5222') +('188','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',695.16,'999','1','"188 MEMBER','1','5223') +('4712','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',51.82,'999','0','"4712 MEMBER','1','5224') +('6785','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.23,'999','1','"6785 MEMBER','1','5225') +('6929','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6929 MEMBER','1','5226') +('1967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1066.94,'999','0','"1967 MEMBER','1','5227') +('3044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',226.51,'999','0','"3044 MEMBER','1','5228') +('420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3956.40,'999','0','"420 MEMBER','1','5229') +('6711','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',100.01,'999','1','"6711 MEMBER','1','5230') +('4221','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4221 MEMBER','1','5231') +('4120','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4120 MEMBER','1','5232') +('743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',261.69,'999','1','"743 MEMBER','1','5233') +('2575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',983.56,'999','1','"2575 MEMBER','1','5234') +('1072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1072 MEMBER','1','5235') +('6624','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',706.79,'999','0','"6624 MEMBER','1','5236') +('4648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1560.27,'999','0','"4648 MEMBER','1','5237') +('6590','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',135.80,'999','1','"6590 MEMBER','1','5238') +('143','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"143 MEMBER','1','5239') +('4692','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',483.39,'999','1','"4692 MEMBER','1','5240') +('4408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.60,'999','0','"4408 MEMBER','1','5241') +('4965','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','0','0','0',0.00,'999','0','"4965 MEMBER','1','5242') +('2479','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',85.81,'999','1','"2479 MEMBER','1','5243') +('4341','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3075.18,'999','0','"4341 MEMBER','1','5244') +('6214','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',594.69,'999','0','"6214 MEMBER','1','5245') +('4491','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',233.07,'999','0','"4491 MEMBER','1','5246') +('4004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1519.65,'999','1','"4004 MEMBER','1','5247') +('1283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1283 MEMBER','1','5248') +('2532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',655.01,'999','0','"2532 MEMBER','1','5249') +('4690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4690 MEMBER','1','5250') +('4800','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',630.68,'999','0','"4800 MEMBER','1','5251') +('6769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',163.13,'999','0','"6769 MEMBER','1','5252') +('223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',794.50,'999','0','"223 MEMBER','1','5253') +('6517','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',759.25,'999','0','"6517 MEMBER','1','5254') +('4598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',256.63,'999','1','"4598 MEMBER','1','5255') +('5087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5087 MEMBER','1','5256') +('4515','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4821.37,'999','0','"4515 MEMBER','1','5257') +('525','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"525 MEMBER','1','5258') +('1791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1830.28,'999','0','"1791 MEMBER','1','5259') +('4190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4190 MEMBER','1','5260') +('178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"178 MEMBER','1','5261') +('4044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1281.11,'999','0','"4044 MEMBER','1','5262') +('4558','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',334.00,'999','1','"4558 MEMBER','1','5263') +('6613','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',89.82,'999','1','"6613 MEMBER','1','5264') +('4358','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3441.09,'999','1','"4358 MEMBER','1','5265') +('1828','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"1828 MEMBER','1','5266') +('2791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2791 MEMBER','1','5267') +('4054','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5062.35,'999','0','"4054 MEMBER','1','5268') +('4143','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',4.07,'999','1','"4143 MEMBER','1','5269') +('6287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3252.58,'999','0','"6287 MEMBER','1','5270') +('6115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',371.88,'999','0','"6115 MEMBER','1','5271') +('6656','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',322.24,'999','1','"6656 MEMBER','1','5272') +('440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','REG','0','0','0',0.00,'999','0','"440 MEMBER','1','5273') +('72','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"72 MEMBER','1','5274') +('4400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',598.71,'999','0','"4400 MEMBER','1','5275') +('6008','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'0','0','1','TERM','0','0','0',3022.74,'999','0','"6008 MEMBER','1','5276') +('4939','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',12.86,'999','0','"4939 MEMBER','1','5277') +('3000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3000 MEMBER','1','5278') +('6781','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',19.08,'999','1','"6781 MEMBER','1','5279') +('2726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2726 MEMBER','1','5280') +('6102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1578.03,'999','0','"6102 MEMBER','1','5281') +('4600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4600 MEMBER','1','5282') +('6647','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',610.23,'999','0','"6647 MEMBER','1','5283') +('4793','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',295.77,'999','0','"4793 MEMBER','1','5284') +('619','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',10773.60,'999','1','"619 MEMBER','1','5285') +('6881','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6881 MEMBER','1','5286') +('6895','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6895 MEMBER','1','5287') +('345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',539.37,'999','0','"345 MEMBER','1','5288') +('9072','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9072 MEMBER','1','5289') +('6353','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',285.64,'999','1','"6353 MEMBER','1','5290') +('3089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',160.36,'999','1','"3089 MEMBER','1','5291') +('8','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1575.46,'999','1','"8 MEMBER','1','5292') +('6899','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6899 MEMBER','1','5293') +('6936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6936 MEMBER','1','5294') +('6910','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6910 MEMBER','1','5295') +('8945','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8945 MEMBER','1','5296') +('1363','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',309.20,'999','1','"1363 MEMBER','1','5297') +('6541','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',266.70,'999','1','"6541 MEMBER','1','5298') +('1870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1870 MEMBER','1','5299') +('6309','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4392.96,'999','0','"6309 MEMBER','1','5300') +('3188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4459.61,'999','0','"3188 MEMBER','1','5301') +('4630','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.58,'999','0','"4630 MEMBER','1','5302') +('4656','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',101.25,'999','0','"4656 MEMBER','1','5303') +('936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"936 MEMBER','1','5304') +('4889','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1.30,'999','0','"4889 MEMBER','1','5305') +('1561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',153.93,'999','1','"1561 MEMBER','1','5306') +('3237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',316.54,'999','0','"3237 MEMBER','1','5307') +('4408','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',64.60,'999','0','"4408 MEMBER','1','5308') +('2559','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',135.63,'999','1','"2559 MEMBER','1','5309') +('6421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6421 MEMBER','1','5310') +('52','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"52 MEMBER','1','5311') +('54','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9156.49,'999','0','"54 MEMBER','1','5312') +('4584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',63.28,'999','1','"4584 MEMBER','1','5313') +('6385','2','LASTNAME','FIRSTNAME',999.99,16.07,'0',20.00,'1','0','1','PC','1','0','0',893.54,'999','0','"6385 MEMBER','1','5314') +('4252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4252 MEMBER','1','5315') +('9036','1','LASTNAME','FIRSTNAME',999.99,56.25,'0',0.00,'1','1','1','TERM','0','0','0',393.75,'999','0','"9036 MEMBER','1','5316') +('4502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.20,'999','1','"4502 MEMBER','1','5317') +('2712','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1958.65,'999','1','"2712 MEMBER','1','5318') +('2688','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','1',54.88,'999','0','"2688 MEMBER','1','5319') +('664','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.21,'999','1','"664 MEMBER','1','5320') +('400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"400 MEMBER','1','5321') +('4896','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',114.73,'999','0','"4896 MEMBER','1','5322') +('4472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',407.60,'999','1','"4472 MEMBER','1','5323') +('6225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.15,'999','1','"6225 MEMBER','1','5324') +('9063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',112.50,'999','0','"9063 MEMBER','1','5325') +('6162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1593.02,'999','0','"6162 MEMBER','1','5326') +('3029','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',150.12,'999','1','"3029 MEMBER','1','5327') +('4075','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',479.95,'999','1','"4075 MEMBER','1','5328') +('4511','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',517.48,'999','0','"4511 MEMBER','1','5329') +('59','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',171.18,'999','1','"59 MEMBER','1','5330') +('1217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1589.93,'999','0','"1217 MEMBER','1','5331') +('3188','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4459.61,'999','0','"3188 MEMBER','1','5332') +('195','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"195 MEMBER','1','5333') +('6689','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1054.53,'999','0','"6689 MEMBER','1','5334') +('4927','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1705.81,'999','1','"4927 MEMBER','1','5335') +('1974','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1974 MEMBER','1','5336') +('6512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',802.89,'999','0','"6512 MEMBER','1','5337') +('437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10328.36,'999','0','"437 MEMBER','1','5338') +('4255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',143.97,'999','0','"4255 MEMBER','1','5339') +('5079','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5079 MEMBER','1','5340') +('1767','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1767 MEMBER','1','5341') +('6118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',456.65,'999','1','"6118 MEMBER','1','5342') +('547','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1068.25,'999','1','"547 MEMBER','1','5343') +('2588','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1324.64,'999','0','"2588 MEMBER','1','5344') +('1832','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1832 MEMBER','1','5345') +('4593','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4887.53,'999','0','"4593 MEMBER','1','5346') +('6600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',546.51,'999','0','"6600 MEMBER','1','5347') +('4104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4104 MEMBER','1','5348') +('876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"876 MEMBER','1','5349') +('1811','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1811 MEMBER','1','5350') +('4837','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1514.97,'999','0','"4837 MEMBER','1','5351') +('2382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2382 MEMBER','0','5352') +('6312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1430.54,'999','1','"6312 MEMBER','1','5353') +('213','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"213 MEMBER','1','5354') +('1579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',170.20,'999','1','"1579 MEMBER','1','5355') +('6601','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',69.86,'999','1','"6601 MEMBER','1','5356') +('1018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1018 MEMBER','1','5357') +('4842','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1316.52,'999','1','"4842 MEMBER','1','5358') +('6014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6014 MEMBER','1','5359') +('199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5473.39,'999','0','"199 MEMBER','1','5360') +('6889','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6889 MEMBER','1','5361') +('6883','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6883 MEMBER','1','5362') +('6650','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',55.05,'999','1','"6650 MEMBER','1','5363') +('1527','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1527 MEMBER','1','5364') +('2286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',905.10,'999','0','"2286 MEMBER','1','5365') +('239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',542.90,'999','0','"239 MEMBER','1','5366') +('3127','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"3127 MEMBER','1','5367') +('4560','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',83.56,'999','0','"4560 MEMBER','1','5368') +('405','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',165.51,'999','1','"405 MEMBER','1','5369') +('6131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7262.37,'999','0','"6131 MEMBER','1','5370') +('4887','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4887 MEMBER','1','5371') +('1425','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3236.27,'999','0','"1425 MEMBER','1','5372') +('6688','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',361.73,'999','0','"6688 MEMBER','1','5373') +('6484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',155.94,'999','0','"6484 MEMBER','1','5374') +('2857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2857 MEMBER','1','5375') +('4615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2595.08,'999','0','"4615 MEMBER','1','5376') +('525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"525 MEMBER','1','5377') +('4872','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1244.83,'999','0','"4872 MEMBER','1','5378') +('4799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1416.72,'999','0','"4799 MEMBER','1','5379') +('330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',90.75,'999','1','"330 MEMBER','1','5380') +('4383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',24.99,'999','0','"4383 MEMBER','1','5381') +('449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',651.27,'999','0','"449 MEMBER','1','5382') +('2483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2483 MEMBER','1','5383') +('1540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1540 MEMBER','1','5384') +('6663','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6663 MEMBER','1','5385') +('2847','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',514.84,'999','1','"2847 MEMBER','1','5386') +('4600','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4600 MEMBER','1','5387') +('185','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',759.29,'999','1','"185 MEMBER','1','5388') +('6416','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1081.97,'999','0','"6416 MEMBER','1','5389') +('2384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',48.51,'999','1','"2384 MEMBER','1','5390') +('4231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.40,'999','1','"4231 MEMBER','1','5391') +('4621','1','LASTNAME','FIRSTNAME',999.99,19.99,'0',20.00,'1','1','1','PC','1','0','0',6222.10,'999','0','"4621 MEMBER','1','5392') +('6668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1315.16,'999','0','"6668 MEMBER','1','5393') +('2670','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"2670 MEMBER','1','5394') +('4491','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',233.07,'999','0','"4491 MEMBER','1','5395') +('1139','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',282.49,'999','1','"1139 MEMBER','1','5396') +('4282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15458.96,'999','0','"4282 MEMBER','1','5397') +('4861','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',134.74,'999','1','"4861 MEMBER','1','5398') +('6122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6122 MEMBER','1','5399') +('4096','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3384.71,'999','1','"4096 MEMBER','1','5400') +('4610','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1028.73,'999','0','"4610 MEMBER','1','5401') +('4758','2','LASTNAME','FIRSTNAME',999.99,14.71,'0',20.00,'1','0','1','PC','1','0','0',3167.26,'999','0','"4758 MEMBER','1','5402') +('5160','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',369.57,'999','0','"5160 MEMBER','1','5403') +('6516','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1566.92,'999','0','"6516 MEMBER','1','5404') +('4056','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',38.05,'999','0','"4056 MEMBER','1','5405') +('6576','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',80.26,'999','0','"6576 MEMBER','1','5406') +('2971','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2971 MEMBER','1','5407') +('632','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',639.05,'999','0','"632 MEMBER','1','5408') +('4593','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4887.53,'999','0','"4593 MEMBER','1','5409') +('4282','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',15458.96,'999','0','"4282 MEMBER','1','5410') +('4443','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6610.43,'999','0','"4443 MEMBER','1','5411') +('1691','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1285.15,'999','0','"1691 MEMBER','1','5412') +('1237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1237 MEMBER','1','5413') +('4536','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4536 MEMBER','1','5414') +('278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"278 MEMBER','1','5415') +('1184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1954.39,'999','0','"1184 MEMBER','1','5416') +('2938','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',539.34,'999','1','"2938 MEMBER','1','5417') +('4319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',478.72,'999','0','"4319 MEMBER','1','5418') +('3377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2217.57,'999','1','"3377 MEMBER','1','5419') +('6402','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',813.97,'999','0','"6402 MEMBER','1','5420') +('3380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3380 MEMBER','1','5421') +('6331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',458.81,'999','0','"6331 MEMBER','1','5422') +('1945','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',56.20,'999','1','"1945 MEMBER','1','5423') +('872','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',114.41,'999','1','"872 MEMBER','1','5424') +('4262','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4262 MEMBER','1','5425') +('4056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',38.05,'999','0','"4056 MEMBER','1','5426') +('6838','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6838 MEMBER','1','5427') +('6884','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6884 MEMBER','1','5428') +('9061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',236.25,'999','0','"9061 MEMBER','1','5429') +('6293','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2139.99,'999','0','"6293 MEMBER','1','5430') +('6906','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6906 MEMBER','1','5431') +('6901','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"6901 MEMBER','1','5432') +('6893','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"6893 MEMBER','1','5433') +('6930','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"6930 MEMBER','1','5434') +('6942','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"6942 MEMBER','1','5435') +('6543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',987.13,'999','0','"6543 MEMBER','1','5436') +('4422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1348.93,'999','0','"4422 MEMBER','1','5437') +('2193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2193 MEMBER','1','5438') +('2629','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2590.94,'999','0','"2629 MEMBER','1','5439') +('2235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2235 MEMBER','1','5440') +('543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',222.84,'999','1','"543 MEMBER','1','5441') +('1799','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1799 MEMBER','1','5442') +('1145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1145 MEMBER','1','5443') +('4778','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2640.34,'999','1','"4778 MEMBER','1','5444') +('6250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1876.45,'999','0','"6250 MEMBER','1','5445') +('4804','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',30.72,'999','0','"4804 MEMBER','1','5446') +('420','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3956.40,'999','0','"420 MEMBER','1','5447') +('533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"533 MEMBER','1','5448') +('480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"480 MEMBER','1','5449') +('4603','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5889.82,'999','0','"4603 MEMBER','1','5450') +('1779','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1779 MEMBER','1','5451') +('6209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2605.88,'999','0','"6209 MEMBER','1','5452') +('1086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1086 MEMBER','1','5453') +('4090','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',345.57,'999','0','"4090 MEMBER','1','5454') +('4212','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',110.90,'999','1','"4212 MEMBER','1','5455') +('418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',84.29,'999','1','"418 MEMBER','1','5456') +('3271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3271 MEMBER','1','5457') +('2775','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',175.50,'999','0','"2775 MEMBER','1','5458') +('1773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',355.78,'999','0','"1773 MEMBER','1','5459') +('31','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6258.71,'999','0','"31 MEMBER','1','5460') +('4094','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4094 MEMBER','1','5461') +('177','2','LASTNAME','FIRSTNAME',999.99,5.76,'0',20.00,'1','0','1','PC','1','0','0',1369.41,'999','0','"177 MEMBER','1','5462') +('6521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',251.65,'999','0','"6521 MEMBER','1','5463') +('3363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',146.27,'999','1','"3363 MEMBER','1','5464') +('1555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',509.04,'999','0','"1555 MEMBER','1','5465') +('6364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',96.54,'999','0','"6364 MEMBER','1','5466') +('6489','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',70.35,'999','1','"6489 MEMBER','1','5467') +('6518','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',584.29,'999','1','"6518 MEMBER','1','5468') +('7246','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7246 MEMBER','1','5469') +('2178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2178 MEMBER','1','5470') +('1482','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',657.06,'999','1','"1482 MEMBER','1','5471') +('1769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2993.60,'999','0','"1769 MEMBER','1','5472') +('4798','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1409.21,'999','1','"4798 MEMBER','1','5473') +('4349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2293.98,'999','1','"4349 MEMBER','1','5474') +('6548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1042.55,'999','0','"6548 MEMBER','1','5475') +('7111','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7111 MEMBER','1','5476') +('4080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4080 MEMBER','1','5477') +('4989','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4989 MEMBER','1','5478') +('243','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1322.02,'999','0','"243 MEMBER','1','5479') +('4016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4016 MEMBER','1','5480') +('3415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',311.72,'999','0','"3415 MEMBER','1','5481') +('251','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1380.80,'999','0','"251 MEMBER','1','5482') +('299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',445.14,'999','0','"299 MEMBER','1','5483') +('3346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',707.68,'999','0','"3346 MEMBER','1','5484') +('2415','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',746.92,'999','0','"2415 MEMBER','1','5485') +('4901','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',313.33,'999','0','"4901 MEMBER','1','5486') +('6335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',105.89,'999','1','"6335 MEMBER','1','5487') +('1236','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',84.39,'999','0','"1236 MEMBER','1','5488') +('4575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6267.07,'999','0','"4575 MEMBER','1','5489') +('1753','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1753 MEMBER','1','5490') +('777','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"777 MEMBER','1','5491') +('1998','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1998 MEMBER','1','5492') +('6107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',495.52,'999','0','"6107 MEMBER','1','5493') +('4246','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1802.09,'999','1','"4246 MEMBER','1','5494') +('2022','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',418.47,'999','0','"2022 MEMBER','1','5495') +('4415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',658.41,'999','1','"4415 MEMBER','1','5496') +('3147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',618.50,'999','1','"3147 MEMBER','1','5497') +('2321','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"2321 MEMBER','1','5498') +('2490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2748.27,'999','0','"2490 MEMBER','1','5499') +('4693','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',263.87,'999','0','"4693 MEMBER','1','5500') +('6476','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',102.00,'999','1','"6476 MEMBER','1','5501') +('3073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2567.94,'999','0','"3073 MEMBER','1','5502') +('6873','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6873 MEMBER','1','5503') +('6896','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6896 MEMBER','1','5504') +('421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"421 MEMBER','1','5505') +('5073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5073 MEMBER','1','5506') +('2024','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3767.75,'999','0','"2024 MEMBER','1','5507') +('2180','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2180 MEMBER','1','5508') +('499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"499 MEMBER','1','5509') +('9687','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9687 MEMBER','1','5510') +('1240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1240 MEMBER','1','5511') +('6559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',432.68,'999','0','"6559 MEMBER','1','5512') +('10204','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10204 MEMBER','1','5513') +('2811','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2811 MEMBER','1','5514') +('6688','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',361.73,'999','0','"6688 MEMBER','1','5515') +('121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"121 MEMBER','1','5516') +('4699','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',75.92,'999','0','"4699 MEMBER','1','5517') +('4560','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',83.56,'999','0','"4560 MEMBER','1','5518') +('4460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4460 MEMBER','1','5519') +('4889','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1.30,'999','0','"4889 MEMBER','1','5520') +('3309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.18,'999','1','"3309 MEMBER','1','5521') +('125','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',37.11,'999','1','"125 MEMBER','1','5522') +('168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',381.58,'999','0','"168 MEMBER','1','5523') +('2766','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.06,'999','1','"2766 MEMBER','1','5524') +('6573','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6573 MEMBER','1','5525') +('1242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1242 MEMBER','1','5526') +('4483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',134.69,'999','0','"4483 MEMBER','1','5527') +('4476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',320.16,'999','0','"4476 MEMBER','1','5528') +('424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',625.03,'999','1','"424 MEMBER','1','5529') +('5052','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5052 MEMBER','1','5530') +('4752','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',374.28,'999','1','"4752 MEMBER','1','5531') +('395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"395 MEMBER','1','5532') +('4116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1800.40,'999','0','"4116 MEMBER','1','5533') +('2253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.72,'999','1','"2253 MEMBER','1','5534') +('4657','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4657 MEMBER','1','5535') +('1445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',201.98,'999','1','"1445 MEMBER','1','5536') +('4124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"4124 MEMBER','1','5537') +('1598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1598 MEMBER','1','5538') +('6267','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',846.84,'999','0','"6267 MEMBER','1','5539') +('3424','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1234.83,'999','0','"3424 MEMBER','1','5540') +('6102','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1578.03,'999','0','"6102 MEMBER','1','5541') +('136','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"136 MEMBER','1','5542') +('4353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4353 MEMBER','1','5543') +('4402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',132.21,'999','0','"4402 MEMBER','1','5544') +('2463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',139.25,'999','1','"2463 MEMBER','1','5545') +('4104','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4104 MEMBER','1','5546') +('442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',181.60,'999','1','"442 MEMBER','1','5547') +('6624','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',706.79,'999','0','"6624 MEMBER','1','5548') +('3250','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1391.85,'999','0','"3250 MEMBER','1','5549') +('4735','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2087.68,'999','0','"4735 MEMBER','1','5550') +('6701','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.07,'999','1','"6701 MEMBER','1','5551') +('1076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1076 MEMBER','1','5552') +('162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"162 MEMBER','1','5553') +('4900','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6411.43,'999','0','"4900 MEMBER','1','5554') +('6514','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',220.07,'999','1','"6514 MEMBER','1','5555') +('6784','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',70.38,'999','0','"6784 MEMBER','1','5556') +('4526','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',150.26,'999','1','"4526 MEMBER','1','5557') +('4965','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','REG','0','0','0',0.00,'999','0','"4965 MEMBER','1','5558') +('544','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"544 MEMBER','1','5559') +('6412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',89.58,'999','1','"6412 MEMBER','1','5560') +('396','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"396 MEMBER','1','5561') +('2382','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2382 MEMBER','0','5562') +('4062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.49,'999','1','"4062 MEMBER','1','5563') +('304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3549.64,'999','0','"304 MEMBER','1','5564') +('6649','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',445.02,'999','1','"6649 MEMBER','1','5565') +('4102','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',628.55,'999','0','"4102 MEMBER','1','5566') +('4647','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1348.02,'999','0','"4647 MEMBER','1','5567') +('6211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3663.16,'999','0','"6211 MEMBER','1','5568') +('6681','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',176.54,'999','0','"6681 MEMBER','1','5569') +('518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.59,'999','1','"518 MEMBER','1','5570') +('9097','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9097 MEMBER','1','5571') +('2876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2657.93,'999','0','"2876 MEMBER','1','5572') +('867','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',159.26,'999','1','"867 MEMBER','1','5573') +('10106','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10106 MEMBER','1','5574') +('1423','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1225.53,'999','0','"1423 MEMBER','1','5575') +('3265','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',368.07,'999','1','"3265 MEMBER','1','5576') +('4183','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4183 MEMBER','1','5577') +('5006','6','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5006 MEMBER','1','5578') +('6592','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',34.31,'999','1','"6592 MEMBER','1','5579') +('4479','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4479 MEMBER','1','5580') +('6337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4480.02,'999','0','"6337 MEMBER','1','5581') +('57','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1440.10,'999','0','"57 MEMBER','1','5582') +('3120','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4126.34,'999','0','"3120 MEMBER','1','5583') +('6694','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',146.42,'999','1','"6694 MEMBER','1','5584') +('6498','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',488.89,'999','0','"6498 MEMBER','1','5585') +('6650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',55.05,'999','1','"6650 MEMBER','1','5586') +('6384','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',337.21,'999','1','"6384 MEMBER','1','5587') +('559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"559 MEMBER','1','5588') +('2352','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',853.16,'999','1','"2352 MEMBER','1','5589') +('6497','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4335.99,'999','0','"6497 MEMBER','1','5590') +('1117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1117 MEMBER','1','5591') +('4753','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',8.79,'999','0','"4753 MEMBER','1','5592') +('2934','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',647.28,'999','0','"2934 MEMBER','1','5593') +('10','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3896.45,'999','0','"10 MEMBER','1','5594') +('2397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2397 MEMBER','1','5595') +('1260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2752.96,'999','0','"1260 MEMBER','1','5596') +('2942','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',334.29,'999','0','"2942 MEMBER','1','5597') +('2778','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2778 MEMBER','1','5598') +('4813','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1043.62,'999','0','"4813 MEMBER','1','5599') +('4960','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1679.73,'999','0','"4960 MEMBER','1','5600') +('6138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'1','1','1','PC','1','0','0',318.78,'999','0','"6138 MEMBER','1','5601') +('4144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4144 MEMBER','1','5602') +('4756','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4756 MEMBER','1','5603') +('2453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',112.95,'999','0','"2453 MEMBER','1','5604') +('6667','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1166.20,'999','1','"6667 MEMBER','1','5605') +('1320','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7137.30,'999','0','"1320 MEMBER','1','5606') +('9064','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',38.46,'999','0','"9064 MEMBER','1','5607') +('6781','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',19.08,'999','1','"6781 MEMBER','1','5608') +('4118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8027.10,'999','0','"4118 MEMBER','1','5609') +('283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3063.02,'999','0','"283 MEMBER','1','5610') +('2778','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2778 MEMBER','1','5611') +('6352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',920.18,'999','1','"6352 MEMBER','1','5612') +('1742','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1742 MEMBER','1','5613') +('259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"259 MEMBER','1','5614') +('4897','1','LASTNAME','FIRSTNAME',999.99,27.34,'10',100.00,'1','1','1','PC','3','1','0',4164.27,'999','0','"4897 MEMBER','1','5615') +('6613','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',89.82,'999','1','"6613 MEMBER','1','5616') +('4742','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1444.63,'999','0','"4742 MEMBER','1','5617') +('4223','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4223 MEMBER','1','5618') +('6307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',497.91,'999','0','"6307 MEMBER','1','5619') +('2696','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2696 MEMBER','1','5620') +('6626','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',385.16,'999','0','"6626 MEMBER','1','5621') +('6173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',114.89,'999','0','"6173 MEMBER','1','5622') +('6232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1941.39,'999','0','"6232 MEMBER','1','5623') +('6255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',172.91,'999','0','"6255 MEMBER','1','5624') +('6640','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',79.51,'999','0','"6640 MEMBER','1','5625') +('4660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1535.04,'999','0','"4660 MEMBER','1','5626') +('176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',20.30,'999','0','"176 MEMBER','1','5627') +('2837','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',100.53,'999','1','"2837 MEMBER','1','5628') +('6417','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.65,'999','1','"6417 MEMBER','1','5629') +('9068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9068 MEMBER','1','5630') +('1332','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1786.39,'999','0','"1332 MEMBER','1','5631') +('6460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',510.44,'999','1','"6460 MEMBER','1','5632') +('2801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2801 MEMBER','1','5633') +('289','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2926.92,'999','0','"289 MEMBER','1','5634') +('31','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6258.71,'999','0','"31 MEMBER','1','5635') +('3394','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',313.02,'999','1','"3394 MEMBER','1','5636') +('6144','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',1323.19,'999','0','"6144 MEMBER','1','5637') +('1799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1799 MEMBER','1','5638') +('1934','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',78.01,'999','1','"1934 MEMBER','1','5639') +('4162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',164.11,'999','1','"4162 MEMBER','1','5640') +('471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.56,'999','1','"471 MEMBER','1','5641') +('3085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',473.13,'999','0','"3085 MEMBER','1','5642') +('4406','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1625.55,'999','0','"4406 MEMBER','1','5643') +('8706','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8706 MEMBER','1','5644') +('6618','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6618 MEMBER','1','5645') +('9699','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9699 MEMBER','1','5646') +('6409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',564.84,'999','0','"6409 MEMBER','1','5647') +('1260','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2752.96,'999','0','"1260 MEMBER','1','5648') +('4236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1320.49,'999','1','"4236 MEMBER','1','5649') +('3183','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3177.55,'999','0','"3183 MEMBER','1','5650') +('10279','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10279 MEMBER','1','5651') +('4217','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',321.52,'999','1','"4217 MEMBER','1','5652') +('1898','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2260.03,'999','0','"1898 MEMBER','1','5653') +('3403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3887.03,'999','0','"3403 MEMBER','1','5654') +('4629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',8.65,'999','0','"4629 MEMBER','1','5655') +('6603','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',108.01,'999','0','"6603 MEMBER','1','5656') +('6119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1764.70,'999','0','"6119 MEMBER','1','5657') +('1057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1057 MEMBER','1','5658') +('2026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2026 MEMBER','1','5659') +('2841','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',530.04,'999','0','"2841 MEMBER','1','5660') +('3373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',687.17,'999','0','"3373 MEMBER','1','5661') +('4521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',362.12,'999','1','"4521 MEMBER','1','5662') +('128','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1234.78,'999','1','"128 MEMBER','1','5663') +('1693','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1585.46,'999','0','"1693 MEMBER','1','5664') +('3002','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1221.50,'999','0','"3002 MEMBER','1','5665') +('2716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2716 MEMBER','1','5666') +('380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1528.51,'999','0','"380 MEMBER','1','5667') +('4750','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',290.30,'999','0','"4750 MEMBER','1','5668') +('3069','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3069 MEMBER','1','5669') +('2658','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9105.69,'999','0','"2658 MEMBER','1','5670') +('6117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6117 MEMBER','1','5671') +('4000','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1497.59,'999','1','"4000 MEMBER','1','5672') +('4307','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2615.06,'999','0','"4307 MEMBER','1','5673') +('4086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4086 MEMBER','1','5674') +('4250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4250 MEMBER','1','5675') +('2477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2902.07,'999','1','"2477 MEMBER','1','5676') +('4094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4094 MEMBER','1','5677') +('6450','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',157.83,'999','1','"6450 MEMBER','1','5678') +('2911','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2911 MEMBER','1','5679') +('97','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6248.79,'999','1','"97 MEMBER','1','5680') +('4975','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2923.76,'999','0','"4975 MEMBER','1','5681') +('3235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.48,'999','0','"3235 MEMBER','1','5682') +('6384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',337.21,'999','1','"6384 MEMBER','1','5683') +('50','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',82.08,'999','1','"50 MEMBER','1','5684') +('6275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',150.23,'999','0','"6275 MEMBER','1','5685') +('4518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',388.10,'999','1','"4518 MEMBER','1','5686') +('6758','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',352.95,'999','0','"6758 MEMBER','1','5687') +('1828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"1828 MEMBER','1','5688') +('1363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',309.20,'999','1','"1363 MEMBER','1','5689') +('6424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',133.31,'999','1','"6424 MEMBER','1','5690') +('1332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1786.39,'999','0','"1332 MEMBER','1','5691') +('4298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',61.35,'999','1','"4298 MEMBER','1','5692') +('4622','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',282.84,'999','1','"4622 MEMBER','1','5693') +('5056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5056 MEMBER','1','5694') +('8','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1575.46,'999','1','"8 MEMBER','1','5695') +('5051','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5051 MEMBER','1','5696') +('4151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',685.15,'999','1','"4151 MEMBER','1','5697') +('6217','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3872.43,'999','0','"6217 MEMBER','1','5698') +('4494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',53.02,'999','1','"4494 MEMBER','1','5699') +('6418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2034.68,'999','1','"6418 MEMBER','1','5700') +('6545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1420.23,'999','0','"6545 MEMBER','1','5701') +('9049','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9049 MEMBER','1','5702') +('777','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"777 MEMBER','1','5703') +('1838','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',91.61,'999','0','"1838 MEMBER','1','5704') +('4612','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2926.47,'999','1','"4612 MEMBER','1','5705') +('4767','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4767 MEMBER','1','5706') +('6292','2','LASTNAME','FIRSTNAME',999.99,19.82,'0',20.00,'1','0','1','PC','1','0','0',405.34,'999','0','"6292 MEMBER','1','5707') +('6914','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6914 MEMBER','1','5708') +('6921','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6921 MEMBER','1','5709') +('4251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',866.32,'999','1','"4251 MEMBER','1','5710') +('187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1804.51,'999','0','"187 MEMBER','1','5711') +('5067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5067 MEMBER','1','5712') +('6726','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',121.24,'999','0','"6726 MEMBER','1','5713') +('10052','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10052 MEMBER','1','5714') +('492','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1124.45,'999','0','"492 MEMBER','1','5715') +('2191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2191 MEMBER','1','5716') +('1888','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3421.89,'999','0','"1888 MEMBER','1','5717') +('264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"264 MEMBER','1','5718') +('4199','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',2371.20,'999','0','"4199 MEMBER','1','5719') +('6595','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',468.97,'999','0','"6595 MEMBER','1','5720') +('2820','1','LASTNAME','FIRSTNAME',999.99,19.47,'0',20.00,'1','1','1','PC','1','0','0',1125.48,'999','0','"2820 MEMBER','1','5721') +('1197','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',6281.85,'999','0','"1197 MEMBER','1','5722') +('2862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',232.61,'999','0','"2862 MEMBER','1','5723') +('2745','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2745 MEMBER','1','5724') +('296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"296 MEMBER','1','5725') +('6617','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',975.53,'999','0','"6617 MEMBER','1','5726') +('4490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',90.64,'999','0','"4490 MEMBER','1','5727') +('2944','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',621.78,'999','1','"2944 MEMBER','1','5728') +('4953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1247.04,'999','0','"4953 MEMBER','1','5729') +('3356','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3356 MEMBER','1','5730') +('3327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3327 MEMBER','1','5731') +('4958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.03,'999','1','"4958 MEMBER','1','5732') +('3023','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5593.46,'999','0','"3023 MEMBER','1','5733') +('6556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.07,'999','1','"6556 MEMBER','1','5734') +('6352','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',920.18,'999','1','"6352 MEMBER','1','5735') +('6263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1264.41,'999','0','"6263 MEMBER','1','5736') +('6678','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',211.61,'999','0','"6678 MEMBER','1','5737') +('4818','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',668.45,'999','1','"4818 MEMBER','1','5738') +('1232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1232 MEMBER','1','5739') +('237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',54.28,'999','0','"237 MEMBER','1','5740') +('4069','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2195.36,'999','1','"4069 MEMBER','1','5741') +('443','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"443 MEMBER','1','5742') +('6342','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3146.04,'999','0','"6342 MEMBER','1','5743') +('350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"350 MEMBER','1','5744') +('1190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1190 MEMBER','1','5745') +('1718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1476.72,'999','0','"1718 MEMBER','1','5746') +('4868','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2692.16,'999','0','"4868 MEMBER','1','5747') +('2886','1','LASTNAME','FIRSTNAME',999.99,'-3.45','0',20.00,'1','1','1','PC','1','0','0',1516.95,'999','0','"2886 MEMBER','1','5748') +('2690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2690 MEMBER','1','5749') +('1451','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5485.55,'999','0','"1451 MEMBER','1','5750') +('4780','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',8.36,'999','0','"4780 MEMBER','1','5751') +('4435','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1297.49,'999','0','"4435 MEMBER','1','5752') +('4039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1364.43,'999','1','"4039 MEMBER','1','5753') +('6197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',743.40,'999','0','"6197 MEMBER','1','5754') +('1398','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1622.13,'999','0','"1398 MEMBER','1','5755') +('4795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',206.93,'999','0','"4795 MEMBER','1','5756') +('6536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',38.36,'999','0','"6536 MEMBER','1','5757') +('4732','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',91.97,'999','1','"4732 MEMBER','1','5758') +('2392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2392 MEMBER','1','5759') +('4746','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',1760.75,'999','0','"4746 MEMBER','1','5760') +('6308','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',807.43,'999','0','"6308 MEMBER','1','5761') +('27','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',196.69,'999','1','"27 MEMBER','1','5762') +('4042','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',879.35,'999','0','"4042 MEMBER','1','5763') +('3127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3127 MEMBER','1','5764') +('2527','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',45.56,'999','0','"2527 MEMBER','1','5765') +('6459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',106.34,'999','0','"6459 MEMBER','1','5766') +('6477','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',198.24,'999','0','"6477 MEMBER','1','5767') +('3382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6005.76,'999','0','"3382 MEMBER','1','5768') +('6136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3585.21,'999','0','"6136 MEMBER','1','5770') +('9006','2','LASTNAME','FIRSTNAME',999.99,103.12,'0',0.00,'1','0','1','TERM','0','0','0',393.75,'999','0','"9006 MEMBER','1','5771') +('3006','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1676.59,'999','0','"3006 MEMBER','1','5772') +('6331','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',458.81,'999','0','"6331 MEMBER','1','5773') +('2740','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',2066.00,'999','0','"2740 MEMBER','1','5774') +('2494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',563.82,'999','1','"2494 MEMBER','1','5775') +('4413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2155.80,'999','0','"4413 MEMBER','1','5776') +('6501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1479.31,'999','0','"6501 MEMBER','1','5777') +('344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1305.13,'999','0','"344 MEMBER','1','5778') +('6751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',139.16,'999','0','"6751 MEMBER','1','5779') +('6648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',931.71,'999','1','"6648 MEMBER','1','5780') +('4138','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2811.05,'999','0','"4138 MEMBER','1','5781') +('6300','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',596.30,'999','0','"6300 MEMBER','1','5782') +('8392','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8392 MEMBER','1','5783') +('1365','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1539.80,'999','0','"1365 MEMBER','1','5784') +('6554','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1022.16,'999','0','"6554 MEMBER','1','5785') +('6497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4335.99,'999','0','"6497 MEMBER','1','5786') +('88','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3488.44,'999','0','"88 MEMBER','1','5787') +('264','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"264 MEMBER','1','5788') +('4030','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',361.26,'999','0','"4030 MEMBER','1','5789') +('3094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',411.54,'999','0','"3094 MEMBER','1','5790') +('6378','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',700.26,'999','1','"6378 MEMBER','1','5791') +('1898','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2260.03,'999','0','"1898 MEMBER','1','5792') +('1570','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',19.88,'999','1','"1570 MEMBER','1','5793') +('2709','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',731.62,'999','0','"2709 MEMBER','1','5794') +('8412','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8412 MEMBER','1','5795') +('4240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5668.59,'999','1','"4240 MEMBER','1','5796') +('1993','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1993 MEMBER','1','5797') +('5076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5076 MEMBER','1','5798') +('2849','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2849 MEMBER','1','5799') +('6537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',256.73,'999','0','"6537 MEMBER','1','5800') +('357','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',137.05,'999','1','"357 MEMBER','1','5801') +('2764','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',402.46,'999','0','"2764 MEMBER','1','5802') +('4221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4221 MEMBER','1','5803') +('4218','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',913.61,'999','0','"4218 MEMBER','1','5804') +('536','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',43.34,'999','0','"536 MEMBER','1','5805') +('6396','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4922.47,'999','1','"6396 MEMBER','1','5806') +('2257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2257 MEMBER','1','5807') +('6543','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',987.13,'999','0','"6543 MEMBER','1','5808') +('6686','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',297.16,'999','1','"6686 MEMBER','1','5809') +('6748','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',264.27,'999','0','"6748 MEMBER','1','5810') +('9074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',123.75,'999','0','"9074 MEMBER','1','5811') +('1320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7137.30,'999','0','"1320 MEMBER','1','5812') +('9923','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9923 MEMBER','1','5813') +('6642','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',585.84,'999','1','"6642 MEMBER','1','5814') +('151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1266.83,'999','0','"151 MEMBER','1','5815') +('1398','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1622.13,'999','0','"1398 MEMBER','1','5816') +('283','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3063.02,'999','0','"283 MEMBER','1','5817') +('4948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.93,'999','1','"4948 MEMBER','1','5818') +('6698','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',99.55,'999','0','"6698 MEMBER','1','5819') +('416','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',810.79,'999','1','"416 MEMBER','1','5820') +('85','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',268.57,'999','1','"85 MEMBER','1','5821') +('3282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',353.72,'999','1','"3282 MEMBER','1','5822') +('3422','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"3422 MEMBER','1','5823') +('4407','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',116.77,'999','1','"4407 MEMBER','1','5824') +('6778','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',97.89,'999','0','"6778 MEMBER','1','5825') +('530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2785.43,'999','0','"530 MEMBER','1','5826') +('6288','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',350.47,'999','0','"6288 MEMBER','1','5827') +('6345','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.22,'999','0','"6345 MEMBER','1','5828') +('4223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4223 MEMBER','1','5829') +('6692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',566.14,'999','1','"6692 MEMBER','1','5830') +('237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',54.28,'999','0','"237 MEMBER','1','5831') +('4530','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',66.76,'999','0','"4530 MEMBER','1','5832') +('1394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',193.86,'999','1','"1394 MEMBER','1','5833') +('4795','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',206.93,'999','0','"4795 MEMBER','1','5834') +('4399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4399 MEMBER','1','5835') +('2340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2340 MEMBER','1','5836') +('493','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',227.43,'999','0','"493 MEMBER','1','5837') +('1793','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.99,'999','1','"1793 MEMBER','1','5838') +('2621','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',135.93,'999','1','"2621 MEMBER','1','5839') +('4212','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',110.90,'999','1','"4212 MEMBER','1','5840') +('6516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1566.92,'999','0','"6516 MEMBER','1','5841') +('2370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',719.46,'999','1','"2370 MEMBER','1','5842') +('6131','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7262.37,'999','0','"6131 MEMBER','1','5843') +('6711','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',100.01,'999','1','"6711 MEMBER','1','5844') +('2235','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2235 MEMBER','1','5845') +('1467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1047.66,'999','0','"1467 MEMBER','1','5846') +('6130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',56.14,'999','1','"6130 MEMBER','1','5847') +('4785','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',344.92,'999','1','"4785 MEMBER','1','5848') +('6536','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',38.36,'999','0','"6536 MEMBER','1','5849') +('4225','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6630.46,'999','0','"4225 MEMBER','1','5850') +('1334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"1334 MEMBER','1','5851') +('1125','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1742.25,'999','1','"1125 MEMBER','1','5852') +('448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"448 MEMBER','1','5853') +('262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"262 MEMBER','1','5854') +('5038','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5038 MEMBER','1','5855') +('6650','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',55.05,'999','1','"6650 MEMBER','1','5856') +('4445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4445 MEMBER','1','5857') +('6135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',66.89,'999','1','"6135 MEMBER','1','5858') +('1615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',35.52,'999','1','"1615 MEMBER','1','5859') +('3190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3190 MEMBER','1','5860') +('6000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6000 MEMBER','1','5861') +('1197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',6281.85,'999','0','"1197 MEMBER','1','5862') +('1577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"1577 MEMBER','1','5863') +('6466','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2097.30,'999','0','"6466 MEMBER','1','5864') +('4177','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',47.29,'999','0','"4177 MEMBER','1','5865') +('6592','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',34.31,'999','1','"6592 MEMBER','1','5866') +('1207','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',186.67,'999','1','"1207 MEMBER','1','5867') +('5650','1','LASTNAME','FIRSTNAME',999.99,25.40,'0',200.00,'1','1','1','REG','0','0','0',681.44,'999','0','"5650 MEMBER','1','5868') +('5031','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5031 MEMBER','1','5869') +('6727','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',45.12,'999','1','"6727 MEMBER','1','5870') +('6281','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2181.51,'999','0','"6281 MEMBER','1','5871') +('31','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6258.71,'999','0','"31 MEMBER','1','5872') +('4039','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1364.43,'999','1','"4039 MEMBER','1','5873') +('276','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"276 MEMBER','1','5874') +('4709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',185.52,'999','0','"4709 MEMBER','1','5875') +('5097','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"5097 MEMBER','1','5876') +('4782','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2199.38,'999','0','"4782 MEMBER','1','5877') +('2623','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2623 MEMBER','1','5878') +('2249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2249 MEMBER','1','5879') +('4749','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',112.77,'999','0','"4749 MEMBER','1','5880') +('6106','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',309.34,'999','0','"6106 MEMBER','1','5881') +('6258','1','LASTNAME','FIRSTNAME',999.99,11.27,'0',20.00,'1','1','1','PC','1','0','0',1798.12,'999','0','"6258 MEMBER','1','5882') +('652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',450.68,'999','1','"652 MEMBER','1','5883') +('1409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1409 MEMBER','1','5884') +('1967','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1066.94,'999','0','"1967 MEMBER','1','5885') +('2826','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',858.19,'999','1','"2826 MEMBER','1','5886') +('4523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',6.38,'999','0','"4523 MEMBER','1','5887') +('4776','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4776 MEMBER','1','5888') +('4533','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1436.71,'999','1','"4533 MEMBER','1','5889') +('196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2628.19,'999','0','"196 MEMBER','1','5890') +('1640','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1640 MEMBER','1','5891') +('3216','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',21.06,'999','1','"3216 MEMBER','1','5892') +('6742','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',234.14,'999','0','"6742 MEMBER','1','5893') +('2538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',677.69,'999','0','"2538 MEMBER','1','5894') +('422','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"422 MEMBER','1','5895') +('6101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2587.96,'999','0','"6101 MEMBER','1','5896') +('4887','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4887 MEMBER','1','5897') +('4782','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2199.38,'999','0','"4782 MEMBER','1','5898') +('5036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5036 MEMBER','1','5899') +('549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1351.42,'999','0','"549 MEMBER','1','5900') +('418','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',84.29,'999','1','"418 MEMBER','1','5901') +('506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',65.43,'999','1','"506 MEMBER','1','5902') +('2830','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',1051.55,'999','0','"2830 MEMBER','1','5903') +('6275','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',150.23,'999','0','"6275 MEMBER','1','5904') +('4510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2746.70,'999','0','"4510 MEMBER','1','5905') +('3171','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3171 MEMBER','1','5906') +('2864','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4381.63,'999','0','"2864 MEMBER','1','5907') +('1407','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2122.60,'999','0','"1407 MEMBER','1','5908') +('4954','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7144.89,'999','0','"4954 MEMBER','1','5909') +('3329','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',75.55,'999','1','"3329 MEMBER','1','5910') +('4081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5807.50,'999','0','"4081 MEMBER','1','5911') +('2584','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1342.71,'999','0','"2584 MEMBER','1','5912') +('6397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1302.94,'999','0','"6397 MEMBER','1','5913') +('454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',864.47,'999','1','"454 MEMBER','1','5914') +('6739','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',71.11,'999','0','"6739 MEMBER','1','5915') +('1623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',124.13,'999','1','"1623 MEMBER','1','5916') +('6374','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3034.77,'999','0','"6374 MEMBER','1','5917') +('4820','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3618.61,'999','0','"4820 MEMBER','1','5918') +('2824','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2824 MEMBER','1','5919') +('6804','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6804 MEMBER','1','5920') +('4471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4471 MEMBER','1','5921') +('6883','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6883 MEMBER','1','5922') +('5146','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1392.99,'999','0','"5146 MEMBER','1','5923') +('1127','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1639.17,'999','1','"1127 MEMBER','1','5924') +('2629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2590.94,'999','0','"2629 MEMBER','1','5925') +('2805','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1291.08,'999','0','"2805 MEMBER','1','5926') +('1474','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5981.85,'999','0','"1474 MEMBER','1','5927') +('6694','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',146.42,'999','1','"6694 MEMBER','1','5928') +('3058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3058 MEMBER','1','5929') +('3210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',130.88,'999','1','"3210 MEMBER','1','5930') +('5055','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5055 MEMBER','1','5931') +('3254','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3254 MEMBER','1','5932') +('6617','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',975.53,'999','0','"6617 MEMBER','1','5933') +('6617','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',975.53,'999','0','"6617 MEMBER','1','5934') +('2757','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','1',1919.28,'999','1','"2757 MEMBER','1','5935') +('5750','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',6822.22,'999','0','"5750 MEMBER','1','5936') +('4765','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4765 MEMBER','1','5937') +('2944','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',621.78,'999','1','"2944 MEMBER','1','5938') +('2694','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2694 MEMBER','1','5939') +('4090','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',345.57,'999','0','"4090 MEMBER','1','5940') +('4392','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4392 MEMBER','1','5941') +('4836','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',558.61,'999','0','"4836 MEMBER','1','5942') +('2841','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',530.04,'999','0','"2841 MEMBER','1','5943') +('4490','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',90.64,'999','0','"4490 MEMBER','1','5944') +('4717','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',255.24,'999','0','"4717 MEMBER','1','5945') +('4548','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',286.03,'999','0','"4548 MEMBER','1','5946') +('6339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',23.80,'999','1','"6339 MEMBER','1','5947') +('5008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5008 MEMBER','1','5948') +('4509','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',528.84,'999','1','"4509 MEMBER','1','5949') +('3000','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3000 MEMBER','1','5950') +('430','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"430 MEMBER','1','5951') +('1817','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',129.42,'999','1','"1817 MEMBER','1','5952') +('6221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1987.40,'999','0','"6221 MEMBER','1','5953') +('1129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1129 MEMBER','1','5954') +('4151','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',685.15,'999','1','"4151 MEMBER','1','5955') +('692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"692 MEMBER','1','5956') +('2527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',45.56,'999','0','"2527 MEMBER','1','5957') +('1556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1556 MEMBER','1','5958') +('890','1','LASTNAME','FIRSTNAME',999.99,17.08,'0',20.00,'1','1','1','PC','1','0','0',787.79,'999','0','"890 MEMBER','1','5959') +('6165','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4632.34,'999','0','"6165 MEMBER','1','5960') +('6186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1499.47,'999','0','"6186 MEMBER','1','5961') +('6333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',566.32,'999','0','"6333 MEMBER','1','5962') +('4566','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1406.98,'999','0','"4566 MEMBER','1','5963') +('4841','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',498.30,'999','0','"4841 MEMBER','1','5964') +('6250','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1876.45,'999','0','"6250 MEMBER','1','5965') +('547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1068.25,'999','1','"547 MEMBER','1','5966') +('1603','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.25,'999','1','"1603 MEMBER','1','5967') +('403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"403 MEMBER','1','5968') +('24','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"24 MEMBER','1','5969') +('6234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',157.63,'999','1','"6234 MEMBER','1','5970') +('4867','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4867 MEMBER','1','5971') +('2477','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2902.07,'999','1','"2477 MEMBER','1','5972') +('4653','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',147.86,'999','1','"4653 MEMBER','1','5973') +('6199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2305.74,'999','0','"6199 MEMBER','1','5974') +('4014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4014 MEMBER','1','5975') +('1115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1115 MEMBER','1','5976') +('4927','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1705.81,'999','1','"4927 MEMBER','1','5977') +('6613','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',89.82,'999','1','"6613 MEMBER','1','5978') +('4646','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4646 MEMBER','1','5979') +('3138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3138 MEMBER','1','5980') +('4677','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1289.16,'999','1','"4677 MEMBER','1','5981') +('452','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2316.83,'999','0','"452 MEMBER','1','5982') +('4747','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',565.94,'999','1','"4747 MEMBER','1','5983') +('987','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',761.26,'999','0','"987 MEMBER','1','5984') +('2830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1051.55,'999','0','"2830 MEMBER','1','5985') +('1208','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1734.85,'999','0','"1208 MEMBER','1','5986') +('3422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3422 MEMBER','1','5987') +('211','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',14.21,'999','1','"211 MEMBER','1','5988') +('6465','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',585.35,'999','1','"6465 MEMBER','1','5989') +('4093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1591.88,'999','0','"4093 MEMBER','1','5990') +('6227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',187.33,'999','1','"6227 MEMBER','1','5991') +('3278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3278 MEMBER','1','5992') +('5005','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5005 MEMBER','1','5993') +('6137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',153.48,'999','1','"6137 MEMBER','1','5994') +('4741','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4741 MEMBER','1','5995') +('4240','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5668.59,'999','1','"4240 MEMBER','1','5996') +('1117','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"1117 MEMBER','1','5997') +('2771','7','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',962.03,'999','0','"2771 MEMBER','1','5998') +('2803','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2803 MEMBER','1','5999') +('4493','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',112.92,'999','0','"4493 MEMBER','1','6000') +('30','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4240.90,'999','1','"30 MEMBER','1','6001') +('1330','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',94.17,'999','0','"1330 MEMBER','1','6002') +('384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"384 MEMBER','1','6003') +('6928','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6928 MEMBER','1','6004') +('1326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',22.80,'999','0','"1326 MEMBER','1','6005') +('2241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2241 MEMBER','1','6006') +('6350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',268.62,'999','1','"6350 MEMBER','1','6007') +('6731','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',29.25,'999','0','"6731 MEMBER','1','6008') +('6727','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',45.12,'999','1','"6727 MEMBER','1','6009') +('5127','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5127 MEMBER','1','6010') +('3025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2853.54,'999','0','"3025 MEMBER','1','6011') +('987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',761.26,'999','0','"987 MEMBER','1','6012') +('893','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"893 MEMBER','1','6013') +('6562','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',781.56,'999','0','"6562 MEMBER','1','6014') +('2862','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',232.61,'999','0','"2862 MEMBER','1','6015') +('367','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"367 MEMBER','1','6016') +('4115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4115 MEMBER','1','6017') +('2809','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1698.59,'999','1','"2809 MEMBER','1','6018') +('27','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',196.69,'999','1','"27 MEMBER','1','6019') +('6233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1119.74,'999','0','"6233 MEMBER','1','6020') +('6381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',1939.86,'999','0','"6381 MEMBER','1','6021') +('106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.11,'999','1','"106 MEMBER','1','6022') +('4692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',483.39,'999','1','"4692 MEMBER','1','6023') +('6467','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',250.67,'999','0','"6467 MEMBER','1','6024') +('1288','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1092.41,'999','0','"1288 MEMBER','1','6025') +('4785','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',344.92,'999','1','"4785 MEMBER','1','6026') +('6339','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',23.80,'999','1','"6339 MEMBER','1','6027') +('1603','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',64.25,'999','1','"1603 MEMBER','1','6028') +('486','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"486 MEMBER','1','6029') +('9048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9048 MEMBER','1','6030') +('4587','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2934.36,'999','0','"4587 MEMBER','1','6031') +('4486','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',924.31,'999','1','"4486 MEMBER','1','6032') +('229','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',7249.90,'999','0','"229 MEMBER','1','6033') +('1467','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1047.66,'999','0','"1467 MEMBER','1','6034') +('572','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"572 MEMBER','1','6035') +('6206','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',541.04,'999','1','"6206 MEMBER','1','6036') +('120','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.54,'999','1','"120 MEMBER','1','6037') +('667','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',17.05,'999','1','"667 MEMBER','1','6038') +('4939','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',12.86,'999','0','"4939 MEMBER','1','6039') +('4616','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',120.13,'999','0','"4616 MEMBER','1','6040') +('249','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',977.07,'999','1','"249 MEMBER','1','6041') +('6188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',71.51,'999','0','"6188 MEMBER','1','6042') +('4675','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',989.60,'999','0','"4675 MEMBER','1','6043') +('409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"409 MEMBER','1','6044') +('333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',789.83,'999','0','"333 MEMBER','1','6045') +('4747','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',565.94,'999','1','"4747 MEMBER','1','6046') +('4387','1','LASTNAME','FIRSTNAME',999.99,5.95,'10',100.00,'1','1','1','PC','3','1','0',2109.83,'999','0','"4387 MEMBER','1','6047') +('1492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',276.81,'999','1','"1492 MEMBER','1','6048') +('6308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',807.43,'999','0','"6308 MEMBER','1','6049') +('6296','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1809.90,'999','0','"6296 MEMBER','1','6050') +('6692','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',566.14,'999','1','"6692 MEMBER','1','6051') +('2946','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',95.00,'999','1','"2946 MEMBER','1','6052') +('4646','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4646 MEMBER','1','6053') +('1521','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4503.13,'999','1','"1521 MEMBER','1','6054') +('4881','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',941.51,'999','0','"4881 MEMBER','1','6055') +('4849','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',4.84,'999','0','"4849 MEMBER','1','6056') +('4262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4262 MEMBER','1','6057') +('4022','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4022 MEMBER','1','6058') +('4181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1862.88,'999','1','"4181 MEMBER','1','6059') +('4196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',179.71,'999','0','"4196 MEMBER','1','6060') +('6825','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6825 MEMBER','1','6061') +('6865','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6865 MEMBER','1','6062') +('1306','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7747.11,'999','0','"1306 MEMBER','1','6063') +('2644','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',740.92,'999','0','"2644 MEMBER','1','6064') +('3106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3106 MEMBER','1','6065') +('6103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',744.87,'999','1','"6103 MEMBER','1','6066') +('2743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"2743 MEMBER','1','6067') +('6147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',510.04,'999','1','"6147 MEMBER','1','6068') +('2894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2894 MEMBER','1','6069') +('435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"435 MEMBER','1','6070') +('314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"314 MEMBER','1','6071') +('4736','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',512.30,'999','1','"4736 MEMBER','1','6072') +('3261','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',629.98,'999','0','"3261 MEMBER','1','6073') +('435','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"435 MEMBER','1','6074') +('4393','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2901.20,'999','0','"4393 MEMBER','1','6075') +('362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"362 MEMBER','1','6076') +('4591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4591 MEMBER','1','6077') +('3373','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',687.17,'999','0','"3373 MEMBER','1','6078') +('4133','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',268.19,'999','1','"4133 MEMBER','1','6079') +('4706','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',504.03,'999','0','"4706 MEMBER','1','6080') +('5088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5088 MEMBER','1','6081') +('2690','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2690 MEMBER','1','6082') +('2555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2555 MEMBER','1','6083') +('2982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1138.38,'999','0','"2982 MEMBER','1','6084') +('3411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1244.36,'999','0','"3411 MEMBER','1','6085') +('4100','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',503.05,'999','1','"4100 MEMBER','1','6086') +('5160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',369.57,'999','0','"5160 MEMBER','1','6087') +('2666','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2666 MEMBER','1','6088') +('9011','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9011 MEMBER','1','6089') +('70','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',377.30,'999','1','"70 MEMBER','1','6090') +('6445','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','INACT','0','0','0',3421.55,'999','0','"6445 MEMBER','1','6091') +('4808','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',630.56,'999','1','"4808 MEMBER','1','6092') +('4813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1043.62,'999','0','"4813 MEMBER','1','6093') +('6356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3.38,'999','0','"6356 MEMBER','1','6094') +('2570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3356.14,'999','0','"2570 MEMBER','1','6095') +('4181','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1862.88,'999','1','"4181 MEMBER','1','6096') +('48','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2240.56,'999','0','"48 MEMBER','1','6097') +('6345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',490.22,'999','0','"6345 MEMBER','1','6098') +('6270','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',208.73,'999','1','"6270 MEMBER','1','6099') +('1425','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3236.27,'999','0','"1425 MEMBER','1','6100') +('50','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',82.08,'999','1','"50 MEMBER','1','6101') +('4656','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',101.25,'999','0','"4656 MEMBER','1','6102') +('6431','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',407.19,'999','1','"6431 MEMBER','1','6103') +('4634','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',283.23,'999','0','"4634 MEMBER','1','6104') +('1291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2667.86,'999','1','"1291 MEMBER','1','6105') +('6270','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',208.73,'999','1','"6270 MEMBER','1','6106') +('4528','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',456.82,'999','1','"4528 MEMBER','1','6107') +('4473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7.42,'999','1','"4473 MEMBER','1','6108') +('482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"482 MEMBER','1','6109') +('5045','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5045 MEMBER','1','6110') +('1244','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1244 MEMBER','1','6111') +('6129','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',355.54,'999','1','"6129 MEMBER','1','6112') +('6388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',785.33,'999','1','"6388 MEMBER','1','6113') +('6220','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',102.68,'999','1','"6220 MEMBER','1','6114') +('5157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',26.79,'999','0','"5157 MEMBER','1','6115') +('1999','2','LASTNAME','FIRSTNAME',999.99,15.44,'10',20.00,'1','0','1','PC','3','1','0',3006.78,'999','0','"1999 MEMBER','1','6116') +('2494','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',563.82,'999','1','"2494 MEMBER','1','6117') +('6533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',2310.27,'999','0','"6533 MEMBER','1','6118') +('4026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',58.10,'999','1','"4026 MEMBER','1','6119') +('2230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1287.46,'999','0','"2230 MEMBER','1','6120') +('541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',352.59,'999','0','"541 MEMBER','1','6121') +('5128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',665.24,'999','0','"5128 MEMBER','1','6122') +('6447','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2053.08,'999','0','"6447 MEMBER','1','6123') +('4108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4108 MEMBER','1','6124') +('6380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1167.14,'999','0','"6380 MEMBER','1','6125') +('72','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"72 MEMBER','1','6126') +('6874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6874 MEMBER','1','6127') +('6898','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6898 MEMBER','1','6128') +('6917','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',NULL,'999','0','"6917 MEMBER','1','6129') +('6930','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6930 MEMBER','1','6130') +('6008','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'0','0','1','TERM','0','0','0',3022.74,'999','0','"6008 MEMBER','1','6131') +('4695','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4695 MEMBER','1','6132') +('9064','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',38.46,'999','0','"9064 MEMBER','1','6133') +('9135','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9135 MEMBER','1','6134') +('5005','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5005 MEMBER','1','6135') +('3295','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"3295 MEMBER','1','6136') +('5021','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5021 MEMBER','1','6137') +('4022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4022 MEMBER','1','6138') +('3106','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3106 MEMBER','1','6139') +('4493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',112.92,'999','0','"4493 MEMBER','1','6140') +('141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1.38,'999','1','"141 MEMBER','1','6141') +('138','2','LASTNAME','FIRSTNAME',999.99,19.18,'0',20.00,'1','1','1','PC','1','0','0',9998.89,'999','0','"138 MEMBER','1','6142') +('1197','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',6281.85,'999','0','"1197 MEMBER','1','6143') +('6337','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4480.02,'999','0','"6337 MEMBER','1','6144') +('6610','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',30.58,'999','0','"6610 MEMBER','1','6145') +('9016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9016 MEMBER','1','6146') +('2245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2245 MEMBER','1','6147') +('5121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3922.45,'999','0','"5121 MEMBER','1','6148') +('1934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',78.01,'999','1','"1934 MEMBER','1','6149') +('6350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',268.62,'999','1','"6350 MEMBER','1','6150') +('1242','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1242 MEMBER','1','6151') +('6221','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1987.40,'999','0','"6221 MEMBER','1','6152') +('6378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',700.26,'999','1','"6378 MEMBER','1','6153') +('4150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',203.45,'999','1','"4150 MEMBER','1','6154') +('128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1234.78,'999','1','"128 MEMBER','1','6155') +('4535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',4.10,'999','0','"4535 MEMBER','1','6156') +('154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',1378.76,'999','0','"154 MEMBER','1','6157') +('15','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1771.57,'999','0','"15 MEMBER','1','6158') +('6293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2139.99,'999','0','"6293 MEMBER','1','6159') +('2440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',150.11,'999','0','"2440 MEMBER','1','6160') +('4379','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2687.99,'999','0','"4379 MEMBER','1','6161') +('3397','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"3397 MEMBER','1','6162') +('4750','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',290.30,'999','0','"4750 MEMBER','1','6163') +('120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.54,'999','1','"120 MEMBER','1','6164') +('6562','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',781.56,'999','0','"6562 MEMBER','1','6165') +('4676','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',157.13,'999','1','"4676 MEMBER','1','6166') +('572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"572 MEMBER','1','6167') +('6484','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',155.94,'999','0','"6484 MEMBER','1','6168') +('6460','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',510.44,'999','1','"6460 MEMBER','1','6169') +('422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"422 MEMBER','1','6170') +('6770','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',225.77,'999','1','"6770 MEMBER','1','6171') +('2675','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2675 MEMBER','1','6172') +('1439','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',489.43,'999','1','"1439 MEMBER','1','6173') +('140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1818.63,'999','1','"140 MEMBER','1','6174') +('3087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3488.18,'999','0','"3087 MEMBER','1','6175') +('3118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',396.62,'999','1','"3118 MEMBER','1','6176') +('89','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8.05,'999','1','"89 MEMBER','1','6177') +('2263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2263 MEMBER','1','6178') +('2973','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2973 MEMBER','1','6179') +('4245','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4245 MEMBER','1','6180') +('219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',201.35,'999','1','"219 MEMBER','1','6181') +('4544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2.99,'999','0','"4544 MEMBER','1','6182') +('4005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4005 MEMBER','1','6183') +('3206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3206 MEMBER','1','6184') +('4149','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1042.72,'999','0','"4149 MEMBER','1','6185') +('6186','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1499.47,'999','0','"6186 MEMBER','1','6186') +('6305','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',645.29,'999','1','"6305 MEMBER','1','6187') +('862','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.50,'999','0','"862 MEMBER','1','6188') +('6744','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',211.80,'999','0','"6744 MEMBER','1','6189') +('2265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',130.53,'999','1','"2265 MEMBER','1','6190') +('6410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1145.07,'999','0','"6410 MEMBER','1','6191') +('9085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9085 MEMBER','1','6192') +('4128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4128 MEMBER','1','6193') +('4835','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',585.11,'999','0','"4835 MEMBER','1','6194') +('139','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2826.39,'999','0','"139 MEMBER','1','6195') +('4825','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',22.19,'999','0','"4825 MEMBER','1','6196') +('4485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5894.72,'999','0','"4485 MEMBER','1','6197') +('6385','1','LASTNAME','FIRSTNAME',999.99,16.07,'0',20.00,'1','1','1','PC','1','0','0',893.54,'999','0','"6385 MEMBER','1','6198') +('3110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',778.65,'999','0','"3110 MEMBER','1','6200') +('6735','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',53.75,'999','1','"6735 MEMBER','1','6201') +('1501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',99.82,'999','1','"1501 MEMBER','1','6202') +('2674','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',605.77,'999','0','"2674 MEMBER','1','6203') +('4479','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4479 MEMBER','1','6204') +('8706','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8706 MEMBER','1','6205') +('5002','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5002 MEMBER','1','6206') +('862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.50,'999','0','"862 MEMBER','1','6207') +('4479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4479 MEMBER','1','6208') +('4243','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4243 MEMBER','1','6209') +('6091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6091 MEMBER','1','6210') +('2225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2225 MEMBER','1','6211') +('6797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9.37,'999','0','"6797 MEMBER','1','6212') +('6','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',782.64,'999','0','"6 MEMBER','1','6213') +('2769','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',188.95,'999','1','"2769 MEMBER','1','6214') +('2409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','0','INACT','0','0','0',11768.29,'999','0','"2409 MEMBER','1','6215') +('4607','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2562.89,'999','0','"4607 MEMBER','1','6216') +('6403','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',425.13,'999','1','"6403 MEMBER','1','6217') +('4626','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',5.04,'999','0','"4626 MEMBER','1','6218') +('77','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4379.98,'999','0','"77 MEMBER','1','6219') +('4159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',226.98,'999','1','"4159 MEMBER','1','6220') +('4286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3825.44,'999','1','"4286 MEMBER','1','6221') +('6234','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',157.63,'999','1','"6234 MEMBER','1','6222') +('1298','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',168.64,'999','0','"1298 MEMBER','1','6223') +('4651','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4651 MEMBER','1','6224') +('6477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',198.24,'999','0','"6477 MEMBER','1','6225') +('196','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2628.19,'999','0','"196 MEMBER','1','6226') +('6446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',45.25,'999','0','"6446 MEMBER','1','6227') +('154','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1378.76,'999','0','"154 MEMBER','1','6228') +('4882','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4882 MEMBER','1','6229') +('6709','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',441.50,'999','0','"6709 MEMBER','1','6230') +('6146','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',318.47,'999','0','"6146 MEMBER','1','6231') +('5159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',516.50,'999','0','"5159 MEMBER','1','6232') +('100','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',343.18,'999','1','"100 MEMBER','1','6233') +('6172','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',92.10,'999','0','"6172 MEMBER','1','6234') +('1184','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1954.39,'999','0','"1184 MEMBER','1','6235') +('2666','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2666 MEMBER','1','6236') +('6760','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',15.28,'999','1','"6760 MEMBER','1','6237') +('6714','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',124.17,'999','0','"6714 MEMBER','1','6238') +('2625','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1285.34,'999','0','"2625 MEMBER','1','6239') +('6454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',658.79,'999','0','"6454 MEMBER','1','6240') +('4013','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4013 MEMBER','1','6241') +('2730','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4780.56,'999','0','"2730 MEMBER','1','6242') +('4499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',158.85,'999','1','"4499 MEMBER','1','6243') +('4763','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1035.29,'999','0','"4763 MEMBER','1','6244') +('4776','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4776 MEMBER','1','6245') +('252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',71.29,'999','0','"252 MEMBER','1','6246') +('498','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',360.97,'999','1','"498 MEMBER','1','6247') +('6499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1047.81,'999','0','"6499 MEMBER','1','6248') +('4435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1297.49,'999','0','"4435 MEMBER','1','6249') +('3397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3397 MEMBER','1','6250') +('6467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',250.67,'999','0','"6467 MEMBER','1','6251') +('2321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2321 MEMBER','1','6252') +('5156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',280.54,'999','0','"5156 MEMBER','1','6253') +('6456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',427.83,'999','1','"6456 MEMBER','1','6254') +('4623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10.48,'999','1','"4623 MEMBER','1','6255') +('2797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1055.36,'999','1','"2797 MEMBER','1','6256') +('9089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9089 MEMBER','1','6257') +('501','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2563.65,'999','1','"501 MEMBER','1','6258') +('6520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',25.15,'999','1','"6520 MEMBER','1','6259') +('6398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1049.50,'999','1','"6398 MEMBER','1','6260') +('487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"487 MEMBER','1','6261') +('6473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',586.24,'999','1','"6473 MEMBER','1','6262') +('5054','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5054 MEMBER','1','6263') +('2131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2131 MEMBER','1','6264') +('1755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1755 MEMBER','1','6265') +('1360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',974.40,'999','1','"1360 MEMBER','1','6266') +('3083','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1830.34,'999','1','"3083 MEMBER','1','6267') +('1402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3348.03,'999','0','"1402 MEMBER','1','6268') +('6416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1081.97,'999','0','"6416 MEMBER','1','6269') +('6490','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',518.88,'999','0','"6490 MEMBER','1','6270') +('4032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4032 MEMBER','1','6271') +('1286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',295.54,'999','1','"1286 MEMBER','1','6272') +('276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"276 MEMBER','1','6273') +('103','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4074.53,'999','0','"103 MEMBER','1','6274') +('8997','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8997 MEMBER','1','6275') +('4028','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4028 MEMBER','1','6276') +('4343','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4343 MEMBER','1','6277') +('7206','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7206 MEMBER','1','6278') +('2837','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',100.53,'999','1','"2837 MEMBER','1','6279') +('10492','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10492 MEMBER','1','6280') +('1439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',489.43,'999','1','"1439 MEMBER','1','6281') +('62','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1025.02,'999','0','"62 MEMBER','1','6282') +('9008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9008 MEMBER','1','6283') +('2317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2317 MEMBER','1','6284') +('1070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1070 MEMBER','1','6285') +('1070','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1070 MEMBER','1','6286') +('5050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',60.96,'999','0','"5050 MEMBER','1','6287') +('1042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',439.47,'999','0','"1042 MEMBER','1','6288') +('6330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6135.33,'999','0','"6330 MEMBER','1','6289') +('4709','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',185.52,'999','0','"4709 MEMBER','1','6290') +('2886','2','LASTNAME','FIRSTNAME',999.99,'-3.45','0',20.00,'1','0','1','PC','1','0','0',1516.95,'999','0','"2886 MEMBER','1','6291') +('4785','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',344.92,'999','1','"4785 MEMBER','1','6292') +('99','1','LASTNAME','FIRSTNAME',999.99,3.35,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"99 MEMBER','1','6293') +('6011','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',95.37,'999','0','"6011 MEMBER','1','6294') +('2738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2738 MEMBER','1','6295') +('375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4545.74,'999','0','"375 MEMBER','1','6296') +('1091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',123.22,'999','1','"1091 MEMBER','1','6297') +('1135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1135 MEMBER','1','6298') +('6541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',266.70,'999','1','"6541 MEMBER','1','6299') +('6669','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',98.47,'999','1','"6669 MEMBER','1','6300') +('4877','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3042.56,'999','0','"4877 MEMBER','1','6301') +('139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2826.39,'999','0','"139 MEMBER','1','6302') +('4676','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',157.13,'999','1','"4676 MEMBER','1','6303') +('1945','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',56.20,'999','1','"1945 MEMBER','1','6304') +('31','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6258.71,'999','0','"31 MEMBER','1','6305') +('4561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4561 MEMBER','1','6306') +('6213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',160.87,'999','0','"6213 MEMBER','1','6307') +('4626','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',5.04,'999','0','"4626 MEMBER','1','6308') +('6641','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',67.40,'999','0','"6641 MEMBER','1','6309') +('4913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',996.58,'999','0','"4913 MEMBER','1','6310') +('1521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4503.13,'999','1','"1521 MEMBER','1','6311') +('1431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3.21,'999','1','"1431 MEMBER','1','6312') +('4515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4821.37,'999','0','"4515 MEMBER','1','6313') +('6448','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',353.56,'999','0','"6448 MEMBER','1','6314') +('2728','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2728 MEMBER','1','6315') +('6571','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',562.17,'999','1','"6571 MEMBER','1','6316') +('6772','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',167.82,'999','1','"6772 MEMBER','1','6317') +('65','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"65 MEMBER','1','6318') +('6362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',671.03,'999','1','"6362 MEMBER','1','6319') +('3394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',313.02,'999','1','"3394 MEMBER','1','6320') +('6482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',961.53,'999','0','"6482 MEMBER','1','6321') +('1982','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5333.00,'999','0','"1982 MEMBER','1','6322') +('6679','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',106.27,'999','1','"6679 MEMBER','1','6323') +('6232','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1941.39,'999','0','"6232 MEMBER','1','6324') +('6270','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',208.73,'999','1','"6270 MEMBER','1','6325') +('1845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',965.70,'999','0','"1845 MEMBER','1','6326') +('4789','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2588.55,'999','0','"4789 MEMBER','1','6327') +('6662','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',147.43,'999','0','"6662 MEMBER','1','6328') +('6457','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',405.07,'999','0','"6457 MEMBER','1','6329') +('416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',810.79,'999','1','"416 MEMBER','1','6330') +('4361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',534.57,'999','0','"4361 MEMBER','1','6331') +('5022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5022 MEMBER','1','6332') +('523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',179.76,'999','1','"523 MEMBER','1','6333') +('3186','1','LASTNAME','FIRSTNAME',999.99,36.84,'10',125.00,'1','1','1','PC','3','1','0',3366.76,'999','0','"3186 MEMBER','1','6334') +('5123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5123 MEMBER','1','6335') +('6505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',123.90,'999','0','"6505 MEMBER','1','6336') +('2405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',28.09,'999','1','"2405 MEMBER','1','6337') +('4986','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3120.36,'999','0','"4986 MEMBER','1','6338') +('6359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',844.96,'999','1','"6359 MEMBER','1','6339') +('6839','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6839 MEMBER','1','6340') +('6469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1137.21,'999','0','"6469 MEMBER','1','6341') +('6698','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',99.55,'999','0','"6698 MEMBER','1','6342') +('6851','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6851 MEMBER','1','6343') +('159','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1225.25,'999','1','"159 MEMBER','1','6344') +('3356','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3356 MEMBER','1','6345') +('2191','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2191 MEMBER','1','6346') +('4836','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',558.61,'999','0','"4836 MEMBER','1','6347') +('3340','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1006.50,'999','1','"3340 MEMBER','1','6348') +('2990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',255.23,'999','0','"2990 MEMBER','1','6349') +('9046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9046 MEMBER','1','6350') +('6010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',774.80,'999','0','"6010 MEMBER','1','6351') +('5054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5054 MEMBER','1','6352') +('3338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2757.07,'999','0','"3338 MEMBER','1','6353') +('1048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1048 MEMBER','1','6354') +('3094','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',411.54,'999','0','"3094 MEMBER','1','6355') +('4009','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2743.67,'999','0','"4009 MEMBER','1','6356') +('151','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1266.83,'999','0','"151 MEMBER','1','6357') +('2769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',188.95,'999','1','"2769 MEMBER','1','6358') +('15','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1771.57,'999','0','"15 MEMBER','1','6359') +('4877','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3042.56,'999','0','"4877 MEMBER','1','6360') +('70','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',377.30,'999','1','"70 MEMBER','1','6361') +('4145','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',716.24,'999','0','"4145 MEMBER','1','6362') +('6496','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1056.12,'999','0','"6496 MEMBER','1','6363') +('6496','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1056.12,'999','0','"6496 MEMBER','1','6364') +('1407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2122.60,'999','0','"1407 MEMBER','1','6365') +('2675','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2675 MEMBER','1','6366') +('6748','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',264.27,'999','0','"6748 MEMBER','1','6367') +('4761','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',786.23,'999','1','"4761 MEMBER','1','6368') +('4787','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1008.88,'999','0','"4787 MEMBER','1','6369') +('296','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"296 MEMBER','1','6370') +('468','1','LASTNAME','FIRSTNAME',999.99,7.45,'0',20.00,'1','1','1','PC','1','0','0',664.36,'999','0','"468 MEMBER','1','6371') +('2444','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2444 MEMBER','1','6372') +('3159','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3159 MEMBER','1','6373') +('6590','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',135.80,'999','1','"6590 MEMBER','1','6374') +('4661','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',60.13,'999','1','"4661 MEMBER','1','6375') +('3052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',716.34,'999','0','"3052 MEMBER','1','6376') +('6649','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',445.02,'999','1','"6649 MEMBER','1','6377') +('3050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1226.28,'999','1','"3050 MEMBER','1','6378') +('4824','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1326.39,'999','1','"4824 MEMBER','1','6379') +('4869','5','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1019.54,'999','0','"4869 MEMBER','1','6380') +('1036','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1488.69,'999','0','"1036 MEMBER','1','6381') +('2874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2874 MEMBER','1','6382') +('6742','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',234.14,'999','0','"6742 MEMBER','1','6383') +('9083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9083 MEMBER','1','6384') +('1244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1244 MEMBER','1','6385') +('2421','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2421 MEMBER','1','6386') +('6438','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',130.68,'999','0','"6438 MEMBER','1','6387') +('2446','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2446 MEMBER','1','6388') +('2720','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1833.32,'999','0','"2720 MEMBER','1','6389') +('6642','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',585.84,'999','1','"6642 MEMBER','1','6390') +('6314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2475.40,'999','0','"6314 MEMBER','1','6391') +('3230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1498.43,'999','0','"3230 MEMBER','1','6392') +('77','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4379.98,'999','0','"77 MEMBER','1','6393') +('3075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3075 MEMBER','1','6394') +('4286','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3825.44,'999','1','"4286 MEMBER','1','6395') +('439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"439 MEMBER','1','6396') +('4465','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.51,'999','1','"4465 MEMBER','1','6397') +('4394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4394 MEMBER','1','6398') +('4442','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',1590.40,'999','0','"4442 MEMBER','1','6399') +('3177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',5373.11,'999','0','"3177 MEMBER','1','6400') +('6225','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',21.15,'999','1','"6225 MEMBER','1','6401') +('9090','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"9090 MEMBER','1','6402') +('607','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',985.98,'999','0','"607 MEMBER','1','6403') +('1082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1082 MEMBER','1','6404') +('4465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.51,'999','1','"4465 MEMBER','1','6405') +('5009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5009 MEMBER','1','6406') +('5119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5119 MEMBER','1','6407') +('4936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3213.12,'999','0','"4936 MEMBER','1','6408') +('1220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1220 MEMBER','1','6409') +('583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',133.75,'999','1','"583 MEMBER','1','6410') +('4960','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1679.73,'999','0','"4960 MEMBER','1','6411') +('977','1','LASTNAME','FIRSTNAME',999.99,15.48,'0',20.00,'1','1','1','PC','1','0','0',8764.34,'999','0','"977 MEMBER','1','6412') +('6290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',238.09,'999','0','"6290 MEMBER','1','6413') +('2969','1','LASTNAME','FIRSTNAME',999.99,17.94,'0',20.00,'1','1','1','PC','1','0','0',4716.44,'999','0','"2969 MEMBER','1','6414') +('5072','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5072 MEMBER','1','6415') +('1050','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',327.86,'999','1','"1050 MEMBER','1','6416') +('4592','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"4592 MEMBER','1','6417') +('4073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',4419.91,'999','1','"4073 MEMBER','1','6418') +('6572','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',322.93,'999','1','"6572 MEMBER','1','6419') +('3052','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',716.34,'999','0','"3052 MEMBER','1','6420') +('2570','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3356.14,'999','0','"2570 MEMBER','1','6421') +('3295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3295 MEMBER','1','6422') +('5002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5002 MEMBER','1','6423') +('1784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',203.07,'999','1','"1784 MEMBER','1','6424') +('3102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',505.35,'999','0','"3102 MEMBER','1','6425') +('1898','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2260.03,'999','0','"1898 MEMBER','1','6426') +('5105','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5105 MEMBER','1','6427') +('4552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',255.44,'999','0','"4552 MEMBER','1','6428') +('4093','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1591.88,'999','0','"4093 MEMBER','1','6429') +('6156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',82.35,'999','1','"6156 MEMBER','1','6430') +('6660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',433.16,'999','1','"6660 MEMBER','1','6431') +('80','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',530.01,'999','0','"80 MEMBER','1','6432') +('335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.70,'999','1','"335 MEMBER','1','6433') +('138','1','LASTNAME','FIRSTNAME',999.99,19.18,'0',20.00,'1','1','1','PC','1','0','0',9998.89,'999','0','"138 MEMBER','1','6434') +('348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"348 MEMBER','1','6435') +('4418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.12,'999','1','"4418 MEMBER','1','6436') +('6482','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',961.53,'999','0','"6482 MEMBER','1','6437') +('57','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1440.10,'999','0','"57 MEMBER','1','6438') +('3140','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"3140 MEMBER','1','6439') +('260','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8.41,'999','1','"260 MEMBER','1','6440') +('1154','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1567.78,'999','0','"1154 MEMBER','1','6441') +('1806','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1806 MEMBER','1','6442') +('8646','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8646 MEMBER','1','6443') +('1188','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"1188 MEMBER','1','6444') +('6250','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1876.45,'999','0','"6250 MEMBER','1','6445') +('1268','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',8.67,'999','0','"1268 MEMBER','1','6446') +('1336','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1336 MEMBER','1','6447') +('4476','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',320.16,'999','0','"4476 MEMBER','1','6448') +('4301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4301 MEMBER','1','6449') +('1291','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2667.86,'999','1','"1291 MEMBER','1','6450') +('3161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3161 MEMBER','1','6451') +('430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"430 MEMBER','1','6452') +('4309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.44,'999','1','"4309 MEMBER','1','6453') +('407','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4193.19,'999','0','"407 MEMBER','1','6454') +('2658','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9105.69,'999','0','"2658 MEMBER','1','6455') +('182','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1356.60,'999','0','"182 MEMBER','1','6456') +('10350','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10350 MEMBER','1','6457') +('6687','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',83.86,'999','0','"6687 MEMBER','1','6458') +('3325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1491.31,'999','1','"3325 MEMBER','1','6459') +('6333','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',566.32,'999','0','"6333 MEMBER','1','6460') +('6002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',295.88,'999','0','"6002 MEMBER','1','6461') +('6393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',538.34,'999','1','"6393 MEMBER','1','6462') +('4537','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2068.09,'999','0','"4537 MEMBER','1','6463') +('4212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',110.90,'999','1','"4212 MEMBER','1','6464') +('6398','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1049.50,'999','1','"6398 MEMBER','1','6465') +('617','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',273.61,'999','0','"617 MEMBER','1','6466') +('347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"347 MEMBER','1','6467') +('6743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',80.17,'999','0','"6743 MEMBER','1','6468') +('2734','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2734 MEMBER','1','6469') +('2648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"2648 MEMBER','1','6470') +('6775','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.32,'999','1','"6775 MEMBER','1','6471') +('2826','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',858.19,'999','1','"2826 MEMBER','1','6472') +('5068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5068 MEMBER','1','6473') +('4867','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4867 MEMBER','1','6474') +('2572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2572 MEMBER','1','6475') +('233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"233 MEMBER','1','6476') +('4124','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"4124 MEMBER','1','6477') +('13','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',164.33,'999','1','"13 MEMBER','1','6478') +('4601','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4601 MEMBER','1','6479') +('1392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"1392 MEMBER','1','6480') +('2292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',82.90,'999','1','"2292 MEMBER','1','6481') +('6332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2367.50,'999','0','"6332 MEMBER','1','6482') +('305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"305 MEMBER','1','6483') +('9071','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"9071 MEMBER','1','6484') +('457','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3039.84,'999','0','"457 MEMBER','1','6485') +('4554','2','LASTNAME','FIRSTNAME',999.99,0.28,'0',20.00,'1','1','1','PC','1','0','0',4801.81,'999','0','"4554 MEMBER','1','6486') +('3321','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',235.28,'999','1','"3321 MEMBER','1','6487') +('3058','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3058 MEMBER','1','6488') +('1042','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',439.47,'999','0','"1042 MEMBER','1','6489') +('6617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',975.53,'999','0','"6617 MEMBER','1','6490') +('146','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1561.98,'999','0','"146 MEMBER','1','6491') +('2934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',647.28,'999','0','"2934 MEMBER','1','6492') +('4454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4454 MEMBER','1','6493') +('4236','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1320.49,'999','1','"4236 MEMBER','1','6494') +('96','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"96 MEMBER','1','6495') +('2098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2098 MEMBER','1','6496') +('365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"365 MEMBER','1','6497') +('5014','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5014 MEMBER','1','6498') +('6629','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',166.88,'999','0','"6629 MEMBER','1','6499') +('4182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4182 MEMBER','1','6500') +('4929','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1177.48,'999','0','"4929 MEMBER','1','6501') +('4356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4356 MEMBER','1','6502') +('6665','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',44.54,'999','1','"6665 MEMBER','1','6503') +('314','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','TERM','0','0','0',0.00,'999','0','"314 MEMBER','1','6504') +('6407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',674.32,'999','0','"6407 MEMBER','1','6505') +('6281','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2181.51,'999','0','"6281 MEMBER','1','6506') +('6403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',425.13,'999','1','"6403 MEMBER','1','6507') +('4754','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',787.41,'999','0','"4754 MEMBER','1','6508') +('2892','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',244.07,'999','0','"2892 MEMBER','1','6509') +('1423','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1225.53,'999','0','"1423 MEMBER','1','6510') +('4882','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4882 MEMBER','1','6511') +('2822','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',480.03,'999','1','"2822 MEMBER','1','6512') +('4424','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1261.35,'999','0','"4424 MEMBER','1','6513') +('2507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2507 MEMBER','1','6514') +('4164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1481.63,'999','0','"4164 MEMBER','1','6515') +('6629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',166.88,'999','0','"6629 MEMBER','1','6516') +('9037','1','LASTNAME','FIRSTNAME',999.99,185.62,'0',0.00,'1','1','1','TERM','0','0','0',446.25,'999','0','"9037 MEMBER','1','6517') +('195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"195 MEMBER','1','6518') +('5110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5110 MEMBER','1','6519') +('4930','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',3989.75,'999','0','"4930 MEMBER','1','6520') +('6177','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',15.15,'999','0','"6177 MEMBER','1','6521') +('4654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',338.73,'999','1','"4654 MEMBER','1','6522') +('1586','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"1586 MEMBER','1','6523') +('1958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2853.62,'999','1','"1958 MEMBER','1','6524') +('6209','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2605.88,'999','0','"6209 MEMBER','1','6525') +('6492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1724.38,'999','0','"6492 MEMBER','1','6526') +('1793','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',44.99,'999','1','"1793 MEMBER','1','6527') +('132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7556.40,'999','0','"132 MEMBER','1','6528') +('4909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.90,'999','1','"4909 MEMBER','1','6529') +('1823','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1823 MEMBER','1','6530') +('375','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4545.74,'999','0','"375 MEMBER','1','6531') +('4792','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',317.49,'999','1','"4792 MEMBER','1','6532') +('4562','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2274.87,'999','0','"4562 MEMBER','1','6533') +('4276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4276 MEMBER','1','6534') +('6662','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',147.43,'999','0','"6662 MEMBER','1','6535') +('452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2316.83,'999','0','"452 MEMBER','1','6536') +('121','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"121 MEMBER','1','6537') +('4066','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"4066 MEMBER','1','6538') +('6144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',1323.19,'999','0','"6144 MEMBER','1','6539') +('6575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',369.00,'999','1','"6575 MEMBER','1','6540') +('6206','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',541.04,'999','1','"6206 MEMBER','1','6541') +('4417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',42.29,'999','1','"4417 MEMBER','1','6542') +('4783','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',938.43,'999','0','"4783 MEMBER','1','6543') +('4856','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1119.47,'999','0','"4856 MEMBER','1','6544') +('61','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',437.16,'999','0','"61 MEMBER','1','6545') +('6240','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1748.47,'999','0','"6240 MEMBER','1','6546') +('1343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',80.89,'999','0','"1343 MEMBER','1','6547') +('4270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4920.65,'999','0','"4270 MEMBER','1','6548') +('1336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1336 MEMBER','1','6549') +('2386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',580.79,'999','0','"2386 MEMBER','1','6550') +('2907','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2907 MEMBER','1','6551') +('4678','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',234.80,'999','0','"4678 MEMBER','1','6552') +('6377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',60.25,'999','1','"6377 MEMBER','1','6553') +('6452','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2606.79,'999','1','"6452 MEMBER','1','6554') +('1182','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"1182 MEMBER','1','6555') +('10032','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10032 MEMBER','1','6556') +('10034','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10034 MEMBER','1','6557') +('10361','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10361 MEMBER','1','6558') +('8961','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8961 MEMBER','1','6559') +('10036','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10036 MEMBER','1','6560') +('10037','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10037 MEMBER','1','6561') +('10037','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10037 MEMBER','1','6562') +('10037','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10037 MEMBER','1','6563') +('10040','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10040 MEMBER','1','6564') +('110','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"110 MEMBER','1','6565') +('7719','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7719 MEMBER','1','6566') +('10041','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10041 MEMBER','1','6567') +('10042','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10042 MEMBER','1','6568') +('10042','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10042 MEMBER','1','6569') +('161','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"161 MEMBER','1','6570') +('6470','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6470 MEMBER','1','6571') +('4219','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4219 MEMBER','1','6572') +('10011','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10011 MEMBER','1','6573') +('10046','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10046 MEMBER','1','6574') +('10046','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10046 MEMBER','1','6575') +('10047','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10047 MEMBER','1','6576') +('10047','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10047 MEMBER','1','6577') +('10048','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10048 MEMBER','1','6578') +('10049','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10049 MEMBER','1','6579') +('10050','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10050 MEMBER','1','6580') +('10050','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10050 MEMBER','1','6581') +('10050','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10050 MEMBER','1','6582') +('10054','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10054 MEMBER','1','6583') +('10055','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10055 MEMBER','1','6584') +('10056','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10056 MEMBER','1','6585') +('6360','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6360 MEMBER','1','6586') +('10087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10087 MEMBER','1','6587') +('10089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10089 MEMBER','1','6588') +('10090','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10090 MEMBER','1','6589') +('10091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10091 MEMBER','1','6590') +('10092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10092 MEMBER','1','6591') +('10093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10093 MEMBER','1','6592') +('10094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10094 MEMBER','1','6593') +('10095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10095 MEMBER','1','6594') +('10096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10096 MEMBER','1','6595') +('10097','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10097 MEMBER','1','6596') +('10098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10098 MEMBER','1','6597') +('10099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10099 MEMBER','1','6598') +('10100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10100 MEMBER','1','6599') +('10101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10101 MEMBER','1','6600') +('10102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10102 MEMBER','1','6601') +('10103','1','LASTNAME','FIRSTNAME',999.99,4.35,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10103 MEMBER','1','6602') +('10104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10104 MEMBER','1','6603') +('10105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10105 MEMBER','1','6604') +('10106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10106 MEMBER','1','6605') +('10107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10107 MEMBER','1','6606') +('10108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10108 MEMBER','1','6607') +('10109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10109 MEMBER','1','6608') +('10110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10110 MEMBER','1','6609') +('10111','1','LASTNAME','FIRSTNAME',999.99,18.88,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"10111 MEMBER','1','6610') +('10112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10112 MEMBER','1','6611') +('10113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10113 MEMBER','1','6612') +('10114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10114 MEMBER','1','6613') +('10115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10115 MEMBER','1','6614') +('10116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10116 MEMBER','1','6615') +('10117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"10117 MEMBER','1','6616') +('10118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10118 MEMBER','1','6617') +('10119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10119 MEMBER','1','6618') +('10120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10120 MEMBER','1','6619') +('10121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10121 MEMBER','1','6620') +('10122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10122 MEMBER','1','6621') +('10123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10123 MEMBER','1','6622') +('10124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10124 MEMBER','1','6623') +('10125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10125 MEMBER','1','6624') +('10126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10126 MEMBER','1','6625') +('8989','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8989 MEMBER','1','6626') +('1437','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2500.06,'999','0','"1437 MEMBER','1','6627') +('9259','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9259 MEMBER','1','6628') +('3321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',235.28,'999','1','"3321 MEMBER','1','6629') +('6116','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',157.81,'999','0','"6116 MEMBER','1','6630') +('6577','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',995.21,'999','0','"6577 MEMBER','1','6631') +('317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1.89,'999','1','"317 MEMBER','1','6632') +('6577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',995.21,'999','0','"6577 MEMBER','1','6633') +('32','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6440.66,'999','0','"32 MEMBER','1','6634') +('4749','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',112.77,'999','0','"4749 MEMBER','1','6635') +('6694','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',146.42,'999','1','"6694 MEMBER','1','6636') +('454','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',864.47,'999','1','"454 MEMBER','1','6637') +('6840','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6840 MEMBER','1','6638') +('6162','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1593.02,'999','0','"6162 MEMBER','1','6639') +('2187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',343.27,'999','1','"2187 MEMBER','1','6640') +('3183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3177.55,'999','0','"3183 MEMBER','1','6641') +('1577','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"1577 MEMBER','1','6642') +('184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',2792.31,'999','1','"184 MEMBER','1','6643') +('4074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',631.68,'999','0','"4074 MEMBER','1','6644') +('6245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',8205.37,'999','0','"6245 MEMBER','1','6645') +('3254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"3254 MEMBER','1','6646') +('4958','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',32.03,'999','1','"4958 MEMBER','1','6647') +('5076','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5076 MEMBER','1','6648') +('4632','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1329.94,'999','0','"4632 MEMBER','1','6649') +('6256','1','LASTNAME','FIRSTNAME',999.99,3.24,'0',20.00,'1','1','1','PC','1','0','0',476.28,'999','1','"6256 MEMBER','1','6650') +('6283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',245.36,'999','1','"6283 MEMBER','1','6651') +('2621','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',135.93,'999','1','"2621 MEMBER','1','6652') +('6382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',25.60,'999','0','"6382 MEMBER','1','6653') +('4363','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',593.85,'999','1','"4363 MEMBER','1','6654') +('3284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2948.72,'999','1','"3284 MEMBER','1','6655') +('5088','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5088 MEMBER','1','6656') +('6272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6272 MEMBER','1','6657') +('4542','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',4741.76,'999','0','"4542 MEMBER','1','6658') +('4913','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',996.58,'999','0','"4913 MEMBER','1','6659') +('257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"257 MEMBER','1','6660') +('6709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',441.50,'999','0','"6709 MEMBER','1','6661') +('390','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"390 MEMBER','1','6662') +('5069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5069 MEMBER','1','6663') +('194','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',22.13,'999','0','"194 MEMBER','1','6664') +('2257','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2257 MEMBER','1','6665') +('75','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8901.37,'999','0','"75 MEMBER','1','6666') +('6758','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',352.95,'999','0','"6758 MEMBER','1','6667') +('4915','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',96.98,'999','1','"4915 MEMBER','1','6668') +('4183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4183 MEMBER','1','6669') +('6461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',995.72,'999','0','"6461 MEMBER','1','6670') +('660','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4016.30,'999','0','"660 MEMBER','1','6671') +('2591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"2591 MEMBER','1','6672') +('2466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',598.13,'999','0','"2466 MEMBER','1','6673') +('4756','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"4756 MEMBER','1','6674') +('367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"367 MEMBER','1','6675') +('1300','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1300 MEMBER','1','6676') +('6674','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',276.36,'999','1','"6674 MEMBER','1','6677') +('2268','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',5499.94,'999','0','"2268 MEMBER','1','6678') +('1398','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1622.13,'999','0','"1398 MEMBER','1','6679') +('4456','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"4456 MEMBER','1','6680') +('4800','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',630.68,'999','0','"4800 MEMBER','1','6681') +('4378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',245.72,'999','0','"4378 MEMBER','1','6682') +('461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"461 MEMBER','1','6683') +('5162','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',375.02,'999','0','"5162 MEMBER','1','6684') +('667','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',17.05,'999','1','"667 MEMBER','1','6685') +('3250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1391.85,'999','0','"3250 MEMBER','1','6686') +('4076','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3345.02,'999','0','"4076 MEMBER','1','6687') +('4437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1357.52,'999','0','"4437 MEMBER','1','6688') +('147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',51.26,'999','1','"147 MEMBER','1','6689') +('4144','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4144 MEMBER','1','6690') +('1742','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"1742 MEMBER','1','6691') +('5041','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',65.04,'999','0','"5041 MEMBER','1','6692') +('4280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1927.21,'999','0','"4280 MEMBER','1','6693') +('3014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3014 MEMBER','1','6694') +('4275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4275 MEMBER','1','6695') +('11','1','LASTNAME','FIRSTNAME',999.99,'-200.19','0','-999999.00','0','1','1','REG','0','0','0',1914526.04,'999','0','"11 MEMBER','1','6696') +('437','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',10328.36,'999','0','"437 MEMBER','1','6697') +('4330','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"4330 MEMBER','1','6698') +('8389','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8389 MEMBER','1','6699') +('6116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',157.81,'999','0','"6116 MEMBER','1','6700') +('1453','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',6.10,'999','1','"1453 MEMBER','1','6701') +('130','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1979.64,'999','1','"130 MEMBER','1','6702') +('510','2','LASTNAME','FIRSTNAME',999.99,7.24,'0',20.00,'1','0','1','PC','1','0','0',4652.69,'999','0','"510 MEMBER','1','6703') +('6603','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',108.01,'999','0','"6603 MEMBER','1','6704') +('6103','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',744.87,'999','1','"6103 MEMBER','1','6705') +('535','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"535 MEMBER','1','6706') +('2091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"2091 MEMBER','1','6707') +('4392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4392 MEMBER','1','6708') +('6057','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,NULL,'"6057 MEMBER','1','6709') +('6119','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1764.70,'999','0','"6119 MEMBER','1','6710') +('2184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',42.00,'999','1','"2184 MEMBER','1','6711') +('4040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4040 MEMBER','1','6712') +('334','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"334 MEMBER','1','6713') +('6409','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',564.84,'999','0','"6409 MEMBER','1','6714') +('315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"315 MEMBER','1','6715') +('5078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5078 MEMBER','1','6716') +('4279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4279 MEMBER','1','6717') +('6748','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',264.27,'999','0','"6748 MEMBER','1','6718') +('6419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',2028.49,'999','1','"6419 MEMBER','1','6719') +('4437','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1357.52,'999','0','"4437 MEMBER','1','6720') +('4009','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2743.67,'999','0','"4009 MEMBER','1','6721') +('4309','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',77.44,'999','1','"4309 MEMBER','1','6722') +('1268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',8.67,'999','0','"1268 MEMBER','1','6723') +('6259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',422.62,'999','1','"6259 MEMBER','1','6724') +('2561','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',977.15,'999','0','"2561 MEMBER','1','6725') +('5019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5019 MEMBER','1','6726') +('4699','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',75.92,'999','0','"4699 MEMBER','1','6727') +('4940','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',798.83,'999','1','"4940 MEMBER','1','6728') +('3400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"3400 MEMBER','1','6729') +('4167','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3414.14,'999','0','"4167 MEMBER','1','6730') +('4797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4797 MEMBER','1','6731') +('4307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2615.06,'999','0','"4307 MEMBER','1','6732') +('6446','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',45.25,'999','0','"6446 MEMBER','1','6733') +('4544','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',2.99,'999','0','"4544 MEMBER','1','6734') +('1115','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"1115 MEMBER','1','6735') +('6660','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',433.16,'999','1','"6660 MEMBER','1','6736') +('6329','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',2035.87,'999','0','"6329 MEMBER','1','6737') +('2298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',470.72,'999','0','"2298 MEMBER','1','6738') +('4942','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',283.36,'999','1','"4942 MEMBER','1','6739') +('4852','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',27.52,'999','1','"4852 MEMBER','1','6740') +('4620','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2086.97,'999','1','"4620 MEMBER','1','6741') +('69','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"69 MEMBER','1','6742') +('6618','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1042.63,'999','0','"6618 MEMBER','1','6743') +('337','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',793.96,'999','0','"337 MEMBER','1','6744') +('4447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"4447 MEMBER','1','6745') +('4663','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',1775.17,'999','0','"4663 MEMBER','1','6746') +('6450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',157.83,'999','1','"6450 MEMBER','1','6747') +('4816','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',582.29,'999','0','"4816 MEMBER','1','6748') +('4754','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',787.41,'999','0','"4754 MEMBER','1','6749') +('692','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"692 MEMBER','1','6750') +('254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1812.79,'999','0','"254 MEMBER','1','6751') +('106','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',6.11,'999','1','"106 MEMBER','1','6752') +('439','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"439 MEMBER','1','6753') +('4668','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',638.30,'999','0','"4668 MEMBER','1','6754') +('6131','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',7262.37,'999','0','"6131 MEMBER','1','6755') +('891','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',1336.45,'999','0','"891 MEMBER','1','6756') +('2001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',9072.75,'999','0','"2001 MEMBER','1','6757') +('6283','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',245.36,'999','1','"6283 MEMBER','1','6758') +('6146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',318.47,'999','0','"6146 MEMBER','1','6759') +('4885','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',700.67,'999','0','"4885 MEMBER','1','6760') +('6381','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1939.86,'999','0','"6381 MEMBER','1','6761') +('7247','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7247 MEMBER','1','6762') +('6515','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',1375.41,'999','0','"6515 MEMBER','1','6763') +('7110','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7110 MEMBER','1','6764') +('7169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7169 MEMBER','1','6765') +('7171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7171 MEMBER','1','6766') +('7178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7178 MEMBER','1','6767') +('7180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7180 MEMBER','1','6768') +('7181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7181 MEMBER','1','6769') +('7186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7186 MEMBER','1','6770') +('7188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7188 MEMBER','1','6771') +('7191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7191 MEMBER','1','6772') +('7150','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7150 MEMBER','1','6773') +('7154','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7154 MEMBER','1','6774') +('7155','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7155 MEMBER','1','6775') +('7158','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7158 MEMBER','1','6776') +('7161','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7161 MEMBER','1','6777') +('7155','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7155 MEMBER','1','6778') +('7164','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7164 MEMBER','1','6779') +('7170','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7170 MEMBER','1','6780') +('7167','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7167 MEMBER','1','6781') +('7172','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7172 MEMBER','1','6782') +('7161','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7161 MEMBER','1','6783') +('7161','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7161 MEMBER','1','6784') +('4492','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','INACT','0','0','0',812.15,'999','0','"4492 MEMBER','1','6785') +('7180','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7180 MEMBER','1','6786') +('7184','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7184 MEMBER','1','6787') +('7185','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7185 MEMBER','1','6788') +('7193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7193 MEMBER','1','6789') +('7194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7194 MEMBER','1','6790') +('7195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7195 MEMBER','1','6791') +('7206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7206 MEMBER','1','6792') +('7207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7207 MEMBER','1','6793') +('7216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7216 MEMBER','1','6794') +('7219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7219 MEMBER','1','6795') +('7228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7228 MEMBER','1','6796') +('7231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7231 MEMBER','1','6797') +('7232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7232 MEMBER','1','6798') +('7181','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7181 MEMBER','1','6799') +('7185','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7185 MEMBER','1','6800') +('7186','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7186 MEMBER','1','6801') +('7189','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7189 MEMBER','1','6802') +('5186','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5186 MEMBER','1','6803') +('7132','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7132 MEMBER','1','6804') +('7135','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7135 MEMBER','1','6805') +('7142','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7142 MEMBER','1','6806') +('7155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7155 MEMBER','1','6807') +('7168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7168 MEMBER','1','6808') +('7174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7174 MEMBER','1','6809') +('7175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7175 MEMBER','1','6810') +('7179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7179 MEMBER','1','6811') +('7182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7182 MEMBER','1','6812') +('7183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7183 MEMBER','1','6813') +('7184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7184 MEMBER','1','6814') +('7187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7187 MEMBER','1','6815') +('7192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7192 MEMBER','1','6816') +('7147','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7147 MEMBER','1','6817') +('7148','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7148 MEMBER','1','6818') +('7153','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7153 MEMBER','1','6819') +('7151','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7151 MEMBER','1','6820') +('9696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9696 MEMBER','1','6821') +('9700','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9700 MEMBER','1','6822') +('7157','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7157 MEMBER','1','6823') +('4859','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',817.17,'999','1','"4859 MEMBER','1','6824') +('7119','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7119 MEMBER','1','6825') +('7166','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7166 MEMBER','1','6826') +('7173','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7173 MEMBER','1','6827') +('7163','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7163 MEMBER','1','6828') +('7166','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7166 MEMBER','1','6829') +('8941','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8941 MEMBER','1','6830') +('9701','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9701 MEMBER','1','6831') +('7175','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7175 MEMBER','1','6832') +('7675','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7675 MEMBER','1','6833') +('9702','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9702 MEMBER','1','6834') +('7183','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7183 MEMBER','1','6835') +('7175','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7175 MEMBER','1','6836') +('7175','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7175 MEMBER','1','6837') +('7179','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7179 MEMBER','1','6838') +('7200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7200 MEMBER','1','6839') +('7201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7201 MEMBER','1','6840') +('7203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7203 MEMBER','1','6841') +('7204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7204 MEMBER','1','6842') +('7205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7205 MEMBER','1','6843') +('7212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7212 MEMBER','1','6844') +('7214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7214 MEMBER','1','6845') +('7222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7222 MEMBER','1','6846') +('7224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7224 MEMBER','1','6847') +('7226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7226 MEMBER','1','6848') +('7230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7230 MEMBER','1','6849') +('7188','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7188 MEMBER','1','6850') +('7190','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7190 MEMBER','1','6851') +('7191','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7191 MEMBER','1','6852') +('7192','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7192 MEMBER','1','6853') +('7193','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7193 MEMBER','1','6854') +('7194','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7194 MEMBER','1','6855') +('7186','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7186 MEMBER','1','6856') +('7192','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7192 MEMBER','1','6857') +('7195','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7195 MEMBER','1','6858') +('7196','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7196 MEMBER','1','6859') +('7197','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7197 MEMBER','1','6860') +('7198','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7198 MEMBER','1','6861') +('7200','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7200 MEMBER','1','6862') +('7201','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7201 MEMBER','1','6863') +('7202','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7202 MEMBER','1','6864') +('7043','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7043 MEMBER','1','6865') +('7246','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7246 MEMBER','1','6866') +('7268','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7268 MEMBER','1','6867') +('7283','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7283 MEMBER','1','6868') +('7290','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7290 MEMBER','1','6869') +('7289','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7289 MEMBER','1','6870') +('7293','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7293 MEMBER','1','6871') +('7295','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7295 MEMBER','1','6872') +('7300','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7300 MEMBER','1','6873') +('7162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7162 MEMBER','1','6874') +('7170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7170 MEMBER','1','6875') +('7190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7190 MEMBER','1','6876') +('7146','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7146 MEMBER','1','6877') +('7156','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7156 MEMBER','1','6878') +('7160','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7160 MEMBER','1','6879') +('7163','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7163 MEMBER','1','6880') +('7171','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7171 MEMBER','1','6881') +('7160','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7160 MEMBER','1','6882') +('7160','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7160 MEMBER','1','6883') +('7166','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7166 MEMBER','1','6884') +('7179','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7179 MEMBER','1','6885') +('7176','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7176 MEMBER','1','6886') +('7181','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7181 MEMBER','1','6887') +('7176','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7176 MEMBER','1','6888') +('7176','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7176 MEMBER','1','6889') +('7179','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7179 MEMBER','1','6890') +('7181','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7181 MEMBER','1','6891') +('7196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7196 MEMBER','1','6892') +('7197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7197 MEMBER','1','6893') +('7198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7198 MEMBER','1','6894') +('7199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7199 MEMBER','1','6895') +('7202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7202 MEMBER','1','6896') +('7208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7208 MEMBER','1','6897') +('7209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7209 MEMBER','1','6898') +('7210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7210 MEMBER','1','6899') +('7211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7211 MEMBER','1','6900') +('7213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7213 MEMBER','1','6901') +('7215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7215 MEMBER','1','6902') +('7217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7217 MEMBER','1','6903') +('7218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7218 MEMBER','1','6904') +('7220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7220 MEMBER','1','6905') +('7221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7221 MEMBER','1','6906') +('7223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7223 MEMBER','1','6907') +('7225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7225 MEMBER','1','6908') +('7227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"7227 MEMBER','1','6909') +('7229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7229 MEMBER','1','6910') +('7187','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7187 MEMBER','1','6911') +('5186','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5186 MEMBER','1','6912') +('6657','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',730.29,'999','0','"6657 MEMBER','1','6913') +('7194','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7194 MEMBER','1','6914') +('7294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7294 MEMBER','1','6915') +('7295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7295 MEMBER','1','6916') +('7296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7296 MEMBER','1','6917') +('7297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7297 MEMBER','1','6918') +('7298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7298 MEMBER','1','6919') +('7299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7299 MEMBER','1','6920') +('7300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7300 MEMBER','1','6921') +('7301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7301 MEMBER','1','6922') +('7302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7302 MEMBER','1','6923') +('7303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7303 MEMBER','1','6924') +('7304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7304 MEMBER','1','6925') +('7305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7305 MEMBER','1','6926') +('7306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7306 MEMBER','1','6927') +('7307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7307 MEMBER','1','6928') +('7308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7308 MEMBER','1','6929') +('7309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7309 MEMBER','1','6930') +('7310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7310 MEMBER','1','6931') +('7311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7311 MEMBER','1','6932') +('7312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7312 MEMBER','1','6933') +('7257','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7257 MEMBER','1','6934') +('7258','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7258 MEMBER','1','6935') +('7259','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7259 MEMBER','1','6936') +('7260','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7260 MEMBER','1','6937') +('7261','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7261 MEMBER','1','6938') +('7263','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7263 MEMBER','1','6939') +('7265','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7265 MEMBER','1','6940') +('7266','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7266 MEMBER','1','6941') +('1490','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',1484.98,'999','0','"1490 MEMBER','1','6942') +('7267','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7267 MEMBER','1','6943') +('7250','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"7250 MEMBER','1','6944') +('7269','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7269 MEMBER','1','6945') +('7271','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7271 MEMBER','1','6946') +('7270','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7270 MEMBER','1','6947') +('7273','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7273 MEMBER','1','6948') +('7274','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7274 MEMBER','1','6949') +('7275','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7275 MEMBER','1','6950') +('7276','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7276 MEMBER','1','6951') +('7277','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7277 MEMBER','1','6952') +('7278','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7278 MEMBER','1','6953') +('7279','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7279 MEMBER','1','6954') +('7280','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7280 MEMBER','1','6955') +('7281','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7281 MEMBER','1','6956') +('7282','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7282 MEMBER','1','6957') +('7284','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7284 MEMBER','1','6958') +('6882','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"6882 MEMBER','1','6959') +('7285','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7285 MEMBER','1','6960') +('7288','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7288 MEMBER','1','6961') +('7291','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7291 MEMBER','1','6962') +('7292','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7292 MEMBER','1','6963') +('7299','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7299 MEMBER','1','6964') +('7298','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7298 MEMBER','1','6965') +('7313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7313 MEMBER','1','6966') +('7314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7314 MEMBER','1','6967') +('7315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7315 MEMBER','1','6968') +('7316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7316 MEMBER','1','6969') +('7317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7317 MEMBER','1','6970') +('7318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7318 MEMBER','1','6971') +('7319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7319 MEMBER','1','6972') +('7320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7320 MEMBER','1','6973') +('7321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7321 MEMBER','1','6974') +('7322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7322 MEMBER','1','6975') +('7323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7323 MEMBER','1','6976') +('7324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7324 MEMBER','1','6977') +('7325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7325 MEMBER','1','6978') +('7326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7326 MEMBER','1','6979') +('7327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7327 MEMBER','1','6980') +('7328','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','1','"7328 MEMBER','1','6981') +('7329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7329 MEMBER','1','6982') +('7330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7330 MEMBER','1','6983') +('7331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7331 MEMBER','1','6984') +('7332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7332 MEMBER','1','6985') +('7333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7333 MEMBER','1','6986') +('7334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7334 MEMBER','1','6987') +('7335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7335 MEMBER','1','6988') +('7336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7336 MEMBER','1','6989') +('7337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7337 MEMBER','1','6990') +('7338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7338 MEMBER','1','6991') +('7339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7339 MEMBER','1','6992') +('7340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7340 MEMBER','1','6993') +('7341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7341 MEMBER','1','6994') +('7342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7342 MEMBER','1','6995') +('7343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7343 MEMBER','1','6996') +('7344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7344 MEMBER','1','6997') +('7345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7345 MEMBER','1','6998') +('7346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7346 MEMBER','1','6999') +('7347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7347 MEMBER','1','7000') +('7348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7348 MEMBER','1','7001') +('7349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7349 MEMBER','1','7002') +('7350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7350 MEMBER','1','7003') +('7351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7351 MEMBER','1','7004') +('7352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7352 MEMBER','1','7005') +('7301','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7301 MEMBER','1','7006') +('7655','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7655 MEMBER','1','7007') +('7303','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7303 MEMBER','1','7008') +('7304','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7304 MEMBER','1','7009') +('7305','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7305 MEMBER','1','7010') +('7149','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7149 MEMBER','1','7011') +('8132','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8132 MEMBER','1','7012') +('4778','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4778 MEMBER','1','7013') +('7309','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7309 MEMBER','1','7014') +('7311','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7311 MEMBER','1','7015') +('10288','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10288 MEMBER','1','7016') +('7313','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7313 MEMBER','1','7017') +('8099','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8099 MEMBER','1','7018') +('7316','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7316 MEMBER','1','7019') +('7320','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7320 MEMBER','1','7020') +('7315','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7315 MEMBER','1','7021') +('7319','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7319 MEMBER','1','7022') +('7318','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7318 MEMBER','1','7023') +('8154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8154 MEMBER','1','7024') +('5195','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5195 MEMBER','1','7025') +('6022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6022 MEMBER','1','7026') +('6023','1','LASTNAME','FIRSTNAME',999.99,'-6.42','0',1000.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6023 MEMBER','1','7027') +('6024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"6024 MEMBER','1','7028') +('6025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6025 MEMBER','1','7029') +('6026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6026 MEMBER','1','7030') +('6027','1','LASTNAME','FIRSTNAME',999.99,4.99,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6027 MEMBER','1','7031') +('6028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6028 MEMBER','1','7032') +('6029','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6029 MEMBER','1','7033') +('6030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6030 MEMBER','1','7034') +('6031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6031 MEMBER','1','7035') +('7325','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7325 MEMBER','1','7036') +('7324','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7324 MEMBER','1','7037') +('7323','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7323 MEMBER','1','7038') +('7321','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7321 MEMBER','1','7039') +('5196','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5196 MEMBER','1','7040') +('5197','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5197 MEMBER','1','7041') +('5199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5199 MEMBER','1','7042') +('5200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5200 MEMBER','1','7043') +('5201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5201 MEMBER','1','7044') +('5202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5202 MEMBER','1','7045') +('5203','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5203 MEMBER','1','7046') +('5204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5204 MEMBER','1','7047') +('5205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5205 MEMBER','1','7048') +('5206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5206 MEMBER','1','7049') +('5207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5207 MEMBER','1','7050') +('5208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5208 MEMBER','1','7051') +('5209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5209 MEMBER','1','7052') +('5210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5210 MEMBER','1','7053') +('5211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5211 MEMBER','1','7054') +('5212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5212 MEMBER','1','7055') +('5213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5213 MEMBER','1','7056') +('5214','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5214 MEMBER','1','7057') +('5215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5215 MEMBER','1','7058') +('5216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5216 MEMBER','1','7059') +('5217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5217 MEMBER','1','7060') +('5218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5218 MEMBER','1','7061') +('5219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5219 MEMBER','1','7062') +('5220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5220 MEMBER','1','7063') +('5221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5221 MEMBER','1','7064') +('5222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5222 MEMBER','1','7065') +('5223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5223 MEMBER','1','7066') +('5224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5224 MEMBER','1','7067') +('5225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5225 MEMBER','1','7068') +('5226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5226 MEMBER','1','7069') +('5227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5227 MEMBER','1','7070') +('5228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5228 MEMBER','1','7071') +('5229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5229 MEMBER','1','7072') +('5230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5230 MEMBER','1','7073') +('5231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5231 MEMBER','1','7074') +('5232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5232 MEMBER','1','7075') +('5233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5233 MEMBER','1','7076') +('5234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5234 MEMBER','1','7077') +('5235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5235 MEMBER','1','7078') +('5236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5236 MEMBER','1','7079') +('5237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5237 MEMBER','1','7080') +('5238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"5238 MEMBER','1','7081') +('7327','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7327 MEMBER','1','7082') +('8153','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8153 MEMBER','1','7083') +('9562','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9562 MEMBER','1','7084') +('7551','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7551 MEMBER','1','7085') +('5204','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5204 MEMBER','1','7086') +('5205','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5205 MEMBER','1','7087') +('5206','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5206 MEMBER','1','7088') +('5209','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5209 MEMBER','1','7089') +('5210','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5210 MEMBER','1','7090') +('7353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7353 MEMBER','1','7091') +('7354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7354 MEMBER','1','7092') +('7355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7355 MEMBER','1','7093') +('7356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7356 MEMBER','1','7094') +('7357','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7357 MEMBER','1','7095') +('7358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7358 MEMBER','1','7096') +('7359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7359 MEMBER','1','7097') +('7360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7360 MEMBER','1','7098') +('7361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7361 MEMBER','1','7099') +('7362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7362 MEMBER','1','7100') +('7363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7363 MEMBER','1','7101') +('7364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7364 MEMBER','1','7102') +('7365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7365 MEMBER','1','7103') +('7366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7366 MEMBER','1','7104') +('7367','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','1','"7367 MEMBER','1','7105') +('7368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7368 MEMBER','1','7106') +('7369','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7369 MEMBER','1','7107') +('7370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7370 MEMBER','1','7108') +('7371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7371 MEMBER','1','7109') +('7372','1','LASTNAME','FIRSTNAME',999.99,3.01,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7372 MEMBER','1','7110') +('7373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7373 MEMBER','1','7111') +('7374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7374 MEMBER','1','7112') +('7375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7375 MEMBER','1','7113') +('7376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7376 MEMBER','1','7114') +('7377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7377 MEMBER','1','7115') +('7378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7378 MEMBER','1','7116') +('7379','1','LASTNAME','FIRSTNAME',999.99,13.22,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7379 MEMBER','1','7117') +('7380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7380 MEMBER','1','7118') +('7381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7381 MEMBER','1','7119') +('7382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7382 MEMBER','1','7120') +('7383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7383 MEMBER','1','7121') +('7384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7384 MEMBER','1','7122') +('7385','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7385 MEMBER','1','7123') +('7386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7386 MEMBER','1','7124') +('7387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7387 MEMBER','1','7125') +('7388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7388 MEMBER','1','7126') +('7389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7389 MEMBER','1','7127') +('7390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7390 MEMBER','1','7128') +('7391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7391 MEMBER','1','7129') +('7392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7392 MEMBER','1','7130') +('8133','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8133 MEMBER','1','7131') +('9807','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9807 MEMBER','1','7132') +('5212','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5212 MEMBER','1','7133') +('4004','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4004 MEMBER','1','7134') +('5214','2','LASTNAME','FIRSTNAME',999.00,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5214 MEMBER','1','7135') +('8373','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8373 MEMBER','1','7136') +('5370','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5370 MEMBER','1','7137') +('8890','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8890 MEMBER','1','7138') +('8894','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8894 MEMBER','1','7139') +('7393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7393 MEMBER','1','7140') +('7394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7394 MEMBER','1','7141') +('7395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7395 MEMBER','1','7142') +('7396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7396 MEMBER','1','7143') +('7397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7397 MEMBER','1','7144') +('7398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7398 MEMBER','1','7145') +('7399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7399 MEMBER','1','7146') +('7400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7400 MEMBER','1','7147') +('7401','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7401 MEMBER','1','7148') +('7402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7402 MEMBER','1','7149') +('7403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7403 MEMBER','1','7150') +('7404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7404 MEMBER','1','7151') +('7405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7405 MEMBER','1','7152') +('7406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7406 MEMBER','1','7153') +('7407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7407 MEMBER','1','7154') +('7408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7408 MEMBER','1','7155') +('7409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7409 MEMBER','1','7156') +('7410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"7410 MEMBER','1','7157') +('7411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7411 MEMBER','1','7158') +('7412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7412 MEMBER','1','7159') +('7413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7413 MEMBER','1','7160') +('7414','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7414 MEMBER','1','7161') +('7415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7415 MEMBER','1','7162') +('7416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7416 MEMBER','1','7163') +('7417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"7417 MEMBER','1','7164') +('7418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7418 MEMBER','1','7165') +('7419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7419 MEMBER','1','7166') +('7420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7420 MEMBER','1','7167') +('7421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7421 MEMBER','1','7168') +('7422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7422 MEMBER','1','7169') +('7423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7423 MEMBER','1','7170') +('7424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7424 MEMBER','1','7171') +('7425','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7425 MEMBER','1','7172') +('7426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7426 MEMBER','1','7173') +('7427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7427 MEMBER','1','7174') +('7428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7428 MEMBER','1','7175') +('7429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7429 MEMBER','1','7176') +('7430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7430 MEMBER','1','7177') +('7431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7431 MEMBER','1','7178') +('7432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7432 MEMBER','1','7179') +('7333','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7333 MEMBER','1','7180') +('7334','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7334 MEMBER','1','7181') +('9822','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9822 MEMBER','1','7182') +('7336','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7336 MEMBER','1','7183') +('7337','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7337 MEMBER','1','7184') +('7338','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7338 MEMBER','1','7185') +('7340','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7340 MEMBER','1','7186') +('7341','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7341 MEMBER','1','7187') +('7343','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7343 MEMBER','1','7188') +('7344','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7344 MEMBER','1','7189') +('7345','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7345 MEMBER','1','7190') +('7346','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7346 MEMBER','1','7191') +('7347','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7347 MEMBER','1','7192') +('7348','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7348 MEMBER','1','7193') +('7350','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7350 MEMBER','1','7194') +('7351','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7351 MEMBER','1','7195') +('7353','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7353 MEMBER','1','7196') +('7352','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7352 MEMBER','1','7197') +('7354','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7354 MEMBER','1','7198') +('7359','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7359 MEMBER','1','7199') +('7360','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7360 MEMBER','1','7200') +('7361','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7361 MEMBER','1','7201') +('7362','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7362 MEMBER','1','7202') +('7021','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7021 MEMBER','1','7203') +('7364','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7364 MEMBER','1','7204') +('7905','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7905 MEMBER','1','7205') +('7371','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7371 MEMBER','1','7206') +('7376','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7376 MEMBER','1','7207') +('7377','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7377 MEMBER','1','7208') +('7378','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7378 MEMBER','1','7209') +('7379','2','LASTNAME','FIRSTNAME',999.00,13.22,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7379 MEMBER','1','7210') +('7380','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7380 MEMBER','1','7211') +('8276','2','LASTNAME','FIRSTNAME',NULL,44.88,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"8276 MEMBER','1','7212') +('7755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7755 MEMBER','1','7213') +('7383','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7383 MEMBER','1','7214') +('7907','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7907 MEMBER','1','7215') +('7053','4','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"7053 MEMBER','1','7216') +('7911','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7911 MEMBER','1','7217') +('6956','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6956 MEMBER','1','7218') +('8823','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8823 MEMBER','1','7219') +('6009','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','1',NULL,'REG','2','0','0',NULL,NULL,'0','"6009 MEMBER','1','7220') +('8278','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8278 MEMBER','1','7221') +('7358','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7358 MEMBER','1','7222') +('7385','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7385 MEMBER','1','7223') +('7384','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7384 MEMBER','1','7224') +('9859','1','LASTNAME','FIRSTNAME',999.99,59.77,'10',120.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9859 MEMBER','1','7225') +('4606','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4606 MEMBER','1','7226') +('7386','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7386 MEMBER','1','7227') +('8614','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8614 MEMBER','1','7228') +('1460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',313.68,'999','1','"1460 MEMBER','1','7229') +('9127','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9127 MEMBER','1','7230') +('7373','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7373 MEMBER','1','7231') +('7374','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7374 MEMBER','1','7232') +('8832','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8832 MEMBER','1','7233') +('8833','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8833 MEMBER','1','7234') +('8835','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8835 MEMBER','1','7235') +('7928','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7928 MEMBER','1','7236') +('8837','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8837 MEMBER','1','7237') +('8844','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8844 MEMBER','1','7238') +('8846','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8846 MEMBER','1','7239') +('8846','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8846 MEMBER','1','7240') +('8850','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8850 MEMBER','1','7241') +('7433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7433 MEMBER','1','7242') +('7434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','1',0.00,'999','0','"7434 MEMBER','1','7243') +('7435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7435 MEMBER','1','7244') +('7436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7436 MEMBER','1','7245') +('7437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7437 MEMBER','1','7246') +('7438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7438 MEMBER','1','7247') +('7439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7439 MEMBER','1','7248') +('7440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7440 MEMBER','1','7249') +('7441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7441 MEMBER','1','7250') +('7442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7442 MEMBER','1','7251') +('7443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7443 MEMBER','1','7252') +('7444','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7444 MEMBER','1','7253') +('7445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7445 MEMBER','1','7254') +('7446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7446 MEMBER','1','7255') +('7447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7447 MEMBER','1','7256') +('7448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7448 MEMBER','1','7257') +('7449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7449 MEMBER','1','7258') +('7450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7450 MEMBER','1','7259') +('7451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7451 MEMBER','1','7260') +('7452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7452 MEMBER','1','7261') +('7453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7453 MEMBER','1','7262') +('7454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7454 MEMBER','1','7263') +('7455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7455 MEMBER','1','7264') +('7456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7456 MEMBER','1','7265') +('7457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7457 MEMBER','1','7266') +('7458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7458 MEMBER','1','7267') +('7459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7459 MEMBER','1','7268') +('7205','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7205 MEMBER','1','7269') +('8989','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8989 MEMBER','1','7270') +('7207','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7207 MEMBER','1','7271') +('7753','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7753 MEMBER','1','7272') +('5187','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5187 MEMBER','1','7273') +('8249','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8249 MEMBER','1','7274') +('8303','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8303 MEMBER','1','7275') +('7196','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7196 MEMBER','1','7276') +('7196','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7196 MEMBER','1','7277') +('7208','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7208 MEMBER','1','7278') +('7209','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7209 MEMBER','1','7279') +('7210','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7210 MEMBER','1','7280') +('7211','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7211 MEMBER','1','7281') +('6231','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6231 MEMBER','1','7282') +('7213','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7213 MEMBER','1','7283') +('7658','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7658 MEMBER','1','7284') +('7214','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7214 MEMBER','1','7285') +('7198','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7198 MEMBER','1','7286') +('7199','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7199 MEMBER','1','7287') +('7201','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7201 MEMBER','1','7288') +('8427','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8427 MEMBER','1','7289') +('7122','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7122 MEMBER','1','7290') +('4979','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',6985.77,'999','0','"4979 MEMBER','1','7291') +('4979','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',6985.77,'999','0','"4979 MEMBER','1','7292') +('2637','2','LASTNAME','FIRSTNAME',999.00,21.72,'10',100.00,'1','0','1','PC','3','1','0',3933.75,'999','0','"2637 MEMBER','1','7293') +('7213','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7213 MEMBER','1','7294') +('7213','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7213 MEMBER','1','7295') +('7214','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7214 MEMBER','1','7296') +('54','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',9156.49,'999','0','"54 MEMBER','1','7297') +('54','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',9156.49,'999','0','"54 MEMBER','1','7298') +('7215','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7215 MEMBER','1','7299') +('7216','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7216 MEMBER','1','7300') +('7217','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7217 MEMBER','1','7301') +('7218','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7218 MEMBER','1','7302') +('7219','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7219 MEMBER','1','7303') +('7221','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7221 MEMBER','1','7304') +('7222','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7222 MEMBER','1','7305') +('7223','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7223 MEMBER','1','7306') +('7224','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7224 MEMBER','1','7307') +('7225','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7225 MEMBER','1','7308') +('7226','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7226 MEMBER','1','7309') +('7228','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7228 MEMBER','1','7310') +('7230','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7230 MEMBER','1','7311') +('7233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7233 MEMBER','1','7312') +('7234','1','LASTNAME','FIRSTNAME',999.99,107.61,'10',125.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7234 MEMBER','1','7313') +('7235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7235 MEMBER','1','7314') +('7236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7236 MEMBER','1','7315') +('7237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7237 MEMBER','1','7316') +('7238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7238 MEMBER','1','7317') +('7239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7239 MEMBER','1','7318') +('7240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7240 MEMBER','1','7319') +('7241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7241 MEMBER','1','7320') +('7242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7242 MEMBER','1','7321') +('7243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7243 MEMBER','1','7322') +('7244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7244 MEMBER','1','7323') +('7245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7245 MEMBER','1','7324') +('7246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7246 MEMBER','1','7325') +('7247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7247 MEMBER','1','7326') +('7248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7248 MEMBER','1','7327') +('7249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7249 MEMBER','1','7328') +('7250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"7250 MEMBER','1','7329') +('7251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7251 MEMBER','1','7330') +('7252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7252 MEMBER','1','7331') +('7253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7253 MEMBER','1','7332') +('7254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7254 MEMBER','1','7333') +('7255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7255 MEMBER','1','7334') +('7256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7256 MEMBER','1','7335') +('7257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7257 MEMBER','1','7336') +('7258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7258 MEMBER','1','7337') +('7259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7259 MEMBER','1','7338') +('7260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7260 MEMBER','1','7339') +('7261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7261 MEMBER','1','7340') +('7262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7262 MEMBER','1','7341') +('7263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7263 MEMBER','1','7342') +('7264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7264 MEMBER','1','7343') +('7265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7265 MEMBER','1','7344') +('7266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7266 MEMBER','1','7345') +('7267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7267 MEMBER','1','7346') +('7268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7268 MEMBER','1','7347') +('7269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7269 MEMBER','1','7348') +('7270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7270 MEMBER','1','7349') +('7271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7271 MEMBER','1','7350') +('7272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7272 MEMBER','1','7351') +('5191','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5191 MEMBER','1','7352') +('7162','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7162 MEMBER','1','7353') +('7231','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7231 MEMBER','1','7354') +('7216','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7216 MEMBER','1','7355') +('7216','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7216 MEMBER','1','7356') +('7218','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7218 MEMBER','1','7357') +('10086','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10086 MEMBER','1','7358') +('4877','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',3042.56,'999','0','"4877 MEMBER','1','7359') +('4072','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"4072 MEMBER','1','7360') +('8969','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8969 MEMBER','1','7361') +('8427','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8427 MEMBER','1','7362') +('8107','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8107 MEMBER','1','7363') +('5192','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5192 MEMBER','1','7364') +('5193','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5193 MEMBER','1','7365') +('7235','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7235 MEMBER','1','7366') +('7236','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7236 MEMBER','1','7367') +('7237','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7237 MEMBER','1','7368') +('7238','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7238 MEMBER','1','7369') +('7239','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7239 MEMBER','1','7370') +('7240','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7240 MEMBER','1','7371') +('7241','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7241 MEMBER','1','7372') +('7242','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7242 MEMBER','1','7373') +('7244','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7244 MEMBER','1','7374') +('7246','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7246 MEMBER','1','7375') +('7237','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7237 MEMBER','1','7376') +('7247','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7247 MEMBER','1','7377') +('7238','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7238 MEMBER','1','7378') +('7238','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7238 MEMBER','1','7379') +('7239','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7239 MEMBER','1','7380') +('7239','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7239 MEMBER','1','7381') +('7240','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7240 MEMBER','1','7382') +('7240','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7240 MEMBER','1','7383') +('4517','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',4145.42,'999','0','"4517 MEMBER','1','7384') +('7253','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7253 MEMBER','1','7385') +('7250','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"7250 MEMBER','1','7386') +('7255','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7255 MEMBER','1','7387') +('7273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7273 MEMBER','1','7388') +('7274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7274 MEMBER','1','7389') +('7275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7275 MEMBER','1','7390') +('7276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7276 MEMBER','1','7391') +('7277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7277 MEMBER','1','7392') +('7278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7278 MEMBER','1','7393') +('7279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7279 MEMBER','1','7394') +('7280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7280 MEMBER','1','7395') +('7281','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7281 MEMBER','1','7396') +('7282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7282 MEMBER','1','7397') +('7283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7283 MEMBER','1','7398') +('7284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7284 MEMBER','1','7399') +('7285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7285 MEMBER','1','7400') +('7286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7286 MEMBER','1','7401') +('7287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7287 MEMBER','1','7402') +('7288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7288 MEMBER','1','7403') +('7289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7289 MEMBER','1','7404') +('7290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7290 MEMBER','1','7405') +('7291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7291 MEMBER','1','7406') +('7292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7292 MEMBER','1','7407') +('7293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7293 MEMBER','1','7408') +('7460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7460 MEMBER','1','7409') +('7461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7461 MEMBER','1','7410') +('7462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7462 MEMBER','1','7411') +('7463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7463 MEMBER','1','7412') +('7464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7464 MEMBER','1','7413') +('7465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7465 MEMBER','1','7414') +('7466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7466 MEMBER','1','7415') +('7467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7467 MEMBER','1','7416') +('7468','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7468 MEMBER','1','7417') +('7469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7469 MEMBER','1','7418') +('7470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7470 MEMBER','1','7419') +('7471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7471 MEMBER','1','7420') +('7472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7472 MEMBER','1','7421') +('506','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"506 MEMBER','1','7422') +('5230','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5230 MEMBER','1','7423') +('7329','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7329 MEMBER','1','7424') +('7366','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7366 MEMBER','1','7425') +('7368','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7368 MEMBER','1','7426') +('7369','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7369 MEMBER','1','7427') +('7370','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7370 MEMBER','1','7428') +('7375','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7375 MEMBER','1','7429') +('8707','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8707 MEMBER','1','7430') +('7330','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7330 MEMBER','1','7431') +('7332','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7332 MEMBER','1','7432') +('7756','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7756 MEMBER','1','7433') +('7390','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7390 MEMBER','1','7434') +('7391','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7391 MEMBER','1','7435') +('7393','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7393 MEMBER','1','7436') +('7392','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7392 MEMBER','1','7437') +('7395','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7395 MEMBER','1','7438') +('7394','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7394 MEMBER','1','7439') +('7396','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7396 MEMBER','1','7440') +('8911','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8911 MEMBER','1','7441') +('7417','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"7417 MEMBER','1','7442') +('10416','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"10416 MEMBER','1','7443') +('6440','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',509.17,'999','0','"6440 MEMBER','1','7444') +('4285','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1080.78,'999','0','"4285 MEMBER','1','7445') +('4285','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1080.78,'999','0','"4285 MEMBER','1','7446') +('4285','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1080.78,'999','0','"4285 MEMBER','1','7447') +('5239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5239 MEMBER','1','7448') +('5235','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5235 MEMBER','1','7449') +('5236','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5236 MEMBER','1','7450') +('7397','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7397 MEMBER','1','7451') +('7398','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7398 MEMBER','1','7452') +('7399','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7399 MEMBER','1','7453') +('7401','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7401 MEMBER','1','7454') +('7402','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7402 MEMBER','1','7455') +('7403','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7403 MEMBER','1','7456') +('7404','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7404 MEMBER','1','7457') +('7414','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7414 MEMBER','1','7458') +('7406','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7406 MEMBER','1','7459') +('7418','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7418 MEMBER','1','7460') +('7408','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7408 MEMBER','1','7461') +('7409','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7409 MEMBER','1','7462') +('7411','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7411 MEMBER','1','7463') +('7412','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7412 MEMBER','1','7464') +('7430','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7430 MEMBER','1','7465') +('7414','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7414 MEMBER','1','7466') +('7415','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7415 MEMBER','1','7467') +('7416','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7416 MEMBER','1','7468') +('7418','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7418 MEMBER','1','7469') +('7419','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7419 MEMBER','1','7470') +('7420','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7420 MEMBER','1','7471') +('7422','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7422 MEMBER','1','7472') +('7423','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7423 MEMBER','1','7473') +('7424','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7424 MEMBER','1','7474') +('7425','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7425 MEMBER','1','7475') +('7426','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7426 MEMBER','1','7476') +('7427','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7427 MEMBER','1','7477') +('7428','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7428 MEMBER','1','7478') +('7429','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7429 MEMBER','1','7479') +('8158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8158 MEMBER','1','7480') +('7659','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7659 MEMBER','1','7481') +('6015','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6015 MEMBER','1','7482') +('5235','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5235 MEMBER','1','7483') +('5236','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5236 MEMBER','1','7484') +('7917','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7917 MEMBER','1','7485') +('7919','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7919 MEMBER','1','7486') +('7336','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7336 MEMBER','1','7487') +('7336','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7336 MEMBER','1','7488') +('7337','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7337 MEMBER','1','7489') +('7338','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7338 MEMBER','1','7490') +('7338','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7338 MEMBER','1','7491') +('7339','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7339 MEMBER','1','7492') +('7341','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7341 MEMBER','1','7493') +('7341','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7341 MEMBER','1','7494') +('7347','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7347 MEMBER','1','7495') +('7350','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7350 MEMBER','1','7496') +('8294','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8294 MEMBER','1','7497') +('7351','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7351 MEMBER','1','7498') +('8933','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8933 MEMBER','1','7499') +('8946','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8946 MEMBER','1','7500') +('7920','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7920 MEMBER','1','7501') +('7379','4','LASTNAME','FIRSTNAME',999.99,13.22,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7379 MEMBER','1','7502') +('7379','3','LASTNAME','FIRSTNAME',999.99,13.22,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7379 MEMBER','1','7503') +('7384','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7384 MEMBER','1','7504') +('7385','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7385 MEMBER','1','7505') +('7385','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7385 MEMBER','1','7506') +('7386','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7386 MEMBER','1','7507') +('7283','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7283 MEMBER','1','7508') +('7284','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7284 MEMBER','1','7509') +('7284','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7284 MEMBER','1','7510') +('7288','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7288 MEMBER','1','7511') +('7288','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7288 MEMBER','1','7512') +('7290','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7290 MEMBER','1','7513') +('7289','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7289 MEMBER','1','7514') +('7289','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7289 MEMBER','1','7515') +('7293','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7293 MEMBER','1','7516') +('7293','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7293 MEMBER','1','7517') +('7298','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7298 MEMBER','1','7518') +('7298','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7298 MEMBER','1','7519') +('7301','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7301 MEMBER','1','7520') +('7304','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7304 MEMBER','1','7521') +('6948','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"6948 MEMBER','1','7522') +('5177','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',NULL,'999','0','"5177 MEMBER','1','7523') +('2886','3','LASTNAME','FIRSTNAME',999.99,'-3.45','0',20.00,'1','0','1','PC','1','0','0',1516.95,'999','0','"2886 MEMBER','1','7524') +('7640','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7640 MEMBER','1','7525') +('4020','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2382.09,'999','0','"4020 MEMBER','1','7526') +('4198','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"4198 MEMBER','1','7527') +('7223','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7223 MEMBER','1','7528') +('413','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1200.35,'999','0','"413 MEMBER','1','7529') +('7018','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','0','"7018 MEMBER','1','7530') +('10014','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10014 MEMBER','1','7531') +('7320','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7320 MEMBER','1','7532') +('7325','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7325 MEMBER','1','7533') +('27','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"27 MEMBER','1','7534') +('27','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"27 MEMBER','1','7535') +('8709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8709 MEMBER','1','7536') +('7647','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7647 MEMBER','1','7537') +('4263','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4263 MEMBER','1','7538') +('891','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"891 MEMBER','1','7539') +('10154','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10154 MEMBER','1','7540') +('5230','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5230 MEMBER','1','7541') +('5230','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5230 MEMBER','1','7542') +('7431','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7431 MEMBER','1','7543') +('7432','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7432 MEMBER','1','7544') +('7433','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7433 MEMBER','1','7545') +('473','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"473 MEMBER','1','7546') +('5168','1','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',NULL,'999','0','"5168 MEMBER','1','7547') +('7435','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7435 MEMBER','1','7548') +('7439','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7439 MEMBER','1','7549') +('7440','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7440 MEMBER','1','7550') +('7438','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7438 MEMBER','1','7551') +('7441','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7441 MEMBER','1','7552') +('7442','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7442 MEMBER','1','7553') +('7443','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7443 MEMBER','1','7554') +('7445','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7445 MEMBER','1','7555') +('5240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5240 MEMBER','1','7556') +('5241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5241 MEMBER','1','7557') +('5242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5242 MEMBER','1','7558') +('5243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"5243 MEMBER','1','7559') +('5244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5244 MEMBER','1','7560') +('5245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5245 MEMBER','1','7561') +('5246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5246 MEMBER','1','7562') +('5247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5247 MEMBER','1','7563') +('5248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5248 MEMBER','1','7564') +('5249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5249 MEMBER','1','7565') +('5250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5250 MEMBER','1','7566') +('5251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5251 MEMBER','1','7567') +('5252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5252 MEMBER','1','7568') +('5253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5253 MEMBER','1','7569') +('5254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5254 MEMBER','1','7570') +('5255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','1','0',0.00,'999','0','"5255 MEMBER','1','7571') +('5256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5256 MEMBER','1','7572') +('5257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5257 MEMBER','1','7573') +('5258','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5258 MEMBER','1','7574') +('5259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5259 MEMBER','1','7575') +('5260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5260 MEMBER','1','7576') +('5261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5261 MEMBER','1','7577') +('5262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5262 MEMBER','1','7578') +('5263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5263 MEMBER','1','7579') +('5264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5264 MEMBER','1','7580') +('5265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5265 MEMBER','1','7581') +('5266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5266 MEMBER','1','7582') +('5267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5267 MEMBER','1','7583') +('5268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5268 MEMBER','1','7584') +('5269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5269 MEMBER','1','7585') +('5270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5270 MEMBER','1','7586') +('5271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5271 MEMBER','1','7587') +('5272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5272 MEMBER','1','7588') +('5273','1','LASTNAME','FIRSTNAME',999.99,10.93,'10',25.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5273 MEMBER','1','7589') +('5274','1','LASTNAME','FIRSTNAME',999.99,6.16,'10',30.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5274 MEMBER','1','7590') +('5275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5275 MEMBER','1','7591') +('5276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5276 MEMBER','1','7592') +('5277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5277 MEMBER','1','7593') +('5278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5278 MEMBER','1','7594') +('7473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7473 MEMBER','1','7595') +('7474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7474 MEMBER','1','7596') +('7475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7475 MEMBER','1','7597') +('7476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7476 MEMBER','1','7598') +('7477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7477 MEMBER','1','7599') +('7478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7478 MEMBER','1','7600') +('7479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7479 MEMBER','1','7601') +('7480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7480 MEMBER','1','7602') +('7481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7481 MEMBER','1','7603') +('7482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7482 MEMBER','1','7604') +('7483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7483 MEMBER','1','7605') +('7484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7484 MEMBER','1','7606') +('7485','1','LASTNAME','FIRSTNAME',999.99,7.25,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7485 MEMBER','1','7607') +('7486','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7486 MEMBER','1','7608') +('7487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7487 MEMBER','1','7609') +('7488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7488 MEMBER','1','7610') +('7489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7489 MEMBER','1','7611') +('7490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7490 MEMBER','1','7612') +('7491','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7491 MEMBER','1','7613') +('7492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7492 MEMBER','1','7614') +('7493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7493 MEMBER','1','7615') +('7494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7494 MEMBER','1','7616') +('7495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7495 MEMBER','1','7617') +('7496','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7496 MEMBER','1','7618') +('7497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7497 MEMBER','1','7619') +('7498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7498 MEMBER','1','7620') +('7499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7499 MEMBER','1','7621') +('7500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7500 MEMBER','1','7622') +('7501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7501 MEMBER','1','7623') +('7502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7502 MEMBER','1','7624') +('7762','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7762 MEMBER','1','7625') +('7793','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7793 MEMBER','1','7626') +('7794','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7794 MEMBER','1','7627') +('7795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7795 MEMBER','1','7628') +('7796','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7796 MEMBER','1','7629') +('7797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7797 MEMBER','1','7630') +('7798','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7798 MEMBER','1','7631') +('7799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7799 MEMBER','1','7632') +('7800','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7800 MEMBER','1','7633') +('7801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7801 MEMBER','1','7634') +('7802','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7802 MEMBER','1','7635') +('7803','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7803 MEMBER','1','7636') +('7804','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7804 MEMBER','1','7637') +('7805','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7805 MEMBER','1','7638') +('7806','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7806 MEMBER','1','7639') +('7807','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7807 MEMBER','1','7640') +('7808','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7808 MEMBER','1','7641') +('7809','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7809 MEMBER','1','7642') +('7810','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7810 MEMBER','1','7643') +('7811','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7811 MEMBER','1','7644') +('7812','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7812 MEMBER','1','7645') +('7813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7813 MEMBER','1','7646') +('7814','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7814 MEMBER','1','7647') +('7815','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7815 MEMBER','1','7648') +('7816','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7816 MEMBER','1','7649') +('7817','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7817 MEMBER','1','7650') +('7818','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7818 MEMBER','1','7651') +('7819','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7819 MEMBER','1','7652') +('7820','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7820 MEMBER','1','7653') +('7821','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7821 MEMBER','1','7654') +('7822','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7822 MEMBER','1','7655') +('7823','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7823 MEMBER','1','7656') +('7824','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7824 MEMBER','1','7657') +('7825','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7825 MEMBER','1','7658') +('7826','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7826 MEMBER','1','7659') +('7827','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7827 MEMBER','1','7660') +('7828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7828 MEMBER','1','7661') +('7829','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7829 MEMBER','1','7662') +('7830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7830 MEMBER','1','7663') +('7831','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7831 MEMBER','1','7664') +('7832','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7832 MEMBER','1','7665') +('5264','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'TERM','0','1','0',NULL,NULL,'0','"5264 MEMBER','1','7666') +('5264','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'TERM','0','1','0',NULL,NULL,'0','"5264 MEMBER','1','7667') +('5264','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'TERM','0','1','0',NULL,NULL,'0','"5264 MEMBER','1','7668') +('7743','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7743 MEMBER','1','7669') +('7745','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7745 MEMBER','1','7670') +('7764','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7764 MEMBER','1','7671') +('7765','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7765 MEMBER','1','7672') +('7765','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7765 MEMBER','1','7673') +('7766','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7766 MEMBER','1','7674') +('7767','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7767 MEMBER','1','7675') +('7767','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7767 MEMBER','1','7676') +('7767','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7767 MEMBER','1','7677') +('7768','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7768 MEMBER','1','7678') +('7768','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7768 MEMBER','1','7679') +('7768','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7768 MEMBER','1','7680') +('7769','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7769 MEMBER','1','7681') +('7770','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7770 MEMBER','1','7682') +('7770','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7770 MEMBER','1','7683') +('7770','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7770 MEMBER','1','7684') +('7771','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7771 MEMBER','1','7685') +('7772','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7772 MEMBER','1','7686') +('7772','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7772 MEMBER','1','7687') +('7775','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7775 MEMBER','1','7688') +('7776','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7776 MEMBER','1','7689') +('7779','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7779 MEMBER','1','7690') +('7780','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7780 MEMBER','1','7691') +('7780','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7780 MEMBER','1','7692') +('7780','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7780 MEMBER','1','7693') +('7781','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7781 MEMBER','1','7694') +('7783','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7783 MEMBER','1','7695') +('7783','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7783 MEMBER','1','7696') +('7783','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7783 MEMBER','1','7697') +('7784','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7784 MEMBER','1','7698') +('7784','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7784 MEMBER','1','7699') +('7787','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7787 MEMBER','1','7700') +('7791','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7791 MEMBER','1','7701') +('7791','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7791 MEMBER','1','7702') +('7792','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7792 MEMBER','1','7703') +('7794','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7794 MEMBER','1','7704') +('7794','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7794 MEMBER','1','7705') +('7794','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7794 MEMBER','1','7706') +('7797','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7797 MEMBER','1','7707') +('7797','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7797 MEMBER','1','7708') +('7797','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7797 MEMBER','1','7709') +('7833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7833 MEMBER','1','7710') +('7834','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7834 MEMBER','1','7711') +('7835','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7835 MEMBER','1','7712') +('7836','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7836 MEMBER','1','7713') +('7837','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7837 MEMBER','1','7714') +('7838','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7838 MEMBER','1','7715') +('7839','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7839 MEMBER','1','7716') +('7840','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7840 MEMBER','1','7717') +('7841','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7841 MEMBER','1','7718') +('7842','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7842 MEMBER','1','7719') +('7843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7843 MEMBER','1','7720') +('7844','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7844 MEMBER','1','7721') +('7845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7845 MEMBER','1','7722') +('7846','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7846 MEMBER','1','7723') +('7847','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7847 MEMBER','1','7724') +('7848','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7848 MEMBER','1','7725') +('7849','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7849 MEMBER','1','7726') +('7850','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7850 MEMBER','1','7727') +('7851','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7851 MEMBER','1','7728') +('7852','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7852 MEMBER','1','7729') +('7853','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"7853 MEMBER','1','7730') +('7854','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7854 MEMBER','1','7731') +('7855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7855 MEMBER','1','7732') +('7856','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7856 MEMBER','1','7733') +('7857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7857 MEMBER','1','7734') +('7858','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7858 MEMBER','1','7735') +('7859','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7859 MEMBER','1','7736') +('7860','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7860 MEMBER','1','7737') +('7861','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7861 MEMBER','1','7738') +('7862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7862 MEMBER','1','7739') +('7863','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7863 MEMBER','1','7740') +('7864','1','LASTNAME','FIRSTNAME',999.99,50.00,'10',50.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7864 MEMBER','1','7741') +('7865','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7865 MEMBER','1','7742') +('7866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7866 MEMBER','1','7743') +('7867','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7867 MEMBER','1','7744') +('7868','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7868 MEMBER','1','7745') +('7869','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7869 MEMBER','1','7746') +('7870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7870 MEMBER','1','7747') +('7871','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7871 MEMBER','1','7748') +('7872','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7872 MEMBER','1','7749') +('1888','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1888 MEMBER','1','7750') +('7799','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7799 MEMBER','1','7751') +('7873','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7873 MEMBER','1','7752') +('7874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7874 MEMBER','1','7753') +('7875','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7875 MEMBER','1','7754') +('7876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7876 MEMBER','1','7755') +('7877','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7877 MEMBER','1','7756') +('7878','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7878 MEMBER','1','7757') +('7879','1','LASTNAME','FIRSTNAME',999.99,6.35,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7879 MEMBER','1','7758') +('7880','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7880 MEMBER','1','7759') +('7881','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7881 MEMBER','1','7760') +('7882','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7882 MEMBER','1','7761') +('7883','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7883 MEMBER','1','7762') +('7884','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7884 MEMBER','1','7763') +('7885','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7885 MEMBER','1','7764') +('7886','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7886 MEMBER','1','7765') +('7887','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7887 MEMBER','1','7766') +('7888','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7888 MEMBER','1','7767') +('7889','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7889 MEMBER','1','7768') +('7890','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7890 MEMBER','1','7769') +('10482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10482 MEMBER','1','7770') +('10483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10483 MEMBER','1','7771') +('10484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10484 MEMBER','1','7772') +('10485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10485 MEMBER','1','7773') +('10486','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','PC','3','1','0',0.00,'999','1','"10486 MEMBER','1','7774') +('10452','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10452 MEMBER','1','7775') +('10465','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10465 MEMBER','1','7776') +('10450','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10450 MEMBER','1','7777') +('10450','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10450 MEMBER','1','7778') +('10450','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10450 MEMBER','1','7779') +('10451','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10451 MEMBER','1','7780') +('10439','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10439 MEMBER','1','7781') +('10452','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10452 MEMBER','1','7782') +('9231','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9231 MEMBER','1','7783') +('10455','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10455 MEMBER','1','7784') +('10455','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10455 MEMBER','1','7785') +('10456','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10456 MEMBER','1','7786') +('5402','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5402 MEMBER','1','7787') +('5402','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5402 MEMBER','1','7788') +('5402','4','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5402 MEMBER','1','7789') +('5403','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,NULL,'"5403 MEMBER','1','7790') +('5403','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,NULL,'"5403 MEMBER','1','7791') +('5403','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,NULL,'"5403 MEMBER','1','7792') +('10461','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10461 MEMBER','1','7793') +('10461','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10461 MEMBER','1','7794') +('10461','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10461 MEMBER','1','7795') +('10462','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10462 MEMBER','1','7796') +('10462','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10462 MEMBER','1','7797') +('10462','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10462 MEMBER','1','7798') +('10463','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10463 MEMBER','1','7799') +('10448','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10448 MEMBER','1','7800') +('10464','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10464 MEMBER','1','7801') +('645','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',1273.06,'999','0','"645 MEMBER','1','7802') +('4559','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',2151.61,'999','0','"4559 MEMBER','1','7803') +('4559','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',2151.61,'999','0','"4559 MEMBER','1','7804') +('7882','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7882 MEMBER','1','7805') +('10467','2','LASTNAME','FIRSTNAME',999.99,6.61,'10',20.00,'1','0','1','PC','3','1','0',0.00,'999','0','"10467 MEMBER','1','7806') +('10467','3','LASTNAME','FIRSTNAME',999.99,6.61,'10',20.00,'1','0','1','PC','3','1','0',0.00,'999','0','"10467 MEMBER','1','7807') +('10467','4','LASTNAME','FIRSTNAME',999.99,6.61,'10',20.00,'1','0','1','PC','3','1','0',0.00,'999','0','"10467 MEMBER','1','7808') +('8184','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8184 MEMBER','1','7809') +('10468','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10468 MEMBER','1','7810') +('10468','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10468 MEMBER','1','7811') +('10469','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10469 MEMBER','1','7812') +('227','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1584.60,'999','0','"227 MEMBER','1','7813') +('10471','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10471 MEMBER','1','7814') +('10473','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10473 MEMBER','1','7815') +('10474','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10474 MEMBER','1','7816') +('10487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10487 MEMBER','1','7817') +('10488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10488 MEMBER','1','7818') +('10489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10489 MEMBER','1','7819') +('10490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10490 MEMBER','1','7820') +('10491','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10491 MEMBER','1','7821') +('10492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10492 MEMBER','1','7822') +('10493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10493 MEMBER','1','7823') +('10494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10494 MEMBER','1','7824') +('10495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10495 MEMBER','1','7825') +('10496','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10496 MEMBER','1','7826') +('10497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10497 MEMBER','1','7827') +('10498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10498 MEMBER','1','7828') +('10499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10499 MEMBER','1','7829') +('10500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10500 MEMBER','1','7830') +('10501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10501 MEMBER','1','7831') +('10502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10502 MEMBER','1','7832') +('10503','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10503 MEMBER','1','7833') +('10504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10504 MEMBER','1','7834') +('10505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10505 MEMBER','1','7835') +('10506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10506 MEMBER','1','7836') +('10507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10507 MEMBER','1','7837') +('10508','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10508 MEMBER','1','7838') +('10509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10509 MEMBER','1','7839') +('10510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10510 MEMBER','1','7840') +('10511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10511 MEMBER','1','7841') +('10512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10512 MEMBER','1','7842') +('10513','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10513 MEMBER','1','7843') +('10514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10514 MEMBER','1','7844') +('10515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10515 MEMBER','1','7845') +('10516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10516 MEMBER','1','7846') +('10517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10517 MEMBER','1','7847') +('10518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10518 MEMBER','1','7848') +('10519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10519 MEMBER','1','7849') +('10520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10520 MEMBER','1','7850') +('10521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10521 MEMBER','1','7851') +('10522','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','1','"10522 MEMBER','1','7852') +('10523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10523 MEMBER','1','7853') +('10524','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10524 MEMBER','1','7854') +('10525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10525 MEMBER','1','7855') +('10526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10526 MEMBER','1','7856') +('5405','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5405 MEMBER','1','7857') +('5405','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5405 MEMBER','1','7858') +('10479','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10479 MEMBER','1','7859') +('5410','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5410 MEMBER','1','15293') +('167','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',3299.10,'999','0','"167 MEMBER','1','15296') +('10480','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10480 MEMBER','1','7862') +('10480','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10480 MEMBER','1','7863') +('10480','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10480 MEMBER','1','7864') +('10482','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10482 MEMBER','1','7865') +('10481','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10481 MEMBER','1','7866') +('8856','2','LASTNAME','FIRSTNAME',999.99,7.94,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8856 MEMBER','1','7867') +('8856','4','LASTNAME','FIRSTNAME',999.99,7.94,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8856 MEMBER','1','7868') +('10343','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10343 MEMBER','1','7869') +('10486','2','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','0','1','PC','3','1','0',0.00,'999','1','"10486 MEMBER','1','7870') +('8621','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8621 MEMBER','1','7871') +('8651','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8651 MEMBER','1','7872') +('9839','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9839 MEMBER','1','7873') +('9839','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9839 MEMBER','1','7874') +('10485','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10485 MEMBER','1','7875') +('9126','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9126 MEMBER','1','7876') +('10487','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10487 MEMBER','1','7877') +('10488','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10488 MEMBER','1','7878') +('10490','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10490 MEMBER','1','7879') +('10490','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10490 MEMBER','1','7880') +('1619','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',35.85,'999','1','"1619 MEMBER','1','7881') +('10000','2','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','PC','3','1','0',0.00,'999','1','"10000 MEMBER','1','15317') +('10493','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10493 MEMBER','1','7883') +('10493','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10493 MEMBER','1','7884') +('10494','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10494 MEMBER','1','7885') +('10495','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10495 MEMBER','1','7886') +('10495','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10495 MEMBER','1','7887') +('10495','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10495 MEMBER','1','7888') +('10496','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10496 MEMBER','1','7889') +('10497','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10497 MEMBER','1','7890') +('10257','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10257 MEMBER','1','7891') +('10257','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10257 MEMBER','1','7892') +('10498','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10498 MEMBER','1','7893') +('10499','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10499 MEMBER','1','7894') +('10499','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10499 MEMBER','1','7895') +('6841','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6841 MEMBER','1','7898') +('10503','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10503 MEMBER','1','7899') +('9745','2','LASTNAME','FIRSTNAME',999.99,15.74,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9745 MEMBER','1','7901') +('9745','3','LASTNAME','FIRSTNAME',999.99,15.74,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9745 MEMBER','1','7902') +('10506','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10506 MEMBER','1','7903') +('10507','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10507 MEMBER','1','7904') +('7328','2','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','1','"7328 MEMBER','1','7905') +('5408','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5408 MEMBER','1','7906') +('5409','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5409 MEMBER','1','7907') +('5409','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5409 MEMBER','1','7908') +('9940','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9940 MEMBER','1','7909') +('2389','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3752.29,'999','0','"2389 MEMBER','1','7910') +('2389','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3752.29,'999','0','"2389 MEMBER','1','7911') +('10527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10527 MEMBER','1','7912') +('10528','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10528 MEMBER','1','7913') +('10529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10529 MEMBER','1','7914') +('10530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10530 MEMBER','1','7915') +('10531','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10531 MEMBER','1','7916') +('10532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10532 MEMBER','1','7917') +('10533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10533 MEMBER','1','7918') +('10534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10534 MEMBER','1','7919') +('10535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10535 MEMBER','1','7920') +('10536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10536 MEMBER','1','7921') +('10537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10537 MEMBER','1','7922') +('10538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10538 MEMBER','1','7923') +('10539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10539 MEMBER','1','7924') +('10540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10540 MEMBER','1','7925') +('10541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10541 MEMBER','1','7926') +('10542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10542 MEMBER','1','7927') +('10543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10543 MEMBER','1','7928') +('10544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10544 MEMBER','1','7929') +('10545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10545 MEMBER','1','7930') +('10546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10546 MEMBER','1','7931') +('10547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10547 MEMBER','1','7932') +('10548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10548 MEMBER','1','7933') +('10549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10549 MEMBER','1','7934') +('10550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10550 MEMBER','1','7935') +('10551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10551 MEMBER','1','7936') +('10552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10552 MEMBER','1','7937') +('10553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10553 MEMBER','1','7938') +('10554','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10554 MEMBER','1','7939') +('10555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10555 MEMBER','1','7940') +('10556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10556 MEMBER','1','7941') +('10557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10557 MEMBER','1','7942') +('10558','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10558 MEMBER','1','7943') +('10559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10559 MEMBER','1','7944') +('10560','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10560 MEMBER','1','7945') +('10561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10561 MEMBER','1','7946') +('10562','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10562 MEMBER','1','7947') +('10563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10563 MEMBER','1','7948') +('10564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10564 MEMBER','1','7949') +('10565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10565 MEMBER','1','7950') +('10566','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10566 MEMBER','1','7951') +('8111','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8111 MEMBER','1','7952') +('8111','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8111 MEMBER','1','7953') +('7739','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7739 MEMBER','1','15287') +('10526','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10526 MEMBER','1','15266') +('6703','2','LASTNAME','FIRSTNAME',999.99,43.37,'10',80.00,'1','1','1','PC','3','1','0',591.96,'999','0','"6703 MEMBER','1','15321') +('7102','2','LASTNAME','FIRSTNAME',999.99,23.23,'10',80.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7102 MEMBER','1','15308') +('10513','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10513 MEMBER','1','15221') +('10513','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10513 MEMBER','1','15222') +('10513','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10513 MEMBER','1','15223') +('10514','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10514 MEMBER','1','15224') +('6757','2','LASTNAME','FIRSTNAME',NULL,91.27,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"6757 MEMBER','1','15225') +('10515','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10515 MEMBER','1','15226') +('9667','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9667 MEMBER','1','15227') +('6589','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6589 MEMBER','1','15228') +('9455','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9455 MEMBER','1','15229') +('9319','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9319 MEMBER','1','15230') +('6514','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6514 MEMBER','1','15231') +('9580','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9580 MEMBER','1','15232') +('9580','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9580 MEMBER','1','15233') +('9580','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9580 MEMBER','1','15234') +('10516','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10516 MEMBER','1','15235') +('9742','2','LASTNAME','FIRSTNAME',999.99,10.78,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9742 MEMBER','1','15239') +('7434','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','1',NULL,NULL,'0','"7434 MEMBER','1','7954') +('4300','3','LASTNAME','FIRSTNAME',NULL,25.04,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"4300 MEMBER','1','7955') +('6841','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6841 MEMBER','1','7956') +('6041','2','LASTNAME','FIRSTNAME',999.99,10.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6041 MEMBER','1','7957') +('7402','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7402 MEMBER','1','7958') +('7601','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7601 MEMBER','1','7959') +('7602','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7602 MEMBER','1','7960') +('7603','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7603 MEMBER','1','7961') +('7604','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7604 MEMBER','1','7962') +('7599','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7599 MEMBER','1','7963') +('7604','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7604 MEMBER','1','7964') +('7604','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7604 MEMBER','1','7965') +('7510','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7510 MEMBER','1','7966') +('7524','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7524 MEMBER','1','7967') +('7525','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7525 MEMBER','1','7968') +('7526','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7526 MEMBER','1','7969') +('7527','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7527 MEMBER','1','7970') +('7528','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7528 MEMBER','1','7971') +('7529','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7529 MEMBER','1','7972') +('383','3','LASTNAME','FIRSTNAME',NULL,45.56,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"383 MEMBER','1','7973') +('383','4','LASTNAME','FIRSTNAME',NULL,45.56,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"383 MEMBER','1','7974') +('7551','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7551 MEMBER','1','7975') +('7605','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7605 MEMBER','1','7976') +('7606','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7606 MEMBER','1','7977') +('7607','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7607 MEMBER','1','7978') +('7608','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7608 MEMBER','1','7979') +('7530','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7530 MEMBER','1','7980') +('7531','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7531 MEMBER','1','7981') +('7533','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7533 MEMBER','1','7982') +('7535','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7535 MEMBER','1','7983') +('7536','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7536 MEMBER','1','7984') +('7537','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7537 MEMBER','1','7985') +('7542','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7542 MEMBER','1','7986') +('7541','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7541 MEMBER','1','7987') +('7540','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7540 MEMBER','1','7988') +('7539','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7539 MEMBER','1','7989') +('7538','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7538 MEMBER','1','7990') +('7543','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7543 MEMBER','1','7991') +('5257','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','1','0',0.00,'999','0','"5257 MEMBER','1','7992') +('7633','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7633 MEMBER','1','7993') +('7634','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7634 MEMBER','1','7994') +('7635','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7635 MEMBER','1','7995') +('7636','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7636 MEMBER','1','7996') +('7637','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7637 MEMBER','1','7997') +('7638','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7638 MEMBER','1','7998') +('7639','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7639 MEMBER','1','7999') +('7640','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7640 MEMBER','1','8000') +('7641','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7641 MEMBER','1','8001') +('7642','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7642 MEMBER','1','8002') +('7643','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7643 MEMBER','1','8003') +('7644','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7644 MEMBER','1','8004') +('7645','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7645 MEMBER','1','8005') +('7646','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7646 MEMBER','1','8006') +('7647','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7647 MEMBER','1','8007') +('7648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7648 MEMBER','1','8008') +('7649','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7649 MEMBER','1','8009') +('7650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7650 MEMBER','1','8010') +('7651','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7651 MEMBER','1','8011') +('7652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7652 MEMBER','1','8012') +('7653','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7653 MEMBER','1','8013') +('7654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7654 MEMBER','1','8014') +('7655','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7655 MEMBER','1','8015') +('7656','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7656 MEMBER','1','8016') +('7657','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7657 MEMBER','1','8017') +('7658','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7658 MEMBER','1','8018') +('7659','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7659 MEMBER','1','8019') +('7660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7660 MEMBER','1','8020') +('7661','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7661 MEMBER','1','8021') +('7662','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7662 MEMBER','1','8022') +('7663','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7663 MEMBER','1','8023') +('7664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7664 MEMBER','1','8024') +('7665','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7665 MEMBER','1','8025') +('7666','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7666 MEMBER','1','8026') +('7667','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7667 MEMBER','1','8027') +('7668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7668 MEMBER','1','8028') +('7669','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7669 MEMBER','1','8029') +('7670','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7670 MEMBER','1','8030') +('7671','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7671 MEMBER','1','8031') +('7672','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7672 MEMBER','1','8032') +('8141','3','LASTNAME','FIRSTNAME',999.99,1.29,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8141 MEMBER','1','8033') +('7401','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7401 MEMBER','1','8034') +('7401','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7401 MEMBER','1','8035') +('7434','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','1',NULL,NULL,'0','"7434 MEMBER','1','8036') +('8112','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8112 MEMBER','1','8037') +('8114','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8114 MEMBER','1','8038') +('8113','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8113 MEMBER','1','8039') +('8113','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8113 MEMBER','1','8040') +('8116','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8116 MEMBER','1','8041') +('6467','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6467 MEMBER','1','8042') +('8126','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8126 MEMBER','1','8043') +('8121','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','1','0',NULL,NULL,'0','"8121 MEMBER','1','8044') +('8121','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','1','0',NULL,NULL,'0','"8121 MEMBER','1','8045') +('8120','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8120 MEMBER','1','8046') +('8120','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8120 MEMBER','1','8047') +('8119','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8119 MEMBER','1','8048') +('8127','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8127 MEMBER','1','8049') +('8128','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8128 MEMBER','1','8050') +('8128','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8128 MEMBER','1','8051') +('6015','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6015 MEMBER','1','8052') +('8521','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"8521 MEMBER','1','8053') +('8155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8155 MEMBER','1','8054') +('8156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8156 MEMBER','1','8055') +('8157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8157 MEMBER','1','8056') +('8159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8159 MEMBER','1','8057') +('8160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8160 MEMBER','1','8058') +('8162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8162 MEMBER','1','8059') +('8164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8164 MEMBER','1','8060') +('8165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8165 MEMBER','1','8061') +('8167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8167 MEMBER','1','8062') +('8169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8169 MEMBER','1','8063') +('8170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8170 MEMBER','1','8064') +('8171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8171 MEMBER','1','8065') +('8172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8172 MEMBER','1','8066') +('8173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8173 MEMBER','1','8067') +('8174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8174 MEMBER','1','8068') +('8175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8175 MEMBER','1','8069') +('8176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8176 MEMBER','1','8070') +('8177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8177 MEMBER','1','8071') +('8178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8178 MEMBER','1','8072') +('8179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8179 MEMBER','1','8073') +('8180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8180 MEMBER','1','8074') +('8181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8181 MEMBER','1','8075') +('8182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8182 MEMBER','1','8076') +('8538','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8538 MEMBER','1','8077') +('8135','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8135 MEMBER','1','8078') +('8136','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8136 MEMBER','1','8079') +('8136','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8136 MEMBER','1','8080') +('8137','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8137 MEMBER','1','8081') +('8138','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8138 MEMBER','1','8082') +('8139','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8139 MEMBER','1','8083') +('8140','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8140 MEMBER','1','8084') +('8140','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8140 MEMBER','1','8085') +('8143','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8143 MEMBER','1','8086') +('8143','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8143 MEMBER','1','8087') +('8183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8183 MEMBER','1','8088') +('8185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8185 MEMBER','1','8089') +('8191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8191 MEMBER','1','8090') +('8192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8192 MEMBER','1','8091') +('8197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8197 MEMBER','1','8092') +('8199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8199 MEMBER','1','8093') +('8156','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8156 MEMBER','1','8094') +('7503','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"7503 MEMBER','1','8095') +('7504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7504 MEMBER','1','8096') +('7505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7505 MEMBER','1','8097') +('7506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7506 MEMBER','1','8098') +('7507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7507 MEMBER','1','8099') +('7508','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7508 MEMBER','1','8100') +('7509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7509 MEMBER','1','8101') +('7510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7510 MEMBER','1','8102') +('7511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7511 MEMBER','1','8103') +('7512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7512 MEMBER','1','8104') +('10457','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10457 MEMBER','1','8105') +('8249','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8249 MEMBER','1','8106') +('7446','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7446 MEMBER','1','8107') +('7447','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7447 MEMBER','1','8108') +('7448','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7448 MEMBER','1','8109') +('7449','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7449 MEMBER','1','8110') +('7450','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7450 MEMBER','1','8111') +('7451','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7451 MEMBER','1','8112') +('7452','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7452 MEMBER','1','8113') +('7453','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7453 MEMBER','1','8114') +('8388','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8388 MEMBER','1','8115') +('7455','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7455 MEMBER','1','8116') +('7456','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7456 MEMBER','1','8117') +('7457','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7457 MEMBER','1','8118') +('9436','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9436 MEMBER','1','8119') +('7459','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7459 MEMBER','1','8120') +('8388','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8388 MEMBER','1','8121') +('7461','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7461 MEMBER','1','8122') +('7462','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7462 MEMBER','1','8123') +('7463','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7463 MEMBER','1','8124') +('7464','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7464 MEMBER','1','8125') +('7465','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7465 MEMBER','1','8126') +('7466','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7466 MEMBER','1','8127') +('7467','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7467 MEMBER','1','8128') +('7468','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7468 MEMBER','1','8129') +('7469','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7469 MEMBER','1','8130') +('7470','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7470 MEMBER','1','8131') +('8237','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8237 MEMBER','1','8132') +('7472','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7472 MEMBER','1','8133') +('7473','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7473 MEMBER','1','8134') +('7474','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7474 MEMBER','1','8135') +('7476','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7476 MEMBER','1','8136') +('7477','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7477 MEMBER','1','8137') +('7478','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7478 MEMBER','1','8138') +('7478','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7478 MEMBER','1','8139') +('7478','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7478 MEMBER','1','8140') +('6365','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6365 MEMBER','1','8141') +('4682','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"4682 MEMBER','1','8142') +('6222','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6222 MEMBER','1','8143') +('4046','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"4046 MEMBER','1','8144') +('7481','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7481 MEMBER','1','8145') +('7482','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7482 MEMBER','1','8146') +('7483','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7483 MEMBER','1','8147') +('7484','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7484 MEMBER','1','8148') +('7485','2','LASTNAME','FIRSTNAME',999.00,7.25,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7485 MEMBER','1','8149') +('7486','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7486 MEMBER','1','8150') +('7487','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7487 MEMBER','1','8151') +('7488','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7488 MEMBER','1','8152') +('7490','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7490 MEMBER','1','8153') +('7491','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7491 MEMBER','1','8154') +('7492','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7492 MEMBER','1','8155') +('7493','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7493 MEMBER','1','8156') +('7494','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7494 MEMBER','1','8157') +('7495','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7495 MEMBER','1','8158') +('7496','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7496 MEMBER','1','8159') +('7497','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7497 MEMBER','1','8160') +('7498','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7498 MEMBER','1','8161') +('7499','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7499 MEMBER','1','8162') +('7501','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7501 MEMBER','1','8163') +('7513','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7513 MEMBER','1','8164') +('7514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7514 MEMBER','1','8165') +('7515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7515 MEMBER','1','8166') +('7516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7516 MEMBER','1','8167') +('7517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7517 MEMBER','1','8168') +('7518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7518 MEMBER','1','8169') +('7519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7519 MEMBER','1','8170') +('7520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7520 MEMBER','1','8171') +('7521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7521 MEMBER','1','8172') +('7522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7522 MEMBER','1','8173') +('7523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7523 MEMBER','1','8174') +('7524','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7524 MEMBER','1','8175') +('7525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7525 MEMBER','1','8176') +('7526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7526 MEMBER','1','8177') +('7527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7527 MEMBER','1','8178') +('7528','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7528 MEMBER','1','8179') +('7529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7529 MEMBER','1','8180') +('7530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7530 MEMBER','1','8181') +('7531','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7531 MEMBER','1','8182') +('7532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7532 MEMBER','1','8183') +('7533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7533 MEMBER','1','8184') +('7534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7534 MEMBER','1','8185') +('7535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7535 MEMBER','1','8186') +('7536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7536 MEMBER','1','8187') +('7537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7537 MEMBER','1','8188') +('7538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7538 MEMBER','1','8189') +('7539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7539 MEMBER','1','8190') +('7540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7540 MEMBER','1','8191') +('7541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7541 MEMBER','1','8192') +('7542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7542 MEMBER','1','8193') +('7543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7543 MEMBER','1','8194') +('7544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7544 MEMBER','1','8195') +('7545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7545 MEMBER','1','8196') +('7546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7546 MEMBER','1','8197') +('7547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7547 MEMBER','1','8198') +('7548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7548 MEMBER','1','8199') +('7549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7549 MEMBER','1','8200') +('7550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7550 MEMBER','1','8201') +('7551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7551 MEMBER','1','8202') +('7552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7552 MEMBER','1','8203') +('5206','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5206 MEMBER','1','8204') +('4957','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4957 MEMBER','1','8205') +('4957','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4957 MEMBER','1','8206') +('6023','2','LASTNAME','FIRSTNAME',999.00,'-6.42','0',1000.00,'1','0','1','REG','2','0','0',0.00,'999','0','"6023 MEMBER','1','8207') +('6023','3','LASTNAME','FIRSTNAME',NULL,'-6.42','0',1000.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6023 MEMBER','1','8208') +('6023','4','LASTNAME','FIRSTNAME',NULL,'-6.42','0',1000.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6023 MEMBER','1','8209') +('2942','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"2942 MEMBER','1','8210') +('6024','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"6024 MEMBER','1','8211') +('4123','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"4123 MEMBER','1','8212') +('1693','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"1693 MEMBER','1','8213') +('6534','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6534 MEMBER','1','8214') +('8072','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8072 MEMBER','1','8215') +('6764','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"6764 MEMBER','1','8216') +('7020','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7020 MEMBER','1','8217') +('6447','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'0','"6447 MEMBER','1','8218') +('7869','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7869 MEMBER','1','8219') +('8376','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8376 MEMBER','1','8220') +('7414','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7414 MEMBER','1','8221') +('7415','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7415 MEMBER','1','8222') +('7099','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7099 MEMBER','1','8223') +('7099','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7099 MEMBER','1','8224') +('7101','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7101 MEMBER','1','8225') +('7104','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7104 MEMBER','1','8226') +('7390','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7390 MEMBER','1','8227') +('7394','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7394 MEMBER','1','8228') +('7394','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7394 MEMBER','1','8229') +('7396','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7396 MEMBER','1','8230') +('7396','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7396 MEMBER','1','8231') +('7553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7553 MEMBER','1','8232') +('7554','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7554 MEMBER','1','8233') +('7555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7555 MEMBER','1','8234') +('7556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7556 MEMBER','1','8235') +('7557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7557 MEMBER','1','8236') +('7558','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7558 MEMBER','1','8237') +('7559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7559 MEMBER','1','8238') +('7560','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"7560 MEMBER','1','8239') +('7561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7561 MEMBER','1','8240') +('7562','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7562 MEMBER','1','8241') +('7563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7563 MEMBER','1','8242') +('7564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7564 MEMBER','1','8243') +('7565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7565 MEMBER','1','8244') +('7566','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7566 MEMBER','1','8245') +('7567','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7567 MEMBER','1','8246') +('7568','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7568 MEMBER','1','8247') +('7569','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7569 MEMBER','1','8248') +('7570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7570 MEMBER','1','8249') +('7571','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7571 MEMBER','1','8250') +('7572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7572 MEMBER','1','8251') +('7573','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7573 MEMBER','1','8252') +('7574','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7574 MEMBER','1','8253') +('7575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7575 MEMBER','1','8254') +('7576','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7576 MEMBER','1','8255') +('7577','1','LASTNAME','FIRSTNAME',999.99,3.59,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7577 MEMBER','1','8256') +('7578','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7578 MEMBER','1','8257') +('7579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7579 MEMBER','1','8258') +('7580','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7580 MEMBER','1','8259') +('7581','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7581 MEMBER','1','8260') +('7582','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7582 MEMBER','1','8261') +('7583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7583 MEMBER','1','8262') +('7584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7584 MEMBER','1','8263') +('7585','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7585 MEMBER','1','8264') +('7586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7586 MEMBER','1','8265') +('7587','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7587 MEMBER','1','8266') +('7588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7588 MEMBER','1','8267') +('7589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7589 MEMBER','1','8268') +('7590','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7590 MEMBER','1','8269') +('7591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7591 MEMBER','1','8270') +('7592','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7592 MEMBER','1','8271') +('4975','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4975 MEMBER','1','8272') +('7103','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7103 MEMBER','1','8274') +('2329','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"2329 MEMBER','1','8275') +('7125','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7125 MEMBER','1','8276') +('7125','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7125 MEMBER','1','8277') +('7130','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7130 MEMBER','1','8278') +('7130','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7130 MEMBER','1','8279') +('7131','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7131 MEMBER','1','8280') +('7131','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7131 MEMBER','1','8281') +('7132','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7132 MEMBER','1','8282') +('7132','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7132 MEMBER','1','8283') +('7134','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0',NULL,NULL,NULL,'0','"7134 MEMBER','1','8284') +('7141','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7141 MEMBER','1','8285') +('7170','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7170 MEMBER','1','8286') +('7187','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7187 MEMBER','1','8287') +('7187','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7187 MEMBER','1','8288') +('7188','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7188 MEMBER','1','8289') +('7188','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7188 MEMBER','1','8290') +('450','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"450 MEMBER','1','8291') +('7192','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7192 MEMBER','1','8292') +('7222','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7222 MEMBER','1','8293') +('7224','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7224 MEMBER','1','8294') +('7224','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7224 MEMBER','1','8295') +('7225','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7225 MEMBER','1','8296') +('7231','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7231 MEMBER','1','8297') +('7231','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7231 MEMBER','1','8298') +('7593','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7593 MEMBER','1','8299') +('7594','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7594 MEMBER','1','8300') +('7595','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7595 MEMBER','1','8301') +('7596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7596 MEMBER','1','8302') +('7597','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7597 MEMBER','1','8303') +('7598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7598 MEMBER','1','8304') +('7599','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7599 MEMBER','1','8305') +('7600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7600 MEMBER','1','8306') +('7601','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7601 MEMBER','1','8307') +('7602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7602 MEMBER','1','8308') +('7603','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7603 MEMBER','1','8309') +('7604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7604 MEMBER','1','8310') +('7605','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7605 MEMBER','1','8311') +('7606','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7606 MEMBER','1','8312') +('7607','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7607 MEMBER','1','8313') +('7608','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7608 MEMBER','1','8314') +('7609','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7609 MEMBER','1','8315') +('7610','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7610 MEMBER','1','8316') +('7611','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7611 MEMBER','1','8317') +('7612','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7612 MEMBER','1','8318') +('7613','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7613 MEMBER','1','8319') +('7614','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7614 MEMBER','1','8320') +('7615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7615 MEMBER','1','8321') +('7616','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7616 MEMBER','1','8322') +('7617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7617 MEMBER','1','8323') +('7618','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7618 MEMBER','1','8324') +('7619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7619 MEMBER','1','8325') +('7620','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7620 MEMBER','1','8326') +('7621','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7621 MEMBER','1','8327') +('7622','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7622 MEMBER','1','8328') +('7623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7623 MEMBER','1','8329') +('7624','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7624 MEMBER','1','8330') +('7625','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7625 MEMBER','1','8331') +('7626','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7626 MEMBER','1','8332') +('7627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7627 MEMBER','1','8333') +('7628','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7628 MEMBER','1','8334') +('7629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7629 MEMBER','1','8335') +('7630','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7630 MEMBER','1','8336') +('7631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7631 MEMBER','1','8337') +('7632','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7632 MEMBER','1','8338') +('6882','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"6882 MEMBER','1','8339') +('7255','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7255 MEMBER','1','8340') +('7259','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7259 MEMBER','1','8341') +('7259','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7259 MEMBER','1','8342') +('7260','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7260 MEMBER','1','8343') +('7261','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7261 MEMBER','1','8344') +('7263','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7263 MEMBER','1','8345') +('6912','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"6912 MEMBER','1','8347') +('7270','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7270 MEMBER','1','8348') +('7270','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7270 MEMBER','1','8349') +('7273','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7273 MEMBER','1','8350') +('7278','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7278 MEMBER','1','8351') +('7278','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"7278 MEMBER','1','8352') +('6796','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.62,'999','0','"6796 MEMBER','1','8353') +('6629','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"6629 MEMBER','1','8354') +('6535','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6535 MEMBER','1','8355') +('9839','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9839 MEMBER','1','8356') +('3145','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3145 MEMBER','1','8358') +('5195','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5195 MEMBER','1','8359') +('4901','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4901 MEMBER','1','8360') +('4901','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4901 MEMBER','1','8361') +('4378','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"4378 MEMBER','1','8362') +('4378','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"4378 MEMBER','1','8363') +('6969','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"6969 MEMBER','1','8364') +('6920','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"6920 MEMBER','1','8365') +('6794','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"6794 MEMBER','1','8366') +('6798','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"6798 MEMBER','1','8367') +('6795','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'0','"6795 MEMBER','1','8368') +('8428','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8428 MEMBER','1','8369') +('8613','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8613 MEMBER','1','8370') +('3145','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3145 MEMBER','1','8371') +('6499','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6499 MEMBER','1','8372') +('376','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"376 MEMBER','1','8373') +('2555','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0',NULL,NULL,NULL,'1','"2555 MEMBER','1','8374') +('4507','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4507 MEMBER','1','8375') +('7572','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7572 MEMBER','1','8376') +('7573','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7573 MEMBER','1','8377') +('7574','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7574 MEMBER','1','8378') +('7575','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7575 MEMBER','1','8379') +('7576','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7576 MEMBER','1','8380') +('7577','2','LASTNAME','FIRSTNAME',999.00,3.59,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7577 MEMBER','1','8381') +('7572','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7572 MEMBER','1','8382') +('7574','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7574 MEMBER','1','8383') +('7575','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0',NULL,NULL,NULL,'0','"7575 MEMBER','1','8384') +('7576','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7576 MEMBER','1','8385') +('7576','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7576 MEMBER','1','8386') +('2918','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2918 MEMBER','1','8387') +('8618','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8618 MEMBER','1','8388') +('1819','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1084.89,'999','0','"1819 MEMBER','1','8389') +('473','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"473 MEMBER','1','8390') +('7402','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7402 MEMBER','1','8391') +('7404','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7404 MEMBER','1','8392') +('7404','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7404 MEMBER','1','8393') +('7418','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7418 MEMBER','1','8394') +('7420','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7420 MEMBER','1','8395') +('7420','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7420 MEMBER','1','8396') +('6982','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6982 MEMBER','1','8397') +('7424','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7424 MEMBER','1','8398') +('7444','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7444 MEMBER','1','8399') +('7431','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7431 MEMBER','1','8400') +('7438','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7438 MEMBER','1','8401') +('7440','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7440 MEMBER','1','8402') +('7443','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7443 MEMBER','1','8403') +('7443','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7443 MEMBER','1','8404') +('4569','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',394.49,'999','0','"4569 MEMBER','1','8405') +('7445','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7445 MEMBER','1','8406') +('7544','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7544 MEMBER','1','8407') +('7545','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7545 MEMBER','1','8408') +('7546','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7546 MEMBER','1','8409') +('7547','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7547 MEMBER','1','8410') +('7550','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7550 MEMBER','1','8411') +('7549','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7549 MEMBER','1','8412') +('7553','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7553 MEMBER','1','8413') +('7551','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7551 MEMBER','1','8414') +('7552','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7552 MEMBER','1','8415') +('7554','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7554 MEMBER','1','8416') +('7555','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7555 MEMBER','1','8417') +('7556','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7556 MEMBER','1','8418') +('7557','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7557 MEMBER','1','8419') +('7558','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7558 MEMBER','1','8420') +('7559','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7559 MEMBER','1','8421') +('7560','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','INACT','0','0','0',0.00,'999','1','"7560 MEMBER','1','8422') +('7561','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7561 MEMBER','1','8423') +('7562','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7562 MEMBER','1','8424') +('7563','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7563 MEMBER','1','8425') +('7564','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7564 MEMBER','1','8426') +('6702','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6702 MEMBER','1','8427') +('5250','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5250 MEMBER','1','8428') +('5250','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5250 MEMBER','1','8429') +('5250','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5250 MEMBER','1','8430') +('5257','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5257 MEMBER','1','8431') +('569','2','LASTNAME','FIRSTNAME',NULL,21.53,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"569 MEMBER','1','8432') +('7673','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7673 MEMBER','1','8433') +('7674','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7674 MEMBER','1','8434') +('7675','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7675 MEMBER','1','8435') +('7676','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7676 MEMBER','1','8436') +('7677','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7677 MEMBER','1','8437') +('7678','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7678 MEMBER','1','8438') +('9786','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9786 MEMBER','1','8439') +('9787','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9787 MEMBER','1','8440') +('9782','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9782 MEMBER','1','8441') +('5317','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5317 MEMBER','1','8442') +('10179','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10179 MEMBER','1','8443') +('9783','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9783 MEMBER','1','8444') +('9783','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9783 MEMBER','1','8445') +('9783','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9783 MEMBER','1','8446') +('9788','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9788 MEMBER','1','8447') +('9789','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9789 MEMBER','1','8448') +('9790','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9790 MEMBER','1','8449') +('9810','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9810 MEMBER','1','8450') +('9792','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9792 MEMBER','1','8451') +('9792','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9792 MEMBER','1','8452') +('9792','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9792 MEMBER','1','8453') +('9793','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9793 MEMBER','1','8454') +('9793','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9793 MEMBER','1','8455') +('9794','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9794 MEMBER','1','8456') +('9795','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9795 MEMBER','1','8457') +('9795','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9795 MEMBER','1','8458') +('9796','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9796 MEMBER','1','8459') +('9798','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9798 MEMBER','1','8460') +('9799','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9799 MEMBER','1','8461') +('2860','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2860 MEMBER','1','8462') +('2860','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2860 MEMBER','1','8463') +('9800','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9800 MEMBER','1','8464') +('9802','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9802 MEMBER','1','8465') +('9803','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9803 MEMBER','1','8466') +('9606','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9606 MEMBER','1','8467') +('9486','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9486 MEMBER','1','8468') +('8398','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8398 MEMBER','1','8469') +('9806','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9806 MEMBER','1','8470') +('9806','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9806 MEMBER','1','8471') +('9809','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9809 MEMBER','1','8472') +('9663','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9663 MEMBER','1','8473') +('6321','4','LASTNAME','FIRSTNAME',999.99,68.15,'10',100.00,'1','1','1','PC','3','1','0',3469.19,'999','0','"6321 MEMBER','1','8474') +('8367','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8367 MEMBER','1','8475') +('9663','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9663 MEMBER','1','8476') +('9957','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9957 MEMBER','1','8477') +('10151','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10151 MEMBER','1','8478') +('9813','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9813 MEMBER','1','8479') +('9814','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9814 MEMBER','1','8480') +('9814','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9814 MEMBER','1','8481') +('9817','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9817 MEMBER','1','8482') +('9817','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9817 MEMBER','1','8483') +('9818','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9818 MEMBER','1','8484') +('9818','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9818 MEMBER','1','8485') +('9848','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9848 MEMBER','1','8486') +('9850','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9850 MEMBER','1','8487') +('9851','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9851 MEMBER','1','8488') +('9852','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9852 MEMBER','1','8489') +('9853','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9853 MEMBER','1','8490') +('9854','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9854 MEMBER','1','8491') +('9855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9855 MEMBER','1','8492') +('9856','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9856 MEMBER','1','8493') +('9857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9857 MEMBER','1','8494') +('9858','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9858 MEMBER','1','8495') +('9860','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9860 MEMBER','1','8496') +('9861','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9861 MEMBER','1','8497') +('9862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9862 MEMBER','1','8498') +('9863','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9863 MEMBER','1','8499') +('9864','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9864 MEMBER','1','8500') +('9865','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9865 MEMBER','1','8501') +('9866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9866 MEMBER','1','8502') +('9867','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9867 MEMBER','1','8503') +('9868','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9868 MEMBER','1','8504') +('9869','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9869 MEMBER','1','8505') +('9870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9870 MEMBER','1','8506') +('9871','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9871 MEMBER','1','8507') +('9872','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9872 MEMBER','1','8508') +('9873','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9873 MEMBER','1','8509') +('9874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9874 MEMBER','1','8510') +('9875','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9875 MEMBER','1','8511') +('9876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9876 MEMBER','1','8512') +('9877','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9877 MEMBER','1','8513') +('9878','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9878 MEMBER','1','8514') +('9879','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9879 MEMBER','1','8515') +('9880','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9880 MEMBER','1','8516') +('9881','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9881 MEMBER','1','8517') +('9882','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9882 MEMBER','1','8518') +('9883','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9883 MEMBER','1','8519') +('9884','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9884 MEMBER','1','8520') +('9885','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9885 MEMBER','1','8521') +('9886','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9886 MEMBER','1','8522') +('5378','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"5378 MEMBER','1','8523') +('8195','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8195 MEMBER','1','8524') +('10089','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10089 MEMBER','1','8525') +('9820','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9820 MEMBER','1','8526') +('10123','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10123 MEMBER','1','8527') +('9822','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9822 MEMBER','1','8528') +('8317','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8317 MEMBER','1','8529') +('9824','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9824 MEMBER','1','8530') +('9825','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9825 MEMBER','1','8531') +('9825','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9825 MEMBER','1','8532') +('9825','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9825 MEMBER','1','8533') +('10100','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10100 MEMBER','1','8534') +('4760','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3394.86,'999','0','"4760 MEMBER','1','8535') +('9693','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9693 MEMBER','1','8536') +('9826','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9826 MEMBER','1','8537') +('9826','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9826 MEMBER','1','8538') +('9826','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9826 MEMBER','1','8539') +('9827','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9827 MEMBER','1','8540') +('3188','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3188 MEMBER','1','8541') +('9687','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9687 MEMBER','1','8542') +('9828','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9828 MEMBER','1','8543') +('9828','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9828 MEMBER','1','8544') +('9829','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9829 MEMBER','1','8545') +('9830','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9830 MEMBER','1','8546') +('9831','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9831 MEMBER','1','8547') +('9831','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9831 MEMBER','1','8548') +('9832','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9832 MEMBER','1','8549') +('9832','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9832 MEMBER','1','8550') +('9832','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9832 MEMBER','1','8551') +('9833','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9833 MEMBER','1','8552') +('9834','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9834 MEMBER','1','8553') +('9835','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9835 MEMBER','1','8554') +('9835','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9835 MEMBER','1','8555') +('4782','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4782 MEMBER','1','8556') +('8349','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8349 MEMBER','1','8557') +('9864','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9864 MEMBER','1','8558') +('9876','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9876 MEMBER','1','8559') +('5380','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5380 MEMBER','1','8560') +('5380','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5380 MEMBER','1','8561') +('5380','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5380 MEMBER','1','8562') +('9843','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9843 MEMBER','1','8563') +('9842','2','LASTNAME','FIRSTNAME',999.99,13.89,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9842 MEMBER','1','8564') +('9836','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9836 MEMBER','1','8565') +('9836','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9836 MEMBER','1','8566') +('9837','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9837 MEMBER','1','8567') +('9838','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9838 MEMBER','1','8568') +('10485','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10485 MEMBER','1','8569') +('10498','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10498 MEMBER','1','8570') +('10501','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10501 MEMBER','1','8571') +('9840','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9840 MEMBER','1','8572') +('9841','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9841 MEMBER','1','8573') +('5217','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5217 MEMBER','1','8574') +('5217','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5217 MEMBER','1','8575') +('9845','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9845 MEMBER','1','8576') +('9846','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9846 MEMBER','1','8577') +('9847','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9847 MEMBER','1','8578') +('9886','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9886 MEMBER','1','8579') +('9848','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9848 MEMBER','1','8580') +('9851','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9851 MEMBER','1','8581') +('9852','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9852 MEMBER','1','8582') +('6849','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6849 MEMBER','1','8583') +('10238','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10238 MEMBER','1','8584') +('9887','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9887 MEMBER','1','8585') +('9888','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9888 MEMBER','1','8586') +('9889','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9889 MEMBER','1','8587') +('9890','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9890 MEMBER','1','8588') +('9891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9891 MEMBER','1','8589') +('9892','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9892 MEMBER','1','8590') +('9893','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9893 MEMBER','1','8591') +('9894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9894 MEMBER','1','8592') +('9895','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9895 MEMBER','1','8593') +('9896','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9896 MEMBER','1','8594') +('9897','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9897 MEMBER','1','8595') +('9898','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9898 MEMBER','1','8596') +('9899','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9899 MEMBER','1','8597') +('9900','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9900 MEMBER','1','8598') +('9901','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9901 MEMBER','1','8599') +('9902','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9902 MEMBER','1','8600') +('9903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9903 MEMBER','1','8601') +('9904','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9904 MEMBER','1','8602') +('9905','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9905 MEMBER','1','8603') +('9906','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9906 MEMBER','1','8604') +('9907','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9907 MEMBER','1','8605') +('9908','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9908 MEMBER','1','8606') +('9909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9909 MEMBER','1','8607') +('9910','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9910 MEMBER','1','8608') +('9911','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9911 MEMBER','1','8609') +('9912','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9912 MEMBER','1','8610') +('9913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9913 MEMBER','1','8611') +('9914','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9914 MEMBER','1','8612') +('9915','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9915 MEMBER','1','8613') +('9916','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9916 MEMBER','1','8614') +('9917','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9917 MEMBER','1','8615') +('9918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9918 MEMBER','1','8616') +('9919','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9919 MEMBER','1','8617') +('9920','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9920 MEMBER','1','8618') +('9921','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9921 MEMBER','1','8619') +('9922','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9922 MEMBER','1','8620') +('9923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9923 MEMBER','1','8621') +('9924','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9924 MEMBER','1','8622') +('9925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9925 MEMBER','1','8623') +('9926','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9926 MEMBER','1','8624') +('6035','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6035 MEMBER','1','8625') +('6035','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6035 MEMBER','1','8626') +('10314','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10314 MEMBER','1','8627') +('7798','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7798 MEMBER','1','8628') +('2627','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2627 MEMBER','1','8629') +('8987','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8987 MEMBER','1','8630') +('9180','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9180 MEMBER','1','8632') +('165','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"165 MEMBER','1','8633') +('4542','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4542 MEMBER','1','8634') +('7395','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7395 MEMBER','1','8635') +('10095','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10095 MEMBER','1','8636') +('10142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10142 MEMBER','1','8637') +('9853','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9853 MEMBER','1','8638') +('9853','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9853 MEMBER','1','8639') +('9855','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9855 MEMBER','1','8640') +('9855','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9855 MEMBER','1','8641') +('9855','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9855 MEMBER','1','8642') +('9856','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9856 MEMBER','1','8643') +('9856','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9856 MEMBER','1','8644') +('9856','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9856 MEMBER','1','8645') +('9857','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9857 MEMBER','1','8646') +('9857','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9857 MEMBER','1','8647') +('9860','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9860 MEMBER','1','8648') +('9861','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9861 MEMBER','1','8649') +('9861','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9861 MEMBER','1','8650') +('9862','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9862 MEMBER','1','8651') +('9862','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9862 MEMBER','1','8652') +('9862','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9862 MEMBER','1','8653') +('10483','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10483 MEMBER','1','8654') +('4403','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4403 MEMBER','1','8655') +('9865','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9865 MEMBER','1','8656') +('9865','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9865 MEMBER','1','8657') +('9865','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9865 MEMBER','1','8658') +('9866','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9866 MEMBER','1','8659') +('9867','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9867 MEMBER','1','8660') +('9867','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9867 MEMBER','1','8661') +('9868','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9868 MEMBER','1','8662') +('9868','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9868 MEMBER','1','8663') +('9869','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9869 MEMBER','1','8664') +('9870','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9870 MEMBER','1','8665') +('5387','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5387 MEMBER','1','8666') +('165','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"165 MEMBER','1','8667') +('9903','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9903 MEMBER','1','8668') +('9904','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9904 MEMBER','1','8669') +('9872','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9872 MEMBER','1','8670') +('9872','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9872 MEMBER','1','8671') +('9876','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9876 MEMBER','1','8672') +('9877','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9877 MEMBER','1','8673') +('9878','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9878 MEMBER','1','8674') +('9880','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9880 MEMBER','1','8675') +('9881','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9881 MEMBER','1','8676') +('9881','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9881 MEMBER','1','8677') +('9882','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9882 MEMBER','1','8678') +('9885','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9885 MEMBER','1','8679') +('9888','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9888 MEMBER','1','8680') +('9890','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9890 MEMBER','1','8681') +('9891','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9891 MEMBER','1','8682') +('9892','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9892 MEMBER','1','8683') +('9894','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9894 MEMBER','1','8684') +('9895','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9895 MEMBER','1','8685') +('9897','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9897 MEMBER','1','8686') +('9897','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9897 MEMBER','1','8687') +('9898','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9898 MEMBER','1','8688') +('494','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',8843.42,'999','0','"494 MEMBER','1','8689') +('138','3','LASTNAME','FIRSTNAME',999.99,19.18,'0',20.00,'1','1','1','PC','1','0','0',9998.89,'999','0','"138 MEMBER','1','8690') +('9900','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9900 MEMBER','1','8691') +('9206','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9206 MEMBER','1','8692') +('6918','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6918 MEMBER','1','8693') +('4091','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4091 MEMBER','1','8694') +('9881','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9881 MEMBER','1','8695') +('8698','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8698 MEMBER','1','8696') +('4606','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4606 MEMBER','1','8697') +('6733','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6733 MEMBER','1','8698') +('4556','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4556 MEMBER','1','8699') +('4556','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4556 MEMBER','1','8700') +('9927','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9927 MEMBER','1','8701') +('9928','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9928 MEMBER','1','8702') +('9929','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9929 MEMBER','1','8703') +('9930','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9930 MEMBER','1','8704') +('9931','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9931 MEMBER','1','8705') +('9932','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9932 MEMBER','1','8706') +('9933','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9933 MEMBER','1','8707') +('9934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9934 MEMBER','1','8708') +('9935','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9935 MEMBER','1','8709') +('9936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9936 MEMBER','1','8710') +('9937','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9937 MEMBER','1','8711') +('9938','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9938 MEMBER','1','8712') +('9939','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9939 MEMBER','1','8713') +('9940','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9940 MEMBER','1','8714') +('9941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9941 MEMBER','1','8715') +('9942','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9942 MEMBER','1','8716') +('9943','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9943 MEMBER','1','8717') +('9944','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9944 MEMBER','1','8718') +('9945','1','LASTNAME','FIRSTNAME',999.99,14.41,'10',40.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9945 MEMBER','1','8719') +('9946','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9946 MEMBER','1','8720') +('9947','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9947 MEMBER','1','8721') +('9948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9948 MEMBER','1','8722') +('9949','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9949 MEMBER','1','8723') +('9950','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9950 MEMBER','1','8724') +('9951','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9951 MEMBER','1','8725') +('9952','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9952 MEMBER','1','8726') +('9953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9953 MEMBER','1','8727') +('9954','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9954 MEMBER','1','8728') +('9955','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9955 MEMBER','1','8729') +('9956','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9956 MEMBER','1','8730') +('9957','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9957 MEMBER','1','8731') +('9958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9958 MEMBER','1','8732') +('9959','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9959 MEMBER','1','8733') +('9960','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9960 MEMBER','1','8734') +('9961','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9961 MEMBER','1','8735') +('9962','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9962 MEMBER','1','8736') +('9963','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9963 MEMBER','1','8737') +('9964','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9964 MEMBER','1','8738') +('9965','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9965 MEMBER','1','8739') +('9966','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9966 MEMBER','1','8740') +('10027','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10027 MEMBER','1','8741') +('9901','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9901 MEMBER','1','8742') +('9902','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9902 MEMBER','1','8743') +('9905','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9905 MEMBER','1','8744') +('9906','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9906 MEMBER','1','8745') +('9907','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9907 MEMBER','1','8746') +('9907','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9907 MEMBER','1','8747') +('9909','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9909 MEMBER','1','8748') +('10029','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10029 MEMBER','1','8749') +('10030','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10030 MEMBER','1','8750') +('9212','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9212 MEMBER','1','8751') +('5386','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5386 MEMBER','1','8752') +('5386','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5386 MEMBER','1','8753') +('5386','4','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5386 MEMBER','1','8754') +('9921','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9921 MEMBER','1','8755') +('9923','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9923 MEMBER','1','8756') +('9924','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9924 MEMBER','1','8757') +('9924','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9924 MEMBER','1','8758') +('9924','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9924 MEMBER','1','8759') +('9926','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9926 MEMBER','1','8760') +('9926','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9926 MEMBER','1','8761') +('9926','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9926 MEMBER','1','8762') +('9908','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9908 MEMBER','1','8763') +('9910','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9910 MEMBER','1','8764') +('9910','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9910 MEMBER','1','8765') +('9912','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9912 MEMBER','1','8766') +('10393','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10393 MEMBER','1','8767') +('10062','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10062 MEMBER','1','8768') +('9915','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9915 MEMBER','1','8769') +('9918','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9918 MEMBER','1','8770') +('9918','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9918 MEMBER','1','8771') +('9927','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9927 MEMBER','1','8772') +('9935','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9935 MEMBER','1','8773') +('9928','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9928 MEMBER','1','8774') +('9928','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9928 MEMBER','1','8775') +('9929','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9929 MEMBER','1','8776') +('9930','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9930 MEMBER','1','8777') +('9932','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9932 MEMBER','1','8778') +('9933','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9933 MEMBER','1','8779') +('9933','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9933 MEMBER','1','8780') +('9934','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9934 MEMBER','1','8781') +('9936','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9936 MEMBER','1','8782') +('9936','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9936 MEMBER','1','8783') +('9936','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9936 MEMBER','1','8784') +('9937','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9937 MEMBER','1','8785') +('9937','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9937 MEMBER','1','8786') +('9967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9967 MEMBER','1','8787') +('9969','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9969 MEMBER','1','8788') +('9961','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9961 MEMBER','1','8789') +('9971','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9971 MEMBER','1','8790') +('9972','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9972 MEMBER','1','8791') +('9973','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9973 MEMBER','1','8792') +('9974','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9974 MEMBER','1','8793') +('9975','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9975 MEMBER','1','8794') +('9976','1','LASTNAME','FIRSTNAME',999.99,18.63,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"9976 MEMBER','1','8795') +('9977','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9977 MEMBER','1','8796') +('9978','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9978 MEMBER','1','8797') +('9979','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9979 MEMBER','1','8798') +('9980','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9980 MEMBER','1','8799') +('9981','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9981 MEMBER','1','8800') +('9982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9982 MEMBER','1','8801') +('9983','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9983 MEMBER','1','8802') +('9984','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9984 MEMBER','1','8803') +('9985','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9985 MEMBER','1','8804') +('9986','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9986 MEMBER','1','8805') +('9987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9987 MEMBER','1','8806') +('9988','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9988 MEMBER','1','8807') +('9989','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9989 MEMBER','1','8808') +('9990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9990 MEMBER','1','8809') +('9991','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9991 MEMBER','1','8810') +('9992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9992 MEMBER','1','8811') +('9993','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9993 MEMBER','1','8812') +('9994','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9994 MEMBER','1','8813') +('9995','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9995 MEMBER','1','8814') +('9996','1','LASTNAME','FIRSTNAME',999.99,6.79,'10',25.00,'1','1','1','PC','3','1','0',0.00,'999','1','"9996 MEMBER','1','8815') +('9997','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9997 MEMBER','1','8816') +('9998','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9998 MEMBER','1','8817') +('9999','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9999 MEMBER','1','8818') +('10000','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','PC','3','1','0',0.00,'999','1','"10000 MEMBER','1','8819') +('10001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10001 MEMBER','1','8820') +('10002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10002 MEMBER','1','8821') +('10003','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10003 MEMBER','1','8822') +('10004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10004 MEMBER','1','8823') +('10005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10005 MEMBER','1','8824') +('10006','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10006 MEMBER','1','8825') +('10106','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10106 MEMBER','1','8826') +('10107','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10107 MEMBER','1','8827') +('4746','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4746 MEMBER','1','8828') +('4869','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4869 MEMBER','1','8829') +('9938','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9938 MEMBER','1','8830') +('9938','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9938 MEMBER','1','8831') +('9938','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9938 MEMBER','1','8832') +('9944','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9944 MEMBER','1','8833') +('9947','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9947 MEMBER','1','8834') +('9948','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9948 MEMBER','1','8835') +('9950','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9950 MEMBER','1','8836') +('9951','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9951 MEMBER','1','8837') +('9953','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9953 MEMBER','1','8838') +('9954','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9954 MEMBER','1','8839') +('5369','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5369 MEMBER','1','8840') +('9955','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9955 MEMBER','1','8841') +('9956','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9956 MEMBER','1','8842') +('9956','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9956 MEMBER','1','8843') +('10141','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10141 MEMBER','1','8844') +('10156','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10156 MEMBER','1','8845') +('10157','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10157 MEMBER','1','8846') +('9958','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9958 MEMBER','1','8847') +('9958','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9958 MEMBER','1','8848') +('9961','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9961 MEMBER','1','8849') +('9961','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9961 MEMBER','1','8850') +('9962','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9962 MEMBER','1','8851') +('7362','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7362 MEMBER','1','8852') +('10157','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10157 MEMBER','1','8853') +('6036','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',500.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6036 MEMBER','1','8854') +('9963','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9963 MEMBER','1','8855') +('9965','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9965 MEMBER','1','8856') +('9965','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9965 MEMBER','1','8857') +('9966','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9966 MEMBER','1','8858') +('9968','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9968 MEMBER','1','8859') +('9968','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9968 MEMBER','1','8860') +('9969','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9969 MEMBER','1','8861') +('9971','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9971 MEMBER','1','8862') +('9972','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9972 MEMBER','1','8863') +('2969','2','LASTNAME','FIRSTNAME',999.99,17.94,'0',20.00,'1','1','1','PC','1','0','0',4716.44,'999','0','"2969 MEMBER','1','8864') +('7598','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7598 MEMBER','1','8865') +('8666','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8666 MEMBER','1','8866') +('9973','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9973 MEMBER','1','8867') +('9973','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9973 MEMBER','1','8868') +('9974','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9974 MEMBER','1','8869') +('9977','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9977 MEMBER','1','8870') +('9978','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9978 MEMBER','1','8871') +('9981','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9981 MEMBER','1','8872') +('10007','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10007 MEMBER','1','8873') +('10008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10008 MEMBER','1','8874') +('10009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10009 MEMBER','1','8875') +('10010','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10010 MEMBER','1','8876') +('10011','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10011 MEMBER','1','8877') +('10012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10012 MEMBER','1','8878') +('10013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10013 MEMBER','1','8879') +('10014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10014 MEMBER','1','8880') +('10015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10015 MEMBER','1','8881') +('10016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10016 MEMBER','1','8882') +('10017','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10017 MEMBER','1','8883') +('10018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10018 MEMBER','1','8884') +('10019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10019 MEMBER','1','8885') +('10020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10020 MEMBER','1','8886') +('10021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10021 MEMBER','1','8887') +('10022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10022 MEMBER','1','8888') +('10023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10023 MEMBER','1','8889') +('10024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10024 MEMBER','1','8890') +('10025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10025 MEMBER','1','8891') +('10026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10026 MEMBER','1','8892') +('10027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10027 MEMBER','1','8893') +('10028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10028 MEMBER','1','8894') +('10029','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10029 MEMBER','1','8895') +('10030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10030 MEMBER','1','8896') +('10031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10031 MEMBER','1','8897') +('10032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10032 MEMBER','1','8898') +('10033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10033 MEMBER','1','8899') +('10034','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10034 MEMBER','1','8900') +('10035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"10035 MEMBER','1','8901') +('10036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10036 MEMBER','1','8902') +('10037','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10037 MEMBER','1','8903') +('10038','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10038 MEMBER','1','8904') +('10039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10039 MEMBER','1','8905') +('10040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10040 MEMBER','1','8906') +('10041','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10041 MEMBER','1','8907') +('10042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10042 MEMBER','1','8908') +('10043','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10043 MEMBER','1','8909') +('10044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10044 MEMBER','1','8910') +('10045','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10045 MEMBER','1','8911') +('10046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10046 MEMBER','1','8912') +('6037','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',1000.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6037 MEMBER','1','8913') +('6037','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',1000.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6037 MEMBER','1','8914') +('9983','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9983 MEMBER','1','8915') +('9983','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9983 MEMBER','1','8916') +('9984','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9984 MEMBER','1','8917') +('9986','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9986 MEMBER','1','8918') +('9987','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9987 MEMBER','1','8919') +('9987','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9987 MEMBER','1','8920') +('7306','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7306 MEMBER','1','8921') +('1728','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"1728 MEMBER','1','8922') +('10013','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10013 MEMBER','1','8923') +('9989','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9989 MEMBER','1','8924') +('9991','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9991 MEMBER','1','8925') +('9993','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9993 MEMBER','1','8926') +('9995','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9995 MEMBER','1','8927') +('10017','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10017 MEMBER','1','8928') +('9997','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9997 MEMBER','1','8929') +('9999','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9999 MEMBER','1','8930') +('10025','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10025 MEMBER','1','8931') +('7256','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7256 MEMBER','1','8932') +('9879','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9879 MEMBER','1','8933') +('3122','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"3122 MEMBER','1','8934') +('10004','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10004 MEMBER','1','8935') +('10004','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10004 MEMBER','1','8936') +('10004','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10004 MEMBER','1','8937') +('10005','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10005 MEMBER','1','8938') +('10006','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10006 MEMBER','1','8939') +('10007','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10007 MEMBER','1','8940') +('10007','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10007 MEMBER','1','8941') +('10008','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10008 MEMBER','1','8942') +('10009','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10009 MEMBER','1','8943') +('10009','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10009 MEMBER','1','8944') +('10010','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10010 MEMBER','1','8945') +('10010','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10010 MEMBER','1','8946') +('10015','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10015 MEMBER','1','8947') +('10017','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10017 MEMBER','1','8948') +('10017','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10017 MEMBER','1','8949') +('10018','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10018 MEMBER','1','8950') +('9634','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9634 MEMBER','1','8951') +('10023','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10023 MEMBER','1','8952') +('10024','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10024 MEMBER','1','8953') +('10024','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10024 MEMBER','1','8954') +('10024','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10024 MEMBER','1','8955') +('5394','2','LASTNAME','FIRSTNAME',NULL,8.02,'10',40.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5394 MEMBER','1','8956') +('10047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10047 MEMBER','1','8957') +('10048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10048 MEMBER','1','8958') +('10049','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10049 MEMBER','1','8959') +('10050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10050 MEMBER','1','8960') +('10051','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10051 MEMBER','1','8961') +('10052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10052 MEMBER','1','8962') +('10053','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10053 MEMBER','1','8963') +('10054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10054 MEMBER','1','8964') +('10055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10055 MEMBER','1','8965') +('10056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10056 MEMBER','1','8966') +('10057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10057 MEMBER','1','8967') +('10058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10058 MEMBER','1','8968') +('10059','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10059 MEMBER','1','8969') +('10060','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10060 MEMBER','1','8970') +('10061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10061 MEMBER','1','8971') +('10062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10062 MEMBER','1','8972') +('10063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10063 MEMBER','1','8973') +('10064','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10064 MEMBER','1','8974') +('10065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10065 MEMBER','1','8975') +('10066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10066 MEMBER','1','8976') +('10067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10067 MEMBER','1','8977') +('10068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10068 MEMBER','1','8978') +('10069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10069 MEMBER','1','8979') +('10070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10070 MEMBER','1','8980') +('10071','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"10071 MEMBER','1','8981') +('10072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10072 MEMBER','1','8982') +('10073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10073 MEMBER','1','8983') +('10074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10074 MEMBER','1','8984') +('10075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10075 MEMBER','1','8985') +('10076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10076 MEMBER','1','8986') +('10077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10077 MEMBER','1','8987') +('10078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10078 MEMBER','1','8988') +('10079','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10079 MEMBER','1','8989') +('10080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10080 MEMBER','1','8990') +('10081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10081 MEMBER','1','8991') +('10082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10082 MEMBER','1','8992') +('10083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10083 MEMBER','1','8993') +('10084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10084 MEMBER','1','8994') +('10085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10085 MEMBER','1','8995') +('10086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10086 MEMBER','1','8996') +('8209','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8209 MEMBER','1','8997') +('8213','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8213 MEMBER','1','8998') +('8213','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8213 MEMBER','1','8999') +('6027','3','LASTNAME','FIRSTNAME',NULL,4.99,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6027 MEMBER','1','9000') +('6027','4','LASTNAME','FIRSTNAME',NULL,4.99,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6027 MEMBER','1','9001') +('8215','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8215 MEMBER','1','9002') +('8234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8234 MEMBER','1','9003') +('8235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8235 MEMBER','1','9004') +('8236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8236 MEMBER','1','9005') +('8237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8237 MEMBER','1','9006') +('8238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8238 MEMBER','1','9007') +('8239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8239 MEMBER','1','9008') +('8240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8240 MEMBER','1','9009') +('8241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8241 MEMBER','1','9010') +('8242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8242 MEMBER','1','9011') +('8243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8243 MEMBER','1','9012') +('8244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8244 MEMBER','1','9013') +('8245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8245 MEMBER','1','9014') +('8246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8246 MEMBER','1','9015') +('8247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8247 MEMBER','1','9016') +('8248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8248 MEMBER','1','9017') +('8249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8249 MEMBER','1','9018') +('8250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8250 MEMBER','1','9019') +('8251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8251 MEMBER','1','9020') +('8252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8252 MEMBER','1','9021') +('8253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8253 MEMBER','1','9022') +('8254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8254 MEMBER','1','9023') +('8255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8255 MEMBER','1','9024') +('8256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8256 MEMBER','1','9025') +('8257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8257 MEMBER','1','9026') +('8258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8258 MEMBER','1','9027') +('8259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8259 MEMBER','1','9028') +('8260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8260 MEMBER','1','9029') +('8261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8261 MEMBER','1','9030') +('8262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8262 MEMBER','1','9031') +('8263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8263 MEMBER','1','9032') +('8264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8264 MEMBER','1','9033') +('8265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8265 MEMBER','1','9034') +('8266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8266 MEMBER','1','9035') +('8267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8267 MEMBER','1','9036') +('8268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8268 MEMBER','1','9037') +('8269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8269 MEMBER','1','9038') +('8270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8270 MEMBER','1','9039') +('8271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8271 MEMBER','1','9040') +('8272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8272 MEMBER','1','9041') +('8273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8273 MEMBER','1','9042') +('8219','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8219 MEMBER','1','9043') +('8222','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8222 MEMBER','1','9044') +('8218','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8218 MEMBER','1','9045') +('8220','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8220 MEMBER','1','9046') +('8216','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8216 MEMBER','1','9047') +('8216','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8216 MEMBER','1','9048') +('8216','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8216 MEMBER','1','9049') +('8217','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8217 MEMBER','1','9050') +('8221','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8221 MEMBER','1','9051') +('8221','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8221 MEMBER','1','9052') +('8221','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8221 MEMBER','1','9053') +('8274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8274 MEMBER','1','9054') +('8227','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8227 MEMBER','1','9055') +('8225','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8225 MEMBER','1','9056') +('8225','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8225 MEMBER','1','9057') +('8223','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8223 MEMBER','1','9058') +('8223','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8223 MEMBER','1','9059') +('8223','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8223 MEMBER','1','9060') +('8276','1','LASTNAME','FIRSTNAME',999.99,44.88,'10',100.00,'1','1','1','PC','3','1','0',0.00,'999','1','"8276 MEMBER','1','9061') +('8277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8277 MEMBER','1','9062') +('8278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8278 MEMBER','1','9063') +('8279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8279 MEMBER','1','9064') +('8280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8280 MEMBER','1','9065') +('8281','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8281 MEMBER','1','9066') +('8282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8282 MEMBER','1','9067') +('8283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8283 MEMBER','1','9068') +('8284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8284 MEMBER','1','9069') +('8285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8285 MEMBER','1','9070') +('8286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8286 MEMBER','1','9071') +('8287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8287 MEMBER','1','9072') +('8288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8288 MEMBER','1','9073') +('8289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8289 MEMBER','1','9074') +('8290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8290 MEMBER','1','9075') +('8291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8291 MEMBER','1','9076') +('8292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8292 MEMBER','1','9077') +('8293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8293 MEMBER','1','9078') +('8294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8294 MEMBER','1','9079') +('8295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8295 MEMBER','1','9080') +('8296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8296 MEMBER','1','9081') +('8297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8297 MEMBER','1','9082') +('8298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8298 MEMBER','1','9083') +('8299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8299 MEMBER','1','9084') +('8300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8300 MEMBER','1','9085') +('8301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8301 MEMBER','1','9086') +('8302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8302 MEMBER','1','9087') +('8303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8303 MEMBER','1','9088') +('8304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8304 MEMBER','1','9089') +('8305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8305 MEMBER','1','9090') +('8306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8306 MEMBER','1','9091') +('8307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8307 MEMBER','1','9092') +('8308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8308 MEMBER','1','9093') +('8309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8309 MEMBER','1','9094') +('8310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8310 MEMBER','1','9095') +('8311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8311 MEMBER','1','9096') +('8312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8312 MEMBER','1','9097') +('8313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8313 MEMBER','1','9098') +('8230','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8230 MEMBER','1','9099') +('8228','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8228 MEMBER','1','9100') +('8229','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8229 MEMBER','1','9101') +('8231','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8231 MEMBER','1','9102') +('8232','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8232 MEMBER','1','9103') +('8232','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8232 MEMBER','1','9104') +('8232','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8232 MEMBER','1','9105') +('8234','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8234 MEMBER','1','9106') +('8234','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8234 MEMBER','1','9107') +('8235','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8235 MEMBER','1','9108') +('8235','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8235 MEMBER','1','9109') +('8236','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8236 MEMBER','1','9110') +('8236','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8236 MEMBER','1','9111') +('8236','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8236 MEMBER','1','9112') +('10147','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10147 MEMBER','1','9113') +('8884','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8884 MEMBER','1','9114') +('8889','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8889 MEMBER','1','9115') +('532','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2922.98,'999','1','"532 MEMBER','1','9116') +('8506','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8506 MEMBER','1','9117') +('8666','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8666 MEMBER','1','9118') +('8238','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8238 MEMBER','1','9119') +('8233','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8233 MEMBER','1','9120') +('8233','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8233 MEMBER','1','9121') +('8233','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8233 MEMBER','1','9122') +('4069','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4069 MEMBER','1','9123') +('4069','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4069 MEMBER','1','9124') +('4869','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4869 MEMBER','1','9125') +('8239','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8239 MEMBER','1','9126') +('8609','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8609 MEMBER','1','9127') +('8242','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8242 MEMBER','1','9128') +('8243','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8243 MEMBER','1','9129') +('8243','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8243 MEMBER','1','9130') +('8244','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8244 MEMBER','1','9131') +('8244','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8244 MEMBER','1','9132') +('8245','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8245 MEMBER','1','9133') +('7045','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7045 MEMBER','1','9134') +('7914','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7914 MEMBER','1','9135') +('8246','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8246 MEMBER','1','9136') +('8280','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8280 MEMBER','1','9137') +('8775','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8775 MEMBER','1','9138') +('8776','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8776 MEMBER','1','9139') +('8781','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8781 MEMBER','1','9140') +('8781','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8781 MEMBER','1','9141') +('8782','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8782 MEMBER','1','9142') +('8783','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8783 MEMBER','1','9143') +('8784','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8784 MEMBER','1','9144') +('8785','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8785 MEMBER','1','9145') +('8786','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8786 MEMBER','1','9146') +('8787','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8787 MEMBER','1','9147') +('8787','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8787 MEMBER','1','9148') +('8788','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8788 MEMBER','1','9149') +('8788','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8788 MEMBER','1','9150') +('8788','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8788 MEMBER','1','9151') +('6770','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6770 MEMBER','1','9152') +('8791','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8791 MEMBER','1','9153') +('8791','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8791 MEMBER','1','9154') +('8791','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8791 MEMBER','1','9155') +('8792','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8792 MEMBER','1','9156') +('8793','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8793 MEMBER','1','9157') +('8794','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8794 MEMBER','1','9158') +('8794','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8794 MEMBER','1','9159') +('8796','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8796 MEMBER','1','9160') +('8796','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8796 MEMBER','1','9161') +('8796','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8796 MEMBER','1','9162') +('8798','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8798 MEMBER','1','9163') +('8799','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8799 MEMBER','1','9164') +('8800','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8800 MEMBER','1','9165') +('8800','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8800 MEMBER','1','9166') +('8800','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8800 MEMBER','1','9167') +('8801','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8801 MEMBER','1','9168') +('8801','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8801 MEMBER','1','9169') +('8801','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8801 MEMBER','1','9170') +('8802','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8802 MEMBER','1','9171') +('8803','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8803 MEMBER','1','9172') +('8803','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8803 MEMBER','1','9173') +('8803','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8803 MEMBER','1','9174') +('8804','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8804 MEMBER','1','9175') +('8804','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8804 MEMBER','1','9176') +('8804','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8804 MEMBER','1','9177') +('4424','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4424 MEMBER','1','9178') +('8826','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8826 MEMBER','1','9179') +('8827','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8827 MEMBER','1','9180') +('8829','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8829 MEMBER','1','9181') +('8830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8830 MEMBER','1','9182') +('8831','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8831 MEMBER','1','9183') +('8832','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8832 MEMBER','1','9184') +('8833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8833 MEMBER','1','9185') +('8834','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8834 MEMBER','1','9186') +('8835','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8835 MEMBER','1','9187') +('8836','1','LASTNAME','FIRSTNAME',999.99,13.81,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8836 MEMBER','1','9188') +('8837','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8837 MEMBER','1','9189') +('8838','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8838 MEMBER','1','9190') +('8839','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8839 MEMBER','1','9191') +('8840','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8840 MEMBER','1','9192') +('8841','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8841 MEMBER','1','9193') +('8842','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8842 MEMBER','1','9194') +('8843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8843 MEMBER','1','9195') +('8844','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8844 MEMBER','1','9196') +('8845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8845 MEMBER','1','9197') +('8846','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8846 MEMBER','1','9198') +('8847','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8847 MEMBER','1','9199') +('8848','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8848 MEMBER','1','9200') +('8849','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8849 MEMBER','1','9201') +('8850','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8850 MEMBER','1','9202') +('8851','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8851 MEMBER','1','9203') +('8852','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8852 MEMBER','1','9204') +('8853','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8853 MEMBER','1','9205') +('2837','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2837 MEMBER','1','9206') +('7670','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7670 MEMBER','1','9207') +('7671','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7671 MEMBER','1','9208') +('7671','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7671 MEMBER','1','9209') +('7671','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7671 MEMBER','1','9210') +('7672','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7672 MEMBER','1','9211') +('7672','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7672 MEMBER','1','9212') +('7672','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7672 MEMBER','1','9213') +('7673','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7673 MEMBER','1','9214') +('7673','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7673 MEMBER','1','9215') +('7673','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7673 MEMBER','1','9216') +('7674','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7674 MEMBER','1','9217') +('7674','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7674 MEMBER','1','9218') +('7674','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7674 MEMBER','1','9219') +('3138','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3138 MEMBER','1','9220') +('3138','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3138 MEMBER','1','9221') +('6349','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',667.99,'999','0','"6349 MEMBER','1','9222') +('7673','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7673 MEMBER','1','9223') +('7673','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7673 MEMBER','1','9224') +('7672','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7672 MEMBER','1','9225') +('7676','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7676 MEMBER','1','9226') +('7676','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7676 MEMBER','1','9227') +('7676','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7676 MEMBER','1','9228') +('7676','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7676 MEMBER','1','9229') +('7676','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7676 MEMBER','1','9230') +('8071','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8071 MEMBER','1','9231') +('8009','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8009 MEMBER','1','9232') +('8073','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8073 MEMBER','1','9233') +('8070','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8070 MEMBER','1','9234') +('8070','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8070 MEMBER','1','9235') +('8076','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8076 MEMBER','1','9236') +('8074','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8074 MEMBER','1','9237') +('8075','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8075 MEMBER','1','9238') +('4155','3','LASTNAME','FIRSTNAME',NULL,20.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4155 MEMBER','1','9239') +('7981','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7981 MEMBER','1','9240') +('7678','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7678 MEMBER','1','9241') +('7678','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7678 MEMBER','1','9242') +('7678','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7678 MEMBER','1','9243') +('7679','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7679 MEMBER','1','9244') +('7679','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7679 MEMBER','1','9245') +('7679','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7679 MEMBER','1','9246') +('7680','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7680 MEMBER','1','9247') +('7680','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7680 MEMBER','1','9248') +('7680','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7680 MEMBER','1','9249') +('7678','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7678 MEMBER','1','9250') +('7679','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7679 MEMBER','1','9251') +('7680','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7680 MEMBER','1','9252') +('7680','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7680 MEMBER','1','9253') +('7681','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7681 MEMBER','1','9254') +('7681','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7681 MEMBER','1','9255') +('7681','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7681 MEMBER','1','9256') +('8721','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8721 MEMBER','1','9257') +('7682','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7682 MEMBER','1','9258') +('8075','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8075 MEMBER','1','9259') +('7683','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7683 MEMBER','1','9260') +('8505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8505 MEMBER','1','9261') +('7684','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7684 MEMBER','1','9262') +('6643','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"6643 MEMBER','1','9263') +('7956','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7956 MEMBER','1','9264') +('7685','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7685 MEMBER','1','9265') +('7685','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7685 MEMBER','1','9266') +('7687','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7687 MEMBER','1','9267') +('7957','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7957 MEMBER','1','9268') +('8035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8035 MEMBER','1','9269') +('8039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8039 MEMBER','1','9270') +('8041','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8041 MEMBER','1','9271') +('7688','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7688 MEMBER','1','9272') +('7689','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7689 MEMBER','1','9273') +('7689','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7689 MEMBER','1','9274') +('7689','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7689 MEMBER','1','9275') +('7679','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7679 MEMBER','1','9276') +('7680','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7680 MEMBER','1','9277') +('7681','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7681 MEMBER','1','9278') +('7682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7682 MEMBER','1','9279') +('7683','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7683 MEMBER','1','9280') +('7684','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7684 MEMBER','1','9281') +('7685','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7685 MEMBER','1','9282') +('7686','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7686 MEMBER','1','9283') +('7687','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7687 MEMBER','1','9284') +('7688','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7688 MEMBER','1','9285') +('7689','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7689 MEMBER','1','9286') +('7690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7690 MEMBER','1','9287') +('7691','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7691 MEMBER','1','9288') +('7692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7692 MEMBER','1','9289') +('7693','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7693 MEMBER','1','9290') +('7694','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7694 MEMBER','1','9291') +('7695','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7695 MEMBER','1','9292') +('7696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7696 MEMBER','1','9293') +('7697','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7697 MEMBER','1','9294') +('7698','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7698 MEMBER','1','9295') +('7699','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7699 MEMBER','1','9296') +('7700','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7700 MEMBER','1','9297') +('7701','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7701 MEMBER','1','9298') +('7702','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7702 MEMBER','1','9299') +('7703','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7703 MEMBER','1','9300') +('7704','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7704 MEMBER','1','9301') +('7705','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7705 MEMBER','1','9302') +('7706','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7706 MEMBER','1','9303') +('7707','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7707 MEMBER','1','9304') +('7708','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7708 MEMBER','1','9305') +('7709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7709 MEMBER','1','9306') +('7710','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7710 MEMBER','1','9307') +('7711','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7711 MEMBER','1','9308') +('7712','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7712 MEMBER','1','9309') +('7635','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7635 MEMBER','1','9310') +('7636','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7636 MEMBER','1','9311') +('7637','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7637 MEMBER','1','9312') +('7638','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7638 MEMBER','1','9313') +('7565','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7565 MEMBER','1','9314') +('7566','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7566 MEMBER','1','9315') +('7567','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7567 MEMBER','1','9316') +('7568','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7568 MEMBER','1','9317') +('7569','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','0','"7569 MEMBER','1','9318') +('7570','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7570 MEMBER','1','9319') +('7580','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7580 MEMBER','1','9320') +('7578','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7578 MEMBER','1','9321') +('7579','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7579 MEMBER','1','9322') +('7589','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7589 MEMBER','1','9323') +('7583','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7583 MEMBER','1','9324') +('7582','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7582 MEMBER','1','9325') +('7581','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7581 MEMBER','1','9326') +('7581','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7581 MEMBER','1','9327') +('7585','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7585 MEMBER','1','9328') +('7586','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7586 MEMBER','1','9329') +('7587','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7587 MEMBER','1','9330') +('7588','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7588 MEMBER','1','9331') +('7591','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7591 MEMBER','1','9332') +('7592','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7592 MEMBER','1','9333') +('7593','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7593 MEMBER','1','9334') +('7594','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7594 MEMBER','1','9335') +('7595','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7595 MEMBER','1','9336') +('7596','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7596 MEMBER','1','9337') +('7597','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7597 MEMBER','1','9338') +('7609','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7609 MEMBER','1','9339') +('7610','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7610 MEMBER','1','9340') +('7612','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7612 MEMBER','1','9341') +('7613','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7613 MEMBER','1','9342') +('7614','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7614 MEMBER','1','9343') +('7615','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7615 MEMBER','1','9344') +('7616','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7616 MEMBER','1','9345') +('7619','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7619 MEMBER','1','9346') +('7617','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7617 MEMBER','1','9347') +('7618','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7618 MEMBER','1','9348') +('8355','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8355 MEMBER','1','9349') +('7621','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7621 MEMBER','1','9350') +('7622','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7622 MEMBER','1','9351') +('7623','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7623 MEMBER','1','9352') +('7624','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7624 MEMBER','1','9353') +('8208','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8208 MEMBER','1','9354') +('7626','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7626 MEMBER','1','9355') +('7627','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7627 MEMBER','1','9356') +('7628','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7628 MEMBER','1','9357') +('7628','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7628 MEMBER','1','9358') +('7629','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7629 MEMBER','1','9359') +('7630','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7630 MEMBER','1','9360') +('7631','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7631 MEMBER','1','9361') +('8294','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8294 MEMBER','1','9362') +('7633','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7633 MEMBER','1','9363') +('7634','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7634 MEMBER','1','9364') +('7641','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7641 MEMBER','1','9365') +('7642','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7642 MEMBER','1','9366') +('7643','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7643 MEMBER','1','9367') +('8478','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8478 MEMBER','1','9368') +('8431','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8431 MEMBER','1','9369') +('7650','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7650 MEMBER','1','9370') +('8922','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8922 MEMBER','1','9371') +('8944','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8944 MEMBER','1','9372') +('6870','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6870 MEMBER','1','9373') +('7644','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7644 MEMBER','1','9374') +('7645','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7645 MEMBER','1','9375') +('7646','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7646 MEMBER','1','9376') +('7648','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7648 MEMBER','1','9377') +('7649','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7649 MEMBER','1','9378') +('7653','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7653 MEMBER','1','9379') +('7636','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7636 MEMBER','1','9380') +('7637','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7637 MEMBER','1','9381') +('7637','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7637 MEMBER','1','9382') +('7638','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7638 MEMBER','1','9383') +('7642','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7642 MEMBER','1','9384') +('7645','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7645 MEMBER','1','9385') +('7645','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7645 MEMBER','1','9386') +('7646','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7646 MEMBER','1','9387') +('7646','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7646 MEMBER','1','9388') +('7647','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7647 MEMBER','1','9389') +('7650','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7650 MEMBER','1','9390') +('7650','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7650 MEMBER','1','9391') +('7657','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7657 MEMBER','1','9392') +('7516','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7516 MEMBER','1','9393') +('7517','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7517 MEMBER','1','9394') +('7518','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7518 MEMBER','1','9395') +('7519','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7519 MEMBER','1','9396') +('7520','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7520 MEMBER','1','9397') +('7522','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7522 MEMBER','1','9398') +('7523','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7523 MEMBER','1','9399') +('7502','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7502 MEMBER','1','9400') +('7504','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7504 MEMBER','1','9401') +('7505','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7505 MEMBER','1','9402') +('7506','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7506 MEMBER','1','9403') +('7507','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7507 MEMBER','1','9404') +('7508','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7508 MEMBER','1','9405') +('7509','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7509 MEMBER','1','9406') +('7511','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7511 MEMBER','1','9407') +('7513','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7513 MEMBER','1','9408') +('7515','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7515 MEMBER','1','9409') +('7449','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7449 MEMBER','1','9410') +('7450','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7450 MEMBER','1','9411') +('7453','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7453 MEMBER','1','9412') +('7453','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7453 MEMBER','1','9413') +('7459','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7459 MEMBER','1','9414') +('7459','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7459 MEMBER','1','9415') +('7461','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7461 MEMBER','1','9416') +('7463','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7463 MEMBER','1','9417') +('7463','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7463 MEMBER','1','9418') +('7464','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7464 MEMBER','1','9419') +('7464','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7464 MEMBER','1','9420') +('7466','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7466 MEMBER','1','9421') +('7467','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7467 MEMBER','1','9422') +('7467','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7467 MEMBER','1','9423') +('7469','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7469 MEMBER','1','9424') +('7469','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7469 MEMBER','1','9425') +('7470','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7470 MEMBER','1','9426') +('7472','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7472 MEMBER','1','9427') +('7472','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7472 MEMBER','1','9428') +('7485','3','LASTNAME','FIRSTNAME',NULL,7.25,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7485 MEMBER','1','9429') +('7488','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7488 MEMBER','1','9430') +('7488','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7488 MEMBER','1','9431') +('7490','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7490 MEMBER','1','9432') +('7491','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7491 MEMBER','1','9433') +('7493','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7493 MEMBER','1','9434') +('7493','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7493 MEMBER','1','9435') +('7495','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7495 MEMBER','1','9436') +('7496','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7496 MEMBER','1','9437') +('7496','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7496 MEMBER','1','9438') +('7497','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7497 MEMBER','1','9439') +('7497','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7497 MEMBER','1','9440') +('7498','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7498 MEMBER','1','9441') +('7498','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7498 MEMBER','1','9442') +('7501','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7501 MEMBER','1','9443') +('7713','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7713 MEMBER','1','9444') +('7714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7714 MEMBER','1','9445') +('7715','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7715 MEMBER','1','9446') +('7716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7716 MEMBER','1','9447') +('7717','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7717 MEMBER','1','9448') +('7718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7718 MEMBER','1','9449') +('7719','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7719 MEMBER','1','9450') +('7720','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7720 MEMBER','1','9451') +('7721','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7721 MEMBER','1','9452') +('7722','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7722 MEMBER','1','9453') +('7723','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7723 MEMBER','1','9454') +('7724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7724 MEMBER','1','9455') +('7725','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7725 MEMBER','1','9456') +('7726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7726 MEMBER','1','9457') +('7727','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7727 MEMBER','1','9458') +('7728','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7728 MEMBER','1','9459') +('7729','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7729 MEMBER','1','9460') +('7730','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7730 MEMBER','1','9461') +('7731','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7731 MEMBER','1','9462') +('7732','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7732 MEMBER','1','9463') +('7733','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7733 MEMBER','1','9464') +('7734','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7734 MEMBER','1','9465') +('7735','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7735 MEMBER','1','9466') +('7736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7736 MEMBER','1','9467') +('7737','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7737 MEMBER','1','9468') +('7738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7738 MEMBER','1','9469') +('7739','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7739 MEMBER','1','9470') +('7740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7740 MEMBER','1','9471') +('7741','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7741 MEMBER','1','9472') +('7742','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7742 MEMBER','1','9473') +('7743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7743 MEMBER','1','9474') +('7744','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7744 MEMBER','1','9475') +('7745','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7745 MEMBER','1','9476') +('7746','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7746 MEMBER','1','9477') +('7747','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7747 MEMBER','1','9478') +('7748','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7748 MEMBER','1','9479') +('7749','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7749 MEMBER','1','9480') +('7750','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7750 MEMBER','1','9481') +('7751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7751 MEMBER','1','9482') +('7752','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7752 MEMBER','1','9483') +('7510','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7510 MEMBER','1','9484') +('7525','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7525 MEMBER','1','9485') +('7525','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7525 MEMBER','1','9486') +('7526','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7526 MEMBER','1','9487') +('7529','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7529 MEMBER','1','9488') +('7529','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7529 MEMBER','1','9489') +('7531','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7531 MEMBER','1','9490') +('7531','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7531 MEMBER','1','9491') +('7540','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7540 MEMBER','1','9492') +('7543','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7543 MEMBER','1','9493') +('7544','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7544 MEMBER','1','9494') +('7544','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7544 MEMBER','1','9495') +('7476','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7476 MEMBER','1','9496') +('7476','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7476 MEMBER','1','9497') +('7545','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7545 MEMBER','1','9498') +('7547','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7547 MEMBER','1','9499') +('7547','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7547 MEMBER','1','9500') +('7550','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7550 MEMBER','1','9501') +('7550','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7550 MEMBER','1','9502') +('7549','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7549 MEMBER','1','9503') +('7553','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7553 MEMBER','1','9504') +('7553','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7553 MEMBER','1','9505') +('7552','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7552 MEMBER','1','9506') +('7552','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7552 MEMBER','1','9507') +('7558','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7558 MEMBER','1','9508') +('7558','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7558 MEMBER','1','9509') +('7559','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7559 MEMBER','1','9510') +('7559','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7559 MEMBER','1','9511') +('7561','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7561 MEMBER','1','9512') +('7562','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7562 MEMBER','1','9513') +('8708','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8708 MEMBER','1','9514') +('7568','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7568 MEMBER','1','9515') +('7568','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7568 MEMBER','1','9516') +('7502','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7502 MEMBER','1','9517') +('7502','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7502 MEMBER','1','9518') +('7505','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7505 MEMBER','1','9519') +('7505','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7505 MEMBER','1','9520') +('7506','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7506 MEMBER','1','9521') +('7508','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7508 MEMBER','1','9522') +('7513','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7513 MEMBER','1','9523') +('7515','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7515 MEMBER','1','9524') +('7515','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7515 MEMBER','1','9525') +('7517','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7517 MEMBER','1','9526') +('7517','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7517 MEMBER','1','9527') +('7518','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7518 MEMBER','1','9528') +('7518','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7518 MEMBER','1','9529') +('7519','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7519 MEMBER','1','9530') +('7520','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7520 MEMBER','1','9531') +('7520','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7520 MEMBER','1','9532') +('7589','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7589 MEMBER','1','9533') +('7589','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7589 MEMBER','1','9534') +('7583','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7583 MEMBER','1','9535') +('7583','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7583 MEMBER','1','9536') +('7584','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7584 MEMBER','1','9537') +('7584','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7584 MEMBER','1','9538') +('7584','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7584 MEMBER','1','9539') +('7587','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7587 MEMBER','1','9540') +('7587','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7587 MEMBER','1','9541') +('7596','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7596 MEMBER','1','9542') +('7596','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7596 MEMBER','1','9543') +('7597','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7597 MEMBER','1','9544') +('7597','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7597 MEMBER','1','9545') +('7598','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7598 MEMBER','1','9546') +('7659','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7659 MEMBER','1','9547') +('7163','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7163 MEMBER','1','9548') +('9599','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9599 MEMBER','1','9549') +('4326','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"4326 MEMBER','1','9550') +('8245','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8245 MEMBER','1','9551') +('9516','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9516 MEMBER','1','9552') +('7662','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7662 MEMBER','1','9553') +('7662','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7662 MEMBER','1','9554') +('7662','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7662 MEMBER','1','9555') +('7664','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7664 MEMBER','1','9556') +('7664','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7664 MEMBER','1','9557') +('7664','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7664 MEMBER','1','9558') +('7666','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7666 MEMBER','1','9559') +('7666','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7666 MEMBER','1','9560') +('7666','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7666 MEMBER','1','9561') +('7667','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7667 MEMBER','1','9562') +('7667','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7667 MEMBER','1','9563') +('7667','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7667 MEMBER','1','9564') +('7668','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7668 MEMBER','1','9565') +('7668','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7668 MEMBER','1','9566') +('7668','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7668 MEMBER','1','9567') +('7669','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7669 MEMBER','1','9568') +('7669','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7669 MEMBER','1','9569') +('7669','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7669 MEMBER','1','9570') +('7759','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7759 MEMBER','1','9571') +('7762','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7762 MEMBER','1','9572') +('9501','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9501 MEMBER','1','9573') +('7662','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7662 MEMBER','1','9574') +('7666','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7666 MEMBER','1','9575') +('7667','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7667 MEMBER','1','9576') +('7667','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7667 MEMBER','1','9577') +('7616','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7616 MEMBER','1','9578') +('7618','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7618 MEMBER','1','9579') +('7618','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7618 MEMBER','1','9580') +('7619','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7619 MEMBER','1','9581') +('7634','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7634 MEMBER','1','9582') +('7762','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7762 MEMBER','1','9583') +('8051','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8051 MEMBER','1','9584') +('8059','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8059 MEMBER','1','9585') +('8068','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8068 MEMBER','1','9586') +('7693','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7693 MEMBER','1','9587') +('7693','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7693 MEMBER','1','9588') +('7694','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7694 MEMBER','1','9589') +('7772','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7772 MEMBER','1','9590') +('7773','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7773 MEMBER','1','9591') +('7695','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7695 MEMBER','1','9592') +('7695','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7695 MEMBER','1','9593') +('7695','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7695 MEMBER','1','9594') +('7548','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7548 MEMBER','1','9595') +('8553','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8553 MEMBER','1','9596') +('7774','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7774 MEMBER','1','9597') +('7703','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7703 MEMBER','1','9598') +('7704','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7704 MEMBER','1','9599') +('7704','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7704 MEMBER','1','9600') +('6773','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6773 MEMBER','1','9601') +('1888','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1888 MEMBER','1','9602') +('9166','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9166 MEMBER','1','9603') +('8069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8069 MEMBER','1','9604') +('1312','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1312 MEMBER','1','9605') +('7697','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7697 MEMBER','1','9606') +('8886','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8886 MEMBER','1','9607') +('7778','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7778 MEMBER','1','9608') +('7984','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7984 MEMBER','1','9609') +('7984','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7984 MEMBER','1','9610') +('7918','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7918 MEMBER','1','9611') +('7699','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7699 MEMBER','1','9612') +('162','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"162 MEMBER','1','9613') +('8076','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8076 MEMBER','1','9614') +('7700','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7700 MEMBER','1','9615') +('7700','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7700 MEMBER','1','9616') +('7701','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7701 MEMBER','1','9617') +('7701','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7701 MEMBER','1','9618') +('7701','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7701 MEMBER','1','9619') +('7702','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7702 MEMBER','1','9620') +('7702','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7702 MEMBER','1','9621') +('7702','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7702 MEMBER','1','9622') +('7707','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7707 MEMBER','1','9623') +('8055','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8055 MEMBER','1','9624') +('8227','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8227 MEMBER','1','9625') +('7708','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7708 MEMBER','1','9626') +('7709','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7709 MEMBER','1','9627') +('7706','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7706 MEMBER','1','9628') +('7712','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7712 MEMBER','1','9629') +('7712','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7712 MEMBER','1','9630') +('2602','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"2602 MEMBER','1','9631') +('7713','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7713 MEMBER','1','9632') +('7713','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7713 MEMBER','1','9633') +('7713','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"7713 MEMBER','1','9634') +('6535','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6535 MEMBER','1','9635') +('8553','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8553 MEMBER','1','9636') +('8367','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8367 MEMBER','1','9637') +('10315','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10315 MEMBER','1','9638') +('10315','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10315 MEMBER','1','9639') +('10313','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10313 MEMBER','1','9640') +('8141','2','LASTNAME','FIRSTNAME',999.99,1.29,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8141 MEMBER','1','9641') +('10305','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10305 MEMBER','1','9642') +('10306','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10306 MEMBER','1','9643') +('10309','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10309 MEMBER','1','9644') +('10309','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10309 MEMBER','1','9645') +('10315','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10315 MEMBER','1','9646') +('10321','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10321 MEMBER','1','9647') +('8988','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8988 MEMBER','1','9648') +('9462','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9462 MEMBER','1','9649') +('10317','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10317 MEMBER','1','9650') +('10318','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10318 MEMBER','1','9651') +('4137','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2723.03,'999','0','"4137 MEMBER','1','9652') +('10319','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10319 MEMBER','1','9653') +('10331','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10331 MEMBER','1','9654') +('9237','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9237 MEMBER','1','9655') +('4321','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4119.94,'999','0','"4321 MEMBER','1','9656') +('10039','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10039 MEMBER','1','9657') +('10039','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10039 MEMBER','1','9658') +('10329','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10329 MEMBER','1','9659') +('10329','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10329 MEMBER','1','9660') +('6481','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',234.37,'999','0','"6481 MEMBER','1','9661') +('9403','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9403 MEMBER','1','9662') +('6084','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',300.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,NULL,'"6084 MEMBER','1','9663') +('10251','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10251 MEMBER','1','9664') +('10333','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10333 MEMBER','1','9665') +('10332','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10332 MEMBER','1','9666') +('10332','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10332 MEMBER','1','9667') +('10332','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10332 MEMBER','1','9668') +('6035','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6035 MEMBER','1','9669') +('10335','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10335 MEMBER','1','9670') +('10336','2','LASTNAME','FIRSTNAME',999.99,9.32,'10',10.80,'1','1','1','PC','3','1','0',0.00,'999','1','"10336 MEMBER','1','9671') +('10337','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10337 MEMBER','1','9673') +('10338','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10338 MEMBER','1','9674') +('10339','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10339 MEMBER','1','9676') +('10340','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10340 MEMBER','1','9677') +('10343','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10343 MEMBER','1','9678') +('10349','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10349 MEMBER','1','9679') +('10349','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10349 MEMBER','1','9680') +('10344','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10344 MEMBER','1','9681') +('1125','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"1125 MEMBER','1','9682') +('10328','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10328 MEMBER','1','9683') +('10350','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10350 MEMBER','1','9684') +('10354','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10354 MEMBER','1','9685') +('5366','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"5366 MEMBER','1','9686') +('6090','1','LASTNAME','FIRSTNAME',999.99,225.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6090 MEMBER','1','9687') +('10352','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10352 MEMBER','1','9688') +('10353','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10353 MEMBER','1','9689') +('10357','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10357 MEMBER','1','9690') +('10354','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10354 MEMBER','1','9691') +('10359','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10359 MEMBER','1','9692') +('10359','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10359 MEMBER','1','9693') +('10360','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10360 MEMBER','1','9694') +('10361','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10361 MEMBER','1','9695') +('10034','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10034 MEMBER','1','9696') +('10034','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10034 MEMBER','1','9697') +('10362','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10362 MEMBER','1','9698') +('10363','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10363 MEMBER','1','9699') +('8956','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"8956 MEMBER','1','9700') +('10368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10368 MEMBER','1','9701') +('10371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"10371 MEMBER','1','9702') +('6938','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6938 MEMBER','1','9703') +('6938','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6938 MEMBER','1','9704') +('10373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10373 MEMBER','1','9705') +('10367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10367 MEMBER','1','9706') +('10370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10370 MEMBER','1','9707') +('10372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10372 MEMBER','1','9708') +('10374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10374 MEMBER','1','9709') +('10364','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10364 MEMBER','1','9710') +('4506','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4506 MEMBER','1','9711') +('8806','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8806 MEMBER','1','9714') +('8806','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8806 MEMBER','1','9715') +('8806','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8806 MEMBER','1','9716') +('10351','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10351 MEMBER','1','9717') +('10354','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10354 MEMBER','1','9718') +('10356','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10356 MEMBER','1','9719') +('10356','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10356 MEMBER','1','9720') +('10356','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10356 MEMBER','1','9721') +('10357','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10357 MEMBER','1','9722') +('10357','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10357 MEMBER','1','9723') +('10359','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10359 MEMBER','1','9724') +('10375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10375 MEMBER','1','9725') +('10376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10376 MEMBER','1','9726') +('10377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10377 MEMBER','1','9727') +('10378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10378 MEMBER','1','9728') +('10379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10379 MEMBER','1','9729') +('10380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10380 MEMBER','1','9730') +('10381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10381 MEMBER','1','9731') +('10382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10382 MEMBER','1','9732') +('10383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10383 MEMBER','1','9733') +('10384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10384 MEMBER','1','9734') +('10385','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10385 MEMBER','1','9735') +('10386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10386 MEMBER','1','9736') +('10387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10387 MEMBER','1','9737') +('10388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10388 MEMBER','1','9738') +('10389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10389 MEMBER','1','9739') +('10390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10390 MEMBER','1','9740') +('10391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10391 MEMBER','1','9741') +('10392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10392 MEMBER','1','9742') +('10393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10393 MEMBER','1','9743') +('10394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10394 MEMBER','1','9744') +('10395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10395 MEMBER','1','9745') +('10396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10396 MEMBER','1','9746') +('10397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10397 MEMBER','1','9747') +('10398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10398 MEMBER','1','9748') +('10399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10399 MEMBER','1','9749') +('10400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10400 MEMBER','1','9750') +('10401','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10401 MEMBER','1','9751') +('10402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10402 MEMBER','1','9752') +('10403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10403 MEMBER','1','9753') +('10404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10404 MEMBER','1','9754') +('10405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10405 MEMBER','1','9755') +('10406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10406 MEMBER','1','9756') +('10366','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10366 MEMBER','1','9757') +('10367','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10367 MEMBER','1','9758') +('10368','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10368 MEMBER','1','9759') +('10368','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10368 MEMBER','1','9760') +('10369','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10369 MEMBER','1','9761') +('6787','2','LASTNAME','FIRSTNAME',999.99,31.62,'10',40.00,'1','1','1','PC','3','1','0',28.33,'999','0','"6787 MEMBER','1','9762') +('7740','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7740 MEMBER','1','9763') +('7740','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7740 MEMBER','1','9764') +('10373','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10373 MEMBER','1','9765') +('10373','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10373 MEMBER','1','9766') +('8901','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8901 MEMBER','1','9767') +('9883','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9883 MEMBER','1','9768') +('10025','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10025 MEMBER','1','9769') +('10385','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10385 MEMBER','1','9770') +('10392','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10392 MEMBER','1','9771') +('10374','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10374 MEMBER','1','9772') +('9303','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9303 MEMBER','1','9773') +('10398','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10398 MEMBER','1','9774') +('10379','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10379 MEMBER','1','9775') +('10380','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10380 MEMBER','1','9776') +('10380','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10380 MEMBER','1','9777') +('10380','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10380 MEMBER','1','9778') +('10384','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10384 MEMBER','1','9779') +('9875','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9875 MEMBER','1','9780') +('3346','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3346 MEMBER','1','9781') +('3346','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3346 MEMBER','1','9782') +('10370','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10370 MEMBER','1','9783') +('10375','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10375 MEMBER','1','9784') +('10375','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10375 MEMBER','1','9785') +('10378','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10378 MEMBER','1','9786') +('10378','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10378 MEMBER','1','9787') +('10385','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10385 MEMBER','1','9788') +('10388','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10388 MEMBER','1','9789') +('6851','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','1','"6851 MEMBER','1','9790') +('10388','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10388 MEMBER','1','9791') +('10388','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10388 MEMBER','1','9792') +('10389','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10389 MEMBER','1','9793') +('10389','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10389 MEMBER','1','9794') +('10389','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10389 MEMBER','1','9795') +('10392','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10392 MEMBER','1','9796') +('9290','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9290 MEMBER','1','9797') +('10393','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10393 MEMBER','1','9798') +('10393','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10393 MEMBER','1','9799') +('10381','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10381 MEMBER','1','9800') +('4632','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1329.94,'999','0','"4632 MEMBER','1','9801') +('10395','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10395 MEMBER','1','9802') +('10397','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10397 MEMBER','1','9803') +('10397','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10397 MEMBER','1','9804') +('10400','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10400 MEMBER','1','9805') +('10401','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10401 MEMBER','1','9806') +('10402','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10402 MEMBER','1','9807') +('7763','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7763 MEMBER','1','9808') +('9982','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9982 MEMBER','1','9809') +('8322','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8322 MEMBER','1','9810') +('10408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10408 MEMBER','1','9811') +('10409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10409 MEMBER','1','9812') +('10410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','1','"10410 MEMBER','1','9813') +('10412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10412 MEMBER','1','9814') +('10413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10413 MEMBER','1','9815') +('10414','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10414 MEMBER','1','9816') +('10415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10415 MEMBER','1','9817') +('10416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"10416 MEMBER','1','9818') +('10417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10417 MEMBER','1','9819') +('10418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10418 MEMBER','1','9820') +('10419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10419 MEMBER','1','9821') +('10420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10420 MEMBER','1','9822') +('10421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10421 MEMBER','1','9823') +('10422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10422 MEMBER','1','9824') +('10423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10423 MEMBER','1','9825') +('10424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10424 MEMBER','1','9826') +('10425','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10425 MEMBER','1','9827') +('10426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10426 MEMBER','1','9828') +('10427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10427 MEMBER','1','9829') +('10428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10428 MEMBER','1','9830') +('10429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10429 MEMBER','1','9831') +('10430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10430 MEMBER','1','9832') +('10431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10431 MEMBER','1','9833') +('10432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10432 MEMBER','1','9834') +('10433','1','LASTNAME','FIRSTNAME',999.99,25.90,'10',100.00,'1','1','1','PC','3','1','0',0.00,'999','0','"10433 MEMBER','1','9835') +('10434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10434 MEMBER','1','9836') +('10435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10435 MEMBER','1','9837') +('10436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10436 MEMBER','1','9838') +('10437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10437 MEMBER','1','9839') +('10438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10438 MEMBER','1','9840') +('10439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10439 MEMBER','1','9841') +('10440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10440 MEMBER','1','9842') +('10441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10441 MEMBER','1','9843') +('10442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10442 MEMBER','1','9844') +('10443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10443 MEMBER','1','9845') +('10444','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10444 MEMBER','1','9846') +('10445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10445 MEMBER','1','9847') +('10446','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"10446 MEMBER','1','9848') +('6141','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2327.85,'999','0','"6141 MEMBER','1','9849') +('10419','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10419 MEMBER','1','9850') +('4272','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',107.16,'999','1','"4272 MEMBER','1','9851') +('10405','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10405 MEMBER','1','9852') +('10405','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10405 MEMBER','1','9853') +('10383','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10383 MEMBER','1','9854') +('10407','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10407 MEMBER','1','9855') +('10407','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10407 MEMBER','1','9856') +('10409','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10409 MEMBER','1','9857') +('5332','2','LASTNAME','FIRSTNAME',999.99,13.48,'10',75.00,'1','0','1','REG','9','1','0',0.00,'999','0','"5332 MEMBER','1','9858') +('10410','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','TERM','0','0','0',0.00,'999','1','"10410 MEMBER','1','9859') +('10411','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10411 MEMBER','1','9860') +('6474','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',792.18,'999','0','"6474 MEMBER','1','9861') +('10376','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10376 MEMBER','1','9862') +('10400','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10400 MEMBER','1','9863') +('10260','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10260 MEMBER','1','9864') +('10412','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10412 MEMBER','1','9865') +('10412','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10412 MEMBER','1','9866') +('5268','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,NULL,'"5268 MEMBER','1','9867') +('6092','1','LASTNAME','FIRSTNAME',999.99,75.00,'0',20.00,'1','1','1','PC','2','0','0',0.00,'999','1','"6092 MEMBER','1','9868') +('6093','1','LASTNAME','FIRSTNAME',999.99,75.00,'0',20.00,'1','1','1','PC','2','0','0',0.00,'999','1','"6093 MEMBER','1','9869') +('6094','1','LASTNAME','FIRSTNAME',999.99,150.00,'0',20.00,'1','1','1','PC','2','0','0',0.00,'999','1','"6094 MEMBER','1','9870') +('6095','1','LASTNAME','FIRSTNAME',999.99,110.00,'0',20.00,'1','1','1','PC','2','0','0',0.00,'999','1','"6095 MEMBER','1','9871') +('6096','1','LASTNAME','FIRSTNAME',999.99,110.00,'0',20.00,'1','1','1','PC','2','0','0',0.00,'999','1','"6096 MEMBER','1','9872') +('6097','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6097 MEMBER','1','9873') +('6098','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6098 MEMBER','1','9874') +('6099','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6099 MEMBER','1','9875') +('10263','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10263 MEMBER','1','9876') +('10263','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10263 MEMBER','1','9877') +('9642','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9642 MEMBER','1','9878') +('5396','2','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5396 MEMBER','1','9879') +('10399','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10399 MEMBER','1','9880') +('10399','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10399 MEMBER','1','9881') +('10414','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10414 MEMBER','1','9882') +('10416','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"10416 MEMBER','1','9883') +('9201','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9201 MEMBER','1','9884') +('9201','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9201 MEMBER','1','9885') +('9945','2','LASTNAME','FIRSTNAME',999.99,14.41,'10',40.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9945 MEMBER','1','9886') +('6101','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2587.96,'999','0','"6101 MEMBER','1','9887') +('6101','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2587.96,'999','0','"6101 MEMBER','1','9888') +('6101','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',2587.96,'999','0','"6101 MEMBER','1','9889') +('9755','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9755 MEMBER','1','9890') +('10426','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10426 MEMBER','1','9891') +('10428','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10428 MEMBER','1','9892') +('8309','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8309 MEMBER','1','9893') +('8309','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8309 MEMBER','1','9894') +('8309','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8309 MEMBER','1','9895') +('10428','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10428 MEMBER','1','9896') +('45','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2249.53,'999','0','"45 MEMBER','1','9897') +('10407','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10407 MEMBER','1','9898') +('10416','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','0','"10416 MEMBER','1','9899') +('10506','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10506 MEMBER','1','9900') +('10420','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10420 MEMBER','1','9901') +('10429','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10429 MEMBER','1','9902') +('9472','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9472 MEMBER','1','9903') +('10408','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10408 MEMBER','1','9904') +('10415','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10415 MEMBER','1','9905') +('10415','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10415 MEMBER','1','9906') +('10415','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10415 MEMBER','1','9907') +('10417','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10417 MEMBER','1','9908') +('10417','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10417 MEMBER','1','9909') +('10417','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10417 MEMBER','1','9910') +('10387','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10387 MEMBER','1','9911') +('9913','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9913 MEMBER','1','9912') +('9913','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9913 MEMBER','1','9913') +('5402','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5402 MEMBER','1','9914') +('5403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','999','"5403 MEMBER','1','9915') +('5404','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5404 MEMBER','1','9916') +('5405','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5405 MEMBER','1','9917') +('5406','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5406 MEMBER','1','9918') +('5407','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5407 MEMBER','1','9919') +('5408','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5408 MEMBER','1','9920') +('5409','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5409 MEMBER','1','9921') +('5410','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5410 MEMBER','1','9922') +('5411','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','999','"5411 MEMBER','1','9923') +('5412','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5412 MEMBER','1','9924') +('5413','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5413 MEMBER','1','9925') +('5414','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5414 MEMBER','1','9926') +('5415','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5415 MEMBER','1','9927') +('5416','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5416 MEMBER','1','9928') +('5417','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5417 MEMBER','1','9929') +('5418','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','0','0',0.00,'999','999','"5418 MEMBER','1','9930') +('8914','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8914 MEMBER','1','9931') +('8914','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8914 MEMBER','1','9932') +('8916','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8916 MEMBER','1','9933') +('8916','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8916 MEMBER','1','9934') +('8918','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8918 MEMBER','1','9935') +('8918','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8918 MEMBER','1','9936') +('8918','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8918 MEMBER','1','9937') +('8919','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8919 MEMBER','1','9938') +('8921','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8921 MEMBER','1','9939') +('8921','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8921 MEMBER','1','9940') +('7229','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7229 MEMBER','1','9941') +('2062','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2062 MEMBER','1','9942') +('10431','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10431 MEMBER','1','9943') +('10432','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10432 MEMBER','1','9944') +('2930','2','LASTNAME','FIRSTNAME',999.99,11.64,'0',20.00,'1','1','1','PC','1','0','0',78.69,'999','1','"2930 MEMBER','1','9945') +('10433','2','LASTNAME','FIRSTNAME',999.99,25.90,'10',100.00,'1','0','1','PC','3','1','0',0.00,'999','0','"10433 MEMBER','1','9946') +('2532','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',655.01,'999','0','"2532 MEMBER','1','9947') +('10434','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10434 MEMBER','1','9948') +('146','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"146 MEMBER','1','9949') +('146','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"146 MEMBER','1','9950') +('10435','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10435 MEMBER','1','9951') +('10437','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10437 MEMBER','1','9952') +('7294','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7294 MEMBER','1','9953') +('10438','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10438 MEMBER','1','9954') +('9103','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9103 MEMBER','1','9955') +('6321','2','LASTNAME','FIRSTNAME',999.99,68.15,'10',100.00,'1','1','1','PC','3','1','0',3469.19,'999','0','"6321 MEMBER','1','9956') +('8553','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8553 MEMBER','1','9957') +('10440','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10440 MEMBER','1','9958') +('9744','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9744 MEMBER','1','9959') +('10441','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10441 MEMBER','1','9961') +('10442','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10442 MEMBER','1','9962') +('9338','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9338 MEMBER','1','9963') +('10443','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10443 MEMBER','1','9964') +('14','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3487.90,'999','0','"14 MEMBER','1','9965') +('10445','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10445 MEMBER','1','9966') +('10447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10447 MEMBER','1','9967') +('10448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10448 MEMBER','1','9968') +('10449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10449 MEMBER','1','9969') +('10450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10450 MEMBER','1','9970') +('10451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10451 MEMBER','1','9971') +('10452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10452 MEMBER','1','9972') +('10453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10453 MEMBER','1','9973') +('10454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10454 MEMBER','1','9974') +('10455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10455 MEMBER','1','9975') +('10456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10456 MEMBER','1','9976') +('10457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10457 MEMBER','1','9977') +('10458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10458 MEMBER','1','9978') +('10459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10459 MEMBER','1','9979') +('10460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10460 MEMBER','1','9980') +('10461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10461 MEMBER','1','9981') +('10462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10462 MEMBER','1','9982') +('10463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10463 MEMBER','1','9983') +('10464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10464 MEMBER','1','9984') +('10465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10465 MEMBER','1','9985') +('10466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10466 MEMBER','1','9986') +('10467','1','LASTNAME','FIRSTNAME',999.99,6.61,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"10467 MEMBER','1','9987') +('10468','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10468 MEMBER','1','9988') +('10469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10469 MEMBER','1','9989') +('10470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10470 MEMBER','1','9990') +('10471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10471 MEMBER','1','9991') +('10472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10472 MEMBER','1','9992') +('10473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10473 MEMBER','1','9993') +('10474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10474 MEMBER','1','9994') +('10475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10475 MEMBER','1','9995') +('10476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10476 MEMBER','1','9996') +('10477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10477 MEMBER','1','9997') +('10478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10478 MEMBER','1','9998') +('10479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10479 MEMBER','1','9999') +('10480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10480 MEMBER','1','10000') +('10481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10481 MEMBER','1','10001') +('7136','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7136 MEMBER','1','10002') +('9822','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9822 MEMBER','1','10003') +('7975','2','LASTNAME','FIRSTNAME',NULL,16.66,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7975 MEMBER','1','10004') +('7714','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7714 MEMBER','1','10005') +('7979','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7979 MEMBER','1','10006') +('8840','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8840 MEMBER','1','10007') +('7716','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7716 MEMBER','1','10008') +('8235','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8235 MEMBER','1','10009') +('8949','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8949 MEMBER','1','10010') +('7721','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7721 MEMBER','1','10011') +('7721','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7721 MEMBER','1','10012') +('7722','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7722 MEMBER','1','10013') +('7722','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7722 MEMBER','1','10014') +('7718','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7718 MEMBER','1','10015') +('7684','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7684 MEMBER','1','10016') +('7684','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7684 MEMBER','1','10017') +('7717','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7717 MEMBER','1','10018') +('7717','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7717 MEMBER','1','10019') +('7717','4','LASTNAME','FIRSTNAME',999.00,0.00,'0',0.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7717 MEMBER','1','10020') +('7719','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7719 MEMBER','1','10021') +('7720','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7720 MEMBER','1','10022') +('7720','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7720 MEMBER','1','10023') +('7723','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7723 MEMBER','1','10024') +('7723','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7723 MEMBER','1','10025') +('4199','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"4199 MEMBER','1','10026') +('7724','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7724 MEMBER','1','10027') +('7724','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7724 MEMBER','1','10028') +('2227','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2227 MEMBER','1','10029') +('7725','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"7725 MEMBER','1','10030') +('7790','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7790 MEMBER','1','10031') +('6156','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6156 MEMBER','1','10032') +('6156','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6156 MEMBER','1','10033') +('7754','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7754 MEMBER','1','10034') +('7758','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7758 MEMBER','1','10035') +('7759','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7759 MEMBER','1','10036') +('7760','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7760 MEMBER','1','10037') +('7761','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7761 MEMBER','1','10038') +('7762','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7762 MEMBER','1','10039') +('7763','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7763 MEMBER','1','10040') +('7764','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7764 MEMBER','1','10041') +('7765','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7765 MEMBER','1','10042') +('7766','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7766 MEMBER','1','10043') +('7767','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7767 MEMBER','1','10044') +('7768','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7768 MEMBER','1','10045') +('7769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7769 MEMBER','1','10046') +('7770','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7770 MEMBER','1','10047') +('7771','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7771 MEMBER','1','10048') +('7772','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7772 MEMBER','1','10049') +('7773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7773 MEMBER','1','10050') +('7774','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7774 MEMBER','1','10051') +('7775','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7775 MEMBER','1','10052') +('7776','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7776 MEMBER','1','10053') +('7777','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7777 MEMBER','1','10054') +('7778','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7778 MEMBER','1','10055') +('7779','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7779 MEMBER','1','10056') +('7780','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7780 MEMBER','1','10057') +('7781','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7781 MEMBER','1','10058') +('7782','1','LASTNAME','FIRSTNAME',999.99,0.73,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7782 MEMBER','1','10059') +('7783','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7783 MEMBER','1','10060') +('7784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7784 MEMBER','1','10061') +('7785','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7785 MEMBER','1','10062') +('7786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7786 MEMBER','1','10063') +('7787','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7787 MEMBER','1','10064') +('7788','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7788 MEMBER','1','10065') +('7789','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7789 MEMBER','1','10066') +('7790','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7790 MEMBER','1','10067') +('7791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7791 MEMBER','1','10068') +('7792','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7792 MEMBER','1','10069') +('5001','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5001 MEMBER','1','10070') +('7659','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7659 MEMBER','1','10071') +('9693','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9693 MEMBER','1','10072') +('7728','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7728 MEMBER','1','10073') +('7729','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7729 MEMBER','1','10074') +('7730','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7730 MEMBER','1','10075') +('8914','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8914 MEMBER','1','10076') +('7732','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7732 MEMBER','1','10077') +('7733','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7733 MEMBER','1','10078') +('7733','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7733 MEMBER','1','10079') +('7733','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7733 MEMBER','1','10080') +('7734','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7734 MEMBER','1','10081') +('7734','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7734 MEMBER','1','10082') +('7735','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7735 MEMBER','1','10083') +('7741','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7741 MEMBER','1','10085') +('7748','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7748 MEMBER','1','10086') +('7748','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7748 MEMBER','1','10087') +('7749','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7749 MEMBER','1','10088') +('7750','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7750 MEMBER','1','10089') +('7750','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7750 MEMBER','1','10090') +('7752','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7752 MEMBER','1','10091') +('7752','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7752 MEMBER','1','10092') +('7752','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7752 MEMBER','1','10093') +('7753','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7753 MEMBER','1','10094') +('7754','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7754 MEMBER','1','10095') +('7755','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7755 MEMBER','1','10096') +('7758','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7758 MEMBER','1','10097') +('8916','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8916 MEMBER','1','10098') +('8921','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8921 MEMBER','1','10099') +('8922','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8922 MEMBER','1','10100') +('3151','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"3151 MEMBER','1','10101') +('8924','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8924 MEMBER','1','10102') +('8924','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8924 MEMBER','1','10103') +('8924','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8924 MEMBER','1','10104') +('8925','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8925 MEMBER','1','10105') +('8925','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8925 MEMBER','1','10106') +('22','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',277.85,'999','0','"22 MEMBER','1','10107') +('8926','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8926 MEMBER','1','10108') +('8927','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8927 MEMBER','1','10109') +('8927','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8927 MEMBER','1','10110') +('8928','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8928 MEMBER','1','10111') +('8928','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8928 MEMBER','1','10112') +('8929','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8929 MEMBER','1','10113') +('8930','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8930 MEMBER','1','10114') +('8930','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8930 MEMBER','1','10115') +('8930','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8930 MEMBER','1','10116') +('8931','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8931 MEMBER','1','10117') +('8931','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8931 MEMBER','1','10118') +('8932','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8932 MEMBER','1','10119') +('6033','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',546.51,'999','0','"6033 MEMBER','1','10120') +('8947','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8947 MEMBER','1','10121') +('8949','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8949 MEMBER','1','10122') +('8952','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8952 MEMBER','1','10123') +('8953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8953 MEMBER','1','10124') +('8970','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8970 MEMBER','1','10125') +('8971','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8971 MEMBER','1','10126') +('8972','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8972 MEMBER','1','10127') +('8973','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8973 MEMBER','1','10128') +('8974','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8974 MEMBER','1','10129') +('8976','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8976 MEMBER','1','10130') +('8977','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8977 MEMBER','1','10131') +('8982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8982 MEMBER','1','10132') +('8983','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8983 MEMBER','1','10133') +('8984','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8984 MEMBER','1','10134') +('8985','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8985 MEMBER','1','10135') +('8934','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8934 MEMBER','1','10136') +('8940','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8940 MEMBER','1','10137') +('8943','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8943 MEMBER','1','10138') +('8943','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8943 MEMBER','1','10139') +('8723','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8723 MEMBER','1','10140') +('8946','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8946 MEMBER','1','10141') +('9211','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9211 MEMBER','1','10142') +('9211','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9211 MEMBER','1','10143') +('9211','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9211 MEMBER','1','10144') +('9212','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9212 MEMBER','1','10145') +('9213','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9213 MEMBER','1','10146') +('9214','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9214 MEMBER','1','10147') +('9214','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9214 MEMBER','1','10148') +('9216','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9216 MEMBER','1','10149') +('9216','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9216 MEMBER','1','10150') +('9216','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9216 MEMBER','1','10151') +('9217','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9217 MEMBER','1','10152') +('9217','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9217 MEMBER','1','10153') +('9231','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9231 MEMBER','1','10154') +('9218','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9218 MEMBER','1','10155') +('9220','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9220 MEMBER','1','10156') +('9221','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9221 MEMBER','1','10157') +('6465','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6465 MEMBER','1','10158') +('9239','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9239 MEMBER','1','10159') +('10454','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10454 MEMBER','1','10160') +('9247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9247 MEMBER','1','10161') +('9248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9248 MEMBER','1','10162') +('9249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9249 MEMBER','1','10163') +('9250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9250 MEMBER','1','10164') +('9251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9251 MEMBER','1','10165') +('9252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9252 MEMBER','1','10166') +('9253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9253 MEMBER','1','10167') +('9254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9254 MEMBER','1','10168') +('9255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9255 MEMBER','1','10169') +('9256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9256 MEMBER','1','10170') +('9257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9257 MEMBER','1','10171') +('9258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9258 MEMBER','1','10172') +('9259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9259 MEMBER','1','10173') +('9260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9260 MEMBER','1','10174') +('9261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9261 MEMBER','1','10175') +('9262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9262 MEMBER','1','10176') +('9263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9263 MEMBER','1','10177') +('9264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9264 MEMBER','1','10178') +('9265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9265 MEMBER','1','10179') +('9266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9266 MEMBER','1','10180') +('9267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9267 MEMBER','1','10181') +('9268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9268 MEMBER','1','10182') +('9269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9269 MEMBER','1','10183') +('9270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9270 MEMBER','1','10184') +('9271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9271 MEMBER','1','10185') +('9272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9272 MEMBER','1','10186') +('9273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9273 MEMBER','1','10187') +('9274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9274 MEMBER','1','10188') +('9275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9275 MEMBER','1','10189') +('9276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9276 MEMBER','1','10190') +('9277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9277 MEMBER','1','10191') +('9278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9278 MEMBER','1','10192') +('9279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9279 MEMBER','1','10193') +('9280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9280 MEMBER','1','10194') +('9281','1','LASTNAME','FIRSTNAME',999.99,8.05,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9281 MEMBER','1','10195') +('9282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9282 MEMBER','1','10196') +('9283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9283 MEMBER','1','10197') +('9284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9284 MEMBER','1','10198') +('9285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9285 MEMBER','1','10199') +('9286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9286 MEMBER','1','10200') +('9236','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9236 MEMBER','1','10201') +('9215','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9215 MEMBER','1','10202') +('9223','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9223 MEMBER','1','10203') +('9224','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9224 MEMBER','1','10204') +('9226','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9226 MEMBER','1','10205') +('9227','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9227 MEMBER','1','10206') +('9227','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9227 MEMBER','1','10207') +('9228','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9228 MEMBER','1','10208') +('9228','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9228 MEMBER','1','10209') +('9229','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9229 MEMBER','1','10210') +('9233','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9233 MEMBER','1','10211') +('9238','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9238 MEMBER','1','10213') +('9247','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9247 MEMBER','1','10214') +('9247','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9247 MEMBER','1','10215') +('9247','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9247 MEMBER','1','10216') +('9248','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9248 MEMBER','1','10217') +('6273','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6273 MEMBER','1','10218') +('6','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"6 MEMBER','1','10219') +('4676','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4676 MEMBER','1','10220') +('891','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"891 MEMBER','1','10221') +('5358','2','LASTNAME','FIRSTNAME',NULL,5.87,'10',40.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5358 MEMBER','1','10222') +('9242','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9242 MEMBER','1','10223') +('9243','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9243 MEMBER','1','10224') +('9244','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9244 MEMBER','1','10225') +('9246','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9246 MEMBER','1','10226') +('9246','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9246 MEMBER','1','10227') +('9250','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9250 MEMBER','1','10228') +('9250','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9250 MEMBER','1','10229') +('9251','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9251 MEMBER','1','10230') +('9254','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9254 MEMBER','1','10231') +('9254','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9254 MEMBER','1','10232') +('9255','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9255 MEMBER','1','10233') +('9256','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9256 MEMBER','1','10234') +('9256','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9256 MEMBER','1','10235') +('9256','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9256 MEMBER','1','10236') +('9257','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9257 MEMBER','1','10237') +('9258','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9258 MEMBER','1','10238') +('9258','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9258 MEMBER','1','10239') +('9260','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9260 MEMBER','1','10240') +('9260','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9260 MEMBER','1','10241') +('9260','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9260 MEMBER','1','10242') +('9287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9287 MEMBER','1','10243') +('9288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9288 MEMBER','1','10244') +('9289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9289 MEMBER','1','10245') +('9290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9290 MEMBER','1','10246') +('9291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9291 MEMBER','1','10247') +('9292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9292 MEMBER','1','10248') +('9293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9293 MEMBER','1','10249') +('9294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9294 MEMBER','1','10250') +('9295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9295 MEMBER','1','10251') +('9296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9296 MEMBER','1','10252') +('9297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9297 MEMBER','1','10253') +('9298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9298 MEMBER','1','10254') +('9299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9299 MEMBER','1','10255') +('9300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9300 MEMBER','1','10256') +('9301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9301 MEMBER','1','10257') +('9302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9302 MEMBER','1','10258') +('9303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9303 MEMBER','1','10259') +('9304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9304 MEMBER','1','10260') +('9305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9305 MEMBER','1','10261') +('9306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9306 MEMBER','1','10262') +('9307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9307 MEMBER','1','10263') +('9308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9308 MEMBER','1','10264') +('9309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9309 MEMBER','1','10265') +('9310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9310 MEMBER','1','10266') +('9311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9311 MEMBER','1','10267') +('9312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9312 MEMBER','1','10268') +('9313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9313 MEMBER','1','10269') +('9314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9314 MEMBER','1','10270') +('9315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9315 MEMBER','1','10271') +('9316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9316 MEMBER','1','10272') +('9317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9317 MEMBER','1','10273') +('9318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9318 MEMBER','1','10274') +('9319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9319 MEMBER','1','10275') +('9320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9320 MEMBER','1','10276') +('9321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9321 MEMBER','1','10277') +('9322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9322 MEMBER','1','10278') +('9323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9323 MEMBER','1','10279') +('9324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9324 MEMBER','1','10280') +('9325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9325 MEMBER','1','10281') +('9326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9326 MEMBER','1','10282') +('9264','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9264 MEMBER','1','10283') +('9264','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9264 MEMBER','1','10284') +('9265','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9265 MEMBER','1','10285') +('9266','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9266 MEMBER','1','10286') +('9268','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9268 MEMBER','1','10287') +('9269','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9269 MEMBER','1','10288') +('9270','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9270 MEMBER','1','10289') +('9270','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9270 MEMBER','1','10290') +('534','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"534 MEMBER','1','10291') +('8470','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8470 MEMBER','1','10292') +('8044','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8044 MEMBER','1','10293') +('8044','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8044 MEMBER','1','10294') +('9272','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9272 MEMBER','1','10295') +('9272','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9272 MEMBER','1','10296') +('9273','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9273 MEMBER','1','10297') +('9275','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9275 MEMBER','1','10298') +('9275','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9275 MEMBER','1','10299') +('9276','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9276 MEMBER','1','10300') +('9276','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9276 MEMBER','1','10301') +('9277','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9277 MEMBER','1','10302') +('9278','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9278 MEMBER','1','10303') +('3023','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3023 MEMBER','1','10304') +('8149','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8149 MEMBER','1','10305') +('9952','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9952 MEMBER','1','10306') +('10207','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10207 MEMBER','1','10307') +('6719','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',286.44,'999','0','"6719 MEMBER','1','10308') +('9284','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9284 MEMBER','1','10309') +('9280','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9280 MEMBER','1','10310') +('9281','2','LASTNAME','FIRSTNAME',NULL,8.05,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"9281 MEMBER','1','10311') +('9295','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9295 MEMBER','1','10312') +('9295','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9295 MEMBER','1','10313') +('9282','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9282 MEMBER','1','10314') +('9282','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9282 MEMBER','1','10315') +('9295','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9295 MEMBER','1','10316') +('9192','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9192 MEMBER','1','10317') +('8041','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8041 MEMBER','1','10318') +('9285','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9285 MEMBER','1','10319') +('9286','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9286 MEMBER','1','10320') +('9286','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9286 MEMBER','1','10321') +('9286','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9286 MEMBER','1','10322') +('9287','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9287 MEMBER','1','10323') +('9287','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9287 MEMBER','1','10324') +('9288','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9288 MEMBER','1','10325') +('9288','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9288 MEMBER','1','10326') +('9288','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9288 MEMBER','1','10327') +('9291','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9291 MEMBER','1','10328') +('9291','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9291 MEMBER','1','10329') +('9291','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9291 MEMBER','1','10330') +('9292','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9292 MEMBER','1','10331') +('9293','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9293 MEMBER','1','10332') +('9296','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9296 MEMBER','1','10333') +('8731','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8731 MEMBER','1','10334') +('417','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"417 MEMBER','1','10335') +('9328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9328 MEMBER','1','10336') +('9329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9329 MEMBER','1','10337') +('9330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9330 MEMBER','1','10338') +('9331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9331 MEMBER','1','10339') +('9332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9332 MEMBER','1','10340') +('9333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9333 MEMBER','1','10341') +('9334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9334 MEMBER','1','10342') +('9335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9335 MEMBER','1','10343') +('9336','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',25.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9336 MEMBER','1','10344') +('9337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9337 MEMBER','1','10345') +('9338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9338 MEMBER','1','10346') +('9339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9339 MEMBER','1','10347') +('9340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9340 MEMBER','1','10348') +('9341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9341 MEMBER','1','10349') +('9342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9342 MEMBER','1','10350') +('9343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9343 MEMBER','1','10351') +('9344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9344 MEMBER','1','10352') +('9345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9345 MEMBER','1','10353') +('9346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9346 MEMBER','1','10354') +('9347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9347 MEMBER','1','10355') +('9348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9348 MEMBER','1','10356') +('9349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9349 MEMBER','1','10357') +('9350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9350 MEMBER','1','10358') +('9351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9351 MEMBER','1','10359') +('9352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9352 MEMBER','1','10360') +('9353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9353 MEMBER','1','10361') +('9354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9354 MEMBER','1','10362') +('9355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9355 MEMBER','1','10363') +('9356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9356 MEMBER','1','10364') +('9357','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9357 MEMBER','1','10365') +('9358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9358 MEMBER','1','10366') +('9359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9359 MEMBER','1','10367') +('9360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9360 MEMBER','1','10368') +('9361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9361 MEMBER','1','10369') +('9362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9362 MEMBER','1','10370') +('9363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9363 MEMBER','1','10371') +('9364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9364 MEMBER','1','10372') +('9365','1','LASTNAME','FIRSTNAME',999.99,5.49,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9365 MEMBER','1','10373') +('9366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9366 MEMBER','1','10374') +('4760','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3394.86,'999','0','"4760 MEMBER','1','10375') +('9312','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9312 MEMBER','1','10376') +('9298','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9298 MEMBER','1','10377') +('9299','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9299 MEMBER','1','10378') +('9300','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9300 MEMBER','1','10379') +('9300','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9300 MEMBER','1','10380') +('9301','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9301 MEMBER','1','10381') +('9301','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9301 MEMBER','1','10382') +('9302','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9302 MEMBER','1','10383') +('9302','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9302 MEMBER','1','10384') +('8833','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8833 MEMBER','1','10385') +('9304','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9304 MEMBER','1','10386') +('9304','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9304 MEMBER','1','10387') +('9304','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9304 MEMBER','1','10388') +('9305','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9305 MEMBER','1','10389') +('9305','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9305 MEMBER','1','10390') +('9305','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9305 MEMBER','1','10391') +('9306','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9306 MEMBER','1','10392') +('9306','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9306 MEMBER','1','10393') +('9307','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9307 MEMBER','1','10394') +('9308','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9308 MEMBER','1','10395') +('9308','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9308 MEMBER','1','10396') +('9308','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9308 MEMBER','1','10397') +('9309','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9309 MEMBER','1','10398') +('9310','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9310 MEMBER','1','10399') +('9311','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9311 MEMBER','1','10400') +('9311','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9311 MEMBER','1','10401') +('157','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"157 MEMBER','1','10402') +('4598','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4598 MEMBER','1','10403') +('6368','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6368 MEMBER','1','10404') +('9121','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9121 MEMBER','1','10405') +('9313','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9313 MEMBER','1','10406') +('9316','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9316 MEMBER','1','10407') +('9317','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9317 MEMBER','1','10408') +('9318','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9318 MEMBER','1','10409') +('9320','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9320 MEMBER','1','10410') +('9321','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9321 MEMBER','1','10411') +('9322','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9322 MEMBER','1','10412') +('9322','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9322 MEMBER','1','10413') +('9322','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9322 MEMBER','1','10414') +('9323','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9323 MEMBER','1','10415') +('9323','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9323 MEMBER','1','10416') +('9323','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9323 MEMBER','1','10417') +('9324','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9324 MEMBER','1','10418') +('9325','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9325 MEMBER','1','10419') +('9326','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9326 MEMBER','1','10420') +('9326','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9326 MEMBER','1','10421') +('9327','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9327 MEMBER','1','10422') +('9327','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9327 MEMBER','1','10423') +('9328','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9328 MEMBER','1','10424') +('9328','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9328 MEMBER','1','10425') +('9328','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9328 MEMBER','1','10426') +('9329','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9329 MEMBER','1','10427') +('9329','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9329 MEMBER','1','10428') +('9330','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9330 MEMBER','1','10429') +('9332','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9332 MEMBER','1','10430') +('9332','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9332 MEMBER','1','10431') +('9332','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9332 MEMBER','1','10432') +('9333','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9333 MEMBER','1','10433') +('9333','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9333 MEMBER','1','10434') +('9333','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9333 MEMBER','1','10435') +('9334','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9334 MEMBER','1','10436') +('9334','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9334 MEMBER','1','10437') +('9335','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9335 MEMBER','1','10438') +('9336','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',25.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"9336 MEMBER','1','10439') +('9337','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9337 MEMBER','1','10440') +('9341','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9341 MEMBER','1','10441') +('9342','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9342 MEMBER','1','10442') +('9344','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9344 MEMBER','1','10443') +('9344','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9344 MEMBER','1','10444') +('9346','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9346 MEMBER','1','10445') +('9346','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9346 MEMBER','1','10446') +('9347','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9347 MEMBER','1','10447') +('9348','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9348 MEMBER','1','10448') +('9367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9367 MEMBER','1','10449') +('9368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9368 MEMBER','1','10450') +('9369','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9369 MEMBER','1','10451') +('9370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9370 MEMBER','1','10452') +('9371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9371 MEMBER','1','10453') +('9372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9372 MEMBER','1','10454') +('9373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9373 MEMBER','1','10455') +('9374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9374 MEMBER','1','10456') +('9375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9375 MEMBER','1','10457') +('9376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9376 MEMBER','1','10458') +('9377','1','LASTNAME','FIRSTNAME',999.99,5.05,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','1','"9377 MEMBER','1','10459') +('9378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9378 MEMBER','1','10460') +('9379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9379 MEMBER','1','10461') +('9380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9380 MEMBER','1','10462') +('9381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9381 MEMBER','1','10463') +('9382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9382 MEMBER','1','10464') +('9383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9383 MEMBER','1','10465') +('9384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9384 MEMBER','1','10466') +('9385','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9385 MEMBER','1','10467') +('9386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9386 MEMBER','1','10468') +('9387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9387 MEMBER','1','10469') +('9388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9388 MEMBER','1','10470') +('9389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9389 MEMBER','1','10471') +('9390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9390 MEMBER','1','10472') +('9391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9391 MEMBER','1','10473') +('9392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9392 MEMBER','1','10474') +('9393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9393 MEMBER','1','10475') +('9394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9394 MEMBER','1','10476') +('9395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9395 MEMBER','1','10477') +('9396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9396 MEMBER','1','10478') +('9397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9397 MEMBER','1','10479') +('9398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9398 MEMBER','1','10480') +('9399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9399 MEMBER','1','10481') +('9400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9400 MEMBER','1','10482') +('9401','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9401 MEMBER','1','10483') +('9402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"9402 MEMBER','1','10484') +('9403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9403 MEMBER','1','10485') +('9404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9404 MEMBER','1','10486') +('9405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9405 MEMBER','1','10487') +('9406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9406 MEMBER','1','10488') +('9340','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9340 MEMBER','1','10489') +('9340','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9340 MEMBER','1','10490') +('9340','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9340 MEMBER','1','10491') +('9349','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9349 MEMBER','1','10492') +('9350','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9350 MEMBER','1','10493') +('9352','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9352 MEMBER','1','10494') +('9352','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9352 MEMBER','1','10495') +('9352','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9352 MEMBER','1','10496') +('9354','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9354 MEMBER','1','10497') +('9354','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9354 MEMBER','1','10498') +('9354','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9354 MEMBER','1','10499') +('9356','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9356 MEMBER','1','10500') +('9356','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9356 MEMBER','1','10501') +('9357','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9357 MEMBER','1','10502') +('9357','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9357 MEMBER','1','10503') +('9357','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9357 MEMBER','1','10504') +('9358','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9358 MEMBER','1','10505') +('9360','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9360 MEMBER','1','10506') +('9361','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9361 MEMBER','1','10507') +('9362','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9362 MEMBER','1','10508') +('9365','2','LASTNAME','FIRSTNAME',NULL,5.49,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"9365 MEMBER','1','10509') +('9363','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9363 MEMBER','1','10510') +('9363','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9363 MEMBER','1','10511') +('9363','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9363 MEMBER','1','10512') +('9364','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9364 MEMBER','1','10513') +('9366','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9366 MEMBER','1','10514') +('9367','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9367 MEMBER','1','10515') +('9377','2','LASTNAME','FIRSTNAME',NULL,5.05,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"9377 MEMBER','1','10516') +('9377','3','LASTNAME','FIRSTNAME',NULL,5.05,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"9377 MEMBER','1','10517') +('9370','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9370 MEMBER','1','10518') +('9372','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9372 MEMBER','1','10519') +('9373','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9373 MEMBER','1','10520') +('9374','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9374 MEMBER','1','10521') +('9375','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9375 MEMBER','1','10522') +('9375','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9375 MEMBER','1','10523') +('9375','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9375 MEMBER','1','10524') +('9376','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9376 MEMBER','1','10525') +('9376','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9376 MEMBER','1','10526') +('7225','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7225 MEMBER','1','10527') +('10159','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10159 MEMBER','1','10528') +('10160','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10160 MEMBER','1','10529') +('10167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10167 MEMBER','1','10530') +('10168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10168 MEMBER','1','10531') +('10169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10169 MEMBER','1','10532') +('10170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10170 MEMBER','1','10533') +('10171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10171 MEMBER','1','10534') +('10172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10172 MEMBER','1','10535') +('10173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10173 MEMBER','1','10536') +('10174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10174 MEMBER','1','10537') +('10175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10175 MEMBER','1','10538') +('10176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10176 MEMBER','1','10539') +('10177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10177 MEMBER','1','10540') +('10178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10178 MEMBER','1','10541') +('10179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10179 MEMBER','1','10542') +('10180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10180 MEMBER','1','10543') +('10181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10181 MEMBER','1','10544') +('10182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10182 MEMBER','1','10545') +('10183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10183 MEMBER','1','10546') +('10184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10184 MEMBER','1','10547') +('10185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10185 MEMBER','1','10548') +('10186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10186 MEMBER','1','10549') +('10187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10187 MEMBER','1','10550') +('10188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10188 MEMBER','1','10551') +('10189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10189 MEMBER','1','10552') +('10190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10190 MEMBER','1','10553') +('10191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10191 MEMBER','1','10554') +('10192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10192 MEMBER','1','10555') +('10193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10193 MEMBER','1','10556') +('10194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10194 MEMBER','1','10557') +('10195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10195 MEMBER','1','10558') +('10196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10196 MEMBER','1','10559') +('10197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10197 MEMBER','1','10560') +('10198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10198 MEMBER','1','10561') +('10199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10199 MEMBER','1','10562') +('10200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10200 MEMBER','1','10563') +('10201','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',100.00,'1','1','1','PC','3','1','0',0.00,'999','0','"10201 MEMBER','1','10564') +('10202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10202 MEMBER','1','10565') +('10203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10203 MEMBER','1','10566') +('10204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10204 MEMBER','1','10567') +('10205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10205 MEMBER','1','10568') +('10206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10206 MEMBER','1','10569') +('10162','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10162 MEMBER','1','10570') +('10162','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10162 MEMBER','1','10571') +('10163','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10163 MEMBER','1','10572') +('10164','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10164 MEMBER','1','10573') +('10165','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10165 MEMBER','1','10574') +('9899','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9899 MEMBER','1','10575') +('9899','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9899 MEMBER','1','10576') +('10166','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10166 MEMBER','1','10577') +('4760','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',3394.86,'999','0','"4760 MEMBER','1','10578') +('10169','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10169 MEMBER','1','10579') +('10170','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10170 MEMBER','1','10580') +('10170','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10170 MEMBER','1','10581') +('6686','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',297.16,'999','1','"6686 MEMBER','1','10582') +('10172','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10172 MEMBER','1','10583') +('10171','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10171 MEMBER','1','10584') +('10179','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10179 MEMBER','1','10585') +('9543','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9543 MEMBER','1','10586') +('2083','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2083 MEMBER','1','10587') +('2083','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2083 MEMBER','1','10588') +('10176','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10176 MEMBER','1','10589') +('8466','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8466 MEMBER','1','10590') +('10177','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10177 MEMBER','1','10591') +('10177','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10177 MEMBER','1','10592') +('10177','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10177 MEMBER','1','10593') +('9782','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9782 MEMBER','1','10594') +('9782','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9782 MEMBER','1','10595') +('10180','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10180 MEMBER','1','10596') +('10502','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10502 MEMBER','1','10597') +('8763','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8763 MEMBER','1','10598') +('8763','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8763 MEMBER','1','10599') +('10173','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10173 MEMBER','1','10600') +('10207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10207 MEMBER','1','10601') +('10208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10208 MEMBER','1','10602') +('10209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10209 MEMBER','1','10603') +('10210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10210 MEMBER','1','10604') +('10211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10211 MEMBER','1','10605') +('10212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10212 MEMBER','1','10606') +('10213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10213 MEMBER','1','10607') +('10214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10214 MEMBER','1','10608') +('10215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10215 MEMBER','1','10609') +('10216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10216 MEMBER','1','10610') +('10217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10217 MEMBER','1','10611') +('10218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10218 MEMBER','1','10612') +('10219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10219 MEMBER','1','10613') +('10220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10220 MEMBER','1','10614') +('10221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10221 MEMBER','1','10615') +('10222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10222 MEMBER','1','10616') +('10224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10224 MEMBER','1','10617') +('10226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10226 MEMBER','1','10618') +('10227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10227 MEMBER','1','10619') +('10228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10228 MEMBER','1','10620') +('10229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10229 MEMBER','1','10621') +('10230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10230 MEMBER','1','10622') +('10231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10231 MEMBER','1','10623') +('10232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"10232 MEMBER','1','10624') +('10233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10233 MEMBER','1','10625') +('10234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10234 MEMBER','1','10626') +('10235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10235 MEMBER','1','10627') +('10236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10236 MEMBER','1','10628') +('10237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10237 MEMBER','1','10629') +('10238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10238 MEMBER','1','10630') +('10239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10239 MEMBER','1','10631') +('10240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10240 MEMBER','1','10632') +('10241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10241 MEMBER','1','10633') +('10242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10242 MEMBER','1','10634') +('10243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10243 MEMBER','1','10635') +('10244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10244 MEMBER','1','10636') +('10245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10245 MEMBER','1','10637') +('10246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10246 MEMBER','1','10638') +('10183','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10183 MEMBER','1','10639') +('10185','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10185 MEMBER','1','10640') +('10185','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10185 MEMBER','1','10641') +('10185','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10185 MEMBER','1','10642') +('10186','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10186 MEMBER','1','10643') +('10186','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10186 MEMBER','1','10644') +('10187','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10187 MEMBER','1','10645') +('10187','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10187 MEMBER','1','10646') +('8722','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"8722 MEMBER','1','10647') +('10155','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10155 MEMBER','1','10648') +('4730','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',699.18,'999','0','"4730 MEMBER','1','10649') +('4579','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3589.97,'999','0','"4579 MEMBER','1','10650') +('10188','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10188 MEMBER','1','10651') +('10189','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10189 MEMBER','1','10652') +('4764','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3533.55,'999','0','"4764 MEMBER','1','10653') +('4764','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3533.55,'999','0','"4764 MEMBER','1','10654') +('446','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"446 MEMBER','1','10655') +('4403','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4403 MEMBER','1','10656') +('895','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"895 MEMBER','1','10657') +('10191','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10191 MEMBER','1','10658') +('10191','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10191 MEMBER','1','10659') +('10192','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10192 MEMBER','1','10660') +('10193','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10193 MEMBER','1','10661') +('10193','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10193 MEMBER','1','10662') +('10194','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10194 MEMBER','1','10663') +('10195','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10195 MEMBER','1','10664') +('10196','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10196 MEMBER','1','10665') +('532','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2922.98,'999','1','"532 MEMBER','1','10666') +('2709','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',731.62,'999','0','"2709 MEMBER','1','10667') +('10199','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10199 MEMBER','1','10668') +('10200','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10200 MEMBER','1','10669') +('4076','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4076 MEMBER','1','10670') +('10202','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10202 MEMBER','1','10671') +('4791','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',612.05,'999','0','"4791 MEMBER','1','10672') +('8428','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8428 MEMBER','1','10673') +('8428','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"8428 MEMBER','1','10674') +('10203','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10203 MEMBER','1','10675') +('10307','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10307 MEMBER','1','10676') +('10206','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10206 MEMBER','1','10677') +('10214','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10214 MEMBER','1','10678') +('10211','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10211 MEMBER','1','10679') +('10212','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10212 MEMBER','1','10680') +('10212','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10212 MEMBER','1','10681') +('10212','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10212 MEMBER','1','10682') +('10215','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10215 MEMBER','1','10683') +('7234','4','LASTNAME','FIRSTNAME',999.99,107.61,'10',125.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7234 MEMBER','1','10684') +('10218','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10218 MEMBER','1','10685') +('9284','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9284 MEMBER','1','10686') +('10313','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10313 MEMBER','1','10687') +('10218','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10218 MEMBER','1','10688') +('10219','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10219 MEMBER','1','10689') +('10219','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10219 MEMBER','1','10690') +('10226','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10226 MEMBER','1','10691') +('10182','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10182 MEMBER','1','10692') +('10247','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10247 MEMBER','1','10693') +('10248','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10248 MEMBER','1','10694') +('10249','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10249 MEMBER','1','10695') +('10250','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10250 MEMBER','1','10696') +('10251','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10251 MEMBER','1','10697') +('10252','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10252 MEMBER','1','10698') +('10253','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10253 MEMBER','1','10699') +('10254','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10254 MEMBER','1','10700') +('10255','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10255 MEMBER','1','10701') +('10256','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10256 MEMBER','1','10702') +('10257','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10257 MEMBER','1','10703') +('10258','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10258 MEMBER','1','10704') +('10259','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10259 MEMBER','1','10705') +('10260','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10260 MEMBER','1','10706') +('10261','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10261 MEMBER','1','10707') +('10262','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10262 MEMBER','1','10708') +('10263','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10263 MEMBER','1','10709') +('10264','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10264 MEMBER','1','10710') +('10265','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10265 MEMBER','1','10711') +('10266','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10266 MEMBER','1','10712') +('10267','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10267 MEMBER','1','10713') +('10268','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10268 MEMBER','1','10714') +('10269','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10269 MEMBER','1','10715') +('10270','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10270 MEMBER','1','10716') +('10271','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10271 MEMBER','1','10717') +('10272','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10272 MEMBER','1','10718') +('10273','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10273 MEMBER','1','10719') +('10274','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10274 MEMBER','1','10720') +('10275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10275 MEMBER','1','10721') +('10276','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10276 MEMBER','1','10722') +('10277','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10277 MEMBER','1','10723') +('10278','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10278 MEMBER','1','10724') +('10279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10279 MEMBER','1','10725') +('10280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10280 MEMBER','1','10726') +('10281','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10281 MEMBER','1','10727') +('10282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10282 MEMBER','1','10728') +('10283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10283 MEMBER','1','10729') +('10284','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10284 MEMBER','1','10730') +('10285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10285 MEMBER','1','10731') +('10286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10286 MEMBER','1','10732') +('10225','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10225 MEMBER','1','10733') +('10240','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10240 MEMBER','1','10734') +('10240','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10240 MEMBER','1','10735') +('10240','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10240 MEMBER','1','10736') +('10245','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10245 MEMBER','1','10737') +('10236','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10236 MEMBER','1','10738') +('2882','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2882 MEMBER','1','10739') +('10231','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10231 MEMBER','1','10740') +('6987','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6987 MEMBER','1','10741') +('10232','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"10232 MEMBER','1','10742') +('10232','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"10232 MEMBER','1','10743') +('10232','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"10232 MEMBER','1','10744') +('8947','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8947 MEMBER','1','10745') +('8947','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8947 MEMBER','1','10746') +('9597','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9597 MEMBER','1','10747') +('39','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',16.53,'999','0','"39 MEMBER','1','10748') +('333','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',789.83,'999','0','"333 MEMBER','1','10749') +('10214','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10214 MEMBER','1','10750') +('10245','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10245 MEMBER','1','10751') +('10250','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10250 MEMBER','1','10752') +('9967','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9967 MEMBER','1','10753') +('10241','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10241 MEMBER','1','10754') +('10241','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10241 MEMBER','1','10755') +('10242','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10242 MEMBER','1','10756') +('10244','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10244 MEMBER','1','10757') +('7879','2','LASTNAME','FIRSTNAME',999.99,6.35,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"7879 MEMBER','1','10758') +('10248','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10248 MEMBER','1','10759') +('4962','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',499.81,'999','1','"4962 MEMBER','1','10760') +('6042','1','LASTNAME','FIRSTNAME',999.99,225.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6042 MEMBER','1','10761') +('6043','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6043 MEMBER','1','10762') +('6044','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6044 MEMBER','1','10763') +('6045','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6045 MEMBER','1','10764') +('6046','1','LASTNAME','FIRSTNAME',999.99,370.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6046 MEMBER','1','10765') +('6047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6047 MEMBER','1','10766') +('6048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6048 MEMBER','1','10767') +('6049','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6049 MEMBER','1','10768') +('6050','1','LASTNAME','FIRSTNAME',999.99,225.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6050 MEMBER','1','10769') +('6051','1','LASTNAME','FIRSTNAME',999.99,56.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6051 MEMBER','1','10770') +('6052','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6052 MEMBER','1','10771') +('6053','1','LASTNAME','FIRSTNAME',999.99,113.50,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6053 MEMBER','1','10772') +('6054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6054 MEMBER','1','10773') +('6055','1','LASTNAME','FIRSTNAME',999.99,112.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6055 MEMBER','1','10774') +('6056','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6056 MEMBER','1','10775') +('6057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6057 MEMBER','1','10776') +('6058','1','LASTNAME','FIRSTNAME',999.99,56.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6058 MEMBER','1','10777') +('6059','1','LASTNAME','FIRSTNAME',999.99,56.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6059 MEMBER','1','10778') +('6060','1','LASTNAME','FIRSTNAME',999.99,165.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"6060 MEMBER','1','10779') +('6061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6061 MEMBER','1','10780') +('6062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6062 MEMBER','1','10781') +('6063','1','LASTNAME','FIRSTNAME',999.99,112.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6063 MEMBER','1','10782') +('6064','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6064 MEMBER','1','10783') +('6065','1','LASTNAME','FIRSTNAME',999.99,112.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6065 MEMBER','1','10784') +('6066','1','LASTNAME','FIRSTNAME',999.99,225.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6066 MEMBER','1','10785') +('6067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6067 MEMBER','1','10786') +('6068','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6068 MEMBER','1','10787') +('6069','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6069 MEMBER','1','10788') +('6070','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6070 MEMBER','1','10789') +('6071','1','LASTNAME','FIRSTNAME',999.99,112.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6071 MEMBER','1','10790') +('6072','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6072 MEMBER','1','10791') +('6073','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6073 MEMBER','1','10792') +('6074','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6074 MEMBER','1','10793') +('6075','1','LASTNAME','FIRSTNAME',999.99,56.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6075 MEMBER','1','10794') +('6076','1','LASTNAME','FIRSTNAME',999.99,112.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','1','"6076 MEMBER','1','10795') +('6077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','1','"6077 MEMBER','1','10796') +('6078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','1','"6078 MEMBER','1','10797') +('6079','1','LASTNAME','FIRSTNAME',999.99,41.25,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','1','"6079 MEMBER','1','10798') +('10504','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10504 MEMBER','1','10799') +('10321','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10321 MEMBER','1','10800') +('6494','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3591.07,'999','0','"6494 MEMBER','1','10801') +('10325','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10325 MEMBER','1','10802') +('8499','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8499 MEMBER','1','10803') +('10251','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10251 MEMBER','1','10804') +('10217','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10217 MEMBER','1','10805') +('10218','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10218 MEMBER','1','10806') +('10219','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10219 MEMBER','1','10807') +('10227','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10227 MEMBER','1','10808') +('10228','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10228 MEMBER','1','10809') +('10228','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10228 MEMBER','1','10810') +('8511','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8511 MEMBER','1','10811') +('10234','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10234 MEMBER','1','10812') +('6038','2','LASTNAME','FIRSTNAME',NULL,4.65,'0',150.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6038 MEMBER','1','10813') +('6038','3','LASTNAME','FIRSTNAME',NULL,4.65,'0',150.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6038 MEMBER','1','10814') +('6038','4','LASTNAME','FIRSTNAME',NULL,4.65,'0',150.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6038 MEMBER','1','10815') +('4084','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',197.32,'999','0','"4084 MEMBER','1','10816') +('209','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',896.28,'999','1','"209 MEMBER','1','10817') +('4461','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',143.73,'999','0','"4461 MEMBER','1','10818') +('10259','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10259 MEMBER','1','10819') +('6323','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',438.11,'999','0','"6323 MEMBER','1','10820') +('10299','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10299 MEMBER','1','10821') +('370','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',12.55,'999','1','"370 MEMBER','1','10822') +('10261','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10261 MEMBER','1','10823') +('8532','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8532 MEMBER','1','10825') +('9723','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9723 MEMBER','1','10826') +('10265','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10265 MEMBER','1','10827') +('6365','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6365 MEMBER','1','10828') +('10247','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10247 MEMBER','1','10829') +('10249','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10249 MEMBER','1','10830') +('10258','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10258 MEMBER','1','10831') +('10266','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10266 MEMBER','1','10832') +('10272','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10272 MEMBER','1','10833') +('4045','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1596.16,'999','0','"4045 MEMBER','1','10834') +('10268','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10268 MEMBER','1','10835') +('10268','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10268 MEMBER','1','10836') +('10287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10287 MEMBER','1','10837') +('10288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10288 MEMBER','1','10838') +('10289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10289 MEMBER','1','10839') +('10290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10290 MEMBER','1','10840') +('10291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10291 MEMBER','1','10841') +('10292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10292 MEMBER','1','10842') +('10293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10293 MEMBER','1','10843') +('10294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10294 MEMBER','1','10844') +('10295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10295 MEMBER','1','10845') +('10296','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10296 MEMBER','1','10846') +('10297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10297 MEMBER','1','10847') +('10298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10298 MEMBER','1','10848') +('10299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10299 MEMBER','1','10849') +('10300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10300 MEMBER','1','10850') +('10301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10301 MEMBER','1','10851') +('10302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10302 MEMBER','1','10852') +('10303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10303 MEMBER','1','10853') +('10304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10304 MEMBER','1','10854') +('10305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10305 MEMBER','1','10855') +('10306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10306 MEMBER','1','10856') +('10307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10307 MEMBER','1','10857') +('10308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10308 MEMBER','1','10858') +('10309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10309 MEMBER','1','10859') +('10310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10310 MEMBER','1','10860') +('10311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10311 MEMBER','1','10861') +('10312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10312 MEMBER','1','10862') +('10313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10313 MEMBER','1','10863') +('10314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10314 MEMBER','1','10864') +('10315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10315 MEMBER','1','10865') +('10316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10316 MEMBER','1','10866') +('10317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10317 MEMBER','1','10867') +('10318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10318 MEMBER','1','10868') +('10319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10319 MEMBER','1','10869') +('10320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10320 MEMBER','1','10870') +('10321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10321 MEMBER','1','10871') +('10322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10322 MEMBER','1','10872') +('10323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10323 MEMBER','1','10873') +('10324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10324 MEMBER','1','10874') +('10325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10325 MEMBER','1','10875') +('10326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10326 MEMBER','1','10876') +('9178','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9178 MEMBER','1','10877') +('10276','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10276 MEMBER','1','10878') +('7357','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7357 MEMBER','1','10879') +('10267','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10267 MEMBER','1','10880') +('10267','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10267 MEMBER','1','10881') +('10274','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10274 MEMBER','1','10882') +('10274','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10274 MEMBER','1','10883') +('10275','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10275 MEMBER','1','10884') +('1819','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',1084.89,'999','0','"1819 MEMBER','1','10885') +('45','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',2249.53,'999','0','"45 MEMBER','1','10886') +('10276','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10276 MEMBER','1','10887') +('10277','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10277 MEMBER','1','10888') +('10321','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10321 MEMBER','1','10889') +('2586','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',4666.44,'999','0','"2586 MEMBER','1','10890') +('10278','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10278 MEMBER','1','10891') +('320','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3480.40,'999','0','"320 MEMBER','1','10892') +('10280','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10280 MEMBER','1','10893') +('10281','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10281 MEMBER','1','10894') +('10283','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10283 MEMBER','1','10895') +('10271','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10271 MEMBER','1','10896') +('629','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1929.66,'999','0','"629 MEMBER','1','10897') +('4825','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',22.19,'999','0','"4825 MEMBER','1','10898') +('6081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6081 MEMBER','1','10899') +('6082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6082 MEMBER','1','10900') +('6083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6083 MEMBER','1','10901') +('6084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',300.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6084 MEMBER','1','10902') +('6085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','2','0','0',0.00,'999','1','"6085 MEMBER','1','10903') +('6086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6086 MEMBER','1','10904') +('6087','1','LASTNAME','FIRSTNAME',999.99,112.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6087 MEMBER','1','10905') +('6088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6088 MEMBER','1','10906') +('6089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','999','"6089 MEMBER','1','10907') +('10285','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10285 MEMBER','1','10908') +('428','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',152.12,'999','1','"428 MEMBER','1','10909') +('10286','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10286 MEMBER','1','10910') +('10287','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10287 MEMBER','1','10911') +('10288','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10288 MEMBER','1','10912') +('1638','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',209.25,'999','0','"1638 MEMBER','1','10913') +('10051','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10051 MEMBER','1','10914') +('10051','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10051 MEMBER','1','10915') +('10264','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10264 MEMBER','1','10916') +('10289','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10289 MEMBER','1','10917') +('10289','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10289 MEMBER','1','10918') +('10289','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10289 MEMBER','1','10919') +('10291','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10291 MEMBER','1','10920') +('6494','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3591.07,'999','0','"6494 MEMBER','1','10921') +('6796','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.62,'999','0','"6796 MEMBER','1','10922') +('6796','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',24.62,'999','0','"6796 MEMBER','1','10923') +('10292','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10292 MEMBER','1','10924') +('10292','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10292 MEMBER','1','10925') +('10292','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10292 MEMBER','1','10926') +('10293','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10293 MEMBER','1','10927') +('10298','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10298 MEMBER','1','10928') +('10294','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10294 MEMBER','1','10929') +('6323','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',438.11,'999','0','"6323 MEMBER','1','10930') +('8537','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8537 MEMBER','1','10931') +('8780','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8780 MEMBER','1','10933') +('7234','2','LASTNAME','FIRSTNAME',999.99,107.61,'10',125.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7234 MEMBER','1','10934') +('7234','3','LASTNAME','FIRSTNAME',999.99,107.61,'10',125.00,'1','1','1','PC','3','1','0',0.00,'999','0','"7234 MEMBER','1','10935') +('977','2','LASTNAME','FIRSTNAME',999.99,15.48,'0',20.00,'1','1','1','PC','1','0','0',8764.34,'999','0','"977 MEMBER','1','10936') +('977','3','LASTNAME','FIRSTNAME',999.99,15.48,'0',20.00,'1','1','1','PC','1','0','0',8764.34,'999','0','"977 MEMBER','1','10937') +('9976','2','LASTNAME','FIRSTNAME',999.99,18.63,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"9976 MEMBER','1','10938') +('9976','3','LASTNAME','FIRSTNAME',999.99,18.63,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"9976 MEMBER','1','10939') +('10149','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10149 MEMBER','1','10940') +('8398','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8398 MEMBER','1','10941') +('7973','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7973 MEMBER','1','10942') +('1276','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',53.45,'999','0','"1276 MEMBER','1','10943') +('8226','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8226 MEMBER','1','10944') +('88','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3488.44,'999','0','"88 MEMBER','1','10945') +('7248','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7248 MEMBER','1','10946') +('7417','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"7417 MEMBER','1','10947') +('4534','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',691.66,'999','0','"4534 MEMBER','1','10948') +('4534','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',691.66,'999','0','"4534 MEMBER','1','10949') +('2884','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"2884 MEMBER','1','10950') +('6865','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','0','"6865 MEMBER','1','10951') +('8107','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8107 MEMBER','1','10952') +('9271','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9271 MEMBER','1','10953') +('10302','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10302 MEMBER','1','10956') +('10303','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10303 MEMBER','1','10957') +('6701','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',202.07,'999','1','"6701 MEMBER','1','10958') +('10310','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10310 MEMBER','1','10959') +('8456','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8456 MEMBER','1','10960') +('6033','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',546.51,'999','0','"6033 MEMBER','1','10961') +('10327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10327 MEMBER','1','10962') +('10328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10328 MEMBER','1','10963') +('10329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10329 MEMBER','1','10964') +('10330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10330 MEMBER','1','10965') +('10331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10331 MEMBER','1','10966') +('10332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10332 MEMBER','1','10967') +('10333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10333 MEMBER','1','10968') +('10334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10334 MEMBER','1','10969') +('10335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10335 MEMBER','1','10970') +('10336','1','LASTNAME','FIRSTNAME',999.99,9.32,'10',10.80,'1','1','1','PC','3','1','0',0.00,'999','1','"10336 MEMBER','1','10971') +('10337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10337 MEMBER','1','10972') +('10338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10338 MEMBER','1','10973') +('10339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10339 MEMBER','1','10974') +('10340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10340 MEMBER','1','10975') +('10341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10341 MEMBER','1','10976') +('10342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10342 MEMBER','1','10977') +('10343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10343 MEMBER','1','10978') +('10344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10344 MEMBER','1','10979') +('10345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10345 MEMBER','1','10980') +('10346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10346 MEMBER','1','10981') +('10347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10347 MEMBER','1','10982') +('10348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10348 MEMBER','1','10983') +('10349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10349 MEMBER','1','10984') +('10350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10350 MEMBER','1','10985') +('10351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10351 MEMBER','1','10986') +('10352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10352 MEMBER','1','10987') +('10353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10353 MEMBER','1','10988') +('10354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10354 MEMBER','1','10989') +('10355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10355 MEMBER','1','10990') +('10356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10356 MEMBER','1','10991') +('10357','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10357 MEMBER','1','10992') +('10358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10358 MEMBER','1','10993') +('10359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10359 MEMBER','1','10994') +('10360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10360 MEMBER','1','10995') +('10361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10361 MEMBER','1','10996') +('10362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10362 MEMBER','1','10997') +('10363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10363 MEMBER','1','10998') +('10364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10364 MEMBER','1','10999') +('10365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10365 MEMBER','1','11000') +('10366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10366 MEMBER','1','11001') +('4224','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',426.95,'999','1','"4224 MEMBER','1','11002') +('4224','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',426.95,'999','1','"4224 MEMBER','1','11003') +('10057','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10057 MEMBER','1','11004') +('9745','4','LASTNAME','FIRSTNAME',999.99,15.74,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9745 MEMBER','1','11005') +('10059','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10059 MEMBER','1','11006') +('10060','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10060 MEMBER','1','11007') +('10061','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10061 MEMBER','1','11008') +('10061','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10061 MEMBER','1','11009') +('10061','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10061 MEMBER','1','11010') +('10063','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10063 MEMBER','1','11011') +('10064','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10064 MEMBER','1','11012') +('10064','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10064 MEMBER','1','11013') +('10066','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10066 MEMBER','1','11014') +('10067','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10067 MEMBER','1','11015') +('10067','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10067 MEMBER','1','11016') +('10067','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10067 MEMBER','1','11017') +('10069','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10069 MEMBER','1','11018') +('10070','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10070 MEMBER','1','11019') +('10071','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"10071 MEMBER','1','11020') +('10072','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10072 MEMBER','1','11021') +('10075','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10075 MEMBER','1','11022') +('10077','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10077 MEMBER','1','11023') +('10081','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10081 MEMBER','1','11024') +('10082','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10082 MEMBER','1','11025') +('10082','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10082 MEMBER','1','11026') +('7115','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7115 MEMBER','1','11027') +('9301','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9301 MEMBER','1','11028') +('10029','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10029 MEMBER','1','11029') +('10087','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10087 MEMBER','1','11030') +('10089','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10089 MEMBER','1','11031') +('10090','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10090 MEMBER','1','11032') +('10091','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10091 MEMBER','1','11033') +('5385','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5385 MEMBER','1','11034') +('10092','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10092 MEMBER','1','11035') +('6247','2','LASTNAME','FIRSTNAME',NULL,4.78,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"6247 MEMBER','1','11036') +('6247','3','LASTNAME','FIRSTNAME',NULL,4.78,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"6247 MEMBER','1','11037') +('10096','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10096 MEMBER','1','11038') +('10098','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10098 MEMBER','1','11039') +('10099','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10099 MEMBER','1','11040') +('10099','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10099 MEMBER','1','11041') +('10099','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10099 MEMBER','1','11042') +('10101','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10101 MEMBER','1','11043') +('10101','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10101 MEMBER','1','11044') +('10102','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10102 MEMBER','1','11045') +('10103','2','LASTNAME','FIRSTNAME',NULL,4.35,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10103 MEMBER','1','11046') +('10127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10127 MEMBER','1','11047') +('10128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10128 MEMBER','1','11048') +('10129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10129 MEMBER','1','11049') +('10130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10130 MEMBER','1','11050') +('10131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10131 MEMBER','1','11051') +('10132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"10132 MEMBER','1','11052') +('10133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10133 MEMBER','1','11053') +('10134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10134 MEMBER','1','11054') +('10135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10135 MEMBER','1','11055') +('10136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10136 MEMBER','1','11056') +('10137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10137 MEMBER','1','11057') +('10138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10138 MEMBER','1','11058') +('10139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10139 MEMBER','1','11059') +('10140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10140 MEMBER','1','11060') +('10141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10141 MEMBER','1','11061') +('10143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10143 MEMBER','1','11062') +('10144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10144 MEMBER','1','11063') +('10145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10145 MEMBER','1','11064') +('10146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10146 MEMBER','1','11065') +('10147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10147 MEMBER','1','11066') +('10148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10148 MEMBER','1','11067') +('10149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10149 MEMBER','1','11068') +('10150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10150 MEMBER','1','11069') +('10151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10151 MEMBER','1','11070') +('10152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10152 MEMBER','1','11071') +('10153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10153 MEMBER','1','11072') +('10154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10154 MEMBER','1','11073') +('10155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10155 MEMBER','1','11074') +('10156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10156 MEMBER','1','11075') +('10157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10157 MEMBER','1','11076') +('10158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10158 MEMBER','1','11077') +('10159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10159 MEMBER','1','11078') +('10160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10160 MEMBER','1','11079') +('10161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10161 MEMBER','1','11080') +('10162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10162 MEMBER','1','11081') +('10163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10163 MEMBER','1','11082') +('10164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10164 MEMBER','1','11083') +('10165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10165 MEMBER','1','11084') +('10166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10166 MEMBER','1','11085') +('10338','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10338 MEMBER','1','11086') +('10116','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10116 MEMBER','1','11089') +('10118','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10118 MEMBER','1','11090') +('10119','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10119 MEMBER','1','11091') +('10119','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10119 MEMBER','1','11092') +('10120','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10120 MEMBER','1','11093') +('4621','2','LASTNAME','FIRSTNAME',999.99,19.99,'0',20.00,'1','1','1','PC','1','0','0',6222.10,'999','0','"4621 MEMBER','1','11094') +('10112','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10112 MEMBER','1','11095') +('6163','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1517.26,'999','0','"6163 MEMBER','1','11096') +('10107','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10107 MEMBER','1','11097') +('10108','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10108 MEMBER','1','11098') +('10110','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10110 MEMBER','1','11099') +('10113','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10113 MEMBER','1','11100') +('10125','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10125 MEMBER','1','11101') +('10125','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10125 MEMBER','1','11102') +('10125','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10125 MEMBER','1','11103') +('7444','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7444 MEMBER','1','11104') +('7444','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7444 MEMBER','1','11105') +('10126','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10126 MEMBER','1','11106') +('10127','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10127 MEMBER','1','11107') +('10127','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10127 MEMBER','1','11108') +('10128','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10128 MEMBER','1','11109') +('4569','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',394.49,'999','0','"4569 MEMBER','1','11110') +('10132','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"10132 MEMBER','1','11111') +('10132','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','0','1','INACT','0','0','0',0.00,'999','1','"10132 MEMBER','1','11112') +('10133','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10133 MEMBER','1','11113') +('10134','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10134 MEMBER','1','11114') +('10167','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10167 MEMBER','1','11115') +('10168','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10168 MEMBER','1','11116') +('10136','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10136 MEMBER','1','11117') +('10137','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10137 MEMBER','1','11118') +('10137','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10137 MEMBER','1','11119') +('10138','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10138 MEMBER','1','11120') +('10138','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10138 MEMBER','1','11121') +('6114','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',532.48,'999','0','"6114 MEMBER','1','11122') +('10139','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10139 MEMBER','1','11123') +('9791','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9791 MEMBER','1','11124') +('10148','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10148 MEMBER','1','11125') +('10144','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10144 MEMBER','1','11126') +('10144','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10144 MEMBER','1','11127') +('10145','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10145 MEMBER','1','11128') +('10145','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10145 MEMBER','1','11129') +('10145','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10145 MEMBER','1','11130') +('10146','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10146 MEMBER','1','11131') +('9815','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9815 MEMBER','1','11132') +('9815','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9815 MEMBER','1','11133') +('9812','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9812 MEMBER','1','11134') +('9812','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9812 MEMBER','1','11135') +('9805','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9805 MEMBER','1','11136') +('9804','2','LASTNAME','FIRSTNAME',999.99,13.31,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9804 MEMBER','1','11137') +('9606','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9606 MEMBER','1','11138') +('10150','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10150 MEMBER','1','11139') +('6810','2','LASTNAME','FIRSTNAME',999.99,NULL,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6810 MEMBER','1','11140') +('10157','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10157 MEMBER','1','11141') +('4985','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4985 MEMBER','1','11142') +('8086','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8086 MEMBER','1','11143') +('9562','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9562 MEMBER','1','11144') +('9562','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9562 MEMBER','1','11145') +('9564','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9564 MEMBER','1','11146') +('9565','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9565 MEMBER','1','11147') +('9565','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9565 MEMBER','1','11148') +('9565','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9565 MEMBER','1','11149') +('9566','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9566 MEMBER','1','11150') +('9567','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9567 MEMBER','1','11151') +('9567','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9567 MEMBER','1','11152') +('9568','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9568 MEMBER','1','11153') +('9568','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9568 MEMBER','1','11154') +('9568','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9568 MEMBER','1','11155') +('9573','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9573 MEMBER','1','11156') +('9574','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9574 MEMBER','1','11157') +('9574','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9574 MEMBER','1','11158') +('9574','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9574 MEMBER','1','11159') +('9575','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9575 MEMBER','1','11160') +('9575','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9575 MEMBER','1','11161') +('9575','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9575 MEMBER','1','11162') +('9576','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9576 MEMBER','1','11163') +('9576','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9576 MEMBER','1','11164') +('9576','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9576 MEMBER','1','11165') +('9579','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9579 MEMBER','1','11166') +('9579','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9579 MEMBER','1','11167') +('9579','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9579 MEMBER','1','11168') +('9607','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9607 MEMBER','1','11172') +('9608','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"9608 MEMBER','1','11173') +('9609','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9609 MEMBER','1','11174') +('9610','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9610 MEMBER','1','11175') +('9611','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9611 MEMBER','1','11176') +('9612','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9612 MEMBER','1','11177') +('9613','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9613 MEMBER','1','11178') +('9614','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9614 MEMBER','1','11179') +('9615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9615 MEMBER','1','11180') +('9616','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9616 MEMBER','1','11181') +('9617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9617 MEMBER','1','11182') +('9618','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9618 MEMBER','1','11183') +('9619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9619 MEMBER','1','11184') +('9620','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9620 MEMBER','1','11185') +('9621','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9621 MEMBER','1','11186') +('9622','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9622 MEMBER','1','11187') +('9623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9623 MEMBER','1','11188') +('9624','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9624 MEMBER','1','11189') +('9625','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9625 MEMBER','1','11190') +('9626','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9626 MEMBER','1','11191') +('9627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9627 MEMBER','1','11192') +('9628','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9628 MEMBER','1','11193') +('9629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9629 MEMBER','1','11194') +('9630','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9630 MEMBER','1','11195') +('9631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9631 MEMBER','1','11196') +('9632','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9632 MEMBER','1','11197') +('9633','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9633 MEMBER','1','11198') +('9634','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9634 MEMBER','1','11199') +('9635','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9635 MEMBER','1','11200') +('9636','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9636 MEMBER','1','11201') +('9637','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9637 MEMBER','1','11202') +('9638','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9638 MEMBER','1','11203') +('9639','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9639 MEMBER','1','11204') +('9640','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9640 MEMBER','1','11205') +('9641','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9641 MEMBER','1','11206') +('9642','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9642 MEMBER','1','11207') +('9643','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9643 MEMBER','1','11208') +('9644','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9644 MEMBER','1','11209') +('9645','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9645 MEMBER','1','11210') +('9646','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9646 MEMBER','1','11211') +('6774','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6774 MEMBER','1','11212') +('8543','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8543 MEMBER','1','11213') +('7904','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7904 MEMBER','1','11214') +('9569','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9569 MEMBER','1','11215') +('9570','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9570 MEMBER','1','11216') +('9571','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9571 MEMBER','1','11217') +('9572','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9572 MEMBER','1','11218') +('9581','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9581 MEMBER','1','11219') +('9582','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9582 MEMBER','1','11220') +('9583','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9583 MEMBER','1','11221') +('9583','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9583 MEMBER','1','11222') +('9584','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9584 MEMBER','1','11223') +('9584','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9584 MEMBER','1','11224') +('9584','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9584 MEMBER','1','11225') +('9585','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9585 MEMBER','1','11226') +('9586','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9586 MEMBER','1','11227') +('9588','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9588 MEMBER','1','11228') +('9589','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9589 MEMBER','1','11229') +('9590','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9590 MEMBER','1','11230') +('9591','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9591 MEMBER','1','11231') +('9591','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9591 MEMBER','1','11232') +('9592','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9592 MEMBER','1','11233') +('9592','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9592 MEMBER','1','11234') +('9592','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9592 MEMBER','1','11235') +('9844','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9844 MEMBER','1','11236') +('9845','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9845 MEMBER','1','11237') +('9864','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9864 MEMBER','1','11238') +('9992','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9992 MEMBER','1','11239') +('9587','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9587 MEMBER','1','11241') +('9587','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9587 MEMBER','1','11242') +('9595','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9595 MEMBER','1','11243') +('9597','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9597 MEMBER','1','11244') +('325','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1298.09,'999','0','"325 MEMBER','1','11245') +('327','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"327 MEMBER','1','11246') +('10281','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10281 MEMBER','1','11247') +('9598','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9598 MEMBER','1','11248') +('5319','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5319 MEMBER','1','11249') +('10154','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10154 MEMBER','1','11250') +('4220','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4220 MEMBER','1','11251') +('9599','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9599 MEMBER','1','11252') +('9601','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9601 MEMBER','1','11253') +('9604','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9604 MEMBER','1','11254') +('9604','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9604 MEMBER','1','11255') +('9604','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9604 MEMBER','1','11256') +('9605','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9605 MEMBER','1','11257') +('9605','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9605 MEMBER','1','11258') +('10190','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10190 MEMBER','1','11259') +('9795','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9795 MEMBER','1','11260') +('9609','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9609 MEMBER','1','11261') +('9610','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9610 MEMBER','1','11262') +('9611','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9611 MEMBER','1','11263') +('9611','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9611 MEMBER','1','11264') +('9611','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9611 MEMBER','1','11265') +('9613','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9613 MEMBER','1','11266') +('7665','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7665 MEMBER','1','11267') +('9614','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9614 MEMBER','1','11268') +('9615','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9615 MEMBER','1','11269') +('9616','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9616 MEMBER','1','11270') +('9617','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9617 MEMBER','1','11271') +('9618','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9618 MEMBER','1','11272') +('9618','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9618 MEMBER','1','11273') +('9619','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9619 MEMBER','1','11274') +('6084','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',300.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,NULL,'"6084 MEMBER','1','11275') +('9571','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9571 MEMBER','1','11276') +('3380','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"3380 MEMBER','1','11277') +('6084','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',300.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,NULL,'"6084 MEMBER','1','11278') +('9647','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9647 MEMBER','1','11279') +('9649','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9649 MEMBER','1','11280') +('9650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9650 MEMBER','1','11281') +('9653','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9653 MEMBER','1','11282') +('9654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9654 MEMBER','1','11283') +('9655','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9655 MEMBER','1','11284') +('9656','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9656 MEMBER','1','11285') +('9657','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9657 MEMBER','1','11286') +('9658','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9658 MEMBER','1','11287') +('9659','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9659 MEMBER','1','11288') +('9660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9660 MEMBER','1','11289') +('9661','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9661 MEMBER','1','11290') +('9662','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9662 MEMBER','1','11291') +('9663','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9663 MEMBER','1','11292') +('9664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9664 MEMBER','1','11293') +('9665','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9665 MEMBER','1','11294') +('9666','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9666 MEMBER','1','11295') +('9667','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9667 MEMBER','1','11296') +('9668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9668 MEMBER','1','11297') +('9669','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9669 MEMBER','1','11298') +('9670','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9670 MEMBER','1','11299') +('9671','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9671 MEMBER','1','11300') +('9672','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9672 MEMBER','1','11301') +('9673','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9673 MEMBER','1','11302') +('9674','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9674 MEMBER','1','11303') +('9675','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9675 MEMBER','1','11304') +('9676','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9676 MEMBER','1','11305') +('9677','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9677 MEMBER','1','11306') +('9678','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9678 MEMBER','1','11307') +('9679','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9679 MEMBER','1','11308') +('9680','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9680 MEMBER','1','11309') +('9681','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9681 MEMBER','1','11310') +('9682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9682 MEMBER','1','11311') +('9683','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9683 MEMBER','1','11312') +('9684','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9684 MEMBER','1','11313') +('9685','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9685 MEMBER','1','11314') +('9686','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9686 MEMBER','1','11315') +('10053','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10053 MEMBER','1','11316') +('6318','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6318 MEMBER','1','11317') +('9620','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9620 MEMBER','1','11318') +('9622','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9622 MEMBER','1','11319') +('9622','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9622 MEMBER','1','11320') +('9626','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9626 MEMBER','1','11321') +('9627','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9627 MEMBER','1','11322') +('9629','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9629 MEMBER','1','11323') +('9632','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9632 MEMBER','1','11324') +('9632','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9632 MEMBER','1','11325') +('9633','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9633 MEMBER','1','11326') +('9634','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9634 MEMBER','1','11327') +('10403','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10403 MEMBER','1','11328') +('9636','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9636 MEMBER','1','11329') +('9638','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9638 MEMBER','1','11330') +('9639','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9639 MEMBER','1','11331') +('9639','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9639 MEMBER','1','11332') +('9639','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9639 MEMBER','1','11333') +('5037','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',100.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5037 MEMBER','1','11334') +('9624','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9624 MEMBER','1','11335') +('9624','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9624 MEMBER','1','11336') +('9624','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9624 MEMBER','1','11337') +('9640','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9640 MEMBER','1','11338') +('9641','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9641 MEMBER','1','11339') +('9645','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9645 MEMBER','1','11340') +('9646','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9646 MEMBER','1','11341') +('9647','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9647 MEMBER','1','11342') +('9647','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9647 MEMBER','1','11343') +('9648','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9648 MEMBER','1','11344') +('9649','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9649 MEMBER','1','11345') +('9650','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9650 MEMBER','1','11346') +('9651','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9651 MEMBER','1','11347') +('9652','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9652 MEMBER','1','11348') +('9652','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9652 MEMBER','1','11349') +('6944','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6944 MEMBER','1','11350') +('9672','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9672 MEMBER','1','11351') +('3056','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"3056 MEMBER','1','11352') +('9643','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9643 MEMBER','1','11353') +('9653','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9653 MEMBER','1','11354') +('9654','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9654 MEMBER','1','11355') +('9655','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9655 MEMBER','1','11356') +('9656','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9656 MEMBER','1','11357') +('9695','1','LASTNAME','FIRSTNAME',999.99,7.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9695 MEMBER','1','11358') +('9703','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9703 MEMBER','1','11359') +('9704','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9704 MEMBER','1','11360') +('9705','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9705 MEMBER','1','11361') +('9706','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9706 MEMBER','1','11362') +('9707','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9707 MEMBER','1','11363') +('9708','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9708 MEMBER','1','11364') +('9709','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9709 MEMBER','1','11365') +('9710','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9710 MEMBER','1','11366') +('9711','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9711 MEMBER','1','11367') +('9712','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9712 MEMBER','1','11368') +('9713','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9713 MEMBER','1','11369') +('9714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9714 MEMBER','1','11370') +('9715','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9715 MEMBER','1','11371') +('9717','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9717 MEMBER','1','11372') +('9718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9718 MEMBER','1','11373') +('9719','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9719 MEMBER','1','11374') +('9720','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9720 MEMBER','1','11375') +('9721','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9721 MEMBER','1','11376') +('9722','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9722 MEMBER','1','11377') +('9723','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9723 MEMBER','1','11378') +('9724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9724 MEMBER','1','11379') +('9725','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9725 MEMBER','1','11380') +('9726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9726 MEMBER','1','11381') +('13','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"13 MEMBER','1','11382') +('13','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"13 MEMBER','1','11383') +('511','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"511 MEMBER','1','11384') +('511','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"511 MEMBER','1','11385') +('7245','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7245 MEMBER','1','11386') +('3363','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"3363 MEMBER','1','11387') +('3363','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"3363 MEMBER','1','11388') +('3363','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"3363 MEMBER','1','11389') +('9657','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9657 MEMBER','1','11390') +('9657','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9657 MEMBER','1','11391') +('9657','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9657 MEMBER','1','11392') +('9658','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9658 MEMBER','1','11393') +('9660','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9660 MEMBER','1','11394') +('9661','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9661 MEMBER','1','11395') +('9661','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9661 MEMBER','1','11396') +('9662','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9662 MEMBER','1','11397') +('9662','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9662 MEMBER','1','11398') +('9662','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9662 MEMBER','1','11399') +('9957','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9957 MEMBER','1','11400') +('9957','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9957 MEMBER','1','11401') +('9664','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9664 MEMBER','1','11402') +('9664','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9664 MEMBER','1','11403') +('9665','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9665 MEMBER','1','11404') +('9665','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9665 MEMBER','1','11405') +('9665','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9665 MEMBER','1','11406') +('9666','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9666 MEMBER','1','11407') +('9667','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9667 MEMBER','1','11408') +('9667','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9667 MEMBER','1','11409') +('9668','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9668 MEMBER','1','11410') +('9669','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9669 MEMBER','1','11411') +('9670','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9670 MEMBER','1','11412') +('9670','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9670 MEMBER','1','11413') +('9670','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9670 MEMBER','1','11414') +('9672','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9672 MEMBER','1','11415') +('9680','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9680 MEMBER','1','11416') +('8158','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8158 MEMBER','1','11417') +('9249','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9249 MEMBER','1','11418') +('9676','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9676 MEMBER','1','11419') +('9676','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9676 MEMBER','1','11420') +('9681','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9681 MEMBER','1','11421') +('9681','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9681 MEMBER','1','11422') +('9686','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9686 MEMBER','1','11423') +('9689','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9689 MEMBER','1','11424') +('9689','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9689 MEMBER','1','11425') +('9689','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9689 MEMBER','1','11426') +('9691','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9691 MEMBER','1','11427') +('9692','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9692 MEMBER','1','11428') +('9693','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9693 MEMBER','1','11429') +('10341','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10341 MEMBER','1','11430') +('10342','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10342 MEMBER','1','11431') +('9694','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9694 MEMBER','1','11432') +('9694','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9694 MEMBER','1','11433') +('9694','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9694 MEMBER','1','11434') +('10377','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10377 MEMBER','1','11435') +('9696','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9696 MEMBER','1','11436') +('8409','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8409 MEMBER','1','11437') +('5372','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','1','0',NULL,NULL,'0','"5372 MEMBER','1','11438') +('5372','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','1','0',NULL,NULL,'0','"5372 MEMBER','1','11439') +('9727','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9727 MEMBER','1','11440') +('9728','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9728 MEMBER','1','11441') +('9729','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9729 MEMBER','1','11442') +('9730','1','LASTNAME','FIRSTNAME',999.99,11.73,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','1','"9730 MEMBER','1','11443') +('9731','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9731 MEMBER','1','11444') +('9732','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9732 MEMBER','1','11445') +('9733','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9733 MEMBER','1','11446') +('9734','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9734 MEMBER','1','11447') +('9735','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9735 MEMBER','1','11448') +('9736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9736 MEMBER','1','11449') +('9737','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9737 MEMBER','1','11450') +('9738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9738 MEMBER','1','11451') +('9739','1','LASTNAME','FIRSTNAME',999.99,2.10,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9739 MEMBER','1','11452') +('9740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9740 MEMBER','1','11453') +('9741','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9741 MEMBER','1','11454') +('9742','1','LASTNAME','FIRSTNAME',999.99,10.78,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9742 MEMBER','1','11455') +('9743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9743 MEMBER','1','11456') +('9744','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9744 MEMBER','1','11457') +('9745','1','LASTNAME','FIRSTNAME',999.99,15.74,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9745 MEMBER','1','11458') +('9746','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9746 MEMBER','1','11459') +('9747','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9747 MEMBER','1','11460') +('9748','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9748 MEMBER','1','11461') +('9749','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9749 MEMBER','1','11462') +('9750','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9750 MEMBER','1','11463') +('9751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9751 MEMBER','1','11464') +('9752','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9752 MEMBER','1','11465') +('9753','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9753 MEMBER','1','11466') +('9754','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9754 MEMBER','1','11467') +('9755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9755 MEMBER','1','11468') +('9756','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9756 MEMBER','1','11469') +('9757','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9757 MEMBER','1','11470') +('9758','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9758 MEMBER','1','11471') +('9759','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9759 MEMBER','1','11472') +('9760','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9760 MEMBER','1','11473') +('9761','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9761 MEMBER','1','11474') +('9762','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9762 MEMBER','1','11475') +('9763','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9763 MEMBER','1','11476') +('9764','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9764 MEMBER','1','11477') +('9765','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9765 MEMBER','1','11478') +('9766','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9766 MEMBER','1','11479') +('9698','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9698 MEMBER','1','11480') +('9699','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9699 MEMBER','1','11481') +('9702','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9702 MEMBER','1','11482') +('9703','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9703 MEMBER','1','11483') +('9703','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9703 MEMBER','1','11484') +('9703','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9703 MEMBER','1','11485') +('9704','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9704 MEMBER','1','11486') +('9705','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9705 MEMBER','1','11487') +('9706','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9706 MEMBER','1','11488') +('9707','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9707 MEMBER','1','11489') +('9708','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9708 MEMBER','1','11490') +('9709','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9709 MEMBER','1','11491') +('9713','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9713 MEMBER','1','11492') +('9714','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9714 MEMBER','1','11493') +('9715','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9715 MEMBER','1','11494') +('9716','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9716 MEMBER','1','11495') +('9717','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9717 MEMBER','1','11496') +('9717','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9717 MEMBER','1','11497') +('4810','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4810 MEMBER','1','11498') +('9379','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9379 MEMBER','1','11499') +('9253','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9253 MEMBER','1','11500') +('9720','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9720 MEMBER','1','11501') +('9721','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9721 MEMBER','1','11502') +('9721','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9721 MEMBER','1','11503') +('9722','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9722 MEMBER','1','11504') +('9722','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9722 MEMBER','1','11505') +('9724','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9724 MEMBER','1','11506') +('9725','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9725 MEMBER','1','11507') +('9725','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9725 MEMBER','1','11508') +('9725','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9725 MEMBER','1','11509') +('9726','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9726 MEMBER','1','11510') +('9728','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9728 MEMBER','1','11511') +('9730','2','LASTNAME','FIRSTNAME',NULL,11.73,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"9730 MEMBER','1','11512') +('9730','3','LASTNAME','FIRSTNAME',NULL,11.73,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"9730 MEMBER','1','11513') +('9731','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9731 MEMBER','1','11514') +('5374','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5374 MEMBER','1','11515') +('5375','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5375 MEMBER','1','11516') +('5375','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5375 MEMBER','1','11517') +('5379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5379 MEMBER','1','11518') +('5380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5380 MEMBER','1','11519') +('5381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5381 MEMBER','1','11520') +('5382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5382 MEMBER','1','11521') +('5383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"5383 MEMBER','1','11522') +('5384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5384 MEMBER','1','11523') +('5385','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5385 MEMBER','1','11524') +('5386','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5386 MEMBER','1','11525') +('5387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5387 MEMBER','1','11526') +('5388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5388 MEMBER','1','11527') +('5389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5389 MEMBER','1','11528') +('5390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5390 MEMBER','1','11529') +('5391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5391 MEMBER','1','11530') +('5392','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5392 MEMBER','1','11531') +('5393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5393 MEMBER','1','11532') +('5394','1','LASTNAME','FIRSTNAME',999.99,8.02,'10',40.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5394 MEMBER','1','11533') +('5395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5395 MEMBER','1','11534') +('5396','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5396 MEMBER','1','11535') +('5397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5397 MEMBER','1','11536') +('5398','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5398 MEMBER','1','11537') +('9734','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9734 MEMBER','1','11538') +('9735','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9735 MEMBER','1','11539') +('9735','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9735 MEMBER','1','11540') +('9736','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9736 MEMBER','1','11541') +('9736','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9736 MEMBER','1','11542') +('9736','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9736 MEMBER','1','11543') +('9737','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9737 MEMBER','1','11544') +('9738','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9738 MEMBER','1','11545') +('9738','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9738 MEMBER','1','11546') +('9739','2','LASTNAME','FIRSTNAME',NULL,2.10,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9739 MEMBER','1','11547') +('9740','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9740 MEMBER','1','11548') +('9741','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9741 MEMBER','1','11549') +('9743','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9743 MEMBER','1','11550') +('9743','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9743 MEMBER','1','11551') +('4575','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4575 MEMBER','1','11552') +('4575','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4575 MEMBER','1','11553') +('9122','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9122 MEMBER','1','11554') +('7824','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7824 MEMBER','1','11555') +('6618','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6618 MEMBER','1','11556') +('9446','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9446 MEMBER','1','11557') +('9767','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9767 MEMBER','1','11558') +('9768','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9768 MEMBER','1','11559') +('9769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9769 MEMBER','1','11560') +('9770','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9770 MEMBER','1','11561') +('9771','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9771 MEMBER','1','11562') +('9772','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9772 MEMBER','1','11563') +('9773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9773 MEMBER','1','11564') +('9774','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9774 MEMBER','1','11565') +('9775','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9775 MEMBER','1','11566') +('9776','1','LASTNAME','FIRSTNAME',999.99,4.74,'10',75.00,'1','1','1','PC','3','1','0',0.00,'999','1','"9776 MEMBER','1','11567') +('9777','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9777 MEMBER','1','11568') +('9778','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9778 MEMBER','1','11569') +('9779','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9779 MEMBER','1','11570') +('9780','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9780 MEMBER','1','11571') +('9781','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9781 MEMBER','1','11572') +('9782','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9782 MEMBER','1','11573') +('9783','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9783 MEMBER','1','11574') +('9784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9784 MEMBER','1','11575') +('9785','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9785 MEMBER','1','11576') +('9786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9786 MEMBER','1','11577') +('9787','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9787 MEMBER','1','11578') +('9788','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9788 MEMBER','1','11579') +('9789','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9789 MEMBER','1','11580') +('9790','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9790 MEMBER','1','11581') +('9791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9791 MEMBER','1','11582') +('9792','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9792 MEMBER','1','11583') +('9793','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9793 MEMBER','1','11584') +('9794','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9794 MEMBER','1','11585') +('9795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9795 MEMBER','1','11586') +('9796','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9796 MEMBER','1','11587') +('9797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9797 MEMBER','1','11588') +('9798','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9798 MEMBER','1','11589') +('9799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9799 MEMBER','1','11590') +('9800','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9800 MEMBER','1','11591') +('9801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9801 MEMBER','1','11592') +('9802','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9802 MEMBER','1','11593') +('9803','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9803 MEMBER','1','11594') +('9804','1','LASTNAME','FIRSTNAME',999.99,13.31,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9804 MEMBER','1','11595') +('9805','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9805 MEMBER','1','11596') +('9806','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9806 MEMBER','1','11597') +('10421','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10421 MEMBER','1','11600') +('2333','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2333 MEMBER','1','11601') +('2333','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2333 MEMBER','1','11602') +('9539','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9539 MEMBER','1','11603') +('1789','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',54.78,'999','0','"1789 MEMBER','1','11604') +('9746','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9746 MEMBER','1','11605') +('9747','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9747 MEMBER','1','11606') +('9747','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9747 MEMBER','1','11607') +('9748','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9748 MEMBER','1','11608') +('9748','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9748 MEMBER','1','11609') +('9749','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9749 MEMBER','1','11610') +('9749','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9749 MEMBER','1','11611') +('9750','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9750 MEMBER','1','11612') +('9751','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9751 MEMBER','1','11613') +('9751','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9751 MEMBER','1','11614') +('8485','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8485 MEMBER','1','11615') +('9752','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9752 MEMBER','1','11616') +('9753','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9753 MEMBER','1','11617') +('9756','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"9756 MEMBER','1','11618') +('9758','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9758 MEMBER','1','11619') +('9758','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9758 MEMBER','1','11620') +('9758','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9758 MEMBER','1','11621') +('9759','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9759 MEMBER','1','11622') +('9708','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9708 MEMBER','1','11623') +('9708','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9708 MEMBER','1','11624') +('418','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"418 MEMBER','1','11625') +('8411','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8411 MEMBER','1','11626') +('7509','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7509 MEMBER','1','11627') +('9760','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9760 MEMBER','1','11628') +('9761','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9761 MEMBER','1','11629') +('9761','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9761 MEMBER','1','11630') +('9761','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9761 MEMBER','1','11631') +('9762','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9762 MEMBER','1','11632') +('9763','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9763 MEMBER','1','11633') +('9763','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9763 MEMBER','1','11634') +('9764','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9764 MEMBER','1','11635') +('9764','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9764 MEMBER','1','11636') +('9765','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9765 MEMBER','1','11637') +('9767','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9767 MEMBER','1','11638') +('10086','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10086 MEMBER','1','11639') +('9766','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9766 MEMBER','1','11640') +('9768','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9768 MEMBER','1','11641') +('9768','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9768 MEMBER','1','11642') +('9768','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9768 MEMBER','1','11643') +('9769','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9769 MEMBER','1','11644') +('9769','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9769 MEMBER','1','11645') +('7115','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7115 MEMBER','1','11646') +('9771','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9771 MEMBER','1','11647') +('9772','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9772 MEMBER','1','11648') +('9773','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9773 MEMBER','1','11649') +('9775','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9775 MEMBER','1','11650') +('9775','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9775 MEMBER','1','11651') +('9775','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9775 MEMBER','1','11652') +('9776','2','LASTNAME','FIRSTNAME',NULL,4.74,'10',75.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"9776 MEMBER','1','11653') +('9777','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9777 MEMBER','1','11654') +('9778','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9778 MEMBER','1','11655') +('9780','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9780 MEMBER','1','11656') +('9780','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9780 MEMBER','1','11657') +('9781','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9781 MEMBER','1','11658') +('6560','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6560 MEMBER','1','11659') +('6560','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6560 MEMBER','1','11660') +('6226','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6226 MEMBER','1','11661') +('9808','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9808 MEMBER','1','11662') +('9810','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9810 MEMBER','1','11663') +('9811','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9811 MEMBER','1','11664') +('9812','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9812 MEMBER','1','11665') +('9813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9813 MEMBER','1','11666') +('9814','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9814 MEMBER','1','11667') +('9815','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9815 MEMBER','1','11668') +('9816','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9816 MEMBER','1','11669') +('9817','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9817 MEMBER','1','11670') +('9818','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9818 MEMBER','1','11671') +('9819','1','LASTNAME','FIRSTNAME',999.99,1.83,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9819 MEMBER','1','11672') +('9820','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9820 MEMBER','1','11673') +('9821','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9821 MEMBER','1','11674') +('9822','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9822 MEMBER','1','11675') +('9823','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9823 MEMBER','1','11676') +('9824','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9824 MEMBER','1','11677') +('9825','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9825 MEMBER','1','11678') +('9826','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9826 MEMBER','1','11679') +('9827','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9827 MEMBER','1','11680') +('9828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9828 MEMBER','1','11681') +('9829','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9829 MEMBER','1','11682') +('9830','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9830 MEMBER','1','11683') +('9831','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9831 MEMBER','1','11684') +('9832','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9832 MEMBER','1','11685') +('9833','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9833 MEMBER','1','11686') +('9834','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9834 MEMBER','1','11687') +('9835','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9835 MEMBER','1','11688') +('9836','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9836 MEMBER','1','11689') +('9837','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9837 MEMBER','1','11690') +('9838','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9838 MEMBER','1','11691') +('9839','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9839 MEMBER','1','11692') +('9840','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9840 MEMBER','1','11693') +('9841','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9841 MEMBER','1','11694') +('9842','1','LASTNAME','FIRSTNAME',999.99,13.89,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9842 MEMBER','1','11695') +('9843','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9843 MEMBER','1','11696') +('9844','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9844 MEMBER','1','11697') +('9845','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9845 MEMBER','1','11698') +('9846','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9846 MEMBER','1','11699') +('9784','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9784 MEMBER','1','11700') +('9784','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9784 MEMBER','1','11701') +('9784','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9784 MEMBER','1','11702') +('7053','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"7053 MEMBER','1','11703') +('8398','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8398 MEMBER','1','11704') +('7880','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7880 MEMBER','1','11705') +('8704','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8704 MEMBER','1','11706') +('7914','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7914 MEMBER','1','11707') +('7916','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7916 MEMBER','1','11708') +('7921','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7921 MEMBER','1','11709') +('7923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7923 MEMBER','1','11710') +('7930','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7930 MEMBER','1','11711') +('7937','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7937 MEMBER','1','11712') +('7950','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7950 MEMBER','1','11713') +('7952','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7952 MEMBER','1','11714') +('7847','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7847 MEMBER','1','11715') +('7847','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7847 MEMBER','1','11716') +('7777','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7777 MEMBER','1','11717') +('7777','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7777 MEMBER','1','11718') +('7777','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7777 MEMBER','1','11719') +('7848','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7848 MEMBER','1','11720') +('7858','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7858 MEMBER','1','11721') +('7858','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7858 MEMBER','1','11722') +('7858','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7858 MEMBER','1','11723') +('7824','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7824 MEMBER','1','11724') +('7859','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7859 MEMBER','1','11725') +('7860','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7860 MEMBER','1','11726') +('7860','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7860 MEMBER','1','11727') +('7860','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7860 MEMBER','1','11728') +('7861','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7861 MEMBER','1','11729') +('7861','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7861 MEMBER','1','11730') +('7862','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7862 MEMBER','1','11731') +('7863','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7863 MEMBER','1','11732') +('7865','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7865 MEMBER','1','11733') +('7865','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7865 MEMBER','1','11734') +('7866','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7866 MEMBER','1','11735') +('7875','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7875 MEMBER','1','11736') +('7868','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7868 MEMBER','1','11737') +('7869','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7869 MEMBER','1','11738') +('7869','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7869 MEMBER','1','11739') +('7870','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7870 MEMBER','1','11740') +('7870','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7870 MEMBER','1','11741') +('7867','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7867 MEMBER','1','11742') +('7876','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7876 MEMBER','1','11743') +('7876','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7876 MEMBER','1','11744') +('7877','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7877 MEMBER','1','11745') +('7878','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7878 MEMBER','1','11746') +('7878','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7878 MEMBER','1','11747') +('7248','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7248 MEMBER','1','11748') +('8807','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8807 MEMBER','1','11749') +('7881','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7881 MEMBER','1','11750') +('7881','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7881 MEMBER','1','11751') +('7883','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7883 MEMBER','1','11752') +('7884','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7884 MEMBER','1','11753') +('7884','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7884 MEMBER','1','11754') +('7885','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7885 MEMBER','1','11755') +('7885','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7885 MEMBER','1','11756') +('7886','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7886 MEMBER','1','11757') +('7886','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7886 MEMBER','1','11758') +('7887','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7887 MEMBER','1','11759') +('7887','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7887 MEMBER','1','11760') +('7887','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7887 MEMBER','1','11761') +('7889','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7889 MEMBER','1','11762') +('7891','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7891 MEMBER','1','11763') +('7892','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7892 MEMBER','1','11764') +('7892','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7892 MEMBER','1','11765') +('7893','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7893 MEMBER','1','11766') +('7893','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7893 MEMBER','1','11767') +('7894','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7894 MEMBER','1','11768') +('7894','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7894 MEMBER','1','11769') +('7894','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7894 MEMBER','1','11770') +('7895','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7895 MEMBER','1','11771') +('7896','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7896 MEMBER','1','11772') +('7902','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7902 MEMBER','1','11773') +('7902','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7902 MEMBER','1','11774') +('7903','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7903 MEMBER','1','11775') +('4764','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3533.55,'999','0','"4764 MEMBER','1','11776') +('6010','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6010 MEMBER','1','11777') +('7907','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7907 MEMBER','1','11778') +('7910','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7910 MEMBER','1','11779') +('7912','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7912 MEMBER','1','11780') +('7912','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7912 MEMBER','1','11781') +('7913','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7913 MEMBER','1','11782') +('7915','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7915 MEMBER','1','11783') +('7916','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7916 MEMBER','1','11784') +('7916','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7916 MEMBER','1','11785') +('125','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"125 MEMBER','1','11786') +('7828','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7828 MEMBER','1','11787') +('7828','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7828 MEMBER','1','11788') +('6209','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6209 MEMBER','1','11789') +('6461','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6461 MEMBER','1','11790') +('7746','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7746 MEMBER','1','11791') +('7746','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7746 MEMBER','1','11792') +('7746','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7746 MEMBER','1','11793') +('7920','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7920 MEMBER','1','11794') +('7920','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7920 MEMBER','1','11795') +('7920','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7920 MEMBER','1','11796') +('7923','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7923 MEMBER','1','11797') +('7953','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7953 MEMBER','1','11798') +('7955','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"7955 MEMBER','1','11799') +('7957','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7957 MEMBER','1','11800') +('7961','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7961 MEMBER','1','11801') +('7962','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7962 MEMBER','1','11802') +('7963','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7963 MEMBER','1','11803') +('7964','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7964 MEMBER','1','11804') +('7965','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7965 MEMBER','1','11805') +('7966','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7966 MEMBER','1','11806') +('7968','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7968 MEMBER','1','11807') +('7969','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7969 MEMBER','1','11808') +('7970','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7970 MEMBER','1','11809') +('7971','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7971 MEMBER','1','11810') +('7972','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7972 MEMBER','1','11811') +('7973','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7973 MEMBER','1','11812') +('7974','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7974 MEMBER','1','11813') +('7975','1','LASTNAME','FIRSTNAME',999.99,16.66,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7975 MEMBER','1','11814') +('7976','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7976 MEMBER','1','11815') +('7977','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7977 MEMBER','1','11816') +('7978','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7978 MEMBER','1','11817') +('7979','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7979 MEMBER','1','11818') +('7980','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7980 MEMBER','1','11819') +('7981','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7981 MEMBER','1','11820') +('7982','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7982 MEMBER','1','11821') +('7983','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7983 MEMBER','1','11822') +('7984','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7984 MEMBER','1','11823') +('7985','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7985 MEMBER','1','11824') +('7986','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7986 MEMBER','1','11825') +('7987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7987 MEMBER','1','11826') +('7988','1','LASTNAME','FIRSTNAME',999.99,18.96,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7988 MEMBER','1','11827') +('7989','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7989 MEMBER','1','11828') +('7990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7990 MEMBER','1','11829') +('7991','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7991 MEMBER','1','11830') +('7992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7992 MEMBER','1','11831') +('4110','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4110 MEMBER','1','11832') +('7740','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7740 MEMBER','1','11833') +('10373','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10373 MEMBER','1','11834') +('10374','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10374 MEMBER','1','11835') +('7926','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7926 MEMBER','1','11836') +('7926','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7926 MEMBER','1','11837') +('7926','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7926 MEMBER','1','11838') +('7927','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7927 MEMBER','1','11839') +('7927','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7927 MEMBER','1','11840') +('7928','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7928 MEMBER','1','11841') +('7929','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7929 MEMBER','1','11842') +('8161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8161 MEMBER','1','11843') +('5280','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5280 MEMBER','1','11844') +('5283','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5283 MEMBER','1','11845') +('5284','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5284 MEMBER','1','11846') +('5285','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5285 MEMBER','1','11847') +('5286','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5286 MEMBER','1','11848') +('5287','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5287 MEMBER','1','11849') +('5288','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"5288 MEMBER','1','11850') +('5289','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5289 MEMBER','1','11851') +('5290','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5290 MEMBER','1','11852') +('5291','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5291 MEMBER','1','11853') +('5292','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5292 MEMBER','1','11854') +('5293','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5293 MEMBER','1','11855') +('5294','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"5294 MEMBER','1','11856') +('5295','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5295 MEMBER','1','11857') +('5296','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5296 MEMBER','1','11858') +('5297','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5297 MEMBER','1','11859') +('5298','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5298 MEMBER','1','11860') +('7931','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7931 MEMBER','1','11861') +('7931','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7931 MEMBER','1','11862') +('7932','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7932 MEMBER','1','11863') +('7933','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7933 MEMBER','1','11864') +('7933','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7933 MEMBER','1','11865') +('7934','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7934 MEMBER','1','11866') +('7935','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7935 MEMBER','1','11867') +('2307','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2307 MEMBER','1','11868') +('7769','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7769 MEMBER','1','11869') +('7793','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7793 MEMBER','1','11870') +('7936','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7936 MEMBER','1','11871') +('7937','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7937 MEMBER','1','11872') +('7938','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7938 MEMBER','1','11873') +('7940','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7940 MEMBER','1','11874') +('7941','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7941 MEMBER','1','11875') +('7942','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7942 MEMBER','1','11876') +('7941','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7941 MEMBER','1','11877') +('7943','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7943 MEMBER','1','11878') +('7944','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7944 MEMBER','1','11879') +('7944','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7944 MEMBER','1','11880') +('7945','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7945 MEMBER','1','11881') +('7946','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7946 MEMBER','1','11882') +('7946','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7946 MEMBER','1','11883') +('7947','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7947 MEMBER','1','11884') +('7947','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7947 MEMBER','1','11885') +('7947','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7947 MEMBER','1','11886') +('7993','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"7993 MEMBER','1','11887') +('8036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8036 MEMBER','1','11888') +('8042','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8042 MEMBER','1','11889') +('7994','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7994 MEMBER','1','11890') +('8048','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8048 MEMBER','1','11891') +('8053','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8053 MEMBER','1','11892') +('8067','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8067 MEMBER','1','11893') +('7995','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7995 MEMBER','1','11894') +('7996','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7996 MEMBER','1','11895') +('7997','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7997 MEMBER','1','11896') +('7998','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7998 MEMBER','1','11897') +('8071','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8071 MEMBER','1','11898') +('7999','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7999 MEMBER','1','11899') +('7989','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7989 MEMBER','1','11900') +('8143','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8143 MEMBER','1','11901') +('8000','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8000 MEMBER','1','11902') +('8001','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8001 MEMBER','1','11903') +('8002','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8002 MEMBER','1','11904') +('8003','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8003 MEMBER','1','11905') +('8004','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8004 MEMBER','1','11906') +('8005','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8005 MEMBER','1','11907') +('8006','1','LASTNAME','FIRSTNAME',999.99,20.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8006 MEMBER','1','11908') +('8007','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8007 MEMBER','1','11909') +('8008','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8008 MEMBER','1','11910') +('8009','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8009 MEMBER','1','11911') +('8010','1','LASTNAME','FIRSTNAME',999.99,12.24,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8010 MEMBER','1','11912') +('8011','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8011 MEMBER','1','11913') +('8012','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8012 MEMBER','1','11914') +('8013','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8013 MEMBER','1','11915') +('8014','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8014 MEMBER','1','11916') +('8015','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8015 MEMBER','1','11917') +('8016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8016 MEMBER','1','11918') +('8017','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8017 MEMBER','1','11919') +('8018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8018 MEMBER','1','11920') +('8019','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8019 MEMBER','1','11921') +('8020','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8020 MEMBER','1','11922') +('8021','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8021 MEMBER','1','11923') +('8022','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8022 MEMBER','1','11924') +('8023','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8023 MEMBER','1','11925') +('8024','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8024 MEMBER','1','11926') +('8025','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8025 MEMBER','1','11927') +('8026','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8026 MEMBER','1','11928') +('8027','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8027 MEMBER','1','11929') +('8028','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8028 MEMBER','1','11930') +('8029','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8029 MEMBER','1','11931') +('8030','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8030 MEMBER','1','11932') +('8031','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8031 MEMBER','1','11933') +('8032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8032 MEMBER','1','11934') +('8033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8033 MEMBER','1','11935') +('6020','2','LASTNAME','FIRSTNAME',NULL,21.71,'0',200.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'0','"6020 MEMBER','1','11936') +('9864','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9864 MEMBER','1','11937') +('8022','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8022 MEMBER','1','11938') +('7966','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7966 MEMBER','1','11939') +('7969','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7969 MEMBER','1','11940') +('7045','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7045 MEMBER','1','11941') +('8828','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8828 MEMBER','1','11942') +('6033','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',546.51,'999','0','"6033 MEMBER','1','11943') +('5337','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5337 MEMBER','1','11944') +('5337','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5337 MEMBER','1','11945') +('8828','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8828 MEMBER','1','11946') +('8830','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8830 MEMBER','1','11947') +('8831','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8831 MEMBER','1','11948') +('9208','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9208 MEMBER','1','11949') +('7994','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7994 MEMBER','1','11950') +('7996','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7996 MEMBER','1','11951') +('7996','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7996 MEMBER','1','11952') +('7997','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7997 MEMBER','1','11953') +('7998','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7998 MEMBER','1','11954') +('7998','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7998 MEMBER','1','11955') +('7998','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7998 MEMBER','1','11956') +('7999','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7999 MEMBER','1','11957') +('8001','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8001 MEMBER','1','11958') +('8002','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8002 MEMBER','1','11959') +('8003','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8003 MEMBER','1','11960') +('8006','2','LASTNAME','FIRSTNAME',NULL,20.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8006 MEMBER','1','11961') +('9694','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9694 MEMBER','1','11962') +('8010','3','LASTNAME','FIRSTNAME',NULL,12.24,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8010 MEMBER','1','11963') +('5280','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5280 MEMBER','1','11964') +('8013','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8013 MEMBER','1','11965') +('8013','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8013 MEMBER','1','11966') +('8015','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8015 MEMBER','1','11967') +('8015','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8015 MEMBER','1','11968') +('8016','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8016 MEMBER','1','11969') +('8018','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8018 MEMBER','1','11970') +('8018','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8018 MEMBER','1','11971') +('8018','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8018 MEMBER','1','11972') +('8019','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8019 MEMBER','1','11973') +('8019','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8019 MEMBER','1','11974') +('5136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',1432.94,'999','0','"5136 MEMBER','1','11975') +('6017','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6017 MEMBER','1','11976') +('535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"535 MEMBER','1','11977') +('205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"205 MEMBER','1','11978') +('4559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',2151.61,'999','0','"4559 MEMBER','1','11979') +('5115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5115 MEMBER','1','11980') +('5125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',3038.67,'999','0','"5125 MEMBER','1','11981') +('8025','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8025 MEMBER','1','11982') +('5130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5130 MEMBER','1','11983') +('5140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',220.66,'999','0','"5140 MEMBER','1','11984') +('5170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"5170 MEMBER','1','11985') +('6018','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6018 MEMBER','1','11986') +('8065','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8065 MEMBER','1','11987') +('6021','1','LASTNAME','FIRSTNAME',999.99,NULL,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6021 MEMBER','1','11988') +('7953','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7953 MEMBER','1','11989') +('6016','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',NULL,'999','0','"6016 MEMBER','1','11990') +('7978','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7978 MEMBER','1','11991') +('7981','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7981 MEMBER','1','11992') +('6836','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',NULL,'999','0','"6836 MEMBER','1','11993') +('7875','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7875 MEMBER','1','11994') +('8302','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8302 MEMBER','1','11995') +('2268','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2268 MEMBER','1','11996') +('8021','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8021 MEMBER','1','11997') +('8021','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8021 MEMBER','1','11998') +('6600','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6600 MEMBER','1','11999') +('5283','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5283 MEMBER','1','12000') +('5283','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5283 MEMBER','1','12001') +('8026','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8026 MEMBER','1','12002') +('7954','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7954 MEMBER','1','12003') +('8028','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8028 MEMBER','1','12004') +('8028','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8028 MEMBER','1','12005') +('8029','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8029 MEMBER','1','12006') +('5280','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5280 MEMBER','1','12007') +('5280','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5280 MEMBER','1','12008') +('7958','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7958 MEMBER','1','12009') +('7959','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7959 MEMBER','1','12010') +('7960','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7960 MEMBER','1','12011') +('7962','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7962 MEMBER','1','12012') +('7962','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7962 MEMBER','1','12013') +('7964','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7964 MEMBER','1','12014') +('7964','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7964 MEMBER','1','12015') +('7965','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7965 MEMBER','1','12016') +('7966','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7966 MEMBER','1','12017') +('6182','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6182 MEMBER','1','12018') +('8326','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8326 MEMBER','1','12019') +('8120','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8120 MEMBER','1','12020') +('7970','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7970 MEMBER','1','12021') +('7974','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7974 MEMBER','1','12022') +('7981','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7981 MEMBER','1','12023') +('8040','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8040 MEMBER','1','12024') +('8044','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8044 MEMBER','1','12025') +('8045','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8045 MEMBER','1','12026') +('8046','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8046 MEMBER','1','12027') +('8047','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8047 MEMBER','1','12028') +('8049','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8049 MEMBER','1','12029') +('8050','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8050 MEMBER','1','12030') +('8052','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8052 MEMBER','1','12031') +('8054','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8054 MEMBER','1','12032') +('8055','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8055 MEMBER','1','12033') +('8056','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8056 MEMBER','1','12034') +('8057','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8057 MEMBER','1','12035') +('8058','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8058 MEMBER','1','12036') +('8060','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8060 MEMBER','1','12037') +('8061','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8061 MEMBER','1','12038') +('8062','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8062 MEMBER','1','12039') +('8063','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8063 MEMBER','1','12040') +('8064','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8064 MEMBER','1','12041') +('8065','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8065 MEMBER','1','12042') +('8066','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8066 MEMBER','1','12043') +('8070','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8070 MEMBER','1','12044') +('8072','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8072 MEMBER','1','12045') +('8073','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8073 MEMBER','1','12046') +('6781','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6781 MEMBER','1','12047') +('547','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"547 MEMBER','1','12048') +('8002','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8002 MEMBER','1','12049') +('7986','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7986 MEMBER','1','12050') +('1312','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1312 MEMBER','1','12051') +('7983','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7983 MEMBER','1','12052') +('8030','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8030 MEMBER','1','12053') +('8030','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8030 MEMBER','1','12054') +('8031','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8031 MEMBER','1','12055') +('8032','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8032 MEMBER','1','12056') +('8032','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8032 MEMBER','1','12057') +('8032','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8032 MEMBER','1','12058') +('8033','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8033 MEMBER','1','12059') +('8034','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8034 MEMBER','1','12060') +('8035','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8035 MEMBER','1','12061') +('7910','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7910 MEMBER','1','12062') +('8999','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8999 MEMBER','1','12063') +('8036','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8036 MEMBER','1','12064') +('8038','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8038 MEMBER','1','12065') +('5234','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5234 MEMBER','1','12066') +('5234','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5234 MEMBER','1','12067') +('8746','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8746 MEMBER','1','12068') +('8039','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8039 MEMBER','1','12069') +('8040','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8040 MEMBER','1','12070') +('8040','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8040 MEMBER','1','12071') +('8041','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8041 MEMBER','1','12072') +('8041','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8041 MEMBER','1','12073') +('8564','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8564 MEMBER','1','12074') +('8042','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8042 MEMBER','1','12075') +('10142','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10142 MEMBER','1','12076') +('10216','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10216 MEMBER','1','12077') +('380','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"380 MEMBER','1','12078') +('1154','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',1567.78,'999','0','"1154 MEMBER','1','12079') +('8046','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8046 MEMBER','1','12080') +('8046','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8046 MEMBER','1','12081') +('8047','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8047 MEMBER','1','12082') +('8048','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8048 MEMBER','1','12083') +('8049','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8049 MEMBER','1','12084') +('8050','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8050 MEMBER','1','12085') +('8050','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8050 MEMBER','1','12086') +('8050','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8050 MEMBER','1','12087') +('8051','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8051 MEMBER','1','12088') +('8052','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8052 MEMBER','1','12089') +('8053','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8053 MEMBER','1','12090') +('8054','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8054 MEMBER','1','12091') +('4982','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4982 MEMBER','1','12092') +('8020','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8020 MEMBER','1','12093') +('7136','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7136 MEMBER','1','12094') +('8074','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8074 MEMBER','1','12095') +('8075','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8075 MEMBER','1','12096') +('8078','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8078 MEMBER','1','12097') +('8079','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8079 MEMBER','1','12098') +('8080','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8080 MEMBER','1','12099') +('8081','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8081 MEMBER','1','12100') +('8082','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8082 MEMBER','1','12101') +('8083','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8083 MEMBER','1','12102') +('8084','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8084 MEMBER','1','12103') +('8085','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8085 MEMBER','1','12104') +('8086','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8086 MEMBER','1','12105') +('8087','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8087 MEMBER','1','12106') +('8088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8088 MEMBER','1','12107') +('8089','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8089 MEMBER','1','12108') +('8090','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8090 MEMBER','1','12109') +('8091','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8091 MEMBER','1','12110') +('8092','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8092 MEMBER','1','12111') +('8093','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8093 MEMBER','1','12112') +('8094','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8094 MEMBER','1','12113') +('8095','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8095 MEMBER','1','12114') +('8096','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8096 MEMBER','1','12115') +('8097','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8097 MEMBER','1','12116') +('8098','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8098 MEMBER','1','12117') +('8099','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8099 MEMBER','1','12118') +('8100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8100 MEMBER','1','12119') +('8101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8101 MEMBER','1','12120') +('8102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8102 MEMBER','1','12121') +('8103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8103 MEMBER','1','12122') +('7891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7891 MEMBER','1','12123') +('7892','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7892 MEMBER','1','12124') +('7893','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7893 MEMBER','1','12125') +('7894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7894 MEMBER','1','12126') +('7895','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7895 MEMBER','1','12127') +('7896','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7896 MEMBER','1','12128') +('7897','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7897 MEMBER','1','12129') +('7898','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7898 MEMBER','1','12130') +('7899','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7899 MEMBER','1','12131') +('7900','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7900 MEMBER','1','12132') +('7901','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7901 MEMBER','1','12133') +('7902','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7902 MEMBER','1','12134') +('7903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7903 MEMBER','1','12135') +('7904','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7904 MEMBER','1','12136') +('7905','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7905 MEMBER','1','12137') +('7906','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7906 MEMBER','1','12138') +('7907','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7907 MEMBER','1','12139') +('7908','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7908 MEMBER','1','12140') +('7909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7909 MEMBER','1','12141') +('7910','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7910 MEMBER','1','12142') +('7911','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7911 MEMBER','1','12143') +('7912','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7912 MEMBER','1','12144') +('7995','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7995 MEMBER','1','12145') +('6037','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',1000.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6037 MEMBER','1','12146') +('7960','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7960 MEMBER','1','12147') +('8044','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8044 MEMBER','1','12148') +('9464','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9464 MEMBER','1','12149') +('7908','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7908 MEMBER','1','12150') +('7937','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7937 MEMBER','1','12151') +('7995','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7995 MEMBER','1','12152') +('5303','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5303 MEMBER','1','12153') +('2714','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2714 MEMBER','1','12154') +('5307','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5307 MEMBER','1','12155') +('5308','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5308 MEMBER','1','12156') +('8824','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8824 MEMBER','1','12157') +('5310','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5310 MEMBER','1','12158') +('8851','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8851 MEMBER','1','12159') +('7969','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7969 MEMBER','1','12160') +('8010','2','LASTNAME','FIRSTNAME',NULL,12.24,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8010 MEMBER','1','12161') +('8855','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8855 MEMBER','1','12162') +('5265','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5265 MEMBER','1','12163') +('8855','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8855 MEMBER','1','12164') +('9923','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9923 MEMBER','1','12165') +('8866','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8866 MEMBER','1','12166') +('7999','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7999 MEMBER','1','12167') +('7802','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7802 MEMBER','1','12168') +('5313','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5313 MEMBER','1','12169') +('7926','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7926 MEMBER','1','12170') +('7929','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7929 MEMBER','1','12171') +('7806','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7806 MEMBER','1','12172') +('8869','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8869 MEMBER','1','12173') +('5314','1','LASTNAME','FIRSTNAME',999.99,22.56,'10',80.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5314 MEMBER','1','12174') +('5315','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5315 MEMBER','1','12175') +('7938','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7938 MEMBER','1','12176') +('5316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5316 MEMBER','1','12177') +('8870','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8870 MEMBER','1','12178') +('5318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5318 MEMBER','1','12179') +('7948','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7948 MEMBER','1','12180') +('7953','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7953 MEMBER','1','12181') +('7943','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7943 MEMBER','1','12182') +('7967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7967 MEMBER','1','12183') +('8002','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8002 MEMBER','1','12184') +('7949','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7949 MEMBER','1','12185') +('8871','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8871 MEMBER','1','12186') +('8005','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8005 MEMBER','1','12187') +('8024','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8024 MEMBER','1','12188') +('8872','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8872 MEMBER','1','12189') +('8873','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8873 MEMBER','1','12190') +('8876','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8876 MEMBER','1','12191') +('8113','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8113 MEMBER','1','12192') +('7936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7936 MEMBER','1','12193') +('8335','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8335 MEMBER','1','12194') +('5175','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',50.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5175 MEMBER','1','12195') +('7939','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7939 MEMBER','1','12196') +('8037','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8037 MEMBER','1','12197') +('8137','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8137 MEMBER','1','12198') +('6123','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6123 MEMBER','1','12199') +('8126','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8126 MEMBER','1','12200') +('8123','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8123 MEMBER','1','12201') +('8121','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','1','0',NULL,NULL,'0','"8121 MEMBER','1','12202') +('5265','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5265 MEMBER','1','12203') +('6021','2','LASTNAME','FIRSTNAME',999.00,NULL,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6021 MEMBER','1','12204') +('6021','3','LASTNAME','FIRSTNAME',999.00,NULL,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6021 MEMBER','1','12205') +('8030','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8030 MEMBER','1','12206') +('8252','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8252 MEMBER','1','12207') +('8371','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8371 MEMBER','1','12208') +('8034','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8034 MEMBER','1','12209') +('8117','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8117 MEMBER','1','12210') +('8027','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8027 MEMBER','1','12211') +('8028','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8028 MEMBER','1','12212') +('8127','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8127 MEMBER','1','12213') +('7968','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7968 MEMBER','1','12214') +('8152','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8152 MEMBER','1','12215') +('8127','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8127 MEMBER','1','12216') +('7872','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7872 MEMBER','1','12217') +('5265','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5265 MEMBER','1','12218') +('8038','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8038 MEMBER','1','12219') +('7881','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7881 MEMBER','1','12220') +('10407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10407 MEMBER','1','12221') +('7799','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7799 MEMBER','1','12222') +('10411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10411 MEMBER','1','12223') +('7898','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7898 MEMBER','1','12224') +('4164','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4164 MEMBER','1','12225') +('8372','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8372 MEMBER','1','12226') +('8128','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8128 MEMBER','1','12227') +('8397','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8397 MEMBER','1','12228') +('7899','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7899 MEMBER','1','12229') +('7968','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7968 MEMBER','1','12230') +('8129','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8129 MEMBER','1','12231') +('8187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8187 MEMBER','1','12232') +('8275','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8275 MEMBER','1','12233') +('9209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9209 MEMBER','1','12234') +('8751','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8751 MEMBER','1','12235') +('8132','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8132 MEMBER','1','12236') +('7954','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7954 MEMBER','1','12237') +('8612','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8612 MEMBER','1','12238') +('7970','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7970 MEMBER','1','12239') +('7803','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7803 MEMBER','1','12240') +('6010','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6010 MEMBER','1','12241') +('7977','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7977 MEMBER','1','12242') +('7899','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7899 MEMBER','1','12243') +('8444','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8444 MEMBER','1','12244') +('5279','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5279 MEMBER','1','12245') +('7901','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7901 MEMBER','1','12246') +('7805','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7805 MEMBER','1','12247') +('8130','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8130 MEMBER','1','12248') +('7805','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7805 MEMBER','1','12249') +('7808','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7808 MEMBER','1','12250') +('7809','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7809 MEMBER','1','12251') +('8153','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8153 MEMBER','1','12252') +('7812','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7812 MEMBER','1','12253') +('7816','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7816 MEMBER','1','12254') +('7901','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7901 MEMBER','1','12255') +('8029','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8029 MEMBER','1','12256') +('8163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8163 MEMBER','1','12257') +('8166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8166 MEMBER','1','12258') +('8168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8168 MEMBER','1','12259') +('5281','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5281 MEMBER','1','12260') +('8615','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8615 MEMBER','1','12261') +('7913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7913 MEMBER','1','12262') +('7813','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7813 MEMBER','1','12263') +('7814','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7814 MEMBER','1','12264') +('7915','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7915 MEMBER','1','12265') +('8400','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8400 MEMBER','1','12266') +('1036','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1036 MEMBER','1','12267') +('6314','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6314 MEMBER','1','12268') +('7918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7918 MEMBER','1','12269') +('8012','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8012 MEMBER','1','12270') +('7814','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7814 MEMBER','1','12271') +('8283','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8283 MEMBER','1','12272') +('7982','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7982 MEMBER','1','12273') +('7814','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7814 MEMBER','1','12274') +('7922','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7922 MEMBER','1','12275') +('7924','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7924 MEMBER','1','12276') +('8922','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8922 MEMBER','1','12277') +('7143','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"7143 MEMBER','1','12278') +('8037','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8037 MEMBER','1','12279') +('7815','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7815 MEMBER','1','12280') +('8396','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8396 MEMBER','1','12281') +('9718','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9718 MEMBER','1','12282') +('6793','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6793 MEMBER','1','12283') +('8314','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8314 MEMBER','1','12284') +('7816','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7816 MEMBER','1','12285') +('7816','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7816 MEMBER','1','12286') +('8071','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8071 MEMBER','1','12287') +('9721','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9721 MEMBER','1','12288') +('8316','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8316 MEMBER','1','12289') +('8396','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8396 MEMBER','1','12290') +('7990','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7990 MEMBER','1','12291') +('8043','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8043 MEMBER','1','12292') +('8321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8321 MEMBER','1','12293') +('8322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8322 MEMBER','1','12294') +('8327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8327 MEMBER','1','12295') +('7949','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7949 MEMBER','1','12296') +('5282','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5282 MEMBER','1','12297') +('8395','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8395 MEMBER','1','12298') +('7819','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7819 MEMBER','1','12299') +('6600','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6600 MEMBER','1','12300') +('7931','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7931 MEMBER','1','12301') +('7916','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7916 MEMBER','1','12302') +('8395','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8395 MEMBER','1','12303') +('7819','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7819 MEMBER','1','12304') +('7817','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7817 MEMBER','1','12305') +('7417','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"7417 MEMBER','1','12306') +('7820','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7820 MEMBER','1','12307') +('8333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8333 MEMBER','1','12308') +('7822','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7822 MEMBER','1','12309') +('219','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"219 MEMBER','1','12310') +('7823','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7823 MEMBER','1','12311') +('8343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8343 MEMBER','1','12312') +('7823','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7823 MEMBER','1','12313') +('6600','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6600 MEMBER','1','12314') +('7932','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7932 MEMBER','1','12315') +('7827','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7827 MEMBER','1','12316') +('7946','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7946 MEMBER','1','12317') +('7829','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7829 MEMBER','1','12318') +('8344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8344 MEMBER','1','12319') +('7829','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7829 MEMBER','1','12320') +('7829','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7829 MEMBER','1','12321') +('7831','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7831 MEMBER','1','12322') +('7831','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7831 MEMBER','1','12323') +('7832','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7832 MEMBER','1','12324') +('7935','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7935 MEMBER','1','12325') +('7924','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7924 MEMBER','1','12326') +('7786','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7786 MEMBER','1','12327') +('8345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8345 MEMBER','1','12328') +('8929','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8929 MEMBER','1','12329') +('7925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7925 MEMBER','1','12330') +('8915','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8915 MEMBER','1','12331') +('8925','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8925 MEMBER','1','12332') +('8926','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8926 MEMBER','1','12333') +('8928','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8928 MEMBER','1','12334') +('6033','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',546.51,'999','0','"6033 MEMBER','1','12335') +('8948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8948 MEMBER','1','12336') +('7951','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7951 MEMBER','1','12337') +('10083','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10083 MEMBER','1','12338') +('7912','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7912 MEMBER','1','12339') +('7996','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7996 MEMBER','1','12340') +('8950','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8950 MEMBER','1','12341') +('8951','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8951 MEMBER','1','12342') +('7942','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7942 MEMBER','1','12343') +('7952','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7952 MEMBER','1','12344') +('8954','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8954 MEMBER','1','12345') +('7958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7958 MEMBER','1','12346') +('8955','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8955 MEMBER','1','12347') +('6020','3','LASTNAME','FIRSTNAME',NULL,21.71,'0',200.00,'1','0',NULL,'PC','2','0','0',NULL,NULL,'0','"6020 MEMBER','1','12348') +('7944','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7944 MEMBER','1','12349') +('6864','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6864 MEMBER','1','12350') +('8956','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8956 MEMBER','1','12351') +('8957','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8957 MEMBER','1','12352') +('6864','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',NULL,'999','1','"6864 MEMBER','1','12353') +('8958','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8958 MEMBER','1','12354') +('7959','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7959 MEMBER','1','12355') +('7799','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7799 MEMBER','1','12356') +('7798','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7798 MEMBER','1','12357') +('8959','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8959 MEMBER','1','12358') +('7945','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7945 MEMBER','1','12359') +('7801','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7801 MEMBER','1','12360') +('8012','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8012 MEMBER','1','12361') +('7946','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7946 MEMBER','1','12362') +('8960','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8960 MEMBER','1','12363') +('8961','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8961 MEMBER','1','12364') +('8962','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8962 MEMBER','1','12365') +('8077','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8077 MEMBER','1','12366') +('7947','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7947 MEMBER','1','12367') +('7045','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7045 MEMBER','1','12368') +('8963','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8963 MEMBER','1','12369') +('7500','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7500 MEMBER','1','12370') +('8013','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8013 MEMBER','1','12371') +('8071','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8071 MEMBER','1','12372') +('7807','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7807 MEMBER','1','12373') +('8022','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8022 MEMBER','1','12374') +('8964','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8964 MEMBER','1','12375') +('7808','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7808 MEMBER','1','12376') +('8014','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8014 MEMBER','1','12377') +('8072','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8072 MEMBER','1','12378') +('7808','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7808 MEMBER','1','12379') +('8965','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8965 MEMBER','1','12380') +('8966','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8966 MEMBER','1','12381') +('8967','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8967 MEMBER','1','12382') +('8015','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8015 MEMBER','1','12383') +('8968','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8968 MEMBER','1','12384') +('7948','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7948 MEMBER','1','12385') +('8969','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8969 MEMBER','1','12386') +('8975','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8975 MEMBER','1','12387') +('7809','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7809 MEMBER','1','12388') +('7809','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7809 MEMBER','1','12389') +('7811','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7811 MEMBER','1','12390') +('7949','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7949 MEMBER','1','12391') +('7951','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7951 MEMBER','1','12392') +('8016','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8016 MEMBER','1','12393') +('8017','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8017 MEMBER','1','12394') +('7961','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7961 MEMBER','1','12395') +('8978','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8978 MEMBER','1','12396') +('8979','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8979 MEMBER','1','12397') +('8980','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8980 MEMBER','1','12398') +('8981','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8981 MEMBER','1','12399') +('8441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8441 MEMBER','1','12400') +('5261','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5261 MEMBER','1','12401') +('8442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8442 MEMBER','1','12402') +('7967','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7967 MEMBER','1','12403') +('5306','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5306 MEMBER','1','12404') +('7956','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7956 MEMBER','1','12405') +('8252','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8252 MEMBER','1','12406') +('8942','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8942 MEMBER','1','12407') +('7817','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7817 MEMBER','1','12408') +('7822','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7822 MEMBER','1','12409') +('7825','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7825 MEMBER','1','12410') +('7969','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7969 MEMBER','1','12411') +('7828','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7828 MEMBER','1','12412') +('7830','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7830 MEMBER','1','12413') +('8011','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8011 MEMBER','1','12414') +('8124','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8124 MEMBER','1','12415') +('7831','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7831 MEMBER','1','12416') +('7927','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7927 MEMBER','1','12417') +('1324','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"1324 MEMBER','1','12418') +('7833','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7833 MEMBER','1','12419') +('6015','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6015 MEMBER','1','12420') +('8079','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8079 MEMBER','1','12421') +('7834','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7834 MEMBER','1','12422') +('10127','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10127 MEMBER','1','12423') +('9338','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9338 MEMBER','1','12424') +('7836','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7836 MEMBER','1','12425') +('7838','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7838 MEMBER','1','12426') +('7909','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7909 MEMBER','1','12427') +('7968','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7968 MEMBER','1','12428') +('7837','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7837 MEMBER','1','12429') +('7837','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7837 MEMBER','1','12430') +('7928','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7928 MEMBER','1','12431') +('7933','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7933 MEMBER','1','12432') +('7839','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7839 MEMBER','1','12433') +('9283','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"9283 MEMBER','1','12434') +('7972','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7972 MEMBER','1','12435') +('9809','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9809 MEMBER','1','12436') +('7934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7934 MEMBER','1','12437') +('6508','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','1','0',NULL,NULL,'1','"6508 MEMBER','1','12438') +('7976','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7976 MEMBER','1','12439') +('7976','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7976 MEMBER','1','12440') +('7928','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7928 MEMBER','1','12441') +('7839','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7839 MEMBER','1','12442') +('8012','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8012 MEMBER','1','12443') +('7839','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7839 MEMBER','1','12444') +('7840','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7840 MEMBER','1','12445') +('7841','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7841 MEMBER','1','12446') +('7842','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7842 MEMBER','1','12447') +('7843','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"7843 MEMBER','1','12448') +('7844','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7844 MEMBER','1','12449') +('7845','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7845 MEMBER','1','12450') +('7846','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7846 MEMBER','1','12451') +('7851','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7851 MEMBER','1','12452') +('7851','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7851 MEMBER','1','12453') +('7853','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7853 MEMBER','1','12454') +('7854','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7854 MEMBER','1','12455') +('7855','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7855 MEMBER','1','12456') +('7856','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7856 MEMBER','1','12457') +('7857','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7857 MEMBER','1','12458') +('7844','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7844 MEMBER','1','12459') +('7844','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7844 MEMBER','1','12460') +('7818','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7818 MEMBER','1','12461') +('7818','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7818 MEMBER','1','12462') +('7818','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"7818 MEMBER','1','12463') +('5269','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5269 MEMBER','1','12464') +('5269','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5269 MEMBER','1','12465') +('5269','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5269 MEMBER','1','12466') +('7940','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7940 MEMBER','1','12467') +('7941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7941 MEMBER','1','12468') +('7982','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7982 MEMBER','1','12469') +('8184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8184 MEMBER','1','12470') +('8186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8186 MEMBER','1','12471') +('8188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8188 MEMBER','1','12472') +('8190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8190 MEMBER','1','12473') +('8193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8193 MEMBER','1','12474') +('10181','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10181 MEMBER','1','12475') +('7883','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7883 MEMBER','1','12476') +('4451','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4451 MEMBER','1','12477') +('8148','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8148 MEMBER','1','12478') +('8146','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8146 MEMBER','1','12479') +('8145','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8145 MEMBER','1','12480') +('8144','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8144 MEMBER','1','12481') +('8144','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8144 MEMBER','1','12482') +('8144','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8144 MEMBER','1','12483') +('8149','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8149 MEMBER','1','12484') +('8149','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8149 MEMBER','1','12485') +('8150','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8150 MEMBER','1','12486') +('8150','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8150 MEMBER','1','12487') +('6648','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6648 MEMBER','1','12488') +('6987','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6987 MEMBER','1','12489') +('5369','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5369 MEMBER','1','12490') +('8163','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8163 MEMBER','1','12491') +('8163','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8163 MEMBER','1','12492') +('8163','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8163 MEMBER','1','12493') +('8161','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8161 MEMBER','1','12494') +('8160','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8160 MEMBER','1','12495') +('8159','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8159 MEMBER','1','12496') +('8154','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8154 MEMBER','1','12497') +('8157','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8157 MEMBER','1','12498') +('8155','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8155 MEMBER','1','12499') +('8047','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8047 MEMBER','1','12500') +('8047','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8047 MEMBER','1','12501') +('8168','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8168 MEMBER','1','12502') +('8166','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8166 MEMBER','1','12503') +('8166','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8166 MEMBER','1','12504') +('8164','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8164 MEMBER','1','12505') +('8164','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8164 MEMBER','1','12506') +('6009','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','1',NULL,'REG','2','0','0',NULL,NULL,'0','"6009 MEMBER','1','12507') +('6009','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','1',NULL,'REG','2','0','0',NULL,NULL,'0','"6009 MEMBER','1','12508') +('8194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8194 MEMBER','1','12509') +('8195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8195 MEMBER','1','12510') +('8196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8196 MEMBER','1','12511') +('8201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8201 MEMBER','1','12512') +('8202','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8202 MEMBER','1','12513') +('8203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8203 MEMBER','1','12514') +('8204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8204 MEMBER','1','12515') +('8210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8210 MEMBER','1','12516') +('8213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8213 MEMBER','1','12517') +('8214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8214 MEMBER','1','12518') +('8215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8215 MEMBER','1','12519') +('8216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8216 MEMBER','1','12520') +('8221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8221 MEMBER','1','12521') +('8222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8222 MEMBER','1','12522') +('8223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8223 MEMBER','1','12523') +('8226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8226 MEMBER','1','12524') +('8227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8227 MEMBER','1','12525') +('8229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8229 MEMBER','1','12526') +('8231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8231 MEMBER','1','12527') +('8232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8232 MEMBER','1','12528') +('8233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8233 MEMBER','1','12529') +('8139','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8139 MEMBER','1','12530') +('8170','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8170 MEMBER','1','12531') +('8175','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8175 MEMBER','1','12532') +('8175','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8175 MEMBER','1','12533') +('8177','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8177 MEMBER','1','12534') +('8177','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8177 MEMBER','1','12535') +('8181','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8181 MEMBER','1','12536') +('8182','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8182 MEMBER','1','12537') +('8182','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8182 MEMBER','1','12538') +('8188','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8188 MEMBER','1','12539') +('8189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8189 MEMBER','1','12540') +('8198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8198 MEMBER','1','12541') +('8200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8200 MEMBER','1','12542') +('8205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8205 MEMBER','1','12543') +('8206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8206 MEMBER','1','12544') +('8207','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8207 MEMBER','1','12545') +('8208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8208 MEMBER','1','12546') +('8209','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8209 MEMBER','1','12547') +('8211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8211 MEMBER','1','12548') +('8212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8212 MEMBER','1','12549') +('8217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8217 MEMBER','1','12550') +('8218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8218 MEMBER','1','12551') +('8219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8219 MEMBER','1','12552') +('8220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8220 MEMBER','1','12553') +('8224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8224 MEMBER','1','12554') +('8225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8225 MEMBER','1','12555') +('8228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8228 MEMBER','1','12556') +('8230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8230 MEMBER','1','12557') +('5273','2','LASTNAME','FIRSTNAME',NULL,10.93,'10',25.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5273 MEMBER','1','12558') +('468','3','LASTNAME','FIRSTNAME',NULL,7.45,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"468 MEMBER','1','12559') +('8176','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8176 MEMBER','1','12560') +('8181','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8181 MEMBER','1','12561') +('8187','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8187 MEMBER','1','12562') +('5299','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','TERM','0','0','0',0.00,'999','0','"5299 MEMBER','1','12563') +('5300','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5300 MEMBER','1','12564') +('5301','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5301 MEMBER','1','12565') +('5302','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5302 MEMBER','1','12566') +('5304','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5304 MEMBER','1','12567') +('5305','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5305 MEMBER','1','12568') +('5309','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5309 MEMBER','1','12569') +('5311','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5311 MEMBER','1','12570') +('5312','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5312 MEMBER','1','12571') +('5317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5317 MEMBER','1','12572') +('6923','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"6923 MEMBER','1','12573') +('8196','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8196 MEMBER','1','12574') +('8196','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8196 MEMBER','1','12575') +('8196','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8196 MEMBER','1','12576') +('6156','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6156 MEMBER','1','12577') +('8183','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8183 MEMBER','1','12578') +('6027','2','LASTNAME','FIRSTNAME',NULL,4.99,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6027 MEMBER','1','12579') +('8243','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8243 MEMBER','1','12580') +('8245','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8245 MEMBER','1','12581') +('8193','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8193 MEMBER','1','12582') +('8194','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8194 MEMBER','1','12583') +('8194','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8194 MEMBER','1','12584') +('8194','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8194 MEMBER','1','12585') +('6888','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6888 MEMBER','1','12586') +('6888','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6888 MEMBER','1','12587') +('7696','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7696 MEMBER','1','12588') +('2670','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2670 MEMBER','1','12589') +('8203','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8203 MEMBER','1','12590') +('8198','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8198 MEMBER','1','12591') +('8198','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8198 MEMBER','1','12592') +('8199','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8199 MEMBER','1','12593') +('8199','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8199 MEMBER','1','12594') +('8199','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8199 MEMBER','1','12595') +('8200','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8200 MEMBER','1','12596') +('8200','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8200 MEMBER','1','12597') +('8201','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8201 MEMBER','1','12598') +('8204','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8204 MEMBER','1','12599') +('8204','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8204 MEMBER','1','12600') +('8205','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8205 MEMBER','1','12601') +('8205','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8205 MEMBER','1','12602') +('8205','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8205 MEMBER','1','12603') +('8202','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8202 MEMBER','1','12604') +('6929','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6929 MEMBER','1','12605') +('8206','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8206 MEMBER','1','12606') +('6010','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6010 MEMBER','1','12607') +('8207','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8207 MEMBER','1','12608') +('8201','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8201 MEMBER','1','12609') +('8209','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8209 MEMBER','1','12610') +('8222','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8222 MEMBER','1','12611') +('8107','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8107 MEMBER','1','12612') +('212','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"212 MEMBER','1','12613') +('8451','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8451 MEMBER','1','12614') +('8454','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8454 MEMBER','1','12615') +('8454','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8454 MEMBER','1','12616') +('8453','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8453 MEMBER','1','12617') +('8746','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8746 MEMBER','1','12618') +('8545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8545 MEMBER','1','12619') +('8506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8506 MEMBER','1','12620') +('8512','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8512 MEMBER','1','12621') +('8515','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8515 MEMBER','1','12622') +('8513','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8513 MEMBER','1','12623') +('8514','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8514 MEMBER','1','12624') +('9169','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9169 MEMBER','1','12625') +('8517','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8517 MEMBER','1','12626') +('8517','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8517 MEMBER','1','12627') +('8514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8514 MEMBER','1','12628') +('8515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8515 MEMBER','1','12629') +('8516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8516 MEMBER','1','12630') +('8517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8517 MEMBER','1','12631') +('8518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8518 MEMBER','1','12632') +('8519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8519 MEMBER','1','12633') +('8520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8520 MEMBER','1','12634') +('8521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8521 MEMBER','1','12635') +('8522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8522 MEMBER','1','12636') +('8523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8523 MEMBER','1','12637') +('8524','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8524 MEMBER','1','12638') +('8525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8525 MEMBER','1','12639') +('8526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8526 MEMBER','1','12640') +('8527','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8527 MEMBER','1','12641') +('8528','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8528 MEMBER','1','12642') +('8529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8529 MEMBER','1','12643') +('8530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8530 MEMBER','1','12644') +('8531','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8531 MEMBER','1','12645') +('8532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8532 MEMBER','1','12646') +('8533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8533 MEMBER','1','12647') +('8534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8534 MEMBER','1','12648') +('8535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8535 MEMBER','1','12649') +('8536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8536 MEMBER','1','12650') +('8537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8537 MEMBER','1','12651') +('8538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8538 MEMBER','1','12652') +('8539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8539 MEMBER','1','12653') +('8540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8540 MEMBER','1','12654') +('8541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8541 MEMBER','1','12655') +('8542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8542 MEMBER','1','12656') +('8543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8543 MEMBER','1','12657') +('8544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8544 MEMBER','1','12658') +('8459','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8459 MEMBER','1','12659') +('8459','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8459 MEMBER','1','12660') +('8459','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8459 MEMBER','1','12661') +('8460','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8460 MEMBER','1','12662') +('8460','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8460 MEMBER','1','12663') +('8460','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8460 MEMBER','1','12664') +('8458','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8458 MEMBER','1','12665') +('8457','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8457 MEMBER','1','12666') +('8457','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8457 MEMBER','1','12667') +('10308','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10308 MEMBER','1','12668') +('8461','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8461 MEMBER','1','12669') +('10086','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10086 MEMBER','1','12670') +('8045','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8045 MEMBER','1','12671') +('7162','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7162 MEMBER','1','12672') +('8462','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8462 MEMBER','1','12673') +('8463','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8463 MEMBER','1','12674') +('8463','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8463 MEMBER','1','12675') +('8463','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8463 MEMBER','1','12676') +('8465','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8465 MEMBER','1','12677') +('8465','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8465 MEMBER','1','12678') +('8466','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8466 MEMBER','1','12679') +('8466','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8466 MEMBER','1','12680') +('8467','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8467 MEMBER','1','12681') +('8468','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8468 MEMBER','1','12682') +('8470','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8470 MEMBER','1','12683') +('8469','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8469 MEMBER','1','12684') +('6833','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6833 MEMBER','1','12685') +('6833','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6833 MEMBER','1','12686') +('6833','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6833 MEMBER','1','12687') +('8475','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8475 MEMBER','1','12688') +('8475','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8475 MEMBER','1','12689') +('8475','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8475 MEMBER','1','12690') +('8471','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8471 MEMBER','1','12691') +('8473','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8473 MEMBER','1','12692') +('8478','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8478 MEMBER','1','12693') +('8478','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8478 MEMBER','1','12694') +('8477','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8477 MEMBER','1','12695') +('8480','2','LASTNAME','FIRSTNAME',NULL,'-12.04','0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8480 MEMBER','1','12696') +('8480','3','LASTNAME','FIRSTNAME',NULL,'-12.04','0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8480 MEMBER','1','12697') +('8479','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8479 MEMBER','1','12698') +('89','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"89 MEMBER','1','12699') +('9910','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9910 MEMBER','1','12700') +('6982','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6982 MEMBER','1','12701') +('8482','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8482 MEMBER','1','12702') +('8482','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8482 MEMBER','1','12703') +('8482','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8482 MEMBER','1','12704') +('8481','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8481 MEMBER','1','12705') +('8481','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8481 MEMBER','1','12706') +('8484','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8484 MEMBER','1','12708') +('8488','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8488 MEMBER','1','12709') +('8488','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8488 MEMBER','1','12710') +('8488','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8488 MEMBER','1','12711') +('8489','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8489 MEMBER','1','12712') +('8492','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8492 MEMBER','1','12714') +('7835','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7835 MEMBER','1','12715') +('8495','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8495 MEMBER','1','12716') +('8495','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8495 MEMBER','1','12717') +('8495','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8495 MEMBER','1','12718') +('8494','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8494 MEMBER','1','12719') +('8494','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8494 MEMBER','1','12720') +('8494','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8494 MEMBER','1','12721') +('10255','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10255 MEMBER','1','12722') +('8500','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8500 MEMBER','1','12723') +('8496','2','LASTNAME','FIRSTNAME',NULL,18.99,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8496 MEMBER','1','12724') +('8496','3','LASTNAME','FIRSTNAME',NULL,18.99,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8496 MEMBER','1','12725') +('1999','3','LASTNAME','FIRSTNAME',NULL,15.44,'10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"1999 MEMBER','1','12726') +('8497','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8497 MEMBER','1','12727') +('8497','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8497 MEMBER','1','12728') +('8497','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8497 MEMBER','1','12729') +('8498','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8498 MEMBER','1','12730') +('8498','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8498 MEMBER','1','12731') +('8937','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8937 MEMBER','1','12732') +('10391','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10391 MEMBER','1','12733') +('10256','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10256 MEMBER','1','12734') +('9273','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9273 MEMBER','1','12735') +('7888','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"7888 MEMBER','1','12736') +('8501','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8501 MEMBER','1','12737') +('8502','2','LASTNAME','FIRSTNAME',NULL,62.26,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"8502 MEMBER','1','12738') +('8502','3','LASTNAME','FIRSTNAME',NULL,62.26,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"8502 MEMBER','1','12739') +('8503','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8503 MEMBER','1','12740') +('8504','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8504 MEMBER','1','12741') +('5315','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5315 MEMBER','1','12742') +('5314','2','LASTNAME','FIRSTNAME',NULL,22.56,'10',80.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5314 MEMBER','1','12743') +('8508','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8508 MEMBER','1','12744') +('8510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8510 MEMBER','1','12745') +('8511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8511 MEMBER','1','12746') +('8513','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8513 MEMBER','1','12747') +('4418','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4418 MEMBER','1','12748') +('8512','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8512 MEMBER','1','12749') +('8513','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8513 MEMBER','1','12750') +('8513','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8513 MEMBER','1','12751') +('8248','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8248 MEMBER','1','12752') +('8242','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8242 MEMBER','1','12753') +('8258','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8258 MEMBER','1','12754') +('8262','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8262 MEMBER','1','12755') +('8262','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8262 MEMBER','1','12756') +('8262','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8262 MEMBER','1','12757') +('8263','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8263 MEMBER','1','12758') +('8266','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8266 MEMBER','1','12759') +('8250','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8250 MEMBER','1','12760') +('8250','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8250 MEMBER','1','12761') +('8251','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8251 MEMBER','1','12762') +('8253','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8253 MEMBER','1','12763') +('8254','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8254 MEMBER','1','12764') +('8255','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8255 MEMBER','1','12765') +('8255','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8255 MEMBER','1','12766') +('8255','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8255 MEMBER','1','12767') +('8256','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8256 MEMBER','1','12768') +('8257','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8257 MEMBER','1','12769') +('8257','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8257 MEMBER','1','12770') +('8260','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8260 MEMBER','1','12771') +('8259','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8259 MEMBER','1','12772') +('8259','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8259 MEMBER','1','12773') +('8270','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8270 MEMBER','1','12774') +('8269','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8269 MEMBER','1','12775') +('8269','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8269 MEMBER','1','12776') +('8269','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8269 MEMBER','1','12777') +('6769','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6769 MEMBER','1','12778') +('1695','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"1695 MEMBER','1','12779') +('8274','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8274 MEMBER','1','12780') +('8274','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8274 MEMBER','1','12781') +('8273','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8273 MEMBER','1','12782') +('8273','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8273 MEMBER','1','12783') +('8272','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8272 MEMBER','1','12784') +('8272','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8272 MEMBER','1','12785') +('8271','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8271 MEMBER','1','12786') +('8271','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8271 MEMBER','1','12787') +('5298','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5298 MEMBER','1','12788') +('6004','2','LASTNAME','FIRSTNAME',NULL,92.61,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6004 MEMBER','1','12789') +('6004','3','LASTNAME','FIRSTNAME',NULL,92.61,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6004 MEMBER','1','12790') +('8268','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8268 MEMBER','1','12791') +('8277','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8277 MEMBER','1','12792') +('8278','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8278 MEMBER','1','12793') +('8278','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8278 MEMBER','1','12794') +('8280','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8280 MEMBER','1','12795') +('8280','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8280 MEMBER','1','12796') +('8281','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8281 MEMBER','1','12797') +('8288','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8288 MEMBER','1','12798') +('8288','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8288 MEMBER','1','12799') +('8287','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8287 MEMBER','1','12800') +('8315','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8315 MEMBER','1','12801') +('8317','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8317 MEMBER','1','12802') +('8318','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8318 MEMBER','1','12803') +('8319','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8319 MEMBER','1','12804') +('8320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8320 MEMBER','1','12805') +('8323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8323 MEMBER','1','12806') +('8324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8324 MEMBER','1','12807') +('8325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8325 MEMBER','1','12808') +('8326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8326 MEMBER','1','12809') +('8328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8328 MEMBER','1','12810') +('8329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8329 MEMBER','1','12811') +('8330','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8330 MEMBER','1','12812') +('8331','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8331 MEMBER','1','12813') +('8332','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8332 MEMBER','1','12814') +('8334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8334 MEMBER','1','12815') +('8335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8335 MEMBER','1','12816') +('8336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8336 MEMBER','1','12817') +('8337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8337 MEMBER','1','12818') +('8338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8338 MEMBER','1','12819') +('8339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8339 MEMBER','1','12820') +('8340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8340 MEMBER','1','12821') +('8341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8341 MEMBER','1','12822') +('8342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8342 MEMBER','1','12823') +('8346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8346 MEMBER','1','12824') +('8347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8347 MEMBER','1','12825') +('8348','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8348 MEMBER','1','12826') +('8349','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8349 MEMBER','1','12827') +('8350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8350 MEMBER','1','12828') +('8351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8351 MEMBER','1','12829') +('8352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8352 MEMBER','1','12830') +('8353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8353 MEMBER','1','12831') +('8294','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8294 MEMBER','1','12832') +('8296','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8296 MEMBER','1','12833') +('9259','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9259 MEMBER','1','12834') +('8297','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8297 MEMBER','1','12835') +('8297','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8297 MEMBER','1','12836') +('4562','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4562 MEMBER','1','12837') +('8301','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8301 MEMBER','1','12838') +('10088','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10088 MEMBER','1','12839') +('8303','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8303 MEMBER','1','12840') +('8303','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8303 MEMBER','1','12841') +('8305','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8305 MEMBER','1','12842') +('8300','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8300 MEMBER','1','12843') +('8299','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8299 MEMBER','1','12844') +('8298','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8298 MEMBER','1','12845') +('8311','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8311 MEMBER','1','12846') +('8311','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8311 MEMBER','1','12847') +('8310','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8310 MEMBER','1','12848') +('8308','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8308 MEMBER','1','12849') +('8308','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8308 MEMBER','1','12850') +('8308','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8308 MEMBER','1','12851') +('8307','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8307 MEMBER','1','12852') +('8307','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8307 MEMBER','1','12853') +('8307','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8307 MEMBER','1','12854') +('8306','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8306 MEMBER','1','12855') +('8314','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8314 MEMBER','1','12856') +('8314','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8314 MEMBER','1','12857') +('8314','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8314 MEMBER','1','12858') +('8313','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8313 MEMBER','1','12859') +('8313','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8313 MEMBER','1','12860') +('8313','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8313 MEMBER','1','12861') +('8312','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8312 MEMBER','1','12862') +('8312','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8312 MEMBER','1','12863') +('8312','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8312 MEMBER','1','12864') +('163','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"163 MEMBER','1','12865') +('8315','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8315 MEMBER','1','12866') +('8315','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8315 MEMBER','1','12867') +('8315','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8315 MEMBER','1','12868') +('8316','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8316 MEMBER','1','12869') +('8316','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8316 MEMBER','1','12870') +('8316','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8316 MEMBER','1','12871') +('231','3','LASTNAME','FIRSTNAME',NULL,39.82,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"231 MEMBER','1','12872') +('8057','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8057 MEMBER','1','12873') +('9504','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9504 MEMBER','1','12874') +('8327','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8327 MEMBER','1','12875') +('8327','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8327 MEMBER','1','12876') +('8327','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8327 MEMBER','1','12877') +('8320','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8320 MEMBER','1','12878') +('8318','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8318 MEMBER','1','12879') +('8323','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8323 MEMBER','1','12880') +('8321','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8321 MEMBER','1','12881') +('8321','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8321 MEMBER','1','12882') +('8321','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8321 MEMBER','1','12883') +('8328','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8328 MEMBER','1','12884') +('8329','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8329 MEMBER','1','12885') +('8330','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8330 MEMBER','1','12886') +('8330','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8330 MEMBER','1','12887') +('8330','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8330 MEMBER','1','12888') +('4083','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"4083 MEMBER','1','12889') +('8334','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8334 MEMBER','1','12890') +('8334','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8334 MEMBER','1','12891') +('8332','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8332 MEMBER','1','12892') +('8538','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8538 MEMBER','1','12893') +('5602','1','LASTNAME','FIRSTNAME',999.99,160.01,'0',500.00,'1','0','0','REG','0','0','0',0.00,'0','0','"5602 MEMBER','1','12894') +('8546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8546 MEMBER','1','12895') +('8547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8547 MEMBER','1','12896') +('8548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8548 MEMBER','1','12897') +('8549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8549 MEMBER','1','12898') +('8550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8550 MEMBER','1','12899') +('8551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8551 MEMBER','1','12900') +('8552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8552 MEMBER','1','12901') +('8553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8553 MEMBER','1','12902') +('8554','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8554 MEMBER','1','12903') +('8555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8555 MEMBER','1','12904') +('8556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8556 MEMBER','1','12905') +('8557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8557 MEMBER','1','12906') +('8558','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8558 MEMBER','1','12907') +('8559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8559 MEMBER','1','12908') +('8560','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8560 MEMBER','1','12909') +('8561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8561 MEMBER','1','12910') +('8562','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8562 MEMBER','1','12911') +('8563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8563 MEMBER','1','12912') +('8564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8564 MEMBER','1','12913') +('8565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8565 MEMBER','1','12914') +('8566','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8566 MEMBER','1','12915') +('8567','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8567 MEMBER','1','12916') +('8568','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8568 MEMBER','1','12917') +('8569','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8569 MEMBER','1','12918') +('8570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8570 MEMBER','1','12919') +('8571','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8571 MEMBER','1','12920') +('8572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8572 MEMBER','1','12921') +('8573','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8573 MEMBER','1','12922') +('8574','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8574 MEMBER','1','12923') +('8575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8575 MEMBER','1','12924') +('8576','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8576 MEMBER','1','12925') +('8577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8577 MEMBER','1','12926') +('8578','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8578 MEMBER','1','12927') +('8579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8579 MEMBER','1','12928') +('8580','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8580 MEMBER','1','12929') +('8581','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8581 MEMBER','1','12930') +('8582','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8582 MEMBER','1','12931') +('8583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8583 MEMBER','1','12932') +('8584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8584 MEMBER','1','12933') +('8585','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8585 MEMBER','1','12934') +('8538','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8538 MEMBER','1','12935') +('8544','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8544 MEMBER','1','12936') +('7174','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"7174 MEMBER','1','12937') +('8539','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8539 MEMBER','1','12938') +('8539','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8539 MEMBER','1','12939') +('8539','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8539 MEMBER','1','12940') +('8540','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8540 MEMBER','1','12941') +('8541','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8541 MEMBER','1','12942') +('8542','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8542 MEMBER','1','12943') +('8542','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8542 MEMBER','1','12944') +('8542','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8542 MEMBER','1','12945') +('6834','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6834 MEMBER','1','12946') +('9284','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9284 MEMBER','1','12947') +('8545','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8545 MEMBER','1','12948') +('8545','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8545 MEMBER','1','12949') +('8545','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8545 MEMBER','1','12950') +('8546','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8546 MEMBER','1','12951') +('6881','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6881 MEMBER','1','12952') +('8543','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8543 MEMBER','1','12953') +('8543','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8543 MEMBER','1','12954') +('9150','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9150 MEMBER','1','12955') +('10073','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10073 MEMBER','1','12956') +('8866','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8866 MEMBER','1','12957') +('8611','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8611 MEMBER','1','12958') +('5603','1','LASTNAME','FIRSTNAME',999.99,1083.01,'0',2000.00,'1','0','0','REG','0','0','0',0.00,'0','0','"5603 MEMBER','1','12959') +('5604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',100.00,'1','0','0','REG','0','0','0',0.00,'0','0','"5604 MEMBER','1','12960') +('5605','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',100.00,'1','0','0','REG','0','0','0',0.00,'0','0','"5605 MEMBER','1','12961') +('5607','1','LASTNAME','FIRSTNAME',999.99,65.00,'0',500.00,'1','0','0','REG','0','0','0',0.00,'0','0','"5607 MEMBER','1','12962') +('8432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8432 MEMBER','1','12963') +('8433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8433 MEMBER','1','12964') +('8379','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8379 MEMBER','1','12965') +('8380','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8380 MEMBER','1','12966') +('8380','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8380 MEMBER','1','12967') +('8381','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8381 MEMBER','1','12968') +('8381','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8381 MEMBER','1','12969') +('8382','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8382 MEMBER','1','12970') +('8383','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8383 MEMBER','1','12971') +('8384','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8384 MEMBER','1','12972') +('8385','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8385 MEMBER','1','12973') +('8386','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8386 MEMBER','1','12974') +('8386','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8386 MEMBER','1','12975') +('8386','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8386 MEMBER','1','12976') +('8387','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8387 MEMBER','1','12977') +('8389','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8389 MEMBER','1','12978') +('8392','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8392 MEMBER','1','12979') +('8392','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8392 MEMBER','1','12980') +('8393','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8393 MEMBER','1','12981') +('8396','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8396 MEMBER','1','12982') +('8434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8434 MEMBER','1','12983') +('8435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8435 MEMBER','1','12984') +('8436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8436 MEMBER','1','12985') +('8437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8437 MEMBER','1','12986') +('8438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8438 MEMBER','1','12987') +('8439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8439 MEMBER','1','12988') +('8440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8440 MEMBER','1','12989') +('8443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8443 MEMBER','1','12990') +('8444','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8444 MEMBER','1','12991') +('8445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8445 MEMBER','1','12992') +('8446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8446 MEMBER','1','12993') +('8447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8447 MEMBER','1','12994') +('8448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8448 MEMBER','1','12995') +('8449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8449 MEMBER','1','12996') +('8450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8450 MEMBER','1','12997') +('8451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8451 MEMBER','1','12998') +('8452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8452 MEMBER','1','12999') +('8453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8453 MEMBER','1','13000') +('8454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8454 MEMBER','1','13001') +('8455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8455 MEMBER','1','13002') +('8456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8456 MEMBER','1','13003') +('8457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8457 MEMBER','1','13004') +('8458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8458 MEMBER','1','13005') +('8459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8459 MEMBER','1','13006') +('8460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8460 MEMBER','1','13007') +('8461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8461 MEMBER','1','13008') +('8462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8462 MEMBER','1','13009') +('8463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8463 MEMBER','1','13010') +('8464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8464 MEMBER','1','13011') +('8465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8465 MEMBER','1','13012') +('8466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8466 MEMBER','1','13013') +('8467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8467 MEMBER','1','13014') +('8468','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8468 MEMBER','1','13015') +('8469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8469 MEMBER','1','13016') +('8470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8470 MEMBER','1','13017') +('8471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8471 MEMBER','1','13018') +('8472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8472 MEMBER','1','13019') +('8473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8473 MEMBER','1','13020') +('8474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8474 MEMBER','1','13021') +('8475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8475 MEMBER','1','13022') +('8476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8476 MEMBER','1','13023') +('8477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8477 MEMBER','1','13024') +('8478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8478 MEMBER','1','13025') +('8479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8479 MEMBER','1','13026') +('8480','1','LASTNAME','FIRSTNAME',999.99,'-12.04','0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8480 MEMBER','1','13027') +('8481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8481 MEMBER','1','13028') +('8482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8482 MEMBER','1','13029') +('8483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8483 MEMBER','1','13030') +('8484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8484 MEMBER','1','13031') +('8485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8485 MEMBER','1','13032') +('8486','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8486 MEMBER','1','13033') +('8487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8487 MEMBER','1','13034') +('8488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8488 MEMBER','1','13035') +('8489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8489 MEMBER','1','13036') +('8490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8490 MEMBER','1','13037') +('8491','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8491 MEMBER','1','13038') +('8492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8492 MEMBER','1','13039') +('8493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8493 MEMBER','1','13040') +('8494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8494 MEMBER','1','13041') +('8495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8495 MEMBER','1','13042') +('8496','1','LASTNAME','FIRSTNAME',999.99,18.99,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8496 MEMBER','1','13043') +('8497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8497 MEMBER','1','13044') +('8498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8498 MEMBER','1','13045') +('8499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8499 MEMBER','1','13046') +('8500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8500 MEMBER','1','13047') +('8501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8501 MEMBER','1','13048') +('8502','1','LASTNAME','FIRSTNAME',999.99,62.26,'10',100.00,'1','1','1','PC','3','1','0',0.00,'999','0','"8502 MEMBER','1','13049') +('8503','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8503 MEMBER','1','13050') +('8504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8504 MEMBER','1','13051') +('8426','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8426 MEMBER','1','13052') +('8506','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8506 MEMBER','1','13053') +('8507','2','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"8507 MEMBER','1','13054') +('8507','3','LASTNAME','FIRSTNAME',999.00,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"8507 MEMBER','1','13055') +('8507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8507 MEMBER','1','13056') +('8509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8509 MEMBER','1','13057') +('8512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8512 MEMBER','1','13058') +('8515','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8515 MEMBER','1','13059') +('8508','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8508 MEMBER','1','13060') +('6815','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6815 MEMBER','1','13061') +('8402','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8402 MEMBER','1','13062') +('8403','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8403 MEMBER','1','13063') +('8410','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8410 MEMBER','1','13064') +('8410','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8410 MEMBER','1','13065') +('8410','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8410 MEMBER','1','13066') +('8405','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8405 MEMBER','1','13067') +('8404','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8404 MEMBER','1','13068') +('8404','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8404 MEMBER','1','13069') +('8407','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8407 MEMBER','1','13070') +('8407','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8407 MEMBER','1','13071') +('8407','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8407 MEMBER','1','13072') +('8408','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8408 MEMBER','1','13073') +('8412','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8412 MEMBER','1','13074') +('8412','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8412 MEMBER','1','13075') +('7664','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7664 MEMBER','1','13076') +('2546','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2546 MEMBER','1','13077') +('2546','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2546 MEMBER','1','13078') +('8417','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8417 MEMBER','1','13079') +('8415','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8415 MEMBER','1','13080') +('8416','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8416 MEMBER','1','13081') +('8414','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8414 MEMBER','1','13082') +('8414','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8414 MEMBER','1','13083') +('8413','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8413 MEMBER','1','13084') +('8413','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8413 MEMBER','1','13085') +('8419','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8419 MEMBER','1','13086') +('8419','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8419 MEMBER','1','13087') +('8418','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8418 MEMBER','1','13088') +('8261','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8261 MEMBER','1','13089') +('8423','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8423 MEMBER','1','13090') +('8423','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8423 MEMBER','1','13091') +('8422','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8422 MEMBER','1','13092') +('8421','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8421 MEMBER','1','13093') +('8421','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8421 MEMBER','1','13094') +('8421','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8421 MEMBER','1','13095') +('8420','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8420 MEMBER','1','13096') +('7387','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"7387 MEMBER','1','13097') +('8424','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8424 MEMBER','1','13098') +('8425','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8425 MEMBER','1','13099') +('8425','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8425 MEMBER','1','13100') +('7162','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7162 MEMBER','1','13101') +('8643','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8643 MEMBER','1','13102') +('3370','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3370 MEMBER','1','13103') +('7153','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7153 MEMBER','1','13104') +('8430','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8430 MEMBER','1','13105') +('3424','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"3424 MEMBER','1','13106') +('8431','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8431 MEMBER','1','13107') +('8431','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8431 MEMBER','1','13108') +('8810','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8810 MEMBER','1','13109') +('8219','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8219 MEMBER','1','13110') +('8432','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8432 MEMBER','1','13111') +('8432','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8432 MEMBER','1','13112') +('8433','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8433 MEMBER','1','13113') +('8433','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8433 MEMBER','1','13114') +('8433','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8433 MEMBER','1','13115') +('8812','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8812 MEMBER','1','13116') +('8813','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8813 MEMBER','1','13117') +('8106','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8106 MEMBER','1','13118') +('8437','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8437 MEMBER','1','13119') +('8435','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8435 MEMBER','1','13120') +('8435','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8435 MEMBER','1','13121') +('8435','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8435 MEMBER','1','13122') +('8438','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8438 MEMBER','1','13123') +('8438','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8438 MEMBER','1','13124') +('8438','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8438 MEMBER','1','13125') +('8439','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8439 MEMBER','1','13126') +('8439','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8439 MEMBER','1','13127') +('8436','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8436 MEMBER','1','13128') +('8817','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8817 MEMBER','1','13129') +('8440','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8440 MEMBER','1','13130') +('8434','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8434 MEMBER','1','13131') +('8434','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8434 MEMBER','1','13132') +('8441','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8441 MEMBER','1','13133') +('8441','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8441 MEMBER','1','13134') +('8441','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8441 MEMBER','1','13135') +('8393','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8393 MEMBER','1','13136') +('8443','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8443 MEMBER','1','13137') +('8443','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8443 MEMBER','1','13138') +('9100','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','0','TERM','0','1','0',0.00,'999','0','"9100 MEMBER','1','13139') +('6002','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6002 MEMBER','1','13140') +('6002','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6002 MEMBER','1','13141') +('8445','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8445 MEMBER','1','13142') +('8445','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8445 MEMBER','1','13143') +('8446','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8446 MEMBER','1','13144') +('8448','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8448 MEMBER','1','13145') +('8448','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8448 MEMBER','1','13146') +('8448','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8448 MEMBER','1','13147') +('8450','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8450 MEMBER','1','13148') +('8450','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8450 MEMBER','1','13149') +('8449','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8449 MEMBER','1','13150') +('8449','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8449 MEMBER','1','13151') +('8449','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8449 MEMBER','1','13152') +('92','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"92 MEMBER','1','13153') +('8104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8104 MEMBER','1','13154') +('8105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8105 MEMBER','1','13155') +('8106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8106 MEMBER','1','13156') +('8107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8107 MEMBER','1','13157') +('8108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8108 MEMBER','1','13158') +('8109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8109 MEMBER','1','13159') +('8110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8110 MEMBER','1','13160') +('8111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8111 MEMBER','1','13161') +('8112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8112 MEMBER','1','13162') +('8113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8113 MEMBER','1','13163') +('8055','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8055 MEMBER','1','13164') +('8057','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8057 MEMBER','1','13165') +('8060','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8060 MEMBER','1','13166') +('10297','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10297 MEMBER','1','13167') +('8061','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8061 MEMBER','1','13168') +('8062','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8062 MEMBER','1','13169') +('8062','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8062 MEMBER','1','13170') +('5601','1','LASTNAME','FIRSTNAME',999.99,51.44,'0',100.00,'1','0','1','REG','0','0','0',0.00,'0','0','"5601 MEMBER','1','13171') +('8063','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8063 MEMBER','1','13172') +('8063','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8063 MEMBER','1','13173') +('8065','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8065 MEMBER','1','13174') +('8065','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8065 MEMBER','1','13175') +('8067','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8067 MEMBER','1','13176') +('8067','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8067 MEMBER','1','13177') +('8067','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8067 MEMBER','1','13178') +('8066','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8066 MEMBER','1','13179') +('8066','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8066 MEMBER','1','13180') +('8066','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8066 MEMBER','1','13181') +('8064','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8064 MEMBER','1','13182') +('8064','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8064 MEMBER','1','13183') +('8064','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8064 MEMBER','1','13184') +('8142','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8142 MEMBER','1','13185') +('8069','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8069 MEMBER','1','13186') +('8587','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8587 MEMBER','1','13187') +('8073','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8073 MEMBER','1','13188') +('8070','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8070 MEMBER','1','13189') +('8076','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8076 MEMBER','1','13190') +('8076','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8076 MEMBER','1','13191') +('8074','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8074 MEMBER','1','13192') +('8074','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8074 MEMBER','1','13193') +('10269','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10269 MEMBER','1','13194') +('9271','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9271 MEMBER','1','13195') +('8079','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8079 MEMBER','1','13196') +('8078','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8078 MEMBER','1','13197') +('8080','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8080 MEMBER','1','13198') +('8082','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8082 MEMBER','1','13199') +('8084','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8084 MEMBER','1','13200') +('8083','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8083 MEMBER','1','13201') +('8083','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8083 MEMBER','1','13202') +('8085','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8085 MEMBER','1','13203') +('6512','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6512 MEMBER','1','13204') +('8094','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8094 MEMBER','1','13205') +('8088','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8088 MEMBER','1','13206') +('8093','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8093 MEMBER','1','13207') +('8091','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8091 MEMBER','1','13208') +('8090','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8090 MEMBER','1','13209') +('8089','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8089 MEMBER','1','13210') +('8095','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8095 MEMBER','1','13211') +('8095','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8095 MEMBER','1','13212') +('8095','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8095 MEMBER','1','13213') +('8096','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8096 MEMBER','1','13214') +('8096','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8096 MEMBER','1','13215') +('8097','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8097 MEMBER','1','13216') +('7880','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7880 MEMBER','1','13217') +('6894','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6894 MEMBER','1','13218') +('8100','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8100 MEMBER','1','13219') +('8100','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'1','"8100 MEMBER','1','13220') +('8099','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8099 MEMBER','1','13221') +('8101','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8101 MEMBER','1','13222') +('8101','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8101 MEMBER','1','13223') +('8101','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','1',NULL,'INACT','0','0','0',NULL,NULL,'0','"8101 MEMBER','1','13224') +('9742','3','LASTNAME','FIRSTNAME',999.99,10.78,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9742 MEMBER','1','15240') +('9742','4','LASTNAME','FIRSTNAME',999.99,10.78,'10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9742 MEMBER','1','15241') +('6956','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6956 MEMBER','1','13225') +('8102','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8102 MEMBER','1','13226') +('8103','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8103 MEMBER','1','13227') +('8103','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8103 MEMBER','1','13228') +('8104','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8104 MEMBER','1','13229') +('8105','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8105 MEMBER','1','13230') +('8105','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8105 MEMBER','1','13231') +('324','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',180.34,'999','0','"324 MEMBER','1','13232') +('8642','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8642 MEMBER','1','13233') +('8108','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8108 MEMBER','1','13234') +('8108','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8108 MEMBER','1','13235') +('8114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8114 MEMBER','1','13237') +('8115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8115 MEMBER','1','13238') +('8116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8116 MEMBER','1','13239') +('8117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8117 MEMBER','1','13240') +('8118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8118 MEMBER','1','13241') +('8119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8119 MEMBER','1','13242') +('8120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8120 MEMBER','1','13243') +('8121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"8121 MEMBER','1','13244') +('8122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8122 MEMBER','1','13245') +('8123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8123 MEMBER','1','13246') +('8124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8124 MEMBER','1','13247') +('8125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8125 MEMBER','1','13248') +('8126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8126 MEMBER','1','13249') +('8127','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8127 MEMBER','1','13250') +('8128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8128 MEMBER','1','13251') +('8129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8129 MEMBER','1','13252') +('8130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8130 MEMBER','1','13253') +('8131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8131 MEMBER','1','13254') +('8132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8132 MEMBER','1','13255') +('8133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8133 MEMBER','1','13256') +('8134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8134 MEMBER','1','13257') +('8135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8135 MEMBER','1','13258') +('8136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8136 MEMBER','1','13259') +('8137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8137 MEMBER','1','13260') +('8138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8138 MEMBER','1','13261') +('8139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8139 MEMBER','1','13262') +('8140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8140 MEMBER','1','13263') +('8141','1','LASTNAME','FIRSTNAME',999.99,1.29,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8141 MEMBER','1','13264') +('8142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8142 MEMBER','1','13265') +('8143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8143 MEMBER','1','13266') +('8144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8144 MEMBER','1','13267') +('8145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8145 MEMBER','1','13268') +('8146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8146 MEMBER','1','13269') +('8147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8147 MEMBER','1','13270') +('8148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8148 MEMBER','1','13271') +('8149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8149 MEMBER','1','13272') +('8150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8150 MEMBER','1','13273') +('8151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8151 MEMBER','1','13274') +('8152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8152 MEMBER','1','13275') +('8153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8153 MEMBER','1','13276') +('8110','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8110 MEMBER','1','13277') +('7427','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7427 MEMBER','1','13278') +('2584','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2584 MEMBER','1','13279') +('8139','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8139 MEMBER','1','13280') +('468','2','LASTNAME','FIRSTNAME',NULL,7.45,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"468 MEMBER','1','13281') +('8171','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8171 MEMBER','1','13282') +('8173','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8173 MEMBER','1','13283') +('8174','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8174 MEMBER','1','13284') +('8174','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8174 MEMBER','1','13285') +('8175','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8175 MEMBER','1','13286') +('8178','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8178 MEMBER','1','13287') +('8180','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8180 MEMBER','1','13288') +('8180','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8180 MEMBER','1','13289') +('8180','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8180 MEMBER','1','13290') +('8189','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8189 MEMBER','1','13291') +('8191','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8191 MEMBER','1','13292') +('8191','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8191 MEMBER','1','13293') +('8191','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8191 MEMBER','1','13294') +('8710','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8710 MEMBER','1','13297') +('9156','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9156 MEMBER','1','13298') +('8632','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8632 MEMBER','1','13299') +('8632','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8632 MEMBER','1','13300') +('8633','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8633 MEMBER','1','13301') +('8634','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8634 MEMBER','1','13302') +('8635','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8635 MEMBER','1','13303') +('8635','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8635 MEMBER','1','13304') +('8637','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8637 MEMBER','1','13305') +('4829','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4829 MEMBER','1','13306') +('420','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"420 MEMBER','1','13307') +('9279','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9279 MEMBER','1','13308') +('2820','2','LASTNAME','FIRSTNAME',NULL,19.47,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2820 MEMBER','1','13309') +('7076','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7076 MEMBER','1','13310') +('8638','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8638 MEMBER','1','13311') +('8638','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8638 MEMBER','1','13312') +('8638','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8638 MEMBER','1','13313') +('8641','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8641 MEMBER','1','13314') +('2953','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',323.42,'999','0','"2953 MEMBER','1','13315') +('8643','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8643 MEMBER','1','13316') +('8644','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8644 MEMBER','1','13317') +('8645','2','LASTNAME','FIRSTNAME',NULL,'-0.12','10',20.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"8645 MEMBER','1','13318') +('8647','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8647 MEMBER','1','13319') +('8647','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8647 MEMBER','1','13320') +('8647','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8647 MEMBER','1','13321') +('8648','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8648 MEMBER','1','13322') +('5324','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5324 MEMBER','1','13323') +('8666','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8666 MEMBER','1','13324') +('8667','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8667 MEMBER','1','13325') +('8668','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8668 MEMBER','1','13326') +('8669','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8669 MEMBER','1','13327') +('8671','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8671 MEMBER','1','13328') +('8673','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8673 MEMBER','1','13329') +('8675','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8675 MEMBER','1','13330') +('8676','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8676 MEMBER','1','13331') +('8678','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8678 MEMBER','1','13332') +('8679','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8679 MEMBER','1','13333') +('8681','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8681 MEMBER','1','13334') +('8683','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8683 MEMBER','1','13335') +('8685','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8685 MEMBER','1','13336') +('8686','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8686 MEMBER','1','13337') +('8687','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8687 MEMBER','1','13338') +('8688','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8688 MEMBER','1','13339') +('8690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8690 MEMBER','1','13340') +('8691','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8691 MEMBER','1','13341') +('8693','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8693 MEMBER','1','13342') +('8694','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8694 MEMBER','1','13343') +('8696','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8696 MEMBER','1','13344') +('8697','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8697 MEMBER','1','13345') +('8699','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8699 MEMBER','1','13346') +('8702','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8702 MEMBER','1','13347') +('8703','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8703 MEMBER','1','13348') +('8704','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8704 MEMBER','1','13349') +('8705','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8705 MEMBER','1','13350') +('8649','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8649 MEMBER','1','13351') +('8652','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8652 MEMBER','1','13352') +('8654','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8654 MEMBER','1','13353') +('8655','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8655 MEMBER','1','13354') +('8656','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8656 MEMBER','1','13355') +('2992','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2992 MEMBER','1','13356') +('2992','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"2992 MEMBER','1','13357') +('8658','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8658 MEMBER','1','13358') +('8659','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8659 MEMBER','1','13359') +('8659','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8659 MEMBER','1','13360') +('8660','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8660 MEMBER','1','13361') +('8663','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8663 MEMBER','1','13362') +('8667','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8667 MEMBER','1','13363') +('8670','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8670 MEMBER','1','13364') +('9516','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9516 MEMBER','1','13365') +('8340','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8340 MEMBER','1','13366') +('8338','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8338 MEMBER','1','13367') +('8342','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8342 MEMBER','1','13368') +('8342','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8342 MEMBER','1','13369') +('8342','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8342 MEMBER','1','13370') +('8354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8354 MEMBER','1','13371') +('8355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8355 MEMBER','1','13372') +('8356','1','LASTNAME','FIRSTNAME',999.99,18.11,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8356 MEMBER','1','13373') +('8357','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8357 MEMBER','1','13374') +('8358','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8358 MEMBER','1','13375') +('8359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8359 MEMBER','1','13376') +('8360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8360 MEMBER','1','13377') +('8361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8361 MEMBER','1','13378') +('8362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8362 MEMBER','1','13379') +('8363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8363 MEMBER','1','13380') +('8364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8364 MEMBER','1','13381') +('8365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8365 MEMBER','1','13382') +('8366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8366 MEMBER','1','13383') +('8367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8367 MEMBER','1','13384') +('8368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8368 MEMBER','1','13385') +('8369','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8369 MEMBER','1','13386') +('8370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8370 MEMBER','1','13387') +('8371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8371 MEMBER','1','13388') +('8372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8372 MEMBER','1','13389') +('8373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8373 MEMBER','1','13390') +('8374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8374 MEMBER','1','13391') +('8375','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8375 MEMBER','1','13392') +('8376','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8376 MEMBER','1','13393') +('8377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8377 MEMBER','1','13394') +('8378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8378 MEMBER','1','13395') +('8379','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8379 MEMBER','1','13396') +('8380','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8380 MEMBER','1','13397') +('8381','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8381 MEMBER','1','13398') +('8382','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8382 MEMBER','1','13399') +('8383','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8383 MEMBER','1','13400') +('8384','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8384 MEMBER','1','13401') +('8385','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8385 MEMBER','1','13402') +('8386','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8386 MEMBER','1','13403') +('8387','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8387 MEMBER','1','13404') +('8388','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8388 MEMBER','1','13405') +('8389','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8389 MEMBER','1','13406') +('8390','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8390 MEMBER','1','13407') +('8391','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8391 MEMBER','1','13408') +('8392','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8392 MEMBER','1','13409') +('8393','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8393 MEMBER','1','13410') +('8337','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8337 MEMBER','1','13411') +('8337','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8337 MEMBER','1','13412') +('8337','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8337 MEMBER','1','13413') +('8336','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8336 MEMBER','1','13414') +('239','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"239 MEMBER','1','13415') +('8343','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8343 MEMBER','1','13416') +('8510','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8510 MEMBER','1','13417') +('6925','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"6925 MEMBER','1','13418') +('6925','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','1',NULL,'PC','1','0','0',NULL,NULL,'0','"6925 MEMBER','1','13419') +('9690','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9690 MEMBER','1','13420') +('9697','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9697 MEMBER','1','13421') +('9698','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9698 MEMBER','1','13422') +('5175','3','LASTNAME','FIRSTNAME',NULL,0.00,'10',50.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5175 MEMBER','1','13423') +('8346','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8346 MEMBER','1','13424') +('8345','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8345 MEMBER','1','13425') +('8345','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8345 MEMBER','1','13426') +('420','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"420 MEMBER','1','13427') +('4874','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4874 MEMBER','1','13428') +('8350','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8350 MEMBER','1','13429') +('8348','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8348 MEMBER','1','13430') +('8348','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8348 MEMBER','1','13431') +('8348','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8348 MEMBER','1','13432') +('8349','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8349 MEMBER','1','13433') +('8876','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8876 MEMBER','1','13434') +('8876','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8876 MEMBER','1','13435') +('8352','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8352 MEMBER','1','13436') +('8353','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8353 MEMBER','1','13437') +('5408','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,NULL,'"5408 MEMBER','1','13438') +('6586','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6586 MEMBER','1','13439') +('8354','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8354 MEMBER','1','13440') +('8358','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8358 MEMBER','1','13442') +('8358','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8358 MEMBER','1','13443') +('2668','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2668 MEMBER','1','13444') +('8359','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8359 MEMBER','1','13445') +('8360','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8360 MEMBER','1','13446') +('8360','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8360 MEMBER','1','13447') +('8362','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8362 MEMBER','1','13448') +('7139','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"7139 MEMBER','1','13449') +('8364','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8364 MEMBER','1','13450') +('8366','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8366 MEMBER','1','13451') +('8368','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8368 MEMBER','1','13452') +('8363','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8363 MEMBER','1','13453') +('8365','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8365 MEMBER','1','13454') +('8371','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8371 MEMBER','1','13455') +('8369','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8369 MEMBER','1','13456') +('8370','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8370 MEMBER','1','13457') +('8372','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8372 MEMBER','1','13458') +('8372','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8372 MEMBER','1','13459') +('8373','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8373 MEMBER','1','13460') +('8373','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8373 MEMBER','1','13461') +('8376','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8376 MEMBER','1','13462') +('8375','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8375 MEMBER','1','13463') +('8375','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8375 MEMBER','1','13464') +('8375','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8375 MEMBER','1','13465') +('8377','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8377 MEMBER','1','13466') +('8377','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8377 MEMBER','1','13467') +('8377','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8377 MEMBER','1','13468') +('8394','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8394 MEMBER','1','13469') +('8395','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8395 MEMBER','1','13470') +('8396','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8396 MEMBER','1','13471') +('8397','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8397 MEMBER','1','13472') +('8398','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8398 MEMBER','1','13473') +('8399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8399 MEMBER','1','13474') +('8400','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8400 MEMBER','1','13475') +('8401','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8401 MEMBER','1','13476') +('8402','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8402 MEMBER','1','13477') +('8403','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8403 MEMBER','1','13478') +('8404','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8404 MEMBER','1','13479') +('8405','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8405 MEMBER','1','13480') +('8406','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8406 MEMBER','1','13481') +('8407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8407 MEMBER','1','13482') +('8408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8408 MEMBER','1','13483') +('8409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8409 MEMBER','1','13484') +('8410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8410 MEMBER','1','13485') +('8411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8411 MEMBER','1','13486') +('8412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8412 MEMBER','1','13487') +('8413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8413 MEMBER','1','13488') +('8414','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8414 MEMBER','1','13489') +('8415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8415 MEMBER','1','13490') +('8416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8416 MEMBER','1','13491') +('8417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8417 MEMBER','1','13492') +('8418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8418 MEMBER','1','13493') +('8419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8419 MEMBER','1','13494') +('8420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8420 MEMBER','1','13495') +('8421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8421 MEMBER','1','13496') +('8422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8422 MEMBER','1','13497') +('8423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8423 MEMBER','1','13498') +('8424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8424 MEMBER','1','13499') +('8425','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8425 MEMBER','1','13500') +('8426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8426 MEMBER','1','13501') +('8427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8427 MEMBER','1','13502') +('8428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8428 MEMBER','1','13503') +('8429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8429 MEMBER','1','13504') +('8430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8430 MEMBER','1','13505') +('8431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8431 MEMBER','1','13506') +('8549','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8549 MEMBER','1','13507') +('8548','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8548 MEMBER','1','13508') +('8547','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8547 MEMBER','1','13509') +('4953','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4953 MEMBER','1','13510') +('8552','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8552 MEMBER','1','13511') +('8552','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8552 MEMBER','1','13512') +('2709','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',731.62,'999','0','"2709 MEMBER','1','13513') +('8537','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8537 MEMBER','1','13514') +('8551','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8551 MEMBER','1','13515') +('8551','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8551 MEMBER','1','13516') +('8550','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8550 MEMBER','1','13517') +('8550','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8550 MEMBER','1','13518') +('8561','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8561 MEMBER','1','13519') +('8554','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8554 MEMBER','1','13520') +('8554','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8554 MEMBER','1','13521') +('8554','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8554 MEMBER','1','13522') +('8555','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8555 MEMBER','1','13523') +('8555','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8555 MEMBER','1','13524') +('8555','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8555 MEMBER','1','13525') +('7076','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7076 MEMBER','1','13526') +('8564','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8564 MEMBER','1','13527') +('8706','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8706 MEMBER','1','13528') +('8565','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8565 MEMBER','1','13529') +('8565','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8565 MEMBER','1','13530') +('8565','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8565 MEMBER','1','13531') +('8563','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8563 MEMBER','1','13532') +('8563','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8563 MEMBER','1','13533') +('8562','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8562 MEMBER','1','13534') +('8562','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8562 MEMBER','1','13535') +('8562','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8562 MEMBER','1','13536') +('8560','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8560 MEMBER','1','13537') +('8560','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8560 MEMBER','1','13538') +('8559','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8559 MEMBER','1','13539') +('8558','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8558 MEMBER','1','13540') +('8557','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8557 MEMBER','1','13541') +('8557','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8557 MEMBER','1','13542') +('8557','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8557 MEMBER','1','13543') +('8586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8586 MEMBER','1','13544') +('8587','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8587 MEMBER','1','13545') +('8588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8588 MEMBER','1','13546') +('8589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8589 MEMBER','1','13547') +('8590','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8590 MEMBER','1','13548') +('8591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8591 MEMBER','1','13549') +('8592','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8592 MEMBER','1','13550') +('8593','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8593 MEMBER','1','13551') +('8594','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8594 MEMBER','1','13552') +('8595','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8595 MEMBER','1','13553') +('8596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8596 MEMBER','1','13554') +('8597','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8597 MEMBER','1','13555') +('8598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8598 MEMBER','1','13556') +('8599','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8599 MEMBER','1','13557') +('8600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8600 MEMBER','1','13558') +('8601','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8601 MEMBER','1','13559') +('8602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8602 MEMBER','1','13560') +('8603','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8603 MEMBER','1','13561') +('8604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8604 MEMBER','1','13562') +('8605','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8605 MEMBER','1','13563') +('8606','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8606 MEMBER','1','13564') +('8607','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8607 MEMBER','1','13565') +('8608','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8608 MEMBER','1','13566') +('8609','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8609 MEMBER','1','13567') +('8610','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8610 MEMBER','1','13568') +('8611','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8611 MEMBER','1','13569') +('8612','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8612 MEMBER','1','13570') +('8613','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8613 MEMBER','1','13571') +('8614','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8614 MEMBER','1','13572') +('8615','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8615 MEMBER','1','13573') +('8616','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8616 MEMBER','1','13574') +('8617','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8617 MEMBER','1','13575') +('8618','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8618 MEMBER','1','13576') +('8619','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8619 MEMBER','1','13577') +('8620','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8620 MEMBER','1','13578') +('8621','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8621 MEMBER','1','13579') +('8622','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8622 MEMBER','1','13580') +('8623','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8623 MEMBER','1','13581') +('8624','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8624 MEMBER','1','13582') +('8625','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8625 MEMBER','1','13583') +('8878','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8878 MEMBER','1','13584') +('8566','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8566 MEMBER','1','13585') +('8608','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8608 MEMBER','1','13586') +('8567','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8567 MEMBER','1','13587') +('8567','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8567 MEMBER','1','13588') +('8567','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8567 MEMBER','1','13589') +('7687','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7687 MEMBER','1','13590') +('1433','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1433 MEMBER','1','13591') +('8569','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8569 MEMBER','1','13592') +('8710','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8710 MEMBER','1','13593') +('6677','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6677 MEMBER','1','13594') +('8712','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8712 MEMBER','1','13596') +('9120','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9120 MEMBER','1','13597') +('8840','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8840 MEMBER','1','13598') +('8573','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8573 MEMBER','1','13599') +('8573','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8573 MEMBER','1','13600') +('8573','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8573 MEMBER','1','13601') +('8571','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8571 MEMBER','1','13602') +('8571','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8571 MEMBER','1','13603') +('6030','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6030 MEMBER','1','13604') +('6030','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6030 MEMBER','1','13605') +('6030','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6030 MEMBER','1','13606') +('8577','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8577 MEMBER','1','13607') +('8578','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8578 MEMBER','1','13608') +('8579','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8579 MEMBER','1','13609') +('8485','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8485 MEMBER','1','13610') +('8580','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8580 MEMBER','1','13611') +('8580','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8580 MEMBER','1','13612') +('8580','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8580 MEMBER','1','13613') +('8582','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8582 MEMBER','1','13614') +('8582','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8582 MEMBER','1','13615') +('8582','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8582 MEMBER','1','13616') +('8593','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8593 MEMBER','1','13617') +('8583','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8583 MEMBER','1','13618') +('8583','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8583 MEMBER','1','13619') +('8583','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8583 MEMBER','1','13620') +('8584','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8584 MEMBER','1','13621') +('8584','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8584 MEMBER','1','13622') +('8585','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8585 MEMBER','1','13623') +('8585','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8585 MEMBER','1','13624') +('8585','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8585 MEMBER','1','13625') +('8591','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8591 MEMBER','1','13626') +('7620','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"7620 MEMBER','1','13627') +('8595','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8595 MEMBER','1','13628') +('8595','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8595 MEMBER','1','13629') +('8595','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8595 MEMBER','1','13630') +('8594','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8594 MEMBER','1','13631') +('8586','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8586 MEMBER','1','13632') +('9378','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9378 MEMBER','1','13633') +('6846','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6846 MEMBER','1','13634') +('7864','2','LASTNAME','FIRSTNAME',NULL,50.00,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"7864 MEMBER','1','13635') +('4507','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4507 MEMBER','1','13636') +('8588','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8588 MEMBER','1','13637') +('8587','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8587 MEMBER','1','13638') +('8589','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8589 MEMBER','1','13639') +('8590','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8590 MEMBER','1','13640') +('8616','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8616 MEMBER','1','13641') +('8616','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8616 MEMBER','1','13642') +('5037','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',100.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5037 MEMBER','1','13643') +('8626','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8626 MEMBER','1','13644') +('8627','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8627 MEMBER','1','13645') +('8628','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8628 MEMBER','1','13646') +('8629','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8629 MEMBER','1','13647') +('8630','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8630 MEMBER','1','13648') +('8631','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8631 MEMBER','1','13649') +('8632','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8632 MEMBER','1','13650') +('8633','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8633 MEMBER','1','13651') +('8634','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8634 MEMBER','1','13652') +('8635','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8635 MEMBER','1','13653') +('8636','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8636 MEMBER','1','13654') +('8637','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8637 MEMBER','1','13655') +('8638','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8638 MEMBER','1','13656') +('8639','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8639 MEMBER','1','13657') +('8640','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8640 MEMBER','1','13658') +('8641','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8641 MEMBER','1','13659') +('8642','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8642 MEMBER','1','13660') +('8643','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8643 MEMBER','1','13661') +('8644','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8644 MEMBER','1','13662') +('8645','1','LASTNAME','FIRSTNAME',999.99,'-0.12','10',20.00,'1','1','1','PC','3','1','0',0.00,'999','0','"8645 MEMBER','1','13663') +('8646','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8646 MEMBER','1','13664') +('8647','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8647 MEMBER','1','13665') +('8648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8648 MEMBER','1','13666') +('8649','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8649 MEMBER','1','13667') +('8650','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8650 MEMBER','1','13668') +('8657','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8657 MEMBER','1','13669') +('8658','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8658 MEMBER','1','13670') +('8659','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8659 MEMBER','1','13671') +('8660','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8660 MEMBER','1','13672') +('8661','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8661 MEMBER','1','13673') +('8662','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8662 MEMBER','1','13674') +('8664','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8664 MEMBER','1','13675') +('8665','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8665 MEMBER','1','13676') +('4243','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4243 MEMBER','1','13677') +('9560','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9560 MEMBER','1','13678') +('8670','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8670 MEMBER','1','13679') +('8672','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8672 MEMBER','1','13680') +('8677','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8677 MEMBER','1','13681') +('8680','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8680 MEMBER','1','13682') +('8698','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8698 MEMBER','1','13683') +('8661','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8661 MEMBER','1','13684') +('8662','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8662 MEMBER','1','13685') +('8663','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8663 MEMBER','1','13686') +('8663','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8663 MEMBER','1','13687') +('8664','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8664 MEMBER','1','13688') +('8667','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8667 MEMBER','1','13689') +('8667','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8667 MEMBER','1','13690') +('8668','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8668 MEMBER','1','13691') +('8668','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8668 MEMBER','1','13692') +('8670','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8670 MEMBER','1','13693') +('8673','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8673 MEMBER','1','13694') +('6006','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6006 MEMBER','1','13695') +('6006','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6006 MEMBER','1','13696') +('8675','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8675 MEMBER','1','13697') +('8675','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8675 MEMBER','1','13698') +('8713','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8713 MEMBER','1','13699') +('8714','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8714 MEMBER','1','13700') +('8716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8716 MEMBER','1','13701') +('8720','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8720 MEMBER','1','13702') +('8721','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8721 MEMBER','1','13703') +('8723','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8723 MEMBER','1','13704') +('8724','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8724 MEMBER','1','13705') +('8725','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8725 MEMBER','1','13706') +('8730','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8730 MEMBER','1','13707') +('8731','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8731 MEMBER','1','13708') +('8734','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8734 MEMBER','1','13709') +('8736','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8736 MEMBER','1','13710') +('8738','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8738 MEMBER','1','13711') +('8739','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8739 MEMBER','1','13712') +('8740','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8740 MEMBER','1','13713') +('8742','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8742 MEMBER','1','13714') +('8743','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8743 MEMBER','1','13715') +('8745','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8745 MEMBER','1','13716') +('8651','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8651 MEMBER','1','13717') +('8652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8652 MEMBER','1','13718') +('8653','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8653 MEMBER','1','13719') +('8654','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','PC','1','0','0',0.00,'999','1','"8654 MEMBER','1','13720') +('8655','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8655 MEMBER','1','13721') +('8656','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8656 MEMBER','1','13722') +('8663','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8663 MEMBER','1','13723') +('8674','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8674 MEMBER','1','13724') +('8682','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8682 MEMBER','1','13725') +('8684','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8684 MEMBER','1','13726') +('8689','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8689 MEMBER','1','13727') +('8692','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8692 MEMBER','1','13728') +('8695','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8695 MEMBER','1','13729') +('8700','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8700 MEMBER','1','13730') +('8701','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8701 MEMBER','1','13731') +('8650','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8650 MEMBER','1','13732') +('8652','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8652 MEMBER','1','13733') +('8655','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8655 MEMBER','1','13734') +('8658','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8658 MEMBER','1','13735') +('8665','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8665 MEMBER','1','13736') +('8668','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8668 MEMBER','1','13737') +('8674','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8674 MEMBER','1','13738') +('6006','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6006 MEMBER','1','13739') +('8711','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8711 MEMBER','1','13740') +('8715','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8715 MEMBER','1','13741') +('8717','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8717 MEMBER','1','13742') +('8718','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8718 MEMBER','1','13743') +('8719','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8719 MEMBER','1','13744') +('8722','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8722 MEMBER','1','13745') +('8726','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8726 MEMBER','1','13746') +('8727','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8727 MEMBER','1','13747') +('8728','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8728 MEMBER','1','13748') +('8729','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8729 MEMBER','1','13749') +('8732','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8732 MEMBER','1','13750') +('8733','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8733 MEMBER','1','13751') +('8735','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8735 MEMBER','1','13752') +('8737','1','LASTNAME','FIRSTNAME',999.99,19.99,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8737 MEMBER','1','13753') +('8741','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8741 MEMBER','1','13754') +('8744','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8744 MEMBER','1','13755') +('7212','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7212 MEMBER','1','13756') +('8677','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8677 MEMBER','1','13757') +('8678','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8678 MEMBER','1','13758') +('8681','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8681 MEMBER','1','13759') +('8681','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8681 MEMBER','1','13760') +('8683','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8683 MEMBER','1','13761') +('8684','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8684 MEMBER','1','13762') +('8684','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8684 MEMBER','1','13763') +('8685','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8685 MEMBER','1','13764') +('8686','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8686 MEMBER','1','13765') +('8687','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8687 MEMBER','1','13766') +('8687','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8687 MEMBER','1','13767') +('8687','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8687 MEMBER','1','13768') +('8688','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8688 MEMBER','1','13769') +('8688','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8688 MEMBER','1','13770') +('8689','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8689 MEMBER','1','13771') +('8689','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8689 MEMBER','1','13772') +('8690','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8690 MEMBER','1','13773') +('8692','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8692 MEMBER','1','13774') +('8693','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8693 MEMBER','1','13775') +('8696','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8696 MEMBER','1','13776') +('8696','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8696 MEMBER','1','13777') +('8696','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8696 MEMBER','1','13778') +('8697','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8697 MEMBER','1','13779') +('8679','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8679 MEMBER','1','13780') +('8679','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8679 MEMBER','1','13781') +('8700','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8700 MEMBER','1','13782') +('8705','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8705 MEMBER','1','13783') +('8707','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8707 MEMBER','1','13784') +('8708','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8708 MEMBER','1','13785') +('8709','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8709 MEMBER','1','13786') +('8711','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8711 MEMBER','1','13787') +('8711','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8711 MEMBER','1','13788') +('8712','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8712 MEMBER','1','13789') +('8713','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8713 MEMBER','1','13790') +('8713','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8713 MEMBER','1','13791') +('8713','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8713 MEMBER','1','13792') +('8714','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8714 MEMBER','1','13793') +('8714','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8714 MEMBER','1','13794') +('8715','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8715 MEMBER','1','13795') +('8715','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8715 MEMBER','1','13796') +('8716','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8716 MEMBER','1','13797') +('8718','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8718 MEMBER','1','13798') +('8718','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8718 MEMBER','1','13799') +('8718','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8718 MEMBER','1','13800') +('8719','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8719 MEMBER','1','13801') +('8720','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8720 MEMBER','1','13802') +('9487','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9487 MEMBER','1','13803') +('8732','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8732 MEMBER','1','13804') +('8732','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8732 MEMBER','1','13805') +('8723','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8723 MEMBER','1','13806') +('958','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"958 MEMBER','1','13807') +('4650','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"4650 MEMBER','1','13808') +('8747','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8747 MEMBER','1','13809') +('8748','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8748 MEMBER','1','13810') +('8749','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8749 MEMBER','1','13811') +('8750','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8750 MEMBER','1','13812') +('8751','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8751 MEMBER','1','13813') +('8752','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8752 MEMBER','1','13814') +('8753','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8753 MEMBER','1','13815') +('8754','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8754 MEMBER','1','13816') +('8755','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8755 MEMBER','1','13817') +('8756','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8756 MEMBER','1','13818') +('8757','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8757 MEMBER','1','13819') +('8758','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8758 MEMBER','1','13820') +('8759','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8759 MEMBER','1','13821') +('8760','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8760 MEMBER','1','13822') +('8761','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8761 MEMBER','1','13823') +('8762','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8762 MEMBER','1','13824') +('8763','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8763 MEMBER','1','13825') +('8764','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8764 MEMBER','1','13826') +('8765','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8765 MEMBER','1','13827') +('8766','1','LASTNAME','FIRSTNAME',999.99,19.99,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8766 MEMBER','1','13828') +('8767','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8767 MEMBER','1','13829') +('8768','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8768 MEMBER','1','13830') +('8769','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8769 MEMBER','1','13831') +('8770','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8770 MEMBER','1','13832') +('8771','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8771 MEMBER','1','13833') +('8772','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8772 MEMBER','1','13834') +('8773','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8773 MEMBER','1','13835') +('8774','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8774 MEMBER','1','13836') +('8775','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8775 MEMBER','1','13837') +('8776','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8776 MEMBER','1','13838') +('8777','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8777 MEMBER','1','13839') +('8778','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8778 MEMBER','1','13840') +('8779','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8779 MEMBER','1','13841') +('8780','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8780 MEMBER','1','13842') +('8781','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8781 MEMBER','1','13843') +('8782','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8782 MEMBER','1','13844') +('8783','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8783 MEMBER','1','13845') +('8784','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8784 MEMBER','1','13846') +('8785','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8785 MEMBER','1','13847') +('8727','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8727 MEMBER','1','13848') +('8728','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8728 MEMBER','1','13849') +('8729','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8729 MEMBER','1','13850') +('8729','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8729 MEMBER','1','13851') +('8730','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8730 MEMBER','1','13852') +('8731','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8731 MEMBER','1','13853') +('8731','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8731 MEMBER','1','13854') +('9165','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9165 MEMBER','1','13855') +('5329','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5329 MEMBER','1','13856') +('8733','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8733 MEMBER','1','13857') +('5050','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5050 MEMBER','1','13858') +('5050','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5050 MEMBER','1','13859') +('8734','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8734 MEMBER','1','13860') +('8734','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8734 MEMBER','1','13861') +('8735','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8735 MEMBER','1','13862') +('8736','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8736 MEMBER','1','13863') +('8737','2','LASTNAME','FIRSTNAME',NULL,19.99,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8737 MEMBER','1','13864') +('8737','3','LASTNAME','FIRSTNAME',NULL,19.99,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8737 MEMBER','1','13865') +('8738','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8738 MEMBER','1','13866') +('8740','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8740 MEMBER','1','13867') +('8740','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8740 MEMBER','1','13868') +('5331','2','LASTNAME','FIRSTNAME',NULL,15.84,'10',100.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5331 MEMBER','1','13869') +('10081','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10081 MEMBER','1','13870') +('5326','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5326 MEMBER','1','13871') +('5327','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5327 MEMBER','1','13872') +('8741','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8741 MEMBER','1','13873') +('8742','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8742 MEMBER','1','13874') +('8743','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8743 MEMBER','1','13875') +('8743','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8743 MEMBER','1','13876') +('8743','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8743 MEMBER','1','13877') +('8744','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8744 MEMBER','1','13878') +('8479','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8479 MEMBER','1','13879') +('8745','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8745 MEMBER','1','13880') +('8745','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8745 MEMBER','1','13881') +('8746','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8746 MEMBER','1','13882') +('8746','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8746 MEMBER','1','13883') +('8748','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8748 MEMBER','1','13884') +('8749','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8749 MEMBER','1','13885') +('8750','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8750 MEMBER','1','13886') +('9569','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9569 MEMBER','1','13887') +('6001','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6001 MEMBER','1','13888') +('6001','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6001 MEMBER','1','13889') +('8759','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8759 MEMBER','1','13890') +('187','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"187 MEMBER','1','13891') +('187','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"187 MEMBER','1','13892') +('8752','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8752 MEMBER','1','13893') +('8752','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8752 MEMBER','1','13894') +('8753','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8753 MEMBER','1','13895') +('8753','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8753 MEMBER','1','13896') +('8754','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8754 MEMBER','1','13897') +('8756','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8756 MEMBER','1','13898') +('8676','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8676 MEMBER','1','13899') +('8757','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8757 MEMBER','1','13900') +('8757','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8757 MEMBER','1','13901') +('8759','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8759 MEMBER','1','13902') +('8761','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8761 MEMBER','1','13903') +('8761','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8761 MEMBER','1','13904') +('8760','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8760 MEMBER','1','13905') +('10223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10223 MEMBER','1','13906') +('10225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10225 MEMBER','1','13907') +('8762','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8762 MEMBER','1','13908') +('8754','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8754 MEMBER','1','13909') +('8764','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8764 MEMBER','1','13910') +('8764','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8764 MEMBER','1','13911') +('8765','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8765 MEMBER','1','13912') +('8765','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8765 MEMBER','1','13913') +('8765','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8765 MEMBER','1','13914') +('8766','2','LASTNAME','FIRSTNAME',NULL,19.99,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8766 MEMBER','1','13915') +('8786','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8786 MEMBER','1','13916') +('8787','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8787 MEMBER','1','13917') +('8788','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8788 MEMBER','1','13918') +('8789','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8789 MEMBER','1','13919') +('8790','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8790 MEMBER','1','13920') +('8791','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8791 MEMBER','1','13921') +('8792','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8792 MEMBER','1','13922') +('8793','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8793 MEMBER','1','13923') +('8794','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8794 MEMBER','1','13924') +('8795','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8795 MEMBER','1','13925') +('8796','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8796 MEMBER','1','13926') +('8797','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8797 MEMBER','1','13927') +('8798','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8798 MEMBER','1','13928') +('8799','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8799 MEMBER','1','13929') +('8800','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8800 MEMBER','1','13930') +('8801','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8801 MEMBER','1','13931') +('8802','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8802 MEMBER','1','13932') +('8803','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8803 MEMBER','1','13933') +('8804','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8804 MEMBER','1','13934') +('8805','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"8805 MEMBER','1','13935') +('8806','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8806 MEMBER','1','13936') +('8807','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8807 MEMBER','1','13937') +('8808','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8808 MEMBER','1','13938') +('8809','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8809 MEMBER','1','13939') +('8810','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8810 MEMBER','1','13940') +('8811','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8811 MEMBER','1','13941') +('8812','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8812 MEMBER','1','13942') +('8813','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8813 MEMBER','1','13943') +('8814','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8814 MEMBER','1','13944') +('8815','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8815 MEMBER','1','13945') +('8816','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8816 MEMBER','1','13946') +('8817','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8817 MEMBER','1','13947') +('8818','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8818 MEMBER','1','13948') +('8819','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8819 MEMBER','1','13949') +('8820','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8820 MEMBER','1','13950') +('8821','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8821 MEMBER','1','13951') +('8822','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8822 MEMBER','1','13952') +('8823','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8823 MEMBER','1','13953') +('8824','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8824 MEMBER','1','13954') +('8825','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8825 MEMBER','1','13955') +('8048','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8048 MEMBER','1','13956') +('8768','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8768 MEMBER','1','13957') +('8768','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8768 MEMBER','1','13958') +('8768','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8768 MEMBER','1','13959') +('8769','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8769 MEMBER','1','13960') +('8771','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8771 MEMBER','1','13961') +('8772','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8772 MEMBER','1','13962') +('8772','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8772 MEMBER','1','13963') +('8773','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8773 MEMBER','1','13964') +('8774','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8774 MEMBER','1','13965') +('6025','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6025 MEMBER','1','13966') +('6025','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6025 MEMBER','1','13967') +('6025','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',200.00,'1','0',NULL,'REG','2','0','0',NULL,NULL,'0','"6025 MEMBER','1','13968') +('6032','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"6032 MEMBER','1','13969') +('6034','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"6034 MEMBER','1','13970') +('6035','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',200.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6035 MEMBER','1','13971') +('6036','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',500.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6036 MEMBER','1','13972') +('6038','1','LASTNAME','FIRSTNAME',999.99,4.65,'0',150.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6038 MEMBER','1','13973') +('6039','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',50.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6039 MEMBER','1','13974') +('6040','1','LASTNAME','FIRSTNAME',999.99,82.50,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6040 MEMBER','1','13975') +('6041','1','LASTNAME','FIRSTNAME',999.99,10.00,'0',20.00,'1','1','1','REG','2','0','0',0.00,'999','0','"6041 MEMBER','1','13976') +('5319','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5319 MEMBER','1','13977') +('5320','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5320 MEMBER','1','13978') +('5321','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5321 MEMBER','1','13979') +('5322','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5322 MEMBER','1','13980') +('5323','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5323 MEMBER','1','13981') +('5324','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5324 MEMBER','1','13982') +('5325','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5325 MEMBER','1','13983') +('5326','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5326 MEMBER','1','13984') +('5327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5327 MEMBER','1','13985') +('5328','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5328 MEMBER','1','13986') +('5329','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5329 MEMBER','1','13987') +('5330','1','LASTNAME','FIRSTNAME',999.99,12.08,'10',20.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5330 MEMBER','1','13988') +('5331','1','LASTNAME','FIRSTNAME',999.99,15.84,'10',100.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5331 MEMBER','1','13989') +('5332','1','LASTNAME','FIRSTNAME',999.99,13.48,'10',75.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5332 MEMBER','1','13990') +('5333','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5333 MEMBER','1','13991') +('5334','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5334 MEMBER','1','13992') +('5335','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5335 MEMBER','1','13993') +('5336','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5336 MEMBER','1','13994') +('5337','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5337 MEMBER','1','13995') +('5338','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5338 MEMBER','1','13996') +('8419','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8419 MEMBER','1','13997') +('8519','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8519 MEMBER','1','13998') +('8518','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8518 MEMBER','1','13999') +('8520','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8520 MEMBER','1','14000') +('2062','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2062 MEMBER','1','14001') +('8522','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8522 MEMBER','1','14002') +('4510','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4510 MEMBER','1','14003') +('7664','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7664 MEMBER','1','14004') +('5339','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5339 MEMBER','1','14005') +('5340','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5340 MEMBER','1','14006') +('5341','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5341 MEMBER','1','14007') +('5342','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5342 MEMBER','1','14008') +('5343','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5343 MEMBER','1','14009') +('5344','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5344 MEMBER','1','14010') +('5345','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5345 MEMBER','1','14011') +('5346','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5346 MEMBER','1','14012') +('5347','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5347 MEMBER','1','14013') +('5348','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',20.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5348 MEMBER','1','14014') +('5349','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5349 MEMBER','1','14015') +('5350','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5350 MEMBER','1','14016') +('5351','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5351 MEMBER','1','14017') +('5352','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5352 MEMBER','1','14018') +('5353','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5353 MEMBER','1','14019') +('5354','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5354 MEMBER','1','14020') +('5355','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5355 MEMBER','1','14021') +('5356','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5356 MEMBER','1','14022') +('5357','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5357 MEMBER','1','14023') +('5358','1','LASTNAME','FIRSTNAME',999.99,5.87,'10',40.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5358 MEMBER','1','14024') +('5359','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5359 MEMBER','1','14025') +('5360','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5360 MEMBER','1','14026') +('5361','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5361 MEMBER','1','14027') +('5362','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5362 MEMBER','1','14028') +('5363','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5363 MEMBER','1','14029') +('5364','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5364 MEMBER','1','14030') +('5365','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5365 MEMBER','1','14031') +('5366','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"5366 MEMBER','1','14032') +('5367','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5367 MEMBER','1','14033') +('5368','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"5368 MEMBER','1','14034') +('5369','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5369 MEMBER','1','14035') +('5370','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5370 MEMBER','1','14036') +('5371','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5371 MEMBER','1','14037') +('5372','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5372 MEMBER','1','14038') +('5373','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5373 MEMBER','1','14039') +('5374','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','1','0',0.00,'999','0','"5374 MEMBER','1','14040') +('5375','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5375 MEMBER','1','14041') +('5376','1','LASTNAME','FIRSTNAME',999.99,0.00,'10',0.00,'1','1','1','REG','9','1','0',0.00,'999','0','"5376 MEMBER','1','14042') +('5377','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5377 MEMBER','1','14043') +('5378','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"5378 MEMBER','1','14044') +('8524','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8524 MEMBER','1','14045') +('8524','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8524 MEMBER','1','14046') +('8524','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8524 MEMBER','1','14047') +('8526','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8526 MEMBER','1','14048') +('8526','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8526 MEMBER','1','14049') +('8526','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8526 MEMBER','1','14050') +('8525','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8525 MEMBER','1','14051') +('8525','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8525 MEMBER','1','14052') +('8525','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8525 MEMBER','1','14053') +('8528','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8528 MEMBER','1','14054') +('8528','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8528 MEMBER','1','14055') +('8528','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8528 MEMBER','1','14056') +('8527','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8527 MEMBER','1','14057') +('8527','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8527 MEMBER','1','14058') +('977','4','LASTNAME','FIRSTNAME',999.99,15.48,'0',20.00,'1','1','1','PC','1','0','0',8764.34,'999','0','"977 MEMBER','1','14059') +('9716','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9716 MEMBER','1','14060') +('6740','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"6740 MEMBER','1','14061') +('6797','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6797 MEMBER','1','14062') +('6670','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6670 MEMBER','1','14063') +('8532','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8532 MEMBER','1','14064') +('364','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',38.32,'999','1','"364 MEMBER','1','14065') +('8530','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8530 MEMBER','1','14066') +('4952','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4952 MEMBER','1','14067') +('4952','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4952 MEMBER','1','14068') +('6470','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6470 MEMBER','1','14069') +('8534','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8534 MEMBER','1','14070') +('8534','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8534 MEMBER','1','14071') +('8535','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8535 MEMBER','1','14072') +('8535','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8535 MEMBER','1','14073') +('8535','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8535 MEMBER','1','14074') +('8536','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8536 MEMBER','1','14075') +('569','4','LASTNAME','FIRSTNAME',NULL,21.53,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"569 MEMBER','1','14076') +('9280','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9280 MEMBER','1','14077') +('652','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"652 MEMBER','1','14078') +('8605','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8605 MEMBER','1','14079') +('8607','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8607 MEMBER','1','14080') +('8597','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8597 MEMBER','1','14081') +('8597','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8597 MEMBER','1','14082') +('8597','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8597 MEMBER','1','14083') +('8598','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8598 MEMBER','1','14084') +('8598','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8598 MEMBER','1','14085') +('8598','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8598 MEMBER','1','14086') +('8599','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8599 MEMBER','1','14087') +('8599','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8599 MEMBER','1','14088') +('8602','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8602 MEMBER','1','14089') +('8603','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8603 MEMBER','1','14090') +('8603','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8603 MEMBER','1','14091') +('8603','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8603 MEMBER','1','14092') +('8606','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8606 MEMBER','1','14093') +('5211','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5211 MEMBER','1','14094') +('5272','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5272 MEMBER','1','14095') +('5272','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"5272 MEMBER','1','14096') +('7144','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"7144 MEMBER','1','14097') +('1166','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1166 MEMBER','1','14098') +('8626','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8626 MEMBER','1','14099') +('5254','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5254 MEMBER','1','14100') +('8614','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8614 MEMBER','1','14101') +('8615','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8615 MEMBER','1','14102') +('8596','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8596 MEMBER','1','14103') +('7481','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7481 MEMBER','1','14104') +('8617','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8617 MEMBER','1','14105') +('8618','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8618 MEMBER','1','14106') +('8618','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8618 MEMBER','1','14107') +('8620','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8620 MEMBER','1','14108') +('10485','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10485 MEMBER','1','14109') +('8622','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8622 MEMBER','1','14110') +('8624','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8624 MEMBER','1','14111') +('8625','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8625 MEMBER','1','14112') +('7619','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7619 MEMBER','1','14113') +('8627','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8627 MEMBER','1','14114') +('8628','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8628 MEMBER','1','14115') +('8628','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8628 MEMBER','1','14116') +('8628','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8628 MEMBER','1','14117') +('8629','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8629 MEMBER','1','14118') +('8630','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8630 MEMBER','1','14119') +('8630','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8630 MEMBER','1','14120') +('5254','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5254 MEMBER','1','14121') +('5254','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5254 MEMBER','1','14122') +('9404','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9404 MEMBER','1','14123') +('9405','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9405 MEMBER','1','14124') +('9415','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9415 MEMBER','1','14125') +('4387','3','LASTNAME','FIRSTNAME',NULL,5.95,'10',100.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"4387 MEMBER','1','14126') +('7286','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7286 MEMBER','1','14127') +('6551','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6551 MEMBER','1','14128') +('6677','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6677 MEMBER','1','14129') +('9379','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9379 MEMBER','1','14130') +('9381','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9381 MEMBER','1','14131') +('9384','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9384 MEMBER','1','14132') +('9386','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9386 MEMBER','1','14133') +('9386','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9386 MEMBER','1','14134') +('9387','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9387 MEMBER','1','14135') +('9387','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9387 MEMBER','1','14136') +('9388','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9388 MEMBER','1','14137') +('10080','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10080 MEMBER','1','14138') +('9408','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9408 MEMBER','1','14139') +('9410','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9410 MEMBER','1','14140') +('9411','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9411 MEMBER','1','14141') +('9412','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9412 MEMBER','1','14142') +('9414','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9414 MEMBER','1','14143') +('9415','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9415 MEMBER','1','14144') +('9416','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9416 MEMBER','1','14145') +('9417','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9417 MEMBER','1','14146') +('9418','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9418 MEMBER','1','14147') +('9419','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9419 MEMBER','1','14148') +('9420','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9420 MEMBER','1','14149') +('9421','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9421 MEMBER','1','14150') +('9422','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9422 MEMBER','1','14151') +('9423','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9423 MEMBER','1','14152') +('9424','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9424 MEMBER','1','14153') +('9425','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9425 MEMBER','1','14154') +('9426','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9426 MEMBER','1','14155') +('9427','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9427 MEMBER','1','14156') +('9429','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9429 MEMBER','1','14157') +('9430','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9430 MEMBER','1','14158') +('9431','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9431 MEMBER','1','14159') +('9432','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9432 MEMBER','1','14160') +('9434','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9434 MEMBER','1','14161') +('9436','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9436 MEMBER','1','14162') +('9437','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9437 MEMBER','1','14163') +('9438','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9438 MEMBER','1','14164') +('9439','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9439 MEMBER','1','14165') +('9440','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9440 MEMBER','1','14166') +('9442','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9442 MEMBER','1','14167') +('9443','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9443 MEMBER','1','14168') +('9444','1','LASTNAME','FIRSTNAME',999.99,20.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9444 MEMBER','1','14169') +('9445','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9445 MEMBER','1','14170') +('10260','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10260 MEMBER','1','14171') +('10260','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10260 MEMBER','1','14172') +('8720','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8720 MEMBER','1','14173') +('5274','2','LASTNAME','FIRSTNAME',NULL,6.16,'10',30.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5274 MEMBER','1','14174') +('5274','3','LASTNAME','FIRSTNAME',NULL,6.16,'10',30.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5274 MEMBER','1','14175') +('12','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"12 MEMBER','1','14176') +('10209','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"10209 MEMBER','1','14177') +('9651','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9651 MEMBER','1','14178') +('9652','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9652 MEMBER','1','14179') +('9970','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9970 MEMBER','1','14180') +('9389','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9389 MEMBER','1','14181') +('9391','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9391 MEMBER','1','14182') +('9391','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9391 MEMBER','1','14183') +('9392','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9392 MEMBER','1','14184') +('9392','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9392 MEMBER','1','14185') +('9394','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9394 MEMBER','1','14186') +('9394','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9394 MEMBER','1','14187') +('9394','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9394 MEMBER','1','14188') +('9397','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9397 MEMBER','1','14189') +('9397','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9397 MEMBER','1','14190') +('9397','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9397 MEMBER','1','14191') +('9399','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9399 MEMBER','1','14192') +('17','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'REG','0','0','0',NULL,NULL,'0','"17 MEMBER','1','14193') +('8840','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8840 MEMBER','1','14194') +('8854','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8854 MEMBER','1','14195') +('8855','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8855 MEMBER','1','14196') +('8856','1','LASTNAME','FIRSTNAME',999.99,7.94,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8856 MEMBER','1','14197') +('8857','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8857 MEMBER','1','14198') +('8858','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8858 MEMBER','1','14199') +('8859','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8859 MEMBER','1','14200') +('8860','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8860 MEMBER','1','14201') +('8861','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8861 MEMBER','1','14202') +('8862','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8862 MEMBER','1','14203') +('8863','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8863 MEMBER','1','14204') +('8864','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8864 MEMBER','1','14205') +('8865','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8865 MEMBER','1','14206') +('8809','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8809 MEMBER','1','14207') +('8810','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8810 MEMBER','1','14208') +('8810','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8810 MEMBER','1','14209') +('8811','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8811 MEMBER','1','14210') +('8813','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8813 MEMBER','1','14211') +('8813','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8813 MEMBER','1','14212') +('4934','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4934 MEMBER','1','14213') +('9847','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9847 MEMBER','1','14214') +('8814','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8814 MEMBER','1','14215') +('8816','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8816 MEMBER','1','14216') +('8817','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8817 MEMBER','1','14217') +('9921','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9921 MEMBER','1','14218') +('10255','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10255 MEMBER','1','14219') +('5337','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5337 MEMBER','1','14220') +('9599','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9599 MEMBER','1','14221') +('8829','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8829 MEMBER','1','14222') +('8834','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8834 MEMBER','1','14223') +('8836','2','LASTNAME','FIRSTNAME',NULL,13.81,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8836 MEMBER','1','14224') +('9327','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9327 MEMBER','1','14225') +('8837','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8837 MEMBER','1','14226') +('8846','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8846 MEMBER','1','14227') +('8852','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8852 MEMBER','1','14228') +('8853','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8853 MEMBER','1','14229') +('8854','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8854 MEMBER','1','14230') +('8855','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8855 MEMBER','1','14231') +('8867','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8867 MEMBER','1','14232') +('8868','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8868 MEMBER','1','14233') +('8874','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8874 MEMBER','1','14234') +('8875','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8875 MEMBER','1','14235') +('8877','1','LASTNAME','FIRSTNAME',999.99,9.61,'0',20.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8877 MEMBER','1','14236') +('8878','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8878 MEMBER','1','14237') +('8879','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8879 MEMBER','1','14238') +('8880','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8880 MEMBER','1','14239') +('8881','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8881 MEMBER','1','14240') +('8882','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8882 MEMBER','1','14241') +('8883','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8883 MEMBER','1','14242') +('8884','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8884 MEMBER','1','14243') +('8885','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8885 MEMBER','1','14244') +('8886','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8886 MEMBER','1','14245') +('8887','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8887 MEMBER','1','14246') +('8888','1','LASTNAME','FIRSTNAME',999.99,32.61,'10',75.00,'1','1','1','PC','3','1','0',0.00,'999','0','"8888 MEMBER','1','14247') +('8889','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8889 MEMBER','1','14248') +('8890','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8890 MEMBER','1','14249') +('8891','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8891 MEMBER','1','14250') +('8892','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8892 MEMBER','1','14251') +('8893','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8893 MEMBER','1','14252') +('8894','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8894 MEMBER','1','14253') +('8895','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8895 MEMBER','1','14254') +('8896','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8896 MEMBER','1','14255') +('8897','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8897 MEMBER','1','14256') +('8898','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8898 MEMBER','1','14257') +('8899','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8899 MEMBER','1','14258') +('8900','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8900 MEMBER','1','14259') +('8901','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8901 MEMBER','1','14260') +('8902','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"8902 MEMBER','1','14261') +('8903','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','0','"8903 MEMBER','1','14262') +('8904','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8904 MEMBER','1','14263') +('8905','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8905 MEMBER','1','14264') +('8856','3','LASTNAME','FIRSTNAME',999.99,7.94,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8856 MEMBER','1','14265') +('10483','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10483 MEMBER','1','14266') +('10375','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10375 MEMBER','1','14267') +('8857','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8857 MEMBER','1','14268') +('8857','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8857 MEMBER','1','14269') +('8857','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8857 MEMBER','1','14270') +('8858','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8858 MEMBER','1','14271') +('8858','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8858 MEMBER','1','14272') +('8859','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8859 MEMBER','1','14273') +('8861','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8861 MEMBER','1','14274') +('8861','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8861 MEMBER','1','14275') +('8861','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8861 MEMBER','1','14276') +('8863','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8863 MEMBER','1','14277') +('8864','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8864 MEMBER','1','14278') +('8864','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8864 MEMBER','1','14279') +('8864','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8864 MEMBER','1','14280') +('8865','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8865 MEMBER','1','14281') +('8865','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8865 MEMBER','1','14282') +('8865','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8865 MEMBER','1','14283') +('8866','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8866 MEMBER','1','14284') +('8867','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8867 MEMBER','1','14285') +('8867','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8867 MEMBER','1','14286') +('8867','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8867 MEMBER','1','14287') +('8868','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8868 MEMBER','1','14288') +('9990','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9990 MEMBER','1','14289') +('8489','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8489 MEMBER','1','14290') +('5317','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','1','0',0.00,'999','0','"5317 MEMBER','1','14291') +('9812','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9812 MEMBER','1','14292') +('8872','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8872 MEMBER','1','14293') +('355','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"355 MEMBER','1','14294') +('8869','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8869 MEMBER','1','14295') +('8870','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8870 MEMBER','1','14296') +('8871','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8871 MEMBER','1','14297') +('8873','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8873 MEMBER','1','14298') +('8875','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8875 MEMBER','1','14299') +('7533','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7533 MEMBER','1','14300') +('8876','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8876 MEMBER','1','14301') +('8879','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8879 MEMBER','1','14302') +('8879','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8879 MEMBER','1','14303') +('8880','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8880 MEMBER','1','14304') +('8880','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8880 MEMBER','1','14305') +('8881','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8881 MEMBER','1','14306') +('8882','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"8882 MEMBER','1','14307') +('8883','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8883 MEMBER','1','14308') +('8883','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8883 MEMBER','1','14309') +('8883','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8883 MEMBER','1','14310') +('8887','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8887 MEMBER','1','14311') +('8889','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8889 MEMBER','1','14312') +('8890','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8890 MEMBER','1','14313') +('8890','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8890 MEMBER','1','14314') +('8906','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8906 MEMBER','1','14315') +('8907','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8907 MEMBER','1','14316') +('8908','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8908 MEMBER','1','14317') +('8909','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8909 MEMBER','1','14318') +('8910','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8910 MEMBER','1','14319') +('8911','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8911 MEMBER','1','14320') +('8912','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8912 MEMBER','1','14321') +('8913','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8913 MEMBER','1','14322') +('8914','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8914 MEMBER','1','14323') +('8915','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8915 MEMBER','1','14324') +('8916','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8916 MEMBER','1','14325') +('8917','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8917 MEMBER','1','14326') +('8918','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8918 MEMBER','1','14327') +('8919','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8919 MEMBER','1','14328') +('8920','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8920 MEMBER','1','14329') +('8921','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8921 MEMBER','1','14330') +('8922','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8922 MEMBER','1','14331') +('8923','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8923 MEMBER','1','14332') +('8924','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8924 MEMBER','1','14333') +('8925','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8925 MEMBER','1','14334') +('8926','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8926 MEMBER','1','14335') +('8927','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8927 MEMBER','1','14336') +('8928','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8928 MEMBER','1','14337') +('8929','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8929 MEMBER','1','14338') +('8930','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8930 MEMBER','1','14339') +('8931','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8931 MEMBER','1','14340') +('8932','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8932 MEMBER','1','14341') +('8933','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8933 MEMBER','1','14342') +('8934','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8934 MEMBER','1','14343') +('8935','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8935 MEMBER','1','14344') +('8936','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8936 MEMBER','1','14345') +('8937','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8937 MEMBER','1','14346') +('8938','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8938 MEMBER','1','14347') +('8939','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8939 MEMBER','1','14348') +('8940','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8940 MEMBER','1','14349') +('8941','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8941 MEMBER','1','14350') +('8942','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8942 MEMBER','1','14351') +('8943','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8943 MEMBER','1','14352') +('8944','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"8944 MEMBER','1','14353') +('8945','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8945 MEMBER','1','14354') +('8891','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8891 MEMBER','1','14355') +('9845','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9845 MEMBER','1','14356') +('10085','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10085 MEMBER','1','14357') +('228','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"228 MEMBER','1','14358') +('228','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"228 MEMBER','1','14359') +('10425','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10425 MEMBER','1','14360') +('4484','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4484 MEMBER','1','14361') +('6934','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6934 MEMBER','1','14362') +('6934','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6934 MEMBER','1','14363') +('8893','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8893 MEMBER','1','14364') +('8893','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8893 MEMBER','1','14365') +('8893','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8893 MEMBER','1','14366') +('8894','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8894 MEMBER','1','14367') +('8896','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8896 MEMBER','1','14368') +('8898','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8898 MEMBER','1','14369') +('8898','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8898 MEMBER','1','14370') +('8898','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8898 MEMBER','1','14371') +('9689','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9689 MEMBER','1','14372') +('228','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"228 MEMBER','1','14373') +('6987','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"6987 MEMBER','1','14374') +('7421','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7421 MEMBER','1','14375') +('8937','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8937 MEMBER','1','14376') +('310','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',452.44,'999','0','"310 MEMBER','1','14377') +('2977','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"2977 MEMBER','1','14378') +('8899','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8899 MEMBER','1','14379') +('8899','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8899 MEMBER','1','14380') +('9883','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9883 MEMBER','1','14381') +('8903','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8903 MEMBER','1','14382') +('8903','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8903 MEMBER','1','14383') +('8905','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8905 MEMBER','1','14384') +('8905','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8905 MEMBER','1','14385') +('8906','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8906 MEMBER','1','14386') +('8906','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8906 MEMBER','1','14387') +('8906','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8906 MEMBER','1','14388') +('8908','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8908 MEMBER','1','14389') +('8908','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8908 MEMBER','1','14390') +('8909','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8909 MEMBER','1','14391') +('8909','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8909 MEMBER','1','14392') +('8910','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8910 MEMBER','1','14393') +('8911','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8911 MEMBER','1','14394') +('8912','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8912 MEMBER','1','14395') +('8938','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8938 MEMBER','1','14396') +('8940','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8940 MEMBER','1','14397') +('1771','2','LASTNAME','FIRSTNAME',NULL,20.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1771 MEMBER','1','14398') +('1186','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1186 MEMBER','1','14399') +('1186','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"1186 MEMBER','1','14400') +('8941','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8941 MEMBER','1','14401') +('8941','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8941 MEMBER','1','14402') +('7151','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7151 MEMBER','1','14403') +('8723','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8723 MEMBER','1','14404') +('8946','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8946 MEMBER','1','14405') +('8946','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8946 MEMBER','1','14406') +('8947','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8947 MEMBER','1','14407') +('9597','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9597 MEMBER','1','14408') +('310','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',452.44,'999','0','"310 MEMBER','1','14409') +('8948','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8948 MEMBER','1','14410') +('8949','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8949 MEMBER','1','14411') +('8949','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8949 MEMBER','1','14412') +('8950','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8950 MEMBER','1','14413') +('8951','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8951 MEMBER','1','14414') +('8951','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8951 MEMBER','1','14415') +('10308','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10308 MEMBER','1','14416') +('8952','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8952 MEMBER','1','14417') +('8953','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8953 MEMBER','1','14418') +('8954','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8954 MEMBER','1','14419') +('8955','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8955 MEMBER','1','14420') +('8955','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8955 MEMBER','1','14421') +('10369','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10369 MEMBER','1','14422') +('8957','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8957 MEMBER','1','14423') +('8959','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8959 MEMBER','1','14424') +('4899','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4899 MEMBER','1','14425') +('8960','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8960 MEMBER','1','14426') +('8962','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8962 MEMBER','1','14427') +('8962','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8962 MEMBER','1','14428') +('8962','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8962 MEMBER','1','14429') +('8963','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8963 MEMBER','1','14430') +('8963','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8963 MEMBER','1','14431') +('8963','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8963 MEMBER','1','14432') +('8986','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8986 MEMBER','1','14433') +('8987','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8987 MEMBER','1','14434') +('8988','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8988 MEMBER','1','14435') +('8989','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8989 MEMBER','1','14436') +('8990','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8990 MEMBER','1','14437') +('8991','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8991 MEMBER','1','14438') +('8992','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8992 MEMBER','1','14439') +('8993','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8993 MEMBER','1','14440') +('8994','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8994 MEMBER','1','14441') +('8995','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"8995 MEMBER','1','14442') +('8996','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8996 MEMBER','1','14443') +('8997','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8997 MEMBER','1','14444') +('8998','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8998 MEMBER','1','14445') +('8999','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8999 MEMBER','1','14446') +('9101','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9101 MEMBER','1','14447') +('9102','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9102 MEMBER','1','14448') +('9103','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9103 MEMBER','1','14449') +('9104','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9104 MEMBER','1','14450') +('9105','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9105 MEMBER','1','14451') +('9106','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9106 MEMBER','1','14452') +('9107','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9107 MEMBER','1','14453') +('9108','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9108 MEMBER','1','14454') +('9109','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9109 MEMBER','1','14455') +('9110','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"9110 MEMBER','1','14456') +('9111','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',0.00,'999','1','"9111 MEMBER','1','14457') +('9112','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9112 MEMBER','1','14458') +('9113','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9113 MEMBER','1','14459') +('9114','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9114 MEMBER','1','14460') +('9115','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9115 MEMBER','1','14461') +('9116','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9116 MEMBER','1','14462') +('9117','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9117 MEMBER','1','14463') +('9118','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9118 MEMBER','1','14464') +('9119','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9119 MEMBER','1','14465') +('9120','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9120 MEMBER','1','14466') +('9121','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9121 MEMBER','1','14467') +('9122','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9122 MEMBER','1','14468') +('9123','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9123 MEMBER','1','14469') +('9124','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9124 MEMBER','1','14470') +('9125','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9125 MEMBER','1','14471') +('9126','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9126 MEMBER','1','14472') +('8964','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8964 MEMBER','1','14473') +('8969','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8969 MEMBER','1','14474') +('8969','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8969 MEMBER','1','14475') +('8970','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8970 MEMBER','1','14476') +('8970','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8970 MEMBER','1','14477') +('8970','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8970 MEMBER','1','14478') +('9626','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9626 MEMBER','1','14479') +('8971','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8971 MEMBER','1','14480') +('8972','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8972 MEMBER','1','14481') +('8972','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8972 MEMBER','1','14482') +('8972','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8972 MEMBER','1','14483') +('8974','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8974 MEMBER','1','14484') +('8975','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8975 MEMBER','1','14485') +('8976','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8976 MEMBER','1','14486') +('4241','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4241 MEMBER','1','14487') +('4241','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4241 MEMBER','1','14488') +('8977','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8977 MEMBER','1','14489') +('8978','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8978 MEMBER','1','14490') +('8978','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8978 MEMBER','1','14491') +('8978','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8978 MEMBER','1','14492') +('8979','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8979 MEMBER','1','14493') +('8980','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8980 MEMBER','1','14494') +('8980','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8980 MEMBER','1','14495') +('8981','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8981 MEMBER','1','14496') +('8981','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8981 MEMBER','1','14497') +('8982','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8982 MEMBER','1','14498') +('8982','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8982 MEMBER','1','14499') +('8982','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8982 MEMBER','1','14500') +('8985','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"8985 MEMBER','1','14501') +('8983','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8983 MEMBER','1','14502') +('9939','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9939 MEMBER','1','14503') +('176','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"176 MEMBER','1','14504') +('8060','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8060 MEMBER','1','14505') +('4361','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',534.57,'999','0','"4361 MEMBER','1','14506') +('8990','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8990 MEMBER','1','14507') +('8990','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8990 MEMBER','1','14508') +('8990','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8990 MEMBER','1','14509') +('8991','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8991 MEMBER','1','14510') +('8993','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8993 MEMBER','1','14511') +('8993','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8993 MEMBER','1','14512') +('8994','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8994 MEMBER','1','14513') +('8994','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8994 MEMBER','1','14514') +('8994','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8994 MEMBER','1','14515') +('10078','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10078 MEMBER','1','14516') +('9103','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9103 MEMBER','1','14517') +('5349','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',0.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5349 MEMBER','1','14518') +('6321','3','LASTNAME','FIRSTNAME',999.99,68.15,'10',100.00,'1','1','1','PC','3','1','0',3469.19,'999','0','"6321 MEMBER','1','14519') +('5348','2','LASTNAME','FIRSTNAME',NULL,0.00,'10',20.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5348 MEMBER','1','14520') +('5351','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','1','0',NULL,NULL,'0','"5351 MEMBER','1','14521') +('8996','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8996 MEMBER','1','14522') +('8996','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8996 MEMBER','1','14523') +('8999','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8999 MEMBER','1','14524') +('9102','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9102 MEMBER','1','14525') +('9104','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9104 MEMBER','1','14526') +('9104','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9104 MEMBER','1','14527') +('9104','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9104 MEMBER','1','14528') +('9128','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9128 MEMBER','1','14529') +('9129','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9129 MEMBER','1','14530') +('9130','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9130 MEMBER','1','14531') +('9131','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9131 MEMBER','1','14532') +('9132','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9132 MEMBER','1','14533') +('9133','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9133 MEMBER','1','14534') +('9134','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9134 MEMBER','1','14535') +('9135','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9135 MEMBER','1','14536') +('9136','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9136 MEMBER','1','14537') +('9137','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9137 MEMBER','1','14538') +('9138','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9138 MEMBER','1','14539') +('9139','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9139 MEMBER','1','14540') +('9140','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9140 MEMBER','1','14541') +('9141','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9141 MEMBER','1','14542') +('9142','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9142 MEMBER','1','14543') +('9143','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9143 MEMBER','1','14544') +('9144','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9144 MEMBER','1','14545') +('9145','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9145 MEMBER','1','14546') +('9146','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9146 MEMBER','1','14547') +('9147','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9147 MEMBER','1','14548') +('9148','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9148 MEMBER','1','14549') +('9149','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9149 MEMBER','1','14550') +('9150','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9150 MEMBER','1','14551') +('9151','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9151 MEMBER','1','14552') +('9152','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9152 MEMBER','1','14553') +('9153','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9153 MEMBER','1','14554') +('9154','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9154 MEMBER','1','14555') +('9155','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9155 MEMBER','1','14556') +('9156','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9156 MEMBER','1','14557') +('9157','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9157 MEMBER','1','14558') +('9158','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9158 MEMBER','1','14559') +('9159','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9159 MEMBER','1','14560') +('9160','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9160 MEMBER','1','14561') +('9161','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9161 MEMBER','1','14562') +('9162','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9162 MEMBER','1','14563') +('9163','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9163 MEMBER','1','14564') +('9164','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9164 MEMBER','1','14565') +('9165','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9165 MEMBER','1','14566') +('9166','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9166 MEMBER','1','14567') +('4721','3','LASTNAME','FIRSTNAME',NULL,15.01,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4721 MEMBER','1','14568') +('9106','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9106 MEMBER','1','14569') +('9108','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9108 MEMBER','1','14570') +('9108','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9108 MEMBER','1','14571') +('9108','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9108 MEMBER','1','14572') +('9109','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9109 MEMBER','1','14573') +('9109','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9109 MEMBER','1','14574') +('9109','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9109 MEMBER','1','14575') +('9110','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9110 MEMBER','1','14576') +('8834','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8834 MEMBER','1','14577') +('8966','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8966 MEMBER','1','14578') +('9111','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9111 MEMBER','1','14579') +('9112','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9112 MEMBER','1','14580') +('9113','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9113 MEMBER','1','14581') +('9115','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9115 MEMBER','1','14582') +('9116','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9116 MEMBER','1','14583') +('9116','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9116 MEMBER','1','14584') +('9117','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9117 MEMBER','1','14585') +('9118','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9118 MEMBER','1','14586') +('9118','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9118 MEMBER','1','14587') +('9119','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9119 MEMBER','1','14588') +('9119','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9119 MEMBER','1','14589') +('9119','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9119 MEMBER','1','14590') +('9121','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9121 MEMBER','1','14591') +('9123','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9123 MEMBER','1','14592') +('9123','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9123 MEMBER','1','14593') +('9124','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9124 MEMBER','1','14594') +('9124','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9124 MEMBER','1','14595') +('9124','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9124 MEMBER','1','14596') +('9125','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9125 MEMBER','1','14597') +('9120','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9120 MEMBER','1','14598') +('9120','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9120 MEMBER','1','14599') +('2477','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2477 MEMBER','1','14600') +('2477','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"2477 MEMBER','1','14601') +('9167','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9167 MEMBER','1','14602') +('9168','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9168 MEMBER','1','14603') +('9169','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9169 MEMBER','1','14604') +('9170','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9170 MEMBER','1','14605') +('9171','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9171 MEMBER','1','14606') +('9172','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9172 MEMBER','1','14607') +('9173','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9173 MEMBER','1','14608') +('9174','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9174 MEMBER','1','14609') +('9175','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9175 MEMBER','1','14610') +('9176','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9176 MEMBER','1','14611') +('9177','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9177 MEMBER','1','14612') +('9178','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9178 MEMBER','1','14613') +('9179','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9179 MEMBER','1','14614') +('9180','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9180 MEMBER','1','14615') +('9181','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9181 MEMBER','1','14616') +('9182','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9182 MEMBER','1','14617') +('9183','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9183 MEMBER','1','14618') +('9184','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9184 MEMBER','1','14619') +('9185','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9185 MEMBER','1','14620') +('9186','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9186 MEMBER','1','14621') +('9187','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9187 MEMBER','1','14622') +('9188','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9188 MEMBER','1','14623') +('9189','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9189 MEMBER','1','14624') +('9190','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9190 MEMBER','1','14625') +('9191','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9191 MEMBER','1','14626') +('9192','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9192 MEMBER','1','14627') +('9193','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9193 MEMBER','1','14628') +('9194','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9194 MEMBER','1','14629') +('9195','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9195 MEMBER','1','14630') +('9196','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9196 MEMBER','1','14631') +('9197','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9197 MEMBER','1','14632') +('9198','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9198 MEMBER','1','14633') +('9199','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9199 MEMBER','1','14634') +('9200','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9200 MEMBER','1','14635') +('9201','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9201 MEMBER','1','14636') +('9202','1','LASTNAME','FIRSTNAME',999.99,30.66,'10',50.00,'1','1','1','PC','3','1','0',0.00,'999','0','"9202 MEMBER','1','14637') +('9203','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9203 MEMBER','1','14638') +('9204','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9204 MEMBER','1','14639') +('9205','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9205 MEMBER','1','14640') +('9206','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9206 MEMBER','1','14641') +('77','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"77 MEMBER','1','14642') +('9989','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9989 MEMBER','1','14643') +('9204','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9204 MEMBER','1','14644') +('9129','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9129 MEMBER','1','14645') +('9129','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9129 MEMBER','1','14646') +('9129','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9129 MEMBER','1','14647') +('9130','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9130 MEMBER','1','14648') +('9130','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9130 MEMBER','1','14649') +('9131','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9131 MEMBER','1','14650') +('9132','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9132 MEMBER','1','14651') +('9132','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9132 MEMBER','1','14652') +('9132','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9132 MEMBER','1','14653') +('9134','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9134 MEMBER','1','14654') +('9135','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9135 MEMBER','1','14655') +('8989','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"8989 MEMBER','1','14656') +('9136','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9136 MEMBER','1','14657') +('9136','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9136 MEMBER','1','14658') +('9137','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9137 MEMBER','1','14659') +('9137','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9137 MEMBER','1','14660') +('9138','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9138 MEMBER','1','14661') +('9138','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9138 MEMBER','1','14662') +('9138','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9138 MEMBER','1','14663') +('9139','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9139 MEMBER','1','14664') +('9139','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9139 MEMBER','1','14665') +('9139','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9139 MEMBER','1','14666') +('9140','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9140 MEMBER','1','14667') +('9141','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9141 MEMBER','1','14668') +('9141','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'1','"9141 MEMBER','1','14669') +('9142','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9142 MEMBER','1','14670') +('9143','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9143 MEMBER','1','14671') +('9143','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9143 MEMBER','1','14672') +('9145','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9145 MEMBER','1','14673') +('9146','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9146 MEMBER','1','14674') +('9146','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9146 MEMBER','1','14675') +('9146','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9146 MEMBER','1','14676') +('9147','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9147 MEMBER','1','14677') +('9148','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9148 MEMBER','1','14678') +('9148','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9148 MEMBER','1','14679') +('9148','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9148 MEMBER','1','14680') +('7590','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7590 MEMBER','1','14681') +('569','3','LASTNAME','FIRSTNAME',NULL,21.53,'10',50.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'0','"569 MEMBER','1','14682') +('8981','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8981 MEMBER','1','14683') +('9149','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9149 MEMBER','1','14684') +('9150','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9150 MEMBER','1','14685') +('9151','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9151 MEMBER','1','14686') +('9152','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9152 MEMBER','1','14687') +('9154','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9154 MEMBER','1','14688') +('9155','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9155 MEMBER','1','14689') +('9155','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9155 MEMBER','1','14690') +('9155','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9155 MEMBER','1','14691') +('9157','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9157 MEMBER','1','14692') +('9158','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9158 MEMBER','1','14693') +('9159','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9159 MEMBER','1','14694') +('9159','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9159 MEMBER','1','14695') +('9161','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9161 MEMBER','1','14696') +('9163','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9163 MEMBER','1','14697') +('9163','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9163 MEMBER','1','14698') +('9163','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9163 MEMBER','1','14699') +('9178','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9178 MEMBER','1','14700') +('9162','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9162 MEMBER','1','14701') +('9164','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9164 MEMBER','1','14702') +('9165','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9165 MEMBER','1','14703') +('9178','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9178 MEMBER','1','14704') +('9166','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9166 MEMBER','1','14705') +('9167','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9167 MEMBER','1','14706') +('7093','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7093 MEMBER','1','14707') +('4899','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4899 MEMBER','1','14708') +('9168','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"9168 MEMBER','1','14709') +('9169','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9169 MEMBER','1','14710') +('9172','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9172 MEMBER','1','14711') +('9172','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9172 MEMBER','1','14712') +('9172','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9172 MEMBER','1','14713') +('9173','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9173 MEMBER','1','14714') +('9173','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9173 MEMBER','1','14715') +('9173','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9173 MEMBER','1','14716') +('9174','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9174 MEMBER','1','14717') +('9176','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9176 MEMBER','1','14718') +('9177','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9177 MEMBER','1','14719') +('9179','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9179 MEMBER','1','14720') +('9179','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9179 MEMBER','1','14721') +('9180','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9180 MEMBER','1','14722') +('9180','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9180 MEMBER','1','14723') +('9181','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9181 MEMBER','1','14724') +('9182','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9182 MEMBER','1','14725') +('9183','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9183 MEMBER','1','14726') +('9184','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9184 MEMBER','1','14727') +('9184','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9184 MEMBER','1','14728') +('9184','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9184 MEMBER','1','14729') +('9208','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9208 MEMBER','1','14730') +('9210','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9210 MEMBER','1','14731') +('9211','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9211 MEMBER','1','14732') +('9212','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9212 MEMBER','1','14733') +('9213','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9213 MEMBER','1','14734') +('9214','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9214 MEMBER','1','14735') +('9215','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9215 MEMBER','1','14736') +('9216','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9216 MEMBER','1','14737') +('9217','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9217 MEMBER','1','14738') +('9218','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9218 MEMBER','1','14739') +('9219','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9219 MEMBER','1','14740') +('9220','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9220 MEMBER','1','14741') +('9221','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9221 MEMBER','1','14742') +('9222','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','1','"9222 MEMBER','1','14743') +('9223','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9223 MEMBER','1','14744') +('9224','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9224 MEMBER','1','14745') +('9225','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9225 MEMBER','1','14746') +('9226','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9226 MEMBER','1','14747') +('9227','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9227 MEMBER','1','14748') +('9228','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9228 MEMBER','1','14749') +('9229','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9229 MEMBER','1','14750') +('9230','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9230 MEMBER','1','14751') +('9231','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9231 MEMBER','1','14752') +('9232','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9232 MEMBER','1','14753') +('9233','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9233 MEMBER','1','14754') +('9234','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9234 MEMBER','1','14755') +('9235','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9235 MEMBER','1','14756') +('9236','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9236 MEMBER','1','14757') +('9237','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9237 MEMBER','1','14758') +('9238','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9238 MEMBER','1','14759') +('9239','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9239 MEMBER','1','14760') +('9240','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9240 MEMBER','1','14761') +('9241','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9241 MEMBER','1','14762') +('9242','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9242 MEMBER','1','14763') +('9243','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9243 MEMBER','1','14764') +('9244','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9244 MEMBER','1','14765') +('9245','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9245 MEMBER','1','14766') +('9246','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9246 MEMBER','1','14767') +('9186','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9186 MEMBER','1','14768') +('9186','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9186 MEMBER','1','14769') +('9186','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9186 MEMBER','1','14770') +('9187','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9187 MEMBER','1','14771') +('9188','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9188 MEMBER','1','14772') +('10053','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10053 MEMBER','1','14773') +('10054','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10054 MEMBER','1','14774') +('9189','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9189 MEMBER','1','14775') +('9189','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9189 MEMBER','1','14776') +('9190','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9190 MEMBER','1','14777') +('9192','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9192 MEMBER','1','14778') +('9192','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9192 MEMBER','1','14779') +('6531','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','INACT','0','0','0',130.70,'999','0','"6531 MEMBER','1','14780') +('9193','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9193 MEMBER','1','14781') +('9194','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9194 MEMBER','1','14782') +('9194','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9194 MEMBER','1','14783') +('9194','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9194 MEMBER','1','14784') +('9195','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9195 MEMBER','1','14785') +('9196','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9196 MEMBER','1','14786') +('9198','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9198 MEMBER','1','14787') +('9199','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9199 MEMBER','1','14788') +('9200','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9200 MEMBER','1','14789') +('9200','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9200 MEMBER','1','14790') +('9204','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9204 MEMBER','1','14791') +('770','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"770 MEMBER','1','14792') +('770','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"770 MEMBER','1','14793') +('10135','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','1','"10135 MEMBER','1','14794') +('320','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',3480.40,'999','0','"320 MEMBER','1','14795') +('9978','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9978 MEMBER','1','14796') +('10121','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10121 MEMBER','1','14797') +('4858','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',344.70,'999','0','"4858 MEMBER','1','14798') +('9205','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9205 MEMBER','1','14799') +('9205','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9205 MEMBER','1','14800') +('9206','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9206 MEMBER','1','14801') +('9207','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9207 MEMBER','1','14802') +('9207','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9207 MEMBER','1','14803') +('9208','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9208 MEMBER','1','14804') +('9209','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9209 MEMBER','1','14805') +('9210','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9210 MEMBER','1','14806') +('9483','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9483 MEMBER','1','14807') +('9485','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9485 MEMBER','1','14808') +('9942','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9942 MEMBER','1','14809') +('4467','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"4467 MEMBER','1','14810') +('9387','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9387 MEMBER','1','14811') +('9407','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9407 MEMBER','1','14812') +('9409','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9409 MEMBER','1','14813') +('9413','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9413 MEMBER','1','14814') +('9428','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9428 MEMBER','1','14815') +('9433','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9433 MEMBER','1','14816') +('9435','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9435 MEMBER','1','14817') +('9441','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9441 MEMBER','1','14818') +('9446','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9446 MEMBER','1','14819') +('8720','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8720 MEMBER','1','14820') +('4071','4','LASTNAME','FIRSTNAME',NULL,43.10,'10',125.00,'1','0',NULL,'PC','3','1','0',NULL,NULL,'1','"4071 MEMBER','1','14821') +('9389','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9389 MEMBER','1','14822') +('9390','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9390 MEMBER','1','14823') +('9393','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9393 MEMBER','1','14824') +('9398','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9398 MEMBER','1','14825') +('10423','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10423 MEMBER','1','14826') +('9405','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9405 MEMBER','1','14827') +('9405','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9405 MEMBER','1','14828') +('9407','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9407 MEMBER','1','14829') +('9407','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9407 MEMBER','1','14830') +('9407','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9407 MEMBER','1','14831') +('9408','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9408 MEMBER','1','14832') +('9409','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9409 MEMBER','1','14833') +('9410','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9410 MEMBER','1','14834') +('9410','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9410 MEMBER','1','14835') +('9410','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9410 MEMBER','1','14836') +('9411','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9411 MEMBER','1','14837') +('9411','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9411 MEMBER','1','14838') +('9411','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9411 MEMBER','1','14839') +('8006','3','LASTNAME','FIRSTNAME',NULL,20.00,'0',0.00,'1','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8006 MEMBER','1','14840') +('8732','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"8732 MEMBER','1','14841') +('8007','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8007 MEMBER','1','14842') +('9447','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9447 MEMBER','1','14843') +('9448','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9448 MEMBER','1','14844') +('9449','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9449 MEMBER','1','14845') +('9450','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9450 MEMBER','1','14846') +('9451','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9451 MEMBER','1','14847') +('9452','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9452 MEMBER','1','14848') +('9453','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9453 MEMBER','1','14849') +('9454','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9454 MEMBER','1','14850') +('9455','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9455 MEMBER','1','14851') +('9456','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9456 MEMBER','1','14852') +('9457','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9457 MEMBER','1','14853') +('9458','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9458 MEMBER','1','14854') +('9459','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9459 MEMBER','1','14855') +('9460','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9460 MEMBER','1','14856') +('9461','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9461 MEMBER','1','14857') +('9462','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9462 MEMBER','1','14858') +('9463','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9463 MEMBER','1','14859') +('9464','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9464 MEMBER','1','14860') +('9465','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9465 MEMBER','1','14861') +('9466','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9466 MEMBER','1','14862') +('9467','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9467 MEMBER','1','14863') +('9468','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9468 MEMBER','1','14864') +('9469','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9469 MEMBER','1','14865') +('9470','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9470 MEMBER','1','14866') +('9471','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9471 MEMBER','1','14867') +('9472','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9472 MEMBER','1','14868') +('9473','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9473 MEMBER','1','14869') +('9474','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9474 MEMBER','1','14870') +('9475','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9475 MEMBER','1','14871') +('9476','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9476 MEMBER','1','14872') +('9477','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9477 MEMBER','1','14873') +('9478','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9478 MEMBER','1','14874') +('9479','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9479 MEMBER','1','14875') +('9480','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9480 MEMBER','1','14876') +('9481','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9481 MEMBER','1','14877') +('9482','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9482 MEMBER','1','14878') +('9483','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9483 MEMBER','1','14879') +('9484','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9484 MEMBER','1','14880') +('9485','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9485 MEMBER','1','14881') +('9486','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9486 MEMBER','1','14882') +('9418','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9418 MEMBER','1','14883') +('9418','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9418 MEMBER','1','14884') +('9419','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9419 MEMBER','1','14885') +('9420','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9420 MEMBER','1','14886') +('9420','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9420 MEMBER','1','14887') +('9420','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9420 MEMBER','1','14888') +('9421','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9421 MEMBER','1','14889') +('9422','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9422 MEMBER','1','14890') +('9423','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9423 MEMBER','1','14891') +('9370','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9370 MEMBER','1','14892') +('9370','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9370 MEMBER','1','14893') +('9431','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9431 MEMBER','1','14894') +('6575','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"6575 MEMBER','1','14895') +('9455','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','0','1','PC','1','0','0',0.00,'999','0','"9455 MEMBER','1','14896') +('9417','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9417 MEMBER','1','14897') +('9421','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9421 MEMBER','1','14898') +('4036','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"4036 MEMBER','1','14899') +('9427','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9427 MEMBER','1','14900') +('9427','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9427 MEMBER','1','14901') +('9427','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9427 MEMBER','1','14902') +('9428','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9428 MEMBER','1','14903') +('9429','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9429 MEMBER','1','14904') +('9429','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9429 MEMBER','1','14905') +('9430','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9430 MEMBER','1','14906') +('9430','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9430 MEMBER','1','14907') +('9430','4','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9430 MEMBER','1','14908') +('9433','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9433 MEMBER','1','14909') +('9437','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9437 MEMBER','1','14910') +('9437','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9437 MEMBER','1','14911') +('9437','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9437 MEMBER','1','14912') +('9440','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9440 MEMBER','1','14913') +('9440','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9440 MEMBER','1','14914') +('9445','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9445 MEMBER','1','14915') +('9447','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9447 MEMBER','1','14916') +('7104','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7104 MEMBER','1','14917') +('9441','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9441 MEMBER','1','14918') +('10491','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10491 MEMBER','1','14919') +('9443','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9443 MEMBER','1','14920') +('9448','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9448 MEMBER','1','14921') +('9449','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9449 MEMBER','1','14922') +('9450','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9450 MEMBER','1','14923') +('9450','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9450 MEMBER','1','14924') +('9451','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9451 MEMBER','1','14925') +('9454','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9454 MEMBER','1','14926') +('10468','3','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"10468 MEMBER','1','14928') +('9456','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9456 MEMBER','1','14929') +('9456','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9456 MEMBER','1','14930') +('9457','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9457 MEMBER','1','14931') +('9457','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9457 MEMBER','1','14932') +('9457','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9457 MEMBER','1','14933') +('9401','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9401 MEMBER','1','14934') +('10078','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10078 MEMBER','1','14935') +('10079','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10079 MEMBER','1','14936') +('9912','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9912 MEMBER','1','14937') +('9461','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9461 MEMBER','1','14938') +('9648','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9648 MEMBER','1','14939') +('9488','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9488 MEMBER','1','14940') +('9489','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9489 MEMBER','1','14941') +('9490','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9490 MEMBER','1','14942') +('9491','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9491 MEMBER','1','14943') +('9492','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9492 MEMBER','1','14944') +('9493','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9493 MEMBER','1','14945') +('9494','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9494 MEMBER','1','14946') +('9495','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9495 MEMBER','1','14947') +('9496','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9496 MEMBER','1','14948') +('9497','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9497 MEMBER','1','14949') +('9498','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9498 MEMBER','1','14950') +('9499','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"9499 MEMBER','1','14951') +('9500','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9500 MEMBER','1','14952') +('9501','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9501 MEMBER','1','14953') +('9502','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9502 MEMBER','1','14954') +('9503','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9503 MEMBER','1','14955') +('9504','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9504 MEMBER','1','14956') +('9505','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9505 MEMBER','1','14957') +('9506','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9506 MEMBER','1','14958') +('9507','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9507 MEMBER','1','14959') +('9508','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9508 MEMBER','1','14960') +('9509','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9509 MEMBER','1','14961') +('9510','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9510 MEMBER','1','14962') +('9511','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9511 MEMBER','1','14963') +('9512','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9512 MEMBER','1','14964') +('9513','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9513 MEMBER','1','14965') +('9514','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9514 MEMBER','1','14966') +('9515','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9515 MEMBER','1','14967') +('9516','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9516 MEMBER','1','14968') +('9517','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9517 MEMBER','1','14969') +('9518','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9518 MEMBER','1','14970') +('9519','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9519 MEMBER','1','14971') +('9520','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9520 MEMBER','1','14972') +('9521','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9521 MEMBER','1','14973') +('9522','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9522 MEMBER','1','14974') +('9523','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9523 MEMBER','1','14975') +('9524','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9524 MEMBER','1','14976') +('9525','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9525 MEMBER','1','14977') +('9526','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9526 MEMBER','1','14978') +('5330','2','LASTNAME','FIRSTNAME',NULL,12.08,'10',20.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5330 MEMBER','1','14979') +('5330','3','LASTNAME','FIRSTNAME',NULL,12.08,'10',20.00,'1','0',NULL,'REG','9','1','0',NULL,NULL,'0','"5330 MEMBER','1','14980') +('10084','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"10084 MEMBER','1','14981') +('9482','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9482 MEMBER','1','14982') +('9487','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9487 MEMBER','1','14983') +('9488','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9488 MEMBER','1','14984') +('8479','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'INACT','0','0','0',NULL,NULL,'0','"8479 MEMBER','1','14985') +('9453','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9453 MEMBER','1','14986') +('9453','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9453 MEMBER','1','14987') +('9453','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9453 MEMBER','1','14988') +('9458','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9458 MEMBER','1','14989') +('9459','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9459 MEMBER','1','14990') +('9460','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9460 MEMBER','1','14991') +('9712','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9712 MEMBER','1','14992') +('9463','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9463 MEMBER','1','14993') +('9464','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9464 MEMBER','1','14994') +('9465','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9465 MEMBER','1','14995') +('9465','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9465 MEMBER','1','14996') +('9466','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9466 MEMBER','1','14997') +('9466','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9466 MEMBER','1','14998') +('9468','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9468 MEMBER','1','14999') +('9469','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9469 MEMBER','1','15000') +('9469','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9469 MEMBER','1','15001') +('9469','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9469 MEMBER','1','15002') +('9470','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9470 MEMBER','1','15003') +('9471','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9471 MEMBER','1','15004') +('9474','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9474 MEMBER','1','15005') +('9474','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9474 MEMBER','1','15006') +('9475','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9475 MEMBER','1','15007') +('9475','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9475 MEMBER','1','15008') +('9475','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9475 MEMBER','1','15009') +('9878','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9878 MEMBER','1','15010') +('8351','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"8351 MEMBER','1','15011') +('5399','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','999','"5399 MEMBER','1','15012') +('9476','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9476 MEMBER','1','15013') +('9476','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9476 MEMBER','1','15014') +('9476','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9476 MEMBER','1','15015') +('9477','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9477 MEMBER','1','15016') +('9477','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9477 MEMBER','1','15017') +('9477','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9477 MEMBER','1','15018') +('9478','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9478 MEMBER','1','15019') +('9478','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9478 MEMBER','1','15020') +('9478','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9478 MEMBER','1','15021') +('9479','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9479 MEMBER','1','15022') +('9480','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9480 MEMBER','1','15023') +('9480','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9480 MEMBER','1','15024') +('9481','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9481 MEMBER','1','15025') +('7047','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7047 MEMBER','1','15026') +('7389','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7389 MEMBER','1','15027') +('7892','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7892 MEMBER','1','15028') +('7111','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7111 MEMBER','1','15029') +('10022','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"10022 MEMBER','1','15030') +('9896','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9896 MEMBER','1','15031') +('9489','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9489 MEMBER','1','15032') +('9491','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9491 MEMBER','1','15033') +('9491','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9491 MEMBER','1','15034') +('9491','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9491 MEMBER','1','15035') +('9492','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9492 MEMBER','1','15036') +('9493','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9493 MEMBER','1','15037') +('9494','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9494 MEMBER','1','15038') +('9495','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9495 MEMBER','1','15039') +('9496','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9496 MEMBER','1','15040') +('9497','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9497 MEMBER','1','15041') +('9497','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9497 MEMBER','1','15042') +('9528','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9528 MEMBER','1','15043') +('9529','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9529 MEMBER','1','15044') +('9530','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9530 MEMBER','1','15045') +('9531','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9531 MEMBER','1','15046') +('9532','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9532 MEMBER','1','15047') +('9533','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9533 MEMBER','1','15048') +('9534','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9534 MEMBER','1','15049') +('9535','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9535 MEMBER','1','15050') +('9536','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9536 MEMBER','1','15051') +('9537','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9537 MEMBER','1','15052') +('9538','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9538 MEMBER','1','15053') +('9539','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9539 MEMBER','1','15054') +('9540','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9540 MEMBER','1','15055') +('9541','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9541 MEMBER','1','15056') +('9542','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9542 MEMBER','1','15057') +('9543','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9543 MEMBER','1','15058') +('9544','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9544 MEMBER','1','15059') +('9545','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9545 MEMBER','1','15060') +('9546','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9546 MEMBER','1','15061') +('9547','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','INACT','0','0','0',0.00,'999','0','"9547 MEMBER','1','15062') +('9548','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9548 MEMBER','1','15063') +('9549','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9549 MEMBER','1','15064') +('9550','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9550 MEMBER','1','15065') +('9551','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9551 MEMBER','1','15066') +('9552','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9552 MEMBER','1','15067') +('9553','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9553 MEMBER','1','15068') +('9554','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9554 MEMBER','1','15069') +('9555','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'0','1','1','TERM','0','0','0',0.00,'999','0','"9555 MEMBER','1','15070') +('9556','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9556 MEMBER','1','15071') +('9557','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9557 MEMBER','1','15072') +('9558','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9558 MEMBER','1','15073') +('9559','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9559 MEMBER','1','15074') +('9560','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9560 MEMBER','1','15075') +('9561','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9561 MEMBER','1','15076') +('9562','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9562 MEMBER','1','15077') +('9563','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9563 MEMBER','1','15078') +('9564','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9564 MEMBER','1','15079') +('9565','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9565 MEMBER','1','15080') +('9566','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9566 MEMBER','1','15081') +('9500','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9500 MEMBER','1','15082') +('9502','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9502 MEMBER','1','15083') +('9502','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9502 MEMBER','1','15084') +('9503','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9503 MEMBER','1','15085') +('10424','2','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"10424 MEMBER','1','15086') +('8','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"8 MEMBER','1','15087') +('9505','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9505 MEMBER','1','15088') +('9505','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9505 MEMBER','1','15089') +('9506','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9506 MEMBER','1','15090') +('9507','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9507 MEMBER','1','15091') +('9509','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9509 MEMBER','1','15092') +('9509','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9509 MEMBER','1','15093') +('9509','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9509 MEMBER','1','15094') +('9512','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9512 MEMBER','1','15096') +('9512','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9512 MEMBER','1','15097') +('9513','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9513 MEMBER','1','15098') +('9513','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9513 MEMBER','1','15099') +('9513','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9513 MEMBER','1','15100') +('9514','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9514 MEMBER','1','15101') +('9515','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9515 MEMBER','1','15102') +('9515','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9515 MEMBER','1','15103') +('9515','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9515 MEMBER','1','15104') +('9529','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9529 MEMBER','1','15105') +('9544','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9544 MEMBER','1','15106') +('7057','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"7057 MEMBER','1','15107') +('6217','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"6217 MEMBER','1','15108') +('9517','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9517 MEMBER','1','15109') +('9517','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9517 MEMBER','1','15110') +('9518','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9518 MEMBER','1','15111') +('9518','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9518 MEMBER','1','15112') +('9518','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9518 MEMBER','1','15113') +('9519','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9519 MEMBER','1','15114') +('9520','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9520 MEMBER','1','15115') +('9520','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9520 MEMBER','1','15116') +('9520','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9520 MEMBER','1','15117') +('9521','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9521 MEMBER','1','15118') +('9521','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9521 MEMBER','1','15119') +('9522','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9522 MEMBER','1','15120') +('9523','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9523 MEMBER','1','15121') +('9524','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9524 MEMBER','1','15122') +('9525','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9525 MEMBER','1','15123') +('9525','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9525 MEMBER','1','15124') +('9525','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9525 MEMBER','1','15125') +('9526','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9526 MEMBER','1','15126') +('9526','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9526 MEMBER','1','15127') +('9526','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9526 MEMBER','1','15128') +('9527','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9527 MEMBER','1','15129') +('9527','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9527 MEMBER','1','15130') +('9528','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9528 MEMBER','1','15131') +('9530','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9530 MEMBER','1','15132') +('9531','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9531 MEMBER','1','15133') +('9531','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9531 MEMBER','1','15134') +('9531','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9531 MEMBER','1','15135') +('9532','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9532 MEMBER','1','15136') +('9532','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9532 MEMBER','1','15137') +('9532','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9532 MEMBER','1','15138') +('9533','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9533 MEMBER','1','15139') +('9533','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9533 MEMBER','1','15140') +('9533','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9533 MEMBER','1','15141') +('9534','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9534 MEMBER','1','15142') +('9534','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9534 MEMBER','1','15143') +('9535','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9535 MEMBER','1','15144') +('9536','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9536 MEMBER','1','15145') +('9537','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9537 MEMBER','1','15146') +('9538','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9538 MEMBER','1','15147') +('9538','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9538 MEMBER','1','15148') +('9539','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9539 MEMBER','1','15149') +('890','2','LASTNAME','FIRSTNAME',NULL,17.08,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"890 MEMBER','1','15150') +('9279','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9279 MEMBER','1','15151') +('7126','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7126 MEMBER','1','15152') +('9541','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9541 MEMBER','1','15153') +('9541','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9541 MEMBER','1','15154') +('9541','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9541 MEMBER','1','15155') +('9540','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9540 MEMBER','1','15156') +('9542','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9542 MEMBER','1','15157') +('9545','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9545 MEMBER','1','15158') +('9545','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9545 MEMBER','1','15159') +('9545','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9545 MEMBER','1','15160') +('9567','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9567 MEMBER','1','15161') +('9568','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9568 MEMBER','1','15162') +('9569','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9569 MEMBER','1','15163') +('9570','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9570 MEMBER','1','15164') +('9571','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9571 MEMBER','1','15165') +('9572','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9572 MEMBER','1','15166') +('9573','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9573 MEMBER','1','15167') +('9574','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9574 MEMBER','1','15168') +('9575','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9575 MEMBER','1','15169') +('9576','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9576 MEMBER','1','15170') +('9577','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9577 MEMBER','1','15171') +('9578','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9578 MEMBER','1','15172') +('9579','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9579 MEMBER','1','15173') +('9580','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',0.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9580 MEMBER','1','15174') +('9581','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9581 MEMBER','1','15175') +('9582','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9582 MEMBER','1','15176') +('9583','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9583 MEMBER','1','15177') +('9584','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9584 MEMBER','1','15178') +('9585','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9585 MEMBER','1','15179') +('9586','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9586 MEMBER','1','15180') +('9587','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9587 MEMBER','1','15181') +('9588','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9588 MEMBER','1','15182') +('9589','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9589 MEMBER','1','15183') +('9590','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9590 MEMBER','1','15184') +('9591','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9591 MEMBER','1','15185') +('9592','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9592 MEMBER','1','15186') +('9593','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9593 MEMBER','1','15187') +('9594','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9594 MEMBER','1','15188') +('9595','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9595 MEMBER','1','15189') +('9596','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9596 MEMBER','1','15190') +('9597','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9597 MEMBER','1','15191') +('9598','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9598 MEMBER','1','15192') +('9599','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9599 MEMBER','1','15193') +('9600','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9600 MEMBER','1','15194') +('9601','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9601 MEMBER','1','15195') +('9602','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9602 MEMBER','1','15196') +('9603','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','1','"9603 MEMBER','1','15197') +('9604','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9604 MEMBER','1','15198') +('9605','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9605 MEMBER','1','15199') +('9606','1','LASTNAME','FIRSTNAME',999.99,0.00,'0',20.00,'1','1','1','PC','1','0','0',0.00,'999','0','"9606 MEMBER','1','15200') +('9548','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9548 MEMBER','1','15201') +('9549','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9549 MEMBER','1','15202') +('9549','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9549 MEMBER','1','15203') +('9552','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9552 MEMBER','1','15204') +('9553','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9553 MEMBER','1','15205') +('9554','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9554 MEMBER','1','15206') +('9555','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',0.00,'0','0',NULL,'TERM','0','0','0',NULL,NULL,'0','"9555 MEMBER','1','15207') +('9556','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9556 MEMBER','1','15208') +('9557','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9557 MEMBER','1','15209') +('9557','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9557 MEMBER','1','15210') +('9557','4','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9557 MEMBER','1','15211') +('9558','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'0','"9558 MEMBER','1','15212') +('7302','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"7302 MEMBER','1','15213') +('5606','1','LASTNAME','FIRSTNAME',999.99,198.33,'0',200.00,'1','0','0','REG','0','0','0',0.00,'0','0','"5606 MEMBER','1','15214') +('1987','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"1987 MEMBER','1','15215') +('9561','2','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9561 MEMBER','1','15216') +('9561','3','LASTNAME','FIRSTNAME',NULL,0.00,'0',20.00,'1','0',NULL,'PC','1','0','0',NULL,NULL,'1','"9561 MEMBER','1','15217') diff --git a/pos/is4c-web/install/data/departments.sql b/pos/is4c-web/install/data/departments.sql new file mode 100644 index 000000000..9a7c5cd85 --- /dev/null +++ b/pos/is4c-web/install/data/departments.sql @@ -0,0 +1,247 @@ +('92','HBHBA','1','0',50.00,0.01,'0','2005-13-12','1') +('104','HHOMEOPATHIC','1','0',50.00,0.01,'0','2005-13-12','1') +('14','BWATER','0','1',50.00,0.01,'0','2005-13-12','1') +('191','GSOBEVNOTAX','0','1',50.00,0.01,'0','2005-13-12','1') +('246','GMSOGENMERCH','1','0',50.00,0.01,'0','2005-13-12','1') +('249','GMSEEDSFLWR','1','0',50.00,0.01,'0','2005-13-12','1') +('247','PTRANSFLWR','1','0',50.00,0.01,'0','2005-13-12','1') +('248','PTRANSEDIBLE','0','1',50.00,0.01,'0','2005-13-12','1') +('250','GMSEEDSEDIBLE','0','1',50.00,0.01,'0','2005-13-12','1') +('1','BBAKING','0','1',50.00,0.01,'0','1900-01-01','1') +('2','BBEAN','0','1',50.00,0.01,'0','1900-01-01','1') +('3','BCEREAL','0','1',50.00,0.01,'0','1900-01-01','1') +('4','BDRIEDFRU','0','1',50.00,0.01,'0','1900-01-01','1') +('5','BFLOUR','0','1',50.00,0.01,'0','1900-01-01','1') +('6','BGRAIN','0','1',50.00,0.01,'0','1900-01-01','1') +('7','BMIXES','0','1',50.00,0.01,'0','1900-01-01','1') +('8','BNUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('10','BPASTA','0','1',50.00,0.01,'0','1900-01-01','1') +('11','BRICE','0','1',50.00,0.01,'0','1900-01-01','1') +('12','BSNACK','0','1',50.00,0.01,'0','1900-01-01','1') +('13','BOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('15','BOIL','0','1',50.00,0.01,'0','1900-01-01','1') +('16','BCANDY','1','1',50.00,0.01,'0','1900-01-01','1') +('17','BCHOC','1','1',50.00,0.01,'0','1900-01-01','1') +('18','BNONFOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('19','BTAXFOOD','1','1',50.00,0.01,'0','1900-01-01','1') +('21','BAGREFUN','0','1',50.00,0.01,'0','1900-01-01','1') +('22','BSOBULK B','0','1',50.00,0.01,'0','1900-01-01','1') +('23','PREPACK','0','1',50.00,0.01,'0','1900-01-01','1') +('24','BSOBULK A','0','1',50.00,0.01,'0','1900-01-01','1') +('25','BSO NONFOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('26','CBUTTER','0','1',50.00,0.01,'0','1900-01-01','1') +('27','CDAIRY','0','1',50.00,0.01,'0','1900-01-01','1') +('28','CEGGS','0','1',50.00,0.01,'0','1900-01-01','1') +('29','CJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('30','CMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('31','CSOY','0','1',50.00,0.01,'0','1900-01-01','1') +('32','CSOYMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('188','GBEVNOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('34','COTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('38','FZBAK','0','1',50.00,0.01,'0','1900-01-01','1') +('39','FZDEZ','0','1',50.00,0.01,'0','1900-01-01','1') +('40','FZENTREE','0','1',50.00,0.01,'0','1900-01-01','1') +('41','FZFRUITVE','0','1',50.00,0.01,'0','1900-01-01','1') +('42','FZJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('261','MEAT FZ','0','1',50.00,0.01,'0','1900-01-01','1') +('44','FZPIZZA','0','1',50.00,0.01,'0','1900-01-01','1') +('45','FZSOY','0','1',50.00,0.01,'0','1900-01-01','1') +('46','FZOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('189','GBEVTAX','1','1',50.00,0.01,'0','1900-01-01','1') +('54','CJUGRETUR','0','1',50.00,0.01,'0','1900-01-01','1') +('55','CSO','0','1',50.00,0.01,'0','1900-01-01','1') +('56','CSOMILK','0','1',50.00,0.01,'0','1900-01-01','1') +('57','FZSO','0','1',50.00,0.01,'0','1900-01-01','1') +('190','GSOBEVTAX','1','1',50.00,0.01,'0','1900-01-01','1') +('59','CCOUPON','0','1',50.00,0.01,'0','1900-01-01','1') +('60','DBAKED','2','0',50.00,0.01,'0','1900-01-01','1') +('63','DCASE','2','0',50.00,0.01,'0','1900-01-01','1') +('64','DPREPACK','2','0',50.00,0.01,'0','1900-01-01','1') +('65','DSANDWICH','2','0',50.00,0.01,'0','1900-01-01','1') +('66','DSOUP','0','0',50.00,0.01,'0','1900-01-01','1') +('67','DSTEAMTAB','2','0',50.00,0.01,'0','1900-01-01','1') +('68','DOTHER','2','0',50.00,0.01,'0','1900-01-01','1') +('69','DBEVERAGE','2','0',50.00,0.01,'0','1900-01-01','1') +('70','DPREPCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('71','DPORTCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('72','DSOCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('73','DSO','2','0',50.00,0.01,'0','1900-01-01','1') +('74','DCOUPON','1','0',50.00,0.01,'0','1900-01-01','1') +('150','DOutsideBakery','0','1',50.00,0.01,'0','1900-01-01','1') +('151','GTEA','0','1',50.00,0.01,'0','1900-01-01','1') +('152','GBABY','0','1',50.00,0.01,'0','1900-01-01','1') +('153','GBAK/MIX','0','1',50.00,0.01,'0','1900-01-01','1') +('154','GBARS','0','1',50.00,0.01,'0','1900-01-01','1') +('155','GCOOK/BKD','0','1',50.00,0.01,'0','1900-01-01','1') +('156','GCANBNVEG','0','1',50.00,0.01,'0','1900-01-01','1') +('157','GCEREAL','0','1',50.00,0.01,'0','1900-01-01','1') +('158','GCHIP','0','1',50.00,0.01,'0','1900-01-01','1') +('159','GCRACK/SN','0','1',50.00,0.01,'0','1900-01-01','1') +('160','GCOND/VIN','0','1',50.00,0.01,'0','1900-01-01','1') +('161','GETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('162','GCANDYNOT','0','1',50.00,0.01,'0','1900-01-01','1') +('163','GGRAIN/RI','0','1',50.00,0.01,'0','1900-01-01','1') +('164','GJAM','0','1',50.00,0.01,'0','1900-01-01','1') +('165','GJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('166','GMILK/POW','0','1',50.00,0.01,'0','1900-01-01','1') +('167','GMIX/PREP','0','1',50.00,0.01,'0','1900-01-01','1') +('168','GNUTBUTTE','0','1',50.00,0.01,'0','1900-01-01','1') +('169','GOIL','0','1',50.00,0.01,'0','1900-01-01','1') +('170','GPASTA','0','1',50.00,0.01,'0','1900-01-01','1') +('171','GPICK/OLI','0','1',50.00,0.01,'0','1900-01-01','1') +('172','GSEAFOOD','0','1',50.00,0.01,'0','1900-01-01','1') +('173','GSALAD/DR','0','1',50.00,0.01,'0','1900-01-01','1') +('174','GSOUPCAN','0','1',50.00,0.01,'0','1900-01-01','1') +('175','GSOUP/PKG','0','1',50.00,0.01,'0','1900-01-01','1') +('176','GSWEETENE','0','1',50.00,0.01,'0','1900-01-01','1') +('177','GTOMATO','0','1',50.00,0.01,'0','1900-01-01','1') +('178','GSO NOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('179','GCANDY','1','1',50.00,0.01,'0','1900-01-01','1') +('180','GCANDYSO','1','1',50.00,0.01,'0','1900-01-01','1') +('181','GHHCLEANR','1','0',50.00,0.01,'0','1900-01-01','1') +('182','GNFPET','1','0',50.00,0.01,'0','1900-01-01','1') +('183','GHHPAPER','1','0',50.00,0.01,'0','1900-01-01','1') +('185','GNFOODSO','1','0',50.00,0.01,'0','1900-01-01','1') +('186','GOTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('251','BCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('252','BDRVEGGIE','0','1',50.00,0.01,'0','1900-01-01','1') +('253','BHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('254','BORGHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('255','BTEA','0','1',50.00,0.01,'0','1900-01-01','1') +('256','BVIT','1','0',50.00,0.01,'0','1900-01-01','1') +('257','BFOOD','0','1',50.00,0.01,'0','1900-01-01','1') +('245','BPKGCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('239','BPACKNOTAX','0','1',50.00,0.01,'0','1900-01-01','1') +('93','HBODYCARE','1','0',50.00,0.01,'0','1900-01-01','1') +('94','HFACIAL','1','0',50.00,0.01,'0','1900-01-01','1') +('95','HBATH','1','0',50.00,0.01,'0','1900-01-01','1') +('96','HHAIR','1','0',50.00,0.01,'0','1900-01-01','1') +('97','HLOTION','1','0',50.00,0.01,'0','1900-01-01','1') +('98','HSOAP','1','0',50.00,0.01,'0','1900-01-01','1') +('99','HTEETH','1','0',50.00,0.01,'0','1900-01-01','1') +('100','HNONTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('101','HVITSUPPL','1','0',50.00,0.01,'0','1900-01-01','1') +('102','HHERB','1','0',50.00,0.01,'0','1900-01-01','1') +('103','HOTHER','1','0',50.00,0.01,'0','1900-01-01','1') +('244','GMBooks','1','0',50.00,0.01,'0','1900-01-01','1') +('258','BSOHERB','0','1',50.00,0.01,'0','1900-01-01','1') +('259','BSOCOFFEE','0','1',50.00,0.01,'0','1900-01-01','1') +('123','HSOBODYCA','1','0',50.00,0.01,'0','1900-01-01','1') +('124','HSOVITHERB','1','0',50.00,0.01,'0','1900-01-01','1') +('125','HSOBHBA','1','0',50.00,0.01,'0','1900-01-01','1') +('243','GMSOBooks','1','0',50.00,0.01,'0','1900-01-01','1') +('127','HSONOTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('128','HCOUPON','1','0',50.00,0.01,'0','1900-01-01','1') +('600','SUPPLIES','0','0',50.00,0.01,'0','1900-01-01','1') +('187','GNONFDNOTAX','0','0',50.00,0.01,'0','1900-01-01','1') +('500','FLOWERS','1','0',50.00,0.01,'0','1900-01-01','1') +('502','PRODUCE KEY','0','1',50.00,0.01,'0','1900-01-01','1') +('604','MISC PO','0','0',50.00,0.01,'0','1900-01-01','1') +('503','BASKETS','0','1',50.00,0.01,'0','1900-01-01','1') +('505','TRANSEDIBLE','1','1',50.00,0.01,'0','1900-01-01','1') +('507','SO TAX','1','0',50.00,0.01,'0','1900-01-01','1') +('200','PFLOWERS','1','1',50.00,0.01,'0','1900-01-01','1') +('201','PFRUIT','0','1',50.00,0.01,'0','1900-01-01','1') +('202','PJUICE','0','1',50.00,0.01,'0','1900-01-01','1') +('203','PNONFOOD','1','1',50.00,0.01,'0','1900-01-01','1') +('204','POTHER','0','1',50.00,0.01,'0','1900-01-01','1') +('205','PREVRACK','1','1',50.00,0.01,'0','1900-01-01','1') +('206','PSO','0','1',50.00,0.01,'0','1900-01-01','1') +('208','PVEGGIE','0','1',50.00,0.01,'0','1900-01-01','1') +('209','PSEEDS','0','1',50.00,0.01,'0','1900-01-01','1') +('210','PRODREVN','0','1',50.00,0.01,'0','1900-01-01','1') +('220','PCOUPON','0','1',50.00,0.01,'0','1900-01-01','1') +('900','GIFTCERT','0','0',50.00,0.01,'0','1900-01-01','1') +('990','ARPAYMEN','0','0',50.00,0.01,'0','1900-01-01','1') +('991','CLASS B Equity','0','0',80.00,0.01,'0','1900-01-01','1') +('700','TOTES','0','0',50.00,0.01,'0','1900-01-01','1') +('508','ASIAN','0','1',50.00,0.01,'0','1900-01-01','1') +('510','BRASSICA','0','1',50.00,0.01,'0','1900-01-01','1') +('703','MISCRECEIPT','0','0',50.00,0.01,'0','1900-01-01','1') +('512','ETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('513','GREENS','0','1',50.00,0.01,'0','1900-01-01','1') +('992','CLASS A Equity','0','0',20.00,0.01,'0','1900-01-01','1') +('61','DOUTDESSERTS','2','0',50.00,0.01,'0','1900-01-01','1') +('62','DCO-OPSHARE','2','0',50.00,0.01,'0','1900-01-01','1') +('225','DGGSALADS','2','0',50.00,0.01,'0','1900-01-01','1') +('226','DGGSANDWICH','2','0',50.00,0.01,'0','1900-01-01','1') +('227','DOLIVES','0','0',50.00,0.01,'0','1900-01-01','1') +('228','DDGGENTREE','2','0',50.00,0.01,'0','1900-01-01','1') +('229','DDESSERT','0','0',50.00,0.01,'0','1900-01-01','1') +('230','DPREPCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('231','DPORCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('232','DFAKECHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('233','DSOCHEESE','0','1',50.00,0.01,'0','1900-01-01','1') +('37','CBEVERAGE','0','1',50.00,0.01,'0','1900-01-01','1') +('35','CYOGURT','0','1',50.00,0.01,'0','1900-01-01','1') +('260','MEAT FRESH','0','1',50.00,0.01,'0','1900-01-01','1') +('242','GMGENERAL','1','0',50.00,0.01,'0','1900-01-01','1') +('902','GIFTCARD','0','0',300.00,0.01,'0','1990-01-01','1') +('234','DVENDORS','0','1',50.00,0.01,'0','1900-01-01','1') +('235','MARKETING SALES','1','0',50.00,0.01,'0','1900-01-01','1') +('501','NON-FOOD','1','0',50.00,0.01,'0','1900-01-01','1') +('240','GMMag','1','0',50.00,0.01,'0','2005-13-11','1') +('241','GMCards','1','0',50.00,0.01,'0','2005-13-11','1') +('262','MeatSOFrsh','0','1',50.00,0.01,'0','2005-13-12','1') +('263','MeatSOFrzn','0','1',50.00,0.01,'0','2005-13-12','1') +('53','CSOButter','0','1',50.00,0.01,'0','2005-13-12','1') +('800','IT Corrections','0','1',9999.00,'-9999.00','0','2006-08-01','1001') +('238','POLDFLOWERS','1','0',50.00,0.01,NULL,'2005-28-03','1') +('708','CLASSES','0','0',50.00,0.01,NULL,'2006-06-04','1001') +('75','DSOBAKED','0','0',50.00,0.01,'0','2006-11-05','1') +('207','PSOTAX','1','1',50.00,0.01,'0','2006-16-06','1') +('610','RRR','0','0',50.00,0.01,'0','2006-24-10','1001') +('76','DDELI MEATS','0','0',50.00,0.01,'0','1900-01-01','1') +('504','TRAYS','1','0',50.00,0.01,'0','1900-01-01','1') +('86','HSEASONAL','1','0',50.00,0.01,'0','2008-10-04','1') +('506','TRANSNONEDIBLE','1','0',50.00,0.01,'0','1900-01-01','1') +('509','BEAN','0','1',50.00,0.01,'0','1900-01-01','1') +('511','CARROTS','0','1',50.00,0.01,'0','1900-01-01','1') +('514','HERBS','0','1',50.00,0.01,'0','1900-01-01','1') +('515','LETTUCE','0','1',50.00,0.01,'0','1900-01-01','1') +('516','MUSHROOMS','0','1',50.00,0.01,'0','1900-01-01','1') +('517','ONIONS','0','1',50.00,0.01,'0','1900-01-01','1') +('518','PEPPERS','0','1',50.00,0.01,'0','1900-01-01','1') +('519','POTATOES','0','1',50.00,0.01,'0','1900-01-01','1') +('520','ROOTS','0','1',50.00,0.01,'0','1900-01-01','1') +('521','SALADS','0','1',50.00,0.01,'0','1900-01-01','1') +('522','SPROUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('523','SQUASH','0','1',50.00,0.01,'0','1900-01-01','1') +('524','TOMATOES','0','1',50.00,0.01,'0','1900-01-01','1') +('525','WSQUASH','0','1',50.00,0.01,'0','1900-01-01','1') +('526','YAMS','0','1',50.00,0.01,'0','1900-01-01','1') +('527','VEGGMISC','0','1',50.00,0.01,'0','1900-01-01','1') +('528','VEGGJAR','0','1',50.00,0.01,'0','1900-01-01','1') +('529','VEGGCUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('540','APPLEBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('541','APPLES','0','1',50.00,0.01,'0','1900-01-01','1') +('542','BERRIES','0','1',50.00,0.01,'0','1900-01-01','1') +('543','CITRUSBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('544','CITRUS','0','1',50.00,0.01,'0','1900-01-01','1') +('545','PEARBAG','0','1',50.00,0.01,'0','1900-01-01','1') +('546','PEARS','0','1',50.00,0.01,'0','1900-01-01','1') +('547','TROPICAL','0','1',50.00,0.01,'0','1900-01-01','1') +('548','NUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('549','ETHNIC','0','1',50.00,0.01,'0','1900-01-01','1') +('550','FIGS','0','1',50.00,0.01,'0','1900-01-01','1') +('551','GRAPES','0','1',50.00,0.01,'0','1900-01-01','1') +('552','FRUITJAR','0','1',50.00,0.01,'0','1900-01-01','1') +('553','FRUITMISC','0','1',50.00,0.01,'0','1900-01-01','1') +('554','FRUITCUTS','0','1',50.00,0.01,'0','1900-01-01','1') +('555','MELONS','0','1',50.00,0.01,'0','1900-01-01','1') +('556','STONEFRUIT','0','1',50.00,0.01,'0','1900-01-01','1') +('557','AVOCADOS','0','1',50.00,0.01,'0','1900-01-01','1') +('535','PRODUCE CORRECTION','0','1',50.00,0.01,'0','2008-02-04','1') +('87','HLIP','1','0',50.00,0.01,'0','2008-10-04','1') +('88','HDEOD','1','0',50.00,0.01,'0','2008-10-04','1') +('89','HAROMATHERPY','1','0',50.00,0.01,'0','2008-10-04','1') +('90','HFIRSTAID','1','0',50.00,0.01,'0','2008-10-04','1') +('91','HKIDSBODY','1','0',50.00,0.01,'0','2008-10-04','1') +('105','HPROTEIN','1','0',50.00,0.01,'0','2008-10-04','1') +('106','HJUICE','1','0',50.00,0.01,'0','2008-10-04','1') +('107','HGREENS','1','0',50.00,0.01,'0','2008-10-04','1') +('108','HKIDSSUPP','1','0',50.00,0.01,'0','2008-10-04','1') +('881','MISC #1','0','0',50.00,0.01,'0','2008-12-08','1') +('882','MISC #2','0','0',50.00,0.01,'0','2008-12-08','1') +('236','MARKETING PROMO','0','0',50.00,0.01,'0','2009-26-01','1') +('77','DSPECIALEVENT','2','0',50.00,0.01,'0','2009-10-09','1') diff --git a/pos/is4c-web/install/data/employees.sql b/pos/is4c-web/install/data/employees.sql new file mode 100644 index 000000000..6de98f697 --- /dev/null +++ b/pos/is4c-web/install/data/employees.sql @@ -0,0 +1,2 @@ +(56,56,56,'Kate','Kipling','STAFF',1,20,20) +(7000,7000,7000,'John','Norton','SUB',1,15,15) diff --git a/pos/is4c-web/install/data/globalvalues.sql b/pos/is4c-web/install/data/globalvalues.sql new file mode 100644 index 000000000..934d1081e --- /dev/null +++ b/pos/is4c-web/install/data/globalvalues.sql @@ -0,0 +1 @@ +(6000,'ADMIN ',0,11,0,0,0) diff --git a/pos/is4c-web/install/data/products.sql b/pos/is4c-web/install/data/products.sql new file mode 100644 index 000000000..7f0ff17a1 --- /dev/null +++ b/pos/is4c-web/install/data/products.sql @@ -0,0 +1,12668 @@ +('0000000000009','NATURE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1') +('0000000000016','This is a test item',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','59','0','0','1','1',0,'0','2008-12-22 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2') +('0000000000040','test',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','1','1','0',0,'mixmatchcode','2009-08-12 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12749') +('0000000000052','RRR','-1.00','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','610','0','0','1','0',0,'0','2006-05-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'3') +('0000000000111','WYNDMERE 5-8 DRAM BOTTLE',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4') +('0000000000112','WYNDMERE 1 DRAM BOTTLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5') +('0000000000113','ALAFFIA BLACK SOAP UNSCENTED',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-08-13 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'6') +('0000000000171','BPISTACHIOS R/S ORG.',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2007-11-28 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'7') +('0000000000200','10% OFF COUPON',2.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'9') +('0000000000205','BBEANS CANNELLINI ORG',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'499','2009-08-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'10') +('0000000000212','BRICE BROWN LONG NON-ORG 25LB',28.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','0',0,'499','2009-09-14 09:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12') +('0000000000213','BRICE BROWN SHORT NON-ORG 25LB',28.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','0',0,'499','2009-09-14 09:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'13') +('0000000000224','BCASHEWS WHOLE RAW NON-ORG',7.99,'0',0.00,'0',6.35,'0',6.35,'0','2009-09-09 12:00:00','2009-09-30 12:00:00','8','0','0','1','1',0,'0','2009-09-09 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','1',0.00,'0','12863') +('0000000000234','SHARPENERS, LIP',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-03-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'14') +('0000000000245','2 OZ BROWN SPICE JAR',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-04-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'15') +('0000000000246','BCLAY BENTONITE',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','0','0','1',0,'499','2009-06-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'16') +('0000000000247','4 OZ BROWN SPICE JAR',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'17') +('0000000000249','BCOFFEE PEACE BIRCHWOOD BLEND',10.19,'0',0.00,'0',7.99,'0',7.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'18') +('0000000000250','SPICE JAR, ASSEMBLED 4OZ',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-04-29 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'19') +('0000000000251','BCOFFEE PEACE FRENCH',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'20') +('0000000000252','BOTTLE+DROPPER, 1 OZ',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'21') +('0000000000253','BTEA RENES ESSIAC',53.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2007-03-21 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'22') +('0000000000254','BTEA IMMUNE BOOSTER',38.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'mixmatchcode','2009-04-14 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'23') +('0000000000255','BCOFFEE PEACE GUATEMALAN DARK',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'24') +('0000000000265','8 OZ BROWN SPICE JAR',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-04-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'25') +('0000000000298','BELBOW MACARONI WHITE NON-O',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2009-06-10 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'26') +('0000000000299','BMACA ROOT POWDER ORG',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-09-14 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','1',0.00,'0','12885') +('0000000000301','BCOCONUT FLAKES NON-ORG',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2009-09-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','1',0.00,'0','12896') +('0000000000302','BALMONDS CALIF RAW ORGANIC',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-09-24 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12984') +('0000000000318','BTEA MRS KELLY ORGANICO MELOGR',38.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-07-23 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'27') +('0000000000319','BTEA MRS KELLY BLUEBRRY ROIBOS',33.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-07-23 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'28') +('0000000000320','BTEA MRS KELLYS GINGER PEACH',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'29') +('0000000000321','BCAROB POWDER OG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-08-25 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'30') +('0000000000326','BSEAFOOD RUB ORG',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-05-19 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'31') +('0000000000327','BCHEESE POWDER NON-O PCRN SEAS',21.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'32') +('0000000000333','BSPIRULINA POWDER ORG',38.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','0','1','1',0,'0','2008-12-02 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'33') +('0000000000334','BCURRY MUCHI NON-ORG',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'499','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'34') +('0000000000336','BCHUNKS OF ENERGY RAW CACAO GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2009-05-15 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'35') +('0000000000337','BVITAMIN C POWDER',24.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','0','1','1',0,'0','2008-12-03 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'36') +('0000000000338','BPEANUT BUTTER ORG',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-09-26 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'37') +('0000000000339','BHONEY',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-11-10 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'38') +('0000000000340','BLENTILS FRENCH ORG',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'39') +('0000000000341','BRICE ARBORIO ORG',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'40') +('0000000000342','BALMOND BUTTER ORGANIC',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'499','2009-09-22 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'41') +('0000000000343','BGOJI BERRIES',16.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'499','2009-06-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'42') +('0000000000344','BGRANOLA HONEY GONE NUTS',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'43') +('0000000000345','BCELERY SALT ORG',12.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'44') +('0000000000346','BALMONDS CALIF RSTD-SLTD NON-O',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'45') +('0000000000348','BCHUNKS OF ENERGY ORG CAROB',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-09-23 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'46') +('0000000000349','BRICE JASMINE BROWN ORG',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'499','2009-06-16 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'47') +('0000000000351','BREFRIED BEANS',5.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'48') +('0000000000352','BCHILI MIX VEGETARIAN CAMPING',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'49') +('0000000000353','BFALAFEL MIX',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'50') +('0000000000354','BGARLIC POWDER ORG',15.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'51') +('0000000000355','BPEANUTS RAW BLANCHED 5# BAG',12.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','0',0,'499','2009-04-23 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'52') +('0000000000356','BTACO MIX',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2008-07-14 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'53') +('0000000000357','BPINENUTS',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'499','2009-06-18 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'54') +('0000000000358','BKELP POWDER OG',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','0','1','1',0,'499','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'55') +('0000000000359','BAPPLES DRIED ORGANI',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'56') +('0000000000360','BGRANOLA GINGER ZING ORG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'57') +('0000000000361','BAPRICOTS TURKISH ORG',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'58') +('0000000000362','BBANANA CHIPS',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'499','2009-04-24 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'59') +('0000000000363','BCRANBERRIES DRIED ORGANIC FJS',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'mixmatchcode','2009-02-06 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'60') +('0000000000364','BCURRANTS OG',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'61') +('0000000000366','BDATES ORGANIC MEDJOOL',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-06-13 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'62') +('0000000000367','BDATES PITTED DEGLET ORG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-12-16 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'63') +('0000000000368','BFIGS BLACK ORG',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'mixmatchcode','2009-04-09 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'64') +('0000000000369','BFIGS WHITE ORGANIC',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'mixmatchcode','2009-02-06 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'65') +('0000000000371','BPAPAYA SPEARS',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'499','2009-05-28 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'66') +('0000000000372','BPUMPKIN SEED SPICY ORG',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'67') +('0000000000373','BMANGO DRIED ORGANIC',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-06-10 09:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'68') +('0000000000374','BPINEAPPLE DRIED ORGANIC',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-02-08 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'69') +('0000000000376','BPRUNES ORGANIC',6.99,'0',0.00,'0',5.59,'0',5.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','4','0','0','1','1',0,'0','2007-12-10 01:05:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'70') +('0000000000378','BRAISINS BIODYNAMIC ORG',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-10-29 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'71') +('0000000000379','BALFALFA SEEDS ORG',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-02 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'72') +('0000000000380','BLECITHIN GRANULES NON-GMO',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'499','2009-07-22 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'73') +('0000000000381','BPOPPY SEEDS ORGANIC',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'mixmatchcode','2009-02-20 09:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'74') +('0000000000383','BSESAME SEEDS WHITE ORG',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'499','2009-06-02 09:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'75') +('0000000000385','BWHEAT GERM',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'499','2009-06-26 09:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'76') +('0000000000386','BYEAST BAKING',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'77') +('0000000000387','BKELP GRANULES OG',14.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'78') +('0000000000388','BECHINACEA ROOT ORG',41.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2005-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'79') +('0000000000389','BGRANOLA VANILLA MACAROON',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-03-17 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'80') +('0000000000390','BGLAD CORN',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'81') +('0000000000391','BPOLENTA ORGANIC',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2007-08-29 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'82') +('0000000000392','BGRANOLA WHEAT FREE SALT FREE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-01-14 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'83') +('0000000000393','BPASTA ELBOWS WW ORGANIC',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'499','2009-05-08 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'84') +('0000000000394','BSUGAR ORG FAIR TRADE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'85') +('0000000000395','BSPAGHETTI',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-09-19 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'86') +('0000000000396','BGRANOLA ORANGE-ALMOND',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'87') +('0000000000397','BHEMPSEEDS SHELLED',15.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'88') +('0000000000398','BOIL OLIVE ORG NAPA VALLEY',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','15','0','0','1','1',0,'0','2008-08-18 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'89') +('0000000000399','BPORRIDGE ORGANIC',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-06-20 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'90') +('0000000000401','BPECANS ORGANIC',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'499','2009-07-23 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'91') +('0000000000402','BAMARANTH',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'92') +('0000000000403','BFLOUR QUINOA ORG',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'499','2009-04-29 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'93') +('0000000000404','BSPAGHETTI WW ORG',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-09-19 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'94') +('0000000000405','BSPAGHETTI WW SPINACH ORG',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-06-16 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'95') +('0000000000406','BFLOUR WHOLE WHEAT ORG',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'96') +('0000000000407','BFLOUR RICE BROWN ORG',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'97') +('0000000000408','BFLOUR BUCKWHEAT ORG',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'98') +('0000000000409','BCORN MEAL ORGANIC',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-02-12 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'99') +('0000000000410','BGLUTEN',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-03-11 11:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'100') +('0000000000411','BFLOUR GOLD N WHITE ORG',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'101') +('0000000000412','BOIL CANOLA ORG',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','15','0','0','1','1',0,'0','2008-08-26 08:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'102') +('0000000000413','BOIL OLIVE ORG SPECTRUM BRAND',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','15','0','0','1','1',0,'0','2008-10-06 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'103') +('0000000000414','BBRAN OAT ORGANIC',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'104') +('0000000000415','BALMONDS CALIF RSTD/NO-SALT NO',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'105') +('0000000000416','BFLOUR RYE ORG',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-03-17 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'106') +('0000000000417','BFLOUR SEMOLINA ORG',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'107') +('0000000000418','BFLOUR SPELT WHOLE ORG',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'108') +('0000000000419','BFLOUR TAPIOCA',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'109') +('0000000000420','BWHEAT BRAN ORG',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-12-04 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'110') +('0000000000421','BBEANS LIMA ORG',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'111') +('0000000000422','BFLOUR ALL PURPOSE WHITE ORG',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'112') +('0000000000423','BFLOUR SWEET RICE',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'499','2009-07-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'113') +('0000000000424','BSUGAR POWDERED',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'114') +('0000000000425','BFLOUR WW PASTRY ORG',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'115') +('0000000000426','BCAROB CHIPS',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','1','1','1',0,'0','2008-07-02 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'116') +('0000000000427','BCHOCOLATE CHIPS SEMI SWEET',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','1','1','1',0,'mixmatchcode','2009-02-17 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'117') +('0000000000428','BFLOUR OAT ORG',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-03-17 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'118') +('0000000000430','BMAPLE SYRUP NON-OG LOCAL',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'499','2009-05-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'119') +('0000000000431','BCOCONUT ORG',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'120') +('0000000000432','BPRETZELS PEANUT BUTTER',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','0','1','1',0,'0','2008-12-11 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'121') +('0000000000433','BSALT SEA',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-04-01 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'122') +('0000000000434','BSUGAR BROWN',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'123') +('0000000000435','BFRUCTOSE',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2009-09-18 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','1',0.00,'0','12944') +('0000000000437','BSUGAR WHITE',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'124') +('0000000000438','BSUCANAT OG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'125') +('0000000000439','BBARLEY FLAKES',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'126') +('0000000000440','BOATMEAL QUICK ORG',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'mixmatchcode','2009-02-12 11:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'127') +('0000000000441','BTAMARI ORGANIC',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'128') +('0000000000442','BOATMEAL REGULAR ORG',1.29,'0',0.00,'0',0.99,'0',0.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','6','0','0','1','1',0,'mixmatchcode','2009-02-12 11:03:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'129') +('0000000000443','BOATMEAL THICK ORG',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'mixmatchcode','2009-02-12 11:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'130') +('0000000000444','BRAISINS CAROB UNSWEETENED',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'131') +('0000000000445','BSESAME STICKS PLAIN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-06-13 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'132') +('0000000000446','BMUESLI RASPBERRY OG',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-04-14 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'133') +('0000000000447','BBARLEY HULLED ORGAN',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'134') +('0000000000448','BBUCKWHEAT GROATS OG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'499','2009-07-22 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'135') +('0000000000449','BGRANOLA GOLDEN FLAX CRUNCH OG',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-08-26 08:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'136') +('0000000000450','BRAISINS MILK CHOCOLATE ORG',11.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'137') +('0000000000451','BCOUSCOUS MIDDLE EASTERN NON-O',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-02-06 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'138') +('0000000000452','BFLAXSEED MEAL GOLDEN',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'139') +('0000000000453','BMILLET HULLED ORGAN',1.15,'0',0.00,'0',0.99,'0',0.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','6','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'140') +('0000000000454','BOATS STEELCUT ORG',1.19,'0',0.00,'0',0.99,'0',0.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','6','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'141') +('0000000000455','BPOPCORN YELLOW ORG',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'142') +('0000000000456','BRYE BERRIES ORGANIC',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'143') +('0000000000457','BCASHEW WHOLE RSTD-SLTD ORG',8.69,'0',0.00,'0',6.95,'0',6.95,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','8','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'144') +('0000000000458','BWHEAT BERRIES ORG',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-06-16 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'145') +('0000000000459','BWHEAT CRACKED ORG',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'146') +('0000000000460','BRICE BASMATI BROWN ORG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-03-17 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'147') +('0000000000461','BRICE BASMATI WHITE ORG',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-03-17 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'148') +('0000000000462','BRICE SWEET BROWN ORG',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'149') +('0000000000463','BRICE LONG BROWN ORG',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'150') +('0000000000464','BRICE SHORT BROWN ORG',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'151') +('0000000000465','BFUSILLI WW ORG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-09-19 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'152') +('0000000000466','BRICE LONG WHITE ORG',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'499','2009-08-31 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'153') +('0000000000467','BGRANOLA CHERRY VANILLA',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-03-17 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'154') +('0000000000468','BGRANOLA RASPBERRY AND CREAM',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'155') +('0000000000469','BANIMAL COOKIES',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'156') +('0000000000470','BTRAIL MIX GO TAKE A HIKE ORG',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'mixmatchcode','2009-02-04 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'157') +('0000000000471','BGRANOLA FLAX PLUS ORG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'158') +('0000000000472','BTSP ORGANIC',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'499','2009-07-22 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'159') +('0000000000473','BALMONDS CHOCOLATE',12.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'160') +('0000000000474','BORZO VEGGIE ORGANIC',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'161') +('0000000000475','BNUT MIX R/NS DELUXE',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'162') +('0000000000476','BMALTBALLS',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2008-06-16 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'163') +('0000000000477','BHOKEY POKEY',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'164') +('0000000000478','BPEANUTS BLANCHED R/S NON-O',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'165') +('0000000000479','BFLOUR BAKERS CHOICE ORG',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'166') +('0000000000480','BRAISINS YOGURT',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2007-05-24 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'167') +('0000000000481','BALMONDS SLIVERED NON-O',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'168') +('0000000000482','BCINNAMON POWDER ORGANIC',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'169') +('0000000000483','BALMONDS SLICED NON-O',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'170') +('0000000000484','BALMONDS RAW ITALIAN ORG',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'499','2009-06-22 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'171') +('0000000000485','BALMONDS CALIF RAW NON-O',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'172') +('0000000000486','BPEANUTS SPANISH R/S NON-O',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'173') +('0000000000487','BRAISINS GOLDEN HUNZA ORG',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'mixmatchcode','2009-03-06 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'174') +('0000000000488','BALMONDS ITAL TAMARI-RSTD ORG',11.95,'0',0.00,'0',8.35,'0',8.35,'0','2009-09-25 12:00:00','2010-09-01 12:00:00','8','0','0','1','1',0,'499','2009-06-22 12:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'175') +('0000000000489','BBRAZIL NUTS ORG',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-12-11 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'176') +('0000000000490','BPEANUTS BUTTER TOFFEE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'177') +('0000000000491','BCASHEW WHOLE RAW ORG',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'178') +('0000000000492','BCASHEW PIECES RSTD-SLTD NON-O',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'179') +('0000000000493','BFILBERTS RAW OG aka hazelnuts',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-05-12 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'180') +('0000000000495','BPECANS NONORGANIC',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'181') +('0000000000496','BBANANAS DRIED RED ORG',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-04-29 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'182') +('0000000000497','BGRANOLA STRAWBERRY-RASPBERRY',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-10-06 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'183') +('0000000000498','BTRAIL MIX DELUXE ORGANIC',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'mixmatchcode','2009-02-04 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'184') +('0000000000500','BTRAIL MIX RSTD-SLTD NON-O',5.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'185') +('0000000000501','BRAISINS FLAME ORG',2.99,'0',0.00,'0',2.39,'0',2.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','4','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'186') +('0000000000502','BSUNDROPS PLAIN',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2008-01-31 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'187') +('0000000000503','BNUT MIX R/S DELUXE',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-05-16 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'188') +('0000000000504','BPARSLEY ORGANIC',28.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'189') +('0000000000505','BTRAIL MIX NUTTY AS WALTER',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'mixmatchcode','2009-02-04 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'190') +('0000000000507','BSUNFLOWER SEEDS RS',2.55,'0',0.00,'0',1.99,'0',1.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','8','0','0','1','1',0,'0','2008-06-11 01:04:00','1',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'191') +('0000000000508','BRICE GOLDEN ROSE ORG',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'192') +('0000000000509','BYEAST FLAKES, NUTRITIONAL',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','19','0','0','1','1',0,'mixmatchcode','2009-09-25 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'193') +('0000000000510','BAPPLE CIDER VINEGAR RAW',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-02-08 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'194') +('0000000000511','BBAKING POWDER, ALUMINUM FREE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-12-02 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'195') +('0000000000512','BTRAIL MIX CRANBERRY HARVEST',9.29,'0',0.00,'0',7.45,'0',7.45,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','12','0','0','1','1',0,'mixmatchcode','2009-02-04 01:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'196') +('0000000000513','BSUNFLOWER SEEDS RAW ORG',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'197') +('0000000000514','BSESAME STICKS CAJUN',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'198') +('0000000000515','BBAKING SODA',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'0','2008-12-04 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'199') +('0000000000516','BCORNSTARCH ORGANIC',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'200') +('0000000000519','BBAY LEAVES ORGANIC',24.55,'0',0.00,'0',17.19,'0',17.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'0','2007-10-08 01:03:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'201') +('0000000000521','BCUMIN SEED POWDER ORG',23.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-11 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'202') +('0000000000522','BCASHEW PIECES RSTD-SLTD ORG',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-03-17 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'203') +('0000000000523','BPEPPER BLACK MED GROUND ORG',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'204') +('0000000000524','BCACAO NIBS',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2007-05-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'205') +('0000000000525','BBEANS FAVA',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'499','2009-07-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'206') +('0000000000526','BOATSTRAW C/S ORGANIC',18.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-02-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'207') +('0000000000527','BMARSHMALLOW ROOT C/S ORGANIC',30.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'208') +('0000000000529','BCEREAL 7 GRAIN ORG',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'209') +('0000000000530','BGRANOLA CASHEW CRUNCH',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'499','2009-06-12 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'210') +('0000000000533','BGRANOLA MAPLE ALMOND',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'499','2009-05-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'211') +('0000000000535','BPANCAKE MIX ORGANIC',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'212') +('0000000000536','BGARLIC GRANULES ORG',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'213') +('0000000000537','BCHOCOLATE CHIPS GRAIN SWT',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','1','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'214') +('0000000000538','BALFALFA LEAF ORG',17.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-06-13 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'215') +('0000000000539','BALLSPICE WHOLE ORG',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'216') +('0000000000540','BALLSPICE GROUND ORG',33.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'217') +('0000000000541','BANISE STAR ORG',32.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2006-09-20 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'218') +('0000000000542','BCOFFEE PEACE SUMATRAN ITALIAN',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'mixmatchcode','2009-02-23 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'219') +('0000000000545','BPUMPKIN PIE SPICE ORG',19.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2005-06-06 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'220') +('0000000000547','BBASIL ORG',25.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-19 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'221') +('0000000000548','BGRANOLA HEMP PLUS ORG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'222') +('0000000000551','BDATES CHOPPED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-06-03 11:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'223') +('0000000000552','BCALENDULA FLOWER ORG',20.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'224') +('0000000000553','BCARAWAY SEED ORG',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'mixmatchcode','2009-01-30 10:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'225') +('0000000000554','BCATNIP ORG',27.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-19 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'226') +('0000000000555','BCARDAMOM SEEDS ORG',40.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-09 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'227') +('0000000000556','BCARDAMOM POWDER ORG',46.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-09 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'228') +('0000000000557','BCAYENNE',11.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'229') +('0000000000558','BBROTH CHICKEN-FLAVORED ORG',20.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-03-24 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'230') +('0000000000559','BCELERY SEED ORG',21.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-15 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'231') +('0000000000560','BPUMPKIN SEED RAW ORG',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-12-23 08:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'232') +('0000000000561','BCHAMOMILE ORG',30.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'233') +('0000000000562','BPUMPKIN SEED RAW NON-ORG',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'mixmatchcode','2009-04-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'234') +('0000000000563','BCHIVES ORG',85.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2006-09-20 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'235') +('0000000000565','BCHILI PEPPERS CRUSHED RED ORG',25.89,'0',0.00,'0',18.15,'0',18.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'0','2008-12-02 01:01:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'236') +('0000000000566','BCHILI POWDER ORG',25.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'237') +('0000000000568','BCHILI POWDER FIESTA NON-O',14.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'238') +('0000000000569','BCHILI POWDER HOT NON-O',13.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-12-09 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'239') +('0000000000570','BCILANTRO LEAF ORG',34.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-15 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'240') +('0000000000571','BCINNAMON STICKS 3inch ORG',44.89,'0',0.00,'0',31.45,'0',31.45,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'0','2008-12-09 12:00:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'241') +('0000000000572','BCINNAMON CHIPS ORG',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-09 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'242') +('0000000000575','BCASHEW PIECES RAW ORG',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'243') +('0000000000577','BCOMFREY LEAF ORG',22.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'244') +('0000000000578','BTEA JASMINE GREEN ORG',40.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'245') +('0000000000579','BDANDELION ROOT ORG',25.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'246') +('0000000000580','BCHEESE POWDER ORG',20.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-04 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'247') +('0000000000582','BCORIANDER SEED POWDER ORG',17.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'248') +('0000000000583','BCORIANDER SEED WHOLE ORG',15.65,'0',0.00,'0',10.95,'0',10.95,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:03:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'249') +('0000000000584','BTEA MRS KELLYS GREEN MANGO',29.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'250') +('0000000000586','BSOYNUTS OG',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'251') +('0000000000587','BDILL SEED ORG',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'252') +('0000000000588','BDILL WEED ORG',29.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'253') +('0000000000590','BSALAD SPRINKLE',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'254') +('0000000000591','BEUCALYPTUS LEAF ORG',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2004-10-15 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'255') +('0000000000592','BFENNEL SEED ORG',14.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'256') +('0000000000593','BFENNEL GR ORG',19.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2007-03-21 07:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'257') +('0000000000594','BFENUGREEK ORG',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-01-31 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'258') +('0000000000596','BHERBS DE PROVINCE',23.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2007-03-21 07:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'259') +('0000000000597','BGARAM MASALA ORG',30.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'260') +('0000000000599','BGARLIC SALT ORG',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2005-02-10 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'261') +('0000000000600','BTEA CEYLON OG FT',33.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'262') +('0000000000601','BTEA BANCHA GREEN ORG',24.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-12-02 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'263') +('0000000000602','BPEAS GREEN SPROUTING ORG',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'499','2009-07-30 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'264') +('0000000000603','BEGG POWDER, ORG',28.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'265') +('0000000000604','BGINGER CRYSTALLIZED PIECES OG',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'499','2009-05-04 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'266') +('0000000000605','BEGG NOODLES',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2007-11-28 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'267') +('0000000000606','BSAVORY SEASONING',25.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2007-03-21 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'268') +('0000000000607','BBROTH BEEF-FLAVORED NON-O',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-02 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'269') +('0000000000609','BCHIA SEEDS aka salba',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-09 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'270') +('0000000000612','BITALIAN SEASONING,ORG',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-02 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'271') +('0000000000613','BJUNIPER BERRY ORG',22.29,'0',0.00,'0',15.65,'0',15.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'0','2004-12-17 11:04:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'272') +('0000000000614','BLAVENDER',35.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'273') +('0000000000616','BCARDAMOM PODS ORG',47.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-09 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'274') +('0000000000617','BLEMON PEEL GRANULES ORG',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'0','2004-12-17 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'275') +('0000000000618','BPEPPER LEMON ORG',22.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-07-08 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'276') +('0000000000619','BLICORICE ROOT C/S ORG',29.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-15 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'277') +('0000000000620','BMACE POWDER ORG',33.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-04-29 11:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'278') +('0000000000621','BMARJORAM ORG',15.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'279') +('0000000000623','BNUTMEG WHOLE ORG FAIR TRADE',43.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-07-16 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'280') +('0000000000624','BNUTMEG GROUND ORG FAIR TRADE',43.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-22 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'281') +('0000000000627','BMUSTARD YEL PWD,ORG',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'282') +('0000000000628','BMUSTARD YELLOW WHOLE ORG',10.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'283') +('0000000000629','BMUSTARD BROWN WHOLE ORG',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'284') +('0000000000630','BTRAIL MIX MASTER ZEN PARTY',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'mixmatchcode','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'285') +('0000000000631','BORANGE PEEL GRANULES ORG',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'0','2008-12-09 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'286') +('0000000000632','BONION POWDER ORG',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'287') +('0000000000635','BONION SALT ORG',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-05-14 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'288') +('0000000000636','BONION FLAKES ORG',17.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-01-31 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'289') +('0000000000637','BOREGANO ORG',26.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'290') +('0000000000639','BPICKLING SPICE ORG',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-20 08:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'291') +('0000000000640','BPIZZA SEASONING ORG',29.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2004-12-17 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'292') +('0000000000641','BPAU DARCO',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'293') +('0000000000642','BPAPRIKA ORG',19.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-11 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'294') +('0000000000643','BPAPRIKA HUNGARIAN',17.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'295') +('0000000000644','BCHILI PEPPERS ANCHO NON-O',27.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-12-04 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'296') +('0000000000645','BCHIPOLTLE CHILIS WHOLE',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2004-12-09 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'297') +('0000000000646','BPAPRIKA SMOKED ORG',26.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-04-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'298') +('0000000000647','BPEPPER WHITE GROUND ORG FT',32.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-07-20 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'299') +('0000000000648','BECHINACEA HERB C/S ORG',17.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'300') +('0000000000650','BPEPPERCORNS WHITE WHOLE ORG',29.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'301') +('0000000000651','BPEPPERMINT LEAF ORG',21.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'302') +('0000000000654','BBURDOCK ROOT ORG',21.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'303') +('0000000000655','BRASPBERRY LEAF ORG',23.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'304') +('0000000000656','BMULLING SPICE CITRUS NON-ORG',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-10-21 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'305') +('0000000000657','BROSEHIPS ORG',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'306') +('0000000000658','BROSEMARY LEAF WHOLE ORG',15.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'307') +('0000000000659','BROSEMARY PWD ORG',15.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2005-02-20 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'308') +('0000000000660','BSAGE RUBBED ORG',24.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'309') +('0000000000661','BSAGE POWDER ORG',27.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-09 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'310') +('0000000000662','BALMOND TAMARI-RSTD CALIF ORG',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'311') +('0000000000663','BCOCOA DRINK MIX ORG',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-09 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'312') +('0000000000664','BFLOUR SPELT WHITE ORG',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-01-09 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'313') +('0000000000665','BSLIPPERY ELM BARK POWDER ORG',55.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-15 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'314') +('0000000000666','EXTRA BAG',0.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','13','0','1','0','0',0,'0','2008-12-10 03:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'315') +('0000000000667','BSPEARMINT LEAF ORG',20.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'316') +('0000000000668','BTACO SEASONING ORG',26.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'317') +('0000000000669','BTARRAGON LEAF ORG',49.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-15 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'318') +('0000000000670','BPISTACHIOS RAW NO-SALT ORG',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'mixmatchcode','2009-03-06 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'319') +('0000000000672','BTURMERIC ORG FAIR TRADE',15.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-07-09 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'320') +('0000000000673','BVALERIAN ROOT ORG',25.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'321') +('0000000000675','BGRANOLA PISTACHIO MULBERRY OG',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'mixmatchcode','2009-02-06 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'322') +('0000000000676','BNATURES BURGER MIX',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'323') +('0000000000677','BKAMUT',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'324') +('0000000000678','BTEA MRS KELLYS MARKET MINT',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'325') +('0000000000681','BSALT, COARSE SEA',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-01-22 08:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'326') +('0000000000682','BTEA INDIAN SPICE',24.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-12-02 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'327') +('0000000000683','BMULLING SPICE CIDER MATE ORG',17.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2007-12-28 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'328') +('0000000000684','BLEMONADE MIX',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'329') +('0000000000685','BCITRIC ACID',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-03 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'330') +('0000000000686','BBACUN BITS ORG',16.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'331') +('0000000000689','BGRANOLA BLUEBERRY',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2007-11-28 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'332') +('0000000000690','BCHERRIES ORG',18.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'333') +('0000000000691','BSOUP AND DIP MIX ONION ORG',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'499','2009-04-27 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'334') +('0000000000694','BBROTH VEGGIE ORG LOW-SODIUM',15.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'499','2009-07-20 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'335') +('0000000000696','BBLUEBERRIES ORG JUICE SWEETND',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'mixmatchcode','2009-02-10 04:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'336') +('0000000000699','BSOUP MIX CURRY LENTIL',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2008-03-24 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'337') +('0000000000700','BTOMATO POWDER OG',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'499','2009-06-11 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'338') +('0000000000701','BSOUP MIX VEGETABLE ORG',17.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'499','2009-06-11 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'339') +('0000000000704','BPEPPER BELL DRIED ORG',33.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'0','2004-12-17 11:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'340') +('0000000000706','BCORN SWEET WHOLE',18.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','252','0','0','1','1',0,'0','2004-12-17 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'341') +('0000000000707','BPROTEIN POWDER NON-GMO SOY',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','19','0','1','1','1',0,'0','2008-12-05 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'342') +('0000000000708','BGRANOLA TOASTED ALL-GRAIN',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'499','2009-05-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'343') +('0000000000709','BBEE POLLEN',24.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','1','0','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'344') +('0000000000711','BFLAX SEED BROWN ORG',1.75,'0',0.00,'0',1.49,'0',1.49,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'345') +('0000000000713','BALUM',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2005-02-20 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'346') +('0000000000714','BARROWROOT POWDER',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'499','2009-05-19 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'347') +('0000000000715','BCREAM OF TARTAR POWDER',17.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'348') +('0000000000716','BFLAX SEED GOLDEN ORGANIC',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'349') +('0000000000717','BTAPIOCA PEARLS ORG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-04 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'350') +('0000000000722','BRAISINS THOMPSON ORG',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2009-01-30 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'351') +('0000000000723','BBEANS BLACK ORG',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-10-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'352') +('0000000000724','BBEANS GARBANZO ORG',1.89,'0',0.00,'0',1.69,'0',1.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','2','0','0','1','1',0,'0','2008-10-06 01:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'353') +('0000000000725','BBEANS GREAT NORTHERN ORG',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'354') +('0000000000726','BBEANS KIDNEY ORG',2.25,'0',0.00,'0',1.99,'0',1.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','2','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'355') +('0000000000727','BBEANS ADZUKI ORG',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2009-03-11 11:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'356') +('0000000000728','BFLOUR SIR GALAHAD ARTISAN',0.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'mixmatchcode','2009-03-17 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'357') +('0000000000729','BSESAME SEEDS BLACK ORG',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-10-16 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'358') +('0000000000730','BBEANS NAVY ORG',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'359') +('0000000000731','BBEANS PINTO ORG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-10-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'360') +('0000000000732','BBEANS RED ORG',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-06-05 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'361') +('0000000000733','BBEANS SOY ORG',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'362') +('0000000000734','BPEAS YELLOW SPLIT ORG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'363') +('0000000000735','BPEAS GREEN SPLIT ORG',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'364') +('0000000000736','BPEAS BLACKEYE ORG',1.89,'0',0.00,'0',1.69,'0',1.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','2','0','0','1','1',0,'0','2008-10-06 01:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'365') +('0000000000737','BPEAS YELLOW WHOLE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'mixmatchcode','2009-02-02 10:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'366') +('0000000000738','BLENTILS GREEN ORG',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'367') +('0000000000739','BLENTILS RED ORGANIC',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'368') +('0000000000744','BSARSAPARILLA',14.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-04-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'369') +('0000000000745','BCOCOA POWDER DUTCH OG FT',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','1',0,'499','2009-07-14 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'370') +('0000000000746','BYELLOWDOCK ROOT',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-04-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'371') +('0000000000748','BBEET POWDER ORG',34.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'372') +('0000000000749','BBEANS MUNG ORG',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','2','0','0','1','1',0,'0','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'373') +('0000000000750','BCOFFEE EQUAL EXCHANGE DECAF',13.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'374') +('0000000000753','BWASABI PEAS',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-05-01 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'375') +('0000000000756','BGARLIC FLAKES ORGANIC',18.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-12-04 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'376') +('0000000000757','BTEA ASSAM OG FT',30.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'499','2009-06-19 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'377') +('0000000000758','BWATER FIVE GALLON COOLER',18.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','1','0','0',0,'0','2008-02-04 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'378') +('0000000000759','BWATER THREE GALLON COOLER',17.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','1','0','0',0,'0','2008-09-05 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'379') +('0000000000760','BPEPPERCORNS BLACK OG FAIR TRA',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-18 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'380') +('0000000000761','BPEPPERCORN BLEND SMOKED OG',21.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-06-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'381') +('0000000000764','BCOFFEE PEACE DECAF',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'382') +('0000000000769','BCOFFEE PEACE ETHIOPIAN',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-10-21 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'383') +('0000000000770','BCOFFEE PEACE BLENDO SUAVE',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'384') +('0000000000771','BCOFFEE ALAKEF PERU',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'385') +('0000000000772','BCOFFEE ALAKEF FRENCH',12.19,'0',0.00,'0',9.75,'0',9.75,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'386') +('0000000000773','BCOFFEE ALAKEF BREAKFAST BLEND',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'387') +('0000000000774','BCOFFEE PEACE GUATEMALAN LIGHT',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'388') +('0000000000775','BCOFFEE ALAKEF ITALIAN',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'389') +('0000000000776','BCOFFEE ALAKEF ESPRESSO',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'390') +('0000000000777','BCOFFEE PEACE MEXICAN DARK',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'391') +('0000000000779','BCOFFEE PEACE NICARAGUAN',10.19,'0',0.00,'0',7.99,'0',7.99,'0','2009-08-25 12:00:00','2009-09-30 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'392') +('0000000000780','BCOFFEE ALAKEF SCANDINAVIAN',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'393') +('0000000000781','BCOFFEE EQUAL EXCHANGE ETHIOPI',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'394') +('0000000000782','BCOFFEE ALAKEF SUMATRA',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'395') +('0000000000783','BCOFFEE ALAKEF WFC BLEND',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'396') +('0000000000784','BCOFFEE EQUAL EXCHANGE FRENCH',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'397') +('0000000000786','BCOFFEE PEACE YETI COLD PRESS',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'499','2009-06-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'398') +('0000000000787','BCURRY POWDER ORG',20.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-11 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'399') +('0000000000788','BCOFFEE EQUAL LOVE BUZZ',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'400') +('0000000000789','BCOFFEE EQUAL MIDNIGHT SUN',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'401') +('0000000000790','BCOFFEE EQUAL EXCHANGE COLOMBI',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'402') +('0000000000791','BCOFFEE EQUAL BREAKFAST BLEND',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'403') +('0000000000792','BCOFFEE EQUAL MIND BODY SOUL',10.49,'0',0.00,'0',7.99,'0',7.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'404') +('0000000000793','BCOFFEE PEACE TWIN CITIES BLEN',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-12-05 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'405') +('0000000000794','BDULSE FLAKES OG',21.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','1','0','1',0,'0','2007-08-09 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'406') +('0000000000795','BBARLEY GRASS POWDER ORG',31.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','1','0','1',0,'499','2009-07-08 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'407') +('0000000000796','BWHEAT GRASS POWDER ORG',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','1','0','1',0,'0','2008-12-04 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'408') +('0000000000797','BCOFFEE EQUAL COOP BLEND OG FT',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'409') +('0000000000798','BCOFFEE PEACE HEAVY PEDAL COLO',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'410') +('0000000000799','BWATER JUG EMPTY ONE GALLON',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','1','0','0',0,'0','2006-01-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'411') +('0000000000800','BWATER JUG GALLON BLUE PLASTIC',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','0','1','0',0,'0','2007-04-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'412') +('0000000000801','BCACAO POWDER RAW ORG',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'499','2009-07-08 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'413') +('0000000000803','BWATERMELON DRIED OG REPACK',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-10-02 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'414') +('0000000000804','BSALSA MIX PICANTE',9.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2007-05-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'415') +('0000000000805','BCASHEWS MAPLE COATED NON-ORG',12.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'499','2009-05-19 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'416') +('0000000000807','BAPRICOTS CALIFORNIA ORG',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','2008-10-07 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'417') +('0000000000808','BPOULTRY RUB ORG',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2007-11-27 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'418') +('0000000000809','BTEA GUNPOWDER PEARL MINT',20.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-10-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'419') +('0000000000811','BPSYLLIUM HUSK ORG',21.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','2008-02-06 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'420') +('0000000000812','BMILK THISTLE SEED ORG',22.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'421') +('0000000000813','BCHOC MILK CHIPS',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','1','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'422') +('0000000000814','BCOFFEE EQUAL EXCHANG ESPRESSO',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'423') +('0000000000815','BPOPCORN WHITE ORG',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'424') +('0000000000816','BCHOCOLATE CHIPS DARK OG FT',8.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','1','1','1',0,'0','2008-06-13 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'425') +('0000000000817','BMEGA GREEN MIX ORGANIC',35.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','1','0','1',0,'0','2008-11-17 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'426') +('0000000000818','BCASHEW CURRY ORG',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'mixmatchcode','2009-02-24 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'427') +('0000000000819','BQUINOA FLAKES ORG',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'mixmatchcode','2009-02-03 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'428') +('0000000000824','BHOPS ORG',58.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-19 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'429') +('0000000000825','BLEMONGRASS',16.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-01-16 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'430') +('0000000000826','BFLOUR MALTED WHEAT',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'499','2009-08-11 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'431') +('0000000000827','BQUINOA OG',3.69,'0',0.00,'0',2.95,'0',2.95,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','6','0','0','1','1',0,'0','2008-11-18 01:02:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'432') +('0000000000828','BFLOUR WHITE WHOLE WHEAT',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-05-05 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'433') +('0000000000829','BGUMMY CUBS ORGANIC',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2009-04-14 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'434') +('0000000000830','BCREAM OF MUSHROOM SOUP MIX',11.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-12-02 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'435') +('0000000000831','BSOUP MIX SPLIT PEA',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2008-03-24 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'436') +('0000000000832','BCOUSCOUS WHOLE WHEAT ORG.',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'0','2008-10-15 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'437') +('0000000000833','BFARINA',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'438') +('0000000000834','BPILAF OLDE WORLD',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'439') +('0000000000835','BQUINOA RED OG FAIR TRADE',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'499','2009-07-30 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'440') +('0000000000839','BBLACK BEAN MIX',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'441') +('0000000000841','BTEA MS KELLYS BLCK CRRNT DCAF',31.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'mixmatchcode','2009-03-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'442') +('0000000000843','BLEMON BALM OG',30.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'443') +('0000000000844','BRICE JASMINE WHITE ORG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'499','2009-06-16 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'444') +('0000000000845','BHUMMUS',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'445') +('0000000000846','BTABOULI MIX',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','7','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'446') +('0000000000847','BRYE MEAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'499','2009-07-22 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'447') +('0000000000848','BFLOUR BARLEY ORG',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2008-06-16 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'448') +('0000000000849','BFLOUR RICE WHITE',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','5','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'449') +('0000000000856','BCOFFEE ALAKEF DECAF',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','1',0,'0','2008-08-11 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'450') +('0000000000857','BFIVE SPICE POWDER ORG',18.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'451') +('0000000000858','BGINGER ROOT CUT/SIFTED ORG',20.15,'0',0.00,'0',14.15,'0',14.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'499','2009-06-11 01:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'452') +('0000000000859','PARTY, REUSABLE PANTY LINER',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'mixmatchcode','2009-02-19 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'453') +('0000000000860','HONEYSUCKLE REUSABLE NURS PADS',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-05-08 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'454') +('0000000000861','PARTY, REUSABLE PADS SM M L',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'mixmatchcode','2009-02-19 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'455') +('0000000000862','PARTY, REUSABLE PAD OVERNIGHT',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'mixmatchcode','2009-02-19 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'456') +('0000000000863','BGRANOLA RAISIN CASHEW',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-05-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'457') +('0000000000864','BWALNUT HALVES AND PIECES ORG',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'458') +('0000000000865','BBROCCOLI SEEDS SPROUTING ORG',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-07-31 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'459') +('0000000000866','BRICE SUSHI ORG',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'460') +('0000000000868','SILVER TIN, 2OZ',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2006-07-07 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'461') +('0000000000870','BTEA WHITE PEONY',43.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'499','2009-07-29 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'462') +('0000000000871','BTEA RASPBERRY GREEN',41.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'499','2009-06-29 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'463') +('0000000000873','BTEA GENMAICHA ORG',35.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-12-04 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'464') +('0000000000875','BPEANUT ORG SPLIT DRY RSTD NS',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2008-09-26 08:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'465') +('0000000000876','BKISS MY FACE LOTION',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'499','2009-08-21 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'466') +('0000000000877','BTOMATO DRIED OG',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','4','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'467') +('0000000000878','BTEA ROOIBOS',21.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'468') +('0000000000879','BANISE WH OG',17.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'469') +('0000000000880','BPASTA WIZARDS REPLY',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'499','2009-05-08 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'470') +('0000000000881','BSAVORY SUMMER',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'471') +('0000000000882','BRICE WILD',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','11','0','0','1','1',0,'499','2009-05-29 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'472') +('0000000000884','BCUMIN SEED WHOLE',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-11 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'473') +('0000000000885','BSPROUT SPREE SALAD MIX ORG',12.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','257','0','0','1','1',0,'0','2008-09-26 09:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'474') +('0000000000886','BBULGUR OG',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','6','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'475') +('0000000000887','BGRANOLA FRENCH VANILLA',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2008-03-17 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'476') +('0000000000888','BSUGAR CANE OG',1.25,'0',0.00,'0',0.99,'0',0.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','1','0','0','1','1',0,'mixmatchcode','2009-04-14 10:04:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'477') +('0000000000889','BCHOC CHIPS ORGANIC DARK',8.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','1','1','1',0,'0','2008-06-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'478') +('0000000000893','BNETTLE LEAF ORG',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'479') +('0000000000894','BPEPPER COARSE GROUND BLACK OG',23.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-05-29 12:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'480') +('0000000000895','BSESAME STICKS GARLIC',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','12','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'481') +('0000000000896','BYEAST POWDER, NUTRITIONAL',13.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','19','0','0','1','1',0,'mixmatchcode','2009-09-25 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'482') +('0000000000898','BPRETZELS YOGURT',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','16','0','1','1','1',0,'0','2007-06-07 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'483') +('0000000000899','BPASTA QUINOA PAGODAS',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','10','0','0','1','1',0,'499','2009-05-08 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'484') +('0000000000900','BGRANOLA PEANUT BUTTER FLAX',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','1',0,'0','2009-06-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'485') +('0000000000905','BTHYME ORGANIC',24.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-10-20 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'486') +('0000000000914','BMACADAMIA NUTS ORG',17.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','1',0,'0','2009-07-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'487') +('0000000000915','BTEA MRS KELLYS HERBAL HIGH-C',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'488') +('0000000000921','BTEA MRS KELLYS COZY CHAMOMILE',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'489') +('0000000000926','BTEA DARJEELING OG',47.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'490') +('0000000000942','BCAYENNE ORG',20.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-06-03 11:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'491') +('0000000000944','BRAISINS 5lb BOX ORG',18.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-08-28 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'492') +('0000000000945','BPEANUT BUTTER ORG CRUNCHY 5#',21.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-03-17 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'493') +('0000000000946','BTEA MS KELLYS EARL GREY SUPRE',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-10-08 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'494') +('0000000000947','BCHILI POWDER CHIPOTLE ORGANIC',29.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','253','0','0','1','1',0,'499','2009-06-11 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'495') +('0000000000951','BTEA GREEN CHAI ORG',34.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'496') +('0000000000952','BTEA EARL GREY OG',34.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'497') +('0000000000953','BTEA ENGLISH BREAKFAST ORG',28.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'498') +('0000000000954','BTEA IRISH BREAKFAST ORG',29.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'499') +('0000000000955','BTEA GUNPOWDER GREEN OG',32.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'500') +('0000000000956','BTEA SENCHA GREEN ORG',42.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'501') +('0000000000957','BTEA ORANGE SPICE ORG',35.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-05-15 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'502') +('0000000000958','SILVER TIN, 4OZ',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'503') +('0000000000961','BTEA GREEN MANGO DECAF',50.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-09 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'504') +('0000000000963','BTEA CHAI ORG',35.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'505') +('0000000000964','BTEA MRS KELLYS GREY DECAF',33.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'506') +('0000000000965','BTEA OOLONG SE CHUNG',35.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'499','2009-06-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'507') +('0000000000966','BTEA MRS KELLYS BLACK CURRANT',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-06-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'508') +('0000000000968','BTEA EARL GREY GREEN ORG',35.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','255','0','0','1','1',0,'0','2008-12-03 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'509') +('0000000000997','BGINGER GROUND POWDER ORG',20.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'0','2008-08-20 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'510') +('0000000000998','BCLOVES WHOLE ORG FAIR TRADE',25.29,'0',0.00,'0',17.75,'0',17.75,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','254','0','0','1','1',0,'499','2009-06-22 12:02:00','0',0.01,'1','2','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'511') +('0000000000999','BCLOVES POWDER OG FAIR TRADE',28.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','254','0','0','1','1',0,'499','2009-06-18 10:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'512') +('0000000001000','PRODUCE CORRECTION',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','535','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'513') +('0000000001001','MAPLE SYRUP QUARTS SIMP GIFT',20.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-06-01 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'514') +('0000000001002','MAPLE SYRUP PINTS SIMP GIFTS',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-06-01 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'515') +('0000000001003','TOTE BAG',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'516') +('0000000001004','DELI SANDWICH COUPON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'517') +('0000000001005','COUPON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'499','2009-06-19 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'518') +('0000000001006','MAPLE SYRUP, FANCY QT SIMP GIF',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-06-01 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'519') +('0000000001008','EGGS, LOCAL SMALL',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'520') +('0000000001009','EGGS LOCAL MEDIUM',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'521') +('0000000001010','EGGS LOCAL LARGE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'522') +('0000000001011','EGGS LOCAL EXTRA LAR',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'523') +('0000000001012','EGGS LOCAL JUMBO',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'524') +('0000000001013','WHOLE FARM EGGS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-02-11 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'525') +('0000000001014','GREEK STYLE HUMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'526') +('0000000001015','BREAKFAST TO GO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2009-08-07 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'527') +('0000000001016','WHOLE FARM MEDIUM EGGS',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2006-09-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'528') +('0000000001017','BAKED GOOD',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'529') +('0000000001018','HONEYCOMB MARQ',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-03-30 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'530') +('0000000001019','HONEYCOMB',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-07-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'531') +('0000000001020','MILK SPOUT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','1','0','0',0,'0','2005-10-27 10:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'532') +('0000000001021','MILK CARRIER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','1','0','0',0,'0','2008-12-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'533') +('0000000001024','WFC BASEBALL SHIRT',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2007-12-03 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'534') +('0000000001025','WFC WINTER HAT',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2007-01-19 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'535') +('0000000001026','POSTER',10.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','2007-03-16 09:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'536') +('0000000001027','CHUM MEGLLAH MADNESS',10.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','882','0','0','0','0',0,'mixmatchcode','2009-02-17 12:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'537') +('0000000001028','SLOW FOOD PICNIC ADULT',12.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','881','0','0','0','0',0,'0','2008-08-12 10:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'538') +('0000000001029','SLOW FOOD PICNIC CHILD',6.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','881','0','0','0','0',0,'0','2008-08-12 10:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'539') +('0000000001030','TAMARIND CONCENTRATE',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'540') +('0000000001031','MILK SKIM DAHLS DAIRY',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2007-12-31 07:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'541') +('0000000001032','MILK 1% DAHLS DAIRY',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2007-12-31 07:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'542') +('0000000001033','MILK 2% DAHLS DAIRY',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2007-12-31 08:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'543') +('0000000001034','MILK WHOLE DAHLS DAIRY',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2007-12-31 08:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'544') +('0000000001037','NORTHSTAR BISON SNACK STICKS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-05-12 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'545') +('0000000001040','GIFT CERTIFICATE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','900','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'546') +('0000000001041','GIFT CARD PURCHASE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','902','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'547') +('0000000001044','WFC BALL CAP',12.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'499','2009-09-04 09:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'548') +('0000000001045','WFC STAFF T SHIRT',12.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'499','2009-08-21 09:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'549') +('0000000001049','$30 TICKET',30.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-12-13 01:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'550') +('0000000001050','BCF FUNDRAISER',10.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2007-02-21 12:01:00','0',0.01,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'551') +('0000000001051','CELERYCOUPN',0.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'552') +('0000000001052','FLOOD RELIEF FUNDRAISER',1.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','703','0','0','0','1',0,'0','2008-07-29 10:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'553') +('0000000001053','VEGGIE DIPPER COUPON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'554') +('0000000001054','DAHLS BUTTER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2008-11-05 10:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'555') +('0000000001055','WFC LOCAL SS SHIRT',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2007-12-03 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'556') +('0000000001056','ARTEK TRAVEL MUG W/CLIP',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-05-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'557') +('0000000001057','BOX LUNCH COUPON',0.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'558') +('0000000001060','TRAVEL MUG W/ HANDLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','2005-12-23 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'559') +('0000000001061','THERMOS W/ CASE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','2005-12-23 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'560') +('0000000001062','WFC Water Bottles',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'561') +('0000000001063','WFC Bumper stickers',1.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','2006-06-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'562') +('0000000001065','POSTAGE STAMPS - BOOK',8.40,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'499','2009-08-12 01:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'563') +('0000000001080','AR ERROR CORR/REVERS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','990','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'564') +('0000000001090','ROOT BEER HIGH BRIDGE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','1','1','0',0,'0','2008-04-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'565') +('0000000001091','ROOT BEER GROWLER DEPOSIT',4.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','54','0','0','1','0',0,'0','2008-07-31 10:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'566') +('0000000001092','ROOT BEER GROWLER RETURN','-4.00','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','54','0','0','1','0',0,'0','2008-05-02 10:03:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'567') +('0000000001099','DELI DEPOSIT PLU',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'499','2009-06-19 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'568') +('0000000001100','SAUERKRAUT SPIRIT CRK',7.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-09-02 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'569') +('0000000001101','SAUERKRAUT PURPLE',7.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-11-05 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'570') +('0000000001102','KIM CHEE SPIRIT CRK',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-09-02 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'571') +('0000000001110','WILD FERN PURE PATCHOULI SOAP',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'mixmatchcode','2009-01-29 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'573') +('0000000001111','WILD FERN LOCAL SOAP',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-07-07 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'574') +('0000000001112','$20 class',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','708','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'575') +('0000000001113','$25 class',25.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','708','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'576') +('0000000001114','$30 class',30.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'577') +('0000000001115','$35 class',35.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'578') +('0000000001116','$40 class',40.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'579') +('0000000001117','$45 class',45.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'580') +('0000000001118','$50 class',50.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','708','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'581') +('0000000001119','$55 class',55.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'582') +('0000000001120','$60 class',60.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'583') +('0000000001121','$65 class',65.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'584') +('0000000001122','$70 class',70.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'585') +('0000000001123','$75 class',75.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'586') +('0000000001124','$15 Class',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-10-06 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'587') +('0000000001125','$10 Class',10.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'499','2009-05-06 06:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'588') +('0000000001126','$5 Class',5.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2006-11-22 05:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'589') +('0000000001127','LAND TRUST - STUDENT',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','881','0','0','0','0',0,'0','2009-01-06 09:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'590') +('0000000001128','LAND TRUST - REGULAR',30.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','881','0','0','0','0',0,'0','2009-01-06 09:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'591') +('0000000001132','SCHULTZ MEDIUM EGGS',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2006-11-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'592') +('0000000001133','SCHULTZ LARGE EGGS',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'mixmatchcode','2009-03-21 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'593') +('0000000001212','KMF BULK HAND SOAP',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-08-20 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'594') +('0000000001234','OG BEER SPEC',1.97,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','1','1','0',0,'10499','2009-06-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'595') +('0000000001550','SHOOPS CEDAR PLANKS',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-25 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'596') +('0000000001551','SHOOPS MAPLE PLANKS',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-25 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'597') +('0000000001998','Member Only Coupon',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'499','2009-06-19 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'598') +('0000000001999','Do not use me pleas use MA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','2005-03-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'599') +('0000000002000','Co-op Tote Box',1.86,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','700','0','1','0','0',0,'0','2006-11-13 09:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'600') +('0000000002060','VEGAN SAMOSA',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-12-15 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'601') +('0000000002090','SPIRIT CREEK GRAPE KOMBUCHA',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12946') +('0000000002091','SPIRIT CREEK HONEY KOMBUCHA',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12947') +('0000000002092','SPIRIT CREEK RASP KOMBUCHA',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12949') +('0000000002093','SPIRIT CREEK ORIGINAL KOMBUCHA',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12950') +('0000000002113','EARTH SCIENCE BULK SHAMPOO',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-03-08 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'602') +('0000000002114','EARTH SCIENCE BULK CONDITIONER',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-03-08 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'603') +('0000000002115','ALBA UNSCENTED EMOL LOTION',6.25,'0',0.00,'0',4.99,'0',4.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','92','0','1','0','1',0,'0','2008-12-31 04:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'604') +('0000000002236','3338',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','2009-04-15 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'605') +('0000000002501','STACEYS COMFREY BALM LAV',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2006-09-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'606') +('0000000002502','STACEYS COMFREY LOTION',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-11-09 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'607') +('0000000002503','STACEYS LIP BALM',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-05-19 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'608') +('0000000002504','STACEYS SKIN SALVATION LOTION',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'609') +('0000000002598','PHORSERADISH BAGGED',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'mixmatchcode','2009-03-27 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'610') +('0000000003000','PRODUCE TAXABLE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','501','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'611') +('0000000003002','PFLOWERS 3 STEM IRIS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1201','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'612') +('0000000003003','PAPPLE BAG GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'613') +('0000000003004','PAPPLE SALE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1069','2008-09-18 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'614') +('0000000003005','PREV STIR FRY SAUCE',0.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'615') +('0000000003007','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'616') +('0000000003008','PRODUCE FLOWERS',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','501','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'617') +('0000000003009','PPOTATO SEED',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'580','2007-10-08 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'618') +('0000000003010','PAPPLE BAG LOCAL CORTLAND',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'548','2008-09-30 01:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'619') +('0000000003011','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'620') +('0000000003012','PPEAR ABATE FETEL',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'799','2009-04-03 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'621') +('0000000003013','PFRUIT BASKET',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','0','0',0,'0','2004-12-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'622') +('0000000003014','PPEAR ALEX LUCAS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'800','2007-09-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'623') +('0000000003016','PPEAR CONCORD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'802','2008-12-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'624') +('0000000003021','PBANANA SALE',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'718','2008-04-15 11:04:00','0',0.01,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'625') +('0000000003029','PMANDARIN SATSUMA',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'818','2009-02-20 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'626') +('0000000003033','PMELON CHARENTAIS',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'627') +('0000000003034','PMELON CHARANTAIS',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'628') +('0000000003035','PNECTARINE WHITE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'684','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'629') +('0000000003039','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'630') +('0000000003041','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'631') +('0000000003050','PTOMATO PKG LOCAL SPECIALTY',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'1045','2007-10-11 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'632') +('0000000003054','PPEPPER BELL RED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'538','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'633') +('0000000003056','PPEPPER BELL YELLOW',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'539','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'634') +('0000000003060','PBROCCOLI CROWNS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'mixmatchcode','2009-04-08 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'635') +('0000000003061','PTOMATO SLICER',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.0,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'636') +('0000000003064','PTOMATO LOCAL SLICING',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.0,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'637') +('0000000003066','PAPPLE CAMEO',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'501','2007-09-09 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'638') +('0000000003088','PCURRANT RED',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'734','2007-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'639') +('0000000003092','PORO BLANCO',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'1091','2009-04-22 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'640') +('0000000003096','PKOHLRABI / BUNCH',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'678','2009-08-22 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'641') +('0000000003099','PAPPLE SANSA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1047','2007-10-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'642') +('0000000003100','PMELON HONEYGOLD',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'643') +('0000000003101','PMELON ROCHET',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'644') +('0000000003107','PORANGE NAVEL',0.33,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'791','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'645') +('0000000003108','PORANGE BULK',0.33,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'791','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'646') +('0000000003109','PORANGE VALLEY COVE',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'792','2009-02-04 07:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'647') +('0000000003110','PORANGE CARA CARA',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'787','2009-04-05 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'648') +('0000000003111','PPAPAYA LG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'674','2009-07-22 06:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'649') +('0000000003113','PPEACH DONUT EA',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'687','2009-09-16 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'650') +('0000000003118','PPEAR STARKRIMSON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'798','2008-10-15 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'651') +('0000000003120','PPEPPER BELL GREEN',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'537','2009-09-04 05:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'652') +('0000000003126','PPINEAPPLE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'653') +('0000000003127','PPOMEGRANATE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'652','2008-12-10 07:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'654') +('0000000003131','PPLANTS VEG 6PK',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','505','0','0','1','0',0,'1321','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'655') +('0000000003132','PPLANTS SMALL POT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','505','0','0','1','0',0,'1323','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'656') +('0000000003133','PPLANTS FLOWER 6PK',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'1325','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'657') +('0000000003134','PPLANTS VEG 6PK ALT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','505','0','0','1','0',0,'1321','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'658') +('0000000003135','PPLANTS SMALL POT ALT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','505','0','0','1','0',0,'1323','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'659') +('0000000003136','PPLANTS FLOWERS 6-PK ALT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'1325','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'660') +('0000000003137','TREES, LARGE',31.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'661') +('0000000003138','TAMARACK',23.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'662') +('0000000003139','GRASSES',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'663') +('0000000003140','#1 SHRUBS',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','1','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'664') +('0000000003141','#2 SHRUBS',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'665') +('0000000003142','P WSquash Carnival',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.0,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'666') +('0000000003151','PTOMATO LG ORGANIC',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'667') +('0000000003160','PGAI LAN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','0',0,'1299','2005-07-07 11:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'668') +('0000000003170','PFLOWER 6* POINSETTI',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'669') +('0000000003171','PFLOWER 8* POINSETTI',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'670') +('0000000003172','PFLOWER 6* XMAS CACT',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','2004-11-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'671') +('0000000003173','PFLOWER 6* NOR PINE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'672') +('0000000003174','P4*PAPERWHITES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'673') +('0000000003175','PMISTLETOE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'674') +('0000000003176','PFLOWER GERB BUNCH',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'675') +('0000000003177','PMANDARIN SATSUMA CASE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1079','2008-01-02 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'676') +('0000000003178','PFLOWER RUNUNCULUS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'677') +('0000000003179','PFLOWER ANTHURIUM',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'678') +('0000000003180','PFL DAFFODIL BUNCH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'679') +('0000000003181','PFL MINI ORCHID STEM',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'680') +('0000000003182','PFL CALLA STEM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'681') +('0000000003183','PFL GODETIA BOQUET',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'682') +('0000000003184','PFL DAHLIAS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'683') +('0000000003185','PFL 6* CYCLAMEN',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'684') +('0000000003186','PFL 6* HIBISCUS',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'685') +('0000000003187','PFL 6* ROSE BUSH',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'686') +('0000000003188','PFL 8* BULB GARDEN',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'687') +('0000000003189','PFL 6* DAFFODIL',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'688') +('0000000003190','PFL 4* HYACINTH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'689') +('0000000003191','PFL TULIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1202','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'690') +('0000000003192','PFL 12 ROSE BOUQUET',21.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'691') +('0000000003193','PFL 6 ROSE BOUQUET',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'692') +('0000000003194','PFL CUPIDS ARROW',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'693') +('0000000003195','PFL LILY EASTER DOUB',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'694') +('0000000003196','PFL LILY EXQUISITE',11.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'695') +('0000000003197','PFL 6.5 EXACUM',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'696') +('0000000003198','PFL LILY HYBRID',7.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'697') +('0000000003199','PFL 4.5 KALANCHOE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'698') +('0000000003200','PFL CALLA BUNCH',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'699') +('0000000003201','PFL IRIS BUNCH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1201','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'700') +('0000000003202','PFL 4* GERB',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'701') +('0000000003203','PFL 4* VIOLET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'702') +('0000000003204','PFL SNAPDRAGON',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'703') +('0000000003205','PFLOWERS AGAPANTHUS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'704') +('0000000003206','PFLOWERS ALSTROEMERI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'705') +('0000000003231','PPLANTS TERRA COTTA POT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','0','1','0',0,'mixmatchcode','2009-04-15 10:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'706') +('0000000003233','PPLANTS HANGING BASKET',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'1326','2009-04-15 10:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'707') +('0000000003234','WILDFLOWERS',6.53,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'708') +('0000000003235','SPECIALTY PLANT',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','1','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'709') +('0000000003236','TREE SMALL',14.27,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'710') +('0000000003237','TREE LARGE',28.67,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'711') +('0000000003238','TAMARACK',21.47,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'712') +('0000000003239','GRASSES',6.53,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'713') +('0000000003240','#1 SHRUBS',7.16,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','1','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'714') +('0000000003241','#2 SHRUBS',21.36,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'0','2005-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'715') +('0000000003242','P SHRUBS, BLUEBERRY',18.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'716') +('0000000003244','Aprium',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'710','2009-08-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'717') +('0000000003260','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'718') +('0000000003262','PCARROT BAG 2# local',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'512','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'719') +('0000000003266','PCARROT BAG 5#-LOCAL',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'513','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'720') +('0000000003278','PPLUOT',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'685','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'721') +('0000000003279','PKIWIFRUIT GOLDEN',0.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'751','2007-10-01 10:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'722') +('0000000003283','PAPPLE HONEYCRISP',3.49,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','541','0','0','1','1',0,'690','2009-09-16 07:00:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'723') +('0000000003293','PAPPLE JAZZ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'504','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'724') +('0000000003294','PAPPLE JAZZ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'504','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'725') +('0000000003302','PAPRICOT',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'575','2009-08-20 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'726') +('0000000003305','PCURRANT BLACK',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'734','2007-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'727') +('0000000003307','PMELON KANDY(LOUPE)',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'554','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'728') +('0000000003310','PFLOWER so',161.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'729') +('0000000003311','PFLOWER BIG GERB',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'730') +('0000000003314','PPEACH WHITE LG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'680','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'731') +('0000000003316','PFL GINGER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'732') +('0000000003327','PFL FRESH BOUQUET',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'733') +('0000000003328','PFLOWERS OLUND',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'734') +('0000000003329','PSTEVIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'735') +('0000000003330','PFLOWERS DRIED PEONY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'736') +('0000000003331','PEMERUS FLOWER',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'737') +('0000000003332','PFLOWERS LOCAL BOUQUET',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1206','2009-06-25 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'738') +('0000000003333','PFLOWER GLADIOLA',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1362','2008-12-17 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'739') +('0000000003334','PFLOWERS CARNATION 3 STEM',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'499','2009-05-08 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'740') +('0000000003335','PFLOWERS LOCAL SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1207','2008-07-05 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'741') +('0000000003336','PFLOWER CARNATION SINGLE STEM',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'499','2009-05-16 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'742') +('0000000003337','PFLOWERS ROSE 3 STEM',7.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','0','0','0',0,'1382','2009-05-08 05:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'743') +('0000000003338','PFLOWER DRIED SMALL BUNCH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','2007-10-24 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'744') +('0000000003339','PFLOWERS BOUQUET, FT SMALL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1406','2009-08-15 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'745') +('0000000003340','PFLOWERS DRIED A',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1205','2007-09-17 01:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'746') +('0000000003341','PFLOWERS DRIED B',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','2004-12-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'747') +('0000000003342','PWHEAT DRIED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1205','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'748') +('0000000003343','PPLANTS POTTED LG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','505','0','0','1','0',0,'1322','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'749') +('0000000003344','PFLOWERS BOUQUET ONE VARIETY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'499','2009-09-10 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'750') +('0000000003345','PPLANTS BEGONIA_IMPATIENS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'mixmatchcode','2009-04-15 10:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'751') +('0000000003346','PFLOWERS LILY STEM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1363','2008-12-17 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'752') +('0000000003347','PPLANTS FUSCHIA_VINCA_SPIKE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'1324','2009-06-24 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'753') +('0000000003348','PPLANTS POTTED LG FLOWER',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'1324','2009-06-24 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'754') +('0000000003350','PCELOSIA',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'755') +('0000000003351','PFLOWER SHARY',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1203','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'756') +('0000000003352','PFL GLADIOLA',1.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'757') +('0000000003383','PAPPLE HONEYCRISP',3.49,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','541','0','0','1','1',0,'690','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'758') +('0000000003388','PNUTS SHELL ASST',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','548','0','0','1','0',0,'1067','2008-10-19 12:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'759') +('0000000003411','PAPPLE BAG LOCAL ZESTAR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1348','2008-09-10 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'760') +('0000000003412','PAPPLE BAG LOCAL BEACON',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1347','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'761') +('0000000003413','PAPPLE BAG REDFREE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1351','2008-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'762') +('0000000003421','PMELON WATERMELON MINI ICEBOX',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','0',0,'713','2009-08-12 08:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'763') +('0000000003423','PTOMATO HEIRLOOM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'653','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'764') +('0000000003424','PCARROT GREENTOP RED',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'867','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'765') +('0000000003434','PPEAR TOSCA',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'1402','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12853') +('0000000003439','PNECTARINE DONUT',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'1395','2009-06-30 01:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'766') +('0000000003458','PPOTATO BAG RUSSET LOCAL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'767') +('0000000003459','PPOTATO BAG RED LOCAL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'988','2008-12-22 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'768') +('0000000003471','PBRAISING MIX',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','1',0,'1160','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'769') +('0000000003623','PCARROT LOCAL JUICER 2#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'1370','2009-02-03 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'770') +('0000000003664','ECODENT TOOTHPOWDER 2 OZ',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2006-12-13 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'771') +('0000000003807','pflower bouquet small',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','506','0','1','0','0',0,'1361','2009-08-15 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12762') +('0000000003852','PPEAR PACKHAM',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'773','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'772') +('0000000003888','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'773') +('0000000003889','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'774') +('0000000003923','PGRAPEFRUIT RUBY NON-ORGANIC',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'1390','2009-09-01 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'775') +('0000000003928','PPOTATO BAG LOCAL WHITE 3#',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'mixmatchcode','2009-03-30 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'776') +('0000000003929','PGRAPEFRUIT NON-O RUBY',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'1390','2009-09-01 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'777') +('0000000003949','PORANGE BAG VC NAVELS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'793','2009-01-06 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'778') +('0000000003954','PGREENS SWEET BAGGED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'941','2008-10-27 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'779') +('0000000003988','PTOMATO SLICER BAY PRODUCE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1358','2009-05-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'780') +('0000000003989','PONION SPRING',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'973','2009-04-08 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'781') +('0000000003992','PORANGE BAG SEVILLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'696','2009-04-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'782') +('0000000003993','PSPRING MIX CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'783') +('0000000003994','PSOUP MIX',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'694','2008-11-04 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'784') +('0000000003996','PBASKET GRAB N GO',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','1','0',0,'1149','2008-12-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'785') +('0000000003997','PBASKET GIFT SMALL',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','1','0',0,'1152','2006-11-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'786') +('0000000003998','PBASKET GIFT MEDIUM',36.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','1','0',0,'1151','2007-11-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'787') +('0000000003999','PBASKET GIFT LARGE',44.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','0','0',0,'1150','2007-11-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'788') +('0000000004000','PSMALL FRUIT',0.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','553','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'789') +('0000000004001','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'790') +('0000000004003','PNECTARINE CASE SPEC',24.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'781','2007-09-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'791') +('0000000004004','PGROUND CHERRIES',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'728','2007-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'792') +('0000000004005','PBEAN SPROUT BAG NO',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'655','2008-09-30 01:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'793') +('0000000004006','PFRUIT FOR DELI BASKET',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','553','0','0','1','0',0,'1123','2006-02-08 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'794') +('0000000004007','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'795') +('0000000004008','PKAFFIR LIME LEAVES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'915','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'796') +('0000000004009','PLIME KAFFIR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'759','2009-02-10 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'797') +('0000000004010','PPEACH DONUT /EA',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'687','2009-09-16 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'798') +('0000000004011','PBANANA',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'716','2009-09-09 05:02:00','0',0.01,'0','0','0','0','0',0,0.00,'1',NULL,'6',0.00,NULL,'799') +('0000000004012','PORANGE Valencia',0.33,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'791','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'800') +('0000000004013','PORANGE VALENCIA IMPOSTER',0.33,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'791','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'801') +('0000000004014','PORANGE VALENCIA SM',0.33,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'791','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'802') +('0000000004015','PAPPLE RED DELICIOUS',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'607','2009-09-21 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'803') +('0000000004016','PAPPLE RED DEL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'607','2009-09-21 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'804') +('0000000004017','PAPPLE GRANNY SMTH',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'605','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'805') +('0000000004018','PAPPLE GRANNY SMH LG',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'605','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'806') +('0000000004019','PAPPLE MCINTOSH LG',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'606','2006-10-23 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'807') +('0000000004020','PAPPLE GOLD DEL LG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'604','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'808') +('0000000004021','PAPPLE GOLD DELICIOUS',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'604','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'809') +('0000000004022','PGRAPE GREEN SEEDLESS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'673','2009-09-11 04:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'810') +('0000000004023','PGRAPE RED SEEDLESS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'577','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'811') +('0000000004024','PPEAR BARTLETT SM',1.69,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','546','0','0','1','1',0,'620','2009-09-09 05:02:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'812') +('0000000004025','PPEAR DANJOU',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'623','2009-07-15 06:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'813') +('0000000004026','PPEAR BOSC SM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'622','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'814') +('0000000004027','PCRANBERRIES',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'815') +('0000000004028','PMELON WATERMELON YELLOW',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'823','2008-08-22 07:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'816') +('0000000004029','PPINEAPPLE SM',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'817') +('0000000004030','PKIWIFRUIT',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'752','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'818') +('0000000004031','PMELON WATERMELON',0.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'1346','2009-06-30 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'819') +('0000000004032','PMELON WATERMELON SEED',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'683','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'820') +('0000000004033','PLEMON SM',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'578','2008-01-22 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'821') +('0000000004034','PMELON HONEYDEW LG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'586','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'822') +('0000000004035','PNECTARINE SM',2.29,'0',0.00,'0',2.29,'0',2.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','556','0','0','1','1',0,'573','2009-09-09 05:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'823') +('0000000004036','PNECTARINE LG',2.29,'0',0.00,'0',2.29,'0',2.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','556','0','0','1','1',0,'573','2009-09-09 05:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'824') +('0000000004037','PPEACH YELLOW SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'517','2009-09-20 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'825') +('0000000004038','PPEACH YELLOW LG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'517','2009-09-20 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'826') +('0000000004039','PPLUM BLACK SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'809','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'827') +('0000000004040','PPLUM BLACK',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'809','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'828') +('0000000004041','PPLUM RED SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'811','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'829') +('0000000004042','PPLUM RED LG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'811','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'830') +('0000000004043','PPEACH TREE RIPE SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'517','2009-09-20 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'831') +('0000000004044','PPEACH TREE RIPE LG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'517','2009-09-20 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'832') +('0000000004045','PCHERRY Dark Sw',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'686','2009-08-10 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'833') +('0000000004046','PAVOCADO HASS',1.69,'0',0.00,'0',0.10,'0',0.10,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','557','0','0','1','0',0,'579','2009-09-09 05:02:00','0',0.0,'1','5','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'834') +('0000000004047','PGRAPEFRUIT RED/PINK',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'835') +('0000000004048','PLIME',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'756','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'836') +('0000000004049','PMELON CANTELOUPE',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'554','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'837') +('0000000004050','PMELON CANTALOUPE',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'554','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'838') +('0000000004051','PMANGO TOMMY/HAYDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'764','2009-09-21 11:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'839') +('0000000004052','PPAPAYA SM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'674','2009-07-22 06:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'840') +('0000000004053','PLEMON LG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'1050','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'841') +('0000000004054','PBERRY RASPBERRY LOCAL RED',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'719','2009-07-23 11:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'842') +('0000000004055','PTANGERINE MURCOTT',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'827','2009-05-06 05:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'843') +('0000000004056','PGRAPE BLACK SEEDLES',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'736','2009-08-25 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'844') +('0000000004057','PCHERRY LAPIN',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'686','2009-08-10 06:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'845') +('0000000004058','PTANGERINE PIXIE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'829','2008-01-29 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'846') +('0000000004059','PTOMATO CANNING',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1033','2007-10-11 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'847') +('0000000004060','PBROCCOLI',2.49,'0',0.00,'0',1.99,'0',1.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','510','0','0','1','1',0,'857','2009-08-05 07:00:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'848') +('0000000004061','PLETTUCE ICEBURG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'947','2009-09-03 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'849') +('0000000004062','PCUCUMBER GREEN',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'876','2009-09-02 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'850') +('0000000004063','PTOMATO BULK SM',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.0,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'851') +('0000000004064','PTOMATO LG ORGANIC',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'852') +('0000000004065','PPEPPER BELL GREEN',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'537','2009-09-04 05:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'853') +('0000000004066','PBEAN GREEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'845','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'854') +('0000000004067','PSQUASH ZUCCHINI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'1027','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'855') +('0000000004068','PONION GREEN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'639','2009-09-23 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'856') +('0000000004069','PCABBAGE GREEN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'860','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'857') +('0000000004070','PCELERY BUNCH /@',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'858') +('0000000004071','PCELERY BUNCH LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'859') +('0000000004072','PBUDDHAS HAND',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1215','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'860') +('0000000004073','PPOTATO RED',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'990','2009-09-03 08:05:00','1',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'861') +('0000000004074','PPOTATO NEW RED LOCAL PINTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1337','2008-07-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'862') +('0000000004075','PLETTUCE RED LEAF',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'950','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'863') +('0000000004076','PLETTUCE GREEN LEAF',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'556','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'864') +('0000000004077','PCORN SWEET WHITE',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'689','2009-08-10 06:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'865') +('0000000004078','PCORN SWEET YELLOW',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'689','2009-08-10 06:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'866') +('0000000004079','PCAULIFLOWER',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'838','2009-08-26 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'867') +('0000000004080','PASPARAGUS SM',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'637','2009-06-17 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'868') +('0000000004081','PEGGPLANT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'887','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'869') +('0000000004082','PONION RED',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'972','2009-09-09 03:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'870') +('0000000004083','PPOTATO WHITE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'994','2008-09-30 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'871') +('0000000004084','PARTICHOKE LG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'636','2009-09-21 02:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'872') +('0000000004085','PMUSHROOM WHITE BULK',3.99,'0',0.00,'0',0.20,'0',0.20,'0','2009-03-31 12:00:00','2010-03-29 12:00:00','516','0','0','1','1',0,'502','2009-05-06 05:05:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'873') +('0000000004086','PSQUASH YLLOW ZUCCHI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'874') +('0000000004087','PTOMATO ROMA ORGANIC',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1037','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'875') +('0000000004088','PPEPPER BELL RED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'538','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'876') +('0000000004089','PRADISH BUNCHED RED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'656','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'877') +('0000000004090','PSPINACH BUNCH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'672','2009-09-03 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'878') +('0000000004091','PYAM SWEET POTATO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','526','0','0','1','1',0,'570','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'879') +('0000000004092','PPEAS SNOW',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'976','2009-09-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'880') +('0000000004093','PONION RED LG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'972','2009-09-09 03:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'881') +('0000000004094','PCARROT GREENTOP',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'867','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'882') +('0000000004095','PTURNIP YELLOW',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1041','2009-09-21 09:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'883') +('0000000004096','PAPPLE GINGER GOLD',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'604','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'884') +('0000000004097','PAPPLE GINGERGOLD',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'604','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'885') +('0000000004098','PRAMP / WILD LEEK',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'971','2009-05-01 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'886') +('0000000004099','PLEMON MEYER',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'754','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'887') +('0000000004100','PAPPLE BAG HONEYCRIS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'888') +('0000000004101','PAPPLE BRAEBURN SM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'600','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'889') +('0000000004102','PAPPLE TSUGARU',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1048','2007-09-13 07:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'890') +('0000000004103','PAPPLE BRAEBURN LG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'600','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'891') +('0000000004104','PAPPLE CORTLAND SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1100','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'892') +('0000000004105','PAPPLE MUTSU',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'609','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'893') +('0000000004106','PAPPLE CORTLAND LG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1100','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'894') +('0000000004107','PAPPLE BAYFIELD',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'547','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'895') +('0000000004108','PAPPLE CRISPIN SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1101','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'896') +('0000000004109','PAPPLE AMBROSIA',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'501','2007-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'897') +('0000000004110','PAPPLE CRISPIN LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1101','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'898') +('0000000004111','PAPPLE MUTSU',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'609','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'899') +('0000000004113','PAPPLE CRITERION SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1102','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'900') +('0000000004114','PAPPLE CASE GALA BAG',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1099','2007-10-18 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'901') +('0000000004115','PAPPLE HONEYCRISP CS',36.30,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','0',0,'1106','2008-09-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'902') +('0000000004116','PAPPLE EARLY SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1103','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'903') +('0000000004118','PAPPLE EARLY LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1103','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'904') +('0000000004121','PAPPLE ELSTAR SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1104','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'905') +('0000000004122','PAPPLE ROSE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'704','2008-08-22 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'906') +('0000000004123','PAPPLE ELSTAR LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1104','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'907') +('0000000004124','PAPPLE EMPIRE SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1105','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'908') +('0000000004126','PAPPLE EMPIRE LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1105','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'909') +('0000000004128','PAPPLE PINK LADY',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'608','2009-08-26 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'910') +('0000000004129','PAPPLE FUJI SM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'601','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'911') +('0000000004130','PAPPLE PINK LADY',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'608','2009-08-26 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'912') +('0000000004131','PAPPLE FUJI LG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'601','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'913') +('0000000004132','PAPPLE GALA SM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'602','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'914') +('0000000004133','PAPPLE GALA',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'602','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'915') +('0000000004134','PAPPLE GALA',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'602','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'916') +('0000000004135','PAPPLE GALA LG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'602','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'917') +('0000000004136','PAPPLE GOLD DEL SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'604','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'918') +('0000000004138','PAPPLE GRANNY SMH SM',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'605','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'919') +('0000000004139','PAPPLE GRANNY',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'605','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'920') +('0000000004140','PAPPLE PINK LADY',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'608','2009-08-26 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'921') +('0000000004142','PAPPLE IDARED LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1107','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'922') +('0000000004144','PAPPLE JONAGOLD SM',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'701','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'923') +('0000000004145','PAPPLE JONAGOLD',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'701','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'924') +('0000000004146','PAPPLE JONAGOLD LG',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'701','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'925') +('0000000004147','PAPPLE JONAGOLD',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'701','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'926') +('0000000004151','VEG CAPS O',200.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','0','0','1',0,'0','2006-10-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'927') +('0000000004152','PAPPLE MCINTOSH SM',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'606','2006-10-23 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'928') +('0000000004154','PAPPLE MCINTOSH',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'606','2006-10-23 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'929') +('0000000004155','PAPPLE PAULARED SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1108','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'930') +('0000000004156','PAPPLE GRAVNSTEIN SM',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'700','2008-08-27 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'931') +('0000000004157','PAPPLE PAULARED LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1108','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'932') +('0000000004158','PAPPLE GRAVNSTEIN LG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'700','2008-08-27 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'933') +('0000000004159','PONION SWEET VIDALIA NON-O',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'1328','2008-06-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'934') +('0000000004160','PAPPLE PIPPIN SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1109','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'935') +('0000000004161','PAPPLE BAG JONATHAN',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1212','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'936') +('0000000004162','PAPPLE PIPPIN LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1109','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'937') +('0000000004163','PONION SWEET WALLA WALLA',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'641','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'938') +('0000000004164','PONION BAG SWEET',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'968','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'939') +('0000000004165','PONION SWEET JOHN',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'641','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'940') +('0000000004166','PONION SWEET ONION',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'641','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'941') +('0000000004167','PAPPLE RED DEL SM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'607','2009-09-21 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'942') +('0000000004168','PAPPLE RED DEL LG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'607','2009-09-21 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'943') +('0000000004169','PAPPLE ROME SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1110','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'944') +('0000000004172','PAPPLE ROME LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1110','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'945') +('0000000004173','PAPPLE ROYAL GALA SM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'499','2009-08-07 04:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'946') +('0000000004174','PAPPLE ROYAL GALA LG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'602','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'947') +('0000000004177','PAPPLE SPARTAN SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1111','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'948') +('0000000004179','PAPPLE SPARTAN LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1111','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'949') +('0000000004181','PAPPLE STAYMAN SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1112','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'950') +('0000000004183','PAPPLE LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'499','2009-09-21 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'951') +('0000000004185','PAPPLE YORK SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1114','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'952') +('0000000004186','PAPPLE SUNRISE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'705','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'953') +('0000000004187','PAPPLE YORK LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1114','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'954') +('0000000004188','PNECTARINE WHITE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'684','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'955') +('0000000004189','PAPPLE WINESAP SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1113','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'956') +('0000000004191','PAPPLE WINESAP LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1113','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'957') +('0000000004193','PAPPLE PINK LADY',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'608','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'958') +('0000000004200','papple NZ Queen',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'609','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'959') +('0000000004202','PAPPLE ORIN',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'702','2007-11-01 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'960') +('0000000004210','PAPPLE AMBROSIA',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'501','2007-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'961') +('0000000004211','PAPPLE SANSA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1047','2007-10-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'962') +('0000000004212','PAPPLE SUNRISE BC',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'705','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'963') +('0000000004213','PAPPLE TSUGARU',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'1048','2007-09-13 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'964') +('0000000004215','PAPPLE PINOVA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'703','2007-09-17 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'965') +('0000000004217','PPEAR ASIAN',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'676','2009-04-22 07:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'966') +('0000000004218','PAPRICOTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'575','2009-08-20 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'967') +('0000000004219','PAVOCADO SIMMONS/BOOTH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'1053','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'968') +('0000000004220','PATEMOYAS',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1139','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'969') +('0000000004221','PAVOCADO HASS LG 48 CT',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'712','2009-01-21 11:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'970') +('0000000004222','PAVOCADO BAGGED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'711','2009-04-03 08:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'971') +('0000000004225','PAVOCADO HASS',1.69,'0',0.00,'0',0.10,'0',0.10,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','557','0','0','1','0',0,'579','2009-09-09 05:02:00','0',0.0,'1','5','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'972') +('0000000004227','PAVOCADO DONNY',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'1115','2007-07-07 10:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'973') +('0000000004228','PAVOCADO FUERTE',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'675','2008-04-15 03:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'974') +('0000000004229','PFIDDLEHEAD FERNS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','1',0,'890','2007-10-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'975') +('0000000004230','PBERRY RASPBERRY LOCAL NON-O',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1049','2007-09-17 10:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'976') +('0000000004231','PBANANA GREEN',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1016','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'977') +('0000000004232','PBANANA LEAVES',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1116','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'978') +('0000000004233','PBANANA MANZANO',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1117','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'979') +('0000000004234','PBANANA NINO',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1118','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'980') +('0000000004235','PPLANTAIN',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'808','2008-12-10 07:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'981') +('0000000004236','PBANANA RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'717','2009-07-01 07:04:00','0',0.01,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'982') +('0000000004238','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'983') +('0000000004239','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'984') +('0000000004240','PBERRY BLUEBERRY LOCAL',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1341','2009-07-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'985') +('0000000004241','PBERRY BOYSENBERRY',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1119','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'986') +('0000000004242','PBERRY CRANBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'987') +('0000000004243','PBERRY GOOSEBERRY',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'722','2008-01-21 03:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'988') +('0000000004244','PBERRY RASPBERRY LOCAL RED',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'719','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'989') +('0000000004245','PBERRY RASPBERRY LOCAL GOLDEN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'719','2009-07-23 11:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'990') +('0000000004246','PBERRT PT STRAWBERRY',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'991') +('0000000004247','PBERRY STRAWBERRY LOCAL QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'820','2009-09-16 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'992') +('0000000004248','PBERRY JUNE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1120','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'993') +('0000000004252','PCHERRIES EXTREME CASE',32.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'1394','2009-08-05 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'994') +('0000000004253','PCHERRIES EXTREME SALE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'1393','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'995') +('0000000004254','PBREADFRUIT',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1214','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'996') +('0000000004255','PCACTUS PEAR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'724','2007-10-23 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'997') +('0000000004256','PSTAR FRUIT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'819','2009-09-18 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'998') +('0000000004257','PCHERIMOYA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1215','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'999') +('0000000004258','PCHERRY RAINIER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'729','2009-08-04 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1000') +('0000000004259','PCHERRY BING',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'686','2009-08-10 06:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1001') +('0000000004260','PCOCONUT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'732','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1002') +('0000000004261','PCOCONUT YOUNG',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'699','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1003') +('0000000004262','PCHERRY EARLY SWEET PT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'686','2009-08-10 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1004') +('0000000004263','PDATE',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','553','0','0','1','1',0,'1122','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1005') +('0000000004264','PFIG BROWN TURKEY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','550','0','0','1','0',0,'805','2009-09-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1006') +('0000000004265','PFEIJOA',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1216','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1007') +('0000000004266','PFIG BLACK MISSION',4.29,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','550','0','0','1','0',0,'552','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1008') +('0000000004267','PFIG KADOTA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','550','0','0','1','0',0,'806','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1009') +('0000000004268','PFIG BLACK MISSION',4.29,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','550','0','0','1','0',0,'552','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1010') +('0000000004270','PGRAPE GLOBE RED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'739','2008-03-26 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1011') +('0000000004271','PGRAPE CHAMPAGNE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','0',0,'737','2009-08-25 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1012') +('0000000004272','PGRAPE CONCORD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'738','2008-10-02 11:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1013') +('0000000004274','PGRAPE GLOBE GREEN',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'1013','2009-01-27 08:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1014') +('0000000004275','PGRAPE LOCAL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'mixmatchcode','2009-09-25 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1015') +('0000000004279','PGRAPEFRUIT PUMMELO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'0','2008-12-31 10:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1016') +('0000000004281','PGRAPEFRUIT RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1017') +('0000000004282','PGRAPEFRUIT RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1018') +('0000000004283','PGRAPEFRUIT PINK LG1.69',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1019') +('0000000004285','PGRAPEFRUIT RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1020') +('0000000004286','PGRAPEFRUIT STAR SM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1021') +('0000000004288','PGRAPEFRUIT RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1022') +('0000000004289','PGRAPEFRUIT STAR LG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1023') +('0000000004290','PGRAPEFRUIT WHITE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'658','2009-06-17 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1024') +('0000000004292','PGRAPEFRUIT WHITE SM',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'658','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1025') +('0000000004293','PGRAPEFRUIT WHITE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'658','2009-06-17 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1026') +('0000000004295','PGRAPEFRUIT WHITE LG',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'658','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1027') +('0000000004298','PGRAPEFRUIT RIO STAR',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1028') +('0000000004299','PGUAVA',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'740','2009-02-13 02:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1029') +('0000000004300','PEDIBLE FLOWERS',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1177','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1030') +('0000000004301','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1031') +('0000000004302','PKIWANO',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1217','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1032') +('0000000004303','PKUMQUAT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'753','2009-04-22 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1033') +('0000000004305','PLIME KEY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1126','2008-01-15 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1034') +('0000000004306','PLIME BAG KEY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'760','2007-09-17 10:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1035') +('0000000004307','PLONGON',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1218','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1036') +('0000000004308','PLOQUAT',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1127','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1037') +('0000000004309','PLYCHEE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'499','2009-06-23 08:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1038') +('0000000004310','PMAMEY',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'1219','2009-08-08 09:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1039') +('0000000004311','PMANGO TOMMY/HAYDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'764','2009-09-21 11:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1040') +('0000000004312','PMANGO ATAULFO',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'765','2009-08-05 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1041') +('0000000004313','PMELON ANANAS',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1042') +('0000000004315','PMELON GALIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'772','2009-06-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1043') +('0000000004316','PMELON AMBROSIA',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1044') +('0000000004317','PMELON CANARY',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1045') +('0000000004318','PMELON CANTALOUPE SM',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'554','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1046') +('0000000004319','PMELON CANTALOUPE LG',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'554','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1047') +('0000000004320','PMELON CASABA',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1048') +('0000000004321','PMELON Magritte',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1049') +('0000000004322','PMELON CRENSHAW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'771','2009-07-15 06:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1050') +('0000000004323','PBERRY STRAWBERRY PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'820','2009-09-16 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1051') +('0000000004324','PMELON FRENCH AFTERN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1052') +('0000000004325','PMELON FRENCH BREAKF',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1053') +('0000000004326','PMELON GALIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'772','2009-06-10 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1054') +('0000000004327','PMELON GOLD HONEYDEW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'586','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1055') +('0000000004328','PLIMEQUATS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'757','2007-09-17 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1056') +('0000000004329','PMELON HONEYDEW SM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'586','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1057') +('0000000004330','PMELON MAYAN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1058') +('0000000004331','PMELON WATERMELON MINI SUGAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','0',0,'713','2009-08-12 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1059') +('0000000004332','PMELON MUSKMELON',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'1342','2009-08-21 03:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1060') +('0000000004333','PMELON PEPINO',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1061') +('0000000004334','PMELON PERSIAN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1062') +('0000000004335','PMELON PRINCE',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1063') +('0000000004336','PMELON SANTA CLAUS',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1064') +('0000000004337','PMELON KOREAN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1065') +('0000000004338','PMELON SHARLYN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'778','2007-09-24 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1066') +('0000000004339','PMELON SPANISH',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1067') +('0000000004340','PMELON WATERMELON YELLOW',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'823','2008-08-22 07:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1068') +('0000000004341','PMELON WATERMELON LOCAL NON-O',0.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'1349','2008-09-30 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1069') +('0000000004342','PMELON WATER MINI',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','0',0,'713','2009-08-12 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1070') +('0000000004343','PMELON LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'585','2009-09-08 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1071') +('0000000004344','PMELON WATERMELON MINI',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','0',0,'713','2009-08-12 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1072') +('0000000004345','PMELON WATERMELON LOCAL RED',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'832','2008-08-27 02:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1073') +('0000000004346','PMELON WATERMELON CREAM O SASK',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'1345','2008-08-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1074') +('0000000004347','PMELON WATERMELON ORANGE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'823','2008-08-29 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1075') +('0000000004353','PMELON MUSKMELON ATHENA LOCAL',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'1342','2009-08-21 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1076') +('0000000004354','PMELON JAPANESE',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','0',0,'1331','2008-06-30 08:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1077') +('0000000004375','PMELON CHARENTAIS',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1078') +('0000000004377','PNECTARINE TREE RIPE',2.29,'0',0.00,'0',2.29,'0',2.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','556','0','0','1','1',0,'573','2009-09-09 05:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1079') +('0000000004378','PNECTARINE TREE RIPE',2.29,'0',0.00,'0',2.29,'0',2.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','556','0','0','1','1',0,'573','2009-09-09 05:02:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1080') +('0000000004379','PNECTARINE WHITE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'684','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1081') +('0000000004380','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1082') +('0000000004381','PORANGE BLOOD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'786','2009-04-29 08:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1083') +('0000000004382','PTANGELO ORLANDO',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'822','2009-02-04 07:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1084') +('0000000004383','PMINNEOLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'821','2009-04-29 08:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1085') +('0000000004384','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1086') +('0000000004385','PORANGE NAVEL',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'789','2009-03-11 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1087') +('0000000004386','PORANGE BAG SWEET/HAMLIN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1132','2008-01-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1088') +('0000000004387','PORANGE TEMPLE LG',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'788','2007-09-17 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1089') +('0000000004388','PORANGE VALENCIA LG',0.33,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'791','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1090') +('0000000004390','PPEACH COLORADO',3.69,'0',0.00,'0',2.69,'0',2.69,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','556','0','0','1','1',0,'795','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1091') +('0000000004391','PPEACH GOLD DUST',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'1340','2008-08-24 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1092') +('0000000004392','PMELON CANADEW',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1093') +('0000000004394','PPAPAYA LG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'674','2009-07-22 06:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1094') +('0000000004395','PPAPAYA MEXICAN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'674','2009-07-22 06:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1095') +('0000000004396','PPEACH COLORADO CASE',73.75,'0',0.00,'0',62.75,'0',62.75,'0','2009-08-18 12:00:00','2009-09-30 12:00:00','556','0','0','1','0',0,'777','2009-08-18 08:02:00','0',0.0,'1','2','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1096') +('0000000004397','PPEACH Washington CASE',46.50,'0',0.00,'0',41.50,'0',41.50,'0','2009-08-18 12:00:00','2009-09-30 12:00:00','556','0','0','1','0',0,'726','2009-08-18 08:03:00','0',0.0,'1','2','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1097') +('0000000004399','PMANDARIN ROYAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'784','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1098') +('0000000004400','PPEACH WHITE SM',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'680','2009-08-26 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1099') +('0000000004401','PPEACH WHITE LG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'680','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1100') +('0000000004402','PGARLIC BAGS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1101') +('0000000004405','PGARLIC SCAPES',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'892','2007-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1102') +('0000000004406','PPEAR ASIAN WHITE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'676','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1103') +('0000000004407','PPEAR ASIAN YELLOW',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'676','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1104') +('0000000004408','PPEAR ASIAN BROWN',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'676','2009-04-22 07:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1105') +('0000000004409','PPEAR BARTLETT SM',1.69,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','546','0','0','1','1',0,'620','2009-09-09 05:02:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1106') +('0000000004410','PPEAR BARTLETT RED',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'621','2009-09-21 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1107') +('0000000004412','PPEAR BOSC LARGE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'622','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1108') +('0000000004413','PPEAR BOSC LG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'622','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1109') +('0000000004414','PPEAR COMICE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'775','2008-10-11 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1110') +('0000000004415','PPEAR DANJOU RED LG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'624','2009-04-29 08:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1111') +('0000000004416','PPEAR DANJOU LG',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'623','2009-07-15 06:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1112') +('0000000004417','PPEAR DANJOU RED',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'624','2009-04-29 08:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1113') +('0000000004418','PPEAR FORELLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'774','2007-09-24 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1114') +('0000000004419','PPEAR LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'1280','2006-10-03 09:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1115') +('0000000004420','PPEAR SECKEL',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'797','2008-11-24 09:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1116') +('0000000004421','PPEAR PACKHAM',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'773','2009-07-08 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1117') +('0000000004422','PPEAR SECKEL',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'797','2008-11-24 09:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1118') +('0000000004424','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.01,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1119') +('0000000004425','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1120') +('0000000004426','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1121') +('0000000004427','PPERSIMMON',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'804','2008-11-16 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1122') +('0000000004428','PPERSIMMON JAPANESE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'804','2008-11-16 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1123') +('0000000004429','PPLUM LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'813','2008-09-18 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1124') +('0000000004430','PPINEAPPLE LG',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1125') +('0000000004431','PPINEAPPLE JET SM',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1126') +('0000000004432','PPINEAPPLE JET LG',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1127') +('0000000004433','PPINEAPPLE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1128') +('0000000004434','PPLUM GREEN SM',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'810','2007-09-10 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1129') +('0000000004435','PPLUM GREEN LG',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'810','2007-09-10 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1130') +('0000000004436','PPLUM Non-o LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'813','2008-09-18 01:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1131') +('0000000004437','PPLUM PURPLE SM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'812','2008-09-30 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1132') +('0000000004438','PPLUM PURPLE LG',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'812','2009-03-11 07:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1133') +('0000000004439','PPLUM TREE RIPE SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'811','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1134') +('0000000004440','PPLUM RED',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'811','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1135') +('0000000004441','PPLUM BLACK',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'809','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1136') +('0000000004442','PPLUM YELLOW LG',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'574','2009-09-21 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1137') +('0000000004443','PNECTA-PLUM',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','1',0,'1131','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1138') +('0000000004444','PSOUP KITCHEN/SALE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1139') +('0000000004445','PPOMEGRANATE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'652','2008-12-10 07:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1140') +('0000000004446','PMANGO FRANCIQUE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'766','2008-05-10 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1141') +('0000000004447','PQUINCE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'816','2008-10-24 08:04:00','0',0.01,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1142') +('0000000004448','PTAMARINDO',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1135','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1143') +('0000000004449','PTANGERINE SUNBURST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'830','2009-02-04 07:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1144') +('0000000004450','PCLEMENTINE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'731','2009-03-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1145') +('0000000004451','PSWEET ORANGE BAG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1132','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1146') +('0000000004452','PTANGERINE FAIRCHILD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'825','2009-03-10 08:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1147') +('0000000004453','PTANGERINE HONEY MURCOT',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'827','2009-05-06 05:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1148') +('0000000004454','PTANGERINE HONEY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'826','2009-02-18 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1149') +('0000000004455','PMANDARIN SATSUMA',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'818','2009-02-20 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1150') +('0000000004456','PTANGELO ORLANDO',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'822','2009-02-04 07:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1151') +('0000000004457','PCLEMENTINE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'731','2009-03-25 07:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1152') +('0000000004458','PCLEMENTINE 5# CASE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1121','2008-01-13 10:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1153') +('0000000004459','PUGLI FRUIT',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1291','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1154') +('0000000004466','PJUICING CARROTS LOCAL',25.10,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','0',0,'870','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1155') +('0000000004471','PRHUBARB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','553','0','0','1','1',0,'1005','2009-08-26 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1156') +('0000000004487','PARUGULA SALAD HV 4 OZ',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1157') +('0000000004491','PPEPPER BELL YELLOW NON-O',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'1086','2009-07-22 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1158') +('0000000004492','PPEPPER BELL GREEN NON-O',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'984','2007-10-08 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1159') +('0000000004493','PPEPPER BELL RED NON-O',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'952','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1160') +('0000000004494','PPEAR CONCORDE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','1',0,'802','2008-12-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1161') +('0000000004495','PPEPPER ORANGE BELL NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'985','2009-05-27 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1162') +('0000000004496','PGRAPEFRUIT',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'571','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1163') +('0000000004497','PGRAPE GREEN SEEDLESS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'673','2009-09-11 04:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1164') +('0000000004498','PGRAPE SEEDLESS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'577','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1165') +('0000000004499','PGRAPE CRIMSON SEEDLESS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'577','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1166') +('0000000004510','PSPROUT MOMS DAIKON',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1087','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1167') +('0000000004511','PSPROUT MOMS LENTIL',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1060','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1168') +('0000000004512','PBEAN ROMANO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'847','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1169') +('0000000004513','PSPROUT MOMS SPICY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1058','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1170') +('0000000004514','PSPROUTS DAIKON',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1022','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1171') +('0000000004515','PANISE',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'913','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1172') +('0000000004516','PARTICHOKE SM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'636','2009-09-21 02:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1173') +('0000000004517','PARTICHOKE PURPLE SM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'636','2009-09-21 02:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1174') +('0000000004518','PARTICHOKE PURPLE LG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'636','2009-09-21 02:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1175') +('0000000004519','PARTICHOKE BABY',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'mixmatchcode','2009-03-30 12:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1176') +('0000000004520','PSPROUTS ALFALFA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1177') +('0000000004521','PASPARAGUS LG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'637','2009-06-17 06:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1178') +('0000000004522','PASPARAGUS WHITE SM',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','1',0,'839','2007-10-01 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1179') +('0000000004523','PASPARAGUS WHITE LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','1',0,'839','2007-10-01 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1180') +('0000000004524','PASPARAGUS TIPS',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','1',0,'1292','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1181') +('0000000004525','PASPARAGUS NON-O 1LB',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'1386','2009-09-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1182') +('0000000004526','PBEAN CRANBERRY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'841','2007-10-01 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1183') +('0000000004527','PBEAN LIMA',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'843','2007-10-01 10:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1184') +('0000000004528','PBEAN FAVA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'840','2009-04-01 07:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1185') +('0000000004529','PBEAN HARICOT VERT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'842','2007-10-01 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1186') +('0000000004530','PBEAN POLE',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'1155','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1187') +('0000000004531','PBEAN PURPLE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'844','2008-05-21 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1188') +('0000000004532','PBEAN SHELL',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'1156','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1189') +('0000000004533','PBEAN WAX/YELLOW',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','1','1','1',0,'848','2009-07-29 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1190') +('0000000004534','PBEAN DRAGON',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'1153','2007-08-27 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1191') +('0000000004535','PBEAN EDAMAME',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'886','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1192') +('0000000004536','PBEAN SPROUTS',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'655','2008-09-30 01:02:00','0',0.0,'0','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1193') +('0000000004537','PBEET BABY GOLDEN',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'851','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1194') +('0000000004538','PBEET BABY RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'851','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1195') +('0000000004539','PBEET BUNCH',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'850','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1196') +('0000000004540','PBEET LOOSE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'851','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1197') +('0000000004541','PBEAN GREEN JUMBO',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'1154','2004-10-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1198') +('0000000004542','PBEET GREENS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'849','2007-10-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1199') +('0000000004543','PBELGIAN ENDIVE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','1',0,'1159','2009-09-11 08:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1200') +('0000000004544','PBOK CHOY BABY',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'854','2009-06-30 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1201') +('0000000004545','PBOK CHOY',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'853','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1202') +('0000000004546','PBONIATO',1000.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'1295','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1203') +('0000000004547','PRAPINI',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','0',0,'mixmatchcode','2009-03-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1204') +('0000000004548','PBROCCOLI FLORETTES',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'1161','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1205') +('0000000004549','PGAI LAN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','0',0,'1299','2005-07-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1206') +('0000000004550','Pgreen',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'693','2009-02-11 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1207') +('0000000004552','PCABBAGE NAPA',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'862','2009-07-08 08:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1208') +('0000000004554','PCABBAGE RED',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'861','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1209') +('0000000004555','PCABBAGE SAVOY',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'863','2009-02-25 07:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1210') +('0000000004558','PWSQUASH GIANT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','525','0','0','1','0',0,'1196','2007-08-28 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1211') +('0000000004560','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1212') +('0000000004561','PCARROT FRENCH',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'867','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1213') +('0000000004562','PCARROT LOOSE /LB',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','1',0,'864','2009-05-27 06:04:00','0',0.01,'1','0','0','1','0',0,0.00,'1',NULL,'6',NULL,NULL,'1214') +('0000000004563','PCARROT GREENTOP PURPLE',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'868','2009-01-08 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1215') +('0000000004564','PCARROT LOOSE PURPLE',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'725','2009-02-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1216') +('0000000004565','PCARROTS JUICING 25#',25.10,'0',0.00,'0',21.34,'0',21.34,'0','2007-01-19 12:00:00','2011-01-31 12:00:00','511','0','0','1','0',0,'870','2009-08-05 07:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1217') +('0000000004566','PCARROT GREENTOP YELLOW',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'868','2009-01-08 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1218') +('0000000004567','PCAULIFLOWER GREEN',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'1165','2009-07-01 08:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1219') +('0000000004568','PCAULIFLOWER PURPLE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'1011','2009-07-01 08:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1220') +('0000000004569','PCARROT GREENTOP RAINBOW',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'868','2009-01-08 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1221') +('0000000004570','PROMANESCO CAULIFLOWER',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'1012','2009-07-28 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1222') +('0000000004575','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1223') +('0000000004576','PCELERY STICKS',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','1',0,'1166','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1224') +('0000000004584','PCORN DECORATIVE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','1','0','0',0,'874','2009-09-12 09:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1225') +('0000000004585','PCELERIAC-CELERYROOT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'871','2009-04-22 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1226') +('0000000004586','PCHARD GREEN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'572','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1227') +('0000000004587','PCHARD RED',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'572','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1228') +('0000000004588','PPOPCORN',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'0','2008-11-21 05:04:00','1',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1229') +('0000000004589','PCORN BABY',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','1',0,'1167','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1230') +('0000000004590','PCORN SWEET BI-COLOR',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'689','2009-08-10 06:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1231') +('0000000004591','PCORN SWEET BAGGED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1168','2004-10-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1232') +('0000000004592','PCUCUMBER ASIAN',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1344','2008-09-04 01:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1233') +('0000000004593','PCUCUMBER EUROPEAN',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'638','2009-05-13 09:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1234') +('0000000004594','PCUCUMBER JAPANESE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1297','2005-05-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1235') +('0000000004595','PCUCUMBER LEMON',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','1',0,'880','2007-10-01 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1236') +('0000000004596','PCUCUMBER PICKLING',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','1',0,'879','2007-10-01 12:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1237') +('0000000004597','PDAIKON GREENTOP',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1175','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1238') +('0000000004598','PRADISH DAIKON',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1003','2009-09-21 03:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1239') +('0000000004599','PEGGPLANT BABY',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'888','2008-07-24 09:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1240') +('0000000004600','PEGGPLANT BABY WHITE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'888','2008-07-24 09:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1241') +('0000000004601','PEGGPLANT JAPANESE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'888','2008-07-24 09:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1242') +('0000000004602','PEGGPLANT LOCAL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'887','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1243') +('0000000004603','PGARLIC BRAID',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'499','2009-08-04 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1244') +('0000000004604','PENDIVE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','1',0,'677','2009-04-29 08:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1245') +('0000000004605','PESCAROLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'889','2008-12-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1246') +('0000000004606','PFRISSEE',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'mixmatchcode','2009-03-15 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1247') +('0000000004607','PAVOCADO HASS',1.69,'0',0.00,'0',0.10,'0',0.10,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','557','0','0','1','0',0,'579','2009-09-09 05:02:00','0',0.0,'1','5','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1248') +('0000000004608','PGARLIC BULK',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'895','2009-09-19 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1249') +('0000000004609','PGARLIC GREEN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'897','2009-05-28 07:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1250') +('0000000004610','PGARLIC BULK LOCAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'895','2009-09-19 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1251') +('0000000004611','PGARLIC PEELED',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'898','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1252') +('0000000004612','PGINGER ROOT',6.69,'0',0.00,'0',4.99,'0',4.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','508','0','0','1','1',0,'899','2009-04-15 07:00:00','0',0.01,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1253') +('0000000004613','PTURMERIC ROOT',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'1040','2009-01-07 07:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1254') +('0000000004614','PCOLLARD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'873','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1255') +('0000000004615','PDANDELION GREEN',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'654','2009-06-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1256') +('0000000004616','PMUSTARD GREENS',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'966','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1257') +('0000000004617','PGREENS ASIAN',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1183','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1258') +('0000000004618','PGREENS TEXAS MUSTRD',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'966','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1259') +('0000000004619','PGREENS TURNIP',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','512','0','0','1','1',0,'1184','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1260') +('0000000004620','PSALAD SPRING MIX BULK',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','1',0,'1007','2009-06-10 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1261') +('0000000004621','PSALAD SPRING MIX FAMILY SZ',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1020','2007-10-08 02:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1262') +('0000000004622','PSALAD ORIENTAL MIX',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','1',0,'1190','2006-06-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1263') +('0000000004623','PGREENS MIXED JUNIOR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','512','0','0','1','1',0,'1301','2006-06-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1264') +('0000000004624','PSALAD SPRING MIX LOCAL NON-O',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1042','2007-10-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1265') +('0000000004625','PHORSERADISH ROOT',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'940','2009-06-10 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1266') +('0000000004626','PJICAMA',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'942','2009-06-30 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1267') +('0000000004627','PKALE',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'943','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1268') +('0000000004628','PKOHLRABI',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'678','2009-08-22 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1269') +('0000000004629','PLEEK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'644','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1270') +('0000000004630','PLEEK BABY',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'946','2007-10-08 11:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1271') +('0000000004631','PLETTUCE BIBB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'948','2009-09-16 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1272') +('0000000004632','PLETTUCE BUTTER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'948','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1273') +('0000000004634','PLETTUCE ICEBERG NON-O',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'1387','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1274') +('0000000004635','PGRAPE RED SEEDLESS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'577','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1275') +('0000000004636','PGRAPE GLOBE RED',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'739','2008-03-31 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1276') +('0000000004639','PMACHE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'955','2007-10-08 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1277') +('0000000004640','PLETTUCE ROMAINE',2.29,'0',0.00,'0',1.99,'0',1.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','515','0','0','1','0',0,'954','2009-06-03 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1278') +('0000000004641','PLETTUCE SPECIALTY OAKLEAF',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'949','2007-10-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1279') +('0000000004643','PMIZUNA',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'966','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1280') +('0000000004646','PMUSHROOM MORELS',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'964','2009-05-18 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1281') +('0000000004647','PMUSHROOM MOREL BULK',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','1',0,'1187','2009-05-18 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1282') +('0000000004648','PMUSHROOM CRIMINI BULK',4.49,'0',0.00,'0',0.20,'0',0.20,'0','2009-03-31 12:00:00','2010-03-29 12:00:00','516','0','0','1','1',0,'956','2008-12-31 09:05:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1283') +('0000000004649','PMUSHROOM OYSTER BULK',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'905','2008-09-30 01:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1284') +('0000000004650','PMUSHROOM PORTABELLA BULK',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','1',0,'961','2009-07-22 06:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1285') +('0000000004651','PMUSHROOM SHIITAKE BULK',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','1',0,'962','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1286') +('0000000004652','PMUSHROOM DRY WOOD EAR',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'960','2007-10-08 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1287') +('0000000004653','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1288') +('0000000004654','PBABY SPINACH REPACK',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1294','2008-10-29 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1289') +('0000000004655','POKRA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'967','2009-06-30 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1290') +('0000000004656','POKRA CHINESE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'967','2009-06-30 10:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1291') +('0000000004657','PONION CIPPOLINI 8OZ BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','208','0','0','1','0',0,'0','2008-04-25 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1292') +('0000000004658','PONION CIPPOLINI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'970','2009-02-10 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1293') +('0000000004659','PONION RED SPRING',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'973','2009-02-25 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1294') +('0000000004660','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1295') +('0000000004661','PSHALLIONS',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'1306','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1296') +('0000000004662','PSHALLOTS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'1044','2009-09-19 11:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1297') +('0000000004663','PONION WHITE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'974','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1298') +('0000000004664','PTOMATO VINE ON',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1030','2009-07-24 11:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1299') +('0000000004665','PONION YELLOW',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'640','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1300') +('0000000004667','PONION SWEET ORG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'641','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1301') +('0000000004668','PONION BAG RED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'633','2009-03-05 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1302') +('0000000004669','PONION SWEET BAG',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'968','2007-10-08 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1303') +('0000000004670','PBURDOCK ROOT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'859','2009-01-16 07:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1304') +('0000000004671','PPARSLEY ROOT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'975','2007-10-08 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1305') +('0000000004672','PPARSNIPS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'642','2009-09-14 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1306') +('0000000004673','PPEAS SHELLING',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'977','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1307') +('0000000004674','PPEAS TENDRILS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'980','2007-10-01 11:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1308') +('0000000004675','PPEAS SNAP',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'978','2009-08-30 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1309') +('0000000004676','PPARSNIPS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'642','2009-09-14 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1310') +('0000000004677','PPEPPER ANAHEIM',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1311') +('0000000004678','PPEPPER BANANA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1312') +('0000000004679','PPEPPER BELL BROWN',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'1188','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1313') +('0000000004680','PPEPPER BELL YELLOW',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'539','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1314') +('0000000004681','PPEPPER BELL GREEN SMALL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'537','2009-09-04 05:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1315') +('0000000004682','PPEPPER BELL ORANGE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'mixmatchcode','2009-04-10 10:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1316') +('0000000004683','PPEPPER BELL PURPLE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'499','2009-09-03 08:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1317') +('0000000004684','PPEPPER BELL WHITE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'982','2008-08-12 01:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1318') +('0000000004685','PPEPPER MINI SWEET CLAM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','0',0,'698','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1319') +('0000000004686','PPEPPER CHILI GREEN',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1320') +('0000000004687','PPEPPER CUBANELLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1321') +('0000000004688','PPEPPER EUROPEAN RED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'538','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1322') +('0000000004689','PPEPPER EUROPEAN YLW',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'539','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1323') +('0000000004690','PPEPPER HOT',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1324') +('0000000004691','PPEPPER HOT MIXED',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1325') +('0000000004692','PPEPPER HUNGARIAN WX',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1326') +('0000000004693','PPEPPER JALAPENO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1327') +('0000000004694','PPEPPER JALAPENO RED',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1328') +('0000000004695','PPEPPER JAPANESE RED',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1329') +('0000000004696','PPEPPER LONG GREEN',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1330') +('0000000004697','PPEPPER LONG RED',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1331') +('0000000004698','PPEPPER MORITA CHILI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1332') +('0000000004699','PPEPPER NEGRO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1333') +('0000000004700','PPEPPER NEW MEXICO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1334') +('0000000004701','PPEPPER PASILLA GRN',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1335') +('0000000004702','PPEPPER PASILLA RED',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1336') +('0000000004703','PPEPPER PASILLA POD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1337') +('0000000004704','PPEPPER PINOLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1338') +('0000000004705','PPEPPER POBLANO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1339') +('0000000004706','PPEPPER RED CHEESE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1340') +('0000000004707','PPEPPER RED FINGER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1341') +('0000000004708','PPEPPER RED PIMIENTO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1342') +('0000000004709','PPEPPER SERRANO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1343') +('0000000004710','PFLOWER ORN PEPPER',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1344') +('0000000004716','PCHESTNUTS',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','548','0','0','1','1',0,'730','2008-11-22 05:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1345') +('0000000004717','PAPPLE CRAB APPLE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'501','2007-09-09 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1346') +('0000000004721','PPOTATO BAG WHITE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'989','2007-09-07 10:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1347') +('0000000004722','PPOTATO SPECIALTY',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'646','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1348') +('0000000004723','PPOTATO SPECIALTY RED',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'1219','2009-08-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1349') +('0000000004725','PPOTATO RUSSET',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'993','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1350') +('0000000004727','PPOTATO YUKON YELLOW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'995','2009-07-29 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1351') +('0000000004729','PPOTATO FINGERLING BULK',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','1',0,'834','2009-01-20 12:01:00','0',0.01,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1352') +('0000000004730','PPOTATO SPECIALTY PURPLE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'646','2009-08-13 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1353') +('0000000004731','PPOTATO BAG ROASTERS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'893','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1354') +('0000000004732','PGOURD LARGE DECOR',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'583','2007-10-11 11:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1355') +('0000000004733','PGOURD SMALL DECORATIVE',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'900','2008-09-30 01:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1356') +('0000000004734','PPUMPKIN MINI',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'997','2008-10-30 09:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1357') +('0000000004735','PPUMPKIN PIE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','525','0','0','1','1',0,'998','2009-09-21 03:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1358') +('0000000004737','PPUMPKIN CARVING',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'996','2008-09-30 01:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1359') +('0000000004738','PRADICCHIO',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'999','2009-04-22 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1360') +('0000000004739','PRADISH BLACK SPANISH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1002','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1361') +('0000000004740','PRADISH BUNCHED WH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'656','2009-08-26 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1362') +('0000000004742','PRADISH BAG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1000','2009-04-15 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1363') +('0000000004743','PRADISH WINTER',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1001','2009-09-16 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1364') +('0000000004744','PRADISH BEAUTY/WATERMELON',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1001','2009-09-16 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1365') +('0000000004746','PRADISH BAGGED NON-ORG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1000','2009-05-13 09:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1366') +('0000000004747','PRUTABAGAS',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1006','2009-07-08 08:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1367') +('0000000004748','PSALAD BABY SPINACH BULK',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','1',0,'1019','2009-06-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1368') +('0000000004750','PWSQUASH ACORN',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1369') +('0000000004751','PWSQUASH GOLD ACORN',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1370') +('0000000004752','PWSQUASH WHITE ACORN',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1371') +('0000000004753','PWSQUASH AUSTRALIA B',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1372') +('0000000004754','PSQUASH BABY SCALLOP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1373') +('0000000004755','PSQUASH BABY SUMMER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1374') +('0000000004757','PWSQUASH BANANA',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1375') +('0000000004758','PWSQUASH BUTTERCUP',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1376') +('0000000004759','PWSQUASH BUTTERNUT',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1377') +('0000000004760','PWSQUASH CREAM OF THE CROP',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1378') +('0000000004761','PWSQUASH CHAYOTE',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1379') +('0000000004763','PWSQUASH DELICATA',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1380') +('0000000004764','PWSQUASH DUMPLING',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1381') +('0000000004765','PSQUASH GEM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1382') +('0000000004766','PWSQUASH GOLD DELICI',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1383') +('0000000004767','PWSQUASH GOLD NUGGET',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1384') +('0000000004768','PWSQUASH HUBBARD',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','525','0','0','1','1',0,'1025','2007-10-23 09:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1385') +('0000000004769','PWSQUASH KABOOCHA',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1386') +('0000000004770','PLETTUCE BAG LOCAL TENDER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'1304','2009-07-30 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1387') +('0000000004771','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1388') +('0000000004772','PPEPPER CHILI YELLOW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','1',0,'536','2009-06-17 06:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1389') +('0000000004773','PSQUASH PATTY/PAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1390') +('0000000004774','PWSQUASH RED KURI',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1391') +('0000000004775','PSQUASH SCALLOPINI',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'505','2007-09-13 07:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1392') +('0000000004776','PWSQUASH SPAGHETTI',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1393') +('0000000004777','PSQUASH SUNBURST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1394') +('0000000004778','PTOMATO YELLOW',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1038','2007-10-11 10:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1395') +('0000000004779','PWSQUASH SWEET MAMA',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1396') +('0000000004780','PWSQUASH TURBAN',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1397') +('0000000004781','PWSQUASH WINTER',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1398') +('0000000004782','PSQUASH YELLOW STRAI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1399') +('0000000004784','PSQUASH YELLOW CROOK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1400') +('0000000004785','pwsquash',1.49,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','525','0','0','1','1',0,'506','2009-09-18 12:00:00','0',0.0,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1401') +('0000000004786','PSQUASH SUMMER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'645','2009-09-16 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1402') +('0000000004788','PSHISO LEAVES',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'1017','2007-10-01 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1403') +('0000000004789','PEXTREME PROUCE SPECIAL - BLUE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1379','2009-07-09 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1404') +('0000000004790','PSUGAR CANE',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','208','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1405') +('0000000004791','PSUNCHOKES',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1028','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1406') +('0000000004792','PTAMARILLO GOLD',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1308','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1407') +('0000000004793','PTAMARILLO RED',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'1308','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1408') +('0000000004794','PTARO ROOT SM',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1309','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1409') +('0000000004795','PTARO ROOT LG',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1309','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1410') +('0000000004796','PTOMATO CHERRY LOCAL SUNGOLD',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'1034','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1411') +('0000000004797','PTOMATO CHERRY YELLW',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1412') +('0000000004798','PTOMATO SM',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.01,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1413') +('0000000004799','PTOMATO SLICER',2.99,'0',0.00,'0',0.15,'0',0.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','524','0','0','1','1',0,'525','2009-08-17 08:04:00','0',0.0,'1','5','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1414') +('0000000004800','PHERB PARSLEY ORGANIC',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'546','2009-07-01 08:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1415') +('0000000004801','PTOMATILLOS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1029','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1416') +('0000000004802','PWHEATGRASS CUPS NON-O',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1024','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1417') +('0000000004803','PWHEATGRASS CUPS OG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1024','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1418') +('0000000004806','PTOMATO HEIRLOOM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'653','2009-07-22 06:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1419') +('0000000004807','PTOMATO CHERRY LOCAL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'582','2009-07-18 10:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1420') +('0000000004808','PTOMATO CHERRY FEATHERSTONE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1421') +('0000000004809','PTURNIP BABY',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'507','2009-09-24 10:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1422') +('0000000004810','PTURNIP BUNCH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1194','2005-02-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1423') +('0000000004811','PTURNIP PURPLE TOP',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'507','2009-09-24 10:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1424') +('0000000004812','PTURNIP WHITE',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'507','2009-09-24 10:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1425') +('0000000004813','PMOREL MUSHROOMS',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'964','2008-04-03 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1426') +('0000000004814','PWATERCHESTNUTS',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'1195','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1427') +('0000000004815','PWATERCRESS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'679','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1428') +('0000000004816','PYAM GOLDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','526','0','0','1','1',0,'570','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1429') +('0000000004817','PYAM RED LG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','526','0','0','1','1',0,'570','2009-08-12 06:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1430') +('0000000004818','PYAMS BAGGED 3#',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1197','2008-10-15 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1431') +('0000000004819','PYUCCA ROOT',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'1198','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1432') +('0000000004820','PMACHE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'955','2007-10-08 02:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1433') +('0000000004821','plettuce mix greenhouse non-o',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1380','2009-06-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1434') +('0000000004822','PSALAD SPRING/LETTUCE MIX LOCA',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1380','2009-06-10 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1435') +('0000000004823','PSALAD SPICY MIX LOCAL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1380','2009-06-10 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1436') +('0000000004824','PSALAD ARUGULA LOCAL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1380','2009-06-10 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1437') +('0000000004825','PSALAD CRESS LOCAL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1380','2009-06-10 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1438') +('0000000004826','PSALAD BABY SPINACH LOCAL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1380','2009-06-10 06:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1439') +('0000000004848','PTURNIP SCARLETT',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'507','2009-09-24 10:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1440') +('0000000004866','PAPPLE BAG PINK LADY EXTREME',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1379','2009-07-09 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1441') +('0000000004884','PARUGULA',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'837','2007-10-13 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1442') +('0000000004885','PHERB BASIL 4OZ PESTO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1443') +('0000000004886','PHERB BASIL 3/4 OZ BAGS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1185','2009-08-26 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1444') +('0000000004887','Pherb basil 1.5 oz',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'904','2009-08-26 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1445') +('0000000004888','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1446') +('0000000004889','PCILANTRO',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'901','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1447') +('0000000004891','PDILL WEED BUNCH',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'912','2009-04-22 07:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1448') +('0000000004892','PHERB BABY DILL LOCAL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'911','2007-10-01 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1449') +('0000000004893','PDILL BUNCHES',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'912','2009-04-22 07:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1450') +('0000000004894','PHERB LEMONGRASS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'918','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1451') +('0000000004895','PHERB KAFFIR LIME LEAVES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'915','2009-06-14 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1452') +('0000000004899','PHERB PARSLEY ORGANIC',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'546','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1453') +('0000000004900','PAPPLE PRISTINE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'704','2008-08-22 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1454') +('0000000004901','PPOTATO BAG RED 3#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1391','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1455') +('0000000004902','pavocado nesbit',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'1409','2009-09-02 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1456') +('0000000004909','PDANDELION GREEN',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'654','2009-06-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1457') +('0000000004910','PFENNEL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'0','2008-11-13 03:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1458') +('0000000004911','PMELON GALIA NON-O',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','1',0,'1350','2009-04-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1459') +('0000000004913','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1460') +('0000000004914','PHERB BAGGED MISC LOCAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1185','2009-08-26 09:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1461') +('0000000004915','PHERB TARRAGON LOCAL',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'906','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1462') +('0000000004916','PHERB BASIL LOCAL THAI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1332','2009-08-05 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1463') +('0000000004917','PHERB LOCAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1302','2009-08-26 09:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1464') +('0000000004918','PHERB BASIL 4 OZ LOCAL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1465') +('0000000004921','PAPPLE EXTREME LOCAL',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1356','2008-10-14 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1466') +('0000000004923','PBERRY HUCKLBERRY NON-O',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1355','2008-10-13 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1467') +('0000000004924','PBERRY BLUEBERRY NON-O',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1343','2009-04-29 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1468') +('0000000004925','PPINEAPPLE SPEARS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1335','2008-08-16 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1469') +('0000000004926','PBERRY BLACK RASPBERRY',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1400','2009-07-28 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1470') +('0000000004931','PBASIL BOUQUETS',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'0','2009-09-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12945') +('0000000004932','PCABBAGE NON-O',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'1296','2007-02-07 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1471') +('0000000004933','PCUCUMBER GREEN NON-O',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'877','2007-10-01 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1472') +('0000000004934','PAVOCADO NON-O',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','1','0',0,'715','2007-10-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1473') +('0000000004935','PAPPLE VOLUNTEER SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','0',0,'0','2009-04-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1474') +('0000000004937','PONION SWEET BAGGED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'1399','2009-07-24 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1475') +('0000000004938','PLEMON NON-O',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'1050','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1476') +('0000000004939','PSPROUTS MOMS FRENCH',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1056','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1477') +('0000000004940','PSPROUTS ITALIAN',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1057','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1478') +('0000000004941','PSPROUTS MOMS RUSSIAN',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1055','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1479') +('0000000004942','PSPROUTS MOMS B8',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1090','2008-02-26 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1480') +('0000000004944','PCARDOON',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'1059','2007-10-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1481') +('0000000004947','PGRAPEFRUIT BAG 5#',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'735','2008-11-22 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1482') +('0000000004948','PCACTUS PADDLE NOPALES',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'723','2007-09-24 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1483') +('0000000004949','PPOMMELO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'815','2009-03-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1484') +('0000000004950','PCUCUMBER SNACK SIZE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','525','0','0','1','1',0,'1170','2008-07-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1485') +('0000000004956','PONION SWEET GREENTOP',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'969','2008-07-19 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1486') +('0000000004957','PGRAPES BLACK',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','1',0,'499','2009-08-25 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1487') +('0000000004958','PLEMON',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'1050','2009-09-09 05:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1488') +('0000000004959','PMANGO',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'762','2009-07-21 08:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1489') +('0000000004961','PMANGO ATAULFO',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'765','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1490') +('0000000004963','PSHALLOT NON-O PKG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'1329','2008-06-24 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1491') +('0000000004965','PTOMATO BAY SALAD SPECIAL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1359','2009-08-21 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1492') +('0000000004967','pcarrot bunch colored mini',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'869','2009-08-05 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1493') +('0000000004974','PFLOWER ZUCCHINI',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'1338','2008-07-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1494') +('0000000004977','PSTRAW MINI BALE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','0','1','0',0,'1353','2008-10-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1495') +('0000000004979','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1496') +('0000000004985','PPEAR BAG PACKHAMS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'1401','2009-07-30 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1497') +('0000000004987','PAVOCADO BAG NON-O',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'0','2008-12-26 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1498') +('0000000004988','PPOMEGRANATE LG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'0','2008-11-24 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1499') +('0000000004989','APAPPLE FUJI EXTREME CASE',56.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','0',0,'0','2008-06-04 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1500') +('0000000004990','PLETTUCE LOCAL',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'1327','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1501') +('0000000004991','PSAPOTE',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','1',0,'817','2007-12-12 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1502') +('0000000004992','PCIDER HOCH HALF GALLON',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','2006-12-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1503') +('0000000004993','PCAULIFLOWER ORANGE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'981','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1504') +('0000000004994','PBAG STUBS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','501','0','1','0','1',0,'0','2008-05-29 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1505') +('0000000004995','PPEACH PIE',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'1134','2007-09-13 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1506') +('0000000004997','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1507') +('0000000004999','ppear bag bosc',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1508') +('0000000005000','BULK FOOD B S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','22','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1509') +('0000000005003','COFFEE S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','259','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1510') +('0000000005004','BULKNFOOD S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','25','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1511') +('0000000005005','BAG REFUND','-0.03','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','21','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1512') +('0000000005006','BAGS COFFEE',0.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','251','0','0','1','0',0,'0','2006-11-08 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1513') +('0000000005008','BULK FOOD A S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','24','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1514') +('0000000005015','HBA/BULK SO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','125','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1515') +('0000000005016','BULK HERB SO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','258','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1516') +('0000000005020','HBA/BODYCARE SO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','123','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1517') +('0000000005025','PPRODUCE S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','206','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1518') +('0000000005026','PPRODUCE S.O. TAX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','206','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1519') +('0000000005035','HBA/VIT/HERB SO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','124','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1520') +('0000000005039','PMUSHROOM MAITAKE',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1089','2009-08-25 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1521') +('0000000005050','HBA/NOTAX S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','127','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1522') +('0000000005055','DELI SPECIAL ORDER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','73','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1523') +('0000000005060','DELI NOTAX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','73','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1524') +('0000000005065','DELI CHEESE S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','233','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1525') +('0000000005067','psquash zucchini specialty',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','523','0','0','1','1',0,'1027','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1526') +('0000000005071','COOL NO DISC SO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','56','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1527') +('0000000005072','COOL SO (DISCOUNT)',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','55','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1528') +('0000000005098','PFLOWERS ROSE SINGLE STEM',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','0','1','0',0,'1381','2009-05-08 05:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1529') +('0000000005099','PFLOWERS ROSE DOZEN',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','1','0',0,'1383','2009-05-08 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1530') +('0000000005100','DRAGONFLY MORTAR AND PESTLE',18.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1531') +('0000000005101','COLBALT MORTAR AND PESTLE',17.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1532') +('0000000005500','SUNBEAM BW PILLAR 3X6',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1533') +('0000000005501','SUNBEAM BW PILLAR 3X4',12.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1534') +('0000000005502','SUNBEAM BW TAPERS',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-03 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1535') +('0000000005503','SUNBEAM BW VOTIVE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1536') +('0000000005508','SUNBEAM LOVE PILLAR 3x4',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-01-29 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1537') +('0000000005509','SUNBEAM LOVE PILLAR 2x6',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-01-29 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1538') +('0000000005510','SUNBEAM LOVE VOTIVE RED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-01-27 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1539') +('0000000005512','SUNBEAM LG. HEART',11.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-01-27 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1540') +('0000000005513','SUNBEAM LOVE 2X3',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-01-27 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1541') +('0000000005514','SUNBEAM LOVE PILLAR 3X6',18.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-01-27 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1542') +('0000000005515','GROWERS TEA 5# MCDONALDS',32.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-04-30 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1543') +('0000000005516','SUNBEAM BW PINECONE SM',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1544') +('0000000005517','SUNBEAM BW PINECONE LG',13.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-10-17 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1545') +('0000000005518','PEAT PELLETS',0.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-02-11 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1546') +('0000000005521','GOURD WITH RIM',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1549') +('0000000005523','SINGLE TRAY',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-03-27 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1550') +('0000000005524','ORGANIC COMPOST ACTIVATOR',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-04-20 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1551') +('0000000005525','BYO REUSABLE BAG',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-05-19 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1552') +('0000000005678','APOLONIA B SKIN CREAM',45.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-26 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1553') +('0000000006000','COOKIE',1.59,'2',9.49,'6',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-08-12 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',0.00,NULL,'1554') +('0000000006001','COOKIES DOZEN 3RD ST',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-10 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1555') +('0000000006002','COOKIES,SMALL 6-PAK',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-10 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1556') +('0000000006003','VAN CINNAMON CRUMB CAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2005-05-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1557') +('0000000006077','RHUBARB CREAM CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2007-05-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1558') +('0000000006119','GF Banana Cream Pie',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2006-04-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1559') +('0000000006123','GF Banana Cream Pie',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2006-04-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1560') +('0000000006160','BULK HERBAL SHAMPOO',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-08-20 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1561') +('0000000006190','NGATE PURIFYING SOAP',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-03-08 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1562') +('0000000006232','BR BRONNERS BULK SP',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1563') +('0000000006234','ALMOND OIL PURE SWEE',13.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2005-02-20 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1564') +('0000000006235','AURA CACIA SOOTH HEAT OIL BULK',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-07-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1565') +('0000000006326','COFFEE 3# ALAKEF ORGANIC',33.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-08-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1566') +('0000000006392','DISH BRUSHL, REPLACEMENT HEAD',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1567') +('0000000006407','Spinach Walnut Feta Quiche',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','1',0,'0','2007-01-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1568') +('0000000006466','FROZ S.O.',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','57','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1569') +('0000000006667','Strawberry Rhubarb Pie',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2007-06-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1570') +('0000000006678','rds test item',0.02,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','0','0','1','0',0,'0','2004-11-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1571') +('0000000006789','SIMPLERS AROMATHERAPY GUIDE',3.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2008-12-15 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1572') +('0000000007000','HOT & SALAD BAR TO GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','1',0,'0','2005-11-01 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1573') +('0000000007011','ALOTTI BISCOTTI SINGLE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-12-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1574') +('0000000007012','6 pack of Cookies',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-10 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1575') +('0000000007226','BEAN BUSH PURPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1576') +('0000000007235','CILANTRO',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1577') +('0000000007236','BROCCOLI WALTHAM',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1578') +('0000000007240','BEANS BLUE LAKE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1579') +('0000000007244','SUNFLOWER RUSSIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1580') +('0000000007245','PEAS SUGAR POD 2',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1581') +('0000000007250','SPINACH BLOOMSDA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1582') +('0000000007251','ECHINACEA PRPL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1583') +('0000000007254','ARUGULA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1584') +('0000000007257','PCHAMOMILE GERMAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1585') +('0000000007258','PEAS PIONEER SHL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1586') +('0000000007259','TOBACCO SCHERAZI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1587') +('0000000007260','ZINNIA MIXED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1588') +('0000000007262','CUCUMBERS MIDEST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1589') +('0000000007268','KALE RED RUSSIAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1590') +('0000000007271','LETTUCE LONG ST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1591') +('0000000007273','LETTUCE SIMPSON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1592') +('0000000007277','ZUCCHINI COCOZEL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1593') +('0000000007278','TOMATOES PEACE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1594') +('0000000007283','CALENDULA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1595') +('0000000007359','BEANS SNAP PROVD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1596') +('0000000007428','BULK HERBAL CONDITIO',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','92','0','1','0','1',0,'0','2008-08-20 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1597') +('0000000007506','BILBERRY NECTAR',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-08-19 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1598') +('0000000007999','GALLON PUMP TOP',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2008-12-30 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1599') +('0000000008001','Hot Bar half price',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','1',0,'0','2006-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1600') +('0000000008366','BOTTLES PLASTIC, OR CONTAINERS',0.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','1','0','0',0,'0','2008-02-06 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1601') +('0000000008410','PSEEDS, PUMP SM SUGA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1602') +('0000000008414','BASIL GENOVESE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1603') +('0000000008417','SQUASH DELICATA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1604') +('0000000008423','SALAD MIX',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1605') +('0000000008424','CABBAGE CHINESE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1606') +('0000000008427','SEEDS PKG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1607') +('0000000008432','TOMATO ROMA PST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1608') +('0000000008495','ROASTED GARLIC',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1609') +('0000000008642','MAC UN-CHEESE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1610') +('0000000008661','CARDS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','241','0','1','0','0',0,'499','2009-06-05 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1611') +('0000000008864','CHIMICHURRI TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-08-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1612') +('0000000008887','SAVANAH BISQUE',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-09-21 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1613') +('0000000009014','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1614') +('0000000009084','TOMATO BRANDYWIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1615') +('0000000009086','SQUASH BUTTERNUT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1616') +('0000000009087','ASTER GIANT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1617') +('0000000009088','SUNFLOWER MEXICN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1618') +('0000000009090','LETTUCE 4 SEASON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1619') +('0000000009232','DRESSING,GODDESS 16OZ',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-11-24 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1620') +('0000000009387','COFFEE 3# ORGANIC',33.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2009-01-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1621') +('0000000009416','PONION SWEET ORG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'641','2009-08-05 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1622') +('0000000009876','test tax',1.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','76','0','0','0','0',0,'0','2008-06-04 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1623') +('0000000009896','CHARD RHUBARB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1624') +('0000000009898','COREOPSIS MAROON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1625') +('0000000009899','MARIGOLD PINWHEL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1626') +('0000000009900','SUNFLOWER EVENG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1627') +('0000000009901','WATERMELON SWT N',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1628') +('0000000009902','CARROT SCARLET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1629') +('0000000009903','BEET DETROIT RED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1630') +('0000000009904','PSEEDS CHERRY RADISH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1631') +('0000000009906','SNAP PEA CASCDA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1632') +('0000000009907','SUNFLOWER DSCVRY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1633') +('0000000009908','BEAN BUSH YELOW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1634') +('0000000009909','CARROT ROYAL CHN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1635') +('0000000009911','CUCUMBER N. PCKL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1636') +('0000000009912','SQUASH BUTTERCUP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1637') +('0000000009913','SUMMER SAVORY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1638') +('0000000009916','KALE TRUE SIBERN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1639') +('0000000009930','ZEVIA BEVERAGE SINGLE',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-06-12 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1640') +('0000000009931','SPRITZER SINGLE CAN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'499','2009-05-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1641') +('0000000009932','BLUE SKY SINGLE CAN',0.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-05-22 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1642') +('0000000009998','TESTING2',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','208','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1643') +('0000000009999','PFIX',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','201','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1644') +('0000000010709','JALAPENO CHILE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1645') +('0000000010710','SQUASH GOLDEN O',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1646') +('0000000010711','DAISY GLORIOSA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1647') +('0000000010712','VALERIAN SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1648') +('0000000010713','CATNIP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1649') +('0000000010714','PSEEDS, PUMP JACK-O',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1650') +('0000000010715','LAMBS EARS SEED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1651') +('0000000010716','DAHLIA MIX GIANT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1652') +('0000000010717','DILL MAMMOTH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1653') +('0000000010718','ONION VALENCIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1654') +('0000000010719','ECHIUM SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1655') +('0000000010720','BUTTONS BACHELOR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1656') +('0000000010721','CONEFLOWER PRAIR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1657') +('0000000010722','SAGE SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1658') +('0000000010723','FOXGLOVE SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1659') +('0000000010724','DAISY ZULU SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1660') +('0000000010725','MINT DOTTED SEED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1661') +('0000000010726','FEVERFEW SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1662') +('0000000010727','CABBAGE EARLIANA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1663') +('0000000010728','LAVENDER SEEDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1664') +('0000000011333','ALMOND BUTTER',9.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'1665') +('0000000011388','PSEEDS RAINBOW CHILE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1666') +('0000000011389','NARDELLO PEPPER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1667') +('0000000011390','RED PIMIENTO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1668') +('0000000011391','SPINACH VIROFLAY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1669') +('0000000011392','ZUCCHINI GOLDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1670') +('0000000011393','WATERMELON MOON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1671') +('0000000011394','TOMATO BURBANK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1672') +('0000000011395','TATSOI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1673') +('0000000011396','CORN TRUE GOLD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1674') +('0000000011397','BEAN SCAR EMPER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1675') +('0000000011399','BROCCOLI EARLY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1676') +('0000000011400','CUCUMBER BUSH CH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1677') +('0000000011401','LETTUCE RED OAK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1678') +('0000000011402','LETTUCE BUTTER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1679') +('0000000011403','LETTUCE GEM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1680') +('0000000011404','MUSKMELON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1681') +('0000000011405','MUSTARD GREENS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1682') +('0000000011406','PSEED PARSLEY FOREST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1683') +('0000000011407','SUNFLOWER TIGER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1684') +('0000000011408','PSEED PARSLEY ITALIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1685') +('0000000011409','ELECAMPANE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1686') +('0000000011410','RUE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1687') +('0000000011411','SAGE HUMMINGBIRD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1688') +('0000000011416','EVENING PRIMROSE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1689') +('0000000011417','CAMPANULA PEACH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1690') +('0000000011418','LIONS TAIL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1691') +('0000000011419','ROCKROSE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1692') +('0000000011420','POPPY APRICOTTA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1693') +('0000000011421','BALLOON FLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1694') +('0000000011422','SHOO-FLY EBONY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1695') +('0000000011423','COREOPSIS MIX',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1696') +('0000000011424','MALLOW PURPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1697') +('0000000011425','NIGELLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1698') +('0000000011426','CHINESE PINK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1699') +('0000000011427','YARROW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1700') +('0000000011428','AGROSTEMMA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1701') +('0000000011429','BELLS OF IRELAND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1702') +('0000000011430','AMARANTH LOVE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1703') +('0000000011431','MORNING GLORY SS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1704') +('0000000011432','COSMOS PICOTEE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1705') +('0000000011433','POPPY SCARLET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1706') +('0000000011434','FOXGLOVE PURPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1707') +('0000000011435','POPPY BLUE BREAD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1708') +('0000000011436','LARKSPUR BLUEBEL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1709') +('0000000011437','MARIGOLD FRENCH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1710') +('0000000011439','CALLIOPSIS ELEGA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1711') +('0000000011440','LAVATER0A SILVER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1712') +('0000000011441','TALMADGE FARM JAM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2007-12-11 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1713') +('0000000011445','CORN,SW PLATINUM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1714') +('0000000011446','CARROT RED CORE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1715') +('0000000011447','PSEEDS, PURSLANE LG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1716') +('0000000011463','AMARANTH GOLD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1717') +('0000000011610','PSEED,TURNIP PUR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1718') +('0000000012345','volume pricing test',1.97,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','1','1','0',0,'10499','2009-06-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1719') +('0000000024304','Spread Cheese Feta',6.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-10-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1720') +('0000000026694','GINGER CAKE WITH PEAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1721') +('0000000028682','LIL CHEDAR MEATLOAF W/ SOUR CR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-02-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1722') +('0000000030021','PFLOWER PARROT TULIP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1723') +('0000000033398','PFLOWER DRIED LARKS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1724') +('0000000046114','PGARLIC BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1725') +('0000000049146','BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1726') +('0000000089534','CREAM OF POTATO',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-11-24 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1727') +('0000000089991','RESERVED',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'0','2009-01-15 09:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1728') +('0000000089992','Potatoes, Monster Russ',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'0','2009-01-15 09:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1729') +('0000000089993','Herb, Basil 1/4 LB',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'0','2009-01-15 09:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1730') +('0000000094014','PORANGE BAG SWEET',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1132','2008-01-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1731') +('0000000094202','PAPPLE ORIN',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'702','2007-11-01 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1732') +('0000000123456','test tax and fs setting redeux',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','55','0','0','1','0',0,'1499','2007-08-14 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1733') +('0000000999369','porange purple',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1220','2007-12-12 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1734') +('0000000999990','AR PAYMENT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','990','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1735') +('0000000999991','EQUITY PAYMENT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','991','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1736') +('0000001111111','testing item',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','1','','0','0','0',0,'0','2009-08-18 10:00:00','1',0.0,'1','0','','0','0',0,0.00,'1',NULL,'1',0.00,NULL,'12764') +('0000008200833','COFFEE SOCK #2',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1737') +('0000008200834','COFFEE SOCK, NO. 4',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1738') +('0000008200835','COFFEE SOCK #6',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1739') +('0000009999901','VENDOR COUPON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1740') +('0000009999902','STORE COUPON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1741') +('0000009999903','DAHLS MILK JUG RETURN','-2.50','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','54','0','0','1','0',0,'0','2008-05-28 09:01:00','0',0.0,'0','0','0','0','1',0,0.00,'1',NULL,'2',NULL,NULL,'1742') +('0000009999904','DAHLS MILK JUG RETURN','-2.50','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','54','0','0','1','0',0,'0','2008-05-28 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1743') +('0000009999905','DAHLS MILK JUG DEPOSIT',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','54','0','0','1','0',0,'0','2008-05-28 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1744') +('0000009999906','HALF GALLON DEPOSIT',1.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','54','0','0','1','0',0,'0','2005-02-10 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1745') +('0000009999907','SUPPLIES PAID OUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1746') +('0000009999908','SALES PAID OUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'499','2009-06-19 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1747') +('0000009999909','SAMS CLUB PAID OUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'499','2009-06-19 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1748') +('0000009999910','ADVERTISING PAID OUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'499','2009-06-19 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1749') +('0000009999911','MISC PAID OUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1750') +('0000009999915','PAYROLL DEDUCTION',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1751') +('0000009999919','HEALTH INSURANCE PAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','703','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1752') +('0000009999920','MISC RECEIPT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','703','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1753') +('0000009999924','NSF CHECK REIMBURSEM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','703','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1754') +('0000009999926','LAUNDRY PAID OUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','604','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1755') +('0000009999927','EVENT FEES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','703','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'1756') +('0000025369005','PPEAR BAG RED BARTLETT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'770','2007-09-24 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1757') +('0000036000006','ECODENT TOOTHPOWDER 2 OZ',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1758') +('0000037000453','ECODENT TOOTHPOWDER TRVL PK',4.59,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1759') +('0000051810009','RAINBOW GREEN CLAY SNG',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-03-19 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1760') +('0000051890009','SHAMPOO,UNSCENTED',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1761') +('0000051890011','CONDITIONER,UNSCENTED',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1762') +('0000063800003','BABA GHANOUJ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1763') +('0000063870000','GARLIC CHIVE HOMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1764') +('0000093334455','Chris fave cheese',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2005-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1765') +('0000138390001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1766') +('0000149303020','Rudi Right Choice Herb Bread',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-07-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1767') +('0000167831380','PFLOWER BOUQUET',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1361','2008-12-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1768') +('0000167831390','PFL JUSTINS PICK',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1769') +('0000222922201','pblueberry pint',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1770') +('0000240000000','PCARROT LOCAL RANDOM WEIGHT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'0','2008-09-15 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1771') +('0000253690052','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1772') +('0000253690055','PPEAR BAG RED BARTLETT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'770','2007-09-24 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1773') +('0000254840005','PEGGROLL WRAP',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1141','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1774') +('0000254840006','PWONTON WRAPS',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1143','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1775') +('0000314939218','Rudis Cinnamon raisin Bread',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1776') +('0000333300701','PAPPLE BAG BREABURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1777') +('0000333830081','PAPPLE BAG HOLLY GOL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1778') +('0000333830988','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1779') +('0000333836700','PRADISH BAG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1000','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1780') +('0000338311006','PORANGE BAG VALLEY COVE NON-O',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'793','2009-01-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1781') +('0000385001151','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1782') +('0000451200103','PPOTATO BAG RED 3#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1391','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1783') +('0000521643722','RICE TAPIOCA SHEET',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'499','2009-07-03 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1784') +('0000734102330','Brownberry Natural Health Nut',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-09-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1785') +('0000790041008','MT STERLING CHEDDAR',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-10-02 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1786') +('0000827400005','GINGER BREW, RASPBERRY SINGLE',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1787') +('0000827400006','GINGER BREW, ORIGINAL SINGLE',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1788') +('0000827400007','GINGER BREW, EXTRA SINGLE',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1789') +('0000827409876','GINGER CHEWS,PEANUT BUTT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-09-10 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1790') +('0000827411111','GINGER BREW,ORIGINAL',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1791') +('0000827412121','GINGER BREW, CHERRY SINGLE',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1792') +('0000827412345','GINGER CRYSTALZD',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1793') +('0000827422222','SPICED APPLE BREW',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1794') +('0000827423415','CHEWY GINGER CANDY ROLLS',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-09-10 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1795') +('0000827433388','ICE CREAM,GINGER',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1796') +('0000827438383','Green Tea Ginger Ice Cream',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-04-11 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1797') +('0000827444444','GINGER BREW,EXTRA',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1798') +('0000827455555','GINGER BREW,RASPBERRY',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1799') +('0000827488995','GINGER BREW,CHERRY',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1800') +('0000890915076','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1801') +('0000894701038','PMUSHROOM OYSTER PKG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'965','2007-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1802') +('0000894701110','PMUSHROOM DRY OYSTER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'671','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1803') +('0000894701175','PMUSHROOM DRY OYSTER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'671','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1804') +('0000894702110','PMUSHROOM DRY SHITTAKE',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'959','2007-10-08 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1805') +('0000894702235','PMUSHROOM SHIITAKE PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'963','2009-01-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1806') +('0000894703280','PMUSHROOM CRIMINI PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'957','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1807') +('0000894704035','PMUSHROOM MOREL PKG',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'964','2008-04-03 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1808') +('0000894706035','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1809') +('0000894706110','PMUSHROOM DRY PORCINI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'958','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1810') +('0000894706125','PMUSHROOM DRY PORCINI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'958','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1811') +('0000894707110','PMUSHROOM DRY WOOD EAR',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'960','2007-10-08 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1812') +('0000894709035','pmushroom maitake',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1089','2009-09-09 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12865') +('0000894710080','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1813') +('0000894710280','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1814') +('0000894712260','PMUSHROOM PORTABELLA PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1815') +('0000894713260','Sliced Portabella Mushroompack',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'0','2008-12-26 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1816') +('0000894790110','PMUSHROOM DRY STIR FRY',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'661','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1817') +('0000894791110','PMUSHROOM DRY WOODLAND',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'662','2009-01-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1818') +('0000902000001','MHEMP LEMON LIME VEGAN BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1819') +('0000903000002','MHEMP ORG SPEAR LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1820') +('0000903000003','MHEMP ORG LEMLIM LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1821') +('0000903000004','MHEMP ORG ORANGE LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1822') +('0000903000006','MERRY HEMPSTERS VANILLA LIP',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-06-15 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1823') +('0000903000007','MHEMP MANDARIN VEGAN LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1824') +('0000903000008','MHEMP PEPPMNT VEGAN LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1825') +('0000928010137','MAG DISCOVER SPECIAL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2007-04-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1826') +('0000928101089','COOKING ORGANIC MADE EASY',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-09-22 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12975') +('0000928101139','LIFE EXTENSION MAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1827') +('0000928102744','COOKS SPECIAL EDITION',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-08-25 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12800') +('0000955197002','WELLINHAND WART WONDER',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-03-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1828') +('0000985703401','PHERB BASIL 4OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1829') +('0001000200007','PCOCONUT YOUNG NON-ORG',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','0','0',0,'699','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1830') +('0001032802000','BABY RED POTATO BAG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'992','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1831') +('0001032803162','PPOTATO BAG RED 3# L',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1391','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1832') +('0001032803164','PPOTATO GOURMET MIX BAG',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'846','2007-10-08 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1833') +('0001032805505','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1834') +('0001032805510','PPOTATO BAG YELLOW',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1835') +('0001032805525','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1836') +('0001035000000','SW BLACK BEAN SALAD',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1837') +('0001046210054','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'1838') +('0001048600700','SOAP,PINE TAR',3.65,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'1839') +('0001087801014','POTSTICKERS,CHICKEN',4.79,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1840') +('0001087801028','VEGETABLE POTSTICKERS',4.79,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1841') +('0001087834111','SPRING ROLL,CHICKEN',4.75,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1842') +('0001087834443','SPRING ROLL,VEGETABLE',4.75,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1843') +('0001101310020','CITRA-SOLV NATURAL SOLVNT',10.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1844') +('0001101310021','CITRA-SOLV NATURAL SOLVNT 8OZ',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1845') +('0001101312028','CITRA-DISH LIQUID',4.19,'0',0.00,'0',2.89,NULL,2.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1846') +('0001101320022','CITRA-SOLV SPRAY FORMULA 22 OZ',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1847') +('0001101320023','CITRA DRAIN 22oz',5.65,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1848') +('0001120600035','FAT FREE SNAPS,TAMARI/SWD',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1849') +('0001120600085','SAUCE HOISIN OG WF',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1850') +('0001120600093','MISO-CUP GOLDEN LIGHT 2.5 OZ',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1851') +('0001120600094','MISO-CUP W/SEAWEED 2.5 OZ',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1852') +('0001121000001','SAUCE TABASCO ORIG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2007-03-19 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1853') +('0001143306114','CHICKEN TIKKA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1854') +('0001145300008','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1856') +('0001145300080','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1857') +('0001145300160','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1858') +('0001145308000','PMUSHROOM CRIMINI PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'957','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1859') +('0001182620001','CREME FRAICHE',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-11-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1861') +('0001195172001','PSTIR FRY MIX',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'0','2007-12-15 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1862') +('0001204900951','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1863') +('0001234405008','DRY CAT FOOD,REG',16.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1864') +('0001234406020','DOG FOOD,LAMADERM 20LB',29.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1865') +('0001234406035','DOG FOOD,LAMADERM 35LB',49.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'mixmatchcode','2009-02-16 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1866') +('0001241310106','JUST TOMATOES',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-10-22 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1867') +('0001241310802','JUST FRUIT MUNCHIES',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-08-20 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12780') +('0001241310806','JUST FRUIT MUNCHIES ZIPLOC',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-06-10 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1868') +('0001241311603','JUST RASPBERRIES',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1869') +('0001241325001','JUST CORN, OG',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1870') +('0001241326001','JUST PEAS, OG',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-10-22 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1871') +('0001241327001','JUST TOMATO BITS, OG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-03-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1872') +('0001241329001','JUST RASPBERRIES, OG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'499','2009-05-18 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1873') +('0001241329003','JUST RASPBERRIES, OG ZIPLOC',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-06-10 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1874') +('0001241329004','Just Raspberries 4oz',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-07-17 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1875') +('0001241330000','JUST STRAWBERRIES, OG',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-10-22 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1876') +('0001241330002','JUST STRAWBERRIES, OG ZIPLOC',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-06-10 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1877') +('0001241330003','JUST STRAWBERRIES, OG 4OZ',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-02-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1878') +('0001241332000','JUST PEACHES',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'499','2009-07-03 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1879') +('0001241332001','JUST PEACHES ZIPLOC',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'499','2009-07-03 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1880') +('0001241334000','JUST VEGGIES, ORGANIC',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-10-22 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1881') +('0001241336000','JUST CHERRIES, OG',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1882') +('0001241337000','JUST MANGO, OG',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1883') +('0001241338000','JUST PEACHES, OG',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-10-22 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1884') +('0001241338003','JUST PEACHES, OG, 50Z',15.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-02-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1885') +('0001241339000','JUST APPLES, OG',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-10-22 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1886') +('0001241340000','JUST BANANAS, OG',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1887') +('0001241341000','JUST FRUIT MUNCHIES, OG',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-06-02 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1888') +('0001241344001','JUST FRUIT SALAD',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-03-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1889') +('0001241344003','JUST FRUIT SALAD ZIPLOC',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-06-10 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1890') +('0001251120121','BLUE AGAVE,OG',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','176','0','0','1','0',0,'0','2009-06-18 10:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1891') +('0001251121122','BLUE AGAVE,OG,RAW',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1892') +('0001251130500','SUCANAT 2 #,OG',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1893') +('0001251132004','SUGAR,OG,FT, POWDERED',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1894') +('0001251134611','ZERO SWEETENER, ORG',14.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1895') +('0001251140500','SUGAR,OG,MILLED,UNREFINED',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1896') +('0001251144471','SUGAR,OG,TURBINADO',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1897') +('0001251144641','SUGAR,OG,FT, LIGHT BROWN',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1898') +('0001251160000','MOLASSES,OG,BLSTP,UNSULP',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1899') +('0001297600272','SLICED MEUNSTER',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1900') +('0001299310201','LACROIX SPRKLING GRPFRT',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1901') +('0001356200004','SHELLS AND WHITE CHEDDAR',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1902') +('0001356200005','WW PASTA & ALFREDO',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1903') +('0001356200009','ARTHUR MILD MACARONI&CHES 6 OZ',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1904') +('0001356200010','ROTINI,OG,W/4 CHEESE SCE 7.25',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1905') +('0001356200015','BUNNY GRAHAMS,OG,HONEY',3.75,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1906') +('0001356200017','BUNNY GRAHAMS,OG, CHOCOLATE',3.75,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1907') +('0001356200045','MAC & CHEESE 6Z CLASSIC',2.19,'0',0.00,'0',1.75,'0',1.75,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1908') +('0001356211100','BUNNY FRT SNK,OG,TROPICA',4.99,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2008-11-06 01:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1909') +('0001356211105','BUNNY FRT SNK,OG,BERRY',4.99,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2008-11-06 01:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1910') +('0001356211106','FRT SNK,OG,SUNNY CITRU',4.99,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2009-08-26 01:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','4',0.00,'0','12812') +('0001356211107','FRT SNK,OG,SUMMER STRWBR',4.99,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'499','2009-09-22 10:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12972') +('0001356230011','MAC & CHEESE,LOW SODIUM',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-07-11 11:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1911') +('0001356230050','MAC & CHEESE FAMILY CLASSIC',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1912') +('0001356230057','SNACK MIX,OG,BUNNIES CHE',4.99,'0',0.00,'0',3.99,'0',3.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-09-22 11:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12973') +('0001356230060','BUNNY SHAPE&YUMMY CHEESE 6 OZ',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1913') +('0001356230062','SHELLS&WHITE CHED,FMLY',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1914') +('0001356230063','OG PASTA & OG WHT CHEDDAR',2.75,'0',0.00,'0',1.59,NULL,1.59,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1915') +('0001356230066','ALL STARS,OG,W/TOM&CHEESE',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1916') +('0001356230069','PEACE,OG,PASTA & PARMESAN',2.75,'0',0.00,'0',1.59,NULL,1.59,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1917') +('0001356230084','SHELLS&REAL AGD CHDR',2.19,'0',0.00,'0',1.75,'0',1.75,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1918') +('0001356230088','MICROWAVABLE MAC&CHESE,OG',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1919') +('0001356230097','ALFREDO SHELLS & CHED,OG',2.75,'0',0.00,'0',1.59,NULL,1.59,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1920') +('0001356230098','SHELLS&REAL AGED CHED,OG',2.75,'0',0.00,'0',1.59,NULL,1.59,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1921') +('0001356230210','DLX SHELLS&AGED WISC CHED',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1922') +('0001356230215','SNACK CRACKER,CHED BUNNIE 7.5',3.75,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1923') +('0001356230221','CRACKER,SR CRM&ONION,BUNN',3.75,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1924') +('0001356230230','BUNNY GRAHAMS,OG, FRIENDS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-04-09 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1925') +('0001356231301','PASTA LOOPS W/ SOY MEATBALLS',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1926') +('0001356231302','CHEESY RAVIOLI,OG',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1927') +('0001356261001','PASTA, RICE, CHEDDAR',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1928') +('0001400514177','MAG READY MADE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-08-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1929') +('0001400514403','DIABETIC LIVING MAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-05-19 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1930') +('0001440021400','BALL BLUE BOOK',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','186','0','1','0','0',0,'499','2009-08-12 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12750') +('0001440024100','FRUIT FRESH PRODUCE PROTECTOR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-07-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1931') +('0001440030000','REGULAR MOUTH LIDS W/ BANDS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1932') +('0001440031000','REGULAR MOUTH LIDS',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1933') +('0001440036000','REG. MOUTH PLASTIC LIDS',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-08-11 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1934') +('0001440037000','WIDE MOUTH PLASTIC LIDS',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-08-11 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1935') +('0001440040000','WIDE MOUTH LIDS W/ BANDS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1936') +('0001440042000','WIDE MOUTH LIDS',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1937') +('0001440052750','PICKLING SALT POUCH, 32OZ',2.79,'0',0.00,'0',2.25,'0',2.25,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2009-08-11 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1938') +('0001440060000','REGULAR MOUTH HALFPINT JARS',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1939') +('0001440061000','PINT SIZE REGULAR MOUTH',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1940') +('0001440061162','ELITE WIDE MOUTH 1/2 PINT 4PK',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1941') +('0001440061175','ELITE WIDE MOUTH LIDS',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-07-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1942') +('0001440061180','PLATINUM WIDE MOUTH PINT JARS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-07-13 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1943') +('0001440062000','QUART JARS REG MOUTH',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1944') +('0001440066000','WIDE MOUTH PINT JARS',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1945') +('0001440067000','WIDE MOUTH QUART JARS',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-08-14 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1946') +('0001440068100','HALF GALLON WIDE MOUTH JAR',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-08-11 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1947') +('0001440070011','1 GALLON GLASS CONTAINER',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-07-13 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1948') +('0001440070012','2 GALLON CREATIVE CONTAINER',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-07-13 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1949') +('0001440071000','PECTIN, ORIGINAL',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'499','2009-07-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1950') +('0001440072100','SALSA MIX MILD FIESTA',2.29,'0',0.00,'0',1.89,'0',1.89,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'499','2009-07-16 02:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1951') +('0001440072400','KOSHER DILL PICKLE MIX',2.29,'0',0.00,'0',1.89,'0',1.89,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'499','2009-07-16 02:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1952') +('0001440072500','BREAD & BUTTER PICKLE MIX',2.29,'0',0.00,'0',1.89,'0',1.89,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'499','2009-07-16 02:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1953') +('0001440080400','CRYSTAL JELLY JARS 4OZ',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1954') +('0001440081200','JELLY JAR 8OZ',9.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1955') +('0001440081400','QUILTED JELLY JAR 120Z',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-08-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1956') +('0001440082000','PLASTIC FREEZER JAR 80Z',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'499','2009-07-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1957') +('0001440085040','BALL 1QT FREEZER CONTAINER',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-08-11 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1958') +('0001440085050','BALL 2QT FREEZER CONTAINER',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-08-11 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1959') +('0001523790001','PCelery Hearts',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1960') +('0001553244220','TARRAGON WHITE WINE VINEGAR',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2008-04-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'1961') +('0001570022720','BUTTER,EUROPEAN STYLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2009-05-08 11:03:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1962') +('0001583900003','CHIPS,OG,BLUE CORN,REDHOT',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1963') +('0001583900006','CHIPS,OG,BLUE CORN,SESAME',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1964') +('0001583900101','BREAD,OG,BIBLE PITA,ORIG',3.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1965') +('0001583900130','TORTS,OG,WHOLE WHEAT',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'1966') +('0001583900500','CHIPS,OG,BLACK BEAN TORT',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1967') +('0001583900503','CHIPS,OG,BLACK BEAN CHILI',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1968') +('0001583900590','CHIPS,OG,MINI,WHITE ROUND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1969') +('0001583900797','CHIP OG MULTIGRN EVERYTHING',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1970') +('0001583900821','CHIPS,OG,BLUE CORN 16 OZ',4.69,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1971') +('0001583900823','CHIPS,OG,BLUE CORN,REDHOT 16 O',4.69,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1972') +('0001583900843','CHIPS,OG,CHILI & LIME',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1973') +('0001583900847','CHIPS,OG,GUACAMOLE',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1974') +('0001583900882','CHIPS,OG,PICO DE GALLO',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1975') +('0001583900894','CHIPS,OG,WHITE,KEY LM JAL',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1976') +('0001583900934','CHIPS,OG,VEGGIE MEDLEY',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-16 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1977') +('0001583900938','CHIPS,OG,BEET & GARLIC',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-16 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1978') +('0001606900365','SEASON STARTER',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1979') +('0001606900379','BETTER REDS',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-04-16 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'1980') +('0001607352142','NUT BALL, CASHEW PECAN',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'499','2009-05-27 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1981') +('0001607352149','HIGH PROTIEN NUT BALLS, ALMOND',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1982') +('0001658300402','HONEY GRAHAM CRACKERS',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'1983') +('0001677310933','PSUMMER SPLASH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1984') +('0001678310342','PFL CALLA BUNCHES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','1',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1985') +('0001678310353','PFLOWER TULIPS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'1364','2008-12-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1986') +('0001678310400','PWILDFLOWER BWIFLBO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1987') +('0001678310408','PWILDFLOWER BOUQUET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1988') +('0001678310426','PFLOWER PUMPKIN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1989') +('0001678310434','PFLOWER SILENT NIGHT',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1990') +('0001678310435','PFLOWER CANDY CANE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1991') +('0001678310436','PFLOWER ST NICK',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1992') +('0001678310437','PFLOWER BOUQUET',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1993') +('0001678310471','PFL BOUQUET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1994') +('0001678310474','PFL SWEETHEART',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1995') +('0001678310606','PFLOWERS SKY BLUE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1996') +('0001678310681','PHAND TIED BOUQUET',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1997') +('0001678310682','PFLOWER HAND TIED',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1998') +('0001678310900','PFLOWER BOUQUET',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'1999') +('0001678310902','PFLOWER ALSTROMERIA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2000') +('0001678310903','PALSTROMERIA BOUQ',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2001') +('0001678310920','PFLOWERS GARDEN BOUQ',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2002') +('0001678310931','PWOMANS INTUITION',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','2008-12-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2003') +('0001678310932','PFLOWER LEMON CHIFFO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2004') +('0001678310933','PFLOWER FROSTY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2005') +('0001678310934','PFL BOUQUET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2006') +('0001678310935','PFLOWER REACH/STARS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2007') +('0001678310936','PFLOWER PURPLE CRUSH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2008') +('0001678311132','PALSTRO/ROSE BALRO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2009') +('0001678313001','PFL MOMS LITTLE ANGE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2010') +('0001678313004','PFL ALL MY LOVE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2011') +('0001678313005','PPICTURE PERFECT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2012') +('0001678313006','PFLOWER YR SPECIAL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2013') +('0001678313803','PFLOWERS JELLYBEAN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2014') +('0001678313804','PFL EASTER EGG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2015') +('0001678313805','PFLOWER BOUQUET',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2016') +('0001678313806','PFLOWER BOUQUET',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2017') +('0001678313902','PFL BOUQUET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2018') +('0001678313906','PFLOWER EXECUTIVE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2019') +('0001707710232','KEFIR,LOWFAT,PLAIN',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','27','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2023') +('0001707710332','KEFIR,LOWFAT,STRAWBERRY',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','27','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2024') +('0001707710432','LIFEWAY LF RASPBERRY KEFIR',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','27','0','0','1','0',0,'499','2009-08-18 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2025') +('0001707710532','LIFEWAY LF CHERRY KEFIR',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','27','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2026') +('0001707710932','KEFIR,LOWFAT,BLUEBERRY',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','27','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2028') +('0001707712132','LIFEWAY POM KEFIR',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','27','0','0','1','0',0,'499','2009-08-18 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2029') +('0001707720116','FARMER CHEESE LIFEWAY',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-09-04 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2030') +('0001742864995','ECO SPOUT',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2031') +('0001750004030','CLEANING POWDER',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2032') +('0001750004403','CLEANSER,KITCHEN&BATH',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2033') +('0001753812001','GOURMET PARLOR PEPPERONI GF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-05-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2034') +('0001753812003','GOURMET PARLOR SAUS/PEP GF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-07-06 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2035') +('0001753812005','GOURMET PARLOR CHEESE GF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-05-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2036') +('0001753812006','GOURMET PARLOR SAUS/PEP GF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-05-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2037') +('0001753812301','GOURMET PARLOR PEPPERONI GF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-09-21 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12958') +('0001753812305','GOURMET PARLOR CHEESE GF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-09-21 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12959') +('0001753822001','GOURMET PARLOR PEPPERONI OG',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-05-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2038') +('0001753822003','GOURMET PARLOR SAUS/PEP OG',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-05-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2039') +('0001753822010','GOURMET PARLOR VEGGIE OG',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-05-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2040') +('0001770772116','FARMER CHEESE LIFEWAY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-04-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2041') +('0001823300111','DAIKON SPROUTS',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1022','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2042') +('0001862702345','KASHI,PUFFED,SEVEN GRAIN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2043') +('0001862702370','KASHI,7 IN THE MORNING',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2044') +('0001862729290','PASTA,PESTO PRIMAVERA',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2045') +('0001862729292','CHICKEN,SOUTHWEST STYLE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2046') +('0001862729294','CHICKEN,SWEET & SOUR',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2047') +('0001862729296','PILAF,BLACK BEAN MANGO',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2048') +('0001862732901','PIZZA,FIVE CHEESE TOMATO',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2049') +('0001862732905','PIZZA,MEDITERRANEAN',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2050') +('0001862732911','CHICKEN,LMNGRASS COCONUT',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2051') +('0001862741446','TLC CRACKER,ASIAGO CHEES',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-08-28 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12823') +('0001862751002','KASHI,HEART TO HEART 12.4 OZ',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2052') +('0001862761001','TLC CRACKERS,ORIG 7 GRAIN',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1609','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2053') +('0001862761004','TLC CRACKERS COUNTRY CHED',4.55,'0',0.00,'0',3.55,'0',3.55,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2054') +('0001862761005','TLC CRACKERS ROASTED VEG',4.55,'0',0.00,'0',3.55,'0',3.55,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'1609','2008-12-12 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2055') +('0001862774100','GOLEAN CRUNCH! CEREAL 15 OZ',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2056') +('0001862783100','OG PROMISE,STRWBRY FIELDS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2057') +('0001862783300','OG PROMISE,AUTUMN WHEAT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2058') +('0001862783500','CEREAL CIN HARVEST KASHI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2059') +('0001864600215','TORTA MARIONBERRY RISING SUN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2060') +('0001864600225','TORTA OEOOER CHIPO RISING SUN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2061') +('0001864600229','TORTA KEY LIME CRAN RISING SUN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2062') +('0001864600234','TORTA CHOC MOCHA RISING SUN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2063') +('0001878776116','CASTILE SOAP,ALMOND',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2064') +('0001878776516','CASTILE SOAP,PEPPERMINT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2065') +('0001878776565','CASTILE SOAP, OG PEPMINT GAL',49.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-08-22 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12792') +('0001878776632','SAL SUDS CONCENTRATE MILD',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2066') +('0001878776916','CASTILE SOAP,TEA TREE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2067') +('0001878777108','CASTILLE SOAP,OG,ALMOND',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2068') +('0001878777132','CASTILLE SOAP,OG,ALMOND',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2069') +('0001878777208','CASTILE SOAP,OG,BABY MILD',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2070') +('0001878777308','CASTILE SOAP,OG,EUCALYPTS',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2071') +('0001878777408','CASTILE SOAP,OG,LAVENDER',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2072') +('0001878777532','CASTILE SOAP,OG,PEPPERMNT',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2073') +('0001878777608','CASTILE SOAP,OG,TEA TREE',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2074') +('0001878778105','BAR SOAP,OG,ALMOND',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2075') +('0001878778205','BAR SOAP,OG,MILD BABY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2076') +('0001878778305','BAR SOAP,OG,EUCALYPTUS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2077') +('0001878778405','BAR SOAP,OG,LAVENDER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2078') +('0001878778505','BAR SOAP,OG,PEPPERMINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2079') +('0001878778605','BAR SOAP,OG,TEA TREE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2080') +('0001878778705','DR. BRONNERS LEMON SOAP BAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2081') +('0001878778805','DR, BRONNERS ROSE BAR SOAP',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2082') +('0001878791005','DR BRONNER BABY BALM',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2083') +('0001878792001','LIP BALM,OG ORANGE GINGER',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2084') +('0001878792002','LIP BALM,OG PEPPERMINT',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-05-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2085') +('0001878792003','LIP BALM,OG LEMON LIME',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-05-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2086') +('0001878792004','LIP BALM,OG NAKED',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-05-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2087') +('0001878794002','DR BRONNER SPPEP SHAVE GEL',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'mixmatchcode','2009-03-23 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2088') +('0001878794005','DR BRONNER LEMGRASS SHAVE GEL',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-04-10 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2089') +('0001878795002','DR BRONNER PUMP SOAP SPPEP',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2090') +('0001878795003','DR BRONNER PUMP SOAP TTREE',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2091') +('0001878795005','DR BRONNER PUMP SOAP LEMGRS',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2092') +('0001878810109','REAL SALT,9 0Z SHAKER',3.85,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2093') +('0001878880160','SEA SALT,KOSHER',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2094') +('0001933640010','GHEE,OG,CLARIFIED BUTTER',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2095') +('0001935655111','PECTIN UNIVERSAL',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2096') +('0001937382101','DR TUNGS IONIC TOOTHBRUSH',26.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-04-20 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2097') +('0001937395115','DR TUNGS SNAP ON SANITIZERS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-04-20 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2098') +('0001943300001','GOAT MILK',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-05-14 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2099') +('0001973310880','PMANGO',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'762','2009-03-25 07:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'2100') +('0002006510002','SWEDISH BITTERS',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-16 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2101') +('0002006550003','NATUREWORKS HERBAL IRON 8.5OZ',18.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-07-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2102') +('0002018801442','TOTALLY FUDGE POPS',5.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2103') +('0002018805025','TOFUTTI CREAM CHEESE',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2104') +('0002018806013','SOUR CRM,SUPRME,NON-HYDRN',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2105') +('0002037993107','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2106') +('0002037993108','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2107') +('0002037994047','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2108') +('0002037994133','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2109') +('0002037994958','PLEMON BAGGED',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2110') +('0002052510530','ACIDOPHILUS CAPS,MILKFREE',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2111') +('0002052511208','SCHIFF CALCIUM W/D -V 90 SOFTG',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2112') +('0002052511405','SCHIFF CHILDRENS LIQ MULTI 8OZ',15.59,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','101','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2113') +('0002052511406','CHILDRENS CHEW MULTI 90CT',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2114') +('0002064580888','WARM SKIN CREAM',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-12-06 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2115') +('0002064580889','WARM SKIN CREAM',15.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-12-06 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2116') +('0002083802002','PBERRY CRANBERRY BAG',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2117') +('0002089944011','PAPPLE BAG GOLD DEL.',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2118') +('0002089944447','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2119') +('0002107119582','PSPROUTS BEAN NON-O',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'655','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2120') +('0002107119586','PSPROUTS ALFALFA NON-O',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2121') +('0002107800022','SN WELLNESS FORMULA 90 CT',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2122') +('0002107800086','SN LIQUID MELATONIN',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-19 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2123') +('0002107800093','SN GRAPEFRUIT CAP',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2124') +('0002107800127','SN L-GLUTAMINE',11.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2125') +('0002107800166','SN TAURINE POWDER 3.53OZ',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-09-23 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12976') +('0002107800190','SN L-TYROSINE 500 MG',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-06-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2126') +('0002107800214','SN GARLIC OIL 250 CT',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2127') +('0002107800235','SN ULTRA POTASSIUM',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-19 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2128') +('0002107800272','SN MELATONIN 2.5MG SUB 120CT',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2129') +('0002107800499','SN ACETYL L-CARNITINE',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2130') +('0002107800527','SN WELLNESS SILVER 30PPM',24.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-04-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2131') +('0002107800550','SN MELATONIN 3 MG',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-06-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2132') +('0002107800774','SN CHROMIUM PICOLINATE 120 CT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-24 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2133') +('0002107800811','SN SELENIUM 200MCG 120CT',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2134') +('0002107800885','SN GRAPEFRT SD LIQ',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2135') +('0002107800914','SN HOT FLASH 90CT',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-08-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2136') +('0002107801027','COLLOIDIAL SILVER THROAT SPRAY',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-09-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2137') +('0002107801217','SN FIBRO RESPONSE 90 CT',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-19 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2140') +('0002107801237','SN SAME 20CT',20.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-26 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2141') +('0002107801279','SN L-ARGININE',12.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2142') +('0002107801289','SN MSM 1000 MG',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-09-30 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2143') +('0002107801290','SN LYCOPENE 15MG 30 CT',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-04-20 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2144') +('0002107801377','SN KETO DHEA',21.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2145') +('0002107801402','SN CALCIUM CITRATE 90CT',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-19 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2146') +('0002107801419','SN MASTIC GUM',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-06-15 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2147') +('0002107801445','SN GLUCO SCIENCE 90 CT',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-19 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2148') +('0002107801455','SN FERROCHEL IRON',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-06-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2149') +('0002107801464','SN L-CARNITINE',27.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2150') +('0002107801606','SN POTASSIUM IODIDE',14.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-06-15 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2152') +('0002107801681','SN CHERRY FRUIT EXTRACT',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2153') +('0002107801701','SN 5-HTP',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2154') +('0002107801707','SN GABA 750MG 90CT',16.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2155') +('0002107801751','SN RENEWAL ANTIOXIDANTS',18.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-07-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2156') +('0002107801772','SN THEANINE SERINE W/RELORA',18.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-05-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2157') +('0002107801791','SN VIT D 1000 I.U. 100CT',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-04-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2158') +('0002107801792','SN VITD 1000 I.U. 200CT',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-01-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2159') +('0002107801929','SN YAEYAMA CHLORELLA',18.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2006-04-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2160') +('0002107801932','SN MANGOSTEEN 32 OZ',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','1','0','0',0,'0','2008-09-04 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2161') +('0002107801947','SN ATTENTIVE CHILD',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2007-01-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2162') +('0002107801979','SN L-TRYPTOPHAN',22.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-06-07 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2163') +('0002107802012','SN ULT OMEGA 3 FISH OIL 30 CT',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2164') +('0002107802051','SN WELLNESS FIZZ',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2165') +('0002107802132','SN MAG GLYCINATE',13.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2166') +('0002107802145','SN VIT D 2000 IU 200 CT',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-10-28 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2167') +('0002107802178','SN CILANTRO METAL DETOX',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-08-13 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12753') +('0002107802237','SN VIT D3 2000IU SOFTGLS 200CT',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2168') +('0002107802275','SN LIQUID VITAMIN D 2OZ',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12767') +('0002107810097','OLD INDIAN WILD CHERRY SYRUP',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2169') +('0002107810500','SN DGL 100CT CHEWABLE',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2170') +('0002107810537','PLANETARY CINNAMON 120CT',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-08-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2171') +('0002107810540','SN MINOR PAIN RELIEF',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2172') +('0002137668896','CHEWING GUM,PEPPERMINT',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2005-10-27 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2173') +('0002137689105','GUM PEELU PEPPERMINT',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2174') +('0002137689107','PEELU GUM, SPEARMINT',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2175') +('0002137689901','CHEWING GUM,SPEARMINT',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2005-10-27 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2176') +('0002143800007','VALBRESO SHEEP FETA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-10-18 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2177') +('0002145120060','JUICE,PURE CRANBERRY',9.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2178') +('0002162750099','CURDS WHITE EICHTEN',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-10-26 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2179') +('0002170631200','PMUSHROOM MAITAKE',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1089','2009-08-25 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2180') +('0002170650002','PMUSHROOM PORTABELLA SLICED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2181') +('0002170650006','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2182') +('0002171841278','HERBAMARE,OG,ORIGINAL',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-08-21 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12781') +('0002171850260','JUICE,OG,BEET ROOT',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-04-15 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2184') +('0002188810013','COMPLETE NUT SYS 180CT RL',45.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2185') +('0002188810031','COMPLETE B COMPLEX 90CT RL',17.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-03-11 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2186') +('0002188810112','RL CANDIDA 120CT',40.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-06-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2187') +('0002188810152','PRENATAL',34.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2188') +('0002188810283','NUTRITIONAL SYS.',48.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2189') +('0002188810331','RL SUPER C POWDER',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2190') +('0002188810472','JUST ONCE',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2191') +('0002188810542','VIT NUTRISTARS 60CT RNBW LT',13.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2192') +('0002188810702','RL JUST ONCE, IFREE',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2193') +('0002188810801','ENERGY B-COMPLEX',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2194') +('0002188810881','W/ONE A DAY',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2195') +('0002188810882','WOMENS ONE MULTIVITAMIN',27.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 02:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2196') +('0002188810892','MENS ONE MULTIVITAMIN',27.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 02:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2197') +('0002188810901','FOOD BASED B 45CT RL',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-02 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2198') +('0002188810902','FOOD BASED B-COMPLETE',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-20 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2199') +('0002188810912','FOOD BASED C-1000',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2200') +('0002188810951','FOOD BASED CALCIUM',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2201') +('0002188810971','PRENATAL ONE',12.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2202') +('0002188810972','PRENATAL ONE MULTIVITAMIN',29.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2203') +('0002188810981','KIDS ONE A DAY',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2006-03-11 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2204') +('0002188810982','KIDS ONE MULTIVITAMIN',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2205') +('0002188810992','ACTIVE SENIOR MULTI 90CT RL',29.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2206') +('0002188811073','RL CAL-CITRATE CHEW MIN 45 CT',17.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2207') +('0002188811201','TEEN MULTI',13.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2208') +('0002188811243','MENOPAUSE ONE',29.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2209') +('0002188811381','RL DAILY FRUIT & FIBER',24.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2211') +('0002188811391','RL AM CITRUS CLEANSE 14CT BOX',16.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2212') +('0002188811397','RL AM CITRUS CLEANSE SINGLE',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2213') +('0002188812053','RLIGHT SUNNY GUMMY D 40OIU',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2214') +('0002188820061','IRON SYSTEM',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2215') +('0002188835083','RL LACTO-ZYME',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2216') +('0002188835101','ENZYME SYS. R.L',15.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2217') +('0002188835132','RAINBOW LIGHT OPTIMA ENZYME',26.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2218') +('0002188841001','RL RICE PROTEIN VANILLA',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2219') +('0002188841011','RL RICE PROTEIN CHOCOLATE',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2220') +('0002190813333','CEREAL,OG,MULTI-GRAIN SQ',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1507','2008-09-19 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2221') +('0002190813335','CEREAL,OG,OATS&HNY GRNLA',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1507','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2222') +('0002190813472','GRANOLA BARS,OG,FRT & NUT 7.4',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1511','2009-03-03 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2223') +('0002190813473','GRANOLA BARS,OG,HVST BRY 7.4 O',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1511','2009-03-03 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2224') +('0002190814631','GRANOLA BARS,OG,P BTR CHP',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1511','2009-03-03 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2225') +('0002190827474','CEREAL, OG, CLIFFORD',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2226') +('0002190827475','CEREAL HONEYNUT O',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1507','2008-09-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2227') +('0002190829102','GRANOLA BARS,OG,CHOC CHIP',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1511','2009-03-03 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2228') +('0002190832501','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2229') +('0002190840676','GRANOLA BARS,OG,VAN CHIP',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1511','2009-03-03 06:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2230') +('0002190840677','BLUEBERRIES,OG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2231') +('0002190840772','GRANOLA,OG,DK CHOC ALMON',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-12-03 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2232') +('0002190850025','FRIES,OG,FRENCH STRAIGHT',3.59,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2233') +('0002190850124','CORN,OG 16OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2234') +('0002190850135','BROCCOLI,OG,CUTS 16OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2235') +('0002190850140','PEAS,OG 16OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2236') +('0002190850145','GREEN BEANS,OG,CUT 16OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2237') +('0002190850167','HASH BROWNS,OG',3.59,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2238') +('0002190850187','POTATO,OG,SPUD PUPPIES',3.59,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2239') +('0002190850197','FRENCH FRIES,OG,CRINKLE',3.59,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2240') +('0002190850324','CORN,OG,SUPER,SWEET,CUT 10Z',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2241') +('0002190850335','BROCCOLI,OG,FLORETS 10OZ',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2242') +('0002190850340','PEAS,OG,SWEET GREEN 10OZ',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2243') +('0002190850345','GREEN BEANS,OG,CUT',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2244') +('0002190850401','GARDENERS BLEND,OG',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2245') +('0002190850410','CALIFORNIA BLEND,',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2246') +('0002190850415','PEAS & CARROTS,OG',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'499','2009-06-08 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2247') +('0002190850419','STIR FRY,OG,CHINESE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2248') +('0002190850507','BOX,OG,SPINACH,CUT',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2249') +('0002190850508','BOX,OG,WINTR SQUASH PUREE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2250') +('0002190850909','BAR,OG,CHOC MINT',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2009-03-03 07:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2251') +('0002190850912','BAR,OG,CHOCOLATE',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2009-03-03 07:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2252') +('0002190850913','NUTRITIONAL BAR,PISTACHI',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'mixmatchcode','2009-03-03 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2253') +('0002190850918','NUTRITIONAL BAR,GNGR SNA',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2009-03-03 07:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2254') +('0002190850921','NUTRITIONAL BAR,COCOA MO',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'mixmatchcode','2009-03-09 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2255') +('0002190850923','LARABAR CHOC COCONUT',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'499','2009-06-05 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2256') +('0002190850924','NUTRITIONAL BAR,CHERY PIE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'mixmatchcode','2009-03-03 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2257') +('0002190851495','HARVEST BERRIES,OG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2258') +('0002190852501','PEACHES,OG,SLICED',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2259') +('0002190853001','RASPBERRIES,OG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2260') +('0002190854301','STRAWBERRIES,OG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2261') +('0002190855011','BLACKBERRIES,OG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2262') +('0002190856001','CHERRIES,OG,PIT DRK SWEET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2263') +('0002190863201','FRT SPREAD,OG,APRICOT',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2264') +('0002190863203','FRT SPREAD,OG,BLACKBERRY',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2265') +('0002190863204','FRT SPREAD,OG,BLUEBERRY',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2266') +('0002190863206','FRT SPRD OG GRAPE',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2267') +('0002190863208','FRT SPREAD,OG,RASPBERRY',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2268') +('0002190863209','FRT SPREAD,OG,STRAWBERRY',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2269') +('0002190896511','FROZEN APPLE JUICE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','42','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2270') +('0002190896512','FROZEN GRAPE JUICE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','42','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2271') +('0002190896513','FROZEN LEMONADE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','42','0','0','1','0',0,'0','2009-01-12 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2272') +('0002190896516','FRZN JCE,OG,ORANGE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','42','0','0','1','0',0,'499','2009-06-17 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2273') +('0002190896537','FROZEN RASP JUICE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','42','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2274') +('0002190896540','FROZEN CRAN JUICE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','42','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2275') +('0002218150001','WATER DRINKING 1 GAL LOCAL',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2008-11-07 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2276') +('0002218150004','WATER DISTILLED 1GAL LOCAL',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2008-11-07 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2277') +('0002218150006','WATER DRINKING 20OZ LOCAL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2007-04-25 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2278') +('0002220922201','PBLUEBERRY PINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','201','0','0','1','0',0,'0','2009-07-20 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2279') +('0002250600200','COCONUT OIL,OG,REFINED',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2280') +('0002250600201','FLAX OIL,OG,ENRCH W/LIGN 16OZ',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-08-26 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2281') +('0002250600205','VINEGAR,OG,BALSAMIC',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2282') +('0002250600206','VINEGAR,OG,RED WINE',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2283') +('0002250600207','VINEGAR,OG,WHITE WINE',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2284') +('0002250600233','OLIVE OIL,OG,MEDTRN,X VRG',20.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2285') +('0002250600235','SOY MAYONNAISE,OG',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2286') +('0002250600240','SOY MAYONNAISE, OG',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2287') +('0002250600285','GRAPESEED OIL,REFINED',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2289') +('0002250600325','SPECTRUM FISH OIL 100 CT',13.99,'0',0.00,'0',9.49,NULL,9.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2290') +('0002250610260','SHORTENING,OG',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2291') +('0002250610410','PEANUT OIL,UNREFINED',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2292') +('0002250610417','PEANUT OIL OG HIGH HEAT',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2293') +('0002250611201','COCONUT OIL,OG,BODY CARE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2294') +('0002250611306','DRSSNG OG OMEGA 3 VEGAN CESR',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2295') +('0002250611710','SUNFLOWER OIL,OG,REFINED',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2296') +('0002250612016','FLAX OIL,OG,(REFRIG) 16 OZ',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2297') +('0002250612020','SPECTRUM WHEAT GERM OIL',20.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2298') +('0002250612701','SPECTRUM BORAGE OIL1000MG 60ct',30.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2299') +('0002250612903','SPECTRUM FISHOIL W VITD 250 CT',31.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2300') +('0002250613005','ALMOND OIL,SWEET,REFINED',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2301') +('0002250613305','AVOCADO OIL,REFINED 8 OZ',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2302') +('0002250613420','CANOLA OIL,REFINED 32 OZ',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2303') +('0002250613510','WALNUT OIL,REFINED',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2304') +('0002250613710','CANOLA OIL,OG,REFINED',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2305') +('0002250613720','CANOLA OIL,OG,REFINED',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2306') +('0002250613806','SKILLET SPRY,CNLA,HI HEAT 6 OZ',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2307') +('0002250618010','SAFFLOWER OIL OG REFINED',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2308') +('0002250620116','CANOLA MAYONNAISE',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2310') +('0002250620132','CANOLA MAYONNAISE',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2311') +('0002250620216','LITE CANOLA MAYO(EGGLESS)',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2312') +('0002250626612','VINEGAR,OG,BROWN RICE',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2313') +('0002250626712','VINEGAR,OG,BRN RICE,SEASN',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2314') +('0002250627028','VINEGAR,APL CIDER,UNFIL',13.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2006-04-10 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2315') +('0002250632403','SPRY,CANOLA OIL W/BTR FLV',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2316') +('0002250632408','SPRY,OG,EX VRGN OLIVE OIL 5 OZ',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2317') +('0002250642137','OLIVE OIL,OG,UNREF,X VRGN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2318') +('0002250642175','OLIVE OIL,OG,UNREF,X VRGN',18.15,'0',0.00,'0',11.29,NULL,11.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2319') +('0002250642337','OLIVE OIL,UNREF,EX VIRGIN',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2320') +('0002250642375','OLIVE OIL,UNREF,X VIRGIN',16.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2321') +('0002250651625','SPECTRUM FISH OIL 250 CT',30.69,'0',0.00,'0',19.99,NULL,19.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-01-22 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2322') +('0002250660010','SPREAD,SPECTRUM',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2323') +('0002250667789','FLAXSEED,OG,GRND,ESSENTL',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2324') +('0002250693451','COCONUT OIL,OG,UNREFINED',10.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2325') +('0002302000000','BOZEMAN BURGER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2326') +('0002325431311','MAYONNAISE,SAFFLOWER 24 OZ',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2327') +('0002325463391','MIX,FAT FREE,BROWN GRAVY',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2328') +('0002325463395','MIX,VEGETARIAN CHKN GRAVY',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2329') +('0002325466701','SEA SALT IODIZED',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2330') +('0002325466751','SEA SALT PLAIN',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2331') +('0002331801010','SAGA BLUE BRIE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-07-22 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2332') +('0002336330149','Milk Thistle Seed 600 mg',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2333') +('0002336330249','Milk Thistle Seed 600 mg',18.49,'0',0.00,'0',13.85,'0',13.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2334') +('0002336330352','Goldenseal Root 400 mg FD',13.35,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2335') +('0002336330353','Kava "Nakamal" Juice 425 m',18.39,'0',0.00,'0',13.79,'0',13.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2336') +('0002336330509','ECLECTIC Hawthorn BERRY V50',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2337') +('0002336330511','Ech angustifolia ROOT 325 m',12.19,'0',0.00,'0',9.10,'0',9.10,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2338') +('0002336330515','Bladderwrack FD V50',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2339') +('0002336330516','Ginkgo 500 mg FDFU V50',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2340') +('0002336330525','Alfalfa FD V50',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2341') +('0002336330534','Dandelion LEAF FD V50',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2342') +('0002336330537','Nettle LEAF FD V50',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2343') +('0002336330538','Cranberry 300mg COG FDF',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2344') +('0002336330539','ECLECTIC VALERIAN SITCH',13.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-09-18 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12943') +('0002336330544','Garlic 550 mg FDFU V50',11.49,'0',0.00,'0',8.59,'0',8.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2345') +('0002336330551','Valerian officinalis 425 mg',13.65,'0',0.00,'0',10.19,'0',10.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2346') +('0002336330595','FENUGREEK',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2347') +('0002336330596','ECLECTIC OLIVE LEAF',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2348') +('0002336330608','Black Cohosh 370 mg FDFU',12.25,'0',0.00,'0',9.15,'0',9.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2349') +('0002336330645','ECLECTIC GOLDENSEAL HERB',7.75,'0',0.00,'0',5.79,'0',5.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2350') +('0002336330900','St. Johns Wort 300 mg FD',17.59,'0',0.00,'0',13.19,'0',13.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2352') +('0002336330938','Cranberry 300mg COG FDF',17.49,'0',0.00,'0',13.10,'0',13.10,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2353') +('0002336331500','Valerian Passion Flower',10.25,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2354') +('0002336332406','LIVER SUPPORT',17.59,'0',0.00,'0',13.19,'0',13.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2355') +('0002336332410','INTESTINAL SUPPORT',17.59,'0',0.00,'0',13.19,'0',13.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2356') +('0002336332411','ECLECTIC URINARY TRACT SUPPORT',17.59,'0',0.00,'0',13.19,'0',13.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'mixmatchcode','2009-02-05 03:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2357') +('0002336332412','LUNG SUPPORT',17.59,'0',0.00,'0',13.19,'0',13.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2358') +('0002336332416','YEAST BALANCE',17.59,'0',0.00,'0',13.19,'0',13.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-02 06:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2359') +('0002336336502','Nettles Quercetin FD',12.15,'0',0.00,'0',9.10,'0',9.10,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2360') +('0002336337119','ECLECTIC MASTER CLEANSE 4.6OZ',18.95,'0',0.00,'0',14.19,'0',14.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'499','2009-07-20 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2361') +('0002336337120','ECLECTIC BROCCOLI TUNEUP 3.7OZ',20.95,'0',0.00,'0',15.69,'0',15.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2009-07-20 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2362') +('0002336362214','Babies TumEase KIDS',3.69,'0',0.00,'0',2.75,'0',2.75,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2005-10-27 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2363') +('0002336363103','ECLECTIC KIDS EAR DROPS',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2364') +('0002354210041','#100 GAR EXT,YEAST FREE',14.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2365') +('0002354210042','KYOLIC CARDIO',26.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2366') +('0002354210341','KYOLIC IMMUNE',15.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2367') +('0002354210441','KYOLIC CHOLESTROL',14.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2368') +('0002354210641','HEALTHY HEART GARLIC',17.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2369') +('0002354270055','KYO GREEN ENERGY DRINK',20.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2370') +('0002354722206','WASABI HORSERADISH,POWDER',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2371') +('0002354740011','MISO,OG,TRAD RED/DOM',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2372') +('0002354740021','MISO,OG,MELLOW WHITE/DOM',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2373') +('0002354788101','PASTA,OG,SOBA NOODLES',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2374') +('0002392310001','JUICE,OG,APPLE 4 OZ',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2375') +('0002392310004','JUICE,OG,PEAR 4 OZ',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2376') +('0002392310044','INFANT FORM,OG,DHA & ARA',38.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2377') +('0002392310070','INFANT FORMULA SOY OG',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2378') +('0002392320010','APPLES OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2379') +('0002392320013','APPLE APRICOT OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2380') +('0002392320014','APPLE PLUM OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2381') +('0002392320015','APPLE BANANA OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2382') +('0002392320016','PEARS OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2383') +('0002392320019','PEARS RASPBERRIES OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2384') +('0002392320055','VEGETABLE, OG, STARTER KIT',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2385') +('0002392320056','FIRST FOODS, OG, STARTER PACK',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2386') +('0002392320196','SS SNACK BAR,OG,STRWBERRY 5.3',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'1554','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2387') +('0002392320209','SS COOKIES,OG,VERY VANILA 5.3',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'1554','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2388') +('0002392320213','SS CRACKERS,OG,ORIG CRNCH 5.3',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'1554','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2389') +('0002392320353','SS SNACKN HEARTS,OG,BLBR',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-05-05 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2390') +('0002392320355','SS SNACKN RINGS,OG,BANAN',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-05-05 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2391') +('0002392320420','SS ELMO SOUP,OG,NOODLEMA',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-09-30 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2392') +('0002392320422','SS ELMO SOUP,OG,TOMATO',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-09-30 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2393') +('0002392320424','SS ELMO SOUP,OG,VEGETABL',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-09-30 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2394') +('0002392320601','SS WAFFLES,MINI,BLUEBERR',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2395') +('0002392320603','SS WAFFLES,MINI,ORIG',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2396') +('0002392330030','CARROTS OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2397') +('0002392330031','SWEET POTATOES OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2398') +('0002392330032','PEAS BROWN RICE OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2399') +('0002392330034','WINTER SQUASH',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2400') +('0002392330035','CORN BUTTERNUT SQUASH OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2401') +('0002392330037','SPINACH POTATOES OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2402') +('0002392330038','GARDEN VEGETABLES OG',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2403') +('0002392340054','PEACH/OATMEAL/BANANA',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2404') +('0002392350048','DINNER OG VEGGIE TURKEY',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2405') +('0002392350060','DINNER OG SWT POTATO CHIKN',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2406') +('0002392390001','CEREAL,OG,WHL GRAIN RICE',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2407') +('0002392390015','TEETHING BISCUIT,OG,ORIG',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2408') +('0002392390016','TEETHING BISCUIT,OG,WH FR',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2409') +('0002405524144','MUSHROOM BRUSH',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2410') +('0002414900006','PSPROUTS RADISH NON-O',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1022','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2411') +('0002418200025','SESAME OIL,OG',10.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2412') +('0002418200048','MIRIN,RICE COOKING WINE',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2413') +('0002418200059','RED WINE VINGR-RAW UNFILT',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2414') +('0002418200061','VINEGAR,OG,RED WINE,RAW 32 OZ',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2415') +('0002418200062','VINEGAR,OG,APPLE CIDER',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2416') +('0002418200063','VINEGAR,OG,APPLE CIDER',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2417') +('0002418200066','APPLESAUCE,OG',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2418') +('0002418200069','APPLE BUTTER,OG',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2419') +('0002418200117','SAUCE,OG,PIZZA PASTA',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2420') +('0002418200200','SEA SALT',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2421') +('0002418200201','GOMASIO,OG,SESAME SALT',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2422') +('0002418200216','BONITO FLAKES',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2423') +('0002418200252','BEANS,OG,ADZUKI,CAN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1533','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2424') +('0002418200253','BEANS,OG,BLACK,CAN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1533','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2425') +('0002418200255','BEANS,OG,NAVY,CAN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1533','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2426') +('0002418200256','BEANS,OG,CANNELLINI,CAN',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1533','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2427') +('0002418200259','PEAS,OG,BLACK EYED',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1533','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2428') +('0002418200531','EDENSOY EXTRA, OG, ORG 3PK',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2429') +('0002418200541','EDENSOY EXTRA,OG,VAN 3PK',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2430') +('0002418201100','SAUERKRAUT,OG,GLASS',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2431') +('0002418201159','TAMARI,DOMESTIC,W/F,OG',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2432') +('0002418202535','EDENSOY EXTRA,OG,ORIGINAL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2433') +('0002418202545','EDENSOY EXTRA,OG,VANILLA',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2434') +('0002418202905','EDENBLEND,OG',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2435') +('0002418215273','SEA VEGETABLE,KOMBU',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2436') +('0002418215475','SEA VEGETABLE,ARAME',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2437') +('0002418215769','SUSHI NORI,TOASTED',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2438') +('0002418215931','AGAR FLAKES',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2439') +('0002418218120','TEA,OG,KUKICHA TWIG 16 BAG',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2440') +('0002418218137','TEA OG SENCHA GREEN',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2441') +('0002418218145','TEA,OG,HOJICHA RSTD GREEN 16 B',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2442') +('0002418218156','TEA,OG,GENMAICHA GREEN 16 BAG',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2443') +('0002418230011','KUZU ROOT STARCH',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2444') +('0002418242129','SESAME OIL,TOASTED',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2445') +('0002418242588','UME PLUM VINEGAR',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2446') +('0002418249115','BARLEY MALT,OG',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2447') +('0002428435411','CORN,OG,WHOLE KERNEL',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2449') +('0002428438111','SNO PAC CRANBERRIES',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2450') +('0002428465111','PEAS,OG,GREEN',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2451') +('0002428478221','BEANS,OG,GREEN',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2452') +('0002428496910','SPINACH,OG,CUT',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2453') +('0002433501410','CHIPS,OG,BL CORN,TORT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2454') +('0002433501412','CHED PUFFS,OG,LITE',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2455') +('0002433501420','CRUNCHITOS LITTLE BEAR',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2456') +('0002433506109','CHIPS,OG,WHT CORN TORT',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2457') +('0002433511216','TACO SHELLS,OG,YELLOW CRN',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2458') +('0002433511246','TACO SHELLS,OG,BLUE CORN',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2459') +('0002433516006','REFRIED BEANS,OG,PINTO,LF',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2460') +('0002433516046','REFRIED BEANS,OG,BLACK,LF',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2461') +('0002433516206','REFRIED BEANS,OG,REG,FF',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2462') +('0002433516236','REFRIED BEANS,BLACK,FF',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2463') +('0002433521116','CHIPS,OG,YELLOW TORT,SALT',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2464') +('0002433521126','CHIPS,OG,YEL TORT,NS',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2465') +('0002446306105','SAUCE, CHILI GARLIC, ROOSTER',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-06-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2466') +('0002446306108','SAUCE, SAMBAL OELEK, ROOSTER',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-06-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2467') +('0002446306109','SAUCE, HOT, SRIRACHA CHILI',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-06-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2468') +('0002499000000','PMELON WATERMELON LOCAL NON-O',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','0',0,'0','2008-09-15 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2469') +('0002529300092','SILK ORGANIC PLAIN',3.75,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-08-12 06:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2471') +('0002529300094','SILK UNSWTND, OG, SOY MILK',3.89,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-07-21 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2472') +('0002529360003','SILK SOY YGRT,BLUEBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2473') +('0002529360004','SILK SOY YGRT,PEACH',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2474') +('0002529360005','SILK SOY YGRT,RASPBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2475') +('0002529360007','SILK SOY YGRT,PLAIN',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2476') +('0002529360011','SILK SOY YGRT,KEY LIME',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2477') +('0002529360017','SILK SOY YGRT,VANILLA',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2478') +('0002529360018','SILK SOY YGRT,BLCK CHERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2479') +('0002529360023','SILK SOY MLK, UNSWT,CAL',3.59,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'0','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2480') +('0002529360024','SILK SOY MLK, VANILLA 11OZ',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2481') +('0002529360025','SILK SOY MLK, VANILLA 32OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2482') +('0002529360027','SILK SOY MLK, VANILLA 64OZ',3.59,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2483') +('0002529360028','SILK SOY MLK, CHOCOLATE 11OZ',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2484') +('0002529360029','SILK SOY MLK, CHOCLATE 32OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2485') +('0002529360031','SILK SOY MLK, CHOCLATE 64OZ',3.59,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2486') +('0002529360036','SILK SOY MLK, UNSWEETND 32OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2487') +('0002529360037','SILK SOY MLK, PLAIN 32OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2488') +('0002529360039','SILK SOY MLK, PLAIN 64OZ',3.49,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2489') +('0002529360040','SILK SOY CREAMER,OG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2490') +('0002529360041','SILK SOY MLK, PLAIN 11OZ',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2491') +('0002529360042','SILK SOY CREAMER,OG 32OZ',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2492') +('0002529360043','SILK SOY CREAMER,OG,FR VN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2493') +('0002529360044','SILK SOY CREAMER,OG,HZLNT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2494') +('0002529360050','SILK NOG',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-10-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2495') +('0002529360056','SILK SOY MLK, VERY VAN 64OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2496') +('0002529360057','SILK SOY MLK, ENHANCED 64OZ',3.85,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','32','0','0','1','0',0,'499','2009-06-12 11:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2497') +('0002529360085','SOYMILK, ASEPT, SINGLE, CHOC',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'499','2009-09-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2498') +('0002529360089','SILK SOY MLK,OG,ASPT,UNSW 32 O',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2499') +('0002529360090','SILK SOY MK,OG,ASPTC,PLN',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2500') +('0002529360091','SILK SOY MK,OG,ASPTC,VAN',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2501') +('0002529360092','SILK SOY MLK,PLAIN',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-07-21 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2502') +('0002529360111','SOYMILK, ASEPT, SINGLE, VAN',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'499','2009-09-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2503') +('0002531700555','APPLEGATE CHKN NUGGETS, ABF',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-07-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2506') +('0002531700556','APPLEGATE GF CHKN NUGGETS',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-07-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2507') +('0002531700557','APPLEGATE CHICKEN PATTIES',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-05-29 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2508') +('0002531700596','APPLEGATE CHKN MAPLE SAUSAGE',6.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2510') +('0002531700667','ORG ROAST CHICKEN BREAST',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'mixmatchcode','2009-03-30 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2511') +('0002531700887','APPLEGATE HAM',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-01-09 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2512') +('0002531710500','CANADIAN BACON',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2513') +('0002531710555','APPLEGATE CHKN NUGGETS, ABF',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-07-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2514') +('0002531710595','CHKN&APLE SAUS,ANTIBTC FR',6.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2515') +('0002531710875','PANCETTA',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-12-27 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2516') +('0002531712000','BACON,TURKEY SLICED',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-08-21 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2517') +('0002531747500','TURKEY BOLOGNA',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-07-02 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2521') +('0002531753000','HOT DOG,BEEF',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2524') +('0002531756500','BURGER,OG,TURKEY',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'mixmatchcode','2009-02-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2526') +('0002531756800','BURGER, OG BEEF 85% LEAN',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2527') +('0002531757400','APPLEGATE ROAST BEEF',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-07-02 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2528') +('0002531757900','APPLEGATE SMKD TURKEY NATRL',5.15,'0',0.00,'0',4.15,'0',4.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','260','0','0','1','0',0,'0','2008-07-02 12:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2529') +('0002531758600','TURKEY,SLICED,ROASTED',5.15,'0',0.00,'0',4.15,'0',4.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','260','0','0','1','0',0,'0','2008-10-31 06:05:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2531') +('0002531785600','GENOA SALAMI',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-01-23 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2538') +('0002531786100','APPLEGATE PEPPERONI',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-02 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2539') +('0002531787200','PROSCIUTTO',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'mixmatchcode','2009-02-09 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'2540') +('0002531795850','APPLEGATE CHICKEN POT PIE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2541') +('0002536000082','PAPPLE BAG GOLD DEL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2542') +('0002536000500','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2543') +('0002536003540','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2544') +('0002540000013','SPICY PEPPER HUMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2545') +('0002540000017','CUC DILL HUMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2546') +('0002540000018','HUMMUS BLK OLIVE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2547') +('0002540000020','PESTO HUMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2548') +('0002540000021','EGGPLANT HUMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2549') +('0002540000023','ART. & GARLIC HUMMUS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2550') +('0002548400005','EGGROLL WRAPS',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2551') +('0002548400039','NAYONAISE,DIJON-STYLE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2552') +('0002548400040','NAYONAISE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2553') +('0002558300463','TOFURKY,VEGETARIAN FEAST',28.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-10-30 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2554') +('0002558300601','TOFURKY BEER BRATS',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2555') +('0002558300602','TOFURKY SWEET ITAL SAUSGE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2556') +('0002558307461','TOFURKY VEGETARIAN ROAST',13.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-10-30 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2557') +('0002558311500','TOFURKY JURKY,ORIGINAL',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2558') +('0002558311501','TOFURKY JURKY,PEPPERED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2559') +('0002558366873','OVEN ROASTED DELI SLICES',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-16 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2560') +('0002558366874','DELI SLICES,HICKORY SMKD',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2561') +('0002561162071','CHEDDAR CHEESE CURDS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-09-04 08:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12854') +('0002563861004','VANILLA XTRT,MDGSR,OG',13.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2562') +('0002571568353','EYE WASH CUP',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'499','2009-09-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2563') +('0002572000000','PPEANUT BAGGED',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','548','0','0','1','0',0,'0','2008-04-23 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2564') +('0002598000000','HORSERADISH ROOT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'mixmatchcode','2009-03-30 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2565') +('0002603800000','BLACKBERRY CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-15 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2566') +('0002639500032','ALOE VERA JUICE,OG',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2567') +('0002639500116','ALOE VERA GELLY,OG',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2568') +('0002639500118','ALOE VERY GELLY',8.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2569') +('0002639510032','ALOE VERA GEL,OG',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2570') +('0002639580032','ALOE VERA JC,LEMON/LIME',10.05,'0',0.00,'0',7.29,NULL,7.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','106','0','0','1','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2571') +('0002660334712','TEA BAG, COTTON',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2006-07-07 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2572') +('0002666431709','FOOD SCI VERM CHOLESTSAFE',32.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2573') +('0002675900000','CRANBERRY VANILLA COFFEECAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','1',0,'0','2008-12-31 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2574') +('0002683230010','MEATBALL,MTLS,CLASSIC,VEG',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2007-04-24 06:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2575') +('0002683230800','MEATBALL,MTLS,ITAL,VEG',47.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2576') +('0002685110540','DOG TREAT PEANUT BUTTER',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-06-27 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2577') +('0002685112040','ADULT CAT FORMULA,DRY',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2578') +('0002685112090','SENIOR CAT FORMULA,DRY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2579') +('0002693000000','GF PECAN CHOCOLATE CHUNK',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2580') +('0002701830142','TEA,CAFFEINE FREE',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2581') +('0002701830149','TEA,ORIGINAL BLEND #1',3.95,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2582') +('0002701830178','TEA,GREEN BLEND',4.45,'0',0.00,'0',3.55,'0',3.55,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'0','2009-03-12 09:04:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2583') +('0002701830258','TEA,GREEN BLEND DECAF',4.45,'0',0.00,'0',3.55,'0',3.55,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'0','2009-03-12 09:04:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2584') +('0002706457111','WHITE SPELT,OG,ROTINI 8 OZ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2585') +('0002706459600','SPELT PRETZELS',2.79,'0',0.00,'0',2.25,'0',2.25,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2586') +('0002727520002','LICORICE HERBAL TPASTE',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2587') +('0002727520003','MINT-FR HOMEOPATHIC TPSTE',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2588') +('0002743401023','MAGNESIUM,400 MG',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2589') +('0002743401205','COD LIVER OIL SOFTGELS',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2590') +('0002743401224','COD LIVER OIL,PLAIN',13.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2591') +('0002743401504','PANCREATIN',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2592') +('0002743401506','BETAINE HCI',16.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2593') +('0002743403142','DR WEIL BALANCED CAL MAG',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2594') +('0002791700113','PB8 ACIDOPHILUS,VEGETARN',13.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2595') +('0002791700126','RHINO ECHINACEA',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2596') +('0002791700127','RHINO LIQUID ECHINACEA',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2597') +('0002791700134','RHINO ECHINACEA POPS',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2598') +('0002791700138','RHINO-ZINC CHEWABLE TABS',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2599') +('0002791700139','RHINO GUMMY BEAR VITES',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2600') +('0002791700173','RHINO-ESTER C,CHEWABLE',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2601') +('0002791700256','RHINO CALCIUM,CHERRY',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2602') +('0002791700385','RHINO GUMMY BEAR VEG VITE',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2603') +('0002791700704','WARM HERBAL',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2604') +('0002791701743','RHINO FOS ACIDOPHILUS',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-02-26 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2605') +('0002818920466','CHILE,DICED,GREEN,HOT',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2606') +('0002819587993','A COOKBOOK FOR ALL SEASONS',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-19 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2608') +('0002836773148','BAR SOAP,OLIVE OIL',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2609') +('0002836773149','BAR SOAP,OLIVE & ALOE',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2610') +('0002836782756','OLIVE & ALOE MOISTURIZER',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2611') +('0002836782785','A & E MOISTURIZER',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2612') +('0002836782798','HONEY CALENDULA MOIST',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2613') +('0002836782824','BAR SOAP,OLIVE OIL&HONEY',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2614') +('0002836782834','BATH/SHOWER GEL,ANTISTRSS',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2615') +('0002836782839','BAR SOAP,CHAMOMILE OLIVE',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2616') +('0002836782874','DEOD,LIQUID ROCK FRAG FRE',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2617') +('0002836782881','BATH/SHOWER GEL,PATCHOULI',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2618') +('0002836782925','KMF OLIVE ALOE MOIST GALLON',56.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-08-21 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2619') +('0002836782929','KMF SOAP GALLON',37.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2620') +('0002836782967','MOISTURE SHAVE,FRAG FREE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2621') +('0002836783062','MOIST BATH,EARLY TO BED',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2622') +('0002836783096','MOIST SOAP,OLIVE & ALOE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2623') +('0002836783100','MOIST SOAP,PEAR',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2624') +('0002836783101','MOIST SOAP,FRAG FREE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2625') +('0002836783102','MOIST SOAP,ORNG BLOSSOM',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2626') +('0002836783120','PATCHOULI MOISTURIZER',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2627') +('0002836783121','MOISTURE SHAVE,PATCHOULI',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2628') +('0002836783130','BATH/SHOWER GEL,SILKY SFT',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2629') +('0002836783131','ROLL-ON,LIQUID ROCK,PTCHL',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2630') +('0002836783132','ROLL-ON,LIQUID ROCK,LVNDR',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2631') +('0002836783150','MOIST SOAP,TT GERMSASIDE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2632') +('0002836783151','LAVNDER&SHEA BUTTER MOIST',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2633') +('0002836783155','TPASTE,ALOEDYNE,TRPLE ACT',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-19 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2634') +('0002836783156','TPASTE,ALOEDYNE,WHITENING',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-19 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2635') +('0002836783157','KMF MOUTHWASH 8.45 OZ',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-11 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2636') +('0002836783165','SHAMP,MISS TRTD,PARABN FR',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2637') +('0002836783167','SHAMP,WHENEVER,PARABN FRE',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2638') +('0002836783168','SHAMP,BIG BODY,PARABN FRE',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2639') +('0002836783169','STYLING GEL,UPPER MNGMNT',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2640') +('0002836783211','LIP BALM,SPF15,PEACH',3.35,'0',0.00,'0',2.65,'0',2.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2641') +('0002836783212','LIP BALM,SPF15,CRAN ORNGE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2642') +('0002836783213','LIP BALM,GINGER MANGO',3.35,'0',0.00,'0',2.65,'0',2.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2643') +('0002836783221','KMF TRAVEL BAR SOAP',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2644') +('0002836783291','KMF TRAVEL DEODERANT',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2645') +('0002836783293','KMF TRAVEL SHAMPOO',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2646') +('0002836783296','KMF TRAVEL LIQUID SOAP',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2648') +('0002836783298','KMF TRAVEL SHOWER GEL',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2649') +('0002836783299','KMF TRAVEL LOTION',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2650') +('0002836783301','KMF TRAVEL SHAVE CREAM',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2651') +('0002836783308','FOAM SOAP,OG,LVND&CHAM',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2652') +('0002836783309','FOAM SOAP,OG,GRPFRT&BERG',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2653') +('0002836783350','BAR SOAP,OLIVE & LAVENDER',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2654') +('0002836783422','LIP BALM,TREAT MINT',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2655') +('0002836783423','LIP BALM,STRAWBERRY',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2656') +('0002836783424','LIP BALM,VANL HONEY',3.35,'0',0.00,'0',2.65,'0',2.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2657') +('0002836783427','KMF TRAVEL TOOTHPASTE',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2006-08-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2658') +('0002836783455','MOIST SHAVE,COOL MINT',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2659') +('0002836783458','MOIST SHAVE,VANLA EARTH',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2660') +('0002836783459','DEOD,ACT ENZYM,STK,FRG FR',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2661') +('0002836783460','DEOD,ACT ENZYM,STK,SUMMR',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2662') +('0002836783463','DEOD,ACT ENZYM STK,PATCHL',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2663') +('0002836783464','DEOD,LIQ ROCK,SUMMR SCENT',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2664') +('0002836783467','COND,WHENEVER,PARABEN FRE',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2665') +('0002836783468','COND,BIG BODY,PARABEN FRE',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2666') +('0002836783469','COND,MISS TRTD,PARABN FRE',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2667') +('0002836783478','KMF LAV',10.45,'0',0.00,'0',7.39,NULL,7.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2668') +('0002836783479','KMF GRAPEFR BERG REFILL SOAP',10.45,'0',0.00,'0',7.39,NULL,7.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2669') +('0002836783483','KMF TRAVEL COND',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2006-12-22 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2670') +('0002836783561','KISSES ON TRIAL GIFT PACK',11.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2671') +('0002836783623','KMF ANTICAVITY ALOE GEL TP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-11 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2672') +('0002836783624','KMF SENSITIVE ALOE GEL TP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-11 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2673') +('0002836783625','KMF TARTAR CONTROL ALOE TP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-11 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2674') +('0002840009217','PITA CHIPS,SIMPLY NAKED',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'499','2009-08-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2675') +('0002840009221','PITA CHIPS,PARM GRLC HER',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'499','2009-08-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2676') +('0002840009230','PITA CHIPS,TUSCAN HERB',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'499','2009-08-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2677') +('0002855812121','POTATO CHIPS,RF,LGHT SALT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1552','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2678') +('0002855812123','POTATO CHIPS,RF,RIPPLED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1552','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2679') +('0002855812125','POTATO CHIPS,RF,YGT/GRN',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1552','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2680') +('0002855860701','CHEESE PUFFS,CHED,LITE 5.5 OZ',2.99,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2681') +('0002855872002','CHEESE PUFFS,CHEDDAR',3.45,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2682') +('0002855873002','CHEESE CURLS,CHED CRUNCHY',3.45,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2683') +('0002883307010','TORTILLAS,OG,BURRITO SIZE',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2684') +('0002883316000','ALVARADO DIABETIC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-09-09 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2685') +('0002890100090','LETTUCE COMPOST KEEPER',27.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-25 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12798') +('0002890100093','NORPRO CERAMIC COMPOST KEEPER',25.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2686') +('0002890100094','NORPRO SS COMPOST KEEPER',60.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-12-05 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2687') +('0002890100110','SWIVEL PEELER',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2688') +('0002890100113','ZESTER',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-22 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2689') +('0002890100148','FRENCH PEELER',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-22 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2690') +('0002890100175','SS VEG STEAMER',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2691') +('0002890100198','NORPRO CITRUS PEELER',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-07-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2692') +('0002890100244','NORPRO BIGMOUTH FUNNEL',9.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2693') +('0002890100339','CHEESE GRATER',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-22 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2694') +('0002890100406','CAN OPENER',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2695') +('0002890100598','NORPRO JAR WRENCH',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2696') +('0002890100600','NORPRO JAR LIFTER',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2697') +('0002890100602','CANNING LABELS',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2698') +('0002890100604','NORPRO CANNING RACK',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-16 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2699') +('0002890100605','NORPRO CANNING LID RACK',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2700') +('0002890100606','MAGNETIC LID WAND',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2701') +('0002890100614','JELLY STRAINER AND BAGS',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-07-16 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2702') +('0002890100615','JELLY STRAINER BAGS',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2703') +('0002890100942','NORPRO COTTON TWINE',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-11-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2704') +('0002890101305','NORPRO CAN CRUSHER',13.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2705') +('0002890101472','RE-USABLE TURKEY TIMER',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2706') +('0002890103051','NORPRO 4PC MEASURING SPOONS',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-07-25 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2707') +('0002890103063','NORPRO 8PC MEASURING SPOONS',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-12-05 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2708') +('0002890105111','NORPRO WEDGER/CORER',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2709') +('0002890105119','NORPRO CHERRY/OLIVE PITTER',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-09-15 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2710') +('0002890105971','MEAT THERMOMETER',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2711') +('0002890106523','NUT CRACKER',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-12-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2712') +('0002890110093','NORPRO CERAMIC COMPOST FILTER',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-22 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2713') +('0002890110094','NORPRO SS COMPOST FILTER REPL',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-22 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2714') +('0002890150093','RED CERAMIC COMPOST KEEPER',25.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2715') +('0002898906180','CORN DOG,MEAT FREE,VEG',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2716') +('0002898911226','BRKFST PATTIE,OG,VEG',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2717') +('0002898926177','MEAL STARTER,STEAK STRIP',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2718') +('0002898926180','MEAL STARTER,CHIKN STRI',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2719') +('0002898928150','BURGER,OG,VEGGIE MEDLEY',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2720') +('0002898943405','MRNGSTR BBQ RIBLETS',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2009-04-03 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2721') +('0002919000000','O',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2722') +('0002970000701','POTATOES,MASHED,BABY RED',4.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2723') +('0003004200088','FRESH MOZZARELLA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-08-07 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2724') +('0003005400225','NATURES HERBS CELERY SEED100CT',8.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2725') +('0003006500009','BRAD MATTHEWS WHITE',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-04-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2726') +('0003006500044','BREAD MATTHEWS 9 GRAIN NUT',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-04-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2727') +('0003006511111','ENGLISH MUFFIN,WW,PLAIN',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2728') +('0003006533333','ENGLISH MUFFIN,UNBL WHITE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2729') +('0003006544444','BREAD MATTHEWS',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-04-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2730') +('0003006588888','BREAD MATTHEWS OAT BRAN',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-04-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2731') +('0003022304201','PSALAD SPRING MIX 5oz CLAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-18 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2732') +('0003022304202','PSALAD BABY SPINACH 5 OZ CLAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-24 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2733') +('0003022304220','PSALAD ROMAINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2734') +('0003022304221','PSALAD ITALIAN',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'668','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2735') +('0003022304222','PBaby Romaine Bag',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2736') +('0003022304223','PSALAD SPRING MIX BAG',3.29,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','521','0','0','1','0',0,'669','2009-04-22 07:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2737') +('0003022304224','PSALAD BABY SPIN TF',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2738') +('0003022304226','parugula bag',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2739') +('0003022304229','PLETTUCE ROMAINE HEART',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2740') +('0003022304336','PSALAD SPRING MIX 1# CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2741') +('0003022304350','PSALAD ROMAINE HEART CLAM',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1078','2009-03-20 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2742') +('0003022304780','PSALAD BABY SPINACH 1# CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1018','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2743') +('0003026400140','MOCHI PLAIN',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2009-05-08 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2744') +('0003026400210','AMAZAKE ALMOND SHAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2008-11-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2745') +('0003068403502','GINGER SNAPS',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2747') +('0003068403503','LEMON SNAPS',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2748') +('0003068476890','GINGER SNAPS,G/F',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2749') +('0003073405166','SPICE LABELS',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2750') +('0003085211555','EASY SPROUT',12.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2006-07-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'2751') +('0003087130150','AIOLI WILD WOOD',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-23 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2752') +('0003089300505','PORANGE PEELER',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','501','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2753') +('0003090036152','SLICED SWISS',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2754') +('0003096302050','MLO PROTEIN BR. RICE',19.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'499','2009-09-24 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2755') +('0003098503700','DERMA E CLEAR SKIN 1 CLEANSER',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2756') +('0003098503800','DERMA E CLEAR SKIN 2',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2757') +('0003098503900','DERMA E CLEAR SKIN 3 MOISTURIZ',18.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2758') +('0003098508300','STOP ITCH CREME',18.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2006-10-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2759') +('0003098508700','PSORZEMA CREME',18.95,'0',0.00,'0',12.29,'0',12.29,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','90','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2760') +('0003114200011','MASCARPONE',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-10-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2761') +('0003114200088','FRESH MOZZARELLA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-08-07 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2762') +('0003114200570','BelGioioso FRESH MOZZ ROLL',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-07-29 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2763') +('0003120090004','PBERRY CRANBERRY NON-O',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'733','2008-11-25 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2764') +('0003143600011','NAT HARDWOOD CHARCOAL',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','186','0','1','0','0',0,'499','2009-04-16 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2765') +('0003149302160','RUDIS 100% WH WHEAT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2766') +('0003149302300','RUDI WHEAT AND OATMEAL',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2767') +('0003149302320','RUDI 7 GRAIN FLAX',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-24 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2768') +('0003149302340','RUDIS 14 GRAIN',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-08-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2769') +('0003149302360','Rudis Apple n Spice',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2006-09-18 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2770') +('0003149303020','Rudi Right Choice Herb Bread',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2006-07-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2771') +('0003149303159','RUDI SPELT',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2772') +('0003149306044','100% WW Burger Buns',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2007-07-14 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2773') +('0003149306065','RUDIS WW ENGLISH MUFFIN',3.99,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2774') +('0003149306085','RUDIS MULTIGRAIN FLAX ENG MUFF',3.99,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2775') +('0003149306105','Rudis Spelt English Muffins',3.99,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2776') +('0003149307120','RUDIS ANCIENT GRAIN SPELT',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2777') +('0003149308200','RUDIS BAGELS PLAIN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-09-04 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12858') +('0003149308202','RUDIS BAGELS HONEY WHEAT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-09-04 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12855') +('0003149308204','RUDIS BAGELS CIN RAISIN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-09-04 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12857') +('0003149308206','RUDIS BAGELS MULTIGRAIN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-09-04 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12856') +('0003149324242','RUDI HONEY SWEET WH WHEAT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2778') +('0003149331751','RUDI ROCKY MT SOURDOUGH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2779') +('0003149343217','Rudis Multigrain Artisan',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-07-09 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2780') +('0003149343225','RUDIS ROSEMARY OLIVE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-07-09 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2781') +('0003149343229','RUDI ROASTED GARLIC',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-07-09 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2782') +('0003149354371','RUDI CNTRY MORN WHITE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2783') +('0003149354373','RUDI COLORADO CRKD WHEAT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'499','2009-05-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2784') +('0003149360960','RUDI SPELT BURGER BUN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-14 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2785') +('0003149377636','Rudis White Hamburger Buns',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-07-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2786') +('0003149377637','RUDI WHEAT HAMBURGER BUNS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2787') +('0003149377638','Rudis White Hot Dog Buns',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-07-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2788') +('0003149377639','RUDI HOT DOG BUN',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2789') +('0003149380489','RUDI JEWISH RYE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2790') +('0003149381132','TORTS,OG,WHITE SPELT',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2791') +('0003149381134','TORTS,OG,WHOLE SPELT',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2792') +('0003149382888','MULTIGRAIN OAT RUDIS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2793') +('0003149392181','Rudis Cinnamon raisin Bread',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2794') +('0003149392183','Rudis Cinnamon Raisin Bread',4.99,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','150','0','0','1','0',0,'mixmatchcode','2009-04-11 06:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'2795') +('0003260100100','PMIXED BABY GREENS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1010','2008-04-13 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2796') +('0003260100300','PSALAD BABY ROMAINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2797') +('0003260100500','PSALAD BABY SPINACH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2798') +('0003260100550','PARUGULA BABY BAG',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2799') +('0003260103110','PCELERY BUNCH',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2800') +('0003260103115','PLETTUCE ROMAINE HRT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2801') +('0003260103118','PLETTUCE ICEBERG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'947','2009-09-03 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2802') +('0003260103120','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2803') +('0003260103170','PTOMATO CHERRY 10OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2804') +('0003260103195','PGARLIC 3OZ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2805') +('0003260103196','PGARLIC 8OZ PKG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1180','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2806') +('0003260103210','PONION BAG RED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'633','2009-03-05 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2807') +('0003260103215','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2808') +('0003260104100','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2809') +('0003260104110','PCARROT BAG 1#',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'511','2009-02-04 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2810') +('0003260104200','PCARROT BAG 2#',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'512','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2811') +('0003260104400','PCARROT BAG 5#',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'513','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2812') +('0003260104500','PCARROT BABY 2#',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'670','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2813') +('0003260104700','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2814') +('0003260104710','PPOTATO BAG RED 3#',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2815') +('0003260104780','PGINGER BAGGED 4OZ',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1182','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2816') +('0003260104900','PPOTATO BAG RUSS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2817') +('0003260108300','PSALAD ITALIAN BAG',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'668','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2818') +('0003260108400','PSALAD BABY SPINACH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2819') +('0003260108800','PSALAD SPRING MIX CLAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-18 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2820') +('0003260108850','PBABY SPIN KIT CLAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1293','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2821') +('0003260108900','PCAESAR SALAD CLAM',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1162','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2822') +('0003260150001','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2823') +('0003260150135','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2824') +('0003260150145','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2825') +('0003260150250','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2826') +('0003260150511','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2827') +('0003260150516','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2828') +('0003260150595','PAPPLE BAG SLICES',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1054','2007-10-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2829') +('0003260150616','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2830') +('0003260160105','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2831') +('0003260170300','PSALAD BABY SPINACH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2832') +('0003260170525','PSALAD FANCY ROMAINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2833') +('0003260170625','PSALAD BABY SPINACH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2834') +('0003260170825','PSALAD ITALIAN',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'668','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2835') +('0003260171525','PSALAD AMERICAN BAG',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1008','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2836') +('0003260190010','PSALAD SPRING MIX CLAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-18 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2837') +('0003260190020','PSALAD BABY SPINACH CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1018','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2838') +('0003260190030','PSALAD BABY ROMAINE CLAMSHELL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1078','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2839') +('0003260190040','PARUGULA BABY CLAM',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'2840') +('0003260190066','PSALAD MACHE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1009','2009-02-01 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2841') +('0003260190140','PSALAD SPRING MIX 1# CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2842') +('0003260190150','PSALAD BABY SPINACH 1# CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1018','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2843') +('0003284333480','CAFE ALTURA KONA 10 OZ',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-02-08 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'2844') +('0003284333616','COFFEE OG FT CLASSIC RSTALTURA',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'2845') +('0003291700009','HERB TEA,SMOOTH MOVE',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2846') +('0003291700012','HERB TEA,PREGNANCY',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2847') +('0003291700013','HERB TEA,THROAT COAT',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2848') +('0003291700014','HERB TEA,OG,MOTHER',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2849') +('0003291700015','HERB TEA,BREATHE EASY',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2850') +('0003291700016','HERB TEA,GYPSY COLD CARE',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2851') +('0003291700032','HERB TEA,NIGHTY NIGHT',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2852') +('0003291700051','TEA,OG,ECHINACEA PLS',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2853') +('0003291700064','WEIGHTLESS TEA,CRANBERRY',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2854') +('0003291700067','TEA,OG,RASPBERRY LEAF',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2855') +('0003291700068','HERB TEA,PAU D',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2856') +('0003291700089','HERB TEA,EVERYDAY DETOX',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2857') +('0003291700102','HERB TEA,GINGER AID',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2858') +('0003291700154','TEA,OG,ECHINACEA ELDER',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2859') +('0003291700156','TEA,OG,CHAMOMILE',4.35,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'mixmatchcode','2009-02-20 09:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2860') +('0003291700159','HERB TEA,LEMON ECH THROAT',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2861') +('0003291700161','BANCHA GREEN TEA, OG',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2862') +('0003291700165','TEA, OG, RSTD DANDELION RT',5.35,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2863') +('0003291700172','TRAD MED THROAT COAT PASTILLE',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-23 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'2864') +('0003297630010','CLUMPING CAT LITTER 10 lbs',13.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2865') +('0003301700151','SOUP CUP, POTATO LEEK',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2866') +('0003301700181','SOUP CUP,BLACK BEAN',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2867') +('0003301700184','SOUP CUP SPLIT PEA',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2868') +('0003301700186','SOUP CUP,MINESTRONE',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2869') +('0003301700187','SOUP CUP RED BEANS N RICE',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'2870') +('0003333731101','VALLEY VIEW WHL MILK GAL.',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2871') +('0003333731102','VALLEY VIEW 2% MILK GAL.',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2872') +('0003333731103','VALLEY VIEW 1% MILK GAL.',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2873') +('0003333731104','VALLEY VIEW SKIM MILK GAL.',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2874') +('0003333731201','VALLEY VIEW WHL MILK HALF GAL.',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2875') +('0003333731202','VALLEY VIEW 2% HALF GALLON',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 09:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2876') +('0003333731203','VALLEY VIEW 1% HALF GALLON',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 08:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2877') +('0003333731204','VALLEY VIEW SKIM HALF GALLON',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-08-11 09:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2878') +('0003333733305','BUTTERMILK QU.',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2007-09-06 01:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2879') +('0003333733307','HALF & HALF QUART',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2007-09-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2880') +('0003333733507','HALF & HALF PINT',0.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2007-09-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'2881') +('0003338290001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2882') +('0003338300001','PAPPLE BAG RED DELIC',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2883') +('0003338300038','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2884') +('0003338300081','PAPPLE BAG G DELICIO',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2885') +('0003338300109','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2886') +('0003338300145','PAPPLE BAG GOLD DEL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2887') +('0003338300386','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2888') +('0003338300469','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2889') +('0003338300472','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2890') +('0003338300505','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2891') +('0003338300506','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2892') +('0003338300507','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2893') +('0003338300549','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2894') +('0003338300565','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2895') +('0003338300567','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2896') +('0003338300658','PAPPLE BAG GDELICIOU',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2897') +('0003338300697','PAPPLE BAG HONEYCRISP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2898') +('0003338300698','PAPPLE BAG HONEYCRISP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2899') +('0003338300701','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2900') +('0003338300704','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2901') +('0003338300737','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2902') +('0003338300739','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2903') +('0003338300741','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2904') +('0003338300900','PAPPLE BAG RED DELIC',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2905') +('0003338300903','PAPPLE BAG RDELICIOU',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2906') +('0003338300912','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2907') +('0003338300920','PAPPLE BAG CORTLAND',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'548','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2908') +('0003338300924','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2909') +('0003338300930','PAPPLE BAG GDELICIOU',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2910') +('0003338300932','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2911') +('0003338300946','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2912') +('0003338300956','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2913') +('0003338300960','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2914') +('0003338300963','PAPPLE BAG GALA 3#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2915') +('0003338300972','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2916') +('0003338300975','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2917') +('0003338300980','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2918') +('0003338300984','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2919') +('0003338300988','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2920') +('0003338300990','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2921') +('0003338300991','PAPPLE BAG GR.SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2922') +('0003338301028','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2923') +('0003338301067','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2924') +('0003338301229','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2925') +('0003338301230','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2926') +('0003338301235','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2927') +('0003338301241','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2928') +('0003338301242','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2929') +('0003338301247','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2930') +('0003338301248','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2931') +('0003338301251','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2932') +('0003338302068','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2933') +('0003338302191','PAPPLE BAG GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2934') +('0003338302725','PAPPLE BAG FUJI 2#',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2935') +('0003338302751','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2936') +('0003338304628','PAPPLE BAG WISCONSIN',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1098','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2937') +('0003338308628','PAPPLE BAG BEACON',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1210','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2938') +('0003338308809','PAPPLE BAG HONEYCRIS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2939') +('0003338309212','PAPPLE BAG GR SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2940') +('0003338309599','PAPPLE BAG GINGERGOL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'555','2007-09-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2941') +('0003338309701','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2942') +('0003338309900','PAPPLE BAG MACINTOSH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'692','2006-10-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2943') +('0003338310150','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2944') +('0003338310400','PORAGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2945') +('0003338311000','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2946') +('0003338311006','PORANGE BAG VALLEY COVE NON-O',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'793','2009-01-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2947') +('0003338311050','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2948') +('0003338311052','PORANGE BAG NAVELS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2949') +('0003338311056','PORANGE BAG VALLEY COVE NON-O',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'793','2009-01-06 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'2950') +('0003338311066','PORANGE BAG VALLEY COVE NON-O',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'793','2009-01-06 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'2951') +('0003338311502','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2952') +('0003338311800','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2953') +('0003338311804','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2954') +('0003338311906','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2955') +('0003338311911','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2956') +('0003338311982','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2957') +('0003338311983','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2958') +('0003338311984','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2959') +('0003338311985','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2960') +('0003338311987','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2961') +('0003338313120','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2962') +('0003338313330','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2963') +('0003338314604','PCLEMENTINE CASE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1121','2007-09-17 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2964') +('0003338314650','PGRAPEFRUIT BAG 4 LB',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2965') +('0003338314681','PLIME BAG KEY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'760','2007-09-17 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2966') +('0003338320027','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2967') +('0003338320034','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2968') +('0003338320038','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2969') +('0003338321026','PBERRY RASPBERRY PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2970') +('0003338321029','PBERRY RASPBERRY MARTINEZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2971') +('0003338322000','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12921') +('0003338322001','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2972') +('0003338322029','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2973') +('0003338322031','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2974') +('0003338322101','BLUEBERRIES PINT NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'0','2009-06-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2975') +('0003338322201','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2976') +('0003338322224','pberry blueberries non-o',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12859') +('0003338322228','PBERRY BLUEBERRY 1/2PT NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12860') +('0003338322230','PBERRY BLUEBERRY pint',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','0','0',0,'499','2009-07-06 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2977') +('0003338322231','PBERRY BLUBERRY PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2978') +('0003338322232','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2979') +('0003338322233','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2980') +('0003338322236','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2981') +('0003338324026','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2982') +('0003338324028','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2983') +('0003338330011','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2984') +('0003338330012','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2985') +('0003338330019','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2986') +('0003338330020','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2987') +('0003338330029','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2988') +('0003338330033','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2989') +('0003338330035','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2990') +('0003338330039','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2991') +('0003338330040','PPEAR BAG RED DANJOU',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'803','2007-09-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2992') +('0003338330046','PPEAR BAG BOSC 3#',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2993') +('0003338330047','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2994') +('0003338330049','PPEAR BAG RED DANJOU',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'803','2007-09-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2995') +('0003338330050','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2996') +('0003338330051','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2997') +('0003338330052','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2998') +('0003338330072','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'2999') +('0003338330073','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3000') +('0003338330078','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3001') +('0003338330082','PEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3002') +('0003338330109','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3003') +('0003338330348','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3004') +('0003338330607','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3005') +('0003338330960','PAPPLE BAG SANSA',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'691','2007-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3006') +('0003338340100','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3007') +('0003338340108','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3008') +('0003338340238','PFIG CALIMYRNA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','550','0','0','1','0',0,'806','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3009') +('0003338340239','PFIG BROWN TURKEY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','550','0','0','1','0',0,'805','2009-09-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3010') +('0003338340244','PFIG BLACK MISSION',4.29,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','550','0','0','1','0',0,'552','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3011') +('0003338340253','PFIG CALIMYRNA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','550','0','0','1','0',0,'806','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3012') +('0003338340257','PFIG BLACK MISSION',4.29,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','550','0','0','1','0',0,'552','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3013') +('0003338346331','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3014') +('0003338351050','PPOTATO BAG IRISH COBBLER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'987','2007-10-08 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3015') +('0003338353610','PPOTATO BAG YUKON',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3016') +('0003338353611','PPOTATO BAG RUSS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3017') +('0003338353811','PPOTATO BAG RUSS 5#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3018') +('0003338356310','PPOTATO BAG YUKON',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3019') +('0003338360037','PONION BAY YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3020') +('0003338360301','PONION PEARL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3021') +('0003338365301','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3022') +('0003338365325','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3023') +('0003338365520','PTOMATO CHERRY RED P',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3024') +('0003338365592','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3025') +('0003338365593','PTOMATO CHERR 1/2PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3026') +('0003338365594','PTOMATO CHERRY PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3027') +('0003338366609','PCARROT BABY SNACKPACK',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'866','2007-10-01 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3028') +('0003338367002','PRADISH BAGGED NON-ORG',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'682','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3029') +('0003338367531','PMUSHROOM SHIITAKE PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'963','2009-01-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3030') +('0003338367540','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3031') +('0003338367541','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3032') +('0003338367561','PMUSHROOM CRIMINI PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'957','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3033') +('0003338367601','PMUSHROOM PORTABELLA PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3034') +('0003338367606','PMUSHROOM PORTABELLA SLICED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3035') +('0003338370220','PASPARAGUS NON-O 1LB',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'mixmatchcode','2009-03-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3036') +('0003338390001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3037') +('0003338390002','Bag Red Onion',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3038') +('0003338390051','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3039') +('0003338390101','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3040') +('0003338390102','PPOTATO BAG RUSS 5#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3041') +('0003338390103','PPOTATO BAG YUKON 5#',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3042') +('0003338390110','PPOTATO BAG RED 3#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1391','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3043') +('0003338390201','PCARROT BAG 1#',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'511','2009-02-04 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3044') +('0003338390202','PCARROT BAG 2#',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'512','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3045') +('0003338390203','PCARROT BAG 5#',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'513','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3046') +('0003338390205','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3047') +('0003338390206','PCARROT BABY 2#',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'670','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3048') +('0003338390403','PONION GREEN',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'639','2009-09-23 04:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'3049') +('0003338390404','PCELERY BUNCH',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3050') +('0003338390413','PRADISH BUNCHED RED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'656','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3051') +('0003338390421','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3052') +('0003338390422','PHERB PARSLEY CURLY BNCH',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'546','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3053') +('0003338390423','PHERB PARSLEY FLAT BNCH',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'546','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3054') +('0003338390430','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3055') +('0003338390432','PSPINACH BUNCH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'672','2009-09-03 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3056') +('0003338390433','PLETTUCE ROMAINE HRT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3057') +('0003338390434','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3058') +('0003338390469','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3059') +('0003338390472','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3060') +('0003338391010','PMINNEOLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','1',0,'821','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3061') +('0003338391024','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3062') +('0003338396245','PPLANT CYCLAMEN',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3063') +('0003338396618','PROSE PARADE',999.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3064') +('0003338397678','PFLOWERS BIG SUNNY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'3065') +('0003338397738','PFLOWER GLADIOLA',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3066') +('0003338397992','PFLOWERS TULIP BQT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3067') +('0003361700703','CRISPBREAD,MULTI GRAIN',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-07-17 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3068') +('0003367400700','CAYENNE,EXTRA HOT,10000HU',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3069') +('0003367402020','BEE POLLEN',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3070') +('0003367402070','ACTIVATED CHARCOAL,260MG',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-11-28 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3071') +('0003367406800','NWAY PRIMADOPHILUS 90CT',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-01-04 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3072') +('0003367406881','NWAY PRIMADOPHILUS 5OZ.',15.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-03-18 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3073') +('0003367410700','NWAY BLESSED THISTLE 100CT',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-05-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3074') +('0003367411500','CAYENNE',7.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3075') +('0003367411750','VITEX AGNUS-CASTUS',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3076') +('0003367412300','DANDELION ROOT',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3077') +('0003367412850','NWAY FEVERFEW 100CT',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-05-20 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3079') +('0003367413100','GINGER',7.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3080') +('0003367414500','NWAY KELP',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3082') +('0003367414537','NW PEPOGEST 60CT',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3083') +('0003367415150','NWAY NETTLE',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3084') +('0003367415170','ECHINACEA VCAP',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3085') +('0003367415171','MILK THISTLE',15.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3086') +('0003367415174','FENUGREEK SD VCAP',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3087') +('0003367415179','BLACK COHOSH VCAP',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3088') +('0003367415180','ASTRAGALUS',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3089') +('0003367415181','OREGANO OIL VCAP',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3090') +('0003367415273','NWAY UMCKA COLDCARE',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3091') +('0003367415611','NWAY RESVERATROL',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-13 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3092') +('0003367415640','NWAY HOODIA 60CT',23.99,'0',0.00,'0',15.65,'0',15.65,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','102','0','1','0','0',0,'0','2006-08-02 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3093') +('0003367417300','NWAY ST. JOHNS WORT',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-06-20 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3094') +('0003367417850','WHITE WILLOW',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-03-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3095') +('0003367463100','TUMERIC',15.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3096') +('0003367464400','NWAY BOSWELLIA 60 CT',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-07-16 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3097') +('0003374597024','DIOTOMACEOUS EARTH',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3098') +('0003377601170','BUTTERY SPREAD,NATURAL',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3099') +('0003377601171','BUTTERY SPREAD,OG,WHIPPED',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3100') +('0003377601174','BUTTERY STICKS,4 STICKS',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3101') +('0003377601179','SHORTENING,G/F,NO DAIRY',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3102') +('0003452912362','SEA VEG,OG,DULSE 2 OZ',6.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3103') +('0003452912363','SEA VEG,OG,KELP,KOMBU',5.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3104') +('0003452912365','DULSE FLAKES,OG',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-09-19 02:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3105') +('0003452912383','SUSHI NORI,TSTD,7-SHEET .6 OZ',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3106') +('0003530200200','TOFU,FIRM NIGARI,LF 8OZ',2.05,'0',0.00,'0',1.65,'0',1.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3107') +('0003530200216','TOFU,FIRM NIGARI,LF 12OZ',2.69,'0',0.00,'0',2.15,'0',2.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3108') +('0003547518234','FARMERS LARGE EGGS DOZ',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3109') +('0003574201067','PSEED GOLDEN ZUKE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3110') +('0003574204437','PSEED CHEROKEE WAX',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3111') +('0003574214022','CRACKER,OG,BRSCHTA,VEG,LF',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1555','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3112') +('0003574214045','CRACKER,OG,CRCKD PPPR,LF',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1555','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3113') +('0003574214046','CRACKER,OG,SESAME,LF',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1555','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3114') +('0003574214047','CRACKER,OG,STND WHEAT,LF',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1555','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3115') +('0003574214202','GRAHAM CRACKERS,OAT BRAN',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3116') +('0003574214203','CRACKER,OG,ORIG RICE BRN',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3117') +('0003574222911','SOUP,OG,CREAM MUSHROOM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3118') +('0003574222912','SOUP,OG,CREAM CHICKEN',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3119') +('0003574222913','SOUP,OG,CREAM CELERY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3120') +('0003574224101','CHILI,VEGETARIAN MILD',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1536','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3121') +('0003588300101','VEGE DOG BISC,MR. BARKY 26 OZ',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3122') +('0003588300103','PB DOG BISC,MR. PUGSLEY 26 OZ',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3123') +('0003588300303','CAT TREAT,OG,PURRLICIOUS 3 OZ',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3124') +('0003588300438','ADLT DOG,OG,CHICKEN & VEG 12.7',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3125') +('0003588300501','CAT,FISH/CHICKEN/LIVER 5.5 OZ',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3126') +('0003588300502','CAT,FISH/CHICKEN/LIVER DINNER',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-05-27 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3127') +('0003588300503','CAT,CHICKEN & WHEAT GERM',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3128') +('0003588300504','CAT,CHICKEN & WHEAT GERM 14 OZ',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3129') +('0003588300507','CAT,SAVORY SEAFOOD DINNER',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3130') +('0003588300508','CAT,SAVORY SEAFOOD DINNER 14 O',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3131') +('0003588300509','CAT,PREMIUM FEAST DINNER 5.5 O',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3132') +('0003588300510','CAT,PREMIUM FEAST DINNER 14 OZ',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3133') +('0003588300539','CAT,OG,CHICKEN & VEG 5.5 OZ',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3134') +('0003588304003','CAT&KITTEN,CHKN,PREM DRY 8 #',22.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3135') +('0003588305007','CAT,SAVORY SEAFOOD DINNER 3.OZ',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3136') +('0003588305009','CAT,PREMIUM FEAST DINNER 3 OZ',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3137') +('0003588305015','CAT,CHIX STEW DINNER,LITE 3 OZ',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3138') +('0003619212077','CHOCOLATE SYRUP,OG',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3139') +('0003619212210','APPLESAUCE,OG CUPS',4.75,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'0','2009-01-09 12:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3140') +('0003619212213','APPLESAUCE,OG,CINNAMON',4.75,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3141') +('0003619212215','100% LEMON JUICE,OG',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3142') +('0003619212216','100% LIME JUICE,OG',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3143') +('0003619212220','JUICE,OG,LMN GNGR ECHINAC',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3144') +('0003619212221','JUICE,OG,CONCORD GRAPE',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3145') +('0003619212222','JUICE,OG,LIMEADE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','1','1','0',0,'499','2009-06-11 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3146') +('0003619212225','LEMONADE,OG,MANGO',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','1','1','0',0,'499','2009-06-11 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3147') +('0003619212239','JUICE,OG,ORANGE MANGO',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3148') +('0003619212241','JUICE,OG,APPLE,QUART',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3149') +('0003619212245','JUICE OG LEMONADE',3.15,'0',0.00,'0',2.79,'0',2.79,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','165','0','1','1','0',0,'499','2009-06-11 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3150') +('0003619212246','LEMONADE,OG,STRAWBERRY',3.15,'0',0.00,'0',2.79,'0',2.79,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','165','0','1','1','0',0,'499','2009-06-11 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3151') +('0003619212247','LEMONADE,OG,RASPBERRY',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','1','1','0',0,'499','2009-06-11 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3152') +('0003619212259','NECTAR,OG,PEAR',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3153') +('0003619212289','JUICE,OG,WHITE GRAPE',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3154') +('0003619212291','APPLESAUCE,OG',4.49,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1546','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3155') +('0003619212292','APPLESAUCE,OG,BLACKBERRY',4.49,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1546','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3156') +('0003619212293','APPLESAUCE,OG,STRAWBERRY',4.49,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1546','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3157') +('0003619212294','APPLESAUCE,OG,APRICOT',4.49,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1546','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3158') +('0003619212300','APPLESAUCE OG RASPBERRY',4.49,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1546','2008-09-19 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3159') +('0003619212301','APPLESAUCE OG BLUEBERRY',4.49,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1546','2008-09-19 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3160') +('0003634803141','CRITTER RIDDER',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3161') +('0003637402005','CHIPOTLE MEXICAN HOT SAUCE',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-08-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3162') +('0003680007423','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3163') +('0003700000590','KIRKS CASTILLE BAR SOAP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3164') +('0003701424221','CHOC BAR,MLK/CHERRY,DOLPH',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3165') +('0003701424223','CHOC BAR,DRK ESPRESSO,TIGR',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3166') +('0003701424225','CHOC BAR,DRK/HZLNT,RHINO',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3167') +('0003701424226','CHOC BAR,DRK/MINT,RAIN FR',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3168') +('0003701424230','CHOC BAR,DRK/ALMD/CRN,WL',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2009-02-02 11:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3169') +('0003701424231','CHOC BAR,MLK/SMOTH,OTTER',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3170') +('0003701424237','CHOC BAR,DRK/SMOOTH,CHIMP',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3171') +('0003701424238','CHOC BAR,DRK/BLUEBY,TURTL',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2008-04-07 04:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3172') +('0003701424247','CHOC BAR EXTREME DARK PANTHER',2.95,'0',0.00,'0',1.89,NULL,1.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1512','2007-11-02 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3173') +('0003701425002','BUG BITES,OG,MILK CHOC',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3174') +('0003701425003','BUG BITES, DARK CHOC.',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3175') +('0003701425007','CHIMP MINTS BITES',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3176') +('0003701426201','MILK CHOC HALLOWEEN TREATS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3177') +('0003701426202','DARK CHOC HALLOWEEN TREATS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3178') +('0003701426301','HOLIDAY TREATS, MILK',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3179') +('0003701426302','HOLIDAY TREATS, DARK',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-02-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3180') +('0003701426501','EASTER BITES MILK CHOC',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-02-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3181') +('0003701426502','EASTER BITES DARK CHOC',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-04-01 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3182') +('0003701431016','BITE SIZE CHOC,OTTER MIL',3.39,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2009-02-02 11:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3183') +('0003701431018','BITE SIZE CHOC,DRK CHOC7',3.39,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'499','2009-04-20 08:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3184') +('0003701431019','BITE SIZE CHOC,MINT CHOC',3.39,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2009-02-02 11:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3185') +('0003710267800','PMUSHROOM OYSTER PKG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'965','2007-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3186') +('0003727938697','GRAPE LEAVES',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-07-22 11:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3187') +('0003784207650','PEGGROLL SKINS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1141','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3188') +('0003798300015','VEGAN RELLA CHEDDAR STYLE',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2006-11-17 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3189') +('0003798300016','VEGAN RELLA MOZZARELLA',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2006-03-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3190') +('0003823131022','PFLOWERS MISTLETOE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3191') +('0003823213936','PBRUSSELS SPROUTS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'693','2009-02-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3192') +('0003823275757','PPINEAPPLE CHUNKS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1335','2008-07-09 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3193') +('0003823283556','PPINEAPPLE CHUNKS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1335','2008-07-11 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3194') +('0003823283570','PPINEAPPLE CORED',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1313','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3195') +('0003823283600','M',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-07-11 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3196') +('0003823283610','PMANGO KIWI MIX',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1336','2008-07-11 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3197') +('0003826185736','PURE KOSHER DILL',5.99,'0',0.00,'0',4.79,'0',4.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','34','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3198') +('0003826185766','HORSERADISH,PREPARED',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3199') +('0003853762001','PPINEAPPLE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'3200') +('0003855001104','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3201') +('0003855001151','PIKIWFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3202') +('0003879434777','BURRITO,OG LF BN,RICE&CH',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-05-08 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3203') +('0003879499481','BURRITO,FAJITA CHICKEN',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-05-08 11:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3204') +('0003879499482','BURRITO,CHICKEN,LF',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-05-08 11:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3205') +('0003879499494','CEDARLANE TKY BCN BRKFST BRRTO',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-07-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3206') +('0003879499495','CEDARLANE VEG&CHS BRKFST BRRTO',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-07-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3207') +('0003903900094','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3208') +('0003903900095','PTNGERINE BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'569','2004-11-24 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3209') +('0003903900096','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3210') +('0003905900088','SOFT CANOLEO MARGARINE',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3211') +('0003915301003','EXTRA VIRGIN OLIVE OIL',10.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3212') +('0003915301007','OLIVE OIL,EX VIRGIN',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3213') +('0003915341355','GLACE, BALSAMIC',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3214') +('0003927811010','REGULAR STRENGTH',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3215') +('0003927822010','EXTRA STRENGTH',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3216') +('0003927831510','ULTRA STRENGTH',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3217') +('0003927832200','TIGER BALM PATCHES',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3218') +('0003943510202','RENNET, LIQUID VEGETARIAN',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3219') +('0003949600108','PURPLE HAZE CYPRESS GROVE',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-10-18 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3220') +('0003963100042','BROWN RCE SNAPS,OG,ONION',3.85,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3221') +('0003963100044','BROWN RCE SNAPS,OG,VEGTBL',3.85,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3222') +('0003997800108','CEREAL,8 GRAIN,WHEATLESS',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3223') +('0003997800110','CEREAL,10 GRAIN',2.99,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3224') +('0003997800116','HOT CEREAL,GLUTEN FREE 24 OZ',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3225') +('0003997800204','PANCAKE/WAFFLE,10 GRAIN',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-11-10 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3226') +('0003997800222','CORNBREAD MIX',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3227') +('0003997800332','FLOUR,GARBANZO BEAN',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3228') +('0003997800335','FLOUR,CORN (MASA HARINA)',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3229') +('0003997800373','STEEL CUT OATS, GLUTEN FREE',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3230') +('0003997800375','OATS ROLLED GLUTEN FREE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3231') +('0003997800394','PIZZA CRUST MIX,GF',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'499','2009-04-17 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3232') +('0003997800452','FLOUR,BAKING,GLUTEN FREE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3233') +('0003997800457','FLOUR,GARBANZO/FAVA,G/F',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3234') +('0003997800462','PANCAKE MIX, GLUTEN-FREE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-11-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3235') +('0003997800525','POTATO STARCH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3237') +('0003997800539','FLOUR,TEFF',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-09-10 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3238') +('0003997800642','FLOUR,SORGHUM,G/F',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3239') +('0003997800866','FLOUR,OG,SOY',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3240') +('0003997800882','PANCAKE/WAFFLE,OG,7 GRAI',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-11-06 01:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3241') +('0003997800883','PANCAKE/WAFFLE,OG,HIGH F',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-11 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3242') +('0003997800937','FLAXSEED MEAL,OG',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3243') +('0003997800940','FLAXSEED MEAL,GOLDEN,OG',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3244') +('0003997801121','SCOTTISH OATMEAL',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3245') +('0003997801381','FLOUR,ALMOND MEAL',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3246') +('0003997802852','FLOUR,OG,WHITE WHEAT,HAR',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-03-05 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3247') +('0003997802987','FLOUR,OG WHOLE WHEAT',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-03-05 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3248') +('0003997802991','FLOUR,OG,UBLEACHED,WHITE',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-03-05 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3249') +('0003997802993','FLOUR,OG,PASTRY,WHL WHEA',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-03-05 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3250') +('0003997850103','MUESLI 18 OZ',4.45,'0',0.00,'0',3.49,NULL,3.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3251') +('0003997853300','FLOUR,WHOLE WHEAT 5#',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3252') +('0003997853301','FLOUR UN-BLEACHED WHITE 5#',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3253') +('0003997853302','FLOUR PASTRY,WHOLE WHEAT 5#',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3254') +('0004115250004','CRANBERRY SAUCE,OG,JELLY',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3255') +('0004115250006','CRANBERRY SAUCE,OG, WHOLE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3256') +('0004117838030','LIQUID LECITHIN',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','0','1','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3257') +('0004120561253','THERMOS HYDRATION BOTTLE',16.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3258') +('0004120563645','THERMOS FOOGO SIPPY CUP SS BL',16.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-19 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3259') +('0004120563649','THERMOS FOOGO SIPPY CUP SS PK',16.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-19 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3260') +('0004122462000','LINGONBERRIES',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2008-04-18 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3261') +('0004124400009','APPLE JUICE 10OZ',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3262') +('0004124400152','APPLE JUICE',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3263') +('0004124441282','JUICE, APPLE GALLON MART',13.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3264') +('0004140901638','PCARAMEL DIP',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','1','1','0',0,'1051','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3266') +('0004150706580','SLIPPERY ELM REG LOZ 24',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3267') +('0004150706590','SLIPPERY ELM CHRRY LOZ 24',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3268') +('0004150706600','SLIP ELM ROSEHIPS/C TANG',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3269') +('0004150707003','WITCH HAZEL,ROSE ALC FREE',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3270') +('0004150707005','WITCH HAZEL,TONER,ALCH FR',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3271') +('0004150880000','MINERAL WATER SAN PEL 1LITER',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3272') +('0004150880060','SPARKLING,ARANCIATA, SINGLE',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-05-14 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3273') +('0004150880064','SPARKLING LIMONATA, SINGLE',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-05-14 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3274') +('0004150880070','SPARKLING,ARANCIATA',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3275') +('0004150880074','SPARKLING,LIMONATA CANS',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-04-10 12:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3276') +('0004157004426','THIN CRACKERS,ALMOND NUT',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1565','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3277') +('0004157004427','THIN CRACKERS,HAZELNUT',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1565','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3278') +('0004157004428','THIN CRACKERS,PECAN NUT',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1565','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3279') +('0004157004431','THIN CRACKERS,SMOKEHOUSE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1565','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3280') +('0004157005401','THIN CRACKERS, CHED CHEESE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1565','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3281') +('0004157005404','THIN CRACKERS, CNTRY RANCH',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1565','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3282') +('0004157005413','ALMOND BREEZE,ORIG,UNSWTD',1.99,'0',0.00,'0',0.00,'0',1.99,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1559','2009-09-24 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3283') +('0004157005416','ALMOND BREEZE VAN UNSWTD',2.79,'0',0.00,'0',1.99,'0',1.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2009-04-09 07:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3284') +('0004157005617','ALMOND BREEZE ORIGINAL 64OZ',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-07-14 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3285') +('0004157005621','ALMOND BREEZE VAN 64OZ',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-07-14 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3286') +('0004157005625','ALMOND BREEZE CHOC 64OZ',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'499','2009-07-14 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3287') +('0004157006827','ALMOND BREEZE,ORIGINAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1559','2009-09-24 03:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3288') +('0004157006836','ALMOND BREEZE,VANILLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1559','2009-09-24 03:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3289') +('0004157006837','ALMOND BREEZE,CHOCOLATE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1559','2009-09-24 03:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3290') +('0004161700225','BAKING PWDR (NO ALUMINUM)',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3291') +('0004161700285','CORN STARCH',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3292') +('0004164807800','BTM,SOY ORIGINAL',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3293') +('0004165301203','CEREAL,OG,CRSPY BRN RC,GF 10 O',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3295') +('0004165301207','CEREAL,OG,COCO CRSP BRN',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-06-19 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3296') +('0004165345674','CEREAL,UNCLE SAM W/BERRIE',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3297') +('0004166000292','PICKLE RELISH, OG SWEET',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-10-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3298') +('0004166000296','PICKLES OG BB KOSHER DILL',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-07-17 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3299') +('0004166000297','PICKLES OG KOSHER DILL',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-07-17 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3300') +('0004166000298','PICKLES KOSHER DILL SPEARS',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-07-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3301') +('0004166000299','PICKLES OG KOSHER DILL SLICES',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-07-16 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3302') +('0004167902233','BAKING POWDER,LOW SALT',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-08-06 09:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3303') +('0004175700108','BABY BEL MINI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-12-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3304') +('0004175700109','BABYBEL ORIGINAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-12-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3305') +('0004175700119','BABYBEL MILD CHEDDAR',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-12-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3306') +('0004195400005','ZAND ORG CRAN RASP LOZ',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3307') +('0004195400006','ZAND ORG TROP LOZ',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3308') +('0004195400007','HERBALOZENG,OG,LEMN HONEY',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3309') +('0004195400008','HERBALOZENG,OG,BLU-BERRIE',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3310') +('0004195400009','HERBALOZENGE,ELDBRY ZINC',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3311') +('0004195400010','ZAND GREEN TEA LOZENGES',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-07 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3312') +('0004195400011','HERBALOZENGE,MENTHOL',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3313') +('0004195400012','HERBALOZENGE,VIT C ORANGE',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3314') +('0004195400013','HRBLOZ LEM-ZINC S#978262',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3315') +('0004195400014','HERBALOZENGE,ECH ZNC CHRY',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3316') +('0004195400021','HERBALOZENGE,MENTHOL,DSP',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3317') +('0004195400022','ZAND VIT C LOZ',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-25 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3318') +('0004195400023','HERBALOZENGE,LMN ZINC,DSP',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3319') +('0004195400024','HERBALOZ,CHERRY ECH ZINC',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-11-28 01:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3320') +('0004195400025','HERBALOZENGE,ELD ZINC,DSP',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3321') +('0004195400026','ZAND GREEN TEA LOZENGES',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-25 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3322') +('0004195401067','THROAT SPRAY',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3324') +('0004195401075','ZAND THROAT SPRAY ORGANIC',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3325') +('0004195402083','CLEANSING LAXATIVE',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3326') +('0004195402093','QUICK DIGEST',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3327') +('0004210270695','PMUSHROOM OYSTER PKG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'965','2007-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3328') +('0004217519850','SODA,CHERRY VANILLA CREME',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3329') +('0004217519860','SODA,GRAPEFRUIT',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3330') +('0004217519865','SODA,NATURAL COLA',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3331') +('0004217519870','SODA,NATURAL ROOT BEER',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3332') +('0004217519875','SODA,RASPBERRY',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3333') +('0004217519884','SODA,DR. BECKER',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3334') +('0004217519885','SODA, NATURAL GRAPE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3335') +('0004217519890','SODA,JAMAICAN GINGER ALE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3336') +('0004217519895','SODA,BLACK CHERRY',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3337') +('0004217519896','SODA,NATURAL CREAM',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'2503','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3338') +('0004225100011','WILD MUSHROOM PATE ALEXIAN',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3339') +('0004225100021','SM SALMON MOUSSE ALEXIAN',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3340') +('0004225100024','MUSH PATE VEGAN ALEXIAN',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3341') +('0004225100045','CURRY BELL PEPPER PATE ALEXIAN',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3342') +('0004227200010','BURGER,OG,CALIFORNIA,VEG',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3343') +('0004227200012','BURGER,OG,CHEDDAR VEGGIE',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3344') +('0004227200014','BURGER,OG,TEXAS VEG,LF',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3345') +('0004227200015','BURGER,OG,AMERICAN,VEG',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3346') +('0004227200020','POT PIE,OG,VEGETABLE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3347') +('0004227200021','POT PIE,OG,BROCC & CHEESE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3348') +('0004227200022','AMYS TAMALE POT PIE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3349') +('0004227200023','POT PIE,OG,SHEPARDS',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3350') +('0004227200026','POT PIE,OG,VEG,N/D,VEGAN',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3351') +('0004227200030','MACARONI & CHEESE,OG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3352') +('0004227200032','LASAGNA,OG,VEGETABLE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3353') +('0004227200035','LASAGNA,OG,CHEESE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3354') +('0004227200040','MACARONI & SOY CHEESE,OG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3355') +('0004227200041','LASAGNA,GARDEN VEG, OG,G',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3356') +('0004227200045','MACARONI & CHEESE,OG,RICE',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3357') +('0004227200047','AMYS TERIYAKI WRAP',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-05-29 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3358') +('0004227200051','WHL MEAL,OG,ENCH B/BN G/',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3359') +('0004227200054','BREAKFAST,TOFU SCRAMBLE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3360') +('0004227200055','WHL MEAL,OG,SO CORNBREAD',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3361') +('0004227200056','BREAKFST,OG,TOFU RANCHER',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3362') +('0004227200057','WHL MEAL,OG,CHS ENCHILADA',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3363') +('0004227200059','WHL MEAL,OG,PALAK PANEER',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3364') +('0004227200070','BURRITO,OG,BEANS&RICE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3365') +('0004227200071','BURRITO,OG,BEAN/RICE/CHS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3366') +('0004227200072','BURRITO,OG,BREAKFAST',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3367') +('0004227200073','BURRITO,OG,BLK BN VEGGIE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3368') +('0004227200074','BURRITO,OG,ESPECIAL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3369') +('0004227200075','PCKT SAND,OG,CHEESE PIZZA',2.69,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3370') +('0004227200076','BURRITO,SOUTHWESTERN',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3371') +('0004227200080','ENCHILADA,OG,CHEESE',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3372') +('0004227200081','ENCHILADA,OG,BLACK BN VEG',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3373') +('0004227200093','PCKT SAND,OG,SPINACH PIE',2.69,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3374') +('0004227200095','PCKT SAND,OG,VEG POT PIE',2.69,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3375') +('0004227200100','PIZZA,OG,CHEESE,RICE CRST',9.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3376') +('0004227200101','PIZZA,OG,CHEESE',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3377') +('0004227200102','PIZZA,OG,SPINACH FETA',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3378') +('0004227200103','PIZZA,OG,RSTD VEG,W/O CHS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3379') +('0004227200104','PIZZA,OG,PESTO W/TOM&BROC',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3380') +('0004227200105','PIZZA,OG,SOY CHEESE',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3381') +('0004227200109','PIZZA,OG,MUSHROOM & OLIVE',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'mixmatchcode','2009-03-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3382') +('0004227200116','PCKT SAND,OG,TOFU SCRAMB',2.69,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3383') +('0004227200121','SNACKS,OG,CHEESE PIZZA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3384') +('0004227200123','SNACKS,OG,NACHO',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3385') +('0004227200124','SNACKS,OG,SPINACH PIZZA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3386') +('0004227200130','STIR FRY,OG,ASN NOODL G/',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3387') +('0004227200161','BOWL,OG,BRWN RICE&VEG G/',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3388') +('0004227200162','BOWL,OG,COUNTRY CHEDDAR',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3389') +('0004227200163','BOWL,OG,MEXICAN CASSEROL',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3390') +('0004227200164','BOWL,OG,BROWN RIC&BLK-EY',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3391') +('0004227200165','RAVIOLI,OG,CHESE W/SC BW',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3392') +('0004227200168','BOWL,OG,TORT CASS&BLK BN',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3393') +('0004227200176','BOWL,OG,PESTO TORTELLINI',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3394') +('0004227200187','SS PIZZA,OG,MARGHERITA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3395') +('0004227200190','PIZZA,OG,CHESE&PESTO W/W',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3396') +('0004227200191','AMYS THREE CHEESE PIZZA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-06-10 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3397') +('0004227200193','PIZZA,OG,RCE CRST,SPN G/',9.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-03-11 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3398') +('0004227200194','AMYS SS CHEESE PIZZA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3399') +('0004227200195','AMYS SS SPINACH PIZZA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3400') +('0004227200196','SS PIZZA,OG,RSTD VEG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3401') +('0004227200197','AMYS SS PESTO PIZZA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3402') +('0004227200198','SS PIZZA,OG,MSHROOM&OLIV',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3403') +('0004227200199','AMYS MARGHERITA PIZZA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-06-10 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3404') +('0004227200240','L/S LASAGNA,OG,VEGETABLE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3405') +('0004227200241','L/S ENCHILADA,OG,BLK BEAN',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3406') +('0004227200259','SS PIZZA,OG,L/S,SPINACH',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3407') +('0004227200260','SAMOSA WRAP,OG',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3408') +('0004227200269','TAMALE VERDE,OG,BLK BEAN',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3409') +('0004227200278','TAMALE VERDE,OG,CHEESE',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-11 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3410') +('0004227200400','SALSA,OG,MEDIUM',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1506','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3411') +('0004227200401','SALSA,OG,MILD',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1506','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3412') +('0004227200501','SOUP,OG,CRM OF TOMATO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3413') +('0004227200502','SOUP,OG,LENTIL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3414') +('0004227200503','SOUP,LF,NO CHICKEN NOODLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3415') +('0004227200504','SOUP,OG,BLACK BEAN,LF',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3416') +('0004227200506','SOUP,OG,CRM OF MUSHROOM',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3417') +('0004227200507','SOUP,OG,MINESTRONE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-02-10 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3418') +('0004227200508','SOUP,OG,VEG BARLEY,LF',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-02-10 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3419') +('0004227200511','CHILI,OG,MEDIUM,W/VEGGIES',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1502','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3420') +('0004227200512','CHILI,OG,SPICY',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1502','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3421') +('0004227200513','SOUP THAI COCONUT',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3422') +('0004227200514','SOUP,OG,ALPHABET 14.1 OZ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3423') +('0004227200517','BEANS,OG,BAKED,VEGETARIAN',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3424') +('0004227200530','CHILI,OG,MEDIUM,BLK BEAN 14.7',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1502','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3425') +('0004227200535','SOUP,OG,LENTIL VEGETABLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3426') +('0004227200536','SOUP,OG,CHUNKY TOMATO BSQ',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-02-10 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3427') +('0004227200547','SOUP,OG,FIRE RTD SW VEG 14.3 O',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3428') +('0004227200550','BEANS,OG,REFRIED',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1501','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3429') +('0004227200551','BEANS,OG,REFRIED,BLACK',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1501','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3430') +('0004227200552','BEANS,OG,REFRIED,W/GR CHL',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1501','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3431') +('0004227200558','BEANS,OG,REFRIED,BLK,LS',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-07-22 09:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3432') +('0004227200561','SOUP,OG,CURRIED LENTIL',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3433') +('0004227200562','SOUP,OG,SUMMER CORN & VE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3434') +('0004227200580','SOUP,OG,L/S,BTTRNUT SQSH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3435') +('0004227200581','SOUP,OG,L/S,CRM OF TOMATO 14.5',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3436') +('0004227200582','SOUP,OG,L/S,LENTIL VEGTL 14.5',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3437') +('0004227200586','SOUP, L/S TOMATO BISQUE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1515','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3438') +('0004227200589','BEANS,OG,REFRIED,TRAD,LS',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3439') +('0004240004913','CEREAL HNY&NUT TOASTY O',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3440') +('0004240006431','CEREAL, OATS HONEY BLEND',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3441') +('0004251543501','BREWERS YEAST',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3442') +('0004251543514','LECITHIN',24.99,'0',0.00,'0',15.99,'0',15.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3443') +('0004256300220','FISH FILLET,WW BREADING',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3444') +('0004256300225','FISH STICKS,WW BREADING',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3445') +('0004256300300','PREM ALSKN PNK SALMON,SLT',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3446') +('0004256300600','TUNA,YELLOWFIN,CHNK LT,SL',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3447') +('0004256300605','TUNA,YELLOWFIN,CHNK LT,NS',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3448') +('0004256300712','CHOPPED CLAMS',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2007-11-09 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3449') +('0004256300743','TOMATO KETCHUP,OG,UP/DWN',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3450') +('0004256300763','FRZ,OG,MANGOS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3451') +('0004256300775','TUNA, WHITE ALBACORE,SALTD',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3452') +('0004256300776','TUNA,WHITE ALBACORE, N/S',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3453') +('0004256300781','TUNA,CHK LGT TONGOL,N/S',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3454') +('0004256300782','TUNA,CHK LGT TONGOL,SALTD',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3455') +('0004256300788','WOODSTOCK TROPICAL BLEND',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3456') +('0004256301243','WHITE CORN',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3457') +('0004256301244','LIMA BEANS',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3458') +('0004260812519','JUICE,OG,POMEGRANATE HH 12.5 O',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3459') +('0004260812521','JUICE.OG,POMEGRNT W/BLBRY',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3460') +('0004260812587','LIGHT LEMONADE 12OZ',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3461') +('0004260843202','JUICE,OG,PURE CARROT',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-04-28 12:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3462') +('0004260845905','JUICE,OG,PURE PINEAPPLE 32 OZ',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3463') +('0004260845910','JUICE,OG,CRANBERRY BLEND 32 OZ',5.15,'0',0.00,'0',3.39,NULL,3.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3464') +('0004260845975','JUICE,OG,PURE PINK GRPFRT 32 O',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3465') +('0004260845977','JUICE,OG,RED TART CHY BLD 32 O',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3466') +('0004260846001','LEMONADE, OG',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3467') +('0004260846002','LEMONADE OG CRANBERRY',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3468') +('0004260846073','JUICE, MANGOSTEEN',20.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3469') +('0004260847019','JUICE,OG,POMEGRANATE HH 32 OZ',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3470') +('0004260847021','JUICE, OG, POMEGRNT W/ BLBRY',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3471') +('0004260847033','JUICE,OG,HH, POMGRN W/ ACAI',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3472') +('0004265800510','PEGGROLL SKINS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1141','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3475') +('0004281799750','PPOTATO BAG RED 5#',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3476') +('0004318200070','POTATOES, OG, MASHD, HMSTYLE',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-11-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3477') +('0004318200071','POTATOES, OG, MASHD, RSTD GAR',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-11-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3478') +('0004318200091','MISO CUP,OG, RDCD SODIUM',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3479') +('0004318200092','MISO CUP, TRAD W/ TOFU',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3480') +('0004318200208','COCONUT MILK,OG',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3481') +('0004318200209','COCONUT MILK,OG,LIGHT',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3482') +('0004318200352','ICE CREAM CONES,GF',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','186','0','0','1','0',0,'0','2009-06-19 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3483') +('0004318200355','ICE CREAM CONES, OG',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','186','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3484') +('0004318200357','ICE CREAM SUGAR CONES, OG',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','186','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3485') +('0004318200830','BABY CORN,OG,CUT',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-02-04 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3486') +('0004318200851','PINEAPPLE,OG,CHUNKS',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3487') +('0004318200852','PINEAPPLE,OG,SLICES',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3488') +('0004318200855','MANGO CHUNKS OG',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-04-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3489') +('0004318200857','TROPICAL FRT SALAD OG',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-04-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3490') +('0004318200859','PEACHES,OG,SLICED',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-08-26 10:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12804') +('0004318200868','MANDARIN ORANGES,OG,WHOL',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-03-20 12:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3491') +('0004318200889','ASPARAGUS SPEARS,GREEN',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3492') +('0004318200890','HEARTS OF PALM,OG',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3493') +('0004318200891','ARTICHOKE HEARTS,QUARTERD',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3494') +('0004318200894','ARTICHOKE HEARTS,MARINATE',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3495') +('0004319231550','NANCYS COTTAGE CHEESE',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3496') +('0004319240510','SOUR CREAM,OG,CULTURED',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-05 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3497') +('0004322210020','PHERB BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3498') +('0004322210040','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3499') +('0004322210050','PHERB OREGANO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'924','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3500') +('0004322210060','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3501') +('0004322210070','PHERB TARRAGON',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'937','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3502') +('0004322210095','PHERB MARJORAM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'919','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3503') +('0004322210100','PHERB SAGE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'931','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3504') +('0004322210110','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3505') +('0004322210150','PHERB POULTRY MIX',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'929','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3506') +('0004322210200','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3507') +('0004345402050','TEMPEH,OG,STRIP(FAK BACN)',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3508') +('0004345403050','TEMPEH,OG,SOY,ORIGINAL',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3509') +('0004345409010','TEMPEH,OG,GARDEN VEGGIE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3510') +('0004345410020','FF SMART DELI SLC,TURKEY',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3511') +('0004345410030','FF SMART DELI SLC,BOLOGNA',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3512') +('0004345410062','LIGHTLIFE ITALIAN SAUSAGE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3513') +('0004345410065','LIGHTLIFE CHORIZO SAUSAGE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3514') +('0004345410070','FF SMART DELI SLC,HAM',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3515') +('0004345410080','SMART DOG,FAT FREE',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3516') +('0004345410104','SMART BACON',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3517') +('0004345440010','GIMME LEAN,SAUSAGE STYLE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3518') +('0004345440020','GIMME LEAN,BEEF STYLE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3519') +('0004408253031','SUNFLOWER BUTTER,OG,SMOOTH',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3520') +('0004432530100','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3521') +('0004432530200','PMUSHROOM PORTABELLA PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3522') +('0004504803322','BATHROOM CLEANER,NATURAL 16 OZ',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3523') +('0004525511449','EGG ROLL WRAPS',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','1',0,'1141','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3524') +('0004525511969','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3525') +('0004525511977','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3526') +('0004525512164','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3527') +('0004525512220','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3528') +('0004529608131','LISANATTI SHREDDED SOY CHEDDAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3529') +('0004529608132','LISANATTI SHREDDED MOZZARELLA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3530') +('0004529619101','LISANATTI ALMOND CHEDDAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3531') +('0004529619102','LISANATTI ALMOND MOZZARELLA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3532') +('0004529619104','ALMOND CHEESE P JACK',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','2','1','0',0,'0','2008-02-13 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3533') +('0004529619136','SOYSATION MOZZ STYLE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-06-30 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3534') +('0004529619992','LISANATTI RICE CHS MOZZARELLA',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-07 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3535') +('0004529619993','LISANATTI RICE PEPPERJACK',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-08 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3536') +('0004529619994','RICE CHEESE CHEDDAR LISANATTI',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-08-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3537') +('0004529619995','RICE MOZZ LISANATTI',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2009-01-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3538') +('0004529619996','LISANATTI RICE P JACK',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-01-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3539') +('0004631451112','ECO TOWEL',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-27 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3541') +('0004635200100','YERBA PRIMA WOMENS CLEANSE',33.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3543') +('0004635200115','YERBA PRIMA MENS CLEANSE',33.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3544') +('0004635200199','YP DAILY FIBER CAPS 180CT',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-07-17 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3545') +('0004635200200','YERBA PRIMA DAILY FIBER',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3546') +('0004635200519','GREAT PLAINS DETOX',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3547') +('0004698500101','SUPER LYSINE CREAM',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3548') +('0004698500110','QH SUPERLYSINE 90CT',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3549') +('0004698500111','QH SUPER LYSINE 180CT',20.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3550') +('0004698500310','QUANTUM MIGRALIEF',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3551') +('0004698501606','QUANTUM BUZZ AWAY SPRAY',9.99,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3552') +('0004698501625','QH ELDERBERRY 2OZ',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3553') +('0004698501626','COLDSTICK W/ SUPER LYSINE',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3554') +('0004698501786','CANKER CARE GEL',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3555') +('0004698550991','QUANTUM BUZZ AWAY SPRAY 2OZ',5.95,'0',0.00,'0',3.55,'0',3.55,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3557') +('0004698550993','QUANTUM STING SOOTHE',6.15,'0',0.00,'0',3.65,'0',3.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3558') +('0004698550994','QUANTUM ITCH NIX 4 OZ',6.65,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3559') +('0004698550995','QUANTUM BUZZ AWAY LOTION SPF15',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3560') +('0004728523456','PONION PEARL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3561') +('0004728523459','PONION PEARL WHITE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3562') +('0004728523469','PONION PEARL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3563') +('0004728523479','PONION PEARL BAG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3564') +('0004744591911','TEA,OG,OOLONG 16 CT',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-12-04 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3565') +('0004744591912','TEA,OG,DARJEELING 16 CT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3566') +('0004744591921','TEA,OG,GRN JAPANESE PREM 16 CT',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3567') +('0004744591922','TEA,OG,BLACK 16 CT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3568') +('0004744591923','TEA,OG,GRN JASMINE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-12-04 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3569') +('0004744591942','TEA,OG,CHAMOMILE',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3570') +('0004744591943','TEA,OG,ROOIBOS RED BUSH',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3571') +('0004744591961','TEA,OG,PEPPERMINT HERB',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3572') +('0004744591963','TEA,OG,RUSSIAN CARAVAN 16 CT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3573') +('0004744591971','TEA,OG,EARL GREY',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3574') +('0004744591991','TEA,OG,EARL GREY,DECAF 16 CT',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3575') +('0004744591992','TEA,OG,BREAKFAST,IRISH 16 CT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1584','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3576') +('0004744598201','TEA,OG,GREEN W/PEACH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3577') +('0004744598203','TEA,OG,LIQUORICE PEPPRMNT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3578') +('0004744598204','TEA,OG,NORTHWEST BLACKBRY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3579') +('0004746904512','NATROL HYALURONIC ACID 30 CT',17.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3580') +('0004840401895','PSEEDS THAI LETTUCE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3581') +('0004840404448','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'555','2007-09-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3582') +('0004848100541','TURKEY GROUND,FREE RANGE',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-15 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3583') +('0004848100979','TURKEY SAUSAGE PATTIES',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-02 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3584') +('0004848100981','TURKEY BREAKFAST SAUSAGE',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-02 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3585') +('0004848100983','TURKEY ITALIAN SAUSAGE',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-02 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3586') +('0004848100990','TURKEY FRANKS,SMOKED',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-03-11 08:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3587') +('0004848100991','TURKEY FRANKS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3588') +('0004848100993','CHICKEN FRANKS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'3589') +('0004848101102','CHILI,TURKEY,SPICY,W/BEAN',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3590') +('0004848101111','CHILI,CHICKEN,MILD,W/BEAN',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3591') +('0004848101121','CHICKEN BROTH,SALT&SPICES',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2007-09-19 02:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3592') +('0004848101122','CHICKEN BROTH,FF L/S',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2007-09-19 02:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3593') +('0004848101191','TURKEY STICKS',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3594') +('0004857281101','SLICED SWISS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-03-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3595') +('0004868510108','BABY SHAMPOO,PANSY FLOWER',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3596') +('0004868510109','MOIST/COND,CAMOMILE BLSSM',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3597') +('0004868550102','BABY LOTION,SWEET VIOLET',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3598') +('0004868560108','BABY BATH SOAP,HONEYSUCKL',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3599') +('0004868720206','PNUT PEANUT RS SHELL 1#',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1080','2009-02-04 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3600') +('0004875390110','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3601') +('0004875390125','PBAPPLE BAG GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3602') +('0004905600103','JR LIGGETT TRAVEL KIT',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3603') +('0004905610201','BAR SHAMPOO,ORIG FORMULA',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3604') +('0004905611106','JR LIGGETTS SHAVING FOAM',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3605') +('0004934708008','SMILE BUNNIES CHILDS 1ST BRUSH',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3606') +('0004934708009','THBRSH,TRAVEL NYL',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3607') +('0004934708010','THBRSH,V-WAVE REPLC,NYL',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3608') +('0004934708014','THBRSH HEAD,V-WAVE NYL',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3609') +('0004947902514','FUTUREBIOTICS ESTROCOMFORT',18.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3612') +('0004950210000','PHILS LARGE EGGS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3613') +('0004950220000','PHILS EX LARGE EGGS',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3614') +('0004956801016','VEGENAISE,ORIG DAIRY FREE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-02-27 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3615') +('0004956818016','VEGENAISE,OG',5.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3617') +('0004956850010','VEGAN GOURMET MONTEREY JACK',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3618') +('0004956852010','Vegan Gourmet Mozz alternativ',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-04-23 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3619') +('0004956853010','VEGAN GOURMET CHEDDAR',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3620') +('0004956855016','FOLLOW YOUR HEART SOUR CREAM',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3621') +('0005052548196','BLUE PEARL CITRONELLE STICKS',2.89,'0',0.00,'0',1.69,'0',1.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','103','0','1','0','0',0,'0','2008-06-12 02:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3622') +('0005070027748','VINEGAR WHITE GALLON',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2009-08-27 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12821') +('0005137611101','CEREAL,NUTTY RICE 12 OZ',3.65,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3623') +('0005137611151','CEREAL,NUTTY FLAX 12 OZ',3.85,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3624') +('0005138188260','AURA CACIA BBATH LAVENDER',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2007-08-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3625') +('0005138188261','AURA CACIA BBATH TRANQUILITY',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2007-08-09 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3626') +('0005138188262','AURA CACIA BBATH SOOTH HEAT',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2007-08-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3627') +('0005138188263','AURA CACIA BBATH HEART SONG',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2007-08-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3628') +('0005138188511','MNRL BTH,EUPHR S#682450',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3629') +('0005138188515','MNRL BTH,STHNG HT S682591',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3630') +('0005138188517','MINERAL BATH,HEARTSONG',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3631') +('0005138188519','MINERAL BATH,TRANQUILITY',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3632') +('0005138188595','AURA CACIA KIDS FOAMBATH CHEER',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3633') +('0005138188596','AURA CACIA KIDS FOAM BATH CALM',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3634') +('0005138188597','AURA CACIA KIDS FOAMBATH CLEAR',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3635') +('0005138188616','MNRL BTH,LVNDR S#682534',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3636') +('0005138188722','AURA CACIA ELECTRIC LIMEFRESHN',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12926') +('0005138188723','AURA CACIA ELECTRIC LAV FRESHN',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12925') +('0005138188742','AURA CACIA LIME REFILL',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12928') +('0005138188743','AURA CACIA LAV REFILL',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12927') +('0005138190607','OIL,OG,SWEET ALMOND',12.95,'0',0.00,'0',9.99,NULL,9.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3637') +('0005138190608','OIL,OG,JOJOBA',14.49,'0',0.00,'0',10.99,NULL,10.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3638') +('0005138190609','OIL,OG,SESAME',6.65,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3639') +('0005138190610','OIL,OG,APRICOT KERNEL',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3640') +('0005138191105','ESSENTIAL OIL,BERGAMOT FR',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3641') +('0005138191108','ESSENTIAL OIL,CEDARWOOD',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3642') +('0005138191109','ESSENTIAL OIL,CHAMOMILE',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3643') +('0005138191111','ESSENTIAL OIL,CINN LEAF',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3644') +('0005138191112','ESSENTIAL OIL,CITRONELLA',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2006-09-20 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3645') +('0005138191113','ESSENTIAL OIL,CLARY SAGE',12.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3646') +('0005138191114','ESSENTIAL OIL,CLOVE BUD',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3647') +('0005138191115','ESSENTIAL OIL,CYPRESS',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3648') +('0005138191116','ESSENTIAL OIL,EUCALYPTUS',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3649') +('0005138191119','ESSENTIAL OIL,FRANKINCNSE',26.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3650') +('0005138191120','ESSENTIAL OIL,GERANIUM',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3651') +('0005138191121','ESSENTIAL OIL,GINGER',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3652') +('0005138191122','ESSENTIAL OIL,JUNIPER BRY',15.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3653') +('0005138191123','ESSENTIAL OIL,LAVENDER',9.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3654') +('0005138191124','ESSENTIAL OIL,LEMON',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3655') +('0005138191125','ESSENTIAL OIL,LEMONGRASS',6.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3656') +('0005138191126','ESSENTIAL OIL,LIME',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3657') +('0005138191128','ESSENTIAL OIL,MYRRH',21.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3658') +('0005138191129','ESSENTIAL OIL,SWT ORANGE',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3659') +('0005138191130','ESSENTIAL OIL,PATCHOULI',14.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3660') +('0005138191132','ESSENTIAL OIL,PEPPERMINT',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3661') +('0005138191133','ESSENTIAL OIL,ROSEMARY',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3662') +('0005138191134','ESSENTIAL OIL,ROSEWOOD',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3663') +('0005138191135','ESSENTIAL OIL,SAGE',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3664') +('0005138191136','ESSENTIAL OIL,SANDALWOOD',48.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3665') +('0005138191137','ESSENTIAL OIL,SPEARMINT',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3666') +('0005138191138','ESSENTIAL OIL,TANGERINE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3667') +('0005138191139','ESSENTIAL OIL,TEA TREE',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3668') +('0005138191140','AURA C ESSENTIAL OIL,RED THYME',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3669') +('0005138191142','ESSENTIAL OIL,WINTERGREEN',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3670') +('0005138191143','ESSENTIAL OIL,YLNGYLG,III',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3671') +('0005138191159','ESSENTIAL OIL,GRAPEFRUIT',9.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3672') +('0005138191161','ESSENTIAL OIL,NUTMEG',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3673') +('0005138191171','OIL,GRAPESEED',4.75,'0',0.00,'0',3.69,NULL,3.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3674') +('0005138191172','OIL,JOJOBA',12.79,'0',0.00,'0',9.99,NULL,9.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2007-08-17 12:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3675') +('0005138191183','AURA CACIA EUC 2 OZ.',16.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3676') +('0005138191184','AURA CACIA LAVENDER 2 OZ',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12952') +('0005138191189','AURA CACIA PEPPERMINT 2 OZ',23.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12951') +('0005138191192','AURA CACIA TEA TREE 2 OZ',24.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12953') +('0005138191198','VEG MASSAGE OIL,SESAME',4.75,'0',0.00,'0',3.69,NULL,3.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3677') +('0005138191231','PREC ESSN,VANL W/JOJOBA',20.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3678') +('0005138191294','ESSENTIAL OIL,PINE',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2006-09-20 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3679') +('0005138191304','AURA CACIA ROOM DIFFUSER',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12933') +('0005138191310','AURA CACIA ATOMIZER',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12930') +('0005138191314','AURA CACIA CAR DIFFUSER',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12937') +('0005138191315','AURA CACIA DIFFUSER REFILL PK',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12929') +('0005138191332','AURA CACIA TEAL CANDLE LAMP',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12936') +('0005138191333','AURA CACIA OLIVE CANDLE LAMP',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12935') +('0005138191334','AURA CACIA CHOC CANDLE LAMP',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12934') +('0005138191606','AURA CACIA CERAMIC LAMP RING',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12931') +('0005165109221','PEANUT BTR, CREAMY, NO STIR',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3682') +('0005165109223','PEANUT BUTTER, CRNCHY, NO STIR',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3683') +('0005165109232','PEANUT BTR,OG,CREAMY,SLT',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3684') +('0005165109233','PEANUT BTR,OG,CRNCHY,SLT',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'mixmatchcode','2009-04-03 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3685') +('0005165109235','PEANUT BUTTER OG CRMYNOSTIR',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3686') +('0005165109236','PEANUT BUTTER OG CRNCHNOSTIR',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3687') +('0005165109361','ALMD BUTTER,HNY,CRMY,SLT 12 OZ',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3688') +('0005197204100','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3689') +('0005201016005','PPOTATO BAG WHITE',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'989','2007-10-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3690') +('0005215900001','YOGURT,OG,WM,PLAIN',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3691') +('0005215900002','YOGURT,OG,WM,FRENCH VAN',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3692') +('0005215900006','STONY FF PLAIN 32OZ',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3693') +('0005215900007','YOGURT,FF,FRENCH VANILLA',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3694') +('0005215900011','YOGURT,OG,BANILLA,LF,KIDS',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3695') +('0005215900013','YOGURT,OG,STRWBRY,LF,KIDS',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3696') +('0005215900065','STONY FF YGRT POM BERRY OG',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-06-30 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3702') +('0005215900201','FRZN YGRT,OG,NF,VANILLA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3704') +('0005215900202','FRZN YGRT,OG,NF,DK CHOCO',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3705') +('0005215900204','FRZN YGRT,OG,NF,RASPBERRY',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3706') +('0005215900210','FRZN YGRT,OG,NF,VAN FUDGE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3707') +('0005215900215','STNYFLD JAVALANCHE FRZN YGRT',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-02-16 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3708') +('0005215900464','YOGURT,OG,WM,FRENCH VAN',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3710') +('0005215900466','YOGURT,OG,WM,VAN TRUFFLE',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3711') +('0005215900468','YOGURT,OG,WM,STWBRY&CREAM',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3712') +('0005215900520','YOGURT,OG,LF,VANILLA',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3713') +('0005215901301','SMOOTHIE,OG,RASPBERRY',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2007-04-24 05:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3714') +('0005215901302','SMOOTHIE,OG,PEACH',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2007-04-24 05:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3715') +('0005215901303','SMOOTHIE,OG,TROP BANANA',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2007-12-26 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3716') +('0005215901307','SMOOTHIE,OG,WILD BERRY',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2007-04-24 05:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3717') +('0005215901308','SMOOTHIE,VANILLA',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2007-04-24 05:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3718') +('0005215902100','I CREAM,OG,VANILLA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3719') +('0005215902101','I CREAM,OG,CHOCOLATE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3720') +('0005215902102','I CREAM,OG,JAVALANCHE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3721') +('0005215902105','I CREAM,OG,CHOC RASPBERRY',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3722') +('0005215902108','I CREAM,OG,CREME CARAMEL',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3723') +('0005215904000','YOGURT,OG,LF,PLAIN 6OZ',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'499','2009-08-24 12:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3724') +('0005215904001','STONY LF YGRT BLUEBERRY 6OZ',1.19,'0',0.00,'0',0.79,'0',0.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2009-08-06 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3725') +('0005215904003','YOGURT,OG,LF,MOCHA LATTE',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3726') +('0005215904005','YOGURT,OG,LF,RASPBERRY',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3727') +('0005215904006','YOGURT,OG,LF,STRAWBERRY',1.19,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-03-26 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3728') +('0005215905000','YOGURT,OG,LF,PLAIN',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3729') +('0005215909003','YOGURT, KIDS PK, STR BANANA',3.99,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2006-11-14 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3730') +('0005215909004','YGRT,OG,STWBY-VAN&RSP,SGR',3.99,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2006-06-20 05:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3731') +('0005215950015','STONY LF YGRT BLUEBERRY 32',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-07-29 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3732') +('0005215953101','OIKOS VAN 0% OG YOGURT',2.39,'0',0.00,'0',1.89,'0',1.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2009-04-09 09:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3733') +('0005215953102','OIKOS HONEY 0% OG YOGURT',2.39,'0',0.00,'0',1.89,'0',1.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2009-04-09 09:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3734') +('0005215953103','OIKOS BLBRY 0% OG YOGURT',2.39,'0',0.00,'0',1.89,'0',1.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2009-04-09 09:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3735') +('0005215954032','STONY LF YGRT STRW POM 6OZ',1.19,'0',0.00,'0',0.79,'0',0.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2009-07-29 12:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3736') +('0005233411651','3 BEAN DIP',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-02-22 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3737') +('0005233411653','EVK ORG SALSA MED',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','0','0',0,'0','2005-07-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3738') +('0005233411666','GREEN SALSA',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-02-03 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3739') +('0005233411668','BLACK BEAN DIP',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-05-20 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3740') +('0005233411670','OLIVE GARLIC HUMMUS',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-02-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3741') +('0005260304100','BROTH,OG,MUSHROOM',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1595','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3742') +('0005260304120','SOUP, OG, CREAMY TOMATO',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1563','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3743') +('0005260304180','SOUP, OG, CRMY BTRNUT SQSH',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1563','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3744') +('0005260304184','SOUP, OG, CRMY RSTD PEP',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1563','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3745') +('0005260304255','SOUP,CREAMY CSHW CRT GNG',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1563','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3746') +('0005260304279','SOUP CURRIED RED LENTIL',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1563','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3747') +('0005260304400','SOUP OG SPLIT PEA W/HAM',3.25,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'1619','2008-03-14 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3748') +('0005260304401','SOUP,OG,SPCY CHCKN FAJIT',3.25,'0',0.00,'0',2.39,'0',2.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','174','0','0','1','0',0,'0','2009-09-11 09:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12869') +('0005260304402','SOUP OG BEEF STEAK & FUSILLI',3.25,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'1619','2008-03-14 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3749') +('0005260304404','SOUP OG RSTD CHICKEN W/PENNE',3.25,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'1619','2008-03-14 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3750') +('0005260304407','SOUP OG SAVORY WHITE BEAN BACN',3.25,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'1619','2008-03-14 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3751') +('0005260305410','BROTH,OG,VEGETABLE',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1595','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3752') +('0005260305414','BROTH, OG, VEGETABLE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3753') +('0005260305425','BROTH,OG,CHICKEN',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1595','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3754') +('0005260305429','BROTH,OG,CHICKEN',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3755') +('0005260305445','BROTH,OG, CHICKEN, L SODIUM',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1595','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3756') +('0005260305450','BROTH,OG,VEGETABLE, LS',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1595','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3757') +('0005260306503','ALMOND BEV,OG,UNSWT ORIG',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2008-07-03 02:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3758') +('0005260306570','NATURALLY OAT BEV,OG,ORIG',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3759') +('0005265100005','WITCH HAZEL LIQUID',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3760') +('0005265100010','HAZELET WTCH HZL PAD',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3761') +('0005270000000','PJORDERADISH ROOT',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'940','2009-06-10 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3762') +('0005275900012','PBERRY CRANBERRY NON-O',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'733','2008-11-25 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3763') +('0005321910001','BAKED BRIE PLAIN CANTARE',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3764') +('0005322866477','PPOTATO BAG YELL FIN',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3765') +('0005341905262','BAKED BRIE APL CIN RSN BRNDY',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3766') +('0005341905275','BAKED BRIE PECAN CANTARE',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3767') +('0005341905631','MINI BRIE CRAN CANTARE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3768') +('0005341905632','MINI BRIE BERRY CANTARE',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3769') +('0005341905633','MINI BIEMUSHROOM CHIVE CANTARE',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3770') +('0005341905634','MINI BRIE PESTO PARM CANTARE',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3771') +('0005341908370','FRESH MOZZ CANTARE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-06-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3772') +('0005341957007','OLIVE TAPENADE CANTARE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3773') +('0005341958007','OLIVE FETA TOPENADE CANTARE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3774') +('0005342300006','BREAD,OG,YF,DF,SUMMER RND',6.65,'0',0.00,'0',4.79,'0',4.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3775') +('0005342300010','BREAD,OG,YF,DF,SUNFL&FLAX',6.75,'0',0.00,'0',4.79,'0',4.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3776') +('0005342300012','BREAD,OG,YF,WF,RYE,EUROPN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3777') +('0005342300020','BREAD,OG,YF,WF,DF,SPELT',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3778') +('0005342300049','BREAD,OG,YF,SPRTD HEMP',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3779') +('0005357121111','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3780') +('0005357121312','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3781') +('0005357132312','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3782') +('0005385200200','SALSA,HOT',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1535','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3783') +('0005385200300','TORTILLA STRIPS',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3784') +('0005385200400','SALSA,MEDIUM',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1535','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3785') +('0005385200500','SALSA,FIRE ROASTED GARLIC',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1535','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3786') +('0005385204742','PRADISH BAG',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1000','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3787') +('0005407606501','CAPRI FRESH MOZZ',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-02-28 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3788') +('0005413012351','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3789') +('0005431900001','YOGURT,OG,PLAIN',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3790') +('0005431900002','YOGURT,OG,VANILLA',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3791') +('0005431900003','YOGURT,OG,MAPLE',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3792') +('0005431900004','YOGURT,OG,PLAIN,LOWFT',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3793') +('0005498600082','EYE MAKEUP REMOVER',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3794') +('0005498600251','EARTH SCIENCE HERBAL DEOD',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3795') +('0005498600252','EARTH SCIENCE UNSCEN DEOD',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3796') +('0005498617400','FRAGRANCE-FREE SHAMPOO',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3797') +('0005498617410','HAIR TREATMENT SHAMPOO',7.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3798') +('0005498617430','CITRESS SHAMPOO',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3799') +('0005498617440','FRAGRANCE-FREE CONDITIONR',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3800') +('0005498617460','EARTH SCIENCE REPAIR COND',7.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3801') +('0005498627400','EARTH SCI GALLON SHAMPOO',36.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3802') +('0005498627440','EARTH SCI GALLON CONDITIONER',36.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3803') +('0005543764000','SINGLE CUP CONE FILTER',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-02-26 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3804') +('0005589116255','PPOTATO BAG YELLOW',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3805') +('0005669864522','MAG ANIMAL WELLNESS SPECIAL',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-11-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3806') +('0005669864536','MOTHERING MAG',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3807') +('0005669881379','HERBALGRAM',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3808') +('0005676214124','FONDUE EMMI',8.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3809') +('0005764600102','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3810') +('0005833617502','CAKE MIX,OG,CHOCOLATE',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'1558','2008-11-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3811') +('0005833617503','CAKE MIX,OG,MARBLE',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'1558','2008-11-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3812') +('0005833617510','BROWNIE MIX,OG,CHOCOLATE',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'1558','2008-11-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3813') +('0005833617530','COOKIE MIX,OG,CHOC CHIP',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3814') +('0005833617551','ICING MIX,OG,CHOCOLATE',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'1558','2008-11-17 10:03:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3815') +('0005833617600','PUDDING MIX CHOC DR OETKER',1.65,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3816') +('0005833617603','PUDDING MIX VANILLA DR OETKER',1.65,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3817') +('0005844941000','TSTR PASTRY,OG,FR,STWB',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3818') +('0005844941001','TSTR PASTRY,OG,FR, BLUE',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3819') +('0005844941002','TSTR PASTRY,OG,FR,APL CIN',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3820') +('0005844941008','TSTR PASTRY OG UN-FR STBY',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2009-04-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3821') +('0005844941010','TSTR PASTRY,OG,UN FR,APPLE',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3822') +('0005844941015','TOASTER PASTRY CHERRY POM',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'mixmatchcode','2009-02-09 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3823') +('0005844943000','CRISPY BAR,OG,KOALA CHOC',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3824') +('0005844943001','CRISPY BAR,OG,PANDA P BTR',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3825') +('0005844943002','CRISPY BAR,OG,CHEETAH BRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3826') +('0005844959056','FLAX PLUSWAFFLES',3.45,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','1','1','0',0,'0','2008-10-29 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3827') +('0005844959058','WAFFLES, BUCKWHT WLDBRRY',3.45,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'0','2009-02-27 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3828') +('0005844959062','WAFFLES,OG,HEMP PLUS',3.45,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3829') +('0005844960057','CEREAL,OG,CORN FLAKES,FJS',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3830') +('0005844962001','CEREAL,OG,PUFFED RICE',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2007-10-16 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3831') +('0005844962003','CEREAL,OG,PUFFED CORN',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2007-10-16 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3832') +('0005844962004','CEREAL,OG,PUFFED KAMUT',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2007-10-16 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3833') +('0005844977008','CRL,OG,MILLET RICE FLAKE',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1519','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3834') +('0005844977021','CEREAL,OG,HERITAGE FLAKES',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1519','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3835') +('0005844977050','CEREAL,OG,FLAX PLUS',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3836') +('0005844977094','CEREAL,OG,HNY CORN FLK',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1519','2009-01-09 06:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3837') +('0005844977103','CEREAL OG SMARTBRAN',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3838') +('0005844977143','FLAX PLUS,OG,MAPLE PECAN',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-06-11 12:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3839') +('0005844977700','CEREAL,OG,OPTIMUM POWER',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3840') +('0005844977901','CEREAL,OG,MESA SUNRISE FL',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1519','2009-01-09 06:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3841') +('0005844986002','GORILLA MUNCH,OG',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1592','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3842') +('0005844986003','KOALA CRISP,OG',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1592','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3843') +('0005844986004','PANDA PUFFS,OG',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1592','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3844') +('0005844986007','CEREAL,OG,LEAPIN LEMURS',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1592','2008-07-24 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3845') +('0005844987012','PANDA PUFFS OG ECO PAC',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1519','2009-01-09 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3846') +('0005844989000','GRANOLA,OG,HEMP PLUS,WF',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3847') +('0005844989007','GRANOLA,OG,FLAX PLUS W/PK 11.5',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3848') +('0005900003975','CEREAL,RED RIVER',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3849') +('0005916550200','PBERRY RASPBERRY PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3850') +('0005916550400','PBERRY BLACKBERRY PT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3851') +('0006014621026','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3852') +('0006038370958','papple bag fuji',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3853') +('0006038371785','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3854') +('0006048423101','pberry strawberry pint',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3855') +('0006058799885','EVAN HEALY POM SERUM',33.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12847') +('0006082200007','DOG,TOFU',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3856') +('0006082200008','DOG,VEGGIE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3857') +('0006082200116','VEGGIE PIZZA PEPPERONI',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3858') +('0006082200306','VEGGIE DELI SLICES,TURKEY',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3859') +('0006098821203','YOGURT STARTER,FRZ-DRIED 1 OZ',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3860') +('0006100140903','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3861') +('0006110415422','LIMBURGER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-02-25 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3862') +('0006112313001','PWATERCRESS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'679','2009-09-02 07:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'3863') +('0006163000000','One cup coffee filter',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-16 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3864') +('0006163000001','ONE CUP FILTERS',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'3865') +('0006199861434','FLORA VEGETAL SILICA 90 CT',20.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3866') +('0006199861580','FLORA UDOS CHOICE BLND 90 CT',21.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3867') +('0006199862008','BIJA DARK CHOC TRUFFLES',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3868') +('0006199863349','FLORA FLORESSENCE CREAM 1.7 OZ',31.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3869') +('0006199867980','FLORA UDOS OIL 369BLEND 8.5 OZ',18.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3870') +('0006199868310','DR DUNNER SAMBUGUARD 5.9 OZ',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3871') +('0006199868620','EFAMOL EVE PRIM OIL 3.27OZ',27.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3872') +('0006248200005','WOOLRICH GOAT MOZZARELLA',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-02 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3873') +('0006248200010','GOAT CHEDDAR',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-04-06 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3874') +('0006366835102','BATH TISSUE, WHITE 4pk',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3875') +('0006366835104','BATH TISSUE WHITE, 2PLY',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3876') +('0006366836101','PAPER TOWEL, WHITE SINGLE',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3877') +('0006366838204','FACIAL TISSUE,WHITE',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3878') +('0006385500005','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3879') +('0006385500118','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3880') +('0006385501111','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3881') +('0006535705111','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3882') +('0006535711111','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3883') +('0006535711511','PAPPLE BAG GINGERGOL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'555','2007-09-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3884') +('0006535713111','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3885') +('0006535715111','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3886') +('0006568465430','MEDIT YOGURT STRAWBERRY',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-01-18 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3887') +('0006568465431','MEDIT YOG PLUM & WALNUT',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-01-18 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3888') +('0006568465432','MEDIT YOG PCH & PASS',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-01-18 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3889') +('0006568465434','MEDIT BLACKBERRY YOGURT',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-01-18 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'3890') +('0006596505002','CHEDDAR CURDS WHITE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','71','0','0','1','0',0,'0','2009-02-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3891') +('0006621662008','pcranberries',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3892') +('0006642762000','PARISSA WAX STRIPS LEGS N BODY',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-08-07 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3893') +('0006642767000','PARISSA WAX STRIPS ASST SENS',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-06-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3894') +('0006642791000','PARISSA BODY SUGAR',11.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-02-25 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3895') +('0006646639000','COFFEE PEACE GUATEMALAN 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'3896') +('0006667646639','WAFFLE COOKIE,OG,HNY&MPLE',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3897') +('0006667662753','WAFFLE COOKIE,OG,MAPLE',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3898') +('0006668400398','PCARAMEL APPLE NON-O',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','1','1','0',0,'1051','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3899') +('0006696000000','ROASTED BANANA CHEESE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3900') +('0006726277306','SOY BLEU SUNERGIA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-04-24 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3901') +('0006727500094','CONSERVES,OG,MORELLO CHERRY',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3902') +('0006727500098','CONSERVES,OG,FOUR FRUIT',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3903') +('0006727500321','JELLY OG CONCORD GRAPE',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3904') +('0006727500322','JELLY, OG, POMEGRANATE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3905') +('0006727500650','CONSERVES, RASPBERRY 16OZ',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3906') +('0006727500651','STRAWBERRY CONSERVE, OG 18OZ',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3907') +('0006727500652','GRAPE JELLY, 18OZ',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2007-12-18 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3908') +('0006777600928','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3909') +('0006777601104','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3910') +('0006777630033','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3911') +('0006783110932','PFILLER UP BOUQUET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3912') +('0006882010205','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3913') +('0006882010210','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3914') +('0006882010213','PLETTUCE ROMAINE HEARTS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3915') +('0006882606011','TORT CHIPS,OG,YELLOW 21 OZ',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3916') +('0006882606014','TORT CHIPS,OG,RED 21 OZ',6.19,'0',0.00,'0',5.19,'0',5.19,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3917') +('0006895801242','NF B12 SUBLINGUAL 90CT',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3918') +('0006895801245','NF B12 1000MCG 60CT',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-01-09 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3919') +('0006895801272','NF FOLIC ACID 400MCG 90CT',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3920') +('0006895801324','VIT C PEACH/PASS.',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3921') +('0006895801326','NF C 500 CHEW BLUERASPBOY 90CT',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-08-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3922') +('0006895801336','VIT C MIXED FRUIT',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3923') +('0006895801342','VIT C 1000MG.',17.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-01-09 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3924') +('0006895801387','NF QUERCETIN COMPLEX',17.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3925') +('0006895801720','NF BETAINE HCL 500MG 90CT',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3926') +('0006895801735','NF BROMELAIN 500MG 90CT',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3927') +('0006895801805','DBLE STR ACIDOPHILUS 90 CT',15.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3928') +('0006895801806','DBLE STR ACIDOPHILUS 180 CT',27.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3929') +('0006895801847','12 12 PROBIOTIC',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-04 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3930') +('0006895801851','NF ULT CHILDRENS PROBIOTIC 2OZ',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-04-09 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3931') +('0006895802046','NF TONALIN CLA',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3932') +('0006895802070','NF COQ10 100MG.',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3933') +('0006895802085','NF PEPTACE 90CT',37.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12771') +('0006895802095','NF ALPHA-LIPOIC ACID 100MG',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-01-09 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3934') +('0006895802098','NF ALPHA-LIPOIC ACID 200MG',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-01-09 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3935') +('0006895802256','NF SALMON OIL',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3936') +('0006895802262','NF SALMON OIL ENTERIC COATED',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3937') +('0006895802329','GARLIC',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3938') +('0006895802377','NF LEARNING FACTORS 1 LB',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3939') +('0006895802379','NF LEARNING FACTORS WHEY',39.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12868') +('0006895802400','NF REVITALX',28.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3940') +('0006895802681','CELADRIN 90 SG.',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3941') +('0006895802696','NF MSM JOINT FORMULA',30.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3942') +('0006895802815','NF NACETYL CYSTEINE 500MG 90CT',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3943') +('0006895802926','WHEY FACTORS VANILLA',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3944') +('0006895802927','WHEY FACTORS CHOCOLATE',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3945') +('0006895802932','NF VANILLA WHEY 2LB',45.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3946') +('0006895803100','NF BEE POLLEN 90 CT',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-10 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3947') +('0006895803161','NF BEE PROPOLIS 90CT',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-10 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3948') +('0006895803184','NF ROYAL JELLY 60 CT',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-10 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3949') +('0006895803505','NF LUNG BRONCHIAL & SINUS',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3950') +('0006895803510','NF THYROID FORM',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-02 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3951') +('0006895803548','NF OMEGA 3 60 CT',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3952') +('0006895803549','NF OMEGA 3 120CT',22.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3953') +('0006895803556','NF PGX DAILY 120CT',36.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3954') +('0006895803574','NF RX OMEGA 3 8 OZ.',37.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3955') +('0006895804571','NF OREGANO OIL IN OLIVE OIL',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12770') +('0006895804590','NF HORSECHESTNUT W/GRAPESEED',15.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-10 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3956') +('0006895804640','NF REGULARITY',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3957') +('0006895804944','NF URI SENSE 90CT',28.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3958') +('0006895807155','NFACTORS 7 DAY CLEANSE',46.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3959') +('0006895820731','COQ10 50MG.',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'3960') +('0006896607000','Le ROULE',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3961') +('0006905459155','PPOTATO FINGERLING BAG AUSTRIA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3962') +('0006927602003','CHUTNEY MANGO SWEET',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3963') +('0007003410021','MAYONNAISE',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-10-08 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3964') +('0007027710518','FETA ATHENOS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-02-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3965') +('0007027710520','FETA ATHENOS CRUMBLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-01-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3966') +('0007027729079','FETA W/TOM & BASIL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-02-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3967') +('0007027729087','FETA ATHENOS GARLIC HERB',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3968') +('0007027729091','FETA W/GAR;OC & HERB',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-02-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3969') +('0007027729098','FETA ATHENOS REDUCED FAT',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3970') +('0007053300014','PMIXED NUTS NON-ORG',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','548','0','0','1','0',0,'1067','2008-10-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'3971') +('0007055170053','CHAVRIE',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-03-04 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'3972') +('0007061700062','CHEESE PUFFS,NATURAL',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1549','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3973') +('0007061700075','CHEESE PUFFS,JALAPENO',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1549','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3974') +('0007061700079','CHEESE PUFF BAKES',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1549','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3975') +('0007061700130','WHEATINES,OG,SALTED TOPS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3976') +('0007061700160','SNACKIMALS OG SNCKRDOODLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3977') +('0007061700162','SNACKIMALS,VANILLA 7.5 OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3978') +('0007061700163','SNACKIMALS,CHOCOLATE CHIP 7.5',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3979') +('0007061700164','SNACKIMALS,W/F OATMEAL 7.5 OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3980') +('0007061700285','RITE LITE ROUNDS,LOW FAT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3981') +('0007061700605','SHREDDED OATS, CINN CRUNCH',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1583','2008-09-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3982') +('0007061700606','SHREDDED WHEAT CEREAL',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1583','2008-09-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3983') +('0007061700607','SHREDDED SPOONFUL CEREAL',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1583','2008-09-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3984') +('0007061700609','PUFFINS CRNCHY CORN CEREL',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3985') +('0007061700610','PUFFINS CINNAMON 12 OZ',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3986') +('0007061700612','SHREDDED OATS CEREAL',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1583','2008-09-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3987') +('0007061700613','SHREDDED OATS,VANILLA ALD',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'1583','2008-09-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3988') +('0007061700623','PUFFINS PEANUT BUTTER CRL',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3989') +('0007061700625','WILD PUFF FRUIT PUNCH',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2007-11-19 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3990') +('0007061700628','CEREAL,MULTIGRAIN PUFFIN',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-07-22 09:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3991') +('0007061700629','CEREAL,BLUBRRY SHRED OAT',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-07-22 09:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3992') +('0007061700645','WILD PUFF COCOA',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2007-11-19 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3993') +('0007061710151','FIG BARS,FF/WF,RASPBERRY',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3994') +('0007061710155','FIG BARS,LF,TRADL BLUBRY',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-12-11 02:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3995') +('0007061730124','DICED GREEN CHILIES',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-02-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3996') +('0007061741251','CEREAL BAR, APPLE CINNAMON',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1525','2008-12-11 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3997') +('0007061741252','MULTIGRN CEREAL BAR,BLBRY',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1525','2008-12-11 01:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3998') +('0007061741253','MULTIGRN CEREAL BAR,STWBY',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1525','2008-12-11 01:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'3999') +('0007061741254','MULTIGRN CEREAL BAR,RSPBY',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1525','2008-12-11 01:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4000') +('0007061741259','CEREAL BAR CHERRY',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1525','2008-12-11 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4001') +('0007061741260','CEREAL BARS TRIPLE BERRY',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1525','2008-12-11 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4002') +('0007073400003','HERB TEA,SLEEPYTIME',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4003') +('0007073400403','HERB TEA,PEPPERMINT',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4004') +('0007073405307','HERB TEA,HONEY VAN CHAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4005') +('0007073405315','HERB TEA,CRAN APPLE ZINGR',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4006') +('0007073405317','HERB TEA,LEMON ZINGER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4007') +('0007073405319','HERB TEA,BLACK CHERRY',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4008') +('0007073405320','HERB TEA,MINT MAGIC',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4009') +('0007073405323','HERB TEA,CAFFEINE-FREE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4010') +('0007073405328','HERB TEA,BENGAL SPICE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4011') +('0007073405334','HERB TEA,TENSION TAMER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4012') +('0007073405335','HERB TEA,WILD BERRY ZINGR',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4013') +('0007073405466','CHAI,ORIG,INDIA SPICE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4014') +('0007073405467','CHAI,ORIG,INDIA DECAF',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4015') +('0007073407015','HERB TEA,MORNING THUNDER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4016') +('0007073407036','GREEN TEA,ANTIOXIDANT',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4017') +('0007073407062','GREEN TEA,BLUEBRY BREEZE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1531','2009-07-09 01:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4018') +('0007074010344','PAVOCADO BAGGED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','557','0','0','0','0',0,'711','2009-04-03 09:03:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4019') +('0007084400718','WATER CHESTNUTS,SLICED',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4020') +('0007098935846','MAG MOTHER EARTH NEWS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4021') +('0007098936049','HERB COMPANION MAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-05-23 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4023') +('0007098936050','MAG HERBS FOR HEALTH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-03-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4024') +('0007099235847','MOTHER EARTH NEWS SPECIAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-09-16 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12907') +('0007099235849','GRIT MAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4025') +('0007110500001','ARMENIAN CRACKER BREAD',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4026') +('0007113810236','WASABI MUSTARD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4027') +('0007114600245','CRISPS,ORIGINAL FLAVOR',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4028') +('0007128740450','COFFEE FILTERS,#2 CONE',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4030') +('0007128746450','COFFEE FILTERS,#4 CONE',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4031') +('0007144830059','CREME FRAICHE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4032') +('0007145400323','DISH BRUSH',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4033') +('0007145400393','STAINLESS STEEL SCOUR PAD',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-03-20 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4034') +('0007146424060','GREEN GOODNESS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4035') +('0007146425060','BOLTHOUSE OJ',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-05-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4036') +('0007146426060','BOLTHOUSE PROTEIN',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4037') +('0007146430051','BOLTHOUSE MOCHA CAP',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4038') +('0007146430151','BOLTHOUSE BLUE GOODNESS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2009-02-17 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4039') +('0007146430251','BOLTHOUSE C BOOST QT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2009-07-28 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4040') +('0007146430851','BOLTHOUSE CLEMENTINE OJ',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4041') +('0007147501082','DRESSING,ORIGINAL CAESAR',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1590','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4042') +('0007147501089','DRESSING,PARMESAN RANCH',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1590','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4043') +('0007148601869','MAGAZINE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-07-16 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4044') +('0007148601873','YOGA JOURNAL MAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-07-16 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4045') +('0007148601936','MAG YOGA JOURNAL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-07-16 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4046') +('0007148602566','MAG ORGANIC GARDENING',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4047') +('0007148602745','COOKS ILLUSTRATED ANNUAL EDITI',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4048') +('0007148602880','MAG YOGA PLUS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2006-10-16 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4049') +('0007187900214','MACAROON,COCONUT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4050') +('0007187912491','MACAROON,COCONUT CANISTER',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4051') +('0007189648894','URBAN FARM MAGAZINE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-09-01 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12846') +('0007215500005','PICKAPEPPA SAUCE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-11-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4052') +('0007216912165','PJ CHICKEN BURRITO',2.59,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4053') +('0007216912265','PJ BEEF BURRITO',2.59,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4054') +('0007216912266','PJS CHICKEN ENCHILADA MEAL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2007-10-12 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4055') +('0007216912366','PJS BEEF ENCHILADA MEAL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2007-10-12 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4056') +('0007224645864','HERB QUARTERLY MAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4059') +('0007224823338','GARLIC BREAD STICKS',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2006-01-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4060') +('0007234000074','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4061') +('0007244010157','MAG BODY AND SOUL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-08-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4062') +('0007246300020','IRISH OATMEAL,TIN',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4063') +('0007246300021','IRISH OATMEAL,QUICK COOK',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4064') +('0007247730003','FRENCH PRESS REPLACEMENT CARAF',10.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4065') +('0007260973600','ICE CREAM,OG,VANILLA',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4066') +('0007260973602','ICE CREAM,OG,CHOCOLATE',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4067') +('0007260973606','ICE CREAM,OG,BLACKBERRY',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4068') +('0007260973607','ICE CREAM,OG,MINT FUDGE',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4069') +('0007260973608','ICE CREAM,OG,CARAMEL',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4070') +('0007260973650','ICE CREAM,OG,VANILLA',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4071') +('0007260973651','ICE CREAM,OG,CHOCOLATE',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4072') +('0007260974100','ICE CRM BAR,OG,VANILLA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4073') +('0007260974101','ICE CRM BAR,OG,CHOCOLATE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4074') +('0007260974102','ICE CRM BAR,OG,COFFEE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4075') +('0007260974103','ICE CRM BAR,OG,BLACKBERR',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4076') +('0007260974104','JULIES BLACKBERRY SORBET BARS',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4077') +('0007260974105','SORBET BARS,OG,MANDARIN',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4078') +('0007260974110','JULIES VANILLA BAR SINGLES',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4079') +('0007260974118','SORBET BARS,OG,LEMON',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4080') +('0007260974119','SORBET BARS,OG,MANGO PAS',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4081') +('0007260974120','JULIES GF VAN ICE CRM SNDWCH',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4082') +('0007260974121','ICE CREAM SANDWICH,OG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4083') +('0007260974123','JULIES FUDGE BARS',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4084') +('0007260974124','ICE CREAM SANDWCH,OG,JLT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4085') +('0007260974125','ICE CREAM SANDWCH,OC,CHO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4086') +('0007260974138','JULIES VAN ALMND ICE CRM BAR',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4087') +('0007260974180','ALDENS BLACKBERRY ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4088') +('0007260974181','ALDENS CHOCOLATE ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4089') +('0007260974182','ALDENS COOKIES&CRM ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'mixmatchcode','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4090') +('0007260974183','ALDENS MINT ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4091') +('0007260974184','ALDENS STRAWBERRY ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4092') +('0007260974185','ALDENS VANILLA ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4093') +('0007260974191','ALDENS OG PB CHIP ICE CREAM',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4094') +('0007274590520','PERDUE GAME HENS',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-17 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'4095') +('0007283000101','TILLAMOOK MED CHEDDAR CHEESE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-04-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4096') +('0007283000185','TILLAMOOK X SHARP CHEDDAR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-04-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4097') +('0007283000561','TILLAMOOK MED CHEDDAR KOSHER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4098') +('0007286813604','POISON FREE WASP KILL',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4099') +('0007290400002','GOAT MILK,POWDERED',12.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4100') +('0007293469241','PILAF,SPANISH',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4101') +('0007293469266','SAFFRONED JASMINE RICE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4102') +('0007293497113','COUSCOUS,OG,WILD MUSHROOM',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4103') +('0007293497114','COUSCOUS,OG,LEMON SPINACH',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4104') +('0007315050103','PCLEMENTINE BAG',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1311','2008-12-13 09:05:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'4105') +('0007323000802','KIPPER SNACKS,LOW SODIUM',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4106') +('0007323000809','BRSLNG SARDINE IN OLV OI',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-12-18 08:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4107') +('0007323000814','SARDINES IN MUSTARD SAUC',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-12-18 08:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4108') +('0007323000831','FLAT ANCHOVIES IN OIL',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4109') +('0007323000833','SARDINES,SKNLS BNLS OIL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4110') +('0007323000838','SARDINES,SKINLESS BNLS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2009-08-14 10:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4111') +('0007323000851','SMKD OYSTERS IN OLIVE OIL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4112') +('0007331643114','PASTA SAUCE,NO SALT',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4113') +('0007331643116','PIZZA SAUCE 15.5 OZ',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4114') +('0007331643130','SALSA,OG,MILD',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4115') +('0007336023341','SPRKLNG WTR,CAN,LIME',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4116') +('0007336032341','SPRKLNG WTR,CAN,CRAN RSB',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4117') +('0007336037341','SPRKLNG WTR,CAN,LEMON',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4118') +('0007336061341','SPRKLNG WTR,CAN,ORANGE',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4119') +('0007336070341','SPRKLNG WTR,CAN,NATURAL',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4120') +('0007336108370','MAG ADBUSTERS SPEC',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-05-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4121') +('0007336164756','MAG AMERICAN CRAFT',5.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-11-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4122') +('0007337706944','BACK BRUSH',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-11 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4123') +('0007337706945','CONTOURED BODY BRUSH',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4124') +('0007337706970','PUREST PALM BODY BRUSH',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-28 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4125') +('0007337707103','LOOFAH SCRUFF PAD',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4126') +('0007337707107','ET FILING BLOCK',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-05-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4127') +('0007337707118','NAIL BRUSH,GENIUNE BRISTL',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4128') +('0007337707120','NATURAL SIERRA PUMICE',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4129') +('0007337707310','EARTH THER ANTIBACT SPONGE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-02-29 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4130') +('0007337708105','5 LOOFAH SPONGE',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4131') +('0007337709875','WOODEN PIN BRUSH',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-07-07 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4132') +('0007341600014','RICE CK,OG,BROWN,SALT',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1604','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4134') +('0007341600015','RICE CK,OG,BROWN,NS',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1604','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4135') +('0007341600017','RICE CK,OG,WILD,SALTED',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1604','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4136') +('0007341600020','RICE CK,OG,SESAME TAMARI',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1604','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4137') +('0007341600024','RICE CK,OG,KOKU SEAWEED',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1604','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4138') +('0007341600160','RICE SYRUP,OG,BROWN',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4139') +('0007341600325','BR RICE BLEND,JUBILEE GM',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-07-23 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4140') +('0007341600451','RICE BLEND,BLACK JAPONIC',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-07-23 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4141') +('0007341602001','RISOTTO,CREAMY PARMESAN 5.5 OZ',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4142') +('0007341602034','RISOTTO,OG,SPCH/MUSH FLNT 5.75',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4143') +('0007341603530','RICE CHIPS,ORIG SEA SALT',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4144') +('0007341603531','RICE CHIPS,PICO DE GALLO',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4145') +('0007341603532','RICE CHIPS,SESAME SEAWEED',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4146') +('0007341603534','RICE CHIPS,FIESTA LIME 6 OZ',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4147') +('0007341630010','RICE,WEHANI AROMATIC,BRWN 1 LB',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4148') +('0007346920123','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4149') +('0007347200101','BREAD,OG,7 GRN SPRTD WHT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4150') +('0007347200116','ENGLISH MUFFINS,OG,7GRAIN',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4151') +('0007347200117','ENG MUFFIN,OG,EZK4:9,RSN',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4152') +('0007347200120','BREAD,OG,EZEKIEL 4:9 SPRT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4153') +('0007347200123','BREAD,OG,EZEKIEL SESAME',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4154') +('0007347200131','BREAD,OG,EZEKL4:9CINN RSN',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4155') +('0007347200163','BREAD,WHITE RICE,WF & GF',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4156') +('0007347200165','BREAD,RICE ALMOND,WHTFREE',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4157') +('0007347200166','BREAD,MILLET,WHEAT FREE',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4158') +('0007347200167','BREAD,WF&GF RAISIN PECAN',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4159') +('0007347200169','BREAD,BROWN RICE,WF & GF',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4160') +('0007347200170','BREAD,RICE PECAN,WF & GF',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4161') +('0007347200200','TORT,OG,EZK4:9,SPRT,LARGE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4162') +('0007347200201','TORT,OG,EZK4:9,SPRT,SMALL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4163') +('0007347200213','BURGR BUN,OG,EZEKL,SPRTD',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4164') +('0007347200214','HOT DOG BUNS,OG,EZK,SPRT',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4165') +('0007347200255','CRL,OG,EZEKIEL 4:9,ORIGNL',5.79,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1561','2008-09-19 10:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4166') +('0007347200256','CRL,OG,EZEKIEL 4:9,GL FLX',5.79,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1561','2008-09-19 10:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4167') +('0007347200257','CRL,OG,EZEKIEL 4:9,CN RSN',6.29,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1561','2008-09-19 10:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4168') +('0007347200369','TORTILLAS,BROWN RICE',3.29,'0',0.00,'0',2.65,'0',2.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4169') +('0007349130300','KOZY SHACK PUDDING,CHOCOLATE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-06-04 08:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4170') +('0007349151000','KOZY SHACK PUDDING,RICE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-06-04 08:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4171') +('0007349153000','KOZY SHACK PUDDING,TAPIOCA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2009-06-05 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4172') +('0007357480001','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4173') +('0007357480003','PLETTUCE ROMAINE HEART',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4174') +('0007382512078','SLOPPY JOE MIX 4.4 OZ',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4175') +('0007382512270','TOFU SCRAMBLER',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4176') +('0007409206701','PURE N BASIC SOAP GREEN TEA',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-04-29 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4177') +('0007409206706','PURE N BASIC SOAP WHITE TEA',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-04-29 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4178') +('0007409206707','PURE N BASIC SOAP FRESH FIG',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-04-29 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4179') +('0007409206709','PURE N BASIC SOAP HONEY SHEA',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-04-29 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4181') +('0007428630042','ABERGELE BLASERS',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-07-21 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4182') +('0007430500006','LIQUID AMINOS SPRY BOTTLE',3.35,'0',0.00,'0',2.65,'0',2.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2007-11-09 10:05:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4183') +('0007430500016','LIQUID AMINOS 16oz',4.55,'0',0.00,'0',3.85,'0',3.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'499','2009-08-12 12:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4184') +('0007430500116','APL CIDR VINGR,OG,RAW,UNF 16 O',3.39,'0',0.00,'0',2.69,'0',2.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2007-11-09 10:05:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4185') +('0007430500132','APL CIDR VINGR,OG,RAW,UNF 32 O',5.55,'0',0.00,'0',4.69,'0',4.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2007-11-09 10:05:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4186') +('0007430503012','HEALTHY VINAIGRETTE, OG',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4187') +('0007430503112','SALAD DRESSING,GNGR&SESA',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-10-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4188') +('0007433336112','GRAHAM CRACKER PIE CRUST',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4189') +('0007433337344','PIZZA CRUST MIX,G/F',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4190') +('0007433337470','FLAKES,OG,MPL BUCKWHT,W/F',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4191') +('0007433337492','CEREAL,OG,AMARANTH FLAKE',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4192') +('0007433337499','CEREAL,OG,SPELT FLAKES',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4193') +('0007433337790','CEREAL,RICE FLAKES SWTND',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4194') +('0007433338243','COOKIE MIX OG GINGERBREAD',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4195') +('0007433338245','COOKIE MIX OG SUGAR',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4196') +('0007433338530','CEREAL,OG,RICE & SHINE',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4197') +('0007433347162','PNCK&WAFL MIX,OG,MULTIGRN',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4198') +('0007433347174','PANCAKE MIX,OG,BUCKWHEAT',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4199') +('0007433347176','PNCK&WAFL MIX,OG,BUTERMLK',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4200') +('0007433347179','PANCAKE MIX,OG,G/F',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4201') +('0007433347491','ORGANIC HERB STUFFING',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4202') +('0007442800160','LAUNDRY DETERGENT',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4203') +('0007447002396','MAG VEGETARIAN TIMES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-09-11 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4204') +('0007447002744','COOKS ILL SPECIAL EDITION',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-05-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4205') +('0007447002981','MAG PILATES STYLE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-04-17 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4206') +('0007447022380','WEND MAGAZINE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-08-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4207') +('0007447023470','GET FRESH MAG',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-04-15 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4208') +('0007447024534','TATHAASTU',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4209') +('0007447024605','GLUTEN FREE LIVING',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4210') +('0007447027028','MAG SUSTAINABLE INDUSTRIES',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-11-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4211') +('0007447051081','NATURAL HEALTH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-09-16 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4213') +('0007447058372','ODE MAGAZINE',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2006-08-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4214') +('0007447074883','MASSAGE THERAPY JOURNAL MAG',6.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-04-27 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4215') +('0007447079635','MAG ANIMAL WELLNESS',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2006-01-25 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4216') +('0007447082753','NEW MOON GIRLS',5.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4217') +('0007447085829','MAG TEA A MAGAZINE',5.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4218') +('0007447087105','THE SUN MAG',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4219') +('0007447099548','MAG REIKI NEWS',6.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4220') +('0007447099712','MAG BACKWOODS HOME',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-08-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4221') +('0007447099894','INTEGRATIVE MEDICINE MAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4222') +('0007447275810','CRISPBREAD,CRISPY THIN 5.29 OZ',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4223') +('0007447275830','FLATBREAD,FIVE-GRAIN 5.29 OZ',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4224') +('0007447275870','CRISPBREAD,CRISPY PESTO 5.29 O',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4225') +('0007457483351','PGARLIC MINCED JAR',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'643','2009-03-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4226') +('0007457483651','PGARKIC JAR MINCED, WATER',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'643','2009-03-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4227') +('0007457483690','PGARLIC MINCED JAR 4.5 OZ',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'643','2009-03-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4228') +('0007457483691','PGARLIC MINCED JAR 4.5 OZ H20',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'643','2009-03-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4229') +('0007457483696','PSHALLOT CHOPPED JAR',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'1315','2008-04-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4230') +('0007457485690','PGARLIC 3OZ C. RANCH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4231') +('0007467708110','8PIE,APPLE,UNBKD,RTL PK',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4232') +('0007467708112','8PIE,BLUBRY,UNBKD,RTL PK',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4233') +('0007467708113','8PIE,CHERRY,UNBKD,RTL PK',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4234') +('0007467708120','PIE,PUMPKIN,VEGAN,UNBAKE',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4235') +('0007467708124','8PIE,PUMPKN,UNBKD,RTL PK',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4236') +('0007467784211','9 PIE SHELL,TRADITIONAL',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4237') +('0007467784212','9 PIE SHELL,WHOLE WHEAT',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-16 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4238') +('0007468210201','JUICE, OG, APPLE, 1/2 GALLON',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4239') +('0007468210308','JUICE,JUST POMEGRANATE',8.29,'0',0.00,'0',5.49,NULL,5.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'0','2008-10-17 03:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4240') +('0007468210309','JUICE,JUST BLACK CHERRY',4.75,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4241') +('0007468210326','JUICE,VITA',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4242') +('0007468210327','JUICE,CRANBERRY NECTAR',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4243') +('0007468210347','JUICE VERY VEGGIE SPICY',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4244') +('0007468210350','JUICE,JUST CRANBERRY',8.69,'0',0.00,'0',5.49,NULL,5.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4245') +('0007468210403','CONCENTRATE,CRANBERRY',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4246') +('0007468210404','CONCENTRATE,BLACK CHERRY',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4247') +('0007468210406','MORNING BLEND, 8OZ',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-02-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4248') +('0007468210427','CRANBERRY NECTAR, 8OZ',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-02-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4249') +('0007468210531','RECHARGE LEMON 32OZ PET',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4250') +('0007468210533','RECHARGE TROPICAL PET 320Z',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4251') +('0007468210534','RECHARGE GRAPE PET 32OZ',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4252') +('0007468210537','JUICE, MIX BERRY RECHARGE',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4253') +('0007468210671','RECHARGE ORANGE, 16OZ',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4254') +('0007468210673','RECHARGE GRAPE, 16OZ',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4255') +('0007468210712','JUICE,OG,PRUNE',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4256') +('0007468210717','JUICE, OG, GRAPEFRUIT',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4257') +('0007468210722','JUICE,MORNING BLEND 32Z',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'mixmatchcode','2009-04-09 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4258') +('0007468210727','JUICE,OG,TOMATO',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4259') +('0007468210730','JUICE, OG, VERY VEGGIE, L/S',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4260') +('0007468210731','JUICE,OG,VERY VEGGIE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4261') +('0007468210749','JUICE,MEGA C',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4262') +('0007468210752','JUICE,MEGA GREEN',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4263') +('0007468210755','JUICE,MEGA ANTIOXIDANT',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4264') +('0007468210778','JUICE,OG,BLUEBERRY NECTAR',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4265') +('0007468210781','JUICE CRAN POMEGRAN KNUDSEN',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4266') +('0007468210791','JUICE,OG,GOJI BERRY',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-11-06 01:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4267') +('0007468211101','ASEPT/3 PAK,APPLE,OG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'1601','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4268') +('0007468211104','ASEPT/3 PAK,PEAR,OG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'1601','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4269') +('0007468211129','ASEPT/3 PAK,LEMONADE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'1601','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4270') +('0007468211135','ASEPT/3 PAK,RAZZLEBERRY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'1601','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4271') +('0007468211166','ASEPT/3 PAK,TROP PUNCH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'1601','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4272') +('0007468211195','ASEPT/3 PAK,GRAPE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'1601','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4273') +('0007468211203','SPRITZER,PEACH',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4274') +('0007468211210','SPRITZER,BOYSENBERRY',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4275') +('0007468211218','SPRITZER,RED RASPBERY',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4276') +('0007468211221','SPRITZER,ORNG PASSION',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4277') +('0007468211223','SPRITZER,STRAWBERRY',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4278') +('0007468211224','SPRITZER,JAMACN LEMON',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4279') +('0007468211232','SPRITZER,BLACK CHERRY',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4280') +('0007468211248','SPRITZER,MANGO-FANGO',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4282') +('0007468211257','SPRITZER,TANGERINE',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4283') +('0007468211261','SPRITZER,MANDARN LIME',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4284') +('0007468211267','SPRITZER,CRANBERRY',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'2501','2008-07-24 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4285') +('0007468211834','JUICE, SPRK, CRISP APPLE',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4286') +('0007468211835','JUICE, SPRK, BLUEBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4287') +('0007468211837','JUICE,SPRK,OG,PEAR',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4288') +('0007468211842','JUICE, SPRK, CONCORD GRAPE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4289') +('0007468211867','JUICE, SPRK, CRANBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4290') +('0007468215123','JUICE,OG,ORANGE 8OZ',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'499','2009-05-21 01:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4291') +('0007468215125','JUICE,OG,VERY VEGGIE 8OZ',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'499','2009-05-21 01:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4292') +('0007480401318','SEEDS, RADISH BLACK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4293') +('0007480802744','MAG COOKS ILLUS',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2006-05-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4294') +('0007480802881','MAG FIT YOGA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-04-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4295') +('0007480851081','MAG NATURAL HEALTH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-07-16 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4296') +('0007482008325','NATURAL SOLUTIONS MAG',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-01-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4297') +('0007482008370','MAG ADBUSTERS',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2006-08-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4298') +('0007482008408','MAG NATURAL HOME& GARDEN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4299') +('0007482008681','READY MADE MAGAZINE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-04-27 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4300') +('0007482008684','MAG SAVEUR',5.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-11-02 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4301') +('0007482008876','UTNE READER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-08-25 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12799') +('0007482008975','LA CUCINA ITALIANA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4302') +('0007482008979','PASTE MAG',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4303') +('0007482008980','ODE MAGAZINE',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4304') +('0007484040112','MARIGOLD BUTTER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4305') +('0007485108311','GOOD MAGAZINE',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4306') +('0007485108991','LIVING WITHOUT MAG',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-03-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4307') +('0007485200007','FONDUE BAG EMMI',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-12-12 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4308') +('0007487300003','WESTSOY SOFT TOFU',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4309') +('0007487300004','WESTSOY FIRM TOFU',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4310') +('0007487300010','ORIGINAL TEMPEH',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4311') +('0007487300013','FIVE GRAIN TEMPEH',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4312') +('0007487309080','MISO,OG,MELLOW BROWN RICE',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4313') +('0007487310012','TIDAL WAVE TOFU',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4315') +('0007487316320','BEANS,OG,GARBANZO',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4316') +('0007487316321','BEANS,OG,BLACK,FF',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4317') +('0007487316322','BEANS,OG,GREAT NORTH',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4318') +('0007487316323','BEANS,OG,KIDNEY,FF',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4319') +('0007487316324','BEANS,OG,PINTO,FF',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4320') +('0007487316325','BEANS,OG,RED,FF',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4321') +('0007487316327','BEANS,OG,CHILI,FF',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4322') +('0007487316331','BEANS,OG,SALAD,LF',1.99,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'1514','2009-09-15 09:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4323') +('0007487317010','CANNED VEG,OG,GOLDEN CORN',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1581','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4324') +('0007487317020','CANNED VEG,OG,GREEN BEAN',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1581','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4325') +('0007487317030','CANNED VEG,OG,SWEET PEAS',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'1581','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4326') +('0007487325320','BEANS,OG,GARBANZO',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4327') +('0007487325321','BEANS,OG,BLACK,FF',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4328') +('0007487325323','BEANS,OG,KIDNEY 25 OZ',2.75,'0',0.00,'0',1.99,'0',1.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4329') +('0007487325324','BEANS,OG,PINTO 25 OZ',2.55,'0',0.00,'0',1.99,'0',1.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','156','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4330') +('0007487330011','BAKED THAI TOFU',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4331') +('0007487330014','BAKED ITALIAN TOFU',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4332') +('0007487330016','SEASONED SEITAN',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4333') +('0007487330020','CHICKEN STYLE SEITAN',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4334') +('0007487330044','BAKED TOMATO BASIL TOFU',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4335') +('0007487396015','WESTSOY,OG,UNSWEETENED',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1582','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4336') +('0007487396810','WESTSOY DRINK,OG,PLAIN,LF',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4337') +('0007487396860','WESTSOY DRINK,VAN,LF',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4338') +('0007487397050','WESTSOY PLUS,OG,PLAIN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4339') +('0007487397060','WESTSOY PLUS,OG,VANILLA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4340') +('0007487397083','WESTSOY,OG,VANILLA,UNSWT',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1582','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4341') +('0007487397084','WESTSOY,OG,CHOC,UNSWTND',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1582','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4342') +('0007489000195','SUGAR CUBES- DEMERARRA',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-01-23 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4343') +('0007507038004','CEREAL,OG,RSPBRY GNGR CRP',5.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1577','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4345') +('0007507038005','CEREAL,OG,VANILLA ALMD CR',5.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1577','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4346') +('0007507038007','CEREAL,OG,WILDBERRY CRISP',5.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1577','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4347') +('0007507038013','CEREAL, OG, RAISIN BRAN',5.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1577','2008-07-24 01:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4348') +('0007507038016','GRANOLA,OG,GLDN HNY W/FLX',5.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1577','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4349') +('0007507038017','GRANOLA,OG,GINGER SNAP',5.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'1577','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4350') +('0007511904015','ENER-G LOAF,TAPIOCA',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-24 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4351') +('0007511912352','RICE BRAN GLUTEN FREE',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4352') +('0007511912365','FLOUR POTATO STARCH',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4353') +('0007511912366','FLOUR,POTATO,FINE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4354') +('0007511912448','EGG REPLACER,VEGAN',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4355') +('0007511914570','ENER-G WHITE RICE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-09-16 02:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4356') +('0007511914571','ENER-G BROWN RICE LOAF',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-09-16 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4357') +('0007511914577','ENER-G YF WHITE RICE LOAF',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-24 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4358') +('0007511914580','ENER-G, YF BROWN RICE',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-24 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4359') +('0007511914587','ENER-G TAPIOCA BUNS',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-24 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4360') +('0007511960220','PIZZA SHELLS,RICE',14.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4361') +('0007511960221','ROLLS GF ENER G',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-08-20 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4362') +('0007511960225','ENER-G ENGLISH MUFFIN W/TOFU',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-12-12 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4363') +('0007511980420','XANTHAN GUM',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4364') +('0007517207880','LICORICE CREMES',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4365') +('0007517207915','NATURAL LICORICE BAR',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4366') +('0007517207930','RASPBERRY CHEW BAR',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4367') +('0007517207936','RASPBERRY CHEW BOX',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4368') +('0007517207946','NATURAL LICORICE CHEW,BOX',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4369') +('0007517207969','NATRL,LICR CHW HRBS,BOX',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4370') +('0007518100113','CORN SPAGHETTI,OG,WF',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4371') +('0007518120100','DINNER,BEEF STROGANOFF 7.41 OZ',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4372') +('0007518120102','DINNER, LASAGNA',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4373') +('0007527000160','YOGURT,PLAIN',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2007-12-27 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4374') +('0007527000161','MTN HIGH VANILLA ORIG 32OZ',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-08-21 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12787') +('0007527000166','FF YOGURT,PLAIN',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2007-12-27 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4375') +('0007527000167','FF VANILLA YOGURT',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-08-21 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12791') +('0007527000193','MOUNTAIN HIGH RASP YOGURT',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2007-12-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4376') +('0007547008293','MOTHER JONES MAGAZINE',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-07-16 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4377') +('0007547008325','MAG ALTERNATIVE MEDICINE',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4378') +('0007547008396','KIWI MAG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4379') +('0007547008876','MAG UTNE READER',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-08-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4380') +('0007547008896','MENTAL FLOSS MAGAZINE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-07-16 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4381') +('0007550167520','GJETOST',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-03-06 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4382') +('0007550200001','MINERAL WATER,1 LTR GEROLS',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'499','2009-09-16 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4383') +('0007557300010','SOAP,ALOE VERA',1.69,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4384') +('0007557300011','SOAP,VITAMIN-E',1.69,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4385') +('0007557300013','SOAP,RAINFOREST',1.69,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4386') +('0007557300015','SOAP,UNSCENTED',1.69,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4387') +('0007557300016','SOAP,CUCUMBER',1.69,'0',0.00,'0',1.29,'0',1.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4388') +('0007570701100','COCOCARE COCOA BUTTER STICK',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'mixmatchcode','2009-01-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4389') +('0007572000020','SPRKLNG WATER,MAND ORANGE',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4390') +('0007572000040','SPRKLNG WATER,LEMON,LITER',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4391') +('0007572000050','SPRKLNG WATER,RASP/LIME',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4392') +('0007577227751','SKIN TRIP COCONUT',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4393') +('0007577227760','MOTHER SPCL OIL BLEND 8 OZ.',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4394') +('0007581000125','TAMARI,OG,W/F,GOLD LABEL 10 OZ',4.19,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4395') +('0007581000425','TAMARI,OG,W/F,R/S,PLATINM',4.95,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4396') +('0007581002125','TAMARI,BLACK LABEL 10 OZ',2.75,'0',0.00,'0',1.79,NULL,1.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4397') +('0007581002325','TAMARI,RDCD SODIUM,WHT LB 10 O',3.65,'0',0.00,'0',2.39,NULL,2.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4398') +('0007581004125','SHOYU,OG,BRONZE LABEL 10 OZ',3.45,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4399') +('0007581004135','SHOYU,TRAD,OG SOYBEAN',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4400') +('0007581011225','COOKING SAUCE,TERIYAKI',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1545','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4401') +('0007581012025','COOKING SAUCE,SZECHUAN',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1545','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4402') +('0007581014025','COOKING SAUCE,THAI PEANUT',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1545','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4403') +('0007582000000','SPIKE SEASONING,SHAKER',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4404') +('0007582000003','SPIKE TENDERIZER MAGIC',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-08-06 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4405') +('0007582000007','SPIKE SALT FREE MAGIC',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-08-06 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4406') +('0007582016212','SWISS KRISS LAXITIVE',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4407') +('0007594038352','GRAHAMS,OG,WW,HONEY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-09-03 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4408') +('0007594039000','GRAHAMS,OG,WW,CINNAMON',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4409') +('0007627710392','MOCK DUCK CANNED',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2006-02-09 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4410') +('0007631430020','ALACER LITE SINGLE',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4411') +('0007631430022','EMERGEN-C,LITE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4412') +('0007631430025','EMRGNC MSM SNGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4413') +('0007631430027','EMERGEN C MSM BOX',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'mixmatchcode','2009-03-13 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4414') +('0007631430040','EMERGEN-C,RASPBERRY',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4415') +('0007631430046','EMERGEN-C,SUPER ORANGE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4416') +('0007631430052','EMERGEN CRAN PACKET',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'mixmatchcode','2009-04-10 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4417') +('0007631430053','EMERGEN-C,CRANBERRY',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4418') +('0007631430054','EMERGEN-C,TANGERINE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4419') +('0007631430055','EMERGENC TANGE SINGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4420') +('0007631430057','TROPICAL EMERGEN C SINGLE',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4421') +('0007631430058','EMERGEN-C,TROPICAL',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4422') +('0007631430081','EMERGEN-C,LEMON LIME',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4423') +('0007631430087','EMERGEN-C PACKET LL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4424') +('0007631430107','EMERGEN-C,STRWBRY 4 ADULT',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4425') +('0007631430108','ELECTRO MIX,LIME FLAVOR',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-01 07:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4426') +('0007631430109','EMERGEN-C,POWER 4 JOINTS',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4427') +('0007631430115','EMERGEN-C,MIXED BERRY BONE',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4428') +('0007631430116','EMERGEN-C,BLCK CHRY-HEART',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4429') +('0007631430131','ALACER IMMUNE DEFENSE',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4430') +('0007631430156','ALACER ACAI EMERGEN C',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4431') +('0007631430181','ALACER KIDS MULTI STRBAN 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4432') +('0007631430190','ALACER EMERGENC CHERRYPOM 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4433') +('0007631430193','ALACER EMERGENC CRANPOM 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4434') +('0007631430199','ALACER EMERGENC BLUE 30CT BOX',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4435') +('0007631430201','ALACER EMERGENC RASPBERRY 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4436') +('0007631430202','ALACER EMERGENC TANGERINE 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4437') +('0007631430203','ALACER EMERGENC ORANGE 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4438') +('0007631430205','ALACER EMERGENC LEMLIME 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4439') +('0007631430206','ALACER EMERGENC ACAI 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4440') +('0007631430207','ALACER EMERGENC TROPICAL 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4441') +('0007631430208','ALACER EMERGENC JOINT 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4442') +('0007631430209','ALACER EMERGENC LITE 30CT',15.99,'0',0.00,'0',13.59,'0',13.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4443') +('0007631430210','ALACER EMERGENC MSM 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4444') +('0007631430211','ALACER EMERGENC HEART 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4445') +('0007631430217','ALACER EMERGENC IMMUNE 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4446') +('0007631430226','ALACER EMERGENC BONE 30CT',18.65,'0',0.00,'0',15.85,'0',15.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4447') +('0007631430232','ALACER EMERGENC ELECTRO 30CT',13.29,'0',0.00,'0',11.29,'0',11.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-17 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4448') +('0007631430611','STRAW JR EMERC SINGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'mixmatchcode','2009-04-10 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4449') +('0007631430640','EMERGEN-C RASP SNG',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4450') +('0007631430646','EMERGEN-C PCKT ORANG',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4451') +('0007631436107','STRW MULTI EMEGENC',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'mixmatchcode','2009-04-10 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4452') +('0007631436108','ELECTRO MIX SNGL',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4453') +('0007631436109','ALACER EMERGEN C JOINT SNG',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4454') +('0007631436115','EMRGNC BONE SNG',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4455') +('0007631436116','EMRGNC HEART HLTH SNGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4456') +('0007631436131','ALACER IMM DEF SINGLE',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4457') +('0007631436156','ALACER EMERGENC ACAI SNGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4458') +('0007631436181','ALACER NEW KIDS EMERGC SNGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4459') +('0007631436190','EMERGEN CHERRY POM SNGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4460') +('0007631436193','ALACER EMERGENC CRANPOM SNGL',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4461') +('0007631436199','ALACER EMERGENC BLUE SINGLE',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4462') +('0007637104105','HOUSE SHIRATAKI SPAGHETTI',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-05-08 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4463') +('0007637104107','HOUSE SHIRATAKI ANGEL HAIR',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2009-05-08 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4464') +('0007663002941','AM HEALTH APPLE CID VIN 200CT',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4465') +('0007663003231','EVENING PRMRS 1300MG TWNP',18.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4466') +('0007663003617','ACIDOPHILUS,CHEWBL,BLUBRY',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4467') +('0007663005721','ACIDOPHILUS,CHEWBL,STRAW',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4468') +('0007663016971','AM HEALTH ESTER C 500',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4469') +('0007663050104','ORIG PAPAYA ENZYME 250CT',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4470') +('0007663050204','AH PAPAYA ENZYME PLUS 180CT',10.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4471') +('0007675700010','DENTAL FLOSS WAXED',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4472') +('0007675720009','POH DENTAL FLOSS',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4473') +('0007675720010','LITE WAX DENTAL FLOSS',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-06-26 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4474') +('0007677600926','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4475') +('0007677600928','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4476') +('0007677601104','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4477') +('0007677610120','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4478') +('0007677611028','PAPPLE BAG PINK LDY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4479') +('0007677760377','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4480') +('0007684010014','ICE CRM,NY SUPR FDGE CHNK',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4481') +('0007684010015','ICE CRM,CHERRY GARCIA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4482') +('0007684010018','ICE CRM,CREME BRULEE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4483') +('0007684010047','ICE CRM,CHOC FUDGE BRWNI',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4484') +('0007684010055','FRZ YGRT,CHERRY GARCIA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4485') +('0007684010058','ICE CRM,CH CHP,COOKI DOUG',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4486') +('0007684010098','ICE CRM,PHISH FOOD',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4487') +('0007684010132','ICE CRM,HALF BAKED',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4488') +('0007684010182','ICE CRM,WN PEACH COBBLER',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4489') +('0007684010205','ICE CRM,CINNAMON BUNS',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4490') +('0007684010207','B & J AMERICONE DREAM',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4491') +('0007684040005','ICE CRM,VANILLA 4 A CHNG',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4492') +('0007686900015','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4493') +('0007695012003','HRBL SLT SCRUB,PMNT/RSMRY',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-06-10 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4494') +('0007695041525','TEA,OG,VANILLA HAZELNUT 16 BAG',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4495') +('0007695041527','TEA,OG,EGYPTN LICORC MINT 16 B',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4496') +('0007695045001','TEA, OG, BEDTIME',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4497') +('0007695045004','TEA,OG,AHF,BREATHE DEEP',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4498') +('0007695045005','TEA,OG,AHF,WMN',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4499') +('0007695045008','TEA,OG,AHF,DE-TOX',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4500') +('0007695045009','TEA,OG,AHF,COLD SEASON',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4501') +('0007695045010','TEA,OG,AHF,ECH IMMUNE SUP',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4502') +('0007695045011','TEA,OG,AHF,GINGER',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4503') +('0007695045014','TEA,OG,AHF,FASTING',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4504') +('0007695045017','TEA,OG,AHF,LEMON-GINGER',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4505') +('0007695045018','TEA,OG,AHF,THROAT COMFORT',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4506') +('0007695045021','TEA,OG,GRN,KOMBUCHA',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4507') +('0007695045026','TEA,OG,GRN,TRPL ECHINACEA',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4508') +('0007695045030','TEA,OG,AHF,KAVA STRES RLF',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4509') +('0007695045032','TEA,OG,ST JOHN',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4510') +('0007695045036','TEA,OG,GRN,SPR ANTIOXIDNT 16 B',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4511') +('0007695045037','TEA,OG,GRN,KOMBUCHA,DECAF',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4512') +('0007695045041','TEA,OG,SIMPLY GREEN DECA',4.35,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12894') +('0007695045063','TEA, MEXICAN SWEET CHILI',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4513') +('0007695045067','TEA,OG, BERRY DETOX',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4514') +('0007695078421','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4515') +('0007697011031','AURA GLOW LOTION,ALMOND',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4516') +('0007697011033','AURA GLOW LOTION,LAVENDER',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4517') +('0007697011034','AURA GLOW LOTION,COCONUT',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4518') +('0007697011036','AURA GLOW LOTION,UNSCENTD',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4519') +('0007697011113','HERITAGE ATOMIDINE',15.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4520') +('0007697011316','HERITAGE A GLOW UNSCENT 16OZ',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2006-05-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4521') +('0007697033333','HERITAGE PINE TAR SHAMPOO',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-21 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4522') +('0007697044346','HERITAGE LIQUID LANOLIN',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4523') +('0007697044379','VEGETABLE GLYCERIN',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4524') +('0007697044609','FLWR WATER,ROSE,ATMZR',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4525') +('0007697044645','FLWR WATER,LAVENDER,ATMZR',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4526') +('0007697044678','FLWR WATER,JASMINE,ATMZR',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4527') +('0007701410001','HENNA,NEUTRAL',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-12-27 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4528') +('0007701410002','HENNA,LIGHT RED',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4529') +('0007701410003','HENNA,RED',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4530') +('0007701410004','HENNA,AUBURN',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4531') +('0007701410006','HENNA,MAHOGANY',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4532') +('0007701410007','HENNA,CHESTNUT',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4533') +('0007717248000','W.V. ORGANIC AMERICAN SLICES',4.59,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','230','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4534') +('0007717248002','W.V. ORGANIC MOZZARELLA SLICES',4.59,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','230','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4535') +('0007717248004','CHEDDAR SLICES WHOLESOME VALLE',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4536') +('0007717264020','VEGAN MOZZARELLA SLICES',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-09-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4537') +('0007717264140','RICE MOZZARELLA SLICES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4538') +('0007717264142','AMERICAN RICE SINGLES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-08 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4539') +('0007717264156','rice Cheddar slices',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-02-13 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4540') +('0007717264172','RICE SLICE CHEESE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-07-11 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4541') +('0007724150060','GRN SWT DARK CHOC CHIPS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','1','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4542') +('0007724150075','CHOC CHIPS,ORGANIC',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','1','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4543') +('0007724192046','EARTH BALLS MILK CHOC',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-04-16 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4544') +('0007732000005','LIP BALM,SPF 18,VANILLA',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4545') +('0007732000006','LIP BALM,SPF 18,CHERRY',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4546') +('0007732000008','LIP BALM,SPF 18,TANGERINE',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4547') +('0007732000011','UN-PETROLEUM JELLY',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4548') +('0007732077500','UN-PETROL LIP BALM,BLAZE',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4549') +('0007732077515','UN-PETROL LIP BALM,BLOOM',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4550') +('0007732610006','TOMS CINCLOVE WHOLE CARE FL TP',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2009-05-28 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4551') +('0007732610106','PROP & MYRRH TP,SPEARMINT',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4552') +('0007732611106','FLUOR TP,WINTERMINT',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4554') +('0007732612006','TOMS ANTICAVITY BAKING SODA',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-06-08 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4556') +('0007732612106','TOMS ANTIPLAQUE BAKING SODA TP',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4557') +('0007732612704','TOMS OUT ORG MANGO KIDS TP',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-11 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4558') +('0007732612804','FLUOR TP,FLEX STRAWBERRY',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-19 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4559') +('0007732612904','TOMS SENS CARE SLS FREE TP',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-03-11 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4560') +('0007732616206','TP,TARTAR/WHITNG FENNEL',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4561') +('0007732637104','MOIST BAR SOAP.LAVENDER',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4563') +('0007732637204','MOIST BAR SOAP,UNSCENTED',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4564') +('0007732638204','DEODORANT BAR SOAP,UNSCNT',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4565') +('0007732661225','DEOD,STICK,LAVNDR,L/L',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4568') +('0007732661925','DEODORANT STICK-UNSCENTED',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4569') +('0007732662203','DEOD,ROLL-ON,LAVNDR,L/L',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4570') +('0007732662403','DEOD,ROLL-ON,UNSCT,L/L',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4571') +('0007732665525','DEODORANT STICK-CALENDULA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4572') +('0007732698030','FLOSS,ANTI PLQ,FLAT,SPRMN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4573') +('0007732698130','FLOSS,ANTI PLQ,FLAT',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4574') +('0007732698240','FLOSS,ANTI PLQ,ROUND',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4575') +('0007733026011','WATER CRACKERS,OG,ORIGNAL',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4576') +('0007733026012','WATER CRACKERS,OG,SESAME',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4577') +('0007739721455','JERUSALEM WW PITA',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4578') +('0007750201610','DELHI SAAG/SPINACH & GRNS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1569','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4579') +('0007750202610','JAIPUR KARHI,POT DUMPLING',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1569','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4580') +('0007750203610','MATAR-PANEER-PEAS/CHEESE',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1569','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4581') +('0007750214615','PUNJABI CHHOLE,CHICKPEAS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1569','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4582') +('0007750216615','DAL MAKHANI/LNTLS & BEANS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1569','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4583') +('0007765220123','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-02-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4584') +('0007790100401','BRIE PRESIDENT MINI',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-12-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4585') +('0007790100785','TOM BAS CRUMB FETA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-12-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4586') +('0007790101001','WEE BRIE PRESIDENTS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-09-04 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4587') +('0007790120004','BRIE FLEURS de FRANCE',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4588') +('0007790167000','FETA VALBRESO LIGHT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-07-01 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4589') +('0007801612344','SOYA KAAS MOZZ STYLE',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4590') +('0007801612345','SOYA KAAS MEXI-KAAS',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-12-30 03:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4591') +('0007801612346','SOYA KAAS CHED STYLE',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4592') +('0007803000013','GARLIC BASIL PESTO',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-03-04 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4593') +('0007831421175','AGAVE NECTAR,AMBER',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4594') +('0007831421235','AGAVE NECTAR 24OZ',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4595') +('0007833555524','APPLE RUSH, RASPBERRY',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2009-03-13 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4596') +('0007833555564','APPLE RUSH, CRANBERRY',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-02-21 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4597') +('0007834700152','TPASTE,CREME DE ANISE HRB',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4598') +('0007834700153','TPASTE,CREME DE MINT HERB',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4599') +('0007834700154','NG CREME DE PEPPERMINT TP',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4600') +('0007834700155','TPASTE,COOL MINT GEL,TUBE',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4601') +('0007834701181','HERBAL SHAMPOO N.G',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4602') +('0007834702161','SHAMPOO,RAINWATER HERBAL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4604') +('0007834702301','SHAMPOO,RAINWTR TEA TREE',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4605') +('0007834702302','SHAMPOO,RAINWATER AWAPUHI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4606') +('0007834702303','CONDITIONER,RAINWTR AWAPH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4607') +('0007834702306','CONDITIONER,RAINWTR TEA T',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4608') +('0007834702319','SHAMPOO,RAINWATER HEMP',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4609') +('0007834702320','CONDITIONER,RAINWTR HEMP',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4610') +('0007834703018','HERBAL CONDITIONER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4611') +('0007834703042','CONDITIONER,HERBAL',32.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4612') +('0007834703107','NGATE CHERRY GEL TP',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4613') +('0007834703282','SHAMPOO,RAINWATER BABY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','0','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4614') +('0007834704171','NG ORIGINAL MSTR LOTION',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4615') +('0007834704172','MOIST LOTION,FRAG FREE',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4616') +('0007834704175','SKIN THERAPY HEMP LOTION',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4617') +('0007834704176','SKIN THER OATMEAL LOTION',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4618') +('0007834704177','SKIN THERAPY T.TREE LOT',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4619') +('0007834755023','NG GALLON PURIFYING SOAP',45.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-03-08 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4620') +('0007834755550','STICK DEOD,SPRING FRESH',5.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4621') +('0007834755560','STICK DEOD,WINTER CLEAN',5.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4623') +('0007834755565','STICK DEOD,AUTUMN BREEZE',5.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4624') +('0007834775038','STICK DEOD,LVNDR',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4625') +('0007834775039','STICK DEOD,TT',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4626') +('0007834775040','STICK DEOD,CHAM',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4627') +('0007834775041','STICK DEOD,LMNGRS',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4628') +('0007834775047','STICK DEOD,MANDRN PATCHL',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4629') +('0007834775048','STICK DEOD,PERSMN GERANM',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4630') +('0007834775049','STICK DEOD,GRPFRT GINGR',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4631') +('0007834777438','VIT E OIL 32,000 IU',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4632') +('0007834777440','VITAMIN E OIL 40000 IU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4633') +('0007834787009','CONDITIONER,CHAMOMILE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4634') +('0007834787010','SHAMPOO,CHAMOMILE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4635') +('0007835550050','GREEK YGRT,TRAD,POMEGRAN',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4636') +('0007835551050','GREEK YGRT,TRAD,FIG',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4637') +('0007835553000','GREEK YGRT,TRAD,HNY FLV',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4638') +('0007835557000','GREEK YGRT 24 OZ. HONEY',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'499','2009-05-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4640') +('0007839102211','CAFIX INSTANT BEVERAGE',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4641') +('0007841112105','CAESARS STUFFED SHELLS,WF,GF',5.19,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'499','2009-09-09 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','2',0.00,'0','12763') +('0007841112106','CAESARS MANICOTTI, WF, GF',5.19,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2009-07-24 08:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4643') +('0007852200042','HAIR THICKENING SHAMPOO',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4644') +('0007852200044','HAIR THICKENING CONDTIONR',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4645') +('0007852200046','BODY BUILDING HAIR SPRAY',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4646') +('0007852200078','TEA TREE OIL THPY SHAMPOO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4647') +('0007852200080','TEA TREE OIL THPY CONDTNR',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4648') +('0007852201500','TPSTE,POWER SMILE NON-FLU',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4649') +('0007852201510','TPSTE,SEA FRESH',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4650') +('0007852201515','TPSTE,HEALTHY MOUTH',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4651') +('0007852201520','THPSTE, NUTRISMILE',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4652') +('0007852201549','JASON ENZYME BRIGHT MWASH',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4653') +('0007852201551','JASON ENZYME BRIGHT TOOTHPASTE',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4654') +('0007852201560','MOUTHWASH,HEALTHY MOUTH',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4655') +('0007852202005','SATIN SOAP,ALOE VERA',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4656') +('0007852202100','JASON FF SHAMPOO',8.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4657') +('0007852202101','JASON FF CONDITIONER',8.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4658') +('0007852202105','BODY WASH,ALOE',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4659') +('0007852202113','BODY WASH,LAVENDER',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4660') +('0007852203027','BODY WASH,TEA TREE',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4661') +('0007852203032','NAIL SAVER NO FUNGUS',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-12-20 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4662') +('0007852204020','TEA TREE GEL(TUBE)',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-12-20 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4663') +('0007852205005','JASON SEA KELP SHAMPOO',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4664') +('0007852205009','JASON SEA KELP CONDITIONER',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4665') +('0007852205012','JASON 5000 IU VIT E CREAM 4 OZ',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-25 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4666') +('0007852207005','NATURAL BIOTIN SHAMPOO',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4667') +('0007852207009','NATURAL BIOTIN CONDITIONR',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4668') +('0007852209025','DEODRNT,ALOE VERA STICK',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4669') +('0007852209045','DEODRNT,TEA TREE OIL STIK',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4670') +('0007852209065','DEODRNT,LAVENDER,STICK',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4671') +('0007852250005','MAKE UP REMOVER PADS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-12-20 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4672') +('0007852272001','JASON FF DEODERANT',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-12-20 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4673') +('0007878352450','PCARROT CHIPS PACKAGE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'499','2009-06-03 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4674') +('0007878352451','PCARROT SHREDDED PACKAGE',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'727','2007-10-01 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4675') +('0007878370105','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4676') +('0007878370107','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4677') +('0007878370108','PPOTATO BAG YUKON',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4678') +('0007878370112','PPOTATO BAG RED 3#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1391','2009-08-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12824') +('0007878390203','PCARROT BABY SNACK INDIV',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'866','2007-10-01 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4679') +('0007878390204','PCARROT BABY SNACK PACK',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'866','2007-10-01 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4680') +('0007878390206','PCARROT BABY 2#',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'670','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4681') +('0007891500481','SALAD SPINNER DELUXE FLOW-THRU',12.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-19 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4682') +('0007893500510','CRISPBREAD, TASTY LITE RYE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1578','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4683') +('0007893500511','CRISPBREAD, TASTY DARK RYE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1578','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4684') +('0007893500512','CRISPBREAD, SESAME RYE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1578','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4685') +('0007893500544','CRISPBREAD, FRUIT & CRUNCH',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'1578','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4686') +('0007896225268','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4687') +('0007896225302','PGRAPEFRUIT BAG 4 LB',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4688') +('0007896229020','pcarrot bag 5#',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'0','2008-08-07 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4689') +('0007900410002','GOAT MILD CHEDDAR,RAW',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-11 03:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4690') +('0007900410003','MT STERLING JACK',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4691') +('0007900410004','GOAT MOZZ MT. STERLING',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-04-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4692') +('0007900410008','FETA, Mt. STERLING',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-07-02 03:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4693') +('0007900410010','MT STERLING AGED CHEDDAR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-11-28 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4694') +('0007900410012','COUNTRY JACK CHEESE',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-04-09 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4695') +('0007912600810','FRT LEATHER,APRICOT',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4696') +('0007912600811','FRT LEATHER,MUCHO MANGO',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4697') +('0007912600830','FRT LEATHER,WILD APPLE',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4698') +('0007912600840','FRT LEATHER,GRAPE',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4699') +('0007912600860','FRT LEATHER,RASPBERRY',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4700') +('0007912600870','FRT LEATHER,CHUNKY CHERRY',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4701') +('0007912600890','FRT LEATHER,SWT STRAWBERY',0.59,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4702') +('0007912630589','SMOOSHED FRUIT, APPLE',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1524','2008-12-04 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4703') +('0007912630598','SMOOSHED FRUIT, APRICOT',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1524','2008-12-04 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4704') +('0007912630608','SMOOSHED FRUIT, RASPBERRY',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1524','2008-12-04 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4705') +('0007912630611','SMOOSHED FRUIT GRAPE',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'0','2009-05-29 08:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4706') +('0007912630627','SMOOSHED FRUIT, STRAWBERRY',0.65,'0',0.00,'0',0.39,NULL,0.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1524','2008-12-04 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4707') +('0007912635078','FRUIT LEATHER PINE COCO',0.59,'0',0.00,'0',0.39,'0',0.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1614','2008-06-23 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4710') +('0007946200458','SEA SALT COARSE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4711') +('0007947310164','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4712') +('0007947310173','PBERRY CRANBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4713') +('0007956500098','CHANDRIKA SANDALWOOD SOAP',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-02-20 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4714') +('0007956500099','CHANDRIKA SOAP',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-07-03 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4715') +('0007956500502','ANC SECRET 4 OZ SALT EUCALYPT',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-02-25 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4716') +('0007956500506','ANC SECRET 4 OZ SALT YLNG YLNG',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-02-25 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4717') +('0007956500508','ANC SECRET 4 OZ SALT PATCHOULI',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-02-25 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4718') +('0007956500510','ANC SECRET 4 OZ SALT EVERGREEN',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-03-20 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4719') +('0007956500513','ANCIENT SECRETS NETI POT',16.15,'0',0.00,'0',13.69,'0',13.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4720') +('0007956500911','EKOTEC REPLC HD TBRSH,SFT',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4721') +('0007956500912','REPLACE HEAD SOFT REFILLS',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4722') +('0007965114705','FLORA KINDERLOVE MULTI 8.5OZ',25.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4723') +('0007965114762','FLORADIX IRON PLUS HERBS',28.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4724') +('0007965114784','FLORADIX CAL MAG 8.5 0Z',28.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4725') +('0007968604413','BAMBOO SKEWERS 8',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-08 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4726') +('0007968604414','BAMBOO SKEWERS 10',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-08 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4727') +('0007981300011','BOURSIN GARLIC/HERB',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4728') +('0007985851427','BPEANUT BUTTER NON-O SMOOTH 5#',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4729') +('0007985851447','BPEANUT BUTTER NON-O CRUNCH 5#',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4730') +('0007985853226','CASHEW BUTTER,RST NS',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4731') +('0007985854264','ALMOND BUTTER,CREAMY,NS',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4732') +('0007985861264','PEANUT BUTTER,OG,SM,NS',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4733') +('0007985861284','PEANUT BUTTER,OG,CR,NS',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4734') +('0007985861464','BPEANUT BUTTER ORG SMOOTH 5#',21.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4735') +('0007985861484','BPEANUT BUTTER ORG CRUNCHY 5#',21.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-08-08 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4736') +('0007985862224','TAHINI,OG,RST,NS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-07-11 11:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4737') +('0007989666876','BATHERAPY MINERAL SALTS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4738') +('0007990000105','CANNED,WILD BLUEBERRIES',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2007-10-16 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4739') +('0007991103481','EXPEC HERBAL EXPECTORANT',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4741') +('0007991103485','EXPEC II HERBL COUGH SYRP',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4742') +('0007991103488','EXPEC CHILD',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4743') +('0007991103499','SALINE & ALOE NASAL SPRAY',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4744') +('0007997312577','MUNCHEES,VEGGIE',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4745') +('0007997320002','CHIKN FREE NUGGETS,VEG',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4747') +('0007997320007','MUNCHEES,JALAPENO',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4748') +('0007997320032','CHIKN FREE WING,SPCY,VE',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-12-12 12:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4749') +('0007998570060','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4750') +('0008001206661','THERMOS TEA TUMBLER',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4751') +('0008114600210','YGRT,FF,CASCADE BLUEBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4752') +('0008114600230','YGRT,FF,RAINIER RASPBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4753') +('0008114600240','YGRT,FF,SAN JUAN STRWBRRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4754') +('0008114600280','YGRT,FF,WILLAMET BOYSNBRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4755') +('0008114600310','CASC FRESH BLUE YOGURT 32OZ',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4756') +('0008114600420','YGRT,FF,KEY LIME',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4757') +('0008114600460','YGRT,FF,VANILLA',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4758') +('0008114600480','YGRT,FF,ORANGE CREME',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4759') +('0008126470100','Blue Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','1','0','0',0,'499','2009-08-30 10:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12833') +('0008131210178','REDWOOD HILL 32OZ. GOAT YOGURT',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-01-18 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4768') +('0008131220061','PLAIN GOAT YOGURT',2.49,'0',0.00,'0',1.69,NULL,1.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4769') +('0008131220065','BLUEBERRY GOAT YOGURT',2.49,'0',0.00,'0',1.69,NULL,1.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4770') +('0008173830306','SHIKAI HENNA GOLD SHAMPOO',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4771') +('0008173830307','SHIKAI HENNA GOLD CONDTNR',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4772') +('0008173831351','REFLECT SHAMPOO,DEEP CLR',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4773') +('0008173831352','REFLECT SHAMPOO,GOLD CLR',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4774') +('0008173831353','REFLECT SHAMPOO,PLATINUM',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4775') +('0008173831354','REFLECT SHAMPOO,WARM CLR',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4776') +('0008173831360','REFLECT COND,DAILY MOIST',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4777') +('0008173831361','REFLECT COND,MIST&GO SPRY',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4778') +('0008173831362','REFLECT COND,INTS REPAIR',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4779') +('0008173834302','HND & BDY LOTION,CUKE/MLN',7.65,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4780') +('0008173834304','HND & BDY LOTION,VANILLA',7.65,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4782') +('0008173834307','HND & BDY LOTION,AMBER',7.65,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4783') +('0008173834309','SHIKAI POMEGRANATE LOTION',7.65,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4785') +('0008173834310','SHIKAI COCONUT LOTION',7.65,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4786') +('0008173836307','SHOWER GEL,SNDLWOOD AMBER',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4788') +('0008173836310','SHIKAI SHOWER GEL COCONUT',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4789') +('0008173840201','SHIKAI CHILD DRY SKIN THERAPY',12.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4790') +('0008173840202','BORAGE THERPY ADULT FORMU',13.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4791') +('0008173840222','BORAGE THERPY ADULT FORM',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4792') +('0008259219415','NAKED STRAWBERRY BANANA',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4793') +('0008259261615','NAKED POMEGRANATE BLUE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2009-08-20 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12772') +('0008259261715','NAKED POMEGRANATE ACAI',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'499','2009-08-28 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4794') +('0008259263035','ORANGE MANGO NAKED JUICE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-04-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4795') +('0008259263087','NAKED WATERMELON CHILL',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2009-08-20 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12773') +('0008259266015','NAKED MANGO',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4797') +('0008259272015','NAKED GREEN MACHINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4798') +('0008259272215','NAKED PROTEIN ZONE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'499','2009-08-28 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4799') +('0008259272615','NAKED RED MACHINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4800') +('0008259272715','NAKED BLUE MACHINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4801') +('0008259273315','NAKED GOLD MACHINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4802') +('0008259291715','NAKED JUICE POWER C',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4804') +('0008259292015','NAKED ORANGE MANGO MOTION',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4805') +('0008259292115','NAKED STRAWBERRY KIWI KICK',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2009-03-17 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4806') +('0008259292215','NAKED BLACK & BLUEBERRY',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'499','2009-05-01 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4807') +('0008259298815','NAKED BERRY BLAST',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4808') +('0008266670010','POTATO CHIP,ORIGINAL',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-28 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4809') +('0008266670020','POTATO CHIP,BBQ',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-28 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4810') +('0008266670040','POTATO CHIP,SALT & PEPPE',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-28 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4811') +('0008266670080','POTATO CHIP,CHEDDAR',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-06-25 11:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4812') +('0008268303011','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4813') +('0008292712343','Picante Pesto',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-01-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4814') +('0008292712347','Sundried Tomato Pesto',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-01-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4815') +('0008292712348','Dairy Free Pesto',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-01-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4816') +('0008292712349','Sweet Red Pepper Pesto',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-01-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4817') +('0008300001642','NANSWER PERIO RUB',4.79,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','99','0','1','0','0',0,'0','2007-10-16 08:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4819') +('0008300001643','NA PERIOWASH',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2006-03-09 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4820') +('0008300016468','CORAL CALCIUM SUPREME',26.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4821') +('0008300026110','NANSWER LIQUID B-12',22.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4822') +('0008300026199','NANSWER GOJI 16OZ',12.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','1','0','0',0,'0','2008-09-04 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4823') +('0008300026370','NANSWER UT ANSWER 4 OZ',32.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-02-04 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4824') +('0008385120407','GREEN MAGMA USA,OG',19.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2007-04-24 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4825') +('0008405900003','GARDENBURGER,ORIG,VEG',4.45,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'499','2009-04-17 09:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4827') +('0008405900034','GARDENBURGER,BLACK BEAN',4.45,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2007-08-28 12:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4828') +('0008405900043','GARD BURGER SUND DRIED TOM',4.45,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2007-08-28 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4829') +('0008411400994','POTATO CHIPS,NY CHEDDAR',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4830') +('0008411400996','POTATO CHIPS,SALT&VINEGAR',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4831') +('0008411400997','POTATO CHIPS OG LT SALT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-08-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12814') +('0008411400998','CHIPS KETTLE L/S 5OZ',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4832') +('0008411403070','POTATO CHIPS,HONEY DIJON',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4833') +('0008411403238','KRINKLE CUTS,LIGHTY SALT',5.25,'0',0.00,'0',3.89,NULL,3.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'1541','2007-11-09 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4834') +('0008411403240','KRINKLE CUTS,SALT&PEPPER',5.25,'0',0.00,'0',3.89,NULL,3.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'1541','2007-11-09 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4835') +('0008411403260','KRINKLE CHIPS SALT PEP 2OZ',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4836') +('0008411403300','POTATO CHIPS,LIGHTLY SALT',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4837') +('0008411403320','POTATO CHIPS, NY CHEDDAR 2OZ',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4838') +('0008411410597','POTATO CHIPS OG SALT PEP',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-08-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12815') +('0008411410923','POTATO CHIPS, SPICY THAI',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4839') +('0008411410933','POTATO CHIPS, SPICY THAI 2 OZ',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-12-17 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4840') +('0008411411291','TORT CHIP, OG BLUE CORN',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4841') +('0008411411292','TORT CHIP, OG YELLOW CORN',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4842') +('0008411411338','KRINKLE CUTS,BUFFALO BLEU 20Z',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4843') +('0008411411544','POTATO CHIPS,BACKYARD BB',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-10 12:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4844') +('0008411411551','POTATO CHIPS,SWEET ONION',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-05-11 11:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4845') +('0008411411555','POTATO CHIPS,SWEET ONION',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-02-11 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4846') +('0008425312884','RICE DREAM,OG,STRAWBERRY',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4847') +('0008425321492','RICE DREAM,ORNG VAN SWIRL',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4848') +('0008425322213','RICE BEV,OG,ORIG,NONDAIRY',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1538','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4849') +('0008425322214','RICE BEV,VANILLA NONDAIRY',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1538','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4850') +('0008425322215','RICE ENRICH BEV,OG,ORIG',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1539','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4851') +('0008425322216','RICE ENRICH VAN,NONDAIRY',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1539','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4852') +('0008425322217','RICE ENRICH CHOC,NONDAIRY',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1539','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4853') +('0008425322240','RICE ENRICH BEV,OG,ORIG 3pk',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4854') +('0008425322241','RICE ENRICH VAN,NONDAIRY',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4855') +('0008425324045','SOUP,OG,NO CHICKEN BROTH',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1574','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4856') +('0008425324048','SOUP,OG,VEGETABLE BROTH',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1594','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4857') +('0008425324049','SOUP,OG,FR RNGE CHCKN BRT',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1574','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4858') +('0008425324051','SOUP,OG, BEEF BROTH',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'1574','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4859') +('0008425324068','SOUP,OG,VEGETABLE BROTH',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4860') +('0008425324069','SOUP,OG,FR RNGE CHCKN BRT',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4861') +('0008425326020','SOY ENRICH BEV,OG,ORIG',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1539','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4862') +('0008425326021','SOY ENRICH BEV,OG,VAN,ND 32Z',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1539','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4863') +('0008425326022','SOY ENRICH CHOC,NONDAIRY',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'1539','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4864') +('0008425327116','FRESH RICEDRM,OG,VANILLA',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-07-23 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4865') +('0008425327117','FRESH RICEDRM,OG,ORIGINAL',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-07-23 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4866') +('0008425328000','SOY DREAM,OG,FRNCH VANILA',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4867') +('0008425328003','SOY DREAM,OG,BUTTER PECAN',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4868') +('0008425328020','SOY DREAM,OG,VANILLA',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4869') +('0008425328046','LIL DREAM,OG,MULTIPK,VAN',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4870') +('0008425333000','BAR,CAROB COATED,VANILLA',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'499','2009-06-05 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4871') +('0008425342151','RICE DREAM,COCO MARBL FDG',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4872') +('0008425344400','DREAM PIE,CAROB COAT,VAN',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4873') +('0008425344420','DREAM PIE,CHOCOLATE',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4874') +('0008425344430','DREAM PIE,MINT',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4875') +('0008425344450','DREAM PIE,MOCHA',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4876') +('0008425344460','BAR,NUT CHOC COATED,VAN',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4877') +('0008425377771','RICE DREAM,VANILLA',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4878') +('0008425377773','RICE DREAM,COOKIE N DREAM',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4879') +('0008425377774','RICE DREAM,OG,COCO MARBL',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4880') +('0008425382855','RICE DREAM,OG,VANILLA',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4881') +('0008478349701','DR CHRIS HERBAL EYEBRIGHT',13.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-04-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4882') +('0008489202747','Le ROULE CRAN',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4883') +('0008517800039','CASE,TOOTHBRUSH',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4884') +('0008517800041','CASE,SOAP',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4885') +('0008557350020','JUUSTO PASTURE PRIDE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-03-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4886') +('0008569310100','SESAME THINS,ORIGINAL',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4887') +('0008569310104','SAVORY THINS,ORIGINAL',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4888') +('0008569310700','RICE THINS,ORIGINAL',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4889') +('0008569310702','RICE THINS,BROWN RICE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4890') +('0008569340400','AG CRACKERS,SEA SALT',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-05-05 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4891') +('0008569340404','AG CRACKERS,GARLIC HUMMU',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-05-05 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4892') +('0008569660610','PUDDING MIX,LF,CHOCOLATE',2.49,'0',0.00,'0',1.69,NULL,1.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4893') +('0008569660803','TOFU,SILKEN,SOFT,TETRA',1.95,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4894') +('0008569660804','TOFU,SILKEN,FIRM,TETRA',1.95,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4895') +('0008569660805','SILKEN TOFU EX FIRM',1.95,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','31','0','0','1','0',0,'0','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4896') +('0008583503007','DOG FOOD,MAINTENANCE 8 #',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4897') +('0008583505001','CAT FOOD,VITALITY 4 #',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4898') +('0008644930003','CRYSTAL DEOD TWIST UP',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-05-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4899') +('0008644930006','CRYSTAL DEOD ROLL ON',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-05-15 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4900') +('0008644930009','CRYSTAL DEOD SPRAY',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-05-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4901') +('0008733652897','RICE NO BOIL LASAGNA',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4903') +('0008733663330','ARTICHOKE FETTUCINE OG DEB',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4904') +('0008733663340','ARTICHOKE ANGEL HAIR,OG',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4905') +('0008761480031','BODY RESCUE PH DROP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-07-18 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4907') +('0008768300010','S.S STEEL 25OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'4908') +('0008768300019','APPLE BLOSSOM',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-25 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12991') +('0008773000000','HOT SALSA FOG CITY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-05-09 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'4910') +('0008775412001','ASPARAGUS,CRISPY,PICKLED',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-09-15 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4911') +('0008790600002','PSROUT BEAN',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'655','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4912') +('0008790600006','PSPROUTS ALFALFA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4913') +('0008799211117','VITAMIN E STICK',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4914') +('0008803310064','PCIDER PEPIN HEIGHT 1/2 GALLON',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'709','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4915') +('0008803310128','PCIDER PEPIN HEIGHTS GALLON',6.99,'0',0.00,'0',5.99,'0',5.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','552','0','0','1','0',0,'708','2008-10-08 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4916') +('0008803311064','PCIDER PH HALF GAL APPLECRAN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'709','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4917') +('0008803314064','PCIDR PEPIN HEIGHTS 1/2 GALL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'709','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4918') +('0008803320012','PCIDER PEPIN HEIGHTS SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'706','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4919') +('0008803320412','PCIDER SPARKLING PEPIN HEIGHTS',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','1','1','0',0,'707','2008-12-20 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4920') +('0008803320750','pCider Pepin Heights 750 ml',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1093','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4921') +('0008819431010','BROWN COW LF PLAIN YGRT 32',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-08-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4928') +('0008819433062','NF YOGURT,LEMON BR COW',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'499','2009-06-08 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4929') +('0008819434003','WHL MLK YGRT,BLUEBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'3500','2009-04-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4930') +('0008819434004','WHL MLK YGRT,STRAWBERRY',1.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'3500','2009-06-08 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4931') +('0008819434006','WHL MLK YGRT,COFFEE',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'3500','2009-04-16 01:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4932') +('0008819434007','WHL MLK YGRT,RASPBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'3500','2009-04-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4933') +('0008819434008','WHL MLK YGRT,APRCT MANGO',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'3500','2009-04-16 01:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4934') +('0008819434009','WHL MLK YGRT,CHRY VANILL',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'3500','2009-04-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4935') +('0008819434060','WHL MLK YGRT,PLAIN',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2007-08-28 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4936') +('0008819434061','WHL MLK YGRT,VANILLA BR COW',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'499','2009-06-08 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4937') +('0008882690150','PORANGE BAG HAMLIN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1132','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4938') +('0008882690300','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4939') +('0008882690800','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4940') +('0008909150762','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4941') +('0008909150765','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4942') +('0008909150766','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4943') +('0008909150767','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4944') +('0008909150865','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4945') +('0008912522000','WHT FREE ELBOWS',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4946') +('0008912525000','WHT FREE SPAGHETTI',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4947') +('0008912529000','WHT FREE VEGETABLE CURLS',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4948') +('0008915600136','OLIVE, BL CH STFF',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4949') +('0008915680111','OLIVES,JALAPENO,STUFFED',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4950') +('0008915680128','OLIVES,GARLIC,STUFFED',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4951') +('0008915684013','OLIVES,CAL GREEN,PITTED 6 OZ',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4952') +('0008947901107','PMUSHROOM DRY STIR FRY',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'661','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4953') +('0008947911106','PMUSHROOM DRY WOODLAND',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'662','2009-01-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4954') +('0008962252544','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4955') +('0008962290433','PLETTUCE ROMAINE HEA',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'4956') +('0008969930024','3X6 PILLAR CANDLE',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-20 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12777') +('0008983602340','VANILLA BEANS ORG',9.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2008-07-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4957') +('0008983618401','SAFFRON',14.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2009-04-14 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4958') +('0008983618667','MULLING SPICE,OG',2.15,'0',0.00,'0',1.69,NULL,1.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2008-10-16 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4959') +('0008983618807','CHEESY LASAGNE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4960') +('0008983618808','CHEESEBURGER MACARONI',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4961') +('0008983618814','CREAMY TUNA SPIRALS',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4962') +('0008983618840','DIP,OG,RANCH',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4963') +('0008983618841','DIP,OG,FRENCH ONION',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4964') +('0008983618842','DIP,OG,GUACAMOLE',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4965') +('0008983618843','DIP,OG,CREAMY DILL',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4966') +('0008983618959','SEASONING MIX OG SPC TACO',1.55,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','167','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4967') +('0008983622004','BAY LEAF PKG',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2007-10-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4968') +('0008983623176','VANILLA EXTRACT,100% OG',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4969') +('0008983623177','VANILLA EXTRACT,100% OG',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4970') +('0008983631005','ALMOND EXTRACT 2OZ ORG',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'499','2009-06-19 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4971') +('0008983631070','PEPPERMINT FLAV 20Z ORG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'4972') +('0008994730206','WAFFLES,WHEAT FREE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4973') +('0008994730214','WAFFLES,CINN APPLE,WF/GF',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4974') +('0008994730217','WAFFLES,OG,BLUEBERRY',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4975') +('0008994730218','WAFFLES,OG,ORIG,WHOLE WH',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4976') +('0008994730220','WAFFLES,WHEAT FR,BLUEBERY',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4977') +('0008994730229','WAFFLES,FLAX,WF/GF',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4978') +('0008994730232','MINI WAFFLES,WHEAT FREE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-09-24 01:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'4979') +('0009030000066','HEMP BALM, VANILLA',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-09-14 01:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12886') +('0009034112004','ROOT BEER,NAT MICRO BREW',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-03-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4980') +('0009034112121','ROOT BEER VIRGILS SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-06-18 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4981') +('0009034112345','CREAM SODA VIRGILS SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-06-18 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4982') +('0009034154321','CREAM SODA VIRGILS',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-06-18 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'4983') +('0009070000004','ARNICA TINCTURE',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-04-21 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4984') +('0009070000006','OLIVE LEAF',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4985') +('0009070000011','BLACK COHOSH',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4986') +('0009070000013','BLACK WALNUT',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4987') +('0009070000038','CHASTE TREE',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4988') +('0009070000039','CINNAMON',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4989') +('0009070000044','CRAMP BARK',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4990') +('0009070000046','DANDELION',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4991') +('0009070000049','ECHINACEA EXTRACT',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4992') +('0009070000054','HPHARM FENUGREEK 1 OZ',10.85,'0',0.00,'0',7.99,'0',7.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4993') +('0009070000055','FEVERFEW EXTRACT',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4994') +('0009070000060','GINGER EXTRACT HERBP',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4995') +('0009070000061','GINKGO EXTRACT',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4996') +('0009070000063','GOTU KOLA',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4997') +('0009070000067','GOLDENSEAL EXTRACT',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4998') +('0009070000068','HAWTHORNE HERBP',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'4999') +('0009070000074','HPHARM HORSETAIL',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5000') +('0009070000080','PHARMA KAVA 1 OZ',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5001') +('0009070000084','LEMON BALM',10.19,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5002') +('0009070000085','LICORICE EXTRACT',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5003') +('0009070000087','LOBELIA',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5004') +('0009070000088','LOMATIUM',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5005') +('0009070000094','MILK THISTLE EXTRACT',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5006') +('0009070000097','MOTHERWORT',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5007') +('0009070000099','HPHARM NETTLE',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5008') +('0009070000302','PHARMA KAVA CAPS',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5009') +('0009070000306','Therapeutic Herbal Manual',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-03-11 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5010') +('0009070000348','HPHARM OREGANO SPIRITS',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-10-19 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5011') +('0009070000353','ORAL HEALTH TONIC',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-05-01 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5012') +('0009070000355','RHODIOLA 1 OZ HERB PHARM',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5013') +('0009070000359','FEMALE LIBIDO',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5014') +('0009070000400','BLACK ELDERBERRY',10.85,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5015') +('0009070000402','HERB PHARM BREATH TONIC',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5016') +('0009070000404','HPHARM ANDROGRAPHIS 1 OZ',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-13 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5017') +('0009070000407','HPHARM IMMUNATTACK 1 OZ',10.85,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','102','0','1','0','0',0,'0','2007-10-18 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5018') +('0009070000411','HPHARM MULLEIN GARLIC 1 OZ',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5019') +('0009080000002','OSHA RT HERB PHARM',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5020') +('0009080000004','PASSIONFLOWER',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5021') +('0009080000005','PAU DARCO',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5022') +('0009080000007','HERB PHARM BUTTERBUR',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5023') +('0009080000014','HPHARM RED RASPBERRY 1 OZ',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-10-18 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5024') +('0009080000015','RED CLOVER',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5025') +('0009080000024','ELEUTHERO EXTRACT SIB GINSENG',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5026') +('0009080000025','ST. JOHNS WORT EXTRACT',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5027') +('0009080000033','SUPER ECHINACEA EXTRACT',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5028') +('0009080000037','USNEA HERB PHARM',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5029') +('0009080000038','UVA-URSI HERB PHARM',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5030') +('0009080000039','VALERIAN EXTRACT',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5031') +('0009080000042','GINSENG CHINESE',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5032') +('0009080000048','WORMWOOD',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5033') +('0009080000053','YOHIMBE',12.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5034') +('0009080000071','PEPPERMINT SPIRITS',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5035') +('0009080000075','HPHARM BL ELD GLYCERITE',10.85,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5036') +('0009080000081','SUPER ECHIN 4OZ',44.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5037') +('0009080000090','ASTRAGALUS',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5038') +('0009090000002','NERVOUS SYSTEM',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5039') +('0009090000004','HPHARM FLEX JOINT',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5040') +('0009090000005','TRAUMA OIL',9.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5041') +('0009090000006','HPHARM DERMAL HEALTH',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-10-31 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5042') +('0009090000011','HEALTHY LIVER TONIC',10.85,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5043') +('0009090000013','IMMUNE DEFENSE',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5044') +('0009090000014','ECHINACEA-GOLDENSEAL COMP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5045') +('0009090000015','ADRENAL SUPPORT',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5046') +('0009090000017','EYEBRIGHT-NETTLE COMPOUND',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5047') +('0009090000019','BRAIN & MEMORY TONIC',10.85,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5048') +('0009090000020','MALE VITALITY',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5049') +('0009090000027','HPHARM LIQ LIGHTNING 1 OZ',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5050') +('0009090000029','VIRATTACK LOMATIUM ST. JOHN',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5051') +('0009090000032','HLTHY MENOPAUSE',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5052') +('0009090000037','SPILANTHES/USNEA TINCTURE',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5053') +('0009090000039','CONNECTIVE TISSUE',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5054') +('0009090000041','RELAXING SLEEP TONIC',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5055') +('0009090000048','GOLDEN ECH',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5056') +('0009090000049','PROP ECHINACEA THRT SPRAY',10.85,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5057') +('0009090000052','GOOD MOOD',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5058') +('0009090000060','AF-GOLDEN ECHENACEA',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5059') +('0009090000062','GLYCERITE(AF) ECHINACEA',10.39,'0',0.00,'0',9.39,NULL,9.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5060') +('0009090000064','GLYCERITE(AF) GOLDENSEAL',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5061') +('0009090000069','GLYCERITE(AF) VALERIAN',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-03 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5062') +('0009090000070','GLYCERITE(AF) ECHIN-CHILD',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-07-30 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5063') +('0009090000080','ARNICA OIL',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5064') +('0009090000083','TEA TREE OIL',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-12-11 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5065') +('0009112080005','PONION PEARL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5066') +('0009132100001','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5067') +('0009132100002','PGRAPEFRUIT BAG 5#',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'735','2008-10-20 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5068') +('0009132100003','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5069') +('0009132100004','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5070') +('0009132100005','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5071') +('0009232500001','BBQ SAUCE,ORIGINAL',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5073') +('0009232500006','WORCESTERSHIRE SAUCE,OG',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5074') +('0009232511111','DRESSING,GODDESS 16OZ',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5075') +('0009232511112','VINGRT,SHIITAKE & SESAME 16OZ',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5076') +('0009232511118','DRESSING,COW GIRL RANCH',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2009-08-27 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12820') +('0009232511119','DRESSING ITALIAN LIGHT 16OZ',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5077') +('0009232522221','MUSTARD,OG,HORSERADISH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5078') +('0009232522224','MUSTARD,OG,YELLOW',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5079') +('0009232522225','KETCHUP OG ANNIE',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5080') +('0009232533310','VINGRT,ROASTED RED PEPPER',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5081') +('0009232533312','DRESSING,OG,V/F,GRN GARLC',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5082') +('0009232533314','VINGRT,OG,SES/GNGR W/CHAM',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5083') +('0009232533317','DRESSING, OG CAESAR',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5084') +('0009232533319','VINGRT,HONEY MUSTARD,LF',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5085') +('0009232533320','VINGRT,TUSCANY ITALIAN',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5086') +('0009232533323','DRESSING, OG, THOUSAND I',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5087') +('0009232533324','DRESSING,OG, FRENCH',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5088') +('0009232533325','DRESSING,OG,BUTTERMILK',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5089') +('0009232533331','VINGRT,RASPBERRY,LF',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5090') +('0009232533332','VINGRT,BALSAMIC',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5091') +('0009232533335','VINGRT SHIITAKE SESAME NON-O',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5092') +('0009232533336','DRSG GODDESS NON-O ANNIES',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5093') +('0009232533338','DRESSING COWG RANCH NON-O AN',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5094') +('0009232533345','DRESSING,OG,PAPAYA POPPY',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5095') +('0009232533348','DRESSING,ARTICHOKE PARMS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1588','2008-11-20 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5096') +('0009232533351','DRESSING,OG, COW GIRL RANCH',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5097') +('0009232533352','DRESSING,OG, GODDESS',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5098') +('0009232533353','DRESSING,OG,SHIITAKE AND SES',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5099') +('0009232533357','DRESSING, OG, CREAMY ASIAGO',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5100') +('0009232533360','VINGRT, OG, POMEGRANATE',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1510','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5101') +('0009232591010','PTANGERINE BAG MINNEOLA',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'634','2007-09-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5102') +('0009265700903','GET REAL SOAP MINT',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2007-09-20 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5103') +('0009284685962','COMMUNITIES MAGAZINE',7.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-04-17 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5104') +('0009370910030','COOKIES GINGER ALM WF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5105') +('0009370910040','COOKIES,PNUT BUTTER,WF/GF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5106') +('0009370910070','COOKIES,CHNKY CHOC CHP,WF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5107') +('0009370910100','SHORTBREAD,PECAN,WF/GF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5108') +('0009370910130','SHORTBREAD,SWIRL(VN&CH)WF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5109') +('0009370910150','SHORTBREAD,LEMON,WF/GF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5110') +('0009370912036','BISCOTTI, W/F, G/F, CHOC WAL',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5111') +('0009370930010','PANCAKE&BAKING MIX,WF/GF 24Z',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'mixmatchcode','2009-04-09 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5112') +('0009370930030','BROWNIE MIX,CHOC,WF/GF',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5113') +('0009370930040','CAKE MIX,LUSCIOUS CHOCLTE',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5114') +('0009370930060','BREAD MIX,AMAZING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5115') +('0009370930410','PANCAKE&BAKING MIX 4LB',18.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'mixmatchcode','2009-04-09 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5116') +('0009370940180','COOKIES,PNT BTR W/CHOC CH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5117') +('0009370950010','SIMPLE BITES CHOC CHIP',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5118') +('0009370950020','SIMPLE BITES GINGER',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5119') +('0009370950030','SIMPLE BITES,EXTREME CHOC',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5120') +('0009393673223','FETA IN OIL',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5121') +('0009393673604','BLUE CHEESE IN OIL',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5122') +('0009396600005','ORGANIC VALLEY STRINGLE',0.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-12-27 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5123') +('0009396600013','EGGNOG OG 32Z ORG VAL',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-10-30 09:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5124') +('0009396600014','MILK,OG,HTST,FRESH,WHOLE 128Z',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-09-09 11:03:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5125') +('0009396600015','MILK,OG,HTST FRESH,1%,LF 128Z',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-09-09 11:03:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5126') +('0009396600016','MILK,OG,HTST FRESH,2% 128Z',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-09-09 11:03:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5127') +('0009396600017','MILK,OG,HTST FRESH,NONFAT 128Z',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'499','2009-09-09 11:03:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5128') +('0009396600021','MILK,OG,UHT,2%,RDCD FAT 32Z',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5129') +('0009396600022','MILK,OG,UHT,NONFAT 32Z',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5130') +('0009396600028','OV HEAVY WHIP PINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5131') +('0009396600029','MILK,OG,UHT,CHOC,RDCD FAT 32Z',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5132') +('0009396600030','MILK,OG,UHT,CHOC,RDCD FAT 64Z',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5133') +('0009396600032','MILK,OG,1%,HTST,FRESH 64Z',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5134') +('0009396600033','HALF & HALF,OG,UHT QT',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5135') +('0009396600034','OV WHIPPING CREAM HALF PINTS',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5136') +('0009396600035','MILK,OG,UHT,LACTOSE FR,LF 64Z',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5137') +('0009396600036','MILK,OG,UHT,LACTOSE FR,LF 32Z',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5138') +('0009396600052','O.V. SWISS,BABY,PASTURIZED',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5139') +('0009396600078','JCE,OG,ORANGE,PULP-FR,CAL',7.19,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5140') +('0009396600079','JCE,OG,ORANGE,W/ PULP',7.19,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5141') +('0009396600080','JCE,OG,ORANGE,PULP FREE',7.19,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5142') +('0009396600085','BUTTERMILK OG 1% 32Z OV',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5143') +('0009396600086','DRY MILK,OG,BUTTERMILK',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-14 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5144') +('0009396600090','MILK,OG,UHT,1%,LF 32Z',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5145') +('0009396600091','MILK,OG,UHT,WHOLE 32Z',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5146') +('0009396600109','ORGANIC PRAIRIE GRND BEEF',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-06-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5147') +('0009396600126','ORGANIC PRAIRIE GRND BEEF',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5148') +('0009396600160','ORGANIC PRAIRIE GRND TURKEY',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-03-30 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5149') +('0009396600200','SOY BEVERAGE,OG,ORIGINAL',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5150') +('0009396600201','SOY BEVERAGE,OG,VANILLA',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5151') +('0009396600202','SOY BEVERAGE,OG,CHOC',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5152') +('0009396600203','COTTAGE CHEESE,OG,4%',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5153') +('0009396600204','COTTAGE CHEESE,OG,LF,2%',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5154') +('0009396600205','SOUR CREAM,OG,4%',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5155') +('0009396600206','SOUR CREAM,OG,LOW FAT',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5156') +('0009396600211','ORGANIC VALLEY BLUE CRUMBLES',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-12-13 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5157') +('0009396600214','ORGANIC VALLEY STRINGLE',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-16 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5158') +('0009396600216','STRINGLES COLBY JACK',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-16 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5159') +('0009396600219','ORGANIC VALLEY RICOTTA',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-11-15 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5160') +('0009396600220','LACT FREE SKIM MILK 64Z',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5161') +('0009396600222','ASEPTIC MILK,OG,SNGL,LF',1.55,'0',0.00,'0',0.89,'0',0.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2006-09-14 03:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5162') +('0009396600223','ASEPTIC MILK,OG,SNGL,CHOC',1.55,'0',0.00,'0',0.89,'0',0.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2006-09-24 05:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5163') +('0009396600226','ORG VALLEY UNSW SOYMILK',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','32','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5164') +('0009396600227','ORGANIC VALLEY MEXICAN BLEND',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5165') +('0009396600228','PARM ORGANIC VALLEY',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-03-22 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5166') +('0009396600232','ASEPTIC MILK, OG,LF 4/8 0Z',6.19,'0',0.00,'0',3.19,NULL,3.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2006-09-14 02:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5167') +('0009396600233','ASEPTIC MILK,OG,CHOC 4PK',6.19,'0',0.00,'0',3.19,NULL,3.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','166','0','0','1','0',0,'0','2007-05-14 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5168') +('0009396600385','ORGANIC VALLEY PASTURE BUTTER',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2008-10-27 11:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5170') +('0009396611310','CHED RAW MILD ORGANIC VALLEY',6.39,'0',0.00,'0',5.69,'0',5.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','230','0','0','1','0',0,'499','2009-07-23 03:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5171') +('0009396611320','O.V. CHEDDAR,SHARP,RAW',6.39,'0',0.00,'0',5.69,'0',5.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','230','0','0','1','0',0,'499','2009-08-30 06:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5172') +('0009396611330','ORGANIC VALLEY RAW JACK WI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-06 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5173') +('0009396613000','BUTTER,OG,N/S,CULT,STICKS',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2007-04-24 06:00:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5174') +('0009396615205','O.V. PARMESAN,OG,SHRED(CUP)',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5175') +('0009396621101','ORGANIC VALLEY CREAM CHEESE',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5176') +('0009396621301','ORGANIC VALLEY FETA',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5177') +('0009396621340','COLBY ORGANIC VALLEY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-03-03 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5178') +('0009396621350','ORGANIC VALLEY MUENSTER',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-10-11 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5179') +('0009396621360','ORGANIC VALLEY PEPPERJACK',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5180') +('0009396621390','ORGANIC VALLEY PROVOLONE',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5181') +('0009396622101','ORGANIC VALLEY NEUFCHATEL',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5182') +('0009396622330','M JACK RED FAT ORGANIC VALLEY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-03-03 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5183') +('0009396624310','CHED RFRS ORGANIC VALLEY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-03-22 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5184') +('0009396625370','ORGANIC VALLEY MOZZARELLA',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5185') +('0009396630294','BEEF JERKY,OG,CLASSIC ML',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-08-06 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5186') +('0009396633000','BUTTER,OG,SLTD,STICKS',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2007-04-24 06:00:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5187') +('0009396641210','O.V. SHREDDED MILD CHEDDAR',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-02-23 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5188') +('0009396645270','OV SHREDDED MOZZARELLA',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2006-02-23 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5189') +('0009396647208','o.v. ITALIAN 4 CHEESE BLEND',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-02 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5190') +('0009396651015','MILK,OG,WHOLE,HTST,FRESH 64Z',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5191') +('0009396651052','HALF & HALF,OG,UHT 16Z',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5192') +('0009396651225','MILK,OG,2%,HTST,FRESH 64Z',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5193') +('0009396651245','MILK,OG,NF,HTST,FRESH 64Z',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5194') +('0009396651400','ORG VALLEY 1% HALF GALLON MILK',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5195') +('0009396651600','ORG VAL FAT FREE MILK 1/2 GAL',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2009-01-14 05:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5196') +('0009396661410','DRY MILK,OG,NON-FAT',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5197') +('0009396681111','OV EGG WHITES',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5198') +('0009396681112','ORGANIC VALLEY XL OMEGA EGGS',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-11-24 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5199') +('0009396681120','EGGS,OG,GR A,LRG,BROWN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-04-17 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5200') +('0009396681121','EGGS,OG,GRD A,LRG,BRN 6PK',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-11-13 04:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5201') +('0009396681170','EGGS,OMGA3,OG,BRN,LG,GR A',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5202') +('0009396690013','PTOMATO CHERR YELL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5203') +('0009396690014','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5204') +('0009396690020','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5205') +('0009396690034','PPOTATO BAG YUKON',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5206') +('0009471700138','VITAMIN BIBLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5207') +('0009471700169','MACROBIOTIC WAY',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-09-25 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5208') +('0009471700277','SUPER-IMMUNITY FOR KIDS',17.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12901') +('0009471700312','DICTIONARY OF FOOD ADDITIVES',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-19 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5209') +('0009471700322','NATURAL HEALTH FOR CATS & DOGS',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-09 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5210') +('0009471700325','EVERYBODYS GUIDE HOMEO MED',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-03-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5211') +('0009471700350','THE MASTER CLEANSER',6.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5212') +('0009471700378','YEAST CONNECTION COOKBOOK',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5213') +('0009471700621','NATURAL WEIGHT CONTROL',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-12-19 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5214') +('0009471700662','ORG PEST CONTROL',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-03-28 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5215') +('0009471700676','SPROUTING BOOK',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-07-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5216') +('0009471700755','CLEAN AND GREEN',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5217') +('0009471704833','CONSUMERS DICT OF COSMETIC',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-05-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5218') +('0009471710598','DOCTOR MAY NOT...CHILDRENS VAC',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-07-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5220') +('0009471712159','COMPLETE BOOK OF ESSENTIAL OIL',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-09 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5223') +('0009471712187','JUICE FASTING DETOX',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-10-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5224') +('0009471719834','HEALING WITH WHOLE FOODS',35.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12903') +('0009471720400','SPROUTMAN KITCHEN GARDEN',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'mixmatchcode','2009-03-09 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5225') +('0009471721629','BODY ECOLOGY DET',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5227') +('0009471725991','NEW GOOD FOOD',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-09 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5228') +('0009471726178','BREAST HEALTH',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12905') +('0009471728184','CANDIDA CONTROL COOKBOOK',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5229') +('0009471728193','CANDIDA ALBICANS QUIET EPIDEMI',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-03-28 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5230') +('0009471729293','BOOK-WHAT DOC WONT TELL M',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5231') +('0009471731495','AROMATHERAPY, ESSENTIAL',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-10-17 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5233') +('0009471732015','HERBS FOR DETOX',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-09-20 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5234') +('0009471732177','ADD AND ADHD DIET',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5235') +('0009471733547','HEALTHY HEALING',32.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-02-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5236') +('0009471733628','SPROUTMAN SPROUT CHART',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-05-23 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5237') +('0009471734504','WHAT YOUR DR...PREME',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5238') +('0009471734518','STEVIA SWEET RECIPES',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-10-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5239') +('0009471734971','LIVING IN THE RAW',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-07-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5241') +('0009471735206','HERBAL ANTIBIOTICS',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-08-08 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5242') +('0009471735207','HERBAL REMEDIES FOR KIDS',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5243') +('0009471735265','A-Z GUIDE/ DRUG-HERB-VIT INTER',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-06-07 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5244') +('0009471735572','STEVIA COOKBOOK',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2004-10-19 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5245') +('0009471735639','DETOX FIVE DZ WAYS',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-11-20 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5246') +('0009471736518','NAT NUTRI FOR DOGS AND CATS',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-09 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5247') +('0009471736801','HOMEOPATHIC CARE CATS N DOGS',25.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5249') +('0009471737170','WHY AM I ALWAYS SO TIRED',14.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5250') +('0009471737408','SPONTANEOUS HEALING POCKETBK',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5251') +('0009471740261','THE EXPECTANT MOTHERS',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5253') +('0009471740541','BLOOD TYPE A LIST',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-02-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5256') +('0009471740542','BLOOD TYPE AB LIST',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-02-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5257') +('0009471740598','WHAT YOUR DR...CHILD VAC',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5258') +('0009471740831','APPLE CIDER VINEGAR',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5259') +('0009471741010','HOMEOPATHIC REMEDIES',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-09-25 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5260') +('0009471741130','ADRENAL FATIGUE',14.95,'0',0.00,'0',12.99,'0',12.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','244','0','1','0','0',0,'0','2009-08-25 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1','0','9',0.00,'0','12795') +('0009471741575','AROMATHERAPY A-Z',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5261') +('0009471741829','pH Paper Refill',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5262') +('0009471742412','ACID ALKALINE DIET',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-07-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5263') +('0009471743714','PH MIRACLE THE',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-10-17 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5265') +('0009471743858','DEFEATING DIABETES',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5266') +('0009471743961','GLUTEN FREE GOURMET DESSERT',18.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5267') +('0009471744440','RODALES ENC ORG GARDEN',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-03-28 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5268') +('0009471745290','WILD FERMENTATION',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-10-26 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5269') +('0009471747122','BABY SIGN LANG BASICS',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-06-07 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5271') +('0009471748327','ORGANIC FOOD GUIDE',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-05-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5273') +('0009471750064','DEEP INTERNAL CLEANS',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-01-11 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5276') +('0009471750889','LOSE WEIGHT MORE ENERGY',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5279') +('0009471751336','NETI POT, BETTER HEALTH',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-09-20 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5280') +('0009471751551','GREEN FOR LIFE',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-02-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5281') +('0009471752076','THE HEALTHY LUNCHBOX',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-08-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12797') +('0009471752357','NATURALLY CLEAN',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5282') +('0009471753000','PRES/NUT HEAL4',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-10-19 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5283') +('0009471753088','WOMENS BODIES WOMENS WISDOM',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5284') +('0009471753170','SIMPLY GREEN',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-02-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5285') +('0009471753654','KID FRIENDLY ADHD AUTISM CKBK',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-02-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5286') +('0009471753697','WISDOM OF MENOPAUSE',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5287') +('0009471754184','COMPOST',18.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-09 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5289') +('0009471755196','FOOD LOVERS COMPANION',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5291') +('0009471755226','COOKING WHOLE FOODS WAY',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2007-09-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5292') +('0009471755397','LAURELS KITCHEN BREAD BOOK',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-16 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5293') +('0009471755934','UPRISINGS',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5294') +('0009471756159','THE WONDER OF PROBIOTICS',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12900') +('0009471756170','APPLE CIDER VINEGAR',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-28 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5296') +('0009471756458','PH HOME TEST KIT',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-08-05 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5297') +('0009471756523','NATURAL ALTERNATIVES TO VACCIN',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5298') +('0009471756595','PAIN FREE',17.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5299') +('0009471756641','HOMEO HNDBK NATURAL REMEDIES',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-09-25 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5300') +('0009471757469','NOURISHING TRADITIONS',27.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5301') +('0009471757475','COMPLETE MASTER CLEANSER',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-28 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5302') +('0009471757492','PRESCRIPTION ALTERNATIVES',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-18 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5303') +('0009471757523','CEREAL KILLER',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-28 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5304') +('0009471757524','BAKING WITH AGAVE NECTAR',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-16 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5305') +('0009471757527','SUNSHINE AND VITAMIN D',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-16 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5306') +('0009471757826','FOOD MATTERS',25.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-09 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5310') +('0009471757829','SMART MED FOR CHILDREN',25.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5311') +('0009471757884','ORGANIC GARDENING',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-09 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5312') +('0009471758116','THE MENOPAUSE THYROID SOLUTION',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12906') +('0009471758143','DETOX 5DOZEN WAYS',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-28 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5313') +('0009471758820','CONSUMERS DICTIONARY OF FOOD A',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12880') +('0009471758821','LUNCH LESSONS',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-08-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12796') +('0009471758829','WHY OUR HEALTH MATTERS',25.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12902') +('0009471759166','PRESCR FOR NUTRL HEALING',29.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-10 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12867') +('0009471759766','THE RAW FOOD DETOX DIET',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12904') +('0009484125414','NASAL SPRY,SIMILASAN,15ML',14.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5314') +('0009484130014','EYE DROPS #1,DRY EYES',14.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5315') +('0009484130024','EYE DROPS #2,ALLERGY EYES',14.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5316') +('0009484130034','SIMILASAN PINK EYE RELIEF',14.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5317') +('0009492210299','BEVERAGE,HIBISCUS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-07-03 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5318') +('0009492219949','RELAXITY SINGLE WILD BERRY',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12911') +('0009492220064','BEV,HIBISCUS W/BLACKBERR',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-07-17 08:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5319') +('0009492221482','Valencia Oranges',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','201','0','0','1','0',0,'0','2009-04-25 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5320') +('0009492222820','RELAXITY SINGLE TANGY ORANGE',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-09-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12912') +('0009492255614','IONIC COLLOIDAL SILVER 32 OZ',22.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-08-19 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5321') +('0009492258242','TOUCH THE SOIL MAG',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-05-12 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5322') +('0009492265298','IONWORKS COL SILV NAS SPRY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5323') +('0009492278237','GROWERS TEA MCDONALD',22.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-04-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'5324') +('0009492279996','pblueberry',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5325') +('0009492298278','BEV,HIBISCUS W/LIME',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-07-03 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5326') +('0009511381911','WILD RICE, WOOD PARCHED',12.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','163','0','0','1','0',0,'0','2008-10-28 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5327') +('0009523980080','TEECCINO MOCHA',9.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2009-01-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5328') +('0009548810002','TRINIDAD HABANERO SAUCE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-01-28 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5329') +('0009548810003','TRINIDAD EXTRA HOT SAUCE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-12-08 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5330') +('0009550816043','BABY STARTER KIT,TRIAL SZ',12.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2009-07-17 08:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5331') +('0009550816101','CALENDULA BABY CREAM',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5332') +('0009568430010','EVAPORATED MILK',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5333') +('0009568430012','CONDENSED MILK,OG,SWEETND',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2007-10-16 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5334') +('0009568488884','CHUNK LIGHT TUNA,NO SALT',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5335') +('0009568488885','CHUNK LIGHT TUNA,SALTED',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5336') +('0009649910012','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5337') +('0009649910230','PCELERY BUNCH',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5338') +('0009649933350','SORBET,OG,STRAWBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5339') +('0009649933351','SORBET,OG,BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5340') +('0009649933353','SORBET,OG,LEMON',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5341') +('0009649933354','SORBET,OG,MANGO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'5342') +('0009649933449','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5343') +('0009649933450','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5344') +('0009693101005','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5345') +('0009693102005','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5346') +('0009746703057','SOURCE OF LIFE 90T',28.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5347') +('0009746703086','SOURCE OF LIFE CHEW',21.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5348') +('0009746704570','SPIRUTEIN CHOCOLATE',23.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5349') +('0009746704573','SPIRUTEIN STRAWBERRY',23.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5350') +('0009746704580','SPIRUTEIN VANILLA',23.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5351') +('0009746704841','NPLUS ULTRA HAIR',20.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5352') +('0009746704925','NPLUS GLU CHON MSM CREAM',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5353') +('0009746706222','NPLUS VAGINOL TEA TREE CREAM',15.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','0','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5354') +('0009746706620','THURS PLANTATION SUPPOSITORIES',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','0','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5355') +('0009746706685','NPLUS FOOT POWDER',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5356') +('0009746706692','NPLUS ZERO LICE REMOVAL KIT',21.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5357') +('0009746706700','TEA TREE CHEW STICKS',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5358') +('0009746706702','NPLUS CINNAMON TOOTHPICKS',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-12-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5359') +('0009746707100','AMERICAN GINSENG',17.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5360') +('0009746707112','ASTRAGALUS',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5361') +('0009746707116','NPLUS BILBERRY',18.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-06-03 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5362') +('0009746707192','NPLUS GUGGULIPID 60CT',25.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5363') +('0009746707196','GYMNEMA SYLVESTRE',23.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5364') +('0009746707200','ENLISH HAWTHORN',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5365') +('0009746707224','LICORICE',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5366') +('0009746707228','MILK THISTLE',22.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5367') +('0009746707232','NETTLE CAP NP',8.85,'0',0.00,'0',6.65,'0',6.65,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5368') +('0009746707234','OLIVE LEAF',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5369') +('0009746707272','ELEUTHERO SIBERIAN GINSENG',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5370') +('0009746707276','ST JOHNS WORT CAP NP',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5371') +('0009746707284','TUMERIC CAP NP',18.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5372') +('0009746707292','VALERIAN RT CAP NP',17.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5373') +('0009746707360','NPLUS RED YEAST RICE EXT REL',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5374') +('0009746707361','NPLUS RED YEAST RICE 60CT',34.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5375') +('0009746707370','NPLUS REVERATROL 125MG EXTREL',24.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-29 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5376') +('0009746729947','NPLUS AN PARADE TUMMYZYME',18.49,'0',0.00,'0',15.65,'0',15.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'499','2009-09-17 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','5',0.00,'0','12914') +('0009746729948','NPLUS AN PARADE TOOTH FAIRY',18.49,'0',0.00,'0',15.65,'0',15.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'499','2009-09-17 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','5',0.00,'0','12913') +('0009746729949','NPLUS INNER EAR AN PARADE 90CT',15.65,'0',0.00,'0',13.29,'0',13.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-08-28 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','5',0.00,'0','12825') +('0009746729958','ANIMAL PARADE GUMMIE 50CT',18.39,'0',0.00,'0',15.59,'0',15.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5377') +('0009746729965','NPLUS AN PARADE TOOTHPASTE',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5378') +('0009746729967','NPLUS VITAGELS 90 CT',20.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5379') +('0009746729968','NPLUS KIDSGREENZ 90CT',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5380') +('0009746729978','NPLUS AN PARADE IMMUNE BOOSTER',9.59,'0',0.00,'0',8.15,'0',8.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5381') +('0009746729980','ANIMAL PARADE ASSORT 90CT CHEW',11.39,'0',0.00,'0',9.65,'0',9.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'mixmatchcode','2009-03-18 09:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5382') +('0009746729982','NPLUS AN PARADE MULTI 180 CT',20.35,'0',0.00,'0',17.29,'0',17.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'mixmatchcode','2009-02-26 09:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5383') +('0009746729996','ANIMAL PARADE CALCIU',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5384') +('0009746729998','ANIMAL PARADE VIT C',7.95,'0',0.00,'0',6.75,'0',6.75,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5385') +('0009746729999','NPLUS DHA 4 KIDS 90CT',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5386') +('0009746730592','SOURCE OF LIFE CAP',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5387') +('0009746730595','NPLUS SOURCE O LIFE SHAKE',25.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5388') +('0009746730597','NPLUS SOURCE O LIFE SHAKE SNG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5389') +('0009746730601','SOURCE OF LIFE LIQUID',36.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5390') +('0009746745821','VANILLA SPIRUTEEN PK',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5391') +('0009746745831','CHOC SPIRUTEEN PKT',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5392') +('0009746745841','STAW SPIRUTEEN PKT',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5393') +('0009746745860','NPLUS ACAI PROTEINPOWDER 1.2LB',29.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-29 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5394') +('0009746745881','SIMPLY NAT SPIRUTEIN',23.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5395') +('0009746795882','SIMPLY NATUR SPIRUTE',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-11-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5396') +('0009746799634','NPLUS ACAI PROTEIN POWDER SNGL',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-29 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5397') +('0009809150865','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5398') +('0009812901041','ETHICAL NUT ZINC STATUS 4 OZ',22.25,'0',0.00,'0',14.45,'0',14.45,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','101','0','1','0','0',0,'0','2008-02-28 03:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5399') +('0009830410010','CROUTONS,GARLIC & BUTTER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5400') +('0009830410050','CROUTONS,GARDEN HERB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5401') +('0009830420037','STUFFING MIX, TRADNL HERB',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5402') +('0009830420038','STUFFING MIX, CRANBRY HERB',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2007-08-02 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5403') +('0009830800280','CHICKEN BASE,OG',6.15,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'0','2008-12-12 09:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5404') +('0009830800283','BEEF BASE,OG',6.15,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'0','2008-12-12 09:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5405') +('0009830822581','NO CHICKEN BASE, VEGAN',5.39,'0',0.00,'0',4.39,'0',4.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','175','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5406') +('0009999999954','TEST ITEM',1.97,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','800','0','0','0','0',0,'499','2009-08-20 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',0.00,NULL,'5407') +('0010328020000','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5408') +('0010333822233','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5409') +('0011182620001','CREME FRAICHE',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5410') +('0011453001605','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5411') +('0013338300900','PAPPLE BAG RED DEL.',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5412') +('0013338300960','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5413') +('0013338301028','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5414') +('0013499904131','CHEVRE GOAT 4 PEPPR',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5415') +('0016275009994','CURDS WHITE EICHTEN',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5416') +('0016783109359','PFLOWER HELICONIA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5417') +('0016783138045','PFL FRESH BOUQUET',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5418') +('0017511960220','ENER-G RICE PIZZA SHELL',11.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-08-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5419') +('0018233001114','PDAIKON SPROUTS NON-O',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1176','2007-03-22 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5420') +('0018274100001','CRACKLEBRED, GF, ORIG',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5421') +('0018340500007','PET GILL CALM ORANGE 8 0Z',19.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5422') +('0018677000051','ICED FT VANILLA LATTE',2.65,'0',0.00,'0',2.15,'0',2.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','188','0','0','1','0',0,'0','2009-01-07 01:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5423') +('0018677000057','ICED FT ESPRESSO',2.65,'0',0.00,'0',2.15,'0',2.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','188','0','0','1','0',0,'0','2009-01-07 01:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5424') +('0018713200002','ALAFFIA COCONUT OIL CREAM',12.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5425') +('0018713200005','ALAFFIA SHEA FACE CREAM',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5426') +('0018713200009','ALAFFIA UNSC SHEA BUTTER',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5427') +('0018713200012','ALAFFIA BLACK SOAP UNSC GAL',75.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-03-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5428') +('0018713200065','ALAFFIA COCOA BUTTER CREAM',12.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-12-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5429') +('0018713200067','ALAFFIA SHEA CREAM SAV RAIN',12.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5430') +('0018713200121','ALAFFIA DAILY HYDR SHAMPOO',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5431') +('0018713200131','ALAFFIA DAILY HYDR COND',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5432') +('0018713200181','ALAFFIA SHEA FACE CLEANSER',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5433') +('0018713200182','ALAFFIA SHEA FACE TONER',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5434') +('0018713200500','ALAFFIA EVERYDAY SHEA UNSC32OZ',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-09-21 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12960') +('0018713200501','EVERYDAY SHEA LAVENDER 32 OZ',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5435') +('0018713200502','EVERYDAY SHEA VANILLA 32 OZ',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'5436') +('0018824400014','QUINOA, OG, RED',6.95,'0',0.00,'0',3.99,'0',3.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','163','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'5437') +('0020000300000','BMILK POWDER NONFAT ORGANIC',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-10-23 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5438') +('0020000500000','BTAHINI OG RSTD NO SALT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','8','0','0','1','0',0,'0','2005-12-14 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5440') +('0020002000000','Free Coffee','-1.50','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','0','0','0',0,'0','2008-07-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5441') +('0020005000000','BAKERY SPECIAL ORDER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','75','0','2','1','0',0,'0','2006-05-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5442') +('0020006000000','COFFEE CARD','-1.25','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2008-07-29 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5443') +('0020010000000','SANDWICH CARD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5444') +('0020020000000','DELI SPECIAL ORDER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','73','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5445') +('0020023000000','TEA HOT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-04-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5446') +('0020030000000','CHEESE SPECIAL ORDER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','233','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5447') +('0020050000000','TVP CHILI QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5448') +('0020060000000','COFFEE CARD','-1.25','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5449') +('0020065000000','PESTO DRIED TOMATO & GARLIC',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-02-04 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5450') +('0020080000000','BASIL VINEGARETTE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5451') +('0020089000000','WILD RICE PILAF',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-08-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5452') +('0020098000000','FLORENTINE BURGER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','2006-09-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5453') +('0020120000000','SOUP 8 OZ.',2.29,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','0','0',0,'-1','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5454') +('0020130000000','SOUP 12 OZ',3.25,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','0','0',0,'-1','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5455') +('0020140000000','SOUP 16 OZ',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','0','0',0,'-1','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5456') +('0020170000000','SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','0','0',0,'-1','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5457') +('0020180000000','CURRIED PEAS & TOFU',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5458') +('0020190000000','CAJUN BEANS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5459') +('0020199800000','BAKED GOOD',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2005-07-13 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5460') +('0020200000000','BARLEY AND CORN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5461') +('0020220000000','BLACK OLIVE DIP',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5462') +('0020230000000','TEA HOT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5463') +('0020250000000','THAI GOOD LUCK SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5464') +('0020260000000','SESAME SWEET & SOUR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5465') +('0020270000000','FIERY TOFU FAJITA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5466') +('0020280000000','SAVORY BEANS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5467') +('0020300000000','HOME FRIES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5468') +('0020302000000','BOZEMAN BURGER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5469') +('0020304000000','FALAFEL PATTIES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','2006-09-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5470') +('0020320000000','QUINOA VEG. RISOTTO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5471') +('0020340000000','INDIAN SPICY LENTILS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5472') +('0020350000000','SWEET & SOUR TEMPEH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5473') +('0020370000000','TOFU POT PIE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5474') +('0020380000000','RSMRY RSTD POTATOES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5475') +('0020390000000','SHEPHERDS PIE',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2008-12-11 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5476') +('0020399800000','PBASKET GIFT MEDIUM',36.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','507','0','1','1','0',0,'0','2007-11-26 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5477') +('0020400000000','CHANA MASALA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5478') +('0020410000000','SOBA BOK CHOY MUSHROOMS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5479') +('0020420000000','THAI BUTTERNUT SQUASH CURRY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5480') +('0020430000000','SCALLOPED POTATOES',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5481') +('0020440000000','GREEK RICE PILAF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5482') +('0020450000000','CAULIFLOWER PAPRIKAS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5483') +('0020460000000','GINGERED GRNS W/TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5484') +('0020470000000','CURRIED FRIED RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5485') +('0020480000000','JALA OLIVE SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-13 12:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5486') +('0020490000000','RICE NOODLES & TOFU',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5487') +('0020520000000','SESAME NOODLE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5488') +('0020530000000','TOFU MUSHROOM SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5489') +('0020540000000','BUN,FOOD XTRA-NO TAX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5490') +('0020550000000','SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','1','0',0,'0','2008-05-12 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5491') +('0020580000000','THAI TEMPEH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5492') +('0020590000000','DELI CONT. OR CUP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5493') +('0020600000000','KALE SESAME SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5494') +('0020610000000','EGGLESS SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5495') +('0020620000000','SNOW PEA DELIGHT',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5496') +('0020630000000','PESTO VEGAN',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5497') +('0020640000000','PESTO PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5498') +('0020650000000','DILLY POTATO SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5499') +('0020660000000','FIESTA QUINOA',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5500') +('0020670000000','GREEK POTATO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5501') +('0020672000000','CEDAR GROVE ORGANIC CHEDDAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-02-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5502') +('0020680000000','HERBED RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5503') +('0020700000000','HOT POTATO CURRY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5504') +('0020702000000','NORTHSTAR FRESH FLANK STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5505') +('0020703000000','NORTHSTAR FRESH ROUND ROAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5506') +('0020706000000','NORTHSTAR FRESH STEW MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5508') +('0020708000000','NORTHSTAR FRESH SIRLOIN STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5509') +('0020709000000','NORTHSTAR FRESH SIRLOIN RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5510') +('0020710000000','HUMMUS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-03-17 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5511') +('0020713000000','FRESH BEELER HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-04-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5513') +('0020720000000','JADE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5515') +('0020728000000','PASTURES BABY BACK RIBS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5516') +('0020730000000','BULGUR TABOULI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5517') +('0020731000000','PASTURES PORK TENDERLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5518') +('0020733000000','PASTURES FRESH HAM HOCK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5519') +('0020736000000','KADEJAN WHOLE TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5520') +('0020737000000','KADEJAN CHICKEN LEGS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5521') +('0020738000000','KADEJAN CHICKEN PATTIES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-06 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5522') +('0020739000000','WHOLE FARM NATURAL BEEF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5523') +('0020740000000','TEMPEH COLESLAW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5524') +('0020741000000','ROGOTSKE SALMON FILLET',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5525') +('0020743000000','KADEJAN TURKEY BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5526') +('0020744000000','WHOLE FARM RIB EYE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5527') +('0020745000000','COHO SALMON PORTIONS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-12-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5528') +('0020746000000','WHOLE FARM SIRLOIN STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5529') +('0020747000000','WHOLE FARM FRESH TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-11-16 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5530') +('0020750000000','PAGODA PEPPER PASTA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5531') +('0020751000000','WHOLE FARM GROUND LAMB',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5532') +('0020753000000','WHOLE FARM FREE RANGE DUCK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5533') +('0020754000000','WHOLE FARM NY STRIP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5534') +('0020756000000','WHOLE FARM LAMB STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5535') +('0020757000000','WHOLE FARM LAMB CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5536') +('0020758000000','PASTURES COTTAGE BACON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5537') +('0020759000000','HEN HOUSE WHOLE CHICKEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5538') +('0020760000000','PERSIAN RICE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5539') +('0020762000000','WHOLE FARM GROUND PORK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5540') +('0020765000000','GERBER SKINLESS BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-12-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5541') +('0020766000000','NORTHSTAR BISON BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5542') +('0020767000000','GERBER WHOLE FRYER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-11-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5543') +('0020769000000','NORTHSTAR BISON PATTIES 1/4#',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5544') +('0020770000000','BEST BAKED BEANS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5545') +('0020773000000','SCHULTZ ORGANIC WHOLE CHICKEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5546') +('0020774000000','SCHULTZ ORGANIC WHOLE TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5547') +('0020776000000','SCHULTZ BONE IN TURKEY BRST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-09 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5548') +('0020778000000','SCHULTZ ORGANIC CHICKEN BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5549') +('0020779000000','SCHULTZ ORG CHICKEN LEG/THIGH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-14 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5550') +('0020780000000','CALICO ORZO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5551') +('0020782000000','MURPHYS ORGANIC GRND BEEF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5552') +('0020783000000','MURPHYS ORGANIC NY STRIP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5553') +('0020784000000','MURPHYS ORGANIC RIB EYE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5554') +('0020785000000','MURPHYS ORGANIC TENDERLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5555') +('0020786000000','MURPHYS ORGANIC CHUCK RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5556') +('0020787000000','MURPHYS ORGANIC SIRLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5557') +('0020790000000','PIQUANT LEMON RICE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5558') +('0020795000000','MURPHYS ORGANIC SOUP BONES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5559') +('0020796000000','MURPHYS ORGANIC PORTERHOUSE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'5560') +('0020800000000','POTATO LEEK VINAIGRETTE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5561') +('0020810000000','QUINOA OF THE SEA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5562') +('0020820000000','QUINOA PASTA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5563') +('0020826000000','RASPBERRY CHUTNEY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-19 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5564') +('0020830000000','QUINOA SHAZAM',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5565') +('0020840000000','SUMI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5566') +('0020850000000','KICHARDI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5567') +('0020860000000','MAPLE BEAN PASTA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5568') +('0020870000000','THREE BEAN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5569') +('0020880000000','TABOULI - QUINOA',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'499','2009-09-23 02:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5570') +('0020890000000','WILD RICE PILAF',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5571') +('0020900000000','ZESTY POTATO SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5572') +('0020910000000','HOPPIN JOHN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5573') +('0020920000000','GREEK RICE PUDDING',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5574') +('0020930000000','CASHEW CURRY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5575') +('0020940000000','HARVEST MOON SALAD',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5576') +('0020970000000','CHOCOLATE COVERED ST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5577') +('0021000000000','HOT SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5578') +('0021001000000','CREOLE TOFU',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5579') +('0021002000000','SEASONED FRIED TOFU',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5580') +('0021003000000','MOROCCAN TOFU',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5581') +('0021004000000','S & S MEATLESS BALLS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5582') +('0021005000000','HUNAN CHOW MEIN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5583') +('0021006000000','SESAME RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5584') +('0021007000000','TAPENADE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5585') +('0021008000000','SPICY CELERIAC CARROT SLAW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5586') +('0021009000000','MEDITERRANEAN MEAL - DOLMAS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5587') +('0021010000000','EVENING IN MOROCCO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-03-17 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5588') +('0021011000000','CAJUN PEPPER PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5589') +('0021012000000','GRATEFUL SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5590') +('0021013000000','LASAGNA ROLL-UPS',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5591') +('0021014000000','GORGONZOLA PASTA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5592') +('0021015000000','SPICY COLESLAW',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5593') +('0021016000000','SESAME FRITTERS',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5594') +('0021017000000','GARLIC SAGE TORT',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5595') +('0021018000000','ROASTED ONION DIP',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5596') +('0021019000000','RAVIOLI',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5597') +('0021022000000','CRISPY SPUDS & TURNI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5598') +('0021023000000','TOFU IN PEPPER SC',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5599') +('0021024000000','MARAKESH CABBAGE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5600') +('0021025000000','TANDOORI TOFU & VEG',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5601') +('0021026000000','APPLE BREAD PUDDING',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5602') +('0021027000000','GREEK SALAD',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5603') +('0021028000000','VEGETABLE CHEF SALAD',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5604') +('0021029000000','OLIVES KALAMATA',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5605') +('0021030000000','PURPLE HAZE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-03-17 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5606') +('0021031000000','TOFU QUICHE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5607') +('0021032000000','GREEK QUINOA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5608') +('0021033000000','POTAOES HEMMINGWAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5609') +('0021034000000','CILANTRO TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5610') +('0021035000000','SOUTHWEST BLACK BEAN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5611') +('0021036000000','ONION',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5612') +('0021037000000','TUSCAN BEAN SPREAD',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5613') +('0021038000000','MUSTARD LENTIL SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5614') +('0021039000000','CAULI BROC MORNAY',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5615') +('0021041000000','TORTELLINI GRAND',9.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5616') +('0021042000000','CELERIAC SLAW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5617') +('0021043000000','SOUTH OF THE BORDER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5618') +('0021045000000','TOM CUC *BRUSCHETTA*',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5619') +('0021046000000','TOM CUC SALAD',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5620') +('0021047000000','TETRAZZINI',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5621') +('0021048000000','SPICY THAI NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5622') +('0021049000000','LEMON PEPPER LING.',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5623') +('0021051000000','TRUFFLES',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5624') +('0021052000000','TARRAGON DIJON PENNE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5625') +('0021053000000','PUMPKIN PENNE',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5626') +('0021054000000','POTATOES AIOLI',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5627') +('0021055000000','SPANISH RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2004-11-08 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5628') +('0021056000000','GERMAN CABBAGE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5629') +('0021057000000','WALDORF SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5630') +('0021058000000','GINGER LIME PASTA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5631') +('0021059000000','VEGETABLE PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-01-09 08:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5632') +('0021060000000','BAKLAVA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-03-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5633') +('0021061000000','NACHO UNCHEESE DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5634') +('0021062000000','CAESAR SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5635') +('0021063000000','TOFU SALAD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5636') +('0021064000000','SAUTEED SALAD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5637') +('0021065000000','SPICY 4 PEPPER SALAD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5638') +('0021066000000','VEGAN VEG SALAD W/DR',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5639') +('0021067000000','CUCUMBER WRAP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5640') +('0021068000000','BOSTON CREAM PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5641') +('0021069000000','SOBA SALAD',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5642') +('0021070000000','SPINACH DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5643') +('0021071000000','FESTIVE SWEET POTATO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5644') +('0021072000000','STUFFING WRICE APPLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5645') +('0021073000000','CRANBERRY BEET RELIS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5646') +('0021074000000','GARLIC CHED MASH POT',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5647') +('0021075000000','GRAVY VEG MUSH CHIX',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5648') +('0021076000000','THAI SALAD',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5649') +('0021077000000','GREEN BEANS ALMONDIN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5650') +('0021078000000','SPICY SOBA NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5651') +('0021079000000','MAPLE GLAZED CARROTS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5652') +('0021080000000','ROASTED VEGGIE SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5653') +('0021081000000','OLIVES BLACK CERIGNOLA',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5654') +('0021082000000','OLIVES CASTELVETRANO',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5655') +('0021083000000','OLIVES GREEK MIXED',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5656') +('0021085000000','VEGAN SPICY MEXICAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5657') +('0021086000000','PIZZARIA DIP',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5658') +('0021087000000','RANCH DIP',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5659') +('0021088000000','TERIYAKI TOFU SALAD',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5660') +('0021089000000','TEMPEH GOULASH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5661') +('0021090000000','TOFU PUMPKIN PIE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5662') +('0021091000000','SESAME NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5663') +('0021093000000','MEDITERRANEAN PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-03-20 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5664') +('0021095000000','Olives Green Cerignola',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5665') +('0021096000000','OLIVES, GREEN STUFFED W/PEPPER',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5666') +('0021097000000','Olives Med. Mix',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5667') +('0021099000000','Olives Greek Mixed',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5668') +('0021100000000','DELI SALSA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5669') +('0021101000000','FLAV HUMMUS-OLIVE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5670') +('0021102000000','FLAV HUMMUS-CUKEDILL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5671') +('0021103000000','FLAV- HUMMUS HERBED',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5672') +('0021104000000','PESTO HUMMUS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5673') +('0021105000000','FLAV HUMMUS-SD TOM&BASIL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5674') +('0021106000000','FLAV HUMMUS-FOURPEPP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5675') +('0021107000000','FLAV HUMMUS-GRLC&RCP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5676') +('0021108000000','FLAV HUMMUS-FRTOMATO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5677') +('0021109000000','FLAV HUMMUS-ROAST GARLIC',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5678') +('0021111000000','OLIVE,TOM,BALS DIP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5679') +('0021112000000','GREEK SPREAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5680') +('0021113000000','6 LAYER DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5681') +('0021115000000','TOFU SPREAD',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5682') +('0021116000000','GERMAN VEG CHOC CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5683') +('0021117000000','APPLE TART DATES NUT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5684') +('0021118000000','FLAV HUMMUS-GAR/HERB',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5685') +('0021121000000','PRIMAVERA ORZO',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5686') +('0021122000000','OLIVES KALAMATA PITTED',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5687') +('0021123000000','PEPPEDEWS',10.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2005-09-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5688') +('0021124000000','OLIVES MEDITERRANEAN MEDLEY',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5689') +('0021125000000','OLIVES SUN DRIED TOMATOES',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5690') +('0021130000000','CHEESE ENCHLDA W/RCE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5691') +('0021131000000','MARCONA ALMONDS',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2007-02-13 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5692') +('0021132000000','MEMBRILLO',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2007-02-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5693') +('0021133000000','CARMELIZED WALNUTS MITICA',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2007-05-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5694') +('0021134000000','MEMBRILLO WITH ORANGE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2008-02-27 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5695') +('0021136000000','OLIVES LOU PISTOU',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','227','0','0','1','1',0,'0','2008-02-27 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5696') +('0021139000000','NUT COCKTAIL MIX',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2008-05-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5697') +('0021140000000','VEGAN ENCHLADA W/RCE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5698') +('0021150000000','8 OZ COFFEE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5699') +('0021160000000','12 OZ COFFEE',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5700') +('0021170000000','16 OZ COFFEE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2008-08-21 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5701') +('0021190000000','COFFEE REFILL',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-05-21 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5702') +('0021198000000','VEGETABLE SUB',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','3','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5703') +('0021200000000','MEATLESS LOAF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5704') +('0021201000000','COOKIES',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5705') +('0021202000000','THAI MARINADE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'0','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5706') +('0021203000000','PEAR & POLENTA CAKE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5707') +('0021204000000','CHINESE TEMPEH SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5708') +('0021205000000','CLASSIC MACARONI AND CHEESE',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-05-10 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5709') +('0021230000000','MINI-MUFFINS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5710') +('0021240000000','TUNA OF THE SOY',7.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5711') +('0021250000000','CHEESECAKE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5712') +('0021260000000','CHOCOLATE MOUSSE',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5713') +('0021270000000','BERRY COBBLER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5714') +('0021280000000','LASAGNE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5715') +('0021299000000','TACO SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5716') +('0021300000000','PIE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5717') +('0021301000000','FLORENTINE BURGER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2006-09-20 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5718') +('0021302000000','BOZEMAN BURGER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','1','0',0,'0','2006-10-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5719') +('0021303000000','GRILLED CHEESE TRIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5720') +('0021304000000','FALAFEL WRAP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2006-09-20 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5721') +('0021305000000','GRILL TEMPEH RUEBEN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','0','0','0',0,'0','2006-10-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5722') +('0021306000000','PORTABELL MUSH SAND',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2006-10-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5723') +('0021307000000','GRILLED CHEESE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2006-10-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5724') +('0021308000000','GRILLED VEGGIE ON RYE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5725') +('0021309000000','GRILLED CALIFORNIA ON 7 GRAIN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5726') +('0021310000000','SLOPPY JOE MIX',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5727') +('0021311000000','GRILLED BLT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5728') +('0021313000000','PB AND JELLY SAND',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5729') +('0021314000000','DULUTH DIVER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5730') +('0021315000000','LAKE STEAK',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5731') +('0021316000000','FRESH SUPERIOR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5732') +('0021317000000','GREAT LAKE TROUT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5733') +('0021318000000','TUNA MELT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-04-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5734') +('0021319000000','VEGGIE AND CHEESE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'0','2007-12-02 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5735') +('0021320000000','QUICHE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5736') +('0021321000000','TEMPEH BURRITO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5737') +('0021322000000','TEMP BURR W/ SALSA OR CHEESE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5738') +('0021323000000','TEMPEH BURR. W/ CHEESE & SALSA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5739') +('0021324000000','BEANS & RICE BURRITO MIX',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5740') +('0021326000000','BEAN & RICE BURRITO W CHEESE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5741') +('0021327000000','TOFU BURRITO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5742') +('0021328000000','TOFU BURRITO W/SALSA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5743') +('0021329000000','TOFU BURRITO W/ CHEESE & SALSA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5744') +('0021340000000','TAMALE PIE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5745') +('0021350000000','POTATO CAULI CURRY',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5746') +('0021360000000','CABBAGE ROLL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5747') +('0021370000000','RICE AND DAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5748') +('0021380000000','TEMPEH CACCIATORE',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5749') +('0021390000000','TOFU STROGANOFF',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5750') +('0021400000000','BBQ TEMPEH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5751') +('0021410000000','PENNE PASTA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5752') +('0021420000000','SZECHUAN TOFU',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5753') +('0021430000000','BURRITO W/SPAN RICE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5754') +('0021438000000','HAVARTI DENMARKS FINEST LIGHT',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5755') +('0021439000000','GJETOST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2009-06-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5756') +('0021450000000','CARROT CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-13 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5757') +('0021460000000','SPAGHETTI W/GAR TST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5758') +('0021470000000','BAKED POTATO W/CHEES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5759') +('0021480000000','BAKED TOFU W/PNUT SC',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5760') +('0021490000000','POTATO SALAD W/CARAW',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5761') +('0021500000000','TOFU SPINACH PIE',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5762') +('0021501000000','GNOCCHI IN SAUCE',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5763') +('0021520000000','VEGAN CHOCOLATE CAKE',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5764') +('0021540000000','BAKED APPLE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5765') +('0021560000000','LEMON BROIL TEMPEH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5766') +('0021580000000','TUSCAN WHITE BEAN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5767') +('0021590000000','ROTTI',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5768') +('0021610000000','TACO SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5769') +('0021625000000','MRS KELLYS BLACK CURRENT TEA',24.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','1',0,'0','2008-05-20 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5770') +('0021627500994','CURDS WHITE EICHTEN',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5771') +('0021630000000','VEGGIE DOG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5772') +('0021640000000','VEGI DOG W/CHP PICKL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5773') +('0021650000000','LINGUINI W/RSTD VEGS',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5774') +('0021660000000','YOGURT DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-03-17 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5775') +('0021670000000','HERBED POTATO BN SLD',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5776') +('0021680000000','GREEK ORZO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5777') +('0021690000000','DILLED GREEN BEANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5778') +('0021700000000','SUMMER PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5779') +('0021710000000','SUNNY LENTIL SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5780') +('0021720000000','DAIRY-FREE MAC & CHZ',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5781') +('0021730000000','BLACK BEAN FANDANGO',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5782') +('0021740000000','LENTIL LF W/MASHED',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5783') +('0021750000000','SWEET & SOUR TEMPEH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2004-10-13 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5784') +('0021760000000','FESTIVE SQUASH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5785') +('0021770000000','SAMOSAS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5786') +('0021780000000','BANANA BREAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5787') +('0021810000000','AIOLI',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5788') +('0021830000000','HERBED TOFU SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5789') +('0021840000000','POTATO POPPERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-03-28 05:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5790') +('0021850000000','THAI TOFU QUINOA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5791') +('0021860000000','CURRIED CABBAGE & PEA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5792') +('0021870000000','GINGERBREAD MOOSE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5793') +('0021880000000','VEGAN PUDDING',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5794') +('0021890000000','STUFFED GREEN PEPPER',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5795') +('0021901000000','DESSERT',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5796') +('0021902000000','DESSERT',0.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5797') +('0021903000000','DESSERT',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5798') +('0021904000000','DESSERT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5799') +('0021905000000','DESSERT',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5800') +('0021906000000','DESSERT',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5801') +('0021907000000','DESSERT',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5802') +('0021908000000','DESSERT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5803') +('0021908325019','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'5804') +('0021909000000','DESSERT',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5805') +('0021910000000','SKORDALIA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5806') +('0021911000000','DESSERT',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5807') +('0021912000000','DESSERT',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5808') +('0021913000000','DESSERT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5809') +('0021914000000','DESSERT',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5810') +('0021915000000','DESSERT',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5811') +('0021916000000','DESSERT',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5812') +('0021917000000','DESSERT',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5813') +('0021918000000','DESSERT',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5814') +('0021919000000','DESSERT',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5815') +('0021920000000','QUINOA PIZZA PILAF',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5816') +('0021921000000','DESSERT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5817') +('0021922000000','DESSERT',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5818') +('0021923000000','DESSERT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5819') +('0021924000000','DESSERT',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5820') +('0021925000000','DESSERT',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5821') +('0021930000000','UNSTUFFED SHELLS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5822') +('0021940000000','EGGPLANT PARMESAN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5823') +('0021960000000','FRIED RICE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5824') +('0021970000000','CREAMY CUCUMBER SALA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5825') +('0021980000000','CINNAMON & SPICE BN',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5826') +('0021988000000','BAKED GOOD',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5827') +('0021989000000','BAKED GOOD',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5828') +('0021990000000','CAPONATA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5829') +('0021991000000','BAKED GOOD',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5830') +('0021992000000','BAKED GOOD',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5831') +('0021993000000','BAKED GOOD',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5832') +('0021994000000','BAKED GOOD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5833') +('0021995000000','BAKED GOOD',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5834') +('0021996000000','BAKED GOOD',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5835') +('0021997000000','BAKED GOOD',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5836') +('0021998000000','BAKED GOOD',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5837') +('0021999000000','BAKED GOOD',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5838') +('0022000000000','VEGETABLE STEW',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','0','0',0,'-1','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5839') +('0022001000000','FRUIT DIP',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5840') +('0022002000000','MEXICAN DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5841') +('0022010000000','SPECTACULAR SPINACH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5842') +('0022020000000','SWEET PEPPER & BASIL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5843') +('0022030000000','DAL MAKHANI',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5844') +('0022050000000','APRICOT SHORTBREAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5845') +('0022060000000','KUNG PAO TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5846') +('0022070000000','LEMONY BULGUR',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5847') +('0022080000000','PASTA TUTTO GIARDINO',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5848') +('0022090000000','PENNE W/TOM & BAS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5849') +('0022101000000','MEXICAN SKILLET SCRAMBLE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-03-08 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5850') +('0022130000000','BABAGANUSH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5851') +('0022140000000','TWICE BAKED POTATOES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5852') +('0022150000000','GINGER COCONUT RICE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5853') +('0022160000000','COUSCOUS PILAF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5854') +('0022170000000','NEW ITEM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5855') +('0022180000000','SAVORY VEGGIES AND T',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5856') +('0022190000000','CRANBERRY RICE PUDDI',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5857') +('0022210000000','SZECHWAN TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5858') +('0022220000000','CURRIED SPINACH & CH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5859') +('0022230000000','DILLED ZUCCHINI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5860') +('0022240000000','WHITE BEAN KALE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5861') +('0022250000000','VEGETABLE CURRY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5862') +('0022260000000','HERBED PENNE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5863') +('0022270000000','VEGGIE COUSCOUS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5864') +('0022280000000','HOT & SOUR CABBAGE',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5865') +('0022290000000','CARIBBEAN STYLE BEAN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5866') +('0022300000000','FRENCH BEANS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5867') +('0022310000000','GARLIC LENTILS & RIC',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5868') +('0022330000000','TOFU CURRY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5869') +('0022340000000','SQUASH PILAF',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5870') +('0022360000000','GARLIC GINGER POTATO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5871') +('0022370000000','TOFU CURRY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5872') +('0022380000000','FRITTATA AU-GRATIN',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2004-12-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5873') +('0022390000000','THAI BROCCOLI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5874') +('0022391000000','CUBAN BLACK BEAN SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-04-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5875') +('0022392000000','CUBAN BLACK BEAN SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-04-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5876') +('0022400000000','FESTIVE COUSCOUS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5877') +('0022410000000','NUTTY MILLET & RICE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5878') +('0022420000000','NONDAIRY MAC N CHEES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5879') +('0022430000000','SPICY CHICKPEA & RIC',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5880') +('0022440000000','BAKED BLACK-EYED PEA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5881') +('0022450000000','KUNG PAO TEMPEH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5882') +('0022460000000','TOFU STROGANOFF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5883') +('0022470000000','SPINACH POTATOES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5884') +('0022480000000','LEMON BRAISED GREENS',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5885') +('0022490000000','ROSEMARY ROASTED SWE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5886') +('0022500000000','ETHIOPIAN POTATOES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5887') +('0022510000000','BAYOU RED BEANS & RI',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5888') +('0022520000000','SAMBAR',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5889') +('0022530000000','VEGGIE & SQUASH AU G',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5890') +('0022540000000','INDONESIAN FRIED RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5891') +('0022550000000','WEST AFRICAN JOLLOF RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5892') +('0022560000000','TROPICAL FRIED RICE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5893') +('0022570000000','VEGGIE BARLEY JAMBAL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5894') +('0022580000000','BLACK BEAN SUCCOTASH',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5895') +('0022590000000','CURRIED TURNIPS & SW',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5896') +('0022600000000','JAMAICAN JERK',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5897') +('0022610000000','TEMPEH STROGANOFF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5898') +('0022620000000','SWEET & SOUR CABBAGE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5899') +('0022630000000','SPICY POTATO WEDGES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5900') +('0022640000000','BEANS & RICE BURRITO',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5901') +('0022650000000','TOFU BURRITO MIX-OLD',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5902') +('0022660000000','TEMPEH CARROT SAUTE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5903') +('0022670000000','MANDARIN ORANGE & BROCCOLI SAL',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5904') +('0022680000000','LEBANESE BEAN SALAD',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2004-10-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5905') +('0022690000000','MUSHROOMS IN YOGURT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5906') +('0022700000000','MARINATED MUSHROOMS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5907') +('0022710000000','ORZO & PESTO STUFFED',7.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5908') +('0022720000000','HAWAIIAN CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5909') +('0022730000000','COFFEE CAKE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5910') +('0022740000000','RASPBERRY TRIFLE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5911') +('0022760000000','ZUCCHINI FRITTERS &',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5912') +('0022770000000','DATE & WALNUT CAKE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5913') +('0022780000000','APRICOT CRANBERRY TE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5914') +('0022790000000','ROASTED PEPPER PLEASURE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5915') +('0022800000000','SWEET GLAZED TOFU',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5916') +('0022810000000','SIZZLING BROC W/TOFU',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5917') +('0022820000000','SPINACH GREEK SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5918') +('0022830000000','BREAD PUDDING',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5919') +('0022840000000','NEW ITEM',5.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5920') +('0022850000000','VEGAN MUSHROOM SPREA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5921') +('0022860000000','ROASTED PEPPER & MUS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5922') +('0022870000000','CREAMY SNOW PEA SALA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5923') +('0022890000000','RICE APPLE CRISP',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5924') +('0022900000000','CHOCOLATE PUDDING CA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5925') +('0022910000000','GRAN YOG CHEESECAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5926') +('0022920000000','TUSCAN C.C. SPREAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5927') +('0022930000000','SPICY PUMPKIN SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5928') +('0022970000000','PEACH STREUSEL COFFE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5929') +('0022980000000','STRAWBERRY-RHUBARB C',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5930') +('0022990000000','APPLE STREUSEL COFFE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5931') +('0023000000000','SAGE TOFU',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5932') +('0023001000000','BLUE CHEESE BIG WOODS',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5933') +('0023002000000','ROSSINI',32.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5934') +('0023003000000','BLUE CHEESE CASHEL IRISH',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5935') +('0023004000000','GORGONZOLA DOLCINA',14.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-12-10 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5936') +('0023005000000','BLEU FOURME dAMBERT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-01-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5937') +('0023007000000','BLUE CHEESE BUTTERMILK',12.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-19 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5938') +('0023008000000','BLUE CHEESE CASTLE ROCK ORGANI',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-01-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5939') +('0023009000000','BLEU CHEESE SMOKED CASTLE ROCK',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-03-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5940') +('0023010000000','TEMPEH RUEBEN PATTIE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5941') +('0023013000000','VEGAN SWT POTATO PIE',13.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-22 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5942') +('0023020000000','BOZEMAN PATTY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5943') +('0023023000000','DOUBLE GLOUCESTER',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-06-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5944') +('0023030000000','MAGIC MUSHROOM PORTI',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5945') +('0023031000000','CHEDDAR APPLEWOOD SMKD CARR VA',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-19 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5946') +('0023032000000','COCOA CARDONA CARR VALLEY',22.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-19 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5947') +('0023033000000','MOBAY Carr Valley',21.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5948') +('0023034000000','Gran Canaria CV',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-03 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5949') +('0023035000000','CREMA KASA CHEESE CARR VALLEY',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5950') +('0023036000000','Mellage Carr Valley',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5951') +('0023037000000','CRANBERRY CHIPOTLE CHEDDAR',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'499','2009-09-11 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5952') +('0023038000000','MARISA CARR VALLEY',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5953') +('0023039000000','SIENNA SEMI HARD CHEESE',11.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5954') +('0023040000000','FALAFEL PATTIES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5955') +('0023041000000','CHEESE BARELY BUZZED',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-06-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5956') +('0023050000000','SQUASH JULIENNE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5957') +('0023051000000','PRAIRIE ROSE AMISH CHEESE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5958') +('0023052000000','MERLOT CHEDDAR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'499','2009-09-11 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5959') +('0023070000000','CURRIED EGGLESS SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5960') +('0023100000000','SPICY TOFU NUGGETS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5961') +('0023110000000','PEPPERY CHEESE BALLS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5962') +('0023120000000','CREAMY ASIAGO LING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5963') +('0023123000000','RAW ORG GARLIC PARSLEY CHEDDAR',10.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2007-02-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5964') +('0023130000000','SQUASH JULIENNE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5965') +('0023140000000','SPUDS & TURNIPS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5966') +('0023149377636','Rudis White Hamburger buns',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-07-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5967') +('0023149377638','Rudis White Hot Dog Buns',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-07-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5968') +('0023150000000','NEW ITEM',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5969') +('0023151000000','CHIPOTLE BLACK BEAN DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-04-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5970') +('0023201000000','GORGONZOLA BLACK RIVER',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5971') +('0023202000000','BLACK RIVER BLUE',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-09-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5972') +('0023210000000','HONEY GRADE A RAW',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5973') +('0023212000000','CHEDDAR BLACK DIAMOND',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'499','2009-07-24 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5974') +('0023213000000','CHEDDAR CRANBERRY',9.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-06-07 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5975') +('0023214000000','YOGURT CHEESE',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-12-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5976') +('0023215000000','YOGURT CHEESE JALAPENO',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5977') +('0023216000000','YOGURT CHEESE TOMATO BASIL',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5978') +('0023217000000','CHEDDAR OTTER CREEK SPRING',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-10-15 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5979') +('0023240000000','WATERMELON DRIED ORG REPACK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-12-13 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5980') +('0023260000000','BMOLASSES',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-04-27 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5981') +('0023300000000','TAHINI (PREPACKED)',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-04-27 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5982') +('0023320000000','ALMND BTTR N/S SM NO',9.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-04-27 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5983') +('0023326000000','FETA IN WATER',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5984') +('0023340000000','MILK ORGANIC NONINST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5985') +('0023360000000','MILK INSTANT ORGANIC',2.76,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-06-13 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5986') +('0023400000000','SPICY INDIAN LENTILS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-04 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5987') +('0023403000000','PRIMA DONNA',11.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2005-09-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5988') +('0023404000000','PRIMA DONNA AGED',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2007-10-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5989') +('0023420000000','CASHW BTTR RAW NONO',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-04-27 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5990') +('0023431000000','GOAT DRUNKEN',18.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-18 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5991') +('0023432000000','VODKA CURRAND CHEDDAR',11.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-10-03 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5992') +('0023433000000','GOAT WITH HONEY',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5993') +('0023434000000','MAHON SPANISH CHEESE',18.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-03 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5994') +('0023470000000','ALMND BTTR N/S CR NO',9.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2007-04-27 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'5995') +('0023501000000','PASTURELAND GOUDA 12 MO',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-07-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5996') +('0023502000000','SMOKED GOUDA MAPLE LEAF',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-11-12 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5997') +('0023504000000','MOREL LEEK JACK',13.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5998') +('0023505000000','BEEMSTER CLASSIC',15.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-22 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'5999') +('0023506000000','BEEMSTER VLASKAAS',13.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2007-10-03 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6000') +('0023509000000','PASTURELAND HERB GOUDA',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-12-16 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6001') +('0023511000000','GOUDA EICHTENS SMOKED',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-11-15 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6002') +('0023512000000','GOUDA LOW FAT EICHTENS',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-10-26 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6003') +('0023513000000','GOUDA EICHTENS WILD RICE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-07-17 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6004') +('0023514000000','GOUDA MARIEKE FENUGREEK',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6005') +('0023515000000','GOUDA MARIEKE MUSTARD MELANGE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6006') +('0023516000000','GOUDA EICHTENS HERB SPICE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6007') +('0023517000000','CHEDDAR MED PASTURELAND RAW OG',18.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6008') +('0023518000000','BERNE',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6009') +('0023519000000','VAN GOGH GOUDA',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6010') +('0023521000000','SOGN',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6011') +('0023522000000','THOTEN',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6012') +('0023525000000','MIDNIGHT MOON',21.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6013') +('0023606000000','BEEMSTER GOAT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-11-13 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6014') +('0023608000000','BUTTER JACK W/ CINNAMON',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6015') +('0023611000000','ANTONELLA FLAVORED CHEESES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-06-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6016') +('0023612000000','MARCOT FLAVORED CHEESES',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-06-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6017') +('0023711000000','HAVARTI-DILL',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6018') +('0023715000000','HAVARTI',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-10-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6019') +('0023800000000','STRAW CREAM PUFF',4.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2004-11-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6020') +('0023801000000','PARMIGIANO REGGIANO',19.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-10-03 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6021') +('0023802000000','SARVECCHIO X AGED PARM',16.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-26 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6022') +('0023803000000','BELLAVITANO',15.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6023') +('0023804000000','CAHILL PORTER',19.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6024') +('0023805000000','CHEDDAR CAHILL IRISH WHISKEY',19.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-03-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6025') +('0023806000000','SAGE N BLUE',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-12-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6026') +('0023807000000','CHEDDAR IRISH HARP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-03-04 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6027') +('0023810000000','LEMON MINI ROLLS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2004-11-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6028') +('0023812000000','FONTINA',11.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6029') +('0023815000000','SHREDDED PARMESAN',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-10-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6030') +('0023816000000','ASIAGO',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-27 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6031') +('0023817000000','MOZZARELLA POLLY-O',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6032') +('0023820000000','STRAW CREAM ROLLS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2004-11-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6033') +('0023890000000','HON DIJON POT SALAD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6034') +('0023900000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6035') +('0023910000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6036') +('0023920000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6037') +('0023930000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6038') +('0023940000000','PORT DERBY',17.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6039') +('0023950000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6040') +('0023951000000','VERY BERRY SCONE JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6041') +('0023952000000','MORNING GLORY MUFFIN JENNY LIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6042') +('0023953000000','GINGER PEACH MUFFIN JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6043') +('0023954000000','BANANA BRAN MUFFIN JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6044') +('0023955000000','BLUEBERRY BANANA MUFFIN JENNY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6045') +('0023956000000','CINNAMON APPLE MUFING JENNY LI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6046') +('0023957000000','RASPBERRY MUFFIN JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6047') +('0023958000000','BLUE CHEESE AMABLU AMISH',12.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-08-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6048') +('0023959000000','CINNAMON APPLE SCONE JENNY LIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6049') +('0023960000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6050') +('0023961000000','APRICOT SCONES JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6051') +('0023962000000','BLUE RASPBERRY CREAM CH MUFFIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2008-11-03 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6052') +('0023970000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6053') +('0023980000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6054') +('0023990000000','DELI SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','74','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6055') +('0023995000000','PBASKET GIFT LARGE',44.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','1','0',0,'0','2008-10-03 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6056') +('0023997000000','PBASKET GIFT SMALL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','1','0',0,'0','2008-10-27 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6057') +('0023998000000','PBASKET GIFT MEDIUM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','503','0','1','1','0',0,'0','2008-10-27 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6058') +('0023999000000','ITALIAN SALAMETTI',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-09-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6059') +('0024002000000','CINNAMON BUTTERJACK',15.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2005-08-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6060') +('0024003000000','MOZZARELLA POLLY-O',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-10-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6061') +('0024004000000','MOZZARELLA FRESH CURD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-07-25 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6062') +('0024005000000','WFC FRESH MOZZ.',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','2','1','1',0,'0','2007-08-22 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6063') +('0024006000000','SMOKED PROVOLONE-BURNT',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2005-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6064') +('0024007000000','MOZZ SMOKED POLLY-O',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-27 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6065') +('0024008000000','BRUN- UUSTO',11.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-02-28 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6066') +('0024009000000','FRESH MOZZ MEDALLIONS',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-11-12 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6067') +('0024022000000','CHIHUAHUA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-05-07 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6068') +('0024051000000','CAPPUCCINO LATTE 120Z',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6069') +('0024052000000','MOCHA 12oz',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6070') +('0024053000000','CAFE BREVE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6071') +('0024054000000','AMERICANO 12 oz',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6072') +('0024055000000','DEPTH CHARGE 12oz',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6073') +('0024056000000','TURTLE MOCHA 12 oz',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6074') +('0024057000000','FOGGY SPICED MOCHA 12 oz',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6075') +('0024058000000','FLAVORED LATTE 12 OZ',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6076') +('0024059000000','3 RD STREET CHAI 12 oz',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-11-28 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6077') +('0024061000000','CAPPUCCINO LATTE 16 OZ',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6078') +('0024062000000','MOCHA 16 oz',4.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6079') +('0024063000000','CAFE BREVE 16 oz',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6080') +('0024064000000','AMERICANO 16 oz',2.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6081') +('0024065000000','DEPTH CHARGE 16oz',3.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6082') +('0024066000000','TURTLE MOCHA 16 oz',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6083') +('0024067000000','FOGGY SPICED MOCHA 16 oz',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6084') +('0024068000000','FLAVORED LATTE 16 OZ',4.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6085') +('0024069000000','3 RD STREET CHAI 16 oz',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-11-28 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6086') +('0024071000000','ESPRESSO SINGLE SHOT',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-07 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6087') +('0024073000000','HOT CHOCOLATE 12oz',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-01-15 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6088') +('0024074000000','CAFE CUBANO 12oz',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-01-15 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6089') +('0024075000000','Latte of the Day 12 oz',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2008-02-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6090') +('0024076000000','SMOOTHIE 12oz',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2008-06-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6091') +('0024082000000','espresso double shot',2.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2005-11-08 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6092') +('0024083000000','HOT CHOCOLATE 16 oz',3.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-01-15 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6093') +('0024084000000','CAFE CUBANO 16oz',2.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2007-01-15 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6094') +('0024085000000','Latte of the Day 16 oz',3.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2008-02-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6095') +('0024086000000','PEACH SMOOTHIE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','69','0','1','0','0',0,'0','2008-06-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6096') +('0024152000000','VEG CAPS -OO-',200.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','256','0','1','0','0',0,'0','2006-03-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'6097') +('0024201000000','GREEN PASTURES CARLTON CREAM',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2005-08-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6098') +('0024202000000','GREEN PASTURES JAL MISSION LEA',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2005-08-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6099') +('0024203000000','GREEN PASTURES GARLIC ONION PA',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2005-10-05 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6100') +('0024204000000','GREEN PASTURES BROMFIELD',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2005-10-06 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6101') +('0024205000000','GREEN PASTURE PEPPERCORN GOUDA',14.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-12-21 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6102') +('0024206000000','GREEN PASTURE 4 YEAR GOUDA',22.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2005-12-21 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6103') +('0024207000000','GREEN PASTURES GOUDA',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2006-04-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6104') +('0024208000000','GREEN PASTURES SMOKED GOUDA',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2006-04-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6105') +('0024209000000','GREEN PASTURES TOM BASIL GOUDA',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2006-04-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6106') +('0024211000000','GREEN PASTURES SWISS GOUDA',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2006-09-30 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6107') +('0024212000000','GREEN PASTURES FENNUGREEK GOUD',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2006-11-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6108') +('0024213000000','GREEN PASTURES 3 YEAR GOUDA',21.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-02-04 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6109') +('0024214000000','GREEN PASTURES TAMARACK GOLD',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-03-31 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6110') +('0024215000000','GREEN PASTURES ATKINSBURG',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-02-27 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6111') +('0024216000000','GREEN PASTURES CARLTON COVE',16.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-10-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6112') +('0024221000000','GOAT GOLD LEMONWEIR',17.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-10-17 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6113') +('0024222000000','COWBILLY, NATURAL VALLEY',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-25 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6114') +('0024223000000','GOUVARTI GOAT NATURAL VALLEY',17.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-14 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6115') +('0024224000000','REDSTONE ROBUSTO',19.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-14 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6116') +('0024303000000','Garlic Herb Spread',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-10-07 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6117') +('0024310000000','CREAM CHEESE',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2007-08-21 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6118') +('0024311000000','Le ROULE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-05-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6119') +('0024312000000','LE ROULE CRANBERRY',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-11-12 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6120') +('0024401000000','BRIE ST. ANDRE',16.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-18 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6121') +('0024402000000','CURDS WHITE EICHTEN',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','1','0',0,'0','2008-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'6122') +('0024403000000','EICHTENS STRING BULK SMOKED',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6123') +('0024404000000','STRING CHEESE EICHTENS BULK',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6124') +('0024405000000','CURDS ORGANIC CASTLE ROCK',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-10-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6125') +('0024406000000','JARLSBERG',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6126') +('0024407000000','Big Eds Raw Swiss',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6127') +('0024408000000','GRUYERE GRAND CRU',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6128') +('0024437000000','RUSTIC INN CHERRY PEACH CRUMBL',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2009-03-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6129') +('0024681000000','GOAT CHEESE MOLD AGED DONNAY',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-09-23 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6130') +('0024682000000','Stickney Hills Chevre logs',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-07-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6131') +('0024683000000','CHEVRE CHEESE MONT CHEVER',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-03-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6132') +('0024820000000','PREV BORSCHT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6133') +('0024830000000','PSKIRRET ROOT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1307','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6134') +('0024840000000','PAPPLE HONEYCRISP SALE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1352','2008-10-19 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6135') +('0024850000000','PREV ASIAN SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6136') +('0024860000000','PREV BASQUE SOUP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6137') +('0024870000000','PAPPLE NON-O SALE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1069','2008-09-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6138') +('0024880000000',NULL,0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6139') +('0024890000000','PGARLIC PEELED NON-ORGANIC',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'898','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6140') +('0024900000000','P12 VEGGIE TRAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'6141') +('0024910000000','PCUT CAULIFLOWER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1171','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6142') +('0024930000000','PREV SQUASH SOUP MIX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6143') +('0024940000000','PCARROTS JUICE 25#',25.10,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'870','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6144') +('0024960000000','PCELERIAC CUT WRAP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'mixmatchcode','2009-02-28 12:04:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'6145') +('0024970000000','PWSQUASH CUT HUBBARD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1070','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6146') +('0024980000000','PW SQUASH CUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1068','2007-11-02 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6147') +('0024990000000','PLEMON GRASS NON-ORG',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'917','2009-07-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6148') +('0025000000000','PMELON CUT RED WATERMELON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1071','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6149') +('0025001000000','Fettucini Alfredo',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-05-06 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6150') +('0025002000000','MIXED VEGGIE PILAF',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-06-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6151') +('0025003000000','Fantastic Veggie Stir Fry',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-06-24 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6152') +('0025004000000','Ziti',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-07-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6153') +('0025005000000','BALKAN ROASTED VEGETABLES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-07-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6154') +('0025006000000','RED PEPPER ANTIPASTO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-08-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6155') +('0025007000000','EGGPLANT PARMIGIANA FETT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-08-20 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6156') +('0025008000000','STUFFED SWEET POTATOES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-08-20 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6157') +('0025009000000','POTATO PARSNIP LATKES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-08-20 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6158') +('0025010000000','PMELON CUT RED SEEDLESS WATER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1072','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6159') +('0025011000000','THAI RICE NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-08-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6160') +('0025012000000','EGGPLANT MANICOTTI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-08-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6161') +('0025013000000','Black Eyed Peas and Squash',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-10-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6162') +('0025014000000','WRONG NUMBER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-10-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6163') +('0025015000000','RATATOULLIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-10-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6164') +('0025016000000','SPINACH ENCHILADAS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-10-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6165') +('0025017000000','BUTTERNUT SQUASH PROVENCAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-10-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6166') +('0025018000000','AUTUMN DELIGHT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-10-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6167') +('0025019000000','MAPLE GLAZED SQUASH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-10-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6168') +('0025020000000','PMELON CANTALOUPE CUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1073','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6169') +('0025021000000','ORGANIC WHOLE CHICKEN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2005-11-02 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6170') +('0025022000000','QUINOA BASMATI PILAF W/PECANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','1',0,'0','2005-11-03 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6171') +('0025023000000','FOG CITY CHICKEN SALAD',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-03 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6172') +('0025024000000','lentil walnut pate',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-11-03 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6173') +('0025025000000','GREEN COCONUT CURRIED TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-11-04 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6174') +('0025026000000','HERBED COUSCOUS W/ PORTABELLO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-04 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6175') +('0025027000000','TOFU STUFFED MUSHROOMS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-11-04 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6176') +('0025028000000','GRILLED VEGETABLES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-11-04 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6177') +('0025029000000','CELEBRATION SLICED STUF ROAST',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-04 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6178') +('0025030000000','PMELON CUT GR HONEYD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1129','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6179') +('0025031000000','GRILLED CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-11-04 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6180') +('0025032000000','ASIAN GRILLED SALMON',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','2005-11-04 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6181') +('0025040000000','PMELON ORANGE HONEYD',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','555','0','0','1','1',0,'581','2009-09-08 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6182') +('0025050000000','PREV CUT YLW H2OM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1074','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6183') +('0025060000000','PMELON OTHER CUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1075','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6184') +('0025070000000','PSCALICORNIA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'1305','2005-01-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6185') +('0025080000000','PCUT RED CABBAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1174','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6186') +('0025090000000','PCUT GREEN CABBAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1172','2005-11-16 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6187') +('0025100000000','PCUT NAPA CABBAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1173','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6188') +('0025101000000','MOZZ PASTURE PRIDE OG',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'499','2009-04-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6189') +('0025102000000','WHOLE ORGANIC CHICKENS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2005-11-03 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6190') +('0025103000000','CHED SHARP PAST PRIDE OG',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-02-18 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6191') +('0025104000000','PROV PAST PRIDE OG',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6192') +('0025105000000','CHEDDAR VALLEY VIEW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6193') +('0025106000000','MONTEREY JACK VALLEY VIEW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6194') +('0025107000000','COLBY VALLEY VIEW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6195') +('0025108000000','Brunkow Pepper Jack',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6196') +('0025109000000','Brunkow Med Cheddar',9.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-09-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6197') +('0025110000000','PCELERY STALKS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1062','2008-12-19 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6198') +('0025111000000','Brunkow Herb',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'mixmatchcode','2009-04-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6199') +('0025112000000','Brunkow Raw Mild Cheddar',8.99,'0',0.00,'0',7.99,'0',7.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','231','0','0','1','1',0,'0','2007-11-06 11:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6200') +('0025113000000','Brunkow Monterey Jack',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-27 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6201') +('0025114000000','Brunkow Mild Cheddar',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6202') +('0025117000000','Brunkow Smoked Cheddar',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-08-21 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6203') +('0025118000000','Brunkow Colby Jack',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6204') +('0025119000000','Brunkow Raw Sharp Cheddar',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6205') +('0025120000000','PAPPLE SALE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1069','2008-09-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6206') +('0025121000000','Brunkow Aged Raw Cheddar',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-10-23 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6207') +('0025130000000','PJU CARROT QUENCHER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6208') +('0025132000000','DELI MEAT PLATTER',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','1',0,'0','2006-12-11 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6209') +('0025135000000','CREAM CHEESE BLUEBERRY',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2006-12-17 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6210') +('0025136000000','STRAWBERRY CREAM CHEESE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2007-06-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6211') +('0025137000000','PESTO CREAM CHEESE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-07-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6212') +('0025138000000','CREAM CHEESE MIX BERRIES W/HON',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2007-07-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6213') +('0025139000000','WFC FRESH MOZZARELLA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','72','0','2','1','1',0,'0','2007-09-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6214') +('0025140000000','PAPPLES SALE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','1','1','0',0,'mixmatchcode','2009-03-15 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6215') +('0025141000000','CREAM CHEESE WITH HONEY AND WA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','0','0',0,'0','2007-09-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6216') +('0025142000000','HERB & GARLIC CHEESE SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-30 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6217') +('0025143000000','SPICED APPLE CHEESE SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-30 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6218') +('0025144000000','PUMPKIN CHEESE SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-30 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6219') +('0025150000000','PMELON CUT SEEDLESS YELLOW WAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1072','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6220') +('0025160000000','PMELON CUT HEIRLOOM WATER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1075','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6221') +('0025170000000','PJU GRAPEFRUIT QT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6222') +('0025180000000','PGREEN BEAN NON-O',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'845','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6223') +('0025190000000','PJU CARROT STRAIT UP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6224') +('0025200000000','PREV FRUIT CUP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6225') +('0025210000000','PJU CARROT SUPREME',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6226') +('0025220000000','PGREEN BEANS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'845','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6227') +('0025230000000','PBEAN GREEN LOCAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'845','2009-07-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6228') +('0025240000000','PREV CELERIAC',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'871','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6229') +('0025250000000','PSTIR FRY MIX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1200','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6230') +('0025260000000','PSTIR FRY SPICY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1199','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6231') +('0025280000000','PJU CITRUS PEARADISE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6232') +('0025290000000','MULLING SPICES BAGGED',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'6233') +('0025300000000','PREV COLESLAW MIX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6234') +('0025310000000','P12 FRUIT TRAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6235') +('0025317005104','APPLEGATE ORGANIC GRT HOT DOG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-06-14 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'6236') +('0025317102001','BACON,OG,SUNDAY',5.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-10-27 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'6237') +('0025317568005','BURGER, OG BEEF 85% LEAN',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-10-27 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'6238') +('0025320000000','PBEAN HARICOT VERT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'842','2007-10-01 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6239') +('0025330000000','P12 FRUIT & VEG TRAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6240') +('0025340000000','PSCALE PICK CUKE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','525','0','0','1','0',0,'879','2007-08-03 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6241') +('0025350000000','PREV VEGGIE DIPPERS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6242') +('0025360000000','P18 FRUIT TRAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6243') +('0025370000000','PJU PURELY PEAR 8OZ',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6244') +('0025380000000','PJU CITRUS PEARADISE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6245') +('0025390000000','PJU GRAPEFRUIT JUICE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6246') +('0025400000000','PCELERIAC',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','1',0,'871','2009-04-22 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6247') +('0025410000000','PJU WATERMELON SHIND',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6248') +('0025420000000','PJU ORCHARD LEMONADE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6249') +('0025430000000','PJU ORCHARD LEMONADE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6250') +('0025440000000','PJU STRAWBERRY PUNCH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6251') +('0025450000000','PJU SNAPPY APPLE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6252') +('0025460000000','PJU SNAPPY APPLE 8OZ',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6253') +('0025470000000','PAPPLE PREMIUM SALE APPLES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1352','2008-10-19 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6254') +('0025480000000','P18 VEGETABLE TRAY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6255') +('0025490000000','PPINEAPPLE CUT FRESH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1290','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6256') +('0025500000000','PPINEAPPLE CUT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1290','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6257') +('0025501000000','ORGANIC VALLEY MOZZARELLA',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2006-10-04 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6258') +('0025502000000','ORGANIC VALLEY CHEDDAR MILD',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2006-10-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6259') +('0025510000000','PJU LAST FANDANGO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6260') +('0025520000000','PFRUIT TRAY 12',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','2005-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6261') +('0025530000000','P18 TRAY FRUIT & VEGETABLE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','2005-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6262') +('0025540000000','PBEAN ROMANO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'847','2009-06-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6263') +('0025550000000','PGARLIC PEELED PKG',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','1',0,'898','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6264') +('0025560000000','PBEAN YELLOW',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','1','1','1',0,'848','2009-07-29 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6265') +('0025570000000','PVEGETABLE TRAY 18',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','504','0','1','1','0',0,'0','2005-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6266') +('0025590000000','PEDAMAME',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'886','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6267') +('0025600000000','PPICKLING CUCUMBERS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','208','0','1','1','0',0,'0','2008-08-30 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6268') +('0025610000000','PJU ELIXIRS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6269') +('0025610060100','PJU DJINNIS ELIXIR 8',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6270') +('0025630000000','PEDAMAME',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'886','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6271') +('0025640000000','PJU EMERALD ELIXIR 8',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6272') +('0025650000000','PJU PLUM PERFECT 16',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6273') +('0025660000000','PCARROTS LOCAL BAGGED',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'0','2008-09-15 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6274') +('0025670000000','PSTIR FRY MIX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1200','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6275') +('0025680000000','PSPICY STIR FRY MIX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1199','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6276') +('0025690000000','PMANGO SALSA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','1','1','0',0,'1063','2008-07-09 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6277') +('0025700000000','PTURNIP BAGGED BABY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'1064','2007-11-02 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6278') +('0025710000000','PAPPLE BAG LOCAL',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'0','2008-09-07 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6279') +('0025720000000','PPEANUTS SALTED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'1080','2009-02-04 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6280') +('0025730000000','PJICAMA C&W',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'mixmatchcode','2009-03-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6281') +('0025740000000','PKOHLRABI, CUT',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1209','2007-11-11 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6282') +('0025750000000','PWSQUASH HUBBARD CUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1070','2008-08-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6283') +('0025760000000','PJU LUKES LEMONADE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','2008-12-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6284') +('0025770000000','PPAPAYA CUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'1133','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6285') +('0025780000000','PBRUSSELS SPROUTS NONO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','1',0,'693','2009-02-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6286') +('0025790000000','PREV FENNEL SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6287') +('0025810000000','PREV ORCHARD SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6288') +('0025820000000','PCARROT JUICE FF RANDOM WT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'1404','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6289') +('0025830000000','PCARROT LOCAL BAG',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'499','2009-07-08 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6290') +('0025840000000','PFAVA BEANS / LB',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'840','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6291') +('0025850000000','PPEAS ENGLISH SHELL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'mixmatchcode','2009-06-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6292') +('0025860000000','PJU STEVES STRAWZING',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6293') +('0025870000000','PSHALLOTS PEELED NON-O',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1398','2009-07-24 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6294') +('0025880000000','PBEAN NON-O LOCAL SPECIALTY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'1339','2008-07-15 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6295') +('0025890000000','non-organic lemongrass',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'917','2009-07-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6296') +('0025900000000','PREV ATHENIAN 1/2SAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6297') +('0025910000000','PREV',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6298') +('0025920000000','PPINEAPPLE SALE CUTS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','2009-01-20 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6299') +('0025930000000',NULL,0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6300') +('0025940000000','PCOLESLAW MIX',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1354','2008-10-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6301') +('0025950000000','PVEGGIE DIPPERS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1360','2008-12-10 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6302') +('0025960000000','PJU PHANTOM MANGOE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6303') +('0025970000000','PJU GO FIGURE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6304') +('0025980000000','PHORSERADISH ROOT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'mixmatchcode','2009-03-27 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6305') +('0025990000000','PKOHLRABI NON-O',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','0','0',0,'1397','2009-06-23 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'6306') +('0026001000000','LUSCIOUS LEMON',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-04-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6307') +('0026002000000','CARAMEL KNOWLEDGE',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-05-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6308') +('0026003000000','GINGER LIME CHOCOLATES',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-05-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6309') +('0026004000000','RASPBERRY SILKS',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-11-22 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6310') +('0026005000000','THREE CHOCOLATES',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-11-22 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6311') +('0026006000000','EARL GRAY TRUFFLE 185 CHOCOLAT',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-11-22 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6312') +('0026007000000','BLOOD ORANGE 185 CHOCOLAT',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-11-22 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6313') +('0026008000000','COFFEE CHOCOLATE 185 CHOCOLAT',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2005-11-22 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6314') +('0026009000000','185 CHOCOLAT VALENTINE 4 PACK',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6315') +('0026011000000','SPICED PUMKIN CHEESECAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-22 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6316') +('0026012000000','PUMKIN PIE',13.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-22 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6317') +('0026013000000','PECAN SWEET POTATO PIE',13.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-22 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6318') +('0026014000000','DATE BALLS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-25 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6319') +('0026015000000','PEAR RASPBERRY POLENTA CAKE',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-25 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6320') +('0026016000000','DELICIOUS MINI TARTS',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-25 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6321') +('0026017000000','HONEY & HAZELNUT CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6322') +('0026018000000','HINT O MINT CAKE-VEGAN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2005-11-30 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6323') +('0026019000000','SAVORY SCONES',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-01 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6324') +('0026020000000','GRUYERE EMMI',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-04 02:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6325') +('0026021000000','DINNER ROLL',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-01 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6326') +('0026022000000','APPLE PIE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-01 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6327') +('0026023000000','TURTLE CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2005-12-02 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6328') +('0026024000000','BERRY COBBLER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-02 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6329') +('0026025000000','CORNBREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2005-12-02 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6330') +('0026026000000','FOG CITY BLACK OLIVE FOCACCIA',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2005-12-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6331') +('0026027000000','LEMON MERINUE PIE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6332') +('0026028000000','VEGAN GINGERBREAD',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-14 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6333') +('0026029000000','LEMON TARTS',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-16 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6334') +('0026030000000','BUCHERON FRENCH CHEESE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2004-11-04 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6335') +('0026031000000','PEANUT BUTTER CHOCOLATE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2005-12-31 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6336') +('0026032000000','RASP. CHOCO CHEESECAKE BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-01-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6337') +('0026033000000','SAVORY MUFFINS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-01-22 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6338') +('0026034000000','RASPBERRY CHOC. CUPCAKES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-02-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6339') +('0026035000000','RASPBERRY 2 CHOCO CHEESE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6340') +('0026036000000','CHOCOLATE CAKE TRIFLE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6341') +('0026037000000','CHOC/GINGER ESPRESSO TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-15 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6342') +('0026038000000','BLACKBERRY LEMON CHEESECAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-15 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6343') +('0026039000000','PEACH ALMOND APRICOT TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-15 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6344') +('0026040000000','APPLE TURNOVERS',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-15 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6345') +('0026041000000','GF CHOC-CHERRY ALMOND COOKIE',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6346') +('0026042000000','CINNAMON BUTTERMILK CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6347') +('0026043000000','TRULY TROPICAL TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-16 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6348') +('0026044000000','CHOCOLATE BROWNIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-16 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6349') +('0026045000000','VEGAN CAKE',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-16 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6350') +('0026046000000','MOCHA ALMOND CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-16 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6351') +('0026047000000','RASPBERRY LIME CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-16 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6352') +('0026048000000','PUMPKIN CHEESECAKE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-16 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6353') +('0026049000000','LEMON RASPBERRY CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-16 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6354') +('0026051000000','HALF PRICE BAKED GOOD',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-02-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6355') +('0026052000000','',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6356') +('0026053000000','GF HINT O MINT CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6357') +('0026054000000','THICK MINT BROWNIE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6358') +('0026055000000','DOUBLE BERRY CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-18 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6359') +('0026056000000','MALTED MILK BALL CUPCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6360') +('0026057000000','GF FLOURLESS CHOCO ORANGE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6361') +('0026058000000','STRAW.VANILLA CAKE (VEGAN)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6362') +('0026059000000','NUTTY BUTTER BARS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6363') +('0026061000000','GF CITRUS COCONUT CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6364') +('0026062000000','CELEBRATION DONUTS',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6365') +('0026063000000','GF PEANUT BUTTER CAKE',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6366') +('0026064000000','LUSCIOUS LEMON COCONUT TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6367') +('0026065000000','VEGAN RASPBERRY CHOCOLATE CAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6368') +('0026067000000','JOYFUL ALMOND CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6369') +('0026068000000','NUTTY ESPRESSO BANANA PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','1',0,'0','2006-03-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6370') +('0026069000000','VEGAN GINGER CHOCOL.ATE CAKE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6371') +('0026071000000','CHOCOLATE ALMOND BROWNIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6372') +('0026072000000','MINTY CHOCOLATE TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6373') +('0026073000000','CHOCOLATE ORANGE CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-28 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6374') +('0026074000000','GF RASPBERRY LEMON CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-28 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6375') +('0026075000000','PINEAPPLE COCONUT CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-28 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6376') +('0026076000000','GF CARROT CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6377') +('0026077000000','BLACK AND BLUE CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6378') +('0026078000000','GF STRAWBERRIES/CREAM TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6379') +('0026079000000','PEACH STRAWBERRY PIE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6380') +('0026081000000','CRUNCHY PEANUT BUTTER BAR (GF)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6381') +('0026082000000','STRAWBERRY ALMOND CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-03-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6382') +('0026083000000','PEACH PECAN TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-03-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6383') +('0026084000000','RED PEPPER CHEDDAR SCONE',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6384') +('0026085000000','TOMATO BASIL SCONE',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6385') +('0026086000000','CHEDDAR GARLIC SCONE',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6386') +('0026087000000','VEGGIE AND HAM QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6387') +('0026088000000','FANTASTIC PEANUT/CHOC TORTE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-04 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6388') +('0026089000000','MILK CHOCOLATE CUPCAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-05 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6389') +('0026091000000','CHEESY HERB SCONE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-05 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6390') +('0026092000000','RAZZ/CHOC PINWHEELS',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6391') +('0026093000000','ULTIMATE CHOCOLATE CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6392') +('0026094000000','GF JOYFUL ALMOND CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6393') +('0026095000000','VEGAN BLUEBERRY CHOCOLATE CAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6394') +('0026096000000','PEANUT BUTTER BROWNIE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6395') +('0026097000000','HAZELNUT BROWNIE',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6396') +('0026098000000','strawberry peach pie',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6397') +('0026099000000','STRAWBERRY ALMOND CHEESECAKE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6398') +('0026100000000','RED WINDSOR',14.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2004-12-03 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6399') +('0026101000000','GF MILK CHOCOLATE GINGER CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6400') +('0026102000000','HARVEST BERRY SHORTCAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6401') +('0026103000000','SOUTHWEST CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6402') +('0026104000000','GF CHOCOLATE ORANGE BROWNIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6403') +('0026105000000','MOCHA ALMOND BARS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6404') +('0026106000000','MOCHA HAZELNUT TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6405') +('0026107000000','SAUSAGE/ONION/CHEDDAR QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6406') +('0026108000000','GREEK QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6407') +('0026109000000','SOUTHWEST QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6408') +('0026110000000','QUESO MANCHEGO',19.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-12 05:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6409') +('0026111000000','ASPARAGUS FETA QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-11 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6410') +('0026112000000','SINFUL SEVEN LAYER BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-11 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6411') +('0026113000000','ROSEMARY FETA SCONE',1.30,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6412') +('0026114000000','CHOCOLATE LAYER CAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6413') +('0026115000000','LEMON ALMOND CAKE ( VEGAN)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6414') +('0026116000000','RASPBERRY CHOC CHZCAKE',5.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6415') +('0026117000000','CHOC/STRAW TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6416') +('0026118000000','GF CHOCOLATE MARBLE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-14 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6417') +('0026119000000','GF CHOCOLATE CHIP COOKIES',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6418') +('0026121000000','ZUCCHINI CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6419') +('0026122000000','RASPBERRY ORANGE CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6420') +('0026123000000','RASPBERRY CHOCOLATE TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6421') +('0026124000000','CHOCOLATE ORANGE BROWNIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6422') +('0026125000000','GF CHOCOLATE HAZELNUT CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6423') +('0026126000000','GF CHOCOLATE BROWNIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-24 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6424') +('0026127000000','CHOCOLATE WALNUT BROWNIE',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-24 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6425') +('0026128000000','VOYAGER BLISS BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6426') +('0026129000000','AMAZING APRICOT BAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6427') +('0026131000000','MARBLE CHZCAKE BAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6428') +('0026132000000','MANGO LIME MOUSSE TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6429') +('0026133000000','JALAPENO CHEDDAR CORNBREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2006-04-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6430') +('0026134000000','VEGAN STRAW/DREAM CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-27 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6431') +('0026135000000','ZIPPY LEMON BAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-27 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6432') +('0026136000000','GERMAN CHOCOLATE CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6433') +('0026137000000','LEMON COCONUT TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-28 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6434') +('0026138000000','MALTED MILK BALL CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6435') +('0026139000000','DOUBLE BERRY LEMON CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6436') +('0026140000000','GOURMANDISE',20.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-01-14 09:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6437') +('0026141000000','FUDGE ALMOND BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6438') +('0026142000000','NO BAKE OATMEAL BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6439') +('0026143000000','MARBLE CHEESECAKE BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6440') +('0026144000000','CHOCOLATE NUT TOFFEE BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6441') +('0026145000000','VEGAN CHERRY PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-04 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6442') +('0026146000000','GF/VEGAN STRAW/ALMOND CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-04 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6443') +('0026147000000','GF CHOCOLATE CHIP PECAN TRIFLE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6444') +('0026147800000','BUTTERSCOTCH PUDDING',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-05-12 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6445') +('0026148000000','BUTTERSCOTCH PUDDING',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-05-12 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6446') +('0026149000000','BUTTERSCOTCH PUDDING',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-05-12 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6447') +('0026151000000','CHOCOLATE TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6448') +('0026152000000','PEANUT BUTTER CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-10 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6449') +('0026153000000','GF CAKE W/MILK CHOC',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-10 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6450') +('0026154000000','DELECTABLE CHOC DELIGHT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6451') +('0026155000000','COFFEE & CREAM DREAM CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-20 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6452') +('0026156000000','CHOC/STRAW CREAM CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6453') +('0026157000000','ESPRESSO CHOC TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6454') +('0026158000000','CHOC/STRAW FILO TART',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6455') +('0026159000000','SUNSHINE CAKE (SUGAR-FREE)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6456') +('0026161000000','RAZZ ORANGE CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6457') +('0026162000000','STRAW ALMOND CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6458') +('0026163000000','COOKIES AND CREAM CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6459') +('0026164000000','PUMPKIN CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6460') +('0026165000000','BLUEBERRY LEMON CHZ CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6461') +('0026166000000','VEGAN HINT O MINT CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6462') +('0026167000000','GF PARMESAN ROSEMARY CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6463') +('0026168000000','VEGAN GERMAN CHOC CAKE',9.99,'0',0.00,'0',8.99,'0',8.99,'0','1900-01-01 12:00:00','2009-09-30 12:00:00','229','0','0','1','1',0,'0','2006-05-19 12:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6464') +('0026169000000','BUTTERSCOTCH PUDDING',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6465') +('0026171000000','HIGH OCTANE ENERGY BARS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6466') +('0026172000000','BLUEBERRY ORANGE CHZ CAKE',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6467') +('0026173000000','SUMMER BERRY COBBLER',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6468') +('0026174000000','VEGAN COCONUT PECAN CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6469') +('0026175000000','CHOCOLATE CREPES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6470') +('0026176000000','STRAW/BLACKBERRY CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6471') +('0026177000000','GF RAZZ CREAM CHOC CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-31 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6472') +('0026178000000','ITALIAN ARTICHOKE QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6473') +('0026179000000','GF GARLIC HERB CORNBREAD',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6474') +('0026181000000','MINT FILO TART',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6475') +('0026182000000','DOUBLE BERRY ALMOND CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6476') +('0026183000000','CHOC CAKE CREAM CHZ/PECANS',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6477') +('0026184000000','GF CHOCOLATE HAZELNUT TORTE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6478') +('0026185000000','BLACK AND WHITE CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6479') +('0026186000000','FONTINA/WALNUT QUICHE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6480') +('0026187000000','PB CHOCOLATE BARS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6481') +('0026188000000','STRAW/CREAM TART',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6482') +('0026189000000','COFFEE CHEESECAKE TART',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6483') +('0026191000000','GF CHOCOLATE ALMOND CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6484') +('0026192000000','MAGNIFICENT MARBLE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6485') +('0026193000000','RASPBERRY CREAM TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6486') +('0026194000000','GF LEMON ALMOND CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6487') +('0026195000000','SHEPARDS PIE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6488') +('0026196000000','MILK CHOC FILO TART',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6489') +('0026197000000','CHOCOLATE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6490') +('0026198000000','GF CHOCOLATE CHIP WAL COOKIE',7.40,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-04-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6491') +('0026199000000','GF BANANA CREAM PIE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6492') +('0026200000000','PARMESAN REGGIANITO',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-08-21 02:04:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6493') +('0026201000000','GF CHOC CHIP COOKIE TRIFLE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-05-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6494') +('0026202000000','CRANBERRY PECAN BARS',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6495') +('0026203000000','LUSCIOUS LEMON ALMOND CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6496') +('0026205000000','STRAW/LEMON CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6497') +('0026206000000','BLKBERRY ORANGE CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6498') +('0026207000000','CRAB QUICHE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6499') +('0026208000000','SMOKED CHED POTATO QUICHE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6500') +('0026209000000','CREAM PUFFS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-20 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6501') +('0026210000000','PARMESAN WEDGE BELGIOIOSO',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-08-21 02:03:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6502') +('0026211000000','VEGAN RASPBERRY CHOCOLATE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-20 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6503') +('0026212000000','CHOCOLATE SOUR CREAM CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6504') +('0026213000000','LEMON ALMOND CREAM CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6505') +('0026214000000','VEGAN CHOCOLATE ALMOND CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6506') +('0026215000000','DENVER QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6507') +('0026216000000','GIANT TRUFFLES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-06-28 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6508') +('0026217000000','BUTTERSCOTCH CHOC. CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-06-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6509') +('0026218000000','PEACHY PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6510') +('0026219000000','PEACH BERRY PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6511') +('0026220000000','GREEN PASTURES HAVEN',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6512') +('0026221000000','PEANUT BUTTER CREAM CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6513') +('0026222000000','CHOC/STRAW CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-06 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6514') +('0026223000000','CHOCOLATE DECADENCE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-04 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6515') +('0026224000000','STRAWBERRY CREAM CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-07-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6516') +('0026225000000','STRAW TART W/ TRUFFLES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6517') +('0026227000000','APPLE PIE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-07-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6518') +('0026228000000','PB CHOC/CREAM CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6519') +('0026229000000','FRUITY PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6520') +('0026230000000','SAGE DERBY',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 04:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6521') +('0026231000000','DOUBLE BERRY PARFAIT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6522') +('0026232000000','COTSWOLD',20.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6523') +('0026233000000','HUNTSMAN',17.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-20 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6524') +('0026234000000','BLUEBERRY ALMOND CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6525') +('0026235000000','STRAW LEMON CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6526') +('0026237000000','SUMMER BERRY BUSCUITS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-18 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6527') +('0026245000000','ALMOND BLONDIES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-29 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6528') +('0026246000000','PORTABELLA QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-07-29 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6529') +('0026250000000','SWISS EMMENTALER EMMI',9.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-03-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6530') +('0026255000000','SUGAR COOKIE DELIGHT',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6531') +('0026256000000','JALA/TOMATO/CHED PIZZA',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6532') +('0026257000000','MINI GREEK PIZZA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6533') +('0026259000000','BANANA WALNUT CHZCAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-08-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6534') +('0026261000000','SMORES CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6535') +('0026262000000','COCONUT LIME CHZCAKE',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-08-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6536') +('0026263000000','CHOC SWIRL STRAW CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-19 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6537') +('0026264000000','HAZELNUT GANACHE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-19 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6538') +('0026265000000','CHEDDAR BROCCOLI QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-20 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6539') +('0026266000000','SCOTCHEE BARS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6540') +('0026267000000','HARVEST SPICE APPLE PIE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-25 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6541') +('0026268000000','DOUBLE BERRY LAYER CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-08-25 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6542') +('0026269000000','CRANBERRY PECAN PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-25 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6543') +('0026270000000','HAVARTI HRSRDSH CHV',9.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-02-28 03:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6544') +('0026271000000','STRAWBERRY ALMOND CREAM CAKE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-25 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6545') +('0026272000000','SPIN/MUSHROOM QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6546') +('0026273000000','GF ALMOND MOCHA BROWNIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-08-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6547') +('0026274000000','COCONUT CREAM CHZ CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6548') +('0026275000000','CHOCOLATE ALMOND CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2006-09-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6549') +('0026276000000','GF STRAWBERRY CREAM CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-03 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6550') +('0026277000000','PECAN APRICOT TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-06 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6551') +('0026278000000','CHOCOLATE PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-09-06 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6552') +('0026279000000','APPLE BERRY TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-06 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6553') +('0026280000000','WENSLEYDALE W/CRANBERRY',20.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2005-02-10 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6554') +('0026281000000','VEGAN PEANUTBUTTER/CHOC CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6555') +('0026282000000','TOMATO BASIL FETA QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6556') +('0026284000000','ALMOND MOCHA COOKIE PARFAIT',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6557') +('0026285000000','CARMEL APPLE CHEESECAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6558') +('0026286000000','VEGAN BLUEBERRY LEMON CAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6559') +('0026287000000','MILK CHOC HAZELNUT TART',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6560') +('0026288000000','WENDYS BROWNIES',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6561') +('0026289000000','PEAR RASPBERRY CRISP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-09-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6562') +('0026291000000','PUMPKIN BARS',10.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-09-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6563') +('0026292000000','TRIAL BY FIRE BROWNIES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6564') +('0026293000000','GF JAMMIN GINGERBREAD',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6565') +('0026294000000','CRAN/WILD RICE GINGERBREAD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6566') +('0026295000000','VEGAN PUMPKIN CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6567') +('0026296000000','NORTHLAND WILD RICE QUICHE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6568') +('0026297000000','TRIPLE CHOCOLATE TRUFFLES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6569') +('0026298000000','ALPINE MINT CHZCAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6570') +('0026299000000','TRULY TROPICAL CUPCAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6571') +('0026301000000','ESPRESSO PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6572') +('0026302000000','TRIPLE TREAT PUMPKIN BAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6573') +('0026303000000','CHOC/PECAN CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6574') +('0026304000000','ORANGE RAZZ PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6575') +('0026305000000','BACON CHEDDAR BROC QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-09-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6576') +('0026306000000','LEMON CHERRY CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-09-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6577') +('0026307000000','COCOA PUMPKIN CREPES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-01 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6578') +('0026308000000','ALMOND TOFFEE BAR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-17 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6579') +('0026309000000','PUMPKIN PIE TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6580') +('0026311000000','GREEN CHILI CORNBREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6581') +('0026312000000','GF PUMPKIN COOKIE SANDWHICH',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2006-10-08 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6582') +('0026313000000','CHEWY CHOCO NUT BAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-08 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6583') +('0026314000000','VEGAN BAKLAVA',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-10 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6584') +('0026315000000','GF CHOCOLATE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-10 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6585') +('0026316000000','COCONUT TAPIOCA PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-10 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6586') +('0026317000000','ULTRA BLUE CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-10 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6587') +('0026318000000','RAISIN BREAD PUDDING',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-13 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6588') +('0026319000000','BEST BLUEBERRY BARS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-15 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6589') +('0026321000000','SUNNY SESAME PB BALL',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-15 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6590') +('0026322000000','INTERGALACTIC SPACE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-15 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6591') +('0026323000000','RICE KRISPIE BAR (VEGAN)(GF)',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-10-16 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6592') +('0026324000000','COCONUT CUSTARD',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-17 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6593') +('0026325000000','TOASTED COCONUT CREAM PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-18 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6594') +('0026326000000','DRK CHOC STRAWBERRY CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-19 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6595') +('0026327000000','BIG BROWNIE TRIFLE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-10-23 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6596') +('0026328000000','CRANBERRY GINGER CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-23 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6597') +('0026329000000','MAPLE NUT SWT POTATO PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-26 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6598') +('0026331000000','SPOOKY COOKIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-27 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6599') +('0026332000000','BROKEN BONE COOKIE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-30 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6600') +('0026333000000','ULTIMATE VEG AND BACON QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-31 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6601') +('0026334000000','MAMAS LIL SHORTBREAD PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-02 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6602') +('0026335000000','NORTHERN WILD RICE QUICHE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-04 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6603') +('0026336000000','NUTTY SWT POTATO CHZCAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6604') +('0026337000000','ALPINE HINT O MINT TRUFFLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-10 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6605') +('0026338000000','PERFECT PECAN PIE TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-13 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6606') +('0026339000000','PUMPKIN BARS (NO NUTS)',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-11-13 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6607') +('0026341000000','BEST BLUEBERRY PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-14 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6608') +('0026342000000','VEGAN RAZZ ALMOND CHOC CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6609') +('0026343000000','CRANBERRY',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-11-14 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6610') +('0026344000000','Crazy Good Coffee Cake',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-03 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6611') +('0026345000000','GF REALLY GOOD BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-14 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6612') +('0026346000000','MACAROONS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-14 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6613') +('0026347000000','SAUSAGE AND ARTICHOKE QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-16 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6614') +('0026348000000','MOCHA FUDGE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-16 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6615') +('0026349000000','APPLE PIE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-17 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6616') +('0026351000000','GINGERBERRY CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-11-17 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6617') +('0026352000000','BACON & HERBED CORN QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-18 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6618') +('0026353000000','MAPLE PECAN PIE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-11-18 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6619') +('0026354000000','CRANBERRY BREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-18 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6620') +('0026355000000','PEACH CUSTARD PIE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-21 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6621') +('0026356000000','LOVELY LIME PIE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-24 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6622') +('0026357000000','HOLIDAY APPLE/PEACH TART',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-24 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6623') +('0026358000000','TRUFFLES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-28 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6624') +('0026359000000','STRAWBERRY CREAM PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-01 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6625') +('0026361000000','HOLIDAY CHOCOLATE ASSORTMENT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-01 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6626') +('0026362000000','CHIPOLTE CHEDDAR CORNBREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-02 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6627') +('0026363000000','APPLE CRISP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6628') +('0026364000000','BLUEBERRY PEACH PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-05 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6629') +('0026365000000','BLACK- STRAWBERRY CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-05 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6630') +('0026366000000','DOUBLE BERRY BISCUIT PARFAIT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6631') +('0026367000000','SMOKEYBLK BEAN & CORN QUICHE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6632') +('0026368000000','MEGA BERRY PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-10 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6633') +('0026370000000','SWEET TREAT TRAYS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6634') +('0026371000000','GF CHEDDAR GARLIC CORNBREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-12 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6635') +('0026372000000','GF CHOCOLATE ESPRESSO CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6636') +('0026373000000','HARVEST BERRY CHEESECAKE',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-12 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6637') +('0026374000000','THREE CHEESE QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-14 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6638') +('0026375000000','GF GIANT CHOC/CHERRY COOKIE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6639') +('0026376000000','RED PEPPER/CHEDDAR CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6640') +('0026377000000','CHOCOLATE CHERRY CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6641') +('0026378000000','VEGAN BLKBERRY PEACH PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-14 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6642') +('0026379000000','CHEWY PEANUT TOFFE TRIFLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-17 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6643') +('0026380000000','MINI MUFFINS',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2009-01-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6644') +('0026381000000','PEARBERRY PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-20 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6645') +('0026382000000','BAG OF MINI-MUFFINS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-20 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6646') +('0026383000000','VEGAN APPLE PIE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-21 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6647') +('0026384000000','CHERRY MAPLE GINGERBREAD',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-21 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6648') +('0026385000000','BROWNIE TRIFLE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-27 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6649') +('0026386000000','GF CHOC/ALMOND/ESPRESSO CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-12-27 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6650') +('0026387000000','GF CORNBREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-12-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6651') +('0026388000000','SESAME PEANUT BUTTER BARS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-02 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6652') +('0026389000000','NEOPOLITAN CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6653') +('0026390000000','DATE BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','1',0,'0','2009-01-14 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6654') +('0026391000000','TURTLE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6655') +('0026392000000','BUTTERSCOTCH CREAM CUPCAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-06 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6656') +('0026393000000','GF DOUBLE CHOCOLATE COOKIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6657') +('0026394000000','REALLY GOOD PARFAIT (GF)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-21 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6658') +('0026395000000','GF PEANUT BUTTER CHOC CHIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-13 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6659') +('0026396000000','PEANUT BUTTER BLOSSOMS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6660') +('0026397000000','NEW YEARS RESOLUTIION BREAKER',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6661') +('0026398000000','DBL CHEESE AND HAM QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-14 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6662') +('0026399000000','VEGAN ORANGE SPICE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-14 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6663') +('0026401000000','CHOCOLATE COVERED CHERRY BAR',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2006-11-15 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6664') +('0026402000000','CHOCOLATE PEANUT BUTTER PIE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-11-30 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6665') +('0026403000000','GF RED PEPPER CHED CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6666') +('0026404000000','GF PEANUT BUTTER COOKIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6667') +('0026405000000','GF DOUBLE CHOC COOKIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-01-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6668') +('0026406000000','GF CHEESY HERB SCONE',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-18 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6669') +('0026409000000','BOSTON CREAM PIE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6670') +('0026411000000','CHOC/STRAW CHZ CAKE TART',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6671') +('0026412000000','GF BLACKBERRY CREAM CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-27 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6672') +('0026413000000','GF VEGAN CHOCOLATE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6673') +('0026414000000','GF CHEDDAR CHIPOLTE CORNBREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','1',0,'0','2007-01-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6674') +('0026415000000','GF LEMON ALMOND CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6675') +('0026416000000','RAZZ CREAM CHOC CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2007-01-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6676') +('0026417000000','CRAISIN OAT SHORTBREAD COOKIE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6677') +('0026419000000','CHEDDAR BACON TOMATO QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-01-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6678') +('0026421000000','CHOCOLATE ECLAIR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-02-07 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6679') +('0026422000000','CHOCOLATE CHERRY CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-07 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6680') +('0026423000000','APPLE WALNUT SPICE CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-07 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6681') +('0026424000000','PEANUT BUTTER CHOCOLATE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-02-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6682') +('0026425000000','FOG CITY BASIL FOCACCIA',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6683') +('0026426000000','DOUBLE MOCHA CHEESECAKE',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6684') +('0026427000000','PARMESAN RED PEPPER CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6685') +('0026428000000','GF GREEN CHILI CORNBREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6686') +('0026429000000','CHOCOLATE GINGER BROWNIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-02-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6687') +('0026431000000','ESPRESSO CHOCOLATE CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-02-21 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6688') +('0026432000000','HAZELNUT BROWNIE DELIGHT',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-02-23 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6689') +('0026433000000','TEST',1.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-02-25 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6690') +('0026434000000','BUTTERNUT SQUASH PIE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6691') +('0026435000000','BUTTERNUT SQUASH BAR',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6692') +('0026436000000','GF APPLE PECAN SPICE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6693') +('0026437000000','HAZELNUT CHEESECAKE TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6694') +('0026438000000','VEGAN CHOCOLATE ORANGE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-03-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6695') +('0026439000000','VEGAN CHOCOLATE SILK PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6696') +('0026441000000','CRANBERRY PUMPKIN BAR',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-17 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6697') +('0026442000000','CHOCOLATE RASPBERRY BROWNIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-19 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6698') +('0026443000000','SAUSAGE/MUSH/SWISS QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-22 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6699') +('0026444000000','CHOCOLATE CHERRY BROWNIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-03-22 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6700') +('0026445000000','GF APPLE CINNAMON COBBLER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-03-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6701') +('0026446000000','LEMON CHEESECAKE BAR',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-04-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6702') +('0026447000000','STRAWBERRY PEACH COBBLER',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-04-06 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6703') +('0026448000000','BUNNY CAKES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-04-06 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6704') +('0026449000000','LIL LEMON ALMOND CAKE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-04-07 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6705') +('0026451000000','LIL STRAW/ALMOND CAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-04-18 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6706') +('0026452000000','FOG CITY DOG TREATS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-04-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6707') +('0026453000000','RASPBERRY CHOCO CAKE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-04-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6708') +('0026454000000','CHOC/STRAW GANACHE CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-03 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6709') +('0026455000000','CHOC/STRAW ALMOND CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6710') +('0026456000000','BACON SAUSAGE BREAKFAST QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6711') +('0026457000000','FRESH STRAWBERRY TART',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6712') +('0026459000000','BANANA SPLIT CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6713') +('0026460000000','SLICED PROVOLONE',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6714') +('0026461000000','STRAWBERRY RHUBARB CRISP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-05-21 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6715') +('0026462000000','SICILIAN QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-25 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6716') +('0026463000000','MANGO COCONUT CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6717') +('0026464000000','CHEDDAR GARLIC CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-05-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6718') +('0026465000000','BLUEBERRY PEACH COBBLER',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-29 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6719') +('0026466000000','PLUM GINGER CRISP',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-05-29 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6720') +('0026470000000','BROMFIELD (CHEDDAR)',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-05-02 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6721') +('0026471000000','FLOURLESS STRAW-CHOCOLATE CAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2007-06-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6722') +('0026479000000','FLOURLESS LEMON ALMOND CAKE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6723') +('0026481000000','LEMON PIE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-14 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6724') +('0026482000000','AMAZING APPLE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-11-12 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6725') +('0026483000000','CRANBERRY APPLE PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-11-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6726') +('0026484000000','VEGAN PUMPKIN PIE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-11-19 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6727') +('0026485000000','PUMPKIN BUNDT CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-11-19 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6728') +('0026486000000','RASPBERRY ALMOND CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','2','1','0',0,'0','2008-11-20 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'6729') +('0026487000000','BUTTERMILK GINGERBREAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-11-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6730') +('0026488000000','FLOURLESS CHOC. OR. ALM. CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6731') +('0026489000000','VEGAN BROWNIES',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-11-21 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6732') +('0026490000000','ROMANO WEDGE NON-ORG',13.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-10-26 01:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6733') +('0026491000000','RUSTICO BLACK PEPPER',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-04-03 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6734') +('0026494000000','SPICED PEAR CAKE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-11-21 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6735') +('0026495000000','VEGETABLE POT PIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-11-22 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6736') +('0026496000000','BRIE ROUZAIRE',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-01-23 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6737') +('0026497000000','CAMEMBERT OLD CHATHAM',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6738') +('0026498000000','ST NECTAIRE',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-12-28 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6739') +('0026499000000','BRIE ERMITAGE',10.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-12-28 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6740') +('0026501000000','BANANA WHITE CHOC. GANACHE PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6741') +('0026508000000','TALEGGIO ITALIAN CHEESE',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-09-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6742') +('0026511000000','BRIE DELICE BOURGOGNE',20.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-07-07 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6743') +('0026514000000','TALEGGIO',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-03 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6744') +('0026516000000','CYPRESS GROVE HUMBOLDT FOG',23.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 03:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6745') +('0026517000000','MAD RIVER ROLL',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-15 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6746') +('0026518000000','BRIE EXPLORATEUR PETIT',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6747') +('0026519000000','PIERRE ROBERT',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-12-28 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6748') +('0026520000000','CHEDDAR GRAFTON 4 YR',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-22 11:05:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6749') +('0026521000000','WIDMERS 6 YEAR CHEDDAR',20.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-02-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6750') +('0026522000000','CHEDDAR GRAFTON 1 YR',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-12-20 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6751') +('0026523000000','CHEDDAR GRAFTON 2 YR',11.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-09-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6752') +('0026524000000','SMOKEY SHARP CHEDDAR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'499','2009-09-11 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6753') +('0026525000000','CHEDDAR GRAFTON 3 YR',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-03 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6754') +('0026526000000','WIDMERS 4 YR CHEDDAR',17.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-11-15 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6755') +('0026560000000','MUENSTER',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-22 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6756') +('0026580000000','HALLOUMI CHEESE',22.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-04-08 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6757') +('0026620000000','SMOKED PROVOLONE',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2005-03-11 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6758') +('0026621000000','PROVALONE- UNSMOKED',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2007-06-06 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6759') +('0026650000000','SWISS DOMESTIC',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-11-06 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6760') +('0026651000000','SWISS BABY DOMESTIC',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2009-04-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6761') +('0026660000000','CEDAR GROVE MARBLE COLBY NON-O',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6762') +('0026666000000','BANANA WALNUT CAKE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-05-30 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6763') +('0026667000000','DOUBLE DECKER CREAM CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6764') +('0026668000000','STRAWBERRY RHUBARB PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6765') +('0026669000000','SWEET RASPBERRY CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-06 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6766') +('0026670000000','CEDAR GROVE CHEDDAR NON-O',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-11-06 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6767') +('0026671000000','VEGAN STRAWBERRY HAZELNUT CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-06 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6768') +('0026672000000','PINEAPPLE CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6769') +('0026673000000','RASPBERRY APPLE CRISP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','1',0,'0','2007-06-07 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6770') +('0026674000000','PARMESAN SWISS CORN BREAD',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-08 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6771') +('0026675000000','PARMESAN SWISS CORN BREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-08 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6772') +('0026676000000','BLUEBERRY CREAM CHOCOLATE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6773') +('0026677000000','TROPICAL STORM CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6774') +('0026678000000','RASP WHITE CHOCO CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6775') +('0026680000000','CEDAR GROVE COLBY NON-O',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6776') +('0026681000000','STRAWBERRY VANILLA CREAM PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6777') +('0026683000000','BLUEBERRY CRISP',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-14 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6778') +('0026684000000','PEACHES-N-CREAM CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6779') +('0026685000000','CLASSIC KEY LIME PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-06-19 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6780') +('0026686000000','CHOCOLATE HEAVEN CREAM PIE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6781') +('0026687000000','TRAIL MIX PARFAIT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6782') +('0026688000000','LEMON-COCONUT BAR',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-21 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6783') +('0026690000000','CEDAR GROVE FARMERS NON-O',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 12:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6784') +('0026691000000','CINNAMON PEACH CAKE (VEGAN)',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6785') +('0026692000000','CHERRY COBBLER',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6786') +('0026693000000','CAJETA POUND CAKE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6787') +('0026694000000','GINGER CAKE WITH PEAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6788') +('0026695000000','CINNAMON CAKE WITH APPLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6789') +('0026696000000','STRAW/RASP CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-04 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6790') +('0026697000000','ROASTED BANANA CHEESE CAKE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6791') +('0026698000000','LITTLE FRUITY PIZZA',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6792') +('0026699000000','BLUEBERRY COFFEE CAKE (GF)',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6793') +('0026700000000','CEDAR GROVE MONTEREY NON-O',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 12:02:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6794') +('0026701000000','JALAPENO CORN BREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6795') +('0026702000000','ZUCCHINI BREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-10 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6796') +('0026703000000','ZUCCHINI BREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-10 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6797') +('0026704000000','GF FLOURLESS CHOCOLATE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-11 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6798') +('0026705000000','QUINOI',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6799') +('0026706000000','SPINACH PARMESAN RICOTTA',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6800') +('0026707000000','RED VELVET VEGAN CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6801') +('0026708000000','HONEY NUT CUPCAKES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6802') +('0026709000000','PEAR APRICOT TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6803') +('0026710000000','CEDAR GROVE PEPPERJACK NON-O',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2004-11-16 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6804') +('0026711000000','PEACHES-N-CREAM CHEESECAKE',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-25 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6805') +('0026714000000','BLUEBERRY COBBLER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-10 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6806') +('0026720000000','CEDAR GROVE ORGANIC CHEDDAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-11-27 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6807') +('0026721000000','DOUBLE BERRY CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6808') +('0026722000000','KEY LIME PIE BITES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6809') +('0026723000000','LIL KEY LIME PIE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6810') +('0026724000000','DONNAY',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-07-28 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6811') +('0026725000000','BOSTON CREAM PIE CUPCAKES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6812') +('0026726000000','CHOCOLATE AMARETTO CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-07-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6813') +('0026727000000','GF CLOUD CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-01 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6814') +('0026728000000','RASP. WHITE CHOC. CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6815') +('0026729000000','BLACK BOTTOM CUPCAKE BITES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-02 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6816') +('0026730000000','CEDAR GROVE ORGANIC COLBY',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6817') +('0026731000000','GF RASPBERRY CREAM CAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-04 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6818') +('0026732000000','GF LEMON CHEESECAKE BAR',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-05 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6819') +('0026733000000','LEMON FRUIT TART',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6820') +('0026734000000','LEMON CURD FRUIT TART',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6821') +('0026735000000','MONKEYS DREAM CAKE',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6822') +('0026736000000','STRAWBERRY COCONUT CHEESECAKE',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-07 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6823') +('0026737000000','CHEWY GRANOLA BARS',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6824') +('0026738000000','FLOURLESS RASPBERRY CHOCOLATE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6825') +('0026739000000','TOMATO BASIL PINENUT QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6826') +('0026740000000','CEDAR GROVE M JACK ORGANIC',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-05-06 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6827') +('0026741000000','CHOCOLATE MINT CHEESECAKE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6828') +('0026742000000','CHOCOLATE MINT CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6829') +('0026743000000','GF CHIPOLTE CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6830') +('0026744000000','PEACH PIZZA',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-11 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6831') +('0026745000000','VEGAN CHOCOLATE BLUEBERRY CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6832') +('0026746000000','CUCUMBER MINT',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6833') +('0026747000000','ROSES SUPRISE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6834') +('0026748000000','ZUCCHINI PARMESAN QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-17 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6835') +('0026749000000','VELVET SPICE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-18 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6836') +('0026750000000','CEDAR GROVE ORGANIC FARMER',10.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2004-11-16 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6837') +('0026751000000','MINI VANILLA FONDANT CAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6838') +('0026752000000','CUCMBER MINT SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-08-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6839') +('0026753000000','LEMON CREAM PIE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6840') +('0026754000000','CHERRY PIE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-21 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6841') +('0026756000000','COCONUT CREAM CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-08-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6842') +('0026757000000','BANANA BREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6843') +('0026758000000','PEPPERMINT BARK',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-08-24 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6844') +('0026759000000','CHICKEN BACON POT PIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-08-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6845') +('0026760000000','STRAWBERRY DELIGHT TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6846') +('0026761000000','STRAWBERRY TART',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6847') +('0026762000000','CHOCO PEPPERMINT CUPCAKES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-27 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6848') +('0026763000000','GF RASPBERRY CHOCOLATE CAKE',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-08-28 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6849') +('0026764000000','STRAWBERRY LEMON CUPCAKES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-29 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6850') +('0026765000000','CHOCO PEPPERMINT CUPCAKES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6851') +('0026766000000','CINNAMON CREAM CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-08-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6852') +('0026767000000','POUND CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-08-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6853') +('0026768000000','APPLE DUMPLINGS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6854') +('0026769000000','SWEET SAMPLER HOLIDAY TRAY',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-09-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6855') +('0026770000000','CHOCO PEANUT BUTTER CUPS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6856') +('0026771000000','CHOCOLATE PEANUT BUTTER CUPS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-04 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6857') +('0026772000000','APPLE COBBLER',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-05 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6858') +('0026773000000','DOUBLE BERRY ALMOND CUPCAKES',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-05 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6859') +('0026774000000','CHERRY VANILLA CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6860') +('0026775000000','SPICED APPLE WALNUT VEGAN CAKE',8.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-24 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6861') +('0026776000000','BANANA BREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6862') +('0026777000000','VANILLA CUPCAKE W/ BLUEBERRY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6863') +('0026778000000','RASPBERRY CREAM CHOCOLATE CAKE',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-11 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6864') +('0026779000000','DREAMSICLE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6865') +('0026781000000','MOCHA BROWNIE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6866') +('0026782000000','RASPBERRY SWIRL CHEESECAKE BAR',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-18 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6867') +('0026783000000','GINGER MOLASSES COOKIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-19 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6868') +('0026784000000','SWISS AND SHRIMP QUICHE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-22 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6869') +('0026785000000','PUMPKIN GINGER CHEESECAKE BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6870') +('0026786000000','CHERRY OATMEAL COOKIE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6871') +('0026788000000','HERBED CHARD & PARMESAN QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-26 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6872') +('0026789000000','CHOCOLATE MINT MOUSSE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6873') +('0026791000000','BLUE CHEESE AND BACON QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-27 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6874') +('0026792000000','PUMPKIN GINGER CHEESE CAKE',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-09-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6875') +('0026793000000','CARAMEL APPLE PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-09-29 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6876') +('0026794000000','RASPBERRY CHOCOLATE BROWNIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-02 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6877') +('0026795000000','GINGERBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-02 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6878') +('0026796000000','MARBLE CAKE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-04 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6879') +('0026797000000','NEW YORK CHEESECAKE',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-06 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6880') +('0026798000000','MARBLE GANACHE CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-06 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6881') +('0026799000000','MANGO CHUTNEY CHEESECAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6882') +('0026800000000','CHOCOLATE BUTTERSCOTCH MOUSSE',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-09 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6883') +('0026801000000','LEMON MERINGUE PIE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-09 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6884') +('0026802000000','PUMPKIN BREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6885') +('0026803000000','BLUEBERRY ALMOND CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-11 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6886') +('0026804000000','GF ALMOND BUTTER COOKIE',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-12 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6887') +('0026805000000','DELUXE CHOCOLATE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6888') +('0026806000000','TRIPLE CHOCOLATE COOKIE TRIFLE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-17 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6889') +('0026807000000','VANILLA & CHOCOLATE CUPCAKES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-18 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6890') +('0026808000000','ROASTED GARLIC ROSEMARY QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-20 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6891') +('0026809000000','RUSTIC APPLE TART',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'mixmatchcode','2009-09-25 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6892') +('0026810000000','MAPLE CHOCOLATE CREAM CAKE',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-23 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6893') +('0026811000000','LEMON FANTASY CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-24 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6894') +('0026812000000','CHERRY CRANBERRY COBBLER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-24 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6895') +('0026813000000','PISTACHIO MILK CHOC. MOUSSE',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-25 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6896') +('0026814000000','GINGERBREAD TRIFLE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-25 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6897') +('0026815000000','SUN-DRIED TOMATO SPINACH FETA',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-27 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6898') +('0026816000000','CRANBERRY BISCOTTI',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-27 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6899') +('0026817000000','CHEVRE DONNAY ORGANIC',12.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2007-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6900') +('0026818000000','french silk pie',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-29 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6901') +('0026819000000','FLOURLESS CHOC. CHEERY CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-29 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6902') +('0026820000000','CHOCOLATE ORANGE CUPCAKE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-30 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6903') +('0026821000000','LOW SUGAR PUMPKIN MUFFINS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-10-15 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6904') +('0026822000000','CARMERLIZED ONION BACON QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-10-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6905') +('0026823000000','BONEYARD COOKIES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-30 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6906') +('0026824000000','PUMPKIN WHOOPIE PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6907') +('0026825000000','PISTACHIO OATMEAL FRUIT COOKIE',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-01 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6908') +('0026826000000','BLUEBERRY LEMON PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-05 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6909') +('0026827000000','CITRUS CAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-06 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6910') +('0026828000000','SWEET POTATO PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-06 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6911') +('0026829000000','MAPLE PECAN CHEESECAKE',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-06 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6912') +('0026830000000','ROMANO- GRATED',6.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2008-01-23 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6913') +('0026831000000','GINGER PEAR CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-07 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6914') +('0026832000000','TOFU PUMPKIN PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6915') +('0026833000000','PUMPKIN CHEESECAKE TRIFLE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6916') +('0026834000000','PUMPKIN SPICE CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6917') +('0026835000000','GERMAN CHOCOLATE CAKE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-09 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6918') +('0026836000000','CRANBERRY PECAN SPICE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-10 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6919') +('0026837000000','GF THREE PEPPER CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-10 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6920') +('0026838000000','VANILLA BUTTERCREAM CUPCAKES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6921') +('0026839000000','BACON AND VEGGIE QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-13 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6922') +('0026840000000','VANILLA CHAI CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-13 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6923') +('0026841000000','VANILLA CHAI CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-13 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6924') +('0026842000000','APPLE PIE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-16 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6925') +('0026844000000','PUMPKIN PIE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-11-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6926') +('0026845000000','WALNUT GOAT CHEESE SPINACH',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6927') +('0026846000000','CRAN-MAPLE PECAN CHEESECAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-17 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6928') +('0026847000000','CRANBERRY RICE PUDDING',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-05 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6929') +('0026848000000','PECAN PIE TRIFLE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-19 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6930') +('0026849000000','SPICE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-20 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6931') +('0026850000000','VANILLA AND CHOCOLATE PUDDING',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-20 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6932') +('0026852000000','PUMPKIN CREAM CHEESECAKE',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-20 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6933') +('0026854000000','SOUTHWEST QUICHE WITH BACON',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-23 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6934') +('0026855000000','CRANBERRY SPICE CUPCAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-23 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6935') +('0026856000000','GO GREEN QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-24 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6936') +('0026857000000','MISSISSIPPI MUD BARS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-04 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6937') +('0026858000000','PUMPKIN ROLL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-25 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6938') +('0026859000000','LEMON BAR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6939') +('0026861000000','MANGO CHUTNEY CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-26 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6940') +('0026862000000','CARAMEL GANACHE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-26 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6941') +('0026863000000','GF CHOCOLATE CHIP PECAN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-11-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6942') +('0026864000000','MAPLE CHOCOLATE VEGAN PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-27 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6943') +('0026865000000','00269021000000',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6944') +('0026866000000','HOLIDAY APPLE PIE',11.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','2007-11-28 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6945') +('0026867000000','RASPBERRY VANILLA CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-11-28 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6946') +('0026868000000','DELUXE LEMON CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-04 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6947') +('0026869000000','CHERRY PIE TRIFLE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-04 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6948') +('0026871000000','GF PB & MILK CHOCO CHIP COOKIE',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-05 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6949') +('0026872000000','HAZELNUT CHOCO GANACHE TART',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-05 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6950') +('0026873000000','HEAVENLY CHOCOLATE RASPBERRY',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-07 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6951') +('0026874000000','CAT ATTACK COOKIES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-08 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6952') +('0026875000000','BLACK FOREST CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-09 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6953') +('0026876000000','WHITE CHOC. PUMPKIN CHEESECAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-10 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6954') +('0026877000000','LEMON POPPY SEED CAKE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-11 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6955') +('0026878000000','CHOC CHIP OATMEAL WALNUT COOKI',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-12 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6956') +('0026879000000','DARK CHOCOLATE ALMOND COOKIES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-12 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6957') +('0026881000000','COOKIE TRAY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-12 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6958') +('0026882000000','COOKIE CHRISTMAS TRAY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-12 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6959') +('0026883000000','VANILLA CAKE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6960') +('0026884000000','STRAWBERRY SWIRL CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','1','0',0,'0','2009-07-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'6961') +('0026885000000','LEMON RASPBERRY BARS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2007-12-15 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6962') +('0026886000000','DARK CHOCOLATE TRUFFLES',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-15 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6963') +('0026887000000','THREE CHEESE WITH BACON',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6964') +('0026888000000','FLOURLESS CHOC CAKE W/ GANACHE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-18 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6965') +('0026889000000','LEMON FIG CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-18 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6966') +('0026891000000','BLUEBERRY UPSIDE-DOWN CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-19 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6967') +('0026892000000','SUGAR COOKIES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-19 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6968') +('0026893000000','PUMPKIN SANDWICH COOKIES',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-29 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6969') +('0026894000000','APPLE CINNAMON CAKE ( VEGAN)',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-12-29 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6970') +('0026895000000','ULTIMATE CHOCOLATE CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-12-30 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6971') +('0026896000000','SPINACH SAUSAGE QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-02 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6972') +('0026897000000','CHOCOLATE ALMOND MOUSSE (VEGAN',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6973') +('0026898000000','PINEAPPLE UPSIDE DOWN CAKE',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-01-04 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6974') +('0026899000000','JALAPENO CHEDDAR QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6975') +('0026901000000','SAUSAGE AND VEGETABLE QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6976') +('0026902000000','ORANGE ZEST CHEESECAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-06 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6977') +('0026903000000','BUTTERMILK CARDAMOM PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-07 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6978') +('0026904000000','6 CHOC CHIP WALNUT COOKIES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-09 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6979') +('0026905000000','BLACKBERRY ORANGE CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-09 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6980') +('0026906000000','FLOURLESS CHOCOLATE-PEAR TART',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6981') +('0026907000000','MINTY CHOCOLATE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6982') +('0026908000000','CRANBERRY UPSIDE DOWN CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-14 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6983') +('0026909000000','CHOKE CHERRY JELLY ROLL',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-01-14 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6984') +('0026911000000','MOLASSES SANDWICH COOKIES',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-14 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6985') +('0026912000000','CHEESY WILD RICE CORNBREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-16 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6986') +('0026913000000','CHICKEN POT PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-17 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6987') +('0026914000000','VEGAN CHOCO STRAWBERRY CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-18 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6988') +('0026915000000','VEGAN CARROT CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6989') +('0026916000000','ORANGE CHOCOLATE CUPCAKE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-21 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6990') +('0026917000000','TRES LECHES CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-23 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6991') +('0026918000000','TUXEDO CHEESECAKE',12.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-30 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6992') +('0026920000000','CREAM CHEESE BROWNIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-30 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6993') +('0026923000000','VEGETABLE POT PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6994') +('0026924000000','CHOCO PEANUT BUTTER CUPCAKES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-01-31 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6995') +('0026925000000','CORN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6996') +('0026926000000','DEEP CHOCOLATE PUDDING',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-01 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6997') +('0026927000000','BOSTON CREAM PIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-01 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6998') +('0026928000000','CREAMY CHEESECAKE PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'6999') +('0026929000000','APPLE CREAM CRISP',8.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7000') +('0026930000000','RASP. WHITE CHOC CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-05 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7001') +('0026931000000','RASP. WHITE CHOC. CHEESECAKE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-05 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7002') +('0026932000000','GF PECAN CHOCOLATE CHUNK',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7003') +('0026933000000','HAZELNUT ESSPRESSO COOKIES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-06 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7004') +('0026934000000','CHOCOLATE PEANUT-BUTTER BALLS',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7005') +('0026935000000','CREPE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7006') +('0026936000000','SPINACH FETA TOMATO QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7007') +('0026937000000','RASP. WHITE CHOC. CAKE FOR 2',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-11 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7008') +('0026938000000','Italian Sausage and Polenta',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7009') +('0026939000000','TRIPLE CHOCOLATE TRUFFLE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7010') +('0026941000000','VALENTINE SHORTBREAD COOKIES',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7011') +('0026942000000','CHOCOLATE DIPPED STRAWBERRIES',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7012') +('0026943000000','WHITE CHOCO CHUNK BROWNIE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7013') +('0026944000000','PEACH MANGO CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7014') +('0026945000000','MILK CHOCOLATE WALNUT BROWNIE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7015') +('0026946000000','FRENCH SILK PIE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-02-18 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7016') +('0026947000000','MEXICAN WEDDING CAKES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-18 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7017') +('0026948000000','ULTIMATE COCONUT CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7018') +('0026949000000','CHOCOLATE ALMOND CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-19 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7019') +('0026950000000','CEDAR GROVE ORG. PEPPERJACK',9.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-11-16 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7020') +('0026951000000','SOUTHWEST QUICHE WITH BACON',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-02-20 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7021') +('0026952000000','APPLE CRANBERRY CRISP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7022') +('0026953000000','CHOCOLATE PEPPERMINT CAKE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-02-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7023') +('0026954000000','GINGER BREAD BAR',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-03-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7024') +('0026955000000','HARVEST COOKIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-03 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7025') +('0026956000000','LAYERED LEMON COCONUT CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-03-04 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7026') +('0026957000000','MV BUCKWHEAT SOBA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7027') +('0026959000000','MV SOY-TEIN W/ SPINACH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-04 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7028') +('0026960000000','TOMATO BASIL GOUDA',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7029') +('0026964000000','MV SESAME NOODLES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-04 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7030') +('0026967000000','CHERRY CHOCO ALMOND MOUSSE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-04 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7031') +('0026968000000','CHOCOLATE BANANA CREAM PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-03-05 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7032') +('0026969000000','COCONUT CREAM PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7033') +('0026970000000','GOUDA EICHTENS',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2007-11-27 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7034') +('0026971000000','MANGO CURRY TRUFFLES',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7035') +('0026972000000','MUSHROOM AND SWISS QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-03-09 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7036') +('0026973000000','STRAWBERRY CHOCO. CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7037') +('0026974000000','GF MILK CHOCO PB COOKIE TRIFLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7038') +('0026975000000','MANGO BLUEBERRY CAKE (VEGAN)',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-11 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7039') +('0026976000000','CASHEW-COCONUT-CHOCOLATE TART',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7040') +('0026977000000','LEMON GINGER CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7041') +('0026978000000','CHOCO OATMEAL COCONUT COOKIES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-12 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7042') +('0026979000000','OATMEAL COOKIE BAR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-03-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7043') +('0026981000000','STRAWBERRY LEMON CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-03-17 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7044') +('0026982000000','BUTTERMILK BISCUITS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-03-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7045') +('0026983000000','LEMON CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-03-24 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7046') +('0026984000000','CARMELIZED PEAR TART',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-04-01 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7047') +('0026985000000','LEMON CURD CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-04-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7048') +('0026986000000','LEMON CURD',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','0',0,'0','2008-04-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7049') +('0026987000000','WHITE CHOCO LEMON CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-02 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7050') +('0026988000000','BLACKBIRD PIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-02 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7051') +('0026989000000','SPRING SPINACH DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-03-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7052') +('0026990000000','VANILLA CHOCOLATE CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-04 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7053') +('0026991000000','PAPAYA COCONUT CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7054') +('0026992000000','TROPICAL CARROT CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-04-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7055') +('0026993000000','BLACK OUT CHOCOLATE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-04-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7056') +('0026994000000','PEACE LOVE CHOCOLATE 13 PACK',18.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2009-02-04 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7057') +('0026995000000','PEACE LOVE CHOC 6 PACK',10.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2009-02-04 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7058') +('0026996000000','59% DARK CHOCOLATE CORDILLERA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2007-12-12 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7059') +('0026997000000','70% DARK CHOCOLATE CORDILLERA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2008-06-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7060') +('0027000000000','FRESH GROUND BISON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-10-26 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7061') +('0027001000000','HAM & SWISS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'0','2005-04-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7062') +('0027002000000','HALF ROAST BEEF AND CHEDDAR',2.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'1','2009-01-21 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7063') +('0027003000000','Bagel',1.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-08-20 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7064') +('0027004000000','TURKEY & SPINACH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'0','2005-04-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7065') +('0027005000000','Bagel w cream cheese',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2007-08-20 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7066') +('0027006000000','SOUTHWEST SMOKED TURKEY SAND',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','1','0',0,'0','2008-05-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7067') +('0027007000000','HALF VEGGIE AND CHEESE SAMMY',2.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'1','2007-10-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7068') +('0027008000000','HALF TURKEY AND SPINACH SANDWI',2.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'1','2007-10-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7069') +('0027009000000','HALF HAM & SWISS',2.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'1','2007-10-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7070') +('0027010000000','FRESH BISON CUBE STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-10-26 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7071') +('0027011000000','ROAST BEEF & CHEDDAR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'0','2007-10-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7072') +('0027012000000','ROAST BEEF',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2005-05-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7073') +('0027013000000','VEGGIE HUMMUS WRAP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','1',0,'0','2007-12-02 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7074') +('0027014000000','Little Turkey with cheese',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'0','2007-10-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7075') +('0027015000000','SANDWICH OF THE MONTH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','1','0',0,'0','2005-05-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7076') +('0027016000000','GREEK WRAP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','1',0,'0','2006-11-07 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7077') +('0027017000000','CLUB SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','1','0',0,'0','2008-07-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7078') +('0027018000000','ITALIAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2005-10-20 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7079') +('0027019000000','RACHEL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2005-11-05 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7080') +('0027020000000','FRESH BISON FLANK STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-10-26 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7081') +('0027021000000','TUSCAN TUNA WRAP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7082') +('0027022000000','ALMOND CHICKEN WRAP',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7083') +('0027023000000','CURRIED CHICKEN WRAP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7084') +('0027024000000','Cranberry Tuna Wrap',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7085') +('0027025000000','Apricot Almond Chicken Wrap',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7086') +('0027026000000','TARRAGON CHICKEN WRAP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7087') +('0027027000000','BLACKENED CHICKEN WRAP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7088') +('0027028000000','FIESTA LIME CHICKEN WRAP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7089') +('0027029000000','FOG CITY CHICKEN WRAP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7090') +('0027030000000','BISON ROUND RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7091') +('0027031000000','DELI TUNA WRAP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7092') +('0027032000000','Deli Chicken Wrap',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-14 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7093') +('0027033000000','TEMPEH CHICKLESS WRAP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-07-27 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7094') +('0027034000000','ALMOND CHICKLESS WRAP',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-07-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7095') +('0027035000000','JERK CHICKEN WRAP',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','1',0,'0','2008-02-02 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7096') +('0027036000000','WALDORF CHICKEN WRAP',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','1',0,'0','2008-02-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7097') +('0027037000000','AWESOME CHICKEN WRAPS',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','1',0,'0','2008-10-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7098') +('0027038000000','CURRY MANGO CHICKEN WRAP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-07-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7099') +('0027039000000','GF TUSCAN TUNA WRAP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-07-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7100') +('0027041000000','GF CRANBERRY TUNA WRAP',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-07-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7101') +('0027042000000','GF FOG CITY CHICKEN WRAP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-07-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7102') +('0027050000000','NORTHSTAR BISON KABOB MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-05-14 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7103') +('0027060000000','FRESH BISON STEW MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-11-15 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7104') +('0027061000000','NORTHSTAR BISON SNACK STICKS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-10-04 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7105') +('0027062000000','BISON LIVER, NORTHSTAR',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-12-26 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7106') +('0027063000000','FRESH BISON TENDERLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-12-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7107') +('0027064000000','CALIFORONIA BLEND SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-02-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7108') +('0027066000000','NORTHSTAR BISON SUMMER SAUSAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-08-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7109') +('0027070000000','BISON HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-01-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7110') +('0027080000000','BISON SIRLOIN STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-01-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7111') +('0027090000000','BISON SIRLOIN ROAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-01-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7112') +('0027100000000','BISON RIB EYE STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-06-14 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7113') +('0027101000000','KEY LIME BAR',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-04-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7114') +('0027120000000','TURKEY WHOLE ORGANIC PRAIRIE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7115') +('0027121000000','TUSCAN TUNA SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-11-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7116') +('0027122000000','ALMOND CHICKEN SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7117') +('0027123000000','CURRY CHICKEN SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7118') +('0027124000000','CRANBERRY TUNA SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7119') +('0027125000000','APRICOT ALMOND CHICKEN SAND.',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7120') +('0027126000000','TARRAGON CHICKEN SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-11-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7121') +('0027127000000','BLACKENED CHICKEN SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-11-07 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7122') +('0027128000000','FIESTA LIME SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7123') +('0027129000000','FOG CITY CHICKEN SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-11-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7124') +('0027130000000','THOUSAND HILLS TENDERLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'mixmatchcode','2009-02-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7125') +('0027131000000','DELI TUNA SANDWICH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-11-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7126') +('0027132000000','Deli Chicken Sandwich',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2006-12-03 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7127') +('0027135000000','FRESH BEELER HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-04-05 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7128') +('0027140000000','BEELER EZ CARVE HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-12-06 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7129') +('0027141000000','THOUSAND HILLS BEEF BRISKET',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-06-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7130') +('0027150000000','THOUSAND HILLS FRESH RIB-EYE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7131') +('0027151000000','THOUSAND HILLS STEW MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-10-26 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7132') +('0027160000000','THOUSAND HILLS FRESH NY STRIP',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7133') +('0027161000000','THOUSAND HILLS STIR FRY BEEF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-11-10 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7134') +('0027162000000','BMACADAMIA HONEY GLAZED OG',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'7135') +('0027163000000','BWATERMELON DRIED OG REPACK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'0','2008-11-13 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'7136') +('0027170000000','THOUSAND HILLS TOP SIRLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7137') +('0027171000000','THOUSAND HILLS BEEF LIVER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-12-26 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7138') +('0027180000000','THOUSAND HILLS TOP ROUND',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7139') +('0027181000000','THOUSAND HILLS WR PATTIES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-05-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7140') +('0027190000000','THOUSAND HILLS CHUCK/ARM RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7141') +('0027191000000','THOUSAND HILLS FRESH PATTIES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-05-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7142') +('0027200000000','THOUSAND HILLS ROUND TIP STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-05-14 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7143') +('0027208000000','GRILLLED ITALIAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2005-05-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7144') +('0027210000000','THOUSAND HILLS ROUND RUMP RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7145') +('0027220000000','BISON N.Y. STRIP STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7146') +('0027221000000','FRESH BISON SKIRT STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-10-10 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7147') +('0027222000000','NSTAR FRESH GROUND LAMB',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-18 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7148') +('0027223000000','NSTAR FRESH LAMB CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-18 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7149') +('0027230000000','PASTURES FRESH HAM RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7150') +('0027231000000','PASTURES FRESH SMOKED HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7151') +('0027235000000','PASTURES PORK ROAST SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-09-25 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7152') +('0027239000000','PASTURES SANDWICH HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-10-16 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7153') +('0027240000000','PASTURES FRESH BNLS HAM RST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7154') +('0027245000000','PASTURES FRESH RIB CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-11-02 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7155') +('0027250000000','PASTURES FRESH SIRLOIN CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7156') +('0027251000000','PASTURES FRESH PORK STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-04-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7157') +('0027252000000','PASTURES LOIN CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-05-04 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7158') +('0027255000000','BONELESS CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-01-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7159') +('0027257000000','PASTURES PORK CHOPS SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-08-26 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7160') +('0027260000000','PASTURES FRESH GROUND PORK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7161') +('0027261000000','PASTURES GROUND PORK SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-09-25 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7162') +('0027270000000','PASTURES FRESH BRATWURST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7163') +('0027271000000','PASTURES SMOKED BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-09-10 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7164') +('0027272000000','PASTURES ANDOUILLE SAUSAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-04-24 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7165') +('0027273000000','PASTURES POLISH SAUSAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-02-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7166') +('0027274000000','PASTURES BULK CHORIZO',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-04-17 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7167') +('0027280000000','PASTURES FRESH BABY BACK RIBS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7168') +('0027281000000','PASTURES PORK KABOB MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-06-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7169') +('0027282000000','PASTURES SPARERIBS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7170') +('0027283000000','PASTURES COUNTRY RIBS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-05-12 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7171') +('0027290000000','PASTURES UNCURED PEPPER BACON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-09-15 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7172') +('0027300000000','PASTURES FRESH CHEDDAR BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-07-13 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7173') +('0027310000000','PASTURES FRESH PORK TENDERLOIN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7174') +('0027320000000','PASTURES PORK CUTLETS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-05-29 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7175') +('0027330000000','PASTURES FRESH HAM HOCK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7176') +('0027340000000','PASTURES FRESH UNCURED BACON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7177') +('0027350000000','PASTURES FRESH BREAKFAST LINKS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7178') +('0027351000000','PASTURES HOT DOGS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-05-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7179') +('0027360000000','FREE RANGE TURKEY-KADEJAN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-11-22 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7180') +('0027370000000','FRESH DRUMSTICK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-11-02 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7181') +('0027380000000','KADEJAN CHICKEN PATTIES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-03-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7182') +('0027381000000','KADEJAN TURKEY PATTIES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-05-15 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7183') +('0027390000000','BEEF GROUND ALL NATURAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-10-23 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7184') +('0027400000000','ALL NATURAL BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7185') +('0027410000000','SALMON FILLET',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7186') +('0027411000000','ROGOTSKE KETA SALMON FILLET',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-11-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7187') +('0027412000000','BODIN LK SUPERIOR TROUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-07-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7188') +('0027413000000','ROGOTSKE SMKD SALMON PORTIONS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-02-15 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7189') +('0027414000000','BODIN LK SUPERIOR WHITEFISH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-07-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7190') +('0027415000000','BODIN WHITEFISH LIVERS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-12-31 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7191') +('0027420000000','KADEJAN FRESH S/B BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7192') +('0027430000000','KADEJAN TURKEY BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-11-02 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7193') +('0027431000000','KADEJAN B/I TURKEY BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-07-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7194') +('0027440000000','ROGOTSKE SOCKEYE PORTIONS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'499','2009-05-05 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7195') +('0027450000000','ROGOTSKE SALMON PORTIONS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-12-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7196') +('0027460000000','WHOLE FARM SIRLOIN STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7197') +('0027470000000','FROZEN BEELER HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-05-16 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7198') +('0027471000000','BEELER PORK CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-10-29 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7199') +('0027472000000','BEELER ST LOUIS RIBS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-07-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7200') +('0027473000000','BEELER BACK RIBS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-08-05 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7201') +('0027480000000','PASTURES MILD ITALIAN SAUSAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7202') +('0027481000000','PASTURES HOT ITALIAN SAUSAGE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-01-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7203') +('0027490000000','PASTURES MILD ITALIAN LINKS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7204') +('0027491000000','PASTURES HOT ITALIAN LINKS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-01-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7205') +('0027499000000','PASTURES BULK ITALIAN SPECIAL',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-08-26 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7206') +('0027500000000','APPLE BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7207') +('0027510000000','GR. LAMB WHOLE FARMS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-12-02 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7208') +('0027520000000','BEELER BONELESS HALF HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-12-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7209') +('0027530000000','W.F. FREE RANGE DUCK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-11-17 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7210') +('0027551000000','WHOLE FARM GROUND CHEVON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-06-05 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7211') +('0027560000000','WHOLE FARM LAMB STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-01-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7212') +('0027570000000','WHOLE FARM LAMB CHOPS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-01-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7213') +('0027571000000','WHOLE FARM LAMB STEW MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-08-31 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7214') +('0027580000000','PASTURES COTTAGE BACON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-03-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7215') +('0027590000000','ORG WHOLE CHICKEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7216') +('0027600000000','WHOLE FARM TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-11-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7217') +('0027601000000','KEY LIME BAR',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-04-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7218') +('0027602000000','CREAM CHEESE GANACHE BROWNIE',7.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-15 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7219') +('0027603000000','DARK CHOCOLATE PUDDING',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-17 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7220') +('0027604000000','SPICED PEACH PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-04-18 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7221') +('0027606000000','LEMON LAYER CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-04-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7222') +('0027607000000','GF FUDGE PARFAIT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7223') +('0027608000000','TURTLE BROWNIES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-04-29 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7224') +('0027609000000','STRAWBERRY PEACH PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7225') +('0027610000000','LAMB SHOULDER ROAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-04-07 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7226') +('0027611000000','RASPBERRY ALMOND',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-05-07 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7227') +('0027612000000','GF TROPICAL MANGO CHEESECAKE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-05-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7228') +('0027613000000','CHOCOLATE PECAN BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7229') +('0027615000000','FLOURLESS CHOC CAKE W/ ALMOND',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-05-12 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7230') +('0027616000000','PEACH CRUMBLE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-13 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7231') +('0027617000000','SPRING STRAWBERRY COCONUT CAKE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-14 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7232') +('0027618000000','SHITAKE MEDLEY QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-14 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7233') +('0027619000000','STRAWBERRY WHITE CHOCO MOUSSE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-15 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7234') +('0027620000000','GROUND PORK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2004-11-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7235') +('0027621000000','MILK CHOCO COVERED CHERRY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7236') +('0027622000000','CHERRY LEMON PIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-05-18 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7237') +('0027623000000','BAKED YOGURT TART',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-05-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7238') +('0027624000000','CRAN- APPLE CRISP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-05-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7239') +('0027625000000','COCONUT TAPIOCA PUDDING',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7240') +('0027626000000','COCONUT CREAM CUPCAKES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-05-31 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7241') +('0027627000000','GF STRAWBERRY CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-03 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7242') +('0027628000000','LEMON ALMOND CUPCAKES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7243') +('0027629000000','GRILLED PINEAPPLE CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7244') +('0027630000000','LEG OF LAMB ROAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-11-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7245') +('0027631000000','SAUSAGE JALAPENO QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7246') +('0027632000000','BANANA CREAM PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-10 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7247') +('0027633000000','MACAROONS GF VEGAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-14 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7248') +('0027634000000','CAPPUCINO BROWNIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7249') +('0027635000000','RHUBARB CUSTARD PIE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-17 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7250') +('0027636000000','VANILLA PUDDING',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-19 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7251') +('0027637000000','FRUITY CREAM SHORTCAKES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7252') +('0027638000000','CHOCOLATE MOUSSE (VEGAN)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-20 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7253') +('0027639000000','CHOCOLATE DE CREME PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7254') +('0027640000000','GERBERS SKIN-ON BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-11-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7255') +('0027641000000','RHUBARB OATMEAL BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7256') +('0027642000000','ROASTED VEGGIE QUICHE',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7257') +('0027643000000','FLOURLESS CHOCO ORANGE CAKE(GF',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-06-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7258') +('0027644000000','CHOCOLATE CARMEL SLICE',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7259') +('0027645000000','HUMMING BIRD CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7260') +('0027646000000','SUMMER BERRY FLAN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-06-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7261') +('0027647000000','BLUEBERRY RASPBERRY PIE',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7262') +('0027648000000','RASPBERRY MASCARPONE PUFF',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-03 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7263') +('0027649000000','TRIPLE BERRY CUPCAKES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7264') +('0027650000000','GERBER CHICKEN BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-04-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7265') +('0027651000000','VEGAN LEMON POPPY SEED CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7266') +('0027652000000','RASPBERRY LEMON CREAM CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7267') +('0027653000000','BACON FRESH HERB QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7268') +('0027654000000','PEACH COBBLER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7269') +('0027655000000','STRAWBERRY MASCARPONE PUFFS',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-10 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7270') +('0027656000000','OATMEAL CRANBERRY COOKIES',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-10 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7271') +('0027657000000','STRAWBERRY COCONUT CUPCAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-11 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7272') +('0027658000000','FLOURLESS CHOC CAKE W/RASP ALM',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7273') +('0027659000000','THE BEST CHOCOLATE CHIP COOKIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-07-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7274') +('0027660000000','NORTHSTAR BISON BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7275') +('0027662000000','WALNUT DARK CHOCOLATE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7277') +('0027663000000','BANANA PUDDING PIE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-16 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7278') +('0027664000000','BANANA BREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7279') +('0027665000000','STRAWBERRY MASCARPONE TARTS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7280') +('0027666000000','INSIDE OUT CARROT CAKE COOKIES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-07-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7281') +('0027667000000','STRAWBERRY PEACH CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7282') +('0027668000000','CHOCOLATE RASPBERRY MOUSSE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-07-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7283') +('0027669000000','CHEDDAR CHIVE SCONE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2008-07-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7284') +('0027670000000','GERBER WHOLE FRYER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-04-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7285') +('0027671000000','PLUM PIE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7286') +('0027672000000','PEANUT BUTTER BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7287') +('0027673000000','CHOCO DIPPED PB COOKIES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7288') +('0027674000000','VEGAN RASPBERRY VANILLA CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7289') +('0027675000000','CORN MUFFINS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7290') +('0027676000000','RASPBERRY OATMEAL BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7291') +('0027677000000','VEGAN STRAWBERRY BANANA CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-06 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7292') +('0027678000000','HERBED VEG QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7293') +('0027679000000','POTS DE CREME (GF)',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7294') +('0027680000000','GRATEFUL HARVEST TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-11-13 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7295') +('0027682000000','ARTICHOKE AND TOMATO TART',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7296') +('0027683000000','DOUBLE CHOCOLATE ALMOND CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7297') +('0027684000000','PB CUPS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7298') +('0027685000000','GF MILK CHOC COOKIE TRIFLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','2','1','0',0,'0','2008-08-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'7299') +('0027686000000','VEGAN CHOC SPICE CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','2','1','0',0,'0','2008-08-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'7300') +('0027687000000','VEGAN CHOC CHIP COOKIES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7301') +('0027688000000','BLONDIES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','2','1','1',0,'0','2008-08-27 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'7302') +('0027689000000','HARVEST COOKIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7303') +('0027690000000','NORTHSTAR PATTIES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7304') +('0027691000000','GF CHOCO PB COOKIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7305') +('0027692000000','HAZELNUT FLOURLESS CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-09-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7306') +('0027693000000','NEW! VEGAN BROWNIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-09-08 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7307') +('0027694000000','RUSTIC TOMATO TART',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-09-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7308') +('0027695000000','APPLE SPICE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-09 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7309') +('0027696000000','APRICOT OAT BARS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-09 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7310') +('0027697000000','HOLY LAND BAKLAVA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2008-09-11 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7311') +('0027698000000','VEGAN STRAWBERRY CHOCO CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7312') +('0027699000000','TWO POTATO BISQUE PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-09-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7313') +('0027700000000','WHOLE FARM LAMB BRATS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2006-04-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7314') +('0027701000000','TWO POTATO BISQUE QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-09-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7315') +('0027702000000','BAKED APPLE TART',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-09-14 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7316') +('0027703000000','APPLE CRANBERRY PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-09-23 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7317') +('0027704000000','CINNAMON COFFEE CAKE(VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-23 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7318') +('0027705000000','BANANA OAT BARS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7319') +('0027706000000','THUMBPRINT COOKIES (VEGAN)',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7320') +('0027707000000','BLUEBERRY APPLE CRISP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-24 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7321') +('0027708000000','Ks PUMPKIN PIE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-16 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7322') +('0027709000000','PICO DE GALLO QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-09-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7323') +('0027710000000','CHOCOLATE ORANGE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-01 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7324') +('0027711000000','RASPBERRY ALMOND CAKE(VEGAN)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-03 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7325') +('0027712000000','BRIOCHE CUSTARD TART',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-05 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7326') +('0027713000000','GF CHOCOLATE CHIP COOKIE II',8.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-08 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7327') +('0027714000000','GF BROWNIE TRIFLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7328') +('0027715000000','GF HARVEST BERRY PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-10 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7329') +('0027716000000','PUMPKIN BREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7330') +('0027717000000','RASP. LEMON CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-11 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7331') +('0027718000000','VEGAN HAZELNUT GANACHE CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-13 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7332') +('0027719000000','BLUEBERRY OATMEAL BAR',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-14 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7333') +('0027720000000','SCHULTZ CHICKEN, FRESH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-03-07 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7334') +('0027721000000','BLUEBERRY PEACH CHEESECAKE',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7335') +('0027722000000','BLUEBERRY PIE (VEGAN)',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-19 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7336') +('0027723000000','ORANGE SPICE CUPCAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-22 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7337') +('0027724000000','LEMON CREAM CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-22 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7338') +('0027725000000','FLOURLESS CHOCO RASPBERRY',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7339') +('0027726000000','CHICKEN POT PIES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-24 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7340') +('0027727000000','WHOLE KEY LIME PIE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-27 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7341') +('0027728000000','WHOLE BLEBERRY PIE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-27 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7342') +('0027729000000','CHOCOLATE WALNUT BISCOTTI',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-29 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7343') +('0027730000000','ORG WHOLE CHICKENS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2004-10-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7344') +('0027731000000','CHOCOLATE CINNAMON COFFEECAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-10-30 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7345') +('0027732000000','RUSTIC INN CARAMEL APPLE PECAN',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-10-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7346') +('0027733000000','RUSTIC INN PUMPKIN PIE',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-10-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7347') +('0027734000000','RUSTIC INN BLUEBERRY PIE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7348') +('0027735000000','RUSTIC INN RASPBERRY CREAM PIE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-10-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7349') +('0027736000000','RUSTIC INN FRENCH APPLE PIE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-10-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7350') +('0027737000000','CHOCOLATE PB PIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-10-31 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7351') +('0027738000000','GINGERBREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-11-04 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7352') +('0027739000000','CHOCOLATE HAZELNUT CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-11-01 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7353') +('0027740000000','SCHULTZ ORG TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2004-10-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7354') +('0027741000000','SPICED PUMPKIN CHEESECAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-11-04 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7355') +('0027742000000','CRANBERRY BARS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-11-04 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7356') +('0027743000000','RUSTIC INN STRAWBERRY RHUBARB',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7357') +('0027744000000','RUSTIC INN RASPBERRY',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7358') +('0027745000000','LEMON POPPY SEED BUNDT CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-11-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7359') +('0027746000000','RUSTIC INN CHERRY PIE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7360') +('0027747000000','RUSTIC INN 5-LAYER CHOCOLATE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7361') +('0027748000000','RUSTIC INN LEMON ANGEL PIE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7362') +('0027749000000','RUSTIC INN BLACKBERRY PIE',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-11-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7363') +('0027750000000','schultz bone-in turkey breast',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-11-18 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7364') +('0027751000000','SPICED PUMPKIN CHEESECAKE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-11-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7365') +('0027752000000','MINI MAPLE PEAN CHEESECAKE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','2','1','0',0,'0','2008-11-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'7366') +('0027753000000','CLASSIC PUMPKIN PIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-11-26 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7367') +('0027754000000','APPLE PIE (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-11-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7368') +('0027755000000','ASSORTED COOKIE TRAY',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-12-20 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7369') +('0027756000000','RUSTIC INN PEACH PIE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-12-20 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7370') +('0027757000000','ALMOND GANACHE CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-12-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7371') +('0027758000000','RUSTIC INN SUMMER BERRY',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2008-12-31 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7372') +('0027759000000','RUSTIC INN PECAN PIE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7373') +('0027760000000','JENNY LIND TOSCA ALMOND BARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','1',0,'0','2006-11-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7374') +('0027761000000','VANILLA GINGER CREAM CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7375') +('0027762000000','MIMOSA CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','0',0,'0','2009-01-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7376') +('0027763000000','BLUEBERRY-LEMON BREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2009-01-28 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7377') +('0027764000000','SUGAR PLUM CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7378') +('0027765000000','SWEETHEART BASKET',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-01-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7379') +('0027766000000','DARK CHOCOLATE TRUFFLE CAKE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','0',0,'0','2009-02-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7380') +('0027767000000','DROP BISCUIT(VEGAN)',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2009-02-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7381') +('0027768000000','CHOCOLATE COVERED STRAWBERRIES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-02-12 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7382') +('0027769000000','RASPBERRY CREAM CHEESE BROWNIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-02-17 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7383') +('0027770000000','JENNY LIND CHOCO OAT BARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2006-12-21 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7384') +('0027771000000','GARLIC CHIVE BISCUIT (VEGAN)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','0',0,'0','2009-02-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7385') +('0027772000000','JENNY LIND TOSCA ALMOND BARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2009-02-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7386') +('0027774000000','BUTTERSCOTCH CARAMEL CHZ.CAKE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-02-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7387') +('0027775000000','JENNY LIND BROWNIE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2009-02-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7388') +('0027776000000','MANGO RASPBERRY CHEESECAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-03-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7389') +('0027777000000','JENNY LIND CHOCOLATE OAT BARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2009-02-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7390') +('0027778000000','JENNY LIND CASHEW BARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-03-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7391') +('0027779000000','MANGO VANILLA CHEESECAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-03-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7392') +('0027780000000','SCHULTZ CHICKEN BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-11-02 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7393') +('0027781000000','FUDGE WALNUT TRIFLE (GF)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-03-17 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7394') +('0027782000000','BANANA CREAM PIE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-03-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7395') +('0027783000000','FLOURLESS CUPCAKES (GF)',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2009-03-21 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7396') +('0027784000000','DIRT CUPS',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','1','0',0,'0','2009-03-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'7397') +('0027785000000','DIRT CUPCAKES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2009-03-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7398') +('0027786000000','RUSTIC INN RASPBERRY RHUBARB',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2009-03-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7399') +('0027787000000','WHOOPIE PIE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2009-03-28 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7400') +('0027788000000','RUSTIC INN APPLE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','0',0,'0','2009-04-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7401') +('0027789000000','RUSTIC INN RHUBARB',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2009-04-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7402') +('0027790000000','CHICKEN LEG & THIGH, SCHULTZ',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-12-29 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7403') +('0027791000000','VEGAN CARROT COCONUT CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2009-04-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7404') +('0027792000000','JENNY LIND SESAME TRAIL BARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2009-05-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7405') +('0027801000000','APPLEGATE NATURAL MEATS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','76','0','0','1','1',0,'0','2007-02-01 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7407') +('0027802000000','Deli Meat Organic Grateful Har',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','76','0','0','1','1',0,'0','2008-01-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7408') +('0027825000000','MURPHYS ORG FRESH GRND BEEF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-01-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7412') +('0027880000000','KADEJAN FRESH WHOLE CHICKEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7419') +('0027881000000','KADEJAN AIRLINE CUT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-06-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7420') +('0027882000000','KADEJAN CUT UP WHOLE CHICKEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-06-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7421') +('0027900000000','KADEJAN FRESH SPLIT B/I BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7423') +('0027910000000','KADEJAN FRESH GRND CHICKEN',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7424') +('0027920000000','KADEJAN FRESH DRUMETTES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7425') +('0027930000000','KADEJAN FRESH CHICKEN THIGHS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7426') +('0027940000000','KADEJAN FRESH CHICKEN WINGS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7427') +('0027952000000','WHOLE FARM BEEF SOUP BONES',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-11-14 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7430') +('0027960000000','MURPHYS ORGANIC BEEF LIVER',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-07-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7431') +('0027970000000','KADEJAN FRESH GRND TURKEY',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7432') +('0027980000000','THOUSND HILLS FRESH GRND BEEF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7433') +('0027981000000','KADEJAN FRESH CHICKEN TENDERS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-10-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7434') +('0027983000000','THOUSAND HILLS CHUCK STEAK',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2006-06-16 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7435') +('0027984000000','THOUSAND HILLS KABOB MEAT',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2005-10-26 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7436') +('0027985000000','THOUSAND HILLS FRZN GRND BEEF',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2007-04-09 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'7437') +('0028001000000','TOMATO BISQUE W/FENNEL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-15 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7438') +('0028002000000','SPINACH SALAD BALSAMIC SESAME',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-05-25 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7439') +('0028003000000','DOTTIES POTATO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7440') +('0028004000000','CURRIED CHICKEN SALAD',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7441') +('0028005000000','DILLY POTATO SALAD GG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7442') +('0028006000000','SALAD SHOOTER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7443') +('0028007000000','ORANGE SALMON CAESAR SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-15 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7444') +('0028008000000','CHICKEN CAESAR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-15 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7445') +('0028009000000','TOMATO BISQUE W/FENNEL SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-15 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7446') +('0028010000000','MONGOLIAN TOFU',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2005-04-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7447') +('0028011000000','BLUE PEAR SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-15 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7448') +('0028012000000','TOMATO BISQUE W/FENNEL SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7449') +('0028013000000','UNCHICKEN NOODLE SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-16 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7450') +('0028014000000','UNCHICKEN NOODLE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-16 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7451') +('0028015000000','CHICKEN NOODLE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-16 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7452') +('0028016000000','CHICKEN NOODLE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-05 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7453') +('0028017000000','ENCHILADA PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2005-11-17 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7454') +('0028018000000','ROSEMARY CHICKEN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-17 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7455') +('0028019000000','CURRIED EGGPLANT W/CASHEWS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-18 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7456') +('0028020000000','00268347000000',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7457') +('0028021000000','ROASTED CHICKEN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2005-11-18 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7458') +('0028022000000','DOLMAS AVGOLEMONG LEAVES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2005-11-23 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7459') +('0028023000000','PERFECT PROTEIN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-21 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7460') +('0028024000000','WILD RICE SUCCOTASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-18 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7461') +('0028025000000','SMOTHERED BEANS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-18 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7462') +('0028026000000','GINGERED TEMPEH PASTA SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-18 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7463') +('0028027000000','VEGGIE BURGER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-18 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7464') +('0028028000000','MOROCCAN CARROT SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7465') +('0028029000000','SIZZLING BROC W/TOFU',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-18 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7466') +('0028030000000','COUSCOUS W/FAVA',8.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7467') +('0028032000000','ONION SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7468') +('0028033000000','ONION SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7469') +('0028034000000','GARLIC MASHED POTATOES W/MISO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7470') +('0028035000000','GLAZED CARROTS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7471') +('0028036000000','SPINACH PHYLLO PIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7472') +('0028037000000','BAKED PECAN YAMS',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7473') +('0028038000000','SAVORY YAMS WITH PECANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-21 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7474') +('0028039000000','AUTUMN DELIGHT SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7475') +('0028040000000','ARTICHOKE PARMESAN P',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7476') +('0028041000000','AUTUMN DELIGHT SOUP QUART',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7477') +('0028042000000','ROASTED TOMATO SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-21 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7478') +('0028043000000','PORTABELLO GRAVY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-21 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7479') +('0028044000000','POULTRY GRAVY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-22 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7480') +('0028045000000','SPICY GREEN BEANS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-22 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7481') +('0028046000000','ROASTED TURKEY THIGHS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-22 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7482') +('0028047000000','KUNG PAO CHICKEN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-22 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7483') +('0028048000000','MAPLE GLAZED SQUASH',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2005-11-22 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7484') +('0028049000000','GARLIC MASHED POTATOES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-22 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7485') +('0028050000000','OLD VEGGIE ENCHILADAS',1.74,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7486') +('0028053000000','RAISIN & PINE NUT QUICHE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-22 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7487') +('0028054000000','QUICHE LORRAINE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-22 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7488') +('0028055000000','CHEESE ENCHILADAS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-23 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7489') +('0028057000000','MUSHROOM BARLEY SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-23 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7490') +('0028058000000','MUSHROOM BARLEY SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-23 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7491') +('0028059000000','SMOKEY BLACK BEAN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-23 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7492') +('0028060000000','BEAN & TOM SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7493') +('0028061000000','SMOKEY BLACK BEAN SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-23 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7494') +('0028065000000','BABA GHANNOUJ',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-25 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7495') +('0028066000000','FOG CITY TUNA SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-11-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7496') +('0028067000000','SESAME RICE G&G',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-25 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7497') +('0028068000000','CELERY SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-25 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7498') +('0028069000000','CELERY SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-11-25 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7499') +('0028070000000','BOW THAI PASTA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7500') +('0028072000000','PICO DE GALLO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2005-11-25 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7501') +('0028073000000','ROASTED TOMATILLO SALSA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-28 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7502') +('0028074000000','PASTA W/WALNUTS & GARLIC',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7503') +('0028075000000','SWEET POTATO SOUFLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-11-30 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7504') +('0028076000000','BLUE CHEESE SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-11-30 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7505') +('0028077000000','VEGETABLE QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-11-30 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7506') +('0028080000000','ASIAN CABBAGE CRUNCH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7507') +('0028081000000','SAUTEED MUSHROOM TEMPEH W/RICE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-05 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7508') +('0028082000000','THAI CUCUMBER SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-05 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7509') +('0028083000000','MEDITERRANEAN QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7510') +('0028084000000','RED PEPPER CHED. QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-12-07 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7511') +('0028085000000','ASIAN GREENS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-07 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7512') +('0028086000000','APRICOT GLAZED TURKEY',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-07 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7513') +('0028087000000','RASPBERRY BEETS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-07 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7514') +('0028088000000','SHRIMP & FRESH PEA',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-07 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7515') +('0028089000000','RASPBERRY BASIL CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-07 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7516') +('0028090000000','GARLIC LOVERS PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7517') +('0028091000000','MINESTRONE W/KALE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7518') +('0028092000000','MINESTRONE W/KALE SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7519') +('0028093000000','WHITE BEAN TOMATO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7520') +('0028094000000','WHITE BEAN TOMATO SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7521') +('0028095000000','CREAM OF VEGETABLE SOUP PT.',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7522') +('0028096000000','CREAM OF VEGETABLE SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7523') +('0028097000000','ORZO W/SPINACH & FETA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-09 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7524') +('0028098000000','GRILLED VEGETABLE PASTA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-11-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7525') +('0028099000000','NATIVE WILD RICE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-09 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7526') +('0028100000000','HOT & DIRTY CAJUN',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7527') +('0028101000000','ARTICHOKE TRIANGLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-09 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7528') +('0028102000000','APRICOT ALMOND CHICKEN SALAD',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-12-09 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7529') +('0028103000000','HONEY SOY FLANK STEAK RIBBONS',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-09 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7530') +('0028104000000','SMOKED MOZZARELLA PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-01-03 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7531') +('0028105000000','YAM MILLET CAKES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7532') +('0028106000000','THAI WILD RICE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-12-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7533') +('0028107000000','TURKEY MEATLOAF',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-12-09 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7534') +('0028108000000','ASPARAGUS GOAT QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2005-12-14 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7535') +('0028109000000','SPLIT PEA W/ HAM',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-14 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7536') +('0028111000000','SPINACH & ARTICHOKE DIP',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-12-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7537') +('0028112000000','SPLIT PEA WITH HAM SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-14 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7538') +('0028113000000','HEARTY VEGGIE SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7539') +('0028114000000','HEARTY VEGGIE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7540') +('0028115000000','Lemon Braised Greens',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-16 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7541') +('0028116000000','MEATLOAF, RICE & CUR. CAULF.',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2005-12-16 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7542') +('0028117000000','TAMALES W/TOMATILLO MEAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-16 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7543') +('0028118000000','ROSEMARY CHICKEN W/RICE & CAUL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-16 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7544') +('0028119000000','HOT PICO DE GALLO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-20 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7545') +('0028120000000','JAMAICAN JERK TEMPEH',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7546') +('0028121000000','CURRIED LENTIL SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7547') +('0028122000000','CURRIED LENTIL SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7548') +('0028123000000','CREAM OF MUSHROOM SOUP PT.',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7549') +('0028124000000','CREAM OF MUSHROOM SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7550') +('0028125000000','HEARTY CHICKEN VEGGIE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7551') +('0028126000000','HEARTY CHICKEN VEGGIE SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7552') +('0028127000000','CLAM CHOWDER SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-21 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7553') +('0028128000000','CLAM CHOWDER SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-21 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7554') +('0028129000000','TURKEY MEATLOAF MEAL TO GO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7555') +('0028130000000','EDAMAME RICE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7556') +('0028131000000','ROSEMARY CHICKEN MEAL TO GO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7557') +('0028132000000','VEGETABLE BARLEY SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-23 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7558') +('0028133000000','VEGETABLE BARLEY SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-23 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7559') +('0028134000000','BLACK BEAN CHILI PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7560') +('0028135000000','BLACK BEAN CHILI QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7561') +('0028136000000','BAKED BEANS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7562') +('0028137000000','1-2-3-POTATO',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7563') +('0028138000000','1-2-3-POTATO',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7564') +('0028139000000','CREAMY CHICKEN WILD RICE PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7565') +('0028140000000','SPICY CHINESE NOODLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7566') +('0028141000000','CREAMY CHICKEN WILD RICE QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7567') +('0028143000000','BBQ CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7568') +('0028144000000','TARRAGON CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7569') +('0028145000000','POACHED SALMON W/CAPERS',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7570') +('0028146000000','ROSEMARY CHICKEN MEAL TO GO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-12-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7571') +('0028147000000','VEGAN CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-31 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7572') +('0028148000000','TURKEY CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2005-12-31 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7573') +('0028149000000','FIESTA LIME CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-12-31 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7574') +('0028150000000','PAD THAI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7575') +('0028151000000','VEGETABLE LASAGNA-OLD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7576') +('0028152000000','MAHATTAN CLAM CHOWDER',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7577') +('0028153000000','CARNITAS ENCHILADAS W/CHILI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7578') +('0028154000000','HAM MUSHROOM SWISS QUICHE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-01-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7579') +('0028155000000','KUNG PAO SEITAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7580') +('0028156000000','INDIAN LENTILS, & SWEET POTATO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7581') +('0028157000000','MAPLE GLAZED SALMON',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7582') +('0028158000000','SWEET & SOUR TOFU VEGAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7583') +('0028159000000','MASHED POTATOES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-01-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7584') +('0028160000000','VEGETABLE PAELLA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7585') +('0028161000000','GARDEN PATCH GOULASH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7586') +('0028162000000','TOFU',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7587') +('0028163000000','SOUTHWESTERN TURKEY SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7588') +('0028164000000','NAVY BEAN W/HAM PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7589') +('0028165000000','VEGAN NAVY BEAN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7590') +('0028166000000','SUNNY SWEET POTATO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-02 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7591') +('0028167000000','SWEET POTATO WALDORF SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7592') +('0028168000000','MACARONI & CHEESE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-01-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7593') +('0028169000000','QUINOA VEGETABLE RISOTTO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2006-01-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7594') +('0028170000000','fgarbanzo test',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7595') +('0028171000000','HERBED RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7596') +('0028172000000','ARTICHOKE SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-01-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7597') +('0028173000000','CARROT GINGER SLAW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7598') +('0028174000000','VEGAN ROASTED VEGGIE LASAGNA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7599') +('0028175000000','PESTO PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-01-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7600') +('0028176000000','VEGAN BLACK BEAN & CORN ENCHIL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7601') +('0028177000000','TAMALE PIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7602') +('0028179000000','BOHEMIAN TEMPEH GHOULASH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2006-01-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7603') +('0028180000000','KUNG PAO TOFU',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7604') +('0028181000000','HARVEST MOOD SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7605') +('0028182000000','TEMPEH STROGANOFF',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7606') +('0028183000000','CREAMY GARLIC SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7607') +('0028184000000','LENTIL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7608') +('0028185000000','MEXICAN SKILLET SCRAMBLE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7609') +('0028186000000','DELI VEGAN COLESLAW',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7610') +('0028187000000','CHICKEN POT PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-13 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7611') +('0028188000000','COPPER PENNY SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7612') +('0028189000000','LEEK & POTATO PUREE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7613') +('0028190000000','GARLIC KALE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7614') +('0028191000000','CHICKEN PASTA MEAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7615') +('0028192000000','Salmon, S. Potato, &Rice Meal',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7616') +('0028193000000','Turkey Barley Soup',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7617') +('0028194000000','GREEK ORZO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-01-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7618') +('0028195000000','MANDARIN ORANGE & JICAMA SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-01-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7619') +('0028196000000','JERK TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7620') +('0028197000000','THAI BROCCOLI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-01-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7621') +('0028198000000','PAD THAI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-01-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7622') +('0028199000000','LEMON APRICOT QUINOA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7623') +('0028200000000','ZORBAS GREEK PASTA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7624') +('0028201000000','MEATLOAF, POTATO PUREE MEAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-16 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7625') +('0028202000000','CHICKEN',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7626') +('0028203000000','HEARTY VEGETABLE BEEF SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7627') +('0028204000000','TURKEY MEATLOAF MEAL TO GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7628') +('0028205000000','VEGAN SWEET POTATO SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-22 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7629') +('0028206000000','SALMON W/RICE PILAF',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-22 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7630') +('0028207000000','VEGAN VEGETABLE CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7631') +('0028208000000','MANDARIN ORANGE &SPINACH SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7632') +('0028209000000','CHEESY WILD RICE SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-25 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7633') +('0028210000000','THE WILD GARDEN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7634') +('0028211000000','CHEESY WILD RICE SOUP',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-25 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7635') +('0028212000000','CHICKEN',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7636') +('0028213000000','HEARTY VEGETABLE BEEF SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7637') +('0028214000000','VEGAN SWEET POTATO SOUP',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7638') +('0028215000000','LEMON DILL RICE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-01-25 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7639') +('0028216000000','BLACK BEAN & CORN ENCHI. MEAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-25 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7640') +('0028217000000','TARRAGON CHICKEN MEAL TO-GO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-25 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7641') +('0028218000000','POTATO LEEK SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-26 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7642') +('0028219000000','TORTILLA SOUP - 16 OZ',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7643') +('0028220000000','EARLY BIRD COOKIE',3.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7644') +('0028221000000','GREEK LENTIL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7645') +('0028222000000','RED LENTIL SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7646') +('0028223000000','CURRIED CHICEN VEG. SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7647') +('0028224000000','POTATO LEEK SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-26 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7648') +('0028225000000','TOMATO LEEK SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-27 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7649') +('0028226000000','TOMATO LEEK SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-27 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7650') +('0028227000000','VEGGIE LO MEIN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7651') +('0028229000000','STEAK FAJITAS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7652') +('0028230000000','FRUIT & NUT COOKIE',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7653') +('0028231000000','VEGGIE FAJITA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7654') +('0028232000000','SUN-DRIED TOMATO QUESADILLA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-01-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7655') +('0028233000000','ROASTED CHICKEN BREAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','0','0','0',0,'0','2006-01-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7656') +('0028235000000','VEGAN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7657') +('0028236000000','VEGAN SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7658') +('0028237000000','POTATO CHEDDAR SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7659') +('0028238000000','POTATO CHEDDAR SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-01-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7660') +('0028239000000','APPLE MINT BEETS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-01-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7661') +('0028240000000','BROCCOLI CASHEW SAL',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7662') +('0028241000000','SUSHI TRAY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7663') +('0028242000000','TURKEY MEATLOAF MEAL TO GO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7664') +('0028243000000','LAYERED BEAN DIP',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7665') +('0028245000000','BRAT CHILI PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-04 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7666') +('0028246000000','BRAT CHILI QUART',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-04 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7667') +('0028247000000','BBQ RIBS w/ mushed potatoes',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-04 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7668') +('0028248000000','MISO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-04 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7669') +('0028249000000','BLACK BEAN',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-04 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7670') +('0028250000000','GING TEMP PASTA SAL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7671') +('0028251000000','BLACK BEAN',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-04 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7672') +('0028252000000','BBQ CHICKEN WHOLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7673') +('0028253000000','CHEESE ENCHILADAS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2006-02-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7674') +('0028254000000','ASPARAGUS QUICHE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7675') +('0028255000000','GRILLED CHICKEN AND GARLIC ZUC',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7676') +('0028256000000','VEGAN SPLIT PEA SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7677') +('0028257000000','VEGAN SPLIT PEA SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7678') +('0028258000000','MUSHROOM STROGANOFF',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7679') +('0028261000000','ORGANIC CHICKEN BREAST',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7680') +('0028262000000','TAMALE PIE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7681') +('0028263000000','MISO GLAZED TOFU',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7682') +('0028264000000','MIXED GREENS W/RANCH DRESSING',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7683') +('0028265000000','MIXED GREENS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7684') +('0028266000000','CRANBERRY TUNA SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-02-18 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7685') +('0028268000000','CHICKEN SPAETZLE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7686') +('0028269000000','CHICKEN SPAETZLE SOUP',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7687') +('0028270000000','GARDEN PATCH GOULASH',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7688') +('0028271000000','HAM',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7689') +('0028272000000','HAM',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7690') +('0028273000000','TURKEY MEATLOAF MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7691') +('0028274000000','ROASTED CARROTS WITH GINGER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-02-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7692') +('0028275000000','DELI TUNA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-02-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7693') +('0028276000000','LEEK ROASTED CARROTS W/TEMPEH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-02-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7694') +('0028277000000','VEGAN SLOPPY JOES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7695') +('0028278000000','ASPARAGUS SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-02-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7696') +('0028279000000','VIETNAMESE NOODLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-02-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7697') +('0028280000000','BAKED PECAN YAMS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7698') +('0028281000000','MEATLOAF, NATIVE RICE MEAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7699') +('0028283000000','SALMON MEAL TO GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-02-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7700') +('0028284000000','VEGETABLE CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7701') +('0028285000000','VEGETABLE CHILI QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7702') +('0028286000000','TURKEY VEGETABLE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7703') +('0028287000000','TURKEY VEGETABLE SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7704') +('0028288000000','TURKEY MEATLOAF MEAL TO-GO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-02 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7705') +('0028289000000','SPANIKOPITA',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-03-03 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7706') +('0028290000000','HONEY MUST SWT POTS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7707') +('0028291000000','CHICKEN SWEET POTATO SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-05 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7708') +('0028292000000','BBQ CHICKEN WINGS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7709') +('0028293000000','TEMPEH & MUSHROOM FRICASSEE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7710') +('0028294000000','TERIYAKI CHICKEN WINGS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7711') +('0028295000000','VEGETABLE FRIED RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-10 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7712') +('0028296000000','HARVEST RICE SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-03-10 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7713') +('0028297000000','SPRING VEGETABLE SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7714') +('0028298000000','ASPARAGUS W/LEMON VINAIGRETTE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7715') +('0028299000000','SOUTHWEST COLESLAW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7716') +('0028300000000','CRANBERRY CHUTNEY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7717') +('0028301000000','SWEET & SOUR PINEAPPLES BEETS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7718') +('0028302000000','MIXED GREENS W/BLUE CHEESE DRE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-10 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7719') +('0028303000000','ITALIAN PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7720') +('0028304000000','FOG CITY MACARONI SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-03-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7721') +('0028305000000','OLIVE PESTO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2006-03-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7722') +('0028306000000','MEXICAN CHICKEN MEAL-TO-GO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7723') +('0028307000000','SALMON W/ GARLIC MASHED MEAL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7724') +('0028308000000','VEGAN PASTA MEAL-TO -G0',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7725') +('0028309000000','WHITE TURKEY CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7726') +('0028310000000','BUTTERNUT SQUASH CAK',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7727') +('0028311000000','GREEK PEASANT SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7728') +('0028312000000','LENTIL SPINACH & FETA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-03-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7729') +('0028313000000','GREEK SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7730') +('0028314000000','CREAMY TOMATO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7731') +('0028315000000','IRISH BLACK STEW',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7732') +('0028316000000','CREAMY TOMATO SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7733') +('0028317000000','LEMON DILL POACHED SALMON',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-03-20 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7734') +('0028318000000','ASIAN SALMON W/ SESAME RICE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-20 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7735') +('0028319000000','SALMON MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-21 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7736') +('0028320000000','LEEK ROASTED CARROTS',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7737') +('0028321000000','TURKEY MEATLOAF MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-21 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7738') +('0028322000000','CHICKEN TORTILLA SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7739') +('0028323000000','VEGETABLE WILD RICE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7740') +('0028324000000','TUSCAN TUNA SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-04-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7741') +('0028325000000','CREAMY BLACK BEAN DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-24 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7742') +('0028326000000','CURRIED TOFU SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-03-24 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7743') +('0028327000000','CHICKEN PORTABELLO LINGUINI',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7744') +('0028328000000','VEGGIE LINGUINI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7745') +('0028329000000','TURKEY MEATLOAF/MASH MEAL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-24 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7746') +('0028330000000','BUMBLE BABIES',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7747') +('0028331000000','VIETNAMESE HOT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7748') +('0028332000000','HUNGARIAN MUSHROOM SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-28 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7749') +('0028333000000','RANCH TORTELLINI &BROC. SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-28 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7750') +('0028334000000','CHICKEN CHOWDER W/DILL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7751') +('0028335000000','CHICKEN CHOWDER W/DILL SOUP',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7752') +('0028336000000','SALMON, ZUCCHINI, & RICE MEAL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-28 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7753') +('0028337000000','CREAMY TOMATO PARMESAN PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7754') +('0028338000000','CREAMY TOMATO PARMESAN SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-03-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7755') +('0028339000000','SMOKED TURKEY SALAD W/PARMESAN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-03-29 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7756') +('0028340000000','EMERALD KALE SALAD',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7757') +('0028341000000','CHICKEN STIR-FRY MEAL-TO-GO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-03-30 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7758') +('0028342000000','PASTA W/ PORTOBELLOS ZUCCHINI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-03-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7759') +('0028343000000','ORANGE WALNUT TORTELLINI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-03-30 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7760') +('0028344000000','INDONESIAN RICE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-03-30 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7761') +('0028345000000','ALMOND CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-04-03 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7762') +('0028346000000','ARTICHOKE PARMESAN PASTA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-04-03 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7763') +('0028347000000','SPINACH AND CHICKPEA SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-04-03 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7764') +('0028348000000','CURRIED CHICKEN W RICE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-03 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7765') +('0028349000000','CORN CHOWDER PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-03 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7766') +('0028351000000','CHICKEN TOMATILLA SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-05 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7767') +('0028352000000','VEGAN MINESTRONE SOUP',2.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7768') +('0028353000000','FRESH HERB MARINARA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-08 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7769') +('0028354000000','RED BEAN GUMBO W/GREENS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7770') +('0028355000000','VEGAN VEG. PASTA MEAL-TO-GO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7771') +('0028356000000','EGG MUSUBI',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-04-07 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7772') +('0028357000000','RASPBERRY BASIL CHICKEN SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-11 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7773') +('0028358000000','SOUTHWEST CHICKEN SALAD',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7774') +('0028359000000','BBQ CHICKEN WINGS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-04-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7775') +('0028360000000','ASPARAGUS SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7776') +('0028361000000','JERK CHICKEN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-04-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7777') +('0028362000000','MEATLOAF & PILAF MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7778') +('0028363000000','ISRAELI SALAD',7.99,'0',0.00,'0',7.24,'0',7.24,'0','1900-01-01 12:00:00','2009-09-30 12:00:00','63','0','0','1','1',0,'0','2006-10-15 11:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7779') +('0028364000000','CHICKEN CAESAR PASTA SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-04-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7780') +('0028365000000','BUTTERNUT APPLE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7781') +('0028366000000','RST R PEPPER SUN-DRI TOM DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-04-18 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7782') +('0028367000000','TVP CHILI PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-19 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7783') +('0028368000000','TEMPEH \\\"CHICKEN\\\"SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-04-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7784') +('0028370000000','HUNAN TOFU BROCCOLI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','1','1',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7785') +('0028371000000','GERBER NATURAL ROASTED CHICKEN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2006-06-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7786') +('0028372000000','SPRING VEGETABLE BANOK-NOK',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-20 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7787') +('0028373000000','CHICKEN STIR FRY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-01-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7788') +('0028374000000','BBQ CHICKEN BREAST MEAL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-24 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7789') +('0028375000000','CORN CHOWDER QT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-25 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7790') +('0028376000000','ARKANSLAW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-04-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7791') +('0028377000000','SEITAN GYROS WRAP',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7792') +('0028378000000','HUNAN VEGGIE LO MEIN',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-26 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7793') +('0028379000000','HUMMUS VEGGIE ROLL-UP',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7794') +('0028381000000','BUTTERNUT GINGER SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7795') +('0028382000000','MEATLOAF & COUS COUS MEAL TOGO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7796') +('0028383000000','SEITAN STIR FRY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-04-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7797') +('0028384000000','BRAZILIAN BLACK BEAN SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-04-30 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7798') +('0028385000000','SEITAN PROVENCAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2006-05-01 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7799') +('0028386000000','MISO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-05-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7800') +('0028387000000','SALMON MEAL TO GO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7801') +('0028388000000','EGGPLANT MISO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-05-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7802') +('0028390000000','HON MUST POTAT SALAD',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7803') +('0028391000000','HUNAN STYLE SEITAN W/RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7804') +('0028392000000','SUMMER LENTIL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-05-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7805') +('0028393000000','GRILLED CHICKEN WITH COUS COUS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7806') +('0028394000000','MEATLESS PICNIC MEAL-TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7807') +('0028395000000','ASIAN SALMON W/ RICE AND SAUTE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7808') +('0028396000000','TEMPEH JAMBALAYA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7809') +('0028397000000','GREEK SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-07 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7810') +('0028398000000','ASPARAGUS ANTIPASTA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7811') +('0028399000000','HUNAN TOFU WITH BROCCOLI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7812') +('0028401000000','BLACKENED CHICKEN SALAD',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7813') +('0028402000000','BROCCOLI WITH ORANGE BLACK BEA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7814') +('0028403000000','GINGER SNOW PEA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7815') +('0028404000000','SMOKED TURKEY PASTA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7816') +('0028405000000','GARLIC TWICE BAKED POTATOES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7817') +('0028406000000','HONEY MUSTARD POTATO SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-04 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7818') +('0028407000000','SPICY THAI RICE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7819') +('0028408000000','ARTICHOKE PENNE SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7820') +('0028409000000','CAESAR POTATO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7821') +('0028410000000','EGGLESS TOFU SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7822') +('0028411000000','CASHEW BARLEY SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7823') +('0028412000000','FRESH MOZZARELLA AND TOMATO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7824') +('0028413000000','BROCCOLI SESAME SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7825') +('0028414000000','BLUEBERRY ISRAELI COUSCOUS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7826') +('0028415000000','AZTEC SUNFLOWER SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7827') +('0028416000000','ASIAN SESAME NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7828') +('0028417000000','NEW TURKEY MEATLOAF',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7829') +('0028418000000','CHEESE TORTELLINI WITH PESTO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7830') +('0028419000000','LEMON ROSEMARY CHICKEN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7831') +('0028421000000','MARINATED VEGETABLES WITH TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-03-02 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7832') +('0028422000000','SEAFOOD PASTA SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7833') +('0028423000000','MANGO AND BLACK BEAN SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-08 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7834') +('0028424000000','MUSHROOM PIEROGIES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7835') +('0028425000000','SPLIT PEA W/SAUSAGE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-05-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7836') +('0028426000000','TURKEY MEATLOAF MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2006-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7837') +('0028427000000','ASIAN SALMON W/ SESAME RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-15 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7838') +('0028428000000','FIRE ROASTED TOMATO SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7839') +('0028429000000','MINESTRONE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-05-16 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7840') +('0028430000000','ZUCCHINI BAR',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7841') +('0028431000000','TRADITIONAL SPINACH DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2006-05-16 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7842') +('0028432000000','DILL DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2006-05-16 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7843') +('0028433000000','BBQ CHICKEN MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-17 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7844') +('0028434000000','BLACK BEAN & MANGO SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-18 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7845') +('0028435000000','summer',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7846') +('0028436000000','RASPBERRY CHUTNEY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-19 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7847') +('0028437000000','STRAWBERRY SPINACH SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-22 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7848') +('0028438000000','CHICKEN WILD RICE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-05-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7849') +('0028439000000','SPIN/WALNUT FETA QUICHE',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2006-05-24 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7850') +('0028440000000','GARLIC CHIV CHS BALL',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7851') +('0028441000000','SALMON MEAL TO-GO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7852') +('0028442000000','BUFFALO WINGS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-05-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7853') +('0028443000000','BUFFALO WINGS W/RANCH DRESSING',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7854') +('0028444000000','VEGGIE STIR-FRY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7855') +('0028445000000','TUNA MAC SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-05-31 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7856') +('0028446000000','VEGAN PIZZA MUSH/SPINACH & TOM',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-05-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7857') +('0028447000000','FRUIT TRAY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-05-31 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7858') +('0028448000000','ASIAN EDAMAME & CORN SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-06-01 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7859') +('0028449000000','SOUR CREAM DILL DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-06-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7860') +('0028450000000','CHOCOLATE SHEBA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2004-11-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7861') +('0028451000000','GREEK MINI-QUICHE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-06-03 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7862') +('0028452000000','ROSEMARY LEMON ROASTED CHICKEN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','0','0','0',0,'0','2006-06-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7863') +('0028453000000','LENTIL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-06-06 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7864') +('0028454000000','CHICKEN ENCHILADA PIE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-06-06 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7865') +('0028455000000','BBQ CHICKEN WINGS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-06-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7866') +('0028456000000','PEPPERONI MUSHROOM PIZZA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7867') +('0028457000000','TOMATO JALEPENO ,CHEDDAR PIZZA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7868') +('0028458000000','SAMOSAS WITH SPICY DIPPING SAU',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-06-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7869') +('0028459000000','RED LENTIL CURRY SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-06-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7870') +('0028460000000','NEW ITEM',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2004-11-02 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7871') +('0028461000000','NORI MAKI SUSHI TRAY',54.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7872') +('0028463000000','CARIBBEAN POLENTA W/GOAT CHEES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-06-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7873') +('0028464000000','CHICKEN GARCIA',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-06-12 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7874') +('0028465000000','ROASTED RED PEPPER HUMMUS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-06-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7875') +('0028466000000','GUACAMOLE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7876') +('0028467000000','POT STICKERS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-06-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7877') +('0028468000000','VEGETABLE NOODLE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-06-21 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7878') +('0028469000000','GRILLED VEGGIE PIZZA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7879') +('0028470000000','CURRY CAULIF W/CARROT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','1','1','1',0,'0','2005-02-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7880') +('0028471000000','GRILLED VEGGIE & PEPPERONI PIZ',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7881') +('0028472000000','GRILLED VEGGIE & ITALIAN SAUSA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7882') +('0028473000000','CONFETTI VEGGIE PIZZA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','0','0','0',0,'0','2006-06-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7883') +('0028474000000','PEPPERONI & CONFETTI VEGGIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7884') +('0028475000000','ITALIAN SAUSAGE & CONFETTI VEG',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7885') +('0028476000000','CHEESE PIZZA W/SOUR DOUGH CRU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','0','0','0',0,'0','2006-06-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7886') +('0028477000000','PIZZA PEPPERONI W/SOUR DOUGH',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-06-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7887') +('0028478000000','POLENTA TRIANGLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-06-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7888') +('0028479000000','GAZPACHO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2006-06-30 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7889') +('0028480000000','ROASTED POTATOES NICOISE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2005-02-10 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7890') +('0028481000000','SPLIT PEA W/PESTO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-03 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7891') +('0028482000000','FOG CITY CLASSIC COLESLAW',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-07-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7892') +('0028483000000','GRILLED VEGGIE & ITALIAN SAUSA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','2006-07-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7893') +('0028484000000','GRILLED VEGGIE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','0','1','0',0,'0','2006-07-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7894') +('0028485000000','ITALIAN SALSA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-07-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7895') +('0028486000000','GARLICY SPINACH DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-07-15 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7896') +('0028487000000','BEEF BARLEY SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7897') +('0028488000000','CHESSE ENCHILADAS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-07-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7898') +('0028489000000','MINI-QUICHE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-07-22 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7899') +('0028490000000','CHARMOULA TOFU',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','2005-03-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7900') +('0028491000000','THE KOIZUMI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-07-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7901') +('0028492000000','COOP SHARE SUMI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','1','0',0,'0','2006-07-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7902') +('0028493000000','ROASTED RED PEPPER BISQUE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7903') +('0028494000000','ROASTED RED PEPPER BISQUE SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7904') +('0028495000000','ROASTED GARLIC',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7905') +('0028496000000','ROASTED GARLIC',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7906') +('0028497000000','FOG CITY MACARONI SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-07-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7907') +('0028498000000','COPPER PENNY SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','1','0',0,'0','2006-07-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7908') +('0028499000000','STUFFED SHELLS FLORENTINE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2006-07-31 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7909') +('0028500000000','MORNING GLORY MUFFINS',2.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','2005-03-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7910') +('0028501000000','CUCUMBER GAZPACHO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-08-03 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7911') +('0028502000000','CURRIED CHICKEN KAMUT SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-08-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7912') +('0028503000000','SMOKED LAKE TROUT SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-08-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7913') +('0028504000000','MEXICAN BLACK BEAN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-08-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7914') +('0028505000000','\"HOLY HOT SALSA BATMAN!\',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-08-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7915') +('0028506000000','VEGAN \\\"CHEESY\\\" PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-08-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7916') +('0028507000000','MINI-QUICHE LORRAINE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-08-24 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7917') +('0028508000000','SPICED CHICK-PEA STEW',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','0','0',0,'-1','2006-08-30 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7918') +('0028509000000','CURRIED CARROT CASHEW SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7919') +('0028510000000','PASTA PRIMAVERA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2005-03-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7920') +('0028511000000','SPLIT PEA W/PARMESAN',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-08-31 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7921') +('0028512000000','CHINESE CHICKEN SOUP-PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-08-31 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7922') +('0028513000000','ISRAELI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-08-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7923') +('0028514000000','GREEN BEANS POMODORO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-08-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7924') +('0028515000000','BAKED APPLES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2006-09-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7925') +('0028516000000','AVALONS MINESTRONE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-01 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7926') +('0028517000000','CREAMY POTATO WILD RICE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7927') +('0028518000000','WALDORF SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2006-09-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7928') +('0028519000000','WHITE CHICKEN CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7929') +('0028520000000','Southern Fried Tofu',3.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','2005-04-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7930') +('0028521000000','SPICED PUMPKIN CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7931') +('0028522000000','POTATO PEROGIES',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-09-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7932') +('0028523000000','EAST AFRICAN SWEET PEA SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7933') +('0028524000000','ROASTED APPLE COMPOTE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7934') +('0028525000000','GINGER APPLESAUCE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7935') +('0028526000000','TARRAGON CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7936') +('0028527000000','CINNAMON & SPICE BEANS & RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7937') +('0028528000000','PORTOBELLO BURGERS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','2006-09-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7938') +('0028529000000','PORTABELLA ASIAGO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7939') +('0028530000000','Sauteed Greens with Cannellini',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','2005-04-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7940') +('0028531000000','LEMON PEPPER LINGUINE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-09-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7941') +('0028532000000','WHEATBERRY WALDORF',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-09-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7942') +('0028533000000','POTATO PANCAKES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7943') +('0028534000000','SOUTHERN DELIGHT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-09-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7944') +('0028535000000','CHEESY BROCCOLI SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7945') +('0028536000000','SPICY ASIAN BLACK BEAN SOUP',3.79,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-19 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7946') +('0028537000000','CHICKEN AND VEGGIE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-18 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7947') +('0028538000000','MINI-QUICHE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-09-19 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7948') +('0028539000000','SWEET POTATO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-20 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7949') +('0028540000000','GREAT AMER BEAN SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','2005-05-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7950') +('0028541000000','SPICY BLACK BEAN CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','0','0',0,'-1','2006-09-25 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7951') +('0028542000000','FOG CITY DRY RUBBED RIBS',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-09-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7952') +('0028544000000','SPICY TOMATO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-22 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7953') +('0028545000000','CHICKEN',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7954') +('0028546000000','BURNED DOWN THE KITCHEN',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-09-25 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7955') +('0028547000000','CURRIED CARROT AND GINGER SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7956') +('0028548000000','BROCCOLI AND CHEDDAR SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-09-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7957') +('0028549000000','Tuna Salad',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-09-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7958') +('0028550000000','Tofu Oat Burger',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','2005-06-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7959') +('0028551000000','Drews Chicken Caesar Salad',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-09-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7960') +('0028552000000','SWEET POTATO CORN CHOWDER',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','1',0,'-1','2006-10-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7961') +('0028553000000','SWEET POTATO CORN CHOWDER QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','1',0,'-1','2006-10-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7962') +('0028554000000','SWEET POTATO ENCHILADA',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2006-10-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7963') +('0028555000000','JAVANESE TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7964') +('0028556000000','KUNG PAO TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7965') +('0028557000000','ROASTED ROOT VEGETABLES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7966') +('0028558000000','EGGPLANT PARMESAN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7967') +('0028559000000','DILLED SUMMER SQUASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7968') +('0028560000000','BUCKYS BAKED BEANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2005-06-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7969') +('0028561000000','MARINATED MUSHROOMS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-04 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7970') +('0028562000000','WILD RICE AND POTATO SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-10-07 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7971') +('0028563000000','THAI PUMPKIN SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-10-08 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7972') +('0028564000000','Boursin Cheese Spread',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-10-10 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7973') +('0028566000000','OLIVE TAPANADE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-10-11 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7974') +('0028567000000','EAST INDIAN SQUASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7975') +('0028568000000','MAPLE GLAZED SQUASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-13 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7976') +('0028569000000','BLACK EYED PEAS W/ SQUASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-13 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7977') +('0028570000000','SUMMER VEGETABLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','0','0',0,'0','2005-07-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7978') +('0028571000000','HERBED SUMMER SUCCOTASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-13 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7979') +('0028572000000','BUTTERNUT SQUASH CAKES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-13 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7980') +('0028573000000','APPLE MAPLE GLAZED SQUASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-10-16 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7981') +('0028574000000','GYPSY STEW PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-10-17 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7982') +('0028575000000','BURNED DOWN THE KITCHEN CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7983') +('0028576000000','RED CURRY WINTER SQUASH SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-10-30 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7984') +('0028577000000','Three Bean Vegetarian Chili',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-11-01 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7985') +('0028578000000','ROASTED SALMON HONEY SOY GLAZE',17.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','2006-11-14 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7986') +('0028579000000','BUTTERNUT SQUASH & BEET HASH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-02 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7987') +('0028580000000','TOMATO BASIL PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','0','0',0,'0','2005-07-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7988') +('0028581000000','HERRING PICKLED SWEET 16',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','1',0,'0','2006-11-02 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7989') +('0028582000000','Oriental Mushroom Soup',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-11-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7990') +('0028584000000','DELI CHICKEN SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-11-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7991') +('0028585000000','Curry Tuna Salad',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','1',0,'0','2006-11-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7992') +('0028586000000','VEGAN CARROT SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-11-13 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7993') +('0028587000000','SUNDRIED TOMATO PESTO',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2006-11-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7994') +('0028588000000','CRANBERRY BEET RELISH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-24 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7995') +('0028589000000','MUSHROOM GRAVY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2006-11-16 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7996') +('0028590000000','GARLIC CHIVE TWICE BAKE POTATO',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','0','0',0,'0','2005-08-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7997') +('0028591000000','ROASTED GARLIC AND YAM SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-11-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7998') +('0028592000000','RAISIN CRANBERRY CHUTNEY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2006-11-17 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'7999') +('0028593000000','LEEKY THYME CHICKEN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-11-20 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8000') +('0028594000000','CRANBERRY WILD RICE PILAF',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-11-20 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8001') +('0028596000000','TRADITIONAL TURKEY DINNER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-11-22 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8002') +('0028597000000','CELEBRATION STUFFED ROAST',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2006-11-22 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8003') +('0028598000000','GREEN BEAN CASSEROLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-11-22 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8004') +('0028599000000','ROASTED ROOTS SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-11-27 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8005') +('0028600000000','VEGGIE SOUP WITH BASIL SAUCE',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-11-28 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8006') +('0028610000000','SPICY COLLARD GREENS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2005-09-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8007') +('0028611000000','CHIPOTLE RICE AND BRAT SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-11-28 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8008') +('0028612000000','SPICY PEANUT SAUCE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-11-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8009') +('0028613000000','MINI VEGGIE TRAY WITH RANCH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-11-30 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8010') +('0028614000000','PIMENTO CHEESE BALL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2006-11-30 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8011') +('0028615000000','SPINACH DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2006-11-30 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8012') +('0028616000000','BASIL ARTICHOKE DIP',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-12-01 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8013') +('0028617000000','CHICKEN & MASHED POTATO DINNER',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-12-02 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8014') +('0028618000000','SWEET & SPICY AUTUMN BLACK BEA',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-12-05 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8015') +('0028619000000','BLACK EYED PEA & TOMATO SOUP',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-12-05 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8016') +('0028620000000','WHITE BEAN DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-12-06 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8017') +('0028621000000','TURKEY MEATLOAF MEAL TO-GO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2006-12-07 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8018') +('0028622000000','CREAM OF BROCCOLI SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-12-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8019') +('0028623000000','HAZELNUT HERB CUTLETS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2006-12-13 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8020') +('0028624000000','RUSTIC POTATO WITH HAM',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-12-18 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8021') +('0028625000000','HONEY GLAZED BEELERS HAM',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2006-12-20 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8022') +('0028626000000','BASIL TOMATO SLAW',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2006-12-27 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8023') +('0028627000000','HAM, POTATO AND DILL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-12-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8024') +('0028628000000','GREEK TRAY',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2006-12-29 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8025') +('0028629000000','LIL CHEDDAR MEATLOAF',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2007-01-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8026') +('0028631000000','PEPPERONI CALZONE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-01-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8027') +('0028632000000','SPICY BBQ MEATBALLS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8028') +('0028633000000','RASPBERRY BASIL CHICKEN AND SW',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-03 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8029') +('0028634000000','MEATLOAF AND MASHED POTATO DIN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-04 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8030') +('0028636000000','FRENCH ONION DIP',7.99,'0',0.00,'0',7.24,'0',7.24,'0','1900-01-01 12:00:00','2009-09-30 12:00:00','228','0','2','1','1',0,'0','2007-01-05 01:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8031') +('0028637000000','SPANISH CHICKEN RICE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-09 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8032') +('0028638000000','DOWN SOUTH BBQ CHICKEN DINNER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8033') +('0028639000000','SPINACH CALZONE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-01-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8034') +('0028641000000','GREEK CHICKEN RICE SOUP',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8035') +('0028642000000','VEGAN MAC UN CHEESE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8036') +('0028643000000','VEGETARIAN CHILI PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8037') +('0028644000000','TOMATO ORANGE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-15 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8038') +('0028645000000','SPAGHETTI AND MEATBALLS DINNER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-01-17 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8039') +('0028646000000','SPAGHETTI DINNER',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-17 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8040') +('0028647000000','LIL CHED MEATLOAF AND MASHED P',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-17 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8041') +('0028648000000','LEMON BASIL CHICKEN SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8042') +('0028649000000','TOMATO PESTO PASTA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-18 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8043') +('0028651000000','SOUTHERN FRIED CHICKEN DINNER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8044') +('0028652000000','GLAZED HAM DINNER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8045') +('0028653000000','CHICKEN CHED. BROCCOLI CALZONE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-18 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8046') +('0028654000000','INDONESIAN SPINACH SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-19 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8047') +('0028655000000','CHEDDAR BROCCOLI CALZONE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8048') +('0028656000000','BOHEMIAN PORK GOULASH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8049') +('0028657000000','BAKED TOFU WITH PEANUT SAUCE A',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-24 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8050') +('0028658000000','APRICOT GLAZED TURKEY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-24 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8051') +('0028659000000','THAI STYLE GRILLDED CHICKEN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-24 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8052') +('0028661000000','SPANISH RICE STUFFED PEPPERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2007-01-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8053') +('0028662000000','VEGAN CARROT SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8054') +('0028663000000','VEGGIE STIR FRY WITH RICE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8055') +('0028665000000','VEGAN CARROT GINGER SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8056') +('0028666000000','CURRIED CHICKEN VEGETABLE PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-01-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8057') +('0028668000000','CHICKEN BACON RANCH SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8058') +('0028669000000','CHICKEN AND BROCCOLI ALFREDO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8059') +('0028671000000','ASIAN TURKEY KABOBS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-01-31 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8060') +('0028672000000','GERBER NATURAL ROASTED CHICKEN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2007-01-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8061') +('0028673000000','GERBER NATURAL ROASTED CHICKEN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2007-01-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8062') +('0028674000000','SESAME TOFU',6.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-01-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8063') +('0028675000000','SEITAN STIR FRY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-01-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8064') +('0028676000000','ROASTED VEG. CALZONE W/ MARINA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-01-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8065') +('0028677000000','GERBERS NATURAL ROASTED CHICK',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2007-02-01 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8066') +('0028678000000','BLUE CHEESE DRESSING/DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-02-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8067') +('0028679000000','CHEDDAR MEATLOAF AND SUCCOTASH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-02 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8068') +('0028681000000','SPANISH CHICKEN RICE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-02-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8069') +('0028682000000','LIL CHEDAR MEATLOAF W/ SOUR CR',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2007-02-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8070') +('0028683000000','ITALIAN WEDDING SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-02-07 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8071') +('0028684000000','ITALIAN CHICKEN WITH RICE',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-07 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8072') +('0028685000000','HONEY CURRIED ROASTED CHICKEN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8073') +('0028686000000','MEAL TO GO JERK CHICKEN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8074') +('0028687000000','PESTO SPAGETTI W/ BROCOLI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8075') +('0028688000000','BBQ PORK RIBS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-02-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8076') +('0028689000000','ITALIAN ORZO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-02-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8077') +('0028691000000','PRIMA DONNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-09 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8078') +('0028692000000','CITRUS BBQ TOFU',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-02-12 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8079') +('0028693000000','HEARTY WHEAT CALZONES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8080') +('0028694000000','BROCCOLI & CHEDDAR STUFFED CHI',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-02-09 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8081') +('0028695000000','ROSEMARY CHICKEN W/ CURRY RICE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8082') +('0028696000000','TARRAGON CHICKEN MEAL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8083') +('0028697000000','CHEF SALAD W/1000 ISLAND',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8084') +('0028698000000','CORN CHOWDER W/ SWEET POTATOE',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-02-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8085') +('0028699000000','BBQ CHICKEN CALZONE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8086') +('0028700000000','THREE BEAN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2005-11-04 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8087') +('0028701000000','BBQ RIBLETS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8088') +('0028702000000','BROCCOLI & TOFU W/ SPICY PEANU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-02-12 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8089') +('0028703000000','CHILI LIME SWEET POTATO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-02-12 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8090') +('0028704000000','TURKEY CHEDDAR STUFFED PEPPERS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-02-12 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8091') +('0028705000000','ASIAN SEITAN KABOBS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-02-12 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8092') +('0028706000000','CORDON BLEU CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-02-12 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8093') +('0028707000000','ASIAN SALMON CAESAR SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8094') +('0028708000000','HEAT & SERVE ITALIAN SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8095') +('0028709000000','HEAT & SERVE POOR BOY SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8096') +('0028711000000','',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8097') +('0028712000000','THAI STYLE GRILLED CHICKEN W/',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-14 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8098') +('0028713000000','VEGETARIAN EGG ROLLS W/ DUCK S',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-02-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8099') +('0028714000000','JAPANESE NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-02-21 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8100') +('0028715000000','MANGO GUACAMOLE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-02-23 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8101') +('0028716000000','SAVANNAH BISQUE PINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8102') +('0028717000000','SAVANNAH BISQUE QUART',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-02-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8103') +('0028718000000','MEAL TO GO CORDON BLUE CHICKEN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8104') +('0028719000000','ASIAN TURKEY KABOBS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8105') +('0028721000000','ASIAN SEITAN KABOBS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-02-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8106') +('0028722000000','SPINACH FETA TURKEY BURGERS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-03-28 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8107') +('0028723000000','KALAMATA OLIVE SPREAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'499','2009-09-24 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8108') +('0028724000000','TURKEY BURRITO W/ PICO AND SO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8109') +('0028725000000','PESTO PASTA WITH CHICKEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-03-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8110') +('0028726000000','JERK CHICKEN CALZONE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8111') +('0028727000000','NAVY BEAN SOUP W/ FENNEL',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-03-16 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8112') +('0028728000000','LEMON HERB ROASTED TOFU W/',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8113') +('0028729000000','PARSNIP AND APPLE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-03-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8114') +('0028731000000','PHILLY SANDWICH W/ AJUS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8115') +('0028732000000','HAM AND SWISS SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8116') +('0028733000000','ROAST BEEF SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-23 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8117') +('0028734000000','ROAST BEEF SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-03-23 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8118') +('0028735000000','VEGAN SWEET POTATO SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-03-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8119') +('0028736000000','YOGURT DILL',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-03-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8120') +('0028737000000','CHICKEN AND VEG QUESADILLA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-03-31 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8121') +('0028738000000','BLACK BEAN QUESADILLA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-03-31 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8122') +('0028739000000','GINGER CHICKEN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-04-02 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8123') +('0028741000000','FIRE ROASTED TOMATO BASIL PAST',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8124') +('0028742000000','ALASKAN POLLOCK W/ LEMON RICE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8125') +('0028743000000','ALPHA OMEGA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-04-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8126') +('0028744000000','FREE RANGE DEVILED EGGS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-28 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8127') +('0028745000000','PESTO',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-04-11 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8128') +('0028746000000','GLAZED HAM/POTATOES DINNER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-18 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8129') +('0028749000000','MINTED QUINOA FRUIT SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-04-18 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8130') +('0028751000000','TURKY MEAT LOAF',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8131') +('0028752000000','NORTHERN BEAN AND KALE SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-04-19 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8132') +('0028753000000','CORN AND BLACK BEAN SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-04-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8133') +('0028754000000','herbed crusted chicken',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-20 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8134') +('0028755000000','WILD RICE PILAF',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-04-20 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8135') +('0028756000000','ROAST VEG CALZONE VEGAN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8136') +('0028758000000','LEMONPEPPER CHICKEN ENTREE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-24 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8137') +('0028759000000','SMOKED TROUT SPREAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-04-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8138') +('0028761000000','CHIPOTLE POTATO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-04-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8139') +('0028762000000','FISH CHOWDER SOUP 16 OZ',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-04-27 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8140') +('0028763000000','FISH CHOWDER SOUP 32OZ',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','0','0',0,'-1','2007-04-27 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8141') +('0028764000000','MEAL TO GO CORDON CHICKEN POTS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-04-28 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8142') +('0028765000000','SPICY PINEAPPLE SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-04-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8143') +('0028766000000','BLACK BEAN & CORN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-04-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8144') +('0028767000000','HONEY CURRY CHICKEN ENTREE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8145') +('0028768000000','FRUIT AND JICAMA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-06-20 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8146') +('0028769000000','MEATLOAF W/MASHED POTATOES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8147') +('0028771000000','ITALIAN MEATBALL SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8148') +('0028772000000','ITALIAN VEGETABLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-05-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8149') +('0028773000000','FOG CITY HOT SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-05-09 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8150') +('0028774000000','SPAGHETTI & MEATBALLS MEAL',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-05-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8151') +('0028775000000','CHICKEN MOLE CHILI',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-05-10 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8152') +('0028776000000','COLD CILANTRO SOUP',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-05-10 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8153') +('0028777000000','CURRY VEGGIES W/ RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-11 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8154') +('0028778000000','GRILLED VEGGIE SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-15 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8155') +('0028779000000','BLACK BEAN W/SUN DRIED TOMATO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-16 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8156') +('0028781000000','WEST AFRICAN PEANUT SOUP',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','1',0,'-1','2007-05-16 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8157') +('0028782000000','1,000 ISLAND DRESSING',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8158') +('0028783000000','PASTA ALFREDO W/CHICKEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-05-17 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8159') +('0028784000000','RANCH DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8160') +('0028785000000','BLUE CHEESE DRESSING',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8161') +('0028786000000','SHERRY VINAIGRETTE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8162') +('0028787000000','CAESAR DRESSING',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8163') +('0028788000000','FETTUCINE ALFREDO WITH VEGGIES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8164') +('0028789000000','PORK TENDERLOIN WITH FRUIT',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-05-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8165') +('0028792000000','PHILLY CHEESE STEAK',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-18 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8166') +('0028793000000','RHUBARB CREAM SPICE CAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2007-05-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8167') +('0028794000000','CHICKEN ENCHILADAS W/ RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-22 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8168') +('0028795000000','ASIAN SESANE BEEF KABOBS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-05-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8169') +('0028796000000','ASIAN SESAME CHICKEN SATAY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8170') +('0028797000000','TANGERINE BEEF SATAY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-05-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8171') +('0028798000000','TERIYAKI CHICKEN KABOBS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-05-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8172') +('0028799000000','ROASTED TURKEY BREAST',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-05-23 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8173') +('0028801000000','ROASTED CHICKEN W/ MASHED POTA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-24 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8174') +('0028802000000','TERIYAKI BEEF KABOBS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-05-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8175') +('0028803000000','THAI SALSA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8176') +('0028804000000','TOTALLY TUBER SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-05-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8177') +('0028805000000','BRUSCHETTA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-05-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8178') +('0028806000000','ZESTY THAI NOODLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-06-28 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8179') +('0028807000000','Strawberry feilds forever dip',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-26 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8180') +('0028808000000','SPICY POTATO CHICKPEA SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-05-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8181') +('0028809000000','PORK EGG ROLLS W/ DUCK SAUCE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-29 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8182') +('0028811000000','SPICY THAI RICE SALAD W/CASHEW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-05-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8183') +('0028812000000','GERBER NATURAL ROASTED CHICKEN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2007-05-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8184') +('0028813000000','THAI GRILLED CHICKEN W/THAI WI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-05-31 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8185') +('0028814000000','MEXICANCHICKEN W/RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8186') +('0028815000000','MEDITERRANEAN MEAL - FALAFEL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8187') +('0028816000000','EGGROLLS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-07 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8188') +('0028817000000','MEXICAN CHICKEN SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8189') +('0028818000000','SALADE NICOISE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8190') +('0028819000000','STRAWBERRY PARFAIT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8191') +('0028821000000','GOURMET MAC',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2007-06-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8192') +('0028822000000','KIDS CHIOCCIOLE & CHEESE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8193') +('0028823000000','GARLIC & KALE CALZONES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8194') +('0028824000000','ROAST BEEF CHUTNEY SANDWICH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8195') +('0028825000000','GAZPACHO - 32 OZ',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8196') +('0028826000000','STEAK & TORTILLA SOUP - 32 OZ',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-06-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8197') +('0028827000000','CABBAGE ROLLS - HEAT & SERVE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-06-22 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8198') +('0028828000000','LEMON BASIL CHICKEN SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-06-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8199') +('0028829000000','ROASTED GARLIC POTATO SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-06-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8200') +('0028830000000','COLESLAW',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-06-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8201') +('0028831000000','ROASTED GARLIC POTATO SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-06-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8202') +('0028832000000','MEXICAN BLACK BEAN SOUP 32 OZ',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-06-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8203') +('0028833000000','ROJO RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-06-26 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8204') +('0028834000000','PASTA SALADE TIEDE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-06-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8205') +('0028835000000','STUFFED PORTOBELLO W/TOMATO -',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-06-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8206') +('0028836000000','DELI TUNA & PASTA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-06-28 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8207') +('0028837000000','COLESLAW',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-06-29 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8208') +('0028839000000','SPICY POTATO CHICKPEA SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-07-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8209') +('0028841000000','TURKISH LENTILSOUP 16 OZ',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-07-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8210') +('0028842000000','TURKISH LENTIL SOUP 32 OZ',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-07-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8211') +('0028843000000','ASIAN COLESLAW',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-07-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8212') +('0028844000000','CHICKEN TETRAZINI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-07-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8213') +('0028845000000','Black Bean Chili con Carne',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2007-07-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8214') +('0028846000000','APRICOT GLAZED PORK TENDERLOIN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-07-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8215') +('0028847000000','ASAIN GRILLED PORK RIBS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2007-07-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8216') +('0028848000000','ROAST BEEF CHUTNEY W/ RICE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-07-13 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8217') +('0028849000000','ALMOND CHICKENLESS SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-07-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8218') +('0028850000000','SOBA MANGO CUCUMBER SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-07-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8219') +('0028851000000','CHICKEN W/TWICE POTATO',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-07-27 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8220') +('0028852000000','CHICKEN W/ SEAME RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-07-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8221') +('0028853000000','CHICKEN COUSCOUS SALAD',10.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2007-07-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8222') +('0028854000000','QUINOA SALAD WITH TOASTED ALMO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-08-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8223') +('0028855000000','QUINOA CORN SALAD W PUMPKIN SD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-08-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8224') +('0028856000000','FOUR BEAN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-08-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8225') +('0028857000000','CREAMY CARLOINA COLESLAW',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-08-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8226') +('0028858000000','ASIAN TURKEY LOAF',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-08-04 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8227') +('0028859000000','KALAMATA & ARTICHOKE TAPENADE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-08-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8228') +('0028862000000','SALMON CROQUETTES',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-08-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8229') +('0028863000000','SEITAN TETRAZINI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2007-08-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8230') +('0028865000000','GARDENERA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-08-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8231') +('0028866000000','PERFECT SUMMER PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-08-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8232') +('0028867000000','SWEET & SOUR TEMPEH ALM RAISIN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-08-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8233') +('0028869000000','CHIMICHURRI TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8234') +('0028871000000','SPINACH FRITTATA',7.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-08-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8235') +('0028872000000','ASIAN SLAW',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-09-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8236') +('0028873000000','TERIYAKI CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8237') +('0028874000000','STUFFED TURKEY BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8238') +('0028875000000','JERK PORK RIBS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8239') +('0028876000000','JERK PORK TENDERLOIN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-05 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8240') +('0028877000000','SHRIMP WITH NAPA CABBAGE AND G',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8241') +('0028878000000','GREEN CURRY TROPICAL SHRIMP',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-09-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8242') +('0028879000000','MAPLE GLAZED YAMS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-10-02 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8243') +('0028881000000','CAJUN BEANS & RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-09-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8244') +('0028882000000','PERUVIAN QUINOA STEW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-10-01 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8245') +('0028884000000','CHILI WITH SEOUL 16 OZ',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-09-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8246') +('0028885000000','CHILI WITH SEOUL 32 OZ',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-09-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8247') +('0028886000000','SWEET & SOUR CABBAGE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-09-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8248') +('0028887000000','SAVANAH BISQUE PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-09-21 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8249') +('0028888000000','GREEK CHICKEN DINNERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-09-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8250') +('0028889000000','PORK DINNERS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2007-09-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8251') +('0028892000000','CPW TOMATO BASIL SOUP QUART',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8252') +('0028898000000','CREAMY ARTICHOKE CHICKEN SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-08 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8253') +('0028899000000','CREAMY ARTICHOKE CHICKEN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-08 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8254') +('0028902000000','BLACK BEAN & SHRIMP SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-06-04 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8255') +('0028903000000','BLACK BEAN & SHRIMP SOUP QUART',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-06-04 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8256') +('0028904984864','PCELERY BUNCH',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8257') +('0028914000000','CHICKEN ASIAN DINNERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-09-27 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8258') +('0028915000000','ROASTED VEGETABLE LASAGNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2007-09-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8259') +('0028916000000','CUBAN PORK MEALS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-09-28 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8260') +('0028917000000','CHICKEN CACCIATORE MEALS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8261') +('0028918000000','ORIENTAL CHICKEN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8262') +('0028919000000','VEGGIE ROLL-UPS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8263') +('0028921000000','ITALIAN SAUSAGE LASAGNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2007-10-04 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8264') +('0028922000000','MAPLE BUTTER YAMS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8265') +('0028923000000','PUMPKIN CIDER SOUP SM',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-10-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8266') +('0028924000000','PUMPKIN CIDER SOUP LG',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-10-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8267') +('0028925000000','SAVORY TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8268') +('0028926000000','COWBOY CAVIAR',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-05 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8269') +('0028927000000','CHICKEN DIJONAISE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-10-10 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8270') +('0028928000000','ALMOND RAISIN RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-02-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8271') +('0028929000000','COSMIC LENTIL SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-10-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8272') +('0028930000000','CLASSIC TOMATO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-10-15 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8273') +('0028931000000','COSMIC LENTIL SOUP QT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8274') +('0028932000000','EDAMAME SLAW SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-10-15 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8275') +('0028933000000','CHICKEN WILD RICE SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-10-16 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8276') +('0028934000000','COCONUT RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2007-10-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8277') +('0028935000000','GINGER LEMON YAMS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2007-10-17 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8278') +('0028936000000','TERIYAKI CHICKEN W/ FRY RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-19 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8279') +('0028937000000','MUNG BEAN SPROUT SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-19 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8280') +('0028938000000','MANGO SALSA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-20 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8281') +('0028939000000','MEXICAN RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8282') +('0028941000000','RATATOUILLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2007-10-24 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8283') +('0028942000000','PISTACHIO GOLDEN RAISIN RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8284') +('0028943000000','EAST INDIAN SQUASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8285') +('0028944000000','THAI GREEN CURRY CHICKEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8286') +('0028945000000','THAI GREEN CHILI CHICKEN MEAL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-26 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8287') +('0028946000000','EGGPLANT CASSEROLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-26 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8288') +('0028947000000','BUTTERNUT SQUASH CAKES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-10-27 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8289') +('0028948000000','STUFFED CHICKEN BREAST',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-30 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8290') +('0028949000000','TORTELLINI ROMANO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2007-10-30 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8291') +('0028951000000','PUMPKIN PENNE PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-31 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8292') +('0028952000000','BLOOD ORANGE SQUASH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-11-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8293') +('0028953000000','MEXICAN STEW',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-11-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8294') +('0028954000000','CITRUS YAMS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-11-08 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8295') +('0028955000000','CORNISH GAME HEN WILD STUFFING',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','1','0',0,'0','2007-11-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8296') +('0028956000000','ORANG GLAZ STUF CORN GAME HEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-11-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8297') +('0028957000000','WILD RICE BREAD STUFFED ACCORN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-11-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8298') +('0028958000000','SEITAN PAPRIKASH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-11-01 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8299') +('0028959000000','WILD RICE BREAD STUFFED TURKEY',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-11-08 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8300') +('0028960000000','CREAM OF POTATO',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-11-24 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8301') +('0028961000000','WILD RICE BREAD STUFF W CRANB',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-11-08 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8302') +('0028962000000','MUSHROOM WALNUT LOAF',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-11-13 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8303') +('0028963000000','GREEN BEAN LEEK CASSEROLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-11-13 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8304') +('0028964000000','ROASTED GLAZED HAM',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','1','0',0,'0','2007-11-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8305') +('0028965000000','SAVORY ROAST CORNISH GAMES HEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-11-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8306') +('0028966000000','APPLE COMP STUF ROASTED SQUASH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-11-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8307') +('0028967000000','APPLE BAKED CHICKEN BREASTS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-11-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8308') +('0028968000000','PORK LOIN W/ WILD R CRAN STUFF',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-11-14 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8309') +('0028969000000','PORK LOIN W/ APPLE COMPOTE STU',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-11-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8310') +('0028970000000','LEMON SALMON CAESAR SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-11-23 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8311') +('0028971000000','SZECHUAN GRILLED SHRIMP ',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2007-11-15 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8312') +('0028972000000','TURKEY DINNER W/ POTATOES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-11-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8313') +('0028973000000','ASIAN CHICKEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-12-06 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8314') +('0028975000000','TORTELLINI ROMANO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','0','0','0',0,'0','2007-11-21 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8315') +('0028981000000','PENNE AND BLUSH SAUCE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-04 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8316') +('0028982000000','CAROLINA PULLED PORK',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8317') +('0028983000000','PULLED PORK SANDWICHES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-12-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8318') +('0028984000000','LEMON RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8319') +('0028985000000','GOLDEN MUSTARD BBQ TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8320') +('0028986000000','PASTA WTOMATOES FETA & BASIL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-12-05 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8321') +('0028987000000','BUTTERNUT SQUASH PASTA W/PINE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-12-05 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8322') +('0028988000000','SALMON SPREAD',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-10 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8323') +('0028989000000','MINI MEDITERRANEN TRAY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-18 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8324') +('0028991000000','CPW WILD RICE SOUP QUART',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8325') +('0028992000000','CURRIED LENTILS AROMA RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8326') +('0028993000000','SPICED WINTER SQUASH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-12 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8327') +('0028994000000','BEELERS HAM WITH CHUTNEY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-12-13 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8328') +('0028995000000','BEELERS HAM WITH HORSERADISH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-12-13 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8329') +('0028999000000','FRENCH BAGUETTE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-05-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8330') +('0029000000000','NEW ITEM',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8331') +('0029001000000','HAZELNUT DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2005-06-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8332') +('0029004000000','REMOULADE DIP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2005-07-09 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8333') +('0029005000000','SPANISH OLIVE BUTTER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2005-07-09 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8334') +('0029006000000','PECAN PARTY DIP',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2005-08-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8335') +('0029007000000','BLACK OLIVE SPREAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2005-09-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8336') +('0029009000000','CHILI LIME CORN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-09-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8337') +('0029010000000','NEW ITEM',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8338') +('0029011000000','SPNAISH CHICKEN DINNERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-09-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8339') +('0029012000000','SHRIMP ALFREDO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-09-25 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8340') +('0029013000000','EAST COAST NAVY BEAN BAKE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-15 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8341') +('0029014000000','CREAMY PORTABELLO SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-12-19 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8342') +('0029015000000','SLICED BEELERS HAM',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','1',0,'0','2007-12-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8343') +('0029017000000','ASSORTED SEAFOOD DIPS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-18 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8344') +('0029020000000','NEW ITEM',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8345') +('0029021000000','STEAK FRIES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-20 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8346') +('0029022000000','CURRIED BLACK-EYED PEA SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-12-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8347') +('0029023000000','CURRIED BLACK-EYED PEA SOUP LG',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-12-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8348') +('0029024000000','SMOKED LAKE TROUT',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-12-27 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8349') +('0029025000000','SMOKED SOCKEYE SALMON',15.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2007-12-27 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8350') +('0029026000000','LEEK ROASTED TEMPEH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-12-28 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8351') +('0029027000000','BASIL VINEGARETTE CHICKEN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2007-12-30 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8352') +('0029028000000','CHIN CHICK NOOD SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8353') +('0029029000000','CHIN CHICKEN NOODLE SOUP QT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8354') +('0029030000000','INDONESIAN SPINACH SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8355') +('0029031000000','SAVANAH BISQUE QUART',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-03 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8356') +('0029032000000','WILD RICE STUFFED CHICKEN BRE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-01-04 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8357') +('0029033000000','SPINACH FETA TURKEY MEATLOAF',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-01-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8358') +('0029034000000','RED LENTIL SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8359') +('0029035000000','TUSCAN GREEN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-08 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8360') +('0029036000000','Black Eyed Pea Soup PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-12-31 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8361') +('0029037000000','Black Eyed Pea Soup QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-12-31 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8362') +('0029038000000','SMOKED SALMON PASTA SALAD',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-01-09 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8363') +('0029039000000','RASPBERRY BASIL CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-01-09 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8364') +('0029040000000','SPLIT PEA WITH HAM SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8365') +('0029041000000','THAI PUMPKIN SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8366') +('0029042000000','PBJ SANDWICH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','2','0','0',0,'0','2008-01-16 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8367') +('0029043000000','SWEET MAMAS TURKEY CHILI',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8368') +('0029044000000','CHICKEN AND PEPPERS CALZONE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-25 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8369') +('0029045000000','CALIFORNIA BLEND SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8370') +('0029046000000','EAST AFRICAN SWEET PEA SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8371') +('0029047000000','CREAMY PARSNIP SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8372') +('0029048000000','CREAMY PARSNIP SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-01-27 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8373') +('0029049000000','POTATO CHOWDER O DANIEL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8374') +('0029050000000','NEW ITEM',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8375') +('0029051000000','TUSCAN BEANS & KALE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-01-29 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8376') +('0029052000000','SW CHICKEN FIESTA SALAD 32OZ',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-31 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8377') +('0029053000000','SW CHICKEN FIESTA SALAD 48OZ',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-01-31 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8378') +('0029054000000','WALDORF CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-02-01 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8379') +('0029055000000','CPW- BOUNTIFUL VEGETABLE SOUP',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2008-02-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8380') +('0029056000000','CPW RUSTIC POTATO CHOWDER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-02-01 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8381') +('0029057000000','DELI VEGGIE BLUE CHZ PLATTER',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-01 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8382') +('0029058000000','DELI VEGGIE RANCH PLATTER',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-01 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8383') +('0029059000000','BLACK BEAN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-06-03 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8384') +('0029060000000','NEW ITEM',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8385') +('0029061000000','VEG EGG ROLL & DUCK SC PLATTER',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8386') +('0029062000000','FRANKLIN HONEY OAT BREAD',4.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-10-22 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8387') +('0029063000000','ROASTED PINEAPPLE SALSA (HOT)',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-02-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8388') +('0029064000000','FRANKLIN ST. CROISSANT',6.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2006-10-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8389') +('0029065000000','BAGUETTE NEW FRENCH',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-12-21 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8390') +('0029066000000','POTATO BREAD NEW FRENCH',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-05-14 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8391') +('0029067000000','JENNY LIND CAROAMOM HAZEL ROLL',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8392') +('0029068000000','FRANKLIN RST GARLIC VIENNA',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2006-03-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8393') +('0029069000000','WILD RICE BAGUETTE FRANKLIN ST',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-12-21 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8394') +('0029070000000','NEW ITEM',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8395') +('0029071000000','FOCACCIA NEW FRENCH',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-17 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8396') +('0029072000000','BAGUETTE CHUNKS NEW FRENCH',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','1',0,'0','2007-10-17 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8397') +('0029074000000','BAGUETTE TRIBECA',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-17 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8398') +('0029075000000','NEW FRENCH STREET 2.5 oz ROLL',0.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-17 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8399') +('0029076000000','CARDAMOM ROLLS JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8400') +('0029077000000','CARAMEL ROLL JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-02 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8401') +('0029078000000','CINNAMON ROLL JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8402') +('0029079000000','ICELANDIC ALMOND ROLL JENNY LI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8403') +('0029080000000','ARMENIAN LENTIL SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8404') +('0029081000000','VEGGIES & BLUE CHEESE DRESSING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8405') +('0029082000000','CHICKEN POT PASTY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8406') +('0029083000000','SEITAN POT PASTY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8407') +('0029084000000','CALICO BEEF CHILI PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-02-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8408') +('0029085000000','CALICO BEEF CHILI QT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8409') +('0029086000000','CALICO BEEF CHILI QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-02-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8410') +('0029087000000','VALENTINE APRICOT GLAZ HENS',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','1','0',0,'0','2008-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8411') +('0029088000000','APRICOT GLAZED CORNISH HEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8412') +('0029089000000','ORANGE SALAD W RSTD BEET & GC',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-13 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8413') +('0029090000000','NEW ITEM',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8414') +('0029091000000','MUSHROOM STROGANOFF 2',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-02-14 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8415') +('0029092000000','CHICKEN SALAD W BEAN ALMOND CH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-02-15 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8416') +('0029093000000','ORANG SPICE GLAZ COR HEN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-02-27 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8417') +('0029094000000','CREAM OF CELERY',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-02-20 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8418') +('0029095000000','BLACK-EYED PEA SAUSAGE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8419') +('0029096000000','BLACK-EYED PEA SAUSAGE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8420') +('0029097000000','AZTEC QUINOA SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-02-27 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8421') +('0029098000000','GYPSY STEW QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8422') +('0029099000000','SPLIT PEA W/ HAM',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8423') +('0029100000000','HOPPIN JOHNS',3.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-12-11 02:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8424') +('0029103000000','GOLDEN MUSTARD BBQ TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8425') +('0029104000000','MOROCCAN VEGETABLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8426') +('0029105000000','CUBAN BLACK BEANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8427') +('0029106000000','CUBAN PULLED PORK',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8428') +('0029110000000','NEW ITEM',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8429') +('0029111000000','MV VEGGIE LOMEIN BULK',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','2','1','1',0,'0','2008-02-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8430') +('0029113000000','MV CASE PAD THAI NOODLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-02-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8431') +('0029114000000','SPINACH STUFFED MUSHROOMS',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8432') +('0029115000000','WHEATBERRY CONFETTI',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-04-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8433') +('0029116000000','ORANG SPICE GLAZED PORK LOIN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-04-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8434') +('0029117000000','CITRUS SPICED CHICKEN BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8435') +('0029118000000','ZUCCHINI CHEESE TRIANGLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8436') +('0029119000000','BALSAMIC MARINATED VEGETABLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8437') +('0029120000000','NEW ITEM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8438') +('0029121000000','GRASS-FED BEEF CHILI PINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8439') +('0029122000000','GRASS-FED BEEF CHILI QUART',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-01-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8440') +('0029123000000','SPINACH LINGUINE W/ WALNUT SC',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-01-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8441') +('0029124000000','G&G EDAMAME SL AW SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-03-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8442') +('0029125000000','BLACK EYED PEA CABBAGE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8443') +('0029126000000','BLACK EYED PEA CABBAGE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8444') +('0029127000000','CURRIED CHICK COCO RICE SP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8445') +('0029128000000','CURRIED CHICK COCO RICE SP QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-10 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8446') +('0029129000000','SPINACH AND CHICKPEA SALAD GG',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-03-10 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8447') +('0029130000000','NEW ITEM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8448') +('0029131000000','MEDITERRANEAN PENNE PASTA SA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-01 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8449') +('0029132000000','SWEET ONION PIE',7.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','2008-03-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8450') +('0029133000000','MV THAI DUMPLING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2008-03-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8451') +('0029134000000','LENTIL HAM SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8452') +('0029135000000','LENTIL HAM SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8453') +('0029136000000','MEDITERRANEAN GREEN SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-03-14 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8454') +('0029137000000','CREAMY AVOCADO CHIVE DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-03-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8455') +('0029138000000','CREAMY POTATO TARRAGON HAM PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8456') +('0029139000000','CREAMY POTATO TARRAGON HAM QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-03-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8457') +('0029140000000','NEW ITEM',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8458') +('0029141000000','FENNEL, SUNCHOKE, APPLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-03-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8459') +('0029142000000','NAVY BEAN W/HAM QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-04-09 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8460') +('0029143000000','VEGETABLE TIKKA MASALA N RICE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-04-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8461') +('0029144000000','BULGUR SALAD W TOMATOES FETA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-04-18 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8462') +('0029145000000','BOWTIES W SALMON MINT PEAS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-04-18 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8463') +('0029146000000','CHICKEN SWEET POTATO SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-04-21 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8464') +('0029149000000','CREAM OF BROCCOLI SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-04-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8465') +('0029150000000','NEW ITEM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8466') +('0029151000000','APPLES AND CRANBERRY SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8467') +('0029152000000','CHEDDAR BEEF MEATLOAF',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8468') +('0029153000000','BAKED APPLE TURKEY BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8469') +('0029154000000','ASIAN VEGETABLE SLAW',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8470') +('0029155000000','ORZO W/ SPINACH & FETA -2',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8471') +('0029156000000','SPRING GRAINS SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-04-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8472') +('0029157000000','CORN SPINACH TOMATO SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8473') +('0029158000000','CORN SPINACH TOMATO SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8474') +('0029159000000','BARLEY SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8475') +('0029160000000','NEW ITEM',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8476') +('0029161000000','SPINACH FETTUCINI W/ RICOTTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8477') +('0029163000000','CHEDDAR BROCCOLI SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8478') +('0029164000000','CHEDDAR BROCCOLI SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8479') +('0029165000000','COWBOY BEANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','1',0,'0','2008-05-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8480') +('0029166000000','PASTA W/ CHICKEN AND BROCCOLI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-13 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8481') +('0029167000000','FRESH DILL & TOMATO SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8482') +('0029168000000','FRESH DILL & TOMATO SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8483') +('0029169000000','SPLIT PEA W/ RICE WINE SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8484') +('0029170000000','NEW ITEM',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8485') +('0029171000000','SPLIT PEA W/ RICE WINE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8486') +('0029172000000','GERMAN POTATO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-05-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8487') +('0029173000000','MEDITERRANEAN SALSA',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8488') +('0029174000000','CREAM CHEESE MIX HERB & GARLIC',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-05-16 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8489') +('0029175000000','SPICY CHINESE NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8490') +('0029176000000','FRUIT SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8491') +('0029177000000','OPEN PLU NUMBER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-11 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8492') +('0029178000000','LINGUINE W/ TUNA OLIVE CAPERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8493') +('0029179000000','SPRING VEGETABLE RISOTTO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-05-29 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8494') +('0029180000000','NEW ITEM',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8495') +('0029181000000','COBB SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8496') +('0029182000000','SWEET PEA GUACAMOLE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-13 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8497') +('0029183000000','TOMATO CUCUMBER RELISH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8498') +('0029184000000','SPICY YELLOW LENTIL SOUP-PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-06-17 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8499') +('0029185000000','SPICY YELLOW LENTIL SOUP-QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-06-17 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8500') +('0029186000000','GREEN NOODLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8501') +('0029187000000','RAINBOW CHARD WITH HEMPSEED',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-17 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8502') +('0029188000000','SUNDRIED TOM PASTA BASIL CHEV',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8503') +('0029189000000','CALIFORNIA BLEND SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-06-19 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8504') +('0029190000000','NEW ITEM',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8505') +('0029191000000','VEGAN CALICO BEANS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8506') +('0029192000000','TOFU STIR-FRY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-19 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8507') +('0029193000000','CHANA MASALA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-06-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8508') +('0029194000000','CHICKEN EGG ROLLS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8509') +('0029195000000','LINGUINE W/ CHICKEN HERBS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-24 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8510') +('0029196000000','WILD RICE BERRY CHICKEN GREENS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8511') +('0029197000000','THAI SESAME NOODLES',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8512') +('0029198000000','SPINACH MUSHROOM QUESADILLA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2008-06-26 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8513') +('0029199000000','BLACK BEAN ENCHILADAS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-06-26 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8514') +('0029200000000','NEW DESSERT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8515') +('0029201000000','SMOKED TURKEY BEAN & CORN SAL',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-02-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8516') +('0029202000000','SZECHUAN STIR FRY VEGETABLES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-02-26 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8517') +('0029203000000','CAULIFLOWER CIDER SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8518') +('0029204000000','CAULIFLOWER CIDER SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-05-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8519') +('0029205000000','SPICY SHRIMP SALAD',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-05-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8520') +('0029206000000','BLACK EYE PEA & EDAMAME SUCCOT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-05-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8521') +('0029207000000','BASMATI RICE SALAD W/ CURRANTS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-05-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8522') +('0029208000000','SUMMER FRUIT SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8523') +('0029209000000','MELON BERRY KEBOBS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-06-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8524') +('0029210000000','NEW DESSERT',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8525') +('0029211000000','TOMATO ARTICHOKE TOSS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-03 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8526') +('0029212000000','TROPICAL TUNA SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-05 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8527') +('0029213000000','ORANGE BALSAMIC GLAZED SALMON',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8528') +('0029214000000','GRILLED VEGETABLE MUFFALETA',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8529') +('0029215000000','MEAT & CHEESE MUFFULETTA',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8530') +('0029216000000','BROCCOLI SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8531') +('0029217000000','GOLDEN BEET AND KALE SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-06-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8532') +('0029218000000','TROPICAL WHEAT BERRY SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8533') +('0029219000000','RICE ON THE WILD SIDE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8534') +('0029220000000','NEW DESSERT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8535') +('0029221000000','RAW BROCCOLI SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8536') +('0029222000000','TOMATO BRAISED TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8537') +('0029223000000','MEMES SWEET SOUR COLESLAW',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-06-26 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8538') +('0029224000000','CURRIED CHICKEN VEGETABLE QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-06-27 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8539') +('0029225000000','CAPRESE SANDWICH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-07-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8540') +('0029226000000','GREEN BEANS POMODORO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-01 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8541') +('0029227000000','SPAGHETTI',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8542') +('0029228000000','DAIRY FREE LASAGNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-07-09 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8543') +('0029229000000','CHICKEN ROSEMARY POTATO BEANS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-10 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8544') +('0029230000000','NEW DESSERT',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8545') +('0029231000000','ORZO PIE',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-16 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8546') +('0029232000000','EGG SALAD',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-16 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8547') +('0029233000000','WHOLE PIZZA FORMAGIO',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2008-06-25 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8548') +('0029234000000','WHOLE PIZZA THREE TENORS',22.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2008-06-25 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8549') +('0029235000000','WHOLE PIZZA BRAVO',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','0',0,'0','2008-06-25 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8550') +('0029236000000','LEMON PEPPER LINGUINE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-17 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8551') +('0029237000000','WATERMELON SALAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8552') +('0029238000000','SPAGHETTI AND TURKEY MEATBALLS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8553') +('0029239000000','SPINACH MUSHROOM QUESADILLA 2',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-21 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8554') +('0029240000000','NEW DESSERT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8555') +('0029241000000','DEVILED EGGS-4',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8556') +('0029242000000','WHITE BEAN TOMATO SOUP PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-07-22 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8557') +('0029243000000','WHITE BEAN TOMATO SOUP QUART',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-07-22 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8558') +('0029244000000','HONEY WALNUT CREAM CHEESE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-22 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8559') +('0029245000000','APRICOT PORK TENDERLOIN SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8560') +('0029246000000','ITALIAN ANTIPASTO TRAY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8561') +('0029247000000','SAUTED BOK CHOY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-24 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8562') +('0029248000000','CHINESE CHICKEN SOUP-QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-07-29 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8563') +('0029249000000','SANTE FE BLACK BEANS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8564') +('0029250000000','NEW DESSERT',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8565') +('0029251000000','SAVORY TEMPEH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-07-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8566') +('0029252000000','CHICKEN PAD THAI',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-07-31 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8567') +('0029253000000','ORANGE SPICED FIRE STICKS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-07-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8568') +('0029254000000','ROASTED RED PEPPER DIP (AUG CS',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2008-08-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8569') +('0029255000000','BROCCOLI SALAD W/SUN DRIED CR',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-08-01 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8570') +('0029256000000','PINEAPPLE GINGER FRUIT DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-01 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8571') +('0029257000000','THAI WILD RICE (GG)',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-05 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8572') +('0029258000000','BBQ TURKEY THIGHS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-08-06 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8573') +('0029259000000','ROASTED BONE-IN TURKEY THIGHS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','2','0','1',0,'0','2008-08-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8574') +('0029260000000','NEW DESSERT',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8575') +('0029261000000','ORANGE SPICE PORK LOIN DINNER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-06 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8576') +('0029262000000','VEGAN CALICO PASTA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-07 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8577') +('0029263000000','DARK CHOC. COCONUT HAYSTACKS',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','1',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8578') +('0029264000000','DARK CHOCOLATE COVERED GINGER',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','1',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8579') +('0029265000000','CHOCOLATE COVERED APRICOTS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','1',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8580') +('0029266000000','COCONUT COATED DATE ROLLS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2008-11-12 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8581') +('0029267000000','PEANUT COATED DATE ROLLS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','0','1','1',0,'0','2008-11-12 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8582') +('0029268000000','JUST DESSERTS 6',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8583') +('0029269000000','JUST DESSERTS MINI CHOC CAKE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8584') +('0029270000000','NEW DESSERT',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8585') +('0029271000000','NAPOLEON TORTE LITH. BAKERY',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','1',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8586') +('0029272000000','APPLE KRINGLE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8587') +('0029273000000','RASPBERRY KRINGLE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8588') +('0029274000000','CPW POTATO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-08-10 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8589') +('0029275000000','VEGETABLE QUESADILLA',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8590') +('0029276000000','MOROCCAN COUSCOUS SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-12 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8591') +('0029277000000','CHINESE NAPA CABBAGE SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8592') +('0029278000000','ASIAN RICE NOODLE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8593') +('0029279000000','STRAWBERRY BANANA CREAM CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','1',0,'0','2008-08-13 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8594') +('0029280000000','NEW DESSERT',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8595') +('0029281000000','CHICKEN PARMESAN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-08-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8596') +('0029282000000','PASTA W/ HERB RICOTTA PINE NUT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-14 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8597') +('0029283000000','ORIENTAL SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-14 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8598') +('0029284000000','CHEF SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8599') +('0029285000000','CAJUN RED BEANS AND RICE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-08-15 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8600') +('0029286000000','CAJUN RED BEANS RICE SAUSAGE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-15 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8601') +('0029287000000','LOCAL LETTUCE SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8602') +('0029288000000','MULLIGATAWNY-PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-08-20 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8603') +('0029289000000','MULLIGATAWNY-QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-08-20 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8604') +('0029290000000','NEW DESSERT',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8605') +('0029291000000','PORK LOIN WITH COLLARD GREENS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2008-08-20 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8606') +('0029292000000','DARK CHOCOLATE PEANUT CLUSTERS',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','1',0,'0','2008-08-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8607') +('0029293000000','THAI CHICKEN SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-21 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8608') +('0029294000000','CHICKPEA ZUCCHINI CURRY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-08-21 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8609') +('0029295000000','GIGNER CHICKEN SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-08-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8610') +('0029296000000','VEGAN PESTO',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-22 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8611') +('0029297000000','NATIVE WILD RICE G&G',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-08-27 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8612') +('0029298000000','SUMMER HARVEST LINGUINE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-09-04 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8613') +('0029299000000','CHOCOLATE COVERED CHERRIES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','1',0,'0','2008-09-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8614') +('0029300000000','NEW DESSERT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8615') +('0029301000000','STUFFED SWEET POTAOTES W/CARME',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-09-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8616') +('0029302000000','SUN-DRIED TOMATO RISOTTO CAKES',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-09-02 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8617') +('0029303000000','SMOKED MOZZ AND PESTO PASTA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-09-09 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8618') +('0029304000000','UDON NOODLES WITH PEANUT SAUCE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-09-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8619') +('0029305000000','ITALIAN FOCACCIA SANDWICH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-09-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8620') +('0029306000000','VEGETABLE FOCACCIA SANDWICH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-09-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8621') +('0029307000000','CORDON BLEU TURKEY MEATLOAF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-09-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8622') +('0029308000000','MUSHROOM AND SAUSAGE CALZONE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2008-09-15 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8623') +('0029309000000','TOFU RED PEPPER SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-09-17 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8624') +('0029310000000','NEW DESSERT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8625') +('0029311000000','CARAMEL HONEYCRISP APPLES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-09-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8626') +('0029312000000','NOODLES WITH PEANUT SAUCE CHIX',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-09-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8627') +('0029313000000','CHIPOTLE POTATO SALAD G&G',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-09-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8628') +('0029314000000','RISOTTO W/ PEAS AND CHICKEN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2008-09-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8629') +('0029315000000','MUESLI BARS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2008-09-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8630') +('0029316000000','WILD RICE TOFU SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-09-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8631') +('0029317000000','ROSMARY CHICKEN WITH POTATOES',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-10-06 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8632') +('0029318000000','SWEET PUMPKIN SPREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-10-07 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8633') +('0029319000000','SWEET BEET HUMMUS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-10-07 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8634') +('0029320000000','NEW DESSERT',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8635') +('0029321000000','SOY RICOTTA MANICOTTI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-10-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8636') +('0029322000000','TURKEY SPINACH SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8637') +('0029323000000','TURKEY SPINACH SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8638') +('0029324000000','MACARONI AND CHEESE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-10-17 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8639') +('0029325000000','SUSHI RICE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-10-17 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8640') +('0029326000000','AWESOME CHICKEN SALAD',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-22 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8641') +('0029327000000','CILANTRO DIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-10-22 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8642') +('0029328000000','COUSCOUS STUFFED PEPPERS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-10-22 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8643') +('0029329000000','ZUCCHINI COUSCOUS SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-10-22 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8644') +('0029330000000','NEW DESSERT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8645') +('0029331000000','MACARONI AND GRASS-FED BEEF',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-10-23 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8646') +('0029332000000','PUMPKIN CHICKEN SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-27 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8647') +('0029333000000','PUMPKIN CHICKEN SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-27 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8648') +('0029334000000','MINESTRONE SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-27 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8649') +('0029336000000','STUFFED ACORN SQUASH',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8650') +('0029337000000','CRAISY AND WILD SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8651') +('0029339000000','ROASTED ROOT VEGETABLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8652') +('0029340000000','NEW DESSERT',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8653') +('0029341000000','CAJUN FIRESTIX',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8654') +('0029342000000','SAVORY TURKEY MEATLOAF',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8655') +('0029343000000','HONEY MUSTARD SWEET POTATOES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8656') +('0029350000000','NEW DESSERT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8657') +('0029351000000','VERRY BERRY SCONE JENNY LIND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-10-08 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8658') +('0029360000000','NEW DESSERT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8659') +('0029370000000','NEW DESSERT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8660') +('0029371000000','GREEK LENTIL BURGERS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-31 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8661') +('0029375000000','HARVEST RICE SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-10-31 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8662') +('0029380000000','NEW DESSERT',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8663') +('0029390000000','NEW DESSERT',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8664') +('0029391000000','CREME FRAICHE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-06-11 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8665') +('0029396000000','BLUSH SAUCE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','0','1','0',0,'0','2009-04-17 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8666') +('0029397000000','DELI PIZZA CHEESE BLEND',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','0','1','0',0,'0','2009-04-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8667') +('0029398000000','DELI PIZZA SAUCE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','0','1','0',0,'0','2009-04-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8668') +('0029399000000','DELI MADE PIZZA DOUGH',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','0','1','0',0,'0','2009-04-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8669') +('0029400000000','SPECIAL OF THE MONTH',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8670') +('0029410000000','SPECIAL OF THE MONTH',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8671') +('0029420000000','SPECIAL OF THE MONTH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8672') +('0029430000000','SPECIAL OF THE MONTH',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8673') +('0029440000000','SPECIAL OF THE MONTH',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8674') +('0029444000000','GREEN BEANS WITH MUSHROOMS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8675') +('0029445000000','FESTIVE SWEET POTATOES',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8676') +('0029446000000','CURRIED CAULIFLOWER W/CARROTS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8677') +('0029447000000','CREOLE ROASTED YAMS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8678') +('0029448000000','SAVORY VEGETABLES W/TOFU',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-10-28 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8679') +('0029449000000','WALNUT PECAN PATE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-10-29 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8680') +('0029450000000','SPECIAL OF THE MONTH',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8681') +('0029451000000','VEGETARIAN CHILI QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8682') +('0029452000000','LO MEIN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-10-29 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8683') +('0029453000000','GINGER CHICKEN SOUP QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-30 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8684') +('0029454000000','RED PEPPER FETA SPREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','0',0,'0','2008-10-30 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8685') +('0029455000000','SMOKED FISH SPREAD W/CARAMELI',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-11-28 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8686') +('0029456000000','ROASTED BUTTERNUT SQUASH PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8687') +('0029457000000','ROASTED BUTTERNUT SQUASH QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8688') +('0029458000000','SENEGALESE CHICKEN SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8689') +('0029459000000','SENEGALESE CHICKEN SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8690') +('0029460000000','SPECIAL OF THE MONTH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8691') +('0029461000000','THAI TURKEY MEATBALLS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8692') +('0029462000000','SESAME CASHEW NOODLES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-11-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8693') +('0029463000000','CHICKEN RANCH PASTA SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8694') +('0029464000000','APPLE AND SWEET PEPPER SLAW',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8695') +('0029465000000','WILD ORZO SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8696') +('0029466000000','WHEAT BERRY SALADW/APPLES',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8697') +('0029467000000','SWEET POTATO SALAD W/CAPERS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8698') +('0029468000000','APPLE CRANBERRY CABBAGE SALAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8699') +('0029469000000','TUSCAN EGGPLANT SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8700') +('0029470000000','SPECIAL OF THE MONTH',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8701') +('0029471000000','POTATO SALAD W/LIME',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8702') +('0029472000000','FRENCH POTATO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8703') +('0029473000000','GOLD RUSH CURRY COLESLAW W/APP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8704') +('0029474000000','SOUTHERN FRENCH POTATO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-11-04 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8705') +('0029475000000','ITALIAN PASTA WITH PEPPERONI',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-11-06 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8706') +('0029476000000','SUN DRIED TOMATO RISOTTO',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-11-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8707') +('0029477000000','CREAM OF POTATO SOUP-Q',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-13 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8708') +('0029478000000','GARLIC CHIVE CHEESE BALL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-11-14 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8709') +('0029480000000','SPECIAL OF THE MONTH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8710') +('0029481000000','MEDITERRANEAN WHITE BEAN SOUP',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-17 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8711') +('0029482000000','MEDITERRANEAN WHITE BEAN SOUP',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-17 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8712') +('0029483000000','CHICKEN MUSHROOM SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-19 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8713') +('0029484000000','CHICKEN MUSHROOM SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-19 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8714') +('0029485000000','GREEK RICE AND HERB SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-11-21 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8715') +('0029486000000','PICKLED HERRING',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2008-11-21 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8716') +('0029487000000','MASHED POTATOES',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-11-21 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8717') +('0029488000000','HERB ROASTED TURKEY THIGH',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2008-11-25 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8718') +('0029489000000','WILD RICE CRANBERRY STUFFING',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-11-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8719') +('0029490000000','SPECIAL OF THE MONTH',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8720') +('0029500000000','SPECIAL OF THE MONTH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8721') +('0029501000000','TURKEY DINNER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-11-25 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8722') +('0029502000000','VEGAN TURKEY DINNER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-11-25 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8723') +('0029503000000','HERBED TURKEY BREAST',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-11-26 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8724') +('0029504000000','RED WHITE & BLUE POTATO SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-11-26 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8725') +('0029505000000','WHITE CHICKEN CHILI',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-11-26 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8726') +('0029506000000','GARDEN SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-11-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8727') +('0029507000000','TURKEY DUMPLING SOUP PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-12-01 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8728') +('0029508000000','TURKEY DUMPLING SOUP QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-12-01 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8729') +('0029509000000','CREAMY BROCCOLI POTATO CHED PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-12-02 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8730') +('0029510000000','SPECIAL OF THE MONTH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8731') +('0029511000000','CREAMY BROCCOLI POTATO CHED QT',6.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2008-12-02 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8732') +('0029512000000','CHICKEN AND DUMPLINGS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-04 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8733') +('0029513000000','MEAT AND CHEESE TRAY-9 INCH',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-05 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8734') +('0029514000000','CRANBERRY WILD RICE SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-12-04 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8735') +('0029515000000','MEAT AND CHEESE TRAY W/ GARLIC',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-05 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8736') +('0029516000000','MEAT AND CHEESE TRAY W/ OLIVES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-05 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8737') +('0029517000000','CHEESE TRAY- 9',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-08 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8738') +('0029518000000','VEGETABLE LASAGNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2008-12-10 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8739') +('0029519000000','PISTACHIO CARDAMOM CAKE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','0','1',0,'0','2008-12-10 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8740') +('0029520000000','SPECIAL OF THE MONTH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8741') +('0029521000000','CHEESE AND MEAT TRAY',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-11 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8742') +('0029522000000','NUT TRAY',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8743') +('0029523000000','PARTY TRAY',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8744') +('0029524000000','CRANBERRY KASHI',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','2008-12-12 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8745') +('0029525000000','HONEY NUT SEED CRUNCH',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-12 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8746') +('0029526000000','THAI MEATBALLS AND DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2008-12-12 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8747') +('0029527000000','VEGAN LENTIL SOUP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2008-12-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'8748') +('0029528000000','CALICO TURKEY CHILI PT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','1',0,'-1','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8749') +('0029529000000','CALICO TURKEY CHILI QT',7.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','1',0,'-1','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8750') +('0029530000000','SPECIALOF THE MONTH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8751') +('0029531000000','GARLIC CHIVE CHEESE BALL W NUT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2008-12-16 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8752') +('0029532000000','SPINACH FETA CALZONE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-17 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8753') +('0029533000000','MEDITERRANEAN TRAY 9',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-12-18 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8754') +('0029534000000','HAM DINNER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2008-12-19 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8755') +('0029535000000','CHUTNEY CHEESE BALL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2008-12-22 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8756') +('0029536000000','TEMPEH SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-06 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8757') +('0029537000000','MINI PIZZA W/ SHEEP FETA',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8758') +('0029538000000','PASTA WITH BEANS AND GREENS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-06 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8759') +('0029539000000','RISOTTO WITH PEAS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8760') +('0029540000000','SPECIAL OF THE MONTH',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8761') +('0029541000000','POACHED FRUIT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8762') +('0029542000000','SWEET LEMON BASIL TURKEY BREAS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-08 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8763') +('0029543000000','WHITE BEAN SALAD WITH SMOKED',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-08 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8764') +('0029544000000','MARINATED ROOT VEGETABLE ANTIP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-08 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8765') +('0029545000000','RICE NOODLE SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8766') +('0029546000000','PENNE W/ SUN-DRIED TOMATO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-01-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8767') +('0029547000000','Chilequiles',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2009-01-09 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8768') +('0029549000000','SWEET AND SAVORY APRICOT DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8769') +('0029550000000','SPECIAL OF THE MONTH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8770') +('0029551000000','CHEESE TRAY',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','2009-01-12 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8771') +('0029552000000','ITALIAN SAUSAGE LASAGNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-15 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8772') +('0029553000000','HONEY MUSTARD SAUCE/DRESSING',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','225','0','2','1','0',0,'0','2009-01-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8773') +('0029554000000','IRISH SEITAN STEW PINT',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2009-01-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8774') +('0029555000000','IRISH SEITAN STEW QUART',5.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2009-01-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8775') +('0029556000000','MINI PIZZA BIANCA',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-21 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8776') +('0029557000000','ROSEMARY TEMPEH SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8777') +('0029558000000','SZECHUAN SHRIMP STIR FRY',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8778') +('0029559000000','MINI PEPPERONI PIZZA',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8779') +('0029560000000','SPECIAL OF THE MONTH',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8780') +('0029561000000','CAESAR POTATO SALAD G&G',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-01-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8781') +('0029562000000','DEVILED EGGS-6',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8782') +('0029563000000','GARDEN SALAD W/ CHICKEN',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-01-29 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8783') +('0029564000000','CHICKEN CACCIATORE SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','0',0,'0','2009-01-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8784') +('0029565000000','CHICKEN CACCIATORE SOUP QT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','0',0,'0','2009-01-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8785') +('0029566000000','LEMON PARMESAN TORTELLINI',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-01-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8786') +('0029567000000','PERSIAN RICE SALAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-01-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8787') +('0029568000000','CURRIED EGG SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-02-02 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8788') +('0029569000000','HONEY MUSTARD POTATO SALAD GG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-02-05 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8789') +('0029570000000','SPECIAL OF THE MONTH',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8790') +('0029571000000','CLASSIC POTATO SALAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-02-06 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8791') +('0029572000000','ASIAN CABBAGE CRUNCH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-02-06 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8792') +('0029573000000','FRENCH LENTIL ORZO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-02-06 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8793') +('0029574000000','RASPBERRY LEMON SPICED TURKEY',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-02-09 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8794') +('0029575000000','THAI CHICKEN DINNER',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-02-12 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8795') +('0029576000000','TUSCAN PENNE & BEAN SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8796') +('0029577000000','TUSCAN PENNE & BEAN SOUP QT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-02-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8797') +('0029578000000','GARBANZO W/ GARLIC AND LEMON',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','0',0,'0','2009-02-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8798') +('0029579000000','LOCAL PEANUT BRITTLE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2009-02-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8799') +('0029580000000','SPECIAL OF THE MONTH',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8800') +('0029581000000','CRANBERRY BREAD W/WALNUTS & WI',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','0','1','1',0,'0','2008-11-28 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8801') +('0029582000000','LOCAL CASHEW BRITTLE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2009-02-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8802') +('0029583000000','LOCAL SUNFLOWER SEED BRITTLE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','1',0,'0','2009-02-23 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8803') +('0029584000000','SHRIMP BARLEY JAMBALAYA',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-02-24 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8804') +('0029585000000','FOG CITY MACARONI & HAM SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-02-24 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8805') +('0029586000000','GLORIFIED ORANGE RICE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-02-24 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8806') +('0029587000000','RED CURRY TOFU',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-02-24 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8807') +('0029588000000','SALAD W/ MAPLE VINAIGRETTE',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-02-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8808') +('0029589000000','BREAD PUDDING',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-02-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8809') +('0029590000000','SPECIAL OF THE MONTH',0.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','68','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8810') +('0029591000000','ETHIOPIAN POTATO SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-03-04 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8811') +('0029592000000','ITALIAN FOCACCIA SANDWICH',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-03-05 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8812') +('0029593000000','TURKEY AND PESTO FOCACCIA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-03-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8813') +('0029594000000','TURKEY AND PESTO FOCACCIA',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-03-09 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8814') +('0029596000000','TAPIOCA PUDDING',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-03-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8815') +('0029597000000','SHRIMP AND GINGER SNOW PEA SA',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-03-17 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8816') +('0029598000000','RED CURRY CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-03-17 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8817') +('0029601000000','VEGETABLE FOCACCIA SANDWICH',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-03-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8818') +('0029602000000','CREAMY ASIAGO LINGUINE W CHICK',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2009-03-25 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8819') +('0029603000000','GREEK ARTICHOKE HEARTS & BULGA',7.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-03-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8820') +('0029604000000','HONEY ALMOND BEETS W/ FETA',7.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-03-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8821') +('0029605000000','CHEESE LASAGNA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-04-02 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8822') +('0029606000000','CHICKEN PARMESAN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-03 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8823') +('0029607000000','TROPICAL SUNSHINE CHICKEN SALA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-04-03 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8824') +('0029608000000','GREEN CURRY TROPICAL TEMPEH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8825') +('0029609000000','DELI VEGAN MACARONI SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8826') +('0029610000000','DELI VEGAN POTATO SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-08 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8827') +('0029611000000','TURKEY AND CHEESE MEAL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-04-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8828') +('0029612000000','HAM AND CHEESE MEAL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-04-09 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8829') +('0029613000000','SWEET -N-SOUR RED CABBAGE W/AP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8830') +('0029614000000','SUN DRIED TOMATO PASTA W/BASIL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-22 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8831') +('0029615000000','BLACK BEAN W/SUN DRIED TOM PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-04-27 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8832') +('0029616000000','CHICKEN PENNE W/BASIL AND ASIA',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-04-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8833') +('0029617000000','OLIVE CREAM CHEESE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-04-17 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8834') +('0029618000000','THAI NOODLE PRIMAVERA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2009-04-28 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8835') +('0029621000000','OLIVE CAPER TAPENADE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-04-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8836') +('0029622000000','RAW SD TOMATO SUNFLOWER PATE',10.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-04-30 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8837') +('0029623000000','BALSAMIC BBQ CHICKEN WINGS',6.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-04-30 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8838') +('0029624000000','GODDESS BARS 3rd St.',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-05-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8839') +('0029625000000','BOW THAI PASTA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-05-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8840') +('0029626000000','BACON CORN CHOWDER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','0',0,'0','2009-05-05 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8841') +('0029627000000','CHICKEN AND BROCCOLI CALZONE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-05-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8842') +('0029628000000','ASIAN PORK TENDERLOINS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-05-12 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8843') +('0029631000000','SESAME ORANGE CHICKEN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-05-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8844') +('0029632000000','ORANGE SESAME CHICKEN',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-05-13 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8845') +('0029633000000','ASIAN CHICKEN WINGS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-05-15 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8846') +('0029634000000','BBQ CHICKEN WINGS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-05-20 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8847') +('0029635000000','BRAZILIAN BLACK BEAN SOUP QT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-05-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8848') +('0029636000000','ARTICHOKE SPREAD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-06-02 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8849') +('0029637000000','ONION AND HERB DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-06-03 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8850') +('0029638000000','STRAWBERRY CUCUMBER SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-06-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8851') +('0029639000000','VEGAN SPINACH DIP',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-06-05 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8852') +('0029641000000','PEACE IN THE EAST',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-05-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8853') +('0029642000000','GREEK TURKEY BURGER',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-05-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8854') +('0029643000000','ANTIPASTO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-06-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8855') +('0029644000000','TARRAGON MINT CABBAGE SOUP',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','1',0,'0','2009-06-17 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8856') +('0029645000000','FRESH VEGGIE CREAM CHEESE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-06-18 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8857') +('0029646000000','CHICKEN ENCHILADA MEAL',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-06-24 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8858') +('0029647000000','PEPPERY CHEESE SPREAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-06-24 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8859') +('0029648000000','CREAMY POTATO CHICKEN SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2009-06-25 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8860') +('0029649000000','CREAMY POTATO CHICKEN SOUP QT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','0',0,'0','2009-06-25 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8861') +('0029651000000','GREEK ROASTED POTATO SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-06-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8862') +('0029652000000','STRAWBERRY SPINACH SALAD 2',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-06-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8863') +('0029653000000','CURRY MANGO CHICKEN SALAD',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-06-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8864') +('0029654000000','PROSCIUTTO AND GOAT CHEESE',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2009-06-29 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8865') +('0029655000000','CREAM OF CAULIFLOWER SOUP QT',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-07-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8866') +('0029656000000','CREAM OF CAULIFLOWER SOUP PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'0','2009-07-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8867') +('0029658000000','GREEN GODDESS POTATO SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','2','1','0',0,'0','2009-07-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'8868') +('0029659000000','MEXICAN RICE AND BEAN SOUP',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','1',0,'0','2009-07-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8869') +('0029661000000','ROSEMARY MARINADE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','67','0','0','1','1',0,'0','2009-07-22 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8870') +('0029662000000','CAPRESE ROLL-UP',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-07-23 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8871') +('0029663000000','FRESH MOZZARELLA PROSCIUTTO',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-07-23 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8872') +('0029664000000','MOZZARELLA TOMATO AND BASIL SA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-07-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8873') +('0029665000000','FRENCH HERBED POTATO SALAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-07-28 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8874') +('0029666000000','TOFU CASHEW SPREAD',7.24,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-07-29 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8875') +('0029667000000','CHICKEN WITH COUSCOUS SPINACH',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','1','1',0,'0','2009-07-29 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8876') +('0029668000000','The Kevin',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','226','0','2','0','1',0,'0','2009-08-01 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8877') +('0029669000000','CHICKEN AND RICE SALAD W/PESTO',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-07-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8878') +('0029670000000','PASTA PRIMAVERA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'0','2009-07-31 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8879') +('0029671000000','RED CURRY CHICKEN WRAP',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','1',0,'499','2009-08-03 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8880') +('0029672000000','CURRIED MANGO RICE SALAD',7.99,'0',0.00,'0',7.24,'0',7.24,'0','1900-01-01 12:00:00','2009-09-30 12:00:00','228','0','2','1','1',0,'0','2009-08-06 12:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8881') +('0029673000000','BREAKFAST TO GO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2009-08-07 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8882') +('0029674000000','CRAISY AND WILD SALAD',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-08-10 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8883') +('0029675000000','PORTUGUESE SOUP',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','1','1',0,'0','2009-08-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12757') +('0029676000000','SMOKED TURKEY W/ PARMESAN',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-08-14 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12758') +('0029677000000','CASHEW BARLEY SALAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-08-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12766') +('0029678000000','SPICY 5 PEPPER HUMMUS',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-08-21 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12786') +('0029749000000','8 OZ SOUP AND MUFFIN COMBO',4.19,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','2','0','0',0,'-1','2009-01-14 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8884') +('0029769000000','RICE ON THE WILD SIDE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-08-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12794') +('0029771000000','APPLE SPICE CAKE',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','2','1','1',0,'0','2009-08-25 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12802') +('0029772000000','SWEET CORN AND ARAME',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-08-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12805') +('0029773000000','EDAMAME W/GARLIC AND OLIVES',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','62','0','2','1','1',0,'0','2009-08-26 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12807') +('0029774000000','SMOKED MOZZARELLA PASTA GG',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-08-28 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12826') +('0029776000000','HERB GARLIC CORNBREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','0','0',0,'0','2009-09-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12924') +('0029777000000','ORZO PIE-WHOLE',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2009-09-17 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12941') +('0029822000000','JERK SEITAN',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','1',0,'0','2007-10-05 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8885') +('0029918000000','KIJKJ',1.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2008-06-11 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8886') +('0029970000000','DELI PRODUCE NAB/EA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8887') +('0029980000000','SOUP KIT PRODUCE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8888') +('0029989000000','CURRIED BLACK EYED PEA',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2007-12-21 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'8889') +('0029990000000','DELI PRODUCE NAB',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8890') +('0030696001108','BOIRON Aconit Nap 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8891') +('0030696006208','BOIRON Apis Mell 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8892') +('0030696007508','BOIRON Arnica Mont 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8893') +('0030696007608','BOIRON ARSENICA ALB 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8894') +('0030696010808','BOIRON BELLADONNA 6c',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8895') +('0030696013808','BOIRON BRYONIA ALBA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8896') +('0030696016608','BOIRON CARBO VEGETA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8897') +('0030696019308','BOIRON CHAMOMILA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8898') +('0030696022408','BOIRON COFFEA CRUDA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8899') +('0030696033308','BOIRON GELSEM SEMPERV 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8900') +('0030696036308','BOIRON HEP SULPH CALC 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8901') +('0030696037608','BOIRON HYPERICUM PERF 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8902') +('0030696038408','BOIRON IGNATIA AMARA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8903') +('0030696040108','BOIRON KALI BICHROM',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8904') +('0030696041408','BOIRON LACHESIS MUTUS 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8905') +('0030696044908','BOIRON LYCO CLAV 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8906') +('0030696051108','BOIRON NATRUM MURIATIC 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8907') +('0030696052708','BOIRON NUX VOMICA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8908') +('0030696056908','BOIRON PHOSPHORUS 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8909') +('0030696060608','BOIRON PULSATILLA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8910') +('0030696063108','BOIRON RHUS TOX 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8911') +('0030696067708','BOIRON SEPIA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8912') +('0030696068408','BOIRON SILICEA 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8913') +('0030696071208','BOIRON SULPHUR 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8914') +('0030696071708','BOIRON SYMPH OFFICINAL 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8915') +('0030696073508','BOIRON THUJA OCCID',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8916') +('0030696101708','BOIRON HIST HYDROCHL 6C',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8917') +('0030696203356','BOIRON ARNICA CREAM 2.5OZ',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8918') +('0030696203559','ARNICA GEL',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8919') +('0030696204356','BOIRON CALENDULA CREAM',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8920') +('0030696205250','CALENDULA OINTMENT',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8921') +('0030696260760','COLDCALM-COLD',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8922') +('0030696261060','QUIETUDE/RESTLESS SLEEP',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8923') +('0030696261260','SABADIL-ALLERGY',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8924') +('0030696261360','SINUSALIA-SINUS CONGESTN',12.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8925') +('0030696262535','BOIRON QUIT SMOKING CARE KIT',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8926') +('0030696262635','BOIRON QUIT SNORING CARE KIT',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8927') +('0030696262835','LEG CRAMPS KIT',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8928') +('0030696263335','FIRST AID KIT',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8929') +('0030696274724','ARNICA GEL',13.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8930') +('0030696999851','OSCILLOCOCCINUM, 6 DOSES',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8931') +('0030696999901','OSCILLOCOCCINUM',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2007-04-24 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8932') +('0030807825090','ARNIFLORA ARNICA GEL',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8933') +('0030807825097','ARNIFLORA ARNICA GEL',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8934') +('0030807825190','CALIFLORA CALENDULA GEL',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8935') +('0030807825290','TRIFLORA ANALGESIC GEL',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8936') +('0030807825297','TRIFLORA ANALGESIC GEL',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8937') +('0030807825390','B&T SSSSTING STOP',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8938') +('0030807825492','SPORTS GEL',12.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8939') +('0030807850390','FLORASONE CREAM',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8940') +('0030807850990','PSORIAFLORA CREAM',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8941') +('0030807900293','COUGH & BRONCHIAL SYRUP',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2007-04-24 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8942') +('0030807900393','BOIRON KIDS COUGH SYRUP',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2007-07-27 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8943') +('0030807900693','NIGHTTIME COUGH&BRONC SYR',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2007-04-24 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8944') +('0031053902930','WOBENZYME N 100 CT',33.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-31 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8945') +('0031678313902','PFL FOR ALL YOU DO',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'8946') +('0031885812058','HH CELADRIN CREAM',18.99,'0',0.00,'0',13.99,'0',13.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','90','0','1','0','0',0,'0','2008-05-15 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8948') +('0031885812224','SHAMP,EVERCLEAN UNSCENTD',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8949') +('0031885817907','HH FACIAL GOJI CREAM',15.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-05-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8951') +('0031885818030','HH GOJI EYE CREAM',14.99,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','94','0','1','0','0',0,'0','2008-05-15 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8952') +('0031885850124','CASTOR OIL',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8953') +('0031885851006','HH SCARGO LOTION',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8954') +('0031885853318','HOME HEALTH SMALL WOOL FLANNEL',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2009-02-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8955') +('0032003115061','CARIBBEAN SOL SPF 15 6 0Z',16.35,'0',0.00,'0',9.79,'0',9.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8956') +('0032003125061','CARIBBEAN SOL SPF 25 6 0Z',16.35,'0',0.00,'0',9.79,'0',9.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8957') +('0032003125062','CARIBBEAN SOL KIDS SPF25 6 0Z',16.15,'0',0.00,'0',9.65,'0',9.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2009-05-28 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8958') +('0032601031954','PGARLIC 3OZ BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8959') +('0032601506162','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8960') +('0033338301247','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8961') +('0033383005676','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8962') +('0033383009469','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8963') +('0033383012292','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8964') +('0033383012476','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8965') +('0033383027258','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8966') +('0033383101507','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8967') +('0033383110523','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8968') +('0033383110666','PORANGE BAG VALLEY COVE NON-O',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'793','2009-01-06 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'8969') +('0033383119854','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8970') +('0033383133330','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8971') +('0033383220291','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8972') +('0033383220314','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8973') +('0033383300029','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8974') +('0033383300337','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8975') +('0033383300399','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8976') +('0033383300930','PAPPLE BAG GDELICIOU',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8977') +('0033383300942','PAPPLE BAG GDELICIOU',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8978') +('0033383309606','PAPPLE BAG SANSA',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'691','2007-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8979') +('0033383330011','PAPPLE BAG CAMEO',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1211','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8980') +('0033383330019','PPEAR BAG RED BARTLETT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'770','2007-09-24 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8981') +('0033383510507','PPOTATO BAG IRISH COBBLER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'987','2007-10-08 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8982') +('0033383655925','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8983') +('0033383675411','PMUSHROOM ENOKI',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'514','2005-10-27 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8984') +('0033383676012','PMUSHROOM PORTABELLA SLICED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8985') +('0033383901022','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8986') +('0033383902029','PCARROT BAG 2#',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'512','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8987') +('0033383904320','PSPINACH BUNCH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'672','2009-09-03 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8988') +('0033383904337','PLETTUCE ROMAINE HRT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'8989') +('0033582400001','NA OREGANOL',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8990') +('0035497310682','HYLANDS 12 CELL SALTS',20.29,'0',0.00,'0',12.99,'0',12.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8991') +('0035497311211','CALMS FORTE',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8992') +('0035497311212','CALMS FORTE',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8993') +('0035497311301','HYLANDS IVY OAK HOMEO',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8994') +('0035497329194','HYLANDS MAG PHOS 30X',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-01-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8995') +('0035497330101','COLD TABLETS WITH ZINC',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8996') +('0035497330152','COMPLETE FLU CARE',15.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8997') +('0035497331081','HYLANDS MAG PHOS 30X 500CT',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8998') +('0035497375011','BEDWETTING TABLETS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'8999') +('0035497375021','COLIC TABLETS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9000') +('0035497375031','COUGH SYRUP WITH HONEY',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9001') +('0035497375041','TEETHING TABLETS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9002') +('0035497375043','TEETHING GEL',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9003') +('0035497375051','C-PLUS COLD TABLETS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9004') +('0035497375071','HYLANDS EARACHE TABLETS 40CT',12.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9005') +('0035497375183','CALMS FORTE 4 KIDS',7.65,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9006') +('0035497391302','HYLANDS HEMMORHOIDS',11.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9007') +('0035616330090','EMERITA VALUE SIZE PRO GEST',41.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9008') +('0035616330095','PRO-GEST CRM,PARABEN FREE',27.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9009') +('0035616330110','PHYTOESTROGEN CREAM',20.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9010') +('0035616330120','PERSONAL LUBRICANT',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9011') +('0035616330225','OH LUBRICANT,WARMING',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9012') +('0035795550712','KING BIO CHEMOCLENZ',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2006-12-21 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9013') +('0035795551202','KING BIO SNORE CONTROL',16.59,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','104','0','1','0','0',0,'0','2007-10-30 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9014') +('0036855901315','PRIMA VU HERBAL EYE DROPS',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-02-25 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9015') +('0036855901515','PRIMA VU HERBAL EYE DRPS ACUTA',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9016') +('0036855901812','PRIMA VU HERBAL EYE WASH',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-02-25 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9017') +('0036855906020','PRIMA LENS CONTACT SOLUTION',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9018') +('0037140070101','POLLEN HAYFEVER',11.75,'0',0.00,'0',7.59,'0',7.59,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9019') +('0037140070201','BIOALLERS MOLD YEAST DUST',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9020') +('0037140070401','NATRA BIO GRAIN ALLERGY',11.75,'0',0.00,'0',7.59,'0',7.59,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9021') +('0037140070501','NATRA BIO DAIRY ALLERGY',11.75,'0',0.00,'0',7.59,'0',7.59,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','104','0','1','0','0',0,'0','2008-12-11 10:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9022') +('0037140070701','TREE POLLEN',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9023') +('0037140070801','BIOALLERS NASAL SPRAY',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9024') +('0037140070960','PET ALLERGY',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9025') +('0037140071160','OUTDOOR ALLERGY',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9026') +('0037613532007','MERA HAIRSPRAY',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-12-27 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9027') +('0037613542008','MERA MISTING GEL',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-12-27 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9028') +('0038232083570','PPINEAPPLE CORED',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1313','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9029') +('0048481009303','TURKEY MEATBAL,FREE RANGE',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-10-27 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'9030') +('0048740404448','PSEED RED BASIL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9031') +('0052536000237','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9032') +('0057700000000','PPAPAYA C/W',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'1133','2007-10-01 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9033') +('0060146210072','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9034') +('0060146210125','PLIMES BAGGED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'758','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9035') +('0060244400210','WYNDMERE CHAM OIL',5.35,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9036') +('0060244400330','WYNDMERE EUC GLOB OIL',4.75,'0',0.00,'0',3.29,'0',3.29,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9037') +('0060244400360','WYNDMERE FRANK OIL',5.25,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9038') +('0060244400420','WYNDMERE GRAPEFRUIT OIL',5.95,'0',0.00,'0',4.15,'0',4.15,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9039') +('0060244400470','WYNDMERE JASMINE OIL',14.45,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9040') +('0060244400520','WYNDMERE LAVENDER',10.45,'0',0.00,'0',4.85,'0',4.85,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-11-07 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9041') +('0060244400760','WYNDMERE ORANGE OIL',3.75,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9042') +('0060244400810','WYNDMERE PATCHOULI OIL',11.65,'0',0.00,'0',8.15,'0',8.15,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9043') +('0060244400820','WYNDMERE PEPPERMINT OIL',6.95,'0',0.00,'0',4.85,'0',4.85,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-11-07 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9044') +('0060244400900','WYNDMERE ROSE OTTO OIL',12.95,'0',0.00,'0',8.99,'0',8.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9045') +('0060244400910','WYNDMERE ROSEMARY OIL',5.25,'0',0.00,'0',3.65,'0',3.65,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9046') +('0060244400980','WYNDMERE TEA TREE',7.45,'0',0.00,'0',6.75,'0',6.75,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9047') +('0060244401060','WYNDMERE ACHES AND PAINS',10.75,'0',0.00,'0',7.49,'0',7.49,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-11-07 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9048') +('0060244401085','WYNDMERE FOREST RETREAT',11.75,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9049') +('0060244401090','WYNDMERE BALANCING',10.75,'0',0.00,'0',7.49,'0',7.49,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9050') +('0060244401095','WYNDMERE HEAD AIDE',10.75,'0',0.00,'0',7.49,'0',7.49,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9051') +('0060244401120','WYNDMERE BREATHE EASY',9.75,'0',0.00,'0',6.79,'0',6.79,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9052') +('0060244401240','WYNDMERE STRESS RELIEF',12.95,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9053') +('0060244401300','WYNDMERE REFRESHING OIL',9.75,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9054') +('0060244401315','WYNDMERE JOYFUL SPIRIT',9.45,'0',0.00,'0',6.59,'0',6.59,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-11-07 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9055') +('0060244401355','WYNDMERE SLEEPY TIME',11.95,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9056') +('0060244401360','WYNDMERE RELAXING OIL',11.95,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-11-07 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9057') +('0060244401385','WYNDMERE IMMUNE SUPPORT',9.75,'0',0.00,'0',6.79,'0',6.79,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9058') +('0060244401390','WYNDMERE ROMANTIC NIGHTS',15.95,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9059') +('0060244401621','WYNDMERE 2 OZ PLASTIC',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12955') +('0060244401641','WYNDMERE 2 OZ W SPRAYER',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9060') +('0060244401681','WYNDMERE 1-2 OZ W SPRAYER',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9061') +('0060244401740','WYNDMERE 4 OZ W SPRAYER',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9062') +('0060244401750','WYNDMERE 1 OZ W SPRAYER',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9063') +('0060244402530','WYNDMERE 1 OZ PLASTIC',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12954') +('0060244402560','WYNDMERE 4 OZ PLASTIC',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12956') +('0060244404250','WYNDMERE BLACK METAL LAMP',12.99,'0',0.00,'0',8.99,'0',8.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2007-11-09 09:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9064') +('0060244404301','WYNDMERE CHROME SWIRL LAMP',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-05-16 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9065') +('0060244404460','WYNDEMERE SCENT BALL',10.55,'0',0.00,'0',7.35,'0',7.35,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2007-12-27 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9066') +('0060244404490','WYNDMERE CAR SCENTER',10.55,'0',0.00,'0',7.35,'0',7.35,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2007-12-27 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9067') +('0060244404520','DIFFUSER REFILLS',3.55,'0',0.00,'0',2.45,'0',2.45,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2007-01-31 04:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9068') +('0060244404630','BLUE ELECTRIC DIFFUSER',21.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9069') +('0060244404640','SAND ELECTRIC DIFFUSER',21.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9070') +('0060264827320','LIVING CRAFTS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-08-25 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12801') +('0060264878893','STONE SOUP',6.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9071') +('0060265214001','PESTO, BASIL',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9072') +('0060265217002','BAR,MACADAMIA APRICOT',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','1','1','0',0,'1612','2009-09-11 09:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9073') +('0060265217004','KIND BAR FRUIT AND NUT DELIGHT',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','1','1','0',0,'1612','2009-09-11 09:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9074') +('0060265217005','BAR,ALMOND APRICOT',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','1','1','0',0,'1612','2009-09-11 09:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9075') +('0060265217006','BAR,NUT DELIGHT 1.4 OZ',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','1','1','0',0,'1612','2009-09-11 09:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9076') +('0060265217007','BAR,FRUIT NUT YOGURT',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','1','1','0',0,'1612','2009-09-11 09:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9077') +('0060265217008','BAR,ALMOND & COCONUT',1.89,'0',0.00,'0',1.19,'0',1.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','1','1','0',0,'1612','2009-09-11 09:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12871') +('0060265217011','PLUS BAR,CRNBRY & ALMOND',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-07-22 11:02:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9078') +('0060265217012','PLUS BAR,STRWBRY NUT DEL',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-07-22 11:02:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9079') +('0060265217013','PLUS BAR,ALMD,WLNT & MAC',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-07-22 11:02:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9080') +('0060265217016','PLUS BAR,ALMOND & CASHEW',1.89,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-07-22 11:02:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9081') +('0060302816014','FRESH LASAGNA',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-12-20 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9082') +('0060322540011','FOUR ELEM HERBAL BATH SALTS',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-07-10 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9084') +('0060322540042','FOUR ELEM MEADOW BATH SALTS',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-07-10 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9085') +('0060322540046','FOUR ELEM LOOK MA NO X E MA',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-09-24 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9086') +('0060322540056','FOUR ELM CAL NEROLI CREAM',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-09-24 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9087') +('0060322540059','FOUR ELEM SELF HEAL CREAM',14.39,'0',0.00,'0',9.35,'0',9.35,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','97','0','1','0','0',0,'499','2009-09-24 08:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9088') +('0060322540077','LOOK MA NO X E MA SOAP',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9089') +('0060322540114','FOUR ELEM CEDAR SAGE DEOD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2007-08-11 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9090') +('0060322540123','FOUR ELEM INSECT REPELLENT',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-07-16 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9091') +('0060322540124','FOUR ELEM INSECT REP ROLL ON',8.95,'0',0.00,'0',5.35,'0',5.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-07-16 01:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9092') +('0060357200041','PSPROUTS ALFALFA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9093') +('0060357204512','PSPROUTS BEAN',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'655','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9094') +('0060418311010','SALSA,CHIPOTLE,HOT',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9095') +('0060418311020','SALSA,RSTD TOMATO,MILD',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9096') +('0060418311050','SALSA,TOMATILLO,MEDIUM',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9097') +('0060418311130','SALSA,MED MANGO KEY LIME',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-03-03 06:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9098') +('0060418312140','ENCHILADA SAUCE CLSIC RED',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-07-12 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9099') +('0060418312141','SAUCE,ENCHILADA,CHPTL GR',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-05-14 07:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9100') +('0060418314030','BBQ SAUCE SWT SMOKY 12 OZ',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2007-07-12 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9101') +('0060418315010','FRONTERA FOUR CHS PIZZA',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2009-04-19 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9102') +('0060418315011','PIZZA,RST VEG MONTRY JAC',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9103') +('0060418331010','SALPICA MED SALSA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-11-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9104') +('0060418331020','SALPICA MILD GREEN OLIVE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-11-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9105') +('0060418331040','SALPICA SALSA RD CHIPT',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9106') +('0060418331110','SALPICA MANGO PEACH',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-11-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9107') +('0060418332030','DIP SALSA CON QUESO',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9108') +('0060451200103','PPOTATO BAG RED 3#',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'1391','2009-07-08 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9109') +('0060451200105','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9110') +('0060451200205','PPOTATO BAG RUSS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9111') +('0060451200403','PPOTATO BAG YELL',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9112') +('0060451200405','PPOTATO BAG YELLOW',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9113') +('0060504936663','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-04-08 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9114') +('0060538800108','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9115') +('0060580600025','PSPROUTS BROC NON-O',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1369','2009-02-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9116') +('0060587998811','Blue Lavender Clean Milk 4 oz',26.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9117') +('0060587998812','Rose Cleansing Milk 4 oz',26.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9118') +('0060587998815','TeaTree Gel Cleanser 4 oz',26.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9119') +('0060587998822','Lavender Facial Tonic Hydroso',20.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9120') +('0060587998824','Rose Geranium Facial Tonic Hyd',20.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9121') +('0060587998826','Orange Blossom Facial Tonic Hy',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9122') +('0060587998835','Chamomile Eye Care Cream 1/2 o',29.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9123') +('0060587998836','Blue Chamomile Moisturizer 1.5',36.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9124') +('0060587998837','Rose Vetiver Moisturizer 1.5 o',36.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9125') +('0060587998841','Sea Algae Serum 1/2 oz',34.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9126') +('0060587998843','Blemish Stick .175 oz',14.95,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9127') +('0060587998851','Rosehip Treat Oil Rose 1/2 oz',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9128') +('0060587998853','Rosehip Treat - Blue 1/2 oz',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9129') +('0060587998891','Face Care Kit - Rose',28.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9132') +('0060587998892','Face Care Kit - Blue',28.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9133') +('0060587998895','Face Care Kit - Blemish',32.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9134') +('0060595610002','SYRUP, OG MAPLE, 120Z',9.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-11-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9135') +('0060595610016','MAPLE SYRUP, OG 16OZ',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-11-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9136') +('0060595610132','MAPLE SYRUP GRADE B LOCAL OG',25.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-05-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9137') +('0060827410200','CHILDLIFE LIQ VIT C 4 OZ',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9138') +('0060850301001','HERBAL ARMOR,SPF15',9.49,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'mixmatchcode','2009-04-01 01:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9140') +('0060850301002','HERBAL ARMOR LOTION',7.65,'0',0.00,'0',4.59,'0',4.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9141') +('0060850301003','HERBAL ARMOR SPRAY',7.65,'0',0.00,'0',4.59,'0',4.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9142') +('0060850301004','ALL TERRAIN KIDS HERBAL ARMOR',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2009-06-10 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9143') +('0060850301013','HERBAL ARMOR SPRAY',4.75,'0',0.00,'0',2.85,'0',2.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9144') +('0060850301090','ALL TERRAIN PET HERBAL ARMOR',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-07-03 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9145') +('0060850305001','BANDAGE,ECO GRD,ADULT',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-18 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9146') +('0060850305022','ALL TERRAIN POISON IVY OAK CR',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9147') +('0060928010500','EAR OIL',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9148') +('0060928030002','EAR CANDLE,BEESWAX',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9149') +('0060928030004','EAR CANDLE,BEESWAX',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9150') +('0060928060012','EAR CANDLE,PARAFFIN,LVNDR',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9151') +('0060928060014','EAR CANDLE,PARAFFIN,LVNDR',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9152') +('0060986304704','TOPRICIN CREAM',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-26 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9153') +('0061001403020','PKEY LIME NON-ORGANI',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'1125','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9154') +('0061001404446','PPOMEGRANATE SEEDS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'814','2007-10-01 10:03:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'9155') +('0061001408616','PCOCONUT YOUNG NON-O',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','0','0',0,'699','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9156') +('0061001408722','PKIMCHEE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'1303','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9157') +('0061001409004','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9158') +('0061001409034','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9159') +('0061001409107','PPEAR BAG BARLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9160') +('0061001409121','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9161') +('0061001409161','PTANGELO BAG',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'591','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9162') +('0061001409436','PPINEAPPLE CORED',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'1313','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9163') +('0061001409637','PGARLIC 3OZ',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9164') +('0061001409753','PPOTATO ROASTERS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'893','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9165') +('0061001409764','PPOTATO ROASTERS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'893','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9166') +('0061023201104','BEANS, BLACK, SALTED FERMENTED',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-06-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9167') +('0061046210024','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9168') +('0061046210027','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9169') +('0061046210036','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9170') +('0061046210050','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9171') +('0061046210054','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'9172') +('0061046210060','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9173') +('0061046210061','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9174') +('0061046210072','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9175') +('0061046210073','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9176') +('0061046210082','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9177') +('0061046210083','PAPPLE BAG SUNDOWNER',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1097','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9178') +('0061046210101','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9179') +('0061046210102','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9180') +('0061046210120','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9181') +('0061046210121','PORANGE BAG SWEET',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9182') +('0061046210125','PLIMES BAGGED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'758','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9183') +('0061046210126','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9184') +('0061046210170','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9185') +('0061046210201','PPINEAPPLE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'9186') +('0061046265563','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9187') +('0061112313000','PWATERCRESS <NO>',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'679','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9188') +('0061112313001','PWATERCRESS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'679','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9189') +('0061162401965','ORG ESS 30CT COTTON SWABS',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-28 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9190') +('0061162401981','OE COTTON BALLS 80CT',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9191') +('0061162401982','OE COTTON ROUNDS 80CT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9192') +('0061162401988','COTTON SWABS,OG 180CT',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9193') +('0061290009960','CORN CRUST PIZZA SHELLS',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9194') +('0061302907081','BUBBLE BATH FLOWER SINGLE',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'mixmatchcode','2009-01-28 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9195') +('0061302926011','OBC BUBBLE BATH ROSES',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'mixmatchcode','2009-01-28 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9196') +('0061309868350','YUMMI BR,MULTIVIT',15.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9197') +('0061461325020','CADY CREEK GOLD JACK SLICE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-10-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9199') +('0061461325030','CADY CREEK MILD CHEDDAR SLICES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-10-26 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9200') +('0061461325060','CADY CREEK PEPPERJACK SLICE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-10-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9201') +('0061461325120','CADY CREEK PROVOLONE SLICE',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-10-26 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9202') +('0061461325310','CADY CREEK BABY SWISS SLICE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-27 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9203') +('0061461325380','CADY CREEK MUENSTER SLICE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-11-02 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9204') +('0061523701102','PBROC CARROT MIX BAG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','1','1','0',0,'855','2009-08-05 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9205') +('0061523701103','PBROCCOLI FLORETS PACKAGE',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','510','0','0','1','0',0,'1161','2006-02-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9206') +('0061523710001','PSALAD BABY SPINACH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9207') +('0061523710101','PBABY SPIN CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1018','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9208') +('0061523720001','PSALAD BABY ROMAINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9209') +('0061523720026','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9210') +('0061523720028','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9211') +('0061523720101','PSALAD ROMAINE CLAM',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9212') +('0061523720201','PROMAINE CLAM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1189','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9213') +('0061523722001','PLETTUCE ROMAINE HRT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9214') +('0061523723001','PSALAD ROMAINE CHOPPED',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9215') +('0061523732001','PSALAD ITALIAN MIX',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'668','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9216') +('0061523740001','PSALAD SPRING MIX BAG',3.29,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','521','0','0','1','0',0,'669','2009-04-22 07:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9217') +('0061523740101','PSPRING MIX CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9218') +('0061523740201','PSPRING MIX CLAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9219') +('0061523742101','PSALAD SPRING MIX CLAM 1#',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9220') +('0061523760001','PSALAD ARUGULA',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9221') +('0061523780001','PSALAD AMERICAN BAG',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1008','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9222') +('0061566100340','ARTEK TRAVEL MUG W/CLIP',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-22 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9223') +('0061573101588','MANGO LIP THERAPY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9224') +('0061573101589','PASSIONFRUIT LIP THERAPY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9225') +('0061573101590','NECTARINE LIP THERAPY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9226') +('0061573101591','CARDAMOM LIP THERAPY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9227') +('0061573101593','ROSEMINT LIP THERAPY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9228') +('0061573101594','GINGER LIP THERAPY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9229') +('0061582888937','HSWAY GREEN TEA PEACH',22.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9230') +('0061611210504','AVOCLASSIC GUACAMOLE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-09-03 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9231') +('0061611210542','GUACA SALSA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-03-18 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9232') +('0061727933457','IONIZED TRACE MIN',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9233') +('0061727933459','TROP. MULTI VIT/MINERAL L',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9234') +('0061727933485','GLUCOS/CHOND W MSM VIT C',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9235') +('0061727934001','TROP. CALCIUM/MAGNESIUM L',18.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-04-11 01:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9236') +('0061727950002','TROP. B-COMPLEX',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9237') +('0061754500100','TONGUE CLEANER',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9238') +('0061859396020','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9239') +('0062005879265','ADBUSTERS',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'499','2009-09-14 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12881') +('0062013300050','Tapioca Eng Muffins',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-09-30 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9240') +('0062013300052','tapioca Dog Buns',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-09-30 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9241') +('0062013300053','KINNIKINNICK GF HAMB BUNS',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-09 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9242') +('0062013300216','GF DOUGHNUTS',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-10 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9243') +('0062013300309','CRACKER,SMOREABLE GRAHA',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-06-11 12:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9244') +('0062168302015','PASTA,OG,SPAG,BRN RICE',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9245') +('0062168302115','PASTA,OG,PENNE,BRN RICE',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9246') +('0062168302125','PASTA,OG,SPIRAL,BRN RICE',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9247') +('0062168372125','PASTA,SPIRAL,VEG,BRN RC',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-09-10 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9248') +('0062168392055','PASTA, ELBOWS, BROWN RICE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9249') +('0062168392065','PASTA FUSILLI TINKYADA',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9250') +('0062168392075','PASTA, SHELLS, BROWN RICE',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9251') +('0062168392135','PASTA, OG, LASAGNA, BRN RICE',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9252') +('0062886500001','WYSI WIPE TOWLETTE',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-04-16 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9253') +('0063107814102','APPLE KRINGLES',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','61','0','1','1','0',0,'0','2008-08-20 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9254') +('0063120370003','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9255') +('0063172320620','STUFFED RED PEPPERS',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','0','0','0',0,'0','2007-04-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9256') +('0063174001010','TBRUSH,ULTRA SOFT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9257') +('0063174001013','TBRUSH,SOFT',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9258') +('0063174001015','TBRUSH,MEDIUM',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9259') +('0063174002010','TBRUSH,JR,SFT,ENDANGERED',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9260') +('0063174003010','TONGUE CLEANER',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9261') +('0063174005010','DISPLAY,RAZOR,RECYLB 4 PK',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9262') +('0063174005080','PRESERVE TRIPLE RAZOR',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9264') +('0063174005090','PRESERVE TRIP BLADE RPLACEMNTS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9265') +('0063174006001','PLATES,LRG,APPLE GREEN',6.79,'0',0.00,'0',4.79,'0',4.79,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','183','0','1','0','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9266') +('0063174007001','PLATES,SML,APPLE GREEN',4.39,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','183','0','1','0','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9267') +('0063174011001','CUTLERY,APPLE GREEN',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9268') +('0063174012001','PRESERVE TOOTHPICKS TEA TREE',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-06-03 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9269') +('0063174012002','PRESERVE TOOTHPICKS CINNAMON',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-01 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9270') +('0063174014007','TUMBLER,APLE GREEN,16 OZ',5.35,'0',0.00,'0',3.75,'0',3.75,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','183','0','1','0','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9271') +('0063195291111','PITA CHIPS,PARM GRLC HERB 6 OZ',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9272') +('0063243291100','YERBA MATE, TRADITIONAL',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','0','0',0,'mixmatchcode','2009-09-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9275') +('0063243291160','YERBA MATE, PURE MIND',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','0','0',0,'mixmatchcode','2009-09-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9276') +('0063243296201','TEA,OG,YERBA MATE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9277') +('0063243296304','TEA,OG,SAN MATEO BLD,LOO',13.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9278') +('0063243296882','TEA,OG,FT,PURE HEART',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9279') +('0063338367521','PMUSHROOM OYSTER PKG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'965','2007-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9280') +('0063390430104','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9281') +('0063390440122','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9282') +('0063390444123','PTANGERINE BAG MINNEOLA',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'634','2007-09-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9283') +('0063392400360','MT CAPRA MINERAL WHEY',32.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9284') +('0063395171100','ANDREJS POTICA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2006-12-08 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9285') +('0063408402112','BADGER HEALING BALM .75 OZ',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9286') +('0063408402312','BADGER SORE MUSCLE .75OZ',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9287') +('0063408402512','BADGER FOOT BALM .75 OZ.',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9288') +('0063408402612','BADGER SLEEP BALM .75 OZ',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9289') +('0063408402712','BADGER EVOLVING BALM .75 OZ.',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9290') +('0063408402912','BADGER ANIT BUG BALM .75Z',4.39,'0',0.00,'0',2.59,'0',2.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9291') +('0063408413571','BADGER HEALING BALM 2 OZ.',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9292') +('0063408422508','BADGER PNK GRPFRT LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2008-03-14 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9293') +('0063408422509','BADGER VANILLA LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9294') +('0063408423501','BADGER SORE JOINT .75 OZ',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9295') +('0063408424201','BADGER WINT WONDER BALM .75 OZ',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9296') +('0063408433033','BADGER UNSC HEAL BALM 2 OZ.',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9297') +('0063408433159','BADGER UNSC LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9298') +('0063408433160','BADGER MINT LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9299') +('0063408433161','BADGER TANGERINE LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9300') +('0063408433162','BADGER GING LEMON LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'0','2008-02-27 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9301') +('0063408433164','BADGER LAV ORANGE LIP BALM',2.99,'0',0.00,'0',2.35,'0',2.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9302') +('0063408433220','BADGER ANTI BUG BALM STICK',8.25,'0',0.00,'0',4.95,'0',4.95,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-06-24 08:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9303') +('0063408446031','SUNSCREEN 15 SPF BADGER',12.85,'0',0.00,'0',7.69,'0',7.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9304') +('0063408447031','SUNSCREEN SPF 30 BADGER',12.85,'0',0.00,'0',7.69,'0',7.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9305') +('0063408448023','BADGER HEADACHE BALM 1 OZ',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9306') +('0063474421002','ALOTTI BISCOTTI',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9307') +('0063474421004','ALOTTI BISCOTTI',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9308') +('0063474421006','ALOTTI BISCOTTI',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9309') +('0063474421007','ALLOTTI BISCOTTI',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-02-12 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9310') +('0063538100017','NEW FRENCH WH GRAIN CIABATTA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2006-04-03 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9311') +('0063538100401','NEW FRENCH ASIAGO GARLIC BATAR',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-05-13 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9312') +('0063538100500','NEW FRENCH BAKERY BAGUETTE',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-22 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9313') +('0063538100576','New French ST. DBL RAISIN RYE',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-05-21 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9314') +('0063547518234','HEN HOUSE LARGE EGGS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','28','0','0','1','0',0,'499','2009-09-23 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9315') +('0063582400004','NA OREGAMAX 90 CT',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9316') +('0063599204330','SOY CRISP,DEEP SEA SALTD',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1550','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9317') +('0063599204440','SOY CRISP,RICH CHED CHES',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1550','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9318') +('0063664713006','PREV PECAN DATE ROLL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9319') +('0063687412021','EO HAND SANITIZER 8OZ',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9320') +('0063687412022','EO HAND SANITIZER 2OZ',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-08-06 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9321') +('0063687412023','EO HAND SANITIZER SNG',0.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-03-07 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9322') +('0063687412024','EO SANITIZING HAND WIPES',20.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9323') +('0063687412055','EO SANITIZER UNSCENTED 2 OZ',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9324') +('0063687412087','EO HAND SANITIZER 2 OZ SPRAY',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-08-06 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9325') +('0063779250003','NATRL WHTNING TOOTHPASTE',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9326') +('0063779260100','TEA TREE THERAPY VEG SOAP',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9327') +('0063779280050','TEA TREE THERAPY EUC CHESTRUB',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9328') +('0063803160104','CELEBRATION STUFFED ROAST',9.99,'0',0.00,'0',6.29,NULL,6.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','228','0','2','1','0',0,'0','2008-11-25 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9329') +('0063803161215','FIELD ROAST ITALIAN SAUSAGE',6.19,'0',0.00,'0',4.89,NULL,4.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2009-04-21 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9330') +('0063803161216','FIELD ROAST CHIPOTLE SAUSAGE',6.19,'0',0.00,'0',4.89,NULL,4.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2009-04-21 09:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9331') +('0063803161217','FIELD ROAST APPLE SAGE SAUSAGE',6.19,'0',0.00,'0',4.89,NULL,4.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2009-04-21 09:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9332') +('0063855000020','PPINEAPPLE ORGANIC',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'557','2009-09-09 05:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'9333') +('0063855001101','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9334') +('0063855001111','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9335') +('0063855001112','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9336') +('0063855001115','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9337') +('0063855001116','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9338') +('0063855001117','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9339') +('0063855001118','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9340') +('0063855001158','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12915') +('0063888200007','BLUEBERRIES,WHOLE',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9341') +('0063888200052','CORN,SUPERSWEET',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9342') +('0063888200054','PEAS,GREEN',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9343') +('0063888200055','STRAWBERRIES,WHOLE',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9344') +('0063888200057','RASPBERRIES,RED',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9345') +('0063888200058','CRANBERRIES,WHOLE',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9346') +('0063888200060','CAULIFLOWER STAHLBUSH',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9347') +('0063888200061','SPINACH,CUT',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9348') +('0063888200066','RHUBARB,CUT',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9349') +('0063888200200','PUMPKIN,OG,CANNED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9350') +('0063888200203','SWEET POTATO PUREE OG CANNED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9351') +('0063888200204','PUMPKIN PIE MIX, OG, CANNED',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9352') +('0063888221080','BUTTERNUT SQUASH,DICED',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9353') +('0063900143234','PMANDARIN SATSUMA CASE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1079','2007-09-17 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9354') +('0063900143260','PMANDARIN SATSUMA CASE',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1079','2007-09-17 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9355') +('0063933400001','AM MEXICANNA QUESADILLA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-02-26 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9356') +('0063933400002','AM WILD MUSHROOM QUESADILLA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-02-26 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9357') +('0063933400003','AM SPINACH & GOAT CHEESE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9358') +('0063933400011','AM CHICKEN QUESADILLA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','2','0','0',0,'0','2008-03-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9359') +('0063933400047','AM FOUR CHEESE QUESADILLA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','2','0','0',0,'0','2008-03-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9360') +('0063933400306','AUTHENTICO PORK CARNITAS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9361') +('0063933400466','AM BEEF QUESADILLA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','2','0','0',0,'0','2008-03-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9362') +('0064109610230','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9363') +('0064109610448','PBERRY RASPBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9364') +('0064188910000','NATURAL WOMAN PROGEST CREAM',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9365') +('0064210222736','PMUSHROOM SHIITAKE PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'963','2009-01-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9366') +('0064210250959','PMUSHROOM CRIMINI PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'957','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9367') +('0064210252231','PMUSHROOM PORTABELLA SLICED',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9368') +('0064210263060','PMUSHROOM PORTABELLA PKG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'649','2009-02-10 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9369') +('0064210272761','PMUSHROOM WHITE PINT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'510','2009-07-01 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9370') +('0064259192998','ACRES MAGAZINE',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-06-29 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9371') +('0064595182120','LIFE FLO METAL X BOTTLE 30 CT',24.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-03-24 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9372') +('0064601100102','SINU CLEANSE PLASTIC NETI',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-11-26 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9373') +('0064612733818','PONION PEARL RED NON-O',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9374') +('0064850501500','OLIVE OIL,EXTRA VIRGIN',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9375') +('0064850503500','OLIVE OIL OG 500ML LUCINI',20.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9376') +('0064850512250','VNGRT,RST HZLNUT & EVOO',6.15,'0',0.00,'0',4.49,NULL,4.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','173','0','0','1','0',0,'0','2009-02-26 10:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9377') +('0064850513250','VNGRT,BOLD PARM & GARLIC',6.15,'0',0.00,'0',4.49,NULL,4.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','173','0','0','1','0',0,'0','2009-02-26 10:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9378') +('0064850514250','VNGRT,CUCUMBER & SHALLOT',6.15,'0',0.00,'0',4.49,NULL,4.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','173','0','0','1','0',0,'0','2009-02-26 10:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9379') +('0064850550720','PASTA SCE, RUSTIC TOMATO BASIL',8.89,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9380') +('0064850550721','PASTA SCE, SPICY TUSCAN TOMATO',8.89,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9381') +('0064850555721','PASTA SCE, OLIVE & WILD CAPER',8.89,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9382') +('0064924183813','FINE GRAIN SHAKER HIMALA 6OZ',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9383') +('0064943190115','PPOTATO BAG YUKON 5#',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9384') +('0064981500000','GLEE GUM PEPPERMINT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9385') +('0064981500001','CHEWING GUM,TANGERINE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9386') +('0064981500002','CHEWING GUM,CINNAMON',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9387') +('0064981500010','CHEWING GUM,BUBBLE GUM',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9388') +('0064981500011','CHEWING GUM,SPEARMINT',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9389') +('0065063737400','FRZ POPS GRP CHER',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9390') +('0065063737401','FRZ POPS,STRWBRY&SR APPL',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'499','2009-04-15 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9391') +('0065112400112','LIQUID FENCE',17.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9392') +('0065117006501','FRENCH VANILLA, FLAVORGANICS',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'9393') +('0065117006502','FLAVOR SYRUP HAZELNUT',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'9394') +('0065117006506','CARAMEL, FLAVORGANICS',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','239','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'9395') +('0065153806701','TEA BTL OF GREEN MINT HONEY',1.65,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','189','0','1','1','0',0,'1611','2009-06-26 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9397') +('0065153806702','TEA BTL OG LMN LIME UNSW',1.65,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','189','0','1','1','0',0,'1611','2009-06-26 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9398') +('0065153806703','TEA BTL OG RASPBERRY',1.65,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','189','0','1','1','0',0,'1611','2009-06-26 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9399') +('0065153806708','TEA BTL OG LEMONADE 50/50',1.65,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','189','0','1','1','0',0,'1611','2009-06-26 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9400') +('0065286542111','HIM INST ECO NETI POT',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2009-04-29 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9401') +('0065286560004','HIM INST NETI WASH W ZINC 20Z',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-08-17 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9402') +('0065286560006','NETIPOT SALT',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-08-17 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9403') +('0065286560012','HIM INST NETI WASH W ZINC 4 OZ',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-12-12 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9404') +('0065286560023','HIM INST NETI WASH 2 OZ',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-08-17 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9405') +('0065322812321','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9406') +('0065322863008','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9407') +('0065322867576','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9408') +('0065354200012','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9409') +('0065357102233','PCHERRY RAINIER 1-pound',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'499','2009-06-04 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9410') +('0065357111111','PAPPLE BAGGED FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9411') +('0065357111112','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9412') +('0065357111211','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9413') +('0065357111212','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9414') +('0065357111611','PAPPLE BAG GDELICIOU',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9415') +('0065357111811','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9416') +('0065357111911','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9417') +('0065357111912','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9418') +('0065357112211','PAPPLE BAG CAMEO',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','0',0,'550','2007-09-09 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9419') +('0065357112911','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9420') +('0065357121111','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9421') +('0065357121112','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9422') +('0065357121211','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9423') +('0065357121311','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9424') +('0065357121312','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9425') +('0065357131111','PAPPLE BAGGED JONAGO',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9426') +('0065357132111','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9427') +('0065357132211','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9428') +('0065357132311','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9429') +('0065357132312','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9430') +('0065357132322','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9431') +('0065357132411','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9432') +('0065357132511','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9433') +('0065357132611','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9434') +('0065357142110','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9435') +('0065357142111','PBERRY BLUE 1/2 PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9436') +('0065357142211','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9437') +('0065357151111','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9438') +('0065419700002','PEST CONTROL, NON-TOXIC',10.65,'0',0.00,'0',5.99,'0',5.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-03-05 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9439') +('0065474933113','CREAM SHAVE,ALOE UNSCENTD',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9440') +('0065474935100','SHAMPOO,LAVENDER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9441') +('0065474935105','SHAMPOO, LEMON',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9443') +('0065474935110','SHAMPOO,ROSEMARY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9445') +('0065474935117','SHAMP,TEA TREE TREATMNT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9446') +('0065474935150','CONDITIONER,LAVENDER',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9448') +('0065474935155','CONDITIONER,LEMON',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9450') +('0065474935160','CONDITIONER,ROSEMARY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9452') +('0065474935167','COND,TEA TREE TREATMNT',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9453') +('0065474935169','AVALON CONDITIONER OLIVE GSEED',8.99,'0',0.00,'0',6.25,'0',6.25,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2009-07-08 01:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9454') +('0065474935200','LOTION,LAVENDER',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9456') +('0065474935208','LOTION,PEPPERMINT',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9457') +('0065474935210','LOTION,ROSEMARY',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9458') +('0065474935217','LTN,UNSCENTED',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9459') +('0065474935310','DAILY MSTRZR,LAVENDER',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9461') +('0065474935315','ULT MOIST CREAM,LAVENDER',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9462') +('0065474935430','LIQ SOAP,LAVENDER',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9463') +('0065474935435','LIQ SOAP,LEMON VERBENA',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9464') +('0065474935438','LIQ SOAP,PEPPERMINT',7.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9465') +('0065474935800','CO-Q-10,WRINKLE SERUM',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9466') +('0065474935805','CO-Q-10,WRINKLE CREAM',23.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9467') +('0065474935811','CO-Q-10,FACIAL TONER',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9468') +('0065474935812','CO-Q-10,FACE CLNSE CREAM',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9469') +('0065474945380','VIT C,FACIAL SERUM',22.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9470') +('0065474945383','VIT C,RENEWAL CREAM',19.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9471') +('0065474945387','VIT C,FACIAL TONER',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9472') +('0065474945388','VIT C,FACE CLEANER',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9473') +('0065484481025','KEFIR,OG,RASPBERRY',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9474') +('0065484481051','KEFIR,OG,VANILLA',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9475') +('0065484481062','KEFIR,OG,PLAIN',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9476') +('0065484481078','KEFIR,OG,STRAWBERRY',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9477') +('0065484481087','KEFIR,OG,PEACH',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9478') +('0065498994010','SOYNUT BUTTER, CRMY W/ HONEY',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9479') +('0065527200001','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9480') +('0065657111211','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9481') +('0065722700033','WATER, ELECTROLYTE ENHANCED 1L',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9482') +('0065762211851','TEA,BTL,OG,MANGO WHITE',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1516','2007-07-20 08:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9483') +('0065762221294','TEA,BTL,OG,MOROCCAN MINT',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1516','2007-07-20 08:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9485') +('0065762230175','TEA OG SUBLIME MATE',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1516','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9486') +('0065762241751','TEA BTL OG POM GOJI',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1516','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9487') +('0065762242105','KIDS DRINK OG TROPICAL PUNCH',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1606','2007-07-25 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9488') +('0065762250204','KIDS DRINK OG BERRY LEMONADE',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1606','2007-07-25 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9489') +('0065762251500','TEA,BTL,OG,PEACH',1.55,'0',0.00,'0',0.99,'0',0.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','189','0','1','1','0',0,'1516','2007-07-20 08:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9490') +('0065762251597','KIDS DRINK OG GOODNESS GRAPE',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1606','2007-07-25 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9491') +('0065762251680','TEA,BTL,OG,LORI',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1516','2007-07-20 08:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9492') +('0065762263057','TEA,PET,OG,JUST GRN,UNSWT',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'499','2009-08-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9493') +('0065762271450','TEA, BTL, OG, JUST BLK, UNSWT',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','0','1','0',0,'1516','2008-04-08 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9494') +('0065762272374','TEA,OG,PEACH OO LA LONG 64Z',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'499','2009-08-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9495') +('0065762273104','TEA, PET, OG MANGO WHITE',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2007-11-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9496') +('0065762281692','TEA,BTL,OG,BLK FRST BERRY',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1516','2007-07-20 08:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9497') +('0065833473663','PENNE&CHREESE,OG,BR,GF,DF',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9498') +('0065833474355','SHELL & CHREESE,OG,DF',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9499') +('0065856423051','MINTWATER CHOCOLATE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9500') +('0065856423055','MINTWATER PEPPERMINT',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9501') +('0065856423056','MINTWATER SPEARMINT',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9502') +('0065856423057','MINTWATER ORANGE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9503') +('0065856423058','MINTWATER LEMON',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9504') +('0065900040000','LA PANZ ROSEMARY',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9505') +('0065900040001','LA PANZ FENNEL',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9506') +('0065900040002','LA PANZ SESAME',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9507') +('0065900040003','LA PANZ BLACK PEPPER',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9508') +('0065900040004','LA PANZ ORIGINAL',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9509') +('0065900040005','LA PANZ GARLIC',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-16 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9510') +('0065900040008','LA PANZ WHOLE WHEAT',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-03-18 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9511') +('0065916550400','PBERRY BLACKBERRY PT',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9512') +('0065920110201','POLENTA,OG,TRADITIONAL 18 OZ',3.65,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','163','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9513') +('0065965005001','CHEESE CURDS CAJUN EICHTENS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-03-21 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9514') +('0065967001101','PE ONE N ONLY 30 CT',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-11 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9515') +('0065967003001','PURE ESSENCE CAL IONIC FIZZ',21.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9516') +('0065967003003','PE IONIC FIZZ CALCIUM SNG',0.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9517') +('0065967003004','PE IONIC FIZZ CAL 30 CT',26.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9518') +('0065967003101','PE IONIC FIZZ MAGNESIUM',20.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9519') +('0065967003103','PE IONIC FIZZ MAG SNG',0.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9520') +('0065967003104','PE IONIC FIZZ MAG 30 CT',25.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9521') +('0065967004001','PURE ESSENCE CAL FIZZ W VIT D',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-04-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9522') +('0065967028021','PE IMMUNE CELLULAR SUPPRT 60CT',30.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-10-29 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9523') +('0066048423101','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9524') +('0066048423106','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9525') +('0066117601002','HAIR COLOR,3N,DK CHESTNUT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9526') +('0066117601003','HAIR COLOR,5N,LT CHESTNUT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9527') +('0066117601004','HAIR COLOR,6N,DARK BLONDE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9528') +('0066117601005','HAIR COLOR,7N,HZLNUT BLND',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9529') +('0066117601007','NATURTINT 9N HNY BLNDE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9530') +('0066117601009','HAIR COLOR,5G,LT GLDN CHS',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9531') +('0066117601011','NATURTINT 7G GLDN BLNDE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9532') +('0066117601012','NATURTINT 8G SNDY GLDN BLND',16.99,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9533') +('0066117601013','NATURTINT 4M MHGNY CHEST',16.99,'0',0.00,'0',9.99,'0',9.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9534') +('0066117601015','NATURTINT 7M MHGNY BLND',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9535') +('0066117601017','NATURTINT 8C COPPER BLND',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9536') +('0066117601020','NATURTINT 10A ASH BLNDE',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9537') +('0066117601090','HAIR COLOR,4N,NATL CHSTNT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9538') +('0066117601093','NATURTINT 5C LT CPR CHSTN',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9539') +('0066216620085','PCRANBERRIES',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9540') +('0066437260006','YOGURT STYLE,LEMON',1.25,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9541') +('0066437260008','YOGURT STYLE,BLUEBERRY',1.25,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9542') +('0066437260022','YOGURT STYLE,MIXED BERRY',1.25,'0',0.00,'0',0.79,NULL,0.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9543') +('0066466390000','PEACE POUND GUATEMALAN DARK',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-05-20 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'9544') +('0066529000118','PBERRY RASPBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9545') +('0066529005040','PBERRY BLUEBERRY NON-O PINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9546') +('0066529100301','KASSERI',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-04-03 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9547') +('0066529100750','Mt Vikos Artichoke Spread',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','0','0',0,'0','2007-05-31 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9548') +('0066529100780','Mt Vikos Red Pep Feta Spread',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-31 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9549') +('0066529100925','SWEET OLIVE SPREAD',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-30 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9550') +('0066529100945','Mt VIKOS APRICOT and FIGS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-26 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9551') +('0066529100955','Mt VIKOS ROASTED FIGS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-26 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9552') +('0066529100965','FIG HAZELNUT SPREAD MT VIKOS',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-03-15 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9553') +('0066559600901','CHOCOLATE CHUNK COOKIE DOUGH',4.19,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','34','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9554') +('0066559600903','COOKIE DGH,OG,VAN SUGAR',4.19,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','34','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9556') +('0066559600905','COOKIE DGH,OG,PEANUT B',4.19,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','34','0','0','1','0',0,'499','2009-08-14 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9557') +('0066559601001','BISCUIT, BUTTERMILK, NTRL',4.19,'0',0.00,'0',3.59,'0',3.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','34','0','0','1','0',0,'0','2009-08-13 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','2',0.00,'0','12751') +('0066601644400','SESAME BAR,OG,DATE SYRUP',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9558') +('0066601644410','SESAME BAR,OG,MOLASSES',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9559') +('0066601644440','SESAME BAR,OG,DATE FENNEL',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9560') +('0066624800138','HERBAVITA HAIR LIGHTENER',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2006-05-25 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9561') +('0066624800302','FLASH FASHION CRIMSON',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2006-09-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9562') +('0066624800306','FLASH FASHION ORANGE',13.99,'0',0.00,'0',9.99,'0',9.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2006-09-11 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9565') +('0066684003980','PCARAMEL APPLE NON-O',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','1','1','0',0,'1051','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9566') +('0066726277106','SUNERGIA SOY FETA LEMON OREGAN',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-10-06 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9567') +('0066726277206','SUNERGIA SOY FETA TOM BASIL',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-09-23 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9568') +('0066726277306','SOY BLEU SUNERGIA',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2008-04-24 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9569') +('0066738300203','NOURISH CASTILLE WILD GREENS',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-01 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9571') +('0066738300219','NOURISH DEOD CITRUS',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9572') +('0066738300220','NOURISH DEOD WILD GREENS',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9573') +('0066763430016','ATMOSKLEAR NO ODOR',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-11-20 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9574') +('0066779623001','PBERRY CRANBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9575') +('0066779690001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9576') +('0066779690102','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9577') +('0067048020110','GASTRO',25.89,'0',0.00,'0',20.69,'0',20.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-05-06 10:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9578') +('0067048020120','EZYMEDICA REPAIR 60 CT',31.45,'0',0.00,'0',25.15,'0',25.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9579') +('0067048020140','Candidase',25.89,'0',0.00,'0',20.69,'0',20.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9580') +('0067048020211','Digest Gold',24.95,'0',0.00,'0',19.95,'0',19.95,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9581') +('0067048024110','ENZYMEDICA MUCOSTOP 48CT',29.59,'0',0.00,'0',23.65,'0',23.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-01-22 08:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9583') +('0067048024120','Lacto',19.45,'0',0.00,'0',15.55,'0',15.55,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9584') +('0067048024140','ENZYMEDICA ALLERASE 60 CT',22.19,'0',0.00,'0',17.75,'0',17.75,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9585') +('0067048026200','ENZYMEDICA GLUTEN EASE 60CT',26.85,'0',0.00,'0',21.45,'0',21.45,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9586') +('0067048029100','ENZYMEDICA PH BASIC 90 CT',26.79,'0',0.00,'0',21.39,'0',21.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-04-20 01:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9587') +('0067048029110','ENZYMEDICA DIGEST GOLD PROBIO',27.75,'0',0.00,'0',22.20,'0',22.20,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-08-27 12:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1','0','5',0.00,'0','12818') +('0067048098111','Digest 90',24.99,'0',0.00,'0',19.99,'0',19.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9588') +('0067048098120','ENZYMEDICA ACID SOOTHE 90CT',22.19,'0',0.00,'0',17.75,'0',17.75,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9589') +('0067048098121','ACID SOOTHE 30CT',7.85,'0',0.00,'0',6.25,'0',6.25,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9590') +('0067048098141','ENZYMEDICA VIRASTOP 60 CT',25.89,'0',0.00,'0',20.69,'0',20.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2008-06-12 09:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9591') +('0067076412363','TORT CHIP, OG YELLOW HY-LYSINE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'499','2009-07-17 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9592') +('0067076412370','TORTILLA CHIP OG BLUE CORN',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-04-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9593') +('0067170423779','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9594') +('0067195900001','CORN THINS, ORIGINAL',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9595') +('0067195900004','CORN THINS, SESAME',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9596') +('0067474910018','DEEP STEEP SOAP TANG MELON',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2007-04-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9600') +('0067474910020','DEEP STEEP SOAP HONDEW SPEAR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2007-04-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9602') +('0067474910041','DSTEEP BODY WASH UNSCENTED',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9603') +('0067474910045','DSTEEP HAND WASH HONSPEAR 9 OZ',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9604') +('0067474910048','DSTEEP HAND WASH TANGMEL 9 OZ',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9605') +('0067616400001','PGRAPE CHAMPAGNE 1#',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','551','0','0','1','0',0,'737','2009-08-25 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9606') +('0067740620008','PBERRY CRANBERRY 8OZ',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9607') +('0067852301040','WAFERS, CHOC COATED CHOC',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9608') +('0067852301042','WAFERS, CHOC COATED VANILLA',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9609') +('0067852301062','PIZZA,DUO CHEESE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9610') +('0067852301071','PIZZA,SPINACH & FETA',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9611') +('0067852301075','GLUTINO PENNE ALFREDO',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-10-18 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9612') +('0067852301091','CHICKEN POMODORO W/BR RC',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9613') +('0067852301095','GLUTINO CHICKEN PAD THAI',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-10-18 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9614') +('0067852301097','CHICKEN PENNE ALFREDO',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-03 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9615') +('0067852303000','CORN BREAD,PREMIUM',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9616') +('0067852303059','BAGELS POPPYSEED GLUTINO',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9617') +('0067852303100','PIZZA CRUSTS,PREMIUM',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9618') +('0067852303200','BREAD,FIBER,PREMIUM',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9619') +('0067852303600','BREAD,FLAX SEED,PREMIUM',5.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-14 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9620') +('0067852303844','CRACKERS, CHEDDAR',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-09-15 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9621') +('0067852303850','CRACKERS, GLUTEN FREE',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-14 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9622') +('0067852304006','PRETZELS,FAMILY BAG',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9623') +('0067852337548','MUFFINS ENGLIST GLUTINO',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9624') +('0067880900005','LAKESHORE ICE',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','46','0','0','1','0',0,'0','2008-08-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9625') +('0067880900010','10# BLOCK ICE',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','46','0','0','1','0',0,'0','2008-08-15 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9626') +('0067880900020','20# BAGGED ICE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','46','0','0','1','0',0,'0','2008-06-03 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9627') +('0067888067058','AZIDA FACE BODY SCRUB 8 OZ',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9628') +('0067888067061','AZIDA EYE FACE CREAM 1 OZ',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9629') +('0067990900001','LUMINA CELL FOOD',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9631') +('0067990900002','CELL FOOD OXYGEN GEL 2 OZ',31.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9632') +('0067990900003','CELLFOOD SILICA',34.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9633') +('0068031488096','MV YUBA POCKET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','2','0','0',0,'0','2008-03-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9635') +('0068031488801','MV SUSHI ROLL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9636') +('0068031488802','MV BENTON BOX',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9637') +('0068031488803','MV MACRO BENTO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9638') +('0068031488804','MV BROWN RICE W/MIXED VEG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9639') +('0068031488805','MV SESAME NOODLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9640') +('0068031488808','MV ARTICHOKE SPINACH NOODLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-04-15 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9641') +('0068031488809','MV TOKYO BUCKWHEAT SOBA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9642') +('0068031488816','MV PEKING DUCK',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9643') +('0068031488837','MV SEAWEED SALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9644') +('0068031488860','MV BUCKWHEAT NOODLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9645') +('0068031488882','MV SOY-TEIN W/SPINACH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9646') +('0068031488883','MV VEGGIE LOMEIN',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9647') +('0068031488884','MV SHANGHAI DUMPLING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','2','0','0',0,'0','2008-03-12 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9648') +('0068031488888','MV MACRO SUSHI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9649') +('0068031488889','MV VEGAN DUMPLING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9650') +('0068031488890','MV SPELT SHUSI',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9651') +('0068031488891','MV HUNNAN DUMPLING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9652') +('0068031488897','MV MALAYSIAN ARTICHOKE NOODLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-12 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9653') +('0068031488899','MV PAD THAI NOODLE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','64','0','0','1','0',0,'0','2008-03-11 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9654') +('0068069210108','GREEN TEA,MONKEY KING',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9655') +('0068069210109','GREEN TEA OG GUNPOWDER',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-02-26 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9656') +('0068069210110','ASST TEA,NUMI COLLECTION 18 BA',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9657') +('0068069210240','WHITE TEA,OG,MNLGT,SPC,OR 16 B',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9658') +('0068247600020','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9659') +('0068247600021','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9660') +('0068528533319','FRUIT BARS, OG, POM BERRY',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-01-14 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9661') +('0068582533305','FRUIT BARS,OG,COCONUT',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9662') +('0068582533307','FRUIT BARS,OG,RASPBERRY',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9663') +('0068582533308','FRUIT BARS,OG,STRAWBERRY',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9664') +('0068582533312','FRUIT BAR MANGO',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9665') +('0068690444065','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9666') +('0068693612032','NONI JUICE',40.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9667') +('0068693619032','TAHITI TRADERS ORG ACAI 32OZ',42.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-15 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9668') +('0068747600020','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9669') +('0068891400056','PONION PEARL WHITE NON-O',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-06 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9670') +('0068891400057','PONION PEARL YELLOW NON-O',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-06 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9671') +('0068891400058','PONION PEARL RED NON-O',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-06 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9672') +('0068907602699','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9673') +('0068907608435','HIGH COUNTRY GOJI KOMBUCHA',3.29,'0',0.00,'0',2.79,'0',2.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2009-09-17 10:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','2',0.00,'0','12919') +('0068907612495','HIGH COUNTRY WLD ROOT KOMBUCHA',3.29,'0',0.00,'0',2.79,'0',2.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2009-09-17 10:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','2',0.00,'0','12920') +('0068907616882','BLUE CHICO BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-31 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9674') +('0068907618284','MARSHMALLOWS SWEET & SARA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-06-26 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9675') +('0068907626792','HIGH COUNTRY GINGER KOMBUCHA',3.29,'0',0.00,'0',2.79,'0',2.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2009-09-17 10:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','2',0.00,'0','12918') +('0068907628199','HIGH COUNTRY ALOE KOMBUCHA',3.29,'0',0.00,'0',2.79,'0',2.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2009-09-17 10:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','2',0.00,'0','12917') +('0068907670042','PARMA VEGAN PARMESAN 3oz',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-10-29 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9676') +('0068907670062','Parma Chipotle Cayenne 3.5 oz.',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','232','0','0','1','0',0,'0','2007-10-30 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9677') +('0068954400173','FAGE 0% 17.6 OZ. YOGURT',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-06-04 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9678') +('0068954408000','FAGE YOGURT 0% 5.3Z',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2006-09-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9679') +('0068954408020','FAGE YOGURT 2% 7OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2007-04-30 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9680') +('0068954408200','FAGE YOGURT 17.6Z',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9681') +('0068954408301','FAGE O% YGRT 35.3OZ',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-09-11 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12872') +('0068954408340','FAGE, TOTAL GRK YGRT 2% 17.6OZ',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9682') +('0069054520774','PPOTATO FINGERLING BAG BUTTERC',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2009-05-30 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9683') +('0069054591533','PPOTATO FINGERLING BAG BUTTERC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9684') +('0069054591544','PPOTATO FINGERLING BAG RUBY CR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9685') +('0069054591555','PPOTATO FINGERLING BAG',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2009-03-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9686') +('0069054591566','PPOTATO FINGERLING BAG RUSSIAN',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2009-03-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9687') +('0069054592033','PPOTATO FINGERLING BAG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9688') +('0069054592044','PPOTATO FINGERLING BAG RUBY CR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9689') +('0069054592077','PPOTATO FINGERLING BAG BUTTERC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'835','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9690') +('0069112416299','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9691') +('0069112431001','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9692') +('0069112431007','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9693') +('0069112488199','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9694') +('0069174300420','SAUCE,SMOKEY SERRANO',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9695') +('0069174300430','SAUCE HARRYS HABANERO',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2007-06-04 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9696') +('0069275210005','HEMP PROTEIN POWDER 16 OZ.',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9697') +('0069275210006','NUTIVA HEMPSHAKE CHOC',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-09-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9698') +('0069275220001','COCONUT OIL,OG',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2007-12-10 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9700') +('0069275220002','COCONUT OIL,OG',21.59,'0',0.00,'0',14.99,NULL,14.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9701') +('0069275220005','COCONUT OIL, OG',32.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9702') +('0069323999001','Lemonaise 12 OZ',3.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9703') +('0069706859012','MATTS OJ WITH PULP',7.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2007-04-24 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9704') +('0069706859013','MATTS OJ WITH CALCIUM',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2007-04-24 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9705') +('0069899780910','UDIS GF WHITE BREAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-09-23 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12980') +('0069899780916','UDIS GF WHOLE GRAIN BREAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-09-11 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12873') +('0069932311231','STICKNEY HILLS CHEVRE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-05-06 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9706') +('0069932311322','STICKNEY HONEY CHEVRE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9707') +('0069932311323','STICKNEY PUMPKIN SPICE CHEVRE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9708') +('0070052210132','TABLET SPLITTER CRUSHER',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9709') +('0070052210231','POCKET-PACK',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-17 08:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9710') +('0070122821500','TRIBECA FRENCH BAGUETTE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-17 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9711') +('0070122823520','TRIBECA CIABATTA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2007-10-17 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9712') +('0070161910010','CHAMOMILE CALM',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9713') +('0070161910020','CHERRY BARK BLEND',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9714') +('0070161910070','GUM-OMILE',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9715') +('0070161910075','HOREHOUND BLEND',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9716') +('0070161910095','TEMP ASSURE',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9717') +('0070161910100','SWEET ECHINACEA',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9718') +('0070161910135','VI PROTECTION BLEND',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-03-19 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9719') +('0070161910145','WILLOW/GARLIC OIL',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9720') +('0070161910720','HERBS4KIDS ELDERBERRY SYRUP',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9721') +('0070164801011','NATURAL ENERGY DRINK, GURU',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9722') +('0070167110001','WATER,LIGHTLY EFFERV 33.8 SANF',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2008-08-06 02:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9723') +('0070277290985','FETA ATHENOS REDUCED FAT',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-08-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9724') +('0070469409005','EARTH THER GARD HAND REPAIR',9.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-05-08 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9725') +('0070535772551','CRANBERRY NECK WRAP',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-24 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12986') +('0070535772552','SAGE NECK WRAP',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-24 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12987') +('0070535772555','SAGE EYE MASK',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-17 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12939') +('0070535772556','CRANBERRY EYE MASK',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-17 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12940') +('0070535772730','MAGENTA NECK WRAP',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9727') +('0070535772731','BROWN NECK WRAP',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9728') +('0070535772732','AQUA NECK WRAP',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9729') +('0070535772740','MAGENTA EYE MASK',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9730') +('0070535772741','BROWN EYE MASK',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9731') +('0070569235500','NATURALCARE SLEEPFIX',22.15,'0',0.00,'0',14.39,'0',14.39,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','101','0','1','0','0',0,'0','2006-07-12 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9732') +('0070576600701','THERA CANE',37.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'9733') +('0070587500004','FLAX OIL BARLEANS 8 OZ.',11.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','0','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9734') +('0070587500005','BARLEANS FLAX OIL HI LIG 12 OZ',17.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','0','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9735') +('0070587500015','BARLEANS ESSENTIAL WOMAN 12OZ',30.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9736') +('0070587500016','FLAX OIL BARLEANS 16',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9737') +('0070587500026','BARLEANS OMEGASWIRL STRBAN16OZ',24.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9738') +('0070587500277','BARLEANS OMEGA SWIRL BLUEPOM',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9739') +('0070587510007','FLAX OIL CAP BARLEANS 100 CT',12.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9740') +('0070587510013','BARLEANS ESSENTIAL WOMAN CAPS',31.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9741') +('0070587510016','FORTIFLAX BARLEANS GROUND16 0Z',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9742') +('0070587560004','BARLEANS OMEGASWIRL LEM 16 OZ',29.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9743') +('0070587570000','BARLEANS OLIVE LEAF 8 OZ',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9744') +('0070617300101','LAUNDRY POWDER',14.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9745') +('0070617300501','MUSTARD,OG,STONEGRND GLS',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9746') +('0070617300503','MUSTARD,OG,DIJON GLS',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9747') +('0070617300504','MUSTARD,OG,YELLOW SQZ',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9748') +('0070617301221','MED. BLACK OLIVES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9749') +('0070617301222','OLIVES,BLACK,XLG,PITTED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9750') +('0070617301224','OLIVES,BLACK,SLICED 2.5 OZ',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9751') +('0070617301241','CHILIS, DICED GREEN',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'mixmatchcode','2009-02-09 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9752') +('0070617301242','GREEN CHILIES, WHOLE',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-11-27 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9753') +('0070617302013','SANDWICH BAGS,RECLOSABLE',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-01-22 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9754') +('0070617302014','STORAGE BAGS,GAL,RECLSBLE',2.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9755') +('0070617302015','STORAGE BAGS, QT, RCLSABLE',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-04-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9756') +('0070617302016','TALL KITCHEN BAG, DRWSTRING',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-04-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9757') +('0070617310002','SPONGES, COMPRESSED',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-10-06 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9758') +('0070617310003','SPONGES, GENTLE SCRUBBER',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-10-06 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9759') +('0070617310005','WAXED PAPER',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9760') +('0070617310006','WAXED PAPER BAGS',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9761') +('0070617310007','SCRUBBER SPONGE',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-10-06 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9762') +('0070617310009','SPONGES',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-10-06 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9763') +('0070619500013','OWH ECH GOLD W VIT C 90CT',17.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9764') +('0070619500019','OWH MILK THISTLE',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9765') +('0070619500031','OWH CLOVES',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9766') +('0070619500032','OWH GARLIC',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9767') +('0070619500041','OWH WORMWOOD',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9768') +('0070619500048','OWH VALERIAN',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9770') +('0070619500052','OWH GINGER',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9771') +('0070619500053','OWH SAW PALMETTO',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2006-02-07 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9772') +('0070619500056','OWH DONG QUAI',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9773') +('0070619500057','OWH ECHINACEA w c and Zinc',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-26 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9774') +('0070619500085','OWH MILK TH/DAND.',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9775') +('0070619500087','OWH FENUGREEK',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9776') +('0070619500090','OWH ASHWAGANDHA 90 CT',17.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-06 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9777') +('0070619500091','OWH OLIVE LEAF',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9778') +('0070619500095','OWH ECHINACEA',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9779') +('0070619500405','OWH ALLER-AID',20.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9780') +('0070619500408','OWH MUSCLE RELAX',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9781') +('0070619500410','OWH TUMERIC',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9782') +('0070619500415','OWH RHODIOLA',16.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9783') +('0070619500416','OWH CRANBERRY',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9784') +('0070619500418','OWH ASTRAGALUS',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2005-11-10 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9785') +('0070619500421','OWH SKULLCAP',11.99,'0',0.00,'0',7.65,'0',7.65,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9786') +('0070619500422','OWH SLIPPERY ELM',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-12-27 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9787') +('0070619500423','OWH GINKGO',18.49,'0',0.00,'0',11.99,'0',11.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','102','0','1','0','0',0,'0','2007-01-19 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9788') +('0070619500428','OWH KAVA',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9789') +('0070619500441','OWH MACA ROOT 90 CT',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-03-06 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9790') +('0070619500443','OWH GREEN TEA 90CT',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-08-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12752') +('0070619501101','OWH CALENDULA TEA TREE SALVE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-07-18 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9791') +('0070620088018','MHEMP SPEARMNT VEGAN LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9792') +('0070620088019','MHEMP ORG PEPP LIP BALM',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2008-10-31 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9793') +('0070620088901','MERRY HEMPSTERS COOL HEMP RUB',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2006-08-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9794') +('0070620088903','HEMP CUT',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2005-06-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9795') +('0070648003133','HANS CHORIZO SAUSAGE',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'2505','2009-07-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'9803') +('0070679203051','PPEPPER MINI-SWEET CLAMSHELL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','0','0',0,'698','2009-09-16 07:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9809') +('0070706006101','Lipstick Starlet',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9810') +('0070706006102','Lipstick Siesta',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9811') +('0070706006103','Lipstick Vegas',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9812') +('0070706006104','Lipstick Allure',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9813') +('0070706006105','Lipstick Sin',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9814') +('0070706006106','Lipstick Siren',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9815') +('0070706006107','Lipstick Sazerac',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9816') +('0070706006108','Lipstick Galaxy',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9817') +('0070706006109','Lipstick Ultra Violet',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9818') +('0070706006110','Lipstick Chocolate Cherry',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9819') +('0070706006111','Lipstick Vino De Amor',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9820') +('0070706006112','Lipstick Lux',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9821') +('0070706006113','Lipstick Indulgence',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9822') +('0070706006114','Lipstick Ultra Suede',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9823') +('0070706006115','Lipstick Icon',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9824') +('0070706006116','Lipstick Beso Beso',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9825') +('0070706006117','Lipstick Uber',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9826') +('0070706006118','Lipstick Truth or Dare',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9827') +('0070706006119','Lipstick Patina',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9828') +('0070706006120','Lipstick Golden Bronze',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9829') +('0070706006121','Lipstick Temptres',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9830') +('0070706006122','Lipstick Femme Fatale',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9831') +('0070706006123','Lipstick Obsession',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9832') +('0070706006124','Lipstick Dollhouse Pink',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9833') +('0070706006201','Oil-Free Liquid Foundation L',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9834') +('0070706006202','Oil-Free Liquid Foundation L',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9835') +('0070706006203','Oil-Free Liquid Foundation L',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9836') +('0070706006204','Oil-Free Liquid Foundation L-',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9837') +('0070706006205','Oil-Free Liquid Foundation L-',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9838') +('0070706006206','Oil-Free Liquid Foundation L-',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9839') +('0070706006207','Oil-Free Liquid Foundation L-',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9840') +('0070706006208','Oil-Free Liquid Foundation L-',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9841') +('0070706006209','Oil-Free Liquid Foundation L-',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9842') +('0070706006301','Dual Powder Foundation D-4',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9843') +('0070706006302','Dual Powder Foundation D-14',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9844') +('0070706006303','Dual Powder Foundation D-28',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9845') +('0070706006304','Dual Powder Foundation D-24',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9846') +('0070706006305','Dual Powder Foundation D-10',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9847') +('0070706006306','Dual Powder Foundation D-7',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9848') +('0070706006307','Dual Powder Foundation D-20',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9849') +('0070706006308','Dual Powder Foundation D-17',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9850') +('0070706006309','Dual Powder Foundation D-32',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9851') +('0070706006401','Blush Samba',17.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9852') +('0070706006402','Blush Haze',17.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9853') +('0070706006403','Blush Nymph',17.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9854') +('0070706006404','Blush Fascination',17.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9855') +('0070706006405','Blush Sunset',17.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9856') +('0070706006406','Blush Bella Donna',17.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9857') +('0070706006501','Eyeshadow Prism',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9858') +('0070706006502','Eyeshadow Platinum',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9859') +('0070706006503','Eyeshadow Skylar',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9860') +('0070706006504','Eyeshadow Angel',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9861') +('0070706006505','Eyeshadow Casino',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9862') +('0070706006506','Eyeshadow Sahara',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9863') +('0070706006507','Eyeshadow Odyssey',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9864') +('0070706006508','Eyeshadow Absinthe',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9865') +('0070706006509','Eyeshadow Dusk',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9866') +('0070706006510','Eyeshadow Eternity',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9867') +('0070706006511','Eyeshadow Espresso',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9868') +('0070706006512','Eyeshadow Chameleon',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9869') +('0070706006513','Eyeshadow Vixen',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9870') +('0070706006514','Eyeshadow Ice Princess',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9871') +('0070706006515','Eyeshadow Gem',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9872') +('0070706006516','Eyeshadow Egyptian Gold',12.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9873') +('0070706006601','Lip Gloss Mischief',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9874') +('0070706006602','Lip Gloss Tempest',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9875') +('0070706006603','Lip Gloss Caliente',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9876') +('0070706006604','Lip Gloss Liquid Bliss',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9877') +('0070706006605','Lip Gloss Luscious',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9878') +('0070706006606','Lip Gloss Divinity',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9879') +('0070706006607','Lip Gloss Crystal',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9880') +('0070706006608','Lip Gloss Dolce Vita',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9881') +('0070706006609','Lip Gloss Mania',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9882') +('0070706006610','Lip Gloss Cosmopolitan',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9883') +('0070706006611','Lip Gloss Bronzite',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9884') +('0070706006612','Lip Gloss Tango',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9885') +('0070706006701','Concealer C-10',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9886') +('0070706006702','Concealer C-14',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9887') +('0070706006703','Concealer C-3',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9888') +('0070706006704','Concealer C-7',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9889') +('0070706006801','Mascara Onyx',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9890') +('0070706006802','Mascara Espresso',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9891') +('0070706006803','Mascara Navy',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9892') +('0070706006901','Eyeliner Indigo',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9893') +('0070706006902','Eyeliner Leaf',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9894') +('0070706006903','Eyeliner Iguana',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9895') +('0070706006904','Eyeliner Tobacco',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9896') +('0070706006905','Eyeliner Obsidian',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9897') +('0070706006906','Eyeliner South Pacific',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9898') +('0070706006907','Eyeliner Slate',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9899') +('0070706006908','Eyeliner Ocean',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9900') +('0070706006912','Lipliner Port',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9901') +('0070706006913','Lipliner Fraise',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9902') +('0070706006914','Lipliner Innocence',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9903') +('0070706006915','Lipliner Cappuccino',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9904') +('0070706006916','Lipliner Hazelnut',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9905') +('0070706006917','Lipliner Terra Cotta',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9906') +('0070706006918','Lipliner Bounce',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9907') +('0070706006919','Lipliner Cherry',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9908') +('0070706075702','Mascara Black',12.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9909') +('0070706075703','Mascara Black/Brown',12.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9910') +('0070706096701','CKN ORANGE SHAMPOO',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9911') +('0070706096702','CKN BANANA DETANGLER',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9912') +('0070706096703','CKN GERM BUSTING SOAP',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9913') +('0070706096704','CKN BUBBLE BATH',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-02-27 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'9914') +('0070708213032','CHAI CONC,SLIGHT SWT',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1585','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9916') +('0070708240032','CHAI CONC,HERBL DECAF',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1585','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9917') +('0070708250032','CHAI CONC,KASHMIR GREEN',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'1585','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9918') +('0070708270008','CHAI LATTE MIX,ORIG',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9919') +('0070708271008','CHAI LATTE MIX,SPC ORIG',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9920') +('0070708273008','CHAI LATTE MIX,DECAF 8 CT',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9921') +('0070714752074','PFLOWERS HEATHER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9922') +('0070816310816','POTATO CHIPS,TOTALLY NATL',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-17 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9923') +('0070816310817','POTATO CHIPS,MALT VINEGAR',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-17 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9924') +('0070816310818','POTATO CHIPS,BBQ 2OZ',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-07-17 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9925') +('0070816310893','CANYON CUT, SCRM CHIV KRNK',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9926') +('0070816311001','KETTLE CHIP SPNCHARTICHOKE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9927') +('0070816321105','POTATO CHIPS,HICKORY BBQ',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9928') +('0070816321405','POTATO CHIPS,PARMESN GRLC',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9929') +('0070816395005','POTATO CHIP,LF,ORIGINAL',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9930') +('0070816397205','POTATO CHIPS,MALT VINEGAR',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9931') +('0070816398105','POTATO CHIPS,JALPNO CHED',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1566','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9932') +('0070840631311','JUICE,APPLE CARROT BL 3PK',3.29,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9933') +('0070840631312','JUICE,ORANGE VEGGIE BL 3PK',3.29,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9934') +('0070840631314','JUICE,BERRY VEGGIE 3PK',3.29,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9935') +('0070840631315','JUICE, TROPICAL BLEND 3PK',3.29,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9936') +('0070840631711','JUICE,APPLE CARROT BL 32OZ',3.35,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9937') +('0070840631712','JUICE,ORANGE VEGGIE BL 32OZ',3.35,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9938') +('0070840631714','JUICE,BERRY VEGGIE BL 32OZ',3.35,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9939') +('0070840631715','JUICE, TROPICAL BLEND 32OZ',3.35,'0',0.00,'0',2.29,NULL,2.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'1587','2008-08-15 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9940') +('0070865610000','CHOCOLATE,OG,DARK',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9941') +('0070865610001','CHOCOLATE OG MILK',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9942') +('0070865610002','CHOCOLATE,OG,MAYA GOLD',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9943') +('0070865610003','CHOCOLATE OG WHITE',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9944') +('0070865610004','CHOCOLATE,OG,HZLNUT CURNT',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9945') +('0070865610007','CHOCOLATE OG ALMOND',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9946') +('0070865610010','CHOCOLATE,OG,MILK W/CARML',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9948') +('0070865610016','CHOCOLATE OG ESPRESSO',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9949') +('0070865610022','CHOCOLATE OG DRK W GINGER',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9950') +('0070865610025','HOT CHOCOLATE,OG',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9951') +('0070865610034','IMPUSLE BAR OG DARK CH',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-17 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9952') +('0070865610035','IMPULSE BAR OG MILK CH',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-03-19 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9953') +('0070865610036','IMPULSE BAR MAYA GOLD GRN BLK',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-17 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9954') +('0070865610038','GREEN & BLACKS CHOC ICE CREAM',4.65,'0',0.00,'0',3.69,'0',3.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'0','2007-06-12 12:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9955') +('0070865610039','GREEN & BLACKS VAN ICE CREAM',4.65,'0',0.00,'0',3.69,'0',3.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'0','2007-06-12 12:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9956') +('0070865610040','G & B WHITE CHOC ICE CREAM',4.65,'0',0.00,'0',3.69,'0',3.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'0','2007-06-12 12:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'9957') +('0070865610041','CHOCOLATE, OG, DARK 85%',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9958') +('0070865610042','CHOCOLATE OG CHERRY DARK',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1573','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9959') +('0070865610050','BAR OG DARK CHOC MINT',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-04-16 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9960') +('0070882106102','BATHRM LIME SCALE REMOVR 22 OZ',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-12-10 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9961') +('0070882106105','ENZ AWAY SPOT REMOVER 22 OZ',6.05,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9962') +('0070882106109','ALL SURFACE CLEANER SPRAY 22 Z',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9963') +('0070882106201','ALL PURPOSE CLEANR,CONCNT 32 O',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9964') +('0070882106204','DISH DETERGENT 32 OZ',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9965') +('0070882106207','GENTLE SOAP,HAND & BODY 32 OZ',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9966') +('0070882106208','LAUNDRY LIQ 32OZ RESTORE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9967') +('0070882106210','TOILET BOWL CLEANER 32 OZ',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9968') +('0070882106216','AUTO DISHWSHR GEL 32 OZ',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9969') +('0070882106304','RESTORE DISH HF GAL',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9970') +('0070882106305','RESTORE ENZ AWAY 64 OZ',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9971') +('0070882106307','GENTLE SOAP,HAND & BODY 64Z',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-06-27 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9972') +('0070882106308','RESTORE LAUNDRY LIQ 64OZ',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9973') +('0070882106309','SPRAY AND CLEAN 64 REFILL',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-10-07 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9974') +('0070882106316','RESTORE AUTO DISH GEL 64Z',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9975') +('0070882106357','RESTORE COUPON','-1.00','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','0','0','0',0,'499','2009-09-22 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12962') +('0070882106404','DISH DETERGENT, RESTORE 25OZ',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9976') +('0070882106707','Restore 64oz Gentle Soap',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-27 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9977') +('0070882106810','RESTORE REFILL COUPON','-1.00','0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','0','0','0',0,'0','2008-06-03 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'9978') +('0070927517364','PUMPERNICKEL RYE',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-05 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9979') +('0070927540237','BAGUETTE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-05-05 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9980') +('0070927540815','ORGANIC PEASANT RYE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','0','0',0,'0','2006-08-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9981') +('0070927540885','ORG RST GARLIC BREAD',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','2','1','0',0,'0','2006-04-22 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9982') +('0070937641411','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'9983') +('0071138100004','RASP PEACH CHAMPAGNE JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9984') +('0071138100008','WILD MAINE BLUEBERRY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9985') +('0071138100009','RED PEPPER JELLY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9986') +('0071138100010','ROASTED GARLIC ONION JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9987') +('0071138100011','CRANBERRY HORSERADISH SAUCE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9988') +('0071138100042','OLD FARMHOUSE CHUTNEY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9989') +('0071138100250','LEMON PEAR MARMALADE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9990') +('0071138100301','STAWBERRY RHUBARB JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9991') +('0071138100340','MINI ORANGE CRAN MARMALADE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9992') +('0071138102082','MANGO CHUTNEY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9993') +('0071138102096','CARAMEL APPLE BUTTER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9994') +('0071138102097','MAPLE PUMPKIN BUTTER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9995') +('0071138102140','PEACH AMARETTO JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9996') +('0071138102230','BLK CHERRY & COGNAC SAUCE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9997') +('0071138102307','MANGO LIME SALSA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9998') +('0071138102316','WASABI MUSTARD STONEWALL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-12-08 06:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'9999') +('0071138102415','MINI HOT PEPPER JELLY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10000') +('0071138102474','APRICOT JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10001') +('0071138102542','TANGERINE MARMALADE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10002') +('0071138102659','PEACH POMEGRANATE JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10003') +('0071138102787','HONEY MUSTARD PRETZEL DIP',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10004') +('0071138102788','MAPLE MUSTARD PRETZEL DIP',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'mixmatchcode','2009-02-08 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10005') +('0071138102825','BC PEACH PRESERVES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10006') +('0071138102826','BC SUMMER PLUM PRESERVES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10007') +('0071138102857','BC CARAMEL BUTTERSCOTCH SAUCE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10008') +('0071138102967','BC BLOOD ORANGE MARMALADE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10009') +('0071138103093','SIMPLE WHITE CRACKER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10010') +('0071138103095','BLUE CHEESE SESAME CRACKER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','0','0',0,'0','2008-12-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10011') +('0071138103097','ROASTED GARLIC CRACKER',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10012') +('0071138103100','AGED CHEDDAR BEER CRACKERS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10013') +('0071138103130','ROSEMARY PARM CRACKERS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10014') +('0071138103195','DULCE DE LECHE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10015') +('0071138103230','SUGAR PLUM JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10016') +('0071138103314','APPLE JALAPENO JELLY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10017') +('0071138103318','BC BEEPLY DARK CHOC & ORANGE S',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10018') +('0071138103366','PAPAYA SALSA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10019') +('0071138103432','MIMOSA BRUNCH JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10020') +('0071138103433','KIR ROYALE BRUNCH JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10021') +('0071138103434','BELLINI BRUNCH JAM',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10022') +('0071138103435','CINNAMON APPLE JELLY',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-12 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10023') +('0071394751610','NUTRICOLOGY THYMUS',16.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-02-22 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10024') +('0071413200073','NAT DENTIST ANTI GINGIV RINSE',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10026') +('0071436000312','MASSAGER FOR FEET',9.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10027') +('0071436001128','SPROUTING SCREEN',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10028') +('0071436001540','CHEESE CLOTH,UNBLEACHED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10029') +('0071436001547','VEGETABLE BRUSH, 6\\\',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10030') +('0071436001727','BIRTHDAY CANDLES',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-09 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10031') +('0071436002450','BEESWAX BIRTHDAY CANDLES',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10032') +('0071436003787','PLASTIC BAG DRYER',18.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10033') +('0071436004545','EARTH PLUGS',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-02-11 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10034') +('0071436004550','EARTH PLUGS W/TRAY',21.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-02-11 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10035') +('0071436013555','ALL PURPOSE FERTILIZER 1 QT.',15.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-04-18 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10036') +('0071436036308','GRANULAR ROOT GROWTH',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10037') +('0071436036505','DTE COMPOST ENHANCER',10.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10038') +('0071436041194','FUNNEL, SS',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-09 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10039') +('0071436090900','POP UP SPONGES',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2007-02-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10040') +('0071525620002','EPSOM SALT',2.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10041') +('0071525620005','EPSOM SALTS 4LB',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10042') +('0071525630002','AARON HYDROGEN PEROXIDE 16 OZ',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-01-22 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10043') +('0071548650011','OLBAS OIL (10 CC)',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10044') +('0071548650211','OLBAS ANALGESIC SALVE',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-06-07 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10045') +('0071548650420','OLBAS COUGH SYRUP',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10046') +('0071548650510','OLBAS INHALER',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10047') +('0071548650610','OLBAS PASTILLES(LOZENGES)',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-07-16 04:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10048') +('0071575610004','PBERRY RASPBERRY PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10049') +('0071575610022','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10050') +('0071575610027','PBERRY RASPBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10051') +('0071575620011','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10052') +('0071575620013','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10053') +('0071575630002','PBERRY BLUEBERRY NON-O 6 OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10054') +('0071575630007','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10055') +('0071575630008','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10056') +('0071575630009','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10057') +('0071575630019','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10058') +('0071575650001','PBERRY BLUEBERRY NO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10059') +('0071575650002','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10060') +('0071575650004','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10061') +('0071612312561','STEVIA EXTRACT CLEAR',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10062') +('0071612312565','SWEETLEAF STEV CL',27.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10063') +('0071612312571','STEVIA EXT POWDER SHAKER',17.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10064') +('0071612312585','STEVIA PLUS PACKETS 1 GR',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10065') +('0071612312591','STEVIA PLUS PACKETS 1 GR',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10066') +('0071612312594','STEVIA PLUS POWDER',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10067') +('0071623702008','CNDTR,SMOOTH AS SILK',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10069') +('0071623703008','SHMP,50/50 BALANCED',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10070') +('0071623704008','REMOIST,50/50 BALANCED',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10071') +('0071623706008','NUTRAFIX HAIR RECONSTRUCT',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10072') +('0071623707008','DIRECT LEAVE-IN CONDITNER',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10073') +('0071623710008','L.A. NATURAL EX-FIRM GEL',8.49,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10074') +('0071623711008','HAIR SPRAY,L.A. HOLD',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2008-08-01 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10075') +('0071623712008','AIR TURBO CHARGE MOUSSE',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10076') +('0071623713008','SHMP,TEA TREE',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10077') +('0071623714008','GIOVANNI FRIZZ BE GONE',8.49,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10078') +('0071623715008','CNDTR,TEA TREE',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10079') +('0071623718026','STRAIGHT FAST,OG',10.45,'0',0.00,'0',7.29,NULL,7.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10080') +('0071623718033','ROOT 66,OG',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10081') +('0071623718053','GIO SMOOTH SILK SHAMPOO',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2008-08-01 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10082') +('0071623718089','GIO RASP WINTER BAR SOAP',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2007-05-03 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10083') +('0071623718090','GIO WHITE TEA BAR SOAP',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-04-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10084') +('0071623718091','GIO BAMB BIRCH BAR SOAP',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2007-05-03 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10085') +('0071623718142','GIO PROTEIN HAIR INFUSION 1 OZ',2.85,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10086') +('0071623718169','GIO WICKED WAX',9.49,'0',0.00,'0',6.99,NULL,6.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10087') +('0071623718171','GIO ROOT 66 SHAMPOO',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10088') +('0071623718172','GIO ROOT 66 CONDITIONER',7.55,'0',0.00,'0',5.29,NULL,5.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10089') +('0071623718228','GIO PROTEIN HAIR INFUS 5.1 OZ',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-07-21 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10090') +('0071627000134','CHOCOLATE TOFFE ALMOND',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1571','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10091') +('0071627000152','BAR,DK CHOC W/CHER&ALMD',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1571','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10092') +('0071627000153','BAR,DARK CHOC/ORANGE PEEL',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1571','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10093') +('0071627000154','BAR,DARK CHOC/RASPBERRIES',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1571','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10094') +('0071627000165','BAR,RICH DARK CHOCOLATE',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1571','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10095') +('0071627000166','BAR,DK CHOC W/CRYSTL GNGR',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1571','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10096') +('0071631052184','PTOMATO GRAPE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10097') +('0071648000001','PTOMATO BAY CHERRY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'1392','2009-09-21 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10098') +('0071651422900','TODDLER FORM,OG,KOSHER',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10099') +('0071651453950','TODDLER FORM,OG,SOY,KOSHR',11.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10100') +('0071706723200','LaPERRUCHE RAW SUGAR CUBES',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-11-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10101') +('0071725600032','BAC OUT ENZYME CLEANER',8.59,'0',0.00,'0',5.49,NULL,5.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10102') +('0071725600042','LAUNDRY POWDER',19.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10103') +('0071725600049','OXYGEN BLEACH PLUS',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-01-19 03:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10104') +('0071725600060','LIQUID LAUNDRY DETERGENT',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10105') +('0071725600061','LIQ LAUNDRY,CITRUS',12.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10106') +('0071725600097','SOY TOILET SCRUB',6.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10107') +('0071794000008','SIMPLERS BERGAMOT 5 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10108') +('0071794000013','SIMPLERS CEDAR ATLAS 5 ML',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10109') +('0071794000015','SIMPLERS CHAMOMILE BLUE 2 ML',18.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10110') +('0071794000016','SIMPLERS CHAMOMILE ROMAN 2 ML',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10111') +('0071794000020','SIMPLERS CLARY SAGE 5 ML',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10112') +('0071794000021','SIMPLERS CLOVE 5 ML',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10113') +('0071794000023','SIMPLERS CYPRESS 5 ML',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10114') +('0071794000026','SIMPLERS EUCALY GLOBULUS 15 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10115') +('0071794000028','SIMPLERS EUCALYP RADIATA 15 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10116') +('0071794000038','GERANIUM ROSE OIL',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2009-09-11 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12883') +('0071794000041','SIMPLERS HELICHRYSUM 2 ML',25.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10117') +('0071794000044','SIMPLERS JASMINE ABS 2 ML',40.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10118') +('0071794000048','SIMPLERS LAVENDER 5 ML',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10119') +('0071794000049','SIMPLERS SPIKE LAVENDER 5 ML',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10120') +('0071794000050','SIMPLERS LEMON 5 ML',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10121') +('0071794000051','SIMPLERS LEMONGRASS 5 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10122') +('0071794000056','SIMPLERS SWEET MARJORAM 5 ML',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10123') +('0071794000062','SIMPLERS NEROLI 2 ML',35.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-12-18 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10124') +('0071794000066','SIMPLERS SWEET ORANGE 15 ML',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10125') +('0071794000067','SIMPLERS OREGANO 5 ML',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10126') +('0071794000070','SIMPLERS PATCHOULI 5 ML',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10127') +('0071794000072','SIMPLERS PEPPERMINT 5 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10128') +('0071794000075','SIMPLERS PINE WILD SCOTCH 5 ML',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10129') +('0071794000077','SIMPLERS ROSE ABSOLUTE 2 ML',33.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10130') +('0071794000080','SIMPLERS ROSEMARY CINEOL 5 ML',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10131') +('0071794000091','SIMPLERS TEA TREE 5 ML',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10132') +('0071794000094','SIMPLERS RED THYME 5 ML',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10133') +('0071794000097','SIMPLERS VETIVER 5 ML',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10134') +('0071794000098','SIMPLERS WINTERGREEN 5 ML',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10135') +('0071794000100','SIMPLERS YLANG EXTRA 5 ML',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10136') +('0071794000112','SIMPLERS SINUS OIL 5 ML',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10137') +('0071794000114','SIMPLERS COMPOUND HELP',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10138') +('0071794000116','SIMPLERS INJURY OIL 15 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10139') +('0071794000117','SIMPLERS CINNAMON 5 ML',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10140') +('0071794000272','SIMPLERS LAVENDER 15 ML',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10141') +('0071794000275','SIMPLERS GRAPEFRUIT 5 ML',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10142') +('0071794000281','SIMPLERS HERP AID 5 ML',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10143') +('0071794000282','SIMPLERS ACNE AID 5 ML',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10144') +('0071794000284','SIMPLERS YEAST AID 5 ML',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10145') +('0071794000289','SIMPLERS SHINGLE AID 15 ML',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10146') +('0071794000290','SIMPLERS ECZEMA AID 5 ML',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10147') +('0071794000299','SIMPLERS ARTHRITIS AID 15 ML',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10148') +('0071794000300','SIMPLERS SCAR & BURN OIL 15 ML',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10149') +('0071794000462','SIMPLERS FRANKINCENSE 2 ML',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10150') +('0071794000463','SIMPLERS MYRRH CO2 2 ML',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10151') +('0071794000479','SIMPLERS AUS SANDALWOOD 5 ML',31.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10152') +('0071833422016','THOROUGHLY CLEAN FACE',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-12-12 12:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10153') +('0071833422024','DENTAL FLOSS',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10154') +('0071833422040','CLEANSING PADS, TEA TREE',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-06-10 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10155') +('0071833422093','MOISTURIZER, DAILY ESSNTL',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10156') +('0071833422094','GENTLE STIMULATING FACE SCRUB',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-06-27 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10157') +('0071833430087','CINNAMON BURST TOOTHPASTE',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-31 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10158') +('0071833430088','SPARKLING SEA TOOTHPASTE',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2007-05-31 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10159') +('0071833433703','DE RED GRAPE SHAMPOO',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10160') +('0071833433704','DE RED GRAPE COND',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10161') +('0071833433707','DE RED RASP SHAMPOO',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10162') +('0071833433708','DE RED RASP COND',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10163') +('0071868710010','PALAK PANEER',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10164') +('0071868710050','CHICKEN KORMA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10165') +('0071868710051','CHICKEN MASALA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10166') +('0071868710056','CHICKEN TANDOORI W/SPINCH',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10167') +('0071868730010','BOMBAY CURRY SAUCE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10168') +('0071868730011','CALCUTTA MASALA SAUCE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10169') +('0071868730013','SAUCE,PUNJAB SAAG SPINACH',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10170') +('0071868730014','SAUCE,DELHI KORMA SIMMER 16 0Z',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10171') +('0071868750012','CHUTNEY,SWEET MANGO 9 OZ',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2006-05-26 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10172') +('0071868770052','LEMONGRASS&BASIL CHICKEN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10173') +('0071868770054','CHICKEN PAD THAI',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10174') +('0071921210101','SALSA,2 OLIVE,RSTD GARLIC',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10175') +('0071921210102','SALSA,PEACH MANGO',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10176') +('0071921279922','SALSA,DEL RIO,MEDIUM',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10177') +('0071921279973','DIP BLACK BEAN',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10178') +('0071921279974','DIP PINTO BEAN',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10179') +('0071998508040','No Flush Niacin 500 mg Veg',19.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10180') +('0071998510040','Vitamin A 10,000 IU Softgel',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10181') +('0071998510731','WFC VITAMIN D 5000I.U. 60 CT',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12877') +('0071998512031','Vitamin E 400 IU Softgel',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10182') +('0071998512325','Vitamin E 400 IU Mixed Toco',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10183') +('0071998512331','Vitamin E 400 IU Mixed Toco',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10184') +('0071998513134','Flax Seed Oil 1000 mg Softg',11.29,'0',0.00,'0',8.99,'0',8.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10185') +('0071998513234','Evening Primrose Oil 500 mg',10.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10186') +('0071998513834','Ultimate Omega Complex',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10187') +('0071998514040','Lecithin 1200 mg Softgel',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10188') +('0071998514140','Hawaiian Spirulina Tabs',9.25,'0',0.00,'0',7.39,'0',7.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10189') +('0071998515216','WFC SOY LECITHIN GRANULES',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-09-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12878') +('0071998515431','WFC PROSTATE SUPPORT GELS 60CT',25.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12875') +('0071998516525','WFC COQ10 200MG 30 CT',31.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10190') +('0071998516831','WFC KIDS DHA 60 CT CHEWABLE',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10191') +('0071998518031','Lutein 20 mg Softgel',24.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10194') +('0071998518540','Natural Beta Carotene 25,00',19.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10195') +('0071998518643','Vegetarian Glucosamine 750',25.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10196') +('0071998519131','Activin Grape Seed Extrac',14.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10197') +('0071998519334','Glucosamine / Chondroitin C',26.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10198') +('0071998519349','VITAMER GLUC CHON 180CT',49.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10199') +('0071998519531','Glucosamine Sulfate 500 mg',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10200') +('0071998519643','MSM (OptiMSM) Veg Caps',18.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10201') +('0071998519725','CoQ10 30 mg Caps',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10202') +('0071998519925','CoQ10 60 mg Caps',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10203') +('0071998520240','Folic Acid 800 mcg Tabs',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10204') +('0071998520440','B-12 500 mcg PR Tabs',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10205') +('0071998520731','Biotin 500 mcg Caps',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10206') +('0071998521540','B-6 100 mg Tabs',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10207') +('0071998522240','Niacin 100 mg Tabs',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10208') +('0071998522931','Pantothenic Acid 500 mg PR',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10209') +('0071998523725','Bal B-100 Tabs',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10210') +('0071998524431','Hi-Potency B-Stress Tabs',11.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10211') +('0071998530240','Super Citro Cee 500 mg Ta',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10212') +('0071998531040','Vitamin C 1000 mg RH PR Tab',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10213') +('0071998531546','Orange Juice Cee Chewable T',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10214') +('0071998531861','Vitamin C 500 mg RH Tabs',19.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10215') +('0071998533028','Buffered C 1000 mg PR Tabs',9.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10216') +('0071998533104','WFC VITAMIN C CRYSTALS 4 OZ',10.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10217') +('0071998540228','Dry E 400 IU Veg Caps',15.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10218') +('0071998544043','WFC LIVER DETOX CMPLX 120 CT',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10219') +('0071998544143','WFC NATURAL CLEANSE COMPLEX',10.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10220') +('0071998544731','WFC MELATONIN 1 MG LOZENGE',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-09-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12874') +('0071998550134','Iron Free Multi Caps',23.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10221') +('0071998550331','ULTIMATE SENIOR 60CT',11.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10222') +('0071998550731','BENGAL BITES 60CT',8.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10223') +('0071998550831','Ultimate One PR Tabs',22.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-08-20 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10224') +('0071998551031','Ultimate Vegetarian Multi',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10225') +('0071998551431','Basic Mult Tabs',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10226') +('0071998551434','Basic Mult Tabs',13.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10227') +('0071998551543','Prenatal Multi Tabs',17.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10228') +('0071998552031','WFC ULTIMATE CAPSULE 60 CT',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10229') +('0071998552531','WFC ORG TOTAL FOOD MULTI 60CT',26.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-11 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12876') +('0071998554234','Life Multi Complete Tabs',26.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10230') +('0071998554331','WFC IRON FREE ULT ONE 60 CT',21.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-22 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10231') +('0071998554434','WFC IRON FREE BASIC MULTI',14.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10232') +('0071998560031','Cool Lemon Zinc Lozenges',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10233') +('0071998560140','Cal-Mag Citrate Complex Tab',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10234') +('0071998560231','Chewable Calcium Tabs',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10235') +('0071998560434','Ultimate Bone Formula Ta',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10236') +('0071998560540','Chelated Cal Mag Tabs',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10237') +('0071998560740','Cal-Mag-Zinc Tabs',10.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10238') +('0071998560761','WFC CAL MAG ZINC 250 CT',21.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10239') +('0071998561240','Cal-Mag Veg Caps',13.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10240') +('0071998563131','ChromeMate Chromium 200 m',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10241') +('0071998568040','Chelated Zinc 50 mg Tabs',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10242') +('0071998568234','Chelated Magnesium 250 mg T',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10243') +('0071998570328','Enzyme Caps',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10244') +('0071998571528','Acidophilus Caps',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10245') +('0071998573628','L-Lysine 500 mg Caps',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10246') +('0071998573640','WFC L LYSINE 500MG 100CT',12.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10247') +('0071998582640','Supreme Stress B Caps',32.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10248') +('0071998583240','Vitamin D 400 IU Softgel',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10249') +('0071998596516','Ultimate Soy-Spirulina Pr',22.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10250') +('0071998596716','Show Me The Whey Protein',27.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10251') +('0071998596726','VIT WHEY 32 OZ. POWDER',50.95,'0',0.00,'0',39.99,'0',39.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','105','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10252') +('0071998596816','Non-GMO Soy Protein Powder',19.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','0','1','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10253') +('0071998597016','Show Me the Whey Protein',27.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10254') +('0071998597331','Saw Palmetto 160 mg Softgel',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10255') +('0071998597828','Echinacea 400 mg Veg Caps',8.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10256') +('0071998598031','Ginkgo Biloba 60 mg Veg Cap',8.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10257') +('0071998598125','Cran-Max Cranberry Veg C',14.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10258') +('0071998599128','WFC WELLNESS BOOSTER',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10259') +('0071998599328','St. Johns Wort 300 mg Veg',8.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10260') +('0071998599531','Ultimate Eye Formula Veg',35.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-12-05 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10261') +('0072005411112','HONEY,RAW',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10262') +('0072005455560','BHONEY REALLY RAW 5# SIZE',42.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','23','0','0','1','0',0,'499','2009-08-07 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'10263') +('0072037993108','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10264') +('0072037994047','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10265') +('0072037994958','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10266') +('0072225210061','LUNA BAR,PNUT BTR COOKIE 1.69',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10267') +('0072225210063','LUNA BAR,ICED OATML RAISN 1.69',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10268') +('0072225210064','LUNA BAR CARAMEL NUT BROWNIE',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10269') +('0072225210067','LUNA BAR,OG,WHT CHC MACA',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'mixmatchcode','2009-04-10 10:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10270') +('0072225210070','CLIF BAR,OG,APRICOT',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10271') +('0072225210080','CLIF BAR,OG,CRANAPLE CHRY',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10272') +('0072225210120','CLIF BAR,OG,CRNCH PNT BTR',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10273') +('0072225210130','CLIF BAR,OG,CHC CH PNTCR',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10274') +('0072225210140','CLIF BAR,OG,CARROT CAKE',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10275') +('0072225210160','CLIF BAR,OG,CHOC ALMD FDG',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10276') +('0072225210180','CLIF BAR,OG,CHOC BROWNIE',1.49,'0',0.00,'0',0.99,'0',0.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'499','2009-09-01 08:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12844') +('0072225210200','CLIF BAR,OG,COOLMINT CHO',1.49,'0',0.00,'0',0.99,'0',0.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'499','2009-09-01 08:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12845') +('0072225210250','CLIF BAR,OG,BLK CHY ALMON',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10277') +('0072225210260','CLIF BAR BLUEBERRY CRISP',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10278') +('0072225210310','LUNA BAR,NUTZ OVER CHOCLT',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10279') +('0072225210320','LUNA BAR,TSTD NUTS CRNBRY',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10280') +('0072225210330','LUNA BAR,LEMON ZEST',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10281') +('0072225210370','LUNA BAR,CHAI TEA',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10282') +('0072225210410','LUNA BAR,CHOC PEPRMNT STK',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10283') +('0072225210501','MOJO BAR HONEY PEANUT',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1621','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10284') +('0072225210531','MOJO BAR MIXED NUTS',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1621','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10285') +('0072225210561','MOJO BAR, MOUNTAIN MIX',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1621','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10286') +('0072225212630','MOJO BAR CHOC PEANUT',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1621','2009-04-10 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10287') +('0072225218001','KID TWISTED FRT,OG,STRWB',0.95,'0',0.00,'0',0.00,'0',0.65,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'1523','2008-12-04 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10288') +('0072225218002','KID TWISTED FRT,OG,MX BR',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'1523','2008-12-04 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10289') +('0072225218003','KID TWISTED FRT,OG,SR AP',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'1523','2008-12-04 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10290') +('0072225218004','KID TWISTED FRT,OG,TROPC',0.95,'0',0.00,'0',0.65,'0',0.65,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','162','0','0','1','0',0,'1523','2008-12-04 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10291') +('0072225218005','KID TWISTED FRT,OG,GRAPE',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'1523','2008-12-04 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10292') +('0072225218006','KID TWISTED FRT,OG,PNAPL',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'1523','2008-12-04 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10293') +('0072225219412','ZBAR, PEANUT BUTTER',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1623','2008-08-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10294') +('0072225219413','ZBAR, CHOCOLATE BROWNIE',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1623','2008-08-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10295') +('0072225219414','ZBAR, CHOCOLATE CHIP',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1623','2008-08-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10296') +('0072225219415','ZBAR, HONEY GRAHAM',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1623','2008-08-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10297') +('0072225219416','ZBAR,OG,BLUEBERRY',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1623','2008-08-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10298') +('0072225250003','CLIF BAR,OG,OAT RSN WLNT 2.4 O',1.49,'0',0.00,'0',0.99,NULL,0.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1513','2009-04-10 10:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10300') +('0072225260141','BUILDER BAR, PEANUT BUTTER',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1620','2009-07-09 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10301') +('0072225260142','BUILDER BAR, CHOCOLATE',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1620','2009-07-09 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10302') +('0072225260145','BUILDER BAR, VANILLA ALMOND',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1620','2009-07-09 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10303') +('0072225260146','BUILDER BAR,LEMON',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1620','2009-07-09 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10304') +('0072243000016','GT KOMBUCHA ORIGINAL',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2009-01-28 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10305') +('0072243010016','CITRUS KOMBUCHA',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10306') +('0072243011016','SYNERGY TRILOGY',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10307') +('0072243014016','MULTI-GREEN KOMBUCHA',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2008-07-23 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10308') +('0072243016016','KOMBUCHA, BOTANIC #3',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2009-06-15 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10309') +('0072243017016','KOMBUCHA, BOTANIC #7',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2009-06-15 08:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10310') +('0072243018016','KOMBUCHA, BOTANIC #9',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2009-06-15 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10311') +('0072243020016','GTS GINGERADE',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10312') +('0072243030016','GT SYNERGY CRANBERRY',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2009-02-09 08:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10313') +('0072243040016','SYNERGY OG STRWBRY',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2008-07-23 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10314') +('0072243050016','MANGO KOMBUCHA',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2008-07-23 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10315') +('0072243060016','GINGERBERRY SYNERGY',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10316') +('0072243080016','GRAPE KOMBUCHA',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2008-07-23 12:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10317') +('0072243090016','GUAVA KOMBUCHA',3.59,'0',0.00,'0',2.89,'0',2.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','37','0','0','1','0',0,'0','2008-07-31 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10318') +('0072249800102','DEAD SEA MINERAL BATH SLT',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10319') +('0072249800202','MINERL BTH SLT,LAVENDER',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10320') +('0072249800302','MINERL BTH SLT,EUCALYPTUS',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10321') +('0072249890202','MASADA JOINT & MUSCLE BTH SALT',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10322') +('0072249890702','MASADA COLD N FLU BATH SALTS',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10323') +('0072474200341','MOIST CRM SHAVE,COCONT LM',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10325') +('0072474200345','MOIST CRM SHAVE,MANGO VAN',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10326') +('0072474200362','BODY BATH,HONEY MANGO',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10327') +('0072474200363','BODY BATH,FRENCH LAVENDER',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10328') +('0072474200365','BODY LTN,VERY EMOL,DRY',10.89,'0',0.00,'0',7.99,NULL,7.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10329') +('0072474200368','BODY LTN,VERY EMOL,UNSNTD',10.45,'0',0.00,'0',7.29,NULL,7.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-01-11 12:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10330') +('0072474200387','SUN MINERAL FACIAL 10 SPF',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10331') +('0072474200388','SUN MINERAL KIDS 18 SPF',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10332') +('0072474200389','SUN MINERAL FR FREE SPF 18',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10333') +('0072474200390','SUN SPF 32 SPORT LOTION',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10334') +('0072474200391','SUN SPF 15 FRAG FREE',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10335') +('0072474200392','SUN SPF 18 CHEM FREE ALOEVAN',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10336') +('0072474200393','SUN SPF 30,LAVENDER',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'499','2009-04-29 07:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10337') +('0072474200394','SUN LIP BALM,SPF18',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2007-04-24 02:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10338') +('0072474200395','SUN SPF 20 FACES PLUS LTN',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-04-29 07:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10339') +('0072474200397','ALBA SUNLESS TANNING LOT',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-04-29 07:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10340') +('0072474200399','SUN SPF 32 KIDS LOTION',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'499','2009-04-29 07:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10341') +('0072474200612','STICK DEOD,TEA TREE',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10342') +('0072474200802','FACIAL CLEANSER,PNAPL ENZ',12.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10343') +('0072474200804','FACIAL WASH,COCONUT MILK',12.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10344') +('0072474200812','OIL FR MOIST,ALOE&GRN TR',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10347') +('0072474200814','MOISTURE CRM,JASMN&VIT E',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10348') +('0072474200816','EYE GEL,GREEN TEA',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10349') +('0072474200822','BODY CREAM,PAPAYA MANGO',12.35,'0',0.00,'0',7.99,'0',7.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10350') +('0072474200824','BODY CREAM,KUKUI NUT',12.35,'0',0.00,'0',7.99,'0',7.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','97','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10351') +('0072474200826','ALBA AFTER SUN LOTION',11.49,'0',0.00,'0',6.89,'0',6.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10352') +('0072474200827','SUNSCREEN,SPF30 ,GRN TEA',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10353') +('0072474200831','ALBA TAN OIL SPF 4',9.45,'0',0.00,'0',5.65,'0',5.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10354') +('0072474200834','ALBA KUKUI NUT MSG OIL 8.5OZ',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10355') +('0072474200835','LIP BALM,PINEAPPLE QUENCH',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10356') +('0072474200837','LIP BALM,COCONUT CREAM',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10357') +('0072474200852','ALBA PLUMERIA SHAMPOO',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10358') +('0072474200853','ALBA GARDENIA SHAMPOO',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10359') +('0072474200856','ALBA GARDENIA CONDITIONER',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10360') +('0072474200863','ALBA PLUMERIA CONDITIONER',9.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10361') +('0072474202368','ALBA VERY EMOL UNSC LOT GAL',49.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-03-18 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10362') +('0072477310901','TEA BALL 3*',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2006-07-07 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10364') +('0072477310902','TEA BALL 2 1/2*',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-05-15 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10365') +('0072477310903','TEA BALL 2*',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10366') +('0072477320551','MORTAR PESTLE, WHT MRBL',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2007-08-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10367') +('0072477391101','MESH INFUSER FRONTIER',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10368') +('0072477391102','TEA INFUSER SPOON',1.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10369') +('0072527481379','MAG HERBAL GRAM',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10370') +('0072527481797','NATIONAL GREEN PAGES',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2007-04-27 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10371') +('0072527487100','YES MAGAZINE',6.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-05-30 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10372') +('0072527490825','HIP MAMA MAG',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10373') +('0072527494728','WELL BEING JOURNAL',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10374') +('0072527495048','MAG LIVING WITHOUT',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2005-10-27 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10375') +('0072527498518','E MAGAZINE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-09-11 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12882') +('0072533400320','DDS-ACIDOPHILUS',19.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-04 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10376') +('0072533400350','DDS PLUS ACIDPHLS BIFDUS',23.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-04 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10377') +('0072533400385','DDS-PLUS POWDR',21.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-01-04 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10378') +('0072534226013','TOMATOES,OG,WHOLE PEELED',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10379') +('0072534226071','DICED TOMATOES,OG',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1575','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10380') +('0072534226073','DICED TOMATOES,OG',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10381') +('0072534226926','TOMATO,OG,DICE,NS,FR RST',2.59,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-05-05 01:02:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10382') +('0072534228071','TOMATO SAUCE,OG,REGULAR',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10383') +('0072534228183','TOMATOES,OG,GRND PEELED',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10384') +('0072534228193','TOMATO SAUCE,OG,CHUNKY',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10385') +('0072534228266','PASTA SCE,OG,ITALIAN HERB',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1505','2009-01-20 06:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10386') +('0072534228356','PASTA SCE,OG,TOMATO BASIL 25.5',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1505','2009-01-20 06:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10387') +('0072534228371','TOMATOES,OG,STEWED',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1575','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10388') +('0072534228381','DICED TOM,OG,ITALIAN',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1575','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10389') +('0072534228393','TOMATOES,OG,CRSHD W/BASIL',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10390') +('0072534228502','PSTA SCE,OG,ITAL SAUS PP',5.99,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-01-19 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10391') +('0072534228503','PASTA SCE,OG,VODKA',5.99,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-01-19 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10392') +('0072534228561','DICED TOMATOES,OG,NS',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1575','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10393') +('0072534228571','TOMATO SAUCE,OG,NS',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10394') +('0072534228676','PASTA SCE,OG,FF,RST GARLC',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1505','2009-01-20 06:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10395') +('0072534228731','DICED TOM,OG,GARLIC&ONION',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1575','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10396') +('0072534228741','DICED TOM,OG,BASIL&GARLIC',2.35,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1575','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10397') +('0072534228976','PASTA SCE,OG,PRTBELLO MSH',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1505','2009-01-20 06:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10398') +('0072534228986','PASTA SCE,OG,GARDEN VEG',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1505','2009-01-20 06:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10399') +('0072534229053','DICED TOMATOES,OG,FIRE-RS',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10400') +('0072534229121','TOMATO,OG,DICED,FIRE RST',2.59,'0',0.00,'0',1.49,NULL,1.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-05-05 01:02:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10401') +('0072534229326','PASTA SCE,OG,FOUR CHEESE',5.99,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'0','2009-01-19 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10402') +('0072534229373','TOMATOES,OG,PLUM,WHL PEEL 28 O',3.65,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','177','0','0','1','0',0,'1543','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10403') +('0072534238171','TOMATO PASTE,OG',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10404') +('0072534241251','SOUP,OG,SWEST,BLACK BEAN',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-09-03 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12852') +('0072534241252','SOUP,OG,CLASSC MINESTRON',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-08-21 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12782') +('0072534241253','SOUP,OG,CRMY TOMATO BSQU',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-09-03 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12850') +('0072534241254','SOUP,OG,GARDEN VEGETABLE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'499','2009-08-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10405') +('0072534241256','SOUP,OG,HMSTYLE SPLIT PE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-09-03 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12851') +('0072534241257','SOUP,OG,SAVORY LENTIL',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-08-13 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12755') +('0072534241259','SOUP,OG,BEEF VEGETABLE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-09-03 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12849') +('0072534241262','SOUP, OG CHICK WILD RICE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-08-26 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12803') +('0072534241264','SOUP,OG,CHICKEN NOODLE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','4',0.00,'0','12754') +('0072534242912','SOUP,OG,CHICKEN NOODLE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-11-13 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10406') +('0072534242913','SOUP OG BEEF VEGETABLE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2007-09-06 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10407') +('0072534242914','SOUP,OG,CHCKN&WILD RICE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2008-11-13 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10408') +('0072534247813','SOUP, OG, GARDEN VEGETABLE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1576','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10409') +('0072534247814','SOUP,OG,SAVORY LENTIL',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1576','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10410') +('0072534247815','SOUP, OG, CLASSIC MINESTRONE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1576','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10411') +('0072534247816','SOUP, OG, HOMESTYLE SPLIT PEA',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1576','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10412') +('0072534247831','SOUP, OG, CREAMY TOMATO',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1576','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10413') +('0072534247832','SOUP, OG, SW BLACK BEAN',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'1576','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10414') +('0072534248470','SALSA,OG,MEDIUM',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1517','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10415') +('0072534248490','SALSA,OG,MILD',4.55,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'1517','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10416') +('0072534248540','TOMATO KETCHUP,OG',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10417') +('0072534248800','SALSA,OG,GRLC CILNTRO,MED',4.55,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'1517','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10418') +('0072534248810','SALSA,OG,BLK BN & CRN,MED',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1517','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10419') +('0072534248940','SALSA,OG,CHIPOTLE,MED',4.55,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'1517','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10420') +('0072577600013','ALAKEF 12oz BOLIVIAN ORG',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2007-11-21 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'10421') +('0072689959002','CHLOROPHYLL,100 MG',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10422') +('0072689959047','CHLOROPHYLL',11.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2007-04-24 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10423') +('0072710140040','BALM,BEAUTIFUL BELLY BALM',14.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10424') +('0072745200270','CHIPOTLE IN ADOBO SAUCE',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-04-25 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10425') +('0072761617116','AZTEC HEALING CLAY 1 LB',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-08-30 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10426') +('0072764403112','EARTH JUICE',13.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-04-16 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10427') +('0072778300101','NEW CHAPTER ALL FLORA 76 CT',33.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-14 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10428') +('0072778300102','Probiotic All-Flora 2.1 oz',33.99,'0',0.00,'0',27.15,'0',27.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-08-23 08:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1','0','5',0.00,'0','12793') +('0072778300121','NEWCHAP SENSITIVE COLON 90CT',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10429') +('0072778300123','NEWCHAP PROBIOTIC IMMUNE',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10430') +('0072778300251','NEWCHAP HOST DEFENSE 60CT',36.99,'0',0.00,'0',29.59,'0',29.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2008-07-29 10:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10431') +('0072778300401','NEWCHAP BLOOD PRESSURE',36.99,'0',0.00,'0',29.59,'0',29.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10432') +('0072778300565','NEW CHAPTER BERRY GREEN 90 CT',33.29,'0',0.00,'0',26.59,'0',26.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'mixmatchcode','2009-01-28 08:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10433') +('0072778300603','COENZYME B FOOD COMPLEX 30',13.85,'0',0.00,'0',10.99,'0',10.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2005-06-15 08:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10434') +('0072778300611','EVERY WOMAN 90',46.25,'0',0.00,'0',36.99,'0',36.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10435') +('0072778300613','EVERY MANS ONE DAILY 30',22.99,'0',0.00,'0',18.39,'0',18.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10436') +('0072778300614','EVERY MANS ONE DAILY 60',36.99,'0',0.00,'0',29.59,'0',29.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10437') +('0072778300623','STRESS SUPPORT MULTI 90',36.99,'0',0.00,'0',29.59,'0',29.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10438') +('0072778300636','EVERY WOMANS IRON 60',22.99,'0',0.00,'0',18.39,'0',18.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10439') +('0072778300640','EVERY WOMANS ONE DAILY 30',22.99,'0',0.00,'0',18.39,'0',18.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10440') +('0072778300641','EVERY WOMANS ONE DAILY 60',36.99,'0',0.00,'0',29.59,'0',29.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10441') +('0072778300644','GTF CHROMIUM COMPLEX 30',13.85,'0',0.00,'0',10.99,'0',10.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10442') +('0072778300645','ZINC FOOD COMPLEX 60',18.49,'0',0.00,'0',14.79,'0',14.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10443') +('0072778300656','NEWCHAP PERFECT PRENATAL 90CT',41.59,'0',0.00,'0',33.25,'0',33.25,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2007-02-14 11:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10444') +('0072778300663','E & SELENIUM FOOD COMPLEX 30',13.85,'0',0.00,'0',10.99,'0',10.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10445') +('0072778300667','EVERY MAN II 90',41.59,'0',0.00,'0',33.25,'0',33.25,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10446') +('0072778300671','EVERY WOMAN II 90',41.59,'0',0.00,'0',33.25,'0',33.25,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10447') +('0072778300682','SELENIUM FOOD COMPLEX 30',13.85,'0',0.00,'0',10.99,'0',10.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10448') +('0072778300803','NEW CHAPTER SMOOTH FOOD',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-01-14 09:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10449') +('0072778301101','NEW CHAPTER GINGER WONDER',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-07-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10450') +('0072778301121','NEWCHAP GINGERHONEY TONIC',16.65,'0',0.00,'0',13.29,'0',13.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10451') +('0072778304045','NEWCHAP ESTROTONE 6O CT',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10452') +('0072778304049','NEWCHAP PROSTATE 5LX 60 CT',25.89,'0',0.00,'0',19.99,NULL,19.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10453') +('0072778304050','NEWCHAP PROSTATE 5LX 120CT',39.29,'0',0.00,'0',34.99,NULL,34.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10454') +('0072778304053','NEWCHAP ZYFLAMEND 60 CT',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2006-05-25 02:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10455') +('0072778304054','NEW CHAPTER ZYFLAMEND 120CT',46.99,'0',0.00,'0',37.59,'0',37.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10456') +('0072778304071','NEWCHAP HEADACHE RELIEF 30CT',23.99,'0',0.00,'0',19.19,'0',19.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2006-05-25 02:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10457') +('0072778304083','NEWCHAP SINUS AND RESP 30CT',22.99,'0',0.00,'0',18.39,'0',18.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10458') +('0072778304085','NEW CHAPTER HOLY BASIL 60CT',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','102','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10459') +('0072778304095','NEWCHAP OREGANO FORCE',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2008-07-29 10:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10460') +('0072778305002','NEW CHAPTER WHOLE MEGA 60CT',27.75,'0',0.00,'0',22.19,'0',22.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','101','0','1','0','0',0,'0','2009-07-29 02:02:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10461') +('0072780601122','DOMINEX EGGPLANT CUTLETS',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-05-09 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10462') +('0072780602202','DOMINEX PARMESAN BITES',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-05-09 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10464') +('0072806010008','CELTIC SEA SALT POUND',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2007-12-03 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10465') +('0072806010720','CELTIC SEA SALT FINE',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2007-12-03 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10466') +('0072822901315','SWEETS AND BEETS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10468') +('0072822901334','POTATO CHIPS,NS,AU NATRL',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10469') +('0072822901395','KETTLE CHIP,PESTO&SMK MOZ',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-06-23 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10470') +('0072822912375','TERRA CHIPS',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10471') +('0072899713400','BLEACH,NON CHLORINE',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10472') +('0072899715400','LIQUID LAUNDRY WASH',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10473') +('0072899719200','DELICATE WASH',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-09-22 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12971') +('0072899721200','NATL DISH LIQ,UNSCNT HRBL',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10474') +('0072899722000','AUTO DISHWASHING,TABLETS',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10475') +('0072899722600','CAR WASH AND WAX',4.45,'0',0.00,'0',3.79,'0',3.79,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2009-07-11 11:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10476') +('0072899722700','CAR CLEANER,INTERIOR',5.15,'0',0.00,'0',4.39,'0',4.39,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2009-07-11 11:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10477') +('0072958201281','BAKNG CHIP,DF,SEMI-SWEET 10 OZ',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','1','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10478') +('0072958211620','CHOC BAR PEPPERMINT PATTIE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10479') +('0072958211630','CHOC BAR COCONUT ALMOND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10480') +('0072960901965','GRIPE WATER',11.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-10-15 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10481') +('0072990611949','INSTNT OATMEAL VARIETY PK CC',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10482') +('0072990611950','INSTNT OATMEAL MPL SYRUP CC',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10483') +('0072990611951','INSTNT OATMEAL APP CIN CCHOICE',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10484') +('0072990611969','INSTNT OATMEAL OG FIT KID',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10485') +('0072990612006','COOKIE,OG,DBLFDG BRNIE WF',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10488') +('0072990612014','CKIE,OG,OATML RS,SFT BKD',3.99,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'499','2009-07-09 01:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10489') +('0072990612015','SFT BKD CKIE,OG,OATML CH',3.99,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'0','2009-06-25 08:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10490') +('0072990612016','CKIE,OG,DBL FDG B,SFT BK',3.99,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'499','2009-07-09 01:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10491') +('0072990617001','SNDWCHCRM,OG,CHOC,VAN CR',4.15,'0',0.00,'0',3.35,'0',3.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'1532','2008-08-15 01:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10492') +('0072990617002','SNDWCHCRM,OG,VAN,VAN CRM',4.15,'0',0.00,'0',3.35,'0',3.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'1532','2008-08-15 01:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10493') +('0072990617003','SNDWCHCRM,OG,DUPLEX',4.15,'0',0.00,'0',3.35,'0',3.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'1532','2008-08-15 01:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10494') +('0072990617005','SNDWCHCRM,OG,GINGER LEMON',4.15,'0',0.00,'0',3.35,'0',3.35,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'1532','2008-08-15 01:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10495') +('0072990618001','VANILLA WAFERS,OG,BOX',3.99,'0',0.00,'0',3.19,'0',3.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10496') +('0072990618002','GINGER SNAPS,OG,BOX',3.99,'0',0.00,'0',3.19,'0',3.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10497') +('0072990618003','COOKIE,OG, OATML, ICED',3.99,'0',0.00,'0',3.19,'0',3.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','155','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10498') +('0072990619004','OATML SQ,OG,MAPLE',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10499') +('0073126745150','NATURAL JUTE TWINE',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10500') +('0073133000002','PFIG BLACK MISSION',4.29,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','550','0','0','1','0',0,'552','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10501') +('0073178932134','PIZZA,TOM SCE&3 CHEESE',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10502') +('0073291313703','BATH TISSUE,2-PLY SINGLES',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10503') +('0073291313705','NAPKINS,JUMBO PACK,NATURL 500',8.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10504') +('0073291313706','FACIAL TISSUES,2-PLY',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10505') +('0073291313719','FACIAL TISSUES,2-PLY,CUBE 85 C',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10506') +('0073291313720','PAPER TOWELS,NATURAL',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10507') +('0073291313724','BATH TISSUE, 2 PLY 4PK',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-10-26 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10508') +('0073291313726','BATH TISSUE, 2 PLY 12PK',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10509') +('0073291322150','AUTO DISH POWDER,FR&CLR',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10510') +('0073291322171','AUTO DISH GEL,LEMON SCENT',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10511') +('0073291322704','CLEANER,TOILET BOWL',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'499','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10512') +('0073291322707','ULTRA FABRIC SOFTENER,LAV',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10513') +('0073291322714','ULTRA PWDR LAUNDRY,CITRUS',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10514') +('0073291322715','ULTRA PWDR LAUNDRY,FR&CLR',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10515') +('0073291322719','CLEANER,ALL PURPOSE',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'499','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10516') +('0073291322733','DISH LIQUID,FREE & CLEAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10517') +('0073291322734','DISH LIQUID,LAVENDER SCN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-02-26 09:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10518') +('0073291322750','CLEANER,BATHROOM 32 OZ',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'499','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10519') +('0073291322752','CLEANER,SHOWER 32 OZ',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'499','2009-07-22 11:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10520') +('0073291322766','FABRIC SOFTENER, FREE & CLEAR',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10521') +('0073291322779','2X ULTRA LIQ LAUNDRY,W FLWR',18.99,'0',0.00,'0',12.99,NULL,12.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-03-24 08:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10522') +('0073291322780','2X ULTRA LIQ LNDRY,FR&CLR',18.99,'0',0.00,'0',12.99,NULL,12.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-03-14 09:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10523') +('0073291322781','2X ULTRA LIQ LNDRY,BL EUC',18.99,'0',0.00,'0',12.99,NULL,12.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2008-03-14 09:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10524') +('0073291322787','FAB SFTNER SHT,FR & CLR',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-07-17 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10525') +('0073291334207','BABY WIPES,TUB 80 CT',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10526') +('0073291334208','BABY WIPES,TRAVEL/REFILL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','1','0','0',0,'0','2007-04-27 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10527') +('0073291344022','DIAPERS STAGE 1',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','187','0','0','0','0',0,'1547','2009-05-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10528') +('0073291344023','DIAPERS STAGE 2',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','187','0','0','0','0',0,'1547','2009-05-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10529') +('0073291344024','DIAPERS STAGE 3',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','187','0','0','0','0',0,'1547','2009-05-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10530') +('0073291344025','DIAPERS STAGE 4',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','187','0','0','0','0',0,'1547','2009-05-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10531') +('0073291344026','DIAPERS STAGE 5',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','187','0','0','0','0',0,'1547','2009-05-21 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10532') +('0073291345001','7TH GEN MAXI OVERNIGHT',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10533') +('0073291345002','7TH GEN REG ULTRA THIN',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10534') +('0073291345003','7TH GEN ULTRA THIN OVERNIGHT',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10535') +('0073291345100','7TH GEN TAMP REGULAR',7.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10536') +('0073291345101','7TH GEN TAMP SUPER',7.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-11-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10537') +('0073291345102','7TH GEN TAMP SUPER PLUS',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10538') +('0073291355501','KITCHEN BAG,TALL,13 GAL',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10539') +('0073291355503','TRASH BAGS,LARGE,33 GAL',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10540') +('0073291500001','WONDERBOX,SINGLE,LITTERB',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-01-22 02:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10541') +('0073338390001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10542') +('0073338390002','PONION BAG RED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'633','2009-03-05 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10543') +('0073371015010','PFLOWER TULIPS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10544') +('0073402790145','GINGER CHEWS SOFT',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10546') +('0073402790203','GINGINS BOOST',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-08-22 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10547') +('0073402790302','SHORTBREAD, GINGER',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10548') +('0073402790303','ANZACA COOKIES,GINGER',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-01-14 11:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10549') +('0073402790401','GINGER,MINCED 6.7 OZ',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10550') +('0073402790402','GINGER,GRATED 6.7 OZ',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10551') +('0073402790403','GINGER,SUSHI,NATL PICKLED',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10552') +('0073402790505','GIN-GINS,HARD CANDY,BAG',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10553') +('0073402791009','GINGER SPREAD GINGER PEOPLE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10554') +('0073402791014','GINGER BABIES',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-04 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10555') +('0073402791015','GINGER CANDY, CANES',6.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-10-29 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10556') +('0073402792001','GINGER,OG, CRYSTALLIZED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','0','1','0',0,'0','2008-12-03 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10557') +('0073402799500','JUICE, GINGER SOOTHER',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10558') +('0073402799502','GINGER GIZER 120Z',1.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10559') +('0073402799512','GINGER GIZER 32OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-02-19 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10560') +('0073415894016','CONTE GNOCCHI G/F',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-05-29 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10561') +('0073449224014','ROASTED BRUSCHETTA',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-16 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12895') +('0073449231828','BREADSTICKS GARLIC HERB',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-08-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10562') +('0073449231829','BREAD STICKS PARM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-08-05 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10563') +('0073449240214','CRESTE DI GALLO PASTA',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2006-01-20 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10564') +('0073449270145','GRAPESEED OIL',12.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-12-03 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10565') +('0073449270345','BROTH,VEG,MIX,NATURAL 5 OZ',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','174','0','0','1','0',0,'0','2007-08-22 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10566') +('0073503702006','SUGAR,OG,RAPADURA WH CANE',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10567') +('0073503703001','SPREAD, OG, CHOC HAZELNT',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10568') +('0073503707100','BOUILLON,OG,VEG W/SEA SLT',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10569') +('0073503707200','BOUILLON,OG,VEG W/HERBS',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10570') +('0073503707300','BOUILLON,OG,VEG NO SALT',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10571') +('0073503750377','YEAST,OG,ACTIVE,DRY,RIZE',1.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-01-08 10:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10572') +('0073550061691','BUCKWHEAT HONEY',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-12-18 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10573') +('0073550061692','HONEY CLOVER BASSWOOD',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-08-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10574') +('0073550061694','HONEY,ORANGE BLOSSOM',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-08-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10575') +('0073550061695','MARQUETTE RAW HONEY',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'0','2008-08-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10576') +('0073591829869','PRESC FOR HERBAL HEALING',23.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-19 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10577') +('0073613354363','TOTE BAG WFC CLOTH',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'10578') +('0073613380002','COTTON LUNCH BAG',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-24 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12981') +('0073621000011','PSEEDS FLOWERS $1.39',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10579') +('0073621000012','PSEEDS FLOWERS $1.89',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10580') +('0073621000013','PSEEDS BALCK EYED SU',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10581') +('0073621000015','PSEEDS FLOWERS $1.59',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10582') +('0073621000016','PSEEDS BOT IN 269',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10583') +('0073621000017','PSEEDS MORNING GLORY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10584') +('0073621000021','PSEEDS VEGGIE $1.39',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10585') +('0073621000022','PSEEDS VEGGIE $1.89',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10586') +('0073621000023','PSEEDS BOT INT 239',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10587') +('0073621000024','PSEEDS VEGGIES $1.59',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10588') +('0073621000025','PSEEDS TOM HUSKY',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10589') +('0073621000031','PSEEDS HERBS $1.39',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10590') +('0073621000032','PSEEDS HERBS $1.89',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10591') +('0073621000034','PSEEDS HERBS $1.59',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10592') +('0073621000035','PSEEDS BOT IN 269',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10593') +('0073662200006','CORNICHONS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-11-05 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10594') +('0073753919040','SUNBUTTER CRUNCHY',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10595') +('0073753919120','SUNBUTTER,CREAMY',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10596') +('0073762800100','SAUCE,FISH',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10597') +('0073762800300','PASTE,CURRY,RED 4 OZ',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1580','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10598') +('0073762800400','PASTE,CURRY,GREEN',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1580','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10599') +('0073762800500','SAUCE,PEANUT SATAY',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10600') +('0073762800510','SAUCE,PAD THAI',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10601') +('0073762802525','STIR-FRY RICE NOODLES',2.75,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10602') +('0073762802530','THIN RICE NOODLES',2.75,'0',0.00,'0',1.99,'0',1.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10603') +('0073762802550','NOODLES,CURRY',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'1579','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10604') +('0073762802560','NOODLES,PAD THAI',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'1579','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10605') +('0073762802700','NOODLES,LEMON GRASS&CH',3.15,'0',0.00,'0',1.99,'0',1.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'0','2009-08-26 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','4',0.00,'0','12813') +('0073762802950','RICE NDL,LEMN GRASS&CHILI',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1613','2007-08-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10606') +('0073762803000','RICE NOODLES,GARLIC&VEG',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1613','2007-08-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10607') +('0073762804650','RICE NOODLES,ONION 1.6 OZ',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1613','2007-08-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10608') +('0073762804700','RICE NOODLES,CURRY',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1613','2007-08-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10609') +('0073762804750','RICE NOODLES,THAI GNG&VEG',0.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1613','2007-08-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10610') +('0073762806050','COCONUT MILK',1.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10611') +('0073762806450','STIR-FRY NOODLE,THAI PNUT',3.15,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'1579','2008-07-24 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10612') +('0073762807950','COCONUT MILK, OG',2.39,'0',0.00,'0',1.59,NULL,1.59,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10613') +('0073762809200','SAUCE,SWEET RED CHILI',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10614') +('0073769700058','PIZZA CRST,OG,OREG BASL',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10615') +('0073769700118','PIZZA CRST MIX-RSEMRY&BSL15 OZ',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10616') +('0073788000021','CROUTONS,OLIVE OIL&GARLI',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-12-03 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10617') +('0073788002140','W/F CAKE & COOKIE MIX',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10618') +('0073788003146','W/F COFFEE CAKE MIX',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10619') +('0073788006130','G/F CHOC TRUFFLE BROWNIE',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10620') +('0073788096010','W/F FAVORITE SANDWICH BRD',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10621') +('0073788096055','W/F PERFECT PIE CRUST',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10622') +('0073842910001','PAPPLE BAG PIPPEN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'697','2007-03-08 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10623') +('0073842910006','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10624') +('0073942311048','FLORAJEN 30 CAP',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10625') +('0073942344048','FLORAJEN 3 30 CAP',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10626') +('0073942366048','FLORAJEN3 60 CT',31.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10627') +('0074027500069','PRODUCE GREEN BAGS',13.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-27 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10628') +('0074027500075','DM CHEESE BAGS',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10629') +('0074069590001','PLETTUCE ROMAINE HEA',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10630') +('0074110200102','PCARROT BAG 2#',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'512','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10631') +('0074110201332','PLETTUCE ROMAINE HEA',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10632') +('0074124300200','PSWEET ONION BAGGED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'968','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10633') +('0074124300201','PONION BAG RED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'633','2009-03-05 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10634') +('0074124300289','PRTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10635') +('0074124300290','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10636') +('0074124300374','PPEPPER MINI SWEET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','0',0,'698','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10637') +('0074124301000','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10638') +('0074127300104','BACH RESCUE REM FOR KIDS 10ML',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-12-11 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10639') +('0074127300200','BACH EMOTIONAL EATING KIT',26.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-06-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10640') +('0074127300390','RESCUE REMEDY',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-04-24 09:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10641') +('0074127300392','RESCUE REMEDY',19.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-05-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10642') +('0074127300510','NELSONS HEMORRHOID CREAM 1 OZ',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2009-03-13 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10643') +('0074127301397','RESCUE REMEDY SPRAY 7ML',12.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10645') +('0074127301408','RESCUE SLEEP',13.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10646') +('0074127301451','BACH RESCREMEDY PASTILLES',7.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10647') +('0074127301463','RESCUE REMEDY CREAM',14.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'mixmatchcode','2009-03-13 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10648') +('0074127301500','BACH RESCUE REM FOR PETS 10ML',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-06-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10649') +('0074127301506','BACH RESCUE ENERGY 20ML',20.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12819') +('0074127320441','CENTAURY',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10653') +('0074127320451','CERATO',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10654') +('0074127320461','CHERRY PLUM',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10655') +('0074127320501','CRAB APPLE',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10657') +('0074127320561','HONEYSUCKLE',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10663') +('0074127320621','OAK',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10668') +('0074127320641','PINE',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10670') +('0074127320671','ROCK WATER',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10672') +('0074127320691','STAR OF BETHLEHEM',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10674') +('0074127320731','WALNUT',16.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'10677') +('0074286300410','CHESHIRE BLASERS',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-07-21 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10681') +('0074286300420','ABERGELE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-08 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10682') +('0074286302801','',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-07-23 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'10683') +('0074290000011','BWATER ONE GALLON REFILL',0.43,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','0','1','0',0,'0','2008-08-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'10684') +('0074290000025','BWATER FIVE GALLON REFILL',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','0','1','0',0,'0','2008-08-06 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'10685') +('0074447344031','ND,BAR,MULTI SAND,VAN MI',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10686') +('0074447344032','ND,SNDWCH,MINI,CHOCOLATE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'mixmatchcode','2009-02-17 09:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10687') +('0074447344034','NEAPOLITAN SAND',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10688') +('0074447347011','Purely Decadent Vanilla Bean',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10689') +('0074447347021','PURELY DEC CHOC W/COC MILK',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10690') +('0074447347033','PURELY DECADENT COCONUT',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10691') +('0074447347046','N/D,OG,COOKIE DGH W/COCN',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10692') +('0074447347055','PURELY DEC MINT CHIP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10693') +('0074447348001','N/D,OG,TURTLE TRAILS',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10694') +('0074447348073','N/D,OG,CHERRY NIRVANA',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10695') +('0074447370012','ND,BAR,OG CREAMY FUDGE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10696') +('0074447370031','ND,BAR,CREAMY RASPBERRY',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10697') +('0074447372011','N/D DSRT,OG,VANILLA CRMY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10698') +('0074447372021','N/D DSRT,OG,CHOCOLATE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10699') +('0074447390110','YOGURT PLN SOY DELIC',1.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2008-11-04 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10700') +('0074447391101','SO DEL BLUE COC MILK YOGURT',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10701') +('0074447391102','SO DEL RASP COC MILK YOGURT',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10702') +('0074447391104','YOGURT DR VAN COCNT MILK',2.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'10703') +('0074515830061','SPOTS STEW CAT, SALMON',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10704') +('0074515830063','SPOTS STEW CAT, LAMB',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10705') +('0074515834020','SPOTS STEW CAT,INDR,CHCK',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10706') +('0074515835021','SPOTS STEW CAT,INDR,SALM',19.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10707') +('0074515838020','SPOT STEW DOG, CHICKEN 18#',39.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10708') +('0074515838021','SPOTS STEW DOG,ADLT,SALM',39.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10709') +('0074515860040','SPOTS STEW DOG, CHICKEN 5OZ',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10710') +('0074515870031','SPOTS STEW DOG, LAMB 13OZ',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-04-09 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10711') +('0074515880023','SPOTS STEW DOG, SALMON',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-04-09 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10712') +('0074515890120','LIV-A-LITTLE,VEG PEANUT',4.65,'0',0.00,'0',3.49,'0',3.49,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','182','0','1','0','0',0,'0','2009-08-21 09:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12785') +('0074515890210','LIV-A-LITTLE,CHCKN&CHSE',4.65,'0',0.00,'0',3.49,'0',3.49,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','182','0','1','0','0',0,'0','2009-08-21 09:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12783') +('0074515890220','LIV-A-LITTLE,SKIN&COAT',4.65,'0',0.00,'0',3.49,'0',3.49,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','182','0','1','0','0',0,'0','2009-08-21 09:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12784') +('0074599841102','EQUAL EXCHANGE 12OZ COFFEE',8.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2009-01-09 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'10713') +('0074599890202','HOT COCOA,OG',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10714') +('0074599890301','CHOC BAR,OG,MILK',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1534','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10715') +('0074599890302','CHOC BAR,OG,VERY DARK',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1534','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10716') +('0074599890303','CHOC BAR,OG,DARK W/ALMNDS',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1534','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10717') +('0074599890304','CHOC BAR OG DK W/COCOA NIBS',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1534','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10718') +('0074599890305','CHOC BAR OG MINT EQ EXCH',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1534','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10719') +('0074599890306','CHOC BAR OR ESPRESSO EQUAL EX',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1534','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10720') +('0074759960098','BAKING BAR,SEMI SWT CHOC',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','1','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10721') +('0074759960106','BAKING BAR,CHOC UNSWTENED',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10722') +('0074759962001','HOT CHOCOLATE,DBL CHOC',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10723') +('0074759964011','CHIPS,DOUBLE CHOC CHIP 11.5 OZ',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10724') +('0074780510004','BATHTUB FILTER',42.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2006-10-27 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10725') +('0074808027446','MAG COOKS ILLUS SPECIAL',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2006-05-08 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'10726') +('0074823910505','PSTA SC,OG,FF,SWT PEPR&ON',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1556','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10727') +('0074823910507','PSTA SC,OG,FF,ZESTY BASIL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1556','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10728') +('0074823910521','PSTA SC,OG,LS, TOM&BASIL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1556','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10729') +('0074840400002','DRESSING,OG,ITAL HERB VG',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10730') +('0074840400003','DRESSING,OG,GRK FETA VGT',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10731') +('0074840400005','DRESSING, OG, FRENCH TOMATO',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2009-05-02 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10732') +('0074840400006','DRESSING,OG,FRENCH TOMAT',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'0','2008-12-26 12:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'10733') +('0074840401005','SEEDS, MARIGOLD DOUB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10734') +('0074840401006','PSEEDS LETTUCE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10735') +('0074840401010','SEEDS, CHARD GREEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10736') +('0074840401016','PSEED BLACK SW CORN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','0','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,NULL,NULL,NULL,'10737') +('0074840401020','SEEDS, CORN SWEET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10738') +('0074840401021','PSEED CUCUMBER CHAMP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10739') +('0074840401023','PSEED CUCUMBER PROL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10740') +('0074840401024','PSEEDS CUKE MARKETM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10741') +('0074840401028','PSEED ARUGULA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10742') +('0074840401029','PSEED BORAGE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10743') +('0074840401033','PSEED KALE RED RUSS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10744') +('0074840401034','PSEED KALE SIBERIAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10745') +('0074840401035','PSEED BUTTERCRUNCH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10746') +('0074840401036','PSEEDS LETTUCE PIRAT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10747') +('0074840401038','PLETTUCE SPECIALTY ROUGE D',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'949','2007-10-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10748') +('0074840401039','PSEED RED OAK LEAF',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10749') +('0074840401040','PSEEDS, ROMAIN RED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10750') +('0074840401041','PSEED LETTUCE SIMPSO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10751') +('0074840401042','PSEEDS SUCRINE LETT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10752') +('0074840401043','PSEED LETTUCE WINTER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10753') +('0074840401044','PSEED MUSKMELON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10754') +('0074840401046','PSEED WATERMELON CRI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10755') +('0074840401047','SEEDS, WATERMELN YLL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10756') +('0074840401050','PSEED MUSTARD GREEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10757') +('0074840401051','SEEDS, MUSTARD GREEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10758') +('0074840401052','PSEED ONION WALLA WA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10759') +('0074840401053','PSEED CABBAGE RED DR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10760') +('0074840401054','PSEED ANAHEIM CHILE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10761') +('0074840401058','PSEED JALAENO CHILE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10762') +('0074840401060','PSEED CHILE RIO GRAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10763') +('0074840401062','PSEED RADISH FR BREA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10764') +('0074840401065','PSEED ZUKE COCOZELLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10765') +('0074840401066','PSEEDS GOLDEN SQUASH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10766') +('0074840401067','PSEED ZUKE GOLDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10767') +('0074840401068','SEEDS, SQUASH CROOKN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10768') +('0074840401069','SEEDS, SQUASH BUTTNT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10769') +('0074840401070','PSEED SQUASH BUTTCP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10770') +('0074840401071','SEEDS, SQUASH DELICA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10771') +('0074840401074','SEEDS, SUNFLOW GLORI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10772') +('0074840401075','PSEED SUNFLOWER TARA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10773') +('0074840401076','SEEDS TOM BURBANK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10774') +('0074840401077','PSEED TOMATO CARO RI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10775') +('0074840401079','PSEEDS TOMATO 2X RIC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10776') +('0074840401080','PSEED TOMATO BUSH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10777') +('0074840401082','SEEDS TOM PASTE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10778') +('0074840401084','SEEDS TOM STUPICE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10779') +('0074840401085','PSEEDS FOX CHERRY TO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10780') +('0074840401086','PSEED TOMATO CHERRY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10781') +('0074840401087','SEEDS TOM CHERRY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10782') +('0074840401088','PSEED BASIL GENOVES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10783') +('0074840401089','SEEDS, BASIL GREEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10784') +('0074840401090','PSEED LEMON BERGAMOT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10785') +('0074840401092','PSEED CALENDULA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10786') +('0074840401094','PSEED CHAMOMILE GERM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10787') +('0074840401096','SEEDS, ECHINACEA PUR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10788') +('0074840401098','PSEED DILL MAMMOTH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10789') +('0074840401099','PSEED ANISE HYSSOP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10790') +('0074840401100','PSEED PARSLEY MOSS C',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10791') +('0074840401102','PSEED PARSLEY FOREST',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10792') +('0074840401103','PSEEDS SAVORY SUMMER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10793') +('0074840401104','PSEED E.H.AMARANTH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10794') +('0074840401108','PSEED GIANT DAHLIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10795') +('0074840401109','SEEDS, EVE PRIMROSE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10796') +('0074840401110','PSEED MIXED SEASHELL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10797') +('0074840401112','SEEDS, MARIGOLD AFRI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10798') +('0074840401113','SEEDS, MARIGOLD BROC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10799') +('0074840401114','PSEED NEMATOCI MARI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10800') +('0074840401116','SEEDS, POPPY CORNFIE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10801') +('0074840401119','PSEED STARFLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10802') +('0074840401121','PSEED NICOTIANA AZTE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10803') +('0074840401126','SEEDS, AMARANTH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10804') +('0074840401130','SEEDS, POPCORN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10805') +('0074840401131','SEEDS, CORN SW RAINB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10806') +('0074840401132','PSEED LETTUCE COSMO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10807') +('0074840401134','PSEED LETTUCE BRONZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10808') +('0074840401136','PSEED LETTUCE 4 SEA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10809') +('0074840401138','PLETTUCE SPECIALTY SANDRINA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'949','2007-10-08 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10810') +('0074840401139','PSEED LETTUCE TOM TH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10811') +('0074840401140','PSEED BRONZE LETTUCE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10812') +('0074840401143','SEEDS, LETTUCE ROUGE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10813') +('0074840401151','SEEDS, ENDIVE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10814') +('0074840401152','SEEDS, CRESS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10815') +('0074840401153','SEEDS, LAMBS EARS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','2008-12-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10816') +('0074840401157','PSEED SPINACH AMERIC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10817') +('0074840401158','PSEED SPINACH BLOOMS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10818') +('0074840401159','PSEEDS RUBY ORACH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10819') +('0074840401164','PSEED BEET LUTZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10820') +('0074840401167','PSEEDS FINGER CARROT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10821') +('0074840401170','PSEED DAIKON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10822') +('0074840401174','PSEED KALE RED URSA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10823') +('0074840401179','PSEEDS PURPLE TOMATI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10824') +('0074840401182','SEEDS, CUCUMBER PICK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10825') +('0074840401183','PSEED CUKE SMART PIC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10826') +('0074840401184','PSEED SUYO CUKE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10827') +('0074840401186','SEEDS TOM BRANDY WIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10828') +('0074840401197','SEEDS,TOMATO PASTE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10829') +('0074840401200','PSEED TURNIP GOLD BA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10830') +('0074840401204','SEEDS TOM YELLOW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10831') +('0074840401210','SEEDS, CHILE BOLIVIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10832') +('0074840401212','PFLOWER MARIGOLD BUT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10833') +('0074840401219','PSEED PEPPER HOT WAX',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10834') +('0074840401223','SEEDS CHILE RELLENO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10835') +('0074840401225','PCHILE SERRANO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10836') +('0074840401227','PSEED MORNING GLORY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10837') +('0074840401228','PSEED PEPPER SZEGEDI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10838') +('0074840401232','SEEDS, PIMIENTO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10839') +('0074840401234','PSEED PEPPER ORANGE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10840') +('0074840401236','PSEED PUMPKIN JACK-O',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10841') +('0074840401243','SEEDS, LARKSPUR BLUE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10842') +('0074840401253','PSEED SW WILL INTENS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10843') +('0074840401257','PSEED EGGPLANT JAPAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10844') +('0074840401270','PSEED BEAN PROVIDER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10845') +('0074840401271','PBEAN BUSH PURPLE',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10846') +('0074840401272','PSEED LIMA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10847') +('0074840401273','SEEDS, WAX BEAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10848') +('0074840401274','PSEED WAX BEAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10849') +('0074840401276','PSEED BEAN BLUELAKE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10850') +('0074840401302','SEEDS, POPPY HUNGARI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10851') +('0074840401306','PSEED JAN CABBAGE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10852') +('0074840401310','SEEDS, QUINOA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10853') +('0074840401318','PSEED BLACK RADISH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10854') +('0074840401326','PSEEDS CORN HOPI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10855') +('0074840401332','PSEED SUNFLOWER RUSS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10856') +('0074840401335','PSEED BASIL HOLY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10857') +('0074840401336','SEEDS LEMON BASIL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10858') +('0074840401337','SEEDS, BASIL CINNAMO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10859') +('0074840401339','PSEEDS LAVENDAR BERG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10860') +('0074840401340','PSEED CATNIP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10861') +('0074840401342','SEEDS, SUNFLOWER TIG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10862') +('0074840401344','PSEED DILL BOUQUET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10863') +('0074840401346','SEEDS CHIVES GARLIC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10864') +('0074840401349','PSEED LEEK PONCHO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10865') +('0074840401354','PSEED SUNFLOWER SUN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10866') +('0074840401356','SEEDS, MOTHERWORT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10867') +('0074840401358','SEEDS, MULLEIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10868') +('0074840401359','SEEDS COLLARDS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10869') +('0074840401360','PSEED PARSLEY ITALI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10870') +('0074840401365','PSEEDS ST JOHNS WORT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10871') +('0074840401366','SEEDS, SAGE CLARY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10872') +('0074840401367','PSEED SAGE GARDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10873') +('0074840401371','PSEEDS BLACK BEAUTY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10874') +('0074840401375','SEEDS, SORREL GARDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10875') +('0074840401377','SEEDS, TOBACCO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10876') +('0074840401382','PSEED CABBAGE EARLY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10877') +('0074840401383','PSEED CHRYSANTHEMUM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10878') +('0074840401389','SEEDS, ASTER GIANT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10879') +('0074840401390','PSEED BALLOON FLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10880') +('0074840401391','SEEDS, POPPY APRICOT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10881') +('0074840401393','PSEED MOONLIGHT MARI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10882') +('0074840401394','PSEED EBONY SHOO FLY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10883') +('0074840401396','PSEED ECHINACEA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10884') +('0074840401397','PSEED COSMOS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10885') +('0074840401398','SEEDS, COREOPSIS MAG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10886') +('0074840401399','SEEDS, BEETBERRY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10887') +('0074840401403','PSEEDS SILVERY FIR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10888') +('0074840401404','DAISY GLORIOSA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10889') +('0074840401409','SEEDS, NIGELLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10890') +('0074840401411','PSEED POPPY CALIFORN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10891') +('0074840401412','PSEED CARNATION POPP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10892') +('0074840401416','PSEED SUNFLOWER MEXI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10893') +('0074840401417','PSEEDS SWEET ANNIE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10894') +('0074840401422','SEEDS, BALSAM GARDEN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10895') +('0074840401423','SEEDS, ZINNIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10896') +('0074840401428','SEEDS, BROOMCORN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10897') +('0074840401430','SEEDS KALE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10898') +('0074840401432','SEEDS ZUKES CASERTA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10899') +('0074840401437','PSEEDS SQUASH HOPI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10900') +('0074840401441','SEEDS, VALERIAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10901') +('0074840401442','PSEED CABBAGE CHINES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10902') +('0074840401446','PSEED SQUASH BLUE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10903') +('0074840401449','PSEED CORN TRIPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10904') +('0074840401451','PSEED BASIL FINO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10905') +('0074840401452','PSEEDS BASIL GREEK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10906') +('0074840401457','PSEED CARROT RED COR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10907') +('0074840401460','PSEED CARROT ROYAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10908') +('0074840401461','PSEED CARROT ST VALE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'10909') +('0074840401462','PSEED CARROT NANTES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10910') +('0074840401465','SEEDS, BEET DARK DET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10911') +('0074840401467','SEEDS, RADISH CHERRY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10912') +('0074840401477','PSEED TURNIP PURPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10913') +('0074840401479','PSEED BUSH BLUE LAKE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10914') +('0074840401485','PSEED FENNEL BRONZE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10915') +('0074840401486','PSEED YARROW',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10916') +('0074840401487','PSEED CHINESE PINK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10917') +('0074840401490','PSEED LEEK FALLTIME',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10918') +('0074840401492','PSEED LEEK SHERWOOD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10919') +('0074840401499','PSEEDS BROCCOLI WALT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10920') +('0074840401505','PSEED CABBAGE CHINES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','208','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10921') +('0074840401507','PSEED RED DEER LETTU',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10922') +('0074840401508','SEED, JALEPENO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10923') +('0074840401513','SEEDS MANGOLD CHARD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10924') +('0074840401518','PSEED SQUASH SPAGHET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10925') +('0074840401525','PSEED BROCCOLI EARLY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10926') +('0074840401531','PSEED MOON AND STAR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10927') +('0074840401535','SEEDS, BRUSSEL SPROU',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10928') +('0074840401539','SEEDS, BEAN JACOB BU',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10929') +('0074840401540','PSEED SCARLET RUNNER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10930') +('0074840401541','PSEED BEAN ITALIAN P',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10931') +('0074840401543','PSEED EGGPLANT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10932') +('0074840401549','PSEED BROWN SWEDISH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10933') +('0074840401550','PSEED BASIL OPAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10934') +('0074840401552','BUSH BEAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10935') +('0074840401553','SEEDS, LUPINE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10936') +('0074840401555','PSEED MUSKEMELON HAL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10937') +('0074840401560','PSEED LETTUCE GEM',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10938') +('0074840401561','PSEED LETTUCE LONG S',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10939') +('0074840401564','PSEEDS VALENTINE LET',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10940') +('0074840401565','PSEED LETTUCE BRUNE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10941') +('0074840401567','PSEED LICORICE MINT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10942') +('0074840401569','PSEEDS ONION NEWBURG',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10943') +('0074840401570','PSEED TOMATO BLACK P',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10944') +('0074840401571','PSEED CHARD RHUBARB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10945') +('0074840401572','PSEED TATSOI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10946') +('0074840401576','PSEED CARROT ST VALE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'10947') +('0074840401577','PSEEDS WILD CHICORY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10948') +('0074840401582','PSEED LETTUCE BATAVI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10949') +('0074840401583','PSEED MUSKMELON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10950') +('0074840401585','PSEED ONION ROSSA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10951') +('0074840401586','PSEED PEPPER GREEN B',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10952') +('0074840401588','PSEED SQUASH R KURI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10953') +('0074840401589','SEEDS, CHIVES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10954') +('0074840401592','SEEDS, SAFFLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10955') +('0074840401599','PSEED THYME ENGLISH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10956') +('0074840401614','PSEED TOMATO THESS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10957') +('0074840401615','PSEED TIGER TOMATO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10958') +('0074840401616','PSEED BLUESPIRE LARK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10959') +('0074840401624','PSEED CALENDULA PAC',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10960') +('0074840401625','PSEED COREOPSIS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10961') +('0074840401626','SEEDS, DAISY SHASTA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10962') +('0074840401627','SEEDS, DAISY ZULU',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10963') +('0074840401629','PSEED MARIGOLD PIN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10964') +('0074840401630','SEEDS, SNAPDRAGON',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10965') +('0074840401634','PSEEDS PURIRA CHILE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10966') +('0074840401635','SEEDS, SUNFLOWER EVE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10967') +('0074840401636','SEEDS, CELOSIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10968') +('0074840401640','PSEED PEPPER RELLENO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10969') +('0074840401641','PSEED BEAN BLUE LAKE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10970') +('0074840401656','SEEDS, AGROSTEMA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10971') +('0074840401660','PSEED EGGPLANT IMPER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10972') +('0074840401676','PSEED TOMATILLO VERD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10973') +('0074840401679','PSEED RADISH CHAMP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10974') +('0074840401702','SEEDS, BASIL ANISE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10975') +('0074840401703','PSEED BASIL THAI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10976') +('0074840401704','PSEEDS DOTTED MINT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10977') +('0074840401707','SEEDS, BUTTERFLY WEE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10978') +('0074840401710','PSEED DILL DUKAT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10979') +('0074840401716','PSEED BLUE LOBELIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10980') +('0074840401719','PSEED MUGWORT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10981') +('0074840401724','PSEEDS SPILANTHES',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10982') +('0074840401727','PSEED TARRAGON MEX',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10983') +('0074840401728','PSEED CILANTRO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10984') +('0074840401729','SEEDS, CHERVIL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10985') +('0074840401733','PSEED BABYS BREATH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','2008-12-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10986') +('0074840401734','PSEED BACHELOR BUTTO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10987') +('0074840401735','SEEDS, BELLS OF EIRE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10988') +('0074840401746','SEEDS, NICOTIANA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10989') +('0074840401751','PSEED ZINNIA PERSIAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10990') +('0074840401753','PSEED CARDINAL FLOWE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10991') +('0074840401756','SEEDS, FIREWHEEL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10992') +('0074840401760','PSEED SUNFLOWER ISR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10993') +('0074840401762','SEEDS, CONEFLOW PRAI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10994') +('0074840401763','PSEED CALENDULA RED',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10995') +('0074840401765','PSEED CLEOME PURPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10996') +('0074840401767','SEEDS, PUSLANE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10997') +('0074840401772','PSEED CRESS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10998') +('0074840401776','SEEDS SAGE VICTORIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'10999') +('0074840401779','SEEDS, LETTUCE POLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11000') +('0074840401780','PSEEDS LETTUCE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11001') +('0074840401787','PSEEDS BROCCOLI NUTR',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11002') +('0074840401789','SEEDS CAULIFLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11003') +('0074840401790','PSEED PEA SHELL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11004') +('0074840401791','SEEDS, PEA SHELL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11005') +('0074840401792','PSEED PEA SNOW POD2',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11006') +('0074840401793','SEEDS PEAS SNAP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11007') +('0074840401794','PSEED OREGON PEA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11008') +('0074840401798','PSEEDS LETTUCE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11009') +('0074840401803','SEEDS, BEET CHIOGGIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11010') +('0074840401811','SEEDS, AMARANTH BLEE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11011') +('0074840401826','PSEED LEEK SCOTLAND',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11012') +('0074840401841','PSEED ZUKE WHITE EGY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11013') +('0074840401862','SEEDS, SAGE HUMMINGB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11014') +('0074840401875','SEEDS SUNFLOWER MIX',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11015') +('0074840401895','PSEED LETTUCE THAI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11016') +('0074840401901','PSEED MESCLUN SALAD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11017') +('0074840401907','SEEDS, COSMOS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11018') +('0074840401911','SEEDS, CABBAGE CHINE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11019') +('0074840401916','SEEDS, FOXGLOVE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11020') +('0074840401921','PSEED ZINNIA PINK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11021') +('0074840401924','PSEEDS KETUCKY POLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11022') +('0074840401946','PSEEDS LAVATERA MONT',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11023') +('0074840401970','SEEDS, FENNEL FINO',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11024') +('0074840404400','PSEED BRIGHT COSMOS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11025') +('0074840404428','PSEEDS POPPY PESHAWA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11026') +('0074840404429','PSEED PORTULACA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11027') +('0074840404436','PSEED NIGELLA CURIOS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11028') +('0074840404437','PSEEDS BEAN CHEROKEE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11029') +('0074840404440','PSEED SUNFLOWER JERU',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11030') +('0074840404443','PSEED ZINNIA PURPLE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11031') +('0074840404445','PSEED SUNFLOWER MIRI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11032') +('0074840404446','PSEED SUPER CELOSIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11033') +('0074840404448','PSEED BASIL RED RUBI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11034') +('0074840404452','PSEED YELLOW COSMOS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11035') +('0074840404454','PSEED SUNFLOWER HOPI',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11036') +('0074840404455','PSEED TOMATO MATINA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11037') +('0074840404459','PSEED FLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11038') +('0074840404466','PSEED BROCOLLI RAAB',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11039') +('0074840404495','PSEED MORNING GLORY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11040') +('0074840404497','PSEED ZINNIA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11041') +('0074840404500','PSEED BEAN BURGUNDY',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11042') +('0074840404514','PSEED RUTABAGA JOAN',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11043') +('0074840404533','PSEED PEAS SNAP',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11044') +('0074840404538','PSEEDS HABANERO CHIL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11045') +('0074840404757','PSEED GA. COLLARD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','0','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,NULL,NULL,NULL,'11046') +('0074840404995','PSEED BULLS BLOOD BE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11047') +('0074840405003','PSEED DAISY SO AFRIC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11048') +('0074840405005','PSEED FLOWER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','1','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11049') +('0074840425886','SIMMER SAUCE OG KORMA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1605','2007-07-19 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11050') +('0074840425889','SIMMER SAUCE OG TIKA MAS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1605','2007-07-19 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11051') +('0074840425890','SIMMER SAUCE OG JALFREZI',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1605','2007-07-19 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11052') +('0074840425891','SIMMER SAUCE OG MADRAS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1605','2007-07-19 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11053') +('0074875310161','BARTLT PEAR HLV,OG,CANNED 15.2',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11054') +('0074875314441','PJU CG RASP PEACH SMOOTHIE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','2007-09-13 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11055') +('0074875314446','PJUICE CG MANGO COGO',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'746','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11056') +('0074875317271','PJUICE CG RASP CRAN',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'748','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11057') +('0074875317371','PJU CG SUPERBERRY',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','554','0','0','1','0',0,'0','2007-09-13 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11058') +('0074875317671','PJUICE CG RED GINGER LIMEADE',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1139','2007-09-24 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11059') +('0074875320162','PITTED CHERRIES, OG, CANNED',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2006-11-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11060') +('0074875330163','PEACH HALVES,OG,CANNED 15 OZ',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','156','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11061') +('0074875377771','PJUICE CG WILD BLACKBERRY',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1140','2007-09-13 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11062') +('0074875390002','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11063') +('0074875390003','PAPPLE BAG LIBERTY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1213','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11064') +('0074875390018','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11065') +('0074875390110','PPEAR BAG BARTLET',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11066') +('0074875390125','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11067') +('0074875390528','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11068') +('0074875391119','PJUICE CG ORANGE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'747','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11069') +('0074875391219','PJUICE CG GRAPEFRUIT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1138','2007-09-24 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11070') +('0074875391619','PJUICE CG TANGERINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'749','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11071') +('0074875399991','PJUICE CG APPLE GINGER',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'742','2008-09-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11072') +('0074882482223','WORLD CATCH CRAB CAKES MRYLND',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-07-24 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11073') +('0074917409120','DRAIN OPENER',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11074') +('0074917409412','NON-ABRASIVE CRM CLEANSER 16 O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11075') +('0074917409700','DISHMATE,ALMOND',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11076') +('0074917409720','DISHMATE PEAR',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11077') +('0074917409722','DISHMATE,GRAPEFRUIT 25 OZ',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11078') +('0074917409727','DISHMATE,LAVENDER 25 OZ',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11079') +('0074917409747','WAVE JET AUTO DISH RINSE',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'499','2009-07-22 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11080') +('0074917409773','ICE MELT',13.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2008-12-12 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11081') +('0074917409888','ULTRA LIQ ECOS,MAGNOLI 100Z',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11082') +('0074917409889','ULTRA LIQ ECOS FREE CLEAR',12.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11083') +('0074917409909','ICE MELT',13.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','181','0','1','0','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11085') +('0074917479300','WINDOW CLEANER SPRAYER',3.55,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2009-08-14 10:05:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11086') +('0074917479706','CLEANER,ORANGE PLUS SPRA',3.55,'0',0.00,'0',3.15,'0',3.15,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'mixmatchcode','2009-08-14 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11087') +('0074917479707','STAIN & ODOR REMOVER',3.89,'0',0.00,'0',3.39,'0',3.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11088') +('0074917479731','FURNITURE POLISH/SPRAYER',4.35,'0',0.00,'0',3.85,'0',3.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'499','2009-08-14 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11089') +('0074917479735','FRUIT& VEG WASH/SPRAYER',3.75,'0',0.00,'0',3.29,'0',3.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','181','0','1','0','0',0,'499','2009-08-14 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11090') +('0074951222310','IANS CHICKEN NUGGETS',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11091') +('0074951222312','IANS CHICK PATTIES',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-08-22 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11092') +('0074951222350','IANS GF CHICK NUGS',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'499','2009-08-20 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11093') +('0074951243417','CHICKEN POT PIE',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11094') +('0074951258575','FISH STICKS,WF,GF',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11095') +('0074951277220','PANKO BREAD CRUMBS ITALIAN',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11096') +('0074951277330','PANKO BREAD CRUMBS ORIG',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','167','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11097') +('0074960101201','BERLIN BREAD SPELT',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11098') +('0074960101202','BREAD,SPELT SPROUTED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11099') +('0074960101203','BERLIN WHITE SPELT BREAD',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2009-01-06 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11100') +('0074960101206','BREAD,SPELT SOURDOUGH,Y/F',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11101') +('0074960108201','BERLIN ZUCCHINI HOLIDAY BREAD',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-29 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11102') +('0074960108202','BERLIN PUMPKIN STREUSEL BREAD',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2007-10-29 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11103') +('0074998501001','AUBREY GPB SHAMPOO 11 OZ',9.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-06-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11104') +('0074998504001','AUBREY MENS SHAMPOO GIN BIO',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-07-06 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11105') +('0074998504003','AUBREY MENS SCALP TONIC',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'mixmatchcode','2009-01-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11106') +('0074998504004','AUBREY MENS HAIR GEL',9.55,'0',0.00,'0',6.99,'0',6.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','96','0','1','0','0',0,'0','2007-07-06 08:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11107') +('0074998504027','AUB FAC MASK DRY',7.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2005-11-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11109') +('0074998504075','AUB FAC MASK OILY',8.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2005-11-26 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11110') +('0074998504081','AUBREY ALOE VERA',7.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2006-05-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11111') +('0074998504125','AUBREY GRN TEA MOISTUR SPF',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11112') +('0074998504250','AUBREY SUN GREEN TEA SPF 25',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11113') +('0074998504254','AUBREY SUN SPF 8',7.35,'0',0.00,'0',4.39,'0',4.39,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11114') +('0074998504760','AUBREY SEA BUCKTHORN CREAM',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-25 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11115') +('0074998504806','AUBREY BL GR ALGAE MOIST SPF',15.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2006-04-26 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11116') +('0074998507211','AUBREY SWIMMERS SHAMPOO',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-17 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11117') +('0074998507811','AUBREY SWIMMERS CONDITIONER',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-05-17 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11118') +('0074998508060','AUBREY SUPER HOLD HAIRSPRAY',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2006-08-10 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11119') +('0074998508258','AUBREY SUN MAINTENANCE',10.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','76','0','1','0','0',0,'0','2006-05-04 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11120') +('0074998509911','AUBREY GPB CONDITIONER 11 OZ',9.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2008-06-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11121') +('0075005450001','PSPROUTS ALFALFA NON-O',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11122') +('0075005450007','PSPROUTS SPICY',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1022','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11123') +('0075005450017','PSPROUTS ALFALFA NON-O',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11124') +('0075038800020','WESTBY NF COTTAGE CHS 24 OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2009-09-22 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12964') +('0075038800215','WESTBY 2% COTTAGE CHS 16 OZ',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2009-09-22 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12965') +('0075038800220','COTTAGE CHEESE,2% 24OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'499','2009-09-22 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11125') +('0075038810105','WESTBY LF SOUR CREAM 8 OZ',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2009-09-25 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12993') +('0075038810115','WESTBY SOUR CREAM 16 OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'499','2009-09-22 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12966') +('0075038810121','WESTBY LF SOUR CREAM 16 OZ',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'499','2009-09-22 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12967') +('0075038820101','BUTTER,rBGH FREE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'0','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11126') +('0075098000132','NO JET LAG',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2008-03-12 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11127') +('0075194488006','PHERB BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11128') +('0075194488007','PHERB MARJORAM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'919','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11129') +('0075194488010','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11130') +('0075194488013','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11131') +('0075194488021','PHERB LEMONGRASS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'918','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11132') +('0075194498002','PHERB BASIL 3/4 OZ CLAMSHELL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'902','2007-10-18 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11133') +('0075194498004','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11134') +('0075194498006','PHERB BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11135') +('0075194498008','PHERB SPEARMINT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'935','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11136') +('0075194498009','PHERB OREGANO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'924','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11137') +('0075194498010','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11138') +('0075194498011','PHERB SAGE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'931','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11139') +('0075194498012','PHERB TARRAGON',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'937','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11140') +('0075194498013','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11141') +('0075197202101','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11142') +('0075197202201','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11143') +('0075197203100','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11144') +('0075197203102','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11145') +('0075197203200','PLIMES BAG 1#',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'758','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11146') +('0075197204100','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11147') +('0075253600023','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11148') +('0075253600088','PAPPLE BAG HONEYCRISP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11149') +('0075365670751','FRT BAR,CASHEW ACAI',1.65,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-02-26 10:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11150') +('0075365670757','FRT BAR, CHOC POM POWER',1.65,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2008-11-06 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11151') +('0075365670760','FRT BAR PEANUT GOJI GLOW',1.65,'0',0.00,'0',1.19,NULL,1.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2008-11-06 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11152') +('0075379200101','PBERRY CRANBERRY NON-O',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'733','2008-11-25 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11153') +('0075413012345','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11154') +('0075413012350','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'824','2008-01-21 03:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'11155') +('0075413012351','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11156') +('0075413012352','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11157') +('0075535500100','PNUT BTTR FILLED PRETZEL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-09-11 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12870') +('0075535500516','VEGGIE CRINKLE CHIPS 10 OZ',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11158') +('0075535510037','SOUTH FRANCE LIME BASIL BAR',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-11-18 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11159') +('0075535510039','SOUTH FRANCE ACAI POM SOAP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-11-18 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11160') +('0075536101201','LIQUID FISH',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11161') +('0075589100603','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11162') +('0075589101101','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11163') +('0075589118056','PBERRY RASPBERRY 1/2',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11164') +('0075728130033','SPROUT JAR 1/2 GAL',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11165') +('0075764500020','POPS CORN,OG,MICRO,BUTTER',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11166') +('0075764500021','POPS CORN,OG,MICRO,LT BTR',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11167') +('0075764500022','POPS CORN,OG,MICRO,FF,N/S',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11168') +('0075764500200','PRETZEL STICKS,OG,SALTED',3.25,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11169') +('0075764500500','PRETZEL ROUNDS,OG,SLT & PEPPER',3.25,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11170') +('0075764500800','THIN PRETZELS,OG,SALTED',3.25,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','158','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11171') +('0075764501043','CUPS,OG,MILK CHOC,PNT BTR',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1593','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11172') +('0075764501044','CUPS,OG,DARK CHOC,PNT BTR',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1593','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11173') +('0075764501045','CUPS,OG,DARK CHOC,PEPMNT',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1593','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11174') +('0075764501600','MINTS OG CINNAMON',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11175') +('0075764501610','MINTS OG GINGER TIN',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'mixmatchcode','2009-02-10 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11176') +('0075764501620','MINTS OG PEPPERMINT',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11177') +('0075764501630','MINTS OG WINTERGREEN',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11178') +('0075764501660','MINTS,OG,ROLL,PEPPERMINT',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-20 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11179') +('0075764501670','MINTS,OG,ROLL,WINTERGREE',0.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-11-20 10:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11180') +('0075764502200','FIG NEWMANS,OG,FAT FREE',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11181') +('0075764502207','FIG NEWMANS,OG,LF',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11182') +('0075764502212','FIG NEWMANS,OG,W/F,D/F',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11183') +('0075764502240','COOKIE,OG,CRM FILLED CHOC',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'1562','2009-03-19 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11184') +('0075764502242','COOKIE,OG,CHOCOLATE CREME',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'1562','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11185') +('0075764502244','COOKIE,OG,MINT CREME',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'1562','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11186') +('0075764502247','NEWMANS GINGER 0s',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'1562','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11187') +('0075764502250','COOKIES,OG,ALPHABET,CHOC',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11188') +('0075764502251','COOKIES,OG,ALPHABET,CINN',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11189') +('0075764502260','HERMITS OG ORIGINAL',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11190') +('0075764561200','DOG FOOD,OG,CHKN&RCE,CAN 12.7',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11191') +('0075764561205','DOG FOOD,OG,CHICKEN,CAN 12.7 O',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11192') +('0075764561305','DOG TREATS,OG,SMALL,CHCKN 10 O',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11193') +('0075764561320','DOG TREATS, CHEESE',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-09-24 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12983') +('0075764561325','DOG TREATS,OG,SMALL,CHEES 10 O',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11194') +('0075764561400','PET TRAIN TRTS OG CHCKN RICE',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-02-25 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11195') +('0075764562205','CAT FOOD,OG,CHCKN&SLMN,CN',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11196') +('0075764562210','CAT FOOD,OG,TURKEY,CAN',1.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11197') +('0075764566000','DOG FOOD,OG,ADULT HEALTHY 25',51.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-01-23 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11198') +('0075764566010','DOG FOOD OG ADLT CHKN RCE 7LB',20.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11199') +('0075764566100','DOG FOOD,OG,ADVANCED 25LB',51.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'499','2009-06-05 12:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11200') +('0075764566105','DOG FOOD OG ADV CHKN RCE 12LB',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11201') +('0075764567010','CAT FOOD ADLT CHK RICE 4LB',22.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11202') +('0075777601129','PAPPLE BAG ORIN',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'593','2009-08-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11203') +('0075792204355','WAFERS,OG,VANILLA FILLED',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11204') +('0075792204379','WAFERS,OG,CHOCOLATE FILLD',2.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11205') +('0075792211614','COFFEE,OG,FREEZE DRIED',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11206') +('0075792211615','COFFEE,OG,FREEZE DRD,DECF',10.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-11-18 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11207') +('0075859101102','TODDY COLD BREW SYSTEM',39.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-31 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11208') +('0075859101103','TODDY FILTERS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-01 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11209') +('0075891312354','EXTRA LIFE PROD DISK',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11210') +('0075928300011','COOKIES,FUDGE/MINT',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11211') +('0075928300012','COOKIES, FUDGE STRIPE',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'mixmatchcode','2009-03-27 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11212') +('0075928310003','RICE THINS,WHITE CHEDDAR 4 OZ',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11213') +('0075928310004','CRACKERS CRISPY WHEAT',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'mixmatchcode','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11214') +('0075928310045','CRACKERS,OG, STONEGROUND WHEAT',3.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11215') +('0075928320024','STICK COOKIES,HNY GRAHAM 8 OZ',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11216') +('0075928360011','BOCA CHIKN PATTIES',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'mixmatchcode','2009-05-08 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11217') +('0075928360014','CHIKN PATTIES SPICY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'499','2009-05-08 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11218') +('0075928360015','BURGER,OG,VEGAN,VEG',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11219') +('0075928360016','BURGER,OG,AMERICAN CLASIC',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11220') +('0075928360106','BOCA GROUND CRUMBLES',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11221') +('0075928360112','BOCA CHIKN NUGGETS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'mixmatchcode','2009-05-08 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11222') +('0076059010071','ENERGY BAR,OG,ORIGINAL',2.15,'0',0.00,'0',1.39,NULL,1.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1568','2009-02-13 11:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11223') +('0076059010072','ENERGY BAR,OG,CHOC CRISP',2.15,'0',0.00,'0',1.39,NULL,1.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1568','2009-02-13 11:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11224') +('0076059010074','ENERGY BAR,OG,LUSHUS LMN',2.15,'0',0.00,'0',1.39,NULL,1.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1568','2009-02-13 11:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11225') +('0076059010075','ENERGY BAR,OG,ORIG W/ALMD',2.15,'0',0.00,'0',1.39,NULL,1.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'1568','2009-04-10 12:03:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11226') +('0076086007122','HOLIDAY SPIRIT CANDLE',12.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-11-20 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11232') +('0076086007133','CHRISTMAS TREE CANDLE',12.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-11-20 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11233') +('0076086072150','PALM TAPERS RED',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11234') +('0076086072180','PALM TAPERS BLUE',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11235') +('0076086072190','PALM TAPER GREEN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11236') +('0076086072310','PALM TAPERS IVORY ALOHA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11237') +('0076086072320','PALM TAPERS ORANGE ALOHA',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11238') +('0076086084240','HIMALAYAN SALT LAMP',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-07-30 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11239') +('0076086084290','CANDLE TEA LIGHTS 12PK',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11240') +('0076148800005','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11241') +('0076165790104','CHEVRIOTTE GOAT CAMEMBERT MT C',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11242') +('0076165790331','CROTTIN, PLAIN',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-12-08 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11243') +('0076165790333','CROTTIN, 4-PEPPER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-02 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11244') +('0076165790336','CROTTIN GARLIC & HRB',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-12-08 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11245') +('0076165790411','MONT CH FRESH',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11246') +('0076165790414','MONT CH CRAN CINN',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11247') +('0076165790416','MONT CH HERB GARLIC',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11248') +('0076165790419','MONT CH TOMATO BASIL',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11249') +('0076165792413','MONT CH PEPPEDEW',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11250') +('0076194488010','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11251') +('0076245300081','PPOTATO BAG YELLOW',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11252') +('0076245335001','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11253') +('0076302600046','DATE & CRAB APPLE SPREAD',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-08-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12765') +('0076324719891','PSPROUTS ALFALFA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11254') +('0076324719912','PSPROUTS BROCCOLI',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1369','2009-02-25 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11255') +('0076437581556','CAT LITTER,FELINE PINE',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-10-06 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11256') +('0076443067707','EARTH SOL BREATHE EASY',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11257') +('0076443067708','EARTH SOL STAY ALERT',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11258') +('0076443067709','EARTH SOL STUDY BUDDY',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11259') +('0076443067724','EARTH SOL STESS LESS INHALER',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11260') +('0076443067725','EARTH SOL APP CONTROL',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11261') +('0076443067927','EARTH SOL PMS CONTROL',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11262') +('0076443067928','EARTH SOL INHALER SMOKE LESS',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11263') +('0076443068241','EARTH SOL MENO PAUSE INHALER',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11264') +('0076443068242','EARTH SOL HANG HELP',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11265') +('0076443068243','EARTH SOL LUCID DREAMS',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11266') +('0076443068244','EARTH SOL WORLD PEACE',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11267') +('0076443068245','EARTH SOL INSOMNIA REL',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'499','2009-07-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11268') +('0076566730010','SAUCE, CHINESE STIR FRY',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11269') +('0076566730020','SAUCE, PAD THAI',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11270') +('0076566730050','SAUCE,KUNG PAO',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11271') +('0076570411202','ESSIAC TONIC 2 OZ',21.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11272') +('0076570413361','Smoke Free Spray',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11273') +('0076570431901','HERBS ETC CHLOROOXYGEN',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11274') +('0076570450303','HERBS ETC DEEP SLEEP 30 CT',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11275') +('0076570450306','HERBS ETC DEEP SLEEP 60 CT',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-04-29 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11276') +('0076570450966','SMOKE FREE',23.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11277') +('0076596500258','TOM BASIL GOUDA',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11278') +('0076596500500','CHEESE CURDS CAJUN EICHTENS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2006-12-05 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11279') +('0076596500501','CHEESE CURDS EICHTENS',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-08-17 07:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11280') +('0076596505001','CHEESE CURDS ZESTY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'mixmatchcode','2009-02-13 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11281') +('0076596505002','CHEDDAR CURDS WHITE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-02-13 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11282') +('0076596506823','EICHTENS SMOKED STRING 8oz',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-06-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11283') +('0076596507101','EICHTENS GARLIC SPREAD',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-15 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11284') +('0076596507102','EICHTENS HERB SPICE SPREAD',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11285') +('0076596507103','EICHTENS HORSERADISH SPREAD',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11286') +('0076596507104','Eichtens spread- tom basil',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-01-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11287') +('0076596507105','Eichtens spread- smoky Bison',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-01-23 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11288') +('0076596507110','EICHTENS PORT WINE SPREAD',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11289') +('0076668400900','PCARAMEL DIP 18OZ',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'1066','2008-10-10 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11290') +('0076738700009','PASTA, SPAGHETTI THIN',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-10-15 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11291') +('0076738700011','PASTA, ANGEL HAIR',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-10-15 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11292') +('0076738700017','PASTA, LINGUINE',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-10-15 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11293') +('0076738700134','PASTA, FETTUCINE',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2008-10-15 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11294') +('0076770700118','CHEDDAR IRISH DUBLIN',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-02-10 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11295') +('0076777600210','PBERRY CRANBERRY CLAMSHELL',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11296') +('0076777600921','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11297') +('0076777600926','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11298') +('0076777600928','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11299') +('0076777600929','PAPPLE BAG HONEYCRISP',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11300') +('0076777601041','PAPPLE BAG RDELICIOU',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11301') +('0076777601104','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11302') +('0076777601121','PAPPLE BAG CAMEO',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1211','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11303') +('0076777601129','PAPPLE BAG ORIN',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'1096','2009-08-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11304') +('0076777601185','PAPPLE BAG GRANNY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11305') +('0076777601188','PAPPLE BAGE GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12910') +('0076777601721','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11306') +('0076777601761','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11307') +('0076777602135','PAPPLE BAG G DELICIO',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'533','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11308') +('0076777602894','PAPPLE BAG MACINTOSH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'692','2006-10-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11309') +('0076777603776','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11310') +('0076777604127','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11311') +('0076777608221','PAPPLE BAG JONAGOLD',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'534','2008-10-08 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11312') +('0076777609082','PAPPLE BAG MACINTOSH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'692','2006-10-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11313') +('0076777610119','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11314') +('0076777610121','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11315') +('0076777610806','PAPPLE BAG SOMMERFELD',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'505','2007-09-13 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11316') +('0076777610913','PAPPLE BAG HONEYCRIS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11317') +('0076777611008','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11318') +('0076777611028','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11319') +('0076777611214','PPEAR BAG DANJOU',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'635','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11320') +('0076777611219','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11321') +('0076777630033','PPEAR BAG BARTLETT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','545','0','0','1','0',0,'630','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11322') +('0076777630927','PAPPLE BAG AMBROSIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'515','2007-09-17 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11323') +('0076777650412','PAPPLE BAG GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11324') +('0076777670125','PPEAR BAG BOSC',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','546','0','0','1','0',0,'801','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11325') +('0076777680824','PAPPLE BAG MACINTOSH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'692','2006-10-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11326') +('0076777690001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11327') +('0076777690105','PAPPLE BAG MUTSU',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'627','2007-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11328') +('0076777690125','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11329') +('0076777690603','PCHERRY RAINIER',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','556','0','0','1','0',0,'729','2009-08-04 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11330') +('0076777690613','PAPPLE BAG GALA TRAN',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11331') +('0076777690729','PAPPLE BAG GRAVENSTI',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'574','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11332') +('0076777690807','PAPPLE BAG RED DELIC',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11333') +('0076777690925','PAPPLE BAG ORIN',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','541','0','0','1','1',0,'702','2007-11-01 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11334') +('0076865900012','PHERB BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11335') +('0076865900014','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11336') +('0076865900018','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11337') +('0076865900019','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11338') +('0076865900020','PHERB TARRAGON',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'937','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11339') +('0076865900021','PHERB MARJORAM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'919','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11340') +('0076865900023','PHERB OREGANO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'924','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11341') +('0076865900031','PHERB POULTRY MIX',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'929','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11342') +('0076890403777','PAPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11343') +('0076899001710','NN KIDS DHA STRAWBERRY 90 CAPS',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11344') +('0076899001720','NN CHILDRENS DHA 180 CT',26.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11345') +('0076899001741','NN PRENATAL DHA 90 CT',32.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11346') +('0076899001770','NN COMPLETE FORMULA LEMON 60CT',22.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-04-29 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11347') +('0076899001790','NN ULTIMATE OMEGA 60 CT',30.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11348') +('0076899002763','NN OMEGA 3 LIQUID LEMON',27.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2006-08-22 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11349') +('0076899002764','NN OMEGA 3 16 OZ',49.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-28 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11350') +('0076899030120','NN NORDIC BERRIES 120 CT',24.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'0','2008-02-28 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11351') +('0076899030140','NN OMEGA 3 FISHIES 30 CT',30.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11352') +('0076899041760','OMEGA 3 FISH GEL LEMON 60 CAPS',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2005-06-22 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11353') +('0076899054785','NN ARCTIC COD ORANGE 8 0Z',26.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11354') +('0076899057785','NN ARCTIC COD LEMON 90 CAPS',24.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11355') +('0076899058783','NN ARCTIC D COD LIVER OIL 8 OZ',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-11-19 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11356') +('0077000900111','COFFEE FILTER,BASKETS',2.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11357') +('0077000900112','COFF FILTER #2 CONE BRWN IYC',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'mixmatchcode','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11358') +('0077000900114','COFF FILTER #4 CONE BRWN',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11359') +('0077000901048','BAKING CUPS,BROWN-2.5',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11360') +('0077000912011','ALUMINUM FOIL,RECYCLED 50 SQ F',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11361') +('0077087700920','PARCHMENT PAPER ROLL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11362') +('0077257000050','MODUCARE',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-08-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11363') +('0077257000060','MODUCHOL',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-08-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11364') +('0077387634469','SUGAR SAVER FAIRY',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-08 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11365') +('0077387634503','SUGAR SAVER BEE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11366') +('0077387634504','SUGAR SAVER SUNFLWR',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-05-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11367') +('0077425567120','PCUCUMBERS SEEDLESS HYDROPONIC',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','525','0','0','1','0',0,'878','2005-04-08 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11368') +('0078005308200','PROBIO CAPRICIN',17.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-06-15 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11369') +('0078035378418','PBERRY STRAWBERRY PI',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11370') +('0078035378421','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11371') +('0078035378424','PBERRY RASPBERRY 1/2',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11372') +('0078096100055','CREAM OF BALSAMIC',18.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11374') +('0078096103018','RASPBERRY LIQUER PRESERVES',7.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-11-28 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11375') +('0078099900341','MIXER,BLOODY MARY COCKTL',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-06-19 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11376') +('0078099900351','MIXER,MOJITO COCKTAIL',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-06-19 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11377') +('0078099900361','MIXER,TRAD MARGARITA CKT',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-06-19 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11378') +('0078099900371','MIXER,LEMON DROP COCKTAI',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-06-19 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11379') +('0078099900381','MIXER,COSMOPOLITAN COCKT',6.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-06-19 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11380') +('0078172800003','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11381') +('0078202962301','SALSA LISA MEDIUM 16Z',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-11-04 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11382') +('0078202962303','SALSA LISA HOT 16Z',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-11-05 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11383') +('0078212600100','TAMPONS,OG,REGULAR',6.19,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11384') +('0078212600200','TAMPONS,OG,SUPER',6.19,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11385') +('0078212600300','PANTY SHIELDS',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11386') +('0078212600301','PADS,SLENDER',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11387') +('0078212600302','PADS, REGULAR',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11388') +('0078212600303','PADS,SUPER',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11389') +('0078212600306','PANTY SHIELDS,CURVED',3.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11390') +('0078212600340','NCARE MATERNITY PADS',5.75,'0',0.00,'0',3.45,'0',3.45,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','100','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11391') +('0078212600360','NCARE NURSING PADS',3.99,'0',0.00,'0',2.39,'0',2.39,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','100','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11392') +('0078212600800','TAMPONS,OG,REG W/APPLICTR',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11393') +('0078212600900','TAMPONS,OG,SUPER W/APPLCT',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','0','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11394') +('0078264300030','MUSTARD,STOUT STONEGRND 8 OZ',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11395') +('0078275811002','SHELLED EDAMAME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11396') +('0078275812001','EDAMAME IN SHELL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11397') +('0078292712341','BASIL PESTO',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-01-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11398') +('0078292712348','DAIRY FREE PESTO',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-01-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11399') +('0078292712350','GARLIC SPIKE PESTO',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2005-01-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11400') +('0078397920001','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11401') +('0078500232413','FILLO DOUGH, OG',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-05-08 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11402') +('0078503000002','PASTA SCE,OG,GRLC&MERLOT 14 OZ',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1610','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11403') +('0078503000003','PASTA SCE,OG,PORT&PARMESN 14 O',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1610','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11404') +('0078503000010','RAVIOLI,OG,GARLIC & MOZZ',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11405') +('0078503001194','PASTA SCE,OG,GARLIC&BASIL 14 O',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1610','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11406') +('0078503002000','PIZZA,OG,MARGHERITA',8.69,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11407') +('0078503002001','PIZZA,OG,FOUR CHEESE',8.69,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11408') +('0078503002004','PIZZA,OG,PESTO&BUFFAL MO',8.69,'0',0.00,'0',5.99,NULL,5.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','44','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11409') +('0078503002006','RISING MOON MANICOTTI',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11410') +('0078503002007','RISING MOON PRIMACOTTA',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11411') +('0078503011692','RAVIOLI,OG,CHANTRL MUSHRM',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11412') +('0078503012345','RAVIOLI,OG,FETA HAZELNUT',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11413') +('0078503022770','RAVIOLI,OG,VGN,SPNCH FLO',3.90,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11414') +('0078503031168','RAVIOLI,OG,GRLC GORGNZOLA',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11415') +('0078503044444','PASTA SCE,OG,GRLC&CHANTRL 14 O',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'1610','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11416') +('0078503055555','RAVIOLI OG BASIL ASIAGO',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-12-08 12:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11417') +('0078503055556','RAVIOLI,OG,VG,CRMY ARTICH',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11418') +('0078503055557','RAVIOLI,OG,VG,BTRNT SQUA',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11419') +('0078503055559','TORTELLONI,OG,4 CHEESE',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-14 02:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11420') +('0078503055561','RAVIOLI,OG,CHEESE&SPINACH',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11421') +('0078506300217','CAPERS',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','0','0',0,'0','2007-04-30 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11422') +('0078603500042','SEA PEARL SPONGE TAM',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','100','0','1','0','0',0,'499','2009-07-20 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11423') +('0078621688200','BUG BAND SNG',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11424') +('0078621688201','BUG BAND SNG',4.75,'0',0.00,'0',2.85,'0',2.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-06-19 02:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11425') +('0078621688202','BUGBAND PINK',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-15 04:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11426') +('0078621688203','BUG BAND SINGLE',4.75,'0',0.00,'0',2.85,'0',2.85,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-06-30 06:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11427') +('0078621688204','BUG BAND SNG',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11428') +('0078621688205','BUG BAND SNG',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11429') +('0078621688206','BUG BAND FAMILY PACK',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-12 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11430') +('0078621688207','BUG BAND SNG',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2008-06-19 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11431') +('0078644167000','BABY FOOD GRINDER KI',14.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-14 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11432') +('0078664808002','NEEM AURA CITRONELLA INCENSE',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','86','0','1','0','0',0,'0','2007-06-15 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11433') +('0078679100210','BEELERS PORK BREAKFAST LINKS',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-09-18 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11434') +('0078679100507','BEELER LIL BITES',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-08-13 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11435') +('0078679100603','BEELER BACON CHEDDAR BRATS',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-08-29 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11436') +('0078679100710','BEELER PRE COOKED BACON',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-06-25 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11439') +('0078679101000','BEELER BRATWURST',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-03-19 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11440') +('0078679101061','HAM,SLICED DINNER',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2005-10-27 12:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11441') +('0078679109101','BEELER BACON',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-09-18 11:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11442') +('0078679109105','BACON HOG WILD',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11443') +('0078696901005','OIL,OLIVE,OG,EX VIRGIN',14.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-11-14 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11446') +('0078696901013','OIL,OLIVE,OG,EX VIRGIN 16.9 OZ',11.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11447') +('0078696903007','VINEGAR,SHERRY,15 YR 12.7 OZ',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11448') +('0078764710103','HEEL TRAUMEEL TABS 100CT',19.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','104','0','1','0','0',0,'0','2007-07-19 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11449') +('0078764710177','HEEL TRAUMEEL CREAM 1.76 OZ',19.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2008-03-26 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11450') +('0078774822879','SWHEAT 14LBS',12.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11451') +('0078774822890','CAT LITTER SWHEAT SCOOP',35.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-01-22 01:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11452') +('0078928710032','GEORGES ALOE 32 OZ',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','0','1','0',0,'0','2008-09-04 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11453') +('0078928710098','GEORGES ALOE VERA GALLON',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-03-03 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11454') +('0078928711017','GEORGES ALOE SPRAY MISTER',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-04-19 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11455') +('0078962252504','PGARLIC BAG 16OZ',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1300','2005-06-02 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11456') +('0078962252544','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11457') +('0078962252549','PCELERY BUNCH',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11458') +('0078962252555','PAPPLE BAG RED DELICIOUS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11459') +('0078962252557','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11460') +('0078962252558','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11461') +('0078962252559','PAPPLE BAG GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11462') +('0078962252560','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11463') +('0078962252565','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11464') +('0078962252570','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11465') +('0078962252574','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11466') +('0078962252577','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11467') +('0078962252587','PBERRY STRAWBERRY PINT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11468') +('0078962252628','PCELERY HEARTS',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'544','2009-07-29 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11469') +('0078962252926','POTATO BAG YUKON',5.99,'0',0.00,'0',5.29,'0',5.29,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','519','0','0','1','0',0,'516','2009-09-16 07:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11470') +('0078962253008','PKIWIFRUIT BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','1','0',0,'549','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11471') +('0078962253026','PGRAPEFRUIT BAG 4#',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11472') +('0078962253031','PCARROT BABY 1#',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'865','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11473') +('0078962253035','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11474') +('0078962270224','PSALAD SPRING MIX BAG',3.29,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','521','0','0','1','0',0,'669','2009-04-22 07:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11475') +('0078962270227','PSALAD BABY SPIN GH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11476') +('0078962270228','PSALAD BABY ROMAINE GH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11477') +('0078962270229','PBABY SPINACH FAMILY SIZE',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1148','2005-12-13 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11478') +('0078962290101','PPOTATO BAG RED',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11479') +('0078962290202','PCARROT BAG 2#',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'512','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11480') +('0078962290433','PLETTUCE ROMAINE HEA',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11481') +('0078962290447','PSALAD SPRING MIX CLAM 5 OZ',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-18 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11482') +('0078962290504','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11483') +('0078962290514','PDRESSING BLUE CHEESE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'881','2008-10-24 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11484') +('0078962290515','PDRESSING GH BUTTER RANCH',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1014','2009-08-26 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11485') +('0078962290516','PDRESSING GODDESS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'883','2008-10-25 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11486') +('0078962290517','PDRESSING ROMANO CAESAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'885','2008-10-25 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11487') +('0078962290518','PDRESSING CHIPOTLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'882','2008-10-25 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11488') +('0078962290580','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11489') +('0078962290590','PPOTATO RED BAG 3-LB',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','0','0',0,'499','2009-06-19 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11490') +('0078962290611','PSALAD BABY SPINACH',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'666','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11491') +('0078962290612','PSALAD SPRING MIX CLAM 5 OZ',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-18 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11492') +('0078962290649','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11493') +('0078962290682','PJUICE LEMON SHOT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'755','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11495') +('0078962290683','PJUICE LIME SHOT',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'761','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11496') +('0078962290711','PGRAPEFRUIT BAG 4#',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11497') +('0078962290721','PLIME BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'758','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11498') +('0078962290825','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11499') +('0078962290830','GRATEFUL HARVEST OG HAM UNCURE',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2008-03-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11500') +('0078962290834','GRATEFUL HARVEST OG CHICK BREA',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2008-03-11 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11501') +('0078962290954','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11502') +('0078962290955','papple bag fuji',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-12 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12884') +('0078962290956','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','6',0.00,'0','12808') +('0078973810010','PROSEED GSE 90 CT',16.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-08-21 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12788') +('0078973810030','PROSEED EARDROPS',6.69,'0',0.00,'0',4.35,'0',4.35,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','101','0','1','0','0',0,'0','2006-12-05 09:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11503') +('0078973810050','PROSEED GSE OUCH',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2007-01-30 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11504') +('0079022310002','DYNAMIC HEALTH PROBIOTIC 16 OZ',8.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-05-13 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11505') +('0079087400101','SALSA OG MILD DREWS',3.85,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'0','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11506') +('0079087400102','SALSA,OG,MEDIUM',3.85,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'499','2009-08-14 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11507') +('0079087400105','SALSA OG CHIPOTLE LIME',3.85,'0',0.00,'0',2.49,NULL,2.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','161','0','0','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11508') +('0079087437392','DRESSING,SMOKED TOMATO',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11509') +('0079087437394','DRESSING,GARLIC&PEPPRCRN',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11510') +('0079087437399','DRESSING,SESAME ORANGE',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11511') +('0079087437414','DRESSING,ROMANO CAESAR',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11512') +('0079087437415','DRESSING,GARLIC ITALIAN',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11513') +('0079087437416','DRESSING, BUTTERMILK RANCH',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2008-04-16 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11514') +('0079087437419','DRESSING POPPY SEED',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','173','0','0','1','0',0,'1522','2007-06-11 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11515') +('0079112020050','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11516') +('0079112080005','PONION PEARL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'629','2008-11-05 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11517') +('0079155915000','BROWN RICE PIZZA CRUST',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-04-17 09:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11518') +('0079156727848','PSALAD ARUGULA',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11519') +('0079156728736','PBURDOCK ROOT PACKAGED',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'859','2009-01-16 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11520') +('0079156749821','PSOUP MIX',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'694','2008-11-04 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11521') +('0079156752523','PSALAD SPRING MIX BAG LOCAL',3.29,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','521','0','0','1','0',0,'669','2009-05-30 09:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11522') +('0079156766590','PPEPPER MINI SWEET PINTS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','0',0,'698','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11523') +('0079156768213','PTOMATO CHERRY YELLOW GRAPE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11524') +('0079156772883','psaute mix',3.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','529','0','0','1','0',0,'1191','2005-07-05 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11525') +('0079156777462','BSALAD SAVOY SPINACH BAG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1144','2006-05-09 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11526') +('0079157260016','COLD SNAP',4.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-05-13 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11527') +('0079157260060','COLD SNAP',14.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2007-09-12 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11528') +('0079183310002','HOLYLAND BABA GHANOUG 8Z',4.39,'0',0.00,'0',3.49,'0',3.49,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11530') +('0079183310018','HOLY LAND HUMMUS GARLIC 8Z',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11534') +('0079183310020','HOLYLAND BASIL TOM HUMMUS',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-11-05 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11535') +('0079183310022','HOLY LAND HUMMUS EGYPTIAN 8Z',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11536') +('0079183310029','HOLY LAND HUMMUS RSTD RED PEP',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11537') +('0079183310040','HOLY LAND GREEK STYLE HUMMUS',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11542') +('0079183310041','HOLY LAND HUMMUS GRLC ARTCHK',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11543') +('0079183310050','HOLY LAND HUMMUS DUAL 7 OZ.',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2009-05-08 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11544') +('0079183320002','HOLY LAND OG WHEAT POCKET',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11546') +('0079183320021','HOLY LAND GREEK NAN PITA',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','2',0.00,'0','12942') +('0079183320026','HOLY LAND GREEK NAN PITA',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'499','2009-09-18 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11550') +('0079183320029','HOLYLAND LEBANESE BREAD',2.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-09-21 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11551') +('0079183320037','HOLY LAND LAVASH BREAD',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','34','0','0','1','0',0,'0','2008-11-29 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11552') +('0079245325900','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11558') +('0079245385900','PMANDARIN SATSUMA BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'779','2007-09-17 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11559') +('0079265601000','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11560') +('0079265605000','PLEMON BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11561') +('0079285000063','BURTS BEES MENS GROOM KIT',17.99,'0',0.00,'0',11.75,'0',11.75,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','95','0','1','0','0',0,'0','2009-01-14 08:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11563') +('0079285000112','BBEES PEPP ROSE BODY WASH 12OZ',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11564') +('0079285000172','BBEES ACNE SOL SPOT TREATMENT',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11565') +('0079285000179','BBEES ACNE SOL PORE SCRUB',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11566') +('0079285000181','BBEES ACNE SOL GEL CLEANSER',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11567') +('0079285000213','BBEES 25TH ANN STARTER KIT',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-04-20 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11568') +('0079285000350','BBEES POM SOY SH CON TW PK',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-08-21 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12790') +('0079285005099','BURTS BEES CARROT NIGHT CREME',13.75,'0',0.00,'0',8.99,'0',8.99,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','94','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11570') +('0079285005199','BURTS BEES CARROT DAY CREME',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11571') +('0079285005399','BURTS BEES MILK HONEY LOTION',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11572') +('0079285006899','BURTS BEES ORANGE FACE CLEANS.',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11574') +('0079285006999','BURTS BEES COC FOOT CREAM',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-01-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11575') +('0079285007799','BBEES CARROT SEED OIL',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-04-13 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11576') +('0079285008499','AVOCADO HAIR TREATME',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-01-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11577') +('0079285010499','BURTS BEES MINI HAND SALVE',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11578') +('0079285010599','BURTS BEES HAND SALVE',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','90','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11579') +('0079285010999','BURTS BEES LIP BALM TIN',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11580') +('0079285011099','BURTS BEES LIP BALM TUBE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11581') +('0079285011399','BURTS BEES POISON IVY SOAP',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-06-03 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11582') +('0079285013111','BBEES HERBAL DEOD 4 FL OZ',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'0','2008-04-20 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11583') +('0079285013399','BURTS BEES BEESWAX NIGHT CREME',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11585') +('0079285013699','BBEES HONEY LIP BALM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11586') +('0079285013799','BURTS BEES BEESWAX DAY CREME',13.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11587') +('0079285015299','BURTS BEES INSECT REPELLANT',6.99,'0',0.00,'0',4.19,'0',4.19,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11588') +('0079285015499','BURTS BEES BUG BITE RELIEF',6.75,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','90','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11589') +('0079285015799','BURTS BEES POMEGRANATE LIPBALM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11590') +('0079285015999','BBEES ALL IN ONE WASH',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-07-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11591') +('0079285019499','BBEES AFTER SUN SOOTHER',9.25,'0',0.00,'0',5.55,'0',5.55,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2008-08-01 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11592') +('0079285019599','BURTS BEES LIP BALM LIFEGUARDS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11593') +('0079285023299','BBEES CITRUS GINGER SOAP 7.5OZ',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-07-16 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11594') +('0079285023499','BBEES HAND SANITIZER 2 OZ',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2008-07-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11595') +('0079285028999','BURTS BEES ROSE GLYC TONER',9.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-01-11 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11597') +('0079285029199','BURTS BEES SHEA HAND CREME',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11598') +('0079285032099','BBEES NAT AGELESS DAY LOTION',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'mixmatchcode','2009-01-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11599') +('0079285032199','BBEES NAT AGELESS EYE CREME',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'mixmatchcode','2009-01-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11600') +('0079285032299','BBEES NAT AGELESS NIGHT CREME',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'mixmatchcode','2009-01-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11601') +('0079285032399','BBEES NAT AGELESS REPAIR SERUM',22.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'mixmatchcode','2009-01-29 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11602') +('0079285032699','BBEES SUN PROTECT LIPBALM SPF8',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11603') +('0079285033599','BBEES EXFOLIATING BODY WASH',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'0','2009-06-10 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11604') +('0079285036599','BURTS BEES DUSTING POWDER',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11605') +('0079285056899','BURTS BEES MENS BAR SOAP',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-01-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11606') +('0079285056999','BBEES MENS SHAVE CREAM 6 OZ',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-09-25 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11607') +('0079285057500','BBEES MENS DEODORANT',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','88','0','1','0','0',0,'mixmatchcode','2009-01-29 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11608') +('0079285058899','BBEES AFTERSHAVE 2.5 OZ',7.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-09-25 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11609') +('0079285060199','FOOT CARE KIT',11.75,'0',0.00,'0',7.59,'0',7.59,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-01-11 03:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11611') +('0079285064499','BBEES HONEY SHEA BODY BUTTER',11.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-02-27 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11612') +('0079285064599','BBEES MAC NUT BODY BUTTER',11.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2007-11-09 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11613') +('0079285070999','BURTS BEES BUTTERMILK SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11615') +('0079285071699','BURTS BEES BUTTERMLK LOTION',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','0','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11616') +('0079285073599','BURTS BEES DIAPER OINTMENT',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2008-05-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11617') +('0079285074899','BBEES DIAPER OINTMENT 3 OZ',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11618') +('0079285078399','BBEES RESQ LIP BALM',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12822') +('0079285088799','BBEES HERBAL BLEMISH STICK',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-02-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11619') +('0079285088999','BBEES SOAP BARK CHAM CLEANSER',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2007-05-07 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11620') +('0079285089199','BURTS BEES PEACH PORE SCRUB',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11621') +('0079285094999','BURTS BEES TIPS N TOES KIT',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11622') +('0079357344053','POTTERS CRACKERS',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11623') +('0079357348483','GRANOLA, CRAPOLA, OG',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2008-10-23 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11624') +('0079421300003','SUNSHINE BRG,OG,VEG',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11625') +('0079421300013','BURGER SUNSHINE SOUTHWEST',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-12 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11626') +('0079452220012','TEA,HERBAL,REFRESH 20 BAG',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11627') +('0079452220034','TEA, WILD SWEET ORANGE',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11628') +('0079452220045','TEA,HERBAL,PASSION 20 BAG',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11629') +('0079452220098','TEA,OG,GREEN,OM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11630') +('0079452220201','TEA,ASSORTED PACK',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11631') +('0079471691101','PIZZA SAUCE OLD WORLD',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11632') +('0079471691114','PIZZA CRUST, SOURDOUGH',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11633') +('0079471691117','PIZZA CRUST, TUSCAN 6GRN',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11634') +('0079471691203','PIZZA CRUST THIN ITAL CRS',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-04-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11635') +('0079471691424','PIZZA CRUST, CHEESY HERB',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','2','0','0',0,'0','2008-10-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11636') +('0079471691429','PIZZA CRUST ULT WHL GRN',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'0','2009-04-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11637') +('0079523920060','TEECCINO HERBAL COFFEE HAZLNUT',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2009-01-07 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11638') +('0079523920080','HERBAL COFFEE,MOCHA',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-02-08 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11639') +('0079523920110','MAYA CAFFEE ORGANIC',9.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'0','2008-06-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11640') +('0079523980060','HERBAL COFFEE, ORG, HAZELNUT',9.35,'0',0.00,'0',6.69,NULL,6.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','245','0','0','1','0',0,'499','2009-09-08 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11641') +('0079523980080','HRBL COFFEE,OG,MOCHA',9.35,'0',0.00,'0',6.69,NULL,6.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','245','0','0','1','0',0,'499','2009-04-16 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11642') +('0079523980110','HRBL COFFEE,OG,MAYA CAFFE',9.35,'0',0.00,'0',6.69,NULL,6.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','245','0','0','1','0',0,'499','2009-04-16 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'11643') +('0079563167002','PRADISHES BAG NON-O',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','520','0','0','1','0',0,'682','2009-05-20 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11644') +('0079570901004','WALLABY,LF,ORNG/PASNFRT',1.15,'0',0.00,'0',0.89,'0',0.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11645') +('0079570901007','WALLABY,OG,LF,CHERRY',1.15,'0',0.00,'0',0.89,'0',0.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11646') +('0079570901014','WALLABY,LF,BAN VANILLA',1.15,'0',0.00,'0',0.89,'0',0.89,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','35','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11648') +('0079570903004','WALLABY,NF,BLACKBERRY',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11651') +('0079570903005','WALLABY NF MANGO LIME',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-06-02 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11652') +('0079570903009','WALLABY,OG,NF,STWBRY GUAVA',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'499','2009-08-11 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11654') +('0079592236365','FIBERMATE TABLETS 160CT',21.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11655') +('0079592236368','FIBERMATE POWDER 2.5 OZ',17.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11656') +('0079592236382','ALOE LIFE DETOX FORM',17.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11657') +('0079592236383','ALOE LIFE STOMACH FORMULA',17.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-07-16 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11658') +('0079651530072','PREMIUM SHOWER FILTER',45.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-27 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11659') +('0079651530073','SPLISH SPLASH NAT BATH FILTER',42.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11660') +('0079651530077','SHOWER FILTER RPLCMT',27.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-18 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11661') +('0079651530078','BATHTUB FILTER RPLCMT',29.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-12 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11662') +('0079651582000','SS WATER BOTTLE LITER',15.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-03-20 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11663') +('0079651582002','SS WATER BOTTLE 40 OZ',22.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-16 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11664') +('0079651582003','WATER BOTTLE SS 12OZ SPORT CAP',10.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-05-14 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11665') +('0079651583008','PLASTIC SPORTS CAP',1.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-27 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12817') +('0079651583009','SS WATER BOTTLE LID',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-03-20 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11666') +('0079921011111','OLIVE OIL,OG,EX VIRGIN 17OZ',14.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-01 06:02:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11667') +('0079921011250','VINEGAR,OG,BALSAMIC',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','160','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11668') +('0079921017501','OLIVE OIL,OG,EX VIRGIN 25.4Z',20.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2008-08-01 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11669') +('0079921022224','FRUIT SPREAD,OG,PLUM',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11670') +('0079921022227','FRUIT SPREAD,OG,WILD BERY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11671') +('0079921022228','FRUIT SPREAD,OG,BILBERRY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11672') +('0079921022231','FRUIT SPREAD OG SOUR CHERRY',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','164','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11673') +('0079921037501','FRUIT NECTAR,OG,APRICOT',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11674') +('0079921037502','FRUIT NECTAR,OG,PEACH',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11675') +('0079921037506','FRUIT NECTAR,OG,BILBERRY',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11676') +('0079921037510','FRUIT NECTAR,OG,STRAWBERY',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11677') +('0079921037511','FRUIT NECTAR,OG,WILD BERY',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','165','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11678') +('0079921043401','PASTA,OG,SPAGHETTI,G/F',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'0','2007-11-09 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11679') +('0079921043403','PASTA,OG,PENNE RIGATE,G/F',4.85,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'0','2007-11-09 10:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11680') +('0079921054540','PASTA,OG,LASAGNA',4.25,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11681') +('0079921055551','PASTA,OG,SPAGHETTI',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11682') +('0079921055552','PASTA,OG,RIGATONI',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11683') +('0079921055553','PASTA,OG, PENNE RIGATE',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11684') +('0079921055554','PASTA,OG,FUSILLI',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11685') +('0079921055555','PASTA,OG,CHIOCCIOLE',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11686') +('0079921064549','PASTA,OG,GOBBETTI,WW',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11687') +('0079921066661','PASTA,SPAGHETTI,OG.WW',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11688') +('0079921066664','PASTA,OG,FUSILLI,WW',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11689') +('0079921066665','PASTA,OG,PENNE RIGATE,WW 16OZ',3.39,'0',0.00,'0',1.99,NULL,1.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'1564','2008-06-12 11:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11690') +('0079921082502','PASTA,OG,PAPPARDELLE,EGG',4.15,'0',0.00,'0',2.99,NULL,2.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','170','0','0','1','0',0,'0','2008-06-12 11:04:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11691') +('0079921092001','TOMATO PASTE,OG',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','177','0','0','1','0',0,'499','2009-08-14 10:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11692') +('0079942488200','PMANDARIN SATSUMA BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'779','2007-09-17 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11693') +('0079951201101','GELATO,VANILLA',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:00:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11694') +('0079951201103','CIAO BELLA CHOC HZLNT GELATO',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1','0','2',0.00,'0','12974') +('0079951201104','PISTACHIO GELATO',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11695') +('0079951201105','GELATO,HAZELNUT',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11696') +('0079951201106','GELATO,ESPRESSO',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11697') +('0079951201110','DULCE DE LECHE GELATO',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11698') +('0079951201153','MALTED MILK BALL GELATO',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11699') +('0079951201203','SORBET,COCONUT',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11700') +('0079951201204','SORBET,MANGO',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11701') +('0079951201205','SORBET,RASPBERRY',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11702') +('0079951201210','SORBET,BLOOD ORANGE',5.15,'0',0.00,'0',3.99,'0',3.99,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','39','0','0','1','0',0,'499','2009-09-24 11:01:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11703') +('0079985700101','PHERB SPEARMINT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'935','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11705') +('0079985700201','PHERB TARRAGON',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'937','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11706') +('0079985700301','PHERB POULTRY MIX',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'929','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11707') +('0079985700311','PHERB HOLIDAY MIX',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'914','2008-12-26 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11708') +('0079985700331','PHERB PASTA MIX',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'926','2007-10-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11709') +('0079985700341','PHERB SEAFOOD MIX',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'934','2007-10-08 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11710') +('0079985700342','PHERB SEAFOOD MIX',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'934','2007-10-08 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11711') +('0079985700401','PHERB MARJORAM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'919','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11712') +('0079985700501','PHERB OREGANO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'924','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11713') +('0079985700502','PHERB OREGANO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'924','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11714') +('0079985700601','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11715') +('0079985700602','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11716') +('0079985700801','PHERB SAGE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'931','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11717') +('0079985700802','PHERB SAGE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'931','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11718') +('0079985700895','PHERB SAGE GOLDEN',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'931','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11719') +('0079985700901','PHERB SAVORY',0.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','1',0,'933','2008-05-06 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11720') +('0079985701001','PHERB SORREL',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','0','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,NULL,NULL,NULL,'11721') +('0079985701101','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11722') +('0079985701102','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11723') +('0079985701201','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11724') +('0079985701301','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11725') +('0079985701302','CHIVE BOX',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11726') +('0079985702001','PHERB BASIL 3/4 OZ CLAMSHELL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'902','2007-10-18 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11727') +('0079985702101','PHERB SPEARMINT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'935','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11728') +('0079985702102','PHERB SPEARMINT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'934','2007-10-08 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11729') +('0079985702301','PHERB LAVENDER',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'916','2009-02-03 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11730') +('0079985702701','PHERB BABY EPAZOTE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','409','0','0','0','0',0,'909','2009-06-11 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,NULL,NULL,NULL,'11731') +('0079985703001','PHERB BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11732') +('0079985703002','PDILL WEED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11733') +('0079985703401','PHERB BASIL 4OZ PESTO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11734') +('0079985703501','PHERB BASIL 3/4 OZ CLAMSHELL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'902','2007-10-18 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11735') +('0079985703502','PHERB BASIL 3/4 OZ CLAMSHELL',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'902','2007-10-18 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11736') +('0079985703701','PHERB BAY LEAVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'659','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11737') +('0079985703702','PHERB BAY LEAVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'659','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11738') +('0079985703801','PHERB LEMONGRASS',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'918','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11739') +('0079985703901','PHERB KAFFIR LIME LEAVES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'915','2007-10-08 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11740') +('0079985710010','PPEAS SNAP',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','0',0,'979','2009-08-30 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11741') +('0079985711001','PHERB SPEARMINT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'935','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11742') +('0079985765520','PTOMATO CHERRY RD PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11743') +('0079985765523','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11744') +('0079985765524','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11745') +('0079985765525','PTOMATO CHERRY MEDLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11746') +('0079985765526','PTOMATO CHERRY DELCA',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11747') +('0079985765530','PTOMATO CHERRY SGR P',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11748') +('0079985765531','PTOMATO CHERRY PLUM',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11749') +('0079985765532','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11750') +('0079985765560','PTOMATO CHERRY YELL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11751') +('0079985765561','PTOMATO CHERRY RED P',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11752') +('0079985765590','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11753') +('0079985766500','PTOMATO CHERRY VINE-ON',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'1035','2007-10-11 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11754') +('0079985766590','PTOMATO CHERRY VINE-ON',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'1035','2007-10-11 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11755') +('0079986703401','PHERB BASIL 4OZ PESTO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11756') +('0080154110761','ORGANIC INDIA PSYLLIUM',14.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-05-08 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11757') +('0080154150000','TULSI TEA OG ORIGINAL',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11758') +('0080154150001','TULSI TEA CHAI MASALA',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11759') +('0080154150003','TULSI TEA OG POM GREEN',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11760') +('0080154150008','TULSI TEA LEMON GINGER',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11761') +('0080154150014','TULSI TEA OG RED MANGO',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11762') +('0080154150016','TULSI TEA OG SWEET ROSE',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11763') +('0080245800013','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11764') +('0080245800014','PTOMATO GRAPE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'11765') +('0080245800092','PPEPPER MINI SWEET MIX',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','518','0','0','1','0',0,'698','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11766') +('0080245810007','PTOMATO ROMA VINE ON',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','1',0,'1030','2009-07-24 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11767') +('0080487906863','ALOTTI CHOCOLATE 6 PACK BAG',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-06-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11768') +('0080487906864','Alotti Ginger 6 pack',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-06-29 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11769') +('0080487906867','Alotti P Butter 6 pack',9.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2008-06-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11770') +('0080500200005','HERBAN COWBOY SHAVE BRUSH',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2007-05-04 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11771') +('0080500200039','H.C MILLED SOAP DUSK',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-04-14 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11772') +('0080500200044','HERBAN COWBOY SHAVE SOAP DUSK',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-05-13 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11773') +('0080735610215','LORENTZ WR ASIAGO BRATWURST',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-04-09 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11774') +('0080735610405','LORENTZ TRADITIONAL BRATWURST',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-04-09 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11775') +('0080735610715','LORENTZ CHEDDAR BRATWURST',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-04-09 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11776') +('0080735610720','LORENTZ PEPPERJACK BRATWURST',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-04-09 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11777') +('0080735640140','LORENTZ HOT DOGS',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-04-30 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11778') +('0080790600022','PSPROUTS ALFALFA',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1021','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11779') +('0080790600024','PSPROUTS SALAD BLEND',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1023','2009-02-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11780') +('0081020400112','PBERRY BLUBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11781') +('0081020400129','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11782') +('0081024924500','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11783') +('0081047400109','CHOC BAR,OG,MOON,DRK 74%',2.95,'0',0.00,'0',2.39,'0',2.39,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1572','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11784') +('0081047400110','CHOC BAR,OG,LAVND,DRK 59%',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1572','2008-12-12 09:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11785') +('0081047400111','CHOC BAR,OG,MINT,DRK 59%',2.95,'0',0.00,'0',2.39,'0',2.39,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'1572','2008-12-12 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11786') +('0081047400114','DAGOBA XOCOLATL',2.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'1572','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11787') +('0081053300725','PJUICE VOLCANO 250 ml',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1092','2008-04-01 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11788') +('0081053300775','PJUICE TANGERINE VOLCANO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'750','2009-05-22 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11789') +('0081053300825','PJUICE VOLCANO BLOOD 250ML',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1092','2008-04-01 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11790') +('0081053300875','PJUICE BLOOD ORANGE VOLCANO',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'741','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11791') +('0081053300996','PLEMON BURST',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'755','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11792') +('0081053300997','PLIME BURST',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'761','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11793') +('0081053300998','PLIME JUICE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'761','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11794') +('0081053300999','PLEMON JUICE',1.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'755','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11795') +('0081076600114','SCHULTZ ORG CHICKEN BFAST LNKS',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'mixmatchcode','2009-03-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11796') +('0081076600120','SCHULTZ CHICKEN ITALIAN SAUS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'mixmatchcode','2009-02-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11797') +('0081076600121','SCHULTZ CHICKEN SAGE SAUSAGE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'mixmatchcode','2009-02-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11798') +('0081076600123','SCHULTZ CHICKEN ANDOUILLE SAUS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'mixmatchcode','2009-02-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11799') +('0081076600216','SCHULTZ ORGANIC GROUND CHICKEN',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'mixmatchcode','2009-03-03 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11800') +('0081076600316','SCHULTZ OG GROUND TURKEY',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2009-05-20 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11801') +('0081127100151','TRUWHIP WHIPPED TOPPING',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','46','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11802') +('0081129900210','MAPLE SUGAR, 1# WISCONSIN',10.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'mixmatchcode','2009-02-23 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11803') +('0081163800610','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11804') +('0081204900610','PBERRY BLUBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11805') +('0081204900640','Blueberries',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'499','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11806') +('0081204900690','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11807') +('0081204900905','PBERRY RASPBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11808') +('0081204900906','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11809') +('0081204900910','PBERRY BLUEBERRY NON-O 6OZ',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11810') +('0081204900917','PBERRY BLUBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11811') +('0081204900920','PBERRY BLUEBERRY P',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'1341','2009-07-30 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11812') +('0081204900940','PBERRY CRANBERRY PT',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11813') +('0081204900950','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11814') +('0081204900951','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11815') +('0081204921500','PBERRY RASPBERRY 1/2',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11816') +('0081204922500','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11817') +('0081204924500','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11818') +('0081204924501','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11819') +('0081241000014','FILLET,SALMON,W/MARINADE',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-03 09:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11820') +('0081241000019','WHITE SHRIMP,OG,EASY PEEL',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-08-21 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'11822') +('0081241000026','FISH NUGGETS',6.59,'0',0.00,'0',4.99,NULL,4.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11823') +('0081241000031','SALMON BURGER',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11824') +('0081241000038','FISH NUGGETS, GF',8.15,'0',0.00,'0',6.49,'0',6.49,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'mixmatchcode','2009-02-25 12:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11825') +('0081264701000','Black Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12836') +('0081264701002','BLACK VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11826') +('0081264701003','Brown Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12831') +('0081264701005','OLIVE CHICO BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-31 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12827') +('0081264701006','Mango Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12832') +('0081264701007','Green Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12830') +('0081264701008','Pink Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12834') +('0081264701009','PURPLE CHICO BAG',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-31 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12837') +('0081264701010','Red Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12835') +('0081264701011','ORANGE VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11827') +('0081264701012','OLIVE VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11828') +('0081264701013','RED VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11829') +('0081264701014','BLUE VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11830') +('0081264701015','LIME VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11831') +('0081264701016','PURPLE VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11832') +('0081264701017','GRAY VITA CHICO BAG',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'11833') +('0081264701027','Maroon Chico Bag',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-30 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12829') +('0081265500502','APRICOT JELLY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11834') +('0081265500534','PEACH APRICOT RAZZ JELLY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11835') +('0081265500536','ROSE PETAL JELLY',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11836') +('0081349101000','HOT CRL,OG,ORIGINAL GF',5.15,'0',0.00,'0',4.39,'0',4.39,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','157','0','0','1','0',0,'0','2009-09-22 10:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12970') +('0081349101001','HOT CRL,OG,MPL&BRN SGR,G',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-09-22 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12969') +('0081349101002','HOT CRL,OG,APPLE&CINN GF',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-09-22 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12968') +('0081355100101','UDON NOODLE OG',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'1599','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11837') +('0081355100120','SOMEN OG',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11838') +('0081355100205','DRY RAMEN,MUSHROOM 2 OZ',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1603','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11839') +('0081355100211','DRY RAMEN,ASIAN VEG',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1603','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11840') +('0081355100212','DRY RAMEN LEMONGRASS GNGR',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1603','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11841') +('0081355100213','DRY RAMEN,GARLIC PEPPER',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1603','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11842') +('0081355100214','DRY RAMEN,SOBA',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1603','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11843') +('0081357400016','PBERRY STRAWBERRY QT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'509','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11844') +('0081357400088','PBERRY STRAWBERRY PT',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11845') +('0081484700100','HONEY BEAR, LOCAL',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'2','2009-05-18 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11846') +('0081484700101','HONEY, CLOVER, LOCAL',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-05-18 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11847') +('0081484700102','LOCAL HONEY, 2# JAR',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-05-18 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11848') +('0081484700104','SPUN HONEY, LOCAL',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','176','0','0','1','0',0,'499','2009-05-18 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11849') +('0081498500002','PEPPERS,OG,ROASTED,RED',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11850') +('0081498500003','PEPPERS,OG,RED/YEL,RSTD 13 OZ',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-12-10 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11851') +('0081498500004','CAPERS,OG',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11852') +('0081498500006','OLIVES,OG,GRN MANZ./LEMON',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11853') +('0081498500007','TOMATOES,OG,SN-DRD/OLV OL',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2007-12-10 11:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11854') +('0081498500011','OLIVES,OG,MIXED PARTY 9 OZ',4.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11855') +('0081498500019','MEDITERRANEAN KALAMATA OLIVES',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11856') +('0081498500020','PEPPERS,OG,ROASTED,YELLO',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','171','0','0','1','0',0,'0','2009-04-28 01:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11857') +('0081498500030','PRESERVES OG STRAWBERRY',5.79,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11858') +('0081498500031','PRESERVES OG RASPBERRY',5.79,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11859') +('0081498500032','PRESERVES WILD BERRY',5.79,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','164','0','0','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11860') +('0081661100001','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11861') +('0081675400001','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11862') +('0081675400003','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11863') +('0081675400009','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11864') +('0081675400017','PLEMON BAG SUNDANCE',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'518','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11865') +('0081675400029','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11866') +('0081675400033','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11867') +('0081675400037','PLIME BAG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'758','2009-04-01 07:02:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'11868') +('0081675400045','PMINNEOLAS Bag',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1312','2009-01-16 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11869') +('0081725800600','PTOMATO CHERRY 1/2PT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11870') +('0081841100022','SAMBAZON ACAI POWDER',29.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11871') +('0081841100034','SAMBAZON ACAI CAPS 60 CT',24.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'499','2009-05-13 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11872') +('0081841100037','SAMBAZON ACAI JUICE 10.5 OZ',3.19,'0',0.00,'0',2.19,NULL,2.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','29','0','0','1','0',0,'499','2009-06-19 09:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11873') +('0081841100043','ANTIOXIDANT TRINITY SAMBZ',3.19,'0',0.00,'0',2.19,NULL,2.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','29','0','0','1','0',0,'499','2009-06-19 09:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11874') +('0081883200001','DOUBLE GLOUCESTER',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-12-29 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11875') +('0081883200007','RED LEICESTER',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-12-29 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11876') +('0081883200022','PORT CHEDDAR SINGLETONS',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-12 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11877') +('0081916200106','BOMBILLA,STN STEEL SPRING',8.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','186','0','1','0','0',0,'0','2008-08-29 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11878') +('0081916200300','TEA,OG,ROOIBOS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11879') +('0081916200454','TEA OG YERBA MATE LOOSE ECOT',8.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11880') +('0081916200455','TEA OG YERBA MATE ECOTEA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','1','0','0',0,'mixmatchcode','2009-09-25 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11881') +('0081916200460','TEA,OG,YERBA MATE,LOOSE',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','151','0','0','1','0',0,'0','2009-08-04 01:02:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11882') +('0082083800002','PBERRY CRANBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11883') +('0082083800003','PBERRY CRANBERRY 8OZ',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11884') +('0082083802002','PBERRY CRANBERRY BAG',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11885') +('0082083802003','PBERRY CRANBERRY',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'631','2008-12-18 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11886') +('0082202300005','CEDAR SUMMIT 1% 64 OZ.',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2009-05-15 08:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11887') +('0082202300006','CEDAR SUMMIT 2% 64 OZ.',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2009-03-17 12:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11888') +('0082202300007','CEDAR SUMMIT WHOLE 64 OZ',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2009-02-24 08:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11889') +('0082202300009','CEDAR SUMMIT SKIM 64 OZ',3.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','30','0','0','1','0',0,'0','2009-02-24 08:01:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11890') +('0082466020010','PCUCUMBER EUROPEAN',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'638','2009-05-13 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11891') +('0082486200801','PTRAY VEGETABLE 36 OZ',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'1367','2009-02-03 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11892') +('0082486200805','PTRAY VEGETABLE 7 OZ',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'1368','2009-02-03 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11893') +('0082486207702','PFOXY SLAW',3.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'1178','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11894') +('0082486207703','PFOXY VEG MEDLEY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','1','1','0',0,'1298','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11895') +('0082522600004','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11896') +('0082528210003','PARUGULA BABY BAG',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11897') +('0082528210004','PMACHE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'955','2007-10-08 02:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'11898') +('0082528220001','PONION BAG YELLOW',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'543','2009-09-21 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11899') +('0082528220002','PONION BAG RED',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'633','2009-03-05 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11900') +('0082528230001','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11901') +('0082528230003','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11902') +('0082532500027','ALMONDS ROSEMARY HONEY',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-09 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11903') +('0082532500035','MITICA FIG JAM',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-11-26 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11904') +('0082532500037','MITICA FIG JAM',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-03-15 04:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11905') +('0082532500143','GOAT CHEESE LITTLE FRIAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-02-13 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11906') +('0082532500147','GOAT CHEESE HERBS LITTLE FRIAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-02-13 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11907') +('0082532591001','CRABAPPLE MOSTARDA',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','0','0',0,'0','2007-11-28 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11908') +('0082532591003','PEAR MOSTARDA',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-14 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11909') +('0082532591009','PLUM MOSTARDA',16.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-28 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11910') +('0082559201001','BUTTER SALTED PASTURELAND 1#',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'499','2009-07-15 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11911') +('0082559201010','BUTTER UNSALTED PASTURELAND 1#',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','26','0','0','1','0',0,'0','2008-05-15 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11912') +('0082688400444','PGARLIC GARLIC GOLD',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1181','2005-08-23 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11913') +('0082746800013','PGINGER PUREE JAR',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','508','0','0','1','0',0,'1314','2008-04-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11914') +('0082746800015','PGARLIC ROASTED JAR',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'1316','2008-04-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11915') +('0082746800105','PGARLIC BAGGED',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','516','0','0','1','0',0,'1179','2009-09-02 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11916') +('0082804920509','PBERRY GOOSEBERRY',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'722','2008-01-21 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11917') +('0082804922009','PONION BAG SWEET',4.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','517','0','0','1','0',0,'968','2007-10-08 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11918') +('0082804922334','PBERRY STRAWBERRY PI',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'508','2009-08-12 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11919') +('0082890459542','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11920') +('0082890465789','pberry blueberry',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11921') +('0082890465897','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11922') +('0082890498486','PCELERY BUNCH',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'551','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11923') +('0082946200110','RIC MILK WHOLE GRAIN, OG ORIG',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11924') +('0082946200111','RIC MILK WHOLE GRAIN, OG VANIL',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11925') +('0082946270101','GOOD KARMA VANILLA',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11926') +('0082946270102','GOOD KARMA MUDD PIE',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11927') +('0082946270105','GOOD KARMA CHOCOLATE PB',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11928') +('0082946270108','RICE DIVINE COCONUT MANGO',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-05-08 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11929') +('0082946270111','RICE DIVINE,OG,VERY CHRY',4.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11930') +('0082946290201','RICE DIV BARS,OG,VANILLA',4.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11931') +('0082983500001','AGRASS GOJI SFOOD 15 CT BOX',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2009-09-23 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12979') +('0082983500002','AGRASS BERRY SUPERFOOD SINGLE',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2009-08-31 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12839') +('0082983501100','AMAZING GRASS WHEATGR 10 OZ.',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11932') +('0082983591031','AGRASS SINGLE WHEATGRASS',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11933') +('0082983591035','AMAZING GRASS WHEATGR 15CT',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11934') +('0082983593032','AGRASS SINGLE SUPERFOOD',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11935') +('0082983593035','AMAZING GRASS SUPERFOOD 15CT',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2007-09-17 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11936') +('0082983593100','AMAZING GRASS SUPERFOOD 8OZ.',28.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2008-11-14 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11937') +('0082983593300','AMAZING GRASS CHOCO SUPERFOOD',30.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2007-12-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'11938') +('0082983593500','AGRASS CHOC SFOOD 15 CT BOX',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2009-09-23 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12978') +('0082983593501','AGRASS CHOC SUPERFOOD SINGLE',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'499','2009-09-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12840') +('0082983593700','AGRASS BERRY SUPERFOOD 8.50Z',30.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','107','0','1','0','0',0,'0','2009-08-31 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12838') +('0082985310112','CHEDDAR CHIPOTLE SUGAR RIVER',7.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-02-19 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11939') +('0082985310122','CHEDDAR GARLIC ONION SUGAR RIV',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-09-04 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11940') +('0083095300034','PSPROUTS DAIKON',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','522','0','0','1','0',0,'1022','2009-04-01 07:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11941') +('0083101200001','ORANGE TANG SWITCH SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'mixmatchcode','2009-02-17 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11942') +('0083101200004','SWITCH, APR/PEACH, SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'mixmatchcode','2009-02-17 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11943') +('0083101200008','BLK CHERRY, SWITCH, SINGLE',1.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'mixmatchcode','2009-02-17 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11944') +('0083101200121','JUICE,ORANGE TANG, 4PK',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'1553','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11945') +('0083101200123','JUICE,APRICOT PEACH, 4PK',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'1553','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11946') +('0083101200124','JUICE,BLACK CHERRY, 4PK',6.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'1553','2008-07-18 02:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11947') +('0083112800060','DOG WASTE BIOBAGS 50 CT',5.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11948') +('0083112800085','BAGS, GARDEN AND LEAF, BIOBAG',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-11-24 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11949') +('0083112800203','COMPOST/WASTE BAG,3 GAL 25 CT',5.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11950') +('0083112800244','BIOBAG TALL KITCHEN 13 GALLON',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','183','0','1','0','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11951') +('0083134400372','PTOMATO GRAPE CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11952') +('0083268200001','PORANGE BAG SWEET',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1132','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'11953') +('0083303700274','CILANTRO ROAST GARLIC CHEDDAR',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-09-11 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12879') +('0083303700275','NEXT GENERA CARIBBEAN CHEDDAR',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','0',0,'0','2009-09-24 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12988') +('0083303700301','Next Generation Colby',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11954') +('0083303700302','Next Generation Mild Ched',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11955') +('0083303700303','NEXT GEN GARLIC PARSLEY CHED',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11956') +('0083303700305','Next Generation Garlic+Parsley',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11957') +('0083303700306','Next Gen. Cilantro Garlic Ched',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11958') +('0083303700307','Next Gen. Caribbean Ched',7.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-06 02:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11959') +('0083373500006','QUORN CHKN NUGGETS',4.89,'0',0.00,'0',3.19,NULL,3.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'499','2009-05-05 11:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11960') +('0083373500008','QUORN CHKN PATTIES',4.95,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'499','2009-05-05 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11961') +('0083373500012','QUORN CHKN TENDERS',4.95,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'499','2009-05-05 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11962') +('0083373500014','GROUNDS,BEEF,MEAT FR',4.95,'0',0.00,'0',3.29,NULL,3.29,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11963') +('0083373500016','ROAST TURKEY QUORN',7.49,'0',0.00,'0',4.89,NULL,4.89,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'499','2009-05-05 12:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11964') +('0083373500020','CUTLETS,CHKN,MEAT FR,NAK',4.89,'0',0.00,'0',3.19,NULL,3.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11965') +('0083373500048','CUTLETS,CRNBRY GOAT CHEE',5.39,'0',0.00,'0',3.49,NULL,3.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11966') +('0083373500050','CHIKN WING,SOUTHWESTERN',4.89,'0',0.00,'0',3.19,NULL,3.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11967') +('0083373500052','QUORN TURKY BURGER',4.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2009-07-24 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11968') +('0083378600100','HELENS INDIAN CURRY',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11970') +('0083378600200','HELENS YELLOW CURRY',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-09-17 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11971') +('0083378600902','HEARTY BEAN CHILI,OG',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11973') +('0083418300101','FRIES,OLIVE OIL&RSMRY GRL',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11974') +('0083418300105','ONION RINGS,GLDN W/SEA S',3.85,'0',0.00,'0',3.19,NULL,3.19,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','41','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11975') +('0083418300109','ALEXIA REDS OL OIL PARM',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11976') +('0083418300111','FRIES,JULIENE,SWT POT,SL',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'mixmatchcode','2009-03-19 10:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11977') +('0083418300300','FRIES,OG,CRNINKLE,SLT&PEP',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11978') +('0083418300301','FRIES,OG,CRINKLE,ON&GARLC',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'0','2009-03-19 10:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11979') +('0083418300600','MOZZARELLA STIX',5.05,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11980') +('0083418300601','MUSHROOM BITES',5.05,'0',0.00,'0',3.99,NULL,3.99,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','40','0','0','1','0',0,'0','2008-12-12 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11981') +('0083418300703','FRIES,WAFFLE,W/SEASON SL',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','41','0','0','1','0',0,'mixmatchcode','2009-02-17 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11982') +('0083418300900','ROLLS,CLASSIC FRENCH',4.29,'0',0.00,'0',3.49,NULL,3.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-17 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11983') +('0083418300902','ROLLS,CIABATTA W/RSMRY&OL',4.29,'0',0.00,'0',3.49,NULL,3.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-17 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11984') +('0083418300904','BISCUITS,CLASSIC BTRMILK',4.29,'0',0.00,'0',3.49,NULL,3.49,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-17 09:01:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11985') +('0083418300950','BAGUETTE,GARLIC FRENCH',2.15,'0',0.00,'0',1.79,NULL,1.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-17 09:01:00','0',0.0,'1','1','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11986') +('0083490500497','BRICK SPREAD',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11987') +('0083514300002','TEA,BOTTLE,GREEN JASMINE',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2008-11-17 10:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11988') +('0083520600001','ICE CREAM,OG,VANILLA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11989') +('0083520600002','ICE CREAM,OG,CHOCOLATE',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2008-10-13 12:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'11990') +('0083522800600','GRANOLA,GF,APL RSN WALNU',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-04-15 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11991') +('0083522800601','GRANOLA,GF,NUTTY CRANBRY',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-04-15 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11992') +('0083522800602','GRANOLA,GF,EXTR FRUIT&NU',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-04-15 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11993') +('0083522801100','GRANOLA BAR,GF,PNT BTR C',5.69,'0',0.00,'0',4.69,'0',4.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-05-22 08:05:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11994') +('0083522801101','GRANOLA BAR,GF,CRANBERRY',5.69,'0',0.00,'0',4.69,'0',4.69,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2009-05-22 08:05:00','1',0.0,'1','2','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11995') +('0083522801150','GRANOLA BAR,GF,PT BTR CC',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2009-05-21 11:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11996') +('0083522801151','GRANOLA BAR,GF,CRNBRY MP',1.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'0','2009-05-21 11:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'11997') +('0083554500001','PMACHE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','513','0','0','1','0',0,'955','2007-10-08 02:00:00','0',0.0,'1','0','0','0','1',0,0.00,'1',NULL,'6',NULL,NULL,'11998') +('0083571500201','MASCARPONE, CRAVE BROS',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-09-29 05:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'11999') +('0083609300204','BTL,SPARKLING,GRAPEFRUIT',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-13 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12001') +('0083609300205','BTL,SPARKLING,CLEMENTINE',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-13 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12002') +('0083609300208','BTL,SPARKLING,POMEGRANAT',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-03-13 09:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12003') +('0083647001006','MMIRACLE TART CHERRY CONC 16OZ',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','106','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12004') +('0083845100013','MACA MAGIC HRT',23.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2008-02-08 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12005') +('0083845500001','MEATLESS JERKY,TERIYAKI',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12006') +('0083845500002','MEATLESS JERKY,HCKY SMOKE',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12007') +('0083845500020','PRIMAL STRIP, MESQUITE LIME',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12008') +('0083845500021','PRIMAL STRIP, TEXAS BBQ',1.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-04-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12009') +('0084190501011','DAL BUKHARA BLK GRAM LENTIL',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1551','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12010') +('0084190501031','PALEK PANEER SPNCH W/COTT',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1551','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12011') +('0084190501051','RAJMA MASALA RED KIDNEY',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1551','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12012') +('0084190501071','PAV BHAJI MASHED VEG CURRY',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1551','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12013') +('0084190501081','PINDI CHANA CHICK PEAS',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1551','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12014') +('0084190510011','HYDERABADI BIRYANI RICE',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'1551','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12015') +('0084288002002','ORGANIC CANDY CANES',3.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','162','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12016') +('0084357100029','POPCORN INDIANA,SMKD CHE',3.89,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12017') +('0084357100032','POPCORN,MOVIE THEATER',3.89,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12018') +('0084357100078','POPCORN INDIANA,WHT CHED',3.95,'0',0.00,'0',2.69,NULL,2.69,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12019') +('0084480900017','8X6 CUTTING BOARD',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2008-12-04 03:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12020') +('0085040300003','PIZZA CRUST MIX,SF',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-02-13 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12021') +('0085040300005','WAFFLE/PANCAKE MIX,SF',5.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12022') +('0085040300006','CAKE MIX,SPICE/CARROT',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12023') +('0085040300014','BREAD MIX',5.89,'0',0.00,'0',4.79,'0',4.79,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12024') +('0085055200206','PARTY HONEYSUCKLES',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-16 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12887') +('0085055200207','PARTY SMALL PAD',10.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12890') +('0085055200208','PARTY MINI LINER',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12888') +('0085055200209','PARTY LUXE LINER',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-20 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12889') +('0085055200210','PARTY MEDIUM PAD',10.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12893') +('0085055200211','PARTY LARGE PAD',10.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12892') +('0085055200212','PARTY OVERNIGHT PAD',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-20 07:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12891') +('0085258400012','BUFFALO JERKY,MILD',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12025') +('0085269700107','HAPPYBELLIES,OG,BR RC CR',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2008-09-04 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12026') +('0085269700108','HAPPYBELLIES,OG,OATML CR',4.25,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','152','0','0','1','0',0,'0','2008-09-04 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12027') +('0085269700109','HAPPYBELLIES,OG,MLTGRN C',4.25,'0',0.00,'0',2.99,'0',2.99,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','152','0','0','1','0',0,'0','2008-09-04 10:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12028') +('0085269700118','APPLE PUFFS,OG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-05-01 11:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12029') +('0085269700119','BANANA PUFFS,OG',3.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-05-01 11:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12030') +('0085269700122','YOGURT MELTS,STRAWBERRY',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','152','0','0','1','0',0,'0','2009-09-21 10:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12957') +('0085277200101','TORTILLA CHIPS JALAPENO FSTG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1617','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12031') +('0085277200104','TORTILLA CHIPS MULTIGRAIN',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1617','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12032') +('0085277200106','TORTILLA CHIPS OLIVE FSTG',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'1617','2008-11-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12033') +('0085277200112','TORTILLA CHIPS,MULTIGRAI',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12034') +('0085277200114','TORTILLA CHIPS,OLIVE',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12035') +('0085277200154','TORTILLA CHIPS,POTATO&CH',0.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2009-05-13 09:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12036') +('0085352200001','BAGEL,ORIGINAL',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12037') +('0085352200002','BAGEL,CINN RAISIN',5.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12038') +('0085352200018','COOKIE,SNICKERDOODLE',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'1602','2009-04-10 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12039') +('0085352200019','COOKIE,CHOCOLATE CHIP',3.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','155','0','0','1','0',0,'1602','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12040') +('0085352200030','CHOC CHIPS,SEMI-SWT,G/F',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','1','1','0',0,'mixmatchcode','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12041') +('0085352200042','SNACK BAR,VERY BERRY',4.25,'0',0.00,'0',3.39,'0',3.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2008-06-12 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12042') +('0085352200062','SNACK BAR,SUNBUTTER CRNCH',4.25,'0',0.00,'0',3.39,'0',3.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','154','0','0','1','0',0,'0','2008-06-12 10:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12043') +('0085364700021','POWER JUICE ORIGL ACAI',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-03-08 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12044') +('0085364700022','POWER JUICE BLUEBRY ACAI',2.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-03-08 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12045') +('0085428500083','NOODLE BOWL,SPCY KUNG PAO 8.5',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12046') +('0085428500086','NOODLE BOWL,SESAME TERIYK 8.5',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12047') +('0085428500087','NOODLE BOWL,RSTD PEANUT 8.5 OZ',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12048') +('0085428500100','RCE NDLE BOWL,SHIITAK MSH 2.5',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12049') +('0085428500150','RCE NDLE BOWL,SPRING VEG 2.5 O',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12050') +('0085428500200','RCE NDLE BOWL,GRLC SESAME 2.5',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12051') +('0085428500250','RCE NDLE BOWL,SESAME CHCK 2.5',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','175','0','0','1','0',0,'0','2007-06-11 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12052') +('0085428550010','STIR FRY SCE,GNGER TERIK',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-05-06 10:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12053') +('0085428550012','STIR FRY SCE,GENERAL TSA',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-05-06 10:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12054') +('0085428550015','STIR FRY SCE,MANDAR ORNG',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2009-05-06 10:01:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12055') +('0085465200140','CURDS OG LOCAL CASTLE ROCK',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-03-06 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12056') +('0085465200142','CHEDDAR MILD OG CASTLE ROCK',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-28 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12057') +('0085465200143','CHEDDAR MED OG CASTLE ROCK',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-28 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12058') +('0085465200144','CHEDD RAW SHARP OG CASTLE ROCK',6.99,'0',0.00,'0',6.29,'0',6.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','230','0','0','1','0',0,'0','2008-09-28 12:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12059') +('0085465200146','CHEDDAR SHARP OG CASTLE ROCK',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-28 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12060') +('0085465200180','CHED RAW MED CASTLE ROCK',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-04-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12061') +('0085465200181','CHED RAW SHARP CASTLE ROCK',6.99,'0',0.00,'0',6.29,'0',6.29,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','230','0','0','1','0',0,'0','2009-04-23 10:00:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12062') +('0085465200186','BLUE ORGANIC CASTLE ROCK',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','1',0,'0','2008-09-28 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12063') +('0085465200187','BLUE SMOKED OG CASTLE ROCK',7.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-09-23 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12064') +('0085465200188','CHED OG TOM BASIL CASTLE ROCK',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-06-11 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12065') +('0085465200189','JALA PEPPER CHED CASTLE ROCK',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-07-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12066') +('0085465200190','VEG CHED CASTLE ROCK CHEESE',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-07-23 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12067') +('0085465200191','CHED ORANGE CRAN OG CASTLE ROC',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-06-11 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12068') +('0085465200192','CHED CAJUN CASTLE ROCK OG',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-06-11 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12069') +('0085465200193','CHEDDAR BLACK BEAN SALSA RAW',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-06-18 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12070') +('0085465200194','GARMAM MAS RAW CASTLE ROCK',7.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'499','2009-09-23 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12071') +('0085465200195','CAST ROCK JALA CRAN CHED',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-07-23 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12072') +('0085465200196','LEMON THYME GINGER CHEESE',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-07-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12073') +('0085465200197','CHEDDAR VENETIAN RAW CASTLE RO',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-06-18 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12074') +('0085465200198','CHEDDAR SPIN LEEK GARLIC RAW',6.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-06-18 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12075') +('0085485844401','FIG SPREAD DALMATIA',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2008-03-15 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12076') +('0085485844409','ORANGE FIG DALMATIA',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-02 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12077') +('0085490600006','BOSSA NOVA ORIGINAL JUICE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12078') +('0085490600007','BOSSA NOVA MANGO JUICE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12079') +('0085490600009','BOSSA NOVA BLUE JUICE',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12080') +('0085490600012','JUICE,PET,ACEROLA MANGO',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','29','0','0','1','0',0,'0','2008-11-03 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12081') +('0085517200000','SUNCOAT Polish Remover, 30ml',5.75,'0',0.00,'0',3.45,'0',3.45,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12082') +('0085517200001','Nail polish, pearl white 1',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12083') +('0085517200002','Nail polish, pearl purple 2',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12084') +('0085517200003','Nail polish, peach lover',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12085') +('0085517200004','Nail polish, berry 4',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12086') +('0085517200005','Nail polish, golden peach',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12087') +('0085517200006','Nail polish, orange red 6',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12088') +('0085517200007','Nail polish,pink passion 7',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12089') +('0085517200008','Nail polish, rose 8',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12090') +('0085517200009','Nail polish,light purple 9',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12091') +('0085517200010','Nail polish,cotton candy 10',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12092') +('0085517200011','Nail polish, sienna fine 11',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12093') +('0085517200012','Nail polish, French pink 12',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12094') +('0085517200013','Nail polish, copper',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12095') +('0085517200014','Nail polish, silver',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12096') +('0085517200015','Nail polish, dark purple',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12097') +('0085517200016','Nail polish, plum 16',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12098') +('0085517200017','Nail polish, midnight purple17',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12099') +('0085517200018','Nail polish, red N red 18',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12100') +('0085517200019','Nail polish, gold 19',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12101') +('0085517200020','Nail polish, magic purple',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12102') +('0085517200021','Nail polish, apple green 21',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12103') +('0085517200022','Nail polish, Royal blue',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12104') +('0085517200023','Nail polish, clear',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12105') +('0085517200024','SUNCOAT NAIL POLISH REM 60ML',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-04-05 04:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12106') +('0085517200025','SUNCOAT Polish Remover, 60ml',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12107') +('0085517200026','SUNCOAT French Manicure Kit',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12108') +('0085517200027','Nail polish,cinnamon 24',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12109') +('0085517200028','Nail polish,desert sunset 25',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12110') +('0085517200029','Nail polish,sparkling sand',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12111') +('0085517200030','Nail polish,innocent nude',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12112') +('0085517200031','Nail polish,mango',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-02-16 03:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12113') +('0085517200032','Nail polish,tangerine',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12114') +('0085517200033','Nail polish,purple',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12115') +('0085517200034','Nail polish,beige 31',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12116') +('0085517200035','Nail polish,apricot 32',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2007-06-21 11:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12117') +('0085517200068','SUNCOAT NATURAL HAIRSPRAY',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2007-12-27 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12118') +('0085517200081','SUNCOAT NAIL POLISH 33',8.65,'0',0.00,'0',5.15,'0',5.15,'0','2009-09-25 12:00:00','2009-10-31 12:00:00','89','0','1','0','0',0,'0','2007-04-11 01:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12119') +('0085561100112','NATUROPATCH ARNICA SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12120') +('0085561100113','NATUROPATCH BERGAMOT SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12121') +('0085561100114','NATUROPATCH EUC SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12122') +('0085561100115','NATUROPATCH LEMONGRASS SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12123') +('0085561100116','NATUROPATCH ROSE GER SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12124') +('0085561100117','NATUROPATCH SLEEP AID SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12125') +('0085561100119','NATUROPATCH CITRUS SNGL',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12126') +('0085561100120','NATUROPATCH VARIETY PACK',8.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2007-08-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12127') +('0085573500028','GUUSTO GAOT UUSTO PAST PRIDE',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-12-16 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12128') +('0085573500123','PP OG MILD CHEDDAR',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12129') +('0085573500124','PP OG MED CHEDDAR',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12130') +('0085573500129','PP OG MUENSTER',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12131') +('0085573500201','JUUSTO PASTURE PRIDE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-03-10 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12132') +('0085573500209','JUUSTO JALAPENO PAST PRIDE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-03-19 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12133') +('0085573500211','JUUSTO CHIPOTLE',5.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-03-19 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12134') +('0085573500308','NAT VALLEY GOAT CHED',7.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12135') +('0085573500312','MUENSTER GOAT NATURAL VALLEY',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-04-24 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12136') +('0085573500313','COLBY-JACK GOAT NATURAL VALLEY',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-04-24 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12137') +('0085573500314','NV MILD SUMMER CHEDDAR',9.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12138') +('0085573500315','NV MED SPRING CHEDDAR',9.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12139') +('0085573500318','FETA NATURAL VALLEY',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-05-15 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12140') +('0085682000050','ENERGY DRINK STEAZ SINGLE',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12141') +('0085682000060','DIET STEAZ SINGLE',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12142') +('0085682000070','STEAZ ORANGE SINGLE',2.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12143') +('0085682000450','ENERGY DRINK STEAZ 4PACK',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1622','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12144') +('0085682000460','STEAZ ENERGY DRINK, DIET 4PK',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1622','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12145') +('0085682000470','ENERGY DRINK STEAZ ORANGE 4PK',9.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1622','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12146') +('0085682020001','BERRY ENERGY SHOT,OG',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-07-17 08:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12147') +('0085733000034','WHIPPED CREAM',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','27','0','0','1','0',0,'0','2008-11-12 08:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12148') +('0085753800001','DIVA CUP #1',31.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12149') +('0085753800002','DIVA CUP #2',31.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12150') +('0085764600101','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12151') +('0085764600102','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12152') +('0085764700101','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12153') +('0085807300099','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12154') +('0085830200122','SHRIMP&OG ROTINI SCAMPI',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-14 11:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12155') +('0085830200123','BLUE HORIZON PENNE ALFREDO',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2007-10-12 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12156') +('0085830200124','BLUE HORIZON PESTO FARFALLE',8.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2007-10-12 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12157') +('0085830200125','Blue Horizon Shrimp',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-02-19 06:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12158') +('0085830200180','SHRIMP THAI EGG ROLLS',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12159') +('0085830200181','SHRIMP CHINESE EGG ROLLS',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12160') +('0085846700102','PHERB CHIVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'908','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12161') +('0085846700103','PHERB BABY DILL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'909','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12162') +('0085846700104','PHERB MARJORAM',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'919','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12163') +('0085846700106','PHERB OREGANO',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'924','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12164') +('0085846700108','PHERB ROSEMARY',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'930','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12165') +('0085846700109','PHERB SAGE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'931','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12166') +('0085846700111','PHERB SPEARMINT',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'935','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12167') +('0085846700112','PHERB TARRAGON',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'937','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12168') +('0085846700113','PHERB THYME',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'938','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12169') +('0085846700116','PHERB POULTRY MIX',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'929','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12170') +('0085846700119','PHERB BAY LEAVES',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'659','2008-12-31 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12171') +('0085846700120','PHERB KAFFIR LIME LEAVES',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'915','2007-10-20 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12172') +('0085846700121','LEMONGRASS ORGANIC',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'0','2009-08-29 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','6',0.00,'0','12828') +('0085846700122','PHERB BASIL 4OZ RS',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12173') +('0085850300102','CACAO NIBS FLAVOR 70',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-09-19 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12174') +('0085897100000','SUKI BUTTER CREAM SALVE',22.19,'0',0.00,'0',16.75,'0',16.75,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','97','0','1','0','0',0,'0','2009-02-06 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12175') +('0085897100002','SUKI LEMONGRASS CLEANSER',25.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12176') +('0085897100004','SUKI LIP REPAIR BUTTER',9.25,'0',0.00,'0',6.95,'0',6.95,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','87','0','1','0','0',0,'mixmatchcode','2009-02-06 11:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12177') +('0085897100005','SUKI MINI SKIN KIT WILLOW',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12178') +('0085897100006','SUKI TONER SHITAKE',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12179') +('0085897100007','SUKI TONER WILLOW',25.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12180') +('0085897100008','SUKI CLEANSING LOTION',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12181') +('0085897100009','SUKI EYE TISSUE REPAIR',28.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12182') +('0085897100010','SUKI DAY LOTION',27.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12183') +('0085897100011','SUKI SERUM CHAMOMILE',26.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12184') +('0085897100012','SUKI SERUM CARROT',26.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12185') +('0085897100013','SUKI FACIAL CLAY',38.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12186') +('0085897100020','SUKI TO GO CLEANSING BAR 1.4OZ',4.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-12-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12187') +('0085897100022','SUKI TO GO VELVET CREAM .5 OZ',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-12-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12188') +('0085897100027','SUKI DELUXE TRAVEL KIT',34.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-08-20 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12189') +('0085897100051','SUKI MINI SKIN KIT SHITAKE',23.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-07-07 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12190') +('0085897100059','SUKI TO GO EXFOL CLEANSER 1 OZ',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2008-12-11 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12191') +('0085900400008','RED LAKE SOUP BITS',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12192') +('0085900400027','RED LAKE CHOKECHERRY SYRUP',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 05:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12193') +('0085900400030','RED LAKE HIGHBUSH CRAN SYRUP',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12194') +('0085900400031','RED LAKE PLUM SYRUP',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12195') +('0085962300024','ECO LIPS GOLD',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-03-24 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12196') +('0085962300041','ECO LIPS VEGAN BEE FREE',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'499','2009-09-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12197') +('0085962300042','ECO LIPS HEMP',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2009-03-24 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12198') +('0085962300124','ECO LIPS ROSE QUARTZ',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-11-13 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12199') +('0085962300125','ECO LIPS PLUSH RED',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-11-13 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12200') +('0085962300126','ECO LIPS MOCHA VELVET',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','87','0','1','0','0',0,'0','2007-11-13 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12201') +('0085965500153','FETTUCCINE OG TOM BASIL',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'1591','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12202') +('0085965500162','FETTUCCINE OG PLAIN',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'1591','2008-09-19 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12203') +('0087161100110','GOAT CHEESE STFFD SW PEPPERS',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2006-01-30 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12204') +('0087224200198','DOG FOOD,DRY,WGT & AGING',48.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-03-12 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12205') +('0087224200199','CAT FOOD DRY DAILY HEALTH',35.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12206') +('0087224200738','SHAMPOO,DOG,HYPO ALLERGNC 16 O',8.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12207') +('0087224200852','CAT FOOD,CAN,SALMN&BR RCE 5.5',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'499','2009-09-08 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12208') +('0087224200856','CAT FOOD,DRY,DAILY HEALTH 6 #',16.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12209') +('0087224200867','CAT FOOD,CAN,CHCKN&BR RCE 5.5',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12210') +('0087224200869','CAT FOOD,CAN,FISH&BR RICE 5.5',1.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-01-14 12:03:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12211') +('0087224200872','DOG FOOD,DRY,DAILY HLTH 5LB',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'499','2009-05-18 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12212') +('0087224200876','DOG FOOD,DRY,DAILY HEALT 25LB',46.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'499','2009-06-05 12:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12213') +('0087224200877','DOG FOOD,DRY,HLTHY GROWT',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-03-12 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12214') +('0087224200881','DOG FOOD PET PRMISE AGING 5#',15.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2009-03-12 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12215') +('0087224200893','DOG FOOD,CAN,CHCKN&BR RCE 13.2',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12216') +('0087224200979','DOG FOOD, CAN, BEEF BRICE 13Z',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-08-26 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12217') +('0087272400000','SEEDS ARUGULA HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12218') +('0087272400001','SEEDS ASIAN GRN HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12219') +('0087272400002','SEEDS BEANS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12220') +('0087272400003','SEEDS BEETS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12221') +('0087272400004','SEEDS BROCCOLI HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12222') +('0087272400005','SEEDS CARROT HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12223') +('0087272400006','SEEDS CHARD HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12224') +('0087272400007','SEEDS CORN HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12225') +('0087272400008','SEEDS CUCUMBER HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12226') +('0087272400009','SEEDS FLOWERS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12227') +('0087272400010','SEEDS HERBS EDB HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12228') +('0087272400011','SEEDS HERBS MED HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12229') +('0087272400012','SEEDS KALE HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12230') +('0087272400013','SEEDS LETTUCE HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12231') +('0087272400014','SEEDS MELON HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12232') +('0087272400015','SEEDS MESCLUN HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12233') +('0087272400016','SEEDS ONION HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12234') +('0087272400017','SEEDS PEA HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12235') +('0087272400018','SEEDS PEPPER HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12236') +('0087272400019','SEEDS RADISH HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12237') +('0087272400020','SEEDS SPINACH HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12238') +('0087272400021','SEEDS SQUASH SU HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12239') +('0087272400022','SEEDS TOMATO SL HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12240') +('0087272400023','SEEDS CABBAGE HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12241') +('0087272400024','SEEDS MUSTARDS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12242') +('0087272400025','SEEDS PUMPKINS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12243') +('0087272400026','SEEDS SQUASH WI HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12244') +('0087272400027','SEEDS TOMATO CH HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12245') +('0087272400028','SEEDS TOMATO GE HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12246') +('0087272400029','SEEDS PARSLEY HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12247') +('0087272400030','SEEDS SUNFLOW HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12248') +('0087272400031','SEEDS BASIL HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12249') +('0087272400032','SEEDS VEGIES HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12250') +('0087272400033','SEEDS EGGPLANT HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12251') +('0087272400034','SEEDS LARKSPUR HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12252') +('0087272400035','SEEDS NASTURTIUM HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12253') +('0087272400036','SEEDS ZINNIA HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12254') +('0087272400037','SEEDS COSMOS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12255') +('0087272400038','SEEDS CALENDULA HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12256') +('0087272400039','SEEDS BASIL HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12257') +('0087272400040','SEEDS PARSLEY FLAT HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12258') +('0087272400041','SEEDS CHIVES HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12259') +('0087272400042','SEEDS CILANTRO HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12260') +('0087272400043','SEEDS DILL HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12261') +('0087272400044','SEEDS SAGE HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12262') +('0087272400045','SEEDS THYME HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12263') +('0087272400046','SEEDS OREGANO HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12264') +('0087272400048','SEEDS SPECIALTY GREENS HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12265') +('0087273400028','PSEEDS PEPPER HMS',0.99,'0',0.00,'0',0.99,'0',0.99,'0','2009-08-07 12:00:00','2009-09-30 12:00:00','250','0','1','1','0',0,'2000','2009-09-15 02:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12266') +('0087401300002','DR WEIL DAILY MULTI',17.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2007-08-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12267') +('0087401300008','DR WEIL IMMUNE FORMULA',33.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-02-08 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12268') +('0087504518110','THOUSAND HILLS STEW MEAT',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-09-18 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12272') +('0087504518120','THOUSAND HILLS STIR FRY BEEF',7.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-05-21 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12273') +('0087504518130','THOUSAND HILLS KABOB MEAT',7.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-06-25 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12274') +('0087504518235','THOUSAND HILLS FRESH GRND BEEF',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'499','2009-04-16 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12275') +('0087504518240','THOUSAND HILLS FRZN GRND BEEF',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-10 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12276') +('0087504518311','THOUSAND HILLS MEAT BALLS',8.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-10-10 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12277') +('0087504518323','THOUSAND HILLS 1/3 LB PATTIES',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-09-02 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12278') +('0087504518352','THOUSAND HILLS HOT DOGS',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-07-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12279') +('0087504518361','THOUSAND HILLS SUMMER SAUSAGE',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2008-07-24 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12280') +('0087504518381','THOUSAND HILLS BEEF JERKY',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2009-09-24 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12985') +('0087538600001','LIVING HARVEST HEMP ORIGINAL',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','0','0',0,'0','2008-12-11 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12281') +('0087538600002','HEMP OIL 500ML',22.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','0','1','0',0,'0','2008-09-04 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12282') +('0087538600009','HEMP OIL,OG',9.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','169','0','0','1','0',0,'0','2009-09-15 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12283') +('0087538600012','LIVING HARVEST HEMP VAN SPICE',22.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','105','0','1','1','0',0,'499','2009-09-23 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12284') +('0087538600030','HEMPMILK ORIGINAL',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12285') +('0087538600031','HEMPMILK CHOCOLATE',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12286') +('0087538600032','HEMPMILK VANILLA',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12287') +('0087538600040','HEMPMILK UNSWEETND ORIG',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','166','0','0','1','0',0,'0','2009-09-15 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12288') +('0087538604007','TEMPT VANILLA BEAN ICE CRM',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-05-19 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12289') +('0087538604017','TEMPT COFFEE BISCOTTI ICE CRM',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-05-19 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12290') +('0087538604029','TEMPT CHOCOLATE FUDGE ICE CRM',4.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-05-19 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12291') +('0087631400008','PINE NUT OIL',18.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-27 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12292') +('0087631400122','MOSCATEL VINEGAR',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2008-04-18 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12293') +('0087631400134','BELLA RUSTICO HERB and PARSLEY',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12294') +('0087631400135','BELLA RUSTICO ROSEMARY',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12295') +('0087631400136','BELLA RUSTICO SESAME',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12296') +('0087631400137','BELLA RUSTICO TRADITIONAL',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12297') +('0087631400138','BELLA RUSTICO S and P',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12298') +('0087631400139','BELLA RUSTICO PARM PEC',4.09,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','2','1','0',0,'0','2007-11-15 03:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12299') +('0087683000105','FLOWERS 25. OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12300') +('0087683000106','RECYCLE 25 OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12301') +('0087683000107','25.OZ. S.STEEL BOTTLE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-04-29 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12302') +('0087683000109','STARRY NIGHT 25 OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12303') +('0087683000116','GO GREEN 25. OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12304') +('0087683000117','HEARTS 25 OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12305') +('0087683000118','SO BLUE 25OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12306') +('0087683000119','GREEN HILLS 25OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12307') +('0087683000189','RECYCLE 20 OZ. BOTTLE',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12308') +('0087683000190','APPLE BLOSSOMS',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-06-05 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12309') +('0087683000191','DRAGON 20 OZ. BOTTLE',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12310') +('0087683000192','CHERRY BLOSSOMS 20 oz.',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12841') +('0087683000193','SPRING FORWARD 20 oz.',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12311') +('0087683000195','BLACK 20 OZ. BOTTLE',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-25 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12992') +('0087683000219','S.S STEEL 20OZ. BOTTLE',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12312') +('0087683000373','METALLIC BOTTLE 20OZ.',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12961') +('0087683000374','METALLIC SMOKE BOTTLE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12313') +('0087683000395','FOREST 25OZ. BOTTLE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-05-28 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12314') +('0087683000397','THE WAVE 25OZ. BOTTLE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-05-28 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12315') +('0087683000400','SPRING MORNING',11.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-31 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12842') +('0087683000403','PURPLE CHERRY BLOSSOMS 20 oz.',12.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12843') +('0087683000409','PURPLE BLOSSOMS 25OZ. BOTTLE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-05-28 01:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12316') +('0087683000413','BIRDS 25OZ. BOTTLE',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-06-12 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12317') +('0087683000414','HIBISCUS 25 OZ. WATER BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12318') +('0087683000415','BLACK 25 OZ. BOTTLE',13.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'mixmatchcode','2009-09-25 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12319') +('0087715900011','BIDGEE TOMATO',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12320') +('0087715900013','BIDGEE LEMON MYRTLE',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12321') +('0087715900015','BIDGEE PEPPERBERRY',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12322') +('0087715900017','BIDGEE MINT BUSH',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12323') +('0087715900019','BIDGEE FOREST BERRY',6.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2007-11-14 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12324') +('0087839700300','SOY WHIP TOPPING',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','31','0','0','1','0',0,'0','2008-11-24 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12325') +('0088010533072','PJUICE VOLCANO BLOOD 250ml',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1092','2008-04-01 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12326') +('0088061212104','PGRAPEFRUIT BAG WHITE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1085','2008-01-22 04:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12327') +('0088061213003','PTANGERINE BAG',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'634','2007-12-14 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12328') +('0088061215003','PTANGELO BAG',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'1136','2009-02-18 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12329') +('0088102430040','CIBO BASIL WALNUT',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-28 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12330') +('0088102430041','CIBO HERB GARLIC',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-28 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12331') +('0088102430042','CIBO GAR TOMATO CHEESE SPREAD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-28 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12332') +('0088102430043','CIBO NAT SMKD JALA CHEESE SPRD',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-28 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12333') +('0088124516308','ORGANIC MOZZARELLA',7.30,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-08-26 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','3',0.00,'0','12806') +('0088143201117','PAPPLE BAG HONEYCRIS',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'535','2008-10-15 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12334') +('0088177510001','PIZZA CRUST',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12335') +('0088177510012','BUTTERMILK BREAD',5.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12336') +('0088177510014','SMALL CARROT CAKE',2.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12337') +('0088177510019','GRAN F CINNAMON ROLLS',6.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12338') +('0088177510024','DINNER ROLLS',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12339') +('0088177510026','EGG BREAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12340') +('0088177510027','ENGLISH MUFFINS',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12341') +('0088177510029','HAMBURGER BUNS',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12342') +('0088177510030','HOT DOG BUNS',4.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','150','0','0','1','0',0,'0','2005-11-08 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12343') +('0088177510032','GRAN F LEMON BARS',3.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12344') +('0088177510034','PEANUT BUTTER COOKIE',5.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12345') +('0088177510035','GRANDMA FERDONS PIE CRUST',6.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-01-28 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12346') +('0088177510039','SMALL PUMPKIN BAR',2.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12347') +('0088177510049','GRANDMA FERDONS PUMPERNICKLE',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2009-01-28 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12348') +('0088177512034','GUAR GUM, GRANDMA FERDONS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2007-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12349') +('0088177520002','SMALL CHEESE PIZZA',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','44','0','0','1','0',0,'0','2007-08-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12350') +('0088177570030','FLOUR MIX, GRANDMA FERDONS',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','153','0','0','1','0',0,'0','2007-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12351') +('0088177577003','GRANDMA F CHOC COOKIE DOUGH',9.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-10-30 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12352') +('0088177577005','GRAN F PB COOKIE DOUGH',6.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-10-30 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12353') +('0088177580000','CHOW MEIN NOODLES, GLUTEN FREE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2008-05-01 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12354') +('0088177580001','PASTA,BR RICE GMA FERDONS',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2007-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12355') +('0088177580002','PASTA,FETTUCCINE GMA FERDONS',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2007-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12356') +('0088177580004','PASTA, SPAGHETTI, GMA FERDONS',5.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','170','0','0','1','0',0,'0','2007-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12357') +('0088177590002','CHIPS, GMA FERDONS',3.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2007-09-28 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12358') +('0088255300000','SALMON, WILD ALASKA SOCKEYE',4.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'499','2009-04-23 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12359') +('0088255300010','SALMON, WILD ALASKA PINK',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'499','2009-07-20 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12360') +('0088268303010','PAPPLE BAG GRANNY SMITH',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'531','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12361') +('0088268303011','PAPPLE BAG BRAEBURN',4.99,'0',0.00,'0',4.49,'0',4.49,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','540','0','0','1','0',0,'-2','2009-09-09 05:02:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12362') +('0088268303012','PAPPLE BAG FUJI',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'532','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12363') +('0088268303013','PAPPLE BAG PIPPEN',4.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'697','2007-03-08 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12364') +('0088268303014','PAPPLE BAG PINK LADY',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'530','2009-09-21 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12365') +('0088397807975','CEREAL, SWEETENED WHEATFULS',3.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12366') +('0088397807978','CEREAL, HONEY GRAHAM',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12367') +('0088397807979','CEREAL, TOASTED CINN SQUARES',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','157','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12368') +('0088424400005','DOG TREATS,CHCKN,VITALITY',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','1','0','0',0,'0','2008-05-09 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12369') +('0088424400009','DOG TREATS,CHCKN,BREATHIE',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','182','0','2','0','0',0,'0','2008-05-09 10:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12370') +('0088576100001','PSALAD SPRING MIX BAG',3.29,'0',0.00,'0',2.99,'0',2.99,'0','2009-09-24 12:00:00','2009-09-30 12:00:00','521','0','0','1','0',0,'669','2009-04-22 07:01:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12371') +('0088576100004','PSALAD BABY ROMAINE',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'667','2009-01-07 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12372') +('0088576100005','PSALAD ARUGULA',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'665','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12373') +('0088576100006','PSALAD ITALIAN MIX',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'668','2009-04-22 07:01:00','0',0.01,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12374') +('0088576100008','PSALAD SPRING MIX CLAM 5 OZ',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1357','2008-10-18 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12375') +('0088576100009','PSALAD ITALIAN MIX',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'668','2009-04-22 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12376') +('0088576100016','PCARROT BAG 5#',5.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','511','0','0','1','0',0,'513','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12377') +('0088576100017','PLETTUCE ROMAINE HEARTS',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','515','0','0','1','0',0,'541','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12378') +('0088576100019','PSALAD SPRING MIX CLAM 1#',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'695','2009-06-03 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12379') +('0088576100022','PPOTATO BAG RUSSET',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'523','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12380') +('0088576100023','POTATO BAG RED P.N.',6.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','519','0','0','1','0',0,'524','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12381') +('0088601212004','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12382') +('0089012600013','BINDI MASSAGE OIL LG',21.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12383') +('0089014600101','ORGANIC LOLLIPOPS',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-04-26 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12384') +('0089014600147','DROPS OG ASSORTED',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2007-05-17 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12385') +('0089014600148','DROPS, OG, POMEGRANATE',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-04-09 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12386') +('0089014600149','DROPS, OG, CHEEKY LEMON',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2008-04-09 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12387') +('0089015600111','1 DRINK,MIXED BERRIES',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12388') +('0089015600131','1 DRINK,BLUEBERRY VAN',2.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-12-12 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12389') +('0089044400010','CRACKERS,OG,ROUND SALTINE',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12390') +('0089044400020','CRACKERS,OG,CLASSIC RICH',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12391') +('0089044400035','CRACKERS, OG, BITE SIZE CHED',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12392') +('0089044400080','MINI RICH & CHEESE CRKR',3.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2008-08-26 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12393') +('0089052900150','PJAR CUT PINEAPPLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'744','2008-01-04 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12394') +('0089052900152','PJAR CUT PAPAYA',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'743','2008-01-04 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12395') +('0089052900153','PJAR FRUIT COCKTAIL',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'745','2008-01-04 06:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12396') +('0089104800100','COUNTRY SQUARE TRAIL MIX',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1616','2008-08-29 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12397') +('0089104800103','COUNTRY SQUARE CHOCO PBR',1.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','0','1','0',0,'1616','2008-08-29 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12398') +('0089141200202','PCRANBERRY SAUCE ORANGE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1077','2007-11-05 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12399') +('0089141200203','PCRANBERRY SAUCE NE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','552','0','0','1','0',0,'1076','2007-11-05 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12400') +('0089147500102','GUMMY WORMS,OG',1.95,'0',0.00,'0',1.39,NULL,1.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2008-11-06 01:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12401') +('0089147500105','JELLY BEANS OG',1.95,'0',0.00,'0',1.39,NULL,1.39,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','179','0','1','1','0',0,'0','2008-06-13 11:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12402') +('0089162700214','PHILS GREEN CHILE BURRITO',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12403') +('0089162700216','PHILS BURRITO, BEAN & CHEESE',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12404') +('0089162700218','PHILS CHORIZO BURRITO',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12405') +('0089162700219','BURRITO,PORK GREEN CHILE',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12406') +('0089162700240','PHILS CHICKEN CHILE BURRITO',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12407') +('0089162700241','PHILS SHREDDED BEEF BURRITO',3.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','40','0','0','1','0',0,'0','2009-08-21 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12408') +('0089164400181','POMOLOGY ANTIAGE MIX 3O SERV',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-04-30 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12409') +('0089164400183','POMOLOGY ENERGY MIX 3O SERV',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2009-04-30 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12410') +('0089164400185','POMOLOGY IMMUNE MIX 3O SERV',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'499','2009-04-30 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12411') +('0089168400200','PDRESSING SG APPLE-MAPLE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1317','2008-10-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12412') +('0089168400201','PDRESSING SG CURRY-FIG',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1319','2008-10-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12413') +('0089168400202','PDRESSING SG BLUEBERRY-BASIL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1318','2008-10-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12414') +('0089168400203','PDRESSING SG POMEGRANATE-PEAR',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1320','2008-10-27 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12415') +('0089175600001','MAYA KAIMAL TIKKA MASALA',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-22 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12416') +('0089175600002','VINDALOO',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12417') +('0089175600003','COCONUT CURRY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12418') +('0089175600004','TAMARIND CURRY',8.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'499','2009-09-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12419') +('0089175600007','MAYA KAIMAL KORMA',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-06-23 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12420') +('0089177000204','GOODBELLY BLK CURRANT PRO',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2008-11-05 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12421') +('0089177000205','GOODBELLY,MANGO,PROBIOTI',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'499','2009-09-21 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12422') +('0089177000206','GOODBELLY,CRNBRYWTML PRO',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2008-11-05 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12423') +('0089177000212','GOODBELLY BLUEBERRY PROBIO',4.45,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','37','0','0','1','0',0,'0','2009-09-24 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12982') +('0089198200200','RC BRGR,SOY FR,ORIGINAL',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12424') +('0089198200202','RC BRGR,SOY FR,JERKIN SP',5.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','45','0','0','1','0',0,'0','2008-11-14 11:05:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12425') +('0089223400200','MIX,ORIGINAL',4.45,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-06-04 10:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12426') +('0089223400201','MIX,CRACKER',4.45,'0',0.00,'0',2.79,NULL,2.79,NULL,'2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-06-04 10:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12427') +('0089234200100','Vignette Pinot Noir',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-31 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12428') +('0089234200101','Vignette Chardonnay',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-05-31 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12429') +('0089235100001','AVANT HAND SANITIZER',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2008-08-20 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12430') +('0089251900200','PGREENS STEAMING',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','521','0','0','1','0',0,'1396','2009-06-18 08:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12431') +('0089277300060','KETTLE CORN 7 OZ ANGIES',3.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','158','0','0','1','0',0,'0','2007-02-16 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12432') +('0089304800001','CRISPY CAT BAR, MINT COCONUT',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12433') +('0089304800005','CRISPY CAT BAR, TOASTED ALMOND',2.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-07-22 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12434') +('0089345500000','ONE W NATURE LAVENDER BAR SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12435') +('0089345500005','ONE W NATURE HEMP SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12436') +('0089345500007','ONE W NATURE DEAD SEA MUD SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12437') +('0089345500008','ONE W NATURE DEAD SEA BAR SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12438') +('0089345500013','ONE W NATURE BING CHERRY SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12439') +('0089345500033','ONE W NATURE SHEA BAR SOAP',4.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-09-17 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12440') +('0089345500064','ONE W NATURE LAVENDER HANDWASH',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-07-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12441') +('0089345500065','ONE W NATURE SHEA HAND WASH',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-07-08 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12442') +('0089345500066','ONE W NATURE COCLIME HAND WASH',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12443') +('0089345500067','ONE W NATURE FF MUD HAND SOAP',7.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'499','2009-09-17 10:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12444') +('0089345500068','ONE W NATURE LAVENDER BODYWASH',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','1','0','0',0,'0','2009-07-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12445') +('0089345500069','ONE W NATURE SHEA BODY WASH',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12446') +('0089345500070','ONE W NATURE COCLIME BODY WASH',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-07-07 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12447') +('0089345500071','ONE W NATURE FF MUD BODY WASH',8.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','95','0','1','0','0',0,'499','2009-05-13 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12448') +('0089345500072','ONE W NATURE LAVENDER LOTION',9.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-07-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12449') +('0089345500073','ONE W NATURE SHEABUTTER LOTION',9.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-07-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12450') +('0089345500074','ONE W NATURE COC LIME LOTION',9.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-07-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12451') +('0089345500075','ONE W NATURE FRAG FREE LOTION',9.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2009-07-07 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12452') +('0089366900126','HOT COLD BAG LG.',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-06-18 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12453') +('0089366900127','HOT COLD BAG SM',2.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-06-18 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12454') +('0089432100072','NASALINE RINSING SYSTEM, BOX',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'0','2007-11-09 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12455') +('0089432100074','NASALINE JR NASAL RINSING SYS',14.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','103','0','1','0','0',0,'0','2008-07-03 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12456') +('0089445500008','PNT BTR,OG,SQZ,CLASSIC',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-06-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12457') +('0089445500009','PNT BTR,OG,SQZ,HONEY',0.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-06-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12458') +('0089445500018','ALMOND BUTTER,NAT,CLASSIC',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-06-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12459') +('0089445500020','ALMOND BUTTER,NAT,MAPLE',1.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','168','0','0','1','0',0,'0','2009-06-11 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12460') +('0089477300101','SODA,NATURAL COLA,STEVIA',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-08-07 04:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12461') +('0089477300102','SODA,NATURAL TWIST,STEVIA',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-07-17 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12462') +('0089477300104','SODA,NATURAL RT BEER,STEV',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-07-17 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12463') +('0089477300110','SODA,NAT BLK CHERRY, DIE',6.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2009-07-15 08:03:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12464') +('0089517200102','PURE LIFE CHAMOMILE SHAMPOO',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12465') +('0089517200103','PURE LIFE CHAMOMILE COND',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12466') +('0089517200106','PURE LIFE WILD INDIGO SHAMPOO',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12467') +('0089517200107','PURE LIFE WILD INDIGO COND',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12468') +('0089517200108','PURE LIFE GREEN TEA SHAMPOO',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12469') +('0089517200109','PURE LIFE GREENTEA CONDITIONER',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12470') +('0089517200110','PURE LIFE ALOE 2 IN 1 SH COND',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12471') +('0089517200119','PURE LIFE ALOE E FACIAL CREAM',10.85,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12472') +('0089517200122','PURE LIFE OATMEAL FACIAL WASH',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12473') +('0089517200123','PURE LIFE VOL CLAY FACIAL WASH',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','94','0','1','0','0',0,'0','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12474') +('0089517200133','PURE LIFE ALOE SOAP',5.85,'0',0.00,'0',4.65,'0',4.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'499','2009-08-29 08:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12475') +('0089517200134','PURE LIFE HONEY SOAP',5.85,'0',0.00,'0',4.65,'0',4.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12476') +('0089517200136','PURE LIFE COCONUT SOAP',5.89,'0',0.00,'0',4.65,'0',4.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12477') +('0089517200138','PURE LIFE OATMEAL SOAP',5.85,'0',0.00,'0',4.65,'0',4.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12478') +('0089517200139','PURE LIFE SEAWEED SOAP',5.85,'0',0.00,'0',4.65,'0',4.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12479') +('0089517200140','PURE LIFE VOLCANIC CLAY SOAP',5.85,'0',0.00,'0',4.65,'0',4.65,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','98','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12480') +('0089517200144','PURE LIFE COC VANILLA LOTION',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12481') +('0089517200146','PURE LIFE PAPAYA SHAMPOO',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12482') +('0089517200147','PURE LIFE PAPAYA CONDITIONER',11.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12483') +('0089517200152','PURE LIFE GINGER ORANGE LOTION',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12484') +('0089517200153','PURE LIFE LEMONGR MINT LOTION',11.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-07-31 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12485') +('0089543100002','COFFEE HEAVY PEDAL PEACE 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-07-01 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12486') +('0089543100005','COFFEE PEACE ETHIOPIAN 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12487') +('0089543100006','COFFEE ESPRESSO PEACE 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12488') +('0089543100007','COFFEE PEACE FRENCH 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12489') +('0089543100008','COFFEE PEACE GUATEMALAN 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12490') +('0089543100012','COFFEE PEACE SUMATRAN 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12491') +('0089543100014','COFFEE PEACE BIRCHWOOD 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12492') +('0089543100022','COFFEE PEACE BLUE OX BLEND 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12493') +('0089543100023','COFFEE PEACE TWIN CITIES 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12494') +('0089543100024','COFFEE PEACE COLOMBIAN DRK 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-06-10 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12495') +('0089543100033','COFFEE PEACE YETI COLD 1LB',11.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','245','0','0','1','0',0,'499','2009-07-01 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12496') +('0089553800001','FLATBREAD,OG,KLASSIC',4.79,'0',0.00,'0',3.79,'0',3.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12497') +('0089553800002','FLATBREAD,OG,PUMPKIN SEE',4.79,'0',0.00,'0',3.79,'0',3.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-08-26 10:04:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12498') +('0089553800011','FLATBREAD,OG,SEEDLD SPELT 7 OZ',4.79,'0',0.00,'0',3.79,'0',3.79,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','159','0','0','1','0',0,'0','2008-03-14 09:04:00','0',0.0,'1','2','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12499') +('0089554300100','CORN TORTILLA',2.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'0','2008-07-22 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12500') +('0089554300102','WRAPS SONOMA OG TRADITIONAL',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','38','0','0','1','0',0,'mixmatchcode','2009-02-12 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12501') +('0089563100101','Curds Goat Caprine Supreme',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-24 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12502') +('0089563100102','CURDS GOAT GARLIC DILL CAPRINE',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-11-24 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12503') +('0089567700201','SPOOKY SAUCE HOT SAUCE',5.79,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-02-02 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12504') +('0089586500151','NCGA BAG',1.25,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','2008-09-26 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'12505') +('0089595100017','WILD BERRY POURABLE YOGURT',7.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','35','0','0','1','0',0,'0','2009-03-11 11:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12506') +('0089654200100','CASHEW NUTS,OG,CHOC CVRD',7.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-07-17 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12507') +('0089654200101','ESPRESSO BNS OG CHOC CVRD',6.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-04-07 08:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12508') +('0089654200103','MADAMIA NUTS,OG,CHOC CVR',8.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-07-17 12:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12509') +('0089676700100','COCONUT BLISS OG NAKED',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'0','2009-06-16 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12510') +('0089676700118','COCONUT BLISS OG CHOC HZLNT',5.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','39','0','0','1','0',0,'499','2009-06-16 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12511') +('0089685900036','BBQ SAUCE,OG,ORIGINAL',5.39,'0',0.00,'0',4.39,'0',4.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-08-21 11:03:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12512') +('0089685900037','BBQ SAUCE,OG,HOT & SPICY',5.39,'0',0.00,'0',4.39,'0',4.39,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','160','0','0','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12513') +('0089693800106','DR SEARS BRAINY KIDZ 30 CHEWS',13.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','108','0','1','0','0',0,'499','2009-09-15 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12514') +('0089699300206','CALRY SAGE REED DIFFUSER',23.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-20 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12774') +('0089699300208','ORANGE GINGER REED DIFFUSER',23.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-20 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12775') +('0089699300222','ROSE GERANIUM REED DIFFUSER',23.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-08-20 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12776') +('0089699300239','3X3 PILLAR CANDLE',9.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12778') +('0089699300240','3X6 PILLAR CANDLE',14.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12779') +('0089758000010','CRACKERS,ORIGINAL,W/F,G/F',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12515') +('0089758000012','CRACKERS,ONION,W/F,G/F',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12516') +('0089758000013','CRACKRS OG HERB WF GF',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12517') +('0089758000015','CRACKERS,BLK PEPPER,WF,GF',4.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','159','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12518') +('0089758000109','SUNBEAM 3 X 6 PILLLER',16.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-09-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12916') +('0089758000117','10 IN TAPERS SUNBEAM CANDLES',6.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-08-07 11:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12519') +('0089798800001','CONDENSED MILK,OG,SWTND',3.79,'0',0.00,'0',3.19,'0',3.19,'0','2009-07-30 12:00:00','2009-09-30 12:00:00','153','0','0','1','0',0,'0','2009-08-13 01:00:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12756') +('0089827100000','APPLE BUTTER',6.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','0','0',0,'0','2007-06-08 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12520') +('0089859600126','DARK CHOC EGGS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-03-24 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12521') +('0089859600127','MILK CHOC EGGS',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','179','0','1','1','0',0,'0','2009-03-24 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12522') +('0089888600100','FUNCTION URBAN DETOX',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1625','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12523') +('0089888600102','FUNCTION BRAINIAC',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1625','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12524') +('0089888600104','DRINK ALT ENERGY FUNCTION',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'1625','2008-08-15 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12525') +('0089888600127','FUNCTION WATER',1.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','188','0','0','1','0',0,'0','2009-05-11 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12526') +('0089888600130','NIGHT LIFE, FUNCTION',1.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','189','0','1','1','0',0,'0','2008-11-06 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12527') +('0089899800011','GLUTEN-FREE LIVING MAG',8.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2008-06-13 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12528') +('0089899900002','COCONUT WATER, ORIGINAL',1.89,'0',0.00,'0',1.59,'0',1.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12529') +('0089899900020','COCONUT WATER, PINEAPPLE',1.89,'0',0.00,'0',1.59,'0',1.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','165','0','0','1','0',0,'0','2009-01-09 10:01:00','0',0.0,'1','2','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12530') +('0089903300001','EPICUREAN CUTTING BOARD, 8X6',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12532') +('0089903300002','EPICUREAN CUTTING BOARD, 12X9',19.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12533') +('0089903300003','EPICUREAN CUTTING BOARD, 15X11',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12534') +('0089903300004','EPICUREAN CUTTING BOARD, 18X13',32.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12535') +('0089903300005','EPICUREAN CUTTING BOARD, 17X10',24.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12536') +('0089903300006','EPICUREAN CUTTING BOARD, 22X10',29.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12537') +('0089903300069','EPICUREAN CUTTING BOARD, 14X11',28.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-06-18 05:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12538') +('0089958700023','BAR RAW FOOD HAZELNUT CHOC',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12539') +('0089958700026','BAR RAW FOOD CASHEW AGAVE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12540') +('0089958700028','BAR RAW FOOD SPIRULINA CASH',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','154','0','1','1','0',0,'0','2008-07-18 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12541') +('0089982000201','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12542') +('0089996600107','OTTER CREEK CHEDDAR WINTER',7.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12543') +('0089996600177','OTTER CREEK CHEDDAR PESTO',9.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2007-11-14 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12544') +('0093338344021','PAPPLE BAG R DELICIO',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'528','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12545') +('0093338344042','PAPPLE BAG MACINTOSH',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'692','2006-10-29 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12546') +('0093966213607','ORGANIC VALLEY PEPPERJACK',3.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2005-04-30 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12547') +('0093966412109','ORGANIC VALLEY SHRED CHEDDAR',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2004-10-15 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12548') +('0099857034015','pherb bASIL 4OZ PESTO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'903','2009-07-09 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12551') +('0099985765563','PTOMATO GRAPE',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12552') +('0200810000000','QUINOA OF THE SEA',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','63','0','2','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12553') +('0213747167968','PCOCONUT YOUNG NON-O',3.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','547','0','0','0','0',0,'699','2009-09-09 05:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12554') +('0216230000000','VEGIE DOG',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12555') +('0216275009994','CURDS WHITE EICHTEN',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2008-09-24 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12556') +('0230231000000','DOUBLE GLOUCESTER',15.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','231','0','0','1','1',0,'0','2005-10-31 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12557') +('0252200701854','PGREEN BEANS',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','208','0','0','1','1',0,'0','2008-12-18 05:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12558') +('0256100601009','PJU DJINNIS ELIXIR 8',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','202','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12559') +('0256100902691','PJU EMERALD ELIXIR',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','202','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12560') +('0256300203997','PJU EMERALD ELIXIR16',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','202','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12561') +('0258500202398','PPEAS ENGLISH SHELL',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','509','0','0','1','1',0,'977','2009-07-22 06:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12562') +('0260000000000','Nut Triangles',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','229','0','0','1','0',0,'0','2005-04-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12563') +('0270070605491','Chicken',5.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','65','0','0','0','0',0,'0','2006-06-23 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12564') +('0271300000000','BEELER SPIRAL CUT HAM',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','260','0','0','1','0',0,'0','2007-12-06 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12566') +('0276210000000','WHOLE FARM CHEVON',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','261','0','0','1','0',0,'0','2008-03-28 07:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'8',NULL,NULL,'12567') +('0280000000000','Romaine Pears Gorganzola Salad',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-04-29 03:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12568') +('0280010000000','DBLEUPEARSALAD',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','228','0','2','1','0',0,'0','2005-05-02 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12569') +('0284945000000','ROASTED GARLIC',3.99,'3',0.50,'2',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','66','0','0','1','0',0,'-1','2006-07-31 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12570') +('0315525000140','CAMEMBERT CHATELAIN',9.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','2','1','0',0,'0','2008-05-28 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12571') +('0320400003204','PFL DAHLIA',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','500','0','1','0','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12572') +('0400163808813','WELEDA BABY DIAPER CARE',11.39,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','0','0','0',0,'0','2009-06-10 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12573') +('0400163808818','CALENDULA LOTION',12.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12574') +('0400163808819','CALENDULA OIL',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','0','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12575') +('0400163808828','WELEDA SEA BUCKTHORN BODYWASH',15.19,'0',0.00,'0',9.85,'0',9.85,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','93','0','1','0','0',0,'0','2009-08-26 01:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1','0','5',0.00,'0','12811') +('0400163808832','WELEDA BABY BODY WASH',10.49,'0',0.00,'0',6.79,'0',6.79,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','98','0','1','0','0',0,'499','2009-07-10 02:04:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12576') +('0400163809610','FACIAL OIL,ALMOND',21.85,'0',0.00,'0',15.99,'0',15.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','94','0','1','0','0',0,'0','2009-06-10 09:03:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12577') +('0400163809611','CLEANSNG LOTION,ALMOND',16.99,'0',0.00,'0',12.75,'0',12.75,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','94','0','1','0','0',0,'0','2009-01-12 08:04:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12578') +('0400163809750','WELEDA SEA BUCK BODY LOTION',18.99,'0',0.00,'0',12.29,'0',12.29,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','97','0','1','0','0',0,'0','2009-03-02 07:03:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12579') +('0400163809793','MOISTURE CREAM,ALMOND',21.85,'0',0.00,'0',15.99,'0',15.99,'0','2009-07-10 12:00:00','2009-09-30 12:00:00','94','0','1','0','0',0,'0','2009-06-10 09:03:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12580') +('0400163809802','WELEDA CHILDRENS TOOTH GEL',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'mixmatchcode','2009-06-10 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12581') +('0400163809804','WELEDA PLANT GEL TP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12582') +('0400163809808','WELEDA PINK RATAHNIA TP',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12583') +('0400163809809','WELEDA SALT TOOTHPASTE',5.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','99','0','1','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12584') +('0400163809840','WELEDA ROSEMARY HAIR OIL',13.35,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','96','0','1','0','0',0,'0','2009-06-10 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12585') +('0400163809859','SKIN FOOD',16.15,'0',0.00,'0',10.49,'0',10.49,'0','2009-09-11 12:00:00','2009-10-31 12:00:00','97','0','1','0','0',0,'0','2009-08-27 08:05:00','1',0.0,'1','1','lb','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12816') +('0400163809894','WELEDA CALENDULA SOAP',6.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','98','0','0','0','0',0,'0','2009-01-12 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12586') +('0400432818002','TOMATO FILM',13.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'0','2009-05-21 11:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12587') +('0418957000072','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12588') +('0502396222341','FENTIMANS VICTORIAN LEMONADE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-05-29 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12589') +('0502396322775','FENTIMANS ORANGE JIGGER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-05-29 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12590') +('0502396322782','FENTIMANS CURIOSITY COLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-05-29 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12591') +('0502939621235','FENTIMANS DANDELION BURDOCK',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','1','1','0',0,'499','2009-08-14 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12592') +('0502939622233','FENTIMANS GINGER BEER',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','1','1','0',0,'499','2009-05-29 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12593') +('0502939622234','FENTIMANS VICTORIAN LEMONADE',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','1','1','0',0,'499','2009-08-14 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12594') +('0502939632277','FENTIMANS ORANGE JIGGER SODA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','1','1','0',0,'499','2009-08-14 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12595') +('0502939632278','FENTIMANS CURIOSITY COLA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-05-31 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12596') +('0641096100448','PBERRY RASPBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'520','2009-07-23 11:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12597') +('0653571421110','PBERRY BLUE 1/2 PINT',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12598') +('0653571422117','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12599') +('0691743004204','BOULDER SERRANO SAUCE',4.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','161','0','0','1','0',0,'0','2005-09-26 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12600') +('0692112985359','SUSHI MAT W/SPOON',4.59,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','242','0','1','0','0',0,'499','2009-04-16 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12601') +('0704348400963','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12602') +('0717940000038','SIMPLERS GERANIUM ROSE 5 ML',13.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','89','0','1','0','0',0,'0','2008-11-06 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12603') +('0724742008222','BODY CREAM,PAPAYA MANGO',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12604') +('0724742008246','BODY CREAM,KUKUI NUT',11.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2005-11-01 03:01:00','0',0.0,'1','0','12','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12605') +('0740107920101','PBERRY BLACKBERRY',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'519','2009-08-26 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12606') +('0742900000013','BWATER THREE GALLON REFILL',1.29,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','14','0','0','1','0',0,'0','2005-11-18 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'1',NULL,NULL,'12607') +('0748404011175','PSEEDS NY HEAD',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','209','0','0','1','0',0,'0','1990-01-01 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12608') +('0751972031003','PGRAPEFRUIT BAG',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','544','0','0','1','0',0,'526','2009-09-16 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12609') +('0761127890223','DR DUNNER SAMBU LOZENGES 40 CT',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','101','0','1','0','0',0,'0','2008-09-12 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12610') +('0767776101217','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12611') +('0773097581001','PBERRY BLUEBERRY NON-O',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'720','2009-09-17 03:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12612') +('0774255671208','PCUCUMBER HYDROPONIC NON-O',2.89,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','527','0','0','1','0',0,'877','2007-10-01 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12613') +('0789622525749','PORANGE BAG VALENCIA',4.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'558','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12614') +('0789622905152','PDRESSING BUTTERMILK RANCH',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'884','2007-10-18 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12615') +('0789622905176','PDRESSING ROMANO',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','528','0','0','1','0',0,'885','2008-10-25 09:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12616') +('0789622905183','PDRESSING CHIPOTLE',2.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','514','0','0','1','0',0,'1014','2009-08-26 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12617') +('0842574600003','MEMBRILLO QUINCE PASTE',8.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-02-13 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12618') +('0858073000997','PTOMATO CHERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','524','0','0','1','0',0,'542','2009-09-09 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12620') +('0875764600101','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12621') +('0933694800001','TUNA, CHILI',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-11-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12622') +('0933694800004','TUNA, TOMATO BASIL',2.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-11-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12623') +('0933694800203','SALMON, SMOKED',2.69,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','172','0','0','1','0',0,'0','2008-11-06 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'4',NULL,NULL,'12624') +('0941895700007','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12625') +('0942190012501','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12626') +('0942190012502','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12627') +('0942190021812','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12628') +('0978006000571','BEER BOOK',14.96,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-03-14 03:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'12629') +('0978015603242','ORGANIC INC.',14.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-17 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12938') +('0978030727754','HEALTHY AGING',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12630') +('0978031220635','BAKIN WITHOUT EGGS',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12631') +('0978044634312','SUGAR BLUES',6.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12633') +('0978047083928','THE BRAIN WASH',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-06-25 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12634') +('0978047179213','THE 4 WEEK DETOX PLAN',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-06-25 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12635') +('0978055338115','INA MAYS CHILDBIRTH',18.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'499','2009-06-24 12:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12636') +('0978055338335','BRAIN FOODS FOR KIDS',17.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12637') +('0978065800996','ENCYCLOPEDIA OF NAT PET CARE',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12638') +('0978068816627','NATL ALTS TO OTC & PRESC DRUGS',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12640') +('0978074326507','THE CHEMISTRY OF JOY',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12641') +('0978076791450','YOGA FOR DEPRESSION',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12899') +('0978078947990','COMPLETE MASSAGE BOOK',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12644') +('0978078949686','101 ESSENTIAL MASSAGE TIPS',5.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12645') +('0978080506078','GLUTEN FREE GOURMET BREADS',19.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12646') +('0978081183604','BOOK OF BACKYARD COOKING',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12647') +('0978084873296','FAMILY FEASTS FOR $75',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12908') +('0978087857752','THE NEW SEED STARTER HNDBK',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12649') +('0978087857991','RODALE COMPOSTING',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'499','2009-05-06 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12650') +('0978088150803','TOO MANY TOMATOES',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12651') +('0978088266703','ROOT CELLARING',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12898') +('0978088266888','NATURAL SOAP BOOK',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12652') +('0978089019033','FRESH VEG AND FRUIT JUICE',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-05-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12653') +('0978089658650','LANDSCAPING WITH NATIVE PLANTS',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12654') +('0978091495506','AYURVEDIC COOKBOOK',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12655') +('0978093425282','BEYOND ASPRIN',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12656') +('0978096146200','CHILDBEARING YEAR',11.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12657') +('0978096146202','HEALING WISE BOOK',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'mixmatchcode','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12658') +('0978096608824','SALT YOUR WAY TO HEALTH',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-30 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12659') +('0978096736702','THE GRASSFED GOURMET COOKBK',22.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-10 12:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12660') +('0978097168853','DO IT GREEN MAG',8.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','240','0','1','0','0',0,'0','2009-04-17 08:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12661') +('0978097435849','Blue Sky Guide',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','0','0','0',0,'0','2005-12-04 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'12662') +('0978097657150','LIVER & GALLBLADDER FLUSH',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-28 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12663') +('0978097658900','CO-OP LABEL',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12664') +('0978097943910','THE FARMER AND GRILL',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'499','2009-04-24 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12665') +('0978097946750','SKIING THE NORTH SHORE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-11 04:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12666') +('0978097946751','CAMPING THE NORTH SHORE',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-05-01 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12667') +('0978141654904','HUNGER FREE FOREVER',25.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12668') +('0978141654971','ULTRA-MIND SOLUTION',27.50,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12669') +('0978141967125','SHOPPERS GDE TO HEALTHY LIVING',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-19 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12670') +('0978155788538','THIS CRAZY VEGAN LIFE',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12671') +('0978155832304','NURSING MOTHERS COMPANION',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12672') +('0978157061525','FEEDING THE WHOLE FAMILY',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12673') +('0978157067102','MISO COOKERY',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12674') +('0978158008126','ENCHANTED BROCCOLI FOREST',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12676') +('0978158017458','PRESERVING THE HARVEST',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 02:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12909') +('0978158270039','FLOWER ESSENCES FOR ANIMALS',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-10 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12679') +('0978158333236','PRESCRIPTION FOR HEALING',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12680') +('0978158648694','FOOD, INC',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12681') +('0978158761327','ONE BITE AT A TIME',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-05-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12682') +('0978159233223','ADHD AUTISM COOKBOOK',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12683') +('0978159486123','CARB CONSCIOUS VEG',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-15 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12684') +('0978187873665','JUICE FASTING',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12686') +('0978188433492','HEALTHY HEALING',32.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'499','2009-04-17 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12687') +('0978188482029','ADDAND ADHA DIET',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 09:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12688') +('0978188731780','NON-CHEWERS CKBK',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-10-17 08:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12689') +('0978189094102','AUS T TREE OIL FIRST AID HNDBK',6.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'mixmatchcode','2009-02-06 04:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12690') +('0978189112965','FOOD COMBINING CHART',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-25 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12990') +('0978189112974','ACID-ALKALINE CHART',5.75,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-25 08:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12989') +('0978193060301','BASIC BAKING',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12691') +('0978193168680','FIELD GUIDE TO PRODUCE',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2008-12-19 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12692') +('0978193210066','THE CHINA STUDY',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-07-30 09:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12693') +('0978193365008','Blue Sky Guide 2008',20.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','235','0','1','0','0',0,'0','2008-04-21 12:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'7',NULL,NULL,'12694') +('0978986778976','CHINESE HOME COOKING',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-17 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12695') +('23611000000','',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','230','0','0','1','0',0,'0','2009-07-24 08:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12696') +('23611050712','',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-07-24 08:03:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'12697') +('3367412850','NWAY FEVERFEW 100CT',10.65,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','102','0','1','0','0',0,'0','2009-05-20 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12698') +('4001638088282','WELEDA SEA BUCKTHORN BODYWASH',15.19,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','93','0','1','0','0',0,'499','2009-08-26 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','5',0.00,'0','12810') +('4001638088329','WELEDA BABY SHAMPOO BODY WASH',9.55,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','91','0','1','0','0',0,'0','2008-12-23 12:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12700') +('4001638097505','BODY LOTION,SEA BUCKTHOR',18.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'0','2008-12-11 11:00:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12701') +('4001638098595','SKIN FOOD',16.15,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','97','0','1','0','0',0,'499','2009-05-13 09:04:00','1',0.0,'1','0','lb','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12702') +('5029396222334','GINGER FENTIMANS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-07-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12703') +('5029396222341','LEMONADE FENTIMANS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-07-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12704') +('502939632277','FENTIMANS ORANGE JIGGER SODA',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-08-14 03:04:00','0',0.0,'0','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12761') +('5029396322775','ORANGE FENTIMANS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-07-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12705') +('5029396322782','COLA FENTIMANS',1.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2009-07-02 11:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12706') +('65153806702','',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-06-25 06:00:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'0',NULL,NULL,'12707') +('6890444065700','PAPPLE BAG GALA',4.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','540','0','0','1','0',0,'529','2009-09-09 05:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12708') +('7412430100000','PORANGE BAG NAVEL',5.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','543','0','0','1','0',0,'785','2009-02-18 07:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12709') +('8249462902017','RICE DIVINE VERY VANILLA BARS',3.49,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','46','0','0','1','0',0,'0','2009-01-11 06:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'2',NULL,NULL,'12710') +('83101200121','',0.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','600','0','0','0','0',0,'0','2009-09-02 02:02:00','0',0.0,'0','0','0','0','0',0,0.00,'1','0','0',0.00,'0','12848') +('8425746000039','Quince Paste',10.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','234','0','0','1','0',0,'0','2007-09-19 12:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'3',NULL,NULL,'12711') +('9321090500135','NEW MTN SANDALWOOD STICKS',14.39,'0',0.00,'0',8.59,'0',8.59,'0','2009-09-01 12:00:00','2009-09-30 12:00:00','86','0','1','0','0',0,'0','2008-06-12 02:00:00','0',0.0,'1','1','0','0','0',0,0.00,'1',NULL,'5',NULL,NULL,'12712') +('9421900125012','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'0','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12713') +('9421900125029','PBERRY BLUEBERRY',3.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','542','0','0','1','0',0,'521','2009-09-17 03:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'6',NULL,NULL,'12714') +('9780060005719','BREWMASTERS TABLE',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12715') +('9780307277541','HEALTHY AGING',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-02-02 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12716') +('9780312206352','BAKIN WITHOUT EGGS',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-19 06:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12718') +('9780470839287','THE BRAIN WASH',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-06-24 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12720') +('9780471792130','4-WEEK ULTIMATE BODY DETOX PLN',16.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-06-24 12:05:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12721') +('9780553383355','BRAIN FOODS FOR KIDS',17.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12722') +('9780615128832','DEAR AUNTIE, WHY ME?',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2005-11-09 02:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12723') +('9780658009969','ENCYCLOPEDIA OF NAT PET CARE',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12724') +('9780789479907','COMPLETE BOOK OF MASSAGE',9.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-19 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12729') +('9780789496867','101 ESSENTIAL MASSAGE TIPS',5.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-19 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12730') +('9780811836043','BACKYARD COOKING',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12731') +('9780848732967','FAMILY FEASTS FOR $75',12.99,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-09-16 01:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1','0','9',0.00,'0','12897') +('9780882668888','THE NATURAL SOAP BOOK',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-19 07:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12732') +('9780890190333','FRESH VEG AND FRUIT JUICE',9.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-05-08 10:01:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12733') +('9780914955061','THE AYURVEDIC COOKBOOK',17.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-19 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12734') +('9780934252829','BEYOND ASPRIN',14.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12735') +('9780966088243','SALT YOUR WAY TO HEALTH',15.00,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-04-30 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12736') +('9780976589006','THE COOP LABEL BOOK',15.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2006-09-13 02:00:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12737') +('9780979439100','THE FARMER AND THE GRILL',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12738') +('9781557885388','THIS CRAZY VEGAN LIFE',18.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-19 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12739') +('9781570615252','FEEDING THE WHOLE FAMILY',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-02-02 11:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12740') +('9781570671029','MISO COOKERY',10.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'mixmatchcode','2009-02-19 02:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12741') +('9781580081269','ENCHANTED BROCCOLI FOREST',19.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-01-19 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12744') +('9781587613272','ONE BITE AT A TIME',21.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:02:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12746') +('9781594862342','MEDITERRANEAN HARVEST',39.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:04:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12747') +('9789867789761','CHINESE HOME COOKING',24.95,'0',0.00,'0',0.00,'0',0.00,'0','1900-01-01 12:00:00','1900-01-01 12:00:00','244','0','1','0','0',0,'0','2009-03-06 01:03:00','0',0.0,'1','0','0','0','0',0,0.00,'1',NULL,'9',NULL,NULL,'12748') diff --git a/pos/is4c-web/install/data/subdepts.sql b/pos/is4c-web/install/data/subdepts.sql new file mode 100644 index 000000000..040f6cab8 --- /dev/null +++ b/pos/is4c-web/install/data/subdepts.sql @@ -0,0 +1,246 @@ +('5','HBC','92') +('5','HBC','104') +('1','BULK','14') +('4','GROCERY','191') +('9','Gen Merch','246') +('9','Gen Merch','249') +('6','Produce','247') +('6','Produce','248') +('9','Gen Merch','250') +('1','BULK','1') +('1','BULK','2') +('1','BULK','3') +('1','BULK','4') +('1','BULK','5') +('1','BULK','6') +('1','BULK','7') +('1','BULK','8') +('1','BULK','10') +('1','BULK','11') +('1','BULK','12') +('1','BULK','13') +('1','BULK','15') +('1','BULK','16') +('1','BULK','17') +('1','BULK','18') +('1','BULK','19') +('1','BULK','21') +('1','BULK','22') +('1','BULK','23') +('1','BULK','24') +('1','BULK','25') +('2','COOL/FROZEN','26') +('2','COOL/FROZEN','27') +('2','COOL/FROZEN','28') +('2','COOL/FROZEN','29') +('2','COOL/FROZEN','30') +('2','COOL/FROZEN','31') +('2','COOL/FROZEN','32') +('4','GROCERY','188') +('2','COOL/FROZEN','34') +('2','COOL/FROZEN','38') +('2','COOL/FROZEN','39') +('2','COOL/FROZEN','40') +('2','COOL/FROZEN','41') +('2','COOL/FROZEN','42') +('8','Meat','261') +('2','COOL/FROZEN','44') +('2','COOL/FROZEN','45') +('2','COOL/FROZEN','46') +('4','GROCERY','189') +('2','COOL/FROZEN','54') +('2','COOL/FROZEN','55') +('2','COOL/FROZEN','56') +('2','COOL/FROZEN','57') +('4','GROCERY','190') +('2','COOL/FROZEN','59') +('3','DELI','60') +('3','DELI','63') +('3','DELI','64') +('3','DELI','65') +('3','DELI','66') +('3','DELI','67') +('3','DELI','68') +('3','DELI','69') +('3','DELI','70') +('3','DELI','71') +('3','DELI','72') +('3','DELI','73') +('3','DELI','74') +('3','DELI','150') +('4','GROCERY','151') +('4','GROCERY','152') +('4','GROCERY','153') +('4','GROCERY','154') +('4','GROCERY','155') +('4','GROCERY','156') +('4','GROCERY','157') +('4','GROCERY','158') +('4','GROCERY','159') +('4','GROCERY','160') +('4','GROCERY','161') +('4','GROCERY','162') +('4','GROCERY','163') +('4','GROCERY','164') +('4','GROCERY','165') +('4','GROCERY','166') +('4','GROCERY','167') +('4','GROCERY','168') +('4','GROCERY','169') +('4','GROCERY','170') +('4','GROCERY','171') +('4','GROCERY','172') +('4','GROCERY','173') +('4','GROCERY','174') +('4','GROCERY','175') +('4','GROCERY','176') +('4','GROCERY','177') +('4','GROCERY','178') +('4','GROCERY','179') +('4','GROCERY','180') +('4','GROCERY','181') +('4','GROCERY','182') +('4','GROCERY','183') +('4','GROCERY','185') +('4','GROCERY','186') +('1','BULK','251') +('1','BULK','252') +('1','BULK','253') +('1','BULK','254') +('1','BULK','255') +('1','BULK','256') +('1','BULK','257') +('1','BULK','245') +('1','BULK','239') +('5','HBC','93') +('5','HBC','94') +('5','HBC','95') +('5','HBC','96') +('5','HBC','97') +('5','HBC','98') +('5','HBC','99') +('5','HBC','100') +('5','HBC','101') +('5','HBC','102') +('5','HBC','103') +('9','Gen Merch','244') +('1','BULK','258') +('1','BULK','259') +('5','HBC','123') +('5','HBC','124') +('5','HBC','125') +('9','Gen Merch','243') +('5','HBC','127') +('5','HBC','128') +('0','Misc','600') +('4','GROCERY','187') +('6','Produce','500') +('6','Produce','502') +('0','Misc','604') +('6','Produce','503') +('6','Produce','505') +('6','Produce','507') +('6','Produce','200') +('6','Produce','201') +('6','Produce','202') +('6','Produce','203') +('6','Produce','204') +('6','Produce','205') +('6','Produce','206') +('6','Produce','208') +('6','Produce','209') +('6','Produce','210') +('6','Produce','220') +('0','Misc','900') +('0','Misc','990') +('0','Misc','991') +('0','Misc','700') +('6','Produce','508') +('6','Produce','510') +('0','Misc','703') +('6','Produce','512') +('6','Produce','513') +('0','Misc','992') +('3','DELI','61') +('3','DELI','62') +('3','DELI','225') +('3','DELI','226') +('3','DELI','227') +('3','DELI','228') +('3','DELI','229') +('3','DELI','230') +('3','DELI','231') +('3','DELI','232') +('3','DELI','233') +('2','COOL/FROZEN','37') +('2','COOL/FROZEN','35') +('8','Meat','260') +('9','Gen Merch','242') +('0','Misc','902') +('3','DELI','234') +('7','Marketing','235') +('6','Produce','501') +('9','Gen Merch','240') +('9','Gen Merch','241') +('8','Meat','262') +('8','Meat','263') +('2','COOL/FROZEN','53') +('0','Misc','800') +('6','Produce','238') +('0','Misc','708') +('3','DELI','75') +('6','Produce','207') +('0','Misc','610') +('3','DELI','76') +('6','Produce','504') +('5','HBC','86') +('6','Produce','506') +('6','Produce','509') +('6','Produce','511') +('6','Produce','514') +('6','Produce','515') +('6','Produce','516') +('6','Produce','517') +('6','Produce','518') +('6','Produce','519') +('6','Produce','520') +('6','Produce','521') +('6','Produce','522') +('6','Produce','523') +('6','Produce','524') +('6','Produce','525') +('6','Produce','526') +('6','Produce','527') +('6','Produce','528') +('6','Produce','529') +('6','Produce','540') +('6','Produce','541') +('6','Produce','542') +('6','Produce','543') +('6','Produce','544') +('6','Produce','545') +('6','Produce','546') +('6','Produce','547') +('6','Produce','548') +('6','Produce','549') +('6','Produce','550') +('6','Produce','551') +('6','Produce','552') +('6','Produce','553') +('6','Produce','554') +('6','Produce','555') +('6','Produce','556') +('6','Produce','557') +('6','Produce','535') +('5','HBC','87') +('5','HBC','88') +('5','HBC','89') +('5','HBC','90') +('5','HBC','91') +('5','HBC','105') +('5','HBC','106') +('5','HBC','107') +('5','HBC','108') +('0','Misc','881') +('0','Misc','882') +('7','Marketing','236') diff --git a/pos/is4c-web/install/data/tenders.sql b/pos/is4c-web/install/data/tenders.sql new file mode 100644 index 000000000..4c3722310 --- /dev/null +++ b/pos/is4c-web/install/data/tenders.sql @@ -0,0 +1,19 @@ +(1,'CA','Cash','CA','Change',0,500,500) +(2,'CK','Check','CKCB','Cash Back',0,500,0) +(3,'CC','Credit Card','','',0,500,99999) +(4,'DC','Debit Card','DCCB','Cash Back',0,100,0) +(5,'FS','EBT','','',0,100,10) +(6,'MC','Coupons','','',0,20,0.01) +(7,'MI','Instore Charges','','',0,1000,5) +(8,'TC','Gift Certificate','TCCB','Change',0.01,0,10) +(9,'EC','EBT Cash','ECCB','ECT Cash Back',0,500,0) +(10,'WT','WIC','CK','',0.01,900,0) +(11,'IC','Instore Coupon','','',0.01,5,0) +(12,'CX','Corp. Charge','','',0.01,9999,0) +(13,'LN','Tender','','',0.01,9999,0) +(14,'CP','Coupons','','',0,20,0.01) +(15,'EF','EBT FS','','',0,100,10) +(16,'GD','Gift Card','CA','Credit Acct',0,500,10) +(17,'TV','Travelers Check','CK','Change',0,500,500) +(18,'MA','MAD Coupon','CA','',0.01,2.5,0) +(19,'RR','RRR Coupon','CA','',0.01,1,0) diff --git a/pos/is4c-web/install/extra_data.php b/pos/is4c-web/install/extra_data.php new file mode 100644 index 000000000..d3a9848f8 --- /dev/null +++ b/pos/is4c-web/install/extra_data.php @@ -0,0 +1,87 @@ +<?php +include('../ini.php'); +include('util.php'); +if(!class_exists('SQLManager')) + include('../lib/SQLManager.php'); +?> +<html> +<head> +<title>Load optional data</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +<a href="index.php">Necessities</a> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +<a href="extra_config.php">Additional Configuration</a> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +<a href="scanning.php">Scanning Options</a> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +Sample Data +<br /> +<form action=extra_data.php method=post> +<blockquote><i> +<?php +$db = new SQLManager($IS4C_LOCAL->get('localhost'), + $IS4C_LOCAL->get('DBMS'), + $IS4C_LOCAL->get('pDatabase'), + $IS4C_LOCAL->get('localUser'), + $IS4C_LOCAL->get('localPass')); + +if (isset($_REQUEST['employees'])){ + echo "Loading employees"; + $db->query("TRUNCATE TABLE employees"); + loaddata($db,'employees'); +} +elseif(isset($_REQUEST['custdata'])){ + echo "Loading custdata"; + $db->query("TRUNCATE TABLE custdata"); + loaddata($db,'custdata'); +} +elseif(isset($_REQUEST['products'])){ + echo "Loading products"; + $db->query("TRUNCATE TABLE products"); + loaddata($db,'products'); +} +elseif(isset($_REQUEST['depts'])){ + echo "Loading departments"; + $db->query("TRUNCATE TABLE departments"); + loaddata($db,'departments'); + echo "<br />Loading subdepts"; + $db->query("TRUNCATE TABLE subdepts"); + loaddata($db,'subdepts'); +} +?> +</i></blockquote> +Some sample data is available to get a test lane +up &amp; running quickly. Keep in mind this data +overwrites whatever is currently in the table. +<hr /> +<b>Employees</b><br /> +This table contains login information for cashiers. The two +included logins are '56' and '7000'.<br /> +<input type=submit name=employees value="Load sample employees" /> +<hr /> +<b>Custdata</b><br /> +Customer data is the membership information. Sample data includes + a way too many mostly identical lines. A very scrubbed version +of someone's customer table I think.<br /> +<input type=submit name=custdata value="Load sample customers" /> +<hr /> +<b>Products</b><br /> +Stuff to sell. There's a lot of sample data. I think this might +be the Wedge's or at least a snapshot of it.<br /> +<input type=submit name=products value="Load sample products" /> +<hr /> +<b>Departments</b> &amp; <b>Subdepts</b><br /> +Products get categorized into departments &amp; subdepartments. +You can also ring amounts directly to a department. Not needed, +strictly speaking, for a basic lane (Ring up items, total, +accept tender, provide change).<br /> +<input type=submit name=depts value="Load sample departments" /> +</form> +</body> +</html> diff --git a/pos/is4c-web/install/index.php b/pos/is4c-web/install/index.php new file mode 100644 index 000000000..5361c244d --- /dev/null +++ b/pos/is4c-web/install/index.php @@ -0,0 +1,1097 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +return; +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +ini_set('display_errors','1'); + +include($IS4C_PATH.'ini.php'); +include($IS4C_PATH.'lib/lib.php'); +include('util.php'); +?> +<html> +<head> +<title>IS4C Web Installation</title> +<style type="text/css"> +body { + line-height: 1.5em; +} +</style> +</head> +<body> +Necessities +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +<a href="extra_data.php">Sample Data</a> +<form action=index.php method=post> +<h1>IS4C Install checks</h1> +<h3>Basics</h3> +<?php +if (function_exists('posix_getpwuid')){ + $chk = posix_getpwuid(posix_getuid()); + echo "PHP is running as: ".$chk['name']."<br />"; +} +else + echo "PHP is (probably) running as: ".get_current_user()."<br />"; +if (is_writable('../ini.php')) + echo '<i>ini.php</i> is writeable'; +else + echo '<b>Error</b>: ini.php is not writeable'; +?> +<br /> +<?php +if (!function_exists("socket_create")){ + echo '<b>Warning</b>: PHP socket extension is not enabled. NewMagellan will not work quite right'; +} +?> +<br /> +OS: <select name=OS> +<?php +if (isset($_REQUEST['OS'])) $IS4C_LOCAL->set('OS',$_REQUEST['OS']); +if ($IS4C_LOCAL->get('OS') == 'win32'){ + echo "<option value=win32 selected>Windows</option>"; + echo "<option value=other>*nix</option>"; +} +else { + echo "<option value=win32>Windows</option>"; + echo "<option value=other selected>*nix</option>"; +} +confsave('OS',"'".$IS4C_LOCAL->get('OS')."'"); +?> +</select><br /> +Lane number: +<?php +if (isset($_REQUEST['LANE_NO']) && is_numeric($_REQUEST['LANE_NO'])) $IS4C_LOCAL->set('laneno',$_REQUEST['LANE_NO']); +printf("<input type=text name=LANE_NO value=\"%d\" />", + $IS4C_LOCAL->get('laneno')); +confsave('laneno',$IS4C_LOCAL->get('laneno')); +?> +<br /> +<hr /> +<h3>Database set up</h3> +Lane database host: +<?php +if (isset($_REQUEST['LANE_HOST'])) $IS4C_LOCAL->set('localhost',$_REQUEST['LANE_HOST']); +printf("<input type=text name=LANE_HOST value=\"%s\" />", + $IS4C_LOCAL->get('localhost')); +confsave('localhost',"'".$IS4C_LOCAL->get('localhost')."'"); +?> +<br /> +Lane database type: +<select name=LANE_DBMS> +<?php +if(isset($_REQUEST['LANE_DBMS'])) $IS4C_LOCAL->set('DBMS',$_REQUEST['LANE_DBMS']); +if ($IS4C_LOCAL->get('DBMS') == 'mssql'){ + echo "<option value=mysql>MySQL</option>"; + echo "<option value=mssql selected>SQL Server</option>"; +} +else { + echo "<option value=mysql selected>MySQL</option>"; + echo "<option value=mssql>SQL Server</option>"; +} +confsave('DBMS',"'".$IS4C_LOCAL->get('DBMS')."'"); +?> +</select><br /> +Lane user name: +<?php +if (isset($_REQUEST['LANE_USER'])) $IS4C_LOCAL->set('localUser',$_REQUEST['LANE_USER']); +printf("<input type=text name=LANE_USER value=\"%s\" />", + $IS4C_LOCAL->get('localUser')); +confsave('localUser',"'".$IS4C_LOCAL->get('localUser')."'"); +?> +<br /> +Lane password: +<?php +if (isset($_REQUEST['LANE_PASS'])) $IS4C_LOCAL->set('localPass',$_REQUEST['LANE_PASS']); +printf("<input type=password name=LANE_PASS value=\"%s\" />", + $IS4C_LOCAL->get('localPass')); +confsave('localPass',"'".$IS4C_LOCAL->get('localPass')."'"); +?> +<br /> +Lane operational DB: +<?php +if (isset($_REQUEST['LANE_OP_DB'])) $IS4C_LOCAL->set('pDatabase',$_REQUEST['LANE_OP_DB']); +printf("<input type=text name=LANE_OP_DB value=\"%s\" />", + $IS4C_LOCAL->get('pDatabase')); +confsave('pDatabase',"'".$IS4C_LOCAL->get('pDatabase')."'"); +?> +<br /> +Testing Operation DB Connection: +<?php +$gotDBs = 0; +if (!class_exists('SQLManager')) + include('../lib/SQLManager.php'); +if ($IS4C_LOCAL->get("DBMS") == "mysql") + $val = ini_set('mysql.connect_timeout',5); + +$sql = db_test_connect($IS4C_LOCAL->get('localhost'), + $IS4C_LOCAL->get('DBMS'), + $IS4C_LOCAL->get('pDatabase'), + $IS4C_LOCAL->get('localUser'), + $IS4C_LOCAL->get('localPass')); +if ($sql === False){ + echo "<span style=\"color:red;\">Failed</span>"; +} +else { + echo "<span style=\"color:green;\">Succeeded</span>"; + create_op_dbs($sql,$IS4C_LOCAL->get('DBMS')); + $gotDBs++; + include('../lib/connect.php'); + //include('../auth/utilities.php'); + table_check(); +} +?> +<br /> +Lane transaction DB: +<?php +if (isset($_REQUEST['LANE_TRANS_DB'])) $IS4C_LOCAL->set('tDatabase',$_REQUEST['LANE_TRANS_DB']); +printf("<input type=text name=LANE_TRANS_DB value=\"%s\" />", + $IS4C_LOCAL->get('tDatabase')); +confsave('tDatabase',"'".$IS4C_LOCAL->get('tDatabase')."'"); +?> +<br /> +Testing transational DB connection: +<?php +$sql = db_test_connect($IS4C_LOCAL->get('localhost'), + $IS4C_LOCAL->get('DBMS'), + $IS4C_LOCAL->get('tDatabase'), + $IS4C_LOCAL->get('localUser'), + $IS4C_LOCAL->get('localPass')); +if ($sql === False){ + echo "<span style=\"color:red;\">Failed</span>"; +} +else { + echo "<span style=\"color:green;\">Succeeded</span>"; + + /* Re-do tax rates here so changes affect the subsequent + * ltt* view builds. + */ + if (isset($_REQUEST['TAX_RATE']) && $sql->table_exists('taxrates')){ + $queries = array(); + for($i=0; $i<count($_REQUEST['TAX_RATE']); $i++){ + $rate = $_REQUEST['TAX_RATE'][$i]; + $desc = $_REQUEST['TAX_DESC'][$i]; + if(is_numeric($rate)){ + $desc = str_replace(" ","",$desc); + $queries[] = sprintf("INSERT INTO taxrates VALUES + (%d,%f,'%s')",$i+1,$rate,$desc); + } + else if ($rate != ""){ + echo "<br /><b>Error</b>: the given + tax rate, $rate, doesn't seem to + be a number."; + } + $sql->query("TRUNCATE TABLE taxrates"); + foreach($queries as $q) + $sql->query($q); + } + } + + create_trans_dbs($sql,$IS4C_LOCAL->get('DBMS')); + $gotDBs++; +} + +?> +<br /><br /> +Server database host: +<?php +if (isset($_REQUEST['SERVER_HOST'])) $IS4C_LOCAL->set('mServer',$_REQUEST['SERVER_HOST']); +printf("<input type=text name=SERVER_HOST value=\"%s\" />", + $IS4C_LOCAL->get('mServer')); +confsave('mServer',"'".$IS4C_LOCAL->get('mServer')."'"); +?> +<br /> +Server database type: +<select name=SERVER_TYPE> +<?php +if (isset($_REQUEST['SERVER_TYPE'])) $IS4C_LOCAL->set('mDBMS',$_REQUEST['SERVER_TYPE']); +if ($IS4C_LOCAL->get('mDBMS') == 'mssql'){ + echo "<option value=mysql>MySQL</option>"; + echo "<option value=mssql selected>SQL Server</option>"; +} +else { + echo "<option value=mysql selected>MySQL</option>"; + echo "<option value=mssql>SQL Server</option>"; +} +confsave('mDBMS',"'".$IS4C_LOCAL->get('mDBMS')."'"); +?> +</select><br /> +Server user name: +<?php +if (isset($_REQUEST['SERVER_USER'])) $IS4C_LOCAL->set('mUser',$_REQUEST['SERVER_USER']); +printf("<input type=text name=SERVER_USER value=\"%s\" />", + $IS4C_LOCAL->get('mUser')); +confsave('mUser',"'".$IS4C_LOCAL->get('mUser')."'"); +?> +<br /> +Server password: +<?php +if (isset($_REQUEST['SERVER_PASS'])) $IS4C_LOCAL->set('mPass',$_REQUEST['SERVER_PASS']); +printf("<input type=password name=SERVER_PASS value=\"%s\" />", + $IS4C_LOCAL->get('mPass')); +confsave('mPass',"'".$IS4C_LOCAL->get('mPass')."'"); +?> +<br /> +Server database name: +<?php +if (isset($_REQUEST['SERVER_DB'])) $IS4C_LOCAL->set('mDatabase',$_REQUEST['SERVER_DB']); +printf("<input type=text name=SERVER_DB value=\"%s\" />", + $IS4C_LOCAL->get('mDatabase')); +confsave('mDatabase',"'".$IS4C_LOCAL->get('mDatabase')."'"); +?> +<br /> +Testing server connection: +<?php +$sql = db_test_connect($IS4C_LOCAL->get('mServer'), + $IS4C_LOCAL->get('mDBMS'), + $IS4C_LOCAL->get('mDatabase'), + $IS4C_LOCAL->get('mUser'), + $IS4C_LOCAL->get('mPass')); +if ($sql === False){ + echo "<span style=\"color:red;\">Failed</span>"; +} +else { + echo "<span style=\"color:green;\">Succeeded</span>"; +} +?> +<hr /> +<h3>Tax</h3> +<i>Provided tax rates are used to create database views. As such, +descriptions should be DB-legal syntax (e.g., no spaces). A rate of +0% with ID 0 is automatically included</i> +<?php +$rates = array(); +if($gotDBs == 2){ + $sql = new SQLManager($IS4C_LOCAL->get('localhost'), + $IS4C_LOCAL->get('DBMS'), + $IS4C_LOCAL->get('tDatabase'), + $IS4C_LOCAL->get('localUser'), + $IS4C_LOCAL->get('localPass')); + $ratesR = $sql->query("SELECT id,rate,description FROM taxrates ORDER BY id"); + while($row=$sql->fetch_row($ratesR)) + $rates[] = array($row[0],$row[1],$row[2]); +} +echo "<table><tr><th>ID</th><th>Rate (%)</th><th>Description</th></tr>"; +foreach($rates as $rate){ + printf("<tr><td>%d</td><td><input type=text name=TAX_RATE[] value=\"%f\" /></td> + <td><input type=text name=TAX_DESC[] value=\"%s\" /></td></tr>", + $rate[0],$rate[1],$rate[2]); +} +printf("<tr><td>(Add)</td><td><input type=text name=TAX_RATE[] value=\"\" /></td> + <td><input type=text name=TAX_DESC[] value=\"\" /></td></tr></table>"); +?> +<input type=submit value="Save &amp; Re-run installation checks" /> +</form> + +<?php + +function create_op_dbs($db,$type){ + global $IS4C_LOCAL; + $name = $IS4C_LOCAL->get('pDatabase'); + + $chargeCodeQ = "CREATE TABLE chargecode ( + staffID varchar(4), + chargecode varchar(6))"; + if (!$db->table_exists('chargecode',$name)){ + $db->query($chargeCodeQ,$name); + } + + $couponCodeQ = "CREATE TABLE couponcodes ( + Code varchar(4), + Qty int, + Value real)"; + if (!$db->table_exists('couponcodes',$name)){ + $db->query($couponCodeQ,$name); + loaddata($db,'couponcodes'); + } + + $custDataQ = "CREATE TABLE `custdata` ( + `CardNo` int(8) default NULL, + `personNum` tinyint(4) NOT NULL default '1', + `LastName` varchar(30) default NULL, + `FirstName` varchar(30) default NULL, + `CashBack` real NOT NULL default '60', + `Balance` real NOT NULL default '0', + `Discount` smallint(6) default NULL, + `MemDiscountLimit` real NOT NULL default '0', + `ChargeOk` tinyint(4) NOT NULL default '1', + `WriteChecks` tinyint(4) NOT NULL default '1', + `StoreCoupons` tinyint(4) NOT NULL default '1', + `Type` varchar(10) NOT NULL default 'pc', + `memType` tinyint(4) default NULL, + `staff` tinyint(4) NOT NULL default '0', + `SSI` tinyint(4) NOT NULL default '0', + `Purchases` real NOT NULL default '0', + `NumberOfChecks` smallint(6) NOT NULL default '0', + `memCoupons` int(11) NOT NULL default '1', + `blueLine` varchar(50) default NULL, + `Shown` tinyint(4) NOT NULL default '1', + `id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `CardNo` (`CardNo`), + KEY `LastName` (`LastName`) + ) ENGINE=MyISAM AUTO_INCREMENT=926 DEFAULT CHARSET=latin1;"; + if ($type == 'mssql'){ + $custDataQ = "CREATE TABLE [custdata] ( + [CardNo] [varchar] (25) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [personNum] [varchar] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [LastName] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [FirstName] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [CashBack] [money] NULL , + [Balance] [money] NULL , + [Discount] [smallint] NULL , + [MemDiscountLimit] [money] NULL , + [ChargeOk] [bit] NULL , + [WriteChecks] [bit] NULL , + [StoreCoupons] [bit] NULL , + [Type] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [memType] [smallint] NULL , + [staff] [tinyint] NULL , + [SSI] [tinyint] NULL , + [Purchases] [money] NULL , + [NumberOfChecks] [smallint] NULL , + [memCoupons] [int] NULL , + [blueLine] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [Shown] [tinyint] NULL , + [id] [int] IDENTITY (1, 1) NOT NULL + ) ON [PRIMARY]"; + } + if (!$db->table_exists('custdata',$name)){ + $db->query($custDataQ,$name); + } + + $deptQ = "CREATE TABLE departments ( + dept_no smallint, + dept_name varchar(100), + dept_tax tinyint, + dept_fs tinyint, + dept_limit real, + dept_minimum real, + dept_discount tinyint, + modified datetime, + modifiedby int, + PRIMARY KEY (dept_no))"; + if (!$db->table_exists('departments',$name)){ + $db->query($deptQ,$name); + } + + $empQ = "CREATE TABLE employees ( + emp_no smallint, + CashierPassword int, + AdminPassword int, + FirstName varchar(255), + LastName varchar(255), + JobTitle varchar(255), + EmpActive tinyint, + frontendsecurity smallint, + backendsecurity smallint, + PRIMARY KEY (emp_no))"; + if (!$db->table_exists('employees',$name)){ + $db->query($empQ,$name); + } + + $globalQ = "CREATE TABLE globalvalues ( + CashierNo int, + Cashier varchar(30), + LoggedIn tinyint, + TransNo int, + TTLFlag tinyint, + FntlFlag tinyint, + TaxExempt tinyint)"; + if (!$db->table_exists('globalvalues',$name)){ + $db->query($globalQ,$name); + loaddata($db,'globalvalues'); + } + + $prodQ = "CREATE TABLE `products` ( + `upc` bigint(13) unsigned zerofill default NULL, + `description` varchar(30) default NULL, + `normal_price` real default NULL, + `pricemethod` smallint(6) default NULL, + `groupprice` real default NULL, + `quantity` smallint(6) default NULL, + `special_price` real default NULL, + `specialpricemethod` smallint(6) default NULL, + `specialgroupprice` real default NULL, + `specialquantity` smallint(6) default NULL, + `start_date` datetime default NULL, + `end_date` datetime default NULL, + `department` smallint(6) default NULL, + `size` varchar(9) default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `scale` tinyint(4) default NULL, + `scaleprice` tinyint(4) default 0 NULL, + `mixmatchcode` varchar(13) default NULL, + `modified` datetime default NULL, + `advertised` tinyint(4) default NULL, + `tareweight` real default NULL, + `discount` smallint(6) default NULL, + `discounttype` tinyint(4) default NULL, + `unitofmeasure` varchar(15) default NULL, + `wicable` smallint(6) default NULL, + `qttyEnforced` tinyint(4) default NULL, + `idEnforced` tinyint(4) default 0 NULL, + `cost` real default 0 NULL, + `inUse` tinyint(4) default NULL, + `numflag` int(11) default 0 NULL, + `subdept` smallint(4) default NULL, + `deposit` real default NULL, + `local` int(11) default 0 NULL, + `id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `upc` (`upc`), + KEY `description` (`description`), + KEY `normal_price` (`normal_price`) + ) ENGINE=MyISAM DEFAULT CHARSET=latin1;"; + if ($type == 'mssql'){ + $prodQ = "CREATE TABLE [products] ( + [upc] [varchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , + [description] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [normal_price] [money] NULL , + [pricemethod] [smallint] NULL , + [groupprice] [money] NULL , + [quantity] [smallint] NULL , + [special_price] [money] NULL , + [specialpricemethod] [smallint] NULL , + [specialgroupprice] [money] NULL , + [specialquantity] [smallint] NULL , + [start_date] [datetime] NULL , + [end_date] [datetime] NULL , + [department] [smallint] NOT NULL , + [size] [varchar] (9) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [tax] [smallint] NOT NULL , + [foodstamp] [bit] NOT NULL , + [scale] [bit] NOT NULL , + [scaleprice] [tinyint] NULL , + [mixmatchcode] [varchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [modified] [datetime] NULL , + [advertised] [bit] NOT NULL , + [tareweight] [float] NULL , + [discount] [smallint] NULL , + [discounttype] [tinyint] NULL , + [unitofmeasure] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [wicable] [smallint] NULL , + [qttyEnforced] [tinyint] NULL , + [idEnforced] [tinyint] NULL , + [cost] [money] NULL , + [inUse] [tinyint] NOT NULL , + [numflag] [int] NULL , + [subdept] [int] NULL , + [deposit] [money] NULL , + [local] [int] NULL , + [id] [int] IDENTITY (1, 1) NOT NULL , + CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED + ( + [upc] + ) WITH FILLFACTOR = 90 ON [PRIMARY] + ) ON [PRIMARY]"; + } + if (!$db->table_exists('products',$name)){ + $db->query($prodQ,$name); + } + + $promoQ = "CREATE TABLE promomsgs ( + startDate datetime, + endDate datetime, + promoMsg varchar(50), + sequence tinyint)"; + if (!$db->table_exists('promomsgs',$name)){ + $db->query($promoQ,$name); + } + + $tenderQ = "CREATE TABLE tenders ( + TenderID smallint, + TenderCode varchar(255), + TenderName varchar(255), + TenderType varchar(255), + ChangeMessage varchar(255), + MinAmount real, + MaxAmount real, + MaxRefund real)"; + if(!$db->table_exists('tenders',$name)){ + $db->query($tenderQ,$name); + loaddata($db,'tenders'); + } + + $ccView = "CREATE VIEW chargecodeview AS + SELECT c.staffID, c.chargecode, d.blueLine + FROM chargecode AS c, custdata AS d + WHERE c.staffID = d.CardNo"; + if (!$db->table_exists('chargecodeview',$name)){ + $db->query($ccView,$name); + } + + $subQ = "CREATE TABLE subdepts ( + subdept_no smallint, + subdept_name varchar(10), + dept_ID smallint)"; + if(!$db->table_exists('subdepts',$name)){ + $db->query($subQ,$name); + } + + $pmV = "CREATE view promoMsgsView as + select + * from promomsgs + where ". + $db->datediff('startDate',$db->now())." >= 0 + and ". + $db->datediff($db->now(),'endDate')." >= 0 + order by sequence"; + if(!$db->table_exists('promoMsgsView',$name)){ + $db->query($pmV,$name); + } + + $custRpt = "CREATE TABLE customReceipt ( + text varchar(20), + seq int, + type varchar(20) + )"; + if(!$db->table_exists('customReceipt',$name)){ + $db->query($custRpt,$name); + } + + $houseCoup = "CREATE TABLE houseCoupons ( + coupID int, + endDate datetime, + `limit` smallint, + memberOnly smallint, + discountType varchar(2), + discountValue real, + minType varchar(2), + minValue real, + department int)"; + if ($type == 'mssql') + $houseCoup = str_replace("`","",$houseCoup); + if(!$db->table_exists('houseCoupons',$name)){ + $db->query($houseCoup,$name); + } + + $hciQ = "CREATE TABLE houseCouponItems ( + coupID int, + upc varchar(13), + type varchar(15))"; + if(!$db->table_exists('houseCouponItems',$name)){ + $db->query($hciQ); + } + + $sdQ = "CREATE TABLE superdepts ( + superID int, + dept_ID int + )"; + if (!$db->table_exists('superdepts',$name)){ + $db->query($sdQ); + } + + $sdnQ = "CREATE TABLE superDeptNames ( + superID int, + super_name varchar(100), + primary key (superID) + )"; + if (!$db->table_exists('superDeptNames',$name)){ + $db->query($sdnQ); + } + + $seQ = "CREATE TABLE superDeptEmails ( + superID int, + email_address varchar(100) + )"; + if (!$db->table_exists('superDeptEmails',$name)){ + $db->query($seQ); + } + + $puQ = "CREATE TABLE productUser ( + upc varchar(13), + description varchar(255), + brand varchar(255), + sizing varchar(255), + photo varchar(255), + long_text text, + primary key (upc) + )"; + if (!$db->table_exists('productUser',$name)){ + $db->query($puQ); + } + + $blQ = "CREATE TABLE IPBlacklist ( + ip int, + primary key(ip) + )"; + if (!$db->table_exists('IPBlacklist',$name)){ + $db->query($blQ); + } + + $bl2Q = "CREATE TABLE emailBlacklist ( + addr varchar(255), + primary key(addr) + )"; + if (!$db->table_exists('emailBlacklist',$name)){ + $db->query($bl2Q); + } + + $regQ = "CREATE TABLE registrations ( + tdate datetime, + card_no int, + name varchar(150), + email varchar(150), + phone varchar(30), + guest_count int, + child_count int, + paid int + )"; + if (!$db->table_exists("registrations",$name)){ + $db->query($regQ); + } + + $mealQ = "CREATE TABLE regMeals ( + card_no int, + type varchar(5), + subtype smallint + )"; + if (!$db->table_exists("regMeals",$name)){ + $db->query($mealQ); + } + + $tkQ = "CREATE TABLE tokenCache ( + card_no int, + token varchar(25), + tdate datetime + )"; + if (!$db->table_exists("tokenCache",$name)){ + $db->query($tkQ); + } + + $expQ = "CREATE TABLE productExpires ( + upc bigint(13) unsigned zerofill NOT NULL, + expires datetime, + PRIMARY KEY (upc) + )"; + if (!$db->table_exists("productExpires",$name)){ + $db->query($expQ); + } + + $limitQ = "CREATE TABLE productOrderLimits ( + upc bigint(13) unsigned zerofill NOT NULL, + available int, + PRIMARY KEY (upc) + )"; + if (!$db->table_exists("productOrderLimits",$name)){ + $db->query($limitQ); + } + +} + +function create_trans_dbs($db,$type){ + global $IS4C_LOCAL; + $name = $IS4C_LOCAL->get('tDatabase'); + + $dtransQ = "CREATE TABLE `dtransactions` ( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(255) default NULL, + `description` varchar(255) default NULL, + `trans_type` varchar(255) default NULL, + `trans_subtype` varchar(255) default NULL, + `trans_status` varchar(255) default NULL, + `department` smallint(6) default NULL, + `quantity` real default NULL, + `scale` tinyint(4) default NULL, + `cost` real default 0.00 NULL, + `unitPrice` real default NULL, + `total` real default NULL, + `regPrice` real default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` real default NULL, + `memDiscount` real default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` real default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` real default NULL, + `mixMatch` varchar(12) default NULL, + `matched` smallint(6) default NULL, + `memType` tinyint(2) default NULL, + `staff` tinyint(4) default NULL, + `numflag` smallint(6) default 0 NULL, + `charflag` varchar(2) default '' NULL, + `card_no` varchar(255) default NULL, + `trans_id` int(11) default NULL + )"; + if ($type == 'mssql'){ + $dtransQ = "CREATE TABLE [dtransactions] ( + [datetime] [datetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [nvarchar] (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NULL , + [staff] [tinyint] NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] NOT NULL + ) ON [PRIMARY]"; + } + if (!$db->table_exists('dtransactions',$name)){ + $db->query($dtransQ,$name); + } + + $ltQ = str_replace("dtransactions","localtrans",$dtransQ); + if (!$db->table_exists('localtrans',$name)){ + $db->query($ltQ,$name); + } + + $lttQ = str_replace("dtransactions","localtrans_today",$dtransQ); + if (!$db->table_exists('localtrans_today',$name)){ + $db->query($lttQ,$name); + } + + $lttV = "CREATE VIEW localtranstoday AS SELECT * FROM localtrans_today + WHERE ".$db->datediff($db->now(),"datetime")." = 0"; + if (!$db->table_exists('localtranstoday',$name)){ + $db->query($lttV,$name); + } + + $ltaQ = str_replace("dtransactions","localtransarchive",$dtransQ); + if (!$db->table_exists('localtransarchive',$name)){ + $db->query($ltaQ,$name); + } + + $ltaQ = str_replace("dtransactions","pendingtrans",$dtransQ); + if (!$db->table_exists('pendingtrans',$name)){ + $db->query($ltaQ,$name); + } + + $lttQ = "CREATE TABLE `localtemptrans` ( + `datetime` datetime default NULL, + `register_no` smallint(6) default NULL, + `emp_no` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `upc` varchar(255) default NULL, + `description` varchar(255) default NULL, + `trans_type` varchar(255) default NULL, + `trans_subtype` varchar(255) default NULL, + `trans_status` varchar(255) default NULL, + `department` smallint(6) default NULL, + `quantity` real default NULL, + `scale` tinyint(4) default NULL, + `cost` real default 0.00, + `unitPrice` real default NULL, + `total` real default NULL, + `regPrice` real default NULL, + `tax` smallint(6) default NULL, + `foodstamp` tinyint(4) default NULL, + `discount` real default NULL, + `memDiscount` real default NULL, + `discountable` tinyint(4) default NULL, + `discounttype` tinyint(4) default NULL, + `voided` tinyint(4) default NULL, + `percentDiscount` tinyint(4) default NULL, + `ItemQtty` real default NULL, + `volDiscType` tinyint(4) default NULL, + `volume` tinyint(4) default NULL, + `VolSpecial` real default NULL, + `mixMatch` varchar(12) default NULL, + `matched` smallint(6) default NULL, + `memType` varchar(10) default NULL, + `staff` tinyint(4) default 0, + `numflag` smallint(6) default 0, + `charflag` varchar(2) default '', + `card_no` varchar(255) default NULL, + `trans_id` int(11) NOT NULL auto_increment, + PRIMARY KEY (`trans_id`) + )"; + if ($type == 'mssql'){ + $lttQ = "CREATE TABLE [localtemptrans] ( + [datetime] [smalldatetime] NOT NULL , + [register_no] [smallint] NOT NULL , + [emp_no] [smallint] NOT NULL , + [trans_no] [int] NOT NULL , + [upc] [nvarchar] (13) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [description] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_type] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_subtype] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_status] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [department] [smallint] NULL , + [quantity] [float] NULL , + [scale] [tinyint] NULL , + [unitPrice] [money] NULL , + [total] [money] NOT NULL , + [regPrice] [money] NULL , + [tax] [smallint] NULL , + [foodstamp] [tinyint] NOT NULL , + [discount] [money] NOT NULL , + [memDiscount] [money] NULL , + [discountable] [tinyint] NULL , + [discounttype] [tinyint] NULL , + [voided] [tinyint] NULL , + [percentDiscount] [tinyint] NULL , + [ItemQtty] [float] NULL , + [volDiscType] [tinyint] NOT NULL , + [volume] [tinyint] NOT NULL , + [VolSpecial] [money] NOT NULL , + [mixMatch] [nvarchar] (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [matched] [smallint] NOT NULL , + [memType] [smallint] NOT NULL , + [staff] [tinyint] NOT NULL , + [numflag] [smallint] NULL , + [charflag] [nvarchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [card_no] [nvarchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , + [trans_id] [int] IDENTITY (1, 1) NOT NULL + ) ON [PRIMARY]"; + } + + /* don't make this table yet */ + if (!$db->table_exists('localtemptrans',$name)){ + $db->query($lttQ,$name); + } + + $caQ = "CREATE TABLE couponApplied ( + emp_no int, + trans_no int, + quantity float, + trans_id int)"; + if(!$db->table_exists('couponApplied',$name)){ + $db->query($caQ,$name); + } + + $taxQ = "CREATE TABLE taxrates ( + id int, + rate float, + `description` varchar(50))"; + if ($type == 'mssql') + $taxQ = str_replace("`","",$taxQ); + if(!$db->table_exists('taxrates',$name)){ + $db->query($taxQ,$name); + } + + $taxTtlQ = "CREATE VIEW taxTTL AS + SELECT l.emp_no, + SUM( + CASE WHEN t.id IS NULL THEN 0 ELSE l.total*t.rate END + ) as taxes + FROM localtemptrans AS l LEFT JOIN + taxrates AS t ON l.tax=t.id + GROUP BY l.emp_no"; + if (!$db->table_exists("taxTTL",$name)){ + $db->query($taxTtlQ,$name); + } + + /* lttsummary, lttsubtotals, and subtotals + * always get rebuilt to account for tax rate + * changes */ + include('buildLTTViews.php'); + //buildLTTViews($db,$type); + + $efsrq = "CREATE TABLE efsnetRequest ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + refNum varchar (50) , + live tinyint , + mode varchar (32) , + amount real , + PAN varchar (19) , + issuer varchar (16) , + name varchar (50) , + manual tinyint , + sentPAN tinyint , + sentExp tinyint , + sentTr1 tinyint , + sentTr2 tinyint + )"; + /* might use for CC processing + if(!$db->table_exists('efsnetRequest',$name)){ + $db->query($efsrq,$name); + } + */ + + $efsrp = "CREATE TABLE efsnetResponse ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + refNum varchar (50), + seconds float , + commErr int , + httpCode int , + validResponse smallint , + xResponseCode varchar (4), + xResultCode varchar (4), + xResultMessage varchar (100), + xTransactionID varchar (12), + xApprovalNumber varchar (20) + )"; + /* + if(!$db->table_exists('efsnetResponse',$name)){ + $db->query($efsrp,$name); + } + */ + + $efsrqm = "CREATE TABLE efsnetRequestMod ( + date int , + cashierNo int , + laneNo int , + transNo int , + transID int , + datetime datetime , + origRefNum varchar (50), + origAmount real , + origTransactionID varchar(12) , + mode varchar (32), + altRoute tinyint , + seconds float , + commErr int , + httpCode int , + validResponse smallint , + xResponseCode varchar(4), + xResultCode varchar(4), + xResultMessage varchar(100) + )"; + /* + if(!$db->table_exists('efsnetRequestMod',$name)){ + $db->query($efsrqm,$name); + } + */ + + $vrq = "CREATE TABLE valutecRequest ( + date int, + cashierNo int, + laneNo int, + transNo int, + transID int, + datetime datetime, + identifier varchar(10), + terminalID varchar(20), + live tinyint, + mode varchar(32), + amount real, + PAN varchar(19), + manual tinyint + )"; + /* might use for gift cards + if(!$db->table_exists('valutecRequest',$name)){ + $db->query($vrq,$name); + } + */ + + $vrp = "CREATE TABLE valutecResponse ( + date int, + cashierNo int, + laneNo int, + transNo int, + transID int, + datetime datetime, + identifier varchar(10), + seconds float, + commErr int, + httpCode int, + validResponse smallint, + xAuthorized varchar(5), + xAuthorizationCode varchar(9), + xBalance varchar(8), + xErrorMsg varchar(100) + )"; + /* + if(!$db->table_exists('valutecResponse',$name)){ + $db->query($vrp,$name); + } + */ + + $vrqm = "CREATE TABLE valutecRequestMod ( + date int, + cashierNo int, + laneNo int, + transNo int, + transID int, + datetime datetime, + origAuthCode varchar(9), + mode varchar(32), + seconds float, + commErr int, + httpCode int, + validResponse smallint, + xAuthorized varchar(5), + xAuthorizationCode varchar(9), + xBalance varchar(8), + xErrorMsg varchar(100) + )"; + /* + if(!$db->table_exists('valutecRequestMod',$name)){ + $db->query($vrqm,$name); + } + */ + + $cart = "CREATE VIEW cart AS + SELECT l.upc,l.emp_no, + u.brand,u.description, + l.scale,l.quantity, + l.unitPrice,l.total, + CASE WHEN l.discounttype=1 THEN 'On Sale' + WHEN l.discounttype=2 AND l.memType=1 THEN 'Owner Special' + ELSE '' END as saleMsg + FROM localtemptrans AS l INNER JOIN " + .$IS4C_LOCAL->get("pDatabase").".productUser AS u + ON l.upc=u.upc"; + if (!$db->table_exists('cart',$name)){ + $db->query($cart,$name); + } +} + +?> diff --git a/pos/is4c-web/install/util.php b/pos/is4c-web/install/util.php new file mode 100644 index 000000000..67b444b73 --- /dev/null +++ b/pos/is4c-web/install/util.php @@ -0,0 +1,56 @@ +<?php + +function confsave($key,$value){ + if (!is_writable('../ini.php')) return; + + $fp = fopen('../ini.php','r'); + $lines = array(); + $found = False; + while($line = fgets($fp)){ + if (strpos($line,'$IS4C_LOCAL->set("'.$key.'"') === 0){ + $lines[] = sprintf("\$IS4C_LOCAL->set(\"%s\",%s);\n", + $key,$value); + $found = True; + } + elseif (strpos($line,'?>') === 0 && !$found){ + $lines[] = sprintf("\$IS4C_LOCAL->set(\"%s\",%s);\n", + $key,$value); + $lines[] = "?>\n"; + } + else{ + $lines[] = $line; + } + } + fclose($fp); + + $fp = fopen('../ini.php','w'); + foreach($lines as $line) + fwrite($fp,$line); + fclose($fp); +} + +function loadSampleData($sql, $table){ + $fp = fopen("data/$table.sql","r"); + while($line = fgets($fp)){ + $sql->query("INSERT INTO $table VALUES $line"); + } + fclose($fp); +} + +function db_test_connect($host,$type,$db,$user,$pw){ + global $IS4C_PATH; + if (!class_exists('SQLManager')) + include($IS4C_PATH.'lib/SQLManager.php'); + $sql = False; + try { + $sql = new SQLManager($host,$type,$db,$user,$pw); + } + catch(Exception $ex) {} + + if ($sql === False || $sql->connections[$db] === False) + return False; + else + return $sql; +} + +?> diff --git a/pos/is4c-web/is4c.css b/pos/is4c-web/is4c.css new file mode 100644 index 000000000..3106128ee --- /dev/null +++ b/pos/is4c-web/is4c.css @@ -0,0 +1,71 @@ +div#loginTitle { text-align:center; } +div#loginTitle table { + margin-left: auto; + margin-right: auto; +} +div#loginTitle table th { + text-align: right; +} +div#topMenuRunner li { + display:inline; + padding-left: 0.3em; + font-size: 10pt; +} +div#topMenuRunner { + margin-bottom: 15px; +} +div#sidebar { + float:left; + width:100px; + margin-right: 10px; + font-size: 10pt; +} +ul#deptlist { + margin-left: 8px; +} +ul#sidebar3 { + margin-left: 8px; +} +div#browsearea { + float:left; + width:520px; + font-size: 10pt; +} + +table#carttable td, th { + padding: 8px; +} + +div.itemMain { + width: 400px; + float: left; + font-size: 10pt; +} +span.itemDesc { + font-size: 125%; + font-weight: bold; +} +span.itemBrand { + font-size: 90%; + font-style: italic; + margin-left: 10px; + margin-bottom: 20px; + display: block; +} + +div.itemPrice { + width: 200px; + float: left; +} +span.itemPriceNormal { + font-size: 150%; + font-weight: bold; +} +span.itemPriceAddOn { + font-size: 90%; + font-style: italic; +} + +div.itemCart { + clear: left; +} diff --git a/pos/is4c-web/js/jquery.js b/pos/is4c-web/js/jquery.js new file mode 100644 index 000000000..ac7e7009d --- /dev/null +++ b/pos/is4c-web/js/jquery.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? +e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= +j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, +"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= +true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| +c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", +L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, +"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ +a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], +d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== +a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& +!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= +true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", +i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", +" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= +this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= +e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= +null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, +"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= +a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, +isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= +{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; +if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& +!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, +toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, +u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), +function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; +if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; +for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- +1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, +relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= +l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; +h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= +m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| +!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= +h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, +gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; +c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? +a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& +this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| +u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== +1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); +this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], +"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, +animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= +j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); +this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| +c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? +function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= +this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; +k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& +f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/pos/is4c-web/lib/Bitmap.class.php b/pos/is4c-web/lib/Bitmap.class.php new file mode 100644 index 000000000..45c1539fb --- /dev/null +++ b/pos/is4c-web/lib/Bitmap.class.php @@ -0,0 +1,560 @@ +<?php +/* +Bitmap.class.php +version 1 (2009-09-24) +author Alex Frase + +References + http://en.wikipedia.org/wiki/BMP_file_format + http://atlc.sourceforge.net/bmp.html + http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization +*/ + +class Bitmap { + + const DIB1 = 12; + const DIB2 = 64; + const DIB3 = 40; + const DIB4 = 108; + const DIB5 = 124; + + private static $error = null; + + private $magic; + private $dibVersion; + private $width; + private $height; + private $bpp; // bits per pixel + private $hppm; // horiz. pixels per meter + private $vppm; // vert. pixels per meter + private $palSize; + private $palSizeImp; + private $palette; + private $image; + private $rowBytes; + + + /* + * INTERNAL METHODS + */ + + private static function ReturnError($err=null, $ret=null) { + self::$error = is_string($err) ? $err : "Unknown error"; + return $ret; + } // ReturnError() + + private static function ParseInt($data, $left=0, $right=-1, $signed=false, $bigEndian=false) { + if (is_string($data)) { + $isarray = false; + if ($right < 0) + $right = strlen($data) - 1; + } else if (is_array($data)) { + $isarray = true; + $data = array_values($data); + if ($right < 0) + $right = count($data) - 1; + } else { + return null; + } + if ($right < $left) + return null; + // set traversal range and direction + $start = $bigEndian ? $right : $left; + $end = $bigEndian ? $left : $right; + $delta = $bigEndian ? -1 : 1; + // process bytes + $n = $start; + $val = $isarray ? (int)$data[$n] : ord($data[$n]); + $factor = 256; + while ($n != $end) { + $n += $delta; + $val += $factor * ($isarray ? (int)$data[$n] : ord($data[$n])); + $factor <<= 8; // *= 256 + } + // check sign bit + if ($signed && (($isarray ? (int)$data[$end] : ord($data[$end])) & 0x80)) + $val = -$factor + $val; + // done + return $val; + } // ParseInt() + + private static function RenderInt($val, $bytes, $signed=false, $bigEndian=false) { + $val = (int)$val; + $bytes = (int)$bytes; + $range = pow(2, $bytes * 8); + $neg = false; + if ($signed && $val < 0) + $val = (~ (-$val)) + 1; + // set traversal range and direction + $start = $bigEndian ? ($bytes - 1) : 0; + $end = $bigEndian ? 0 : ($bytes - 1); + $delta = $bigEndian ? -1 : 1; + // set bytes + $data = str_repeat("\x00", $bytes); + for ($n = $start; $n != $end; $n += $delta) { + $data[$n] = chr($val & 0xFF); + $val >>= 8; // /= 256 + } + // done + return $data; + } // RenderInt() + + + /* + * CLASS METHODS + */ + + static function LastError($reset=true) { + $err = self::$error; + if ($reset) + self::$error = null; + return $err; + } // LastError() + + static function Load($filename, $filedata=null) { + if ($filename === true) { + $data = $filedata; + } else { + $data = file_get_contents($filename, FILE_BINARY); + if (!$data) + return self::ReturnError("Load(): failed reading file \"".$filename."\""); + } + $datasize = strlen($data); + + // read the BMP header + + if ($datasize < 18) + return self::ReturnError("Load(): incomplete BMP header (file is ".$datasize." bytes)"); + $magic = substr($data, 0, 2); + $fileSize = self::ParseInt($data, 2, 5); + // bytes 6-9 are unused (application specific) + $imageAt = self::ParseInt($data, 10, 13); + + // validate the BMP header + + switch ($magic) { + case "BM": // Windows 3.1x, 95, NT, ... + case "BA": // OS/2 Bitmap Array + case "CI": // OS/2 Color Icon + case "CP": // OS/2 Color Pointer + case "IC": // OS/2 Icon + case "PT": // OS/2 Pointer + break; + default: + return self::ReturnError("Load(): unknown magic numbers \"".dechex(ord($magic[0]))." ".dechex(ord($magic[1]))."\""); + } + if ($fileSize != $datasize) + return self::ReturnError("Load(): incorrect file size (".$fileSize." reported, ".$datasize." actual)"); + + // read the DIB header + + $headerSize = self::ParseInt($data, 14, 17); + if ($datasize < (14 + $headerSize)) + return self::ReturnError("Load(): incomplete DIB header (file is ".$datasize." bytes)"); + switch ($headerSize) { + case self::DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + $width = self::ParseInt($data, 18, 19); + $height = self::ParseInt($data, 20, 21); + $colorPlanes = self::ParseInt($data, 22, 23); + $bpp = self::ParseInt($data, 24, 25); + if ($bpp == 16 || $bpp == 32) // not supported in this header + return self::ReturnError("Load(): ".$bpp." bits-per-pixel invalid in V1 header"); + $compression = 0; + $imgDataSize = null; + $hppm = null; + $vppm = null; + $palSize = 0; + $palSizeImp = 0; + break; + + case self::DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $width = self::ParseInt($data, 18, 21, true); + $height = self::ParseInt($data, 22, 25, true); + $colorPlanes = self::ParseInt($data, 26, 27); + $bpp = self::ParseInt($data, 28, 29); + $compression = self::ParseInt($data, 30, 33); + $imgDataSize = self::ParseInt($data, 34, 37); + $hppm = self::ParseInt($data, 38, 41, true); + $vppm = self::ParseInt($data, 42, 45, true); + $palSize = self::ParseInt($data, 46, 49); + $palSizeImp = self::ParseInt($data, 50, 53); + break; + + // TODO: more header formats + + default: + return self::ReturnError("Load(): unknown DIB header size (".$headerSize." bytes)"); + } + + // validate the DIB header + + if ($width < 1) + return self::ReturnError("Load(): invalid image width ".$width); + if ($height == 0) // height can be negative, meaning data is top-to-bottom instead of bottom-to-top + return self::ReturnError("Load(): invalid image height ".$height); + if ($colorPlanes != 1) + return self::ReturnError("Load(): invalid color plane count ".$colorPlanes); + if ($bpp != 1 && $bpp != 4 && $bpp != 8 && $bpp != 16 && $bpp != 24 && $bpp != 32) + return self::ReturnError("Load(): invalid bits-per-pixel ".$bpp); + switch ($compression) { + case 0: // BI_RGB (uncompressed) + break; + case 1: // BI_RLE8 (RLE; 8 bpp only) + case 2: // BI_RLE4 (RLE; 4 bpp only) + case 3: // BI_BITFIELDS (bitfield; 16 and 32 bpp only) + case 4: // BI_JPEG (JPEG) + case 5: // BI_PNG (PNG) + // TODO: support compression? + return self::ReturnError("Load(): image data compression not supported"); + default: + return self::ReturnError("Load(): invalid compression code ".$compression); + } + $rowDataSize = (int)((($width * $bpp) + 31) / 32) * 4; + if ($imgDataSize === null) + $imgDataSize = abs($height) * $rowDataSize; + else if ($imgDataSize != (abs($height) * $rowDataSize)) + return self::ReturnError("Load(): incorrect image data size (".$imgDataSize." reported, ".(abs($height) * $rowDataSize)." expected)"); + if ($hppm !== null && $hppm <= 0) + return self::ReturnError("Load(): invalid horizontal pixels-per-meter ".$hppm); + if ($vppm !== null && $vppm <= 0) + return self::ReturnError("Load(): invalid vertical pixels-per-meter ".$hppm); + + // read the palette + + if (!$palSize && $bpp < 16) + $palSize = pow(2, $bpp); + if ($palSize) { + $palColorSize = ($headerSize == self::DIB1) ? 3 : 4; + $palDataSize = $palSize * $palColorSize; + if ($datasize < (14 + $headerSize + $palDataSize)) + return self::ReturnError("Load(): incomplete palette (file is ".$datasize." bytes)"); + $palette = substr($data, 14 + $headerSize, $palDataSize); + if ($palColorSize < 4) { + // pad each palette color to 4 bytes for simpler lookup (remember "." doesn't match newline, hence "|\\n") + $palette = preg_replace('/(.|\\n){'.$palColorSize.'}/', '\\1'.str_repeat("\x00",(4-$palColorSize)), $palette); + } + } else { + $palColorSize = 0; + $palDataSize = 0; + $palette = null; + } + + // read the image + + if ($datasize < ($imageAt + $imgDataSize)) + return self::ReturnError("Load(): incomplete image (file is ".$datasize." bytes)"); + $image = substr($data, $imageAt, $imgDataSize); + $rowBytes = (int)((($width * $bpp) + 7) / 8); + if ($rowBytes > $rowDataSize) + return self::ReturnError("Load(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + if ($rowBytes < $rowDataSize) { + // strip off word-alignment padding (remember "." doesn't match newline, hence "|\\n") + $image = preg_replace('/((?:.|\\n){'.$rowBytes.'})((?:.|\\n){'.($rowDataSize-$rowBytes).'})/', '\\1', $image); + } + if ($height < 0) { + $height = abs($height); + } else { + // flip image rows vertically (BMPs are stored upside-down by default) + $image = implode('', array_reverse(str_split($image, $rowBytes))); + } + + // initialize the object + + $bmp = new self(); + $bmp->magic = $magic; + $bmp->dibVersion = $headerSize; + $bmp->width = $width; + $bmp->height = $height; + $bmp->bpp = $bpp; + $bmp->rowBytes = $rowBytes; + $bmp->hppm = $hppm; + $bmp->vppm = $vppm; + $bmp->palSize = $palSize; + $bmp->palSizeImp = $palSizeImp; + $bmp->palette = $palette; + $bmp->image = $image; + + // all done + return $bmp; + } // Load() + + + /* + * OBJECT METHODS + */ + + function __construct($width=1, $height=1, $bpp=1, $dpi=72) { + if (!is_numeric($width) || (int)$width < 1) + throw new Exception('Bitmap width must be at least 1'); + if (!is_numeric($height) || (int)$height < 1) + throw new Exception('Bitmap height must be at least 1'); + if (!is_numeric($bpp) || (int)$bpp != 1) + throw new Exception('Color bitmaps not yet supported'); + if (!is_numeric($dpi) || (int)$dpi < 1) + throw new Exception('Bitmap DPI must be at least 1'); + $this->magic = "BM"; + $this->dibVersion = self::DIB3; + $this->width = (int)$width; + $this->height = (int)$height; + $this->bpp = (int)$bpp; + $this->rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->hppm = (int)(($dpi * 39.37) + 0.5); // 39.37 inches per meter + $this->vppm = $this->hppm; + $this->palSize = 2; + $this->palSizeImp = 0; + $this->palette = "\xFF\xFF\xFF\x00\x00\x00\x00\x00"; + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->image = str_repeat("\x00", $rowBytes * $this->height); + } // __construct() + + function Save($filename) { + // prepare the image + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $rowDataSize = (int)((($this->width * $this->bpp) + 31) / 32) * 4; + if ($rowBytes > $rowDataSize) + return self::ReturnError("Save(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + $pad = str_repeat("\x00", $rowDataSize - $rowBytes); // might be 0 -> "" pad, which is ok + $image = implode($pad, array_reverse(str_split($this->image, $rowBytes))) . $pad; + $imgDataSize = $this->height * $rowDataSize; + if ($imgDataSize != strlen($image)) + return self::ReturnError("Save(): consistency error (calculated image data size ".$imgDataSize.", prepared ".strlen($image).")"); + + // prepare the palette + if ($this->palSize) { + $palette = $this->palette; + // if ($this->dibVersion == self::DIB1) // strip padding... + } else { + $palette = ""; + } + $palDataSize = strlen($palette); + + // prepare the DIB header + $dibHead = ""; + switch ($this->dibVersion) { + case self::DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + return self::ReturnError("Save(): only DIB3 is supported for writing"); + + case self::DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $dibHead .= self::RenderInt(self::DIB3, 4); + $dibHead .= self::RenderInt($this->width, 4, true); + $dibHead .= self::RenderInt($this->height, 4, true); + $dibHead .= self::RenderInt(1, 2); // colorPlanes + $dibHead .= self::RenderInt($this->bpp, 2); + $dibHead .= self::RenderInt(0, 4); // compression + $dibHead .= self::RenderInt($imgDataSize, 4); + $dibHead .= self::RenderInt($this->hppm, 4, true); + $dibHead .= self::RenderInt($this->vppm, 4, true); + $dibHead .= self::RenderInt($this->palSize, 4); + $dibHead .= self::RenderInt($this->palSizeImp, 4); + break; + + // TODO: more header formats + + default: + return self::ReturnError("Save(): only DIB3 is supported for writing"); + } + if (strlen($dibHead) != $this->dibVersion) + return self::ReturnError("Save(): consistency error (calculated DIB size ".$this->dibVersion.", prepared ".strlen($dibHead).")"); + + // prepare the BMP header + $imageAt = 14 + $this->dibVersion + $palDataSize; + $fileSize = $imageAt + $imgDataSize; + $bmpHead = ""; + $bmpHead .= $this->magic; + $bmpHead .= self::RenderInt($fileSize, 4); + $bmpHead .= self::RenderInt(0, 4); // bytes 6-9 are unused (application specific) + $bmpHead .= self::RenderInt($imageAt, 4); + + // write or return the file + $data = $bmpHead . $dibHead . $palette . $image; + if ($filename === true) + return $data; + $bytes = file_put_contents($filename, $data, FILE_BINARY); + if ($bytes != strlen($data)) + return self::ReturnError("Save(): failed writing file \"".$filename."\" (".$bytes." of ".strlen($data)." bytes written)"); + return true; + } // Save() + + function GetWidth() { return $this->width; } + + function GetHeight() { return $this->height; } + + function GetColorDepth() { return $this->bpp; } + + function GetHorizResolution($asDPI=false) { return $asDPI ? (int)(($this->hppm / 39.37) + 0.5) : $this->hppm; } + + function GetVertResolution($asDPI=false) { return $asDPI ? (int)(($this->vppm / 39.37) + 0.5) : $this->vppm; } + + function GetPaletteSize() { return ($this->bpp < 16 && $this->palSize) ? $this->palSize : null; } + + function GetPaletteColor($index, $channel=null) { + if (!$this->palSize || $this->palette === null || $index < 0 || $index >= $this->palSize) + return null; + $byte = $index << 2; // (int)($index * 4) + if ($channel !== null) { + if ($channel < 0 || $channel > 2) + return null; + return ord($this->palette[$byte + $channel]); + } + return self::ParseInt($this->palette, $byte, $byte + 2); + } // GetPaletteColor() + + function GetPixelValue($x, $y) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // fetch pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + return self::ParseInt($this->image, $byte, $byte + 2); // BMPs don't actually have an alpha channel, so ignore the 4th byte + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + return self::ParseInt($this->image, $byte, $byte + 2); + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + return self::ParseInt($this->image, $byte, $byte + 1); + case 8: + $byte = ($y * $this->rowBytes) + $x; + return ord($this->image[$byte]); + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + return ((ord($this->image[$byte]) >> $shift) & 0x0F); + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + return ((ord($this->image[$byte]) >> $shift) & 0x01); + } + return null; + } // GetPixelValue() + + function SetPixelValue($x, $y, $val) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // validate new pixel value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // set pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + $this->image = substr_replace($this->image, self::RenderInt($val,3), $byte, 3); // BMPs don't actually have an alpha channel, so ignore the 4th byte + return true; + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + $this->image = substr_replace($this->image, self::RenderInt($val,3), $byte, 3); + return true; + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + $this->image = substr_replace($this->image, self::RenderInt($val,2), $byte, 2); + return true; + case 8: + $byte = ($y * $this->rowBytes) + $x; + $this->image[$byte] = chr($val); + return true; + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + $mask = (0x0F << $shift); + $this->image[$byte] = chr( (ord($this->image[$byte]) & (~ $mask)) | ($val & $mask) ); + return true; + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + if ($val) + $this->image[$byte] = chr( ord($this->image[$byte]) | (0x01 << $shift) ); + else + $this->image[$byte] = chr( ord($this->image[$byte]) & (0xFF ^ (0x01 << $shift)) ); + return true; + } + return null; + } // SetPixelValue() + + function DrawLine($x0, $y0, $x1, $y1, $val) { + // validate coordinates + if ($x0 < 0) + $x0 += $this->width; + else if ($x0 >= $this->width) + return null; + if ($y0 < 0) + $y0 += $this->height; + else if ($y0 >= $this->height) + return null; + if ($x1 < 0) + $x1 += $this->width; + else if ($x1 >= $this->width) + return null; + if ($y1 < 0) + $y1 += $this->height; + else if ($y1 >= $this->height) + return null; + // validate new pixel(s) value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // draw! + // http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization + $steep = (abs($y1 - $y0) > abs($x1 - $x0)); + if ($steep) { + $t=$x0; $x0=$y0; $y0=$t; // swap $x0,$y0 + $t=$x1; $x1=$y1; $y1=$t; // swap $x1,$y1 + } + if ($x0 > $x1) { + $t=$x0; $x0=$x1; $x1=$t; // swap $x0,$x1 + $t=$y0; $y0=$y1; $y1=$t; // swap $y0,$y1 + } + $dx = ($x1 - $x0); + $dy = abs($y1 - $y0); + $err = $dx >> 1; + $sy = ($y0 < $y1) ? 1 : -1; + while ($x0 <= $x1) { + if ($steep) + $this->SetPixelValue($y0, $x0, 1); + else + $this->SetPixelValue($x0, $y0, 1); + $err -= $dy; + if ($err < 0) { + $y0 += $sy; + $err += $dx; + } + $x0++; + } + return true; + } // DrawLine() + + function GetPixelColor($x, $y, $channel=null) { + $val = $this->GetPixelValue($x, $y); + if ($val !== null && $this->palette !== null) + return $this->GetPaletteColor($val, $channel); + if ($this->bpp == 16) { + $val = + (((((($val >> 10) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 16) + + (((((($val >> 5) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 8) + + (int)(((($val & 0x1F) / 0x1F) * 0xFF) + 0.5); + } + return $val; + } // GetPixelColor() + + function GetRawData() { + return $this->image; + } // GetRawData() + + function GetRawBytesPerRow() { + return $this->rowBytes; + } // GetRawBytesPerRow() + +} // Bitmap + diff --git a/pos/is4c-web/lib/Bitmap4.class.php b/pos/is4c-web/lib/Bitmap4.class.php new file mode 100644 index 000000000..69b119518 --- /dev/null +++ b/pos/is4c-web/lib/Bitmap4.class.php @@ -0,0 +1,575 @@ +<?php +/* +Bitmap.class.php +version 1 (2009-09-24) +author Alex Frase + +References + http://en.wikipedia.org/wiki/BMP_file_format + http://atlc.sourceforge.net/bmp.html + http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization +*/ + +class Bitmap { + + var $DIB1; + var $DIB2; + var $DIB3; + var $DIB4; + var $DIB5; + + var $error; + + var $magic; + var $dibVersion; + var $width; + var $height; + var $bpp; // bits per pixel + var $hppm; // horiz. pixels per meter + var $vppm; // vert. pixels per meter + var $palSize; + var $palSizeImp; + var $palette; + var $image; + var $rowBytes; + + + /* + * INTERNAL METHODS + */ + + function ReturnError($err=null, $ret=null) { + $this->error = is_string($err) ? $err : "Unknown error"; + return $ret; + } // ReturnError() + + function ParseInt($data, $left=0, $right=-1, $signed=false, $bigEndian=false) { + if (is_string($data)) { + $isarray = false; + if ($right < 0) + $right = strlen($data) - 1; + } else if (is_array($data)) { + $isarray = true; + $data = array_values($data); + if ($right < 0) + $right = count($data) - 1; + } else { + return null; + } + if ($right < $left) + return null; + // set traversal range and direction + $start = $bigEndian ? $right : $left; + $end = $bigEndian ? $left : $right; + $delta = $bigEndian ? -1 : 1; + // process bytes + $n = $start; + $val = $isarray ? (int)$data[$n] : ord($data[$n]); + $factor = 256; + while ($n != $end) { + $n += $delta; + $val += $factor * ($isarray ? (int)$data[$n] : ord($data[$n])); + $factor <<= 8; // *= 256 + } + // check sign bit + if ($signed && (($isarray ? (int)$data[$end] : ord($data[$end])) & 0x80)) + $val = -$factor + $val; + // done + return $val; + } // ParseInt() + + function RenderInt($val, $bytes, $signed=false, $bigEndian=false) { + $val = (int)$val; + $bytes = (int)$bytes; + $range = pow(2, $bytes * 8); + $neg = false; + if ($signed && $val < 0) + $val = (~ (-$val)) + 1; + // set traversal range and direction + $start = $bigEndian ? ($bytes - 1) : 0; + $end = $bigEndian ? 0 : ($bytes - 1); + $delta = $bigEndian ? -1 : 1; + // set bytes + $data = str_repeat("\x00", $bytes); + for ($n = $start; $n != $end; $n += $delta) { + $data[$n] = chr($val & 0xFF); + $val >>= 8; // /= 256 + } + // done + return $data; + } // RenderInt() + + + function LastError($reset=true) { + $err = $this->error; + if ($reset) + $this->error = null; + return $err; + } // LastError() + + function Load($filename, $filedata=null) { + if ($filename === true) { + $data = $filedata; + } else { + $data = file_get_contents($filename); + if (!$data) + return $this->ReturnError("Load(): failed reading file \"".$filename."\""); + } + $datasize = strlen($data); + + // read the BMP header + + if ($datasize < 18) + return $this->ReturnError("Load(): incomplete BMP header (file is ".$datasize." bytes)"); + $magic = substr($data, 0, 2); + $fileSize = $this->ParseInt($data, 2, 5); + // bytes 6-9 are unused (application specific) + $imageAt = $this->ParseInt($data, 10, 13); + + // validate the BMP header + + switch ($magic) { + case "BM": // Windows 3.1x, 95, NT, ... + case "BA": // OS/2 Bitmap Array + case "CI": // OS/2 Color Icon + case "CP": // OS/2 Color Pointer + case "IC": // OS/2 Icon + case "PT": // OS/2 Pointer + break; + default: + return $this->ReturnError("Load(): unknown magic numbers \"".dechex(ord($magic[0]))." ".dechex(ord($magic[1]))."\""); + } + if ($fileSize != $datasize) + return $this->ReturnError("Load(): incorrect file size (".$fileSize." reported, ".$datasize." actual)"); + + // read the DIB header + + $headerSize = $this->ParseInt($data, 14, 17); + if ($datasize < (14 + $headerSize)) + return $this->ReturnError("Load(): incomplete DIB header (file is ".$datasize." bytes)"); + switch ($headerSize) { + case $this->DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + $width = $this->ParseInt($data, 18, 19); + $height = $this->ParseInt($data, 20, 21); + $colorPlanes = $this->ParseInt($data, 22, 23); + $bpp = $this->ParseInt($data, 24, 25); + if ($bpp == 16 || $bpp == 32) // not supported in this header + return $this->ReturnError("Load(): ".$bpp." bits-per-pixel invalid in V1 header"); + $compression = 0; + $imgDataSize = null; + $hppm = null; + $vppm = null; + $palSize = 0; + $palSizeImp = 0; + break; + + case $this->DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $width = $this->ParseInt($data, 18, 21, true); + $height = $this->ParseInt($data, 22, 25, true); + $colorPlanes = $this->ParseInt($data, 26, 27); + $bpp = $this->ParseInt($data, 28, 29); + $compression = $this->ParseInt($data, 30, 33); + $imgDataSize = $this->ParseInt($data, 34, 37); + $hppm = $this->ParseInt($data, 38, 41, true); + $vppm = $this->ParseInt($data, 42, 45, true); + $palSize = $this->ParseInt($data, 46, 49); + $palSizeImp = $this->ParseInt($data, 50, 53); + break; + + // TODO: more header formats + + default: + return $this->ReturnError("Load(): unknown DIB header size (".$headerSize." bytes)"); + } + + // validate the DIB header + + if ($width < 1) + return $this->ReturnError("Load(): invalid image width ".$width); + if ($height == 0) // height can be negative, meaning data is top-to-bottom instead of bottom-to-top + return $this->ReturnError("Load(): invalid image height ".$height); + if ($colorPlanes != 1) + return $this->ReturnError("Load(): invalid color plane count ".$colorPlanes); + if ($bpp != 1 && $bpp != 4 && $bpp != 8 && $bpp != 16 && $bpp != 24 && $bpp != 32) + return $this->ReturnError("Load(): invalid bits-per-pixel ".$bpp); + switch ($compression) { + case 0: // BI_RGB (uncompressed) + break; + case 1: // BI_RLE8 (RLE; 8 bpp only) + case 2: // BI_RLE4 (RLE; 4 bpp only) + case 3: // BI_BITFIELDS (bitfield; 16 and 32 bpp only) + case 4: // BI_JPEG (JPEG) + case 5: // BI_PNG (PNG) + // TODO: support compression? + return $this->ReturnError("Load(): image data compression not supported"); + default: + return $this->ReturnError("Load(): invalid compression code ".$compression); + } + $rowDataSize = (int)((($width * $bpp) + 31) / 32) * 4; + if ($imgDataSize === null || $imgDataSize === 0) + $imgDataSize = abs($height) * $rowDataSize; + else if ($imgDataSize != (abs($height) * $rowDataSize)) + return $this->ReturnError("Load(): incorrect image data size (".$imgDataSize." reported, ".(abs($height) * $rowDataSize)." expected)"); + if ($hppm !== null && $hppm <= 0) + return $this->ReturnError("Load(): invalid horizontal pixels-per-meter ".$hppm); + if ($vppm !== null && $vppm <= 0) + return $this->ReturnError("Load(): invalid vertical pixels-per-meter ".$hppm); + + // read the palette + + if (!$palSize && $bpp < 16) + $palSize = pow(2, $bpp); + if ($palSize) { + $palColorSize = ($headerSize == $this->DIB1) ? 3 : 4; + $palDataSize = $palSize * $palColorSize; + if ($datasize < (14 + $headerSize + $palDataSize)) + return $this->ReturnError("Load(): incomplete palette (file is ".$datasize." bytes)"); + $palette = substr($data, 14 + $headerSize, $palDataSize); + if ($palColorSize < 4) { + // pad each palette color to 4 bytes for simpler lookup (remember "." doesn't match newline, hence "|\\n") + $palette = preg_replace('/(.|\\n){'.$palColorSize.'}/', '\\1'.str_repeat("\x00",(4-$palColorSize)), $palette); + } + } else { + $palColorSize = 0; + $palDataSize = 0; + $palette = null; + } + + // read the image + + if ($datasize < ($imageAt + $imgDataSize)) + return $this->ReturnError("Load(): incomplete image (file is ".$datasize." bytes)"); + $image = substr($data, $imageAt, $imgDataSize); + $rowBytes = (int)((($width * $bpp) + 7) / 8); + if ($rowBytes > $rowDataSize) + return $this->ReturnError("Load(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + if ($rowBytes < $rowDataSize) { + // strip off word-alignment padding (remember "." doesn't match newline, hence "|\\n") + $image = preg_replace('/((?:.|\\n){'.$rowBytes.'})((?:.|\\n){'.($rowDataSize-$rowBytes).'})/', '\\1', $image); + } + if ($height < 0) { + $height = abs($height); + } else { + // flip image rows vertically (BMPs are stored upside-down by default) + $str_split = array(); + $val = ""; + for($i=0; $i<strlen($image); $i++){ + if ($i % $rowBytes == 0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $image[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + $image = implode('', array_reverse($str_split)); + } + + // initialize the object + + $this->magic = $magic; + $this->dibVersion = $headerSize; + $this->width = $width; + $this->height = $height; + $this->bpp = $bpp; + $this->rowBytes = $rowBytes; + $this->hppm = $hppm; + $this->vppm = $vppm; + $this->palSize = $palSize; + $this->palSizeImp = $palSizeImp; + $this->palette = $palette; + $this->image = $image; + + // all done + return true; + } // Load() + + + /* + * OBJECT METHODS + */ + + function Bitmap($width=1, $height=1, $bpp=1, $dpi=72) { + $this->DIB1 = 12; + $this->DIB2 = 64; + $this->DIB3 = 40; + $this->DIB4 = 108; + $this->DIB5 = 124; + + $this->error = null; + + if (!is_numeric($width) || (int)$width < 1) + die('Bitmap width must be at least 1'); + if (!is_numeric($height) || (int)$height < 1) + die('Bitmap height must be at least 1'); + if (!is_numeric($bpp) || (int)$bpp != 1) + die('Color bitmaps not yet supported'); + if (!is_numeric($dpi) || (int)$dpi < 1) + die('Bitmap DPI must be at least 1'); + $this->magic = "BM"; + $this->dibVersion = $this->DIB3; + $this->width = (int)$width; + $this->height = (int)$height; + $this->bpp = (int)$bpp; + $this->rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->hppm = (int)(($dpi * 39.37) + 0.5); // 39.37 inches per meter + $this->vppm = $this->hppm; + $this->palSize = 2; + $this->palSizeImp = 0; + $this->palette = "\xFF\xFF\xFF\x00\x00\x00\x00\x00"; + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $this->image = str_repeat("\x00", $rowBytes * $this->height); + } // __construct() + + function Save($filename) { + // prepare the image + $rowBytes = (int)((($this->width * $this->bpp) + 7) / 8); + $rowDataSize = (int)((($this->width * $this->bpp) + 31) / 32) * 4; + if ($rowBytes > $rowDataSize) + return $this->ReturnError("Save(): consistency error (calculated byte width ".$rowBytes.", data width ".$rowDataSize.")"); + $pad = str_repeat("\x00", $rowDataSize - $rowBytes); // might be 0 -> "" pad, which is ok + $image = implode($pad, array_reverse(str_split($this->image, $rowBytes))) . $pad; + $imgDataSize = $this->height * $rowDataSize; + if ($imgDataSize != strlen($image)) + return $this->ReturnError("Save(): consistency error (calculated image data size ".$imgDataSize.", prepared ".strlen($image).")"); + + // prepare the palette + if ($this->palSize) { + $palette = $this->palette; + // if ($this->dibVersion == self::DIB1) // strip padding... + } else { + $palette = ""; + } + $palDataSize = strlen($palette); + + // prepare the DIB header + $dibHead = ""; + switch ($this->dibVersion) { + case $this->DIB1: // OS/2 V1 "BITMAPCOREHEADER" 12 bytes + return $this->ReturnError("Save(): only DIB3 is supported for writing"); + + case $this->DIB3: // Windows V3 "BITMAPINFOHEADER" 40 bytes + $dibHead .= $this->RenderInt($this->DIB3, 4); + $dibHead .= $this->RenderInt($this->width, 4, true); + $dibHead .= $this->RenderInt($this->height, 4, true); + $dibHead .= $this->RenderInt(1, 2); // colorPlanes + $dibHead .= $this->RenderInt($this->bpp, 2); + $dibHead .= $this->RenderInt(0, 4); // compression + $dibHead .= $this->RenderInt($imgDataSize, 4); + $dibHead .= $this->RenderInt($this->hppm, 4, true); + $dibHead .= $this->RenderInt($this->vppm, 4, true); + $dibHead .= $this->RenderInt($this->palSize, 4); + $dibHead .= $this->RenderInt($this->palSizeImp, 4); + break; + + // TODO: more header formats + + default: + return $this->ReturnError("Save(): only DIB3 is supported for writing"); + } + if (strlen($dibHead) != $this->dibVersion) + return $this->ReturnError("Save(): consistency error (calculated DIB size ".$this->dibVersion.", prepared ".strlen($dibHead).")"); + + // prepare the BMP header + $imageAt = 14 + $this->dibVersion + $palDataSize; + $fileSize = $imageAt + $imgDataSize; + $bmpHead = ""; + $bmpHead .= $this->magic; + $bmpHead .= $this->RenderInt($fileSize, 4); + $bmpHead .= $this->RenderInt(0, 4); // bytes 6-9 are unused (application specific) + $bmpHead .= $this->RenderInt($imageAt, 4); + + // write or return the file + $data = $bmpHead . $dibHead . $palette . $image; + if ($filename === true) + return $data; + $bytes = file_put_contents($filename, $data); + if ($bytes != strlen($data)) + return $this->ReturnError("Save(): failed writing file \"".$filename."\" (".$bytes." of ".strlen($data)." bytes written)"); + return true; + } // Save() + + function GetWidth() { return $this->width; } + + function GetHeight() { return $this->height; } + + function GetColorDepth() { return $this->bpp; } + + function GetHorizResolution($asDPI=false) { return $asDPI ? (int)(($this->hppm / 39.37) + 0.5) : $this->hppm; } + + function GetVertResolution($asDPI=false) { return $asDPI ? (int)(($this->vppm / 39.37) + 0.5) : $this->vppm; } + + function GetPaletteSize() { return ($this->bpp < 16 && $this->palSize) ? $this->palSize : null; } + + function GetPaletteColor($index, $channel=null) { + if (!$this->palSize || $this->palette === null || $index < 0 || $index >= $this->palSize) + return null; + $byte = $index << 2; // (int)($index * 4) + if ($channel !== null) { + if ($channel < 0 || $channel > 2) + return null; + return ord($this->palette[$byte + $channel]); + } + return $this->ParseInt($this->palette, $byte, $byte + 2); + } // GetPaletteColor() + + function GetPixelValue($x, $y) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // fetch pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + return $this->ParseInt($this->image, $byte, $byte + 2); // BMPs don't actually have an alpha channel, so ignore the 4th byte + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + return $this->ParseInt($this->image, $byte, $byte + 2); + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + return $this->ParseInt($this->image, $byte, $byte + 1); + case 8: + $byte = ($y * $this->rowBytes) + $x; + return ord($this->image[$byte]); + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + return ((ord($this->image[$byte]) >> $shift) & 0x0F); + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + return ((ord($this->image[$byte]) >> $shift) & 0x01); + } + return null; + } // GetPixelValue() + + function SetPixelValue($x, $y, $val) { + // validate coordinates + if ($x < 0) + $x += $this->width; + else if ($x >= $this->width) + return null; + if ($y < 0) + $y += $this->height; + else if ($y >= $this->height) + return null; + // validate new pixel value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // set pixel + switch ($this->bpp) { + case 32: + $byte = ($y * $this->rowBytes) + ($x << 2); // (int)($x * 4) + $this->image = substr_replace($this->image, $this->RenderInt($val,3), $byte, 3); // BMPs don't actually have an alpha channel, so ignore the 4th byte + return true; + case 24: + $byte = ($y * $this->rowBytes) + ((int)($x * 3)); + $this->image = substr_replace($this->image, $this->RenderInt($val,3), $byte, 3); + return true; + case 16: + $byte = ($y * $this->rowBytes) + ($x << 1); // (int)($x * 2) + $this->image = substr_replace($this->image, $this->RenderInt($val,2), $byte, 2); + return true; + case 8: + $byte = ($y * $this->rowBytes) + $x; + $this->image[$byte] = chr($val); + return true; + case 4: + $byte = ($y * $this->rowBytes) + ($x >> 1); // (int)($x / 2) + $shift = 1 - ($x % 2); + $mask = (0x0F << $shift); + $this->image[$byte] = chr( (ord($this->image[$byte]) & (~ $mask)) | ($val & $mask) ); + return true; + case 1: + $byte = ($y * $this->rowBytes) + ($x >> 3); // (int)($x / 8) + $shift = 7 - ($x % 8); + if ($val) + $this->image[$byte] = chr( ord($this->image[$byte]) | (0x01 << $shift) ); + else + $this->image[$byte] = chr( ord($this->image[$byte]) & (0xFF ^ (0x01 << $shift)) ); + return true; + } + return null; + } // SetPixelValue() + + function DrawLine($x0, $y0, $x1, $y1, $val) { + // validate coordinates + if ($x0 < 0) + $x0 += $this->width; + else if ($x0 >= $this->width) + return null; + if ($y0 < 0) + $y0 += $this->height; + else if ($y0 >= $this->height) + return null; + if ($x1 < 0) + $x1 += $this->width; + else if ($x1 >= $this->width) + return null; + if ($y1 < 0) + $y1 += $this->height; + else if ($y1 >= $this->height) + return null; + // validate new pixel(s) value + if ($val < 0 || $val >= pow(2, $this->bpp) || ($this->palSize && $val >= $this->palSize)) + return null; + // draw! + // http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Optimization + $steep = (abs($y1 - $y0) > abs($x1 - $x0)); + if ($steep) { + $t=$x0; $x0=$y0; $y0=$t; // swap $x0,$y0 + $t=$x1; $x1=$y1; $y1=$t; // swap $x1,$y1 + } + if ($x0 > $x1) { + $t=$x0; $x0=$x1; $x1=$t; // swap $x0,$x1 + $t=$y0; $y0=$y1; $y1=$t; // swap $y0,$y1 + } + $dx = ($x1 - $x0); + $dy = abs($y1 - $y0); + $err = $dx >> 1; + $sy = ($y0 < $y1) ? 1 : -1; + while ($x0 <= $x1) { + if ($steep) + $this->SetPixelValue($y0, $x0, 1); + else + $this->SetPixelValue($x0, $y0, 1); + $err -= $dy; + if ($err < 0) { + $y0 += $sy; + $err += $dx; + } + $x0++; + } + return true; + } // DrawLine() + + function GetPixelColor($x, $y, $channel=null) { + $val = $this->GetPixelValue($x, $y); + if ($val !== null && $this->palette !== null) + return $this->GetPaletteColor($val, $channel); + if ($this->bpp == 16) { + $val = + (((((($val >> 10) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 16) + + (((((($val >> 5) & 0x1F) / 0x1F) * 0xFF) + 0.5) << 8) + + (int)(((($val & 0x1F) / 0x1F) * 0xFF) + 0.5); + } + return $val; + } // GetPixelColor() + + function GetRawData() { + return $this->image; + } // GetRawData() + + function GetRawBytesPerRow() { + return $this->rowBytes; + } // GetRawBytesPerRow() + +} // Bitmap + diff --git a/pos/is4c-web/lib/LocalStorage/LocalStorage.php b/pos/is4c-web/lib/LocalStorage/LocalStorage.php new file mode 100644 index 000000000..1d62dddf6 --- /dev/null +++ b/pos/is4c-web/lib/LocalStorage/LocalStorage.php @@ -0,0 +1,17 @@ +<?php + +class LocalStorage { + function localStorage(){ + + } + + function get($key){ + + } + + function set($key,$val){ + + } +} + +?> diff --git a/pos/is4c-web/lib/LocalStorage/SQLiteDB/db b/pos/is4c-web/lib/LocalStorage/SQLiteDB/db new file mode 100644 index 000000000..bf857a59d Binary files /dev/null and b/pos/is4c-web/lib/LocalStorage/SQLiteDB/db differ diff --git a/pos/is4c-web/lib/LocalStorage/SQLiteStorage.php b/pos/is4c-web/lib/LocalStorage/SQLiteStorage.php new file mode 100644 index 000000000..e781ec7d5 --- /dev/null +++ b/pos/is4c-web/lib/LocalStorage/SQLiteStorage.php @@ -0,0 +1,52 @@ +<?php + +if (!class_exists("LocalStorage")) include_once($_SESSION["INCLUDE_PATH"]."/lib/LocalStorage/LocalStorage.php"); + +class SQLiteStorage extends LocalStorage { + var $db; + function SQLiteStorage(){ + $this->db = $this->conn(); + $result = sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND name='is4c_local'", $this->db); + + if (sqlite_num_rows($result) == 0){ + $result = sqlite_query("CREATE TABLE is4c_local (keystr varchar(255), valstr varchar(255), + PRIMARY KEY (keystr) )",$this->db); + } + } + + function get($key){ + $row = sqlite_array_query("SELECT valstr FROM is4c_local WHERE keystr='$key'",$this->db); + if (!$row) return ""; + $row = $row[0]; + if (strstr($row[0],chr(255))) return explode(chr(255),$row[0]); + else return $row[0]; + } + + function set($key,$val){ + if (empty($val)) + sqlite_query("DELETE FROM is4c_local WHERE keystr='$key'",$this->db); + else { + if (is_array($val)){ + $temp = ""; + foreach($val as $v) $temp.=$v.chr(255); + $val = substr($temp,0,strlen($temp)-1); + } + $check = sqlite_query("SELECT valstr FROM is4c_local WHERE keystr='$key'",$this->db); + if (sqlite_num_rows($check) == 0){ + //echo "INSERT INTO is4c_local VALUES ('$key','$val')"; + sqlite_query("INSERT INTO is4c_local VALUES ('$key','$val')",$this->db); + } + else + sqlite_query("UPDATE is4c_local SET valstr='$val' WHERE keystr='$key'",$this->db); + } + } + + function conn(){ + return sqlite_open($_SESSION["INCLUDE_PATH"]. + "/lib/LocalStorage/SQLiteDB/db", + 0666); + + } +} + +?> diff --git a/pos/is4c-web/lib/LocalStorage/SessionStorage.php b/pos/is4c-web/lib/LocalStorage/SessionStorage.php new file mode 100644 index 000000000..4593bbacb --- /dev/null +++ b/pos/is4c-web/lib/LocalStorage/SessionStorage.php @@ -0,0 +1,44 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; + +if (!class_exists("LocalStorage")) include_once($IS4C_PATH."lib/LocalStorage/LocalStorage.php"); + +class SessionStorage extends LocalStorage { + function SessionStorage(){ + if(ini_get('session.auto_start')==0 && !headers_sent()) + @session_start(); + } + + function get($key){ + if (!isset($_SESSION["$key"])) return ""; + return $_SESSION["$key"]; + } + + function set($key,$val){ + $_SESSION["$key"] = $val; + } +} + +?> diff --git a/pos/is4c-web/lib/LocalStorage/conf.php b/pos/is4c-web/lib/LocalStorage/conf.php new file mode 100644 index 000000000..977ae8b94 --- /dev/null +++ b/pos/is4c-web/lib/LocalStorage/conf.php @@ -0,0 +1,40 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +//ini_set('display_errors',1); +//ini_set('error_log',$IS4C_PATH."log/php-errors.log"); + +$LOCAL_STORAGE_MECHANISM = 'SessionStorage'; + +if (!class_exists($LOCAL_STORAGE_MECHANISM)){ + include($IS4C_PATH."lib/LocalStorage/" + .$LOCAL_STORAGE_MECHANISM.".php"); +} + +$IS4C_LOCAL = new $LOCAL_STORAGE_MECHANISM(); +global $IS4C_LOCAL; + +?> diff --git a/pos/is4c-web/lib/PrintHandlers/ESCPOSPrintHandler.class.php b/pos/is4c-web/lib/PrintHandlers/ESCPOSPrintHandler.class.php new file mode 100644 index 000000000..c8b76f6b2 --- /dev/null +++ b/pos/is4c-web/lib/PrintHandlers/ESCPOSPrintHandler.class.php @@ -0,0 +1,674 @@ +<?php +/* +ESCPOSPrintHandler.class.php +version 1 (2009-09-25) +author Alex Frase + +Notes + Epson TM-H6000II prints 504 pixels per line; + 42 columns with standard 12x24 font, 56 columns with alternate 9x17 font +*/ + +class ESCPOSPrintHandler { + + function Tab() { + // "\t" + return "\x09"; + } + + function LineFeed($lines=1) { + // one line: "\n" + if ($lines <= 1) + return "\x0A"; + // multiple lines: ESC "d" num + return "\x1B\x64".chr( max(0, min(255, (int)$lines)) ); + } + + function PageFeed($reset=true) { + // "(ESC) FF" + return ($reset?"":"\x1B")."\x0C"; + } + + function CarriageReturn() { + // "\r" + return "\x0D"; + } + + function ClearPage() { + // CAN + return "\x18"; + } + + // TODO: realtime status transmission; DLE(\x10) EOT(\x04) n + + // TODO: realtime request to printer; DLE(\x10) ENQ(\x05) n + + // TODO: realtime pulse; DLE(\x10) DC4(\x14) 1 m t + + function CharacterSpacing($dots=0) { + // ESC " " space + return "\x1B\x20".chr( max(0, min(255, $dots)) ); + } + + function TextStyle($altFont=false, $bold=false, $tall=false, $wide=false, $underline=false) { + // ESC "!" bitfield + return ("\x1B\x21" + .chr( + ($underline ? 128 : 0) + + ($wide ? 32 : 0) + + ($tall ? 16 : 0) + + ($bold ? 8 : 0) + + ($altFont ? 1 : 0) + ) + ); + } + + function GotoX($dots=0) { + // ESC "$" xLO xHI + return ("\x1B\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } // GotoX() + + // TODO: enable downloadable character set; ESC(\x1B) "%"(\x25) flag + + // TODO: define downloadable characters; ESC(\x1B) "&"(\x26) 3(\x03) char0 char1 data + + /* + ESC/POS requires graphical bitmap data in columns, but BMP is rasterized in rows, + so this function transposes the latter to the former. The source BMP data must + be 1 bpp (black/white image only), and $width is in pixels == bits (not bytes). + The return will be an array of binary strings; if the source data fits in one + inline stripe (8 pixels tall with $tallDots, 24 otherwise) the array will have + only one element. + */ + function TransposeBitmapData($data, $width, $tallDots=false) { + $oldRowBytes = (int)(($width + 7) / 8); + $newColBytes = $tallDots ? 1 : 3; + $oldStripeSize = (int)($oldRowBytes * ($tallDots ? 8 : 24)); + $stripes = array(); + + // str_split function doesn't exist in PHP4 + $str_split = array(); + $val = ""; + for($i=0;$i<strlen($data);$i++){ + if ($i % $oldStripeSize==0){ + if (strlen($val) > 0) + $str_split[] = $val; + $val = ""; + } + $val .= $data[$i]; + } + if (strlen($val) > 0) + $str_split[] = $val; + // end manual split + + foreach ($str_split as $oldData) { + $oldData = str_pad($oldData, $oldStripeSize, "\x00", STR_PAD_RIGHT); + $newData = str_repeat("\x00", $width * $newColBytes); + for ($c = 0; $c < $width; $c++) { + $oldMask = 1 << (7 - ($c % 8)); + $newByte = ($tallDots ? $c : ($c + $c + $c)); + // top or only byte + $b = 0; + for ($r = 0; $r < 8; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 0] = chr($b); + if (!$tallDots) { + // middle byte + $b = 0; + for ($r = 8; $r < 16; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 1] = chr($b); + // bottom byte + $b = 0; + for ($r = 16; $r < 24; $r++) { + $oldByte = ($r * $oldRowBytes) + ($c >> 3); // (int)($c / 8) + if (ord($oldData[$oldByte]) & $oldMask) + $b |= (1 << (7 - ($r % 8))); + } + $newData[$newByte + 2] = chr($b); + } + } + $stripes[] = $newData; + } + return $stripes; + } // TransposeBitmapData() + + /* + Bitmaps are always drawn 24 dots tall (the height of a normal printed line). + Tall dots are each 3x tall, so they take 1 byte per column (8 bits * 3 dots each = 24). + Short dots require 3 bytes per column (8 bits * 3 bytes = 24). + Data must therefore have ($width * ($tallDots ? 3 : 1)) bytes. + Each data byte specifies dots top-to-bottom, from most- to least-significant-bit: + \xC0 = \b11000000 = pixels in the top two rows + \x81 = \b10000001 = pixels on the top and bottom rows + Multiple bytes are drawn top-to-bottom (if !$tallDots), then left-to-right. + */ + function InlineBitmap($data, $width, $tallDots=false, $wideDots=false) { + // ESC "*" bitfield widthLO widthHI data + $width = (int)max(0, min(1023, $width)); + $bytes = (int)($width * ($tallDots ? 1 : 3)); + return ("\x1B\x2A" + .chr( ($tallDots ? 0 : 32) + ($wideDots ? 0 : 1) ) + .chr( (int)($width % 256) ) + .chr( (int)($width / 256) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } // InlineBitmap() + + // TODO: InlineBitmapFromFile() + + function Underline($dots=1) { + // ESC "-" size + return "\x1B\x2D".chr( max(0, min(2, $dots)) ); + } + + function ResetLineSpacing() { + // ESC "2" + return "\x1B\x32"; + } + + function LineSpacing($space=64) { + // in some small increment; with 12x24 font, space=64 seems to be approximately single-spaced, space=128 double + // ESC "3" space + return "\x1B\x33".chr( max(0, min(255, $space)) ); + } + + // TODO: return home; ESC(\x1B) "<"(\x3C) + + // TODO: select peripheral device; ESC(\x1B) "="(\x3D) n + + // TODO: delete downloadable characters; ESC(\x1B) "?"(\x3F) char + + function Reset() { + // ESC "@" + return "\x1B\x40"; + } + + function SetTabs($tabs=null) { + // ESC "D" tabs NUL + if (!is_array($tabs) || !count($tabs)) + return "\x1B\x44\x00"; + $tabs = array_unique(array_map('chr', $tabs), SORT_NUMERIC); + sort($tabs); + return ("\x1B\x44" + .implode('', $tabs) + ."\x00" + ); + } + + function Bold($on=true) { + // ESC "E" bit + return "\x1B\x45".chr( $on ? 1 : 0 ); + } + + function DoublePrint($on=true) { + // is this like a shadow effect? + // ESC "G" bit + return "\x1B\x47".chr( $on ? 1 : 0 ); + } + + function PaperFeed($space) { + // in some small increment; with 12x24 font, space=64 seems to be approximately one printed line, space=128 two + // ESC "J" space + return "\x1B\x4A".chr( max(0, min(255, $space)) ); + } + + function PaperFeedBack($space) { + // in some small increment + // ESC "K" num + return "\x1B\x4B".chr( max(0, min(24, $space)) ); + } + + function PageMode() { + // ESC "L" + return "\x1B\x4C"; + } + + function Font($font=0) { + // ESC "M" font + // (FS "G" font) + return "\x1B\x4D".chr( max(0, min(2, $font)) ); + } + + /* + international character sets: + 0: America + 1: France + 2: Germany + 3: UK + 4: Denmark I + 5: Sweden + 6: Italy + 7: Spain I + 8: Japan + 9: Norway + 10: Denmark II + 11: Spain II + 12: Latin America + 13: Korea + */ + function CharacterSet($set=0) { + // ESC "R" set + return "\x1B\x52".chr( max(0, min(13, $set)) ); + } + + function LineMode() { + // ESC "S" + return "\x1B\x53"; + } + + function PageOrient($orient=0) { + // ESC "T" dir + return "\x1B\x54".chr( max(0, min(3, (int)$orient)) ); + } + + // TODO: unidirectional printing; ESC(\x1B) "U"(\x55) bit + + function Rotate($on=true) { + // ESC "V" bit + return "\x1B\x56".chr( $on ? 1 : 0 ); + } + + function PageRegion($x=0, $y=0, $dx=65535, $dy=65535) { + // ESC "W" xLO xHI yLO yHI dxLO dxHI dyLO dyHI + return ("\x1B\x57" + .chr( max(0, (int)($x % 256)) ) + .chr( max(0, min(255, (int)($x / 245))) ) + .chr( max(0, (int)($y % 256)) ) + .chr( max(0, min(255, (int)($y / 245))) ) + .chr( max(0, (int)($dx % 256)) ) + .chr( max(0, min(255, (int)($dx / 245))) ) + .chr( max(0, (int)($dy % 256)) ) + .chr( max(0, min(255, (int)($dy / 245))) ) + ); + } + + function MoveX($dots) { + // ESC "\" dxLO dxHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1B\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function AlignLeft() { + // ESC "a" align + return "\x1B\x61\x00"; + } + + function AlignCenter() { + // ESC "a" align + return "\x1B\x61\x01"; + } + + function AlignRight() { + // ESC "a" align + return "\x1B\x61\x02"; + } + + function PaperRoll($receipt=true, $journal=false, $endorse=false, $validation=false) { + // ESC "c" "0" bitfield + return ("\x1B\x63\x30" + .chr( + ($validation ? 8 : 0) // ?? + + ($endorse ? 4 : 0) + + ($journal ? 2 : 0) // ?? + + ($receipt ? 1 : 0) + ) + ); + } // PaperRoll() + + // TODO: set paper out warning sensor; ESC(\x1B) "c"(\x63) "3"(\x33) bitfield + + // TODO: set paper out stop sensor; ESC(\x1B) "c"(\x63) "4"(\x34) bitfield + + function PanelButtons($on=true) { + // ESC "c" "5" flag + return "\x1B\x63\x35".chr( $on ? 0 : 1 ); + } + + function LineFeedBack() { + // ESC "e" 1 + return "\x1B\x65\x01"; + } + + // TODO: define macro; ESC(\x1B) "g"(\x67) NUL(\x00) num lenLO lenHI data + + // TODO: run macro; ESC(\x1B) "g"(\x67) num + + function DrawerKick($pin=2, $on=100, $off=100) { + // ESC "p" pin on off + return ("\x1B\x70" + .chr( ($pin < 3.5) ? 0 : 1 ) + .chr( max(0, min(255, (int)($on / 2))) ) // times are *2ms + .chr( max(0, min(255, (int)($off / 2))) ) + ); + } + + /* + code tables: + 0: PC437 (USA: Standard Europe) + 1: Katakana + 2: PC850 (Multilingual) + 3: PC860 (Portugese) + 4: PC863 (Canadian-French) + 5: PC865 (Nordic) + 16: WPC1252 + 17: PC866 (Cryllic #2) + 18: PC852 (Latin2) + 19: PC858 + 255: blank + */ + function CodeTable($table=0) { + // ESC "t" table + return "\x1B\x74".chr( max(0, min(255, $table)) ); + } + + // TODO: send peripheral device status; ESC(\x1B) "u"(\x75) ? + + // TODO: send paper sensor status; ESC(\x1B) "v"(\x76) ? + + function UpsideDown($on=true) { + // ESC "{" flag + return "\x1B\x7B".chr( $on ? 1 : 0 ); + } + + // TODO: paper forced feed; FS(\x1C) "A"(\x41) ? + + // TODO: send bitmap file FS(\x1C) "B"(\x42) bitmap + + // TODO: pdf 417 aspect definition; FS(\x1C) "C"(\x43) ? + + // TODO: pdf 417 ecc level definition FS(\x1C) "D"(\x44) ? + + // TODO: horz/vert bar in page mode FS(\x1C) "E"(\x45) dir lenLO lenHI width + + // TODO: set 2d barcode size; FS(\x1C) "H"(\x48) zoom + + // TODO: paper forced return; FS(\x1C) "R"(\x52) ? + + // TODO: store data; FS(\x1C) "g"(\x67) "1"(\x31) \x00 aLO aML aMH aHI bLO bHI data; max memory address=1024 + + // TODO: load data; FS(\x1C) "g"(\x67) "2"(\x32) \x00 aLO aML aMH aHI bLO bHI; max memory address=1024 + + // TODO: print 2d barcode FS(\x1C) "k"(\x6B) type lenLO lenHI data + + // TODO: print stored bitmap; FS(\x1C) "p"(\x70) num bitfield + + // TODO: store bitmaps; FS(\x1C) "q"(\x71) num [xLO xHI yLO yHI]{num} + + function CharacterZoom($horiz=1, $vert=1) { + // GS "!" zoom + return "\x1D\x21".chr( + 16 * (int)(max(1, min(8, $horiz)) - 1) + + (int)(max(1, min(8, $vert)) - 1) + ); + } + + function GotoY($dots=0) { + // GS "$" yLO yHI + return ("\x1D\x24" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + // TODO: define downloadable image; GS(\x1D) "*"(\x2A) x y data + + function Test($type=3, $paper=0) { + // GS "(" "A" + return ("\x1D\x28\x41\x02\x00" + .chr( max(0, min(2, (int)$paper)) ) + .chr( max(1, min(3, (int)$type)) ) + ); + } + + // TODO: edit NV memory; GS(\x1D) "("(\x28) "C"(\x43) ... + + // TODO: toggle realtime command; GS(\x1D) "("(\x28) "D"(\x44) ... + + // TODO: user startup commands; GS(\x1D) "("(\x28) "E"(\x45) ... + + function Density($factor=1.0) { + // GS "(" "K" \x02 \x00 \x31 factor + // factor = 0.7 (\xFA) - 0.9 (\xFF) ; 1.0 (\x00) - 1.3 (\x06) + return ("\x1D\x28\x4B\x02\x00\x31" + .chr( (int)((256 + max(-6, min(6, (($factor - 1.0) * 20)))) % 256) ) + ); + } + + function ColorBlack() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x31"; + } + + function ColorRed() { + // GS "(" "N" \x02 \x00 \x30 color + // ESC "r" color + return "\x1D\x28\x4E\x02\x00\x30\x32"; + } + + // TODO: print downloadable image; GS(\x1D) "/"(\x2F) bitfield + + // TODO: toggle macro recording; GS(\x1D) ":"(\x3A) + + function Invert($on=true) { + // GS "B" flag + return "\x1D\x42".chr( $on ? 1 : 0 ); + } + + // TODO: set counter print mode; GS(\x1D) "C"(\x43) "0"(\x30) digits align + + // TODO: set counter mode; GS(\x1D) "C"(\x43) "1"(\x31) aLO aHI bLO bHI step repeat + + // TODO: set counter mode value; GS(\x1D) "C"(\x43) "2"(\x32) vLO vHI + + // TODO: set counter mode; GS(\x1D) "C"(\x43) ";"(\x3B) sa ";"(\x3B) sb ";"(\x3B) sn ";"(\x3B) sr ";"(\x3B) sc ";"(\x3B) + + function SpeedHigh() { + // GS "E" speed + return "\x1D\x45\x00"; + } + + function SpeedMedium() { + // GS "E" speed + return "\x1D\x45\x10"; + } + + function SpeedLow() { + // GS "E" speed + return "\x1D\x45\x20"; + } + + function BarcodeHRI($below=true, $above=false) { + // GS "H" bitfield + return ("\x1D\x48" + .chr( ($below ? 2 : 0) + ($above ? 1 : 0) ) + ); + } + + // TODO: send printer ID; GS(\x1D) "I"(\x49) type + + function LeftMargin($dots=0) { + // GS "L" marginLO marginHI + return ("\x1D\x4C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function DotPitch($primary=0, $secondary=0) { + // sets dot pitch to 1/Xth inch (25.4/Xth mm), or 0 for default + // GS "P" pitch pitch + return "\x1D\x50".chr($primary).chr($secondary); + } + + function DiscardLine() { + // GS "T" printbit + return "\x1D\x54\x00"; + } + + function PreCutPaper($full=false) { + // the cutter is above the print position, so cutting without feeding will put the cut above the last few lines printed + // GS "V" bit + // ESC "i" (partial) + // ESC "m" (partial) + return "\x1D\x56".chr( $full ? 0 : 1 ); + } + + function CutPaper($full=false, $feed=0) { + // this version feeds the paper far enough to put the cutter just below the last line printed, plus the feed distance (in pixels?) + // GS "V" bit feed + return ("\x1D\x56" + .chr( $full ? 65 : 66 ) + .chr( $feed ) + ); + } + + function PrintableWidth($dots=65535) { + // GS "W" widthLO widthHI + return ("\x1D\x57" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + function MoveY($dots) { + // GS "\" dyLO dyHI + if ($dots < 0 && $dots >= -32768) + $dots += 65536; + return ("\x1D\x5C" + .chr( max(0, (int)($dots % 256)) ) + .chr( max(0, min(255, (int)($dots / 256))) ) + ); + } + + // TODO: run macro; GS(\x1D) "^"(\x5E) repeat delay mode + + // TODO: enable automatic status back; GS(\x1D) "a"(\x61) bitfield + + function Smooth($on=true) { + // GS "b" flag + return "\x1D\x62".chr( $on ? 1 : 0 ); + } + + // TODO: print counter; GS(\x1D) "c"(\x63) + + function BarcodeHRIFont($font=0) { + // GS "f" font + return "\x1D\x66".chr( max(0, min(2, $font)) ); + } + + function BarcodeHeight($dots=162) { + // GS "h" height + return "\x1D\x68".chr( max(1, min(255, $dots)) ); + } + + function BarcodeUPC($data, $upcE=false) { + $bytes = max(11, min(12, strlen($data))); + return ("\x1D\x6B" + .chr( $upcE ? 66 : 65 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeEAN($data, $ean8=false) { + $bytes = $ean8 ? max(7, min(8, strlen($data))) : max(12, min(13, strlen($data))); + return ("\x1D\x6B" + .chr( $ean8 ? 68 : 67 ) + .chr( $bytes ) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE39($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(69) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-Z $%+./-]|', ' ', substr($data, 0, $bytes)), $bytes, ' ', STR_PAD_LEFT) + ); + } + + function BarcodeITF($data) { + $bytes = max(2, min(254, (int)(strlen($data) / 2) * 2)); + return ("\x1D\x6B" + .chr(70) + .chr($bytes) + .str_pad(preg_replace('|[^0-9]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODEABAR($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(71) + .chr($bytes) + .str_pad(preg_replace('|[^0-9A-D$+./:-]|', '0', substr($data, 0, $bytes)), $bytes, '0', STR_PAD_LEFT) + ); + } + + function BarcodeCODE93($data) { + $bytes = max(1, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(72) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + function BarcodeCODE128($data) { + $bytes = max(2, min(255, strlen($data))); + return ("\x1D\x6B" + .chr(73) + .chr($bytes) + .str_pad(preg_replace('|[^\\x00-\\x7f]|', "\x00", substr($data, 0, $bytes)), $bytes, "\x00", STR_PAD_LEFT) + ); + } + + // TODO: send status; GS(\x1D) "r"(\x72) bitfield + + /* + Raster bitmaps may be up to 524280 pixels wide ((255+255*256)*8), and up to 2303 pixels tall (255+8*256). + Tall dots are 2 pixels tall, and wide dots are 2 pixels wide. + This function takes $width and $height as pixels, but the printer takes width as bytes (= 8 pixels). + Data must have (($width * $height) / 8) bytes. + The bits in each data byte specify dots from left-to-right, and bytes are left-to-right, top-to-bottom. + \xC0 = \b11000000 = pixels in the left two columns + \x81 = \b10000001 = pixels in the left and right columns + */ + function RasterBitmap($data, $width, $height, $tallDots=false, $wideDots=false) { + // GS "v" 0 bits widthLO widthHI heightLO heightHI data + $width = (int)(($width + 7) / 8); + $bytes = (int)($width * $height); + return ("\x1D\x76\x00" + .chr( ($tallDots ? 2 : 0) + ($wideDots ? 1 : 0) ) + .chr( (int)($width % 256) ) + .chr( max(0, min(255, (int)($width / 256))) ) + .chr( (int)($height % 256) ) + .chr( max(0, min(8, (int)($height / 256))) ) + .str_pad(substr($data, 0, $bytes), $bytes, "\x00") + ); + } + + function BarcodeWidth($scale=3) { + // ($scale * 0.141mm) is the width per single code line, not the total code width + // GS "w" scale + return "\x1D\x77".chr( max(1, min(6, $scale)) ); + } + +} // ESCPOSPrintHandler + diff --git a/pos/is4c-web/lib/SQLManager.php b/pos/is4c-web/lib/SQLManager.php new file mode 100644 index 000000000..575fe4e5f --- /dev/null +++ b/pos/is4c-web/lib/SQLManager.php @@ -0,0 +1,570 @@ +<?php +/******************************************************************************* + + Copyright 2007 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/************************************************** +CLASS INTERFACE + +Properties: +rows - contains the number of rows from the last + query +TYPE_MYSQL - type for MySQL (static) +TYPE_MSSQL - type for Microsoft SQL Server (static) + +Methods: +SQLManager(server, type, database, username, password[default: ''], persistent[default: False]) + Constructor. Creates the object and adds an initial connection to use as the + default. Future references to this connection can be made using the $database string. + Type should be one of the static database types, e.g. TYPE_MYSQL + +add_connection(server, type, database, username, password[d: ''], persistent[d: False]) + Same as above, but this is not the default connection. + +select_db(database_name, connection_identifier) + Selects the given database, using the default connection if no identifier is provided. + +query(query_string, connection_identifier) + Issues the query and returns the result, using the default connection is no identifier + is provided. + +fetch_array(result_object, connection_identifer) + Returns the row array, using the default connection if no identifier is provided. + +**************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +define('DEBUG_MYSQL_QUERIES',$IS4C_PATH.'log/queries.log'); +define('DEBUG_SMART_INSERTS',$IS4C_PATH.'log/smart_insert_errors.log'); + +$TYPE_MYSQL = 'MYSQL'; +$TYPE_MSSQL = 'MSSQL'; +$TYPE_PGSQL = 'PGSQL'; + +class SQLManager { + + var $connections; + var $db_types; + var $default_db; + + var $TYPE_MYSQL = 'MYSQL'; + var $TYPE_MSSQL = 'MSSQL'; + var $TYPE_PGSQL = 'PGSQL'; + + function SQLManager($server,$type,$database,$username,$password='',$persistent=False){ + $this->connections=array(); + $this->db_types=array(); + $this->default_db = $database; + $this->add_connection($server,strtoupper($type), + $database,$username,$password, + $persistent); + } + + function add_connection($server,$type,$database,$username,$password='',$persistent=False){ + if (isset($this->connections[$database])){ + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,False); + } + else { + $this->connections[$database] = $this->connect($server, + strtoupper($type),$username,$password, + $persistent,True); + + } + $this->db_types[$database] = strtoupper($type); + $gotdb = $this->select_db($database,$database); + if (!$gotdb){ + if ($this->query("CREATE DATABASE $database")){ + $this->select_db($database,$database); + } + else { + unset($this->db_types[$database]); + $this->connections[$database] = False; + } + } + + } + + function connect($server,$type,$username,$password,$persistent=False,$newlink=False){ + switch($type){ + case $this->TYPE_MYSQL: + if ($persistent) + return mysql_pconnect($server,$username,$password,$newlink); + else + return mysql_connect($server,$username,$password,$newlink); + case $this->TYPE_MSSQL: + if ($persistent) + return mssql_pconnect($server,$username,$password); + else + return mssql_connect($server,$username,$password); + case $this->TYPE_PGSQL: + $conStr = "host=".$server." user=".$username." password=".$password; + if ($persistent) + return pg_pconnect($conStr); + else + return pg_connect($conStr); + } + return -1; + } + + function db_close($which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_close($this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_close($this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return pg_close($this->connections[$which_connection]); + } + unset($this->connections[$which_connection]); + unset($this->db_types[$which_connection]); + return -1; + } + function select_db($db_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_select_db($db_name,$this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return True; + } + return -1; + } + + function query($query_text,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $result = mysql_query($query_text,$this->connections[$which_connection]); + if (!$result && DEBUG_MYSQL_QUERIES != "" && is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n".mysql_error()."\n\n"); + fclose($fp); + } + //else if (!$result) echo $query_text; + return $result; + case $this->TYPE_MSSQL: + $result = mssql_query($query_text,$this->connections[$which_connection]); + if (!$result && DEBUG_MYSQL_QUERIES != "" && is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,date('r').": ".$query_text."\n\n"); + fclose($fp); + } + return $result; + case $this->TYPE_PGSQL: + return pg_query($this->connections[$which_connection],$query_text); + } + return -1; + } + + function num_rows($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_rows($result_object); + case $this->TYPE_MSSQL: + return mssql_num_rows($result_object); + case $this->TYPE_PGSQL: + return pg_num_rows($result_object); + } + return -1; + } + + function num_fields($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_num_fields($result_object); + case $this->TYPE_MSSQL: + return mssql_num_fields($result_object); + case $this->TYPE_PGSQL: + return pg_num_fields($result_object); + } + return -1; + } + + function fetch_array($result_object,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_array($result_object); + case $this->TYPE_MSSQL: + return mssql_fetch_array($result_object); + case $this->TYPE_PGSQL: + return pg_fetch_array($result_object); + } + return -1; + } + + /* compatibility */ + function fetch_row($result_object,$which_connection=''){ + return $this->fetch_array($result_object,$which_connection); + } + + function fetch_field($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_fetch_field($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_fetch_field($result_object,$index); + } + return -1; + } + + function field_type($result_object,$index,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_field_type($result_object,$index); + case $this->TYPE_MSSQL: + return mssql_field_type($result_object,$index); + case $this->TYPE_PGSQL: + return pg_field_type($result_object,$index); + } + return -1; + } + + function close($which_connection=''){ + return; + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_close($this->connections[$which_connection]); + case $this->TYPE_MSSQL: + return mssql_close($this->connections[$which_connection]); + case $this->TYPE_PGSQL: + return pg_close($this->connections[$which_connection]); + } + return -1; + } + + function test($which_connection=''){ + if ($which_connection=='') + $which_connection=$this->default_db; + + if ($this->connections[$which_connection]) return True; + else return False; + } + + /* copy a table from one database to another, not necessarily on + the same server or format + + $source_db is the database name of the source + $select_query is the query that will get the data + $dest_db is the database name of the destination + $insert_query is the beginning of the query that will add the + data to the destination (specify everything up to VALUES) + */ + function transfer($source_db,$select_query,$dest_db,$insert_query){ + $result = $this->query($select_query,$source_db); + if (!$result) return False; + + $num_fields = $this->num_fields($result,$source_db); + + $unquoted = array("money"=>1,"real"=>1,"numeric"=>1, + "float4"=>1,"float8"=>1,"bit"=>1,"decimal"=>1, + "unknown"=>1); + $strings = array("varchar"=>1,"nvarchar"=>1,"string"=>1, + "char"=>1); + $dates = array("datetime"=>1); + $queries = array(); + + while($row = $this->fetch_array($result,$source_db)){ + $full_query = $insert_query." VALUES ("; + for ($i=0; $i<$num_fields; $i++){ + $type = $this->field_type($result,$i,$source_db); + if ($row[$i] == "" && strstr(strtoupper($type),"INT")) + $row[$i] = 0; + elseif ($row[$i] == "" && isset($unquoted[$type])) + $row[$i] = 0; + if (isset($dates[$type])){ + $clean = $this->cleanDateTime($row[$i]); + $row[$i] = ($clean!="")?$clean:$row[$i]; + } + elseif (isset($strings[$type])) + $row[$i] = str_replace("'","''",$row[$i]); + + if (isset($unquoted[$type])) + $full_query .= $row[$i].","; + else + $full_query .= "'".$row[$i]."',"; + } + $full_query = substr($full_query,0,strlen($full_query)-1).")"; + $queries[] = $full_query; + } + + $ret = True; + + foreach ($queries as $q){ + if(!$this->query($q,$dest_db)){ + $ret = False; + if (is_writable(DEBUG_MYSQL_QUERIES)){ + $fp = fopen(DEBUG_MYSQL_QUERIES,"a"); + fwrite($fp,$q."\n\n"); + fclose($fp); + } + } + } + + return $ret; + } + + function cleanDateTime($str){ + $stdFmt = "/(\d\d\d\d)-(\d\d)-(\d\d) (\d+?):(\d\d):(\d\d)/"; + if (preg_match($stdFmt,$str,$group)) + return $str; + + $msqlFmt = "/(\w\w\w) (\d+) (\d\d\d\d) +(\d+?):(\d\d)(\w)M/"; + + $months = array( + "jan"=>"01", + "feb"=>"02", + "mar"=>"03", + "apr"=>"04", + "may"=>"05", + "jun"=>"06", + "jul"=>"07", + "aug"=>"08", + "sep"=>"09", + "oct"=>"10", + "nov"=>"11", + "dec"=>"12" + ); + + $info = array( + "month" => 1, + "day" => 1, + "year" => 1900, + "hour" => 0, + "min" => 0 + ); + + if (preg_match($msqlFmt,$str,$group)){ + $info["month"] = $months[strtolower($group[1])]; + $info["day"] = $group[2]; + $info["year"] = $group[3]; + $info["hour"] = $group[4]; + $info["min"] = $group[5]; + if ($group[6] == "P" && $info["hour"] != "12") + $info["hour"] = ($info["hour"] + 12) % 24; + elseif($group[6] == "A" && $info["hour"] == "12") + $info["hour"] = 0; + } + + $ret = $info["year"]."-"; + $ret .= str_pad($info["month"],2,"0",STR_PAD_LEFT)."-"; + $ret .= str_pad($info["day"],2,"0",STR_PAD_LEFT)." "; + $ret .= str_pad($info["hour"],2,"0",STR_PAD_LEFT).":"; + $ret .= str_pad($info["min"],2,"0",STR_PAD_LEFT); + return $ret; + } + + /* check whether the given table exists + Return values: + True => table exists + False => table doesn't exist + -1 => Operation not supported for this database type + */ + function table_exists($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $result = $this->query("SHOW TABLES FROM $which_connection + LIKE '$table_name'",$which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + case $this->TYPE_MSSQL: + $result = $this->query("SELECT name FROM sysobjects + WHERE name LIKE '$table_name'", + $which_connection); + if ($this->num_rows($result) > 0) return True; + else return False; + } + return -1; + } + + /* return the table's definition + Return values: + array of values => table found + array format: $return['column_name'] = + array('column_type', is_auto_increment) + False => no such table + -1 => Operation not supported for this database type + */ + function table_definition($table_name,$which_connection=''){ + if ($which_connection == '') + $which_connection=$this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + $return = array(); + $result = $this->query("SHOW COLUMNS FROM $table_name",$which_connection); + while($row = $this->fetch_row($result,$which_connection)){ + $auto = False; + if (strstr($row[5],"auto_increment")) + $auto = True; + $return[$row[0]] = array($row[1],$auto,$row[0]); + } + if (count($return) == 0) return False; + else return $return; + case $this->TYPE_MSSQL: + $return = array(); + $result = $this->query("SELECT c.name,t.name,c.length, + CASE WHEN c.autoval IS NULL + THEN 0 ELSE 1 END AS auto + FROM syscolumns AS c + LEFT JOIN sysobjects AS o + ON c.id=o.id + LEFT JOIN systypes AS t + ON c.xtype=t.xtype + WHERE o.name='$table_name'",$which_connection); + while($row = $this->fetch_row($result,$which_connection)){ + $auto = False; + if ($row[3] == 1) $auto = True; + $return[$row[0]] = array($row[1]."(".$row[2].")",$auto,$row[0]); + } + if (count($return) == 0) return False; + else return $return; + } + return -1; + } + + /* attempt to load an array of values + * into the specified table + * array format: $values['column_name'] = 'column_value' + * If debugging is enabled, columns that couldn't be + * written are noted + */ + function smart_insert($table_name,$values,$which_connection=''){ + $OUTFILE = DEBUG_SMART_INSERTS; + + if ($which_connection == '') + $which_connection=$this->default_db; + $exists = $this->table_exists($table_name,$which_connection); + if (!$exists) return False; + if ($exists === -1) return -1; + + $t_def = $this->table_definition($table_name,$which_connection); + + $fp = -1; + date_default_timezone_set('America/Chicago'); + $tstamp = date("r"); + if ($OUTFILE != "" && is_writable($OUTFILE)) + $fp = fopen($OUTFILE,"a"); + + $cols = "("; + $vals = "("; + foreach($values as $k=>$v){ + //$k = strtoupper($k); + if (isset($t_def[$k]) && is_array($t_def[$k])){ + if (!$t_def[$k][1]){ + if (stristr($t_def[$k][0],"money") || + stristr($t_def[$k][0],'decimal') || + stristr($t_def[$k][0],'float') || + stristr($t_def[$k][0],'double') ) + $vals .= $v.","; + else + $vals .= "'".$v."',"; + $col_name = $t_def[$k][2]; + if ($this->db_types[$which_connection] == $this->TYPE_MYSQL) + $cols .= "`".$col_name."`,"; + else + $cols .= $col_name.","; + } + else { + if ($OUTFILE != "") + fwrite($fp,"$tstamp: Column $k in table $table_name + is auto_increment so your value + was omitted\n"); + } + } + else { + if ($OUTFILE != '') + fwrite($fp,"$tstamp: Column $k not in table $table_name\n"); + } + } + $cols = substr($cols,0,strlen($cols)-1).")"; + $vals = substr($vals,0,strlen($vals)-1).")"; + $insertQ = "INSERT INTO $table_name $cols VALUES $vals"; + + $ret = $this->query($insertQ,$which_connection); + if (!$ret && $OUTFILE != ""){ + fwrite($fp,"$tstamp: $insertQ\n"); + } + if ($OUTFILE != "" && is_writable($OUTFILE)) fclose($fp); + + return $ret; + } + + function datediff($date1,$date2,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "datediff($date1,$date2)"; + case $this->TYPE_MSSQL: + return "datediff(dd,$date2,$date1)"; + } + } + + function now($which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return "now()"; + case $this->TYPE_MSSQL: + return "getdate()"; + case $this->TYPE_PGSQL: + return "now()"; + } + } + + function escape($str,$which_connection=''){ + if ($which_connection == '') + $which_connection = $this->default_db; + switch($this->db_types[$which_connection]){ + case $this->TYPE_MYSQL: + return mysql_real_escape_string($str); + case $this->TYPE_MSSQL: + return str_replace("'","''",$str); + } + return $str; + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountType.php b/pos/is4c-web/lib/Scanning/DiscountType.php new file mode 100644 index 000000000..ec3e8c904 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountType.php @@ -0,0 +1,56 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class DiscountType { + + var $savedRow; + var $savedInfo; + + function priceInfo($row,$quantity=1){ + return array( + "regPrice"=>0, + "unitPrice"=>0, + "discount"=>0, + "memDiscount"=>0 + ); + } + + function addDiscountLine(){ + + } + + function isSale(){ + return false; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/CaseDiscount.php b/pos/is4c-web/lib/Scanning/DiscountTypes/CaseDiscount.php new file mode 100644 index 000000000..65d9e988a --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/CaseDiscount.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('addcdnotify')) include($IS4C_PATH.'lib/additem.php'); + +class CaseDiscount extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $IS4C_LOCAL; + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + $ret['discount'] = 0; + $ret['memDiscount'] = 0; + + if ($IS4C_LOCAL->get("casediscount") > 0 && $IS4C_LOCAL->get("casediscount") <= 100) { + $casediscount = (100 - $IS4C_LOCAL->get("casediscount"))/100; + $ret['unitPrice'] = $casediscount * $ret['unitPrice']; + $ret['regPrice'] = $ret['unitPrice']; + $IS4C_LOCAL->set("casediscount",0); + } + + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $IS4C_LOCAL; + addcdnotify(); + } + + function isSale(){ + return false; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/EveryoneSale.php b/pos/is4c-web/lib/Scanning/DiscountTypes/EveryoneSale.php new file mode 100644 index 000000000..df1d435d7 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/EveryoneSale.php @@ -0,0 +1,81 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('adddiscount')) include($IS4C_PATH.'lib/additem.php'); + +class EveryoneSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['special_price']; + + /* if not by weight, just use the sticker price + (for scaled items, the UPC parse module + calculates a weight estimate and sets a quantity + so normal_price can be used. This could be done + for all items, but typically the deli doesn't + keep good track of whether their items are + marked scale correctly since it only matters when an + item goes on sale + */ + if (isset($row['stickerprice']) && $row['scale'] == 0){ + $ret['regPrice'] = $row['stickerprice']; + } + + $ret['discount'] = ($ret['regPrice'] - $row['special_price']) * $quantity; + $ret['memDiscount'] = 0; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $IS4C_LOCAL; + $IS4C_LOCAL->set("voided",2); + adddiscount($this->savedInfo['discount'], + $this->savedRow['department']); + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/MemberSale.php b/pos/is4c-web/lib/Scanning/DiscountTypes/MemberSale.php new file mode 100644 index 000000000..11c03b1bf --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/MemberSale.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('adddiscount')) include($IS4C_PATH.'lib/additem.php'); + +class MemberSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $IS4C_LOCAL; + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = ($ret['regPrice'] - $row['special_price']) * $quantity; + + if ($IS4C_LOCAL->get("isMember") == 1) + $ret["unitPrice"] = $row['special_price']; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("isMember")){ + $IS4C_LOCAL->set("voided",2); + adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return true; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/NormalPricing.php b/pos/is4c-web/lib/Scanning/DiscountTypes/NormalPricing.php new file mode 100644 index 000000000..d7fd91369 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/NormalPricing.php @@ -0,0 +1,59 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); + +class NormalPricing extends DiscountType { + + function priceInfo($row,$quantity=1){ + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + $ret['discount'] = 0; + $ret['memDiscount'] = 0; + + return $ret; + } + + function addDiscountLine(){ + + } + + function isSale(){ + return false; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/PercentMemSale.php b/pos/is4c-web/lib/Scanning/DiscountTypes/PercentMemSale.php new file mode 100644 index 000000000..f8977944c --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/PercentMemSale.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('adddiscount')) include($IS4C_PATH.'lib/additem.php'); + +class PercentMemSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $IS4C_LOCAL; + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = ($ret['unitPrice'] * $row['special_price']) * $quantity; + + if ($IS4C_LOCAL->get("isMember") == 1) + $ret['unitPrice'] = $ret['unitPrice'] * $row['special_price']; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("isMember")){ + $IS4C_LOCAL->set("voided",2); + adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return true; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/SlidingMemSale.php b/pos/is4c-web/lib/Scanning/DiscountTypes/SlidingMemSale.php new file mode 100644 index 000000000..35cd4d9e3 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/SlidingMemSale.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('adddiscount')) include($IS4C_PATH.'lib/additem.php'); + +class SlidingMemSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $IS4C_LOCAL; + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = $row['special_price'] * $quantity; + + if ($IS4C_LOCAL->get("isMember")) + $ret['unitPrice'] -= $row['special_price']; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("isMember")){ + $IS4C_LOCAL->set("voided",2); + adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return true; + } + + function isStaffOnly(){ + return false; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/DiscountTypes/StaffSale.php b/pos/is4c-web/lib/Scanning/DiscountTypes/StaffSale.php new file mode 100644 index 000000000..9e159db66 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/DiscountTypes/StaffSale.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('DiscountType')) include($IS4C_PATH.'lib/Scanning/DiscountType.php'); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('adddiscount')) include($IS4C_PATH.'lib/additem.php'); + +class StaffSale extends DiscountType { + + function priceInfo($row,$quantity=1){ + global $IS4C_LOCAL; + $ret = array(); + + $ret["regPrice"] = $row['normal_price']; + $ret["unitPrice"] = $row['normal_price']; + + $ret['discount'] = 0; + $ret['memDiscount'] = ($ret['regPrice'] - $row['special_price']) * $quantity; + + if ($IS4C_LOCAL->get("isStaff") == 1) + $ret["unitPrice"] = $row['special_price']; + + $this->savedRow = $row; + $this->savedInfo = $ret; + return $ret; + } + + function addDiscountLine(){ + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("isStaff") == 1){ + $IS4C_LOCAL->set("voided",2); + adddiscount($this->savedInfo['memDiscount'], + $this->savedRow['department']); + } + } + + function isSale(){ + return true; + } + + function isMemberOnly(){ + return false; + } + + function isStaffOnly(){ + return true; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethod.php b/pos/is4c-web/lib/Scanning/PriceMethod.php new file mode 100644 index 000000000..1e703dad9 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethod.php @@ -0,0 +1,35 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class PriceMethod { + + var $savedRow; + var $savedInfo; + + function addItem($row,$quantity,$priceObj){ + return true; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethods/ABGroupPM.php b/pos/is4c-web/lib/Scanning/PriceMethods/ABGroupPM.php new file mode 100644 index 000000000..b7b19a115 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethods/ABGroupPM.php @@ -0,0 +1,224 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* AB Group PriceMethod module + + This module provides a group price where + the customer must buy something from + item group A *and* item group B to receive + the associated discount (ex: buy salsa, + save $0.50 on chips) + + This is pricemethod 4 in earlier WFC releases + and may not exist anywhere else. +*/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('PriceMethod')) include($IS4C_PATH.'lib/Scanning/PriceMethod.php'); +if (!function_exists('addItem')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('truncate2')) include($IS4C_PATH.'lib/lib.php'); + +class ABGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + $mixMatch = $row['mixmatchcode']; + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* not straight-up interchangable + * ex: buy item A, get $1 off item B + * need strict pairs AB + * + * type 3 tries to split the discount amount + * across A & B's departments; type 4 + * does not + */ + $qualMM = abs($mixMatch); + $discMM = -1*abs($mixMatch); + + // lookup existing qualifiers (i.e., item As) + // by-weight items are rounded down here + $q1 = "SELECT floor(sum(ItemQtty)),max(department) + FROM localtemptrans WHERE mixMatch='$qualMM' + and trans_status <> 'R'"; + $r1 = $dbt->query($q1); + $quals = 0; + $dept1 = 0; + if($dbt->num_rows($r1)>0){ + $rowq = $dbt->fetch_row($r1); + $quals = round($rowq[0]); + $dept1 = $rowq[1]; + } + + // lookup existing discounters (i.e., item Bs) + // by-weight items are counted per-line here + // + // extra checks to make sure the maximum + // discount on scale items is "free" + $q2 = "SELECT sum(CASE WHEN scale=0 THEN ItemQtty ELSE 1 END), + max(department),max(scale),max(total) FROM localtemptrans + WHERE mixMatch='$discMM' + and trans_status <> 'R'"; + $r2 = $dbt->query($q2); + $dept2 = 0; + $discs = 0; + $discountIsScale = false; + $scaleDiscMax = 0; + if($dbt->num_rows($r2)>0){ + $rowd = $dbt->fetch_row($r2); + $discs = round($rowd[0]); + $dept2 = $rowd[1]; + if ($rowd[2]==1) $discountIsScale = true; + $scaleDiscMax = $rowd[3]; + } + if ($quantity != (int)$quantity && $mixMatch < 0){ + $discountIsScale = true; + $scaleDiscMax = $quantity * $unitPrice; + } + + // items that have already been used in an AB set + $q3 = "SELECT sum(matched) FROM localtemptrans WHERE + mixmatch IN ('$qualMM','$discMM')"; + $r3 = $dbt->query($q3); + $matches = ($dbt->num_rows($r3)>0)?array_pop($dbt->fetch_array($r3)):0; + + // reduce totals by existing matches + // implicit: quantity required for B = 1 + // i.e., buy X item A save on 1 item B + $matches = $matches/$groupQty; + $quals -= $matches*($groupQty-1); + $discs -= $matches; + + // where does the currently scanned item go? + if ($mixMatch > 0){ + $quals = ($quals >0)?$quals+floor($quantity):floor($quantity); + $dept1 = $department; + } + else { + // again, scaled items count once per line + if ($quantity != (int)$quantity) + $discs = ($discs >0)?$discs+1:1; + else + $discs = ($discs >0)?$discs+$quantity:$quantity; + $dept2 = $department; + } + + // count up complete sets + $sets = 0; + while($discs > 0 && $quals >= ($volume-1) ){ + $discs -= 1; + $quals -= ($volume -1); + $sets++; + } + + if ($sets > 0){ + $maxDiscount = $sets*$groupPrice; + if ($scaleDiscMax != 0 && $maxDiscount > $scaleDiscMax) + $maxDiscount = $scaleDiscMax; + + // if the current item is by-weight, quantity + // decrement has to be corrected, but matches + // should still be an integer + $ttlMatches = $sets; + if($quantity != (int)$quantity) $sets = $quantity; + $quantity = $quantity - $sets; + + addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + $sets, + $pricing['unitPrice'], + truncate2($sets*$pricing['unitPrice']), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + ($priceObj->isMemberSale() || $priceObj->isStaffSale()) ? 0 : truncate2($maxDiscount), + ($priceObj->isMemberSale() || $priceObj->isStaffSale()) ? truncate2($maxDiscount) : 0, + $row['discount'], + $row['discounttype'], + $sets, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $ttlMatches * $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + } + + /* any remaining quantity added without + grouping discount */ + if ($quantity > 0){ + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethods/BasicPM.php b/pos/is4c-web/lib/Scanning/PriceMethods/BasicPM.php new file mode 100644 index 000000000..8458bb202 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethods/BasicPM.php @@ -0,0 +1,76 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* Basic PriceMethod module + + This module just adds the item with the given + quantity and price/discount information + + Classically, this is pricemethod=0 +*/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('PriceMethod')) include($IS4C_PATH.'lib/Scanning/PriceMethod.php'); +if (!function_exists('addItem')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('truncate2')) include($IS4C_PATH.'lib/lib.php'); + +class BasicPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + $row['pricemethod'], + $row['quantity'], + $row['groupprice'], + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethods/BigGroupPM.php b/pos/is4c-web/lib/Scanning/PriceMethods/BigGroupPM.php new file mode 100644 index 000000000..a094b1137 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethods/BigGroupPM.php @@ -0,0 +1,163 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* Big Group Price Method + + elaborate set matching; can require up to + 11 separate items + Qualifying item(s) have a mixmatch code + with a matching 'stem' plus '_qX' + (e.g., mmitemstem_q0, mmitemstem_q1, etc) + Discount item has the same stem plus '_d' + (e.g, mmitemstem_d) + + Customer has to buy one item from each + qualifying group as well as an item from + the discount group. +*/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('PriceMethod')) include($IS4C_PATH.'lib/Scanning/PriceMethod.php'); +if (!function_exists('addItem')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('truncate2')) include($IS4C_PATH.'lib/lib.php'); + +class BigGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + $stem = substr($mixMatch,0,10); + $sets = 99; + // count up total sets + for($i=0; $i<=$volume; $i++){ + $tmp = $stem."_q".$i; + if ($volume == $i) $tmp = $stem.'_d'; + + $chkQ = "SELECT sum(CASE WHEN scale=0 THEN ItemQtty ELSE 1 END) + FROM localtemptrans WHERE mixmatch='$tmp' + and trans_status<>'R'"; + $chkR = $dbt->query($chkQ); + $tsets = 0; + if ($dbt->num_rows($chkR) > 0){ + $tsets = array_pop($dbt->fetch_row($chkR)); + } + if ($tmp == $mixMatch){ + $tsets += is_int($quantity)?$quantity:1; + } + + if ($tsets < $sets) + $sets = $tsets; + + // item not found, no point continuing + if ($sets == 0) break; + } + + // count existing sets + $matches = 0; + $mQ = "SELECT sum(matched) FROM localtemptrans WHERE + left(mixmatch,11)='{$stem}_'"; + $mR = $dbt->query($mQ); + if ($dbt->num_rows($mR) > 0) + $matches = array_pop($dbt->fetch_row($mR)); + $sets -= $matches; + + // this means the current item + // completes a new set + if ($sets > 0){ + if ($priceObj->isSale()){ + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()) + $pricing['memDiscount'] = truncate2($row['specialgroupprice'] * $quantity); + else + $pricing['discount'] = truncate2($row['specialgroupprice'] * $quantity); + } + else { + $pricing['unitPrice'] = $pricing['unitPrice'] - $row['specialgroupprice']; + } + + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $sets, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + else { + // not a new set, treat as a regular item + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + $row['pricemethod'], + $row['quantity'], + $row['groupprice'], + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethods/GroupPM.php b/pos/is4c-web/lib/Scanning/PriceMethods/GroupPM.php new file mode 100644 index 000000000..e333b9ad4 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethods/GroupPM.php @@ -0,0 +1,89 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* Group PriceMethod module + + This module provides the simplest form of group price: + each item is sold for the group price divided by the + group size. Buying a "complete" group is not required. + + In most locations, this is pricemethod 1 or 2 +*/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('PriceMethod')) include($IS4C_PATH.'lib/Scanning/PriceMethod.php'); +if (!function_exists('addItem')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('truncate2')) include($IS4C_PATH.'lib/lib.php'); + +class GroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + if ($priceObj->isSale()){ + $disc = $pricing['unitPrice'] - ($row['specialgroupprice'] / $row['specialquantity']); + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()) + $pricing['memDiscount'] = truncate2($disc * $quantity); + else + $pricing['discount'] = truncate2($disc * $quantity); + } + else { + $pricing['unitPrice'] = $row['groupprice'] / $row['quantity']; + } + + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $pricing['discount'], + $pricing['memDiscount'], + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethods/QttyEnforcedGroupPM.php b/pos/is4c-web/lib/Scanning/PriceMethods/QttyEnforcedGroupPM.php new file mode 100644 index 000000000..35a448d72 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethods/QttyEnforcedGroupPM.php @@ -0,0 +1,215 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +/* Quantity-Enforced Group PriceMethod module + + This module provides grouped sales where the + customer is required to buy a "complete set" + before the group discount is applied + + In most locations, this is pricemethod 1 or 2 +*/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('PriceMethod')) include($IS4C_PATH.'lib/Scanning/PriceMethod.php'); +if (!function_exists('addItem')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('tDataConnect')) include($IS4C_PATH.'lib/connect.php'); +if (!function_exists('truncate2')) include($IS4C_PATH.'lib/lib.php'); + +class QttyEnforcedGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* calculate how many complete sets are + present in this scan and how many remain + after complete sets */ + $new_sets = floor($quantity / $groupQty); + $remainder = $quantity % $groupQty; + + /* add complete sets */ + if ($new_sets > 0){ + /* discount for complete set */ + $discount = ($pricing['unitPrice']*$groupQty) - $groupPrice; + $memDiscount = 0; + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()){ + $memDiscount = $discount; + $discount = 0; + } + + addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + $new_sets * $groupQty, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $discount, + $memDiscount, + $row['discount'], + $row['discounttype'], + $new_sets * $groupQty, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $new_sets * $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + $quantity = $quantity - ($new_sets * $groupQty); + if ($quantity < 0) $quantity = 0; + } + + /* if potential matches remain, check for sets */ + if ($remainder > 0){ + /* count items in the transaction + from the given group, minus + items that have already been used + in a grouping */ + $mixMatch = $row["mixmatchcode"]; + $queryt = "select sum(ItemQtty - matched) as mmqtty, + mixMatch from localtemptrans + where trans_status <> 'R' AND + mixMatch = '".$mixMatch."' group by mixMatch"; + if (!$mixMatch || $mixMatch == '0') { + $mixMatch = 0; + $queryt = "select sum(ItemQtty - matched) as mmqtty from " + ."localtemptrans where trans_status<>'R' AND " + ."upc = '".$upc."' group by upc"; + } + $dbt = tDataConnect(); + $resultt = $dbt->query($queryt); + $num_rowst = $dbt->num_rows($resultt); + + $trans_qty = 0; + if ($num_rowst > 0){ + $rowt = $dbt->fetch_array($resultt); + $trans_qty = floor($rowt['mmqtty']); + } + + /* remainder from current scan plus existing + unmatched items complete a new set, so + add one item with the group discount */ + if ($trans_qty + $remainder >= $groupQty){ + /* adjusted price for the "last" item in a set */ + $priceAdjust = $groupPrice - (($groupQty-1) * $pricing['unitPrice']); + $discount = $pricing['unitPrice'] - $priceAdjust; + $memDiscount = 0; + if ($priceObj->isMemberSale() || $priceObj->isStaffSale()){ + $memDiscount = $discount; + $discount = 0; + } + + addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + 1, + $pricing['unitPrice'], + $pricing['unitPrice'], + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + $discount, + $memDiscount, + $row['discount'], + $row['discounttype'], + 1, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + $quantity -= 1; + if ($quantity < 0) $quantity = 0; + } + } + + /* any remaining quantity added without + grouping discount */ + if ($quantity > 0){ + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/PriceMethods/SplitABGroupPM.php b/pos/is4c-web/lib/Scanning/PriceMethods/SplitABGroupPM.php new file mode 100644 index 000000000..f854d550b --- /dev/null +++ b/pos/is4c-web/lib/Scanning/PriceMethods/SplitABGroupPM.php @@ -0,0 +1,230 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +/* Split AB Group PriceMethod module + + The same as AB, but the discount gets + split across two departments + + Splitting doesn't work with member/staff + sales (discount will still apply, just + not divided) + + This is pricemethod 3 in earlier WFC releases + and may not exist anywhere else. +*/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists('PriceMethod')) include($IS4C_PATH.'lib/Scanning/PriceMethod.php'); +if (!function_exists('addItem')) include($IS4C_PATH.'lib/additem.php'); +if (!function_exists('truncate2')) include($IS4C_PATH.'lib/lib.php'); + +class ABGroupPM extends PriceMethod { + + function addItem($row,$quantity,$priceObj){ + if ($quantity == 0) return false; + + $pricing = $priceObj->priceInfo($row,$quantity); + + $mixMatch = $row['mixmatchcode']; + /* group definition: number of items + that make up a group, price for a + full set. Use "special" rows if the + item is on sale */ + $groupQty = $row['quantity']; + $groupPrice = $row['groupprice']; + if ($priceObj->isSale()){ + $groupQty = $row['specialquantity']; + $groupPrice = $row['specialgroupprice']; + } + + /* not straight-up interchangable + * ex: buy item A, get $1 off item B + * need strict pairs AB + * + * type 3 tries to split the discount amount + * across A & B's departments; type 4 + * does not + */ + $qualMM = abs($mixMatch); + $discMM = -1*abs($mixMatch); + + // lookup existing qualifiers (i.e., item As) + // by-weight items are rounded down here + $q1 = "SELECT floor(sum(ItemQtty)),max(department) + FROM localtemptrans WHERE mixMatch='$qualMM' + and trans_status <> 'R'"; + $r1 = $dbt->query($q1); + $quals = 0; + $dept1 = 0; + if($dbt->num_rows($r1)>0){ + $rowq = $dbt->fetch_row($r1); + $quals = round($rowq[0]); + $dept1 = $rowq[1]; + } + + // lookup existing discounters (i.e., item Bs) + // by-weight items are counted per-line here + // + // extra checks to make sure the maximum + // discount on scale items is "free" + $q2 = "SELECT sum(CASE WHEN scale=0 THEN ItemQtty ELSE 1 END), + max(department),max(scale),max(total) FROM localtemptrans + WHERE mixMatch='$discMM' + and trans_status <> 'R'"; + $r2 = $dbt->query($q2); + $dept2 = 0; + $discs = 0; + $discountIsScale = false; + $scaleDiscMax = 0; + if($dbt->num_rows($r2)>0){ + $rowd = $dbt->fetch_row($r2); + $discs = round($rowd[0]); + $dept2 = $rowd[1]; + if ($rowd[2]==1) $discountIsScale = true; + $scaleDiscMax = $rowd[3]; + } + if ($quantity != (int)$quantity && $mixMatch < 0){ + $discountIsScale = true; + $scaleDiscMax = $quantity * $unitPrice; + } + + // items that have already been used in an AB set + $q3 = "SELECT sum(matched) FROM localtemptrans WHERE + mixmatch IN ('$qualMM','$discMM')"; + $r3 = $dbt->query($q3); + $matches = ($dbt->num_rows($r3)>0)?array_pop($dbt->fetch_array($r3)):0; + + // reduce totals by existing matches + // implicit: quantity required for B = 1 + // i.e., buy X item A save on 1 item B + $matches = $matches/$groupQty; + $quals -= $matches*($groupQty-1); + $discs -= $matches; + + // where does the currently scanned item go? + if ($mixMatch > 0){ + $quals = ($quals >0)?$quals+floor($quantity):floor($quantity); + $dept1 = $department; + } + else { + // again, scaled items count once per line + if ($quantity != (int)$quantity) + $discs = ($discs >0)?$discs+1:1; + else + $discs = ($discs >0)?$discs+$quantity:$quantity; + $dept2 = $department; + } + + // count up complete sets + $sets = 0; + while($discs > 0 && $quals >= ($volume-1) ){ + $discs -= 1; + $quals -= ($volume -1); + $sets++; + } + + if ($sets > 0){ + $maxDiscount = $sets*$groupPrice; + if ($scaleDiscMax != 0 && $maxDiscount > $scaleDiscMax) + $maxDiscount = $scaleDiscMax; + + // if the current item is by-weight, quantity + // decrement has to be corrected, but matches + // should still be an integer + $ttlMatches = $sets; + if($quantity != (int)$quantity) $sets = $quantity; + $quantity = $quantity - $sets; + + addItem($row['upc'], + $row['description'], + 'I', + '', + '', + $row['department'], + $sets, + $pricing['unitPrice'], + truncate2($sets*$pricing['unitPrice']), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + ($priceObj->isMemberSale() || $priceObj->isStaffSale()) ? truncate2($maxDiscount) : 0, + $row['discount'], + $row['discounttype'], + $sets, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + $ttlMatches * $groupQty, + 0, + (isset($row['cost']) ? $row['cost']*$new_sets*$groupQty : 0.00), + (isset($row['numflag']) ? $row['numflag'] : 0), + (isset($row['charflag']) ? $row['charflag'] : '') + ); + + if (!$priceObj->isMemberSale() && !$priceObj->isStaffSale()){ + additemdiscount($dept1,truncate2($maxDiscount/2.0)); + additemdiscount($dept2,truncate2($maxDiscount/2.0)); + } + } + + /* any remaining quantity added without + grouping discount */ + if ($quantity > 0){ + addItem($row['upc'], + $row['description'], + 'I', + ' ', + ' ', + $row['department'], + $quantity, + $pricing['unitPrice'], + truncate2($pricing['unitPrice'] * $quantity), + $pricing['regPrice'], + $row['scale'], + $row['tax'], + $row['foodstamp'], + 0, + 0, + $row['discount'], + $row['discounttype'], + $quantity, + ($priceObj->isSale() ? $row['specialpricemethod'] : $row['pricemethod']), + ($priceObj->isSale() ? $row['specialquantity'] : $row['quantity']), + ($priceObj->isSale() ? $row['specialgroupprice'] : $row['groupprice']), + $row['mixmatchcode'], + 0, + 0, + (isset($row['cost'])?$row['cost']*$quantity:0.00), + (isset($row['numflag'])?$row['numflag']:0), + (isset($row['charflag'])?$row['charflag']:'') + ); + } + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/SpecialUPC.php b/pos/is4c-web/lib/Scanning/SpecialUPC.php new file mode 100644 index 000000000..5f2c08425 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/SpecialUPC.php @@ -0,0 +1,37 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +class SpecialUPC { + +function is_special($upc){ + + return false; +} + +function handle($upc,$json){ + +} + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/SpecialUPCs/CouponCode.php b/pos/is4c-web/lib/Scanning/SpecialUPCs/CouponCode.php new file mode 100644 index 000000000..dddffdd27 --- /dev/null +++ b/pos/is4c-web/lib/Scanning/SpecialUPCs/CouponCode.php @@ -0,0 +1,213 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("SpecialUPC")) include($IS4C_PATH."lib/Scanning/SpecialUPC.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('pDataConnect')) include($IS4C_PATH."lib/connect.php"); +if (!function_exists('boxMsg')) include($IS4C_PATH."lib/drawscreen.php"); +if (!function_exists('lastpage')) include($IS4C_PATH."lib/listitems.php"); +if (!function_exists('truncate2')) include($IS4C_PATH."lib/lib.php"); +if (!function_exists('addcoupon')) include($IS4C_PATH."lib/additem.php"); + +class CouponCode extends SpecialUPC { + +var $ean; + + function is_special($upc){ + $this->ean = false; + if (substr($upc,0,3) == "005") + return true; + elseif (substr($upc,0,3) == "099"){ + $this->ean = true; + return true; + } + + return false; + } + + function handle($upc,$json){ + global $IS4C_LOCAL; + + $man_id = substr($upc, 3, 5); + $fam = substr($upc, 8, 3); + $val = substr($upc, -2); + + $db = pDataConnect(); + $query = "select Value,Qty from couponcodes where Code = '".$val."'"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) { + $json['output'] = boxMsg("coupon type unknown<br>please enter coupon<br>manually"); + return $json; + } + + $row = $db->fetch_array($result); + $value = $row["Value"]; + $qty = $row["Qty"]; + + if ($fam == "992") { + // 992 basically means blanket accept + // Old method of asking cashier to assign a department + // just creates confusion + // Instead I just try to guess, otherwise use zero + // (since that's what would happen anyway when the + // confused cashier does a generic coupon tender) + $value = truncate2($value); + $IS4C_LOCAL->set("couponupc",$upc); + $IS4C_LOCAL->set("couponamt",$value); + + $dept = 0; + $db = tDataConnect(); + $query = "select department from localtemptrans WHERE + substring(upc,4,5)='$man_id' group by department + order by count(*) desc"; + $result = $db->query($query); + if ($db->num_rows($result) > 0) + $dept = array_pop($db->fetch_row($result)); + + addcoupon($upc, $dept, $value); + $json['output'] = lastpage(); + return $json; + } + + // validate coupon + $db->close(); + $db = tDataConnect(); + $fam = substr($fam, 0, 2); + + /* the idea here is to track exactly which + items in the transaction a coupon was + previously applied to + */ + $query = "select max(t.unitPrice) as unitPrice, + max(t.department) as department, + max(t.ItemQtty) as itemQtty, + sum(case when c.quantity is null then 0 else c.quantity end) as couponQtty, + max(case when c.quantity is null then 0 else t.foodstamp end) as foodstamp, + max(t.emp_no) as emp_no, + max(t.trans_no) as trans_no, + t.trans_id from + localtemptrans as t left join couponApplied as c + on t.emp_no=c.emp_no and t.trans_no=c.trans_no + and t.trans_id=c.trans_id + where (substring(t.upc,4,5)='$man_id'"; + /* not right per the standard, but organic valley doesn't + * provide consistent manufacturer ids in the same goddamn + * coupon book */ + if ($this->ean) + $query .= " or substring(t.upc,3,5)='$man_id'"; + $query .= ") and t.trans_status <> 'C' + group by t.trans_id + order by t.unitPrice desc"; + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + /* no item w/ matching manufacturer */ + if ($num_rows == 0){ + $json['output'] = boxMsg("product not found<br />in transaction"); + return $json; + } + + /* count up per-item quantites that have not + yet had a coupon applied to them */ + $available = array(); + $emp_no=$transno=$dept=$foodstamp=-1; + $act_qty = 0; + while($row = $db->fetch_array($result)){ + if ($row["itemQtty"] - $row["couponQtty"] > 0){ + $id = $row["trans_id"]; + $available["$id"] = array(0,0); + $available["$id"][0] = $row["unitPrice"]; + $available["$id"][1] += $row["itemQtty"]; + $available["$id"][1] -= $row["couponQtty"]; + $act_qty += $available["$id"][1]; + } + if ($emp_no == -1){ + $emp_no = $row["emp_no"]; + $transno = $row["trans_no"]; + $dept = $row["department"]; + $foodstamp = $row["foodstamp"]; + } + } + + /* every line has maximum coupons applied */ + if (count($available) == 0) { + $json['output'] = boxMsg("Coupon already applied<br />for this item"); + return $json; + } + + /* insufficient number of matching items */ + if ($qty > $act_qty) { + $json['output'] = boxMsg("coupon requires ".$qty."items<br />there are only ".$act_qty." item(s)<br />in this transaction"); + return $json; + } + + + /* free item, multiple choices + needs work, obviously */ + if ($value == 0 && count($available) > 1){ + // decide which item(s) + // manually by cashier maybe? + } + + /* log the item(s) this coupon is + being applied to */ + $applied = 0; + foreach(array_keys($available) as $id){ + if ($value == 0) + $value = -1 * $available["$id"][0]; + if ($qty <= $available["$id"][1]){ + $q = "INSERT INTO couponApplied + (emp_no,trans_no,quantity,trans_id) + VALUES ( + $emp_no,$transno,$qty,$id)"; + $r = $db->query($q); + $applied += $qty; + } + else { + $q = "INSERT INTO couponApplied + (emp_no,trans_no,quantity,trans_id) + VALUES ( + $emp_no,$transno,". + $available["$id"][1].",$id)"; + $r = $db->query($q); + $applied += $available["$id"][1]; + } + + if ($applied >= $qty) break; + } + + $value = truncate2($value); + addcoupon($upc, $dept, $value, $foodstamp); + $json['output'] = lastpage(); + return $json; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/SpecialUPCs/HouseCoupon.php b/pos/is4c-web/lib/Scanning/SpecialUPCs/HouseCoupon.php new file mode 100644 index 000000000..3c5c866ef --- /dev/null +++ b/pos/is4c-web/lib/Scanning/SpecialUPCs/HouseCoupon.php @@ -0,0 +1,329 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("SpecialUPC")) include($IS4C_PATH."lib/Scanning/SpecialUPC.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists("boxMsg")) include($IS4C_PATH."lib/drawscreen.php"); +if (!function_exists("getsubtotals")) include($IS4C_PATH."lib/connect.php"); +if (!function_exists("lastpage")) include($IS4C_PATH."lib/listitems.php"); +if (!function_exists("addhousecoupon")) include($IS4C_PATH."lib/additem.php"); + +class HouseCoupon extends SpecialUPC { + + function is_special($upc){ + if (substr($upc,0,8) == "00499999") + return true; + + return false; + } + + function handle($upc,$json){ + global $IS4C_LOCAL; + + $coupID = ltrim(substr($upc,-5),"0"); + $leadDigits = substr($upc,3,5); + + /* make sure the coupon exists + * and isn't expired + */ + $db = pDataConnect(); + $infoQ = "select endDate,limit,discountType, department, + discountValue,minType,minValue,memberOnly, + case when endDate is NULL then 0 else + datediff(dd,getdate(),endDate) end as expired + from + houseCoupons where coupID=".$coupID; + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $infoQ = str_replace("dd,getdate(),endDate","endDate,now()",$infoQ); + $infoQ = str_replace("limit","`limit`",$infoQ); + } + $infoR = $db->query($infoQ); + if ($db->num_rows($infoR) == 0){ + $json['output'] = boxMsg("coupon not found"); + return $json; + } + $infoW = $db->fetch_row($infoR); + if ($infoW["expired"] < 0){ + $expired = substr($infoW["endDate"],0,strrpos($infoW["endDate"]," ")); + $json['output'] = boxMsg("coupon expired ".$expired); + return $json; + } + + /* check the number of times this coupon + * has been used in this transaction + * against the limit */ + $transDB = tDataConnect(); + $limitQ = "select case when sum(ItemQtty) is null + then 0 else sum(ItemQtty) end + from localtemptrans where + upc = '".$upc."'"; + $limitR = $transDB->query($limitQ); + $times_used = array_pop($transDB->fetch_row($limitR)); + if ($times_used >= $infoW["limit"]){ + $json['output'] = boxMsg("coupon already applied"); + return $json; + } + + /* check for member-only, tigher use tracking + available with member coupons */ + if ($infoW["memberOnly"] == 1 and + ($IS4C_LOCAL->get("memberID") == "0" or $IS4C_LOCAL->get("isMember") != 1) + ){ + $json['output'] = boxMsg("Member only coupon<br>Apply member number first"); + return $json; + } + else if ($infoW["memberOnly"] == 1 && $IS4C_LOCAL->get("standalone")==0){ + $mDB = mDataConnect(); + $mR = $mDB->query("SELECT quantity FROM houseCouponThisMonth + WHERE card_no=".$IS4C_LOCAL->get("memberID")." and + upc='$upc'"); + if ($mDB->num_rows($mR) > 0){ + $uses = array_pop($mDB->fetch_row($mR)); + if ($infoW["limit"] >= $uses){ + $json['output'] = boxMsg("Coupon already used<br />on this membership"); + return $json; + } + } + } + + /* verify the minimum purchase has been made */ + switch($infoW["minType"]){ + case "Q": // must purchase at least X + $minQ = "select case when sum(ItemQtty) is null + then 0 else sum(ItemQtty) end + from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $minQ = str_replace("dbo.","",$minQ); + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty < $infoW["minValue"]){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case "Q+": // must purchase more than X + $minQ = "select case when sum(ItemQtty) is null + then 0 else sum(ItemQtty) end + from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $minQ = str_replace("dbo.","",$minQ); + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty <= $infoW["minValue"]){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case 'D': // must at least purchase from department + $minQ = "select case when sum(total) is null + then 0 else sum(total) end + from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $minQ = str_replace("dbo.","",$minQ); + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty < $infoW["minValue"]){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case 'D+': // must more than purchase from department + $minQ = "select case when sum(total) is null + then 0 else sum(total) end + from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $minQ = str_replace("dbo.","",$minQ); + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + if ($validQtty <= $infoW["minValue"]){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case 'M': // must purchase at least X qualifying items + // and some quantity corresponding discount items + $minQ = "select case when sum(ItemQtty) is null then 0 else + sum(ItemQtty) end + from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=$coupID + and h.type = 'QUALIFIER'"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $minQ = str_replace("dbo.","",$minQ); + $minR = $transDB->query($minQ); + $validQtty = array_pop($transDB->fetch_row($minR)); + + $min2Q = "select case when sum(ItemQtty) is null then 0 else + sum(ItemQtty) end + from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=$coupID + and h.type = 'DISCOUNT'"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $min2Q = str_replace("dbo.","",$min2Q); + $min2R = $transDB->query($min2Q); + $validQtty2 = array_pop($transDB->fetch_row($min2R)); + + if ($validQtty < $infoW["minValue"] || $validQtty2 <= 0){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case '$': // must purchase at least $ total items + $minQ = "SELECT sum(total) FROM localtemptrans + WHERE trans_type IN ('I','D','M')"; + $minR = $transDB->query($minQ); + $validAmt = array_pop($transDB->fetch_row($minR)); + if ($validAmt < $infoW["minValue"]){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case '$+': // must purchase more than $ total items + $minQ = "SELECT sum(total) FROM localtemptrans + WHERE trans_type IN ('I','D','M')"; + $minR = $transDB->query($minQ); + $validAmt = array_pop($transDB->fetch_row($minR)); + if ($validAmt <= $infoW["minValue"]){ + $json['output'] = boxMsg("coupon requirements not met"); + return $json; + } + break; + case '': // no minimum + case ' ': + break; + default: + $json['output'] = boxMsg("unknown minimum type ".$infoW["minType"]); + return $json; + } + + /* if we got this far, the coupon + * should be valid + */ + $value = 0; + switch($infoW["discountType"]){ + case "Q": // quantity discount + // discount = coupon's discountValue + // times the cheapeast coupon item + $valQ = "select unitPrice, department from localtemptrans + as l left join opData.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total >0 + order by unitPrice asc"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $valQ = str_replace("dbo.","",$valQ); + $valR = $transDB->query($valQ); + $valW = $transDB->fetch_row($valR); + $value = $valW[0]*$infoW["discountValue"]; + break; + case "P": // discount price + // query to get the item's department and current value + // current value minus the discount price is how much to + // take off + $value = $infoW["discountValue"]; + $deptQ = "select department,(total/quantity) as value from localtemptrans + as l left join opdata.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total >0 + order by unitPrice asc"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $deptQ = str_replace("dbo.","",$deptQ); + $deptR = $transDB->query($deptQ); + $row = $transDB->fetch_row($deptR); + $value = $row[1] - $value; + break; + case "FD": // flat discount for departments + // simply take off the requested amount + // scales with quantity for by-weight items + $value = $infoW["discountValue"]; + $valQ = "select department,quantity from localtemptrans + as l left join opdata.dbo.houseCouponItems + as h on l.department = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total > 0 + order by unitPrice asc"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $valQ = str_replace("dbo.","",$valQ); + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = $row[1] * $value; + break; + case "FI": // flat discount for items + // simply take off the requested amount + // scales with quantity for by-weight items + $value = $infoW["discountValue"]; + $valQ = "select l.upc,quantity from localtemptrans + as l left join opdata.dbo.houseCouponItems + as h on l.upc = h.upc + where h.coupID=".$coupID." + and h.type in ('BOTH','DISCOUNT') + and l.total > 0 + order by unitPrice asc"; + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $valQ = str_replace("dbo.","",$valQ); + $valR = $transDB->query($valQ); + $row = $transDB->fetch_row($valR); + $value = $row[1] * $value; + break; + case "F": // completely flat; no scaling for weight + $value = $infoW["discountValue"]; + break; + case "%": // percent discount on all items + getsubtotals(); + $value = $infoW["discountValue"]*$IS4C_LOCAL->get("discountableTotal"); + break; + } + + $dept = $infoW["department"]; + + addhousecoupon($upc,$dept,-1*$value); + $json['output'] = lastpage(); + return $json; + } + +} + +?> diff --git a/pos/is4c-web/lib/Scanning/SpecialUPCs/MagicPLU.php b/pos/is4c-web/lib/Scanning/SpecialUPCs/MagicPLU.php new file mode 100644 index 000000000..1e7b0e30a --- /dev/null +++ b/pos/is4c-web/lib/Scanning/SpecialUPCs/MagicPLU.php @@ -0,0 +1,73 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("SpecialUPC")) include($IS4C_PATH."lib/Scanning/SpecialUPC.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('boxMsg')) include($IS4C_PATH."lib/drawscreen.php"); + +class MagicPLU extends SpecialUPC { + + function is_special($upc){ + if ($upc == "0000000008005" || $upc == "0000000008006") + return true; + + return false; + } + + function handle($upc,$json){ + global $IS4C_LOCAL,$IS4C_PATH; + + switch(ltrim($upc,'0')){ + case '8006': + if ($IS4C_LOCAL->get("memberID") == 0) + $json['main_frame'] = $IS4C_PATH.'gui-modules/memlist.php'; + else if ($IS4C_LOCAL->get("msgrepeat") == 0){ + $IS4C_LOCAL->set("endorseType","stock"); + $IS4C_LOCAL->set("tenderamt",$total); + $IS4C_LOCAL->set("boxMsg","<B>".$total." stock payment</B><BR>insert form<BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"); + $ret["main_frame"] = $IS4C_PATH."gui-modules/boxMsg2.php"; + } + break; + case '8005': + if ($IS4C_LOCAL->get("memberID") == 0) + $json['main_frame'] = $IS4C_PATH.'gui-modules/memlist.php'; + elseif ($IS4C_LOCAL->get("isMember") == 0) + $json['output'] = boxMsg("<br />member discount not applicable"); + elseif ($IS4C_LOCAL->get("percentDiscount") > 0) + $json['output'] = boxMsg($IS4C_LOCAL->get("percentDiscount")."% discount already applied"); + break; + } + + // magic plu, but other conditions not matched + if ($json['main_frame'] === false && empty($json['output'])) + $json['output'] = boxMsg($upc."<br />is not a valid item"); + + return $json; + } +} + +?> diff --git a/pos/is4c-web/lib/Scanning/SpecialUPCs/MemberCard.php b/pos/is4c-web/lib/Scanning/SpecialUPCs/MemberCard.php new file mode 100644 index 000000000..9aff7b78d --- /dev/null +++ b/pos/is4c-web/lib/Scanning/SpecialUPCs/MemberCard.php @@ -0,0 +1,67 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("SpecialUPC")) include($IS4C_PATH."lib/Scanning/SpecialUPC.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +if (!function_exists('pDataConnect')) include($IS4C_PATH."lib/connect.php"); +if (!function_exists('boxMsg')) include($IS4C_PATH."lib/drawscreen.php"); +if (!function_exists('memberID')) include($IS4C_PATH."lib/prehkeys.php"); + +class MemberCard extends SpecialUPC { + + function is_special($upc){ + if (substr($upc,0,7) == "0042363") + return true; + + return false; + } + + function handle($upc,$json){ + global $IS4C_LOCAL,$IS4C_PATH; + + $db = pDataConnect(); + $query = "select card_no from memberCards where upc='$upc'"; + $result = $db->query($query); + + if ($db->num_rows($result) < 1){ + if ($IS4C_LOCAL->get("standalone") == 1){ + $json['output'] = boxMsg("Can't assign new cards<br />in standalone"); + } + else { + $json['main_frame'] = $IS4C_PATH.'gui-modules/AssignMemCard.php?upc='.$upc; + } + return $json; + } + + $row = $db->fetch_array($result); + $IS4C_LOCAL->set("memberCardUsed",1); + $json = memberID($row[0]); + return $json; + } +} + +?> diff --git a/pos/is4c-web/lib/additem.php b/pos/is4c-web/lib/additem.php new file mode 100644 index 000000000..4b37c2efd --- /dev/null +++ b/pos/is4c-web/lib/additem.php @@ -0,0 +1,497 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +/*------------------------------------------------------------------------------ +additem.php is called by the following files: + +as include: + login3.php + authenticate3.php + prehkeys.php + upcscanned.php + authenticate.php + +additem.php is the bread and butter of IS4C. addItem inserts the information +stream for each item scanned, entered or transaction occurence into localtemptrans. +Each of the above follows the following structure for entry into localtemptrans: + $strupc, + $strdescription, + $strtransType, + $strtranssubType, + $strtransstatus, + $intdepartment, + $dblquantity, + $dblunitPrice, + $dbltotal, + $dblregPrice, + $intscale, + $inttax, + $intfoodstamp, + $dbldiscount, + $dblmemDiscount, + $intdiscountable, + $intdiscounttype, + $dblItemQtty, + $intvolDiscType, + $intvolume, + $dblVolSpecial, + $intmixMatch, + $intmatched, + $intvoided + +Additionally, additem.php inserts entries into the activity log when a cashier +signs in +-------------------------------------------------------------------------------*/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); +if (!function_exists("nullwrap")) include($IS4C_PATH."lib/lib.php"); +if (!function_exists("checkLogin")) include($IS4C_PATH."auth/login.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +//-------insert line into localtemptrans with standard insert string-------------- +function addItem($strupc, $strdescription, $strtransType, $strtranssubType, $strtransstatus, $intdepartment, $dblquantity, $dblunitPrice, $dbltotal, $dblregPrice, $intscale, $inttax, $intfoodstamp, $dbldiscount, $dblmemDiscount, $intdiscountable, $intdiscounttype, $dblItemQtty, $intvolDiscType, $intvolume, $dblVolSpecial, $intmixMatch, $intmatched, $intvoided, $cost=0, $numflag=0, $charflag='') { + global $IS4C_LOCAL; + //$dbltotal = truncate2(str_replace(",", "", $dbltotal)); replaced by apbw 7/27/05 with the next 4 lines -- to fix thousands place errors + + $dbltotal = str_replace(",", "", $dbltotal); + $dbltotal = number_format($dbltotal, 2, '.', ''); + $dblunitPrice = str_replace(",", "", $dblunitPrice); + $dblunitPrice = number_format($dblunitPrice, 2, '.', ''); + + $intregisterno = $IS4C_LOCAL->get("laneno"); + + $name = checkLogin(); + if (!$name) return False; + $intempno = getUID($name); + if (!$intempno) return False; + $owner = getOwner($name); + $memType = 0; + $staff = 0; + if ($owner !== False && $owner != 0){ + $memType=1; + } + else { + $owner = $IS4C_LOCAL->get("defaultNonMem"); + if ($strtransType == 'I'){ + // this is handled fine in addUPC + //$dblunitPrice += $memDiscount; + //$dbltotal += ($quantity*$memDiscount); + } + } + $strCardNo = $owner; + + $inttransno = gettransno($intempno); + + $db = tDataConnect(); + + $datetimestamp = ""; + if ($IS4C_LOCAL->get("DBMS") == "mssql") { + $datetimestamp = strftime("%m/%d/%y %H:%M:%S %p", time()); + } else { + $datetimestamp = strftime("%Y-%m-%d %H:%M:%S", time()); + } + + $values = array( + 'datetime' => $datetimestamp, + 'register_no' => $intregisterno, + 'emp_no' => $intempno, + 'trans_no' => nullwrap($inttransno), + 'upc' => nullwrap($strupc), + 'description' => $strdescription, + 'trans_type' => nullwrap($strtransType), + 'trans_subtype' => nullwrap($strtranssubType), + 'trans_status' => nullwrap($strtransstatus), + 'department' => nullwrap($intdepartment), + 'quantity' => nullwrap($dblquantity), + 'cost' => nullwrap($cost), + 'unitPrice' => nullwrap($dblunitPrice), + 'total' => nullwrap($dbltotal), + 'regPrice' => nullwrap($dblregPrice), + 'scale' => nullwrap($intscale), + 'tax' => nullwrap($inttax), + 'foodstamp' => nullwrap($intfoodstamp), + 'discount' => nullwrap($dbldiscount), + 'memDiscount' => nullwrap($dblmemDiscount), + 'discountable' => nullwrap($intdiscountable), + 'discounttype' => nullwrap($intdiscounttype), + 'ItemQtty' => nullwrap($dblItemQtty), + 'volDiscType' => nullwrap($intvolDiscType), + 'volume' => nullwrap($intvolume), + 'VolSpecial' => nullwrap($dblVolSpecial), + 'mixMatch' => nullwrap($intmixMatch), + 'matched' => nullwrap($intmatched), + 'voided' => nullwrap($intvoided), + 'memType' => nullwrap($memType), + 'staff' => nullwrap($staff), + 'numflag' => nullwrap($numflag), + 'charflag' => $charflag, + 'card_no' => (string)$strCardNo + ); + if ($IS4C_LOCAL->get("DBMS") == "mssql" && $IS4C_LOCAL->get("store") == "wfc"){ + unset($values["staff"]); + $values["isStaff"] = nullwrap($staff); + } + + $db->smart_insert("localtemptrans",$values); + + $IS4C_LOCAL->set("toggletax",0); + $IS4C_LOCAL->set("togglefoodstamp",0); + + return True; +} + +//________________________________end addItem() + + +// add item by upc +// essentially an extremely pared-down version of upcscanned +function addUPC($upc,$quantity=1.0){ + global $IS4C_LOCAL; + + $db = pDataConnect(); + $upc = $db->escape($upc); + $query = "SELECT description, department, normal_price, special_price, pricemethod, specialpricemethod, + tax, foodstamp, scale, discount, discounttype, cost, local FROM products + WHERE upc='$upc'"; + $result = $db->query($query); + if ($db->num_rows($result) == 0) return False; + + $row = $db->fetch_row($result); + + // keep to simple sales + if ($row['discounttype'] == 0 && $row['pricemethod'] != 0) + return False; + elseif($row['discounttype'] != 0 && $row['specialpricemethod'] != 0) + return False; + + $regPrice = $row['normal_price']; + $unitPrice = $row['normal_price']; + $discount = 0; + $memDiscount = 0; + switch($row['discounttype']){ + case 1: + $discount = $row['normal_price'] - $row['special_price']; + $unitPrice -= $discount; + break; + case 2: + if (getOwner(checkLogin())) + $memDiscount = $row['normal_price'] - $row['special_price']; + $unitPrice -= $memDiscount; + break; + } + + return addItem($upc, $row['description'], 'I', '', '', $row['department'], $quantity, + $unitPrice, $unitPrice*$quantity, $regPrice, $row['scale'], $row['tax'], + $row['foodstamp'], $discount, $memDiscount, $row['discount'], + $row['discounttype'], $quantity, 0, 0, 0.00, 0, 0, 0, $row['cost'], + $row['local'], ''); +} + +//---------------------------------- insert tax line item -------------------------------------- + +function addtax($amt) { + addItem("TAX", "Tax", "A", "", "", 0, 0, 0, $amt, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//________________________________end addtax() + + +//---------------------------------- insert tender line item ----------------------------------- + +function addtender($strtenderdesc, $strtendercode, $dbltendered) { + addItem("", $strtenderdesc, "T", $strtendercode, "", 0, 0, 0, $dbltendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//_______________________________end addtender() + + +function addcomment($comment) { + if (strlen($comment) > 30) + $comment = substr($comment,0,30); + addItem("",$comment, "C", "CM", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + + +//--------------------------------- insert change line item ------------------------------------ + +function addchange($dblcashreturn) { + addItem("", "Change", "T", "CA", "", 0, 0, 0, $dblcashreturn, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addchange() + + +//-------------------------------- insert foods stamp change item ------------------------------ + +function addfsones($intfsones) { + addItem("", "FS Change", "T", "FS", "", 0, 0, 0, $intfsones, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8); +} + +//_______________________________end addfsones() + +function addEndofShift() { + addItem("ENDOFSHIFT", "End of Shift", "S", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +} + +//-------------------------------- insert deli discount (Wedge specific) ----------------------- + +function addscDiscount() { + global $IS4C_LOCAL; + + if ($IS4C_LOCAL->get("scDiscount") != 0) { + addItem("DISCOUNT", "** 10% Deli Discount **", "I", "", "", 0, 1, truncate2(-1 * $IS4C_LOCAL->get("scDiscount")), truncate2(-1 * $IS4C_LOCAL->get("scDiscount")), 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2); + } +// addStaffCoffeeDiscount(); + +} + +function addStaffCoffeeDiscount() { + global $IS4C_LOCAL; + + if ($IS4C_LOCAL->get("staffCoffeeDiscount") != 0) { + addItem("DISCOUNT", "** Coffee Discount **", "I", "", "", 0, 1, truncate2(-1 * $IS4C_LOCAL->get("staffCoffeeDiscount")), truncate2(-1 * $IS4C_LOCAL->get("staffCoffeeDiscount")), 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2); + } +} + +//_______________________________end addscDiscount() + + +//------------------------------- insert discount line ----------------------------------------- + +/***** jqh 09/29/05 changed adddiscount function to write the department to localtemptrans *****/ +function adddiscount($dbldiscount,$department) { + $strsaved = "** YOU SAVED $".truncate2($dbldiscount)." **"; + addItem("", $strsaved, "I", "", "D", $department, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2); +} + +//_____________________________end adddiscount() + + +//------------------------------ insert Food Stamp Tax Exempt line ----------------------------- + + +function addfsTaxExempt() { + global $IS4C_LOCAL; + + getsubtotals(); + addItem("FS Tax Exempt", " Fs Tax Exempt ", "C", "", "D", 0, 0, $IS4C_LOCAL->get("fsTaxExempt"), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17); +} + +//_____________________________end addfsTaxExempt() + + +//------------------------------ insert 'discount applied' line -------------------------------- + +function discountnotify($strl) { + if ($strl == 10.01) { + $strL = 10; + } + addItem("", "** ".$strl."% Discount Applied **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4); +} + +//_____________________________end discountnotify() + + +//------------------------------- insert discount line ----------------------------------------- + +//------------------------------- insert tax exempt statement line ----------------------------- + +function addTaxExempt() { + global $IS4C_LOCAL; + + addItem("", "** Order is Tax Exempt **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + $IS4C_LOCAL->set("TaxExempt",1); + setglobalvalue("TaxExempt", 1); +} + +//_____________________________end addTaxExempt() + + +//------------------------------ insert reverse tax exempt statement --------------------------- + +function reverseTaxExempt() { + global $IS4C_LOCAL; + addItem("", "** Tax Exemption Reversed **", "", "", "D", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + $IS4C_LOCAL->set("TaxExempt",0); + setglobalvalue("TaxExempt", 0); +} + +//_____________________________end reverseTaxExempt() + +//------------------------------ insert case discount statement -------------------------------- + +function addcdnotify() { + global $IS4C_LOCAL; + addItem("", "** ".$IS4C_LOCAL->get("casediscount")."% Case Discount Applied", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); +} + +//____________________________end addcdnotify() + +//------------------------------ insert manufacturer coupon statement -------------------------- + +function addCoupon($strupc, $intdepartment, $dbltotal, $foodstamp=0) { + addItem($strupc, " * Manufacturers Coupon", "I", "CP", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, $foodstamp, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +function addhousecoupon($strupc, $intdepartment, $dbltotal) { + addItem($strupc, " * WFC Coupon", "I", "IC", "C", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +function additemdiscount($intdepartment, $dbltotal) { + $dbltotal *= -1; + addItem('ITEMDISCOUNT'," * Item Discount", "I", "", "", $intdepartment, 1, $dbltotal, $dbltotal, $dbltotal, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + + +//___________________________end addCoupon() + +//------------------------------ insert tare statement ----------------------------------------- + +function addTare($dbltare) { + global $IS4C_LOCAL; + $IS4C_LOCAL->set("tare",$dbltare/100); + addItem("", "** Tare Weight ".$IS4C_LOCAL->get("tare")." **", "", "", "D", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6); +} + +//___________________________end addTare() + + +//------------------------------- insert MAD coupon statement (WFC specific) ------------------- + +function addMadCoup() { + global $IS4C_LOCAL; + + $madCoup = -1 * $IS4C_LOCAL->get("madCoup"); + addItem("MAD Coupon", "Member Appreciation Coupon", "I", "CP", "C", 0, 1, $madCoup, $madCoup, $madCoup, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 17); + +} + +function addVirtualCoupon($id){ + global $IS4C_LOCAL; + $sql = pDataConnect(); + $fetchQ = "select name,type,value,max from VirtualCoupon WHERE flag=$id"; + $fetchR = $sql->query($fetchQ); + $coupW = $sql->fetch_row($fetchR); + + $val = (double)$coupW["value"]; + $limit = (double)$coupW["max"]; + $type = $coupW["type"]; + $desc = substr($coupW["name"],0,35); + switch(strtoupper($type)){ + case 'PERCENT': + $val = $val * $IS4C_LOCAL->get("discountableTotal"); + break; + } + if ($limit != 0 && $val > $limit) + $val = $limit; + $val *= -1; + $upc = str_pad($id,13,'0',STR_PAD_LEFT); + + addItem($upc, $desc, "I", "CP", "C", 0, 1, $val, $val, $val, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + + +//___________________________end addMadCoupon() + +function addDeposit($quantity, $deposit, $foodstamp) { + + $total = $quantity * $deposit; + $chardeposit = 100 * $deposit; + if($foodstamp == 1){ // ACG HARDCODED DEPARTMENTS.... + $dept = 43; + }else{ + $dept = 42; + } + addItem("DEPOSIT" * $chardeposit, "Deposit", "I", "", "", $dept, $quantity, $deposit, $total, $deposit, 0, 0, $foodstamp, 0, 0, 0, 0, $quantity, 0, 0, 0, 0, 0, 0); + +} + +// ----------------------------- insert transaction discount ----------------------------------- + +function addtransDiscount() { + global $IS4C_LOCAL; + addItem("DISCOUNT", "Discount", "I", "", "", 0, 1, truncate2(-1 * $IS4C_LOCAL->get("transDiscount")), truncate2(-1 * $IS4C_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); +} + +// ---------------------------- insert stamp in activitytemplog -------------------------------- + +function addactivity($activity) { + global $IS4C_LOCAL; + + $timeNow = time(); + + if ($IS4C_LOCAL->get("CashierNo") > 0 && $IS4C_LOCAL->get("CashierNo") < 256) { + $intcashier = $IS4C_LOCAL->get("CashierNo"); + } + else { + $intcashier = 0; + } + + if ($IS4C_LOCAL->get("DBMS") == "mssql") { + $strqtime = "select max(datetime) as maxDateTime, getdate() as rightNow from activitytemplog"; + } else { + $strqtime = "select max(datetime) as maxDateTime, now() as rightNow from activitytemplog"; + } + + + $db = tDataConnect(); + $result = $db->query($strqtime); + + + $row = $db->fetch_array($result); + + if (!$row || !$row[0]) { + + $interval = 0; + } + else { + + $interval = strtotime($row["rightNow"]) - strtotime($row["maxDateTime"]); + } + + //$_SESSION["datetimestamp"] = strftime("%Y-%m-%d %H:%M:%S", $timeNow); + $datetimestamp = strftime("%Y-%m-%d %H:%M:%S", $timeNow); + + $values = array( + 'datetime' => nullwrap($datetimestamp), + 'LaneNo' => nullwrap($IS4C_LOCAL->get("laneno")), + 'CashierNo' => nullwrap($intcashier), + 'TransNo' => nullwrap($IS4C_LOCAL->get("transno")), + 'Activity' => nullwrap($activity), + 'Interval' => nullwrap($interval) + ); + if ($IS4C_LOCAL->get("DBMS")=="mysql"){ + unset($values['Interval']); + $values['`Interval`'] = nullwrap($interval); + } + $result = $db->smart_insert("activitytemplog",$values); + + $db->close(); + +} + +// ------------------------------------------------------------------------ + + +?> diff --git a/pos/is4c-web/lib/array_to_json.php b/pos/is4c-web/lib/array_to_json.php new file mode 100644 index 000000000..a31928738 --- /dev/null +++ b/pos/is4c-web/lib/array_to_json.php @@ -0,0 +1,62 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op. + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +function array_to_json($arr){ + $ret = "["; + for($i=0;$i<count($arr);$i++){ + if (isset($arr[$i])) + $ret .= encode_value_json($arr[$i]).","; + else { + $ret = ""; + break; // not a numeric indexed array + } + } + if (!empty($ret)){ + $ret = substr($ret,0,strlen($ret)-1)."]"; + return $ret; + } + + $ret = "{"; + foreach($arr as $k=>$v){ + $ret .= '"'.$k.'":'; + $ret .= encode_value_json($v).","; + } + $ret = substr($ret,0,strlen($ret)-1)."}"; + return $ret; +} + +function encode_value_json($val){ + if (is_array($val)) return array_to_json($val); + if (is_numeric($val)) return $val; + if ($val === true) return 'true'; + if ($val === false) return 'false'; + else return '"'.addcslashes($val,"\\\"\r\n\t").'"'; +} + +function fixstring($str){ + $str = str_replace("\n","",$str); + $str = str_replace("\r","",$str); + $str = str_replace("\t","",$str); +} + +?> diff --git a/pos/is4c-web/lib/authenticate.php b/pos/is4c-web/lib/authenticate.php new file mode 100644 index 000000000..ffed5f164 --- /dev/null +++ b/pos/is4c-web/lib/authenticate.php @@ -0,0 +1,195 @@ +<?php +/******************************************************************************* + + Copyright 2010 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +// session_cache_limiter('nocache'); +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +include($IS4C_PATH."ini.php"); +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); +if (!function_exists("addactivity")) include($IS4C_PATH."lib/additem.php"); +if (!function_exists("memberID")) include($IS4C_PATH."lib/prehkeys.php"); +if (!function_exists("rePoll")) include($IS4C_PATH."lib/lib.php"); +if (!function_exists("drawerKick")) include($IS4C_PATH."lib/printLib.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function authenticate($password,$activity=1){ + global $IS4C_LOCAL; + + $IS4C_LOCAL->set("away",1); + rePoll(); + $IS4C_LOCAL->set("training",0); + + $password = strtoupper($password); + $password = str_replace("'", "", $password); + $password = str_replace(",", "", $password); + $paswword = str_replace("+", "", $password); + + if ($password == "TRAINING") $password = 9999; // if password is training, change to '9999' + + if (!is_numeric($password)) return False; // if password is non-numeric, not a valid password + elseif ($password > 9999 || $password < 1) return False; // if password is greater than 4 digits or less than 1, not a valid password + + $query_g = "select LoggedIn,CashierNo from globalvalues"; + $db_g = pDataConnect(); + $result_g = $db_g->query($query_g); + $row_g = $db_g->fetch_array($result_g); + + if ($row_g["LoggedIn"] == 0) { + $query_q = "select emp_no, FirstName, LastName from employees where EmpActive = 1 " + ."and CashierPassword = ".$password; + $db_q = pDataConnect(); + $result_q = $db_q->query($query_q); + $num_rows_q = $db_q->num_rows($result_q); + + if ($num_rows_q > 0) { + $row_q = $db_q->fetch_array($result_q); + + testremote(); + + setglobalvalue("CashierNo", $row_q["emp_no"]); + setglobalvalue("Cashier", $row_q["FirstName"]." ".substr($row_q["LastName"], 0, 1)."."); + + loadglobalvalues(); + + $transno = gettransno($row_q["emp_no"]); + $IS4C_LOCAL->set("transno",$transno); + setglobalvalue("TransNo", $transno); + setglobalvalue("LoggedIn", 1); + + if ($transno == 1) addactivity($activity); + + } elseif ($password == 9999) { + setglobalvalue("CashierNo", 9999); + setglobalvalue("Cashier", "Training Mode"); + $transno = gettransno(9999); + $IS4C_LOCAL->set("transno",$transno); + setglobalvalue("TransNo", $transno); + setglobalvalue("LoggedIn", 1); + loadglobalvalues(); + $IS4C_LOCAL->set("training",1); + } + else return False; + } + else { + // longer query but simpler. since someone is logged in already, + // only accept password from that person OR someone with a high + // frontendsecurity setting + $query_a = "select emp_no, FirstName, LastName " + ."from employees " + ."where EmpActive = 1 and " + ."(frontendsecurity >= 30 or emp_no = ".$row_g["CashierNo"].") " + ."and (CashierPassword = '".$password."' or AdminPassword = '".$password."')"; + + $db_a = pDataConnect(); + $result_a = $db_a->query($query_a); + + $num_rows_a = $db_a->num_rows($result_a); + + $db_a->db_close(); + + if ($num_rows_a > 0) { + + loadglobalvalues(); + + testremote(); + } + elseif ($row_g["CashierNo"] == "9999" && $password == "9999"){ + loadglobalvalues(); + testremote(); + $IS4C_LOCAL->set("training",1); + } + else return False; + } + + $db_g->db_close(); + + // this is should really be placed more logically... andy + customreceipt(); + + if ($IS4C_LOCAL->get("LastID") != 0 && $IS4C_LOCAL->get("memberID") != "0" && $IS4C_LOCAL->get("memberID") != "") { + $IS4C_LOCAL->set("unlock",1); + memberID($IS4C_LOCAL->get("memberID")); + } + $IS4C_LOCAL->set("inputMasked",0); + + return True; +} + +function nsauthenticate($password){ + global $IS4C_LOCAL; + $IS4C_LOCAL->set("away",1); + + $password = strtoupper(trim($password)); + if ($password == "TRAINING") + $password = 9999; + + if (!is_numeric($password)) + return False; + elseif ($password > "9999" || $password < "1") + return False; + elseif (empty($password)) + return False; + + $db = pDataConnect(); + $query2 = "select emp_no, FirstName, LastName from employees where empactive = 1 and " + ."frontendsecurity >= 11 and (cashierpassword = ".$password." or adminpassword = " + .$password.")"; + $result2 = $db->query($query2); + $num_row2 = $db->num_rows($result2); + + if ($num_row2 > 0) { + drawerKick(); + return True; + } + return False; +} + + +/* fetch customer receipt header & footer lines + * use to be in ini.php and on the remote DB, doesn't + * belong on either */ +function customreceipt(){ + global $IS4C_LOCAL; + + $db = pDataConnect(); + $headerQ = "select text from customReceipt where type='header' order by seq"; + $headerR = $db->query($headerQ); + $IS4C_LOCAL->set("receiptHeaderCount",$db->num_rows($headerR)); + for ($i = 1; $i <= $IS4C_LOCAL->get("receiptHeaderCount"); $i++){ + $headerW = $db->fetch_array($headerR); + $IS4C_LOCAL->set("receiptHeader$i",$headerW[0]); + } + $footerQ = "select text from customReceipt where type='footer' order by seq"; + $footerR = $db->query($footerQ); + $IS4C_LOCAL->set("receiptFooterCount",$db->num_rows($footerR)); + + for ($i = 1; $i <= $IS4C_LOCAL->get("receiptFooterCount"); $i++){ + $footerW = $db->fetch_array($footerR); + $IS4C_LOCAL->set("receiptFooter$i",$footerW[0]); + } + + $db->db_close(); +} + +?> diff --git a/pos/is4c-web/lib/clientscripts.php b/pos/is4c-web/lib/clientscripts.php new file mode 100644 index 000000000..ede628d39 --- /dev/null +++ b/pos/is4c-web/lib/clientscripts.php @@ -0,0 +1,42 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function boxMsgscreen() { + global $IS4C_PATH; + changeCurrentPageJS("{$IS4C_PATH}gui-modules/boxMsg2.php"); +} + + +function receipt($arg) { + global $IS4C_LOCAL,$IS4C_PATH; + $IS4C_LOCAL->set("receiptType",$arg); + echo "<script type=\"text/javascript\">\n"; + echo "window.top.end.location = '{$IS4C_PATH}end.php';\n"; + echo "</script>\n"; +} + +?> diff --git a/pos/is4c-web/lib/connect.php b/pos/is4c-web/lib/connect.php new file mode 100644 index 000000000..194aa7f88 --- /dev/null +++ b/pos/is4c-web/lib/connect.php @@ -0,0 +1,355 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!class_exists("SQLManager")) include($IS4C_PATH."lib/SQLManager.php"); + +if (!function_exists("setglobalflags")) include($IS4C_PATH."lib/loadconfig.php"); +if (!function_exists("pinghost")) include($IS4C_PATH."lib/lib.php"); +if (!function_exists("wmdiscount")) include($IS4C_PATH."lib/prehkeys.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + + +/*********************************************************************************************** + + Functions transcribed from connect.asp on 07.13.03 by Brandon. + +***********************************************************************************************/ + + + +function tDataConnect() +{ + global $IS4C_LOCAL; + + $sql = new SQLManager($IS4C_LOCAL->get("localhost"),$IS4C_LOCAL->get("DBMS"),$IS4C_LOCAL->get("tDatabase"), + $IS4C_LOCAL->get("localUser"),$IS4C_LOCAL->get("localPass"),False); + $sql->query("SET time_zone='America/Chicago'"); + return $sql; +} + +function pDataConnect() +{ + global $IS4C_LOCAL; + + $sql = new SQLManager($IS4C_LOCAL->get("localhost"),$IS4C_LOCAL->get("DBMS"),$IS4C_LOCAL->get("pDatabase"), + $IS4C_LOCAL->get("localUser"),$IS4C_LOCAL->get("localPass"),False); + $sql->query("SET time_zone='America/Chicago'"); + return $sql; +} + +function mDataConnect() +{ + global $IS4C_LOCAL; + + $sql = new SQLManager($IS4C_LOCAL->get("mServer"),$IS4C_LOCAL->get("mDBMS"),$IS4C_LOCAL->get("mDatabase"), + $IS4C_LOCAL->get("mUser"),$IS4C_LOCAL->get("mPass"),False); + return $sql; +} + +// ----------getsubtotals()---------- + +// getsubtotals() updates the values held in our session variables. + +function getsubtotals() { + global $IS4C_LOCAL; + + $query = "SELECT * FROM subtotals"; + $connection = tDataConnect(); + $result = $connection->query($query); + $row = $connection->fetch_array($result); + + // reset a few variables + if (False && (!$row || $row["LastID"] == 0)) { + $IS4C_LOCAL->set("ttlflag",0); + $IS4C_LOCAL->set("fntlflag",0); + setglobalflags(0); + } + + $IS4C_LOCAL->set("LastID", (!$row || !isset($row['LastID'])) ? 0 : (double)$row["LastID"] ); + $IS4C_LOCAL->set("memberID", (!$row || !isset($row['card_no'])) ? "0" : trim($row["card_no"]) ); + $IS4C_LOCAL->set("runningTotal", (!$row || !isset($row['runningTotal'])) ? 0 : (double)$row["runningTotal"] ); + $IS4C_LOCAL->set("taxTotal", (!$row || !isset($row['taxTotal'])) ? 0 : (double)$row["taxTotal"] ); + $IS4C_LOCAL->set("discounttotal", (!$row || !isset($row['discounttotal'])) ? 0 : (double)$row["discountTTL"] ); + $IS4C_LOCAL->set("tenderTotal", (!$row || !isset($row['tenderTotal'])) ? 0 : (double)$row["tenderTotal"] ); + $IS4C_LOCAL->set("memSpecial", (!$row || !isset($row['memSpecial'])) ? 0 : (double)$row["memSpecial"] ); + $IS4C_LOCAL->set("staffSpecial", (!$row || !isset($row['staffSpecial'])) ? 0 : (double)$row["staffSpecial"] ); + $IS4C_LOCAL->set("percentDiscount", (!$row || !isset($row['percentDiscount'])) ? 0 : (double)$row["percentDiscount"] ); + $IS4C_LOCAL->set("transDiscount", (!$row || !isset($row['transDiscount'])) ? 0 : (double)$row["transDiscount"] ); + $IS4C_LOCAL->set("fsTaxExempt", (!$row || !isset($row['fsTaxExempt'])) ? 0 : (double)$row["fsTaxExempt"] ); + $IS4C_LOCAL->set("fsEligible", (!$row || !isset($row['fsEligible'])) ? 0 : (double)$row["fsEligible"] ); + $IS4C_LOCAL->set("memCouponTTL", (!$row || !isset($row['couponTotal']) || !isset($row['memCoupon'])) ? 0 : -1 * ((double) $row["couponTotal"]) + ((double) $row["memCoupon"])); + $IS4C_LOCAL->set("refundTotal", (!$row || !isset($row['refundTotal'])) ? 0 : (double)$row["refundTotal"] ); + $IS4C_LOCAL->set("chargeTotal", (!$row || !isset($row['chargeTotal'])) ? 0 : (double)$row["chargeTotal"] ); + $IS4C_LOCAL->set("ccTotal", (!$row || !isset($row['ccTotal'])) ? 0 : (double)$row["ccTotal"] ); + $IS4C_LOCAL->set("memChargeTotal", (!$row || !isset($row['memChargeTotal'])) ? 0 : (double)$row["memChargeTotal"] ); + $IS4C_LOCAL->set("madCoup", (!$row || !isset($row['madCoup'])) ? 0 : (double)$row["madCoup"] ); + $IS4C_LOCAL->set("scTaxTotal", (!$row || !isset($row['scTaxTotal'])) ? 0 : (double)$row["scTaxTotal"] ); + $IS4C_LOCAL->set("scDiscount", (!$row || !isset($row['scDiscount'])) ? 0 : (double)$row["scDiscount"] ); + $IS4C_LOCAL->set("paymentTotal", (!$row || !isset($row['paymentTotal'])) ? 0 : (double)$row["paymentTotal"] ); + $IS4C_LOCAL->set("discountableTotal", (!$row || !isset($row['discountableTotal'])) ? 0 : (double)$row["discountableTotal"] ); + $IS4C_LOCAL->set("localTotal", (!$row || !isset($row['localTotal'])) ? 0 : (double)$row["localTotal"] ); + + if ($IS4C_LOCAL->get("memberID") == "0" && $IS4C_LOCAL->get("runningTotal") > 0) { + if ($IS4C_LOCAL->get("SSI") != 0 && ($IS4C_LOCAL->get("isStaff") == 3 || $IS4C_LOCAL->get("isStaff") == 6)) wmdiscount(); + } + + if ($IS4C_LOCAL->get("sc") == 1) { + $IS4C_LOCAL->set("taxTotal",$IS4C_LOCAL->get("scTaxTotal")); + } + + if ( $IS4C_LOCAL->get("TaxExempt") == 1 ) { + $IS4C_LOCAL->set("taxable",0); + $IS4C_LOCAL->set("taxTotal",0); + $IS4C_LOCAL->set("fsTaxable",0); + $IS4C_LOCAL->set("fsTaxExempt",0); + } + + $IS4C_LOCAL->set("subtotal",number_format($IS4C_LOCAL->get("runningTotal") - $IS4C_LOCAL->get("transDiscount"), 2)); + /* using a string for amtdue behaves strangely for + * values > 1000, so use floating point */ + $IS4C_LOCAL->set("amtdue",(double)round($IS4C_LOCAL->get("runningTotal") - $IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("taxTotal"), 2)); + + if ( $IS4C_LOCAL->get("fsEligible") > $IS4C_LOCAL->get("subtotal") ) { + $IS4C_LOCAL->set("fsEligible",$IS4C_LOCAL->get("subtotal")); + } + + + $connection->close(); + +} + +// ----------gettransno($CashierNo /int)---------- +// +// Given $CashierNo, gettransno() will look up the number of the most recent transaction. +// modified for web use. Check localtemptrans for an ongoing transaction first, then +// check for any other transactions that day +function gettransno($CashierNo) { + global $IS4C_LOCAL; + + $register_no = $IS4C_LOCAL->get("laneno"); + $query1 = "SELECT max(trans_no) as maxtransno from localtemptrans where emp_no = '" + .$CashierNo."' and register_no = '" + .$register_no."' GROUP by register_no, emp_no"; + $query2 = "SELECT max(trans_no) as maxtransno from localtranstoday where emp_no = '" + .$CashierNo."' and register_no = '" + .$register_no."' GROUP by register_no, emp_no"; + $connection = tDataConnect(); + $result = $connection->query($query1); + $row = $connection->fetch_array($result); + if ($row) return $row['maxtransno']; + + $result = $connection->query($query2); + $row = $connection->fetch_array($result); + if (!$row || !$row["maxtransno"]) { + $trans_no = 1; + } + else { + $trans_no = $row["maxtransno"] + 1; + } + return $trans_no; +} + +// ------------------------------------------------------------------ + +function testremote() { + global $IS4C_LOCAL; + + + $intConnected = pinghost($IS4C_LOCAL->get("mServer")); + if ($intConnected == 1) { + + uploadtoServer(); + + } else { + $IS4C_LOCAL->set("standalone",1); + } + + return ($IS4C_LOCAL->get("standalone") + 1) % 2; +} + +// ------------------------------------------------------------------ +function uploadtoServer() +{ + global $IS4C_LOCAL; + + $uploaded = 0; + + // new upload method makes use of SQLManager's transfer method + // to simulate cross-server queries + $connect = tDataConnect(); + $connect->add_connection($IS4C_LOCAL->get("mServer"), + $IS4C_LOCAL->get("mDBMS"), + $IS4C_LOCAL->get("mDatabase"), + $IS4C_LOCAL->get("mUser"), + $IS4C_LOCAL->get("mPass"), + False); + if (!isset($connect->connections[$IS4C_LOCAL->get("mDatabase")]) || + $connect->connections[$IS4C_LOCAL->get("mDatabase")] === False){ + $IS4C_LOCAL->set("standalone",1); + return 0; + } + + $dt_matches = getMatchingColumns($connect,"dtransactions"); + + if ($connect->transfer($IS4C_LOCAL->get("tDatabase"), + "select {$dt_matches} from dtransactions", + $IS4C_LOCAL->get("mDatabase"),"insert into dtransactions ({$dt_matches})")){ + + $al_matches = getMatchingColumns($connect,"alog"); + $al_my = ""; // interval is a mysql reserved word + if ($IS4C_LOCAL->get("DBMS") == "mysql") + $al_my = str_replace("Interval","`Interval`",$al_matches); + $al_success = $connect->transfer($IS4C_LOCAL->get("tDatabase"), + "select ".(empty($al_my)?$al_matches:$al_my)." from alog", + $IS4C_LOCAL->get("mDatabase"), + "insert into alog ({$al_matches})"); + + + $su_matches = getMatchingColumns($connect,"suspended"); + $su_success = $connect->transfer($IS4C_LOCAL->get("tDatabase"), + "select {$su_matches} from suspended", + $IS4C_LOCAL->get("mDatabase"), + "insert into suspended ({$su_matches})"); + + $connect->query("truncate table dtransactions", + $IS4C_LOCAL->get("tDatabase")); + if ($al_success){ + $connect->query("truncate table alog", + $IS4C_LOCAL->get("tDatabase")); + } + if ($su_success){ + $connect->query("truncate table suspended", + $IS4C_LOCAL->get("tDatabase")); + } + + $uploaded = 1; + $IS4C_LOCAL->set("standalone",0); + } + else { + $uploaded = 0; + $IS4C_LOCAL->set("standalone",1); + } + + $connect->close($IS4C_LOCAL->get("mDatabase")); + $connect->close($IS4C_LOCAL->get("tDatabase")); + + uploadCCdata(); + + return $uploaded; +} + +/* get a list of columns that exist on the local db + and the server db for the given table + $connection should be a SQLManager object that's + already connected + if $table2 is provided, it match columns from + local.table_name against remote.table2 +*/ +function getMatchingColumns($connection,$table_name,$table2=""){ + global $IS4C_LOCAL; + + $local_poll = $connection->table_definition($table_name,$IS4C_LOCAL->get("tDatabase")); + $local_cols = array(); + foreach($local_poll as $name=>$v) + $local_cols[$name] = True; + $remote_poll = $connection->table_definition((!empty($table2)?$table2:$table_name), + $IS4C_LOCAL->get("mDatabase")); + $matching_cols = array(); + foreach($remote_poll as $name=>$v){ + if (isset($local_cols[$name])) + $matching_cols[] = $name; + } + + $ret = ""; + foreach($matching_cols as $col) + $ret .= $col.","; + return rtrim($ret,","); +} + +/* get a list of columns in both tables + * unlike getMatchingColumns, this compares tables + * on the same database & server + */ +function localMatchingColumns($connection,$table1,$table2){ + $poll1 = $connection->table_definition($table1); + $cols1 = array(); + foreach($poll1 as $name=>$v) + $cols1[$name] = True; + $poll2 = $connection->table_definition($table2); + $matching_cols = array(); + foreach($poll2 as $name=>$v){ + if (isset($cols1[$name])) + $matching_cols[] = $name; + } + + $ret = ""; + foreach($matching_cols as $col) + $ret .= $col.","; + return rtrim($ret,","); +} + +function uploadCCdata(){ + global $IS4C_LOCAL; + + $sql = tDataConnect(); + $sql->add_connection($IS4C_LOCAL->get("mServer"), + $IS4C_LOCAL->get("mDBMS"), + $IS4C_LOCAL->get("mDatabase"), + $IS4C_LOCAL->get("mUser"), + $IS4C_LOCAL->get("mPass"), + False); + + $req_cols = getMatchingColumns($sql,"efsnetRequest"); + if ($sql->transfer($IS4C_LOCAL->get("tDatabase"), + "select {$req_cols} from efsnetRequest", + $IS4C_LOCAL->get("mDatabase"),"insert into efsnetRequest ({$req_cols})")){ + + $sql->query("truncate table efsnetRequest", + $IS4C_LOCAL->get("tDatabase")); + + $res_cols = getMatchingColumns($sql,"efsnetResponse"); + $res_success = $sql->transfer($IS4C_LOCAL->get("tDatabase"), + "select {$res_cols} from efsnetResponse", + $IS4C_LOCAL->get("mDatabase"), + "insert into efsnetResponse ({$res_cols})"); + if ($res_success){ + $sql->query("truncate table efsnetResponse", + $IS4C_LOCAL->get("tDatabase")); + } + + $mod_cols = getMatchingColumns($sql,"efsnetRequestMod"); + $mod_success = $sql->transfer($IS4C_LOCAL->get("tDatabase"), + "select {$mod_cols} from efsnetRequestMod", + $IS4C_LOCAL->get("mDatabase"), + "insert into efsnetRequestMod ({$mod_cols})"); + if ($mod_success){ + $sql->query("truncate table efsnetRequestMod", + $IS4C_LOCAL->get("tDatabase")); + } + } +} + +?> diff --git a/pos/is4c-web/lib/drawscreen.php b/pos/is4c-web/lib/drawscreen.php new file mode 100644 index 000000000..b7d364155 --- /dev/null +++ b/pos/is4c-web/lib/drawscreen.php @@ -0,0 +1,441 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("rePoll")) include($IS4C_PATH."lib/lib.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function printfooterb() { + $ret = "<form name='hidden'>\n"; + $ret .= "<input Type='hidden' name='alert' value='noBeep'>\n"; + $ret .= "<input Type='hidden' name='scan' value='scan'>\n"; + $ret .= "</form>"; + return $ret; +} + +function printfooter($readOnly=False) { + global $IS4C_LOCAL; + + if (!$readOnly) { + $IS4C_LOCAL->set("runningTotal",$IS4C_LOCAL->get("amtdue")); + } + + if ($IS4C_LOCAL->get("End") == 1 && !$readOnly) { + $IS4C_LOCAL->set("runningTotal",-1 * $IS4C_LOCAL->get("change")); + } + + if ($IS4C_LOCAL->get("scale") == 1) { + $weight = number_format($IS4C_LOCAL->get("weight"), 2)."lb."; + } + else { + $weight = "_ _ _ _"; + } + + if (is_numeric($IS4C_LOCAL->get("discounttotal"))) { + $dbldiscounttotal = number_format($IS4C_LOCAL->get("discounttotal"), 2); + } + else { + $dbldiscounttotal = 0.00; + if (!$readOnly) + $IS4C_LOCAL->set("runningTotal",0); + } + + if ($IS4C_LOCAL->get("runningTotal") == "" && !$readOnly) { + $IS4C_LOCAL->set("runningTotal",0); + } + + if ($IS4C_LOCAL->get("isMember") == 1 || $IS4C_LOCAL->get("sc") == 1) { + $labelyousaved = "You Saved"; + } + else { + $labelyousaved = "Could Have Saved"; + } + + if ($IS4C_LOCAL->get("percentDiscount") == 0) { + $strpercentdisclabel = "% Discount"; + } + else { + $strpercentdisclabel = $IS4C_LOCAL->get("percentDiscount")."% Discount"; + } + +// ----------------------------------------------------------------------------------------------- + + $ret = "<table>"; + $ret .= "<tr class=\"heading\">"; + $ret .= "<td class=\"first\">$labelyousaved</td>"; + $ret .= "<td class=\"reg\">$strpercentdisclabel</td>"; + $ret .= "<td class=\"reg\">Mbr Special</td>"; + $ret .= "<td class=\"reg\">Special</td>"; + if ( $IS4C_LOCAL->get("ttlflag") == 1 and $IS4C_LOCAL->get("End") != 1 ) { + if ($IS4C_LOCAL->get("fntlflag") == 1) { + $ret .= "<td class=\"fs\">fs Amount Due</td>"; + } else { + $ret .= "<td class=\"due\">Amount Due</td>"; + } + } + elseif ($IS4C_LOCAL->get("ttlflag") == 1 and $IS4C_LOCAL->get("End") == 1 ) { + $ret .= "<td class=\"change\">Change</td>"; + } + else { + $ret .= "<td class=\"total\">Total</td>"; + } + $ret .= "</tr>"; + + $special = $IS4C_LOCAL->get("memSpecial") + $IS4C_LOCAL->get("staffSpecial"); + if ($IS4C_LOCAL->get("isMember") == 1) { + $dblyousaved = number_format( $IS4C_LOCAL->get("transDiscount") + $dbldiscounttotal + $special + $IS4C_LOCAL->get("memCouponTTL"), 2); + if (!$readOnly){ + $IS4C_LOCAL->set("yousaved",$dblyousaved); + $IS4C_LOCAL->set("couldhavesaved",0); + $IS4C_LOCAL->set("specials",number_format($dbldiscounttotal + $special, 2)); + } + } + else { + $dblyousaved = number_format($IS4C_LOCAL->get("memSpecial"),2); + if (!$readOnly){ + $IS4C_LOCAL->set("yousaved",$dbldiscounttotal + $IS4C_LOCAL->get("staffSpecial")); + $IS4C_LOCAL->set("couldhavesaved",$dblyousaved); + $IS4C_LOCAL->set("specials",$dbldiscounttotal + $IS4C_LOCAL->get("staffSpecial")); + } + } + if ($IS4C_LOCAL->get("sc") == 1) { + if (!$readOnly){ + $IS4C_LOCAL->set("yousaved",$IS4C_LOCAL->get("yousaved") + $Is4C_LOCAL->get("scDiscount")); + } + $dblyousaved = $IS4C_LOCAL->get("yousaved"); + } + if ($IS4C_LOCAL->get("percentDiscount") != 0 || $IS4C_LOCAL->get("memCouponTTL") > 0) { + $strperdiscount = number_format($IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("memCouponTTL"), 2); + } + else { + $strperdiscount = "n/a"; + } + if ($IS4C_LOCAL->get("isMember") == 1) { + $strmemSpecial = number_format($IS4C_LOCAL->get("memSpecial"), 2); + } else { + $strmemSpecial = "n/a"; + } + if (!$readOnly){ + if ($IS4C_LOCAL->get("End") == 1) { + rePoll(); + } + if (strlen($IS4C_LOCAL->get("endorseType")) > 0 || $IS4C_LOCAL->get("waitforScale") == 1) { + $IS4C_LOCAL->set("waitforScale",0); + $IS4C_LOCAL->set("beep","noBeep"); + } + if ($IS4C_LOCAL->get("scale") == 0 && $IS4C_LOCAL->get("SNR") == 1) { + rePoll(); + } + if ($IS4C_LOCAL->get("cashOverAmt") <> 0) { + twoPairs(); + $IS4C_LOCAL->set("cashOverAmt",0); + } + } + + $ret .= "<tr class=\"values\">"; + $ret .= "<td class=\"first\">".number_format($dblyousaved,2)."</td>"; + $ret .= "<td class=\"reg\">".number_format((double)$strperdiscount,2)."</td>"; + $ret .= "<td class=\"reg\">".number_format((double)$strmemSpecial,2)."</td>"; + $ret .= "<td class=\"reg\">".number_format($dbldiscounttotal,2)."</td>"; + if ($IS4C_LOCAL->get("ttlflag") == 1 && $IS4C_LOCAL->get("End") != 1) { + if ($IS4C_LOCAL->get("fntlflag") == 1) { + $ret .= "<td class=\"fs\">".number_format($IS4C_LOCAL->get("fsEligible"), 2)."</td>"; + } else { + $ret .= "<td class=\"due\">".number_format($IS4C_LOCAL->get("runningTotal"), 2)."</td>"; + } + } + elseif ($IS4C_LOCAL->get("ttlflag") == 1 && $IS4C_LOCAL->get("End") == 1) { + $ret .= "<td class=\"change\">".number_format($IS4C_LOCAL->get("runningTotal"), 2)."</td>"; + } + else { + $ret .= "<td class=\"total\">".number_format($IS4C_LOCAL->get("runningTotal"), 2)."</td>"; + } + $ret .= "</tr>"; + $ret .= "</table>"; + + if (!$readOnly){ + $ret .= "<form name='hidden'>\n"; + $ret .= "<input type='hidden' id='alert' name='alert' value='".$IS4C_LOCAL->get("beep")."'>\n"; + $ret .= "<input type='hidden' id='scan' name='scan' value='".$IS4C_LOCAL->get("scan")."'>\n"; + $ret .= "<input type='hidden' id='screset' name='screset' value='".$IS4C_LOCAL->get("screset")."'>\n"; + $ret .= "<input type='hidden' id='ccTermOut' name='ccTermOut' value=\"".$IS4C_LOCAL->get("ccTermOut")."\">\n"; + $ret .= "</form>"; + $IS4C_LOCAL->set("beep","noBeep"); + $IS4C_LOCAL->set("scan","scan"); + $IS4C_LOCAL->set("screset","stayCool"); + $IS4C_LOCAL->set("ccTermOut","idle"); + } + + return $ret; +} + +//--------------------------------------------------------------------// + +function plainmsg($strmsg) { +return "<div id=\"plainmsg\">$strmsg</div>"; + +} + + +//-------------------------------------------------------------------// + +function msgbox($strmsg, $icon,$noBeep=False) { + global $IS4C_LOCAL; + + $ret = printheaderb(); + $ret .= "<div id=\"boxMsg\" class=\"centeredDisplay\">"; + $ret .= "<div class=\"boxMsgAlert\">"; + $ret .= $IS4C_LOCAL->get("alertBar"); + $ret .= "</div>"; + $ret .= "<div class=\"boxMsgBody\">"; + $ret .= "<div class=\"msgicon\"><img src=\"$icon\" /></div>"; + $ret .= "<div class=\"msgtext\">"; + $ret .= $strmsg; + $ret .= "</div><div class=\"clear\"></div></div>"; + $ret .= "</div>"; + + $IS4C_LOCAL->set("strRemembered",$IS4C_LOCAL->get("strEntered")); + if ($IS4C_LOCAL->get("warned") == 0 && !$noBeep) + errorBeep(); + //$_SESSION["scan"] = "noScan"; + $IS4C_LOCAL->set("msgrepeat",1); + //$_SESSION["toggletax"] = 0; + //$_SESSION["togglefoodstamp"] = 0; + //$_SESSION["away"] = 1; + + return $ret; +} +//--------------------------------------------------------------------// + +function xboxMsg($strmsg) { + global $IS4C_PATH; + return msgbox($strmsg, $IS4C_PATH."graphics/crossD.gif"); +} + +function boxMsg($strmsg,$header="",$noBeep=False) { + global $IS4C_PATH; + return msgbox($strmsg, $IS4C_PATH."graphics/exclaimC.gif",$noBeep); +} + +function inputUnknown() { + global $IS4C_PATH; + return msgbox("<B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input unknown</B>", $IS4C_PATH."graphics/exclaimC.gif"); +} + +//--------------------------------------------------------------------// + +function printheaderb() { + global $IS4C_LOCAL; + + if ($IS4C_LOCAL->get("memberID") == "0") { + $strmemberID = ""; + } + else { + $strmemberID = $IS4C_LOCAL->get("memMsg"); + if ($IS4C_LOCAL->get("isMember") == 0){ + $strmemberID = str_replace("(0)", "(n/a)", $strmemberID); + } + } + + $ret = ' + <div id="headerb"> + <div class="left"> + <span class="bigger">M E M B E R &nbsp;&nbsp;</span> + <span class="smaller"> + '.$strmemberID.' + </span> + </div> + <div class="right"> + <span class="bigger">C A S H I E R &nbsp;&nbsp;</span> + <span class="smaller"> + '.$IS4C_LOCAL->get("cashier").' + </span> + </div> + <div class="clear"></div> + </div> + '; + return $ret; +} + +//-------------------------------------------------------------------// + +function printitem($field2, $field3, $total, $field5, $trans_id=-1) { + global $IS4C_LOCAL; + + $onclick = ""; + if ($trans_id != -1){ + $curID = $IS4C_LOCAL->get("currentid"); + $diff = $trans_id - $curID; + if ($diff > 0){ + $onclick="onclick=\"\$('#reginput').val('D$diff');submitWrapper();\""; + } + else if ($diff < 0){ + $diff *= -1; + $onclick="onclick=\"\$('#reginput').val('U$diff');submitWrapper();\""; + } + } + + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($field2 == "") $field2 = "&nbsp;"; + if (trim($field3) == "") $field3 = "&nbsp;"; + if ($field5 == "") $field5 = "&nbsp;"; + + $ret = "<div class=\"item\">"; + $ret .= "<div $onclick class=\"desc\">$field2</div>"; + $ret .= "<div $onclick class=\"comments\">$field3</div>"; + $ret .= "<div $onclick class=\"total\">$total</div>"; + $ret .= "<div $onclick class=\"suffix\">$field5</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//------------------------------------------------------------------// + +function printitemcolor($color, $description, $comments, $total, $suffix,$trans_id=-1) { + global $IS4C_LOCAL; + + $onclick = ""; + if ($trans_id != -1){ + $curID = $IS4C_LOCAL->get("currentid"); + $diff = $trans_id - $curID; + if ($diff > 0){ + $onclick="onclick=\"\$('#reginput').val('D$diff');submitWrapper();\""; + } + else if ($diff < 0){ + $diff *= -1; + $onclick="onclick=\"\$('#reginput').val('U$diff');submitWrapper();\""; + } + } + + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($total == 0 && $color == "408080") $total = "&nbsp;"; + if ($description == "") $description = "&nbsp;"; + if (trim($comments) == "") $comments = "&nbsp;"; + if ($suffix == "") $suffix = "&nbsp;"; + + $style = "style=\"color:#$color;\""; + $ret = "<div class=\"item\">"; + $ret .= "<div $onclick class=\"desc\" $style>$description</div>"; + $ret .= "<div $onclick class=\"comments\" $style>$comments</div>"; + $ret .= "<div $onclick class=\"total\" $style>$total</div>"; + $ret .= "<div $onclick class=\"suffix\" $style>$suffix</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//----------------------------------------------------------------// + +function printitemcolorhilite($color, $description, $comments, $total, $suffix) { + if (strlen($total) > 0) { + $total = number_format($total, 2); + } else { + $total = "&nbsp;"; + } + if ($total == 0 && $color == "408080") $total = "&nbsp;"; + if ($description == "") $description="&nbsp;"; + if (trim($comments) == "") $comments="&nbsp;"; + if ($suffix == "") $suffix="&nbsp;"; + + $style = "style=\"background:#$color;color:#ffffff;\""; + $ret = "<div class=\"item\">"; + $ret .= "<div class=\"desc\" $style>$description</div>"; + $ret .= "<div class=\"comments\" $style>$comments</div>"; + $ret .= "<div class=\"total\" $style>$total</div>"; + $ret .= "<div class=\"suffix\" $style>$suffix</div>"; + $ret .= "</div>"; + $ret .= "<div style=\"clear:left;\"></div>\n"; + return $ret; +} + +//----------------------------------------------------------------// + +function printItemHilite($description, $comments, $total, $suffix) { + return printItemColorHilite("004080", $description, $comments, $total, $suffix); +} + +function scaledisplaymsg($input=""){ + global $IS4C_LOCAL; + $reginput = trim(strtoupper($input)); + + // return early; all other cases simplified + // by resetting session "weight" + if (strlen($reginput) == 0) { + return number_format($IS4C_LOCAL->get("weight"), 2)." lb"; + } + + $display_weight = ""; + $weight = 0; + $IS4C_LOCAL->set("scale",0); + $IS4C_LOCAL->set("weight",0); + + if (substr($reginput, 0, 3) == "S11") { + if (!substr($reginput, 3) || + !is_numeric(substr($reginput, 3))) { + $display_weight = "_ _ _ _"; + } + else { + $weight = number_format(substr($reginput, 3)/100, 2); + $IS4C_LOCAL->set("weight",$weight); + $display_weight = $weight." lb"; + $IS4C_LOCAL->set("scale",1); + } + + /* + if ($IS4C_LOCAL->get("SNR") == 1 && $weight > 0 ) { + clearbox(); + } + */ + } + elseif (substr($reginput, 0, 4) == "S143") { + $display_weight = "0.00 lb"; + $IS4C_LOCAL->set("scale",1); + } + elseif (substr($reginput, 0, 4) == "S141") { + $display_weight = "_ _ _ _"; + } + elseif (substr($reginput, 0, 4) == "S145") { + $display_weight = "err -0"; + } + elseif (substr($reginput, 0, 4) == "S142") { + $display_weight = "error"; + } + else { + $display_weight = "? ? ? ?"; + } + + return $display_weight; +} + +?> diff --git a/pos/is4c-web/lib/lib.php b/pos/is4c-web/lib/lib.php new file mode 100644 index 000000000..f8e41db45 --- /dev/null +++ b/pos/is4c-web/lib/lib.php @@ -0,0 +1,165 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +// These functions have been translated from lib.asp by Brandon on 07.13.03. +// The "/blah" notation in the function heading indicates the Type of argument that should be given. + +// ----------int($num /numeric)---------- +// +// Given $num, detemine if it is numeric. +// If so, int returns the integral part of $num. +// Else generate a fatal error. + +function int($num) { + if(is_numeric($num)) { + return (int) $num; + } + else { + die("FATAL ERROR: Argument, '".$num.",' given to int() is not numeric."); + } +} + +// -----------nullwrap($num /numeric)---------- +// +// Given $num, if it is empty or of length less than one, nullwrap becomes "0". +// If the argument is a non-numeric, generate a fatal error. +// Else nullwrap becomes the number. + +function nullwrap($num) { + + + if ( !$num ) { + return 0; + } + elseif (!is_numeric($num) && strlen($num) < 1) { + return " "; + } + else { + return $num; + } +} + +// ----------truncate2($num /numeric)---------- +// +// Round $num to two (2) digits after the decimal and return it as a STRING. + +function truncate2($num) { + return number_format($num, 2); +} + +// ----------pinghost($host /string)---------- +// +// Given $host, pinghost() looks up that host name or IP address. +// Returns: +// 1 if ping succeeds +// 0 if ping fails +// -1 if ping is unavailable (disabling exec is common on hosting services) + +function pinghost($host) +{ + global $IS4C_LOCAL; + + $host = str_replace("[", "", $host); + $host = str_replace("]", "", $host); + + if (strstr($host,"\\")){ + $tmp = explode("\\",$host); + $host = $tmp[0]; + } + + $intConnected = 0; + $aPingReturn = array(); + if ($IS4C_LOCAL->get("OS") == "win32") { + $pingReturn = @exec("ping -n 1 $host", $aPingReturn); + $packetLoss = "(0% loss"; + } else { + $pingReturn = @exec("ping -c 1 $host", $aPingReturn); + $packetLoss = "1 received, 0% packet loss"; + } + + foreach($aPingReturn as $returnLine) + + { $pos = strpos($returnLine, $packetLoss); + if ($pos) { + $intConnected = 1; + break; + } + } + return (count($aPingReturn)>0 ? $intConnected : -1); +} + +function win32() { + $winos = 0; + if (substr(PHP_OS, 0, 3) == "WIN") $winos = 1; + return $winos; +} + +function scaleObject(){ + global $IS4C_LOCAL, $IS4C_PATH; + $scaleDriver = $IS4C_LOCAL->get("scaleDriver"); + $sd = 0; + if ($scaleDriver != "" && !class_exists($scaleDriver)){ + include($IS4C_PATH.'scale-drivers/php-wrappers/'.$scaleDriver.'.php'); + $sd = new $scaleDriver(); + } +} + +function goodBeep() { + global $IS4C_LOCAL; + $IS4C_LOCAL->set("beep","goodBeep"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("goodBeep"); +} + +function rePoll() { + global $IS4C_LOCAL; + $IS4C_LOCAL->set("beep","rePoll"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("rePoll"); +} + +function errorBeep() { + global $IS4C_LOCAL; + $IS4C_LOCAL->set("beep","errorBeep"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("errorBeep"); +} + +function twoPairs() { + global $IS4C_LOCAL; + $IS4C_LOCAL->set("beep","twoPairs"); + $sd = scaleObject(); + if (is_object($sd)) + $sd->WriteToScale("twoPairs"); +} + +?> diff --git a/pos/is4c-web/lib/listitems.php b/pos/is4c-web/lib/listitems.php new file mode 100644 index 000000000..afe457bd3 --- /dev/null +++ b/pos/is4c-web/lib/listitems.php @@ -0,0 +1,193 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("getsubtotals")) include($IS4C_PATH."lib/connect.php"); +if (!function_exists("printheaderb")) include($IS4C_PATH."lib/drawscreen.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function listitems($top_item, $highlight) { + global $IS4C_LOCAL; + + getsubtotals(); + $LastID = $IS4C_LOCAL->get("LastID"); + +//----------------Boundary Top ------------------ + + if ($highlight < 1) { + $highlight = 1; + $top_item = 1; + } + + if ($highlight > $LastID) { + $highlight = $LastID; + } + + if ($highlight < $top_item) { + $top_item = $highlight; + } + + if ($highlight > ($top_item + 11)) { + $top_item = ($highlight - 11); + } + + $IS4C_LOCAL->set("currenttopid",$top_item); + $IS4C_LOCAL->set("currentid",$highlight); + +//------------------Boundary Bottom---------------- + + return drawitems($top_item, 11, $highlight); + $IS4C_LOCAL->set("currentid",$highlight); +} + + + +function printReceiptfooter($readOnly=False) { + global $IS4C_LOCAL; + + if ($IS4C_LOCAL->get("sc") == 1) { + return lastpage(); + } + else { + + if (!$readOnly) + getsubtotals(); + $last_id = $IS4C_LOCAL->get("LastID"); + + if (($last_id - 7) < 0) { + $top_id = 1; + } + else { + $top_id = $last_id - 7; + } + + $ret = drawitems($top_id, 7, 0); + + $ret .= "<div class=\"farewellMsg\">" + .$IS4C_LOCAL->get("farewellMsg1") + ."<br />" + .$IS4C_LOCAL->get("farewellMsg2") + ."<br />" + .$IS4C_LOCAL->get("farewellMsg3") + ."</div>"; + return $ret; + } +} + + + +function drawitems($top_item, $rows, $highlight) { + global $IS4C_LOCAL; + + $ret = printheaderb(); + + $query = "select count(*) as count from localtemptrans"; + $db = tDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + $rowCount = $row["count"]; + + $db->close(); + + + if ($rowCount == 0) { + $ret .= "<div class=\"centerOffset\">"; + if ($IS4C_LOCAL->get("training") != 1) { + $ret .= plainmsg($IS4C_LOCAL->get("welcomeMsg1")."<BR>".$IS4C_LOCAL->get("welcomeMsg2")); + } + else { + $ret .= plainmsg($IS4C_LOCAL->get("trainingMsg1")."<BR>".$IS4C_LOCAL->get("trainingMsg2")); + } + $ret .= "</div>"; + } + else { + + $query_range = "select trans_id,description,total,comment,status,lineColor + from screendisplay where trans_id >= ".$top_item." and trans_id <= " + .($top_item + $rows)." order by trans_id"; + $db_range = tDataConnect(); + $result_range = $db_range->query($query_range); + $num_rows = $db_range->num_rows($result_range); + + for ($i = 0; $i < $num_rows; $i++) { + $row = $db_range->fetch_array($result_range); + + $trans_id = $row["trans_id"]; + $description = $row["description"]; + $total = $row["total"]; + $comment = $row["comment"]; + $tf = $row["status"]; + $color = $row["lineColor"]; + + + if ($trans_id == $highlight) { + if ($color == "004080") { + $ret .= printitemhilite($description, $comment, $total, $tf); + } + else { + $ret .= printitemcolorhilite($color, $description, $comment, $total, $tf); + } + } + else + { + if ($color == "004080") { + $ret .= printitem($description, $comment, $total, $tf,$trans_id); + } + else { + $ret .= printitemcolor($color, $description, $comment, $total, $tf,$trans_id); + } + } + + } + $db_range->close(); + } + return $ret; +} + + + +function lastpage($readOnly=False) { + global $IS4C_LOCAL; + + if (!$readOnly){ + getsubtotals(); + } + $last_id = $IS4C_LOCAL->get("LastID"); + + if (($last_id - 11) < 0) { + $top_id = 1; + } + else { + $top_id = $last_id - 11; + } + + if (!$readOnly){ + $IS4C_LOCAL->set("currentid",$last_id); + $IS4C_LOCAL->set("currenttopid",$top_id); + } + return drawitems($top_id, 11, $last_id); +} + +?> diff --git a/pos/is4c-web/lib/loadconfig.php b/pos/is4c-web/lib/loadconfig.php new file mode 100644 index 000000000..cd79e2393 --- /dev/null +++ b/pos/is4c-web/lib/loadconfig.php @@ -0,0 +1,75 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function loadglobalvalues() { + global $IS4C_LOCAL; + + $query = "select CashierNo,Cashier,LoggedIn,TransNo,TTLFlag, + FntlFlag,TaxExempt from globalvalues"; + $db = pDataConnect(); + $result = $db->query($query); + $row = $db->fetch_array($result); + + $IS4C_LOCAL->set("CashierNo",$row["CashierNo"]); + $IS4C_LOCAL->set("cashier",$row["Cashier"]); + $IS4C_LOCAL->set("LoggedIn",$row["LoggedIn"]); + $IS4C_LOCAL->set("transno",$row["TransNo"]); + $IS4C_LOCAL->set("ttlflag",$row["TTLFlag"]); + $IS4C_LOCAL->set("fntlflag",$row["FntlFlag"]); + $IS4C_LOCAL->set("TaxExempt",$row["TaxExempt"]); + + $db->close(); +} + +function setglobalvalue($param, $value) { + global $IS4C_LOCAL; + + $db = pDataConnect(); + + if (!is_numeric($value)) { + $value = "'".$value."'"; + } + + $laneno = $IS4C_LOCAL->get('laneno'); + + $strUpdate = "update globalvalues set ".$param." = ".$value; + $ccUpdate = "update globalvalues set ".$param."=".$value." WHERE lane =".$laneno; + + $db->query($strUpdate); + $db->close(); +} + +function setglobalflags($value) { + $db = pDataConnect(); + + $db->query("update globalvalues set TTLFlag = ".$value.", FntlFlag = ".$value); + $db->close(); +} + +?> diff --git a/pos/is4c-web/lib/notices.php b/pos/is4c-web/lib/notices.php new file mode 100644 index 000000000..b4a61eba9 --- /dev/null +++ b/pos/is4c-web/lib/notices.php @@ -0,0 +1,108 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); +if (!function_exists("getRealName")) include($IS4C_PATH."auth/utilities.php"); +if (!function_exists("tDataConnect")) include($IS4C_PATH."lib/connect.php"); + +define("STORE_EMAIL","orders@wholefoods.coop"); +define("REPLY_EMAIL","andy@wholefoods.coop"); +define("ADMIN_EMAIL","andy@wholefoods.coop"); + +function send_email($to,$subject,$msg){ + $headers = 'From: '.STORE_EMAIL."\r\n"; + $headers .= 'Reply-To: '.REPLY_EMAIL."\r\n"; + + mail($to,$subject,$msg,$headers); +} + +function customer_confirmation($uid,$email,$total){ + $msg = "Thank you for ordering from Whole Foods Co-op\n\n"; + $msg .= "Order Summary:\n"; + $cart = getcart($uid); + $msg .= $cart."\n"; + $msg .= sprintf("Order Total: \$%.2f\n",$total); + + send_email($email,"WFC Order Confirmation",$msg); + + return $cart; +} + +function admin_notification($uid,$email,$ph,$total,$cart=""){ + $msg = "New online order\n\n"; + $msg .= getRealName($email)." (".$email.")\n"; + $msg .= "Phone # provided: ".$ph."\n\n"; + $msg .= sprintf("Order Total: \$%.2f\n",$total); + + $msg .= "\nOrder Summary:\n"; + $msg .= $cart; + + send_email(ADMIN_EMAIL,"New Online Order",$msg); +} + +function mgr_notification($addresses,$email,$ph,$total,$notes="",$cart=""){ + $msg = "New online order\n\n"; + $msg .= getRealName($email)." (".$email.")\n"; + $msg .= "Phone # provided: ".$ph."\n\n"; + $msg .= sprintf("Order Total: \$%.2f\n",$total); + + $msg .= "\nOrder Summary:\n"; + $msg .= $cart; + + $msg .= "\n:Additional attendees\n"; + $msg .= (!empty($notes) ? $notes : 'none listed'); + + $addr = ""; + foreach($addresses as $a) + $addr .= $a.","; + $addr = rtrim($addr,","); + send_email($addr,"New Online Order",$msg); +} + +function getcart($empno){ + $db = tDataConnect(); + $q = "SELECT description,quantity,total FROM + cart WHERE emp_no=$empno"; + $r = $db->query($q); + $ret = ""; + while($w = $db->fetch_row($r)){ + $ret .= $w['description']."\t\tx"; + $ret .= $w['quantity']."\t\$"; + $ret .= sprintf("%.2f",$w['total'])."\n"; + } + + $ret .= "\n"; + + $taxQ = "SELECT taxes FROM taxTTL WHERE emp_no=$empno"; + $taxR = $db->query($taxQ); + $taxes = round(array_pop($db->fetch_row($taxR)),2); + $ret .= sprintf("Sales tax: \$%.2f\n",$taxes); + + return $ret; +} + +?> diff --git a/pos/is4c-web/lib/paycardLib.php b/pos/is4c-web/lib/paycardLib.php new file mode 100644 index 000000000..41cc38fd5 --- /dev/null +++ b/pos/is4c-web/lib/paycardLib.php @@ -0,0 +1,459 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +define('PAYCARD_MODE_BALANCE', 1); +define('PAYCARD_MODE_AUTH', 2); +define('PAYCARD_MODE_VOID', 3); // for voiding tenders/credits, rung in as T +define('PAYCARD_MODE_ACTIVATE', 4); +define('PAYCARD_MODE_ADDVALUE', 5); +define('PAYCARD_MODE_VOIDITEM', 6); // for voiding sales/addvalues, rung in as I +define('PAYCARD_MODE_CASHOUT', 7); // for cashing out a wedgecard + +define('PAYCARD_TYPE_UNKNOWN', 0); +define('PAYCARD_TYPE_CREDIT', 1); +define('PAYCARD_TYPE_GIFT', 2); +define('PAYCARD_TYPE_STORE', 3); + +define('PAYCARD_ERR_OK', 1); +define('PAYCARD_ERR_NOSEND', -1); +define('PAYCARD_ERR_COMM', -2); +define('PAYCARD_ERR_TIMEOUT', -3); +define('PAYCARD_ERR_DATA', -4); +define('PAYCARD_ERR_PROC', -5); +define('PAYCARD_ERR_CONTINUE', -6); + + +// identify payment card type, issuer and acceptance based on card number +// individual functions are based on this one +function paycard_info($pan) { + $len = strlen($pan); + $iin = (int)substr($pan,0,7); + $issuer = "Unknown"; + $type = PAYCARD_TYPE_UNKNOWN; + $accepted = false; + $test = false; + if( $len >= 13 && $len <= 16) { + $type = PAYCARD_TYPE_CREDIT; + if( $iin>=3000000 && $iin<=3099999) { $issuer="Diners Club"; } + else if( $iin>=3400000 && $iin<=3499999) { $issuer="American Express"; } + else if( $iin>=3528000 && $iin<=3589999) { $issuer="JCB"; $accepted=true; } // Japan Credit Bureau, accepted via Discover + else if( $iin>=3600000 && $iin<=3699999) { $issuer="MasterCard"; $accepted=true; } // Diners Club issued as MC in the US + else if( $iin>=3700000 && $iin<=3799999) { $issuer="American Express"; } + else if( $iin>=3800000 && $iin<=3899999) { $issuer="Diners Club"; } // might be obsolete? + else if( $iin>=4000000 && $iin<=4999999) { $issuer="Visa"; $accepted=true; } + else if( $iin>=5100000 && $iin<=5599999) { $issuer="MasterCard"; $accepted=true; } + else if( $iin>=6011000 && $iin<=6011999) { $issuer="Discover"; $accepted=true; } + else if( $iin>=6221260 && $iin<=6229259) { $issuer="UnionPay"; $accepted=true; } // China UnionPay, accepted via Discover + else if( $iin>=6500000 && $iin<=6599999) { $issuer="Discover"; $accepted=true; } + } else if( $len == 19) { + $type = PAYCARD_TYPE_GIFT; + if( $iin>=7019208 && $iin<=7019208) { $issuer="Co-op Gift"; $accepted=true; } // NCGA gift cards + else if( $iin>=7018525 && $iin<=7018525) { $issuer="Valutec Gift"; $test=true; } // valutec test cards (linked to test merchant/terminal ID) + } + return array('type'=>$type, 'issuer'=>$issuer, 'accepted'=>$accepted, 'test'=>$test); +} // paycard_info() + + +// determine if we accept the card given the number; return 1 if yes, 0 if no +function paycard_accepted($pan, $acceptTest) { + $info = paycard_info($pan); + if( $info['test'] && $acceptTest) + return 1; + return ($info['accepted'] ? 1 : 0); +} // paycard_accepted() + + +// determine what kind of payment card the number belongs to (credit or gift, currently); return one of PAYCARD_TYPE_* +function paycard_type($pan) { + $info = paycard_info($pan); + return $info['type']; +} // paycard_type() + + +// determine who issued a payment card given the number; return the issuer as a string or "Unknown" +function paycard_issuer($pan) { + $info = paycard_info($pan); + return $info['issuer']; +} // paycard_issuer() + + +// determine if card transactions should be sent to the live or test platform; return 1 if live, 0 if test +function paycard_live($type = PAYCARD_TYPE_UNKNOWN) { + global $IS4C_LOCAL; + + // these session vars require training mode no matter what card type + if( $IS4C_LOCAL->get("training") != 0 || $IS4C_LOCAL->get("CashierNo") == 9999) + return 0; + // special session vars for each card type + if( $type === PAYCARD_TYPE_CREDIT) { + if( $IS4C_LOCAL->get("ccLive") != 1) + return 0; + } else if( $type === PAYCARD_TYPE_GIFT) { + if( $IS4C_LOCAL->get("training") == 1) + return 0; + } else if( $type === PAYCARD_TYPE_STORE) { + if( $IS4C_LOCAL->get("storecardLive") != 1) + return 0; + } + return 1; +} // paycard_live() + + +// reset all paycard related session variables; it's important to do this as soon as possible, +// so we don't have the full card number or track data in memory any longer than necessary +function paycard_reset() { + global $IS4C_LOCAL; + + // make sure this matches session.php!!! + $IS4C_LOCAL->set("paycard_manual",0); + $IS4C_LOCAL->set("paycard_amount",0.00); + $IS4C_LOCAL->set("paycard_mode",0); + $IS4C_LOCAL->set("paycard_id",0); + $IS4C_LOCAL->set("paycard_PAN",''); + $IS4C_LOCAL->set("paycard_exp",''); + $IS4C_LOCAL->set("paycard_name",'Customer'); + $IS4C_LOCAL->set("paycard_tr1",false); + $IS4C_LOCAL->set("paycard_tr2",false); + $IS4C_LOCAL->set("paycard_tr3",false); + $IS4C_LOCAL->set("paycard_type",0); + $IS4C_LOCAL->set("paycard_issuer",'Unknown'); + $IS4C_LOCAL->set("paycard_response",array()); + $IS4C_LOCAL->set("paycard_trans",''); + $IS4C_LOCAL->set("paycard_cvv2",''); +} // paycard_reset() + +function paycard_wipe_pan(){ + global $IS4C_LOCAL; + $IS4C_LOCAL->set("paycard_tr1",false); + $IS4C_LOCAL->set("paycard_tr2",false); + $IS4C_LOCAL->set("paycard_tr3",false); + $IS4C_LOCAL->set("paycard_PAN",''); + $IS4C_LOCAL->set("paycard_exp",''); +} + + +// run Luhn's Algorithm on the card number to make sure its check digit is correct +// return 1 if it passes, 0 if not +function paycard_validNumber($pan) { +/* Luhn Algorithm <en.wikipedia.org/wiki/Luhn_algorithm> +1. Starting with the rightmost digit (which is the check digit) and moving left, double the value of every second digit. For any + digits that thus become 10 or more, add their digits together as if casting out nines. For example, 1111 becomes 2121, while + 8763 becomes 7733 (from 2*6=12 -> 1+2=3 and 2*8=16 -> 1+6=7). +2. Add all these digits together. For example, if 1111 becomes 2121, then 2+1+2+1 is 6; and 8763 becomes 7733, so 7+7+3+3 is 20. +3. If the total ends in 0 (put another way, if the total modulus 10 is congruent to 0), then the number is valid according to the + Luhn formula; else it is not valid. So, 1111 is not valid (as shown above, it comes out to 6), while 8763 is valid (as shown above, + it comes out to 20). +*/ + // prepare the doubling-summing conversion array + $doublesum = array(0=>0,1=>2,2=>4,3=>6,4=>8,5=>1,6=>3,7=>5,8=>7,9=>9); + // turn the number into a string, reverse it, and split it into an array of characters (which are digits) + /* php5 */ //$digits = str_split(strrev((string)$pan)); + /* php4 */ $digits = preg_split('//', strrev((string)$pan), -1, PREG_SPLIT_NO_EMPTY); + // run the sum + $sum = 0; + foreach( $digits as $index => $digit) { + // $index starts at 0 but counts from the right, so we double any digit with an odd index + if( ($index % 2) == 1) $sum += $doublesum[(int)$digit]; + else $sum += (int)$digit; + } + // it has to end in 0 (meaning modulo:10 == 0) + if( ($sum % 10) != 0) + return 0; + // ok + return 1; +} // paycard_validNumber() + + +// determine if the expiration date (passed as a string, MMYY) is a valid date and is not in the past +// return 1 if ok, error code < 0 if not +function paycard_validExpiration($exp) { + // verify expiration format (MMYY) + if( strlen($exp) != 4 || !ctype_digit($exp)) + return -1; + // extract expiration parts (month, then year) + $eM = (int)substr($exp,0,2); + $eY = (int)substr($exp,2,2); + // check month range + if( $eM < 1 || $eM > 12) + return -2; + // get today's date + date_default_timezone_set('America/Chicago'); + $cM = (int)date('n'); // Numeric representation of a month, without leading zeros (1 through 12) + $cY = (int)date('y'); // A two digit representation of a year (99 or 03) + // check date + if( $eY < $cY) + return -3; + if( $eY == $cY && $eM < $cM) + return -3; + // ok + return 1; +} // paycard_validExpiration() + + +// decode the magnetic strip from a payment card and make sure its data is internally consistent +// return an array if successful (including pan, exp, name, tr1, tr2, tr3) or an error code < 0 if not +function paycard_magstripe($data) { + global $IS4C_LOCAL; + + // initialize + $tr1 = false; + $weirdTr1 = false; + $tr2 = false; + $tr3 = false; + $pan = false; + $exp = false; + $name = false; + + // track types are identified by start-sentinel values, but all track types end in '?' + $tracks = explode('?', $data); + foreach( $tracks as $track) { + if( substr($track,0,1) == '%') { // track1 start-sentinel + if( substr($track,1,1) != 'B') { // payment cards must have format code 'B' + $weirdTr1 = substr($track,1); + //return -1; // unknown track1 format code + } else if( $tr1 === false) { + $tr1 = substr($track,1); + } else { + return -2; // there should only be one track with the track1 start-sentinel + } + } else if( substr($track,0,1) == ';') { // track2/3 start sentinel + if( $tr2 === false) { + $tr2 = substr($track,1); + } else if( $tr3 === false) { + $tr3 = substr($track,1); + } else { + return -3; // there should only be one or two tracks with the track2/3 start-sentinel + } + } + else if (substr($track,0,1) == "T"){ + // tender amount. not really a standard + // sentinel, but need the value sent + // from cc-terminal if in case it differs + $amt = str_pad(substr($track,1),3,'0',STR_PAD_LEFT); + $amt = substr($amt,0,strlen($amt)-2).".".substr($amt,-2); + $IS4C_LOCAL->set("paycard_amount",$amt); + } + // ignore tracks with unrecognized start sentinels + // readers often put E? or something similar if they have trouble reading, + // even when they also provide entire usable tracks + } // foreach magstripe track + + // if we have track1, parse it + if( $tr1) { + $tr1a = explode('^', $tr1); + if( count($tr1a) != 3) + return -5; // can't parse track1 + $pan = substr($tr1a[0],1); + $exp = substr($tr1a[2],2,2) . substr($tr1a[2],0,2); // month and year are reversed on the track data + $tr1name = explode('/', $tr1a[1]); + if( count($tr1name) == 1) { + $name = trim($tr1a[1]); + } else { + $name = ""; + for( $x=1; isset($tr1name[$x]); $x++) + $name .= trim($tr1name[$x]) . " "; + $name = trim($name . trim($tr1name[0])); + } + } + + // if we have track2, parse it + if( $tr2) { + $tr2a = explode('=', $tr2); + if( count($tr2a) != 2) + return -6; // can't parse track2 + // if we don't have track1, just use track2's data + if( !$tr1) { + $pan = $tr2a[0]; + $exp = substr($tr2a[1],2,2) . substr($tr2a[1],0,2); // month and year are reversed on the track data + $name = "Customer"; + } else { + // if we have both, make sure they match + if( $tr2a[0] != $pan) + return -7; // PAN mismatch + else if( (substr($tr2a[1],2,2).substr($tr2a[1],0,2)) != $exp) + return -8; // exp mismatch + } + } + + if ($tr3){ + // format not well documented, very + // basic check for validity + if (strstr($tr3,"=")) $tr3 = false; + } + + // if we never got what we need (no track1 or track2), fail + if( !$pan || !$exp) + return -4; + + // ok + $output = array(); + $output['pan'] = $pan; + $output['exp'] = $exp; + $output['name'] = $name; + $output['tr1'] = $tr1; + $output['tr2'] = $tr2; + $output['tr3'] = $tr3; + return $output; +} // paycard_magstripe() + + + +// return a card number with digits replaced by *s, except for some number of leading or tailing digits as requested +function paycard_maskPAN($pan,$first,$last) { + $mask = ""; + // sanity check + $len = strlen($pan); + if( $first + $last >= $len) + return $pan; + // prepend requested digits + if( $first > 0) + $mask .= substr($pan, 0, $first); + // mask middle + $mask .= str_repeat("*", $len - ($first+$last)); + // append requested digits + if( $last > 0) + $mask .= substr($pan, -$last); + + return $mask; +} // paycard_maskPAN() + + +// helper function to format money amounts pre-php5 +function paycard_moneyFormat($amt) { + $sign = ""; + if( $amt < 0) { + $sign = "-"; + $amt = -$amt; + } + return $sign."$".number_format($amt,2); +} // paycard_moneyFormat + + +// helper function to build error messages +function paycard_errorText($title, $code, $text, $retry, $standalone, $refuse, $carbon, $tellIT, $type) { + global $IS4C_LOCAL; + + // pick the icon + if( $carbon) + $msg = "<img src='graphics/blacksquare.gif'> "; + else if( $refuse) + $msg = "<img src='graphics/bluetri.gif'> "; + else + $msg = "<img src='graphics/redsquare.gif'> "; + // write the text + $msg .= "<b>".trim($title)."</b>"; + //if( $code) + $msg .= "<br><font size=-2>(#R.".$code.")</font>"; + $msg .= "<font size=-1><br><br>"; + if( $text) + $msg .= $text."<br>"; + // write the options + $opt = ""; + if( $refuse) { $opt .= ($opt ? ", or" : "") . " request <b>other payment</b>"; } + if( $retry) { $opt .= ($opt ? ", or" : "") . " <b>retry</b>"; } + if( $standalone) { $opt .= ($opt ? ", or" : "") . " process in <b>standalone</b>"; } + if( $carbon) { + if( $type == PAYCARD_TYPE_CREDIT) { $opt .= ($opt ? ", or" : "") . " take a <b>carbon</b>"; } + else { $opt .= ($opt ? ", or" : "") . " process <b>manually</b>"; } + } + if( $opt) { $opt = "Please " . $opt . "."; } + if( $tellIT) { $opt = trim($opt." <i>(Notify IT)</i>"); } + if( $opt) + $msg .= $opt."<br>"; + $msg .= "<br>"; + // retry option? + if( $retry) { + $msg .= "[enter] to retry<br>"; + } else { + $IS4C_LOCAL->set("strEntered",""); + $IS4C_LOCAL->set("strRemembered",""); + } + $msg .= "[clear] to cancel</font>"; + return $msg; +} // paycard_errorText() + + +// display a paycard-related error due to cashier mistake +function paycard_msgBox($type, $title, $msg, $action) { + global $IS4C_LOCAL; + $header = "IS4C - Payment Card"; + if( $IS4C_LOCAL->get("paycard_type") == PAYCARD_TYPE_CREDIT) $header = "Wedge - Credit Card"; + else if( $IS4C_LOCAL->get("paycard_type") == PAYCARD_TYPE_GIFT) $header = "Wedge - Gift Card"; + else if( $IS4C_LOCAL->get("paycard_type") == PAYCARD_TYPE_STORE) $header = "Wedge - Wedge Card"; + $boxmsg = "<span class=\"larger\">".trim($title)."</span><p />"; + $boxmsg .= trim($msg)."<p />".trim($action); + return boxMsg($boxmsg,$header); +} // paycard_msgBox() + + +// display a paycard-related error due to system, network or other non-cashier mistake +function paycard_errBox($type, $title, $msg, $action) { + global $IS4C_LOCAL; + + $header = "Wedge - Payment Card"; + if( $IS4C_LOCAL->get("paycard_type") == PAYCARD_TYPE_CREDIT) $header = "Wedge - Credit Card"; + else if( $IS4C_LOCAL->get("paycard_type") == PAYCARD_TYPE_GIFT) $header = "Wedge - Gift Card"; + else if( $IS4C_LOCAL->get("paycard_type") == PAYCARD_TYPE_STORE) $header = "Wedge - Wedge Card"; + return xboxMsg("<b>".trim($title)."</b><p><font size=-1>".trim($msg)."<p>".trim($action)."</font>", $header); +} // paycard_errBox() + + +/* +summary of ISO standards for credit card magnetic stripe data tracks: +http://www.cyberd.co.uk/support/technotes/isocards.htm +(hex codes and character representations do not match ASCII - they are defined in the ISO spec) + +TRACK 1 + {S} start sentinel: 0x05 '%' + {C} format code: for credit cards, 0x22 'B' + {F} field seperator: 0x3F '^' + {E} end sentinel: 0x1F '?' + {V} checksum character + format: {S}{C}cardnumber{F}cardholdername{F}extra{E}{V} + 'extra' begins with expiration date as YYMM, then service code CCC, then unregulated extra data + length: 79 characters total + +TRACK 2 + {S} start sentinel: 0x0B ';' + {F} field seperator: 0x0D '=' + {E} end sentinel: 0x0F '?' + {V} checksum character + format: {S}cardnumber{F}extra{E}{V} + 'extra' begins with expiration date as YYMM, then service code CCC, then unregulated extra data + length: 40 characters total + +TRACK 3 + {S} start sentinel: 0x0B ';' + {C} format code: varies + {F} field seperator: 0x0D '=' + {E} end sentinel: 0x0F '?' + {V} checksum character + format: {S}{C}{C}data{F}data{E}{V} + length: 107 characters +*/ +?> diff --git a/pos/is4c-web/lib/paypal.php b/pos/is4c-web/lib/paypal.php new file mode 100644 index 000000000..a441629fc --- /dev/null +++ b/pos/is4c-web/lib/paypal.php @@ -0,0 +1,139 @@ +<?php +/******************************************************************************* + + Copyright 2011 Whole Foods Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + // session_start(); + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +define("PAYPAL_TEST_URL","https://api-3t.sandbox.paypal.com/nvp"); +define("PAYPAL_TEST_RD","https://www.sandbox.paypal.com/webscr"); + +define("PAYPAL_LIVE_URL","https://api-3t.paypal.com/nvp"); +define("PAYPAL_LIVE_RD","https://www.paypal.com/webscr"); + +define("PAYPAL_NVP_VERSION",63); +define("PAYPAL_LIVE",True); + +include_once($IS4C_PATH."lib/pp-api-credentials.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +/* utility to transform array to url-encoded + argument string */ +function argstring($arr){ + $ret = ""; + foreach($arr as $key=>$val){ + $ret .= $key."=".urlencode($val)."&"; + } + return substr($ret,0,strlen($ret)-1); +} + +/* set up arguments required on + all paypal NVP requests */ +function pp_init_args($method){ + $args = array( + 'METHOD' => $method, + 'USER' => (PAYPAL_LIVE ? PAYPAL_LIVE_UID : PAYPAL_TEST_UID), + 'PWD' => (PAYPAL_LIVE ? PAYPAL_LIVE_PWD : PAYPAL_TEST_PWD), + 'SIGNATURE' => (PAYPAL_LIVE ? PAYPAL_LIVE_KEY : PAYPAL_TEST_KEY), + 'VERSION' => PAYPAL_NVP_VERSION, + ); + return $args; +} + +/* submit request to paypal nvp, return + results as keyed array */ +function pp_do_curl($args){ + $curl_handle = curl_init((PAYPAL_LIVE ? PAYPAL_LIVE_URL : PAYPAL_TEST_URL)); + curl_setopt($curl_handle,CURLOPT_POST,True); + curl_setopt($curl_handle,CURLOPT_POSTFIELDS,argstring($args)); + curl_setopt($curl_handle, CURLOPT_HEADER, 0); + curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,15); + curl_setopt($curl_handle, CURLOPT_FAILONERROR,False); + curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,False); + curl_setopt($curl_handle, CURLOPT_FRESH_CONNECT,True); + curl_setopt($curl_handle, CURLOPT_TIMEOUT,30); + //curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + + $response = curl_exec($curl_handle); + $result = array(); + parse_str($response,$result); + return $result; +} + +/* Set up express checkout request + NOTE: redirects to paypal on success + + Returns paypal token on success, False on failure +*/ +function SetExpressCheckout($amt,$tax=0,$email=""){ + global $PAYPAL_URL_SUCCESS, $PAYPAL_URL_FAILURE; + $args = pp_init_args('SetExpressCheckout'); + $args['RETURNURL'] = $PAYPAL_URL_SUCCESS; + $args['CANCELURL'] = $PAYPAL_URL_FAILURE; + $args['PAYMENTREQUEST_0_AMT'] = $amt; + $args['PAYMENTREQUEST_0_TAXAMT'] = $tax; + $args['PAYMENTREQUEST_0_ITEMAMT'] = $amt - $tax; + $args['PAYMENTREQUEST_0_DESC'] = "WFC Purchase"; + $args['SOLUTIONTYPE'] = 'Sole'; + if (!empty($email)) + $args['EMAIL'] = $email; + + $result = pp_do_curl($args); + if ($result['ACK'] == 'Success' && isset($result['TOKEN'])){ + header("Location: ".(PAYPAL_LIVE ? PAYPAL_LIVE_RD : PAYPAL_TEST_RD)."?cmd=_express-checkout&token=".$result['TOKEN']); + return $result['TOKEN']; + } + else return False; +} + +/* Collect user information from paypal. + $token is a $_GET argument provided by paypal + when users return to our site + + Returns paypal response as keyed array +*/ +function GetExpressCheckoutDetails($token){ + $args = pp_init_args('GetExpressCheckoutDetails'); + $args['TOKEN'] = $token; + $result = pp_do_curl($args); + return $result; +} + +/* Finalize payment. Token and ppID (PAYERID) are + provided by paypal. + + Returns paypal response as keyed array +*/ +function DoExpressCheckoutPayment($token,$ppID,$amt){ + $args = pp_init_args('DoExpressCheckoutPayment'); + $args['TOKEN'] = $token; + $args['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Sale'; + $args['PAYERID'] = $ppID; + $args['PAYMENTREQUEST_0_AMT'] = $amt; + + $result = pp_do_curl($args); + return $result; +} + +?> diff --git a/pos/is4c-web/lib/prehkeys.php b/pos/is4c-web/lib/prehkeys.php new file mode 100644 index 000000000..83b6e6167 --- /dev/null +++ b/pos/is4c-web/lib/prehkeys.php @@ -0,0 +1,1065 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("addItem")) include($IS4C_PATH."lib/additem.php"); +if (!function_exists("truncate2")) include_once($IS4C_PATH."lib/lib.php"); +if (!function_exists("lastpage")) include($IS4C_PATH."lib/listitems.php"); +if (!function_exists("paycard_reset")) include($IS4C_PATH."lib/paycardLib.php"); +if (!function_exists("blueLine")) include($IS4C_PATH."lib/session.php"); +if (!function_exists("boxMsgscreen")) include($IS4C_PATH."lib/clientscripts.php"); + +function clearMember(){ + global $IS4C_LOCAL; + + memberReset(); + $db = tDataConnect(); + $db->query("UPDATE localtemptrans SET card_no=0,percentDiscount=NULL"); + $IS4C_LOCAL->set("ttlflag",0); +} + +function memberID($member_number) { + global $IS4C_LOCAL,$IS4C_PATH; + + $query = "select CardNo,personNum,LastName,FirstName,CashBack,Balance,Discount, + MemDiscountLimit,ChargeOk,WriteChecks,StoreCoupons,Type,memType,staff, + SSI,Purchases,NumberOfChecks,memCoupons,blueLine,Shown,id from custdata + where CardNo = '".$member_number."'"; + + $ret = array( + "main_frame"=>false, + "output"=>"", + "target"=>".baseHeight", + "redraw_footer"=>false + ); + + $db = pDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + + if ($num_rows == 1 && + ($member_number == $IS4C_LOCAL->get("defaultNonMem") + || ($member_number == 5607 && + $IS4C_LOCAL->get("requestType") == "member gift"))) { + $row = $db->fetch_array($result); + setMember($row["CardNo"], $row["personNum"],$row); + $ret['output'] = lastpage(); + } + + // special hard coding for member 5607 WFC + // needs to go away + if ($member_number == "5607"){ + if ($IS4C_LOCAL->get("requestType") == ""){ + $IS4C_LOCAL->set("requestType","member gift"); + $IS4C_LOCAL->set("requestMsg","Card for which member?"); + $ret['main_frame'] = $IS4C_PATH."gui-modules/requestInfo.php"; + $IS4C_LOCAL->set("strEntered","5607id"); + } + else if ($IS4C_LOCAL->get("requestType") == "member gift"){ + addcomment("CARD FOR #".$IS4C_LOCAL->get("requestMsg")); + $IS4C_LOCAL->set("requestType",""); + } + } + + $IS4C_LOCAL->set("idSearch",$member_number); + $IS4C_LOCAL->set("memberID","0"); + $IS4C_LOCAL->set("memType",0); + $IS4C_LOCAL->set("percentDiscount",0); + $IS4C_LOCAL->set("memMsg",""); + + if ($ret['main_frame'] === false) + $ret['main_frame'] = $IS4C_PATH."gui-modules/memlist.php"; + + return $ret; +} + +//------------------------------------------------- + +function setMember($member, $personNumber, $row) { + global $IS4C_LOCAL; + + $conn = pDataConnect(); + + $IS4C_LOCAL->set("memMsg",blueLine($row)); + $chargeOk = chargeOk(); + if ($IS4C_LOCAL->get("balance") != 0 && $member != $IS4C_LOCAL->get("defaultNonMem")) + $IS4C_LOCAL->set("memMsg",$IS4C_LOCAL->get("memMsg")." AR"); + + $IS4C_LOCAL->set("memberID",$member); + $IS4C_LOCAL->set("memType",$row["memType"]); + $IS4C_LOCAL->set("lname",$row["LastName"]); + $IS4C_LOCAL->set("fname",$row["FirstName"]); + $IS4C_LOCAL->set("Type",$row["Type"]); + $IS4C_LOCAL->set("percentDiscount",$row["Discount"]); + + $IS4C_LOCAL->set('inactMem',0); + if ($IS4C_LOCAL->get("Type") == "PC") { + $IS4C_LOCAL->set("isMember",1); + } else { + $IS4C_LOCAL->set("isMember",0); + if ($IS4C_LOCAL->get('Type') != 'REG') + $IS4C_LOCAL->set('inactMem',1); + } + + $IS4C_LOCAL->set("isStaff",$row["staff"]); + $IS4C_LOCAL->set("SSI",$row["SSI"]); + + if ($IS4C_LOCAL->get("SSI") == 1) + $IS4C_LOCAL->set("memMsg",$IS4C_LOCAL->get("memMsg")." #"); + + $conn2 = tDataConnect(); + $memquery = "update localtemptrans set card_no = '".$member."', + memType = ".$IS4C_LOCAL->get("memType").", + staff = ".$IS4C_LOCAL->get("isStaff"); + if ($IS4C_LOCAL->get("DBMS") == "mssql" && $IS4C_LOCAL->get("store") == "wfc") + $memquery = str_replace("staff","isStaff",$memquery); + + if ($IS4C_LOCAL->get("store") == "wedge") { + if ($IS4C_LOCAL->get("isMember") == 0 && $IS4C_LOCAL->get("percentDiscount") == 10) { + $memquery .= " , percentDiscount = 0 "; + } + elseif ($IS4C_LOCAL->get("isStaff") != 1 && $IS4C_LOCAL->get("percentDiscount") == 15) { + $memquery .= " , percentDiscount = 0 "; + } + } + + if ($IS4C_LOCAL->get("discountEnforced") != 0) { + if ($IS4C_LOCAL->get("percentDiscount") > 0) { + discountnotify($IS4C_LOCAL->get("percentDiscount")); + } + $memquery .= " , percentDiscount = ".$IS4C_LOCAL->get("percentDiscount")." "; + } + else if ($IS4C_LOCAL->get("discountEnforced") == 0 && $IS4C_LOCAL->get("tenderTotal") == 0) { + $memquery .= " , percentDiscount = 0 "; + } + + $conn2->query($memquery); + + if ($IS4C_LOCAL->get("isStaff") == 0) { + $IS4C_LOCAL->set("staffSpecial",0); + } + + if ($IS4C_LOCAL->get("unlock") != 1) { + ttl(); + } + $IS4C_LOCAL->set("unlock",0); + + if ($IS4C_LOCAL->get("mirequested") == 1) { + $IS4C_LOCAL->set("mirequested",0); + $IS4C_LOCAL->set("runningTotal",$IS4C_LOCAL->get("amtdue")); + tender("MI", $IS4C_LOCAL->get("runningTotal") * 100); + } + + //return check_unpaid_ar($member); +} + +function check_unpaid_ar($cardno){ + global $IS4C_LOCAL; + + // only attempt if server is available + // and not the default non-member + if ($cardno == $IS4C_LOCAL->get("defaultNonMem")) return False; + if ($IS4C_LOCAL->get("standalone") == 1) return False; + if ($IS4C_LOCAL->get("balance") == 0) return False; + + $db = mDataConnect(); + + if (!$db->table_exists("unpaid_ar_today")) return False; + + $query = "SELECT old_balance,recent_payments FROM unpaid_ar_today + WHERE card_no = $cardno"; + $result = $db->query($query); + + // should always be a row, but just in case + if ($db->num_rows($result) == 0) return False; + $row = $db->fetch_row($result); + + $bal = $row["old_balance"]; + $paid = $row["recent_payments"]; + if ($IS4C_LOCAL->get("memChargeTotal") > 0) + $paid += $IS4C_LOCAL->get("memChargeTotal"); + + if ($bal <= 0) return False; + if ($paid >= $bal) return False; + + // only case where customer prompt should appear + if ($bal > 0 && $paid < $bal){ + $IS4C_LOCAL->set("old_ar_balance",$bal - $paid); + return True; + } + + // just in case i forgot anything... + return False; +} + + +//------------------------------------------------- + +function checkstatus($num) { + global $IS4C_LOCAL; + + if (!$num) { + $num = 0; + } + + $query = "select voided,unitPrice,discountable, + discounttype,trans_status + from localtemptrans where trans_id = ".$num; + + $db = tDataConnect(); + $result = $db->query($query); + + + $num_rows = $db->num_rows($result); + + if ($num_rows > 0) { + $row = $db->fetch_array($result); + $IS4C_LOCAL->set("voided",$row["voided"]); + $IS4C_LOCAL->set("scaleprice",$row["unitPrice"]); + $IS4C_LOCAL->set("discountable",$row["discountable"]); + $IS4C_LOCAL->set("discounttype",$row["discounttype"]); + $IS4C_LOCAL->set("caseprice",$row["unitPrice"]); + + if ($row["trans_status"] == "V") { + $IS4C_LOCAL->set("transstatus","V"); + } + +// added by apbw 6/04/05 to correct voiding of refunded items + + if ($row["trans_status"] == "R") { + $IS4C_LOCAL->set("refund",1); + $IS4C_LOCAL->set("autoReprint",1); + } + + } + + $db->close(); +} + +//--------------------------------------------------- + +function tender($right, $strl) { + global $IS4C_LOCAL; + $tender_upc = ""; + + $ret = array('main_frame'=>false, + 'redraw_footer'=>false, + 'target'=>'.baseHeight', + 'output'=>""); + + if ($IS4C_LOCAL->get("LastID") == 0){ + $ret['output'] = boxMsg("No transaction in progress"); + return $ret; + } + elseif ($strl > 999999){ + $ret['output'] = xboxMsg("tender amount of ".truncate2($strl/100)."<BR>exceeds allowable limit"); + return $ret; + } + elseif ($right == "WT"){ + $ret['output'] = xboxMsg("WIC tender not applicable"); + return $ret; + } + elseif ($right == "CK" && $IS4C_LOCAL->get("ttlflag") == 1 && ($IS4C_LOCAL->get("isMember") != 0 || $IS4C_LOCAL->get("isStaff") != 0) && (($strl/100 - $IS4C_LOCAL->get("amtdue") - 0.005) > $IS4C_LOCAL->get("dollarOver")) && ($IS4C_LOCAL->get("cashOverLimit") == 1)){ + $ret['output'] = boxMsg("member or staff check tender cannot + exceed total purchase by over $".$IS4C_LOCAL->get("dollarOver")); + return $ret; + } + elseif ((($right == "CC" || $right == "TB" || $right == "GD") && $strl/100 > ($IS4C_LOCAL->get("amtdue") + 0.005)) && $IS4C_LOCAL->get("amtdue") >= 0){ + $ret['output'] = xboxMsg("tender cannot exceed purchase amount"); + return $ret; + } + elseif($right == "EC" && $strl/100 > $IS4C_LOCAL->get("amtdue")){ + $ret['output'] = xboxMsg("no cash back with EBT cash tender"); + return $ret; + } + elseif($right == "CK" && $IS4C_LOCAL->get("ttlflag") == 1 && $IS4C_LOCAL->get("isMember") == 0 and $IS4C_LOCAL->get("isStaff") == 0 && ($strl/100 - $IS4C_LOCAL->get("amtdue") - 0.005) > 5){ + $ret['output'] = xboxMsg("non-member check tender cannot exceed total purchase by over $5.00"); + return $ret; + } + + getsubtotals(); + + if ($IS4C_LOCAL->get("ttlflag") == 1 && ($right == "CX" || $right == "MI")) { // added ttlflag on 2/28/05 apbw + + $charge_ok = chargeOk(); + if ($right == "CX" && $charge_ok == 1 && strlen($IS4C_LOCAL->get("memberID")) == 5 && substr($IS4C_LOCAL->get("memberID"), 0, 1) == "5") $charge_ok = 1; + elseif ($right == "MI" && $charge_ok == 1) $charge_ok = 1; + else $charge_ok = 0; + } + + /* when processing as strings, weird things happen + * in excess of 1000, so use floating point */ + $strl .= ""; // force type to string + $mult = 1; + if ($strl[0] == "-"){ + $mult = -1; + $strl = substr($strl,1,strlen($strl)); + } + $dollars = (int)substr($strl,0,strlen($strl)-2); + $cents = ((int)substr($strl,-2))/100.0; + $strl = (double)($dollars+round($cents,2)); + $strl *= $mult; + + if ($IS4C_LOCAL->get("ttlflag") == 0) { + $ret['output'] = boxMsg("transaction must be totaled before tender can be accepted"); + return $ret; + } + elseif (($right == "FS" || $right == "EF") && $IS4C_LOCAL->get("fntlflag") == 0) { + $ret['output'] = boxMsg("eligble amount must be totaled before foodstamp tender can be accepted"); + return $ret; + } + elseif ($right == "EF" && $IS4C_LOCAL->get("fntlflag") == 1 && $IS4C_LOCAL->get("fsEligible") + 10 <= $strl) { + $ret['output'] = xboxMsg("Foodstamp tender cannot exceed elible amount by pver $10.00"); + return $ret; + } + elseif ($right == "CX" && $charge_ok == 0) { + $ret['output'] = xboxMsg("member ".$IS4C_LOCAL->get("memberID")."<BR>is not authorized<BR>to make corporate charges"); + return $ret; + } + //alert customer that charge exceeds avail balance + elseif ($right == "MI" && $charge_ok == 0 && $IS4C_LOCAL->get("availBal") < 0) { + $ret['output'] = xboxMsg("member ".$IS4C_LOCAL->get("memberID")."<BR> has $" . $IS4C_LOCAL->get("availBal") . " available."); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 1 && $IS4C_LOCAL->get("availBal") < 0) { + $ret['output'] = xboxMsg("member ".$IS4C_LOCAL->get("memberID")."<BR>is overlimit"); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 0) { + $ret['output'] = xboxMsg("member ".$IS4C_LOCAL->get("memberID")."<BR>is not authorized to make employee charges"); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 1 && ($IS4C_LOCAL->get("availBal") + $IS4C_LOCAL->get("memChargeTotal") - $strl) < 0) { + $ret['output'] = xboxMsg("member ".$IS4C_LOCAL->get("memberID")."<br> bhas exceeded charge limit"); + return $ret; + } + elseif ($right == "MI" && $charge_ok == 1 && (ABS($IS4C_LOCAL->get("memChargeTotal"))+ $strl) >= ($IS4C_LOCAL->get("availBal") + 0.005) && $IS4C_LOCAL->get("store")=="WFC") { + $memChargeRemain = $IS4C_LOCAL->get("availBal"); + $memChargeCommitted = $memChargeRemain + $IS4C_LOCAL->get("memChargeTotal"); + $ret['output'] = xboxMsg("available balance for charge <br>is only $" .$memChargeCommitted. ".<br><b><font size = 5>$" . number_format($memChargeRemain,2) . "</font></b><br>may still be used on this purchase."); + return $ret; + } + elseif(($right == "MI" || $right == "CX") && truncate2($IS4C_LOCAL->get("amtdue")) < truncate2($strl)) { + $ret['output'] = xboxMsg("charge tender exceeds purchase amount"); + return $ret; + } + + $db = pDataConnect(); + $query = "select TenderID,TenderCode,TenderName,TenderType, + ChangeMessage,MinAmount,MaxAmount,MaxRefund from + tenders where tendercode = '".$right."'"; + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + + if ($num_rows == 0) { + $ret['output'] = inputUnknown(); + return $ret; + } + + $row = $db->fetch_array($result); + $tender_code = $right; + $tendered = -1 * $strl; + + if($tender_code == "CC" && $IS4C_LOCAL->get("CCintegrate") == 1) { + $tender_upc = $IS4C_LOCAL->get("troutd"); + } + $tender_desc = $row["TenderName"]; + $IS4C_LOCAL->set("tenderamt",$strl); + $unit_price = 0; + + if ($tender_code == "FS") { + $IS4C_LOCAL->set("boxMsg","WFC no longer excepts paper foods stamps. Please choose a different tender type"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($tender_code == "CP" && $strl > $row["MaxAmount"] && $IS4C_LOCAL->get("msgrepeat") == 0){ + $IS4C_LOCAL->set("boxMsg","$".$strl." is greater than coupon limit<P>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($strl > $row["MaxAmount"] && $IS4C_LOCAL->get("msgrepeat") == 0){ + $IS4C_LOCAL->set("boxMsg","$".$strl." is greater than tender limit " + ."for ".$row['TenderName']."<p>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "GD" || $right == "TC"){ + $IS4C_LOCAL->set("autoReprint",1); + } + + if ($strl - $IS4C_LOCAL->get("amtdue") > 0) { + $IS4C_LOCAL->set("change",$strl - $IS4C_LOCAL->get("amtdue")); + } + else { + $IS4C_LOCAL->set("change",0); + } + + $ref = trim($IS4C_LOCAL->get("CashierNo"))."-" + .trim($IS4C_LOCAL->get("laneno"))."-" + .trim($IS4C_LOCAL->get("transno")); + if ($right == "CK" && $IS4C_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($IS4C_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $IS4C_LOCAL->set("boxMsg",$msg); + $IS4C_LOCAL->set("endorseType","check"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "TV" && $IS4C_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert travelers check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($IS4C_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $IS4C_LOCAL->set("boxMsg",$msg); + $IS4C_LOCAL->set("endorseType","check"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "RC" && $IS4C_LOCAL->get("msgrepeat") == 0) { + $msg = "<BR>insert rebate check</B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"; + if ($IS4C_LOCAL->get("LastEquityReference") == $ref){ + $msg .= "<div style=\"background:#993300;color:#ffffff; + margin:3px;padding: 3px;\"> + There was an equity sale on this transaction. Did it get + endorsed yet?</div>"; + } + $IS4C_LOCAL->set("boxMsg",$msg); + $IS4C_LOCAL->set("endorseType","check"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + elseif ($right == "TC" && $IS4C_LOCAL->get("msgrepeat") == 0) { + $IS4C_LOCAL->set("boxMsg","<B> insert gift certificate<B><BR>press [enter] to endorse<P><FONT size='-1'>[clear] to cancel</FONT>"); + $IS4C_LOCAL->set("endorseType","check"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + return $ret; + } + + if ($tender_code == "TV") + addItem($tender_upc, $tender_desc, "T", "CK", "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + elseif ($tender_code == "RC"){ + addItem($tender_upc, $tender_desc, "T", "CK", "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + else + addItem($tender_upc, $tender_desc, "T", $tender_code, "", 0, 0, $unit_price, $tendered, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + $IS4C_LOCAL->set("msgrepeat",0); + $IS4C_LOCAL->set("TenderType",$tender_code); /***added by apbw 2/1/05 SCR ***/ + + if ($IS4C_LOCAL->get("TenderType") == "MI" || $IS4C_LOCAL->get("TenderType") == "CX") { // apbw 2/28/05 SCR + $IS4C_LOCAL->set("chargetender",1); // apbw 2/28/05 SCR + } // apbw 2/28/05 SCR + + getsubtotals(); + + if ($right == "FS" || $right == "EF") { + addfsTaxExempt(); + } + + if ($right == "FS") { + $fs = -1 * $IS4C_LOCAL->get("fsEligible"); + $fs_ones = (($fs * 100) - (($fs * 100) % 100))/100; + $fs_change = $fs - $fs_ones; + + if ($fs_ones > 0) { + addfsones($fs_ones); + } + + if ($fs_change > 0) { + addchange($fs_change); + } + getsubtotals(); + } + + if ($IS4C_LOCAL->get("amtdue") <= 0.005) { + if ($IS4C_LOCAL->get("paycard_mode") == PAYCARD_MODE_AUTH + && ($right == "CC" || $right == "GD")){ + $IS4C_LOCAL->set("change",0); + $IS4C_LOCAL->set("fntlflag",0); + $chk = ttl(); + if ($chk === True) + $ret['output'] = lastpage(); + else + $ret['main_frame'] = $chk; + return $ret; + } + + $IS4C_LOCAL->set("change",-1 * $IS4C_LOCAL->get("amtdue")); + $cash_return = $IS4C_LOCAL->get("change"); + + if ($right != "FS") { + addchange($cash_return); + } + + if ($right == "CK" && $cash_return > 0) + $IS4C_LOCAL->set("cashOverAmt",1); // apbw/cvr 3/5/05 cash back beep + + $IS4C_LOCAL->set("End",1); + $IS4C_LOCAL->set("beep","rePoll"); + $IS4C_LOCAL->set("receiptType","full"); + $ret['receipt'] = 'full'; + $ret['output'] = printReceiptfooter(); + } + else { + $IS4C_LOCAL->set("change",0); + $IS4C_LOCAL->set("fntlflag",0); + $chk = ttl(); + if ($chk === True) + $ret['output'] = lastpage(); + else + $ret['main_frame'] = $chk; + } + $ret['redraw_footer'] = true; + return $ret; +} + +//------------------------------------------------------- + +function deptkey($price, $dept,$ret=array()) { + global $IS4C_LOCAL; + + $intvoided = 0; + + if ($IS4C_LOCAL->get("quantity") == 0 && $IS4C_LOCAL->get("multiple") == 0) { + $IS4C_LOCAL->set("quantity",1); + } + + if (!is_numeric($dept) || !is_numeric($price) || strlen($price) < 1 || strlen($dept) < 2) { + $ret['output'] = inputUnknown(); + $IS4C_LOCAL->set("quantity",1); + $ret['udpmsg'] = 'errorBeep'; + return $ret; + } + + $strprice = $price; + $strdept = $dept; + $price = $price/100; + $dept = $dept/10; + + /* auto reprint on ar */ + if ($dept == 990){ + $IS4C_LOCAL->set("autoReprint",1); + } + /* auto reprint on gift card sales */ + if ($dept == 902) + $IS4C_LOCAL->set("autoReprint",1); + + if ($IS4C_LOCAL->get("casediscount") > 0 && $IS4C_LOCAL->get("casediscount") <= 100) { + $case_discount = (100 - $IS4C_LOCAL->get("casediscount"))/100; + $price = $case_discount * $price; + } + $total = $price * $IS4C_LOCAL->get("quantity"); + $intdept = $dept; + + $query = "select dept_no,dept_name,dept_tax,dept_fs,dept_limit, + dept_minimum,dept_discount from departments where dept_no = ".$intdept; + $db = pDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + if ($num_rows == 0) { + $ret['output'] = boxMsg("department unknown"); + $ret['udpmsg'] = 'errorBeep'; + $IS4C_LOCAL->set("quantity",1); + } + elseif ($IS4C_LOCAL->get("mfcoupon") == 1) { + $row = $db->fetch_array($result); + $IS4C_LOCAL->set("mfcoupon",0); + $query2 = "select department, sum(total) as total from localtemptrans where department = " + .$dept." group by department"; + + $db2 = tDataConnect(); + $result2 = $db2->query($query2); + + $num_rows2 = $db2->num_rows($result2); + if ($num_rows2 == 0) { + $ret['output'] = boxMsg("no item found in<BR>".$row["dept_name"]); + $ret['udpmsg'] = 'errorBeep'; + } + else { + $row2 = $db2->fetch_array($result2); + if ($price > $row2["total"]) { + $ret['output'] = boxMsg("coupon amount greater than department total"); + $ret['udpmsg'] = 'errorBeep'; + } + else { + addItem("", $row["dept_name"]." Coupon", "I", "CP", "C", $dept, 1, -1 * $price, -1 * $price, -1 * $price, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, $intvoided); + $IS4C_LOCAL->set("ttlflag",0); + //$IS4C_LOCAL->set("ttlrequested",0); + $IS4C_LOCAL->set("beep","goodBeep"); + $ret['output'] = lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + } + } + } + else { + $row = $db->fetch_array($result); + if (!$row["dept_limit"]) $deptmax = 0; + else $deptmax = $row["dept_limit"]; + + if (!$row["dept_minimum"]) $deptmin = 0; + else $deptmin = $row["dept_minimum"]; + $tax = $row["dept_tax"]; + + if ($row["dept_fs"] != 0) $foodstamp = 1; + else $foodstamp = 0; + + $deptDiscount = $row["dept_discount"]; + + if ($IS4C_LOCAL->get("toggleDiscountable") == 1) { + $IS4C_LOCAL->set("toggleDiscountable",0); + if ($deptDiscount == 0) { + $deptDiscount = 1; + } else { + $deptDiscount = 0; + } + } + + if ($IS4C_LOCAL->get("togglefoodstamp") == 1) { + $foodstamp = ($foodstamp + 1) % 2; + $IS4C_LOCAL->set("togglefoodstamp",0); + } + + // Hard coding starts + if ($dept == 606) { + $price = -1 * $price; + $total = -1 * $total; + } + // Hard coding ends + + if ($IS4C_LOCAL->get("ddNotify") != 0 && $IS4C_LOCAL->get("itemPD") == 10) { + $IS4C_LOCAL->set("itemPD",0); + $deptDiscount = 7; + $intvoided = 22; + } + + if ($price > $deptmax && $IS4C_LOCAL->get("msgrepeat") == 0) { + + $IS4C_LOCAL->set("boxMsg","$".$price." is greater than department limit<P>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + } + elseif ($price < $deptmin && $IS4C_LOCAL->get("msgrepeat") == 0) { + $IS4C_LOCAL->set("boxMsg","$".$price." is lower than department minimum<P>" + ."<FONT size='-1'>[clear] to cancel, [enter] to proceed</FONT>"); + $ret['main_frame'] = '/gui-modules/boxMsg2.php'; + } + else { + if ($IS4C_LOCAL->get("casediscount") > 0) { + addcdnotify(); + $IS4C_LOCAL->set("casediscount",0); + } + + if ($IS4C_LOCAL->get("toggletax") == 1) { + if ($tax > 0) $tax = 0; + else $tax = 1; + $IS4C_LOCAL->set("toggletax",0); + } + + if ($dept == "77"){ + $db2 = tDataConnect(); + $taxratesQ = "SELECT rate FROM taxrates WHERE id=$tax"; + $taxratesR = $db2->query($taxratesQ); + $rate = array_pop($db2->fetch_row($taxratesR)); + + $price /= (1+$rate); + $price = truncate2($price); + $total = $price * $IS4C_LOCAL->get("quantity"); + } + + addItem($price."DP".$dept, $row["dept_name"], "D", " ", " ", $dept, $IS4C_LOCAL->get("quantity"), $price, $total, $price, 0 ,$tax, $foodstamp, 0, 0, $deptDiscount, 0, $IS4C_LOCAL->get("quantity"), 0, 0, 0, 0, 0, $intvoided); + $IS4C_LOCAL->set("ttlflag",0); + //$IS4C_LOCAL->set("ttlrequested",0); + $ret['output'] = lastpage(); + $ret['redraw_footer'] = True; + $ret['udpmsg'] = 'goodBeep'; + $IS4C_LOCAL->set("msgrepeat",0); + } + } + + $IS4C_LOCAL->set("quantity",0); + $IS4C_LOCAL->set("itemPD",0); + + return $ret; +} + +//------------------------------------------------- + +// return value: true on success, URL on failure +function ttl() { + global $IS4C_LOCAL,$IS4C_PATH; + + if ($IS4C_LOCAL->get("memberID") == "0") { + return $IS4C_PATH."gui-modules/memlist.php"; + } + else { + $mconn = tDataConnect(); + $query = ""; + $query2 = ""; + if ($IS4C_LOCAL->get("isMember") == 1) { + $cols = localMatchingColumns($mconn,"localtemptrans","memdiscountadd"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountadd"; + } else { + $cols = localMatchingColumns($mconn,"localtemptrans","memdiscountremove"); + $query = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM memdiscountremove"; + } + + if ($IS4C_LOCAL->get("isStaff") != 0) { + $cols = localMatchingColumns($mconn,"localtemptrans","staffdiscountadd"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountadd"; + } else { + $cols = localMatchingColumns($mconn,"localtemptrans","staffdiscountremove"); + $query2 = "INSERT INTO localtemptrans ({$cols}) SELECT {$cols} FROM staffdiscountremove"; + } + + $result = $mconn->query($query); + $result2 = $mconn->query($query2); + + $IS4C_LOCAL->set("ttlflag",1); + setglobalvalue("TTLFlag", 1); + $temp = chargeOk(); + if ($IS4C_LOCAL->get("balance") < $IS4C_LOCAL->get("memChargeTotal") && $IS4C_LOCAL->get("memChargeTotal") > 0){ + if ($IS4C_LOCAL->get("warned") == 1 and $IS4C_LOCAL->get("warnBoxType") == "warnOverpay"){ + $IS4C_LOCAL->set("warned",0); + $IS4C_LOCAL->set("warnBoxType",""); + } + else { + $IS4C_LOCAL->set("warned",1); + $IS4C_LOCAL->set("warnBoxType","warnOverpay"); + $IS4C_LOCAL->set("boxMsg",sprintf("<b>A/R Imbalance</b><br />Total AR payments $%.2f exceeds AR balance %.2f<br /><font size=-1>[enter] to continue, [clear] to cancel</font>", + $IS4C_LOCAL->get("memChargeTotal"), + $IS4C_LOCAL->get("balance"))); + $IS4C_LOCAL->set("strEntered","TL"); + return $IS4C_PATH."gui-modules/boxMsg2.php"; + } + } + else { + $IS4C_LOCAL->set("warned",0); + $IS4C_LOCAL->set("warnBoxType",""); + } + + if ($IS4C_LOCAL->get("percentDiscount") > 0) { + addItem("", $IS4C_LOCAL->get("percentDiscount")."% Discount", "C", "", "D", 0, 0, truncate2(-1 * $IS4C_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + $amtDue = str_replace(",", "", $IS4C_LOCAL->get("amtdue")); + + // check in case something else like an + // approval code is already being sent + // to the cc terminal + if ($IS4C_LOCAL->get("ccTermOut")=="idle"){ + $IS4C_LOCAL->set("ccTermOut","total:". + str_replace(".","",sprintf("%.2f",$amtDue))); + } + + $peek = peekItem(); + if (substr($peek,0,9) != "Subtotal "){ + addItem("", "Subtotal ".truncate2($IS4C_LOCAL->get("subtotal")).", Tax ".truncate2($IS4C_LOCAL->get("taxTotal")), "C", "", "D", 0, 0, $amtDue, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3); + } + + if ($IS4C_LOCAL->get("fntlflag") == 1) { + addItem("", "Foodstamps Eligible", "", "", "D", 0, 0, truncate2($IS4C_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + } + return True; +} + +function peekItem(){ + $db = tDataConnect(); + $q = "SELECT description FROM localTempTrans ORDER BY trans_id DESC"; + $r = $db->query($q); + $w = $db->fetch_row($r); + return (isset($w['description'])?$w['description']:''); +} + +//--------------------------------------- + +function finalttl() { + global $IS4C_LOCAL; + if ($IS4C_LOCAL->get("percentDiscount") > 0) { + addItem("", "Discount", "C", "", "D", 0, 0, truncate2(-1 * $IS4C_LOCAL->get("transDiscount")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5); + } + + addItem("Subtotal", "Subtotal", "C", "", "D", 0, 0, truncate2($IS4C_LOCAL->get("taxTotal") - $IS4C_LOCAL->get("fsTaxExempt")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11); + + + if ($IS4C_LOCAL->get("fsTaxExempt") != 0) { + addItem("Tax", truncate2($IS4C_LOCAL->get("fstaxable"))." Taxable", "C", "", "D", 0, 0, truncate2($IS4C_LOCAL->get("fsTaxExempt")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + } + + addItem("Total", "Total", "C", "", "D", 0, 0, truncate2($IS4C_LOCAL->get("amtdue")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11); + +} + +//--------------------------------------- + +//------------------------------------------- + +function fsEligible() { + global $IS4C_LOCAL; + getsubtotals(); + if ($IS4C_LOCAL->get("fsEligible") < 0 && False) { + $IS4C_LOCAL->set("boxMsg","Foodstamp eligible amount inapplicable<P>Please void out earlier tender and apply foodstamp first"); + return $IS4C_PATH."gui-modules/boxMsg2.php"; + } + else { + $IS4C_LOCAL->set("fntlflag",1); + setglobalvalue("FntlFlag", 1); + if ($IS4C_LOCAL->get("ttlflag") != 1) return ttl(); + else addItem("", "Foodstamps Eligible", "" , "", "D", 0, 0, truncate2($IS4C_LOCAL->get("fsEligible")), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7); + + return True; + } +} + +//------------------------------------------ + +function percentDiscount($strl,$json=array()) { + if ($strl == 10.01) $strl = 10; + + if (!is_numeric($strl) || $strl > 100 || $strl < 0) $json['output'] = boxMsg("discount invalid"); + else { + $query = "select sum(total) as total from localtemptrans where upc = '0000000008005' group by upc"; + + $db = tDataConnect(); + $result = $db->query($query); + + $num_rows = $db->num_rows($result); + if ($num_rows == 0) $couponTotal = 0; + else { + $row = $db->fetch_array($result); + $couponTotal = nullwrap($row["total"]); + } + if ($couponTotal == 0 || $strl == 0) { + + if ($strl != 0) discountnotify($strl); + $db->query("update localtemptrans set percentDiscount = ".$strl); + $chk = ttl(); + if ($chk !== True) + $json['main_frame'] = $chk; + $json['output'] = lastpage(); + } + else $json['output'] = xboxMsg("10% discount already applied"); + $db->close(); + } + return $json; +} + +//------------------------------------------ + +function chargeOk() { + global $IS4C_LOCAL; + + getsubtotals(); + + // change the connection based on standalone status, rather + // than the query - andy 8/31/07 + $conn = -1; + $query = "select availBal,balance from memchargebalance where CardNo = '".$IS4C_LOCAL->get("memberID")."'"; + if ($IS4C_LOCAL->get("standalone") == 0 || False) { + $conn = mDataConnect(); + } + else { + $conn = pDataConnect(); + } + + $result = $conn->query($query); + $num_rows = $conn->num_rows($result); + $row = $conn->fetch_array($result); + + $availBal = $row["availBal"] + $IS4C_LOCAL->get("memChargeTotal"); + + $IS4C_LOCAL->set("balance",$row["balance"]); + $IS4C_LOCAL->set("availBal",number_format($availBal,2,'.','')); + + // switch back to local DB if need be + if ($IS4C_LOCAL->get("standalone") == 0) + $conn = pDataConnect(); + + $query2 = "select Balance, MemDiscountLimit, ChargeOk from custdata where CardNo = '".$IS4C_LOCAL->get("memberID")."'"; + $result2 = $conn->query($query2); + $num_rows2 = $conn->num_rows($result2); + $row2 = $conn->fetch_array($result2); + + + $chargeOk = 1; + if ($num_rows2 == 0 || !$row2["ChargeOk"]) { + $chargeOk = 0; + } + elseif ( $row2["ChargeOk"] == 0 ) { + + $chargeOk = 0; + } + + return $chargeOk; + +} + +//---------------------------------------------------------- + +function madCoupon(){ + getsubtotals(); + addMadCoup(); + lastpage(); + +} + +function comment($comment){ + addComment($comment); + lastpage(); +} +//---------------------------------------------------------- + +function staffCharge($arg,$json=array()) { + global $IS4C_LOCAL; + + $IS4C_LOCAL->set("sc",1); + $staffID = substr($arg, 0, 4); + + $pQuery = "select staffID,chargecode,blueLine from chargecodeview where chargecode = '".$arg."'"; + $pConn = pDataConnect(); + $result = $pConn->query($pQuery); + $num_rows = $pConn->num_rows($result); + $row = $pConn->fetch_array($result); + + if ($num_rows == 0) { + $json['output'] = xboxMsg("unable to authenticate staff ".$staffID); + $IS4C_LOCAL->set("isStaff",0); // apbw 03/05/05 SCR + return $json; + } + else { + $IS4C_LOCAL->set("isStaff",1); // apbw 03/05/05 SCR + $IS4C_LOCAL->set("memMsg",$row["blueLine"]); + $tQuery = "update localtemptrans set card_no = '".$staffID."', percentDiscount = 15"; + $tConn = tDataConnect(); + + addscDiscount(); + discountnotify(15); + $tConn->query($tQuery); + getsubtotals(); + + $chk = ttl(); + if ($chk !== True){ + $json['main_frame'] = $chk; + return $json; + } + $IS4C_LOCAL->set("runningTotal",$IS4C_LOCAL->get("amtdue")); + return tender("MI", $IS4C_LOCAL->get("runningTotal") * 100); + + } + +} + +function endofShift($json) { + global $IS4C_LOCAL; + + $IS4C_LOCAL->set("memberID","99999"); + $IS4C_LOCAL->set("memMsg","End of Shift"); + addEndofShift(); + getsubtotals(); + $chk = ttl(); + if ($chk !== True){ + $json['main_frame'] = $chk; + return $json; + } + $IS4C_LOCAL->set("runningtotal",$IS4C_LOCAL->get("amtdue")); + return tender("CA", $IS4C_LOCAL->get("runningtotal") * 100); +} + +//--------------------------- WORKING MEMBER DISCOUNT -------------------------- +function wmdiscount() { + global $IS4C_LOCAL; + + $sconn = mDataConnect(); + $conn2 = tDataConnect(); + + $volQ = "SELECT * FROM is4c_op.volunteerDiscounts WHERE CardNo = ".$IS4C_LOCAL->get("memberID"); + + $volR = $sconn->query($volQ); + $row = $sconn->fetch_array($volR); + $total = $row["total"]; + + if ($row["staff"] == 3) { + if ($IS4C_LOCAL->get("discountableTotal") > $total) { + $a = $total * .15; // apply 15% disocunt + $b = ($IS4C_LOCAL->get("discountableTotal") - $total) * .02 ; // apply 2% discount + $c = $a + $b; + $aggdisc = number_format(($c / $IS4C_LOCAL->get("discountableTotal")) * 100,2); // aggregate discount + + $IS4C_LOCAL->set("transDiscount",$c); + $IS4C_LOCAL->set("percentDiscount",$aggdisc); + } + elseif ($IS4C_LOCAL->get("discountableTotal") <= $total) { + $IS4C_LOCAL->set("percentDiscount",15); + $IS4C_LOCAL->set("transDiscount",$IS4C_LOCAL->get("discountableTotal") * .15); + } + } + elseif ($row["staff"] == 6) { + if ($IS4C_LOCAL->get("discountableTotal") > $total) { + $a = $total * .05; // apply 15% disocunt + $aggdisc = number_format(($a / $IS4C_LOCAL->get("discountableTotal")) * 100,2); // aggregate discount + + $IS4C_LOCAL->set("transDiscount",$a); + $IS4C_LOCAL->set("percentDiscount",$aggdisc); + } + elseif ($IS4C_LOCAL->get("discountableTotal") <= $total) { + $IS4C_LOCAL->set("percentDiscount",5); + $IS4C_LOCAL->set("transDiscount",$IS4C_LOCAL->get("discountableTotal") * .05); + } + } + +// discountnotify($IS4C_LOCAL->get("percentDiscount")); + $conn2->query("update localtemptrans set percentDiscount = ".$IS4C_LOCAL->get("percentDiscount")); + + if ($IS4C_LOCAL->get("discountableTotal") < $total) { + $a = number_format($IS4C_LOCAL->get("discountableTotal") / 20,2); + $arr = explode(".",$a); + if ($arr[1] >= 75 && $arr[1] != 00) $dec = 75; + elseif ($arr[1] >= 50 && $arr[1] < 75) $dec = 50; + elseif ($arr[1] >= 25 && $arr[1] < 50) $dec = 25; + elseif ($arr[1] >= 00 && $arr[1] < 25) $dec = 00; + + $IS4C_LOCAL->set("volunteerDiscount",$arr[0]. "." .$dec); + } + else { + $IS4C_LOCAL->set("volunteerDiscount",$total / 20); + } + +// echo "voldisc: " .$IS4C_LOCAL->get("volunteerDiscount"); +} +//------------------------- END WORKING MEMBER DISCOUNT ------------------------- +?> diff --git a/pos/is4c-web/lib/printLib.php b/pos/is4c-web/lib/printLib.php new file mode 100644 index 000000000..7ceacf041 --- /dev/null +++ b/pos/is4c-web/lib/printLib.php @@ -0,0 +1,902 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("truncate2")) include_once($IS4C_PATH."lib/lib.php"); +if (!function_exists("chargeOK")) include_once($IS4C_PATH."lib/prehkeys.php"); + +if (!class_exists("ESCPOSPrintHandler")) include_once($IS4C_PATH."lib/PrintHandlers/ESCPOSPrintHandler.class.php"); +if (!class_exists("Bitmap")) include_once($IS4C_PATH."lib/Bitmap4.class.php"); + +if (!isset($IS4C_LOCAL)) include_once($IS4C_PATH."lib/LocalStorage/conf.php"); + +// -------------------------------------------------------------- +function build_time($timestamp) { + + return strftime("%m/%d/%y %I:%M %p", $timestamp); +} +// -------------------------------------------------------------- +function centerString($text) { + + return center($text, 59); +} +// -------------------------------------------------------------- +function writeLine($text) { + global $IS4C_LOCAL; + + if ($IS4C_LOCAL->get("print") != 0) { + + if (is_writable($IS4C_LOCAL->get("printerPort"))){ + $fp = fopen($IS4C_LOCAL->get("printerPort"), "w"); + fwrite($fp, $text); + fclose($fp); + } + } +} +// -------------------------------------------------------------- +function center_check($text) { + +// return str_repeat(" ", 22).center($text, 60); // apbw 03/24/05 Wedge printer swap patch + return center($text, 60); // apbw 03/24/05 Wedge printer swap patch +} + +// -------------------------------------------------------------- +// concatenated by tt/apbw 3/16/05 old wedge printer Franking Patch II + +function endorse($text) { + + writeLine(chr(27).chr(64).chr(27).chr(99).chr(48).chr(4) + // .chr(27).chr(33).chr(10) + .$text + .chr(27).chr(99).chr(48).chr(1) + .chr(12) + .chr(27).chr(33).chr(5)); +} +// ------------------------------------------------------------- + +function center($text, $linewidth) { + $blank = str_repeat(" ", 59); + $text = trim($text); + $lead = (int) (($linewidth - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +// ------------------------------------------------------------- +function drawerKick() { + + writeLine(chr(27).chr(112).chr(0).chr(48)."0"); +} + +// ------------------------------------------------------------- +function printReceiptHeader($dateTimeStamp, $ref) { + global $IS4C_LOCAL; + +// writeLine(chr(27).chr(33).chr(5)); // Compress font // apbw/tt old Wedge receipt printers Franking II + + $receipt = "" + + /***** jqh 09/29/05 changes made for new receipt settings *****/ + .chr(27).chr(33).chr(5); + if ($IS4C_LOCAL->get("newReceipt")==1){ + $receipt.=biggerFont(centerBig($IS4C_LOCAL->get("receiptHeader1")))."\n\n"; + }else{ + // zero-indexing the receipt header and footer list + $receipt.=biggerFont(centerBig($IS4C_LOCAL->get("receiptHeader1")))."\n"; + } + // and continuing on at one + for ($i = 2; $i <= $IS4C_LOCAL->get("receiptHeaderCount"); $i++) + $receipt.=centerString($IS4C_LOCAL->get("receiptHeader$i"))."\n"; + //$receipt.=centerString($IS4C_LOCAL->get("receiptHeader2"))."\n" + //.centerString($IS4C_LOCAL->get("receiptHeader3"))."\n" + $receipt.=centerString(build_time($dateTimeStamp)." ".$ref)."\n" + .centerString("Cashier: ".$IS4C_LOCAL->get("cashier"))."\n" + ."\n\n"; + /***** jqh end change *****/ + + return $receipt; + +} +// ------------------------------------------------------------- +function promoMsg() { + +} + +// Charge Footer split into two functions by apbw 2/1/05 + +function printChargeFooterCust($dateTimeStamp, $ref) { // apbw 2/14/05 SCR + global $IS4C_LOCAL; + + $chgName = getChgName(); // added by apbw 2/14/05 SCR + + $date = build_time($dateTimeStamp); + + $receipt = chr(27).chr(33).chr(5)."\n\n\n".centerString("C U S T O M E R C O P Y")."\n" + .centerString("................................................")."\n" + .centerString($IS4C_LOCAL->get("chargeSlip1"))."\n\n" + ."CUSTOMER CHARGE ACCOUNT\n" + ."Name: ".trim($IS4C_LOCAL->get("ChgName"))."\n" // changed by apbw 2/14/05 SCR + ."Member Number: ".trim($IS4C_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."Charge Amount: $".number_format(-1 * $IS4C_LOCAL->get("chargeTotal"), 2)."\n" + .centerString("................................................")."\n" + ."\n\n\n\n\n\n\n" + .chr(27).chr(105); + + return $receipt; + +} + +// Charge Footer split into two functions by apbw 2/1/05 + +function printChargeFooterStore($dateTimeStamp, $ref) { // apbw 2/14/05 SCR + global $IS4C_LOCAL; + + + $chgName = getChgName(); // added by apbw 2/14/05 SCR + + $date = build_time($dateTimeStamp); + + $receipt = "\n\n\n\n\n\n\n" + .chr(27).chr(105) + .chr(27).chr(33).chr(5) // apbw 3/18/05 + ."\n".centerString($IS4C_LOCAL->get("chargeSlip2"))."\n" + .centerString("................................................")."\n" + .centerString($IS4C_LOCAL->get("chargeSlip1"))."\n\n" + ."CUSTOMER CHARGE ACCOUNT\n" + ."Name: ".trim($IS4C_LOCAL->get("ChgName"))."\n" // changed by apbw 2/14/05 SCR + ."Member Number: ".trim($IS4C_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."Charge Amount: $".number_format(-1 * $IS4C_LOCAL->get("chargeTotal"), 2)."\n" + ."I AGREE TO PAY THE ABOVE AMOUNT\n" + ."TO MY CHARGE ACCOUNT\n" + ."Purchaser Sign Below\n\n\n" + ."X____________________________________________\n" + .$IS4C_LOCAL->get("fname")." ".$IS4C_LOCAL->get("lname")."\n\n" + .centerString(".................................................")."\n\n"; + $IS4C_LOCAL->set("chargetender",0); // apbw 2/14/05 SCR (moved up a line for Reprint patch on 3/10/05) + + return $receipt; + + +} + +function printCabCoupon($dateTimeStamp, $ref){ + global $IS4C_LOCAL; + + /* no cut + $receipt = "\n\n\n\n\n\n\n" + .chr(27).chr(105) + .chr(27).chr(33).chr(5) + ."\n"; + */ + $receipt = "\n"; + + $receipt .= biggerFont(centerBig("WHOLE FOODS COMMUNITY CO-OP"))."\n\n"; + $receipt .= centerString("(218) 728-0884")."\n"; + $receipt .= centerString("MEMBER OWNED SINCE 1970")."\n"; + $receipt .= centerString(build_time($dateTimeStamp))."\n"; + $receipt .= centerString('Effective this date ONLY')."\n"; + $parts = explode("-",$ref); + $receipt .= centerString("Cashier: $parts[0]")."\n"; + $receipt .= centerString("Transaction: $ref")."\n"; + $receipt .= "\n"; + $receipt .= "Your net purchase today of at least $30.00"."\n"; + $receipt .= "qualifies you for a WFC CAB COUPON"."\n"; + $receipt .= "in the amount of $3.00"; + $receipt .= " with\n\n"; + $receipt .= "GO GREEN TAXI (722-8090) or"."\n"; + $receipt .= "YELLOW CAB OF DULUTH (727-1515)"."\n"; + $receipt .= "from WFC toward the destination of\n"; + $receipt .= "your choice TODAY"."\n\n"; + + + $receipt .= "" + ."This coupon is not transferable.\n" + ."One coupon/day/customer.\n" + ."Any amount of fare UNDER the value of this coupon\n" + ."is the property of the cab company.\n" + ."Any amount of fare OVER the value of this coupon\n" + ."is your responsibility.\n" + ."Tips are NOT covered by this coupon.\n" + ."Acceptance of this coupon by the cab driver is\n" + ."subject to the terms and conditions noted above.\n"; + + return $receipt; +} + +// ------------- frank.php incorporated into printlib on 3/24/05 apbw (from here to eof) ------- + +function frank() { + global $IS4C_LOCAL; + + $date = strftime("%m/%d/%y %I:%M %p", time()); + $ref = trim($IS4C_LOCAL->get("memberID"))." ".trim($IS4C_LOCAL->get("CashierNo"))." ".trim($IS4C_LOCAL->get("laneno"))." ".trim($IS4C_LOCAL->get("transno")); + $tender = "AMT: ".truncate2($IS4C_LOCAL->get("tenderamt"))." CHANGE: ".truncate2($IS4C_LOCAL->get("change")); + $output = center_check($ref)."\n" + .center_check($date)."\n" + .center_check($IS4C_LOCAL->get("ckEndorse1"))."\n" + .center_check($IS4C_LOCAL->get("ckEndorse2"))."\n" + .center_check($IS4C_LOCAL->get("ckEndorse3"))."\n" + .center_check($IS4C_LOCAL->get("ckEndorse4"))."\n" + .center_check($tender)."\n"; + + + + endorse($output); +} + +// ----------------------------------------------------- + +function frankgiftcert() { + global $IS4C_LOCAL; + + $ref = trim($IS4C_LOCAL->get("CashierNo"))."-".trim($IS4C_LOCAL->get("laneno"))."-".trim($IS4C_LOCAL->get("transno")); + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + $next_year_stamp = mktime(0,0,0,date("m"), date("d"), date("Y")+1); + $next_year = strftime("%m/%d/%y", $next_year_stamp); // apbw 3/10/05 "%D" didn't work - Franking patch + // lines 200-207 edited 03/24/05 apbw Wedge Printer Swap Patch + $output = ""; + $output .= str_repeat("\n", 6); + $output .= "ref: " .$ref. "\n"; + $output .= str_repeat(" ", 5).$time_now; + $output .= str_repeat(" ", 12).$next_year; + $output .= str_repeat("\n", 3); + $output .= str_repeat(" ", 75); + $output .= "$".truncate2($IS4C_LOCAL->get("tenderamt")); + endorse($output); + +} + +// ----------------------------------------------------- + +function frankstock() { + global $IS4C_LOCAL; + + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + /* pointless + if ($IS4C_LOCAL->get("franking") == 0) { + $IS4C_LOCAL->set("franking",1); + } + */ + $ref = trim($IS4C_LOCAL->get("CashierNo"))."-".trim($IS4C_LOCAL->get("laneno"))."-".trim($IS4C_LOCAL->get("transno")); + $output = ""; + $output .= str_repeat("\n", 40); // 03/24/05 apbw Wedge Printer Swap Patch + if ($IS4C_LOCAL->get("equityAmt")){ + $output = "Equity Payment ref: ".$ref." ".$time_now; // WFC + $IS4C_LOCAL->set("equityAmt",""); + $IS4C_LOCAL->set("LastEquityReference",$ref); + } + else { + $output .= "Stock Payment $".$IS4C_LOCAL->get("tenderamt")." ref: ".$ref." ".$time_now; // apbw 3/24/05 Wedge Printer Swap Patch + } + + endorse($output); +} +//------------------------------------------------------- + + +function frankclassreg() { + global $IS4C_LOCAL; + + $ref = trim($IS4C_LOCAL->get("CashierNo"))."-".trim($IS4C_LOCAL->get("laneno"))."-".trim($IS4C_LOCAL->get("transno")); + $time_now = strftime("%m/%d/%y", time()); // apbw 3/10/05 "%D" didn't work - Franking patch + $output = ""; + $output .= str_repeat("\n", 11); // apbw 3/24/05 Wedge Printer Swap Patch + $output .= str_repeat(" ", 5); // apbw 3/24/05 Wedge Printer Swap Patch + $output .= "Validated: ".$time_now." ref: ".$ref; // apbw 3/24/05 Wedge Printer Swap Patch + + endorse($output); + +} + +//----------------------------------Credit Card footer----by CvR + +function printCCFooter($dateTimeStamp, $ref) { + global $IS4C_LOCAL; + + $date = build_time($dateTimeStamp); + + + + $receipt = "\n".centerString("C U S T O M E R C O P Y")."\n" + .centerString("................................................")."\n" + .centerString($IS4C_LOCAL->get("chargeSlip1"))."\n\n" + .centerString("Cardholder acknowledges receipt of goods/services")."\n" + .centerString("in the amount shown and agrees to pay for them")."\n" + .centerString("according to card issuer agreement.")."\n\n" + ."CREDIT CARD CHARGE\n" + ."Name: ".trim($IS4C_LOCAL->get("ccName"))."\n" + ."Member Number: ".trim($IS4C_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."TROUTD: ".trim($IS4C_LOCAL->get("troutd"))."\n" + ."Charge Amount: $".number_format(-1*$IS4C_LOCAL->get("ccTotal"), 2)."\n" //changed 04/01/05 Tak & CvR + .centerString("................................................")."\n" + ."\n\n\n\n\n\n\n" + .chr(27).chr(105) + + // writeLine($receipt1.chr(27).chr(105)); + // writeLine(chr(27).chr(105)); + + // $receipt2 ="" + + .centerString($IS4C_LOCAL->get("chargeSlip2"))."\n" + .centerString("................................................")."\n" + .centerString($IS4C_LOCAL->get("chargeSlip1"))."\n\n" + ."CREDIT CARD CHARGE\n" + ."Name: ".trim($IS4C_LOCAL->get("ccName"))."\n" + ."Member Number: ".trim($IS4C_LOCAL->get("memberID"))."\n" + ."Date: ".$date."\n" + ."REFERENCE #: ".$ref."\n" + ."TROUTD: ".trim($IS4C_LOCAL->get("troutd"))."\n" + ."Charge Amount: $".number_format(-1*$IS4C_LOCAL->get("ccTotal"), 2)."\n\n" //changed 04/01/05 Tak and CvR + .centerString("I agree to pay the above total amount")."\n" + .centerString("according to card issuer agreement.")."\n\n" + ."Purchaser Sign Below\n\n\n" + ."X____________________________________________\n\n" + .centerString(".................................................")."\n\n"; + + + + + // writeLine(chr(27).chr(105)); + + return $receipt; + +} + +/***** jqh 09/29/05 functions added for new receipt *****/ +function biggerFont($str) { + $receipt=chr(29).chr(33).chr(17); + $receipt.=$str; + $receipt.=chr(29).chr(33).chr(00); + + return $receipt; +} +function centerBig($text) { + $blank = str_repeat(" ", 30); + $text = trim($text); + $lead = (int) ((30 - strlen($text)) / 2); + $newline = substr($blank, 0, $lead).$text; + return $newline; +} +/***** jqh end change *****/ + +/***** CvR 06/28/06 calculate current balance for receipt ****/ +function chargeBalance($receipt){ + global $IS4C_LOCAL; + chargeOK(); + + $db = tDataConnect(); + $checkQ = "select trans_id from localtemptrans where department=990 or trans_subtype='MI'"; + $checkR = $db->query($checkQ); + $num_rows = $db->num_rows($checkR); + + $currActivity = $IS4C_LOCAL->get("memChargeTotal"); + $currBalance = $IS4C_LOCAL->get("balance") - $currActivity; + + if(($num_rows > 0 || $currBalance != 0) && $IS4C_LOCAL->get("memberID") != 11){ + $chargeString = "Current IOU Balance: $".sprintf("%.2f",$currBalance); + $receipt = $receipt."\n\n".biggerFont(centerBig($chargeString)); + } + + return $receipt; +} + +function storeCreditIssued($second){ + global $IS4C_LOCAL; + if ($second) return ""; + + $db = tDataConnect(); + $checkQ = "select sum(total) from localtemptrans where trans_subtype='SC' and trans_type='T'"; + $checkR = $db->query($checkQ); + + $num_rows = $db->num_rows($checkR); + if ($num_rows == 0) return ""; + + $row = $db->fetch_row($checkR); + $issued = $row[0]; + if ($issued <= 0) return ""; + + + $slip = centerString("................................................")."\n\n"; + $slip .= centerString("( C U S T O M E R C O P Y )")."\n"; + $slip .= biggerFont("Store credit issued")."\n\n"; + $slip .= biggerFont(sprintf("Amount \$%.2f",$issued))."\n\n"; + + if ( $IS4C_LOCAL->get("fname") != "" && $IS4C_LOCAL->get("lname") != ""){ + $slip .= "Name: ".$IS4C_LOCAL->get("fname")." ".$IS4C_LOCAL->get("lname")."\n\n"; + } + else { + $slip .= "Name: ____________________________________________\n\n"; + } + $slip .= "Ph #: ____________________________________________\n\n"; + + $slip .= " * no cash back on store credit refunds\n"; + $slip .= " * change amount is not transferable to\n another store credit\n"; + $slip .= centerString("................................................")."\n"; + return $slip; +} + +function getChgName() { + /* + the name that appears beneath the signature + line on the customer copy is pulled from $IS4C_LOCAL. + Pulling the name here from custdata w/o respecting + personNum can cause this name to differ from the + signature line, so I'm using $IS4C_LOCAL here too. I'm + leaving the query in place as a check that memberID + is valid; shouldn't slow anything down noticably. + + I also changed the memberID strlen qualifier because the + != 4 or == 4 decision was causing inconsistent behavior + with older memberships that have memberIDs shorter than + 4 digits. + + andy + */ + global $IS4C_LOCAL; + $query = "select LastName, FirstName from custdata where CardNo = '" .$IS4C_LOCAL->get("memberID") ."'"; + $connection = pDataConnect(); + $result = $connection->query($query); + $num_rows = $connection->num_rows($result); + + if ($num_rows > 0) { + $LastInit = substr($IS4C_LOCAL->get("lname"), 0, 1)."."; + $IS4C_LOCAL->set("ChgName",trim($IS4C_LOCAL->get("fname")) ." ". $LastInit); + } + else{ + $IS4C_LOCAL->set("ChgName",$IS4C_LOCAL->get("memMsg")); + } + + $connection->close(); +} + +function printCCSigSlip($dateTimeStamp,$ref,$storeCopy=True,$rp=0){ + global $IS4C_LOCAL; + normalFont(); + + $date = build_time($dateTimeStamp); + $ert = explode("-",$ref); + $emp = $ert[0]; + $reg = $ert[1]; + $trans = $ert[2]; + $slip = ""; + $db = -1; + + if ( $rp != 0 ) { // if this is a reprint of a previous transaction, loop through all cc slips for that transaction + $idclause = ""; + $limit = ""; + $sort = ""; + $db = mDataConnect(); + } else { // else if current transaction, just grab most recent + $idclause = " and transID = ".$IS4C_LOCAL->get("paycard_id"); + $limit = " TOP 1 "; + $sort = " desc "; + $db = tDataConnect(); + } + // query database for cc receipt info + $query = "select ".$limit." tranType, amount, PAN, entryMethod, issuer, xResultMessage, xApprovalNumber, xTransactionID, name, " + ." datetime from ccReceiptView where [date]=".date('Ymd',$dateTimeStamp) + ." and cashierNo = ".$emp." and laneNo = ".$reg + ." and transNo = ".$trans ." ".$idclause + ." order by datetime, cashierNo, laneNo, transNo, xTransactionID, transID ".$sort.", sortorder ".$sort; + if ($IS4C_LOCAL->get("DBMS") == "mysql" && $rp == 0){ + $query = str_replace("[date]","date",$query); + if ($limit != ""){ + $query = str_replace($limit,"",$query); + $query .= " LIMIT 1"; + } + } + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + for ($i=0;$i<$num_rows;$i++) { + $row = $db->fetch_array($result); + $trantype = $row['tranType']; + if ($row['amount'] < 0) { + $amt = "-$".number_format(-1*$row['amount'],2); + } else { + $amt = "$".number_format($row['amount'],2); + } + $pan = $row['PAN']; // already masked in the database + $entryMethod = $row['entryMethod']; + $cardBrand = $row['issuer']; + $approvalPhrase = $row['xResultMessage']; + $authCode = "#".$row['xApprovalNumber']; + $sequenceNum = $row['xTransactionID']; + $name = $row["name"]; + + // store copy is 22 lines long + if (!$storeCopy){ + //$slip .= "CC".centerString("C U S T O M E R C O P Y")."\n"; // "wedge copy" + } + else { + $slip .= "CC".substr(centerString($IS4C_LOCAL->get("chargeSlip2")),2)."\n"; // "wedge copy" + } + $slip .= centerString("................................................")."\n"; + if ($storeCopy){ + $slip .= centerString($IS4C_LOCAL->get("chargeSlip1"))."\n" // store name + .centerString($IS4C_LOCAL->get("chargeSlip3").", ".$IS4C_LOCAL->get("chargeSlip4"))."\n" // address + .centerString($IS4C_LOCAL->get("chargeSlip5"))."\n" // merchant code + .centerString($IS4C_LOCAL->get("receiptHeader2"))."\n\n"; // phone + } + + $slip .= $trantype."\n" // trans type: purchase, canceled purchase, refund or canceled refund + ."Card: ".$cardBrand." ".$pan."\n" + ."Date: ".date('m/d/y h:i a', strtotime($row['datetime']))."\n" + ."Reference: ".$ref."\n" // our ref # + ."Entry Method: ".$entryMethod."\n" // swiped or manual entry + ."Sequence Number: ".$sequenceNum."\n" // their sequence # + //."Authorization: ".$approvalPhrase." ".$authCode."\n" // result + auth number + ."Authorization: ".$approvalPhrase."\n" // result + auth number + .boldFont() // change to bold font for the total + ."Amount: ".$amt."\n" + .normalFont(); + if ($storeCopy){ + $slip .= centerString("I agree to pay above total amount")."\n" + .centerString("according to card issuer agreement.")."\n\n" + + .centerString("X____________________________________________")."\n" + .centerString($name)."\n"; + } + $slip .= centerString(".................................................")."\n" + ."\n"; + // if more than one sig slip, cut after each one (except the last) + if ($num_rows > 1 && $i < $num_rows-1 && $storeCopy) { + $slip .= "\n\n\n\n".chr(27).chr(105); + } + } + + if ($IS4C_LOCAL->get("SigCapture") != "" && $IS4C_LOCAL->get("SigSlipType") == "ccSlip"){ + $sig_file = $_SESSION["INCLUDE_PATH"]."/graphics/SigImages/" + .$IS4C_LOCAL->get("CapturedSigFile"); + + $bmp = new Bitmap(); + $bmp->Load($sig_file); + + $bmpData = $bmp->GetRawData(); + $bmpWidth = $bmp->GetWidth(); + $bmpHeight = $bmp->GetHeight(); + $bmpRawBytes = (int)(($bmpWidth + 7)/8); + + $printer = new ESCPOSPrintHandler(); + $stripes = $printer->TransposeBitmapData($bmpData, $bmpWidth); + for($i=0; $i<count($stripes); $i++) + $stripes[$i] = $printer->InlineBitmap($stripes[$i], $bmpWidth); + + $slip .= $printer->AlignCenter(); + if (count($stripes) > 1) + $slip .= $printer->LineSpacing(0); + $slip .= implode("\n",$stripes); + if (count($stripes) > 1) + $slip .= $printer->ResetLineSpacing()."\n"; + $slip .= $printer->AlignLeft(); + } + + return $slip; +} + +function normalFont() { + return chr(27).chr(33).chr(5); +} +function boldFont() { + return chr(27).chr(33).chr(9); +} + +function localTTL(){ + global $IS4C_LOCAL; + + if ($IS4C_LOCAL->get("localTotal") == 0) return ""; + + $str = sprintf("Local purchases: \$%.2f", + $IS4C_LOCAL->get("localTotal")); + return "\n\n".centerString($str)."\n\n"; +} + +function receiptDetail($reprint=False,$trans_num='') { // put into its own function to make it easier to follow, and slightly modified for wider-spread use of joe's "new" receipt format --- apbw 7/3/2007 + global $IS4C_LOCAL; + + $detail = ""; + $empNo=0;$laneNo=0;$transNo=0; + if ($reprint){ + $temp = explode("-",$trans_num); + $empNo= $temp[0]; + $laneNo = $temp[1]; + $transNo = $temp[2]; + } + + if ($IS4C_LOCAL->get("newReceipt") == 0 ) { // if old style has been specifically requested for a partial or reprint, use old format + $query="select linetoprint from receipt"; + if ($reprint){ + $query = "select linetoprint from rp_receipt + where emp_no=$empNo and register_no=$laneNo + and trans_no=$transNo order by trans_id"; + } + $db = tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + // loop through the results to generate the items listing. + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + $detail .= $row[0]."\n"; + } + + } else { // otherwise use new format + /* $query = "select linetoprint,sequence,dept_name,ordered,numflag from receipt_reorder_unions_g " + ." order by ordered, dept_name, case when ordered = 4 then '' else upc end, [sequence]"; + */ + $query = "select linetoprint,sequence,dept_name,ordered, 0 as [local] " + ." from receipt_reorder_unions_g order by ordered,dept_name, " + ." case when ordered=4 then '' else upc end, [sequence]"; + if ($reprint){ + $query = "select linetoprint,sequence,dept_name,ordered, 0 as [local] " + ." from rp_receipt_reorder_unions_g where emp_no=$empNo and " + ." register_no=$laneNo and trans_no=$transNo " + ." order by ordered,dept_name, " + ." case when ordered=4 then '' else upc end, [sequence]"; + } + + $db = tDataConnect(); + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $query = str_replace("[","",$query); + $query = str_replace("]","",$query); + } + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + // loop through the results to generate the items listing. + $lastDept=""; + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + if ($row[2]!=$lastDept){ // department header + + if ($row['2']==''){ + $detail .= "\n"; + }else{ + $detail .= "-- "; + $detail .= boldFont(); + $detail .= $row[2]; + $detail .= normalFont(); + $detail .= " --\n"; + } + } + /***** jqh 12/14/05 fix tax exempt on receipt *****/ + if ($row[1]==2 and $IS4C_LOCAL->get("TaxExempt")==1){ + $detail .= " TAX 0.00\n"; + } + elseif ($row[1]==1 and $IS4C_LOCAL->get("TaxExempt")==1){ + $queryExempt="select + right((space(44) + upper(rtrim('SUBTOTAL'))), 44) + + right((space(8) + convert(varchar,runningTotal-tenderTotal)), 8) + + right((space(4) + ''), 4) as linetoprint,1 as sequence,null as dept_name,3 as ordered,'' as upc + from lttSummary"; + $resultExempt = $db->query($queryExempt); + $rowExempt = $db->fetch_array($resultExempt); + $detail .= $rowExempt[0]."\n"; + } + else{ + if ($IS4C_LOCAL->get("promoMsg") == 1 && $row[4] == 1 ){ // '*' added to local items 8/15/2007 apbw for eat local challenge + $detail .= '*'.$row[0]."\n"; + } else { + if ( strpos($row[0]," TOTAL") ) { // if it's the grand total line . . . + $detail .= boldFont() // change to bold font . . . + .$row[0]."\n" // write the line . . . + .normalFont(); // then change back to normal font. 11/4/07 apbw + } else { + $detail .= $row[0]."\n"; + } + } + } + /***** jqh end change *****/ + + $lastDept=$row[2]; + } // end for loop + } + + return $detail; +} + +/* + * gift card receipt functions --atf 10/8/07 + */ +function printGCSlip($dateTimeStamp, $ref, $storeCopy=true, $rp=0) { + global $IS4C_LOCAL; + + $date = build_time($dateTimeStamp); + $ert = explode("-",$ref); + $emp = $ert[0]; + $reg = $ert[1]; + $trans = $ert[2]; + $slip = ""; + + // query database for gc receipt info + $limit = ""; + $order = ""; + $where = "[date]=".date('Ymd',$dateTimeStamp)." AND cashierNo=".$emp." AND laneNo=".$reg." AND transNo=".$trans; + if( $rp == 0) { + $limit = " TOP 1"; + $order = " desc"; + $where .= " AND transID=".$IS4C_LOCAL->get("paycard_id"); + } + $sql = "SELECT".$limit." * FROM gcReceiptView WHERE ".$where." ORDER BY [datetime]".$order.", sortorder".$order; + $db = tDataConnect(); + if ($IS4C_LOCAL->get("DBMS") == "mysql"){ + $sql = "SELECT * FROM gcReceiptView WHERE ".$where." ORDER BY [datetime]".$order.", sortorder".$order." ".$limit; + $sql = str_replace("[","",$sql); + $sql = str_replace("]","",$sql); + $sql = str_replace("TOP","LIMIT",$sql); + } + $result = $db->query($sql); + $num = $db->num_rows($result); + + // print a receipt for each row returned + for( $x = 0; $row = $db->fetch_array($result); $x++) { + // special stuff for the store copy only + if( $storeCopy) { + // cut before each slip after the first + if( $x > 0) + $slip .= "\n\n\n\n".chr(27).chr(105); + // reprint header + if( $rp != 0) + $slip .= chr(27).chr(33).chr(5).centerString("*** R E P R I N T ***")."\n"; + // store header + $slip .= "GC".substr(centerString($IS4C_LOCAL->get("chargeSlip2")),2)."\n" // "wedge copy" + . centerString("................................................")."\n" + . centerString($IS4C_LOCAL->get("chargeSlip1"))."\n" // store name + . centerString($IS4C_LOCAL->get("chargeSlip3").", ".$IS4C_LOCAL->get("chargeSlip4"))."\n" // address + . centerString($IS4C_LOCAL->get("receiptHeader2"))."\n" // phone + . "\n"; + } else { + if( $x == 0) { + if( $num > 1) $slip .= centerString("------- C A R D H O L D E R C O P I E S -------")."\n"; + else $slip .= centerString("--------- C A R D H O L D E R C O P Y ---------")."\n"; + //$slip .= centerString("................................................")."\n"; + } + } + // transaction data + if( true) { // two-column layout + $col1 = array(); + $col2 = array(); + $col1[] = $row['tranType']; + $col2[] = "Date: ".date('m/d/y h:i a', strtotime($row['datetime'])); + $col1[] = "Terminal ID: ".$row['terminalID']; + $col2[] = "Reference: ".$ref."-".$row['transID']; + $col1[] = "Card: ".$row['PAN']; + $col2[] = "Entry Method: ".$row['entryMethod']; + if( ((int)$row['xVoidCode']) > 0) { + $col1[] = "Void Auth: ".$row['xVoidCode']; + $col2[] = "Orig Auth: ".$row['xAuthorizationCode']; + } else { + $col1[] = "Authorization: ".$row['xAuthorizationCode']; + $col2[] = ""; + } + $col1[] = boldFont()."Amount: ".paycard_moneyFormat($row['amount']).normalFont(); // bold ttls apbw 11/3/07 + $col2[] = "New Balance: ".paycard_moneyFormat($row['xBalance']); + $slip .= twoColumns($col1, $col2); + } else { // all-left layout + $slip .= $row['tranType']."\n" + . "Card: ".$row['PAN']."\n" + . "Date: ".date('m/d/y h:i a', strtotime($row['datetime']))."\n" + . "Terminal ID: ".$row['terminalID']."\n" + . "Reference: ".$ref."-".$row['transID']."\n" + . "Entry Method: ".$row['entryMethod']."\n"; + if( ((int)$row['xVoidCode']) > 0) { + $slip .= "Original Authorization: ".$row['xAuthorizationCode']."\n" + . "Void Authorization: ".$row['xVoidCode']."\n"; + } else { + $slip .= "Authorization: ".$row['xAuthorizationCode']."\n"; + } + $slip .= boldFont()."Amount: ".paycard_moneyFormat($row['amount']).normalFont()."\n" // bold ttls apbw 11/3/07 + . "New Balance: ".paycard_moneyFormat($row['xBalance'])."\n"; + } + // name/phone on activation only + if( $row['tranType'] == 'Gift Card Activation' && $storeCopy) { + $slip .= "\n".centerString("Name: ___________________________________")."\n" + ."\n".centerString("Phone: ___________________________________")."\n"; + } + $slip .= centerString(".................................................")."\n"; + // reprint footer + if( $storeCopy && $rp != 0) + $slip .= chr(27).chr(33).chr(5).centerString("*** R E P R I N T ***")."\n"; + } // foreach row + + // add normal font ONLY IF we printed something else, too + if( strlen($slip) > 0) + $slip = normalFont() . $slip; + + return $slip; +} // printGCSlip() + +function printGCBalSlip() { + global $IS4C_LOCAL; + + // balance inquiries are not logged and have no meaning in a reprint, + // so we can assume that it just happened now and all data is still in session vars + $tempArr = $IS4C_LOCAL->get("paycard_response"); + $bal = "$".number_format($tempArr["Balance"],2); + $pan = $IS4C_LOCAL->get("paycard_PAN"); // no need to mask gift card numbers + $slip = normalFont() + .centerString(".................................................")."\n" + .centerString($IS4C_LOCAL->get("chargeSlip1"))."\n" // store name + .centerString($IS4C_LOCAL->get("chargeSlip3").", ".$IS4C_LOCAL->get("chargeSlip4"))."\n" // address + .centerString($IS4C_LOCAL->get("receiptHeader2"))."\n" // phone + ."\n" + ."Gift Card Balance\n" + ."Card: ".$pan."\n" + ."Date: ".date('m/d/y h:i a')."\n" + .boldFont() // change to bold font for the total + ."Balance: ".$bal."\n" + .normalFont() + .centerString(".................................................")."\n" + ."\n"; + return $slip; +} // printGCBalSlip() + +function twoColumns($col1, $col2) { + // init + $max = 56; + $text = ""; + // find longest string in each column, ignoring font change strings + $c1max = 0; + $col1s = array(); + foreach( $col1 as $c1) { + $c1s = trim(str_replace(array(boldFont(),normalFont()), "", $c1)); + $col1s[] = $c1s; + $c1max = max($c1max, strlen($c1s)); + } + $c2max = 0; + $col2s = array(); + foreach( $col2 as $c2) { + $c2s = trim(str_replace(array(boldFont(),normalFont()), "", $c2)); + $col2s[] = $c2s; + $c2max = max($c2max, strlen($c2s)); + } + // space the columns as much as they'll fit + $spacer = $max - $c1max - $c2max; + // scan both columns + for( $x=0; isset($col1[$x]) && isset($col2[$x]); $x++) { + $c1 = trim($col1[$x]); $c1l = strlen($col1s[$x]); + $c2 = trim($col2[$x]); $c2l = strlen($col2s[$x]); + if( ($c1max+$spacer+$c2l) <= $max) { + $text .= $c1 . @str_repeat(" ", ($c1max+$spacer)-$c1l) . $c2 . "\n"; + } else { + $text .= $c1 . "\n" . str_repeat(" ", $c1max+$spacer) . $c2 . "\n"; + } + } + // if one column is longer than the other, print the extras + // (only one of these should happen since the loop above runs as long as both columns still have rows) + for( $y=$x; isset($col1[$y]); $y++) { + $text .= trim($col1[$y]) . "\n"; + } // col1 extras + for( $y=$x; isset($col2[$y]); $y++) { + $text .= str_repeat(" ", $c1max+$spacer) . trim($col2[$y]) . "\n"; + } // col2 extras + return $text; +} + +?> diff --git a/pos/is4c-web/lib/printReceipt.php b/pos/is4c-web/lib/printReceipt.php new file mode 100644 index 000000000..6402718e4 --- /dev/null +++ b/pos/is4c-web/lib/printReceipt.php @@ -0,0 +1,268 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("setDrawerKick")) include($IS4C_PATH."lib/setDrawerKick.php"); // apbw 03/29/05 Drawer Kick Patch +if (!function_exists("writeLine")) include_once($IS4C_PATH."lib/printLib.php"); // apbw 03/26/05 Wedge Printer Swap Patch +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +// ----------------------------------------------------------- +// printReceipt.php is the main page for printing receipts. +// It invokes the following functions from other pages: +// ----------------------------------------------------------- + + + +function printReceipt($arg1,$second=False) { + global $IS4C_LOCAL; + + $dokick = setDrawerKickLater(); + $receipt = ""; + + + if ($arg1 == "full" and $dokick != 0) { // ---- apbw 03/29/05 Drawer Kick Patch + writeLine(chr(27).chr(112).chr(0).chr(48)."0"); + } + +/* -------------------------------------------------------------- + turn off staff charge receipt printing if toggled - apbw 2/1/05 + ---------------------------------------------------------------- */ + + $noreceipt = ($IS4C_LOCAL->get("receiptToggle")==1 ? 0 : 1); + + $dateTimeStamp = time(); // moved by apbw 2/15/05 SCR + +// -- Our Reference number for the transaction. + + $ref = trim($IS4C_LOCAL->get("CashierNo"))."-".trim($IS4C_LOCAL->get("laneno"))."-".trim($IS4C_LOCAL->get("transno")); + + + if ($noreceipt != 1) // moved by apbw 2/15/05 SCR + { + $receipt = printReceiptHeader($dateTimeStamp, $ref); + + if ($second){ + $ins = centerString("( S T O R E C O P Y )")."\n"; + $receipt = substr($receipt,0,3).$ins.substr($receipt,3); + } + + // The Nitty Gritty: + /***** jqh 09/29/05 changes made to following if statement so if the receipt is full, then print new receipt, + if not full, then print old style receipt *****/ + if ($arg1 == "full") { + + $receipt .= receiptDetail(); + $member = "Member ".trim($IS4C_LOCAL->get("memberID")); + $your_discount = $IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("memCouponTTL"); + + if ($IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("memCouponTTL") + $IS4C_LOCAL->get("specials") > 0) { + $receipt .= "\n".centerString("------------------ YOUR SAVINGS -------------------")."\n"; + + if ($your_discount > 0) { + $receipt .= " DISCOUNTS: $".number_format($your_discount, 2)."\n"; + } + + if ($IS4C_LOCAL->get("specials") > 0) { + $receipt .= " SPECIALS: $".number_format($IS4C_LOCAL->get("specials"), 2)."\n"; + } + + $receipt .= centerString("---------------------------------------------------")."\n"; + } + $receipt .= "\n"; + + if (trim($IS4C_LOCAL->get("memberID")) != $IS4C_LOCAL->get("defaultNonMem")) { + /***** jqh 09/29/05 change made to thank you line depending on session newReceipt *****/ + if ($IS4C_LOCAL->get("newReceipt")==1){ + $receipt .= biggerFont(centerBig("Thank You - ".$member."!!"))."\n\n"; + }else{ + $receipt .= centerString("Thank You - ".$member."!!!")."\n"; + } + /***** jqh end change *****/ + } + else { + /***** jqh 09/29/05 change made to thank you line depending on session newReceipt *****/ + if ($IS4C_LOCAL->get("newReceipt")==1){ + $receipt .= biggerFont(centerBig("Thank You!!!"))."\n\n"; + }else{ + $receipt .= centerString("Thank You!!!")."\n"; + } + /***** jqh end change *****/ + } + + if ($IS4C_LOCAL->get("yousaved") > 0) { + $receipt .= centerString("You Saved $".number_format($IS4C_LOCAL->get("yousaved"), 2))."\n"; + } + + if ($IS4C_LOCAL->get("couldhavesaved") > 0 && $IS4C_LOCAL->get("yousaved") > 0) { + $receipt .= centerString("You could have saved an additional $" + .number_format($IS4C_LOCAL->get("couldhavesaved"), 2))."\n"; + } + elseif ($IS4C_LOCAL->get("couldhavesaved") > 0) { + $receipt .= centerString("You could have saved $" + .number_format($IS4C_LOCAL->get("couldhavesaved"), 2))."\n"; + } + + $receipt .= localTTL(); + + /***** jqh 09/29/05 change made to receipt footer depending on session newReceipt *****/ + for ($i = 1; $i <= $IS4C_LOCAL->get("receiptFooterCount"); $i++) + $receipt .= centerString($IS4C_LOCAL->get("receiptFooter$i"))."\n"; + /***** jqh end change *****/ + + /***** CvR add charge total to receipt bottom ****/ + + $receipt = chargeBalance($receipt); + + /**** CvR end ****/ + + // --- apbw 2/15/05 SCR --- + /* + if ($IS4C_LOCAL->get("chargetender") == 1 && $IS4C_LOCAL->get("End") == 1) { + $receipt = $receipt.printChargeFooterCust($dateTimeStamp, $ref); + } + */ + + /* + if ($IS4C_LOCAL->get("ccTender") == 1) { + $receipt = $receipt.printCCFooter($dateTimeStamp,$ref); + } + */ + + // append customer copy to actual lane receipt + if ($IS4C_LOCAL->get('standalone') == 0) + $receipt .= printCCSigSlip($dateTimeStamp, $ref, false, 1); + + if ($IS4C_LOCAL->get("autoReprint") == 1) + $receipt .= printGCSlip($dateTimeStamp, $ref, false, 1); + else + $receipt .= printGCSlip($dateTimeStamp, $ref, true, 1); + + if ($IS4C_LOCAL->get("promoMsg") == 1) { + promoMsg(); + + } + + $receipt .= storeCreditIssued($second); + + $IS4C_LOCAL->set("headerprinted",0); + + } + else if ($arg1 == "cab"){ + $ref = $IS4C_LOCAL->get("cabReference"); + $receipt = printCabCoupon($dateTimeStamp, $ref); + $IS4C_LOCAL->set("cabReference",""); + } + else { + + /***** jqh 09/29/05 if receipt isn't full, then display receipt in old style *****/ + $query="select linetoprint from receipt"; + $db = tDataConnect(); + $result = $db->query($query); + $num_rows = $db->num_rows($result); + +// loop through the results to generate the items listing. + + for ($i = 0; $i < $num_rows; $i++) { + $row = $db->fetch_array($result); + + $receipt .= $row[0]."\n"; + + } + /***** jqh end change *****/ + + $dashes = "\n".centerString("----------------------------------------------")."\n"; + + + if ($arg1 == "partial") { + + $receipt .= $dashes.centerString("* P A R T I A L T R A N S A C T I O N *").$dashes; + } + elseif ($arg1 == "cancelled") { + $receipt .= $dashes.centerString("* T R A N S A C T I O N C A N C E L L E D *").$dashes; + } + elseif ($arg1 == "resume") { + $receipt .= $dashes.centerString("* T R A N S A C T I O N R E S U M E D *").$dashes + .centerString("A complete receipt will be printed\n") + .centerString("at the end of the transaction"); + } + elseif ($arg1 == "suspended") { + $receipt .= $dashes.centerString("* T R A N S A C T I O N S U S P E N D E D *").$dashes + .centerString($ref); + } + /***** CvR 09/30/05 Added to print CC signature slip after + authorization, before tendering *****/ + + elseif ($arg1 == "ccSlip") { + //if ($IS4C_LOCAL->get("ccCustCopy") == 1){ + // $receipt = printCCSigSlip($dateTimeStamp,$ref,False); + //} + //else { + $receipt = printCCSigSlip($dateTimeStamp,$ref,True); + //} + } + else if ($arg1 == "gcSlip") { // --atf 10/8/07 + if ($IS4C_LOCAL->get("autoReprint") == 1){ + $receipt = printGCSlip($dateTimeStamp,$ref,true); + } + else { + $receipt = printGCSlip($dateTimeStamp,$ref,false); + } + } + else if ($arg1 == "gcBalSlip") { // --atf 10/8/07 + $receipt = printGCBalSlip(); + } + + /***** CvR 09/30/05 END *****/ + } /***** jqh end big if statement change *****/ +} +else { + $receipt = chargeBalance($receipt); +} + + +/* -------------------------------------------------------------- + print store copy of charge slip regardless of receipt print setting - apbw 2/14/05 + ---------------------------------------------------------------- */ +if ($IS4C_LOCAL->get("chargetender") == 1 && $IS4C_LOCAL->get("End") == 1) { + if ($noreceipt == 1) { + $receipt = $receipt.printChargeFooterStore($dateTimeStamp, $ref); + } else { + $receipt = $receipt.printChargeFooterStore($dateTimeStamp, $ref); + } +} +//------------------------------------------------------------------- + + + +if ($receipt !== ""){ + $receipt = $receipt."\n\n\n\n\n\n\n"; + + writeLine($receipt.chr(27).chr(105)); +} + +$receipt = ""; + +} + +?> diff --git a/pos/is4c-web/lib/reprint.php b/pos/is4c-web/lib/reprint.php new file mode 100644 index 000000000..c7542e7e2 --- /dev/null +++ b/pos/is4c-web/lib/reprint.php @@ -0,0 +1,171 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +// ----------------------------------------------------------- +// reprint the specified receipt +// ----------------------------------------------------------- + +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); +if (!function_exists("writeLine")) include($IS4C_PATH."lib/printLib.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function reprintReceipt($trans_num=""){ + global $IS4C_LOCAL; + + if (strlen($trans_num) >= 1) { + $title = chr(27).chr(33).chr(5).centerString("*** R E P R I N T ***")."\n\n\n"; + + $arpspec = explode("::", $trans_num); + $laneno = $arpspec[0]; + $cashierNo = $arpspec[1]; + $transno = $arpspec[2]; + + $ref = trim($cashierNo)."-".trim($laneno)."-".trim($transno); + + $queryHeader = "select * from rp_receipt_header where register_no = ".$laneno." and emp_no = ".$cashierNo." and trans_no = ".$transno; + + $connect = tDataConnect(); + $header = $connect->query($queryHeader); + $headerRow = $connect->fetch_array($header); + + $dateTimeStamp = $headerRow["dateTimeStamp"]; + $dateTimeStamp = strtotime($dateTimeStamp); + + $IS4C_LOCAL->set("memberID",$headerRow["memberID"]); + $IS4C_LOCAL->set("memCouponTLL",$headerRow["couponTotal"]); + $IS4C_LOCAL->set("transDiscount",$headerRow["transDiscount"]); + $IS4C_LOCAL->set("chargeTotal",-1*$headerRow["chargeTotal"]); + + if ($IS4C_LOCAL->get("chargeTotal") != 0) { + $IS4C_LOCAL->set("chargetender",1); + } else { + $IS4C_LOCAL->set("chargetender",0); + } + + $IS4C_LOCAL->set("discounttotal",$headerRow["discountTTL"]); + $IS4C_LOCAL->set("memSpecial",$headerRow["memSpecial"]); + + $connect->close(); + + $connID = pDataConnect(); + $queryID = "select LastName,FirstName,Type,blueLine from custdata + where CardNo = '".$IS4C_LOCAL->get("memberID")."' and personNum=1"; + $result = $connID->query($queryID); + $row = $connID->fetch_array($result); + + // restore names for charge slips + $IS4C_LOCAL->set("lname",$row["LastName"]); + $IS4C_LOCAL->set("fname",$row["FirstName"]); + + if ($row["Type"] == "PC") { + $IS4C_LOCAL->set("isMember",1); + } + else { + $IS4C_LOCAL->set("isMember",0); + } + $IS4C_LOCAL->set("memMsg",$row["blueLine"]); + + $connID->close(); + + if ($IS4C_LOCAL->get("isMember") == 1) { + $IS4C_LOCAL->set("yousaved",number_format( $IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("discounttotal") + $IS4C_LOCAL->get("memSpecial") + $IS4C_LOCAL->get("memCouponTTL"), 2)); + $IS4C_LOCAL->set("couldhavesaved",0); + $IS4C_LOCAL->set("specials",number_format($IS4C_LOCAL->get("discounttotal") + $IS4C_LOCAL->get("memSpecial"), 2)); + } + else { + $dblyousaved = number_format($IS4C_LOCAL->get("memSpecial"), 2); + $IS4C_LOCAL->set("yousaved",$IS4C_LOCAL->get("discounttotal")); + $IS4C_LOCAL->set("couldhavesaved",number_format($IS4C_LOCAL->get("memSpecial"), 2)); + $IS4C_LOCAL->set("specials",$IS4C_LOCAL->get("discounttotal")); + } + + + // call to transLog, the body of the receipt comes from the view 'receipt' + $receipt = $title.printReceiptHeader($dateTimeStamp, $ref); + + $receipt .= receiptDetail(True,$ref); + + // The Nitty Gritty: + $member = "Member ".trim($IS4C_LOCAL->get("memberID")); + $your_discount = $IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("memCouponTTL"); + + if ($IS4C_LOCAL->get("transDiscount") + $IS4C_LOCAL->get("memCouponTTL") + $IS4C_LOCAL->get("specials") > 0) { + $receipt .= "\n".centerString("------------------ YOUR SAVINGS -------------------")."\n"; + + if ($your_discount > 0) { + $receipt .= " DISCOUNTS: $".number_format($your_discount, 2)."\n"; + } + + if ($IS4C_LOCAL->get("specials") > 0) { + $receipt .= " SPECIALS: $".number_format($IS4C_LOCAL->get("specials"), 2)."\n"; + } + + $receipt .= centerString("---------------------------------------------------")."\n"; + } + $receipt .= "\n"; + + if (trim($IS4C_LOCAL->get("memberID")) != $IS4C_LOCAL->get("defaultNonMem")) { + $receipt .= centerString("Thank You - ".$member."!!!")."\n"; + } + else { + $receipt .= centerString("Thank You!!!")."\n"; + } + + if ($IS4C_LOCAL->get("yousaved") > 0) { + $receipt .= centerString("You Saved $".number_format($IS4C_LOCAL->get("yousaved"), 2))."\n"; + } + + if ($IS4C_LOCAL->get("couldhavesaved") > 0 && $IS4C_LOCAL->get("yousaved") > 0) { + $receipt .= centerString("You could have saved an additional $" + .number_format($IS4C_LOCAL->get("couldhavesaved"), 2))."\n"; + } + elseif ($IS4C_LOCAL->get("couldhavesaved") > 0) { + $receipt .= centerString("You could have saved $" + .number_format($IS4C_LOCAL->get("couldhavesaved"), 2))."\n"; + } + + $receipt .= centerString("Returns accepted with receipt")."\n" + .centerString("within 30 days of purchase.")."\n\n\n"; + + + if ($IS4C_LOCAL->get("chargetender") != 0 ) { // apbw 03/10/05 Reprint patch + $receipt = $receipt.printChargeFooterStore($dateTimeStamp, $ref); // apbw 03/10/05 Reprint patch + } // apbw 03/10/05 Reprint patch + + $receipt .= printGCSlip($dateTimeStamp, $ref, true, 1); + $receipt .= printCCSigSlip($dateTimeStamp, $ref, False, 1); + + $receipt = $receipt."\n\n\n\n\n\n\n"; // apbw 03/10/05 Reprint patch + writeLine($receipt.chr(27).chr(105)); // apbw 03/10/05 Reprint patch + $receipt = ""; // apbw 03/10/05 Reprint patch + + $IS4C_LOCAL->set("memMsg",""); + $IS4C_LOCAL->set("memberID","0"); + $IS4C_LOCAL->set("percentDiscount",0); + } +} + +?> diff --git a/pos/is4c-web/lib/session.php b/pos/is4c-web/lib/session.php new file mode 100644 index 000000000..079db6993 --- /dev/null +++ b/pos/is4c-web/lib/session.php @@ -0,0 +1,223 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +include_once($IS4C_PATH."ini.php"); +if (!function_exists("pDataConnect")) include($IS4C_PATH."lib/connect.php"); +if (!function_exists("loadglobalvalues")) include($IS4C_PATH."lib/loadconfig.php"); +if (!function_exists("paycard_reset")) include($IS4C_PATH."lib/paycardLib.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +function initiate_session() { + + system_init(); + memberReset(); + transReset(); + printReset(); + paycard_reset(); + + getsubtotals(); + loadglobalvalues(); + loaddata(); +} + +function system_init() { + global $IS4C_LOCAL; + + //$IS4C_LOCAL->set("datetimestamp",strftime("%Y-%m-%m/%d/%y %T",time())); + $IS4C_LOCAL->set("beep","noBeep"); + $IS4C_LOCAL->set("scan","scan"); + $IS4C_LOCAL->set("standalone",0); + $IS4C_LOCAL->set("SNR",0); + $IS4C_LOCAL->set("screset","staycool"); + $IS4C_LOCAL->set("currentid",1); + $IS4C_LOCAL->set("currenttopid",1); + $IS4C_LOCAL->set("training",0); + $IS4C_LOCAL->set("adminRequest",""); + $IS4C_LOCAL->set("weight",0); + $IS4C_LOCAL->set("scale",1); + $IS4C_LOCAL->set("msg",0); + $IS4C_LOCAL->set("plainmsg",""); + //$IS4C_LOCAL->set("alert",""); + $IS4C_LOCAL->set("away",0); + $IS4C_LOCAL->set("waitforScale",0); + $IS4C_LOCAL->set("ccRemoteServerUp",1); + $IS4C_LOCAL->set("ccTermOut","idle"); + $IS4C_LOCAL->set("search_or_list",0); +} + +function transReset() { + global $IS4C_LOCAL; + + $IS4C_LOCAL->set("End",0); + $IS4C_LOCAL->set("memberID","0"); + $IS4C_LOCAL->set("TaxExempt",0); + $IS4C_LOCAL->set("fstaxable",0); + $IS4C_LOCAL->set("yousaved",0); + $IS4C_LOCAL->set("couldhavesaved",0); + //$IS4C_LOCAL->set("void",0); + $IS4C_LOCAL->set("voided",0); + $IS4C_LOCAL->set("tare",0); + $IS4C_LOCAL->set("tenderamt",0); + $IS4C_LOCAL->set("change",0); + $IS4C_LOCAL->set("transstatus",""); + $IS4C_LOCAL->set("ccTender",0); + $IS4C_LOCAL->set("ccAmtEntered",0); + $IS4C_LOCAL->set("ccAmt",0); + $IS4C_LOCAL->set("TenderType","XX"); + $IS4C_LOCAL->set("ChgName","Charge Account"); + $IS4C_LOCAL->set("cashOverAmt",0); + $IS4C_LOCAL->set("chargetender",0); + $IS4C_LOCAL->set("mirequested",0); + $IS4C_LOCAL->set("toggletax",0); + $IS4C_LOCAL->set("togglefoodstamp",0); + $IS4C_LOCAL->set("toggleDiscountable",0); + //$IS4C_LOCAL->set("ttlrequested",0); + $IS4C_LOCAL->set("discounttype",0); + $IS4C_LOCAL->set("discountable",0); + $IS4C_LOCAL->set("refund",0); + //$IS4C_LOCAL->set("istaxable",0); + $IS4C_LOCAL->set("mfcoupon",0); + $IS4C_LOCAL->set("casediscount",0); + //$IS4C_LOCAL->set("ondiscount",0); + $IS4C_LOCAL->set("multiple",0); + $IS4C_LOCAL->set("quantity",0); + $IS4C_LOCAL->set("nd",0); // negates default 10% discount at the charge book + $IS4C_LOCAL->set("sc",0); // marks transaction as a staff charge at the charge book + $IS4C_LOCAL->set("idSearch",""); + //$IS4C_LOCAL->set("repeat",0); + $IS4C_LOCAL->set("strEntered",""); + $IS4C_LOCAL->set("strRemembered",""); + $IS4C_LOCAL->set("msgrepeat",0); // when set to 1, pos2.php takes the previous strEntered + $IS4C_LOCAL->set("boxMsg",""); + $IS4C_LOCAL->set("itemPD",0); // Item percent discount for the charge book + $IS4C_LOCAL->set("specials",0); + $IS4C_LOCAL->set("ccSwipe",""); + $IS4C_LOCAL->set("ccName",""); + $IS4C_LOCAL->set("ccType",""); + $IS4C_LOCAL->set("troutd",""); + $IS4C_LOCAL->set("ouxWait",0); + + $IS4C_LOCAL->set("warned",0); + $IS4C_LOCAL->set("warnBoxType",""); + $IS4C_LOCAL->set("requestType",""); +} + +function printReset() { + global $IS4C_LOCAL; + + //$IS4C_LOCAL->set("franking",0); + //$IS4C_LOCAL->set("noreceipt",0); + $IS4C_LOCAL->set("receiptToggle",1); + $IS4C_LOCAL->set("receiptType",""); + $IS4C_LOCAL->set("endorseType",""); + //$IS4C_LOCAL->set("kick",1); + + $IS4C_LOCAL->set("autoReprint",0); + $IS4C_LOCAL->set("reprintNameLookup",0); +} + +function memberReset() { + global $IS4C_LOCAL; + + $IS4C_LOCAL->set("memberID","0"); + $IS4C_LOCAL->set("isMember",0); + $IS4C_LOCAL->set("isStaff",0); + $IS4C_LOCAL->set("SSI",0); + //$IS4C_LOCAL->set("discountcap",0); + $IS4C_LOCAL->set("memMsg",""); + $IS4C_LOCAL->set("memType",0); + $IS4C_LOCAL->set("balance",0); + $IS4C_LOCAL->set("availBal",0); + $IS4C_LOCAL->set("percentDiscount",0); + + $IS4C_LOCAL->set("ar_paid",0); + $IS4C_LOCAL->set("inactMem",0); +} + +function blueLine($row) { + $status = array('Non-Owner', 'Shareholder', 'Subscriber', 'Inactive', 'Refund', 'On Hold', 'Sister Org.', 'Other Co-ops'); + if ($row["blueLine"]) { // custom blueLine as defined by db + return $row["blueLine"]; + } elseif (isset($row["blueLine"])) { // 0 - default blueLine with out name + return '#'.$row['CardNo'].' - '.$row['Discount'].'% - '.$status[$row['memType']]; + } else { // NULL - default blueLine including name + return '#'.$row['CardNo'].' - '.$status[$row['memType']].': '.$row['FirstName'].' '.$row['LastName']; + } +} + +function loaddata() { + global $IS4C_LOCAL; + + $query_local = "select card_no from localtemptrans"; + + $db_local = tDataConnect(); + $result_local = $db_local->query($query_local); + $num_rows_local = $db_local->num_rows($result_local); + + if ($num_rows_local > 0) { + $row_local = $db_local->fetch_array($result_local); + + if ($row_local["card_no"] && strlen($row_local["card_no"]) > 0) { + $IS4C_LOCAL->set("memberID",$row_local["card_no"]); + } + } + // moved, no need to stay open - andy 4/12/07 + $db_local->close(); + + if ($IS4C_LOCAL->get("memberID") == "0") { + // not used - andy 4/12/07 + $IS4C_LOCAL->set("percentDiscount",0); + $IS4C_LOCAL->set("memType",0); + } + else { + $query_member = "select CardNo,memType,Type,Discount,staff,SSI, + MemDiscountLimit,blueLine,FirstName,LastName + from custdata where CardNo = '".$IS4C_LOCAL->get("memberID")."'"; + $db_product = pDataConnect(); + $result = $db_product->query($query_member); + if ($db_product->num_rows($result) > 0) { + $row = $db_product->fetch_array($result); + $IS4C_LOCAL->set("memMsg",blueLine($row)); + $IS4C_LOCAL->set("memType",$row["memType"]); + $IS4C_LOCAL->set("percentDiscount",$row["Discount"]); + + if ($row["Type"] == "PC") $IS4C_LOCAL->set("isMember",1); + else $IS4C_LOCAL->set("isMember",0); + + $IS4C_LOCAL->set("isStaff",$row["staff"]); + $IS4C_LOCAL->set("SSI",$row["SSI"]); + $IS4C_LOCAL->set("discountcap",$row["MemDiscountLimit"]); + + if ($IS4C_LOCAL->get("SSI") == 1) + $IS4C_LOCAL->set("memMsg",$IS4C_LOCAL->get("memMsg")." #"); + } + // moved for proper scope - andy 4/12/07 + $db_product->close(); + } +} + + +?> diff --git a/pos/is4c-web/lib/setDrawerKick.php b/pos/is4c-web/lib/setDrawerKick.php new file mode 100644 index 000000000..4b63f0a1f --- /dev/null +++ b/pos/is4c-web/lib/setDrawerKick.php @@ -0,0 +1,74 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +// Sets the $_SESSION["kick"] variable to control when the drawer opens ----- apbw 03/29/05 Drawer Kick Patch +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + + +function setDrawerKick() + +{ + global $IS4C_LOCAL; + +// this, the simplest version, kicks the drawer for every tender *except* staff charge & business charge (MI, CX) +// apbw 05/03/05 KickFix added !=0 criteria + + if ($IS4C_LOCAL->get("chargeTotal") == $IS4C_LOCAL->get("tenderTotal") && $IS4C_LOCAL->get("chargeTotal") != 0 && $IS4C_LOCAL->get("tenderTotal") != 0 ) { + //$_SESSION["kick"] = 0; + return 0; + } else { + //$_SESSION["kick"] = 1; + return 1; + } +} + +function setDrawerKickLater() + +{ + +// this more complex version can be modified to kick the drawer under whatever circumstances the FE Mgr sees fit +// it currently kicks the drawer *only* for cash in & out +// and credit card - andy + + + $db = tDataConnect(); + + $query = "select trans_id from localtemptrans where (trans_subtype = 'CA' and total <> 0) or trans_subtype = 'CC' or upc='0000000001065'"; + + $result = $db->query($query); + $num_rows = $db->num_rows($result); + + if ($num_rows != 0) { + //$_SESSION["kick"] = 1; + return 1; + } else { + //$_SESSION["kick"] = 0; + return 0; + } + +} + +?> diff --git a/pos/is4c-web/lib/special.php b/pos/is4c-web/lib/special.php new file mode 100644 index 000000000..eea2cd7f7 --- /dev/null +++ b/pos/is4c-web/lib/special.php @@ -0,0 +1,89 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("receipt")) include($IS4C_PATH."lib/clientscripts.php"); +if (!function_exists("getMatchingColumns")) include($IS4C_PATH."lib/connect.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + + +function suspendorder() { + global $IS4C_LOCAL; + + //testremote(); + $query_a = "select emp_no, trans_no from localtemptrans"; + $db_a = tDataConnect(); + $result_a = $db_a->query($query_a); + $row_a = $db_a->fetch_array($result_a); + $cashier_no = substr("000".$row_a["emp_no"], -2); + $trans_no = substr("0000".$row_a["trans_no"], -4); + + if ($IS4C_LOCAL->get("standalone") == 0) { + $db_a->add_connection($IS4C_LOCAL->get("mServer"),$IS4C_LOCAL->get("mDBMS"), + $IS4C_LOCAL->get("mDatabase"),$IS4C_LOCAL->get("mUser"),$IS4C_LOCAL->get("mPass")); + $cols = getMatchingColumns($db_a,"localtemptrans","suspended"); + $db_a->transfer($IS4C_LOCAL->get("tDatabase"),"select {$cols} from localtemptrans", + $IS4C_LOCAL->get("mDatabase"),"insert into suspended ($cols)"); + $db_a->close($IS4C_LOCAL->get("mDatabase")); + } + else { + $query = "insert into suspended select * from localtemptrans"; + $result = $db_a->query($query); + } + + $IS4C_LOCAL->set("plainmsg","transaction suspended"); + $IS4C_LOCAL->set("msg",2); + receipt("suspended"); + $recall_line = $IS4C_LOCAL->get("standalone")." ".$IS4C_LOCAL->get("laneno")." ".$cashier_no." ".$trans_no; + + $db_a->close(); +} + +function checksuspended() { + global $IS4C_LOCAL; + + //testremote(); + + $db_a = tDataConnect(); + $query_local = "select * from suspendedtoday"; + + $result = ""; + if ($IS4C_LOCAL->get("standalone") == 1) { + $result = $db_a->query($query_local); + } else { + $db_a->close(); + $db_a = mDataConnect(); + $result = $db_a->query($query_local); + } + + $num_rows = $db_a->num_rows($result); + + if ($num_rows == 0) return 0; + else return 1; + + $db_a->close(); +} + +?> diff --git a/pos/is4c-web/lib/tenderReport.php b/pos/is4c-web/lib/tenderReport.php new file mode 100644 index 000000000..2863e62c4 --- /dev/null +++ b/pos/is4c-web/lib/tenderReport.php @@ -0,0 +1,122 @@ +<?php +/******************************************************************************* + + Copyright 2001, 2004 Wedge Community Co-op + + This file is part of IS4C. + + IS4C is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + IS4C is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + in the file license.txt along with IS4C; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*********************************************************************************/ + +$IS4C_PATH = isset($IS4C_PATH)?$IS4C_PATH:""; +if (empty($IS4C_PATH)){ while(!file_exists($IS4C_PATH."is4c.css")) $IS4C_PATH .= "../"; } + +if (!function_exists("printReceipt")) include($IS4C_PATH."lib/printReceipt.php"); +if (!function_exists("mDataConnect")) include($IS4C_PATH."lib/connect.php"); +if (!isset($IS4C_LOCAL)) include($IS4C_PATH."lib/LocalStorage/conf.php"); + +/* Revised tender report function - andy - 9/6/07 + * + * This tender report is based on a single tender tape view + * rather than multiple views (e.g. ckTenders, ckTenderTotal, etc) + * adding a new tender is mostly just a matter of adding it + * to the $DESIRED_TENDERS array (exception being if you want + * special handling in the tender tape view (e.g., three + * tender types are actually compined under EBT) + */ +function tenderReport(){ + global $IS4C_LOCAL; + + $DESIRED_TENDERS = array("CK"=>"CHECK TENDERS", + "CC"=>"CREDIT CARD TENDERS", + "GD"=>"GIFT CARD TENDERS", + "TC"=>"GIFT CERT TENDERS", + "MI"=>"STORE CHARGE TENDERS", + "EF"=>"EBT CARD TENDERS", + "CP"=>"COUPONS TENDERED", + "IC"=>"INSTORE COUPONS TENDERED", + "ST"=>"STAMP BOOKS SOLD", + "BP"=>"BUS PASSES SOLD", + "AR"=>"AR PAYMENTS", + "EQ"=>"EQUITY SALES" + ); + + $db_a = mDataConnect(); + + $blank = " "; + $fieldNames = " ".substr("Time".$blank, 0, 13) + .substr("Lane".$blank, 0, 9) + .substr("Trans #".$blank, 0, 12) + .substr("Change".$blank, 0, 14) + .substr("Amount".$blank, 0, 14)."\n"; + $ref = centerString(trim($IS4C_LOCAL->get("CashierNo"))." ".trim($IS4C_LOCAL->get("cashier"))." ".build_time(time()))."\n\n"; + $receipt = ""; + + foreach(array_keys($DESIRED_TENDERS) as $tender_code){ + $query = "select tdate from TenderTapeGeneric where emp_no=".$IS4C_LOCAL->get("CashierNo"). + " and trans_subtype = '".$tender_code."' order by tdate"; + $result = $db_a->query($query); + $num_rows = $db_a->num_rows($result); + if ($num_rows <= 0) continue; + + //$receipt .= chr(27).chr(33).chr(5); + + $titleStr = ""; + for ($i = 0; $i < strlen($DESIRED_TENDERS[$tender_code]); $i++) + $titleStr .= $DESIRED_TENDERS[$tender_code][$i]." "; + $titleStr = substr($titleStr,0,strlen($titleStr)-1); + $receipt .= centerString($titleStr)."\n"; + + $receipt .= $ref; + $receipt .= centerString("------------------------------------------------------"); + + $query = "select tdate,register_no,trans_no,tender + from TenderTapeGeneric where emp_no=".$IS4C_LOCAL->get("CashierNo"). + " and trans_subtype = '".$tender_code."' order by tdate"; + $result = $db_a->query($query); + $num_rows = $db_a->num_rows($result); + + $receipt .= $fieldNames; + $sum = 0; + + for ($i = 0; $i < $num_rows; $i++) { + + $row = $db_a->fetch_array($result); + $timeStamp = timeStamp($row["tdate"]); + $receipt .= " ".substr($timeStamp.$blank, 0, 13) + .substr($row["register_no"].$blank, 0, 9) + .substr($row["trans_no"].$blank, 0, 8) + .substr($blank.number_format("0", 2), -10) + .substr($blank.number_format($row["tender"], 2), -14)."\n"; + $sum += $row["tender"]; + } + $receipt.= centerString("------------------------------------------------------"); + + $receipt .= substr($blank.$blank.$blank.$blank."Total: ".$sum, -56)."\n"; + $receipt .= str_repeat("\n", 8); + $receipt .= chr(27).chr(105); + } + + writeLine($receipt.chr(27).chr(105)); + $db_a->close(); +} + +function timeStamp($time) { + + return strftime("%I:%M %p", strtotime($time)); +} + +?> diff --git a/pos/is4c-web/lib/udpSend.php b/pos/is4c-web/lib/udpSend.php new file mode 100644 index 000000000..677d572b3 --- /dev/null +++ b/pos/is4c-web/lib/udpSend.php @@ -0,0 +1,10 @@ +<?php + +function udpSend($msg,$port=9450){ + if (!function_exists("socket_create")) return; + $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + $res = socket_sendto($sock, $msg, strlen($msg), 0, '127.0.0.1',$port); + socket_close($sock); +} + +?> diff --git a/pos/is4c-web/lib/xmlData.php b/pos/is4c-web/lib/xmlData.php new file mode 100644 index 000000000..15a123004 --- /dev/null +++ b/pos/is4c-web/lib/xmlData.php @@ -0,0 +1,83 @@ +<?php + +class xmlData { + + var $parser; + var $DATA; + var $curTag; + var $valid; + + function xmlData($str){ + $this->valid = False; + $this->parser = xml_parser_create(); + xml_set_object($this->parser,$this); + xml_set_element_handler($this->parser,"startTag","endTag"); + xml_set_character_data_handler($this->parser,"tagData"); + xml_parse($this->parser,$str,True); + xml_parser_free($this->parser); + } + + function startTag($parser,$name,$attr){ + $name = strtoupper($name); + if (isset($attr["KEY"])) + $name = strtoupper($attr["KEY"]); + $this->curTag = array("tag"=>$name,"attributes"=>$attr,"chardata"=>""); + } + + function endTag($parser,$name){ + $name = $this->curTag["tag"]; + if (!isset($this->DATA["$name"])) + $this->DATA["$name"] = array(); + array_push($this->DATA["$name"],$this->curTag); + $this->valid = True; + } + + function tagData($parser,$data){ + $this->curTag["chardata"] = $data; + } + + function get($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + if (count($this->DATA["$tagname"]) == 1){ + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + + } + else { + $ret = array(); + foreach ($this->DATA["$tagname"] as $d) + array_push($ret,$d["chardata"]); + return $ret; + } + } + + function isValid(){ return $this->valid; } + + function get_first($tagname){ + $tagname = strtoupper($tagname); + if (!isset($this->DATA["$tagname"])) + return False; + else { + if (isset($this->DATA["$tagname"][0]["chardata"])) + return $this->DATA["$tagname"][0]["chardata"]; + else + return False; + } + } + + function array_dump(){ + $ret = array(); + foreach ($this->DATA as $field=>$value){ + if (isset($value[0]) && + isset($value[0]["chardata"])) + $ret[$field] = $value[0]["chardata"]; + } + return $ret; + } +} + +?> diff --git a/pos/is4c-web/license.txt b/pos/is4c-web/license.txt new file mode 100644 index 000000000..9f8d190e3 --- /dev/null +++ b/pos/is4c-web/license.txt @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details Type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; Type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/pos/is4c-web/log/php-errors.log b/pos/is4c-web/log/php-errors.log new file mode 100644 index 000000000..fb87bc960 --- /dev/null +++ b/pos/is4c-web/log/php-errors.log @@ -0,0 +1,15 @@ +[09-Dec-2010 11:09:40] PHP Warning: Unknown: open(/var/lib/php/session/sess_4eg2sdkdnhthu93dfcaokc6s01, O_RDWR) failed: Permission denied (13) in Unknown on line 0 +[09-Dec-2010 11:09:40] PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 +[09-Dec-2010 12:17:42] PHP Notice: Undefined index: REQUEST_URI in /var/www/html/git/IS4C/pos/is4c-web/auth/utilities.php on line 45 +[09-Dec-2010 12:17:42] PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/git/IS4C/pos/is4c-web/auth/utilities.php:45) in /var/www/html/git/IS4C/pos/is4c-web/gui-modules/manageAccount.php on line 78 +[09-Dec-2010 12:17:42] PHP Warning: Unknown: open(/var/lib/php/session/sess_1f0he232be8clpo1tbg94u7lm5, O_RDWR) failed: Permission denied (13) in Unknown on line 0 +[09-Dec-2010 12:17:42] PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 +[09-Dec-2010 12:34:07] PHP Notice: Undefined index: REQUEST_URI in /var/www/html/git/IS4C/pos/is4c-web/auth/utilities.php on line 45 +[09-Dec-2010 12:34:07] PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/git/IS4C/pos/is4c-web/auth/utilities.php:45) in /var/www/html/git/IS4C/pos/is4c-web/gui-modules/changePassword.php on line 76 +[09-Dec-2010 12:34:07] PHP Warning: Unknown: open(/var/lib/php/session/sess_ujhl3q3oovd7ir28osluq5dr84, O_RDWR) failed: Permission denied (13) in Unknown on line 0 +[09-Dec-2010 12:34:07] PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 +[11-Jan-2011 10:42:46] PHP Notice: Undefined index: REQUEST_URI in /var/www/html/git/IS4C/pos/is4c-web/auth/utilities.php on line 45 +[11-Jan-2011 10:42:46] PHP Warning: Unknown: open(/var/lib/php/session/sess_h2ubm7pj99os48rl4h1p4fmhr0, O_RDWR) failed: Permission denied (13) in Unknown on line 0 +[11-Jan-2011 10:42:46] PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 +[31-Mar-2011 10:50:22] PHP Warning: Unknown: open(/var/lib/php/session/sess_5rnml6ehgmhj8t8hj9nk0ciko7, O_RDWR) failed: Permission denied (13) in Unknown on line 0 +[31-Mar-2011 10:50:22] PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 diff --git a/pos/is4c-web/phpinfo.php b/pos/is4c-web/phpinfo.php new file mode 100644 index 000000000..cf6086080 --- /dev/null +++ b/pos/is4c-web/phpinfo.php @@ -0,0 +1,3 @@ +<?php +phpinfo(); +?> diff --git a/pos/is4c-web/src/images/clock.gif b/pos/is4c-web/src/images/clock.gif new file mode 100644 index 000000000..0dba554e0 Binary files /dev/null and b/pos/is4c-web/src/images/clock.gif differ diff --git a/pos/is4c-web/src/images/compass.gif b/pos/is4c-web/src/images/compass.gif new file mode 100644 index 000000000..748956da9 Binary files /dev/null and b/pos/is4c-web/src/images/compass.gif differ diff --git a/pos/is4c-web/src/images/deli.gif b/pos/is4c-web/src/images/deli.gif new file mode 100644 index 000000000..ca7fdbc26 Binary files /dev/null and b/pos/is4c-web/src/images/deli.gif differ diff --git a/pos/is4c-web/src/images/facebook_sm.gif b/pos/is4c-web/src/images/facebook_sm.gif new file mode 100644 index 000000000..1497f0c99 Binary files /dev/null and b/pos/is4c-web/src/images/facebook_sm.gif differ diff --git a/pos/is4c-web/src/images/grass.gif b/pos/is4c-web/src/images/grass.gif new file mode 100644 index 000000000..6ab259666 Binary files /dev/null and b/pos/is4c-web/src/images/grass.gif differ diff --git a/pos/is4c-web/src/images/greyleaf.gif b/pos/is4c-web/src/images/greyleaf.gif new file mode 100644 index 000000000..ac13db0b1 Binary files /dev/null and b/pos/is4c-web/src/images/greyleaf.gif differ diff --git a/pos/is4c-web/src/images/indexBackgroundBottom.gif b/pos/is4c-web/src/images/indexBackgroundBottom.gif new file mode 100644 index 000000000..3b73ae242 Binary files /dev/null and b/pos/is4c-web/src/images/indexBackgroundBottom.gif differ diff --git a/pos/is4c-web/src/images/indexBackgroundTop.gif b/pos/is4c-web/src/images/indexBackgroundTop.gif new file mode 100644 index 000000000..71139c71c Binary files /dev/null and b/pos/is4c-web/src/images/indexBackgroundTop.gif differ diff --git a/pos/is4c-web/src/images/indexBanner.jpg b/pos/is4c-web/src/images/indexBanner.jpg new file mode 100644 index 000000000..130b15066 Binary files /dev/null and b/pos/is4c-web/src/images/indexBanner.jpg differ diff --git a/pos/is4c-web/src/images/insideBanner.jpg b/pos/is4c-web/src/images/insideBanner.jpg new file mode 100644 index 000000000..524d2124e Binary files /dev/null and b/pos/is4c-web/src/images/insideBanner.jpg differ diff --git a/pos/is4c-web/src/images/mainBackground.gif b/pos/is4c-web/src/images/mainBackground.gif new file mode 100644 index 000000000..c4d71c6de Binary files /dev/null and b/pos/is4c-web/src/images/mainBackground.gif differ diff --git a/pos/is4c-web/src/images/navbackground.gif b/pos/is4c-web/src/images/navbackground.gif new file mode 100644 index 000000000..e1b929f8d Binary files /dev/null and b/pos/is4c-web/src/images/navbackground.gif differ diff --git a/pos/is4c-web/src/images/plu.gif b/pos/is4c-web/src/images/plu.gif new file mode 100644 index 000000000..23d863a22 Binary files /dev/null and b/pos/is4c-web/src/images/plu.gif differ diff --git a/pos/is4c-web/src/images/purpleleaf.gif b/pos/is4c-web/src/images/purpleleaf.gif new file mode 100644 index 000000000..3383d0471 Binary files /dev/null and b/pos/is4c-web/src/images/purpleleaf.gif differ diff --git a/pos/is4c-web/src/images/wholefoodscoop.gif b/pos/is4c-web/src/images/wholefoodscoop.gif new file mode 100644 index 000000000..37aa7965f Binary files /dev/null and b/pos/is4c-web/src/images/wholefoodscoop.gif differ diff --git a/pos/is4c-web/src/includes/SpryAssets/SpryMenuBarDownHover.gif b/pos/is4c-web/src/includes/SpryAssets/SpryMenuBarDownHover.gif new file mode 100644 index 000000000..1d9a4f524 Binary files /dev/null and b/pos/is4c-web/src/includes/SpryAssets/SpryMenuBarDownHover.gif differ diff --git a/pos/is4c-web/src/includes/SpryAssets/SpryMenuBarRightHover.gif b/pos/is4c-web/src/includes/SpryAssets/SpryMenuBarRightHover.gif new file mode 100644 index 000000000..1d9a4f524 Binary files /dev/null and b/pos/is4c-web/src/includes/SpryAssets/SpryMenuBarRightHover.gif differ diff --git a/pos/is4c-web/src/includes/SpryMenuBar.js b/pos/is4c-web/src/includes/SpryMenuBar.js new file mode 100644 index 000000000..9f52f1f87 --- /dev/null +++ b/pos/is4c-web/src/includes/SpryMenuBar.js @@ -0,0 +1,332 @@ +/* SpryMenuBar.js - Revision: Spry Preview Release 1.4 */ + +// Copyright (c) 2006. Adobe Systems Incorporated. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of Adobe Systems Incorporated nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +/******************************************************************************* + + SpryMenuBar.js + This file handles the JavaScript for Spry Menu Bar. You should have no need + to edit this file. Some highlights of the MenuBar object is that timers are + used to keep submenus from showing up until the user has hovered over the parent + menu item for some time, as well as a timer for when they leave a submenu to keep + showing that submenu until the timer fires. + + *******************************************************************************/ + +var Spry; +if(!Spry) +{ + Spry = {}; +} +if(!Spry.Widget) +{ + Spry.Widget = {}; +} + +// Constructor for Menu Bar +// element should be an ID of an unordered list (<ul> tag) +// preloadImage1 and preloadImage2 are images for the rollover state of a menu +Spry.Widget.MenuBar = function(element, opts) +{ + this.init(element, opts); +}; + +Spry.Widget.MenuBar.prototype.init = function(element, opts) +{ + this.element = this.getElement(element); + + // represents the current (sub)menu we are operating on + this.currMenu = null; + + var isie = (typeof document.all != 'undefined' && typeof window.opera == 'undefined' && navigator.vendor != 'KDE'); + if(typeof document.getElementById == 'undefined' || (navigator.vendor == 'Apple Computer, Inc.' && typeof window.XMLHttpRequest == 'undefined') || (isie && typeof document.uniqueID == 'undefined')) + { + // bail on older unsupported browsers + return; + } + + // load hover images now + if(opts) + { + for(var k in opts) + { + var rollover = new Image; + rollover.src = opts[k]; + } + } + + if(this.element) + { + this.currMenu = this.element; + var items = this.element.getElementsByTagName('li'); + for(var i=0; i<items.length; i++) + { + this.initialize(items[i], element, isie); + if(isie) + { + this.addClassName(items[i], "MenuBarItemIE"); + items[i].style.position = "static"; + } + } + if(isie) + { + if(this.hasClassName(this.element, "MenuBarVertical")) + { + this.element.style.position = "relative"; + } + var linkitems = this.element.getElementsByTagName('a'); + for(var i=0; i<linkitems.length; i++) + { + linkitems[i].style.position = "relative"; + } + } + } +}; + +Spry.Widget.MenuBar.prototype.getElement = function(ele) +{ + if (ele && typeof ele == "string") + return document.getElementById(ele); + return ele; +}; + +Spry.Widget.MenuBar.prototype.hasClassName = function(ele, className) +{ + if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1) + { + return false; + } + return true; +}; + +Spry.Widget.MenuBar.prototype.addClassName = function(ele, className) +{ + if (!ele || !className || this.hasClassName(ele, className)) + return; + ele.className += (ele.className ? " " : "") + className; +}; + +Spry.Widget.MenuBar.prototype.removeClassName = function(ele, className) +{ + if (!ele || !className || !this.hasClassName(ele, className)) + return; + ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), ""); +}; + +// addEventListener for Menu Bar +// attach an event to a tag without creating obtrusive HTML code +Spry.Widget.MenuBar.prototype.addEventListener = function(element, eventType, handler, capture) +{ + try + { + if (element.addEventListener) + { + element.addEventListener(eventType, handler, capture); + } + else if (element.attachEvent) + { + element.attachEvent('on' + eventType, handler); + } + } + catch (e) {} +}; + +// createIframeLayer for Menu Bar +// creates an IFRAME underneath a menu so that it will show above form controls and ActiveX +Spry.Widget.MenuBar.prototype.createIframeLayer = function(menu) +{ + var layer = document.createElement('iframe'); + layer.tabIndex = '-1'; + layer.src = 'javascript:false;'; + menu.parentNode.appendChild(layer); + + layer.style.left = menu.offsetLeft + 'px'; + layer.style.top = menu.offsetTop + 'px'; + layer.style.width = menu.offsetWidth + 'px'; + layer.style.height = menu.offsetHeight + 'px'; +}; + +// removeIframeLayer for Menu Bar +// removes an IFRAME underneath a menu to reveal any form controls and ActiveX +Spry.Widget.MenuBar.prototype.removeIframeLayer = function(menu) +{ + var layers = menu.parentNode.getElementsByTagName('iframe'); + while(layers.length > 0) + { + layers[0].parentNode.removeChild(layers[0]); + } +}; + +// clearMenus for Menu Bar +// root is the top level unordered list (<ul> tag) +Spry.Widget.MenuBar.prototype.clearMenus = function(root) +{ + var menus = root.getElementsByTagName('ul'); + for(var i=0; i<menus.length; i++) + { + this.hideSubmenu(menus[i]); + } + this.removeClassName(this.element, "MenuBarActive"); +}; + +// bubbledTextEvent for Menu Bar +// identify bubbled up text events in Safari so we can ignore them +Spry.Widget.MenuBar.prototype.bubbledTextEvent = function() +{ + return (navigator.vendor == 'Apple Computer, Inc.' && (event.target == event.relatedTarget.parentNode || (event.eventPhase == 3 && event.target.parentNode == event.relatedTarget))); +}; + +// showSubmenu for Menu Bar +// set the proper CSS class on this menu to show it +Spry.Widget.MenuBar.prototype.showSubmenu = function(menu) +{ + if(this.currMenu) + { + this.clearMenus(this.currMenu); + this.currMenu = null; + } + + if(menu) + { + this.addClassName(menu, "MenuBarSubmenuVisible"); + if(typeof document.all != 'undefined' && typeof window.opera == 'undefined' && navigator.vendor != 'KDE') + { + if(!this.hasClassName(this.element, "MenuBarHorizontal") || menu.parentNode.parentNode != this.element) + { + menu.style.top = menu.parentNode.offsetTop + 'px'; + } + } + if(typeof document.uniqueID != "undefined") + { + this.createIframeLayer(menu); + } + } + this.addClassName(this.element, "MenuBarActive"); +}; + +// hideSubmenu for Menu Bar +// remove the proper CSS class on this menu to hide it +Spry.Widget.MenuBar.prototype.hideSubmenu = function(menu) +{ + if(menu) + { + this.removeClassName(menu, "MenuBarSubmenuVisible"); + if(typeof document.all != 'undefined' && typeof window.opera == 'undefined' && navigator.vendor != 'KDE') + { + menu.style.top = ''; + menu.style.left = ''; + } + this.removeIframeLayer(menu); + } +}; + +// initialize for Menu Bar +// create event listeners for the Menu Bar widget so we can properly +// show and hide submenus +Spry.Widget.MenuBar.prototype.initialize = function(listitem, element, isie) +{ + var opentime, closetime; + var link = listitem.getElementsByTagName('a')[0]; + var submenus = listitem.getElementsByTagName('ul'); + var menu = (submenus.length > 0 ? submenus[0] : null); + + var hasSubMenu = false; + if(menu) + { + this.addClassName(link, "MenuBarItemSubmenu"); + hasSubMenu = true; + } + + if(!isie) + { + // define a simple function that comes standard in IE to determine + // if a node is within another node + listitem.contains = function(testNode) + { + // this refers to the list item + if(testNode == null) + { + return false; + } + if(testNode == this) + { + return true; + } + else + { + return this.contains(testNode.parentNode); + } + }; + } + + // need to save this for scope further down + var self = this; + + this.addEventListener(listitem, 'mouseover', function(e) + { + if(self.bubbledTextEvent()) + { + // ignore bubbled text events + return; + } + clearTimeout(closetime); + if(self.currMenu == listitem) + { + self.currMenu = null; + } + // show menu highlighting + self.addClassName(link, hasSubMenu ? "MenuBarItemSubmenuHover" : "MenuBarItemHover"); + if(menu && !self.hasClassName(menu, "MenuBarSubmenuVisible")) + { + opentime = window.setTimeout(function(){self.showSubmenu(menu);}, 250); + } + }, false); + + this.addEventListener(listitem, 'mouseout', function(e) + { + if(self.bubbledTextEvent()) + { + // ignore bubbled text events + return; + } + + var related = (typeof e.relatedTarget != 'undefined' ? e.relatedTarget : e.toElement); + if(!listitem.contains(related)) + { + clearTimeout(opentime); + self.currMenu = listitem; + + // remove menu highlighting + self.removeClassName(link, hasSubMenu ? "MenuBarItemSubmenuHover" : "MenuBarItemHover"); + if(menu) + { + closetime = window.setTimeout(function(){self.hideSubmenu(menu);}, 600); + } + } + }, false); +}; diff --git a/pos/is4c-web/src/includes/SpryMenuBarHorizontal.css b/pos/is4c-web/src/includes/SpryMenuBarHorizontal.css new file mode 100644 index 000000000..87259699c --- /dev/null +++ b/pos/is4c-web/src/includes/SpryMenuBarHorizontal.css @@ -0,0 +1,176 @@ +@charset "UTF-8"; + +/* SpryMenuBarHorizontal.css - Revision: Spry Preview Release 1.4 */ + +/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */ + +/******************************************************************************* + + LAYOUT INFORMATION: describes box model, positioning, z-order + + *******************************************************************************/ + +/* The outermost container of the Menu Bar, an auto width box with no margin or padding */ +ul.MenuBarHorizontal +{ + margin: 0; + padding: 0; + list-style-type: none; + font-size: 100%; + cursor: default; + width: auto; +} +/* Set the active Menu Bar with this class, currently setting z-index to accomodate IE rendering bug: http://therealcrisp.xs4all.nl/meuk/IE-zindexbug.html */ +ul.MenuBarActive +{ + z-index: 1000; +} +/* Menu item containers, position children relative to this container and are a fixed width */ +ul.MenuBarHorizontal li +{ + margin: 0; + padding: 0; + list-style-type: none; + font-size: 100%; + position: relative; + text-align: left; + cursor: pointer; + float: left; +} +/* Submenus should appear below their parent (top: 0) with a higher z-index, but they are initially off the left side of the screen (-1000em) */ +ul.MenuBarHorizontal ul +{ + margin: 0; + padding: 0; + list-style-type: none; + font-size: 11px; + z-index: 1020; + cursor: default; + width: 16em; + position: absolute; + left: -1000em; +} +/* Submenu that is showing with class designation MenuBarSubmenuVisible, we set left to auto so it comes onto the screen below its parent menu item */ +ul.MenuBarHorizontal ul.MenuBarSubmenuVisible +{ + left: auto; +} +/* Menu item containers are same fixed width as parent */ +ul.MenuBarHorizontal ul li +{ + width: 16em; +} +/* Submenus should appear slightly overlapping to the right (95%) and up (-5%) */ +ul.MenuBarHorizontal ul ul +{ + position: absolute; + margin: -5% 0 0 95%; +} +/* Submenu that is showing with class designation MenuBarSubmenuVisible, we set left to 0 so it comes onto the screen */ +ul.MenuBarHorizontal ul.MenuBarSubmenuVisible ul.MenuBarSubmenuVisible +{ + left: auto; + top: 0; +} + +/******************************************************************************* + + DESIGN INFORMATION: describes color scheme, borders, fonts + + *******************************************************************************/ + +/* Submenu containers have borders on all sides */ +ul.MenuBarHorizontal ul +{ + border-top-width: 1px; + border-right-width: 2px; + border-left-width: 1px; + border-top-style: solid; + border-right-style: solid; + border-left-style: solid; + border-top-color: #CCC; + border-right-color: #999999; + border-left-color: #CCC; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #999999; +} +/* Menu items are a light gray block with padding and no text decoration */ +ul.MenuBarHorizontal a +{ + display: block; + cursor: pointer; + padding: 0.5em 0.75em; + color: #191919; + text-decoration: none; + background-color: transparent; + font-weight: bold; + text-align: center; +} +ul.MenuBarHorizontal ul a +{ + color: #333; + text-decoration: none; + background-color: #FFF9B1; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #CCCCCC; + text-align: left; +} +/* Menu items that have mouse over or focus have a blue background and white text */ +ul.MenuBarHorizontal a:hover, ul.MenuBarHorizontal a:focus +{ + color: #6B8E44; +} + +/* Menu items that are open with submenus are set to MenuBarItemHover with a blue background and white text */ +ul.MenuBarHorizontal a.MenuBarItemHover, ul.MenuBarHorizontal a.MenuBarItemSubmenuHover, ul.MenuBarHorizontal a.MenuBarSubmenuVisible +{ + color: #6B8E44; +} + +/******************************************************************************* + + SUBMENU INDICATION: styles if there is a submenu under a given menu item + + *******************************************************************************/ + +/* Menu items that have a submenu have the class designation MenuBarItemSubmenu and are set to use a background image positioned on the far left (95%) and centered vertically (50%) */ +ul.MenuBarHorizontal a.MenuBarItemSubmenu +{ +} +/* Menu items that have a submenu have the class designation MenuBarItemSubmenu and are set to use a background image positioned on the far left (95%) and centered vertically (50%) */ +ul.MenuBarHorizontal ul a.MenuBarItemSubmenu +{ +} +/* Menu items that are open with submenus have the class designation MenuBarItemSubmenuHover and are set to use a "hover" background image positioned on the far left (95%) and centered vertically (50%) */ +ul.MenuBarHorizontal a.MenuBarItemSubmenuHover +{ +} +/* Menu items that are open with submenus have the class designation MenuBarItemSubmenuHover and are set to use a "hover" background image positioned on the far left (95%) and centered vertically (50%) */ +ul.MenuBarHorizontal ul a.MenuBarItemSubmenuHover +{ +} + +/******************************************************************************* + + BROWSER HACKS: the hacks below should not be changed unless you are an expert + + *******************************************************************************/ + +/* HACK FOR IE: to make sure the sub menus show above form controls, we underlay each submenu with an iframe */ +ul.MenuBarHorizontal iframe +{ + position: absolute; + z-index: 1010; +} +/* HACK FOR IE: to stabilize appearance of menu items; the slash in float is to keep IE 5.0 from parsing */ +@media screen, projection +{ + ul.MenuBarHorizontal li.MenuBarItemIE + { + display: inline; + f\loat: left; + background: transparent; + } +} diff --git a/pos/is4c-web/src/includes/calendar.css b/pos/is4c-web/src/includes/calendar.css new file mode 100644 index 000000000..6876f284e --- /dev/null +++ b/pos/is4c-web/src/includes/calendar.css @@ -0,0 +1,34 @@ +table.month { + border-color: black; + border-style: solid; + border-width: 1px; + border-collapse: collapse; + border-spacing: 0; +} + +table.month td { + border-color: black; + border-style: solid; + border-width: 1px; + width: 110px; + padding: 5px; + background: #ccbb77; + font-size: 80%; + min-height: 80px; + height: 80px; + vertical-align: top; +} + +table.month th { + border-color: black; + border-style: solid; + border-width: 1px; + padding: 5px; + background: #ccaa44; +} + +table.month th.month { + font-size: 120%; + background: #cc9933; +} + diff --git a/pos/is4c-web/src/includes/calendar.js b/pos/is4c-web/src/includes/calendar.js new file mode 100644 index 000000000..2bb329012 --- /dev/null +++ b/pos/is4c-web/src/includes/calendar.js @@ -0,0 +1,595 @@ +/** + * CREATED BY ADI SCOARTA + * EMAIL: adi@codetale.com + * Version: 1.08 + * Build Date: June 21st, 2009 + */ + +if(typeof(iMonth)=="undefined") + iMonth = new Date().getMonth(); +if(typeof(iYear)=="undefined") + iYear = new Date().getFullYear(); +if(typeof(iDay)=="undefined") + iDay = new Date().getDate(); +if(typeof(itype) == "undefined") + itype = "loose" //loose->any date|strict->limit to maxDays +if(typeof(imaxDays) == "undefined") + imaxDays = 330 //counts only if itype=strict. Enable selection imaxDays from start date +if(typeof(startDay) == "undefined") + startDay = iDay; //enable selection from this date +if(typeof(startMonth) == "undefined") + startMonth = iMonth; +if(typeof(startYear) == "undefined") + startYear = iYear; +if(typeof(addZero) == "undefined") + addZero = true; //true|false. Put 0 in front of days&months if <10 +if(typeof(offX) == "undefined") + offX = 10 // x distance from the mouse. +if(typeof(offY) == "undefined") + offY = -10 // y distance from the mouse. +if(typeof(formatInputs) == "undefined") + formatInputs = 1 // Gather the data from no. of inputs +if(typeof(formatSplitter) == "undefined") + formatSplitter = "-" // Character to add betwen day/month/year +if(typeof(monthFormat) == "undefined") + monthFormat = "mm"; +if(typeof(yearFormat) == "undefined") + yearFormat = "yyyy"; +if(typeof(folowMouse) == "undefined") + folowMouse = true; +if(typeof(formatType) == "undefined") + formatType = yearFormat+formatSplitter+monthFormat+formatSplitter+"dd"; //Format data type +if(typeof(callNotice) == "undefined") + callNotice = "fallsilent()"; //call another function that a date has been selected. +if(typeof(sundayOff)=="undefined") + sundayOff = false; +if(typeof(saturdayOff)=="undefined") + saturdayOff = false; +if(typeof(sundayFirst)=="undefined") + sundayFirst = false; + +if (window.addEventListener) + window.addEventListener("load", createBase, false) +else if (window.attachEvent) + window.attachEvent("onload", createBase) +else if (document.getElementById) + window.onload=createBase + + + +document.onmousemove = getMouseXY; +var IE = document.all?true:false +if (!IE) document.captureEvents(Event.MOUSEMOVE) + +var tempX = 0 +var tempY = 0 + +function getMouseXY(e) { + if (IE) { // grab the x-y pos.s if browser is IE + tempX = event.clientX + document.body.scrollLeft + tempY = event.clientY + document.body.scrollTop + } else { // grab the x-y pos.s if browser is NS + tempX = e.pageX + tempY = e.pageY + } + if (tempX < 0){tempX = 0} + if (tempY < 0){tempY = 0} + + return true +} + + +function getScrollXY() { + var scrOfX = 0, scrOfY = 0; + if( typeof( window.pageYOffset ) == 'number' ) { + //Netscape compliant + scrOfY = window.pageYOffset; + scrOfX = window.pageXOffset; + } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) { + //DOM compliant + scrOfY = document.body.scrollTop; + scrOfX = document.body.scrollLeft; + } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) { + //IE6 standards compliant mode + scrOfY = document.documentElement.scrollTop; + scrOfX = document.documentElement.scrollLeft; + } + return [ scrOfX, scrOfY ]; +} + + + +/* + * Shortcut functions to ease the implementation. + */ + +var d = document; +function cel(obj){ return d.createElement(obj); } +function sa(obj, atname, atprop){ return obj.setAttribute(atname, atprop); } +function appendc(obj, elem){ return obj.appendChild(elem); } +function cNode(obj, txt){ return obj.appendChild(d.createTextNode(txt)); } +function getID(elem){ return d.getElementById(elem); } + +var DayCol = new Array("M", "T", "W", "T", "F", "S", "S"); +if(sundayFirst) +{ + newDayCol = new Array(DayCol[DayCol.length-1]); + for(x=0; x<DayCol.length-1;x++) + newDayCol[newDayCol.length] = DayCol[x]; + DayCol = newDayCol; +} +var MonthCol = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov", "Dec") + +function getDaysInMonth(mnt, yr) +{ + var DaysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + if (mnt == 1) + DaysInMonth[1] = ((yr % 400 == 0) || ((yr % 4 == 0) && (yr % 100 !=0))) ? 29 : 28; + return DaysInMonth[mnt]; +} +/* + * Base object for the widget + */ + +var cw = { + currMonth: iMonth, + currYear: iYear, + currDay: iDay, + selMonth: iMonth, + selYear: iYear, + selDay: iDay, + config: itype, + maxDays: imaxDays, + stMonth : startMonth, + stYear : startYear, + stDay : startDay, + endMonth : 11, + endYear : iYear, + endDay : 31, + addZ: addZero, + setMarks: function() + { + if(this.config=='strict') + { + this.stDay = startDay; + this.stMonth = startMonth; + this.stYear = startYear; + this.getEnd(); + } + }, + getConfMonths: function() + { + if(this.config=='strict') + cw.setMarks(); + mthCol = cel("ul"); + mthCol.id = "months"; + k=0; + for(i=0;i<12; i++) + { + mth = cel("li"); + if(cw.isValidMonth(i)) + { + mth.className = "months"; + if(cw.isCurrentMonth(i)) + mth.className = "currMonth"; + mtha = cel("a"); + mtha.href = "javascript:modMonth("+this.selYear+"," + i + ")"; + mtha.innerHTML = MonthCol[i]; + appendc(mth, mtha); + } + else + { + mth.className = "monthDisabled"; + mth.innerHTML = MonthCol[i]; + } + appendc(mthCol, mth) + + } + cw.setBrowseYears(); + + return mthCol ; + }, + getConfDays: function() + { + dayCol = cel("ul"); + dayCol.id = "days"; + for(i=0;i<7;i++) + { + dayCell = cel("li"); + dayCell.className = "headDay"; + dayCell.innerHTML = DayCol[i]; + appendc(dayCol, dayCell); + } + var iFirstDay = new Date(this.selYear, this.selMonth, 1).getDay(); + if (!sundayFirst) { + iFirstDay--; + } + if(iFirstDay<0){iFirstDay=6} + for(i=0;i<iFirstDay;i++) + { + dayCell = cel('li'); + dayCell.className = "dayBlank"; + dayCell.innerHTML = "&nbsp;"; + appendc(dayCol, dayCell) + } + for(i=1;i<=getDaysInMonth(this.selMonth, this.selYear); i++) + { + dayCell = cel('li'); + if(cw.isValidDate(i)) + { + dayCell.className = "dayNormal"; + if(cw.isWeekend(i)) + dayCell.className = "dayWeekend"; + if(cw.isCurrentDay(i)) + dayCell.className = "dayCurrent"; + dayLink = cel('a'); + dayLink.href="javascript: newDay("+ i + ");fillBackDate("+i+","+this.selMonth+","+ this.selYear+")"; + dayLink.innerHTML = i; + appendc(dayCell, dayLink); + } + else + { + dayCell.className = "dayDisabled"; + dayCell.innerHTML = i; + } + appendc(dayCol, dayCell) + } + return dayCol; + }, + getEnd: function() + { + imaxD = imaxDays - (getDaysInMonth(this.stMonth, this.stYear) - this.stDay); + tmpM = this.stMonth; + tmpY = this.stYear; + if (imaxD < 0) { + tmpD = this.stDay+(imaxD*(-1)); + this.endMonth = tmpM; + this.endDay = tmpD; + this.endYear = tmpY; + return; + } + else if(imaxD == 0) + { + tmpD = getDaysInMonth(this.stMonth, this.stYear); + this.endMonth = tmpM; + this.endDay = tmpD; + this.endYear = tmpY; + return; + } + else if(imaxD < (getDaysInMonth(this.stMonth, this.stYear) - this.stDay)) + { + tmpD = imaxD; + } + i=0; + while(imaxD >= getDaysInMonth(tmpM, tmpY)) + { + inc = true; + tmpM++ + if(tmpM>11) + { + tmpM=0 + tmpY++; + } + tmpD = imaxD -= getDaysInMonth(tmpM, tmpY); + } + tmpM++ + if(tmpM>11){tmpM=0; tmpY++} + this.endMonth = tmpM; + this.endDay = tmpD; + this.endYear = tmpY; + }, + isValidDate: function(tDay) + { + if(saturdayOff || sundayOff) + { + sun = new Date(this.selYear, this.selMonth, tDay); + sun = sun.getDay() + if((sun==6 && saturdayOff) || (sun==0 && sundayOff)) + return false; + } + if(this.config == "loose") + return true; + cdate = new Date(this.selYear, this.selMonth, tDay).getTime(); + sdate = new Date(this.stYear, this.stMonth, this.stDay).getTime(); + edate = new Date(this.endYear, this.endMonth, this.endDay).getTime(); + if(cdate<sdate || cdate>edate) + return false; + return true; + if(this.selYear==this.stYear) + { + if(this.selMonth<this.stMonth) + return false; + if(this.selMonth==this.stMonth && tDay <this.stDay) + return false; + } + if(this.selYear==this.endYear) + { + if(this.selMonth>this.endMonth) + return false; + if(this.selMonth==this.endMonth && tDay>this.endDay) + return false; + + } + if(this.selYear == this.endYear && this.selYear==this.stYear){ + if(this.selMonth> this.endMonth || this.selMonth<this.stMonth) + return false; + } + if(this.selYear>this.endYear) + return false; + return true; + + }, + isWeekend: function(tDay) + { + sun = new Date(this.selYear, this.selMonth, tDay).getDay(); + if(sun==6||sun==0) + return true; + return false; + }, + isCurrentDay: function(tDay) + { + if(this.selDay == tDay) + return true; + return false; + }, + setBrowseYears: function() + { + brsY = cel('li'); + brsY.className = "yearBrowse"; + if(this.selYear <= this.stYear && this.config == "strict") + { + backB = cel('span'); + } + else + { + backB= cel('a'); + backB.href = "javascript: modYear(-1)"; + } + backB.innerHTML = "&laquo;"; + yText = cel("b"); + yText.innerHTML = cw.selYear; + if(this.selYear >= this.endYear && this.config == "strict") + fwdB = cel('span'); + else + { + fwdB = cel('a'); + fwdB.href= "javascript: modYear(1)"; + } + fwdB.innerHTML = "&raquo;"; + appendc(brsY, backB); + appendc(brsY, yText); + appendc(brsY, fwdB); + appendc(mthCol, brsY); + }, + isValidMonth: function(m) + { + if(this.config == "loose") + return true; + else + { + if(this.selYear< this.stYear) + return false; + if(this.selYear==this.stYear && m<this.stMonth) + return false; + if(this.selYear>this.endYear) + return false; + if(this.selYear==this.endYear && m>this.endMonth) + return false; + } + return true; + }, + isCurrentMonth: function(i) + { + if(i==this.selMonth) + return true + return false; + } +} + +cw.setMarks(); +function createBase() +{ + var el = cel('div'); + el.id="calendar"; + el.style.display="none"; + if(typeof(elToAppend) == "undefined") + tDocument = document.getElementsByTagName('body').item(0); + else + { + var tt = elToAppend; + tDocument = document.getElementById(tt); + } + appendc(tDocument, el); +} + + +function createCalendarElements() +{ + var el = 'calendar'; + var calCon = cel('div'); + calCon.id = "elements"; + while(document.getElementById(el).firstChild) + document.getElementById(el).removeChild(document.getElementById(el).firstChild); + appendc(document.getElementById(el), calCon); + mthCol = cw.getConfMonths(); + appendc(calCon, mthCol); + dayStruct = cw.getConfDays(); + appendc(calCon, dayStruct); + + closeBtn = cel('div'); + closeBtn.id = "closeBtn"; + closeBtna = cel('a'); + closeBtna.href = "javascript: closeCalendar()"; + closeBtna.innerHTML = "close"; + appendc(closeBtn, closeBtna); + appendc(document.getElementById(el), closeBtn); +} +function modMonth(newY, newM) +{ + cw.selYear = newY; + cw.selMonth = newM; + createCalendarElements(); +} +function newDay(newD) +{ + cw.selDay = newD; + createCalendarElements(); +} +function modYear(way) +{ + cw.selYear = parseInt(cw.selYear) + parseInt(way); + createCalendarElements(); +} +var datas; +var elem1; +var elem2; +var elem3; +var mA=0; +var yA=0; +var mm = new Array('mm', 'mmm'); +var yy = new Array('yy', 'yyyy'); + +function fPopCalendar(param) +{ + tmpString = new String(); + elem1 = param; + tmpString = document.getElementById(elem1).value; + datas = tmpString.split(formatSplitter); + tmpo = formatType.split(formatSplitter); + dC="";tC=""; + if(datas.length == tmpo.length) + { + for(i=0;i<datas.length;i++) + { + if(datas[i].length<2) + datas[i] = "0"+datas[i]; + dC +=datas[i]; + tC +=tmpo[i]; + } + if(dC.length == tC.length) + orderData(); + } + else + datas = new Array(cw.selDay, cw.selMonth, cw.selYear); + createCalendarElements(); + offsets = getScrollXY(); + document.getElementById('calendar').style.display = "block"; + + if(folowMouse) + { + var browser=navigator.appName; + if(browser=="Microsoft Internet Explorer") + { + document.getElementById('calendar').style.left = parseInt(tempX)+parseInt(offX)+parseInt(offsets[0]) + 'px'; + document.getElementById('calendar').style.top = parseInt(tempY)+parseInt(offY)+parseInt(offsets[1]) + 'px'; + } + else + { + document.getElementById('calendar').style.left = parseInt(tempX)+parseInt(offX)+ 'px'; + document.getElementById('calendar').style.top = parseInt(tempY)+parseInt(offY)+ 'px'; + } + } + order = new String(formatType).split(formatSplitter); + + for(i=0;i<mm.length;i++) + { + for(j=0;j<order.length;j++) + { + if(mm[i] == order[j]) + mA = i; + if(yy[i] == order[j]) + yA = i; + } + } +} + +function orderData() +{ + + order = new String(formatType).split(formatSplitter); + + for(i=0;i<order.length;i++) + { + for(j=0;j<mm.length;j++) + { + if(mm[j] == order[i]) + { + cw.selMonth = datas[i]; + if(cw.selMonth.slice(0, 1) == 0) + cw.selMonth = parseInt(cw.selMonth.slice(1, cw.selMonth.length))-1; + else if(cw.selMonth.length<3) + cw.selMonth = parseInt(cw.selMonth)-1; + if(j==1) + { + for(k=0;k<MonthCol.length;k++) + { + if(MonthCol[k].toLowerCase() == cw.selMonth.toLowerCase() ) + { + cw.selMonth = k; + break; + } + } + } + } + if(yy[j] == order[i]) + { + cw.selYear = datas[i]; + if(cw.selYear.slice(0, 1) == 0) + cw.selYear = parseInt(cw.selYear.slice(1, cw.selYear.length)); + if(j==0) + cw.selYear =2000 + parseInt(cw.selYear); + } + } + if(order[i].toLowerCase() == 'dd') + { + cw.selDay = datas[i]; + if(cw.selDay.slice(0, 1) == 0) + cw.selDay = parseInt(cw.selDay.slice(1, cw.selDay.length)); + } + } +} + +function fillBackDate(tDay, tMonth, tYear) +{ + if(mA==1) + tMonth = MonthCol[tMonth]; + if(mA==0) + { + tMonth++; + if(tMonth<10 && cw.addZ == true) + tMonth = "0"+tMonth; + } + if(yA==0) + tYear = new String(tYear).slice(2,4); + if(tDay<10 && cw.addZ == true) + { + tDay = "0"+tDay; + } + + order = new String(formatType).split(formatSplitter); + vali = ""; + + for(x = 0; x <order.length; x++) + { + if (order[x] == "yy" || order[x] == "yyyy") + vali += tYear; + if (order[x] == "mm" || order[x] == "mmm") + vali += tMonth; + else if(order[x] == "dd") + vali += tDay; + if(x < order.length-1) + vali += formatSplitter; + } + + document.getElementById(elem1).value = vali + setTimeout(callNotice, 0); + + closeCalendar(); +} + +function closeCalendar() +{ + var el = 'calendar'; + document.getElementById(el).style.display = "none"; +} +function fallsilent(){} diff --git a/pos/is4c-web/src/includes/colortheme.css b/pos/is4c-web/src/includes/colortheme.css new file mode 100644 index 000000000..1a5fb019d --- /dev/null +++ b/pos/is4c-web/src/includes/colortheme.css @@ -0,0 +1,87 @@ +/* CSS Document */ + +/************************* want a new color scheme? These are the emements that need to be changed. **********************************/ + +body.themePurple { /* seasonal color scheme */ + background-color: #242464; +} + +.themePurple #divMask { + background-color: #242464; + height: 20px; +} +.themePurple #divIndexNewsHeadline, .themePurple #divIndexFeatureHeadline { + background-color: #242464; +} + +body.themeNavy { /* seasonal color scheme */ + background-color: #0F1F65; +} + +.themeNavy #divMask { + background-color: #0F1F65; + height: 20px; +} +.themeNavy #divIndexNewsHeadline, .themeNavy #divIndexFeatureHeadline { + background-color: #0F1F65; +} + + +body.themeRed { /* seasonal color scheme */ + background-color: #671200; +} + +.themeRed #divMask { + background-color: #671200; + height: 20px; +} +.themeRed #divIndexNewsHeadline, .themeRed #divIndexFeatureHeadline { + background-color: #671200; +} + +body.themeOrange { /* seasonal color scheme */ + background-color: #B73C0F; +} + +.themeOrange #divMask { + background-color: #B73C0F; + height: 20px; +} +.themeOrange #divIndexNewsHeadline, .themeOrange #divIndexFeatureHeadline { + background-color: #B73C0F; +} + +body.themeLavender { /* seasonal color scheme */ + background-color: #555EA1; +} + +.themeLavender #divMask { + background-color: #555EA1; + height: 20px; +} +.themeLavender #divIndexNewsHeadline, .themeLavender #divIndexFeatureLavender { + background-color: #555EA1; +} +body.themeMagenta { /* seasonal color scheme */ + background-color: #750029; +} + +.themeMagenta #divMask { + background-color: #750029; + height: 20px; +} +.themeMagenta #divIndexNewsHeadline, .themeMagenta #divIndexFeatureMagenta { + background-color: #750029; +} + +body.themeGreen { /* seasonal color scheme */ + background-color: #153C00; +} + +.themeGreen #divMask { + background-color: #153C00; + height: 20px; +} +.themeGreen #divIndexNewsHeadline, .themeGreen #divIndexFeatureGreen { + background-color: #153C00; +} diff --git a/pos/is4c-web/src/includes/cwcalendar.css b/pos/is4c-web/src/includes/cwcalendar.css new file mode 100644 index 000000000..96e728c41 --- /dev/null +++ b/pos/is4c-web/src/includes/cwcalendar.css @@ -0,0 +1,60 @@ +#calendar +{ + width: 241px; + height: 165px; + text-align: center; + margin: 5px auto; + border: 1px solid #f2f2f2; + background-color: #f3f8ff; + position: absolute; + font: 11px Trebuchet MS; +} + +ul +{ + list-style-type: none; + margin:0; + padding:0; +} +.months, .emptM, .headDay, .dayNormal, .dayBlank, .dayDisabled, .dayWeekend, .dayCurrent, .yearBrowse, .monthDisabled, .currMonth, #closeBtn +{ + margin: 1px 0 0 1px; + padding: 0; + width: 39px; + height: 14px; + line-height: 14px; + float: left; + text-align: center; + background-color: #feefe4; + color: #000; + display: inline; +} +.emptM, .dayDisabled, .monthDisabled +{ + color: #d7d6d5; + background-color: #f2f2f2; +} +.headDay +{ + color: #fff; + background-color: #48688f; + width: 33px; +} +.dayNormal, .dayBlank, .dayWeekend, .dayCurrent +{ + color: #fff; + background-color: #70b0ff; + width: 33px; +} +.dayBlank{background-color: #f3f8ff} +.dayWeekend{background-color: #ff6161} +.dayCurrent, .currMonth{background-color: #71d45b} +.dayDisabled{width: 33px} +#days{margin-left: 1px; width: 238px;} +#elements{height: 150px;} +.months a, #days a, .currMonth a{color: #000; text-decoration: none; display: block;} +.currMonth a{color: #FFF} +#days a{color: #fff;} +.yearBrowse, #closeBtn {width: 240px; background-color: #FFF; line-height: 14px;} +.yearBrowse a, #closeBtn a{text-decoration: none; color: #f30; font-weight: bold;} +.yearBrowse b{margin: 0 5px} \ No newline at end of file diff --git a/pos/is4c-web/src/includes/cwcalendar.zip b/pos/is4c-web/src/includes/cwcalendar.zip new file mode 100644 index 000000000..696ce3337 Binary files /dev/null and b/pos/is4c-web/src/includes/cwcalendar.zip differ diff --git a/pos/is4c-web/src/includes/examples/dateformat.html b/pos/is4c-web/src/includes/examples/dateformat.html new file mode 100644 index 000000000..2c2ecf626 --- /dev/null +++ b/pos/is4c-web/src/includes/examples/dateformat.html @@ -0,0 +1,127 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> + <link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> + <script type="text/javascript"> + var formatSplitter = "/"; + var monthFormat = "mmm"; + var yearFormat = "yyyy"; + var formatType = "dd"+formatSplitter+monthFormat+formatSplitter+yearFormat; + </script> + <script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Date format Example</h3> + <ul> + <li>This example formats the date output to yy/mmm/dd</li> + </ul> + <p> + Put this code in the <code>&lt;head&gt;</code> section of your HTML file:<br> + <code>&lt;link rel="stylesheet" title="Style CSS" href="cwcalendar.css" type="text/css" media="all" /&gt;<br />&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;var formatSplitter = "/";<br />&nbsp;&nbsp;var monthFormat = "mmm";<br />&nbsp;&nbsp;var yearFormat = "yy";<br />&lt;/script&gt;<br />&lt;script type="text/javascript" src="calendar.js"&gt;&lt;/script&gt;<br /></code><br> + </p> + <h3>Example</h3> + <p> + Code for the input:<code>&lt;input type='text' name='date' id='date' onclick='fPopCalendar("date")'/&gt;</code><br> + <input type='text' name='date' id='date' onclick='fPopCalendar("date")'/>click the input + </p> + [<a href="index.html">back to index</a>] + <h2>Remember!</h2> + <ul> + <li> + <dl> + <dt><b>All the flags are optional.</b></dt> + <dd>Don't use them unless you need them!</dd> + <dt><b>To call the calendar, use the fPopCalendar('input-id') function.</b></dt> + <dd> You can place the function either as a link or "onclick" function on your inputs.<br> + The function takes 'input-id' as parameter for display. 'input-id' is the id of the input you want your date to be filled(see the above example).</dd> + </dl> + </li> + </ul> + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/examples/function.html b/pos/is4c-web/src/includes/examples/function.html new file mode 100644 index 000000000..22d45de00 --- /dev/null +++ b/pos/is4c-web/src/includes/examples/function.html @@ -0,0 +1,128 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> +<link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> +<script type="text/javascript"> + var callNotice = "sayHello()"; + function sayHello() + { + alert('Hi!'); + } +</script> +<script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Date format Example</h3> + <ul> + <li>This example displays an alert message when a date is picked.</li> + </ul> + <p> + Put this code in the <code>&lt;head&gt;</code> section of your HTML file:<br> + <code>&lt;link rel="stylesheet" title="Style CSS" href="cwcalendar.css" type="text/css" media="all" /&gt;<br />&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;var callNotice = "sayHello()";<br />&nbsp;&nbsp;function sayHello()<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;alert('Hi!');<br />&nbsp;&nbsp;}<br />&lt;/script&gt;<br />&lt;script type="text/javascript" src="calendar.js"&gt;&lt;/script&gt;<br /></code><br> + </p> + <h3>Example</h3> + <p> + Code for the input:<code>&lt;input type='text' name='date' id='date' onclick='fPopCalendar("date")'/&gt;</code><br> + <input type='text' name='date' id='date' onclick='fPopCalendar("date")'/>click the input + </p> + [<a href="index.html">back to index</a>] + <h2>Remember!</h2> + <ul> + <li> + <dl> + <dt><b>All the flags are optional.</b></dt> + <dd>Don't use them unless you need them!</dd> + <dt><b>To call the calendar, use the fPopCalendar('input-id') function.</b></dt> + <dd> You can place the function either as a link or "onclick" function on your inputs.<br> + The function takes 'input-id' as parameter for display. 'input-id' is the id of the input you want your date to be filled(see the above example).</dd> + </dl> + </li> + </ul> + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/examples/index.html b/pos/is4c-web/src/includes/examples/index.html new file mode 100644 index 000000000..e133edfd7 --- /dev/null +++ b/pos/is4c-web/src/includes/examples/index.html @@ -0,0 +1,118 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> + <link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> + <script type="text/javascript"> + var formatSplitter = "/"; + var monthFormat = "mmm"; + var yearFormat = "yy"; + </script> + <script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Usage examples.</h3> + <ul> + <li> + <dl> + <dt><b><a href="dateformat.html">Date Formatting</a>.</b></dt> + <dd>A simple example that formats the date output to yy/mmm/dd</dd> + <dt><b><a href="sundayfirst.html">Sunday First</a>.</b></dt> + <dd>An example that sets sunday as the first day of the week</dd> + <dt><b><a href="maxdays.html">Date Range Enabled</a>.</b></dt> + <dd>An example that enables date selection for this year.</dd> + <dt><b><a href="weekend.html">Disable weekend days</a>.</b></dt> + <dd>A simple example that disables date selection for weekend days.</dd> + <dt><b><a href="function.html">Function call</a>.</b></dt> + <dd>A simple example that calls a custom function when a date is picked.</dd> + </dl> + </li> + </ul> + [<a href="../index.html">back to docs</a>] + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/examples/maxdays.html b/pos/is4c-web/src/includes/examples/maxdays.html new file mode 100644 index 000000000..edd21648d --- /dev/null +++ b/pos/is4c-web/src/includes/examples/maxdays.html @@ -0,0 +1,128 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> +<link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> +<script type="text/javascript"> + var itype = "strict"; + var imaxDays = 364; + var startDay =1; + var startMonth = 0; +</script> +<script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Date format Example</h3> + <ul> + <li>This example enables date selection for the current year.</li> + </ul> + <p> + Put this code in the <code>&lt;head&gt;</code> section of your HTML file:<br> + <code>&lt;link rel="stylesheet" title="Style CSS" href="cwcalendar.css" type="text/css" media="all" /&gt;<br />&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;var itype = "strict";<br />&nbsp;&nbsp;var imaxDays = 364;<br />&nbsp;&nbsp;var startDay =1;<br />&nbsp;&nbsp;var startMonth = 0;<br />&lt;/script&gt;<br />&lt;script type="text/javascript" src="calendar.js"&gt;&lt;/script&gt;<br /></code><br> + </p> + <h3>Example</h3> + <p> + Code for the input:<code>&lt;input type='text' name='date' id='date' onclick='fPopCalendar("date")'/&gt;</code><br> + <input type='text' name='date' id='date' onclick='fPopCalendar("date")'/>click the input + </p> + [<a href="index.html">back to index</a>] + <h2>Remember!</h2> + <ul> + <li> + <dl> + <dt><b>All the flags are optional.</b></dt> + <dd>Don't use them unless you need them!</dd> + <dt><b>To call the calendar, use the fPopCalendar('input-id') function.</b></dt> + <dd> You can place the function either as a link or "onclick" function on your inputs.<br> + The function takes 'input-id' as parameter for display. 'input-id' is the id of the input you want your date to be filled(see the above example).</dd> + </dl> + </li> + </ul> + + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/examples/sundayfirst.html b/pos/is4c-web/src/includes/examples/sundayfirst.html new file mode 100644 index 000000000..0839c5f29 --- /dev/null +++ b/pos/is4c-web/src/includes/examples/sundayfirst.html @@ -0,0 +1,124 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> + <link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> + <script type="text/javascript"> + var sundayFirst = true; + </script> + <script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Sunday First Example</h3> + <ul> + <li>This example sets sunday as the first day of the week</li> + </ul> + <p> + Put this code in the <code>&lt;head&gt;</code> section of your HTML file:<br> + <code>&lt;link rel="stylesheet" title="Style CSS" href="cwcalendar.css" type="text/css" media="all" /&gt;<br />&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;var sundayFirst = true;<br />&lt;/script&gt;<br />&lt;script type="text/javascript" src="calendar.js"&gt;&lt;/script&gt;<br /></code><br> + </p> + <h3>Example</h3> + <p> + Code for the input:<code>&lt;input type='text' name='date' id='date' onclick='fPopCalendar("date")'/&gt;</code><br> + <input type='text' name='date' id='date' onclick='fPopCalendar("date")'/>click the input + </p> + [<a href="index.html">back to index</a>] + <h2>Remember!</h2> + <ul> + <li> + <dl> + <dt><b>All the flags are optional.</b></dt> + <dd>Don't use them unless you need them!</dd> + <dt><b>To call the calendar, use the fPopCalendar('input-id') function.</b></dt> + <dd> You can place the function either as a link or "onclick" function on your inputs.<br> + The function takes 'input-id' as parameter for display. 'input-id' is the id of the input you want your date to be filled(see the above example).</dd> + </dl> + </li> + </ul> + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/examples/weekend.html b/pos/is4c-web/src/includes/examples/weekend.html new file mode 100644 index 000000000..da3d3a583 --- /dev/null +++ b/pos/is4c-web/src/includes/examples/weekend.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> + <link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> + <script type="text/javascript"> + var saturdayOff = true; + var sundayOff = true; + </script> + <script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Weekend disabled Example</h3> + <ul> + <li>This example disables selection for weekend days.</li> + </ul> + <p> + Put this code in the <code>&lt;head&gt;</code> section of your HTML file:<br> + <code>&lt;link rel="stylesheet" title="Style CSS" href="cwcalendar.css" type="text/css" media="all" /&gt;<br />&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;var saturdayOff = true;<br />&nbsp;&nbsp;var sundayOff = true;<br />&lt;/script&gt;<br />&lt;script type="text/javascript" src="calendar.js"&gt;&lt;/script&gt;<br /></code><br> + If you want to disable only saturdays or only sundays change the appropriate flag to true. + </p> + <h3>Example</h3> + <p> + Code for the input:<code>&lt;input type='text' name='date' id='date' onclick='fPopCalendar("date")'/&gt;</code><br> + <input type='text' name='date' id='date' onclick='fPopCalendar("date")'/>click the input + </p> + [<a href="index.html">back to index</a>] + <h2>Remember!</h2> + <ul> + <li> + <dl> + <dt><b>All the flags are optional.</b></dt> + <dd>Don't use them unless you need them!</dd> + <dt><b>To call the calendar, use the fPopCalendar('input-id') function.</b></dt> + <dd> You can place the function either as a link or "onclick" function on your inputs.<br> + The function takes 'input-id' as parameter for display. 'input-id' is the id of the input you want your date to be filled(see the above example).</dd> + </dl> + </li> + </ul> + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/footer.css b/pos/is4c-web/src/includes/footer.css new file mode 100644 index 000000000..6a7d4ff00 --- /dev/null +++ b/pos/is4c-web/src/includes/footer.css @@ -0,0 +1,81 @@ +@charset "UTF-8"; +/* CSS Document */ + +html, body { +height: 100%;} + +#divContainer { /* new container styles */ +min-height:100%; +height:100%; +voice-family: "\"}\""; +voice-family:inherit; +height:auto; +padding-bottom: 70px; +margin-bottom: 0px; + +} +html>body #divContainer { +height: auto;} + +#index #divWrap { + background-color: #D0B95B; +} + +#index #divPrimaryContent { + background-color: #F5F4C1; +} + +#grass { + bottom: 0; + height: 90px; + width: 100%; + position: fixed; + background-color: transparent; /* necessary for background image to display properly in Safari */ + background-image: url(../images/grass.gif); + background-repeat: no-repeat; + background-position: center 0; + left: 0px; +} + +#grass #content{ + font-size: 10px; + height:65px; + color: #000000; + margin-top: 35px; + background-color: #5B9041; + padding-top:3px; + } +#grass #content p { + margin-bottom:2px; + font-size: 1.1em; +} + +#grass #content a:link { + font-weight: bold; + color: #000000; + text-decoration: underline; +} +#grass #content a:visited { + color: #000000; + text-decoration: underline; +} +#grass #content a:hover { + text-decoration: none; + color: #CDB353; +} +#highlights { + font-family: Georgia, "Times New Roman", Times, serif; + font-style: italic; + color: #FFFFFF; + font-size: 1.4em; +} +#grass #content #highlights a:link, #grass #content #highlights a:visited { + color: #FFFFFF; + text-decoration: none; + font-weight: normal; +} +#grass #content #highlights a:hover { + color: #FFFFFF; + text-decoration: underline; + font-weight: normal; +} diff --git a/pos/is4c-web/src/includes/footerFlash.css b/pos/is4c-web/src/includes/footerFlash.css new file mode 100644 index 000000000..ff742bc69 --- /dev/null +++ b/pos/is4c-web/src/includes/footerFlash.css @@ -0,0 +1,82 @@ +@charset "UTF-8"; +/* CSS Document */ + +html, body { +height: 100%;} + +#divContainer { /* new container styles */ +postion:relative; +min-height:100%; +height:100%; +voice-family: "\"}\""; +voice-family:inherit; +height:auto; +padding-bottom: 70px; +margin-bottom: 0px; + +} +html>body #divContainer { +height: auto;} + +#index #divWrap { + background-color: #D0B95B; +} + +#index #divPrimaryContent { + background-color: #F5F4C1; +} + +#grass { + bottom: 0; + height: 100px; + width: 100%; + position: fixed; + background-color: transparent; /* necessary for background image to display properly in Safari */ + /* background-image: url(../images/grass.gif); + background-repeat: no-repeat; + background-position: center 0; +*/ left: 0px; +} + +#grass #content{ + font-size: 10px; + height:65px; + color: #000000; + margin-top: 0px; + background-color: #5B9041; + padding-top:3px; + } +#grass #content p { + margin-bottom:2px; + font-size: 1.1em; +} + +#grass #content a:link { + font-weight: bold; + color: #000000; + text-decoration: underline; +} +#grass #content a:visited { + color: #000000; + text-decoration: underline; +} +#grass #content a:hover { + text-decoration: none; + color: #CDB353; +} +#highlights { + font-family: Georgia, "Times New Roman", Times, serif; + font-style: italic; + color: #FFFFFF; + font-size: 1.4em; +} +#grass #content #highlights a:link, #grass #content #highlights a:visited { + color: #FFFFFF; + text-decoration: none; + font-weight: normal; +} +#grass #content #highlights a:hover { + color: #FFFFFF; + text-decoration: underline; + font-weight: normal; +} diff --git a/pos/is4c-web/src/includes/footerIE.css b/pos/is4c-web/src/includes/footerIE.css new file mode 100644 index 000000000..d67475fb5 --- /dev/null +++ b/pos/is4c-web/src/includes/footerIE.css @@ -0,0 +1,57 @@ +@charset "UTF-8"; +/* CSS Document */ + +html, body { +height: 100%;} + +#divContainer { /* new container styles */ +postion:relative; +min-height:100%; +height:100%; +voice-family: "\"}\""; +voice-family:inherit; +height:auto; +padding-bottom: 70px; +margin-bottom: 0px; + +} +html>body #divContainer { +height: auto;} + + +#grass { + bottom: 0; + height: 75px; + width: 100%; + position: fixed; + background-color: transparent; /* necessary for background image to display properly in Safari */ + background-image: url(../testimages/aigrass.gif); + background-repeat: no-repeat; + background-position: 0px 0px; + left: 0px; +} + +#grass #content{ + font-size: 0.85em; + height:45px; + color: #000000; + margin-top: 30px; + background-color: #5B9041; + padding-top:3px; + } +#grass #content p { + margin-bottom:2px;} + +#grass #content a:link { + font-weight: bold; + color: #000000; + text-decoration: underline; +} +#grass #content a:visited { + color: #000000; + text-decoration: underline; +} +#grass #content a:hover { + text-decoration: none; + color: #CDB353; +} diff --git a/pos/is4c-web/src/includes/iehacks.css b/pos/is4c-web/src/includes/iehacks.css new file mode 100644 index 000000000..97fa5d447 --- /dev/null +++ b/pos/is4c-web/src/includes/iehacks.css @@ -0,0 +1,7 @@ +@charset "UTF-8"; +/* CSS Document */ + +#divContainer { /* wrapper for all centered content */ + padding-left:1px; + +} \ No newline at end of file diff --git a/pos/is4c-web/src/includes/index.html b/pos/is4c-web/src/includes/index.html new file mode 100644 index 000000000..074263e37 --- /dev/null +++ b/pos/is4c-web/src/includes/index.html @@ -0,0 +1,203 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Codetale's Calendar Widget</title> + <link rel="stylesheet" title="Style CSS" href="../cwcalendar.css" type="text/css" media="all" /> + <script type="text/javascript"> + var formatSplitter = "/"; + var monthFormat = "mmm"; + var yearFormat = "yy"; + </script> + <script type="text/javascript" src="../calendar.js"></script> + +<style type="text/css"> +html, body { + margin: 0; + padding: 0; + height: 100%; +} + + body{margin: 0 auto; text-align: center; font: normal 14px Georgia; color: #000; background-color: #e8f5fe} + #webpage{ + position: relative; + min-height: 100%; + height: auto !important; + height: 100%; + } + #content + { + width: 70%; + background-color: #FFF; + border-left: 1px solid #0092f8; + border-right: 1px solid #0092f8; + margin: 0 auto; + text-align: justify; + padding: 0 20pt 40pt 20pt; + clear: both; + } + + h1 + { + color: #e3e3e3; + margin: 0 0 25pt 0; + padding: 0; + font-size: 24pt; + } + h2{border-left: 5px solid #0096ff;} + h2, h3 + { + font-size: 12pt; + color: #000; + margin: 10pt 0; + padding: 5pt; + + } + h3{color: #1888d6; border-left: 5px solid #f00;font-size: 14pt; border-bottom: 1px dotted #f00} + p{margin: 0; padding: 5pt; border: 1px solid #8ed0ff; background-color: #f1f9ff; clear: both;} + code{font-family:Courier; color: #d61818;} + ul{ + list-style-type: none; + } + li{padding:0; margin: 0} + dl{margin-left: 10pt} + dt{color: #d61818} + #footer + { + height: 20pt; + width: 100%; + line-height: 20pt; + text-align: center; + border-top:1px solid #0092f8; + background-color: #fff; + font-size: 8pt; + font-weight: bold; + position: absolute; + bottom: 0 !important; + bottom: -1px; + left:0 + } + a{ + color: #458fff; + font-weight: normal; + text-decoration: none; + } + a:hover + { + color: #356ec2; + text-decoration: underline; + } +</style> + </head> + <body> +<div id="webpage"> + <div id="content"> + <h1>Codetale's Calendar Widget</h1> + <h3>Options & Flags</h3> +<u id="iMonth">iMonth</u><br> +Option: defines the default month for the calendar<br> +Values: 0-11 (January - December)<br> +Default: PC date.<br> +<br> +<u id="iYear">iYear</u><br> +Option: defines the default year for the calendar<br> +Values: Year, 4 digits format<br> +Default: PC date.<br> +<br> +<u id="iDay">iDay</u><br> +Option: defines the default day for the calendar<br> +Values: 1-31 <br> +Default: PC date.<br> +<br> +<u id="itype">itype</u><br> +Option: See the description below regarding imaxDays,stDay,stMonth,stYear<br> +Values: "strict" or "loose"<br> +Default: "loose"<br> +<br> +<u id="imaxDays">imaxDays</u><br> +Option: days can be selected only on this range of days (specified by a number) starting with <a href="#stDay">startDay</a>,<a href="#stMonth">startMonth</a>,<a href="#stYear">startYear</a>(see below). imaxDays only counts if itype is "strict".<br> +Values: >0<br> +<br> +<u id="stDay">startDay</u><br> +Option: enable date selection from this day forward counting <a href="#imaxDays">imaxDays</a><br> +Values: 1-31 <br> +Default: <a href="#iDay">iDay</a>. <br> +<br> +<u id="stMonth">startMonth</u><br> +Option: enable date selection from this month forward counting <a href="#imaxDays">imaxDays</a><br> +Values: 0-11<br> +Default: <a href="#iMonth">iMonth</a>. <br> +<br> +<u id="stYear">startYear</u><br> +Option: enable date selection from this year forward counting <a href="#imaxDays">imaxDays</a><br> +Values: year, 4 digit format <br> +Default: <a href="#iYear">iYear</a>. <br> +<br> +<u id="saturdayOff">saturdayOff</u><br> +Option: Disables selection for saturdays (this is independent from <a href="#imaxDays">imaxDays</a> and <a href="#itype">itype</a>)<br> +Values: true/false<br> +Default: false<br> +<br> +<u id="sundayOff">sundayOff</u><br> +Option: Disables selection for sundays (this is independent from <a href="#imaxDays">imaxDays</a> <br> +and <a href="#itype">itype</a>)<br> +Values: true/false<br> +Default: false<br> +<br> +<u id="sundayFirst">sundayFirst</u><br> +Option: Displays the calendar with sunday as the first day of the week.<br> +Values: true/false<br> +Default: false<br> +<br> +<u id="offX">offX</u><br> +Option: x distance from the mouse for the popup calendar<br> +Values: >0<br> +Default: 10. <br> +<br> +<u id="offY">offY</u><br> +Option: y distance from the mouse for the popup calendar<br> +Values: >0<br> +Default: -10. <br> +<br> +<u id="formatSplitter">formatSplitter</u><br> +Option: date separator<br> +Values: string<br> +Default: "-".<br> +<br> +<u id="monthFormat">monthFormat</u><br> +Option: month format on the input. June will be displayed as "Jun" in "mmm" format or as "06" in "mm" format.<br> +Values: "mmm" or "mm"<br> +Default: "mm"<br> +<br> +<u id="yearFormat">yearFormat</u><br> +Option: year format on the input. 2009 will be displayed as "2009" in "yyyy" format or as "09" in "yy" format.<br> +Values: "yyyy" or "yy"<br> +Default: "yyyy"<br> +<br> +<u id="callNotice">callNotice</u><br> +Option: Call a function when a date is selected<br> +Values: "function name"<br> +Default: "fallsilent()"<br> +<br> + <h3>Usage examples.</h3> + <ul> + <li> + <dl> + <dt><b><a href="examples/dateformat.html">Date Formatting</a>.</b></dt> + <dd>A simple example that formats the date output to yy/mmm/dd</dd> + <dt><b><a href="examples/sundayfirst.html">Sunday First</a>.</b></dt> + <dd>An example that sets sunday as the first day of the week</dd> + <dt><b><a href="examples/maxdays.html">Date Range Enabled</a>.</b></dt> + <dd>An example that enables date selection for this year.</dd> + <dt><b><a href="examples/weekend.html">Disable weekend days</a>.</b></dt> + <dd>A simple example that disables date selection for weekend days.</dd> + <dt><b><a href="examples/function.html">Function call</a>.</b></dt> + <dd>A simple example that calls a custom function when a date is picked.</dd> + </dl> + </li> + </ul> + </div> + <div id="footer">&copy; 2009 <a href="http://codetale.com" target="_blank">www.codetale.com</a></div> +</div> + </body> +</html> diff --git a/pos/is4c-web/src/includes/jquery-1.4.2.min.js b/pos/is4c-web/src/includes/jquery-1.4.2.min.js new file mode 100644 index 000000000..7c2430802 --- /dev/null +++ b/pos/is4c-web/src/includes/jquery-1.4.2.min.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? +e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= +j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, +"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= +true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| +c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", +L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, +"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ +a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], +d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== +a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& +!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= +true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", +i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", +" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= +this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= +e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= +null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, +"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= +a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, +isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= +{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; +if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& +!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, +toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, +u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), +function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; +if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; +for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- +1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, +relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= +l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; +h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= +m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| +!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= +h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, +gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; +c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? +a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& +this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| +u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== +1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); +this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], +"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, +animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= +j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); +this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| +c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? +function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= +this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; +k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& +f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/pos/is4c-web/src/includes/jquery.js b/pos/is4c-web/src/includes/jquery.js new file mode 100644 index 000000000..7c2430802 --- /dev/null +++ b/pos/is4c-web/src/includes/jquery.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? +e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= +j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, +"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= +true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| +c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", +L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, +"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ +a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], +d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== +a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& +!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= +true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", +i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", +" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= +this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= +e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= +null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, +"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= +a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, +isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= +{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; +if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& +!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, +toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, +u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), +function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; +if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; +for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- +1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, +relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= +l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; +h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= +m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| +!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= +h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, +gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; +c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? +a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& +this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| +u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== +1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); +this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], +"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, +animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= +j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); +this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| +c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? +function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= +this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; +k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& +f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/pos/is4c-web/src/includes/styles.css b/pos/is4c-web/src/includes/styles.css new file mode 100644 index 000000000..1076cb2ea --- /dev/null +++ b/pos/is4c-web/src/includes/styles.css @@ -0,0 +1,530 @@ +/************************* general body styles **********************************/ + +* { + margin: 0px; + padding: 0px; +} +body { + font-family: Arial, Helvetica, sans-serif; + font-size: small; + color: #191919; + text-align: center; + background-image: url(/images/mainBackground.gif); + background-repeat: repeat-y; + background-position: center; + height:100%; + min-height:100%; + min-width: 760px; +} + +/************************* text styles **********************************/ + +a:link { + font-weight: bold; + color: #242464; + text-decoration: underline; +} +a:visited { + color: #6B8F44; + text-decoration: underline; +} +a:hover { + text-decoration: none; + color: #242464; +} +p { + line-height: 1.5em; + margin-bottom: 10px; +} +.first{ + background-image: url(/images/purpleleaf.gif); + background-repeat: no-repeat; + text-indent: 28px;} +h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1.6em; + margin-bottom: 7px; + font-weight: normal; + color: #242464; +} +h2 { + font-size: 0.95em; + text-transform: uppercase; + color: #467131; + margin-bottom: 5px; + letter-spacing: 1px; + margin-top: 7px; +} + +.border { + border-bottom-width: 1px; + border-bottom-style: dotted; + border-bottom-color: #467131; + padding-bottom: 4px; +} +h3 { + font-size: 1em; + font-weight: bold; + margin-bottom: 5px; + letter-spacing: 1px; +} +h4 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1em; + font-style: italic; + font-weight: normal; +} +hr { +} +.date { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1em; + font-style: italic; + font-weight: normal; + text-transform: none; + color: #191919; +} +.pdf { + color: #666666; +} + +/************************* layout styles **********************************/ +.divClear { + clear: both; + height: 1px; +} +h2.divClear { + height: 1em; +} +#divContainer { /* wrapper for all centered content */ + width: 760px; + margin-top: 0px; + margin-right: auto; + margin-left: auto; + text-align: center; + padding-top: 0px; + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#divWrap { /* wrapper for all text */ + text-align: left; + +} +#index #divWrap { + background-image: url(/images/indexBackgroundTop.gif); + background-repeat: no-repeat; +} +#divHeader{ /* heading image */ + background-image: url(/images/insideBanner.jpg); + text-align: center; + height: 90px; + border: 2px solid #FFFFFF; + background-color: #000000; +} +#divIndexBannerBorder{ /* heading image */ + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + margin-top: 10px; +} +#divIndexBanner{ /* heading image */ + background-image: url(/images/indexBanner.jpg); + text-align: center; + height: 150px; + background-color: #000000; + background-repeat: no-repeat; + border: 2px solid #FFFFFF; +} +#imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-125px; + height: 124px; + width: 255px; + top: 10px; +} +#index #imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-219px; + margin-top:80px; + height: 210px; + width: 438px; + z-index:500; +} + + +/************************* secondary navigation **********************************/ +#navSecondary { + background-image: url(/images/navbackground.gif); + background-repeat: no-repeat; + height: 30px; + clear: both; +} +#index #navSecondary { + background-image: none; + background-repeat: no-repeat; +} +.navInside { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#navSecondary ul { + list-style-type: none; + float:left; + padding-left: 50px; + position:absolute; + top: 118px; +} +#index #navSecondary ul { + position:static; + top: 118px; +} +#navSecondary ul li { + float: left; + text-align: center; + z-index: 501; + } + +#navSecondary ul a { + display: block; + line-height: 16px; + padding-top: 4px; + padding-right: 0px; + padding-left: 0px; + text-transform: uppercase; + font-size: 11px; + font-weight: bold; + } + +#navSecondary ul a:link, #navSecondary ul a:visited { + text-decoration: none; + color: #191919; + font-weight: bold; + } + +#navSecondary ul a:hover, #navSecondary ul a.current { + color: #6B8F44; + font-weight: bold; + text-decoration: none; + } + +#index #navSecondary ul { + width: 600px; + padding-left: 85px; +} +#index #navSecondary ul li { + margin-left: 15px; + margin-right: 15px; + } + +/************************* primary navigation **********************************/ +/*********************** also see SpreyMenuBarHorizontal.css *******************/ +#navPrimary { + margin-left: 30px; + clear: both; + height: 25px; +} +.navPrimarytagline { + font-size: 11px; + font-style: italic; + text-transform: lowercase; + color: #6B8E44; + font-weight: bold; + text-decoration: none; +} + +/************************* primary text areas **********************************/ + +#divPrimaryContent { + padding-top: 20px; + padding-right: 20px; + padding-bottom: 20px; + padding-left: 20px; +} +#divPrimaryContent ul, #divPrimaryContent ol { + margin-left: 20px; + margin-bottom: 12px; +} +#divPrimaryContent blockquote { + margin-left: 30px; + margin-bottom: 12px; +} +#divPrimaryContent li { + margin-bottom: 5px; + line-height: 1.4em; +} + +#index #divPrimaryContent { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + background-image: url(/images/indexBackgroundBottom.gif); + background-repeat: repeat-x; + padding-right: 0px; + padding-left: 0px; +} +#divRightColumn { /* extra column */ + float: right; + width: 350px; + margin-bottom: 10px; + margin-left: 15px; + font-size: .9em; + +} + +#divPhotoCaption { /* photo with caption */ + float: right; + width: 350px; + margin-bottom: 10px; + margin-left: 10px; + border: 1px solid #999999; + font-size: .9em; + background-color: #FFF9B1; +} +#divPhotoCaptionLeft { /* photo with caption */ + width: 350px; + margin-bottom: 10px; + margin-right: 10px; + border: 1px solid #999999; + font-size: .9em; + background-color: #FFF9B1; +} +.imgBorder, .imgLeft, .imgRight { + margin-bottom: 10px; + border: 1px solid #999999; +} + +.imgLeft { + float: left; + margin-right: 15px; +} +.imgRight { + float: right; + margin-left: 15px; +} + +#divPhotoCaption p, #divPhotoCaptionLeft p { + padding-right: 10px; + padding-left: 10px; +} +#divPhotoCaption ol, #divPhotoCaption ol { + margin-right: 10px; + margin-left: 30px; +} +#divPhotoCaption h2 { + margin-right: 10px; + margin-left: 10px; +} + +#divIndexQuickLinks { /* home page left side link area */ + float: left; + width: 240px; + font-size: 11px; + padding-left: 20px; +} + +#divIndexQuickLinks h1 { + color: #6B8F44; +} + +#divIndexNews { /* home page right side news area */ + margin-left: 280px; + margin-right: 20px; +} +#divIndexNews p { + line-height: 1.6em; + background-image: url(/images/greyleaf.gif); + background-repeat: no-repeat; + text-indent: 28px; +} +#divIndexNewsHeadline { + padding: 5px; +} +#divIndexNewsContent { + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-right-color: #CCCCCC; + border-bottom-color: #CCCCCC; + border-left-color: #CCCCCC; + font-size: 11px; + color: #333333; + padding: 10px; + background-color: #FFF9B1; +} +.pSpace p { + margin-top: 5px; +} +.menu { + font-size: .95em; +} +.menu th { + padding-bottom: 5px; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #D1B85B; + text-align: center; + padding-top: 5px; +} +.menu td { + width: 14%; + padding: 5px; + text-align: center; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #D1B85B; +} +.menu .tan, .tan { + background-color: #EEE7AC; +} + +.member { + font-size: 0.95em; + border-bottom-color: #D1B85B; + margin-bottom: 15px; +} +.member th { + padding-bottom: 5px; + text-align: center; + padding-top: 5px; + background-color: #EEE7AC; + text-transform: uppercase; + color: #467131; + font-weight: bold; + letter-spacing: 1px; +} +.member td { + width: 14%; + padding: 5px; + text-align: center; + +} +.menu .tan { + background-color: #EEE7AC; +} + +/************************* andy additions **********************************/ +tr.catRowOne th { + background-color: #FFF9B1; + padding: 5px; + padding-right: 10px; + text-align: center; +} +tr.catRowOne td { + background-color: #FFF9B1; + padding: 5px; + padding-right: 10px; + text-align: center; +} +tr.catRowTwo th { + background-color: #FFFFFF; + padding: 5px; + padding-right: 10px; + text-align: center; +} +tr.catRowTwo td { + background-color: #FFFFFF; + padding: 5px; + padding-right: 10px; + text-align: center; +} + +#catsalemenu { + font-size: 110%; +} + +#catsalemenutext { + line-height: 1.3em; + margin-bottom: 2em; + background-color: #FFFFFF; + padding: 5px; +} + +#catitemimg { + float: right; + background-color: #FFFFFF; + margin-left: 15px; + margin-right: 15em; + margin-bottom: 10em; +} + +#catitembrand { + line-height: 1.5em; + font-size: 90%; +} + +#catitemdesc { + line-height: 1.3em; + font-size: 130%; + font-weight: bold; +} + +#catitemsizeinfo { + line-height: 1.5em; + font-size: 90%; +} + +#catitemprice { + line-height: 1.5em; + margin-top: 1em; + font-size: 120%; + font-weight: bold; +} + +#catitemsale { + line-height: 1.5em; + font-size: 120%; + font-weight: bold; + color: #6B8F44; +} + +#catitemlocation { + line-height: 1.5em; + margin-top: 1em; +} + +#catitemstock { + line-height: 1.5em; + margin-top: 1em; +} + +#catsaleformheader { + font-size: 115%; + margin-top: 1.3em; + padding: 5px; +} + +#catsaleform { + display: none; +} + +#shoppinglist td { + padding: 5px; +} + +#shoppinglist th { + padding: 5px; +} + +#catalogTopMenu { + font-size: 90%; + margin-bottom: 5px; + margin-top: -8px; +} + +#catitemcase { + margin-left: 10px; + margin-top: 5px; + margin-bottom: 5px; + border: solid 1px black; + padding: 4px; + width: 18em; +} diff --git a/pos/is4c-web/src/includes/styles.css.old b/pos/is4c-web/src/includes/styles.css.old new file mode 100644 index 000000000..9900c8199 --- /dev/null +++ b/pos/is4c-web/src/includes/styles.css.old @@ -0,0 +1,304 @@ +/************************* general body styles **********************************/ + +* { + margin: 0px; + padding: 0px; +} +body { + font-family: Arial, Helvetica, sans-serif; + font-size: small; + color: #191919; + text-align: center; + background-image: url(../images/mainBackground.gif); + background-repeat: repeat-y; + background-position: center; + height:100% + min-height:100% + min-width: 760px; +} + +/************************* text styles **********************************/ + +a:link { + font-weight: bold; + color: #242464; + text-decoration: underline; +} +a:visited { + color: #6B8F44; + text-decoration: underline; +} +a:hover { + text-decoration: none; + color: #242464; +} +p { + line-height: 1.5em; + margin-bottom: 10px; +} +p.first{ + background-image: url(../images/purpleleaf.gif); + background-repeat: no-repeat; + text-indent: 28px;} +h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1.6em; + margin-bottom: 7px; + font-weight: normal; +} +h2 { + font-size: .9em; + text-transform: uppercase; + color: #242464; + margin-bottom: 7px; + letter-spacing: 1px; +} + +/************************* layout styles **********************************/ +.divClear { + clear: both; + height: 1px; +} + +#divContainer { /* wrapper for all centered content */ + width: 760px; + margin-top: 0px; + margin-right: auto; + margin-left: auto; + text-align: center; + padding-top: 0px; + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#divWrap { /* wrapper for all text */ + text-align: left; + +} +#index #divWrap { + background-image: url(../images/indexBackgroundTop.gif); + background-repeat: no-repeat; +} +#divHeader{ /* heading image */ + background-image: url(../images/insideBanner.jpg); + text-align: center; + height: 90px; + border: 2px solid #FFFFFF; + background-color: #000000; +} +#divIndexBannerBorder{ /* heading image */ + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + margin-top: 10px; +} +#divIndexBanner{ /* heading image */ + background-image: url(../images/indexBanner.jpg); + text-align: center; + height: 150px; + background-color: #000000; + background-repeat: no-repeat; + border: 2px solid #FFFFFF; +} +#imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-125px; + height: 124px; + width: 255px; + top: 10px; +} +#index #imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-219px; + margin-top:80px; + height: 210px; + width: 438px; + z-index:500; +} + + +/************************* secondary navigation **********************************/ +#navSecondary { + background-image: url(../images/navbackground.gif); + background-repeat: no-repeat; + height: 30px; + clear: both; +} +#index #navSecondary { + background-image: none; + background-repeat: no-repeat; +} +.navInside { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#navSecondary ul { + list-style-type: none; + float:left; + padding-left: 50px; + position:absolute; + top: 118px; +} +#index #navSecondary ul { + position:static; + top: 118px; +} +#navSecondary ul li { + float: left; + text-align: center; + z-index: 501; + } + +#navSecondary ul a { + display: block; + line-height: 16px; + padding-top: 4px; + padding-right: 0px; + padding-left: 0px; + text-transform: uppercase; + font-size: 11px; + font-weight: bold; + } + +#navSecondary ul a:link, #navSecondary ul a:visited { + text-decoration: none; + color: #191919; + font-weight: bold; + } + +#navSecondary ul a:hover, #navSecondary ul a.current { + color: #6B8F44; + font-weight: bold; + text-decoration: none; + } + +#index #navSecondary ul { + width: 600px; + padding-left: 85px; +} +#index #navSecondary ul li { + margin-left: 15px; + margin-right: 15px; + } + +/************************* primary navigation **********************************/ +/*********************** also see SpreyMenuBarHorizontal.css *******************/ +#navPrimary { + margin-left: 30px; + clear: both; + height: 25px; +} +.navPrimarytagline { + font-size: 11px; + font-style: italic; + text-transform: lowercase; + color: #6B8E44; + font-weight: bold; + text-decoration: none; +} + +/************************* primary text areas **********************************/ + +#divPrimaryContent { + padding-top: 20px; + padding-right: 20px; + padding-bottom: 20px; + padding-left: 20px; +} + +#divPrimaryContent ul { + margin-left: 20px; + margin-bottom: 12px; +} +#divPrimaryContent li { + margin-bottom: 5px; + line-height: 1.2em; +} + +#index #divPrimaryContent { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + background-image: url(../images/indexBackgroundBottom.gif); + background-repeat: repeat-x; + padding-right: 0px; + padding-left: 0px; +} +#divPhotoCaption { /* photo with caption */ + float: right; + width: 350px; + margin-bottom: 10px; + margin-left: 10px; + border: 1px solid #999999; + font-size: .9em; + background-color: #FFF9B1; +} +#divPhotoCaption p { + padding: 10px; +} + +#divIndexQuickLinks { /* home page left side link area */ + float: left; + width: 240px; + font-size: 11px; + padding-left: 20px; +} + +#divIndexQuickLinks h1 { + color: #6B8F44; +} + +#divIndexNews { /* home page right side news area */ + margin-left: 280px; + margin-right: 20px; +} +#divIndexNews p { + line-height: 1.6em; + background-image: url(../images/greyleaf.gif); + background-repeat: no-repeat; + text-indent: 28px; +} +#divIndexNewsHeadline { + padding: 5px; +} +#divIndexNewsContent { + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-right-color: #CCCCCC; + border-bottom-color: #CCCCCC; + border-left-color: #CCCCCC; + font-size: 11px; + color: #333333; + padding: 10px; + background-color: #FFF9B1; +} + +tr.catRowOne th { + background-color: #FFFF9B1; + padding: 5px; + padding-right: 10px; +} +tr.catRowOne td { + background-color: #FFFF9B1; + padding: 5px; + padding-right: 10px; +} +tr.catRowTwo th { + background-color: #FFFF9B1; + padding: 5px; + padding-right: 10px; +} +tr.catRowTwo td { + background-color: #FFFFFF; + padding: 5px; + padding-right: 10px; +} diff --git a/pos/is4c-web/src/includes/stylesnew.css b/pos/is4c-web/src/includes/stylesnew.css new file mode 100644 index 000000000..89496ec9c --- /dev/null +++ b/pos/is4c-web/src/includes/stylesnew.css @@ -0,0 +1,517 @@ +/************************* general body styles **********************************/ + +* { + margin: 0px; + padding: 0px; +} +body { + font-family: Arial, Helvetica, sans-serif; + font-size: small; + color: #191919; + text-align: center; + background-image: url(/images/mainBackground.gif); + background-repeat: repeat-y; + background-position: center; + height:100% + min-height:100% + min-width: 760px; +} + +/************************* text styles **********************************/ + +a:link { + font-weight: bold; + color: #242464; + text-decoration: underline; +} +a:visited { + color: #6B8F44; + text-decoration: underline; +} +a:hover { + text-decoration: none; + color: #242464; +} +p { + line-height: 1.5em; + margin-bottom: 10px; +} +.first{ + background-image: url(/images/purpleleaf.gif); + background-repeat: no-repeat; + text-indent: 28px;} +h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1.6em; + margin-bottom: 7px; + font-weight: normal; + color: #242464; +} +h2 { + font-size: 0.95em; + text-transform: uppercase; + color: #467131; + margin-bottom: 10px; + letter-spacing: 1px; + margin-top: 7px; +} +.border { + border-bottom-width: 1px; + border-bottom-style: dotted; + border-bottom-color: #467131; + padding-bottom: 4px; +} +h3 { + font-size: 1em; + font-weight: bold; + margin-bottom: 10px; + letter-spacing: 1px; +} +h4 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1em; + font-style: italic; + font-weight: normal; +} +hr { +} +.date { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1em; + font-style: italic; + font-weight: normal; + text-transform: none; + color: #191919; +} +.pdf { + color: #666666; +} + +/************************* layout styles **********************************/ +.divClear { + clear: both; + height: 1px; +} + +#divContainer { /* wrapper for all centered content */ + width: 760px; + margin-top: 0px; + margin-right: auto; + margin-left: auto; + text-align: center; + padding-top: 0px; + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#divWrap { /* wrapper for all text */ + text-align: left; + +} +#index #divWrap { + background-image: url(/images/indexBackgroundTop.gif); + background-repeat: no-repeat; +} +#divHeader{ /* heading image */ + background-image: url(/images/insideBanner.jpg); + text-align: center; + height: 90px; + border: 2px solid #FFFFFF; + background-color: #000000; +} +#divIndexBannerBorder{ /* heading image */ + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + margin-top: 0px; +} +#divIndexBanner{ /* heading image */ + background-image: url(/images/insideBanner.jpg); + text-align: center; + height: 90px; + background-color: #000000; + background-repeat: no-repeat; + border: 2px solid #FFFFFF; +} +#imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-125px; + height: 124px; + width: 255px; + top: 10px; +} +#index #imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-219px; + margin-top:78px; + height: 124px; + width: 438px; + z-index:500; +} + + +/************************* secondary navigation **********************************/ +#navSecondary { + background-image: url(/images/navbackground.gif); + background-repeat: no-repeat; + height: 30px; + clear: both; +} +#index #navSecondary { + background-image: none; + background-repeat: no-repeat; +} +.navInside { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#navSecondary ul { + list-style-type: none; + float:left; + padding-left: 50px; + position:absolute; + top: 118px; +} +#index #navSecondary ul { + position:static; + top: 118px; +} + +#index #navSecondary ul { + width: 600px; + padding-left: 140px; +} +#navSecondary ul li { + float: left; + text-align: center; + z-index: 501; + } +#index #navSecondary ul li { + margin-left: 15px; + margin-right: 15px; + } + +#navSecondary ul a { + display: block; + line-height: 16px; + padding-top: 4px; + padding-right: 0px; + padding-left: 0px; + text-transform: uppercase; + font-size: 11px; + font-weight: bold; + } + +#navSecondary ul a:link, #navSecondary ul a:visited { + text-decoration: none; + color: #191919; + font-weight: bold; + } + +#navSecondary ul a:hover, #navSecondary ul a.current { + color: #6B8F44; + font-weight: bold; + text-decoration: none; + } + +/************************* primary navigation **********************************/ +/*********************** also see SpreyMenuBarHorizontal.css *******************/ +#navPrimary { + margin-left: 30px; + clear: both; + height: 25px; +} +.navPrimarytagline { + font-size: 11px; + font-style: italic; + text-transform: lowercase; + color: #6B8E44; + font-weight: bold; + text-decoration: none; +} + +/************************* primary text areas **********************************/ + +#divPrimaryContent { + padding-top: 20px; + padding-right: 20px; + padding-bottom: 20px; + padding-left: 20px; +} +#divPrimaryContent ul, #divPrimaryContent ol { + margin-left: 20px; + margin-bottom: 12px; +} +#divPrimaryContent blockquote { + margin-left: 30px; + margin-bottom: 12px; +} +#divPrimaryContent li { + margin-bottom: 5px; + line-height: 1.4em; +} + +#index #divPrimaryContent { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + background-image: url(/images/indexBackgroundBottom.gif); + background-repeat: repeat-x; + padding-right: 0px; + padding-left: 0px; +} +#divPhotoCaption { /* photo with caption */ + float: right; + width: 350px; + margin-bottom: 10px; + margin-left: 10px; + border: 1px solid #999999; + font-size: .9em; + background-color: #FFF9B1; +} +.imgBorder, .imgLeft, .imgRight { + margin-bottom: 10px; + border: 1px solid #999999; +} + +.imgLeft { + float: left; + margin-right: 15px; +} +.imgRight { + float: right; + margin-left: 15px; +} + +#divPhotoCaption p { + padding: 10px; +} + +#divIndexContent { /* home page left side link area */ + width: 540px; + margin-left: 10px; +} +#divIndexContent h1{ /* home page left side link area */ + color: #671200; + height: 24px; + font-size: 18px; + line-height: 22px; + border-bottom: 1px solid #EEE7AC; + padding-left: 5px; +} +#divIndexContent .story { + background: #EEE7AC; + padding: 5px; + margin-bottom: 5px; +} +#divIndexQuickLinks { /* home page left side link area */ + float: left; + width: 240px; + font-size: 11px; + padding-left: 20px; +} + +#divIndexQuickLinks h1 { + color: #6B8F44; +} +#divIndexNews, #divIndexFeature { /* home page right side news area */ + width: 180px; + float: right; + margin-right: 8px; + margin-left: 15px; + /*border-left-width: 1px; + border-left-style: solid; + border-left-color: #E5DB96; */ +} + +#divIndexNews p { + line-height: 1.7em; + background-image: url(/images/greyleaf.gif); + background-repeat: no-repeat; + text-indent: 28px; + +} +#divIndexNewsHeadline, #divIndexFeatureHeadline { +} +#divIndexNewsContent, #divIndexFeatureContent{ + font-size: 11px; + color: #333333; + padding: 0px 10px 10px; +} +.menu { + font-size: .95em; +} +.menu th { + padding-bottom: 5px; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #D1B85B; + text-align: center; + padding-top: 5px; +} +.menu td { + width: 14%; + padding: 5px; + text-align: center; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #D1B85B; +} +.menu .tan { + background-color: #EEE7AC; +} + +.member { + font-size: 0.95em; + border-bottom-color: #D1B85B; + margin-bottom: 15px; +} +.member th { + padding-bottom: 5px; + text-align: center; + padding-top: 5px; + background-color: #EEE7AC; + text-transform: uppercase; + color: #467131; + font-weight: bold; + letter-spacing: 1px; +} +.member td { + width: 14%; + padding: 5px; + text-align: center; + +} +.menu .tan { + background-color: #EEE7AC; +} +.divider { + clear: left; + height: 2px; + margin-top: 5px; + margin-bottom: 5px; + margin-left:10px; + +} +/************************* andy additions **********************************/ +tr.catRowOne th { + background-color: #FFFF9B1; + padding: 5px; + padding-right: 10px; + text-align: center; +} +tr.catRowOne td { + background-color: #FFFF9B1; + padding: 5px; + padding-right: 10px; + text-align: center; +} +tr.catRowTwo th { + background-color: #FFFF9B1; + padding: 5px; + padding-right: 10px; + text-align: center; +} +tr.catRowTwo td { + background-color: #FFFFFF; + padding: 5px; + padding-right: 10px; + text-align: center; +} + +#catsalemenu { + font-size: 110%; +} + +#catsalemenutext { + line-height: 1.3em; + margin-bottom: 2em; + background-color: #FFFFFF; + padding: 5px; +} + +#catitemimg { + float: right; + background-color: #FFFFFF; + padding: 5px; + margin-left: 15px; + margin-right: 15em; +} + +#catitembrand { + line-height: 1.5em; + font-size: 90%; +} + +#catitemdesc { + line-height: 1.3em; + font-size: 130%; + font-weight: bold; +} + +#catitemsizeinfo { + line-height: 1.5em; + font-size: 90%; +} + +#catitemprice { + line-height: 1.5em; + margin-top: 1em; + font-size: 120%; + font-weight: bold; +} + +#catitemsale { + line-height: 1.5em; + font-size: 120%; + font-weight: bold; + color: #6B8F44; +} + +#catitemlocation { + line-height: 1.5em; + margin-top: 1em; +} + +#catitemstock { + line-height: 1.5em; + margin-top: 1em; +} + +#catsaleformheader { + font-size: 115%; + margin-top: 1.3em; + padding: 5px; +} + +#catsaleform { + display: none; +} + +#shoppinglist td { + padding: 5px; +} + +#shoppinglist th { + padding: 5px; +} + +#catalogTopMenu { + font-size: 90%; + margin-bottom: 5px; + margin-top: -8px; +} + +#catitemcase { + margin-left: 10px; + margin-top: 5px; + margin-bottom: 5px; + border: solid 1px black; + padding: 4px; + width: 18em; +} diff --git a/pos/is4c-web/src/includes/stylestest.css b/pos/is4c-web/src/includes/stylestest.css new file mode 100644 index 000000000..db362a937 --- /dev/null +++ b/pos/is4c-web/src/includes/stylestest.css @@ -0,0 +1,359 @@ +/************************* general body styles **********************************/ + +* { + margin: 0px; + padding: 0px; +} +body { + font-family: Arial, Helvetica, sans-serif; + font-size: small; + color: #191919; + text-align: center; + background-image: url(/images/mainBackground.gif); + background-repeat: repeat-y; + background-position: center; + + min-width: 760px; +} + + + +/************************* layout styles **********************************/ +.divClear { + clear: both; + height: 1px; +} + +#divContainer { /* wrapper for all centered content */ + width: 760px; + margin-top: 0px; + margin-right: auto; + margin-left: auto; + text-align: center; + padding-top: 0px; + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#divWrap { /* wrapper for all text */ + text-align: left; + +} +#index #divWrap { + background-image: url(/images/indexBackgroundTop.gif); + background-repeat: no-repeat; +} +#divHeader{ /* heading image */ + background-image: url(/images/insideBanner.jpg); + text-align: center; + height: 90px; + border: 2px solid #FFFFFF; + background-color: #000000; +} +#divIndexBannerBorder{ /* heading image */ + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + margin-top: 10px; +} +#divIndexBanner{ /* heading image */ + background-image: url(/images/indexBanner.jpg); + text-align: center; + height: 150px; + background-color: #000000; + background-repeat: no-repeat; + border: 2px solid #FFFFFF; +} +#imgLogo { /* WFC logo positioning */ + position: relative; + left: 50%; + margin-left:-125px; + height: 124px; + width: 255px; + top: 10px; +} +#index #imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-219px; + margin-top:80px; + height: 210px; + width: 438px; + z-index:500; +} + + + + + + + +/************************* text styles **********************************/ + +a:link { + font-weight: bold; + color: #242464; + text-decoration: underline; +} +a:visited { + color: #6B8F44; + text-decoration: underline; +} +a:hover { + text-decoration: none; + color: #242464; +} +p { + line-height: 1.5em; + margin-bottom: 10px; +} +.first{ + background-image: url(/images/purpleleaf.gif); + background-repeat: no-repeat; + text-indent: 28px;} +h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1.6em; + margin-bottom: 7px; + font-weight: normal; + color: #242464; +} +h2 { + font-size: 0.95em; + text-transform: uppercase; + color: #467131; + margin-bottom: 10px; + letter-spacing: 1px; + margin-top: 7px; +} +.border { + border-bottom-width: 1px; + border-bottom-style: dotted; + border-bottom-color: #467131; + padding-bottom: 4px; +} +h3 { + font-size: 1em; + font-weight: bold; + margin-bottom: 10px; + letter-spacing: 1px; +} +h4 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1em; + font-style: italic; + font-weight: normal; +} +hr { +} +.date { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1em; + font-style: italic; + font-weight: normal; + text-transform: none; + color: #191919; +} +.pdf { + color: #666666; +} +/************************* secondary navigation **********************************/ +#navSecondary { + background-image: url(/images/navbackground.gif); + background-repeat: no-repeat; + height: 30px; + clear: both; +} +#index #navSecondary { + background-image: none; + background-repeat: no-repeat; +} +.navInside { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +#navSecondary ul { + list-style-type: none; + float:left; + padding-left: 50px; + position:absolute; + top: 118px; +} +#index #navSecondary ul { + position:static; + top: 118px; +} +#navSecondary ul li { + float: left; + text-align: center; + z-index: 501; + } + +#navSecondary ul a { + display: block; + line-height: 16px; + padding-top: 4px; + padding-right: 0px; + padding-left: 0px; + text-transform: uppercase; + font-size: 11px; + font-weight: bold; + } + +#navSecondary ul a:link, #navSecondary ul a:visited { + text-decoration: none; + color: #191919; + font-weight: bold; + } + +#navSecondary ul a:hover, #navSecondary ul a.current { + color: #6B8F44; + font-weight: bold; + text-decoration: none; + } + +#index #navSecondary ul { + width: 600px; + padding-left: 85px; +} +#index #navSecondary ul li { + margin-left: 15px; + margin-right: 15px; + } + +/************************* primary navigation **********************************/ +/*********************** also see SpreyMenuBarHorizontal.css *******************/ +#navPrimary { + margin-left: 30px; + clear: both; + height: 25px; +} +.navPrimarytagline { + font-size: 11px; + font-style: italic; + text-transform: lowercase; + color: #6B8E44; + font-weight: bold; + text-decoration: none; +} + +/************************* primary text areas **********************************/ + +#divPrimaryContent { + padding-top: 20px; + padding-right: 20px; + padding-bottom: 20px; + padding-left: 20px; +} +#divPrimaryContent ul, #divPrimaryContent ol { + margin-left: 20px; + margin-bottom: 12px; +} +#divPrimaryContent blockquote { + margin-left: 30px; + margin-bottom: 12px; +} +#divPrimaryContent li { + margin-bottom: 5px; + line-height: 1.4em; +} + +#index #divPrimaryContent { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + background-image: url(/images/indexBackgroundBottom.gif); + background-repeat: repeat-x; + padding-right: 0px; + padding-left: 0px; +} +#divPhotoCaption { + float: right; + width: 350px; + margin-bottom: 10px; + margin-left: 10px; + border: 1px solid #999999; + font-size: .9em; + background-color: #FFF9B1; +} +.imgBorder, .imgLeft, .imgRight { + margin-bottom: 10px; + border: 1px solid #999999; +} + +.imgLeft { + float: left; + margin-right: 15px; +} +.imgRight { + float: right; + margin-left: 15px; +} + +#divPhotoCaption p { + padding: 10px; +} + +#divIndexQuickLinks { float: left; + width: 240px; + font-size: 11px; + padding-left: 20px; +} + +#divIndexQuickLinks h1 { + color: #6B8F44; +} + +#divIndexNews { + margin-left: 280px; + margin-right: 20px; +} +#divIndexNews p { + line-height: 1.6em; + background-image: url(/images/greyleaf.gif); + background-repeat: no-repeat; + text-indent: 28px; +} +#divIndexNewsHeadline { + padding: 5px; +} +#divIndexNewsContent { + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-right-color: #CCCCCC; + border-bottom-color: #CCCCCC; + border-left-color: #CCCCCC; + font-size: 11px; + color: #333333; + padding: 10px; + background-color: #FFF9B1; +} +.menu { + font-size: .95em; +} +.menu th { + padding-bottom: 5px; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #D1B85B; + text-align: center; + padding-top: 5px; +} +.menu td { + width: 14%; + padding: 5px; + text-align: center; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #D1B85B; +} +.menu .tan { + background-color: #EEE7AC; +} diff --git a/pos/is4c-web/src/includes/test2.css b/pos/is4c-web/src/includes/test2.css new file mode 100644 index 000000000..a13356f01 --- /dev/null +++ b/pos/is4c-web/src/includes/test2.css @@ -0,0 +1,233 @@ +@charset "UTF-8"; +/* CSS Document */ + +/*TYPOGRAPHY*/ + +/*NAVIGATION*/ + +/*.moduletable { margin-bottom: 1em; } + +#topnav a { +color: #828282; +display:block; +float:left; +line-height:31px; +height: 31px; +padding:0px; +text-decoration:none; +background: url('../images/tab.jpg') no-repeat top left; +width: 80px; +text-align: center; +} +input.reset { + width:75px; height: 33px; border: 0px none; background:#fff url('../images/button_reset.png') no-repeat; +} +input.button { + background:#050 url('../images/tableHeaderBg.png') repeat-x top left; color:#e2e2e2; font-weight:bold; margin: 3px 5px; padding: 2px 8px; +} +#topnav a:hover, #topnav a.hover, #topnav span.active a { + background-position: 0 -32px; + border-bottom: 2px solid #fff; + color: #111; +}*/ +/*LAYOUT*/ +* { padding: 0; margin: 0; } +/* body { + + background: #fff url('../images/body-background.gif') repeat-x top left; + +} +#wrapper { + margin: 0 auto; + width: 770px; +} +*/ +/* body { + background:#fff url('../images/bodybg.png') repeat-x; color:#000; +} + +#wrapper { + margin: 0 auto; + width: 790px; + padding: 0 10px; + border-left: 1px solid #bbb; + border-right: 1px solid #bbb; + background: #fff url('../images/body-background.gif') repeat-x top left; +} + +#faux { + + margin-bottom: 5px; + width: 100%; + margin-top: -14px; + height: 90%; + +} +* html #faux { + overflow: auto; Paul O Brien Fix for IE www.pmob.co.uk, and only for IE because overflow kills Konqueror +} +#search { + background: url('../images/search.png') no-repeat top left; + width: 300px; + height: 25px; + margin: 0px; padding:0px; +} +#logo { + width: 229px; + height: 92px; + +} +#topnav { + width: 770px; + height: 30px; + margin-top: 3px; + +} + +#rightcolumntop { + float: right; + background:url('../images/rightcolumn-top.jpg') no-repeat top left; + width: 195px; + height: 26px; + margin-top: -17px; + border-bottom: 10px solid #fff; +} +* html #rightcolumntop { + margin-top: -20px; + } +* html #topnav { + margin-top: 0px; + +} +#rightcolumn { + display: block; + margin: 10px 0px; + margin-top: -10px; + padding: 0px; + width: 195px; + min-height: 500px; + float: right; + background: url('../images/rightcolumn-expansion.png') no-repeat top left; + +}*/ +/* IE before 7 doesn't do min-height +* html #rightcolumn { + height: 500px; +} +#rightcolumn-content { + margin: 18px; +} +#breadcrumbs { + margin-bottom: 10px; +} +#leftcolumn { + float: left; + margin: 10px 0px; + padding: 0px; + width: 575px; + display: inline; + position: relative; + border-bottom: 1px dotted #ccc; +} +#footer { + width: 770px; + clear: both; + margin: 0px 0px 60px 0px; + padding: 10px; +}*/ +#grass { + bottom: 0; + height: 55px; + width: 100%; + background: url('../testimages/aigrass.gif') repeat-x 0 0; + position: fixed; +} +/*.clear { clear: both; background: none; } + + +FORMS +#mod_search_searchword { + background-color: #4b4b4b; + border: 1px solid #5d5d5d; + color: #fff; + margin-left: 90px; + margin-top: 3px; + width: 150px; + margin-right: 0; + height: 14px; +} + +#mod_search_searchword:hover { + border: 1px solid #a8a8a8; +} + +#mod_search_searchword:focus { + background-color: #737373; + border: 1px solid #a8a8a8; + } + +#search input { + float: left; + font-size: 13px; +} + +#search .submit { + margin-top: 3px; + margin-left: 2px; +} + +.submit:hover { + cursor: pointer; + +} +#demodemo { + border: 1px solid #050; margin: 15px auto; clear:right;background:#fff; +} +.flashintro { + width: 550px; +} +*/ +/* For external apps such as domain management and contact +.managebox { + display: block; + margin: 10px 0px; + padding: 0px; + width: 170px; + float: right; +} +.contM { + float: left; + width: 570px; +} +hr {border:none;margin-top: 20px; border-bottom: 1px dashed #505;color:#dfdfdf;} +.debugbox { border: 1px dotted green; background-color: #aa4; color: #fff;} +h2 {color: #015500; font-size: 1em;} + +.disabled {color:#aaa; background-color: #fff;} +.disabled b, .disabled strong {color:#988; background-color:#fff;} + +blockquote ul.bulleted {border-right: 3em solid #e4e4e6;} +dt { color:#050; font-weight:bold; margin-top:1em;} + +.inline dt {float:left; color:#050; padding-right: 0.5em; font-weight:bold;} +.inline dd {color:#4b4b4b; font-weight:normal;} +dl.inline {margin-left: 1em;} +dl.inline dt { + margin-top:0 +} +dl.inline dd { + margin-bottom: 1em; +} +.level1 li {margin-left:1.2em; +} +ul.level1 { + margin:0 0 1em 0; padding:0; +} +ul.level1 li {list-style-type:none;} +.level2 li { + margin-left: 3em; text-indent: -2em; +} +.disclaimer { + margin-top: 2em; padding:2px 1em 1em 1em; background-color:#dfdfdf; font-size:smaller; font-style: italic; +} +*/ \ No newline at end of file diff --git a/pos/is4c-web/src/includes/teststyles.css b/pos/is4c-web/src/includes/teststyles.css new file mode 100644 index 000000000..8017aa4e4 --- /dev/null +++ b/pos/is4c-web/src/includes/teststyles.css @@ -0,0 +1,265 @@ +/************************* general body styles **********************************/ + +* { + margin: 0px; + padding: 0px; +} +body { + font-family: Arial, Helvetica, sans-serif; + font-size: small; + color: #191919; + text-align: center; + background-image: url(../images/mainBackground.gif); + background-repeat: repeat-y; + background-position: center; + height:100% + min-height:100% + min-width: 760px; +} + +/************************* text styles **********************************/ + +a:link { + font-weight: bold; + color: #242464; + text-decoration: underline; +} +a:visited { + color: #6B8F44; + text-decoration: underline; +} +a:hover { + text-decoration: none; + color: #242464; +} +p { + line-height: 1.5em; + margin-bottom: 10px; +} +p.first{ + background-image: url(../images/purpleleaf.gif); + background-repeat: no-repeat; + text-indent: 28px;} +h1 { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 1.6em; + margin-bottom: 7px; + font-weight: normal; +} +h2 { + font-size: .9em; + text-transform: uppercase; + color: #242464; + margin-bottom: 7px; + letter-spacing: 1px; +} + +/************************* layout styles **********************************/ +.divClear { + clear: both; + height: 1px; +} + +#divContainer { /* wrapper for all centered content */ + width: 760px; + margin-top: 0px; + margin-right: auto; + margin-bottom: 50px; + margin-left: auto; + text-align: center; + padding-top: 0px; + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + + +#divWrap { /* wrapper for all text */ + text-align: left; + +} +#index #divWrap { + background-image: url(../images/indexBackgroundTop.gif); + background-repeat: no-repeat; + background-color: #D0B95B; +} +#divHeader{ /* heading image */ + background-image: url(../images/insideBanner.jpg); + text-align: center; + height: 90px; + border: 2px solid #FFFFFF; + background-color: #000000; +} +#divIndexBannerBorder{ /* heading image */ + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + margin-top: 10px; +} +#divIndexBanner{ /* heading image */ + background-image: url(../images/indexBanner.jpg); + text-align: center; + height: 150px; + background-color: #000000; + background-repeat: no-repeat; + border: 2px solid #FFFFFF; +} +#imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-125px; + height: 124px; + width: 255px; + top: 10px; +} +#index #imgLogo { /* WFC logo positioning */ + position: absolute; + left: 50%; + margin-left:-219px; + margin-top:80px; + height: 210px; + width: 438px; + z-index:500; +} +#navSecondary { /* secondary navigation */ + background-image: url(../images/navbackground.gif); + background-repeat: no-repeat; + height: 30px; + clear: both; +} +#index #navSecondary { /* secondary navigation */ + background-image: none; + background-repeat: no-repeat; +} +.navInside { /* secondary navigation */ + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; +} + +/************************* secondary navigation **********************************/ +#navSecondary ul { + list-style-type: none; + float:left; + padding-left: 50px; +} +#navSecondary ul li { + float: left; + text-align: center; + } + +#navSecondary ul a { + display: block; + line-height: 16px; + padding-top: 4px; + padding-right: 0px; + padding-left: 0px; + text-transform: uppercase; + font-size: 11px; + font-weight: bold; + } + +#navSecondary ul a:link, #navSecondary ul a:visited { + text-decoration: none; + color: #191919; + font-weight: bold; + } + +#navSecondary ul a:hover, #navSecondary ul a.current { + color: #6B8F44; + font-weight: bold; + text-decoration: none; + } + +#index #navSecondary ul { + width: 600px; + padding-left: 85px; +} +#index #navSecondary ul li { + margin-left: 15px; + margin-right: 15px; + } + +/************************* primary navigation **********************************/ +/*********************** also see SpreyMenuBarHorizontal.css *******************/ +#navPrimary { + margin-left: 30px; + clear: both; +} +.navPrimarytagline { + font-size: 11px; + font-style: italic; + text-transform: lowercase; + color: #6B8E44; + font-weight: bold; + text-decoration: none; +} + +/************************* primary text areas **********************************/ + +#divPrimaryContent { + padding: 20px; +} + +#index #divPrimaryContent { + border-top-width: 2px; + border-top-style: solid; + border-top-color: #000000; + background-image: url(../images/indexBackgroundBottom.gif); + background-repeat: repeat-x; + padding-right: 0px; + padding-left: 0px; + background-color: #F5F4C1; +} +#divPhotoCaption { /* photo with caption */ + float: right; + width: 350px; + margin-bottom: 10px; + margin-left: 10px; + border: 1px solid #999999; + font-size: .9em; + background-color: #FFF9B1; +} +#divPhotoCaption p { + padding: 10px; +} + +#divIndexQuickLinks { /* home page left side link area */ + float: left; + width: 240px; + font-size: 11px; + padding-left: 20px; +} + +#divIndexQuickLinks h1 { + color: #6B8F44; +} + +#divIndexNews { /* home page right side news area */ + margin-left: 280px; + margin-right: 20px; +} +#divIndexNews p { + line-height: 1.6em; + background-image: url(../images/greyleaf.gif); + background-repeat: no-repeat; + text-indent: 28px; +} +#divIndexNewsHeadline { + padding: 5px; +} +#divIndexNewsContent { + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-right-color: #CCCCCC; + border-bottom-color: #CCCCCC; + border-left-color: #CCCCCC; + font-size: 11px; + color: #333333; + padding: 10px; + background-color: #FFF9B1; +} diff --git a/pos/is4c-web/src/template/doctype.html b/pos/is4c-web/src/template/doctype.html new file mode 100644 index 000000000..78d96bff2 --- /dev/null +++ b/pos/is4c-web/src/template/doctype.html @@ -0,0 +1,4 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> diff --git a/pos/is4c-web/src/template/footer.html b/pos/is4c-web/src/template/footer.html new file mode 100644 index 000000000..28b584ca7 --- /dev/null +++ b/pos/is4c-web/src/template/footer.html @@ -0,0 +1,19 @@ +</div> <!--end of divPrimaryContent--> +</div> <!--end of divWrap--> +</div> <!--end of divContainer--> + +<div id="grass"> <div id="content"> + <div id="highlights"> + <p><img src="/src/images/clock.gif" width="28" height="28" align="absmiddle" /> open 7am - 9pm Every day! &nbsp;&nbsp;&nbsp;&nbsp; <img src="/src/images/deli.gif" width="28" height="28" align="absmiddle" /> <a href="http://wholefoods.coop/menu.cgi">Deli Menu</a>&nbsp;&nbsp;&nbsp;&nbsp; <img src="/src/images/plu.gif" width="28" height="28" align="absmiddle" /> <a href="http://wholefoods.coop/PLUfinder.cgi">PLU Lookup</a> &nbsp;&nbsp;&nbsp;&nbsp;<img src="/src/images/compass.gif" alt="" width="28" height="28" align="absmiddle" /> <a href="http://wholefoods.coop/dw/Location_Map.shtml">Location Map</a></p> + </div> + <p>&nbsp;&nbsp;&nbsp;&nbsp;610 E 4th Street &nbsp;&nbsp; l &nbsp;&nbsp; Duluth, MN 55805 &nbsp;&nbsp; l &nbsp;&nbsp; phone: (218) 728-0884 &nbsp;&nbsp; l &nbsp;&nbsp; info@wholefoods.coop + &nbsp;&nbsp; l &nbsp;&nbsp; <a href="http://wholefoods.coop/MyAccount/">My Account</a> &nbsp;&nbsp; l &nbsp;&nbsp; <img src="/src/images/facebook_sm.gif" width="12" height="12" align="texttop" /> <a href="http://www.facebook.com/pages/Duluth-MN/Whole-Foods-Co-op/49852317869?ref=ts" target="_blank">Visit us on Facebook</a></p> + </div></div> + +<script type="text/javascript"><!-- this script is for the drop-down menus--> +<!-- +var MenuBar1 = new Spry.Widget.MenuBar("MenuBar1", {imgDown:"/includes/SpryAssets/SpryMenuBarDownHover.gif", imgRight:"/includes/SpryAssets/SpryMenuBarRightHover.gif"}); +//--> +</script> +</body> +</html> diff --git a/pos/is4c-web/src/template/header.html b/pos/is4c-web/src/template/header.html new file mode 100644 index 000000000..f4703d405 --- /dev/null +++ b/pos/is4c-web/src/template/header.html @@ -0,0 +1,76 @@ +<link href="/src/includes/styles.css" rel="stylesheet" type="text/css" /> +<link href="/src/includes/colortheme.css" rel="stylesheet" type="text/css" /> +<script src="/src/includes/SpryMenuBar.js" type="text/javascript"></script> +<link href="/src/includes/SpryMenuBarHorizontal.css" rel="stylesheet" type="text/css" /> +<link href="/src/includes/footer.css" rel="stylesheet" type="text/css" /> +<!--[if IE]> +<link rel="stylesheet" type="text/css" href="/src/includes/iehacks.css" /> +<![endif]--> +<script src="/src/includes/jquery.js" type="text/javascript"></script> +</head> + +<body class="themeGreen" > <div id="divMask"></div> + +<div id="divContainer"><div id="divWrap"> + +<div id="divHeader"> + <div id="imgLogo"> + <a href="http://wholefoods.coop/"><img src="/src/images/wholefoodscoop.gif" alt="Whole Foods Coop, Duluth, MN" width="255" height="122" border="0" /></a></div></div> + + +<div id="navSecondary" class="navInside"><ul> + <li><a href="http://wholefoods.coop/dw/Board_News.shtml" style="width:90px;">Board news</a></li> + <li><a href="http://wholefoods.coop/jobs.cgi" style="width:180px;">Employment opportunities</a></li> + <li><a href="http://wholefoods.coop/#" style="width:90px;"></a></li> + <li><a href="http://wholefoods.coop/dw/Garbanzo_Gazette.shtml" style="width:130px;">Newsletters</a></li> + <li><a href="http://wholefoods.coop/dw/Links.shtml" style="width:70px;">Links</a></li> + <li><a href="http://wholefoods.coop/" style="width:70px;">Home</a></li> + </ul></div> + +<div id="navPrimary"> + <ul id="MenuBar1" class="MenuBarHorizontal"> + <li><a class="MenuBarItemSubmenu" href="http://wholefoods.coop/dw/About_Our_Co-op.shtml">About our Coop</a> + <ul> + <li><a href="http://wholefoods.coop/dw/History.shtml">History</a></li> + <li><a href="http://wholefoods.coop/dw/Exterior_Art_Project.shtml">Supporting local artists</a></li> + <li><a href="http://wholefoods.coop/dw/Location_Map.shtml">Directions</a></li> + <li><a href="http://wholefoods.coop/dw/Kudos.shtml">Kudos</a></li> + <li><a href="http://wholefoods.coop/dw/Donation_Form.shtml">Donation Request Form</a></li> + <li><a href="http://wholefoods.coop/dw/Contact_Us.shtml">Contact Information</a></li> + </ul></li> + <li><a class="MenuBarItemSubmenu" href="http://wholefoods.coop/dw/Membership.shtml">Ownership</a> + <ul> + <li><a href="http://wholefoods.coop/dw/What_is_it.shtml">What is it?</a></li> + <li><a href="http://wholefoods.coop/dw/How_to_Cost.shtml">How to/cost</a></li> + <li><a href="http://wholefoods.coop/dw/Fran_Skinner_Memorial.shtml">Fran Skinner matching fund</a></li> + <li><a href="http://wholefoods.coop/dw/Benefits.shtml">Benefits</a></li> + <li><a href="http://wholefoods.coop/docs/OwnersManual.pdf">Owner's Manual (pdf)</a></li> + </ul></li> + <li><a class="MenuBarItemSubmenu" href="http://wholefoods.coop/dw/Store_Specials.shtml">Store specials</a> + <ul> + <li><a href="http://wholefoods.coop/dw/Co-op_Advantage_Flyer.shtml">Co+op Deals</a></li> + <li><a href="http://catalog.wholefoods.coop/catalogMemberSale.cgi">Owner Extras</a></li> + <li><a href="http://wholefoods.coop/dw/Coupons.shtml">Coupons</a></li> + </ul></li> + <li><a class="MenuBarItemSubmenu" href="http://wholefoods.coop/dw/What's_Going_On.shtml">What's going on at the Coop</a> + <ul> + <li><a href="http://wholefoods.coop/dw/Classes.shtml">Classes</a></li> + <li><a href="http://wholefoods.coop/dw/Meetings.shtml">Meetings</a></li> + <!--<li><a href="http://wholefoods.coop/dw/Around_Town.shtml">WFC Around Town</a></li>--> + </ul></li> + <li><a class="MenuBarItemSubmenu" href="http://wholefoods.coop/dw/Department_Highlights.shtml">Department Highlights </a> + <ul> + <li><a href="http://wholefoods.coop/dw/Recipes.shtml">Rush Hour Recipes</a></li> + <li><a href="http://wholefoods.coop/dw/Grocery.shtml">Grocery</a></li> + <li><a href="http://wholefoods.coop/dw/Bulk.shtml">Bulk</a></li> + <li><a href="http://wholefoods.coop/dw/Cool.shtml">Cool</a></li> + <li><a href="http://wholefoods.coop/dw/Health_body.shtml">Health & Body Care (HBC)</a></li> + <li><a href="http://wholefoods.coop/dw/Deli.shtml">Deli</a></li> + <li><a href="http://wholefoods.coop/dw/Produce.shtml">Produce</a></li> + <li><a href="http://wholefoods.coop/dw/Front_End.shtml">Front End</a></li> + </ul></li> + </ul> + </div> + +<div id="divPrimaryContent"> +<div class="divClear"><!--a comment so IE won't add height to the div--></div> diff --git a/pos/is4c/rs232/ssd b/pos/is4c/rs232/ssd deleted file mode 100755 index b50858bba..000000000 Binary files a/pos/is4c/rs232/ssd and /dev/null differ diff --git a/scripts/check_slave.php b/scripts/check_slave.php new file mode 100644 index 000000000..2f15b2e57 --- /dev/null +++ b/scripts/check_slave.php @@ -0,0 +1,143 @@ +<?php +/** + * Description: This script checks the slave status on the configured host + * printing "BAD <description>" or "OK <description>" for failure + * or success respectively. + * The possible failures could include: + * 1) connection failure + * 2) query failure (permissions, network, etc.) + * 3) fetch failure (???) + * 4) slave or io thread is not running + * 5) Unknown master state (seconds_behind_master is null) + * 6) seconds_behind_master has exceeded the configured threshold + * + * If none of these condition occur, we asssume success and return + * an "OK" response, otherwise we include the error we can find + * (mysqli_connect_error() or $mysqli->error, or problem + * description). A monitoring system need only check for: + * /^BAD/ (alert) or /^OK/ (everybody happy) + */ + +/* ************************** + * Change related value below + * ************************** + */ + $host = array( + // "cr-1" => "192.168.0.81", + // "cr-2" => "192.168.0.82", + // "cr-3" => "192.168.0.83", + // "cr-4" => "192.168.0.84", + // "cr-5" => "192.168.0.85", + // "jp-1" => "192.168.100.81", + // "jp-2" => "192.168.100.82", + // "jp-3" => "192.168.100.83", + // "jp-4" => "192.168.100.84", + // "jp-5" => "192.168.100.85", + "cr-test" => "192.168.0.87" + ); + $user = ""; + $pass = ""; + $mailto = ""; + $mailfrom = ""; + +/* ****************************************** + * No need to change anything below this line + * ****************************************** +*/ + +error_reporting(E_ALL); +header("Content-Type: text/plain"); # Not HTML +foreach ($host as $key => $value) { + + $mailsubject = "[".$key."] SLAVE REPLICATION ALERT"; + $mailheaders = "From:" . $mailfrom; + $sql = "SHOW SLAVE STATUS"; + $skip_file = 'skip_alerts'; + $link = mysql_connect($value, $user, $pass, null); + + if($link) + $result = mysql_query($sql, $link); + else { + printf("[".$key."] BAD: Connection Failed %s", mysql_error()); + mysql_close($link); + return; + } + + if($result) + $status = mysql_fetch_assoc($result); + else { + printf("[".$key."] BAD: Query failed - %s\n", mysql_error($link)); + mysql_close($link); + return; + } + + mysql_close($link); + + $slave_lag_threshold = 120; + + $tests = array( + 'test_slave_io_thread' => array('Slave_IO_Running', "\$var === 'Yes'", + 'Slave IO Thread is not running'), + 'test_slave_sql_thread' => array('Slave_SQL_Running', "\$var === 'Yes'", + 'Slave SQL Thread is not running') +// 'test_last_err' => array('Last_Errno', "\$var == 0", +// "Error encountered during replication - " +// .$status['Last_Error']), +// 'test_master_status' => array('Seconds_Behind_Master', "isset(\$var)", +// 'Unknown master status (Seconds_Behind_Master IS NULL)'), +// 'test_slave_lag' => array('Seconds_Behind_Master', +// "\$var < \$slave_lag_threshold", +// "Slave is ${status['Seconds_Behind_Master']}s behind master (threshold=$slave_lag_threshold)") + ); + + $epic_fail = false; + if(is_file($skip_file)) + $epic_fail = false; + else { + $mailmessage = ""; + $val1 = 0; + foreach($tests as $test_name => $data) { + list($field, $expr, $err_msg) = $data; + $var = $status[$field]; + $val = eval("return $expr;"); + $val1 = (!$val) ? $val1 + 1 : $val1 - 1; + // $mailmessage .= "BAD: " . $key . " replication failed. Reason: " . $err_msg . "\n"; + //print $val1."\n"; + } + if ($val1 > 0) { + print "[".$key."] BAD: Slave failure detected. Attempting RESET.\n"; + $reset = "mysql -u".$user." -p".$pass." -h ".$value." -e \"slave stop;reset slave;slave start\""; + exec($reset, $output, $result); + if ($result <> 0) { + print "[".$key."] BAD: RESET FAILED :-( \n"; + } else { + print "[".$key."] RESET Successful.\n"; + sleep(3); + $val2 = 0; + foreach($tests as $test_name => $data) { + list($field, $expr, $err_msg) = $data; + $var = $status[$field]; + $val = eval("return $expr;"); + $val1 = (!$val) ? $val1 + 1 : $val1 - 1; + $mailmessage .= "[".$key."] BAD: Replication failed. Reason: " . $err_msg . "\n"; + } + } + if ($val2 > 0) { + mail($mailto,$mailsubject,$mailmessage,$mailheaders); + print $mailmessage . "\n"; + $epic_fail = true; + } + } + } + + if(!$epic_fail) { + print "[".$key."] OK: Checks all completed successfully.\n"; + } +} + +function reset_slave($host_ip) { + $reset = "mysql -u".$user." -p".$pass." -h ".$host_ip." -e \"slave stop;reset slave;slave start\""; + exec($reset, $output, $result); + $ret = ($result > 0) ? true : false; +} +?> \ No newline at end of file diff --git a/scripts/preh/52-prehkeytec.rules b/scripts/preh/52-prehkeytec.rules new file mode 100755 index 000000000..d2eba03ab --- /dev/null +++ b/scripts/preh/52-prehkeytec.rules @@ -0,0 +1,4 @@ +# udev rules for PrehKeyTec devices +# copy this file to /etc/rules.d/52-prehkeytec.rules +SUBSYSTEM=="usb", SYSFS{idVendor}=="053a", KERNEL=="hiddev*", MODE="0666" + diff --git a/scripts/preh/CORE-POS-Harvest.mwx b/scripts/preh/CORE-POS-Harvest.mwx new file mode 100644 index 000000000..77e33eb34 Binary files /dev/null and b/scripts/preh/CORE-POS-Harvest.mwx differ diff --git a/scripts/preh/CORE-POS-Harvest_TEST.mwx b/scripts/preh/CORE-POS-Harvest_TEST.mwx new file mode 100644 index 000000000..a09539643 Binary files /dev/null and b/scripts/preh/CORE-POS-Harvest_TEST.mwx differ diff --git a/scripts/preh/copy2mci b/scripts/preh/copy2mci new file mode 100755 index 000000000..dd43df2fc Binary files /dev/null and b/scripts/preh/copy2mci differ diff --git a/scripts/preh/copy2mci.pdf b/scripts/preh/copy2mci.pdf new file mode 100755 index 000000000..0878f3f67 Binary files /dev/null and b/scripts/preh/copy2mci.pdf differ diff --git a/unit-tests/fannie-unit-tests/InstallTest.php b/unit-tests/fannie-unit-tests/InstallTest.php new file mode 100644 index 000000000..51ed6f241 --- /dev/null +++ b/unit-tests/fannie-unit-tests/InstallTest.php @@ -0,0 +1,77 @@ +<?php +include(dirname(__FILE__).'/../../fannie/config.php'); +include(dirname(__FILE__).'/../../fannie/src/SQLManager.php'); + +/** + * @backupGlobals disabled + */ +class InstallTest extends PHPUnit_Framework_TestCase +{ + public function testDoInstall(){ + ob_start(); + include(dirname(__FILE__).'/../../fannie/install/index.php'); + $page = ob_get_clean(); + + /* verify database structures */ + + $con = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_OP_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + $results = create_op_dbs($con); + $this->assertNotEmpty($results,'create_op_dbs did not return an array'); + foreach($results as $result){ + $this->assertArrayHasKey('error',$result,'Invalid result entry'); + $this->assertArrayHasKey('error_msg',$result,'Invalid result entry'); + $this->assertArrayHasKey('db',$result,'Invalid result entry'); + $this->assertArrayHasKey('struct',$result,'Invalid result entry'); + $this->assertEquals(0,$result['error'], + 'Error creating '.$result['db'].'.'.$result['struct'].': '.$result['error_msg']); + } + + $con = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_TRANS_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + $results = create_trans_dbs($con); + $this->assertNotEmpty($results,'create_trans_dbs did not return an array'); + foreach($results as $result){ + $this->assertArrayHasKey('error',$result,'Invalid result entry'); + $this->assertArrayHasKey('error_msg',$result,'Invalid result entry'); + $this->assertArrayHasKey('db',$result,'Invalid result entry'); + $this->assertArrayHasKey('struct',$result,'Invalid result entry'); + $this->assertEquals(0,$result['error'], + 'Error creating '.$result['db'].'.'.$result['struct'].': '.$result['error_msg']); + } + $results = create_dlogs($con); + $this->assertNotEmpty($results,'create_dlogs did not return an array'); + foreach($results as $result){ + $this->assertArrayHasKey('error',$result,'Invalid result entry'); + $this->assertArrayHasKey('error_msg',$result,'Invalid result entry'); + $this->assertArrayHasKey('db',$result,'Invalid result entry'); + $this->assertArrayHasKey('struct',$result,'Invalid result entry'); + $this->assertEquals(0,$result['error'], + 'Error creating '.$result['db'].'.'.$result['struct'].': '.$result['error_msg']); + } + + $con = new SQLManager($FANNIE_SERVER,$FANNIE_SERVER_DBMS,$FANNIE_ARCHIVE_DB, + $FANNIE_SERVER_USER,$FANNIE_SERVER_PW); + $results = create_archive_dbs($con); + $this->assertNotEmpty($results,'create_archive_dbs did not return an array'); + foreach($results as $result){ + $this->assertArrayHasKey('error',$result,'Invalid result entry'); + $this->assertArrayHasKey('error_msg',$result,'Invalid result entry'); + $this->assertArrayHasKey('db',$result,'Invalid result entry'); + $this->assertArrayHasKey('struct',$result,'Invalid result entry'); + $this->assertEquals(0,$result['error'], + 'Error creating '.$result['db'].'.'.$result['struct'].': '.$result['error_msg']); + } + + $results = create_delayed_dbs(); + $this->assertNotEmpty($results,'create_delayed_dbs did not return an array'); + foreach($results as $result){ + $this->assertArrayHasKey('error',$result,'Invalid result entry'); + $this->assertArrayHasKey('error_msg',$result,'Invalid result entry'); + $this->assertArrayHasKey('db',$result,'Invalid result entry'); + $this->assertArrayHasKey('struct',$result,'Invalid result entry'); + $this->assertEquals(0,$result['error'], + 'Error creating '.$result['db'].'.'.$result['struct'].': '.$result['error_msg']); + } + } +} diff --git a/unit-tests/fannie-unit-tests/SQLManagerTest.php b/unit-tests/fannie-unit-tests/SQLManagerTest.php new file mode 100644 index 000000000..06e62881b --- /dev/null +++ b/unit-tests/fannie-unit-tests/SQLManagerTest.php @@ -0,0 +1,166 @@ +<?php +include(dirname(__FILE__).'/../../fannie/config.php'); +include(dirname(__FILE__).'/../../fannie/src/SQLManager.php'); + +/** + * @backupGlobals disabled + */ +class SQLManagerTest extends PHPUnit_Framework_TestCase +{ + public function testMethods(){ + include(dirname(__FILE__).'/../../fannie/config.php'); + $sql = new SQLManager($FANNIE_SERVER, $FANNIE_SERVER_DBMS, '', + $FANNIE_SERVER_USER, $FANNIE_SERVER_PW); + + /* test create connection */ + $this->assertInstanceOf('SQLManager',$sql); + $this->assertObjectHasAttribute('connections',$sql); + $this->assertInternalType('array',$sql->connections); + $this->assertArrayHasKey('',$sql->connections); + $this->assertInstanceOf('ADOConnection',$sql->connections['']); + + /* test query */ + $result = $sql->query("SELECT 1 as one"); + $this->assertNotEquals(False,$result); + + $escape = $sql->escape('some str'); + $this->assertInternalType('string',$escape); + + $rows = $sql->num_rows($result); + $this->assertNotEquals(False,$rows); + $this->assertEquals(1,$rows); + + $fields = $sql->num_fields($result); + $this->assertNotEquals(False,$fields); + $this->assertEquals(1,$fields); + + $type = $sql->field_type($result,0); + $this->assertEquals('int',$type); + + $name = $sql->field_name($result,0); + $this->assertEquals('one',$name); + + $aff = $sql->affected_rows(); + $this->assertNotEquals(False,$aff); + $this->assertEquals(1,$aff); + + /* test various fetch methods */ + $array = $sql->fetch_array($result); + $this->assertNotEquals(False,$array); + $this->assertArrayHasKey(0,$array); + $this->assertArrayHasKey('one',$array); + $this->assertEquals(1,$array[0]); + $this->assertEquals(1,$array['one']); + + $seek = $sql->data_seek($result,0); + $this->assertNotEquals(False,$seek); + + $array = $sql->fetch_row($result); + $this->assertNotEquals(False,$array); + $this->assertArrayHasKey(0,$array); + $this->assertArrayHasKey('one',$array); + $this->assertEquals(1,$array[0]); + $this->assertEquals(1,$array['one']); + + $seek = $sql->data_seek($result,0); + $this->assertNotEquals(False,$seek); + + $obj = $sql->fetch_object($result); + $this->assertNotEquals(False,$obj); + $this->assertInstanceof('ADOFetchObj',$obj); + $this->assertObjectHasAttribute('one',$obj); + $this->assertEquals(1,$obj->one); + + $seek = $sql->data_seek($result,0); + $this->assertNotEquals(False,$seek); + + $field = $sql->fetch_field($result,0); + $this->assertNotEquals(False,$field); + $this->assertInstanceOf('stdClass',$field); + $this->assertObjectHasAttribute('numeric',$field); + $this->assertEquals(1,$field->numeric); + + $now = $sql->now(); + $this->assertInternalType('string',$now); + $this->assertNotEquals('',$now); + + $datediff = $sql->datediff('d1','d2'); + $this->assertInternalType('string',$datediff); + $this->assertNotEquals('',$datediff); + + $dateeq = $sql->date_equals('d1',date('Y-m-d')); + $this->assertInternalType('string',$dateeq); + $this->assertNotEquals('',$dateeq); + + $monthdiff = $sql->monthdiff('d1','d2'); + $this->assertInternalType('string',$monthdiff); + $this->assertNotEquals('',$monthdiff); + + $seconddiff = $sql->seconddiff('d1','d2'); + $this->assertInternalType('string',$seconddiff); + $this->assertNotEquals('',$seconddiff); + + $weekdiff = $sql->weekdiff('d1','d2'); + $this->assertInternalType('string',$weekdiff); + $this->assertNotEquals('',$weekdiff); + + $dow = $sql->dayofweek('col1'); + $this->assertInternalType('string',$dow); + $this->assertNotEquals(False,$dow); + + $ymd = $sql->dateymd('d1'); + $this->assertInternalType('string',$ymd); + $this->assertNotEquals('',$ymd); + + $hour = $sql->hour('d1'); + $this->assertInternalType('string',$hour); + $this->assertNotEquals('',$hour); + + $convert = $sql->convert("'1'",'INT'); + $this->assertInternalType('string',$convert); + $this->assertNotEquals('',$convert); + + $locate = $sql->locate("'1'",'col_name'); + $this->assertInternalType('string',$locate); + $this->assertNotEquals('',$locate); + + $concat = $sql->concat('col1','col2',''); + $this->assertInternalType('string',$concat); + $this->assertNotEquals('',$concat); + + $currency = $sql->currency(); + $this->assertInternalType('string',$currency); + $this->assertNotEquals('',$currency); + + $limit = $sql->add_select_limit("SELECT 1",1); + $this->assertInternalType('string',$limit); + $this->assertNotEquals('',$limit); + + $sep = $sql->sep(); + $this->assertInternalType('string',$sep); + $this->assertNotEquals('',$sep); + + $error = $sql->error(); + $this->assertInternalType('string',$error); + $this->assertEquals('',$error); + + /* bad query on purpose */ + $fail = $sql->query("DO NOT SELECT 1"); + $this->assertEquals(False,$fail); + + $error = $sql->error(); + $this->assertInternalType('string',$error); + $this->assertNotEquals('',$error); + + /* prepared statements */ + $prep = $sql->prepare_statement("SELECT ?"); + $this->assertNotEquals(False,$prep); + $exec = $sql->exec_statement($prep,array(2)); + $this->assertNotEquals(False,$exec); + $row = $sql->fetch_row($exec); + $this->assertNotEquals(False,$row); + $this->assertInternalType('array',$row); + $this->assertArrayHasKey(0,$row); + $this->assertEquals(2,$row[0]); + } +} diff --git a/unit-tests/fannie-unit-tests/bootstrap.php b/unit-tests/fannie-unit-tests/bootstrap.php new file mode 100644 index 000000000..8330df97f --- /dev/null +++ b/unit-tests/fannie-unit-tests/bootstrap.php @@ -0,0 +1,12 @@ +<?php +$config = dirname(__FILE__).'/../../fannie/config.php'; +$tokens = token_get_all(file_get_contents($config)); +foreach($tokens as $t){ + if ($t[0] != T_VARIABLE) continue; + + $name = substr($t[1],1); + global $$name; +} +include($config); + +?> diff --git a/unit-tests/fannie-unit-tests/end-test-env.sh b/unit-tests/fannie-unit-tests/end-test-env.sh new file mode 100755 index 000000000..7b99978b8 --- /dev/null +++ b/unit-tests/fannie-unit-tests/end-test-env.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +if [ $( pwd | xargs basename ) != "fannie-unit-tests" ]; then + echo 'Run this script from the directory "fannie-unit-tests"' + exit 1 +fi + +if [ ! -f "../../fannie/config.php.test-backup" ]; then + echo 'Error: No config backup file available' + exit 1 +fi + +echo "Restoring backup configuration" +mv ../../fannie/config.php.test-backup ../../fannie/config.php + diff --git a/unit-tests/fannie-unit-tests/init-test-env.sh b/unit-tests/fannie-unit-tests/init-test-env.sh new file mode 100755 index 000000000..eb2ce007d --- /dev/null +++ b/unit-tests/fannie-unit-tests/init-test-env.sh @@ -0,0 +1,87 @@ +#!/bin/sh + +if [ $( pwd | xargs basename ) != "fannie-unit-tests" ]; then + echo 'Run this script from the directory "fannie-unit-tests"' + exit 1 +fi + +if [ -f "../../fannie/config.php.test-backup" ]; then + echo 'Config backup (config.php.test-backup) already exists!' + echo 'Cannot proceed. The existing backup would be destroyed.' + exit 1 +fi + +if [ ! -f "../../fannie/config.php" ]; then + echo 'Warning: no config file found for fannie' + echo 'Generating blank config' + echo "<?php" > ../../fannie/config.php + echo "?>" >> ../../fannie/config.php +fi + +mv ../../fannie/config.php ../../fannie/config.php.test-backup + +echo "Creating test configuration" +echo "<?php" > ../../fannie/config.php +cd ../../fannie + +FPATH=`pwd` +echo "\$FANNIE_ROOT = '$FPATH/';" >> config.php +echo "\$FANNIE_URL = '/fannie';" >> config.php + +read -p "Test database host [127.0.0.1]:" host +if [ "$host" = "" ]; then + echo "\$FANNIE_SERVER = '127.0.0.1';" >> config.php +else + echo "\$FANNIE_SERVER = '$host';" >> config.php +fi + +while true; do + echo 'Database driver:' + echo '1. MySQL (standard)' + echo '2. MSSQL' + echo '3. MySQL (mysqli)' + echo '4. MySQL (pdo)' + read -p "Enter type [1]:" dbt + case $dbt in + "" ) echo "\$FANNIE_SERVER_DBMS = 'MYSQL';" >> config.php; break;; + "1" ) echo "\$FANNIE_SERVER_DBMS = 'MYSQL';" >> config.php; break;; + "2" ) echo "\$FANNIE_SERVER_DBMS = 'MSSQL';" >> config.php; break;; + "3" ) echo "\$FANNIE_SERVER_DBMS = 'MYSQLI';" >> config.php; break;; + "4" ) echo "\$FANNIE_SERVER_DBMS = 'PDO_MYSQL';" >> config.php; break;; + * ) echo "'$dbt' is not a valid choice" + esac +done + +read -p "Test database user [root]:" dbuser +if [ "$dbuser" = "" ]; then + echo "\$FANNIE_SERVER_USER = 'root';" >> config.php +else + echo "\$FANNIE_SERVER_USER = '$dbuser';" >> config.php +fi + +while true; do + read -p "Test database password:" dbpw + case $dbpw in + "" ) echo 'Password cannot be blank';; + * ) echo "\$FANNIE_SERVER_PW = '$dbpw';" >> config.php; break;; + esac +done + +echo "\$FANNIE_OP_DB = '_unit_test_op';" >> config.php +echo "\$FANNIE_TRANS_DB = '_unit_test_trans';" >> config.php +echo "\$FANNIE_ARCHIVE_DB = '_unit_test_archive';" >> config.php + +cd ../unit-tests/fannie-unit-tests/ +echo "?>" >> ../../fannie/config.php + +export phpunit="phpunit --bootstrap bootstrap.php" + +echo "" +echo "SUMMARY" +echo "Existing configuration saved as config.php.test-backup" +echo "New testing configuration generated" + +echo "Use bootstrap.php when running unit tests" +echo "InstallTest is a good place to start; that will create testing databases" + +echo "Run end-test-env.sh to restore original configuration" diff --git a/unit-tests/is4c-unit-tests/BaseLibsTest.php b/unit-tests/is4c-unit-tests/BaseLibsTest.php new file mode 100644 index 000000000..3ecb5b2b4 --- /dev/null +++ b/unit-tests/is4c-unit-tests/BaseLibsTest.php @@ -0,0 +1,669 @@ +<?php +/** + * @backupGlobals disabled + */ +class BaseLibsTest extends PHPUnit_Framework_TestCase +{ + + public function testMiscLib(){ + global $CORE_LOCAL; + + $here = getcwd(); + chdir(dirname(__FILE__).'/../../pos/is4c-nf/gui-modules/'); + $rel = MiscLib::base_url(); + $this->assertEquals('../',$rel); + chdir($here); + + $this->assertEquals(5, MiscLib::int(5.1)); + $this->assertEquals(10, MiscLib::int("10")); + + $this->assertEquals(1, MiscLib::nullwrap(1)); + $this->assertEquals(1.5, MiscLib::nullwrap(1.5)); + $this->assertEquals('test', MiscLib::nullwrap('test')); + $this->assertEquals(0, MiscLib::nullwrap(False)); + + $this->assertEquals(1, MiscLib::truncate2(1)); + $this->assertEquals(1.99, MiscLib::truncate2(1.99)); + $this->assertEquals(1.99, MiscLib::truncate2("1.99")); + $this->assertEquals(1.35, MiscLib::truncate2("1.345")); + + $hostCheck = MiscLib::pingport($CORE_LOCAL->get('localhost'),$CORE_LOCAL->get('DBMS')); + $this->assertInternalType('integer', $hostCheck); + + $hostCheck = MiscLib::win32(); + $this->assertInternalType('integer', $hostCheck); + + $scale = MiscLib::scaleObject(); + if ($scale !== 0){ + $this->assertInstanceOf('ScaleDriverWrapper', $scale); + } + } + + public function testDatabase(){ + global $CORE_LOCAL; + + $db = Database::tDataConnect(); + $this->assertInstanceOf('SQLManager', $db); + $this->assertEquals($CORE_LOCAL->get('tDatabase'), $db->default_db); + $db = Database::pDataConnect(); + $this->assertInstanceOf('SQLManager', $db); + $this->assertEquals($CORE_LOCAL->get('pDatabase'), $db->default_db); + + $this->assertEquals(1, Database::gettransno(-1)); // not a real emp_no + + $db = Database::tDataConnect(); + $matches = Database::localMatchingColumns($db, 'localtrans', 'localtemptrans'); + $this->assertInternalType('string', $matches); + $this->assertRegExp('/(.+)/',$matches); + + $globals = array( + 'CashierNo' => 9999, + 'cashier' => 'TRAINING', + 'LoggedIn' => 0, + 'TransNo' => 1, + 'TTLFlag' => 0, + 'FntlFlag' => 0, + 'TaxExempt' => 0 + ); + Database::setglobalvalues($globals); + $this->assertEquals(9999, $CORE_LOCAL->get('CashierNo')); + $this->assertEquals('TRAINING', $CORE_LOCAL->get('cashier')); + $this->assertEquals(0, $CORE_LOCAL->get('LoggedIn')); + $this->assertEquals(1, $CORE_LOCAL->get('transno')); + $this->assertEquals(0, $CORE_LOCAL->get('ttlflag')); + $this->assertEquals(0, $CORE_LOCAL->get('fntlflag')); + $this->assertEquals(0, $CORE_LOCAL->get('TaxExempt')); + Database::loadglobalvalues(); // reload session from db. shouldn't change. + $this->assertEquals(9999, $CORE_LOCAL->get('CashierNo')); + $this->assertEquals('TRAINING', $CORE_LOCAL->get('cashier')); + $this->assertEquals(0, $CORE_LOCAL->get('LoggedIn')); + $this->assertEquals(1, $CORE_LOCAL->get('transno')); + $this->assertEquals(0, $CORE_LOCAL->get('ttlflag')); + $this->assertEquals(0, $CORE_LOCAL->get('fntlflag')); + $this->assertEquals(0, $CORE_LOCAL->get('TaxExempt')); + Database::setglobalvalue('TTLFlag',1); + Database::loadglobalvalues(); + $this->assertEquals(1, $CORE_LOCAL->get('ttlflag')); + Database::setglobalflags(0); + Database::loadglobalvalues(); + $this->assertEquals(0, $CORE_LOCAL->get('ttlflag')); + $this->assertEquals(0, $CORE_LOCAL->get('fntlflag')); + } + + public function testAuthenticate(){ + global $CORE_LOCAL; + $CORE_LOCAL->set('scaleDriver',''); // don't interact w/ scale + + Database::setglobalvalue('LoggedIn',1); + Database::setglobalvalue('CashierNo',1); + $fail = Authenticate::check_password('9999'); + $this->assertEquals(False, $fail); + + Database::setglobalvalue('CashierNo',9999); + $pass = Authenticate::check_password('9999'); + $this->assertEquals(True, $pass); + + Database::setglobalvalue('LoggedIn',0); + Database::setglobalvalue('CashierNo',1); + $pass = Authenticate::check_password('9999'); + $this->assertEquals(True, $pass); + } + + public function testAutoLoader(){ + global $CORE_LOCAL; + + AutoLoader::LoadMap(); + $class_map = $CORE_LOCAL->get('ClassLookup'); + $this->assertInternalType('array', $class_map); + $this->assertNotEmpty($class_map); + + /** + Verify base classes and required libraries + were properly discovered + */ + $required_classes = array( + 'AutoLoader', + 'Authenticate', + 'PreParser', + 'Parser', + 'SQLManager', + 'BasicPage', + 'TenderModule', + 'DisplayLib', + 'ReceiptLib', + 'Database', + 'Kicker', + 'SpecialUPC', + 'SpecialDept', + 'DiscountType', + 'PriceMethod', + 'LocalStorage', + 'FooterBox', + 'Plugin', + 'PrintHandler' + ); + + foreach($required_classes as $class){ + $this->assertArrayHasKey($class, $class_map); + $this->assertFileExists($class_map[$class]); + } + + $mods = AutoLoader::ListModules('Parser'); + $this->assertInternalType('array',$mods); + $this->assertNotEmpty($mods); + foreach($mods as $m){ + $obj = new $m(); + $this->assertInstanceOf('Parser',$obj); + } + } + + public function testBitmap(){ + global $CORE_LOCAL; + + /** + Using PrintHandler::RenderBitmapFromFile + will call all the methods of the Bitmap class + that actually get used + */ + + $ph = new PrintHandler(); + $file = dirname(__FILE__).'/../../pos/is4c-nf/graphics/WFC_Logo.bmp'; + + $this->assertFileExists($file); + $bitmap = $ph->RenderBitmapFromFile($file); + $this->assertInternalType('string',$bitmap); + $this->assertNotEmpty($bitmap); + } + + public function testCoreState(){ + global $CORE_LOCAL; + + // normal session init attempts to recover state + // transaction info - e.g., after a browser crash + // or reboot. Clear the table so that doesn't + // happen + $db = Database::tDataConnect(); + $db->query('TRUNCATE TABLE localtemptrans'); + + /** + This will trigger any syntax or run-time errors + Testing all the invidual values of CORE_LOCAL + might be worthwhile is anyone wants to write + all those tests out. They're mostly static values + so the test would only catch changes to the + defaults. + */ + CoreState::initiate_session(); + + $str = CoreState::getCustomerPref('asdf'); + $this->assertInternalType('string',$str); + $this->assertEquals('',$str); + } + + public function testDisplayLib(){ + global $CORE_LOCAL; + + $footer = DisplayLib::printfooter(); + $this->assertInternalType('string',$footer); + $this->assertNotEmpty($footer); + + $pmsg = DisplayLib::plainmsg('test message'); + $this->assertInternalType('string',$pmsg); + $this->assertNotEmpty($pmsg); + $this->assertContains('test message',$pmsg); + + $mbox = DisplayLib::msgbox('test msgbox','',True); + $this->assertInternalType('string',$mbox); + $this->assertNotEmpty($mbox); + $this->assertContains('test msgbox',$mbox); + + $xbox = DisplayLib::xboxMsg('test xboxMsg'); + $this->assertInternalType('string',$xbox); + $this->assertNotEmpty($xbox); + $this->assertContains('test xboxMsg',$xbox); + + $bmsg = DisplayLib::boxMsg('test boxMsg','',True); + $this->assertInternalType('string',$bmsg); + $this->assertNotEmpty($bmsg); + $this->assertContains('test boxMsg',$bmsg); + + $unk = DisplayLib::inputUnknown(); + $this->assertInternalType('string',$unk); + $this->assertNotEmpty($unk); + + $headerb = DisplayLib::printheaderb(); + $this->assertInternalType('string',$headerb); + $this->assertNotEmpty($headerb); + + $item = DisplayLib::printitem('name','weight','1.99','T',1); + $this->assertInternalType('string',$item); + $this->assertNotEmpty($item); + + $itemC = DisplayLib::printitem('name','weight','1.99','T',2); + $this->assertInternalType('string',$itemC); + $this->assertNotEmpty($itemC); + + $itemH = DisplayLib::printitemcolorhilite('004080','name','weight','1.99','T'); + $this->assertInternalType('string',$itemH); + $this->assertNotEmpty($itemH); + + $CORE_LOCAL->set('weight',0); + $CORE_LOCAL->set('scale',0); + $CORE_LOCAL->set('SNR',0); + + $basic = DisplayLib::scaledisplaymsg(); + $this->assertInternalType('string',$basic); + $this->assertEquals('0.00 lb',$basic); + + $scale_in_out = array( + 'S11000' => '0.00 lb', + 'S11001' => '0.01 lb', + 'S11' => '_ _ _ _', + 'S141' => '_ _ _ _', + 'S143' => '0.00 lb', + 'S145' => 'err -0', + 'S142' => 'error', + 'ASDF' => '? ? ? ?', + 'S144000' => '0.00 lb', + 'S144002' => '0.02 lb' + ); + + foreach($scale_in_out as $input => $output){ + $test = DisplayLib::scaledisplaymsg($input); + $this->assertInternalType('array',$test); + $this->assertArrayHasKey('display',$test); + $this->assertEquals($output, $test['display']); + } + + $this->assertEquals(1, $CORE_LOCAL->get('scale')); + $this->assertEquals(0.02, $CORE_LOCAL->get('weight')); + + $CORE_LOCAL->set('SNR','4011'); + $both = DisplayLib::scaledisplaymsg('S11050'); + $this->assertInternalType('array',$both); + $this->assertArrayHasKey('display',$both); + $this->assertArrayHasKey('upc',$both); + $this->assertEquals('0.50 lb',$both['display']); + $this->assertEquals('4011',$both['upc']); + + $term = DisplayLib::termdisplaymsg(); + $this->assertInternalType('string',$term); + + $list = DisplayLib::listitems(0,0); + $this->assertInternalType('string',$list); + + $rf = DisplayLib::printReceiptFooter(); + $this->assertInternalType('string',$rf); + + $draw = DisplayLib::drawitems(0,11,0); + $this->assertInternalType('string',$draw); + + $lp = DisplayLib::lastpage(); + $this->assertInternalType('string',$lp); + + $this->assertEquals($lp,$list); + } + + public function testJsonLib(){ + global $CORE_LOCAL; + + $test = array( + 0 => array(1, 2, 3), + 1 => 'test string', + 2 => 5, + 3 => '0006', + 4 => 9.7, + 5 => True, + 6 => "bad\\char\tacters" + ); + + $json = JsonLib::array_to_json($test); + $good = "[[1,2,3],\"test string\",5,6,9.7,true,\"bad\\\\char\\tacters\"]"; + $this->assertInternalType('string',$json); + $this->assertEquals($good,$json); + } + + public function testUdpComm(){ + global $CORE_LOCAL; + UdpComm::udpSend('most likely no one is listening...'); + } + + public function testTransRecord(){ + global $CORE_LOCAL; + + if (!class_exists('lttLib')) include ('lttLib.php'); + lttLib::clear(); + + $CORE_LOCAL->set('infoRecordQueue',array()); + TransRecord::addQueued('1234567890123','UNIT TEST',1,'UT',1.99); + $queue = $CORE_LOCAL->get('infoRecordQueue'); + $this->assertInternalType('array',$queue); + $this->assertEquals(1,count($queue)); + $this->assertArrayHasKey(0,$queue); + $this->assertInternalType('array',$queue[0]); + $this->assertArrayHasKey('upc',$queue[0]); + $this->assertEquals('1234567890123',$queue[0]['upc']); + $this->assertArrayHasKey('description',$queue[0]); + $this->assertEquals('UNIT TEST',$queue[0]['description']); + $this->assertArrayHasKey('numflag',$queue[0]); + $this->assertEquals(1,$queue[0]['numflag']); + $this->assertArrayHasKey('charflag',$queue[0]); + $this->assertEquals('UT',$queue[0]['charflag']); + $this->assertArrayHasKey('regPrice',$queue[0]); + $this->assertEquals(1.99,$queue[0]['regPrice']); + + TransRecord::emptyQueue(); + $queue = $CORE_LOCAL->get('infoRecordQueue'); + $this->assertInternalType('array',$queue); + $this->assertEquals(0,count($queue)); + $record = lttLib::genericRecord(); + $record['upc'] = '1234567890123'; + $record['description'] = 'UNIT TEST'; + $record['numflag'] = 1; + $record['charflag'] = 'UT'; + $record['regPrice'] = 1.99; + $record['trans_type'] = 'C'; + $record['trans_status'] = 'D'; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + $CORE_LOCAL->set('taxTotal',1.23); + TransRecord::addtax(); + $record = lttLib::genericRecord(); + $record['upc'] = 'TAX'; + $record['description'] = 'Tax'; + $record['trans_type'] = 'A'; + $record['total'] = 1.23; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addtender('UT TENDER','UT',2.34); + $record = lttLib::genericRecord(); + $record['description'] = 'UT TENDER'; + $record['trans_type'] = 'T'; + $record['trans_subtype'] = 'UT'; + $record['total'] = 2.34; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addcomment('UNIT TEST COMMENT'); + $record = lttLib::genericRecord(); + $record['description'] = 'UNIT TEST COMMENT'; + $record['trans_type'] = 'C'; + $record['trans_subtype'] = 'CM'; + $record['trans_status'] = 'D'; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addchange(3.14,'UT'); + $record = lttLib::genericRecord(); + $record['description'] = 'Change'; + $record['trans_type'] = 'T'; + $record['trans_subtype'] = 'UT'; + $record['total'] = 3.14; + $record['voided'] = 8; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addfsones(3); + $record = lttLib::genericRecord(); + $record['description'] = 'FS Change'; + $record['trans_type'] = 'T'; + $record['trans_subtype'] = 'FS'; + $record['total'] = 3; + $record['voided'] = 8; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addEndofShift(3); + $record = lttLib::genericRecord(); + $record['upc'] = 'ENDOFSHIFT'; + $record['description'] = 'End of Shift'; + $record['trans_type'] = 'S'; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::adddiscount(5.45,25); + $record = lttLib::genericRecord(); + $record['description'] = '** YOU SAVED $5.45 **'; + $record['trans_type'] = 'I'; + $record['trans_status'] = 'D'; + $record['department'] = 25; + $record['voided'] = 2; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addfsTaxExempt(); + $record = lttLib::genericRecord(); + $record['upc'] = 'FS Tax Exempt'; + $record['description'] = ' Fs Tax Exempt '; + $record['trans_type'] = 'C'; + $record['trans_status'] = 'D'; + $record['voided'] = 17; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::discountnotify(5); + $record = lttLib::genericRecord(); + $record['description'] = '** 5% Discount Applied **'; + $record['trans_status'] = 'D'; + $record['voided'] = 4; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addTaxExempt(); + $record = lttLib::genericRecord(); + $record['description'] = '** Order is Tax Exempt **'; + $record['trans_status'] = 'D'; + $record['voided'] = 10; + $record['tax'] = 9; + lttLib::verifyRecord(1, $record, $this); + $this->assertEquals(1, $CORE_LOCAL->get('TaxExempt')); + + lttLib::clear(); + + TransRecord::reverseTaxExempt(); + $record = lttLib::genericRecord(); + $record['description'] = '** Tax Exemption Reversed **'; + $record['trans_status'] = 'D'; + $record['voided'] = 10; + $record['tax'] = 9; + lttLib::verifyRecord(1, $record, $this); + $this->assertEquals(0, $CORE_LOCAL->get('TaxExempt')); + + lttLib::clear(); + + $CORE_LOCAL->set('casediscount',7); + TransRecord::addcdnotify(); + $record = lttLib::genericRecord(); + $record['description'] = '** 7% Case Discount Applied'; + $record['trans_status'] = 'D'; + $record['voided'] = 6; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addCoupon('0051234512345',123,-1.23,1); + $record = lttLib::genericRecord(); + $record['upc'] = '0051234512345'; + $record['description'] = ' * Manufacturers Coupon'; + $record['trans_type'] = 'I'; + $record['trans_subtype'] = 'CP'; + $record['trans_status'] = 'C'; + $record['department'] = 123; + $record['unitPrice'] = -1.23; + $record['total'] = -1.23; + $record['regPrice'] = -1.23; + $record['foodstamp'] = 1; + $record['quantity'] = 1; + $record['ItemQtty'] = 1; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addhousecoupon('0049999912345',122,-1.22); + $record = lttLib::genericRecord(); + $record['upc'] = '0049999912345'; + $record['description'] = ' * Store Coupon'; + $record['trans_type'] = 'I'; + $record['trans_subtype'] = 'IC'; + $record['trans_status'] = 'C'; + $record['department'] = 122; + $record['unitPrice'] = -1.22; + $record['total'] = -1.22; + $record['regPrice'] = -1.22; + $record['quantity'] = 1; + $record['ItemQtty'] = 1; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::additemdiscount(345,3.45); + $record = lttLib::genericRecord(); + $record['upc'] = 'ITEMDISCOUNT'; + $record['description'] = ' * Item Discount'; + $record['trans_type'] = 'I'; + $record['department'] = 345; + $record['unitPrice'] = -3.45; + $record['total'] = -3.45; + $record['regPrice'] = -3.45; + $record['quantity'] = 1; + $record['ItemQtty'] = 1; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addtare(5); + $record = lttLib::genericRecord(); + $record['description'] = '** Tare Weight 0.05 **'; + $record['trans_status'] = 'D'; + $record['voided'] = 6; + lttLib::verifyRecord(1, $record, $this); + $this->assertEquals(0.05, $CORE_LOCAL->get('tare')); + + lttLib::clear(); + + $CORE_LOCAL->set('transDiscount',3.24); + TransRecord::addTransDiscount(); + $record = lttLib::genericRecord(); + $record['upc'] = 'DISCOUNT'; + $record['description'] = 'Discount'; + $record['trans_type'] = 'I'; + $record['quantity'] = 1; + $record['ItemQtty'] = 1; + $record['unitPrice'] = -3.24; + $record['total'] = -3.24; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + TransRecord::addCashDrop('90.78'); + $record = lttLib::genericRecord(); + $record['upc'] = 'DROP'; + $record['description'] = 'Cash Drop'; + $record['trans_type'] = 'I'; + $record['trans_status'] = 'X'; + $record['quantity'] = 1; + $record['ItemQtty'] = 1; + $record['unitPrice'] = -90.78; + $record['total'] = -90.78; + $record['charflag'] = 'CD'; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + + $record = lttLib::genericRecord(); + $record['upc'] = 'UNITTEST'; + $record['description'] = 'Unit Test'; + $record['department'] = 5; + $record['numflag'] = 4; + $record['charflag'] = 'UT'; + $record['amount1'] = 1.23; + $record['total'] = 1.23; + $record['amount2'] = 1.24; + $record['regPrice'] = 1.24; + TransRecord::add_log_record($record); + unset($record['amount1']); // not real column + unset($record['amount2']); // not real column + $record['trans_type'] = 'L'; + $record['trans_subtype'] = 'OG'; + $record['trans_status'] = 'D'; + lttLib::verifyRecord(1, $record, $this); + + lttLib::clear(); + } + + public function testPrehLib(){ + global $CORE_LOCAL; + + if (!class_exists('lttLib')) include ('lttLib.php'); + lttLib::clear(); + + TransRecord::addcomment('peek'); + $peek = PrehLib::peekItem(); + $this->assertEquals('peek',$peek); + + lttLib::clear(); + + $CORE_LOCAL->set('percentDiscount',5); + $CORE_LOCAL->set('transDiscount',0.51); + $CORE_LOCAL->set('taxTotal',1.45); + $CORE_LOCAL->set('fsTaxExempt',1.11); + $CORE_LOCAL->set('amtdue',9.55); + // should add four records + PrehLib::finalttl(); + + // verify discount record + $record = lttLib::genericRecord(); + $record['description'] = 'Discount'; + $record['trans_type'] = 'C'; + $record['trans_status'] = 'D'; + $record['unitPrice'] = -0.51; + $record['voided'] = 5; + lttLib::verifyRecord(1, $record, $this); + + // verify subtotal record + $record = lttLib::genericRecord(); + $record['upc'] = 'Subtotal'; + $record['description'] = 'Subtotal'; + $record['trans_type'] = 'C'; + $record['trans_status'] = 'D'; + $record['unitPrice'] = 0.34; + $record['voided'] = 11; + lttLib::verifyRecord(2, $record, $this); + + // verify fs tax exempt record + $record = lttLib::genericRecord(); + $record['upc'] = 'Tax'; + $record['description'] = 'FS Taxable'; + $record['trans_type'] = 'C'; + $record['trans_status'] = 'D'; + $record['unitPrice'] = 1.11; + $record['voided'] = 7; + lttLib::verifyRecord(3, $record, $this); + + // verify total record + $record = lttLib::genericRecord(); + $record['upc'] = 'Total'; + $record['description'] = 'Total'; + $record['trans_type'] = 'C'; + $record['trans_status'] = 'D'; + $record['unitPrice'] = 9.55; + $record['voided'] = 11; + lttLib::verifyRecord(4, $record, $this); + + lttLib::clear(); + } + +} +?> diff --git a/unit-tests/is4c-unit-tests/FooterBoxesTest.php b/unit-tests/is4c-unit-tests/FooterBoxesTest.php new file mode 100644 index 000000000..4c2883ada --- /dev/null +++ b/unit-tests/is4c-unit-tests/FooterBoxesTest.php @@ -0,0 +1,39 @@ +<?php + +/** + * @backupGlobals disabled + */ +class FooterBoxesTest extends PHPUnit_Framework_TestCase +{ + public function testAll(){ + global $CORE_LOCAL; + + $defaults = array( + 'FooterBox', + 'EveryoneSales', + 'MemSales', + 'MultiTotal', + 'SavedOrCouldHave', + 'TransPercentDiscount' + ); + + $all = AutoLoader::ListModules('FooterBox',True); + foreach($defaults as $d){ + $this->assertContains($d, $all); + } + + foreach($all as $class){ + $obj = new $class(); + $this->assertInstanceOf('FooterBox',$obj); + + $this->assertObjectHasAttribute('header_css',$obj); + $this->assertObjectHasAttribute('display_css',$obj); + + $header = $obj->header_content(); + $this->assertInternalType('string',$header); + $display = $obj->display_content(); + $this->assertInternalType('string',$display); + } + + } +} diff --git a/unit-tests/is4c-unit-tests/KickersTest.php b/unit-tests/is4c-unit-tests/KickersTest.php new file mode 100644 index 000000000..f31dd80db --- /dev/null +++ b/unit-tests/is4c-unit-tests/KickersTest.php @@ -0,0 +1,33 @@ +<?php + +/** + * @backupGlobals disabled + */ +class KickersTest extends PHPUnit_Framework_TestCase +{ + public function testAll(){ + global $CORE_LOCAL; + + $defaults = array( + 'Kicker' + ); + + $all = AutoLoader::ListModules('Kicker',True); + foreach($defaults as $d){ + $this->assertContains($d, $all); + } + + foreach($all as $class){ + $obj = new $class(); + $this->assertInstanceOf('Kicker',$obj); + + $test1 = $obj->kickOnSignIn(); + $test2 = $obj->kickOnSignOut(); + $test3 = $obj->doKick(); + $this->assertInternalType('boolean',$test1); + $this->assertInternalType('boolean',$test2); + $this->assertInternalType('boolean',$test3); + } + + } +} diff --git a/unit-tests/is4c-unit-tests/LocalStorageTest.php b/unit-tests/is4c-unit-tests/LocalStorageTest.php new file mode 100644 index 000000000..33d8302f7 --- /dev/null +++ b/unit-tests/is4c-unit-tests/LocalStorageTest.php @@ -0,0 +1,61 @@ +<?php + +/** + * @backupGlobals disabled + */ +class LocalStorageTest extends PHPUnit_Framework_TestCase +{ + public function testAll(){ + global $CORE_LOCAL; + + $defaults = array( + 'SessionStorage', + 'UnitTestStorage' + ); + + if (function_exists('sqlite_open')) + $defaults[] = 'SQLiteStorage'; + + foreach($defaults as $class){ + $obj = new $class(); + $this->assertInstanceOf('LocalStorage',$obj); + + $unk = $obj->get('unknownKey'); + $this->assertInternalType('string',$unk); + $this->assertEquals('',$unk); + + $obj->set('testKey','testVal'); + $get = $obj->get('testKey'); + $this->assertInternalType('string',$get); + $this->assertEquals('testVal',$get); + + $obj->set('testInt',1); + $get = $obj->get('testInt'); + $this->assertInternalType('integer',$get); + $this->assertEquals(1,$get); + + $obj->set('testBool',False); + $get = $obj->get('testBool'); + $this->assertInternalType('boolean',$get); + $this->assertEquals(False,$get); + + $obj->set('testArray',array(1,2)); + $get = $obj->get('testArray'); + $this->assertInternalType('array',$get); + $this->assertEquals(array(1,2),$get); + + $obj->set('imm','imm',True); + $get = $obj->get('imm'); + $this->assertInternalType('string',$get); + $this->assertEquals('imm',$get); + + $is = $obj->is_immutable('imm'); + $isNot = $obj->is_immutable('testArray'); + $this->assertInternalType('boolean',$is); + $this->assertInternalType('boolean',$isNot); + $this->assertEquals(True,$is); + $this->assertEquals(False,$isNot); + } + + } +} diff --git a/unit-tests/is4c-unit-tests/ParsersTest.php b/unit-tests/is4c-unit-tests/ParsersTest.php new file mode 100644 index 000000000..18784576c --- /dev/null +++ b/unit-tests/is4c-unit-tests/ParsersTest.php @@ -0,0 +1,107 @@ +<?php +include(dirname(__FILE__).'/../../pos/is4c-nf/parser-class-lib/PreParser.php'); +include(dirname(__FILE__).'/../../pos/is4c-nf/parser-class-lib/Parser.php'); + +/** + * @backupGlobals disabled + */ +class ParsersTest extends PHPUnit_Framework_TestCase +{ + /** + Check methods for getting available PreParser and Parser modules + */ + public function testStatics(){ + $chain = PreParser::get_preparse_chain(); + $this->assertInternalType('array',$chain); + $this->assertNotEmpty($chain); + foreach($chain as $class){ + $instance = new $class(); + $this->assertInstanceOf('PreParser',$instance); + } + + $chain = Parser::get_parse_chain(); + $this->assertInternalType('array',$chain); + $this->assertNotEmpty($chain); + foreach($chain as $class){ + $instance = new $class(); + $this->assertInstanceOf('Parser',$instance); + } + } + + public function testPreParsers(){ + global $CORE_LOCAL; + + /* set any needed session variables */ + $CORE_LOCAL->set('runningTotal',1.99); + $CORE_LOCAL->set('mfcoupon',0); + $CORE_LOCAL->set('itemPD',0); + $CORE_LOCAL->set('multiple',0); + $CORE_LOCAL->set('quantity',0); + $CORE_LOCAL->set('refund',0); + $CORE_LOCAL->set('toggletax',0); + $CORE_LOCAL->set('togglefoodstamp',0); + $CORE_LOCAL->set('toggleDiscountable',0); + $CORE_LOCAL->set('nd',0); + + /* inputs and expected outputs */ + $input_output = array( + 'CC' => 'QM1', + 'MANUALCC' => '199CC', + '5DI123' => '123', + '7PD123' => '123', + '2*4011' => '4011', + '3*100DP10' => '100DP10', + 'text*blah' => 'text*blah', + 'RF123' => '123', + '123RF' => '123', + 'RF3*100DP10' => '100DP10', + 'FN123' => '123', + 'DN123' => '123', + '1TN123' => '123', + 'invalid' => 'invalid' + ); + + $chain = PreParser::get_preparse_chain(); + foreach($input_output as $input => $output){ + foreach($chain as $class){ + $obj = new $class(); + $chk = $obj->check($input); + $this->assertInternalType('boolean',$chk); + if ($chk){ + $input = $obj->parse($input); + } + } + $this->assertEquals($output, $input); + } + + /* verify correct session values */ + $this->assertEquals(7, $CORE_LOCAL->get('itemPD')); + $this->assertEquals(1, $CORE_LOCAL->get('multiple')); + $this->assertEquals(3, $CORE_LOCAL->get('quantity')); + $this->assertEquals(1, $CORE_LOCAL->get('refund')); + $this->assertEquals(1, $CORE_LOCAL->get('toggletax')); + $this->assertEquals(1, $CORE_LOCAL->get('togglefoodstamp')); + $this->assertEquals(1, $CORE_LOCAL->get('toggleDiscountable')); + } + + function testParsers(){ + global $CORE_LOCAL; + + /* inputs and expected outputs */ + $input_output = array( + ); + + $chain = Parser::get_parse_chain(); + foreach($input_output as $input => $output){ + foreach($chain as $class){ + $obj = new $class(); + $chk = $obj->check($input); + $this->assertInternalType('boolean',$chk); + if ($chk){ + $input = $obj->parse($input); + } + } + $this->assertEquals($output, $input); + } + } +} diff --git a/unit-tests/is4c-unit-tests/README.unit-testing b/unit-tests/is4c-unit-tests/README.unit-testing new file mode 100644 index 000000000..3fb650031 --- /dev/null +++ b/unit-tests/is4c-unit-tests/README.unit-testing @@ -0,0 +1,11 @@ +Unit tests are built using PHPUnit. Use bootstrap.php with +PHPUnit's --bootstrap option. This file sets up $CORE_LOCAL, +loads the configuration from ini.php, and sets up class +autoloading. + +A functional database (and correct configuration in ini.php) +is required. The unit tests can be run in any order. Adding +more scripted testing that runs the install to create+initialize +databases and then runs all the tests would be a good next step. + +Last updated: 2013-05-30 diff --git a/unit-tests/is4c-unit-tests/SQLManagerTest.php b/unit-tests/is4c-unit-tests/SQLManagerTest.php new file mode 100644 index 000000000..54099655b --- /dev/null +++ b/unit-tests/is4c-unit-tests/SQLManagerTest.php @@ -0,0 +1,114 @@ +<?php +/** + * @backupGlobals disabled + */ +class SQLManagerTest extends PHPUnit_Framework_TestCase +{ + public function testMethods(){ + global $CORE_LOCAL; + + $sql = Database::pDataConnect(); + + /* test create connection */ + $this->assertInstanceOf('SQLManager',$sql); + $this->assertObjectHasAttribute('connections',$sql); + $this->assertInternalType('array',$sql->connections); + $this->assertArrayHasKey($CORE_LOCAL->get('pDatabase'),$sql->connections); + $con = $sql->connections[$CORE_LOCAL->get('pDatabase')]; + // mysql gives resource; PDO gives object + $constraint = $this->logicalOr( + $this->isType('resource',$con), + $this->isType('object',$con) + ); + $this->assertThat($con, $constraint); + + /* test query */ + $result = $sql->query("SELECT 1 as one"); + $this->assertNotEquals(False,$result); + + $escape = $sql->escape('some str'); + $this->assertInternalType('string',$escape); + + $rows = $sql->num_rows($result); + $this->assertNotEquals(False,$rows); + $this->assertEquals(1,$rows); + + $fields = $sql->num_fields($result); + $this->assertNotEquals(False,$fields); + $this->assertEquals(1,$fields); + + $type = $sql->field_type($result,0); + $constraint = $this->logicalOr( + $this->equalTo('int'), + $this->equalTo('longlong') + ); + $this->assertThat($type, $constraint); + //$this->assertEquals('int',$type); + + /* test various fetch methods */ + $array = $sql->fetch_array($result); + $this->assertNotEquals(False,$array); + $this->assertArrayHasKey(0,$array); + $this->assertArrayHasKey('one',$array); + $this->assertEquals(1,$array[0]); + $this->assertEquals(1,$array['one']); + + /* repeat test query for next fetch */ + $result = $sql->query("SELECT 1 as one"); + $this->assertNotEquals(False,$result); + + $array = $sql->fetch_row($result); + $this->assertNotEquals(False,$array); + $this->assertArrayHasKey(0,$array); + $this->assertArrayHasKey('one',$array); + $this->assertEquals(1,$array[0]); + $this->assertEquals(1,$array['one']); + + $now = $sql->now(); + $this->assertInternalType('string',$now); + $this->assertNotEquals('',$now); + + $datediff = $sql->datediff('d1','d2'); + $this->assertInternalType('string',$datediff); + $this->assertNotEquals('',$datediff); + + $dow = $sql->dayofweek('col1'); + $this->assertInternalType('string',$dow); + $this->assertNotEquals(False,$dow); + + $convert = $sql->convert("'1'",'INT'); + $this->assertInternalType('string',$convert); + $this->assertNotEquals('',$convert); + + $concat = $sql->concat('col1','col2',''); + $this->assertInternalType('string',$concat); + $this->assertNotEquals('',$concat); + + $sep = $sql->sep(); + $this->assertInternalType('string',$sep); + $this->assertNotEquals('',$sep); + + $error = $sql->error(); + $this->assertInternalType('string',$error); + $this->assertEquals('',$error); + + /* bad query on purpose */ + $fail = $sql->query("DO NOT SELECT 1"); + $this->assertEquals(False,$fail); + + $error = $sql->error(); + $this->assertInternalType('string',$error); + $this->assertNotEquals('',$error); + + /* prepared statements */ + $prep = $sql->prepare_statement("SELECT ? as col"); + $this->assertNotEquals(False,$prep); + $exec = $sql->exec_statement($prep,array(2)); + $this->assertNotEquals(False,$exec); + $row = $sql->fetch_row($exec); + $this->assertNotEquals(False,$row); + $this->assertInternalType('array',$row); + $this->assertArrayHasKey(0,$row); + $this->assertEquals(2,$row[0]); + } +} diff --git a/unit-tests/is4c-unit-tests/ScanningTest.php b/unit-tests/is4c-unit-tests/ScanningTest.php new file mode 100644 index 000000000..04e67d56f --- /dev/null +++ b/unit-tests/is4c-unit-tests/ScanningTest.php @@ -0,0 +1,352 @@ +<?php + +/** + * @backupGlobals disabled + */ +class ScanningTest extends PHPUnit_Framework_TestCase +{ + public function testDiscountType(){ + global $CORE_LOCAL; + + $defaults = array( + 'NormalPricing', + 'EveryoneSale', + 'MemberSale', + 'StaffSale', + 'SlidingMemSale', + 'PercentMemSale', + 'CasePriceDiscount' + ); + + $all = AutoLoader::ListModules('DiscountType',False); + foreach($defaults as $d){ + $this->assertContains($d, $all); + } + + foreach($all as $class){ + $obj = new $class(); + $this->assertInstanceOf('DiscountType',$obj); + + $this->assertInternalType('boolean',$obj->isSale()); + $this->assertInternalType('boolean',$obj->isMemberOnly()); + $this->assertInternalType('boolean',$obj->isMemberSale()); + $this->assertEquals($obj->isMemberOnly(),$obj->isMemberSale()); + $this->assertInternalType('boolean',$obj->isStaffOnly()); + $this->assertInternalType('boolean',$obj->isStaffSale()); + $this->assertEquals($obj->isStaffSale(),$obj->isStaffOnly()); + } + + $CORE_LOCAL->set('itemPD',0); + $row = array('normal_price'=>1.99,'special_price'=>'1.49', + 'specialpricemethod'=>0, + 'specialquantity'=>0); + + $norm = new NormalPricing(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.99,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0,$info['memDiscount']); + $this->assertEquals(False,$norm->isSale()); + $this->assertEquals(False,$norm->isMemberOnly()); + $this->assertEquals(False,$norm->isStaffOnly()); + + $norm = new EveryoneSale(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.49,$info['unitPrice']); + $this->assertEquals(0.50,$info['discount']); + $this->assertEquals(0,$info['memDiscount']); + $this->assertEquals(True,$norm->isSale()); + $this->assertEquals(False,$norm->isMemberOnly()); + $this->assertEquals(False,$norm->isStaffOnly()); + + $CORE_LOCAL->set('isMember',1); + $norm = new MemberSale(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.49,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0.50,$info['memDiscount']); + $this->assertEquals(True,$norm->isSale()); + $this->assertEquals(True,$norm->isMemberOnly()); + $this->assertEquals(False,$norm->isStaffOnly()); + + $CORE_LOCAL->set('isStaff',1); + $norm = new StaffSale(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.49,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0.50,$info['memDiscount']); + $this->assertEquals(True,$norm->isSale()); + $this->assertEquals(False,$norm->isMemberOnly()); + $this->assertEquals(True,$norm->isStaffOnly()); + + $row['special_price'] = 0.10; + $norm = new SlidingMemSale(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.89,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0.10,$info['memDiscount']); + $this->assertEquals(True,$norm->isSale()); + $this->assertEquals(True,$norm->isMemberOnly()); + $this->assertEquals(False,$norm->isStaffOnly()); + + $norm = new PercentMemSale(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(0.20,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(1.79,$info['memDiscount']); + $this->assertEquals(True,$norm->isSale()); + $this->assertEquals(True,$norm->isMemberOnly()); + $this->assertEquals(False,$norm->isStaffOnly()); + + $CORE_LOCAL->set('isMember',0); + $CORE_LOCAL->set('isStaff',0); + $row['special_price'] = 1.49; + + $norm = new MemberSale(); + $info = $norm->priceInfo($row, 1); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.99,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0.50,$info['memDiscount']); + + $norm = new StaffSale(); + $info = $norm->priceInfo($row, 1); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.99,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0.50,$info['memDiscount']); + + $row['special_price'] = 0.10; + $norm = new SlidingMemSale(); + $info = $norm->priceInfo($row, 1); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.99,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0.10,$info['memDiscount']); + + $norm = new PercentMemSale(); + $info = $norm->priceInfo($row, 1); + $this->assertEquals(1.99,$info['regPrice']); + $this->assertEquals(1.99,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(1.79,$info['memDiscount']); + + $CORE_LOCAL->set('casediscount',10); + $norm = new CasePriceDiscount(); + $info = $norm->priceInfo($row, 1); + $this->assertInternalType('array',$info); + $this->assertArrayHasKey('regPrice',$info); + $this->assertArrayHasKey('unitPrice',$info); + $this->assertArrayHasKey('discount',$info); + $this->assertArrayHasKey('memDiscount',$info); + $this->assertEquals(1.79,$info['regPrice']); + $this->assertEquals(1.79,$info['unitPrice']); + $this->assertEquals(0,$info['discount']); + $this->assertEquals(0,$info['memDiscount']); + $this->assertEquals(False,$norm->isSale()); + $this->assertEquals(False,$norm->isMemberOnly()); + $this->assertEquals(False,$norm->isStaffOnly()); + } + + public function testSpecialUPCs() { + global $CORE_LOCAL; + + $defaults = array( + 'CouponCode', + 'DatabarCoupon', + 'HouseCoupon', + 'MagicPLU', + 'SpecialOrder' + ); + + $all = AutoLoader::ListModules('SpecialUPC',False); + foreach($defaults as $d){ + $this->assertContains($d, $all); + } + + foreach($all as $class){ + $obj = new $class(); + $this->assertInstanceOf('SpecialUPC',$obj); + $this->assertInternalType('boolean',$obj->is_special('silly nonsense input')); + } + + $cc = new CouponCode(); + $this->assertEquals(True,$cc->is_special('0051234512345')); + $this->assertEquals(True,$cc->is_special('0991234512345')); + $this->assertEquals(False,$cc->is_special('0001234512345')); + + $dat = new DatabarCoupon(); + $this->assertEquals(True,$dat->is_special('811012345678901')); + $this->assertEquals(False,$dat->is_special('8110123456790')); + $this->assertEquals(False,$dat->is_special('0001234512345')); + + $hc = new HouseCoupon(); + $this->assertEquals(True,$hc->is_special('0049999900001')); + $this->assertEquals(False,$hc->is_special('0001234512345')); + + $mp = new MagicPLU(); + $this->assertEquals(True,$mp->is_special('0000000008005')); + $this->assertEquals(True,$mp->is_special('0000000008006')); + $this->assertEquals(False,$mp->is_special('0001234512345')); + + $so = new SpecialOrder(); + $this->assertEquals(True,$so->is_special('0045400010001')); + $this->assertEquals(False,$so->is_special('0001234512345')); + } + + public function testSpecialDepts(){ + global $CORE_LOCAL; + + $defaults = array( + 'ArWarnDept', + 'AutoReprintDept', + 'EquityEndorseDept', + 'EquityWarnDept' + ); + + $all = AutoLoader::ListModules('SpecialDept',False); + foreach($defaults as $d){ + $this->assertContains($d, $all); + } + + $map = array(); + foreach($all as $class){ + $obj = new $class(); + $this->assertInstanceOf('SpecialDept',$obj); + $map = $obj->register(1,$map); + $this->assertInternalType('array',$map); + $this->assertArrayHasKey(1,$map); + $this->assertInternalType('array',$map[1]); + $this->assertContains($class,$map[1]); + } + + $CORE_LOCAL->set('warned',0); + $CORE_LOCAL->set('warnBoxType',''); + + // first call should set warn vars + $arwarn = new ArWarnDept(); + $json = $arwarn->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertNotEmpty($json['main_frame']); + $this->assertEquals(1,$CORE_LOCAL->get('warned')); + $this->assertEquals('warnAR',$CORE_LOCAL->get('warnBoxType')); + + // second call should clear vars and proceed + $json = $arwarn->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertEmpty($json['main_frame']); + $this->assertEquals(0,$CORE_LOCAL->get('warned')); + $this->assertEquals('',$CORE_LOCAL->get('warnBoxType')); + + $CORE_LOCAL->set('autoReprint',0); + $auto = new AutoReprintDept(); + $json = $auto->handle(1,1.00,array()); + $this->assertInternalType('array',$json); + $this->assertEquals(1,$CORE_LOCAL->get('autoReprint')); + + $CORE_LOCAL->set('warned',0); + $CORE_LOCAL->set('warnBoxType',''); + $CORE_LOCAL->set('memberID',0); + + // error because member is required + $eEndorse = new EquityEndorseDept(); + $json = $eEndorse->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertNotEmpty($json['main_frame']); + + // show endorse warning screen + $CORE_LOCAL->set('memberID',123); + $json = $eEndorse->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertNotEmpty($json['main_frame']); + + // clear warning and proceed + $CORE_LOCAL->set('memberID',123); + $CORE_LOCAL->set('msgrepeat', 1); + $json = $eEndorse->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertEmpty($json['main_frame']); + + $CORE_LOCAL->set('warned',0); + $CORE_LOCAL->set('warnBoxType',''); + $CORE_LOCAL->set('memberID',0); + $CORE_LOCAL->set('msgrepeat', 0); + + // error because member is required + $eWarn = new EquityWarnDept(); + $json = $eWarn->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertNotEmpty($json['main_frame']); + $this->assertEquals(0,$CORE_LOCAL->get('warned')); + + $CORE_LOCAL->set('memberID',123); + + // show warning screen + $CORE_LOCAL->set('memberID',123); + $json = $eWarn->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertNotEmpty($json['main_frame']); + $this->assertEquals(1,$CORE_LOCAL->get('warned')); + $this->assertEquals('warnEquity',$CORE_LOCAL->get('warnBoxType')); + + // clear warning and proceed + $CORE_LOCAL->set('memberID',123); + $json = $eWarn->handle(1,1.00,array('main_frame'=>'')); + $this->assertInternalType('array',$json); + $this->assertArrayHasKey('main_frame',$json); + $this->assertInternalType('string',$json['main_frame']); + $this->assertEmpty($json['main_frame']); + $this->assertEquals(0,$CORE_LOCAL->get('warned')); + $this->assertEquals('',$CORE_LOCAL->get('warnBoxType')); + } +} diff --git a/unit-tests/is4c-unit-tests/TendersTest.php b/unit-tests/is4c-unit-tests/TendersTest.php new file mode 100644 index 000000000..4e5edf551 --- /dev/null +++ b/unit-tests/is4c-unit-tests/TendersTest.php @@ -0,0 +1,54 @@ +<?php + +/** + * @backupGlobals disabled + */ +class TendersTest extends PHPUnit_Framework_TestCase +{ + public function testAll(){ + global $CORE_LOCAL; + + $defaults = array( + 'TenderModule', + 'CheckTender', + 'CreditCardTender', + 'DisabledTender', + 'FoodstampTender', + 'GiftCardTender', + 'GiftCertificateTender', + 'RefundAndCashbackTender', + 'StoreChargeTender', + 'StoreTransferTender' + ); + + $all = AutoLoader::ListModules('TenderModule',True); + foreach($defaults as $d){ + $this->assertContains($d, $all); + } + + foreach($all as $class){ + $obj = new $class('CA',1.00); + $this->assertInstanceOf('TenderModule',$obj); + + $err = $obj->ErrorCheck(); + $this->assertThat($err, + $this->logicalOr( + $this->isType('boolean',$err), + $this->isType('string',$err) + ) + ); + + $pre = $obj->ErrorCheck(); + $this->assertThat($pre, + $this->logicalOr( + $this->isType('boolean',$pre), + $this->isType('string',$pre) + ) + ); + + $change = $obj->ChangeType(); + $this->assertInternalType('string',$change); + } + + } +} diff --git a/unit-tests/is4c-unit-tests/bootstrap.php b/unit-tests/is4c-unit-tests/bootstrap.php new file mode 100644 index 000000000..73f9e93af --- /dev/null +++ b/unit-tests/is4c-unit-tests/bootstrap.php @@ -0,0 +1,9 @@ +<?php +include(dirname(__FILE__).'/../../pos/is4c-nf/lib/LocalStorage/UnitTestStorage.php'); +$config = dirname(__FILE__).'/../../pos/is4c-nf/ini.php'; +global $CORE_LOCAL; +$CORE_LOCAL = new UnitTestStorage(); +include($config); +include(dirname(__FILE__).'/../../pos/is4c-nf/lib/AutoLoader.php'); +AutoLoader::LoadMap(); +?> diff --git a/unit-tests/is4c-unit-tests/lttLib.php b/unit-tests/is4c-unit-tests/lttLib.php new file mode 100644 index 000000000..e09dba9d8 --- /dev/null +++ b/unit-tests/is4c-unit-tests/lttLib.php @@ -0,0 +1,74 @@ +<?php + +/** + Helper functions for dealing with transactions table +*/ +class lttLib { + + /** + Clear localtemptrans + */ + public static function clear(){ + $db = Database::tDataConnect(); + $db->query('TRUNCATE TABLE localtemptrans'); + } + + /** + Check what's in localtemptrans record + @param $trans_id record's trans_id value + @param $values array of column names and + exepected values + */ + public static function verifyRecord($trans_id,$values, $testObj){ + $db = Database::tDataConnect(); + $p = $db->prepare_statement('SELECT * FROM localtemptrans WHERE trans_id=?'); + $r = $db->exec_statement($p, array($trans_id)); + $testObj->assertEquals(1,$db->num_rows($r),'Record not found'); + $w = $db->fetch_row($r); + $testObj->assertInternalType('array',$w); + foreach($values as $col => $val){ + $testObj->assertArrayHasKey($col,$w,'missing column '.$col); + $testObj->assertEquals($val,$w[$col],'wrong value '.$col); + } + } + + /** + Get array of all ltt columns with default values + */ + public static function genericRecord(){ + return array( + 'upc' => '0', + 'description' => '', + 'trans_type' => '0', + 'trans_subtype' => '0', + 'trans_status' => '0', + 'department' => 0, + 'quantity' => 0, + 'cost' => 0, + 'unitPrice' => 0, + 'total' => 0, + 'regPrice' => 0, + 'scale' => 0, + 'tax' => 0, + 'foodstamp' => 0, + 'discount' => 0, + 'memDiscount' => 0, + 'discountable' => 0, + 'discounttype' => 0, + 'ItemQtty' => 0, + 'volDiscType' => 0, + 'volume' => 0, + 'VolSpecial' => 0, + 'mixMatch' => 0, + 'matched' => 0, + 'voided' => 0, + 'memType' => 0, + 'staff' => 0, + 'numflag' => 0, + 'charflag' => '', + 'card_no' => 0 + ); + } +} + +?>